summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJinkun Jang <jinkun.jang@samsung.com>2013-03-13 01:42:35 +0900
committerJinkun Jang <jinkun.jang@samsung.com>2013-03-13 01:42:35 +0900
commit72835b3d805ac6c7cdaac7d3aff107567e938314 (patch)
tree0f2a04dc3d0672c0960a62804c6e7758673e393c
parenteb5e5ee9adb02776056d1b4494f66150a2fc45f1 (diff)
downloadhplip-72835b3d805ac6c7cdaac7d3aff107567e938314.tar.gz
hplip-72835b3d805ac6c7cdaac7d3aff107567e938314.tar.bz2
hplip-72835b3d805ac6c7cdaac7d3aff107567e938314.zip
Tizen 2.1 base
-rw-r--r--COPYING355
-rw-r--r--Makefile.am585
-rw-r--r--Makefile.in8600
-rw-r--r--__init__.py19
-rw-r--r--aclocal.m47952
-rwxr-xr-xalign.py257
-rw-r--r--base/LedmWifi.py475
-rw-r--r--base/__init__.py19
-rw-r--r--base/codes.py885
-rw-r--r--base/device.py2676
-rw-r--r--base/dime.py110
-rw-r--r--base/exif.py1078
-rw-r--r--base/g.py350
-rw-r--r--base/imagesize.py217
-rw-r--r--base/ldif.py501
-rw-r--r--base/logger.py534
-rw-r--r--base/magic.py1262
-rw-r--r--base/maint.py1721
-rw-r--r--base/mdns.py340
-rw-r--r--base/mfpdtf.py504
-rw-r--r--base/models.py577
-rw-r--r--base/module.py657
-rw-r--r--base/pexpect.py1384
-rw-r--r--base/pkit.py511
-rw-r--r--base/pml.py780
-rw-r--r--base/slp.py178
-rw-r--r--base/status.py1695
-rw-r--r--base/strings.py276
-rw-r--r--base/tui.py483
-rw-r--r--base/utils.py1871
-rw-r--r--base/vcard.py1431
-rw-r--r--base/wifi.py655
-rwxr-xr-xcheck-plugin.py306
-rwxr-xr-xcheck.py900
-rwxr-xr-xclean.py194
-rwxr-xr-xcolorcal.py255
-rwxr-xr-xconfig.guess1526
-rwxr-xr-xconfig.sub1658
-rwxr-xr-xconfig_usb_printer.py272
-rwxr-xr-xconfigure25721
-rwxr-xr-xconfigure.in620
-rw-r--r--copier/__init__.py19
-rw-r--r--copier/copier.py381
-rwxr-xr-xcopyright364
-rw-r--r--cups_drv.inc687
-rwxr-xr-xdat2drv.py926
-rw-r--r--data/images/128x128/audio.pngbin0 -> 33466 bytes
-rw-r--r--data/images/128x128/bmp.pngbin0 -> 20718 bytes
-rw-r--r--data/images/128x128/gif.pngbin0 -> 20435 bytes
-rwxr-xr-xdata/images/128x128/hp_logo.pngbin0 -> 23437 bytes
-rw-r--r--data/images/128x128/jpg.pngbin0 -> 21115 bytes
-rw-r--r--data/images/128x128/movie.pngbin0 -> 24899 bytes
-rw-r--r--data/images/128x128/mpg.pngbin0 -> 26323 bytes
-rw-r--r--data/images/128x128/png.pngbin0 -> 20714 bytes
-rw-r--r--data/images/128x128/tif.pngbin0 -> 20049 bytes
-rw-r--r--data/images/128x128/unknown.pngbin0 -> 21544 bytes
-rw-r--r--data/images/16x16/active.pngbin0 -> 531 bytes
-rw-r--r--data/images/16x16/add_user.pngbin0 -> 687 bytes
-rw-r--r--data/images/16x16/add_user_quick.pngbin0 -> 703 bytes
-rw-r--r--data/images/16x16/add_users.pngbin0 -> 825 bytes
-rw-r--r--data/images/16x16/battery.pngbin0 -> 506 bytes
-rw-r--r--data/images/16x16/busy.pngbin0 -> 315 bytes
-rw-r--r--data/images/16x16/cancel.pngbin0 -> 1457 bytes
-rw-r--r--data/images/16x16/close.pngbin0 -> 592 bytes
-rw-r--r--data/images/16x16/down.pngbin0 -> 630 bytes
-rw-r--r--data/images/16x16/down_user.pngbin0 -> 694 bytes
-rw-r--r--data/images/16x16/download.pngbin0 -> 1114 bytes
-rw-r--r--data/images/16x16/edit.pngbin0 -> 475 bytes
-rw-r--r--data/images/16x16/error.pngbin0 -> 715 bytes
-rw-r--r--data/images/16x16/fab.pngbin0 -> 911 bytes
-rw-r--r--data/images/16x16/fax.pngbin0 -> 699 bytes
-rw-r--r--data/images/16x16/folder_open.pngbin0 -> 799 bytes
-rw-r--r--data/images/16x16/folder_remove.pngbin0 -> 902 bytes
-rw-r--r--data/images/16x16/help.pngbin0 -> 932 bytes
-rwxr-xr-xdata/images/16x16/hp_logo.pngbin0 -> 994 bytes
-rw-r--r--data/images/16x16/idle.pngbin0 -> 1160 bytes
-rw-r--r--data/images/16x16/info.pngbin0 -> 872 bytes
-rw-r--r--data/images/16x16/inkdrop.pngbin0 -> 438 bytes
-rw-r--r--data/images/16x16/list_add.pngbin0 -> 733 bytes
-rw-r--r--data/images/16x16/list_remove.pngbin0 -> 715 bytes
-rw-r--r--data/images/16x16/makecopies.pngbin0 -> 574 bytes
-rw-r--r--data/images/16x16/mimetypes.pngbin0 -> 494 bytes
-rw-r--r--data/images/16x16/minus.pngbin0 -> 152 bytes
-rw-r--r--data/images/16x16/next.pngbin0 -> 693 bytes
-rw-r--r--data/images/16x16/ok.pngbin0 -> 612 bytes
-rw-r--r--data/images/16x16/paper.pngbin0 -> 567 bytes
-rw-r--r--data/images/16x16/pcard.pngbin0 -> 649 bytes
-rw-r--r--data/images/16x16/plus.pngbin0 -> 149 bytes
-rw-r--r--data/images/16x16/prev.pngbin0 -> 694 bytes
-rw-r--r--data/images/16x16/print.pngbin0 -> 731 bytes
-rw-r--r--data/images/16x16/quit.pngbin0 -> 830 bytes
-rw-r--r--data/images/16x16/refresh.pngbin0 -> 685 bytes
-rw-r--r--data/images/16x16/refresh1.pngbin0 -> 720 bytes
-rw-r--r--data/images/16x16/remove_user.pngbin0 -> 671 bytes
-rw-r--r--data/images/16x16/scan.pngbin0 -> 531 bytes
-rw-r--r--data/images/16x16/settings.pngbin0 -> 599 bytes
-rw-r--r--data/images/16x16/status_refresh.pngbin0 -> 685 bytes
-rw-r--r--data/images/16x16/thumbnail.pngbin0 -> 649 bytes
-rw-r--r--data/images/16x16/toner.pngbin0 -> 195 bytes
-rw-r--r--data/images/16x16/up.pngbin0 -> 584 bytes
-rw-r--r--data/images/16x16/up_user.pngbin0 -> 692 bytes
-rw-r--r--data/images/16x16/warning.pngbin0 -> 664 bytes
-rw-r--r--data/images/24x24/add_to_group.pngbin0 -> 1150 bytes
-rw-r--r--data/images/24x24/new_group.pngbin0 -> 990 bytes
-rw-r--r--data/images/24x24/new_group_from_selection.pngbin0 -> 1045 bytes
-rw-r--r--data/images/24x24/new_user.pngbin0 -> 802 bytes
-rw-r--r--data/images/24x24/remove_from_group.pngbin0 -> 1118 bytes
-rw-r--r--data/images/24x24/remove_group.pngbin0 -> 1093 bytes
-rw-r--r--data/images/24x24/remove_user.pngbin0 -> 929 bytes
-rw-r--r--data/images/24x24/rename_group.pngbin0 -> 895 bytes
-rwxr-xr-xdata/images/256x256/hp_logo.pngbin0 -> 67005 bytes
-rwxr-xr-xdata/images/256x256/logo.pngbin0 -> 67005 bytes
-rw-r--r--data/images/32x32/align.pngbin0 -> 723 bytes
-rw-r--r--data/images/32x32/battery.pngbin0 -> 773 bytes
-rw-r--r--data/images/32x32/busy.pngbin0 -> 382 bytes
-rw-r--r--data/images/32x32/clean.pngbin0 -> 964 bytes
-rw-r--r--data/images/32x32/colorcal.pngbin0 -> 1252 bytes
-rw-r--r--data/images/32x32/cups.pngbin0 -> 265 bytes
-rw-r--r--data/images/32x32/download.pngbin0 -> 1263 bytes
-rw-r--r--data/images/32x32/error.pngbin0 -> 1591 bytes
-rw-r--r--data/images/32x32/ews.pngbin0 -> 1565 bytes
-rw-r--r--data/images/32x32/fab.pngbin0 -> 1464 bytes
-rw-r--r--data/images/32x32/fax-disabled.pngbin0 -> 1425 bytes
-rw-r--r--data/images/32x32/fax.pngbin0 -> 1723 bytes
-rw-r--r--data/images/32x32/fax_machine.pngbin0 -> 1910 bytes
-rw-r--r--data/images/32x32/fax_setup.pngbin0 -> 1443 bytes
-rw-r--r--data/images/32x32/firmware.pngbin0 -> 256 bytes
-rw-r--r--data/images/32x32/help.pngbin0 -> 2231 bytes
-rwxr-xr-xdata/images/32x32/hp_logo.pngbin0 -> 2802 bytes
-rw-r--r--data/images/32x32/idle.pngbin0 -> 1313 bytes
-rw-r--r--data/images/32x32/info.pngbin0 -> 1433 bytes
-rw-r--r--data/images/32x32/inkdrop.pngbin0 -> 415 bytes
-rw-r--r--data/images/32x32/keys.pngbin0 -> 1905 bytes
-rw-r--r--data/images/32x32/linefeed_cal.pngbin0 -> 1211 bytes
-rw-r--r--data/images/32x32/lock.pngbin0 -> 1026 bytes
-rw-r--r--data/images/32x32/lporg.pngbin0 -> 1399 bytes
-rw-r--r--data/images/32x32/makecopies-disabled.pngbin0 -> 956 bytes
-rw-r--r--data/images/32x32/makecopies.pngbin0 -> 792 bytes
-rw-r--r--data/images/32x32/ok.pngbin0 -> 1585 bytes
-rw-r--r--data/images/32x32/paper.pngbin0 -> 1175 bytes
-rw-r--r--data/images/32x32/pcard-disabled.pngbin0 -> 1726 bytes
-rw-r--r--data/images/32x32/pcard.pngbin0 -> 1895 bytes
-rw-r--r--data/images/32x32/plugin.pngbin0 -> 1469 bytes
-rw-r--r--data/images/32x32/pq_diag.pngbin0 -> 889 bytes
-rw-r--r--data/images/32x32/print-disabled.pngbin0 -> 1208 bytes
-rw-r--r--data/images/32x32/print.pngbin0 -> 1391 bytes
-rw-r--r--data/images/32x32/scan-disabled.pngbin0 -> 1172 bytes
-rw-r--r--data/images/32x32/scan.pngbin0 -> 1102 bytes
-rw-r--r--data/images/32x32/settings.pngbin0 -> 1627 bytes
-rw-r--r--data/images/32x32/testpage.pngbin0 -> 722 bytes
-rw-r--r--data/images/32x32/toner.pngbin0 -> 505 bytes
-rw-r--r--data/images/32x32/toner_cartridge.pngbin0 -> 1220 bytes
-rw-r--r--data/images/32x32/warning.pngbin0 -> 1692 bytes
-rw-r--r--data/images/32x32/wireless.pngbin0 -> 1149 bytes
-rwxr-xr-xdata/images/64x64/hp_logo.pngbin0 -> 7900 bytes
-rw-r--r--data/images/devices/120.pngbin0 -> 3486 bytes
-rw-r--r--data/images/devices/COLOR_INKJET_PRINTER_CP1700.pngbin0 -> 3600 bytes
-rw-r--r--data/images/devices/CP_1700.pngbin0 -> 2760 bytes
-rw-r--r--data/images/devices/DESKJET_1120C.pngbin0 -> 2041 bytes
-rw-r--r--data/images/devices/DESKJET_1220C.pngbin0 -> 2804 bytes
-rw-r--r--data/images/devices/DESKJET_2500C.pngbin0 -> 2945 bytes
-rw-r--r--data/images/devices/DESKJET_3820.pngbin0 -> 3485 bytes
-rw-r--r--data/images/devices/DESKJET_5740.pngbin0 -> 2093 bytes
-rw-r--r--data/images/devices/DESKJET_610.pngbin0 -> 3294 bytes
-rw-r--r--data/images/devices/DESKJET_630C.pngbin0 -> 3095 bytes
-rw-r--r--data/images/devices/DESKJET_650C.pngbin0 -> 3516 bytes
-rw-r--r--data/images/devices/DESKJET_840C.pngbin0 -> 3076 bytes
-rw-r--r--data/images/devices/DESKJET_916C.pngbin0 -> 3932 bytes
-rw-r--r--data/images/devices/DESKJET_9600.pngbin0 -> 1723 bytes
-rw-r--r--data/images/devices/DESKJET_960C.pngbin0 -> 3928 bytes
-rw-r--r--data/images/devices/DESKJET_970C.pngbin0 -> 1821 bytes
-rw-r--r--data/images/devices/DESKJET_990C.pngbin0 -> 2698 bytes
-rw-r--r--data/images/devices/DESKJET_995C.pngbin0 -> 3481 bytes
-rw-r--r--data/images/devices/Deskjet_3740.pngbin0 -> 2456 bytes
-rw-r--r--data/images/devices/Deskjet_5400_series.pngbin0 -> 3633 bytes
-rw-r--r--data/images/devices/Deskjet_5700.pngbin0 -> 3538 bytes
-rw-r--r--data/images/devices/Deskjet_5900_series.pngbin0 -> 3761 bytes
-rw-r--r--data/images/devices/Deskjet_6500.pngbin0 -> 2743 bytes
-rw-r--r--data/images/devices/Deskjet_6800.pngbin0 -> 3510 bytes
-rw-r--r--data/images/devices/HP_2000C.pngbin0 -> 2621 bytes
-rw-r--r--data/images/devices/HP_2500C.pngbin0 -> 1184 bytes
-rw-r--r--data/images/devices/HP_BI_3000.pngbin0 -> 4532 bytes
-rw-r--r--data/images/devices/HP_Business_Inkjet_1200.pngbin0 -> 2415 bytes
-rw-r--r--data/images/devices/HP_Color_LaserJet_1500.pngbin0 -> 4782 bytes
-rw-r--r--data/images/devices/HP_Color_LaserJet_2840.pngbin0 -> 3550 bytes
-rw-r--r--data/images/devices/HP_Color_LaserJet_4500.pngbin0 -> 3935 bytes
-rw-r--r--data/images/devices/HP_Color_LaserJet_4730mfp.pngbin0 -> 3894 bytes
-rw-r--r--data/images/devices/HP_Color_LaserJet_8550.pngbin0 -> 3594 bytes
-rw-r--r--data/images/devices/HP_LJ1xxx.pngbin0 -> 2355 bytes
-rw-r--r--data/images/devices/HP_LaserJet_1012.pngbin0 -> 3001 bytes
-rw-r--r--data/images/devices/HP_LaserJet_1220.pngbin0 -> 4261 bytes
-rw-r--r--data/images/devices/HP_LaserJet_3200M.pngbin0 -> 9479 bytes
-rw-r--r--data/images/devices/HP_LaserJet_3300_3310_3320.pngbin0 -> 5930 bytes
-rw-r--r--data/images/devices/HP_LaserJet_4000.pngbin0 -> 3652 bytes
-rw-r--r--data/images/devices/HP_LaserJet_4100_MFP.pngbin0 -> 4523 bytes
-rw-r--r--data/images/devices/HP_LaserJet_4M.pngbin0 -> 4553 bytes
-rw-r--r--data/images/devices/HP_LaserJet_5Si.pngbin0 -> 1199 bytes
-rw-r--r--data/images/devices/HP_LaserJet_6MP.pngbin0 -> 1029 bytes
-rw-r--r--data/images/devices/HP_LaserJet_8100_Series.pngbin0 -> 4014 bytes
-rw-r--r--data/images/devices/HP_LaserJet_9000_MFP.pngbin0 -> 4604 bytes
-rw-r--r--data/images/devices/HP_LaserJet_9040_MFP.pngbin0 -> 3404 bytes
-rw-r--r--data/images/devices/HP_LaserJet_9500dn.pngbin0 -> 3681 bytes
-rw-r--r--data/images/devices/HP_LaserJet_m1005.pngbin0 -> 5661 bytes
-rw-r--r--data/images/devices/HP_LaserJet_m1522.pngbin0 -> 5333 bytes
-rw-r--r--data/images/devices/HP_Officejet_Pro_L7700.pngbin0 -> 4000 bytes
-rw-r--r--data/images/devices/LASERJET_3500.pngbin0 -> 3029 bytes
-rw-r--r--data/images/devices/LASERJET_4650.pngbin0 -> 3291 bytes
-rw-r--r--data/images/devices/LASERJET_4650dtn.pngbin0 -> 2999 bytes
-rw-r--r--data/images/devices/LASERJET_5500.pngbin0 -> 3802 bytes
-rw-r--r--data/images/devices/LASERJET_5500dtn.pngbin0 -> 3182 bytes
-rw-r--r--data/images/devices/LASERJET_5550.pngbin0 -> 3313 bytes
-rw-r--r--data/images/devices/LASERJET_5550DTN.pngbin0 -> 3099 bytes
-rw-r--r--data/images/devices/OFFICEJET_PRO_1150C.pngbin0 -> 1047 bytes
-rw-r--r--data/images/devices/OfficeJet_5105.pngbin0 -> 1294 bytes
-rw-r--r--data/images/devices/OfficeJet_6100_Series.pngbin0 -> 4397 bytes
-rw-r--r--data/images/devices/OfficeJet_8500_a910.pngbin0 -> 7001 bytes
-rw-r--r--data/images/devices/OfficeJet_G85.pngbin0 -> 4001 bytes
-rw-r--r--data/images/devices/OfficeJet_Series_300.pngbin0 -> 1308 bytes
-rw-r--r--data/images/devices/Officejet_6150_Series.pngbin0 -> 4187 bytes
-rw-r--r--data/images/devices/Officejet_6200_series.pngbin0 -> 1365 bytes
-rw-r--r--data/images/devices/Officejet_7200_series.pngbin0 -> 3493 bytes
-rw-r--r--data/images/devices/Officejet_9100_series.pngbin0 -> 1521 bytes
-rw-r--r--data/images/devices/PHOTOSMART_100.pngbin0 -> 3212 bytes
-rw-r--r--data/images/devices/PHOTOSMART_1218.pngbin0 -> 3940 bytes
-rw-r--r--data/images/devices/PHOTOSMART_1315.pngbin0 -> 3399 bytes
-rw-r--r--data/images/devices/PHOTOSMART_P1100.pngbin0 -> 3224 bytes
-rw-r--r--data/images/devices/PSC_900_Series.pngbin0 -> 5067 bytes
-rw-r--r--data/images/devices/Photosmart_2600_series.pngbin0 -> 3686 bytes
-rw-r--r--data/images/devices/Photosmart_2700_series.pngbin0 -> 5158 bytes
-rw-r--r--data/images/devices/Photosmart_3300_series.pngbin0 -> 4038 bytes
-rw-r--r--data/images/devices/Photosmart_370_series.pngbin0 -> 3432 bytes
-rw-r--r--data/images/devices/Photosmart_7400_series.pngbin0 -> 1040 bytes
-rw-r--r--data/images/devices/Photosmart_8050.pngbin0 -> 4275 bytes
-rw-r--r--data/images/devices/Photosmart_8100_series.pngbin0 -> 5019 bytes
-rw-r--r--data/images/devices/Photosmart_8250.pngbin0 -> 3212 bytes
-rw-r--r--data/images/devices/Photosmart_8400_series.pngbin0 -> 3781 bytes
-rw-r--r--data/images/devices/Photosmart_8750_series.pngbin0 -> 3208 bytes
-rw-r--r--data/images/devices/Photosmart_C3100.pngbin0 -> 2584 bytes
-rw-r--r--data/images/devices/Photosmart_C4100.pngbin0 -> 2598 bytes
-rw-r--r--data/images/devices/Photosmart_C5100.pngbin0 -> 3335 bytes
-rw-r--r--data/images/devices/Photosmart_C6100.pngbin0 -> 3467 bytes
-rw-r--r--data/images/devices/Photosmart_D5060.pngbin0 -> 2718 bytes
-rw-r--r--data/images/devices/Photosmart_D5100.pngbin0 -> 2816 bytes
-rw-r--r--data/images/devices/Photosmart_D6160.pngbin0 -> 2591 bytes
-rw-r--r--data/images/devices/Photosmart_D7100.pngbin0 -> 2764 bytes
-rw-r--r--data/images/devices/Photosmart_D7300.pngbin0 -> 2600 bytes
-rw-r--r--data/images/devices/Photosmart_Pro_B8300.pngbin0 -> 2569 bytes
-rw-r--r--data/images/devices/Photosmart_Pro_B9180.pngbin0 -> 3218 bytes
-rw-r--r--data/images/devices/Photosmart_a310.pngbin0 -> 3948 bytes
-rw-r--r--data/images/devices/Photosmart_a510.pngbin0 -> 2480 bytes
-rw-r--r--data/images/devices/Photosmart_a710.pngbin0 -> 5827 bytes
-rw-r--r--data/images/devices/cp1160.pngbin0 -> 3376 bytes
-rw-r--r--data/images/devices/default_business_inkjet.pngbin0 -> 3451 bytes
-rw-r--r--data/images/devices/default_designjet.pngbin0 -> 4328 bytes
-rw-r--r--data/images/devices/default_deskjet.pngbin0 -> 5742 bytes
-rw-r--r--data/images/devices/default_laserjet.pngbin0 -> 4492 bytes
-rw-r--r--data/images/devices/default_officejet.pngbin0 -> 4112 bytes
-rw-r--r--data/images/devices/default_photosmart.pngbin0 -> 4160 bytes
-rw-r--r--data/images/devices/default_printer.pngbin0 -> 5723 bytes
-rw-r--r--data/images/devices/default_psc.pngbin0 -> 4160 bytes
-rw-r--r--data/images/devices/desket_5650.pngbin0 -> 2539 bytes
-rw-r--r--data/images/devices/deskjet_1280.pngbin0 -> 4846 bytes
-rw-r--r--data/images/devices/deskjet_3200.pngbin0 -> 4336 bytes
-rw-r--r--data/images/devices/deskjet_3320.pngbin0 -> 3172 bytes
-rw-r--r--data/images/devices/deskjet_3325.pngbin0 -> 3893 bytes
-rw-r--r--data/images/devices/deskjet_3420.pngbin0 -> 2128 bytes
-rw-r--r--data/images/devices/deskjet_3425.pngbin0 -> 4690 bytes
-rw-r--r--data/images/devices/deskjet_3500.pngbin0 -> 3594 bytes
-rw-r--r--data/images/devices/deskjet_3600.pngbin0 -> 2917 bytes
-rw-r--r--data/images/devices/deskjet_3840.pngbin0 -> 2360 bytes
-rw-r--r--data/images/devices/deskjet_5100.pngbin0 -> 3039 bytes
-rw-r--r--data/images/devices/deskjet_5550.pngbin0 -> 6022 bytes
-rw-r--r--data/images/devices/deskjet_5552.pngbin0 -> 3984 bytes
-rw-r--r--data/images/devices/deskjet_5600.pngbin0 -> 3019 bytes
-rw-r--r--data/images/devices/deskjet_6120.pngbin0 -> 3499 bytes
-rw-r--r--data/images/devices/deskjet_6980.pngbin0 -> 4232 bytes
-rw-r--r--data/images/devices/deskjet_D2360.pngbin0 -> 2229 bytes
-rwxr-xr-xdata/images/devices/dj350.pngbin0 -> 1297 bytes
-rw-r--r--data/images/devices/dj450.pngbin0 -> 3724 bytes
-rw-r--r--data/images/devices/hp_LaserJet_1200.pngbin0 -> 3472 bytes
-rw-r--r--data/images/devices/hp_LaserJet_2100.pngbin0 -> 3720 bytes
-rw-r--r--data/images/devices/hp_LaserJet_3015.pngbin0 -> 3940 bytes
-rw-r--r--data/images/devices/hp_LaserJet_3020.pngbin0 -> 3591 bytes
-rw-r--r--data/images/devices/hp_LaserJet_4345_mfp.pngbin0 -> 3806 bytes
-rw-r--r--data/images/devices/hp_LaserJet_5000.pngbin0 -> 4878 bytes
-rw-r--r--data/images/devices/hp_LaserJet_8000.pngbin0 -> 3582 bytes
-rw-r--r--data/images/devices/hp_business_inkjet_1100.pngbin0 -> 2264 bytes
-rw-r--r--data/images/devices/hp_business_inkjet_2200.pngbin0 -> 4041 bytes
-rw-r--r--data/images/devices/hp_business_inkjet_2600.pngbin0 -> 3605 bytes
-rw-r--r--data/images/devices/hp_business_inkjet_3000.pngbin0 -> 4084 bytes
-rw-r--r--data/images/devices/hp_color_LaserJet_2550.pngbin0 -> 3322 bytes
-rw-r--r--data/images/devices/hp_color_LaserJet_3700.pngbin0 -> 3546 bytes
-rw-r--r--data/images/devices/hp_color_LaserJet_4600.pngbin0 -> 3233 bytes
-rw-r--r--data/images/devices/hp_color_LaserJet_9500.pngbin0 -> 3572 bytes
-rw-r--r--data/images/devices/hp_color_laserjet_cm1015_mfp.pngbin0 -> 4204 bytes
-rw-r--r--data/images/devices/hp_color_laserjet_cm1312_mfp.pngbin0 -> 4465 bytes
-rw-r--r--data/images/devices/hp_color_laserjet_cp2025.pngbin0 -> 4458 bytes
-rw-r--r--data/images/devices/hp_color_laserjet_cp3505.pngbin0 -> 4631 bytes
-rw-r--r--data/images/devices/hp_color_laserjet_cp3525.pngbin0 -> 3777 bytes
-rw-r--r--data/images/devices/hp_color_laserjet_cp4005.pngbin0 -> 3912 bytes
-rw-r--r--data/images/devices/hp_color_laserjet_cp6015.pngbin0 -> 4471 bytes
-rw-r--r--data/images/devices/hp_deskjet_9300.pngbin0 -> 2864 bytes
-rw-r--r--data/images/devices/hp_deskjet_f4200.pngbin0 -> 4752 bytes
-rw-r--r--data/images/devices/hp_laserjet_3050.pngbin0 -> 5089 bytes
-rw-r--r--data/images/devices/hp_laserjet_m2727_mfp.pngbin0 -> 4039 bytes
-rw-r--r--data/images/devices/hp_laserjet_p2015.pngbin0 -> 3563 bytes
-rw-r--r--data/images/devices/hp_photosmart_b8500_series.pngbin0 -> 2654 bytes
-rw-r--r--data/images/devices/laserjet_2410.pngbin0 -> 3865 bytes
-rw-r--r--data/images/devices/officejet_4200_series.pngbin0 -> 4768 bytes
-rw-r--r--data/images/devices/officejet_500.pngbin0 -> 4795 bytes
-rw-r--r--data/images/devices/officejet_5500_series.pngbin0 -> 1620 bytes
-rw-r--r--data/images/devices/officejet_5600.pngbin0 -> 3719 bytes
-rw-r--r--data/images/devices/officejet_j3600_series.pngbin0 -> 5093 bytes
-rw-r--r--data/images/devices/officejet_j5500_series.pngbin0 -> 3410 bytes
-rw-r--r--data/images/devices/officejet_k550.pngbin0 -> 3721 bytes
-rw-r--r--data/images/devices/officejet_k80.pngbin0 -> 5862 bytes
-rw-r--r--data/images/devices/photosmart_7150.pngbin0 -> 4111 bytes
-rw-r--r--data/images/devices/photosmart_7900_series.pngbin0 -> 2968 bytes
-rw-r--r--data/images/devices/photosmart_a610.pngbin0 -> 4075 bytes
-rw-r--r--data/images/devices/photosmart_a820_series.pngbin0 -> 5418 bytes
-rw-r--r--data/images/devices/psc_1100_series.pngbin0 -> 5316 bytes
-rw-r--r--data/images/devices/psc_1610.pngbin0 -> 2757 bytes
-rw-r--r--data/images/devices/psc_2300_series.pngbin0 -> 3370 bytes
-rw-r--r--data/images/other/aio_align.pngbin0 -> 14555 bytes
-rw-r--r--data/images/other/align10.pngbin0 -> 477 bytes
-rw-r--r--data/images/other/clean.pngbin0 -> 4718 bytes
-rw-r--r--data/images/other/color_adj.pngbin0 -> 483 bytes
-rw-r--r--data/images/other/confidential_coverpage.pngbin0 -> 7385 bytes
-rw-r--r--data/images/other/confidential_title.pngbin0 -> 9401 bytes
-rw-r--r--data/images/other/fax.pngbin0 -> 889 bytes
-rw-r--r--data/images/other/fax2.pngbin0 -> 1180 bytes
-rw-r--r--data/images/other/generic_coverpage.pngbin0 -> 6715 bytes
-rw-r--r--data/images/other/generic_title.pngbin0 -> 6534 bytes
-rw-r--r--data/images/other/h-k-2.pngbin0 -> 467 bytes
-rw-r--r--data/images/other/h-k-3.pngbin0 -> 473 bytes
-rw-r--r--data/images/other/h-kc-2.pngbin0 -> 466 bytes
-rw-r--r--data/images/other/h-kc-3.pngbin0 -> 470 bytes
-rw-r--r--data/images/other/hp-tux-printer.pngbin0 -> 14074 bytes
-rw-r--r--data/images/other/load_paper.pngbin0 -> 7458 bytes
-rw-r--r--data/images/other/opensource-75x65.pngbin0 -> 4767 bytes
-rw-r--r--data/images/other/panel_lcd.pngbin0 -> 625 bytes
-rw-r--r--data/images/other/pens.pngbin0 -> 2526 bytes
-rw-r--r--data/images/other/powered_by_python.pngbin0 -> 7866 bytes
-rw-r--r--data/images/other/signal0.pngbin0 -> 174 bytes
-rw-r--r--data/images/other/signal1.pngbin0 -> 197 bytes
-rw-r--r--data/images/other/signal2.pngbin0 -> 195 bytes
-rw-r--r--data/images/other/signal3.pngbin0 -> 194 bytes
-rw-r--r--data/images/other/signal4.pngbin0 -> 193 bytes
-rw-r--r--data/images/other/signal5.pngbin0 -> 181 bytes
-rw-r--r--data/images/other/standard_coverpage.pngbin0 -> 6332 bytes
-rw-r--r--data/images/other/type4_color_patch.pngbin0 -> 4430 bytes
-rw-r--r--data/images/other/type4_gray_patch.pngbin0 -> 6254 bytes
-rw-r--r--data/images/other/urgent_coverpage.pngbin0 -> 7826 bytes
-rw-r--r--data/images/other/urgent_title.pngbin0 -> 2038 bytes
-rw-r--r--data/images/other/usb_connection.pngbin0 -> 37180 bytes
-rw-r--r--data/images/other/v-c-2.pngbin0 -> 456 bytes
-rw-r--r--data/images/other/v-c-3.pngbin0 -> 394 bytes
-rw-r--r--data/images/other/v-k-2.pngbin0 -> 454 bytes
-rw-r--r--data/images/other/v-k-3.pngbin0 -> 394 bytes
-rw-r--r--data/images/other/v-kc-2.pngbin0 -> 469 bytes
-rw-r--r--data/images/other/v-kc-3.pngbin0 -> 386 bytes
-rw-r--r--data/images/other/zca.pngbin0 -> 608 bytes
-rw-r--r--data/ldl/cb2pcal.ldl.gzbin0 -> 20986 bytes
-rw-r--r--data/ldl/cb2pcal_done.ldl.gzbin0 -> 1593 bytes
-rw-r--r--data/ldl/cbbcal.ldl.gzbin0 -> 7007 bytes
-rw-r--r--data/ldl/cbccal.ldl.gzbin0 -> 6405 bytes
-rw-r--r--data/ldl/cbccal_done.ldl.gzbin0 -> 2076 bytes
-rw-r--r--data/ldl/cbcpcal.ldl.gzbin0 -> 824660 bytes
-rw-r--r--data/ldl/cbpcal.ldl.gzbin0 -> 6131 bytes
-rw-r--r--data/localization/hplip_de.qmbin0 -> 109687 bytes
-rwxr-xr-xdata/localization/hplip_de.ts5048
-rw-r--r--data/localization/hplip_es.qmbin0 -> 110777 bytes
-rwxr-xr-xdata/localization/hplip_es.ts5048
-rw-r--r--data/localization/hplip_fr.qmbin0 -> 114309 bytes
-rwxr-xr-xdata/localization/hplip_fr.ts5048
-rw-r--r--data/localization/hplip_it.qmbin0 -> 107431 bytes
-rwxr-xr-xdata/localization/hplip_it.ts5048
-rw-r--r--data/localization/hplip_pt.qmbin0 -> 106663 bytes
-rwxr-xr-xdata/localization/hplip_pt.ts5048
-rw-r--r--data/localization/hplip_ru.qmbin0 -> 108771 bytes
-rwxr-xr-xdata/localization/hplip_ru.ts5048
-rw-r--r--data/localization/hplip_zh.qmbin0 -> 56501 bytes
-rwxr-xr-xdata/localization/hplip_zh.ts5048
-rw-r--r--data/models/models.dat48946
-rwxr-xr-xdata/pcl/align1_8xx.pcl.gzbin0 -> 13102 bytes
-rwxr-xr-xdata/pcl/align1_9xx.pcl.gzbin0 -> 95888 bytes
-rwxr-xr-xdata/pcl/align2_8xx.pcl.gzbin0 -> 2702 bytes
-rwxr-xr-xdata/pcl/align2_9xx.pcl.gzbin0 -> 11930 bytes
-rw-r--r--data/pcl/align3_8xx.pcl.gzbin0 -> 1733 bytes
-rwxr-xr-xdata/pcl/align3_9xx.pcl.gzbin0 -> 3656 bytes
-rwxr-xr-xdata/pcl/align4_450.pcl.gzbin0 -> 38210 bytes
-rw-r--r--data/pcl/align4_8xx.pcl.gzbin0 -> 1447 bytes
-rw-r--r--data/pcl/align5_8xx.pcl.gzbin0 -> 17466 bytes
-rwxr-xr-xdata/pcl/align6_450.pcl.gzbin0 -> 39148 bytes
-rwxr-xr-xdata/pcl/colorcal1_450.pcl.gzbin0 -> 3590197 bytes
-rwxr-xr-xdata/pcl/colorcal2_450.pcl.gzbin0 -> 72 bytes
-rwxr-xr-xdata/pcl/crbcal.pcl.gzbin0 -> 10715 bytes
-rwxr-xr-xdata/pcl/crcaldone.pcl.gzbin0 -> 725 bytes
-rwxr-xr-xdata/pcl/crcbcal.pcl.gzbin0 -> 31232 bytes
-rwxr-xr-xdata/pcl/crccal.pcl.gzbin0 -> 17315 bytes
-rwxr-xr-xdata/pcl/crcpcal.pcl.gzbin0 -> 41768 bytes
-rwxr-xr-xdata/pcl/crpcal.pcl.gzbin0 -> 12230 bytes
-rw-r--r--data/policykit/com.hp.hplip.conf27
-rw-r--r--data/policykit/com.hp.hplip.policy20
-rw-r--r--data/policykit/com.hp.hplip.service4
-rw-r--r--data/policykit/com.hp.hplip.service.in4
-rw-r--r--data/ps/clean_page.pdf.gzbin0 -> 2357 bytes
-rw-r--r--data/ps/testpage.ps.gzbin0 -> 100138 bytes
-rw-r--r--data/rules/20-hplip-devices.fdi65
-rw-r--r--data/rules/40-hplip.rules138
-rw-r--r--data/rules/55-hpmud.rules153
-rw-r--r--data/rules/56-hpmud_add_printer.rules11
-rw-r--r--data/rules/56-hpmud_support.rules15
-rwxr-xr-xdata/rules/86-hpmud_plugin.rules9
-rw-r--r--debian/changelog5085
-rwxr-xr-xdepcomp630
-rwxr-xr-xdevicesettings.py86
-rwxr-xr-xdiagnose_plugin.py104
-rwxr-xr-xdiagnose_queues.py440
-rw-r--r--doc/commandline.html30
-rw-r--r--doc/copying.html34
-rw-r--r--doc/devicemanager.html36
-rw-r--r--doc/faxtrouble.html66
-rw-r--r--doc/gettinghelp.html24
-rw-r--r--doc/hpscan.html264
-rw-r--r--doc/images/favicon.icobin0 -> 3774 bytes
-rw-r--r--doc/images/print.pngbin0 -> 40206 bytes
-rw-r--r--doc/images/toolbox_actions.pngbin0 -> 64280 bytes
-rw-r--r--doc/images/toolbox_fax.pngbin0 -> 54694 bytes
-rw-r--r--doc/images/toolbox_print_control.pngbin0 -> 53375 bytes
-rw-r--r--doc/images/toolbox_print_settings.pngbin0 -> 74928 bytes
-rw-r--r--doc/images/toolbox_status.pngbin0 -> 57104 bytes
-rw-r--r--doc/images/toolbox_supplies.pngbin0 -> 71262 bytes
-rw-r--r--doc/images/xsane.pngbin0 -> 170193 bytes
-rw-r--r--doc/index.html46
-rw-r--r--doc/mainttask.html30
-rw-r--r--doc/plugins.html27
-rw-r--r--doc/print.html32
-rw-r--r--doc/printing.html29
-rw-r--r--doc/printoptions.html40
-rw-r--r--doc/printtroubleshooting.html66
-rw-r--r--doc/scanning.html27
-rw-r--r--doc/scantrouble.html66
-rw-r--r--doc/sendfax.html29
-rw-r--r--doc/setup.html52
-rw-r--r--doc/styles/css.css130
-rw-r--r--doc/systray.html29
-rw-r--r--doc/troubleshooting.html78
-rw-r--r--doc/uninstalling.html32
-rw-r--r--doc/upgrading.html31
-rwxr-xr-xfab.py887
-rw-r--r--fax/__init__.py20
-rwxr-xr-xfax/backend/hpfax.py286
-rw-r--r--fax/coverpages.py588
-rw-r--r--fax/fax.py972
-rw-r--r--fax/faxdevice.py70
-rwxr-xr-xfax/filters/pstotiff40
-rw-r--r--fax/filters/pstotiff.convs27
-rw-r--r--fax/filters/pstotiff.types53
-rw-r--r--fax/ledmfax.py691
-rw-r--r--fax/ledmsoapfax.py106
-rw-r--r--fax/marvellfax.py872
-rw-r--r--fax/pmlfax.py1026
-rw-r--r--fax/ppd/HP-Fax-hpcups.ppd.gzbin0 -> 980 bytes
-rw-r--r--fax/ppd/HP-Fax-hpijs.ppd.gzbin0 -> 1932 bytes
-rw-r--r--fax/ppd/HP-Fax2-hpcups.ppd.gzbin0 -> 988 bytes
-rw-r--r--fax/ppd/HP-Fax2-hpijs.ppd.gzbin0 -> 1935 bytes
-rw-r--r--fax/ppd/HP-Fax3-hpcups.ppd.gzbin0 -> 933 bytes
-rw-r--r--fax/ppd/HP-Fax3-hpijs.ppd.gzbin0 -> 1914 bytes
-rw-r--r--fax/ppd/HP-Fax4-hpcups.ppd.gzbin0 -> 946 bytes
-rw-r--r--fax/ppd/HP-Fax4-hpijs.ppd.gzbin0 -> 1897 bytes
-rw-r--r--fax/soapfax.py719
-rwxr-xr-xfaxsetup.py82
-rwxr-xr-xfirmware.py195
-rw-r--r--foomatic_drv.inc880
-rwxr-xr-xhpdio.py205
-rwxr-xr-xhplip-install7
-rw-r--r--hplip-systray.desktop.in12
-rw-r--r--hplip.conf.in45
-rw-r--r--hplip.desktop.in12
-rw-r--r--hplip.list.in491
-rw-r--r--hplip.manifest5
-rwxr-xr-xhpssd.py607
-rwxr-xr-xinfo.py186
-rw-r--r--init-iptables-firewall17
-rwxr-xr-xinit-suse-firewall18
-rwxr-xr-xinstall-sh520
-rwxr-xr-xinstall.py243
-rw-r--r--installer/__init__.py19
-rw-r--r--installer/core_install.py2387
-rw-r--r--installer/dcheck.py223
-rw-r--r--installer/distros.dat8963
-rwxr-xr-xinstaller/text_install.py857
-rw-r--r--io/hpmud/dot4.c750
-rw-r--r--io/hpmud/dot4.h187
-rw-r--r--io/hpmud/hp-mkuri.c543
-rw-r--r--io/hpmud/hpmud.c699
-rw-r--r--io/hpmud/hpmud.h581
-rw-r--r--io/hpmud/hpmudi.h212
-rw-r--r--io/hpmud/jd.c906
-rw-r--r--io/hpmud/jd.h56
-rw-r--r--io/hpmud/list.h131
-rw-r--r--io/hpmud/mlc.c772
-rw-r--r--io/hpmud/mlc.h150
-rw-r--r--io/hpmud/model.c633
-rw-r--r--io/hpmud/musb.c2197
-rw-r--r--io/hpmud/musb.h121
-rw-r--r--io/hpmud/pml.c520
-rw-r--r--io/hpmud/pml.h77
-rw-r--r--io/hpmud/pp.c1310
-rw-r--r--io/hpmud/pp.h100
-rw-r--r--io/mudext/hpmudext.c495
-rw-r--r--ip/hpip.h918
-rw-r--r--ip/ipdefs.h116
-rw-r--r--ip/ipmain.c1342
-rw-r--r--ip/xbi2gray.c453
-rw-r--r--ip/xchgbpp.c627
-rw-r--r--ip/xcolrspc.c1191
-rw-r--r--ip/xconvolve.c658
-rw-r--r--ip/xcrop.c470
-rw-r--r--ip/xfakemono.c465
-rw-r--r--ip/xfax.c3566
-rw-r--r--ip/xform.h340
-rw-r--r--ip/xgamma.c760
-rw-r--r--ip/xgray2bi.c614
-rw-r--r--ip/xgrayout.c495
-rw-r--r--ip/xinvert.c459
-rw-r--r--ip/xjpg_dct.c393
-rw-r--r--ip/xjpg_dct.h50
-rw-r--r--ip/xjpg_dec.c2838
-rw-r--r--ip/xjpg_enc.c2184
-rw-r--r--ip/xjpg_fix.c839
-rw-r--r--ip/xjpg_huf.c558
-rw-r--r--ip/xjpg_huf.h83
-rw-r--r--ip/xjpg_mrk.h91
-rw-r--r--ip/xmatrix.c547
-rw-r--r--ip/xpad.c523
-rw-r--r--ip/xpcx.c1318
-rw-r--r--ip/xpnm.c591
-rw-r--r--ip/xrotate.c819
-rw-r--r--ip/xsaturation.c463
-rw-r--r--ip/xscale.c1277
-rw-r--r--ip/xskel.c456
-rw-r--r--ip/xtable.c742
-rw-r--r--ip/xthumb.c558
-rw-r--r--ip/xtiff.c1338
-rw-r--r--ip/xtonemap.c496
-rw-r--r--ip/xyxtract.c451
-rwxr-xr-xlevels.py207
-rwxr-xr-xlinefeedcal.py90
-rw-r--r--ltmain.sh6956
-rwxr-xr-xmakecopies.py355
-rwxr-xr-xmakeuri.py161
-rwxr-xr-xmissing376
-rw-r--r--packaging/change-udev-rules.diff294
-rw-r--r--packaging/fix-uninitialized-variables.diff11
-rw-r--r--packaging/hp-systray.wrapper17
-rw-r--r--packaging/hpijs.1.gzbin0 -> 682 bytes
-rw-r--r--packaging/hplip-3.9.8-CVE-2010-4267.patch11
-rw-r--r--packaging/hplip.desktop6
-rw-r--r--packaging/hplip.spec1591
-rw-r--r--packaging/no-chgrp_lp_hplip_Logdir.diff20
-rw-r--r--packaging/tizen_add_sigpipe_ign.patch11
-rw-r--r--packaging/tizen_disable_dbus_hpcups.patch20
-rw-r--r--packaging/tizen_fix_debug_log.patch11
-rw-r--r--packaging/tizen_fix_image_align.patch11
-rw-r--r--pcard/__init__.py20
-rw-r--r--pcard/fat.c789
-rw-r--r--pcard/fat.h79
-rw-r--r--pcard/pcardext/pcardext.c246
-rw-r--r--pcard/photocard.py741
-rw-r--r--pcard/ptest.c466
-rw-r--r--pcard/ptest.h32
-rwxr-xr-xpkservice.py106
-rwxr-xr-xplugin.py452
-rw-r--r--plugins/Deskjet_460.py25
-rw-r--r--plugins/Officejet_H470.py25
-rw-r--r--plugins/__init__.py20
-rw-r--r--plugins/dj450.py25
-rw-r--r--plugins/powersettings.py46
-rw-r--r--plugins/powersettings2.py38
-rw-r--r--plugins/powersettingsdialog.py156
-rw-r--r--plugins/powersettingsdialog_base.py108
-rw-r--r--plugins/powersettingsdialog_base.ui192
-rw-r--r--ppd/hpcups/apollo-2100.ppd.gzbin0 -> 3004 bytes
-rw-r--r--ppd/hpcups/apollo-2150.ppd.gzbin0 -> 3004 bytes
-rw-r--r--ppd/hpcups/apollo-2200.ppd.gzbin0 -> 3005 bytes
-rw-r--r--ppd/hpcups/apollo-2500.ppd.gzbin0 -> 3010 bytes
-rw-r--r--ppd/hpcups/apollo-2600.ppd.gzbin0 -> 3009 bytes
-rw-r--r--ppd/hpcups/apollo-2650.ppd.gzbin0 -> 3011 bytes
-rw-r--r--ppd/hpcups/apollo-p2000-u.ppd.gzbin0 -> 3009 bytes
-rw-r--r--ppd/hpcups/apollo-p2250.ppd.gzbin0 -> 3011 bytes
-rw-r--r--ppd/hpcups/hp-2000c.ppd.gzbin0 -> 3830 bytes
-rw-r--r--ppd/hpcups/hp-2500c.ppd.gzbin0 -> 4200 bytes
-rw-r--r--ppd/hpcups/hp-910.ppd.gzbin0 -> 3408 bytes
-rw-r--r--ppd/hpcups/hp-915.ppd.gzbin0 -> 3421 bytes
-rw-r--r--ppd/hpcups/hp-business_inkjet_1000.ppd.gzbin0 -> 4175 bytes
-rw-r--r--ppd/hpcups/hp-business_inkjet_1100.ppd.gzbin0 -> 4184 bytes
-rw-r--r--ppd/hpcups/hp-business_inkjet_1200.ppd.gzbin0 -> 4186 bytes
-rw-r--r--ppd/hpcups/hp-business_inkjet_2200.ppd.gzbin0 -> 3890 bytes
-rw-r--r--ppd/hpcups/hp-business_inkjet_2230.ppd.gzbin0 -> 3882 bytes
-rw-r--r--ppd/hpcups/hp-business_inkjet_2250-pcl3.ppd.gzbin0 -> 3899 bytes
-rw-r--r--ppd/hpcups/hp-business_inkjet_2280-pcl3.ppd.gzbin0 -> 3898 bytes
-rw-r--r--ppd/hpcups/hp-business_inkjet_2300-pcl3.ppd.gzbin0 -> 3193 bytes
-rw-r--r--ppd/hpcups/hp-business_inkjet_2600-pcl3.ppd.gzbin0 -> 3278 bytes
-rw-r--r--ppd/hpcups/hp-business_inkjet_2800-pcl3.ppd.gzbin0 -> 3281 bytes
-rw-r--r--ppd/hpcups/hp-business_inkjet_3000-pcl3.ppd.gzbin0 -> 3281 bytes
-rw-r--r--ppd/hpcups/hp-color_inkjet_cp1700.ppd.gzbin0 -> 3979 bytes
-rw-r--r--ppd/hpcups/hp-color_inkjet_printer_cp1700.ppd.gzbin0 -> 4378 bytes
-rw-r--r--ppd/hpcups/hp-color_laserjet_1600.ppd.gzbin0 -> 3206 bytes
-rw-r--r--ppd/hpcups/hp-color_laserjet_2500-pcl3.ppd.gzbin0 -> 3175 bytes
-rw-r--r--ppd/hpcups/hp-color_laserjet_2500_series.ppd.gzbin0 -> 3195 bytes
-rw-r--r--ppd/hpcups/hp-color_laserjet_2600n.ppd.gzbin0 -> 3203 bytes
-rw-r--r--ppd/hpcups/hp-color_laserjet_3000-pcl3.ppd.gzbin0 -> 3186 bytes
-rw-r--r--ppd/hpcups/hp-color_laserjet_3500.ppd.gzbin0 -> 3200 bytes
-rw-r--r--ppd/hpcups/hp-color_laserjet_3500n.ppd.gzbin0 -> 3193 bytes
-rw-r--r--ppd/hpcups/hp-color_laserjet_3550.ppd.gzbin0 -> 3193 bytes
-rw-r--r--ppd/hpcups/hp-color_laserjet_3550n.ppd.gzbin0 -> 3195 bytes
-rw-r--r--ppd/hpcups/hp-color_laserjet_3600.ppd.gzbin0 -> 3201 bytes
-rw-r--r--ppd/hpcups/hp-color_laserjet_3700-pcl3.ppd.gzbin0 -> 3173 bytes
-rw-r--r--ppd/hpcups/hp-color_laserjet_3700n.ppd.gzbin0 -> 3173 bytes
-rw-r--r--ppd/hpcups/hp-color_laserjet_3800-pcl3.ppd.gzbin0 -> 3187 bytes
-rw-r--r--ppd/hpcups/hp-color_laserjet_4500-pcl3.ppd.gzbin0 -> 3183 bytes
-rw-r--r--ppd/hpcups/hp-color_laserjet_4550-pcl3.ppd.gzbin0 -> 3194 bytes
-rw-r--r--ppd/hpcups/hp-color_laserjet_4600-pcl3.ppd.gzbin0 -> 3180 bytes
-rw-r--r--ppd/hpcups/hp-color_laserjet_4600_series.ppd.gzbin0 -> 3197 bytes
-rw-r--r--ppd/hpcups/hp-color_laserjet_4610-pcl3.ppd.gzbin0 -> 3176 bytes
-rw-r--r--ppd/hpcups/hp-color_laserjet_4650-pcl3.ppd.gzbin0 -> 3189 bytes
-rw-r--r--ppd/hpcups/hp-color_laserjet_4700-pcl3.ppd.gzbin0 -> 3192 bytes
-rw-r--r--ppd/hpcups/hp-color_laserjet_4730mfp-pcl3.ppd.gzbin0 -> 3202 bytes
-rw-r--r--ppd/hpcups/hp-color_laserjet_5.ppd.gzbin0 -> 3267 bytes
-rw-r--r--ppd/hpcups/hp-color_laserjet_5500-pcl3.ppd.gzbin0 -> 3298 bytes
-rw-r--r--ppd/hpcups/hp-color_laserjet_5550-pcl3.ppd.gzbin0 -> 3300 bytes
-rw-r--r--ppd/hpcups/hp-color_laserjet_5m-pcl3.ppd.gzbin0 -> 3282 bytes
-rw-r--r--ppd/hpcups/hp-color_laserjet_8500-pcl3.ppd.gzbin0 -> 3290 bytes
-rw-r--r--ppd/hpcups/hp-color_laserjet_8550-pcl3.ppd.gzbin0 -> 3321 bytes
-rw-r--r--ppd/hpcups/hp-color_laserjet_9500-pcl3.ppd.gzbin0 -> 3297 bytes
-rw-r--r--ppd/hpcups/hp-color_laserjet_9500_mfp-pcl3.ppd.gzbin0 -> 3304 bytes
-rw-r--r--ppd/hpcups/hp-color_laserjet_cm1312_mfp-pcl3.ppd.gzbin0 -> 3201 bytes
-rw-r--r--ppd/hpcups/hp-color_laserjet_cm1312nfi_mfp-pcl3.ppd.gzbin0 -> 3206 bytes
-rw-r--r--ppd/hpcups/hp-color_laserjet_cm2320_mfp-pcl3.ppd.gzbin0 -> 3141 bytes
-rw-r--r--ppd/hpcups/hp-color_laserjet_cm2320fxi_mfp-pcl3.ppd.gzbin0 -> 3147 bytes
-rw-r--r--ppd/hpcups/hp-color_laserjet_cm2320n_mfp-pcl3.ppd.gzbin0 -> 3144 bytes
-rw-r--r--ppd/hpcups/hp-color_laserjet_cm2320nf_mfp-pcl3.ppd.gzbin0 -> 3145 bytes
-rw-r--r--ppd/hpcups/hp-color_laserjet_cm3530_mfp-pcl3.ppd.gzbin0 -> 3206 bytes
-rw-r--r--ppd/hpcups/hp-color_laserjet_cm4540_mfp-pcl3.ppd.gzbin0 -> 3199 bytes
-rw-r--r--ppd/hpcups/hp-color_laserjet_cm4730_mfp-pcl3.ppd.gzbin0 -> 3214 bytes
-rw-r--r--ppd/hpcups/hp-color_laserjet_cm6030_mfp-pcl3.ppd.gzbin0 -> 3313 bytes
-rw-r--r--ppd/hpcups/hp-color_laserjet_cm6040_mfp.ppd.gzbin0 -> 3305 bytes
-rw-r--r--ppd/hpcups/hp-color_laserjet_cm6049_mfp.ppd.gzbin0 -> 3285 bytes
-rw-r--r--ppd/hpcups/hp-color_laserjet_cp1215.ppd.gzbin0 -> 3210 bytes
-rw-r--r--ppd/hpcups/hp-color_laserjet_cp1217.ppd.gzbin0 -> 3210 bytes
-rw-r--r--ppd/hpcups/hp-color_laserjet_cp1514n-pcl3.ppd.gzbin0 -> 3179 bytes
-rw-r--r--ppd/hpcups/hp-color_laserjet_cp1515n-pcl3.ppd.gzbin0 -> 3179 bytes
-rw-r--r--ppd/hpcups/hp-color_laserjet_cp1518ni-pcl3.ppd.gzbin0 -> 3181 bytes
-rw-r--r--ppd/hpcups/hp-color_laserjet_cp2025-pcl3.ppd.gzbin0 -> 3176 bytes
-rw-r--r--ppd/hpcups/hp-color_laserjet_cp2025dn-pcl3.ppd.gzbin0 -> 3181 bytes
-rw-r--r--ppd/hpcups/hp-color_laserjet_cp2025n-pcl3.ppd.gzbin0 -> 3179 bytes
-rw-r--r--ppd/hpcups/hp-color_laserjet_cp2025x-pcl3.ppd.gzbin0 -> 3180 bytes
-rw-r--r--ppd/hpcups/hp-color_laserjet_cp3505-pcl3.ppd.gzbin0 -> 3190 bytes
-rw-r--r--ppd/hpcups/hp-color_laserjet_cp3525-pcl3.ppd.gzbin0 -> 3189 bytes
-rw-r--r--ppd/hpcups/hp-color_laserjet_cp4005-pcl3.ppd.gzbin0 -> 3191 bytes
-rw-r--r--ppd/hpcups/hp-color_laserjet_cp4020_series-pcl3.ppd.gzbin0 -> 3195 bytes
-rw-r--r--ppd/hpcups/hp-color_laserjet_cp4520_series-pcl3.ppd.gzbin0 -> 3195 bytes
-rw-r--r--ppd/hpcups/hp-color_laserjet_cp5225-pcl3.ppd.gzbin0 -> 3175 bytes
-rw-r--r--ppd/hpcups/hp-color_laserjet_cp5225dn-pcl3.ppd.gzbin0 -> 3178 bytes
-rw-r--r--ppd/hpcups/hp-color_laserjet_cp5225n-pcl3.ppd.gzbin0 -> 3177 bytes
-rw-r--r--ppd/hpcups/hp-color_laserjet_cp5520_series-pcl3.ppd.gzbin0 -> 3195 bytes
-rw-r--r--ppd/hpcups/hp-color_laserjet_cp6015-pcl3.ppd.gzbin0 -> 3304 bytes
-rw-r--r--ppd/hpcups/hp-cp1160.ppd.gzbin0 -> 3955 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_1000_j110_series.ppd.gzbin0 -> 2972 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_1050_j410_series.ppd.gzbin0 -> 2983 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_1100.ppd.gzbin0 -> 2917 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_1120.ppd.gzbin0 -> 4200 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_1125.ppd.gzbin0 -> 4192 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_1200c.ppd.gzbin0 -> 3262 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_1220c.ppd.gzbin0 -> 4312 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_1280.ppd.gzbin0 -> 4295 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_1600c.ppd.gzbin0 -> 3259 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_1600cm.ppd.gzbin0 -> 3262 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_1600cn.ppd.gzbin0 -> 3261 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_2000_j210_series.ppd.gzbin0 -> 2971 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_2050_j510_series.ppd.gzbin0 -> 2983 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_3000_j310_series.ppd.gzbin0 -> 2973 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_3050_j610_series.ppd.gzbin0 -> 2973 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_3050a_j611_series.ppd.gzbin0 -> 2975 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_3070_b611_series.ppd.gzbin0 -> 4207 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_3320.ppd.gzbin0 -> 3343 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_3325.ppd.gzbin0 -> 3337 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_3420.ppd.gzbin0 -> 3400 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_3425.ppd.gzbin0 -> 3389 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_3450.ppd.gzbin0 -> 3397 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_3500.ppd.gzbin0 -> 3356 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_3550.ppd.gzbin0 -> 3348 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_3600.ppd.gzbin0 -> 3439 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_3650.ppd.gzbin0 -> 3463 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_3740.ppd.gzbin0 -> 3358 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_3810.ppd.gzbin0 -> 3929 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_3816.ppd.gzbin0 -> 3933 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_3819.ppd.gzbin0 -> 3929 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_3820.ppd.gzbin0 -> 3937 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_3822.ppd.gzbin0 -> 3929 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_3840.ppd.gzbin0 -> 3452 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_3870.ppd.gzbin0 -> 3928 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_3900.ppd.gzbin0 -> 3335 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_3910.ppd.gzbin0 -> 3354 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_3920.ppd.gzbin0 -> 3335 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_3940.ppd.gzbin0 -> 3341 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_400.ppd.gzbin0 -> 2910 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_400l.ppd.gzbin0 -> 2065 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_460.ppd.gzbin0 -> 4150 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_500.ppd.gzbin0 -> 2897 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_500c.ppd.gzbin0 -> 2899 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_505j.ppd.gzbin0 -> 2888 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_510.ppd.gzbin0 -> 2885 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_5100.ppd.gzbin0 -> 4627 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_520.ppd.gzbin0 -> 2885 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_540.ppd.gzbin0 -> 2895 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_5400_series.ppd.gzbin0 -> 4645 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_550c.ppd.gzbin0 -> 2902 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_5550.ppd.gzbin0 -> 4142 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_5551.ppd.gzbin0 -> 4136 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_5552.ppd.gzbin0 -> 4602 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_5600.ppd.gzbin0 -> 4596 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_5650.ppd.gzbin0 -> 4609 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_5652.ppd.gzbin0 -> 4601 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_5700.ppd.gzbin0 -> 4618 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_5800.ppd.gzbin0 -> 4600 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_5850.ppd.gzbin0 -> 4604 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_5900_series.ppd.gzbin0 -> 4628 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_600.ppd.gzbin0 -> 2918 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_610c.ppd.gzbin0 -> 3014 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_610cl.ppd.gzbin0 -> 3016 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_6120.ppd.gzbin0 -> 3962 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_6122.ppd.gzbin0 -> 3962 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_6127.ppd.gzbin0 -> 3962 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_612c.ppd.gzbin0 -> 3014 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_630c.ppd.gzbin0 -> 2975 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_632c.ppd.gzbin0 -> 2975 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_640c.ppd.gzbin0 -> 3040 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_648c.ppd.gzbin0 -> 3014 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_6500.ppd.gzbin0 -> 4632 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_656c.ppd.gzbin0 -> 2980 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_660.ppd.gzbin0 -> 2921 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_6600.ppd.gzbin0 -> 4619 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_670.ppd.gzbin0 -> 2919 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_670c.ppd.gzbin0 -> 2914 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_670tv.ppd.gzbin0 -> 2919 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_672c.ppd.gzbin0 -> 2917 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_680.ppd.gzbin0 -> 2915 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_6800.ppd.gzbin0 -> 4628 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_682.ppd.gzbin0 -> 2915 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_690.ppd.gzbin0 -> 3016 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_690c.ppd.gzbin0 -> 3020 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_692.ppd.gzbin0 -> 3018 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_693.ppd.gzbin0 -> 3013 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_694.ppd.gzbin0 -> 3013 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_6940_series.ppd.gzbin0 -> 4621 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_695.ppd.gzbin0 -> 3018 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_697.ppd.gzbin0 -> 3013 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_6980_series.ppd.gzbin0 -> 4635 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_810c.ppd.gzbin0 -> 3021 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_812c.ppd.gzbin0 -> 3021 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_815c.ppd.gzbin0 -> 3021 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_816c.ppd.gzbin0 -> 3022 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_825c.ppd.gzbin0 -> 2932 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_830c.ppd.gzbin0 -> 3021 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_832c.ppd.gzbin0 -> 3021 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_840c.ppd.gzbin0 -> 3021 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_841c.ppd.gzbin0 -> 3021 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_842c.ppd.gzbin0 -> 3021 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_843c.ppd.gzbin0 -> 3026 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_845c.ppd.gzbin0 -> 2932 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_850c.ppd.gzbin0 -> 2860 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_855c.ppd.gzbin0 -> 2865 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_870c.ppd.gzbin0 -> 2869 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_880c.ppd.gzbin0 -> 3021 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_882c.ppd.gzbin0 -> 3021 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_890c.ppd.gzbin0 -> 2904 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_895c.ppd.gzbin0 -> 3031 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_916c.ppd.gzbin0 -> 3924 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_920c.ppd.gzbin0 -> 3937 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_9300.ppd.gzbin0 -> 4299 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_930c.ppd.gzbin0 -> 3928 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_932c.ppd.gzbin0 -> 3924 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_933c.ppd.gzbin0 -> 3924 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_934c.ppd.gzbin0 -> 3924 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_935c.ppd.gzbin0 -> 3924 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_940c.ppd.gzbin0 -> 3937 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_948c.ppd.gzbin0 -> 3924 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_950c.ppd.gzbin0 -> 3924 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_952c.ppd.gzbin0 -> 3924 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_955c.ppd.gzbin0 -> 3935 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_957c.ppd.gzbin0 -> 3924 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_959c.ppd.gzbin0 -> 3924 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_9600.ppd.gzbin0 -> 4985 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_960c.ppd.gzbin0 -> 3966 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_970c.ppd.gzbin0 -> 3933 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_975c.ppd.gzbin0 -> 3933 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_9800.ppd.gzbin0 -> 4993 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_980c.ppd.gzbin0 -> 3962 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_990c.ppd.gzbin0 -> 3970 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_995c.ppd.gzbin0 -> 3960 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_d1300_series.ppd.gzbin0 -> 3372 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_d1400_series.ppd.gzbin0 -> 3380 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_d1500_series.ppd.gzbin0 -> 3374 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_d1600_series.ppd.gzbin0 -> 2891 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_d2300_series.ppd.gzbin0 -> 3465 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_d2400_series.ppd.gzbin0 -> 3471 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_d2500_series.ppd.gzbin0 -> 4635 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_d2600_series.ppd.gzbin0 -> 4228 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_d4100_series.ppd.gzbin0 -> 3801 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_d4200_series.ppd.gzbin0 -> 3797 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_d4300_series.ppd.gzbin0 -> 3792 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_d5500_series.ppd.gzbin0 -> 4114 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_d730.ppd.gzbin0 -> 4595 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_f2100_series.ppd.gzbin0 -> 3389 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_f2200_series.ppd.gzbin0 -> 3403 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_f2400_series.ppd.gzbin0 -> 2831 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_f300_series.ppd.gzbin0 -> 3500 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_f4100_series.ppd.gzbin0 -> 3490 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_f4200_series.ppd.gzbin0 -> 4679 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_f4210_series.ppd.gzbin0 -> 4630 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_f4213_series.ppd.gzbin0 -> 4629 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_f4400_series.ppd.gzbin0 -> 4138 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_f4500_series.ppd.gzbin0 -> 4110 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_f735.ppd.gzbin0 -> 4610 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_ink_adv_2010_k010.ppd.gzbin0 -> 2979 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_ink_adv_2060_k110.ppd.gzbin0 -> 2981 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_ink_advant_k109a-z.ppd.gzbin0 -> 4234 bytes
-rw-r--r--ppd/hpcups/hp-deskjet_ink_advant_k209a-z.ppd.gzbin0 -> 4648 bytes
-rw-r--r--ppd/hpcups/hp-dj350.ppd.gzbin0 -> 2057 bytes
-rw-r--r--ppd/hpcups/hp-dj450.ppd.gzbin0 -> 3964 bytes
-rw-r--r--ppd/hpcups/hp-envy_100_d410_series.ppd.gzbin0 -> 4941 bytes
-rw-r--r--ppd/hpcups/hp-envy_110_series.ppd.gzbin0 -> 4938 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_1000.ppd.gzbin0 -> 3102 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_1005_series.ppd.gzbin0 -> 3121 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_1010.ppd.gzbin0 -> 2997 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_1012.ppd.gzbin0 -> 3001 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_1015.ppd.gzbin0 -> 3111 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_1018.ppd.gzbin0 -> 3103 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_1020.ppd.gzbin0 -> 3107 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_1022-pcl3.ppd.gzbin0 -> 3142 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_1022-zjs.ppd.gzbin0 -> 3112 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_1022n-pcl3.ppd.gzbin0 -> 3149 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_1022n-zjs.ppd.gzbin0 -> 3119 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_1022nw-pcl3.ppd.gzbin0 -> 3146 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_1022nw-zjs.ppd.gzbin0 -> 3116 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_1100.ppd.gzbin0 -> 3120 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_1100a.ppd.gzbin0 -> 3125 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_1100xi.ppd.gzbin0 -> 3126 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_1150.ppd.gzbin0 -> 3111 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_1160.ppd.gzbin0 -> 3115 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_1160_series.ppd.gzbin0 -> 3130 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_1200-pcl3.ppd.gzbin0 -> 3128 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_1200n.ppd.gzbin0 -> 3112 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_1220-pcl3.ppd.gzbin0 -> 3129 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_1220se.ppd.gzbin0 -> 3122 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_1300-pcl3.ppd.gzbin0 -> 3127 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_1300n-pcl3.ppd.gzbin0 -> 3124 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_1300xi-pcl3.ppd.gzbin0 -> 3126 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_1320.ppd.gzbin0 -> 3114 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_1320_series-pcl3.ppd.gzbin0 -> 3142 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_1320n.ppd.gzbin0 -> 3112 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_1320nw.ppd.gzbin0 -> 3114 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_1320tn.ppd.gzbin0 -> 3115 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_2100.ppd.gzbin0 -> 3128 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_2100_series-pcl3.ppd.gzbin0 -> 3141 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_2200-pcl3.ppd.gzbin0 -> 3140 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_2200_series.ppd.gzbin0 -> 3129 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_2300-pcl3.ppd.gzbin0 -> 3140 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_2300_series.ppd.gzbin0 -> 3130 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_2410-pcl3.ppd.gzbin0 -> 3122 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_2420-pcl3.ppd.gzbin0 -> 3132 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_2430-pcl3.ppd.gzbin0 -> 3138 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_3015-pcl3.ppd.gzbin0 -> 3129 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_3020-pcl3.ppd.gzbin0 -> 3129 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_3030-pcl3.ppd.gzbin0 -> 3129 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_3050-pcl3.ppd.gzbin0 -> 3134 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_3052-pcl3.ppd.gzbin0 -> 3129 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_3055.ppd.gzbin0 -> 3118 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_3100.ppd.gzbin0 -> 3127 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_3150.ppd.gzbin0 -> 3128 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_3200.ppd.gzbin0 -> 3118 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_3200m-pcl3.ppd.gzbin0 -> 3131 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_3200se.ppd.gzbin0 -> 3122 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_3300_3310_3320-pcl3.ppd.gzbin0 -> 3182 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_3330.ppd.gzbin0 -> 3118 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_3380-pcl3.ppd.gzbin0 -> 3129 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_3390-pcl3.ppd.gzbin0 -> 3129 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_3392.ppd.gzbin0 -> 3118 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_4000_series-pcl3.ppd.gzbin0 -> 3156 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_4050_series-pcl3.ppd.gzbin0 -> 3157 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_4100_mfp-pcl3.ppd.gzbin0 -> 3147 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_4100_series-pcl3.ppd.gzbin0 -> 3155 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_4150_series.ppd.gzbin0 -> 3130 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_4200-pcl3.ppd.gzbin0 -> 3150 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_4240-pcl3.ppd.gzbin0 -> 3126 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_4250-pcl3.ppd.gzbin0 -> 3138 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_4300-pcl3.ppd.gzbin0 -> 3142 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_4345_mfp-pcl3.ppd.gzbin0 -> 3155 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_4350-pcl3.ppd.gzbin0 -> 3138 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_4_plus-pcl3.ppd.gzbin0 -> 3133 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_4l.ppd.gzbin0 -> 3141 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_4ml.ppd.gzbin0 -> 3132 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_4mp-pcl3.ppd.gzbin0 -> 3121 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_4si-pcl3.ppd.gzbin0 -> 3125 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_4v-pcl3.ppd.gzbin0 -> 3119 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_5000.ppd.gzbin0 -> 3376 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_5000_series-pcl3.ppd.gzbin0 -> 3141 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_5100_series-pcl3.ppd.gzbin0 -> 3408 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_5200-pcl3.ppd.gzbin0 -> 3383 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_5200l-pcl3.ppd.gzbin0 -> 3373 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_5200lx.ppd.gzbin0 -> 3114 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_5l.ppd.gzbin0 -> 3119 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_5mp-pcl3.ppd.gzbin0 -> 3121 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_5p.ppd.gzbin0 -> 3107 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_5si-pcl3.ppd.gzbin0 -> 3383 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_5si_mopier-pcl3.ppd.gzbin0 -> 3393 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_6l.ppd.gzbin0 -> 3127 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_6mp-pcl3.ppd.gzbin0 -> 3130 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_6p.ppd.gzbin0 -> 3107 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_8000.ppd.gzbin0 -> 3368 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_8000_series-pcl3.ppd.gzbin0 -> 3141 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_8100_mfp.ppd.gzbin0 -> 3131 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_8100_series-pcl3.ppd.gzbin0 -> 3399 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_8150_mfp.ppd.gzbin0 -> 3131 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_8150_series-pcl3.ppd.gzbin0 -> 3403 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_9000_mfp-pcl3.ppd.gzbin0 -> 3397 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_9000_series-pcl3.ppd.gzbin0 -> 3408 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_9040-pcl3.ppd.gzbin0 -> 3379 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_9040_mfp-pcl3.ppd.gzbin0 -> 3403 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_9050-pcl3.ppd.gzbin0 -> 3379 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_9050_mfp-pcl3.ppd.gzbin0 -> 3394 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_9055mfp-pcl3.ppd.gzbin0 -> 3386 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_9065mfp-pcl3.ppd.gzbin0 -> 3386 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_cm1411fn-pcl3.ppd.gzbin0 -> 3175 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_cm1412fn-pcl3.ppd.gzbin0 -> 3175 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_cm1413fn-pcl3.ppd.gzbin0 -> 3175 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_cm1415fn-pcl3.ppd.gzbin0 -> 3175 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_cm1415fnw-pcl3.ppd.gzbin0 -> 3178 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_cm1416fnw-pcl3.ppd.gzbin0 -> 3178 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_cm1417fnw-pcl3.ppd.gzbin0 -> 3176 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_cm1418fnw-pcl3.ppd.gzbin0 -> 3178 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_cp1025.ppd.gzbin0 -> 2912 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_cp1025nw.ppd.gzbin0 -> 2917 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_cp_1025.ppd.gzbin0 -> 2919 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_cp_1025nw.ppd.gzbin0 -> 2923 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_m1005.ppd.gzbin0 -> 3047 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_m1120_mfp.ppd.gzbin0 -> 3129 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_m1120n_mfp.ppd.gzbin0 -> 3131 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_m1319f_mfp.ppd.gzbin0 -> 3130 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_m1522nf_mfp-pcl3.ppd.gzbin0 -> 3150 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_m1536dnf_mfp-pcl3.ppd.gzbin0 -> 3142 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_m1537dnf_mfp-pcl3.ppd.gzbin0 -> 3142 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_m1538dnf_mfp-pcl3.ppd.gzbin0 -> 3142 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_m1539dnf_mfp-pcl3.ppd.gzbin0 -> 3142 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_m2727_mfp-pcl3.ppd.gzbin0 -> 3145 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_m3027_mfp-pcl3.ppd.gzbin0 -> 3150 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_m3035_mfp-pcl3.ppd.gzbin0 -> 3401 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_m4345_mfp-pcl3.ppd.gzbin0 -> 3158 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_m4349_mfp-pcl3.ppd.gzbin0 -> 3136 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_m5025_mfp-pcl3.ppd.gzbin0 -> 3396 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_m5035_mfp-pcl3.ppd.gzbin0 -> 3404 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_m5039_mfp-pcl3.ppd.gzbin0 -> 3396 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_m9040_mfp-pcl3.ppd.gzbin0 -> 3145 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_m9050_mfp-pcl3.ppd.gzbin0 -> 3150 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_m9059_mfp-pcl3.ppd.gzbin0 -> 3136 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_p1005.ppd.gzbin0 -> 3042 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_p1006.ppd.gzbin0 -> 3044 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_p1007.ppd.gzbin0 -> 3044 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_p1008.ppd.gzbin0 -> 3044 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_p1009.ppd.gzbin0 -> 3044 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_p1505.ppd.gzbin0 -> 3041 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_p1505n-pcl3.ppd.gzbin0 -> 3146 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_p1505n-zxs.ppd.gzbin0 -> 3053 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_p2014-pcl3.ppd.gzbin0 -> 3144 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_p2014-zxs.ppd.gzbin0 -> 3051 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_p2014n-pcl3.ppd.gzbin0 -> 3146 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_p2014n-zxs.ppd.gzbin0 -> 3053 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_p2015_series-pcl3.ppd.gzbin0 -> 3144 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_p2015d_series.ppd.gzbin0 -> 3133 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_p2015dn_series.ppd.gzbin0 -> 3136 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_p2015n_series.ppd.gzbin0 -> 3134 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_p2015x_series.ppd.gzbin0 -> 3134 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_p2035-pcl3.ppd.gzbin0 -> 3144 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_p2035-zjs.ppd.gzbin0 -> 3115 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_p2035n-pcl3.ppd.gzbin0 -> 3146 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_p2035n-zjs.ppd.gzbin0 -> 3117 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_p2055-pcl3.ppd.gzbin0 -> 3124 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_p2055d-pcl3.ppd.gzbin0 -> 3125 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_p2055dn-pcl3.ppd.gzbin0 -> 3128 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_p2055x-pcl3.ppd.gzbin0 -> 3126 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_p3004-pcl3.ppd.gzbin0 -> 3124 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_p3005-pcl3.ppd.gzbin0 -> 3141 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_p3010_series-pcl3.ppd.gzbin0 -> 3148 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_p4014.ppd.gzbin0 -> 3112 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_p4014dn.ppd.gzbin0 -> 3117 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_p4014n.ppd.gzbin0 -> 3115 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_p4015.ppd.gzbin0 -> 3112 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_p4015dn.ppd.gzbin0 -> 3117 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_p4015n.ppd.gzbin0 -> 3115 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_p4015tn.ppd.gzbin0 -> 3116 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_p4015x.ppd.gzbin0 -> 3115 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_p4515.ppd.gzbin0 -> 3112 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_p4515n.ppd.gzbin0 -> 3115 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_p4515tn.ppd.gzbin0 -> 3116 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_p4515x.ppd.gzbin0 -> 3115 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_p4515xm.ppd.gzbin0 -> 3117 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_professional_m1132_mfp.ppd.gzbin0 -> 2510 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_professional_m1136_mfp.ppd.gzbin0 -> 2504 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_professional_m1212nf_mfp.ppd.gzbin0 -> 2509 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_professional_m1213nf_mfp.ppd.gzbin0 -> 2509 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_professional_m1214nfh_mfp.ppd.gzbin0 -> 2511 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_professional_m1216nfh_mfp.ppd.gzbin0 -> 2500 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_professional_m1217nfw_mfp.ppd.gzbin0 -> 2511 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_professional_m1219nf_mfp.ppd.gzbin0 -> 2498 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_professional_p1102.ppd.gzbin0 -> 2482 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_professional_p1102w.ppd.gzbin0 -> 2480 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_professional_p1106.ppd.gzbin0 -> 2479 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_professional_p1108.ppd.gzbin0 -> 2477 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_professional_p1566.ppd.gzbin0 -> 2476 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_professional_p1606dn.ppd.gzbin0 -> 3045 bytes
-rw-r--r--ppd/hpcups/hp-laserjet_professional_p_1102w.ppd.gzbin0 -> 2491 bytes
-rw-r--r--ppd/hpcups/hp-mopier_240-pcl3.ppd.gzbin0 -> 3367 bytes
-rw-r--r--ppd/hpcups/hp-mopier_320-pcl3.ppd.gzbin0 -> 3367 bytes
-rw-r--r--ppd/hpcups/hp-officejet.ppd.gzbin0 -> 2884 bytes
-rw-r--r--ppd/hpcups/hp-officejet_100_mobile_l411.ppd.gzbin0 -> 3612 bytes
-rw-r--r--ppd/hpcups/hp-officejet_4000_k210.ppd.gzbin0 -> 4203 bytes
-rw-r--r--ppd/hpcups/hp-officejet_4100_series.ppd.gzbin0 -> 3375 bytes
-rw-r--r--ppd/hpcups/hp-officejet_4105.ppd.gzbin0 -> 3343 bytes
-rw-r--r--ppd/hpcups/hp-officejet_4115_series.ppd.gzbin0 -> 3363 bytes
-rw-r--r--ppd/hpcups/hp-officejet_4200_series.ppd.gzbin0 -> 3481 bytes
-rw-r--r--ppd/hpcups/hp-officejet_4255.ppd.gzbin0 -> 3455 bytes
-rw-r--r--ppd/hpcups/hp-officejet_4300_series.ppd.gzbin0 -> 3411 bytes
-rw-r--r--ppd/hpcups/hp-officejet_4400_k410.ppd.gzbin0 -> 4103 bytes
-rw-r--r--ppd/hpcups/hp-officejet_4500_g510a-f.ppd.gzbin0 -> 4132 bytes
-rw-r--r--ppd/hpcups/hp-officejet_4500_g510g-m.ppd.gzbin0 -> 4119 bytes
-rw-r--r--ppd/hpcups/hp-officejet_4500_g510n-z.ppd.gzbin0 -> 3537 bytes
-rw-r--r--ppd/hpcups/hp-officejet_4500_k710.ppd.gzbin0 -> 4107 bytes
-rw-r--r--ppd/hpcups/hp-officejet_5100_series.ppd.gzbin0 -> 3970 bytes
-rw-r--r--ppd/hpcups/hp-officejet_5105.ppd.gzbin0 -> 3936 bytes
-rw-r--r--ppd/hpcups/hp-officejet_5110.ppd.gzbin0 -> 3941 bytes
-rw-r--r--ppd/hpcups/hp-officejet_5110v.ppd.gzbin0 -> 3938 bytes
-rw-r--r--ppd/hpcups/hp-officejet_5500_series.ppd.gzbin0 -> 3479 bytes
-rw-r--r--ppd/hpcups/hp-officejet_5600_series.ppd.gzbin0 -> 3494 bytes
-rw-r--r--ppd/hpcups/hp-officejet_6000_e609a.ppd.gzbin0 -> 3977 bytes
-rw-r--r--ppd/hpcups/hp-officejet_6000_e609n.ppd.gzbin0 -> 4924 bytes
-rw-r--r--ppd/hpcups/hp-officejet_6100.ppd.gzbin0 -> 3922 bytes
-rw-r--r--ppd/hpcups/hp-officejet_6100_series.ppd.gzbin0 -> 4643 bytes
-rw-r--r--ppd/hpcups/hp-officejet_6150_series.ppd.gzbin0 -> 4628 bytes
-rw-r--r--ppd/hpcups/hp-officejet_6200_series.ppd.gzbin0 -> 4657 bytes
-rw-r--r--ppd/hpcups/hp-officejet_6300_series.ppd.gzbin0 -> 4665 bytes
-rw-r--r--ppd/hpcups/hp-officejet_6500_e709a.ppd.gzbin0 -> 3989 bytes
-rw-r--r--ppd/hpcups/hp-officejet_6500_e709n.ppd.gzbin0 -> 4951 bytes
-rw-r--r--ppd/hpcups/hp-officejet_6500_e710a-f.ppd.gzbin0 -> 3976 bytes
-rw-r--r--ppd/hpcups/hp-officejet_6500_e710n-z.ppd.gzbin0 -> 4661 bytes
-rw-r--r--ppd/hpcups/hp-officejet_6600.ppd.gzbin0 -> 3933 bytes
-rw-r--r--ppd/hpcups/hp-officejet_6700.ppd.gzbin0 -> 4658 bytes
-rw-r--r--ppd/hpcups/hp-officejet_7000_e809a.ppd.gzbin0 -> 4429 bytes
-rw-r--r--ppd/hpcups/hp-officejet_7000_e809a_series.ppd.gzbin0 -> 4447 bytes
-rw-r--r--ppd/hpcups/hp-officejet_7100_series.ppd.gzbin0 -> 4014 bytes
-rw-r--r--ppd/hpcups/hp-officejet_7200_series.ppd.gzbin0 -> 4652 bytes
-rw-r--r--ppd/hpcups/hp-officejet_7300_series.ppd.gzbin0 -> 4639 bytes
-rw-r--r--ppd/hpcups/hp-officejet_7400_series.ppd.gzbin0 -> 4642 bytes
-rw-r--r--ppd/hpcups/hp-officejet_7500_e910.ppd.gzbin0 -> 4694 bytes
-rw-r--r--ppd/hpcups/hp-officejet_9100_series-pcl3.ppd.gzbin0 -> 3199 bytes
-rw-r--r--ppd/hpcups/hp-officejet_d_series.ppd.gzbin0 -> 4002 bytes
-rw-r--r--ppd/hpcups/hp-officejet_g55.ppd.gzbin0 -> 3934 bytes
-rw-r--r--ppd/hpcups/hp-officejet_g55xi.ppd.gzbin0 -> 3938 bytes
-rw-r--r--ppd/hpcups/hp-officejet_g85.ppd.gzbin0 -> 3934 bytes
-rw-r--r--ppd/hpcups/hp-officejet_g85xi.ppd.gzbin0 -> 3938 bytes
-rw-r--r--ppd/hpcups/hp-officejet_g95.ppd.gzbin0 -> 3934 bytes
-rw-r--r--ppd/hpcups/hp-officejet_h470.ppd.gzbin0 -> 4156 bytes
-rw-r--r--ppd/hpcups/hp-officejet_j3500_series.ppd.gzbin0 -> 3463 bytes
-rw-r--r--ppd/hpcups/hp-officejet_j3600_series.ppd.gzbin0 -> 3480 bytes
-rw-r--r--ppd/hpcups/hp-officejet_j4500_series.ppd.gzbin0 -> 4661 bytes
-rw-r--r--ppd/hpcups/hp-officejet_j4660_series.ppd.gzbin0 -> 4645 bytes
-rw-r--r--ppd/hpcups/hp-officejet_j4680_series.ppd.gzbin0 -> 4648 bytes
-rw-r--r--ppd/hpcups/hp-officejet_j5500_series.ppd.gzbin0 -> 3486 bytes
-rw-r--r--ppd/hpcups/hp-officejet_j5700_series.ppd.gzbin0 -> 4668 bytes
-rw-r--r--ppd/hpcups/hp-officejet_j6400_series.ppd.gzbin0 -> 4659 bytes
-rw-r--r--ppd/hpcups/hp-officejet_k60.ppd.gzbin0 -> 3934 bytes
-rw-r--r--ppd/hpcups/hp-officejet_k60xi.ppd.gzbin0 -> 3939 bytes
-rw-r--r--ppd/hpcups/hp-officejet_k7100.ppd.gzbin0 -> 4988 bytes
-rw-r--r--ppd/hpcups/hp-officejet_k80.ppd.gzbin0 -> 3934 bytes
-rw-r--r--ppd/hpcups/hp-officejet_k80xi.ppd.gzbin0 -> 3939 bytes
-rw-r--r--ppd/hpcups/hp-officejet_lx.ppd.gzbin0 -> 2897 bytes
-rw-r--r--ppd/hpcups/hp-officejet_pro_1150c.ppd.gzbin0 -> 2886 bytes
-rw-r--r--ppd/hpcups/hp-officejet_pro_1170c_series.ppd.gzbin0 -> 2966 bytes
-rw-r--r--ppd/hpcups/hp-officejet_pro_8000_a809.ppd.gzbin0 -> 4632 bytes
-rw-r--r--ppd/hpcups/hp-officejet_pro_8100.ppd.gzbin0 -> 4381 bytes
-rw-r--r--ppd/hpcups/hp-officejet_pro_8500_a909a.ppd.gzbin0 -> 4630 bytes
-rw-r--r--ppd/hpcups/hp-officejet_pro_8500_a909g.ppd.gzbin0 -> 4637 bytes
-rw-r--r--ppd/hpcups/hp-officejet_pro_8500_a909n.ppd.gzbin0 -> 4636 bytes
-rw-r--r--ppd/hpcups/hp-officejet_pro_8500_a910.ppd.gzbin0 -> 4645 bytes
-rw-r--r--ppd/hpcups/hp-officejet_pro_8600.ppd.gzbin0 -> 4389 bytes
-rw-r--r--ppd/hpcups/hp-officejet_pro_k5300.ppd.gzbin0 -> 4164 bytes
-rw-r--r--ppd/hpcups/hp-officejet_pro_k5400.ppd.gzbin0 -> 4176 bytes
-rw-r--r--ppd/hpcups/hp-officejet_pro_k550.ppd.gzbin0 -> 4176 bytes
-rw-r--r--ppd/hpcups/hp-officejet_pro_k850.ppd.gzbin0 -> 4537 bytes
-rw-r--r--ppd/hpcups/hp-officejet_pro_k8600.ppd.gzbin0 -> 4542 bytes
-rw-r--r--ppd/hpcups/hp-officejet_pro_l7300.ppd.gzbin0 -> 4180 bytes
-rw-r--r--ppd/hpcups/hp-officejet_pro_l7400.ppd.gzbin0 -> 4172 bytes
-rw-r--r--ppd/hpcups/hp-officejet_pro_l7500.ppd.gzbin0 -> 4190 bytes
-rw-r--r--ppd/hpcups/hp-officejet_pro_l7600.ppd.gzbin0 -> 4187 bytes
-rw-r--r--ppd/hpcups/hp-officejet_pro_l7700.ppd.gzbin0 -> 4188 bytes
-rw-r--r--ppd/hpcups/hp-officejet_r40.ppd.gzbin0 -> 3029 bytes
-rw-r--r--ppd/hpcups/hp-officejet_r40xi.ppd.gzbin0 -> 3035 bytes
-rw-r--r--ppd/hpcups/hp-officejet_r45.ppd.gzbin0 -> 3030 bytes
-rw-r--r--ppd/hpcups/hp-officejet_r60.ppd.gzbin0 -> 3030 bytes
-rw-r--r--ppd/hpcups/hp-officejet_r65.ppd.gzbin0 -> 3030 bytes
-rw-r--r--ppd/hpcups/hp-officejet_r80.ppd.gzbin0 -> 3030 bytes
-rw-r--r--ppd/hpcups/hp-officejet_r80xi.ppd.gzbin0 -> 3035 bytes
-rw-r--r--ppd/hpcups/hp-officejet_series_300.ppd.gzbin0 -> 2927 bytes
-rw-r--r--ppd/hpcups/hp-officejet_series_310.ppd.gzbin0 -> 2928 bytes
-rw-r--r--ppd/hpcups/hp-officejet_series_320.ppd.gzbin0 -> 2929 bytes
-rw-r--r--ppd/hpcups/hp-officejet_series_330.ppd.gzbin0 -> 2917 bytes
-rw-r--r--ppd/hpcups/hp-officejet_series_350.ppd.gzbin0 -> 2917 bytes
-rw-r--r--ppd/hpcups/hp-officejet_series_520.ppd.gzbin0 -> 2944 bytes
-rw-r--r--ppd/hpcups/hp-officejet_series_570.ppd.gzbin0 -> 2944 bytes
-rw-r--r--ppd/hpcups/hp-officejet_series_580.ppd.gzbin0 -> 2944 bytes
-rw-r--r--ppd/hpcups/hp-officejet_series_590.ppd.gzbin0 -> 2944 bytes
-rw-r--r--ppd/hpcups/hp-officejet_series_600.ppd.gzbin0 -> 2943 bytes
-rw-r--r--ppd/hpcups/hp-officejet_series_610.ppd.gzbin0 -> 2944 bytes
-rw-r--r--ppd/hpcups/hp-officejet_series_630.ppd.gzbin0 -> 2948 bytes
-rw-r--r--ppd/hpcups/hp-officejet_series_700.ppd.gzbin0 -> 3044 bytes
-rw-r--r--ppd/hpcups/hp-officejet_series_710.ppd.gzbin0 -> 3043 bytes
-rw-r--r--ppd/hpcups/hp-officejet_series_720.ppd.gzbin0 -> 3043 bytes
-rw-r--r--ppd/hpcups/hp-officejet_series_725.ppd.gzbin0 -> 3044 bytes
-rw-r--r--ppd/hpcups/hp-officejet_t_series.ppd.gzbin0 -> 3059 bytes
-rw-r--r--ppd/hpcups/hp-officejet_v30.ppd.gzbin0 -> 3933 bytes
-rw-r--r--ppd/hpcups/hp-officejet_v40.ppd.gzbin0 -> 3938 bytes
-rw-r--r--ppd/hpcups/hp-officejet_v40xi.ppd.gzbin0 -> 3938 bytes
-rw-r--r--ppd/hpcups/hp-officejet_v45.ppd.gzbin0 -> 3934 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_100.ppd.gzbin0 -> 1951 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_1115.ppd.gzbin0 -> 3960 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_1215.ppd.gzbin0 -> 3965 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_1218.ppd.gzbin0 -> 3965 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_130.ppd.gzbin0 -> 1960 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_1315.ppd.gzbin0 -> 3960 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_140_series.ppd.gzbin0 -> 1990 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_230.ppd.gzbin0 -> 1960 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_240_series.ppd.gzbin0 -> 1987 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_2570_series.ppd.gzbin0 -> 4658 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_2600_series.ppd.gzbin0 -> 4654 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_2700_series.ppd.gzbin0 -> 4640 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_3100_series.ppd.gzbin0 -> 4640 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_3200_series.ppd.gzbin0 -> 4654 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_320_series.ppd.gzbin0 -> 2051 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_3300_series.ppd.gzbin0 -> 4647 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_330_series.ppd.gzbin0 -> 2053 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_370_series.ppd.gzbin0 -> 2065 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_380_series.ppd.gzbin0 -> 2044 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_420_series.ppd.gzbin0 -> 2061 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_470_series.ppd.gzbin0 -> 2480 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_5510_series.ppd.gzbin0 -> 4211 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_5510d_series.ppd.gzbin0 -> 4797 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_6510_series.ppd.gzbin0 -> 4798 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_7150.ppd.gzbin0 -> 4612 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_7200_series.ppd.gzbin0 -> 4635 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_7345.ppd.gzbin0 -> 4603 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_7350.ppd.gzbin0 -> 4612 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_7400_series.ppd.gzbin0 -> 4640 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_7510_series.ppd.gzbin0 -> 4838 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_7550.ppd.gzbin0 -> 4611 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_7600_series.ppd.gzbin0 -> 4631 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_7700_series.ppd.gzbin0 -> 4647 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_7800_series.ppd.gzbin0 -> 4643 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_7900_series.ppd.gzbin0 -> 4637 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_8000_series.ppd.gzbin0 -> 4646 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_8100_series.ppd.gzbin0 -> 4640 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_8200_series.ppd.gzbin0 -> 4643 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_8400_series.ppd.gzbin0 -> 4644 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_8700_series.ppd.gzbin0 -> 4972 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_a310_series.ppd.gzbin0 -> 2048 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_a320_series.ppd.gzbin0 -> 2041 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_a430_series.ppd.gzbin0 -> 2051 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_a440_series.ppd.gzbin0 -> 2043 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_a510_series.ppd.gzbin0 -> 2044 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_a520_series.ppd.gzbin0 -> 2054 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_a530_series.ppd.gzbin0 -> 1802 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_a610_series.ppd.gzbin0 -> 2485 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_a620_series.ppd.gzbin0 -> 2485 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_a630_series.ppd.gzbin0 -> 1799 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_a640_series.ppd.gzbin0 -> 1791 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_a710_series.ppd.gzbin0 -> 2480 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_a820_series.ppd.gzbin0 -> 2480 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_b010_series.ppd.gzbin0 -> 3694 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_b109a-m.ppd.gzbin0 -> 3694 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_b109a_series.ppd.gzbin0 -> 3707 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_b110_series.ppd.gzbin0 -> 3701 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_b8500_series.ppd.gzbin0 -> 5172 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_c309a_series.ppd.gzbin0 -> 5074 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_c3100_series.ppd.gzbin0 -> 4680 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_c4100_series.ppd.gzbin0 -> 4674 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_c4200_series.ppd.gzbin0 -> 4682 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_c4340_series.ppd.gzbin0 -> 4649 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_c4380_series.ppd.gzbin0 -> 4646 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_c4400_series.ppd.gzbin0 -> 4687 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_c4500_series.ppd.gzbin0 -> 4673 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_c4600_series.ppd.gzbin0 -> 4142 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_c4700_series.ppd.gzbin0 -> 4143 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_c5100_series.ppd.gzbin0 -> 4666 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_c5200_series.ppd.gzbin0 -> 4666 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_c5300_series.ppd.gzbin0 -> 3955 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_c5500_series.ppd.gzbin0 -> 4644 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_c6100_series.ppd.gzbin0 -> 4663 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_c6200_series.ppd.gzbin0 -> 4674 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_c6300_series.ppd.gzbin0 -> 3957 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_c7100_series.ppd.gzbin0 -> 4659 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_c7200_series.ppd.gzbin0 -> 4649 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_c8100_series.ppd.gzbin0 -> 4646 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_d110_series.ppd.gzbin0 -> 4101 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_d5060_series.ppd.gzbin0 -> 4634 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_d5100_series.ppd.gzbin0 -> 4644 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_d5300_series.ppd.gzbin0 -> 4637 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_d5400_series.ppd.gzbin0 -> 4633 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_d6100_series.ppd.gzbin0 -> 4633 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_d7100_series.ppd.gzbin0 -> 4640 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_d7200_series.ppd.gzbin0 -> 4640 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_d7300_series.ppd.gzbin0 -> 4640 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_d7400_series.ppd.gzbin0 -> 4633 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_d7500_series.ppd.gzbin0 -> 3928 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_estn_c510_series.ppd.gzbin0 -> 4686 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_ink_adv_k510.ppd.gzbin0 -> 4109 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_p1000.ppd.gzbin0 -> 3937 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_p1100.ppd.gzbin0 -> 3934 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_plus_b209a-m.ppd.gzbin0 -> 3706 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_plus_b210_series.ppd.gzbin0 -> 3696 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_prem-web_c309n-s.ppd.gzbin0 -> 4902 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_prem_c310_series.ppd.gzbin0 -> 4685 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_prem_c410_series.ppd.gzbin0 -> 4685 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_premium_c309g-m.ppd.gzbin0 -> 4895 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_pro_b8300_series.ppd.gzbin0 -> 5205 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_pro_b8800_series.ppd.gzbin0 -> 5193 bytes
-rw-r--r--ppd/hpcups/hp-photosmart_wireless_b109n-z.ppd.gzbin0 -> 3718 bytes
-rw-r--r--ppd/hpcups/hp-printer_scanner_copier_300.ppd.gzbin0 -> 2945 bytes
-rw-r--r--ppd/hpcups/hp-psc_1000_series.ppd.gzbin0 -> 3364 bytes
-rw-r--r--ppd/hpcups/hp-psc_1100_series.ppd.gzbin0 -> 3365 bytes
-rw-r--r--ppd/hpcups/hp-psc_1200_series.ppd.gzbin0 -> 3389 bytes
-rw-r--r--ppd/hpcups/hp-psc_1300_series.ppd.gzbin0 -> 3473 bytes
-rw-r--r--ppd/hpcups/hp-psc_1310_series.ppd.gzbin0 -> 3480 bytes
-rw-r--r--ppd/hpcups/hp-psc_1358_series.ppd.gzbin0 -> 3472 bytes
-rw-r--r--ppd/hpcups/hp-psc_1400_series.ppd.gzbin0 -> 3484 bytes
-rw-r--r--ppd/hpcups/hp-psc_1500_series.ppd.gzbin0 -> 4631 bytes
-rw-r--r--ppd/hpcups/hp-psc_1510_series.ppd.gzbin0 -> 4648 bytes
-rw-r--r--ppd/hpcups/hp-psc_1600_series.ppd.gzbin0 -> 4649 bytes
-rw-r--r--ppd/hpcups/hp-psc_2100_series.ppd.gzbin0 -> 3996 bytes
-rw-r--r--ppd/hpcups/hp-psc_2150_series.ppd.gzbin0 -> 3976 bytes
-rw-r--r--ppd/hpcups/hp-psc_2170_series.ppd.gzbin0 -> 3994 bytes
-rw-r--r--ppd/hpcups/hp-psc_2200_series.ppd.gzbin0 -> 4619 bytes
-rw-r--r--ppd/hpcups/hp-psc_2210_series.ppd.gzbin0 -> 4629 bytes
-rw-r--r--ppd/hpcups/hp-psc_2300_series.ppd.gzbin0 -> 4624 bytes
-rw-r--r--ppd/hpcups/hp-psc_2350_series.ppd.gzbin0 -> 4650 bytes
-rw-r--r--ppd/hpcups/hp-psc_2400_series.ppd.gzbin0 -> 4647 bytes
-rw-r--r--ppd/hpcups/hp-psc_2500_series.ppd.gzbin0 -> 4637 bytes
-rw-r--r--ppd/hpcups/hp-psc_500.ppd.gzbin0 -> 3024 bytes
-rw-r--r--ppd/hpcups/hp-psc_720.ppd.gzbin0 -> 3924 bytes
-rw-r--r--ppd/hpcups/hp-psc_750.ppd.gzbin0 -> 3923 bytes
-rw-r--r--ppd/hpcups/hp-psc_750xi.ppd.gzbin0 -> 3928 bytes
-rw-r--r--ppd/hpcups/hp-psc_760.ppd.gzbin0 -> 3923 bytes
-rw-r--r--ppd/hpcups/hp-psc_780.ppd.gzbin0 -> 3923 bytes
-rw-r--r--ppd/hpcups/hp-psc_780xi.ppd.gzbin0 -> 3928 bytes
-rw-r--r--ppd/hpcups/hp-psc_900_series.ppd.gzbin0 -> 3942 bytes
-rw-r--r--ppd/hpcups/hp-psc_920.ppd.gzbin0 -> 3923 bytes
-rw-r--r--ppd/hpcups/hp-psc_950.ppd.gzbin0 -> 3923 bytes
-rw-r--r--ppd/hpcups/hp-psc_950vr.ppd.gzbin0 -> 3928 bytes
-rw-r--r--ppd/hpcups/hp-psc_950xi.ppd.gzbin0 -> 3928 bytes
-rw-r--r--ppd/hpijs/hp-2000c-hpijs.ppd.gzbin0 -> 3649 bytes
-rw-r--r--ppd/hpijs/hp-2500c-hpijs.ppd.gzbin0 -> 3853 bytes
-rw-r--r--ppd/hpijs/hp-910-hpijs.ppd.gzbin0 -> 3696 bytes
-rw-r--r--ppd/hpijs/hp-915-hpijs.ppd.gzbin0 -> 3709 bytes
-rw-r--r--ppd/hpijs/hp-business_inkjet_1000-hpijs.ppd.gzbin0 -> 4158 bytes
-rw-r--r--ppd/hpijs/hp-business_inkjet_1100-hpijs.ppd.gzbin0 -> 4171 bytes
-rw-r--r--ppd/hpijs/hp-business_inkjet_1200-hpijs.ppd.gzbin0 -> 4175 bytes
-rw-r--r--ppd/hpijs/hp-business_inkjet_2200-hpijs.ppd.gzbin0 -> 3893 bytes
-rw-r--r--ppd/hpijs/hp-business_inkjet_2230-hpijs.ppd.gzbin0 -> 3885 bytes
-rw-r--r--ppd/hpijs/hp-business_inkjet_2250-hpijs-pcl3.ppd.gzbin0 -> 3900 bytes
-rw-r--r--ppd/hpijs/hp-business_inkjet_2280-hpijs-pcl3.ppd.gzbin0 -> 3900 bytes
-rw-r--r--ppd/hpijs/hp-business_inkjet_2300-hpijs-pcl3.ppd.gzbin0 -> 3887 bytes
-rw-r--r--ppd/hpijs/hp-business_inkjet_2600-hpijs-pcl3.ppd.gzbin0 -> 4088 bytes
-rw-r--r--ppd/hpijs/hp-business_inkjet_2800-hpijs-pcl3.ppd.gzbin0 -> 4092 bytes
-rw-r--r--ppd/hpijs/hp-business_inkjet_3000-hpijs-pcl3.ppd.gzbin0 -> 4091 bytes
-rw-r--r--ppd/hpijs/hp-color_inkjet_cp1700-hpijs.ppd.gzbin0 -> 4181 bytes
-rw-r--r--ppd/hpijs/hp-color_inkjet_printer_cp1700-hpijs.ppd.gzbin0 -> 4405 bytes
-rw-r--r--ppd/hpijs/hp-color_laserjet_1600-hpijs.ppd.gzbin0 -> 3283 bytes
-rw-r--r--ppd/hpijs/hp-color_laserjet_2500-hpijs-pcl3.ppd.gzbin0 -> 3872 bytes
-rw-r--r--ppd/hpijs/hp-color_laserjet_2500_series-hpijs.ppd.gzbin0 -> 3897 bytes
-rw-r--r--ppd/hpijs/hp-color_laserjet_2600n-hpijs.ppd.gzbin0 -> 3280 bytes
-rw-r--r--ppd/hpijs/hp-color_laserjet_3000-hpijs-pcl3.ppd.gzbin0 -> 3883 bytes
-rw-r--r--ppd/hpijs/hp-color_laserjet_3500-hpijs.ppd.gzbin0 -> 3493 bytes
-rw-r--r--ppd/hpijs/hp-color_laserjet_3500n-hpijs.ppd.gzbin0 -> 3489 bytes
-rw-r--r--ppd/hpijs/hp-color_laserjet_3550-hpijs.ppd.gzbin0 -> 3489 bytes
-rw-r--r--ppd/hpijs/hp-color_laserjet_3550n-hpijs.ppd.gzbin0 -> 3492 bytes
-rw-r--r--ppd/hpijs/hp-color_laserjet_3600-hpijs.ppd.gzbin0 -> 3495 bytes
-rw-r--r--ppd/hpijs/hp-color_laserjet_3700-hpijs-pcl3.ppd.gzbin0 -> 3873 bytes
-rw-r--r--ppd/hpijs/hp-color_laserjet_3700n-hpijs.ppd.gzbin0 -> 3874 bytes
-rw-r--r--ppd/hpijs/hp-color_laserjet_3800-hpijs-pcl3.ppd.gzbin0 -> 3884 bytes
-rw-r--r--ppd/hpijs/hp-color_laserjet_4500-hpijs-pcl3.ppd.gzbin0 -> 3880 bytes
-rw-r--r--ppd/hpijs/hp-color_laserjet_4550-hpijs-pcl3.ppd.gzbin0 -> 3892 bytes
-rw-r--r--ppd/hpijs/hp-color_laserjet_4600-hpijs-pcl3.ppd.gzbin0 -> 3877 bytes
-rw-r--r--ppd/hpijs/hp-color_laserjet_4600_series-hpijs.ppd.gzbin0 -> 3899 bytes
-rw-r--r--ppd/hpijs/hp-color_laserjet_4610-hpijs-pcl3.ppd.gzbin0 -> 3875 bytes
-rw-r--r--ppd/hpijs/hp-color_laserjet_4650-hpijs-pcl3.ppd.gzbin0 -> 3888 bytes
-rw-r--r--ppd/hpijs/hp-color_laserjet_4700-hpijs-pcl3.ppd.gzbin0 -> 3889 bytes
-rw-r--r--ppd/hpijs/hp-color_laserjet_4730mfp-hpijs-pcl3.ppd.gzbin0 -> 3902 bytes
-rw-r--r--ppd/hpijs/hp-color_laserjet_5-hpijs.ppd.gzbin0 -> 3929 bytes
-rw-r--r--ppd/hpijs/hp-color_laserjet_5500-hpijs-pcl3.ppd.gzbin0 -> 4050 bytes
-rw-r--r--ppd/hpijs/hp-color_laserjet_5550-hpijs-pcl3.ppd.gzbin0 -> 4053 bytes
-rw-r--r--ppd/hpijs/hp-color_laserjet_5m-hpijs-pcl3.ppd.gzbin0 -> 3945 bytes
-rw-r--r--ppd/hpijs/hp-color_laserjet_8500-hpijs-pcl3.ppd.gzbin0 -> 4043 bytes
-rw-r--r--ppd/hpijs/hp-color_laserjet_8550-hpijs-pcl3.ppd.gzbin0 -> 4079 bytes
-rw-r--r--ppd/hpijs/hp-color_laserjet_9500-hpijs-pcl3.ppd.gzbin0 -> 4050 bytes
-rw-r--r--ppd/hpijs/hp-color_laserjet_9500_mfp-hpijs-pcl3.ppd.gzbin0 -> 4066 bytes
-rw-r--r--ppd/hpijs/hp-color_laserjet_cm1312_mfp-hpijs-pcl3.ppd.gzbin0 -> 3905 bytes
-rw-r--r--ppd/hpijs/hp-color_laserjet_cm1312nfi_mfp-hpijs-pcl3.ppd.gzbin0 -> 3912 bytes
-rw-r--r--ppd/hpijs/hp-color_laserjet_cm2320_mfp-hpijs-pcl3.ppd.gzbin0 -> 3904 bytes
-rw-r--r--ppd/hpijs/hp-color_laserjet_cm2320fxi_mfp-hpijs-pcl3.ppd.gzbin0 -> 3913 bytes
-rw-r--r--ppd/hpijs/hp-color_laserjet_cm2320n_mfp-hpijs-pcl3.ppd.gzbin0 -> 3907 bytes
-rw-r--r--ppd/hpijs/hp-color_laserjet_cm2320nf_mfp-hpijs-pcl3.ppd.gzbin0 -> 3910 bytes
-rw-r--r--ppd/hpijs/hp-color_laserjet_cm3530_mfp-hpijs-pcl3.ppd.gzbin0 -> 3910 bytes
-rw-r--r--ppd/hpijs/hp-color_laserjet_cm4540_mfp-hpijs-pcl3.ppd.gzbin0 -> 3905 bytes
-rw-r--r--ppd/hpijs/hp-color_laserjet_cm4730_mfp-hpijs-pcl3.ppd.gzbin0 -> 3917 bytes
-rw-r--r--ppd/hpijs/hp-color_laserjet_cm6030_mfp-hpijs-pcl3.ppd.gzbin0 -> 4074 bytes
-rw-r--r--ppd/hpijs/hp-color_laserjet_cm6040_mfp-hpijs.ppd.gzbin0 -> 4067 bytes
-rw-r--r--ppd/hpijs/hp-color_laserjet_cm6049_mfp-hpijs.ppd.gzbin0 -> 4045 bytes
-rw-r--r--ppd/hpijs/hp-color_laserjet_cp1215-hpijs.ppd.gzbin0 -> 3286 bytes
-rw-r--r--ppd/hpijs/hp-color_laserjet_cp1217-hpijs.ppd.gzbin0 -> 3286 bytes
-rw-r--r--ppd/hpijs/hp-color_laserjet_cp1514n-hpijs-pcl3.ppd.gzbin0 -> 3881 bytes
-rw-r--r--ppd/hpijs/hp-color_laserjet_cp1515n-hpijs-pcl3.ppd.gzbin0 -> 3881 bytes
-rw-r--r--ppd/hpijs/hp-color_laserjet_cp1518ni-hpijs-pcl3.ppd.gzbin0 -> 3887 bytes
-rw-r--r--ppd/hpijs/hp-color_laserjet_cp2025-hpijs-pcl3.ppd.gzbin0 -> 3878 bytes
-rw-r--r--ppd/hpijs/hp-color_laserjet_cp2025dn-hpijs-pcl3.ppd.gzbin0 -> 3887 bytes
-rw-r--r--ppd/hpijs/hp-color_laserjet_cp2025n-hpijs-pcl3.ppd.gzbin0 -> 3881 bytes
-rw-r--r--ppd/hpijs/hp-color_laserjet_cp2025x-hpijs-pcl3.ppd.gzbin0 -> 3881 bytes
-rw-r--r--ppd/hpijs/hp-color_laserjet_cp3505-hpijs-pcl3.ppd.gzbin0 -> 3890 bytes
-rw-r--r--ppd/hpijs/hp-color_laserjet_cp3525-hpijs-pcl3.ppd.gzbin0 -> 3889 bytes
-rw-r--r--ppd/hpijs/hp-color_laserjet_cp4005-hpijs-pcl3.ppd.gzbin0 -> 3891 bytes
-rw-r--r--ppd/hpijs/hp-color_laserjet_cp4020_series-hpijs-pcl3.ppd.gzbin0 -> 3901 bytes
-rw-r--r--ppd/hpijs/hp-color_laserjet_cp4520_series-hpijs-pcl3.ppd.gzbin0 -> 3901 bytes
-rw-r--r--ppd/hpijs/hp-color_laserjet_cp5225-hpijs-pcl3.ppd.gzbin0 -> 3875 bytes
-rw-r--r--ppd/hpijs/hp-color_laserjet_cp5225dn-hpijs-pcl3.ppd.gzbin0 -> 3884 bytes
-rw-r--r--ppd/hpijs/hp-color_laserjet_cp5225n-hpijs-pcl3.ppd.gzbin0 -> 3877 bytes
-rw-r--r--ppd/hpijs/hp-color_laserjet_cp5520_series-hpijs-pcl3.ppd.gzbin0 -> 3901 bytes
-rw-r--r--ppd/hpijs/hp-color_laserjet_cp6015-hpijs-pcl3.ppd.gzbin0 -> 4058 bytes
-rw-r--r--ppd/hpijs/hp-cp1160-hpijs.ppd.gzbin0 -> 4158 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_1000_j110_series-hpijs.ppd.gzbin0 -> 4142 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_1050_j410_series-hpijs.ppd.gzbin0 -> 4157 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_1100-hpijs.ppd.gzbin0 -> 3336 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_1120-hpijs.ppd.gzbin0 -> 3898 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_1125-hpijs.ppd.gzbin0 -> 3890 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_1200c-hpijs.ppd.gzbin0 -> 3923 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_1220c-hpijs.ppd.gzbin0 -> 3939 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_1280-hpijs.ppd.gzbin0 -> 3922 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_1600c-hpijs.ppd.gzbin0 -> 3921 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_1600cm-hpijs.ppd.gzbin0 -> 3923 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_1600cn-hpijs.ppd.gzbin0 -> 3923 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_2000_j210_series-hpijs.ppd.gzbin0 -> 4144 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_2050_j510_series-hpijs.ppd.gzbin0 -> 4158 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_3000_j310_series-hpijs.ppd.gzbin0 -> 4145 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_3050_j610_series-hpijs.ppd.gzbin0 -> 4146 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_3050a_j611_series-hpijs.ppd.gzbin0 -> 4146 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_3070_b611_series-hpijs.ppd.gzbin0 -> 4224 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_3320-hpijs.ppd.gzbin0 -> 3587 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_3325-hpijs.ppd.gzbin0 -> 3581 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_3420-hpijs.ppd.gzbin0 -> 3630 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_3425-hpijs.ppd.gzbin0 -> 3621 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_3450-hpijs.ppd.gzbin0 -> 3627 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_3500-hpijs.ppd.gzbin0 -> 3598 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_3550-hpijs.ppd.gzbin0 -> 3591 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_3600-hpijs.ppd.gzbin0 -> 3724 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_3650-hpijs.ppd.gzbin0 -> 3743 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_3740-hpijs.ppd.gzbin0 -> 3600 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_3810-hpijs.ppd.gzbin0 -> 3732 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_3816-hpijs.ppd.gzbin0 -> 3737 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_3819-hpijs.ppd.gzbin0 -> 3733 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_3820-hpijs.ppd.gzbin0 -> 3740 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_3822-hpijs.ppd.gzbin0 -> 3732 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_3840-hpijs.ppd.gzbin0 -> 3736 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_3870-hpijs.ppd.gzbin0 -> 3732 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_3900-hpijs.ppd.gzbin0 -> 3580 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_3910-hpijs.ppd.gzbin0 -> 3598 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_3920-hpijs.ppd.gzbin0 -> 3579 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_3940-hpijs.ppd.gzbin0 -> 3584 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_400-hpijs.ppd.gzbin0 -> 3295 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_400l-hpijs.ppd.gzbin0 -> 3354 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_460-hpijs.ppd.gzbin0 -> 4208 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_500-hpijs.ppd.gzbin0 -> 3143 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_500c-hpijs.ppd.gzbin0 -> 3282 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_505j-hpijs.ppd.gzbin0 -> 3136 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_510-hpijs.ppd.gzbin0 -> 3133 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_5100-hpijs.ppd.gzbin0 -> 4289 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_520-hpijs.ppd.gzbin0 -> 3133 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_540-hpijs.ppd.gzbin0 -> 3279 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_5400_series-hpijs.ppd.gzbin0 -> 4313 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_550c-hpijs.ppd.gzbin0 -> 3285 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_5550-hpijs.ppd.gzbin0 -> 4203 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_5551-hpijs.ppd.gzbin0 -> 4197 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_5552-hpijs.ppd.gzbin0 -> 4265 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_5600-hpijs.ppd.gzbin0 -> 4260 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_5650-hpijs.ppd.gzbin0 -> 4273 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_5652-hpijs.ppd.gzbin0 -> 4263 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_5700-hpijs.ppd.gzbin0 -> 4282 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_5800-hpijs.ppd.gzbin0 -> 4264 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_5850-hpijs.ppd.gzbin0 -> 4268 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_5900_series-hpijs.ppd.gzbin0 -> 4298 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_600-hpijs.ppd.gzbin0 -> 3341 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_610c-hpijs.ppd.gzbin0 -> 3426 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_610cl-hpijs.ppd.gzbin0 -> 3428 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_6120-hpijs.ppd.gzbin0 -> 4165 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_6122-hpijs.ppd.gzbin0 -> 4164 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_6127-hpijs.ppd.gzbin0 -> 4164 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_612c-hpijs.ppd.gzbin0 -> 3427 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_630c-hpijs.ppd.gzbin0 -> 3490 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_632c-hpijs.ppd.gzbin0 -> 3491 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_640c-hpijs.ppd.gzbin0 -> 3453 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_648c-hpijs.ppd.gzbin0 -> 3428 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_6500-hpijs.ppd.gzbin0 -> 4297 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_656c-hpijs.ppd.gzbin0 -> 3497 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_660-hpijs.ppd.gzbin0 -> 3341 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_6600-hpijs.ppd.gzbin0 -> 4286 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_670-hpijs.ppd.gzbin0 -> 3338 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_670c-hpijs.ppd.gzbin0 -> 3331 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_670tv-hpijs.ppd.gzbin0 -> 3337 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_672c-hpijs.ppd.gzbin0 -> 3335 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_680-hpijs.ppd.gzbin0 -> 3334 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_6800-hpijs.ppd.gzbin0 -> 4292 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_682-hpijs.ppd.gzbin0 -> 3334 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_690-hpijs.ppd.gzbin0 -> 3432 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_690c-hpijs.ppd.gzbin0 -> 3433 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_692-hpijs.ppd.gzbin0 -> 3431 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_693-hpijs.ppd.gzbin0 -> 3428 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_694-hpijs.ppd.gzbin0 -> 3428 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_6940_series-hpijs.ppd.gzbin0 -> 4286 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_695-hpijs.ppd.gzbin0 -> 3433 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_697-hpijs.ppd.gzbin0 -> 3428 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_6980_series-hpijs.ppd.gzbin0 -> 4302 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_810c-hpijs.ppd.gzbin0 -> 3398 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_812c-hpijs.ppd.gzbin0 -> 3399 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_815c-hpijs.ppd.gzbin0 -> 3398 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_816c-hpijs.ppd.gzbin0 -> 3400 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_825c-hpijs.ppd.gzbin0 -> 3519 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_830c-hpijs.ppd.gzbin0 -> 3400 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_832c-hpijs.ppd.gzbin0 -> 3400 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_840c-hpijs.ppd.gzbin0 -> 3400 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_841c-hpijs.ppd.gzbin0 -> 3400 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_842c-hpijs.ppd.gzbin0 -> 3402 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_843c-hpijs.ppd.gzbin0 -> 3404 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_845c-hpijs.ppd.gzbin0 -> 3520 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_850c-hpijs.ppd.gzbin0 -> 3324 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_855c-hpijs.ppd.gzbin0 -> 3328 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_870c-hpijs.ppd.gzbin0 -> 3334 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_880c-hpijs.ppd.gzbin0 -> 3400 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_882c-hpijs.ppd.gzbin0 -> 3400 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_890c-hpijs.ppd.gzbin0 -> 3332 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_895c-hpijs.ppd.gzbin0 -> 3408 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_916c-hpijs.ppd.gzbin0 -> 3726 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_920c-hpijs.ppd.gzbin0 -> 3739 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_9300-hpijs.ppd.gzbin0 -> 3926 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_930c-hpijs.ppd.gzbin0 -> 3730 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_932c-hpijs.ppd.gzbin0 -> 3726 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_933c-hpijs.ppd.gzbin0 -> 3726 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_934c-hpijs.ppd.gzbin0 -> 3726 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_935c-hpijs.ppd.gzbin0 -> 3725 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_940c-hpijs.ppd.gzbin0 -> 3740 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_948c-hpijs.ppd.gzbin0 -> 3726 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_950c-hpijs.ppd.gzbin0 -> 3726 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_952c-hpijs.ppd.gzbin0 -> 3726 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_955c-hpijs.ppd.gzbin0 -> 3739 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_957c-hpijs.ppd.gzbin0 -> 3726 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_959c-hpijs.ppd.gzbin0 -> 3726 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_9600-hpijs.ppd.gzbin0 -> 4471 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_960c-hpijs.ppd.gzbin0 -> 4165 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_970c-hpijs.ppd.gzbin0 -> 3735 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_975c-hpijs.ppd.gzbin0 -> 3734 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_9800-hpijs.ppd.gzbin0 -> 4476 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_980c-hpijs.ppd.gzbin0 -> 4161 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_990c-hpijs.ppd.gzbin0 -> 4168 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_995c-hpijs.ppd.gzbin0 -> 4159 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_d1300_series-hpijs.ppd.gzbin0 -> 3618 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_d1400_series-hpijs.ppd.gzbin0 -> 3624 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_d1500_series-hpijs.ppd.gzbin0 -> 3619 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_d1600_series-hpijs.ppd.gzbin0 -> 4302 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_d2300_series-hpijs.ppd.gzbin0 -> 3752 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_d2400_series-hpijs.ppd.gzbin0 -> 3756 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_d2500_series-hpijs.ppd.gzbin0 -> 4301 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_d2600_series-hpijs.ppd.gzbin0 -> 4301 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_d4100_series-hpijs.ppd.gzbin0 -> 3628 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_d4200_series-hpijs.ppd.gzbin0 -> 3624 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_d4300_series-hpijs.ppd.gzbin0 -> 3621 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_d5500_series-hpijs.ppd.gzbin0 -> 4294 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_d730-hpijs.ppd.gzbin0 -> 4258 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_f2100_series-hpijs.ppd.gzbin0 -> 3636 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_f2200_series-hpijs.ppd.gzbin0 -> 3646 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_f2400_series-hpijs.ppd.gzbin0 -> 4328 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_f300_series-hpijs.ppd.gzbin0 -> 3787 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_f4100_series-hpijs.ppd.gzbin0 -> 3776 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_f4200_series-hpijs.ppd.gzbin0 -> 4343 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_f4210_series-hpijs.ppd.gzbin0 -> 4296 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_f4213_series-hpijs.ppd.gzbin0 -> 4295 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_f4400_series-hpijs.ppd.gzbin0 -> 4322 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_f4500_series-hpijs.ppd.gzbin0 -> 4290 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_f735-hpijs.ppd.gzbin0 -> 4275 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_ink_adv_2010_k010-hpijs.ppd.gzbin0 -> 4153 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_ink_adv_2060_k110-hpijs.ppd.gzbin0 -> 4155 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_ink_advant_k109a-z-hpijs.ppd.gzbin0 -> 4309 bytes
-rw-r--r--ppd/hpijs/hp-deskjet_ink_advant_k209a-z-hpijs.ppd.gzbin0 -> 4318 bytes
-rw-r--r--ppd/hpijs/hp-dj350-hpijs.ppd.gzbin0 -> 3348 bytes
-rw-r--r--ppd/hpijs/hp-dj450-hpijs.ppd.gzbin0 -> 4164 bytes
-rw-r--r--ppd/hpijs/hp-envy_100_d410_series-hpijs.ppd.gzbin0 -> 4283 bytes
-rw-r--r--ppd/hpijs/hp-envy_110_series-hpijs.ppd.gzbin0 -> 4283 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_1000-hpijs.ppd.gzbin0 -> 3165 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_1005_series-hpijs.ppd.gzbin0 -> 3184 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_1010-hpijs.ppd.gzbin0 -> 3488 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_1012-hpijs.ppd.gzbin0 -> 3491 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_1015-hpijs.ppd.gzbin0 -> 3579 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_1018-hpijs.ppd.gzbin0 -> 3168 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_1020-hpijs.ppd.gzbin0 -> 3172 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_1022-hpijs-pcl3.ppd.gzbin0 -> 3614 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_1022-hpijs-zjs.ppd.gzbin0 -> 3179 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_1022n-hpijs-pcl3.ppd.gzbin0 -> 3621 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_1022n-hpijs-zjs.ppd.gzbin0 -> 3185 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_1022nw-hpijs-pcl3.ppd.gzbin0 -> 3617 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_1022nw-hpijs-zjs.ppd.gzbin0 -> 3182 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_1100-hpijs.ppd.gzbin0 -> 3588 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_1100a-hpijs.ppd.gzbin0 -> 3595 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_1100xi-hpijs.ppd.gzbin0 -> 3596 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_1150-hpijs.ppd.gzbin0 -> 3580 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_1160-hpijs.ppd.gzbin0 -> 3585 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_1160_series-hpijs.ppd.gzbin0 -> 3599 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_1200-hpijs-pcl3.ppd.gzbin0 -> 3595 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_1200n-hpijs.ppd.gzbin0 -> 3581 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_1220-hpijs-pcl3.ppd.gzbin0 -> 3600 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_1220se-hpijs.ppd.gzbin0 -> 3591 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_1300-hpijs-pcl3.ppd.gzbin0 -> 3597 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_1300n-hpijs-pcl3.ppd.gzbin0 -> 3593 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_1300xi-hpijs-pcl3.ppd.gzbin0 -> 3595 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_1320-hpijs.ppd.gzbin0 -> 3584 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_1320_series-hpijs-pcl3.ppd.gzbin0 -> 3610 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_1320n-hpijs.ppd.gzbin0 -> 3582 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_1320nw-hpijs.ppd.gzbin0 -> 3584 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_1320tn-hpijs.ppd.gzbin0 -> 3584 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_2100-hpijs.ppd.gzbin0 -> 3596 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_2100_series-hpijs-pcl3.ppd.gzbin0 -> 3609 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_2200-hpijs-pcl3.ppd.gzbin0 -> 3609 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_2200_series-hpijs.ppd.gzbin0 -> 3598 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_2300-hpijs-pcl3.ppd.gzbin0 -> 3609 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_2300_series-hpijs.ppd.gzbin0 -> 3600 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_2410-hpijs-pcl3.ppd.gzbin0 -> 3592 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_2420-hpijs-pcl3.ppd.gzbin0 -> 3602 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_2430-hpijs-pcl3.ppd.gzbin0 -> 3606 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_3015-hpijs-pcl3.ppd.gzbin0 -> 3599 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_3020-hpijs-pcl3.ppd.gzbin0 -> 3600 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_3030-hpijs-pcl3.ppd.gzbin0 -> 3600 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_3050-hpijs-pcl3.ppd.gzbin0 -> 3605 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_3052-hpijs-pcl3.ppd.gzbin0 -> 3600 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_3055-hpijs.ppd.gzbin0 -> 3588 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_3100-hpijs.ppd.gzbin0 -> 3597 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_3150-hpijs.ppd.gzbin0 -> 3598 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_3200-hpijs.ppd.gzbin0 -> 3588 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_3200m-hpijs-pcl3.ppd.gzbin0 -> 3601 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_3200se-hpijs.ppd.gzbin0 -> 3592 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_3300_3310_3320-hpijs-pcl3.ppd.gzbin0 -> 3655 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_3330-hpijs.ppd.gzbin0 -> 3589 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_3380-hpijs-pcl3.ppd.gzbin0 -> 3600 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_3390-hpijs-pcl3.ppd.gzbin0 -> 3600 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_3392-hpijs.ppd.gzbin0 -> 3588 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_4000_series-hpijs-pcl3.ppd.gzbin0 -> 3623 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_4050_series-hpijs-pcl3.ppd.gzbin0 -> 3623 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_4100_mfp-hpijs-pcl3.ppd.gzbin0 -> 3617 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_4100_series-hpijs-pcl3.ppd.gzbin0 -> 3621 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_4150_series-hpijs.ppd.gzbin0 -> 3599 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_4200-hpijs-pcl3.ppd.gzbin0 -> 3617 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_4240-hpijs-pcl3.ppd.gzbin0 -> 3596 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_4250-hpijs-pcl3.ppd.gzbin0 -> 3606 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_4300-hpijs-pcl3.ppd.gzbin0 -> 3610 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_4345_mfp-hpijs-pcl3.ppd.gzbin0 -> 3624 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_4350-hpijs-pcl3.ppd.gzbin0 -> 3606 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_4_plus-hpijs-pcl3.ppd.gzbin0 -> 3603 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_4l-hpijs.ppd.gzbin0 -> 3245 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_4ml-hpijs.ppd.gzbin0 -> 3238 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_4mp-hpijs-pcl3.ppd.gzbin0 -> 3590 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_4si-hpijs-pcl3.ppd.gzbin0 -> 3595 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_4v-hpijs-pcl3.ppd.gzbin0 -> 3588 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_5000-hpijs.ppd.gzbin0 -> 3750 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_5000_series-hpijs-pcl3.ppd.gzbin0 -> 3610 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_5100_series-hpijs-pcl3.ppd.gzbin0 -> 3782 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_5200-hpijs-pcl3.ppd.gzbin0 -> 3758 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_5200l-hpijs-pcl3.ppd.gzbin0 -> 3750 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_5200lx-hpijs.ppd.gzbin0 -> 3583 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_5l-hpijs.ppd.gzbin0 -> 3588 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_5mp-hpijs-pcl3.ppd.gzbin0 -> 3590 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_5p-hpijs.ppd.gzbin0 -> 3575 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_5si-hpijs-pcl3.ppd.gzbin0 -> 3759 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_5si_mopier-hpijs-pcl3.ppd.gzbin0 -> 3767 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_6l-hpijs.ppd.gzbin0 -> 3595 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_6mp-hpijs-pcl3.ppd.gzbin0 -> 3599 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_6p-hpijs.ppd.gzbin0 -> 3575 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_8000-hpijs.ppd.gzbin0 -> 3743 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_8000_series-hpijs-pcl3.ppd.gzbin0 -> 3610 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_8100_mfp-hpijs.ppd.gzbin0 -> 3601 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_8100_series-hpijs-pcl3.ppd.gzbin0 -> 3774 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_8150_mfp-hpijs.ppd.gzbin0 -> 3601 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_8150_series-hpijs-pcl3.ppd.gzbin0 -> 3777 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_9000_mfp-hpijs-pcl3.ppd.gzbin0 -> 3773 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_9000_series-hpijs-pcl3.ppd.gzbin0 -> 3782 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_9040-hpijs-pcl3.ppd.gzbin0 -> 3756 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_9040_mfp-hpijs-pcl3.ppd.gzbin0 -> 3779 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_9050-hpijs-pcl3.ppd.gzbin0 -> 3755 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_9050_mfp-hpijs-pcl3.ppd.gzbin0 -> 3770 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_9055mfp-hpijs-pcl3.ppd.gzbin0 -> 3763 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_9065mfp-hpijs-pcl3.ppd.gzbin0 -> 3763 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_cm1411fn-hpijs-pcl3.ppd.gzbin0 -> 3874 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_cm1412fn-hpijs-pcl3.ppd.gzbin0 -> 3874 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_cm1413fn-hpijs-pcl3.ppd.gzbin0 -> 3874 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_cm1415fn-hpijs-pcl3.ppd.gzbin0 -> 3874 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_cm1415fnw-hpijs-pcl3.ppd.gzbin0 -> 3876 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_cm1416fnw-hpijs-pcl3.ppd.gzbin0 -> 3876 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_cm1417fnw-hpijs-pcl3.ppd.gzbin0 -> 3877 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_cm1418fnw-hpijs-pcl3.ppd.gzbin0 -> 3877 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_cp1025-hpijs.ppd.gzbin0 -> 3296 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_cp1025nw-hpijs.ppd.gzbin0 -> 3300 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_cp_1025-hpijs.ppd.gzbin0 -> 3303 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_cp_1025nw-hpijs.ppd.gzbin0 -> 3307 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_m1005-hpijs.ppd.gzbin0 -> 3191 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_m1120_mfp-hpijs.ppd.gzbin0 -> 3195 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_m1120n_mfp-hpijs.ppd.gzbin0 -> 3196 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_m1319f_mfp-hpijs.ppd.gzbin0 -> 3197 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_m1522nf_mfp-hpijs-pcl3.ppd.gzbin0 -> 3620 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_m1536dnf_mfp-hpijs-pcl3.ppd.gzbin0 -> 3610 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_m1537dnf_mfp-hpijs-pcl3.ppd.gzbin0 -> 3610 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_m1538dnf_mfp-hpijs-pcl3.ppd.gzbin0 -> 3610 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_m1539dnf_mfp-hpijs-pcl3.ppd.gzbin0 -> 3610 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_m2727_mfp-hpijs-pcl3.ppd.gzbin0 -> 3616 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_m3027_mfp-hpijs-pcl3.ppd.gzbin0 -> 3620 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_m3035_mfp-hpijs-pcl3.ppd.gzbin0 -> 3776 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_m4345_mfp-hpijs-pcl3.ppd.gzbin0 -> 3627 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_m4349_mfp-hpijs-pcl3.ppd.gzbin0 -> 3604 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_m5025_mfp-hpijs-pcl3.ppd.gzbin0 -> 3772 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_m5035_mfp-hpijs-pcl3.ppd.gzbin0 -> 3779 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_m5039_mfp-hpijs-pcl3.ppd.gzbin0 -> 3772 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_m9040_mfp-hpijs-pcl3.ppd.gzbin0 -> 3616 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_m9050_mfp-hpijs-pcl3.ppd.gzbin0 -> 3620 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_m9059_mfp-hpijs-pcl3.ppd.gzbin0 -> 3605 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_p1005-hpijs.ppd.gzbin0 -> 3182 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_p1006-hpijs.ppd.gzbin0 -> 3185 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_p1007-hpijs.ppd.gzbin0 -> 3185 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_p1008-hpijs.ppd.gzbin0 -> 3184 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_p1009-hpijs.ppd.gzbin0 -> 3185 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_p1505-hpijs.ppd.gzbin0 -> 3182 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_p1505n-hpijs-pcl3.ppd.gzbin0 -> 3618 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_p1505n-hpijs-zxs.ppd.gzbin0 -> 3196 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_p2014-hpijs-pcl3.ppd.gzbin0 -> 3616 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_p2014-hpijs-zxs.ppd.gzbin0 -> 3194 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_p2014n-hpijs-pcl3.ppd.gzbin0 -> 3618 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_p2014n-hpijs-zxs.ppd.gzbin0 -> 3196 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_p2015_series-hpijs-pcl3.ppd.gzbin0 -> 3612 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_p2015d_series-hpijs.ppd.gzbin0 -> 3603 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_p2015dn_series-hpijs.ppd.gzbin0 -> 3609 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_p2015n_series-hpijs.ppd.gzbin0 -> 3603 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_p2015x_series-hpijs.ppd.gzbin0 -> 3603 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_p2035-hpijs-pcl3.ppd.gzbin0 -> 3617 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_p2035-hpijs-zjs.ppd.gzbin0 -> 3182 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_p2035n-hpijs-pcl3.ppd.gzbin0 -> 3618 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_p2035n-hpijs-zjs.ppd.gzbin0 -> 3183 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_p2055-hpijs-pcl3.ppd.gzbin0 -> 3593 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_p2055d-hpijs-pcl3.ppd.gzbin0 -> 3595 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_p2055dn-hpijs-pcl3.ppd.gzbin0 -> 3597 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_p2055x-hpijs-pcl3.ppd.gzbin0 -> 3595 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_p3004-hpijs-pcl3.ppd.gzbin0 -> 3592 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_p3005-hpijs-pcl3.ppd.gzbin0 -> 3611 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_p3010_series-hpijs-pcl3.ppd.gzbin0 -> 3615 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_p4014-hpijs.ppd.gzbin0 -> 3581 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_p4014dn-hpijs.ppd.gzbin0 -> 3585 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_p4014n-hpijs.ppd.gzbin0 -> 3584 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_p4015-hpijs.ppd.gzbin0 -> 3582 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_p4015dn-hpijs.ppd.gzbin0 -> 3585 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_p4015n-hpijs.ppd.gzbin0 -> 3584 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_p4015tn-hpijs.ppd.gzbin0 -> 3585 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_p4015x-hpijs.ppd.gzbin0 -> 3584 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_p4515-hpijs.ppd.gzbin0 -> 3582 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_p4515n-hpijs.ppd.gzbin0 -> 3584 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_p4515tn-hpijs.ppd.gzbin0 -> 3585 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_p4515x-hpijs.ppd.gzbin0 -> 3584 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_p4515xm-hpijs.ppd.gzbin0 -> 3586 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_professional_m1132_mfp-hpijs.ppd.gzbin0 -> 3232 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_professional_m1136_mfp-hpijs.ppd.gzbin0 -> 3229 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_professional_m1212nf_mfp-hpijs.ppd.gzbin0 -> 3232 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_professional_m1213nf_mfp-hpijs.ppd.gzbin0 -> 3232 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_professional_m1214nfh_mfp-hpijs.ppd.gzbin0 -> 3234 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_professional_m1216nfh_mfp-hpijs.ppd.gzbin0 -> 3222 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_professional_m1217nfw_mfp-hpijs.ppd.gzbin0 -> 3235 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_professional_m1219nf_mfp-hpijs.ppd.gzbin0 -> 3221 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_professional_p1102-hpijs.ppd.gzbin0 -> 3208 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_professional_p1102w-hpijs.ppd.gzbin0 -> 3207 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_professional_p1106-hpijs.ppd.gzbin0 -> 3204 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_professional_p1108-hpijs.ppd.gzbin0 -> 3203 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_professional_p1566-hpijs.ppd.gzbin0 -> 3201 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_professional_p1606dn-hpijs.ppd.gzbin0 -> 3210 bytes
-rw-r--r--ppd/hpijs/hp-laserjet_professional_p_1102w-hpijs.ppd.gzbin0 -> 3215 bytes
-rw-r--r--ppd/hpijs/hp-mopier_240-hpijs-pcl3.ppd.gzbin0 -> 3741 bytes
-rw-r--r--ppd/hpijs/hp-mopier_320-hpijs-pcl3.ppd.gzbin0 -> 3741 bytes
-rw-r--r--ppd/hpijs/hp-officejet-hpijs.ppd.gzbin0 -> 3137 bytes
-rw-r--r--ppd/hpijs/hp-officejet_100_mobile_l411-hpijs.ppd.gzbin0 -> 4227 bytes
-rw-r--r--ppd/hpijs/hp-officejet_4000_k210-hpijs.ppd.gzbin0 -> 4277 bytes
-rw-r--r--ppd/hpijs/hp-officejet_4100_series-hpijs.ppd.gzbin0 -> 3621 bytes
-rw-r--r--ppd/hpijs/hp-officejet_4105-hpijs.ppd.gzbin0 -> 3590 bytes
-rw-r--r--ppd/hpijs/hp-officejet_4115_series-hpijs.ppd.gzbin0 -> 3609 bytes
-rw-r--r--ppd/hpijs/hp-officejet_4200_series-hpijs.ppd.gzbin0 -> 3767 bytes
-rw-r--r--ppd/hpijs/hp-officejet_4255-hpijs.ppd.gzbin0 -> 3742 bytes
-rw-r--r--ppd/hpijs/hp-officejet_4300_series-hpijs.ppd.gzbin0 -> 3659 bytes
-rw-r--r--ppd/hpijs/hp-officejet_4400_k410-hpijs.ppd.gzbin0 -> 4286 bytes
-rw-r--r--ppd/hpijs/hp-officejet_4500_g510a-f-hpijs.ppd.gzbin0 -> 4312 bytes
-rw-r--r--ppd/hpijs/hp-officejet_4500_g510g-m-hpijs.ppd.gzbin0 -> 4300 bytes
-rw-r--r--ppd/hpijs/hp-officejet_4500_g510n-z-hpijs.ppd.gzbin0 -> 4293 bytes
-rw-r--r--ppd/hpijs/hp-officejet_4500_k710-hpijs.ppd.gzbin0 -> 4288 bytes
-rw-r--r--ppd/hpijs/hp-officejet_5100_series-hpijs.ppd.gzbin0 -> 3772 bytes
-rw-r--r--ppd/hpijs/hp-officejet_5105-hpijs.ppd.gzbin0 -> 3738 bytes
-rw-r--r--ppd/hpijs/hp-officejet_5110-hpijs.ppd.gzbin0 -> 3742 bytes
-rw-r--r--ppd/hpijs/hp-officejet_5110v-hpijs.ppd.gzbin0 -> 3740 bytes
-rw-r--r--ppd/hpijs/hp-officejet_5500_series-hpijs.ppd.gzbin0 -> 3765 bytes
-rw-r--r--ppd/hpijs/hp-officejet_5600_series-hpijs.ppd.gzbin0 -> 3779 bytes
-rw-r--r--ppd/hpijs/hp-officejet_6000_e609a-hpijs.ppd.gzbin0 -> 4281 bytes
-rw-r--r--ppd/hpijs/hp-officejet_6000_e609n-hpijs.ppd.gzbin0 -> 4289 bytes
-rw-r--r--ppd/hpijs/hp-officejet_6100-hpijs.ppd.gzbin0 -> 4204 bytes
-rw-r--r--ppd/hpijs/hp-officejet_6100_series-hpijs.ppd.gzbin0 -> 4307 bytes
-rw-r--r--ppd/hpijs/hp-officejet_6150_series-hpijs.ppd.gzbin0 -> 4294 bytes
-rw-r--r--ppd/hpijs/hp-officejet_6200_series-hpijs.ppd.gzbin0 -> 4319 bytes
-rw-r--r--ppd/hpijs/hp-officejet_6300_series-hpijs.ppd.gzbin0 -> 4328 bytes
-rw-r--r--ppd/hpijs/hp-officejet_6500_e709a-hpijs.ppd.gzbin0 -> 4296 bytes
-rw-r--r--ppd/hpijs/hp-officejet_6500_e709n-hpijs.ppd.gzbin0 -> 4304 bytes
-rw-r--r--ppd/hpijs/hp-officejet_6500_e710a-f-hpijs.ppd.gzbin0 -> 4281 bytes
-rw-r--r--ppd/hpijs/hp-officejet_6500_e710n-z-hpijs.ppd.gzbin0 -> 4282 bytes
-rw-r--r--ppd/hpijs/hp-officejet_6600-hpijs.ppd.gzbin0 -> 4214 bytes
-rw-r--r--ppd/hpijs/hp-officejet_6700-hpijs.ppd.gzbin0 -> 4214 bytes
-rw-r--r--ppd/hpijs/hp-officejet_7000_e809a-hpijs.ppd.gzbin0 -> 4484 bytes
-rw-r--r--ppd/hpijs/hp-officejet_7000_e809a_series-hpijs.ppd.gzbin0 -> 4508 bytes
-rw-r--r--ppd/hpijs/hp-officejet_7100_series-hpijs.ppd.gzbin0 -> 4213 bytes
-rw-r--r--ppd/hpijs/hp-officejet_7200_series-hpijs.ppd.gzbin0 -> 4315 bytes
-rw-r--r--ppd/hpijs/hp-officejet_7300_series-hpijs.ppd.gzbin0 -> 4304 bytes
-rw-r--r--ppd/hpijs/hp-officejet_7400_series-hpijs.ppd.gzbin0 -> 4307 bytes
-rw-r--r--ppd/hpijs/hp-officejet_7500_e910-hpijs.ppd.gzbin0 -> 4470 bytes
-rw-r--r--ppd/hpijs/hp-officejet_9100_series-hpijs-pcl3.ppd.gzbin0 -> 3897 bytes
-rw-r--r--ppd/hpijs/hp-officejet_d_series-hpijs.ppd.gzbin0 -> 4204 bytes
-rw-r--r--ppd/hpijs/hp-officejet_g55-hpijs.ppd.gzbin0 -> 3736 bytes
-rw-r--r--ppd/hpijs/hp-officejet_g55xi-hpijs.ppd.gzbin0 -> 3740 bytes
-rw-r--r--ppd/hpijs/hp-officejet_g85-hpijs.ppd.gzbin0 -> 3736 bytes
-rw-r--r--ppd/hpijs/hp-officejet_g85xi-hpijs.ppd.gzbin0 -> 3740 bytes
-rw-r--r--ppd/hpijs/hp-officejet_g95-hpijs.ppd.gzbin0 -> 3736 bytes
-rw-r--r--ppd/hpijs/hp-officejet_h470-hpijs.ppd.gzbin0 -> 4214 bytes
-rw-r--r--ppd/hpijs/hp-officejet_j3500_series-hpijs.ppd.gzbin0 -> 3750 bytes
-rw-r--r--ppd/hpijs/hp-officejet_j3600_series-hpijs.ppd.gzbin0 -> 3765 bytes
-rw-r--r--ppd/hpijs/hp-officejet_j4500_series-hpijs.ppd.gzbin0 -> 4325 bytes
-rw-r--r--ppd/hpijs/hp-officejet_j4660_series-hpijs.ppd.gzbin0 -> 4310 bytes
-rw-r--r--ppd/hpijs/hp-officejet_j4680_series-hpijs.ppd.gzbin0 -> 4313 bytes
-rw-r--r--ppd/hpijs/hp-officejet_j5500_series-hpijs.ppd.gzbin0 -> 3771 bytes
-rw-r--r--ppd/hpijs/hp-officejet_j5700_series-hpijs.ppd.gzbin0 -> 4332 bytes
-rw-r--r--ppd/hpijs/hp-officejet_j6400_series-hpijs.ppd.gzbin0 -> 4321 bytes
-rw-r--r--ppd/hpijs/hp-officejet_k60-hpijs.ppd.gzbin0 -> 3735 bytes
-rw-r--r--ppd/hpijs/hp-officejet_k60xi-hpijs.ppd.gzbin0 -> 3740 bytes
-rw-r--r--ppd/hpijs/hp-officejet_k7100-hpijs.ppd.gzbin0 -> 4470 bytes
-rw-r--r--ppd/hpijs/hp-officejet_k80-hpijs.ppd.gzbin0 -> 3735 bytes
-rw-r--r--ppd/hpijs/hp-officejet_k80xi-hpijs.ppd.gzbin0 -> 3740 bytes
-rw-r--r--ppd/hpijs/hp-officejet_lx-hpijs.ppd.gzbin0 -> 3148 bytes
-rw-r--r--ppd/hpijs/hp-officejet_pro_1150c-hpijs.ppd.gzbin0 -> 3353 bytes
-rw-r--r--ppd/hpijs/hp-officejet_pro_1170c_series-hpijs.ppd.gzbin0 -> 3399 bytes
-rw-r--r--ppd/hpijs/hp-officejet_pro_8000_a809-hpijs.ppd.gzbin0 -> 4311 bytes
-rw-r--r--ppd/hpijs/hp-officejet_pro_8100-hpijs.ppd.gzbin0 -> 4217 bytes
-rw-r--r--ppd/hpijs/hp-officejet_pro_8500_a909a-hpijs.ppd.gzbin0 -> 4310 bytes
-rw-r--r--ppd/hpijs/hp-officejet_pro_8500_a909g-hpijs.ppd.gzbin0 -> 4316 bytes
-rw-r--r--ppd/hpijs/hp-officejet_pro_8500_a909n-hpijs.ppd.gzbin0 -> 4315 bytes
-rw-r--r--ppd/hpijs/hp-officejet_pro_8500_a910-hpijs.ppd.gzbin0 -> 4323 bytes
-rw-r--r--ppd/hpijs/hp-officejet_pro_8600-hpijs.ppd.gzbin0 -> 4225 bytes
-rw-r--r--ppd/hpijs/hp-officejet_pro_k5300-hpijs.ppd.gzbin0 -> 4159 bytes
-rw-r--r--ppd/hpijs/hp-officejet_pro_k5400-hpijs.ppd.gzbin0 -> 4172 bytes
-rw-r--r--ppd/hpijs/hp-officejet_pro_k550-hpijs.ppd.gzbin0 -> 4169 bytes
-rw-r--r--ppd/hpijs/hp-officejet_pro_k850-hpijs.ppd.gzbin0 -> 4359 bytes
-rw-r--r--ppd/hpijs/hp-officejet_pro_k8600-hpijs.ppd.gzbin0 -> 4363 bytes
-rw-r--r--ppd/hpijs/hp-officejet_pro_l7300-hpijs.ppd.gzbin0 -> 4174 bytes
-rw-r--r--ppd/hpijs/hp-officejet_pro_l7400-hpijs.ppd.gzbin0 -> 4168 bytes
-rw-r--r--ppd/hpijs/hp-officejet_pro_l7500-hpijs.ppd.gzbin0 -> 4186 bytes
-rw-r--r--ppd/hpijs/hp-officejet_pro_l7600-hpijs.ppd.gzbin0 -> 4183 bytes
-rw-r--r--ppd/hpijs/hp-officejet_pro_l7700-hpijs.ppd.gzbin0 -> 4183 bytes
-rw-r--r--ppd/hpijs/hp-officejet_r40-hpijs.ppd.gzbin0 -> 3410 bytes
-rw-r--r--ppd/hpijs/hp-officejet_r40xi-hpijs.ppd.gzbin0 -> 3416 bytes
-rw-r--r--ppd/hpijs/hp-officejet_r45-hpijs.ppd.gzbin0 -> 3410 bytes
-rw-r--r--ppd/hpijs/hp-officejet_r60-hpijs.ppd.gzbin0 -> 3410 bytes
-rw-r--r--ppd/hpijs/hp-officejet_r65-hpijs.ppd.gzbin0 -> 3410 bytes
-rw-r--r--ppd/hpijs/hp-officejet_r80-hpijs.ppd.gzbin0 -> 3410 bytes
-rw-r--r--ppd/hpijs/hp-officejet_r80xi-hpijs.ppd.gzbin0 -> 3416 bytes
-rw-r--r--ppd/hpijs/hp-officejet_series_300-hpijs.ppd.gzbin0 -> 3316 bytes
-rw-r--r--ppd/hpijs/hp-officejet_series_310-hpijs.ppd.gzbin0 -> 3317 bytes
-rw-r--r--ppd/hpijs/hp-officejet_series_320-hpijs.ppd.gzbin0 -> 3317 bytes
-rw-r--r--ppd/hpijs/hp-officejet_series_330-hpijs.ppd.gzbin0 -> 3169 bytes
-rw-r--r--ppd/hpijs/hp-officejet_series_350-hpijs.ppd.gzbin0 -> 3169 bytes
-rw-r--r--ppd/hpijs/hp-officejet_series_520-hpijs.ppd.gzbin0 -> 3367 bytes
-rw-r--r--ppd/hpijs/hp-officejet_series_570-hpijs.ppd.gzbin0 -> 3367 bytes
-rw-r--r--ppd/hpijs/hp-officejet_series_580-hpijs.ppd.gzbin0 -> 3367 bytes
-rw-r--r--ppd/hpijs/hp-officejet_series_590-hpijs.ppd.gzbin0 -> 3367 bytes
-rw-r--r--ppd/hpijs/hp-officejet_series_600-hpijs.ppd.gzbin0 -> 3367 bytes
-rw-r--r--ppd/hpijs/hp-officejet_series_610-hpijs.ppd.gzbin0 -> 3367 bytes
-rw-r--r--ppd/hpijs/hp-officejet_series_630-hpijs.ppd.gzbin0 -> 3372 bytes
-rw-r--r--ppd/hpijs/hp-officejet_series_700-hpijs.ppd.gzbin0 -> 3459 bytes
-rw-r--r--ppd/hpijs/hp-officejet_series_710-hpijs.ppd.gzbin0 -> 3459 bytes
-rw-r--r--ppd/hpijs/hp-officejet_series_720-hpijs.ppd.gzbin0 -> 3460 bytes
-rw-r--r--ppd/hpijs/hp-officejet_series_725-hpijs.ppd.gzbin0 -> 3460 bytes
-rw-r--r--ppd/hpijs/hp-officejet_t_series-hpijs.ppd.gzbin0 -> 3440 bytes
-rw-r--r--ppd/hpijs/hp-officejet_v30-hpijs.ppd.gzbin0 -> 3735 bytes
-rw-r--r--ppd/hpijs/hp-officejet_v40-hpijs.ppd.gzbin0 -> 3739 bytes
-rw-r--r--ppd/hpijs/hp-officejet_v40xi-hpijs.ppd.gzbin0 -> 3740 bytes
-rw-r--r--ppd/hpijs/hp-officejet_v45-hpijs.ppd.gzbin0 -> 3736 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_100-hpijs.ppd.gzbin0 -> 2311 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_1115-hpijs.ppd.gzbin0 -> 4165 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_1215-hpijs.ppd.gzbin0 -> 4170 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_1218-hpijs.ppd.gzbin0 -> 4170 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_130-hpijs.ppd.gzbin0 -> 2322 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_1315-hpijs.ppd.gzbin0 -> 4165 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_140_series-hpijs.ppd.gzbin0 -> 2354 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_230-hpijs.ppd.gzbin0 -> 2322 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_240_series-hpijs.ppd.gzbin0 -> 2351 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_2570_series-hpijs.ppd.gzbin0 -> 4326 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_2600_series-hpijs.ppd.gzbin0 -> 4320 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_2700_series-hpijs.ppd.gzbin0 -> 4309 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_3100_series-hpijs.ppd.gzbin0 -> 4308 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_3200_series-hpijs.ppd.gzbin0 -> 4321 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_320_series-hpijs.ppd.gzbin0 -> 2348 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_3300_series-hpijs.ppd.gzbin0 -> 4317 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_330_series-hpijs.ppd.gzbin0 -> 2352 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_370_series-hpijs.ppd.gzbin0 -> 2365 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_380_series-hpijs.ppd.gzbin0 -> 2341 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_420_series-hpijs.ppd.gzbin0 -> 2364 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_470_series-hpijs.ppd.gzbin0 -> 2433 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_5510_series-hpijs.ppd.gzbin0 -> 4226 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_5510d_series-hpijs.ppd.gzbin0 -> 4231 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_6510_series-hpijs.ppd.gzbin0 -> 4227 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_7150-hpijs.ppd.gzbin0 -> 4278 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_7200_series-hpijs.ppd.gzbin0 -> 4308 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_7345-hpijs.ppd.gzbin0 -> 4271 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_7350-hpijs.ppd.gzbin0 -> 4278 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_7400_series-hpijs.ppd.gzbin0 -> 4314 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_7510_series-hpijs.ppd.gzbin0 -> 4227 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_7550-hpijs.ppd.gzbin0 -> 4277 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_7600_series-hpijs.ppd.gzbin0 -> 4301 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_7700_series-hpijs.ppd.gzbin0 -> 4319 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_7800_series-hpijs.ppd.gzbin0 -> 4312 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_7900_series-hpijs.ppd.gzbin0 -> 4309 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_8000_series-hpijs.ppd.gzbin0 -> 4316 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_8100_series-hpijs.ppd.gzbin0 -> 4312 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_8200_series-hpijs.ppd.gzbin0 -> 4312 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_8400_series-hpijs.ppd.gzbin0 -> 4317 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_8700_series-hpijs.ppd.gzbin0 -> 4517 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_a310_series-hpijs.ppd.gzbin0 -> 2348 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_a320_series-hpijs.ppd.gzbin0 -> 2339 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_a430_series-hpijs.ppd.gzbin0 -> 2350 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_a440_series-hpijs.ppd.gzbin0 -> 2345 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_a510_series-hpijs.ppd.gzbin0 -> 2344 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_a520_series-hpijs.ppd.gzbin0 -> 2353 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_a530_series-hpijs.ppd.gzbin0 -> 2327 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_a610_series-hpijs.ppd.gzbin0 -> 2441 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_a620_series-hpijs.ppd.gzbin0 -> 2441 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_a630_series-hpijs.ppd.gzbin0 -> 2324 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_a640_series-hpijs.ppd.gzbin0 -> 2315 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_a710_series-hpijs.ppd.gzbin0 -> 2435 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_a820_series-hpijs.ppd.gzbin0 -> 2434 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_b010_series-hpijs.ppd.gzbin0 -> 4302 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_b109a-m-hpijs.ppd.gzbin0 -> 4298 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_b109a_series-hpijs.ppd.gzbin0 -> 4318 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_b110_series-hpijs.ppd.gzbin0 -> 4310 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_b8500_series-hpijs.ppd.gzbin0 -> 4506 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_c309a_series-hpijs.ppd.gzbin0 -> 4316 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_c3100_series-hpijs.ppd.gzbin0 -> 4353 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_c4100_series-hpijs.ppd.gzbin0 -> 4347 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_c4200_series-hpijs.ppd.gzbin0 -> 4353 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_c4340_series-hpijs.ppd.gzbin0 -> 4322 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_c4380_series-hpijs.ppd.gzbin0 -> 4319 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_c4400_series-hpijs.ppd.gzbin0 -> 4360 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_c4500_series-hpijs.ppd.gzbin0 -> 4346 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_c4600_series-hpijs.ppd.gzbin0 -> 4337 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_c4700_series-hpijs.ppd.gzbin0 -> 4340 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_c5100_series-hpijs.ppd.gzbin0 -> 4340 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_c5200_series-hpijs.ppd.gzbin0 -> 4339 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_c5300_series-hpijs.ppd.gzbin0 -> 4330 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_c5500_series-hpijs.ppd.gzbin0 -> 4318 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_c6100_series-hpijs.ppd.gzbin0 -> 4336 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_c6200_series-hpijs.ppd.gzbin0 -> 4347 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_c6300_series-hpijs.ppd.gzbin0 -> 4332 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_c7100_series-hpijs.ppd.gzbin0 -> 4332 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_c7200_series-hpijs.ppd.gzbin0 -> 4323 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_c8100_series-hpijs.ppd.gzbin0 -> 4319 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_d110_series-hpijs.ppd.gzbin0 -> 4291 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_d5060_series-hpijs.ppd.gzbin0 -> 4307 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_d5100_series-hpijs.ppd.gzbin0 -> 4316 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_d5300_series-hpijs.ppd.gzbin0 -> 4311 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_d5400_series-hpijs.ppd.gzbin0 -> 4306 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_d6100_series-hpijs.ppd.gzbin0 -> 4306 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_d7100_series-hpijs.ppd.gzbin0 -> 4313 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_d7200_series-hpijs.ppd.gzbin0 -> 4313 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_d7300_series-hpijs.ppd.gzbin0 -> 4315 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_d7400_series-hpijs.ppd.gzbin0 -> 4306 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_d7500_series-hpijs.ppd.gzbin0 -> 4299 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_estn_c510_series-hpijs.ppd.gzbin0 -> 4306 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_ink_adv_k510-hpijs.ppd.gzbin0 -> 4298 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_p1000-hpijs.ppd.gzbin0 -> 3741 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_p1100-hpijs.ppd.gzbin0 -> 3739 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_plus_b209a-m-hpijs.ppd.gzbin0 -> 4314 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_plus_b210_series-hpijs.ppd.gzbin0 -> 4305 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_prem-web_c309n-s-hpijs.ppd.gzbin0 -> 4330 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_prem_c310_series-hpijs.ppd.gzbin0 -> 4306 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_prem_c410_series-hpijs.ppd.gzbin0 -> 4306 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_premium_c309g-m-hpijs.ppd.gzbin0 -> 4321 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_pro_b8300_series-hpijs.ppd.gzbin0 -> 4521 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_pro_b8800_series-hpijs.ppd.gzbin0 -> 4504 bytes
-rw-r--r--ppd/hpijs/hp-photosmart_wireless_b109n-z-hpijs.ppd.gzbin0 -> 4325 bytes
-rw-r--r--ppd/hpijs/hp-printer_scanner_copier_300-hpijs.ppd.gzbin0 -> 3374 bytes
-rw-r--r--ppd/hpijs/hp-psc_1000_series-hpijs.ppd.gzbin0 -> 3608 bytes
-rw-r--r--ppd/hpijs/hp-psc_1100_series-hpijs.ppd.gzbin0 -> 3610 bytes
-rw-r--r--ppd/hpijs/hp-psc_1200_series-hpijs.ppd.gzbin0 -> 3639 bytes
-rw-r--r--ppd/hpijs/hp-psc_1300_series-hpijs.ppd.gzbin0 -> 3761 bytes
-rw-r--r--ppd/hpijs/hp-psc_1310_series-hpijs.ppd.gzbin0 -> 3765 bytes
-rw-r--r--ppd/hpijs/hp-psc_1358_series-hpijs.ppd.gzbin0 -> 3760 bytes
-rw-r--r--ppd/hpijs/hp-psc_1400_series-hpijs.ppd.gzbin0 -> 3770 bytes
-rw-r--r--ppd/hpijs/hp-psc_1500_series-hpijs.ppd.gzbin0 -> 4298 bytes
-rw-r--r--ppd/hpijs/hp-psc_1510_series-hpijs.ppd.gzbin0 -> 4314 bytes
-rw-r--r--ppd/hpijs/hp-psc_1600_series-hpijs.ppd.gzbin0 -> 4313 bytes
-rw-r--r--ppd/hpijs/hp-psc_2100_series-hpijs.ppd.gzbin0 -> 4198 bytes
-rw-r--r--ppd/hpijs/hp-psc_2150_series-hpijs.ppd.gzbin0 -> 4178 bytes
-rw-r--r--ppd/hpijs/hp-psc_2170_series-hpijs.ppd.gzbin0 -> 4197 bytes
-rw-r--r--ppd/hpijs/hp-psc_2200_series-hpijs.ppd.gzbin0 -> 4285 bytes
-rw-r--r--ppd/hpijs/hp-psc_2210_series-hpijs.ppd.gzbin0 -> 4296 bytes
-rw-r--r--ppd/hpijs/hp-psc_2300_series-hpijs.ppd.gzbin0 -> 4291 bytes
-rw-r--r--ppd/hpijs/hp-psc_2350_series-hpijs.ppd.gzbin0 -> 4316 bytes
-rw-r--r--ppd/hpijs/hp-psc_2400_series-hpijs.ppd.gzbin0 -> 4314 bytes
-rw-r--r--ppd/hpijs/hp-psc_2500_series-hpijs.ppd.gzbin0 -> 4305 bytes
-rw-r--r--ppd/hpijs/hp-psc_500-hpijs.ppd.gzbin0 -> 3406 bytes
-rw-r--r--ppd/hpijs/hp-psc_720-hpijs.ppd.gzbin0 -> 3724 bytes
-rw-r--r--ppd/hpijs/hp-psc_750-hpijs.ppd.gzbin0 -> 3723 bytes
-rw-r--r--ppd/hpijs/hp-psc_750xi-hpijs.ppd.gzbin0 -> 3728 bytes
-rw-r--r--ppd/hpijs/hp-psc_760-hpijs.ppd.gzbin0 -> 3724 bytes
-rw-r--r--ppd/hpijs/hp-psc_780-hpijs.ppd.gzbin0 -> 3724 bytes
-rw-r--r--ppd/hpijs/hp-psc_780xi-hpijs.ppd.gzbin0 -> 3730 bytes
-rw-r--r--ppd/hpijs/hp-psc_900_series-hpijs.ppd.gzbin0 -> 3745 bytes
-rw-r--r--ppd/hpijs/hp-psc_920-hpijs.ppd.gzbin0 -> 3724 bytes
-rw-r--r--ppd/hpijs/hp-psc_950-hpijs.ppd.gzbin0 -> 3724 bytes
-rw-r--r--ppd/hpijs/hp-psc_950vr-hpijs.ppd.gzbin0 -> 3730 bytes
-rw-r--r--ppd/hpijs/hp-psc_950xi-hpijs.ppd.gzbin0 -> 3730 bytes
-rwxr-xr-xpqdiag.py82
-rwxr-xr-xprint.py147
-rwxr-xr-xprintsettings.py95
-rw-r--r--prnt/__init__.py19
-rw-r--r--prnt/backend/hp.c923
-rw-r--r--prnt/colorcal.py232
-rw-r--r--prnt/cups.py773
-rw-r--r--prnt/cupsext/cupsext.c1921
-rw-r--r--prnt/drv/hpcups.drv.in16338
-rw-r--r--prnt/drv/hpijs.drv.in16084
-rw-r--r--prnt/drv/hpijs.drv.in.template9348
-rwxr-xr-xprnt/filters/hpcac450
-rw-r--r--prnt/filters/hplipjs.c303
-rw-r--r--prnt/hpcups/BreakTables.cpp2370
-rw-r--r--prnt/hpcups/ColorMaps.h47
-rw-r--r--prnt/hpcups/ColorMatcher.cpp463
-rw-r--r--prnt/hpcups/ColorMatcher.h139
-rw-r--r--prnt/hpcups/CommonDefinitions.h466
-rw-r--r--prnt/hpcups/Compressor.cpp75
-rw-r--r--prnt/hpcups/Compressor.h60
-rw-r--r--prnt/hpcups/Encapsulator.cpp283
-rw-r--r--prnt/hpcups/Encapsulator.h91
-rw-r--r--prnt/hpcups/EncapsulatorFactory.cpp99
-rw-r--r--prnt/hpcups/EncapsulatorFactory.h44
-rw-r--r--prnt/hpcups/ErnieFilter.cpp2037
-rw-r--r--prnt/hpcups/ErnieFilter.h238
-rw-r--r--prnt/hpcups/HPCupsFilter.cpp867
-rw-r--r--prnt/hpcups/HPCupsFilter.h125
-rw-r--r--prnt/hpcups/Halftoner.cpp1047
-rw-r--r--prnt/hpcups/Halftoner.h216
-rw-r--r--prnt/hpcups/Job.cpp299
-rw-r--r--prnt/hpcups/Job.h76
-rw-r--r--prnt/hpcups/LJColor.cpp243
-rw-r--r--prnt/hpcups/LJColor.h63
-rw-r--r--prnt/hpcups/LJFastRaster.cpp335
-rw-r--r--prnt/hpcups/LJFastRaster.h67
-rw-r--r--prnt/hpcups/LJJetReady.cpp338
-rw-r--r--prnt/hpcups/LJJetReady.h67
-rw-r--r--prnt/hpcups/LJMono.cpp172
-rw-r--r--prnt/hpcups/LJMono.h59
-rw-r--r--prnt/hpcups/LJZjStream.cpp841
-rw-r--r--prnt/hpcups/LJZjStream.h72
-rw-r--r--prnt/hpcups/LJZxStream.cpp271
-rw-r--r--prnt/hpcups/LJZxStream.h64
-rw-r--r--prnt/hpcups/Lidil.cpp1759
-rw-r--r--prnt/hpcups/Lidil.h209
-rw-r--r--prnt/hpcups/LidilCompress.cpp280
-rw-r--r--prnt/hpcups/LidilCompress.h79
-rw-r--r--prnt/hpcups/LidilPrintModes.h62
-rw-r--r--prnt/hpcups/Mode10.cpp455
-rw-r--r--prnt/hpcups/Mode10.h164
-rw-r--r--prnt/hpcups/Mode2.cpp138
-rw-r--r--prnt/hpcups/Mode2.h48
-rw-r--r--prnt/hpcups/Mode3.cpp171
-rw-r--r--prnt/hpcups/Mode3.h49
-rw-r--r--prnt/hpcups/Mode9.cpp455
-rw-r--r--prnt/hpcups/Mode9.h51
-rw-r--r--prnt/hpcups/ModeDeltaPlus.cpp568
-rw-r--r--prnt/hpcups/ModeDeltaPlus.h97
-rw-r--r--prnt/hpcups/ModeJbig.cpp351
-rw-r--r--prnt/hpcups/ModeJbig.h99
-rw-r--r--prnt/hpcups/ModeJpeg.cpp532
-rw-r--r--prnt/hpcups/ModeJpeg.h72
-rw-r--r--prnt/hpcups/Pcl3.cpp285
-rw-r--r--prnt/hpcups/Pcl3.h62
-rw-r--r--prnt/hpcups/Pcl3Gui.cpp289
-rw-r--r--prnt/hpcups/Pcl3Gui.h68
-rw-r--r--prnt/hpcups/Pcl3Gui2.cpp295
-rw-r--r--prnt/hpcups/Pcl3Gui2.h68
-rw-r--r--prnt/hpcups/Pcl3GuiPrintModes.h14
-rw-r--r--prnt/hpcups/Pcl3PrintModes.h20
-rw-r--r--prnt/hpcups/Pipeline.cpp108
-rw-r--r--prnt/hpcups/Pipeline.h63
-rw-r--r--prnt/hpcups/PrinterCommands.h179
-rw-r--r--prnt/hpcups/Processor.cpp48
-rw-r--r--prnt/hpcups/Processor.h54
-rw-r--r--prnt/hpcups/QuickConnect.cpp200
-rw-r--r--prnt/hpcups/QuickConnect.h60
-rw-r--r--prnt/hpcups/RasterSender.cpp54
-rw-r--r--prnt/hpcups/RasterSender.h56
-rw-r--r--prnt/hpcups/Scaler.cpp317
-rw-r--r--prnt/hpcups/Scaler.h39
-rw-r--r--prnt/hpcups/SystemServices.cpp67
-rw-r--r--prnt/hpcups/SystemServices.h46
-rw-r--r--prnt/hpcups/Utils.cpp133
-rw-r--r--prnt/hpcups/Utils.h36
-rw-r--r--prnt/hpcups/apPrintModes.h68
-rw-r--r--prnt/hpcups/dbuscomm.cpp143
-rw-r--r--prnt/hpcups/dbuscomm.h81
-rw-r--r--prnt/hpcups/dj3320ColorMaps.cpp799
-rw-r--r--prnt/hpcups/dj3320PrintModes.h103
-rw-r--r--prnt/hpcups/dj3600ColorMaps.cpp802
-rw-r--r--prnt/hpcups/dj400ColorMaps.cpp203
-rw-r--r--prnt/hpcups/dj400PrintModes.h20
-rw-r--r--prnt/hpcups/dj4100ColorMaps.cpp3569
-rw-r--r--prnt/hpcups/dj4100PrintModes.h103
-rw-r--r--prnt/hpcups/dj540PrintModes.h36
-rw-r--r--prnt/hpcups/dj600ColorMaps.cpp542
-rw-r--r--prnt/hpcups/dj600PrintModes.h44
-rw-r--r--prnt/hpcups/dj630PrintModes.h68
-rw-r--r--prnt/hpcups/dj690PrintModes.h52
-rw-r--r--prnt/hpcups/dj850PrintModes.h36
-rw-r--r--prnt/hpcups/dj890PrintModes.h36
-rw-r--r--prnt/hpcups/dj895PrintModes.h44
-rw-r--r--prnt/hpcups/dj8x5PrintModes.h69
-rw-r--r--prnt/hpcups/dj8xxColorMaps.cpp747
-rw-r--r--prnt/hpcups/dj970ColorMaps.cpp624
-rw-r--r--prnt/hpcups/dj970PrintModes.h60
-rw-r--r--prnt/hpcups/hpjbig_wrapper.h49
-rw-r--r--prnt/hpcups/jccolor.c533
-rw-r--r--prnt/hpcups/jdatadbf.c173
-rw-r--r--prnt/hpcups/jinclude.h91
-rw-r--r--prnt/hpcups/resources.h51
-rw-r--r--prnt/hpijs/PrinterProperties.cpp182
-rw-r--r--prnt/hpijs/PrinterProperties.h130
-rw-r--r--prnt/hpijs/README_LIBJPG396
-rw-r--r--prnt/hpijs/apollo21xx.cpp101
-rw-r--r--prnt/hpijs/apollo21xx.h68
-rw-r--r--prnt/hpijs/apollo2560.cpp53
-rw-r--r--prnt/hpijs/apollo2560.h66
-rw-r--r--prnt/hpijs/apollo2xxx.cpp304
-rw-r--r--prnt/hpijs/apollo2xxx.h136
-rw-r--r--prnt/hpijs/breaks_open.cpp2386
-rw-r--r--prnt/hpijs/bug.h65
-rw-r--r--prnt/hpijs/capture.cpp285
-rw-r--r--prnt/hpijs/colormatch.cpp401
-rw-r--r--prnt/hpijs/colormatch.h156
-rw-r--r--prnt/hpijs/colormatcher_open.cpp184
-rw-r--r--prnt/hpijs/colormatcher_open.h62
-rw-r--r--prnt/hpijs/compression.cpp690
-rw-r--r--prnt/hpijs/compression.h119
-rw-r--r--prnt/hpijs/config.h397
-rw-r--r--prnt/hpijs/context.h421
-rw-r--r--prnt/hpijs/context2.cpp2141
-rw-r--r--prnt/hpijs/create_so.cpp50
-rw-r--r--prnt/hpijs/creator.cpp108
-rw-r--r--prnt/hpijs/debug.h82
-rw-r--r--prnt/hpijs/dj3320.cpp3930
-rw-r--r--prnt/hpijs/dj3320.h406
-rw-r--r--prnt/hpijs/dj3320_cmap.cpp809
-rw-r--r--prnt/hpijs/dj350.cpp133
-rw-r--r--prnt/hpijs/dj350.h72
-rw-r--r--prnt/hpijs/dj3600.cpp148
-rw-r--r--prnt/hpijs/dj3600.h91
-rw-r--r--prnt/hpijs/dj3600_cmap.cpp811
-rw-r--r--prnt/hpijs/dj400.h115
-rw-r--r--prnt/hpijs/dj4100.h115
-rw-r--r--prnt/hpijs/dj4100_cmap.cpp3579
-rw-r--r--prnt/hpijs/dj540.cpp190
-rw-r--r--prnt/hpijs/dj540.h74
-rw-r--r--prnt/hpijs/dj55xx.h82
-rw-r--r--prnt/hpijs/dj600.cpp220
-rw-r--r--prnt/hpijs/dj600.h100
-rw-r--r--prnt/hpijs/dj600_maps.cpp209
-rw-r--r--prnt/hpijs/dj630.cpp312
-rw-r--r--prnt/hpijs/dj630.h140
-rw-r--r--prnt/hpijs/dj660.cpp232
-rw-r--r--prnt/hpijs/dj660.h103
-rw-r--r--prnt/hpijs/dj660_maps.cpp125
-rw-r--r--prnt/hpijs/dj690.cpp293
-rw-r--r--prnt/hpijs/dj690.h131
-rw-r--r--prnt/hpijs/dj690_maps.cpp291
-rw-r--r--prnt/hpijs/dj6xx.cpp84
-rw-r--r--prnt/hpijs/dj6xx.h94
-rw-r--r--prnt/hpijs/dj850.cpp417
-rw-r--r--prnt/hpijs/dj850.h114
-rw-r--r--prnt/hpijs/dj850_maps.cpp163
-rw-r--r--prnt/hpijs/dj890.cpp78
-rw-r--r--prnt/hpijs/dj890.h70
-rw-r--r--prnt/hpijs/dj895_maps.cpp123
-rw-r--r--prnt/hpijs/dj895_maps2.cpp291
-rw-r--r--prnt/hpijs/dj8x5.cpp208
-rw-r--r--prnt/hpijs/dj8x5.h111
-rw-r--r--prnt/hpijs/dj8xx.cpp580
-rw-r--r--prnt/hpijs/dj8xx.h133
-rw-r--r--prnt/hpijs/dj970_maps.cpp380
-rw-r--r--prnt/hpijs/dj970_maps2.cpp165
-rw-r--r--prnt/hpijs/dj970_maps3.cpp165
-rw-r--r--prnt/hpijs/dj9xx.cpp860
-rw-r--r--prnt/hpijs/dj9xx.h188
-rw-r--r--prnt/hpijs/dj9xxvip.cpp2407
-rw-r--r--prnt/hpijs/dj9xxvip.h417
-rw-r--r--prnt/hpijs/djd2600.h75
-rw-r--r--prnt/hpijs/djgenericvip.cpp813
-rw-r--r--prnt/hpijs/djgenericvip.h284
-rw-r--r--prnt/hpijs/ernieplatform.h137
-rw-r--r--prnt/hpijs/filterhpa.cpp1967
-rw-r--r--prnt/hpijs/filterhpa.h203
-rw-r--r--prnt/hpijs/font.h480
-rw-r--r--prnt/hpijs/foomatic-rip-hplip6744
-rw-r--r--prnt/hpijs/gdevijs-krgb-1.5-gs8.61.patch732
-rw-r--r--prnt/hpijs/global_types.h547
-rw-r--r--prnt/hpijs/globals.cpp288
-rw-r--r--prnt/hpijs/halftoner.cpp469
-rw-r--r--prnt/hpijs/halftoner.h209
-rw-r--r--prnt/hpijs/halftoner_open.cpp511
-rw-r--r--prnt/hpijs/halftoner_open.h102
-rw-r--r--prnt/hpijs/header.h50
-rw-r--r--prnt/hpijs/header2.cpp445
-rw-r--r--prnt/hpijs/hpcupsfax.cpp779
-rw-r--r--prnt/hpijs/hpcupsfax.h66
-rw-r--r--prnt/hpijs/hpijs.cpp862
-rw-r--r--prnt/hpijs/hpijs.h45
-rw-r--r--prnt/hpijs/hpijsfax.cpp607
-rw-r--r--prnt/hpijs/hpijsfax.h286
-rw-r--r--prnt/hpijs/hpiom.c533
-rw-r--r--prnt/hpijs/hpiom.h139
-rw-r--r--prnt/hpijs/hpjbig_wrapper.h49
-rw-r--r--prnt/hpijs/hpprint_c_api.h231
-rw-r--r--prnt/hpijs/hpprintapi.h52
-rw-r--r--prnt/hpijs/hptypes.h78
-rw-r--r--prnt/hpijs/htfed.h131
-rw-r--r--prnt/hpijs/htmtxhi.cpp220
-rw-r--r--prnt/hpijs/ijs.c201
-rw-r--r--prnt/hpijs/ijs.h124
-rw-r--r--prnt/hpijs/ijs_client.h96
-rw-r--r--prnt/hpijs/ijs_server.c895
-rw-r--r--prnt/hpijs/ijs_server.h128
-rw-r--r--prnt/hpijs/internal.h1303
-rw-r--r--prnt/hpijs/interp.h67
-rw-r--r--prnt/hpijs/interp_data_50.h494
-rw-r--r--prnt/hpijs/io_defs.h60
-rw-r--r--prnt/hpijs/jccolor.c534
-rw-r--r--prnt/hpijs/jdatadbf.c174
-rw-r--r--prnt/hpijs/jinclude.h91
-rw-r--r--prnt/hpijs/job.cpp1114
-rw-r--r--prnt/hpijs/job.h161
-rw-r--r--prnt/hpijs/jpegint.h392
-rw-r--r--prnt/hpijs/ldlencap.h222
-rw-r--r--prnt/hpijs/ljcolor.cpp651
-rw-r--r--prnt/hpijs/ljcolor.h168
-rw-r--r--prnt/hpijs/ljfastraster.cpp1274
-rw-r--r--prnt/hpijs/ljfastraster.h183
-rw-r--r--prnt/hpijs/ljjetready.cpp1851
-rw-r--r--prnt/hpijs/ljjetready.h252
-rw-r--r--prnt/hpijs/ljm1005.cpp236
-rw-r--r--prnt/hpijs/ljm1005.h117
-rw-r--r--prnt/hpijs/ljmono.cpp416
-rw-r--r--prnt/hpijs/ljmono.h140
-rw-r--r--prnt/hpijs/ljp1xxx.h111
-rw-r--r--prnt/hpijs/ljzjs.cpp657
-rw-r--r--prnt/hpijs/ljzjs.h213
-rw-r--r--prnt/hpijs/ljzjscolor.cpp541
-rw-r--r--prnt/hpijs/ljzjscolor.h119
-rw-r--r--prnt/hpijs/ljzjsmono.cpp211
-rw-r--r--prnt/hpijs/ljzjsmono.h109
-rw-r--r--prnt/hpijs/models.cpp37
-rw-r--r--prnt/hpijs/models.h129
-rw-r--r--prnt/hpijs/modes.h10
-rw-r--r--prnt/hpijs/ojprokx50.h87
-rw-r--r--prnt/hpijs/phobos_cmaps.cpp422
-rw-r--r--prnt/hpijs/pmselect.cpp295
-rw-r--r--prnt/hpijs/pmselect.h95
-rw-r--r--prnt/hpijs/printer.cpp1289
-rw-r--r--prnt/hpijs/printer.h406
-rw-r--r--prnt/hpijs/printerfactory.cpp527
-rw-r--r--prnt/hpijs/printerfactory.h194
-rw-r--r--prnt/hpijs/printerproxy.cpp166
-rw-r--r--prnt/hpijs/printerproxy.h109
-rw-r--r--prnt/hpijs/pscript.h169
-rw-r--r--prnt/hpijs/psp100.cpp232
-rw-r--r--prnt/hpijs/psp100.h143
-rw-r--r--prnt/hpijs/psp470.h126
-rw-r--r--prnt/hpijs/quickconnect.cpp653
-rw-r--r--prnt/hpijs/quickconnect.h188
-rw-r--r--prnt/hpijs/registry.cpp698
-rw-r--r--prnt/hpijs/resources.h56
-rw-r--r--prnt/hpijs/scaler.cpp159
-rw-r--r--prnt/hpijs/scaler_open.cpp229
-rw-r--r--prnt/hpijs/scaler_open.h60
-rw-r--r--prnt/hpijs/scaler_prop.h61
-rw-r--r--prnt/hpijs/script.cpp830
-rw-r--r--prnt/hpijs/script.h127
-rw-r--r--prnt/hpijs/services.cpp768
-rw-r--r--prnt/hpijs/services.h189
-rw-r--r--prnt/hpijs/systemservices.cpp403
-rw-r--r--prnt/hpijs/systemservices.h333
-rw-r--r--prnt/hpijs/translator.cpp100
-rw-r--r--prnt/hpijs/unistd_.h34
-rw-r--r--prnt/hpijs/version.cpp46
-rw-r--r--prnt/hpijs/versioncode.cpp190
-rw-r--r--prnt/hpps/hppsfilter.c231
-rw-r--r--prnt/ldl.py379
-rw-r--r--prnt/pcl.py56
-rw-r--r--prnt/ps/hp-business_inkjet_2250-ps.ppd.gzbin0 -> 11124 bytes
-rw-r--r--prnt/ps/hp-business_inkjet_2280-ps.ppd.gzbin0 -> 13392 bytes
-rw-r--r--prnt/ps/hp-business_inkjet_2300-ps.ppd.gzbin0 -> 27751 bytes
-rw-r--r--prnt/ps/hp-business_inkjet_2600-ps.ppd.gzbin0 -> 14950 bytes
-rw-r--r--prnt/ps/hp-business_inkjet_2800-ps.ppd.gzbin0 -> 28845 bytes
-rw-r--r--prnt/ps/hp-business_inkjet_3000-ps.ppd.gzbin0 -> 14409 bytes
-rw-r--r--prnt/ps/hp-cm8050_mfp_with_edgeline-ps.ppd.gzbin0 -> 49905 bytes
-rw-r--r--prnt/ps/hp-cm8060_mfp_with_edgeline-ps.ppd.gzbin0 -> 49905 bytes
-rw-r--r--prnt/ps/hp-color_laserjet-ps.ppd.gzbin0 -> 13363 bytes
-rw-r--r--prnt/ps/hp-color_laserjet_2500-ps.ppd.gzbin0 -> 24027 bytes
-rw-r--r--prnt/ps/hp-color_laserjet_2500_series-ps.ppd.gzbin0 -> 24034 bytes
-rw-r--r--prnt/ps/hp-color_laserjet_2550_series-ps.ppd.gzbin0 -> 26437 bytes
-rw-r--r--prnt/ps/hp-color_laserjet_2605-ps.ppd.gzbin0 -> 36518 bytes
-rw-r--r--prnt/ps/hp-color_laserjet_2605dn-ps.ppd.gzbin0 -> 36520 bytes
-rw-r--r--prnt/ps/hp-color_laserjet_2605dtn-ps.ppd.gzbin0 -> 36521 bytes
-rw-r--r--prnt/ps/hp-color_laserjet_2700-ps.ppd.gzbin0 -> 34313 bytes
-rw-r--r--prnt/ps/hp-color_laserjet_2700n-ps.ppd.gzbin0 -> 34314 bytes
-rw-r--r--prnt/ps/hp-color_laserjet_2800-ps.ppd.gzbin0 -> 16272 bytes
-rw-r--r--prnt/ps/hp-color_laserjet_2820-ps.ppd.gzbin0 -> 16272 bytes
-rw-r--r--prnt/ps/hp-color_laserjet_2830-ps.ppd.gzbin0 -> 16272 bytes
-rw-r--r--prnt/ps/hp-color_laserjet_2840-ps.ppd.gzbin0 -> 16272 bytes
-rw-r--r--prnt/ps/hp-color_laserjet_3000-ps.ppd.gzbin0 -> 40486 bytes
-rw-r--r--prnt/ps/hp-color_laserjet_3700-ps.ppd.gzbin0 -> 31259 bytes
-rw-r--r--prnt/ps/hp-color_laserjet_3700n-ps.ppd.gzbin0 -> 31260 bytes
-rw-r--r--prnt/ps/hp-color_laserjet_3800-ps.ppd.gzbin0 -> 41637 bytes
-rw-r--r--prnt/ps/hp-color_laserjet_4500-ps.ppd.gzbin0 -> 25320 bytes
-rw-r--r--prnt/ps/hp-color_laserjet_4550-ps.ppd.gzbin0 -> 29925 bytes
-rw-r--r--prnt/ps/hp-color_laserjet_4600-ps.ppd.gzbin0 -> 35666 bytes
-rw-r--r--prnt/ps/hp-color_laserjet_4600_series-ps.ppd.gzbin0 -> 35673 bytes
-rw-r--r--prnt/ps/hp-color_laserjet_4610-ps.ppd.gzbin0 -> 8688 bytes
-rw-r--r--prnt/ps/hp-color_laserjet_4650-ps.ppd.gzbin0 -> 35635 bytes
-rw-r--r--prnt/ps/hp-color_laserjet_4700-ps.ppd.gzbin0 -> 44175 bytes
-rw-r--r--prnt/ps/hp-color_laserjet_4730mfp-ps.ppd.gzbin0 -> 41293 bytes
-rw-r--r--prnt/ps/hp-color_laserjet_5500-ps.ppd.gzbin0 -> 35559 bytes
-rw-r--r--prnt/ps/hp-color_laserjet_5550-ps.ppd.gzbin0 -> 40042 bytes
-rw-r--r--prnt/ps/hp-color_laserjet_5m-ps.ppd.gzbin0 -> 13713 bytes
-rw-r--r--prnt/ps/hp-color_laserjet_8500-ps.ppd.gzbin0 -> 21160 bytes
-rw-r--r--prnt/ps/hp-color_laserjet_8550-ps.ppd.gzbin0 -> 31373 bytes
-rw-r--r--prnt/ps/hp-color_laserjet_9500-ps.ppd.gzbin0 -> 41590 bytes
-rw-r--r--prnt/ps/hp-color_laserjet_9500_mfp-ps.ppd.gzbin0 -> 46286 bytes
-rw-r--r--prnt/ps/hp-color_laserjet_cm1015-ps.ppd.gzbin0 -> 33078 bytes
-rw-r--r--prnt/ps/hp-color_laserjet_cm1017-ps.ppd.gzbin0 -> 33078 bytes
-rw-r--r--prnt/ps/hp-color_laserjet_cm1312_mfp-ps.ppd.gzbin0 -> 41340 bytes
-rw-r--r--prnt/ps/hp-color_laserjet_cm1312nfi_mfp-ps.ppd.gzbin0 -> 41343 bytes
-rw-r--r--prnt/ps/hp-color_laserjet_cm2320_mfp-ps.ppd.gzbin0 -> 43378 bytes
-rw-r--r--prnt/ps/hp-color_laserjet_cm2320fxi_mfp-ps.ppd.gzbin0 -> 43381 bytes
-rw-r--r--prnt/ps/hp-color_laserjet_cm2320n_mfp-ps.ppd.gzbin0 -> 43379 bytes
-rw-r--r--prnt/ps/hp-color_laserjet_cm2320nf_mfp-ps.ppd.gzbin0 -> 43380 bytes
-rw-r--r--prnt/ps/hp-color_laserjet_cm3530_mfp-ps.ppd.gzbin0 -> 45108 bytes
-rw-r--r--prnt/ps/hp-color_laserjet_cm4540_mfp-ps.ppd.gzbin0 -> 42125 bytes
-rw-r--r--prnt/ps/hp-color_laserjet_cm4730_mfp-ps.ppd.gzbin0 -> 44208 bytes
-rw-r--r--prnt/ps/hp-color_laserjet_cm6030_mfp-ps.ppd.gzbin0 -> 58246 bytes
-rw-r--r--prnt/ps/hp-color_laserjet_cm6040_mfp-ps.ppd.gzbin0 -> 58205 bytes
-rw-r--r--prnt/ps/hp-color_laserjet_cm6049_mfp-ps.ppd.gzbin0 -> 58226 bytes
-rw-r--r--prnt/ps/hp-color_laserjet_cp1514n-ps.ppd.gzbin0 -> 39039 bytes
-rw-r--r--prnt/ps/hp-color_laserjet_cp1515n-ps.ppd.gzbin0 -> 39039 bytes
-rw-r--r--prnt/ps/hp-color_laserjet_cp1518ni-ps.ppd.gzbin0 -> 39040 bytes
-rw-r--r--prnt/ps/hp-color_laserjet_cp2025-ps.ppd.gzbin0 -> 37929 bytes
-rw-r--r--prnt/ps/hp-color_laserjet_cp2025dn-ps.ppd.gzbin0 -> 40127 bytes
-rw-r--r--prnt/ps/hp-color_laserjet_cp2025n-ps.ppd.gzbin0 -> 37930 bytes
-rw-r--r--prnt/ps/hp-color_laserjet_cp2025x-ps.ppd.gzbin0 -> 37930 bytes
-rw-r--r--prnt/ps/hp-color_laserjet_cp3505-ps.ppd.gzbin0 -> 42905 bytes
-rw-r--r--prnt/ps/hp-color_laserjet_cp3525-ps.ppd.gzbin0 -> 53168 bytes
-rw-r--r--prnt/ps/hp-color_laserjet_cp4005-ps.ppd.gzbin0 -> 39461 bytes
-rw-r--r--prnt/ps/hp-color_laserjet_cp4020_series-ps.ppd.gzbin0 -> 53308 bytes
-rw-r--r--prnt/ps/hp-color_laserjet_cp4520_series-ps.ppd.gzbin0 -> 53308 bytes
-rw-r--r--prnt/ps/hp-color_laserjet_cp5225-ps.ppd.gzbin0 -> 42145 bytes
-rw-r--r--prnt/ps/hp-color_laserjet_cp5225dn-ps.ppd.gzbin0 -> 43926 bytes
-rw-r--r--prnt/ps/hp-color_laserjet_cp5225n-ps.ppd.gzbin0 -> 42203 bytes
-rw-r--r--prnt/ps/hp-color_laserjet_cp5520_series-ps.ppd.gzbin0 -> 39970 bytes
-rw-r--r--prnt/ps/hp-color_laserjet_cp6015-ps.ppd.gzbin0 -> 63925 bytes
-rw-r--r--prnt/ps/hp-designjet_4000ps.ppd.gzbin0 -> 12140 bytes
-rw-r--r--prnt/ps/hp-designjet_4020ps-ps.ppd.gzbin0 -> 12149 bytes
-rw-r--r--prnt/ps/hp-designjet_4500mfp.ppd.gzbin0 -> 11833 bytes
-rw-r--r--prnt/ps/hp-designjet_4500ps.ppd.gzbin0 -> 11831 bytes
-rw-r--r--prnt/ps/hp-designjet_4520mfp-ps.ppd.gzbin0 -> 11758 bytes
-rw-r--r--prnt/ps/hp-designjet_4520ps-ps.ppd.gzbin0 -> 11757 bytes
-rw-r--r--prnt/ps/hp-designjet_t1100ps_24in-ps.ppd.gzbin0 -> 11819 bytes
-rw-r--r--prnt/ps/hp-designjet_t1100ps_44in-ps.ppd.gzbin0 -> 13268 bytes
-rw-r--r--prnt/ps/hp-designjet_t1120ps_24in-ps.ppd.gzbin0 -> 11817 bytes
-rw-r--r--prnt/ps/hp-designjet_t1120ps_44in-ps.ppd.gzbin0 -> 13267 bytes
-rw-r--r--prnt/ps/hp-designjet_t1200_postscript-ps.ppd.gzbin0 -> 13317 bytes
-rw-r--r--prnt/ps/hp-designjet_t1300_postscript-ps.ppd.gzbin0 -> 13500 bytes
-rw-r--r--prnt/ps/hp-designjet_t2300_postscript-ps.ppd.gzbin0 -> 13455 bytes
-rw-r--r--prnt/ps/hp-designjet_t7100ps-ps.ppd.gzbin0 -> 13226 bytes
-rw-r--r--prnt/ps/hp-designjet_t7100ps_monochrome-ps.ppd.gzbin0 -> 11228 bytes
-rw-r--r--prnt/ps/hp-designjet_t770_postscript-ps.ppd.gzbin0 -> 12409 bytes
-rw-r--r--prnt/ps/hp-designjet_t770ps_24in-ps.ppd.gzbin0 -> 10960 bytes
-rw-r--r--prnt/ps/hp-designjet_t790ps_24in-ps.ppd.gzbin0 -> 11204 bytes
-rw-r--r--prnt/ps/hp-designjet_t790ps_44in-ps.ppd.gzbin0 -> 12642 bytes
-rw-r--r--prnt/ps/hp-designjet_z6100ps_42in_photo-ps.ppd.gzbin0 -> 11872 bytes
-rw-r--r--prnt/ps/hp-designjet_z6100ps_60in_photo-ps.ppd.gzbin0 -> 11852 bytes
-rw-r--r--prnt/ps/hp-designjet_z6200_42in_photo-ps.ppd.gzbin0 -> 12177 bytes
-rw-r--r--prnt/ps/hp-designjet_z6200_60in_photo-ps.ppd.gzbin0 -> 12176 bytes
-rw-r--r--prnt/ps/hp-laserjet_100_color_mfp_m175-ps.ppd.gzbin0 -> 37182 bytes
-rw-r--r--prnt/ps/hp-laserjet_1200-ps.ppd.gzbin0 -> 19297 bytes
-rw-r--r--prnt/ps/hp-laserjet_1200n-ps.ppd.gzbin0 -> 19298 bytes
-rw-r--r--prnt/ps/hp-laserjet_1220-ps.ppd.gzbin0 -> 15088 bytes
-rw-r--r--prnt/ps/hp-laserjet_1220se-ps.ppd.gzbin0 -> 15090 bytes
-rw-r--r--prnt/ps/hp-laserjet_1300-ps.ppd.gzbin0 -> 20400 bytes
-rw-r--r--prnt/ps/hp-laserjet_1300n-ps.ppd.gzbin0 -> 20401 bytes
-rw-r--r--prnt/ps/hp-laserjet_1300xi-ps.ppd.gzbin0 -> 20402 bytes
-rw-r--r--prnt/ps/hp-laserjet_1320-ps.ppd.gzbin0 -> 27403 bytes
-rw-r--r--prnt/ps/hp-laserjet_1320_series-ps.ppd.gzbin0 -> 27410 bytes
-rw-r--r--prnt/ps/hp-laserjet_1320n-ps.ppd.gzbin0 -> 27404 bytes
-rw-r--r--prnt/ps/hp-laserjet_1320nw-ps.ppd.gzbin0 -> 27405 bytes
-rw-r--r--prnt/ps/hp-laserjet_1320tn-ps.ppd.gzbin0 -> 27405 bytes
-rw-r--r--prnt/ps/hp-laserjet_200_colormfp_m275-ps.ppd.gzbin0 -> 35828 bytes
-rw-r--r--prnt/ps/hp-laserjet_2100-ps.ppd.gzbin0 -> 19075 bytes
-rw-r--r--prnt/ps/hp-laserjet_2100_series-ps.ppd.gzbin0 -> 19082 bytes
-rw-r--r--prnt/ps/hp-laserjet_2200-ps.ppd.gzbin0 -> 25614 bytes
-rw-r--r--prnt/ps/hp-laserjet_2200_series-ps.ppd.gzbin0 -> 25621 bytes
-rw-r--r--prnt/ps/hp-laserjet_2300-ps.ppd.gzbin0 -> 28184 bytes
-rw-r--r--prnt/ps/hp-laserjet_2300_series-ps.ppd.gzbin0 -> 28191 bytes
-rw-r--r--prnt/ps/hp-laserjet_2410-ps.ppd.gzbin0 -> 29862 bytes
-rw-r--r--prnt/ps/hp-laserjet_2420-ps.ppd.gzbin0 -> 31974 bytes
-rw-r--r--prnt/ps/hp-laserjet_2430-ps.ppd.gzbin0 -> 32989 bytes
-rw-r--r--prnt/ps/hp-laserjet_3015-ps.ppd.gzbin0 -> 11489 bytes
-rw-r--r--prnt/ps/hp-laserjet_3020-ps.ppd.gzbin0 -> 14707 bytes
-rw-r--r--prnt/ps/hp-laserjet_3030-ps.ppd.gzbin0 -> 14707 bytes
-rw-r--r--prnt/ps/hp-laserjet_3050-ps.ppd.gzbin0 -> 28540 bytes
-rw-r--r--prnt/ps/hp-laserjet_3052-ps.ppd.gzbin0 -> 28552 bytes
-rw-r--r--prnt/ps/hp-laserjet_3200m-ps.ppd.gzbin0 -> 15048 bytes
-rw-r--r--prnt/ps/hp-laserjet_3300_3310_3320-ps.ppd.gzbin0 -> 19360 bytes
-rw-r--r--prnt/ps/hp-laserjet_3380-ps.ppd.gzbin0 -> 19600 bytes
-rw-r--r--prnt/ps/hp-laserjet_3390-ps.ppd.gzbin0 -> 32618 bytes
-rw-r--r--prnt/ps/hp-laserjet_4-ps.ppd.gzbin0 -> 3326 bytes
-rw-r--r--prnt/ps/hp-laserjet_4000_series-ps.ppd.gzbin0 -> 28616 bytes
-rw-r--r--prnt/ps/hp-laserjet_4050_series-ps.ppd.gzbin0 -> 30822 bytes
-rw-r--r--prnt/ps/hp-laserjet_4100_mfp-ps.ppd.gzbin0 -> 32181 bytes
-rw-r--r--prnt/ps/hp-laserjet_4100_series-ps.ppd.gzbin0 -> 32435 bytes
-rw-r--r--prnt/ps/hp-laserjet_4200-ps.ppd.gzbin0 -> 36994 bytes
-rw-r--r--prnt/ps/hp-laserjet_4240-ps.ppd.gzbin0 -> 40869 bytes
-rw-r--r--prnt/ps/hp-laserjet_4250-ps.ppd.gzbin0 -> 40583 bytes
-rw-r--r--prnt/ps/hp-laserjet_4300-ps.ppd.gzbin0 -> 36987 bytes
-rw-r--r--prnt/ps/hp-laserjet_4345_mfp-ps.ppd.gzbin0 -> 38444 bytes
-rw-r--r--prnt/ps/hp-laserjet_4350-ps.ppd.gzbin0 -> 40634 bytes
-rw-r--r--prnt/ps/hp-laserjet_4_plus-ps.ppd.gzbin0 -> 7753 bytes
-rw-r--r--prnt/ps/hp-laserjet_4ml-ps.ppd.gzbin0 -> 6339 bytes
-rw-r--r--prnt/ps/hp-laserjet_4mp-ps.ppd.gzbin0 -> 6148 bytes
-rw-r--r--prnt/ps/hp-laserjet_4si-ps.ppd.gzbin0 -> 12284 bytes
-rw-r--r--prnt/ps/hp-laserjet_4v-ps.ppd.gzbin0 -> 16705 bytes
-rw-r--r--prnt/ps/hp-laserjet_5000-ps.ppd.gzbin0 -> 33183 bytes
-rw-r--r--prnt/ps/hp-laserjet_5000_series-ps.ppd.gzbin0 -> 33190 bytes
-rw-r--r--prnt/ps/hp-laserjet_500_color_m551-ps.ppd.gzbin0 -> 34414 bytes
-rw-r--r--prnt/ps/hp-laserjet_5100_series-ps.ppd.gzbin0 -> 37651 bytes
-rw-r--r--prnt/ps/hp-laserjet_5200-ps.ppd.gzbin0 -> 43679 bytes
-rw-r--r--prnt/ps/hp-laserjet_5200l-ps.ppd.gzbin0 -> 18828 bytes
-rw-r--r--prnt/ps/hp-laserjet_5200lx-ps.ppd.gzbin0 -> 39816 bytes
-rw-r--r--prnt/ps/hp-laserjet_5mp-ps.ppd.gzbin0 -> 12329 bytes
-rw-r--r--prnt/ps/hp-laserjet_5p-ps.ppd.gzbin0 -> 12328 bytes
-rw-r--r--prnt/ps/hp-laserjet_5si-ps.ppd.gzbin0 -> 25693 bytes
-rw-r--r--prnt/ps/hp-laserjet_5si_mopier-ps.ppd.gzbin0 -> 25542 bytes
-rw-r--r--prnt/ps/hp-laserjet_600_m601_m602_m603-ps.ppd.gzbin0 -> 36638 bytes
-rw-r--r--prnt/ps/hp-laserjet_6mp-ps.ppd.gzbin0 -> 13726 bytes
-rw-r--r--prnt/ps/hp-laserjet_6p-ps.ppd.gzbin0 -> 13725 bytes
-rw-r--r--prnt/ps/hp-laserjet_8000-ps.ppd.gzbin0 -> 42225 bytes
-rw-r--r--prnt/ps/hp-laserjet_8000_series-ps.ppd.gzbin0 -> 42232 bytes
-rw-r--r--prnt/ps/hp-laserjet_8100_mfp-ps.ppd.gzbin0 -> 42231 bytes
-rw-r--r--prnt/ps/hp-laserjet_8100_series-ps.ppd.gzbin0 -> 42234 bytes
-rw-r--r--prnt/ps/hp-laserjet_8150_mfp-ps.ppd.gzbin0 -> 41858 bytes
-rw-r--r--prnt/ps/hp-laserjet_9000_mfp-ps.ppd.gzbin0 -> 37169 bytes
-rw-r--r--prnt/ps/hp-laserjet_9000_series-ps.ppd.gzbin0 -> 39534 bytes
-rw-r--r--prnt/ps/hp-laserjet_9040-ps.ppd.gzbin0 -> 45357 bytes
-rw-r--r--prnt/ps/hp-laserjet_9040_mfp-ps.ppd.gzbin0 -> 45116 bytes
-rw-r--r--prnt/ps/hp-laserjet_9050-ps.ppd.gzbin0 -> 45360 bytes
-rw-r--r--prnt/ps/hp-laserjet_9050_mfp-ps.ppd.gzbin0 -> 45116 bytes
-rw-r--r--prnt/ps/hp-laserjet_9055mfp-ps.ppd.gzbin0 -> 48426 bytes
-rw-r--r--prnt/ps/hp-laserjet_9065mfp-ps.ppd.gzbin0 -> 48426 bytes
-rw-r--r--prnt/ps/hp-laserjet_cm1410_series-ps.ppd.gzbin0 -> 37738 bytes
-rw-r--r--prnt/ps/hp-laserjet_cp1520_series-ps.ppd.gzbin0 -> 38796 bytes
-rw-r--r--prnt/ps/hp-laserjet_m1522_mfp-ps.ppd.gzbin0 -> 25451 bytes
-rw-r--r--prnt/ps/hp-laserjet_m1522n_mfp-ps.ppd.gzbin0 -> 25452 bytes
-rw-r--r--prnt/ps/hp-laserjet_m1522nf_mfp-ps.ppd.gzbin0 -> 25453 bytes
-rw-r--r--prnt/ps/hp-laserjet_m1530_mfp_series-ps.ppd.gzbin0 -> 27131 bytes
-rw-r--r--prnt/ps/hp-laserjet_m2727_mfp_series-ps.ppd.gzbin0 -> 31195 bytes
-rw-r--r--prnt/ps/hp-laserjet_m3027_mfp-ps.ppd.gzbin0 -> 35716 bytes
-rw-r--r--prnt/ps/hp-laserjet_m3035_mfp-ps.ppd.gzbin0 -> 35717 bytes
-rw-r--r--prnt/ps/hp-laserjet_m4345_mfp-ps.ppd.gzbin0 -> 41508 bytes
-rw-r--r--prnt/ps/hp-laserjet_m4349_mfp-ps.ppd.gzbin0 -> 41512 bytes
-rw-r--r--prnt/ps/hp-laserjet_m4555_mfp-ps.ppd.gzbin0 -> 43924 bytes
-rw-r--r--prnt/ps/hp-laserjet_m5025_mfp-ps.ppd.gzbin0 -> 43695 bytes
-rw-r--r--prnt/ps/hp-laserjet_m5035_mfp-ps.ppd.gzbin0 -> 43697 bytes
-rw-r--r--prnt/ps/hp-laserjet_m9040_mfp-ps.ppd.gzbin0 -> 52869 bytes
-rw-r--r--prnt/ps/hp-laserjet_m9050_mfp-ps.ppd.gzbin0 -> 52869 bytes
-rw-r--r--prnt/ps/hp-laserjet_m9059_mfp-ps.ppd.gzbin0 -> 52362 bytes
-rw-r--r--prnt/ps/hp-laserjet_p2015_series-ps.ppd.gzbin0 -> 35974 bytes
-rw-r--r--prnt/ps/hp-laserjet_p2055_series-ps.ppd.gzbin0 -> 33797 bytes
-rw-r--r--prnt/ps/hp-laserjet_p3004-ps.ppd.gzbin0 -> 35756 bytes
-rw-r--r--prnt/ps/hp-laserjet_p3005-ps.ppd.gzbin0 -> 38576 bytes
-rw-r--r--prnt/ps/hp-laserjet_p3010_series-ps.ppd.gzbin0 -> 40278 bytes
-rw-r--r--prnt/ps/hp-laserjet_p4010_series-ps.ppd.gzbin0 -> 51838 bytes
-rw-r--r--prnt/ps/hp-lj_300_400_color_m351_m451-ps.ppd.gzbin0 -> 38347 bytes
-rw-r--r--prnt/ps/hp-lj_300_400_color_mfp_m375_m475-ps.ppd.gzbin0 -> 27863 bytes
-rw-r--r--prnt/ps/hp-mopier_240-ps.ppd.gzbin0 -> 42196 bytes
-rw-r--r--prnt/ps/hp-mopier_320-ps.ppd.gzbin0 -> 42195 bytes
-rw-r--r--prnt/ps/hp-officejet_pro_8000_enterprise_a811a-ps.ppd.gzbin0 -> 34923 bytes
-rwxr-xr-xprobe.py218
-rwxr-xr-xquery.py165
-rwxr-xr-xscan.py1134
-rw-r--r--scan/__init__.py19
-rwxr-xr-xscan/sane.py635
-rw-r--r--scan/sane/bb_ledm.c1075
-rwxr-xr-xscan/sane/common.c299
-rw-r--r--scan/sane/common.h188
-rw-r--r--scan/sane/hpaio.c3458
-rw-r--r--scan/sane/hpaio.desc2448
-rw-r--r--scan/sane/hpaio.h277
-rw-r--r--scan/sane/http.c618
-rwxr-xr-xscan/sane/http.h55
-rwxr-xr-xscan/sane/io.c140
-rwxr-xr-xscan/sane/io.h58
-rw-r--r--scan/sane/ledm.c1015
-rw-r--r--scan/sane/ledm.h43
-rw-r--r--scan/sane/ledmi.h163
-rw-r--r--scan/sane/marvell.c1009
-rwxr-xr-xscan/sane/marvell.h42
-rw-r--r--scan/sane/marvelli.h135
-rwxr-xr-xscan/sane/mfpdtf.c535
-rwxr-xr-xscan/sane/mfpdtf.h342
-rwxr-xr-xscan/sane/pml.c1056
-rwxr-xr-xscan/sane/pml.h181
-rwxr-xr-xscan/sane/sane.h213
-rw-r--r--scan/sane/sanei.h170
-rw-r--r--scan/sane/sanei_debug.h176
-rw-r--r--scan/sane/sanei_init_debug.c109
-rwxr-xr-xscan/sane/saneopts.h397
-rwxr-xr-xscan/sane/scl.c379
-rwxr-xr-xscan/sane/scl.h202
-rw-r--r--scan/sane/soap.c1038
-rwxr-xr-xscan/sane/soap.h42
-rw-r--r--scan/sane/soapht.c1151
-rwxr-xr-xscan/sane/soapht.h42
-rw-r--r--scan/sane/soaphti.h164
-rw-r--r--scan/sane/soapi.h138
-rwxr-xr-xscan/sane/tables.h19481
-rw-r--r--scan/sane/xml.c126
-rw-r--r--scan/sane/xml.h36
-rwxr-xr-xscan/scanext/scanext.c748
-rwxr-xr-xsendfax.py572
-rwxr-xr-xsetup.py912
-rw-r--r--systray.py145
-rwxr-xr-xtestpage.py169
-rwxr-xr-xtimedate.py105
-rwxr-xr-xtoolbox.py268
-rw-r--r--ui/__init__.py22
-rw-r--r--ui/aboutdlg.py41
-rw-r--r--ui/aboutdlg_base.py114
-rw-r--r--ui/aboutdlg_base.ui259
-rw-r--r--ui/align10form.py65
-rw-r--r--ui/align10form_base.py148
-rw-r--r--ui/align10form_base.ui291
-rw-r--r--ui/align13form.py34
-rw-r--r--ui/align13form_base.py50
-rw-r--r--ui/align13form_base.ui66
-rw-r--r--ui/alignform.py123
-rw-r--r--ui/aligntype6form1.py29
-rw-r--r--ui/aligntype6form1_base.py67
-rw-r--r--ui/aligntype6form1_base.ui85
-rw-r--r--ui/aligntype6form2.py28
-rw-r--r--ui/aligntype6form2_base.py63
-rw-r--r--ui/aligntype6form2_base.ui75
-rw-r--r--ui/allowabletypesdlg.py33
-rw-r--r--ui/allowabletypesdlg_base.py74
-rw-r--r--ui/allowabletypesdlg_base.ui140
-rw-r--r--ui/choosedevicedlg.py107
-rw-r--r--ui/chooseprinterdlg.py193
-rw-r--r--ui/cleaningform.py58
-rw-r--r--ui/cleaningform2.py37
-rw-r--r--ui/cleaningform2_base.py74
-rw-r--r--ui/cleaningform2_base.ui122
-rw-r--r--ui/cleaningform_base.py72
-rw-r--r--ui/cleaningform_base.ui139
-rw-r--r--ui/coloradjform.py41
-rw-r--r--ui/coloradjform_base.py257
-rw-r--r--ui/coloradjform_base.ui460
-rw-r--r--ui/colorcal4form.py56
-rw-r--r--ui/colorcal4form_base.py237
-rw-r--r--ui/colorcal4form_base.ui668
-rw-r--r--ui/colorcalform.py33
-rw-r--r--ui/colorcalform2.py40
-rw-r--r--ui/colorcalform2_base.py112
-rw-r--r--ui/colorcalform2_base.ui222
-rw-r--r--ui/colorcalform_base.py118
-rw-r--r--ui/colorcalform_base.ui176
-rw-r--r--ui/coverpageform.py82
-rw-r--r--ui/coverpageform_base.py149
-rw-r--r--ui/coverpageform_base.ui328
-rw-r--r--ui/deviceuricombobox.py159
-rw-r--r--ui/devmgr4.py3258
-rw-r--r--ui/devmgr4_base.py576
-rw-r--r--ui/devmgr4_base.ui1161
-rw-r--r--ui/faxaddrbookeditform_base.py197
-rw-r--r--ui/faxaddrbookeditform_base.ui357
-rw-r--r--ui/faxaddrbookform.py492
-rw-r--r--ui/faxaddrbookform_base.py148
-rw-r--r--ui/faxaddrbookform_base.ui297
-rw-r--r--ui/faxaddrbookgroupeditform_base.py95
-rw-r--r--ui/faxaddrbookgroupeditform_base.ui145
-rw-r--r--ui/faxaddrbookgroupsform_base.py106
-rw-r--r--ui/faxaddrbookgroupsform_base.ui167
-rw-r--r--ui/faxsendjobform.py235
-rw-r--r--ui/faxsettingsform.py119
-rw-r--r--ui/faxsettingsform_base.py157
-rw-r--r--ui/faxsettingsform_base.ui257
-rw-r--r--ui/firmwaredialog.py117
-rw-r--r--ui/firmwaredialog_base.py66
-rw-r--r--ui/firmwaredialog_base.ui246
-rw-r--r--ui/imagepropertiesdlg.py44
-rw-r--r--ui/imagepropertiesdlg_base.py111
-rw-r--r--ui/imagepropertiesdlg_base.ui178
-rw-r--r--ui/jobstoragemixin.py643
-rw-r--r--ui/loadpaperform.py37
-rw-r--r--ui/loadpaperform_base.py71
-rw-r--r--ui/loadpaperform_base.ui99
-rw-r--r--ui/makecopiesform.py173
-rw-r--r--ui/nodevicesform.py76
-rw-r--r--ui/nodevicesform_base.py88
-rw-r--r--ui/nodevicesform_base.ui163
-rw-r--r--ui/paperedgealignform.py42
-rw-r--r--ui/paperedgealignform_base.py143
-rw-r--r--ui/paperedgealignform_base.ui246
-rw-r--r--ui/pluginform2.py270
-rw-r--r--ui/pluginform2_base.py125
-rw-r--r--ui/pluginform2_base.ui227
-rw-r--r--ui/pluginlicenseform.py23
-rw-r--r--ui/pluginlicenseform_base.py75
-rw-r--r--ui/pluginlicenseform_base.ui118
-rw-r--r--ui/printerform.py165
-rw-r--r--ui/scrollcopy.py552
-rw-r--r--ui/scrollfax.py1314
-rw-r--r--ui/scrollprint.py1088
-rw-r--r--ui/scrollprintsettings.py1069
-rw-r--r--ui/scrollunload.py648
-rw-r--r--ui/scrollview.py475
-rw-r--r--ui/settingsdialog.py202
-rw-r--r--ui/settingsdialog_base.py292
-rw-r--r--ui/settingsdialog_base.ui503
-rw-r--r--ui/setupform.py1112
-rw-r--r--ui/setupform_base.py540
-rw-r--r--ui/setupform_base.ui965
-rw-r--r--ui/setupmanualfind.py57
-rw-r--r--ui/setupmanualfind_base.py86
-rw-r--r--ui/setupmanualfind_base.ui154
-rw-r--r--ui/setupsettings.py121
-rw-r--r--ui/setupsettings_base.py217
-rw-r--r--ui/setupsettings_base.ui417
-rw-r--r--ui/systemtray.py578
-rw-r--r--ui/ui_utils.py72
-rw-r--r--ui/unloadform.py147
-rw-r--r--ui/upgradeform.py136
-rw-r--r--ui/upgradeform_base.py86
-rw-r--r--ui/waitform.py64
-rw-r--r--ui/waitform_base.py63
-rw-r--r--ui/waitform_base.ui124
-rw-r--r--ui4/__init__.py19
-rw-r--r--ui4/aboutdialog.py58
-rw-r--r--ui4/aboutdialog_base.py119
-rw-r--r--ui4/aboutdialog_base.ui274
-rw-r--r--ui4/aligndialog.py768
-rw-r--r--ui4/aligndialog_base.py376
-rw-r--r--ui4/aligndialog_base.ui850
-rw-r--r--ui4/cleandialog.py346
-rw-r--r--ui4/cleandialog_base.py169
-rw-r--r--ui4/cleandialog_base.ui313
-rw-r--r--ui4/colorcaldialog.py435
-rw-r--r--ui4/colorcaldialog_base.py326
-rw-r--r--ui4/colorcaldialog_base.ui810
-rw-r--r--ui4/devicesetupdialog.py297
-rw-r--r--ui4/devicesetupdialog_base.py85
-rw-r--r--ui4/devicesetupdialog_base.ui179
-rw-r--r--ui4/deviceuricombobox.py163
-rw-r--r--ui4/devmgr5.py2260
-rw-r--r--ui4/devmgr5_base.py428
-rw-r--r--ui4/devmgr5_base.ui728
-rw-r--r--ui4/fabgrouptable.py75
-rw-r--r--ui4/fabnametable.py37
-rw-r--r--ui4/fabwindow.py607
-rw-r--r--ui4/fabwindow_base.py159
-rw-r--r--ui4/fabwindow_base.ui235
-rw-r--r--ui4/faxsetupdialog.py307
-rw-r--r--ui4/faxsetupdialog_base.py102
-rw-r--r--ui4/faxsetupdialog_base.ui170
-rw-r--r--ui4/filetable.py405
-rw-r--r--ui4/firmwaredialog.py108
-rw-r--r--ui4/firmwaredialog_base.py67
-rw-r--r--ui4/firmwaredialog_base.ui114
-rw-r--r--ui4/infodialog.py310
-rw-r--r--ui4/infodialog_base.py103
-rw-r--r--ui4/infodialog_base.ui179
-rw-r--r--ui4/linefeedcaldialog.py125
-rw-r--r--ui4/linefeedcaldialog_base.py56
-rw-r--r--ui4/linefeedcaldialog_base.ui102
-rw-r--r--ui4/loadpapergroupbox.py103
-rw-r--r--ui4/makecopiesdialog.py91
-rw-r--r--ui4/makecopiesdialog_base.py52
-rw-r--r--ui4/makecopiesdialog_base.ui89
-rw-r--r--ui4/mimetypesdialog.py58
-rw-r--r--ui4/mimetypesdialog_base.py67
-rw-r--r--ui4/mimetypesdialog_base.ui123
-rw-r--r--ui4/nodevicesdialog.py81
-rw-r--r--ui4/nodevicesdialog_base.py70
-rw-r--r--ui4/nodevicesdialog_base.ui136
-rw-r--r--ui4/plugindiagnose.py113
-rw-r--r--ui4/plugindiagnose_base.py70
-rw-r--r--ui4/plugindiagnose_base.ui85
-rw-r--r--ui4/plugindialog.py378
-rw-r--r--ui4/plugindialog_base.py117
-rw-r--r--ui4/plugindialog_base.ui219
-rw-r--r--ui4/pluginlicensedialog.py50
-rw-r--r--ui4/pluginlicensedialog_base.py87
-rw-r--r--ui4/pluginlicensedialog_base.ui179
-rw-r--r--ui4/pqdiagdialog.py124
-rw-r--r--ui4/pqdiagdialog_base.py56
-rw-r--r--ui4/pqdiagdialog_base.ui102
-rw-r--r--ui4/printdialog.py352
-rw-r--r--ui4/printdialog_base.py109
-rw-r--r--ui4/printdialog_base.ui169
-rw-r--r--ui4/printernamecombobox.py155
-rw-r--r--ui4/printsettingsdialog.py114
-rw-r--r--ui4/printsettingsdialog_base.py57
-rw-r--r--ui4/printsettingsdialog_base.ui91
-rw-r--r--ui4/printsettingstoolbox.py2013
-rw-r--r--ui4/printtestpagedialog.py157
-rw-r--r--ui4/printtestpagedialog_base.py77
-rw-r--r--ui4/printtestpagedialog_base.ui142
-rw-r--r--ui4/queuesconf.py181
-rw-r--r--ui4/readonlyradiobutton.py64
-rw-r--r--ui4/sendfaxdialog.py1050
-rw-r--r--ui4/sendfaxdialog_base.py388
-rw-r--r--ui4/sendfaxdialog_base.ui711
-rw-r--r--ui4/settingsdialog.py106
-rw-r--r--ui4/settingsdialog_base.py237
-rw-r--r--ui4/settingsdialog_base.ui542
-rw-r--r--ui4/setupdialog.py1323
-rw-r--r--ui4/setupdialog_base.py383
-rw-r--r--ui4/setupdialog_base.ui654
-rw-r--r--ui4/systemtray.py810
-rw-r--r--ui4/systrayframe.py216
-rw-r--r--ui4/systrayframe_base.py110
-rw-r--r--ui4/systrayframe_base.ui246
-rw-r--r--ui4/ui_utils.py553
-rw-r--r--ui4/upgradedialog.py127
-rw-r--r--ui4/upgradedialog_base.py62
-rw-r--r--ui4/upgradedialog_base.ui143
-rw-r--r--ui4/wifisetupdialog.py839
-rw-r--r--ui4/wifisetupdialog_base.py722
-rw-r--r--ui4/wifisetupdialog_base.ui1102
-rwxr-xr-xuninstall.py132
-rwxr-xr-xunload.py760
-rw-r--r--unreleased.inc2
-rwxr-xr-xupgrade.py365
-rwxr-xr-xwificonfig.py82
2683 files changed, 487007 insertions, 0 deletions
diff --git a/COPYING b/COPYING
new file mode 100644
index 0000000..7a20030
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,355 @@
+The GPL license applies to the files in these directories:
+
+base
+data
+data/pcl
+data/ps
+data/ldl
+data/xml
+data/images
+ip
+pcard
+pcard/pcardext
+prnt
+prnt/cupsext
+scan
+ui
+io/mudext
+
+
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+
+
+The MIT license applies to the files in these directories:
+
+prnt/backend
+io/hpmud
+scan/sane
+
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+and associated documentation files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom
+the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies
+or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+
+The BSD license applies to the files in these directories:
+
+prnt/hpijs
+
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+3. Neither the name of the Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+
+
diff --git a/Makefile.am b/Makefile.am
new file mode 100644
index 0000000..e3ca23a
--- /dev/null
+++ b/Makefile.am
@@ -0,0 +1,585 @@
+#
+# Makefile.am - hplip automake input file
+#
+# (c) 2004-2015 Copyright Hewlett-Packard Development Company, LP
+# Author: David Suffield, Naga Samrat Chowdary Narla, Sarbeswar Meher
+
+INCLUDES = -Iip -Iio/hpmud -Iscan/sane -Iprnt/hpijs
+
+hplipdir = $(datadir)/hplip
+
+docdir = $(hpdocdir)
+doc_DATA = COPYING copyright prnt/hpijs/README_LIBJPG
+EXTRA_DIST = prnt/hpijs/gdevijs-krgb-1.5-gs8.61.patch prnt/hpijs/README_LIBJPG copyright
+
+dist_noinst_SCRIPTS =
+dist_noinst_DATA =
+noinst_PROGRAMS =
+lib_LTLIBRARIES =
+
+include foomatic_drv.inc
+include unreleased.inc
+include cups_drv.inc
+
+if DOC_BUILD
+wwwsrc = doc
+www0dir = $(docdir)
+dist_www0_DATA = $(wwwsrc)/index.html $(wwwsrc)/commandline.html $(wwwsrc)/copying.html $(wwwsrc)/devicemanager.html $(wwwsrc)/faxtrouble.html $(wwwsrc)/gettinghelp.html $(wwwsrc)/hpscan.html $(wwwsrc)/mainttask.html $(wwwsrc)/plugins.html $(wwwsrc)/print.html $(wwwsrc)/printing.html $(wwwsrc)/printoptions.html $(wwwsrc)/printtroubleshooting.html $(wwwsrc)/scanning.html $(wwwsrc)/scantrouble.html $(wwwsrc)/sendfax.html $(wwwsrc)/setup.html $(wwwsrc)/systray.html $(wwwsrc)/troubleshooting.html $(wwwsrc)/uninstalling.html $(wwwsrc)/upgrading.html
+www3dir = $(docdir)/styles
+dist_www3_DATA = $(wwwsrc)/styles/*
+www4dir = $(docdir)/images
+dist_www4_DATA = $(wwwsrc)/images/*
+endif
+
+if HPLIP_BUILD
+
+# hp backend.
+hpdir = $(cupsbackenddir)
+hp_PROGRAMS = hp
+hp_SOURCES = prnt/backend/hp.c
+hp_LDADD = libhpmud.la $(DBUS_LIBS)
+hp_CFLAGS = $(DBUS_CFLAGS)
+
+# hpaio sane backend
+if SCAN_BUILD
+libsane_hpaiodir = $(libdir)/sane
+libsane_hpaio_LTLIBRARIES = libsane-hpaio.la
+libsane_hpaio_la_SOURCES = scan/sane/hpaio.c scan/sane/mfpdtf.c scan/sane/pml.c scan/sane/scl.c scan/sane/io.c scan/sane/hpaio.h \
+ scan/sane/pml.h scan/sane/saneopts.h scan/sane/io.h scan/sane/mfpdtf.h scan/sane/sane.h scan/sane/scl.h scan/sane/tables.h \
+ scan/sane/common.c scan/sane/common.h scan/sane/soap.h scan/sane/soapht.h scan/sane/sanei_debug.h scan/sane/sanei.h \
+ scan/sane/sanei_init_debug.c scan/sane/marvell.h scan/sane/marvelli.h scan/sane/marvell.c scan/sane/soapht.c scan/sane/soap.c \
+ scan/sane/soaphti.h scan/sane/soapi.h scan/sane/xml.c scan/sane/xml.h scan/sane/ledm.h scan/sane/ledmi.h scan/sane/ledm.c \
+ scan/sane/bb_ledm.c scan/sane/http.h scan/sane/http.c
+if DARWIN_BUILD
+libsane_hpaio_la_LDFLAGS = -module -framework CoreFoundation -version-info 1:0:0
+else
+libsane_hpaio_la_LDFLAGS = -version-info 1:0:0
+endif
+# The following is a interlibrary dependency that must be compiled first.
+libsane_hpaio_la_LIBADD = libhpip.la libhpmud.la $(DBUS_LIBS) -lcups -ldl
+#libsane_hpaio_la_CFLAGS = -DWITH_NONAMESPACES -DSOAP_DEBUG
+libsane_hpaio_la_CFLAGS = $(DBUS_CFLAGS)
+endif # SCAN_BUILD
+
+# hpmud library
+MUDNAME=hpmud
+lib_LTLIBRARIES += libhpmud.la
+libhpmud_la_SOURCES = io/hpmud/hpmud.c io/hpmud/mlc.c io/hpmud/model.c io/hpmud/musb.c io/hpmud/pml.c \
+ io/hpmud/hpmud.h io/hpmud/hpmudi.h io/hpmud/list.h io/hpmud/mlc.h io/hpmud/musb.h io/hpmud/pml.h io/hpmud/dot4.c \
+ io/hpmud/dot4.h io/hpmud/jd.c io/hpmud/jd.h io/hpmud/pp.c io/hpmud/pp.h
+if NETWORK_BUILD
+libhpmud_la_LDFLAGS = -version-info 0:6:0 -lusb -lpthread -l$(SNMPLIB) -lcrypto
+else
+libhpmud_la_LDFLAGS = -version-info 0:6:0 -lusb -lpthread
+endif
+libhpmud_la_CFLAGS = -DMUDNAME=\"$(MUDNAME)\" -DCONFDIR=\"$(hplip_confdir)\"
+
+# ip library
+lib_LTLIBRARIES += libhpip.la
+libhpip_la_LDFLAGS = -version-info 0:1:0
+libhpip_la_LIBADD = -lm
+libhpip_la_SOURCES = ip/xconvolve.c ip/xfax.c ip/xgrayout.c ip/xjpg_dct.c ip/xjpg_fix.c ip/xpad.c ip/xrotate.c ip/xskel.c ip/xtiff.c \
+ ip/ipmain.c ip/xchgbpp.c ip/xcrop.c ip/xgamma.c ip/xjpg_dec.c ip/xjpg_huf.c ip/xpcx.c ip/xsaturation.c ip/xtable.c ip/xtonemap.c \
+ ip/xbi2gray.c ip/xcolrspc.c ip/xfakemono.c ip/xgray2bi.c ip/xinvert.c ip/xjpg_enc.c ip/xmatrix.c ip/xpnm.c ip/xscale.c ip/xthumb.c ip/xyxtract.c \
+ ip/hpip.h ip/ipdefs.h ip/xform.h ip/xjpg_dct.h ip/xjpg_huf.h ip/xjpg_mrk.h
+
+# hp-mkuri.
+hp_mkuridir = $(bindir)
+hp_mkuri_PROGRAMS = hp-mkuri
+hp_mkuri_SOURCES = io/hpmud/hp-mkuri.c
+hp_mkuri_LDADD = -ldl libhpmud.la
+hp_mkuri_CFLAGS = -DCONFDIR=\"$(hplip_confdir)\"
+
+# hpmud.rules
+rulesdir = /etc/udev/rules.d
+dist_rules_DATA = data/rules/56-hpmud_support.rules
+dist_rules_DATA += data/rules/86-hpmud_plugin.rules
+dist_rules_DATA += data/rules/56-hpmud_add_printer.rules
+if UDEV_ACL_RULES
+dist_rules_DATA += data/rules/40-hplip.rules
+else
+dist_rules_DATA += data/rules/55-hpmud.rules
+endif
+halpredir = /usr/share/hal/fdi/preprobe/10osvendor
+dist_halpre_DATA = data/rules/20-hplip-devices.fdi
+
+# hplip.conf
+hplip_confdir = /etc/hp
+hplip_conf_DATA = hplip.conf
+
+#pstotiff filter
+pstotiffdir = $(cupsfilterdir)
+pstotiff_SCRIPTS = fax/filters/pstotiff
+
+# hplip.state
+hplip_statedir = /var/lib/hp
+dist_hplip_state_DATA =
+#dist_hplip_state_DATA = hplip.state
+
+# Log Files
+hplip_Logdir=/var/log/hp
+
+if FULL_BUILD
+
+dist_hplip_SCRIPTS = hpssd.py __init__.py hpdio.py
+dist_noinst_DATA += scan/sane/hpaio.desc prnt/drv/hpijs.drv.in.template
+dist_noinst_SCRIPTS += dat2drv.py install.py hplip-install init-suse-firewall init-iptables-firewall
+
+cmddir = $(hplipdir)
+dist_cmd_SCRIPTS = align.py info.py print.py toolbox.py clean.py colorcal.py unload.py testpage.py makeuri.py check.py fab.py levels.py \
+ sendfax.py setup.py makecopies.py probe.py timedate.py firmware.py scan.py systray.py plugin.py linefeedcal.py pqdiag.py \
+ faxsetup.py devicesettings.py printsettings.py query.py pkservice.py wificonfig.py check-plugin.py diagnose_plugin.py uninstall.py \
+ upgrade.py config_usb_printer.py diagnose_queues.py
+
+# base
+basedir = $(hplipdir)/base
+
+dist_base_DATA = base/maint.py base/codes.py base/g.py base/pml.py base/status.py \
+ base/__init__.py base/mfpdtf.py base/utils.py base/wifi.py base/LedmWifi.py \
+ base/device.py base/logger.py base/slp.py base/exif.py base/strings.py base/magic.py \
+ base/imagesize.py base/pexpect.py base/models.py base/mdns.py base/tui.py base/dime.py \
+ base/ldif.py base/vcard.py base/module.py base/pkit.py
+
+# installer
+installdir = $(hplipdir)/installer
+dist_install_DATA = installer/__init__.py installer/dcheck.py installer/distros.dat installer/core_install.py
+dist_noinst_DATA += installer/text_install.py
+
+# makecopies
+copierdir = $(hplipdir)/copier
+dist_copier_DATA = copier/copier.py copier/__init__.py
+
+# fax
+if FAX_BUILD
+faxdir = $(hplipdir)/fax
+dist_fax_DATA = fax/fax.py fax/__init__.py fax/coverpages.py fax/pmlfax.py fax/ledmfax.py fax/soapfax.py fax/ledmsoapfax.py fax/marvellfax.py \
+ fax/faxdevice.py fax/filters/pstotiff fax/filters/pstotiff.convs fax/filters/pstotiff.types
+fax_filtersdir = $(mimedir)
+dist_fax_filters_DATA = fax/filters/pstotiff.convs fax/filters/pstotiff.types
+hpfaxdir = $(cupsbackenddir)
+dist_hpfax_SCRIPTS = fax/backend/hpfax.py
+hpijsfaxppddir = $(hpppddir)
+hpcupsfaxppddir = $(hpppddir)
+if HPIJS_INSTALL
+dist_hpijsfaxppd_DATA = fax/ppd/HP-Fax-hpijs.ppd.gz fax/ppd/HP-Fax2-hpijs.ppd.gz fax/ppd/HP-Fax3-hpijs.ppd.gz fax/ppd/HP-Fax4-hpijs.ppd.gz
+endif # HPIJS_INSTALL
+if HPCUPS_INSTALL
+dist_hpcupsfaxppd_DATA = fax/ppd/HP-Fax-hpcups.ppd.gz fax/ppd/HP-Fax2-hpcups.ppd.gz fax/ppd/HP-Fax3-hpcups.ppd.gz fax/ppd/HP-Fax4-hpcups.ppd.gz
+endif # HPCUPS_INSTALL
+endif # FAX_BUILD
+
+# ptest
+noinst_PROGRAMS += ptest
+ptest_SOURCES = pcard/ptest.c pcard/ptest.h pcard/fat.c pcard/fat.h
+ptest_LDADD = libhpmud.la
+
+# data
+modelsdir = $(hplipdir)/data/models
+images_16x16dir = $(hplipdir)/data/images/16x16
+images_24x24dir = $(hplipdir)/data/images/24x24
+images_32x32dir = $(hplipdir)/data/images/32x32
+images_64x64dir = $(hplipdir)/data/images/64x64
+images_128x128dir = $(hplipdir)/data/images/128x128
+images_256x256dir = $(hplipdir)/data/images/256x256
+images_devicesdir = $(hplipdir)/data/images/devices
+images_otherdir = $(hplipdir)/data/images/other
+pcldir = $(hplipdir)/data/pcl
+ldldir = $(hplipdir)/data/ldl
+postscriptdir = $(hplipdir)/data/ps
+localzdir = $(hplipdir)/data/localization
+dist_postscript_DATA = data/ps/testpage.ps.gz data/ps/clean_page.pdf.gz
+dist_models_DATA = data/models/models.dat
+dist_hplip_Log_DATA=
+
+if GUI_BUILD
+dist_images_16x16_DATA = data/images/16x16/*
+dist_images_24x24_DATA = data/images/24x24/*
+dist_images_32x32_DATA = data/images/32x32/*
+dist_images_64x64_DATA = data/images/64x64/*
+dist_images_128x128_DATA = data/images/128x128/*
+dist_images_256x256_DATA = data/images/256x256/*
+dist_images_devices_DATA = data/images/devices/*
+dist_images_other_DATA = data/images/other/*
+endif
+
+dist_pcl_DATA = data/pcl/align1_8xx.pcl.gz data/pcl/align1_9xx.pcl.gz data/pcl/align2_8xx.pcl.gz data/pcl/align3_8xx.pcl.gz data/pcl/align4_8xx.pcl.gz \
+ data/pcl/align5_8xx.pcl.gz data/pcl/align2_9xx.pcl.gz data/pcl/align3_9xx.pcl.gz data/pcl/align4_450.pcl.gz data/pcl/align6_450.pcl.gz \
+ data/pcl/colorcal1_450.pcl.gz data/pcl/colorcal2_450.pcl.gz data/pcl/crbcal.pcl.gz data/pcl/crcaldone.pcl.gz data/pcl/crcbcal.pcl.gz data/pcl/crccal.pcl.gz \
+ data/pcl/crcpcal.pcl.gz data/pcl/crpcal.pcl.gz
+dist_ldl_DATA = data/ldl/cb2pcal.ldl.gz data/ldl/cb2pcal_done.ldl.gz data/ldl/cbbcal.ldl.gz data/ldl/cbccal.ldl.gz data/ldl/cbccal_done.ldl.gz data/ldl/cbcpcal.ldl.gz \
+ data/ldl/cbpcal.ldl.gz
+dist_localz_DATA = data/localization/hplip_de.qm data/localization/hplip_es.qm data/localization/hplip_fr.qm data/localization/hplip_it.qm \
+ data/localization/hplip_pt.qm data/localization/hplip_ru.qm data/localization/hplip_zh.qm
+dist_noinst_DATA += data/localization/hplip_de.ts data/localization/hplip_es.ts data/localization/hplip_fr.ts data/localization/hplip_it.ts \
+ data/localization/hplip_pt.ts data/localization/hplip_ru.ts data/localization/hplip_zh.ts
+
+# pcard
+pcarddir = $(hplipdir)/pcard
+dist_pcard_DATA = pcard/__init__.py pcard/photocard.py
+
+# pcardext
+pcardextdir = $(pyexecdir)
+pcardext_LTLIBRARIES = pcardext.la
+pcardext_la_LDFLAGS = -module -avoid-version
+pcardext_la_SOURCES = pcard/pcardext/pcardext.c pcard/fat.c
+pcardext_la_CFLAGS = -I$(PYTHONINCLUDEDIR)
+
+# prnt
+prntdir = $(hplipdir)/prnt
+dist_prnt_DATA = prnt/__init__.py prnt/ldl.py prnt/pcl.py prnt/colorcal.py
+
+if SCAN_BUILD
+# scan
+scandir = $(hplipdir)/scan
+dist_scan_DATA = scan/__init__.py scan/sane.py
+
+# scanext
+scanextdir = $(pyexecdir)
+scanext_LTLIBRARIES = scanext.la
+scanext_la_LDFLAGS = -module -avoid-version -lsane
+scanext_la_SOURCES = scan/scanext/scanext.c
+scanext_la_CFLAGS = -I$(PYTHONINCLUDEDIR)
+endif
+
+# hpmudext
+hpmudextdir = $(pyexecdir)
+hpmudext_LTLIBRARIES = hpmudext.la
+hpmudext_la_LDFLAGS = -module -avoid-version
+hpmudext_la_SOURCES = io/mudext/hpmudext.c
+hpmudext_la_LIBADD = libhpmud.la
+hpmudext_la_CFLAGS = -I$(PYTHONINCLUDEDIR)
+# ui (qt3)
+if GUI_BUILD
+if QT3_INSTALL
+uidir = $(hplipdir)/ui
+dist_ui_DATA = ui/alignform.py \
+ ui/colorcalform_base.py ui/colorcalform.py ui/coloradjform_base.py ui/coloradjform.py ui/devmgr4_base.py ui/devmgr4.py \
+ ui/__init__.py ui/loadpaperform_base.py ui/loadpaperform.py \
+ ui/paperedgealignform_base.py ui/paperedgealignform.py ui/ui_utils.py \
+ ui/settingsdialog_base.py ui/settingsdialog.py ui/aligntype6form1.py ui/aligntype6form1_base.py ui/aligntype6form2_base.py \
+ ui/aligntype6form2.py ui/nodevicesform_base.py ui/nodevicesform.py ui/unloadform.py \
+ ui/imagepropertiesdlg_base.py ui/imagepropertiesdlg.py ui/choosedevicedlg.py ui/chooseprinterdlg.py \
+ ui/aboutdlg.py ui/aboutdlg_base.py ui/waitform.py ui/waitform_base.py ui/cleaningform_base.py ui/cleaningform.py \
+ ui/cleaningform2_base.py ui/cleaningform2.py ui/colorcalform2_base.py ui/colorcalform2.py ui/colorcal4form.py \
+ ui/colorcal4form_base.py ui/colorcal4form_base.ui ui/printerform.py \
+ ui/faxaddrbookgroupsform_base.py ui/faxaddrbookgroupeditform_base.py ui/faxaddrbookform_base.py \
+ ui/faxaddrbookform.py ui/faxaddrbookeditform_base.py ui/align10form.py ui/align10form_base.py \
+ ui/faxsendjobform.py ui/faxsettingsform_base.py ui/faxsettingsform.py \
+ ui/coverpageform_base.py ui/coverpageform.py ui/allowabletypesdlg_base.py ui/allowabletypesdlg.py \
+ ui/makecopiesform.py ui/setupform_base.py ui/setupform.py ui/setupmanualfind_base.py \
+ ui/setupmanualfind.py ui/setupsettings_base.py ui/setupsettings.py ui/scrollview.py \
+ ui/scrollprintsettings.py ui/scrollprint.py ui/scrollfax.py \
+ ui/scrollunload.py ui/scrollcopy.py ui/pluginform2.py ui/pluginform2_base.py ui/systemtray.py \
+ ui/ui_utils.py ui/jobstoragemixin.py ui/pluginlicenseform_base.py ui/pluginlicenseform.py \
+ ui/align13form_base.py ui/align13form.py ui/firmwaredialog_base.py ui/firmwaredialog.py \
+ ui/deviceuricombobox.py ui/upgradeform.py ui/upgradeform_base.py
+
+dist_noinst_DATA += ui/colorcalform2_base.ui ui/settingsdialog_base.ui ui/aligntype6form1_base.ui \
+ ui/aboutdlg_base.ui ui/imagepropertiesdlg_base.ui ui/paperedgealignform_base.ui ui/aligntype6form2_base.ui \
+ ui/nodevicesform_base.ui ui/cleaningform_base.ui ui/colorcalform_base.ui ui/devmgr4_base.ui ui/loadpaperform_base.ui \
+ ui/cleaningform2_base.ui ui/waitform_base.ui ui/coloradjform_base.ui ui/faxaddrbookeditform_base.ui \
+ ui/faxaddrbookform_base.ui ui/faxaddrbookgroupeditform_base.ui ui/faxaddrbookgroupsform_base.ui \
+ ui/align10form_base.ui ui/pluginform2_base.ui \
+ plugins/powersettingsdialog_base.ui ui/faxsettingsform_base.ui ui/coverpageform_base.ui \
+ ui/allowabletypesdlg_base.ui ui/setupform_base.ui ui/setupmanualfind_base.ui \
+ ui/setupsettings_base.ui ui/pluginlicenseform_base.ui ui/align13form_base.ui ui/firmwaredialog_base.ui
+endif
+endif
+
+#ui4 (qt4)
+if GUI_BUILD
+if QT4_INSTALL
+ui4dir=$(hplipdir)/ui4
+#dist_ui4_SCRIPTS = ui4/devmgr5.py ui4/systemtray.py ui4/devmgr5_base.py ui4/__init__.py ui4/ui_utils.py \
+# ui4/settingsdialog_base.py ui4/settingsdialog.py ui4/printsettingstoolbox.py ui4/printdialog_base.py \
+# ui4/printdialog.py
+#dist_noinst_DATA += ui4/devmgr5_base.ui ui4/settingsdialog_base.ui ui4/printdialog_base.ui
+dist_ui4_DATA = ui4/*.py
+dist_noinst_DATA += ui4/*.ui
+endif
+endif
+
+# ui plugins (qt3)
+if GUI_BUILD
+if QT3_INSTALL
+pluginsdir = $(hplipdir)/plugins
+dist_plugins_DATA = plugins/dj450.py plugins/__init__.py plugins/powersettings.py plugins/powersettingsdialog.py \
+ plugins/powersettingsdialog_base.py plugins/Deskjet_460.py plugins/Officejet_H470.py plugins/powersettings2.py
+endif
+endif
+
+# ui plugins (qt4)
+if GUI_BUILD
+if QT4_INSTALL
+plugins4dir = $(hplipdir)/ui4/plugins
+dist_plugins4_SCRIPTS =
+endif
+endif
+
+# PolicyKit
+if POLICYKIT_INSTALL
+policykit_dbus_etcdir = /etc/dbus-1/system.d
+dist_policykit_dbus_etc_DATA = data/policykit/com.hp.hplip.conf
+policykit_dbus_sharedir = /usr/share/dbus-1/system-services
+dist_policykit_dbus_share_DATA = data/policykit/com.hp.hplip.service
+policykit_policydir = $(policykit_dir)
+dist_policykit_policy_DATA = data/policykit/com.hp.hplip.policy
+endif
+
+# hppgsz
+noinst_PROGRAMS += hppgsz
+hppgsz_SOURCES = prnt/hpijs/PrinterProperties.cpp prnt/hpijs/PrinterProperties.h prnt/hpijs/bug.h
+hppgsz_CXXFLAGS = $(libapdk_la_CXXFLAGS)
+hppgsz_CFLAGS = $(libapdk_la_CFLAGS)
+hppgsz_LDADD = libapdk.la -ljpeg -ldl
+
+# hplip.desktop
+hplip_desktopdir = $(icondir)
+hplip_desktop_DATA = hplip.desktop
+
+# hplip-systray.desktop
+hplip_systraydir = $(systraydir)
+hplip_systray_DATA = hplip-systray.desktop
+
+# hpipjs (CUPS filter)
+hplipjsdir = $(cupsfilterdir)
+hplipjs_PROGRAMS = hplipjs
+hplipjs_SOURCES = prnt/filters/hplipjs.c
+
+# hpps (CUPS filter)
+hppsdir = $(cupsfilterdir)
+hpps_PROGRAMS = hpps
+hpps_SOURCES = prnt/hpps/hppsfilter.c
+hpps_LDADD = -lcups
+
+# hpcac (CUPS filter, Color Access Control, ie: CLJ 4700)
+cacdir = $(cupsfilterdir)
+dist_cac_SCRIPTS = prnt/filters/hpcac
+
+endif # FULL_BUILD
+endif # HPLIP_BUILD
+
+# foomatic-rip-hplip
+if RIP_INSTALL
+ripdir = $(cupsfilterdir)
+dist_rip_SCRIPTS = prnt/hpijs/foomatic-rip-hplip
+endif
+
+# apdk
+noinst_LTLIBRARIES = libapdk.la
+libapdk_la_SOURCES = prnt/hpijs/models.cpp prnt/hpijs/breaks_open.cpp \
+ prnt/hpijs/dj9xxvip.cpp prnt/hpijs/dj9xx.cpp prnt/hpijs/capture.cpp prnt/hpijs/colormatch.cpp prnt/hpijs/colormatcher_open.cpp \
+ prnt/hpijs/compression.cpp prnt/hpijs/context2.cpp prnt/hpijs/create_so.cpp prnt/hpijs/creator.cpp \
+ prnt/hpijs/dj600.cpp prnt/hpijs/dj630.cpp prnt/hpijs/dj660.cpp prnt/hpijs/dj690.cpp prnt/hpijs/dj6xx.cpp prnt/hpijs/dj8xx.cpp prnt/hpijs/dj600_maps.cpp \
+ prnt/hpijs/dj660_maps.cpp prnt/hpijs/dj690_maps.cpp prnt/hpijs/dj895_maps.cpp prnt/hpijs/dj895_maps2.cpp prnt/hpijs/dj970_maps.cpp \
+ prnt/hpijs/dj970_maps2.cpp prnt/hpijs/dj970_maps3.cpp prnt/hpijs/filterhpa.cpp prnt/hpijs/apollo21xx.cpp prnt/hpijs/apollo2560.cpp prnt/hpijs/apollo2xxx.cpp \
+ prnt/hpijs/dj8x5.cpp prnt/hpijs/psp100.cpp prnt/hpijs/phobos_cmaps.cpp prnt/hpijs/dj350.cpp prnt/hpijs/halftoner.cpp prnt/hpijs/halftoner_open.cpp \
+ prnt/hpijs/globals.cpp prnt/hpijs/header2.cpp prnt/hpijs/htmtxhi.cpp prnt/hpijs/pmselect.cpp \
+ prnt/hpijs/job.cpp prnt/hpijs/printer.cpp prnt/hpijs/registry.cpp prnt/hpijs/scaler.cpp \
+ prnt/hpijs/scaler_open.cpp prnt/hpijs/script.cpp prnt/hpijs/systemservices.cpp \
+ prnt/hpijs/translator.cpp prnt/hpijs/version.cpp prnt/hpijs/versioncode.cpp \
+ prnt/hpijs/djgenericvip.cpp prnt/hpijs/dj540.cpp prnt/hpijs/dj850.cpp prnt/hpijs/dj850_maps.cpp prnt/hpijs/dj890.cpp \
+ prnt/hpijs/apollo21xx.h prnt/hpijs/apollo2560.h prnt/hpijs/apollo2xxx.h prnt/hpijs/colormatch.h prnt/hpijs/colormatcher_open.h \
+ prnt/hpijs/compression.h prnt/hpijs/config.h prnt/hpijs/context.h prnt/hpijs/dj350.h prnt/hpijs/dj400.h prnt/hpijs/dj540.h \
+ prnt/hpijs/dj600.h prnt/hpijs/dj630.h prnt/hpijs/dj660.h prnt/hpijs/dj690.h prnt/hpijs/dj6xx.h prnt/hpijs/dj8x5.h prnt/hpijs/dj8xx.h \
+ prnt/hpijs/dj850.h prnt/hpijs/dj890.h prnt/hpijs/dj9xx.h prnt/hpijs/dj9xxvip.h \
+ prnt/hpijs/ernieplatform.h prnt/hpijs/filterhpa.h prnt/hpijs/global_types.h prnt/hpijs/halftoner.h prnt/hpijs/font.h prnt/hpijs/debug.h \
+ prnt/hpijs/halftoner_open.h prnt/hpijs/header.h prnt/hpijs/hpprint_c_api.h \
+ prnt/hpijs/hpprintapi.h prnt/hpijs/hptypes.h prnt/hpijs/htfed.h prnt/hpijs/internal.h \
+ prnt/hpijs/interp.h prnt/hpijs/interp_data_50.h prnt/hpijs/io_defs.h prnt/hpijs/job.h prnt/hpijs/models.h prnt/hpijs/modes.h prnt/hpijs/pmselect.h \
+ prnt/hpijs/printer.h prnt/hpijs/psp100.h prnt/hpijs/psp470.h prnt/hpijs/resources.h prnt/hpijs/scaler_open.h prnt/hpijs/scaler_prop.h prnt/hpijs/script.h \
+ prnt/hpijs/systemservices.h prnt/hpijs/unistd_.h prnt/hpijs/djgenericvip.h prnt/hpijs/ljmono.h prnt/hpijs/ljmono.cpp \
+ prnt/hpijs/dj3320.cpp prnt/hpijs/dj3320.h prnt/hpijs/dj3320_cmap.cpp prnt/hpijs/dj3600.cpp prnt/hpijs/dj3600.h prnt/hpijs/dj3600_cmap.cpp prnt/hpijs/dj4100.h prnt/hpijs/djd2600.h \
+ prnt/hpijs/dj4100_cmap.cpp prnt/hpijs/ldlencap.h prnt/hpijs/ljcolor.cpp prnt/hpijs/ljcolor.h prnt/hpijs/pscript.h \
+ prnt/hpijs/printerproxy.cpp prnt/hpijs/printerfactory.cpp prnt/hpijs/printerproxy.h prnt/hpijs/printerfactory.h \
+ prnt/hpijs/ljjetready.cpp prnt/hpijs/ljjetready.h prnt/hpijs/jdatadbf.c prnt/hpijs/jccolor.c prnt/hpijs/ljfastraster.cpp prnt/hpijs/ljfastraster.h \
+ prnt/hpijs/jinclude.h prnt/hpijs/jpegint.h prnt/hpijs/dj55xx.h prnt/hpijs/hpijsfax.h prnt/hpijs/ojprokx50.h \
+ prnt/hpijs/ljzjs.cpp prnt/hpijs/ljzjs.h prnt/hpijs/ljzjsmono.cpp prnt/hpijs/ljm1005.cpp prnt/hpijs/ljm1005.h \
+ prnt/hpijs/ljzjsmono.h prnt/hpijs/hpjbig_wrapper.h prnt/hpijs/quickconnect.cpp prnt/hpijs/quickconnect.h prnt/hpijs/ljp1xxx.h prnt/hpijs/ljzjscolor.cpp prnt/hpijs/ljzjscolor.h
+libapdk_la_CXXFLAGS = -DAPDK_DJ660 -DAPDK_DJ6xx -DAPDK_DJ6xxPhoto -DAPDK_DJ8xx -DAPDK_DJ9xx -DAPDK_DJ9xxVIP -DAPDK_DJ630 \
+ -DAPDK_APOLLO2XXX -DAPDK_APOLLO21XX -DAPDK_APOLLO2560 -DAPDK_DJ600 -DAPDK_DJ350 -DAPDK_DJ8x5 -DAPDK_PSP100 -DAPDK_AUTODUPLEX \
+ -DAPDK_HIGH_RES_MODES -DAPDK_LJMONO -DAPDK_DJ540 -DAPDK_DJ850 -DAPDK_DJ890 -DAPDK_DJ3320 -DAPDK_LJCOLOR -DAPDK_DJGENERICVIP \
+ -DAPDK_LJJETREADY -DAPDK_LJFASTRASTER -DAPDK_BUFFER_SEND -DAPDK_LDL_COMPRESS -DAPDK_EXTENDED_MEDIASIZE \
+ -DAPDK_MLC_PRINTER -DAPDK_DJ3600 -DAPDK_LJZJS_MONO -DAPDK_LJZJS_COLOR -DAPDK_LJM1005 -DAPDK_QUICKCONNECT \
+ $(APDK_ENDIAN_FLAG) $(APDK_AUTO_INCLUDE_FLAG) -DAPDK_LINUX -DNDEBUG $(DBUS_CFLAGS)
+libapdk_la_CFLAGS = $(libapdk_la_CXXFLAGS) -Iprnt/hpijs
+
+if HPIJS_INSTALL
+# hpijs
+bin_PROGRAMS = hpijs
+hpijs_SOURCES = prnt/hpijs/hpijs.cpp prnt/hpijs/ijs_server.c prnt/hpijs/ijs.c prnt/hpijs/hpijsfax.cpp prnt/hpijs/services.cpp prnt/hpijs/bug.h \
+ prnt/hpijs/hpijs.h prnt/hpijs/ijs.h prnt/hpijs/ijs_server.h prnt/hpijs/services.h prnt/hpijs/ijs_client.h prnt/hpijs/hpiom.c prnt/hpijs/hpiom.h
+hpijs_CXXFLAGS = $(libapdk_la_CXXFLAGS)
+hpijs_CFLAGS = $(libapdk_la_CFLAGS)
+if HPLIP_BUILD
+hpijs_LDADD = libapdk.la -ljpeg -ldl libhpip.la libhpmud.la $(DBUS_LIBS)
+else
+hpijs_LDADD = libapdk.la -ljpeg -ldl
+endif
+endif # HPIJS_INSTALL
+
+if HPCUPS_INSTALL
+# hpcups
+#if NEW_HPCUPS
+hpcupsdir = $(cupsfilterdir)
+hpcups_PROGRAMS = hpcups
+hpcups_SOURCES = prnt/hpcups/HPCupsFilter.cpp prnt/hpcups/HPCupsFilter.h prnt/hpcups/dbuscomm.cpp prnt/hpcups/dbuscomm.h prnt/hpcups/Compressor.cpp prnt/hpcups/Compressor.h \
+ prnt/hpcups/Mode2.cpp prnt/hpcups/Mode2.h prnt/hpcups/Mode3.cpp prnt/hpcups/Mode3.h \
+ prnt/hpcups/Mode9.cpp prnt/hpcups/Mode9.h prnt/hpcups/Mode10.cpp prnt/hpcups/Mode10.h \
+ prnt/hpcups/ModeDeltaPlus.cpp prnt/hpcups/ModeDeltaPlus.h prnt/hpcups/ModeJbig.cpp prnt/hpcups/ModeJbig.h \
+ prnt/hpcups/ErnieFilter.cpp prnt/hpcups/ErnieFilter.h prnt/hpcups/EncapsulatorFactory.cpp prnt/hpcups/EncapsulatorFactory.h \
+ prnt/hpcups/Encapsulator.cpp prnt/hpcups/Encapsulator.h prnt/hpcups/Pcl3.cpp prnt/hpcups/Pcl3.h \
+ prnt/hpcups/Pcl3Gui.cpp prnt/hpcups/Pcl3Gui.h prnt/hpcups/Pcl3Gui2.cpp prnt/hpcups/Pcl3Gui2.h \
+ prnt/hpcups/LJMono.cpp prnt/hpcups/LJMono.h prnt/hpcups/LJColor.cpp prnt/hpcups/LJColor.h \
+ prnt/hpcups/LJFastRaster.cpp prnt/hpcups/LJFastRaster.h prnt/hpcups/LJJetReady.cpp prnt/hpcups/LJJetReady.h \
+prnt/hpcups/LJZjStream.cpp prnt/hpcups/LJZjStream.h \
+ prnt/hpcups/LJZxStream.cpp prnt/hpcups/LJZxStream.h prnt/hpcups/Job.cpp prnt/hpcups/Job.h \
+ prnt/hpcups/Pipeline.cpp prnt/hpcups/Pipeline.h prnt/hpcups/Processor.cpp prnt/hpcups/Processor.h \
+ prnt/hpcups/RasterSender.cpp prnt/hpcups/RasterSender.h prnt/hpcups/ColorMatcher.cpp prnt/hpcups/ColorMatcher.h \
+ prnt/hpcups/Halftoner.cpp prnt/hpcups/Halftoner.h prnt/hpcups/Scaler.cpp prnt/hpcups/Scaler.h prnt/hpcups/resources.h \
+ prnt/hpcups/dj400ColorMaps.cpp prnt/hpcups/dj600ColorMaps.cpp prnt/hpcups/dj970ColorMaps.cpp prnt/hpcups/dj8xxColorMaps.cpp \
+ prnt/hpcups/dj4100ColorMaps.cpp \
+ prnt/hpcups/BreakTables.cpp prnt/hpcups/PrinterCommands.h prnt/hpcups/Utils.cpp prnt/hpcups/Utils.h \
+ prnt/hpcups/SystemServices.cpp prnt/hpcups/SystemServices.h prnt/hpcups/CommonDefinitions.h prnt/hpcups/hpjbig_wrapper.h \
+ prnt/hpcups/apPrintModes.h prnt/hpcups/dj400PrintModes.h prnt/hpcups/dj540PrintModes.h prnt/hpcups/dj600PrintModes.h \
+ prnt/hpcups/dj630PrintModes.h prnt/hpcups/dj690PrintModes.h prnt/hpcups/dj850PrintModes.h prnt/hpcups/dj890PrintModes.h \
+ prnt/hpcups/dj895PrintModes.h prnt/hpcups/dj8x5PrintModes.h prnt/hpcups/dj970PrintModes.h prnt/hpcups/Pcl3GuiPrintModes.h \
+ prnt/hpcups/Pcl3PrintModes.h prnt/hpcups/ColorMaps.h \
+ prnt/hpcups/QuickConnect.cpp prnt/hpcups/QuickConnect.h \
+ prnt/hpcups/ModeJpeg.cpp prnt/hpcups/ModeJpeg.h \
+ prnt/hpcups/jccolor.c prnt/hpcups/jinclude.h \
+ prnt/hpcups/jdatadbf.c prnt/hpcups/jinclude.h \
+ prnt/hpcups/Lidil.cpp prnt/hpcups/Lidil.h \
+ prnt/hpcups/LidilCompress.cpp prnt/hpcups/LidilCompress.h \
+ prnt/hpcups/LidilPrintModes.h prnt/hpcups/dj3320ColorMaps.cpp \
+ prnt/hpcups/dj3600ColorMaps.cpp prnt/hpcups/dj3320PrintModes.h \
+ prnt/hpcups/dj4100PrintModes.h
+
+hpcups_CXXFLAGS = $(APDK_ENDIAN_FLAG) $(DBUS_CFLAGS)
+hpcups_LDADD = -ljpeg -ldl -lcups -lcupsimage $(DBUS_LIBS)
+#else
+#hpcupsdir = $(cupsfilterdir)
+#hpcups_PROGRAMS = hpcups
+#hpcups_SOURCES = prnt/hpijs/hpcups.cpp prnt/hpijs/hpcups.h prnt/hpijs/services.cpp prnt/hpijs/services.h prnt/hpijs/hpiom.c prnt/hpijs/hpiom.h prnt/hpijs/bug.h prnt/hpijs/hpimage.cpp prnt/hpijs/hpimage.h
+#hpcups_CXXFLAGS = $(libapdk_la_CXXFLAGS)
+#hpcups_CFLAGS = $(libapdk_la_CFLAGS)
+#if HPCUPS_ONLY_BUILD
+#hpcups_LDADD = libapdk.la -ljpeg -ldl -lcups -lcupsimage
+#else
+#hpcups_LDADD = libapdk.la -ljpeg -ldl libhpip.la libhpmud.la $(DBUS_LIBS) -lcups -lcupsimage
+#endif #HPCUPS_ONLY_BUILD
+#endif # NEW_HPCUPS
+if !HPCUPS_ONLY_BUILD
+if FAX_BUILD
+# hpcupsfax
+hpcupsfaxdir = $(cupsfilterdir)
+hpcupsfax_PROGRAMS = hpcupsfax
+hpcupsfax_SOURCES = prnt/hpijs/hpcupsfax.cpp prnt/hpijs/hpcupsfax.h
+hpcupsfax_LDADD = libhpip.la -lcups -lcupsimage
+endif # FAX_BUILD
+endif # HPCUPS ONLY
+endif # HPCUPS_INSTALL
+
+# PPDs
+ppddir = $(hpppddir)
+dist_ppd_DATA = $(foomatic_ps_printers)
+if FOOMATIC_PPD_INSTALL
+dist_ppd_DATA += $(foomatic_ppd_printers)
+endif
+if FOOMATIC_DRV_INSTALL
+cupsdrvdir = $(drvdir)
+cupsdrv_DATA = $(foomatic_drv)
+endif
+if CUPS_PPD_INSTALL
+dist_ppd_DATA += $(cups_ppd_printers)
+endif
+if CUPS_DRV_INSTALL
+cupsdrv2dir = $(drvdir)
+cupsdrv2_DATA = $(cups_drv)
+endif
+
+install-dist_hplip_LogDATA:
+if FULL_BUILD
+ test -z "$(DESTDIR)$(hplip_Logdir)" || mkdir -p $(DESTDIR)$(hplip_Logdir)
+ chgrp "lp" -R $(DESTDIR)$(hplip_Logdir)
+ chmod 774 $(DESTDIR)$(hplip_Logdir)
+endif #FULL_BUILD
+if HPLIP_BUILD
+ test -z "$(DESTDIR)$(hplip_Logdir)" || mkdir -p $(DESTDIR)$(hplip_Logdir)
+ chgrp "lp" -R $(DESTDIR)$(hplip_Logdir)
+ chmod 774 $(DESTDIR)$(hplip_Logdir)
+endif #FULL_BUILD
+
+install-data-hook:
+if HPLIP_BUILD
+# If scanner build, add hpaio entry to sane dll.conf.
+ if [ "$(scan_build)" = "yes" ]; then \
+ $(mkinstalldirs) $(DESTDIR)/etc/sane.d; \
+ if [ ! -f $(DESTDIR)/etc/sane.d/dll.conf ]; then \
+ touch $(DESTDIR)/etc/sane.d/dll.conf; \
+ fi; \
+ if ! grep ^hpaio $(DESTDIR)/etc/sane.d/dll.conf >/dev/null 2>/dev/null ; then \
+ echo "Adding hpaio entry to /etc/sane.d/dll.conf." ; \
+ echo hpaio >>$(DESTDIR)/etc/sane.d/dll.conf ; \
+ fi \
+ fi
+if FULL_BUILD
+# Create hp-xxx commands in bindir.
+ $(mkinstalldirs) $(DESTDIR)$(bindir)
+ for i in $(dist_cmd_SCRIPTS); do \
+ cmd=`basename $$i .py`; \
+ if [ ! \( "$$cmd" = "toolbox" -a "$(gui_build)" = "no" \) ]; then \
+ ln -sf ../share/$(PACKAGE)/$$i $(DESTDIR)$(bindir)/hp-$$cmd; \
+ fi \
+ done
+#
+# Install fax support.
+ if [ "$(fax_build)" = "yes" ]; then \
+ mv $(DESTDIR)$(hpfaxdir)/hpfax.py $(DESTDIR)$(hpfaxdir)/hpfax; \
+ chmod 700 $(DESTDIR)$(hpfaxdir)/hpfax; \
+ fi
+#
+# Make backend run as root.
+# chmod 700 $(DESTDIR)$(hpdir)/hp
+endif # FULL_BUILD
+endif # HPLIP_BUILD
+
+uninstall-hook:
+if HPLIP_BUILD
+# Remove hp-xxx commands.
+ for i in $(dist_cmd_SCRIPTS); do \
+ cmd=`basename $$i .py`; \
+ rm -f $(DESTDIR)$(bindir)/hp-$$cmd; \
+ done
+#
+# Remove fax support.
+ rm -f $(DESTDIR)$(hpfaxdir)/hpfax
+endif
+
+rpm:
+if FULL_BUILD
+ epm -f rpm hplipfull hplip.list
+endif
+if LITE_BUILD
+ epm -f rpm hpliplite hplip.list
+endif
+if HPCUPS_ONLY_BUILD
+ epm -f rpm hpliphpcupsonly hplip.list
+endif
+if HPIJS_ONLY_BUILD
+ epm -f rpm hpliphpijsonly hplip.list
+endif
+
+deb:
+if FULL_BUILD
+ epm -f deb hplipfull hplip.list
+endif
+if LITE_BUILD
+ epm -f deb hpliplite hplip.list
+endif
+if HPCUPS_ONLY_BUILD
+ epm -f deb hpliphpcupsonly hplip.list
+endif
+if HPIJS_ONLY_BUILD
+ epm -f deb hpliphpijsonly hplip.list
+endif
diff --git a/Makefile.in b/Makefile.in
new file mode 100644
index 0000000..e1dfe97
--- /dev/null
+++ b/Makefile.in
@@ -0,0 +1,8600 @@
+# Makefile.in generated by automake 1.11 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
+# Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+#
+# Makefile.am - hplip automake input file
+#
+# (c) 2004-2015 Copyright Hewlett-Packard Development Company, LP
+# Author: David Suffield, Naga Samrat Chowdary Narla, Sarbeswar Meher
+
+
+
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+noinst_PROGRAMS = $(am__EXEEXT_1)
+DIST_COMMON = $(am__configure_deps) $(am__dist_base_DATA_DIST) \
+ $(am__dist_cac_SCRIPTS_DIST) $(am__dist_cmd_SCRIPTS_DIST) \
+ $(am__dist_copier_DATA_DIST) $(am__dist_fax_DATA_DIST) \
+ $(am__dist_fax_filters_DATA_DIST) $(am__dist_halpre_DATA_DIST) \
+ $(am__dist_hpcupsfaxppd_DATA_DIST) \
+ $(am__dist_hpfax_SCRIPTS_DIST) \
+ $(am__dist_hpijsfaxppd_DATA_DIST) \
+ $(am__dist_hplip_SCRIPTS_DIST) \
+ $(am__dist_images_128x128_DATA_DIST) \
+ $(am__dist_images_16x16_DATA_DIST) \
+ $(am__dist_images_24x24_DATA_DIST) \
+ $(am__dist_images_256x256_DATA_DIST) \
+ $(am__dist_images_32x32_DATA_DIST) \
+ $(am__dist_images_64x64_DATA_DIST) \
+ $(am__dist_images_devices_DATA_DIST) \
+ $(am__dist_images_other_DATA_DIST) \
+ $(am__dist_install_DATA_DIST) $(am__dist_ldl_DATA_DIST) \
+ $(am__dist_localz_DATA_DIST) $(am__dist_models_DATA_DIST) \
+ $(am__dist_noinst_DATA_DIST) $(am__dist_noinst_SCRIPTS_DIST) \
+ $(am__dist_pcard_DATA_DIST) $(am__dist_pcl_DATA_DIST) \
+ $(am__dist_plugins_DATA_DIST) \
+ $(am__dist_policykit_dbus_etc_DATA_DIST) \
+ $(am__dist_policykit_dbus_share_DATA_DIST) \
+ $(am__dist_policykit_policy_DATA_DIST) \
+ $(am__dist_postscript_DATA_DIST) $(am__dist_ppd_DATA_DIST) \
+ $(am__dist_prnt_DATA_DIST) $(am__dist_rip_SCRIPTS_DIST) \
+ $(am__dist_rules_DATA_DIST) $(am__dist_scan_DATA_DIST) \
+ $(am__dist_ui4_DATA_DIST) $(am__dist_ui_DATA_DIST) \
+ $(am__dist_www0_DATA_DIST) $(am__dist_www3_DATA_DIST) \
+ $(am__dist_www4_DATA_DIST) $(dist_hplip_Log_DATA) \
+ $(dist_hplip_state_DATA) $(dist_plugins4_SCRIPTS) \
+ $(dist_unrel_DATA) $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+ $(srcdir)/cups_drv.inc $(srcdir)/foomatic_drv.inc \
+ $(srcdir)/hplip-systray.desktop.in $(srcdir)/hplip.conf.in \
+ $(srcdir)/hplip.desktop.in $(srcdir)/hplip.list.in \
+ $(srcdir)/unreleased.inc $(top_srcdir)/configure \
+ $(top_srcdir)/data/policykit/com.hp.hplip.service.in \
+ $(top_srcdir)/prnt/drv/hpcups.drv.in \
+ $(top_srcdir)/prnt/drv/hpijs.drv.in COPYING config.guess \
+ config.sub depcomp install-sh ltmain.sh missing
+@HPLIP_BUILD_TRUE@hp_PROGRAMS = hp$(EXEEXT)
+
+# ip library
+@HPLIP_BUILD_TRUE@am__append_1 = libhpmud.la libhpip.la
+@HPLIP_BUILD_TRUE@hp_mkuri_PROGRAMS = hp-mkuri$(EXEEXT)
+@HPLIP_BUILD_TRUE@@UDEV_ACL_RULES_TRUE@am__append_2 = data/rules/40-hplip.rules
+@HPLIP_BUILD_TRUE@@UDEV_ACL_RULES_FALSE@am__append_3 = data/rules/55-hpmud.rules
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@am__append_4 = \
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@ scan/sane/hpaio.desc \
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@ prnt/drv/hpijs.drv.in.template \
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@ installer/text_install.py \
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@ data/localization/hplip_de.ts \
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@ data/localization/hplip_es.ts \
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@ data/localization/hplip_fr.ts \
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@ data/localization/hplip_it.ts \
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@ data/localization/hplip_pt.ts \
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@ data/localization/hplip_ru.ts \
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@ data/localization/hplip_zh.ts
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@am__append_5 = dat2drv.py install.py hplip-install init-suse-firewall init-iptables-firewall
+
+# ptest
+
+# hppgsz
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@am__append_6 = ptest hppgsz
+@FULL_BUILD_TRUE@@GUI_BUILD_TRUE@@HPLIP_BUILD_TRUE@@QT3_INSTALL_TRUE@am__append_7 = ui/colorcalform2_base.ui ui/settingsdialog_base.ui ui/aligntype6form1_base.ui \
+@FULL_BUILD_TRUE@@GUI_BUILD_TRUE@@HPLIP_BUILD_TRUE@@QT3_INSTALL_TRUE@ ui/aboutdlg_base.ui ui/imagepropertiesdlg_base.ui ui/paperedgealignform_base.ui ui/aligntype6form2_base.ui \
+@FULL_BUILD_TRUE@@GUI_BUILD_TRUE@@HPLIP_BUILD_TRUE@@QT3_INSTALL_TRUE@ ui/nodevicesform_base.ui ui/cleaningform_base.ui ui/colorcalform_base.ui ui/devmgr4_base.ui ui/loadpaperform_base.ui \
+@FULL_BUILD_TRUE@@GUI_BUILD_TRUE@@HPLIP_BUILD_TRUE@@QT3_INSTALL_TRUE@ ui/cleaningform2_base.ui ui/waitform_base.ui ui/coloradjform_base.ui ui/faxaddrbookeditform_base.ui \
+@FULL_BUILD_TRUE@@GUI_BUILD_TRUE@@HPLIP_BUILD_TRUE@@QT3_INSTALL_TRUE@ ui/faxaddrbookform_base.ui ui/faxaddrbookgroupeditform_base.ui ui/faxaddrbookgroupsform_base.ui \
+@FULL_BUILD_TRUE@@GUI_BUILD_TRUE@@HPLIP_BUILD_TRUE@@QT3_INSTALL_TRUE@ ui/align10form_base.ui ui/pluginform2_base.ui \
+@FULL_BUILD_TRUE@@GUI_BUILD_TRUE@@HPLIP_BUILD_TRUE@@QT3_INSTALL_TRUE@ plugins/powersettingsdialog_base.ui ui/faxsettingsform_base.ui ui/coverpageform_base.ui \
+@FULL_BUILD_TRUE@@GUI_BUILD_TRUE@@HPLIP_BUILD_TRUE@@QT3_INSTALL_TRUE@ ui/allowabletypesdlg_base.ui ui/setupform_base.ui ui/setupmanualfind_base.ui \
+@FULL_BUILD_TRUE@@GUI_BUILD_TRUE@@HPLIP_BUILD_TRUE@@QT3_INSTALL_TRUE@ ui/setupsettings_base.ui ui/pluginlicenseform_base.ui ui/align13form_base.ui ui/firmwaredialog_base.ui
+
+@FULL_BUILD_TRUE@@GUI_BUILD_TRUE@@HPLIP_BUILD_TRUE@@QT4_INSTALL_TRUE@am__append_8 = ui4/*.ui
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@hplipjs_PROGRAMS = \
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@ hplipjs$(EXEEXT)
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@hpps_PROGRAMS = hpps$(EXEEXT)
+@HPIJS_INSTALL_TRUE@bin_PROGRAMS = hpijs$(EXEEXT)
+@HPCUPS_INSTALL_TRUE@hpcups_PROGRAMS = hpcups$(EXEEXT)
+@FAX_BUILD_TRUE@@HPCUPS_INSTALL_TRUE@@HPCUPS_ONLY_BUILD_FALSE@hpcupsfax_PROGRAMS = hpcupsfax$(EXEEXT)
+@FOOMATIC_PPD_INSTALL_TRUE@am__append_9 = $(foomatic_ppd_printers)
+@CUPS_PPD_INSTALL_TRUE@am__append_10 = $(cups_ppd_printers)
+subdir = .
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.in
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
+ configure.lineno config.status.lineno
+mkinstalldirs = $(install_sh) -d
+CONFIG_CLEAN_FILES = hplip.conf hplip.desktop hplip-systray.desktop \
+ prnt/drv/hpijs.drv prnt/drv/hpcups.drv hplip.list \
+ data/policykit/com.hp.hplip.service
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__installdirs = "$(DESTDIR)$(hpmudextdir)" \
+ "$(DESTDIR)$(libdir)" "$(DESTDIR)$(libsane_hpaiodir)" \
+ "$(DESTDIR)$(pcardextdir)" "$(DESTDIR)$(scanextdir)" \
+ "$(DESTDIR)$(bindir)" "$(DESTDIR)$(hpdir)" \
+ "$(DESTDIR)$(hp_mkuridir)" "$(DESTDIR)$(hpcupsdir)" \
+ "$(DESTDIR)$(hpcupsfaxdir)" "$(DESTDIR)$(hplipjsdir)" \
+ "$(DESTDIR)$(hppsdir)" "$(DESTDIR)$(cacdir)" \
+ "$(DESTDIR)$(cmddir)" "$(DESTDIR)$(hpfaxdir)" \
+ "$(DESTDIR)$(hplipdir)" "$(DESTDIR)$(plugins4dir)" \
+ "$(DESTDIR)$(ripdir)" "$(DESTDIR)$(pstotiffdir)" \
+ "$(DESTDIR)$(cupsdrvdir)" "$(DESTDIR)$(cupsdrv2dir)" \
+ "$(DESTDIR)$(basedir)" "$(DESTDIR)$(copierdir)" \
+ "$(DESTDIR)$(faxdir)" "$(DESTDIR)$(fax_filtersdir)" \
+ "$(DESTDIR)$(halpredir)" "$(DESTDIR)$(hpcupsfaxppddir)" \
+ "$(DESTDIR)$(hpijsfaxppddir)" "$(DESTDIR)$(hplip_Logdir)" \
+ "$(DESTDIR)$(hplip_statedir)" "$(DESTDIR)$(images_128x128dir)" \
+ "$(DESTDIR)$(images_16x16dir)" "$(DESTDIR)$(images_24x24dir)" \
+ "$(DESTDIR)$(images_256x256dir)" \
+ "$(DESTDIR)$(images_32x32dir)" "$(DESTDIR)$(images_64x64dir)" \
+ "$(DESTDIR)$(images_devicesdir)" \
+ "$(DESTDIR)$(images_otherdir)" "$(DESTDIR)$(installdir)" \
+ "$(DESTDIR)$(ldldir)" "$(DESTDIR)$(localzdir)" \
+ "$(DESTDIR)$(modelsdir)" "$(DESTDIR)$(pcarddir)" \
+ "$(DESTDIR)$(pcldir)" "$(DESTDIR)$(pluginsdir)" \
+ "$(DESTDIR)$(policykit_dbus_etcdir)" \
+ "$(DESTDIR)$(policykit_dbus_sharedir)" \
+ "$(DESTDIR)$(policykit_policydir)" \
+ "$(DESTDIR)$(postscriptdir)" "$(DESTDIR)$(ppddir)" \
+ "$(DESTDIR)$(prntdir)" "$(DESTDIR)$(rulesdir)" \
+ "$(DESTDIR)$(scandir)" "$(DESTDIR)$(uidir)" \
+ "$(DESTDIR)$(ui4dir)" "$(DESTDIR)$(unreldir)" \
+ "$(DESTDIR)$(www0dir)" "$(DESTDIR)$(www3dir)" \
+ "$(DESTDIR)$(www4dir)" "$(DESTDIR)$(docdir)" \
+ "$(DESTDIR)$(hplip_confdir)" "$(DESTDIR)$(hplip_desktopdir)" \
+ "$(DESTDIR)$(hplip_systraydir)"
+LTLIBRARIES = $(hpmudext_LTLIBRARIES) \
+ $(lib_LTLIBRARIES) $(libsane_hpaio_LTLIBRARIES) \
+ $(noinst_LTLIBRARIES) $(pcardext_LTLIBRARIES) \
+ $(scanext_LTLIBRARIES)
+am__hpmudext_la_SOURCES_DIST = io/mudext/hpmudext.c
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@am_hpmudext_la_OBJECTS = \
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@ hpmudext_la-hpmudext.lo
+hpmudext_la_OBJECTS = $(am_hpmudext_la_OBJECTS)
+hpmudext_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(hpmudext_la_CFLAGS) \
+ $(CFLAGS) $(hpmudext_la_LDFLAGS) $(LDFLAGS) -o $@
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@am_hpmudext_la_rpath = -rpath \
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@ $(hpmudextdir)
+libapdk_la_LIBADD =
+am_libapdk_la_OBJECTS = libapdk_la-models.lo libapdk_la-breaks_open.lo \
+ libapdk_la-dj9xxvip.lo libapdk_la-dj9xx.lo \
+ libapdk_la-capture.lo libapdk_la-colormatch.lo \
+ libapdk_la-colormatcher_open.lo libapdk_la-compression.lo \
+ libapdk_la-context2.lo libapdk_la-create_so.lo \
+ libapdk_la-creator.lo libapdk_la-dj600.lo libapdk_la-dj630.lo \
+ libapdk_la-dj660.lo libapdk_la-dj690.lo libapdk_la-dj6xx.lo \
+ libapdk_la-dj8xx.lo libapdk_la-dj600_maps.lo \
+ libapdk_la-dj660_maps.lo libapdk_la-dj690_maps.lo \
+ libapdk_la-dj895_maps.lo libapdk_la-dj895_maps2.lo \
+ libapdk_la-dj970_maps.lo libapdk_la-dj970_maps2.lo \
+ libapdk_la-dj970_maps3.lo libapdk_la-filterhpa.lo \
+ libapdk_la-apollo21xx.lo libapdk_la-apollo2560.lo \
+ libapdk_la-apollo2xxx.lo libapdk_la-dj8x5.lo \
+ libapdk_la-psp100.lo libapdk_la-phobos_cmaps.lo \
+ libapdk_la-dj350.lo libapdk_la-halftoner.lo \
+ libapdk_la-halftoner_open.lo libapdk_la-globals.lo \
+ libapdk_la-header2.lo libapdk_la-htmtxhi.lo \
+ libapdk_la-pmselect.lo libapdk_la-job.lo libapdk_la-printer.lo \
+ libapdk_la-registry.lo libapdk_la-scaler.lo \
+ libapdk_la-scaler_open.lo libapdk_la-script.lo \
+ libapdk_la-systemservices.lo libapdk_la-translator.lo \
+ libapdk_la-version.lo libapdk_la-versioncode.lo \
+ libapdk_la-djgenericvip.lo libapdk_la-dj540.lo \
+ libapdk_la-dj850.lo libapdk_la-dj850_maps.lo \
+ libapdk_la-dj890.lo libapdk_la-ljmono.lo libapdk_la-dj3320.lo \
+ libapdk_la-dj3320_cmap.lo libapdk_la-dj3600.lo \
+ libapdk_la-dj3600_cmap.lo libapdk_la-dj4100_cmap.lo \
+ libapdk_la-ljcolor.lo libapdk_la-printerproxy.lo \
+ libapdk_la-printerfactory.lo libapdk_la-ljjetready.lo \
+ libapdk_la-jdatadbf.lo libapdk_la-jccolor.lo \
+ libapdk_la-ljfastraster.lo libapdk_la-ljzjs.lo \
+ libapdk_la-ljzjsmono.lo libapdk_la-ljm1005.lo \
+ libapdk_la-quickconnect.lo libapdk_la-ljzjscolor.lo
+libapdk_la_OBJECTS = $(am_libapdk_la_OBJECTS)
+libapdk_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(libapdk_la_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+libhpip_la_DEPENDENCIES =
+am__libhpip_la_SOURCES_DIST = ip/xconvolve.c ip/xfax.c ip/xgrayout.c \
+ ip/xjpg_dct.c ip/xjpg_fix.c ip/xpad.c ip/xrotate.c ip/xskel.c \
+ ip/xtiff.c ip/ipmain.c ip/xchgbpp.c ip/xcrop.c ip/xgamma.c \
+ ip/xjpg_dec.c ip/xjpg_huf.c ip/xpcx.c ip/xsaturation.c \
+ ip/xtable.c ip/xtonemap.c ip/xbi2gray.c ip/xcolrspc.c \
+ ip/xfakemono.c ip/xgray2bi.c ip/xinvert.c ip/xjpg_enc.c \
+ ip/xmatrix.c ip/xpnm.c ip/xscale.c ip/xthumb.c ip/xyxtract.c \
+ ip/hpip.h ip/ipdefs.h ip/xform.h ip/xjpg_dct.h ip/xjpg_huf.h \
+ ip/xjpg_mrk.h
+@HPLIP_BUILD_TRUE@am_libhpip_la_OBJECTS = xconvolve.lo xfax.lo \
+@HPLIP_BUILD_TRUE@ xgrayout.lo xjpg_dct.lo xjpg_fix.lo xpad.lo \
+@HPLIP_BUILD_TRUE@ xrotate.lo xskel.lo xtiff.lo ipmain.lo \
+@HPLIP_BUILD_TRUE@ xchgbpp.lo xcrop.lo xgamma.lo xjpg_dec.lo \
+@HPLIP_BUILD_TRUE@ xjpg_huf.lo xpcx.lo xsaturation.lo xtable.lo \
+@HPLIP_BUILD_TRUE@ xtonemap.lo xbi2gray.lo xcolrspc.lo \
+@HPLIP_BUILD_TRUE@ xfakemono.lo xgray2bi.lo xinvert.lo \
+@HPLIP_BUILD_TRUE@ xjpg_enc.lo xmatrix.lo xpnm.lo xscale.lo \
+@HPLIP_BUILD_TRUE@ xthumb.lo xyxtract.lo
+libhpip_la_OBJECTS = $(am_libhpip_la_OBJECTS)
+libhpip_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(libhpip_la_LDFLAGS) $(LDFLAGS) -o $@
+@HPLIP_BUILD_TRUE@am_libhpip_la_rpath = -rpath $(libdir)
+libhpmud_la_LIBADD =
+am__libhpmud_la_SOURCES_DIST = io/hpmud/hpmud.c io/hpmud/mlc.c \
+ io/hpmud/model.c io/hpmud/musb.c io/hpmud/pml.c \
+ io/hpmud/hpmud.h io/hpmud/hpmudi.h io/hpmud/list.h \
+ io/hpmud/mlc.h io/hpmud/musb.h io/hpmud/pml.h io/hpmud/dot4.c \
+ io/hpmud/dot4.h io/hpmud/jd.c io/hpmud/jd.h io/hpmud/pp.c \
+ io/hpmud/pp.h
+@HPLIP_BUILD_TRUE@am_libhpmud_la_OBJECTS = libhpmud_la-hpmud.lo \
+@HPLIP_BUILD_TRUE@ libhpmud_la-mlc.lo libhpmud_la-model.lo \
+@HPLIP_BUILD_TRUE@ libhpmud_la-musb.lo libhpmud_la-pml.lo \
+@HPLIP_BUILD_TRUE@ libhpmud_la-dot4.lo libhpmud_la-jd.lo \
+@HPLIP_BUILD_TRUE@ libhpmud_la-pp.lo
+libhpmud_la_OBJECTS = $(am_libhpmud_la_OBJECTS)
+libhpmud_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(libhpmud_la_CFLAGS) \
+ $(CFLAGS) $(libhpmud_la_LDFLAGS) $(LDFLAGS) -o $@
+@HPLIP_BUILD_TRUE@am_libhpmud_la_rpath = -rpath $(libdir)
+am__DEPENDENCIES_1 =
+@HPLIP_BUILD_TRUE@@SCAN_BUILD_TRUE@libsane_hpaio_la_DEPENDENCIES = \
+@HPLIP_BUILD_TRUE@@SCAN_BUILD_TRUE@ libhpip.la libhpmud.la \
+@HPLIP_BUILD_TRUE@@SCAN_BUILD_TRUE@ $(am__DEPENDENCIES_1)
+am__libsane_hpaio_la_SOURCES_DIST = scan/sane/hpaio.c \
+ scan/sane/mfpdtf.c scan/sane/pml.c scan/sane/scl.c \
+ scan/sane/io.c scan/sane/hpaio.h scan/sane/pml.h \
+ scan/sane/saneopts.h scan/sane/io.h scan/sane/mfpdtf.h \
+ scan/sane/sane.h scan/sane/scl.h scan/sane/tables.h \
+ scan/sane/common.c scan/sane/common.h scan/sane/soap.h \
+ scan/sane/soapht.h scan/sane/sanei_debug.h scan/sane/sanei.h \
+ scan/sane/sanei_init_debug.c scan/sane/marvell.h \
+ scan/sane/marvelli.h scan/sane/marvell.c scan/sane/soapht.c \
+ scan/sane/soap.c scan/sane/soaphti.h scan/sane/soapi.h \
+ scan/sane/xml.c scan/sane/xml.h scan/sane/ledm.h \
+ scan/sane/ledmi.h scan/sane/ledm.c scan/sane/bb_ledm.c \
+ scan/sane/http.h scan/sane/http.c
+@HPLIP_BUILD_TRUE@@SCAN_BUILD_TRUE@am_libsane_hpaio_la_OBJECTS = \
+@HPLIP_BUILD_TRUE@@SCAN_BUILD_TRUE@ libsane_hpaio_la-hpaio.lo \
+@HPLIP_BUILD_TRUE@@SCAN_BUILD_TRUE@ libsane_hpaio_la-mfpdtf.lo \
+@HPLIP_BUILD_TRUE@@SCAN_BUILD_TRUE@ libsane_hpaio_la-pml.lo \
+@HPLIP_BUILD_TRUE@@SCAN_BUILD_TRUE@ libsane_hpaio_la-scl.lo \
+@HPLIP_BUILD_TRUE@@SCAN_BUILD_TRUE@ libsane_hpaio_la-io.lo \
+@HPLIP_BUILD_TRUE@@SCAN_BUILD_TRUE@ libsane_hpaio_la-common.lo \
+@HPLIP_BUILD_TRUE@@SCAN_BUILD_TRUE@ libsane_hpaio_la-sanei_init_debug.lo \
+@HPLIP_BUILD_TRUE@@SCAN_BUILD_TRUE@ libsane_hpaio_la-marvell.lo \
+@HPLIP_BUILD_TRUE@@SCAN_BUILD_TRUE@ libsane_hpaio_la-soapht.lo \
+@HPLIP_BUILD_TRUE@@SCAN_BUILD_TRUE@ libsane_hpaio_la-soap.lo \
+@HPLIP_BUILD_TRUE@@SCAN_BUILD_TRUE@ libsane_hpaio_la-xml.lo \
+@HPLIP_BUILD_TRUE@@SCAN_BUILD_TRUE@ libsane_hpaio_la-ledm.lo \
+@HPLIP_BUILD_TRUE@@SCAN_BUILD_TRUE@ libsane_hpaio_la-bb_ledm.lo \
+@HPLIP_BUILD_TRUE@@SCAN_BUILD_TRUE@ libsane_hpaio_la-http.lo
+libsane_hpaio_la_OBJECTS = $(am_libsane_hpaio_la_OBJECTS)
+libsane_hpaio_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(libsane_hpaio_la_CFLAGS) \
+ $(CFLAGS) $(libsane_hpaio_la_LDFLAGS) $(LDFLAGS) -o $@
+@HPLIP_BUILD_TRUE@@SCAN_BUILD_TRUE@am_libsane_hpaio_la_rpath = -rpath \
+@HPLIP_BUILD_TRUE@@SCAN_BUILD_TRUE@ $(libsane_hpaiodir)
+pcardext_la_LIBADD =
+am__pcardext_la_SOURCES_DIST = pcard/pcardext/pcardext.c pcard/fat.c
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@am_pcardext_la_OBJECTS = \
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@ pcardext_la-pcardext.lo \
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@ pcardext_la-fat.lo
+pcardext_la_OBJECTS = $(am_pcardext_la_OBJECTS)
+pcardext_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(pcardext_la_CFLAGS) \
+ $(CFLAGS) $(pcardext_la_LDFLAGS) $(LDFLAGS) -o $@
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@am_pcardext_la_rpath = -rpath \
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@ $(pcardextdir)
+scanext_la_LIBADD =
+am__scanext_la_SOURCES_DIST = scan/scanext/scanext.c
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@@SCAN_BUILD_TRUE@am_scanext_la_OBJECTS = scanext_la-scanext.lo
+scanext_la_OBJECTS = $(am_scanext_la_OBJECTS)
+scanext_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(scanext_la_CFLAGS) \
+ $(CFLAGS) $(scanext_la_LDFLAGS) $(LDFLAGS) -o $@
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@@SCAN_BUILD_TRUE@am_scanext_la_rpath = \
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@@SCAN_BUILD_TRUE@ -rpath \
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@@SCAN_BUILD_TRUE@ $(scanextdir)
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@am__EXEEXT_1 = ptest$(EXEEXT) \
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@ hppgsz$(EXEEXT)
+PROGRAMS = $(bin_PROGRAMS) $(hp_PROGRAMS) $(hp_mkuri_PROGRAMS) \
+ $(hpcups_PROGRAMS) $(hpcupsfax_PROGRAMS) $(hplipjs_PROGRAMS) \
+ $(hpps_PROGRAMS) $(noinst_PROGRAMS)
+am__hp_SOURCES_DIST = prnt/backend/hp.c
+@HPLIP_BUILD_TRUE@am_hp_OBJECTS = hp-hp.$(OBJEXT)
+hp_OBJECTS = $(am_hp_OBJECTS)
+@HPLIP_BUILD_TRUE@hp_DEPENDENCIES = libhpmud.la $(am__DEPENDENCIES_1)
+hp_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+ --mode=link $(CCLD) $(hp_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
+ $(LDFLAGS) -o $@
+am__hp_mkuri_SOURCES_DIST = io/hpmud/hp-mkuri.c
+@HPLIP_BUILD_TRUE@am_hp_mkuri_OBJECTS = hp_mkuri-hp-mkuri.$(OBJEXT)
+hp_mkuri_OBJECTS = $(am_hp_mkuri_OBJECTS)
+@HPLIP_BUILD_TRUE@hp_mkuri_DEPENDENCIES = libhpmud.la
+hp_mkuri_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+ --mode=link $(CCLD) $(hp_mkuri_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
+ $(LDFLAGS) -o $@
+am__hpcups_SOURCES_DIST = prnt/hpcups/HPCupsFilter.cpp \
+ prnt/hpcups/HPCupsFilter.h prnt/hpcups/dbuscomm.cpp \
+ prnt/hpcups/dbuscomm.h prnt/hpcups/Compressor.cpp \
+ prnt/hpcups/Compressor.h prnt/hpcups/Mode2.cpp \
+ prnt/hpcups/Mode2.h prnt/hpcups/Mode3.cpp prnt/hpcups/Mode3.h \
+ prnt/hpcups/Mode9.cpp prnt/hpcups/Mode9.h \
+ prnt/hpcups/Mode10.cpp prnt/hpcups/Mode10.h \
+ prnt/hpcups/ModeDeltaPlus.cpp prnt/hpcups/ModeDeltaPlus.h \
+ prnt/hpcups/ModeJbig.cpp prnt/hpcups/ModeJbig.h \
+ prnt/hpcups/ErnieFilter.cpp prnt/hpcups/ErnieFilter.h \
+ prnt/hpcups/EncapsulatorFactory.cpp \
+ prnt/hpcups/EncapsulatorFactory.h prnt/hpcups/Encapsulator.cpp \
+ prnt/hpcups/Encapsulator.h prnt/hpcups/Pcl3.cpp \
+ prnt/hpcups/Pcl3.h prnt/hpcups/Pcl3Gui.cpp \
+ prnt/hpcups/Pcl3Gui.h prnt/hpcups/Pcl3Gui2.cpp \
+ prnt/hpcups/Pcl3Gui2.h prnt/hpcups/LJMono.cpp \
+ prnt/hpcups/LJMono.h prnt/hpcups/LJColor.cpp \
+ prnt/hpcups/LJColor.h prnt/hpcups/LJFastRaster.cpp \
+ prnt/hpcups/LJFastRaster.h prnt/hpcups/LJJetReady.cpp \
+ prnt/hpcups/LJJetReady.h prnt/hpcups/LJZjStream.cpp \
+ prnt/hpcups/LJZjStream.h prnt/hpcups/LJZxStream.cpp \
+ prnt/hpcups/LJZxStream.h prnt/hpcups/Job.cpp prnt/hpcups/Job.h \
+ prnt/hpcups/Pipeline.cpp prnt/hpcups/Pipeline.h \
+ prnt/hpcups/Processor.cpp prnt/hpcups/Processor.h \
+ prnt/hpcups/RasterSender.cpp prnt/hpcups/RasterSender.h \
+ prnt/hpcups/ColorMatcher.cpp prnt/hpcups/ColorMatcher.h \
+ prnt/hpcups/Halftoner.cpp prnt/hpcups/Halftoner.h \
+ prnt/hpcups/Scaler.cpp prnt/hpcups/Scaler.h \
+ prnt/hpcups/resources.h prnt/hpcups/dj400ColorMaps.cpp \
+ prnt/hpcups/dj600ColorMaps.cpp prnt/hpcups/dj970ColorMaps.cpp \
+ prnt/hpcups/dj8xxColorMaps.cpp prnt/hpcups/dj4100ColorMaps.cpp \
+ prnt/hpcups/BreakTables.cpp prnt/hpcups/PrinterCommands.h \
+ prnt/hpcups/Utils.cpp prnt/hpcups/Utils.h \
+ prnt/hpcups/SystemServices.cpp prnt/hpcups/SystemServices.h \
+ prnt/hpcups/CommonDefinitions.h prnt/hpcups/hpjbig_wrapper.h \
+ prnt/hpcups/apPrintModes.h prnt/hpcups/dj400PrintModes.h \
+ prnt/hpcups/dj540PrintModes.h prnt/hpcups/dj600PrintModes.h \
+ prnt/hpcups/dj630PrintModes.h prnt/hpcups/dj690PrintModes.h \
+ prnt/hpcups/dj850PrintModes.h prnt/hpcups/dj890PrintModes.h \
+ prnt/hpcups/dj895PrintModes.h prnt/hpcups/dj8x5PrintModes.h \
+ prnt/hpcups/dj970PrintModes.h prnt/hpcups/Pcl3GuiPrintModes.h \
+ prnt/hpcups/Pcl3PrintModes.h prnt/hpcups/ColorMaps.h \
+ prnt/hpcups/QuickConnect.cpp prnt/hpcups/QuickConnect.h \
+ prnt/hpcups/ModeJpeg.cpp prnt/hpcups/ModeJpeg.h \
+ prnt/hpcups/jccolor.c prnt/hpcups/jinclude.h \
+ prnt/hpcups/jdatadbf.c prnt/hpcups/Lidil.cpp \
+ prnt/hpcups/Lidil.h prnt/hpcups/LidilCompress.cpp \
+ prnt/hpcups/LidilCompress.h prnt/hpcups/LidilPrintModes.h \
+ prnt/hpcups/dj3320ColorMaps.cpp \
+ prnt/hpcups/dj3600ColorMaps.cpp prnt/hpcups/dj3320PrintModes.h \
+ prnt/hpcups/dj4100PrintModes.h
+@HPCUPS_INSTALL_TRUE@am_hpcups_OBJECTS = \
+@HPCUPS_INSTALL_TRUE@ hpcups-HPCupsFilter.$(OBJEXT) \
+@HPCUPS_INSTALL_TRUE@ hpcups-dbuscomm.$(OBJEXT) \
+@HPCUPS_INSTALL_TRUE@ hpcups-Compressor.$(OBJEXT) \
+@HPCUPS_INSTALL_TRUE@ hpcups-Mode2.$(OBJEXT) \
+@HPCUPS_INSTALL_TRUE@ hpcups-Mode3.$(OBJEXT) \
+@HPCUPS_INSTALL_TRUE@ hpcups-Mode9.$(OBJEXT) \
+@HPCUPS_INSTALL_TRUE@ hpcups-Mode10.$(OBJEXT) \
+@HPCUPS_INSTALL_TRUE@ hpcups-ModeDeltaPlus.$(OBJEXT) \
+@HPCUPS_INSTALL_TRUE@ hpcups-ModeJbig.$(OBJEXT) \
+@HPCUPS_INSTALL_TRUE@ hpcups-ErnieFilter.$(OBJEXT) \
+@HPCUPS_INSTALL_TRUE@ hpcups-EncapsulatorFactory.$(OBJEXT) \
+@HPCUPS_INSTALL_TRUE@ hpcups-Encapsulator.$(OBJEXT) \
+@HPCUPS_INSTALL_TRUE@ hpcups-Pcl3.$(OBJEXT) \
+@HPCUPS_INSTALL_TRUE@ hpcups-Pcl3Gui.$(OBJEXT) \
+@HPCUPS_INSTALL_TRUE@ hpcups-Pcl3Gui2.$(OBJEXT) \
+@HPCUPS_INSTALL_TRUE@ hpcups-LJMono.$(OBJEXT) \
+@HPCUPS_INSTALL_TRUE@ hpcups-LJColor.$(OBJEXT) \
+@HPCUPS_INSTALL_TRUE@ hpcups-LJFastRaster.$(OBJEXT) \
+@HPCUPS_INSTALL_TRUE@ hpcups-LJJetReady.$(OBJEXT) \
+@HPCUPS_INSTALL_TRUE@ hpcups-LJZjStream.$(OBJEXT) \
+@HPCUPS_INSTALL_TRUE@ hpcups-LJZxStream.$(OBJEXT) \
+@HPCUPS_INSTALL_TRUE@ hpcups-Job.$(OBJEXT) \
+@HPCUPS_INSTALL_TRUE@ hpcups-Pipeline.$(OBJEXT) \
+@HPCUPS_INSTALL_TRUE@ hpcups-Processor.$(OBJEXT) \
+@HPCUPS_INSTALL_TRUE@ hpcups-RasterSender.$(OBJEXT) \
+@HPCUPS_INSTALL_TRUE@ hpcups-ColorMatcher.$(OBJEXT) \
+@HPCUPS_INSTALL_TRUE@ hpcups-Halftoner.$(OBJEXT) \
+@HPCUPS_INSTALL_TRUE@ hpcups-Scaler.$(OBJEXT) \
+@HPCUPS_INSTALL_TRUE@ hpcups-dj400ColorMaps.$(OBJEXT) \
+@HPCUPS_INSTALL_TRUE@ hpcups-dj600ColorMaps.$(OBJEXT) \
+@HPCUPS_INSTALL_TRUE@ hpcups-dj970ColorMaps.$(OBJEXT) \
+@HPCUPS_INSTALL_TRUE@ hpcups-dj8xxColorMaps.$(OBJEXT) \
+@HPCUPS_INSTALL_TRUE@ hpcups-dj4100ColorMaps.$(OBJEXT) \
+@HPCUPS_INSTALL_TRUE@ hpcups-BreakTables.$(OBJEXT) \
+@HPCUPS_INSTALL_TRUE@ hpcups-Utils.$(OBJEXT) \
+@HPCUPS_INSTALL_TRUE@ hpcups-SystemServices.$(OBJEXT) \
+@HPCUPS_INSTALL_TRUE@ hpcups-QuickConnect.$(OBJEXT) \
+@HPCUPS_INSTALL_TRUE@ hpcups-ModeJpeg.$(OBJEXT) \
+@HPCUPS_INSTALL_TRUE@ jccolor.$(OBJEXT) jdatadbf.$(OBJEXT) \
+@HPCUPS_INSTALL_TRUE@ hpcups-Lidil.$(OBJEXT) \
+@HPCUPS_INSTALL_TRUE@ hpcups-LidilCompress.$(OBJEXT) \
+@HPCUPS_INSTALL_TRUE@ hpcups-dj3320ColorMaps.$(OBJEXT) \
+@HPCUPS_INSTALL_TRUE@ hpcups-dj3600ColorMaps.$(OBJEXT)
+hpcups_OBJECTS = $(am_hpcups_OBJECTS)
+@HPCUPS_INSTALL_TRUE@hpcups_DEPENDENCIES = $(am__DEPENDENCIES_1)
+hpcups_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+ --mode=link $(CXXLD) $(hpcups_CXXFLAGS) $(CXXFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+am__hpcupsfax_SOURCES_DIST = prnt/hpijs/hpcupsfax.cpp \
+ prnt/hpijs/hpcupsfax.h
+@FAX_BUILD_TRUE@@HPCUPS_INSTALL_TRUE@@HPCUPS_ONLY_BUILD_FALSE@am_hpcupsfax_OBJECTS = hpcupsfax.$(OBJEXT)
+hpcupsfax_OBJECTS = $(am_hpcupsfax_OBJECTS)
+@FAX_BUILD_TRUE@@HPCUPS_INSTALL_TRUE@@HPCUPS_ONLY_BUILD_FALSE@hpcupsfax_DEPENDENCIES = libhpip.la
+am__hpijs_SOURCES_DIST = prnt/hpijs/hpijs.cpp prnt/hpijs/ijs_server.c \
+ prnt/hpijs/ijs.c prnt/hpijs/hpijsfax.cpp \
+ prnt/hpijs/services.cpp prnt/hpijs/bug.h prnt/hpijs/hpijs.h \
+ prnt/hpijs/ijs.h prnt/hpijs/ijs_server.h prnt/hpijs/services.h \
+ prnt/hpijs/ijs_client.h prnt/hpijs/hpiom.c prnt/hpijs/hpiom.h
+@HPIJS_INSTALL_TRUE@am_hpijs_OBJECTS = hpijs-hpijs.$(OBJEXT) \
+@HPIJS_INSTALL_TRUE@ hpijs-ijs_server.$(OBJEXT) \
+@HPIJS_INSTALL_TRUE@ hpijs-ijs.$(OBJEXT) \
+@HPIJS_INSTALL_TRUE@ hpijs-hpijsfax.$(OBJEXT) \
+@HPIJS_INSTALL_TRUE@ hpijs-services.$(OBJEXT) \
+@HPIJS_INSTALL_TRUE@ hpijs-hpiom.$(OBJEXT)
+hpijs_OBJECTS = $(am_hpijs_OBJECTS)
+@HPIJS_INSTALL_TRUE@@HPLIP_BUILD_FALSE@hpijs_DEPENDENCIES = \
+@HPIJS_INSTALL_TRUE@@HPLIP_BUILD_FALSE@ libapdk.la
+@HPIJS_INSTALL_TRUE@@HPLIP_BUILD_TRUE@hpijs_DEPENDENCIES = libapdk.la \
+@HPIJS_INSTALL_TRUE@@HPLIP_BUILD_TRUE@ libhpip.la libhpmud.la \
+@HPIJS_INSTALL_TRUE@@HPLIP_BUILD_TRUE@ $(am__DEPENDENCIES_1)
+hpijs_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+ --mode=link $(CXXLD) $(hpijs_CXXFLAGS) $(CXXFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+am__hplipjs_SOURCES_DIST = prnt/filters/hplipjs.c
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@am_hplipjs_OBJECTS = \
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@ hplipjs.$(OBJEXT)
+hplipjs_OBJECTS = $(am_hplipjs_OBJECTS)
+hplipjs_LDADD = $(LDADD)
+am__hppgsz_SOURCES_DIST = prnt/hpijs/PrinterProperties.cpp \
+ prnt/hpijs/PrinterProperties.h prnt/hpijs/bug.h
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@am_hppgsz_OBJECTS = hppgsz-PrinterProperties.$(OBJEXT)
+hppgsz_OBJECTS = $(am_hppgsz_OBJECTS)
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@hppgsz_DEPENDENCIES = libapdk.la
+hppgsz_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+ --mode=link $(CXXLD) $(hppgsz_CXXFLAGS) $(CXXFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+am__hpps_SOURCES_DIST = prnt/hpps/hppsfilter.c
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@am_hpps_OBJECTS = \
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@ hppsfilter.$(OBJEXT)
+hpps_OBJECTS = $(am_hpps_OBJECTS)
+hpps_DEPENDENCIES =
+am__ptest_SOURCES_DIST = pcard/ptest.c pcard/ptest.h pcard/fat.c \
+ pcard/fat.h
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@am_ptest_OBJECTS = ptest.$(OBJEXT) \
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@ fat.$(OBJEXT)
+ptest_OBJECTS = $(am_ptest_OBJECTS)
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@ptest_DEPENDENCIES = libhpmud.la
+am__dist_cac_SCRIPTS_DIST = prnt/filters/hpcac
+am__dist_cmd_SCRIPTS_DIST = align.py info.py print.py toolbox.py \
+ clean.py colorcal.py unload.py testpage.py makeuri.py check.py \
+ fab.py levels.py sendfax.py setup.py makecopies.py probe.py \
+ timedate.py firmware.py scan.py systray.py plugin.py \
+ linefeedcal.py pqdiag.py faxsetup.py devicesettings.py \
+ printsettings.py query.py pkservice.py wificonfig.py \
+ check-plugin.py diagnose_plugin.py uninstall.py upgrade.py \
+ config_usb_printer.py diagnose_queues.py
+am__dist_hpfax_SCRIPTS_DIST = fax/backend/hpfax.py
+am__dist_hplip_SCRIPTS_DIST = hpssd.py __init__.py hpdio.py
+am__dist_noinst_SCRIPTS_DIST = dat2drv.py install.py hplip-install \
+ init-suse-firewall init-iptables-firewall
+am__dist_rip_SCRIPTS_DIST = prnt/hpijs/foomatic-rip-hplip
+SCRIPTS = $(dist_cac_SCRIPTS) $(dist_cmd_SCRIPTS) \
+ $(dist_hpfax_SCRIPTS) $(dist_hplip_SCRIPTS) \
+ $(dist_noinst_SCRIPTS) $(dist_plugins4_SCRIPTS) \
+ $(dist_rip_SCRIPTS) $(pstotiff_SCRIPTS)
+DEFAULT_INCLUDES = -I.@am__isrc@
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
+ $(LDFLAGS) -o $@
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+ --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+ --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+ $(LDFLAGS) -o $@
+SOURCES = $(hpmudext_la_SOURCES) \
+ $(libapdk_la_SOURCES) $(libhpip_la_SOURCES) \
+ $(libhpmud_la_SOURCES) $(libsane_hpaio_la_SOURCES) \
+ $(pcardext_la_SOURCES) $(scanext_la_SOURCES) $(hp_SOURCES) \
+ $(hp_mkuri_SOURCES) $(hpcups_SOURCES) $(hpcupsfax_SOURCES) \
+ $(hpijs_SOURCES) $(hplipjs_SOURCES) $(hppgsz_SOURCES) \
+ $(hpps_SOURCES) $(ptest_SOURCES)
+DIST_SOURCES = \
+ $(am__hpmudext_la_SOURCES_DIST) $(libapdk_la_SOURCES) \
+ $(am__libhpip_la_SOURCES_DIST) $(am__libhpmud_la_SOURCES_DIST) \
+ $(am__libsane_hpaio_la_SOURCES_DIST) \
+ $(am__pcardext_la_SOURCES_DIST) $(am__scanext_la_SOURCES_DIST) \
+ $(am__hp_SOURCES_DIST) $(am__hp_mkuri_SOURCES_DIST) \
+ $(am__hpcups_SOURCES_DIST) $(am__hpcupsfax_SOURCES_DIST) \
+ $(am__hpijs_SOURCES_DIST) $(am__hplipjs_SOURCES_DIST) \
+ $(am__hppgsz_SOURCES_DIST) $(am__hpps_SOURCES_DIST) \
+ $(am__ptest_SOURCES_DIST)
+am__dist_base_DATA_DIST = base/maint.py base/codes.py base/g.py \
+ base/pml.py base/status.py base/__init__.py base/mfpdtf.py \
+ base/utils.py base/wifi.py base/LedmWifi.py base/device.py \
+ base/logger.py base/slp.py base/exif.py base/strings.py \
+ base/magic.py base/imagesize.py base/pexpect.py base/models.py \
+ base/mdns.py base/tui.py base/dime.py base/ldif.py \
+ base/vcard.py base/module.py base/pkit.py
+am__dist_copier_DATA_DIST = copier/copier.py copier/__init__.py
+am__dist_fax_DATA_DIST = fax/fax.py fax/__init__.py fax/coverpages.py \
+ fax/pmlfax.py fax/ledmfax.py fax/soapfax.py fax/ledmsoapfax.py \
+ fax/marvellfax.py fax/faxdevice.py fax/filters/pstotiff \
+ fax/filters/pstotiff.convs fax/filters/pstotiff.types
+am__dist_fax_filters_DATA_DIST = fax/filters/pstotiff.convs \
+ fax/filters/pstotiff.types
+am__dist_halpre_DATA_DIST = data/rules/20-hplip-devices.fdi
+am__dist_hpcupsfaxppd_DATA_DIST = fax/ppd/HP-Fax-hpcups.ppd.gz \
+ fax/ppd/HP-Fax2-hpcups.ppd.gz fax/ppd/HP-Fax3-hpcups.ppd.gz \
+ fax/ppd/HP-Fax4-hpcups.ppd.gz
+am__dist_hpijsfaxppd_DATA_DIST = fax/ppd/HP-Fax-hpijs.ppd.gz \
+ fax/ppd/HP-Fax2-hpijs.ppd.gz fax/ppd/HP-Fax3-hpijs.ppd.gz \
+ fax/ppd/HP-Fax4-hpijs.ppd.gz
+am__dist_images_128x128_DATA_DIST = data/images/128x128/*
+am__dist_images_16x16_DATA_DIST = data/images/16x16/*
+am__dist_images_24x24_DATA_DIST = data/images/24x24/*
+am__dist_images_256x256_DATA_DIST = data/images/256x256/*
+am__dist_images_32x32_DATA_DIST = data/images/32x32/*
+am__dist_images_64x64_DATA_DIST = data/images/64x64/*
+am__dist_images_devices_DATA_DIST = data/images/devices/*
+am__dist_images_other_DATA_DIST = data/images/other/*
+am__dist_install_DATA_DIST = installer/__init__.py installer/dcheck.py \
+ installer/distros.dat installer/core_install.py
+am__dist_ldl_DATA_DIST = data/ldl/cb2pcal.ldl.gz \
+ data/ldl/cb2pcal_done.ldl.gz data/ldl/cbbcal.ldl.gz \
+ data/ldl/cbccal.ldl.gz data/ldl/cbccal_done.ldl.gz \
+ data/ldl/cbcpcal.ldl.gz data/ldl/cbpcal.ldl.gz
+am__dist_localz_DATA_DIST = data/localization/hplip_de.qm \
+ data/localization/hplip_es.qm data/localization/hplip_fr.qm \
+ data/localization/hplip_it.qm data/localization/hplip_pt.qm \
+ data/localization/hplip_ru.qm data/localization/hplip_zh.qm
+am__dist_models_DATA_DIST = data/models/models.dat
+am__dist_noinst_DATA_DIST = scan/sane/hpaio.desc \
+ prnt/drv/hpijs.drv.in.template installer/text_install.py \
+ data/localization/hplip_de.ts data/localization/hplip_es.ts \
+ data/localization/hplip_fr.ts data/localization/hplip_it.ts \
+ data/localization/hplip_pt.ts data/localization/hplip_ru.ts \
+ data/localization/hplip_zh.ts ui/colorcalform2_base.ui \
+ ui/settingsdialog_base.ui ui/aligntype6form1_base.ui \
+ ui/aboutdlg_base.ui ui/imagepropertiesdlg_base.ui \
+ ui/paperedgealignform_base.ui ui/aligntype6form2_base.ui \
+ ui/nodevicesform_base.ui ui/cleaningform_base.ui \
+ ui/colorcalform_base.ui ui/devmgr4_base.ui \
+ ui/loadpaperform_base.ui ui/cleaningform2_base.ui \
+ ui/waitform_base.ui ui/coloradjform_base.ui \
+ ui/faxaddrbookeditform_base.ui ui/faxaddrbookform_base.ui \
+ ui/faxaddrbookgroupeditform_base.ui \
+ ui/faxaddrbookgroupsform_base.ui ui/align10form_base.ui \
+ ui/pluginform2_base.ui plugins/powersettingsdialog_base.ui \
+ ui/faxsettingsform_base.ui ui/coverpageform_base.ui \
+ ui/allowabletypesdlg_base.ui ui/setupform_base.ui \
+ ui/setupmanualfind_base.ui ui/setupsettings_base.ui \
+ ui/pluginlicenseform_base.ui ui/align13form_base.ui \
+ ui/firmwaredialog_base.ui ui4/*.ui
+am__dist_pcard_DATA_DIST = pcard/__init__.py pcard/photocard.py
+am__dist_pcl_DATA_DIST = data/pcl/align1_8xx.pcl.gz \
+ data/pcl/align1_9xx.pcl.gz data/pcl/align2_8xx.pcl.gz \
+ data/pcl/align3_8xx.pcl.gz data/pcl/align4_8xx.pcl.gz \
+ data/pcl/align5_8xx.pcl.gz data/pcl/align2_9xx.pcl.gz \
+ data/pcl/align3_9xx.pcl.gz data/pcl/align4_450.pcl.gz \
+ data/pcl/align6_450.pcl.gz data/pcl/colorcal1_450.pcl.gz \
+ data/pcl/colorcal2_450.pcl.gz data/pcl/crbcal.pcl.gz \
+ data/pcl/crcaldone.pcl.gz data/pcl/crcbcal.pcl.gz \
+ data/pcl/crccal.pcl.gz data/pcl/crcpcal.pcl.gz \
+ data/pcl/crpcal.pcl.gz
+am__dist_plugins_DATA_DIST = plugins/dj450.py plugins/__init__.py \
+ plugins/powersettings.py plugins/powersettingsdialog.py \
+ plugins/powersettingsdialog_base.py plugins/Deskjet_460.py \
+ plugins/Officejet_H470.py plugins/powersettings2.py
+am__dist_policykit_dbus_etc_DATA_DIST = \
+ data/policykit/com.hp.hplip.conf
+am__dist_policykit_dbus_share_DATA_DIST = \
+ data/policykit/com.hp.hplip.service
+am__dist_policykit_policy_DATA_DIST = \
+ data/policykit/com.hp.hplip.policy
+am__dist_postscript_DATA_DIST = data/ps/testpage.ps.gz \
+ data/ps/clean_page.pdf.gz
+am__dist_ppd_DATA_DIST = prnt/ps/hp-laserjet_4250-ps.ppd.gz \
+ prnt/ps/hp-laserjet_p3005-ps.ppd.gz \
+ prnt/ps/hp-officejet_pro_8000_enterprise_a811a-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_3700n-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_4610-ps.ppd.gz \
+ prnt/ps/hp-designjet_4020ps-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_4550-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cp5225-ps.ppd.gz \
+ prnt/ps/hp-laserjet_3015-ps.ppd.gz \
+ prnt/ps/hp-designjet_t1100ps_24in-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cm2320n_mfp-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cp3525-ps.ppd.gz \
+ prnt/ps/hp-laserjet_9055mfp-ps.ppd.gz \
+ prnt/ps/hp-business_inkjet_2250-ps.ppd.gz \
+ prnt/ps/hp-laserjet_m3035_mfp-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cm6040_mfp-ps.ppd.gz \
+ prnt/ps/hp-designjet_4000ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_2605dn-ps.ppd.gz \
+ prnt/ps/hp-laserjet_600_m601_m602_m603-ps.ppd.gz \
+ prnt/ps/hp-laserjet_m3027_mfp-ps.ppd.gz \
+ prnt/ps/hp-laserjet_5000_series-ps.ppd.gz \
+ prnt/ps/hp-laserjet_m4555_mfp-ps.ppd.gz \
+ prnt/ps/hp-laserjet_cp1520_series-ps.ppd.gz \
+ prnt/ps/hp-laserjet_8000-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cm6030_mfp-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cp2025n-ps.ppd.gz \
+ prnt/ps/hp-designjet_t1300_postscript-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_2605-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_4650-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cp5225n-ps.ppd.gz \
+ prnt/ps/hp-laserjet_cm1410_series-ps.ppd.gz \
+ prnt/ps/hp-laserjet_1320_series-ps.ppd.gz \
+ prnt/ps/hp-laserjet_4300-ps.ppd.gz \
+ prnt/ps/hp-laserjet_9065mfp-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cp4020_series-ps.ppd.gz \
+ prnt/ps/hp-designjet_t790ps_24in-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_4700-ps.ppd.gz \
+ prnt/ps/hp-laserjet_5200lx-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_2800-ps.ppd.gz \
+ prnt/ps/hp-laserjet_2200-ps.ppd.gz \
+ prnt/ps/hp-designjet_z6200_42in_photo-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cp2025x-ps.ppd.gz \
+ prnt/ps/hp-designjet_t770_postscript-ps.ppd.gz \
+ prnt/ps/hp-laserjet_2430-ps.ppd.gz \
+ prnt/ps/hp-laserjet_9040-ps.ppd.gz \
+ prnt/ps/hp-designjet_t790ps_44in-ps.ppd.gz \
+ prnt/ps/hp-laserjet_1300-ps.ppd.gz \
+ prnt/ps/hp-laserjet_5200-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cm2320nf_mfp-ps.ppd.gz \
+ prnt/ps/hp-laserjet_m1522n_mfp-ps.ppd.gz \
+ prnt/ps/hp-designjet_4520ps-ps.ppd.gz \
+ prnt/ps/hp-designjet_t7100ps_monochrome-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cp1514n-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_2500-ps.ppd.gz \
+ prnt/ps/hp-designjet_t1120ps_24in-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cm2320fxi_mfp-ps.ppd.gz \
+ prnt/ps/hp-laserjet_m9050_mfp-ps.ppd.gz \
+ prnt/ps/hp-laserjet_4200-ps.ppd.gz \
+ prnt/ps/hp-laserjet_9040_mfp-ps.ppd.gz \
+ prnt/ps/hp-designjet_t1100ps_44in-ps.ppd.gz \
+ prnt/ps/hp-laserjet_4100_mfp-ps.ppd.gz \
+ prnt/ps/hp-laserjet_4_plus-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cp4005-ps.ppd.gz \
+ prnt/ps/hp-laserjet_9000_series-ps.ppd.gz \
+ prnt/ps/hp-mopier_320-ps.ppd.gz \
+ prnt/ps/hp-business_inkjet_2280-ps.ppd.gz \
+ prnt/ps/hp-laserjet_4-ps.ppd.gz \
+ prnt/ps/hp-laserjet_500_color_m551-ps.ppd.gz \
+ prnt/ps/hp-laserjet_4240-ps.ppd.gz \
+ prnt/ps/hp-laserjet_3300_3310_3320-ps.ppd.gz \
+ prnt/ps/hp-business_inkjet_3000-ps.ppd.gz \
+ prnt/ps/hp-laserjet_1220se-ps.ppd.gz \
+ prnt/ps/hp-designjet_4500ps.ppd.gz \
+ prnt/ps/hp-laserjet_1200n-ps.ppd.gz \
+ prnt/ps/hp-laserjet_5100_series-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cm4540_mfp-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_5m-ps.ppd.gz \
+ prnt/ps/hp-laserjet_m1530_mfp_series-ps.ppd.gz \
+ prnt/ps/hp-laserjet_4100_series-ps.ppd.gz \
+ prnt/ps/hp-cm8050_mfp_with_edgeline-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_3800-ps.ppd.gz \
+ prnt/ps/hp-laserjet_1320tn-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cp1515n-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_2840-ps.ppd.gz \
+ prnt/ps/hp-laserjet_4345_mfp-ps.ppd.gz \
+ prnt/ps/hp-laserjet_4si-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cp6015-ps.ppd.gz \
+ prnt/ps/hp-laserjet_4mp-ps.ppd.gz \
+ prnt/ps/hp-laserjet_2300_series-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_8500-ps.ppd.gz \
+ prnt/ps/hp-laserjet_8100_series-ps.ppd.gz \
+ prnt/ps/hp-laserjet_1320-ps.ppd.gz \
+ prnt/ps/hp-designjet_4500mfp.ppd.gz \
+ prnt/ps/hp-laserjet_6mp-ps.ppd.gz \
+ prnt/ps/hp-cm8060_mfp_with_edgeline-ps.ppd.gz \
+ prnt/ps/hp-laserjet_5200l-ps.ppd.gz \
+ prnt/ps/hp-laserjet_3052-ps.ppd.gz \
+ prnt/ps/hp-laserjet_100_color_mfp_m175-ps.ppd.gz \
+ prnt/ps/hp-laserjet_m1522nf_mfp-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cm1015-ps.ppd.gz \
+ prnt/ps/hp-laserjet_p2055_series-ps.ppd.gz \
+ prnt/ps/hp-laserjet_200_colormfp_m275-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_8550-ps.ppd.gz \
+ prnt/ps/hp-laserjet_1220-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_2700n-ps.ppd.gz \
+ prnt/ps/hp-laserjet_1300xi-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cp5520_series-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_2605dtn-ps.ppd.gz \
+ prnt/ps/hp-designjet_z6100ps_60in_photo-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_3000-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cm1312_mfp-ps.ppd.gz \
+ prnt/ps/hp-laserjet_2420-ps.ppd.gz \
+ prnt/ps/hp-laserjet_5mp-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_2550_series-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_9500-ps.ppd.gz \
+ prnt/ps/hp-laserjet_8150_mfp-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cp5225dn-ps.ppd.gz \
+ prnt/ps/hp-laserjet_m5035_mfp-ps.ppd.gz \
+ prnt/ps/hp-laserjet_2200_series-ps.ppd.gz \
+ prnt/ps/hp-laserjet_m1522_mfp-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cp3505-ps.ppd.gz \
+ prnt/ps/hp-business_inkjet_2800-ps.ppd.gz \
+ prnt/ps/hp-laserjet_4350-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet-ps.ppd.gz \
+ prnt/ps/hp-laserjet_m5025_mfp-ps.ppd.gz \
+ prnt/ps/hp-laserjet_2100-ps.ppd.gz \
+ prnt/ps/hp-laserjet_p3010_series-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_4500-ps.ppd.gz \
+ prnt/ps/hp-laserjet_3050-ps.ppd.gz \
+ prnt/ps/hp-laserjet_3200m-ps.ppd.gz \
+ prnt/ps/hp-laserjet_1300n-ps.ppd.gz \
+ prnt/ps/hp-laserjet_3380-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_2830-ps.ppd.gz \
+ prnt/ps/hp-laserjet_9050-ps.ppd.gz \
+ prnt/ps/hp-laserjet_5si_mopier-ps.ppd.gz \
+ prnt/ps/hp-lj_300_400_color_mfp_m375_m475-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_4600_series-ps.ppd.gz \
+ prnt/ps/hp-designjet_t7100ps-ps.ppd.gz \
+ prnt/ps/hp-designjet_t770ps_24in-ps.ppd.gz \
+ prnt/ps/hp-designjet_z6100ps_42in_photo-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cm4730_mfp-ps.ppd.gz \
+ prnt/ps/hp-laserjet_3030-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_9500_mfp-ps.ppd.gz \
+ prnt/ps/hp-laserjet_m4345_mfp-ps.ppd.gz \
+ prnt/ps/hp-laserjet_p3004-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_4730mfp-ps.ppd.gz \
+ prnt/ps/hp-laserjet_m4349_mfp-ps.ppd.gz \
+ prnt/ps/hp-laserjet_5p-ps.ppd.gz \
+ prnt/ps/hp-designjet_t2300_postscript-ps.ppd.gz \
+ prnt/ps/hp-laserjet_m9059_mfp-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_3700-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cp2025dn-ps.ppd.gz \
+ prnt/ps/hp-laserjet_5000-ps.ppd.gz \
+ prnt/ps/hp-laserjet_p4010_series-ps.ppd.gz \
+ prnt/ps/hp-laserjet_1320n-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cm6049_mfp-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_2700-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cp4520_series-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_5500-ps.ppd.gz \
+ prnt/ps/hp-laserjet_m2727_mfp_series-ps.ppd.gz \
+ prnt/ps/hp-laserjet_2300-ps.ppd.gz \
+ prnt/ps/hp-laserjet_3390-ps.ppd.gz \
+ prnt/ps/hp-business_inkjet_2600-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cm1312nfi_mfp-ps.ppd.gz \
+ prnt/ps/hp-laserjet_3020-ps.ppd.gz \
+ prnt/ps/hp-laserjet_1320nw-ps.ppd.gz \
+ prnt/ps/hp-laserjet_4050_series-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_5550-ps.ppd.gz \
+ prnt/ps/hp-laserjet_p2015_series-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cm1017-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_2820-ps.ppd.gz \
+ prnt/ps/hp-laserjet_4v-ps.ppd.gz \
+ prnt/ps/hp-laserjet_2100_series-ps.ppd.gz \
+ prnt/ps/hp-laserjet_9050_mfp-ps.ppd.gz \
+ prnt/ps/hp-business_inkjet_2300-ps.ppd.gz \
+ prnt/ps/hp-designjet_z6200_60in_photo-ps.ppd.gz \
+ prnt/ps/hp-laserjet_5si-ps.ppd.gz \
+ prnt/ps/hp-designjet_4520mfp-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cp1518ni-ps.ppd.gz \
+ prnt/ps/hp-laserjet_2410-ps.ppd.gz \
+ prnt/ps/hp-designjet_t1120ps_44in-ps.ppd.gz \
+ prnt/ps/hp-mopier_240-ps.ppd.gz \
+ prnt/ps/hp-laserjet_6p-ps.ppd.gz \
+ prnt/ps/hp-laserjet_1200-ps.ppd.gz \
+ prnt/ps/hp-designjet_t1200_postscript-ps.ppd.gz \
+ prnt/ps/hp-laserjet_4ml-ps.ppd.gz \
+ prnt/ps/hp-laserjet_m9040_mfp-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_4600-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cp2025-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cm3530_mfp-ps.ppd.gz \
+ prnt/ps/hp-laserjet_8100_mfp-ps.ppd.gz \
+ prnt/ps/hp-laserjet_8000_series-ps.ppd.gz \
+ prnt/ps/hp-laserjet_4000_series-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_2500_series-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cm2320_mfp-ps.ppd.gz \
+ prnt/ps/hp-lj_300_400_color_m351_m451-ps.ppd.gz \
+ prnt/ps/hp-laserjet_9000_mfp-ps.ppd.gz \
+ ppd/hpijs/hp-deskjet_690-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cp4520_series-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_825c-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_7000_e809a_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_7345-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_a520_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_f2200_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_1320nw-hpijs.ppd.gz \
+ ppd/hpijs/hp-business_inkjet_2280-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cp2025-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_2500_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_a320_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_2500-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-photosmart_7510_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_8550-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_2100_series-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_630c-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_pro_k550-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_f735-hpijs.ppd.gz \
+ ppd/hpijs/hp-psc_920-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_series_600-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_5105-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_240_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_5400_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_4si-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-photosmart_plus_b210_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_9000_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-photosmart_a310_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_3700-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_5652-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_3700n-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_3320-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cp2025n-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-officejet_j5700_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_j3600_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_m3027_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_p1009-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_1160_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p1007-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_4550-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-officejet_7000_e809a-hpijs.ppd.gz \
+ ppd/hpijs/hp-psc_1500_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_500-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_f4100_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_a630_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_pro_8500_a910-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_b010_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_690c-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_professional_p1606dn-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_5600_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_4105-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_8100_series-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_4730mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-photosmart_3100_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_m1120n_mfp-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_pro_k5300-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_b109a_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_520-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_5200-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_5551-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_4v-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_935c-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_professional_p1102w-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_3650-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_cp_1025nw-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_3500-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_r60-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_inkjet_cp1700-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p4015tn-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_series_320-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cp4020_series-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_5100_series-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_ink_advant_k109a-z-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_1200-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_895c-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_professional_p1106-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_v30-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_4100_series-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-officejet_series_350-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_9300-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_c6300_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cm6030_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_3819-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_948c-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_697-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_d_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_d730-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_330_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_7400_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p2015x_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_3000_j310_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_d2300_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-business_inkjet_2230-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_2300_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_5p-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_8000_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p4515tn-hpijs.ppd.gz \
+ ppd/hpijs/hp-business_inkjet_2800-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-photosmart_2700_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p4515-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_4200_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_j3500_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_series_725-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_pro_b8800_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-psc_950vr-hpijs.ppd.gz \
+ ppd/hpijs/hp-psc_2150_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_m4345_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_505j-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_c4200_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_3380-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-officejet_pro_l7700-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_4200-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-officejet_series_310-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cm2320nf_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_f4500_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_8150_mfp-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_7550-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_2200-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-officejet_5110v-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_640c-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_3740-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_c5100_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_f2400_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_812c-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_9050-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-photosmart_5510_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p4014dn-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_d7200_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_r45-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_professional_m1217nfw_mfp-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_1600cm-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p2035-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_p2055dn-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_4650-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cp3525-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_cm1418fnw-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_cm1412fn-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_p4015n-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_g55xi-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_9000_series-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-psc_1600_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_5552-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_pro_8500_a909n-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cm1312nfi_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-officejet_g85xi-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_c4100_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-915-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_3200se-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_9040_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_9040-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_9800-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_3810-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_1200c-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_3500-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_c6200_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_professional_p1566-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p4014n-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_3870-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p2035n-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-officejet_pro_8600-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_pro_1150c-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_7150-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_4500-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-officejet_j4500_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_7500_e910-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p4015x-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_882c-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_933c-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_950c-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_f4210_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-dj450-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_a430_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_3055-hpijs.ppd.gz \
+ ppd/hpijs/hp-business_inkjet_2600-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_p1505n-hpijs-zxs.ppd.gz \
+ ppd/hpijs/hp-photosmart_c7200_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_1022n-hpijs-zjs.ppd.gz \
+ ppd/hpijs/hp-photosmart_470_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_1300-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_841c-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_3050_j610_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_6100-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_c3100_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_843c-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_c5200_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_m1120_mfp-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_1150-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_m5025_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_5si_mopier-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_510-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_series_520-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_5-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_3420-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_890c-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_3550-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cp1515n-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-officejet_4500_g510g-m-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p2015dn_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_2000_j210_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_1600-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_f4200_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_842c-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_3550-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_830c-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_1120-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_k60-hpijs.ppd.gz \
+ ppd/hpijs/hp-psc_1400_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_4050_series-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_6l-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_610cl-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_a610_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_3330-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_845c-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_m1005-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_6800-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_380_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_pro_l7400-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p1005-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_7800_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_4ml-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_series_300-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_cm1415fnw-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_5550-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_professional_p_1102w-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_4600-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_3300_3310_3320-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_4_plus-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_d1300_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-psc_2300_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_a710_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_1220-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_p2014-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_m9059_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_5200l-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_957c-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_6940_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_940c-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_5500_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_r80xi-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_1000_j110_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_cp_1025-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_995c-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_d4300_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_d110_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_ink_adv_2060_k110-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_692-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_pro_k8600-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_1215-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_6120-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_7600_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_c4500_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-psc_2350_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_3425-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p4014-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p2055-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_4240-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-printer_scanner_copier_300-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_d4100_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_400l-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_682-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_5100-hpijs.ppd.gz \
+ ppd/hpijs/hp-psc_780xi-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_series_330-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_m5039_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-envy_100_d410_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_815c-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cm4540_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_1300n-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-business_inkjet_2250-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-photosmart_ink_adv_k510-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_612c-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_m5035_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_1300xi-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_1200n-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_g85-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_p1100-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_1005_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_3392-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_1010-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_m4349_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_3822-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_r40-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_3800-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-photosmart_c4340_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_1320_series-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_990c-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_5000-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_5600-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_professional_m1214nfh_mfp-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cp5225n-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-photosmart_5510d_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_8100_mfp-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_4mp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_540-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_d7400_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_series_710-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_3030-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-officejet_r65-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_cp1025nw-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_5700-hpijs.ppd.gz \
+ ppd/hpijs/hp-psc_500-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_b110_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-psc_720-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_550c-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_1315-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cp2025dn-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-photosmart_7700_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_cm1411fn-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cp6015-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_670tv-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_930c-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_6500_e709a-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_2600n-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_6500_e710a-f-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p4015dn-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_3920-hpijs.ppd.gz \
+ ppd/hpijs/hp-business_inkjet_1100-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_6mp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_9500-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_1020-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_694-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_3910-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_1022-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-officejet-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_f2100_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_6700-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_3020-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_p2035-hpijs-zjs.ppd.gz \
+ ppd/hpijs/hp-officejet_4500_g510n-z-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_plus_b209a-m-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_g55-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_8700_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_5m-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_d2600_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_c8100_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_k80xi-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p1006-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_1000-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_series_580-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p1505-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_premium_c309g-m-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_p1000-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_7200_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_b8500_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_9050_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-officejet_series_570-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_460-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_7900_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_c5500_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-2000c-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_c4380_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_3200-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_cm1415fn-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_3000-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_d1500_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_8400_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_m9040_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_3015-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-psc_1310_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_7350-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_3940-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_prem_c310_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_6122-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_695-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_100_mobile_l411-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_816c-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_d1400_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_4610-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cm6040_mfp-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p4015-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_1022n-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-officejet_7300_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_2100-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_cm1416fnw-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-officejet_r80-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_4700-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-officejet_4100_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_m2727_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-photosmart_d7300_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_810c-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_4000_series-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_p2055d-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-photosmart_wireless_b109n-z-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_pro_l7600-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_ink_advant_k209a-z-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_5mp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_3100-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_9055mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cp1217-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_h470-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_975c-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p2014n-hpijs-zxs.ppd.gz \
+ ppd/hpijs/hp-officejet_5100_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_6980_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_professional_p1102-hpijs.ppd.gz \
+ ppd/hpijs/hp-business_inkjet_2200-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p4515x-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_pro_k5400-hpijs.ppd.gz \
+ ppd/hpijs/hp-psc_950xi-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_j5500_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-psc_1300_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_632c-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_d5100_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_932c-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_230-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_140_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_cm1417fnw-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-psc_1358_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_k60xi-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_4l-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_6127-hpijs.ppd.gz \
+ ppd/hpijs/hp-psc_750-hpijs.ppd.gz \
+ ppd/hpijs/hp-psc_1100_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_600-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p3005-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-officejet_series_700-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_6500-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cm4730_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_9065mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_4100_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-officejet_6000_e609n-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_8150_series-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_3500n-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_8200_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_professional_m1213nf_mfp-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_8000-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cm3530_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-photosmart_a510_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_pro_8000_a809-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_6510_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_3840-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_f300_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p2015n_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_b109a-m-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_2200_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_pro_8100-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_5200lx-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_6500_e710n-z-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_7100_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_2600_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_professional_m1212nf_mfp-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_5800-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_1022-hpijs-zjs.ppd.gz \
+ ppd/hpijs/hp-officejet_4400_k410-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cp3505-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_p2015_series-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_670c-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_670-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_2050_j510_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_4000_k210-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_6500_e709n-hpijs.ppd.gz \
+ ppd/hpijs/hp-psc_2100_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_c6100_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_656c-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_934c-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_k80-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_1100xi-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_610c-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_4500_g510a-f-hpijs.ppd.gz \
+ ppd/hpijs/hp-psc_2170_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cp4005-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_3900-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cp5225-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-business_inkjet_2300-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_4250-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-officejet_k7100-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_2430-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_955c-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_850c-hpijs.ppd.gz \
+ ppd/hpijs/hp-psc_2200_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_1018-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_pro_1170c_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-2500c-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_pro_b8300_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_6p-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_series_590-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_3200_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-mopier_320-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-psc_780-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_2410-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-officejet_j4660_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_3600-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_5110-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_v40-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_c4700_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_1218-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_m1538dnf_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_3600-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_c4400_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_1320n-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_1022nw-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_professional_m1132_mfp-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_5900_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_400-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_832c-hpijs.ppd.gz \
+ ppd/hpijs/hp-psc_760-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_3450-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_d5060_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_8000_series-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-psc_2210_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p4515n-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_500c-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_ink_adv_2010_k010-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_j4680_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_9600-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_952c-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_100-hpijs.ppd.gz \
+ ppd/hpijs/hp-psc_1510_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_4300_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_1022nw-hpijs-zjs.ppd.gz \
+ ppd/hpijs/hp-officejet_6150_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_v45-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p1505n-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-officejet_pro_k850-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_6200_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_1220c-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_3052-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cm1312_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-photosmart_c4600_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-business_inkjet_3000-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_959c-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_pro_l7300-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_professional_m1216nfh_mfp-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_d7100_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_8500-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-photosmart_7200_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_estn_c510_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_d7500_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_6100_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_d6100_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_4350-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-910-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_6300_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_420_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_a820_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_3150-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_4150_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_professional_m1219nf_mfp-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p2014-hpijs-zxs.ppd.gz \
+ ppd/hpijs/hp-psc_1000_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_7400_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_5l-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_8100_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_970c-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_r40xi-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_680-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_cp1025-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_professional_m1136_mfp-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_series_610-hpijs.ppd.gz \
+ ppd/hpijs/hp-dj350-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_m1319f_mfp-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p2035n-hpijs-zjs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cm2320n_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-photosmart_d5400_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_3050a_j611_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cp2025x-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_d1600_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p2055x-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_3816-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_prem_c410_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_c309a_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_3050-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_5650-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_1050_j410_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_672c-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_370_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_320_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_1015-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_m1522nf_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-officejet_t_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_5500-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_1280-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_4115_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_3200m-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-photosmart_2570_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-psc_2400_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_m1539dnf_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_1220se-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cp5225dn-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_f4213_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cm6049_mfp-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_m1536dnf_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-officejet_6000_e609a-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_660-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_c7100_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_916c-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_1012-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_1100a-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_d4200_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_9100_series-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_professional_p1108-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p3004-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_cm1413fn-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-officejet_g95-hpijs.ppd.gz \
+ ppd/hpijs/hp-psc_1200_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_5000_series-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_1100-hpijs.ppd.gz \
+ ppd/hpijs/hp-business_inkjet_1200-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_3550n-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_4500_k710-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_c5300_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p2015d_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_130-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_9500_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cp1518ni-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_5550-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-mopier_240-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_p3010_series-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_693-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_series_630-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_648c-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_pro_8500_a909a-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cp1514n-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-psc_950-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_f4400_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_920c-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_prem-web_c309n-s-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_d2400_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_5si-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cp1215-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_series_720-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_v40xi-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_d2500_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_3070_b611_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_pro_8500_a909g-hpijs.ppd.gz \
+ ppd/hpijs/hp-cp1160-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_3820-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_6600-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cp5520_series-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-officejet_lx-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_2300-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-business_inkjet_1000-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_1160-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_a620_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_3300_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_980c-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_870c-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p1008-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_inkjet_printer_cp1700-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_855c-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_880c-hpijs.ppd.gz \
+ ppd/hpijs/hp-psc_2500_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_3390-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_p4515xm-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_6600-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_2420-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_1600cn-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_1115-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p2014n-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_1320-hpijs.ppd.gz \
+ ppd/hpijs/hp-psc_750xi-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_1320tn-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_1100-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_840c-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_5850-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_960c-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_4345_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_m1537dnf_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-officejet_4255-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_d5300_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_j6400_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_1600c-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_4600_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-psc_900_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cm2320_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_m3035_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_4300-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_d5500_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_1125-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_a640_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-envy_110_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_pro_l7500-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cm2320fxi_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_m9050_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-photosmart_a530_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_a440_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_3325-hpijs.ppd.gz \
+ ppd/hpcups/apollo-2100.ppd.gz ppd/hpcups/apollo-2150.ppd.gz \
+ ppd/hpcups/apollo-2200.ppd.gz ppd/hpcups/apollo-2500.ppd.gz \
+ ppd/hpcups/apollo-2600.ppd.gz ppd/hpcups/apollo-2650.ppd.gz \
+ ppd/hpcups/apollo-p2000-u.ppd.gz \
+ ppd/hpcups/apollo-p2250.ppd.gz ppd/hpcups/hp-2000c.ppd.gz \
+ ppd/hpcups/hp-2500c.ppd.gz ppd/hpcups/hp-910.ppd.gz \
+ ppd/hpcups/hp-915.ppd.gz \
+ ppd/hpcups/hp-business_inkjet_1000.ppd.gz \
+ ppd/hpcups/hp-business_inkjet_1100.ppd.gz \
+ ppd/hpcups/hp-business_inkjet_1200.ppd.gz \
+ ppd/hpcups/hp-business_inkjet_2200.ppd.gz \
+ ppd/hpcups/hp-business_inkjet_2230.ppd.gz \
+ ppd/hpcups/hp-business_inkjet_2250-pcl3.ppd.gz \
+ ppd/hpcups/hp-business_inkjet_2280-pcl3.ppd.gz \
+ ppd/hpcups/hp-business_inkjet_2300-pcl3.ppd.gz \
+ ppd/hpcups/hp-business_inkjet_2600-pcl3.ppd.gz \
+ ppd/hpcups/hp-business_inkjet_2800-pcl3.ppd.gz \
+ ppd/hpcups/hp-business_inkjet_3000-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_inkjet_cp1700.ppd.gz \
+ ppd/hpcups/hp-color_inkjet_printer_cp1700.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_1600.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_2500-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_2500_series.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_2600n.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_3000-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_3500n.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_3500.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_3550n.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_3550.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_3600.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_3700n.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_3700-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_3800-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_4500-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_4550-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_4600-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_4600_series.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_4610-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_4650-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_4700-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_4730mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_5500-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_5550-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_5m-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_5.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_8500-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_8550-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_9500_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_9500-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cm1312_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cm1312nfi_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cm2320fxi_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cm2320_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cm2320nf_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cm2320n_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cm3530_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cm4540_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cm4730_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cm6030_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cm6040_mfp.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cm6049_mfp.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cp1215.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cp1217.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cp1514n-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cp1515n-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cp1518ni-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cp2025dn-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cp2025n-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cp2025-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cp2025x-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cp3505-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cp3525-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cp4005-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cp4020_series-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cp4520_series-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cp5225dn-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cp5225n-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cp5225-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cp5520_series-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cp6015-pcl3.ppd.gz \
+ ppd/hpcups/hp-cp1160.ppd.gz \
+ ppd/hpcups/hp-deskjet_1000_j110_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_1050_j410_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_1100.ppd.gz \
+ ppd/hpcups/hp-deskjet_1120.ppd.gz \
+ ppd/hpcups/hp-deskjet_1125.ppd.gz \
+ ppd/hpcups/hp-deskjet_1200c.ppd.gz \
+ ppd/hpcups/hp-deskjet_1220c.ppd.gz \
+ ppd/hpcups/hp-deskjet_1280.ppd.gz \
+ ppd/hpcups/hp-deskjet_1600cm.ppd.gz \
+ ppd/hpcups/hp-deskjet_1600cn.ppd.gz \
+ ppd/hpcups/hp-deskjet_1600c.ppd.gz \
+ ppd/hpcups/hp-deskjet_2000_j210_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_2050_j510_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_3000_j310_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_3050a_j611_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_3050_j610_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_3070_b611_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_3320.ppd.gz \
+ ppd/hpcups/hp-deskjet_3325.ppd.gz \
+ ppd/hpcups/hp-deskjet_3420.ppd.gz \
+ ppd/hpcups/hp-deskjet_3425.ppd.gz \
+ ppd/hpcups/hp-deskjet_3450.ppd.gz \
+ ppd/hpcups/hp-deskjet_3500.ppd.gz \
+ ppd/hpcups/hp-deskjet_3550.ppd.gz \
+ ppd/hpcups/hp-deskjet_3600.ppd.gz \
+ ppd/hpcups/hp-deskjet_3650.ppd.gz \
+ ppd/hpcups/hp-deskjet_3740.ppd.gz \
+ ppd/hpcups/hp-deskjet_3810.ppd.gz \
+ ppd/hpcups/hp-deskjet_3816.ppd.gz \
+ ppd/hpcups/hp-deskjet_3819.ppd.gz \
+ ppd/hpcups/hp-deskjet_3820.ppd.gz \
+ ppd/hpcups/hp-deskjet_3822.ppd.gz \
+ ppd/hpcups/hp-deskjet_3840.ppd.gz \
+ ppd/hpcups/hp-deskjet_3870.ppd.gz \
+ ppd/hpcups/hp-deskjet_3900.ppd.gz \
+ ppd/hpcups/hp-deskjet_3910.ppd.gz \
+ ppd/hpcups/hp-deskjet_3920.ppd.gz \
+ ppd/hpcups/hp-deskjet_3940.ppd.gz \
+ ppd/hpcups/hp-deskjet_400l.ppd.gz \
+ ppd/hpcups/hp-deskjet_400.ppd.gz \
+ ppd/hpcups/hp-deskjet_460.ppd.gz \
+ ppd/hpcups/hp-deskjet_500c.ppd.gz \
+ ppd/hpcups/hp-deskjet_500.ppd.gz \
+ ppd/hpcups/hp-deskjet_505j.ppd.gz \
+ ppd/hpcups/hp-deskjet_5100.ppd.gz \
+ ppd/hpcups/hp-deskjet_510.ppd.gz \
+ ppd/hpcups/hp-deskjet_520.ppd.gz \
+ ppd/hpcups/hp-deskjet_5400_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_540.ppd.gz \
+ ppd/hpcups/hp-deskjet_550c.ppd.gz \
+ ppd/hpcups/hp-deskjet_5550.ppd.gz \
+ ppd/hpcups/hp-deskjet_5551.ppd.gz \
+ ppd/hpcups/hp-deskjet_5552.ppd.gz \
+ ppd/hpcups/hp-deskjet_5600.ppd.gz \
+ ppd/hpcups/hp-deskjet_5650.ppd.gz \
+ ppd/hpcups/hp-deskjet_5652.ppd.gz \
+ ppd/hpcups/hp-deskjet_5700.ppd.gz \
+ ppd/hpcups/hp-deskjet_5800.ppd.gz \
+ ppd/hpcups/hp-deskjet_5850.ppd.gz \
+ ppd/hpcups/hp-deskjet_5900_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_600.ppd.gz \
+ ppd/hpcups/hp-deskjet_610cl.ppd.gz \
+ ppd/hpcups/hp-deskjet_610c.ppd.gz \
+ ppd/hpcups/hp-deskjet_6120.ppd.gz \
+ ppd/hpcups/hp-deskjet_6122.ppd.gz \
+ ppd/hpcups/hp-deskjet_6127.ppd.gz \
+ ppd/hpcups/hp-deskjet_612c.ppd.gz \
+ ppd/hpcups/hp-deskjet_630c.ppd.gz \
+ ppd/hpcups/hp-deskjet_632c.ppd.gz \
+ ppd/hpcups/hp-deskjet_640c.ppd.gz \
+ ppd/hpcups/hp-deskjet_648c.ppd.gz \
+ ppd/hpcups/hp-deskjet_6500.ppd.gz \
+ ppd/hpcups/hp-deskjet_656c.ppd.gz \
+ ppd/hpcups/hp-deskjet_6600.ppd.gz \
+ ppd/hpcups/hp-deskjet_660.ppd.gz \
+ ppd/hpcups/hp-deskjet_670c.ppd.gz \
+ ppd/hpcups/hp-deskjet_670.ppd.gz \
+ ppd/hpcups/hp-deskjet_670tv.ppd.gz \
+ ppd/hpcups/hp-deskjet_672c.ppd.gz \
+ ppd/hpcups/hp-deskjet_6800.ppd.gz \
+ ppd/hpcups/hp-deskjet_680.ppd.gz \
+ ppd/hpcups/hp-deskjet_682.ppd.gz \
+ ppd/hpcups/hp-deskjet_690c.ppd.gz \
+ ppd/hpcups/hp-deskjet_690.ppd.gz \
+ ppd/hpcups/hp-deskjet_692.ppd.gz \
+ ppd/hpcups/hp-deskjet_693.ppd.gz \
+ ppd/hpcups/hp-deskjet_6940_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_694.ppd.gz \
+ ppd/hpcups/hp-deskjet_695.ppd.gz \
+ ppd/hpcups/hp-deskjet_697.ppd.gz \
+ ppd/hpcups/hp-deskjet_6980_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_810c.ppd.gz \
+ ppd/hpcups/hp-deskjet_812c.ppd.gz \
+ ppd/hpcups/hp-deskjet_815c.ppd.gz \
+ ppd/hpcups/hp-deskjet_816c.ppd.gz \
+ ppd/hpcups/hp-deskjet_825c.ppd.gz \
+ ppd/hpcups/hp-deskjet_830c.ppd.gz \
+ ppd/hpcups/hp-deskjet_832c.ppd.gz \
+ ppd/hpcups/hp-deskjet_840c.ppd.gz \
+ ppd/hpcups/hp-deskjet_841c.ppd.gz \
+ ppd/hpcups/hp-deskjet_842c.ppd.gz \
+ ppd/hpcups/hp-deskjet_843c.ppd.gz \
+ ppd/hpcups/hp-deskjet_845c.ppd.gz \
+ ppd/hpcups/hp-deskjet_850c.ppd.gz \
+ ppd/hpcups/hp-deskjet_855c.ppd.gz \
+ ppd/hpcups/hp-deskjet_870c.ppd.gz \
+ ppd/hpcups/hp-deskjet_880c.ppd.gz \
+ ppd/hpcups/hp-deskjet_882c.ppd.gz \
+ ppd/hpcups/hp-deskjet_890c.ppd.gz \
+ ppd/hpcups/hp-deskjet_895c.ppd.gz \
+ ppd/hpcups/hp-deskjet_916c.ppd.gz \
+ ppd/hpcups/hp-deskjet_920c.ppd.gz \
+ ppd/hpcups/hp-deskjet_9300.ppd.gz \
+ ppd/hpcups/hp-deskjet_930c.ppd.gz \
+ ppd/hpcups/hp-deskjet_932c.ppd.gz \
+ ppd/hpcups/hp-deskjet_933c.ppd.gz \
+ ppd/hpcups/hp-deskjet_934c.ppd.gz \
+ ppd/hpcups/hp-deskjet_935c.ppd.gz \
+ ppd/hpcups/hp-deskjet_940c.ppd.gz \
+ ppd/hpcups/hp-deskjet_948c.ppd.gz \
+ ppd/hpcups/hp-deskjet_950c.ppd.gz \
+ ppd/hpcups/hp-deskjet_952c.ppd.gz \
+ ppd/hpcups/hp-deskjet_955c.ppd.gz \
+ ppd/hpcups/hp-deskjet_957c.ppd.gz \
+ ppd/hpcups/hp-deskjet_959c.ppd.gz \
+ ppd/hpcups/hp-deskjet_9600.ppd.gz \
+ ppd/hpcups/hp-deskjet_960c.ppd.gz \
+ ppd/hpcups/hp-deskjet_970c.ppd.gz \
+ ppd/hpcups/hp-deskjet_975c.ppd.gz \
+ ppd/hpcups/hp-deskjet_9800.ppd.gz \
+ ppd/hpcups/hp-deskjet_980c.ppd.gz \
+ ppd/hpcups/hp-deskjet_990c.ppd.gz \
+ ppd/hpcups/hp-deskjet_995c.ppd.gz \
+ ppd/hpcups/hp-deskjet_d1300_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_d1400_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_d1500_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_d1600_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_d2300_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_d2400_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_d2500_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_d2600_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_d4100_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_d4200_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_d4300_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_d5500_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_d730.ppd.gz \
+ ppd/hpcups/hp-deskjet_f2100_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_f2200_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_f2400_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_f300_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_f4100_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_f4200_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_f4210_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_f4213_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_f4400_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_f4500_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_f735.ppd.gz \
+ ppd/hpcups/hp-deskjet_ink_adv_2010_k010.ppd.gz \
+ ppd/hpcups/hp-deskjet_ink_adv_2060_k110.ppd.gz \
+ ppd/hpcups/hp-deskjet_ink_advant_k109a-z.ppd.gz \
+ ppd/hpcups/hp-deskjet_ink_advant_k209a-z.ppd.gz \
+ ppd/hpcups/hp-dj350.ppd.gz ppd/hpcups/hp-dj450.ppd.gz \
+ ppd/hpcups/hp-envy_100_d410_series.ppd.gz \
+ ppd/hpcups/hp-envy_110_series.ppd.gz \
+ ppd/hpcups/hp-laserjet_1000.ppd.gz \
+ ppd/hpcups/hp-laserjet_1005_series.ppd.gz \
+ ppd/hpcups/hp-laserjet_1010.ppd.gz \
+ ppd/hpcups/hp-laserjet_1012.ppd.gz \
+ ppd/hpcups/hp-laserjet_1015.ppd.gz \
+ ppd/hpcups/hp-laserjet_1018.ppd.gz \
+ ppd/hpcups/hp-laserjet_1020.ppd.gz \
+ ppd/hpcups/hp-laserjet_1022n-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_1022nw-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_1022nw-zjs.ppd.gz \
+ ppd/hpcups/hp-laserjet_1022n-zjs.ppd.gz \
+ ppd/hpcups/hp-laserjet_1022-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_1022-zjs.ppd.gz \
+ ppd/hpcups/hp-laserjet_1100a.ppd.gz \
+ ppd/hpcups/hp-laserjet_1100.ppd.gz \
+ ppd/hpcups/hp-laserjet_1100xi.ppd.gz \
+ ppd/hpcups/hp-laserjet_1150.ppd.gz \
+ ppd/hpcups/hp-laserjet_1160.ppd.gz \
+ ppd/hpcups/hp-laserjet_1160_series.ppd.gz \
+ ppd/hpcups/hp-laserjet_1200n.ppd.gz \
+ ppd/hpcups/hp-laserjet_1200-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_1220-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_1220se.ppd.gz \
+ ppd/hpcups/hp-laserjet_1300n-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_1300-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_1300xi-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_1320n.ppd.gz \
+ ppd/hpcups/hp-laserjet_1320nw.ppd.gz \
+ ppd/hpcups/hp-laserjet_1320.ppd.gz \
+ ppd/hpcups/hp-laserjet_1320_series-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_1320tn.ppd.gz \
+ ppd/hpcups/hp-laserjet_2100.ppd.gz \
+ ppd/hpcups/hp-laserjet_2100_series-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_2200-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_2200_series.ppd.gz \
+ ppd/hpcups/hp-laserjet_2300-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_2300_series.ppd.gz \
+ ppd/hpcups/hp-laserjet_2410-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_2420-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_2430-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_3015-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_3020-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_3030-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_3050-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_3052-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_3055.ppd.gz \
+ ppd/hpcups/hp-laserjet_3100.ppd.gz \
+ ppd/hpcups/hp-laserjet_3150.ppd.gz \
+ ppd/hpcups/hp-laserjet_3200m-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_3200.ppd.gz \
+ ppd/hpcups/hp-laserjet_3200se.ppd.gz \
+ ppd/hpcups/hp-laserjet_3300_3310_3320-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_3330.ppd.gz \
+ ppd/hpcups/hp-laserjet_3380-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_3390-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_3392.ppd.gz \
+ ppd/hpcups/hp-laserjet_4000_series-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_4050_series-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_4100_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_4100_series-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_4150_series.ppd.gz \
+ ppd/hpcups/hp-laserjet_4200-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_4240-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_4250-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_4300-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_4345_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_4350-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_4l.ppd.gz \
+ ppd/hpcups/hp-laserjet_4ml.ppd.gz \
+ ppd/hpcups/hp-laserjet_4mp-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_4_plus-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_4si-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_4v-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_5000.ppd.gz \
+ ppd/hpcups/hp-laserjet_5000_series-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_5100_series-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_5200l-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_5200lx.ppd.gz \
+ ppd/hpcups/hp-laserjet_5200-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_5l.ppd.gz \
+ ppd/hpcups/hp-laserjet_5mp-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_5p.ppd.gz \
+ ppd/hpcups/hp-laserjet_5si_mopier-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_5si-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_6l.ppd.gz \
+ ppd/hpcups/hp-laserjet_6mp-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_6p.ppd.gz \
+ ppd/hpcups/hp-laserjet_8000.ppd.gz \
+ ppd/hpcups/hp-laserjet_8000_series-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_8100_mfp.ppd.gz \
+ ppd/hpcups/hp-laserjet_8100_series-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_8150_mfp.ppd.gz \
+ ppd/hpcups/hp-laserjet_8150_series-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_9000_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_9000_series-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_9040_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_9040-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_9050_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_9050-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_9055mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_9065mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_cm1411fn-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_cm1412fn-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_cm1413fn-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_cm1415fn-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_cm1415fnw-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_cm1416fnw-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_cm1417fnw-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_cm1418fnw-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_cp_1025nw.ppd.gz \
+ ppd/hpcups/hp-laserjet_cp1025nw.ppd.gz \
+ ppd/hpcups/hp-laserjet_cp_1025.ppd.gz \
+ ppd/hpcups/hp-laserjet_cp1025.ppd.gz \
+ ppd/hpcups/hp-laserjet_m1005.ppd.gz \
+ ppd/hpcups/hp-laserjet_m1120_mfp.ppd.gz \
+ ppd/hpcups/hp-laserjet_m1120n_mfp.ppd.gz \
+ ppd/hpcups/hp-laserjet_m1319f_mfp.ppd.gz \
+ ppd/hpcups/hp-laserjet_m1522nf_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_m1536dnf_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_m1537dnf_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_m1538dnf_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_m1539dnf_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_m2727_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_m3027_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_m3035_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_m4345_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_m4349_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_m5025_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_m5035_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_m5039_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_m9040_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_m9050_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_m9059_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_p1005.ppd.gz \
+ ppd/hpcups/hp-laserjet_p1006.ppd.gz \
+ ppd/hpcups/hp-laserjet_p1007.ppd.gz \
+ ppd/hpcups/hp-laserjet_p1008.ppd.gz \
+ ppd/hpcups/hp-laserjet_p1009.ppd.gz \
+ ppd/hpcups/hp-laserjet_p1505n-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_p1505n-zxs.ppd.gz \
+ ppd/hpcups/hp-laserjet_p1505.ppd.gz \
+ ppd/hpcups/hp-laserjet_p2014n-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_p2014n-zxs.ppd.gz \
+ ppd/hpcups/hp-laserjet_p2014-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_p2014-zxs.ppd.gz \
+ ppd/hpcups/hp-laserjet_p2015dn_series.ppd.gz \
+ ppd/hpcups/hp-laserjet_p2015d_series.ppd.gz \
+ ppd/hpcups/hp-laserjet_p2015n_series.ppd.gz \
+ ppd/hpcups/hp-laserjet_p2015_series-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_p2015x_series.ppd.gz \
+ ppd/hpcups/hp-laserjet_p2035n-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_p2035n-zjs.ppd.gz \
+ ppd/hpcups/hp-laserjet_p2035-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_p2035-zjs.ppd.gz \
+ ppd/hpcups/hp-laserjet_p2055dn-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_p2055d-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_p2055-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_p2055x-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_p3004-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_p3005-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_p3010_series-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_p4014dn.ppd.gz \
+ ppd/hpcups/hp-laserjet_p4014n.ppd.gz \
+ ppd/hpcups/hp-laserjet_p4014.ppd.gz \
+ ppd/hpcups/hp-laserjet_p4015dn.ppd.gz \
+ ppd/hpcups/hp-laserjet_p4015n.ppd.gz \
+ ppd/hpcups/hp-laserjet_p4015.ppd.gz \
+ ppd/hpcups/hp-laserjet_p4015tn.ppd.gz \
+ ppd/hpcups/hp-laserjet_p4015x.ppd.gz \
+ ppd/hpcups/hp-laserjet_p4515n.ppd.gz \
+ ppd/hpcups/hp-laserjet_p4515.ppd.gz \
+ ppd/hpcups/hp-laserjet_p4515tn.ppd.gz \
+ ppd/hpcups/hp-laserjet_p4515xm.ppd.gz \
+ ppd/hpcups/hp-laserjet_p4515x.ppd.gz \
+ ppd/hpcups/hp-laserjet_professional_m1132_mfp.ppd.gz \
+ ppd/hpcups/hp-laserjet_professional_m1136_mfp.ppd.gz \
+ ppd/hpcups/hp-laserjet_professional_m1212nf_mfp.ppd.gz \
+ ppd/hpcups/hp-laserjet_professional_m1213nf_mfp.ppd.gz \
+ ppd/hpcups/hp-laserjet_professional_m1214nfh_mfp.ppd.gz \
+ ppd/hpcups/hp-laserjet_professional_m1216nfh_mfp.ppd.gz \
+ ppd/hpcups/hp-laserjet_professional_m1217nfw_mfp.ppd.gz \
+ ppd/hpcups/hp-laserjet_professional_m1219nf_mfp.ppd.gz \
+ ppd/hpcups/hp-laserjet_professional_p1102.ppd.gz \
+ ppd/hpcups/hp-laserjet_professional_p_1102w.ppd.gz \
+ ppd/hpcups/hp-laserjet_professional_p1102w.ppd.gz \
+ ppd/hpcups/hp-laserjet_professional_p1106.ppd.gz \
+ ppd/hpcups/hp-laserjet_professional_p1108.ppd.gz \
+ ppd/hpcups/hp-laserjet_professional_p1566.ppd.gz \
+ ppd/hpcups/hp-laserjet_professional_p1606dn.ppd.gz \
+ ppd/hpcups/hp-mopier_240-pcl3.ppd.gz \
+ ppd/hpcups/hp-mopier_320-pcl3.ppd.gz \
+ ppd/hpcups/hp-officejet_100_mobile_l411.ppd.gz \
+ ppd/hpcups/hp-officejet_4000_k210.ppd.gz \
+ ppd/hpcups/hp-officejet_4100_series.ppd.gz \
+ ppd/hpcups/hp-officejet_4105.ppd.gz \
+ ppd/hpcups/hp-officejet_4115_series.ppd.gz \
+ ppd/hpcups/hp-officejet_4200_series.ppd.gz \
+ ppd/hpcups/hp-officejet_4255.ppd.gz \
+ ppd/hpcups/hp-officejet_4300_series.ppd.gz \
+ ppd/hpcups/hp-officejet_4400_k410.ppd.gz \
+ ppd/hpcups/hp-officejet_4500_g510a-f.ppd.gz \
+ ppd/hpcups/hp-officejet_4500_g510g-m.ppd.gz \
+ ppd/hpcups/hp-officejet_4500_g510n-z.ppd.gz \
+ ppd/hpcups/hp-officejet_4500_k710.ppd.gz \
+ ppd/hpcups/hp-officejet_5100_series.ppd.gz \
+ ppd/hpcups/hp-officejet_5105.ppd.gz \
+ ppd/hpcups/hp-officejet_5110.ppd.gz \
+ ppd/hpcups/hp-officejet_5110v.ppd.gz \
+ ppd/hpcups/hp-officejet_5500_series.ppd.gz \
+ ppd/hpcups/hp-officejet_5600_series.ppd.gz \
+ ppd/hpcups/hp-officejet_6000_e609a.ppd.gz \
+ ppd/hpcups/hp-officejet_6000_e609n.ppd.gz \
+ ppd/hpcups/hp-officejet_6100.ppd.gz \
+ ppd/hpcups/hp-officejet_6100_series.ppd.gz \
+ ppd/hpcups/hp-officejet_6150_series.ppd.gz \
+ ppd/hpcups/hp-officejet_6200_series.ppd.gz \
+ ppd/hpcups/hp-officejet_6300_series.ppd.gz \
+ ppd/hpcups/hp-officejet_6500_e709a.ppd.gz \
+ ppd/hpcups/hp-officejet_6500_e709n.ppd.gz \
+ ppd/hpcups/hp-officejet_6500_e710a-f.ppd.gz \
+ ppd/hpcups/hp-officejet_6500_e710n-z.ppd.gz \
+ ppd/hpcups/hp-officejet_6600.ppd.gz \
+ ppd/hpcups/hp-officejet_6700.ppd.gz \
+ ppd/hpcups/hp-officejet_7000_e809a.ppd.gz \
+ ppd/hpcups/hp-officejet_7000_e809a_series.ppd.gz \
+ ppd/hpcups/hp-officejet_7100_series.ppd.gz \
+ ppd/hpcups/hp-officejet_7200_series.ppd.gz \
+ ppd/hpcups/hp-officejet_7300_series.ppd.gz \
+ ppd/hpcups/hp-officejet_7400_series.ppd.gz \
+ ppd/hpcups/hp-officejet_7500_e910.ppd.gz \
+ ppd/hpcups/hp-officejet_9100_series-pcl3.ppd.gz \
+ ppd/hpcups/hp-officejet_d_series.ppd.gz \
+ ppd/hpcups/hp-officejet_g55.ppd.gz \
+ ppd/hpcups/hp-officejet_g55xi.ppd.gz \
+ ppd/hpcups/hp-officejet_g85.ppd.gz \
+ ppd/hpcups/hp-officejet_g85xi.ppd.gz \
+ ppd/hpcups/hp-officejet_g95.ppd.gz \
+ ppd/hpcups/hp-officejet_h470.ppd.gz \
+ ppd/hpcups/hp-officejet_j3500_series.ppd.gz \
+ ppd/hpcups/hp-officejet_j3600_series.ppd.gz \
+ ppd/hpcups/hp-officejet_j4500_series.ppd.gz \
+ ppd/hpcups/hp-officejet_j4660_series.ppd.gz \
+ ppd/hpcups/hp-officejet_j4680_series.ppd.gz \
+ ppd/hpcups/hp-officejet_j5500_series.ppd.gz \
+ ppd/hpcups/hp-officejet_j5700_series.ppd.gz \
+ ppd/hpcups/hp-officejet_j6400_series.ppd.gz \
+ ppd/hpcups/hp-officejet_k60.ppd.gz \
+ ppd/hpcups/hp-officejet_k60xi.ppd.gz \
+ ppd/hpcups/hp-officejet_k7100.ppd.gz \
+ ppd/hpcups/hp-officejet_k80.ppd.gz \
+ ppd/hpcups/hp-officejet_k80xi.ppd.gz \
+ ppd/hpcups/hp-officejet_lx.ppd.gz \
+ ppd/hpcups/hp-officejet.ppd.gz \
+ ppd/hpcups/hp-officejet_pro_1150c.ppd.gz \
+ ppd/hpcups/hp-officejet_pro_1170c_series.ppd.gz \
+ ppd/hpcups/hp-officejet_pro_8000_a809.ppd.gz \
+ ppd/hpcups/hp-officejet_pro_8100.ppd.gz \
+ ppd/hpcups/hp-officejet_pro_8500_a909a.ppd.gz \
+ ppd/hpcups/hp-officejet_pro_8500_a909g.ppd.gz \
+ ppd/hpcups/hp-officejet_pro_8500_a909n.ppd.gz \
+ ppd/hpcups/hp-officejet_pro_8500_a910.ppd.gz \
+ ppd/hpcups/hp-officejet_pro_8600.ppd.gz \
+ ppd/hpcups/hp-officejet_pro_k5300.ppd.gz \
+ ppd/hpcups/hp-officejet_pro_k5400.ppd.gz \
+ ppd/hpcups/hp-officejet_pro_k550.ppd.gz \
+ ppd/hpcups/hp-officejet_pro_k850.ppd.gz \
+ ppd/hpcups/hp-officejet_pro_k8600.ppd.gz \
+ ppd/hpcups/hp-officejet_pro_l7300.ppd.gz \
+ ppd/hpcups/hp-officejet_pro_l7400.ppd.gz \
+ ppd/hpcups/hp-officejet_pro_l7500.ppd.gz \
+ ppd/hpcups/hp-officejet_pro_l7600.ppd.gz \
+ ppd/hpcups/hp-officejet_pro_l7700.ppd.gz \
+ ppd/hpcups/hp-officejet_r40.ppd.gz \
+ ppd/hpcups/hp-officejet_r40xi.ppd.gz \
+ ppd/hpcups/hp-officejet_r45.ppd.gz \
+ ppd/hpcups/hp-officejet_r60.ppd.gz \
+ ppd/hpcups/hp-officejet_r65.ppd.gz \
+ ppd/hpcups/hp-officejet_r80.ppd.gz \
+ ppd/hpcups/hp-officejet_r80xi.ppd.gz \
+ ppd/hpcups/hp-officejet_series_300.ppd.gz \
+ ppd/hpcups/hp-officejet_series_310.ppd.gz \
+ ppd/hpcups/hp-officejet_series_320.ppd.gz \
+ ppd/hpcups/hp-officejet_series_330.ppd.gz \
+ ppd/hpcups/hp-officejet_series_350.ppd.gz \
+ ppd/hpcups/hp-officejet_series_520.ppd.gz \
+ ppd/hpcups/hp-officejet_series_570.ppd.gz \
+ ppd/hpcups/hp-officejet_series_580.ppd.gz \
+ ppd/hpcups/hp-officejet_series_590.ppd.gz \
+ ppd/hpcups/hp-officejet_series_600.ppd.gz \
+ ppd/hpcups/hp-officejet_series_610.ppd.gz \
+ ppd/hpcups/hp-officejet_series_630.ppd.gz \
+ ppd/hpcups/hp-officejet_series_700.ppd.gz \
+ ppd/hpcups/hp-officejet_series_710.ppd.gz \
+ ppd/hpcups/hp-officejet_series_720.ppd.gz \
+ ppd/hpcups/hp-officejet_series_725.ppd.gz \
+ ppd/hpcups/hp-officejet_t_series.ppd.gz \
+ ppd/hpcups/hp-officejet_v30.ppd.gz \
+ ppd/hpcups/hp-officejet_v40.ppd.gz \
+ ppd/hpcups/hp-officejet_v40xi.ppd.gz \
+ ppd/hpcups/hp-officejet_v45.ppd.gz \
+ ppd/hpcups/hp-photosmart_100.ppd.gz \
+ ppd/hpcups/hp-photosmart_1115.ppd.gz \
+ ppd/hpcups/hp-photosmart_1215.ppd.gz \
+ ppd/hpcups/hp-photosmart_1218.ppd.gz \
+ ppd/hpcups/hp-photosmart_130.ppd.gz \
+ ppd/hpcups/hp-photosmart_1315.ppd.gz \
+ ppd/hpcups/hp-photosmart_140_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_230.ppd.gz \
+ ppd/hpcups/hp-photosmart_240_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_2570_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_2600_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_2700_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_3100_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_3200_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_320_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_3300_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_330_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_370_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_380_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_420_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_470_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_5510d_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_5510_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_6510_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_7150.ppd.gz \
+ ppd/hpcups/hp-photosmart_7200_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_7345.ppd.gz \
+ ppd/hpcups/hp-photosmart_7350.ppd.gz \
+ ppd/hpcups/hp-photosmart_7400_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_7510_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_7550.ppd.gz \
+ ppd/hpcups/hp-photosmart_7600_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_7700_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_7800_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_7900_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_8000_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_8100_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_8200_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_8400_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_8700_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_a310_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_a320_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_a430_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_a440_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_a510_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_a520_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_a530_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_a610_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_a620_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_a630_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_a640_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_a710_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_a820_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_b010_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_b109a-m.ppd.gz \
+ ppd/hpcups/hp-photosmart_b109a_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_b110_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_b8500_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_c309a_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_c3100_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_c4100_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_c4200_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_c4340_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_c4380_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_c4400_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_c4500_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_c4600_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_c4700_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_c5100_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_c5200_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_c5300_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_c5500_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_c6100_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_c6200_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_c6300_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_c7100_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_c7200_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_c8100_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_d110_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_d5060_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_d5100_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_d5300_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_d5400_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_d6100_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_d7100_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_d7200_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_d7300_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_d7400_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_d7500_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_estn_c510_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_ink_adv_k510.ppd.gz \
+ ppd/hpcups/hp-photosmart_p1000.ppd.gz \
+ ppd/hpcups/hp-photosmart_p1100.ppd.gz \
+ ppd/hpcups/hp-photosmart_plus_b209a-m.ppd.gz \
+ ppd/hpcups/hp-photosmart_plus_b210_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_prem_c310_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_prem_c410_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_premium_c309g-m.ppd.gz \
+ ppd/hpcups/hp-photosmart_prem-web_c309n-s.ppd.gz \
+ ppd/hpcups/hp-photosmart_pro_b8300_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_pro_b8800_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_wireless_b109n-z.ppd.gz \
+ ppd/hpcups/hp-printer_scanner_copier_300.ppd.gz \
+ ppd/hpcups/hp-psc_1000_series.ppd.gz \
+ ppd/hpcups/hp-psc_1100_series.ppd.gz \
+ ppd/hpcups/hp-psc_1200_series.ppd.gz \
+ ppd/hpcups/hp-psc_1300_series.ppd.gz \
+ ppd/hpcups/hp-psc_1310_series.ppd.gz \
+ ppd/hpcups/hp-psc_1358_series.ppd.gz \
+ ppd/hpcups/hp-psc_1400_series.ppd.gz \
+ ppd/hpcups/hp-psc_1500_series.ppd.gz \
+ ppd/hpcups/hp-psc_1510_series.ppd.gz \
+ ppd/hpcups/hp-psc_1600_series.ppd.gz \
+ ppd/hpcups/hp-psc_2100_series.ppd.gz \
+ ppd/hpcups/hp-psc_2150_series.ppd.gz \
+ ppd/hpcups/hp-psc_2170_series.ppd.gz \
+ ppd/hpcups/hp-psc_2200_series.ppd.gz \
+ ppd/hpcups/hp-psc_2210_series.ppd.gz \
+ ppd/hpcups/hp-psc_2300_series.ppd.gz \
+ ppd/hpcups/hp-psc_2350_series.ppd.gz \
+ ppd/hpcups/hp-psc_2400_series.ppd.gz \
+ ppd/hpcups/hp-psc_2500_series.ppd.gz \
+ ppd/hpcups/hp-psc_500.ppd.gz ppd/hpcups/hp-psc_720.ppd.gz \
+ ppd/hpcups/hp-psc_750.ppd.gz ppd/hpcups/hp-psc_750xi.ppd.gz \
+ ppd/hpcups/hp-psc_760.ppd.gz ppd/hpcups/hp-psc_780.ppd.gz \
+ ppd/hpcups/hp-psc_780xi.ppd.gz \
+ ppd/hpcups/hp-psc_900_series.ppd.gz \
+ ppd/hpcups/hp-psc_920.ppd.gz ppd/hpcups/hp-psc_950.ppd.gz \
+ ppd/hpcups/hp-psc_950vr.ppd.gz ppd/hpcups/hp-psc_950xi.ppd.gz
+am__dist_prnt_DATA_DIST = prnt/__init__.py prnt/ldl.py \
+ prnt/pcl.py prnt/colorcal.py
+am__dist_rules_DATA_DIST = data/rules/56-hpmud_support.rules \
+ data/rules/86-hpmud_plugin.rules \
+ data/rules/56-hpmud_add_printer.rules \
+ data/rules/40-hplip.rules data/rules/55-hpmud.rules
+am__dist_scan_DATA_DIST = scan/__init__.py scan/sane.py
+am__dist_ui_DATA_DIST = ui/alignform.py ui/colorcalform_base.py \
+ ui/colorcalform.py ui/coloradjform_base.py ui/coloradjform.py \
+ ui/devmgr4_base.py ui/devmgr4.py ui/__init__.py \
+ ui/loadpaperform_base.py ui/loadpaperform.py \
+ ui/paperedgealignform_base.py ui/paperedgealignform.py \
+ ui/ui_utils.py ui/settingsdialog_base.py ui/settingsdialog.py \
+ ui/aligntype6form1.py ui/aligntype6form1_base.py \
+ ui/aligntype6form2_base.py ui/aligntype6form2.py \
+ ui/nodevicesform_base.py ui/nodevicesform.py ui/unloadform.py \
+ ui/imagepropertiesdlg_base.py ui/imagepropertiesdlg.py \
+ ui/choosedevicedlg.py ui/chooseprinterdlg.py ui/aboutdlg.py \
+ ui/aboutdlg_base.py ui/waitform.py ui/waitform_base.py \
+ ui/cleaningform_base.py ui/cleaningform.py \
+ ui/cleaningform2_base.py ui/cleaningform2.py \
+ ui/colorcalform2_base.py ui/colorcalform2.py \
+ ui/colorcal4form.py ui/colorcal4form_base.py \
+ ui/colorcal4form_base.ui ui/printerform.py \
+ ui/faxaddrbookgroupsform_base.py \
+ ui/faxaddrbookgroupeditform_base.py ui/faxaddrbookform_base.py \
+ ui/faxaddrbookform.py ui/faxaddrbookeditform_base.py \
+ ui/align10form.py ui/align10form_base.py ui/faxsendjobform.py \
+ ui/faxsettingsform_base.py ui/faxsettingsform.py \
+ ui/coverpageform_base.py ui/coverpageform.py \
+ ui/allowabletypesdlg_base.py ui/allowabletypesdlg.py \
+ ui/makecopiesform.py ui/setupform_base.py ui/setupform.py \
+ ui/setupmanualfind_base.py ui/setupmanualfind.py \
+ ui/setupsettings_base.py ui/setupsettings.py ui/scrollview.py \
+ ui/scrollprintsettings.py ui/scrollprint.py ui/scrollfax.py \
+ ui/scrollunload.py ui/scrollcopy.py ui/pluginform2.py \
+ ui/pluginform2_base.py ui/systemtray.py ui/jobstoragemixin.py \
+ ui/pluginlicenseform_base.py ui/pluginlicenseform.py \
+ ui/align13form_base.py ui/align13form.py \
+ ui/firmwaredialog_base.py ui/firmwaredialog.py \
+ ui/deviceuricombobox.py ui/upgradeform.py \
+ ui/upgradeform_base.py
+am__dist_ui4_DATA_DIST = ui4/*.py
+am__dist_www0_DATA_DIST = $(wwwsrc)/index.html \
+ $(wwwsrc)/commandline.html $(wwwsrc)/copying.html \
+ $(wwwsrc)/devicemanager.html $(wwwsrc)/faxtrouble.html \
+ $(wwwsrc)/gettinghelp.html $(wwwsrc)/hpscan.html \
+ $(wwwsrc)/mainttask.html $(wwwsrc)/plugins.html \
+ $(wwwsrc)/print.html $(wwwsrc)/printing.html \
+ $(wwwsrc)/printoptions.html \
+ $(wwwsrc)/printtroubleshooting.html $(wwwsrc)/scanning.html \
+ $(wwwsrc)/scantrouble.html $(wwwsrc)/sendfax.html \
+ $(wwwsrc)/setup.html $(wwwsrc)/systray.html \
+ $(wwwsrc)/troubleshooting.html $(wwwsrc)/uninstalling.html \
+ $(wwwsrc)/upgrading.html
+am__dist_www3_DATA_DIST = $(wwwsrc)/styles/*
+am__dist_www4_DATA_DIST = $(wwwsrc)/images/*
+DATA = $(cupsdrv_DATA) $(cupsdrv2_DATA) $(dist_base_DATA) \
+ $(dist_copier_DATA) $(dist_fax_DATA) $(dist_fax_filters_DATA) \
+ $(dist_halpre_DATA) $(dist_hpcupsfaxppd_DATA) \
+ $(dist_hpijsfaxppd_DATA) $(dist_hplip_Log_DATA) \
+ $(dist_hplip_state_DATA) $(dist_images_128x128_DATA) \
+ $(dist_images_16x16_DATA) $(dist_images_24x24_DATA) \
+ $(dist_images_256x256_DATA) $(dist_images_32x32_DATA) \
+ $(dist_images_64x64_DATA) $(dist_images_devices_DATA) \
+ $(dist_images_other_DATA) $(dist_install_DATA) \
+ $(dist_ldl_DATA) $(dist_localz_DATA) $(dist_models_DATA) \
+ $(dist_noinst_DATA) $(dist_pcard_DATA) $(dist_pcl_DATA) \
+ $(dist_plugins_DATA) $(dist_policykit_dbus_etc_DATA) \
+ $(dist_policykit_dbus_share_DATA) \
+ $(dist_policykit_policy_DATA) $(dist_postscript_DATA) \
+ $(dist_ppd_DATA) $(dist_prnt_DATA) $(dist_rules_DATA) \
+ $(dist_scan_DATA) $(dist_ui_DATA) $(dist_ui4_DATA) \
+ $(dist_unrel_DATA) $(dist_www0_DATA) $(dist_www3_DATA) \
+ $(dist_www4_DATA) $(doc_DATA) $(hplip_conf_DATA) \
+ $(hplip_desktop_DATA) $(hplip_systray_DATA)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+distdir = $(PACKAGE)-$(VERSION)
+top_distdir = $(distdir)
+am__remove_distdir = \
+ { test ! -d "$(distdir)" \
+ || { find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \
+ && rm -fr "$(distdir)"; }; }
+DIST_ARCHIVES = $(distdir).tar.gz
+GZIP_ENV = --best
+distuninstallcheck_listfiles = find . -type f -print
+distcleancheck_listfiles = find . -type f -print
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+APDK_AUTO_INCLUDE_FLAG = @APDK_AUTO_INCLUDE_FLAG@
+APDK_ENDIAN_FLAG = @APDK_ENDIAN_FLAG@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DBUS_CFLAGS = @DBUS_CFLAGS@
+DBUS_LIBS = @DBUS_LIBS@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DSYMUTIL = @DSYMUTIL@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+NMEDIT = @NMEDIT@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PYTHON = @PYTHON@
+PYTHONINCLUDEDIR = @PYTHONINCLUDEDIR@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SNMPLIB = @SNMPLIB@
+STRIP = @STRIP@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_datadir = @abs_datadir@
+abs_docdir = @abs_docdir@
+abs_drvdir = @abs_drvdir@
+abs_hpppddir = @abs_hpppddir@
+abs_mimedir = @abs_mimedir@
+abs_ppddir = @abs_ppddir@
+abs_sbindir = @abs_sbindir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_F77 = @ac_ct_F77@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+cups11_build = @cups11_build@
+cups_drv_install = @cups_drv_install@
+cups_ppd_install = @cups_ppd_install@
+cupsbackenddir = @cupsbackenddir@
+cupsfilterdir = @cupsfilterdir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+dbus_build = @dbus_build@
+doc_build = @doc_build@
+docdir = $(hpdocdir)
+drvdir = @drvdir@
+dvidir = @dvidir@
+epm_cups_drv_install = @epm_cups_drv_install@
+epm_cups_ppd_install = @epm_cups_ppd_install@
+epm_foomatic_drv_install = @epm_foomatic_drv_install@
+epm_foomatic_ppd_install = @epm_foomatic_ppd_install@
+epm_foomatic_rip_hplip_install = @epm_foomatic_rip_hplip_install@
+epm_full = @epm_full@
+epm_hpcups_install = @epm_hpcups_install@
+epm_hpcups_only = @epm_hpcups_only@
+epm_hpijs_install = @epm_hpijs_install@
+epm_hpijs_only = @epm_hpijs_only@
+epm_lite = @epm_lite@
+epm_print_only_exclude = @epm_print_only_exclude@
+epm_qt3 = @epm_qt3@
+epm_qt4 = @epm_qt4@
+epm_scan = @epm_scan@
+exec_prefix = @exec_prefix@
+fax_build = @fax_build@
+foomatic_drv_install = @foomatic_drv_install@
+foomatic_filter = @foomatic_filter@
+foomatic_ppd_install = @foomatic_ppd_install@
+foomatic_rip_hplip_install = @foomatic_rip_hplip_install@
+gui_build = @gui_build@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+hpcups_install = @hpcups_install@
+hpcups_only_build = @hpcups_only_build@
+hpdocdir = @hpdocdir@
+hpijs_install = @hpijs_install@
+hpijs_only_build = @hpijs_only_build@
+hpppddir = @hpppddir@
+htmldir = @htmldir@
+icondir = @icondir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+lite_build = @lite_build@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mimedir = @mimedir@
+mkdir_p = @mkdir_p@
+network_build = @network_build@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+pkgpyexecdir = @pkgpyexecdir@
+pkgpythondir = @pkgpythondir@
+platform = @platform@
+policykit = @policykit@
+policykit_dir = @policykit_dir@
+pp_build = @pp_build@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+pyexecdir = @pyexecdir@
+pythondir = @pythondir@
+qt3 = @qt3@
+qt4 = @qt4@
+sbindir = @sbindir@
+scan_build = @scan_build@
+shadow_build = @shadow_build@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+systraydir = @systraydir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+udev_acl_rules = @udev_acl_rules@
+ui_toolkit = @ui_toolkit@
+INCLUDES = -Iip -Iio/hpmud -Iscan/sane -Iprnt/hpijs
+hplipdir = $(datadir)/hplip
+doc_DATA = COPYING copyright prnt/hpijs/README_LIBJPG
+EXTRA_DIST = prnt/hpijs/gdevijs-krgb-1.5-gs8.61.patch prnt/hpijs/README_LIBJPG copyright
+dist_noinst_SCRIPTS = $(am__append_5)
+dist_noinst_DATA = $(am__append_4) $(am__append_7) $(am__append_8)
+lib_LTLIBRARIES = $(am__append_1)
+foomatic_ppd_printers = \
+ ppd/hpijs/hp-deskjet_690-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cp4520_series-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_825c-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_7000_e809a_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_7345-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_a520_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_f2200_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_1320nw-hpijs.ppd.gz \
+ ppd/hpijs/hp-business_inkjet_2280-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cp2025-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_2500_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_a320_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_2500-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-photosmart_7510_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_8550-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_2100_series-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_630c-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_pro_k550-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_f735-hpijs.ppd.gz \
+ ppd/hpijs/hp-psc_920-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_series_600-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_5105-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_240_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_5400_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_4si-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-photosmart_plus_b210_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_9000_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-photosmart_a310_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_3700-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_5652-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_3700n-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_3320-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cp2025n-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-officejet_j5700_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_j3600_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_m3027_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_p1009-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_1160_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p1007-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_4550-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-officejet_7000_e809a-hpijs.ppd.gz \
+ ppd/hpijs/hp-psc_1500_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_500-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_f4100_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_a630_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_pro_8500_a910-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_b010_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_690c-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_professional_p1606dn-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_5600_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_4105-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_8100_series-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_4730mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-photosmart_3100_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_m1120n_mfp-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_pro_k5300-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_b109a_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_520-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_5200-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_5551-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_4v-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_935c-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_professional_p1102w-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_3650-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_cp_1025nw-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_3500-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_r60-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_inkjet_cp1700-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p4015tn-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_series_320-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cp4020_series-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_5100_series-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_ink_advant_k109a-z-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_1200-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_895c-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_professional_p1106-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_v30-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_4100_series-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-officejet_series_350-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_9300-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_c6300_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cm6030_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_3819-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_948c-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_697-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_d_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_d730-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_330_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_7400_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p2015x_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_3000_j310_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_d2300_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-business_inkjet_2230-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_2300_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_5p-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_8000_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p4515tn-hpijs.ppd.gz \
+ ppd/hpijs/hp-business_inkjet_2800-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-photosmart_2700_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p4515-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_4200_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_j3500_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_series_725-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_pro_b8800_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-psc_950vr-hpijs.ppd.gz \
+ ppd/hpijs/hp-psc_2150_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_m4345_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_505j-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_c4200_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_3380-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-officejet_pro_l7700-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_4200-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-officejet_series_310-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cm2320nf_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_f4500_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_8150_mfp-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_7550-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_2200-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-officejet_5110v-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_640c-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_3740-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_c5100_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_f2400_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_812c-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_9050-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-photosmart_5510_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p4014dn-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_d7200_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_r45-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_professional_m1217nfw_mfp-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_1600cm-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p2035-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_p2055dn-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_4650-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cp3525-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_cm1418fnw-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_cm1412fn-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_p4015n-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_g55xi-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_9000_series-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-psc_1600_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_5552-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_pro_8500_a909n-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cm1312nfi_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-officejet_g85xi-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_c4100_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-915-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_3200se-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_9040_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_9040-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_9800-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_3810-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_1200c-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_3500-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_c6200_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_professional_p1566-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p4014n-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_3870-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p2035n-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-officejet_pro_8600-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_pro_1150c-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_7150-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_4500-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-officejet_j4500_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_7500_e910-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p4015x-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_882c-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_933c-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_950c-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_f4210_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-dj450-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_a430_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_3055-hpijs.ppd.gz \
+ ppd/hpijs/hp-business_inkjet_2600-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_p1505n-hpijs-zxs.ppd.gz \
+ ppd/hpijs/hp-photosmart_c7200_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_1022n-hpijs-zjs.ppd.gz \
+ ppd/hpijs/hp-photosmart_470_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_1300-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_841c-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_3050_j610_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_6100-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_c3100_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_843c-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_c5200_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_m1120_mfp-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_1150-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_m5025_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_5si_mopier-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_510-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_series_520-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_5-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_3420-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_890c-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_3550-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cp1515n-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-officejet_4500_g510g-m-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p2015dn_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_2000_j210_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_1600-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_f4200_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_842c-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_3550-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_830c-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_1120-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_k60-hpijs.ppd.gz \
+ ppd/hpijs/hp-psc_1400_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_4050_series-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_6l-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_610cl-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_a610_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_3330-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_845c-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_m1005-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_6800-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_380_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_pro_l7400-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p1005-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_7800_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_4ml-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_series_300-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_cm1415fnw-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_5550-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_professional_p_1102w-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_4600-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_3300_3310_3320-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_4_plus-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_d1300_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-psc_2300_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_a710_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_1220-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_p2014-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_m9059_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_5200l-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_957c-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_6940_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_940c-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_5500_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_r80xi-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_1000_j110_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_cp_1025-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_995c-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_d4300_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_d110_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_ink_adv_2060_k110-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_692-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_pro_k8600-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_1215-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_6120-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_7600_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_c4500_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-psc_2350_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_3425-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p4014-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p2055-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_4240-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-printer_scanner_copier_300-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_d4100_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_400l-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_682-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_5100-hpijs.ppd.gz \
+ ppd/hpijs/hp-psc_780xi-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_series_330-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_m5039_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-envy_100_d410_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_815c-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cm4540_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_1300n-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-business_inkjet_2250-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-photosmart_ink_adv_k510-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_612c-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_m5035_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_1300xi-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_1200n-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_g85-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_p1100-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_1005_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_3392-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_1010-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_m4349_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_3822-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_r40-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_3800-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-photosmart_c4340_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_1320_series-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_990c-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_5000-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_5600-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_professional_m1214nfh_mfp-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cp5225n-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-photosmart_5510d_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_8100_mfp-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_4mp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_540-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_d7400_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_series_710-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_3030-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-officejet_r65-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_cp1025nw-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_5700-hpijs.ppd.gz \
+ ppd/hpijs/hp-psc_500-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_b110_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-psc_720-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_550c-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_1315-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cp2025dn-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-photosmart_7700_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_cm1411fn-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cp6015-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_670tv-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_930c-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_6500_e709a-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_2600n-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_6500_e710a-f-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p4015dn-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_3920-hpijs.ppd.gz \
+ ppd/hpijs/hp-business_inkjet_1100-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_6mp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_9500-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_1020-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_694-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_3910-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_1022-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-officejet-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_f2100_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_6700-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_3020-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_p2035-hpijs-zjs.ppd.gz \
+ ppd/hpijs/hp-officejet_4500_g510n-z-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_plus_b209a-m-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_g55-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_8700_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_5m-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_d2600_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_c8100_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_k80xi-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p1006-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_1000-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_series_580-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p1505-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_premium_c309g-m-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_p1000-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_7200_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_b8500_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_9050_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-officejet_series_570-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_460-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_7900_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_c5500_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-2000c-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_c4380_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_3200-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_cm1415fn-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_3000-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_d1500_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_8400_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_m9040_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_3015-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-psc_1310_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_7350-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_3940-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_prem_c310_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_6122-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_695-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_100_mobile_l411-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_816c-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_d1400_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_4610-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cm6040_mfp-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p4015-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_1022n-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-officejet_7300_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_2100-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_cm1416fnw-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-officejet_r80-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_4700-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-officejet_4100_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_m2727_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-photosmart_d7300_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_810c-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_4000_series-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_p2055d-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-photosmart_wireless_b109n-z-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_pro_l7600-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_ink_advant_k209a-z-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_5mp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_3100-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_9055mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cp1217-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_h470-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_975c-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p2014n-hpijs-zxs.ppd.gz \
+ ppd/hpijs/hp-officejet_5100_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_6980_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_professional_p1102-hpijs.ppd.gz \
+ ppd/hpijs/hp-business_inkjet_2200-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p4515x-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_pro_k5400-hpijs.ppd.gz \
+ ppd/hpijs/hp-psc_950xi-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_j5500_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-psc_1300_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_632c-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_d5100_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_932c-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_230-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_140_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_cm1417fnw-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-psc_1358_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_k60xi-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_4l-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_6127-hpijs.ppd.gz \
+ ppd/hpijs/hp-psc_750-hpijs.ppd.gz \
+ ppd/hpijs/hp-psc_1100_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_600-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p3005-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-officejet_series_700-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_6500-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cm4730_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_9065mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_4100_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-officejet_6000_e609n-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_8150_series-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_3500n-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_8200_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_professional_m1213nf_mfp-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_8000-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cm3530_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-photosmart_a510_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_pro_8000_a809-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_6510_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_3840-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_f300_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p2015n_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_b109a-m-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_2200_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_pro_8100-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_5200lx-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_6500_e710n-z-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_7100_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_2600_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_professional_m1212nf_mfp-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_5800-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_1022-hpijs-zjs.ppd.gz \
+ ppd/hpijs/hp-officejet_4400_k410-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cp3505-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_p2015_series-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_670c-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_670-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_2050_j510_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_4000_k210-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_6500_e709n-hpijs.ppd.gz \
+ ppd/hpijs/hp-psc_2100_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_c6100_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_656c-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_934c-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_k80-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_1100xi-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_610c-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_4500_g510a-f-hpijs.ppd.gz \
+ ppd/hpijs/hp-psc_2170_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cp4005-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_3900-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cp5225-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-business_inkjet_2300-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_4250-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-officejet_k7100-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_2430-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_955c-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_850c-hpijs.ppd.gz \
+ ppd/hpijs/hp-psc_2200_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_1018-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_pro_1170c_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-2500c-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_pro_b8300_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_6p-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_series_590-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_3200_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-mopier_320-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-psc_780-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_2410-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-officejet_j4660_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_3600-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_5110-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_v40-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_c4700_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_1218-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_m1538dnf_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_3600-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_c4400_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_1320n-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_1022nw-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_professional_m1132_mfp-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_5900_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_400-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_832c-hpijs.ppd.gz \
+ ppd/hpijs/hp-psc_760-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_3450-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_d5060_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_8000_series-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-psc_2210_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p4515n-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_500c-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_ink_adv_2010_k010-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_j4680_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_9600-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_952c-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_100-hpijs.ppd.gz \
+ ppd/hpijs/hp-psc_1510_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_4300_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_1022nw-hpijs-zjs.ppd.gz \
+ ppd/hpijs/hp-officejet_6150_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_v45-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p1505n-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-officejet_pro_k850-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_6200_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_1220c-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_3052-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cm1312_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-photosmart_c4600_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-business_inkjet_3000-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_959c-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_pro_l7300-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_professional_m1216nfh_mfp-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_d7100_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_8500-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-photosmart_7200_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_estn_c510_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_d7500_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_6100_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_d6100_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_4350-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-910-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_6300_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_420_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_a820_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_3150-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_4150_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_professional_m1219nf_mfp-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p2014-hpijs-zxs.ppd.gz \
+ ppd/hpijs/hp-psc_1000_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_7400_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_5l-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_8100_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_970c-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_r40xi-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_680-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_cp1025-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_professional_m1136_mfp-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_series_610-hpijs.ppd.gz \
+ ppd/hpijs/hp-dj350-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_m1319f_mfp-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p2035n-hpijs-zjs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cm2320n_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-photosmart_d5400_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_3050a_j611_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cp2025x-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_d1600_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p2055x-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_3816-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_prem_c410_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_c309a_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_3050-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_5650-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_1050_j410_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_672c-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_370_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_320_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_1015-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_m1522nf_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-officejet_t_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_5500-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_1280-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_4115_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_3200m-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-photosmart_2570_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-psc_2400_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_m1539dnf_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_1220se-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cp5225dn-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_f4213_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cm6049_mfp-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_m1536dnf_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-officejet_6000_e609a-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_660-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_c7100_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_916c-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_1012-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_1100a-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_d4200_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_9100_series-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_professional_p1108-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p3004-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_cm1413fn-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-officejet_g95-hpijs.ppd.gz \
+ ppd/hpijs/hp-psc_1200_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_5000_series-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_1100-hpijs.ppd.gz \
+ ppd/hpijs/hp-business_inkjet_1200-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_3550n-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_4500_k710-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_c5300_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p2015d_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_130-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_9500_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cp1518ni-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_5550-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-mopier_240-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_p3010_series-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_693-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_series_630-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_648c-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_pro_8500_a909a-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cp1514n-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-psc_950-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_f4400_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_920c-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_prem-web_c309n-s-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_d2400_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_5si-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cp1215-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_series_720-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_v40xi-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_d2500_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_3070_b611_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_pro_8500_a909g-hpijs.ppd.gz \
+ ppd/hpijs/hp-cp1160-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_3820-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_6600-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cp5520_series-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-officejet_lx-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_2300-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-business_inkjet_1000-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_1160-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_a620_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_3300_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_980c-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_870c-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p1008-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_inkjet_printer_cp1700-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_855c-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_880c-hpijs.ppd.gz \
+ ppd/hpijs/hp-psc_2500_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_3390-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_p4515xm-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_6600-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_2420-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_1600cn-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_1115-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p2014n-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_1320-hpijs.ppd.gz \
+ ppd/hpijs/hp-psc_750xi-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_1320tn-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_1100-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_840c-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_5850-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_960c-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_4345_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_m1537dnf_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-officejet_4255-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_d5300_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_j6400_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_1600c-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_4600_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-psc_900_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cm2320_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_m3035_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_4300-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_d5500_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_1125-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_a640_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-envy_110_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_pro_l7500-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cm2320fxi_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_m9050_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-photosmart_a530_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_a440_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_3325-hpijs.ppd.gz
+
+foomatic_ps_printers = \
+ prnt/ps/hp-laserjet_4250-ps.ppd.gz \
+ prnt/ps/hp-laserjet_p3005-ps.ppd.gz \
+ prnt/ps/hp-officejet_pro_8000_enterprise_a811a-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_3700n-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_4610-ps.ppd.gz \
+ prnt/ps/hp-designjet_4020ps-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_4550-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cp5225-ps.ppd.gz \
+ prnt/ps/hp-laserjet_3015-ps.ppd.gz \
+ prnt/ps/hp-designjet_t1100ps_24in-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cm2320n_mfp-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cp3525-ps.ppd.gz \
+ prnt/ps/hp-laserjet_9055mfp-ps.ppd.gz \
+ prnt/ps/hp-business_inkjet_2250-ps.ppd.gz \
+ prnt/ps/hp-laserjet_m3035_mfp-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cm6040_mfp-ps.ppd.gz \
+ prnt/ps/hp-designjet_4000ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_2605dn-ps.ppd.gz \
+ prnt/ps/hp-laserjet_600_m601_m602_m603-ps.ppd.gz \
+ prnt/ps/hp-laserjet_m3027_mfp-ps.ppd.gz \
+ prnt/ps/hp-laserjet_5000_series-ps.ppd.gz \
+ prnt/ps/hp-laserjet_m4555_mfp-ps.ppd.gz \
+ prnt/ps/hp-laserjet_cp1520_series-ps.ppd.gz \
+ prnt/ps/hp-laserjet_8000-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cm6030_mfp-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cp2025n-ps.ppd.gz \
+ prnt/ps/hp-designjet_t1300_postscript-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_2605-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_4650-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cp5225n-ps.ppd.gz \
+ prnt/ps/hp-laserjet_cm1410_series-ps.ppd.gz \
+ prnt/ps/hp-laserjet_1320_series-ps.ppd.gz \
+ prnt/ps/hp-laserjet_4300-ps.ppd.gz \
+ prnt/ps/hp-laserjet_9065mfp-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cp4020_series-ps.ppd.gz \
+ prnt/ps/hp-designjet_t790ps_24in-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_4700-ps.ppd.gz \
+ prnt/ps/hp-laserjet_5200lx-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_2800-ps.ppd.gz \
+ prnt/ps/hp-laserjet_2200-ps.ppd.gz \
+ prnt/ps/hp-designjet_z6200_42in_photo-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cp2025x-ps.ppd.gz \
+ prnt/ps/hp-designjet_t770_postscript-ps.ppd.gz \
+ prnt/ps/hp-laserjet_2430-ps.ppd.gz \
+ prnt/ps/hp-laserjet_9040-ps.ppd.gz \
+ prnt/ps/hp-designjet_t790ps_44in-ps.ppd.gz \
+ prnt/ps/hp-laserjet_1300-ps.ppd.gz \
+ prnt/ps/hp-laserjet_5200-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cm2320nf_mfp-ps.ppd.gz \
+ prnt/ps/hp-laserjet_m1522n_mfp-ps.ppd.gz \
+ prnt/ps/hp-designjet_4520ps-ps.ppd.gz \
+ prnt/ps/hp-designjet_t7100ps_monochrome-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cp1514n-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_2500-ps.ppd.gz \
+ prnt/ps/hp-designjet_t1120ps_24in-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cm2320fxi_mfp-ps.ppd.gz \
+ prnt/ps/hp-laserjet_m9050_mfp-ps.ppd.gz \
+ prnt/ps/hp-laserjet_4200-ps.ppd.gz \
+ prnt/ps/hp-laserjet_9040_mfp-ps.ppd.gz \
+ prnt/ps/hp-designjet_t1100ps_44in-ps.ppd.gz \
+ prnt/ps/hp-laserjet_4100_mfp-ps.ppd.gz \
+ prnt/ps/hp-laserjet_4_plus-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cp4005-ps.ppd.gz \
+ prnt/ps/hp-laserjet_9000_series-ps.ppd.gz \
+ prnt/ps/hp-mopier_320-ps.ppd.gz \
+ prnt/ps/hp-business_inkjet_2280-ps.ppd.gz \
+ prnt/ps/hp-laserjet_4-ps.ppd.gz \
+ prnt/ps/hp-laserjet_500_color_m551-ps.ppd.gz \
+ prnt/ps/hp-laserjet_4240-ps.ppd.gz \
+ prnt/ps/hp-laserjet_3300_3310_3320-ps.ppd.gz \
+ prnt/ps/hp-business_inkjet_3000-ps.ppd.gz \
+ prnt/ps/hp-laserjet_1220se-ps.ppd.gz \
+ prnt/ps/hp-designjet_4500ps.ppd.gz \
+ prnt/ps/hp-laserjet_1200n-ps.ppd.gz \
+ prnt/ps/hp-laserjet_5100_series-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cm4540_mfp-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_5m-ps.ppd.gz \
+ prnt/ps/hp-laserjet_m1530_mfp_series-ps.ppd.gz \
+ prnt/ps/hp-laserjet_4100_series-ps.ppd.gz \
+ prnt/ps/hp-cm8050_mfp_with_edgeline-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_3800-ps.ppd.gz \
+ prnt/ps/hp-laserjet_1320tn-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cp1515n-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_2840-ps.ppd.gz \
+ prnt/ps/hp-laserjet_4345_mfp-ps.ppd.gz \
+ prnt/ps/hp-laserjet_4si-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cp6015-ps.ppd.gz \
+ prnt/ps/hp-laserjet_4mp-ps.ppd.gz \
+ prnt/ps/hp-laserjet_2300_series-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_8500-ps.ppd.gz \
+ prnt/ps/hp-laserjet_8100_series-ps.ppd.gz \
+ prnt/ps/hp-laserjet_1320-ps.ppd.gz \
+ prnt/ps/hp-designjet_4500mfp.ppd.gz \
+ prnt/ps/hp-laserjet_6mp-ps.ppd.gz \
+ prnt/ps/hp-cm8060_mfp_with_edgeline-ps.ppd.gz \
+ prnt/ps/hp-laserjet_5200l-ps.ppd.gz \
+ prnt/ps/hp-laserjet_3052-ps.ppd.gz \
+ prnt/ps/hp-laserjet_100_color_mfp_m175-ps.ppd.gz \
+ prnt/ps/hp-laserjet_m1522nf_mfp-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cm1015-ps.ppd.gz \
+ prnt/ps/hp-laserjet_p2055_series-ps.ppd.gz \
+ prnt/ps/hp-laserjet_200_colormfp_m275-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_8550-ps.ppd.gz \
+ prnt/ps/hp-laserjet_1220-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_2700n-ps.ppd.gz \
+ prnt/ps/hp-laserjet_1300xi-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cp5520_series-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_2605dtn-ps.ppd.gz \
+ prnt/ps/hp-designjet_z6100ps_60in_photo-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_3000-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cm1312_mfp-ps.ppd.gz \
+ prnt/ps/hp-laserjet_2420-ps.ppd.gz \
+ prnt/ps/hp-laserjet_5mp-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_2550_series-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_9500-ps.ppd.gz \
+ prnt/ps/hp-laserjet_8150_mfp-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cp5225dn-ps.ppd.gz \
+ prnt/ps/hp-laserjet_m5035_mfp-ps.ppd.gz \
+ prnt/ps/hp-laserjet_2200_series-ps.ppd.gz \
+ prnt/ps/hp-laserjet_m1522_mfp-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cp3505-ps.ppd.gz \
+ prnt/ps/hp-business_inkjet_2800-ps.ppd.gz \
+ prnt/ps/hp-laserjet_4350-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet-ps.ppd.gz \
+ prnt/ps/hp-laserjet_m5025_mfp-ps.ppd.gz \
+ prnt/ps/hp-laserjet_2100-ps.ppd.gz \
+ prnt/ps/hp-laserjet_p3010_series-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_4500-ps.ppd.gz \
+ prnt/ps/hp-laserjet_3050-ps.ppd.gz \
+ prnt/ps/hp-laserjet_3200m-ps.ppd.gz \
+ prnt/ps/hp-laserjet_1300n-ps.ppd.gz \
+ prnt/ps/hp-laserjet_3380-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_2830-ps.ppd.gz \
+ prnt/ps/hp-laserjet_9050-ps.ppd.gz \
+ prnt/ps/hp-laserjet_5si_mopier-ps.ppd.gz \
+ prnt/ps/hp-lj_300_400_color_mfp_m375_m475-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_4600_series-ps.ppd.gz \
+ prnt/ps/hp-designjet_t7100ps-ps.ppd.gz \
+ prnt/ps/hp-designjet_t770ps_24in-ps.ppd.gz \
+ prnt/ps/hp-designjet_z6100ps_42in_photo-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cm4730_mfp-ps.ppd.gz \
+ prnt/ps/hp-laserjet_3030-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_9500_mfp-ps.ppd.gz \
+ prnt/ps/hp-laserjet_m4345_mfp-ps.ppd.gz \
+ prnt/ps/hp-laserjet_p3004-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_4730mfp-ps.ppd.gz \
+ prnt/ps/hp-laserjet_m4349_mfp-ps.ppd.gz \
+ prnt/ps/hp-laserjet_5p-ps.ppd.gz \
+ prnt/ps/hp-designjet_t2300_postscript-ps.ppd.gz \
+ prnt/ps/hp-laserjet_m9059_mfp-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_3700-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cp2025dn-ps.ppd.gz \
+ prnt/ps/hp-laserjet_5000-ps.ppd.gz \
+ prnt/ps/hp-laserjet_p4010_series-ps.ppd.gz \
+ prnt/ps/hp-laserjet_1320n-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cm6049_mfp-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_2700-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cp4520_series-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_5500-ps.ppd.gz \
+ prnt/ps/hp-laserjet_m2727_mfp_series-ps.ppd.gz \
+ prnt/ps/hp-laserjet_2300-ps.ppd.gz \
+ prnt/ps/hp-laserjet_3390-ps.ppd.gz \
+ prnt/ps/hp-business_inkjet_2600-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cm1312nfi_mfp-ps.ppd.gz \
+ prnt/ps/hp-laserjet_3020-ps.ppd.gz \
+ prnt/ps/hp-laserjet_1320nw-ps.ppd.gz \
+ prnt/ps/hp-laserjet_4050_series-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_5550-ps.ppd.gz \
+ prnt/ps/hp-laserjet_p2015_series-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cm1017-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_2820-ps.ppd.gz \
+ prnt/ps/hp-laserjet_4v-ps.ppd.gz \
+ prnt/ps/hp-laserjet_2100_series-ps.ppd.gz \
+ prnt/ps/hp-laserjet_9050_mfp-ps.ppd.gz \
+ prnt/ps/hp-business_inkjet_2300-ps.ppd.gz \
+ prnt/ps/hp-designjet_z6200_60in_photo-ps.ppd.gz \
+ prnt/ps/hp-laserjet_5si-ps.ppd.gz \
+ prnt/ps/hp-designjet_4520mfp-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cp1518ni-ps.ppd.gz \
+ prnt/ps/hp-laserjet_2410-ps.ppd.gz \
+ prnt/ps/hp-designjet_t1120ps_44in-ps.ppd.gz \
+ prnt/ps/hp-mopier_240-ps.ppd.gz \
+ prnt/ps/hp-laserjet_6p-ps.ppd.gz \
+ prnt/ps/hp-laserjet_1200-ps.ppd.gz \
+ prnt/ps/hp-designjet_t1200_postscript-ps.ppd.gz \
+ prnt/ps/hp-laserjet_4ml-ps.ppd.gz \
+ prnt/ps/hp-laserjet_m9040_mfp-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_4600-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cp2025-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cm3530_mfp-ps.ppd.gz \
+ prnt/ps/hp-laserjet_8100_mfp-ps.ppd.gz \
+ prnt/ps/hp-laserjet_8000_series-ps.ppd.gz \
+ prnt/ps/hp-laserjet_4000_series-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_2500_series-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cm2320_mfp-ps.ppd.gz \
+ prnt/ps/hp-lj_300_400_color_m351_m451-ps.ppd.gz \
+ prnt/ps/hp-laserjet_9000_mfp-ps.ppd.gz
+
+foomatic_drv = prnt/drv/hpijs.drv
+unreldir =
+dist_unrel_DATA =
+cups_ppd_printers = \
+ ppd/hpcups/apollo-2100.ppd.gz \
+ ppd/hpcups/apollo-2150.ppd.gz \
+ ppd/hpcups/apollo-2200.ppd.gz \
+ ppd/hpcups/apollo-2500.ppd.gz \
+ ppd/hpcups/apollo-2600.ppd.gz \
+ ppd/hpcups/apollo-2650.ppd.gz \
+ ppd/hpcups/apollo-p2000-u.ppd.gz \
+ ppd/hpcups/apollo-p2250.ppd.gz \
+ ppd/hpcups/hp-2000c.ppd.gz \
+ ppd/hpcups/hp-2500c.ppd.gz \
+ ppd/hpcups/hp-910.ppd.gz \
+ ppd/hpcups/hp-915.ppd.gz \
+ ppd/hpcups/hp-business_inkjet_1000.ppd.gz \
+ ppd/hpcups/hp-business_inkjet_1100.ppd.gz \
+ ppd/hpcups/hp-business_inkjet_1200.ppd.gz \
+ ppd/hpcups/hp-business_inkjet_2200.ppd.gz \
+ ppd/hpcups/hp-business_inkjet_2230.ppd.gz \
+ ppd/hpcups/hp-business_inkjet_2250-pcl3.ppd.gz \
+ ppd/hpcups/hp-business_inkjet_2280-pcl3.ppd.gz \
+ ppd/hpcups/hp-business_inkjet_2300-pcl3.ppd.gz \
+ ppd/hpcups/hp-business_inkjet_2600-pcl3.ppd.gz \
+ ppd/hpcups/hp-business_inkjet_2800-pcl3.ppd.gz \
+ ppd/hpcups/hp-business_inkjet_3000-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_inkjet_cp1700.ppd.gz \
+ ppd/hpcups/hp-color_inkjet_printer_cp1700.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_1600.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_2500-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_2500_series.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_2600n.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_3000-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_3500n.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_3500.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_3550n.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_3550.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_3600.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_3700n.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_3700-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_3800-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_4500-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_4550-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_4600-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_4600_series.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_4610-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_4650-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_4700-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_4730mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_5500-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_5550-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_5m-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_5.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_8500-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_8550-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_9500_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_9500-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cm1312_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cm1312nfi_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cm2320fxi_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cm2320_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cm2320nf_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cm2320n_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cm3530_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cm4540_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cm4730_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cm6030_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cm6040_mfp.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cm6049_mfp.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cp1215.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cp1217.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cp1514n-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cp1515n-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cp1518ni-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cp2025dn-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cp2025n-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cp2025-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cp2025x-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cp3505-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cp3525-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cp4005-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cp4020_series-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cp4520_series-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cp5225dn-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cp5225n-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cp5225-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cp5520_series-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cp6015-pcl3.ppd.gz \
+ ppd/hpcups/hp-cp1160.ppd.gz \
+ ppd/hpcups/hp-deskjet_1000_j110_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_1050_j410_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_1100.ppd.gz \
+ ppd/hpcups/hp-deskjet_1120.ppd.gz \
+ ppd/hpcups/hp-deskjet_1125.ppd.gz \
+ ppd/hpcups/hp-deskjet_1200c.ppd.gz \
+ ppd/hpcups/hp-deskjet_1220c.ppd.gz \
+ ppd/hpcups/hp-deskjet_1280.ppd.gz \
+ ppd/hpcups/hp-deskjet_1600cm.ppd.gz \
+ ppd/hpcups/hp-deskjet_1600cn.ppd.gz \
+ ppd/hpcups/hp-deskjet_1600c.ppd.gz \
+ ppd/hpcups/hp-deskjet_2000_j210_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_2050_j510_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_3000_j310_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_3050a_j611_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_3050_j610_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_3070_b611_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_3320.ppd.gz \
+ ppd/hpcups/hp-deskjet_3325.ppd.gz \
+ ppd/hpcups/hp-deskjet_3420.ppd.gz \
+ ppd/hpcups/hp-deskjet_3425.ppd.gz \
+ ppd/hpcups/hp-deskjet_3450.ppd.gz \
+ ppd/hpcups/hp-deskjet_3500.ppd.gz \
+ ppd/hpcups/hp-deskjet_3550.ppd.gz \
+ ppd/hpcups/hp-deskjet_3600.ppd.gz \
+ ppd/hpcups/hp-deskjet_3650.ppd.gz \
+ ppd/hpcups/hp-deskjet_3740.ppd.gz \
+ ppd/hpcups/hp-deskjet_3810.ppd.gz \
+ ppd/hpcups/hp-deskjet_3816.ppd.gz \
+ ppd/hpcups/hp-deskjet_3819.ppd.gz \
+ ppd/hpcups/hp-deskjet_3820.ppd.gz \
+ ppd/hpcups/hp-deskjet_3822.ppd.gz \
+ ppd/hpcups/hp-deskjet_3840.ppd.gz \
+ ppd/hpcups/hp-deskjet_3870.ppd.gz \
+ ppd/hpcups/hp-deskjet_3900.ppd.gz \
+ ppd/hpcups/hp-deskjet_3910.ppd.gz \
+ ppd/hpcups/hp-deskjet_3920.ppd.gz \
+ ppd/hpcups/hp-deskjet_3940.ppd.gz \
+ ppd/hpcups/hp-deskjet_400l.ppd.gz \
+ ppd/hpcups/hp-deskjet_400.ppd.gz \
+ ppd/hpcups/hp-deskjet_460.ppd.gz \
+ ppd/hpcups/hp-deskjet_500c.ppd.gz \
+ ppd/hpcups/hp-deskjet_500.ppd.gz \
+ ppd/hpcups/hp-deskjet_505j.ppd.gz \
+ ppd/hpcups/hp-deskjet_5100.ppd.gz \
+ ppd/hpcups/hp-deskjet_510.ppd.gz \
+ ppd/hpcups/hp-deskjet_520.ppd.gz \
+ ppd/hpcups/hp-deskjet_5400_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_540.ppd.gz \
+ ppd/hpcups/hp-deskjet_550c.ppd.gz \
+ ppd/hpcups/hp-deskjet_5550.ppd.gz \
+ ppd/hpcups/hp-deskjet_5551.ppd.gz \
+ ppd/hpcups/hp-deskjet_5552.ppd.gz \
+ ppd/hpcups/hp-deskjet_5600.ppd.gz \
+ ppd/hpcups/hp-deskjet_5650.ppd.gz \
+ ppd/hpcups/hp-deskjet_5652.ppd.gz \
+ ppd/hpcups/hp-deskjet_5700.ppd.gz \
+ ppd/hpcups/hp-deskjet_5800.ppd.gz \
+ ppd/hpcups/hp-deskjet_5850.ppd.gz \
+ ppd/hpcups/hp-deskjet_5900_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_600.ppd.gz \
+ ppd/hpcups/hp-deskjet_610cl.ppd.gz \
+ ppd/hpcups/hp-deskjet_610c.ppd.gz \
+ ppd/hpcups/hp-deskjet_6120.ppd.gz \
+ ppd/hpcups/hp-deskjet_6122.ppd.gz \
+ ppd/hpcups/hp-deskjet_6127.ppd.gz \
+ ppd/hpcups/hp-deskjet_612c.ppd.gz \
+ ppd/hpcups/hp-deskjet_630c.ppd.gz \
+ ppd/hpcups/hp-deskjet_632c.ppd.gz \
+ ppd/hpcups/hp-deskjet_640c.ppd.gz \
+ ppd/hpcups/hp-deskjet_648c.ppd.gz \
+ ppd/hpcups/hp-deskjet_6500.ppd.gz \
+ ppd/hpcups/hp-deskjet_656c.ppd.gz \
+ ppd/hpcups/hp-deskjet_6600.ppd.gz \
+ ppd/hpcups/hp-deskjet_660.ppd.gz \
+ ppd/hpcups/hp-deskjet_670c.ppd.gz \
+ ppd/hpcups/hp-deskjet_670.ppd.gz \
+ ppd/hpcups/hp-deskjet_670tv.ppd.gz \
+ ppd/hpcups/hp-deskjet_672c.ppd.gz \
+ ppd/hpcups/hp-deskjet_6800.ppd.gz \
+ ppd/hpcups/hp-deskjet_680.ppd.gz \
+ ppd/hpcups/hp-deskjet_682.ppd.gz \
+ ppd/hpcups/hp-deskjet_690c.ppd.gz \
+ ppd/hpcups/hp-deskjet_690.ppd.gz \
+ ppd/hpcups/hp-deskjet_692.ppd.gz \
+ ppd/hpcups/hp-deskjet_693.ppd.gz \
+ ppd/hpcups/hp-deskjet_6940_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_694.ppd.gz \
+ ppd/hpcups/hp-deskjet_695.ppd.gz \
+ ppd/hpcups/hp-deskjet_697.ppd.gz \
+ ppd/hpcups/hp-deskjet_6980_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_810c.ppd.gz \
+ ppd/hpcups/hp-deskjet_812c.ppd.gz \
+ ppd/hpcups/hp-deskjet_815c.ppd.gz \
+ ppd/hpcups/hp-deskjet_816c.ppd.gz \
+ ppd/hpcups/hp-deskjet_825c.ppd.gz \
+ ppd/hpcups/hp-deskjet_830c.ppd.gz \
+ ppd/hpcups/hp-deskjet_832c.ppd.gz \
+ ppd/hpcups/hp-deskjet_840c.ppd.gz \
+ ppd/hpcups/hp-deskjet_841c.ppd.gz \
+ ppd/hpcups/hp-deskjet_842c.ppd.gz \
+ ppd/hpcups/hp-deskjet_843c.ppd.gz \
+ ppd/hpcups/hp-deskjet_845c.ppd.gz \
+ ppd/hpcups/hp-deskjet_850c.ppd.gz \
+ ppd/hpcups/hp-deskjet_855c.ppd.gz \
+ ppd/hpcups/hp-deskjet_870c.ppd.gz \
+ ppd/hpcups/hp-deskjet_880c.ppd.gz \
+ ppd/hpcups/hp-deskjet_882c.ppd.gz \
+ ppd/hpcups/hp-deskjet_890c.ppd.gz \
+ ppd/hpcups/hp-deskjet_895c.ppd.gz \
+ ppd/hpcups/hp-deskjet_916c.ppd.gz \
+ ppd/hpcups/hp-deskjet_920c.ppd.gz \
+ ppd/hpcups/hp-deskjet_9300.ppd.gz \
+ ppd/hpcups/hp-deskjet_930c.ppd.gz \
+ ppd/hpcups/hp-deskjet_932c.ppd.gz \
+ ppd/hpcups/hp-deskjet_933c.ppd.gz \
+ ppd/hpcups/hp-deskjet_934c.ppd.gz \
+ ppd/hpcups/hp-deskjet_935c.ppd.gz \
+ ppd/hpcups/hp-deskjet_940c.ppd.gz \
+ ppd/hpcups/hp-deskjet_948c.ppd.gz \
+ ppd/hpcups/hp-deskjet_950c.ppd.gz \
+ ppd/hpcups/hp-deskjet_952c.ppd.gz \
+ ppd/hpcups/hp-deskjet_955c.ppd.gz \
+ ppd/hpcups/hp-deskjet_957c.ppd.gz \
+ ppd/hpcups/hp-deskjet_959c.ppd.gz \
+ ppd/hpcups/hp-deskjet_9600.ppd.gz \
+ ppd/hpcups/hp-deskjet_960c.ppd.gz \
+ ppd/hpcups/hp-deskjet_970c.ppd.gz \
+ ppd/hpcups/hp-deskjet_975c.ppd.gz \
+ ppd/hpcups/hp-deskjet_9800.ppd.gz \
+ ppd/hpcups/hp-deskjet_980c.ppd.gz \
+ ppd/hpcups/hp-deskjet_990c.ppd.gz \
+ ppd/hpcups/hp-deskjet_995c.ppd.gz \
+ ppd/hpcups/hp-deskjet_d1300_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_d1400_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_d1500_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_d1600_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_d2300_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_d2400_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_d2500_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_d2600_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_d4100_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_d4200_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_d4300_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_d5500_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_d730.ppd.gz \
+ ppd/hpcups/hp-deskjet_f2100_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_f2200_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_f2400_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_f300_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_f4100_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_f4200_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_f4210_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_f4213_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_f4400_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_f4500_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_f735.ppd.gz \
+ ppd/hpcups/hp-deskjet_ink_adv_2010_k010.ppd.gz \
+ ppd/hpcups/hp-deskjet_ink_adv_2060_k110.ppd.gz \
+ ppd/hpcups/hp-deskjet_ink_advant_k109a-z.ppd.gz \
+ ppd/hpcups/hp-deskjet_ink_advant_k209a-z.ppd.gz \
+ ppd/hpcups/hp-dj350.ppd.gz \
+ ppd/hpcups/hp-dj450.ppd.gz \
+ ppd/hpcups/hp-envy_100_d410_series.ppd.gz \
+ ppd/hpcups/hp-envy_110_series.ppd.gz \
+ ppd/hpcups/hp-laserjet_1000.ppd.gz \
+ ppd/hpcups/hp-laserjet_1005_series.ppd.gz \
+ ppd/hpcups/hp-laserjet_1010.ppd.gz \
+ ppd/hpcups/hp-laserjet_1012.ppd.gz \
+ ppd/hpcups/hp-laserjet_1015.ppd.gz \
+ ppd/hpcups/hp-laserjet_1018.ppd.gz \
+ ppd/hpcups/hp-laserjet_1020.ppd.gz \
+ ppd/hpcups/hp-laserjet_1022n-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_1022nw-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_1022nw-zjs.ppd.gz \
+ ppd/hpcups/hp-laserjet_1022n-zjs.ppd.gz \
+ ppd/hpcups/hp-laserjet_1022-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_1022-zjs.ppd.gz \
+ ppd/hpcups/hp-laserjet_1100a.ppd.gz \
+ ppd/hpcups/hp-laserjet_1100.ppd.gz \
+ ppd/hpcups/hp-laserjet_1100xi.ppd.gz \
+ ppd/hpcups/hp-laserjet_1150.ppd.gz \
+ ppd/hpcups/hp-laserjet_1160.ppd.gz \
+ ppd/hpcups/hp-laserjet_1160_series.ppd.gz \
+ ppd/hpcups/hp-laserjet_1200n.ppd.gz \
+ ppd/hpcups/hp-laserjet_1200-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_1220-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_1220se.ppd.gz \
+ ppd/hpcups/hp-laserjet_1300n-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_1300-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_1300xi-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_1320n.ppd.gz \
+ ppd/hpcups/hp-laserjet_1320nw.ppd.gz \
+ ppd/hpcups/hp-laserjet_1320.ppd.gz \
+ ppd/hpcups/hp-laserjet_1320_series-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_1320tn.ppd.gz \
+ ppd/hpcups/hp-laserjet_2100.ppd.gz \
+ ppd/hpcups/hp-laserjet_2100_series-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_2200-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_2200_series.ppd.gz \
+ ppd/hpcups/hp-laserjet_2300-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_2300_series.ppd.gz \
+ ppd/hpcups/hp-laserjet_2410-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_2420-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_2430-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_3015-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_3020-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_3030-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_3050-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_3052-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_3055.ppd.gz \
+ ppd/hpcups/hp-laserjet_3100.ppd.gz \
+ ppd/hpcups/hp-laserjet_3150.ppd.gz \
+ ppd/hpcups/hp-laserjet_3200m-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_3200.ppd.gz \
+ ppd/hpcups/hp-laserjet_3200se.ppd.gz \
+ ppd/hpcups/hp-laserjet_3300_3310_3320-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_3330.ppd.gz \
+ ppd/hpcups/hp-laserjet_3380-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_3390-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_3392.ppd.gz \
+ ppd/hpcups/hp-laserjet_4000_series-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_4050_series-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_4100_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_4100_series-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_4150_series.ppd.gz \
+ ppd/hpcups/hp-laserjet_4200-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_4240-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_4250-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_4300-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_4345_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_4350-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_4l.ppd.gz \
+ ppd/hpcups/hp-laserjet_4ml.ppd.gz \
+ ppd/hpcups/hp-laserjet_4mp-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_4_plus-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_4si-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_4v-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_5000.ppd.gz \
+ ppd/hpcups/hp-laserjet_5000_series-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_5100_series-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_5200l-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_5200lx.ppd.gz \
+ ppd/hpcups/hp-laserjet_5200-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_5l.ppd.gz \
+ ppd/hpcups/hp-laserjet_5mp-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_5p.ppd.gz \
+ ppd/hpcups/hp-laserjet_5si_mopier-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_5si-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_6l.ppd.gz \
+ ppd/hpcups/hp-laserjet_6mp-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_6p.ppd.gz \
+ ppd/hpcups/hp-laserjet_8000.ppd.gz \
+ ppd/hpcups/hp-laserjet_8000_series-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_8100_mfp.ppd.gz \
+ ppd/hpcups/hp-laserjet_8100_series-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_8150_mfp.ppd.gz \
+ ppd/hpcups/hp-laserjet_8150_series-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_9000_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_9000_series-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_9040_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_9040-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_9050_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_9050-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_9055mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_9065mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_cm1411fn-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_cm1412fn-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_cm1413fn-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_cm1415fn-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_cm1415fnw-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_cm1416fnw-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_cm1417fnw-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_cm1418fnw-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_cp_1025nw.ppd.gz \
+ ppd/hpcups/hp-laserjet_cp1025nw.ppd.gz \
+ ppd/hpcups/hp-laserjet_cp_1025.ppd.gz \
+ ppd/hpcups/hp-laserjet_cp1025.ppd.gz \
+ ppd/hpcups/hp-laserjet_m1005.ppd.gz \
+ ppd/hpcups/hp-laserjet_m1120_mfp.ppd.gz \
+ ppd/hpcups/hp-laserjet_m1120n_mfp.ppd.gz \
+ ppd/hpcups/hp-laserjet_m1319f_mfp.ppd.gz \
+ ppd/hpcups/hp-laserjet_m1522nf_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_m1536dnf_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_m1537dnf_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_m1538dnf_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_m1539dnf_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_m2727_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_m3027_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_m3035_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_m4345_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_m4349_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_m5025_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_m5035_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_m5039_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_m9040_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_m9050_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_m9059_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_p1005.ppd.gz \
+ ppd/hpcups/hp-laserjet_p1006.ppd.gz \
+ ppd/hpcups/hp-laserjet_p1007.ppd.gz \
+ ppd/hpcups/hp-laserjet_p1008.ppd.gz \
+ ppd/hpcups/hp-laserjet_p1009.ppd.gz \
+ ppd/hpcups/hp-laserjet_p1505n-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_p1505n-zxs.ppd.gz \
+ ppd/hpcups/hp-laserjet_p1505.ppd.gz \
+ ppd/hpcups/hp-laserjet_p2014n-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_p2014n-zxs.ppd.gz \
+ ppd/hpcups/hp-laserjet_p2014-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_p2014-zxs.ppd.gz \
+ ppd/hpcups/hp-laserjet_p2015dn_series.ppd.gz \
+ ppd/hpcups/hp-laserjet_p2015d_series.ppd.gz \
+ ppd/hpcups/hp-laserjet_p2015n_series.ppd.gz \
+ ppd/hpcups/hp-laserjet_p2015_series-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_p2015x_series.ppd.gz \
+ ppd/hpcups/hp-laserjet_p2035n-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_p2035n-zjs.ppd.gz \
+ ppd/hpcups/hp-laserjet_p2035-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_p2035-zjs.ppd.gz \
+ ppd/hpcups/hp-laserjet_p2055dn-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_p2055d-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_p2055-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_p2055x-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_p3004-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_p3005-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_p3010_series-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_p4014dn.ppd.gz \
+ ppd/hpcups/hp-laserjet_p4014n.ppd.gz \
+ ppd/hpcups/hp-laserjet_p4014.ppd.gz \
+ ppd/hpcups/hp-laserjet_p4015dn.ppd.gz \
+ ppd/hpcups/hp-laserjet_p4015n.ppd.gz \
+ ppd/hpcups/hp-laserjet_p4015.ppd.gz \
+ ppd/hpcups/hp-laserjet_p4015tn.ppd.gz \
+ ppd/hpcups/hp-laserjet_p4015x.ppd.gz \
+ ppd/hpcups/hp-laserjet_p4515n.ppd.gz \
+ ppd/hpcups/hp-laserjet_p4515.ppd.gz \
+ ppd/hpcups/hp-laserjet_p4515tn.ppd.gz \
+ ppd/hpcups/hp-laserjet_p4515xm.ppd.gz \
+ ppd/hpcups/hp-laserjet_p4515x.ppd.gz \
+ ppd/hpcups/hp-laserjet_professional_m1132_mfp.ppd.gz \
+ ppd/hpcups/hp-laserjet_professional_m1136_mfp.ppd.gz \
+ ppd/hpcups/hp-laserjet_professional_m1212nf_mfp.ppd.gz \
+ ppd/hpcups/hp-laserjet_professional_m1213nf_mfp.ppd.gz \
+ ppd/hpcups/hp-laserjet_professional_m1214nfh_mfp.ppd.gz \
+ ppd/hpcups/hp-laserjet_professional_m1216nfh_mfp.ppd.gz \
+ ppd/hpcups/hp-laserjet_professional_m1217nfw_mfp.ppd.gz \
+ ppd/hpcups/hp-laserjet_professional_m1219nf_mfp.ppd.gz \
+ ppd/hpcups/hp-laserjet_professional_p1102.ppd.gz \
+ ppd/hpcups/hp-laserjet_professional_p_1102w.ppd.gz \
+ ppd/hpcups/hp-laserjet_professional_p1102w.ppd.gz \
+ ppd/hpcups/hp-laserjet_professional_p1106.ppd.gz \
+ ppd/hpcups/hp-laserjet_professional_p1108.ppd.gz \
+ ppd/hpcups/hp-laserjet_professional_p1566.ppd.gz \
+ ppd/hpcups/hp-laserjet_professional_p1606dn.ppd.gz \
+ ppd/hpcups/hp-mopier_240-pcl3.ppd.gz \
+ ppd/hpcups/hp-mopier_320-pcl3.ppd.gz \
+ ppd/hpcups/hp-officejet_100_mobile_l411.ppd.gz \
+ ppd/hpcups/hp-officejet_4000_k210.ppd.gz \
+ ppd/hpcups/hp-officejet_4100_series.ppd.gz \
+ ppd/hpcups/hp-officejet_4105.ppd.gz \
+ ppd/hpcups/hp-officejet_4115_series.ppd.gz \
+ ppd/hpcups/hp-officejet_4200_series.ppd.gz \
+ ppd/hpcups/hp-officejet_4255.ppd.gz \
+ ppd/hpcups/hp-officejet_4300_series.ppd.gz \
+ ppd/hpcups/hp-officejet_4400_k410.ppd.gz \
+ ppd/hpcups/hp-officejet_4500_g510a-f.ppd.gz \
+ ppd/hpcups/hp-officejet_4500_g510g-m.ppd.gz \
+ ppd/hpcups/hp-officejet_4500_g510n-z.ppd.gz \
+ ppd/hpcups/hp-officejet_4500_k710.ppd.gz \
+ ppd/hpcups/hp-officejet_5100_series.ppd.gz \
+ ppd/hpcups/hp-officejet_5105.ppd.gz \
+ ppd/hpcups/hp-officejet_5110.ppd.gz \
+ ppd/hpcups/hp-officejet_5110v.ppd.gz \
+ ppd/hpcups/hp-officejet_5500_series.ppd.gz \
+ ppd/hpcups/hp-officejet_5600_series.ppd.gz \
+ ppd/hpcups/hp-officejet_6000_e609a.ppd.gz \
+ ppd/hpcups/hp-officejet_6000_e609n.ppd.gz \
+ ppd/hpcups/hp-officejet_6100.ppd.gz \
+ ppd/hpcups/hp-officejet_6100_series.ppd.gz \
+ ppd/hpcups/hp-officejet_6150_series.ppd.gz \
+ ppd/hpcups/hp-officejet_6200_series.ppd.gz \
+ ppd/hpcups/hp-officejet_6300_series.ppd.gz \
+ ppd/hpcups/hp-officejet_6500_e709a.ppd.gz \
+ ppd/hpcups/hp-officejet_6500_e709n.ppd.gz \
+ ppd/hpcups/hp-officejet_6500_e710a-f.ppd.gz \
+ ppd/hpcups/hp-officejet_6500_e710n-z.ppd.gz \
+ ppd/hpcups/hp-officejet_6600.ppd.gz \
+ ppd/hpcups/hp-officejet_6700.ppd.gz \
+ ppd/hpcups/hp-officejet_7000_e809a.ppd.gz \
+ ppd/hpcups/hp-officejet_7000_e809a_series.ppd.gz \
+ ppd/hpcups/hp-officejet_7100_series.ppd.gz \
+ ppd/hpcups/hp-officejet_7200_series.ppd.gz \
+ ppd/hpcups/hp-officejet_7300_series.ppd.gz \
+ ppd/hpcups/hp-officejet_7400_series.ppd.gz \
+ ppd/hpcups/hp-officejet_7500_e910.ppd.gz \
+ ppd/hpcups/hp-officejet_9100_series-pcl3.ppd.gz \
+ ppd/hpcups/hp-officejet_d_series.ppd.gz \
+ ppd/hpcups/hp-officejet_g55.ppd.gz \
+ ppd/hpcups/hp-officejet_g55xi.ppd.gz \
+ ppd/hpcups/hp-officejet_g85.ppd.gz \
+ ppd/hpcups/hp-officejet_g85xi.ppd.gz \
+ ppd/hpcups/hp-officejet_g95.ppd.gz \
+ ppd/hpcups/hp-officejet_h470.ppd.gz \
+ ppd/hpcups/hp-officejet_j3500_series.ppd.gz \
+ ppd/hpcups/hp-officejet_j3600_series.ppd.gz \
+ ppd/hpcups/hp-officejet_j4500_series.ppd.gz \
+ ppd/hpcups/hp-officejet_j4660_series.ppd.gz \
+ ppd/hpcups/hp-officejet_j4680_series.ppd.gz \
+ ppd/hpcups/hp-officejet_j5500_series.ppd.gz \
+ ppd/hpcups/hp-officejet_j5700_series.ppd.gz \
+ ppd/hpcups/hp-officejet_j6400_series.ppd.gz \
+ ppd/hpcups/hp-officejet_k60.ppd.gz \
+ ppd/hpcups/hp-officejet_k60xi.ppd.gz \
+ ppd/hpcups/hp-officejet_k7100.ppd.gz \
+ ppd/hpcups/hp-officejet_k80.ppd.gz \
+ ppd/hpcups/hp-officejet_k80xi.ppd.gz \
+ ppd/hpcups/hp-officejet_lx.ppd.gz \
+ ppd/hpcups/hp-officejet.ppd.gz \
+ ppd/hpcups/hp-officejet_pro_1150c.ppd.gz \
+ ppd/hpcups/hp-officejet_pro_1170c_series.ppd.gz \
+ ppd/hpcups/hp-officejet_pro_8000_a809.ppd.gz \
+ ppd/hpcups/hp-officejet_pro_8100.ppd.gz \
+ ppd/hpcups/hp-officejet_pro_8500_a909a.ppd.gz \
+ ppd/hpcups/hp-officejet_pro_8500_a909g.ppd.gz \
+ ppd/hpcups/hp-officejet_pro_8500_a909n.ppd.gz \
+ ppd/hpcups/hp-officejet_pro_8500_a910.ppd.gz \
+ ppd/hpcups/hp-officejet_pro_8600.ppd.gz \
+ ppd/hpcups/hp-officejet_pro_k5300.ppd.gz \
+ ppd/hpcups/hp-officejet_pro_k5400.ppd.gz \
+ ppd/hpcups/hp-officejet_pro_k550.ppd.gz \
+ ppd/hpcups/hp-officejet_pro_k850.ppd.gz \
+ ppd/hpcups/hp-officejet_pro_k8600.ppd.gz \
+ ppd/hpcups/hp-officejet_pro_l7300.ppd.gz \
+ ppd/hpcups/hp-officejet_pro_l7400.ppd.gz \
+ ppd/hpcups/hp-officejet_pro_l7500.ppd.gz \
+ ppd/hpcups/hp-officejet_pro_l7600.ppd.gz \
+ ppd/hpcups/hp-officejet_pro_l7700.ppd.gz \
+ ppd/hpcups/hp-officejet_r40.ppd.gz \
+ ppd/hpcups/hp-officejet_r40xi.ppd.gz \
+ ppd/hpcups/hp-officejet_r45.ppd.gz \
+ ppd/hpcups/hp-officejet_r60.ppd.gz \
+ ppd/hpcups/hp-officejet_r65.ppd.gz \
+ ppd/hpcups/hp-officejet_r80.ppd.gz \
+ ppd/hpcups/hp-officejet_r80xi.ppd.gz \
+ ppd/hpcups/hp-officejet_series_300.ppd.gz \
+ ppd/hpcups/hp-officejet_series_310.ppd.gz \
+ ppd/hpcups/hp-officejet_series_320.ppd.gz \
+ ppd/hpcups/hp-officejet_series_330.ppd.gz \
+ ppd/hpcups/hp-officejet_series_350.ppd.gz \
+ ppd/hpcups/hp-officejet_series_520.ppd.gz \
+ ppd/hpcups/hp-officejet_series_570.ppd.gz \
+ ppd/hpcups/hp-officejet_series_580.ppd.gz \
+ ppd/hpcups/hp-officejet_series_590.ppd.gz \
+ ppd/hpcups/hp-officejet_series_600.ppd.gz \
+ ppd/hpcups/hp-officejet_series_610.ppd.gz \
+ ppd/hpcups/hp-officejet_series_630.ppd.gz \
+ ppd/hpcups/hp-officejet_series_700.ppd.gz \
+ ppd/hpcups/hp-officejet_series_710.ppd.gz \
+ ppd/hpcups/hp-officejet_series_720.ppd.gz \
+ ppd/hpcups/hp-officejet_series_725.ppd.gz \
+ ppd/hpcups/hp-officejet_t_series.ppd.gz \
+ ppd/hpcups/hp-officejet_v30.ppd.gz \
+ ppd/hpcups/hp-officejet_v40.ppd.gz \
+ ppd/hpcups/hp-officejet_v40xi.ppd.gz \
+ ppd/hpcups/hp-officejet_v45.ppd.gz \
+ ppd/hpcups/hp-photosmart_100.ppd.gz \
+ ppd/hpcups/hp-photosmart_1115.ppd.gz \
+ ppd/hpcups/hp-photosmart_1215.ppd.gz \
+ ppd/hpcups/hp-photosmart_1218.ppd.gz \
+ ppd/hpcups/hp-photosmart_130.ppd.gz \
+ ppd/hpcups/hp-photosmart_1315.ppd.gz \
+ ppd/hpcups/hp-photosmart_140_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_230.ppd.gz \
+ ppd/hpcups/hp-photosmart_240_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_2570_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_2600_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_2700_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_3100_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_3200_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_320_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_3300_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_330_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_370_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_380_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_420_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_470_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_5510d_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_5510_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_6510_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_7150.ppd.gz \
+ ppd/hpcups/hp-photosmart_7200_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_7345.ppd.gz \
+ ppd/hpcups/hp-photosmart_7350.ppd.gz \
+ ppd/hpcups/hp-photosmart_7400_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_7510_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_7550.ppd.gz \
+ ppd/hpcups/hp-photosmart_7600_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_7700_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_7800_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_7900_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_8000_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_8100_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_8200_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_8400_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_8700_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_a310_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_a320_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_a430_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_a440_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_a510_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_a520_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_a530_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_a610_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_a620_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_a630_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_a640_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_a710_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_a820_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_b010_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_b109a-m.ppd.gz \
+ ppd/hpcups/hp-photosmart_b109a_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_b110_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_b8500_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_c309a_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_c3100_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_c4100_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_c4200_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_c4340_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_c4380_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_c4400_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_c4500_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_c4600_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_c4700_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_c5100_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_c5200_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_c5300_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_c5500_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_c6100_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_c6200_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_c6300_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_c7100_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_c7200_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_c8100_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_d110_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_d5060_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_d5100_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_d5300_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_d5400_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_d6100_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_d7100_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_d7200_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_d7300_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_d7400_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_d7500_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_estn_c510_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_ink_adv_k510.ppd.gz \
+ ppd/hpcups/hp-photosmart_p1000.ppd.gz \
+ ppd/hpcups/hp-photosmart_p1100.ppd.gz \
+ ppd/hpcups/hp-photosmart_plus_b209a-m.ppd.gz \
+ ppd/hpcups/hp-photosmart_plus_b210_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_prem_c310_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_prem_c410_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_premium_c309g-m.ppd.gz \
+ ppd/hpcups/hp-photosmart_prem-web_c309n-s.ppd.gz \
+ ppd/hpcups/hp-photosmart_pro_b8300_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_pro_b8800_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_wireless_b109n-z.ppd.gz \
+ ppd/hpcups/hp-printer_scanner_copier_300.ppd.gz \
+ ppd/hpcups/hp-psc_1000_series.ppd.gz \
+ ppd/hpcups/hp-psc_1100_series.ppd.gz \
+ ppd/hpcups/hp-psc_1200_series.ppd.gz \
+ ppd/hpcups/hp-psc_1300_series.ppd.gz \
+ ppd/hpcups/hp-psc_1310_series.ppd.gz \
+ ppd/hpcups/hp-psc_1358_series.ppd.gz \
+ ppd/hpcups/hp-psc_1400_series.ppd.gz \
+ ppd/hpcups/hp-psc_1500_series.ppd.gz \
+ ppd/hpcups/hp-psc_1510_series.ppd.gz \
+ ppd/hpcups/hp-psc_1600_series.ppd.gz \
+ ppd/hpcups/hp-psc_2100_series.ppd.gz \
+ ppd/hpcups/hp-psc_2150_series.ppd.gz \
+ ppd/hpcups/hp-psc_2170_series.ppd.gz \
+ ppd/hpcups/hp-psc_2200_series.ppd.gz \
+ ppd/hpcups/hp-psc_2210_series.ppd.gz \
+ ppd/hpcups/hp-psc_2300_series.ppd.gz \
+ ppd/hpcups/hp-psc_2350_series.ppd.gz \
+ ppd/hpcups/hp-psc_2400_series.ppd.gz \
+ ppd/hpcups/hp-psc_2500_series.ppd.gz \
+ ppd/hpcups/hp-psc_500.ppd.gz \
+ ppd/hpcups/hp-psc_720.ppd.gz \
+ ppd/hpcups/hp-psc_750.ppd.gz \
+ ppd/hpcups/hp-psc_750xi.ppd.gz \
+ ppd/hpcups/hp-psc_760.ppd.gz \
+ ppd/hpcups/hp-psc_780.ppd.gz \
+ ppd/hpcups/hp-psc_780xi.ppd.gz \
+ ppd/hpcups/hp-psc_900_series.ppd.gz \
+ ppd/hpcups/hp-psc_920.ppd.gz \
+ ppd/hpcups/hp-psc_950.ppd.gz \
+ ppd/hpcups/hp-psc_950vr.ppd.gz \
+ ppd/hpcups/hp-psc_950xi.ppd.gz
+
+cups_drv = prnt/drv/hpcups.drv
+@DOC_BUILD_TRUE@wwwsrc = doc
+@DOC_BUILD_TRUE@www0dir = $(docdir)
+@DOC_BUILD_TRUE@dist_www0_DATA = $(wwwsrc)/index.html $(wwwsrc)/commandline.html $(wwwsrc)/copying.html $(wwwsrc)/devicemanager.html $(wwwsrc)/faxtrouble.html $(wwwsrc)/gettinghelp.html $(wwwsrc)/hpscan.html $(wwwsrc)/mainttask.html $(wwwsrc)/plugins.html $(wwwsrc)/print.html $(wwwsrc)/printing.html $(wwwsrc)/printoptions.html $(wwwsrc)/printtroubleshooting.html $(wwwsrc)/scanning.html $(wwwsrc)/scantrouble.html $(wwwsrc)/sendfax.html $(wwwsrc)/setup.html $(wwwsrc)/systray.html $(wwwsrc)/troubleshooting.html $(wwwsrc)/uninstalling.html $(wwwsrc)/upgrading.html
+@DOC_BUILD_TRUE@www3dir = $(docdir)/styles
+@DOC_BUILD_TRUE@dist_www3_DATA = $(wwwsrc)/styles/*
+@DOC_BUILD_TRUE@www4dir = $(docdir)/images
+@DOC_BUILD_TRUE@dist_www4_DATA = $(wwwsrc)/images/*
+
+# hp backend.
+@HPLIP_BUILD_TRUE@hpdir = $(cupsbackenddir)
+@HPLIP_BUILD_TRUE@hp_SOURCES = prnt/backend/hp.c
+@HPLIP_BUILD_TRUE@hp_LDADD = libhpmud.la $(DBUS_LIBS)
+@HPLIP_BUILD_TRUE@hp_CFLAGS = $(DBUS_CFLAGS)
+
+# hpaio sane backend
+@HPLIP_BUILD_TRUE@@SCAN_BUILD_TRUE@libsane_hpaiodir = $(libdir)/sane
+@HPLIP_BUILD_TRUE@@SCAN_BUILD_TRUE@libsane_hpaio_LTLIBRARIES = libsane-hpaio.la
+@HPLIP_BUILD_TRUE@@SCAN_BUILD_TRUE@libsane_hpaio_la_SOURCES = scan/sane/hpaio.c scan/sane/mfpdtf.c scan/sane/pml.c scan/sane/scl.c scan/sane/io.c scan/sane/hpaio.h \
+@HPLIP_BUILD_TRUE@@SCAN_BUILD_TRUE@ scan/sane/pml.h scan/sane/saneopts.h scan/sane/io.h scan/sane/mfpdtf.h scan/sane/sane.h scan/sane/scl.h scan/sane/tables.h \
+@HPLIP_BUILD_TRUE@@SCAN_BUILD_TRUE@ scan/sane/common.c scan/sane/common.h scan/sane/soap.h scan/sane/soapht.h scan/sane/sanei_debug.h scan/sane/sanei.h \
+@HPLIP_BUILD_TRUE@@SCAN_BUILD_TRUE@ scan/sane/sanei_init_debug.c scan/sane/marvell.h scan/sane/marvelli.h scan/sane/marvell.c scan/sane/soapht.c scan/sane/soap.c \
+@HPLIP_BUILD_TRUE@@SCAN_BUILD_TRUE@ scan/sane/soaphti.h scan/sane/soapi.h scan/sane/xml.c scan/sane/xml.h scan/sane/ledm.h scan/sane/ledmi.h scan/sane/ledm.c \
+@HPLIP_BUILD_TRUE@@SCAN_BUILD_TRUE@ scan/sane/bb_ledm.c scan/sane/http.h scan/sane/http.c
+
+@DARWIN_BUILD_FALSE@@HPLIP_BUILD_TRUE@@SCAN_BUILD_TRUE@libsane_hpaio_la_LDFLAGS = -version-info 1:0:0
+@DARWIN_BUILD_TRUE@@HPLIP_BUILD_TRUE@@SCAN_BUILD_TRUE@libsane_hpaio_la_LDFLAGS = -module -framework CoreFoundation -version-info 1:0:0
+# The following is a interlibrary dependency that must be compiled first.
+@HPLIP_BUILD_TRUE@@SCAN_BUILD_TRUE@libsane_hpaio_la_LIBADD = libhpip.la libhpmud.la $(DBUS_LIBS) -lcups -ldl
+#libsane_hpaio_la_CFLAGS = -DWITH_NONAMESPACES -DSOAP_DEBUG
+@HPLIP_BUILD_TRUE@@SCAN_BUILD_TRUE@libsane_hpaio_la_CFLAGS = $(DBUS_CFLAGS)
+
+# hpmud library
+@HPLIP_BUILD_TRUE@MUDNAME = hpmud
+@HPLIP_BUILD_TRUE@libhpmud_la_SOURCES = io/hpmud/hpmud.c io/hpmud/mlc.c io/hpmud/model.c io/hpmud/musb.c io/hpmud/pml.c \
+@HPLIP_BUILD_TRUE@ io/hpmud/hpmud.h io/hpmud/hpmudi.h io/hpmud/list.h io/hpmud/mlc.h io/hpmud/musb.h io/hpmud/pml.h io/hpmud/dot4.c \
+@HPLIP_BUILD_TRUE@ io/hpmud/dot4.h io/hpmud/jd.c io/hpmud/jd.h io/hpmud/pp.c io/hpmud/pp.h
+
+@HPLIP_BUILD_TRUE@@NETWORK_BUILD_FALSE@libhpmud_la_LDFLAGS = -version-info 0:6:0 -lusb -lpthread
+@HPLIP_BUILD_TRUE@@NETWORK_BUILD_TRUE@libhpmud_la_LDFLAGS = -version-info 0:6:0 -lusb -lpthread -l$(SNMPLIB) -lcrypto
+@HPLIP_BUILD_TRUE@libhpmud_la_CFLAGS = -DMUDNAME=\"$(MUDNAME)\" -DCONFDIR=\"$(hplip_confdir)\"
+@HPLIP_BUILD_TRUE@libhpip_la_LDFLAGS = -version-info 0:1:0
+@HPLIP_BUILD_TRUE@libhpip_la_LIBADD = -lm
+@HPLIP_BUILD_TRUE@libhpip_la_SOURCES = ip/xconvolve.c ip/xfax.c ip/xgrayout.c ip/xjpg_dct.c ip/xjpg_fix.c ip/xpad.c ip/xrotate.c ip/xskel.c ip/xtiff.c \
+@HPLIP_BUILD_TRUE@ ip/ipmain.c ip/xchgbpp.c ip/xcrop.c ip/xgamma.c ip/xjpg_dec.c ip/xjpg_huf.c ip/xpcx.c ip/xsaturation.c ip/xtable.c ip/xtonemap.c \
+@HPLIP_BUILD_TRUE@ ip/xbi2gray.c ip/xcolrspc.c ip/xfakemono.c ip/xgray2bi.c ip/xinvert.c ip/xjpg_enc.c ip/xmatrix.c ip/xpnm.c ip/xscale.c ip/xthumb.c ip/xyxtract.c \
+@HPLIP_BUILD_TRUE@ ip/hpip.h ip/ipdefs.h ip/xform.h ip/xjpg_dct.h ip/xjpg_huf.h ip/xjpg_mrk.h
+
+
+# hp-mkuri.
+@HPLIP_BUILD_TRUE@hp_mkuridir = $(bindir)
+@HPLIP_BUILD_TRUE@hp_mkuri_SOURCES = io/hpmud/hp-mkuri.c
+@HPLIP_BUILD_TRUE@hp_mkuri_LDADD = -ldl libhpmud.la
+@HPLIP_BUILD_TRUE@hp_mkuri_CFLAGS = -DCONFDIR=\"$(hplip_confdir)\"
+
+# hpmud.rules
+@HPLIP_BUILD_TRUE@rulesdir = /etc/udev/rules.d
+@HPLIP_BUILD_TRUE@dist_rules_DATA = data/rules/56-hpmud_support.rules \
+@HPLIP_BUILD_TRUE@ data/rules/86-hpmud_plugin.rules \
+@HPLIP_BUILD_TRUE@ data/rules/56-hpmud_add_printer.rules \
+@HPLIP_BUILD_TRUE@ $(am__append_2) $(am__append_3)
+@HPLIP_BUILD_TRUE@halpredir = /usr/share/hal/fdi/preprobe/10osvendor
+@HPLIP_BUILD_TRUE@dist_halpre_DATA = data/rules/20-hplip-devices.fdi
+
+# hplip.conf
+@HPLIP_BUILD_TRUE@hplip_confdir = /etc/hp
+@HPLIP_BUILD_TRUE@hplip_conf_DATA = hplip.conf
+
+#pstotiff filter
+@HPLIP_BUILD_TRUE@pstotiffdir = $(cupsfilterdir)
+@HPLIP_BUILD_TRUE@pstotiff_SCRIPTS = fax/filters/pstotiff
+
+# hplip.state
+@HPLIP_BUILD_TRUE@hplip_statedir = /var/lib/hp
+@HPLIP_BUILD_TRUE@dist_hplip_state_DATA =
+#dist_hplip_state_DATA = hplip.state
+
+# Log Files
+@HPLIP_BUILD_TRUE@hplip_Logdir = /var/log/hp
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@dist_hplip_SCRIPTS = hpssd.py __init__.py hpdio.py
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@cmddir = $(hplipdir)
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@dist_cmd_SCRIPTS = align.py info.py print.py toolbox.py clean.py colorcal.py unload.py testpage.py makeuri.py check.py fab.py levels.py \
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@ sendfax.py setup.py makecopies.py probe.py timedate.py firmware.py scan.py systray.py plugin.py linefeedcal.py pqdiag.py \
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@ faxsetup.py devicesettings.py printsettings.py query.py pkservice.py wificonfig.py check-plugin.py diagnose_plugin.py uninstall.py \
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@ upgrade.py config_usb_printer.py diagnose_queues.py
+
+
+# base
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@basedir = $(hplipdir)/base
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@dist_base_DATA = base/maint.py base/codes.py base/g.py base/pml.py base/status.py \
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@ base/__init__.py base/mfpdtf.py base/utils.py base/wifi.py base/LedmWifi.py \
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@ base/device.py base/logger.py base/slp.py base/exif.py base/strings.py base/magic.py \
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@ base/imagesize.py base/pexpect.py base/models.py base/mdns.py base/tui.py base/dime.py \
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@ base/ldif.py base/vcard.py base/module.py base/pkit.py
+
+
+# installer
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@installdir = $(hplipdir)/installer
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@dist_install_DATA = installer/__init__.py installer/dcheck.py installer/distros.dat installer/core_install.py
+
+# makecopies
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@copierdir = $(hplipdir)/copier
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@dist_copier_DATA = copier/copier.py copier/__init__.py
+
+# fax
+@FAX_BUILD_TRUE@@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@faxdir = $(hplipdir)/fax
+@FAX_BUILD_TRUE@@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@dist_fax_DATA = fax/fax.py fax/__init__.py fax/coverpages.py fax/pmlfax.py fax/ledmfax.py fax/soapfax.py fax/ledmsoapfax.py fax/marvellfax.py \
+@FAX_BUILD_TRUE@@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@ fax/faxdevice.py fax/filters/pstotiff fax/filters/pstotiff.convs fax/filters/pstotiff.types
+
+@FAX_BUILD_TRUE@@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@fax_filtersdir = $(mimedir)
+@FAX_BUILD_TRUE@@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@dist_fax_filters_DATA = fax/filters/pstotiff.convs fax/filters/pstotiff.types
+@FAX_BUILD_TRUE@@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@hpfaxdir = $(cupsbackenddir)
+@FAX_BUILD_TRUE@@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@dist_hpfax_SCRIPTS = fax/backend/hpfax.py
+@FAX_BUILD_TRUE@@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@hpijsfaxppddir = $(hpppddir)
+@FAX_BUILD_TRUE@@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@hpcupsfaxppddir = $(hpppddir)
+@FAX_BUILD_TRUE@@FULL_BUILD_TRUE@@HPIJS_INSTALL_TRUE@@HPLIP_BUILD_TRUE@dist_hpijsfaxppd_DATA = fax/ppd/HP-Fax-hpijs.ppd.gz fax/ppd/HP-Fax2-hpijs.ppd.gz fax/ppd/HP-Fax3-hpijs.ppd.gz fax/ppd/HP-Fax4-hpijs.ppd.gz
+@FAX_BUILD_TRUE@@FULL_BUILD_TRUE@@HPCUPS_INSTALL_TRUE@@HPLIP_BUILD_TRUE@dist_hpcupsfaxppd_DATA = fax/ppd/HP-Fax-hpcups.ppd.gz fax/ppd/HP-Fax2-hpcups.ppd.gz fax/ppd/HP-Fax3-hpcups.ppd.gz fax/ppd/HP-Fax4-hpcups.ppd.gz
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@ptest_SOURCES = pcard/ptest.c pcard/ptest.h pcard/fat.c pcard/fat.h
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@ptest_LDADD = libhpmud.la
+
+# data
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@modelsdir = $(hplipdir)/data/models
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@images_16x16dir = $(hplipdir)/data/images/16x16
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@images_24x24dir = $(hplipdir)/data/images/24x24
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@images_32x32dir = $(hplipdir)/data/images/32x32
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@images_64x64dir = $(hplipdir)/data/images/64x64
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@images_128x128dir = $(hplipdir)/data/images/128x128
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@images_256x256dir = $(hplipdir)/data/images/256x256
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@images_devicesdir = $(hplipdir)/data/images/devices
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@images_otherdir = $(hplipdir)/data/images/other
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@pcldir = $(hplipdir)/data/pcl
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@ldldir = $(hplipdir)/data/ldl
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@postscriptdir = $(hplipdir)/data/ps
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@localzdir = $(hplipdir)/data/localization
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@dist_postscript_DATA = data/ps/testpage.ps.gz data/ps/clean_page.pdf.gz
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@dist_models_DATA = data/models/models.dat
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@dist_hplip_Log_DATA =
+@FULL_BUILD_TRUE@@GUI_BUILD_TRUE@@HPLIP_BUILD_TRUE@dist_images_16x16_DATA = data/images/16x16/*
+@FULL_BUILD_TRUE@@GUI_BUILD_TRUE@@HPLIP_BUILD_TRUE@dist_images_24x24_DATA = data/images/24x24/*
+@FULL_BUILD_TRUE@@GUI_BUILD_TRUE@@HPLIP_BUILD_TRUE@dist_images_32x32_DATA = data/images/32x32/*
+@FULL_BUILD_TRUE@@GUI_BUILD_TRUE@@HPLIP_BUILD_TRUE@dist_images_64x64_DATA = data/images/64x64/*
+@FULL_BUILD_TRUE@@GUI_BUILD_TRUE@@HPLIP_BUILD_TRUE@dist_images_128x128_DATA = data/images/128x128/*
+@FULL_BUILD_TRUE@@GUI_BUILD_TRUE@@HPLIP_BUILD_TRUE@dist_images_256x256_DATA = data/images/256x256/*
+@FULL_BUILD_TRUE@@GUI_BUILD_TRUE@@HPLIP_BUILD_TRUE@dist_images_devices_DATA = data/images/devices/*
+@FULL_BUILD_TRUE@@GUI_BUILD_TRUE@@HPLIP_BUILD_TRUE@dist_images_other_DATA = data/images/other/*
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@dist_pcl_DATA = data/pcl/align1_8xx.pcl.gz data/pcl/align1_9xx.pcl.gz data/pcl/align2_8xx.pcl.gz data/pcl/align3_8xx.pcl.gz data/pcl/align4_8xx.pcl.gz \
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@ data/pcl/align5_8xx.pcl.gz data/pcl/align2_9xx.pcl.gz data/pcl/align3_9xx.pcl.gz data/pcl/align4_450.pcl.gz data/pcl/align6_450.pcl.gz \
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@ data/pcl/colorcal1_450.pcl.gz data/pcl/colorcal2_450.pcl.gz data/pcl/crbcal.pcl.gz data/pcl/crcaldone.pcl.gz data/pcl/crcbcal.pcl.gz data/pcl/crccal.pcl.gz \
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@ data/pcl/crcpcal.pcl.gz data/pcl/crpcal.pcl.gz
+
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@dist_ldl_DATA = data/ldl/cb2pcal.ldl.gz data/ldl/cb2pcal_done.ldl.gz data/ldl/cbbcal.ldl.gz data/ldl/cbccal.ldl.gz data/ldl/cbccal_done.ldl.gz data/ldl/cbcpcal.ldl.gz \
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@ data/ldl/cbpcal.ldl.gz
+
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@dist_localz_DATA = data/localization/hplip_de.qm data/localization/hplip_es.qm data/localization/hplip_fr.qm data/localization/hplip_it.qm \
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@ data/localization/hplip_pt.qm data/localization/hplip_ru.qm data/localization/hplip_zh.qm
+
+
+# pcard
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@pcarddir = $(hplipdir)/pcard
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@dist_pcard_DATA = pcard/__init__.py pcard/photocard.py
+
+# pcardext
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@pcardextdir = $(pyexecdir)
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@pcardext_LTLIBRARIES = pcardext.la
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@pcardext_la_LDFLAGS = -module -avoid-version
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@pcardext_la_SOURCES = pcard/pcardext/pcardext.c pcard/fat.c
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@pcardext_la_CFLAGS = -I$(PYTHONINCLUDEDIR)
+
+# prnt
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@prntdir = $(hplipdir)/prnt
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@dist_prnt_DATA = prnt/__init__.py prnt/ldl.py prnt/pcl.py prnt/colorcal.py
+
+# scan
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@@SCAN_BUILD_TRUE@scandir = $(hplipdir)/scan
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@@SCAN_BUILD_TRUE@dist_scan_DATA = scan/__init__.py scan/sane.py
+
+# scanext
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@@SCAN_BUILD_TRUE@scanextdir = $(pyexecdir)
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@@SCAN_BUILD_TRUE@scanext_LTLIBRARIES = scanext.la
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@@SCAN_BUILD_TRUE@scanext_la_LDFLAGS = -module -avoid-version -lsane
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@@SCAN_BUILD_TRUE@scanext_la_SOURCES = scan/scanext/scanext.c
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@@SCAN_BUILD_TRUE@scanext_la_CFLAGS = -I$(PYTHONINCLUDEDIR)
+
+# hpmudext
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@hpmudextdir = $(pyexecdir)
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@hpmudext_LTLIBRARIES = hpmudext.la
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@hpmudext_la_LDFLAGS = -module -avoid-version
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@hpmudext_la_SOURCES = io/mudext/hpmudext.c
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@hpmudext_la_LIBADD = libhpmud.la
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@hpmudext_la_CFLAGS = -I$(PYTHONINCLUDEDIR)
+# ui (qt3)
+@FULL_BUILD_TRUE@@GUI_BUILD_TRUE@@HPLIP_BUILD_TRUE@@QT3_INSTALL_TRUE@uidir = $(hplipdir)/ui
+@FULL_BUILD_TRUE@@GUI_BUILD_TRUE@@HPLIP_BUILD_TRUE@@QT3_INSTALL_TRUE@dist_ui_DATA = ui/alignform.py \
+@FULL_BUILD_TRUE@@GUI_BUILD_TRUE@@HPLIP_BUILD_TRUE@@QT3_INSTALL_TRUE@ ui/colorcalform_base.py ui/colorcalform.py ui/coloradjform_base.py ui/coloradjform.py ui/devmgr4_base.py ui/devmgr4.py \
+@FULL_BUILD_TRUE@@GUI_BUILD_TRUE@@HPLIP_BUILD_TRUE@@QT3_INSTALL_TRUE@ ui/__init__.py ui/loadpaperform_base.py ui/loadpaperform.py \
+@FULL_BUILD_TRUE@@GUI_BUILD_TRUE@@HPLIP_BUILD_TRUE@@QT3_INSTALL_TRUE@ ui/paperedgealignform_base.py ui/paperedgealignform.py ui/ui_utils.py \
+@FULL_BUILD_TRUE@@GUI_BUILD_TRUE@@HPLIP_BUILD_TRUE@@QT3_INSTALL_TRUE@ ui/settingsdialog_base.py ui/settingsdialog.py ui/aligntype6form1.py ui/aligntype6form1_base.py ui/aligntype6form2_base.py \
+@FULL_BUILD_TRUE@@GUI_BUILD_TRUE@@HPLIP_BUILD_TRUE@@QT3_INSTALL_TRUE@ ui/aligntype6form2.py ui/nodevicesform_base.py ui/nodevicesform.py ui/unloadform.py \
+@FULL_BUILD_TRUE@@GUI_BUILD_TRUE@@HPLIP_BUILD_TRUE@@QT3_INSTALL_TRUE@ ui/imagepropertiesdlg_base.py ui/imagepropertiesdlg.py ui/choosedevicedlg.py ui/chooseprinterdlg.py \
+@FULL_BUILD_TRUE@@GUI_BUILD_TRUE@@HPLIP_BUILD_TRUE@@QT3_INSTALL_TRUE@ ui/aboutdlg.py ui/aboutdlg_base.py ui/waitform.py ui/waitform_base.py ui/cleaningform_base.py ui/cleaningform.py \
+@FULL_BUILD_TRUE@@GUI_BUILD_TRUE@@HPLIP_BUILD_TRUE@@QT3_INSTALL_TRUE@ ui/cleaningform2_base.py ui/cleaningform2.py ui/colorcalform2_base.py ui/colorcalform2.py ui/colorcal4form.py \
+@FULL_BUILD_TRUE@@GUI_BUILD_TRUE@@HPLIP_BUILD_TRUE@@QT3_INSTALL_TRUE@ ui/colorcal4form_base.py ui/colorcal4form_base.ui ui/printerform.py \
+@FULL_BUILD_TRUE@@GUI_BUILD_TRUE@@HPLIP_BUILD_TRUE@@QT3_INSTALL_TRUE@ ui/faxaddrbookgroupsform_base.py ui/faxaddrbookgroupeditform_base.py ui/faxaddrbookform_base.py \
+@FULL_BUILD_TRUE@@GUI_BUILD_TRUE@@HPLIP_BUILD_TRUE@@QT3_INSTALL_TRUE@ ui/faxaddrbookform.py ui/faxaddrbookeditform_base.py ui/align10form.py ui/align10form_base.py \
+@FULL_BUILD_TRUE@@GUI_BUILD_TRUE@@HPLIP_BUILD_TRUE@@QT3_INSTALL_TRUE@ ui/faxsendjobform.py ui/faxsettingsform_base.py ui/faxsettingsform.py \
+@FULL_BUILD_TRUE@@GUI_BUILD_TRUE@@HPLIP_BUILD_TRUE@@QT3_INSTALL_TRUE@ ui/coverpageform_base.py ui/coverpageform.py ui/allowabletypesdlg_base.py ui/allowabletypesdlg.py \
+@FULL_BUILD_TRUE@@GUI_BUILD_TRUE@@HPLIP_BUILD_TRUE@@QT3_INSTALL_TRUE@ ui/makecopiesform.py ui/setupform_base.py ui/setupform.py ui/setupmanualfind_base.py \
+@FULL_BUILD_TRUE@@GUI_BUILD_TRUE@@HPLIP_BUILD_TRUE@@QT3_INSTALL_TRUE@ ui/setupmanualfind.py ui/setupsettings_base.py ui/setupsettings.py ui/scrollview.py \
+@FULL_BUILD_TRUE@@GUI_BUILD_TRUE@@HPLIP_BUILD_TRUE@@QT3_INSTALL_TRUE@ ui/scrollprintsettings.py ui/scrollprint.py ui/scrollfax.py \
+@FULL_BUILD_TRUE@@GUI_BUILD_TRUE@@HPLIP_BUILD_TRUE@@QT3_INSTALL_TRUE@ ui/scrollunload.py ui/scrollcopy.py ui/pluginform2.py ui/pluginform2_base.py ui/systemtray.py \
+@FULL_BUILD_TRUE@@GUI_BUILD_TRUE@@HPLIP_BUILD_TRUE@@QT3_INSTALL_TRUE@ ui/ui_utils.py ui/jobstoragemixin.py ui/pluginlicenseform_base.py ui/pluginlicenseform.py \
+@FULL_BUILD_TRUE@@GUI_BUILD_TRUE@@HPLIP_BUILD_TRUE@@QT3_INSTALL_TRUE@ ui/align13form_base.py ui/align13form.py ui/firmwaredialog_base.py ui/firmwaredialog.py \
+@FULL_BUILD_TRUE@@GUI_BUILD_TRUE@@HPLIP_BUILD_TRUE@@QT3_INSTALL_TRUE@ ui/deviceuricombobox.py ui/upgradeform.py ui/upgradeform_base.py
+
+
+#ui4 (qt4)
+@FULL_BUILD_TRUE@@GUI_BUILD_TRUE@@HPLIP_BUILD_TRUE@@QT4_INSTALL_TRUE@ui4dir = $(hplipdir)/ui4
+#dist_ui4_SCRIPTS = ui4/devmgr5.py ui4/systemtray.py ui4/devmgr5_base.py ui4/__init__.py ui4/ui_utils.py \
+# ui4/settingsdialog_base.py ui4/settingsdialog.py ui4/printsettingstoolbox.py ui4/printdialog_base.py \
+# ui4/printdialog.py
+#dist_noinst_DATA += ui4/devmgr5_base.ui ui4/settingsdialog_base.ui ui4/printdialog_base.ui
+@FULL_BUILD_TRUE@@GUI_BUILD_TRUE@@HPLIP_BUILD_TRUE@@QT4_INSTALL_TRUE@dist_ui4_DATA = ui4/*.py
+
+# ui plugins (qt3)
+@FULL_BUILD_TRUE@@GUI_BUILD_TRUE@@HPLIP_BUILD_TRUE@@QT3_INSTALL_TRUE@pluginsdir = $(hplipdir)/plugins
+@FULL_BUILD_TRUE@@GUI_BUILD_TRUE@@HPLIP_BUILD_TRUE@@QT3_INSTALL_TRUE@dist_plugins_DATA = plugins/dj450.py plugins/__init__.py plugins/powersettings.py plugins/powersettingsdialog.py \
+@FULL_BUILD_TRUE@@GUI_BUILD_TRUE@@HPLIP_BUILD_TRUE@@QT3_INSTALL_TRUE@ plugins/powersettingsdialog_base.py plugins/Deskjet_460.py plugins/Officejet_H470.py plugins/powersettings2.py
+
+
+# ui plugins (qt4)
+@FULL_BUILD_TRUE@@GUI_BUILD_TRUE@@HPLIP_BUILD_TRUE@@QT4_INSTALL_TRUE@plugins4dir = $(hplipdir)/ui4/plugins
+@FULL_BUILD_TRUE@@GUI_BUILD_TRUE@@HPLIP_BUILD_TRUE@@QT4_INSTALL_TRUE@dist_plugins4_SCRIPTS =
+
+# PolicyKit
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@@POLICYKIT_INSTALL_TRUE@policykit_dbus_etcdir = /etc/dbus-1/system.d
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@@POLICYKIT_INSTALL_TRUE@dist_policykit_dbus_etc_DATA = data/policykit/com.hp.hplip.conf
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@@POLICYKIT_INSTALL_TRUE@policykit_dbus_sharedir = /usr/share/dbus-1/system-services
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@@POLICYKIT_INSTALL_TRUE@dist_policykit_dbus_share_DATA = data/policykit/com.hp.hplip.service
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@@POLICYKIT_INSTALL_TRUE@policykit_policydir = $(policykit_dir)
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@@POLICYKIT_INSTALL_TRUE@dist_policykit_policy_DATA = data/policykit/com.hp.hplip.policy
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@hppgsz_SOURCES = prnt/hpijs/PrinterProperties.cpp prnt/hpijs/PrinterProperties.h prnt/hpijs/bug.h
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@hppgsz_CXXFLAGS = $(libapdk_la_CXXFLAGS)
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@hppgsz_CFLAGS = $(libapdk_la_CFLAGS)
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@hppgsz_LDADD = libapdk.la -ljpeg -ldl
+
+# hplip.desktop
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@hplip_desktopdir = $(icondir)
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@hplip_desktop_DATA = hplip.desktop
+
+# hplip-systray.desktop
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@hplip_systraydir = $(systraydir)
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@hplip_systray_DATA = hplip-systray.desktop
+
+# hpipjs (CUPS filter)
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@hplipjsdir = $(cupsfilterdir)
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@hplipjs_SOURCES = prnt/filters/hplipjs.c
+
+# hpps (CUPS filter)
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@hppsdir = $(cupsfilterdir)
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@hpps_SOURCES = prnt/hpps/hppsfilter.c
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@hpps_LDADD = -lcups
+
+# hpcac (CUPS filter, Color Access Control, ie: CLJ 4700)
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@cacdir = $(cupsfilterdir)
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@dist_cac_SCRIPTS = prnt/filters/hpcac
+
+# foomatic-rip-hplip
+@RIP_INSTALL_TRUE@ripdir = $(cupsfilterdir)
+@RIP_INSTALL_TRUE@dist_rip_SCRIPTS = prnt/hpijs/foomatic-rip-hplip
+
+# apdk
+noinst_LTLIBRARIES = libapdk.la
+libapdk_la_SOURCES = prnt/hpijs/models.cpp prnt/hpijs/breaks_open.cpp \
+ prnt/hpijs/dj9xxvip.cpp prnt/hpijs/dj9xx.cpp prnt/hpijs/capture.cpp prnt/hpijs/colormatch.cpp prnt/hpijs/colormatcher_open.cpp \
+ prnt/hpijs/compression.cpp prnt/hpijs/context2.cpp prnt/hpijs/create_so.cpp prnt/hpijs/creator.cpp \
+ prnt/hpijs/dj600.cpp prnt/hpijs/dj630.cpp prnt/hpijs/dj660.cpp prnt/hpijs/dj690.cpp prnt/hpijs/dj6xx.cpp prnt/hpijs/dj8xx.cpp prnt/hpijs/dj600_maps.cpp \
+ prnt/hpijs/dj660_maps.cpp prnt/hpijs/dj690_maps.cpp prnt/hpijs/dj895_maps.cpp prnt/hpijs/dj895_maps2.cpp prnt/hpijs/dj970_maps.cpp \
+ prnt/hpijs/dj970_maps2.cpp prnt/hpijs/dj970_maps3.cpp prnt/hpijs/filterhpa.cpp prnt/hpijs/apollo21xx.cpp prnt/hpijs/apollo2560.cpp prnt/hpijs/apollo2xxx.cpp \
+ prnt/hpijs/dj8x5.cpp prnt/hpijs/psp100.cpp prnt/hpijs/phobos_cmaps.cpp prnt/hpijs/dj350.cpp prnt/hpijs/halftoner.cpp prnt/hpijs/halftoner_open.cpp \
+ prnt/hpijs/globals.cpp prnt/hpijs/header2.cpp prnt/hpijs/htmtxhi.cpp prnt/hpijs/pmselect.cpp \
+ prnt/hpijs/job.cpp prnt/hpijs/printer.cpp prnt/hpijs/registry.cpp prnt/hpijs/scaler.cpp \
+ prnt/hpijs/scaler_open.cpp prnt/hpijs/script.cpp prnt/hpijs/systemservices.cpp \
+ prnt/hpijs/translator.cpp prnt/hpijs/version.cpp prnt/hpijs/versioncode.cpp \
+ prnt/hpijs/djgenericvip.cpp prnt/hpijs/dj540.cpp prnt/hpijs/dj850.cpp prnt/hpijs/dj850_maps.cpp prnt/hpijs/dj890.cpp \
+ prnt/hpijs/apollo21xx.h prnt/hpijs/apollo2560.h prnt/hpijs/apollo2xxx.h prnt/hpijs/colormatch.h prnt/hpijs/colormatcher_open.h \
+ prnt/hpijs/compression.h prnt/hpijs/config.h prnt/hpijs/context.h prnt/hpijs/dj350.h prnt/hpijs/dj400.h prnt/hpijs/dj540.h \
+ prnt/hpijs/dj600.h prnt/hpijs/dj630.h prnt/hpijs/dj660.h prnt/hpijs/dj690.h prnt/hpijs/dj6xx.h prnt/hpijs/dj8x5.h prnt/hpijs/dj8xx.h \
+ prnt/hpijs/dj850.h prnt/hpijs/dj890.h prnt/hpijs/dj9xx.h prnt/hpijs/dj9xxvip.h \
+ prnt/hpijs/ernieplatform.h prnt/hpijs/filterhpa.h prnt/hpijs/global_types.h prnt/hpijs/halftoner.h prnt/hpijs/font.h prnt/hpijs/debug.h \
+ prnt/hpijs/halftoner_open.h prnt/hpijs/header.h prnt/hpijs/hpprint_c_api.h \
+ prnt/hpijs/hpprintapi.h prnt/hpijs/hptypes.h prnt/hpijs/htfed.h prnt/hpijs/internal.h \
+ prnt/hpijs/interp.h prnt/hpijs/interp_data_50.h prnt/hpijs/io_defs.h prnt/hpijs/job.h prnt/hpijs/models.h prnt/hpijs/modes.h prnt/hpijs/pmselect.h \
+ prnt/hpijs/printer.h prnt/hpijs/psp100.h prnt/hpijs/psp470.h prnt/hpijs/resources.h prnt/hpijs/scaler_open.h prnt/hpijs/scaler_prop.h prnt/hpijs/script.h \
+ prnt/hpijs/systemservices.h prnt/hpijs/unistd_.h prnt/hpijs/djgenericvip.h prnt/hpijs/ljmono.h prnt/hpijs/ljmono.cpp \
+ prnt/hpijs/dj3320.cpp prnt/hpijs/dj3320.h prnt/hpijs/dj3320_cmap.cpp prnt/hpijs/dj3600.cpp prnt/hpijs/dj3600.h prnt/hpijs/dj3600_cmap.cpp prnt/hpijs/dj4100.h prnt/hpijs/djd2600.h \
+ prnt/hpijs/dj4100_cmap.cpp prnt/hpijs/ldlencap.h prnt/hpijs/ljcolor.cpp prnt/hpijs/ljcolor.h prnt/hpijs/pscript.h \
+ prnt/hpijs/printerproxy.cpp prnt/hpijs/printerfactory.cpp prnt/hpijs/printerproxy.h prnt/hpijs/printerfactory.h \
+ prnt/hpijs/ljjetready.cpp prnt/hpijs/ljjetready.h prnt/hpijs/jdatadbf.c prnt/hpijs/jccolor.c prnt/hpijs/ljfastraster.cpp prnt/hpijs/ljfastraster.h \
+ prnt/hpijs/jinclude.h prnt/hpijs/jpegint.h prnt/hpijs/dj55xx.h prnt/hpijs/hpijsfax.h prnt/hpijs/ojprokx50.h \
+ prnt/hpijs/ljzjs.cpp prnt/hpijs/ljzjs.h prnt/hpijs/ljzjsmono.cpp prnt/hpijs/ljm1005.cpp prnt/hpijs/ljm1005.h \
+ prnt/hpijs/ljzjsmono.h prnt/hpijs/hpjbig_wrapper.h prnt/hpijs/quickconnect.cpp prnt/hpijs/quickconnect.h prnt/hpijs/ljp1xxx.h prnt/hpijs/ljzjscolor.cpp prnt/hpijs/ljzjscolor.h
+
+libapdk_la_CXXFLAGS = -DAPDK_DJ660 -DAPDK_DJ6xx -DAPDK_DJ6xxPhoto -DAPDK_DJ8xx -DAPDK_DJ9xx -DAPDK_DJ9xxVIP -DAPDK_DJ630 \
+ -DAPDK_APOLLO2XXX -DAPDK_APOLLO21XX -DAPDK_APOLLO2560 -DAPDK_DJ600 -DAPDK_DJ350 -DAPDK_DJ8x5 -DAPDK_PSP100 -DAPDK_AUTODUPLEX \
+ -DAPDK_HIGH_RES_MODES -DAPDK_LJMONO -DAPDK_DJ540 -DAPDK_DJ850 -DAPDK_DJ890 -DAPDK_DJ3320 -DAPDK_LJCOLOR -DAPDK_DJGENERICVIP \
+ -DAPDK_LJJETREADY -DAPDK_LJFASTRASTER -DAPDK_BUFFER_SEND -DAPDK_LDL_COMPRESS -DAPDK_EXTENDED_MEDIASIZE \
+ -DAPDK_MLC_PRINTER -DAPDK_DJ3600 -DAPDK_LJZJS_MONO -DAPDK_LJZJS_COLOR -DAPDK_LJM1005 -DAPDK_QUICKCONNECT \
+ $(APDK_ENDIAN_FLAG) $(APDK_AUTO_INCLUDE_FLAG) -DAPDK_LINUX -DNDEBUG $(DBUS_CFLAGS)
+
+libapdk_la_CFLAGS = $(libapdk_la_CXXFLAGS) -Iprnt/hpijs
+@HPIJS_INSTALL_TRUE@hpijs_SOURCES = prnt/hpijs/hpijs.cpp prnt/hpijs/ijs_server.c prnt/hpijs/ijs.c prnt/hpijs/hpijsfax.cpp prnt/hpijs/services.cpp prnt/hpijs/bug.h \
+@HPIJS_INSTALL_TRUE@ prnt/hpijs/hpijs.h prnt/hpijs/ijs.h prnt/hpijs/ijs_server.h prnt/hpijs/services.h prnt/hpijs/ijs_client.h prnt/hpijs/hpiom.c prnt/hpijs/hpiom.h
+
+@HPIJS_INSTALL_TRUE@hpijs_CXXFLAGS = $(libapdk_la_CXXFLAGS)
+@HPIJS_INSTALL_TRUE@hpijs_CFLAGS = $(libapdk_la_CFLAGS)
+@HPIJS_INSTALL_TRUE@@HPLIP_BUILD_FALSE@hpijs_LDADD = libapdk.la -ljpeg -ldl
+@HPIJS_INSTALL_TRUE@@HPLIP_BUILD_TRUE@hpijs_LDADD = libapdk.la -ljpeg -ldl libhpip.la libhpmud.la $(DBUS_LIBS)
+
+# hpcups
+#if NEW_HPCUPS
+@HPCUPS_INSTALL_TRUE@hpcupsdir = $(cupsfilterdir)
+@HPCUPS_INSTALL_TRUE@hpcups_SOURCES = prnt/hpcups/HPCupsFilter.cpp prnt/hpcups/HPCupsFilter.h prnt/hpcups/dbuscomm.cpp prnt/hpcups/dbuscomm.h prnt/hpcups/Compressor.cpp prnt/hpcups/Compressor.h \
+@HPCUPS_INSTALL_TRUE@ prnt/hpcups/Mode2.cpp prnt/hpcups/Mode2.h prnt/hpcups/Mode3.cpp prnt/hpcups/Mode3.h \
+@HPCUPS_INSTALL_TRUE@ prnt/hpcups/Mode9.cpp prnt/hpcups/Mode9.h prnt/hpcups/Mode10.cpp prnt/hpcups/Mode10.h \
+@HPCUPS_INSTALL_TRUE@ prnt/hpcups/ModeDeltaPlus.cpp prnt/hpcups/ModeDeltaPlus.h prnt/hpcups/ModeJbig.cpp prnt/hpcups/ModeJbig.h \
+@HPCUPS_INSTALL_TRUE@ prnt/hpcups/ErnieFilter.cpp prnt/hpcups/ErnieFilter.h prnt/hpcups/EncapsulatorFactory.cpp prnt/hpcups/EncapsulatorFactory.h \
+@HPCUPS_INSTALL_TRUE@ prnt/hpcups/Encapsulator.cpp prnt/hpcups/Encapsulator.h prnt/hpcups/Pcl3.cpp prnt/hpcups/Pcl3.h \
+@HPCUPS_INSTALL_TRUE@ prnt/hpcups/Pcl3Gui.cpp prnt/hpcups/Pcl3Gui.h prnt/hpcups/Pcl3Gui2.cpp prnt/hpcups/Pcl3Gui2.h \
+@HPCUPS_INSTALL_TRUE@ prnt/hpcups/LJMono.cpp prnt/hpcups/LJMono.h prnt/hpcups/LJColor.cpp prnt/hpcups/LJColor.h \
+@HPCUPS_INSTALL_TRUE@ prnt/hpcups/LJFastRaster.cpp prnt/hpcups/LJFastRaster.h prnt/hpcups/LJJetReady.cpp prnt/hpcups/LJJetReady.h \
+@HPCUPS_INSTALL_TRUE@prnt/hpcups/LJZjStream.cpp prnt/hpcups/LJZjStream.h \
+@HPCUPS_INSTALL_TRUE@ prnt/hpcups/LJZxStream.cpp prnt/hpcups/LJZxStream.h prnt/hpcups/Job.cpp prnt/hpcups/Job.h \
+@HPCUPS_INSTALL_TRUE@ prnt/hpcups/Pipeline.cpp prnt/hpcups/Pipeline.h prnt/hpcups/Processor.cpp prnt/hpcups/Processor.h \
+@HPCUPS_INSTALL_TRUE@ prnt/hpcups/RasterSender.cpp prnt/hpcups/RasterSender.h prnt/hpcups/ColorMatcher.cpp prnt/hpcups/ColorMatcher.h \
+@HPCUPS_INSTALL_TRUE@ prnt/hpcups/Halftoner.cpp prnt/hpcups/Halftoner.h prnt/hpcups/Scaler.cpp prnt/hpcups/Scaler.h prnt/hpcups/resources.h \
+@HPCUPS_INSTALL_TRUE@ prnt/hpcups/dj400ColorMaps.cpp prnt/hpcups/dj600ColorMaps.cpp prnt/hpcups/dj970ColorMaps.cpp prnt/hpcups/dj8xxColorMaps.cpp \
+@HPCUPS_INSTALL_TRUE@ prnt/hpcups/dj4100ColorMaps.cpp \
+@HPCUPS_INSTALL_TRUE@ prnt/hpcups/BreakTables.cpp prnt/hpcups/PrinterCommands.h prnt/hpcups/Utils.cpp prnt/hpcups/Utils.h \
+@HPCUPS_INSTALL_TRUE@ prnt/hpcups/SystemServices.cpp prnt/hpcups/SystemServices.h prnt/hpcups/CommonDefinitions.h prnt/hpcups/hpjbig_wrapper.h \
+@HPCUPS_INSTALL_TRUE@ prnt/hpcups/apPrintModes.h prnt/hpcups/dj400PrintModes.h prnt/hpcups/dj540PrintModes.h prnt/hpcups/dj600PrintModes.h \
+@HPCUPS_INSTALL_TRUE@ prnt/hpcups/dj630PrintModes.h prnt/hpcups/dj690PrintModes.h prnt/hpcups/dj850PrintModes.h prnt/hpcups/dj890PrintModes.h \
+@HPCUPS_INSTALL_TRUE@ prnt/hpcups/dj895PrintModes.h prnt/hpcups/dj8x5PrintModes.h prnt/hpcups/dj970PrintModes.h prnt/hpcups/Pcl3GuiPrintModes.h \
+@HPCUPS_INSTALL_TRUE@ prnt/hpcups/Pcl3PrintModes.h prnt/hpcups/ColorMaps.h \
+@HPCUPS_INSTALL_TRUE@ prnt/hpcups/QuickConnect.cpp prnt/hpcups/QuickConnect.h \
+@HPCUPS_INSTALL_TRUE@ prnt/hpcups/ModeJpeg.cpp prnt/hpcups/ModeJpeg.h \
+@HPCUPS_INSTALL_TRUE@ prnt/hpcups/jccolor.c prnt/hpcups/jinclude.h \
+@HPCUPS_INSTALL_TRUE@ prnt/hpcups/jdatadbf.c prnt/hpcups/jinclude.h \
+@HPCUPS_INSTALL_TRUE@ prnt/hpcups/Lidil.cpp prnt/hpcups/Lidil.h \
+@HPCUPS_INSTALL_TRUE@ prnt/hpcups/LidilCompress.cpp prnt/hpcups/LidilCompress.h \
+@HPCUPS_INSTALL_TRUE@ prnt/hpcups/LidilPrintModes.h prnt/hpcups/dj3320ColorMaps.cpp \
+@HPCUPS_INSTALL_TRUE@ prnt/hpcups/dj3600ColorMaps.cpp prnt/hpcups/dj3320PrintModes.h \
+@HPCUPS_INSTALL_TRUE@ prnt/hpcups/dj4100PrintModes.h
+
+@HPCUPS_INSTALL_TRUE@hpcups_CXXFLAGS = $(APDK_ENDIAN_FLAG) $(DBUS_CFLAGS)
+@HPCUPS_INSTALL_TRUE@hpcups_LDADD = -ljpeg -ldl -lcups -lcupsimage $(DBUS_LIBS)
+#else
+#hpcupsdir = $(cupsfilterdir)
+#hpcups_PROGRAMS = hpcups
+#hpcups_SOURCES = prnt/hpijs/hpcups.cpp prnt/hpijs/hpcups.h prnt/hpijs/services.cpp prnt/hpijs/services.h prnt/hpijs/hpiom.c prnt/hpijs/hpiom.h prnt/hpijs/bug.h prnt/hpijs/hpimage.cpp prnt/hpijs/hpimage.h
+#hpcups_CXXFLAGS = $(libapdk_la_CXXFLAGS)
+#hpcups_CFLAGS = $(libapdk_la_CFLAGS)
+#if HPCUPS_ONLY_BUILD
+#hpcups_LDADD = libapdk.la -ljpeg -ldl -lcups -lcupsimage
+#else
+#hpcups_LDADD = libapdk.la -ljpeg -ldl libhpip.la libhpmud.la $(DBUS_LIBS) -lcups -lcupsimage
+#endif #HPCUPS_ONLY_BUILD
+#endif # NEW_HPCUPS
+# hpcupsfax
+@FAX_BUILD_TRUE@@HPCUPS_INSTALL_TRUE@@HPCUPS_ONLY_BUILD_FALSE@hpcupsfaxdir = $(cupsfilterdir)
+@FAX_BUILD_TRUE@@HPCUPS_INSTALL_TRUE@@HPCUPS_ONLY_BUILD_FALSE@hpcupsfax_SOURCES = prnt/hpijs/hpcupsfax.cpp prnt/hpijs/hpcupsfax.h
+@FAX_BUILD_TRUE@@HPCUPS_INSTALL_TRUE@@HPCUPS_ONLY_BUILD_FALSE@hpcupsfax_LDADD = libhpip.la -lcups -lcupsimage
+
+# PPDs
+ppddir = $(hpppddir)
+dist_ppd_DATA = $(foomatic_ps_printers) $(am__append_9) \
+ $(am__append_10)
+@FOOMATIC_DRV_INSTALL_TRUE@cupsdrvdir = $(drvdir)
+@FOOMATIC_DRV_INSTALL_TRUE@cupsdrv_DATA = $(foomatic_drv)
+@CUPS_DRV_INSTALL_TRUE@cupsdrv2dir = $(drvdir)
+@CUPS_DRV_INSTALL_TRUE@cupsdrv2_DATA = $(cups_drv)
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .cpp .lo .o .obj
+am--refresh:
+ @:
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/foomatic_drv.inc $(srcdir)/unreleased.inc $(srcdir)/cups_drv.inc $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \
+ $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ echo ' $(SHELL) ./config.status'; \
+ $(SHELL) ./config.status;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ $(SHELL) ./config.status --recheck
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ $(am__cd) $(srcdir) && $(AUTOCONF)
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
+$(am__aclocal_m4_deps):
+hplip.conf: $(top_builddir)/config.status $(srcdir)/hplip.conf.in
+ cd $(top_builddir) && $(SHELL) ./config.status $@
+hplip.desktop: $(top_builddir)/config.status $(srcdir)/hplip.desktop.in
+ cd $(top_builddir) && $(SHELL) ./config.status $@
+hplip-systray.desktop: $(top_builddir)/config.status $(srcdir)/hplip-systray.desktop.in
+ cd $(top_builddir) && $(SHELL) ./config.status $@
+prnt/drv/hpijs.drv: $(top_builddir)/config.status $(top_srcdir)/prnt/drv/hpijs.drv.in
+ cd $(top_builddir) && $(SHELL) ./config.status $@
+prnt/drv/hpcups.drv: $(top_builddir)/config.status $(top_srcdir)/prnt/drv/hpcups.drv.in
+ cd $(top_builddir) && $(SHELL) ./config.status $@
+hplip.list: $(top_builddir)/config.status $(srcdir)/hplip.list.in
+ cd $(top_builddir) && $(SHELL) ./config.status $@
+data/policykit/com.hp.hplip.service: $(top_builddir)/config.status $(top_srcdir)/data/policykit/com.hp.hplip.service.in
+ cd $(top_builddir) && $(SHELL) ./config.status $@
+install-hpmudextLTLIBRARIES: $(hpmudext_LTLIBRARIES)
+ @$(NORMAL_INSTALL)
+ test -z "$(hpmudextdir)" || $(MKDIR_P) "$(DESTDIR)$(hpmudextdir)"
+ @list='$(hpmudext_LTLIBRARIES)'; test -n "$(hpmudextdir)" || list=; \
+ list2=; for p in $$list; do \
+ if test -f $$p; then \
+ list2="$$list2 $$p"; \
+ else :; fi; \
+ done; \
+ test -z "$$list2" || { \
+ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(hpmudextdir)'"; \
+ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(hpmudextdir)"; \
+ }
+
+uninstall-hpmudextLTLIBRARIES:
+ @$(NORMAL_UNINSTALL)
+ @list='$(hpmudext_LTLIBRARIES)'; test -n "$(hpmudextdir)" || list=; \
+ for p in $$list; do \
+ $(am__strip_dir) \
+ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(hpmudextdir)/$$f'"; \
+ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(hpmudextdir)/$$f"; \
+ done
+
+clean-hpmudextLTLIBRARIES:
+ -test -z "$(hpmudext_LTLIBRARIES)" || rm -f $(hpmudext_LTLIBRARIES)
+ @list='$(hpmudext_LTLIBRARIES)'; for p in $$list; do \
+ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+ test "$$dir" != "$$p" || dir=.; \
+ echo "rm -f \"$${dir}/so_locations\""; \
+ rm -f "$${dir}/so_locations"; \
+ done
+install-libLTLIBRARIES: $(lib_LTLIBRARIES)
+ @$(NORMAL_INSTALL)
+ test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)"
+ @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
+ list2=; for p in $$list; do \
+ if test -f $$p; then \
+ list2="$$list2 $$p"; \
+ else :; fi; \
+ done; \
+ test -z "$$list2" || { \
+ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \
+ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
+ }
+
+uninstall-libLTLIBRARIES:
+ @$(NORMAL_UNINSTALL)
+ @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
+ for p in $$list; do \
+ $(am__strip_dir) \
+ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \
+ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \
+ done
+
+clean-libLTLIBRARIES:
+ -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
+ @list='$(lib_LTLIBRARIES)'; for p in $$list; do \
+ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+ test "$$dir" != "$$p" || dir=.; \
+ echo "rm -f \"$${dir}/so_locations\""; \
+ rm -f "$${dir}/so_locations"; \
+ done
+install-libsane_hpaioLTLIBRARIES: $(libsane_hpaio_LTLIBRARIES)
+ @$(NORMAL_INSTALL)
+ test -z "$(libsane_hpaiodir)" || $(MKDIR_P) "$(DESTDIR)$(libsane_hpaiodir)"
+ @list='$(libsane_hpaio_LTLIBRARIES)'; test -n "$(libsane_hpaiodir)" || list=; \
+ list2=; for p in $$list; do \
+ if test -f $$p; then \
+ list2="$$list2 $$p"; \
+ else :; fi; \
+ done; \
+ test -z "$$list2" || { \
+ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libsane_hpaiodir)'"; \
+ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libsane_hpaiodir)"; \
+ }
+
+uninstall-libsane_hpaioLTLIBRARIES:
+ @$(NORMAL_UNINSTALL)
+ @list='$(libsane_hpaio_LTLIBRARIES)'; test -n "$(libsane_hpaiodir)" || list=; \
+ for p in $$list; do \
+ $(am__strip_dir) \
+ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libsane_hpaiodir)/$$f'"; \
+ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libsane_hpaiodir)/$$f"; \
+ done
+
+clean-libsane_hpaioLTLIBRARIES:
+ -test -z "$(libsane_hpaio_LTLIBRARIES)" || rm -f $(libsane_hpaio_LTLIBRARIES)
+ @list='$(libsane_hpaio_LTLIBRARIES)'; for p in $$list; do \
+ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+ test "$$dir" != "$$p" || dir=.; \
+ echo "rm -f \"$${dir}/so_locations\""; \
+ rm -f "$${dir}/so_locations"; \
+ done
+
+clean-noinstLTLIBRARIES:
+ -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
+ @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
+ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+ test "$$dir" != "$$p" || dir=.; \
+ echo "rm -f \"$${dir}/so_locations\""; \
+ rm -f "$${dir}/so_locations"; \
+ done
+install-pcardextLTLIBRARIES: $(pcardext_LTLIBRARIES)
+ @$(NORMAL_INSTALL)
+ test -z "$(pcardextdir)" || $(MKDIR_P) "$(DESTDIR)$(pcardextdir)"
+ @list='$(pcardext_LTLIBRARIES)'; test -n "$(pcardextdir)" || list=; \
+ list2=; for p in $$list; do \
+ if test -f $$p; then \
+ list2="$$list2 $$p"; \
+ else :; fi; \
+ done; \
+ test -z "$$list2" || { \
+ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(pcardextdir)'"; \
+ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(pcardextdir)"; \
+ }
+
+uninstall-pcardextLTLIBRARIES:
+ @$(NORMAL_UNINSTALL)
+ @list='$(pcardext_LTLIBRARIES)'; test -n "$(pcardextdir)" || list=; \
+ for p in $$list; do \
+ $(am__strip_dir) \
+ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(pcardextdir)/$$f'"; \
+ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(pcardextdir)/$$f"; \
+ done
+
+clean-pcardextLTLIBRARIES:
+ -test -z "$(pcardext_LTLIBRARIES)" || rm -f $(pcardext_LTLIBRARIES)
+ @list='$(pcardext_LTLIBRARIES)'; for p in $$list; do \
+ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+ test "$$dir" != "$$p" || dir=.; \
+ echo "rm -f \"$${dir}/so_locations\""; \
+ rm -f "$${dir}/so_locations"; \
+ done
+install-scanextLTLIBRARIES: $(scanext_LTLIBRARIES)
+ @$(NORMAL_INSTALL)
+ test -z "$(scanextdir)" || $(MKDIR_P) "$(DESTDIR)$(scanextdir)"
+ @list='$(scanext_LTLIBRARIES)'; test -n "$(scanextdir)" || list=; \
+ list2=; for p in $$list; do \
+ if test -f $$p; then \
+ list2="$$list2 $$p"; \
+ else :; fi; \
+ done; \
+ test -z "$$list2" || { \
+ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(scanextdir)'"; \
+ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(scanextdir)"; \
+ }
+
+uninstall-scanextLTLIBRARIES:
+ @$(NORMAL_UNINSTALL)
+ @list='$(scanext_LTLIBRARIES)'; test -n "$(scanextdir)" || list=; \
+ for p in $$list; do \
+ $(am__strip_dir) \
+ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(scanextdir)/$$f'"; \
+ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(scanextdir)/$$f"; \
+ done
+
+clean-scanextLTLIBRARIES:
+ -test -z "$(scanext_LTLIBRARIES)" || rm -f $(scanext_LTLIBRARIES)
+ @list='$(scanext_LTLIBRARIES)'; for p in $$list; do \
+ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+ test "$$dir" != "$$p" || dir=.; \
+ echo "rm -f \"$${dir}/so_locations\""; \
+ rm -f "$${dir}/so_locations"; \
+ done
+hpmudext.la: $(hpmudext_la_OBJECTS) $(hpmudext_la_DEPENDENCIES)
+ $(hpmudext_la_LINK) $(am_hpmudext_la_rpath) $(hpmudext_la_OBJECTS) $(hpmudext_la_LIBADD) $(LIBS)
+libapdk.la: $(libapdk_la_OBJECTS) $(libapdk_la_DEPENDENCIES)
+ $(libapdk_la_LINK) $(libapdk_la_OBJECTS) $(libapdk_la_LIBADD) $(LIBS)
+libhpip.la: $(libhpip_la_OBJECTS) $(libhpip_la_DEPENDENCIES)
+ $(libhpip_la_LINK) $(am_libhpip_la_rpath) $(libhpip_la_OBJECTS) $(libhpip_la_LIBADD) $(LIBS)
+libhpmud.la: $(libhpmud_la_OBJECTS) $(libhpmud_la_DEPENDENCIES)
+ $(libhpmud_la_LINK) $(am_libhpmud_la_rpath) $(libhpmud_la_OBJECTS) $(libhpmud_la_LIBADD) $(LIBS)
+libsane-hpaio.la: $(libsane_hpaio_la_OBJECTS) $(libsane_hpaio_la_DEPENDENCIES)
+ $(libsane_hpaio_la_LINK) $(am_libsane_hpaio_la_rpath) $(libsane_hpaio_la_OBJECTS) $(libsane_hpaio_la_LIBADD) $(LIBS)
+pcardext.la: $(pcardext_la_OBJECTS) $(pcardext_la_DEPENDENCIES)
+ $(pcardext_la_LINK) $(am_pcardext_la_rpath) $(pcardext_la_OBJECTS) $(pcardext_la_LIBADD) $(LIBS)
+scanext.la: $(scanext_la_OBJECTS) $(scanext_la_DEPENDENCIES)
+ $(scanext_la_LINK) $(am_scanext_la_rpath) $(scanext_la_OBJECTS) $(scanext_la_LIBADD) $(LIBS)
+install-binPROGRAMS: $(bin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)"
+ @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed 's/$(EXEEXT)$$//' | \
+ while read p p1; do if test -f $$p || test -f $$p1; \
+ then echo "$$p"; echo "$$p"; else :; fi; \
+ done | \
+ sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \
+ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
+ sed 'N;N;N;s,\n, ,g' | \
+ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
+ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+ if ($$2 == $$4) files[d] = files[d] " " $$1; \
+ else { print "f", $$3 "/" $$4, $$1; } } \
+ END { for (d in files) print "f", d, files[d] }' | \
+ while read type dir files; do \
+ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+ test -z "$$files" || { \
+ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \
+ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
+ } \
+ ; done
+
+uninstall-binPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+ files=`for p in $$list; do echo "$$p"; done | \
+ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
+ -e 's/$$/$(EXEEXT)/' `; \
+ test -n "$$list" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(bindir)" && rm -f $$files
+
+clean-binPROGRAMS:
+ @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \
+ echo " rm -f" $$list; \
+ rm -f $$list || exit $$?; \
+ test -n "$(EXEEXT)" || exit 0; \
+ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f" $$list; \
+ rm -f $$list
+install-hpPROGRAMS: $(hp_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ test -z "$(hpdir)" || $(MKDIR_P) "$(DESTDIR)$(hpdir)"
+ @list='$(hp_PROGRAMS)'; test -n "$(hpdir)" || list=; \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed 's/$(EXEEXT)$$//' | \
+ while read p p1; do if test -f $$p || test -f $$p1; \
+ then echo "$$p"; echo "$$p"; else :; fi; \
+ done | \
+ sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \
+ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
+ sed 'N;N;N;s,\n, ,g' | \
+ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
+ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+ if ($$2 == $$4) files[d] = files[d] " " $$1; \
+ else { print "f", $$3 "/" $$4, $$1; } } \
+ END { for (d in files) print "f", d, files[d] }' | \
+ while read type dir files; do \
+ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+ test -z "$$files" || { \
+ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(hpdir)$$dir'"; \
+ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(hpdir)$$dir" || exit $$?; \
+ } \
+ ; done
+
+uninstall-hpPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(hp_PROGRAMS)'; test -n "$(hpdir)" || list=; \
+ files=`for p in $$list; do echo "$$p"; done | \
+ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
+ -e 's/$$/$(EXEEXT)/' `; \
+ test -n "$$list" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(hpdir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(hpdir)" && rm -f $$files
+
+clean-hpPROGRAMS:
+ @list='$(hp_PROGRAMS)'; test -n "$$list" || exit 0; \
+ echo " rm -f" $$list; \
+ rm -f $$list || exit $$?; \
+ test -n "$(EXEEXT)" || exit 0; \
+ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f" $$list; \
+ rm -f $$list
+install-hp_mkuriPROGRAMS: $(hp_mkuri_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ test -z "$(hp_mkuridir)" || $(MKDIR_P) "$(DESTDIR)$(hp_mkuridir)"
+ @list='$(hp_mkuri_PROGRAMS)'; test -n "$(hp_mkuridir)" || list=; \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed 's/$(EXEEXT)$$//' | \
+ while read p p1; do if test -f $$p || test -f $$p1; \
+ then echo "$$p"; echo "$$p"; else :; fi; \
+ done | \
+ sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \
+ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
+ sed 'N;N;N;s,\n, ,g' | \
+ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
+ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+ if ($$2 == $$4) files[d] = files[d] " " $$1; \
+ else { print "f", $$3 "/" $$4, $$1; } } \
+ END { for (d in files) print "f", d, files[d] }' | \
+ while read type dir files; do \
+ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+ test -z "$$files" || { \
+ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(hp_mkuridir)$$dir'"; \
+ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(hp_mkuridir)$$dir" || exit $$?; \
+ } \
+ ; done
+
+uninstall-hp_mkuriPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(hp_mkuri_PROGRAMS)'; test -n "$(hp_mkuridir)" || list=; \
+ files=`for p in $$list; do echo "$$p"; done | \
+ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
+ -e 's/$$/$(EXEEXT)/' `; \
+ test -n "$$list" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(hp_mkuridir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(hp_mkuridir)" && rm -f $$files
+
+clean-hp_mkuriPROGRAMS:
+ @list='$(hp_mkuri_PROGRAMS)'; test -n "$$list" || exit 0; \
+ echo " rm -f" $$list; \
+ rm -f $$list || exit $$?; \
+ test -n "$(EXEEXT)" || exit 0; \
+ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f" $$list; \
+ rm -f $$list
+install-hpcupsPROGRAMS: $(hpcups_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ test -z "$(hpcupsdir)" || $(MKDIR_P) "$(DESTDIR)$(hpcupsdir)"
+ @list='$(hpcups_PROGRAMS)'; test -n "$(hpcupsdir)" || list=; \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed 's/$(EXEEXT)$$//' | \
+ while read p p1; do if test -f $$p || test -f $$p1; \
+ then echo "$$p"; echo "$$p"; else :; fi; \
+ done | \
+ sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \
+ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
+ sed 'N;N;N;s,\n, ,g' | \
+ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
+ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+ if ($$2 == $$4) files[d] = files[d] " " $$1; \
+ else { print "f", $$3 "/" $$4, $$1; } } \
+ END { for (d in files) print "f", d, files[d] }' | \
+ while read type dir files; do \
+ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+ test -z "$$files" || { \
+ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(hpcupsdir)$$dir'"; \
+ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(hpcupsdir)$$dir" || exit $$?; \
+ } \
+ ; done
+
+uninstall-hpcupsPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(hpcups_PROGRAMS)'; test -n "$(hpcupsdir)" || list=; \
+ files=`for p in $$list; do echo "$$p"; done | \
+ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
+ -e 's/$$/$(EXEEXT)/' `; \
+ test -n "$$list" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(hpcupsdir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(hpcupsdir)" && rm -f $$files
+
+clean-hpcupsPROGRAMS:
+ @list='$(hpcups_PROGRAMS)'; test -n "$$list" || exit 0; \
+ echo " rm -f" $$list; \
+ rm -f $$list || exit $$?; \
+ test -n "$(EXEEXT)" || exit 0; \
+ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f" $$list; \
+ rm -f $$list
+install-hpcupsfaxPROGRAMS: $(hpcupsfax_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ test -z "$(hpcupsfaxdir)" || $(MKDIR_P) "$(DESTDIR)$(hpcupsfaxdir)"
+ @list='$(hpcupsfax_PROGRAMS)'; test -n "$(hpcupsfaxdir)" || list=; \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed 's/$(EXEEXT)$$//' | \
+ while read p p1; do if test -f $$p || test -f $$p1; \
+ then echo "$$p"; echo "$$p"; else :; fi; \
+ done | \
+ sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \
+ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
+ sed 'N;N;N;s,\n, ,g' | \
+ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
+ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+ if ($$2 == $$4) files[d] = files[d] " " $$1; \
+ else { print "f", $$3 "/" $$4, $$1; } } \
+ END { for (d in files) print "f", d, files[d] }' | \
+ while read type dir files; do \
+ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+ test -z "$$files" || { \
+ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(hpcupsfaxdir)$$dir'"; \
+ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(hpcupsfaxdir)$$dir" || exit $$?; \
+ } \
+ ; done
+
+uninstall-hpcupsfaxPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(hpcupsfax_PROGRAMS)'; test -n "$(hpcupsfaxdir)" || list=; \
+ files=`for p in $$list; do echo "$$p"; done | \
+ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
+ -e 's/$$/$(EXEEXT)/' `; \
+ test -n "$$list" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(hpcupsfaxdir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(hpcupsfaxdir)" && rm -f $$files
+
+clean-hpcupsfaxPROGRAMS:
+ @list='$(hpcupsfax_PROGRAMS)'; test -n "$$list" || exit 0; \
+ echo " rm -f" $$list; \
+ rm -f $$list || exit $$?; \
+ test -n "$(EXEEXT)" || exit 0; \
+ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f" $$list; \
+ rm -f $$list
+install-hplipjsPROGRAMS: $(hplipjs_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ test -z "$(hplipjsdir)" || $(MKDIR_P) "$(DESTDIR)$(hplipjsdir)"
+ @list='$(hplipjs_PROGRAMS)'; test -n "$(hplipjsdir)" || list=; \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed 's/$(EXEEXT)$$//' | \
+ while read p p1; do if test -f $$p || test -f $$p1; \
+ then echo "$$p"; echo "$$p"; else :; fi; \
+ done | \
+ sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \
+ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
+ sed 'N;N;N;s,\n, ,g' | \
+ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
+ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+ if ($$2 == $$4) files[d] = files[d] " " $$1; \
+ else { print "f", $$3 "/" $$4, $$1; } } \
+ END { for (d in files) print "f", d, files[d] }' | \
+ while read type dir files; do \
+ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+ test -z "$$files" || { \
+ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(hplipjsdir)$$dir'"; \
+ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(hplipjsdir)$$dir" || exit $$?; \
+ } \
+ ; done
+
+uninstall-hplipjsPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(hplipjs_PROGRAMS)'; test -n "$(hplipjsdir)" || list=; \
+ files=`for p in $$list; do echo "$$p"; done | \
+ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
+ -e 's/$$/$(EXEEXT)/' `; \
+ test -n "$$list" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(hplipjsdir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(hplipjsdir)" && rm -f $$files
+
+clean-hplipjsPROGRAMS:
+ @list='$(hplipjs_PROGRAMS)'; test -n "$$list" || exit 0; \
+ echo " rm -f" $$list; \
+ rm -f $$list || exit $$?; \
+ test -n "$(EXEEXT)" || exit 0; \
+ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f" $$list; \
+ rm -f $$list
+install-hppsPROGRAMS: $(hpps_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ test -z "$(hppsdir)" || $(MKDIR_P) "$(DESTDIR)$(hppsdir)"
+ @list='$(hpps_PROGRAMS)'; test -n "$(hppsdir)" || list=; \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed 's/$(EXEEXT)$$//' | \
+ while read p p1; do if test -f $$p || test -f $$p1; \
+ then echo "$$p"; echo "$$p"; else :; fi; \
+ done | \
+ sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \
+ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
+ sed 'N;N;N;s,\n, ,g' | \
+ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
+ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+ if ($$2 == $$4) files[d] = files[d] " " $$1; \
+ else { print "f", $$3 "/" $$4, $$1; } } \
+ END { for (d in files) print "f", d, files[d] }' | \
+ while read type dir files; do \
+ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+ test -z "$$files" || { \
+ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(hppsdir)$$dir'"; \
+ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(hppsdir)$$dir" || exit $$?; \
+ } \
+ ; done
+
+uninstall-hppsPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(hpps_PROGRAMS)'; test -n "$(hppsdir)" || list=; \
+ files=`for p in $$list; do echo "$$p"; done | \
+ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
+ -e 's/$$/$(EXEEXT)/' `; \
+ test -n "$$list" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(hppsdir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(hppsdir)" && rm -f $$files
+
+clean-hppsPROGRAMS:
+ @list='$(hpps_PROGRAMS)'; test -n "$$list" || exit 0; \
+ echo " rm -f" $$list; \
+ rm -f $$list || exit $$?; \
+ test -n "$(EXEEXT)" || exit 0; \
+ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f" $$list; \
+ rm -f $$list
+
+clean-noinstPROGRAMS:
+ @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \
+ echo " rm -f" $$list; \
+ rm -f $$list || exit $$?; \
+ test -n "$(EXEEXT)" || exit 0; \
+ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f" $$list; \
+ rm -f $$list
+hp$(EXEEXT): $(hp_OBJECTS) $(hp_DEPENDENCIES)
+ @rm -f hp$(EXEEXT)
+ $(hp_LINK) $(hp_OBJECTS) $(hp_LDADD) $(LIBS)
+hp-mkuri$(EXEEXT): $(hp_mkuri_OBJECTS) $(hp_mkuri_DEPENDENCIES)
+ @rm -f hp-mkuri$(EXEEXT)
+ $(hp_mkuri_LINK) $(hp_mkuri_OBJECTS) $(hp_mkuri_LDADD) $(LIBS)
+hpcups$(EXEEXT): $(hpcups_OBJECTS) $(hpcups_DEPENDENCIES)
+ @rm -f hpcups$(EXEEXT)
+ $(hpcups_LINK) $(hpcups_OBJECTS) $(hpcups_LDADD) $(LIBS)
+hpcupsfax$(EXEEXT): $(hpcupsfax_OBJECTS) $(hpcupsfax_DEPENDENCIES)
+ @rm -f hpcupsfax$(EXEEXT)
+ $(CXXLINK) $(hpcupsfax_OBJECTS) $(hpcupsfax_LDADD) $(LIBS)
+hpijs$(EXEEXT): $(hpijs_OBJECTS) $(hpijs_DEPENDENCIES)
+ @rm -f hpijs$(EXEEXT)
+ $(hpijs_LINK) $(hpijs_OBJECTS) $(hpijs_LDADD) $(LIBS)
+hplipjs$(EXEEXT): $(hplipjs_OBJECTS) $(hplipjs_DEPENDENCIES)
+ @rm -f hplipjs$(EXEEXT)
+ $(LINK) $(hplipjs_OBJECTS) $(hplipjs_LDADD) $(LIBS)
+hppgsz$(EXEEXT): $(hppgsz_OBJECTS) $(hppgsz_DEPENDENCIES)
+ @rm -f hppgsz$(EXEEXT)
+ $(hppgsz_LINK) $(hppgsz_OBJECTS) $(hppgsz_LDADD) $(LIBS)
+hpps$(EXEEXT): $(hpps_OBJECTS) $(hpps_DEPENDENCIES)
+ @rm -f hpps$(EXEEXT)
+ $(LINK) $(hpps_OBJECTS) $(hpps_LDADD) $(LIBS)
+ptest$(EXEEXT): $(ptest_OBJECTS) $(ptest_DEPENDENCIES)
+ @rm -f ptest$(EXEEXT)
+ $(LINK) $(ptest_OBJECTS) $(ptest_LDADD) $(LIBS)
+install-dist_cacSCRIPTS: $(dist_cac_SCRIPTS)
+ @$(NORMAL_INSTALL)
+ test -z "$(cacdir)" || $(MKDIR_P) "$(DESTDIR)$(cacdir)"
+ @list='$(dist_cac_SCRIPTS)'; test -n "$(cacdir)" || list=; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
+ done | \
+ sed -e 'p;s,.*/,,;n' \
+ -e 'h;s|.*|.|' \
+ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
+ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
+ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+ if ($$2 == $$4) { files[d] = files[d] " " $$1; \
+ if (++n[d] == $(am__install_max)) { \
+ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
+ else { print "f", d "/" $$4, $$1 } } \
+ END { for (d in files) print "f", d, files[d] }' | \
+ while read type dir files; do \
+ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+ test -z "$$files" || { \
+ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(cacdir)$$dir'"; \
+ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(cacdir)$$dir" || exit $$?; \
+ } \
+ ; done
+
+uninstall-dist_cacSCRIPTS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(dist_cac_SCRIPTS)'; test -n "$(cacdir)" || exit 0; \
+ files=`for p in $$list; do echo "$$p"; done | \
+ sed -e 's,.*/,,;$(transform)'`; \
+ test -n "$$list" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(cacdir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(cacdir)" && rm -f $$files
+install-dist_cmdSCRIPTS: $(dist_cmd_SCRIPTS)
+ @$(NORMAL_INSTALL)
+ test -z "$(cmddir)" || $(MKDIR_P) "$(DESTDIR)$(cmddir)"
+ @list='$(dist_cmd_SCRIPTS)'; test -n "$(cmddir)" || list=; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
+ done | \
+ sed -e 'p;s,.*/,,;n' \
+ -e 'h;s|.*|.|' \
+ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
+ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
+ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+ if ($$2 == $$4) { files[d] = files[d] " " $$1; \
+ if (++n[d] == $(am__install_max)) { \
+ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
+ else { print "f", d "/" $$4, $$1 } } \
+ END { for (d in files) print "f", d, files[d] }' | \
+ while read type dir files; do \
+ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+ test -z "$$files" || { \
+ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(cmddir)$$dir'"; \
+ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(cmddir)$$dir" || exit $$?; \
+ } \
+ ; done
+
+uninstall-dist_cmdSCRIPTS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(dist_cmd_SCRIPTS)'; test -n "$(cmddir)" || exit 0; \
+ files=`for p in $$list; do echo "$$p"; done | \
+ sed -e 's,.*/,,;$(transform)'`; \
+ test -n "$$list" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(cmddir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(cmddir)" && rm -f $$files
+install-dist_hpfaxSCRIPTS: $(dist_hpfax_SCRIPTS)
+ @$(NORMAL_INSTALL)
+ test -z "$(hpfaxdir)" || $(MKDIR_P) "$(DESTDIR)$(hpfaxdir)"
+ @list='$(dist_hpfax_SCRIPTS)'; test -n "$(hpfaxdir)" || list=; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
+ done | \
+ sed -e 'p;s,.*/,,;n' \
+ -e 'h;s|.*|.|' \
+ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
+ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
+ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+ if ($$2 == $$4) { files[d] = files[d] " " $$1; \
+ if (++n[d] == $(am__install_max)) { \
+ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
+ else { print "f", d "/" $$4, $$1 } } \
+ END { for (d in files) print "f", d, files[d] }' | \
+ while read type dir files; do \
+ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+ test -z "$$files" || { \
+ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(hpfaxdir)$$dir'"; \
+ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(hpfaxdir)$$dir" || exit $$?; \
+ } \
+ ; done
+
+uninstall-dist_hpfaxSCRIPTS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(dist_hpfax_SCRIPTS)'; test -n "$(hpfaxdir)" || exit 0; \
+ files=`for p in $$list; do echo "$$p"; done | \
+ sed -e 's,.*/,,;$(transform)'`; \
+ test -n "$$list" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(hpfaxdir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(hpfaxdir)" && rm -f $$files
+install-dist_hplipSCRIPTS: $(dist_hplip_SCRIPTS)
+ @$(NORMAL_INSTALL)
+ test -z "$(hplipdir)" || $(MKDIR_P) "$(DESTDIR)$(hplipdir)"
+ @list='$(dist_hplip_SCRIPTS)'; test -n "$(hplipdir)" || list=; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
+ done | \
+ sed -e 'p;s,.*/,,;n' \
+ -e 'h;s|.*|.|' \
+ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
+ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
+ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+ if ($$2 == $$4) { files[d] = files[d] " " $$1; \
+ if (++n[d] == $(am__install_max)) { \
+ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
+ else { print "f", d "/" $$4, $$1 } } \
+ END { for (d in files) print "f", d, files[d] }' | \
+ while read type dir files; do \
+ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+ test -z "$$files" || { \
+ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(hplipdir)$$dir'"; \
+ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(hplipdir)$$dir" || exit $$?; \
+ } \
+ ; done
+
+uninstall-dist_hplipSCRIPTS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(dist_hplip_SCRIPTS)'; test -n "$(hplipdir)" || exit 0; \
+ files=`for p in $$list; do echo "$$p"; done | \
+ sed -e 's,.*/,,;$(transform)'`; \
+ test -n "$$list" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(hplipdir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(hplipdir)" && rm -f $$files
+install-dist_plugins4SCRIPTS: $(dist_plugins4_SCRIPTS)
+ @$(NORMAL_INSTALL)
+ test -z "$(plugins4dir)" || $(MKDIR_P) "$(DESTDIR)$(plugins4dir)"
+ @list='$(dist_plugins4_SCRIPTS)'; test -n "$(plugins4dir)" || list=; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
+ done | \
+ sed -e 'p;s,.*/,,;n' \
+ -e 'h;s|.*|.|' \
+ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
+ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
+ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+ if ($$2 == $$4) { files[d] = files[d] " " $$1; \
+ if (++n[d] == $(am__install_max)) { \
+ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
+ else { print "f", d "/" $$4, $$1 } } \
+ END { for (d in files) print "f", d, files[d] }' | \
+ while read type dir files; do \
+ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+ test -z "$$files" || { \
+ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(plugins4dir)$$dir'"; \
+ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(plugins4dir)$$dir" || exit $$?; \
+ } \
+ ; done
+
+uninstall-dist_plugins4SCRIPTS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(dist_plugins4_SCRIPTS)'; test -n "$(plugins4dir)" || exit 0; \
+ files=`for p in $$list; do echo "$$p"; done | \
+ sed -e 's,.*/,,;$(transform)'`; \
+ test -n "$$list" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(plugins4dir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(plugins4dir)" && rm -f $$files
+install-dist_ripSCRIPTS: $(dist_rip_SCRIPTS)
+ @$(NORMAL_INSTALL)
+ test -z "$(ripdir)" || $(MKDIR_P) "$(DESTDIR)$(ripdir)"
+ @list='$(dist_rip_SCRIPTS)'; test -n "$(ripdir)" || list=; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
+ done | \
+ sed -e 'p;s,.*/,,;n' \
+ -e 'h;s|.*|.|' \
+ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
+ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
+ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+ if ($$2 == $$4) { files[d] = files[d] " " $$1; \
+ if (++n[d] == $(am__install_max)) { \
+ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
+ else { print "f", d "/" $$4, $$1 } } \
+ END { for (d in files) print "f", d, files[d] }' | \
+ while read type dir files; do \
+ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+ test -z "$$files" || { \
+ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(ripdir)$$dir'"; \
+ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(ripdir)$$dir" || exit $$?; \
+ } \
+ ; done
+
+uninstall-dist_ripSCRIPTS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(dist_rip_SCRIPTS)'; test -n "$(ripdir)" || exit 0; \
+ files=`for p in $$list; do echo "$$p"; done | \
+ sed -e 's,.*/,,;$(transform)'`; \
+ test -n "$$list" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(ripdir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(ripdir)" && rm -f $$files
+install-pstotiffSCRIPTS: $(pstotiff_SCRIPTS)
+ @$(NORMAL_INSTALL)
+ test -z "$(pstotiffdir)" || $(MKDIR_P) "$(DESTDIR)$(pstotiffdir)"
+ @list='$(pstotiff_SCRIPTS)'; test -n "$(pstotiffdir)" || list=; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
+ done | \
+ sed -e 'p;s,.*/,,;n' \
+ -e 'h;s|.*|.|' \
+ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
+ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
+ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+ if ($$2 == $$4) { files[d] = files[d] " " $$1; \
+ if (++n[d] == $(am__install_max)) { \
+ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
+ else { print "f", d "/" $$4, $$1 } } \
+ END { for (d in files) print "f", d, files[d] }' | \
+ while read type dir files; do \
+ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+ test -z "$$files" || { \
+ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(pstotiffdir)$$dir'"; \
+ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(pstotiffdir)$$dir" || exit $$?; \
+ } \
+ ; done
+
+uninstall-pstotiffSCRIPTS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(pstotiff_SCRIPTS)'; test -n "$(pstotiffdir)" || exit 0; \
+ files=`for p in $$list; do echo "$$p"; done | \
+ sed -e 's,.*/,,;$(transform)'`; \
+ test -n "$$list" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(pstotiffdir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(pstotiffdir)" && rm -f $$files
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fat.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hp-hp.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hp_mkuri-hp-mkuri.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hpcups-BreakTables.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hpcups-ColorMatcher.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hpcups-Compressor.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hpcups-Encapsulator.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hpcups-EncapsulatorFactory.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hpcups-ErnieFilter.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hpcups-HPCupsFilter.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hpcups-Halftoner.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hpcups-Job.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hpcups-LJColor.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hpcups-LJFastRaster.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hpcups-LJJetReady.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hpcups-LJMono.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hpcups-LJZjStream.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hpcups-LJZxStream.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hpcups-Lidil.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hpcups-LidilCompress.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hpcups-Mode10.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hpcups-Mode2.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hpcups-Mode3.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hpcups-Mode9.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hpcups-ModeDeltaPlus.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hpcups-ModeJbig.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hpcups-ModeJpeg.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hpcups-Pcl3.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hpcups-Pcl3Gui.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hpcups-Pcl3Gui2.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hpcups-Pipeline.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hpcups-Processor.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hpcups-QuickConnect.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hpcups-RasterSender.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hpcups-Scaler.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hpcups-SystemServices.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hpcups-Utils.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hpcups-dbuscomm.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hpcups-dj3320ColorMaps.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hpcups-dj3600ColorMaps.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hpcups-dj400ColorMaps.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hpcups-dj4100ColorMaps.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hpcups-dj600ColorMaps.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hpcups-dj8xxColorMaps.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hpcups-dj970ColorMaps.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hpcupsfax.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hpijs-hpijs.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hpijs-hpijsfax.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hpijs-hpiom.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hpijs-ijs.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hpijs-ijs_server.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hpijs-services.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hplipjs.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hpmudext_la-hpmudext.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hppgsz-PrinterProperties.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hppsfilter.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ipmain.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jccolor.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jdatadbf.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libapdk_la-apollo21xx.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libapdk_la-apollo2560.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libapdk_la-apollo2xxx.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libapdk_la-breaks_open.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libapdk_la-capture.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libapdk_la-colormatch.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libapdk_la-colormatcher_open.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libapdk_la-compression.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libapdk_la-context2.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libapdk_la-create_so.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libapdk_la-creator.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libapdk_la-dj3320.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libapdk_la-dj3320_cmap.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libapdk_la-dj350.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libapdk_la-dj3600.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libapdk_la-dj3600_cmap.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libapdk_la-dj4100_cmap.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libapdk_la-dj540.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libapdk_la-dj600.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libapdk_la-dj600_maps.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libapdk_la-dj630.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libapdk_la-dj660.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libapdk_la-dj660_maps.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libapdk_la-dj690.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libapdk_la-dj690_maps.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libapdk_la-dj6xx.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libapdk_la-dj850.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libapdk_la-dj850_maps.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libapdk_la-dj890.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libapdk_la-dj895_maps.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libapdk_la-dj895_maps2.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libapdk_la-dj8x5.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libapdk_la-dj8xx.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libapdk_la-dj970_maps.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libapdk_la-dj970_maps2.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libapdk_la-dj970_maps3.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libapdk_la-dj9xx.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libapdk_la-dj9xxvip.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libapdk_la-djgenericvip.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libapdk_la-filterhpa.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libapdk_la-globals.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libapdk_la-halftoner.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libapdk_la-halftoner_open.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libapdk_la-header2.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libapdk_la-htmtxhi.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libapdk_la-jccolor.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libapdk_la-jdatadbf.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libapdk_la-job.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libapdk_la-ljcolor.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libapdk_la-ljfastraster.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libapdk_la-ljjetready.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libapdk_la-ljm1005.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libapdk_la-ljmono.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libapdk_la-ljzjs.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libapdk_la-ljzjscolor.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libapdk_la-ljzjsmono.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libapdk_la-models.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libapdk_la-phobos_cmaps.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libapdk_la-pmselect.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libapdk_la-printer.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libapdk_la-printerfactory.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libapdk_la-printerproxy.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libapdk_la-psp100.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libapdk_la-quickconnect.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libapdk_la-registry.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libapdk_la-scaler.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libapdk_la-scaler_open.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libapdk_la-script.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libapdk_la-systemservices.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libapdk_la-translator.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libapdk_la-version.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libapdk_la-versioncode.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhpmud_la-dot4.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhpmud_la-hpmud.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhpmud_la-jd.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhpmud_la-mlc.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhpmud_la-model.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhpmud_la-musb.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhpmud_la-pml.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhpmud_la-pp.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsane_hpaio_la-bb_ledm.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsane_hpaio_la-common.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsane_hpaio_la-hpaio.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsane_hpaio_la-http.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsane_hpaio_la-io.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsane_hpaio_la-ledm.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsane_hpaio_la-marvell.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsane_hpaio_la-mfpdtf.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsane_hpaio_la-pml.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsane_hpaio_la-sanei_init_debug.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsane_hpaio_la-scl.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsane_hpaio_la-soap.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsane_hpaio_la-soapht.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsane_hpaio_la-xml.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcardext_la-fat.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcardext_la-pcardext.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ptest.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scanext_la-scanext.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xbi2gray.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xchgbpp.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xcolrspc.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xconvolve.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xcrop.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xfakemono.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xfax.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xgamma.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xgray2bi.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xgrayout.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xinvert.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xjpg_dct.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xjpg_dec.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xjpg_enc.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xjpg_fix.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xjpg_huf.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xmatrix.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xpad.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xpcx.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xpnm.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xrotate.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xsaturation.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xscale.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xskel.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xtable.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xthumb.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xtiff.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xtonemap.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xyxtract.Plo@am__quote@
+
+.c.o:
+@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(COMPILE) -c $<
+
+.c.obj:
+@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+.c.lo:
+@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
+
+hpmudext_la-hpmudext.lo: io/mudext/hpmudext.c
+@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpmudext_la_CFLAGS) $(CFLAGS) -MT hpmudext_la-hpmudext.lo -MD -MP -MF $(DEPDIR)/hpmudext_la-hpmudext.Tpo -c -o hpmudext_la-hpmudext.lo `test -f 'io/mudext/hpmudext.c' || echo '$(srcdir)/'`io/mudext/hpmudext.c
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/hpmudext_la-hpmudext.Tpo $(DEPDIR)/hpmudext_la-hpmudext.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='io/mudext/hpmudext.c' object='hpmudext_la-hpmudext.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpmudext_la_CFLAGS) $(CFLAGS) -c -o hpmudext_la-hpmudext.lo `test -f 'io/mudext/hpmudext.c' || echo '$(srcdir)/'`io/mudext/hpmudext.c
+
+libapdk_la-jdatadbf.lo: prnt/hpijs/jdatadbf.c
+@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CFLAGS) $(CFLAGS) -MT libapdk_la-jdatadbf.lo -MD -MP -MF $(DEPDIR)/libapdk_la-jdatadbf.Tpo -c -o libapdk_la-jdatadbf.lo `test -f 'prnt/hpijs/jdatadbf.c' || echo '$(srcdir)/'`prnt/hpijs/jdatadbf.c
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libapdk_la-jdatadbf.Tpo $(DEPDIR)/libapdk_la-jdatadbf.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='prnt/hpijs/jdatadbf.c' object='libapdk_la-jdatadbf.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CFLAGS) $(CFLAGS) -c -o libapdk_la-jdatadbf.lo `test -f 'prnt/hpijs/jdatadbf.c' || echo '$(srcdir)/'`prnt/hpijs/jdatadbf.c
+
+libapdk_la-jccolor.lo: prnt/hpijs/jccolor.c
+@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CFLAGS) $(CFLAGS) -MT libapdk_la-jccolor.lo -MD -MP -MF $(DEPDIR)/libapdk_la-jccolor.Tpo -c -o libapdk_la-jccolor.lo `test -f 'prnt/hpijs/jccolor.c' || echo '$(srcdir)/'`prnt/hpijs/jccolor.c
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libapdk_la-jccolor.Tpo $(DEPDIR)/libapdk_la-jccolor.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='prnt/hpijs/jccolor.c' object='libapdk_la-jccolor.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CFLAGS) $(CFLAGS) -c -o libapdk_la-jccolor.lo `test -f 'prnt/hpijs/jccolor.c' || echo '$(srcdir)/'`prnt/hpijs/jccolor.c
+
+xconvolve.lo: ip/xconvolve.c
+@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xconvolve.lo -MD -MP -MF $(DEPDIR)/xconvolve.Tpo -c -o xconvolve.lo `test -f 'ip/xconvolve.c' || echo '$(srcdir)/'`ip/xconvolve.c
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/xconvolve.Tpo $(DEPDIR)/xconvolve.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ip/xconvolve.c' object='xconvolve.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xconvolve.lo `test -f 'ip/xconvolve.c' || echo '$(srcdir)/'`ip/xconvolve.c
+
+xfax.lo: ip/xfax.c
+@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xfax.lo -MD -MP -MF $(DEPDIR)/xfax.Tpo -c -o xfax.lo `test -f 'ip/xfax.c' || echo '$(srcdir)/'`ip/xfax.c
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/xfax.Tpo $(DEPDIR)/xfax.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ip/xfax.c' object='xfax.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xfax.lo `test -f 'ip/xfax.c' || echo '$(srcdir)/'`ip/xfax.c
+
+xgrayout.lo: ip/xgrayout.c
+@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xgrayout.lo -MD -MP -MF $(DEPDIR)/xgrayout.Tpo -c -o xgrayout.lo `test -f 'ip/xgrayout.c' || echo '$(srcdir)/'`ip/xgrayout.c
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/xgrayout.Tpo $(DEPDIR)/xgrayout.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ip/xgrayout.c' object='xgrayout.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xgrayout.lo `test -f 'ip/xgrayout.c' || echo '$(srcdir)/'`ip/xgrayout.c
+
+xjpg_dct.lo: ip/xjpg_dct.c
+@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xjpg_dct.lo -MD -MP -MF $(DEPDIR)/xjpg_dct.Tpo -c -o xjpg_dct.lo `test -f 'ip/xjpg_dct.c' || echo '$(srcdir)/'`ip/xjpg_dct.c
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/xjpg_dct.Tpo $(DEPDIR)/xjpg_dct.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ip/xjpg_dct.c' object='xjpg_dct.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xjpg_dct.lo `test -f 'ip/xjpg_dct.c' || echo '$(srcdir)/'`ip/xjpg_dct.c
+
+xjpg_fix.lo: ip/xjpg_fix.c
+@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xjpg_fix.lo -MD -MP -MF $(DEPDIR)/xjpg_fix.Tpo -c -o xjpg_fix.lo `test -f 'ip/xjpg_fix.c' || echo '$(srcdir)/'`ip/xjpg_fix.c
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/xjpg_fix.Tpo $(DEPDIR)/xjpg_fix.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ip/xjpg_fix.c' object='xjpg_fix.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xjpg_fix.lo `test -f 'ip/xjpg_fix.c' || echo '$(srcdir)/'`ip/xjpg_fix.c
+
+xpad.lo: ip/xpad.c
+@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xpad.lo -MD -MP -MF $(DEPDIR)/xpad.Tpo -c -o xpad.lo `test -f 'ip/xpad.c' || echo '$(srcdir)/'`ip/xpad.c
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/xpad.Tpo $(DEPDIR)/xpad.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ip/xpad.c' object='xpad.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xpad.lo `test -f 'ip/xpad.c' || echo '$(srcdir)/'`ip/xpad.c
+
+xrotate.lo: ip/xrotate.c
+@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xrotate.lo -MD -MP -MF $(DEPDIR)/xrotate.Tpo -c -o xrotate.lo `test -f 'ip/xrotate.c' || echo '$(srcdir)/'`ip/xrotate.c
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/xrotate.Tpo $(DEPDIR)/xrotate.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ip/xrotate.c' object='xrotate.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xrotate.lo `test -f 'ip/xrotate.c' || echo '$(srcdir)/'`ip/xrotate.c
+
+xskel.lo: ip/xskel.c
+@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xskel.lo -MD -MP -MF $(DEPDIR)/xskel.Tpo -c -o xskel.lo `test -f 'ip/xskel.c' || echo '$(srcdir)/'`ip/xskel.c
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/xskel.Tpo $(DEPDIR)/xskel.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ip/xskel.c' object='xskel.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xskel.lo `test -f 'ip/xskel.c' || echo '$(srcdir)/'`ip/xskel.c
+
+xtiff.lo: ip/xtiff.c
+@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xtiff.lo -MD -MP -MF $(DEPDIR)/xtiff.Tpo -c -o xtiff.lo `test -f 'ip/xtiff.c' || echo '$(srcdir)/'`ip/xtiff.c
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/xtiff.Tpo $(DEPDIR)/xtiff.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ip/xtiff.c' object='xtiff.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xtiff.lo `test -f 'ip/xtiff.c' || echo '$(srcdir)/'`ip/xtiff.c
+
+ipmain.lo: ip/ipmain.c
+@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ipmain.lo -MD -MP -MF $(DEPDIR)/ipmain.Tpo -c -o ipmain.lo `test -f 'ip/ipmain.c' || echo '$(srcdir)/'`ip/ipmain.c
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/ipmain.Tpo $(DEPDIR)/ipmain.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ip/ipmain.c' object='ipmain.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ipmain.lo `test -f 'ip/ipmain.c' || echo '$(srcdir)/'`ip/ipmain.c
+
+xchgbpp.lo: ip/xchgbpp.c
+@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xchgbpp.lo -MD -MP -MF $(DEPDIR)/xchgbpp.Tpo -c -o xchgbpp.lo `test -f 'ip/xchgbpp.c' || echo '$(srcdir)/'`ip/xchgbpp.c
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/xchgbpp.Tpo $(DEPDIR)/xchgbpp.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ip/xchgbpp.c' object='xchgbpp.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xchgbpp.lo `test -f 'ip/xchgbpp.c' || echo '$(srcdir)/'`ip/xchgbpp.c
+
+xcrop.lo: ip/xcrop.c
+@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xcrop.lo -MD -MP -MF $(DEPDIR)/xcrop.Tpo -c -o xcrop.lo `test -f 'ip/xcrop.c' || echo '$(srcdir)/'`ip/xcrop.c
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/xcrop.Tpo $(DEPDIR)/xcrop.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ip/xcrop.c' object='xcrop.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xcrop.lo `test -f 'ip/xcrop.c' || echo '$(srcdir)/'`ip/xcrop.c
+
+xgamma.lo: ip/xgamma.c
+@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xgamma.lo -MD -MP -MF $(DEPDIR)/xgamma.Tpo -c -o xgamma.lo `test -f 'ip/xgamma.c' || echo '$(srcdir)/'`ip/xgamma.c
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/xgamma.Tpo $(DEPDIR)/xgamma.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ip/xgamma.c' object='xgamma.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xgamma.lo `test -f 'ip/xgamma.c' || echo '$(srcdir)/'`ip/xgamma.c
+
+xjpg_dec.lo: ip/xjpg_dec.c
+@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xjpg_dec.lo -MD -MP -MF $(DEPDIR)/xjpg_dec.Tpo -c -o xjpg_dec.lo `test -f 'ip/xjpg_dec.c' || echo '$(srcdir)/'`ip/xjpg_dec.c
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/xjpg_dec.Tpo $(DEPDIR)/xjpg_dec.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ip/xjpg_dec.c' object='xjpg_dec.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xjpg_dec.lo `test -f 'ip/xjpg_dec.c' || echo '$(srcdir)/'`ip/xjpg_dec.c
+
+xjpg_huf.lo: ip/xjpg_huf.c
+@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xjpg_huf.lo -MD -MP -MF $(DEPDIR)/xjpg_huf.Tpo -c -o xjpg_huf.lo `test -f 'ip/xjpg_huf.c' || echo '$(srcdir)/'`ip/xjpg_huf.c
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/xjpg_huf.Tpo $(DEPDIR)/xjpg_huf.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ip/xjpg_huf.c' object='xjpg_huf.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xjpg_huf.lo `test -f 'ip/xjpg_huf.c' || echo '$(srcdir)/'`ip/xjpg_huf.c
+
+xpcx.lo: ip/xpcx.c
+@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xpcx.lo -MD -MP -MF $(DEPDIR)/xpcx.Tpo -c -o xpcx.lo `test -f 'ip/xpcx.c' || echo '$(srcdir)/'`ip/xpcx.c
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/xpcx.Tpo $(DEPDIR)/xpcx.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ip/xpcx.c' object='xpcx.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xpcx.lo `test -f 'ip/xpcx.c' || echo '$(srcdir)/'`ip/xpcx.c
+
+xsaturation.lo: ip/xsaturation.c
+@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xsaturation.lo -MD -MP -MF $(DEPDIR)/xsaturation.Tpo -c -o xsaturation.lo `test -f 'ip/xsaturation.c' || echo '$(srcdir)/'`ip/xsaturation.c
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/xsaturation.Tpo $(DEPDIR)/xsaturation.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ip/xsaturation.c' object='xsaturation.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xsaturation.lo `test -f 'ip/xsaturation.c' || echo '$(srcdir)/'`ip/xsaturation.c
+
+xtable.lo: ip/xtable.c
+@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xtable.lo -MD -MP -MF $(DEPDIR)/xtable.Tpo -c -o xtable.lo `test -f 'ip/xtable.c' || echo '$(srcdir)/'`ip/xtable.c
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/xtable.Tpo $(DEPDIR)/xtable.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ip/xtable.c' object='xtable.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xtable.lo `test -f 'ip/xtable.c' || echo '$(srcdir)/'`ip/xtable.c
+
+xtonemap.lo: ip/xtonemap.c
+@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xtonemap.lo -MD -MP -MF $(DEPDIR)/xtonemap.Tpo -c -o xtonemap.lo `test -f 'ip/xtonemap.c' || echo '$(srcdir)/'`ip/xtonemap.c
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/xtonemap.Tpo $(DEPDIR)/xtonemap.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ip/xtonemap.c' object='xtonemap.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xtonemap.lo `test -f 'ip/xtonemap.c' || echo '$(srcdir)/'`ip/xtonemap.c
+
+xbi2gray.lo: ip/xbi2gray.c
+@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xbi2gray.lo -MD -MP -MF $(DEPDIR)/xbi2gray.Tpo -c -o xbi2gray.lo `test -f 'ip/xbi2gray.c' || echo '$(srcdir)/'`ip/xbi2gray.c
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/xbi2gray.Tpo $(DEPDIR)/xbi2gray.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ip/xbi2gray.c' object='xbi2gray.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xbi2gray.lo `test -f 'ip/xbi2gray.c' || echo '$(srcdir)/'`ip/xbi2gray.c
+
+xcolrspc.lo: ip/xcolrspc.c
+@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xcolrspc.lo -MD -MP -MF $(DEPDIR)/xcolrspc.Tpo -c -o xcolrspc.lo `test -f 'ip/xcolrspc.c' || echo '$(srcdir)/'`ip/xcolrspc.c
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/xcolrspc.Tpo $(DEPDIR)/xcolrspc.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ip/xcolrspc.c' object='xcolrspc.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xcolrspc.lo `test -f 'ip/xcolrspc.c' || echo '$(srcdir)/'`ip/xcolrspc.c
+
+xfakemono.lo: ip/xfakemono.c
+@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xfakemono.lo -MD -MP -MF $(DEPDIR)/xfakemono.Tpo -c -o xfakemono.lo `test -f 'ip/xfakemono.c' || echo '$(srcdir)/'`ip/xfakemono.c
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/xfakemono.Tpo $(DEPDIR)/xfakemono.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ip/xfakemono.c' object='xfakemono.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xfakemono.lo `test -f 'ip/xfakemono.c' || echo '$(srcdir)/'`ip/xfakemono.c
+
+xgray2bi.lo: ip/xgray2bi.c
+@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xgray2bi.lo -MD -MP -MF $(DEPDIR)/xgray2bi.Tpo -c -o xgray2bi.lo `test -f 'ip/xgray2bi.c' || echo '$(srcdir)/'`ip/xgray2bi.c
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/xgray2bi.Tpo $(DEPDIR)/xgray2bi.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ip/xgray2bi.c' object='xgray2bi.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xgray2bi.lo `test -f 'ip/xgray2bi.c' || echo '$(srcdir)/'`ip/xgray2bi.c
+
+xinvert.lo: ip/xinvert.c
+@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xinvert.lo -MD -MP -MF $(DEPDIR)/xinvert.Tpo -c -o xinvert.lo `test -f 'ip/xinvert.c' || echo '$(srcdir)/'`ip/xinvert.c
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/xinvert.Tpo $(DEPDIR)/xinvert.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ip/xinvert.c' object='xinvert.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xinvert.lo `test -f 'ip/xinvert.c' || echo '$(srcdir)/'`ip/xinvert.c
+
+xjpg_enc.lo: ip/xjpg_enc.c
+@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xjpg_enc.lo -MD -MP -MF $(DEPDIR)/xjpg_enc.Tpo -c -o xjpg_enc.lo `test -f 'ip/xjpg_enc.c' || echo '$(srcdir)/'`ip/xjpg_enc.c
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/xjpg_enc.Tpo $(DEPDIR)/xjpg_enc.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ip/xjpg_enc.c' object='xjpg_enc.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xjpg_enc.lo `test -f 'ip/xjpg_enc.c' || echo '$(srcdir)/'`ip/xjpg_enc.c
+
+xmatrix.lo: ip/xmatrix.c
+@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xmatrix.lo -MD -MP -MF $(DEPDIR)/xmatrix.Tpo -c -o xmatrix.lo `test -f 'ip/xmatrix.c' || echo '$(srcdir)/'`ip/xmatrix.c
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/xmatrix.Tpo $(DEPDIR)/xmatrix.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ip/xmatrix.c' object='xmatrix.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xmatrix.lo `test -f 'ip/xmatrix.c' || echo '$(srcdir)/'`ip/xmatrix.c
+
+xpnm.lo: ip/xpnm.c
+@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xpnm.lo -MD -MP -MF $(DEPDIR)/xpnm.Tpo -c -o xpnm.lo `test -f 'ip/xpnm.c' || echo '$(srcdir)/'`ip/xpnm.c
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/xpnm.Tpo $(DEPDIR)/xpnm.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ip/xpnm.c' object='xpnm.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xpnm.lo `test -f 'ip/xpnm.c' || echo '$(srcdir)/'`ip/xpnm.c
+
+xscale.lo: ip/xscale.c
+@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xscale.lo -MD -MP -MF $(DEPDIR)/xscale.Tpo -c -o xscale.lo `test -f 'ip/xscale.c' || echo '$(srcdir)/'`ip/xscale.c
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/xscale.Tpo $(DEPDIR)/xscale.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ip/xscale.c' object='xscale.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xscale.lo `test -f 'ip/xscale.c' || echo '$(srcdir)/'`ip/xscale.c
+
+xthumb.lo: ip/xthumb.c
+@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xthumb.lo -MD -MP -MF $(DEPDIR)/xthumb.Tpo -c -o xthumb.lo `test -f 'ip/xthumb.c' || echo '$(srcdir)/'`ip/xthumb.c
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/xthumb.Tpo $(DEPDIR)/xthumb.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ip/xthumb.c' object='xthumb.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xthumb.lo `test -f 'ip/xthumb.c' || echo '$(srcdir)/'`ip/xthumb.c
+
+xyxtract.lo: ip/xyxtract.c
+@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xyxtract.lo -MD -MP -MF $(DEPDIR)/xyxtract.Tpo -c -o xyxtract.lo `test -f 'ip/xyxtract.c' || echo '$(srcdir)/'`ip/xyxtract.c
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/xyxtract.Tpo $(DEPDIR)/xyxtract.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ip/xyxtract.c' object='xyxtract.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xyxtract.lo `test -f 'ip/xyxtract.c' || echo '$(srcdir)/'`ip/xyxtract.c
+
+libhpmud_la-hpmud.lo: io/hpmud/hpmud.c
+@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libhpmud_la_CFLAGS) $(CFLAGS) -MT libhpmud_la-hpmud.lo -MD -MP -MF $(DEPDIR)/libhpmud_la-hpmud.Tpo -c -o libhpmud_la-hpmud.lo `test -f 'io/hpmud/hpmud.c' || echo '$(srcdir)/'`io/hpmud/hpmud.c
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libhpmud_la-hpmud.Tpo $(DEPDIR)/libhpmud_la-hpmud.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='io/hpmud/hpmud.c' object='libhpmud_la-hpmud.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libhpmud_la_CFLAGS) $(CFLAGS) -c -o libhpmud_la-hpmud.lo `test -f 'io/hpmud/hpmud.c' || echo '$(srcdir)/'`io/hpmud/hpmud.c
+
+libhpmud_la-mlc.lo: io/hpmud/mlc.c
+@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libhpmud_la_CFLAGS) $(CFLAGS) -MT libhpmud_la-mlc.lo -MD -MP -MF $(DEPDIR)/libhpmud_la-mlc.Tpo -c -o libhpmud_la-mlc.lo `test -f 'io/hpmud/mlc.c' || echo '$(srcdir)/'`io/hpmud/mlc.c
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libhpmud_la-mlc.Tpo $(DEPDIR)/libhpmud_la-mlc.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='io/hpmud/mlc.c' object='libhpmud_la-mlc.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libhpmud_la_CFLAGS) $(CFLAGS) -c -o libhpmud_la-mlc.lo `test -f 'io/hpmud/mlc.c' || echo '$(srcdir)/'`io/hpmud/mlc.c
+
+libhpmud_la-model.lo: io/hpmud/model.c
+@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libhpmud_la_CFLAGS) $(CFLAGS) -MT libhpmud_la-model.lo -MD -MP -MF $(DEPDIR)/libhpmud_la-model.Tpo -c -o libhpmud_la-model.lo `test -f 'io/hpmud/model.c' || echo '$(srcdir)/'`io/hpmud/model.c
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libhpmud_la-model.Tpo $(DEPDIR)/libhpmud_la-model.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='io/hpmud/model.c' object='libhpmud_la-model.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libhpmud_la_CFLAGS) $(CFLAGS) -c -o libhpmud_la-model.lo `test -f 'io/hpmud/model.c' || echo '$(srcdir)/'`io/hpmud/model.c
+
+libhpmud_la-musb.lo: io/hpmud/musb.c
+@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libhpmud_la_CFLAGS) $(CFLAGS) -MT libhpmud_la-musb.lo -MD -MP -MF $(DEPDIR)/libhpmud_la-musb.Tpo -c -o libhpmud_la-musb.lo `test -f 'io/hpmud/musb.c' || echo '$(srcdir)/'`io/hpmud/musb.c
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libhpmud_la-musb.Tpo $(DEPDIR)/libhpmud_la-musb.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='io/hpmud/musb.c' object='libhpmud_la-musb.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libhpmud_la_CFLAGS) $(CFLAGS) -c -o libhpmud_la-musb.lo `test -f 'io/hpmud/musb.c' || echo '$(srcdir)/'`io/hpmud/musb.c
+
+libhpmud_la-pml.lo: io/hpmud/pml.c
+@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libhpmud_la_CFLAGS) $(CFLAGS) -MT libhpmud_la-pml.lo -MD -MP -MF $(DEPDIR)/libhpmud_la-pml.Tpo -c -o libhpmud_la-pml.lo `test -f 'io/hpmud/pml.c' || echo '$(srcdir)/'`io/hpmud/pml.c
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libhpmud_la-pml.Tpo $(DEPDIR)/libhpmud_la-pml.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='io/hpmud/pml.c' object='libhpmud_la-pml.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libhpmud_la_CFLAGS) $(CFLAGS) -c -o libhpmud_la-pml.lo `test -f 'io/hpmud/pml.c' || echo '$(srcdir)/'`io/hpmud/pml.c
+
+libhpmud_la-dot4.lo: io/hpmud/dot4.c
+@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libhpmud_la_CFLAGS) $(CFLAGS) -MT libhpmud_la-dot4.lo -MD -MP -MF $(DEPDIR)/libhpmud_la-dot4.Tpo -c -o libhpmud_la-dot4.lo `test -f 'io/hpmud/dot4.c' || echo '$(srcdir)/'`io/hpmud/dot4.c
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libhpmud_la-dot4.Tpo $(DEPDIR)/libhpmud_la-dot4.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='io/hpmud/dot4.c' object='libhpmud_la-dot4.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libhpmud_la_CFLAGS) $(CFLAGS) -c -o libhpmud_la-dot4.lo `test -f 'io/hpmud/dot4.c' || echo '$(srcdir)/'`io/hpmud/dot4.c
+
+libhpmud_la-jd.lo: io/hpmud/jd.c
+@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libhpmud_la_CFLAGS) $(CFLAGS) -MT libhpmud_la-jd.lo -MD -MP -MF $(DEPDIR)/libhpmud_la-jd.Tpo -c -o libhpmud_la-jd.lo `test -f 'io/hpmud/jd.c' || echo '$(srcdir)/'`io/hpmud/jd.c
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libhpmud_la-jd.Tpo $(DEPDIR)/libhpmud_la-jd.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='io/hpmud/jd.c' object='libhpmud_la-jd.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libhpmud_la_CFLAGS) $(CFLAGS) -c -o libhpmud_la-jd.lo `test -f 'io/hpmud/jd.c' || echo '$(srcdir)/'`io/hpmud/jd.c
+
+libhpmud_la-pp.lo: io/hpmud/pp.c
+@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libhpmud_la_CFLAGS) $(CFLAGS) -MT libhpmud_la-pp.lo -MD -MP -MF $(DEPDIR)/libhpmud_la-pp.Tpo -c -o libhpmud_la-pp.lo `test -f 'io/hpmud/pp.c' || echo '$(srcdir)/'`io/hpmud/pp.c
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libhpmud_la-pp.Tpo $(DEPDIR)/libhpmud_la-pp.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='io/hpmud/pp.c' object='libhpmud_la-pp.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libhpmud_la_CFLAGS) $(CFLAGS) -c -o libhpmud_la-pp.lo `test -f 'io/hpmud/pp.c' || echo '$(srcdir)/'`io/hpmud/pp.c
+
+libsane_hpaio_la-hpaio.lo: scan/sane/hpaio.c
+@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libsane_hpaio_la_CFLAGS) $(CFLAGS) -MT libsane_hpaio_la-hpaio.lo -MD -MP -MF $(DEPDIR)/libsane_hpaio_la-hpaio.Tpo -c -o libsane_hpaio_la-hpaio.lo `test -f 'scan/sane/hpaio.c' || echo '$(srcdir)/'`scan/sane/hpaio.c
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libsane_hpaio_la-hpaio.Tpo $(DEPDIR)/libsane_hpaio_la-hpaio.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='scan/sane/hpaio.c' object='libsane_hpaio_la-hpaio.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libsane_hpaio_la_CFLAGS) $(CFLAGS) -c -o libsane_hpaio_la-hpaio.lo `test -f 'scan/sane/hpaio.c' || echo '$(srcdir)/'`scan/sane/hpaio.c
+
+libsane_hpaio_la-mfpdtf.lo: scan/sane/mfpdtf.c
+@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libsane_hpaio_la_CFLAGS) $(CFLAGS) -MT libsane_hpaio_la-mfpdtf.lo -MD -MP -MF $(DEPDIR)/libsane_hpaio_la-mfpdtf.Tpo -c -o libsane_hpaio_la-mfpdtf.lo `test -f 'scan/sane/mfpdtf.c' || echo '$(srcdir)/'`scan/sane/mfpdtf.c
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libsane_hpaio_la-mfpdtf.Tpo $(DEPDIR)/libsane_hpaio_la-mfpdtf.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='scan/sane/mfpdtf.c' object='libsane_hpaio_la-mfpdtf.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libsane_hpaio_la_CFLAGS) $(CFLAGS) -c -o libsane_hpaio_la-mfpdtf.lo `test -f 'scan/sane/mfpdtf.c' || echo '$(srcdir)/'`scan/sane/mfpdtf.c
+
+libsane_hpaio_la-pml.lo: scan/sane/pml.c
+@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libsane_hpaio_la_CFLAGS) $(CFLAGS) -MT libsane_hpaio_la-pml.lo -MD -MP -MF $(DEPDIR)/libsane_hpaio_la-pml.Tpo -c -o libsane_hpaio_la-pml.lo `test -f 'scan/sane/pml.c' || echo '$(srcdir)/'`scan/sane/pml.c
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libsane_hpaio_la-pml.Tpo $(DEPDIR)/libsane_hpaio_la-pml.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='scan/sane/pml.c' object='libsane_hpaio_la-pml.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libsane_hpaio_la_CFLAGS) $(CFLAGS) -c -o libsane_hpaio_la-pml.lo `test -f 'scan/sane/pml.c' || echo '$(srcdir)/'`scan/sane/pml.c
+
+libsane_hpaio_la-scl.lo: scan/sane/scl.c
+@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libsane_hpaio_la_CFLAGS) $(CFLAGS) -MT libsane_hpaio_la-scl.lo -MD -MP -MF $(DEPDIR)/libsane_hpaio_la-scl.Tpo -c -o libsane_hpaio_la-scl.lo `test -f 'scan/sane/scl.c' || echo '$(srcdir)/'`scan/sane/scl.c
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libsane_hpaio_la-scl.Tpo $(DEPDIR)/libsane_hpaio_la-scl.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='scan/sane/scl.c' object='libsane_hpaio_la-scl.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libsane_hpaio_la_CFLAGS) $(CFLAGS) -c -o libsane_hpaio_la-scl.lo `test -f 'scan/sane/scl.c' || echo '$(srcdir)/'`scan/sane/scl.c
+
+libsane_hpaio_la-io.lo: scan/sane/io.c
+@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libsane_hpaio_la_CFLAGS) $(CFLAGS) -MT libsane_hpaio_la-io.lo -MD -MP -MF $(DEPDIR)/libsane_hpaio_la-io.Tpo -c -o libsane_hpaio_la-io.lo `test -f 'scan/sane/io.c' || echo '$(srcdir)/'`scan/sane/io.c
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libsane_hpaio_la-io.Tpo $(DEPDIR)/libsane_hpaio_la-io.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='scan/sane/io.c' object='libsane_hpaio_la-io.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libsane_hpaio_la_CFLAGS) $(CFLAGS) -c -o libsane_hpaio_la-io.lo `test -f 'scan/sane/io.c' || echo '$(srcdir)/'`scan/sane/io.c
+
+libsane_hpaio_la-common.lo: scan/sane/common.c
+@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libsane_hpaio_la_CFLAGS) $(CFLAGS) -MT libsane_hpaio_la-common.lo -MD -MP -MF $(DEPDIR)/libsane_hpaio_la-common.Tpo -c -o libsane_hpaio_la-common.lo `test -f 'scan/sane/common.c' || echo '$(srcdir)/'`scan/sane/common.c
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libsane_hpaio_la-common.Tpo $(DEPDIR)/libsane_hpaio_la-common.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='scan/sane/common.c' object='libsane_hpaio_la-common.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libsane_hpaio_la_CFLAGS) $(CFLAGS) -c -o libsane_hpaio_la-common.lo `test -f 'scan/sane/common.c' || echo '$(srcdir)/'`scan/sane/common.c
+
+libsane_hpaio_la-sanei_init_debug.lo: scan/sane/sanei_init_debug.c
+@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libsane_hpaio_la_CFLAGS) $(CFLAGS) -MT libsane_hpaio_la-sanei_init_debug.lo -MD -MP -MF $(DEPDIR)/libsane_hpaio_la-sanei_init_debug.Tpo -c -o libsane_hpaio_la-sanei_init_debug.lo `test -f 'scan/sane/sanei_init_debug.c' || echo '$(srcdir)/'`scan/sane/sanei_init_debug.c
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libsane_hpaio_la-sanei_init_debug.Tpo $(DEPDIR)/libsane_hpaio_la-sanei_init_debug.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='scan/sane/sanei_init_debug.c' object='libsane_hpaio_la-sanei_init_debug.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libsane_hpaio_la_CFLAGS) $(CFLAGS) -c -o libsane_hpaio_la-sanei_init_debug.lo `test -f 'scan/sane/sanei_init_debug.c' || echo '$(srcdir)/'`scan/sane/sanei_init_debug.c
+
+libsane_hpaio_la-marvell.lo: scan/sane/marvell.c
+@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libsane_hpaio_la_CFLAGS) $(CFLAGS) -MT libsane_hpaio_la-marvell.lo -MD -MP -MF $(DEPDIR)/libsane_hpaio_la-marvell.Tpo -c -o libsane_hpaio_la-marvell.lo `test -f 'scan/sane/marvell.c' || echo '$(srcdir)/'`scan/sane/marvell.c
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libsane_hpaio_la-marvell.Tpo $(DEPDIR)/libsane_hpaio_la-marvell.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='scan/sane/marvell.c' object='libsane_hpaio_la-marvell.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libsane_hpaio_la_CFLAGS) $(CFLAGS) -c -o libsane_hpaio_la-marvell.lo `test -f 'scan/sane/marvell.c' || echo '$(srcdir)/'`scan/sane/marvell.c
+
+libsane_hpaio_la-soapht.lo: scan/sane/soapht.c
+@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libsane_hpaio_la_CFLAGS) $(CFLAGS) -MT libsane_hpaio_la-soapht.lo -MD -MP -MF $(DEPDIR)/libsane_hpaio_la-soapht.Tpo -c -o libsane_hpaio_la-soapht.lo `test -f 'scan/sane/soapht.c' || echo '$(srcdir)/'`scan/sane/soapht.c
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libsane_hpaio_la-soapht.Tpo $(DEPDIR)/libsane_hpaio_la-soapht.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='scan/sane/soapht.c' object='libsane_hpaio_la-soapht.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libsane_hpaio_la_CFLAGS) $(CFLAGS) -c -o libsane_hpaio_la-soapht.lo `test -f 'scan/sane/soapht.c' || echo '$(srcdir)/'`scan/sane/soapht.c
+
+libsane_hpaio_la-soap.lo: scan/sane/soap.c
+@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libsane_hpaio_la_CFLAGS) $(CFLAGS) -MT libsane_hpaio_la-soap.lo -MD -MP -MF $(DEPDIR)/libsane_hpaio_la-soap.Tpo -c -o libsane_hpaio_la-soap.lo `test -f 'scan/sane/soap.c' || echo '$(srcdir)/'`scan/sane/soap.c
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libsane_hpaio_la-soap.Tpo $(DEPDIR)/libsane_hpaio_la-soap.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='scan/sane/soap.c' object='libsane_hpaio_la-soap.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libsane_hpaio_la_CFLAGS) $(CFLAGS) -c -o libsane_hpaio_la-soap.lo `test -f 'scan/sane/soap.c' || echo '$(srcdir)/'`scan/sane/soap.c
+
+libsane_hpaio_la-xml.lo: scan/sane/xml.c
+@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libsane_hpaio_la_CFLAGS) $(CFLAGS) -MT libsane_hpaio_la-xml.lo -MD -MP -MF $(DEPDIR)/libsane_hpaio_la-xml.Tpo -c -o libsane_hpaio_la-xml.lo `test -f 'scan/sane/xml.c' || echo '$(srcdir)/'`scan/sane/xml.c
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libsane_hpaio_la-xml.Tpo $(DEPDIR)/libsane_hpaio_la-xml.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='scan/sane/xml.c' object='libsane_hpaio_la-xml.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libsane_hpaio_la_CFLAGS) $(CFLAGS) -c -o libsane_hpaio_la-xml.lo `test -f 'scan/sane/xml.c' || echo '$(srcdir)/'`scan/sane/xml.c
+
+libsane_hpaio_la-ledm.lo: scan/sane/ledm.c
+@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libsane_hpaio_la_CFLAGS) $(CFLAGS) -MT libsane_hpaio_la-ledm.lo -MD -MP -MF $(DEPDIR)/libsane_hpaio_la-ledm.Tpo -c -o libsane_hpaio_la-ledm.lo `test -f 'scan/sane/ledm.c' || echo '$(srcdir)/'`scan/sane/ledm.c
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libsane_hpaio_la-ledm.Tpo $(DEPDIR)/libsane_hpaio_la-ledm.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='scan/sane/ledm.c' object='libsane_hpaio_la-ledm.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libsane_hpaio_la_CFLAGS) $(CFLAGS) -c -o libsane_hpaio_la-ledm.lo `test -f 'scan/sane/ledm.c' || echo '$(srcdir)/'`scan/sane/ledm.c
+
+libsane_hpaio_la-bb_ledm.lo: scan/sane/bb_ledm.c
+@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libsane_hpaio_la_CFLAGS) $(CFLAGS) -MT libsane_hpaio_la-bb_ledm.lo -MD -MP -MF $(DEPDIR)/libsane_hpaio_la-bb_ledm.Tpo -c -o libsane_hpaio_la-bb_ledm.lo `test -f 'scan/sane/bb_ledm.c' || echo '$(srcdir)/'`scan/sane/bb_ledm.c
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libsane_hpaio_la-bb_ledm.Tpo $(DEPDIR)/libsane_hpaio_la-bb_ledm.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='scan/sane/bb_ledm.c' object='libsane_hpaio_la-bb_ledm.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libsane_hpaio_la_CFLAGS) $(CFLAGS) -c -o libsane_hpaio_la-bb_ledm.lo `test -f 'scan/sane/bb_ledm.c' || echo '$(srcdir)/'`scan/sane/bb_ledm.c
+
+libsane_hpaio_la-http.lo: scan/sane/http.c
+@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libsane_hpaio_la_CFLAGS) $(CFLAGS) -MT libsane_hpaio_la-http.lo -MD -MP -MF $(DEPDIR)/libsane_hpaio_la-http.Tpo -c -o libsane_hpaio_la-http.lo `test -f 'scan/sane/http.c' || echo '$(srcdir)/'`scan/sane/http.c
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libsane_hpaio_la-http.Tpo $(DEPDIR)/libsane_hpaio_la-http.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='scan/sane/http.c' object='libsane_hpaio_la-http.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libsane_hpaio_la_CFLAGS) $(CFLAGS) -c -o libsane_hpaio_la-http.lo `test -f 'scan/sane/http.c' || echo '$(srcdir)/'`scan/sane/http.c
+
+pcardext_la-pcardext.lo: pcard/pcardext/pcardext.c
+@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcardext_la_CFLAGS) $(CFLAGS) -MT pcardext_la-pcardext.lo -MD -MP -MF $(DEPDIR)/pcardext_la-pcardext.Tpo -c -o pcardext_la-pcardext.lo `test -f 'pcard/pcardext/pcardext.c' || echo '$(srcdir)/'`pcard/pcardext/pcardext.c
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pcardext_la-pcardext.Tpo $(DEPDIR)/pcardext_la-pcardext.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pcard/pcardext/pcardext.c' object='pcardext_la-pcardext.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcardext_la_CFLAGS) $(CFLAGS) -c -o pcardext_la-pcardext.lo `test -f 'pcard/pcardext/pcardext.c' || echo '$(srcdir)/'`pcard/pcardext/pcardext.c
+
+pcardext_la-fat.lo: pcard/fat.c
+@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcardext_la_CFLAGS) $(CFLAGS) -MT pcardext_la-fat.lo -MD -MP -MF $(DEPDIR)/pcardext_la-fat.Tpo -c -o pcardext_la-fat.lo `test -f 'pcard/fat.c' || echo '$(srcdir)/'`pcard/fat.c
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pcardext_la-fat.Tpo $(DEPDIR)/pcardext_la-fat.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pcard/fat.c' object='pcardext_la-fat.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcardext_la_CFLAGS) $(CFLAGS) -c -o pcardext_la-fat.lo `test -f 'pcard/fat.c' || echo '$(srcdir)/'`pcard/fat.c
+
+scanext_la-scanext.lo: scan/scanext/scanext.c
+@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(scanext_la_CFLAGS) $(CFLAGS) -MT scanext_la-scanext.lo -MD -MP -MF $(DEPDIR)/scanext_la-scanext.Tpo -c -o scanext_la-scanext.lo `test -f 'scan/scanext/scanext.c' || echo '$(srcdir)/'`scan/scanext/scanext.c
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/scanext_la-scanext.Tpo $(DEPDIR)/scanext_la-scanext.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='scan/scanext/scanext.c' object='scanext_la-scanext.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(scanext_la_CFLAGS) $(CFLAGS) -c -o scanext_la-scanext.lo `test -f 'scan/scanext/scanext.c' || echo '$(srcdir)/'`scan/scanext/scanext.c
+
+hp-hp.o: prnt/backend/hp.c
+@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hp_CFLAGS) $(CFLAGS) -MT hp-hp.o -MD -MP -MF $(DEPDIR)/hp-hp.Tpo -c -o hp-hp.o `test -f 'prnt/backend/hp.c' || echo '$(srcdir)/'`prnt/backend/hp.c
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/hp-hp.Tpo $(DEPDIR)/hp-hp.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='prnt/backend/hp.c' object='hp-hp.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hp_CFLAGS) $(CFLAGS) -c -o hp-hp.o `test -f 'prnt/backend/hp.c' || echo '$(srcdir)/'`prnt/backend/hp.c
+
+hp-hp.obj: prnt/backend/hp.c
+@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hp_CFLAGS) $(CFLAGS) -MT hp-hp.obj -MD -MP -MF $(DEPDIR)/hp-hp.Tpo -c -o hp-hp.obj `if test -f 'prnt/backend/hp.c'; then $(CYGPATH_W) 'prnt/backend/hp.c'; else $(CYGPATH_W) '$(srcdir)/prnt/backend/hp.c'; fi`
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/hp-hp.Tpo $(DEPDIR)/hp-hp.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='prnt/backend/hp.c' object='hp-hp.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hp_CFLAGS) $(CFLAGS) -c -o hp-hp.obj `if test -f 'prnt/backend/hp.c'; then $(CYGPATH_W) 'prnt/backend/hp.c'; else $(CYGPATH_W) '$(srcdir)/prnt/backend/hp.c'; fi`
+
+hp_mkuri-hp-mkuri.o: io/hpmud/hp-mkuri.c
+@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hp_mkuri_CFLAGS) $(CFLAGS) -MT hp_mkuri-hp-mkuri.o -MD -MP -MF $(DEPDIR)/hp_mkuri-hp-mkuri.Tpo -c -o hp_mkuri-hp-mkuri.o `test -f 'io/hpmud/hp-mkuri.c' || echo '$(srcdir)/'`io/hpmud/hp-mkuri.c
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/hp_mkuri-hp-mkuri.Tpo $(DEPDIR)/hp_mkuri-hp-mkuri.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='io/hpmud/hp-mkuri.c' object='hp_mkuri-hp-mkuri.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hp_mkuri_CFLAGS) $(CFLAGS) -c -o hp_mkuri-hp-mkuri.o `test -f 'io/hpmud/hp-mkuri.c' || echo '$(srcdir)/'`io/hpmud/hp-mkuri.c
+
+hp_mkuri-hp-mkuri.obj: io/hpmud/hp-mkuri.c
+@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hp_mkuri_CFLAGS) $(CFLAGS) -MT hp_mkuri-hp-mkuri.obj -MD -MP -MF $(DEPDIR)/hp_mkuri-hp-mkuri.Tpo -c -o hp_mkuri-hp-mkuri.obj `if test -f 'io/hpmud/hp-mkuri.c'; then $(CYGPATH_W) 'io/hpmud/hp-mkuri.c'; else $(CYGPATH_W) '$(srcdir)/io/hpmud/hp-mkuri.c'; fi`
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/hp_mkuri-hp-mkuri.Tpo $(DEPDIR)/hp_mkuri-hp-mkuri.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='io/hpmud/hp-mkuri.c' object='hp_mkuri-hp-mkuri.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hp_mkuri_CFLAGS) $(CFLAGS) -c -o hp_mkuri-hp-mkuri.obj `if test -f 'io/hpmud/hp-mkuri.c'; then $(CYGPATH_W) 'io/hpmud/hp-mkuri.c'; else $(CYGPATH_W) '$(srcdir)/io/hpmud/hp-mkuri.c'; fi`
+
+jccolor.o: prnt/hpcups/jccolor.c
+@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT jccolor.o -MD -MP -MF $(DEPDIR)/jccolor.Tpo -c -o jccolor.o `test -f 'prnt/hpcups/jccolor.c' || echo '$(srcdir)/'`prnt/hpcups/jccolor.c
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/jccolor.Tpo $(DEPDIR)/jccolor.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='prnt/hpcups/jccolor.c' object='jccolor.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o jccolor.o `test -f 'prnt/hpcups/jccolor.c' || echo '$(srcdir)/'`prnt/hpcups/jccolor.c
+
+jccolor.obj: prnt/hpcups/jccolor.c
+@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT jccolor.obj -MD -MP -MF $(DEPDIR)/jccolor.Tpo -c -o jccolor.obj `if test -f 'prnt/hpcups/jccolor.c'; then $(CYGPATH_W) 'prnt/hpcups/jccolor.c'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/jccolor.c'; fi`
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/jccolor.Tpo $(DEPDIR)/jccolor.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='prnt/hpcups/jccolor.c' object='jccolor.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o jccolor.obj `if test -f 'prnt/hpcups/jccolor.c'; then $(CYGPATH_W) 'prnt/hpcups/jccolor.c'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/jccolor.c'; fi`
+
+jdatadbf.o: prnt/hpcups/jdatadbf.c
+@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT jdatadbf.o -MD -MP -MF $(DEPDIR)/jdatadbf.Tpo -c -o jdatadbf.o `test -f 'prnt/hpcups/jdatadbf.c' || echo '$(srcdir)/'`prnt/hpcups/jdatadbf.c
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/jdatadbf.Tpo $(DEPDIR)/jdatadbf.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='prnt/hpcups/jdatadbf.c' object='jdatadbf.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o jdatadbf.o `test -f 'prnt/hpcups/jdatadbf.c' || echo '$(srcdir)/'`prnt/hpcups/jdatadbf.c
+
+jdatadbf.obj: prnt/hpcups/jdatadbf.c
+@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT jdatadbf.obj -MD -MP -MF $(DEPDIR)/jdatadbf.Tpo -c -o jdatadbf.obj `if test -f 'prnt/hpcups/jdatadbf.c'; then $(CYGPATH_W) 'prnt/hpcups/jdatadbf.c'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/jdatadbf.c'; fi`
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/jdatadbf.Tpo $(DEPDIR)/jdatadbf.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='prnt/hpcups/jdatadbf.c' object='jdatadbf.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o jdatadbf.obj `if test -f 'prnt/hpcups/jdatadbf.c'; then $(CYGPATH_W) 'prnt/hpcups/jdatadbf.c'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/jdatadbf.c'; fi`
+
+hpijs-ijs_server.o: prnt/hpijs/ijs_server.c
+@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpijs_CFLAGS) $(CFLAGS) -MT hpijs-ijs_server.o -MD -MP -MF $(DEPDIR)/hpijs-ijs_server.Tpo -c -o hpijs-ijs_server.o `test -f 'prnt/hpijs/ijs_server.c' || echo '$(srcdir)/'`prnt/hpijs/ijs_server.c
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/hpijs-ijs_server.Tpo $(DEPDIR)/hpijs-ijs_server.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='prnt/hpijs/ijs_server.c' object='hpijs-ijs_server.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpijs_CFLAGS) $(CFLAGS) -c -o hpijs-ijs_server.o `test -f 'prnt/hpijs/ijs_server.c' || echo '$(srcdir)/'`prnt/hpijs/ijs_server.c
+
+hpijs-ijs_server.obj: prnt/hpijs/ijs_server.c
+@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpijs_CFLAGS) $(CFLAGS) -MT hpijs-ijs_server.obj -MD -MP -MF $(DEPDIR)/hpijs-ijs_server.Tpo -c -o hpijs-ijs_server.obj `if test -f 'prnt/hpijs/ijs_server.c'; then $(CYGPATH_W) 'prnt/hpijs/ijs_server.c'; else $(CYGPATH_W) '$(srcdir)/prnt/hpijs/ijs_server.c'; fi`
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/hpijs-ijs_server.Tpo $(DEPDIR)/hpijs-ijs_server.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='prnt/hpijs/ijs_server.c' object='hpijs-ijs_server.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpijs_CFLAGS) $(CFLAGS) -c -o hpijs-ijs_server.obj `if test -f 'prnt/hpijs/ijs_server.c'; then $(CYGPATH_W) 'prnt/hpijs/ijs_server.c'; else $(CYGPATH_W) '$(srcdir)/prnt/hpijs/ijs_server.c'; fi`
+
+hpijs-ijs.o: prnt/hpijs/ijs.c
+@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpijs_CFLAGS) $(CFLAGS) -MT hpijs-ijs.o -MD -MP -MF $(DEPDIR)/hpijs-ijs.Tpo -c -o hpijs-ijs.o `test -f 'prnt/hpijs/ijs.c' || echo '$(srcdir)/'`prnt/hpijs/ijs.c
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/hpijs-ijs.Tpo $(DEPDIR)/hpijs-ijs.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='prnt/hpijs/ijs.c' object='hpijs-ijs.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpijs_CFLAGS) $(CFLAGS) -c -o hpijs-ijs.o `test -f 'prnt/hpijs/ijs.c' || echo '$(srcdir)/'`prnt/hpijs/ijs.c
+
+hpijs-ijs.obj: prnt/hpijs/ijs.c
+@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpijs_CFLAGS) $(CFLAGS) -MT hpijs-ijs.obj -MD -MP -MF $(DEPDIR)/hpijs-ijs.Tpo -c -o hpijs-ijs.obj `if test -f 'prnt/hpijs/ijs.c'; then $(CYGPATH_W) 'prnt/hpijs/ijs.c'; else $(CYGPATH_W) '$(srcdir)/prnt/hpijs/ijs.c'; fi`
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/hpijs-ijs.Tpo $(DEPDIR)/hpijs-ijs.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='prnt/hpijs/ijs.c' object='hpijs-ijs.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpijs_CFLAGS) $(CFLAGS) -c -o hpijs-ijs.obj `if test -f 'prnt/hpijs/ijs.c'; then $(CYGPATH_W) 'prnt/hpijs/ijs.c'; else $(CYGPATH_W) '$(srcdir)/prnt/hpijs/ijs.c'; fi`
+
+hpijs-hpiom.o: prnt/hpijs/hpiom.c
+@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpijs_CFLAGS) $(CFLAGS) -MT hpijs-hpiom.o -MD -MP -MF $(DEPDIR)/hpijs-hpiom.Tpo -c -o hpijs-hpiom.o `test -f 'prnt/hpijs/hpiom.c' || echo '$(srcdir)/'`prnt/hpijs/hpiom.c
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/hpijs-hpiom.Tpo $(DEPDIR)/hpijs-hpiom.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='prnt/hpijs/hpiom.c' object='hpijs-hpiom.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpijs_CFLAGS) $(CFLAGS) -c -o hpijs-hpiom.o `test -f 'prnt/hpijs/hpiom.c' || echo '$(srcdir)/'`prnt/hpijs/hpiom.c
+
+hpijs-hpiom.obj: prnt/hpijs/hpiom.c
+@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpijs_CFLAGS) $(CFLAGS) -MT hpijs-hpiom.obj -MD -MP -MF $(DEPDIR)/hpijs-hpiom.Tpo -c -o hpijs-hpiom.obj `if test -f 'prnt/hpijs/hpiom.c'; then $(CYGPATH_W) 'prnt/hpijs/hpiom.c'; else $(CYGPATH_W) '$(srcdir)/prnt/hpijs/hpiom.c'; fi`
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/hpijs-hpiom.Tpo $(DEPDIR)/hpijs-hpiom.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='prnt/hpijs/hpiom.c' object='hpijs-hpiom.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpijs_CFLAGS) $(CFLAGS) -c -o hpijs-hpiom.obj `if test -f 'prnt/hpijs/hpiom.c'; then $(CYGPATH_W) 'prnt/hpijs/hpiom.c'; else $(CYGPATH_W) '$(srcdir)/prnt/hpijs/hpiom.c'; fi`
+
+hplipjs.o: prnt/filters/hplipjs.c
+@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT hplipjs.o -MD -MP -MF $(DEPDIR)/hplipjs.Tpo -c -o hplipjs.o `test -f 'prnt/filters/hplipjs.c' || echo '$(srcdir)/'`prnt/filters/hplipjs.c
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/hplipjs.Tpo $(DEPDIR)/hplipjs.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='prnt/filters/hplipjs.c' object='hplipjs.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o hplipjs.o `test -f 'prnt/filters/hplipjs.c' || echo '$(srcdir)/'`prnt/filters/hplipjs.c
+
+hplipjs.obj: prnt/filters/hplipjs.c
+@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT hplipjs.obj -MD -MP -MF $(DEPDIR)/hplipjs.Tpo -c -o hplipjs.obj `if test -f 'prnt/filters/hplipjs.c'; then $(CYGPATH_W) 'prnt/filters/hplipjs.c'; else $(CYGPATH_W) '$(srcdir)/prnt/filters/hplipjs.c'; fi`
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/hplipjs.Tpo $(DEPDIR)/hplipjs.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='prnt/filters/hplipjs.c' object='hplipjs.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o hplipjs.obj `if test -f 'prnt/filters/hplipjs.c'; then $(CYGPATH_W) 'prnt/filters/hplipjs.c'; else $(CYGPATH_W) '$(srcdir)/prnt/filters/hplipjs.c'; fi`
+
+hppsfilter.o: prnt/hpps/hppsfilter.c
+@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT hppsfilter.o -MD -MP -MF $(DEPDIR)/hppsfilter.Tpo -c -o hppsfilter.o `test -f 'prnt/hpps/hppsfilter.c' || echo '$(srcdir)/'`prnt/hpps/hppsfilter.c
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/hppsfilter.Tpo $(DEPDIR)/hppsfilter.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='prnt/hpps/hppsfilter.c' object='hppsfilter.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o hppsfilter.o `test -f 'prnt/hpps/hppsfilter.c' || echo '$(srcdir)/'`prnt/hpps/hppsfilter.c
+
+hppsfilter.obj: prnt/hpps/hppsfilter.c
+@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT hppsfilter.obj -MD -MP -MF $(DEPDIR)/hppsfilter.Tpo -c -o hppsfilter.obj `if test -f 'prnt/hpps/hppsfilter.c'; then $(CYGPATH_W) 'prnt/hpps/hppsfilter.c'; else $(CYGPATH_W) '$(srcdir)/prnt/hpps/hppsfilter.c'; fi`
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/hppsfilter.Tpo $(DEPDIR)/hppsfilter.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='prnt/hpps/hppsfilter.c' object='hppsfilter.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o hppsfilter.obj `if test -f 'prnt/hpps/hppsfilter.c'; then $(CYGPATH_W) 'prnt/hpps/hppsfilter.c'; else $(CYGPATH_W) '$(srcdir)/prnt/hpps/hppsfilter.c'; fi`
+
+ptest.o: pcard/ptest.c
+@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ptest.o -MD -MP -MF $(DEPDIR)/ptest.Tpo -c -o ptest.o `test -f 'pcard/ptest.c' || echo '$(srcdir)/'`pcard/ptest.c
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/ptest.Tpo $(DEPDIR)/ptest.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pcard/ptest.c' object='ptest.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ptest.o `test -f 'pcard/ptest.c' || echo '$(srcdir)/'`pcard/ptest.c
+
+ptest.obj: pcard/ptest.c
+@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ptest.obj -MD -MP -MF $(DEPDIR)/ptest.Tpo -c -o ptest.obj `if test -f 'pcard/ptest.c'; then $(CYGPATH_W) 'pcard/ptest.c'; else $(CYGPATH_W) '$(srcdir)/pcard/ptest.c'; fi`
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/ptest.Tpo $(DEPDIR)/ptest.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pcard/ptest.c' object='ptest.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ptest.obj `if test -f 'pcard/ptest.c'; then $(CYGPATH_W) 'pcard/ptest.c'; else $(CYGPATH_W) '$(srcdir)/pcard/ptest.c'; fi`
+
+fat.o: pcard/fat.c
+@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT fat.o -MD -MP -MF $(DEPDIR)/fat.Tpo -c -o fat.o `test -f 'pcard/fat.c' || echo '$(srcdir)/'`pcard/fat.c
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/fat.Tpo $(DEPDIR)/fat.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pcard/fat.c' object='fat.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o fat.o `test -f 'pcard/fat.c' || echo '$(srcdir)/'`pcard/fat.c
+
+fat.obj: pcard/fat.c
+@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT fat.obj -MD -MP -MF $(DEPDIR)/fat.Tpo -c -o fat.obj `if test -f 'pcard/fat.c'; then $(CYGPATH_W) 'pcard/fat.c'; else $(CYGPATH_W) '$(srcdir)/pcard/fat.c'; fi`
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/fat.Tpo $(DEPDIR)/fat.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pcard/fat.c' object='fat.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o fat.obj `if test -f 'pcard/fat.c'; then $(CYGPATH_W) 'pcard/fat.c'; else $(CYGPATH_W) '$(srcdir)/pcard/fat.c'; fi`
+
+.cpp.o:
+@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $<
+
+.cpp.obj:
+@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cpp.lo:
+@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $<
+
+libapdk_la-models.lo: prnt/hpijs/models.cpp
+@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -MT libapdk_la-models.lo -MD -MP -MF $(DEPDIR)/libapdk_la-models.Tpo -c -o libapdk_la-models.lo `test -f 'prnt/hpijs/models.cpp' || echo '$(srcdir)/'`prnt/hpijs/models.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libapdk_la-models.Tpo $(DEPDIR)/libapdk_la-models.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpijs/models.cpp' object='libapdk_la-models.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -c -o libapdk_la-models.lo `test -f 'prnt/hpijs/models.cpp' || echo '$(srcdir)/'`prnt/hpijs/models.cpp
+
+libapdk_la-breaks_open.lo: prnt/hpijs/breaks_open.cpp
+@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -MT libapdk_la-breaks_open.lo -MD -MP -MF $(DEPDIR)/libapdk_la-breaks_open.Tpo -c -o libapdk_la-breaks_open.lo `test -f 'prnt/hpijs/breaks_open.cpp' || echo '$(srcdir)/'`prnt/hpijs/breaks_open.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libapdk_la-breaks_open.Tpo $(DEPDIR)/libapdk_la-breaks_open.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpijs/breaks_open.cpp' object='libapdk_la-breaks_open.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -c -o libapdk_la-breaks_open.lo `test -f 'prnt/hpijs/breaks_open.cpp' || echo '$(srcdir)/'`prnt/hpijs/breaks_open.cpp
+
+libapdk_la-dj9xxvip.lo: prnt/hpijs/dj9xxvip.cpp
+@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -MT libapdk_la-dj9xxvip.lo -MD -MP -MF $(DEPDIR)/libapdk_la-dj9xxvip.Tpo -c -o libapdk_la-dj9xxvip.lo `test -f 'prnt/hpijs/dj9xxvip.cpp' || echo '$(srcdir)/'`prnt/hpijs/dj9xxvip.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libapdk_la-dj9xxvip.Tpo $(DEPDIR)/libapdk_la-dj9xxvip.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpijs/dj9xxvip.cpp' object='libapdk_la-dj9xxvip.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -c -o libapdk_la-dj9xxvip.lo `test -f 'prnt/hpijs/dj9xxvip.cpp' || echo '$(srcdir)/'`prnt/hpijs/dj9xxvip.cpp
+
+libapdk_la-dj9xx.lo: prnt/hpijs/dj9xx.cpp
+@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -MT libapdk_la-dj9xx.lo -MD -MP -MF $(DEPDIR)/libapdk_la-dj9xx.Tpo -c -o libapdk_la-dj9xx.lo `test -f 'prnt/hpijs/dj9xx.cpp' || echo '$(srcdir)/'`prnt/hpijs/dj9xx.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libapdk_la-dj9xx.Tpo $(DEPDIR)/libapdk_la-dj9xx.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpijs/dj9xx.cpp' object='libapdk_la-dj9xx.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -c -o libapdk_la-dj9xx.lo `test -f 'prnt/hpijs/dj9xx.cpp' || echo '$(srcdir)/'`prnt/hpijs/dj9xx.cpp
+
+libapdk_la-capture.lo: prnt/hpijs/capture.cpp
+@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -MT libapdk_la-capture.lo -MD -MP -MF $(DEPDIR)/libapdk_la-capture.Tpo -c -o libapdk_la-capture.lo `test -f 'prnt/hpijs/capture.cpp' || echo '$(srcdir)/'`prnt/hpijs/capture.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libapdk_la-capture.Tpo $(DEPDIR)/libapdk_la-capture.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpijs/capture.cpp' object='libapdk_la-capture.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -c -o libapdk_la-capture.lo `test -f 'prnt/hpijs/capture.cpp' || echo '$(srcdir)/'`prnt/hpijs/capture.cpp
+
+libapdk_la-colormatch.lo: prnt/hpijs/colormatch.cpp
+@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -MT libapdk_la-colormatch.lo -MD -MP -MF $(DEPDIR)/libapdk_la-colormatch.Tpo -c -o libapdk_la-colormatch.lo `test -f 'prnt/hpijs/colormatch.cpp' || echo '$(srcdir)/'`prnt/hpijs/colormatch.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libapdk_la-colormatch.Tpo $(DEPDIR)/libapdk_la-colormatch.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpijs/colormatch.cpp' object='libapdk_la-colormatch.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -c -o libapdk_la-colormatch.lo `test -f 'prnt/hpijs/colormatch.cpp' || echo '$(srcdir)/'`prnt/hpijs/colormatch.cpp
+
+libapdk_la-colormatcher_open.lo: prnt/hpijs/colormatcher_open.cpp
+@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -MT libapdk_la-colormatcher_open.lo -MD -MP -MF $(DEPDIR)/libapdk_la-colormatcher_open.Tpo -c -o libapdk_la-colormatcher_open.lo `test -f 'prnt/hpijs/colormatcher_open.cpp' || echo '$(srcdir)/'`prnt/hpijs/colormatcher_open.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libapdk_la-colormatcher_open.Tpo $(DEPDIR)/libapdk_la-colormatcher_open.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpijs/colormatcher_open.cpp' object='libapdk_la-colormatcher_open.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -c -o libapdk_la-colormatcher_open.lo `test -f 'prnt/hpijs/colormatcher_open.cpp' || echo '$(srcdir)/'`prnt/hpijs/colormatcher_open.cpp
+
+libapdk_la-compression.lo: prnt/hpijs/compression.cpp
+@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -MT libapdk_la-compression.lo -MD -MP -MF $(DEPDIR)/libapdk_la-compression.Tpo -c -o libapdk_la-compression.lo `test -f 'prnt/hpijs/compression.cpp' || echo '$(srcdir)/'`prnt/hpijs/compression.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libapdk_la-compression.Tpo $(DEPDIR)/libapdk_la-compression.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpijs/compression.cpp' object='libapdk_la-compression.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -c -o libapdk_la-compression.lo `test -f 'prnt/hpijs/compression.cpp' || echo '$(srcdir)/'`prnt/hpijs/compression.cpp
+
+libapdk_la-context2.lo: prnt/hpijs/context2.cpp
+@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -MT libapdk_la-context2.lo -MD -MP -MF $(DEPDIR)/libapdk_la-context2.Tpo -c -o libapdk_la-context2.lo `test -f 'prnt/hpijs/context2.cpp' || echo '$(srcdir)/'`prnt/hpijs/context2.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libapdk_la-context2.Tpo $(DEPDIR)/libapdk_la-context2.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpijs/context2.cpp' object='libapdk_la-context2.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -c -o libapdk_la-context2.lo `test -f 'prnt/hpijs/context2.cpp' || echo '$(srcdir)/'`prnt/hpijs/context2.cpp
+
+libapdk_la-create_so.lo: prnt/hpijs/create_so.cpp
+@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -MT libapdk_la-create_so.lo -MD -MP -MF $(DEPDIR)/libapdk_la-create_so.Tpo -c -o libapdk_la-create_so.lo `test -f 'prnt/hpijs/create_so.cpp' || echo '$(srcdir)/'`prnt/hpijs/create_so.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libapdk_la-create_so.Tpo $(DEPDIR)/libapdk_la-create_so.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpijs/create_so.cpp' object='libapdk_la-create_so.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -c -o libapdk_la-create_so.lo `test -f 'prnt/hpijs/create_so.cpp' || echo '$(srcdir)/'`prnt/hpijs/create_so.cpp
+
+libapdk_la-creator.lo: prnt/hpijs/creator.cpp
+@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -MT libapdk_la-creator.lo -MD -MP -MF $(DEPDIR)/libapdk_la-creator.Tpo -c -o libapdk_la-creator.lo `test -f 'prnt/hpijs/creator.cpp' || echo '$(srcdir)/'`prnt/hpijs/creator.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libapdk_la-creator.Tpo $(DEPDIR)/libapdk_la-creator.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpijs/creator.cpp' object='libapdk_la-creator.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -c -o libapdk_la-creator.lo `test -f 'prnt/hpijs/creator.cpp' || echo '$(srcdir)/'`prnt/hpijs/creator.cpp
+
+libapdk_la-dj600.lo: prnt/hpijs/dj600.cpp
+@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -MT libapdk_la-dj600.lo -MD -MP -MF $(DEPDIR)/libapdk_la-dj600.Tpo -c -o libapdk_la-dj600.lo `test -f 'prnt/hpijs/dj600.cpp' || echo '$(srcdir)/'`prnt/hpijs/dj600.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libapdk_la-dj600.Tpo $(DEPDIR)/libapdk_la-dj600.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpijs/dj600.cpp' object='libapdk_la-dj600.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -c -o libapdk_la-dj600.lo `test -f 'prnt/hpijs/dj600.cpp' || echo '$(srcdir)/'`prnt/hpijs/dj600.cpp
+
+libapdk_la-dj630.lo: prnt/hpijs/dj630.cpp
+@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -MT libapdk_la-dj630.lo -MD -MP -MF $(DEPDIR)/libapdk_la-dj630.Tpo -c -o libapdk_la-dj630.lo `test -f 'prnt/hpijs/dj630.cpp' || echo '$(srcdir)/'`prnt/hpijs/dj630.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libapdk_la-dj630.Tpo $(DEPDIR)/libapdk_la-dj630.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpijs/dj630.cpp' object='libapdk_la-dj630.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -c -o libapdk_la-dj630.lo `test -f 'prnt/hpijs/dj630.cpp' || echo '$(srcdir)/'`prnt/hpijs/dj630.cpp
+
+libapdk_la-dj660.lo: prnt/hpijs/dj660.cpp
+@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -MT libapdk_la-dj660.lo -MD -MP -MF $(DEPDIR)/libapdk_la-dj660.Tpo -c -o libapdk_la-dj660.lo `test -f 'prnt/hpijs/dj660.cpp' || echo '$(srcdir)/'`prnt/hpijs/dj660.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libapdk_la-dj660.Tpo $(DEPDIR)/libapdk_la-dj660.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpijs/dj660.cpp' object='libapdk_la-dj660.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -c -o libapdk_la-dj660.lo `test -f 'prnt/hpijs/dj660.cpp' || echo '$(srcdir)/'`prnt/hpijs/dj660.cpp
+
+libapdk_la-dj690.lo: prnt/hpijs/dj690.cpp
+@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -MT libapdk_la-dj690.lo -MD -MP -MF $(DEPDIR)/libapdk_la-dj690.Tpo -c -o libapdk_la-dj690.lo `test -f 'prnt/hpijs/dj690.cpp' || echo '$(srcdir)/'`prnt/hpijs/dj690.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libapdk_la-dj690.Tpo $(DEPDIR)/libapdk_la-dj690.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpijs/dj690.cpp' object='libapdk_la-dj690.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -c -o libapdk_la-dj690.lo `test -f 'prnt/hpijs/dj690.cpp' || echo '$(srcdir)/'`prnt/hpijs/dj690.cpp
+
+libapdk_la-dj6xx.lo: prnt/hpijs/dj6xx.cpp
+@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -MT libapdk_la-dj6xx.lo -MD -MP -MF $(DEPDIR)/libapdk_la-dj6xx.Tpo -c -o libapdk_la-dj6xx.lo `test -f 'prnt/hpijs/dj6xx.cpp' || echo '$(srcdir)/'`prnt/hpijs/dj6xx.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libapdk_la-dj6xx.Tpo $(DEPDIR)/libapdk_la-dj6xx.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpijs/dj6xx.cpp' object='libapdk_la-dj6xx.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -c -o libapdk_la-dj6xx.lo `test -f 'prnt/hpijs/dj6xx.cpp' || echo '$(srcdir)/'`prnt/hpijs/dj6xx.cpp
+
+libapdk_la-dj8xx.lo: prnt/hpijs/dj8xx.cpp
+@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -MT libapdk_la-dj8xx.lo -MD -MP -MF $(DEPDIR)/libapdk_la-dj8xx.Tpo -c -o libapdk_la-dj8xx.lo `test -f 'prnt/hpijs/dj8xx.cpp' || echo '$(srcdir)/'`prnt/hpijs/dj8xx.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libapdk_la-dj8xx.Tpo $(DEPDIR)/libapdk_la-dj8xx.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpijs/dj8xx.cpp' object='libapdk_la-dj8xx.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -c -o libapdk_la-dj8xx.lo `test -f 'prnt/hpijs/dj8xx.cpp' || echo '$(srcdir)/'`prnt/hpijs/dj8xx.cpp
+
+libapdk_la-dj600_maps.lo: prnt/hpijs/dj600_maps.cpp
+@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -MT libapdk_la-dj600_maps.lo -MD -MP -MF $(DEPDIR)/libapdk_la-dj600_maps.Tpo -c -o libapdk_la-dj600_maps.lo `test -f 'prnt/hpijs/dj600_maps.cpp' || echo '$(srcdir)/'`prnt/hpijs/dj600_maps.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libapdk_la-dj600_maps.Tpo $(DEPDIR)/libapdk_la-dj600_maps.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpijs/dj600_maps.cpp' object='libapdk_la-dj600_maps.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -c -o libapdk_la-dj600_maps.lo `test -f 'prnt/hpijs/dj600_maps.cpp' || echo '$(srcdir)/'`prnt/hpijs/dj600_maps.cpp
+
+libapdk_la-dj660_maps.lo: prnt/hpijs/dj660_maps.cpp
+@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -MT libapdk_la-dj660_maps.lo -MD -MP -MF $(DEPDIR)/libapdk_la-dj660_maps.Tpo -c -o libapdk_la-dj660_maps.lo `test -f 'prnt/hpijs/dj660_maps.cpp' || echo '$(srcdir)/'`prnt/hpijs/dj660_maps.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libapdk_la-dj660_maps.Tpo $(DEPDIR)/libapdk_la-dj660_maps.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpijs/dj660_maps.cpp' object='libapdk_la-dj660_maps.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -c -o libapdk_la-dj660_maps.lo `test -f 'prnt/hpijs/dj660_maps.cpp' || echo '$(srcdir)/'`prnt/hpijs/dj660_maps.cpp
+
+libapdk_la-dj690_maps.lo: prnt/hpijs/dj690_maps.cpp
+@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -MT libapdk_la-dj690_maps.lo -MD -MP -MF $(DEPDIR)/libapdk_la-dj690_maps.Tpo -c -o libapdk_la-dj690_maps.lo `test -f 'prnt/hpijs/dj690_maps.cpp' || echo '$(srcdir)/'`prnt/hpijs/dj690_maps.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libapdk_la-dj690_maps.Tpo $(DEPDIR)/libapdk_la-dj690_maps.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpijs/dj690_maps.cpp' object='libapdk_la-dj690_maps.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -c -o libapdk_la-dj690_maps.lo `test -f 'prnt/hpijs/dj690_maps.cpp' || echo '$(srcdir)/'`prnt/hpijs/dj690_maps.cpp
+
+libapdk_la-dj895_maps.lo: prnt/hpijs/dj895_maps.cpp
+@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -MT libapdk_la-dj895_maps.lo -MD -MP -MF $(DEPDIR)/libapdk_la-dj895_maps.Tpo -c -o libapdk_la-dj895_maps.lo `test -f 'prnt/hpijs/dj895_maps.cpp' || echo '$(srcdir)/'`prnt/hpijs/dj895_maps.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libapdk_la-dj895_maps.Tpo $(DEPDIR)/libapdk_la-dj895_maps.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpijs/dj895_maps.cpp' object='libapdk_la-dj895_maps.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -c -o libapdk_la-dj895_maps.lo `test -f 'prnt/hpijs/dj895_maps.cpp' || echo '$(srcdir)/'`prnt/hpijs/dj895_maps.cpp
+
+libapdk_la-dj895_maps2.lo: prnt/hpijs/dj895_maps2.cpp
+@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -MT libapdk_la-dj895_maps2.lo -MD -MP -MF $(DEPDIR)/libapdk_la-dj895_maps2.Tpo -c -o libapdk_la-dj895_maps2.lo `test -f 'prnt/hpijs/dj895_maps2.cpp' || echo '$(srcdir)/'`prnt/hpijs/dj895_maps2.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libapdk_la-dj895_maps2.Tpo $(DEPDIR)/libapdk_la-dj895_maps2.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpijs/dj895_maps2.cpp' object='libapdk_la-dj895_maps2.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -c -o libapdk_la-dj895_maps2.lo `test -f 'prnt/hpijs/dj895_maps2.cpp' || echo '$(srcdir)/'`prnt/hpijs/dj895_maps2.cpp
+
+libapdk_la-dj970_maps.lo: prnt/hpijs/dj970_maps.cpp
+@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -MT libapdk_la-dj970_maps.lo -MD -MP -MF $(DEPDIR)/libapdk_la-dj970_maps.Tpo -c -o libapdk_la-dj970_maps.lo `test -f 'prnt/hpijs/dj970_maps.cpp' || echo '$(srcdir)/'`prnt/hpijs/dj970_maps.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libapdk_la-dj970_maps.Tpo $(DEPDIR)/libapdk_la-dj970_maps.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpijs/dj970_maps.cpp' object='libapdk_la-dj970_maps.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -c -o libapdk_la-dj970_maps.lo `test -f 'prnt/hpijs/dj970_maps.cpp' || echo '$(srcdir)/'`prnt/hpijs/dj970_maps.cpp
+
+libapdk_la-dj970_maps2.lo: prnt/hpijs/dj970_maps2.cpp
+@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -MT libapdk_la-dj970_maps2.lo -MD -MP -MF $(DEPDIR)/libapdk_la-dj970_maps2.Tpo -c -o libapdk_la-dj970_maps2.lo `test -f 'prnt/hpijs/dj970_maps2.cpp' || echo '$(srcdir)/'`prnt/hpijs/dj970_maps2.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libapdk_la-dj970_maps2.Tpo $(DEPDIR)/libapdk_la-dj970_maps2.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpijs/dj970_maps2.cpp' object='libapdk_la-dj970_maps2.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -c -o libapdk_la-dj970_maps2.lo `test -f 'prnt/hpijs/dj970_maps2.cpp' || echo '$(srcdir)/'`prnt/hpijs/dj970_maps2.cpp
+
+libapdk_la-dj970_maps3.lo: prnt/hpijs/dj970_maps3.cpp
+@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -MT libapdk_la-dj970_maps3.lo -MD -MP -MF $(DEPDIR)/libapdk_la-dj970_maps3.Tpo -c -o libapdk_la-dj970_maps3.lo `test -f 'prnt/hpijs/dj970_maps3.cpp' || echo '$(srcdir)/'`prnt/hpijs/dj970_maps3.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libapdk_la-dj970_maps3.Tpo $(DEPDIR)/libapdk_la-dj970_maps3.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpijs/dj970_maps3.cpp' object='libapdk_la-dj970_maps3.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -c -o libapdk_la-dj970_maps3.lo `test -f 'prnt/hpijs/dj970_maps3.cpp' || echo '$(srcdir)/'`prnt/hpijs/dj970_maps3.cpp
+
+libapdk_la-filterhpa.lo: prnt/hpijs/filterhpa.cpp
+@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -MT libapdk_la-filterhpa.lo -MD -MP -MF $(DEPDIR)/libapdk_la-filterhpa.Tpo -c -o libapdk_la-filterhpa.lo `test -f 'prnt/hpijs/filterhpa.cpp' || echo '$(srcdir)/'`prnt/hpijs/filterhpa.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libapdk_la-filterhpa.Tpo $(DEPDIR)/libapdk_la-filterhpa.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpijs/filterhpa.cpp' object='libapdk_la-filterhpa.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -c -o libapdk_la-filterhpa.lo `test -f 'prnt/hpijs/filterhpa.cpp' || echo '$(srcdir)/'`prnt/hpijs/filterhpa.cpp
+
+libapdk_la-apollo21xx.lo: prnt/hpijs/apollo21xx.cpp
+@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -MT libapdk_la-apollo21xx.lo -MD -MP -MF $(DEPDIR)/libapdk_la-apollo21xx.Tpo -c -o libapdk_la-apollo21xx.lo `test -f 'prnt/hpijs/apollo21xx.cpp' || echo '$(srcdir)/'`prnt/hpijs/apollo21xx.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libapdk_la-apollo21xx.Tpo $(DEPDIR)/libapdk_la-apollo21xx.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpijs/apollo21xx.cpp' object='libapdk_la-apollo21xx.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -c -o libapdk_la-apollo21xx.lo `test -f 'prnt/hpijs/apollo21xx.cpp' || echo '$(srcdir)/'`prnt/hpijs/apollo21xx.cpp
+
+libapdk_la-apollo2560.lo: prnt/hpijs/apollo2560.cpp
+@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -MT libapdk_la-apollo2560.lo -MD -MP -MF $(DEPDIR)/libapdk_la-apollo2560.Tpo -c -o libapdk_la-apollo2560.lo `test -f 'prnt/hpijs/apollo2560.cpp' || echo '$(srcdir)/'`prnt/hpijs/apollo2560.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libapdk_la-apollo2560.Tpo $(DEPDIR)/libapdk_la-apollo2560.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpijs/apollo2560.cpp' object='libapdk_la-apollo2560.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -c -o libapdk_la-apollo2560.lo `test -f 'prnt/hpijs/apollo2560.cpp' || echo '$(srcdir)/'`prnt/hpijs/apollo2560.cpp
+
+libapdk_la-apollo2xxx.lo: prnt/hpijs/apollo2xxx.cpp
+@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -MT libapdk_la-apollo2xxx.lo -MD -MP -MF $(DEPDIR)/libapdk_la-apollo2xxx.Tpo -c -o libapdk_la-apollo2xxx.lo `test -f 'prnt/hpijs/apollo2xxx.cpp' || echo '$(srcdir)/'`prnt/hpijs/apollo2xxx.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libapdk_la-apollo2xxx.Tpo $(DEPDIR)/libapdk_la-apollo2xxx.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpijs/apollo2xxx.cpp' object='libapdk_la-apollo2xxx.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -c -o libapdk_la-apollo2xxx.lo `test -f 'prnt/hpijs/apollo2xxx.cpp' || echo '$(srcdir)/'`prnt/hpijs/apollo2xxx.cpp
+
+libapdk_la-dj8x5.lo: prnt/hpijs/dj8x5.cpp
+@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -MT libapdk_la-dj8x5.lo -MD -MP -MF $(DEPDIR)/libapdk_la-dj8x5.Tpo -c -o libapdk_la-dj8x5.lo `test -f 'prnt/hpijs/dj8x5.cpp' || echo '$(srcdir)/'`prnt/hpijs/dj8x5.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libapdk_la-dj8x5.Tpo $(DEPDIR)/libapdk_la-dj8x5.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpijs/dj8x5.cpp' object='libapdk_la-dj8x5.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -c -o libapdk_la-dj8x5.lo `test -f 'prnt/hpijs/dj8x5.cpp' || echo '$(srcdir)/'`prnt/hpijs/dj8x5.cpp
+
+libapdk_la-psp100.lo: prnt/hpijs/psp100.cpp
+@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -MT libapdk_la-psp100.lo -MD -MP -MF $(DEPDIR)/libapdk_la-psp100.Tpo -c -o libapdk_la-psp100.lo `test -f 'prnt/hpijs/psp100.cpp' || echo '$(srcdir)/'`prnt/hpijs/psp100.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libapdk_la-psp100.Tpo $(DEPDIR)/libapdk_la-psp100.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpijs/psp100.cpp' object='libapdk_la-psp100.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -c -o libapdk_la-psp100.lo `test -f 'prnt/hpijs/psp100.cpp' || echo '$(srcdir)/'`prnt/hpijs/psp100.cpp
+
+libapdk_la-phobos_cmaps.lo: prnt/hpijs/phobos_cmaps.cpp
+@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -MT libapdk_la-phobos_cmaps.lo -MD -MP -MF $(DEPDIR)/libapdk_la-phobos_cmaps.Tpo -c -o libapdk_la-phobos_cmaps.lo `test -f 'prnt/hpijs/phobos_cmaps.cpp' || echo '$(srcdir)/'`prnt/hpijs/phobos_cmaps.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libapdk_la-phobos_cmaps.Tpo $(DEPDIR)/libapdk_la-phobos_cmaps.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpijs/phobos_cmaps.cpp' object='libapdk_la-phobos_cmaps.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -c -o libapdk_la-phobos_cmaps.lo `test -f 'prnt/hpijs/phobos_cmaps.cpp' || echo '$(srcdir)/'`prnt/hpijs/phobos_cmaps.cpp
+
+libapdk_la-dj350.lo: prnt/hpijs/dj350.cpp
+@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -MT libapdk_la-dj350.lo -MD -MP -MF $(DEPDIR)/libapdk_la-dj350.Tpo -c -o libapdk_la-dj350.lo `test -f 'prnt/hpijs/dj350.cpp' || echo '$(srcdir)/'`prnt/hpijs/dj350.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libapdk_la-dj350.Tpo $(DEPDIR)/libapdk_la-dj350.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpijs/dj350.cpp' object='libapdk_la-dj350.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -c -o libapdk_la-dj350.lo `test -f 'prnt/hpijs/dj350.cpp' || echo '$(srcdir)/'`prnt/hpijs/dj350.cpp
+
+libapdk_la-halftoner.lo: prnt/hpijs/halftoner.cpp
+@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -MT libapdk_la-halftoner.lo -MD -MP -MF $(DEPDIR)/libapdk_la-halftoner.Tpo -c -o libapdk_la-halftoner.lo `test -f 'prnt/hpijs/halftoner.cpp' || echo '$(srcdir)/'`prnt/hpijs/halftoner.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libapdk_la-halftoner.Tpo $(DEPDIR)/libapdk_la-halftoner.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpijs/halftoner.cpp' object='libapdk_la-halftoner.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -c -o libapdk_la-halftoner.lo `test -f 'prnt/hpijs/halftoner.cpp' || echo '$(srcdir)/'`prnt/hpijs/halftoner.cpp
+
+libapdk_la-halftoner_open.lo: prnt/hpijs/halftoner_open.cpp
+@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -MT libapdk_la-halftoner_open.lo -MD -MP -MF $(DEPDIR)/libapdk_la-halftoner_open.Tpo -c -o libapdk_la-halftoner_open.lo `test -f 'prnt/hpijs/halftoner_open.cpp' || echo '$(srcdir)/'`prnt/hpijs/halftoner_open.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libapdk_la-halftoner_open.Tpo $(DEPDIR)/libapdk_la-halftoner_open.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpijs/halftoner_open.cpp' object='libapdk_la-halftoner_open.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -c -o libapdk_la-halftoner_open.lo `test -f 'prnt/hpijs/halftoner_open.cpp' || echo '$(srcdir)/'`prnt/hpijs/halftoner_open.cpp
+
+libapdk_la-globals.lo: prnt/hpijs/globals.cpp
+@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -MT libapdk_la-globals.lo -MD -MP -MF $(DEPDIR)/libapdk_la-globals.Tpo -c -o libapdk_la-globals.lo `test -f 'prnt/hpijs/globals.cpp' || echo '$(srcdir)/'`prnt/hpijs/globals.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libapdk_la-globals.Tpo $(DEPDIR)/libapdk_la-globals.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpijs/globals.cpp' object='libapdk_la-globals.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -c -o libapdk_la-globals.lo `test -f 'prnt/hpijs/globals.cpp' || echo '$(srcdir)/'`prnt/hpijs/globals.cpp
+
+libapdk_la-header2.lo: prnt/hpijs/header2.cpp
+@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -MT libapdk_la-header2.lo -MD -MP -MF $(DEPDIR)/libapdk_la-header2.Tpo -c -o libapdk_la-header2.lo `test -f 'prnt/hpijs/header2.cpp' || echo '$(srcdir)/'`prnt/hpijs/header2.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libapdk_la-header2.Tpo $(DEPDIR)/libapdk_la-header2.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpijs/header2.cpp' object='libapdk_la-header2.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -c -o libapdk_la-header2.lo `test -f 'prnt/hpijs/header2.cpp' || echo '$(srcdir)/'`prnt/hpijs/header2.cpp
+
+libapdk_la-htmtxhi.lo: prnt/hpijs/htmtxhi.cpp
+@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -MT libapdk_la-htmtxhi.lo -MD -MP -MF $(DEPDIR)/libapdk_la-htmtxhi.Tpo -c -o libapdk_la-htmtxhi.lo `test -f 'prnt/hpijs/htmtxhi.cpp' || echo '$(srcdir)/'`prnt/hpijs/htmtxhi.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libapdk_la-htmtxhi.Tpo $(DEPDIR)/libapdk_la-htmtxhi.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpijs/htmtxhi.cpp' object='libapdk_la-htmtxhi.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -c -o libapdk_la-htmtxhi.lo `test -f 'prnt/hpijs/htmtxhi.cpp' || echo '$(srcdir)/'`prnt/hpijs/htmtxhi.cpp
+
+libapdk_la-pmselect.lo: prnt/hpijs/pmselect.cpp
+@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -MT libapdk_la-pmselect.lo -MD -MP -MF $(DEPDIR)/libapdk_la-pmselect.Tpo -c -o libapdk_la-pmselect.lo `test -f 'prnt/hpijs/pmselect.cpp' || echo '$(srcdir)/'`prnt/hpijs/pmselect.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libapdk_la-pmselect.Tpo $(DEPDIR)/libapdk_la-pmselect.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpijs/pmselect.cpp' object='libapdk_la-pmselect.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -c -o libapdk_la-pmselect.lo `test -f 'prnt/hpijs/pmselect.cpp' || echo '$(srcdir)/'`prnt/hpijs/pmselect.cpp
+
+libapdk_la-job.lo: prnt/hpijs/job.cpp
+@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -MT libapdk_la-job.lo -MD -MP -MF $(DEPDIR)/libapdk_la-job.Tpo -c -o libapdk_la-job.lo `test -f 'prnt/hpijs/job.cpp' || echo '$(srcdir)/'`prnt/hpijs/job.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libapdk_la-job.Tpo $(DEPDIR)/libapdk_la-job.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpijs/job.cpp' object='libapdk_la-job.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -c -o libapdk_la-job.lo `test -f 'prnt/hpijs/job.cpp' || echo '$(srcdir)/'`prnt/hpijs/job.cpp
+
+libapdk_la-printer.lo: prnt/hpijs/printer.cpp
+@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -MT libapdk_la-printer.lo -MD -MP -MF $(DEPDIR)/libapdk_la-printer.Tpo -c -o libapdk_la-printer.lo `test -f 'prnt/hpijs/printer.cpp' || echo '$(srcdir)/'`prnt/hpijs/printer.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libapdk_la-printer.Tpo $(DEPDIR)/libapdk_la-printer.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpijs/printer.cpp' object='libapdk_la-printer.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -c -o libapdk_la-printer.lo `test -f 'prnt/hpijs/printer.cpp' || echo '$(srcdir)/'`prnt/hpijs/printer.cpp
+
+libapdk_la-registry.lo: prnt/hpijs/registry.cpp
+@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -MT libapdk_la-registry.lo -MD -MP -MF $(DEPDIR)/libapdk_la-registry.Tpo -c -o libapdk_la-registry.lo `test -f 'prnt/hpijs/registry.cpp' || echo '$(srcdir)/'`prnt/hpijs/registry.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libapdk_la-registry.Tpo $(DEPDIR)/libapdk_la-registry.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpijs/registry.cpp' object='libapdk_la-registry.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -c -o libapdk_la-registry.lo `test -f 'prnt/hpijs/registry.cpp' || echo '$(srcdir)/'`prnt/hpijs/registry.cpp
+
+libapdk_la-scaler.lo: prnt/hpijs/scaler.cpp
+@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -MT libapdk_la-scaler.lo -MD -MP -MF $(DEPDIR)/libapdk_la-scaler.Tpo -c -o libapdk_la-scaler.lo `test -f 'prnt/hpijs/scaler.cpp' || echo '$(srcdir)/'`prnt/hpijs/scaler.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libapdk_la-scaler.Tpo $(DEPDIR)/libapdk_la-scaler.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpijs/scaler.cpp' object='libapdk_la-scaler.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -c -o libapdk_la-scaler.lo `test -f 'prnt/hpijs/scaler.cpp' || echo '$(srcdir)/'`prnt/hpijs/scaler.cpp
+
+libapdk_la-scaler_open.lo: prnt/hpijs/scaler_open.cpp
+@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -MT libapdk_la-scaler_open.lo -MD -MP -MF $(DEPDIR)/libapdk_la-scaler_open.Tpo -c -o libapdk_la-scaler_open.lo `test -f 'prnt/hpijs/scaler_open.cpp' || echo '$(srcdir)/'`prnt/hpijs/scaler_open.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libapdk_la-scaler_open.Tpo $(DEPDIR)/libapdk_la-scaler_open.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpijs/scaler_open.cpp' object='libapdk_la-scaler_open.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -c -o libapdk_la-scaler_open.lo `test -f 'prnt/hpijs/scaler_open.cpp' || echo '$(srcdir)/'`prnt/hpijs/scaler_open.cpp
+
+libapdk_la-script.lo: prnt/hpijs/script.cpp
+@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -MT libapdk_la-script.lo -MD -MP -MF $(DEPDIR)/libapdk_la-script.Tpo -c -o libapdk_la-script.lo `test -f 'prnt/hpijs/script.cpp' || echo '$(srcdir)/'`prnt/hpijs/script.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libapdk_la-script.Tpo $(DEPDIR)/libapdk_la-script.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpijs/script.cpp' object='libapdk_la-script.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -c -o libapdk_la-script.lo `test -f 'prnt/hpijs/script.cpp' || echo '$(srcdir)/'`prnt/hpijs/script.cpp
+
+libapdk_la-systemservices.lo: prnt/hpijs/systemservices.cpp
+@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -MT libapdk_la-systemservices.lo -MD -MP -MF $(DEPDIR)/libapdk_la-systemservices.Tpo -c -o libapdk_la-systemservices.lo `test -f 'prnt/hpijs/systemservices.cpp' || echo '$(srcdir)/'`prnt/hpijs/systemservices.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libapdk_la-systemservices.Tpo $(DEPDIR)/libapdk_la-systemservices.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpijs/systemservices.cpp' object='libapdk_la-systemservices.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -c -o libapdk_la-systemservices.lo `test -f 'prnt/hpijs/systemservices.cpp' || echo '$(srcdir)/'`prnt/hpijs/systemservices.cpp
+
+libapdk_la-translator.lo: prnt/hpijs/translator.cpp
+@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -MT libapdk_la-translator.lo -MD -MP -MF $(DEPDIR)/libapdk_la-translator.Tpo -c -o libapdk_la-translator.lo `test -f 'prnt/hpijs/translator.cpp' || echo '$(srcdir)/'`prnt/hpijs/translator.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libapdk_la-translator.Tpo $(DEPDIR)/libapdk_la-translator.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpijs/translator.cpp' object='libapdk_la-translator.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -c -o libapdk_la-translator.lo `test -f 'prnt/hpijs/translator.cpp' || echo '$(srcdir)/'`prnt/hpijs/translator.cpp
+
+libapdk_la-version.lo: prnt/hpijs/version.cpp
+@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -MT libapdk_la-version.lo -MD -MP -MF $(DEPDIR)/libapdk_la-version.Tpo -c -o libapdk_la-version.lo `test -f 'prnt/hpijs/version.cpp' || echo '$(srcdir)/'`prnt/hpijs/version.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libapdk_la-version.Tpo $(DEPDIR)/libapdk_la-version.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpijs/version.cpp' object='libapdk_la-version.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -c -o libapdk_la-version.lo `test -f 'prnt/hpijs/version.cpp' || echo '$(srcdir)/'`prnt/hpijs/version.cpp
+
+libapdk_la-versioncode.lo: prnt/hpijs/versioncode.cpp
+@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -MT libapdk_la-versioncode.lo -MD -MP -MF $(DEPDIR)/libapdk_la-versioncode.Tpo -c -o libapdk_la-versioncode.lo `test -f 'prnt/hpijs/versioncode.cpp' || echo '$(srcdir)/'`prnt/hpijs/versioncode.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libapdk_la-versioncode.Tpo $(DEPDIR)/libapdk_la-versioncode.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpijs/versioncode.cpp' object='libapdk_la-versioncode.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -c -o libapdk_la-versioncode.lo `test -f 'prnt/hpijs/versioncode.cpp' || echo '$(srcdir)/'`prnt/hpijs/versioncode.cpp
+
+libapdk_la-djgenericvip.lo: prnt/hpijs/djgenericvip.cpp
+@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -MT libapdk_la-djgenericvip.lo -MD -MP -MF $(DEPDIR)/libapdk_la-djgenericvip.Tpo -c -o libapdk_la-djgenericvip.lo `test -f 'prnt/hpijs/djgenericvip.cpp' || echo '$(srcdir)/'`prnt/hpijs/djgenericvip.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libapdk_la-djgenericvip.Tpo $(DEPDIR)/libapdk_la-djgenericvip.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpijs/djgenericvip.cpp' object='libapdk_la-djgenericvip.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -c -o libapdk_la-djgenericvip.lo `test -f 'prnt/hpijs/djgenericvip.cpp' || echo '$(srcdir)/'`prnt/hpijs/djgenericvip.cpp
+
+libapdk_la-dj540.lo: prnt/hpijs/dj540.cpp
+@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -MT libapdk_la-dj540.lo -MD -MP -MF $(DEPDIR)/libapdk_la-dj540.Tpo -c -o libapdk_la-dj540.lo `test -f 'prnt/hpijs/dj540.cpp' || echo '$(srcdir)/'`prnt/hpijs/dj540.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libapdk_la-dj540.Tpo $(DEPDIR)/libapdk_la-dj540.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpijs/dj540.cpp' object='libapdk_la-dj540.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -c -o libapdk_la-dj540.lo `test -f 'prnt/hpijs/dj540.cpp' || echo '$(srcdir)/'`prnt/hpijs/dj540.cpp
+
+libapdk_la-dj850.lo: prnt/hpijs/dj850.cpp
+@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -MT libapdk_la-dj850.lo -MD -MP -MF $(DEPDIR)/libapdk_la-dj850.Tpo -c -o libapdk_la-dj850.lo `test -f 'prnt/hpijs/dj850.cpp' || echo '$(srcdir)/'`prnt/hpijs/dj850.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libapdk_la-dj850.Tpo $(DEPDIR)/libapdk_la-dj850.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpijs/dj850.cpp' object='libapdk_la-dj850.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -c -o libapdk_la-dj850.lo `test -f 'prnt/hpijs/dj850.cpp' || echo '$(srcdir)/'`prnt/hpijs/dj850.cpp
+
+libapdk_la-dj850_maps.lo: prnt/hpijs/dj850_maps.cpp
+@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -MT libapdk_la-dj850_maps.lo -MD -MP -MF $(DEPDIR)/libapdk_la-dj850_maps.Tpo -c -o libapdk_la-dj850_maps.lo `test -f 'prnt/hpijs/dj850_maps.cpp' || echo '$(srcdir)/'`prnt/hpijs/dj850_maps.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libapdk_la-dj850_maps.Tpo $(DEPDIR)/libapdk_la-dj850_maps.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpijs/dj850_maps.cpp' object='libapdk_la-dj850_maps.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -c -o libapdk_la-dj850_maps.lo `test -f 'prnt/hpijs/dj850_maps.cpp' || echo '$(srcdir)/'`prnt/hpijs/dj850_maps.cpp
+
+libapdk_la-dj890.lo: prnt/hpijs/dj890.cpp
+@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -MT libapdk_la-dj890.lo -MD -MP -MF $(DEPDIR)/libapdk_la-dj890.Tpo -c -o libapdk_la-dj890.lo `test -f 'prnt/hpijs/dj890.cpp' || echo '$(srcdir)/'`prnt/hpijs/dj890.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libapdk_la-dj890.Tpo $(DEPDIR)/libapdk_la-dj890.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpijs/dj890.cpp' object='libapdk_la-dj890.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -c -o libapdk_la-dj890.lo `test -f 'prnt/hpijs/dj890.cpp' || echo '$(srcdir)/'`prnt/hpijs/dj890.cpp
+
+libapdk_la-ljmono.lo: prnt/hpijs/ljmono.cpp
+@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -MT libapdk_la-ljmono.lo -MD -MP -MF $(DEPDIR)/libapdk_la-ljmono.Tpo -c -o libapdk_la-ljmono.lo `test -f 'prnt/hpijs/ljmono.cpp' || echo '$(srcdir)/'`prnt/hpijs/ljmono.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libapdk_la-ljmono.Tpo $(DEPDIR)/libapdk_la-ljmono.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpijs/ljmono.cpp' object='libapdk_la-ljmono.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -c -o libapdk_la-ljmono.lo `test -f 'prnt/hpijs/ljmono.cpp' || echo '$(srcdir)/'`prnt/hpijs/ljmono.cpp
+
+libapdk_la-dj3320.lo: prnt/hpijs/dj3320.cpp
+@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -MT libapdk_la-dj3320.lo -MD -MP -MF $(DEPDIR)/libapdk_la-dj3320.Tpo -c -o libapdk_la-dj3320.lo `test -f 'prnt/hpijs/dj3320.cpp' || echo '$(srcdir)/'`prnt/hpijs/dj3320.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libapdk_la-dj3320.Tpo $(DEPDIR)/libapdk_la-dj3320.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpijs/dj3320.cpp' object='libapdk_la-dj3320.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -c -o libapdk_la-dj3320.lo `test -f 'prnt/hpijs/dj3320.cpp' || echo '$(srcdir)/'`prnt/hpijs/dj3320.cpp
+
+libapdk_la-dj3320_cmap.lo: prnt/hpijs/dj3320_cmap.cpp
+@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -MT libapdk_la-dj3320_cmap.lo -MD -MP -MF $(DEPDIR)/libapdk_la-dj3320_cmap.Tpo -c -o libapdk_la-dj3320_cmap.lo `test -f 'prnt/hpijs/dj3320_cmap.cpp' || echo '$(srcdir)/'`prnt/hpijs/dj3320_cmap.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libapdk_la-dj3320_cmap.Tpo $(DEPDIR)/libapdk_la-dj3320_cmap.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpijs/dj3320_cmap.cpp' object='libapdk_la-dj3320_cmap.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -c -o libapdk_la-dj3320_cmap.lo `test -f 'prnt/hpijs/dj3320_cmap.cpp' || echo '$(srcdir)/'`prnt/hpijs/dj3320_cmap.cpp
+
+libapdk_la-dj3600.lo: prnt/hpijs/dj3600.cpp
+@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -MT libapdk_la-dj3600.lo -MD -MP -MF $(DEPDIR)/libapdk_la-dj3600.Tpo -c -o libapdk_la-dj3600.lo `test -f 'prnt/hpijs/dj3600.cpp' || echo '$(srcdir)/'`prnt/hpijs/dj3600.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libapdk_la-dj3600.Tpo $(DEPDIR)/libapdk_la-dj3600.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpijs/dj3600.cpp' object='libapdk_la-dj3600.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -c -o libapdk_la-dj3600.lo `test -f 'prnt/hpijs/dj3600.cpp' || echo '$(srcdir)/'`prnt/hpijs/dj3600.cpp
+
+libapdk_la-dj3600_cmap.lo: prnt/hpijs/dj3600_cmap.cpp
+@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -MT libapdk_la-dj3600_cmap.lo -MD -MP -MF $(DEPDIR)/libapdk_la-dj3600_cmap.Tpo -c -o libapdk_la-dj3600_cmap.lo `test -f 'prnt/hpijs/dj3600_cmap.cpp' || echo '$(srcdir)/'`prnt/hpijs/dj3600_cmap.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libapdk_la-dj3600_cmap.Tpo $(DEPDIR)/libapdk_la-dj3600_cmap.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpijs/dj3600_cmap.cpp' object='libapdk_la-dj3600_cmap.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -c -o libapdk_la-dj3600_cmap.lo `test -f 'prnt/hpijs/dj3600_cmap.cpp' || echo '$(srcdir)/'`prnt/hpijs/dj3600_cmap.cpp
+
+libapdk_la-dj4100_cmap.lo: prnt/hpijs/dj4100_cmap.cpp
+@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -MT libapdk_la-dj4100_cmap.lo -MD -MP -MF $(DEPDIR)/libapdk_la-dj4100_cmap.Tpo -c -o libapdk_la-dj4100_cmap.lo `test -f 'prnt/hpijs/dj4100_cmap.cpp' || echo '$(srcdir)/'`prnt/hpijs/dj4100_cmap.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libapdk_la-dj4100_cmap.Tpo $(DEPDIR)/libapdk_la-dj4100_cmap.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpijs/dj4100_cmap.cpp' object='libapdk_la-dj4100_cmap.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -c -o libapdk_la-dj4100_cmap.lo `test -f 'prnt/hpijs/dj4100_cmap.cpp' || echo '$(srcdir)/'`prnt/hpijs/dj4100_cmap.cpp
+
+libapdk_la-ljcolor.lo: prnt/hpijs/ljcolor.cpp
+@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -MT libapdk_la-ljcolor.lo -MD -MP -MF $(DEPDIR)/libapdk_la-ljcolor.Tpo -c -o libapdk_la-ljcolor.lo `test -f 'prnt/hpijs/ljcolor.cpp' || echo '$(srcdir)/'`prnt/hpijs/ljcolor.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libapdk_la-ljcolor.Tpo $(DEPDIR)/libapdk_la-ljcolor.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpijs/ljcolor.cpp' object='libapdk_la-ljcolor.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -c -o libapdk_la-ljcolor.lo `test -f 'prnt/hpijs/ljcolor.cpp' || echo '$(srcdir)/'`prnt/hpijs/ljcolor.cpp
+
+libapdk_la-printerproxy.lo: prnt/hpijs/printerproxy.cpp
+@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -MT libapdk_la-printerproxy.lo -MD -MP -MF $(DEPDIR)/libapdk_la-printerproxy.Tpo -c -o libapdk_la-printerproxy.lo `test -f 'prnt/hpijs/printerproxy.cpp' || echo '$(srcdir)/'`prnt/hpijs/printerproxy.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libapdk_la-printerproxy.Tpo $(DEPDIR)/libapdk_la-printerproxy.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpijs/printerproxy.cpp' object='libapdk_la-printerproxy.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -c -o libapdk_la-printerproxy.lo `test -f 'prnt/hpijs/printerproxy.cpp' || echo '$(srcdir)/'`prnt/hpijs/printerproxy.cpp
+
+libapdk_la-printerfactory.lo: prnt/hpijs/printerfactory.cpp
+@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -MT libapdk_la-printerfactory.lo -MD -MP -MF $(DEPDIR)/libapdk_la-printerfactory.Tpo -c -o libapdk_la-printerfactory.lo `test -f 'prnt/hpijs/printerfactory.cpp' || echo '$(srcdir)/'`prnt/hpijs/printerfactory.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libapdk_la-printerfactory.Tpo $(DEPDIR)/libapdk_la-printerfactory.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpijs/printerfactory.cpp' object='libapdk_la-printerfactory.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -c -o libapdk_la-printerfactory.lo `test -f 'prnt/hpijs/printerfactory.cpp' || echo '$(srcdir)/'`prnt/hpijs/printerfactory.cpp
+
+libapdk_la-ljjetready.lo: prnt/hpijs/ljjetready.cpp
+@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -MT libapdk_la-ljjetready.lo -MD -MP -MF $(DEPDIR)/libapdk_la-ljjetready.Tpo -c -o libapdk_la-ljjetready.lo `test -f 'prnt/hpijs/ljjetready.cpp' || echo '$(srcdir)/'`prnt/hpijs/ljjetready.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libapdk_la-ljjetready.Tpo $(DEPDIR)/libapdk_la-ljjetready.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpijs/ljjetready.cpp' object='libapdk_la-ljjetready.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -c -o libapdk_la-ljjetready.lo `test -f 'prnt/hpijs/ljjetready.cpp' || echo '$(srcdir)/'`prnt/hpijs/ljjetready.cpp
+
+libapdk_la-ljfastraster.lo: prnt/hpijs/ljfastraster.cpp
+@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -MT libapdk_la-ljfastraster.lo -MD -MP -MF $(DEPDIR)/libapdk_la-ljfastraster.Tpo -c -o libapdk_la-ljfastraster.lo `test -f 'prnt/hpijs/ljfastraster.cpp' || echo '$(srcdir)/'`prnt/hpijs/ljfastraster.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libapdk_la-ljfastraster.Tpo $(DEPDIR)/libapdk_la-ljfastraster.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpijs/ljfastraster.cpp' object='libapdk_la-ljfastraster.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -c -o libapdk_la-ljfastraster.lo `test -f 'prnt/hpijs/ljfastraster.cpp' || echo '$(srcdir)/'`prnt/hpijs/ljfastraster.cpp
+
+libapdk_la-ljzjs.lo: prnt/hpijs/ljzjs.cpp
+@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -MT libapdk_la-ljzjs.lo -MD -MP -MF $(DEPDIR)/libapdk_la-ljzjs.Tpo -c -o libapdk_la-ljzjs.lo `test -f 'prnt/hpijs/ljzjs.cpp' || echo '$(srcdir)/'`prnt/hpijs/ljzjs.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libapdk_la-ljzjs.Tpo $(DEPDIR)/libapdk_la-ljzjs.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpijs/ljzjs.cpp' object='libapdk_la-ljzjs.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -c -o libapdk_la-ljzjs.lo `test -f 'prnt/hpijs/ljzjs.cpp' || echo '$(srcdir)/'`prnt/hpijs/ljzjs.cpp
+
+libapdk_la-ljzjsmono.lo: prnt/hpijs/ljzjsmono.cpp
+@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -MT libapdk_la-ljzjsmono.lo -MD -MP -MF $(DEPDIR)/libapdk_la-ljzjsmono.Tpo -c -o libapdk_la-ljzjsmono.lo `test -f 'prnt/hpijs/ljzjsmono.cpp' || echo '$(srcdir)/'`prnt/hpijs/ljzjsmono.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libapdk_la-ljzjsmono.Tpo $(DEPDIR)/libapdk_la-ljzjsmono.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpijs/ljzjsmono.cpp' object='libapdk_la-ljzjsmono.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -c -o libapdk_la-ljzjsmono.lo `test -f 'prnt/hpijs/ljzjsmono.cpp' || echo '$(srcdir)/'`prnt/hpijs/ljzjsmono.cpp
+
+libapdk_la-ljm1005.lo: prnt/hpijs/ljm1005.cpp
+@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -MT libapdk_la-ljm1005.lo -MD -MP -MF $(DEPDIR)/libapdk_la-ljm1005.Tpo -c -o libapdk_la-ljm1005.lo `test -f 'prnt/hpijs/ljm1005.cpp' || echo '$(srcdir)/'`prnt/hpijs/ljm1005.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libapdk_la-ljm1005.Tpo $(DEPDIR)/libapdk_la-ljm1005.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpijs/ljm1005.cpp' object='libapdk_la-ljm1005.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -c -o libapdk_la-ljm1005.lo `test -f 'prnt/hpijs/ljm1005.cpp' || echo '$(srcdir)/'`prnt/hpijs/ljm1005.cpp
+
+libapdk_la-quickconnect.lo: prnt/hpijs/quickconnect.cpp
+@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -MT libapdk_la-quickconnect.lo -MD -MP -MF $(DEPDIR)/libapdk_la-quickconnect.Tpo -c -o libapdk_la-quickconnect.lo `test -f 'prnt/hpijs/quickconnect.cpp' || echo '$(srcdir)/'`prnt/hpijs/quickconnect.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libapdk_la-quickconnect.Tpo $(DEPDIR)/libapdk_la-quickconnect.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpijs/quickconnect.cpp' object='libapdk_la-quickconnect.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -c -o libapdk_la-quickconnect.lo `test -f 'prnt/hpijs/quickconnect.cpp' || echo '$(srcdir)/'`prnt/hpijs/quickconnect.cpp
+
+libapdk_la-ljzjscolor.lo: prnt/hpijs/ljzjscolor.cpp
+@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -MT libapdk_la-ljzjscolor.lo -MD -MP -MF $(DEPDIR)/libapdk_la-ljzjscolor.Tpo -c -o libapdk_la-ljzjscolor.lo `test -f 'prnt/hpijs/ljzjscolor.cpp' || echo '$(srcdir)/'`prnt/hpijs/ljzjscolor.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libapdk_la-ljzjscolor.Tpo $(DEPDIR)/libapdk_la-ljzjscolor.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpijs/ljzjscolor.cpp' object='libapdk_la-ljzjscolor.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapdk_la_CXXFLAGS) $(CXXFLAGS) -c -o libapdk_la-ljzjscolor.lo `test -f 'prnt/hpijs/ljzjscolor.cpp' || echo '$(srcdir)/'`prnt/hpijs/ljzjscolor.cpp
+
+hpcups-HPCupsFilter.o: prnt/hpcups/HPCupsFilter.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -MT hpcups-HPCupsFilter.o -MD -MP -MF $(DEPDIR)/hpcups-HPCupsFilter.Tpo -c -o hpcups-HPCupsFilter.o `test -f 'prnt/hpcups/HPCupsFilter.cpp' || echo '$(srcdir)/'`prnt/hpcups/HPCupsFilter.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcups-HPCupsFilter.Tpo $(DEPDIR)/hpcups-HPCupsFilter.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpcups/HPCupsFilter.cpp' object='hpcups-HPCupsFilter.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -c -o hpcups-HPCupsFilter.o `test -f 'prnt/hpcups/HPCupsFilter.cpp' || echo '$(srcdir)/'`prnt/hpcups/HPCupsFilter.cpp
+
+hpcups-HPCupsFilter.obj: prnt/hpcups/HPCupsFilter.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -MT hpcups-HPCupsFilter.obj -MD -MP -MF $(DEPDIR)/hpcups-HPCupsFilter.Tpo -c -o hpcups-HPCupsFilter.obj `if test -f 'prnt/hpcups/HPCupsFilter.cpp'; then $(CYGPATH_W) 'prnt/hpcups/HPCupsFilter.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/HPCupsFilter.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcups-HPCupsFilter.Tpo $(DEPDIR)/hpcups-HPCupsFilter.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpcups/HPCupsFilter.cpp' object='hpcups-HPCupsFilter.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -c -o hpcups-HPCupsFilter.obj `if test -f 'prnt/hpcups/HPCupsFilter.cpp'; then $(CYGPATH_W) 'prnt/hpcups/HPCupsFilter.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/HPCupsFilter.cpp'; fi`
+
+hpcups-dbuscomm.o: prnt/hpcups/dbuscomm.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -MT hpcups-dbuscomm.o -MD -MP -MF $(DEPDIR)/hpcups-dbuscomm.Tpo -c -o hpcups-dbuscomm.o `test -f 'prnt/hpcups/dbuscomm.cpp' || echo '$(srcdir)/'`prnt/hpcups/dbuscomm.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcups-dbuscomm.Tpo $(DEPDIR)/hpcups-dbuscomm.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpcups/dbuscomm.cpp' object='hpcups-dbuscomm.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -c -o hpcups-dbuscomm.o `test -f 'prnt/hpcups/dbuscomm.cpp' || echo '$(srcdir)/'`prnt/hpcups/dbuscomm.cpp
+
+hpcups-dbuscomm.obj: prnt/hpcups/dbuscomm.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -MT hpcups-dbuscomm.obj -MD -MP -MF $(DEPDIR)/hpcups-dbuscomm.Tpo -c -o hpcups-dbuscomm.obj `if test -f 'prnt/hpcups/dbuscomm.cpp'; then $(CYGPATH_W) 'prnt/hpcups/dbuscomm.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/dbuscomm.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcups-dbuscomm.Tpo $(DEPDIR)/hpcups-dbuscomm.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpcups/dbuscomm.cpp' object='hpcups-dbuscomm.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -c -o hpcups-dbuscomm.obj `if test -f 'prnt/hpcups/dbuscomm.cpp'; then $(CYGPATH_W) 'prnt/hpcups/dbuscomm.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/dbuscomm.cpp'; fi`
+
+hpcups-Compressor.o: prnt/hpcups/Compressor.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -MT hpcups-Compressor.o -MD -MP -MF $(DEPDIR)/hpcups-Compressor.Tpo -c -o hpcups-Compressor.o `test -f 'prnt/hpcups/Compressor.cpp' || echo '$(srcdir)/'`prnt/hpcups/Compressor.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcups-Compressor.Tpo $(DEPDIR)/hpcups-Compressor.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpcups/Compressor.cpp' object='hpcups-Compressor.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -c -o hpcups-Compressor.o `test -f 'prnt/hpcups/Compressor.cpp' || echo '$(srcdir)/'`prnt/hpcups/Compressor.cpp
+
+hpcups-Compressor.obj: prnt/hpcups/Compressor.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -MT hpcups-Compressor.obj -MD -MP -MF $(DEPDIR)/hpcups-Compressor.Tpo -c -o hpcups-Compressor.obj `if test -f 'prnt/hpcups/Compressor.cpp'; then $(CYGPATH_W) 'prnt/hpcups/Compressor.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/Compressor.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcups-Compressor.Tpo $(DEPDIR)/hpcups-Compressor.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpcups/Compressor.cpp' object='hpcups-Compressor.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -c -o hpcups-Compressor.obj `if test -f 'prnt/hpcups/Compressor.cpp'; then $(CYGPATH_W) 'prnt/hpcups/Compressor.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/Compressor.cpp'; fi`
+
+hpcups-Mode2.o: prnt/hpcups/Mode2.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -MT hpcups-Mode2.o -MD -MP -MF $(DEPDIR)/hpcups-Mode2.Tpo -c -o hpcups-Mode2.o `test -f 'prnt/hpcups/Mode2.cpp' || echo '$(srcdir)/'`prnt/hpcups/Mode2.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcups-Mode2.Tpo $(DEPDIR)/hpcups-Mode2.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpcups/Mode2.cpp' object='hpcups-Mode2.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -c -o hpcups-Mode2.o `test -f 'prnt/hpcups/Mode2.cpp' || echo '$(srcdir)/'`prnt/hpcups/Mode2.cpp
+
+hpcups-Mode2.obj: prnt/hpcups/Mode2.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -MT hpcups-Mode2.obj -MD -MP -MF $(DEPDIR)/hpcups-Mode2.Tpo -c -o hpcups-Mode2.obj `if test -f 'prnt/hpcups/Mode2.cpp'; then $(CYGPATH_W) 'prnt/hpcups/Mode2.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/Mode2.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcups-Mode2.Tpo $(DEPDIR)/hpcups-Mode2.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpcups/Mode2.cpp' object='hpcups-Mode2.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -c -o hpcups-Mode2.obj `if test -f 'prnt/hpcups/Mode2.cpp'; then $(CYGPATH_W) 'prnt/hpcups/Mode2.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/Mode2.cpp'; fi`
+
+hpcups-Mode3.o: prnt/hpcups/Mode3.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -MT hpcups-Mode3.o -MD -MP -MF $(DEPDIR)/hpcups-Mode3.Tpo -c -o hpcups-Mode3.o `test -f 'prnt/hpcups/Mode3.cpp' || echo '$(srcdir)/'`prnt/hpcups/Mode3.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcups-Mode3.Tpo $(DEPDIR)/hpcups-Mode3.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpcups/Mode3.cpp' object='hpcups-Mode3.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -c -o hpcups-Mode3.o `test -f 'prnt/hpcups/Mode3.cpp' || echo '$(srcdir)/'`prnt/hpcups/Mode3.cpp
+
+hpcups-Mode3.obj: prnt/hpcups/Mode3.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -MT hpcups-Mode3.obj -MD -MP -MF $(DEPDIR)/hpcups-Mode3.Tpo -c -o hpcups-Mode3.obj `if test -f 'prnt/hpcups/Mode3.cpp'; then $(CYGPATH_W) 'prnt/hpcups/Mode3.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/Mode3.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcups-Mode3.Tpo $(DEPDIR)/hpcups-Mode3.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpcups/Mode3.cpp' object='hpcups-Mode3.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -c -o hpcups-Mode3.obj `if test -f 'prnt/hpcups/Mode3.cpp'; then $(CYGPATH_W) 'prnt/hpcups/Mode3.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/Mode3.cpp'; fi`
+
+hpcups-Mode9.o: prnt/hpcups/Mode9.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -MT hpcups-Mode9.o -MD -MP -MF $(DEPDIR)/hpcups-Mode9.Tpo -c -o hpcups-Mode9.o `test -f 'prnt/hpcups/Mode9.cpp' || echo '$(srcdir)/'`prnt/hpcups/Mode9.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcups-Mode9.Tpo $(DEPDIR)/hpcups-Mode9.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpcups/Mode9.cpp' object='hpcups-Mode9.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -c -o hpcups-Mode9.o `test -f 'prnt/hpcups/Mode9.cpp' || echo '$(srcdir)/'`prnt/hpcups/Mode9.cpp
+
+hpcups-Mode9.obj: prnt/hpcups/Mode9.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -MT hpcups-Mode9.obj -MD -MP -MF $(DEPDIR)/hpcups-Mode9.Tpo -c -o hpcups-Mode9.obj `if test -f 'prnt/hpcups/Mode9.cpp'; then $(CYGPATH_W) 'prnt/hpcups/Mode9.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/Mode9.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcups-Mode9.Tpo $(DEPDIR)/hpcups-Mode9.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpcups/Mode9.cpp' object='hpcups-Mode9.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -c -o hpcups-Mode9.obj `if test -f 'prnt/hpcups/Mode9.cpp'; then $(CYGPATH_W) 'prnt/hpcups/Mode9.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/Mode9.cpp'; fi`
+
+hpcups-Mode10.o: prnt/hpcups/Mode10.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -MT hpcups-Mode10.o -MD -MP -MF $(DEPDIR)/hpcups-Mode10.Tpo -c -o hpcups-Mode10.o `test -f 'prnt/hpcups/Mode10.cpp' || echo '$(srcdir)/'`prnt/hpcups/Mode10.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcups-Mode10.Tpo $(DEPDIR)/hpcups-Mode10.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpcups/Mode10.cpp' object='hpcups-Mode10.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -c -o hpcups-Mode10.o `test -f 'prnt/hpcups/Mode10.cpp' || echo '$(srcdir)/'`prnt/hpcups/Mode10.cpp
+
+hpcups-Mode10.obj: prnt/hpcups/Mode10.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -MT hpcups-Mode10.obj -MD -MP -MF $(DEPDIR)/hpcups-Mode10.Tpo -c -o hpcups-Mode10.obj `if test -f 'prnt/hpcups/Mode10.cpp'; then $(CYGPATH_W) 'prnt/hpcups/Mode10.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/Mode10.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcups-Mode10.Tpo $(DEPDIR)/hpcups-Mode10.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpcups/Mode10.cpp' object='hpcups-Mode10.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -c -o hpcups-Mode10.obj `if test -f 'prnt/hpcups/Mode10.cpp'; then $(CYGPATH_W) 'prnt/hpcups/Mode10.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/Mode10.cpp'; fi`
+
+hpcups-ModeDeltaPlus.o: prnt/hpcups/ModeDeltaPlus.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -MT hpcups-ModeDeltaPlus.o -MD -MP -MF $(DEPDIR)/hpcups-ModeDeltaPlus.Tpo -c -o hpcups-ModeDeltaPlus.o `test -f 'prnt/hpcups/ModeDeltaPlus.cpp' || echo '$(srcdir)/'`prnt/hpcups/ModeDeltaPlus.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcups-ModeDeltaPlus.Tpo $(DEPDIR)/hpcups-ModeDeltaPlus.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpcups/ModeDeltaPlus.cpp' object='hpcups-ModeDeltaPlus.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -c -o hpcups-ModeDeltaPlus.o `test -f 'prnt/hpcups/ModeDeltaPlus.cpp' || echo '$(srcdir)/'`prnt/hpcups/ModeDeltaPlus.cpp
+
+hpcups-ModeDeltaPlus.obj: prnt/hpcups/ModeDeltaPlus.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -MT hpcups-ModeDeltaPlus.obj -MD -MP -MF $(DEPDIR)/hpcups-ModeDeltaPlus.Tpo -c -o hpcups-ModeDeltaPlus.obj `if test -f 'prnt/hpcups/ModeDeltaPlus.cpp'; then $(CYGPATH_W) 'prnt/hpcups/ModeDeltaPlus.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/ModeDeltaPlus.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcups-ModeDeltaPlus.Tpo $(DEPDIR)/hpcups-ModeDeltaPlus.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpcups/ModeDeltaPlus.cpp' object='hpcups-ModeDeltaPlus.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -c -o hpcups-ModeDeltaPlus.obj `if test -f 'prnt/hpcups/ModeDeltaPlus.cpp'; then $(CYGPATH_W) 'prnt/hpcups/ModeDeltaPlus.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/ModeDeltaPlus.cpp'; fi`
+
+hpcups-ModeJbig.o: prnt/hpcups/ModeJbig.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -MT hpcups-ModeJbig.o -MD -MP -MF $(DEPDIR)/hpcups-ModeJbig.Tpo -c -o hpcups-ModeJbig.o `test -f 'prnt/hpcups/ModeJbig.cpp' || echo '$(srcdir)/'`prnt/hpcups/ModeJbig.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcups-ModeJbig.Tpo $(DEPDIR)/hpcups-ModeJbig.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpcups/ModeJbig.cpp' object='hpcups-ModeJbig.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -c -o hpcups-ModeJbig.o `test -f 'prnt/hpcups/ModeJbig.cpp' || echo '$(srcdir)/'`prnt/hpcups/ModeJbig.cpp
+
+hpcups-ModeJbig.obj: prnt/hpcups/ModeJbig.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -MT hpcups-ModeJbig.obj -MD -MP -MF $(DEPDIR)/hpcups-ModeJbig.Tpo -c -o hpcups-ModeJbig.obj `if test -f 'prnt/hpcups/ModeJbig.cpp'; then $(CYGPATH_W) 'prnt/hpcups/ModeJbig.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/ModeJbig.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcups-ModeJbig.Tpo $(DEPDIR)/hpcups-ModeJbig.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpcups/ModeJbig.cpp' object='hpcups-ModeJbig.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -c -o hpcups-ModeJbig.obj `if test -f 'prnt/hpcups/ModeJbig.cpp'; then $(CYGPATH_W) 'prnt/hpcups/ModeJbig.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/ModeJbig.cpp'; fi`
+
+hpcups-ErnieFilter.o: prnt/hpcups/ErnieFilter.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -MT hpcups-ErnieFilter.o -MD -MP -MF $(DEPDIR)/hpcups-ErnieFilter.Tpo -c -o hpcups-ErnieFilter.o `test -f 'prnt/hpcups/ErnieFilter.cpp' || echo '$(srcdir)/'`prnt/hpcups/ErnieFilter.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcups-ErnieFilter.Tpo $(DEPDIR)/hpcups-ErnieFilter.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpcups/ErnieFilter.cpp' object='hpcups-ErnieFilter.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -c -o hpcups-ErnieFilter.o `test -f 'prnt/hpcups/ErnieFilter.cpp' || echo '$(srcdir)/'`prnt/hpcups/ErnieFilter.cpp
+
+hpcups-ErnieFilter.obj: prnt/hpcups/ErnieFilter.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -MT hpcups-ErnieFilter.obj -MD -MP -MF $(DEPDIR)/hpcups-ErnieFilter.Tpo -c -o hpcups-ErnieFilter.obj `if test -f 'prnt/hpcups/ErnieFilter.cpp'; then $(CYGPATH_W) 'prnt/hpcups/ErnieFilter.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/ErnieFilter.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcups-ErnieFilter.Tpo $(DEPDIR)/hpcups-ErnieFilter.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpcups/ErnieFilter.cpp' object='hpcups-ErnieFilter.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -c -o hpcups-ErnieFilter.obj `if test -f 'prnt/hpcups/ErnieFilter.cpp'; then $(CYGPATH_W) 'prnt/hpcups/ErnieFilter.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/ErnieFilter.cpp'; fi`
+
+hpcups-EncapsulatorFactory.o: prnt/hpcups/EncapsulatorFactory.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -MT hpcups-EncapsulatorFactory.o -MD -MP -MF $(DEPDIR)/hpcups-EncapsulatorFactory.Tpo -c -o hpcups-EncapsulatorFactory.o `test -f 'prnt/hpcups/EncapsulatorFactory.cpp' || echo '$(srcdir)/'`prnt/hpcups/EncapsulatorFactory.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcups-EncapsulatorFactory.Tpo $(DEPDIR)/hpcups-EncapsulatorFactory.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpcups/EncapsulatorFactory.cpp' object='hpcups-EncapsulatorFactory.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -c -o hpcups-EncapsulatorFactory.o `test -f 'prnt/hpcups/EncapsulatorFactory.cpp' || echo '$(srcdir)/'`prnt/hpcups/EncapsulatorFactory.cpp
+
+hpcups-EncapsulatorFactory.obj: prnt/hpcups/EncapsulatorFactory.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -MT hpcups-EncapsulatorFactory.obj -MD -MP -MF $(DEPDIR)/hpcups-EncapsulatorFactory.Tpo -c -o hpcups-EncapsulatorFactory.obj `if test -f 'prnt/hpcups/EncapsulatorFactory.cpp'; then $(CYGPATH_W) 'prnt/hpcups/EncapsulatorFactory.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/EncapsulatorFactory.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcups-EncapsulatorFactory.Tpo $(DEPDIR)/hpcups-EncapsulatorFactory.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpcups/EncapsulatorFactory.cpp' object='hpcups-EncapsulatorFactory.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -c -o hpcups-EncapsulatorFactory.obj `if test -f 'prnt/hpcups/EncapsulatorFactory.cpp'; then $(CYGPATH_W) 'prnt/hpcups/EncapsulatorFactory.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/EncapsulatorFactory.cpp'; fi`
+
+hpcups-Encapsulator.o: prnt/hpcups/Encapsulator.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -MT hpcups-Encapsulator.o -MD -MP -MF $(DEPDIR)/hpcups-Encapsulator.Tpo -c -o hpcups-Encapsulator.o `test -f 'prnt/hpcups/Encapsulator.cpp' || echo '$(srcdir)/'`prnt/hpcups/Encapsulator.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcups-Encapsulator.Tpo $(DEPDIR)/hpcups-Encapsulator.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpcups/Encapsulator.cpp' object='hpcups-Encapsulator.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -c -o hpcups-Encapsulator.o `test -f 'prnt/hpcups/Encapsulator.cpp' || echo '$(srcdir)/'`prnt/hpcups/Encapsulator.cpp
+
+hpcups-Encapsulator.obj: prnt/hpcups/Encapsulator.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -MT hpcups-Encapsulator.obj -MD -MP -MF $(DEPDIR)/hpcups-Encapsulator.Tpo -c -o hpcups-Encapsulator.obj `if test -f 'prnt/hpcups/Encapsulator.cpp'; then $(CYGPATH_W) 'prnt/hpcups/Encapsulator.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/Encapsulator.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcups-Encapsulator.Tpo $(DEPDIR)/hpcups-Encapsulator.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpcups/Encapsulator.cpp' object='hpcups-Encapsulator.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -c -o hpcups-Encapsulator.obj `if test -f 'prnt/hpcups/Encapsulator.cpp'; then $(CYGPATH_W) 'prnt/hpcups/Encapsulator.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/Encapsulator.cpp'; fi`
+
+hpcups-Pcl3.o: prnt/hpcups/Pcl3.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -MT hpcups-Pcl3.o -MD -MP -MF $(DEPDIR)/hpcups-Pcl3.Tpo -c -o hpcups-Pcl3.o `test -f 'prnt/hpcups/Pcl3.cpp' || echo '$(srcdir)/'`prnt/hpcups/Pcl3.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcups-Pcl3.Tpo $(DEPDIR)/hpcups-Pcl3.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpcups/Pcl3.cpp' object='hpcups-Pcl3.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -c -o hpcups-Pcl3.o `test -f 'prnt/hpcups/Pcl3.cpp' || echo '$(srcdir)/'`prnt/hpcups/Pcl3.cpp
+
+hpcups-Pcl3.obj: prnt/hpcups/Pcl3.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -MT hpcups-Pcl3.obj -MD -MP -MF $(DEPDIR)/hpcups-Pcl3.Tpo -c -o hpcups-Pcl3.obj `if test -f 'prnt/hpcups/Pcl3.cpp'; then $(CYGPATH_W) 'prnt/hpcups/Pcl3.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/Pcl3.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcups-Pcl3.Tpo $(DEPDIR)/hpcups-Pcl3.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpcups/Pcl3.cpp' object='hpcups-Pcl3.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -c -o hpcups-Pcl3.obj `if test -f 'prnt/hpcups/Pcl3.cpp'; then $(CYGPATH_W) 'prnt/hpcups/Pcl3.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/Pcl3.cpp'; fi`
+
+hpcups-Pcl3Gui.o: prnt/hpcups/Pcl3Gui.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -MT hpcups-Pcl3Gui.o -MD -MP -MF $(DEPDIR)/hpcups-Pcl3Gui.Tpo -c -o hpcups-Pcl3Gui.o `test -f 'prnt/hpcups/Pcl3Gui.cpp' || echo '$(srcdir)/'`prnt/hpcups/Pcl3Gui.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcups-Pcl3Gui.Tpo $(DEPDIR)/hpcups-Pcl3Gui.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpcups/Pcl3Gui.cpp' object='hpcups-Pcl3Gui.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -c -o hpcups-Pcl3Gui.o `test -f 'prnt/hpcups/Pcl3Gui.cpp' || echo '$(srcdir)/'`prnt/hpcups/Pcl3Gui.cpp
+
+hpcups-Pcl3Gui.obj: prnt/hpcups/Pcl3Gui.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -MT hpcups-Pcl3Gui.obj -MD -MP -MF $(DEPDIR)/hpcups-Pcl3Gui.Tpo -c -o hpcups-Pcl3Gui.obj `if test -f 'prnt/hpcups/Pcl3Gui.cpp'; then $(CYGPATH_W) 'prnt/hpcups/Pcl3Gui.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/Pcl3Gui.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcups-Pcl3Gui.Tpo $(DEPDIR)/hpcups-Pcl3Gui.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpcups/Pcl3Gui.cpp' object='hpcups-Pcl3Gui.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -c -o hpcups-Pcl3Gui.obj `if test -f 'prnt/hpcups/Pcl3Gui.cpp'; then $(CYGPATH_W) 'prnt/hpcups/Pcl3Gui.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/Pcl3Gui.cpp'; fi`
+
+hpcups-Pcl3Gui2.o: prnt/hpcups/Pcl3Gui2.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -MT hpcups-Pcl3Gui2.o -MD -MP -MF $(DEPDIR)/hpcups-Pcl3Gui2.Tpo -c -o hpcups-Pcl3Gui2.o `test -f 'prnt/hpcups/Pcl3Gui2.cpp' || echo '$(srcdir)/'`prnt/hpcups/Pcl3Gui2.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcups-Pcl3Gui2.Tpo $(DEPDIR)/hpcups-Pcl3Gui2.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpcups/Pcl3Gui2.cpp' object='hpcups-Pcl3Gui2.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -c -o hpcups-Pcl3Gui2.o `test -f 'prnt/hpcups/Pcl3Gui2.cpp' || echo '$(srcdir)/'`prnt/hpcups/Pcl3Gui2.cpp
+
+hpcups-Pcl3Gui2.obj: prnt/hpcups/Pcl3Gui2.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -MT hpcups-Pcl3Gui2.obj -MD -MP -MF $(DEPDIR)/hpcups-Pcl3Gui2.Tpo -c -o hpcups-Pcl3Gui2.obj `if test -f 'prnt/hpcups/Pcl3Gui2.cpp'; then $(CYGPATH_W) 'prnt/hpcups/Pcl3Gui2.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/Pcl3Gui2.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcups-Pcl3Gui2.Tpo $(DEPDIR)/hpcups-Pcl3Gui2.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpcups/Pcl3Gui2.cpp' object='hpcups-Pcl3Gui2.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -c -o hpcups-Pcl3Gui2.obj `if test -f 'prnt/hpcups/Pcl3Gui2.cpp'; then $(CYGPATH_W) 'prnt/hpcups/Pcl3Gui2.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/Pcl3Gui2.cpp'; fi`
+
+hpcups-LJMono.o: prnt/hpcups/LJMono.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -MT hpcups-LJMono.o -MD -MP -MF $(DEPDIR)/hpcups-LJMono.Tpo -c -o hpcups-LJMono.o `test -f 'prnt/hpcups/LJMono.cpp' || echo '$(srcdir)/'`prnt/hpcups/LJMono.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcups-LJMono.Tpo $(DEPDIR)/hpcups-LJMono.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpcups/LJMono.cpp' object='hpcups-LJMono.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -c -o hpcups-LJMono.o `test -f 'prnt/hpcups/LJMono.cpp' || echo '$(srcdir)/'`prnt/hpcups/LJMono.cpp
+
+hpcups-LJMono.obj: prnt/hpcups/LJMono.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -MT hpcups-LJMono.obj -MD -MP -MF $(DEPDIR)/hpcups-LJMono.Tpo -c -o hpcups-LJMono.obj `if test -f 'prnt/hpcups/LJMono.cpp'; then $(CYGPATH_W) 'prnt/hpcups/LJMono.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/LJMono.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcups-LJMono.Tpo $(DEPDIR)/hpcups-LJMono.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpcups/LJMono.cpp' object='hpcups-LJMono.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -c -o hpcups-LJMono.obj `if test -f 'prnt/hpcups/LJMono.cpp'; then $(CYGPATH_W) 'prnt/hpcups/LJMono.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/LJMono.cpp'; fi`
+
+hpcups-LJColor.o: prnt/hpcups/LJColor.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -MT hpcups-LJColor.o -MD -MP -MF $(DEPDIR)/hpcups-LJColor.Tpo -c -o hpcups-LJColor.o `test -f 'prnt/hpcups/LJColor.cpp' || echo '$(srcdir)/'`prnt/hpcups/LJColor.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcups-LJColor.Tpo $(DEPDIR)/hpcups-LJColor.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpcups/LJColor.cpp' object='hpcups-LJColor.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -c -o hpcups-LJColor.o `test -f 'prnt/hpcups/LJColor.cpp' || echo '$(srcdir)/'`prnt/hpcups/LJColor.cpp
+
+hpcups-LJColor.obj: prnt/hpcups/LJColor.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -MT hpcups-LJColor.obj -MD -MP -MF $(DEPDIR)/hpcups-LJColor.Tpo -c -o hpcups-LJColor.obj `if test -f 'prnt/hpcups/LJColor.cpp'; then $(CYGPATH_W) 'prnt/hpcups/LJColor.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/LJColor.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcups-LJColor.Tpo $(DEPDIR)/hpcups-LJColor.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpcups/LJColor.cpp' object='hpcups-LJColor.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -c -o hpcups-LJColor.obj `if test -f 'prnt/hpcups/LJColor.cpp'; then $(CYGPATH_W) 'prnt/hpcups/LJColor.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/LJColor.cpp'; fi`
+
+hpcups-LJFastRaster.o: prnt/hpcups/LJFastRaster.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -MT hpcups-LJFastRaster.o -MD -MP -MF $(DEPDIR)/hpcups-LJFastRaster.Tpo -c -o hpcups-LJFastRaster.o `test -f 'prnt/hpcups/LJFastRaster.cpp' || echo '$(srcdir)/'`prnt/hpcups/LJFastRaster.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcups-LJFastRaster.Tpo $(DEPDIR)/hpcups-LJFastRaster.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpcups/LJFastRaster.cpp' object='hpcups-LJFastRaster.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -c -o hpcups-LJFastRaster.o `test -f 'prnt/hpcups/LJFastRaster.cpp' || echo '$(srcdir)/'`prnt/hpcups/LJFastRaster.cpp
+
+hpcups-LJFastRaster.obj: prnt/hpcups/LJFastRaster.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -MT hpcups-LJFastRaster.obj -MD -MP -MF $(DEPDIR)/hpcups-LJFastRaster.Tpo -c -o hpcups-LJFastRaster.obj `if test -f 'prnt/hpcups/LJFastRaster.cpp'; then $(CYGPATH_W) 'prnt/hpcups/LJFastRaster.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/LJFastRaster.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcups-LJFastRaster.Tpo $(DEPDIR)/hpcups-LJFastRaster.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpcups/LJFastRaster.cpp' object='hpcups-LJFastRaster.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -c -o hpcups-LJFastRaster.obj `if test -f 'prnt/hpcups/LJFastRaster.cpp'; then $(CYGPATH_W) 'prnt/hpcups/LJFastRaster.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/LJFastRaster.cpp'; fi`
+
+hpcups-LJJetReady.o: prnt/hpcups/LJJetReady.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -MT hpcups-LJJetReady.o -MD -MP -MF $(DEPDIR)/hpcups-LJJetReady.Tpo -c -o hpcups-LJJetReady.o `test -f 'prnt/hpcups/LJJetReady.cpp' || echo '$(srcdir)/'`prnt/hpcups/LJJetReady.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcups-LJJetReady.Tpo $(DEPDIR)/hpcups-LJJetReady.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpcups/LJJetReady.cpp' object='hpcups-LJJetReady.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -c -o hpcups-LJJetReady.o `test -f 'prnt/hpcups/LJJetReady.cpp' || echo '$(srcdir)/'`prnt/hpcups/LJJetReady.cpp
+
+hpcups-LJJetReady.obj: prnt/hpcups/LJJetReady.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -MT hpcups-LJJetReady.obj -MD -MP -MF $(DEPDIR)/hpcups-LJJetReady.Tpo -c -o hpcups-LJJetReady.obj `if test -f 'prnt/hpcups/LJJetReady.cpp'; then $(CYGPATH_W) 'prnt/hpcups/LJJetReady.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/LJJetReady.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcups-LJJetReady.Tpo $(DEPDIR)/hpcups-LJJetReady.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpcups/LJJetReady.cpp' object='hpcups-LJJetReady.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -c -o hpcups-LJJetReady.obj `if test -f 'prnt/hpcups/LJJetReady.cpp'; then $(CYGPATH_W) 'prnt/hpcups/LJJetReady.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/LJJetReady.cpp'; fi`
+
+hpcups-LJZjStream.o: prnt/hpcups/LJZjStream.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -MT hpcups-LJZjStream.o -MD -MP -MF $(DEPDIR)/hpcups-LJZjStream.Tpo -c -o hpcups-LJZjStream.o `test -f 'prnt/hpcups/LJZjStream.cpp' || echo '$(srcdir)/'`prnt/hpcups/LJZjStream.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcups-LJZjStream.Tpo $(DEPDIR)/hpcups-LJZjStream.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpcups/LJZjStream.cpp' object='hpcups-LJZjStream.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -c -o hpcups-LJZjStream.o `test -f 'prnt/hpcups/LJZjStream.cpp' || echo '$(srcdir)/'`prnt/hpcups/LJZjStream.cpp
+
+hpcups-LJZjStream.obj: prnt/hpcups/LJZjStream.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -MT hpcups-LJZjStream.obj -MD -MP -MF $(DEPDIR)/hpcups-LJZjStream.Tpo -c -o hpcups-LJZjStream.obj `if test -f 'prnt/hpcups/LJZjStream.cpp'; then $(CYGPATH_W) 'prnt/hpcups/LJZjStream.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/LJZjStream.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcups-LJZjStream.Tpo $(DEPDIR)/hpcups-LJZjStream.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpcups/LJZjStream.cpp' object='hpcups-LJZjStream.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -c -o hpcups-LJZjStream.obj `if test -f 'prnt/hpcups/LJZjStream.cpp'; then $(CYGPATH_W) 'prnt/hpcups/LJZjStream.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/LJZjStream.cpp'; fi`
+
+hpcups-LJZxStream.o: prnt/hpcups/LJZxStream.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -MT hpcups-LJZxStream.o -MD -MP -MF $(DEPDIR)/hpcups-LJZxStream.Tpo -c -o hpcups-LJZxStream.o `test -f 'prnt/hpcups/LJZxStream.cpp' || echo '$(srcdir)/'`prnt/hpcups/LJZxStream.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcups-LJZxStream.Tpo $(DEPDIR)/hpcups-LJZxStream.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpcups/LJZxStream.cpp' object='hpcups-LJZxStream.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -c -o hpcups-LJZxStream.o `test -f 'prnt/hpcups/LJZxStream.cpp' || echo '$(srcdir)/'`prnt/hpcups/LJZxStream.cpp
+
+hpcups-LJZxStream.obj: prnt/hpcups/LJZxStream.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -MT hpcups-LJZxStream.obj -MD -MP -MF $(DEPDIR)/hpcups-LJZxStream.Tpo -c -o hpcups-LJZxStream.obj `if test -f 'prnt/hpcups/LJZxStream.cpp'; then $(CYGPATH_W) 'prnt/hpcups/LJZxStream.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/LJZxStream.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcups-LJZxStream.Tpo $(DEPDIR)/hpcups-LJZxStream.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpcups/LJZxStream.cpp' object='hpcups-LJZxStream.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -c -o hpcups-LJZxStream.obj `if test -f 'prnt/hpcups/LJZxStream.cpp'; then $(CYGPATH_W) 'prnt/hpcups/LJZxStream.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/LJZxStream.cpp'; fi`
+
+hpcups-Job.o: prnt/hpcups/Job.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -MT hpcups-Job.o -MD -MP -MF $(DEPDIR)/hpcups-Job.Tpo -c -o hpcups-Job.o `test -f 'prnt/hpcups/Job.cpp' || echo '$(srcdir)/'`prnt/hpcups/Job.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcups-Job.Tpo $(DEPDIR)/hpcups-Job.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpcups/Job.cpp' object='hpcups-Job.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -c -o hpcups-Job.o `test -f 'prnt/hpcups/Job.cpp' || echo '$(srcdir)/'`prnt/hpcups/Job.cpp
+
+hpcups-Job.obj: prnt/hpcups/Job.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -MT hpcups-Job.obj -MD -MP -MF $(DEPDIR)/hpcups-Job.Tpo -c -o hpcups-Job.obj `if test -f 'prnt/hpcups/Job.cpp'; then $(CYGPATH_W) 'prnt/hpcups/Job.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/Job.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcups-Job.Tpo $(DEPDIR)/hpcups-Job.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpcups/Job.cpp' object='hpcups-Job.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -c -o hpcups-Job.obj `if test -f 'prnt/hpcups/Job.cpp'; then $(CYGPATH_W) 'prnt/hpcups/Job.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/Job.cpp'; fi`
+
+hpcups-Pipeline.o: prnt/hpcups/Pipeline.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -MT hpcups-Pipeline.o -MD -MP -MF $(DEPDIR)/hpcups-Pipeline.Tpo -c -o hpcups-Pipeline.o `test -f 'prnt/hpcups/Pipeline.cpp' || echo '$(srcdir)/'`prnt/hpcups/Pipeline.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcups-Pipeline.Tpo $(DEPDIR)/hpcups-Pipeline.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpcups/Pipeline.cpp' object='hpcups-Pipeline.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -c -o hpcups-Pipeline.o `test -f 'prnt/hpcups/Pipeline.cpp' || echo '$(srcdir)/'`prnt/hpcups/Pipeline.cpp
+
+hpcups-Pipeline.obj: prnt/hpcups/Pipeline.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -MT hpcups-Pipeline.obj -MD -MP -MF $(DEPDIR)/hpcups-Pipeline.Tpo -c -o hpcups-Pipeline.obj `if test -f 'prnt/hpcups/Pipeline.cpp'; then $(CYGPATH_W) 'prnt/hpcups/Pipeline.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/Pipeline.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcups-Pipeline.Tpo $(DEPDIR)/hpcups-Pipeline.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpcups/Pipeline.cpp' object='hpcups-Pipeline.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -c -o hpcups-Pipeline.obj `if test -f 'prnt/hpcups/Pipeline.cpp'; then $(CYGPATH_W) 'prnt/hpcups/Pipeline.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/Pipeline.cpp'; fi`
+
+hpcups-Processor.o: prnt/hpcups/Processor.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -MT hpcups-Processor.o -MD -MP -MF $(DEPDIR)/hpcups-Processor.Tpo -c -o hpcups-Processor.o `test -f 'prnt/hpcups/Processor.cpp' || echo '$(srcdir)/'`prnt/hpcups/Processor.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcups-Processor.Tpo $(DEPDIR)/hpcups-Processor.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpcups/Processor.cpp' object='hpcups-Processor.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -c -o hpcups-Processor.o `test -f 'prnt/hpcups/Processor.cpp' || echo '$(srcdir)/'`prnt/hpcups/Processor.cpp
+
+hpcups-Processor.obj: prnt/hpcups/Processor.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -MT hpcups-Processor.obj -MD -MP -MF $(DEPDIR)/hpcups-Processor.Tpo -c -o hpcups-Processor.obj `if test -f 'prnt/hpcups/Processor.cpp'; then $(CYGPATH_W) 'prnt/hpcups/Processor.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/Processor.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcups-Processor.Tpo $(DEPDIR)/hpcups-Processor.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpcups/Processor.cpp' object='hpcups-Processor.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -c -o hpcups-Processor.obj `if test -f 'prnt/hpcups/Processor.cpp'; then $(CYGPATH_W) 'prnt/hpcups/Processor.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/Processor.cpp'; fi`
+
+hpcups-RasterSender.o: prnt/hpcups/RasterSender.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -MT hpcups-RasterSender.o -MD -MP -MF $(DEPDIR)/hpcups-RasterSender.Tpo -c -o hpcups-RasterSender.o `test -f 'prnt/hpcups/RasterSender.cpp' || echo '$(srcdir)/'`prnt/hpcups/RasterSender.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcups-RasterSender.Tpo $(DEPDIR)/hpcups-RasterSender.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpcups/RasterSender.cpp' object='hpcups-RasterSender.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -c -o hpcups-RasterSender.o `test -f 'prnt/hpcups/RasterSender.cpp' || echo '$(srcdir)/'`prnt/hpcups/RasterSender.cpp
+
+hpcups-RasterSender.obj: prnt/hpcups/RasterSender.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -MT hpcups-RasterSender.obj -MD -MP -MF $(DEPDIR)/hpcups-RasterSender.Tpo -c -o hpcups-RasterSender.obj `if test -f 'prnt/hpcups/RasterSender.cpp'; then $(CYGPATH_W) 'prnt/hpcups/RasterSender.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/RasterSender.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcups-RasterSender.Tpo $(DEPDIR)/hpcups-RasterSender.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpcups/RasterSender.cpp' object='hpcups-RasterSender.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -c -o hpcups-RasterSender.obj `if test -f 'prnt/hpcups/RasterSender.cpp'; then $(CYGPATH_W) 'prnt/hpcups/RasterSender.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/RasterSender.cpp'; fi`
+
+hpcups-ColorMatcher.o: prnt/hpcups/ColorMatcher.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -MT hpcups-ColorMatcher.o -MD -MP -MF $(DEPDIR)/hpcups-ColorMatcher.Tpo -c -o hpcups-ColorMatcher.o `test -f 'prnt/hpcups/ColorMatcher.cpp' || echo '$(srcdir)/'`prnt/hpcups/ColorMatcher.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcups-ColorMatcher.Tpo $(DEPDIR)/hpcups-ColorMatcher.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpcups/ColorMatcher.cpp' object='hpcups-ColorMatcher.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -c -o hpcups-ColorMatcher.o `test -f 'prnt/hpcups/ColorMatcher.cpp' || echo '$(srcdir)/'`prnt/hpcups/ColorMatcher.cpp
+
+hpcups-ColorMatcher.obj: prnt/hpcups/ColorMatcher.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -MT hpcups-ColorMatcher.obj -MD -MP -MF $(DEPDIR)/hpcups-ColorMatcher.Tpo -c -o hpcups-ColorMatcher.obj `if test -f 'prnt/hpcups/ColorMatcher.cpp'; then $(CYGPATH_W) 'prnt/hpcups/ColorMatcher.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/ColorMatcher.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcups-ColorMatcher.Tpo $(DEPDIR)/hpcups-ColorMatcher.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpcups/ColorMatcher.cpp' object='hpcups-ColorMatcher.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -c -o hpcups-ColorMatcher.obj `if test -f 'prnt/hpcups/ColorMatcher.cpp'; then $(CYGPATH_W) 'prnt/hpcups/ColorMatcher.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/ColorMatcher.cpp'; fi`
+
+hpcups-Halftoner.o: prnt/hpcups/Halftoner.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -MT hpcups-Halftoner.o -MD -MP -MF $(DEPDIR)/hpcups-Halftoner.Tpo -c -o hpcups-Halftoner.o `test -f 'prnt/hpcups/Halftoner.cpp' || echo '$(srcdir)/'`prnt/hpcups/Halftoner.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcups-Halftoner.Tpo $(DEPDIR)/hpcups-Halftoner.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpcups/Halftoner.cpp' object='hpcups-Halftoner.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -c -o hpcups-Halftoner.o `test -f 'prnt/hpcups/Halftoner.cpp' || echo '$(srcdir)/'`prnt/hpcups/Halftoner.cpp
+
+hpcups-Halftoner.obj: prnt/hpcups/Halftoner.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -MT hpcups-Halftoner.obj -MD -MP -MF $(DEPDIR)/hpcups-Halftoner.Tpo -c -o hpcups-Halftoner.obj `if test -f 'prnt/hpcups/Halftoner.cpp'; then $(CYGPATH_W) 'prnt/hpcups/Halftoner.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/Halftoner.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcups-Halftoner.Tpo $(DEPDIR)/hpcups-Halftoner.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpcups/Halftoner.cpp' object='hpcups-Halftoner.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -c -o hpcups-Halftoner.obj `if test -f 'prnt/hpcups/Halftoner.cpp'; then $(CYGPATH_W) 'prnt/hpcups/Halftoner.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/Halftoner.cpp'; fi`
+
+hpcups-Scaler.o: prnt/hpcups/Scaler.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -MT hpcups-Scaler.o -MD -MP -MF $(DEPDIR)/hpcups-Scaler.Tpo -c -o hpcups-Scaler.o `test -f 'prnt/hpcups/Scaler.cpp' || echo '$(srcdir)/'`prnt/hpcups/Scaler.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcups-Scaler.Tpo $(DEPDIR)/hpcups-Scaler.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpcups/Scaler.cpp' object='hpcups-Scaler.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -c -o hpcups-Scaler.o `test -f 'prnt/hpcups/Scaler.cpp' || echo '$(srcdir)/'`prnt/hpcups/Scaler.cpp
+
+hpcups-Scaler.obj: prnt/hpcups/Scaler.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -MT hpcups-Scaler.obj -MD -MP -MF $(DEPDIR)/hpcups-Scaler.Tpo -c -o hpcups-Scaler.obj `if test -f 'prnt/hpcups/Scaler.cpp'; then $(CYGPATH_W) 'prnt/hpcups/Scaler.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/Scaler.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcups-Scaler.Tpo $(DEPDIR)/hpcups-Scaler.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpcups/Scaler.cpp' object='hpcups-Scaler.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -c -o hpcups-Scaler.obj `if test -f 'prnt/hpcups/Scaler.cpp'; then $(CYGPATH_W) 'prnt/hpcups/Scaler.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/Scaler.cpp'; fi`
+
+hpcups-dj400ColorMaps.o: prnt/hpcups/dj400ColorMaps.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -MT hpcups-dj400ColorMaps.o -MD -MP -MF $(DEPDIR)/hpcups-dj400ColorMaps.Tpo -c -o hpcups-dj400ColorMaps.o `test -f 'prnt/hpcups/dj400ColorMaps.cpp' || echo '$(srcdir)/'`prnt/hpcups/dj400ColorMaps.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcups-dj400ColorMaps.Tpo $(DEPDIR)/hpcups-dj400ColorMaps.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpcups/dj400ColorMaps.cpp' object='hpcups-dj400ColorMaps.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -c -o hpcups-dj400ColorMaps.o `test -f 'prnt/hpcups/dj400ColorMaps.cpp' || echo '$(srcdir)/'`prnt/hpcups/dj400ColorMaps.cpp
+
+hpcups-dj400ColorMaps.obj: prnt/hpcups/dj400ColorMaps.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -MT hpcups-dj400ColorMaps.obj -MD -MP -MF $(DEPDIR)/hpcups-dj400ColorMaps.Tpo -c -o hpcups-dj400ColorMaps.obj `if test -f 'prnt/hpcups/dj400ColorMaps.cpp'; then $(CYGPATH_W) 'prnt/hpcups/dj400ColorMaps.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/dj400ColorMaps.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcups-dj400ColorMaps.Tpo $(DEPDIR)/hpcups-dj400ColorMaps.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpcups/dj400ColorMaps.cpp' object='hpcups-dj400ColorMaps.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -c -o hpcups-dj400ColorMaps.obj `if test -f 'prnt/hpcups/dj400ColorMaps.cpp'; then $(CYGPATH_W) 'prnt/hpcups/dj400ColorMaps.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/dj400ColorMaps.cpp'; fi`
+
+hpcups-dj600ColorMaps.o: prnt/hpcups/dj600ColorMaps.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -MT hpcups-dj600ColorMaps.o -MD -MP -MF $(DEPDIR)/hpcups-dj600ColorMaps.Tpo -c -o hpcups-dj600ColorMaps.o `test -f 'prnt/hpcups/dj600ColorMaps.cpp' || echo '$(srcdir)/'`prnt/hpcups/dj600ColorMaps.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcups-dj600ColorMaps.Tpo $(DEPDIR)/hpcups-dj600ColorMaps.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpcups/dj600ColorMaps.cpp' object='hpcups-dj600ColorMaps.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -c -o hpcups-dj600ColorMaps.o `test -f 'prnt/hpcups/dj600ColorMaps.cpp' || echo '$(srcdir)/'`prnt/hpcups/dj600ColorMaps.cpp
+
+hpcups-dj600ColorMaps.obj: prnt/hpcups/dj600ColorMaps.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -MT hpcups-dj600ColorMaps.obj -MD -MP -MF $(DEPDIR)/hpcups-dj600ColorMaps.Tpo -c -o hpcups-dj600ColorMaps.obj `if test -f 'prnt/hpcups/dj600ColorMaps.cpp'; then $(CYGPATH_W) 'prnt/hpcups/dj600ColorMaps.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/dj600ColorMaps.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcups-dj600ColorMaps.Tpo $(DEPDIR)/hpcups-dj600ColorMaps.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpcups/dj600ColorMaps.cpp' object='hpcups-dj600ColorMaps.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -c -o hpcups-dj600ColorMaps.obj `if test -f 'prnt/hpcups/dj600ColorMaps.cpp'; then $(CYGPATH_W) 'prnt/hpcups/dj600ColorMaps.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/dj600ColorMaps.cpp'; fi`
+
+hpcups-dj970ColorMaps.o: prnt/hpcups/dj970ColorMaps.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -MT hpcups-dj970ColorMaps.o -MD -MP -MF $(DEPDIR)/hpcups-dj970ColorMaps.Tpo -c -o hpcups-dj970ColorMaps.o `test -f 'prnt/hpcups/dj970ColorMaps.cpp' || echo '$(srcdir)/'`prnt/hpcups/dj970ColorMaps.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcups-dj970ColorMaps.Tpo $(DEPDIR)/hpcups-dj970ColorMaps.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpcups/dj970ColorMaps.cpp' object='hpcups-dj970ColorMaps.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -c -o hpcups-dj970ColorMaps.o `test -f 'prnt/hpcups/dj970ColorMaps.cpp' || echo '$(srcdir)/'`prnt/hpcups/dj970ColorMaps.cpp
+
+hpcups-dj970ColorMaps.obj: prnt/hpcups/dj970ColorMaps.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -MT hpcups-dj970ColorMaps.obj -MD -MP -MF $(DEPDIR)/hpcups-dj970ColorMaps.Tpo -c -o hpcups-dj970ColorMaps.obj `if test -f 'prnt/hpcups/dj970ColorMaps.cpp'; then $(CYGPATH_W) 'prnt/hpcups/dj970ColorMaps.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/dj970ColorMaps.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcups-dj970ColorMaps.Tpo $(DEPDIR)/hpcups-dj970ColorMaps.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpcups/dj970ColorMaps.cpp' object='hpcups-dj970ColorMaps.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -c -o hpcups-dj970ColorMaps.obj `if test -f 'prnt/hpcups/dj970ColorMaps.cpp'; then $(CYGPATH_W) 'prnt/hpcups/dj970ColorMaps.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/dj970ColorMaps.cpp'; fi`
+
+hpcups-dj8xxColorMaps.o: prnt/hpcups/dj8xxColorMaps.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -MT hpcups-dj8xxColorMaps.o -MD -MP -MF $(DEPDIR)/hpcups-dj8xxColorMaps.Tpo -c -o hpcups-dj8xxColorMaps.o `test -f 'prnt/hpcups/dj8xxColorMaps.cpp' || echo '$(srcdir)/'`prnt/hpcups/dj8xxColorMaps.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcups-dj8xxColorMaps.Tpo $(DEPDIR)/hpcups-dj8xxColorMaps.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpcups/dj8xxColorMaps.cpp' object='hpcups-dj8xxColorMaps.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -c -o hpcups-dj8xxColorMaps.o `test -f 'prnt/hpcups/dj8xxColorMaps.cpp' || echo '$(srcdir)/'`prnt/hpcups/dj8xxColorMaps.cpp
+
+hpcups-dj8xxColorMaps.obj: prnt/hpcups/dj8xxColorMaps.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -MT hpcups-dj8xxColorMaps.obj -MD -MP -MF $(DEPDIR)/hpcups-dj8xxColorMaps.Tpo -c -o hpcups-dj8xxColorMaps.obj `if test -f 'prnt/hpcups/dj8xxColorMaps.cpp'; then $(CYGPATH_W) 'prnt/hpcups/dj8xxColorMaps.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/dj8xxColorMaps.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcups-dj8xxColorMaps.Tpo $(DEPDIR)/hpcups-dj8xxColorMaps.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpcups/dj8xxColorMaps.cpp' object='hpcups-dj8xxColorMaps.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -c -o hpcups-dj8xxColorMaps.obj `if test -f 'prnt/hpcups/dj8xxColorMaps.cpp'; then $(CYGPATH_W) 'prnt/hpcups/dj8xxColorMaps.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/dj8xxColorMaps.cpp'; fi`
+
+hpcups-dj4100ColorMaps.o: prnt/hpcups/dj4100ColorMaps.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -MT hpcups-dj4100ColorMaps.o -MD -MP -MF $(DEPDIR)/hpcups-dj4100ColorMaps.Tpo -c -o hpcups-dj4100ColorMaps.o `test -f 'prnt/hpcups/dj4100ColorMaps.cpp' || echo '$(srcdir)/'`prnt/hpcups/dj4100ColorMaps.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcups-dj4100ColorMaps.Tpo $(DEPDIR)/hpcups-dj4100ColorMaps.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpcups/dj4100ColorMaps.cpp' object='hpcups-dj4100ColorMaps.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -c -o hpcups-dj4100ColorMaps.o `test -f 'prnt/hpcups/dj4100ColorMaps.cpp' || echo '$(srcdir)/'`prnt/hpcups/dj4100ColorMaps.cpp
+
+hpcups-dj4100ColorMaps.obj: prnt/hpcups/dj4100ColorMaps.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -MT hpcups-dj4100ColorMaps.obj -MD -MP -MF $(DEPDIR)/hpcups-dj4100ColorMaps.Tpo -c -o hpcups-dj4100ColorMaps.obj `if test -f 'prnt/hpcups/dj4100ColorMaps.cpp'; then $(CYGPATH_W) 'prnt/hpcups/dj4100ColorMaps.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/dj4100ColorMaps.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcups-dj4100ColorMaps.Tpo $(DEPDIR)/hpcups-dj4100ColorMaps.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpcups/dj4100ColorMaps.cpp' object='hpcups-dj4100ColorMaps.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -c -o hpcups-dj4100ColorMaps.obj `if test -f 'prnt/hpcups/dj4100ColorMaps.cpp'; then $(CYGPATH_W) 'prnt/hpcups/dj4100ColorMaps.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/dj4100ColorMaps.cpp'; fi`
+
+hpcups-BreakTables.o: prnt/hpcups/BreakTables.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -MT hpcups-BreakTables.o -MD -MP -MF $(DEPDIR)/hpcups-BreakTables.Tpo -c -o hpcups-BreakTables.o `test -f 'prnt/hpcups/BreakTables.cpp' || echo '$(srcdir)/'`prnt/hpcups/BreakTables.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcups-BreakTables.Tpo $(DEPDIR)/hpcups-BreakTables.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpcups/BreakTables.cpp' object='hpcups-BreakTables.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -c -o hpcups-BreakTables.o `test -f 'prnt/hpcups/BreakTables.cpp' || echo '$(srcdir)/'`prnt/hpcups/BreakTables.cpp
+
+hpcups-BreakTables.obj: prnt/hpcups/BreakTables.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -MT hpcups-BreakTables.obj -MD -MP -MF $(DEPDIR)/hpcups-BreakTables.Tpo -c -o hpcups-BreakTables.obj `if test -f 'prnt/hpcups/BreakTables.cpp'; then $(CYGPATH_W) 'prnt/hpcups/BreakTables.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/BreakTables.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcups-BreakTables.Tpo $(DEPDIR)/hpcups-BreakTables.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpcups/BreakTables.cpp' object='hpcups-BreakTables.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -c -o hpcups-BreakTables.obj `if test -f 'prnt/hpcups/BreakTables.cpp'; then $(CYGPATH_W) 'prnt/hpcups/BreakTables.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/BreakTables.cpp'; fi`
+
+hpcups-Utils.o: prnt/hpcups/Utils.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -MT hpcups-Utils.o -MD -MP -MF $(DEPDIR)/hpcups-Utils.Tpo -c -o hpcups-Utils.o `test -f 'prnt/hpcups/Utils.cpp' || echo '$(srcdir)/'`prnt/hpcups/Utils.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcups-Utils.Tpo $(DEPDIR)/hpcups-Utils.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpcups/Utils.cpp' object='hpcups-Utils.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -c -o hpcups-Utils.o `test -f 'prnt/hpcups/Utils.cpp' || echo '$(srcdir)/'`prnt/hpcups/Utils.cpp
+
+hpcups-Utils.obj: prnt/hpcups/Utils.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -MT hpcups-Utils.obj -MD -MP -MF $(DEPDIR)/hpcups-Utils.Tpo -c -o hpcups-Utils.obj `if test -f 'prnt/hpcups/Utils.cpp'; then $(CYGPATH_W) 'prnt/hpcups/Utils.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/Utils.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcups-Utils.Tpo $(DEPDIR)/hpcups-Utils.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpcups/Utils.cpp' object='hpcups-Utils.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -c -o hpcups-Utils.obj `if test -f 'prnt/hpcups/Utils.cpp'; then $(CYGPATH_W) 'prnt/hpcups/Utils.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/Utils.cpp'; fi`
+
+hpcups-SystemServices.o: prnt/hpcups/SystemServices.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -MT hpcups-SystemServices.o -MD -MP -MF $(DEPDIR)/hpcups-SystemServices.Tpo -c -o hpcups-SystemServices.o `test -f 'prnt/hpcups/SystemServices.cpp' || echo '$(srcdir)/'`prnt/hpcups/SystemServices.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcups-SystemServices.Tpo $(DEPDIR)/hpcups-SystemServices.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpcups/SystemServices.cpp' object='hpcups-SystemServices.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -c -o hpcups-SystemServices.o `test -f 'prnt/hpcups/SystemServices.cpp' || echo '$(srcdir)/'`prnt/hpcups/SystemServices.cpp
+
+hpcups-SystemServices.obj: prnt/hpcups/SystemServices.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -MT hpcups-SystemServices.obj -MD -MP -MF $(DEPDIR)/hpcups-SystemServices.Tpo -c -o hpcups-SystemServices.obj `if test -f 'prnt/hpcups/SystemServices.cpp'; then $(CYGPATH_W) 'prnt/hpcups/SystemServices.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/SystemServices.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcups-SystemServices.Tpo $(DEPDIR)/hpcups-SystemServices.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpcups/SystemServices.cpp' object='hpcups-SystemServices.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -c -o hpcups-SystemServices.obj `if test -f 'prnt/hpcups/SystemServices.cpp'; then $(CYGPATH_W) 'prnt/hpcups/SystemServices.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/SystemServices.cpp'; fi`
+
+hpcups-QuickConnect.o: prnt/hpcups/QuickConnect.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -MT hpcups-QuickConnect.o -MD -MP -MF $(DEPDIR)/hpcups-QuickConnect.Tpo -c -o hpcups-QuickConnect.o `test -f 'prnt/hpcups/QuickConnect.cpp' || echo '$(srcdir)/'`prnt/hpcups/QuickConnect.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcups-QuickConnect.Tpo $(DEPDIR)/hpcups-QuickConnect.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpcups/QuickConnect.cpp' object='hpcups-QuickConnect.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -c -o hpcups-QuickConnect.o `test -f 'prnt/hpcups/QuickConnect.cpp' || echo '$(srcdir)/'`prnt/hpcups/QuickConnect.cpp
+
+hpcups-QuickConnect.obj: prnt/hpcups/QuickConnect.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -MT hpcups-QuickConnect.obj -MD -MP -MF $(DEPDIR)/hpcups-QuickConnect.Tpo -c -o hpcups-QuickConnect.obj `if test -f 'prnt/hpcups/QuickConnect.cpp'; then $(CYGPATH_W) 'prnt/hpcups/QuickConnect.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/QuickConnect.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcups-QuickConnect.Tpo $(DEPDIR)/hpcups-QuickConnect.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpcups/QuickConnect.cpp' object='hpcups-QuickConnect.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -c -o hpcups-QuickConnect.obj `if test -f 'prnt/hpcups/QuickConnect.cpp'; then $(CYGPATH_W) 'prnt/hpcups/QuickConnect.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/QuickConnect.cpp'; fi`
+
+hpcups-ModeJpeg.o: prnt/hpcups/ModeJpeg.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -MT hpcups-ModeJpeg.o -MD -MP -MF $(DEPDIR)/hpcups-ModeJpeg.Tpo -c -o hpcups-ModeJpeg.o `test -f 'prnt/hpcups/ModeJpeg.cpp' || echo '$(srcdir)/'`prnt/hpcups/ModeJpeg.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcups-ModeJpeg.Tpo $(DEPDIR)/hpcups-ModeJpeg.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpcups/ModeJpeg.cpp' object='hpcups-ModeJpeg.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -c -o hpcups-ModeJpeg.o `test -f 'prnt/hpcups/ModeJpeg.cpp' || echo '$(srcdir)/'`prnt/hpcups/ModeJpeg.cpp
+
+hpcups-ModeJpeg.obj: prnt/hpcups/ModeJpeg.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -MT hpcups-ModeJpeg.obj -MD -MP -MF $(DEPDIR)/hpcups-ModeJpeg.Tpo -c -o hpcups-ModeJpeg.obj `if test -f 'prnt/hpcups/ModeJpeg.cpp'; then $(CYGPATH_W) 'prnt/hpcups/ModeJpeg.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/ModeJpeg.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcups-ModeJpeg.Tpo $(DEPDIR)/hpcups-ModeJpeg.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpcups/ModeJpeg.cpp' object='hpcups-ModeJpeg.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -c -o hpcups-ModeJpeg.obj `if test -f 'prnt/hpcups/ModeJpeg.cpp'; then $(CYGPATH_W) 'prnt/hpcups/ModeJpeg.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/ModeJpeg.cpp'; fi`
+
+hpcups-Lidil.o: prnt/hpcups/Lidil.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -MT hpcups-Lidil.o -MD -MP -MF $(DEPDIR)/hpcups-Lidil.Tpo -c -o hpcups-Lidil.o `test -f 'prnt/hpcups/Lidil.cpp' || echo '$(srcdir)/'`prnt/hpcups/Lidil.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcups-Lidil.Tpo $(DEPDIR)/hpcups-Lidil.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpcups/Lidil.cpp' object='hpcups-Lidil.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -c -o hpcups-Lidil.o `test -f 'prnt/hpcups/Lidil.cpp' || echo '$(srcdir)/'`prnt/hpcups/Lidil.cpp
+
+hpcups-Lidil.obj: prnt/hpcups/Lidil.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -MT hpcups-Lidil.obj -MD -MP -MF $(DEPDIR)/hpcups-Lidil.Tpo -c -o hpcups-Lidil.obj `if test -f 'prnt/hpcups/Lidil.cpp'; then $(CYGPATH_W) 'prnt/hpcups/Lidil.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/Lidil.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcups-Lidil.Tpo $(DEPDIR)/hpcups-Lidil.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpcups/Lidil.cpp' object='hpcups-Lidil.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -c -o hpcups-Lidil.obj `if test -f 'prnt/hpcups/Lidil.cpp'; then $(CYGPATH_W) 'prnt/hpcups/Lidil.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/Lidil.cpp'; fi`
+
+hpcups-LidilCompress.o: prnt/hpcups/LidilCompress.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -MT hpcups-LidilCompress.o -MD -MP -MF $(DEPDIR)/hpcups-LidilCompress.Tpo -c -o hpcups-LidilCompress.o `test -f 'prnt/hpcups/LidilCompress.cpp' || echo '$(srcdir)/'`prnt/hpcups/LidilCompress.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcups-LidilCompress.Tpo $(DEPDIR)/hpcups-LidilCompress.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpcups/LidilCompress.cpp' object='hpcups-LidilCompress.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -c -o hpcups-LidilCompress.o `test -f 'prnt/hpcups/LidilCompress.cpp' || echo '$(srcdir)/'`prnt/hpcups/LidilCompress.cpp
+
+hpcups-LidilCompress.obj: prnt/hpcups/LidilCompress.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -MT hpcups-LidilCompress.obj -MD -MP -MF $(DEPDIR)/hpcups-LidilCompress.Tpo -c -o hpcups-LidilCompress.obj `if test -f 'prnt/hpcups/LidilCompress.cpp'; then $(CYGPATH_W) 'prnt/hpcups/LidilCompress.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/LidilCompress.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcups-LidilCompress.Tpo $(DEPDIR)/hpcups-LidilCompress.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpcups/LidilCompress.cpp' object='hpcups-LidilCompress.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -c -o hpcups-LidilCompress.obj `if test -f 'prnt/hpcups/LidilCompress.cpp'; then $(CYGPATH_W) 'prnt/hpcups/LidilCompress.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/LidilCompress.cpp'; fi`
+
+hpcups-dj3320ColorMaps.o: prnt/hpcups/dj3320ColorMaps.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -MT hpcups-dj3320ColorMaps.o -MD -MP -MF $(DEPDIR)/hpcups-dj3320ColorMaps.Tpo -c -o hpcups-dj3320ColorMaps.o `test -f 'prnt/hpcups/dj3320ColorMaps.cpp' || echo '$(srcdir)/'`prnt/hpcups/dj3320ColorMaps.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcups-dj3320ColorMaps.Tpo $(DEPDIR)/hpcups-dj3320ColorMaps.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpcups/dj3320ColorMaps.cpp' object='hpcups-dj3320ColorMaps.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -c -o hpcups-dj3320ColorMaps.o `test -f 'prnt/hpcups/dj3320ColorMaps.cpp' || echo '$(srcdir)/'`prnt/hpcups/dj3320ColorMaps.cpp
+
+hpcups-dj3320ColorMaps.obj: prnt/hpcups/dj3320ColorMaps.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -MT hpcups-dj3320ColorMaps.obj -MD -MP -MF $(DEPDIR)/hpcups-dj3320ColorMaps.Tpo -c -o hpcups-dj3320ColorMaps.obj `if test -f 'prnt/hpcups/dj3320ColorMaps.cpp'; then $(CYGPATH_W) 'prnt/hpcups/dj3320ColorMaps.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/dj3320ColorMaps.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcups-dj3320ColorMaps.Tpo $(DEPDIR)/hpcups-dj3320ColorMaps.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpcups/dj3320ColorMaps.cpp' object='hpcups-dj3320ColorMaps.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -c -o hpcups-dj3320ColorMaps.obj `if test -f 'prnt/hpcups/dj3320ColorMaps.cpp'; then $(CYGPATH_W) 'prnt/hpcups/dj3320ColorMaps.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/dj3320ColorMaps.cpp'; fi`
+
+hpcups-dj3600ColorMaps.o: prnt/hpcups/dj3600ColorMaps.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -MT hpcups-dj3600ColorMaps.o -MD -MP -MF $(DEPDIR)/hpcups-dj3600ColorMaps.Tpo -c -o hpcups-dj3600ColorMaps.o `test -f 'prnt/hpcups/dj3600ColorMaps.cpp' || echo '$(srcdir)/'`prnt/hpcups/dj3600ColorMaps.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcups-dj3600ColorMaps.Tpo $(DEPDIR)/hpcups-dj3600ColorMaps.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpcups/dj3600ColorMaps.cpp' object='hpcups-dj3600ColorMaps.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -c -o hpcups-dj3600ColorMaps.o `test -f 'prnt/hpcups/dj3600ColorMaps.cpp' || echo '$(srcdir)/'`prnt/hpcups/dj3600ColorMaps.cpp
+
+hpcups-dj3600ColorMaps.obj: prnt/hpcups/dj3600ColorMaps.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -MT hpcups-dj3600ColorMaps.obj -MD -MP -MF $(DEPDIR)/hpcups-dj3600ColorMaps.Tpo -c -o hpcups-dj3600ColorMaps.obj `if test -f 'prnt/hpcups/dj3600ColorMaps.cpp'; then $(CYGPATH_W) 'prnt/hpcups/dj3600ColorMaps.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/dj3600ColorMaps.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcups-dj3600ColorMaps.Tpo $(DEPDIR)/hpcups-dj3600ColorMaps.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpcups/dj3600ColorMaps.cpp' object='hpcups-dj3600ColorMaps.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpcups_CXXFLAGS) $(CXXFLAGS) -c -o hpcups-dj3600ColorMaps.obj `if test -f 'prnt/hpcups/dj3600ColorMaps.cpp'; then $(CYGPATH_W) 'prnt/hpcups/dj3600ColorMaps.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpcups/dj3600ColorMaps.cpp'; fi`
+
+hpcupsfax.o: prnt/hpijs/hpcupsfax.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT hpcupsfax.o -MD -MP -MF $(DEPDIR)/hpcupsfax.Tpo -c -o hpcupsfax.o `test -f 'prnt/hpijs/hpcupsfax.cpp' || echo '$(srcdir)/'`prnt/hpijs/hpcupsfax.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcupsfax.Tpo $(DEPDIR)/hpcupsfax.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpijs/hpcupsfax.cpp' object='hpcupsfax.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o hpcupsfax.o `test -f 'prnt/hpijs/hpcupsfax.cpp' || echo '$(srcdir)/'`prnt/hpijs/hpcupsfax.cpp
+
+hpcupsfax.obj: prnt/hpijs/hpcupsfax.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT hpcupsfax.obj -MD -MP -MF $(DEPDIR)/hpcupsfax.Tpo -c -o hpcupsfax.obj `if test -f 'prnt/hpijs/hpcupsfax.cpp'; then $(CYGPATH_W) 'prnt/hpijs/hpcupsfax.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpijs/hpcupsfax.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpcupsfax.Tpo $(DEPDIR)/hpcupsfax.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpijs/hpcupsfax.cpp' object='hpcupsfax.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o hpcupsfax.obj `if test -f 'prnt/hpijs/hpcupsfax.cpp'; then $(CYGPATH_W) 'prnt/hpijs/hpcupsfax.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpijs/hpcupsfax.cpp'; fi`
+
+hpijs-hpijs.o: prnt/hpijs/hpijs.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpijs_CXXFLAGS) $(CXXFLAGS) -MT hpijs-hpijs.o -MD -MP -MF $(DEPDIR)/hpijs-hpijs.Tpo -c -o hpijs-hpijs.o `test -f 'prnt/hpijs/hpijs.cpp' || echo '$(srcdir)/'`prnt/hpijs/hpijs.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpijs-hpijs.Tpo $(DEPDIR)/hpijs-hpijs.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpijs/hpijs.cpp' object='hpijs-hpijs.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpijs_CXXFLAGS) $(CXXFLAGS) -c -o hpijs-hpijs.o `test -f 'prnt/hpijs/hpijs.cpp' || echo '$(srcdir)/'`prnt/hpijs/hpijs.cpp
+
+hpijs-hpijs.obj: prnt/hpijs/hpijs.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpijs_CXXFLAGS) $(CXXFLAGS) -MT hpijs-hpijs.obj -MD -MP -MF $(DEPDIR)/hpijs-hpijs.Tpo -c -o hpijs-hpijs.obj `if test -f 'prnt/hpijs/hpijs.cpp'; then $(CYGPATH_W) 'prnt/hpijs/hpijs.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpijs/hpijs.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpijs-hpijs.Tpo $(DEPDIR)/hpijs-hpijs.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpijs/hpijs.cpp' object='hpijs-hpijs.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpijs_CXXFLAGS) $(CXXFLAGS) -c -o hpijs-hpijs.obj `if test -f 'prnt/hpijs/hpijs.cpp'; then $(CYGPATH_W) 'prnt/hpijs/hpijs.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpijs/hpijs.cpp'; fi`
+
+hpijs-hpijsfax.o: prnt/hpijs/hpijsfax.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpijs_CXXFLAGS) $(CXXFLAGS) -MT hpijs-hpijsfax.o -MD -MP -MF $(DEPDIR)/hpijs-hpijsfax.Tpo -c -o hpijs-hpijsfax.o `test -f 'prnt/hpijs/hpijsfax.cpp' || echo '$(srcdir)/'`prnt/hpijs/hpijsfax.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpijs-hpijsfax.Tpo $(DEPDIR)/hpijs-hpijsfax.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpijs/hpijsfax.cpp' object='hpijs-hpijsfax.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpijs_CXXFLAGS) $(CXXFLAGS) -c -o hpijs-hpijsfax.o `test -f 'prnt/hpijs/hpijsfax.cpp' || echo '$(srcdir)/'`prnt/hpijs/hpijsfax.cpp
+
+hpijs-hpijsfax.obj: prnt/hpijs/hpijsfax.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpijs_CXXFLAGS) $(CXXFLAGS) -MT hpijs-hpijsfax.obj -MD -MP -MF $(DEPDIR)/hpijs-hpijsfax.Tpo -c -o hpijs-hpijsfax.obj `if test -f 'prnt/hpijs/hpijsfax.cpp'; then $(CYGPATH_W) 'prnt/hpijs/hpijsfax.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpijs/hpijsfax.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpijs-hpijsfax.Tpo $(DEPDIR)/hpijs-hpijsfax.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpijs/hpijsfax.cpp' object='hpijs-hpijsfax.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpijs_CXXFLAGS) $(CXXFLAGS) -c -o hpijs-hpijsfax.obj `if test -f 'prnt/hpijs/hpijsfax.cpp'; then $(CYGPATH_W) 'prnt/hpijs/hpijsfax.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpijs/hpijsfax.cpp'; fi`
+
+hpijs-services.o: prnt/hpijs/services.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpijs_CXXFLAGS) $(CXXFLAGS) -MT hpijs-services.o -MD -MP -MF $(DEPDIR)/hpijs-services.Tpo -c -o hpijs-services.o `test -f 'prnt/hpijs/services.cpp' || echo '$(srcdir)/'`prnt/hpijs/services.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpijs-services.Tpo $(DEPDIR)/hpijs-services.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpijs/services.cpp' object='hpijs-services.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpijs_CXXFLAGS) $(CXXFLAGS) -c -o hpijs-services.o `test -f 'prnt/hpijs/services.cpp' || echo '$(srcdir)/'`prnt/hpijs/services.cpp
+
+hpijs-services.obj: prnt/hpijs/services.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpijs_CXXFLAGS) $(CXXFLAGS) -MT hpijs-services.obj -MD -MP -MF $(DEPDIR)/hpijs-services.Tpo -c -o hpijs-services.obj `if test -f 'prnt/hpijs/services.cpp'; then $(CYGPATH_W) 'prnt/hpijs/services.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpijs/services.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hpijs-services.Tpo $(DEPDIR)/hpijs-services.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpijs/services.cpp' object='hpijs-services.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hpijs_CXXFLAGS) $(CXXFLAGS) -c -o hpijs-services.obj `if test -f 'prnt/hpijs/services.cpp'; then $(CYGPATH_W) 'prnt/hpijs/services.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpijs/services.cpp'; fi`
+
+hppgsz-PrinterProperties.o: prnt/hpijs/PrinterProperties.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hppgsz_CXXFLAGS) $(CXXFLAGS) -MT hppgsz-PrinterProperties.o -MD -MP -MF $(DEPDIR)/hppgsz-PrinterProperties.Tpo -c -o hppgsz-PrinterProperties.o `test -f 'prnt/hpijs/PrinterProperties.cpp' || echo '$(srcdir)/'`prnt/hpijs/PrinterProperties.cpp
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hppgsz-PrinterProperties.Tpo $(DEPDIR)/hppgsz-PrinterProperties.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpijs/PrinterProperties.cpp' object='hppgsz-PrinterProperties.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hppgsz_CXXFLAGS) $(CXXFLAGS) -c -o hppgsz-PrinterProperties.o `test -f 'prnt/hpijs/PrinterProperties.cpp' || echo '$(srcdir)/'`prnt/hpijs/PrinterProperties.cpp
+
+hppgsz-PrinterProperties.obj: prnt/hpijs/PrinterProperties.cpp
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hppgsz_CXXFLAGS) $(CXXFLAGS) -MT hppgsz-PrinterProperties.obj -MD -MP -MF $(DEPDIR)/hppgsz-PrinterProperties.Tpo -c -o hppgsz-PrinterProperties.obj `if test -f 'prnt/hpijs/PrinterProperties.cpp'; then $(CYGPATH_W) 'prnt/hpijs/PrinterProperties.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpijs/PrinterProperties.cpp'; fi`
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hppgsz-PrinterProperties.Tpo $(DEPDIR)/hppgsz-PrinterProperties.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='prnt/hpijs/PrinterProperties.cpp' object='hppgsz-PrinterProperties.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hppgsz_CXXFLAGS) $(CXXFLAGS) -c -o hppgsz-PrinterProperties.obj `if test -f 'prnt/hpijs/PrinterProperties.cpp'; then $(CYGPATH_W) 'prnt/hpijs/PrinterProperties.cpp'; else $(CYGPATH_W) '$(srcdir)/prnt/hpijs/PrinterProperties.cpp'; fi`
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool config.lt
+install-cupsdrvDATA: $(cupsdrv_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(cupsdrvdir)" || $(MKDIR_P) "$(DESTDIR)$(cupsdrvdir)"
+ @list='$(cupsdrv_DATA)'; test -n "$(cupsdrvdir)" || list=; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(cupsdrvdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(cupsdrvdir)" || exit $$?; \
+ done
+
+uninstall-cupsdrvDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(cupsdrv_DATA)'; test -n "$(cupsdrvdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(cupsdrvdir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(cupsdrvdir)" && rm -f $$files
+install-cupsdrv2DATA: $(cupsdrv2_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(cupsdrv2dir)" || $(MKDIR_P) "$(DESTDIR)$(cupsdrv2dir)"
+ @list='$(cupsdrv2_DATA)'; test -n "$(cupsdrv2dir)" || list=; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(cupsdrv2dir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(cupsdrv2dir)" || exit $$?; \
+ done
+
+uninstall-cupsdrv2DATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(cupsdrv2_DATA)'; test -n "$(cupsdrv2dir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(cupsdrv2dir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(cupsdrv2dir)" && rm -f $$files
+install-dist_baseDATA: $(dist_base_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(basedir)" || $(MKDIR_P) "$(DESTDIR)$(basedir)"
+ @list='$(dist_base_DATA)'; test -n "$(basedir)" || list=; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(basedir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(basedir)" || exit $$?; \
+ done
+
+uninstall-dist_baseDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(dist_base_DATA)'; test -n "$(basedir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(basedir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(basedir)" && rm -f $$files
+install-dist_copierDATA: $(dist_copier_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(copierdir)" || $(MKDIR_P) "$(DESTDIR)$(copierdir)"
+ @list='$(dist_copier_DATA)'; test -n "$(copierdir)" || list=; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(copierdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(copierdir)" || exit $$?; \
+ done
+
+uninstall-dist_copierDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(dist_copier_DATA)'; test -n "$(copierdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(copierdir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(copierdir)" && rm -f $$files
+install-dist_faxDATA: $(dist_fax_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(faxdir)" || $(MKDIR_P) "$(DESTDIR)$(faxdir)"
+ @list='$(dist_fax_DATA)'; test -n "$(faxdir)" || list=; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(faxdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(faxdir)" || exit $$?; \
+ done
+
+uninstall-dist_faxDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(dist_fax_DATA)'; test -n "$(faxdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(faxdir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(faxdir)" && rm -f $$files
+install-dist_fax_filtersDATA: $(dist_fax_filters_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(fax_filtersdir)" || $(MKDIR_P) "$(DESTDIR)$(fax_filtersdir)"
+ @list='$(dist_fax_filters_DATA)'; test -n "$(fax_filtersdir)" || list=; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(fax_filtersdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(fax_filtersdir)" || exit $$?; \
+ done
+
+uninstall-dist_fax_filtersDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(dist_fax_filters_DATA)'; test -n "$(fax_filtersdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(fax_filtersdir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(fax_filtersdir)" && rm -f $$files
+install-dist_halpreDATA: $(dist_halpre_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(halpredir)" || $(MKDIR_P) "$(DESTDIR)$(halpredir)"
+ @list='$(dist_halpre_DATA)'; test -n "$(halpredir)" || list=; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(halpredir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(halpredir)" || exit $$?; \
+ done
+
+uninstall-dist_halpreDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(dist_halpre_DATA)'; test -n "$(halpredir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(halpredir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(halpredir)" && rm -f $$files
+install-dist_hpcupsfaxppdDATA: $(dist_hpcupsfaxppd_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(hpcupsfaxppddir)" || $(MKDIR_P) "$(DESTDIR)$(hpcupsfaxppddir)"
+ @list='$(dist_hpcupsfaxppd_DATA)'; test -n "$(hpcupsfaxppddir)" || list=; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(hpcupsfaxppddir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(hpcupsfaxppddir)" || exit $$?; \
+ done
+
+uninstall-dist_hpcupsfaxppdDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(dist_hpcupsfaxppd_DATA)'; test -n "$(hpcupsfaxppddir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(hpcupsfaxppddir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(hpcupsfaxppddir)" && rm -f $$files
+install-dist_hpijsfaxppdDATA: $(dist_hpijsfaxppd_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(hpijsfaxppddir)" || $(MKDIR_P) "$(DESTDIR)$(hpijsfaxppddir)"
+ @list='$(dist_hpijsfaxppd_DATA)'; test -n "$(hpijsfaxppddir)" || list=; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(hpijsfaxppddir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(hpijsfaxppddir)" || exit $$?; \
+ done
+
+uninstall-dist_hpijsfaxppdDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(dist_hpijsfaxppd_DATA)'; test -n "$(hpijsfaxppddir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(hpijsfaxppddir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(hpijsfaxppddir)" && rm -f $$files
+
+uninstall-dist_hplip_LogDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(dist_hplip_Log_DATA)'; test -n "$(hplip_Logdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(hplip_Logdir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(hplip_Logdir)" && rm -f $$files
+install-dist_hplip_stateDATA: $(dist_hplip_state_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(hplip_statedir)" || $(MKDIR_P) "$(DESTDIR)$(hplip_statedir)"
+ @list='$(dist_hplip_state_DATA)'; test -n "$(hplip_statedir)" || list=; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(hplip_statedir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(hplip_statedir)" || exit $$?; \
+ done
+
+uninstall-dist_hplip_stateDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(dist_hplip_state_DATA)'; test -n "$(hplip_statedir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(hplip_statedir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(hplip_statedir)" && rm -f $$files
+install-dist_images_128x128DATA: $(dist_images_128x128_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(images_128x128dir)" || $(MKDIR_P) "$(DESTDIR)$(images_128x128dir)"
+ @list='$(dist_images_128x128_DATA)'; test -n "$(images_128x128dir)" || list=; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(images_128x128dir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(images_128x128dir)" || exit $$?; \
+ done
+
+uninstall-dist_images_128x128DATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(dist_images_128x128_DATA)'; test -n "$(images_128x128dir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(images_128x128dir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(images_128x128dir)" && rm -f $$files
+install-dist_images_16x16DATA: $(dist_images_16x16_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(images_16x16dir)" || $(MKDIR_P) "$(DESTDIR)$(images_16x16dir)"
+ @list='$(dist_images_16x16_DATA)'; test -n "$(images_16x16dir)" || list=; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(images_16x16dir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(images_16x16dir)" || exit $$?; \
+ done
+
+uninstall-dist_images_16x16DATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(dist_images_16x16_DATA)'; test -n "$(images_16x16dir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(images_16x16dir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(images_16x16dir)" && rm -f $$files
+install-dist_images_24x24DATA: $(dist_images_24x24_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(images_24x24dir)" || $(MKDIR_P) "$(DESTDIR)$(images_24x24dir)"
+ @list='$(dist_images_24x24_DATA)'; test -n "$(images_24x24dir)" || list=; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(images_24x24dir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(images_24x24dir)" || exit $$?; \
+ done
+
+uninstall-dist_images_24x24DATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(dist_images_24x24_DATA)'; test -n "$(images_24x24dir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(images_24x24dir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(images_24x24dir)" && rm -f $$files
+install-dist_images_256x256DATA: $(dist_images_256x256_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(images_256x256dir)" || $(MKDIR_P) "$(DESTDIR)$(images_256x256dir)"
+ @list='$(dist_images_256x256_DATA)'; test -n "$(images_256x256dir)" || list=; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(images_256x256dir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(images_256x256dir)" || exit $$?; \
+ done
+
+uninstall-dist_images_256x256DATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(dist_images_256x256_DATA)'; test -n "$(images_256x256dir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(images_256x256dir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(images_256x256dir)" && rm -f $$files
+install-dist_images_32x32DATA: $(dist_images_32x32_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(images_32x32dir)" || $(MKDIR_P) "$(DESTDIR)$(images_32x32dir)"
+ @list='$(dist_images_32x32_DATA)'; test -n "$(images_32x32dir)" || list=; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(images_32x32dir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(images_32x32dir)" || exit $$?; \
+ done
+
+uninstall-dist_images_32x32DATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(dist_images_32x32_DATA)'; test -n "$(images_32x32dir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(images_32x32dir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(images_32x32dir)" && rm -f $$files
+install-dist_images_64x64DATA: $(dist_images_64x64_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(images_64x64dir)" || $(MKDIR_P) "$(DESTDIR)$(images_64x64dir)"
+ @list='$(dist_images_64x64_DATA)'; test -n "$(images_64x64dir)" || list=; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(images_64x64dir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(images_64x64dir)" || exit $$?; \
+ done
+
+uninstall-dist_images_64x64DATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(dist_images_64x64_DATA)'; test -n "$(images_64x64dir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(images_64x64dir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(images_64x64dir)" && rm -f $$files
+install-dist_images_devicesDATA: $(dist_images_devices_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(images_devicesdir)" || $(MKDIR_P) "$(DESTDIR)$(images_devicesdir)"
+ @list='$(dist_images_devices_DATA)'; test -n "$(images_devicesdir)" || list=; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(images_devicesdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(images_devicesdir)" || exit $$?; \
+ done
+
+uninstall-dist_images_devicesDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(dist_images_devices_DATA)'; test -n "$(images_devicesdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(images_devicesdir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(images_devicesdir)" && rm -f $$files
+install-dist_images_otherDATA: $(dist_images_other_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(images_otherdir)" || $(MKDIR_P) "$(DESTDIR)$(images_otherdir)"
+ @list='$(dist_images_other_DATA)'; test -n "$(images_otherdir)" || list=; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(images_otherdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(images_otherdir)" || exit $$?; \
+ done
+
+uninstall-dist_images_otherDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(dist_images_other_DATA)'; test -n "$(images_otherdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(images_otherdir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(images_otherdir)" && rm -f $$files
+install-dist_installDATA: $(dist_install_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(installdir)" || $(MKDIR_P) "$(DESTDIR)$(installdir)"
+ @list='$(dist_install_DATA)'; test -n "$(installdir)" || list=; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(installdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(installdir)" || exit $$?; \
+ done
+
+uninstall-dist_installDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(dist_install_DATA)'; test -n "$(installdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(installdir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(installdir)" && rm -f $$files
+install-dist_ldlDATA: $(dist_ldl_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(ldldir)" || $(MKDIR_P) "$(DESTDIR)$(ldldir)"
+ @list='$(dist_ldl_DATA)'; test -n "$(ldldir)" || list=; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(ldldir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(ldldir)" || exit $$?; \
+ done
+
+uninstall-dist_ldlDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(dist_ldl_DATA)'; test -n "$(ldldir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(ldldir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(ldldir)" && rm -f $$files
+install-dist_localzDATA: $(dist_localz_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(localzdir)" || $(MKDIR_P) "$(DESTDIR)$(localzdir)"
+ @list='$(dist_localz_DATA)'; test -n "$(localzdir)" || list=; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(localzdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(localzdir)" || exit $$?; \
+ done
+
+uninstall-dist_localzDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(dist_localz_DATA)'; test -n "$(localzdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(localzdir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(localzdir)" && rm -f $$files
+install-dist_modelsDATA: $(dist_models_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(modelsdir)" || $(MKDIR_P) "$(DESTDIR)$(modelsdir)"
+ @list='$(dist_models_DATA)'; test -n "$(modelsdir)" || list=; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(modelsdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(modelsdir)" || exit $$?; \
+ done
+
+uninstall-dist_modelsDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(dist_models_DATA)'; test -n "$(modelsdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(modelsdir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(modelsdir)" && rm -f $$files
+install-dist_pcardDATA: $(dist_pcard_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(pcarddir)" || $(MKDIR_P) "$(DESTDIR)$(pcarddir)"
+ @list='$(dist_pcard_DATA)'; test -n "$(pcarddir)" || list=; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pcarddir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(pcarddir)" || exit $$?; \
+ done
+
+uninstall-dist_pcardDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(dist_pcard_DATA)'; test -n "$(pcarddir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(pcarddir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(pcarddir)" && rm -f $$files
+install-dist_pclDATA: $(dist_pcl_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(pcldir)" || $(MKDIR_P) "$(DESTDIR)$(pcldir)"
+ @list='$(dist_pcl_DATA)'; test -n "$(pcldir)" || list=; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pcldir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(pcldir)" || exit $$?; \
+ done
+
+uninstall-dist_pclDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(dist_pcl_DATA)'; test -n "$(pcldir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(pcldir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(pcldir)" && rm -f $$files
+install-dist_pluginsDATA: $(dist_plugins_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(pluginsdir)" || $(MKDIR_P) "$(DESTDIR)$(pluginsdir)"
+ @list='$(dist_plugins_DATA)'; test -n "$(pluginsdir)" || list=; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pluginsdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(pluginsdir)" || exit $$?; \
+ done
+
+uninstall-dist_pluginsDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(dist_plugins_DATA)'; test -n "$(pluginsdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(pluginsdir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(pluginsdir)" && rm -f $$files
+install-dist_policykit_dbus_etcDATA: $(dist_policykit_dbus_etc_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(policykit_dbus_etcdir)" || $(MKDIR_P) "$(DESTDIR)$(policykit_dbus_etcdir)"
+ @list='$(dist_policykit_dbus_etc_DATA)'; test -n "$(policykit_dbus_etcdir)" || list=; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(policykit_dbus_etcdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(policykit_dbus_etcdir)" || exit $$?; \
+ done
+
+uninstall-dist_policykit_dbus_etcDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(dist_policykit_dbus_etc_DATA)'; test -n "$(policykit_dbus_etcdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(policykit_dbus_etcdir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(policykit_dbus_etcdir)" && rm -f $$files
+install-dist_policykit_dbus_shareDATA: $(dist_policykit_dbus_share_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(policykit_dbus_sharedir)" || $(MKDIR_P) "$(DESTDIR)$(policykit_dbus_sharedir)"
+ @list='$(dist_policykit_dbus_share_DATA)'; test -n "$(policykit_dbus_sharedir)" || list=; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(policykit_dbus_sharedir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(policykit_dbus_sharedir)" || exit $$?; \
+ done
+
+uninstall-dist_policykit_dbus_shareDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(dist_policykit_dbus_share_DATA)'; test -n "$(policykit_dbus_sharedir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(policykit_dbus_sharedir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(policykit_dbus_sharedir)" && rm -f $$files
+install-dist_policykit_policyDATA: $(dist_policykit_policy_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(policykit_policydir)" || $(MKDIR_P) "$(DESTDIR)$(policykit_policydir)"
+ @list='$(dist_policykit_policy_DATA)'; test -n "$(policykit_policydir)" || list=; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(policykit_policydir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(policykit_policydir)" || exit $$?; \
+ done
+
+uninstall-dist_policykit_policyDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(dist_policykit_policy_DATA)'; test -n "$(policykit_policydir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(policykit_policydir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(policykit_policydir)" && rm -f $$files
+install-dist_postscriptDATA: $(dist_postscript_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(postscriptdir)" || $(MKDIR_P) "$(DESTDIR)$(postscriptdir)"
+ @list='$(dist_postscript_DATA)'; test -n "$(postscriptdir)" || list=; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(postscriptdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(postscriptdir)" || exit $$?; \
+ done
+
+uninstall-dist_postscriptDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(dist_postscript_DATA)'; test -n "$(postscriptdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(postscriptdir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(postscriptdir)" && rm -f $$files
+install-dist_ppdDATA: $(dist_ppd_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(ppddir)" || $(MKDIR_P) "$(DESTDIR)$(ppddir)"
+ @list='$(dist_ppd_DATA)'; test -n "$(ppddir)" || list=; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(ppddir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(ppddir)" || exit $$?; \
+ done
+
+uninstall-dist_ppdDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(dist_ppd_DATA)'; test -n "$(ppddir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(ppddir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(ppddir)" && rm -f $$files
+install-dist_prntDATA: $(dist_prnt_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(prntdir)" || $(MKDIR_P) "$(DESTDIR)$(prntdir)"
+ @list='$(dist_prnt_DATA)'; test -n "$(prntdir)" || list=; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(prntdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(prntdir)" || exit $$?; \
+ done
+
+uninstall-dist_prntDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(dist_prnt_DATA)'; test -n "$(prntdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(prntdir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(prntdir)" && rm -f $$files
+install-dist_rulesDATA: $(dist_rules_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(rulesdir)" || $(MKDIR_P) "$(DESTDIR)$(rulesdir)"
+ @list='$(dist_rules_DATA)'; test -n "$(rulesdir)" || list=; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(rulesdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(rulesdir)" || exit $$?; \
+ done
+
+uninstall-dist_rulesDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(dist_rules_DATA)'; test -n "$(rulesdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(rulesdir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(rulesdir)" && rm -f $$files
+install-dist_scanDATA: $(dist_scan_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(scandir)" || $(MKDIR_P) "$(DESTDIR)$(scandir)"
+ @list='$(dist_scan_DATA)'; test -n "$(scandir)" || list=; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(scandir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(scandir)" || exit $$?; \
+ done
+
+uninstall-dist_scanDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(dist_scan_DATA)'; test -n "$(scandir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(scandir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(scandir)" && rm -f $$files
+install-dist_uiDATA: $(dist_ui_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(uidir)" || $(MKDIR_P) "$(DESTDIR)$(uidir)"
+ @list='$(dist_ui_DATA)'; test -n "$(uidir)" || list=; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(uidir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(uidir)" || exit $$?; \
+ done
+
+uninstall-dist_uiDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(dist_ui_DATA)'; test -n "$(uidir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(uidir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(uidir)" && rm -f $$files
+install-dist_ui4DATA: $(dist_ui4_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(ui4dir)" || $(MKDIR_P) "$(DESTDIR)$(ui4dir)"
+ @list='$(dist_ui4_DATA)'; test -n "$(ui4dir)" || list=; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(ui4dir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(ui4dir)" || exit $$?; \
+ done
+
+uninstall-dist_ui4DATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(dist_ui4_DATA)'; test -n "$(ui4dir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(ui4dir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(ui4dir)" && rm -f $$files
+install-dist_unrelDATA: $(dist_unrel_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(unreldir)" || $(MKDIR_P) "$(DESTDIR)$(unreldir)"
+ @list='$(dist_unrel_DATA)'; test -n "$(unreldir)" || list=; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(unreldir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(unreldir)" || exit $$?; \
+ done
+
+uninstall-dist_unrelDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(dist_unrel_DATA)'; test -n "$(unreldir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(unreldir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(unreldir)" && rm -f $$files
+install-dist_www0DATA: $(dist_www0_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(www0dir)" || $(MKDIR_P) "$(DESTDIR)$(www0dir)"
+ @list='$(dist_www0_DATA)'; test -n "$(www0dir)" || list=; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(www0dir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(www0dir)" || exit $$?; \
+ done
+
+uninstall-dist_www0DATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(dist_www0_DATA)'; test -n "$(www0dir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(www0dir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(www0dir)" && rm -f $$files
+install-dist_www3DATA: $(dist_www3_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(www3dir)" || $(MKDIR_P) "$(DESTDIR)$(www3dir)"
+ @list='$(dist_www3_DATA)'; test -n "$(www3dir)" || list=; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(www3dir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(www3dir)" || exit $$?; \
+ done
+
+uninstall-dist_www3DATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(dist_www3_DATA)'; test -n "$(www3dir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(www3dir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(www3dir)" && rm -f $$files
+install-dist_www4DATA: $(dist_www4_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(www4dir)" || $(MKDIR_P) "$(DESTDIR)$(www4dir)"
+ @list='$(dist_www4_DATA)'; test -n "$(www4dir)" || list=; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(www4dir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(www4dir)" || exit $$?; \
+ done
+
+uninstall-dist_www4DATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(dist_www4_DATA)'; test -n "$(www4dir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(www4dir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(www4dir)" && rm -f $$files
+install-docDATA: $(doc_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(docdir)" || $(MKDIR_P) "$(DESTDIR)$(docdir)"
+ @list='$(doc_DATA)'; test -n "$(docdir)" || list=; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(docdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(docdir)" || exit $$?; \
+ done
+
+uninstall-docDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(doc_DATA)'; test -n "$(docdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(docdir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(docdir)" && rm -f $$files
+install-hplip_confDATA: $(hplip_conf_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(hplip_confdir)" || $(MKDIR_P) "$(DESTDIR)$(hplip_confdir)"
+ @list='$(hplip_conf_DATA)'; test -n "$(hplip_confdir)" || list=; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(hplip_confdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(hplip_confdir)" || exit $$?; \
+ done
+
+uninstall-hplip_confDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(hplip_conf_DATA)'; test -n "$(hplip_confdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(hplip_confdir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(hplip_confdir)" && rm -f $$files
+install-hplip_desktopDATA: $(hplip_desktop_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(hplip_desktopdir)" || $(MKDIR_P) "$(DESTDIR)$(hplip_desktopdir)"
+ @list='$(hplip_desktop_DATA)'; test -n "$(hplip_desktopdir)" || list=; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(hplip_desktopdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(hplip_desktopdir)" || exit $$?; \
+ done
+
+uninstall-hplip_desktopDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(hplip_desktop_DATA)'; test -n "$(hplip_desktopdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(hplip_desktopdir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(hplip_desktopdir)" && rm -f $$files
+install-hplip_systrayDATA: $(hplip_systray_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(hplip_systraydir)" || $(MKDIR_P) "$(DESTDIR)$(hplip_systraydir)"
+ @list='$(hplip_systray_DATA)'; test -n "$(hplip_systraydir)" || list=; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(hplip_systraydir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(hplip_systraydir)" || exit $$?; \
+ done
+
+uninstall-hplip_systrayDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(hplip_systray_DATA)'; test -n "$(hplip_systraydir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(hplip_systraydir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(hplip_systraydir)" && rm -f $$files
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in files) print i; }; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ set x; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in files) print i; }; }'`; \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in files) print i; }; }'`; \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+ $(am__remove_distdir)
+ test -d "$(distdir)" || mkdir "$(distdir)"
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+ -test -n "$(am__skip_mode_fix)" \
+ || find "$(distdir)" -type d ! -perm -777 -exec chmod a+rwx {} \; -o \
+ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
+ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
+ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
+ || chmod -R a+r "$(distdir)"
+dist-gzip: distdir
+ tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+ $(am__remove_distdir)
+
+dist-bzip2: distdir
+ tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2
+ $(am__remove_distdir)
+
+dist-lzma: distdir
+ tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma
+ $(am__remove_distdir)
+
+dist-xz: distdir
+ tardir=$(distdir) && $(am__tar) | xz -c >$(distdir).tar.xz
+ $(am__remove_distdir)
+
+dist-tarZ: distdir
+ tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
+ $(am__remove_distdir)
+
+dist-shar: distdir
+ shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
+ $(am__remove_distdir)
+
+dist-zip: distdir
+ -rm -f $(distdir).zip
+ zip -rq $(distdir).zip $(distdir)
+ $(am__remove_distdir)
+
+dist dist-all: distdir
+ tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+ $(am__remove_distdir)
+
+# This target untars the dist file and tries a VPATH configuration. Then
+# it guarantees that the distribution is self-contained by making another
+# tarfile.
+distcheck: dist
+ case '$(DIST_ARCHIVES)' in \
+ *.tar.gz*) \
+ GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\
+ *.tar.bz2*) \
+ bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\
+ *.tar.lzma*) \
+ unlzma -c $(distdir).tar.lzma | $(am__untar) ;;\
+ *.tar.xz*) \
+ xz -dc $(distdir).tar.xz | $(am__untar) ;;\
+ *.tar.Z*) \
+ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
+ *.shar.gz*) \
+ GZIP=$(GZIP_ENV) gunzip -c $(distdir).shar.gz | unshar ;;\
+ *.zip*) \
+ unzip $(distdir).zip ;;\
+ esac
+ chmod -R a-w $(distdir); chmod a+w $(distdir)
+ mkdir $(distdir)/_build
+ mkdir $(distdir)/_inst
+ chmod a-w $(distdir)
+ test -d $(distdir)/_build || exit 0; \
+ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
+ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
+ && am__cwd=`pwd` \
+ && $(am__cd) $(distdir)/_build \
+ && ../configure --srcdir=.. --prefix="$$dc_install_base" \
+ $(DISTCHECK_CONFIGURE_FLAGS) \
+ && $(MAKE) $(AM_MAKEFLAGS) \
+ && $(MAKE) $(AM_MAKEFLAGS) dvi \
+ && $(MAKE) $(AM_MAKEFLAGS) check \
+ && $(MAKE) $(AM_MAKEFLAGS) install \
+ && $(MAKE) $(AM_MAKEFLAGS) installcheck \
+ && $(MAKE) $(AM_MAKEFLAGS) uninstall \
+ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
+ distuninstallcheck \
+ && chmod -R a-w "$$dc_install_base" \
+ && ({ \
+ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \
+ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
+ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
+ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
+ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
+ } || { rm -rf "$$dc_destdir"; exit 1; }) \
+ && rm -rf "$$dc_destdir" \
+ && $(MAKE) $(AM_MAKEFLAGS) dist \
+ && rm -rf $(DIST_ARCHIVES) \
+ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \
+ && cd "$$am__cwd" \
+ || exit 1
+ $(am__remove_distdir)
+ @(echo "$(distdir) archives ready for distribution: "; \
+ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
+ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
+distuninstallcheck:
+ @$(am__cd) '$(distuninstallcheck_dir)' \
+ && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \
+ || { echo "ERROR: files left after uninstall:" ; \
+ if test -n "$(DESTDIR)"; then \
+ echo " (check DESTDIR support)"; \
+ fi ; \
+ $(distuninstallcheck_listfiles) ; \
+ exit 1; } >&2
+distcleancheck: distclean
+ @if test '$(srcdir)' = . ; then \
+ echo "ERROR: distcleancheck can only run from a VPATH build" ; \
+ exit 1 ; \
+ fi
+ @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
+ || { echo "ERROR: files left in build directory after distclean:" ; \
+ $(distcleancheck_listfiles) ; \
+ exit 1; } >&2
+check-am: all-am
+check: check-am
+all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(SCRIPTS) $(DATA)
+install-binPROGRAMS: install-libLTLIBRARIES
+
+installdirs:
+ for dir in "$(DESTDIR)$(hpmudextdir)" "$(DESTDIR)$(libdir)" "$(DESTDIR)$(libsane_hpaiodir)" "$(DESTDIR)$(pcardextdir)" "$(DESTDIR)$(scanextdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(hpdir)" "$(DESTDIR)$(hp_mkuridir)" "$(DESTDIR)$(hpcupsdir)" "$(DESTDIR)$(hpcupsfaxdir)" "$(DESTDIR)$(hplipjsdir)" "$(DESTDIR)$(hppsdir)" "$(DESTDIR)$(cacdir)" "$(DESTDIR)$(cmddir)" "$(DESTDIR)$(hpfaxdir)" "$(DESTDIR)$(hplipdir)" "$(DESTDIR)$(plugins4dir)" "$(DESTDIR)$(ripdir)" "$(DESTDIR)$(pstotiffdir)" "$(DESTDIR)$(cupsdrvdir)" "$(DESTDIR)$(cupsdrv2dir)" "$(DESTDIR)$(basedir)" "$(DESTDIR)$(copierdir)" "$(DESTDIR)$(faxdir)" "$(DESTDIR)$(fax_filtersdir)" "$(DESTDIR)$(halpredir)" "$(DESTDIR)$(hpcupsfaxppddir)" "$(DESTDIR)$(hpijsfaxppddir)" "$(DESTDIR)$(hplip_Logdir)" "$(DESTDIR)$(hplip_statedir)" "$(DESTDIR)$(images_128x128dir)" "$(DESTDIR)$(images_16x16dir)" "$(DESTDIR)$(images_24x24dir)" "$(DESTDIR)$(images_256x256dir)" "$(DESTDIR)$(images_32x32dir)" "$(DESTDIR)$(images_64x64dir)" "$(DESTDIR)$(images_devicesdir)" "$(DESTDIR)$(images_otherdir)" "$(DESTDIR)$(installdir)" "$(DESTDIR)$(ldldir)" "$(DESTDIR)$(localzdir)" "$(DESTDIR)$(modelsdir)" "$(DESTDIR)$(pcarddir)" "$(DESTDIR)$(pcldir)" "$(DESTDIR)$(pluginsdir)" "$(DESTDIR)$(policykit_dbus_etcdir)" "$(DESTDIR)$(policykit_dbus_sharedir)" "$(DESTDIR)$(policykit_policydir)" "$(DESTDIR)$(postscriptdir)" "$(DESTDIR)$(ppddir)" "$(DESTDIR)$(prntdir)" "$(DESTDIR)$(rulesdir)" "$(DESTDIR)$(scandir)" "$(DESTDIR)$(uidir)" "$(DESTDIR)$(ui4dir)" "$(DESTDIR)$(unreldir)" "$(DESTDIR)$(www0dir)" "$(DESTDIR)$(www3dir)" "$(DESTDIR)$(www4dir)" "$(DESTDIR)$(docdir)" "$(DESTDIR)$(hplip_confdir)" "$(DESTDIR)$(hplip_desktopdir)" "$(DESTDIR)$(hplip_systraydir)"; do \
+ test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-binPROGRAMS clean-generic \
+ clean-hpPROGRAMS clean-hp_mkuriPROGRAMS clean-hpcupsPROGRAMS \
+ clean-hpcupsfaxPROGRAMS clean-hplipjsPROGRAMS \
+ clean-hpmudextLTLIBRARIES clean-hppsPROGRAMS \
+ clean-libLTLIBRARIES clean-libsane_hpaioLTLIBRARIES \
+ clean-libtool clean-noinstLTLIBRARIES clean-noinstPROGRAMS \
+ clean-pcardextLTLIBRARIES clean-scanextLTLIBRARIES \
+ mostlyclean-am
+
+distclean: distclean-am
+ -rm -f $(am__CONFIG_DISTCLEAN_FILES)
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-cupsdrv2DATA install-cupsdrvDATA \
+ install-dist_baseDATA \
+ install-dist_cacSCRIPTS install-dist_cmdSCRIPTS \
+ install-dist_copierDATA install-dist_faxDATA \
+ install-dist_fax_filtersDATA install-dist_halpreDATA \
+ install-dist_hpcupsfaxppdDATA install-dist_hpfaxSCRIPTS \
+ install-dist_hpijsfaxppdDATA install-dist_hplipSCRIPTS \
+ install-dist_hplip_LogDATA install-dist_hplip_stateDATA \
+ install-dist_images_128x128DATA install-dist_images_16x16DATA \
+ install-dist_images_24x24DATA install-dist_images_256x256DATA \
+ install-dist_images_32x32DATA install-dist_images_64x64DATA \
+ install-dist_images_devicesDATA install-dist_images_otherDATA \
+ install-dist_installDATA install-dist_ldlDATA \
+ install-dist_localzDATA install-dist_modelsDATA \
+ install-dist_pcardDATA install-dist_pclDATA \
+ install-dist_plugins4SCRIPTS install-dist_pluginsDATA \
+ install-dist_policykit_dbus_etcDATA \
+ install-dist_policykit_dbus_shareDATA \
+ install-dist_policykit_policyDATA install-dist_postscriptDATA \
+ install-dist_ppdDATA install-dist_prntDATA \
+ install-dist_ripSCRIPTS install-dist_rulesDATA \
+ install-dist_scanDATA install-dist_ui4DATA install-dist_uiDATA \
+ install-dist_unrelDATA install-dist_www0DATA \
+ install-dist_www3DATA install-dist_www4DATA install-docDATA \
+ install-hpPROGRAMS install-hp_mkuriPROGRAMS \
+ install-hpcupsPROGRAMS install-hpcupsfaxPROGRAMS \
+ install-hplip_confDATA install-hplip_desktopDATA \
+ install-hplip_systrayDATA install-hplipjsPROGRAMS \
+ install-hpmudextLTLIBRARIES install-hppsPROGRAMS \
+ install-libsane_hpaioLTLIBRARIES install-pcardextLTLIBRARIES \
+ install-pstotiffSCRIPTS install-scanextLTLIBRARIES
+ @$(NORMAL_INSTALL)
+ $(MAKE) $(AM_MAKEFLAGS) install-data-hook
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-binPROGRAMS install-libLTLIBRARIES
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f $(am__CONFIG_DISTCLEAN_FILES)
+ -rm -rf $(top_srcdir)/autom4te.cache
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-cupsdrv2DATA \
+ uninstall-cupsdrvDATA \
+ uninstall-dist_baseDATA uninstall-dist_cacSCRIPTS \
+ uninstall-dist_cmdSCRIPTS uninstall-dist_copierDATA \
+ uninstall-dist_faxDATA uninstall-dist_fax_filtersDATA \
+ uninstall-dist_halpreDATA uninstall-dist_hpcupsfaxppdDATA \
+ uninstall-dist_hpfaxSCRIPTS uninstall-dist_hpijsfaxppdDATA \
+ uninstall-dist_hplipSCRIPTS uninstall-dist_hplip_LogDATA \
+ uninstall-dist_hplip_stateDATA \
+ uninstall-dist_images_128x128DATA \
+ uninstall-dist_images_16x16DATA \
+ uninstall-dist_images_24x24DATA \
+ uninstall-dist_images_256x256DATA \
+ uninstall-dist_images_32x32DATA \
+ uninstall-dist_images_64x64DATA \
+ uninstall-dist_images_devicesDATA \
+ uninstall-dist_images_otherDATA uninstall-dist_installDATA \
+ uninstall-dist_ldlDATA uninstall-dist_localzDATA \
+ uninstall-dist_modelsDATA uninstall-dist_pcardDATA \
+ uninstall-dist_pclDATA uninstall-dist_plugins4SCRIPTS \
+ uninstall-dist_pluginsDATA \
+ uninstall-dist_policykit_dbus_etcDATA \
+ uninstall-dist_policykit_dbus_shareDATA \
+ uninstall-dist_policykit_policyDATA \
+ uninstall-dist_postscriptDATA uninstall-dist_ppdDATA \
+ uninstall-dist_prntDATA uninstall-dist_ripSCRIPTS \
+ uninstall-dist_rulesDATA uninstall-dist_scanDATA \
+ uninstall-dist_ui4DATA uninstall-dist_uiDATA \
+ uninstall-dist_unrelDATA uninstall-dist_www0DATA \
+ uninstall-dist_www3DATA uninstall-dist_www4DATA \
+ uninstall-docDATA uninstall-hpPROGRAMS \
+ uninstall-hp_mkuriPROGRAMS uninstall-hpcupsPROGRAMS \
+ uninstall-hpcupsfaxPROGRAMS uninstall-hplip_confDATA \
+ uninstall-hplip_desktopDATA uninstall-hplip_systrayDATA \
+ uninstall-hplipjsPROGRAMS uninstall-hpmudextLTLIBRARIES \
+ uninstall-hppsPROGRAMS uninstall-libLTLIBRARIES \
+ uninstall-libsane_hpaioLTLIBRARIES \
+ uninstall-pcardextLTLIBRARIES uninstall-pstotiffSCRIPTS \
+ uninstall-scanextLTLIBRARIES
+ @$(NORMAL_INSTALL)
+ $(MAKE) $(AM_MAKEFLAGS) uninstall-hook
+.MAKE: install-am install-data-am install-strip uninstall-am
+
+.PHONY: CTAGS GTAGS all all-am am--refresh check check-am clean \
+ clean-binPROGRAMS clean-generic \
+ clean-hpPROGRAMS clean-hp_mkuriPROGRAMS clean-hpcupsPROGRAMS \
+ clean-hpcupsfaxPROGRAMS clean-hplipjsPROGRAMS \
+ clean-hpmudextLTLIBRARIES clean-hppsPROGRAMS \
+ clean-libLTLIBRARIES clean-libsane_hpaioLTLIBRARIES \
+ clean-libtool clean-noinstLTLIBRARIES clean-noinstPROGRAMS \
+ clean-pcardextLTLIBRARIES clean-scanextLTLIBRARIES ctags dist \
+ dist-all dist-bzip2 dist-gzip dist-lzma dist-shar dist-tarZ \
+ dist-xz dist-zip distcheck distclean distclean-compile \
+ distclean-generic distclean-libtool distclean-tags \
+ distcleancheck distdir distuninstallcheck dvi dvi-am html \
+ html-am info info-am install install-am install-binPROGRAMS \
+ install-cupsdrv2DATA install-cupsdrvDATA \
+ install-data install-data-am \
+ install-data-hook install-dist_baseDATA \
+ install-dist_cacSCRIPTS install-dist_cmdSCRIPTS \
+ install-dist_copierDATA install-dist_faxDATA \
+ install-dist_fax_filtersDATA install-dist_halpreDATA \
+ install-dist_hpcupsfaxppdDATA install-dist_hpfaxSCRIPTS \
+ install-dist_hpijsfaxppdDATA install-dist_hplipSCRIPTS \
+ install-dist_hplip_LogDATA install-dist_hplip_stateDATA \
+ install-dist_images_128x128DATA install-dist_images_16x16DATA \
+ install-dist_images_24x24DATA install-dist_images_256x256DATA \
+ install-dist_images_32x32DATA install-dist_images_64x64DATA \
+ install-dist_images_devicesDATA install-dist_images_otherDATA \
+ install-dist_installDATA install-dist_ldlDATA \
+ install-dist_localzDATA install-dist_modelsDATA \
+ install-dist_pcardDATA install-dist_pclDATA \
+ install-dist_plugins4SCRIPTS install-dist_pluginsDATA \
+ install-dist_policykit_dbus_etcDATA \
+ install-dist_policykit_dbus_shareDATA \
+ install-dist_policykit_policyDATA install-dist_postscriptDATA \
+ install-dist_ppdDATA install-dist_prntDATA \
+ install-dist_ripSCRIPTS install-dist_rulesDATA \
+ install-dist_scanDATA install-dist_ui4DATA install-dist_uiDATA \
+ install-dist_unrelDATA install-dist_www0DATA \
+ install-dist_www3DATA install-dist_www4DATA install-docDATA \
+ install-dvi install-dvi-am install-exec install-exec-am \
+ install-hpPROGRAMS install-hp_mkuriPROGRAMS \
+ install-hpcupsPROGRAMS install-hpcupsfaxPROGRAMS \
+ install-hplip_confDATA install-hplip_desktopDATA \
+ install-hplip_systrayDATA install-hplipjsPROGRAMS \
+ install-hpmudextLTLIBRARIES install-hppsPROGRAMS install-html \
+ install-html-am install-info install-info-am \
+ install-libLTLIBRARIES install-libsane_hpaioLTLIBRARIES \
+ install-man install-pcardextLTLIBRARIES install-pdf \
+ install-pdf-am install-ps install-ps-am \
+ install-pstotiffSCRIPTS install-scanextLTLIBRARIES \
+ install-strip installcheck installcheck-am installdirs \
+ maintainer-clean maintainer-clean-generic mostlyclean \
+ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+ pdf pdf-am ps ps-am tags uninstall uninstall-am \
+ uninstall-binPROGRAMS uninstall-cupsdrv2DATA \
+ uninstall-cupsdrvDATA \
+ uninstall-dist_baseDATA uninstall-dist_cacSCRIPTS \
+ uninstall-dist_cmdSCRIPTS uninstall-dist_copierDATA \
+ uninstall-dist_faxDATA uninstall-dist_fax_filtersDATA \
+ uninstall-dist_halpreDATA uninstall-dist_hpcupsfaxppdDATA \
+ uninstall-dist_hpfaxSCRIPTS uninstall-dist_hpijsfaxppdDATA \
+ uninstall-dist_hplipSCRIPTS uninstall-dist_hplip_LogDATA \
+ uninstall-dist_hplip_stateDATA \
+ uninstall-dist_images_128x128DATA \
+ uninstall-dist_images_16x16DATA \
+ uninstall-dist_images_24x24DATA \
+ uninstall-dist_images_256x256DATA \
+ uninstall-dist_images_32x32DATA \
+ uninstall-dist_images_64x64DATA \
+ uninstall-dist_images_devicesDATA \
+ uninstall-dist_images_otherDATA uninstall-dist_installDATA \
+ uninstall-dist_ldlDATA uninstall-dist_localzDATA \
+ uninstall-dist_modelsDATA uninstall-dist_pcardDATA \
+ uninstall-dist_pclDATA uninstall-dist_plugins4SCRIPTS \
+ uninstall-dist_pluginsDATA \
+ uninstall-dist_policykit_dbus_etcDATA \
+ uninstall-dist_policykit_dbus_shareDATA \
+ uninstall-dist_policykit_policyDATA \
+ uninstall-dist_postscriptDATA uninstall-dist_ppdDATA \
+ uninstall-dist_prntDATA uninstall-dist_ripSCRIPTS \
+ uninstall-dist_rulesDATA uninstall-dist_scanDATA \
+ uninstall-dist_ui4DATA uninstall-dist_uiDATA \
+ uninstall-dist_unrelDATA uninstall-dist_www0DATA \
+ uninstall-dist_www3DATA uninstall-dist_www4DATA \
+ uninstall-docDATA uninstall-hook uninstall-hpPROGRAMS \
+ uninstall-hp_mkuriPROGRAMS uninstall-hpcupsPROGRAMS \
+ uninstall-hpcupsfaxPROGRAMS uninstall-hplip_confDATA \
+ uninstall-hplip_desktopDATA uninstall-hplip_systrayDATA \
+ uninstall-hplipjsPROGRAMS uninstall-hpmudextLTLIBRARIES \
+ uninstall-hppsPROGRAMS uninstall-libLTLIBRARIES \
+ uninstall-libsane_hpaioLTLIBRARIES \
+ uninstall-pcardextLTLIBRARIES uninstall-pstotiffSCRIPTS \
+ uninstall-scanextLTLIBRARIES
+
+
+install-dist_hplip_LogDATA:
+@FULL_BUILD_TRUE@ test -z "$(DESTDIR)$(hplip_Logdir)" || mkdir -p $(DESTDIR)$(hplip_Logdir)
+@FULL_BUILD_TRUE@ chgrp "lp" -R $(DESTDIR)$(hplip_Logdir)
+@FULL_BUILD_TRUE@ chmod 774 $(DESTDIR)$(hplip_Logdir)
+@HPLIP_BUILD_TRUE@ test -z "$(DESTDIR)$(hplip_Logdir)" || mkdir -p $(DESTDIR)$(hplip_Logdir)
+@HPLIP_BUILD_TRUE@ chgrp "lp" -R $(DESTDIR)$(hplip_Logdir)
+@HPLIP_BUILD_TRUE@ chmod 774 $(DESTDIR)$(hplip_Logdir)
+
+install-data-hook:
+# If scanner build, add hpaio entry to sane dll.conf.
+@HPLIP_BUILD_TRUE@ if [ "$(scan_build)" = "yes" ]; then \
+@HPLIP_BUILD_TRUE@ $(mkinstalldirs) $(DESTDIR)/etc/sane.d; \
+@HPLIP_BUILD_TRUE@ if [ ! -f $(DESTDIR)/etc/sane.d/dll.conf ]; then \
+@HPLIP_BUILD_TRUE@ touch $(DESTDIR)/etc/sane.d/dll.conf; \
+@HPLIP_BUILD_TRUE@ fi; \
+@HPLIP_BUILD_TRUE@ if ! grep ^hpaio $(DESTDIR)/etc/sane.d/dll.conf >/dev/null 2>/dev/null ; then \
+@HPLIP_BUILD_TRUE@ echo "Adding hpaio entry to /etc/sane.d/dll.conf." ; \
+@HPLIP_BUILD_TRUE@ echo hpaio >>$(DESTDIR)/etc/sane.d/dll.conf ; \
+@HPLIP_BUILD_TRUE@ fi \
+@HPLIP_BUILD_TRUE@ fi
+# Create hp-xxx commands in bindir.
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@ $(mkinstalldirs) $(DESTDIR)$(bindir)
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@ for i in $(dist_cmd_SCRIPTS); do \
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@ cmd=`basename $$i .py`; \
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@ if [ ! \( "$$cmd" = "toolbox" -a "$(gui_build)" = "no" \) ]; then \
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@ ln -sf ../share/$(PACKAGE)/$$i $(DESTDIR)$(bindir)/hp-$$cmd; \
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@ fi \
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@ done
+#
+# Install fax support.
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@ if [ "$(fax_build)" = "yes" ]; then \
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@ mv $(DESTDIR)$(hpfaxdir)/hpfax.py $(DESTDIR)$(hpfaxdir)/hpfax; \
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@ chmod 700 $(DESTDIR)$(hpfaxdir)/hpfax; \
+@FULL_BUILD_TRUE@@HPLIP_BUILD_TRUE@ fi
+#
+# Make backend run as root.
+# chmod 700 $(DESTDIR)$(hpdir)/hp
+
+uninstall-hook:
+# Remove hp-xxx commands.
+@HPLIP_BUILD_TRUE@ for i in $(dist_cmd_SCRIPTS); do \
+@HPLIP_BUILD_TRUE@ cmd=`basename $$i .py`; \
+@HPLIP_BUILD_TRUE@ rm -f $(DESTDIR)$(bindir)/hp-$$cmd; \
+@HPLIP_BUILD_TRUE@ done
+#
+# Remove fax support.
+@HPLIP_BUILD_TRUE@ rm -f $(DESTDIR)$(hpfaxdir)/hpfax
+
+rpm:
+@FULL_BUILD_TRUE@ epm -f rpm hplipfull hplip.list
+@LITE_BUILD_TRUE@ epm -f rpm hpliplite hplip.list
+@HPCUPS_ONLY_BUILD_TRUE@ epm -f rpm hpliphpcupsonly hplip.list
+@HPIJS_ONLY_BUILD_TRUE@ epm -f rpm hpliphpijsonly hplip.list
+
+deb:
+@FULL_BUILD_TRUE@ epm -f deb hplipfull hplip.list
+@LITE_BUILD_TRUE@ epm -f deb hpliplite hplip.list
+@HPCUPS_ONLY_BUILD_TRUE@ epm -f deb hpliphpcupsonly hplip.list
+@HPIJS_ONLY_BUILD_TRUE@ epm -f deb hpliphpijsonly hplip.list
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/__init__.py b/__init__.py
new file mode 100644
index 0000000..ffdcaff
--- /dev/null
+++ b/__init__.py
@@ -0,0 +1,19 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2007 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+
diff --git a/aclocal.m4 b/aclocal.m4
new file mode 100644
index 0000000..46f3292
--- /dev/null
+++ b/aclocal.m4
@@ -0,0 +1,7952 @@
+# generated automatically by aclocal 1.11 -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+# 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+m4_ifndef([AC_AUTOCONF_VERSION],
+ [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.63],,
+[m4_warning([this file was generated for autoconf 2.63.
+You have another version of autoconf. It may work, but is not guaranteed to.
+If you have problems, you may need to regenerate the build system entirely.
+To do so, use the procedure documented by the package, typically `autoreconf'.])])
+
+# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*-
+
+# serial 52 AC_PROG_LIBTOOL
+
+
+# AC_PROVIDE_IFELSE(MACRO-NAME, IF-PROVIDED, IF-NOT-PROVIDED)
+# -----------------------------------------------------------
+# If this macro is not defined by Autoconf, define it here.
+m4_ifdef([AC_PROVIDE_IFELSE],
+ [],
+ [m4_define([AC_PROVIDE_IFELSE],
+ [m4_ifdef([AC_PROVIDE_$1],
+ [$2], [$3])])])
+
+
+# AC_PROG_LIBTOOL
+# ---------------
+AC_DEFUN([AC_PROG_LIBTOOL],
+[AC_REQUIRE([_AC_PROG_LIBTOOL])dnl
+dnl If AC_PROG_CXX has already been expanded, run AC_LIBTOOL_CXX
+dnl immediately, otherwise, hook it in at the end of AC_PROG_CXX.
+ AC_PROVIDE_IFELSE([AC_PROG_CXX],
+ [AC_LIBTOOL_CXX],
+ [define([AC_PROG_CXX], defn([AC_PROG_CXX])[AC_LIBTOOL_CXX
+ ])])
+dnl And a similar setup for Fortran 77 support
+ AC_PROVIDE_IFELSE([AC_PROG_F77],
+ [AC_LIBTOOL_F77],
+ [define([AC_PROG_F77], defn([AC_PROG_F77])[AC_LIBTOOL_F77
+])])
+
+dnl Quote A][M_PROG_GCJ so that aclocal doesn't bring it in needlessly.
+dnl If either AC_PROG_GCJ or A][M_PROG_GCJ have already been expanded, run
+dnl AC_LIBTOOL_GCJ immediately, otherwise, hook it in at the end of both.
+ AC_PROVIDE_IFELSE([AC_PROG_GCJ],
+ [AC_LIBTOOL_GCJ],
+ [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],
+ [AC_LIBTOOL_GCJ],
+ [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ],
+ [AC_LIBTOOL_GCJ],
+ [ifdef([AC_PROG_GCJ],
+ [define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[AC_LIBTOOL_GCJ])])
+ ifdef([A][M_PROG_GCJ],
+ [define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[AC_LIBTOOL_GCJ])])
+ ifdef([LT_AC_PROG_GCJ],
+ [define([LT_AC_PROG_GCJ],
+ defn([LT_AC_PROG_GCJ])[AC_LIBTOOL_GCJ])])])])
+])])# AC_PROG_LIBTOOL
+
+
+# _AC_PROG_LIBTOOL
+# ----------------
+AC_DEFUN([_AC_PROG_LIBTOOL],
+[AC_REQUIRE([AC_LIBTOOL_SETUP])dnl
+AC_BEFORE([$0],[AC_LIBTOOL_CXX])dnl
+AC_BEFORE([$0],[AC_LIBTOOL_F77])dnl
+AC_BEFORE([$0],[AC_LIBTOOL_GCJ])dnl
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh"
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+AC_SUBST(LIBTOOL)dnl
+
+# Prevent multiple expansion
+define([AC_PROG_LIBTOOL], [])
+])# _AC_PROG_LIBTOOL
+
+
+# AC_LIBTOOL_SETUP
+# ----------------
+AC_DEFUN([AC_LIBTOOL_SETUP],
+[AC_PREREQ(2.50)dnl
+AC_REQUIRE([AC_ENABLE_SHARED])dnl
+AC_REQUIRE([AC_ENABLE_STATIC])dnl
+AC_REQUIRE([AC_ENABLE_FAST_INSTALL])dnl
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_PROG_LD])dnl
+AC_REQUIRE([AC_PROG_LD_RELOAD_FLAG])dnl
+AC_REQUIRE([AC_PROG_NM])dnl
+
+AC_REQUIRE([AC_PROG_LN_S])dnl
+AC_REQUIRE([AC_DEPLIBS_CHECK_METHOD])dnl
+# Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers!
+AC_REQUIRE([AC_OBJEXT])dnl
+AC_REQUIRE([AC_EXEEXT])dnl
+dnl
+AC_LIBTOOL_SYS_MAX_CMD_LEN
+AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE
+AC_LIBTOOL_OBJDIR
+
+AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl
+_LT_AC_PROG_ECHO_BACKSLASH
+
+case $host_os in
+aix3*)
+ # AIX sometimes has problems with the GCC collect2 program. For some
+ # reason, if we set the COLLECT_NAMES environment variable, the problems
+ # vanish in a puff of smoke.
+ if test "X${COLLECT_NAMES+set}" != Xset; then
+ COLLECT_NAMES=
+ export COLLECT_NAMES
+ fi
+ ;;
+esac
+
+# Sed substitution that helps us do robust quoting. It backslashifies
+# metacharacters that are still active within double-quoted strings.
+Xsed='sed -e 1s/^X//'
+[sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g']
+
+# Same as above, but do not quote variable references.
+[double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g']
+
+# Sed substitution to delay expansion of an escaped shell variable in a
+# double_quote_subst'ed string.
+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
+
+# Sed substitution to avoid accidental globbing in evaled expressions
+no_glob_subst='s/\*/\\\*/g'
+
+# Constants:
+rm="rm -f"
+
+# Global variables:
+default_ofile=libtool
+can_build_shared=yes
+
+# All known linkers require a `.a' archive for static linking (except MSVC,
+# which needs '.lib').
+libext=a
+ltmain="$ac_aux_dir/ltmain.sh"
+ofile="$default_ofile"
+with_gnu_ld="$lt_cv_prog_gnu_ld"
+
+AC_CHECK_TOOL(AR, ar, false)
+AC_CHECK_TOOL(RANLIB, ranlib, :)
+AC_CHECK_TOOL(STRIP, strip, :)
+
+old_CC="$CC"
+old_CFLAGS="$CFLAGS"
+
+# Set sane defaults for various variables
+test -z "$AR" && AR=ar
+test -z "$AR_FLAGS" && AR_FLAGS=cru
+test -z "$AS" && AS=as
+test -z "$CC" && CC=cc
+test -z "$LTCC" && LTCC=$CC
+test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+test -z "$LD" && LD=ld
+test -z "$LN_S" && LN_S="ln -s"
+test -z "$MAGIC_CMD" && MAGIC_CMD=file
+test -z "$NM" && NM=nm
+test -z "$SED" && SED=sed
+test -z "$OBJDUMP" && OBJDUMP=objdump
+test -z "$RANLIB" && RANLIB=:
+test -z "$STRIP" && STRIP=:
+test -z "$ac_objext" && ac_objext=o
+
+# Determine commands to create old-style static archives.
+old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
+old_postinstall_cmds='chmod 644 $oldlib'
+old_postuninstall_cmds=
+
+if test -n "$RANLIB"; then
+ case $host_os in
+ openbsd*)
+ old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib"
+ ;;
+ *)
+ old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib"
+ ;;
+ esac
+ old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib"
+fi
+
+_LT_CC_BASENAME([$compiler])
+
+# Only perform the check for file, if the check method requires it
+case $deplibs_check_method in
+file_magic*)
+ if test "$file_magic_cmd" = '$MAGIC_CMD'; then
+ AC_PATH_MAGIC
+ fi
+ ;;
+esac
+
+_LT_REQUIRED_DARWIN_CHECKS
+
+AC_PROVIDE_IFELSE([AC_LIBTOOL_DLOPEN], enable_dlopen=yes, enable_dlopen=no)
+AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL],
+enable_win32_dll=yes, enable_win32_dll=no)
+
+AC_ARG_ENABLE([libtool-lock],
+ [AC_HELP_STRING([--disable-libtool-lock],
+ [avoid locking (might break parallel builds)])])
+test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
+
+AC_ARG_WITH([pic],
+ [AC_HELP_STRING([--with-pic],
+ [try to use only PIC/non-PIC objects @<:@default=use both@:>@])],
+ [pic_mode="$withval"],
+ [pic_mode=default])
+test -z "$pic_mode" && pic_mode=default
+
+# Use C for the default configuration in the libtool script
+tagname=
+AC_LIBTOOL_LANG_C_CONFIG
+_LT_AC_TAGCONFIG
+])# AC_LIBTOOL_SETUP
+
+
+# _LT_AC_SYS_COMPILER
+# -------------------
+AC_DEFUN([_LT_AC_SYS_COMPILER],
+[AC_REQUIRE([AC_PROG_CC])dnl
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+])# _LT_AC_SYS_COMPILER
+
+
+# _LT_CC_BASENAME(CC)
+# -------------------
+# Calculate cc_basename. Skip known compiler wrappers and cross-prefix.
+AC_DEFUN([_LT_CC_BASENAME],
+[for cc_temp in $1""; do
+ case $cc_temp in
+ compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;;
+ distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;;
+ \-*) ;;
+ *) break;;
+ esac
+done
+cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+])
+
+
+# _LT_COMPILER_BOILERPLATE
+# ------------------------
+# Check for compiler boilerplate output or warnings with
+# the simple compiler test code.
+AC_DEFUN([_LT_COMPILER_BOILERPLATE],
+[AC_REQUIRE([LT_AC_PROG_SED])dnl
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$rm conftest*
+])# _LT_COMPILER_BOILERPLATE
+
+
+# _LT_LINKER_BOILERPLATE
+# ----------------------
+# Check for linker boilerplate output or warnings with
+# the simple link test code.
+AC_DEFUN([_LT_LINKER_BOILERPLATE],
+[AC_REQUIRE([LT_AC_PROG_SED])dnl
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$rm -r conftest*
+])# _LT_LINKER_BOILERPLATE
+
+# _LT_REQUIRED_DARWIN_CHECKS
+# --------------------------
+# Check for some things on darwin
+AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS],[
+ case $host_os in
+ rhapsody* | darwin*)
+ AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:])
+ AC_CHECK_TOOL([NMEDIT], [nmedit], [:])
+
+ AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod],
+ [lt_cv_apple_cc_single_mod=no
+ if test -z "${LT_MULTI_MODULE}"; then
+ # By default we will add the -single_module flag. You can override
+ # by either setting the environment variable LT_MULTI_MODULE
+ # non-empty at configure time, or by adding -multi_module to the
+ # link flags.
+ echo "int foo(void){return 1;}" > conftest.c
+ $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+ -dynamiclib ${wl}-single_module conftest.c
+ if test -f libconftest.dylib; then
+ lt_cv_apple_cc_single_mod=yes
+ rm -rf libconftest.dylib*
+ fi
+ rm conftest.c
+ fi])
+ AC_CACHE_CHECK([for -exported_symbols_list linker flag],
+ [lt_cv_ld_exported_symbols_list],
+ [lt_cv_ld_exported_symbols_list=no
+ save_LDFLAGS=$LDFLAGS
+ echo "_main" > conftest.sym
+ LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
+ [lt_cv_ld_exported_symbols_list=yes],
+ [lt_cv_ld_exported_symbols_list=no])
+ LDFLAGS="$save_LDFLAGS"
+ ])
+ case $host_os in
+ rhapsody* | darwin1.[[0123]])
+ _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
+ darwin1.*)
+ _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+ darwin*)
+ # if running on 10.5 or later, the deployment target defaults
+ # to the OS version, if on x86, and 10.4, the deployment
+ # target defaults to 10.4. Don't you love it?
+ case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
+ 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*)
+ _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+ 10.[[012]]*)
+ _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+ 10.*)
+ _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+ esac
+ ;;
+ esac
+ if test "$lt_cv_apple_cc_single_mod" = "yes"; then
+ _lt_dar_single_mod='$single_module'
+ fi
+ if test "$lt_cv_ld_exported_symbols_list" = "yes"; then
+ _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'
+ else
+ _lt_dar_export_syms="~$NMEDIT -s \$output_objdir/\${libname}-symbols.expsym \${lib}"
+ fi
+ if test "$DSYMUTIL" != ":"; then
+ _lt_dsymutil="~$DSYMUTIL \$lib || :"
+ else
+ _lt_dsymutil=
+ fi
+ ;;
+ esac
+])
+
+# _LT_AC_SYS_LIBPATH_AIX
+# ----------------------
+# Links a minimal program and checks the executable
+# for the system default hardcoded library path. In most cases,
+# this is /usr/lib:/lib, but when the MPI compilers are used
+# the location of the communication and MPI libs are included too.
+# If we don't find anything, use the default library path according
+# to the aix ld manual.
+AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX],
+[AC_REQUIRE([LT_AC_PROG_SED])dnl
+AC_LINK_IFELSE(AC_LANG_PROGRAM,[
+lt_aix_libpath_sed='
+ /Import File Strings/,/^$/ {
+ /^0/ {
+ s/^0 *\(.*\)$/\1/
+ p
+ }
+ }'
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then
+ aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+fi],[])
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+])# _LT_AC_SYS_LIBPATH_AIX
+
+
+# _LT_AC_SHELL_INIT(ARG)
+# ----------------------
+AC_DEFUN([_LT_AC_SHELL_INIT],
+[ifdef([AC_DIVERSION_NOTICE],
+ [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)],
+ [AC_DIVERT_PUSH(NOTICE)])
+$1
+AC_DIVERT_POP
+])# _LT_AC_SHELL_INIT
+
+
+# _LT_AC_PROG_ECHO_BACKSLASH
+# --------------------------
+# Add some code to the start of the generated configure script which
+# will find an echo command which doesn't interpret backslashes.
+AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH],
+[_LT_AC_SHELL_INIT([
+# Check that we are running under the correct shell.
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+case X$ECHO in
+X*--fallback-echo)
+ # Remove one level of quotation (which was required for Make).
+ ECHO=`echo "$ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','`
+ ;;
+esac
+
+echo=${ECHO-echo}
+if test "X[$]1" = X--no-reexec; then
+ # Discard the --no-reexec flag, and continue.
+ shift
+elif test "X[$]1" = X--fallback-echo; then
+ # Avoid inline document here, it may be left over
+ :
+elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then
+ # Yippee, $echo works!
+ :
+else
+ # Restart under the correct shell.
+ exec $SHELL "[$]0" --no-reexec ${1+"[$]@"}
+fi
+
+if test "X[$]1" = X--fallback-echo; then
+ # used as fallback echo
+ shift
+ cat <<EOF
+[$]*
+EOF
+ exit 0
+fi
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+if test -z "$ECHO"; then
+if test "X${echo_test_string+set}" != Xset; then
+# find a string as large as possible, as long as the shell can cope with it
+ for cmd in 'sed 50q "[$]0"' 'sed 20q "[$]0"' 'sed 10q "[$]0"' 'sed 2q "[$]0"' 'echo test'; do
+ # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ...
+ if (echo_test_string=`eval $cmd`) 2>/dev/null &&
+ echo_test_string=`eval $cmd` &&
+ (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null
+ then
+ break
+ fi
+ done
+fi
+
+if test "X`($echo '\t') 2>/dev/null`" = 'X\t' &&
+ echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ :
+else
+ # The Solaris, AIX, and Digital Unix default echo programs unquote
+ # backslashes. This makes it impossible to quote backslashes using
+ # echo "$something" | sed 's/\\/\\\\/g'
+ #
+ # So, first we look for a working echo in the user's PATH.
+
+ lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+ for dir in $PATH /usr/ucb; do
+ IFS="$lt_save_ifs"
+ if (test -f $dir/echo || test -f $dir/echo$ac_exeext) &&
+ test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' &&
+ echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ echo="$dir/echo"
+ break
+ fi
+ done
+ IFS="$lt_save_ifs"
+
+ if test "X$echo" = Xecho; then
+ # We didn't find a better echo, so look for alternatives.
+ if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' &&
+ echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ # This shell has a builtin print -r that does the trick.
+ echo='print -r'
+ elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) &&
+ test "X$CONFIG_SHELL" != X/bin/ksh; then
+ # If we have ksh, try running configure again with it.
+ ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
+ export ORIGINAL_CONFIG_SHELL
+ CONFIG_SHELL=/bin/ksh
+ export CONFIG_SHELL
+ exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"}
+ else
+ # Try using printf.
+ echo='printf %s\n'
+ if test "X`($echo '\t') 2>/dev/null`" = 'X\t' &&
+ echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ # Cool, printf works
+ :
+ elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` &&
+ test "X$echo_testing_string" = 'X\t' &&
+ echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL
+ export CONFIG_SHELL
+ SHELL="$CONFIG_SHELL"
+ export SHELL
+ echo="$CONFIG_SHELL [$]0 --fallback-echo"
+ elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` &&
+ test "X$echo_testing_string" = 'X\t' &&
+ echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ echo="$CONFIG_SHELL [$]0 --fallback-echo"
+ else
+ # maybe with a smaller string...
+ prev=:
+
+ for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do
+ if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null
+ then
+ break
+ fi
+ prev="$cmd"
+ done
+
+ if test "$prev" != 'sed 50q "[$]0"'; then
+ echo_test_string=`eval $prev`
+ export echo_test_string
+ exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"}
+ else
+ # Oops. We lost completely, so just stick with echo.
+ echo=echo
+ fi
+ fi
+ fi
+ fi
+fi
+fi
+
+# Copy echo and quote the copy suitably for passing to libtool from
+# the Makefile, instead of quoting the original, which is used later.
+ECHO=$echo
+if test "X$ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then
+ ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo"
+fi
+
+AC_SUBST(ECHO)
+])])# _LT_AC_PROG_ECHO_BACKSLASH
+
+
+# _LT_AC_LOCK
+# -----------
+AC_DEFUN([_LT_AC_LOCK],
+[AC_ARG_ENABLE([libtool-lock],
+ [AC_HELP_STRING([--disable-libtool-lock],
+ [avoid locking (might break parallel builds)])])
+test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
+
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+case $host in
+ia64-*-hpux*)
+ # Find out which ABI we are using.
+ echo 'int i;' > conftest.$ac_ext
+ if AC_TRY_EVAL(ac_compile); then
+ case `/usr/bin/file conftest.$ac_objext` in
+ *ELF-32*)
+ HPUX_IA64_MODE="32"
+ ;;
+ *ELF-64*)
+ HPUX_IA64_MODE="64"
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+*-*-irix6*)
+ # Find out which ABI we are using.
+ echo '[#]line __oline__ "configure"' > conftest.$ac_ext
+ if AC_TRY_EVAL(ac_compile); then
+ if test "$lt_cv_prog_gnu_ld" = yes; then
+ case `/usr/bin/file conftest.$ac_objext` in
+ *32-bit*)
+ LD="${LD-ld} -melf32bsmip"
+ ;;
+ *N32*)
+ LD="${LD-ld} -melf32bmipn32"
+ ;;
+ *64-bit*)
+ LD="${LD-ld} -melf64bmip"
+ ;;
+ esac
+ else
+ case `/usr/bin/file conftest.$ac_objext` in
+ *32-bit*)
+ LD="${LD-ld} -32"
+ ;;
+ *N32*)
+ LD="${LD-ld} -n32"
+ ;;
+ *64-bit*)
+ LD="${LD-ld} -64"
+ ;;
+ esac
+ fi
+ fi
+ rm -rf conftest*
+ ;;
+
+x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \
+s390*-*linux*|sparc*-*linux*)
+ # Find out which ABI we are using.
+ echo 'int i;' > conftest.$ac_ext
+ if AC_TRY_EVAL(ac_compile); then
+ case `/usr/bin/file conftest.o` in
+ *32-bit*)
+ case $host in
+ x86_64-*kfreebsd*-gnu)
+ LD="${LD-ld} -m elf_i386_fbsd"
+ ;;
+ x86_64-*linux*)
+ LD="${LD-ld} -m elf_i386"
+ ;;
+ ppc64-*linux*|powerpc64-*linux*)
+ LD="${LD-ld} -m elf32ppclinux"
+ ;;
+ s390x-*linux*)
+ LD="${LD-ld} -m elf_s390"
+ ;;
+ sparc64-*linux*)
+ LD="${LD-ld} -m elf32_sparc"
+ ;;
+ esac
+ ;;
+ *64-bit*)
+ libsuff=64
+ case $host in
+ x86_64-*kfreebsd*-gnu)
+ LD="${LD-ld} -m elf_x86_64_fbsd"
+ ;;
+ x86_64-*linux*)
+ LD="${LD-ld} -m elf_x86_64"
+ ;;
+ ppc*-*linux*|powerpc*-*linux*)
+ LD="${LD-ld} -m elf64ppc"
+ ;;
+ s390*-*linux*)
+ LD="${LD-ld} -m elf64_s390"
+ ;;
+ sparc*-*linux*)
+ LD="${LD-ld} -m elf64_sparc"
+ ;;
+ esac
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+
+*-*-sco3.2v5*)
+ # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+ SAVE_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS -belf"
+ AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf,
+ [AC_LANG_PUSH(C)
+ AC_TRY_LINK([],[],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no])
+ AC_LANG_POP])
+ if test x"$lt_cv_cc_needs_belf" != x"yes"; then
+ # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
+ CFLAGS="$SAVE_CFLAGS"
+ fi
+ ;;
+sparc*-*solaris*)
+ # Find out which ABI we are using.
+ echo 'int i;' > conftest.$ac_ext
+ if AC_TRY_EVAL(ac_compile); then
+ case `/usr/bin/file conftest.o` in
+ *64-bit*)
+ case $lt_cv_prog_gnu_ld in
+ yes*) LD="${LD-ld} -m elf64_sparc" ;;
+ *)
+ if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
+ LD="${LD-ld} -64"
+ fi
+ ;;
+ esac
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+
+AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL],
+[*-*-cygwin* | *-*-mingw* | *-*-pw32*)
+ AC_CHECK_TOOL(DLLTOOL, dlltool, false)
+ AC_CHECK_TOOL(AS, as, false)
+ AC_CHECK_TOOL(OBJDUMP, objdump, false)
+ ;;
+ ])
+esac
+
+need_locks="$enable_libtool_lock"
+
+])# _LT_AC_LOCK
+
+
+# AC_LIBTOOL_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
+# [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE])
+# ----------------------------------------------------------------
+# Check whether the given compiler option works
+AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION],
+[AC_REQUIRE([LT_AC_PROG_SED])
+AC_CACHE_CHECK([$1], [$2],
+ [$2=no
+ ifelse([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4])
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+ lt_compiler_flag="$3"
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ # The option is referenced via a variable to avoid confusing sed.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&AS_MESSAGE_LOG_FD
+ echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+ if (exit $ac_status) && test -s "$ac_outfile"; then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings other than the usual output.
+ $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+ $2=yes
+ fi
+ fi
+ $rm conftest*
+])
+
+if test x"[$]$2" = xyes; then
+ ifelse([$5], , :, [$5])
+else
+ ifelse([$6], , :, [$6])
+fi
+])# AC_LIBTOOL_COMPILER_OPTION
+
+
+# AC_LIBTOOL_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
+# [ACTION-SUCCESS], [ACTION-FAILURE])
+# ------------------------------------------------------------
+# Check whether the given compiler option works
+AC_DEFUN([AC_LIBTOOL_LINKER_OPTION],
+[AC_REQUIRE([LT_AC_PROG_SED])dnl
+AC_CACHE_CHECK([$1], [$2],
+ [$2=no
+ save_LDFLAGS="$LDFLAGS"
+ LDFLAGS="$LDFLAGS $3"
+ echo "$lt_simple_link_test_code" > conftest.$ac_ext
+ if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+ # The linker can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ if test -s conftest.err; then
+ # Append any errors to the config.log.
+ cat conftest.err 1>&AS_MESSAGE_LOG_FD
+ $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if diff conftest.exp conftest.er2 >/dev/null; then
+ $2=yes
+ fi
+ else
+ $2=yes
+ fi
+ fi
+ $rm -r conftest*
+ LDFLAGS="$save_LDFLAGS"
+])
+
+if test x"[$]$2" = xyes; then
+ ifelse([$4], , :, [$4])
+else
+ ifelse([$5], , :, [$5])
+fi
+])# AC_LIBTOOL_LINKER_OPTION
+
+
+# AC_LIBTOOL_SYS_MAX_CMD_LEN
+# --------------------------
+AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN],
+[# find the maximum length of command line arguments
+AC_MSG_CHECKING([the maximum length of command line arguments])
+AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
+ i=0
+ teststring="ABCD"
+
+ case $build_os in
+ msdosdjgpp*)
+ # On DJGPP, this test can blow up pretty badly due to problems in libc
+ # (any single argument exceeding 2000 bytes causes a buffer overrun
+ # during glob expansion). Even if it were fixed, the result of this
+ # check would be larger than it should be.
+ lt_cv_sys_max_cmd_len=12288; # 12K is about right
+ ;;
+
+ gnu*)
+ # Under GNU Hurd, this test is not required because there is
+ # no limit to the length of command line arguments.
+ # Libtool will interpret -1 as no limit whatsoever
+ lt_cv_sys_max_cmd_len=-1;
+ ;;
+
+ cygwin* | mingw*)
+ # On Win9x/ME, this test blows up -- it succeeds, but takes
+ # about 5 minutes as the teststring grows exponentially.
+ # Worse, since 9x/ME are not pre-emptively multitasking,
+ # you end up with a "frozen" computer, even though with patience
+ # the test eventually succeeds (with a max line length of 256k).
+ # Instead, let's just punt: use the minimum linelength reported by
+ # all of the supported platforms: 8192 (on NT/2K/XP).
+ lt_cv_sys_max_cmd_len=8192;
+ ;;
+
+ amigaos*)
+ # On AmigaOS with pdksh, this test takes hours, literally.
+ # So we just punt and use a minimum line length of 8192.
+ lt_cv_sys_max_cmd_len=8192;
+ ;;
+
+ netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
+ # This has been around since 386BSD, at least. Likely further.
+ if test -x /sbin/sysctl; then
+ lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
+ elif test -x /usr/sbin/sysctl; then
+ lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
+ else
+ lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs
+ fi
+ # And add a safety zone
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+ ;;
+
+ interix*)
+ # We know the value 262144 and hardcode it with a safety zone (like BSD)
+ lt_cv_sys_max_cmd_len=196608
+ ;;
+
+ osf*)
+ # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
+ # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
+ # nice to cause kernel panics so lets avoid the loop below.
+ # First set a reasonable default.
+ lt_cv_sys_max_cmd_len=16384
+ #
+ if test -x /sbin/sysconfig; then
+ case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
+ *1*) lt_cv_sys_max_cmd_len=-1 ;;
+ esac
+ fi
+ ;;
+ sco3.2v5*)
+ lt_cv_sys_max_cmd_len=102400
+ ;;
+ sysv5* | sco5v6* | sysv4.2uw2*)
+ kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
+ if test -n "$kargmax"; then
+ lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'`
+ else
+ lt_cv_sys_max_cmd_len=32768
+ fi
+ ;;
+ *)
+ lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
+ if test -n "$lt_cv_sys_max_cmd_len"; then
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+ else
+ SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
+ while (test "X"`$SHELL [$]0 --fallback-echo "X$teststring" 2>/dev/null` \
+ = "XX$teststring") >/dev/null 2>&1 &&
+ new_result=`expr "X$teststring" : ".*" 2>&1` &&
+ lt_cv_sys_max_cmd_len=$new_result &&
+ test $i != 17 # 1/2 MB should be enough
+ do
+ i=`expr $i + 1`
+ teststring=$teststring$teststring
+ done
+ teststring=
+ # Add a significant safety factor because C++ compilers can tack on massive
+ # amounts of additional arguments before passing them to the linker.
+ # It appears as though 1/2 is a usable value.
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
+ fi
+ ;;
+ esac
+])
+if test -n $lt_cv_sys_max_cmd_len ; then
+ AC_MSG_RESULT($lt_cv_sys_max_cmd_len)
+else
+ AC_MSG_RESULT(none)
+fi
+])# AC_LIBTOOL_SYS_MAX_CMD_LEN
+
+
+# _LT_AC_CHECK_DLFCN
+# ------------------
+AC_DEFUN([_LT_AC_CHECK_DLFCN],
+[AC_CHECK_HEADERS(dlfcn.h)dnl
+])# _LT_AC_CHECK_DLFCN
+
+
+# _LT_AC_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE,
+# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING)
+# ---------------------------------------------------------------------
+AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF],
+[AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl
+if test "$cross_compiling" = yes; then :
+ [$4]
+else
+ lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+ lt_status=$lt_dlunknown
+ cat > conftest.$ac_ext <<EOF
+[#line __oline__ "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+# define LT_DLGLOBAL RTLD_GLOBAL
+#else
+# ifdef DL_GLOBAL
+# define LT_DLGLOBAL DL_GLOBAL
+# else
+# define LT_DLGLOBAL 0
+# endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+ find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+# ifdef RTLD_LAZY
+# define LT_DLLAZY_OR_NOW RTLD_LAZY
+# else
+# ifdef DL_LAZY
+# define LT_DLLAZY_OR_NOW DL_LAZY
+# else
+# ifdef RTLD_NOW
+# define LT_DLLAZY_OR_NOW RTLD_NOW
+# else
+# ifdef DL_NOW
+# define LT_DLLAZY_OR_NOW DL_NOW
+# else
+# define LT_DLLAZY_OR_NOW 0
+# endif
+# endif
+# endif
+# endif
+#endif
+
+#ifdef __cplusplus
+extern "C" void exit (int);
+#endif
+
+void fnord() { int i=42;}
+int main ()
+{
+ void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+ int status = $lt_dlunknown;
+
+ if (self)
+ {
+ if (dlsym (self,"fnord")) status = $lt_dlno_uscore;
+ else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
+ /* dlclose (self); */
+ }
+ else
+ puts (dlerror ());
+
+ exit (status);
+}]
+EOF
+ if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then
+ (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null
+ lt_status=$?
+ case x$lt_status in
+ x$lt_dlno_uscore) $1 ;;
+ x$lt_dlneed_uscore) $2 ;;
+ x$lt_dlunknown|x*) $3 ;;
+ esac
+ else :
+ # compilation failed
+ $3
+ fi
+fi
+rm -fr conftest*
+])# _LT_AC_TRY_DLOPEN_SELF
+
+
+# AC_LIBTOOL_DLOPEN_SELF
+# ----------------------
+AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF],
+[AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl
+if test "x$enable_dlopen" != xyes; then
+ enable_dlopen=unknown
+ enable_dlopen_self=unknown
+ enable_dlopen_self_static=unknown
+else
+ lt_cv_dlopen=no
+ lt_cv_dlopen_libs=
+
+ case $host_os in
+ beos*)
+ lt_cv_dlopen="load_add_on"
+ lt_cv_dlopen_libs=
+ lt_cv_dlopen_self=yes
+ ;;
+
+ mingw* | pw32*)
+ lt_cv_dlopen="LoadLibrary"
+ lt_cv_dlopen_libs=
+ ;;
+
+ cygwin*)
+ lt_cv_dlopen="dlopen"
+ lt_cv_dlopen_libs=
+ ;;
+
+ darwin*)
+ # if libdl is installed we need to link against it
+ AC_CHECK_LIB([dl], [dlopen],
+ [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[
+ lt_cv_dlopen="dyld"
+ lt_cv_dlopen_libs=
+ lt_cv_dlopen_self=yes
+ ])
+ ;;
+
+ *)
+ AC_CHECK_FUNC([shl_load],
+ [lt_cv_dlopen="shl_load"],
+ [AC_CHECK_LIB([dld], [shl_load],
+ [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"],
+ [AC_CHECK_FUNC([dlopen],
+ [lt_cv_dlopen="dlopen"],
+ [AC_CHECK_LIB([dl], [dlopen],
+ [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],
+ [AC_CHECK_LIB([svld], [dlopen],
+ [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"],
+ [AC_CHECK_LIB([dld], [dld_link],
+ [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"])
+ ])
+ ])
+ ])
+ ])
+ ])
+ ;;
+ esac
+
+ if test "x$lt_cv_dlopen" != xno; then
+ enable_dlopen=yes
+ else
+ enable_dlopen=no
+ fi
+
+ case $lt_cv_dlopen in
+ dlopen)
+ save_CPPFLAGS="$CPPFLAGS"
+ test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+
+ save_LDFLAGS="$LDFLAGS"
+ wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
+
+ save_LIBS="$LIBS"
+ LIBS="$lt_cv_dlopen_libs $LIBS"
+
+ AC_CACHE_CHECK([whether a program can dlopen itself],
+ lt_cv_dlopen_self, [dnl
+ _LT_AC_TRY_DLOPEN_SELF(
+ lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes,
+ lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross)
+ ])
+
+ if test "x$lt_cv_dlopen_self" = xyes; then
+ wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
+ AC_CACHE_CHECK([whether a statically linked program can dlopen itself],
+ lt_cv_dlopen_self_static, [dnl
+ _LT_AC_TRY_DLOPEN_SELF(
+ lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes,
+ lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross)
+ ])
+ fi
+
+ CPPFLAGS="$save_CPPFLAGS"
+ LDFLAGS="$save_LDFLAGS"
+ LIBS="$save_LIBS"
+ ;;
+ esac
+
+ case $lt_cv_dlopen_self in
+ yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
+ *) enable_dlopen_self=unknown ;;
+ esac
+
+ case $lt_cv_dlopen_self_static in
+ yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
+ *) enable_dlopen_self_static=unknown ;;
+ esac
+fi
+])# AC_LIBTOOL_DLOPEN_SELF
+
+
+# AC_LIBTOOL_PROG_CC_C_O([TAGNAME])
+# ---------------------------------
+# Check to see if options -c and -o are simultaneously supported by compiler
+AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O],
+[AC_REQUIRE([LT_AC_PROG_SED])dnl
+AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl
+AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext],
+ [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)],
+ [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no
+ $rm -r conftest 2>/dev/null
+ mkdir conftest
+ cd conftest
+ mkdir out
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ lt_compiler_flag="-o out/conftest2.$ac_objext"
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
+ (eval "$lt_compile" 2>out/conftest.err)
+ ac_status=$?
+ cat out/conftest.err >&AS_MESSAGE_LOG_FD
+ echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+ if (exit $ac_status) && test -s out/conftest2.$ac_objext
+ then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp
+ $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+ if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+ _LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
+ fi
+ fi
+ chmod u+w . 2>&AS_MESSAGE_LOG_FD
+ $rm conftest*
+ # SGI C++ compiler will create directory out/ii_files/ for
+ # template instantiation
+ test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files
+ $rm out/* && rmdir out
+ cd ..
+ rmdir conftest
+ $rm conftest*
+])
+])# AC_LIBTOOL_PROG_CC_C_O
+
+
+# AC_LIBTOOL_SYS_HARD_LINK_LOCKS([TAGNAME])
+# -----------------------------------------
+# Check to see if we can do hard links to lock some files if needed
+AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS],
+[AC_REQUIRE([_LT_AC_LOCK])dnl
+
+hard_links="nottested"
+if test "$_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then
+ # do not overwrite the value of need_locks provided by the user
+ AC_MSG_CHECKING([if we can lock with hard links])
+ hard_links=yes
+ $rm conftest*
+ ln conftest.a conftest.b 2>/dev/null && hard_links=no
+ touch conftest.a
+ ln conftest.a conftest.b 2>&5 || hard_links=no
+ ln conftest.a conftest.b 2>/dev/null && hard_links=no
+ AC_MSG_RESULT([$hard_links])
+ if test "$hard_links" = no; then
+ AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe])
+ need_locks=warn
+ fi
+else
+ need_locks=no
+fi
+])# AC_LIBTOOL_SYS_HARD_LINK_LOCKS
+
+
+# AC_LIBTOOL_OBJDIR
+# -----------------
+AC_DEFUN([AC_LIBTOOL_OBJDIR],
+[AC_CACHE_CHECK([for objdir], [lt_cv_objdir],
+[rm -f .libs 2>/dev/null
+mkdir .libs 2>/dev/null
+if test -d .libs; then
+ lt_cv_objdir=.libs
+else
+ # MS-DOS does not allow filenames that begin with a dot.
+ lt_cv_objdir=_libs
+fi
+rmdir .libs 2>/dev/null])
+objdir=$lt_cv_objdir
+])# AC_LIBTOOL_OBJDIR
+
+
+# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH([TAGNAME])
+# ----------------------------------------------
+# Check hardcoding attributes.
+AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH],
+[AC_MSG_CHECKING([how to hardcode library paths into programs])
+_LT_AC_TAGVAR(hardcode_action, $1)=
+if test -n "$_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)" || \
+ test -n "$_LT_AC_TAGVAR(runpath_var, $1)" || \
+ test "X$_LT_AC_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then
+
+ # We can hardcode non-existant directories.
+ if test "$_LT_AC_TAGVAR(hardcode_direct, $1)" != no &&
+ # If the only mechanism to avoid hardcoding is shlibpath_var, we
+ # have to relink, otherwise we might link with an installed library
+ # when we should be linking with a yet-to-be-installed one
+ ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)" != no &&
+ test "$_LT_AC_TAGVAR(hardcode_minus_L, $1)" != no; then
+ # Linking always hardcodes the temporary library directory.
+ _LT_AC_TAGVAR(hardcode_action, $1)=relink
+ else
+ # We can link without hardcoding, and we can hardcode nonexisting dirs.
+ _LT_AC_TAGVAR(hardcode_action, $1)=immediate
+ fi
+else
+ # We cannot hardcode anything, or else we can only hardcode existing
+ # directories.
+ _LT_AC_TAGVAR(hardcode_action, $1)=unsupported
+fi
+AC_MSG_RESULT([$_LT_AC_TAGVAR(hardcode_action, $1)])
+
+if test "$_LT_AC_TAGVAR(hardcode_action, $1)" = relink; then
+ # Fast installation is not supported
+ enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+ test "$enable_shared" = no; then
+ # Fast installation is not necessary
+ enable_fast_install=needless
+fi
+])# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH
+
+
+# AC_LIBTOOL_SYS_LIB_STRIP
+# ------------------------
+AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP],
+[striplib=
+old_striplib=
+AC_MSG_CHECKING([whether stripping libraries is possible])
+if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then
+ test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
+ test -z "$striplib" && striplib="$STRIP --strip-unneeded"
+ AC_MSG_RESULT([yes])
+else
+# FIXME - insert some real tests, host_os isn't really good enough
+ case $host_os in
+ darwin*)
+ if test -n "$STRIP" ; then
+ striplib="$STRIP -x"
+ old_striplib="$STRIP -S"
+ AC_MSG_RESULT([yes])
+ else
+ AC_MSG_RESULT([no])
+fi
+ ;;
+ *)
+ AC_MSG_RESULT([no])
+ ;;
+ esac
+fi
+])# AC_LIBTOOL_SYS_LIB_STRIP
+
+
+# AC_LIBTOOL_SYS_DYNAMIC_LINKER
+# -----------------------------
+# PORTME Fill in your ld.so characteristics
+AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER],
+[AC_REQUIRE([LT_AC_PROG_SED])dnl
+AC_MSG_CHECKING([dynamic linker characteristics])
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=".so"
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+m4_if($1,[],[
+if test "$GCC" = yes; then
+ case $host_os in
+ darwin*) lt_awk_arg="/^libraries:/,/LR/" ;;
+ *) lt_awk_arg="/^libraries:/" ;;
+ esac
+ lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+ if echo "$lt_search_path_spec" | grep ';' >/dev/null ; then
+ # if the path contains ";" then we assume it to be the separator
+ # otherwise default to the standard path separator (i.e. ":") - it is
+ # assumed that no part of a normal pathname contains ";" but that should
+ # okay in the real world where ";" in dirpaths is itself problematic.
+ lt_search_path_spec=`echo "$lt_search_path_spec" | $SED -e 's/;/ /g'`
+ else
+ lt_search_path_spec=`echo "$lt_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+ fi
+ # Ok, now we have the path, separated by spaces, we can step through it
+ # and add multilib dir if necessary.
+ lt_tmp_lt_search_path_spec=
+ lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
+ for lt_sys_path in $lt_search_path_spec; do
+ if test -d "$lt_sys_path/$lt_multi_os_dir"; then
+ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir"
+ else
+ test -d "$lt_sys_path" && \
+ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
+ fi
+ done
+ lt_search_path_spec=`echo $lt_tmp_lt_search_path_spec | awk '
+BEGIN {RS=" "; FS="/|\n";} {
+ lt_foo="";
+ lt_count=0;
+ for (lt_i = NF; lt_i > 0; lt_i--) {
+ if ($lt_i != "" && $lt_i != ".") {
+ if ($lt_i == "..") {
+ lt_count++;
+ } else {
+ if (lt_count == 0) {
+ lt_foo="/" $lt_i lt_foo;
+ } else {
+ lt_count--;
+ }
+ }
+ }
+ }
+ if (lt_foo != "") { lt_freq[[lt_foo]]++; }
+ if (lt_freq[[lt_foo]] == 1) { print lt_foo; }
+}'`
+ sys_lib_search_path_spec=`echo $lt_search_path_spec`
+else
+ sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi])
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+case $host_os in
+aix3*)
+ version_type=linux
+ library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+ shlibpath_var=LIBPATH
+
+ # AIX 3 has no versioning support, so we append a major version to the name.
+ soname_spec='${libname}${release}${shared_ext}$major'
+ ;;
+
+aix[[4-9]]*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ hardcode_into_libs=yes
+ if test "$host_cpu" = ia64; then
+ # AIX 5 supports IA64
+ library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+ shlibpath_var=LD_LIBRARY_PATH
+ else
+ # With GCC up to 2.95.x, collect2 would create an import file
+ # for dependence libraries. The import file would start with
+ # the line `#! .'. This would cause the generated library to
+ # depend on `.', always an invalid library. This was fixed in
+ # development snapshots of GCC prior to 3.0.
+ case $host_os in
+ aix4 | aix4.[[01]] | aix4.[[01]].*)
+ if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+ echo ' yes '
+ echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then
+ :
+ else
+ can_build_shared=no
+ fi
+ ;;
+ esac
+ # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+ # soname into executable. Probably we can add versioning support to
+ # collect2, so additional links can be useful in future.
+ if test "$aix_use_runtimelinking" = yes; then
+ # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+ # instead of lib<name>.a to let people know that these are not
+ # typical AIX shared libraries.
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ else
+ # We preserve .a as extension for shared libraries through AIX4.2
+ # and later when we are not doing run time linking.
+ library_names_spec='${libname}${release}.a $libname.a'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ fi
+ shlibpath_var=LIBPATH
+ fi
+ ;;
+
+amigaos*)
+ library_names_spec='$libname.ixlibrary $libname.a'
+ # Create ${libname}_ixlibrary.a entries in /sys/libs.
+ finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+ ;;
+
+beos*)
+ library_names_spec='${libname}${shared_ext}'
+ dynamic_linker="$host_os ld.so"
+ shlibpath_var=LIBRARY_PATH
+ ;;
+
+bsdi[[45]]*)
+ version_type=linux
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+ sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+ # the default ld.so.conf also contains /usr/contrib/lib and
+ # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+ # libtool to hard-code these into programs
+ ;;
+
+cygwin* | mingw* | pw32*)
+ version_type=windows
+ shrext_cmds=".dll"
+ need_version=no
+ need_lib_prefix=no
+
+ case $GCC,$host_os in
+ yes,cygwin* | yes,mingw* | yes,pw32*)
+ library_names_spec='$libname.dll.a'
+ # DLL is installed to $(libdir)/../bin by postinstall_cmds
+ postinstall_cmds='base_file=`basename \${file}`~
+ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~
+ dldir=$destdir/`dirname \$dlpath`~
+ test -d \$dldir || mkdir -p \$dldir~
+ $install_prog $dir/$dlname \$dldir/$dlname~
+ chmod a+x \$dldir/$dlname'
+ postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+ dlpath=$dir/\$dldll~
+ $rm \$dlpath'
+ shlibpath_overrides_runpath=yes
+
+ case $host_os in
+ cygwin*)
+ # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+ soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+ sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib"
+ ;;
+ mingw*)
+ # MinGW DLLs use traditional 'lib' prefix
+ soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+ sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+ if echo "$sys_lib_search_path_spec" | [grep ';[c-zC-Z]:/' >/dev/null]; then
+ # It is most probably a Windows format PATH printed by
+ # mingw gcc, but we are running on Cygwin. Gcc prints its search
+ # path with ; separators, and with drive letters. We can handle the
+ # drive letters (cygwin fileutils understands them), so leave them,
+ # especially as we might pass files found there to a mingw objdump,
+ # which wouldn't understand a cygwinified path. Ahh.
+ sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+ else
+ sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+ fi
+ ;;
+ pw32*)
+ # pw32 DLLs use 'pw' prefix rather than 'lib'
+ library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+ ;;
+ esac
+ ;;
+
+ *)
+ library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib'
+ ;;
+ esac
+ dynamic_linker='Win32 ld.exe'
+ # FIXME: first we should search . and the directory the executable is in
+ shlibpath_var=PATH
+ ;;
+
+darwin* | rhapsody*)
+ dynamic_linker="$host_os dyld"
+ version_type=darwin
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext'
+ soname_spec='${libname}${release}${major}$shared_ext'
+ shlibpath_overrides_runpath=yes
+ shlibpath_var=DYLD_LIBRARY_PATH
+ shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+ m4_if([$1], [],[
+ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"])
+ sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+ ;;
+
+dgux*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+freebsd1*)
+ dynamic_linker=no
+ ;;
+
+freebsd* | dragonfly*)
+ # DragonFly does not have aout. When/if they implement a new
+ # versioning mechanism, adjust this.
+ if test -x /usr/bin/objformat; then
+ objformat=`/usr/bin/objformat`
+ else
+ case $host_os in
+ freebsd[[123]]*) objformat=aout ;;
+ *) objformat=elf ;;
+ esac
+ fi
+ version_type=freebsd-$objformat
+ case $version_type in
+ freebsd-elf*)
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+ need_version=no
+ need_lib_prefix=no
+ ;;
+ freebsd-*)
+ library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+ need_version=yes
+ ;;
+ esac
+ shlibpath_var=LD_LIBRARY_PATH
+ case $host_os in
+ freebsd2*)
+ shlibpath_overrides_runpath=yes
+ ;;
+ freebsd3.[[01]]* | freebsdelf3.[[01]]*)
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+ freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \
+ freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1)
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+ *) # from 4.6 on, and DragonFly
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+ esac
+ ;;
+
+gnu*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ hardcode_into_libs=yes
+ ;;
+
+hpux9* | hpux10* | hpux11*)
+ # Give a soname corresponding to the major version so that dld.sl refuses to
+ # link against other versions.
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=no
+ case $host_cpu in
+ ia64*)
+ shrext_cmds='.so'
+ hardcode_into_libs=yes
+ dynamic_linker="$host_os dld.so"
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ if test "X$HPUX_IA64_MODE" = X32; then
+ sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+ else
+ sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+ fi
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ ;;
+ hppa*64*)
+ shrext_cmds='.sl'
+ hardcode_into_libs=yes
+ dynamic_linker="$host_os dld.sl"
+ shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ ;;
+ *)
+ shrext_cmds='.sl'
+ dynamic_linker="$host_os dld.sl"
+ shlibpath_var=SHLIB_PATH
+ shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ ;;
+ esac
+ # HP-UX runs *really* slowly unless shared libraries are mode 555.
+ postinstall_cmds='chmod 555 $lib'
+ ;;
+
+interix[[3-9]]*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+
+irix5* | irix6* | nonstopux*)
+ case $host_os in
+ nonstopux*) version_type=nonstopux ;;
+ *)
+ if test "$lt_cv_prog_gnu_ld" = yes; then
+ version_type=linux
+ else
+ version_type=irix
+ fi ;;
+ esac
+ need_lib_prefix=no
+ need_version=no
+ soname_spec='${libname}${release}${shared_ext}$major'
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+ case $host_os in
+ irix5* | nonstopux*)
+ libsuff= shlibsuff=
+ ;;
+ *)
+ case $LD in # libtool.m4 will add one of these switches to LD
+ *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+ libsuff= shlibsuff= libmagic=32-bit;;
+ *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+ libsuff=32 shlibsuff=N32 libmagic=N32;;
+ *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+ libsuff=64 shlibsuff=64 libmagic=64-bit;;
+ *) libsuff= shlibsuff= libmagic=never-match;;
+ esac
+ ;;
+ esac
+ shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+ shlibpath_overrides_runpath=no
+ sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+ sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+ hardcode_into_libs=yes
+ ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+ dynamic_linker=no
+ ;;
+
+# This must be Linux ELF.
+linux* | k*bsd*-gnu)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ # This implies no fast_install, which is unacceptable.
+ # Some rework will be needed to allow for fast_install
+ # before this can be enabled.
+ hardcode_into_libs=yes
+ sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+ sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+
+ # Append ld.so.conf contents to the search path
+ if test -f /etc/ld.so.conf; then
+ lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '`
+ sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra"
+ fi
+
+ # We used to test for /lib/ld.so.1 and disable shared libraries on
+ # powerpc, because MkLinux only supported shared libraries with the
+ # GNU dynamic linker. Since this was broken with cross compilers,
+ # most powerpc-linux boxes support dynamic linking these days and
+ # people can always --disable-shared, the test was removed, and we
+ # assume the GNU/Linux dynamic linker is in use.
+ dynamic_linker='GNU/Linux ld.so'
+ ;;
+
+netbsd*)
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=no
+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+ dynamic_linker='NetBSD (a.out) ld.so'
+ else
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ dynamic_linker='NetBSD ld.elf_so'
+ fi
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+
+newsos6)
+ version_type=linux
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ ;;
+
+nto-qnx*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ ;;
+
+openbsd*)
+ version_type=sunos
+ sys_lib_dlsearch_path_spec="/usr/lib"
+ need_lib_prefix=no
+ # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
+ case $host_os in
+ openbsd3.3 | openbsd3.3.*) need_version=yes ;;
+ *) need_version=no ;;
+ esac
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+ case $host_os in
+ openbsd2.[[89]] | openbsd2.[[89]].*)
+ shlibpath_overrides_runpath=no
+ ;;
+ *)
+ shlibpath_overrides_runpath=yes
+ ;;
+ esac
+ else
+ shlibpath_overrides_runpath=yes
+ fi
+ ;;
+
+os2*)
+ libname_spec='$name'
+ shrext_cmds=".dll"
+ need_lib_prefix=no
+ library_names_spec='$libname${shared_ext} $libname.a'
+ dynamic_linker='OS/2 ld.exe'
+ shlibpath_var=LIBPATH
+ ;;
+
+osf3* | osf4* | osf5*)
+ version_type=osf
+ need_lib_prefix=no
+ need_version=no
+ soname_spec='${libname}${release}${shared_ext}$major'
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ shlibpath_var=LD_LIBRARY_PATH
+ sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+ sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+ ;;
+
+rdos*)
+ dynamic_linker=no
+ ;;
+
+solaris*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ # ldd complains unless libraries are executable
+ postinstall_cmds='chmod +x $lib'
+ ;;
+
+sunos4*)
+ version_type=sunos
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+ finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ if test "$with_gnu_ld" = yes; then
+ need_lib_prefix=no
+ fi
+ need_version=yes
+ ;;
+
+sysv4 | sysv4.3*)
+ version_type=linux
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ case $host_vendor in
+ sni)
+ shlibpath_overrides_runpath=no
+ need_lib_prefix=no
+ export_dynamic_flag_spec='${wl}-Blargedynsym'
+ runpath_var=LD_RUN_PATH
+ ;;
+ siemens)
+ need_lib_prefix=no
+ ;;
+ motorola)
+ need_lib_prefix=no
+ need_version=no
+ shlibpath_overrides_runpath=no
+ sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+ ;;
+ esac
+ ;;
+
+sysv4*MP*)
+ if test -d /usr/nec ;then
+ version_type=linux
+ library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
+ soname_spec='$libname${shared_ext}.$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ fi
+ ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+ version_type=freebsd-elf
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ hardcode_into_libs=yes
+ if test "$with_gnu_ld" = yes; then
+ sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+ shlibpath_overrides_runpath=no
+ else
+ sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+ shlibpath_overrides_runpath=yes
+ case $host_os in
+ sco3.2v5*)
+ sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+ ;;
+ esac
+ fi
+ sys_lib_dlsearch_path_spec='/usr/lib'
+ ;;
+
+uts4*)
+ version_type=linux
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+*)
+ dynamic_linker=no
+ ;;
+esac
+AC_MSG_RESULT([$dynamic_linker])
+test "$dynamic_linker" = no && can_build_shared=no
+
+AC_CACHE_VAL([lt_cv_sys_lib_search_path_spec],
+[lt_cv_sys_lib_search_path_spec="$sys_lib_search_path_spec"])
+sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
+AC_CACHE_VAL([lt_cv_sys_lib_dlsearch_path_spec],
+[lt_cv_sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec"])
+sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test "$GCC" = yes; then
+ variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+])# AC_LIBTOOL_SYS_DYNAMIC_LINKER
+
+
+# _LT_AC_TAGCONFIG
+# ----------------
+AC_DEFUN([_LT_AC_TAGCONFIG],
+[AC_REQUIRE([LT_AC_PROG_SED])dnl
+AC_ARG_WITH([tags],
+ [AC_HELP_STRING([--with-tags@<:@=TAGS@:>@],
+ [include additional configurations @<:@automatic@:>@])],
+ [tagnames="$withval"])
+
+if test -f "$ltmain" && test -n "$tagnames"; then
+ if test ! -f "${ofile}"; then
+ AC_MSG_WARN([output file `$ofile' does not exist])
+ fi
+
+ if test -z "$LTCC"; then
+ eval "`$SHELL ${ofile} --config | grep '^LTCC='`"
+ if test -z "$LTCC"; then
+ AC_MSG_WARN([output file `$ofile' does not look like a libtool script])
+ else
+ AC_MSG_WARN([using `LTCC=$LTCC', extracted from `$ofile'])
+ fi
+ fi
+ if test -z "$LTCFLAGS"; then
+ eval "`$SHELL ${ofile} --config | grep '^LTCFLAGS='`"
+ fi
+
+ # Extract list of available tagged configurations in $ofile.
+ # Note that this assumes the entire list is on one line.
+ available_tags=`grep "^available_tags=" "${ofile}" | $SED -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'`
+
+ lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+ for tagname in $tagnames; do
+ IFS="$lt_save_ifs"
+ # Check whether tagname contains only valid characters
+ case `$echo "X$tagname" | $Xsed -e 's:[[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]]::g'` in
+ "") ;;
+ *) AC_MSG_ERROR([invalid tag name: $tagname])
+ ;;
+ esac
+
+ if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null
+ then
+ AC_MSG_ERROR([tag name \"$tagname\" already exists])
+ fi
+
+ # Update the list of available tags.
+ if test -n "$tagname"; then
+ echo appending configuration tag \"$tagname\" to $ofile
+
+ case $tagname in
+ CXX)
+ if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
+ ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
+ (test "X$CXX" != "Xg++"))) ; then
+ AC_LIBTOOL_LANG_CXX_CONFIG
+ else
+ tagname=""
+ fi
+ ;;
+
+ F77)
+ if test -n "$F77" && test "X$F77" != "Xno"; then
+ AC_LIBTOOL_LANG_F77_CONFIG
+ else
+ tagname=""
+ fi
+ ;;
+
+ GCJ)
+ if test -n "$GCJ" && test "X$GCJ" != "Xno"; then
+ AC_LIBTOOL_LANG_GCJ_CONFIG
+ else
+ tagname=""
+ fi
+ ;;
+
+ RC)
+ AC_LIBTOOL_LANG_RC_CONFIG
+ ;;
+
+ *)
+ AC_MSG_ERROR([Unsupported tag name: $tagname])
+ ;;
+ esac
+
+ # Append the new tag name to the list of available tags.
+ if test -n "$tagname" ; then
+ available_tags="$available_tags $tagname"
+ fi
+ fi
+ done
+ IFS="$lt_save_ifs"
+
+ # Now substitute the updated list of available tags.
+ if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then
+ mv "${ofile}T" "$ofile"
+ chmod +x "$ofile"
+ else
+ rm -f "${ofile}T"
+ AC_MSG_ERROR([unable to update list of available tagged configurations.])
+ fi
+fi
+])# _LT_AC_TAGCONFIG
+
+
+# AC_LIBTOOL_DLOPEN
+# -----------------
+# enable checks for dlopen support
+AC_DEFUN([AC_LIBTOOL_DLOPEN],
+ [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])
+])# AC_LIBTOOL_DLOPEN
+
+
+# AC_LIBTOOL_WIN32_DLL
+# --------------------
+# declare package support for building win32 DLLs
+AC_DEFUN([AC_LIBTOOL_WIN32_DLL],
+[AC_BEFORE([$0], [AC_LIBTOOL_SETUP])
+])# AC_LIBTOOL_WIN32_DLL
+
+
+# AC_ENABLE_SHARED([DEFAULT])
+# ---------------------------
+# implement the --enable-shared flag
+# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'.
+AC_DEFUN([AC_ENABLE_SHARED],
+[define([AC_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl
+AC_ARG_ENABLE([shared],
+ [AC_HELP_STRING([--enable-shared@<:@=PKGS@:>@],
+ [build shared libraries @<:@default=]AC_ENABLE_SHARED_DEFAULT[@:>@])],
+ [p=${PACKAGE-default}
+ case $enableval in
+ yes) enable_shared=yes ;;
+ no) enable_shared=no ;;
+ *)
+ enable_shared=no
+ # Look at the argument we got. We use all the common list separators.
+ lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+ for pkg in $enableval; do
+ IFS="$lt_save_ifs"
+ if test "X$pkg" = "X$p"; then
+ enable_shared=yes
+ fi
+ done
+ IFS="$lt_save_ifs"
+ ;;
+ esac],
+ [enable_shared=]AC_ENABLE_SHARED_DEFAULT)
+])# AC_ENABLE_SHARED
+
+
+# AC_DISABLE_SHARED
+# -----------------
+# set the default shared flag to --disable-shared
+AC_DEFUN([AC_DISABLE_SHARED],
+[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+AC_ENABLE_SHARED(no)
+])# AC_DISABLE_SHARED
+
+
+# AC_ENABLE_STATIC([DEFAULT])
+# ---------------------------
+# implement the --enable-static flag
+# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'.
+AC_DEFUN([AC_ENABLE_STATIC],
+[define([AC_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl
+AC_ARG_ENABLE([static],
+ [AC_HELP_STRING([--enable-static@<:@=PKGS@:>@],
+ [build static libraries @<:@default=]AC_ENABLE_STATIC_DEFAULT[@:>@])],
+ [p=${PACKAGE-default}
+ case $enableval in
+ yes) enable_static=yes ;;
+ no) enable_static=no ;;
+ *)
+ enable_static=no
+ # Look at the argument we got. We use all the common list separators.
+ lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+ for pkg in $enableval; do
+ IFS="$lt_save_ifs"
+ if test "X$pkg" = "X$p"; then
+ enable_static=yes
+ fi
+ done
+ IFS="$lt_save_ifs"
+ ;;
+ esac],
+ [enable_static=]AC_ENABLE_STATIC_DEFAULT)
+])# AC_ENABLE_STATIC
+
+
+# AC_DISABLE_STATIC
+# -----------------
+# set the default static flag to --disable-static
+AC_DEFUN([AC_DISABLE_STATIC],
+[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+AC_ENABLE_STATIC(no)
+])# AC_DISABLE_STATIC
+
+
+# AC_ENABLE_FAST_INSTALL([DEFAULT])
+# ---------------------------------
+# implement the --enable-fast-install flag
+# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'.
+AC_DEFUN([AC_ENABLE_FAST_INSTALL],
+[define([AC_ENABLE_FAST_INSTALL_DEFAULT], ifelse($1, no, no, yes))dnl
+AC_ARG_ENABLE([fast-install],
+ [AC_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@],
+ [optimize for fast installation @<:@default=]AC_ENABLE_FAST_INSTALL_DEFAULT[@:>@])],
+ [p=${PACKAGE-default}
+ case $enableval in
+ yes) enable_fast_install=yes ;;
+ no) enable_fast_install=no ;;
+ *)
+ enable_fast_install=no
+ # Look at the argument we got. We use all the common list separators.
+ lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+ for pkg in $enableval; do
+ IFS="$lt_save_ifs"
+ if test "X$pkg" = "X$p"; then
+ enable_fast_install=yes
+ fi
+ done
+ IFS="$lt_save_ifs"
+ ;;
+ esac],
+ [enable_fast_install=]AC_ENABLE_FAST_INSTALL_DEFAULT)
+])# AC_ENABLE_FAST_INSTALL
+
+
+# AC_DISABLE_FAST_INSTALL
+# -----------------------
+# set the default to --disable-fast-install
+AC_DEFUN([AC_DISABLE_FAST_INSTALL],
+[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+AC_ENABLE_FAST_INSTALL(no)
+])# AC_DISABLE_FAST_INSTALL
+
+
+# AC_LIBTOOL_PICMODE([MODE])
+# --------------------------
+# implement the --with-pic flag
+# MODE is either `yes' or `no'. If omitted, it defaults to `both'.
+AC_DEFUN([AC_LIBTOOL_PICMODE],
+[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+pic_mode=ifelse($#,1,$1,default)
+])# AC_LIBTOOL_PICMODE
+
+
+# AC_PROG_EGREP
+# -------------
+# This is predefined starting with Autoconf 2.54, so this conditional
+# definition can be removed once we require Autoconf 2.54 or later.
+m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP],
+[AC_CACHE_CHECK([for egrep], [ac_cv_prog_egrep],
+ [if echo a | (grep -E '(a|b)') >/dev/null 2>&1
+ then ac_cv_prog_egrep='grep -E'
+ else ac_cv_prog_egrep='egrep'
+ fi])
+ EGREP=$ac_cv_prog_egrep
+ AC_SUBST([EGREP])
+])])
+
+
+# AC_PATH_TOOL_PREFIX
+# -------------------
+# find a file program which can recognize shared library
+AC_DEFUN([AC_PATH_TOOL_PREFIX],
+[AC_REQUIRE([AC_PROG_EGREP])dnl
+AC_MSG_CHECKING([for $1])
+AC_CACHE_VAL(lt_cv_path_MAGIC_CMD,
+[case $MAGIC_CMD in
+[[\\/*] | ?:[\\/]*])
+ lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+ ;;
+*)
+ lt_save_MAGIC_CMD="$MAGIC_CMD"
+ lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+dnl $ac_dummy forces splitting on constant user-supplied paths.
+dnl POSIX.2 word splitting is done only on the output of word expansions,
+dnl not every word. This closes a longstanding sh security hole.
+ ac_dummy="ifelse([$2], , $PATH, [$2])"
+ for ac_dir in $ac_dummy; do
+ IFS="$lt_save_ifs"
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$1; then
+ lt_cv_path_MAGIC_CMD="$ac_dir/$1"
+ if test -n "$file_magic_test_file"; then
+ case $deplibs_check_method in
+ "file_magic "*)
+ file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+ MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+ if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+ $EGREP "$file_magic_regex" > /dev/null; then
+ :
+ else
+ cat <<EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such. This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem. Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool@gnu.org
+
+EOF
+ fi ;;
+ esac
+ fi
+ break
+ fi
+ done
+ IFS="$lt_save_ifs"
+ MAGIC_CMD="$lt_save_MAGIC_CMD"
+ ;;
+esac])
+MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+if test -n "$MAGIC_CMD"; then
+ AC_MSG_RESULT($MAGIC_CMD)
+else
+ AC_MSG_RESULT(no)
+fi
+])# AC_PATH_TOOL_PREFIX
+
+
+# AC_PATH_MAGIC
+# -------------
+# find a file program which can recognize a shared library
+AC_DEFUN([AC_PATH_MAGIC],
+[AC_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH)
+if test -z "$lt_cv_path_MAGIC_CMD"; then
+ if test -n "$ac_tool_prefix"; then
+ AC_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH)
+ else
+ MAGIC_CMD=:
+ fi
+fi
+])# AC_PATH_MAGIC
+
+
+# AC_PROG_LD
+# ----------
+# find the pathname to the GNU or non-GNU linker
+AC_DEFUN([AC_PROG_LD],
+[AC_ARG_WITH([gnu-ld],
+ [AC_HELP_STRING([--with-gnu-ld],
+ [assume the C compiler uses GNU ld @<:@default=no@:>@])],
+ [test "$withval" = no || with_gnu_ld=yes],
+ [with_gnu_ld=no])
+AC_REQUIRE([LT_AC_PROG_SED])dnl
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+ac_prog=ld
+if test "$GCC" = yes; then
+ # Check if gcc -print-prog-name=ld gives a path.
+ AC_MSG_CHECKING([for ld used by $CC])
+ case $host in
+ *-*-mingw*)
+ # gcc leaves a trailing carriage return which upsets mingw
+ ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+ *)
+ ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+ esac
+ case $ac_prog in
+ # Accept absolute paths.
+ [[\\/]]* | ?:[[\\/]]*)
+ re_direlt='/[[^/]][[^/]]*/\.\./'
+ # Canonicalize the pathname of ld
+ ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'`
+ while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
+ ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"`
+ done
+ test -z "$LD" && LD="$ac_prog"
+ ;;
+ "")
+ # If it fails, then pretend we aren't using GCC.
+ ac_prog=ld
+ ;;
+ *)
+ # If it is relative, then search for the first ld in PATH.
+ with_gnu_ld=unknown
+ ;;
+ esac
+elif test "$with_gnu_ld" = yes; then
+ AC_MSG_CHECKING([for GNU ld])
+else
+ AC_MSG_CHECKING([for non-GNU ld])
+fi
+AC_CACHE_VAL(lt_cv_path_LD,
+[if test -z "$LD"; then
+ lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+ for ac_dir in $PATH; do
+ IFS="$lt_save_ifs"
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+ lt_cv_path_LD="$ac_dir/$ac_prog"
+ # Check to see if the program is GNU ld. I'd rather use --version,
+ # but apparently some variants of GNU ld only accept -v.
+ # Break only if it was the GNU/non-GNU ld that we prefer.
+ case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+ *GNU* | *'with BFD'*)
+ test "$with_gnu_ld" != no && break
+ ;;
+ *)
+ test "$with_gnu_ld" != yes && break
+ ;;
+ esac
+ fi
+ done
+ IFS="$lt_save_ifs"
+else
+ lt_cv_path_LD="$LD" # Let the user override the test with a path.
+fi])
+LD="$lt_cv_path_LD"
+if test -n "$LD"; then
+ AC_MSG_RESULT($LD)
+else
+ AC_MSG_RESULT(no)
+fi
+test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
+AC_PROG_LD_GNU
+])# AC_PROG_LD
+
+
+# AC_PROG_LD_GNU
+# --------------
+AC_DEFUN([AC_PROG_LD_GNU],
+[AC_REQUIRE([AC_PROG_EGREP])dnl
+AC_CACHE_CHECK([if the linker ($LD) is GNU ld], lt_cv_prog_gnu_ld,
+[# I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+ lt_cv_prog_gnu_ld=yes
+ ;;
+*)
+ lt_cv_prog_gnu_ld=no
+ ;;
+esac])
+with_gnu_ld=$lt_cv_prog_gnu_ld
+])# AC_PROG_LD_GNU
+
+
+# AC_PROG_LD_RELOAD_FLAG
+# ----------------------
+# find reload flag for linker
+# -- PORTME Some linkers may need a different reload flag.
+AC_DEFUN([AC_PROG_LD_RELOAD_FLAG],
+[AC_CACHE_CHECK([for $LD option to reload object files],
+ lt_cv_ld_reload_flag,
+ [lt_cv_ld_reload_flag='-r'])
+reload_flag=$lt_cv_ld_reload_flag
+case $reload_flag in
+"" | " "*) ;;
+*) reload_flag=" $reload_flag" ;;
+esac
+reload_cmds='$LD$reload_flag -o $output$reload_objs'
+case $host_os in
+ darwin*)
+ if test "$GCC" = yes; then
+ reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
+ else
+ reload_cmds='$LD$reload_flag -o $output$reload_objs'
+ fi
+ ;;
+esac
+])# AC_PROG_LD_RELOAD_FLAG
+
+
+# AC_DEPLIBS_CHECK_METHOD
+# -----------------------
+# how to check for library dependencies
+# -- PORTME fill in with the dynamic library characteristics
+AC_DEFUN([AC_DEPLIBS_CHECK_METHOD],
+[AC_CACHE_CHECK([how to recognize dependent libraries],
+lt_cv_deplibs_check_method,
+[lt_cv_file_magic_cmd='$MAGIC_CMD'
+lt_cv_file_magic_test_file=
+lt_cv_deplibs_check_method='unknown'
+# Need to set the preceding variable on all platforms that support
+# interlibrary dependencies.
+# 'none' -- dependencies not supported.
+# `unknown' -- same as none, but documents that we really don't know.
+# 'pass_all' -- all dependencies passed with no checks.
+# 'test_compile' -- check by making test program.
+# 'file_magic [[regex]]' -- check by looking for files in library path
+# which responds to the $file_magic_cmd with a given extended regex.
+# If you have `file' or equivalent on your system and you're not sure
+# whether `pass_all' will *always* work, you probably want this one.
+
+case $host_os in
+aix[[4-9]]*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+beos*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+bsdi[[45]]*)
+ lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)'
+ lt_cv_file_magic_cmd='/usr/bin/file -L'
+ lt_cv_file_magic_test_file=/shlib/libc.so
+ ;;
+
+cygwin*)
+ # func_win32_libid is a shell function defined in ltmain.sh
+ lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+ lt_cv_file_magic_cmd='func_win32_libid'
+ ;;
+
+mingw* | pw32*)
+ # Base MSYS/MinGW do not provide the 'file' command needed by
+ # func_win32_libid shell function, so use a weaker test based on 'objdump',
+ # unless we find 'file', for example because we are cross-compiling.
+ if ( file / ) >/dev/null 2>&1; then
+ lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+ lt_cv_file_magic_cmd='func_win32_libid'
+ else
+ lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?'
+ lt_cv_file_magic_cmd='$OBJDUMP -f'
+ fi
+ ;;
+
+darwin* | rhapsody*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+freebsd* | dragonfly*)
+ if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+ case $host_cpu in
+ i*86 )
+ # Not sure whether the presence of OpenBSD here was a mistake.
+ # Let's accept both of them until this is cleared up.
+ lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library'
+ lt_cv_file_magic_cmd=/usr/bin/file
+ lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
+ ;;
+ esac
+ else
+ lt_cv_deplibs_check_method=pass_all
+ fi
+ ;;
+
+gnu*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+hpux10.20* | hpux11*)
+ lt_cv_file_magic_cmd=/usr/bin/file
+ case $host_cpu in
+ ia64*)
+ lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64'
+ lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
+ ;;
+ hppa*64*)
+ [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]']
+ lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
+ ;;
+ *)
+ lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library'
+ lt_cv_file_magic_test_file=/usr/lib/libc.sl
+ ;;
+ esac
+ ;;
+
+interix[[3-9]]*)
+ # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
+ lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$'
+ ;;
+
+irix5* | irix6* | nonstopux*)
+ case $LD in
+ *-32|*"-32 ") libmagic=32-bit;;
+ *-n32|*"-n32 ") libmagic=N32;;
+ *-64|*"-64 ") libmagic=64-bit;;
+ *) libmagic=never-match;;
+ esac
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+# This must be Linux ELF.
+linux* | k*bsd*-gnu)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+netbsd*)
+ if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+ lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
+ else
+ lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$'
+ fi
+ ;;
+
+newos6*)
+ lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)'
+ lt_cv_file_magic_cmd=/usr/bin/file
+ lt_cv_file_magic_test_file=/usr/lib/libnls.so
+ ;;
+
+nto-qnx*)
+ lt_cv_deplibs_check_method=unknown
+ ;;
+
+openbsd*)
+ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+ lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$'
+ else
+ lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
+ fi
+ ;;
+
+osf3* | osf4* | osf5*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+rdos*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+solaris*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+sysv4 | sysv4.3*)
+ case $host_vendor in
+ motorola)
+ lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]'
+ lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
+ ;;
+ ncr)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+ sequent)
+ lt_cv_file_magic_cmd='/bin/file'
+ lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )'
+ ;;
+ sni)
+ lt_cv_file_magic_cmd='/bin/file'
+ lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib"
+ lt_cv_file_magic_test_file=/lib/libc.so
+ ;;
+ siemens)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+ pc)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+ esac
+ ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+esac
+])
+file_magic_cmd=$lt_cv_file_magic_cmd
+deplibs_check_method=$lt_cv_deplibs_check_method
+test -z "$deplibs_check_method" && deplibs_check_method=unknown
+])# AC_DEPLIBS_CHECK_METHOD
+
+
+# AC_PROG_NM
+# ----------
+# find the pathname to a BSD-compatible name lister
+AC_DEFUN([AC_PROG_NM],
+[AC_CACHE_CHECK([for BSD-compatible nm], lt_cv_path_NM,
+[if test -n "$NM"; then
+ # Let the user override the test.
+ lt_cv_path_NM="$NM"
+else
+ lt_nm_to_check="${ac_tool_prefix}nm"
+ if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
+ lt_nm_to_check="$lt_nm_to_check nm"
+ fi
+ for lt_tmp_nm in $lt_nm_to_check; do
+ lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+ for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
+ IFS="$lt_save_ifs"
+ test -z "$ac_dir" && ac_dir=.
+ tmp_nm="$ac_dir/$lt_tmp_nm"
+ if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
+ # Check to see if the nm accepts a BSD-compat flag.
+ # Adding the `sed 1q' prevents false positives on HP-UX, which says:
+ # nm: unknown option "B" ignored
+ # Tru64's nm complains that /dev/null is an invalid object file
+ case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
+ */dev/null* | *'Invalid file or object type'*)
+ lt_cv_path_NM="$tmp_nm -B"
+ break
+ ;;
+ *)
+ case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
+ */dev/null*)
+ lt_cv_path_NM="$tmp_nm -p"
+ break
+ ;;
+ *)
+ lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
+ continue # so that we can try to find one that supports BSD flags
+ ;;
+ esac
+ ;;
+ esac
+ fi
+ done
+ IFS="$lt_save_ifs"
+ done
+ test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm
+fi])
+NM="$lt_cv_path_NM"
+])# AC_PROG_NM
+
+
+# AC_CHECK_LIBM
+# -------------
+# check for math library
+AC_DEFUN([AC_CHECK_LIBM],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+LIBM=
+case $host in
+*-*-beos* | *-*-cygwin* | *-*-pw32* | *-*-darwin*)
+ # These system don't have libm, or don't need it
+ ;;
+*-ncr-sysv4.3*)
+ AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw")
+ AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm")
+ ;;
+*)
+ AC_CHECK_LIB(m, cos, LIBM="-lm")
+ ;;
+esac
+])# AC_CHECK_LIBM
+
+
+# AC_LIBLTDL_CONVENIENCE([DIRECTORY])
+# -----------------------------------
+# sets LIBLTDL to the link flags for the libltdl convenience library and
+# LTDLINCL to the include flags for the libltdl header and adds
+# --enable-ltdl-convenience to the configure arguments. Note that
+# AC_CONFIG_SUBDIRS is not called here. If DIRECTORY is not provided,
+# it is assumed to be `libltdl'. LIBLTDL will be prefixed with
+# '${top_builddir}/' and LTDLINCL will be prefixed with '${top_srcdir}/'
+# (note the single quotes!). If your package is not flat and you're not
+# using automake, define top_builddir and top_srcdir appropriately in
+# the Makefiles.
+AC_DEFUN([AC_LIBLTDL_CONVENIENCE],
+[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+ case $enable_ltdl_convenience in
+ no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;;
+ "") enable_ltdl_convenience=yes
+ ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;;
+ esac
+ LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdlc.la
+ LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl'])
+ # For backwards non-gettext consistent compatibility...
+ INCLTDL="$LTDLINCL"
+])# AC_LIBLTDL_CONVENIENCE
+
+
+# AC_LIBLTDL_INSTALLABLE([DIRECTORY])
+# -----------------------------------
+# sets LIBLTDL to the link flags for the libltdl installable library and
+# LTDLINCL to the include flags for the libltdl header and adds
+# --enable-ltdl-install to the configure arguments. Note that
+# AC_CONFIG_SUBDIRS is not called here. If DIRECTORY is not provided,
+# and an installed libltdl is not found, it is assumed to be `libltdl'.
+# LIBLTDL will be prefixed with '${top_builddir}/'# and LTDLINCL with
+# '${top_srcdir}/' (note the single quotes!). If your package is not
+# flat and you're not using automake, define top_builddir and top_srcdir
+# appropriately in the Makefiles.
+# In the future, this macro may have to be called after AC_PROG_LIBTOOL.
+AC_DEFUN([AC_LIBLTDL_INSTALLABLE],
+[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+ AC_CHECK_LIB(ltdl, lt_dlinit,
+ [test x"$enable_ltdl_install" != xyes && enable_ltdl_install=no],
+ [if test x"$enable_ltdl_install" = xno; then
+ AC_MSG_WARN([libltdl not installed, but installation disabled])
+ else
+ enable_ltdl_install=yes
+ fi
+ ])
+ if test x"$enable_ltdl_install" = x"yes"; then
+ ac_configure_args="$ac_configure_args --enable-ltdl-install"
+ LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdl.la
+ LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl'])
+ else
+ ac_configure_args="$ac_configure_args --enable-ltdl-install=no"
+ LIBLTDL="-lltdl"
+ LTDLINCL=
+ fi
+ # For backwards non-gettext consistent compatibility...
+ INCLTDL="$LTDLINCL"
+])# AC_LIBLTDL_INSTALLABLE
+
+
+# AC_LIBTOOL_CXX
+# --------------
+# enable support for C++ libraries
+AC_DEFUN([AC_LIBTOOL_CXX],
+[AC_REQUIRE([_LT_AC_LANG_CXX])
+])# AC_LIBTOOL_CXX
+
+
+# _LT_AC_LANG_CXX
+# ---------------
+AC_DEFUN([_LT_AC_LANG_CXX],
+[AC_REQUIRE([AC_PROG_CXX])
+AC_REQUIRE([_LT_AC_PROG_CXXCPP])
+_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}CXX])
+])# _LT_AC_LANG_CXX
+
+# _LT_AC_PROG_CXXCPP
+# ------------------
+AC_DEFUN([_LT_AC_PROG_CXXCPP],
+[
+AC_REQUIRE([AC_PROG_CXX])
+if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
+ ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
+ (test "X$CXX" != "Xg++"))) ; then
+ AC_PROG_CXXCPP
+fi
+])# _LT_AC_PROG_CXXCPP
+
+# AC_LIBTOOL_F77
+# --------------
+# enable support for Fortran 77 libraries
+AC_DEFUN([AC_LIBTOOL_F77],
+[AC_REQUIRE([_LT_AC_LANG_F77])
+])# AC_LIBTOOL_F77
+
+
+# _LT_AC_LANG_F77
+# ---------------
+AC_DEFUN([_LT_AC_LANG_F77],
+[AC_REQUIRE([AC_PROG_F77])
+_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}F77])
+])# _LT_AC_LANG_F77
+
+
+# AC_LIBTOOL_GCJ
+# --------------
+# enable support for GCJ libraries
+AC_DEFUN([AC_LIBTOOL_GCJ],
+[AC_REQUIRE([_LT_AC_LANG_GCJ])
+])# AC_LIBTOOL_GCJ
+
+
+# _LT_AC_LANG_GCJ
+# ---------------
+AC_DEFUN([_LT_AC_LANG_GCJ],
+[AC_PROVIDE_IFELSE([AC_PROG_GCJ],[],
+ [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],[],
+ [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ],[],
+ [ifdef([AC_PROG_GCJ],[AC_REQUIRE([AC_PROG_GCJ])],
+ [ifdef([A][M_PROG_GCJ],[AC_REQUIRE([A][M_PROG_GCJ])],
+ [AC_REQUIRE([A][C_PROG_GCJ_OR_A][M_PROG_GCJ])])])])])])
+_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}GCJ])
+])# _LT_AC_LANG_GCJ
+
+
+# AC_LIBTOOL_RC
+# -------------
+# enable support for Windows resource files
+AC_DEFUN([AC_LIBTOOL_RC],
+[AC_REQUIRE([LT_AC_PROG_RC])
+_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}RC])
+])# AC_LIBTOOL_RC
+
+
+# AC_LIBTOOL_LANG_C_CONFIG
+# ------------------------
+# Ensure that the configuration vars for the C compiler are
+# suitably defined. Those variables are subsequently used by
+# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'.
+AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG], [_LT_AC_LANG_C_CONFIG])
+AC_DEFUN([_LT_AC_LANG_C_CONFIG],
+[lt_save_CC="$CC"
+AC_LANG_PUSH(C)
+
+# Source file extension for C test sources.
+ac_ext=c
+
+# Object file extension for compiled C test sources.
+objext=o
+_LT_AC_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(){return(0);}'
+
+_LT_AC_SYS_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+AC_LIBTOOL_PROG_COMPILER_NO_RTTI($1)
+AC_LIBTOOL_PROG_COMPILER_PIC($1)
+AC_LIBTOOL_PROG_CC_C_O($1)
+AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1)
+AC_LIBTOOL_PROG_LD_SHLIBS($1)
+AC_LIBTOOL_SYS_DYNAMIC_LINKER($1)
+AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1)
+AC_LIBTOOL_SYS_LIB_STRIP
+AC_LIBTOOL_DLOPEN_SELF
+
+# Report which library types will actually be built
+AC_MSG_CHECKING([if libtool supports shared libraries])
+AC_MSG_RESULT([$can_build_shared])
+
+AC_MSG_CHECKING([whether to build shared libraries])
+test "$can_build_shared" = "no" && enable_shared=no
+
+# On AIX, shared libraries and static libraries use the same namespace, and
+# are all built from PIC.
+case $host_os in
+aix3*)
+ test "$enable_shared" = yes && enable_static=no
+ if test -n "$RANLIB"; then
+ archive_cmds="$archive_cmds~\$RANLIB \$lib"
+ postinstall_cmds='$RANLIB $lib'
+ fi
+ ;;
+
+aix[[4-9]]*)
+ if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+ test "$enable_shared" = yes && enable_static=no
+ fi
+ ;;
+esac
+AC_MSG_RESULT([$enable_shared])
+
+AC_MSG_CHECKING([whether to build static libraries])
+# Make sure either enable_shared or enable_static is yes.
+test "$enable_shared" = yes || enable_static=yes
+AC_MSG_RESULT([$enable_static])
+
+AC_LIBTOOL_CONFIG($1)
+
+AC_LANG_POP
+CC="$lt_save_CC"
+])# AC_LIBTOOL_LANG_C_CONFIG
+
+
+# AC_LIBTOOL_LANG_CXX_CONFIG
+# --------------------------
+# Ensure that the configuration vars for the C compiler are
+# suitably defined. Those variables are subsequently used by
+# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'.
+AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG], [_LT_AC_LANG_CXX_CONFIG(CXX)])
+AC_DEFUN([_LT_AC_LANG_CXX_CONFIG],
+[AC_LANG_PUSH(C++)
+AC_REQUIRE([AC_PROG_CXX])
+AC_REQUIRE([_LT_AC_PROG_CXXCPP])
+
+_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_AC_TAGVAR(allow_undefined_flag, $1)=
+_LT_AC_TAGVAR(always_export_symbols, $1)=no
+_LT_AC_TAGVAR(archive_expsym_cmds, $1)=
+_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_AC_TAGVAR(hardcode_direct, $1)=no
+_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
+_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_AC_TAGVAR(hardcode_minus_L, $1)=no
+_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+_LT_AC_TAGVAR(hardcode_automatic, $1)=no
+_LT_AC_TAGVAR(module_cmds, $1)=
+_LT_AC_TAGVAR(module_expsym_cmds, $1)=
+_LT_AC_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_AC_TAGVAR(no_undefined_flag, $1)=
+_LT_AC_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Dependencies to place before and after the object being linked:
+_LT_AC_TAGVAR(predep_objects, $1)=
+_LT_AC_TAGVAR(postdep_objects, $1)=
+_LT_AC_TAGVAR(predeps, $1)=
+_LT_AC_TAGVAR(postdeps, $1)=
+_LT_AC_TAGVAR(compiler_lib_search_path, $1)=
+_LT_AC_TAGVAR(compiler_lib_search_dirs, $1)=
+
+# Source file extension for C++ test sources.
+ac_ext=cpp
+
+# Object file extension for compiled C++ test sources.
+objext=o
+_LT_AC_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }'
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_AC_SYS_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC=$CC
+lt_save_LD=$LD
+lt_save_GCC=$GCC
+GCC=$GXX
+lt_save_with_gnu_ld=$with_gnu_ld
+lt_save_path_LD=$lt_cv_path_LD
+if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
+ lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
+else
+ $as_unset lt_cv_prog_gnu_ld
+fi
+if test -n "${lt_cv_path_LDCXX+set}"; then
+ lt_cv_path_LD=$lt_cv_path_LDCXX
+else
+ $as_unset lt_cv_path_LD
+fi
+test -z "${LDCXX+set}" || LD=$LDCXX
+CC=${CXX-"c++"}
+compiler=$CC
+_LT_AC_TAGVAR(compiler, $1)=$CC
+_LT_CC_BASENAME([$compiler])
+
+# We don't want -fno-exception wen compiling C++ code, so set the
+# no_builtin_flag separately
+if test "$GXX" = yes; then
+ _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'
+else
+ _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
+fi
+
+if test "$GXX" = yes; then
+ # Set up default GNU C++ configuration
+
+ AC_PROG_LD
+
+ # Check if GNU C++ uses GNU ld as the underlying linker, since the
+ # archiving commands below assume that GNU ld is being used.
+ if test "$with_gnu_ld" = yes; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir'
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+
+ # If archive_cmds runs LD, not CC, wlarc should be empty
+ # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
+ # investigate it a little bit more. (MM)
+ wlarc='${wl}'
+
+ # ancient GNU ld didn't support --whole-archive et. al.
+ if eval "`$CC -print-prog-name=ld` --help 2>&1" | \
+ grep 'no-whole-archive' > /dev/null; then
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+ else
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=
+ fi
+ else
+ with_gnu_ld=no
+ wlarc=
+
+ # A generic and very simple default shared library creation
+ # command for GNU C++ for the case where it uses the native
+ # linker, instead of GNU ld. If possible, this setting should
+ # overridden to take advantage of the native linker features on
+ # the platform it is being used on.
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+ fi
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"'
+
+else
+ GXX=no
+ with_gnu_ld=no
+ wlarc=
+fi
+
+# PORTME: fill in a description of your system's C++ link characteristics
+AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
+_LT_AC_TAGVAR(ld_shlibs, $1)=yes
+case $host_os in
+ aix3*)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ aix[[4-9]]*)
+ if test "$host_cpu" = ia64; then
+ # On IA64, the linker does run time linking by default, so we don't
+ # have to do anything special.
+ aix_use_runtimelinking=no
+ exp_sym_flag='-Bexport'
+ no_entry_flag=""
+ else
+ aix_use_runtimelinking=no
+
+ # Test if we are trying to use run time linking or normal
+ # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+ # need to do runtime linking.
+ case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
+ for ld_flag in $LDFLAGS; do
+ case $ld_flag in
+ *-brtl*)
+ aix_use_runtimelinking=yes
+ break
+ ;;
+ esac
+ done
+ ;;
+ esac
+
+ exp_sym_flag='-bexport'
+ no_entry_flag='-bnoentry'
+ fi
+
+ # When large executables or shared objects are built, AIX ld can
+ # have problems creating the table of contents. If linking a library
+ # or program results in "error TOC overflow" add -mminimal-toc to
+ # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not
+ # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+ _LT_AC_TAGVAR(archive_cmds, $1)=''
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':'
+ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+
+ if test "$GXX" = yes; then
+ case $host_os in aix4.[[012]]|aix4.[[012]].*)
+ # We only want to do this on AIX 4.2 and lower, the check
+ # below for broken collect2 doesn't work under 4.3+
+ collect2name=`${CC} -print-prog-name=collect2`
+ if test -f "$collect2name" && \
+ strings "$collect2name" | grep resolve_lib_name >/dev/null
+ then
+ # We have reworked collect2
+ :
+ else
+ # We have old collect2
+ _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported
+ # It fails to find uninstalled libraries when the uninstalled
+ # path is not listed in the libpath. Setting hardcode_minus_L
+ # to unsupported forces relinking
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=
+ fi
+ ;;
+ esac
+ shared_flag='-shared'
+ if test "$aix_use_runtimelinking" = yes; then
+ shared_flag="$shared_flag "'${wl}-G'
+ fi
+ else
+ # not using gcc
+ if test "$host_cpu" = ia64; then
+ # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+ # chokes on -Wl,-G. The following line is correct:
+ shared_flag='-G'
+ else
+ if test "$aix_use_runtimelinking" = yes; then
+ shared_flag='${wl}-G'
+ else
+ shared_flag='${wl}-bM:SRE'
+ fi
+ fi
+ fi
+
+ # It seems that -bexpall does not export symbols beginning with
+ # underscore (_), so it is better to generate a list of symbols to export.
+ _LT_AC_TAGVAR(always_export_symbols, $1)=yes
+ if test "$aix_use_runtimelinking" = yes; then
+ # Warning - without using the other runtime loading flags (-brtl),
+ # -berok will link without error, but may produce a broken library.
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok'
+ # Determine the default libpath from the value encoded in an empty executable.
+ _LT_AC_SYS_LIBPATH_AIX
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+ else
+ if test "$host_cpu" = ia64; then
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+ else
+ # Determine the default libpath from the value encoded in an empty executable.
+ _LT_AC_SYS_LIBPATH_AIX
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+ # Warning - without using the other run time loading flags,
+ # -berok will link without error, but may produce a broken library.
+ _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
+ # Exported symbols can be pulled into shared objects from archives
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes
+ # This is similar to how AIX traditionally builds its shared libraries.
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+ fi
+ fi
+ ;;
+
+ beos*)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
+ # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+ # support --undefined. This deserves some investigation. FIXME
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ else
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+
+ chorus*)
+ case $cc_basename in
+ *)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ esac
+ ;;
+
+ cygwin* | mingw* | pw32*)
+ # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
+ # as there is no search path for DLLs.
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
+ _LT_AC_TAGVAR(always_export_symbols, $1)=no
+ _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+
+ if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+ # If the export-symbols file already is a .def file (1st line
+ # is EXPORTS), use it as is; otherwise, prepend...
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+ cp $export_symbols $output_objdir/$soname.def;
+ else
+ echo EXPORTS > $output_objdir/$soname.def;
+ cat $export_symbols >> $output_objdir/$soname.def;
+ fi~
+ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+ else
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+ darwin* | rhapsody*)
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+ _LT_AC_TAGVAR(hardcode_direct, $1)=no
+ _LT_AC_TAGVAR(hardcode_automatic, $1)=yes
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=''
+ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined"
+ if test "$GXX" = yes ; then
+ output_verbose_link_cmd='echo'
+ _LT_AC_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
+ _LT_AC_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
+ _LT_AC_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
+ if test "$lt_cv_apple_cc_single_mod" != "yes"; then
+ _LT_AC_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}"
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}"
+ fi
+ else
+ case $cc_basename in
+ xlc*)
+ output_verbose_link_cmd='echo'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $xlcverstring'
+ _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $xlcverstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ ;;
+ *)
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ esac
+ fi
+ ;;
+
+ dgux*)
+ case $cc_basename in
+ ec++*)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ ghcx*)
+ # Green Hills C++ Compiler
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ esac
+ ;;
+ freebsd[[12]]*)
+ # C++ shared libraries reported to be fairly broken before switch to ELF
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ freebsd-elf*)
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+ ;;
+ freebsd* | dragonfly*)
+ # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
+ # conventions
+ _LT_AC_TAGVAR(ld_shlibs, $1)=yes
+ ;;
+ gnu*)
+ ;;
+ hpux9*)
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
+ # but as the default
+ # location of the library.
+
+ case $cc_basename in
+ CC*)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ aCC*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "[[-]]L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+ ;;
+ *)
+ if test "$GXX" = yes; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+ else
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+ esac
+ ;;
+ hpux10*|hpux11*)
+ if test $with_gnu_ld = no; then
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+
+ case $host_cpu in
+ hppa*64*|ia64*) ;;
+ *)
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+ ;;
+ esac
+ fi
+ case $host_cpu in
+ hppa*64*|ia64*)
+ _LT_AC_TAGVAR(hardcode_direct, $1)=no
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+ *)
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
+ # but as the default
+ # location of the library.
+ ;;
+ esac
+
+ case $cc_basename in
+ CC*)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ aCC*)
+ case $host_cpu in
+ hppa*64*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ ia64*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ *)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ esac
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+ ;;
+ *)
+ if test "$GXX" = yes; then
+ if test $with_gnu_ld = no; then
+ case $host_cpu in
+ hppa*64*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ ia64*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ *)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ esac
+ fi
+ else
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+ esac
+ ;;
+ interix[[3-9]]*)
+ _LT_AC_TAGVAR(hardcode_direct, $1)=no
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+ # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+ # Instead, shared libraries are loaded at an image base (0x10000000 by
+ # default) and relocated if they conflict, which is a slow very memory
+ # consuming and fragmenting process. To avoid this, we pick a random,
+ # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+ # time. Moving up from 0x10000000 also allows more sbrk(2) space.
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+ ;;
+ irix5* | irix6*)
+ case $cc_basename in
+ CC*)
+ # SGI C++
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+
+ # Archives containing C++ object files must be created using
+ # "CC -ar", where "CC" is the IRIX C++ compiler. This is
+ # necessary to make sure instantiated templates are included
+ # in the archive.
+ _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs'
+ ;;
+ *)
+ if test "$GXX" = yes; then
+ if test "$with_gnu_ld" = no; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ else
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib'
+ fi
+ fi
+ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+ ;;
+ esac
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+ ;;
+ linux* | k*bsd*-gnu)
+ case $cc_basename in
+ KCC*)
+ # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+ # KCC will only create a shared library if the output file
+ # ends with ".so" (or ".sl" for HP-UX), so rename the library
+ # to its proper name (with version) after linking.
+ _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib'
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | grep "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath,$libdir'
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+
+ # Archives containing C++ object files must be created using
+ # "CC -Bstatic", where "CC" is the KAI C++ compiler.
+ _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs'
+ ;;
+ icpc*)
+ # Intel C++
+ with_gnu_ld=yes
+ # version 8.0 and above of icpc choke on multiply defined symbols
+ # if we add $predep_objects and $postdep_objects, however 7.1 and
+ # earlier do not add the objects themselves.
+ case `$CC -V 2>&1` in
+ *"Version 7."*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ ;;
+ *) # Version 8.0 or newer
+ tmp_idyn=
+ case $host_cpu in
+ ia64*) tmp_idyn=' -i_dynamic';;
+ esac
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ ;;
+ esac
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+ ;;
+ pgCC* | pgcpp*)
+ # Portland Group C++ compiler
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir'
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
+ ;;
+ cxx*)
+ # Compaq C++
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols'
+
+ runpath_var=LD_RUN_PATH
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+ ;;
+ *)
+ case `$CC -V 2>&1 | sed 5q` in
+ *Sun\ C*)
+ # Sun C++ 5.9
+ _LT_AC_TAGVAR(no_undefined_flag, $1)=' -zdefs'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
+
+ # Not sure whether something based on
+ # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1
+ # would be better.
+ output_verbose_link_cmd='echo'
+
+ # Archives containing C++ object files must be created using
+ # "CC -xar", where "CC" is the Sun C++ compiler. This is
+ # necessary to make sure instantiated templates are included
+ # in the archive.
+ _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ lynxos*)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ m88k*)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ mvs*)
+ case $cc_basename in
+ cxx*)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ esac
+ ;;
+ netbsd*)
+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
+ wlarc=
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ fi
+ # Workaround some broken pre-1.5 toolchains
+ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"'
+ ;;
+ openbsd2*)
+ # C++ shared libraries are fairly broken
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ openbsd*)
+ if test -f /usr/libexec/ld.so; then
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib'
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+ fi
+ output_verbose_link_cmd='echo'
+ else
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+ osf3*)
+ case $cc_basename in
+ KCC*)
+ # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+ # KCC will only create a shared library if the output file
+ # ends with ".so" (or ".sl" for HP-UX), so rename the library
+ # to its proper name (with version) after linking.
+ _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+
+ # Archives containing C++ object files must be created using
+ # "CC -Bstatic", where "CC" is the KAI C++ compiler.
+ _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs'
+
+ ;;
+ RCC*)
+ # Rational C++ 2.4.1
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ cxx*)
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+ ;;
+ *)
+ if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"'
+
+ else
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+ esac
+ ;;
+ osf4* | osf5*)
+ case $cc_basename in
+ KCC*)
+ # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+ # KCC will only create a shared library if the output file
+ # ends with ".so" (or ".sl" for HP-UX), so rename the library
+ # to its proper name (with version) after linking.
+ _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+
+ # Archives containing C++ object files must be created using
+ # the KAI C++ compiler.
+ _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs'
+ ;;
+ RCC*)
+ # Rational C++ 2.4.1
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ cxx*)
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
+ echo "-hidden">> $lib.exp~
+ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~
+ $rm $lib.exp'
+
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+ ;;
+ *)
+ if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"'
+
+ else
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+ esac
+ ;;
+ psos*)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ sunos4*)
+ case $cc_basename in
+ CC*)
+ # Sun C++ 4.x
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ lcc*)
+ # Lucid
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ esac
+ ;;
+ solaris*)
+ case $cc_basename in
+ CC*)
+ # Sun C++ 4.2, 5.x and Centerline C++
+ _LT_AC_TAGVAR(archive_cmds_need_lc,$1)=yes
+ _LT_AC_TAGVAR(no_undefined_flag, $1)=' -zdefs'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+ $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp'
+
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ case $host_os in
+ solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+ *)
+ # The compiler driver will combine and reorder linker options,
+ # but understands `-z linker_flag'.
+ # Supported since Solaris 2.6 (maybe 2.5.1?)
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
+ ;;
+ esac
+ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+
+ output_verbose_link_cmd='echo'
+
+ # Archives containing C++ object files must be created using
+ # "CC -xar", where "CC" is the Sun C++ compiler. This is
+ # necessary to make sure instantiated templates are included
+ # in the archive.
+ _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
+ ;;
+ gcx*)
+ # Green Hills C++ Compiler
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+
+ # The C++ compiler must be used to create the archive.
+ _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
+ ;;
+ *)
+ # GNU C++ compiler with Solaris linker
+ if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+ _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs'
+ if $CC --version | grep -v '^2\.7' > /dev/null; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+ $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp'
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ output_verbose_link_cmd="$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\""
+ else
+ # g++ 2.7 appears to require `-G' NOT `-shared' on this
+ # platform.
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp'
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ output_verbose_link_cmd="$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\""
+ fi
+
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir'
+ case $host_os in
+ solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+ *)
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+ ;;
+ esac
+ fi
+ ;;
+ esac
+ ;;
+ sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
+ _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ runpath_var='LD_RUN_PATH'
+
+ case $cc_basename in
+ CC*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ esac
+ ;;
+ sysv5* | sco3.2v5* | sco5v6*)
+ # Note: We can NOT use -z defs as we might desire, because we do not
+ # link with -lc, and that would cause any symbols used from libc to
+ # always be unresolved, which means just about no library would
+ # ever link correctly. If we're not using GNU ld we use -z text
+ # though, which does catch some bad symbols but isn't as heavy-handed
+ # as -z defs.
+ # For security reasons, it is highly recommended that you always
+ # use absolute paths for naming shared libraries, and exclude the
+ # DT_RUNPATH tag from executables and libraries. But doing so
+ # requires that you compile everything twice, which is a pain.
+ # So that behaviour is only enabled if SCOABSPATH is set to a
+ # non-empty value in the environment. Most likely only useful for
+ # creating official distributions of packages.
+ # This is a hack until libtool officially supports absolute path
+ # names for shared libraries.
+ _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':'
+ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
+ runpath_var='LD_RUN_PATH'
+
+ case $cc_basename in
+ CC*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ esac
+ ;;
+ tandem*)
+ case $cc_basename in
+ NCC*)
+ # NonStop-UX NCC 3.20
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ esac
+ ;;
+ vxworks*)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+esac
+AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)])
+test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
+
+_LT_AC_TAGVAR(GCC, $1)="$GXX"
+_LT_AC_TAGVAR(LD, $1)="$LD"
+
+AC_LIBTOOL_POSTDEP_PREDEP($1)
+AC_LIBTOOL_PROG_COMPILER_PIC($1)
+AC_LIBTOOL_PROG_CC_C_O($1)
+AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1)
+AC_LIBTOOL_PROG_LD_SHLIBS($1)
+AC_LIBTOOL_SYS_DYNAMIC_LINKER($1)
+AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1)
+
+AC_LIBTOOL_CONFIG($1)
+
+AC_LANG_POP
+CC=$lt_save_CC
+LDCXX=$LD
+LD=$lt_save_LD
+GCC=$lt_save_GCC
+with_gnu_ldcxx=$with_gnu_ld
+with_gnu_ld=$lt_save_with_gnu_ld
+lt_cv_path_LDCXX=$lt_cv_path_LD
+lt_cv_path_LD=$lt_save_path_LD
+lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
+lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
+])# AC_LIBTOOL_LANG_CXX_CONFIG
+
+# AC_LIBTOOL_POSTDEP_PREDEP([TAGNAME])
+# ------------------------------------
+# Figure out "hidden" library dependencies from verbose
+# compiler output when linking a shared library.
+# Parse the compiler output and extract the necessary
+# objects, libraries and library flags.
+AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP],
+[AC_REQUIRE([LT_AC_PROG_SED])dnl
+dnl we can't use the lt_simple_compile_test_code here,
+dnl because it contains code intended for an executable,
+dnl not a library. It's possible we should let each
+dnl tag define a new lt_????_link_test_code variable,
+dnl but it's only used here...
+ifelse([$1],[],[cat > conftest.$ac_ext <<EOF
+int a;
+void foo (void) { a = 0; }
+EOF
+],[$1],[CXX],[cat > conftest.$ac_ext <<EOF
+class Foo
+{
+public:
+ Foo (void) { a = 0; }
+private:
+ int a;
+};
+EOF
+],[$1],[F77],[cat > conftest.$ac_ext <<EOF
+ subroutine foo
+ implicit none
+ integer*4 a
+ a=0
+ return
+ end
+EOF
+],[$1],[GCJ],[cat > conftest.$ac_ext <<EOF
+public class foo {
+ private int a;
+ public void bar (void) {
+ a = 0;
+ }
+};
+EOF
+])
+dnl Parse the compiler output and extract the necessary
+dnl objects, libraries and library flags.
+if AC_TRY_EVAL(ac_compile); then
+ # Parse the compiler output and extract the necessary
+ # objects, libraries and library flags.
+
+ # Sentinel used to keep track of whether or not we are before
+ # the conftest object file.
+ pre_test_object_deps_done=no
+
+ # The `*' in the case matches for architectures that use `case' in
+ # $output_verbose_cmd can trigger glob expansion during the loop
+ # eval without this substitution.
+ output_verbose_link_cmd=`$echo "X$output_verbose_link_cmd" | $Xsed -e "$no_glob_subst"`
+
+ for p in `eval $output_verbose_link_cmd`; do
+ case $p in
+
+ -L* | -R* | -l*)
+ # Some compilers place space between "-{L,R}" and the path.
+ # Remove the space.
+ if test $p = "-L" \
+ || test $p = "-R"; then
+ prev=$p
+ continue
+ else
+ prev=
+ fi
+
+ if test "$pre_test_object_deps_done" = no; then
+ case $p in
+ -L* | -R*)
+ # Internal compiler library paths should come after those
+ # provided the user. The postdeps already come after the
+ # user supplied libs so there is no need to process them.
+ if test -z "$_LT_AC_TAGVAR(compiler_lib_search_path, $1)"; then
+ _LT_AC_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}"
+ else
+ _LT_AC_TAGVAR(compiler_lib_search_path, $1)="${_LT_AC_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}"
+ fi
+ ;;
+ # The "-l" case would never come before the object being
+ # linked, so don't bother handling this case.
+ esac
+ else
+ if test -z "$_LT_AC_TAGVAR(postdeps, $1)"; then
+ _LT_AC_TAGVAR(postdeps, $1)="${prev}${p}"
+ else
+ _LT_AC_TAGVAR(postdeps, $1)="${_LT_AC_TAGVAR(postdeps, $1)} ${prev}${p}"
+ fi
+ fi
+ ;;
+
+ *.$objext)
+ # This assumes that the test object file only shows up
+ # once in the compiler output.
+ if test "$p" = "conftest.$objext"; then
+ pre_test_object_deps_done=yes
+ continue
+ fi
+
+ if test "$pre_test_object_deps_done" = no; then
+ if test -z "$_LT_AC_TAGVAR(predep_objects, $1)"; then
+ _LT_AC_TAGVAR(predep_objects, $1)="$p"
+ else
+ _LT_AC_TAGVAR(predep_objects, $1)="$_LT_AC_TAGVAR(predep_objects, $1) $p"
+ fi
+ else
+ if test -z "$_LT_AC_TAGVAR(postdep_objects, $1)"; then
+ _LT_AC_TAGVAR(postdep_objects, $1)="$p"
+ else
+ _LT_AC_TAGVAR(postdep_objects, $1)="$_LT_AC_TAGVAR(postdep_objects, $1) $p"
+ fi
+ fi
+ ;;
+
+ *) ;; # Ignore the rest.
+
+ esac
+ done
+
+ # Clean up.
+ rm -f a.out a.exe
+else
+ echo "libtool.m4: error: problem compiling $1 test program"
+fi
+
+$rm -f confest.$objext
+
+_LT_AC_TAGVAR(compiler_lib_search_dirs, $1)=
+if test -n "$_LT_AC_TAGVAR(compiler_lib_search_path, $1)"; then
+ _LT_AC_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_AC_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'`
+fi
+
+# PORTME: override above test on systems where it is broken
+ifelse([$1],[CXX],
+[case $host_os in
+interix[[3-9]]*)
+ # Interix 3.5 installs completely hosed .la files for C++, so rather than
+ # hack all around it, let's just trust "g++" to DTRT.
+ _LT_AC_TAGVAR(predep_objects,$1)=
+ _LT_AC_TAGVAR(postdep_objects,$1)=
+ _LT_AC_TAGVAR(postdeps,$1)=
+ ;;
+
+linux*)
+ case `$CC -V 2>&1 | sed 5q` in
+ *Sun\ C*)
+ # Sun C++ 5.9
+ #
+ # The more standards-conforming stlport4 library is
+ # incompatible with the Cstd library. Avoid specifying
+ # it if it's in CXXFLAGS. Ignore libCrun as
+ # -library=stlport4 depends on it.
+ case " $CXX $CXXFLAGS " in
+ *" -library=stlport4 "*)
+ solaris_use_stlport4=yes
+ ;;
+ esac
+ if test "$solaris_use_stlport4" != yes; then
+ _LT_AC_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'
+ fi
+ ;;
+ esac
+ ;;
+
+solaris*)
+ case $cc_basename in
+ CC*)
+ # The more standards-conforming stlport4 library is
+ # incompatible with the Cstd library. Avoid specifying
+ # it if it's in CXXFLAGS. Ignore libCrun as
+ # -library=stlport4 depends on it.
+ case " $CXX $CXXFLAGS " in
+ *" -library=stlport4 "*)
+ solaris_use_stlport4=yes
+ ;;
+ esac
+
+ # Adding this requires a known-good setup of shared libraries for
+ # Sun compiler versions before 5.6, else PIC objects from an old
+ # archive will be linked into the output, leading to subtle bugs.
+ if test "$solaris_use_stlport4" != yes; then
+ _LT_AC_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'
+ fi
+ ;;
+ esac
+ ;;
+esac
+])
+case " $_LT_AC_TAGVAR(postdeps, $1) " in
+*" -lc "*) _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no ;;
+esac
+])# AC_LIBTOOL_POSTDEP_PREDEP
+
+# AC_LIBTOOL_LANG_F77_CONFIG
+# --------------------------
+# Ensure that the configuration vars for the C compiler are
+# suitably defined. Those variables are subsequently used by
+# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'.
+AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG], [_LT_AC_LANG_F77_CONFIG(F77)])
+AC_DEFUN([_LT_AC_LANG_F77_CONFIG],
+[AC_REQUIRE([AC_PROG_F77])
+AC_LANG_PUSH(Fortran 77)
+
+_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_AC_TAGVAR(allow_undefined_flag, $1)=
+_LT_AC_TAGVAR(always_export_symbols, $1)=no
+_LT_AC_TAGVAR(archive_expsym_cmds, $1)=
+_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_AC_TAGVAR(hardcode_direct, $1)=no
+_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
+_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_AC_TAGVAR(hardcode_minus_L, $1)=no
+_LT_AC_TAGVAR(hardcode_automatic, $1)=no
+_LT_AC_TAGVAR(module_cmds, $1)=
+_LT_AC_TAGVAR(module_expsym_cmds, $1)=
+_LT_AC_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_AC_TAGVAR(no_undefined_flag, $1)=
+_LT_AC_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Source file extension for f77 test sources.
+ac_ext=f
+
+# Object file extension for compiled f77 test sources.
+objext=o
+_LT_AC_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="\
+ subroutine t
+ return
+ end
+"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code="\
+ program t
+ end
+"
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_AC_SYS_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC="$CC"
+CC=${F77-"f77"}
+compiler=$CC
+_LT_AC_TAGVAR(compiler, $1)=$CC
+_LT_CC_BASENAME([$compiler])
+
+AC_MSG_CHECKING([if libtool supports shared libraries])
+AC_MSG_RESULT([$can_build_shared])
+
+AC_MSG_CHECKING([whether to build shared libraries])
+test "$can_build_shared" = "no" && enable_shared=no
+
+# On AIX, shared libraries and static libraries use the same namespace, and
+# are all built from PIC.
+case $host_os in
+aix3*)
+ test "$enable_shared" = yes && enable_static=no
+ if test -n "$RANLIB"; then
+ archive_cmds="$archive_cmds~\$RANLIB \$lib"
+ postinstall_cmds='$RANLIB $lib'
+ fi
+ ;;
+aix[[4-9]]*)
+ if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+ test "$enable_shared" = yes && enable_static=no
+ fi
+ ;;
+esac
+AC_MSG_RESULT([$enable_shared])
+
+AC_MSG_CHECKING([whether to build static libraries])
+# Make sure either enable_shared or enable_static is yes.
+test "$enable_shared" = yes || enable_static=yes
+AC_MSG_RESULT([$enable_static])
+
+_LT_AC_TAGVAR(GCC, $1)="$G77"
+_LT_AC_TAGVAR(LD, $1)="$LD"
+
+AC_LIBTOOL_PROG_COMPILER_PIC($1)
+AC_LIBTOOL_PROG_CC_C_O($1)
+AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1)
+AC_LIBTOOL_PROG_LD_SHLIBS($1)
+AC_LIBTOOL_SYS_DYNAMIC_LINKER($1)
+AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1)
+
+AC_LIBTOOL_CONFIG($1)
+
+AC_LANG_POP
+CC="$lt_save_CC"
+])# AC_LIBTOOL_LANG_F77_CONFIG
+
+
+# AC_LIBTOOL_LANG_GCJ_CONFIG
+# --------------------------
+# Ensure that the configuration vars for the C compiler are
+# suitably defined. Those variables are subsequently used by
+# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'.
+AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG], [_LT_AC_LANG_GCJ_CONFIG(GCJ)])
+AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG],
+[AC_LANG_SAVE
+
+# Source file extension for Java test sources.
+ac_ext=java
+
+# Object file extension for compiled Java test sources.
+objext=o
+_LT_AC_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="class foo {}"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }'
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_AC_SYS_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC="$CC"
+CC=${GCJ-"gcj"}
+compiler=$CC
+_LT_AC_TAGVAR(compiler, $1)=$CC
+_LT_CC_BASENAME([$compiler])
+
+# GCJ did not exist at the time GCC didn't implicitly link libc in.
+_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+
+_LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+
+AC_LIBTOOL_PROG_COMPILER_NO_RTTI($1)
+AC_LIBTOOL_PROG_COMPILER_PIC($1)
+AC_LIBTOOL_PROG_CC_C_O($1)
+AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1)
+AC_LIBTOOL_PROG_LD_SHLIBS($1)
+AC_LIBTOOL_SYS_DYNAMIC_LINKER($1)
+AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1)
+
+AC_LIBTOOL_CONFIG($1)
+
+AC_LANG_RESTORE
+CC="$lt_save_CC"
+])# AC_LIBTOOL_LANG_GCJ_CONFIG
+
+
+# AC_LIBTOOL_LANG_RC_CONFIG
+# -------------------------
+# Ensure that the configuration vars for the Windows resource compiler are
+# suitably defined. Those variables are subsequently used by
+# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'.
+AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG], [_LT_AC_LANG_RC_CONFIG(RC)])
+AC_DEFUN([_LT_AC_LANG_RC_CONFIG],
+[AC_LANG_SAVE
+
+# Source file extension for RC test sources.
+ac_ext=rc
+
+# Object file extension for compiled RC test sources.
+objext=o
+_LT_AC_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }'
+
+# Code to be used in simple link tests
+lt_simple_link_test_code="$lt_simple_compile_test_code"
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_AC_SYS_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC="$CC"
+CC=${RC-"windres"}
+compiler=$CC
+_LT_AC_TAGVAR(compiler, $1)=$CC
+_LT_CC_BASENAME([$compiler])
+_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
+
+AC_LIBTOOL_CONFIG($1)
+
+AC_LANG_RESTORE
+CC="$lt_save_CC"
+])# AC_LIBTOOL_LANG_RC_CONFIG
+
+
+# AC_LIBTOOL_CONFIG([TAGNAME])
+# ----------------------------
+# If TAGNAME is not passed, then create an initial libtool script
+# with a default configuration from the untagged config vars. Otherwise
+# add code to config.status for appending the configuration named by
+# TAGNAME from the matching tagged config vars.
+AC_DEFUN([AC_LIBTOOL_CONFIG],
+[# The else clause should only fire when bootstrapping the
+# libtool distribution, otherwise you forgot to ship ltmain.sh
+# with your package, and you will get complaints that there are
+# no rules to generate ltmain.sh.
+if test -f "$ltmain"; then
+ # See if we are running on zsh, and set the options which allow our commands through
+ # without removal of \ escapes.
+ if test -n "${ZSH_VERSION+set}" ; then
+ setopt NO_GLOB_SUBST
+ fi
+ # Now quote all the things that may contain metacharacters while being
+ # careful not to overquote the AC_SUBSTed values. We take copies of the
+ # variables and quote the copies for generation of the libtool script.
+ for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \
+ SED SHELL STRIP \
+ libname_spec library_names_spec soname_spec extract_expsyms_cmds \
+ old_striplib striplib file_magic_cmd finish_cmds finish_eval \
+ deplibs_check_method reload_flag reload_cmds need_locks \
+ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \
+ lt_cv_sys_global_symbol_to_c_name_address \
+ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \
+ old_postinstall_cmds old_postuninstall_cmds \
+ _LT_AC_TAGVAR(compiler, $1) \
+ _LT_AC_TAGVAR(CC, $1) \
+ _LT_AC_TAGVAR(LD, $1) \
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1) \
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1) \
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1) \
+ _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) \
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1) \
+ _LT_AC_TAGVAR(thread_safe_flag_spec, $1) \
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1) \
+ _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1) \
+ _LT_AC_TAGVAR(old_archive_cmds, $1) \
+ _LT_AC_TAGVAR(old_archive_from_new_cmds, $1) \
+ _LT_AC_TAGVAR(predep_objects, $1) \
+ _LT_AC_TAGVAR(postdep_objects, $1) \
+ _LT_AC_TAGVAR(predeps, $1) \
+ _LT_AC_TAGVAR(postdeps, $1) \
+ _LT_AC_TAGVAR(compiler_lib_search_path, $1) \
+ _LT_AC_TAGVAR(compiler_lib_search_dirs, $1) \
+ _LT_AC_TAGVAR(archive_cmds, $1) \
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1) \
+ _LT_AC_TAGVAR(postinstall_cmds, $1) \
+ _LT_AC_TAGVAR(postuninstall_cmds, $1) \
+ _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) \
+ _LT_AC_TAGVAR(allow_undefined_flag, $1) \
+ _LT_AC_TAGVAR(no_undefined_flag, $1) \
+ _LT_AC_TAGVAR(export_symbols_cmds, $1) \
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) \
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1) \
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1) \
+ _LT_AC_TAGVAR(hardcode_automatic, $1) \
+ _LT_AC_TAGVAR(module_cmds, $1) \
+ _LT_AC_TAGVAR(module_expsym_cmds, $1) \
+ _LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1) \
+ _LT_AC_TAGVAR(fix_srcfile_path, $1) \
+ _LT_AC_TAGVAR(exclude_expsyms, $1) \
+ _LT_AC_TAGVAR(include_expsyms, $1); do
+
+ case $var in
+ _LT_AC_TAGVAR(old_archive_cmds, $1) | \
+ _LT_AC_TAGVAR(old_archive_from_new_cmds, $1) | \
+ _LT_AC_TAGVAR(archive_cmds, $1) | \
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1) | \
+ _LT_AC_TAGVAR(module_cmds, $1) | \
+ _LT_AC_TAGVAR(module_expsym_cmds, $1) | \
+ _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) | \
+ _LT_AC_TAGVAR(export_symbols_cmds, $1) | \
+ extract_expsyms_cmds | reload_cmds | finish_cmds | \
+ postinstall_cmds | postuninstall_cmds | \
+ old_postinstall_cmds | old_postuninstall_cmds | \
+ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec)
+ # Double-quote double-evaled strings.
+ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\""
+ ;;
+ *)
+ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\""
+ ;;
+ esac
+ done
+
+ case $lt_echo in
+ *'\[$]0 --fallback-echo"')
+ lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\[$]0 --fallback-echo"[$]/[$]0 --fallback-echo"/'`
+ ;;
+ esac
+
+ifelse([$1], [],
+ [cfgfile="${ofile}T"
+ trap "$rm \"$cfgfile\"; exit 1" 1 2 15
+ $rm -f "$cfgfile"
+ AC_MSG_NOTICE([creating $ofile])],
+ [cfgfile="$ofile"])
+
+ cat <<__EOF__ >> "$cfgfile"
+ifelse([$1], [],
+[#! $SHELL
+
+# `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
+# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP)
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+#
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
+# Free Software Foundation, Inc.
+#
+# This file is part of GNU Libtool:
+# Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# A sed program that does not truncate output.
+SED=$lt_SED
+
+# Sed that helps us avoid accidentally triggering echo(1) options like -n.
+Xsed="$SED -e 1s/^X//"
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+# The names of the tagged configurations supported by this script.
+available_tags=
+
+# ### BEGIN LIBTOOL CONFIG],
+[# ### BEGIN LIBTOOL TAG CONFIG: $tagname])
+
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)
+
+# Whether or not to disallow shared libs when runtime libs are static
+allow_libtool_libs_with_static_runtimes=$_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# The host system.
+host_alias=$host_alias
+host=$host
+host_os=$host_os
+
+# The build system.
+build_alias=$build_alias
+build=$build
+build_os=$build_os
+
+# An echo program that does not interpret backslashes.
+echo=$lt_echo
+
+# The archiver.
+AR=$lt_AR
+AR_FLAGS=$lt_AR_FLAGS
+
+# A C compiler.
+LTCC=$lt_LTCC
+
+# LTCC compiler flags.
+LTCFLAGS=$lt_LTCFLAGS
+
+# A language-specific compiler.
+CC=$lt_[]_LT_AC_TAGVAR(compiler, $1)
+
+# Is the compiler the GNU C compiler?
+with_gcc=$_LT_AC_TAGVAR(GCC, $1)
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# The linker used to build libraries.
+LD=$lt_[]_LT_AC_TAGVAR(LD, $1)
+
+# Whether we need hard or soft links.
+LN_S=$lt_LN_S
+
+# A BSD-compatible nm program.
+NM=$lt_NM
+
+# A symbol stripping program
+STRIP=$lt_STRIP
+
+# Used to examine libraries when file_magic_cmd begins "file"
+MAGIC_CMD=$MAGIC_CMD
+
+# Used on cygwin: DLL creation program.
+DLLTOOL="$DLLTOOL"
+
+# Used on cygwin: object dumper.
+OBJDUMP="$OBJDUMP"
+
+# Used on cygwin: assembler.
+AS="$AS"
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# How to pass a linker flag through the compiler.
+wl=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)
+
+# Object file suffix (normally "o").
+objext="$ac_objext"
+
+# Old archive suffix (normally "a").
+libext="$libext"
+
+# Shared library suffix (normally ".so").
+shrext_cmds='$shrext_cmds'
+
+# Executable file suffix (normally "").
+exeext="$exeext"
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)
+pic_mode=$pic_mode
+
+# What is the maximum length of a command?
+max_cmd_len=$lt_cv_sys_max_cmd_len
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_[]_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)
+
+# Must we lock files when doing compilation?
+need_locks=$lt_need_locks
+
+# Do we need the lib prefix for modules?
+need_lib_prefix=$need_lib_prefix
+
+# Do we need a version for libraries?
+need_version=$need_version
+
+# Whether dlopen is supported.
+dlopen_support=$enable_dlopen
+
+# Whether dlopen of programs is supported.
+dlopen_self=$enable_dlopen_self
+
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=$enable_dlopen_self_static
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_static, $1)
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_[]_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_[]_LT_AC_TAGVAR(whole_archive_flag_spec, $1)
+
+# Compiler flag to generate thread-safe objects.
+thread_safe_flag_spec=$lt_[]_LT_AC_TAGVAR(thread_safe_flag_spec, $1)
+
+# Library versioning type.
+version_type=$version_type
+
+# Format of library name prefix.
+libname_spec=$lt_libname_spec
+
+# List of archive names. First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME.
+library_names_spec=$lt_library_names_spec
+
+# The coded name of the library, if different from the real name.
+soname_spec=$lt_soname_spec
+
+# Commands used to build and install an old-style archive.
+RANLIB=$lt_RANLIB
+old_archive_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_cmds, $1)
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_new_cmds, $1)
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1)
+
+# Commands used to build and install a shared archive.
+archive_cmds=$lt_[]_LT_AC_TAGVAR(archive_cmds, $1)
+archive_expsym_cmds=$lt_[]_LT_AC_TAGVAR(archive_expsym_cmds, $1)
+postinstall_cmds=$lt_postinstall_cmds
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to build a loadable module (assumed same as above if empty)
+module_cmds=$lt_[]_LT_AC_TAGVAR(module_cmds, $1)
+module_expsym_cmds=$lt_[]_LT_AC_TAGVAR(module_expsym_cmds, $1)
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predep_objects=$lt_[]_LT_AC_TAGVAR(predep_objects, $1)
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdep_objects=$lt_[]_LT_AC_TAGVAR(postdep_objects, $1)
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predeps=$lt_[]_LT_AC_TAGVAR(predeps, $1)
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdeps=$lt_[]_LT_AC_TAGVAR(postdeps, $1)
+
+# The directories searched by this compiler when creating a shared
+# library
+compiler_lib_search_dirs=$lt_[]_LT_AC_TAGVAR(compiler_lib_search_dirs, $1)
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_[]_LT_AC_TAGVAR(compiler_lib_search_path, $1)
+
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method=$lt_deplibs_check_method
+
+# Command to use when deplibs_check_method == file_magic.
+file_magic_cmd=$lt_file_magic_cmd
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_[]_LT_AC_TAGVAR(allow_undefined_flag, $1)
+
+# Flag that forces no undefined symbols.
+no_undefined_flag=$lt_[]_LT_AC_TAGVAR(no_undefined_flag, $1)
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# Same as above, but a single script fragment to be evaled but not shown.
+finish_eval=$lt_finish_eval
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
+
+# Transform the output of nm in a proper C declaration
+global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
+
+# Transform the output of nm in a C name address pair
+global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
+
+# This is the shared library runtime path variable.
+runpath_var=$runpath_var
+
+# This is the shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$_LT_AC_TAGVAR(hardcode_action, $1)
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist.
+hardcode_libdir_flag_spec=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)
+
+# If ld is used when linking, flag to hardcode \$libdir into
+# a binary during linking. This must work even if \$libdir does
+# not exist.
+hardcode_libdir_flag_spec_ld=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)
+
+# Whether we need a single -rpath flag with a separated argument.
+hardcode_libdir_separator=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_separator, $1)
+
+# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the
+# resulting binary.
+hardcode_direct=$_LT_AC_TAGVAR(hardcode_direct, $1)
+
+# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
+# resulting binary.
+hardcode_minus_L=$_LT_AC_TAGVAR(hardcode_minus_L, $1)
+
+# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into
+# the resulting binary.
+hardcode_shlibpath_var=$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)
+
+# Set to yes if building a shared library automatically hardcodes DIR into the library
+# and all subsequent libraries and executables linked against it.
+hardcode_automatic=$_LT_AC_TAGVAR(hardcode_automatic, $1)
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at relink time.
+variables_saved_for_relink="$variables_saved_for_relink"
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$_LT_AC_TAGVAR(link_all_deplibs, $1)
+
+# Compile-time system search path for libraries
+sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
+
+# Run-time system search path for libraries
+sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
+
+# Fix the shell variable \$srcfile for the compiler.
+fix_srcfile_path=$lt_fix_srcfile_path
+
+# Set to yes if exported symbols are required.
+always_export_symbols=$_LT_AC_TAGVAR(always_export_symbols, $1)
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_[]_LT_AC_TAGVAR(export_symbols_cmds, $1)
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_[]_LT_AC_TAGVAR(exclude_expsyms, $1)
+
+# Symbols that must always be exported.
+include_expsyms=$lt_[]_LT_AC_TAGVAR(include_expsyms, $1)
+
+ifelse([$1],[],
+[# ### END LIBTOOL CONFIG],
+[# ### END LIBTOOL TAG CONFIG: $tagname])
+
+__EOF__
+
+ifelse([$1],[], [
+ case $host_os in
+ aix3*)
+ cat <<\EOF >> "$cfgfile"
+
+# AIX sometimes has problems with the GCC collect2 program. For some
+# reason, if we set the COLLECT_NAMES environment variable, the problems
+# vanish in a puff of smoke.
+if test "X${COLLECT_NAMES+set}" != Xset; then
+ COLLECT_NAMES=
+ export COLLECT_NAMES
+fi
+EOF
+ ;;
+ esac
+
+ # We use sed instead of cat because bash on DJGPP gets confused if
+ # if finds mixed CR/LF and LF-only lines. Since sed operates in
+ # text mode, it properly converts lines to CR/LF. This bash problem
+ # is reportedly fixed, but why not run on old versions too?
+ sed '$q' "$ltmain" >> "$cfgfile" || (rm -f "$cfgfile"; exit 1)
+
+ mv -f "$cfgfile" "$ofile" || \
+ (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
+ chmod +x "$ofile"
+])
+else
+ # If there is no Makefile yet, we rely on a make rule to execute
+ # `config.status --recheck' to rerun these tests and create the
+ # libtool script then.
+ ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'`
+ if test -f "$ltmain_in"; then
+ test -f Makefile && make "$ltmain"
+ fi
+fi
+])# AC_LIBTOOL_CONFIG
+
+
+# AC_LIBTOOL_PROG_COMPILER_NO_RTTI([TAGNAME])
+# -------------------------------------------
+AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI],
+[AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl
+
+_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
+
+if test "$GCC" = yes; then
+ _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'
+
+ AC_LIBTOOL_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions],
+ lt_cv_prog_compiler_rtti_exceptions,
+ [-fno-rtti -fno-exceptions], [],
+ [_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"])
+fi
+])# AC_LIBTOOL_PROG_COMPILER_NO_RTTI
+
+
+# AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE
+# ---------------------------------
+AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE],
+[AC_REQUIRE([AC_CANONICAL_HOST])
+AC_REQUIRE([LT_AC_PROG_SED])
+AC_REQUIRE([AC_PROG_NM])
+AC_REQUIRE([AC_OBJEXT])
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+AC_MSG_CHECKING([command to parse $NM output from $compiler object])
+AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe],
+[
+# These are sane defaults that work on at least a few old systems.
+# [They come from Ultrix. What could be older than Ultrix?!! ;)]
+
+# Character class describing NM global symbol codes.
+symcode='[[BCDEGRST]]'
+
+# Regexp to match symbols that can be accessed directly from C.
+sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)'
+
+# Transform an extracted symbol line into a proper C declaration
+lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'"
+
+# Transform an extracted symbol line into symbol name and symbol address
+lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'"
+
+# Define system-specific variables.
+case $host_os in
+aix*)
+ symcode='[[BCDT]]'
+ ;;
+cygwin* | mingw* | pw32*)
+ symcode='[[ABCDGISTW]]'
+ ;;
+hpux*) # Its linker distinguishes data from code symbols
+ if test "$host_cpu" = ia64; then
+ symcode='[[ABCDEGRST]]'
+ fi
+ lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+ lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'"
+ ;;
+linux* | k*bsd*-gnu)
+ if test "$host_cpu" = ia64; then
+ symcode='[[ABCDGIRSTW]]'
+ lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+ lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'"
+ fi
+ ;;
+irix* | nonstopux*)
+ symcode='[[BCDEGRST]]'
+ ;;
+osf*)
+ symcode='[[BCDEGQRST]]'
+ ;;
+solaris*)
+ symcode='[[BDRT]]'
+ ;;
+sco3.2v5*)
+ symcode='[[DT]]'
+ ;;
+sysv4.2uw2*)
+ symcode='[[DT]]'
+ ;;
+sysv5* | sco5v6* | unixware* | OpenUNIX*)
+ symcode='[[ABDT]]'
+ ;;
+sysv4)
+ symcode='[[DFNSTU]]'
+ ;;
+esac
+
+# Handle CRLF in mingw tool chain
+opt_cr=
+case $build_os in
+mingw*)
+ opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp
+ ;;
+esac
+
+# If we're using GNU nm, then use its standard symbol codes.
+case `$NM -V 2>&1` in
+*GNU* | *'with BFD'*)
+ symcode='[[ABCDGIRSTW]]' ;;
+esac
+
+# Try without a prefix undercore, then with it.
+for ac_symprfx in "" "_"; do
+
+ # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
+ symxfrm="\\1 $ac_symprfx\\2 \\2"
+
+ # Write the raw and C identifiers.
+ lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
+
+ # Check to see that the pipe works correctly.
+ pipe_works=no
+
+ rm -f conftest*
+ cat > conftest.$ac_ext <<EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func();return(0);}
+EOF
+
+ if AC_TRY_EVAL(ac_compile); then
+ # Now try to grab the symbols.
+ nlist=conftest.nm
+ if AC_TRY_EVAL(NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) && test -s "$nlist"; then
+ # Try sorting and uniquifying the output.
+ if sort "$nlist" | uniq > "$nlist"T; then
+ mv -f "$nlist"T "$nlist"
+ else
+ rm -f "$nlist"T
+ fi
+
+ # Make sure that we snagged all the symbols we need.
+ if grep ' nm_test_var$' "$nlist" >/dev/null; then
+ if grep ' nm_test_func$' "$nlist" >/dev/null; then
+ cat <<EOF > conftest.$ac_ext
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+EOF
+ # Now generate the symbol file.
+ eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext'
+
+ cat <<EOF >> conftest.$ac_ext
+#if defined (__STDC__) && __STDC__
+# define lt_ptr_t void *
+#else
+# define lt_ptr_t char *
+# define const
+#endif
+
+/* The mapping between symbol names and symbols. */
+const struct {
+ const char *name;
+ lt_ptr_t address;
+}
+lt_preloaded_symbols[[]] =
+{
+EOF
+ $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext
+ cat <<\EOF >> conftest.$ac_ext
+ {0, (lt_ptr_t) 0}
+};
+
+#ifdef __cplusplus
+}
+#endif
+EOF
+ # Now try linking the two files.
+ mv conftest.$ac_objext conftstm.$ac_objext
+ lt_save_LIBS="$LIBS"
+ lt_save_CFLAGS="$CFLAGS"
+ LIBS="conftstm.$ac_objext"
+ CFLAGS="$CFLAGS$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)"
+ if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then
+ pipe_works=yes
+ fi
+ LIBS="$lt_save_LIBS"
+ CFLAGS="$lt_save_CFLAGS"
+ else
+ echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD
+ fi
+ else
+ echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD
+ fi
+ else
+ echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD
+ fi
+ else
+ echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD
+ cat conftest.$ac_ext >&5
+ fi
+ rm -rf conftest* conftst*
+
+ # Do not use the global_symbol_pipe unless it works.
+ if test "$pipe_works" = yes; then
+ break
+ else
+ lt_cv_sys_global_symbol_pipe=
+ fi
+done
+])
+if test -z "$lt_cv_sys_global_symbol_pipe"; then
+ lt_cv_sys_global_symbol_to_cdecl=
+fi
+if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
+ AC_MSG_RESULT(failed)
+else
+ AC_MSG_RESULT(ok)
+fi
+]) # AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE
+
+
+# AC_LIBTOOL_PROG_COMPILER_PIC([TAGNAME])
+# ---------------------------------------
+AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC],
+[_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)=
+_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=
+_LT_AC_TAGVAR(lt_prog_compiler_static, $1)=
+
+AC_MSG_CHECKING([for $compiler option to produce PIC])
+ ifelse([$1],[CXX],[
+ # C++ specific cases for pic, static, wl, etc.
+ if test "$GXX" = yes; then
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static'
+
+ case $host_os in
+ aix*)
+ # All AIX code is PIC.
+ if test "$host_cpu" = ia64; then
+ # AIX 5 now supports IA64 processor
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ fi
+ ;;
+ amigaos*)
+ # FIXME: we need at least 68020 code to build shared libraries, but
+ # adding the `-m68020' flag to GCC prevents building anything better,
+ # like `-m68040'.
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
+ ;;
+ beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+ # PIC is the default for these OSes.
+ ;;
+ mingw* | cygwin* | os2* | pw32*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ # Although the cygwin gcc ignores -fPIC, still need this for old-style
+ # (--disable-auto-import) libraries
+ m4_if([$1], [GCJ], [],
+ [_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+ ;;
+ darwin* | rhapsody*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
+ ;;
+ *djgpp*)
+ # DJGPP does not support shared libraries at all
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=
+ ;;
+ interix[[3-9]]*)
+ # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+ # Instead, we relocate shared libraries at runtime.
+ ;;
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
+ fi
+ ;;
+ hpux*)
+ # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+ # not for PA HP-UX.
+ case $host_cpu in
+ hppa*64*|ia64*)
+ ;;
+ *)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+ ;;
+ esac
+ ;;
+ *)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+ ;;
+ esac
+ else
+ case $host_os in
+ aix[[4-9]]*)
+ # All AIX code is PIC.
+ if test "$host_cpu" = ia64; then
+ # AIX 5 now supports IA64 processor
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ else
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
+ fi
+ ;;
+ chorus*)
+ case $cc_basename in
+ cxch68*)
+ # Green Hills C++ Compiler
+ # _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a"
+ ;;
+ esac
+ ;;
+ darwin*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ case $cc_basename in
+ xlc*)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-qnocommon'
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ ;;
+ esac
+ ;;
+ dgux*)
+ case $cc_basename in
+ ec++*)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ ;;
+ ghcx*)
+ # Green Hills C++ Compiler
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ freebsd* | dragonfly*)
+ # FreeBSD uses GNU C++
+ ;;
+ hpux9* | hpux10* | hpux11*)
+ case $cc_basename in
+ CC*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+ if test "$host_cpu" != ia64; then
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+ fi
+ ;;
+ aCC*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+ case $host_cpu in
+ hppa*64*|ia64*)
+ # +Z the default
+ ;;
+ *)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+ ;;
+ esac
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ interix*)
+ # This is c89, which is MS Visual C++ (no shared libs)
+ # Anyone wants to do a port?
+ ;;
+ irix5* | irix6* | nonstopux*)
+ case $cc_basename in
+ CC*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+ # CC pic flag -KPIC is the default.
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ linux* | k*bsd*-gnu)
+ case $cc_basename in
+ KCC*)
+ # KAI C++ Compiler
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+ ;;
+ icpc* | ecpc*)
+ # Intel C++
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static'
+ ;;
+ pgCC* | pgcpp*)
+ # Portland Group C++ compiler.
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ ;;
+ cxx*)
+ # Compaq C++
+ # Make sure the PIC flag is empty. It appears that all Alpha
+ # Linux and Compaq Tru64 Unix objects are PIC.
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+ ;;
+ *)
+ case `$CC -V 2>&1 | sed 5q` in
+ *Sun\ C*)
+ # Sun C++ 5.9
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ lynxos*)
+ ;;
+ m88k*)
+ ;;
+ mvs*)
+ case $cc_basename in
+ cxx*)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ netbsd*)
+ ;;
+ osf3* | osf4* | osf5*)
+ case $cc_basename in
+ KCC*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
+ ;;
+ RCC*)
+ # Rational C++ 2.4.1
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+ ;;
+ cxx*)
+ # Digital/Compaq C++
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ # Make sure the PIC flag is empty. It appears that all Alpha
+ # Linux and Compaq Tru64 Unix objects are PIC.
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ psos*)
+ ;;
+ solaris*)
+ case $cc_basename in
+ CC*)
+ # Sun C++ 4.2, 5.x and Centerline C++
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+ ;;
+ gcx*)
+ # Green Hills C++ Compiler
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ sunos4*)
+ case $cc_basename in
+ CC*)
+ # Sun C++ 4.x
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ ;;
+ lcc*)
+ # Lucid
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ tandem*)
+ case $cc_basename in
+ NCC*)
+ # NonStop-UX NCC 3.20
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+ case $cc_basename in
+ CC*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ ;;
+ esac
+ ;;
+ vxworks*)
+ ;;
+ *)
+ _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+ ;;
+ esac
+ fi
+],
+[
+ if test "$GCC" = yes; then
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static'
+
+ case $host_os in
+ aix*)
+ # All AIX code is PIC.
+ if test "$host_cpu" = ia64; then
+ # AIX 5 now supports IA64 processor
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ fi
+ ;;
+
+ amigaos*)
+ # FIXME: we need at least 68020 code to build shared libraries, but
+ # adding the `-m68020' flag to GCC prevents building anything better,
+ # like `-m68040'.
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
+ ;;
+
+ beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+ # PIC is the default for these OSes.
+ ;;
+
+ mingw* | cygwin* | pw32* | os2*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ # Although the cygwin gcc ignores -fPIC, still need this for old-style
+ # (--disable-auto-import) libraries
+ m4_if([$1], [GCJ], [],
+ [_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+ ;;
+
+ darwin* | rhapsody*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
+ ;;
+
+ interix[[3-9]]*)
+ # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+ # Instead, we relocate shared libraries at runtime.
+ ;;
+
+ msdosdjgpp*)
+ # Just because we use GCC doesn't mean we suddenly get shared libraries
+ # on systems that don't support them.
+ _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+ enable_shared=no
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
+ fi
+ ;;
+
+ hpux*)
+ # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+ # not for PA HP-UX.
+ case $host_cpu in
+ hppa*64*|ia64*)
+ # +Z the default
+ ;;
+ *)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+ ;;
+ esac
+ ;;
+
+ *)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+ ;;
+ esac
+ else
+ # PORTME Check for flag to pass linker flags through the system compiler.
+ case $host_os in
+ aix*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ if test "$host_cpu" = ia64; then
+ # AIX 5 now supports IA64 processor
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ else
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
+ fi
+ ;;
+ darwin*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ case $cc_basename in
+ xlc*)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-qnocommon'
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ ;;
+ esac
+ ;;
+
+ mingw* | cygwin* | pw32* | os2*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ m4_if([$1], [GCJ], [],
+ [_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+ ;;
+
+ hpux9* | hpux10* | hpux11*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+ # not for PA HP-UX.
+ case $host_cpu in
+ hppa*64*|ia64*)
+ # +Z the default
+ ;;
+ *)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+ ;;
+ esac
+ # Is there a better lt_prog_compiler_static that works with the bundled CC?
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+ ;;
+
+ irix5* | irix6* | nonstopux*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ # PIC (with -KPIC) is the default.
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+ ;;
+
+ newsos6)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ ;;
+
+ linux* | k*bsd*-gnu)
+ case $cc_basename in
+ icc* | ecc*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static'
+ ;;
+ pgcc* | pgf77* | pgf90* | pgf95*)
+ # Portland Group compilers (*not* the Pentium gcc compiler,
+ # which looks to be a dead project)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ ;;
+ ccc*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ # All Alpha code is PIC.
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+ ;;
+ *)
+ case `$CC -V 2>&1 | sed 5q` in
+ *Sun\ C*)
+ # Sun C 5.9
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ ;;
+ *Sun\ F*)
+ # Sun Fortran 8.3 passes all unrecognized flags to the linker
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)=''
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+
+ osf3* | osf4* | osf5*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ # All OSF/1 code is PIC.
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+ ;;
+
+ rdos*)
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+ ;;
+
+ solaris*)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ case $cc_basename in
+ f77* | f90* | f95*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';;
+ *)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';;
+ esac
+ ;;
+
+ sunos4*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ ;;
+
+ sysv4 | sysv4.2uw2* | sysv4.3*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec ;then
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ fi
+ ;;
+
+ sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ ;;
+
+ unicos*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+ ;;
+
+ uts4*)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ ;;
+
+ *)
+ _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+ ;;
+ esac
+ fi
+])
+AC_MSG_RESULT([$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)])
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)"; then
+ AC_LIBTOOL_COMPILER_OPTION([if $compiler PIC flag $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) works],
+ _LT_AC_TAGVAR(lt_cv_prog_compiler_pic_works, $1),
+ [$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])], [],
+ [case $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) in
+ "" | " "*) ;;
+ *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)" ;;
+ esac],
+ [_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=
+ _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no])
+fi
+case $host_os in
+ # For platforms which do not support PIC, -DPIC is meaningless:
+ *djgpp*)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=
+ ;;
+ *)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])"
+ ;;
+esac
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_AC_TAGVAR(lt_prog_compiler_static, $1)\"
+AC_LIBTOOL_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works],
+ _LT_AC_TAGVAR(lt_cv_prog_compiler_static_works, $1),
+ $lt_tmp_static_flag,
+ [],
+ [_LT_AC_TAGVAR(lt_prog_compiler_static, $1)=])
+])
+
+
+# AC_LIBTOOL_PROG_LD_SHLIBS([TAGNAME])
+# ------------------------------------
+# See if the linker supports building shared libraries.
+AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS],
+[AC_REQUIRE([LT_AC_PROG_SED])dnl
+AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
+ifelse([$1],[CXX],[
+ _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+ case $host_os in
+ aix[[4-9]]*)
+ # If we're using GNU nm, then we don't want the "-C" option.
+ # -C means demangle to AIX nm, but means don't demangle with GNU nm
+ if $NM -V 2>&1 | grep 'GNU' > /dev/null; then
+ _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols'
+ else
+ _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols'
+ fi
+ ;;
+ pw32*)
+ _LT_AC_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds"
+ ;;
+ cygwin* | mingw*)
+ _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;/^.*[[ ]]__nm__/s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols'
+ ;;
+ *)
+ _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+ ;;
+ esac
+ _LT_AC_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
+],[
+ runpath_var=
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=
+ _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+ _LT_AC_TAGVAR(archive_cmds, $1)=
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)=
+ _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)=
+ _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1)=
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=
+ _LT_AC_TAGVAR(thread_safe_flag_spec, $1)=
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=
+ _LT_AC_TAGVAR(hardcode_direct, $1)=no
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=no
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+ _LT_AC_TAGVAR(link_all_deplibs, $1)=unknown
+ _LT_AC_TAGVAR(hardcode_automatic, $1)=no
+ _LT_AC_TAGVAR(module_cmds, $1)=
+ _LT_AC_TAGVAR(module_expsym_cmds, $1)=
+ _LT_AC_TAGVAR(always_export_symbols, $1)=no
+ _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+ # include_expsyms should be a list of space-separated symbols to be *always*
+ # included in the symbol list
+ _LT_AC_TAGVAR(include_expsyms, $1)=
+ # exclude_expsyms can be an extended regexp of symbols to exclude
+ # it will be wrapped by ` (' and `)$', so one must not match beginning or
+ # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
+ # as well as any symbol that contains `d'.
+ _LT_AC_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
+ # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+ # platforms (ab)use it in PIC code, but their linkers get confused if
+ # the symbol is explicitly referenced. Since portable code cannot
+ # rely on this symbol name, it's probably fine to never include it in
+ # preloaded symbol tables.
+ # Exclude shared library initialization/finalization symbols.
+dnl Note also adjust exclude_expsyms for C++ above.
+ extract_expsyms_cmds=
+ # Just being paranoid about ensuring that cc_basename is set.
+ _LT_CC_BASENAME([$compiler])
+ case $host_os in
+ cygwin* | mingw* | pw32*)
+ # FIXME: the MSVC++ port hasn't been tested in a loooong time
+ # When not using gcc, we currently assume that we are using
+ # Microsoft Visual C++.
+ if test "$GCC" != yes; then
+ with_gnu_ld=no
+ fi
+ ;;
+ interix*)
+ # we just hope/assume this is gcc and not c89 (= MSVC++)
+ with_gnu_ld=yes
+ ;;
+ openbsd*)
+ with_gnu_ld=no
+ ;;
+ esac
+
+ _LT_AC_TAGVAR(ld_shlibs, $1)=yes
+ if test "$with_gnu_ld" = yes; then
+ # If archive_cmds runs LD, not CC, wlarc should be empty
+ wlarc='${wl}'
+
+ # Set some defaults for GNU ld with shared library support. These
+ # are reset later if shared libraries are not supported. Putting them
+ # here allows them to be overridden if necessary.
+ runpath_var=LD_RUN_PATH
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir'
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+ # ancient GNU ld didn't support --whole-archive et. al.
+ if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+ else
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=
+ fi
+ supports_anon_versioning=no
+ case `$LD -v 2>/dev/null` in
+ *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11
+ *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
+ *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
+ *\ 2.11.*) ;; # other 2.11 versions
+ *) supports_anon_versioning=yes ;;
+ esac
+
+ # See if GNU ld supports shared libraries.
+ case $host_os in
+ aix[[3-9]]*)
+ # On AIX/PPC, the GNU linker is very broken
+ if test "$host_cpu" != ia64; then
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ cat <<EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.9.1, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support. If you
+*** really care for shared libraries, you may want to modify your PATH
+*** so that a non-GNU linker is found, and then restart.
+
+EOF
+ fi
+ ;;
+
+ amigaos*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+
+ # Samuel A. Falvo II <kc5tja@dolphin.openprojects.net> reports
+ # that the semantics of dynamic libraries on AmigaOS, at least up
+ # to version 4, is to share data among multiple programs linked
+ # with the same dynamic library. Since this doesn't match the
+ # behavior of shared libraries on other platforms, we can't use
+ # them.
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+
+ beos*)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
+ # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+ # support --undefined. This deserves some investigation. FIXME
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ else
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+
+ cygwin* | mingw* | pw32*)
+ # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
+ # as there is no search path for DLLs.
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
+ _LT_AC_TAGVAR(always_export_symbols, $1)=no
+ _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+ _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/'\'' -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols'
+
+ if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+ # If the export-symbols file already is a .def file (1st line
+ # is EXPORTS), use it as is; otherwise, prepend...
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+ cp $export_symbols $output_objdir/$soname.def;
+ else
+ echo EXPORTS > $output_objdir/$soname.def;
+ cat $export_symbols >> $output_objdir/$soname.def;
+ fi~
+ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+ else
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+
+ interix[[3-9]]*)
+ _LT_AC_TAGVAR(hardcode_direct, $1)=no
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+ # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+ # Instead, shared libraries are loaded at an image base (0x10000000 by
+ # default) and relocated if they conflict, which is a slow very memory
+ # consuming and fragmenting process. To avoid this, we pick a random,
+ # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+ # time. Moving up from 0x10000000 also allows more sbrk(2) space.
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+ ;;
+
+ gnu* | linux* | k*bsd*-gnu)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ tmp_addflag=
+ case $cc_basename,$host_cpu in
+ pgcc*) # Portland Group C compiler
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
+ tmp_addflag=' $pic_flag'
+ ;;
+ pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
+ tmp_addflag=' $pic_flag -Mnomain' ;;
+ ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64
+ tmp_addflag=' -i_dynamic' ;;
+ efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64
+ tmp_addflag=' -i_dynamic -nofor_main' ;;
+ ifc* | ifort*) # Intel Fortran compiler
+ tmp_addflag=' -nofor_main' ;;
+ esac
+ case `$CC -V 2>&1 | sed 5q` in
+ *Sun\ C*) # Sun C 5.9
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
+ tmp_sharedflag='-G' ;;
+ *Sun\ F*) # Sun Fortran 8.3
+ tmp_sharedflag='-G' ;;
+ *)
+ tmp_sharedflag='-shared' ;;
+ esac
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+
+ if test $supports_anon_versioning = yes; then
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $output_objdir/$libname.ver~
+ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+ $echo "local: *; };" >> $output_objdir/$libname.ver~
+ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+ fi
+ else
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+
+ netbsd*)
+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+ wlarc=
+ else
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ fi
+ ;;
+
+ solaris*)
+ if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ cat <<EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems. Therefore, libtool
+*** is disabling shared libraries support. We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer. Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+EOF
+ elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ else
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+
+ sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+ case `$LD -v 2>&1` in
+ *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*)
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ cat <<_LT_EOF 1>&2
+
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
+*** reliably create shared libraries on SCO systems. Therefore, libtool
+*** is disabling shared libraries support. We urge you to upgrade GNU
+*** binutils to release 2.16.91.0.3 or newer. Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+ ;;
+ *)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib'
+ else
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+ esac
+ ;;
+
+ sunos4*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ wlarc=
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ *)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ else
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+ esac
+
+ if test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no; then
+ runpath_var=
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=
+ fi
+ else
+ # PORTME fill in a description of your system's linker (not GNU ld)
+ case $host_os in
+ aix3*)
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
+ _LT_AC_TAGVAR(always_export_symbols, $1)=yes
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+ # Note: this linker hardcodes the directories in LIBPATH if there
+ # are no directories specified by -L.
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+ if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
+ # Neither direct hardcoding nor static linking is supported with a
+ # broken collect2.
+ _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported
+ fi
+ ;;
+
+ aix[[4-9]]*)
+ if test "$host_cpu" = ia64; then
+ # On IA64, the linker does run time linking by default, so we don't
+ # have to do anything special.
+ aix_use_runtimelinking=no
+ exp_sym_flag='-Bexport'
+ no_entry_flag=""
+ else
+ # If we're using GNU nm, then we don't want the "-C" option.
+ # -C means demangle to AIX nm, but means don't demangle with GNU nm
+ if $NM -V 2>&1 | grep 'GNU' > /dev/null; then
+ _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols'
+ else
+ _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols'
+ fi
+ aix_use_runtimelinking=no
+
+ # Test if we are trying to use run time linking or normal
+ # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+ # need to do runtime linking.
+ case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
+ for ld_flag in $LDFLAGS; do
+ if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+ aix_use_runtimelinking=yes
+ break
+ fi
+ done
+ ;;
+ esac
+
+ exp_sym_flag='-bexport'
+ no_entry_flag='-bnoentry'
+ fi
+
+ # When large executables or shared objects are built, AIX ld can
+ # have problems creating the table of contents. If linking a library
+ # or program results in "error TOC overflow" add -mminimal-toc to
+ # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not
+ # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+ _LT_AC_TAGVAR(archive_cmds, $1)=''
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':'
+ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+
+ if test "$GCC" = yes; then
+ case $host_os in aix4.[[012]]|aix4.[[012]].*)
+ # We only want to do this on AIX 4.2 and lower, the check
+ # below for broken collect2 doesn't work under 4.3+
+ collect2name=`${CC} -print-prog-name=collect2`
+ if test -f "$collect2name" && \
+ strings "$collect2name" | grep resolve_lib_name >/dev/null
+ then
+ # We have reworked collect2
+ :
+ else
+ # We have old collect2
+ _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported
+ # It fails to find uninstalled libraries when the uninstalled
+ # path is not listed in the libpath. Setting hardcode_minus_L
+ # to unsupported forces relinking
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=
+ fi
+ ;;
+ esac
+ shared_flag='-shared'
+ if test "$aix_use_runtimelinking" = yes; then
+ shared_flag="$shared_flag "'${wl}-G'
+ fi
+ else
+ # not using gcc
+ if test "$host_cpu" = ia64; then
+ # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+ # chokes on -Wl,-G. The following line is correct:
+ shared_flag='-G'
+ else
+ if test "$aix_use_runtimelinking" = yes; then
+ shared_flag='${wl}-G'
+ else
+ shared_flag='${wl}-bM:SRE'
+ fi
+ fi
+ fi
+
+ # It seems that -bexpall does not export symbols beginning with
+ # underscore (_), so it is better to generate a list of symbols to export.
+ _LT_AC_TAGVAR(always_export_symbols, $1)=yes
+ if test "$aix_use_runtimelinking" = yes; then
+ # Warning - without using the other runtime loading flags (-brtl),
+ # -berok will link without error, but may produce a broken library.
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok'
+ # Determine the default libpath from the value encoded in an empty executable.
+ _LT_AC_SYS_LIBPATH_AIX
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+ else
+ if test "$host_cpu" = ia64; then
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+ else
+ # Determine the default libpath from the value encoded in an empty executable.
+ _LT_AC_SYS_LIBPATH_AIX
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+ # Warning - without using the other run time loading flags,
+ # -berok will link without error, but may produce a broken library.
+ _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
+ # Exported symbols can be pulled into shared objects from archives
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes
+ # This is similar to how AIX traditionally builds its shared libraries.
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+ fi
+ fi
+ ;;
+
+ amigaos*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+ # see comment about different semantics on the GNU ld section
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+
+ bsdi[[45]]*)
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic
+ ;;
+
+ cygwin* | mingw* | pw32*)
+ # When not using gcc, we currently assume that we are using
+ # Microsoft Visual C++.
+ # hardcode_libdir_flag_spec is actually meaningless, as there is
+ # no search path for DLLs.
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
+ # Tell ltmain to make .lib files, not .a files.
+ libext=lib
+ # Tell ltmain to make .dll files, not .so files.
+ shrext_cmds=".dll"
+ # FIXME: Setting linknames here is a bad hack.
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames='
+ # The linker will automatically build a .lib file if we build a DLL.
+ _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='true'
+ # FIXME: Should let the user specify the lib program.
+ _LT_AC_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs'
+ _LT_AC_TAGVAR(fix_srcfile_path, $1)='`cygpath -w "$srcfile"`'
+ _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+ ;;
+
+ darwin* | rhapsody*)
+ case $host_os in
+ rhapsody* | darwin1.[[012]])
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}suppress'
+ ;;
+ *) # Darwin 1.3 on
+ if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
+ else
+ case ${MACOSX_DEPLOYMENT_TARGET} in
+ 10.[[012]])
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
+ ;;
+ 10.*)
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}dynamic_lookup'
+ ;;
+ esac
+ fi
+ ;;
+ esac
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+ _LT_AC_TAGVAR(hardcode_direct, $1)=no
+ _LT_AC_TAGVAR(hardcode_automatic, $1)=yes
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=''
+ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+ if test "$GCC" = yes ; then
+ output_verbose_link_cmd='echo'
+ _LT_AC_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
+ _LT_AC_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
+ _LT_AC_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
+ else
+ case $cc_basename in
+ xlc*)
+ output_verbose_link_cmd='echo'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $xlcverstring'
+ _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $xlcverstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ ;;
+ *)
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ esac
+ fi
+ ;;
+
+ dgux*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ freebsd1*)
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+
+ # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+ # support. Future versions do this automatically, but an explicit c++rt0.o
+ # does not break anything, and helps significantly (at the cost of a little
+ # extra space).
+ freebsd2.2*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+ freebsd2*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+ freebsd* | dragonfly*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ hpux9*)
+ if test "$GCC" = yes; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+ else
+ _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+ fi
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+ ;;
+
+ hpux10*)
+ if test "$GCC" = yes -a "$with_gnu_ld" = no; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+ fi
+ if test "$with_gnu_ld" = no; then
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+ fi
+ ;;
+
+ hpux11*)
+ if test "$GCC" = yes -a "$with_gnu_ld" = no; then
+ case $host_cpu in
+ hppa*64*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ ia64*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ esac
+ else
+ case $host_cpu in
+ hppa*64*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ ia64*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ esac
+ fi
+ if test "$with_gnu_ld" = no; then
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+
+ case $host_cpu in
+ hppa*64*|ia64*)
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=no
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+ *)
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+ ;;
+ esac
+ fi
+ ;;
+
+ irix5* | irix6* | nonstopux*)
+ if test "$GCC" = yes; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ else
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir'
+ fi
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+ ;;
+
+ netbsd*)
+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out
+ else
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF
+ fi
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ newsos6)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ openbsd*)
+ if test -f /usr/libexec/ld.so; then
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+ else
+ case $host_os in
+ openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+ ;;
+ *)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+ ;;
+ esac
+ fi
+ else
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+
+ os2*)
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
+ _LT_AC_TAGVAR(archive_cmds, $1)='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
+ _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+ ;;
+
+ osf3*)
+ if test "$GCC" = yes; then
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ else
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+ fi
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+ ;;
+
+ osf4* | osf5*) # as osf3* with the addition of -msym flag
+ if test "$GCC" = yes; then
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+ else
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~
+ $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp'
+
+ # Both c and cxx compiler support -rpath directly
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+ fi
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+ ;;
+
+ solaris*)
+ _LT_AC_TAGVAR(no_undefined_flag, $1)=' -z text'
+ if test "$GCC" = yes; then
+ wlarc='${wl}'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+ $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp'
+ else
+ wlarc=''
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp'
+ fi
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ case $host_os in
+ solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+ *)
+ # The compiler driver will combine and reorder linker options,
+ # but understands `-z linker_flag'. GCC discards it without `$wl',
+ # but is careful enough not to reorder.
+ # Supported since Solaris 2.6 (maybe 2.5.1?)
+ if test "$GCC" = yes; then
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+ else
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
+ fi
+ ;;
+ esac
+ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+ ;;
+
+ sunos4*)
+ if test "x$host_vendor" = xsequent; then
+ # Use $CC to link under sequent, because it throws in some extra .o
+ # files that make .init and .fini sections work.
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+ fi
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ sysv4)
+ case $host_vendor in
+ sni)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes # is this really true???
+ ;;
+ siemens)
+ ## LD is ld it makes a PLAMLIB
+ ## CC just makes a GrossModule.
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+ _LT_AC_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=no
+ ;;
+ motorola)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie
+ ;;
+ esac
+ runpath_var='LD_RUN_PATH'
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ sysv4.3*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport'
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ runpath_var=LD_RUN_PATH
+ hardcode_runpath_var=yes
+ _LT_AC_TAGVAR(ld_shlibs, $1)=yes
+ fi
+ ;;
+
+ sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
+ _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ runpath_var='LD_RUN_PATH'
+
+ if test "$GCC" = yes; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ fi
+ ;;
+
+ sysv5* | sco3.2v5* | sco5v6*)
+ # Note: We can NOT use -z defs as we might desire, because we do not
+ # link with -lc, and that would cause any symbols used from libc to
+ # always be unresolved, which means just about no library would
+ # ever link correctly. If we're not using GNU ld we use -z text
+ # though, which does catch some bad symbols but isn't as heavy-handed
+ # as -z defs.
+ _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':'
+ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
+ runpath_var='LD_RUN_PATH'
+
+ if test "$GCC" = yes; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ fi
+ ;;
+
+ uts4*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ *)
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ esac
+ fi
+])
+AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)])
+test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)" in
+x|xyes)
+ # Assume -lc should be added
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes
+
+ if test "$enable_shared" = yes && test "$GCC" = yes; then
+ case $_LT_AC_TAGVAR(archive_cmds, $1) in
+ *'~'*)
+ # FIXME: we may have to deal with multi-command sequences.
+ ;;
+ '$CC '*)
+ # Test whether the compiler implicitly links with -lc since on some
+ # systems, -lgcc has to come before -lc. If gcc already passes -lc
+ # to ld, don't add -lc before -lgcc.
+ AC_MSG_CHECKING([whether -lc should be explicitly linked in])
+ $rm conftest*
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ if AC_TRY_EVAL(ac_compile) 2>conftest.err; then
+ soname=conftest
+ lib=conftest
+ libobjs=conftest.$ac_objext
+ deplibs=
+ wl=$_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)
+ pic_flag=$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)
+ compiler_flags=-v
+ linker_flags=-v
+ verstring=
+ output_objdir=.
+ libname=conftest
+ lt_save_allow_undefined_flag=$_LT_AC_TAGVAR(allow_undefined_flag, $1)
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=
+ if AC_TRY_EVAL(_LT_AC_TAGVAR(archive_cmds, $1) 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1)
+ then
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+ else
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes
+ fi
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag
+ else
+ cat conftest.err 1>&5
+ fi
+ $rm conftest*
+ AC_MSG_RESULT([$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)])
+ ;;
+ esac
+ fi
+ ;;
+esac
+])# AC_LIBTOOL_PROG_LD_SHLIBS
+
+
+# _LT_AC_FILE_LTDLL_C
+# -------------------
+# Be careful that the start marker always follows a newline.
+AC_DEFUN([_LT_AC_FILE_LTDLL_C], [
+# /* ltdll.c starts here */
+# #define WIN32_LEAN_AND_MEAN
+# #include <windows.h>
+# #undef WIN32_LEAN_AND_MEAN
+# #include <stdio.h>
+#
+# #ifndef __CYGWIN__
+# # ifdef __CYGWIN32__
+# # define __CYGWIN__ __CYGWIN32__
+# # endif
+# #endif
+#
+# #ifdef __cplusplus
+# extern "C" {
+# #endif
+# BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved);
+# #ifdef __cplusplus
+# }
+# #endif
+#
+# #ifdef __CYGWIN__
+# #include <cygwin/cygwin_dll.h>
+# DECLARE_CYGWIN_DLL( DllMain );
+# #endif
+# HINSTANCE __hDllInstance_base;
+#
+# BOOL APIENTRY
+# DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved)
+# {
+# __hDllInstance_base = hInst;
+# return TRUE;
+# }
+# /* ltdll.c ends here */
+])# _LT_AC_FILE_LTDLL_C
+
+
+# _LT_AC_TAGVAR(VARNAME, [TAGNAME])
+# ---------------------------------
+AC_DEFUN([_LT_AC_TAGVAR], [ifelse([$2], [], [$1], [$1_$2])])
+
+
+# old names
+AC_DEFUN([AM_PROG_LIBTOOL], [AC_PROG_LIBTOOL])
+AC_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)])
+AC_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)])
+AC_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)])
+AC_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)])
+AC_DEFUN([AM_PROG_LD], [AC_PROG_LD])
+AC_DEFUN([AM_PROG_NM], [AC_PROG_NM])
+
+# This is just to silence aclocal about the macro not being used
+ifelse([AC_DISABLE_FAST_INSTALL])
+
+AC_DEFUN([LT_AC_PROG_GCJ],
+[AC_CHECK_TOOL(GCJ, gcj, no)
+ test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2"
+ AC_SUBST(GCJFLAGS)
+])
+
+AC_DEFUN([LT_AC_PROG_RC],
+[AC_CHECK_TOOL(RC, windres, no)
+])
+
+
+# Cheap backport of AS_EXECUTABLE_P and required macros
+# from Autoconf 2.59; we should not use $as_executable_p directly.
+
+# _AS_TEST_PREPARE
+# ----------------
+m4_ifndef([_AS_TEST_PREPARE],
+[m4_defun([_AS_TEST_PREPARE],
+[if test -x / >/dev/null 2>&1; then
+ as_executable_p='test -x'
+else
+ as_executable_p='test -f'
+fi
+])])# _AS_TEST_PREPARE
+
+# AS_EXECUTABLE_P
+# ---------------
+# Check whether a file is executable.
+m4_ifndef([AS_EXECUTABLE_P],
+[m4_defun([AS_EXECUTABLE_P],
+[AS_REQUIRE([_AS_TEST_PREPARE])dnl
+$as_executable_p $1[]dnl
+])])# AS_EXECUTABLE_P
+
+# NOTE: This macro has been submitted for inclusion into #
+# GNU Autoconf as AC_PROG_SED. When it is available in #
+# a released version of Autoconf we should remove this #
+# macro and use it instead. #
+# LT_AC_PROG_SED
+# --------------
+# Check for a fully-functional sed program, that truncates
+# as few characters as possible. Prefer GNU sed if found.
+AC_DEFUN([LT_AC_PROG_SED],
+[AC_MSG_CHECKING([for a sed that does not truncate output])
+AC_CACHE_VAL(lt_cv_path_SED,
+[# Loop through the user's path and test for sed and gsed.
+# Then use that list of sed's as ones to test for truncation.
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for lt_ac_prog in sed gsed; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if AS_EXECUTABLE_P(["$as_dir/$lt_ac_prog$ac_exec_ext"]); then
+ lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext"
+ fi
+ done
+ done
+done
+IFS=$as_save_IFS
+lt_ac_max=0
+lt_ac_count=0
+# Add /usr/xpg4/bin/sed as it is typically found on Solaris
+# along with /bin/sed that truncates output.
+for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do
+ test ! -f $lt_ac_sed && continue
+ cat /dev/null > conftest.in
+ lt_ac_count=0
+ echo $ECHO_N "0123456789$ECHO_C" >conftest.in
+ # Check for GNU sed and select it if it is found.
+ if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then
+ lt_cv_path_SED=$lt_ac_sed
+ break
+ fi
+ while true; do
+ cat conftest.in conftest.in >conftest.tmp
+ mv conftest.tmp conftest.in
+ cp conftest.in conftest.nl
+ echo >>conftest.nl
+ $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break
+ cmp -s conftest.out conftest.nl || break
+ # 10000 chars as input seems more than enough
+ test $lt_ac_count -gt 10 && break
+ lt_ac_count=`expr $lt_ac_count + 1`
+ if test $lt_ac_count -gt $lt_ac_max; then
+ lt_ac_max=$lt_ac_count
+ lt_cv_path_SED=$lt_ac_sed
+ fi
+ done
+done
+])
+SED=$lt_cv_path_SED
+AC_SUBST([SED])
+AC_MSG_RESULT([$SED])
+])
+
+# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*-
+#
+# Copyright © 2004 Scott James Remnant <scott@netsplit.com>.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# PKG_PROG_PKG_CONFIG([MIN-VERSION])
+# ----------------------------------
+AC_DEFUN([PKG_PROG_PKG_CONFIG],
+[m4_pattern_forbid([^_?PKG_[A-Z_]+$])
+m4_pattern_allow([^PKG_CONFIG(_PATH)?$])
+AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility])dnl
+if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
+ AC_PATH_TOOL([PKG_CONFIG], [pkg-config])
+fi
+if test -n "$PKG_CONFIG"; then
+ _pkg_min_version=m4_default([$1], [0.9.0])
+ AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version])
+ if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
+ AC_MSG_RESULT([yes])
+ else
+ AC_MSG_RESULT([no])
+ PKG_CONFIG=""
+ fi
+
+fi[]dnl
+])# PKG_PROG_PKG_CONFIG
+
+# PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
+#
+# Check to see whether a particular set of modules exists. Similar
+# to PKG_CHECK_MODULES(), but does not set variables or print errors.
+#
+#
+# Similar to PKG_CHECK_MODULES, make sure that the first instance of
+# this or PKG_CHECK_MODULES is called, or make sure to call
+# PKG_CHECK_EXISTS manually
+# --------------------------------------------------------------
+AC_DEFUN([PKG_CHECK_EXISTS],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
+if test -n "$PKG_CONFIG" && \
+ AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then
+ m4_ifval([$2], [$2], [:])
+m4_ifvaln([$3], [else
+ $3])dnl
+fi])
+
+
+# _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES])
+# ---------------------------------------------
+m4_define([_PKG_CONFIG],
+[if test -n "$$1"; then
+ pkg_cv_[]$1="$$1"
+ elif test -n "$PKG_CONFIG"; then
+ PKG_CHECK_EXISTS([$3],
+ [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null`],
+ [pkg_failed=yes])
+ else
+ pkg_failed=untried
+fi[]dnl
+])# _PKG_CONFIG
+
+# _PKG_SHORT_ERRORS_SUPPORTED
+# -----------------------------
+AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+ _pkg_short_errors_supported=yes
+else
+ _pkg_short_errors_supported=no
+fi[]dnl
+])# _PKG_SHORT_ERRORS_SUPPORTED
+
+
+# PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND],
+# [ACTION-IF-NOT-FOUND])
+#
+#
+# Note that if there is a possibility the first call to
+# PKG_CHECK_MODULES might not happen, you should be sure to include an
+# explicit call to PKG_PROG_PKG_CONFIG in your configure.ac
+#
+#
+# --------------------------------------------------------------
+AC_DEFUN([PKG_CHECK_MODULES],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
+AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl
+AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl
+
+pkg_failed=no
+AC_MSG_CHECKING([for $1])
+
+_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2])
+_PKG_CONFIG([$1][_LIBS], [libs], [$2])
+
+m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS
+and $1[]_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.])
+
+if test $pkg_failed = yes; then
+ _PKG_SHORT_ERRORS_SUPPORTED
+ if test $_pkg_short_errors_supported = yes; then
+ $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "$2" 2>&1`
+ else
+ $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors "$2" 2>&1`
+ fi
+ # Put the nasty error message in config.log where it belongs
+ echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD
+
+ ifelse([$4], , [AC_MSG_ERROR(dnl
+[Package requirements ($2) were not met:
+
+$$1_PKG_ERRORS
+
+Consider adjusting the PKG_CONFIG_PATH environment variable if you
+installed software in a non-standard prefix.
+
+_PKG_TEXT
+])],
+ [AC_MSG_RESULT([no])
+ $4])
+elif test $pkg_failed = untried; then
+ ifelse([$4], , [AC_MSG_FAILURE(dnl
+[The pkg-config script could not be found or is too old. Make sure it
+is in your PATH or set the PKG_CONFIG environment variable to the full
+path to pkg-config.
+
+_PKG_TEXT
+
+To get pkg-config, see <http://pkg-config.freedesktop.org/>.])],
+ [$4])
+else
+ $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS
+ $1[]_LIBS=$pkg_cv_[]$1[]_LIBS
+ AC_MSG_RESULT([yes])
+ ifelse([$3], , :, [$3])
+fi[]dnl
+])# PKG_CHECK_MODULES
+
+# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_AUTOMAKE_VERSION(VERSION)
+# ----------------------------
+# Automake X.Y traces this macro to ensure aclocal.m4 has been
+# generated from the m4 files accompanying Automake X.Y.
+# (This private macro should not be called outside this file.)
+AC_DEFUN([AM_AUTOMAKE_VERSION],
+[am__api_version='1.11'
+dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
+dnl require some minimum version. Point them to the right macro.
+m4_if([$1], [1.11], [],
+ [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
+])
+
+# _AM_AUTOCONF_VERSION(VERSION)
+# -----------------------------
+# aclocal traces this macro to find the Autoconf version.
+# This is a private macro too. Using m4_define simplifies
+# the logic in aclocal, which can simply ignore this definition.
+m4_define([_AM_AUTOCONF_VERSION], [])
+
+# AM_SET_CURRENT_AUTOMAKE_VERSION
+# -------------------------------
+# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
+# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
+AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
+[AM_AUTOMAKE_VERSION([1.11])dnl
+m4_ifndef([AC_AUTOCONF_VERSION],
+ [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
+
+# AM_AUX_DIR_EXPAND -*- Autoconf -*-
+
+# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
+# $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to
+# `$srcdir', `$srcdir/..', or `$srcdir/../..'.
+#
+# Of course, Automake must honor this variable whenever it calls a
+# tool from the auxiliary directory. The problem is that $srcdir (and
+# therefore $ac_aux_dir as well) can be either absolute or relative,
+# depending on how configure is run. This is pretty annoying, since
+# it makes $ac_aux_dir quite unusable in subdirectories: in the top
+# source directory, any form will work fine, but in subdirectories a
+# relative path needs to be adjusted first.
+#
+# $ac_aux_dir/missing
+# fails when called from a subdirectory if $ac_aux_dir is relative
+# $top_srcdir/$ac_aux_dir/missing
+# fails if $ac_aux_dir is absolute,
+# fails when called from a subdirectory in a VPATH build with
+# a relative $ac_aux_dir
+#
+# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
+# are both prefixed by $srcdir. In an in-source build this is usually
+# harmless because $srcdir is `.', but things will broke when you
+# start a VPATH build or use an absolute $srcdir.
+#
+# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
+# iff we strip the leading $srcdir from $ac_aux_dir. That would be:
+# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
+# and then we would define $MISSING as
+# MISSING="\${SHELL} $am_aux_dir/missing"
+# This will work as long as MISSING is not called from configure, because
+# unfortunately $(top_srcdir) has no meaning in configure.
+# However there are other variables, like CC, which are often used in
+# configure, and could therefore not use this "fixed" $ac_aux_dir.
+#
+# Another solution, used here, is to always expand $ac_aux_dir to an
+# absolute PATH. The drawback is that using absolute paths prevent a
+# configured tree to be moved without reconfiguration.
+
+AC_DEFUN([AM_AUX_DIR_EXPAND],
+[dnl Rely on autoconf to set up CDPATH properly.
+AC_PREREQ([2.50])dnl
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+])
+
+# AM_CONDITIONAL -*- Autoconf -*-
+
+# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 9
+
+# AM_CONDITIONAL(NAME, SHELL-CONDITION)
+# -------------------------------------
+# Define a conditional.
+AC_DEFUN([AM_CONDITIONAL],
+[AC_PREREQ(2.52)dnl
+ ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])],
+ [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
+AC_SUBST([$1_TRUE])dnl
+AC_SUBST([$1_FALSE])dnl
+_AM_SUBST_NOTMAKE([$1_TRUE])dnl
+_AM_SUBST_NOTMAKE([$1_FALSE])dnl
+m4_define([_AM_COND_VALUE_$1], [$2])dnl
+if $2; then
+ $1_TRUE=
+ $1_FALSE='#'
+else
+ $1_TRUE='#'
+ $1_FALSE=
+fi
+AC_CONFIG_COMMANDS_PRE(
+[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
+ AC_MSG_ERROR([[conditional "$1" was never defined.
+Usually this means the macro was only invoked conditionally.]])
+fi])])
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 10
+
+# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
+# written in clear, in which case automake, when reading aclocal.m4,
+# will think it sees a *use*, and therefore will trigger all it's
+# C support machinery. Also note that it means that autoscan, seeing
+# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
+
+
+# _AM_DEPENDENCIES(NAME)
+# ----------------------
+# See how the compiler implements dependency checking.
+# NAME is "CC", "CXX", "GCJ", or "OBJC".
+# We try a few techniques and use that to set a single cache variable.
+#
+# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
+# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular
+# dependency, and given that the user is not expected to run this macro,
+# just rely on AC_PROG_CC.
+AC_DEFUN([_AM_DEPENDENCIES],
+[AC_REQUIRE([AM_SET_DEPDIR])dnl
+AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
+AC_REQUIRE([AM_MAKE_INCLUDE])dnl
+AC_REQUIRE([AM_DEP_TRACK])dnl
+
+ifelse([$1], CC, [depcc="$CC" am_compiler_list=],
+ [$1], CXX, [depcc="$CXX" am_compiler_list=],
+ [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
+ [$1], UPC, [depcc="$UPC" am_compiler_list=],
+ [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'],
+ [depcc="$$1" am_compiler_list=])
+
+AC_CACHE_CHECK([dependency style of $depcc],
+ [am_cv_$1_dependencies_compiler_type],
+[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+ # We make a subdir and do the tests there. Otherwise we can end up
+ # making bogus files that we don't know about and never remove. For
+ # instance it was reported that on HP-UX the gcc test will end up
+ # making a dummy file named `D' -- because `-MD' means `put the output
+ # in D'.
+ mkdir conftest.dir
+ # Copy depcomp to subdir because otherwise we won't find it if we're
+ # using a relative directory.
+ cp "$am_depcomp" conftest.dir
+ cd conftest.dir
+ # We will build objects and dependencies in a subdirectory because
+ # it helps to detect inapplicable dependency modes. For instance
+ # both Tru64's cc and ICC support -MD to output dependencies as a
+ # side effect of compilation, but ICC will put the dependencies in
+ # the current directory while Tru64 will put them in the object
+ # directory.
+ mkdir sub
+
+ am_cv_$1_dependencies_compiler_type=none
+ if test "$am_compiler_list" = ""; then
+ am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
+ fi
+ am__universal=false
+ m4_case([$1], [CC],
+ [case " $depcc " in #(
+ *\ -arch\ *\ -arch\ *) am__universal=true ;;
+ esac],
+ [CXX],
+ [case " $depcc " in #(
+ *\ -arch\ *\ -arch\ *) am__universal=true ;;
+ esac])
+
+ for depmode in $am_compiler_list; do
+ # Setup a source with many dependencies, because some compilers
+ # like to wrap large dependency lists on column 80 (with \), and
+ # we should not choose a depcomp mode which is confused by this.
+ #
+ # We need to recreate these files for each test, as the compiler may
+ # overwrite some of them when testing with obscure command lines.
+ # This happens at least with the AIX C compiler.
+ : > sub/conftest.c
+ for i in 1 2 3 4 5 6; do
+ echo '#include "conftst'$i'.h"' >> sub/conftest.c
+ # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+ # Solaris 8's {/usr,}/bin/sh.
+ touch sub/conftst$i.h
+ done
+ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+ # We check with `-c' and `-o' for the sake of the "dashmstdout"
+ # mode. It turns out that the SunPro C++ compiler does not properly
+ # handle `-M -o', and we need to detect this. Also, some Intel
+ # versions had trouble with output in subdirs
+ am__obj=sub/conftest.${OBJEXT-o}
+ am__minus_obj="-o $am__obj"
+ case $depmode in
+ gcc)
+ # This depmode causes a compiler race in universal mode.
+ test "$am__universal" = false || continue
+ ;;
+ nosideeffect)
+ # after this tag, mechanisms are not by side-effect, so they'll
+ # only be used when explicitly requested
+ if test "x$enable_dependency_tracking" = xyes; then
+ continue
+ else
+ break
+ fi
+ ;;
+ msvisualcpp | msvcmsys)
+ # This compiler won't grok `-c -o', but also, the minuso test has
+ # not run yet. These depmodes are late enough in the game, and
+ # so weak that their functioning should not be impacted.
+ am__obj=conftest.${OBJEXT-o}
+ am__minus_obj=
+ ;;
+ none) break ;;
+ esac
+ if depmode=$depmode \
+ source=sub/conftest.c object=$am__obj \
+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+ >/dev/null 2>conftest.err &&
+ grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+ ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+ # icc doesn't choke on unknown options, it will just issue warnings
+ # or remarks (even with -Werror). So we grep stderr for any message
+ # that says an option was ignored or not supported.
+ # When given -MP, icc 7.0 and 7.1 complain thusly:
+ # icc: Command line warning: ignoring option '-M'; no argument required
+ # The diagnosis changed in icc 8.0:
+ # icc: Command line remark: option '-MP' not supported
+ if (grep 'ignoring option' conftest.err ||
+ grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+ am_cv_$1_dependencies_compiler_type=$depmode
+ break
+ fi
+ fi
+ done
+
+ cd ..
+ rm -rf conftest.dir
+else
+ am_cv_$1_dependencies_compiler_type=none
+fi
+])
+AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
+AM_CONDITIONAL([am__fastdep$1], [
+ test "x$enable_dependency_tracking" != xno \
+ && test "$am_cv_$1_dependencies_compiler_type" = gcc3])
+])
+
+
+# AM_SET_DEPDIR
+# -------------
+# Choose a directory name for dependency files.
+# This macro is AC_REQUIREd in _AM_DEPENDENCIES
+AC_DEFUN([AM_SET_DEPDIR],
+[AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
+])
+
+
+# AM_DEP_TRACK
+# ------------
+AC_DEFUN([AM_DEP_TRACK],
+[AC_ARG_ENABLE(dependency-tracking,
+[ --disable-dependency-tracking speeds up one-time build
+ --enable-dependency-tracking do not reject slow dependency extractors])
+if test "x$enable_dependency_tracking" != xno; then
+ am_depcomp="$ac_aux_dir/depcomp"
+ AMDEPBACKSLASH='\'
+fi
+AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
+AC_SUBST([AMDEPBACKSLASH])dnl
+_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl
+])
+
+# Generate code to set up dependency tracking. -*- Autoconf -*-
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+#serial 5
+
+# _AM_OUTPUT_DEPENDENCY_COMMANDS
+# ------------------------------
+AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
+[{
+ # Autoconf 2.62 quotes --file arguments for eval, but not when files
+ # are listed without --file. Let's play safe and only enable the eval
+ # if we detect the quoting.
+ case $CONFIG_FILES in
+ *\'*) eval set x "$CONFIG_FILES" ;;
+ *) set x $CONFIG_FILES ;;
+ esac
+ shift
+ for mf
+ do
+ # Strip MF so we end up with the name of the file.
+ mf=`echo "$mf" | sed -e 's/:.*$//'`
+ # Check whether this is an Automake generated Makefile or not.
+ # We used to match only the files named `Makefile.in', but
+ # some people rename them; so instead we look at the file content.
+ # Grep'ing the first line is not enough: some people post-process
+ # each Makefile.in and add a new line on top of each file to say so.
+ # Grep'ing the whole file is not good either: AIX grep has a line
+ # limit of 2048, but all sed's we know have understand at least 4000.
+ if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
+ dirpart=`AS_DIRNAME("$mf")`
+ else
+ continue
+ fi
+ # Extract the definition of DEPDIR, am__include, and am__quote
+ # from the Makefile without running `make'.
+ DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+ test -z "$DEPDIR" && continue
+ am__include=`sed -n 's/^am__include = //p' < "$mf"`
+ test -z "am__include" && continue
+ am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+ # When using ansi2knr, U may be empty or an underscore; expand it
+ U=`sed -n 's/^U = //p' < "$mf"`
+ # Find all dependency output files, they are included files with
+ # $(DEPDIR) in their names. We invoke sed twice because it is the
+ # simplest approach to changing $(DEPDIR) to its actual value in the
+ # expansion.
+ for file in `sed -n "
+ s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+ # Make sure the directory exists.
+ test -f "$dirpart/$file" && continue
+ fdir=`AS_DIRNAME(["$file"])`
+ AS_MKDIR_P([$dirpart/$fdir])
+ # echo "creating $dirpart/$file"
+ echo '# dummy' > "$dirpart/$file"
+ done
+ done
+}
+])# _AM_OUTPUT_DEPENDENCY_COMMANDS
+
+
+# AM_OUTPUT_DEPENDENCY_COMMANDS
+# -----------------------------
+# This macro should only be invoked once -- use via AC_REQUIRE.
+#
+# This code is only required when automatic dependency tracking
+# is enabled. FIXME. This creates each `.P' file that we will
+# need in order to bootstrap the dependency handling code.
+AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
+[AC_CONFIG_COMMANDS([depfiles],
+ [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
+ [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"])
+])
+
+# Do all the work for Automake. -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+# 2005, 2006, 2008, 2009 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 16
+
+# This macro actually does too much. Some checks are only needed if
+# your package does certain things. But this isn't really a big deal.
+
+# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
+# AM_INIT_AUTOMAKE([OPTIONS])
+# -----------------------------------------------
+# The call with PACKAGE and VERSION arguments is the old style
+# call (pre autoconf-2.50), which is being phased out. PACKAGE
+# and VERSION should now be passed to AC_INIT and removed from
+# the call to AM_INIT_AUTOMAKE.
+# We support both call styles for the transition. After
+# the next Automake release, Autoconf can make the AC_INIT
+# arguments mandatory, and then we can depend on a new Autoconf
+# release and drop the old call support.
+AC_DEFUN([AM_INIT_AUTOMAKE],
+[AC_PREREQ([2.62])dnl
+dnl Autoconf wants to disallow AM_ names. We explicitly allow
+dnl the ones we care about.
+m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
+AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
+AC_REQUIRE([AC_PROG_INSTALL])dnl
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+ # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+ # is not polluted with repeated "-I."
+ AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl
+ # test to see if srcdir already configured
+ if test -f $srcdir/config.status; then
+ AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+ fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+ if (cygpath --version) >/dev/null 2>/dev/null; then
+ CYGPATH_W='cygpath -w'
+ else
+ CYGPATH_W=echo
+ fi
+fi
+AC_SUBST([CYGPATH_W])
+
+# Define the identity of the package.
+dnl Distinguish between old-style and new-style calls.
+m4_ifval([$2],
+[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
+ AC_SUBST([PACKAGE], [$1])dnl
+ AC_SUBST([VERSION], [$2])],
+[_AM_SET_OPTIONS([$1])dnl
+dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.
+m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,,
+ [m4_fatal([AC_INIT should be called with package and version arguments])])dnl
+ AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
+ AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
+
+_AM_IF_OPTION([no-define],,
+[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
+ AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl
+
+# Some tools Automake needs.
+AC_REQUIRE([AM_SANITY_CHECK])dnl
+AC_REQUIRE([AC_ARG_PROGRAM])dnl
+AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version})
+AM_MISSING_PROG(AUTOCONF, autoconf)
+AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version})
+AM_MISSING_PROG(AUTOHEADER, autoheader)
+AM_MISSING_PROG(MAKEINFO, makeinfo)
+AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl
+AC_REQUIRE([AM_PROG_MKDIR_P])dnl
+# We need awk for the "check" target. The system "awk" is bad on
+# some platforms.
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
+ [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
+ [_AM_PROG_TAR([v7])])])
+_AM_IF_OPTION([no-dependencies],,
+[AC_PROVIDE_IFELSE([AC_PROG_CC],
+ [_AM_DEPENDENCIES(CC)],
+ [define([AC_PROG_CC],
+ defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_CXX],
+ [_AM_DEPENDENCIES(CXX)],
+ [define([AC_PROG_CXX],
+ defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_OBJC],
+ [_AM_DEPENDENCIES(OBJC)],
+ [define([AC_PROG_OBJC],
+ defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl
+])
+_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl
+dnl The `parallel-tests' driver may need to know about EXEEXT, so add the
+dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro
+dnl is hooked onto _AC_COMPILER_EXEEXT early, see below.
+AC_CONFIG_COMMANDS_PRE(dnl
+[m4_provide_if([_AM_COMPILER_EXEEXT],
+ [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl
+])
+
+dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion. Do not
+dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further
+dnl mangled by Autoconf and run in a shell conditional statement.
+m4_define([_AC_COMPILER_EXEEXT],
+m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])])
+
+
+# When config.status generates a header, we must update the stamp-h file.
+# This file resides in the same directory as the config header
+# that is generated. The stamp files are numbered to have different names.
+
+# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
+# loop where config.status creates the headers, so we can generate
+# our stamp files there.
+AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
+[# Compute $1's index in $config_headers.
+_am_arg=$1
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+ case $_am_header in
+ $_am_arg | $_am_arg:* )
+ break ;;
+ * )
+ _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+ esac
+done
+echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
+
+# Copyright (C) 2001, 2003, 2005, 2008 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_SH
+# ------------------
+# Define $install_sh.
+AC_DEFUN([AM_PROG_INSTALL_SH],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+if test x"${install_sh}" != xset; then
+ case $am_aux_dir in
+ *\ * | *\ *)
+ install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
+ *)
+ install_sh="\${SHELL} $am_aux_dir/install-sh"
+ esac
+fi
+AC_SUBST(install_sh)])
+
+# Copyright (C) 2003, 2005 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# Check whether the underlying file-system supports filenames
+# with a leading dot. For instance MS-DOS doesn't.
+AC_DEFUN([AM_SET_LEADING_DOT],
+[rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+ am__leading_dot=.
+else
+ am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+AC_SUBST([am__leading_dot])])
+
+# Check to see how 'make' treats includes. -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003, 2005, 2009 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 4
+
+# AM_MAKE_INCLUDE()
+# -----------------
+# Check to see how make treats includes.
+AC_DEFUN([AM_MAKE_INCLUDE],
+[am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+ @echo this is the am__doit target
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+AC_MSG_CHECKING([for style of include used by $am_make])
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# Ignore all kinds of additional output from `make'.
+case `$am_make -s -f confmf 2> /dev/null` in #(
+*the\ am__doit\ target*)
+ am__include=include
+ am__quote=
+ _am_result=GNU
+ ;;
+esac
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+ echo '.include "confinc"' > confmf
+ case `$am_make -s -f confmf 2> /dev/null` in #(
+ *the\ am__doit\ target*)
+ am__include=.include
+ am__quote="\""
+ _am_result=BSD
+ ;;
+ esac
+fi
+AC_SUBST([am__include])
+AC_SUBST([am__quote])
+AC_MSG_RESULT([$_am_result])
+rm -f confinc confmf
+])
+
+# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*-
+
+# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 6
+
+# AM_MISSING_PROG(NAME, PROGRAM)
+# ------------------------------
+AC_DEFUN([AM_MISSING_PROG],
+[AC_REQUIRE([AM_MISSING_HAS_RUN])
+$1=${$1-"${am_missing_run}$2"}
+AC_SUBST($1)])
+
+
+# AM_MISSING_HAS_RUN
+# ------------------
+# Define MISSING if not defined so far and test if it supports --run.
+# If it does, set am_missing_run to use it, otherwise, to nothing.
+AC_DEFUN([AM_MISSING_HAS_RUN],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+AC_REQUIRE_AUX_FILE([missing])dnl
+if test x"${MISSING+set}" != xset; then
+ case $am_aux_dir in
+ *\ * | *\ *)
+ MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
+ *)
+ MISSING="\${SHELL} $am_aux_dir/missing" ;;
+ esac
+fi
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+ am_missing_run="$MISSING --run "
+else
+ am_missing_run=
+ AC_MSG_WARN([`missing' script is too old or missing])
+fi
+])
+
+# Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_MKDIR_P
+# ---------------
+# Check for `mkdir -p'.
+AC_DEFUN([AM_PROG_MKDIR_P],
+[AC_PREREQ([2.60])dnl
+AC_REQUIRE([AC_PROG_MKDIR_P])dnl
+dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P,
+dnl while keeping a definition of mkdir_p for backward compatibility.
+dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile.
+dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of
+dnl Makefile.ins that do not define MKDIR_P, so we do our own
+dnl adjustment using top_builddir (which is defined more often than
+dnl MKDIR_P).
+AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl
+case $mkdir_p in
+ [[\\/$]]* | ?:[[\\/]]*) ;;
+ */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
+esac
+])
+
+# Helper functions for option handling. -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003, 2005, 2008 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 4
+
+# _AM_MANGLE_OPTION(NAME)
+# -----------------------
+AC_DEFUN([_AM_MANGLE_OPTION],
+[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
+
+# _AM_SET_OPTION(NAME)
+# ------------------------------
+# Set option NAME. Presently that only means defining a flag for this option.
+AC_DEFUN([_AM_SET_OPTION],
+[m4_define(_AM_MANGLE_OPTION([$1]), 1)])
+
+# _AM_SET_OPTIONS(OPTIONS)
+# ----------------------------------
+# OPTIONS is a space-separated list of Automake options.
+AC_DEFUN([_AM_SET_OPTIONS],
+[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
+
+# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
+# -------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+AC_DEFUN([_AM_IF_OPTION],
+[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008, 2009
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PATH_PYTHON([MINIMUM-VERSION], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
+# ---------------------------------------------------------------------------
+# Adds support for distributing Python modules and packages. To
+# install modules, copy them to $(pythondir), using the python_PYTHON
+# automake variable. To install a package with the same name as the
+# automake package, install to $(pkgpythondir), or use the
+# pkgpython_PYTHON automake variable.
+#
+# The variables $(pyexecdir) and $(pkgpyexecdir) are provided as
+# locations to install python extension modules (shared libraries).
+# Another macro is required to find the appropriate flags to compile
+# extension modules.
+#
+# If your package is configured with a different prefix to python,
+# users will have to add the install directory to the PYTHONPATH
+# environment variable, or create a .pth file (see the python
+# documentation for details).
+#
+# If the MINIMUM-VERSION argument is passed, AM_PATH_PYTHON will
+# cause an error if the version of python installed on the system
+# doesn't meet the requirement. MINIMUM-VERSION should consist of
+# numbers and dots only.
+AC_DEFUN([AM_PATH_PYTHON],
+ [
+ dnl Find a Python interpreter. Python versions prior to 2.0 are not
+ dnl supported. (2.0 was released on October 16, 2000).
+ m4_define_default([_AM_PYTHON_INTERPRETER_LIST],
+ [python python2 python3 python3.0 python2.5 python2.4 python2.3 python2.2 dnl
+python2.1 python2.0])
+
+ m4_if([$1],[],[
+ dnl No version check is needed.
+ # Find any Python interpreter.
+ if test -z "$PYTHON"; then
+ AC_PATH_PROGS([PYTHON], _AM_PYTHON_INTERPRETER_LIST, :)
+ fi
+ am_display_PYTHON=python
+ ], [
+ dnl A version check is needed.
+ if test -n "$PYTHON"; then
+ # If the user set $PYTHON, use it and don't search something else.
+ AC_MSG_CHECKING([whether $PYTHON version >= $1])
+ AM_PYTHON_CHECK_VERSION([$PYTHON], [$1],
+ [AC_MSG_RESULT(yes)],
+ [AC_MSG_ERROR(too old)])
+ am_display_PYTHON=$PYTHON
+ else
+ # Otherwise, try each interpreter until we find one that satisfies
+ # VERSION.
+ AC_CACHE_CHECK([for a Python interpreter with version >= $1],
+ [am_cv_pathless_PYTHON],[
+ for am_cv_pathless_PYTHON in _AM_PYTHON_INTERPRETER_LIST none; do
+ test "$am_cv_pathless_PYTHON" = none && break
+ AM_PYTHON_CHECK_VERSION([$am_cv_pathless_PYTHON], [$1], [break])
+ done])
+ # Set $PYTHON to the absolute path of $am_cv_pathless_PYTHON.
+ if test "$am_cv_pathless_PYTHON" = none; then
+ PYTHON=:
+ else
+ AC_PATH_PROG([PYTHON], [$am_cv_pathless_PYTHON])
+ fi
+ am_display_PYTHON=$am_cv_pathless_PYTHON
+ fi
+ ])
+
+ if test "$PYTHON" = :; then
+ dnl Run any user-specified action, or abort.
+ m4_default([$3], [AC_MSG_ERROR([no suitable Python interpreter found])])
+ else
+
+ dnl Query Python for its version number. Getting [:3] seems to be
+ dnl the best way to do this; it's what "site.py" does in the standard
+ dnl library.
+
+ AC_CACHE_CHECK([for $am_display_PYTHON version], [am_cv_python_version],
+ [am_cv_python_version=`$PYTHON -c "import sys; sys.stdout.write(sys.version[[:3]])"`])
+ AC_SUBST([PYTHON_VERSION], [$am_cv_python_version])
+
+ dnl Use the values of $prefix and $exec_prefix for the corresponding
+ dnl values of PYTHON_PREFIX and PYTHON_EXEC_PREFIX. These are made
+ dnl distinct variables so they can be overridden if need be. However,
+ dnl general consensus is that you shouldn't need this ability.
+
+ AC_SUBST([PYTHON_PREFIX], ['${prefix}'])
+ AC_SUBST([PYTHON_EXEC_PREFIX], ['${exec_prefix}'])
+
+ dnl At times (like when building shared libraries) you may want
+ dnl to know which OS platform Python thinks this is.
+
+ AC_CACHE_CHECK([for $am_display_PYTHON platform], [am_cv_python_platform],
+ [am_cv_python_platform=`$PYTHON -c "import sys; sys.stdout.write(sys.platform)"`])
+ AC_SUBST([PYTHON_PLATFORM], [$am_cv_python_platform])
+
+
+ dnl Set up 4 directories:
+
+ dnl pythondir -- where to install python scripts. This is the
+ dnl site-packages directory, not the python standard library
+ dnl directory like in previous automake betas. This behavior
+ dnl is more consistent with lispdir.m4 for example.
+ dnl Query distutils for this directory. distutils does not exist in
+ dnl Python 1.5, so we fall back to the hardcoded directory if it
+ dnl doesn't work.
+ AC_CACHE_CHECK([for $am_display_PYTHON script directory],
+ [am_cv_python_pythondir],
+ [if test "x$prefix" = xNONE
+ then
+ am_py_prefix=$ac_default_prefix
+ else
+ am_py_prefix=$prefix
+ fi
+ am_cv_python_pythondir=`$PYTHON -c "import sys; from distutils import sysconfig; sys.stdout.write(sysconfig.get_python_lib(0,0,prefix='$am_py_prefix'))" 2>/dev/null ||
+ echo "$PYTHON_PREFIX/lib/python$PYTHON_VERSION/site-packages"`
+ case $am_cv_python_pythondir in
+ $am_py_prefix*)
+ am__strip_prefix=`echo "$am_py_prefix" | sed 's|.|.|g'`
+ am_cv_python_pythondir=`echo "$am_cv_python_pythondir" | sed "s,^$am__strip_prefix,$PYTHON_PREFIX,"`
+ ;;
+ esac
+ ])
+ AC_SUBST([pythondir], [$am_cv_python_pythondir])
+
+ dnl pkgpythondir -- $PACKAGE directory under pythondir. Was
+ dnl PYTHON_SITE_PACKAGE in previous betas, but this naming is
+ dnl more consistent with the rest of automake.
+
+ AC_SUBST([pkgpythondir], [\${pythondir}/$PACKAGE])
+
+ dnl pyexecdir -- directory for installing python extension modules
+ dnl (shared libraries)
+ dnl Query distutils for this directory. distutils does not exist in
+ dnl Python 1.5, so we fall back to the hardcoded directory if it
+ dnl doesn't work.
+ AC_CACHE_CHECK([for $am_display_PYTHON extension module directory],
+ [am_cv_python_pyexecdir],
+ [if test "x$exec_prefix" = xNONE
+ then
+ am_py_exec_prefix=$am_py_prefix
+ else
+ am_py_exec_prefix=$exec_prefix
+ fi
+ am_cv_python_pyexecdir=`$PYTHON -c "import sys; from distutils import sysconfig; sys.stdout.write(sysconfig.get_python_lib(1,0,prefix='$am_py_exec_prefix'))" 2>/dev/null ||
+ echo "$PYTHON_EXEC_PREFIX/lib/python$PYTHON_VERSION/site-packages"`
+ case $am_cv_python_pyexecdir in
+ $am_py_exec_prefix*)
+ am__strip_prefix=`echo "$am_py_exec_prefix" | sed 's|.|.|g'`
+ am_cv_python_pyexecdir=`echo "$am_cv_python_pyexecdir" | sed "s,^$am__strip_prefix,$PYTHON_EXEC_PREFIX,"`
+ ;;
+ esac
+ ])
+ AC_SUBST([pyexecdir], [$am_cv_python_pyexecdir])
+
+ dnl pkgpyexecdir -- $(pyexecdir)/$(PACKAGE)
+
+ AC_SUBST([pkgpyexecdir], [\${pyexecdir}/$PACKAGE])
+
+ dnl Run any user-specified action.
+ $2
+ fi
+
+])
+
+
+# AM_PYTHON_CHECK_VERSION(PROG, VERSION, [ACTION-IF-TRUE], [ACTION-IF-FALSE])
+# ---------------------------------------------------------------------------
+# Run ACTION-IF-TRUE if the Python interpreter PROG has version >= VERSION.
+# Run ACTION-IF-FALSE otherwise.
+# This test uses sys.hexversion instead of the string equivalent (first
+# word of sys.version), in order to cope with versions such as 2.2c1.
+# This supports Python 2.0 or higher. (2.0 was released on October 16, 2000).
+AC_DEFUN([AM_PYTHON_CHECK_VERSION],
+ [prog="import sys
+# split strings by '.' and convert to numeric. Append some zeros
+# because we need at least 4 digits for the hex conversion.
+# map returns an iterator in Python 3.0 and a list in 2.x
+minver = list(map(int, '$2'.split('.'))) + [[0, 0, 0]]
+minverhex = 0
+# xrange is not present in Python 3.0 and range returns an iterator
+for i in list(range(0, 4)): minverhex = (minverhex << 8) + minver[[i]]
+sys.exit(sys.hexversion < minverhex)"
+ AS_IF([AM_RUN_LOG([$1 -c "$prog"])], [$3], [$4])])
+
+# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_RUN_LOG(COMMAND)
+# -------------------
+# Run COMMAND, save the exit status in ac_status, and log it.
+# (This has been adapted from Autoconf's _AC_RUN_LOG macro.)
+AC_DEFUN([AM_RUN_LOG],
+[{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD
+ ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+ (exit $ac_status); }])
+
+# Check to make sure that the build environment is sane. -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 5
+
+# AM_SANITY_CHECK
+# ---------------
+AC_DEFUN([AM_SANITY_CHECK],
+[AC_MSG_CHECKING([whether build environment is sane])
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Reject unsafe characters in $srcdir or the absolute working directory
+# name. Accept space and tab only in the latter.
+am_lf='
+'
+case `pwd` in
+ *[[\\\"\#\$\&\'\`$am_lf]]*)
+ AC_MSG_ERROR([unsafe absolute working directory name]);;
+esac
+case $srcdir in
+ *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*)
+ AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);;
+esac
+
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments. Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+ set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+ if test "$[*]" = "X"; then
+ # -L didn't work.
+ set X `ls -t "$srcdir/configure" conftest.file`
+ fi
+ rm -f conftest.file
+ if test "$[*]" != "X $srcdir/configure conftest.file" \
+ && test "$[*]" != "X conftest.file $srcdir/configure"; then
+
+ # If neither matched, then we have a broken ls. This can happen
+ # if, for instance, CONFIG_SHELL is bash and it inherits a
+ # broken ls alias from the environment. This has actually
+ # happened. Such a system could not be considered "sane".
+ AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken
+alias in your environment])
+ fi
+
+ test "$[2]" = conftest.file
+ )
+then
+ # Ok.
+ :
+else
+ AC_MSG_ERROR([newly created file is older than distributed files!
+Check your system clock])
+fi
+AC_MSG_RESULT(yes)])
+
+# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_STRIP
+# ---------------------
+# One issue with vendor `install' (even GNU) is that you can't
+# specify the program used to strip binaries. This is especially
+# annoying in cross-compiling environments, where the build's strip
+# is unlikely to handle the host's binaries.
+# Fortunately install-sh will honor a STRIPPROG variable, so we
+# always use install-sh in `make install-strip', and initialize
+# STRIPPROG with the value of the STRIP variable (set by the user).
+AC_DEFUN([AM_PROG_INSTALL_STRIP],
+[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'. However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+dnl Don't test for $cross_compiling = yes, because it might be `maybe'.
+if test "$cross_compiling" != no; then
+ AC_CHECK_TOOL([STRIP], [strip], :)
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+AC_SUBST([INSTALL_STRIP_PROGRAM])])
+
+# Copyright (C) 2006, 2008 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# _AM_SUBST_NOTMAKE(VARIABLE)
+# ---------------------------
+# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in.
+# This macro is traced by Automake.
+AC_DEFUN([_AM_SUBST_NOTMAKE])
+
+# AM_SUBST_NOTMAKE(VARIABLE)
+# ---------------------------
+# Public sister of _AM_SUBST_NOTMAKE.
+AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
+
+# Check how to create a tarball. -*- Autoconf -*-
+
+# Copyright (C) 2004, 2005 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# _AM_PROG_TAR(FORMAT)
+# --------------------
+# Check how to create a tarball in format FORMAT.
+# FORMAT should be one of `v7', `ustar', or `pax'.
+#
+# Substitute a variable $(am__tar) that is a command
+# writing to stdout a FORMAT-tarball containing the directory
+# $tardir.
+# tardir=directory && $(am__tar) > result.tar
+#
+# Substitute a variable $(am__untar) that extract such
+# a tarball read from stdin.
+# $(am__untar) < result.tar
+AC_DEFUN([_AM_PROG_TAR],
+[# Always define AMTAR for backward compatibility.
+AM_MISSING_PROG([AMTAR], [tar])
+m4_if([$1], [v7],
+ [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'],
+ [m4_case([$1], [ustar],, [pax],,
+ [m4_fatal([Unknown tar format])])
+AC_MSG_CHECKING([how to create a $1 tar archive])
+# Loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
+_am_tools=${am_cv_prog_tar_$1-$_am_tools}
+# Do not fold the above two line into one, because Tru64 sh and
+# Solaris sh will not grok spaces in the rhs of `-'.
+for _am_tool in $_am_tools
+do
+ case $_am_tool in
+ gnutar)
+ for _am_tar in tar gnutar gtar;
+ do
+ AM_RUN_LOG([$_am_tar --version]) && break
+ done
+ am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
+ am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
+ am__untar="$_am_tar -xf -"
+ ;;
+ plaintar)
+ # Must skip GNU tar: if it does not support --format= it doesn't create
+ # ustar tarball either.
+ (tar --version) >/dev/null 2>&1 && continue
+ am__tar='tar chf - "$$tardir"'
+ am__tar_='tar chf - "$tardir"'
+ am__untar='tar xf -'
+ ;;
+ pax)
+ am__tar='pax -L -x $1 -w "$$tardir"'
+ am__tar_='pax -L -x $1 -w "$tardir"'
+ am__untar='pax -r'
+ ;;
+ cpio)
+ am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
+ am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
+ am__untar='cpio -i -H $1 -d'
+ ;;
+ none)
+ am__tar=false
+ am__tar_=false
+ am__untar=false
+ ;;
+ esac
+
+ # If the value was cached, stop now. We just wanted to have am__tar
+ # and am__untar set.
+ test -n "${am_cv_prog_tar_$1}" && break
+
+ # tar/untar a dummy directory, and stop if the command works
+ rm -rf conftest.dir
+ mkdir conftest.dir
+ echo GrepMe > conftest.dir/file
+ AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
+ rm -rf conftest.dir
+ if test -s conftest.tar; then
+ AM_RUN_LOG([$am__untar <conftest.tar])
+ grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
+ fi
+done
+rm -rf conftest.dir
+
+AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
+AC_MSG_RESULT([$am_cv_prog_tar_$1])])
+AC_SUBST([am__tar])
+AC_SUBST([am__untar])
+]) # _AM_PROG_TAR
+
diff --git a/align.py b/align.py
new file mode 100755
index 0000000..da60525
--- /dev/null
+++ b/align.py
@@ -0,0 +1,257 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2009 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch, Naga Samrat Chowdary Narla,
+#
+
+__version__ = '5.0'
+__title__ = 'Printer Cartridge Alignment Utility'
+__mod__ = 'hp-align'
+__doc__ = "Cartridge alignment utility for HPLIP supported inkjet printers. (Note: Not all printers require the use of this utility)."
+
+# Std Lib
+import sys
+import re
+import getopt
+import operator
+import os
+
+# Local
+from base.g import *
+from base import device, status, utils, maint, tui, module
+from prnt import cups
+
+
+def enterAlignmentNumber(letter, hortvert, colors, line_count, maximum):
+ ok, value = tui.enter_range("From the printed Alignment page, Enter the best aligned value for line %s (1-%d): " %
+ (letter, maximum),
+ 1,
+ maximum)
+ if not ok:
+ sys.exit(0)
+
+ return ok, value
+
+
+def enterPaperEdge(maximum):
+ ok, value = tui.enter_range("Enter numbered arrow that is best aligned with the paper edge (1-%d): "
+ % maximum,
+ 1,
+ maximum)
+ if not ok:
+ sys.exit(0)
+
+ return ok, value
+
+
+def colorAdj(line, maximum):
+ ok, value = tui.enter_range("Enter the numbered box on line %s that is best color matched to the background color (1-%d): " %
+ (line, maximum),
+ 1,
+ maximum)
+ if not ok:
+ sys.exit(0)
+
+ return ok, value
+
+
+def bothPensRequired():
+ log.error("Cannot perform alignment with 0 or 1 cartridges installed.\nPlease install both cartridges and try again.")
+
+
+def invalidPen():
+ log.error("Invalid cartridge(s) installed.\nPlease install valid cartridges and try again.")
+
+
+def invalidPen2():
+ log.error("Invalid cartridge(s) installed. Cannot align with only the photo cartridge installed.\nPlease install other cartridges and try again.")
+
+
+def aioUI1():
+ log.info("To perform alignment, you will need the alignment page that is automatically\nprinted after you install a print cartridge.")
+ log.info("\np\t\tPrint the alignment page and continue.")
+ log.info("n\t\tDo Not print the alignment page (you already have one) and continue.")
+ log.info("q\t\tQuit.\n")
+
+ ok, choice = tui.enter_choice("Choice (p=print page*, n=do not print page, q=quit) ? ", ['p', 'n', 'q'], 'p')
+
+ if choice == 'q':
+ sys.exit(0)
+
+ return choice == 'y'
+
+
+def type10and11and14Align(pattern, align_type):
+ controls = maint.align10and11and14Controls(pattern, align_type)
+ values = []
+ s_controls = controls.keys()
+ s_controls.sort()
+
+ for line in s_controls:
+ if not controls[line][0]:
+ values.append(0)
+ else:
+ ok, value = tui.enter_range("Enter the numbered box on line %s where the inner lines best line up with the outer lines (1-%d): "
+ % (line, controls[line][1]), 1, controls[line][1])
+ values.append(value)
+
+ if not ok:
+ sys.exit(0)
+
+ return values
+
+
+def aioUI2():
+ log.info("")
+ log.info(log.bold("Follow these steps to complete the alignment:"))
+ log.info("1. Place the alignment page, with the printed side facing down, ")
+ log.info(" in the scanner.")
+ log.info("2. Press the Enter or Scan button on the printer.")
+ log.info('3. "Alignment Complete" will be displayed when the process is finished (on some models).')
+
+
+
+
+try:
+ mod = module.Module(__mod__, __title__, __version__, __doc__, None,
+ (INTERACTIVE_MODE, GUI_MODE), (UI_TOOLKIT_QT4,))
+
+ mod.setUsage(module.USAGE_FLAG_DEVICE_ARGS,
+ see_also_list=['hp-clean', 'hp-colorcal', 'hp-linefeedcal',
+ 'hp-pqdiag'])
+
+ opts, device_uri, printer_name, mode, ui_toolkit, lang = \
+ mod.parseStdOpts()
+
+ device_uri = mod.getDeviceUri(device_uri, printer_name,
+ filter={'align-type': (operator.ne, ALIGN_TYPE_NONE)})
+
+ if mode == GUI_MODE:
+ if not utils.canEnterGUIMode4():
+ log.error("%s -u/--gui requires Qt4 GUI support. Entering interactive mode." % __mod__)
+ mode = INTERACTIVE_MODE
+
+ if mode == INTERACTIVE_MODE:
+ try:
+ d = device.Device(device_uri, printer_name)
+ except Error, e:
+ log.error("Unable to open device: %s" % e.msg)
+ sys.exit(0)
+
+ try:
+ try:
+ d.open()
+ except Error:
+ log.error("Device is busy or in an error state. Please check device and try again.")
+ sys.exit(1)
+
+ if d.isIdleAndNoError():
+ align_type = d.mq.get('align-type', ALIGN_TYPE_NONE)
+ log.debug("Alignment type=%d" % align_type)
+ d.close()
+
+ if align_type == ALIGN_TYPE_UNSUPPORTED:
+ log.error("Alignment through HPLIP not supported for this printer. Please use the printer's front panel to perform cartrdige alignment.")
+
+ elif align_type == ALIGN_TYPE_AUTO:
+ maint.AlignType1PML(d, tui.load_paper_prompt)
+
+ elif align_type == ALIGN_TYPE_AIO:
+ maint.AlignType13(d, tui.load_paper_prompt, tui.load_scanner_for_align_prompt)
+
+ elif align_type == ALIGN_TYPE_8XX:
+ maint.AlignType2(d, tui.load_paper_prompt, enterAlignmentNumber,
+ bothPensRequired)
+
+ elif align_type in (ALIGN_TYPE_9XX,ALIGN_TYPE_9XX_NO_EDGE_ALIGN):
+ maint.AlignType3(d, tui.load_paper_prompt, enterAlignmentNumber,
+ enterPaperEdge, update_spinner)
+
+ elif align_type == ALIGN_TYPE_LIDIL_AIO:
+ maint.AlignType6(d, aioUI1, aioUI2, tui.load_paper_prompt)
+
+ elif align_type == ALIGN_TYPE_DESKJET_450:
+ maint.AlignType8(d, tui.load_paper_prompt, enterAlignmentNumber)
+
+ elif align_type in (ALIGN_TYPE_LIDIL_0_3_8, ALIGN_TYPE_LIDIL_0_4_3, ALIGN_TYPE_LIDIL_VIP):
+
+ maint.AlignxBow(d, align_type, tui.load_paper_prompt, enterAlignmentNumber, enterPaperEdge,
+ invalidPen, colorAdj)
+
+ elif align_type == ALIGN_TYPE_LBOW:
+ maint.AlignType10(d, tui.load_paper_prompt, type10and11and14Align)
+
+ elif align_type == ALIGN_TYPE_LIDIL_0_5_4:
+ maint.AlignType11(d, tui.load_paper_prompt, type10and11and14Align, invalidPen2)
+
+ elif align_type == ALIGN_TYPE_OJ_PRO:
+ maint.AlignType12(d, tui.load_paper_prompt)
+
+ elif align_type == ALIGN_TYPE_LIDIL_DJ_D1600:
+ maint.AlignType14(d, tui.load_paper_prompt, type10and11and14Align, invalidPen2)
+
+ elif align_type == ALIGN_TYPE_LEDM:
+ maint.AlignType15(d, tui.load_paper_prompt, aioUI2)
+
+ elif align_type == ALIGN_TYPE_LEDM_MANUAL:
+ maint.AlignType16(d, tui.load_paper_prompt, enterAlignmentNumber)
+
+ elif align_type == ALIGN_TYPE_LEDM_FF_CC_0:
+ maint.AlignType17(d, tui.load_paper_prompt, aioUI2)
+
+ else:
+ log.error("Invalid alignment type.")
+
+ else:
+ log.error("Device is busy or in an error state. Please check device and try again.")
+
+ finally:
+ d.close()
+
+ else: # GUI_MODE (qt4)
+ try:
+ from PyQt4.QtGui import QApplication
+ from ui4.aligndialog import AlignDialog
+ except ImportError:
+ log.error("Unable to load Qt4 support. Is it installed?")
+ sys.exit(1)
+
+
+ #try:
+ if 1:
+ app = QApplication(sys.argv)
+
+ dlg = AlignDialog(None, device_uri)
+ dlg.show()
+ try:
+ log.debug("Starting GUI loop...")
+ app.exec_()
+ except KeyboardInterrupt:
+ sys.exit(0)
+
+ #finally:
+ if 1:
+ sys.exit(0)
+
+except KeyboardInterrupt:
+ log.error("User exit")
+
+
+log.info("")
+log.info('Done.')
diff --git a/base/LedmWifi.py b/base/LedmWifi.py
new file mode 100644
index 0000000..4e77209
--- /dev/null
+++ b/base/LedmWifi.py
@@ -0,0 +1,475 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2009 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Shunmugaraj.K
+#
+
+# StdLib
+import time
+import cStringIO
+import xml.parsers.expat
+from string import *
+
+# Local
+from base.g import *
+from base import device, utils
+
+http_result_pat = re.compile("""HTTP/\d.\d\s(\d+)""", re.I)
+HTTP_OK = 200
+HTTP_ACCEPTED = 202
+HTTP_NOCONTENT = 204
+HTTP_ERROR = 500
+
+MAX_RETRIES = 2
+
+LEDM_WIFI_BASE_URI = "/IoMgmt/Adapters/"
+
+adapterPowerXml = """<io:Adapters xmlns:io=\"http://www.hp.com/schemas/imaging/con/ledm/iomgmt/2008/11/30\" xmlns:dd=\"http://www.hp.com/schemas/imaging/con/dictionaries/1.0/\"><io:Adapter><io:HardwareConfig><dd:Power>%s</dd:Power></io:HardwareConfig></io:Adapter></io:Adapters>"""
+
+passPhraseXml="""<io:Profile xmlns:io="http://www.hp.com/schemas/imaging/con/ledm/iomgmt/2008/11/30" xmlns:dd="http://www.hp.com/schemas/imaging/con/dictionaries/1.0/" xmlns:wifi="http://www.hp.com/schemas/imaging/con/wifi/2009/06/26" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.hp.com/schemas/imaging/con/ledm/iomgmt/2008/11/30 ../../schemas/IoMgmt.xsd http://www.hp.com/schemas/imaging/con/dictionaries/1.0/ ../../schemas/dd/DataDictionaryMasterLEDM.xsd"><io:AdapterProfile><io:WifiProfile><wifi:SSID>%s</wifi:SSID><wifi:CommunicationMode>%s</wifi:CommunicationMode><wifi:EncryptionType>%s</wifi:EncryptionType><wifi:AuthenticationMode>%s</wifi:AuthenticationMode></io:WifiProfile></io:AdapterProfile></io:Profile>"""
+
+keyInfoXml = """<io:KeyInfo><io:WpaPassPhraseInfo><wifi:RsnEncryption>AESOrTKIP</wifi:RsnEncryption><wifi:RsnAuthorization>autoWPA</wifi:RsnAuthorization><wifi:PassPhrase>%s</wifi:PassPhrase></io:WpaPassPhraseInfo></io:KeyInfo>"""
+
+def getAdaptorList(dev):
+ ret,params,elementCount,code ={},{},0,HTTP_ERROR
+ max_tries = 0
+ while max_tries < MAX_RETRIES:
+ max_tries +=1
+ URI = LEDM_WIFI_BASE_URI[0:len(LEDM_WIFI_BASE_URI)-1]# to remove "\" from the string
+ params,code,elementCount = readXmlDataFromURI(dev,URI,'<io:Adapters', '<io:Adapter>')
+ if code == HTTP_OK:
+ break
+
+ if code != HTTP_OK:
+ log.error("Request Failed With Response Code %d"%code)
+ return ret
+
+ ret['adaptorlistlength'] = elementCount
+ if params is not None:
+ if elementCount == 1:
+ try:
+ ret['adaptorid-0' % a] = params['io:adapters-io:adapter-map:resourcenode-map:resourcelink-dd:resourceuri']
+ ret['adaptorname-0' % a] = params['io:adapters-io:adapter-io:hardwareconfig-dd:name']
+ ret['adaptorpresence-0' % a] = ''
+ ret['adaptorstate-0' % a] = ''
+ ret['adaptortype-0' % a] = params['io:adapters-io:adapter-io:hardwareconfig-dd:deviceconnectivityporttype']
+ except KeyError, e:
+ log.error("Missing response key: %s" % e)
+ else:
+ for a in xrange(elementCount):
+ try:
+ ret['adaptorid-%d' % a] = params['io:adapters-io:adapter-map:resourcenode-map:resourcelink-dd:resourceuri-%d' % a]
+ ret['adaptorname-%d' % a] = params['io:adapters-io:adapter-io:hardwareconfig-dd:name-%d' % a]
+ ret['adaptorpresence-%d' % a] = ''
+ ret['adaptorstate-%d' % a] = ''
+ ret['adaptortype-%d' % a] = params['io:adapters-io:adapter-io:hardwareconfig-dd:deviceconnectivityporttype-%d' % a]
+ except KeyError, e:
+ log.error("Missing response key: %s" % e)
+ return ret
+
+
+def getWifiAdaptorID(dev):
+ ret = {}
+
+ ret = getAdaptorList(dev)
+ try:
+ num_adaptors = ret['adaptorlistlength']
+ except KeyError:
+ num_adaptors = 0
+
+ for n in xrange(num_adaptors):
+ try:
+ name = ret['adaptortype-%d' % n]
+ except KeyError:
+ name = ''
+
+ if name.lower() in ('wifiembedded', 'wifiaccessory'):
+ params = ['adaptorid', 'adaptorname', 'adaptorstate', 'adaptorpresence']
+ r = []
+ for p in params:
+ try:
+ x = ret[''.join([p, '-', str(n)])]
+ except KeyError:
+ if p == 'adaptorid':
+ x = -1
+ else:
+ x = 'Unknown'
+
+ r.append(x)
+
+ return r
+
+ return -1, 'Unknown', 'Unknown', 'Unknown'
+
+def setAdaptorPower(dev, adapterName, adaptor_id=0, power_state='on'):
+ ret,powerXml,URI,code = {},'','',HTTP_ERROR
+ URI = LEDM_WIFI_BASE_URI + adapterName
+ powerXml = adapterPowerXml %(power_state)
+
+ ret['errorreturn'] = writeXmlDataToURI(dev,URI,powerXml,10)
+ if not(ret['errorreturn'] == HTTP_OK or HTTP_NOCONTENT):
+ log.error("Request Failed With Response Code %d" %code)
+
+ return ret
+
+def performScan(dev, adapterName, ssid=None):
+ ret ={}
+
+ if ssid is None:
+ URI = LEDM_WIFI_BASE_URI + adapterName + "/WifiNetworks"
+ else:
+ URI = LEDM_WIFI_BASE_URI + adapterName + "/WifiNetworks/SSID="+ssid
+
+ while True:
+ params,code,elementCount = readXmlDataFromURI(dev,URI,'<io:WifiNetworks', '<io:WifiNetwork>',10)
+ if code == HTTP_ACCEPTED:
+ continue
+ else:
+ break
+
+ ret['numberofscanentries'] = elementCount
+ if code != HTTP_OK:
+ log.error("Request Failed With Response Code %d"%code)
+ return ret
+
+ if params is not None:
+ if elementCount == 1:
+ try:
+ ssid = str(params['io:wifinetworks-io:wifinetwork-wifi:ssid']).decode("hex")
+ if not ssid:
+ ret['ssid-0'] = u'(unknown)'
+ else:
+ ret['ssid-0'] = ssid
+ ret['bssid-0'] = str(params['io:wifinetworks-io:wifinetwork-wifi:bssid']).decode("hex")
+ ret['channel-0'] = params['io:wifinetworks-io:wifinetwork-wifi:channel']
+ ret['communicationmode-0'] = params['io:wifinetworks-io:wifinetwork-wifi:communicationmode']
+ ret['dbm-0'] = params['io:wifinetworks-io:wifinetwork-io:signalinfo-wifi:dbm']
+ ret['encryptiontype-0'] = params['io:wifinetworks-io:wifinetwork-wifi:encryptiontype']
+ ret['signalstrength-0'] = params['io:wifinetworks-io:wifinetwork-io:signalinfo-wifi:signalstrength']
+ except KeyError, e:
+ log.error("Missing response key: %s" % e)
+ else:
+ for a in xrange(elementCount):
+ try:
+ ssid = str(params['io:wifinetworks-io:wifinetwork-wifi:ssid-%d' % a]).decode("hex")
+ if not ssid:
+ ret['ssid-%d' % a] = u'(unknown)'
+ else:
+ ret['ssid-%d' % a] = ssid
+ ret['bssid-%d' % a] = str(params['io:wifinetworks-io:wifinetwork-wifi:bssid-%d' % a]).decode("hex")
+ ret['channel-%d' % a] = params['io:wifinetworks-io:wifinetwork-wifi:channel-%d' % a]
+ ret['communicationmode-%d' % a] = params['io:wifinetworks-io:wifinetwork-wifi:communicationmode-%d' % a]
+ ret['dbm-%d' % a] = params['io:wifinetworks-io:wifinetwork-io:signalinfo-wifi:dbm-%d' % a]
+ ret['encryptiontype-%d' % a] = params['io:wifinetworks-io:wifinetwork-wifi:encryptiontype-%d' % a]
+ ret['signalstrength-%d' % a] = params['io:wifinetworks-io:wifinetwork-io:signalinfo-wifi:signalstrength-%d' % a]
+
+ except KeyError, e:
+ log.error("Missing response key: %s" % e)
+ try:
+ ret['signalstrengthmax'] = 5
+ ret['signalstrengthmin'] = 0
+ except KeyError, e:
+ log.debug("Missing response key: %s" % e)
+ return ret
+
+def getIPConfiguration(dev, adapterName):
+ ip, hostname, addressmode, subnetmask, gateway, pridns, sec_dns = \
+ '0.0.0.0', 'Unknown', 'Unknown', '0.0.0.0', '0.0.0.0', '0.0.0.0', '0.0.0.0'
+
+ URI = LEDM_WIFI_BASE_URI + adapterName + "/Protocols"
+ params,code,elementCount = {},HTTP_ERROR,0
+ max_tries = 0
+
+ while max_tries < MAX_RETRIES:
+ max_tries +=1
+ params,code,elementCount = readXmlDataFromURI(dev,URI,'<io:Protocol', '<io:Protocol')
+ if code == HTTP_OK:
+ break
+
+ if code != HTTP_OK:
+ log.error("Request Failed With Response Code %d" %code)
+ return ip, hostname, addressmode, subnetmask, gateway, pridns, sec_dns
+
+ if params is not None and code == HTTP_OK:
+ try:
+ ip = params['io:protocols-io:protocol-io:addresses-io:ipv4addresses-io:ipv4address-dd:ipv4address']
+ subnetmask = params['io:protocols-io:protocol-io:addresses-io:ipv4addresses-io:ipv4address-dd:subnetmask']
+ gateway = params['io:protocols-io:protocol-io:addresses-io:ipv4addresses-io:ipv4address-dd:defaultgateway']
+
+ if 'DHCP' in params['io:protocols-io:protocol-io:addresses-io:ipv4addresses-io:ipv4address-dd:configmethod']:
+ addressmode = 'dhcp'
+ else:
+ addressmode = 'autoip'
+ if elementCount ==1:
+ pridns = params['io:protocols-io:protocol-dd:dnsserveripaddress']
+ sec_dns = params['io:protocols-io:protocol-dd:secondarydnsserveripaddress']
+ for a in xrange(elementCount):
+ if params['io:protocols-io:protocol-dd:dnsserveripaddress-%d' %a] !="::":
+ pridns = params['io:protocols-io:protocol-dd:dnsserveripaddress-%d' %a]
+ sec_dns = params['io:protocols-io:protocol-dd:secondarydnsserveripaddress-%d' %a]
+ break
+ except KeyError, e:
+ log.error("Missing response key: %s" % str(e))
+
+ return ip, hostname, addressmode, subnetmask, gateway, pridns, sec_dns
+
+
+def getCryptoSuite(dev, adapterName):
+ alg, mode, secretid = '', '', ''
+ parms,code,elementCount ={},HTTP_ERROR,0
+ URI = LEDM_WIFI_BASE_URI + adapterName + "/Profiles/Active"
+ max_tries = 0
+
+ while max_tries < MAX_RETRIES:
+ max_tries +=1
+ parms,code,elementCount = readXmlDataFromURI(dev,URI,'<io:Profile', '<io:Profile')
+ if code == HTTP_OK:
+ break
+
+ if code !=HTTP_OK:
+ log.error("Request Failed With Response Code %d" %code)
+ return alg, mode, secretid
+
+ if parms is not None:
+ try:
+ mode = parms['io:profile-io:adapterprofile-io:wifiprofile-wifi:communicationmode']
+ alg = parms['io:profile-io:adapterprofile-io:wifiprofile-wifi:encryptiontype']
+ secretid = parms['io:profile-io:adapterprofile-io:wifiprofile-wifi:bssid']
+ except KeyError, e:
+ log.error("Missing response key: %s" % str(e))
+
+ return alg, mode, secretid
+
+
+def associate(dev, adapterName, ssid, communication_mode, encryption_type, key):
+ ret,code = {},HTTP_ERROR
+ URI = LEDM_WIFI_BASE_URI + adapterName + "/Profiles/Active"
+
+ if encryption_type == 'none':
+ authMode = 'open'
+ ppXml = passPhraseXml%(ssid.encode('hex'),communication_mode,encryption_type,authMode)
+ else:
+ authMode = encryption_type
+ pos = passPhraseXml.find("</io:WifiProfile>",0,len(passPhraseXml))
+ ppXml = (passPhraseXml[:pos] + keyInfoXml + passPhraseXml[pos:])%(ssid.encode('hex'),communication_mode,encryption_type,\
+ authMode,key.encode('hex'))
+
+ code = writeXmlDataToURI(dev,URI,ppXml,10)
+ ret['errorreturn'] = code
+ if not(code == HTTP_OK or HTTP_NOCONTENT):
+ log.error("Request Failed With Response Code %d" % ret['errorreturn'])
+
+ return ret
+
+
+def getVSACodes(dev, adapterName):
+ ret,params,code,elementCount = [],{},HTTP_ERROR,0
+ severity,rule ='',''
+ URI = LEDM_WIFI_BASE_URI + adapterName + "/VsaCodes.xml"
+ max_tries = 0
+
+ while max_tries < MAX_RETRIES:
+ max_tries +=1
+ params,code,elementCount = readXmlDataFromURI(dev,URI,"<io:VsaCodes","<io:VsaCodes",10)
+ if code == HTTP_OK:
+ break
+
+ if code != HTTP_OK:
+ log.error("Request Failed With Response Code %d"%code)
+ return ret
+
+ if params is not None:
+ try:
+ severity= params['io:vsacodes-wifi:vsacode-dd:severity']
+ except:
+ severity = ""
+ try:
+ rule = params['io:vsacodes-wifi:vsacode-wifi:rulenumber']
+ # except KeyError, e:
+ # log.error("Missing response key: %s" % str(e))
+ except:
+ rule = ""
+ ret.append((rule, severity))
+ return ret
+
+
+def getHostname(dev):
+ hostName = ''
+ URI = "/IoMgmt/IoConfig.xml"
+ max_tries = 0
+
+ while max_tries < MAX_RETRIES:
+ max_tries +=1
+ params,code,elementCount = readXmlDataFromURI(dev,URI,'<io:IoConfig', '<io:IoConfig')
+ if code == HTTP_OK:
+ break
+
+ if code != HTTP_OK:
+ log.error("Request failed with Response code %d"%code)
+ return hostName
+
+ if params is not None:
+ try:
+ hostName = params['io:ioconfig-io:iodeviceconfig-dd3:hostname']
+ except KeyError, e:
+ log.error("Missing response key: %s" % e)
+
+ return hostName
+
+def getSignalStrength(dev, adapterName, ssid, adaptor_id=0):
+ ss_max, ss_min, ss_val, ss_dbm = 5, 0, 0, -200
+ params,code,elementCount = {},HTTP_ERROR,0
+
+ if ssid is not None:
+ URI = LEDM_WIFI_BASE_URI + adapterName + "/WifiNetworks/SSID="+ssid
+ else:
+ return ss_max, ss_min, ss_val, ss_dbm
+
+ while True:
+ params,code,elementCount = readXmlDataFromURI(dev,URI,'<io:WifiNetworks', '<io:WifiNetwork>',10)
+ if code == HTTP_ACCEPTED:
+ log.info("Got Response as HTTP_ACCEPTED, so retrying to get the actual result")
+ continue
+ else:
+ break
+
+ if code != HTTP_OK:
+ log.error("Request Failed With Response Code %d"%code)
+ return ss_max, ss_min, ss_val, ss_dbm
+
+ if params is not None:
+ if elementCount == 1:
+ try:
+ ss_dbm = params['io:wifinetworks-io:wifinetwork-io:signalinfo-wifi:dbm']
+ ss_val = params['io:wifinetworks-io:wifinetwork-io:signalinfo-wifi:signalstrength']
+ except KeyError, e:
+ log.error("Missing response key: %s" % e)
+
+ return ss_max, ss_min, ss_val, ss_dbm
+
+
+def readXmlDataFromURI(dev,URI,xmlRootNode,xmlChildNode,timeout=5):
+ params,code,elementCount ={},HTTP_ERROR,0
+
+ data = format_http_get(URI,0,"")
+ log.info(data)
+ response = cStringIO.StringIO()
+ if dev.openLEDM() == -1:
+ dev.openEWS_LEDM()
+ dev.writeEWS_LEDM(data)
+ try:
+ while dev.readEWS_LEDM(1024, response, timeout):
+ pass
+ except Error:
+ dev.closeEWS_LEDM()
+ log.error("Unable to read EWS_LEDM Channel")
+ else:
+ dev.writeLEDM(data)
+
+ #response = cStringIO.StringIO()
+ try:
+ while dev.readLEDM(1024, response, timeout):
+ pass
+ except Error:
+ dev.closeLEDM()
+ log.error("Unable to read LEDM Channel")
+ #dev.closeEWS_LEDM()
+ strResp = str(response.getvalue())
+ #log.error(strResp)
+ if strResp is not None:
+ code = get_error_code(strResp)
+ pos = strResp.find(xmlRootNode,0,len(strResp))
+ repstr = strResp[pos:].strip()
+ repstr = filter(lambda c: c not in "\r\t\n", repstr) # To remove formating characters from the received xml
+ repstr = repstr.rstrip('0') # To remove trailing zero from the received xml
+ elementCount = repstr.count(xmlChildNode)
+ try:
+ params = utils.XMLToDictParser().parseXML(repstr)
+ except xml.parsers.expat.ExpatError, e:
+ log.error("XML parser failed: %s" % e)
+
+ return params,code,elementCount
+
+
+def writeXmlDataToURI(dev,URI,xml,timeout=5):
+ code = HTTP_ERROR
+
+ data = format_http_put(URI,len(xml),xml)
+ response = cStringIO.StringIO()
+
+ if dev.openLEDM() == -1:
+ dev.openEWS_LEDM()
+ dev.writeEWS_LEDM(data)
+ try:
+ while dev.readEWS_LEDM(1000, response, timeout):
+ pass
+ except Error:
+ dev.closeEWS_LEDM()
+ log.error("Unable to read EWS_LEDM Channel")
+
+ else:
+ dev.writeLEDM(data)
+ #response = cStringIO.StringIO()
+ try:
+ while dev.readLEDM(1000, response, timeout):
+ pass
+ except Error:
+ dev.closeLEDM()
+ log.error("Unable to read LEDM Channel")
+
+
+ strResp = str(response.getvalue())
+ if strResp is not None:
+ code = get_error_code(strResp)
+ return code
+
+
+def get_error_code(ret):
+ if not ret: return HTTP_ERROR
+ match = http_result_pat.match(ret)
+ if match is None: return HTTP_ERROR
+ try:
+ code = int(match.group(1))
+ except (ValueError, TypeError):
+ code = HTTP_ERROR
+ return code
+
+
+def format_http_get(requst, ledmlen, xmldata, content_type="text/xml; charset=utf-8"):
+ host = 'localhost'
+ return utils.cat(
+"""GET $requst HTTP/1.1\r
+Host: $host\r
+User-Agent: hplip/3.0\r
+Content-Type: $content_type\r
+Content-Length: $ledmlen\r
+\r
+$xmldata""")
+
+
+def format_http_put(requst, ledmlen, xmldata, content_type="text/xml; charset=utf-8"):
+ host = 'localhost'
+ return utils.cat(
+"""PUT $requst HTTP/1.1\r
+Host: $host\r
+User-Agent: hplip/3.0\r
+Content-Type: $content_type\r
+Content-Length: $ledmlen\r
+\r
+$xmldata""")
+
diff --git a/base/__init__.py b/base/__init__.py
new file mode 100644
index 0000000..e4b6d28
--- /dev/null
+++ b/base/__init__.py
@@ -0,0 +1,19 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2008 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+
diff --git a/base/codes.py b/base/codes.py
new file mode 100644
index 0000000..6b93567
--- /dev/null
+++ b/base/codes.py
@@ -0,0 +1,885 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2009 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch, Naga Samrat Chowdary Narla, Yashwant Sahu
+#
+#
+# NOTE: This module is safe for 'from codes import *'
+#
+
+
+# GUI/Console modes
+INTERACTIVE_MODE = 0 # -i
+GUI_MODE = 1 # -u
+NON_INTERACTIVE_MODE = 2 # -n
+BROWSER_MODE = 3 # -w
+
+# Supported UI toolkits
+UI_TOOLKIT_QT3 = 0
+UI_TOOLKIT_QT4 = 1
+UI_TOOLKIT_GTK = 2 # Not used
+
+# device types (CUPS queue or SANE types)
+DEVICE_TYPE_UNKNOWN = 0
+DEVICE_TYPE_PRINTER = 1 # hp:
+DEVICE_TYPE_SCANNER = 2 # hpaio:
+DEVICE_TYPE_FAX = 3 # hpfax:
+DEVICE_TYPE_COPIER = 4 # not used
+
+# Error Codes generated by HPMUD or raise Error(code) or func return
+# Add 5000 to code for event code
+ERROR_SUCCESS = 0
+ERROR_UNKNOWN_ERROR = 1
+ERROR_DEVICE_NOT_FOUND = 2 # MUD: HPMUD_R_INVALID_DEVICE
+ERROR_INVALID_DEVICE_ID = 3 # MUD: HPMUD_R_INVALID_DESCRIPTOR
+ERROR_INVALID_DEVICE_URI = 4 # MUD: HPMUD_R_INVALID_URI
+ERROR_DATA_LENGTH_EXCEEDS_MAX = 8 # MUD: HPMUD_R_INVALID_LENGTH
+ERROR_DEVICE_IO_ERROR = 12 # MUD: HPMUD_R_IO_ERROR
+ERROR_NO_PROBED_DEVICES_FOUND = 18
+ERROR_DEVICE_BUSY = 21 # MUD: HPMUD_R_DEVICE_BUSY
+ERROR_DEVICE_STATUS_NOT_AVAILABLE = 26
+ERROR_INVALID_SERVICE_NAME = 28 # MUD: HPMUD_R_INVALID_SN
+ERROR_ERROR_INVALID_CHANNEL_ID = 30 # MUD: HPMUD_R_INVALID_CHANNEL_ID
+ERROR_CHANNEL_BUSY = 31 # MUD: HPMUD_R_INVALID_STATE
+ERROR_DEVICE_DOES_NOT_SUPPORT_OPERATION = 34
+ERROR_DEVICEOPEN_FAILED = 37 # MUD: HPMUD_R_INVALID_DEVICE_OPEN
+ERROR_INVALID_DEVNODE = 38 # MUD: HPMUD_R_INVALID_DEVICE_NODE
+ERROR_INVALID_HOSTNAME = 45 # MUD: HPMUD_R_INVALID_IP
+ERROR_INVALID_PORT_NUMBER = 46 # MUD: HPMUD_R_INVALID_IP_PORT
+ERROR_INVALID_TIMEOUT = 47 # MUD: HPMUD_R_INVALID_TIMEOUT
+ERROR_DATFILE_ERROR = 48 # MUD: HPMUD_R_DATFILE_ERROR
+ERROR_IO_TIMEOUT = 49 # MUD: HPMUD_R_IO_TIMEOUT
+ERROR_FAX_INCOMPATIBLE_OPTIONS = 50
+ERROR_FAX_INVALID_FAX_FILE = 51
+ERROR_NO_CUPS_QUEUE_FOUND_FOR_DEVICE = 55
+ERROR_FAX_FILE_NOT_FOUND = 57
+ERROR_INVALID_ARGUMENT = 58
+# --> add new codes here <--
+ERROR_INTERNAL = 99
+# If you add new codes, also add the appropriate description
+# to g.py for exception description strings.
+# Thank you, The Management
+
+
+# Event and status codes
+# These are used for the 'status-code' returned by DeviceQuery (STATUS_*)
+# and by the event-code used by Event (EVENT_* + STATUS_*)
+
+# If you add a new EVENT/STATUS code, please add the appropriate
+# entry into the STATUS_TO_ERROR_STATE_MAP
+
+STATUS_UNKNOWN = 0
+
+EVENT_MIN_USER_EVENT = 500
+EVENT_START_PRINT_JOB = 500 # sent by hp: backend
+EVENT_END_PRINT_JOB = 501 # sent by hp: backend
+EVENT_PRINT_FAILED_MISSING_PLUGIN = 502
+
+EVENT_START_FAX_PRINT_JOB = 600 # sent by hpfax: backend
+EVENT_END_FAX_PRINT_JOB = 601 # sent by hpfax: backend
+
+EVENT_PRINTER_QUEUE_STOPPED = 700
+EVENT_PRINTER_QUEUE_STARTED = 701
+EVENT_PRINTER_QUEUE_REJECTING_JOBS = 702
+EVENT_PRINTER_QUEUE_ACCEPTING_JOBS = 703
+EVENT_PRINTER_QUEUE_SET_AS_DEFAULT = 704
+
+EVENT_FAX_QUEUE_STOPPED = 800
+EVENT_FAX_QUEUE_STARTED = 801
+EVENT_FAX_QUEUE_REJECTING_JOBS = 802
+EVENT_FAX_QUEUE_ACCEPTING_JOBS = 803
+EVENT_FAX_QUEUE_SET_AS_DEFAULT = 804
+EVENT_FAX_FAILED_MISSING_PLUGIN = 805
+
+STATUS_PRINTER_BASE = 1000
+STATUS_PRINTER_IDLE = 1000
+STATUS_PRINTER_BUSY = 1001
+STATUS_PRINTER_PRINTING = 1002
+STATUS_PRINTER_TURNING_OFF = 1003
+STATUS_PRINTER_REPORT_PRINTING = 1004
+STATUS_PRINTER_CANCELING = 1005
+STATUS_PRINTER_IO_STALL = 1006
+STATUS_PRINTER_DRY_WAIT_TIME = 1007
+STATUS_PRINTER_PEN_CHANGE = 1008
+STATUS_PRINTER_OUT_OF_PAPER = 1009
+STATUS_PRINTER_BANNER_EJECT = 1010
+STATUS_PRINTER_BANNER_MISMATCH = 1011
+STATUS_PRINTER_PHOTO_MISMATCH = 1012
+STATUS_PRINTER_DUPLEX_MISMATCH = 1013
+STATUS_PRINTER_MEDIA_JAM = 1014
+STATUS_PRINTER_CARRIAGE_STALL = 1015
+STATUS_PRINTER_PAPER_STALL = 1016
+STATUS_PRINTER_PEN_FAILURE = 1017
+STATUS_PRINTER_HARD_ERROR = 1018
+STATUS_PRINTER_POWER_DOWN = 1019
+STATUS_PRINTER_FRONT_PANEL_TEST = 1020
+STATUS_PRINTER_CLEAN_OUT_TRAY_MISSING = 1021
+STATUS_PRINTER_OUTPUT_BIN_FULL = 1022
+STATUS_PRINTER_MEDIA_SIZE_MISMATCH = 1023
+STATUS_PRINTER_MANUAL_DUPLEX_BLOCK = 1024
+STATUS_PRINTER_SERVCE_STALL = 1025
+STATUS_PRINTER_OUT_OF_INK = 1026 # Also used for out of toner
+STATUS_PRINTER_LIO_ERROR = 1027
+STATUS_PRINTER_PUMP_STALL = 1028
+STATUS_PRINTER_TRAY_2_MISSING = 1029
+STATUS_PRINTER_DUPLEXER_MISSING = 1030
+STATUS_PRINTER_REAR_TRAY_MISSING = 1031
+STATUS_PRINTER_PEN_NOT_LATCHED = 1032
+STATUS_PRINTER_BATTERY_VERY_LOW = 1033
+STATUS_PRINTER_SPITTOON_FULL = 1034
+STATUS_PRINTER_OUTPUT_TRAY_CLOSED = 1035
+STATUS_PRINTER_MANUAL_FEED_BLOCKED = 1036
+STATUS_PRINTER_REAR_FEED_BLOCKED = 1037
+STATUS_PRINTER_TRAY_2_OUT_OF_PAPER = 1038
+STATUS_PRINTER_UNABLE_TO_LOAD_FROM_LOCKED_TRAY = 1039
+STATUS_PRINTER_NON_HP_INK = 1040
+STATUS_PRINTER_PEN_CALIBRATION_RESUME = 1041
+STATUS_PRINTER_MEDIA_TYPE_MISMATCH = 1042
+STATUS_PRINTER_CUSTOM_MEDIA_MISMATCH = 1043
+STATUS_PRINTER_PEN_CLEANING = 1044
+STATUS_PRINTER_PEN_CHECKING = 1045
+STATUS_PRINTER_POWER_SAVE = 1046
+STATUS_PRINTER_CARTRIDGE_WRONG = 1047
+STATUS_PRINTER_CARTRIDGE_MISSING = 1048
+STATUS_PRINTER_PRINTHEAD_MISSING = 1049
+
+# derived codes
+# set to AGENT_TYPE + base (base: 1500=ink, 1600=laser )
+STATUS_PRINTER_LOW_INK_BASE = 1500
+STATUS_PRINTER_LOW_BLACK_INK = 1501
+STATUS_PRINTER_LOW_TRI_COLOR_INK = 1502
+STATUS_PRINTER_LOW_PHOTO_INK = 1503
+STATUS_PRINTER_LOW_CYAN_INK = 1504
+STATUS_PRINTER_LOW_MAGENTA_INK = 1505
+STATUS_PRINTER_LOW_YELLOW_INK = 1506
+STATUS_PRINTER_LOW_PHOTO_CYAN_INK = 1507
+STATUS_PRINTER_LOW_PHOTO_MAGENTA_INK = 1508
+STATUS_PRINTER_LOW_PHOTO_YELLOW_INK = 1509
+STATUS_PRINTER_LOW_PHOTO_GRAY_INK = 1510
+STATUS_PRINTER_LOW_PHOTO_BLUE_INK = 1511
+
+STATUS_PRINTER_LOW_TONER_BASE = 1600
+STATUS_PRINTER_LOW_BLACK_TONER = 1601
+STATUS_PRINTER_LOW_CYAN_TONER = 1604
+STATUS_PRINTER_LOW_MAGENTA_TONER = 1605
+STATUS_PRINTER_LOW_YELLOW_TONER = 1606
+# end
+
+# derived laserjet codes
+STATUS_PRINTER_WARMING_UP = 1800
+STATUS_PRINTER_LOW_PAPER = 1801
+STATUS_PRINTER_DOOR_OPEN = 1802
+STATUS_PRINTER_OFFLINE = 1803
+STATUS_PRINTER_LOW_TONER = 1804
+STATUS_PRINTER_NO_TONER = 1805
+STATUS_PRINTER_SERVICE_REQUEST = 1806
+STATUS_PRINTER_FUSER_ERROR = 1807
+#end
+
+# other derived codes
+STATUS_DEVICE_UNSUPPORTED = 1900
+#end
+
+# scan
+EVENT_START_SCAN_JOB = 2000
+EVENT_END_SCAN_JOB = 2001
+EVENT_SCANNER_FAIL = 2002
+EVENT_SCAN_FAILED_MISSING_PLUGIN = 2003
+EVENT_SCAN_ADF_LOADED = 2004
+EVENT_SCAN_TO_DESTINATION_NOTSET = 2005
+EVENT_SCAN_WAITING_FOR_PC = 2006
+EVENT_SCAN_ADF_JAM = 2007
+EVENT_SCAN_ADF_DOOR_OPEN = 2008
+EVENT_SCAN_CANCEL = 2009
+EVENT_SIZE_WARNING = 2010
+EVENT_SCAN_ADF_NO_DOCS = 2011
+EVENT_SCAN_ADF_MISPICK = 2012
+EVENT_SCAN_BUSY = 2013
+#end
+
+# fax
+EVENT_START_FAX_JOB = 3000
+EVENT_END_FAX_JOB = 3001
+EVENT_FAX_JOB_FAIL = 3002
+EVENT_FAX_JOB_CANCELED = 3003
+STATUS_FAX_TX_ACTIVE = 3004
+STATUS_FAX_RX_ACTIVE = 3005
+EVENT_FAX_DIALING = 3006
+EVENT_FAX_CONNECTING = 3007
+EVENT_FAX_SEND_ERROR = 3008
+EVENT_FAX_ERROR_STORAGE_FULL = 3009
+EVENT_FAX_RECV_ERROR = 3010
+EVENT_FAX_BLOCKING = 3011
+#end
+
+# copy
+EVENT_START_COPY_JOB = 4000
+EVENT_END_COPY_JOB = 4001
+EVENT_COPY_JOB_FAIL = 4002
+EVENT_COPY_JOB_CANCELED = 4003
+#end
+
+# Adding the ERROR_CODE_BASE to the above
+# ERROR codes will produce a event/status code
+# e.g., EVENT_ERROR_DEVICE_NOT_FOUND=2 -> 5002 status/event code
+ERROR_CODE_BASE = 5000
+EVENT_ERROR_SUCCESS = 5000
+EVENT_ERROR_UNKNOWN_ERROR = 5001
+EVENT_ERROR_DEVICE_NOT_FOUND = 5002
+EVENT_ERROR_INVALID_DEVICE_ID = 5003
+EVENT_ERROR_INVALID_DEVICE_URI = 5004
+EVENT_ERROR_DATA_LENGTH_EXCEEDS_MAX = 5008
+EVENT_ERROR_DEVICE_IO_ERROR = 5012
+EVENT_ERROR_NO_PROBED_DEVICES_FOUND = 5018
+EVENT_ERROR_DEVICE_BUSY = 5021
+EVENT_ERROR_DEVICE_STATUS_NOT_AVAILABLE = 5026
+EVENT_ERROR_INVALID_SERVICE_NAME = 5028
+EVENT_ERROR_ERROR_INVALID_CHANNEL_ID = 5030
+EVENT_ERROR_CHANNEL_BUSY = 5031
+EVENT_ERROR_DEVICE_DOES_NOT_SUPPORT_OPERATION = 5034
+EVENT_ERROR_DEVICEOPEN_FAILED_ONE_DEVICE_ONLY = 5037
+EVENT_ERROR_DEVICEOPEN_FAILED_DEV_NODE_MOVED = 5038
+# end
+
+# diagnosis tool codes
+EVENT_ADD_PRINTQUEUE = 5501
+EVENT_DIAGNOSE_PRINTQUEUE = 5502
+#end
+
+# pcard
+EVENT_START_PCARD_JOB = 6000
+EVENT_END_PCARD_JOB = 6001
+EVENT_PCARD_JOB_FAIL = 6002
+EVENT_PCARD_UNABLE_TO_MOUNT = 6003
+EVENT_PCARD_FILES_TRANSFERED = 6004
+# end
+
+# maint
+EVENT_START_MAINT_JOB = 6050 # used for polling control (if print not used)
+EVENT_END_MAINT_JOB = 6051
+
+EVENT_MAX_USER_EVENT = 7999
+# end of user events
+# start of internal events
+
+# fax (internal events)
+EVENT_FAX_MIN = 8000
+EVENT_FAX_RENDER_COMPLETE = 8000
+EVENT_FAX_WAITING = 8001 # Sent by hpssd to toolbox when fax is waiting
+EVENT_FAX_ADDRESS_BOOK_UPDATED = 8002 # Sent by FAB to indicate that the dB has changed
+EVENT_FAX_MAX = 8999
+# end
+
+# UI
+EVENT_MIN_UI_EVENT = 9000
+EVENT_CUPS_QUEUES_CHANGED = 9000 # sent by hp-setup if queues added (or removed)
+EVENT_RAISE_DEVICE_MANAGER = 9001
+#EVENT_JOB_STORAGE_UI_REQUEST = 9002 # sent by hplipjs CUPS filter for job storage UI
+EVENT_HISTORY_UPDATE = 9003 # sent by hp-systray to hp-toolbox when a device's history changes
+EVENT_USER_CONFIGURATION_CHANGED = 9004 # sent when ~/.hplip/hplip.conf has been changed by another app.
+EVENT_SYS_CONFIGURATION_CHANGED = 9005 # sent when /etc/hp/hplip.conf has been changed by another app.
+EVENT_DEVICE_UPDATE_REQUESTED = 9010
+EVENT_DEVICE_UPDATE_REPLY = 9011
+EVENT_DEVICE_START_POLLING = 9020
+EVENT_DEVICE_STOP_POLLING = 9021
+EVENT_POLLING_REQUEST = 9022
+EVENT_DEVICE_UPDATE_ACTIVE = 9030
+EVENT_DEVICE_UPDATE_INACTIVE = 9031
+EVENT_DEVICE_UPDATE_BLIP = 9032
+EVENT_SYSTEMTRAY_EXIT = 9040
+EVENT_MAX_UI_EVENT = 9999
+
+EVENT_MAX_EVENT = 9999
+
+# do not add any events > 100000 (PJL error code space)
+
+# end of events
+
+
+# Error states
+ERROR_STATE_CLEAR = 0 # Show icon w/o overlay
+ERROR_STATE_OK = 1 # Icon w/ "OK" overlay
+ERROR_STATE_MAX_OK = 99
+ERROR_STATE_WARNING = 100 # Icon w/ triangle "!" overlay
+ERROR_STATE_ERROR = 101 # Icon w/ circle "X" overlay
+ERROR_STATE_LOW_SUPPLIES = 102 # Icon w/ supplies overlay
+ERROR_STATE_BUSY = 103 # Icon with busy overlay
+ERROR_STATE_LOW_PAPER = 104 # Icon w/ paper low overlay
+ERROR_STATE_PRINTING = 105
+ERROR_STATE_SCANNING = 106
+ERROR_STATE_PHOTOCARD = 107
+ERROR_STATE_FAXING = 108
+ERROR_STATE_COPYING = 109
+ERROR_STATE_REFRESHING = 999
+#end
+
+
+# Map of status/event codes to UI states
+STATUS_TO_ERROR_STATE_MAP = {
+ STATUS_UNKNOWN : ERROR_STATE_CLEAR,
+ EVENT_START_PRINT_JOB : ERROR_STATE_BUSY,
+ EVENT_END_PRINT_JOB : ERROR_STATE_OK,
+ EVENT_START_FAX_PRINT_JOB : ERROR_STATE_BUSY,
+ EVENT_END_FAX_PRINT_JOB : ERROR_STATE_FAXING,
+
+ EVENT_PRINTER_QUEUE_STOPPED : ERROR_STATE_WARNING,
+ EVENT_PRINTER_QUEUE_STARTED : ERROR_STATE_CLEAR,
+ EVENT_PRINTER_QUEUE_REJECTING_JOBS : ERROR_STATE_WARNING,
+ EVENT_PRINTER_QUEUE_ACCEPTING_JOBS : ERROR_STATE_CLEAR,
+ EVENT_PRINTER_QUEUE_SET_AS_DEFAULT : ERROR_STATE_OK,
+
+ EVENT_FAX_QUEUE_STOPPED : ERROR_STATE_WARNING,
+ EVENT_FAX_QUEUE_STARTED : ERROR_STATE_CLEAR,
+ EVENT_FAX_QUEUE_REJECTING_JOBS : ERROR_STATE_WARNING,
+ EVENT_FAX_QUEUE_ACCEPTING_JOBS : ERROR_STATE_CLEAR,
+ EVENT_FAX_QUEUE_SET_AS_DEFAULT : ERROR_STATE_OK,
+
+ STATUS_PRINTER_IDLE : ERROR_STATE_CLEAR,
+ STATUS_PRINTER_BUSY : ERROR_STATE_BUSY,
+ STATUS_PRINTER_POWER_SAVE : ERROR_STATE_CLEAR,
+ STATUS_PRINTER_PRINTING : ERROR_STATE_PRINTING,
+ STATUS_PRINTER_TURNING_OFF : ERROR_STATE_BUSY,
+ STATUS_PRINTER_REPORT_PRINTING : ERROR_STATE_PRINTING,
+ STATUS_PRINTER_CANCELING : ERROR_STATE_BUSY,
+ STATUS_PRINTER_IO_STALL : ERROR_STATE_ERROR,
+ STATUS_PRINTER_DRY_WAIT_TIME : ERROR_STATE_PRINTING,
+ STATUS_PRINTER_PEN_CHANGE : ERROR_STATE_WARNING,
+ STATUS_PRINTER_OUT_OF_PAPER : ERROR_STATE_WARNING,
+ STATUS_PRINTER_BANNER_EJECT : ERROR_STATE_WARNING,
+ STATUS_PRINTER_BANNER_MISMATCH : ERROR_STATE_WARNING,
+ STATUS_PRINTER_PHOTO_MISMATCH : ERROR_STATE_WARNING,
+ STATUS_PRINTER_DUPLEX_MISMATCH : ERROR_STATE_WARNING,
+ STATUS_PRINTER_MEDIA_JAM : ERROR_STATE_ERROR,
+ STATUS_PRINTER_CARRIAGE_STALL : ERROR_STATE_ERROR,
+ STATUS_PRINTER_PAPER_STALL : ERROR_STATE_ERROR,
+ STATUS_PRINTER_PEN_FAILURE : ERROR_STATE_ERROR,
+ STATUS_PRINTER_HARD_ERROR : ERROR_STATE_ERROR,
+ STATUS_PRINTER_POWER_DOWN : ERROR_STATE_ERROR,
+ STATUS_PRINTER_FRONT_PANEL_TEST : ERROR_STATE_ERROR,
+ STATUS_PRINTER_CLEAN_OUT_TRAY_MISSING : ERROR_STATE_ERROR,
+ STATUS_PRINTER_OUTPUT_BIN_FULL : ERROR_STATE_ERROR,
+ STATUS_PRINTER_MEDIA_SIZE_MISMATCH : ERROR_STATE_WARNING,
+ STATUS_PRINTER_MANUAL_DUPLEX_BLOCK : ERROR_STATE_ERROR,
+ STATUS_PRINTER_SERVCE_STALL : ERROR_STATE_ERROR,
+ STATUS_PRINTER_OUT_OF_INK : ERROR_STATE_ERROR,
+ STATUS_PRINTER_LIO_ERROR : ERROR_STATE_ERROR,
+ STATUS_PRINTER_PUMP_STALL : ERROR_STATE_ERROR,
+ STATUS_PRINTER_TRAY_2_MISSING : ERROR_STATE_ERROR,
+ STATUS_PRINTER_DUPLEXER_MISSING : ERROR_STATE_ERROR,
+ STATUS_PRINTER_REAR_TRAY_MISSING : ERROR_STATE_ERROR,
+ STATUS_PRINTER_PEN_NOT_LATCHED : ERROR_STATE_ERROR,
+ STATUS_PRINTER_BATTERY_VERY_LOW : ERROR_STATE_WARNING,
+ STATUS_PRINTER_SPITTOON_FULL : ERROR_STATE_ERROR,
+ STATUS_PRINTER_OUTPUT_TRAY_CLOSED : ERROR_STATE_ERROR,
+ STATUS_PRINTER_MANUAL_FEED_BLOCKED : ERROR_STATE_ERROR,
+ STATUS_PRINTER_REAR_FEED_BLOCKED : ERROR_STATE_ERROR,
+ STATUS_PRINTER_TRAY_2_OUT_OF_PAPER : ERROR_STATE_LOW_PAPER,
+ STATUS_PRINTER_UNABLE_TO_LOAD_FROM_LOCKED_TRAY : ERROR_STATE_ERROR,
+ STATUS_PRINTER_NON_HP_INK : ERROR_STATE_WARNING,
+ STATUS_PRINTER_PEN_CALIBRATION_RESUME : ERROR_STATE_WARNING,
+ STATUS_PRINTER_MEDIA_TYPE_MISMATCH : ERROR_STATE_WARNING,
+ STATUS_PRINTER_CUSTOM_MEDIA_MISMATCH : ERROR_STATE_WARNING,
+ STATUS_PRINTER_PEN_CLEANING : ERROR_STATE_WARNING,
+ STATUS_PRINTER_PEN_CLEANING : ERROR_STATE_WARNING,
+ STATUS_PRINTER_WARMING_UP : ERROR_STATE_BUSY,
+ STATUS_PRINTER_LOW_PAPER : ERROR_STATE_LOW_PAPER,
+ STATUS_PRINTER_DOOR_OPEN : ERROR_STATE_ERROR,
+ STATUS_PRINTER_OFFLINE : ERROR_STATE_ERROR,
+ STATUS_PRINTER_LOW_TONER : ERROR_STATE_LOW_SUPPLIES,
+ STATUS_PRINTER_NO_TONER : ERROR_STATE_LOW_SUPPLIES,
+ STATUS_PRINTER_SERVICE_REQUEST : ERROR_STATE_ERROR,
+ STATUS_PRINTER_FUSER_ERROR : ERROR_STATE_ERROR,
+ STATUS_DEVICE_UNSUPPORTED : ERROR_STATE_ERROR,
+ STATUS_PRINTER_CARTRIDGE_MISSING : ERROR_STATE_ERROR,
+ STATUS_PRINTER_CARTRIDGE_WRONG : ERROR_STATE_ERROR,
+ STATUS_PRINTER_PRINTHEAD_MISSING : ERROR_STATE_ERROR,
+ # The following block are EVENTs because they are only
+ # recieved as events from hpmud, hp backend, etc.
+ # i.e., a device does not produce status codes in this range
+ EVENT_ERROR_SUCCESS : ERROR_STATE_CLEAR,
+ EVENT_ERROR_UNKNOWN_ERROR : ERROR_STATE_ERROR,
+ EVENT_ERROR_DEVICE_NOT_FOUND : ERROR_STATE_ERROR,
+ EVENT_ERROR_INVALID_DEVICE_ID : ERROR_STATE_ERROR,
+ EVENT_ERROR_INVALID_DEVICE_URI : ERROR_STATE_ERROR,
+ EVENT_ERROR_DATA_LENGTH_EXCEEDS_MAX : ERROR_STATE_WARNING,
+ EVENT_ERROR_DEVICE_IO_ERROR : ERROR_STATE_ERROR,
+ EVENT_ERROR_NO_PROBED_DEVICES_FOUND : ERROR_STATE_WARNING,
+ EVENT_ERROR_DEVICE_BUSY : ERROR_STATE_BUSY,
+ EVENT_ERROR_DEVICE_STATUS_NOT_AVAILABLE : ERROR_STATE_ERROR,
+ EVENT_ERROR_INVALID_SERVICE_NAME : ERROR_STATE_ERROR,
+ EVENT_ERROR_ERROR_INVALID_CHANNEL_ID : ERROR_STATE_ERROR,
+ EVENT_ERROR_CHANNEL_BUSY : ERROR_STATE_BUSY,
+ EVENT_ERROR_DEVICE_DOES_NOT_SUPPORT_OPERATION : ERROR_STATE_ERROR,
+ EVENT_ERROR_DEVICEOPEN_FAILED_ONE_DEVICE_ONLY : ERROR_STATE_ERROR,
+ EVENT_ERROR_DEVICEOPEN_FAILED_DEV_NODE_MOVED : ERROR_STATE_ERROR,
+ # Scan
+ EVENT_START_SCAN_JOB : ERROR_STATE_SCANNING,
+ EVENT_END_SCAN_JOB : ERROR_STATE_OK,
+ EVENT_SCANNER_FAIL : ERROR_STATE_ERROR,
+ EVENT_SCAN_ADF_DOOR_OPEN : ERROR_STATE_ERROR,
+ EVENT_SCAN_ADF_JAM : ERROR_STATE_ERROR,
+ EVENT_SCAN_WAITING_FOR_PC : ERROR_STATE_SCANNING,
+ EVENT_SCAN_TO_DESTINATION_NOTSET : ERROR_STATE_ERROR,
+ EVENT_SCAN_ADF_LOADED : ERROR_STATE_OK,
+ EVENT_SCAN_CANCEL : ERROR_STATE_OK,
+ EVENT_SIZE_WARNING : ERROR_STATE_WARNING,
+ EVENT_SCAN_ADF_NO_DOCS : ERROR_STATE_OK,
+ EVENT_SCAN_ADF_MISPICK : ERROR_STATE_WARNING,
+ EVENT_SCAN_BUSY : ERROR_STATE_SCANNING,
+ # Fax
+ EVENT_FAX_DIALING : ERROR_STATE_BUSY,
+ EVENT_FAX_CONNECTING : ERROR_STATE_BUSY,
+ EVENT_START_FAX_JOB : ERROR_STATE_FAXING,
+ STATUS_FAX_TX_ACTIVE : ERROR_STATE_FAXING,
+ STATUS_FAX_RX_ACTIVE : ERROR_STATE_FAXING,
+ EVENT_END_FAX_JOB : ERROR_STATE_OK,
+ EVENT_FAX_JOB_FAIL : ERROR_STATE_ERROR,
+ EVENT_FAX_JOB_CANCELED : ERROR_STATE_ERROR,
+ EVENT_FAX_SEND_ERROR : ERROR_STATE_ERROR,
+ EVENT_FAX_RECV_ERROR : ERROR_STATE_ERROR,
+ EVENT_FAX_ERROR_STORAGE_FULL : ERROR_STATE_WARNING,
+ EVENT_FAX_BLOCKING : ERROR_STATE_ERROR,
+ # Copy
+ EVENT_START_COPY_JOB : ERROR_STATE_COPYING,
+ EVENT_END_COPY_JOB : ERROR_STATE_OK,
+ EVENT_COPY_JOB_FAIL : ERROR_STATE_ERROR,
+ EVENT_COPY_JOB_CANCELED : ERROR_STATE_ERROR,
+ # PCard
+ EVENT_START_PCARD_JOB : ERROR_STATE_PHOTOCARD,
+ EVENT_END_PCARD_JOB : ERROR_STATE_CLEAR,
+ EVENT_PCARD_JOB_FAIL : ERROR_STATE_ERROR,
+ EVENT_PCARD_UNABLE_TO_MOUNT : ERROR_STATE_ERROR,
+ EVENT_PCARD_FILES_TRANSFERED : ERROR_STATE_OK,
+
+ # Low supplies
+ STATUS_PRINTER_LOW_BLACK_INK : ERROR_STATE_LOW_SUPPLIES,
+ STATUS_PRINTER_LOW_TRI_COLOR_INK : ERROR_STATE_LOW_SUPPLIES,
+ STATUS_PRINTER_LOW_PHOTO_INK : ERROR_STATE_LOW_SUPPLIES,
+ STATUS_PRINTER_LOW_CYAN_INK : ERROR_STATE_LOW_SUPPLIES,
+ STATUS_PRINTER_LOW_MAGENTA_INK : ERROR_STATE_LOW_SUPPLIES,
+ STATUS_PRINTER_LOW_YELLOW_INK : ERROR_STATE_LOW_SUPPLIES,
+ STATUS_PRINTER_LOW_PHOTO_CYAN_INK : ERROR_STATE_LOW_SUPPLIES,
+ STATUS_PRINTER_LOW_PHOTO_MAGENTA_INK : ERROR_STATE_LOW_SUPPLIES,
+ STATUS_PRINTER_LOW_PHOTO_YELLOW_INK : ERROR_STATE_LOW_SUPPLIES,
+ STATUS_PRINTER_LOW_PHOTO_GRAY_INK : ERROR_STATE_LOW_SUPPLIES,
+ STATUS_PRINTER_LOW_PHOTO_BLUE_INK : ERROR_STATE_LOW_SUPPLIES,
+
+ STATUS_PRINTER_LOW_BLACK_TONER : ERROR_STATE_LOW_SUPPLIES,
+ STATUS_PRINTER_LOW_CYAN_TONER : ERROR_STATE_LOW_SUPPLIES,
+ STATUS_PRINTER_LOW_MAGENTA_TONER : ERROR_STATE_LOW_SUPPLIES,
+ STATUS_PRINTER_LOW_YELLOW_TONER : ERROR_STATE_LOW_SUPPLIES,
+ # end
+
+}
+
+
+# Device states
+DEVICE_STATE_NOT_FOUND = -1
+DEVICE_STATE_FOUND = 0
+DEVICE_STATE_JUST_FOUND = 1
+
+
+# I/O states
+IO_STATE_HP_OPEN = 0
+IO_STATE_HP_READY = 1
+IO_STATE_HP_NOT_AVAIL = 2
+IO_STATE_NON_HP = 3
+
+#
+# Systray visibility setting
+#
+SYSTRAY_VISIBLE_SHOW_ALWAYS = 0
+SYSTRAY_VISIBLE_HIDE_WHEN_INACTIVE = 1
+SYSTRAY_VISIBLE_HIDE_ALWAYS = 2
+
+#
+# Systray messages setting
+#
+SYSTRAY_MESSAGES_SHOW_ALL = 0
+SYSTRAY_MESSAGES_SHOW_ERRORS_AND_WARNINGS = 1
+SYSTRAY_MESSAGES_SHOW_ERRORS_ONLY = 2
+SYSTRAY_MESSAGES_SHOW_NONE = 3
+
+#
+# Defines for model query types and status query
+#
+
+# agent info
+
+# 'kind'
+AGENT_KIND_NONE = 0
+AGENT_KIND_HEAD = 1 # InkJet head (no ink)
+AGENT_KIND_SUPPLY = 2 # InkJet supply (ink tank)
+AGENT_KIND_HEAD_AND_SUPPLY = 3 # InkJet (cartridge)
+AGENT_KIND_TONER_CARTRIDGE = 4 # LaserJet
+AGENT_KIND_MAINT_KIT = 5 # LaserJet "Maintenance kit (fuser)"
+AGENT_KIND_ADF_KIT = 6 # LaserJet "Document feeder kit"
+AGENT_KIND_DRUM_KIT = 7 # LaserJet
+AGENT_KIND_TRANSFER_KIT = 8 # LaserJet
+AGENT_KIND_INT_BATTERY = 9 # Mobile deskjet (DJ450, etc)
+AGENT_KIND_UNKNOWN = 0x3e # (62)
+
+# 'type'
+AGENT_TYPE_NONE = 0
+AGENT_TYPE_BLACK = 1
+AGENT_TYPE_CMY = 2 # Tricolor
+AGENT_TYPE_KCM = 3 # Photo
+AGENT_TYPE_CYAN = 4
+AGENT_TYPE_MAGENTA = 5
+AGENT_TYPE_YELLOW = 6
+AGENT_TYPE_CYAN_LOW = 7
+AGENT_TYPE_MAGENTA_LOW = 8
+AGENT_TYPE_YELLOW_LOW = 9
+AGENT_TYPE_GGK = 10 # 2 shades of grey and black
+AGENT_TYPE_BLUE = 11
+AGENT_TYPE_KCMY_CM = 12 # K/C/M/Y/LM/LC (02 pen set head)
+AGENT_TYPE_LC_LM = 13 # light cyan and light magenta
+#AGENT_TYPE_Y_M = 14 # yellow and magenta (B9180)
+#AGENT_TYPE_C_K = 15 # cyan and black (B9180)
+AGENT_TYPE_K_Y = 14 # black and yellow (for LJ Pro)
+AGENT_TYPE_C_M = 15 # cyan and magenta (for LJ Pro)
+AGENT_TYPE_LG_PK = 16 # light grey and photo black
+AGENT_TYPE_LG = 17 # light grey
+AGENT_TYPE_G = 18 # medium grey
+AGENT_TYPE_PG = 19 # photo grey
+AGENT_TYPE_BLACK_B8800 = 39 # For PS B8800
+AGENT_TYPE_WHITE = 0x20 # For ISO 10180 compatibility
+AGENT_TYPE_RED = 0x21 # For ISO 10180 compatibility
+AGENT_TYPE_UNSPECIFIED = 0x3e # (62) Used for kind = 5, 6, 7, 8, or 9
+AGENT_TYPE_ERROR = 0x3f # (63)
+
+# 'health'
+AGENT_HEALTH_OK = 0
+AGENT_HEALTH_MISINSTALLED = 1 # supply/cart
+AGENT_HEALTH_FAIR_MODERATE = 1 # head
+AGENT_HEALTH_INCORRECT = 2
+AGENT_HEALTH_FAILED = 3
+AGENT_HEALTH_OVERTEMP = 4 # Battery
+AGENT_HEALTH_CHARGING = 5 # Battery
+AGENT_HEALTH_DISCHARGING = 6 # Battery
+AGENT_HEALTH_UNKNOWN = 0xff
+
+# 'level'
+AGENT_LEVEL_TRIGGER_SUFFICIENT_0 = 0
+AGENT_LEVEL_TRIGGER_SUFFICIENT_1 = 1
+AGENT_LEVEL_TRIGGER_SUFFICIENT_2 = 2
+AGENT_LEVEL_TRIGGER_SUFFICIENT_3 = 3
+AGENT_LEVEL_TRIGGER_SUFFICIENT_4 = 4
+AGENT_LEVEL_TRIGGER_MAY_BE_LOW = 5
+AGENT_LEVEL_TRIGGER_PROBABLY_OUT = 6
+AGENT_LEVEL_TRIGGER_ALMOST_DEFINITELY_OUT = 7
+
+# "Computed" configurations (2-pen products)
+AGENT_CONFIG_NONE = 0
+AGENT_CONFIG_BLACK_ONLY = 1
+AGENT_CONFIG_PHOTO_ONLY = 2
+AGENT_CONFIG_COLOR_ONLY = 3
+AGENT_CONFIG_GREY_ONLY = 4
+AGENT_CONFIG_COLOR_AND_BLACK = 5
+AGENT_CONFIG_COLOR_AND_PHOTO = 6
+AGENT_CONFIG_COLOR_AND_GREY = 7
+AGENT_CONFIG_INVALID = 99
+
+# align-types
+ALIGN_TYPE_UNSUPPORTED = -1
+ALIGN_TYPE_NONE = 0
+ALIGN_TYPE_AUTO = 1
+ALIGN_TYPE_8XX = 2
+ALIGN_TYPE_9XX = 3
+ALIGN_TYPE_LIDIL_0_3_8 = 4
+ALIGN_TYPE_LIDIL_0_4_3 = 5
+ALIGN_TYPE_LIDIL_AIO = 6
+ALIGN_TYPE_LIDIL_VIP = 7
+ALIGN_TYPE_DESKJET_450 = 8
+ALIGN_TYPE_9XX_NO_EDGE_ALIGN = 9
+ALIGN_TYPE_LBOW = 10
+ALIGN_TYPE_LIDIL_0_5_4 = 11
+ALIGN_TYPE_OJ_PRO = 12 # OJ Pro L7xxx
+ALIGN_TYPE_AIO = 13 # AiO Non-LIDIL (OJ J4500/J4600)
+ALIGN_TYPE_LIDIL_DJ_D1600 = 14
+ALIGN_TYPE_LEDM = 15
+ALIGN_TYPE_LEDM_MANUAL = 16
+ALIGN_TYPE_LEDM_FF_CC_0 = 17
+
+# clean-types
+CLEAN_TYPE_UNSUPPORTED = -1
+CLEAN_TYPE_NONE = 0
+CLEAN_TYPE_PCL = 1
+CLEAN_TYPE_LIDIL = 2
+CLEAN_TYPE_PCL_WITH_PRINTOUT = 3
+
+# color-cal-types
+COLOR_CAL_TYPE_UNSUPPORTED = -1
+COLOR_CAL_TYPE_NONE = 0
+COLOR_CAL_TYPE_DESKJET_450 = 1
+COLOR_CAL_TYPE_MALIBU_CRICK = 2
+COLOR_CAL_TYPE_STRINGRAY_LONGBOW_TORNADO = 3
+COLOR_CAL_TYPE_CONNERY = 4
+COLOR_CAL_TYPE_COUSTEAU = 5
+COLOR_CAL_TYPE_CARRIER = 6
+COLOR_CAL_TYPE_TYPHOON = 7
+
+# status-types
+STATUS_TYPE_NONE = 0
+STATUS_TYPE_VSTATUS = 1
+STATUS_TYPE_S = 2
+STATUS_TYPE_LJ = 3
+#STATUS_TYPE_S_W_BATTERY = 4 # DEPRECATED
+#STATUS_TYPE_S_SNMP = 5 # DEPRECATED
+STATUS_TYPE_LJ_XML = 6
+#STATUS_TYPE_S_LIDIL = 7 # DEPRECATED
+STATUS_TYPE_PJL = 8
+STATUS_TYPE_PML_AND_PJL = 9 # Same as types 3(tbx)+8(hp:)
+STATUS_TYPE_LEDM = 10 # Low-end Data Model
+STATUS_TYPE_LEDM_FF_CC_0 = 11 #Low-end Data Model over FF/CC/0 USB channel
+
+# status-battery-check
+STATUS_BATTERY_CHECK_NONE = 0
+STATUS_BATTERY_CHECK_STD = 1 # Deskjet 450/460 (PML or dyn. counters)
+STATUS_BATTERY_CHECK_PML = 2 # Officejet H470 (PML)
+
+# status-dynamic-counters
+STATUS_DYNAMIC_COUNTERS_NONE = 0
+STATUS_DYNAMIC_COUNTERS_PCL = 1
+STATUS_DYNAMIC_COUNTERS_PML_SNMP = 2
+STATUS_DYNAMIC_COUNTERS_LIDIL_0_5_4 = 3 # Deskjet D4100
+
+# tech-types
+TECH_TYPE_NONE = 0
+TECH_TYPE_MONO_INK = 1
+TECH_TYPE_COLOR_INK = 2
+TECH_TYPE_MONO_LASER = 3
+TECH_TYPE_COLOR_LASER = 4
+TECH_TYPE_COLOR_EDGELINE = 5
+
+# support-type
+SUPPORT_TYPE_NONE = 0
+SUPPORT_TYPE_HPIJS = 1
+SUPPORT_TYPE_HPLIP = 2
+
+# fax-types
+FAX_TYPE_NOT_SUPPORTED = -1
+FAX_TYPE_NONE = 0
+FAX_TYPE_BLACK_SEND_EARLY_OPEN = 1 # newer models
+FAX_TYPE_BLACK_SEND_LATE_OPEN = 2 # older models
+FAX_TYPE_BLACK_AND_COLOR_SEND = 3 # future/OZ
+FAX_TYPE_SOAP = 4
+FAX_TYPE_MARVELL = 5
+FAX_TYPE_LEDM = 6
+FAX_TYPE_LEDMSOAP = 7
+
+# pcard-types
+PCARD_TYPE_NONE = 0
+PCARD_TYPE_MLC = 1
+PCARD_TYPE_USB_MASS_STORAGE = 2
+
+# scan-types
+SCAN_TYPE_DIGITAL_SENDER = -2
+SCAN_TYPE_NOT_SUPPORTED = -1
+SCAN_TYPE_NONE = 0
+SCAN_TYPE_SCL = 1
+SCAN_TYPE_PML = 2
+SCAN_TYPE_SOAP = 3
+SCAN_TYPE_MARVEL = 4
+SCAN_TYPE_SOAP2 = 5
+SCAN_TYPE_SCL_DUPLEX = 6
+SCAN_TYPE_LEDM = 7
+SCAN_TYPE_MARVEL2 = 8
+
+# scan-src
+SCAN_SRC_NONE = 0x0
+SCAN_SRC_FLATBED = 0x1
+SCAN_SRC_SCROLLFED = 0x2
+SCAN_SRC_CAMERA = 0x4
+
+# copy-types
+COPY_TYPE_NOT_SUPPORTED = -1
+COPY_TYPE_NONE = 0
+COPY_TYPE_DEVICE = 1 # LaserJet MFP PML
+COPY_TYPE_SCAN_TO_PRINT = 2
+COPY_TYPE_AIO_DEVICE = 3 # Inkjet AiO PML
+
+# 'top_door' (lid)
+TOP_DOOR_NOT_PRESENT = 0
+TOP_DOOR_CLOSED = 1
+TOP_DOOR_OPEN = 2
+
+# 'supply_door'
+SUPPLY_DOOR_NOT_PRESENT = 0
+SUPPLY_DOOR_CLOSED = 1
+SUPPLY_DOOR_OPEN = 2
+
+# 'media_path'
+MEDIA_PATH_NOT_PRESENT = 0 # S:00 means banner not present
+MEDIA_PATH_CUT_SHEET = 1 # S:01 means banner present/engaged
+MEDIA_PATH_BANNER = 2
+MEDIA_PATH_PHOTO = 3
+
+# 'photo_tray'(S:03 photo/hagaki)
+PHOTO_TRAY_NOT_PRESENT = 0
+PHOTO_TRAY_NOT_ENGAGED = 1
+PHOTO_TRAY_ENGAGED = 2
+
+# 'duplexer' (S:02 cleanout)
+DUPLEXER_NOT_PRESENT = 0
+DUPLEXER_DOOR_CLOSED = 1
+DUPLEXER_DOOR_OPEN = 2
+
+# 'in_tray1' & 'in_tray2'
+IN_TRAY_NOT_PRESENT = 0
+IN_TRAY_PRESENT = 1 # for !S:02, test for > IN_TRAY_NOT_PRESENT
+IN_TRAY_DEFAULT = 2 # S:02 only
+IN_TRAY_LOCKED = 3 # S:02 only
+
+# 'io-support'
+IO_SUPPORT_PARALLEL = 0x1
+IO_SUPPORT_USB = 0x2
+IO_SUPPORT_NETWORK = 0x4
+IO_SUPPORT_WIRELESS = 0x8
+IO_SUPPORT_BLUETOOTH = 0x10
+
+# User friendly model categories
+MODEL_TYPE2_UNSUPPORTED = 0
+MODEL_TYPE2_DESKJET = 1
+MODEL_TYPE2_DESKJET_AIO = 2
+MODEL_TYPE2_PHOTOSMART = 3
+MODEL_TYPE2_OFFICEJET = 4
+MODEL_TYPE2_PSC = 5
+MODEL_TYPE2_LASERJET = 6
+MODEL_TYPE2_COLOR_LASERJET = 7
+MODEL_TYPE2_BIJ = 8
+MODEL_TYPE2_EDGELINE = 9
+MODEL_TYPE2_APOLLO = 10
+MODEL_TYPE2_SCANJET = 11 # not supported
+MODEL_TYPE2_DESIGNJET = 12
+MODEL_TYPE2_OTHER = 13 # No specific "sub-brand" (e.g., 910, cp1610)
+
+MONITOR_TYPE_UNSUPPORTED = -1
+MONITOR_TYPE_NONE = 0
+MONITOR_TYPE_STD = 1
+
+# 'io-mode' and 'io-mfp-mode'
+IO_MODE_UNI = 0
+IO_MODE_RAW = 1
+#IO_MODE_NOT_USED = 2
+IO_MODE_DOT4 = 3
+IO_MODE_DOT4_PHOENIX = 4
+IO_MODE_DOT4_BRIDGE = 5
+IO_MODE_MLC_GUSHER = 6
+IO_MODE_MLC_MISER = 7
+
+# plugin
+PLUGIN_NONE = 0
+PLUGIN_REQUIRED = 1
+PLUGIN_OPTIONAL = 2
+
+
+#Plugin installation status values
+PLUGIN_VERSION_MISMATCH = '-1'
+PLUGIN_NOT_INSTALLED = '0'
+PLUGIN_INSTALLED = '1'
+
+# plugin-reason
+PLUGIN_REASON_NONE = 0x0
+PLUGIN_REASON_PRINTING_SUPPORT = 0x1
+PLUGIN_REASON_FASTER_PRINTING = 0x2
+PLUGIN_REASON_BETTER_PRINTING_PQ = 0x4
+PLUGIN_REASON_PRINTING_FEATURES = 0x8
+PLUGIN_REASON_RESERVED_10 = 0x10
+PLUGIN_REASON_RESERVED_20 = 0x20
+PLUGIN_REASON_SCANNING_SUPPORT = 0x40
+PLUGIN_REASON_FASTER_SCANNING = 0x80
+PLUGIN_REASON_BETTER_SCANNING_IQ = 0x100
+PLUGIN_REASON_RESERVED_200 = 0x200
+PLUGIN_REASON_RESERVED_400 = 0x400
+PLUGIN_REASON_FAXING_SUPPORT = 0x800
+PLUGIN_REASON_FAX_FEATURES = 0x1000
+PLUGIN_REASON_RESERVED_2000 = 0x2000
+PLUGIN_REASON_IO_SUPPORT = 0x4000
+PLUGIN_REASON_UI_FEATURES = 0x8000
+PLUGIN_REASON_OTHER_FEATURES = 0x10000
+PLUGIN_REASON_RESERVED_20000 = 0x20000
+PLUGIN_REASON_RESERVED_40000 = 0x40000
+
+# embedded web server
+EWS_NOT_SUPPORTED = -1
+EWS_NONE = 0
+EWS_PRESENT = 1
+
+# panel check
+PANEL_CHECK_TYPE_NONE = 0
+PANEL_CHECK_TYPE_CHECK = 1
+
+# pq diag
+PQ_DIAG_TYPE_UNSUPPORTED = -1
+PQ_DIAG_TYPE_NONE = 0
+PQ_DIAG_TYPE_1 = 1
+PQ_DIAG_TYPE_2 = 2
+
+# line feed cal
+LINEFEED_CAL_TYPE_UNSUPPORTED = -1
+LINEFEED_CAL_TYPE_NONE = 0
+LINEFEED_CAL_TYPE_OJ_K550 = 1
+LINEFEED_CAL_TYPE_OJ_PRO_L7XXX = 2
+
+# power-settings
+POWER_SETTINGS_NONE = 0
+POWER_SETTINGS_EPML = 1 # DJ450/DJ460
+POWER_SETTINGS_PML = 2 # OJ H470
+
+# Paper types (for hp-toolbox paper prompts)
+PAPER_TYPE_PLAIN = 0
+PAPER_TYPE_HP_ADV_PHOTO = 1
+
+# job-storage
+JOB_STORAGE_DISABLE = 0
+JOB_STORAGE_ENABLE = 1
+
+JOB_STORAGE_TYPE_OFF = 0
+JOB_STORAGE_TYPE_PROOF_AND_HOLD = 1
+JOB_STORAGE_TYPE_PERSONAL = 2
+JOB_STORAGE_TYPE_QUICK_COPY = 3
+JOB_STORAGE_TYPE_STORE = 4
+
+JOB_STORAGE_EXISTING_JOB_REPLACE = 0
+JOB_STORAGE_EXISTING_JOB_APPEND_1_99 = 1
+
+JOB_STORAGE_HOLD_TYPE_PUBLIC = 0
+JOB_STORAGE_HOLD_TYPE_PRIVATE = 1
+
+# WIfi Config
+WIFI_CONFIG_UNSUPPORTED = -1
+WIFI_CONFIG_NONE = 0
+WIFI_CONFIG_USB_XML = 1
+WIFI_CONFIG_DEFAULT = 2
+WIFI_CONFIG_LEDM = 3
+
+# support-released
+SUPPORT_UNRELEASED = 0
+SUPPORT_RELEASED = 1
+
+#USB-Autoplugin-installation
+EVENT_AUTO_CONFIGURE = 900
+
+# Queue diagnosis codes
+QUEUES_CONFIG_ERROR = 1
+QUEUES_PAUSED = 2
+QUEUES_INCORRECT_PPD = 3
+QUEUES_USER_GROUPS_ERROR = 4
+QUEUES_MSG_SENDING = 5
+
diff --git a/base/device.py b/base/device.py
new file mode 100644
index 0000000..234fad4
--- /dev/null
+++ b/base/device.py
@@ -0,0 +1,2676 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2009 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch, Naga Samrat Chowdary Narla
+#
+
+# Std Lib
+import socket
+import re
+import gzip
+import os.path
+import time
+import urllib # TODO: Replace with urllib2 (urllib is deprecated in Python 3.0)
+import StringIO
+import cStringIO
+import httplib
+import struct
+import string
+
+# Local
+from g import *
+from codes import *
+import utils
+import status
+import pml
+import status
+from prnt import pcl, ldl, cups
+import models, mdns, slp
+from strings import StringTable
+
+
+try:
+ import hpmudext
+except ImportError:
+ if not os.getenv("HPLIP_BUILD"):
+ log.error("HPMUDEXT could not be loaded. Please check HPLIP installation.")
+ sys.exit(1)
+else:
+ # Workaround for build machine
+ try:
+ MAX_BUFFER = hpmudext.HPMUD_BUFFER_SIZE
+ except AttributeError:
+ MAX_BUFFER = 8192
+
+dbus_avail = False
+dbus_disabled = False
+try:
+ import dbus
+ from dbus import lowlevel, SessionBus
+ dbus_avail = True
+except ImportError:
+ log.warn("python-dbus not installed.")
+
+import warnings
+# Ignore: .../dbus/connection.py:242: DeprecationWarning: object.__init__() takes no parameters
+# (occurring on Python 2.6/dBus 0.83/Ubuntu 9.04)
+warnings.simplefilter("ignore", DeprecationWarning)
+
+
+DEFAULT_PROBE_BUS = ['usb', 'par', 'cups']
+VALID_BUSES = ('par', 'net', 'cups', 'usb') #, 'bt', 'fw')
+VALID_BUSES_WO_CUPS = ('par', 'net', 'usb')
+DEFAULT_FILTER = None
+VALID_FILTERS = ('print', 'scan', 'fax', 'pcard', 'copy')
+DEFAULT_BE_FILTER = ('hp',)
+
+pat_deviceuri = re.compile(r"""(.*):/(.*?)/(\S*?)\?(?:serial=(\S*)|device=(\S*)|ip=(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}[^&]*)|zc=(\S+))(?:&port=(\d))?""", re.IGNORECASE)
+http_pat_url = re.compile(r"""/(.*?)/(\S*?)\?(?:serial=(\S*)|device=(\S*))&loc=(\S*)""", re.IGNORECASE)
+direct_pat = re.compile(r'direct (.*?) "(.*?)" "(.*?)" "(.*?)"', re.IGNORECASE)
+
+# Pattern to check for ; at end of CTR fields
+# Note: If ; not present, CTR value is invalid
+pat_dynamic_ctr = re.compile(r"""CTR:\d*\s.*;""", re.IGNORECASE)
+
+# Cache for model data
+model_dat = models.ModelData()
+
+ip_pat = re.compile(r"""\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b""", re.IGNORECASE)
+dev_pat = re.compile(r"""/dev/.+""", re.IGNORECASE)
+usb_pat = re.compile(r"""(\d+):(\d+)""", re.IGNORECASE)
+
+### **********Lambda Function UniStar for checking type of arguments to constructor of class event*******************************
+
+UniStr = lambda title: isinstance(title, str) and utils.xrstrip(title, '\x00')[:128] or utils.xrstrip(title, '\x00')[:128].encode('utf-8')
+
+
+#
+# Event Wrapper Class for pipe IPC
+#
+
+class Event(object):
+ def __init__(self, device_uri, printer_name, event_code,
+ username=prop.username, job_id=0, title='',
+ timedate=0):
+ # UniStr = lambda title: isinstance(title, str) and utils.xrstrip(title, '\x00')[:128] or utils.xrstrip(title, '\x00')[:128].encode('utf-8')
+ self.device_uri = UniStr(device_uri)
+ self.printer_name = UniStr(printer_name)
+ self.event_code = int(event_code)
+ self.username = UniStr(username)
+ self.job_id = int(job_id)
+ self.title = UniStr(title)
+
+ if timedate:
+ self.timedate = float(timedate)
+ else:
+ self.timedate = time.time()
+
+ self.pipe_fmt = "80s80sI32sI80sf"
+ self.dbus_fmt = "ssisisd"
+
+
+ def debug(self):
+ log.debug(" device_uri=%s" % self.device_uri)
+ log.debug(" printer_name=%s" % self.printer_name)
+ log.debug(" event_code=%d" % self.event_code)
+ log.debug(" username=%s" % self.username)
+ log.debug(" job_id=%d" % self.job_id)
+ log.debug(" title=%s" % self.title)
+ log.debug(" timedate=%s" % self.timedate)
+
+
+ def pack_for_pipe(self):
+ return struct.pack(self.pipe_fmt, self.device_uri, self.printer_name,
+ self.event_code, self.username, self.job_id, self.title,
+ self.timedate)
+
+
+ def send_via_pipe(self, fd, recipient='hpssd'):
+ if fd is not None:
+ log.debug("Sending event %d to %s (via pipe %d)..." % (self.event_code, recipient, fd))
+ try:
+ os.write(fd, self.pack_for_pipe())
+ return True
+ except OSError:
+ log.debug("Failed.")
+ return False
+
+
+ def send_via_dbus(self, session_bus, interface='com.hplip.StatusService'):
+ if session_bus is not None and dbus_avail:
+ log.debug("Sending event %d to %s (via dbus)..." % (self.event_code, interface))
+ msg = lowlevel.SignalMessage('/', interface, 'Event')
+ msg.append(signature=self.dbus_fmt, *self.as_tuple())
+ session_bus.send_message(msg)
+
+
+ def copy(self):
+ return Event(*self.as_tuple())
+
+
+ def __str__(self):
+ return "<Event('%s', '%s', %d, '%s', %d, '%s', %f)>" % self.as_tuple()
+
+
+ def as_tuple(self):
+ return (self.device_uri, self.printer_name, self.event_code,
+ self.username, self.job_id, self.title, self.timedate)
+
+
+class FaxEvent(Event):
+ def __init__(self, temp_file, event):
+ Event.__init__(self, *event.as_tuple())
+ self.temp_file = temp_file
+ self.pipe_fmt = "80s80sI32sI80sfs"
+ self.dbus_fmt = "ssisisfs"
+
+
+ def debug(self):
+ log.debug("FAX:")
+ Event.debug(self)
+ log.debug(" temp_file=%s" % self.temp_file)
+
+
+ def __str__(self):
+ return "<FaxEvent('%s', '%s', %d, '%s', %d, '%s', %f, '%s')>" % self.as_tuple()
+
+
+ def as_tuple(self):
+ return (self.device_uri, self.printer_name, self.event_code,
+ self.username, self.job_id, self.title, self.timedate,
+ self.temp_file)
+
+
+
+class DeviceIOEvent(Event):
+ def __init__(self, bytes_written, event):
+ Event.__init__(self, *event.as_tuple())
+ self.bytes_written = bytes_written
+ self.pipe_fmt = "80s80sI32sI80sfI"
+ self.dbus_fmt = "ssisisfi"
+
+
+ def debug(self):
+ log.debug("DEVIO:")
+ Event.debug(self)
+ log.debug(" bytes_written=%d" % self.bytes_written)
+
+
+ def __str__(self):
+ return "<DeviceIOEvent('%s', '%s', %d, '%s', %d, '%s', %f, '%d')>" % self.as_tuple()
+
+
+ def as_tuple(self):
+ return (self.device_uri, self.printer_name, self.event_code,
+ self.username, self.job_id, self.title, self.timedate,
+ self.bytes_written)
+
+
+#
+# DBus Support
+#
+
+def init_dbus(dbus_loop=None):
+ global dbus_avail
+ service = None
+ session_bus = None
+
+ if not prop.gui_build:
+ dbus_avail = False
+ return dbus_avail, None, None
+
+ if dbus_avail and not dbus_disabled:
+ if os.getuid() == 0:
+ log.debug("Not starting dbus: running as root.")
+ dbus_avail = False
+ return dbus_avail, None, None
+
+ try:
+ if dbus_loop is None:
+ session_bus = dbus.SessionBus()
+ else:
+ session_bus = dbus.SessionBus(dbus_loop)
+ except dbus.exceptions.DBusException, e:
+ if os.getuid() != 0:
+ log.error("Unable to connect to dbus session bus.")
+ else:
+ log.debug("Unable to connect to dbus session bus (running as root?)")
+
+ dbus_avail = False
+ return dbus_avail, None, None
+
+ try:
+ log.debug("Connecting to com.hplip.StatusService (try #1)...")
+ service = session_bus.get_object('com.hplip.StatusService', "/com/hplip/StatusService")
+ dbus_avail = True
+ except dbus.exceptions.DBusException, e:
+ try:
+ os.waitpid(-1, os.WNOHANG)
+ except OSError:
+ pass
+
+ path = utils.which('hp-systray')
+ if path:
+ path = os.path.join(path, 'hp-systray')
+ else:
+ path = os.path.join(prop.home_dir, 'systray.py')
+ if not os.path.exists(path):
+ log.warn("Unable to start hp-systray")
+ return False, None, None
+
+ log.debug("Running hp-systray: %s --force-startup" % path)
+
+ os.spawnlp(os.P_NOWAIT, path, 'hp-systray', '--force-startup')
+
+ log.debug("Waiting for hp-systray to start...")
+ time.sleep(1)
+
+ t = 2
+ while True:
+ try:
+ log.debug("Connecting to com.hplip.StatusService (try #%d)..." % t)
+ service = session_bus.get_object('com.hplip.StatusService', "/com/hplip/StatusService")
+
+ except dbus.exceptions.DBusException, e:
+ log.debug("Unable to connect to dbus. Is hp-systray running?")
+ t += 1
+
+ if t > 5:
+ log.warn("Unable to connect to dbus. Is hp-systray running?")
+ return False, None, None
+
+ time.sleep(1)
+
+ else:
+ log.debug("Connected.")
+ dbus_avail = True
+ break
+
+ return dbus_avail, service, session_bus
+
+
+#
+# Make URI from parameter (bus ID, IP address, etc)
+#
+
+def makeURI(param, port=1):
+ cups_uri, sane_uri, fax_uri = '', '', ''
+ found = False
+
+ if dev_pat.search(param) is not None: # parallel
+ log.debug("Trying parallel with %s" % param)
+
+ result_code, uri = hpmudext.make_par_uri(param)
+
+ if result_code == hpmudext.HPMUD_R_OK and uri:
+ log.debug("Found: %s" % uri)
+ found = True
+ cups_uri = uri
+ else:
+ log.debug("Not found.")
+
+ elif usb_pat.search(param) is not None: # USB
+ match_obj = usb_pat.search(param)
+ usb_bus_id = match_obj.group(1)
+ usb_dev_id = match_obj.group(2)
+
+ log.debug("Trying USB with bus=%s dev=%s..." % (usb_bus_id, usb_dev_id))
+ result_code, uri = hpmudext.make_usb_uri(usb_bus_id, usb_dev_id)
+
+ if result_code == ERROR_SUCCESS and uri:
+ log.debug("Found: %s" % uri)
+ found = True
+ cups_uri = uri
+ else:
+ log.debug("Not found.")
+
+ elif ip_pat.search(param) is not None: # IPv4 dotted quad
+ log.debug("Trying IP address %s" % param)
+
+ result_code, uri = hpmudext.make_net_uri(param, port)
+
+ if result_code == hpmudext.HPMUD_R_OK and uri:
+ log.debug("Found: %s" % uri)
+ found = True
+ cups_uri = uri
+ else:
+ log.debug("Not found.")
+
+ else: # Try Zeroconf hostname
+ log.debug("Trying ZC hostname %s" % param)
+
+ result_code, uri = hpmudext.make_zc_uri(param, port)
+
+ if result_code == hpmudext.HPMUD_R_OK and uri:
+ log.debug("Found: %s" % uri)
+ found = True
+ cups_uri = uri
+ else:
+ log.debug("Not found.")
+
+ if not found:
+ log.debug("Trying serial number %s" % param)
+ devices = probeDevices(bus=['usb', 'par'])
+
+ for d in devices:
+ log.debug(d)
+
+ # usb has serial in URI...
+ try:
+ back_end, is_hp, bus, model, serial, dev_file, host, zc, port = \
+ parseDeviceURI(d)
+ except Error:
+ continue
+
+ if bus == 'par': # ...parallel does not. Must get Device ID to obtain it...
+ mq = queryModelByURI(d)
+
+ result_code, device_id = \
+ hpmudext.device_open(d, mq.get('io-mode', hpmudext.HPMUD_UNI_MODE))
+
+ if result_code == hpmudext.HPMUD_R_OK:
+ result_code, data = hpmudext.get_device_id(device_id)
+ serial = parseDeviceID(data).get('SN', '')
+ hpmudext.close_device(device_id)
+
+ if serial.lower() == param.lower():
+ log.debug("Found: %s" % d)
+ found = True
+ cups_uri = d
+ break
+ else:
+ log.debug("Not found.")
+
+ if found:
+ try:
+ mq = queryModelByURI(cups_uri)
+ except Error, e:
+ log.error("Error: %s" % e.msg)
+ cups_uri, sane_uri, fax_uri = '', '', ''
+ else:
+ if mq.get('support-type', SUPPORT_TYPE_NONE) > SUPPORT_TYPE_NONE:
+ if mq.get('scan-type', 0):
+ sane_uri = cups_uri.replace("hp:", "hpaio:")
+
+ if mq.get('fax-type', 0):
+ fax_uri = cups_uri.replace("hp:", "hpfax:")
+
+ else:
+ cups_uri, sane_uri, fax_uri = '', '', ''
+
+ else:
+ scan_uri, fax_uri = '', ''
+
+ if cups_uri:
+ user_conf.set('last_used', 'device_uri', cups_uri)
+
+ return cups_uri, sane_uri, fax_uri
+
+
+#
+# Model Queries
+#
+
+def queryModelByModel(model):
+ model = models.normalizeModelName(model).lower()
+ return model_dat[model]
+
+
+def queryModelByURI(device_uri):
+ try:
+ back_end, is_hp, bus, model, \
+ serial, dev_file, host, zc, port = \
+ parseDeviceURI(device_uri)
+ except Error:
+ raise Error(ERROR_INVALID_DEVICE_URI)
+ else:
+ return queryModelByModel(model)
+
+
+#
+# Device Discovery
+#
+
+def probeDevices(bus=DEFAULT_PROBE_BUS, timeout=10,
+ ttl=4, filter=DEFAULT_FILTER, search='', net_search='mdns',
+ back_end_filter=('hp',)):
+
+ num_devices, ret_devices = 0, {}
+
+ if search:
+ try:
+ search_pat = re.compile(search, re.IGNORECASE)
+ except:
+ log.error("Invalid search pattern. Search uses standard regular expressions. For more info, see: http://www.amk.ca/python/howto/regex/")
+ search = ''
+
+ for b in bus:
+ log.debug("Probing bus: %s" % b)
+ if b not in VALID_BUSES:
+ log.error("Invalid bus: %s" % b)
+ continue
+
+ if b == 'net':
+ if net_search == 'slp':
+ try:
+ detected_devices = slp.detectNetworkDevices(ttl, timeout)
+ except Error, socket.error:
+ log.error("An error occured during network probe.")
+ raise ERROR_INTERNAL
+ else:
+ try:
+ detected_devices = mdns.detectNetworkDevices(ttl, timeout)
+ except Error, socket.error:
+ log.error("An error occured during network probe.")
+ raise ERROR_INTERNAL
+
+ for ip in detected_devices:
+ update_spinner()
+ hn = detected_devices[ip].get('hn', '?UNKNOWN?')
+ num_devices_on_jd = detected_devices[ip].get('num_devices', 0)
+ num_ports_on_jd = detected_devices[ip].get('num_ports', 1)
+
+ if num_devices_on_jd > 0:
+ for port in range(num_ports_on_jd):
+ dev = detected_devices[ip].get('device%d' % (port+1), '0')
+
+ if dev is not None and dev != '0':
+ device_id = parseDeviceID(dev)
+ model = models.normalizeModelName(device_id.get('MDL', '?UNKNOWN?'))
+
+ if num_ports_on_jd == 1:
+ if net_search == 'slp':
+ device_uri = 'hp:/net/%s?ip=%s' % (model, ip)
+ else:
+ device_uri = 'hp:/net/%s?zc=%s' % (model, hn)
+ else:
+ if net_search == 'slp':
+ device_uri = 'hp:/net/%s?ip=%s&port=%d' % (model, ip, (port + 1))
+ else:
+ device_uri = 'hp:/net/%s?zc=%s&port=%d' % (model, hn, (port + 1))
+
+ include = True
+ mq = queryModelByModel(model)
+
+ if not mq:
+ log.debug("Not found.")
+ include = False
+
+ elif int(mq.get('support-type', SUPPORT_TYPE_NONE)) == SUPPORT_TYPE_NONE:
+ log.debug("Not supported.")
+ include = False
+
+ elif filter not in (None, 'print', 'print-type'):
+ include = __checkFilter(filter, mq)
+
+ if include:
+ ret_devices[device_uri] = (model, model, hn)
+
+ elif b in ('usb', 'par'):
+ if b == 'par':
+ bn = hpmudext.HPMUD_BUS_PARALLEL
+ else:
+ bn = hpmudext.HPMUD_BUS_USB
+
+ result_code, data = hpmudext.probe_devices(bn)
+
+ if result_code == hpmudext.HPMUD_R_OK:
+ for x in data.splitlines():
+ m = direct_pat.match(x)
+
+ uri = m.group(1) or ''
+ mdl = m.group(2) or ''
+ desc = m.group(3) or ''
+ devid = m.group(4) or ''
+
+ log.debug(uri)
+
+ try:
+ back_end, is_hp, bb, model, serial, dev_file, host, zc, port = \
+ parseDeviceURI(uri)
+ except Error:
+ continue
+
+ include = True
+
+ if mdl and uri and is_hp:
+ mq = queryModelByModel(model)
+
+ if not mq:
+ log.debug("Not found.")
+ include = False
+
+ elif int(mq.get('support-type', SUPPORT_TYPE_NONE)) == SUPPORT_TYPE_NONE:
+ log.debug("Not supported.")
+ include = False
+
+ elif filter not in (None, 'print', 'print-type'):
+ include = __checkFilter(filter, mq)
+
+ if include:
+ ret_devices[uri] = (mdl, desc, devid) # model w/ _'s, mdl w/o
+
+ elif b == 'cups':
+ cups_printers = cups.getPrinters()
+ x = len(cups_printers)
+
+ for p in cups_printers:
+ device_uri = p.device_uri
+ log.debug("%s: %s" % (device_uri, p.name))
+
+ if device_uri != '':
+ try:
+ back_end, is_hp, bs, model, serial, dev_file, host, zc, port = \
+ parseDeviceURI(device_uri)
+ except Error:
+ log.debug("Unrecognized URI: %s" % device_uri)
+ continue
+
+ if not is_hp:
+ continue
+
+ include = True
+ mq = queryModelByModel(model)
+
+ if not mq:
+ include = False
+ log.debug("Not found.")
+
+ elif int(mq.get('support-type', SUPPORT_TYPE_NONE)) == SUPPORT_TYPE_NONE:
+ log.debug("Not supported.")
+ include = False
+
+ elif filter not in (None, 'print', 'print-type'):
+ include = __checkFilter(filter, mq)
+
+ if include:
+ ret_devices[device_uri] = (model, model, '')
+
+ probed_devices = {}
+ for uri in ret_devices:
+ num_devices += 1
+ mdl, model, devid_or_hn = ret_devices[uri]
+
+ include = True
+ if search:
+ match_obj = search_pat.search("%s %s %s %s" % (mdl, model, devid_or_hn, uri))
+
+ if match_obj is None:
+ log.debug("%s %s %s %s: Does not match search '%s'." % (mdl, model, devid_or_hn, uri, search))
+ include = False
+
+ if include:
+ probed_devices[uri] = ret_devices[uri]
+
+ cleanup_spinner()
+ return probed_devices
+
+#
+# CUPS Devices
+#
+
+def getSupportedCUPSDevices(back_end_filter=['hp'], filter=DEFAULT_FILTER):
+ devices = {}
+ printers = cups.getPrinters()
+
+ for p in printers:
+ try:
+ back_end, is_hp, bus, model, serial, dev_file, host, zc, port = \
+ parseDeviceURI(p.device_uri)
+
+ except Error:
+ continue
+
+ if (back_end_filter == '*' or back_end in back_end_filter or \
+ ('hpaio' in back_end_filter and back_end == 'hp')) and \
+ model and is_hp:
+
+ include = True
+ mq = queryModelByModel(model)
+
+ if not mq:
+ log.debug("Not found.")
+ include = False
+
+ elif int(mq.get('support-type', SUPPORT_TYPE_NONE)) == SUPPORT_TYPE_NONE:
+ log.debug("Not supported.")
+ include = False
+
+ elif filter not in (None, 'print', 'print-type'):
+ include = __checkFilter(filter, mq)
+
+ if include:
+ if 'hpaio' in back_end_filter:
+ d = p.device_uri.replace('hp:', 'hpaio:')
+ else:
+ d = p.device_uri
+
+ try:
+ devices[d]
+ except KeyError:
+ devices[d] = [p.name]
+ else:
+ devices[d].append(p.name)
+
+ return devices # { 'device_uri' : [ CUPS printer list ], ... }
+
+
+def getSupportedCUPSPrinters(back_end_filter=['hp'], filter=DEFAULT_FILTER):
+ printer_list = []
+ printers = cups.getPrinters()
+
+ for p in printers:
+ try:
+ back_end, is_hp, bus, model, serial, dev_file, host, zc, port = \
+ parseDeviceURI(p.device_uri)
+
+ except Error:
+ continue
+
+ if (back_end_filter == '*' or back_end in back_end_filter) and model and is_hp:
+ include = True
+ mq = queryModelByModel(model)
+
+ if not mq:
+ log.debug("Not found.")
+ include = False
+
+ elif int(mq.get('support-type', SUPPORT_TYPE_NONE)) == SUPPORT_TYPE_NONE:
+ log.debug("Not supported.")
+ include = False
+
+ elif filter not in (None, 'print', 'print-type'):
+ include = __checkFilter(filter, mq)
+
+ if include:
+ p.name = p.name.decode('utf-8')
+ printer_list.append(p)
+ #printer_list[p.name] = p.device_uri
+
+ return printer_list # [ cupsext.Printer, ... ]
+
+
+def getSupportedCUPSPrinterNames(back_end_filter=['hp'], filter=DEFAULT_FILTER):
+ printers = getSupportedCUPSPrinters(back_end_filter, filter)
+ return [p.name for p in printers]
+
+
+def getDeviceURIByPrinterName(printer_name, scan_uri_flag=False):
+ if printer_name is None:
+ return None
+
+ device_uri = None
+ printers = cups.getPrinters()
+
+ for p in printers:
+ try:
+ back_end, is_hp, bus, model, serial, dev_file, host, zc, port = \
+ parseDeviceURI(p.device_uri)
+
+ except Error:
+ continue
+
+ if is_hp and p.name == printer_name:
+ if scan_uri_flag:
+ device_uri = p.device_uri.replace('hp:', 'hpaio:')
+ else:
+ device_uri = p.device_uri
+ break
+
+ return device_uri
+
+#
+# IEEE-1284 Device ID parsing
+#
+
+def parseDeviceID(device_id):
+ d= {}
+ x = [y.strip() for y in device_id.strip().split(';') if y]
+
+ for z in x:
+ y = z.split(':')
+ try:
+ d.setdefault(y[0].strip(), y[1])
+ except IndexError:
+ d.setdefault(y[0].strip(), None)
+
+ d.setdefault('MDL', '')
+ d.setdefault('SN', '')
+
+ if 'MODEL' in d:
+ d['MDL'] = d['MODEL']
+ del d['MODEL']
+
+ if 'SERIAL' in d:
+ d['SN'] = d['SERIAL']
+ del d['SERIAL']
+
+ elif 'SERN' in d:
+ d['SN'] = d['SERN']
+ del d['SERN']
+
+ if d['SN'].startswith('X'):
+ d['SN'] = ''
+
+ return d
+
+#
+# IEEE-1284 Device ID Dynamic Counter Parsing
+#
+
+def parseDynamicCounter(ctr_field, convert_to_int=True):
+ counter, value = ctr_field.split(' ')
+ try:
+ counter = int(utils.xlstrip(str(counter), '0') or '0')
+
+ if convert_to_int:
+ value = int(utils.xlstrip(str(value), '0') or '0')
+ except ValueError:
+ if convert_to_int:
+ counter, value = 0, 0
+ else:
+ counter, value = 0, ''
+
+ return counter, value
+
+
+#
+# Parse Device URI Strings
+#
+
+def parseDeviceURI(device_uri):
+ m = pat_deviceuri.match(device_uri)
+
+ if m is None:
+ log.debug("Device URI %s is invalid/unknown" % device_uri)
+ raise Error(ERROR_INVALID_DEVICE_URI)
+
+ back_end = m.group(1).lower() or ''
+ is_hp = (back_end in ('hp', 'hpfax', 'hpaio'))
+ bus = m.group(2).lower() or ''
+
+ if bus not in ('usb', 'net', 'bt', 'fw', 'par'):
+ log.debug("Device URI %s is invalid/unknown" % device_uri)
+ raise Error(ERROR_INVALID_DEVICE_URI)
+
+ model = m.group(3) or ''
+ serial = m.group(4) or ''
+ dev_file = m.group(5) or ''
+ host = m.group(6) or ''
+ zc = ''
+ if not host:
+ zc = host = m.group(7) or ''
+ port = m.group(8) or 1
+
+ if bus == 'net':
+ try:
+ port = int(port)
+ except (ValueError, TypeError):
+ port = 1
+
+ if port == 0:
+ port = 1
+
+ log.debug("%s: back_end:%s is_hp:%s bus:%s model:%s serial:%s dev_file:%s host:%s zc:%s port:%s" %
+ (device_uri, back_end, is_hp, bus, model, serial, dev_file, host, zc, port))
+
+ return back_end, is_hp, bus, model, serial, dev_file, host, zc, port
+
+
+def isLocal(bus):
+ return bus in ('par', 'usb', 'fw', 'bt')
+
+
+def isNetwork(bus):
+ return bus in ('net',)
+
+
+#
+# Misc
+#
+
+def __checkFilter(filter, mq):
+ for f, p in filter.items():
+ if f is not None:
+ op, val = p
+ if not op(mq[f], val):
+ return False
+
+ return True
+
+
+def validateBusList(bus, allow_cups=True):
+ for b in bus:
+ if allow_cups:
+ vb = VALID_BUSES
+ else:
+ vb = VALID_BUSES_WO_CUPS
+
+ if b not in vb:
+ log.error("Invalid bus name: %s" %b)
+ return False
+
+ return True
+
+
+def validateFilterList(filter):
+ if filter is None:
+ return True
+
+ for f in filter:
+ if f not in VALID_FILTERS:
+ log.error("Invalid term '%s' in filter list" % f)
+ return False
+
+ return True
+
+
+#
+# UI String Queries (why is this here?)
+#
+
+inter_pat = re.compile(r"""%(.*)%""", re.IGNORECASE)
+st = StringTable()
+strings_init = False
+
+
+def initStrings():
+ global strings_init, st
+ strings_init = True
+ cycles = 0
+
+ while True:
+ found = False
+
+ for s in st.string_table:
+ short_string, long_string = st.string_table[s]
+ short_replace, long_replace = short_string, long_string
+
+ try:
+ short_match = inter_pat.match(short_string).group(1)
+ except (AttributeError, TypeError):
+ short_match = None
+
+ if short_match is not None:
+ found = True
+
+ try:
+ short_replace, dummy = st.string_table[short_match]
+ except KeyError:
+ log.error("String interpolation error: %s" % short_match)
+
+ try:
+ long_match = inter_pat.match(long_string).group(1)
+ except (AttributeError, TypeError):
+ long_match = None
+
+ if long_match is not None:
+ found = True
+
+ try:
+ dummy, long_replace = st.string_table[long_match]
+ except KeyError:
+ log.error("String interpolation error: %s" % long_match)
+
+ if found:
+ st.string_table[s] = (short_replace, long_replace)
+
+ if not found:
+ break
+ else:
+ cycles +=1
+ if cycles > 1000:
+ break
+
+
+def queryString(string_id, typ=0):
+ if not strings_init:
+ initStrings()
+
+ #log.debug("queryString(%s)" % string_id)
+ s = st.string_table.get(str(string_id), ('', ''))[typ]
+
+ if type(s) == type(''):
+ return s
+
+ return s()
+
+
+AGENT_types = { AGENT_TYPE_NONE : 'invalid',
+ AGENT_TYPE_BLACK : 'black',
+ AGENT_TYPE_BLACK_B8800 : 'black',
+ AGENT_TYPE_CMY : 'cmy',
+ AGENT_TYPE_KCM : 'kcm',
+ AGENT_TYPE_CYAN : 'cyan',
+ AGENT_TYPE_MAGENTA : 'magenta',
+ AGENT_TYPE_YELLOW : 'yellow',
+ AGENT_TYPE_CYAN_LOW : 'photo_cyan',
+ AGENT_TYPE_MAGENTA_LOW : 'photo_magenta',
+ AGENT_TYPE_YELLOW_LOW : 'photo_yellow',
+ AGENT_TYPE_GGK : 'photo_gray',
+ AGENT_TYPE_BLUE : 'photo_blue',
+ AGENT_TYPE_KCMY_CM : 'kcmy_cm',
+ AGENT_TYPE_LC_LM : 'photo_cyan_and_photo_magenta',
+ #AGENT_TYPE_Y_M : 'yellow_and_magenta',
+ #AGENT_TYPE_C_K : 'cyan_and_black',
+ AGENT_TYPE_LG_PK : 'light_gray_and_photo_black',
+ AGENT_TYPE_LG : 'light_gray',
+ AGENT_TYPE_G : 'medium_gray',
+ AGENT_TYPE_PG : 'photo_gray',
+ AGENT_TYPE_C_M : 'cyan_and_magenta',
+ AGENT_TYPE_K_Y : 'black_and_yellow',
+ AGENT_TYPE_UNSPECIFIED : 'unspecified', # Kind=5,6
+ }
+
+AGENT_kinds = {AGENT_KIND_NONE : 'invalid',
+ AGENT_KIND_HEAD : 'head',
+ AGENT_KIND_SUPPLY : 'supply',
+ AGENT_KIND_HEAD_AND_SUPPLY : 'cartridge',
+ AGENT_KIND_TONER_CARTRIDGE : 'toner',
+ AGENT_KIND_MAINT_KIT : 'maint_kit', # fuser
+ AGENT_KIND_ADF_KIT : 'adf_kit',
+ AGENT_KIND_DRUM_KIT : 'drum_kit',
+ AGENT_KIND_TRANSFER_KIT : 'transfer_kit',
+ AGENT_KIND_INT_BATTERY : 'battery',
+ AGENT_KIND_UNKNOWN : 'unknown',
+ }
+
+AGENT_healths = {AGENT_HEALTH_OK : 'ok',
+ AGENT_HEALTH_MISINSTALLED : 'misinstalled', # supply/cart
+ #AGENT_HEALTH_FAIR_MODERATE : '',
+ AGENT_HEALTH_INCORRECT : 'incorrect',
+ AGENT_HEALTH_FAILED : 'failed',
+ AGENT_HEALTH_OVERTEMP : 'overtemp', # battery
+ AGENT_HEALTH_CHARGING : 'charging', # battery
+ AGENT_HEALTH_DISCHARGING : 'discharging', # battery
+ }
+
+
+AGENT_levels = {AGENT_LEVEL_TRIGGER_MAY_BE_LOW : 'low',
+ AGENT_LEVEL_TRIGGER_PROBABLY_OUT : 'low',
+ AGENT_LEVEL_TRIGGER_ALMOST_DEFINITELY_OUT : 'out',
+ }
+
+
+#
+
+
+
+# **************************************************************************** #
+
+string_cache = {}
+
+class Device(object):
+ def __init__(self, device_uri, printer_name=None,
+ service=None, callback=None, disable_dbus=False):
+
+ log.debug("Device URI: %s" % device_uri)
+ log.debug("Printer: %s" % printer_name)
+
+ global dbus_disabled
+ dbus_disabled = disable_dbus
+
+ if not disable_dbus:
+ if service is None:
+ self.dbus_avail, self.service, session_bus = init_dbus()
+ else:
+ self.dbus_avail = True
+ self.service = service
+ else:
+ self.dbus_avail = False
+ self.service = None
+
+ self.last_event = None # Used in devmgr if dbus is disabled
+
+ printers = cups.getPrinters()
+
+ if device_uri is None and printer_name is not None:
+ for p in printers:
+ if p.name.lower() == printer_name.lower():
+ device_uri = p.device_uri
+ log.debug("Device URI: %s" % device_uri)
+ break
+ else:
+ raise Error(ERROR_DEVICE_NOT_FOUND)
+
+ self.device_uri = device_uri
+ self.callback = callback
+ self.device_type = DEVICE_TYPE_UNKNOWN
+
+ if self.device_uri is None:
+ raise Error(ERROR_DEVICE_NOT_FOUND)
+
+ if self.device_uri.startswith('hp:'):
+ self.device_type = DEVICE_TYPE_PRINTER
+
+ elif self.device_uri.startswith('hpaio:'):
+ self.device_type = DEVICE_TYPE_SCANNER
+
+ elif self.device_uri.startswith('hpfax:'):
+ self.device_type = DEVICE_TYPE_FAX
+
+ try:
+ self.back_end, self.is_hp, self.bus, self.model, \
+ self.serial, self.dev_file, self.host, self.zc, self.port = \
+ parseDeviceURI(self.device_uri)
+ except Error:
+ self.io_state = IO_STATE_NON_HP
+ raise Error(ERROR_INVALID_DEVICE_URI)
+
+ log.debug("URI: backend=%s, is_hp=%s, bus=%s, model=%s, serial=%s, dev=%s, host=%s, port=%d" % \
+ (self.back_end, self.is_hp, self.bus, self.model, self.serial, self.dev_file, self.host, self.port))
+
+ self.model_ui = models.normalizeModelUIName(self.model)
+ self.model = models.normalizeModelName(self.model)
+
+ log.debug("Model/UI model: %s/%s" % (self.model, self.model_ui))
+
+ # TODO:
+ #service.setAlertsEx(self.hpssd_sock)
+
+ self.mq = {} # Model query
+ self.dq = {} # Device query
+ self.icon = "default_printer"
+ self.cups_printers = []
+ self.channels = {} # { 'SERVICENAME' : channel_id, ... }
+ self.device_id = -1
+ self.r_values = None # ( r_value, r_value_str, rg, rr )
+ self.deviceID = ''
+ self.panel_check = True
+ self.io_state = IO_STATE_HP_READY
+ self.is_local = isLocal(self.bus)
+ self.hist = []
+
+ self.supported = False
+
+ self.queryModel()
+ if not self.supported:
+ log.error("Unsupported model: %s" % self.model)
+ self.error_code = STATUS_DEVICE_UNSUPPORTED
+ self.sendEvent(self.error_code)
+ else:
+ self.supported = True
+
+
+ self.mq.update({'model' : self.model,
+ 'model-ui' : self.model_ui})
+
+ self.error_state = ERROR_STATE_ERROR
+ self.device_state = DEVICE_STATE_NOT_FOUND
+ self.status_code = EVENT_ERROR_DEVICE_NOT_FOUND
+
+ self.updateCUPSPrinters()
+
+ if self.mq.get('fax-type', FAX_TYPE_NONE) != FAX_TYPE_NONE:
+ self.dq.update({ 'fax-uri' : self.device_uri.replace('hp:/', 'hpfax:/').replace('hpaio:/', 'hpfax:/')})
+
+ if self.mq.get('scan-type', SCAN_TYPE_NONE) != SCAN_TYPE_NONE:
+ self.dq.update({ 'scan-uri' : self.device_uri.replace('hp:/', 'hpaio:/').replace('hpfax:/', 'hpaio:/')})
+
+ self.dq.update({
+ 'back-end' : self.back_end,
+ 'is-hp' : self.is_hp,
+ 'serial' : self.serial,
+ 'dev-file' : self.dev_file,
+ 'host' : self.host,
+ 'port' : self.port,
+ 'cups-printers' : self.cups_printers,
+ 'status-code' : self.status_code,
+ 'status-desc' : '',
+ 'deviceid' : '',
+ 'panel' : 0,
+ 'panel-line1' : '',
+ 'panel-line2' : '',
+ 'device-state' : self.device_state,
+ 'error-state' : self.error_state,
+ 'device-uri' : self.device_uri,
+ 'cups-uri' : self.device_uri.replace('hpfax:/', 'hp:/').replace('hpaio:/', 'hp:/'),
+ })
+
+ self.device_vars = {
+ 'URI' : self.device_uri,
+ 'DEVICE_URI' : self.device_uri,
+ 'SCAN_URI' : self.device_uri.replace('hp:', 'hpaio:'),
+ 'SANE_URI' : self.device_uri.replace('hp:', 'hpaio:'),
+ 'FAX_URI' : self.device_uri.replace('hp:', 'hpfax:'),
+ 'PRINTER' : self.first_cups_printer,
+ 'HOME' : prop.home_dir,
+ }
+
+
+
+
+ def sendEvent(self, event_code, printer_name='', job_id=0, title=''):
+ if self.dbus_avail and self.service is not None:
+ try:
+ log.debug("Sending event %d to hpssd..." % event_code)
+ self.service.SendEvent(self.device_uri, printer_name, event_code, prop.username, job_id, title)
+ except dbus.exceptions.DBusException, e:
+ log.debug("dbus call to SendEvent() failed.")
+
+
+ def quit(self):
+ pass
+
+
+ def queryModel(self):
+ if not self.mq:
+ self.mq = queryModelByURI(self.device_uri)
+
+ self.supported = bool(self.mq)
+
+ if self.supported:
+ for m in self.mq:
+ self.__dict__[m.replace('-','_')] = self.mq[m]
+
+
+ def queryString(self, string_id):
+ return queryString(string_id)
+
+
+ def open(self, open_for_printing=False):
+ if self.supported and self.io_state in (IO_STATE_HP_READY, IO_STATE_HP_NOT_AVAIL):
+ prev_device_state = self.device_state
+ self.io_state = IO_STATE_HP_NOT_AVAIL
+ self.device_state = DEVICE_STATE_NOT_FOUND
+ self.error_state = ERROR_STATE_ERROR
+ self.status_code = EVENT_ERROR_DEVICE_NOT_FOUND
+ self.device_id = -1
+ self.open_for_printing = open_for_printing
+
+ if open_for_printing:
+ log.debug("Opening device: %s (for printing)" % self.device_uri)
+ self.io_mode = self.mq.get('io-mode', hpmudext.HPMUD_UNI_MODE)
+ else:
+ log.debug("Opening device: %s (not for printing)" % self.device_uri)
+ self.io_mode = self.mq.get('io-mfp-mode', hpmudext.HPMUD_UNI_MODE)
+
+ log.debug("I/O mode=%d" % self.io_mode)
+ result_code, self.device_id = \
+ hpmudext.open_device(self.device_uri, self.io_mode)
+
+ if result_code != hpmudext.HPMUD_R_OK:
+ self.error_state = ERROR_STATE_ERROR
+ self.error_code = result_code+ERROR_CODE_BASE
+ self.sendEvent(self.error_code)
+
+ if result_code == hpmudext.HPMUD_R_DEVICE_BUSY:
+ log.error("Device busy: %s" % self.device_uri)
+ else:
+ log.error("Unable to communicate with device (code=%d): %s" % (result_code, self.device_uri))
+
+ self.last_event = Event(self.device_uri, '', EVENT_ERROR_DEVICE_NOT_FOUND,
+ prop.username, 0, '', time.time())
+
+ raise Error(ERROR_DEVICE_NOT_FOUND)
+
+ else:
+ log.debug("device-id=%d" % self.device_id)
+ self.io_state = IO_STATE_HP_OPEN
+ self.error_state = ERROR_STATE_CLEAR
+ log.debug("Opened device: %s (backend=%s, is_hp=%s, bus=%s, model=%s, dev=%s, serial=%s, host=%s, port=%d)" %
+ (self.back_end, self.device_uri, self.is_hp, self.bus, self.model,
+ self.dev_file, self.serial, self.host, self.port))
+
+ if prev_device_state == DEVICE_STATE_NOT_FOUND:
+ self.device_state = DEVICE_STATE_JUST_FOUND
+ else:
+ self.device_state = DEVICE_STATE_FOUND
+
+ self.getDeviceID()
+ self.getSerialNumber()
+ return self.device_id
+
+
+ def close(self):
+ if self.io_state == IO_STATE_HP_OPEN:
+ log.debug("Closing device...")
+
+ if len(self.channels) > 0:
+
+ for c in self.channels.keys():
+ self.__closeChannel(c)
+
+ result_code = hpmudext.close_device(self.device_id)
+ log.debug("Result-code = %d" % result_code)
+
+ self.channels.clear()
+ self.io_state = IO_STATE_HP_READY
+
+
+ def __openChannel(self, service_name):
+ try:
+ if self.io_state == IO_STATE_HP_OPEN:
+ if service_name == hpmudext.HPMUD_S_PRINT_CHANNEL and not self.open_for_printing:
+ self.close()
+ self.open(True)
+ elif service_name != hpmudext.HPMUD_S_PRINT_CHANNEL and self.open_for_printing:
+ self.close()
+ self.open(False)
+ else:
+ self.open(service_name == hpmudext.HPMUD_S_PRINT_CHANNEL)
+ except:
+ log.error("unable to open channel")
+ return -1
+
+ #if not self.mq['io-mode'] == IO_MODE_UNI:
+ if 1:
+ service_name = service_name.upper()
+
+ if service_name not in self.channels:
+ log.debug("Opening %s channel..." % service_name)
+
+ result_code, channel_id = hpmudext.open_channel(self.device_id, service_name)
+
+ self.channels[service_name] = channel_id
+ log.debug("channel-id=%d" % channel_id)
+ return channel_id
+ else:
+ return self.channels[service_name]
+ else:
+ return -1
+
+
+ def openChannel(self, service_name):
+ return self.__openChannel(service_name)
+
+ def openPrint(self):
+ return self.__openChannel(hpmudext.HPMUD_S_PRINT_CHANNEL)
+
+ def openFax(self):
+ return self.__openChannel(hpmudext.HPMUD_S_FAX_SEND_CHANNEL)
+
+ def openPCard(self):
+ return self.__openChannel(hpmudext.HPMUD_S_MEMORY_CARD_CHANNEL)
+
+ def openEWS(self):
+ return self.__openChannel(hpmudext.HPMUD_S_EWS_CHANNEL)
+
+ def openEWS_LEDM(self):
+ return self.__openChannel(hpmudext.HPMUD_S_EWS_LEDM_CHANNEL)
+
+ def openLEDM(self):
+ return self.__openChannel(hpmudext.HPMUD_S_LEDM_SCAN)
+
+ def closePrint(self):
+ return self.__closeChannel(hpmudext.HPMUD_S_PRINT_CHANNEL)
+
+ def closePCard(self):
+ return self.__closeChannel(hpmudext.HPMUD_S_MEMORY_CARD_CHANNEL)
+
+ def closeFax(self):
+ return self.__closeChannel(hpmudext.HPMUD_S_FAX_SEND_CHANNEL)
+
+ def openPML(self):
+ return self.__openChannel(hpmudext.HPMUD_S_PML_CHANNEL)
+
+ def openWifiConfig(self):
+ return self.__openChannel(hpmudext.HPMUD_S_WIFI_CHANNEL)
+
+ def closePML(self):
+ return self.__closeChannel(hpmudext.HPMUD_S_PML_CHANNEL)
+
+ def closeEWS(self):
+ return self.__closeChannel(hpmudext.HPMUD_S_EWS_CHANNEL)
+
+ def closeEWS_LEDM(self):
+ return self.__closeChannel(hpmudext.HPMUD_S_EWS_LEDM_CHANNEL)
+
+ def closeLEDM(self):
+ return self.__closeChannel(hpmudext.HPMUD_S_LEDM_SCAN)
+
+ def openCfgUpload(self):
+ return self.__openChannel(hpmudext.HPMUD_S_CONFIG_UPLOAD_CHANNEL)
+
+ def closeCfgUpload(self):
+ return self.__closeChannel(hpmudext.HPMUD_S_CONFIG_UPLOAD_CHANNEL)
+
+ def openCfgDownload(self):
+ return self.__openChannel(hpmudext.HPMUD_S_CONFIG_DOWNLOAD_CHANNEL)
+
+ def closeCfgDownload(self):
+ return self.__closeChannel(hpmudext.HPMUD_S_CONFIG_DOWNLOAD_CHANNEL)
+
+ def openSoapFax(self):
+ return self.__openChannel(hpmudext.HPMUD_S_SOAP_FAX)
+
+ def openMarvellFax(self):
+ return self.__openChannel(hpmudext.HPMUD_S_MARVELL_FAX_CHANNEL)
+
+ def closeSoapFax(self):
+ return self.__closeChannel(hpmudext.HPMUD_S_SOAP_FAX)
+
+ def closeMarvellFax(self):
+ return self.__closeChannel(hpmudext.HPMUD_S_MARVELL_FAX_CHANNEL)
+
+ def closeWifiConfig(self):
+ return self.__closeChannel(hpmudext.HPMUD_S_WIFI_CHANNEL)
+
+ def __closeChannel(self, service_name):
+ #if not self.mq['io-mode'] == IO_MODE_UNI and \
+ if self.io_state == IO_STATE_HP_OPEN:
+
+ service_name = service_name.upper()
+
+ if service_name in self.channels:
+ log.debug("Closing %s channel..." % service_name)
+
+ result_code = hpmudext.close_channel(self.device_id,
+ self.channels[service_name])
+
+ del self.channels[service_name]
+
+
+ def closeChannel(self, service_name):
+ return self.__closeChannel(service_name)
+
+
+ def getDeviceID(self):
+ needs_close = False
+ if self.io_state != IO_STATE_HP_OPEN:
+ try:
+ self.open()
+ except:
+ return -1
+ needs_close = True
+
+ result_code, data = hpmudext.get_device_id(self.device_id)
+
+ if result_code != hpmudext.HPMUD_R_OK:
+ self.raw_deviceID = ''
+ self.deviceID = {}
+ else:
+ self.raw_deviceID = data
+ self.deviceID = parseDeviceID(data)
+
+ if needs_close:
+ self.close()
+
+ return self.deviceID
+
+
+ def getSerialNumber(self):
+ if self.serial:
+ return
+
+ try:
+ self.serial = self.deviceID['SN']
+ except KeyError:
+ pass
+ else:
+ if self.serial:
+ return
+
+ if self.mq.get('status-type', STATUS_TYPE_NONE) != STATUS_TYPE_NONE: # and \
+ #not self.mq.get('io-mode', IO_MODE_UNI) == IO_MODE_UNI:
+
+ try:
+ try:
+ error_code, self.serial = self.getPML(pml.OID_SERIAL_NUMBER)
+ except Error:
+ self.serial = ''
+ finally:
+ self.closePML()
+
+ if self.serial is None:
+ self.serial = ''
+
+
+ def getThreeBitStatus(self):
+ pass
+
+
+ def getStatusFromDeviceID(self):
+ self.getDeviceID()
+ return status.parseStatus(parseDeviceID(self.raw_deviceID))
+
+
+ def __parseRValues(self, r_value):
+ r_value_str = str(r_value)
+ r_value_str = ''.join(['0'*(9 - len(r_value_str)), r_value_str])
+ rg, rr = r_value_str[:3], r_value_str[3:]
+ r_value = int(rr)
+ self.r_values = r_value, r_value_str, rg, rr
+ return r_value, r_value_str, rg, rr
+
+
+ def getRValues(self, r_type, status_type, dynamic_counters):
+ r_value, r_value_str, rg, rr = 0, '000000000', '000', '000000'
+
+ if r_type > 0 and \
+ dynamic_counters != STATUS_DYNAMIC_COUNTERS_NONE:
+
+ if self.r_values is None:
+ if self.dbus_avail:
+ try:
+ r_value = int(self.service.GetCachedIntValue(self.device_uri, 'r_value'))
+ except dbus.exceptions.DBusException, e:
+ log.debug("dbus call to GetCachedIntValue() failed.")
+ r_value = -1
+
+ if r_value != -1:
+ log.debug("r_value=%d" % r_value)
+ r_value, r_value_str, rg, rr = self.__parseRValues(r_value)
+
+ return r_value, r_value_str, rg, rr
+
+ if self.r_values is None:
+
+ if status_type == STATUS_TYPE_S and \
+ self.is_local and \
+ dynamic_counters != STATUS_DYNAMIC_COUNTERS_PML_SNMP:
+
+ try:
+ try:
+ r_value = self.getDynamicCounter(140)
+
+ if r_value is not None:
+ log.debug("r_value=%d" % r_value)
+ r_value, r_value_str, rg, rr = self.__parseRValues(r_value)
+
+ if self.dbus_avail:
+ try:
+ self.service.SetCachedIntValue(self.device_uri, 'r_value', r_value)
+ except dbus.exceptions.DBusException, e:
+ log.debug("dbus call to SetCachedIntValue() failed.")
+ else:
+ log.error("Error attempting to read r-value (2).")
+ r_value = 0
+ except Error:
+ log.error("Error attempting to read r-value (1).")
+ r_value = 0
+ finally:
+ self.closePrint()
+
+
+ elif (status_type == STATUS_TYPE_S and
+ dynamic_counters == STATUS_DYNAMIC_COUNTERS_PCL and
+ not self.is_local) or \
+ dynamic_counters == STATUS_DYNAMIC_COUNTERS_PML_SNMP:
+
+ try:
+ result_code, r_value = self.getPML(pml.OID_R_SETTING)
+
+ if r_value is not None:
+ log.debug("r_value=%d" % r_value)
+ r_value, r_value_str, rg, rr = self.__parseRValues(r_value)
+
+ if self.dbus_avail:
+ try:
+ self.service.SetCachedIntValue(self.device_uri, 'r_value', r_value)
+ except dbus.exceptions.DBusException, e:
+ log.debug("dbus call to SetCachedIntValue() failed.")
+
+ else:
+ r_value = 0
+
+ finally:
+ self.closePML()
+
+ else:
+ r_value, r_value_str, rg, rr = self.r_values
+
+ return r_value, r_value_str, rg, rr
+
+
+ def __queryFax(self, quick=False, reread_cups_printers=False):
+ io_mode = self.mq.get('io-mode', IO_MODE_UNI)
+ self.status_code = STATUS_PRINTER_IDLE
+
+ if io_mode != IO_MODE_UNI:
+
+ if self.device_state != DEVICE_STATE_NOT_FOUND:
+ if self.tech_type in (TECH_TYPE_MONO_INK, TECH_TYPE_COLOR_INK):
+ try:
+ self.getDeviceID()
+ except Error, e:
+ log.error("Error getting device ID.")
+ self.last_event = Event(self.device_uri, '', ERROR_DEVICE_IO_ERROR,
+ prop.username, 0, '', time.time())
+
+ raise Error(ERROR_DEVICE_IO_ERROR)
+
+ status_desc = self.queryString(self.status_code)
+
+ self.dq.update({
+ 'serial' : self.serial,
+ 'cups-printers' : self.cups_printers,
+ 'status-code' : self.status_code,
+ 'status-desc' : status_desc,
+ 'deviceid' : self.raw_deviceID,
+ 'panel' : 0,
+ 'panel-line1' : '',
+ 'panel-line2' : '',
+ 'device-state' : self.device_state,
+ 'error-state' : self.error_state,
+ })
+
+
+ log.debug("Fax activity check...")
+
+ tx_active, rx_active = status.getFaxStatus(self)
+
+ if tx_active:
+ self.status_code = STATUS_FAX_TX_ACTIVE
+ elif rx_active:
+ self.status_code = STATUS_FAX_RX_ACTIVE
+
+ self.error_state = STATUS_TO_ERROR_STATE_MAP.get(self.status_code, ERROR_STATE_CLEAR)
+ self.error_code = self.status_code
+ self.sendEvent(self.error_code)
+
+ try:
+ self.dq.update({'status-desc' : self.queryString(self.status_code),
+ 'error-state' : self.error_state,
+ })
+
+ except (KeyError, Error):
+ self.dq.update({'status-desc' : '',
+ 'error-state' : ERROR_STATE_CLEAR,
+ })
+
+
+ if self.panel_check:
+ self.panel_check = bool(self.mq.get('panel-check-type', 0))
+
+ status_type = self.mq.get('status-type', STATUS_TYPE_NONE)
+ if self.panel_check and \
+ status_type in (STATUS_TYPE_LJ, STATUS_TYPE_S, STATUS_TYPE_VSTATUS) and \
+ io_mode != IO_MODE_UNI:
+
+ log.debug("Panel check...")
+ try:
+ self.panel_check, line1, line2 = status.PanelCheck(self)
+ finally:
+ self.closePML()
+
+ self.dq.update({'panel': int(self.panel_check),
+ 'panel-line1': line1,
+ 'panel-line2': line2,})
+
+ if not quick and reread_cups_printers:
+ self.updateCUPSPrinters()
+
+ for d in self.dq:
+ self.__dict__[d.replace('-','_')] = self.dq[d]
+
+ self.last_event = Event(self.device_uri, '', self.status_code, prop.username, 0, '', time.time())
+
+ log.debug(self.dq)
+
+
+
+ def updateCUPSPrinters(self):
+ self.cups_printers = []
+ log.debug("Re-reading CUPS printer queue information.")
+ printers = cups.getPrinters()
+ for p in printers:
+ if self.device_uri == p.device_uri:
+ self.cups_printers.append(p.name)
+ self.state = p.state # ?
+
+ if self.io_state == IO_STATE_NON_HP:
+ self.model = p.makemodel.split(',')[0]
+
+ self.dq.update({'cups-printers' : self.cups_printers})
+
+ try:
+ self.first_cups_printer = self.cups_printers[0]
+ except IndexError:
+ self.first_cups_printer = ''
+
+
+
+
+ def queryDevice(self, quick=False, reread_cups_printers=False):
+ if not self.supported:
+ self.dq = {}
+
+ self.last_event = Event(self.device_uri, '', STATUS_DEVICE_UNSUPPORTED,
+ prop.username, 0, '', time.time())
+
+ return
+
+ if self.device_type == DEVICE_TYPE_FAX:
+ return self.__queryFax(quick, reread_cups_printers)
+
+ r_type = self.mq.get('r-type', 0)
+ tech_type = self.mq.get('tech-type', TECH_TYPE_NONE)
+ status_type = self.mq.get('status-type', STATUS_TYPE_NONE)
+ battery_check = self.mq.get('status-battery-check', STATUS_BATTERY_CHECK_NONE)
+ dynamic_counters = self.mq.get('status-dynamic-counters', STATUS_DYNAMIC_COUNTERS_NONE)
+ io_mode = self.mq.get('io-mode', IO_MODE_UNI)
+ io_mfp_mode = self.mq.get('io-mfp-mode', IO_MODE_UNI)
+ status_code = STATUS_UNKNOWN
+
+ # Turn off status if local connection and bi-di not avail.
+ #if io_mode == IO_MODE_UNI and self.back_end != 'net':
+ # status_type = STATUS_TYPE_NONE
+
+ agents = []
+
+ if self.device_state != DEVICE_STATE_NOT_FOUND:
+ if self.tech_type in (TECH_TYPE_MONO_INK, TECH_TYPE_COLOR_INK):
+ try:
+ self.getDeviceID()
+ except Error, e:
+ log.error("Error getting device ID.")
+ self.last_event = Event(self.device_uri, '', ERROR_DEVICE_IO_ERROR,
+ prop.username, 0, '', time.time())
+
+ raise Error(ERROR_DEVICE_IO_ERROR)
+
+ status_desc = self.queryString(self.status_code)
+
+ self.dq.update({
+ 'serial' : self.serial,
+ 'cups-printers' : self.cups_printers,
+ 'status-code' : self.status_code,
+ 'status-desc' : status_desc,
+ 'deviceid' : self.raw_deviceID,
+ 'panel' : 0,
+ 'panel-line1' : '',
+ 'panel-line2' : '',
+ 'device-state' : self.device_state,
+ 'error-state' : self.error_state,
+ })
+
+ status_block = {}
+
+ if status_type == STATUS_TYPE_NONE:
+ log.warn("No status available for device.")
+ status_block = {'status-code' : STATUS_UNKNOWN}
+
+ elif status_type in (STATUS_TYPE_VSTATUS, STATUS_TYPE_S):
+ log.debug("Type 1/2 (S: or VSTATUS:) status")
+ status_block = status.parseStatus(self.deviceID)
+
+ elif status_type in (STATUS_TYPE_LJ, STATUS_TYPE_PML_AND_PJL):
+ log.debug("Type 3/9 LaserJet PML(+PJL) status")
+ status_block = status.StatusType3(self, self.deviceID)
+
+ elif status_type == STATUS_TYPE_LJ_XML:
+ log.debug("Type 6: LJ XML")
+ status_block = status.StatusType6(self)
+
+ elif status_type == STATUS_TYPE_PJL:
+ log.debug("Type 8: LJ PJL")
+ status_block = status.StatusType8(self)
+
+ elif status_type == STATUS_TYPE_LEDM:
+ log.debug("Type 10: LEDM")
+ status_block = status.StatusType10(self.getEWSUrl_LEDM)
+
+ elif status_type == STATUS_TYPE_LEDM_FF_CC_0:
+ log.debug("Type 11: LEDM_FF_CC_0")
+ status_block = status.StatusType10(self.getUrl_LEDM)
+
+ else:
+ log.error("Unimplemented status type: %d" % status_type)
+
+ if battery_check and \
+ io_mode != IO_MODE_UNI:
+
+ log.debug("Battery check...")
+ status.BatteryCheck(self, status_block, battery_check)
+
+ if status_block:
+ log.debug(status_block)
+ self.dq.update(status_block)
+ try:
+ status_block['agents']
+ except KeyError:
+ pass
+ else:
+ agents = status_block['agents']
+ del self.dq['agents']
+
+
+ status_code = self.dq.get('status-code', STATUS_UNKNOWN)
+
+## if not quick and \
+## self.mq.get('fax-type', FAX_TYPE_NONE) and \
+## status_code == STATUS_PRINTER_IDLE and \
+## io_mode != IO_MODE_UNI:
+##
+## log.debug("Fax activity check...")
+##
+## tx_active, rx_active = status.getFaxStatus(self)
+##
+## if tx_active:
+## status_code = STATUS_FAX_TX_ACTIVE
+## elif rx_active:
+## status_code = STATUS_FAX_RX_ACTIVE
+
+
+ self.error_state = STATUS_TO_ERROR_STATE_MAP.get(status_code, ERROR_STATE_CLEAR)
+ self.error_code = status_code
+ self.sendEvent(self.error_code)
+
+ try:
+ self.dq.update({'status-desc' : self.queryString(status_code),
+ 'error-state' : self.error_state,
+ })
+
+ except (KeyError, Error):
+ self.dq.update({'status-desc' : '',
+ 'error-state' : ERROR_STATE_CLEAR,
+ })
+
+ r_value = 0
+
+ if not quick and status_type != STATUS_TYPE_NONE:
+ if self.panel_check:
+ self.panel_check = bool(self.mq.get('panel-check-type', 0))
+
+ if self.panel_check and \
+ status_type in (STATUS_TYPE_LJ, STATUS_TYPE_S, STATUS_TYPE_VSTATUS) and \
+ io_mode != IO_MODE_UNI:
+
+ log.debug("Panel check...")
+ try:
+ self.panel_check, line1, line2 = status.PanelCheck(self)
+ finally:
+ self.closePML()
+
+ self.dq.update({'panel': int(self.panel_check),
+ 'panel-line1': line1,
+ 'panel-line2': line2,})
+
+
+ if dynamic_counters != STATUS_DYNAMIC_COUNTERS_NONE and \
+ io_mode != IO_MODE_UNI:
+
+ r_value, r_value_str, rg, rr = self.getRValues(r_type, status_type, dynamic_counters)
+ else:
+ r_value, r_value_str, rg, rr = 0, '000000000', '000', '000000'
+
+ self.dq.update({'r' : r_value,
+ 'rs' : r_value_str,
+ 'rg' : rg,
+ 'rr' : rr,
+ })
+
+ if not quick and reread_cups_printers:
+ self.updateCUPSPrinters()
+
+ if not quick:
+ # Make sure there is some valid agent data for this r_value
+ # If not, fall back to r_value == 0
+ if r_value > 0 and self.mq.get('r%d-agent1-kind' % r_value, 0) == 0:
+ r_value = 0
+ self.dq.update({'r' : r_value,
+ 'rs' : r_value_str,
+ 'rg' : rg,
+ 'rr' : rr,
+ })
+
+ a, aa = 1, 1
+ while True:
+ mq_agent_kind = self.mq.get('r%d-agent%d-kind' % (r_value, a), -1)
+
+ if mq_agent_kind == -1:
+ break
+
+ mq_agent_type = self.mq.get('r%d-agent%d-type' % (r_value, a), 0)
+ mq_agent_sku = self.mq.get('r%d-agent%d-sku' % (r_value, a), '')
+
+ found = False
+
+ log.debug("Looking for kind=%d, type=%d..." % (mq_agent_kind, mq_agent_type))
+ for agent in agents:
+ agent_kind = agent['kind']
+ agent_type = agent['type']
+
+ if agent_kind == mq_agent_kind and \
+ agent_type == mq_agent_type:
+ found = True
+ break
+
+ if found:
+ log.debug("found: r%d-kind%d-type%d" % (r_value, agent_kind, agent_type))
+
+ agent_health = agent.get('health', AGENT_HEALTH_OK)
+ agent_level = agent.get('level', 100)
+ agent_level_trigger = agent.get('level-trigger',
+ AGENT_LEVEL_TRIGGER_SUFFICIENT_0)
+
+ log.debug("health=%d, level=%d, level_trigger=%d, status_code=%d" %
+ (agent_health, agent_level, agent_level_trigger, status_code))
+
+ query = 'agent_%s_%s' % (AGENT_types.get(agent_type, 'unknown'),
+ AGENT_kinds.get(agent_kind, 'unknown'))
+
+ agent_desc = self.queryString(query)
+ query = 'agent_health_ok'
+
+ # If printer is not in an error state, and
+ # if agent health is OK, check for low supplies. If low, use
+ # the agent level trigger description for the agent description.
+ # Otherwise, report the agent health.
+ if (status_code == STATUS_PRINTER_IDLE or status_code == STATUS_PRINTER_OUT_OF_INK) and \
+ (agent_health == AGENT_HEALTH_OK or
+ (agent_health == AGENT_HEALTH_FAIR_MODERATE and agent_kind == AGENT_KIND_HEAD)) and \
+ agent_level_trigger >= AGENT_LEVEL_TRIGGER_MAY_BE_LOW:
+
+ query = 'agent_level_%s' % AGENT_levels.get(agent_level_trigger, 'unknown')
+
+ if tech_type in (TECH_TYPE_MONO_INK, TECH_TYPE_COLOR_INK):
+ code = agent_type + STATUS_PRINTER_LOW_INK_BASE
+ else:
+ code = agent_type + STATUS_PRINTER_LOW_TONER_BASE
+
+ self.dq['status-code'] = code
+ self.dq['status-desc'] = self.queryString(code)
+
+ self.dq['error-state'] = STATUS_TO_ERROR_STATE_MAP.get(code, ERROR_STATE_LOW_SUPPLIES)
+ self.error_code = code
+ self.sendEvent(self.error_code)
+
+ if agent_level_trigger in \
+ (AGENT_LEVEL_TRIGGER_PROBABLY_OUT, AGENT_LEVEL_TRIGGER_ALMOST_DEFINITELY_OUT):
+
+ query = 'agent_level_out'
+ else:
+ query = 'agent_level_low'
+
+ agent_health_desc = self.queryString(query)
+
+ self.dq.update(
+ {
+ 'agent%d-kind' % aa : agent_kind,
+ 'agent%d-type' % aa : agent_type,
+ 'agent%d-known' % aa : agent.get('known', False),
+ 'agent%d-sku' % aa : mq_agent_sku,
+ 'agent%d-level' % aa : agent_level,
+ 'agent%d-level-trigger' % aa : agent_level_trigger,
+ 'agent%d-ack' % aa : agent.get('ack', False),
+ 'agent%d-hp-ink' % aa : agent.get('hp-ink', False),
+ 'agent%d-health' % aa : agent_health,
+ 'agent%d-dvc' % aa : agent.get('dvc', 0),
+ 'agent%d-virgin' % aa : agent.get('virgin', False),
+ 'agent%d-desc' % aa : agent_desc,
+ 'agent%d-id' % aa : agent.get('id', 0),
+ 'agent%d-health-desc' % aa : agent_health_desc,
+ })
+
+ else:
+ query = 'agent_health_%s' % AGENT_healths.get(agent_health, AGENT_HEALTH_OK)
+ agent_health_desc = self.queryString(query)
+
+ self.dq.update(
+ {
+ 'agent%d-kind' % aa : agent_kind,
+ 'agent%d-type' % aa : agent_type,
+ 'agent%d-known' % aa : False,
+ 'agent%d-sku' % aa : mq_agent_sku,
+ 'agent%d-level' % aa : agent_level,
+ 'agent%d-level-trigger' % aa : agent_level_trigger,
+ 'agent%d-ack' % aa : False,
+ 'agent%d-hp-ink' % aa : False,
+ 'agent%d-health' % aa : agent_health,
+ 'agent%d-dvc' % aa : 0,
+ 'agent%d-virgin' % aa : False,
+ 'agent%d-desc' % aa : agent_desc,
+ 'agent%d-id' % aa : 0,
+ 'agent%d-health-desc' % aa : agent_health_desc,
+ })
+
+ aa += 1
+
+ else:
+ log.debug("Not found: %d" % a)
+
+ a += 1
+
+ else: # Create agent keys for not-found devices
+
+ r_value = 0
+ if r_type > 0 and self.r_values is not None:
+ r_value = self.r_values[0]
+
+ # Make sure there is some valid agent data for this r_value
+ # If not, fall back to r_value == 0
+ if r_value > 0 and self.mq.get('r%d-agent1-kind', 0) == 0:
+ r_value = 0
+
+ a = 1
+ while True:
+ mq_agent_kind = self.mq.get('r%d-agent%d-kind' % (r_value, a), 0)
+
+ if mq_agent_kind == 0:
+ break
+
+ mq_agent_type = self.mq.get('r%d-agent%d-type' % (r_value, a), 0)
+ mq_agent_sku = self.mq.get('r%d-agent%d-sku' % (r_value, a), '')
+ query = 'agent_%s_%s' % (AGENT_types.get(mq_agent_type, 'unknown'),
+ AGENT_kinds.get(mq_agent_kind, 'unknown'))
+
+ agent_desc = self.queryString(query)
+
+ self.dq.update(
+ {
+ 'agent%d-kind' % a : mq_agent_kind,
+ 'agent%d-type' % a : mq_agent_type,
+ 'agent%d-known' % a : False,
+ 'agent%d-sku' % a : mq_agent_sku,
+ 'agent%d-level' % a : 0,
+ 'agent%d-level-trigger' % a : AGENT_LEVEL_TRIGGER_ALMOST_DEFINITELY_OUT,
+ 'agent%d-ack' % a : False,
+ 'agent%d-hp-ink' % a : False,
+ 'agent%d-health' % a : AGENT_HEALTH_MISINSTALLED,
+ 'agent%d-dvc' % a : 0,
+ 'agent%d-virgin' % a : False,
+ 'agent%d-health-desc' % a : self.queryString('agent_health_unknown'),
+ 'agent%d-desc' % a : agent_desc,
+ 'agent%d-id' % a : 0,
+ })
+
+ a += 1
+
+ for d in self.dq:
+ self.__dict__[d.replace('-','_')] = self.dq[d]
+
+ self.last_event = Event(self.device_uri, '', status_code, prop.username, 0, '', time.time())
+ log.debug(self.dq)
+
+
+ def isBusyOrInErrorState(self):
+ try:
+ self.queryDevice(quick=True)
+ except Error:
+ return True
+ return self.error_state in (ERROR_STATE_ERROR, ERROR_STATE_BUSY)
+
+
+ def isIdleAndNoError(self):
+ try:
+ self.queryDevice(quick=True)
+ except Error:
+ return False
+ return self.error_state not in (ERROR_STATE_ERROR, ERROR_STATE_BUSY)
+
+
+ def getPML(self, oid, desired_int_size=pml.INT_SIZE_INT): # oid => ( 'dotted oid value', pml type )
+ channel_id = self.openPML()
+
+ result_code, data, typ, pml_result_code = \
+ hpmudext.get_pml(self.device_id, channel_id, pml.PMLToSNMP(oid[0]), oid[1])
+
+ if pml_result_code > pml.ERROR_MAX_OK:
+ log.debug("PML/SNMP GET %s failed (result code = 0x%x)" % (oid[0], pml_result_code))
+ return pml_result_code, None
+
+ converted_data = pml.ConvertFromPMLDataFormat(data, oid[1], desired_int_size)
+
+ if log.is_debug():
+ if oid[1] in (pml.TYPE_STRING, pml.TYPE_BINARY):
+
+ log.debug("PML/SNMP GET %s (result code = 0x%x) returned:" %
+ (oid[0], pml_result_code))
+ log.log_data(data)
+ else:
+ log.debug("PML/SNMP GET %s (result code = 0x%x) returned: %s" %
+ (oid[0], pml_result_code, repr(converted_data)))
+
+ return pml_result_code, converted_data
+
+
+ def setPML(self, oid, value): # oid => ( 'dotted oid value', pml type )
+ channel_id = self.openPML()
+
+ value = pml.ConvertToPMLDataFormat(value, oid[1])
+
+ result_code, pml_result_code = \
+ hpmudext.set_pml(self.device_id, channel_id, pml.PMLToSNMP(oid[0]), oid[1], value)
+
+ if log.is_debug():
+ if oid[1] in (pml.TYPE_STRING, pml.TYPE_BINARY):
+
+ log.debug("PML/SNMP SET %s (result code = 0x%x) to:" %
+ (oid[0], pml_result_code))
+ log.log_data(value)
+ else:
+ log.debug("PML/SNMP SET %s (result code = 0x%x) to: %s" %
+ (oid[0], pml_result_code, repr(value)))
+
+ return pml_result_code
+
+
+ def getDynamicCounter(self, counter, convert_to_int=True):
+ dynamic_counters = self.mq.get('status-dynamic-counters', STATUS_DYNAMIC_COUNTERS_NONE)
+ log.debug("Dynamic counters: %d" % dynamic_counters)
+ if dynamic_counters != STATUS_DYNAMIC_COUNTERS_NONE:
+
+ if dynamic_counters == STATUS_DYNAMIC_COUNTERS_LIDIL_0_5_4:
+ self.printData(ldl.buildResetPacket(), direct=True)
+ self.printData(ldl.buildDynamicCountersPacket(counter), direct=True)
+ else:
+ self.printData(pcl.buildDynamicCounter(counter), direct=True)
+
+ value, tries, times_seen, sleepy_time, max_tries = 0, 0, 0, 0.1, 5
+ time.sleep(0.1)
+
+ while True:
+
+ if self.callback:
+ self.callback()
+
+ sleepy_time += 0.1
+ tries += 1
+
+ time.sleep(sleepy_time)
+
+ self.getDeviceID()
+
+ if 'CTR' in self.deviceID and \
+ pat_dynamic_ctr.search(self.raw_deviceID) is not None:
+ dev_counter, value = parseDynamicCounter(self.deviceID['CTR'], convert_to_int)
+
+ if counter == dev_counter:
+ self.printData(pcl.buildDynamicCounter(0), direct=True)
+ # protect the value as a string during msg handling
+ if not convert_to_int:
+ value = '#' + value
+ return value
+
+ if tries > max_tries:
+ if dynamic_counters == STATUS_DYNAMIC_COUNTERS_LIDIL_0_5_4:
+ self.printData(ldl.buildResetPacket())
+ self.printData(ldl.buildDynamicCountersPacket(counter), direct=True)
+ else:
+ self.printData(pcl.buildDynamicCounter(0), direct=True)
+
+ return None
+
+ if dynamic_counters == STATUS_DYNAMIC_COUNTERS_LIDIL_0_5_4:
+ self.printData(ldl.buildResetPacket())
+ self.printData(ldl.buildDynamicCountersPacket(counter), direct=True)
+ else:
+ self.printData(pcl.buildDynamicCounter(counter), direct=True)
+
+ else:
+ raise Error(ERROR_DEVICE_DOES_NOT_SUPPORT_OPERATION)
+
+
+ def readPrint(self, bytes_to_read, stream=None, timeout=prop.read_timeout, allow_short_read=False):
+ return self.__readChannel(self.openPrint, bytes_to_read, stream, timeout, allow_short_read)
+
+ def readPCard(self, bytes_to_read, stream=None, timeout=prop.read_timeout, allow_short_read=False):
+ return self.__readChannel(self.openPCard, bytes_to_read, stream, timeout, allow_short_read)
+
+ def readFax(self, bytes_to_read, stream=None, timeout=prop.read_timeout, allow_short_read=False):
+ return self.__readChannel(self.openFax, bytes_to_read, stream, timeout, allow_short_read)
+
+ def readCfgUpload(self, bytes_to_read, stream=None, timeout=prop.read_timeout, allow_short_read=False):
+ return self.__readChannel(self.openCfgUpload, bytes_to_read, stream, timeout, allow_short_read)
+
+ def readEWS(self, bytes_to_read, stream=None, timeout=prop.read_timeout, allow_short_read=True):
+ return self.__readChannel(self.openEWS, bytes_to_read, stream, timeout, allow_short_read)
+
+ def readEWS_LEDM(self, bytes_to_read, stream=None, timeout=prop.read_timeout, allow_short_read=True):
+ return self.__readChannel(self.openEWS_LEDM, bytes_to_read, stream, timeout, allow_short_read)
+
+ def readLEDM(self, bytes_to_read, stream=None, timeout=prop.read_timeout, allow_short_read=True):
+ return self.__readChannel(self.openLEDM, bytes_to_read, stream, timeout, allow_short_read)
+
+ def readSoapFax(self, bytes_to_read, stream=None, timeout=prop.read_timeout, allow_short_read=True):
+ return self.__readChannel(self.openSoapFax, bytes_to_read, stream, timeout, allow_short_read)
+
+ def readMarvellFax(self, bytes_to_read, stream=None, timeout=prop.read_timeout, allow_short_read=True):
+ return self.__readChannel(self.openMarvellFax, bytes_to_read, stream, timeout, allow_short_read)
+
+ def readWifiConfig(self, bytes_to_read, stream=None, timeout=prop.read_timeout, allow_short_read=True):
+ return self.__readChannel(self.openWifiConfig, bytes_to_read, stream, timeout, allow_short_read)
+
+ def __readChannel(self, opener, bytes_to_read, stream=None,
+ timeout=prop.read_timeout, allow_short_read=False):
+
+ channel_id = opener()
+
+ log.debug("Reading channel %d (device-id=%d, bytes_to_read=%d, allow_short=%s, timeout=%d)..." %
+ (channel_id, self.device_id, bytes_to_read, allow_short_read, timeout))
+
+ num_bytes = 0
+
+ if stream is None:
+ buffer = ''
+
+ while True:
+ result_code, data = \
+ hpmudext.read_channel(self.device_id, channel_id, bytes_to_read, timeout)
+
+ log.debug("Result code=%d" % result_code)
+
+ l = len(data)
+
+ if result_code == hpmudext.HPMUD_R_IO_TIMEOUT:
+ log.debug("I/O timeout")
+ break
+
+ if result_code != hpmudext.HPMUD_R_OK:
+ log.error("Channel read error")
+ raise Error(ERROR_DEVICE_IO_ERROR)
+
+ if not l:
+ log.debug("End of data")
+ break
+
+ if stream is None:
+ buffer = ''.join([buffer, data])
+ else:
+ stream.write(data)
+
+ num_bytes += l
+
+ if self.callback is not None:
+ self.callback()
+
+ if num_bytes == bytes_to_read:
+ log.debug("Full read complete.")
+ break
+
+ if allow_short_read and num_bytes < bytes_to_read:
+ log.debug("Allowed short read of %d of %d bytes complete." % (num_bytes, bytes_to_read))
+ break
+
+ if stream is None:
+ log.debug("Returned %d total bytes in buffer." % num_bytes)
+ return buffer
+ else:
+ log.debug("Saved %d total bytes to stream." % num_bytes)
+ return num_bytes
+
+
+ def writePrint(self, data):
+ return self.__writeChannel(self.openPrint, data)
+
+ def writePCard(self, data):
+ return self.__writeChannel(self.openPCard, data)
+
+ def writeFax(self, data):
+ return self.__writeChannel(self.openFax, data)
+
+ def writeEWS(self, data):
+ return self.__writeChannel(self.openEWS, data)
+
+ def writeEWS_LEDM(self, data):
+ return self.__writeChannel(self.openEWS_LEDM, data)
+
+ def writeLEDM(self, data):
+ return self.__writeChannel(self.openLEDM, data)
+
+ def writeCfgDownload(self, data):
+ return self.__writeChannel(self.openCfgDownload, data)
+
+ def writeSoapFax(self, data):
+ return self.__writeChannel(self.openSoapFax, data)
+
+ def writeMarvellFax(self, data):
+ return self.__writeChannel(self.openMarvellFax, data)
+
+ def writeWifiConfig(self, data):
+ return self.__writeChannel(self.openWifiConfig, data)
+
+ def __writeChannel(self, opener, data):
+ channel_id = opener()
+ buffer, bytes_out, total_bytes_to_write = data, 0, len(data)
+
+ log.debug("Writing %d bytes to channel %d (device-id=%d)..." % (total_bytes_to_write, channel_id, self.device_id))
+
+ while len(buffer) > 0:
+ result_code, bytes_written = \
+ hpmudext.write_channel(self.device_id, channel_id,
+ buffer[:prop.max_message_len])
+
+ log.debug("Result code=%d" % result_code)
+
+ if result_code != hpmudext.HPMUD_R_OK:
+ log.error("Channel write error")
+ raise Error(ERROR_DEVICE_IO_ERROR)
+
+ buffer = buffer[prop.max_message_len:]
+ bytes_out += bytes_written
+
+ if self.callback is not None:
+ self.callback()
+
+ if total_bytes_to_write != bytes_out:
+ raise Error(ERROR_DEVICE_IO_ERROR)
+
+ return bytes_out
+
+
+ def writeEmbeddedPML(self, oid, value, style=1, direct=True):
+ if style == 1:
+ func = pcl.buildEmbeddedPML2
+ else:
+ func = pcl.buildEmbeddedPML
+
+ data = func(pcl.buildPCLCmd('&', 'b', 'W',
+ pml.buildEmbeddedPMLSetPacket(oid[0],
+ value,
+ oid[1])))
+
+ log.log_data(data)
+
+ self.printData(data, direct=direct, raw=True)
+
+
+ def printGzipFile(self, file_name, printer_name=None, direct=False, raw=True, remove=False):
+ return self.printFile(file_name, printer_name, direct, raw, remove)
+
+ def printParsedGzipPostscript(self, print_file, printer_name=None):
+ # always: direct=False, raw=False, remove=True
+ try:
+ os.stat(print_file)
+ except OSError:
+ log.error("File not found: %s" % print_file)
+ return
+
+ temp_file_fd, temp_file_name = utils.make_temp_file()
+ f = gzip.open(print_file, 'r')
+
+ x = f.readline()
+ while not x.startswith('%PY_BEGIN'):
+ os.write(temp_file_fd, x)
+ x = f.readline()
+
+ sub_lines = []
+ x = f.readline()
+ while not x.startswith('%PY_END'):
+ sub_lines.append(x)
+ x = f.readline()
+
+ SUBS = {'VERSION' : prop.version,
+ 'MODEL' : self.model_ui,
+ 'URI' : self.device_uri,
+ 'BUS' : self.bus,
+ 'SERIAL' : self.serial,
+ 'IP' : self.host,
+ 'PORT' : self.port,
+ 'DEVNODE' : self.dev_file,
+ }
+
+ if self.bus == 'net':
+ SUBS['DEVNODE'] = 'n/a'
+ else:
+ SUBS['IP'] = 'n/a'
+ SUBS['PORT'] = 'n/a'
+
+ for s in sub_lines:
+ os.write(temp_file_fd, s % SUBS)
+
+ os.write(temp_file_fd, f.read())
+ f.close()
+ os.close(temp_file_fd)
+
+ self.printFile(temp_file_name, printer_name, direct=False, raw=False, remove=True)
+
+ def printFile(self, file_name, printer_name=None, direct=False, raw=True, remove=False):
+ is_gzip = os.path.splitext(file_name)[-1].lower() == '.gz'
+
+ if printer_name is None:
+ printer_name = self.first_cups_printer
+
+ if not printer_name:
+ raise Error(ERROR_NO_CUPS_QUEUE_FOUND_FOR_DEVICE)
+
+ log.debug("Printing file '%s' to queue '%s' (gzip=%s, direct=%s, raw=%s, remove=%s)" %
+ (file_name, printer_name, is_gzip, direct, raw, remove))
+
+ if direct: # implies raw==True
+ if is_gzip:
+ self.writePrint(gzip.open(file_name, 'r').read())
+ else:
+ self.writePrint(file(file_name, 'r').read())
+
+ else:
+ if not utils.which('lpr'):
+ lp_opt = ''
+
+ if raw:
+ lp_opt = '-oraw'
+
+ if is_gzip:
+ c = 'gunzip -c %s | lp -c -d%s %s' % (file_name, printer_name, lp_opt)
+ else:
+ c = 'lp -c -d%s %s %s' % (printer_name, lp_opt, file_name)
+
+ log.debug(c)
+ exit_code = os.system(c)
+
+ if exit_code != 0:
+ log.error("Print command failed with exit code %d!" % exit_code)
+
+ if remove:
+ os.remove(file_name)
+
+ else:
+ raw_str, rem_str = '', ''
+ if raw: raw_str = '-o raw'
+ if remove: rem_str = '-r'
+
+ if is_gzip:
+ c = 'gunzip -c %s | lpr %s %s -P%s' % (file_name, raw_str, rem_str, printer_name)
+ else:
+ c = 'lpr -P%s %s %s %s' % (printer_name, raw_str, rem_str, file_name)
+
+ log.debug(c)
+ exit_code = os.system(c)
+
+ if exit_code != 0:
+ log.error("Print command failed with exit code %d!" % exit_code)
+
+
+ def printTestPage(self, printer_name=None):
+ return self.printParsedGzipPostscript(os.path.join( prop.home_dir, 'data',
+ 'ps', 'testpage.ps.gz' ), printer_name)
+
+
+ def printData(self, data, printer_name=None, direct=True, raw=True):
+ #log.log_data(data)
+ #log.debug("printData(direct=%s, raw=%s)" % (direct, raw))
+ if direct:
+ self.writePrint(data)
+ else:
+ temp_file_fd, temp_file_name = utils.make_temp_file()
+ os.write(temp_file_fd, data)
+ os.close(temp_file_fd)
+
+ self.printFile(temp_file_name, printer_name, False, raw, remove=True)
+
+
+ def cancelJob(self, jobid):
+ cups.cancelJob(jobid)
+ self.error_code = STATUS_PRINTER_CANCELING
+ self.sendEvent(self.error_code)
+
+
+ def queryHistory(self):
+ result = []
+
+ if self.dbus_avail:
+ try:
+ device_uri, history = self.service.GetHistory(self.device_uri)
+ except dbus.exceptions.DBusException, e:
+ log.error("dbus call to GetHistory() failed.")
+ return []
+
+ history.reverse()
+
+ for h in history:
+ result.append(Event(*tuple(h)))
+
+ try:
+ self.error_code = result[0].event_code
+ except IndexError:
+ self.error_code = STATUS_UNKNOWN
+
+ self.error_state = STATUS_TO_ERROR_STATE_MAP.get(self.error_code, ERROR_STATE_CLEAR)
+
+ else:
+ self.error_code = STATUS_UNKNOWN
+ self.error_state = ERROR_STATE_CLEAR
+
+ self.hist = result
+ return result
+
+ def getEWSUrl(self, url, stream):
+ try:
+ if self.is_local:
+ url2 = "%s&loc=%s" % (self.device_uri.replace('hpfax:', 'hp:'), url)
+ data = self
+ else:
+ url2 = "http://%s%s" % (self.host, url)
+ if self.zc:
+ status, ip = hpmudext.get_zc_ip_address(self.zc)
+ if status == hpmudext.HPMUD_R_OK:
+ url2 = "http://%s%s" % (ip, url)
+ data = None
+
+ log.debug("Opening: %s" % url2)
+ opener = LocalOpener({})
+ try:
+ f = opener.open(url2, data)
+ except Error:
+ log.error("Status read failed: %s" % url2)
+ stream.seek(0)
+ stream.truncate()
+ else:
+ try:
+ stream.write(f.read())
+ finally:
+ f.close()
+
+ finally:
+ self.closeEWS()
+
+ def getEWSUrl_LEDM(self, url, stream, footer=""):
+ try:
+ url2 = "%s&loc=%s" % (self.device_uri.replace('hpfax:', 'hp:'), url)
+ data = self
+ opener = LocalOpenerEWS_LEDM({})
+ try:
+ if footer:
+ return opener.open_hp(url2, data, footer)
+ else:
+ return opener.open_hp(url2, data)
+ except Error:
+ log.debug("Status read failed: %s" % url2)
+ finally:
+ self.closeEWS_LEDM()
+
+ def getUrl_LEDM(self, url, stream, footer=""):
+ try:
+ url2 = "%s&loc=%s" % (self.device_uri.replace('hpfax:', 'hp:'), url)
+ data = self
+ opener = LocalOpener_LEDM({})
+ try:
+ if footer:
+ return opener.open_hp(url2, data, footer)
+ else:
+ return opener.open_hp(url2, data)
+ except Error:
+ log.debug("Status read failed: %s" % url2)
+
+ finally:
+ self.closeLEDM()
+
+ def FetchLEDMUrl(self, url, footer=""):
+ data_fp = cStringIO.StringIO()
+ if footer:
+ data = self.getUrl_LEDM(url, data_fp, footer)
+ else:
+ data = self.getUrl_LEDM(url, data_fp)
+ if data:
+ data = data.split('\r\n\r\n', 1)[1]
+ if data:
+ data = status.clean(data)
+ return data
+
+#-------------------------For LEDM SOAP PROTOCOL(FAX) Devices----------------------------------------------------------------------#
+
+ def FetchEWS_LEDMUrl(self, url, footer=""):
+ data_fp = cStringIO.StringIO()
+ if footer:
+ data = self.getEWSUrl_LEDM(url, data_fp, footer)
+ else:
+ data = self.getEWSUrl_LEDM(url, data_fp)
+ if data:
+ data = data.split('\r\n\r\n', 1)[1]
+ if data:
+ data = status.clean(data)
+ return data
+
+ def readAttributeFromXml_EWS(self, uri, attribute):
+ stream = cStringIO.StringIO()
+ data = self.FetchEWS_LEDMUrl(uri)
+ if not data:
+ log.error("Unable To read the XML data from device")
+ return ""
+ xmlDict = utils.XMLToDictParser().parseXML(data)
+ try:
+ return str(xmlDict[attribute])
+ except:
+ return str("")
+
+#---------------------------------------------------------------------------------------------------#
+
+ def readAttributeFromXml(self,uri,attribute):
+ stream = cStringIO.StringIO()
+ data = self.FetchLEDMUrl(uri)
+ if not data:
+ log.error("Unable To read the XML data from device")
+ return ""
+ xmlDict = utils.XMLToDictParser().parseXML(data)
+ try:
+ return str(xmlDict[attribute])
+ except:
+ return str("")
+
+ def downloadFirmware(self, usb_bus_id=None, usb_device_id=None): # Note: IDs not currently used
+ ok = False
+ filename = os.path.join(prop.data_dir, "firmware", self.model.lower() + '.fw.gz')
+ log.debug(filename)
+
+ if os.path.exists(filename):
+ log.debug("Downloading firmware file '%s'..." % filename)
+
+ # Write to port directly (no MUD) so that HAL can enumerate the printer
+ if 0: # this currently doesn't work because usblp is loaded...
+ #if usb_bus_id is not None and usb_device_id is not None:
+ try:
+ p = "/dev/bus/usb/%s/%s" % (usb_bus_id, usb_device_id)
+ log.debug("Writing to %s..." % p)
+ f = os.open(p, os.O_RDWR)
+ x = gzip.open(filename).read()
+ os.write(f, x)
+ os.close(f)
+ ok = True
+ log.debug("OK")
+ except (OSError, IOError), e:
+ log.error("An error occured: %s" % e)
+ else:
+ try:
+ self.openPrint()
+ bytes_written = self.writePrint(gzip.open(filename).read())
+ log.debug("%s bytes downloaded." % utils.commafy(bytes_written))
+ self.closePrint()
+ ok = True
+ log.debug("OK")
+ except Error, e:
+ log.error("An error occured: %s" % e.msg)
+ else:
+ log.error("Firmware file '%s' not found." % filename)
+
+ return ok
+
+
+# ********************************** Support classes/functions
+
+
+class xStringIO(StringIO.StringIO):
+ def makefile(self, x, y):
+ return self
+
+# URLs: hp:/usb/HP_LaserJet_3050?serial=00XXXXXXXXXX&loc=/hp/device/info_device_status.xml
+class LocalOpener(urllib.URLopener):
+ def open_hp(self, url, dev):
+ log.debug("open_hp(%s)" % url)
+
+ match_obj = http_pat_url.search(url)
+ bus = match_obj.group(1) or ''
+ model = match_obj.group(2) or ''
+ serial = match_obj.group(3) or ''
+ device = match_obj.group(4) or ''
+ loc = match_obj.group(5) or ''
+
+ dev.openEWS()
+ dev.writeEWS("""GET %s HTTP/1.0\nContent-Length:0\nHost:localhost\nUser-Agent:hplip\n\n""" % loc)
+
+ reply = xStringIO()
+
+ while dev.readEWS(8192, reply, timeout=1):
+ pass
+
+ reply.seek(0)
+ log.log_data(reply.getvalue())
+
+ response = httplib.HTTPResponse(reply)
+ response.begin()
+
+ if response.status != httplib.OK:
+ raise Error(ERROR_DEVICE_STATUS_NOT_AVAILABLE)
+ else:
+ return response.fp
+
+# URLs: hp:/usb/HP_OfficeJet_7500?serial=00XXXXXXXXXX&loc=/hp/device/info_device_status.xml
+class LocalOpenerEWS_LEDM(urllib.URLopener):
+ def open_hp(self, url, dev, foot=""):
+ log.debug("open_hp(%s)" % url)
+
+ match_obj = http_pat_url.search(url)
+ loc = url.split("=")[url.count("=")]
+
+ dev.openEWS_LEDM()
+ if foot:
+ if "PUT" in foot:
+ dev.writeEWS_LEDM("""%s""" % foot)
+ else:
+ dev.writeEWS_LEDM("""POST %s HTTP/1.1\r\nContent-Type:text/xml\r\nContent-Length:%s\r\nAccept-Encoding: UTF-8\r\nHost:localhost\r\nUser-Agent:hplip\r\n\r\n """ % (loc, len(foot)))
+ dev.writeEWS_LEDM("""%s""" % foot)
+ else:
+ dev.writeEWS_LEDM("""GET %s HTTP/1.1\r\nAccept: text/plain\r\nHost:localhost\r\nUser-Agent:hplip\r\n\r\n""" % loc)
+
+ reply = xStringIO()
+
+ while dev.readEWS_LEDM(512, reply, timeout=3):
+ pass
+
+ reply.seek(0)
+ return reply.getvalue()
+
+# URLs: hp:/usb/HP_OfficeJet_7500?serial=00XXXXXXXXXX&loc=/hp/device/info_device_status.xml
+class LocalOpener_LEDM(urllib.URLopener):
+ def open_hp(self, url, dev, foot=""):
+ log.debug("open_hp(%s)" % url)
+
+ match_obj = http_pat_url.search(url)
+ loc = url.split("=")[url.count("=")]
+
+ dev.openLEDM()
+ if foot:
+ if "PUT" in foot:
+ dev.writeLEDM("""%s""" % foot)
+ else:
+ dev.writeLEDM("""POST %s HTTP/1.1\r\nContent-Type:text/xml\r\nContent-Length:%s\r\nAccept-Encoding: UTF-8\r\nHost:localhost\r\nUser-Agent:hplip\r\n\r\n """ % (loc, len(foot)))
+ dev.writeLEDM("""%s""" % foot)
+ else:
+ dev.writeLEDM("""GET %s HTTP/1.1\r\nAccept: text/plain\r\nHost:localhost\r\nUser-Agent:hplip\r\n\r\n""" % loc)
+
+ reply = xStringIO()
+
+ while dev.readLEDM(512, reply, timeout=3):
+ pass
+
+ reply.seek(0)
+ return reply.getvalue()
+
+
+
diff --git a/base/dime.py b/base/dime.py
new file mode 100644
index 0000000..6dbd659
--- /dev/null
+++ b/base/dime.py
@@ -0,0 +1,110 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2008 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+# Std Lib
+import struct
+
+# Local
+from g import *
+
+# DIME constants
+TYPE_T_MIME = 0x01
+TYPE_T_URI = 0x02
+DIME_VERSION = 1
+PAD_SIZE = 4
+
+
+class Record(object):
+ def __init__(self, id, typ, typ_code, payload):
+ self.id = id
+ self.typ = typ
+ self.typ_code = typ_code
+ self.payload = payload
+
+
+class Message(object):
+ def __init__(self):
+ self.records = []
+
+ def add_record(self, rec):
+ self.records.append(rec)
+
+ def generate(self, output): # output is a stream type
+ for i, r in enumerate(self.records):
+ log.debug("Processing record %d (%s)" % (i, r.id))
+ mb = me = cf = 0
+ if i == 0: mb = 1
+ if i == len(self.records)-1: me = 1
+
+ output.write(struct.pack("!B", ((DIME_VERSION & 0x1f) << 3 |
+ (mb & 0x01) << 2 |
+ (me & 0x01) << 1 |
+ (cf & 0x01))))
+
+ output.write(struct.pack("!B", ((r.typ_code & 0xf) << 4) & 0xf0))
+
+ output.write(struct.pack("!H", 0)) # Options length
+
+ id_len = self.bytes_needed(len(r.id))
+ output.write(struct.pack("!H", len(r.id))) # ID length
+
+ typ_len = self.bytes_needed(len(r.typ))
+ output.write(struct.pack("!H", len(r.typ))) # Type length
+
+ data_len = self.bytes_needed(len(r.payload))
+ output.write(struct.pack("!I", len(r.payload))) # Data length
+
+ if id_len:
+ output.write(struct.pack("%ds" % id_len, r.id))
+
+ if typ_len:
+ output.write(struct.pack("%ds" % typ_len, r.typ))
+
+ if data_len:
+ output.write(struct.pack("%ds" % data_len, r.payload))
+
+
+ def bytes_needed(self, data_len, block_size=PAD_SIZE):
+ if data_len % block_size == 0:
+ return data_len
+ else:
+ return (data_len/block_size+1)*block_size
+
+
+
+
+if __name__ == "__main__":
+ log.set_level("debug")
+ import cStringIO
+ m = Message()
+ m.add_record(Record("cid:id0", "http://schemas.xmlsoap.org/soap/envelope/",
+ TYPE_T_URI, "<test>test</test>"))
+
+ m.add_record(Record("test2", "text/xml", TYPE_T_MIME, "<test>test2</test>"))
+
+ output = cStringIO.StringIO()
+
+ m.generate(output)
+
+ log.log_data(output.getvalue())
+
+
+
diff --git a/base/exif.py b/base/exif.py
new file mode 100644
index 0000000..2131374
--- /dev/null
+++ b/base/exif.py
@@ -0,0 +1,1078 @@
+# Library to extract EXIF information in digital camera image files
+#
+# Contains code from "exifdump.py" originally written by Thierry Bousch
+# <bousch@topo.math.u-psud.fr> and released into the public domain.
+#
+# Updated and turned into general-purpose library by Gene Cash
+# <email gcash at cfl.rr.com>
+#
+# This copyright license is intended to be similar to the FreeBSD license.
+#
+# Copyright 2002 Gene Cash All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the
+# distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY GENE CASH ``AS IS'' AND ANY EXPRESS OR
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR
+# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+#
+# This means you may do anything you want with this code, except claim you
+# wrote it. Also, if it breaks you get to keep both pieces.
+#
+# 21-AUG-99 TB Last update by Thierry Bousch to his code.
+# 17-JAN-02 CEC Discovered code on web.
+# Commented everything.
+# Made small code improvements.
+# Reformatted for readability.
+# 19-JAN-02 CEC Added ability to read TIFFs and JFIF-format JPEGs.
+# Added ability to extract JPEG formatted thumbnail.
+# Added ability to read GPS IFD (not tested).
+# Converted IFD data structure to dictionaries indexed by
+# tag name.
+# Factored into library returning dictionary of IFDs plus
+# thumbnail, if any.
+# 20-JAN-02 CEC Added MakerNote processing logic.
+# Added Olympus MakerNote.
+# Converted data structure to single-level dictionary, avoiding
+# tag name collisions by prefixing with IFD name. This makes
+# it much easier to use.
+# 23-JAN-02 CEC Trimmed nulls from end of string values.
+# 25-JAN-02 CEC Discovered JPEG thumbnail in Olympus TIFF MakerNote.
+# 26-JAN-02 CEC Added ability to extract TIFF thumbnails.
+# Added Nikon, Fujifilm, Casio MakerNotes.
+# 30-NOV-03 CEC Fixed problem with canon_decode_tag() not creating an
+# IFD_Tag() object.
+# 15-FEB-04 CEC Finally fixed bit shift warning by converting Y to 0L.
+#
+# To do:
+# * Better printing of ratios
+
+# field type descriptions as (length, abbreviation, full name) tuples
+FIELD_TYPES=(
+ (0, 'X', 'Proprietary'), # no such type
+ (1, 'B', 'Byte'),
+ (1, 'A', 'ASCII'),
+ (2, 'S', 'Short'),
+ (4, 'L', 'Long'),
+ (8, 'R', 'Ratio'),
+ (1, 'SB', 'Signed Byte'),
+ (1, 'U', 'Undefined'),
+ (2, 'SS', 'Signed Short'),
+ (4, 'SL', 'Signed Long'),
+ (8, 'SR', 'Signed Ratio')
+ )
+
+# dictionary of main EXIF tag names
+# first element of tuple is tag name, optional second element is
+# another dictionary giving names to values
+EXIF_TAGS={
+ 0x0100: ('ImageWidth', ),
+ 0x0101: ('ImageLength', ),
+ 0x0102: ('BitsPerSample', ),
+ 0x0103: ('Compression',
+ {1: 'Uncompressed TIFF',
+ 6: 'JPEG Compressed'}),
+ 0x0106: ('PhotometricInterpretation', ),
+ 0x010A: ('FillOrder', ),
+ 0x010D: ('DocumentName', ),
+ 0x010E: ('ImageDescription', ),
+ 0x010F: ('Make', ),
+ 0x0110: ('Model', ),
+ 0x0111: ('StripOffsets', ),
+ 0x0112: ('Orientation', ),
+ 0x0115: ('SamplesPerPixel', ),
+ 0x0116: ('RowsPerStrip', ),
+ 0x0117: ('StripByteCounts', ),
+ 0x011A: ('XResolution', ),
+ 0x011B: ('YResolution', ),
+ 0x011C: ('PlanarConfiguration', ),
+ 0x0128: ('ResolutionUnit',
+ {1: 'Not Absolute',
+ 2: 'Pixels/Inch',
+ 3: 'Pixels/Centimeter'}),
+ 0x012D: ('TransferFunction', ),
+ 0x0131: ('Software', ),
+ 0x0132: ('DateTime', ),
+ 0x013B: ('Artist', ),
+ 0x013E: ('WhitePoint', ),
+ 0x013F: ('PrimaryChromaticities', ),
+ 0x0156: ('TransferRange', ),
+ 0x0200: ('JPEGProc', ),
+ 0x0201: ('JPEGInterchangeFormat', ),
+ 0x0202: ('JPEGInterchangeFormatLength', ),
+ 0x0211: ('YCbCrCoefficients', ),
+ 0x0212: ('YCbCrSubSampling', ),
+ 0x0213: ('YCbCrPositioning', ),
+ 0x0214: ('ReferenceBlackWhite', ),
+ 0x828D: ('CFARepeatPatternDim', ),
+ 0x828E: ('CFAPattern', ),
+ 0x828F: ('BatteryLevel', ),
+ 0x8298: ('Copyright', ),
+ 0x829A: ('ExposureTime', ),
+ 0x829D: ('FNumber', ),
+ 0x83BB: ('IPTC/NAA', ),
+ 0x8769: ('ExifOffset', ),
+ 0x8773: ('InterColorProfile', ),
+ 0x8822: ('ExposureProgram',
+ {0: 'Unidentified',
+ 1: 'Manual',
+ 2: 'Program Normal',
+ 3: 'Aperture Priority',
+ 4: 'Shutter Priority',
+ 5: 'Program Creative',
+ 6: 'Program Action',
+ 7: 'Portrait Mode',
+ 8: 'Landscape Mode'}),
+ 0x8824: ('SpectralSensitivity', ),
+ 0x8825: ('GPSInfo', ),
+ 0x8827: ('ISOSpeedRatings', ),
+ 0x8828: ('OECF', ),
+ # print as string
+ 0x9000: ('ExifVersion', lambda x: ''.join(map(chr, x))),
+ 0x9003: ('DateTimeOriginal', ),
+ 0x9004: ('DateTimeDigitized', ),
+ 0x9101: ('ComponentsConfiguration',
+ {0: '',
+ 1: 'Y',
+ 2: 'Cb',
+ 3: 'Cr',
+ 4: 'Red',
+ 5: 'Green',
+ 6: 'Blue'}),
+ 0x9102: ('CompressedBitsPerPixel', ),
+ 0x9201: ('ShutterSpeedValue', ),
+ 0x9202: ('ApertureValue', ),
+ 0x9203: ('BrightnessValue', ),
+ 0x9204: ('ExposureBiasValue', ),
+ 0x9205: ('MaxApertureValue', ),
+ 0x9206: ('SubjectDistance', ),
+ 0x9207: ('MeteringMode',
+ {0: 'Unidentified',
+ 1: 'Average',
+ 2: 'CenterWeightedAverage',
+ 3: 'Spot',
+ 4: 'MultiSpot'}),
+ 0x9208: ('LightSource',
+ {0: 'Unknown',
+ 1: 'Daylight',
+ 2: 'Fluorescent',
+ 3: 'Tungsten',
+ 10: 'Flash',
+ 17: 'Standard Light A',
+ 18: 'Standard Light B',
+ 19: 'Standard Light C',
+ 20: 'D55',
+ 21: 'D65',
+ 22: 'D75',
+ 255: 'Other'}),
+ 0x9209: ('Flash', {0: 'No',
+ 1: 'Fired',
+ 5: 'Fired (?)', # no return sensed
+ 7: 'Fired (!)', # return sensed
+ 9: 'Fill Fired',
+ 13: 'Fill Fired (?)',
+ 15: 'Fill Fired (!)',
+ 16: 'Off',
+ 24: 'Auto Off',
+ 25: 'Auto Fired',
+ 29: 'Auto Fired (?)',
+ 31: 'Auto Fired (!)',
+ 32: 'Not Available'}),
+ 0x920A: ('FocalLength', ),
+ 0x927C: ('MakerNote', ),
+ # print as string
+ 0x9286: ('UserComment', lambda x: ''.join(map(chr, x))),
+ 0x9290: ('SubSecTime', ),
+ 0x9291: ('SubSecTimeOriginal', ),
+ 0x9292: ('SubSecTimeDigitized', ),
+ # print as string
+ 0xA000: ('FlashPixVersion', lambda x: ''.join(map(chr, x))),
+ 0xA001: ('ColorSpace', ),
+ 0xA002: ('ExifImageWidth', ),
+ 0xA003: ('ExifImageLength', ),
+ 0xA005: ('InteroperabilityOffset', ),
+ 0xA20B: ('FlashEnergy', ), # 0x920B in TIFF/EP
+ 0xA20C: ('SpatialFrequencyResponse', ), # 0x920C - -
+ 0xA20E: ('FocalPlaneXResolution', ), # 0x920E - -
+ 0xA20F: ('FocalPlaneYResolution', ), # 0x920F - -
+ 0xA210: ('FocalPlaneResolutionUnit', ), # 0x9210 - -
+ 0xA214: ('SubjectLocation', ), # 0x9214 - -
+ 0xA215: ('ExposureIndex', ), # 0x9215 - -
+ 0xA217: ('SensingMethod', ), # 0x9217 - -
+ 0xA300: ('FileSource',
+ {3: 'Digital Camera'}),
+ 0xA301: ('SceneType',
+ {1: 'Directly Photographed'}),
+ }
+
+# interoperability tags
+INTR_TAGS={
+ 0x0001: ('InteroperabilityIndex', ),
+ 0x0002: ('InteroperabilityVersion', ),
+ 0x1000: ('RelatedImageFileFormat', ),
+ 0x1001: ('RelatedImageWidth', ),
+ 0x1002: ('RelatedImageLength', ),
+ }
+
+# GPS tags (not used yet, haven't seen camera with GPS)
+GPS_TAGS={
+ 0x0000: ('GPSVersionID', ),
+ 0x0001: ('GPSLatitudeRef', ),
+ 0x0002: ('GPSLatitude', ),
+ 0x0003: ('GPSLongitudeRef', ),
+ 0x0004: ('GPSLongitude', ),
+ 0x0005: ('GPSAltitudeRef', ),
+ 0x0006: ('GPSAltitude', ),
+ 0x0007: ('GPSTimeStamp', ),
+ 0x0008: ('GPSSatellites', ),
+ 0x0009: ('GPSStatus', ),
+ 0x000A: ('GPSMeasureMode', ),
+ 0x000B: ('GPSDOP', ),
+ 0x000C: ('GPSSpeedRef', ),
+ 0x000D: ('GPSSpeed', ),
+ 0x000E: ('GPSTrackRef', ),
+ 0x000F: ('GPSTrack', ),
+ 0x0010: ('GPSImgDirectionRef', ),
+ 0x0011: ('GPSImgDirection', ),
+ 0x0012: ('GPSMapDatum', ),
+ 0x0013: ('GPSDestLatitudeRef', ),
+ 0x0014: ('GPSDestLatitude', ),
+ 0x0015: ('GPSDestLongitudeRef', ),
+ 0x0016: ('GPSDestLongitude', ),
+ 0x0017: ('GPSDestBearingRef', ),
+ 0x0018: ('GPSDestBearing', ),
+ 0x0019: ('GPSDestDistanceRef', ),
+ 0x001A: ('GPSDestDistance', )
+ }
+
+# Nikon E99x MakerNote Tags
+# http://members.tripod.com/~tawba/990exif.htm
+MAKERNOTE_NIKON_NEWER_TAGS={
+ 0x0002: ('ISOSetting', ),
+ 0x0003: ('ColorMode', ),
+ 0x0004: ('Quality', ),
+ 0x0005: ('Whitebalance', ),
+ 0x0006: ('ImageSharpening', ),
+ 0x0007: ('FocusMode', ),
+ 0x0008: ('FlashSetting', ),
+ 0x000F: ('ISOSelection', ),
+ 0x0080: ('ImageAdjustment', ),
+ 0x0082: ('AuxiliaryLens', ),
+ 0x0085: ('ManualFocusDistance', ),
+ 0x0086: ('DigitalZoomFactor', ),
+ 0x0088: ('AFFocusPosition',
+ {0x0000: 'Center',
+ 0x0100: 'Top',
+ 0x0200: 'Bottom',
+ 0x0300: 'Left',
+ 0x0400: 'Right'}),
+ 0x0094: ('Saturation',
+ {-3: 'B&W',
+ -2: '-2',
+ -1: '-1',
+ 0: '0',
+ 1: '1',
+ 2: '2'}),
+ 0x0095: ('NoiseReduction', ),
+ 0x0010: ('DataDump', )
+ }
+
+MAKERNOTE_NIKON_OLDER_TAGS={
+ 0x0003: ('Quality',
+ {1: 'VGA Basic',
+ 2: 'VGA Normal',
+ 3: 'VGA Fine',
+ 4: 'SXGA Basic',
+ 5: 'SXGA Normal',
+ 6: 'SXGA Fine'}),
+ 0x0004: ('ColorMode',
+ {1: 'Color',
+ 2: 'Monochrome'}),
+ 0x0005: ('ImageAdjustment',
+ {0: 'Normal',
+ 1: 'Bright+',
+ 2: 'Bright-',
+ 3: 'Contrast+',
+ 4: 'Contrast-'}),
+ 0x0006: ('CCDSpeed',
+ {0: 'ISO 80',
+ 2: 'ISO 160',
+ 4: 'ISO 320',
+ 5: 'ISO 100'}),
+ 0x0007: ('WhiteBalance',
+ {0: 'Auto',
+ 1: 'Preset',
+ 2: 'Daylight',
+ 3: 'Incandescent',
+ 4: 'Fluorescent',
+ 5: 'Cloudy',
+ 6: 'Speed Light'})
+ }
+
+# decode Olympus SpecialMode tag in MakerNote
+def olympus_special_mode(v):
+ a={
+ 0: 'Normal',
+ 1: 'Unknown',
+ 2: 'Fast',
+ 3: 'Panorama'}
+ b={
+ 0: 'Non-panoramic',
+ 1: 'Left to right',
+ 2: 'Right to left',
+ 3: 'Bottom to top',
+ 4: 'Top to bottom'}
+ return '%s - sequence %d - %s' % (a[v[0]], v[1], b[v[2]])
+
+MAKERNOTE_OLYMPUS_TAGS={
+ # ah HAH! those sneeeeeaky bastids! this is how they get past the fact
+ # that a JPEG thumbnail is not allowed in an uncompressed TIFF file
+ 0x0100: ('JPEGThumbnail', ),
+ 0x0200: ('SpecialMode', olympus_special_mode),
+ 0x0201: ('JPEGQual',
+ {1: 'SQ',
+ 2: 'HQ',
+ 3: 'SHQ'}),
+ 0x0202: ('Macro',
+ {0: 'Normal',
+ 1: 'Macro'}),
+ 0x0204: ('DigitalZoom', ),
+ 0x0207: ('SoftwareRelease', ),
+ 0x0208: ('PictureInfo', ),
+ # print as string
+ 0x0209: ('CameraID', lambda x: ''.join(map(chr, x))),
+ 0x0F00: ('DataDump', )
+ }
+
+MAKERNOTE_CASIO_TAGS={
+ 0x0001: ('RecordingMode',
+ {1: 'Single Shutter',
+ 2: 'Panorama',
+ 3: 'Night Scene',
+ 4: 'Portrait',
+ 5: 'Landscape'}),
+ 0x0002: ('Quality',
+ {1: 'Economy',
+ 2: 'Normal',
+ 3: 'Fine'}),
+ 0x0003: ('FocusingMode',
+ {2: 'Macro',
+ 3: 'Auto Focus',
+ 4: 'Manual Focus',
+ 5: 'Infinity'}),
+ 0x0004: ('FlashMode',
+ {1: 'Auto',
+ 2: 'On',
+ 3: 'Off',
+ 4: 'Red Eye Reduction'}),
+ 0x0005: ('FlashIntensity',
+ {11: 'Weak',
+ 13: 'Normal',
+ 15: 'Strong'}),
+ 0x0006: ('Object Distance', ),
+ 0x0007: ('WhiteBalance',
+ {1: 'Auto',
+ 2: 'Tungsten',
+ 3: 'Daylight',
+ 4: 'Fluorescent',
+ 5: 'Shade',
+ 129: 'Manual'}),
+ 0x000B: ('Sharpness',
+ {0: 'Normal',
+ 1: 'Soft',
+ 2: 'Hard'}),
+ 0x000C: ('Contrast',
+ {0: 'Normal',
+ 1: 'Low',
+ 2: 'High'}),
+ 0x000D: ('Saturation',
+ {0: 'Normal',
+ 1: 'Low',
+ 2: 'High'}),
+ 0x0014: ('CCDSpeed',
+ {64: 'Normal',
+ 80: 'Normal',
+ 100: 'High',
+ 125: '+1.0',
+ 244: '+3.0',
+ 250: '+2.0',})
+ }
+
+MAKERNOTE_FUJIFILM_TAGS={
+ 0x0000: ('NoteVersion', lambda x: ''.join(map(chr, x))),
+ 0x1000: ('Quality', ),
+ 0x1001: ('Sharpness',
+ {1: 'Soft',
+ 2: 'Soft',
+ 3: 'Normal',
+ 4: 'Hard',
+ 5: 'Hard'}),
+ 0x1002: ('WhiteBalance',
+ {0: 'Auto',
+ 256: 'Daylight',
+ 512: 'Cloudy',
+ 768: 'DaylightColor-Fluorescent',
+ 769: 'DaywhiteColor-Fluorescent',
+ 770: 'White-Fluorescent',
+ 1024: 'Incandescent',
+ 3840: 'Custom'}),
+ 0x1003: ('Color',
+ {0: 'Normal',
+ 256: 'High',
+ 512: 'Low'}),
+ 0x1004: ('Tone',
+ {0: 'Normal',
+ 256: 'High',
+ 512: 'Low'}),
+ 0x1010: ('FlashMode',
+ {0: 'Auto',
+ 1: 'On',
+ 2: 'Off',
+ 3: 'Red Eye Reduction'}),
+ 0x1011: ('FlashStrength', ),
+ 0x1020: ('Macro',
+ {0: 'Off',
+ 1: 'On'}),
+ 0x1021: ('FocusMode',
+ {0: 'Auto',
+ 1: 'Manual'}),
+ 0x1030: ('SlowSync',
+ {0: 'Off',
+ 1: 'On'}),
+ 0x1031: ('PictureMode',
+ {0: 'Auto',
+ 1: 'Portrait',
+ 2: 'Landscape',
+ 4: 'Sports',
+ 5: 'Night',
+ 6: 'Program AE',
+ 256: 'Aperture Priority AE',
+ 512: 'Shutter Priority AE',
+ 768: 'Manual Exposure'}),
+ 0x1100: ('MotorOrBracket',
+ {0: 'Off',
+ 1: 'On'}),
+ 0x1300: ('BlurWarning',
+ {0: 'Off',
+ 1: 'On'}),
+ 0x1301: ('FocusWarning',
+ {0: 'Off',
+ 1: 'On'}),
+ 0x1302: ('AEWarning',
+ {0: 'Off',
+ 1: 'On'})
+ }
+
+MAKERNOTE_CANON_TAGS={
+ 0x0006: ('ImageType', ),
+ 0x0007: ('FirmwareVersion', ),
+ 0x0008: ('ImageNumber', ),
+ 0x0009: ('OwnerName', )
+ }
+
+# see http://www.burren.cx/david/canon.html by David Burren
+# this is in element offset, name, optional value dictionary format
+MAKERNOTE_CANON_TAG_0x001={
+ 1: ('Macromode',
+ {1: 'Macro',
+ 2: 'Normal'}),
+ 2: ('SelfTimer', ),
+ 3: ('Quality',
+ {2: 'Normal',
+ 3: 'Fine',
+ 5: 'Superfine'}),
+ 4: ('FlashMode',
+ {0: 'Flash Not Fired',
+ 1: 'Auto',
+ 2: 'On',
+ 3: 'Red-Eye Reduction',
+ 4: 'Slow Synchro',
+ 5: 'Auto + Red-Eye Reduction',
+ 6: 'On + Red-Eye Reduction',
+ 16: 'external flash'}),
+ 5: ('ContinuousDriveMode',
+ {0: 'Single Or Timer',
+ 1: 'Continuous'}),
+ 7: ('FocusMode',
+ {0: 'One-Shot',
+ 1: 'AI Servo',
+ 2: 'AI Focus',
+ 3: 'MF',
+ 4: 'Single',
+ 5: 'Continuous',
+ 6: 'MF'}),
+ 10: ('ImageSize',
+ {0: 'Large',
+ 1: 'Medium',
+ 2: 'Small'}),
+ 11: ('EasyShootingMode',
+ {0: 'Full Auto',
+ 1: 'Manual',
+ 2: 'Landscape',
+ 3: 'Fast Shutter',
+ 4: 'Slow Shutter',
+ 5: 'Night',
+ 6: 'B&W',
+ 7: 'Sepia',
+ 8: 'Portrait',
+ 9: 'Sports',
+ 10: 'Macro/Close-Up',
+ 11: 'Pan Focus'}),
+ 12: ('DigitalZoom',
+ {0: 'None',
+ 1: '2x',
+ 2: '4x'}),
+ 13: ('Contrast',
+ {0xFFFF: 'Low',
+ 0: 'Normal',
+ 1: 'High'}),
+ 14: ('Saturation',
+ {0xFFFF: 'Low',
+ 0: 'Normal',
+ 1: 'High'}),
+ 15: ('Sharpness',
+ {0xFFFF: 'Low',
+ 0: 'Normal',
+ 1: 'High'}),
+ 16: ('ISO',
+ {0: 'See ISOSpeedRatings Tag',
+ 15: 'Auto',
+ 16: '50',
+ 17: '100',
+ 18: '200',
+ 19: '400'}),
+ 17: ('MeteringMode',
+ {3: 'Evaluative',
+ 4: 'Partial',
+ 5: 'Center-weighted'}),
+ 18: ('FocusType',
+ {0: 'Manual',
+ 1: 'Auto',
+ 3: 'Close-Up (Macro)',
+ 8: 'Locked (Pan Mode)'}),
+ 19: ('AFPointSelected',
+ {0x3000: 'None (MF)',
+ 0x3001: 'Auto-Selected',
+ 0x3002: 'Right',
+ 0x3003: 'Center',
+ 0x3004: 'Left'}),
+ 20: ('ExposureMode',
+ {0: 'Easy Shooting',
+ 1: 'Program',
+ 2: 'Tv-priority',
+ 3: 'Av-priority',
+ 4: 'Manual',
+ 5: 'A-DEP'}),
+ 23: ('LongFocalLengthOfLensInFocalUnits', ),
+ 24: ('ShortFocalLengthOfLensInFocalUnits', ),
+ 25: ('FocalUnitsPerMM', ),
+ 28: ('FlashActivity',
+ {0: 'Did Not Fire',
+ 1: 'Fired'}),
+ 29: ('FlashDetails',
+ {14: 'External E-TTL',
+ 13: 'Internal Flash',
+ 11: 'FP Sync Used',
+ 7: '2nd("Rear")-Curtain Sync Used',
+ 4: 'FP Sync Enabled'}),
+ 32: ('FocusMode',
+ {0: 'Single',
+ 1: 'Continuous'})
+ }
+
+MAKERNOTE_CANON_TAG_0x004={
+ 7: ('WhiteBalance',
+ {0: 'Auto',
+ 1: 'Sunny',
+ 2: 'Cloudy',
+ 3: 'Tungsten',
+ 4: 'Fluorescent',
+ 5: 'Flash',
+ 6: 'Custom'}),
+ 9: ('SequenceNumber', ),
+ 14: ('AFPointUsed', ),
+ 15: ('FlashBias',
+ {0XFFC0: '-2 EV',
+ 0XFFCC: '-1.67 EV',
+ 0XFFD0: '-1.50 EV',
+ 0XFFD4: '-1.33 EV',
+ 0XFFE0: '-1 EV',
+ 0XFFEC: '-0.67 EV',
+ 0XFFF0: '-0.50 EV',
+ 0XFFF4: '-0.33 EV',
+ 0X0000: '0 EV',
+ 0X000C: '0.33 EV',
+ 0X0010: '0.50 EV',
+ 0X0014: '0.67 EV',
+ 0X0020: '1 EV',
+ 0X002C: '1.33 EV',
+ 0X0030: '1.50 EV',
+ 0X0034: '1.67 EV',
+ 0X0040: '2 EV'}),
+ 19: ('SubjectDistance', )
+ }
+
+# extract multibyte integer in Motorola format (little endian)
+def s2n_motorola(str):
+ x=0
+ for c in str:
+ x=(x << 8) | ord(c)
+ return x
+
+# extract multibyte integer in Intel format (big endian)
+def s2n_intel(str):
+ x=0
+ y=0L
+ for c in str:
+ x=x | (ord(c) << y)
+ y=y+8
+ return x
+
+# ratio object that eventually will be able to reduce itself to lowest
+# common denominator for printing
+def gcd(a, b):
+ if b == 0:
+ return a
+ else:
+ return gcd(b, a % b)
+
+class Ratio:
+ def __init__(self, num, den):
+ self.num=num
+ self.den=den
+
+ def __repr__(self):
+ self.reduce()
+ if self.den == 1:
+ return str(self.num)
+ return '%d/%d' % (self.num, self.den)
+
+ def reduce(self):
+ div=gcd(self.num, self.den)
+ if div > 1:
+ self.num=self.num/div
+ self.den=self.den/div
+
+# for ease of dealing with tags
+class IFD_Tag:
+ def __init__(self, printable, tag, field_type, values, field_offset,
+ field_length):
+ # printable version of data
+ self.printable=printable
+ # tag ID number
+ self.tag=tag
+ # field type as index into FIELD_TYPES
+ self.field_type=field_type
+ # offset of start of field in bytes from beginning of IFD
+ self.field_offset=field_offset
+ # length of data field in bytes
+ self.field_length=field_length
+ # either a string or array of data items
+ self.values=values
+
+ def __str__(self):
+ return self.printable
+
+ def __repr__(self):
+ return '(0x%04X) %s=%s @ %d' % (self.tag,
+ FIELD_TYPES[self.field_type][2],
+ self.printable,
+ self.field_offset)
+
+# class that handles an EXIF header
+class EXIF_header:
+ def __init__(self, file, endian, offset, debug=0):
+ self.file=file
+ self.endian=endian
+ self.offset=offset
+ self.debug=debug
+ self.tags={}
+
+ # convert slice to integer, based on sign and endian flags
+ def s2n(self, offset, length, signed=0):
+ self.file.seek(self.offset+offset)
+ slice=self.file.read(length)
+ if self.endian == 'I':
+ val=s2n_intel(slice)
+ else:
+ val=s2n_motorola(slice)
+ # Sign extension ?
+ if signed:
+ #msb=1 << (8*length-1)
+ #if val & msb:
+ # val=val-(msb << 1)
+ pass
+ return val
+
+ # convert offset to string
+ def n2s(self, offset, length):
+ s=''
+ for i in range(length):
+ if self.endian == 'I':
+ s=s+chr(offset & 0xFF)
+ else:
+ s=chr(offset & 0xFF)+s
+ offset=offset >> 8
+ return s
+
+ # return first IFD
+ def first_IFD(self):
+ return self.s2n(4, 4)
+
+ # return pointer to next IFD
+ def next_IFD(self, ifd):
+ entries=self.s2n(ifd, 2)
+ return self.s2n(ifd+2+12*entries, 4)
+
+ # return list of IFDs in header
+ def list_IFDs(self):
+ i=self.first_IFD()
+ a=[]
+ while i:
+ a.append(i)
+ i=self.next_IFD(i)
+ return a
+
+ # return list of entries in this IFD
+ def dump_IFD(self, ifd, ifd_name, dict=EXIF_TAGS):
+ entries=self.s2n(ifd, 2)
+ for i in range(entries):
+ entry=ifd+2+12*i
+ tag=self.s2n(entry, 2)
+ field_type=self.s2n(entry+2, 2)
+ if not 0 < field_type < len(FIELD_TYPES):
+ # unknown field type
+ raise ValueError, \
+ 'unknown type %d in tag 0x%04X' % (field_type, tag)
+ typelen=FIELD_TYPES[field_type][0]
+ count=self.s2n(entry+4, 4)
+ offset=entry+8
+ if count*typelen > 4:
+ # not the value, it's a pointer to the value
+ offset=self.s2n(offset, 4)
+ field_offset=offset
+ if field_type == 2:
+ # special case: null-terminated ASCII string
+ if count != 0:
+ self.file.seek(self.offset+offset)
+ values=self.file.read(count).strip().replace('\x00','')
+ else:
+ values=''
+ else:
+ values=[]
+ signed=(field_type in [6, 8, 9, 10])
+ for j in range(count):
+ if field_type in (5, 10):
+ # a ratio
+ value_j=Ratio(self.s2n(offset, 4, signed),
+ self.s2n(offset+4, 4, signed))
+ else:
+ value_j=self.s2n(offset, typelen, signed)
+ values.append(value_j)
+ offset=offset+typelen
+ # now "values" is either a string or an array
+ if count == 1 and field_type != 2:
+ printable=str(values[0])
+ else:
+ printable=str(values)
+ # figure out tag name
+ tag_entry=dict.get(tag)
+ if tag_entry:
+ tag_name=tag_entry[0]
+ if len(tag_entry) != 1:
+ # optional 2nd tag element is present
+ if callable(tag_entry[1]):
+ # call mapping function
+ printable=tag_entry[1](values)
+ else:
+ printable=''
+ for i in values:
+ # use LUT for this tag
+ printable+=tag_entry[1].get(i, repr(i))
+ else:
+ tag_name='Tag 0x%04X' % tag
+ self.tags[ifd_name+' '+tag_name]=IFD_Tag(printable, tag,
+ field_type,
+ values, field_offset,
+ count*typelen)
+ if self.debug:
+ print ' %s: %s' % (tag_name,
+ repr(self.tags[ifd_name+' '+tag_name]))
+
+ # extract uncompressed TIFF thumbnail (like pulling teeth)
+ # we take advantage of the pre-existing layout in the thumbnail IFD as
+ # much as possible
+ def extract_TIFF_thumbnail(self, thumb_ifd):
+ entries=self.s2n(thumb_ifd, 2)
+ # this is header plus offset to IFD ...
+ if self.endian == 'M':
+ tiff='MM\x00*\x00\x00\x00\x08'
+ else:
+ tiff='II*\x00\x08\x00\x00\x00'
+ # ... plus thumbnail IFD data plus a null "next IFD" pointer
+ self.file.seek(self.offset+thumb_ifd)
+ tiff+=self.file.read(entries*12+2)+'\x00\x00\x00\x00'
+
+ # fix up large value offset pointers into data area
+ for i in range(entries):
+ entry=thumb_ifd+2+12*i
+ tag=self.s2n(entry, 2)
+ field_type=self.s2n(entry+2, 2)
+ typelen=FIELD_TYPES[field_type][0]
+ count=self.s2n(entry+4, 4)
+ oldoff=self.s2n(entry+8, 4)
+ # start of the 4-byte pointer area in entry
+ ptr=i*12+18
+ # remember strip offsets location
+ if tag == 0x0111:
+ strip_off=ptr
+ strip_len=count*typelen
+ # is it in the data area?
+ if count*typelen > 4:
+ # update offset pointer (nasty "strings are immutable" crap)
+ # should be able to say "tiff[ptr:ptr+4]=newoff"
+ newoff=len(tiff)
+ tiff=tiff[:ptr]+self.n2s(newoff, 4)+tiff[ptr+4:]
+ # remember strip offsets location
+ if tag == 0x0111:
+ strip_off=newoff
+ strip_len=4
+ # get original data and store it
+ self.file.seek(self.offset+oldoff)
+ tiff+=self.file.read(count*typelen)
+
+ # add pixel strips and update strip offset info
+ old_offsets=self.tags['Thumbnail StripOffsets'].values
+ old_counts=self.tags['Thumbnail StripByteCounts'].values
+ for i in range(len(old_offsets)):
+ # update offset pointer (more nasty "strings are immutable" crap)
+ offset=self.n2s(len(tiff), strip_len)
+ tiff=tiff[:strip_off]+offset+tiff[strip_off+strip_len:]
+ strip_off+=strip_len
+ # add pixel strip to end
+ self.file.seek(self.offset+old_offsets[i])
+ tiff+=self.file.read(old_counts[i])
+
+ self.tags['TIFFThumbnail']=tiff
+
+ # decode all the camera-specific MakerNote formats
+ def decode_maker_note(self):
+ note=self.tags['EXIF MakerNote']
+ make=self.tags['Image Make'].printable
+ model=self.tags['Image Model'].printable
+
+ # Nikon
+ if make == 'NIKON':
+ if note.values[0:5] == [78, 105, 107, 111, 110]: # "Nikon"
+ # older model
+ self.dump_IFD(note.field_offset+8, 'MakerNote',
+ dict=MAKERNOTE_NIKON_OLDER_TAGS)
+ else:
+ # newer model (E99x or D1)
+ self.dump_IFD(note.field_offset, 'MakerNote',
+ dict=MAKERNOTE_NIKON_NEWER_TAGS)
+ return
+
+ # Olympus
+ if make[:7] == 'OLYMPUS':
+ self.dump_IFD(note.field_offset+8, 'MakerNote',
+ dict=MAKERNOTE_OLYMPUS_TAGS)
+ return
+
+ # Casio
+ if make == 'Casio':
+ self.dump_IFD(note.field_offset, 'MakerNote',
+ dict=MAKERNOTE_CASIO_TAGS)
+ return
+
+ # Fujifilm
+ if make == 'FUJIFILM':
+ # bug: everything else is "Motorola" endian, but the MakerNote
+ # is "Intel" endian
+ endian=self.endian
+ self.endian='I'
+ # bug: IFD offsets are from beginning of MakerNote, not
+ # beginning of file header
+ offset=self.offset
+ self.offset+=note.field_offset
+ # process note with bogus values (note is actually at offset 12)
+ self.dump_IFD(12, 'MakerNote', dict=MAKERNOTE_FUJIFILM_TAGS)
+ # reset to correct values
+ self.endian=endian
+ self.offset=offset
+ return
+
+ # Canon
+ if make == 'Canon':
+ self.dump_IFD(note.field_offset, 'MakerNote',
+ dict=MAKERNOTE_CANON_TAGS)
+ for i in (('MakerNote Tag 0x0001', MAKERNOTE_CANON_TAG_0x001),
+ ('MakerNote Tag 0x0004', MAKERNOTE_CANON_TAG_0x004)):
+ self.canon_decode_tag(self.tags[i[0]].values, i[1])
+ return
+
+ # decode Canon MakerNote tag based on offset within tag
+ # see http://www.burren.cx/david/canon.html by David Burren
+ def canon_decode_tag(self, value, dict):
+ for i in range(1, len(value)):
+ x=dict.get(i, ('Unknown', ))
+ if self.debug:
+ print i, x
+ name=x[0]
+ if len(x) > 1:
+ val=x[1].get(value[i], 'Unknown')
+ else:
+ val=value[i]
+ # it's not a real IFD Tag but we fake one to make everybody
+ # happy. this will have a "proprietary" type
+ self.tags['MakerNote '+name]=IFD_Tag(str(val), None, 0, None,
+ None, None)
+
+# process an image file (expects an open file object)
+# this is the function that has to deal with all the arbitrary nasty bits
+# of the EXIF standard
+def process_file(file, debug=0):
+ # determine whether it's a JPEG or TIFF
+ data=file.read(12)
+ if data[0:4] in ['II*\x00', 'MM\x00*']:
+ # it's a TIFF file
+ file.seek(0)
+ endian=file.read(1)
+ file.read(1)
+ offset=0
+ elif data[0:2] == '\xFF\xD8':
+ # it's a JPEG file
+ # skip JFIF style header(s)
+ while data[2] == '\xFF' and data[6:10] in ('JFIF', 'JFXX', 'OLYM'):
+ length=ord(data[4])*256+ord(data[5])
+ file.read(length-8)
+ # fake an EXIF beginning of file
+ data='\xFF\x00'+file.read(10)
+ if data[2] == '\xFF' and data[6:10] == 'Exif':
+ # detected EXIF header
+ offset=file.tell()
+ endian=file.read(1)
+ else:
+ # no EXIF information
+ return {}
+ else:
+ # file format not recognized
+ return {}
+
+ # deal with the EXIF info we found
+ if debug:
+ print {'I': 'Intel', 'M': 'Motorola'}[endian], 'format'
+ hdr=EXIF_header(file, endian, offset, debug)
+ ifd_list=hdr.list_IFDs()
+ ctr=0
+ for i in ifd_list:
+ if ctr == 0:
+ IFD_name='Image'
+ elif ctr == 1:
+ IFD_name='Thumbnail'
+ thumb_ifd=i
+ else:
+ IFD_name='IFD %d' % ctr
+ if debug:
+ print ' IFD %d (%s) at offset %d:' % (ctr, IFD_name, i)
+ hdr.dump_IFD(i, IFD_name)
+ # EXIF IFD
+ exif_off=hdr.tags.get(IFD_name+' ExifOffset')
+ if exif_off:
+ if debug:
+ print ' EXIF SubIFD at offset %d:' % exif_off.values[0]
+ hdr.dump_IFD(exif_off.values[0], 'EXIF')
+ # Interoperability IFD contained in EXIF IFD
+ intr_off=hdr.tags.get('EXIF SubIFD InteroperabilityOffset')
+ if intr_off:
+ if debug:
+ print ' EXIF Interoperability SubSubIFD at offset %d:' \
+ % intr_off.values[0]
+ hdr.dump_IFD(intr_off.values[0], 'EXIF Interoperability',
+ dict=INTR_TAGS)
+ # GPS IFD
+ gps_off=hdr.tags.get(IFD_name+' GPSInfo')
+ if gps_off:
+ if debug:
+ print ' GPS SubIFD at offset %d:' % gps_off.values[0]
+ hdr.dump_IFD(gps_off.values[0], 'GPS', dict=GPS_TAGS)
+ ctr+=1
+
+ # extract uncompressed TIFF thumbnail
+ thumb=hdr.tags.get('Thumbnail Compression')
+ if thumb and thumb.printable == 'Uncompressed TIFF':
+ hdr.extract_TIFF_thumbnail(thumb_ifd)
+
+ # JPEG thumbnail (thankfully the JPEG data is stored as a unit)
+ thumb_off=hdr.tags.get('Thumbnail JPEGInterchangeFormat')
+ if thumb_off:
+ file.seek(offset+thumb_off.values[0])
+ size=hdr.tags['Thumbnail JPEGInterchangeFormatLength'].values[0]
+ hdr.tags['JPEGThumbnail']=file.read(size)
+
+ # deal with MakerNote contained in EXIF IFD
+ if hdr.tags.has_key('EXIF MakerNote'):
+ hdr.decode_maker_note()
+
+ # Sometimes in a TIFF file, a JPEG thumbnail is hidden in the MakerNote
+ # since it's not allowed in a uncompressed TIFF IFD
+ if not hdr.tags.has_key('JPEGThumbnail'):
+ thumb_off=hdr.tags.get('MakerNote JPEGThumbnail')
+ if thumb_off:
+ file.seek(offset+thumb_off.values[0])
+ hdr.tags['JPEGThumbnail']=file.read(thumb_off.field_length)
+
+ return hdr.tags
+
+# library test/debug function (dump given files)
+if __name__ == '__main__':
+ import sys
+
+ if len(sys.argv) < 2:
+ print 'Usage: %s files...\n' % sys.argv[0]
+ sys.exit(0)
+
+ for filename in sys.argv[1:]:
+ try:
+ file=open(filename, 'rb')
+ except:
+ print filename, 'unreadable'
+ print
+ continue
+ print filename+':'
+ # data=process_file(file, 1) # with debug info
+ data=process_file(file)
+ if not data:
+ print 'No EXIF information found'
+ continue
+
+ x=data.keys()
+ x.sort()
+ for i in x:
+ if i in ('JPEGThumbnail', 'TIFFThumbnail'):
+ continue
+ try:
+ print ' %s (%s): %s' % \
+ (i, FIELD_TYPES[data[i].field_type][2], data[i].printable)
+ except:
+ print 'error', i, '"', data[i], '"'
+ if data.has_key('JPEGThumbnail'):
+ print 'File has JPEG thumbnail'
+ print
diff --git a/base/g.py b/base/g.py
new file mode 100644
index 0000000..b49a916
--- /dev/null
+++ b/base/g.py
@@ -0,0 +1,350 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2009 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+# NOTE: This module is safe for 'from g import *'
+#
+
+# Std Lib
+import sys
+import os
+import os.path
+import ConfigParser
+import locale
+import pwd
+import stat
+import re
+
+# Local
+from codes import *
+import logger
+
+# System wide logger
+log = logger.Logger('', logger.Logger.LOG_LEVEL_INFO, logger.Logger.LOG_TO_CONSOLE)
+log.set_level('info')
+
+
+MINIMUM_PYQT_MAJOR_VER = 3
+MINIMUM_PYQT_MINOR_VER = 14
+MINIMUM_QT_MAJOR_VER = 3
+MINIMUM_QT_MINOR_VER = 0
+
+
+def to_bool(s, default=False):
+ if isinstance(s, str) and s:
+ if s[0].lower() in ['1', 't', 'y']:
+ return True
+ elif s[0].lower() in ['0', 'f', 'n']:
+ return False
+ elif isinstance(s, bool):
+ return s
+
+ return default
+
+
+# System wide properties
+class Properties(dict):
+
+ def __getattr__(self, attr):
+ if attr in self.keys():
+ return self.__getitem__(attr)
+ else:
+ return ""
+
+ def __setattr__(self, attr, val):
+ self.__setitem__(attr, val)
+
+prop = Properties()
+
+
+
+class ConfigBase(object):
+ def __init__(self, filename):
+ self.filename = filename
+ self.conf = ConfigParser.ConfigParser()
+ self.read()
+
+
+ def get(self, section, key, default=u''):
+ try:
+ return self.conf.get(section, key)
+ except (ConfigParser.NoOptionError, ConfigParser.NoSectionError):
+ return default
+
+
+ def set(self, section, key, value):
+ if not self.conf.has_section(section):
+ self.conf.add_section(section)
+
+ self.conf.set(section, key, value)
+ self.write()
+
+
+ def sections(self):
+ return self.conf.sections()
+
+
+ def has_section(self, section):
+ return self.conf.has_section(section)
+
+
+ def options(self, section):
+ return self.conf.options(section)
+
+ keys = options
+
+ def read(self):
+ if self.filename is not None:
+ filename = self.filename
+ if filename.startswith("/root/"):
+ # Don't try opening a file in root's home directory.
+ log.error("attempted to read from '%s'" % self.filename)
+ return
+ try:
+ fp = open(self.filename, "r")
+ self.conf.readfp(fp)
+ fp.close()
+ except (OSError, IOError):
+ log.debug("Unable to open file %s for reading." % self.filename)
+
+ def write(self):
+ if self.filename is not None:
+ filename = self.filename
+ if filename.startswith("/root/") or filename.startswith("/etc/"):
+ # Don't try writing a file in root's home directory or
+ # the system-wide config file.
+ # See bug #479178.
+ log.error("attempted to write to '%s'" % self.filename)
+ return
+
+ try:
+ fp = open(self.filename, "w")
+ self.conf.write(fp)
+ fp.close()
+ except (OSError, IOError):
+ log.debug("Unable to open file %s for writing." % self.filename)
+
+
+
+class SysConfig(ConfigBase):
+ def __init__(self):
+ ConfigBase.__init__(self, '/etc/hp/hplip.conf')
+
+
+class State(ConfigBase):
+ def __init__(self):
+ ConfigBase.__init__(self, '/var/lib/hp/hplip.state')
+
+
+class UserConfig(ConfigBase):
+ def __init__(self):
+ if not os.geteuid() == 0:
+ prop.user_dir = os.path.expanduser('~/.hplip')
+
+ try:
+ if not os.path.exists(prop.user_dir):
+ os.makedirs(prop.user_dir)
+ except OSError:
+ pass # This is sometimes OK, if running hpfax: for example
+
+ prop.user_config_file = os.path.join(prop.user_dir, 'hplip.conf')
+
+ if not os.path.exists(prop.user_config_file):
+ try:
+ file(prop.user_config_file, 'w').close()
+ s = os.stat(os.path.dirname(prop.user_config_file))
+ os.chown(prop.user_config_file, s[stat.ST_UID], s[stat.ST_GID])
+ except IOError:
+ pass
+
+ ConfigBase.__init__(self, prop.user_config_file)
+
+ else:
+ # If running as root, conf file is None
+ prop.user_dir = None
+ prop.user_config_file = None
+ ConfigBase.__init__(self, None)
+
+
+ def workingDirectory(self):
+ t = self.get('last_used', 'working_dir', os.path.expanduser("~"))
+ try:
+ t = t.decode('utf-8')
+ except UnicodeError:
+ log.error("Invalid unicode: %s" % t)
+ log.debug("working directory: %s" % t)
+ return t
+
+
+ def setWorkingDirectory(self, t):
+ self.set('last_used', 'working_dir', t.encode('utf-8'))
+ log.debug("working directory: %s" % t.encode('utf-8'))
+
+
+
+os.umask(0037)
+
+# System Config File: Directories and build settings. Not altered after installation.
+sys_conf = SysConfig()
+
+# System State File: System-wide runtime settings
+sys_state = State()
+
+# Per-user Settings File: (Note: For Qt4 code, limit the use of this to non-GUI apps. only)
+user_conf = UserConfig()
+
+
+# Language settings
+try:
+ prop.locale, prop.encoding = locale.getdefaultlocale()
+except ValueError:
+ prop.locale = 'en_US'
+ prop.encoding = 'UTF8'
+
+prop.version = sys_conf.get('hplip', 'version', '0.0.0') # e.g., 3.9.2b.10
+_p, _x = re.compile(r'(\d\w*)', re.I), []
+for _y in prop.version.split('.')[:3]:
+ _z = _p.match(_y)
+ if _z is not None:
+ _x.append(_z.group(1))
+
+prop.installed_version = '.'.join(_x) # e.g., '3.9.2'
+try:
+ prop.installed_version_int = int(''.join(['%02x' % int(_y) for _y in _x]), 16) # e.g., 0x030902 -> 198914
+except ValueError:
+ prop.installed_version_int = 0
+
+prop.home_dir = sys_conf.get('dirs', 'home', os.path.realpath(os.path.normpath(os.getcwd())))
+prop.username = pwd.getpwuid(os.getuid())[0]
+pdb = pwd.getpwnam(prop.username)
+prop.userhome = pdb[5]
+
+prop.history_size = 50
+
+prop.data_dir = os.path.join(prop.home_dir, 'data')
+prop.image_dir = os.path.join(prop.home_dir, 'data', 'images')
+prop.xml_dir = os.path.join(prop.home_dir, 'data', 'xml')
+prop.models_dir = os.path.join(prop.home_dir, 'data', 'models')
+prop.localization_dir = os.path.join(prop.home_dir, 'data', 'localization')
+
+prop.max_message_len = 8192
+prop.max_message_read = 65536
+prop.read_timeout = 90
+
+prop.ppd_search_path = '/usr/share;/usr/local/share;/usr/lib;/usr/local/lib;/usr/libexec;/opt;/usr/lib64'
+prop.ppd_search_pattern = 'HP-*.ppd.*'
+prop.ppd_download_url = 'http://www.linuxprinting.org/ppd-o-matic.cgi'
+prop.ppd_file_suffix = '-hpijs.ppd'
+
+# Build and install configurations
+prop.gui_build = to_bool(sys_conf.get('configure', 'gui-build', '0'))
+prop.net_build = to_bool(sys_conf.get('configure', 'network-build', '0'))
+prop.par_build = to_bool(sys_conf.get('configure', 'pp-build', '0'))
+prop.usb_build = True
+prop.scan_build = to_bool(sys_conf.get('configure', 'scanner-build', '0'))
+prop.fax_build = to_bool(sys_conf.get('configure', 'fax-build', '0'))
+prop.doc_build = to_bool(sys_conf.get('configure', 'doc-build', '0'))
+prop.foomatic_xml_install = to_bool(sys_conf.get('configure', 'foomatic-xml-install', '0'))
+prop.foomatic_ppd_install = to_bool(sys_conf.get('configure', 'foomatic-ppd-install', '0'))
+prop.hpcups_build = to_bool(sys_conf.get('configure', 'hpcups-install', '0'))
+prop.hpijs_build = to_bool(sys_conf.get('configure', 'hpijs-install', '0'))
+
+# Spinner, ala Gentoo Portage
+spinner = "\|/-\|/-"
+spinpos = 0
+enable_spinner = True
+
+def change_spinner_state(enable =True):
+ global enable_spinner
+ enable_spinner = enable
+
+def update_spinner():
+ global spinner, spinpos, enable_spinner
+ if enable_spinner and not log.is_debug() and sys.stdout.isatty():
+ sys.stdout.write("\b" + spinner[spinpos])
+ spinpos=(spinpos + 1) % 8
+ sys.stdout.flush()
+
+def cleanup_spinner():
+ global enable_spinner
+ if enable_spinner and not log.is_debug() and sys.stdout.isatty():
+ sys.stdout.write("\b \b")
+ sys.stdout.flush()
+
+
+# Internal/messaging errors
+
+ERROR_STRINGS = {
+ ERROR_SUCCESS : 'No error',
+ ERROR_UNKNOWN_ERROR : 'Unknown error',
+ ERROR_DEVICE_NOT_FOUND : 'Device not found',
+ ERROR_INVALID_DEVICE_ID : 'Unknown/invalid device-id field',
+ ERROR_INVALID_DEVICE_URI : 'Unknown/invalid device-uri field',
+ ERROR_DATA_LENGTH_EXCEEDS_MAX : 'Data length exceeds maximum',
+ ERROR_DEVICE_IO_ERROR : 'Device I/O error',
+ ERROR_NO_PROBED_DEVICES_FOUND : 'No probed devices found',
+ ERROR_DEVICE_BUSY : 'Device busy',
+ ERROR_DEVICE_STATUS_NOT_AVAILABLE : 'DeviceStatus not available',
+ ERROR_INVALID_SERVICE_NAME : 'Invalid service name',
+ ERROR_ERROR_INVALID_CHANNEL_ID : 'Invalid channel-id (service name)',
+ ERROR_CHANNEL_BUSY : 'Channel busy',
+ ERROR_DEVICE_DOES_NOT_SUPPORT_OPERATION : 'Device does not support operation',
+ ERROR_DEVICEOPEN_FAILED : 'Device open failed',
+ ERROR_INVALID_DEVNODE : 'Invalid device node',
+ ERROR_INVALID_HOSTNAME : "Invalid hostname ip address",
+ ERROR_INVALID_PORT_NUMBER : "Invalid JetDirect port number",
+ ERROR_NO_CUPS_QUEUE_FOUND_FOR_DEVICE : "No CUPS queue found for device.",
+ ERROR_DATFILE_ERROR: "DAT file error",
+ ERROR_INVALID_TIMEOUT: "Invalid timeout",
+ ERROR_IO_TIMEOUT: "I/O timeout",
+ ERROR_FAX_INCOMPATIBLE_OPTIONS: "Incompatible fax options",
+ ERROR_FAX_INVALID_FAX_FILE: "Invalid fax file",
+ ERROR_FAX_FILE_NOT_FOUND: "Fax file not found",
+ ERROR_INTERNAL : 'Unknown internal error',
+ }
+
+
+class Error(Exception):
+ def __init__(self, opt=ERROR_INTERNAL):
+ self.opt = opt
+ self.msg = ERROR_STRINGS.get(opt, ERROR_STRINGS[ERROR_INTERNAL])
+ log.debug("Exception: %d (%s)" % (opt, self.msg))
+ Exception.__init__(self, self.msg, opt)
+
+
+# Make sure True and False are avail. in pre-2.2 versions
+try:
+ True
+except NameError:
+ True = (1==1)
+ False = not True
+
+# as new translations are completed, add them here
+supported_locales = { 'en_US': ('us', 'en', 'en_us', 'american', 'america', 'usa', 'english'),}
+# Localization support was disabled in 3.9.2
+ #'zh_CN': ('zh', 'cn', 'zh_cn' , 'china', 'chinese', 'prc'),
+ #'de_DE': ('de', 'de_de', 'german', 'deutsche'),
+ #'fr_FR': ('fr', 'fr_fr', 'france', 'french', 'français'),
+ #'it_IT': ('it', 'it_it', 'italy', 'italian', 'italiano'),
+ #'ru_RU': ('ru', 'ru_ru', 'russian'),
+ #'pt_BR': ('pt', 'br', 'pt_br', 'brazil', 'brazilian', 'portuguese', 'brasil', 'portuguesa'),
+ #'es_MX': ('es', 'mx', 'es_mx', 'mexico', 'spain', 'spanish', 'espanol', 'español'),
+ #}
+
+
diff --git a/base/imagesize.py b/base/imagesize.py
new file mode 100644
index 0000000..c2c00a3
--- /dev/null
+++ b/base/imagesize.py
@@ -0,0 +1,217 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2001-2008 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+
+#
+# Ported from Perl's Image::Size module by Randy J. Ray
+#
+
+# Std Lib
+import os
+import os.path
+import re
+import struct
+
+# Re patterns
+xbm_pat = re.compile(r'^\#define\s*\S*\s*(\d+)\s*\n\#define\s*\S*\s*(\d+)', re.IGNORECASE)
+xpm_pat = re.compile(r'"\s*(\d+)\s+(\d+)(\s+\d+\s+\d+){1,2}\s*"', re.IGNORECASE)
+ppm_pat1 = re.compile(r'^\#.*', re.IGNORECASE | re.MULTILINE)
+ppm_pat2 = re.compile(r'^(P[1-6])\s+(\d+)\s+(\d+)', re.IGNORECASE)
+ppm_pat3 = re.compile(r'IMGINFO:(\d+)x(\d+)', re.IGNORECASE)
+tiff_endian_pat = re.compile(r'II\x2a\x00')
+
+
+def readin(stream, length, offset=0):
+ if offset != 0:
+ stream.seek(offset, 0)
+
+ return stream.read(length)
+
+
+def xbmsize(stream):
+ width, height = -1, -1
+ match = xbm_pat.match(readin(stream,1024))
+
+ try:
+ width = int(match.group(1))
+ height = int(match.group(2))
+ except:
+ pass
+
+ return width, height
+
+
+def xpmsize(stream):
+ width, height = -1, -1
+ match = re.search(xpm_pat, readin(stream, 1024))
+ try:
+ width = int(match.group(1))
+ height = int(match.group(2))
+ except:
+ pass
+
+ return width, height
+
+
+def pngsize(stream): # also does MNG
+ width, height = -1, -1
+
+ if readin(stream, 4, 12) in ('IHDR', 'MHDR'):
+ height, width = struct.unpack("!II", stream.read(8))
+
+ return width,height
+
+
+def jpegsize(stream):
+ width, height = -1, -1
+ stream.seek(2)
+ while True:
+ length = 4
+ buffer = readin(stream, length)
+ try:
+ marker, code, length = struct.unpack("!c c h", buffer)
+ except:
+ break
+
+ if marker != '\xff':
+ break
+
+ if 0xc0 <= ord(code) <= 0xc3:
+ length = 5
+ height, width = struct.unpack("!xhh", readin(stream, length))
+
+ else:
+ readin(stream, length-2)
+
+ return width, height
+
+
+def ppmsize(stream):
+ width, height = -1, -1
+ header = re.sub(ppm_pat1, '', readin(stream, 1024))
+ match = ppm_pat2.match(header)
+ typ = ''
+ try:
+ typ = match.group(1)
+ width = int(match.group(2))
+ height = int(match.group(3))
+ except:
+ pass
+
+ if typ == 'P7':
+ match = ppm_pat3.match(header)
+
+ try:
+ width = int(match.group(1))
+ height = int(match.group(2))
+ except:
+ pass
+
+ return width, height
+
+
+def tiffsize(stream):
+ header = readin(stream, 4)
+ endian = ">"
+ match = tiff_endian_pat.match(header)
+
+ if match is not None:
+ endian = "<"
+
+ input = readin(stream, 4, 4)
+ offset = struct.unpack('%si' % endian, input)[0]
+ num_dirent = struct.unpack('%sH' % endian, readin(stream, 2, offset))[0]
+ offset += 2
+ num_dirent = offset+(num_dirent*12)
+ width, height = -1, -1
+
+ while True:
+ ifd = readin(stream, 12, offset)
+
+ if ifd == '' or offset > num_dirent:
+ break
+
+ offset += 12
+ tag = struct.unpack('%sH'% endian, ifd[0:2])[0]
+ type = struct.unpack('%sH' % endian, ifd[2:4])[0]
+
+ if tag == 0x0100:
+ width = struct.unpack("%si" % endian, ifd[8:12])[0]
+
+ elif tag == 0x0101:
+ height = struct.unpack("%si" % endian, ifd[8:12])[0]
+
+ return width, height
+
+
+def bmpsize(stream):
+ width, height = struct.unpack("<II", readin(stream, 8, 18))
+ return width, height
+
+
+def gifsize(stream):
+ # since we only care about the printed size of the image
+ # we only need to get the logical screen sizes, which are
+ # the maximum extents of the image. This code is much simpler
+ # than the code from Image::Size
+ #width, height = -1, -1
+ buf = readin(stream, 7, 6) # LSx, GCTF, etc
+ height, width, flags, bci, par = struct.unpack('<HHBBB', buf)
+
+ return width, height
+
+
+
+
+TYPE_MAP = {re.compile('^GIF8[7,9]a') : ('image/gif', gifsize),
+ re.compile("^\xFF\xD8") : ('image/jpeg', jpegsize),
+ re.compile("^\x89PNG\x0d\x0a\x1a\x0a") : ('image/png', pngsize),
+ re.compile("^P[1-7]") : ('image/x-portable-pixmap', ppmsize),
+ re.compile('\#define\s+\S+\s+\d+') : ('image/x-xbitmap', xbmsize),
+ re.compile('\/\* XPM \*\/') : ('image/x-xpixmap', xpmsize),
+ re.compile('^MM\x00\x2a') : ('image/tiff', tiffsize),
+ re.compile('^II\*\x00') : ('image/tiff', tiffsize),
+ re.compile('^BM') : ('image/x-bitmap', bmpsize),
+ re.compile("^\x8aMNG\x0d\x0a\x1a\x0a") : ('image/png', pngsize),
+ }
+
+
+def imagesize(filename, mime_type=''):
+ width, height = -1, -1
+
+ f = file(filename, 'r')
+ buffer = f.read(4096)
+
+ if not mime_type:
+ for t in TYPE_MAP:
+ match = t.search(buffer)
+ if match is not None:
+ mime_type, func = TYPE_MAP[t]
+ break
+
+ if mime_type and func:
+ f.seek(0)
+ width, height = func(f)
+ else:
+ width, height = -1, -1
+
+ f.close()
+
+ return height, width, mime_type
+
diff --git a/base/ldif.py b/base/ldif.py
new file mode 100644
index 0000000..a3b8eb2
--- /dev/null
+++ b/base/ldif.py
@@ -0,0 +1,501 @@
+"""
+ldif - generate and parse LDIF data (see RFC 2849)
+written by Michael Stroeder <michael@stroeder.com>
+
+See http://python-ldap.sourceforge.net for details.
+
+$Id: ldif.py,v 1.3 2008/02/11 16:35:43 dwelch Exp $
+
+Python compability note:
+Tested with Python 2.0+, but should work with Python 1.5.2+.
+
+The python-ldap package is distributed under Python-style license.
+
+Standard disclaimer:
+ This software is made available by the author(s) to the public for free
+ and "as is". All users of this free software are solely and entirely
+ responsible for their own choice and use of this software for their
+ own purposes. By using this software, each user agrees that the
+ author(s) shall not be liable for damages of any kind in relation to
+ its use or performance. The author(s) do not warrant that this software
+ is fit for any purpose.
+
+Note: This file is part of the python-ldap package. For the complete
+ python-ldap package, please visit: http://sourceforge.net/projects/python-ldap/
+
+ It has been modified for use in HPLIP.
+
+"""
+
+__version__ = '0.5.5'
+
+__all__ = [
+ # constants
+ 'ldif_pattern',
+ # functions
+ 'AttrTypeandValueLDIF', 'CreateLDIF', 'ParseLDIF',
+ # classes
+ 'LDIFWriter',
+ 'LDIFParser',
+ 'LDIFRecordList',
+ 'LDIFCopy',
+]
+
+import urlparse
+import urllib # TODO: Replace with urllib2 (urllib is deprecated in Python 3.0)
+import base64
+import re
+import types
+
+try:
+ from cStringIO import StringIO
+except ImportError:
+ from StringIO import StringIO
+
+from base.g import *
+
+attrtype_pattern = r'[\w;.]+(;[\w_-]+)*'
+attrvalue_pattern = r'(([^,]|\\,)+|".*?")'
+rdn_pattern = attrtype_pattern + r'[ ]*=[ ]*' + attrvalue_pattern
+dn_pattern = rdn_pattern + r'([ ]*,[ ]*' + rdn_pattern + r')*[ ]*'
+dn_regex = re.compile('^%s$' % dn_pattern)
+
+ldif_pattern = '^((dn(:|::) %(dn_pattern)s)|(%(attrtype_pattern)s(:|::) .*)$)+' % vars()
+
+MOD_OP_INTEGER = {
+ 'add':0, 'delete':1, 'replace':2
+}
+
+MOD_OP_STR = {
+ 0:'add', 1:'delete', 2:'replace'
+}
+
+CHANGE_TYPES = ['add', 'delete', 'modify', 'modrdn']
+valid_changetype_dict = {}
+for c in CHANGE_TYPES:
+ valid_changetype_dict[c]=None
+
+
+SAFE_STRING_PATTERN = '(^(\000|\n|\r| |:|<)|[\000\n\r\200-\377]+|[ ]+$)'
+safe_string_re = re.compile(SAFE_STRING_PATTERN)
+
+def is_dn(s):
+ """
+ returns 1 if s is a LDAP DN
+ """
+ if s=='':
+ return 1
+ rm = dn_regex.match(s)
+ return rm!=None and rm.group(0)==s
+
+
+def needs_base64(s):
+ """
+ returns 1 if s has to be base-64 encoded because of special chars
+ """
+ return not safe_string_re.search(s) is None
+
+
+def list_dict(l):
+ """
+ return a dictionary with all items of l being the keys of the dictionary
+ """
+ return dict([(i, None) for i in l])
+
+
+class LDIFWriter:
+ """
+ Write LDIF entry or change records to file object
+ Copy LDIF input to a file output object containing all data retrieved
+ via URLs
+ """
+
+ def __init__(self, output_file, base64_attrs=None, cols=76, line_sep='\n'):
+ """
+ output_file
+ file object for output
+ base64_attrs
+ list of attribute types to be base64-encoded in any case
+ cols
+ Specifies how many columns a line may have before it's
+ folded into many lines.
+ line_sep
+ String used as line separator
+ """
+ self._output_file = output_file
+ self._base64_attrs = list_dict([a.lower() for a in (base64_attrs or [])])
+ self._cols = cols
+ self._line_sep = line_sep
+ self.records_written = 0
+
+ def _unfoldLDIFLine(self, line):
+ """
+ Write string line as one or more folded lines
+ """
+ # Check maximum line length
+ line_len = len(line)
+ if line_len<=self._cols:
+ self._output_file.write(line)
+ self._output_file.write(self._line_sep)
+ else:
+ # Fold line
+ pos = self._cols
+ self._output_file.write(line[0:min(line_len, self._cols)])
+ self._output_file.write(self._line_sep)
+ while pos<line_len:
+ self._output_file.write(' ')
+ self._output_file.write(line[pos:min(line_len, pos+self._cols-1)])
+ self._output_file.write(self._line_sep)
+ pos = pos+self._cols-1
+ return # _unfoldLDIFLine()
+
+ def _unparseAttrTypeandValue(self, attr_type, attr_value):
+ """
+ Write a single attribute type/value pair
+
+ attr_type
+ attribute type
+ attr_value
+ attribute value
+ """
+ if self._base64_attrs.has_key(attr_type.lower()) or \
+ needs_base64(attr_value):
+ # Encode with base64
+ self._unfoldLDIFLine(':: '.join([attr_type, base64.encodestring(attr_value).replace('\n', '')]))
+ else:
+ self._unfoldLDIFLine(': '.join([attr_type, attr_value]))
+ return # _unparseAttrTypeandValue()
+
+ def _unparseEntryRecord(self, entry):
+ """
+ entry
+ dictionary holding an entry
+ """
+ attr_types = entry.keys()[:]
+ attr_types.sort()
+ for attr_type in attr_types:
+ for attr_value in entry[attr_type]:
+ self._unparseAttrTypeandValue(attr_type, attr_value)
+
+ def _unparseChangeRecord(self, modlist):
+ """
+ modlist
+ list of additions (2-tuple) or modifications (3-tuple)
+ """
+ mod_len = len(modlist[0])
+ if mod_len==2:
+ changetype = 'add'
+ elif mod_len==3:
+ changetype = 'modify'
+ else:
+ raise ValueError, "modlist item of wrong length"
+ self._unparseAttrTypeandValue('changetype', changetype)
+ for mod in modlist:
+ if mod_len==2:
+ mod_type, mod_vals = mod
+ elif mod_len==3:
+ mod_op, mod_type, mod_vals = mod
+ self._unparseAttrTypeandValue(MOD_OP_STR[mod_op], mod_type)
+ else:
+ raise ValueError, "Subsequent modlist item of wrong length"
+ if mod_vals:
+ for mod_val in mod_vals:
+ self._unparseAttrTypeandValue(mod_type, mod_val)
+ if mod_len==3:
+ self._output_file.write('-'+self._line_sep)
+
+ def unparse(self, dn, record):
+ """
+ dn
+ string-representation of distinguished name
+ record
+ Either a dictionary holding the LDAP entry {attrtype:record}
+ or a list with a modify list like for LDAPObject.modify().
+ """
+ if not record:
+ # Simply ignore empty records
+ return
+ # Start with line containing the distinguished name
+ self._unparseAttrTypeandValue('dn', dn)
+ # Dispatch to record type specific writers
+ if isinstance(record, types.DictType):
+ self._unparseEntryRecord(record)
+ elif isinstance(record, types.ListType):
+ self._unparseChangeRecord(record)
+ else:
+ raise ValueError, "Argument record must be dictionary or list"
+ # Write empty line separating the records
+ self._output_file.write(self._line_sep)
+ # Count records written
+ self.records_written = self.records_written+1
+ return # unparse()
+
+
+def CreateLDIF(dn, record, base64_attrs=None, cols=76):
+ """
+ Create LDIF single formatted record including trailing empty line.
+ This is a compability function. Use is deprecated!
+
+ dn
+ string-representation of distinguished name
+ record
+ Either a dictionary holding the LDAP entry {attrtype:record}
+ or a list with a modify list like for LDAPObject.modify().
+ base64_attrs
+ list of attribute types to be base64-encoded in any case
+ cols
+ Specifies how many columns a line may have before it's
+ folded into many lines.
+ """
+ f = StringIO()
+ ldif_writer = LDIFWriter(f, base64_attrs, cols, '\n')
+ ldif_writer.unparse(dn, record)
+ s = f.getvalue()
+ f.close()
+ return s
+
+
+class LDIFParser:
+ """
+ Base class for a LDIF parser. Applications should sub-class this
+ class and override method handle() to implement something meaningful.
+
+ Public class attributes:
+ records_read
+ Counter for records processed so far
+ """
+
+ def _stripLineSep(self, s):
+ """
+ Strip trailing line separators from s, but no other whitespaces
+ """
+ return s.strip('\n').strip('\r')
+
+## if s[-2:] == '\r\n':
+## return s[:-2]
+## elif s[-1:] == '\n':
+## return s[:-1]
+## else:
+## return s
+
+ def __init__(self, input_file, ignored_attr_types=None,
+ max_entries=0, process_url_schemes=None, line_sep='\n'):
+ """
+ Parameters:
+ input_file
+ File-object to read the LDIF input from
+ ignored_attr_types
+ Attributes with these attribute type names will be ignored.
+ max_entries
+ If non-zero specifies the maximum number of entries to be
+ read from f.
+ process_url_schemes
+ List containing strings with URLs schemes to process with urllib.
+ An empty list turns off all URL processing and the attribute
+ is ignored completely.
+ line_sep
+ String used as line separator
+ """
+ self._input_file = input_file
+ self._max_entries = max_entries
+ self._process_url_schemes = list_dict([s.lower() for s in (process_url_schemes or [])])
+ self._ignored_attr_types = list_dict([a.lower() for a in (ignored_attr_types or [])])
+ self._line_sep = line_sep
+ self.records_read = 0
+
+ def handle(self, dn, entry):
+ """
+ Process a single content LDIF record. This method should be
+ implemented by applications using LDIFParser.
+ """
+
+ def _unfoldLDIFLine(self):
+ """
+ Unfold several folded lines with trailing space into one line
+ """
+ unfolded_lines = [ self._stripLineSep(self._line) ]
+ self._line = self._input_file.readline()
+
+ while self._line and self._line[0] == ' ':
+ unfolded_lines.append(self._stripLineSep(self._line[1:]))
+ self._line = self._input_file.readline()
+
+ return ''.join(unfolded_lines)
+
+ def _parseAttrTypeandValue(self):
+ """
+ Parse a single attribute type and value pair from one or
+ more lines of LDIF data
+ """
+ # Reading new attribute line
+ unfolded_line = self._unfoldLDIFLine()
+
+ # Ignore comments which can also be folded
+ while unfolded_line and unfolded_line[0] == '#':
+ unfolded_line = self._unfoldLDIFLine()
+
+ if not unfolded_line or unfolded_line == '\n' or unfolded_line == '\r\n':
+ return None, None
+
+ try:
+ colon_pos = unfolded_line.index(':')
+ except ValueError:
+ # Treat malformed lines without colon as non-existent
+ log.error("Malformed line: %s" % unfolded_line)
+ #return None, None
+ return '', ''
+
+ attr_type = unfolded_line[0:colon_pos]
+
+ # if needed attribute value is BASE64 decoded
+ value_spec = unfolded_line[colon_pos:colon_pos+2]
+
+ if value_spec=='::':
+ # attribute value needs base64-decoding
+ attr_value = base64.decodestring(unfolded_line[colon_pos+2:])
+
+ elif value_spec==':<':
+ # fetch attribute value from URL
+ url = unfolded_line[colon_pos+2:].strip()
+ attr_value = None
+ if self._process_url_schemes:
+ u = urlparse.urlparse(url)
+ if self._process_url_schemes.has_key(u[0]):
+ attr_value = urllib.urlopen(url).read()
+
+ elif value_spec==':\r\n' or value_spec=='\n':
+ attr_value = ''
+
+ else:
+ attr_value = unfolded_line[colon_pos+2:].lstrip()
+
+ return attr_type, attr_value
+
+ def parse(self):
+ """
+ Continously read and parse LDIF records
+ """
+ self._line = self._input_file.readline()
+
+ while self._line and \
+ (not self._max_entries or self.records_read<self._max_entries):
+
+ # Reset record
+ version = None
+ dn = None
+ changetype = None
+ modop = None
+ entry = {}
+
+ attr_type, attr_value = self._parseAttrTypeandValue()
+
+ while attr_type is not None and attr_value is not None:
+ attr_type = attr_type.lower()
+ log.debug("%s ---> %s" % (repr(attr_type), repr(attr_value)))
+
+ if not attr_type or not attr_value:
+ attr_type, attr_value = self._parseAttrTypeandValue()
+ continue
+
+ if attr_type == 'dn':
+
+ # attr type and value pair was DN of LDIF record
+ if dn is not None:
+ raise ValueError, 'Two lines starting with dn: in one record.'
+
+ if not is_dn(attr_value):
+ raise ValueError, 'No valid string-representation of distinguished name %s.' % (repr(attr_value))
+ dn = attr_value
+
+ elif attr_type == 'version' and dn is None:
+ version = 1
+
+ elif attr_type == 'changetype':
+ # attr type and value pair was DN of LDIF record
+ if dn is None:
+ raise ValueError, 'Read changetype: before getting valid dn: line.'
+
+ if changetype is not None:
+ raise ValueError, 'Two lines starting with changetype: in one record.'
+
+ if not attr_value in valid_changetype_dict:
+ raise ValueError, 'changetype value %s is invalid.' % (repr(attr_value))
+
+ changetype = attr_value
+
+ elif attr_value is not None and \
+ not self._ignored_attr_types.has_key(attr_type.lower()):
+
+ # Add the attribute to the entry if not ignored attribute
+ if attr_type in entry:
+ entry[attr_type].append(attr_value)
+ else:
+ entry[attr_type]=[attr_value]
+
+ # Read the next line within an entry
+ attr_type, attr_value = self._parseAttrTypeandValue()
+
+ if entry:
+ # append entry to result list
+ self.handle(dn, entry)
+ self.records_read += 1
+
+ return # parse()
+
+
+class LDIFRecordList(LDIFParser):
+ """
+ Collect all records of LDIF input into a single list.
+ of 2-tuples (dn, entry). It can be a memory hog!
+ """
+
+ def __init__(self, input_file, ignored_attr_types=None,
+ max_entries=0, process_url_schemes=None):
+ """
+ See LDIFParser.__init__()
+
+ Additional Parameters:
+ all_records
+ List instance for storing parsed records
+ """
+ LDIFParser.__init__(self, input_file, ignored_attr_types, max_entries, process_url_schemes)
+ self.all_records = []
+
+ def handle(self, dn, entry):
+ """
+ Append single record to dictionary of all records.
+ """
+ self.all_records.append((dn, entry))
+
+
+class LDIFCopy(LDIFParser):
+ """
+ Copy LDIF input to LDIF output containing all data retrieved
+ via URLs
+ """
+
+ def __init__(self, input_file, output_file, ignored_attr_types=None,
+ max_entries=0, process_url_schemes=None, base64_attrs=None,
+ cols=76, line_sep='\n'):
+ """
+ See LDIFParser.__init__() and LDIFWriter.__init__()
+ """
+ LDIFParser.__init__(self, input_file, ignored_attr_types, max_entries, process_url_schemes)
+ self._output_ldif = LDIFWriter(output_file, base64_attrs, cols, line_sep)
+
+ def handle(self, dn, entry):
+ """
+ Write single LDIF record to output file.
+ """
+ self._output_ldif.unparse(dn, entry)
+
+
+def ParseLDIF(f, ignore_attrs=None, maxentries=0):
+ """
+ Parse LDIF records read from file.
+ This is a compability function. Use is deprecated!
+ """
+ ldif_parser = LDIFRecordList(f, ignored_attr_types=ignore_attrs,
+ max_entries=maxentries, process_url_schemes=0)
+ ldif_parser.parse()
+ return ldif_parser.all_records
diff --git a/base/logger.py b/base/logger.py
new file mode 100644
index 0000000..50ffa54
--- /dev/null
+++ b/base/logger.py
@@ -0,0 +1,534 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2002-2008 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Authors: Doug Deprenger, Don Welch
+#
+
+# Std Lib
+import sys
+import thread # TODO: Use threading instead (thread deprecated in Python 3.0)
+import syslog
+import traceback
+import string
+import os
+import re
+import pprint
+
+identity = string.maketrans('','')
+unprintable = identity.translate(identity, string.printable)
+
+def printable(s):
+ return s.translate(identity, unprintable)
+
+DEFAULT_LOG_LEVEL = 'info'
+
+class Logger(object):
+ LOG_LEVEL_NONE = 99
+ #LOG_LEVEL_INFO = 50
+ LOG_LEVEL_FATAL = 40
+ LOG_LEVEL_ERROR = 30
+ LOG_LEVEL_WARN = 20
+ LOG_LEVEL_INFO = 10
+ LOG_LEVEL_DEBUG3 = 3
+ LOG_LEVEL_DBG3 = 3
+ LOG_LEVEL_DEBUG2 = 2
+ LOG_LEVEL_DBG2 = 2
+ LOG_LEVEL_DEBUG = 1
+ LOG_LEVEL_DBG = 1
+
+ logging_levels = {'none' : LOG_LEVEL_NONE,
+ 'fata' : LOG_LEVEL_FATAL,
+ 'fatal' : LOG_LEVEL_FATAL,
+ 'erro' : LOG_LEVEL_ERROR,
+ 'error' : LOG_LEVEL_ERROR,
+ 'warn' : LOG_LEVEL_WARN,
+ 'info' : LOG_LEVEL_INFO,
+ 'debug' : LOG_LEVEL_DEBUG,
+ 'dbg' : LOG_LEVEL_DEBUG,
+ 'debug2' : LOG_LEVEL_DEBUG2,
+ 'dbg2' : LOG_LEVEL_DEBUG2,
+ 'debug3' : LOG_LEVEL_DEBUG3,
+ 'dbg3' : LOG_LEVEL_DEBUG3,
+ }
+
+ LOG_TO_DEV_NULL = 0
+ LOG_TO_CONSOLE = 1
+ LOG_TO_SCREEN = 1
+ LOG_TO_FILE = 2
+ LOG_TO_CONSOLE_AND_FILE = 3
+ LOG_TO_BOTH = 3
+
+ # Copied from Gentoo Portage output.py
+ # Copyright 1998-2003 Daniel Robbins, Gentoo Technologies, Inc.
+ # Distributed under the GNU Public License v2
+ codes={}
+ codes["reset"]="\x1b[0m"
+ codes["bold"]="\x1b[01m"
+
+ codes["teal"]="\x1b[36;06m"
+ codes["turquoise"]="\x1b[36;01m"
+
+ codes["fuscia"]="\x1b[35;01m"
+ codes["purple"]="\x1b[35;06m"
+
+ codes["blue"]="\x1b[34;01m"
+ codes["darkblue"]="\x1b[34;06m"
+
+ codes["green"]="\x1b[32;01m"
+ codes["darkgreen"]="\x1b[32;06m"
+
+ codes["yellow"]="\x1b[33;01m"
+ codes["brown"]="\x1b[33;06m"
+
+ codes["red"]="\x1b[31;01m"
+ codes["darkred"]="\x1b[31;06m"
+
+
+ def __init__(self, module='', level=LOG_LEVEL_INFO, where=LOG_TO_CONSOLE_AND_FILE,
+ log_datetime=False, log_file=None):
+
+ self._where = where
+ self._log_file = log_file
+ self._log_file_f = None
+ self._log_datetime = log_datetime
+ self._lock = thread.allocate_lock()
+ self.module = module
+ self.pid = os.getpid()
+ self.fmt = True
+ self.set_level(level)
+
+
+ def set_level(self, level):
+ if isinstance(level, str):
+ level = level.lower()
+ if level in Logger.logging_levels.keys():
+ self._level = Logger.logging_levels.get(level, Logger.LOG_LEVEL_INFO)
+ return True
+ else:
+ self.error("Invalid logging level: %s" % level)
+ return False
+
+ elif isinstance(level, int):
+ if Logger.LOG_LEVEL_DEBUG3 <= level <= Logger.LOG_LEVEL_FATAL:
+ self._level = level
+ else:
+ self._level = Logger.LOG_LEVEL_ERROR
+ self.error("Invalid logging level: %d" % level)
+ return False
+
+ else:
+ return False
+
+
+ def set_module(self, module):
+ self.module = module
+ self.pid = os.getpid()
+
+
+ def no_formatting(self):
+ self.fmt = False
+
+
+ def set_logfile(self, log_file):
+ self._log_file = log_file
+ try:
+ self._log_file_f = file(self._log_file, 'w')
+ except IOError:
+ self._log_file = None
+ self._log_file_f = None
+ self._where = Logger.LOG_TO_SCREEN
+
+
+ def get_logfile(self):
+ return self._log_file
+
+
+ def set_where(self, where):
+ self._where = where
+
+
+ def get_level(self):
+ return self._level
+
+
+ def is_debug(self):
+ return self._level <= Logger.LOG_LEVEL_DEBUG3
+
+ level = property(get_level, set_level)
+
+
+ def log(self, message, level, newline=True):
+ if self._level <= level:
+ if self._where in (Logger.LOG_TO_CONSOLE, Logger.LOG_TO_CONSOLE_AND_FILE):
+ try:
+ self._lock.acquire()
+ if level >= Logger.LOG_LEVEL_WARN:
+ out = sys.stderr
+ else:
+ out = sys.stdout
+
+ try:
+ out.write(message)
+ except UnicodeEncodeError:
+ out.write(message.encode("utf-8"))
+
+ if newline:
+ out.write('\n')
+
+ out.flush()
+ finally:
+ self._lock.release()
+
+
+ def log_to_file(self, message):
+ if self._log_file_f is not None:
+ try:
+ self._lock.acquire()
+ self._log_file_f.write(message.replace('\x1b', ''))
+ self._log_file_f.write('\n')
+
+ finally:
+ self._lock.release()
+
+
+ def stderr(self, message):
+ try:
+ self._lock.acquire()
+ sys.stderr.write("%s: %s\n" % (self.module, message))
+ finally:
+ self._lock.release()
+
+
+ def debug(self, message):
+ if self._level <= Logger.LOG_LEVEL_DEBUG:
+ txt = "%s[%d]: debug: %s" % (self.module, self.pid, message)
+ self.log(self.color(txt, 'blue'), Logger.LOG_LEVEL_DEBUG)
+
+ if self._log_file is not None and \
+ self._where in (Logger.LOG_TO_FILE, Logger.LOG_TO_CONSOLE_AND_FILE):
+ self.log_to_file(txt)
+
+ dbg = debug
+
+ def debug2(self, message):
+ if self._level <= Logger.LOG_LEVEL_DEBUG2:
+ txt = "%s[%d]: debug2: %s" % (self.module, self.pid, message)
+ self.log(self.color(txt, 'blue'), Logger.LOG_LEVEL_DEBUG2)
+
+ if self._log_file is not None and \
+ self._where in (Logger.LOG_TO_FILE, Logger.LOG_TO_CONSOLE_AND_FILE):
+ self.log_to_file(txt)
+ dbg2 = debug2
+
+ def debug3(self, message):
+ if self._level <= Logger.LOG_LEVEL_DEBUG3:
+ txt = "%s[%d]: debug3: %s" % (self.module, self.pid, message)
+ self.log(self.color(txt, 'blue'), Logger.LOG_LEVEL_DEBUG3)
+
+ if self._log_file is not None and \
+ self._where in (Logger.LOG_TO_FILE, Logger.LOG_TO_CONSOLE_AND_FILE):
+ self.log_to_file(txt)
+ dbg3 = debug3
+
+
+ def debug_block(self, title, block):
+ if self._level <= Logger.LOG_LEVEL_DEBUG:
+ line = "%s[%d]: debug: %s:" % (self.module, self.pid, title)
+ self.log(self.color(line, 'blue'), Logger.LOG_LEVEL_DEBUG)
+ self.log(self.color(block, 'blue'), Logger.LOG_LEVEL_DEBUG)
+
+ if self._log_file is not None and \
+ self._where in (Logger.LOG_TO_FILE, Logger.LOG_TO_CONSOLE_AND_FILE):
+
+ self.log_to_file(line % (self.module, self.pid, title))
+ self.log_to_file(block)
+
+
+ printable = """ !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ """
+
+ def log_data(self, data, width=16):
+ if self._level <= Logger.LOG_LEVEL_DEBUG:
+ if data:
+ index, line = 0, data[0:width]
+ while line:
+ txt = ' '.join(['%04x: ' % index, ' '.join(['%02x' % ord(d) for d in line]),
+ ' '*(width*3-3*len(line)), ''.join([('.', i)[i in Logger.printable] for i in line])])
+
+ self.log(self.color("%s[%d]: debug: %s" % (self.module, self.pid, txt), 'blue'),
+ Logger.LOG_LEVEL_DEBUG)
+
+ index += width
+ line = data[index:index+width]
+ else:
+ self.log(self.color("%s[%d]: debug: %s" % (self.module, self.pid, "0000: (no data)"), 'blue'),
+ Logger.LOG_LEVEL_DEBUG)
+
+
+ def info(self, message=''):
+ if self._level <= Logger.LOG_LEVEL_INFO:
+ self.log(message, Logger.LOG_LEVEL_INFO)
+
+ if self._log_file is not None and \
+ self._where in (Logger.LOG_TO_FILE, Logger.LOG_TO_CONSOLE_AND_FILE):
+ self.log_to_file("%s[%d]: info: :%s" % (self.module, self.pid, message))
+
+ information = info
+
+
+ def warn(self, message):
+ if self._level <= Logger.LOG_LEVEL_WARN:
+ txt = "warning: %s" % message.encode('utf-8')
+ self.log(self.color(txt, 'fuscia'), Logger.LOG_LEVEL_WARN)
+
+ syslog.syslog(syslog.LOG_WARNING, "%s[%d]: %s" % (self.module, self.pid, txt))
+
+ if self._log_file is not None and \
+ self._where in (Logger.LOG_TO_FILE, Logger.LOG_TO_CONSOLE_AND_FILE):
+ self.log_to_file(txt)
+
+ warning = warn
+
+
+ def note(self, message):
+ if self._level <= Logger.LOG_LEVEL_WARN:
+ txt = "note: %s" % message
+ self.log(self.color(txt, 'green'), Logger.LOG_LEVEL_WARN)
+
+ if self._log_file is not None and \
+ self._where in (Logger.LOG_TO_FILE, Logger.LOG_TO_CONSOLE_AND_FILE):
+ self.log_to_file(txt)
+
+ notice = note
+
+
+ def error(self, message):
+ if self._level <= Logger.LOG_LEVEL_ERROR:
+ txt = "error: %s" % message.encode("utf-8")
+ self.log(self.color(txt, 'red'), Logger.LOG_LEVEL_ERROR)
+
+ syslog.syslog(syslog.LOG_ALERT, "%s[%d]: %s" % (self.module, self.pid, txt))
+
+ if self._log_file is not None and \
+ self._where in (Logger.LOG_TO_FILE, Logger.LOG_TO_CONSOLE_AND_FILE):
+ self.log_to_file(txt)
+
+
+ def fatal(self, message):
+ if self._level <= Logger.LOG_LEVEL_FATAL:
+ txt = "fatal error: :%s" % self.module.encode('utf-8')
+ self.log(self.color(txt, 'red'), Logger.LOG_LEVEL_DEBUG)
+
+ syslog.syslog(syslog.LOG_ALERT, "%s[%d]: %s" % (self.module, self.pid, txt))
+
+ if self._log_file is not None and \
+ self._where in (Logger.LOG_TO_FILE, Logger.LOG_TO_CONSOLE_AND_FILE):
+ self.log_to_file(txt)
+
+
+ def exception(self):
+ typ, value, tb = sys.exc_info()
+ body = "Traceback (innermost last):\n"
+ lst = traceback.format_tb(tb) + traceback.format_exception_only(typ, value)
+ body = body + "%-20s %s" % (''.join(lst[:-1]), lst[-1],)
+ self.fatal(body)
+
+
+ def color(self, text, color):
+ if self.fmt:
+ return ''.join([Logger.codes.get(color, 'bold'), text, Logger.codes['reset']])
+ return text
+
+
+ def bold(self, text):
+ return self.color(text, 'bold')
+
+
+ def red(self, text):
+ return self.color(text, 'red')
+
+
+ def green(self, text):
+ return self.color(text, 'green')
+
+
+ def purple(self, text):
+ return self.color(text, 'purple')
+
+
+ def yellow(self, text):
+ return self.color(text, 'yellow')
+
+
+ def darkgreen(self, text):
+ return self.color(text, 'darkgreen')
+
+
+ def blue(self, text):
+ return self.color(text, 'blue')
+
+ """Pretty print an XML document.
+
+ LICENCE:
+ Copyright (c) 2008, Fredrik Ekholdt
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+ * Neither the name of None nor the names of its contributors may be used to
+ endorse or promote products derived from this software without specific prior
+ written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE."""
+
+ def _pprint_line(self, indent_level, line, width=100, level=LOG_LEVEL_DEBUG):
+ if line.strip():
+ start = ""
+ number_chars = 0
+ for l in range(indent_level):
+ start = start + " "
+ number_chars = number_chars + 1
+ try:
+ elem_start = re.findall("(\<\W{0,1}\w+) ?", line)[0]
+ elem_finished = re.findall("([?|\]\]]*\>)", line)[0]
+ #should not have *
+ attrs = re.findall("(\S*?\=\".*?\")", line)
+ #output.write(start + elem_start)
+ self.log(start+elem_start, level, False)
+ number_chars = len(start + elem_start)
+ for attr in attrs:
+ if (attrs.index(attr) + 1) == len(attrs):
+ number_chars = number_chars + len(elem_finished)
+
+ if (number_chars + len(attr) + 1) > width:
+ #output.write("\n")
+ self.log("\n", level, False)
+ #for i in range(len(start + elem_start) + 1):
+ ##output.write(" ")
+ #self.log(" ", level, False)
+ self.log(" "*(len(start + elem_start) + 1), level, False)
+ number_chars = len(start + elem_start) + 1
+
+ else:
+ #output.write(" ")
+ self.log(" ", level, False)
+ number_chars = number_chars + 1
+ #output.write(attr)
+ self.log(attr, level, False)
+ number_chars = number_chars + len(attr)
+ #output.write(elem_finished + "\n")
+ self.log(elem_finished + "\n", level, False)
+
+ except IndexError:
+ #give up pretty print this line
+ #output.write(start + line + "\n")
+ self.log(start + line + "\n", level, False)
+
+
+ def _pprint_elem_content(self, indent_level, line, level=LOG_LEVEL_DEBUG):
+ if line.strip():
+ #for l in range(indent_level):
+ ##output.write(" ")
+ #self.log(" ", level, False)
+ self.log(" "*indent_level, level, False)
+
+ #output.write(line + "\n")
+ self.log(line + "\n", level, False)
+
+
+ def _get_next_elem(self, data):
+ start_pos = data.find("<")
+ end_pos = data.find(">") + 1
+ retval = data[start_pos:end_pos]
+ stopper = retval.rfind("/")
+ if stopper < retval.rfind("\""):
+ stopper = -1
+
+ single = (stopper > -1 and ((retval.find(">") - stopper) < (stopper - retval.find("<"))))
+
+ ignore_excl = retval.find("<!") > -1
+ ignore_question = retval.find("<?") > -1
+
+ if ignore_excl:
+ cdata = retval.find("<![CDATA[") > -1
+ if cdata:
+ end_pos = data.find("]]>")
+ if end_pos > -1:
+ end_pos = end_pos + len("]]>")
+
+ elif ignore_question:
+ end_pos = data.find("?>") + len("?>")
+
+ ignore = ignore_excl or ignore_question
+
+ no_indent = ignore or single
+
+ #print retval, end_pos, start_pos, stopper > -1, no_indent
+ return start_pos, \
+ end_pos, \
+ stopper > -1, \
+ no_indent
+
+
+ def xml(self, xml, level=LOG_LEVEL_DEBUG, indent=4, width=80):
+ """Pretty print xml.
+ Use indent to select indentation level. Default is 4 """
+ data = xml
+ indent_level = 0
+ start_pos, end_pos, is_stop, no_indent = self._get_next_elem(data)
+ while ((start_pos > -1 and end_pos > -1)):
+ self._pprint_elem_content(indent_level, data[:start_pos].strip(), level=level)
+ data = data[start_pos:]
+ if is_stop and not no_indent:
+ indent_level = indent_level - indent
+
+ self._pprint_line(indent_level,
+ data[:end_pos - start_pos],
+ width=width, level=level)
+
+ data = data[end_pos - start_pos:]
+ if not is_stop and not no_indent :
+ indent_level = indent_level + indent
+
+ if not data:
+ break
+ else:
+ start_pos, end_pos, is_stop, no_indent = self._get_next_elem(data)
+
+ # END: Pretty print an XML document.
+
+
+ def pprint(self, data):
+ self.info(pprint.pformat(data))
diff --git a/base/magic.py b/base/magic.py
new file mode 100644
index 0000000..2b37b9f
--- /dev/null
+++ b/base/magic.py
@@ -0,0 +1,1262 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+#
+# magic.py
+# determines a file type by its magic number
+#
+# Copyright (c) 2000, Jason Petrone <jp_py@demonseed.net>
+# All Rights Reserved
+#
+# Modifications by Don Welch
+# (c) Copyright 2003-2008 Hewlett-Packard Development Company, L.P.
+#
+# Redistribution and use in source and binary forms, with or without modification,
+# are permitted provided that the following conditions are met:
+#
+# * Redistributions of source code must retain the above copyright notice,
+# this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright notice,
+# this list of conditions and the following disclaimer in the documentation and/or
+# other materials provided with the distribution.
+# * Neither the name of the <ORGANIZATION> nor the names of its contributors may
+# be used to endorse or promote products derived from this software without
+# specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+# IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
+# THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+# Command Line Usage: running as `python magic.py file` will print
+# a description of what 'file' is.
+#
+# Module Usage:
+# magic.whatis(data): when passed a string 'data' containing
+# binary or text data, a description of
+# what the data is will be returned.
+#
+# magic.mime_type(filename): returns a description of what the file
+# ' filename' contains.
+#
+
+import re
+import struct
+import os.path
+
+__version__ = '0.2'
+
+magic = [
+ [0L, 'string', '=', '#define', 'image/x-xbitmap'],
+ [0L, 'leshort', '=', 1538L, 'application/x-alan-adventure-game'],
+ [0L, 'string', '=', 'TADS', 'application/x-tads-game'],
+ [0L, 'short', '=', 420L, 'application/x-executable-file'],
+ [0L, 'short', '=', 421L, 'application/x-executable-file'],
+ [0L, 'leshort', '=', 603L, 'application/x-executable-file'],
+ [0L, 'string', '=', 'Core\001', 'application/x-executable-file'],
+ [0L, 'string', '=', 'AMANDA: TAPESTART DATE', 'application/x-amanda-header'],
+ [0L, 'belong', '=', 1011L, 'application/x-executable-file'],
+ [0L, 'belong', '=', 999L, 'application/x-library-file'],
+ [0L, 'belong', '=', 435L, 'video/mpeg'],
+ [0L, 'belong', '=', 442L, 'video/mpeg'],
+ [0L, 'beshort&0xfff0', '=', 65520L, 'audio/mpeg'],
+ [4L, 'leshort', '=', 44817L, 'video/fli'],
+ [4L, 'leshort', '=', 44818L, 'video/flc'],
+ [0L, 'string', '=', 'MOVI', 'video/x-sgi-movie'],
+ [4L, 'string', '=', 'moov', 'video/quicktime'],
+ [4L, 'string', '=', 'mdat', 'video/quicktime'],
+ [0L, 'long', '=', 100554L, 'application/x-apl-workspace'],
+ [0L, 'string', '=', 'FiLeStArTfIlEsTaRt', 'text/x-apple-binscii'],
+ [0L, 'string', '=', '\012GL', 'application/data'],
+ [0L, 'string', '=', 'v\377', 'application/data'],
+ [0L, 'string', '=', 'NuFile', 'application/data'],
+ [0L, 'string', '=', 'N\365F\351l\345', 'application/data'],
+ [0L, 'belong', '=', 333312L, 'application/data'],
+ [0L, 'belong', '=', 333319L, 'application/data'],
+ [257L, 'string', '=', 'ustar\000', 'application/x-tar'],
+ [257L, 'string', '=', 'ustar \000', 'application/x-gtar'],
+ [0L, 'short', '=', 70707L, 'application/x-cpio'],
+ [0L, 'short', '=', 143561L, 'application/x-bcpio'],
+ [0L, 'string', '=', '070707', 'application/x-cpio'],
+ [0L, 'string', '=', '070701', 'application/x-cpio'],
+ [0L, 'string', '=', '070702', 'application/x-cpio'],
+ [0L, 'string', '=', '!<arch>\012debian', 'application/x-dpkg'],
+ [0L, 'long', '=', 177555L, 'application/x-ar'],
+ [0L, 'short', '=', 177555L, 'application/data'],
+ [0L, 'long', '=', 177545L, 'application/data'],
+ [0L, 'short', '=', 177545L, 'application/data'],
+ [0L, 'long', '=', 100554L, 'application/x-apl-workspace'],
+ [0L, 'string', '=', '<ar>', 'application/x-ar'],
+ [0L, 'string', '=', '!<arch>\012__________E', 'application/x-ar'],
+ [0L, 'string', '=', '-h-', 'application/data'],
+ [0L, 'string', '=', '!<arch>', 'application/x-ar'],
+ [0L, 'string', '=', '<ar>', 'application/x-ar'],
+ [0L, 'string', '=', '<ar>', 'application/x-ar'],
+ [0L, 'belong', '=', 1711210496L, 'application/x-ar'],
+ [0L, 'belong', '=', 1013019198L, 'application/x-ar'],
+ [0L, 'long', '=', 557605234L, 'application/x-ar'],
+ [0L, 'lelong', '=', 177555L, 'application/data'],
+ [0L, 'leshort', '=', 177555L, 'application/data'],
+ [0L, 'lelong', '=', 177545L, 'application/data'],
+ [0L, 'leshort', '=', 177545L, 'application/data'],
+ [0L, 'lelong', '=', 236525L, 'application/data'],
+ [0L, 'lelong', '=', 236526L, 'application/data'],
+ [0L, 'lelong&0x8080ffff', '=', 2074L, 'application/x-arc'],
+ [0L, 'lelong&0x8080ffff', '=', 2330L, 'application/x-arc'],
+ [0L, 'lelong&0x8080ffff', '=', 538L, 'application/x-arc'],
+ [0L, 'lelong&0x8080ffff', '=', 794L, 'application/x-arc'],
+ [0L, 'lelong&0x8080ffff', '=', 1050L, 'application/x-arc'],
+ [0L, 'lelong&0x8080ffff', '=', 1562L, 'application/x-arc'],
+ [0L, 'string', '=', '\032archive', 'application/data'],
+ [0L, 'leshort', '=', 60000L, 'application/x-arj'],
+ [0L, 'string', '=', 'HPAK', 'application/data'],
+ [0L, 'string', '=', '\351,\001JAM application/data', ''],
+ [2L, 'string', '=', '-lh0-', 'application/x-lha'],
+ [2L, 'string', '=', '-lh1-', 'application/x-lha'],
+ [2L, 'string', '=', '-lz4-', 'application/x-lha'],
+ [2L, 'string', '=', '-lz5-', 'application/x-lha'],
+ [2L, 'string', '=', '-lzs-', 'application/x-lha'],
+ [2L, 'string', '=', '-lh -', 'application/x-lha'],
+ [2L, 'string', '=', '-lhd-', 'application/x-lha'],
+ [2L, 'string', '=', '-lh2-', 'application/x-lha'],
+ [2L, 'string', '=', '-lh3-', 'application/x-lha'],
+ [2L, 'string', '=', '-lh4-', 'application/x-lha'],
+ [2L, 'string', '=', '-lh5-', 'application/x-lha'],
+ [0L, 'string', '=', 'Rar!', 'application/x-rar'],
+ [0L, 'string', '=', 'SQSH', 'application/data'],
+ [0L, 'string', '=', 'UC2\032', 'application/data'],
+ [0L, 'string', '=', 'PK\003\004', 'application/zip'],
+ [20L, 'lelong', '=', 4257523676L, 'application/x-zoo'],
+ [10L, 'string', '=', '# This is a shell archive', 'application/x-shar'],
+ [0L, 'string', '=', '*STA', 'application/data'],
+ [0L, 'string', '=', '2278', 'application/data'],
+ [0L, 'beshort', '=', 560L, 'application/x-executable-file'],
+ [0L, 'beshort', '=', 561L, 'application/x-executable-file'],
+ [0L, 'string', '=', '\000\004\036\212\200', 'application/core'],
+ [0L, 'string', '=', '.snd', 'audio/basic'],
+ [0L, 'lelong', '=', 6583086L, 'audio/basic'],
+ [0L, 'string', '=', 'MThd', 'audio/midi'],
+ [0L, 'string', '=', 'CTMF', 'audio/x-cmf'],
+ [0L, 'string', '=', 'SBI', 'audio/x-sbi'],
+ [0L, 'string', '=', 'Creative Voice File', 'audio/x-voc'],
+ [0L, 'belong', '=', 1314148939L, 'audio/x-multitrack'],
+ [0L, 'string', '=', 'RIFF', 'audio/x-wav'],
+ [0L, 'string', '=', 'EMOD', 'audio/x-emod'],
+ [0L, 'belong', '=', 779248125L, 'audio/x-pn-realaudio'],
+ [0L, 'string', '=', 'MTM', 'audio/x-multitrack'],
+ [0L, 'string', '=', 'if', 'audio/x-669-mod'],
+ [0L, 'string', '=', 'FAR', 'audio/mod'],
+ [0L, 'string', '=', 'MAS_U', 'audio/x-multimate-mod'],
+ [44L, 'string', '=', 'SCRM', 'audio/x-st3-mod'],
+ [0L, 'string', '=', 'GF1PATCH110\000ID#000002\000','audio/x-gus-patch'],
+ [0L, 'string', '=', 'GF1PATCH100\000ID#000002\000', 'audio/x-gus-patch'],
+ [0L, 'string', '=', 'JN', 'audio/x-669-mod'],
+ [0L, 'string', '=', 'UN05', 'audio/x-mikmod-uni'],
+ [0L, 'string', '=', 'Extended Module:', 'audio/x-ft2-mod'],
+ [21L, 'string', '=', '!SCREAM!', 'audio/x-st2-mod'],
+ [1080L, 'string', '=', 'M.K.', 'audio/x-protracker-mod'],
+ [1080L, 'string', '=', 'M!K!', 'audio/x-protracker-mod'],
+ [1080L, 'string', '=', 'FLT4', 'audio/x-startracker-mod'],
+ [1080L, 'string', '=', '4CHN', 'audio/x-fasttracker-mod'],
+ [1080L, 'string', '=', '6CHN', 'audio/x-fasttracker-mod'],
+ [1080L, 'string', '=', '8CHN', 'audio/x-fasttracker-mod'],
+ [1080L, 'string', '=', 'CD81', 'audio/x-oktalyzer-mod'],
+ [1080L, 'string', '=', 'OKTA', 'audio/x-oktalyzer-mod'],
+ [1080L, 'string', '=', '16CN', 'audio/x-taketracker-mod'],
+ [1080L, 'string', '=', '32CN', 'audio/x-taketracker-mod'],
+ [0L, 'string', '=', 'TOC', 'audio/x-toc'],
+ [0L, 'short', '=', 3401L, 'application/x-executable-file'],
+ [0L, 'long', '=', 406L, 'application/x-executable-file'],
+ [0L, 'short', '=', 406L, 'application/x-executable-file'],
+ [0L, 'short', '=', 3001L, 'application/x-executable-file'],
+ [0L, 'lelong', '=', 314L, 'application/x-executable-file'],
+ [0L, 'string', '=', '//', 'text/cpp'],
+ [0L, 'string', '=', '\\\\1cw\\', 'application/data'],
+ [0L, 'string', '=', '\\\\1cw', 'application/data'],
+ [0L, 'belong&0xffffff00', '=', 2231440384L, 'application/data'],
+ [0L, 'belong&0xffffff00', '=', 2231487232L, 'application/data'],
+ [0L, 'short', '=', 575L, 'application/x-executable-file'],
+ [0L, 'short', '=', 577L, 'application/x-executable-file'],
+ [4L, 'string', '=', 'pipe', 'application/data'],
+ [4L, 'string', '=', 'prof', 'application/data'],
+ [0L, 'string', '=', ': shell', 'application/data'],
+ [0L, 'string', '=', '#!/bin/sh', 'application/x-sh'],
+ [0L, 'string', '=', '#! /bin/sh', 'application/x-sh'],
+ [0L, 'string', '=', '#! /bin/sh', 'application/x-sh'],
+ [0L, 'string', '=', '#!/bin/csh', 'application/x-csh'],
+ [0L, 'string', '=', '#! /bin/csh', 'application/x-csh'],
+ [0L, 'string', '=', '#! /bin/csh', 'application/x-csh'],
+ [0L, 'string', '=', '#!/bin/ksh', 'application/x-ksh'],
+ [0L, 'string', '=', '#! /bin/ksh', 'application/x-ksh'],
+ [0L, 'string', '=', '#! /bin/ksh', 'application/x-ksh'],
+ [0L, 'string', '=', '#!/bin/tcsh', 'application/x-csh'],
+ [0L, 'string', '=', '#! /bin/tcsh', 'application/x-csh'],
+ [0L, 'string', '=', '#! /bin/tcsh', 'application/x-csh'],
+ [0L, 'string', '=', '#!/usr/local/tcsh', 'application/x-csh'],
+ [0L, 'string', '=', '#! /usr/local/tcsh', 'application/x-csh'],
+ [0L, 'string', '=', '#!/usr/local/bin/tcsh', 'application/x-csh'],
+ [0L, 'string', '=', '#! /usr/local/bin/tcsh', 'application/x-csh'],
+ [0L, 'string', '=', '#! /usr/local/bin/tcsh', 'application/x-csh'],
+ [0L, 'string', '=', '#!/usr/local/bin/zsh', 'application/x-zsh'],
+ [0L, 'string', '=', '#! /usr/local/bin/zsh', 'application/x-zsh'],
+ [0L, 'string', '=', '#! /usr/local/bin/zsh', 'application/x-zsh'],
+ [0L, 'string', '=', '#!/usr/local/bin/ash', 'application/x-sh'],
+ [0L, 'string', '=', '#! /usr/local/bin/ash', 'application/x-zsh'],
+ [0L, 'string', '=', '#! /usr/local/bin/ash', 'application/x-zsh'],
+ [0L, 'string', '=', '#!/usr/local/bin/ae', 'text/script'],
+ [0L, 'string', '=', '#! /usr/local/bin/ae', 'text/script'],
+ [0L, 'string', '=', '#! /usr/local/bin/ae', 'text/script'],
+ [0L, 'string', '=', '#!/bin/nawk', 'application/x-awk'],
+ [0L, 'string', '=', '#! /bin/nawk', 'application/x-awk'],
+ [0L, 'string', '=', '#! /bin/nawk', 'application/x-awk'],
+ [0L, 'string', '=', '#!/usr/bin/nawk', 'application/x-awk'],
+ [0L, 'string', '=', '#! /usr/bin/nawk', 'application/x-awk'],
+ [0L, 'string', '=', '#! /usr/bin/nawk', 'application/x-awk'],
+ [0L, 'string', '=', '#!/usr/local/bin/nawk', 'application/x-awk'],
+ [0L, 'string', '=', '#! /usr/local/bin/nawk', 'application/x-awk'],
+ [0L, 'string', '=', '#! /usr/local/bin/nawk', 'application/x-awk'],
+ [0L, 'string', '=', '#!/bin/gawk', 'application/x-awk'],
+ [0L, 'string', '=', '#! /bin/gawk', 'application/x-awk'],
+ [0L, 'string', '=', '#! /bin/gawk', 'application/x-awk'],
+ [0L, 'string', '=', '#!/usr/bin/gawk', 'application/x-awk'],
+ [0L, 'string', '=', '#! /usr/bin/gawk', 'application/x-awk'],
+ [0L, 'string', '=', '#! /usr/bin/gawk', 'application/x-awk'],
+ [0L, 'string', '=', '#!/usr/local/bin/gawk', 'application/x-awk'],
+ [0L, 'string', '=', '#! /usr/local/bin/gawk', 'application/x-awk'],
+ [0L, 'string', '=', '#! /usr/local/bin/gawk', 'application/x-awk'],
+ [0L, 'string', '=', '#!/bin/awk', 'application/x-awk'],
+ [0L, 'string', '=', '#! /bin/awk', 'application/x-awk'],
+ [0L, 'string', '=', '#! /bin/awk', 'application/x-awk'],
+ [0L, 'string', '=', '#!/usr/bin/awk', 'application/x-awk'],
+ [0L, 'string', '=', '#! /usr/bin/awk', 'application/x-awk'],
+ [0L, 'string', '=', '#! /usr/bin/awk', 'application/x-awk'],
+ [0L, 'string', '=', 'BEGIN', 'application/x-awk'],
+ [0L, 'string', '=', '#!/bin/perl', 'application/x-perl'],
+ [0L, 'string', '=', '#! /bin/perl', 'application/x-perl'],
+ [0L, 'string', '=', '#! /bin/perl', 'application/x-perl'],
+ [0L, 'string', '=', 'eval "exec /bin/perl', 'application/x-perl'],
+ [0L, 'string', '=', '#!/usr/bin/perl', 'application/x-perl'],
+ [0L, 'string', '=', '#! /usr/bin/perl', 'application/x-perl'],
+ [0L, 'string', '=', '#! /usr/bin/perl', 'application/x-perl'],
+ [0L, 'string', '=', 'eval "exec /usr/bin/perl', 'application/x-perl'],
+ [0L, 'string', '=', '#!/usr/local/bin/perl', 'application/x-perl'],
+ [0L, 'string', '=', '#! /usr/local/bin/perl', 'application/x-perl'],
+ [0L, 'string', '=', '#! /usr/local/bin/perl', 'application/x-perl'],
+ [0L, 'string', '=', 'eval "exec /usr/local/bin/perl', 'application/x-perl'],
+ [0L, 'string', '=', '#!/bin/python', 'application/x-python'],
+ [0L, 'string', '=', '#! /bin/python', 'application/x-python'],
+ [0L, 'string', '=', '#! /bin/python', 'application/x-python'],
+ [0L, 'string', '=', 'eval "exec /bin/python', 'application/x-python'],
+ [0L, 'string', '=', '#!/usr/bin/python', 'application/x-python'],
+ [0L, 'string', '=', '#! /usr/bin/python', 'application/x-python'],
+ [0L, 'string', '=', '#! /usr/bin/python', 'application/x-python'],
+ [0L, 'string', '=', 'eval "exec /usr/bin/python', 'application/x-python'],
+ [0L, 'string', '=', '#!/usr/local/bin/python', 'application/x-python'],
+ [0L, 'string', '=', '#! /usr/local/bin/python', 'application/x-python'],
+ [0L, 'string', '=', '#! /usr/local/bin/python', 'application/x-python'],
+ [0L, 'string', '=', 'eval "exec /usr/local/bin/python', 'application/x-python'],
+ [0L, 'string', '=', '#!/usr/bin/env python', 'application/x-python'],
+ [0L, 'string', '=', '#! /usr/bin/env python', 'application/x-python'],
+ [0L, 'string', '=', '#!/bin/rc', 'text/script'],
+ [0L, 'string', '=', '#! /bin/rc', 'text/script'],
+ [0L, 'string', '=', '#! /bin/rc', 'text/script'],
+ [0L, 'string', '=', '#!/bin/bash', 'application/x-sh'],
+ [0L, 'string', '=', '#! /bin/bash', 'application/x-sh'],
+ [0L, 'string', '=', '#! /bin/bash', 'application/x-sh'],
+ [0L, 'string', '=', '#!/usr/local/bin/bash', 'application/x-sh'],
+ [0L, 'string', '=', '#! /usr/local/bin/bash', 'application/x-sh'],
+ [0L, 'string', '=', '#! /usr/local/bin/bash', 'application/x-sh'],
+ [0L, 'string', '=', '#! /', 'text/script'],
+ [0L, 'string', '=', '#! /', 'text/script'],
+ [0L, 'string', '=', '#!/', 'text/script'],
+ [0L, 'string', '=', '#! text/script', ''],
+ [0L, 'string', '=', '\037\235', 'application/compress'],
+ [0L, 'string', '=', '\037\213', 'application/x-gzip'],
+ [0L, 'string', '=', '\037\036', 'application/data'],
+ [0L, 'short', '=', 17437L, 'application/data'],
+ [0L, 'short', '=', 8191L, 'application/data'],
+ [0L, 'string', '=', '\377\037', 'application/data'],
+ [0L, 'short', '=', 145405L, 'application/data'],
+ [0L, 'string', '=', 'BZh', 'application/x-bzip2'],
+ [0L, 'leshort', '=', 65398L, 'application/data'],
+ [0L, 'leshort', '=', 65142L, 'application/data'],
+ [0L, 'leshort', '=', 64886L, 'application/x-lzh'],
+ [0L, 'string', '=', '\037\237', 'application/data'],
+ [0L, 'string', '=', '\037\236', 'application/data'],
+ [0L, 'string', '=', '\037\240', 'application/data'],
+ [0L, 'string', '=', 'BZ', 'application/x-bzip'],
+ [0L, 'string', '=', '\211LZO\000\015\012\032\012',
+ 'application/data'],
+ [0L, 'belong', '=', 507L, 'application/x-object-file'],
+ [0L, 'belong', '=', 513L, 'application/x-executable-file'],
+ [0L, 'belong', '=', 515L, 'application/x-executable-file'],
+ [0L, 'belong', '=', 517L, 'application/x-executable-file'],
+ [0L, 'belong', '=', 70231L, 'application/core'],
+ [24L, 'belong', '=', 60011L, 'application/data'],
+ [24L, 'belong', '=', 60012L, 'application/data'],
+ [24L, 'belong', '=', 60013L, 'application/data'],
+ [24L, 'belong', '=', 60014L, 'application/data'],
+ [0L, 'belong', '=', 601L, 'application/x-object-file'],
+ [0L, 'belong', '=', 607L, 'application/data'],
+ [0L, 'belong', '=', 324508366L, 'application/x-gdbm'],
+ [0L, 'lelong', '=', 324508366L, 'application/x-gdbm'],
+ [0L, 'string', '=', 'GDBM', 'application/x-gdbm'],
+ [0L, 'belong', '=', 398689L, 'application/x-db'],
+ [0L, 'belong', '=', 340322L, 'application/x-db'],
+ [0L, 'string', '=', '<list>\012<protocol bbn-m', 'application/data'],
+ [0L, 'string', '=', 'diff text/x-patch', ''],
+ [0L, 'string', '=', '*** text/x-patch', ''],
+ [0L, 'string', '=', 'Only in text/x-patch', ''],
+ [0L, 'string', '=', 'Common subdirectories: text/x-patch', ''],
+ [0L, 'string', '=', '!<arch>\012________64E', 'application/data'],
+ [0L, 'leshort', '=', 387L, 'application/x-executable-file'],
+ [0L, 'leshort', '=', 392L, 'application/x-executable-file'],
+ [0L, 'leshort', '=', 399L, 'application/x-object-file'],
+ [0L, 'string', '=', '\377\377\177', 'application/data'],
+ [0L, 'string', '=', '\377\377|', 'application/data'],
+ [0L, 'string', '=', '\377\377~', 'application/data'],
+ [0L, 'string', '=', '\033c\033', 'application/data'],
+ [0L, 'long', '=', 4553207L, 'image/x11'],
+ [0L, 'string', '=', '!<PDF>!\012', 'application/x-prof'],
+ [0L, 'short', '=', 1281L, 'application/x-locale'],
+ [24L, 'belong', '=', 60012L, 'application/x-dump'],
+ [24L, 'belong', '=', 60011L, 'application/x-dump'],
+ [24L, 'lelong', '=', 60012L, 'application/x-dump'],
+ [24L, 'lelong', '=', 60011L, 'application/x-dump'],
+ [0L, 'string', '=', '\177ELF', 'application/x-executable-file'],
+ [0L, 'short', '=', 340L, 'application/data'],
+ [0L, 'short', '=', 341L, 'application/x-executable-file'],
+ [1080L, 'leshort', '=', 61267L, 'application/x-linux-ext2fs'],
+ [0L, 'string', '=', '\366\366\366\366', 'application/x-pc-floppy'],
+ [774L, 'beshort', '=', 55998L, 'application/data'],
+ [510L, 'leshort', '=', 43605L, 'application/data'],
+ [1040L, 'leshort', '=', 4991L, 'application/x-filesystem'],
+ [1040L, 'leshort', '=', 5007L, 'application/x-filesystem'],
+ [1040L, 'leshort', '=', 9320L, 'application/x-filesystem'],
+ [1040L, 'leshort', '=', 9336L, 'application/x-filesystem'],
+ [0L, 'string', '=', '-rom1fs-\000', 'application/x-filesystem'],
+ [395L, 'string', '=', 'OS/2', 'application/x-bootable'],
+ [0L, 'string', '=', 'FONT', 'font/x-vfont'],
+ [0L, 'short', '=', 436L, 'font/x-vfont'],
+ [0L, 'short', '=', 17001L, 'font/x-vfont'],
+ [0L, 'string', '=', '%!PS-AdobeFont-1.0', 'font/type1'],
+ [6L, 'string', '=', '%!PS-AdobeFont-1.0', 'font/type1'],
+ [0L, 'belong', '=', 4L, 'font/x-snf'],
+ [0L, 'lelong', '=', 4L, 'font/x-snf'],
+ [0L, 'string', '=', 'STARTFONT font/x-bdf', ''],
+ [0L, 'string', '=', '\001fcp', 'font/x-pcf'],
+ [0L, 'string', '=', 'D1.0\015', 'font/x-speedo'],
+ [0L, 'string', '=', 'flf', 'font/x-figlet'],
+ [0L, 'string', '=', 'flc', 'application/x-font'],
+ [0L, 'belong', '=', 335698201L, 'font/x-libgrx'],
+ [0L, 'belong', '=', 4282797902L, 'font/x-dos'],
+ [7L, 'belong', '=', 4540225L, 'font/x-dos'],
+ [7L, 'belong', '=', 5654852L, 'font/x-dos'],
+ [4098L, 'string', '=', 'DOSFONT', 'font/x-dos'],
+ [0L, 'string', '=', '<MakerFile', 'application/x-framemaker'],
+ [0L, 'string', '=', '<MIFFile', 'application/x-framemaker'],
+ [0L, 'string', '=', '<MakerDictionary', 'application/x-framemaker'],
+ [0L, 'string', '=', '<MakerScreenFont', 'font/x-framemaker'],
+ [0L, 'string', '=', '<MML', 'application/x-framemaker'],
+ [0L, 'string', '=', '<BookFile', 'application/x-framemaker'],
+ [0L, 'string', '=', '<Maker', 'application/x-framemaker'],
+ [0L, 'lelong&0377777777', '=', 41400407L,
+ 'application/x-executable-file'],
+ [0L, 'lelong&0377777777', '=', 41400410L,
+ 'application/x-executable-file'],
+ [0L, 'lelong&0377777777', '=', 41400413L,
+ 'application/x-executable-file'],
+ [0L, 'lelong&0377777777', '=', 41400314L,
+ 'application/x-executable-file'],
+ [7L, 'string', '=',
+ '\357\020\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000',
+ 'application/core'],
+ [0L, 'lelong', '=', 11421044151L, 'application/data'],
+ [0L, 'string', '=', 'GIMP Gradient', 'application/x-gimp-gradient'],
+ [0L, 'string', '=', 'gimp xcf', 'application/x-gimp-image'],
+ [20L, 'string', '=', 'GPAT', 'application/x-gimp-pattern'],
+ [20L, 'string', '=', 'GIMP', 'application/x-gimp-brush'],
+ [0L, 'string', '=', '\336\022\004\225', 'application/x-locale'],
+ [0L, 'string', '=', '\225\004\022\336', 'application/x-locale'],
+ [0L, 'beshort', '=', 627L, 'application/x-executable-file'],
+ [0L, 'beshort', '=', 624L, 'application/x-executable-file'],
+ [0L, 'string', '=', '\000\001\000\000\000', 'font/ttf'],
+ [0L, 'long', '=', 1203604016L, 'application/data'],
+ [0L, 'long', '=', 1702407010L, 'application/data'],
+ [0L, 'long', '=', 1003405017L, 'application/data'],
+ [0L, 'long', '=', 1602007412L, 'application/data'],
+ [0L, 'belong', '=', 34603270L, 'application/x-object-file'],
+ [0L, 'belong', '=', 34603271L, 'application/x-executable-file'],
+ [0L, 'belong', '=', 34603272L, 'application/x-executable-file'],
+ [0L, 'belong', '=', 34603275L, 'application/x-executable-file'],
+ [0L, 'belong', '=', 34603278L, 'application/x-library-file'],
+ [0L, 'belong', '=', 34603277L, 'application/x-library-file'],
+ [0L, 'belong', '=', 34865414L, 'application/x-object-file'],
+ [0L, 'belong', '=', 34865415L, 'application/x-executable-file'],
+ [0L, 'belong', '=', 34865416L, 'application/x-executable-file'],
+ [0L, 'belong', '=', 34865419L, 'application/x-executable-file'],
+ [0L, 'belong', '=', 34865422L, 'application/x-library-file'],
+ [0L, 'belong', '=', 34865421L, 'application/x-object-file'],
+ [0L, 'belong', '=', 34275590L, 'application/x-object-file'],
+ [0L, 'belong', '=', 34275591L, 'application/x-executable-file'],
+ [0L, 'belong', '=', 34275592L, 'application/x-executable-file'],
+ [0L, 'belong', '=', 34275595L, 'application/x-executable-file'],
+ [0L, 'belong', '=', 34275598L, 'application/x-library-file'],
+ [0L, 'belong', '=', 34275597L, 'application/x-library-file'],
+ [0L, 'belong', '=', 557605234L, 'application/x-ar'],
+ [0L, 'long', '=', 34078982L, 'application/x-executable-file'],
+ [0L, 'long', '=', 34078983L, 'application/x-executable-file'],
+ [0L, 'long', '=', 34078984L, 'application/x-executable-file'],
+ [0L, 'belong', '=', 34341128L, 'application/x-executable-file'],
+ [0L, 'belong', '=', 34341127L, 'application/x-executable-file'],
+ [0L, 'belong', '=', 34341131L, 'application/x-executable-file'],
+ [0L, 'belong', '=', 34341126L, 'application/x-executable-file'],
+ [0L, 'belong', '=', 34210056L, 'application/x-executable-file'],
+ [0L, 'belong', '=', 34210055L, 'application/x-executable-file'],
+ [0L, 'belong', '=', 34341134L, 'application/x-library-file'],
+ [0L, 'belong', '=', 34341133L, 'application/x-library-file'],
+ [0L, 'long', '=', 65381L, 'application/x-library-file'],
+ [0L, 'long', '=', 34275173L, 'application/x-library-file'],
+ [0L, 'long', '=', 34406245L, 'application/x-library-file'],
+ [0L, 'long', '=', 34144101L, 'application/x-library-file'],
+ [0L, 'long', '=', 22552998L, 'application/core'],
+ [0L, 'long', '=', 1302851304L, 'font/x-hp-windows'],
+ [0L, 'string', '=', 'Bitmapfile', 'image/unknown'],
+ [0L, 'string', '=', 'IMGfile', 'CIS image/unknown'],
+ [0L, 'long', '=', 34341132L, 'application/x-lisp'],
+ [0L, 'string', '=', 'msgcat01', 'application/x-locale'],
+ [0L, 'string', '=', 'HPHP48-', 'HP48 binary'],
+ [0L, 'string', '=', '%%HP:', 'HP48 text'],
+ [0L, 'beshort', '=', 200L, 'hp200 (68010) BSD'],
+ [0L, 'beshort', '=', 300L, 'hp300 (68020+68881) BSD'],
+ [0L, 'beshort', '=', 537L, '370 XA sysV executable'],
+ [0L, 'beshort', '=', 532L, '370 XA sysV pure executable'],
+ [0L, 'beshort', '=', 54001L, '370 sysV pure executable'],
+ [0L, 'beshort', '=', 55001L, '370 XA sysV pure executable'],
+ [0L, 'beshort', '=', 56401L, '370 sysV executable'],
+ [0L, 'beshort', '=', 57401L, '370 XA sysV executable'],
+ [0L, 'beshort', '=', 531L, 'SVR2 executable (Amdahl-UTS)'],
+ [0L, 'beshort', '=', 534L, 'SVR2 pure executable (Amdahl-UTS)'],
+ [0L, 'beshort', '=', 530L, 'SVR2 pure executable (USS/370)'],
+ [0L, 'beshort', '=', 535L, 'SVR2 executable (USS/370)'],
+ [0L, 'beshort', '=', 479L, 'executable (RISC System/6000 V3.1) or obj module'],
+ [0L, 'beshort', '=', 260L, 'shared library'],
+ [0L, 'beshort', '=', 261L, 'ctab data'],
+ [0L, 'beshort', '=', 65028L, 'structured file'],
+ [0L, 'string', '=', '0xabcdef', 'AIX message catalog'],
+ [0L, 'belong', '=', 505L, 'AIX compiled message catalog'],
+ [0L, 'string', '=', '<aiaff>', 'archive'],
+ [0L, 'string', '=', 'FORM', 'IFF data'],
+ [0L, 'string', '=', 'P1', 'image/x-portable-bitmap'],
+ [0L, 'string', '=', 'P2', 'image/x-portable-graymap'],
+ [0L, 'string', '=', 'P3', 'image/x-portable-pixmap'],
+ [0L, 'string', '=', 'P4', 'image/x-portable-bitmap'],
+ [0L, 'string', '=', 'P5', 'image/x-portable-graymap'],
+ [0L, 'string', '=', 'P6', 'image/x-portable-pixmap'],
+ [0L, 'string', '=', 'IIN1', 'image/tiff'],
+ [0L, 'string', '=', 'MM\000*', 'image/tiff'],
+ [0L, 'string', '=', 'II*\000', 'image/tiff'],
+ [0L, 'string', '=', '\211PNG', 'image/png'],
+ [1L, 'string', '=', 'PNG', 'image/png'],
+ [0L, 'string', '=', 'GIF8', 'image/gif'],
+ [0L, 'string', '=', '\361\000@\273', 'image/x-cmu-raster'],
+ [0L, 'string', '=', 'id=ImageMagick', 'MIFF image data'],
+ [0L, 'long', '=', 1123028772L, 'Artisan image data'],
+ [0L, 'string', '=', '#FIG', 'FIG image text'],
+ [0L, 'string', '=', 'ARF_BEGARF', 'PHIGS clear text archive'],
+ [0L, 'string', '=', '@(#)SunPHIGS', 'SunPHIGS'],
+ [0L, 'string', '=', 'GKSM', 'GKS Metafile'],
+ [0L, 'string', '=', 'BEGMF', 'clear text Computer Graphics Metafile'],
+ [0L, 'beshort&0xffe0', '=', 32L, 'binary Computer Graphics Metafile'],
+ [0L, 'beshort', '=', 12320L, 'character Computer Graphics Metafile'],
+ [0L, 'string', '=', 'yz', 'MGR bitmap, modern format, 8-bit aligned'],
+ [0L, 'string', '=', 'zz','MGR bitmap, old format, 1-bit deep, 16-bit aligned'],
+ [0L, 'string', '=', 'xz','MGR bitmap, old format, 1-bit deep, 32-bit aligned'],
+ [0L, 'string', '=', 'yx', 'MGR bitmap, modern format, squeezed'],
+ [0L, 'string', '=', '%bitmap\000', 'FBM image data'],
+ [1L, 'string', '=', 'PC Research, Inc', 'group 3 fax data'],
+ [0L, 'string', '=', 'hplip_g3', 'application/hplip-fax'],
+ [0L, 'beshort', '=', 65496L, 'image/jpeg'],
+ [0L, 'string', '=', 'hsi1', 'image/x-jpeg-proprietary'],
+ [0L, 'string', '=', 'BM', 'image/x-bmp'],
+ [0L, 'string', '=', 'IC', 'image/x-ico'],
+ [0L, 'string', '=', 'PI', 'PC pointer image data'],
+ [0L, 'string', '=', 'CI', 'PC color icon data'],
+ [0L, 'string', '=', 'CP', 'PC color pointer image data'],
+ [0L, 'string', '=', '/* XPM */', 'image/x-xpixmap'],
+ [0L, 'leshort', '=', 52306L, 'RLE image data,'],
+ [0L, 'string', '=', 'Imagefile version-', 'iff image data'],
+ [0L, 'belong', '=', 1504078485L, 'image/x-sun-raster'],
+ [0L, 'beshort', '=', 474L, 'x/x-image-sgi'],
+ [0L, 'string', '=', 'IT01', 'FIT image data'],
+ [0L, 'string', '=', 'IT02', 'FIT image data'],
+ [2048L, 'string', '=', 'PCD_IPI', 'x/x-photo-cd-pack-file'],
+ [0L, 'string', '=', 'PCD_OPA', 'x/x-photo-cd-overfiew-file'],
+ [0L, 'string', '=', 'SIMPLE =', 'FITS image data'],
+ [0L, 'string', '=', 'This is a BitMap file', 'Lisp Machine bit-array-file'],
+ [0L, 'string', '=', '!!', 'Bennet Yee\'s "face" format'],
+ [0L, 'beshort', '=', 4112L, 'PEX Binary Archive'],
+ [3000L, 'string', '=', 'Visio (TM) Drawing', '%s'],
+ [0L, 'leshort', '=', 502L, 'basic-16 executable'],
+ [0L, 'leshort', '=', 503L, 'basic-16 executable (TV)'],
+ [0L, 'leshort', '=', 510L, 'application/x-executable-file'],
+ [0L, 'leshort', '=', 511L, 'application/x-executable-file'],
+ [0L, 'leshort', '=', 512L, 'application/x-executable-file'],
+ [0L, 'leshort', '=', 522L, 'application/x-executable-file'],
+ [0L, 'leshort', '=', 514L, 'application/x-executable-file'],
+ [0L, 'string', '=', '\210OPS', 'Interleaf saved data'],
+ [0L, 'string', '=', '<!OPS', 'Interleaf document text'],
+ [4L, 'string', '=', 'pgscriptver', 'IslandWrite document'],
+ [13L, 'string', '=', 'DrawFile', 'IslandDraw document'],
+ [0L, 'leshort&0xFFFC', '=', 38400L, 'little endian ispell'],
+ [0L, 'beshort&0xFFFC', '=', 38400L, 'big endian ispell'],
+ [0L, 'belong', '=', 3405691582L, 'compiled Java class data,'],
+ [0L, 'beshort', '=', 44269L, 'Java serialization data'],
+ [0L, 'string', '=', 'KarmaRHD', 'Version Karma Data Structure Version'],
+ [0L, 'string', '=', 'lect', 'DEC SRC Virtual Paper Lectern file'],
+ [53L, 'string', '=', 'yyprevious', 'C program text (from lex)'],
+ [21L, 'string', '=', 'generated by flex', 'C program text (from flex)'],
+ [0L, 'string', '=', '%{', 'lex description text'],
+ [0L, 'short', '=', 32768L, 'lif file'],
+ [0L, 'lelong', '=', 6553863L, 'Linux/i386 impure executable (OMAGIC)'],
+ [0L, 'lelong', '=', 6553864L, 'Linux/i386 pure executable (NMAGIC)'],
+ [0L, 'lelong', '=', 6553867L, 'Linux/i386 demand-paged executable (ZMAGIC)'],
+ [0L, 'lelong', '=', 6553804L, 'Linux/i386 demand-paged executable (QMAGIC)'],
+ [0L, 'string', '=', '\007\001\000', 'Linux/i386 object file'],
+ [0L, 'string', '=', '\001\003\020\004', 'Linux-8086 impure executable'],
+ [0L, 'string', '=', '\001\003 \004', 'Linux-8086 executable'],
+ [0L, 'string', '=', '\243\206\001\000', 'Linux-8086 object file'],
+ [0L, 'string', '=', '\001\003\020\020', 'Minix-386 impure executable'],
+ [0L, 'string', '=', '\001\003 \020', 'Minix-386 executable'],
+ [0L, 'string', '=', '*nazgul*', 'Linux compiled message catalog'],
+ [216L, 'lelong', '=', 421L, 'Linux/i386 core file'],
+ [2L, 'string', '=', 'LILO', 'Linux/i386 LILO boot/chain loader'],
+ [0L, 'string', '=', '0.9', ''],
+ [0L, 'leshort', '=', 1078L, 'font/linux-psf'],
+ [4086L, 'string', '=', 'SWAP-SPACE', 'Linux/i386 swap file'],
+ [0L, 'leshort', '=', 387L, 'ECOFF alpha'],
+ [514L, 'string', '=', 'HdrS', 'Linux kernel'],
+ [0L, 'belong', '=', 3099592590L, 'Linux kernel'],
+ [0L, 'string', '=', 'Begin3', 'Linux Software Map entry text'],
+ [0L, 'string', '=', ';;', 'Lisp/Scheme program text'],
+ [0L, 'string', '=', '\012(', 'byte-compiled Emacs-Lisp program data'],
+ [0L, 'string', '=', ';ELC\023\000\000\000', 'byte-compiled Emacs-Lisp program data'],
+ [0L, 'string', '=', "(SYSTEM::VERSION '", 'CLISP byte-compiled Lisp program text'],
+ [0L, 'long', '=', 1886817234L, 'CLISP memory image data'],
+ [0L, 'long', '=', 3532355184L, 'CLISP memory image data, other endian'],
+ [0L, 'long', '=', 3725722773L, 'GNU-format message catalog data'],
+ [0L, 'long', '=', 2500072158L, 'GNU-format message catalog data'],
+ [0L, 'belong', '=', 3405691582L, 'mach-o fat file'],
+ [0L, 'belong', '=', 4277009102L, 'mach-o'],
+ [11L, 'string', '=', 'must be converted with BinHex', 'BinHex binary text'],
+ [0L, 'string', '=', 'SIT!', 'StuffIt Archive (data)'],
+ [65L, 'string', '=', 'SIT!', 'StuffIt Archive (rsrc + data)'],
+ [0L, 'string', '=', 'SITD', 'StuffIt Deluxe (data)'],
+ [65L, 'string', '=', 'SITD', 'StuffIt Deluxe (rsrc + data)'],
+ [0L, 'string', '=', 'Seg', 'StuffIt Deluxe Segment (data)'],
+ [65L, 'string', '=', 'Seg', 'StuffIt Deluxe Segment (rsrc + data)'],
+ [0L, 'string', '=', 'APPL', 'Macintosh Application (data)'],
+ [65L, 'string', '=', 'APPL', 'Macintosh Application (rsrc + data)'],
+ [0L, 'string', '=', 'zsys', 'Macintosh System File (data)'],
+ [65L, 'string', '=', 'zsys', 'Macintosh System File(rsrc + data)'],
+ [0L, 'string', '=', 'FNDR', 'Macintosh Finder (data)'],
+ [65L, 'string', '=', 'FNDR', 'Macintosh Finder(rsrc + data)'],
+ [0L, 'string', '=', 'libr', 'Macintosh Library (data)'],
+ [65L, 'string', '=', 'libr', 'Macintosh Library(rsrc + data)'],
+ [0L, 'string', '=', 'shlb', 'Macintosh Shared Library (data)'],
+ [65L, 'string', '=', 'shlb', 'Macintosh Shared Library(rsrc + data)'],
+ [0L, 'string', '=', 'cdev', 'Macintosh Control Panel (data)'],
+ [65L, 'string', '=', 'cdev', 'Macintosh Control Panel(rsrc + data)'],
+ [0L, 'string', '=', 'INIT', 'Macintosh Extension (data)'],
+ [65L, 'string', '=', 'INIT', 'Macintosh Extension(rsrc + data)'],
+ [0L, 'string', '=', 'FFIL', 'font/ttf'],
+ [65L, 'string', '=', 'FFIL', 'font/ttf'],
+ [0L, 'string', '=', 'LWFN', 'font/type1'],
+ [65L, 'string', '=', 'LWFN', 'font/type1'],
+ [0L, 'string', '=', 'PACT', 'Macintosh Compact Pro Archive (data)'],
+ [65L, 'string', '=', 'PACT', 'Macintosh Compact Pro Archive(rsrc + data)'],
+ [0L, 'string', '=', 'ttro', 'Macintosh TeachText File (data)'],
+ [65L, 'string', '=', 'ttro', 'Macintosh TeachText File(rsrc + data)'],
+ [0L, 'string', '=', 'TEXT', 'Macintosh TeachText File (data)'],
+ [65L, 'string', '=', 'TEXT', 'Macintosh TeachText File(rsrc + data)'],
+ [0L, 'string', '=', 'PDF', 'Macintosh PDF File (data)'],
+ [65L, 'string', '=', 'PDF', 'Macintosh PDF File(rsrc + data)'],
+ [0L, 'string', '=', '# Magic', 'magic text file for file(1) cmd'],
+ [0L, 'string', '=', 'Relay-Version:', 'old news text'],
+ [0L, 'string', '=', '#! rnews', 'batched news text'],
+ [0L, 'string', '=', 'N#! rnews', 'mailed, batched news text'],
+ [0L, 'string', '=', 'Forward to', 'mail forwarding text'],
+ [0L, 'string', '=', 'Pipe to', 'mail piping text'],
+ [0L, 'string', '=', 'Return-Path:', 'message/rfc822'],
+ [0L, 'string', '=', 'Path:', 'message/news'],
+ [0L, 'string', '=', 'Xref:', 'message/news'],
+ [0L, 'string', '=', 'From:', 'message/rfc822'],
+ [0L, 'string', '=', 'Article', 'message/news'],
+ [0L, 'string', '=', 'BABYL', 'message/x-gnu-rmail'],
+ [0L, 'string', '=', 'Received:', 'message/rfc822'],
+ [0L, 'string', '=', 'MIME-Version:', 'MIME entity text'],
+ [0L, 'string', '=', 'Content-Type: ', ''],
+ [0L, 'string', '=', 'Content-Type:', ''],
+ [0L, 'long', '=', 31415L, 'Mirage Assembler m.out executable'],
+ [0L, 'string', '=', '\311\304', 'ID tags data'],
+ [0L, 'string', '=', '\001\001\001\001', 'MMDF mailbox'],
+ [4L, 'string', '=', 'Research,', 'Digifax-G3-File'],
+ [0L, 'short', '=', 256L, 'raw G3 data, byte-padded'],
+ [0L, 'short', '=', 5120L, 'raw G3 data'],
+ [0L, 'string', '=', 'RMD1', 'raw modem data'],
+ [0L, 'string', '=', 'PVF1\012', 'portable voice format'],
+ [0L, 'string', '=', 'PVF2\012', 'portable voice format'],
+ [0L, 'beshort', '=', 520L, 'mc68k COFF'],
+ [0L, 'beshort', '=', 521L, 'mc68k executable (shared)'],
+ [0L, 'beshort', '=', 522L, 'mc68k executable (shared demand paged)'],
+ [0L, 'beshort', '=', 554L, '68K BCS executable'],
+ [0L, 'beshort', '=', 555L, '88K BCS executable'],
+ [0L, 'string', '=', 'S0', 'Motorola S-Record; binary data in text format'],
+ [0L, 'string', '=', '@echo off', 'MS-DOS batch file text'],
+ [128L, 'string', '=', 'PE\000\000', 'MS Windows PE'],
+ [0L, 'leshort', '=', 332L, 'MS Windows COFF Intel 80386 object file'],
+ [0L, 'leshort', '=', 358L, 'MS Windows COFF MIPS R4000 object file'],
+ [0L, 'leshort', '=', 388L, 'MS Windows COFF Alpha object file'],
+ [0L, 'leshort', '=', 616L, 'MS Windows COFF Motorola 68000 object file'],
+ [0L, 'leshort', '=', 496L, 'MS Windows COFF PowerPC object file'],
+ [0L, 'leshort', '=', 656L, 'MS Windows COFF PA-RISC object file'],
+ [0L, 'string', '=', 'MZ', 'application/x-ms-dos-executable'],
+ [0L, 'string', '=', 'LZ', 'MS-DOS executable (built-in)'],
+ [0L, 'string', '=', 'regf', 'Windows NT Registry file'],
+ [2080L, 'string', '=', 'Microsoft Word 6.0 Document', 'text/vnd.ms-word'],
+ [2080L, 'string', '=', 'Documento Microsoft Word 6', 'text/vnd.ms-word'],
+ [2112L, 'string', '=', 'MSWordDoc', 'text/vnd.ms-word'],
+ [0L, 'belong', '=', 834535424L, 'text/vnd.ms-word'],
+ [0L, 'string', '=', 'PO^Q`', 'text/vnd.ms-word'],
+ [2080L, 'string', '=', 'Microsoft Excel 5.0 Worksheet', 'application/vnd.ms-excel'],
+ [2114L, 'string', '=', 'Biff5', 'application/vnd.ms-excel'],
+ [0L, 'belong', '=', 6656L, 'Lotus 1-2-3'],
+ [0L, 'belong', '=', 512L, 'Lotus 1-2-3'],
+ [1L, 'string', '=', 'WPC', 'text/vnd.wordperfect'],
+ [0L, 'beshort', '=', 610L, 'Tower/XP rel 2 object'],
+ [0L, 'beshort', '=', 615L, 'Tower/XP rel 2 object'],
+ [0L, 'beshort', '=', 620L, 'Tower/XP rel 3 object'],
+ [0L, 'beshort', '=', 625L, 'Tower/XP rel 3 object'],
+ [0L, 'beshort', '=', 630L, 'Tower32/600/400 68020 object'],
+ [0L, 'beshort', '=', 640L, 'Tower32/800 68020'],
+ [0L, 'beshort', '=', 645L, 'Tower32/800 68010'],
+ [0L, 'lelong', '=', 407L, 'NetBSD little-endian object file'],
+ [0L, 'belong', '=', 407L, 'NetBSD big-endian object file'],
+ [0L, 'belong&0377777777', '=', 41400413L, 'NetBSD/i386 demand paged'],
+ [0L, 'belong&0377777777', '=', 41400410L, 'NetBSD/i386 pure'],
+ [0L, 'belong&0377777777', '=', 41400407L, 'NetBSD/i386'],
+ [0L, 'belong&0377777777', '=', 41400507L, 'NetBSD/i386 core'],
+ [0L, 'belong&0377777777', '=', 41600413L, 'NetBSD/m68k demand paged'],
+ [0L, 'belong&0377777777', '=', 41600410L, 'NetBSD/m68k pure'],
+ [0L, 'belong&0377777777', '=', 41600407L, 'NetBSD/m68k'],
+ [0L, 'belong&0377777777', '=', 41600507L, 'NetBSD/m68k core'],
+ [0L, 'belong&0377777777', '=', 42000413L, 'NetBSD/m68k4k demand paged'],
+ [0L, 'belong&0377777777', '=', 42000410L, 'NetBSD/m68k4k pure'],
+ [0L, 'belong&0377777777', '=', 42000407L, 'NetBSD/m68k4k'],
+ [0L, 'belong&0377777777', '=', 42000507L, 'NetBSD/m68k4k core'],
+ [0L, 'belong&0377777777', '=', 42200413L, 'NetBSD/ns32532 demand paged'],
+ [0L, 'belong&0377777777', '=', 42200410L, 'NetBSD/ns32532 pure'],
+ [0L, 'belong&0377777777', '=', 42200407L, 'NetBSD/ns32532'],
+ [0L, 'belong&0377777777', '=', 42200507L, 'NetBSD/ns32532 core'],
+ [0L, 'belong&0377777777', '=', 42400413L, 'NetBSD/sparc demand paged'],
+ [0L, 'belong&0377777777', '=', 42400410L, 'NetBSD/sparc pure'],
+ [0L, 'belong&0377777777', '=', 42400407L, 'NetBSD/sparc'],
+ [0L, 'belong&0377777777', '=', 42400507L, 'NetBSD/sparc core'],
+ [0L, 'belong&0377777777', '=', 42600413L, 'NetBSD/pmax demand paged'],
+ [0L, 'belong&0377777777', '=', 42600410L, 'NetBSD/pmax pure'],
+ [0L, 'belong&0377777777', '=', 42600407L, 'NetBSD/pmax'],
+ [0L, 'belong&0377777777', '=', 42600507L, 'NetBSD/pmax core'],
+ [0L, 'belong&0377777777', '=', 43000413L, 'NetBSD/vax demand paged'],
+ [0L, 'belong&0377777777', '=', 43000410L, 'NetBSD/vax pure'],
+ [0L, 'belong&0377777777', '=', 43000407L, 'NetBSD/vax'],
+ [0L, 'belong&0377777777', '=', 43000507L, 'NetBSD/vax core'],
+ [0L, 'lelong', '=', 459141L, 'ECOFF NetBSD/alpha binary'],
+ [0L, 'belong&0377777777', '=', 43200507L, 'NetBSD/alpha core'],
+ [0L, 'belong&0377777777', '=', 43400413L, 'NetBSD/mips demand paged'],
+ [0L, 'belong&0377777777', '=', 43400410L, 'NetBSD/mips pure'],
+ [0L, 'belong&0377777777', '=', 43400407L, 'NetBSD/mips'],
+ [0L, 'belong&0377777777', '=', 43400507L, 'NetBSD/mips core'],
+ [0L, 'belong&0377777777', '=', 43600413L, 'NetBSD/arm32 demand paged'],
+ [0L, 'belong&0377777777', '=', 43600410L, 'NetBSD/arm32 pure'],
+ [0L, 'belong&0377777777', '=', 43600407L, 'NetBSD/arm32'],
+ [0L, 'belong&0377777777', '=', 43600507L, 'NetBSD/arm32 core'],
+ [0L, 'string', '=', 'StartFontMetrics', 'font/x-sunos-news'],
+ [0L, 'string', '=', 'StartFont', 'font/x-sunos-news'],
+ [0L, 'belong', '=', 326773060L, 'font/x-sunos-news'],
+ [0L, 'belong', '=', 326773063L, 'font/x-sunos-news'],
+ [0L, 'belong', '=', 326773072L, 'font/x-sunos-news'],
+ [0L, 'belong', '=', 326773073L, 'font/x-sunos-news'],
+ [8L, 'belong', '=', 326773573L, 'font/x-sunos-news'],
+ [8L, 'belong', '=', 326773576L, 'font/x-sunos-news'],
+ [0L, 'string', '=', 'Octave-1-L', 'Octave binary data (little endian)'],
+ [0L, 'string', '=', 'Octave-1-B', 'Octave binary data (big endian)'],
+ [0L, 'string', '=', '\177OLF', 'OLF'],
+ [0L, 'beshort', '=', 34765L, 'OS9/6809 module:'],
+ [0L, 'beshort', '=', 19196L, 'OS9/68K module:'],
+ [0L, 'long', '=', 61374L, 'OSF/Rose object'],
+ [0L, 'short', '=', 565L, 'i386 COFF object'],
+ [0L, 'short', '=', 10775L, '"compact bitmap" format (Poskanzer)'],
+ [0L, 'string', '=', '%PDF-', 'application/pdf'],
+ [0L, 'lelong', '=', 101555L, 'PDP-11 single precision APL workspace'],
+ [0L, 'lelong', '=', 101554L, 'PDP-11 double precision APL workspace'],
+ [0L, 'leshort', '=', 407L, 'PDP-11 executable'],
+ [0L, 'leshort', '=', 401L, 'PDP-11 UNIX/RT ldp'],
+ [0L, 'leshort', '=', 405L, 'PDP-11 old overlay'],
+ [0L, 'leshort', '=', 410L, 'PDP-11 pure executable'],
+ [0L, 'leshort', '=', 411L, 'PDP-11 separate I&D executable'],
+ [0L, 'leshort', '=', 437L, 'PDP-11 kernel overlay'],
+ [0L, 'beshort', '=', 39168L, 'PGP key public ring'],
+ [0L, 'beshort', '=', 38145L, 'PGP key security ring'],
+ [0L, 'beshort', '=', 38144L, 'PGP key security ring'],
+ [0L, 'beshort', '=', 42496L, 'PGP encrypted data'],
+ [0L, 'string', '=', '-----BEGIN PGP', 'PGP armored data'],
+ [0L, 'string', '=', '# PaCkAgE DaTaStReAm', 'pkg Datastream (SVR4)'],
+ [0L, 'short', '=', 601L, 'mumps avl global'],
+ [0L, 'short', '=', 602L, 'mumps blt global'],
+ [0L, 'string', '=', '%!', 'application/postscript'],
+ [0L, 'string', '=', '\004%!', 'application/postscript'],
+ [0L, 'belong', '=', 3318797254L, 'DOS EPS Binary File'],
+ [0L, 'string', '=', '*PPD-Adobe:', 'application/pdf'],
+ [0L, 'string', '=', '\033%-12345X@PJL', 'HP Printer Job Language data'],
+ [0L, 'string', '=', '\033%-12345X@PJL', 'HP Printer Job Language data'],
+ [0L, 'string', '=', '\033E\033', 'image/x-pcl-hp'],
+ [0L, 'string', '=', '@document(', 'Imagen printer'],
+ [0L, 'string', '=', 'Rast', 'RST-format raster font data'],
+ [0L, 'belong&0xff00ffff', '=', 1442840576L, 'ps database'],
+ [0L, 'long', '=', 1351614727L, 'Pyramid 90x family executable'],
+ [0L, 'long', '=', 1351614728L, 'Pyramid 90x family pure executable'],
+ [0L, 'long', '=', 1351614731L, 'Pyramid 90x family demand paged pure executable'],
+ [0L, 'beshort', '=', 60843L, ''],
+ [0L, 'string', '=', '{\\\\rtf', 'Rich Text Format data,'],
+ [38L, 'string', '=', 'Spreadsheet', 'sc spreadsheet file'],
+ [8L, 'string', '=', '\001s SCCS', 'archive data'],
+ [0L, 'byte', '=', 46L, 'Sendmail frozen configuration'],
+ [0L, 'short', '=', 10012L, 'Sendmail frozen configuration'],
+ [0L, 'lelong', '=', 234L, 'BALANCE NS32000 .o'],
+ [0L, 'lelong', '=', 4330L, 'BALANCE NS32000 executable (0 @ 0)'],
+ [0L, 'lelong', '=', 8426L, 'BALANCE NS32000 executable (invalid @ 0)'],
+ [0L, 'lelong', '=', 12522L, 'BALANCE NS32000 standalone executable'],
+ [0L, 'leshort', '=', 4843L, 'SYMMETRY i386 .o'],
+ [0L, 'leshort', '=', 8939L, 'SYMMETRY i386 executable (0 @ 0)'],
+ [0L, 'leshort', '=', 13035L, 'SYMMETRY i386 executable (invalid @ 0)'],
+ [0L, 'leshort', '=', 17131L, 'SYMMETRY i386 standalone executable'],
+ [0L, 'string', '=', 'kbd!map', 'kbd map file'],
+ [0L, 'belong', '=', 407L, 'old SGI 68020 executable'],
+ [0L, 'belong', '=', 410L, 'old SGI 68020 pure executable'],
+ [0L, 'beshort', '=', 34661L, 'disk quotas file'],
+ [0L, 'beshort', '=', 1286L, 'IRIS Showcase file'],
+ [0L, 'beshort', '=', 550L, 'IRIS Showcase template'],
+ [0L, 'belong', '=', 1396917837L, 'IRIS Showcase file'],
+ [0L, 'belong', '=', 1413695053L, 'IRIS Showcase template'],
+ [0L, 'belong', '=', 3735927486L, 'IRIX Parallel Arena'],
+ [0L, 'beshort', '=', 352L, 'MIPSEB COFF executable'],
+ [0L, 'beshort', '=', 354L, 'MIPSEL COFF executable'],
+ [0L, 'beshort', '=', 24577L, 'MIPSEB-LE COFF executable'],
+ [0L, 'beshort', '=', 25089L, 'MIPSEL-LE COFF executable'],
+ [0L, 'beshort', '=', 355L, 'MIPSEB MIPS-II COFF executable'],
+ [0L, 'beshort', '=', 358L, 'MIPSEL MIPS-II COFF executable'],
+ [0L, 'beshort', '=', 25345L, 'MIPSEB-LE MIPS-II COFF executable'],
+ [0L, 'beshort', '=', 26113L, 'MIPSEL-LE MIPS-II COFF executable'],
+ [0L, 'beshort', '=', 320L, 'MIPSEB MIPS-III COFF executable'],
+ [0L, 'beshort', '=', 322L, 'MIPSEL MIPS-III COFF executable'],
+ [0L, 'beshort', '=', 16385L, 'MIPSEB-LE MIPS-III COFF executable'],
+ [0L, 'beshort', '=', 16897L, 'MIPSEL-LE MIPS-III COFF executable'],
+ [0L, 'beshort', '=', 384L, 'MIPSEB Ucode'],
+ [0L, 'beshort', '=', 386L, 'MIPSEL Ucode'],
+ [0L, 'belong', '=', 3735924144L, 'IRIX core dump'],
+ [0L, 'belong', '=', 3735924032L, 'IRIX 64-bit core dump'],
+ [0L, 'belong', '=', 3133063355L, 'IRIX N32 core dump'],
+ [0L, 'string', '=', 'CrshDump', 'IRIX vmcore dump of'],
+ [0L, 'string', '=', 'SGIAUDIT', 'SGI Audit file'],
+ [0L, 'string', '=', 'WNGZWZSC', 'Wingz compiled script'],
+ [0L, 'string', '=', 'WNGZWZSS', 'Wingz spreadsheet'],
+ [0L, 'string', '=', 'WNGZWZHP', 'Wingz help file'],
+ [0L, 'string', '=', '\\#Inventor', 'V IRIS Inventor 1.0 file'],
+ [0L, 'string', '=', '\\#Inventor', 'V2 Open Inventor 2.0 file'],
+ [0L, 'string', '=', 'glfHeadMagic();', 'GLF_TEXT'],
+ [4L, 'belong', '=', 1090584576L, 'GLF_BINARY_LSB_FIRST'],
+ [4L, 'belong', '=', 321L, 'GLF_BINARY_MSB_FIRST'],
+ [0L, 'string', '=', '<!DOCTYPE HTML', 'text/html'],
+ [0L, 'string', '=', '<!doctype html', 'text/html'],
+ [0L, 'string', '=', '<HEAD', 'text/html'],
+ [0L, 'string', '=', '<head', 'text/html'],
+ [0L, 'string', '=', '<TITLE', 'text/html'],
+ [0L, 'string', '=', '<title', 'text/html'],
+ [0L, 'string', '=', '<html', 'text/html'],
+ [0L, 'string', '=', '<HTML', 'text/html'],
+ [0L, 'string', '=', '<!DOCTYPE', 'exported SGML document text'],
+ [0L, 'string', '=', '<!doctype', 'exported SGML document text'],
+ [0L, 'string', '=', '<!SUBDOC', 'exported SGML subdocument text'],
+ [0L, 'string', '=', '<!subdoc', 'exported SGML subdocument text'],
+ [0L, 'string', '=', '<!--', 'exported SGML document text'],
+ [0L, 'string', '=', 'RTSS', 'NetMon capture file'],
+ [0L, 'string', '=', 'TRSNIFF data \032', 'Sniffer capture file'],
+ [0L, 'string', '=', 'XCP\000', 'NetXRay capture file'],
+ [0L, 'ubelong', '=', 2712847316L, 'tcpdump capture file (big-endian)'],
+ [0L, 'ulelong', '=', 2712847316L, 'tcpdump capture file (little-endian)'],
+ [0L, 'string', '=', '<!SQ DTD>', 'Compiled SGML rules file'],
+ [0L, 'string', '=', '<!SQ A/E>', 'A/E SGML Document binary'],
+ [0L, 'string', '=', '<!SQ STS>', 'A/E SGML binary styles file'],
+ [0L, 'short', '=', 49374L, 'Compiled PSI (v1) data'],
+ [0L, 'short', '=', 49370L, 'Compiled PSI (v2) data'],
+ [0L, 'short', '=', 125252L, 'SoftQuad DESC or font file binary'],
+ [0L, 'string', '=', 'SQ BITMAP1', 'SoftQuad Raster Format text'],
+ [0L, 'string', '=', 'X SoftQuad', 'troff Context intermediate'],
+ [0L, 'belong&077777777', '=', 600413L, 'sparc demand paged'],
+ [0L, 'belong&077777777', '=', 600410L, 'sparc pure'],
+ [0L, 'belong&077777777', '=', 600407L, 'sparc'],
+ [0L, 'belong&077777777', '=', 400413L, 'mc68020 demand paged'],
+ [0L, 'belong&077777777', '=', 400410L, 'mc68020 pure'],
+ [0L, 'belong&077777777', '=', 400407L, 'mc68020'],
+ [0L, 'belong&077777777', '=', 200413L, 'mc68010 demand paged'],
+ [0L, 'belong&077777777', '=', 200410L, 'mc68010 pure'],
+ [0L, 'belong&077777777', '=', 200407L, 'mc68010'],
+ [0L, 'belong', '=', 407L, 'old sun-2 executable'],
+ [0L, 'belong', '=', 410L, 'old sun-2 pure executable'],
+ [0L, 'belong', '=', 413L, 'old sun-2 demand paged executable'],
+ [0L, 'belong', '=', 525398L, 'SunOS core file'],
+ [0L, 'long', '=', 4197695630L, 'SunPC 4.0 Hard Disk'],
+ [0L, 'string', '=', '#SUNPC_CONFIG', 'SunPC 4.0 Properties Values'],
+ [0L, 'string', '=', 'snoop', 'Snoop capture file'],
+ [36L, 'string', '=', 'acsp', 'Kodak Color Management System, ICC Profile'],
+ [0L, 'string', '=', '#!teapot\012xdr', 'teapot work sheet (XDR format)'],
+ [0L, 'string', '=', '\032\001', 'Compiled terminfo entry'],
+ [0L, 'short', '=', 433L, 'Curses screen image'],
+ [0L, 'short', '=', 434L, 'Curses screen image'],
+ [0L, 'string', '=', '\367\002', 'TeX DVI file'],
+ [0L, 'string', '=', '\367\203', 'font/x-tex'],
+ [0L, 'string', '=', '\367Y', 'font/x-tex'],
+ [0L, 'string', '=', '\367\312', 'font/x-tex'],
+ [0L, 'string', '=', 'This is TeX,', 'TeX transcript text'],
+ [0L, 'string', '=', 'This is METAFONT,', 'METAFONT transcript text'],
+ [2L, 'string', '=', '\000\021', 'font/x-tex-tfm'],
+ [2L, 'string', '=', '\000\022', 'font/x-tex-tfm'],
+ [0L, 'string', '=', '\\\\input\\', 'texinfo Texinfo source text'],
+ [0L, 'string', '=', 'This is Info file', 'GNU Info text'],
+ [0L, 'string', '=', '\\\\input', 'TeX document text'],
+ [0L, 'string', '=', '\\\\section', 'LaTeX document text'],
+ [0L, 'string', '=', '\\\\setlength', 'LaTeX document text'],
+ [0L, 'string', '=', '\\\\documentstyle', 'LaTeX document text'],
+ [0L, 'string', '=', '\\\\chapter', 'LaTeX document text'],
+ [0L, 'string', '=', '\\\\documentclass', 'LaTeX 2e document text'],
+ [0L, 'string', '=', '\\\\relax', 'LaTeX auxiliary file'],
+ [0L, 'string', '=', '\\\\contentsline', 'LaTeX table of contents'],
+ [0L, 'string', '=', '\\\\indexentry', 'LaTeX raw index file'],
+ [0L, 'string', '=', '\\\\begin{theindex}', 'LaTeX sorted index'],
+ [0L, 'string', '=', '\\\\glossaryentry', 'LaTeX raw glossary'],
+ [0L, 'string', '=', '\\\\begin{theglossary}', 'LaTeX sorted glossary'],
+ [0L, 'string', '=', 'This is makeindex', 'Makeindex log file'],
+ [0L, 'string', '=', '**TI82**', 'TI-82 Graphing Calculator'],
+ [0L, 'string', '=', '**TI83**', 'TI-83 Graphing Calculator'],
+ [0L, 'string', '=', '**TI85**', 'TI-85 Graphing Calculator'],
+ [0L, 'string', '=', '**TI92**', 'TI-92 Graphing Calculator'],
+ [0L, 'string', '=', '**TI80**', 'TI-80 Graphing Calculator File.'],
+ [0L, 'string', '=', '**TI81**', 'TI-81 Graphing Calculator File.'],
+ [0L, 'string', '=', 'TZif', 'timezone data'],
+ [0L, 'string', '=', '\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000', 'old timezone data'],
+ [0L, 'string', '=',
+ '\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000',
+ 'old timezone data'],
+ [0L, 'string', '=',
+ '\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000',
+ 'old timezone data'],
+ [0L, 'string', '=',
+ '\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000',
+ 'old timezone data'],
+ [0L, 'string', '=',
+ '\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\000',
+ 'old timezone data'],
+ [0L, 'string', '=',
+ '\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\000',
+ 'old timezone data'],
+ [0L, 'string', '=', '.\\\\"', 'troff or preprocessor input text'],
+ [0L, 'string', '=', '\'\\\\"', 'troff or preprocessor input text'],
+ [0L, 'string', '=', '\'.\\\\"', 'troff or preprocessor input text'],
+ [0L, 'string', '=', '\\\\"', 'troff or preprocessor input text'],
+ [0L, 'string', '=', 'x T', 'ditroff text'],
+ [0L, 'string', '=', '@\357', 'very old (C/A/T) troff output data'],
+ [0L, 'string', '=', 'Interpress/Xerox', 'Xerox InterPress data'],
+ [0L, 'short', '=', 263L, 'unknown machine executable'],
+ [0L, 'short', '=', 264L, 'unknown pure executable'],
+ [0L, 'short', '=', 265L, 'PDP-11 separate I&D'],
+ [0L, 'short', '=', 267L, 'unknown pure executable'],
+ [0L, 'long', '=', 268L, 'unknown demand paged pure executable'],
+ [0L, 'long', '=', 269L, 'unknown demand paged pure executable'],
+ [0L, 'long', '=', 270L, 'unknown readable demand paged pure executable'],
+ [0L, 'string', '=', 'begin uuencoded', 'or xxencoded text'],
+ [0L, 'string', '=', 'xbtoa Begin', "btoa'd text"],
+ [0L, 'string', '=', '$\012ship', "ship'd binary text"],
+ [0L, 'string', '=', 'Decode the following with bdeco', 'bencoded News text'],
+ [11L, 'string', '=', 'must be converted with BinHex', 'BinHex binary text'],
+ [0L, 'short', '=', 610L, 'Perkin-Elmer executable'],
+ [0L, 'beshort', '=', 572L, 'amd 29k coff noprebar executable'],
+ [0L, 'beshort', '=', 1572L, 'amd 29k coff prebar executable'],
+ [0L, 'beshort', '=', 160007L, 'amd 29k coff archive'],
+ [6L, 'beshort', '=', 407L, 'unicos (cray) executable'],
+ [596L, 'string', '=', 'X\337\377\377', 'Ultrix core file'],
+ [0L, 'string', '=', 'Joy!peffpwpc', 'header for PowerPC PEF executable'],
+ [0L, 'lelong', '=', 101557L, 'VAX single precision APL workspace'],
+ [0L, 'lelong', '=', 101556L, 'VAX double precision APL workspace'],
+ [0L, 'lelong', '=', 407L, 'VAX executable'],
+ [0L, 'lelong', '=', 410L, 'VAX pure executable'],
+ [0L, 'lelong', '=', 413L, 'VAX demand paged pure executable'],
+ [0L, 'leshort', '=', 570L, 'VAX COFF executable'],
+ [0L, 'leshort', '=', 575L, 'VAX COFF pure executable'],
+ [0L, 'string', '=', 'LBLSIZE=', 'VICAR image data'],
+ [43L, 'string', '=', 'SFDU_LABEL', 'VICAR label file'],
+ [0L, 'short', '=', 21845L, 'VISX image file'],
+ [0L, 'string', '=', '\260\0000\000', 'VMS VAX executable'],
+ [0L, 'belong', '=', 50331648L, 'VMS Alpha executable'],
+ [1L, 'string', '=', 'WPC', '(Corel/WP)'],
+ [0L, 'string', '=', 'core', 'core file (Xenix)'],
+ [0L, 'byte', '=', 128L, '8086 relocatable (Microsoft)'],
+ [0L, 'leshort', '=', 65381L, 'x.out'],
+ [0L, 'leshort', '=', 518L, 'Microsoft a.out'],
+ [0L, 'leshort', '=', 320L, 'old Microsoft 8086 x.out'],
+ [0L, 'lelong', '=', 518L, 'b.out'],
+ [0L, 'leshort', '=', 1408L, 'XENIX 8086 relocatable or 80286 small model'],
+ [0L, 'long', '=', 59399L, 'object file (z8000 a.out)'],
+ [0L, 'long', '=', 59400L, 'pure object file (z8000 a.out)'],
+ [0L, 'long', '=', 59401L, 'separate object file (z8000 a.out)'],
+ [0L, 'long', '=', 59397L, 'overlay object file (z8000 a.out)'],
+ [0L, 'string', '=', 'ZyXEL\002', 'ZyXEL voice data'],
+ ]
+
+magicNumbers = []
+hexdigits = '0123456789abcdefABCDEF'
+
+
+def strToNum(n):
+ if n[:1] == 'x':
+ n = '0' + n
+ if n[:2] == '0x':
+ # hex
+ return int(n, 16)
+
+ elif n[0] == '\\':
+ # octal
+ n = n[1:]
+ return int(n, 8)
+
+ else:
+ return int(n)
+
+
+def unescape(s):
+ # replace string escape sequences
+ while 1:
+ m = re.search(r'\\', s)
+
+ if not m:
+ break
+
+ x = m.start() + 1
+
+ if m.end() == len(s):
+ # escaped space at end
+ s = s[:len(s) - 1] + ' '
+
+ elif s[x:x + 2] == '0x':
+ # hex ascii value
+ c = chr(strToNum(s[x:x + 4]))
+ s = s[:x - 1] + c + s[x + 4:]
+
+ elif s[m.start() + 1] == 'x':
+ # hex ascii value
+ c = chr(strToNum(s[x:x + 3]))
+ s = s[:x - 1] + c + s[x + 3:]
+
+ elif 58 > ord(s[x]) > 47:
+ # octal ascii value
+ end = x
+
+ while ord(s[end]) > 47 and ord(s[end]) < 58:
+ end = end + 1
+ if end > len(s) - 1:
+ break
+ c = chr(strToNum(s[x - 1:end]))
+ s = s[:x - 1] + c + s[end:]
+
+ elif s[x] == 'n':
+ # newline
+ s = s[:x - 1] + '\n' + s[x + 1:]
+
+ else:
+ break
+
+ return s
+
+
+class magicTest:
+ def __init__(self, offset, t, op, value, msg, mask=None):
+ if t.count('&') > 0:
+ mask = strToNum(t[t.index('&') + 1:])
+ t = t[:t.index('&')]
+
+ if type(offset) == type('a'):
+ self.offset = strToNum(offset)
+ else:
+ self.offset = offset
+
+ self.type = t
+ self.msg = msg
+ self.subTests = []
+ self.op = op
+ self.mask = mask
+ self.value = value
+
+ def test(self, data):
+ if self.mask:
+ data = data & self.mask
+
+ if self.op == '=':
+ if self.value == data:
+ return self.msg
+
+ return None
+
+ def compare(self, data):
+ try:
+ if self.type == 'string':
+ (c, s) = ('', '')
+
+ for i in range(0, len(self.value) + 1):
+ if i + self.offset > len(data) - 1:
+ break
+ s = s + c
+ [c, ] = struct.unpack('c', data[self.offset + i])
+
+ data = s
+
+ elif self.type == 'short':
+ [data, ] = struct.unpack('h', data[self.offset:self.offset + 2])
+
+ elif self.type == 'leshort':
+ [data, ] = struct.unpack('<h', data[self.offset:self.offset + 2])
+
+ elif self.type == 'beshort':
+ [data, ] = struct.unpack('>H', data[self.offset:self.offset + 2])
+
+ elif self.type == 'long':
+ [data, ] = struct.unpack('l', data[self.offset:self.offset + 4])
+
+ elif self.type == 'lelong':
+ [data, ] = struct.unpack('<l', data[self.offset:self.offset + 4])
+
+ elif self.type == 'belong':
+ [data, ] = struct.unpack('>l', data[self.offset:self.offset + 4])
+
+ else:
+ pass
+
+ except:
+ return None
+
+ return self.test(data)
+
+
+def load(file):
+ global magicNumbers
+ lines = open(file).readlines()
+ last = {0: None}
+
+ for line in lines:
+ if re.match(r'\s*#', line):
+ # comment
+ continue
+
+ else:
+ # split up by space delimiters, and remove trailing space
+ line = line.rstrip()
+ line = re.split(r'\s*', line)
+
+ if len(line) < 3:
+ # bad line
+ continue
+
+ offset = line[0]
+ type = line[1]
+ value = line[2]
+ level = 0
+
+ while offset[0] == '>':
+ # count the level of the type
+ level = level + 1
+ offset = offset[1:]
+
+ l = magicNumbers
+
+ if level > 0:
+ l = last[level - 1].subTests
+
+ if offset[0] in ('(', '&'):
+ # don't handle indirect and relative offsets just yet
+ pass
+
+ else:
+ operands = ['=', '<', '>', '&']
+ if operands.count(value[0]) > 0:
+ # a comparison operator is specified
+ op = value[0]
+ value = value[1:]
+ else:
+ if len(value) > 1 and value[0] == '\\' and operands.count(value[1]) > 0:
+ # literal value that collides with operands is escaped
+ value = value[1:]
+
+ op = '='
+
+ mask = None
+
+ if type == 'string':
+ while 1:
+ value = unescape(value)
+ if value[len(value) - 1] == ' ' and len(line) > 3:
+ # last value was an escaped space, join
+ value = value + line[3]
+ del line[3]
+ else:
+ break
+ else:
+ if value.count('&') != 0:
+ mask = value[value.index('&') + 1:]
+ value = value[:value.index('&') + 1]
+
+ try:
+ value = strToNum(value)
+ except:
+ continue
+
+ msg = ('').join(list(line[3:]))
+
+ new = magicTest(offset, type, op, value, msg, mask)
+ last[level] = new
+ l.append(new)
+
+
+def load(file):
+ global magicNumbers
+ lines = open(file).readlines()
+ last = {0: None}
+ for line in lines:
+ if re.match(r'\s*#', line):
+ # comment
+ continue
+
+ else:
+ # split up by space delimiters, and remove trailing space
+ line = line.rstrip()
+ line = re.split(r'\s*', line)
+
+ if len(line) < 3:
+ # bad line
+ continue
+
+ offset = line[0]
+ type = line[1]
+ value = line[2]
+ level = 0
+
+ while offset[0] == '>':
+ # count the level of the type
+ level = level + 1
+ offset = offset[1:]
+
+ l = magicNumbers
+
+ if level > 0:
+ l = last[level - 1].subTests
+
+ if offset[0] == '(':
+ # don't handle indirect offsets just yet
+ pass
+
+ elif offset[0] == '&':
+ # don't handle relative offsets just yet
+ pass
+
+ else:
+ operands = ['=', '<', '>', '&']
+ if operands.count(value[0]) > 0:
+
+ # a comparison operator is specified
+
+ op = value[0]
+ value = value[1:]
+ else:
+ if len(value) > 1 and value[0] == '\\' and operands.count(value[1]) > 0:
+
+ # literal value that collides with operands is escaped
+
+ value = value[1:]
+ op = '='
+
+ mask = None
+
+ if type == 'string':
+ while 1:
+ value = unescape(value)
+ if value[len(value) - 1] == ' ' and len(line) > 3:
+
+ # last value was an escaped space, join
+
+ value = value + line[3]
+ del line[3]
+ else:
+ break
+ else:
+ if value.count('&') != 0:
+ mask = value[value.index('&') + 1:]
+ value = value[:value.index('&') + 1]
+ try:
+ value = strToNum(value)
+ except:
+ continue
+ msg = ('').join(list(line[3:]))
+
+ new = magicTest(offset, type, op, value, msg, mask)
+ last[level] = new
+ l.append(new)
+
+
+def whatis(data):
+ for test in magicNumbers:
+ m = test.compare(data)
+
+ if m:
+ return m
+
+ # no matching, magic number. is it binary or text?
+ for c in data:
+ #if ord(c) > 128:
+ if ord(c) == 0:
+ return 'data'
+
+ # its ASCII, now do C/CPP tests
+ if data.find('#include', 0, 256) > -1 or data.find('/***', 0, 256) > -1:
+ return 'text/cpp'
+
+ # its ASCII, now do text tests
+ if data.find('!/usr/bin/env python', 0, 256) > -1 or data.find('def ', 0, 8192) > -1:
+ return 'application/x-python'
+
+ return "text/plain"
+
+
+def mime_type(f):
+ if os.path.exists(f):
+ if os.path.isdir(f):
+ return "directory"
+
+ return whatis(open(f, 'r').read(8192))
+ else:
+
+ return ''
+
+
+for m in magic:
+ magicNumbers.append(magicTest(m[0], m[1], m[2], m[3], m[4]))
diff --git a/base/maint.py b/base/maint.py
new file mode 100644
index 0000000..4b81935
--- /dev/null
+++ b/base/maint.py
@@ -0,0 +1,1721 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2007 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch, Naga Samrat Chowdary Narla,
+#
+
+# NOTE: Not used by Qt4 code. Use maint_*.py modules instead.
+
+# Local
+from g import *
+from codes import *
+import status, pml
+from prnt import pcl, ldl, colorcal
+
+# ********************** Align **********************
+
+def AlignType1(dev, loadpaper_ui): # Auto VIP (using embedded PML)
+ ok = loadpaper_ui()
+ if ok:
+ dev.writeEmbeddedPML(pml.OID_AUTO_ALIGNMENT,
+ pml.AUTO_ALIGNMENT, style=0,
+ direct=True)
+ dev.closePrint()
+
+ return ok
+
+def AlignType1PML(dev, loadpaper_ui): # Auto VIP (using PML)
+ ok = loadpaper_ui()
+ if ok:
+ dev.setPML(pml.OID_AUTO_ALIGNMENT, pml.AUTO_ALIGNMENT)
+ dev.closePML()
+
+ return ok
+
+
+
+def AlignType2(dev, loadpaper_ui, align_ui, bothpens_ui): # 8xx
+ state, a, b, c, d = 0, 6, 6, 3, 3
+ ok = False
+ while state != -1:
+ if state == 0:
+ state = 1
+ pens = dev.getStatusFromDeviceID()['agents']
+ pen_types = [pens[x] for x in range(len(pens))]
+ if AGENT_TYPE_NONE in pen_types:
+ log.error("Cannot perform alignment with 0 or 1 pen installed.")
+ state = 100
+
+ elif state == 1:
+ state = -1
+ ok = loadpaper_ui()
+ if ok:
+ state = 2
+
+ elif state == 2:
+ state = -1
+ alignType2Phase1(dev)
+ ok, a = align_ui('A', 'h', 'kc', 2, 11)
+ if ok:
+ state = 3
+
+ elif state == 3:
+ state = -1
+ ok, b = align_ui('B', 'v', 'kc', 2, 11)
+ if ok:
+ state = 4
+
+ elif state == 4:
+ state = -1
+ ok, c = align_ui('C', 'v', 'kc', 2, 5)
+ if ok:
+ state = 5
+
+ elif state == 5:
+ state = -1
+ ok, d = align_ui('D', 'v', 'c', 2, 5)
+ if ok:
+ state = 6
+
+ elif state == 6:
+ ok = loadpaper_ui()
+ if ok:
+ alignType2Phase2(dev, a, b, c, d)
+ state = -1
+
+ elif state == 100:
+ ok = False
+ bothpens_ui()
+ state = -1
+
+ return ok
+
+
+
+def AlignType3(dev, loadpaper_ui, align_ui, paperedge_ui, align_type): # 9xx
+ state, a, b, c, d, zca = 0, 6, 6, 3, 3, 6
+ ok = False
+ while state != -1:
+ if state == 0:
+ state = -1
+ ok = loadpaper_ui()
+ if ok:
+ alignType3Phase1(dev)
+ state = 1
+
+ elif state == 1:
+ state = -1
+ ok, a = align_ui('A', 'h', 'kc', 2, 11)
+ if ok:
+ state = 2
+
+ elif state == 2:
+ state = -1
+ ok, b = align_ui('B', 'v', 'kc', 2, 11)
+ if ok:
+ state = 3
+
+ elif state == 3:
+ state = -1
+ ok, c = align_ui('C', 'v', 'k', 2, 11)
+ if ok:
+ state = 4
+
+ elif state == 4:
+ state = -1
+ ok, d = align_ui('D', 'v', 'kc', 2, 11)
+ if ok:
+ state = 5
+
+ elif state == 5:
+ state = -1
+ alignType3Phase2(dev, a, b, c, d)
+ if align_type == 9:
+ state = 7
+ else:
+ ok = loadpaper_ui()
+ if ok:
+ state = 6
+
+ elif state == 6:
+ state = -1
+ alignType3Phase3(dev)
+ ok, zca = paperedge_ui(13)
+ if ok:
+ state = 7
+
+ elif state == 7:
+ ok = loadpaper_ui()
+ if ok:
+ alignType3Phase4(dev, zca)
+ state = -1
+
+ return ok
+
+
+def AlignxBow(dev, align_type, loadpaper_ui, align_ui, paperedge_ui,
+ invalidpen_ui, coloradj_ui): # Types 4, 5, and 7
+
+ state, statepos = 0, 0
+ user_cancel_states = [1000, -1]
+ a, b, c, d, e, f, g = 0, 0, 0, 0, 0, 0, 0
+ error_states = [-1]
+ ok = False
+
+ dev.pen_config = status.getPenConfiguration(dev.getStatusFromDeviceID())
+
+ if dev.pen_config in (AGENT_CONFIG_NONE, AGENT_CONFIG_INVALID):
+ state, states = 100, [-1]
+
+ elif dev.pen_config == AGENT_CONFIG_BLACK_ONLY:
+ state, states = 0, [2, 200, 3, -1]
+
+ elif dev.pen_config == AGENT_CONFIG_PHOTO_ONLY:
+ state, states = 0, [2, 200, 3, -1]
+
+ elif dev.pen_config == AGENT_CONFIG_COLOR_ONLY:
+ state, states = 0, [2, 300, 3, -1]
+
+ elif dev.pen_config == AGENT_CONFIG_COLOR_AND_BLACK:
+ state, states = 0, [2, 400, 500, 600, 700, 3, 4, -1]
+
+ elif dev.pen_config == AGENT_CONFIG_COLOR_AND_PHOTO:
+ state, states = 0, [2, 400, 500, 600, 700, 800, 900, 3, 4, -1]
+
+ while state != -1:
+
+ if state == 0:
+ ok = loadpaper_ui()
+ if ok:
+ if align_type == 4:
+ alignType4Phase1(dev)
+ elif align_type == 5:
+ alignType5Phase1(dev)
+ elif align_type == 7:
+ alignType7Phase1(dev)
+ else:
+ statepos, states = 0, error_states
+ else:
+ statepos, states = 0, user_cancel_states
+
+
+ elif state == 2:
+ ok, a = paperedge_ui(13)
+ if not ok:
+ statepos, states = 0, user_cancel_states
+
+ elif state == 3:
+ if align_type == 4:
+ alignType4Phase2(dev, a, b, c, d, e)
+ elif align_type == 5:
+ alignType5Phase2(dev, a, b, c, d, e, f, g)
+ else:
+ alignType7Phase2(dev, a, b, c, d, e, f, g)
+
+ elif state == 4:
+ ok = loadpaper_ui()
+ if ok:
+ if align_type == 4:
+ alignType4Phase3(dev)
+ elif align_type == 5:
+ alignType5Phase3(dev)
+ else:
+ alignType7Phase3(dev)
+ else:
+ statepos, states = 0, user_cancel_states
+
+ elif state == 100:
+ invalidpen_ui()
+ state = -1
+
+ elif state == 200: # B Line - Black only or photo only
+ ok, b = align_ui('B', 'v', 'k', 2, 11)
+ if not ok:
+ statepos, states = 0, user_cancel_states
+
+ elif state == 300: # B Line - Color only
+ ok, b = align_ui('B', 'v', 'kc', 2, 11)
+ if not ok:
+ statepos, states = 0, user_cancel_states
+
+ elif state == 400: # B Line - 2 pen
+ ok, b = align_ui('B', 'h', 'kc', 2, 17)
+ if not ok:
+ statepos, states = 0, user_cancel_states
+
+ elif state == 500: # C Line
+ ok, c = align_ui('C', 'v', 'kc', 2, 17)
+ if not ok:
+ statepos, states = 0, user_cancel_states
+
+ elif state == 600 : # D Line
+ ok, d = align_ui('D', 'v', 'k', 2, 11)
+ if not ok:
+ statepos, states = 0, user_cancel_states
+
+ elif state == 700: # E Line
+ ok, e = align_ui('E', 'v', 'kc', 2, 11)
+ if not ok:
+ statepos, states = 0, user_cancel_states
+
+ elif state == 800: # F Line
+ ok, f = coloradj_ui('F', 21)
+ if not ok:
+ statepos, states = 0, user_cancel_states
+
+ elif state == 900: # G Line
+ ok, f = coloradj_ui('G', 21)
+ if not ok:
+ statepos, states = 0, user_cancel_states
+
+ elif state == 1000: # User cancel
+ ok = False
+ log.warning("Alignment canceled at user request.")
+
+ state = states[statepos]
+ statepos += 1
+
+ return ok
+
+
+def AlignType6(dev, ui1, ui2, loadpaper_ui):
+ state = 0
+ ok = False
+
+ while state != -1:
+ if state == 0:
+ state = 2
+ accept = ui1()
+ if not accept:
+ # Need to printout alignment page
+ state = 1
+
+ elif state == 1: # Load and print
+ state = -1
+ ok = loadpaper_ui()
+ if ok:
+ alignType6Phase1(dev)
+ state = 2
+
+ elif state == 2: # Finish
+ ui2()
+ state = -1
+
+
+ return ok
+
+def AlignType8(dev, loadpaper_ui, align_ui): # 450
+ state, a, b, c, d = 0, 5, 5, 5, 5
+ ok = False
+
+ while state != -1:
+
+ if state == 0:
+ state = -1
+ ok = loadpaper_ui()
+ if ok:
+ num_inks = alignType8Phase1(dev)
+ state = 1
+
+ elif state == 1:
+ state = -1
+ ok, a = align_ui('A', 'v', 'k', 3, 9)
+ if ok:
+ state = 2
+
+ elif state == 2:
+ state = -1
+ ok, b = align_ui('B', 'v', 'c', 3, 9)
+ if ok:
+ state = 3
+
+ elif state == 3:
+ state = -1
+ ok, c = align_ui('C', 'v', 'kc', 3, 9)
+ if ok:
+ state = 4
+
+ elif state == 4:
+ state = -1
+ ok, d = align_ui('D', 'h', 'kc', 3, 9)
+ if ok:
+ state = 5
+
+ elif state == 5:
+ alignType8Phase2(dev, num_inks, a, b, c, d)
+ state = -1
+
+ return ok
+
+
+def AlignType10(dev, loadpaper_ui, align_ui):
+ pattern = alignType10SetPattern(dev)
+ state = 0
+
+ while state != -1:
+ if state == 0:
+ state = -1
+ ok = loadpaper_ui()
+ if ok:
+ alignType10Phase1(dev)
+ state = 1
+
+ elif state == 1:
+ values = align_ui(pattern, ALIGN_TYPE_LBOW)
+ log.debug(values)
+ alignType10Phase2(dev, values, pattern)
+ state = 2
+
+ elif state == 2:
+ state = -1
+ ok = loadpaper_ui()
+ if ok:
+ alignType10Phase3(dev)
+
+
+def alignType10SetPattern(dev):
+ pattern = None
+ pen_config = status.getPenConfiguration(dev.getStatusFromDeviceID())
+ log.debug("Pen config=%d" % pen_config)
+
+ if pen_config == AGENT_CONFIG_BLACK_ONLY:
+ pattern = 1
+
+ elif pen_config == AGENT_CONFIG_COLOR_AND_BLACK:
+ pattern = 2
+
+ elif pen_config in (AGENT_CONFIG_COLOR_AND_PHOTO, AGENT_CONFIG_COLOR_AND_GREY):
+ pattern = 3
+
+ log.debug("Pattern=%d" % pattern)
+ return pattern
+
+
+def alignType10Phase1(dev):
+ dev.writeEmbeddedPML(pml.OID_PRINT_INTERNAL_PAGE,
+ pml.PRINT_INTERNAL_PAGE_ALIGNMENT_PAGE)
+
+ dev.closePrint()
+
+
+def alignType10Phase2(dev, values, pattern):
+ i, p = 0, ''.join([pcl.UEL, '\n'])
+
+ for x in values:
+ i += 1
+ if not x:
+ break
+ p = ''.join([p, pcl.ESC, '*o5W\x1a', chr(i), '\x00', chr(pattern), chr(x), '\n'])
+
+ p = ''.join([p, pcl.UEL])
+
+ dev.printData(p)
+ dev.closePrint()
+
+
+def alignType10Phase3(dev):
+ dev.writeEmbeddedPML(pml.OID_PRINT_INTERNAL_PAGE,
+ pml.PRINT_INTERNAL_PAGE_ALIGNMENT_PAGE_VERIFICATION)
+
+ dev.closePrint()
+
+
+def align10and11and14Controls(pattern, align_type):
+ if align_type == ALIGN_TYPE_LIDIL_0_5_4:
+ if pattern == 1:
+ controls = { 'A' : (True, 23),
+ 'B' : (True, 9),
+ 'C' : (True, 9),
+ 'D' : (False, 0),
+ 'E' : (False, 0),
+ 'F' : (False, 0),
+ 'G' : (False, 0),
+ 'H' : (False, 0),}
+ elif pattern == 2: # K + color (ii)
+ controls = { 'A' : (True, 17),
+ 'B' : (True, 23),
+ 'C' : (True, 23),
+ 'D' : (True, 23),
+ 'E' : (True, 9),
+ 'F' : (True, 9),
+ 'G' : (True, 9),
+ 'H' : (True, 9),}
+
+ elif pattern == 3: # color + photo (iii)
+ controls = { 'A' : (True, 9),
+ 'B' : (True, 23),
+ 'C' : (True, 23),
+ 'D' : (True, 23),
+ 'E' : (True, 9),
+ 'F' : (True, 9),
+ 'G' : (True, 9),
+ 'H' : (True, 9),}
+
+ elif align_type == ALIGN_TYPE_LIDIL_DJ_D1600:
+ if pattern == 1:
+ controls = { 'A' : (True, 23),
+ 'B' : (True, 9),}
+ elif pattern == 2: # K + color (ii)
+ controls = { 'A' : (True, 23),
+ 'B' : (True, 11),
+ 'C' : (True, 23),
+ 'D' : (True, 23),
+ 'E' : (True, 11),
+ 'F' : (True, 11),
+ 'G' : (True, 11),
+ 'H' : (True, 9),
+ 'I' : (True, 9),}
+
+ elif pattern == 3: # color + photo (iii)
+ controls = { 'A' : (True, 9),
+ 'B' : (True, 23),
+ 'C' : (True, 23),
+ 'D' : (True, 23),
+ 'E' : (True, 9),
+ 'F' : (True, 9),
+ 'G' : (True, 9),
+ 'H' : (True, 9),
+ 'I' : (True, 9),}
+
+ else:
+ if pattern == 1:
+ controls = {'A' : (True, 23),
+ 'B' : (True, 9),
+ 'C' : (True, 9),
+ 'D' : (False, 0),
+ 'E' : (False, 0),
+ 'F' : (False, 0),
+ 'G' : (False, 0),
+ 'H' : (False, 0),}
+ elif pattern == 2:
+ controls = {'A' : (True, 23),
+ 'B' : (True, 17),
+ 'C' : (True, 23),
+ 'D' : (True, 23),
+ 'E' : (True, 9),
+ 'F' : (True, 9),
+ 'G' : (True, 9),
+ 'H' : (True, 9),}
+
+ elif pattern == 3:
+ controls = {'A' : (True, 23),
+ 'B' : (True, 9),
+ 'C' : (True, 23),
+ 'D' : (True, 23),
+ 'E' : (True, 9),
+ 'F' : (True, 9),
+ 'G' : (True, 9),
+ 'H' : (True, 9),}
+
+ return controls
+
+
+def AlignType11(dev, loadpaper_ui, align_ui, invalidpen_ui):
+ pattern = alignType11SetPattern(dev)
+ if pattern is None:
+ invalidpen_ui()
+ return
+
+ state = 0
+ while state != -1:
+ if state == 0:
+ state = -1
+ ok = loadpaper_ui()
+ if ok:
+ alignType11Phase1(dev)
+ state = 1
+
+ elif state == 1:
+ values = align_ui(pattern, ALIGN_TYPE_LIDIL_0_5_4)
+ log.debug(values)
+ alignType11Phase2(dev, values, pattern, dev.pen_config)
+ state = 2
+
+ elif state == 2:
+ state = -1
+ ok = loadpaper_ui()
+ if ok:
+ alignType11Phase3(dev)
+
+
+def alignType11SetPattern(dev):
+ pattern = None
+ dev.pen_config = status.getPenConfiguration(dev.getStatusFromDeviceID())
+ log.debug("Pen config=%d" % dev.pen_config)
+
+ if dev.pen_config in (AGENT_CONFIG_BLACK_ONLY, AGENT_CONFIG_COLOR_ONLY): # (i)
+ pattern = 1
+
+ if dev.pen_config == AGENT_CONFIG_COLOR_AND_BLACK: # (ii)
+ pattern = 2
+
+ elif dev.pen_config == AGENT_CONFIG_COLOR_AND_PHOTO: # (iii)
+ pattern = 3
+
+ elif dev.pen_config == AGENT_CONFIG_PHOTO_ONLY:
+ return None
+
+ log.debug("Pattern=%d" % pattern)
+ return pattern
+
+
+def alignType11Phase1(dev):
+ dev.printData(ldl.buildResetPacket())
+ dev.printData(ldl.buildReportPagePacket(ldl.COMMAND_REPORT_PAGE_PEN_CALIBRATION))
+ dev.closePrint()
+
+
+def alignType11Phase2(dev, values, pattern, pen_config):
+ active_colors = 0
+
+ if pen_config == AGENT_CONFIG_BLACK_ONLY:
+ active_colors = ldl.COMMAND_SET_PEN_ALIGNMENT_3_K
+ values = values[:3]
+
+ elif pen_config == AGENT_CONFIG_COLOR_ONLY:
+ active_colors = ldl.COMMAND_SET_PEN_ALIGNMENT_3_COLOR
+ values = values[:3]
+
+ elif pen_config == AGENT_CONFIG_COLOR_AND_BLACK:
+ active_colors = ldl.COMMAND_SET_PEN_ALIGNMENT_3_K | ldl.COMMAND_SET_PEN_ALIGNMENT_3_COLOR
+
+ elif pen_config == AGENT_CONFIG_COLOR_AND_PHOTO:
+ active_colors = ldl.COMMAND_SET_PEN_ALIGNMENT_3_COLOR | ldl.COMMAND_SET_PEN_ALIGNMENT_3_PHOTO
+
+ log.debug("Active colors=0x%x Values=%s" % (active_colors, values))
+
+ dev.printData(ldl.buildSetPenAlignment3Packet(active_colors, values))
+ dev.closePrint()
+
+def alignType11Phase3(dev):
+ dev.printData(ldl.buildResetPacket())
+ dev.printData(ldl.buildReportPagePacket(ldl.COMMAND_REPORT_PAGE_PEN_CALIBRATION_VERIFY))
+ dev.closePrint()
+
+
+def AlignType13(dev, loadpaper_ui, scanner_align_load_ui): # Auto AiO (Yellowtail)
+ ok = loadpaper_ui()
+ if ok:
+ alignType13Phase1(dev)
+ ok = scanner_align_load_ui()
+
+ return ok
+
+def alignType13Phase1(dev):
+ dev.setPML(pml.OID_AUTO_ALIGNMENT, pml.AUTO_ALIGNMENT)
+ dev.closePML()
+
+calibrationSession = 1
+
+def dataModelHelper(dev, func, ui2):
+ data = status.StatusType10FetchUrl(func, "/Calibration/State")
+ if not data:
+ data = status.StatusType10FetchUrl(func, "/Calibration/State")
+
+ if not data:
+ log.debug("Unable to retrieve calibration state")
+ dev.close()
+ return 0
+
+ if "ParmsRequested" in data:
+ log.error("Restart device and start alignment")
+ dev.close()
+ return 1
+
+ if "404 Not Found" in data:
+ log.error("Device may not support Alignment")
+ dev.close()
+ return 1
+
+ if "Printing<" in data:
+ log.warn("Previous alignment job not completed")
+ dev.close()
+ return 1
+
+ data = status.StatusType10FetchUrl(func, "/DevMgmt/ConsumableConfigDyn.xml")
+ if "AlignmentMode" not in data:
+ log.error("Device may not support Alignment")
+ dev.close()
+ return 1
+
+ if "automatic" in data:
+ log.debug("Device supports automatic calibration")
+ status.StatusType10FetchUrl(func, "/Calibration/Session", "<cal:CalibrationState xmlns:cal=\\\"http://www.hp.com/schemas/imaging/con/cnx/markingagentcalibration/2009/04/08\\\" xmlns:dd=\\\"http://www.hp.com/schemas/imaging/con/dictionaries/1.0/\\\">Printing</cal:CalibrationState>")
+ dev.close()
+ return 0
+
+ if "semiAutomatic" in data:
+ log.debug("Device supports semiAutomatic calibration")
+ status.StatusType10FetchUrl(func, "/Calibration/Session", "<cal:CalibrationState xmlns:cal=\\\"http://www.hp.com/schemas/imaging/con/cnx/markingagentcalibration/2009/04/08\\\" xmlns:dd=\\\"http://www.hp.com/schemas/imaging/con/dictionaries/1.0/\\\">Printing</cal:CalibrationState>")
+ dev.close()
+ return ui2()
+
+ if "manual" in data:
+ log.debug("Device supports manual calibration")
+ data = status.StatusType10FetchUrl(func, "/Calibration/Session", "<cal:CalibrationState xmlns:cal=\\\"http://www.hp.com/schemas/imaging/con/cnx/markingagentcalibration/2009/04/08\\\" xmlns:dd=\\\"http://www.hp.com/schemas/imaging/con/dictionaries/1.0/\\\">Printing</cal:CalibrationState>")
+ import string
+ data = string.split(data, "/Jobs")[1]
+ data = string.split(data, "\r\n")[0]
+ data = "/Jobs" + data
+ data = status.StatusType10FetchUrl(func, data)
+ data = string.split(data, "Session/")[1]
+ data = string.split(data, "<")[0]
+ data = "/Calibration/Session/" + data + "/ManualSelectedPatterns.xml"
+ global calibrationSession
+ calibrationSession = data
+ dev.close()
+ return 0
+
+def AlignType16Manual(dev, a, b, c, d, e, f, g, h, i):
+ log.debug("a=%s b=%s c=%s d=%s e=%s f=%s g=%s h=%s i=%s" % (a, b, c, d, e, f, g, h, i ))
+ data = status.StatusType10FetchUrl(func, "/Calibration/State")
+
+ if not data:
+ return 0
+
+ while "ParmsRequested" not in data:
+ if "CalibrationValid" in data:
+ return
+ data = status.StatusType10FetchUrl(func, "/Calibration/State")
+ data = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- THIS DATA SUBJECT TO DISCLAIMER(S) INCLUDED WITH THE PRODUCT OF ORIGIN. -->\n<ManualSelectedPatterns xmlns=\"http://www.hp.com/schemas/imaging/con/cnx/markingagentcalibration/2009/04/08\" xmlns:locid=\"http://www.hp.com/schemas/imaging/con/ledm/localizationids/2007/10/31/\" xmlns:psdyn=\"http://www.hp.com/schemas/imaging/con/ledm/productstatdyn/2007/10/31\"><SelectedPattern><Identifier><Id>1</Id></Identifier><Choice><Identifier><Id>%s</Id></Identifier></Choice></SelectedPattern><SelectedPattern><Identifier><Id>2</Id></Identifier><Choice><Identifier><Id>%s</Id></Identifier></Choice></SelectedPattern><SelectedPattern><Identifier><Id>3</Id></Identifier><Choice><Identifier><Id>%s</Id></Identifier></Choice></SelectedPattern><SelectedPattern><Identifier><Id>4</Id></Identifier><Choice><Identifier><Id>%s</Id></Identifier></Choice></SelectedPattern><SelectedPattern><Identifier><Id>5</Id></Identifier><Choice><Identifier><Id>%s</Id></Identifier></Choice></SelectedPattern><SelectedPattern><Identifier><Id>6</Id></Identifier><Choice><Identifier><Id>%s</Id></Identifier></Choice></SelectedPattern><SelectedPattern><Identifier><Id>7</Id></Identifier><Choice><Identifier><Id>%s</Id></Identifier></Choice></SelectedPattern><SelectedPattern><Identifier><Id>8</Id></Identifier><Choice><Identifier><Id>%s</Id></Identifier></Choice></SelectedPattern><SelectedPattern><Identifier><Id>9</Id></Identifier><Choice><Identifier><Id>%s</Id></Identifier></Choice></SelectedPattern></ManualSelectedPattern>" % ( a, b, c, d, e, f, g, h, i )
+ data = "PUT %s HTTP/1.1\r\nHost: localhost\r\nUser-Agent: hp\r\nAccept: text/plain\r\nAccept-Language: en-us,en\r\nAccept-Charset:utf-8\r\nContent-Type: text/xml\r\nContent-Length: %s\r\n\r\n" % ( calibrationSession, len(data)) + data
+ data = status.StatusType10FetchUrl(func, calibrationSession, data)
+
+def AlignType15(dev, loadpaper_ui, ui2):
+ if not loadpaper_ui():
+ return
+ return dataModelHelper(dev, dev.getEWSUrl_LEDM, ui2)
+
+def AlignType15Phase1(dev, ui2):
+ return dataModelHelper(dev, dev.getEWSUrl_LEDM, ui2)
+
+#AlignType 17 is LEDM via FF/CC/0 USB channel
+def AlignType17(dev, loadpaper_ui, ui2):
+ if not loadpaper_ui():
+ return
+ return dataModelHelper(dev, dev.getUrl_LEDM, ui2)
+
+def AlignType17Phase1(dev, ui2):
+ return dataModelHelper(dev, dev.getUrl_LEDM, ui2)
+
+def AlignType16(dev, loadpaper_ui, align_ui):
+ if not loadpaper_ui():
+ return
+ dataModelHelper(dev, dev.getEWSUrl_LEDM, align_ui)
+ state, a, b, c, d, e, f, g, h, i = 0, 6, 6, 3, 3, 6, 6, 6, 6, 6
+ ok = False
+ while state != -1:
+ if state == 0:
+ state = -1
+ ok, a = align_ui('A', 'v', 'kc', 3, 23)
+ if ok:
+ state = 1
+
+ elif state == 1:
+ state = -1
+ ok, b = align_ui('B', 'h', 'kc', 3, 11)
+ if ok:
+ state = 2
+
+ elif state == 2:
+ state = -1
+ ok, c = align_ui('C', 'v', 'k', 3, 23)
+ if ok:
+ state = 3
+
+ elif state == 3:
+ state = -1
+ ok, d = align_ui('D', 'v', 'c', 3, 23)
+ if ok:
+ state = 4
+
+ elif state == 4:
+ state = -1
+ ok, e = align_ui('E', 'h', 'k', 3, 11)
+ if ok:
+ state = 5
+
+ elif state == 5:
+ state = -1
+ ok, e = align_ui('F', 'h', 'k', 3, 11)
+ if ok:
+ state = 6
+
+ elif state == 6:
+ state = -1
+ ok, e = align_ui('G', 'h', 'k', 3, 11)
+ if ok:
+ state = 7
+
+ elif state == 7:
+ state = -1
+ ok, e = align_ui('H', 'h', 'k', 3, 11)
+ if ok:
+ state = 8
+
+ elif state == 8:
+ state = -1
+ ok, e = align_ui('I', 'h', 'k', 3, 11)
+ if ok:
+ state = 9
+
+ elif state == 9:
+ state = -1
+
+ AlignType16Manual(dev, a, b, c, d, e, f, g, h, i)
+
+ return ok
+
+def AlignType16Phase1(dev, a, b, c, d, e, f, g, h, i):
+ AlignType16Manual(dev, a, b, c, d, e, f, g, h, i)
+
+def AlignType14(dev, loadpaper_ui, align_ui, invalidpen_ui):
+ pattern = alignType14SetPattern(dev)
+ if pattern is None:
+ invalidpen_ui()
+ return
+
+ state = 0
+ while state != -1:
+ if state == 0:
+ state = -1
+ ok = loadpaper_ui()
+ if ok:
+ alignType14Phase1(dev)
+ state = 1
+
+ elif state == 1:
+ values = align_ui(pattern, ALIGN_TYPE_LIDIL_DJ_D1600)
+ log.debug(values)
+ alignType14Phase2(dev, values, pattern, dev.pen_config)
+ state = 2
+
+ elif state == 2:
+ state = -1
+ ok = loadpaper_ui()
+ if ok:
+ alignType14Phase3(dev)
+
+
+def alignType14SetPattern(dev):
+ pattern = None
+ dev.pen_config = status.getPenConfiguration(dev.getStatusFromDeviceID())
+ log.debug("Pen config=%d" % dev.pen_config)
+
+ if dev.pen_config in (AGENT_CONFIG_BLACK_ONLY, AGENT_CONFIG_COLOR_ONLY): # (i)
+ pattern = 1
+
+ if dev.pen_config == AGENT_CONFIG_COLOR_AND_BLACK: # (ii)
+ pattern = 2
+
+ elif dev.pen_config == AGENT_CONFIG_COLOR_AND_PHOTO: # (iii)
+ pattern = 3
+
+ elif dev.pen_config == AGENT_CONFIG_PHOTO_ONLY:
+ return None
+
+ log.debug("Pattern=%d" % pattern)
+ return pattern
+
+
+def alignType14Phase1(dev):
+ dev.printData(ldl.buildResetPacket())
+ dev.printData(ldl.buildReportPagePacket(ldl.COMMAND_REPORT_PAGE_PEN_CALIBRATION))
+ dev.closePrint()
+
+
+def alignType14Phase2(dev, values, pattern, pen_config):
+ active_colors = 0
+
+ if pen_config == AGENT_CONFIG_BLACK_ONLY:
+ active_colors = ldl.COMMAND_SET_PEN_ALIGNMENT_3_K
+ values = values[:2]
+
+ elif pen_config == AGENT_CONFIG_COLOR_ONLY:
+ active_colors = ldl.COMMAND_SET_PEN_ALIGNMENT_3_COLOR
+ values = values[:2]
+
+ elif pen_config == AGENT_CONFIG_COLOR_AND_BLACK:
+ active_colors = ldl.COMMAND_SET_PEN_ALIGNMENT_3_K | ldl.COMMAND_SET_PEN_ALIGNMENT_3_COLOR
+
+ elif pen_config == AGENT_CONFIG_COLOR_AND_PHOTO:
+ active_colors = ldl.COMMAND_SET_PEN_ALIGNMENT_3_COLOR | ldl.COMMAND_SET_PEN_ALIGNMENT_3_PHOTO
+
+ log.debug("Active colors=0x%x Values=%s" % (active_colors, values))
+
+ dev.printData(ldl.buildSetPenAlignment3Packet(active_colors, values))
+ dev.closePrint()
+
+def alignType14Phase3(dev):
+ dev.printData(ldl.buildResetPacket())
+ dev.printData(ldl.buildReportPagePacket(ldl.COMMAND_REPORT_PAGE_PEN_CALIBRATION_VERIFY))
+ dev.closePrint()
+
+
+def alignType2Phase1(dev): # Type 2 (8xx)
+ dev.writeEmbeddedPML(pml.OID_AGENT2_VERTICAL_ALIGNMENT, 0)
+ dev.writeEmbeddedPML(pml.OID_AGENT2_HORIZONTAL_ALIGNMENT, 0)
+ dev.writeEmbeddedPML(pml.OID_AGENT1_BIDIR_ADJUSTMENT, 0)
+ dev.writeEmbeddedPML(pml.OID_AGENT2_BIDIR_ADJUSTMENT, 0)
+ dev.closePrint()
+ dev.printGzipFile(os.path.join(prop.home_dir, 'data', 'pcl', 'align1_8xx.pcl.gz'))
+
+
+def alignType2Phase2(dev, a, b, c, d): # (8xx)
+ dev.writeEmbeddedPML(pml.OID_AGENT2_VERTICAL_ALIGNMENT, (a - 6) * 12)
+ dev.writeEmbeddedPML(pml.OID_AGENT2_HORIZONTAL_ALIGNMENT, (b - 6) * 12)
+ dev.writeEmbeddedPML(pml.OID_AGENT1_BIDIR_ADJUSTMENT, (c - 3) * 12)
+ dev.writeEmbeddedPML(pml.OID_AGENT2_BIDIR_ADJUSTMENT, (d - 3) * 12)
+ dev.writeEmbeddedPML(pml.OID_MARKING_AGENTS_INITIALIZED, 3)
+ dev.closePrint()
+ dev.printGzipFile(os.path.join(prop.home_dir, 'data', 'pcl', 'align2_8xx.pcl.gz'))
+
+
+def alignType3Phase1(dev): # Type 3 (9xx)
+ dev.writeEmbeddedPML(pml.OID_AGENT2_VERTICAL_ALIGNMENT, 0)
+ dev.writeEmbeddedPML(pml.OID_AGENT2_HORIZONTAL_ALIGNMENT, 0)
+ dev.writeEmbeddedPML(pml.OID_AGENT1_BIDIR_ADJUSTMENT, 0)
+ dev.writeEmbeddedPML(pml.OID_AGENT2_BIDIR_ADJUSTMENT, 0)
+ dev.closePrint()
+ dev.printGzipFile(os.path.join(prop.home_dir, 'data', 'pcl', 'align1_9xx.pcl.gz'))
+
+
+def alignType3Phase2(dev, a, b, c, d): # Type 3 (9xx)
+ dev.writeEmbeddedPML(pml.OID_AGENT2_VERTICAL_ALIGNMENT, (a - 6) * 12)
+ dev.writeEmbeddedPML(pml.OID_AGENT2_HORIZONTAL_ALIGNMENT, (6 - b) * 12)
+ dev.writeEmbeddedPML(pml.OID_AGENT1_BIDIR_ADJUSTMENT, (6 - c) * 12)
+ dev.writeEmbeddedPML(pml.OID_AGENT2_BIDIR_ADJUSTMENT, (6 - d) * 6)
+ dev.closePrint()
+
+def alignType3Phase3(dev): # Type 3 (9xx)
+ dev.closePrint()
+ dev.printGzipFile(os.path.join(prop.home_dir, 'data', 'pcl', 'align3_9xx.pcl.gz'))
+
+
+def alignType3Phase4(dev, zca): # Type 3 (9xx)
+ dev.writeEmbeddedPML(pml.OID_MARKING_AGENTS_INITIALIZED, 3)
+ dev.closePrint()
+ dev.printGzipFile(os.path.join(prop.home_dir, 'data', 'pcl', 'align2_9xx.pcl.gz'))
+
+
+def alignType4Phase1(dev): # Type 4 (xBow/LIDIL 0.3.8)
+ dev.printData(ldl.buildLIDILPacket(ldl.PACKET_TYPE_RESUME_NORMAL_OPERATION))
+
+ if dev.pen_config in (AGENT_CONFIG_NONE, AGENT_CONFIG_INVALID):
+ return
+
+ elif dev.pen_config == AGENT_CONFIG_BLACK_ONLY:
+ ldl_file = 'cbbcal.ldl.gz'
+
+ elif dev.pen_config == AGENT_CONFIG_COLOR_ONLY:
+ ldl_file = 'cbccal.ldl.gz'
+
+ elif dev.pen_config == AGENT_CONFIG_COLOR_AND_BLACK:
+ ldl_file = 'cb2pcal.ldl.gz'
+
+ dev.printData(ldl.buildSetPrinterAlignmentPacket(0, 0, 0, 0))
+ dev.closePrint()
+ dev.printGzipFile(os.path.join(prop.home_dir, 'data', 'ldl', ldl_file))
+
+
+def alignType4Phase2(dev, a, b, c, d, e): # Type 4 (LIDIL 0.3.8)
+ log.debug("A=%d, B=%d, C=%d, D=%d, E=%d" % (a, b, c, d, e))
+
+ if dev.pen_config in (AGENT_CONFIG_NONE, AGENT_CONFIG_INVALID):
+ return
+
+ # ZCA
+ zca = (7 - a) * -48
+ dev.printData(ldl.buildZCAPacket(zca))
+
+ if dev.pen_config == AGENT_CONFIG_BLACK_ONLY:
+ k_bidi = (6 - b) * 2
+ dev.printData(ldl.buildSetPrinterAlignmentPacket(k_bidi, 0, 0, 0))
+
+ elif dev.pen_config == AGENT_CONFIG_COLOR_ONLY:
+ cmy_bidi = (6 - b) * 2
+ dev.printData(ldl.buildSetPrinterAlignmentPacket(0, 0, 0, cmy_bidi))
+
+ elif dev.pen_config == AGENT_CONFIG_COLOR_AND_BLACK:
+ vert = (9 - b) * 2
+ hort = (9 - c) * -2
+ k_bidi = (6 - d) * 2
+ cmy_bidi = (6 - e) * 2
+
+ dev.printData(ldl.buildSetPrinterAlignmentPacket(k_bidi, hort, vert, cmy_bidi))
+
+ # Set alignment
+ dev.printData(ldl.buildSetPensAlignedPacket())
+ dev.closePrint()
+
+
+def alignType4Phase3(dev): # Type 4 (LIDIL 0.3.8)
+ if dev.pen_config == AGENT_CONFIG_COLOR_AND_BLACK:
+ dev.printGzipFile(os.path.join(prop.home_dir, 'data', 'ldl', 'cb2pcal_done.ldl.gz'))
+
+
+def alignType5Phase1(dev): # Type 5 (xBow+/LIDIL 0.4.3)
+ dev.printData(ldl.buildLIDILPacket(ldl.PACKET_TYPE_RESUME_NORMAL_OPERATION))
+
+ if dev.pen_config in (AGENT_CONFIG_NONE, AGENT_CONFIG_INVALID):
+ return
+
+ elif dev.pen_config == AGENT_CONFIG_BLACK_ONLY:
+ ldl_file = 'cbbcal.ldl.gz'
+
+ elif dev.pen_config == AGENT_CONFIG_PHOTO_ONLY:
+ ldl_file = 'cbpcal.ldl.gz'
+
+ elif dev.pen_config == AGENT_CONFIG_COLOR_ONLY:
+ ldl_file = 'cbccal.ldl.gz'
+
+ elif dev.pen_config == AGENT_CONFIG_COLOR_AND_BLACK:
+ ldl_file = 'cb2pcal.ldl.gz'
+
+ elif dev.pen_config == AGENT_CONFIG_COLOR_AND_PHOTO:
+ ldl_file = 'cbcpcal.ldl.gz'
+
+ dev.printData(ldl.buildZCAPacket(0))
+ dev.printData(ldl.buildColorHortPacket(0))
+ dev.printData(ldl.buildColorVertPacket(0))
+ dev.printData(ldl.buildBlackVertPacket(0))
+ dev.printData(ldl.buildBlackHortPacket(0))
+ dev.printData(ldl.buildBlackBidiPacket(0))
+ dev.printData(ldl.buildColorBidiPacket(0))
+ dev.printData(ldl.buildPhotoHuePacket(0))
+ dev.printData(ldl.buildColorHuePacket(0))
+ dev.closePrint()
+
+ dev.printGzipFile(os.path.join(prop.home_dir, 'data', 'ldl', ldl_file))
+
+
+def alignType5Phase2(dev, a, b, c, d, e, f, g): # Type 5 (xBow+/LIDIL 0.4.3)
+ log.debug("A=%d, B=%d, C=%d, D=%d, E=%d, F=%d, G=%d" % (a, b, c, d, e, f, g))
+
+ if dev.pen_config in (AGENT_CONFIG_NONE, AGENT_CONFIG_INVALID):
+ return
+
+ # ZCA
+ zca = (7 - a) * -48
+ dev.printData(ldl.buildZCAPacket(zca))
+
+ if dev.pen_config == AGENT_CONFIG_BLACK_ONLY:
+ k_bidi = (6 - b) * 2
+ dev.printData(ldl.buildBlackBidiPacket(k_bidi))
+
+ elif dev.pen_config == AGENT_CONFIG_PHOTO_ONLY:
+ kcm_bidi = (6 - b) * 2
+ dev.printData(ldl.buildPhotoBidiPacket(kcm_bidi))
+
+ elif dev.pen_config == AGENT_CONFIG_COLOR_ONLY:
+ cmy_bidi = (6 - b) * 2
+ dev.printData(ldl.buildColorBidiPacket(cmy_bidi))
+
+ elif dev.pen_config == AGENT_CONFIG_COLOR_AND_BLACK:
+ vert = (9 - b) * 2
+ hort = (9 - c) * -2
+ k_bidi = (6 - d) * 2
+ cmy_bidi = (6 - e) * 2
+
+ dev.printData(ldl.buildColorHortPacket(0))
+ dev.printData(ldl.buildColorVertPacket(0))
+ dev.printData(ldl.buildBlackVertPacket(vert))
+ dev.printData(ldl.buildBlackHortPacket(hort))
+ dev.printData(ldl.buildBlackBidiPacket(k_bidi))
+ dev.printData(ldl.buildColorBidiPacket(cmy_bidi))
+
+ elif dev.pen_config == AGENT_CONFIG_COLOR_AND_PHOTO:
+ vert = (9 - b) * 2
+ hort = (9 - c) * -2
+ cmy_bidi = (6 - d) * 2
+ kcm_bidi = (6 - e) * 2
+
+ photo_adj = colorcal.PHOTO_ALIGN_TABLE[f][g]
+ color_adj = colorcal.COLOR_ALIGN_TABLE[f][g]
+
+ dev.printData(ldl.buildPhotoHortPacket(hort))
+ dev.printData(ldl.buildPhotoVertPacket(vert))
+ dev.printData(ldl.buildColorHortPacket(0))
+ dev.printData(ldl.buildColorVertPacket(0))
+ dev.printData(ldl.buildPhotoBidiPacket(kcm_bidi))
+ dev.printData(ldl.buildColorBidiPacket(cmy_bidi))
+ dev.printData(ldl.buildPhotoHuePacket(photo_adj))
+ dev.printData(ldl.buildColorHuePacket(color_adj))
+
+ # Set alignment
+ dev.printData(ldl.buildSetPensAlignedPacket())
+ dev.closePrint()
+
+
+def alignType5Phase3(dev): # Type 5 (xBow+/LIDIL 0.4.3)
+ dev.closePrint()
+ if dev.pen_config == AGENT_CONFIG_COLOR_AND_BLACK:
+ dev.printGzipFile(os.path.join(prop.home_dir, 'data', 'ldl', "cb2pcal_done.ldl.gz"))
+
+ elif dev.pen_config == AGENT_CONFIG_COLOR_AND_PHOTO:
+ dev.printGzipFile(os.path.join(prop.home_dir, 'data', 'ldl', "cbccal_done.ldl.gz"))
+
+
+def alignType6Phase1(dev): # Type 6 (xBow AiO)
+ dev.printData(ldl.buildPrintInternalPagePacket())
+ dev.closePrint()
+
+def alignType7Phase1(dev): # Type 7 (xBow VIP)
+ # Zero out all alignment values
+ dev.writeEmbeddedPML(pml.OID_AGENT1_BIDIR_ADJUSTMENT, 0)
+
+ dev.writeEmbeddedPML(pml.OID_AGENT2_VERTICAL_ALIGNMENT, 0)
+ dev.writeEmbeddedPML(pml.OID_AGENT2_HORIZONTAL_ALIGNMENT, 0)
+ dev.writeEmbeddedPML(pml.OID_AGENT2_BIDIR_ADJUSTMENT, 0)
+
+ dev.writeEmbeddedPML(pml.OID_AGENT3_VERTICAL_ALIGNMENT, 0)
+ dev.writeEmbeddedPML(pml.OID_AGENT3_HORIZONTAL_ALIGNMENT, 0)
+ dev.writeEmbeddedPML(pml.OID_AGENT3_BIDIR_ADJUSTMENT, 0)
+
+ dev.writeEmbeddedPML(pml.OID_ZCA, 0)
+
+ if dev.pen_config in (AGENT_CONFIG_NONE, AGENT_CONFIG_INVALID):
+ return
+
+ elif dev.pen_config == AGENT_CONFIG_BLACK_ONLY:
+ pcl_file = 'crbcal.pcl.gz'
+
+ elif dev.pen_config == AGENT_CONFIG_PHOTO_ONLY:
+ pcl_file = 'crpcal.pcl.gz'
+
+ elif dev.pen_config == AGENT_CONFIG_COLOR_ONLY:
+ pcl_file = 'crccal.pcl.gz'
+
+ elif dev.pen_config == AGENT_CONFIG_COLOR_AND_BLACK:
+ pcl_file = 'crcbcal.pcl.gz'
+
+ elif dev.pen_config == AGENT_CONFIG_COLOR_AND_PHOTO:
+ pcl_file = 'crcpcal.pcl.gz'
+
+ dev.closePrint()
+ dev.printGzipFile(os.path.join(prop.home_dir, 'data', 'pcl', pcl_file))
+
+
+def alignType7Phase2(dev, a, b, c, d, e, f, g): # Type 7 (xBow VIP)
+ log.debug("A=%d, B=%d, C=%d, D=%d, E=%d, F=%d, G=%d" % (a, b, c, d, e, f, g))
+
+ # ZCA
+ zca = (7 - a) * -12
+ dev.writeEmbeddedPML(pml.OID_ZCA, zca)
+
+ if dev.pen_config == AGENT_CONFIG_BLACK_ONLY:
+ k_bidi = (6 - b) * 6
+ dev.writeEmbeddedPML(pml.OID_AGENT1_BIDIR_ADJUSTMENT, k_bidi)
+
+ elif dev.pen_config == AGENT_CONFIG_PHOTO_ONLY:
+ kcm_bidi = (6 - b) * 6
+ dev.writeEmbeddedPML(pml.OID_AGENT3_BIDIR_ADJUSTMENT, kcm_bidi)
+
+ elif dev.pen_config == AGENT_CONFIG_COLOR_ONLY:
+ cmy_bidi = (6 - b) * 6
+ dev.writeEmbeddedPML(pml.OID_AGENT2_BIDIR_ADJUSTMENT, cmy_bidi)
+
+ elif dev.pen_config == AGENT_CONFIG_COLOR_AND_BLACK:
+ vert = (9 - b) * 6
+ hort = (9 - c) * -6
+ k_bidi = (6 - d) * 6
+ cmy_bidi = (6 - e) * 6
+
+ dev.writeEmbeddedPML(pml.OID_AGENT1_BIDIR_ADJUSTMENT, k_bidi)
+ dev.writeEmbeddedPML(pml.OID_AGENT2_BIDIR_ADJUSTMENT, cmy_bidi)
+ dev.writeEmbeddedPML(pml.OID_AGENT2_HORIZONTAL_ALIGNMENT, hort)
+ dev.writeEmbeddedPML(pml.OID_AGENT2_VERTICAL_ALIGNMENT, vert)
+
+ elif dev.pen_config == AGENT_CONFIG_COLOR_AND_PHOTO:
+ vert = (9 - b) * 6
+ hort = (9 - c) * -6
+ cmy_bidi = (6 - d) * 6
+ kcm_bidi = (6 - e) * 6
+
+ photo_adj = colorcal.PHOTO_ALIGN_TABLE[f][g]
+ color_adj = colorcal.COLOR_ALIGN_TABLE[f][g]
+
+ x = (color_adj << 8) + photo_adj
+
+ dev.writeEmbeddedPML(pml.OID_COLOR_CALIBRATION_SELECTION, x)
+
+ dev.writeEmbeddedPML(pml.OID_AGENT2_BIDIR_ADJUSTMENT, cmy_bidi)
+ dev.writeEmbeddedPML(pml.OID_AGENT3_BIDIR_ADJUSTMENT, kcm_bidi)
+ dev.writeEmbeddedPML(pml.OID_AGENT3_HORIZONTAL_ALIGNMENT, hort)
+ dev.writeEmbeddedPML(pml.OID_AGENT3_VERTICAL_ALIGNMENT, vert)
+
+ dev.closePrint()
+
+def alignType7Phase3(dev): # Type 7 (xBow VIP)
+ dev.closePrint()
+ dev.printGzipFile(os.path.join(prop.home_dir, 'data', 'pcl', "crcaldone.pcl.gz"))
+
+
+def alignType8Phase1(dev): # 450
+ pens = dev.getStatusFromDeviceID()['agents']
+ pen_types = [pens[x]['type'] for x in range(len(pens))]
+
+ if AGENT_TYPE_KCM in pen_types:
+ f, num_inks = 'align6_450.pcl.gz', 6
+ else:
+ f, num_inks = 'align4_450.pcl.gz', 4
+
+ dev.closePrint()
+ dev.printGzipFile(os.path.join(prop.home_dir, 'data', 'pcl', f))
+
+ return num_inks
+
+
+def alignType8Phase2(dev, num_inks, a, b, c, d): # 450
+ align_values1 = {1 : '\x00\x00\x18',
+ 2 : '\x00\x00\x12',
+ 3 : '\x00\x00\x0c',
+ 4 : '\x00\x00\x06',
+ 5 : '\x00\x00\x00',
+ 6 : '\x01\x00\x06',
+ 7 : '\x01\x00\x0c',
+ 8 : '\x01\x00\x12',
+ 9 : '\x01\x00\x18',
+ }
+
+ align_values2 = {1 : '\x00\x00\x12',
+ 2 : '\x00\x00\x0c',
+ 3 : '\x00\x00\x06',
+ 4 : '\x00\x00\x00',
+ 5 : '\x01\x00\x06',
+ 6 : '\x01\x00\x0c',
+ 7 : '\x01\x00\x12',
+ 8 : '\x01\x00\x18',
+ 9 : '\x01\x00\x1e',
+ }
+
+ align_values3 = {1 : '\x00\x00\x24',
+ 2 : '\x00\x00\x18',
+ 3 : '\x00\x00\x12',
+ 4 : '\x00\x00\x06',
+ 5 : '\x00\x00\x00',
+ 6 : '\x01\x00\x06',
+ 7 : '\x01\x00\x12',
+ 8 : '\x01\x00\x18',
+ 9 : '\x01\x00\x24',
+ }
+
+ if num_inks == 4:
+ s = ''.join([pcl.UEL,
+ '@PJL ENTER LANGUAGE=PCL3GUI\n',
+ pcl.RESET,
+ pcl.ESC, '*o5W\x1a\x01', align_values1[a],
+ pcl.ESC, '*o5W\x1a\x02', align_values2[a],
+ pcl.ESC, '*o5W\x1a\x03', align_values1[b],
+ pcl.ESC, '*o5W\x1a\x04', align_values1[b],
+ pcl.ESC, '*o5W\x1a\x08', align_values1[c],
+ pcl.ESC, '*o5W\x1a\x07', align_values1[d],
+ pcl.RESET,
+ pcl.UEL])
+
+ else: # 6
+ s = ''.join([pcl.UEL,
+ '@PJL ENTER LANGUAGE=PCL3GUI\n',
+ pcl.RESET,
+ pcl.ESC, '*o5W\x1a\x05', align_values1[a],
+ pcl.ESC, '*o5W\x1a\x06', align_values3[a],
+ pcl.ESC, '*o5W\x1a\x03', align_values1[b],
+ pcl.ESC, '*o5W\x1a\x04', align_values1[b],
+ pcl.ESC, '*o5W\x1a\x0a', align_values1[c],
+ pcl.ESC, '*o5W\x1a\x09', align_values1[d],
+ pcl.RESET,
+ pcl.UEL])
+
+ dev.printData(s)
+ dev.closePrint()
+
+
+def AlignType12(dev, loadpaper_ui):
+ if loadpaper_ui():
+ dev.setPML(pml.OID_PRINT_INTERNAL_PAGE, pml.PRINT_INTERNAL_PAGE_ALIGNMENT_PAGE)
+ dev.closePML()
+
+# ********************** Clean **********************
+
+
+def cleaning(dev, clean_type, level1, level2, level3,
+ loadpaper_ui, dlg1, dlg2, dlg3, wait_ui):
+
+ state = 0
+
+ while state != -1:
+ if state == 0: # Initial level1 print
+ state = 1
+ if clean_type == CLEAN_TYPE_PCL_WITH_PRINTOUT:
+ ok = loadpaper_ui()
+ if not ok:
+ state = -1
+
+ elif state == 1: # Do level 1
+ level1(dev)
+ state = 2
+
+ elif state == 2: # Load plain paper
+ state = -1
+ ok = loadpaper_ui()
+ if ok:
+ state = 3
+
+ elif state == 3: # Print test page
+ state = 4
+ print_clean_test_page(dev)
+
+ elif state == 4: # Need level 2?
+ state = -1
+ ok = dlg1()
+ if ok:
+ state = 5
+
+ elif state == 5: # Do level 2
+ level2(dev)
+ state = 6
+
+ elif state == 6: # Load plain paper
+ state = -1
+ ok = loadpaper_ui()
+ if ok:
+ state = 7
+
+ elif state == 7: # Print test page
+ state = 8
+ print_clean_test_page(dev)
+
+ elif state == 8: # Need level 3?
+ state = -1
+ ok = dlg2()
+ if ok:
+ state = 9
+
+ elif state == 9: # Do level 3
+ level3(dev)
+ state = 10
+
+ elif state == 10: # Load plain paper
+ state = -1
+ ok = loadpaper_ui()
+ if ok:
+ state = 11
+
+ elif state == 11: # Print test page
+ state = 12
+ print_clean_test_page(dev)
+
+ elif state == 12:
+ state = -1
+ dlg3()
+
+ return ok
+
+
+def print_clean_test_page(dev):
+ dev.closePrint()
+ dev.printGzipFile(os.path.join(prop.home_dir, 'data',
+ 'ps', 'clean_page.pdf.gz'), raw=False)
+
+def cleanType1(dev): # PCL, Level 1
+ dev.writeEmbeddedPML(pml.OID_CLEAN, pml.CLEAN_CLEAN)
+ dev.closePrint()
+
+def primeType1(dev): # PCL, Level 2
+ dev.writeEmbeddedPML(pml.OID_CLEAN, pml.CLEAN_PRIME)
+ dev.closePrint()
+
+def wipeAndSpitType1(dev): # PCL, Level 3
+ dev.writeEmbeddedPML(pml.OID_CLEAN, pml.CLEAN_WIPE_AND_SPIT)
+ dev.closePrint()
+
+def cleanType2(dev): # LIDIL, Level 1
+ dev.printData(ldl.buildResetPacket())
+ dev.printData(ldl.buildLIDILPacket(ldl.PACKET_TYPE_COMMAND,
+ ldl.COMMAND_HANDLE_PEN,
+ ldl.COMMAND_HANDLE_PEN_CLEAN_LEVEL1))
+ dev.closePrint()
+
+def primeType2(dev): # LIDIL, Level 2
+ dev.printData(ldl.buildResetPacket())
+ dev.printData(ldl.buildLIDILPacket(ldl.PACKET_TYPE_COMMAND,
+ ldl.COMMAND_HANDLE_PEN,
+ ldl.COMMAND_HANDLE_PEN_CLEAN_LEVEL2))
+ dev.closePrint()
+
+def wipeAndSpitType2(dev): # LIDIL, Level 3
+ dev.printData(ldl.buildResetPacket())
+ dev.printData(ldl.buildLIDILPacket(ldl.PACKET_TYPE_COMMAND,
+ ldl.COMMAND_HANDLE_PEN,
+ ldl.COMMAND_HANDLE_PEN_CLEAN_LEVEL3))
+ dev.closePrint()
+
+
+# ********************** Color Cal **********************
+
+
+def colorCalType1(dev, loadpaper_ui, colorcal_ui, photopenreq_ui): # 450
+ value, state = 4, 0
+ ok = False
+ while state != -1:
+
+ if state == 0:
+ if colorCalType1PenCheck(dev):
+ state = 1
+ else:
+ state = 100
+
+ elif state == 1:
+ state = -1
+ ok = loadpaper_ui()
+ if ok:
+ colorCalType1Phase1(dev)
+ state = 2
+
+ elif state == 2:
+ state = -1
+ ok, value = colorcal_ui()
+ if ok:
+ state = 3
+
+ elif state == 3:
+ colorCalType1Phase2(dev, value)
+ state = -1
+
+ elif state == 100:
+ ok = False
+ photopenreq_ui()
+ state = -1
+
+ return ok
+
+
+def colorCalType1PenCheck(dev): # 450
+ pens = dev.getStatusFromDeviceID()['agents']
+ pen_types = [pens[x]['type'] for x in range(len(pens))]
+
+ if AGENT_TYPE_KCM in pen_types:
+ return True
+
+ else:
+ log.error("Cannot perform color calibration with no photo pen installed.")
+ return False
+
+
+def colorCalType1Phase1(dev): # 450
+ dev.closePrint()
+ dev.printGzipFile(os.path.join(prop.home_dir, 'data', 'pcl', 'colorcal1_450.pcl.gz'))
+
+
+def colorCalType1Phase2(dev, value): # 450
+ color_cal = {1 : ('\x0f\x3c', '\x17\x0c'),
+ 2 : ('\x10\xcc', '\x15\x7c'),
+ 3 : ('\x12\x5c', '\x13\xec'),
+ 4 : ('\x13\xec', '\x12\x5c'),
+ 5 : ('\x15\x7c', '\x10\xcc'),
+ 6 : ('\x17\x0c', '\x0f\x3c'),
+ 7 : ('\x18\x9c', '\x0d\xac'),
+ }
+
+ s = ''.join([pcl.UEL,
+ '@PJL ENTER LANGUAGE=PCL3GUI\n',
+ pcl.RESET,
+ pcl.ESC, '*o5W\x1a\x0c\x00', color_cal[value][0],
+ pcl.ESC, '*o5W\x1a\x0b\x00', color_cal[value][1],
+ pcl.RESET,
+ pcl.UEL])
+
+ dev.printData(s)
+ dev.closePrint()
+
+#
+# COLOR CAL TYPE 2
+#
+
+def colorCalType2(dev, loadpaper_ui, colorcal_ui, photopenreq_ui):
+ value, state = 4, 0
+ ok = True
+ while state != -1:
+
+ if state == 0:
+ if colorCalType2PenCheck(dev):
+ state = 1
+ else:
+ state = 100
+
+ elif state == 1:
+ state = -1
+ ok = loadpaper_ui()
+ if ok:
+ colorCalType2Phase1(dev)
+ state = 2
+
+ elif state == 2:
+ state = -1
+ ok, value = colorcal_ui()
+ if ok:
+ state = 3
+
+ elif state == 3:
+ colorCalType2Phase2(dev, value)
+ state = -1
+
+ elif state == 100:
+ photopenreq_ui()
+ ok = False
+ state = -1
+
+ return ok
+
+def colorCalType2PenCheck(dev):
+ pens = dev.getStatusFromDeviceID()['agents']
+ pen_types = [pens[x]['type'] for x in range(len(pens))]
+
+ if not AGENT_TYPE_NONE in pen_types:
+ return True
+
+ else:
+ log.error("Cannot perform color calibration with pens missing.")
+ return False
+
+def colorCalType2Phase1(dev):
+ dev.writeEmbeddedPML(pml.OID_PRINT_INTERNAL_PAGE,
+ pml.PRINT_INTERNAL_PAGE_COLOR_CAL)
+
+ dev.closePrint()
+
+
+def colorCalType2Phase2(dev, value):
+ c = colorcal.COLOR_CAL_TABLE
+ p = ''.join(['\x1b&b19WPML \x04\x00\x06\x01\x04\x01\x05\x01\t\x08\x04',
+ chr(c[value*4]+100), chr(c[value*4+1]+100),
+ chr(c[value*4+2]+100), chr(c[value*4+3]+100),
+ '\x1b%-12345X'])
+
+ dev.printData(p)
+ dev.closePrint()
+
+
+#
+# COLOR CAL TYPE 3
+#
+
+def colorCalType3(dev, loadpaper_ui, colorcal_ui, photopenreq_ui):
+ value, state = 4, 0
+ ok = True
+ while state != -1:
+
+ if state == 0:
+ if colorCalType3PenCheck(dev):
+ state = 1
+ else:
+ state = 100
+
+ elif state == 1:
+ state = -1
+ ok = loadpaper_ui()
+ if ok:
+ colorCalType3Phase1(dev)
+ state = 2
+
+ elif state == 2:
+ state = -1
+ ok, valueA = colorcal_ui('A', 21)
+ if ok:
+ state = 3
+
+ elif state == 3:
+ state = -1
+ ok, valueB = colorcal_ui('B', 21)
+ if ok:
+ state = 4
+
+ elif state == 4:
+ colorCalType3Phase2(dev, valueA, valueB)
+ state = -1
+
+ elif state == 100:
+ photopenreq_ui()
+ ok = False
+ state = -1
+
+ return ok
+
+def colorCalType3PenCheck(dev):
+ pens = dev.getStatusFromDeviceID()['agents']
+ pen_types = [pens[x]['type'] for x in range(len(pens))]
+
+ if AGENT_TYPE_KCM in pen_types or \
+ AGENT_TYPE_BLUE in pen_types:
+ return True
+
+ else:
+ log.error("Cannot perform color calibration with no photo (or photo blue) pen installed.")
+ return False
+
+
+def colorCalType3Phase1(dev):
+ dev.writeEmbeddedPML(pml.OID_PRINT_INTERNAL_PAGE,
+ pml.PRINT_INTERNAL_PAGE_COLOR_CAL)
+ dev.closePrint()
+
+def colorCalType3Phase2(dev, A, B):
+ photo_adj = colorcal.PHOTO_ALIGN_TABLE[A-1][B-1]
+ color_adj = colorcal.COLOR_ALIGN_TABLE[A-1][B-1]
+ adj_value = (color_adj << 8L) + photo_adj
+
+ dev.writeEmbeddedPML(pml.OID_COLOR_CALIBRATION_SELECTION, adj_value)
+ dev.closePrint()
+
+def colorCalType4(dev, loadpaper_ui, colorcal_ui, wait_ui):
+ state = 0
+ ok = True
+
+ while state != -1:
+ if state == 0:
+ state = -1
+ ok = loadpaper_ui()
+ if ok:
+ colorCalType4Phase1(dev)
+ state = 2
+
+ elif state == 2:
+ state = -1
+ #wait_ui(90)
+ ok, values = colorcal_ui()
+ if ok:
+ state = 3
+
+ elif state == 3:
+ colorCalType4Phase2(dev, values)
+ #wait_ui(5)
+ state = 4
+
+ elif state == 4:
+ state = -1
+ ok = loadpaper_ui()
+ if ok:
+ colorCalType4Phase3(dev)
+ state = -1
+
+ return ok
+
+
+def colorCalType4Phase1(dev):
+ dev.setPML(pml.OID_PRINT_INTERNAL_PAGE,
+ pml.PRINT_INTERNAL_PAGE_COLOR_CAL)
+
+ dev.closePML()
+
+
+def colorCalType4AdjValue(value):
+ if value >= 100:
+ return 200
+ return value+100
+
+
+def colorCalType4Phase2(dev, values):
+ if -1 in values:
+ Cadj, Madj, Yadj, cadj, madj, kadj = 244, 244, 244, 244, 244, 244
+ else:
+ sel1, sel2, sel3, sel4 = values
+ tmp1 = colorcal.TYPE_4_C_TABLE[sel1][sel2]
+ tmp2 = colorcal.TYPE_4_LC_TABLE[sel3][sel4]
+
+ Cadj = colorCalType4AdjValue(tmp1)
+ cadj = colorCalType4AdjValue(tmp1+tmp2)
+
+ tmp1 = colorcal.TYPE_4_M_TABLE[sel1][sel2]
+ tmp2 = colorcal.TYPE_4_LM_TABLE[sel3][sel4]
+
+ Madj = colorCalType4AdjValue(tmp1)
+ madj = colorCalType4AdjValue(tmp1+tmp2)
+
+ Yadj = colorCalType4AdjValue(colorcal.TYPE_4_Y_TABLE[sel1][sel2])
+ kadj = colorCalType4AdjValue(0)
+
+ log.debug("C=%d, M=%d, Y=%d, c=%d, m=%d, k=%d\n" % (Cadj, Madj, Yadj, cadj, madj, kadj))
+
+ dev.setPML(pml.OID_COLOR_CALIBRATION_ARRAY_1,
+ kadj)
+
+ dev.setPML(pml.OID_COLOR_CALIBRATION_ARRAY_2,
+ Cadj)
+
+ dev.setPML(pml.OID_COLOR_CALIBRATION_ARRAY_3,
+ Madj)
+
+ dev.setPML(pml.OID_COLOR_CALIBRATION_ARRAY_4,
+ Yadj)
+
+ dev.setPML(pml.OID_COLOR_CALIBRATION_ARRAY_5,
+ cadj)
+
+ dev.setPML(pml.OID_COLOR_CALIBRATION_ARRAY_6,
+ madj)
+
+ dev.closePML()
+
+
+def colorCalType4Phase3(dev):
+ dev.setPML(pml.OID_PRINT_INTERNAL_PAGE,
+ pml.PRINT_INTERNAL_PAGE_COLOR_PALETTE_CMYK_PAGE)
+
+ dev.closePML()
+
+
+def colorCalType5(dev, loadpaper_ui):
+ if loadpaper_ui():
+ dev.printData("""\x1b%-12345X@PJL ENTER LANGUAGE=PCL3GUI\n\x1bE\x1b%Puifp.multi_button_push 20;\nudw.quit;\x1b*rC\x1bE\x1b%-12345X""")
+ dev.closePrint()
+
+
+def colorCalType6(dev, loadpaper_ui):
+ if loadpaper_ui():
+ dev.setPML(pml.OID_PRINT_INTERNAL_PAGE, pml.PRINT_INTERNAL_PAGE_COLOR_CAL)
+ dev.closePML()
+
+def colorCalType7(dev, loadpaper_ui):
+ if loadpaper_ui():
+ dev.setPML(pml.OID_PRINT_INTERNAL_PAGE, pml.PRINT_INTERNAL_PAGE_AUTOMATIC_COLOR_CALIBRATION)
+ dev.closePML()
+
+# ********************** LF Cal **********************
+
+def linefeedCalType1(dev, loadpaper_ui):
+ if loadpaper_ui():
+ dev.printData("""\x1b%-12345X@PJL ENTER LANGUAGE=PCL3GUI\n\x1bE\x1b%Puifp.multi_button_push 3;\nudw.quit;\x1b*rC\x1bE\x1b%-12345X""")
+ dev.closePrint()
+
+def linefeedCalType2(dev, loadpaper_ui):
+ if loadpaper_ui():
+ dev.setPML(pml.OID_PRINT_INTERNAL_PAGE, pml.PRINT_INTERNAL_PAGE_LINEFEED_CALIBRATION)
+ dev.closePML()
+
+
+# ********************** PQ Diag **********************
+
+def printQualityDiagType1(dev, loadpaper_ui):
+ if loadpaper_ui():
+ dev.printData("""\x1b%-12345X@PJL ENTER LANGUAGE=PCL3GUI\n\x1bE\x1b%Puifp.multi_button_push 14;\nudw.quit;\x1b*rC\x1bE\x1b%-12345X""")
+ dev.closePrint()
+
+def printQualityDiagType2(dev, loadpaper_ui):
+ if loadpaper_ui():
+ dev.setPML(pml.OID_PRINT_INTERNAL_PAGE, pml.PRINT_INTERNAL_PAGE_PRINT_QUALITY_DIAGNOSTIC)
+ dev.closePML()
diff --git a/base/mdns.py b/base/mdns.py
new file mode 100644
index 0000000..0d7c1c3
--- /dev/null
+++ b/base/mdns.py
@@ -0,0 +1,340 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2007 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+# RFC 1035
+
+# Std Lib
+import sys
+import time
+import socket
+import select
+import struct
+import random
+import re
+import cStringIO
+
+# Local
+from g import *
+import utils
+
+MAX_ANSWERS_PER_PACKET = 24
+
+QTYPE_A = 1
+QTYPE_TXT = 16
+QTYPE_SRV = 33
+QTYPE_AAAA = 28
+QTYPE_PTR = 12
+
+QCLASS_IN = 1
+
+
+def read_utf8(offset, data, l):
+ return offset+l, data[offset:offset+l].decode('utf-8')
+
+def read_data(offset, data, l):
+ return offset+l, data[offset:offset+l]
+
+def read_data_unpack(offset, data, fmt):
+ l = struct.calcsize(fmt)
+ return offset+l, struct.unpack(fmt, data[offset:offset+l])
+
+def read_name(offset, data):
+ result = ''
+ off = offset
+ next = -1
+ first = off
+
+ while True:
+ l = ord(data[off])
+ off += 1
+
+ if l == 0:
+ break
+
+ t = l & 0xC0
+
+ if t == 0x00:
+ off, utf8 = read_utf8(off, data, l)
+ result = ''.join([result, utf8, '.'])
+
+ elif t == 0xC0:
+ if next < 0:
+ next = off + 1
+
+ off = ((l & 0x3F) << 8) | ord(data[off])
+
+ if off >= first:
+ log.error("Bad domain name (circular) at 0x%04x" % off)
+ break
+
+ first = off
+
+ else:
+ log.error("Bad domain name at 0x%04x" % off)
+ break
+
+ if next >= 0:
+ offset = next
+
+ else:
+ offset = off
+
+ return offset, result
+
+
+def write_name(packet, name):
+ for p in name.split('.'):
+ utf8_string = p.encode('utf-8')
+ packet.write(struct.pack('!B', len(utf8_string)))
+ packet.write(utf8_string)
+
+
+def create_outgoing_packets(answers):
+ index = 0
+ num_questions = 1
+ first_packet = True
+ packets = []
+ packet = cStringIO.StringIO()
+ answer_record = cStringIO.StringIO()
+
+ while True:
+ packet.seek(0)
+ packet.truncate()
+
+ num_answers = len(answers[index:index+MAX_ANSWERS_PER_PACKET])
+
+ if num_answers == 0 and num_questions == 0:
+ break
+
+ flags = 0x0200 # truncated
+ if len(answers) - index <= MAX_ANSWERS_PER_PACKET:
+ flags = 0x0000 # not truncated
+
+ # ID/FLAGS/QDCOUNT/ANCOUNT/NSCOUNT/ARCOUNT
+ packet.write(struct.pack("!HHHHHH", 0x0000, flags, num_questions, num_answers, 0x0000, 0x0000))
+
+ if num_questions:
+ # QNAME
+ write_name(packet, "_pdl-datastream._tcp.local") # QNAME
+ packet.write(struct.pack("!B", 0x00))
+
+ # QTYPE/QCLASS
+ packet.write(struct.pack("!HH", QTYPE_PTR, QCLASS_IN))
+
+ first_record = True
+ for d in answers[index:index+MAX_ANSWERS_PER_PACKET]:
+ answer_record.seek(0)
+ answer_record.truncate()
+
+ # NAME
+ if not first_packet and first_record:
+ first_record = False
+ write_name(answer_record, "_pdl-datastream._tcp.local")
+ answer_record.write(struct.pack("!B", 0x00))
+ else:
+ answer_record.write(struct.pack("!H", 0xc00c)) # Pointer
+
+ # TYPE/CLASS
+ answer_record.write(struct.pack("!HH", QTYPE_PTR, QCLASS_IN))
+
+ # TTL
+ answer_record.write(struct.pack("!I", 0xffff))
+ rdlength_pos = answer_record.tell()
+
+ # RDLENGTH
+ answer_record.write(struct.pack("!H", 0x0000)) # (adj later)
+
+ # RDATA
+ write_name(answer_record, d)
+ answer_record.write(struct.pack("!H", 0xc00c)) # Ptr
+
+ # RDLENGTH
+ rdlength = answer_record.tell() - rdlength_pos - 2
+ answer_record.seek(rdlength_pos)
+ answer_record.write(struct.pack("!H", rdlength))
+
+ answer_record.seek(0)
+ packet.write(answer_record.read())
+
+ packets.append(packet.getvalue())
+
+ index += 20
+
+ if first_packet:
+ num_questions = 0
+ first_packet = False
+
+ return packets
+
+
+
+def detectNetworkDevices(ttl=4, timeout=10):
+ mcast_addr, mcast_port ='224.0.0.251', 5353
+ found_devices = {}
+ answers = []
+
+ try:
+ s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
+ x = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
+ x.connect(('1.2.3.4', 56))
+ intf = x.getsockname()[0]
+ x.close()
+
+ s.setblocking(0)
+ ttl = struct.pack('B', ttl)
+ except socket.error:
+ log.error("Network error")
+ return {}
+
+ try:
+ s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
+ s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
+ except (AttributeError, socket.error):
+ pass
+
+ try:
+ s.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_TTL, ttl)
+ s.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_IF, socket.inet_aton(intf) + socket.inet_aton('0.0.0.0'))
+ s.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_LOOP ,1)
+ except Exception, e:
+ log.error("Unable to setup multicast socket for mDNS: %s" % e)
+ return {}
+
+ now = time.time()
+ next = now
+ last = now + timeout
+ delay = 1
+
+ while True:
+ now = time.time()
+
+ if now > last:
+ break
+
+ if now >= next:
+ try:
+ for p in create_outgoing_packets(answers):
+ log.debug("Outgoing: (%d)" % len(p))
+ log.log_data(p, width=16)
+ s.sendto(p, 0, (mcast_addr, mcast_port))
+
+ except socket.error, e:
+ log.error("Unable to send broadcast DNS packet: %s" % e)
+
+ next += delay
+ delay *= 2
+
+ update_spinner()
+
+ r, w, e = select.select([s], [], [s], 0.5)
+
+ if not r:
+ continue
+
+ data, addr = s.recvfrom(16384)
+
+ if data:
+ update_spinner()
+ y = {'num_devices' : 1, 'num_ports': 1, 'product_id' : '', 'mac': '',
+ 'status_code': 0, 'device2': '0', 'device3': '0', 'note': ''}
+
+ log.debug("Incoming: (%d)" % len(data))
+ log.log_data(data, width=16)
+
+ offset = 0
+ offset, (id, flags, num_questions, num_answers, num_authorities, num_additionals) = \
+ read_data_unpack(offset, data, "!HHHHHH")
+
+ log.debug("Response: ID=%d FLAGS=0x%x Q=%d A=%d AUTH=%d ADD=%d" %
+ (id, flags, num_questions, num_answers, num_authorities, num_additionals))
+
+ for question in range(num_questions):
+ update_spinner()
+ offset, name = read_name(offset, data)
+ offset, (typ, cls) = read_data_unpack(offset, data, "!HH")
+ log.debug("Q: %s TYPE=%d CLASS=%d" % (name, typ, cls))
+
+ fmt = '!HHiH'
+ for record in range(num_answers + num_authorities + num_additionals):
+ update_spinner()
+ offset, name = read_name(offset, data)
+ offset, info = read_data_unpack(offset, data, "!HHiH")
+
+ if info[0] == QTYPE_A: # ipv4 address
+ offset, result = read_data(offset, data, 4)
+ ip = '.'.join([str(ord(x)) for x in result])
+ log.debug("A: %s" % ip)
+ y['ip'] = ip
+
+ elif info[0] == QTYPE_PTR: # PTR
+ offset, name = read_name(offset, data)
+ log.debug("PTR: %s" % name)
+ y['mdns'] = name
+ answers.append(name.replace("._pdl-datastream._tcp.local.", ""))
+
+ elif info[0] == QTYPE_TXT:
+ offset, name = read_data(offset, data, info[3])
+ txt, off = {}, 0
+
+ while off < len(name):
+ l = ord(name[off])
+ off += 1
+ result = name[off:off+l]
+
+ try:
+ key, value = result.split('=')
+ txt[key] = value
+ except ValueError:
+ pass
+
+ off += l
+
+ log.debug("TXT: %s" % repr(txt))
+ try:
+ y['device1'] = "MFG:Hewlett-Packard;MDL:%s;CLS:PRINTER;" % txt['ty']
+ except KeyError:
+ log.debug("NO ty Key in txt: %s" % repr(txt))
+
+ if 'note' in txt:
+ y['note'] = txt['note']
+
+ elif info[0] == QTYPE_SRV:
+ offset, (priority, weight, port) = read_data_unpack(offset, data, "!HHH")
+ ttl = info[3]
+ offset, server = read_name(offset, data)
+ log.debug("SRV: %s TTL=%d PRI=%d WT=%d PORT=%d" % (server, ttl, priority, weight, port))
+ y['hn'] = server.replace('.local.', '')
+
+ elif info[0] == QTYPE_AAAA: # ipv6 address
+ offset, result = read_data(offset, data, 16)
+ log.debug("AAAA: %s" % repr(result))
+
+ else:
+ log.error("Unknown DNS record type (%d)." % info[0])
+ break
+
+ found_devices[y['ip']] = y
+
+ log.debug("Found %d devices" % len(found_devices))
+
+ return found_devices
+
+
diff --git a/base/mfpdtf.py b/base/mfpdtf.py
new file mode 100644
index 0000000..8d889b5
--- /dev/null
+++ b/base/mfpdtf.py
@@ -0,0 +1,504 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2007 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+# Std Lib
+import struct
+import cStringIO
+
+# Local
+from g import *
+from codes import *
+
+# Page flags
+NEW_PAGE = 0x01
+END_PAGE = 0x02
+NEW_DOCUMENT = 0x04
+END_DOCUMENT = 0x08
+END_STREAM = 0x10
+RESERVED_20 = 0x20
+RESERVED_40 = 0x40
+RESERVED_80 = 0x80
+
+MFPDTF_RASTER_BITMAP = 0
+MFPDTF_RASTER_GRAYMAP = 1
+MFPDTF_RASTER_MH = 2
+MFPDTF_RASTER_MR = 3
+MFPDTF_RASTER_MMR = 4
+MFPDTF_RASTER_RGB = 5
+MFPDTF_RASTER_YCC411 = 6
+MFPDTF_RASTER_JPEG = 7
+MFPDTF_RASTER_PCL = 8
+MFPDTF_RASTER_NOT = 9
+
+# Data types for FH
+DT_UNKNOWN = 0
+DT_FAX_IMAGES = 1
+DT_SCANNED_IMAGES= 2
+DT_DIAL_STRINGS = 3
+DT_DEMO_PAGES = 4
+DT_SPEED_DIALS = 5
+DT_FAX_LOGS = 6
+DT_CFG_PARMS = 7
+DT_LANG_STRS = 8
+DT_JUNK_FAX_CSIDS= 9
+DT_REPORT_STRS = 10
+DT_FONTS = 11
+DT_TTI_BITMAP = 12
+DT_COUNTERS = 13
+DT_DEF_PARMS = 14
+DT_SCAN_OPTIONS = 15
+DT_FW_JOB_TABLE = 17
+
+# Raster data record types
+RT_START_PAGE = 0
+RT_RASTER = 1
+RT_END_PAGE = 2
+
+# FH
+FIXED_HEADER_SIZE = 8
+
+# Variants
+IMAGE_VARIANT_HEADER_SIZE = 10
+DIAL_STRINGS_VARIANT_HEADER_SIZE = 6
+FAX_IMAGE_VARIANT_HEADER_SIZE = 74
+
+# Data records
+SOP_RECORD_SIZE = 36
+RASTER_RECORD_SIZE = 4
+EOP_RECORD_SIZE = 12
+DIAL_STRING_RECORD_SIZE = 51
+
+# Page flags
+PAGE_FLAG_NEW_PAGE = 0x01
+PAGE_FLAG_END_PAGE = 0x02
+PAGE_FLAG_NEW_DOC = 0x04
+PAGE_FLAG_END_DOC = 0x08
+PAGE_FLAG_END_STREAM = 0x10
+
+# Fax data variant header data source
+SRC_UNKNOWN = 0
+SRC_HOST = 2
+SRC_SCANNER = 5
+SRC_HOST_THEN_SCANNER = 6
+SRC_SCANNER_THEN_HOST = 7
+
+# Fax data variant header TTI header control
+TTI_NONE = 0
+TTI_PREPENDED_TO_IMAGE = 1
+TTI_OVERLAYED_ON_IMAGE = 2
+
+MAJOR_VER = 2
+MINOR_VER = 0
+
+
+def parseFixedHeader(buffer):
+ fmt = "<IHBB"
+ block_len, header_len, data_type, page_flags = struct.unpack(fmt, buffer[:8])
+ page_flags = page_flags & 0x1f
+ return block_len, header_len, data_type, page_flags
+
+def parseImageVariantHeader(buffer, data_type):
+ if data_type == DT_SCANNED_IMAGES:
+ fmt = "<BBHHHH"
+ major_ver, minor_ver, src_pages, copies_per_page, zoom, jpeg_q_factor = struct.unpack(fmt, buffer[:10])
+ return major_ver, minor_ver, src_pages, copies_per_page, zoom, jpeg_q_factor
+ elif data_type == DT_FAX_IMAGES:
+ pass
+
+def parseRecord(buffer):
+ record_type = struct.unpack("<B", buffer[0])[0]
+
+ if record_type == RT_START_PAGE:
+ fmt = "<BBHHHIIIHHIII"
+ id, encoding, page_num, black_ppr, black_bpp, black_rpp, black_hort_dpi, black_vert_dpi, cmy_ppr, cmy_bpp, cmy_rpp, cmy_hort_dpi, cmy_vert_dpi = \
+ struct.unpack(fmt, buffer[:SOP_RECORD_SIZE])
+ assert id == record_type
+ return id, (encoding, page_num, black_ppr, black_bpp, black_rpp, black_hort_dpi, black_vert_dpi, cmy_ppr, cmy_bpp, cmy_rpp, cmy_hort_dpi, cmy_vert_dpi)
+
+ elif record_type == RT_RASTER:
+ fmt = "<BBH"
+ id, unused, data_size = struct.unpack(fmt, buffer[:RASTER_RECORD_SIZE])
+ assert id == record_type
+ return id, (unused, data_size)
+
+ elif record_type == RT_END_PAGE:
+ fmt = "<BBBBII"
+ id, unused1, unused2, unused3, black_rows, cmy_rows = struct.unpack(fmt, buffer[:EOP_RECORD_SIZE])
+ assert id == record_type
+ return id, (unused1, unused2, unused3, black_rows, cmy_rows)
+
+ log.error("Error: Invalid record type: %d" % record_type)
+ raise Error(ERROR_INTERNAL)
+
+
+
+def readChannelToStream(device, channel_id, stream, single_read=True, callback=None):
+ STATE_END, STATE_FIXED_HEADER, STATE_VARIANT_HEADER, STATE_RECORD = range(4)
+ state, total_bytes, block_remaining, header_remaining, data_remaining = 1, 0, 0, 0, 0
+ endScan = False
+ while state != STATE_END:
+ log.debug("**** State %d ****" % state)
+ if state == STATE_FIXED_HEADER:
+
+ if endScan:
+ state = STATE_END
+ break
+
+ if data_remaining == 0:
+ fields, data = device.readChannel(channel_id)
+ data_remaining = len(data)
+ if callback is not None:
+ endScan = callback()
+
+ block_len, header_len, data_type, page_flags = parseFixedHeader(data)
+ block_remaining, header_remaining = block_len-FIXED_HEADER_SIZE, header_len-FIXED_HEADER_SIZE
+ log.debug("Fixed header: (datalen=%d(0x%x),blocklen=%d(0x%x),headerlen=%d(0x%x),datatype=0x%x,pageflags=0x%x)" %
+ (len(data), len(data), block_len, block_len, header_len, header_len, data_type, page_flags))
+ data_remaining -= FIXED_HEADER_SIZE
+ data = data[FIXED_HEADER_SIZE:]
+ state = STATE_RECORD
+ log.debug("Data: data=%d,block=%d,header=%d" % (data_remaining, block_remaining, header_remaining))
+
+ if page_flags & PAGE_FLAG_END_STREAM:
+ state = STATE_END
+ break
+
+ if header_remaining > 0:
+ state = STATE_VARIANT_HEADER
+
+
+ elif state == STATE_VARIANT_HEADER:
+ if data_type == DT_SCANNED_IMAGES:
+ major_ver, minor_ver, src_pages, copies_per_page, zoom, jpeg_q_factor = parseImageVariantHeader(data, data_type)
+ log.debug("Variant header: (major/minor=%d/%d,src_pages=%d,copies_per_page=%d,zoom=%d,jpeg_q_factor=%d" %
+ (major_ver, minor_ver, src_pages, copies_per_page, zoom, jpeg_q_factor))
+ data = data[IMAGE_VARIANT_HEADER_SIZE:]
+ block_remaining -= IMAGE_VARIANT_HEADER_SIZE
+ header_remaining -= IMAGE_VARIANT_HEADER_SIZE
+ data_remaining -= IMAGE_VARIANT_HEADER_SIZE
+
+ elif data_type == DT_FAX_IMAGES:
+ log.error("Unsupported data type")
+
+ else:
+ log.error("Unsupported data type")
+
+ log.debug("Data: data=%d,block=%d,header=%d" % (data_remaining, block_remaining, header_remaining))
+
+ if header_remaining > 0:
+ log.error("Header size error.")
+ state = STATE_END
+ continue
+
+ state = STATE_RECORD
+ if block_remaining == 0:
+ state = STATE_FIXED_HEADER
+ continue
+
+ elif state == STATE_RECORD:
+ record_type, record = parseRecord(data)
+
+ if record_type == RT_START_PAGE:
+ encoding, page_num, black_ppr, black_bpp, black_rpp, black_hort_dpi, black_vert_dpi, \
+ cmy_ppr, cmy_bpp, cmy_rpp, cmy_hort_dpi, cmy_vert_dpi = record
+ log.debug("Start page record: (encoding=0x%x, page=%d)" % (encoding, page_num))
+ data = data[SOP_RECORD_SIZE:]
+ block_remaining -= SOP_RECORD_SIZE
+ data_remaining -= SOP_RECORD_SIZE
+ if block_remaining != 0:
+ log.error("Block size error.")
+ state = STATE_END
+ continue
+
+ if single_read:
+ state = STATE_END
+ else:
+ state = STATE_FIXED_HEADER
+ log.debug("Data: data=%d,block=%d,header=%d" % (data_remaining, block_remaining, header_remaining))
+ continue
+
+ elif record_type == RT_RASTER:
+ unused, data_size = record
+ log.debug("Raster record: (data size=%d(0x%x))" % (data_size, data_size))
+ data = data[RASTER_RECORD_SIZE:]
+ block_remaining -= RASTER_RECORD_SIZE
+ data_remaining -= RASTER_RECORD_SIZE
+ log.debug("Data: data=%d,block=%d,header=%d" % (data_remaining, block_remaining, header_remaining))
+
+ if block_remaining > 0 and data_remaining > 0:
+ log.debug("Writing remainder of data...")
+ data_len = len(data)
+ log.debug("Data len=%d(0x%x)" % (data_len,data_len))
+ stream.write(data[:block_remaining])
+ block_remaining -= data_len
+ data_remaining -= data_len
+
+ if data_remaining != 0:
+ log.error("Data size error")
+ state = STATE_END
+ continue
+
+ while block_remaining > 0:
+ if endScan:
+ #state = STATE_END
+ break
+
+ log.debug("Reading more data from device...")
+ fields, data = device.readChannel(channel_id)
+
+ if callback is not None:
+ endScan = callback()
+
+ data_len = len(data)
+ log.debug("Data len=%d(0x%x)" % (data_len,data_len))
+ stream.write(data[:block_remaining])
+ total_bytes += data_len
+ block_remaining -= data_len
+
+ if block_remaining != 0:
+ log.error("Block size error.")
+ state = STATE_END
+ continue
+
+ state = STATE_FIXED_HEADER
+ continue
+
+ elif record_type == RT_END_PAGE:
+ unused1, unused2, unused3, black_rows, cmy_rows = record
+ log.debug("End page record: (black_rows=%d,cmy_rows=%d)" % (black_rows, cmy_rows))
+ data = data[EOP_RECORD_SIZE:]
+ block_remaining -= EOP_RECORD_SIZE
+ data_remaining -= EOP_RECORD_SIZE
+ if block_remaining != 0:
+ log.error("Block size error.")
+ log.debug("Data: data=%d,block=%d,header=%d" % (data_remaining, block_remaining, header_remaining))
+
+ if page_flags & PAGE_FLAG_END_DOC or \
+ page_flags & PAGE_FLAG_END_STREAM:
+ state = STATE_END
+ else:
+ state = STATE_FIXED_HEADER
+ continue
+
+ log.debug("Read %d bytes" % total_bytes)
+ return endScan
+
+
+
+def buildMFPDTFBlock(data_type, page_flags=0, send_variant=False, data=None):
+ # Fixed header
+ # [Variant header - dial, fax, or scan]
+ # Data Record
+
+ block = cStringIO.StringIO()
+ block.write(struct.pack("<I", 0)) # Block len (4bytes)
+ header_len = FIXED_HEADER_SIZE
+
+ if send_variant:
+ if data_type == DT_DIAL_STRINGS:
+ header_len += DIAL_STRINGS_VARIANT_HEADER_SIZE
+
+ elif data_type == DT_FAX_IMAGES:
+ header_len += FAX_IMAGE_VARIANT_HEADER_SIZE
+
+ block.write(struct.pack("<H", header_len)) # Header len (2 bytes)
+ block.write(struct.pack("<B", data_type)) # Data type (1 byte)
+ block.write(struct.pack("<B", page_flags)) # Page flags (1 byte)
+
+ if send_variant:
+ if data_type == DT_DIAL_STRINGS:
+ block.write(struct.pack("<BB", MAJOR_VER, MINOR_VER))
+ block.write(struct.pack("<H", 1)) # num strings
+ block.write(struct.pack("<H", 51)) # ?
+
+ elif data_type == DT_FAX_IMAGES:
+ block.write(struct.pack("<BB", MAJOR_VER, MINOR_VER))
+ block.write(struct.pack("<B", SRC_HOST)) # Data source (1 byte)
+ block.write(struct.pack("<H", 1)) # Num pages (2 bytes)
+ block.write(struct.pack("<B", TTI_NONE)) # TTI control
+ block.write(struct.pack("<I", 0)) # time (4 bytes)
+ block.write("\x00"*20) # T30_CSI (20 bytes)
+ block.write("\x20"*20) # T30_SUB (20 bytes)
+ block.write("\x20"*20) # T30_PWD (20 bytes)
+ block.write("<I", 0) # xaction ID (4 bytes)
+
+ if data_type == DT_DIAL_STRINGS:
+ if data is not None:
+ dial_string = data['dial-string']
+ block.write(dial_string)
+ block.write('\x00'*(51-len(dial_string)))
+
+ elif data_type == DT_FAX_IMAGES:
+ pass
+
+
+ # fixed header (8 bytes):
+ #
+ # +----------------------------+
+ # | |
+ # | block len (32 bits) |
+ # | length of entire |
+ # | block of data |
+ # +----------------------------+
+ # | |
+ # | header length (16 bits) |
+ # | length of fixed and |
+ # | variant header (if any) |
+ # | ==8 if no variant (fixed |
+ # | only |
+ # | >8 if variant header |
+ # | |
+ # +----------------------------+
+ # | | 1=FAX
+ # | data type (8 bits) | 3=DIAL_STRINGS
+ # | data type of data record(s)| 12=TTI BITMAP
+ # | |
+ # +----------------------------+
+ # | |
+ # | page flags (8 bits) |
+ # | |
+ # +----------------------------+
+ #
+ # followed by variant header and/or
+ # data record(s)...
+ #
+ # image header variant (10 bytes)
+ #
+ # +----------------------------+
+ # | |
+ # | major ver (8 bits) |
+ # | |
+ # +----------------------------+
+ # | |
+ # | minor ver (8 bits) |
+ # | |
+ # +----------------------------+
+ # | |
+ # | source pages (16 bits) |
+ # | |
+ # +----------------------------+
+ # | |
+ # | copies/page (16 bits) |
+ # | |
+ # +----------------------------+
+ # | |
+ # | zoom factor (16 bits) |
+ # | |
+ # +----------------------------+
+ # | |
+ # | jpeg Q factor (16 bits) |
+ # | |
+ # +----------------------------+
+ #
+ # dial strings variant header (6 bytes)
+ #
+ # +----------------------------+
+ # | |
+ # | major ver (8 bits) |
+ # | |
+ # +----------------------------+
+ # | |
+ # | minor ver (8 bits) |
+ # | |
+ # +----------------------------+
+ # | |
+ # | num strings (16 bits) |
+ # | |
+ # +----------------------------+
+ # | |
+ # | dial string len (16 bits) |
+ # | |
+ # +----------------------------+
+ #
+ # dial string data part
+ # +----------------------------+
+ # | |
+ # | dial string (51 bytes) |
+ # | |
+ # +----------------------------+
+ #
+ # start page (SOP) record (36 bytes)
+ #
+ # +----------------------------+
+ # | |
+ # | id = 0 (8 bits) |
+ # | |
+ # +----------------------------+
+ # | |
+ # | encoding (8 bits) |
+ # | |
+ # +----------------------------+
+ # | |
+ # | page num (16 bits) |
+ # | |
+ # +----------------------------+
+ # | |
+ # | black data desc (16 bytes) |
+ # | |
+ # +----------------------------+
+ # | |
+ # | cmy data desc (16 bytes) |
+ # | |
+ # +----------------------------+
+ #
+ #
+ # raster data record (4 bytes + data)
+ #
+ # +----------------------------+
+ # | |
+ # | id = 1 (8 bits) |
+ # | |
+ # +----------------------------+
+ # | |
+ # | unused (8 bits) |
+ # | |
+ # +----------------------------+
+ # | |
+ # | data bytes (n) (16 bits) |
+ # | |
+ # +----------------------------+
+ # | |
+ # | data (n bytes) |
+ # | |
+ # +----------------------------+
+ #
+ #
+ # end page (EOP) record (12 bytes)
+ #
+ # +----------------------------+
+ # | |
+ # | id = 2 (8 bits) |
+ # | |
+ # +----------------------------+
+ # | |
+ # | unused (24 bits) |
+ # | |
+ # +----------------------------+
+ # | |
+ # | rows of black (32 bits) |
+ # | |
+ # +----------------------------+
+ # | |
+ # | rows of cmy (32 bits) |
+ # | |
+ # +----------------------------+
+ #
+
diff --git a/base/models.py b/base/models.py
new file mode 100644
index 0000000..87b88fe
--- /dev/null
+++ b/base/models.py
@@ -0,0 +1,577 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2008 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch, Naga Samrat Chowdary Narla,
+
+# Local
+from base.g import *
+from base import utils
+
+# StdLib
+import os.path
+import re
+import glob
+
+try:
+ import datetime
+ datetime_avail = True
+except ImportError:
+ datetime_avail = False
+ datetime = None
+
+
+pat_prod_num = re.compile("""(\d+)""", re.I)
+
+TYPE_UNKNOWN = 0
+TYPE_STRING = 1
+TYPE_STR = 1
+TYPE_LIST = 2
+TYPE_BOOL = 3
+TYPE_INT = 4
+TYPE_HEX = 5
+TYPE_BITFIELD = 6
+TYPE_URI = TYPE_STR # (7) not used (yet)
+TYPE_DATE = 8 # format: mm/dd/yyyy
+
+
+TECH_CLASSES = [
+ "Undefined", # This will show an error (and its the default)
+ "Unsupported", # This is for unsupported models, and it will not show an error
+ "Postscript",
+ "DJGenericVIP",
+ #"PSB9100", not used on HPLIP
+ "LJMono",
+ "LJColor",
+ "LJFastRaster",
+ "LJJetReady",
+ "DJ350",
+ #"DJ400", not used on HPLIP
+ "DJ540",
+ "DJ600",
+ "DJ6xx",
+ "DJ6xxPhoto",
+ "DJ630",
+ #"DJ660", not used in HPLIP
+ "DJ8xx",
+ "DJ8x5",
+ "DJ850",
+ "DJ890",
+ "DJ9xx",
+ "DJ9xxVIP",
+ "DJ3600",
+ "DJ3320",
+ "DJ4100",
+ "AP2xxx",
+ "AP21xx",
+ "AP2560",
+ "PSP100",
+ "PSP470",
+ "LJZjsMono",
+ "LJZjsColor",
+ "LJm1005",
+ "QuickConnect",
+ "DJ55xx",
+ "OJProKx50",
+ 'LJP1XXX',
+ #'DJD2600', not used. Reassigned all these to ViperPlusTrim and ViperMinusTrim Class
+ "Stabler",
+ "ViperPlusVIP",
+ "ViperMinusVIP",
+ "ViperPlusTrim",
+ "ViperMinusTrim",
+ "Corbett",
+ "Python",
+ "OJ7000",
+ "Pyramid",
+ "Python10",
+ "Mimas",
+ "StingrayOJ",
+ "Copperhead",
+ "Ampere",
+ "Python11",
+ "Saipan",
+]
+
+TECH_CLASSES.sort()
+
+TECH_CLASS_PDLS = {
+ #"Undefined" : '?',
+ "Postscript" : 'ps',
+ "DJGenericVIP" : 'pcl3',
+ #"PSB9100" : 'pcl3',
+ "LJMono" : 'pcl3',
+ "LJColor" : 'pcl3',
+ "LJFastRaster" : 'pclxl',
+ "LJJetReady" : 'pclxl',
+ "DJ350" : 'pcl3',
+ #"DJ400" : 'pcl3',
+ "DJ540" : 'pcl3',
+ "DJ600" : 'pcl3',
+ "DJ6xx" : 'pcl3',
+ "DJ6xxPhoto" : 'pcl3',
+ "DJ630" : 'pcl3',
+ #"DJ660" : 'pcl3',
+ "DJ8xx" : 'pcl3',
+ "DJ8x5" : 'pcl3',
+ "DJ850" : 'pcl3',
+ "DJ890" : 'pcl3',
+ "DJ9xx" : 'pcl3',
+ "DJ9xxVIP" : 'pcl3',
+ "DJ3600" : 'lidil',
+ "DJ3320" : 'lidil',
+ "DJ4100" : 'lidil',
+ "AP2xxx" : 'pcl3',
+ "AP21xx" : 'pcl3',
+ "AP2560" : 'pcl3',
+ "PSP100" : 'pcl3',
+ "PSP470" : 'pcl3',
+ "LJZjsMono" : 'zjs',
+ "LJZjsColor" : 'zjs',
+ "LJm1005" : 'zxs',
+ "QuickConnect" : 'jpeg',
+ "DJ55xx" : 'pcl3',
+ "OJProKx50" : 'pcl3',
+ 'LJP1XXX' : 'zxs',
+ "Stabler" : 'pcl3',
+ "ViperPlusVIP" : 'pcl3',
+ "ViperMinusVIP": 'pcl3',
+ "ViperPlusTrim" : 'lidil',
+ "ViperMinusTrim": 'lidil',
+ "Corbett" : 'pcl3',
+ "Python" : 'pcl3',
+ "OJ7000" : 'pcl3',
+ "Python10" : 'pcl3',
+ "Mimas" : 'pcl3',
+ "StingrayOJ" : 'pcl3',
+ "Copperhead" : 'pcl3',
+ "Copperhead12" : 'pcl3',
+ "Ampere" : 'pcl3'
+}
+
+PDL_TYPE_PCL = 0 # less preferred
+PDL_TYPE_PS = 1 # /\
+PDL_TYPE_HOST = 2 # more preferred (however, may req. plugin)
+
+PDL_TYPES = { # Used to prioritize PPD file selection in prnt.cups.getPPDFile2()
+ 'pcl3' : PDL_TYPE_PCL,
+ 'pcl5' : PDL_TYPE_PCL,
+ 'pcl6' : PDL_TYPE_PCL,
+ 'pcl5e' : PDL_TYPE_PCL,
+ 'pcl' : PDL_TYPE_PCL,
+ 'pclxl' : PDL_TYPE_PCL,
+ 'ps' : PDL_TYPE_PS,
+ 'lidil' : PDL_TYPE_HOST,
+ 'zjs' : PDL_TYPE_HOST,
+ 'zjstream' : PDL_TYPE_HOST,
+ 'zxs' : PDL_TYPE_HOST,
+ 'zxstream' : PDL_TYPE_HOST,
+ 'jpeg' : PDL_TYPE_HOST,
+ 'jpg' : PDL_TYPE_HOST,
+ 'jetready' : PDL_TYPE_HOST,
+ 'jr' : PDL_TYPE_HOST,
+}
+
+
+TECH_SUBCLASSES = [
+ "LargeFormatSuperB",
+ "LargeFormatA3",
+ "CoverMedia", # 3425
+ "FullBleed",
+ "Duplex",
+ "Normal",
+ "Apollo2000",
+ "Apollo2200",
+ "Apollo2500",
+ "NoPhotoMode",
+ "NoPhotoBestHiresModes",
+ "No1200dpiNoSensor",
+ "NoFullBleed",
+ "4x6FullBleed",
+ "300dpiOnly", # LaserJet 4L
+ "GrayscaleOnly", # DJ540
+ "NoAutoTray", # PS Pro 8850
+ "NoEvenDuplex", # PS C8100
+ "NoAutoDuplex",
+ "NoCDDVD",
+ "NoMaxDPI",
+ "NoMaxDPI",
+ "SmallMargins",
+ "Trim",
+ "4800x1200dpi",
+ "Advanced",
+ "AutoDuplex"
+]
+
+TECH_SUBCLASSES.sort()
+
+
+# Items will be capitalized unless in this dict
+MODEL_UI_REPLACEMENTS = {'laserjet' : 'LaserJet',
+ 'psc' : 'PSC',
+ 'hp' : 'HP',
+ 'mfp' : 'MFP',
+ }
+
+
+def normalizeModelUIName(model):
+ ml = model.lower().strip()
+
+ if 'apollo' in ml:
+ z = ml.replace('_', ' ')
+ else:
+ if ml.startswith("hp"):
+ z = ml[3:].replace('_', ' ')
+ else:
+ z = ml.replace('_', ' ')
+
+ y = []
+ for x in z.split():
+ if pat_prod_num.search(x): # don't cap items like cp1700dn
+ y.append(x)
+ else:
+ y.append(MODEL_UI_REPLACEMENTS.get(x, x.capitalize()))
+
+ if 'apollo' in ml:
+ return ' '.join(y)
+ else:
+ return "HP " + ' '.join(y)
+
+
+def normalizeModelName(model):
+ return utils.xstrip(model.replace(' ', '_').replace('__', '_').replace('~','').replace('/', '_'), '_')
+
+
+class ModelData:
+ def __init__(self, root_path=None):
+ if root_path is None:
+ self.root_path = prop.models_dir
+ else:
+ self.root_path = root_path
+
+ self.__cache = {}
+ self.reset_includes()
+ self.sec = re.compile(r'^\[(.*)\]')
+ self.inc = re.compile(r'^\%include (.*)', re.I)
+ self.inc_line = re.compile(r'^\%(.*)\%')
+ self.eq = re.compile(r'^([^=]+)=(.*)')
+ self.date = re.compile(r'^(\d{1,2})/(\d{1,2})/(\d{4,4})')
+
+ files = [(os.path.join(self.root_path, "models.dat"),
+ os.path.join(self.root_path, "unreleased", "unreleased.dat")),
+ (os.path.join(os.getcwd(), 'data', 'models', 'models.dat'),
+ os.path.join(os.getcwd(), 'data', 'models', 'unreleased', 'unreleased.dat'))]
+
+ for self.released_dat, self.unreleased_dat in files:
+ if os.path.exists(self.released_dat):
+ break
+
+ else:
+ self.released_dat, self.unreleased_dat = None, None
+ log.error("Unable to locate models.dat file")
+
+ self.FIELD_TYPES = {
+ # Static model query data (from models.dat)
+ 'align-type' : TYPE_INT,
+ 'clean-type' : TYPE_INT,
+ 'color-cal-type' : TYPE_INT,
+ 'copy-type' : TYPE_INT,
+ 'embedded-server-type' : TYPE_INT,
+ 'fax-type' : TYPE_INT,
+ 'fw-download' : TYPE_BOOL,
+ 'icon' : TYPE_STR,
+ 'io-mfp-mode' : TYPE_INT,
+ 'io-mode' : TYPE_INT,
+ 'io-support' : TYPE_BITFIELD,
+ 'job-storage' : TYPE_INT,
+ 'monitor-type' : TYPE_INT,
+ 'linefeed-cal-type' : TYPE_INT,
+ 'panel-check-type' : TYPE_INT,
+ 'pcard-type' : TYPE_INT,
+ 'plugin' : TYPE_INT,
+ 'plugin-reason' : TYPE_BITFIELD,
+ 'power-settings': TYPE_INT,
+ 'pq-diag-type' : TYPE_INT,
+ 'r-type' : TYPE_INT,
+ 'scan-type' : TYPE_INT,
+ 'scan-src' : TYPE_INT,
+ #'scan-duplex' : TYPE_BOOL,
+ 'status-battery-check' : TYPE_INT,
+ 'status-dynamic-counters' : TYPE_INT,
+ 'status-type' : TYPE_INT,
+ 'support-subtype' : TYPE_HEX,
+ 'support-released' : TYPE_BOOL,
+ 'support-type' : TYPE_INT,
+ 'support-ver' : TYPE_STR,
+ 'tech-class' : TYPE_LIST,
+ 'tech-subclass' : TYPE_LIST,
+ 'tech-type' : TYPE_INT,
+ 'usb-pid' : TYPE_HEX,
+ 'usb-vid' : TYPE_HEX,
+ 'wifi-config': TYPE_INT,
+ 'ppd-name' : TYPE_STR,
+ }
+
+ self.FIELD_TYPES_DYN = {
+ # Dynamic model data (from device query)
+ 'dev-file' : TYPE_STR,
+ 'fax-uri' : TYPE_STR,
+ 'scan-uri' : TYPE_STR,
+ 'is-hp' : TYPE_BOOL,
+ 'host' : TYPE_STR,
+ 'status-desc' : TYPE_STR,
+ 'cups-printers' : TYPE_STR,
+ 'serial' : TYPE_STR,
+ 'error-state' : TYPE_INT,
+ 'device-state' : TYPE_INT,
+ 'panel' : TYPE_INT,
+ 'device-uri' : TYPE_STR,
+ 'panel-line1' : TYPE_STR,
+ 'panel-line2' : TYPE_STR,
+ 'back-end' : TYPE_STR,
+ 'port' : TYPE_INT,
+ 'deviceid' : TYPE_STR,
+ 'cups-uri' : TYPE_STR,
+ 'status-code' : TYPE_INT,
+ 'rs' : TYPE_STR,
+ 'rr' : TYPE_STR,
+ 'rg' : TYPE_STR,
+ 'r' : TYPE_INT,
+ 'duplexer' : TYPE_INT,
+ 'supply-door' : TYPE_INT,
+ 'revision' : TYPE_INT,
+ 'media-path' : TYPE_INT,
+ 'top-door' : TYPE_BOOL,
+ 'photo-tray' : TYPE_BOOL,
+ }
+
+ self.RE_FIELD_TYPES = {
+ re.compile('^r(\d+)-agent(\d+)-kind', re.IGNORECASE) : TYPE_INT,
+ re.compile('^r(\d+)-agent(\d+)-type', re.IGNORECASE) : TYPE_INT,
+ re.compile('^r(\d+)-agent(\d+)-sku', re.IGNORECASE) : TYPE_STR,
+ re.compile('^agent(\d+)-desc', re.IGNORECASE) : TYPE_STR,
+ re.compile('^agent(\d+)-virgin', re.IGNORECASE) : TYPE_BOOL,
+ re.compile('^agent(\d+)-dvc', re.IGNORECASE) : TYPE_INT,
+ re.compile('^agent(\d+)-kind', re.IGNORECASE) : TYPE_INT,
+ re.compile('^agent(\d+)-type', re.IGNORECASE) : TYPE_INT,
+ re.compile('^agent(\d+)-id', re.IGNORECASE) : TYPE_INT,
+ re.compile('^agent(\d+)-hp-ink', re.IGNORECASE) : TYPE_BOOL,
+ re.compile('^agent(\d+)-health-desc', re.IGNORECASE) : TYPE_STR,
+ re.compile('^agent(\d+)-health$', re.IGNORECASE) : TYPE_INT,
+ re.compile('^agent(\d+)-known', re.IGNORECASE) : TYPE_BOOL,
+ re.compile('^agent(\d+)-level', re.IGNORECASE) : TYPE_INT,
+ re.compile('^agent(\d+)-ack', re.IGNORECASE) : TYPE_BOOL,
+ re.compile('^agent(\d+)-sku', re.IGNORECASE) : TYPE_STR,
+ re.compile('^in-tray(\d+)', re.IGNORECASE) : TYPE_BOOL,
+ re.compile('^out-tray(\d+)', re.IGNORECASE) : TYPE_BOOL,
+ re.compile('^model(\d+)', re.IGNORECASE) : TYPE_STR,
+ }
+
+ self.TYPE_CACHE = {}
+
+
+ def read_all_files(self, unreleased=True):
+ if os.path.exists(self.released_dat):
+ self.read_section(self.released_dat)
+
+ if self.unreleased_dat is not None and os.path.exists(self.unreleased_dat):
+ self.read_section(self.unreleased_dat )
+
+ return self.__cache
+
+
+ def read_section(self, filename, section=None, is_include=False): # section==None, read all sections
+ found, in_section = False, False
+
+ if section is not None:
+ section = section.lower()
+
+ if is_include:
+ log.debug("Searching for include [%s] in file %s" % (section, filename))
+ else:
+ log.debug("Searching for section [%s] in file %s" % (section, filename))
+
+ if is_include:
+ cache = self.__includes
+ else:
+ cache = self.__cache
+
+ try:
+ fd = file(filename)
+ except IOError, e:
+ log.error("I/O Error: %s (%s)" % (filename, e.strerror))
+ return False
+
+ while True:
+ line = fd.readline()
+
+ if not line:
+ break
+
+ if line[0] in ('#', ';'):
+ continue
+
+ if line[0] == '[':
+ if in_section and section is not None:
+ break
+
+ match = self.sec.search(line)
+
+ if match is not None:
+ in_section = True
+
+ read_section = match.group(1).lower()
+
+ if section is not None:
+ found = in_section = (read_section == section)
+
+ if in_section:
+ if section is not None:
+ log.debug("Found section [%s] in file %s" % (read_section, filename))
+
+ cache[read_section] = {}
+
+ continue
+
+ if line[0] == '%':
+ match = self.inc.match(line)
+
+ if match is not None:
+ inc_file = match.group(1)
+ log.debug("Found include file directive: %%include %s" % inc_file)
+ self.__include_files.append(os.path.join(os.path.dirname(filename), inc_file))
+ continue
+
+ if in_section:
+ match = self.inc_line.match(line)
+
+ if match is not None:
+ inc_sect = match.group(1)
+ log.debug("Found include directive %%%s%%" % inc_sect)
+
+ try:
+ self.__includes[inc_sect]
+ except KeyError:
+ for inc in self.__include_files:
+
+ if self.read_section(inc, inc_sect, True):
+ break
+ else:
+ log.error("Include %%%s%% not found." % inc_sect)
+
+ if in_section:
+ match = self.eq.search(line)
+
+ if match is not None:
+ key = match.group(1)
+ value = match.group(2)
+ value = self.convert_data(key, value)
+ cache[read_section][key] = value
+
+ fd.close()
+ return found
+
+
+ def reset_includes(self):
+ self.__include_files = []
+ self.__includes = {}
+
+
+ def __getitem__(self, model):
+ model = model.lower()
+
+ try:
+ return self.__cache[model]
+ except:
+ log.debug("Cache miss: %s" % model)
+
+ log.debug("Reading file: %s" % self.released_dat)
+
+ if self.read_section(self.released_dat, model):
+ return self.__cache[model]
+
+ if self.unreleased_dat is not None and os.path.exists(self.unreleased_dat):
+ log.debug("Reading file: %s" % self.unreleased_dat)
+
+ if self.read_section(self.unreleased_dat, model):
+ return self.__cache[model]
+
+ return {}
+
+
+ def all_models(self):
+ return self.__cache
+
+
+ def get_data_type(self, key):
+ try:
+ return self.FIELD_TYPES[key]
+ except KeyError:
+ try:
+ return self.FIELD_TYPES_DYN[key]
+ except KeyError:
+ try:
+ return self.TYPE_CACHE[key]
+ except KeyError:
+ for pat, typ in self.RE_FIELD_TYPES.items():
+ match = pat.match(key)
+ if match is not None:
+ self.TYPE_CACHE[key] = typ
+ return typ
+
+ log.error("get_data_type(): Field type lookup failed for key %s" % key)
+ return None
+
+
+ def convert_data(self, key, value, typ=None):
+ if typ is None:
+ typ = self.get_data_type(key)
+
+ if typ in (TYPE_BITFIELD, TYPE_INT):
+ try:
+ value = int(value)
+ except (ValueError, TypeError):
+ log.error("Invalid value in .dat file: %s=%s" % (key, value))
+ value = 0
+
+ elif typ == TYPE_BOOL:
+ value = utils.to_bool(value)
+
+ elif typ == TYPE_LIST:
+ value = [x for x in value.split(',') if x]
+
+ elif typ == TYPE_DATE: # mm/dd/yyyy
+ if datetime_avail:
+ # ...don't use datetime.strptime(), wasn't avail. until 2.5
+ match = self.date.search(value)
+
+ if match is not None:
+ month = int(match.group(1))
+ day = int(match.group(2))
+ year = int(match.group(3))
+
+ value = datetime.date(year, month, day)
+
+ elif typ == TYPE_HEX:
+ try:
+ value = int(value, 16)
+ except (ValueError, TypeError):
+ log.error("Invalid hex value in .dat file: %s=%s" % (key, value))
+ value = 0
+
+ return value
diff --git a/base/module.py b/base/module.py
new file mode 100644
index 0000000..254def8
--- /dev/null
+++ b/base/module.py
@@ -0,0 +1,657 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2009 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+# Std Lib
+import sys
+import re
+import getopt
+import os
+
+# Local
+from g import *
+import tui, utils, device
+
+USAGE_FLAG_NONE = 0x00
+USAGE_FLAG_DEVICE_ARGS = 0x01
+USAGE_FLAG_SUPRESS_G_DEBUG_FLAG = 0x02
+USAGE_FLAG_FILE_ARGS = 0x04
+
+
+
+class Module(object):
+ def __init__(self, mod, title, version, doc,
+ usage_data=None, avail_modes=None,
+ supported_ui_toolkits=None,
+ run_as_root_ok=False, quiet=False):
+
+ self.mod = mod
+ self.title = title
+ self.version = version
+ self.doc = doc
+ self.usage_data = usage_data
+ os.umask(0037)
+ log.set_module(mod)
+ self.args = []
+ self.quiet = quiet
+ self.lock_file = None
+ prop.prog = sys.argv[0]
+
+ if os.getenv("HPLIP_DEBUG"):
+ log.set_level('debug')
+
+ self.avail_modes = avail_modes
+ if supported_ui_toolkits is not None:
+ self.supported_ui_toolkits = supported_ui_toolkits
+ self.num_supported_ui_toolkits = len(self.supported_ui_toolkits)
+ else:
+ self.supported_ui_toolkits = []
+ self.num_supported_ui_toolkits = 0
+
+ self.default_ui_toolkit = sys_conf.get('configure', 'ui-toolkit', 'qt4')
+
+ self.num_installed_ui_toolkits = 0
+ self.installed_ui_toolkits = []
+ if utils.to_bool(sys_conf.get('configure', 'qt3', '0')):
+ self.installed_ui_toolkits.append(UI_TOOLKIT_QT3)
+ self.num_installed_ui_toolkits += 1
+
+ if utils.to_bool(sys_conf.get('configure', 'qt4', '0')):
+ self.installed_ui_toolkits.append(UI_TOOLKIT_QT4)
+ self.num_installed_ui_toolkits += 1
+
+ self.default_mode = INTERACTIVE_MODE
+
+ self.num_valid_modes = 0
+ if self.avail_modes is not None:
+ if GUI_MODE in self.avail_modes and prop.gui_build and self.installed_ui_toolkits:
+ self.num_valid_modes += 1
+
+ if INTERACTIVE_MODE in self.avail_modes:
+ self.num_valid_modes += 1
+
+ if NON_INTERACTIVE_MODE in self.avail_modes:
+ self.num_valid_modes += 1
+
+ if self.avail_modes is not None:
+ if INTERACTIVE_MODE in self.avail_modes:
+ self.default_mode = INTERACTIVE_MODE
+
+ elif NON_INTERACTIVE_MODE in self.avail_modes:
+ self.default_mode = NON_INTERACTIVE_MODE
+
+ if self.supported_ui_toolkits is not None and prop.gui_build and self.installed_ui_toolkits:
+
+ if self.default_ui_toolkit == 'qt3' and UI_TOOLKIT_QT4 in self.supported_ui_toolkits and \
+ UI_TOOLKIT_QT3 not in self.supported_ui_toolkits and INTERACTIVE_MODE in self.avail_modes:
+
+ # interactive + qt4 and default is qt3 --> set to interactive (if avail) (e.g., hp-align)
+ self.default_mode = INTERACTIVE_MODE
+ self.default_ui_toolkit = 'none'
+
+ elif (UI_TOOLKIT_QT4 in self.supported_ui_toolkits and self.default_ui_toolkit == 'qt4' and UI_TOOLKIT_QT4 in self.installed_ui_toolkits) or \
+ (UI_TOOLKIT_QT3 in self.supported_ui_toolkits and self.default_ui_toolkit == 'qt3' and UI_TOOLKIT_QT3 in self.installed_ui_toolkits):
+
+ self.default_mode = GUI_MODE
+
+ elif self.default_ui_toolkit == 'qt3' and UI_TOOLKIT_QT3 not in self.supported_ui_toolkits:
+
+ if UI_TOOLKIT_QT4 in self.supported_ui_toolkits and UI_TOOLKIT_QT4 in self.installed_ui_toolkits: # (e.g, hp-linefeedcal?)
+ self.default_ui_toolkit = 'qt4'
+ self.default_mode = GUI_MODE
+
+ elif INTERACTIVE_MODE in self.avail_modes:
+ self.default_mode = INTERACTIVE_MODE
+
+ elif NON_INTERACTIVE_MODE in self.avail_modes:
+ self.default_mode = NON_INTERACTIVE_MODE
+
+ else:
+ log.error("%s cannot be run using Qt3 toolkit." % self.mod)
+ sys.exit(1)
+
+ elif self.default_ui_toolkit == 'qt4' and UI_TOOLKIT_QT4 not in self.supported_ui_toolkits:
+
+ if UI_TOOLKIT_QT3 in self.supported_ui_toolkits and UI_TOOLKIT_QT3 in self.installed_ui_toolkits: # (e.g., hp-unload)
+ self.default_ui_toolkit = 'qt3'
+ self.default_mode = GUI_MODE
+
+ elif INTERACTIVE_MODE in self.avail_modes:
+ self.default_mode = INTERACTIVE_MODE
+
+ elif NON_INTERACTIVE_MODE in self.avail_modes:
+ self.default_mode = NON_INTERACTIVE_MODE
+
+ else:
+ log.error("%s cannot be run using Qt4 toolkit." % self.mod)
+ sys.exit(1)
+
+
+ self.mode = self.default_mode
+
+ #log.debug("Default ui-toolkit: %s" % self.default_ui_toolkit)
+ #log.debug("Default mode: %s" % self.default_mode)
+
+ if os.getuid() == 0 and not run_as_root_ok:
+ log.warn("%s should not be run as root/superuser." % mod)
+
+
+ def setUsage(self, include_flags=0, extra_options=None,
+ extra_notes=None, see_also_list=None):
+
+ if self.doc:
+ self.usage_data = [(self.doc, "", "name", True)]
+ else:
+ self.usage_data = []
+
+ summary = ['Usage:', self.mod]
+ content = []
+ notes = []
+
+ if include_flags & USAGE_FLAG_DEVICE_ARGS == USAGE_FLAG_DEVICE_ARGS:
+ summary.append('[DEVICE_URI|PRINTER_NAME]')
+ content.append(utils.USAGE_ARGS)
+ content.append(utils.USAGE_DEVICE)
+ content.append(utils.USAGE_PRINTER)
+
+ if self.avail_modes is not None and self.num_valid_modes > 1:
+ summary.append('[MODE]')
+ content.append(utils.USAGE_SPACE)
+ content.append(utils.USAGE_MODE)
+
+ if self.num_installed_ui_toolkits > 0:
+ if GUI_MODE in self.avail_modes and prop.gui_build:
+ content.append(utils.USAGE_GUI_MODE)
+
+ if INTERACTIVE_MODE in self.avail_modes:
+ content.append(utils.USAGE_INTERACTIVE_MODE)
+
+ if NON_INTERACTIVE_MODE in self.avail_modes:
+ content.append(utils.USAGE_NON_INTERACTIVE_MODE)
+
+ # [options]
+ summary.append('[OPTIONS]')
+ content.append(utils.USAGE_SPACE)
+ content.append(utils.USAGE_OPTIONS)
+
+ if self.avail_modes is not None and GUI_MODE in self.avail_modes and \
+ self.supported_ui_toolkits is not None and self.num_supported_ui_toolkits > 0 and \
+ prop.gui_build and self.num_installed_ui_toolkits > 0:
+
+ if UI_TOOLKIT_QT3 in self.supported_ui_toolkits and UI_TOOLKIT_QT3 in self.installed_ui_toolkits:
+ content.append(utils.USAGE_USE_QT3)
+
+ if UI_TOOLKIT_QT4 in self.supported_ui_toolkits and UI_TOOLKIT_QT4 in self.installed_ui_toolkits:
+ content.append(utils.USAGE_USE_QT4)
+
+ content.append(utils.USAGE_LOGGING1)
+ content.append(utils.USAGE_LOGGING2)
+ if include_flags & USAGE_FLAG_SUPRESS_G_DEBUG_FLAG != USAGE_FLAG_SUPRESS_G_DEBUG_FLAG:
+ content.append(utils.USAGE_LOGGING3) # Issue with --gg in hp-sendfax
+
+ # -q/--lang
+ #if self.avail_modes is not None and GUI_MODE in self.avail_modes and prop.gui_build:
+ # content.append(utils.USAGE_LANGUAGE)
+
+ content.append(utils.USAGE_HELP)
+
+ if extra_options is not None:
+ for e in extra_options:
+ content.append(e)
+
+ # [FILES]
+ if include_flags & USAGE_FLAG_FILE_ARGS:
+ summary.append('[FILES]')
+
+ # Notes
+ if extra_notes is not None or notes:
+ content.append(utils.USAGE_SPACE)
+ content.append(utils.USAGE_NOTES)
+
+ for n in notes:
+ content.append(n)
+
+ if extra_notes is not None:
+ for n in extra_notes:
+ content.append(n)
+
+ # See Also
+ if see_also_list is not None:
+ content.append(utils.USAGE_SPACE)
+ content.append(utils.USAGE_SEEALSO)
+ for s in see_also_list:
+ content.append((s, '', 'seealso', False))
+
+ content.insert(0, (' '.join(summary), '', 'summary', True))
+
+ for c in content:
+ self.usage_data.append(c)
+
+
+ def parseStdOpts(self, extra_params=None,
+ extra_long_params=None,
+ handle_device_printer=True,
+ supress_g_debug_flag=False):
+
+ params = 'l:h' # 'l:hq:'
+ if not supress_g_debug_flag:
+ params = ''.join([params, 'g'])
+
+ long_params = ['logging=', 'help', 'help-rest', 'help-man',
+ 'help-desc',
+ #'lang=', 'loc=',
+ 'debug', 'dbg']
+
+ if handle_device_printer:
+ params = ''.join([params, 'd:p:P:'])
+ long_params.extend(['device=', 'device-uri=', 'printer=', 'printer-name'])
+
+ if self.num_valid_modes > 1:
+ if GUI_MODE in self.avail_modes and prop.gui_build:
+ params = ''.join([params, 'u'])
+ long_params.extend(['gui', 'ui'])
+
+ if INTERACTIVE_MODE in self.avail_modes:
+ params = ''.join([params, 'i'])
+ long_params.extend(['interactive', 'text'])
+
+ if NON_INTERACTIVE_MODE in self.avail_modes:
+ params = ''.join([params, 'n'])
+ long_params.extend(['noninteractive', 'non-interactive', 'batch'])
+
+ if self.supported_ui_toolkits is not None and \
+ self.num_supported_ui_toolkits >= 1 and prop.gui_build and \
+ self.avail_modes is not None and GUI_MODE in self.avail_modes:
+
+ if UI_TOOLKIT_QT3 in self.supported_ui_toolkits and UI_TOOLKIT_QT3 in self.installed_ui_toolkits:
+ long_params.extend(['qt3', 'use-qt3'])
+
+ if UI_TOOLKIT_QT4 in self.supported_ui_toolkits and UI_TOOLKIT_QT4 in self.installed_ui_toolkits:
+ long_params.extend(['qt4', 'use-qt4'])
+
+ if extra_params is not None:
+ params = ''.join([params, extra_params])
+
+ if extra_long_params is not None:
+ long_params.extend(extra_long_params)
+
+ opts = None
+ show_usage = None
+ device_uri = None
+ printer_name = None
+ error_msg = []
+ mode = self.default_mode
+ if prop.gui_build:
+ ui_toolkit = self.default_ui_toolkit
+ else:
+ ui_toolkit = 'none'
+ lang = None
+
+ try:
+ opts, self.args = getopt.getopt(sys.argv[1:], params, long_params)
+ except getopt.GetoptError, e:
+ error_msg = [e.msg]
+
+ else:
+ for o, a in opts:
+ if o in ('-d', '--device', '--device-uri'):
+ device_uri = a
+
+ elif o in ('-P', '-p', '--printer', '--printer-name'):
+ printer_name = a
+
+ elif o in ('-l', '--logging'):
+ log_level = a.lower().strip()
+ if not log.set_level(log_level):
+ show_usage = 'text'
+
+ elif o in ('-g', '--debug', '--dbg'):
+ log.set_level('debug')
+
+ elif o in ('-u', '--gui', '--ui'):
+ if self.avail_modes is not None and GUI_MODE in self.avail_modes and \
+ self.supported_ui_toolkits is not None and prop.gui_build:
+ mode = GUI_MODE
+ else:
+ error_msg.append("Unable to enter GUI mode.")
+
+ elif o in ('-i', '--interactive', '--text'):
+ if self.avail_modes is not None and INTERACTIVE_MODE in self.avail_modes:
+ mode = INTERACTIVE_MODE
+ ui_toolkit = 'none'
+
+ elif o in ('-n', '--non-interactive', '--batch'):
+ if self.avail_modes is not None and NON_INTERACTIVE_MODE in self.avail_modes:
+ mode = NON_INTERACTIVE_MODE
+ ui_toolkit = 'none'
+
+ elif o in ('-h', '--help'):
+ show_usage = 'text'
+
+ elif o == '--help-rest':
+ show_usage = 'rest'
+
+ elif o == '--help-man':
+ show_usage = 'man'
+
+ elif o == '--help-desc':
+ show_usage = 'desc'
+
+ elif o in ('--qt3', '--use-qt3'):
+ if self.avail_modes is not None and GUI_MODE in self.avail_modes:
+ if self.supported_ui_toolkits is not None and \
+ UI_TOOLKIT_QT3 in self.supported_ui_toolkits and prop.gui_build and \
+ UI_TOOLKIT_QT3 in self.installed_ui_toolkits:
+
+ mode = GUI_MODE
+ ui_toolkit = 'qt3'
+ else:
+ error_msg.append("%s does not support Qt3. Unable to enter GUI mode." % self.mod)
+
+ elif o in ('--qt4', '--use-qt4'):
+ if self.avail_modes is not None and GUI_MODE in self.avail_modes:
+ if self.supported_ui_toolkits is not None and \
+ UI_TOOLKIT_QT4 in self.supported_ui_toolkits and prop.gui_build and \
+ UI_TOOLKIT_QT4 in self.installed_ui_toolkits:
+
+ mode = GUI_MODE
+ ui_toolkit = 'qt4'
+ else:
+ error_msg.append("%s does not support Qt4. Unable to enter GUI mode." % self.mod)
+
+ #elif o in ('-q', '--lang', '--loc'):
+ # if a.strip() == '?':
+ # utils.log_title(self.title, self.version)
+ # self.showLanguages()
+ # sys.exit(0)
+ # else:
+ # lang = utils.validate_language(a.lower())
+
+ if error_msg:
+ show_usage = 'text'
+
+ self.usage(show_usage, error_msg)
+
+ if show_usage is not None:
+ sys.exit(0)
+
+ self.mode = mode
+ return opts, device_uri, printer_name, mode, ui_toolkit, lang
+
+
+ def showLanguages(self):
+ f = tui.Formatter()
+ f.header = ("Language Code", "Alternate Name(s)")
+ for loc, ll in supported_locales.items():
+ f.add((ll[0], ', '.join(ll[1:])))
+
+ f.output()
+
+
+ def usage(self, show_usage='text', error_msg=None):
+ if show_usage is None:
+ if not self.quiet:
+ self.showTitle()
+ return
+
+ if show_usage == 'text':
+ self.showTitle()
+ log.info()
+
+ if show_usage == 'desc':
+ print self.doc
+
+ else:
+ utils.format_text(self.usage_data, show_usage, self.title, self.mod, self.version)
+
+ if error_msg:
+ for e in error_msg:
+ log.error(e)
+
+ sys.exit(1)
+
+ sys.exit(0)
+
+ if show_usage == 'text':
+ sys.exit(0)
+
+
+ def showTitle(self, show_ver=True):
+ if not self.quiet:
+ log.info("")
+
+ if show_ver:
+ log.info(log.bold("HP Linux Imaging and Printing System (ver. %s)" % prop.version))
+ else:
+ log.info(log.bold("HP Linux Imaging and Printing System"))
+
+ log.info(log.bold("%s ver. %s" % (self.title, self.version)))
+ log.info("")
+ log.info("Copyright (c) 2001-14 Hewlett-Packard Development Company, LP")
+ log.info("This software comes with ABSOLUTELY NO WARRANTY.")
+ log.info("This is free software, and you are welcome to distribute it")
+ log.info("under certain conditions. See COPYING file for more details.")
+ log.info("")
+
+
+ def getDeviceUri(self, device_uri=None, printer_name=None, back_end_filter=device.DEFAULT_BE_FILTER,
+ filter=device.DEFAULT_FILTER, devices=None, restrict_to_installed_devices=True):
+ """ Validate passed in parameters, and, if in text mode, have user select desired device to use.
+ Used for tools that are device-centric and accept -d (and maybe also -p).
+ Use the filter(s) to restrict what constitute valid devices.
+
+ Return the matching device URI based on:
+ 1. Passed in device_uri if it is valid (filter passes)
+ 2. Corresponding device_uri from the printer_name if it is valid (filter passes) ('*' means default printer)
+ 3. User input from menu (based on bus and filter)
+
+ device_uri and printer_name can both be specified if they correspond to the same device.
+
+ Returns:
+ device_uri|None
+ (returns None if passed in device_uri is invalid or printer_name doesn't correspond to device_uri)
+ """
+
+ log.debug("getDeviceUri(%s, %s, %s, %s, , %s)" %
+ (device_uri, printer_name, back_end_filter, filter, restrict_to_installed_devices))
+ log.debug("Mode=%s" % self.mode)
+
+ scan_uri_flag = False
+ if 'hpaio' in back_end_filter:
+ scan_uri_flag = True
+
+ device_uri_ok = False
+ printer_name_ok = False
+ device_uri_ret = None
+
+ if devices is None:
+ devices = device.getSupportedCUPSDevices(back_end_filter, filter)
+ log.debug(devices)
+
+ if device_uri is not None:
+ if device_uri in devices:
+ device_uri_ok = True
+
+ elif restrict_to_installed_devices:
+ log.error("Invalid device URI: %s" % device_uri)
+ device_uri = None
+
+ else:
+ device_uri_ok = True
+
+ if printer_name is not None:
+ #Find the printer_name in the models of devices
+ log.debug(devices)
+ for uri in devices:
+ log.debug(uri)
+ back_end, is_hp, bb, model, serial, dev_file, host, zc, port = \
+ device.parseDeviceURI(uri)
+ log.debug("back_end=%s, is_hp=%s, bb=%s, model=%s, serial=%s, dev_file=%s, host=%s, zc=%s, port= %s" % (back_end, is_hp, bb, model, serial, dev_file, host, zc, port))
+ if printer_name.lower() == model.lower():
+ printer_name_ok = True
+ printer_name_device_uri = device_uri = uri
+ device_uri_ok = True
+ if printer_name_ok is not True:
+ log.error("Invalid printer name: %s" % printer_name)
+ printer_name = None
+
+ if device_uri is not None and printer_name is None and device_uri_ok: # Only device_uri specified
+ device_uri_ret = device_uri
+
+ elif device_uri is not None and printer_name is not None: # Both specified
+ if device_uri_ok and printer_name_ok:
+ if device_uri == printer_name_device_uri:
+ device_uri_ret = device_uri
+ else:
+ log.error("Printer name %s and device URI %s refer to different devices." % (printer_name, device_uri))
+ printer_name, printer_name = None, None
+
+ elif device_uri is None and printer_name is not None and printer_name_ok: # Only printer name specified
+ device_uri_ret = device.getDeviceURIByPrinterName(printer_name, scan_uri_flag)
+
+ elif len(devices) == 1: # Nothing specified, and only 1 device avail.
+ device_uri_ret = devices.keys()[0]
+ log.info("Using device: %s\n" % device_uri_ret)
+
+ if device_uri_ret is None and self.mode == INTERACTIVE_MODE and len(devices):
+ device_uri_ret = tui.device_table(devices, scan_uri_flag)
+
+ if device_uri_ret is not None:
+ user_conf.set('last_used', 'device_uri', device_uri_ret)
+
+ else:
+ if self.mode in (INTERACTIVE_MODE, NON_INTERACTIVE_MODE):
+ log.error("No device selected/specified or that supports this functionality.")
+ sys.exit(1)
+ else:
+ log.debug("No device selected/specified")
+
+ return device_uri_ret
+
+
+ def getPrinterName(self, printer_name, device_uri, back_end_filter=device.DEFAULT_BE_FILTER,
+ filter=device.DEFAULT_FILTER):
+ """ Validate passed in parameters, and, if in text mode, have user select desired printer to use.
+ Used for tools that are printer queue-centric and accept -p (and maybe also -d).
+ Use the filter(s) to restrict what constitute valid printers.
+
+ Return the matching printer_name based on:
+ 1. Passed in printer_name if it is valid (filter passes) ('*' means default printer)
+ 2. From single printer_name of corresponding passed in device_uri (filter passes)
+ 3. User input from menu (CUPS printer list, filtered) [or if > 1 queue for device_uri]
+
+ device_uri and printer_name can both be specified if they correspond to the same device.
+
+ Returns:
+ (printer_name|None, device_uri|None) (tuple)
+ (returns None if passed in printer_name is invalid or device_uri doesn't correspond to printer_name)
+ """
+
+ log.debug("getPrinterName(%s, %s, %s, %s)" % (device_uri, printer_name, back_end_filter, filter))
+ log.debug("Mode=%s" % self.mode)
+
+ device_uri_ok = False
+ printer_name_ok = False
+ printer_name_ret = None
+ device_uri_ret = None
+
+ printers = device.getSupportedCUPSPrinterNames(back_end_filter, filter)
+ log.debug(printers)
+
+ if device_uri is not None:
+ devices = device.getSupportedCUPSDevices(back_end_filter, filter)
+ if device_uri in devices:
+ device_uri_ok = True
+ device_uri_ret = device_uri
+ else:
+ log.error("Invalid device URI: %s" % device_uri)
+ device_uri = None
+
+ if printer_name is not None:
+ if printer_name == '*':
+ from prnt import cups
+ default_printer = cups.getDefaultPrinter()
+ if default_printer is not None:
+ printer_name_ret = default_printer
+ else:
+ log.error("CUPS default printer not set")
+ printer_name = None
+
+ else:
+ if printer_name in printers:
+ printer_name_ok = True
+ device_uri_ret = device.getDeviceURIByPrinterName(printer_name)
+ else:
+ log.error("Invalid printer name")
+ printer_name = None
+
+ if device_uri is not None and printer_name is None and device_uri_ok: # Only device_uri specified
+ if len(devices[device_uri]) == 1:
+ printer_name_ret = devices[device_uri][0]
+
+ elif device_uri is not None and printer_name is not None: # Both specified
+ if device_uri_ok and printer_name_ok:
+ if device_uri == device_uri_ret:
+ printer_name_ret = printer_name
+ else:
+ log.error("Printer name and device URI refer to different devices.")
+
+ elif device_uri is None and printer_name is not None and printer_name_ok: # Only printer name specified
+ printer_name_ret = printer_name
+
+ elif len(printers) == 1: # nothing specified, and only 1 avail. printer
+ printer_name_ret = printers[0]
+ log.info("Using printer: %s\n" % printer_name_ret)
+
+ if printer_name_ret is None and self.mode in (INTERACTIVE_MODE, NON_INTERACTIVE_MODE) and len(printers):
+ printer_name_ret = tui.printer_table(printers)
+
+ if printer_name_ret is not None and device_uri_ret is None:
+ device_uri_ret = device.getDeviceURIByPrinterName(printer_name_ret)
+
+ if device_uri_ret is not None:
+ user_conf.set('last_used', 'device_uri', device_uri_ret)
+
+ if printer_name_ret is not None:
+ user_conf.set('last_used', 'printer_name', printer_name_ret)
+
+ else:
+ if self.mode in (INTERACTIVE_MODE, NON_INTERACTIVE_MODE):
+ log.error("No printer selected/specified or that supports this functionality.")
+ sys.exit(1)
+ else:
+ log.debug("No printer selected/specified")
+
+ return printer_name_ret, device_uri_ret
+
+
+ def lockInstance(self, suffix=''):
+ if suffix:
+ ok, self.lock_file = utils.lock_app('-'.join([self.mod, suffix]))
+ else:
+ ok, self.lock_file = utils.lock_app(self.mod)
+
+ if not ok:
+ sys.exit(1)
+
+
+ def unlockInstance(self):
+ if self.lock_file is not None:
+ utils.unlock(self.lock_file)
diff --git a/base/pexpect.py b/base/pexpect.py
new file mode 100644
index 0000000..e8d6493
--- /dev/null
+++ b/base/pexpect.py
@@ -0,0 +1,1384 @@
+"""Pexpect is a Python module for spawning child applications and controlling
+them automatically. Pexpect can be used for automating interactive applications
+such as ssh, ftp, passwd, telnet, etc. It can be used to a automate setup
+scripts for duplicating software package installations on different servers. It
+can be used for automated software testing. Pexpect is in the spirit of Don
+Libes' Expect, but Pexpect is pure Python. Other Expect-like modules for Python
+require TCL and Expect or require C extensions to be compiled. Pexpect does not
+use C, Expect, or TCL extensions. It should work on any platform that supports
+the standard Python pty module. The Pexpect interface focuses on ease of use so
+that simple tasks are easy.
+
+There are two main interfaces to Pexpect -- the function, run() and the class,
+spawn. You can call the run() function to execute a command and return the
+output. This is a handy replacement for os.system().
+
+For example:
+ pexpect.run('ls -la')
+
+The more powerful interface is the spawn class. You can use this to spawn an
+external child command and then interact with the child by sending lines and
+expecting responses.
+
+For example:
+ child = pexpect.spawn('scp foo myname@host.example.com:.')
+ child.expect ('Password:')
+ child.sendline (mypassword)
+
+This works even for commands that ask for passwords or other input outside of
+the normal stdio streams.
+
+Credits:
+Noah Spurrier, Richard Holden, Marco Molteni, Kimberley Burchett, Robert Stone,
+Hartmut Goebel, Chad Schroeder, Erick Tryzelaar, Dave Kirby, Ids vander Molen,
+George Todd, Noel Taylor, Nicolas D. Cesar, Alexander Gattin,
+Geoffrey Marshall, Francisco Lourenco, Glen Mabey, Karthik Gurusamy,
+Fernando Perez
+(Let me know if I forgot anyone.)
+
+Free, open source, and all that good stuff.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+Pexpect Copyright (c) 2006 Noah Spurrier
+http://pexpect.sourceforge.net/
+
+$Revision: 1.2 $
+$Date: 2007/01/11 20:51:46 $
+"""
+try:
+ import os
+ import sys
+ import time
+ import select
+ import string
+ import re
+ import struct
+ import resource
+ import types
+ import pty
+ import tty
+ import termios
+ import fcntl
+ import errno
+ import traceback
+ import signal
+except ImportError, e:
+ raise ImportError (str(e) + """
+A critical module was not found. Probably this operating system does not support it.
+Pexpect is intended for UNIX-like operating systems.""")
+
+__version__ = '2.1'
+__revision__ = '$Revision: 1.2 $'
+__all__ = ['ExceptionPexpect', 'EOF', 'TIMEOUT', 'spawn', 'run', 'which', 'split_command_line',
+ '__version__', '__revision__']
+
+# Exception classes used by this module.
+class ExceptionPexpect(Exception):
+ """Base class for all exceptions raised by this module.
+ """
+ def __init__(self, value):
+ self.value = value
+ def __str__(self):
+ return str(self.value)
+ def get_trace(self):
+ """This returns an abbreviated stack trace with lines that only concern the caller.
+ In other words, the stack trace inside the Pexpect module is not included.
+ """
+ tblist = traceback.extract_tb(sys.exc_info()[2])
+ tblist = filter(self.__filter_not_pexpect, tblist)
+ tblist = traceback.format_list(tblist)
+ return ''.join(tblist)
+ def __filter_not_pexpect(self, trace_list_item):
+ if trace_list_item[0].find('pexpect.py') == -1:
+ return True
+ else:
+ return False
+class EOF(ExceptionPexpect):
+ """Raised when EOF is read from a child.
+ """
+class TIMEOUT(ExceptionPexpect):
+ """Raised when a read time exceeds the timeout.
+ """
+
+def run (command, timeout=-1, withexitstatus=False, events=None, extra_args=None, logfile=None):
+ """This function runs the given command; waits for it to finish;
+ then returns all output as a string. STDERR is included in output.
+ If the full path to the command is not given then the path is searched.
+
+ Note that lines are terminated by CR/LF (\\r\\n) combination
+ even on UNIX-like systems because this is the standard for pseudo ttys.
+ If you set withexitstatus to true, then run will return a tuple of
+ (command_output, exitstatus). If withexitstatus is false then this
+ returns just command_output.
+
+ The run() function can often be used instead of creating a spawn instance.
+ For example, the following code uses spawn:
+ from pexpect import *
+ child = spawn('scp foo myname@host.example.com:.')
+ child.expect ('(?i)password')
+ child.sendline (mypassword)
+ The previous code can be replace with the following, which you may
+ or may not find simpler:
+ from pexpect import *
+ run ('scp foo myname@host.example.com:.', events={'(?i)password': mypassword})
+
+ Examples:
+ Start the apache daemon on the local machine:
+ from pexpect import *
+ run ("/usr/local/apache/bin/apachectl start")
+ Check in a file using SVN:
+ from pexpect import *
+ run ("svn ci -m 'automatic commit' my_file.py")
+ Run a command and capture exit status:
+ from pexpect import *
+ (command_output, exitstatus) = run ('ls -l /bin', withexitstatus=1)
+
+ Tricky Examples:
+ The following will run SSH and execute 'ls -l' on the remote machine.
+ The password 'secret' will be sent if the '(?i)password' pattern is ever seen.
+ run ("ssh username@machine.example.com 'ls -l'", events={'(?i)password':'secret\n'})
+
+ This will start mencoder to rip a video from DVD. This will also display
+ progress ticks every 5 seconds as it runs.
+ from pexpect import *
+ def print_ticks(d):
+ print d['event_count'],
+ run ("mencoder dvd://1 -o video.avi -oac copy -ovc copy", events={TIMEOUT:print_ticks}, timeout=5)
+
+ The 'events' argument should be a dictionary of patterns and responses.
+ Whenever one of the patterns is seen in the command out
+ run() will send the associated response string. Note that you should
+ put newlines in your string if Enter is necessary.
+ The responses may also contain callback functions.
+ Any callback is function that takes a dictionary as an argument.
+ The dictionary contains all the locals from the run() function, so
+ you can access the child spawn object or any other variable defined
+ in run() (event_count, child, and extra_args are the most useful).
+ A callback may return True to stop the current run process otherwise
+ run() continues until the next event.
+ A callback may also return a string which will be sent to the child.
+ 'extra_args' is not used by directly run(). It provides a way to pass data to
+ a callback function through run() through the locals dictionary passed to a callback.
+ """
+ if timeout == -1:
+ child = spawn(command, maxread=2000, logfile=logfile)
+ else:
+ child = spawn(command, timeout=timeout, maxread=2000, logfile=logfile)
+ if events is not None:
+ patterns = events.keys()
+ responses = events.values()
+ else:
+ patterns=None # We assume that EOF or TIMEOUT will save us.
+ responses=None
+ child_result_list = []
+ event_count = 0
+ while 1:
+ try:
+ index = child.expect (patterns)
+ if type(child.after) is types.StringType:
+ child_result_list.append(child.before + child.after)
+ else: # child.after may have been a TIMEOUT or EOF, so don't cat those.
+ child_result_list.append(child.before)
+ if type(responses[index]) is types.StringType:
+ child.send(responses[index])
+ elif type(responses[index]) is types.FunctionType:
+ callback_result = responses[index](locals())
+ sys.stdout.flush()
+ if type(callback_result) is types.StringType:
+ child.send(callback_result)
+ elif callback_result:
+ break
+ else:
+ raise TypeError ('The callback must be a string or function type.')
+ event_count = event_count + 1
+ except TIMEOUT, e:
+ child_result_list.append(child.before)
+ break
+ except EOF, e:
+ child_result_list.append(child.before)
+ break
+ child_result = ''.join(child_result_list)
+ if withexitstatus:
+ child.close()
+ return (child_result, child.exitstatus)
+ else:
+ return child_result
+
+class spawn (object):
+ """This is the main class interface for Pexpect.
+ Use this class to start and control child applications.
+ """
+
+ def __init__(self, command, args=[], timeout=30, maxread=2000, searchwindowsize=None, logfile=None, env=None):
+ """This is the constructor. The command parameter may be a string
+ that includes a command and any arguments to the command. For example:
+ p = pexpect.spawn ('/usr/bin/ftp')
+ p = pexpect.spawn ('/usr/bin/ssh user@example.com')
+ p = pexpect.spawn ('ls -latr /tmp')
+ You may also construct it with a list of arguments like so:
+ p = pexpect.spawn ('/usr/bin/ftp', [])
+ p = pexpect.spawn ('/usr/bin/ssh', ['user@example.com'])
+ p = pexpect.spawn ('ls', ['-latr', '/tmp'])
+ After this the child application will be created and
+ will be ready to talk to. For normal use, see expect() and
+ send() and sendline().
+
+ The maxread attribute sets the read buffer size.
+ This is maximum number of bytes that Pexpect will try to read
+ from a TTY at one time.
+ Seeting the maxread size to 1 will turn off buffering.
+ Setting the maxread value higher may help performance in cases
+ where large amounts of output are read back from the child.
+ This feature is useful in conjunction with searchwindowsize.
+
+ The searchwindowsize attribute sets the how far back in
+ the incomming seach buffer Pexpect will search for pattern matches.
+ Every time Pexpect reads some data from the child it will append the data to
+ the incomming buffer. The default is to search from the beginning of the
+ imcomming buffer each time new data is read from the child.
+ But this is very inefficient if you are running a command that
+ generates a large amount of data where you want to match
+ The searchwindowsize does not effect the size of the incomming data buffer.
+ You will still have access to the full buffer after expect() returns.
+
+ The logfile member turns on or off logging.
+ All input and output will be copied to the given file object.
+ Set logfile to None to stop logging. This is the default.
+ Set logfile to sys.stdout to echo everything to standard output.
+ The logfile is flushed after each write.
+ Example 1:
+ child = pexpect.spawn('some_command')
+ fout = file('mylog.txt','w')
+ child.logfile = fout
+ Example 2:
+ child = pexpect.spawn('some_command')
+ child.logfile = sys.stdout
+
+ The delaybeforesend helps overcome a weird behavior that many users were experiencing.
+ The typical problem was that a user would expect() a "Password:" prompt and
+ then immediately call sendline() to send the password. The user would then
+ see that their password was echoed back to them. Passwords don't
+ normally echo. The problem is caused by the fact that most applications
+ print out the "Password" prompt and then turn off stdin echo, but if you
+ send your password before the application turned off echo, then you get
+ your password echoed. Normally this wouldn't be a problem when interacting
+ with a human at a real heyboard. If you introduce a slight delay just before
+ writing then this seems to clear up the problem. This was such a common problem
+ for many users that I decided that the default pexpect behavior
+ should be to sleep just before writing to the child application.
+ 1/10th of a second (100 ms) seems to be enough to clear up the problem.
+ You can set delaybeforesend to 0 to return to the old behavior.
+
+ Note that spawn is clever about finding commands on your path.
+ It uses the same logic that "which" uses to find executables.
+
+ If you wish to get the exit status of the child you must call
+ the close() method. The exit or signal status of the child will be
+ stored in self.exitstatus or self.signalstatus.
+ If the child exited normally then exitstatus will store the exit return code and
+ signalstatus will be None.
+ If the child was terminated abnormally with a signal then signalstatus will store
+ the signal value and exitstatus will be None.
+ If you need more detail you can also read the self.status member which stores
+ the status returned by os.waitpid. You can interpret this using
+ os.WIFEXITED/os.WEXITSTATUS or os.WIFSIGNALED/os.TERMSIG.
+ """
+ self.STDIN_FILENO = pty.STDIN_FILENO
+ self.STDOUT_FILENO = pty.STDOUT_FILENO
+ self.STDERR_FILENO = pty.STDERR_FILENO
+ self.stdin = sys.stdin
+ self.stdout = sys.stdout
+ self.stderr = sys.stderr
+
+ self.patterns = None
+ self.ignorecase = False
+ self.before = None
+ self.after = None
+ self.match = None
+ self.match_index = None
+ self.terminated = True
+ self.exitstatus = None
+ self.signalstatus = None
+ self.status = None # status returned by os.waitpid
+ self.flag_eof = False
+ self.pid = None
+ self.child_fd = -1 # initially closed
+ self.timeout = timeout
+ self.delimiter = EOF
+ self.logfile = logfile
+ self.maxread = maxread # Max bytes to read at one time into buffer.
+ self.buffer = '' # This is the read buffer. See maxread.
+ self.searchwindowsize = searchwindowsize # Anything before searchwindowsize point is preserved, but not searched.
+ self.delaybeforesend = 0.1 # Sets sleep time used just before sending data to child.
+ self.delayafterclose = 0.1 # Sets delay in close() method to allow kernel time to update process status.
+ self.delayafterterminate = 0.1 # Sets delay in terminate() method to allow kernel time to update process status.
+ self.softspace = False # File-like object.
+ self.name = '<' + repr(self) + '>' # File-like object.
+ self.encoding = None # File-like object.
+ self.closed = True # File-like object.
+ self.env = env
+ self.__irix_hack = sys.platform.lower().find('irix') >= 0 # This flags if we are running on irix
+ self.use_native_pty_fork = not (sys.platform.lower().find('solaris') >= 0) # Solaris uses internal __fork_pty(). All other use pty.fork().
+
+ # allow dummy instances for subclasses that may not use command or args.
+ if command is None:
+ self.command = None
+ self.args = None
+ self.name = '<pexpect factory incomplete>'
+ return
+
+ # If command is an int type then it may represent a file descriptor.
+ if type(command) == type(0):
+ raise ExceptionPexpect ('Command is an int type. If this is a file descriptor then maybe you want to use fdpexpect.fdspawn which takes an existing file descriptor instead of a command string.')
+
+ if type (args) != type([]):
+ raise TypeError ('The argument, args, must be a list.')
+
+ if args == []:
+ self.args = split_command_line(command)
+ self.command = self.args[0]
+ else:
+ self.args = args[:] # work with a copy
+ self.args.insert (0, command)
+ self.command = command
+
+ command_with_path = which(self.command)
+ if command_with_path is None:
+ raise ExceptionPexpect ('The command was not found or was not executable: %s.' % self.command)
+ self.command = command_with_path
+ self.args[0] = self.command
+
+ self.name = '<' + ' '.join (self.args) + '>'
+ self.__spawn()
+
+ def __del__(self):
+ """This makes sure that no system resources are left open.
+ Python only garbage collects Python objects. OS file descriptors
+ are not Python objects, so they must be handled explicitly.
+ If the child file descriptor was opened outside of this class
+ (passed to the constructor) then this does not close it.
+ """
+ if not self.closed:
+ self.close()
+
+ def __str__(self):
+ """This returns the current state of the pexpect object as a string.
+ """
+ s = []
+ s.append(repr(self))
+ s.append('version: ' + __version__ + ' (' + __revision__ + ')')
+ s.append('command: ' + str(self.command))
+ s.append('args: ' + str(self.args))
+ if self.patterns is None:
+ s.append('patterns: None')
+ else:
+ s.append('patterns:')
+ for p in self.patterns:
+ if type(p) is type(re.compile('')):
+ s.append(' ' + str(p.pattern))
+ else:
+ s.append(' ' + str(p))
+ s.append('buffer (last 100 chars): ' + str(self.buffer)[-100:])
+ s.append('before (last 100 chars): ' + str(self.before)[-100:])
+ s.append('after: ' + str(self.after))
+ s.append('match: ' + str(self.match))
+ s.append('match_index: ' + str(self.match_index))
+ s.append('exitstatus: ' + str(self.exitstatus))
+ s.append('flag_eof: ' + str(self.flag_eof))
+ s.append('pid: ' + str(self.pid))
+ s.append('child_fd: ' + str(self.child_fd))
+ s.append('closed: ' + str(self.closed))
+ s.append('timeout: ' + str(self.timeout))
+ s.append('delimiter: ' + str(self.delimiter))
+ s.append('logfile: ' + str(self.logfile))
+ s.append('maxread: ' + str(self.maxread))
+ s.append('ignorecase: ' + str(self.ignorecase))
+ s.append('searchwindowsize: ' + str(self.searchwindowsize))
+ s.append('delaybeforesend: ' + str(self.delaybeforesend))
+ s.append('delayafterclose: ' + str(self.delayafterclose))
+ s.append('delayafterterminate: ' + str(self.delayafterterminate))
+ return '\n'.join(s)
+
+ def __spawn(self):
+ """This starts the given command in a child process.
+ This does all the fork/exec type of stuff for a pty.
+ This is called by __init__.
+ """
+ # The pid and child_fd of this object get set by this method.
+ # Note that it is difficult for this method to fail.
+ # You cannot detect if the child process cannot start.
+ # So the only way you can tell if the child process started
+ # or not is to try to read from the file descriptor. If you get
+ # EOF immediately then it means that the child is already dead.
+ # That may not necessarily be bad because you may haved spawned a child
+ # that performs some task; creates no stdout output; and then dies.
+
+ assert self.pid is None, 'The pid member should be None.'
+ assert self.command is not None, 'The command member should not be None.'
+
+ if self.use_native_pty_fork:
+ try:
+ self.pid, self.child_fd = pty.fork()
+ except OSError, e:
+ raise ExceptionPexpect('Error! pty.fork() failed: ' + str(e))
+ else: # Use internal __fork_pty
+ self.pid, self.child_fd = self.__fork_pty()
+
+ if self.pid == 0: # Child
+ try:
+ self.child_fd = sys.stdout.fileno() # used by setwinsize()
+ self.setwinsize(24, 80)
+ except:
+ # Some platforms do not like setwinsize (Cygwin).
+ # This will cause problem when running applications that
+ # are very picky about window size.
+ # This is a serious limitation, but not a show stopper.
+ pass
+ # Do not allow child to inherit open file descriptors from parent.
+ max_fd = resource.getrlimit(resource.RLIMIT_NOFILE)[0]
+ for i in range (3, max_fd):
+ try:
+ os.close (i)
+ except OSError:
+ pass
+
+ # I don't know why this works, but ignoring SIGHUP fixes a
+ # problem when trying to start a Java daemon with sudo
+ # (specifically, Tomcat).
+ signal.signal(signal.SIGHUP, signal.SIG_IGN)
+
+ if self.env is None:
+ os.execv(self.command, self.args)
+ else:
+ os.execvpe(self.command, self.args, self.env)
+
+ # Parent
+ self.terminated = False
+ self.closed = False
+
+ def __fork_pty(self):
+ """This implements a substitute for the forkpty system call.
+ This should be more portable than the pty.fork() function.
+ Specifically, this should work on Solaris.
+
+ Modified 10.06.05 by Geoff Marshall:
+ Implemented __fork_pty() method to resolve the issue with Python's
+ pty.fork() not supporting Solaris, particularly ssh.
+ Based on patch to posixmodule.c authored by Noah Spurrier:
+ http://mail.python.org/pipermail/python-dev/2003-May/035281.html
+ """
+ parent_fd, child_fd = os.openpty()
+ if parent_fd < 0 or child_fd < 0:
+ raise ExceptionPexpect, "Error! Could not open pty with os.openpty()."
+
+ pid = os.fork()
+ if pid < 0:
+ raise ExceptionPexpect, "Error! Failed os.fork()."
+ elif pid == 0:
+ # Child.
+ os.close(parent_fd)
+ self.__pty_make_controlling_tty(child_fd)
+
+ os.dup2(child_fd, 0)
+ os.dup2(child_fd, 1)
+ os.dup2(child_fd, 2)
+
+ if child_fd > 2:
+ os.close(child_fd)
+ else:
+ # Parent.
+ os.close(child_fd)
+
+ return pid, parent_fd
+
+ def __pty_make_controlling_tty(self, tty_fd):
+ """This makes the pseudo-terminal the controlling tty.
+ This should be more portable than the pty.fork() function.
+ Specifically, this should work on Solaris.
+ """
+ child_name = os.ttyname(tty_fd)
+
+ # Disconnect from controlling tty if still connected.
+ fd = os.open("/dev/tty", os.O_RDWR | os.O_NOCTTY);
+ if fd >= 0:
+ os.close(fd)
+
+ os.setsid()
+
+ # Verify we are disconnected from controlling tty
+ try:
+ fd = os.open("/dev/tty", os.O_RDWR | os.O_NOCTTY);
+ if fd >= 0:
+ os.close(fd)
+ raise ExceptionPexpect, "Error! We are not disconnected from a controlling tty."
+ except:
+ # Good! We are disconnected from a controlling tty.
+ pass
+
+ # Verify we can open child pty.
+ fd = os.open(child_name, os.O_RDWR);
+ if fd < 0:
+ raise ExceptionPexpect, "Error! Could not open child pty, " + child_name
+ else:
+ os.close(fd)
+
+ # Verify we now have a controlling tty.
+ fd = os.open("/dev/tty", os.O_WRONLY)
+ if fd < 0:
+ raise ExceptionPexpect, "Error! Could not open controlling tty, /dev/tty"
+ else:
+ os.close(fd)
+
+ def fileno (self): # File-like object.
+ """This returns the file descriptor of the pty for the child.
+ """
+ return self.child_fd
+
+ def close (self, force=True): # File-like object.
+ """This closes the connection with the child application.
+ Note that calling close() more than once is valid.
+ This emulates standard Python behavior with files.
+ Set force to True if you want to make sure that the child is terminated
+ (SIGKILL is sent if the child ignores SIGHUP and SIGINT).
+ """
+ if not self.closed:
+ self.flush()
+ os.close (self.child_fd)
+ self.child_fd = -1
+ self.closed = True
+ time.sleep(self.delayafterclose) # Give kernel time to update process status.
+ if self.isalive():
+ if not self.terminate(force):
+ raise ExceptionPexpect ('close() could not terminate the child using terminate()')
+
+ def flush (self): # File-like object.
+ """This does nothing. It is here to support the interface for a File-like object.
+ """
+ pass
+
+ def isatty (self): # File-like object.
+ """This returns True if the file descriptor is open and connected to a tty(-like) device, else False.
+ """
+ return os.isatty(self.child_fd)
+
+ def setecho (self, state):
+ """This sets the terminal echo mode on or off.
+ Note that anything the child sent before the echo will be lost, so
+ you should be sure that your input buffer is empty before you setecho.
+ For example, the following will work as expected.
+ p = pexpect.spawn('cat')
+ p.sendline ('1234') # We will see this twice (once from tty echo and again from cat).
+ p.expect (['1234'])
+ p.expect (['1234'])
+ p.setecho(False) # Turn off tty echo
+ p.sendline ('abcd') # We will set this only once (echoed by cat).
+ p.sendline ('wxyz') # We will set this only once (echoed by cat)
+ p.expect (['abcd'])
+ p.expect (['wxyz'])
+ The following WILL NOT WORK because the lines sent before the setecho
+ will be lost:
+ p = pexpect.spawn('cat')
+ p.sendline ('1234') # We will see this twice (once from tty echo and again from cat).
+ p.setecho(False) # Turn off tty echo
+ p.sendline ('abcd') # We will set this only once (echoed by cat).
+ p.sendline ('wxyz') # We will set this only once (echoed by cat)
+ p.expect (['1234'])
+ p.expect (['1234'])
+ p.expect (['abcd'])
+ p.expect (['wxyz'])
+ """
+ self.child_fd
+ new = termios.tcgetattr(self.child_fd)
+ if state:
+ new[3] = new[3] | termios.ECHO
+ else:
+ new[3] = new[3] & ~termios.ECHO
+ # I tried TCSADRAIN and TCSAFLUSH, but these were inconsistent
+ # and blocked on some platforms. TCSADRAIN is probably ideal if it worked.
+ termios.tcsetattr(self.child_fd, termios.TCSANOW, new)
+
+ def read_nonblocking (self, size = 1, timeout = -1):
+ """This reads at most size characters from the child application.
+ It includes a timeout. If the read does not complete within the
+ timeout period then a TIMEOUT exception is raised.
+ If the end of file is read then an EOF exception will be raised.
+ If a log file was set using setlog() then all data will
+ also be written to the log file.
+
+ If timeout==None then the read may block indefinitely.
+ If timeout==-1 then the self.timeout value is used.
+ If timeout==0 then the child is polled and
+ if there was no data immediately ready then this will raise a TIMEOUT exception.
+
+ The "timeout" refers only to the amount of time to read at least one character.
+ This is not effected by the 'size' parameter, so if you call
+ read_nonblocking(size=100, timeout=30) and only one character is
+ available right away then one character will be returned immediately.
+ It will not wait for 30 seconds for another 99 characters to come in.
+
+ This is a wrapper around os.read().
+ It uses select.select() to implement a timeout.
+ """
+ if self.closed:
+ raise ValueError ('I/O operation on closed file in read_nonblocking().')
+
+ if timeout == -1:
+ timeout = self.timeout
+
+ # Note that some systems such as Solaris do not give an EOF when
+ # the child dies. In fact, you can still try to read
+ # from the child_fd -- it will block forever or until TIMEOUT.
+ # For this case, I test isalive() before doing any reading.
+ # If isalive() is false, then I pretend that this is the same as EOF.
+ if not self.isalive():
+ r,w,e = self.__select([self.child_fd], [], [], 0) # timeout of 0 means "poll"
+ if not r:
+ self.flag_eof = True
+ raise EOF ('End Of File (EOF) in read_nonblocking(). Braindead platform.')
+ elif self.__irix_hack:
+ # This is a hack for Irix. It seems that Irix requires a long delay before checking isalive.
+ # This adds a 2 second delay, but only when the child is terminated.
+ r, w, e = self.__select([self.child_fd], [], [], 2)
+ if not r and not self.isalive():
+ self.flag_eof = True
+ raise EOF ('End Of File (EOF) in read_nonblocking(). Pokey platform.')
+
+ r,w,e = self.__select([self.child_fd], [], [], timeout)
+
+ if not r:
+ if not self.isalive():
+ # Some platforms, such as Irix, will claim that their processes are alive;
+ # then timeout on the select; and then finally admit that they are not alive.
+ self.flag_eof = True
+ raise EOF ('End of File (EOF) in read_nonblocking(). Very pokey platform.')
+ else:
+ raise TIMEOUT ('Timeout exceeded in read_nonblocking().')
+
+ if self.child_fd in r:
+ try:
+ s = os.read(self.child_fd, size)
+ except OSError, e: # Linux does this
+ self.flag_eof = True
+ raise EOF ('End Of File (EOF) in read_nonblocking(). Exception style platform.')
+ if s == '': # BSD style
+ self.flag_eof = True
+ raise EOF ('End Of File (EOF) in read_nonblocking(). Empty string style platform.')
+
+ if self.logfile is not None:
+ self.logfile.write (s)
+ self.logfile.flush()
+
+ return s
+
+ raise ExceptionPexpect ('Reached an unexpected state in read_nonblocking().')
+
+ def read (self, size = -1): # File-like object.
+ """This reads at most "size" bytes from the file
+ (less if the read hits EOF before obtaining size bytes).
+ If the size argument is negative or omitted,
+ read all data until EOF is reached.
+ The bytes are returned as a string object.
+ An empty string is returned when EOF is encountered immediately.
+ """
+ if size == 0:
+ return ''
+ if size < 0:
+ self.expect (self.delimiter) # delimiter default is EOF
+ return self.before
+
+ # I could have done this more directly by not using expect(), but
+ # I deliberately decided to couple read() to expect() so that
+ # I would catch any bugs early and ensure consistant behavior.
+ # It's a little less efficient, but there is less for me to
+ # worry about if I have to later modify read() or expect().
+ # Note, it's OK if size==-1 in the regex. That just means it
+ # will never match anything in which case we stop only on EOF.
+ cre = re.compile('.{%d}' % size, re.DOTALL)
+ index = self.expect ([cre, self.delimiter]) # delimiter default is EOF
+ if index == 0:
+ return self.after ### self.before should be ''. Should I assert this?
+ return self.before
+
+ def readline (self, size = -1): # File-like object.
+ """This reads and returns one entire line. A trailing newline is kept in
+ the string, but may be absent when a file ends with an incomplete line.
+ Note: This readline() looks for a \\r\\n pair even on UNIX because
+ this is what the pseudo tty device returns. So contrary to what you
+ may expect you will receive the newline as \\r\\n.
+ An empty string is returned when EOF is hit immediately.
+ Currently, the size agument is mostly ignored, so this behavior is not
+ standard for a file-like object. If size is 0 then an empty string
+ is returned.
+ """
+ if size == 0:
+ return ''
+ index = self.expect (['\r\n', self.delimiter]) # delimiter default is EOF
+ if index == 0:
+ return self.before + '\r\n'
+ else:
+ return self.before
+
+ def __iter__ (self): # File-like object.
+ """This is to support iterators over a file-like object.
+ """
+ return self
+
+ def next (self): # File-like object.
+ """This is to support iterators over a file-like object.
+ """
+ result = self.readline()
+ if result == "":
+ raise StopIteration
+ return result
+
+ def readlines (self, sizehint = -1): # File-like object.
+ """This reads until EOF using readline() and returns a list containing
+ the lines thus read. The optional "sizehint" argument is ignored.
+ """
+ lines = []
+ while True:
+ line = self.readline()
+ if not line:
+ break
+ lines.append(line)
+ return lines
+
+ def write(self, str): # File-like object.
+ """This is similar to send() except that there is no return value.
+ """
+ self.send (str)
+
+ def writelines (self, sequence): # File-like object.
+ """This calls write() for each element in the sequence.
+ The sequence can be any iterable object producing strings,
+ typically a list of strings. This does not add line separators
+ There is no return value.
+ """
+ for str in sequence:
+ self.write (str)
+
+ def send(self, str):
+ """This sends a string to the child process.
+ This returns the number of bytes written.
+ If a log file was set then the data is also written to the log.
+ """
+ time.sleep(self.delaybeforesend)
+ if self.logfile is not None:
+ self.logfile.write (str)
+ self.logfile.flush()
+ c = os.write(self.child_fd, str)
+ return c
+
+ def sendline(self, str=''):
+ """This is like send(), but it adds a line feed (os.linesep).
+ This returns the number of bytes written.
+ """
+ n = self.send(str)
+ n = n + self.send (os.linesep)
+ return n
+
+ def sendeof(self):
+ """This sends an EOF to the child.
+ This sends a character which causes the pending parent output
+ buffer to be sent to the waiting child program without
+ waiting for end-of-line. If it is the first character of the
+ line, the read() in the user program returns 0, which
+ signifies end-of-file. This means to work as expected
+ a sendeof() has to be called at the begining of a line.
+ This method does not send a newline. It is the responsibility
+ of the caller to ensure the eof is sent at the beginning of a line.
+ """
+ fd = sys.stdin.fileno()
+ old = termios.tcgetattr(fd) # remember current state
+ new = termios.tcgetattr(fd)
+ new[3] = new[3] | termios.ICANON # ICANON must be set to recognize EOF
+ try: # use try/finally to ensure state gets restored
+ termios.tcsetattr(fd, termios.TCSADRAIN, new)
+ if 'CEOF' in dir(termios):
+ os.write (self.child_fd, '%c' % termios.CEOF)
+ else:
+ os.write (self.child_fd, '%c' % 4) # Silly platform does not define CEOF so assume CTRL-D
+ finally: # restore state
+ termios.tcsetattr(fd, termios.TCSADRAIN, old)
+
+ def eof (self):
+ """This returns True if the EOF exception was ever raised.
+ """
+ return self.flag_eof
+
+ def terminate(self, force=False):
+ """This forces a child process to terminate.
+ It starts nicely with SIGHUP and SIGINT. If "force" is True then
+ moves onto SIGKILL.
+ This returns True if the child was terminated.
+ This returns False if the child could not be terminated.
+ """
+ if not self.isalive():
+ return True
+ self.kill(signal.SIGHUP)
+ time.sleep(self.delayafterterminate)
+ if not self.isalive():
+ return True
+ self.kill(signal.SIGCONT)
+ time.sleep(self.delayafterterminate)
+ if not self.isalive():
+ return True
+ self.kill(signal.SIGINT)
+ time.sleep(self.delayafterterminate)
+ if not self.isalive():
+ return True
+ if force:
+ self.kill(signal.SIGKILL)
+ time.sleep(self.delayafterterminate)
+ if not self.isalive():
+ return True
+ else:
+ return False
+ return False
+ #raise ExceptionPexpect ('terminate() could not terminate child process. Try terminate(force=True)?')
+
+ def wait(self):
+ """This waits until the child exits. This is a blocking call.
+ This will not read any data from the child, so this will block forever
+ if the child has unread output and has terminated. In other words, the child
+ may have printed output then called exit(); but, technically, the child is
+ still alive until its output is read.
+ """
+ if self.isalive():
+ pid, status = os.waitpid(self.pid, 0)
+ else:
+ raise ExceptionPexpect ('Cannot wait for dead child process.')
+ self.exitstatus = os.WEXITSTATUS(status)
+ if os.WIFEXITED (status):
+ self.status = status
+ self.exitstatus = os.WEXITSTATUS(status)
+ self.signalstatus = None
+ self.terminated = True
+ elif os.WIFSIGNALED (status):
+ self.status = status
+ self.exitstatus = None
+ self.signalstatus = os.WTERMSIG(status)
+ self.terminated = True
+ elif os.WIFSTOPPED (status):
+ raise ExceptionPexpect ('Wait was called for a child process that is stopped. This is not supported. Is some other process attempting job control with our child pid?')
+ return self.exitstatus
+
+ def isalive(self):
+ """This tests if the child process is running or not.
+ This is non-blocking. If the child was terminated then this
+ will read the exitstatus or signalstatus of the child.
+ This returns True if the child process appears to be running or False if not.
+ It can take literally SECONDS for Solaris to return the right status.
+ """
+ if self.terminated:
+ return False
+
+ if self.flag_eof:
+ # This is for Linux, which requires the blocking form of waitpid to get
+ # status of a defunct process. This is super-lame. The flag_eof would have
+ # been set in read_nonblocking(), so this should be safe.
+ waitpid_options = 0
+ else:
+ waitpid_options = os.WNOHANG
+
+ try:
+ pid, status = os.waitpid(self.pid, waitpid_options)
+ except OSError, e: # No child processes
+ if e[0] == errno.ECHILD:
+ raise ExceptionPexpect ('isalive() encountered condition where "terminated" is 0, but there was no child process. Did someone else call waitpid() on our process?')
+ else:
+ raise e
+
+ # I have to do this twice for Solaris. I can't even believe that I figured this out...
+ # If waitpid() returns 0 it means that no child process wishes to
+ # report, and the value of status is undefined.
+ if pid == 0:
+ try:
+ pid, status = os.waitpid(self.pid, waitpid_options) ### os.WNOHANG) # Solaris!
+ except OSError, e: # This should never happen...
+ if e[0] == errno.ECHILD:
+ raise ExceptionPexpect ('isalive() encountered condition that should never happen. There was no child process. Did someone else call waitpid() on our process?')
+ else:
+ raise e
+
+ # If pid is still 0 after two calls to waitpid() then
+ # the process really is alive. This seems to work on all platforms, except
+ # for Irix which seems to require a blocking call on waitpid or select, so I let read_nonblocking
+ # take care of this situation (unfortunately, this requires waiting through the timeout).
+ if pid == 0:
+ return True
+
+ if pid == 0:
+ return True
+
+ if os.WIFEXITED (status):
+ self.status = status
+ self.exitstatus = os.WEXITSTATUS(status)
+ self.signalstatus = None
+ self.terminated = True
+ elif os.WIFSIGNALED (status):
+ self.status = status
+ self.exitstatus = None
+ self.signalstatus = os.WTERMSIG(status)
+ self.terminated = True
+ elif os.WIFSTOPPED (status):
+ raise ExceptionPexpect ('isalive() encountered condition where child process is stopped. This is not supported. Is some other process attempting job control with our child pid?')
+ return False
+
+ def kill(self, sig):
+ """This sends the given signal to the child application.
+ In keeping with UNIX tradition it has a misleading name.
+ It does not necessarily kill the child unless
+ you send the right signal.
+ """
+ # Same as os.kill, but the pid is given for you.
+ if self.isalive():
+ os.kill(self.pid, sig)
+
+ def compile_pattern_list(self, patterns):
+ """This compiles a pattern-string or a list of pattern-strings.
+ Patterns must be a StringType, EOF, TIMEOUT, SRE_Pattern, or
+ a list of those. Patterns may also be None which results in
+ an empty list.
+
+ This is used by expect() when calling expect_list().
+ Thus expect() is nothing more than::
+ cpl = self.compile_pattern_list(pl)
+ return self.expect_list(clp, timeout)
+
+ If you are using expect() within a loop it may be more
+ efficient to compile the patterns first and then call expect_list().
+ This avoid calls in a loop to compile_pattern_list():
+ cpl = self.compile_pattern_list(my_pattern)
+ while some_condition:
+ ...
+ i = self.expect_list(clp, timeout)
+ ...
+ """
+ if patterns is None:
+ return []
+ if type(patterns) is not types.ListType:
+ patterns = [patterns]
+
+ compile_flags = re.DOTALL # Allow dot to match \n
+ if self.ignorecase:
+ compile_flags = compile_flags | re.IGNORECASE
+ compiled_pattern_list = []
+ for p in patterns:
+ if type(p) is types.StringType:
+ compiled_pattern_list.append(re.compile(p, compile_flags))
+ elif p is EOF:
+ compiled_pattern_list.append(EOF)
+ elif p is TIMEOUT:
+ compiled_pattern_list.append(TIMEOUT)
+ elif type(p) is type(re.compile('')):
+ compiled_pattern_list.append(p)
+ else:
+ raise TypeError ('Argument must be one of StringType, EOF, TIMEOUT, SRE_Pattern, or a list of those type. %s' % str(type(p)))
+
+ return compiled_pattern_list
+
+ def expect(self, pattern, timeout = -1, searchwindowsize=None):
+
+ """This seeks through the stream until a pattern is matched.
+ The pattern is overloaded and may take several types including a list.
+ The pattern can be a StringType, EOF, a compiled re, or a list of
+ those types. Strings will be compiled to re types. This returns the
+ index into the pattern list. If the pattern was not a list this
+ returns index 0 on a successful match. This may raise exceptions for
+ EOF or TIMEOUT. To avoid the EOF or TIMEOUT exceptions add
+ EOF or TIMEOUT to the pattern list.
+
+ After a match is found the instance attributes
+ 'before', 'after' and 'match' will be set.
+ You can see all the data read before the match in 'before'.
+ You can see the data that was matched in 'after'.
+ The re.MatchObject used in the re match will be in 'match'.
+ If an error occured then 'before' will be set to all the
+ data read so far and 'after' and 'match' will be None.
+
+ If timeout is -1 then timeout will be set to the self.timeout value.
+
+ Note: A list entry may be EOF or TIMEOUT instead of a string.
+ This will catch these exceptions and return the index
+ of the list entry instead of raising the exception.
+ The attribute 'after' will be set to the exception type.
+ The attribute 'match' will be None.
+ This allows you to write code like this:
+ index = p.expect (['good', 'bad', pexpect.EOF, pexpect.TIMEOUT])
+ if index == 0:
+ do_something()
+ elif index == 1:
+ do_something_else()
+ elif index == 2:
+ do_some_other_thing()
+ elif index == 3:
+ do_something_completely_different()
+ instead of code like this:
+ try:
+ index = p.expect (['good', 'bad'])
+ if index == 0:
+ do_something()
+ elif index == 1:
+ do_something_else()
+ except EOF:
+ do_some_other_thing()
+ except TIMEOUT:
+ do_something_completely_different()
+ These two forms are equivalent. It all depends on what you want.
+ You can also just expect the EOF if you are waiting for all output
+ of a child to finish. For example:
+ p = pexpect.spawn('/bin/ls')
+ p.expect (pexpect.EOF)
+ print p.before
+
+ If you are trying to optimize for speed then see expect_list().
+ """
+ compiled_pattern_list = self.compile_pattern_list(pattern)
+ return self.expect_list(compiled_pattern_list, timeout, searchwindowsize)
+
+ def expect_list(self, pattern_list, timeout = -1, searchwindowsize = -1):
+ """This takes a list of compiled regular expressions and returns
+ the index into the pattern_list that matched the child output.
+ The list may also contain EOF or TIMEOUT (which are not
+ compiled regular expressions). This method is similar to
+ the expect() method except that expect_list() does not
+ recompile the pattern list on every call.
+ This may help if you are trying to optimize for speed, otherwise
+ just use the expect() method. This is called by expect().
+ If timeout==-1 then the self.timeout value is used.
+ If searchwindowsize==-1 then the self.searchwindowsize value is used.
+ """
+
+ self.patterns = pattern_list
+
+ if timeout == -1:
+ timeout = self.timeout
+ if timeout is not None:
+ end_time = time.time() + timeout
+ if searchwindowsize == -1:
+ searchwindowsize = self.searchwindowsize
+
+ try:
+ incoming = self.buffer
+ while True: # Keep reading until exception or return.
+ # Sequence through the list of patterns looking for a match.
+ first_match = -1
+ for cre in pattern_list:
+ if cre is EOF or cre is TIMEOUT:
+ continue # The patterns for PexpectExceptions are handled differently.
+ if searchwindowsize is None: # search everything
+ match = cre.search(incoming)
+ else:
+ startpos = max(0, len(incoming) - searchwindowsize)
+ match = cre.search(incoming, startpos)
+ if match is None:
+ continue
+ if first_match > match.start() or first_match == -1:
+ first_match = match.start()
+ self.match = match
+ self.match_index = pattern_list.index(cre)
+ if first_match > -1:
+ self.buffer = incoming[self.match.end() : ]
+ self.before = incoming[ : self.match.start()]
+ self.after = incoming[self.match.start() : self.match.end()]
+ return self.match_index
+ # No match at this point
+ if timeout < 0 and timeout is not None:
+ raise TIMEOUT ('Timeout exceeded in expect_list().')
+ # Still have time left, so read more data
+ c = self.read_nonblocking (self.maxread, timeout)
+ time.sleep (0.0001)
+ incoming = incoming + c
+ if timeout is not None:
+ timeout = end_time - time.time()
+ except EOF, e:
+ self.buffer = ''
+ self.before = incoming
+ self.after = EOF
+ if EOF in pattern_list:
+ self.match = EOF
+ self.match_index = pattern_list.index(EOF)
+ return self.match_index
+ else:
+ self.match = None
+ self.match_index = None
+ raise EOF (str(e) + '\n' + str(self))
+ except TIMEOUT, e:
+ self.before = incoming
+ self.after = TIMEOUT
+ if TIMEOUT in pattern_list:
+ self.match = TIMEOUT
+ self.match_index = pattern_list.index(TIMEOUT)
+ return self.match_index
+ else:
+ self.match = None
+ self.match_index = None
+ raise TIMEOUT (str(e) + '\n' + str(self))
+ except Exception:
+ self.before = incoming
+ self.after = None
+ self.match = None
+ self.match_index = None
+ raise
+
+ def getwinsize(self):
+ """This returns the terminal window size of the child tty.
+ The return value is a tuple of (rows, cols).
+ """
+ if 'TIOCGWINSZ' in dir(termios):
+ TIOCGWINSZ = termios.TIOCGWINSZ
+ else:
+ TIOCGWINSZ = 1074295912L # assume if not defined
+ s = struct.pack('HHHH', 0, 0, 0, 0)
+ x = fcntl.ioctl(self.fileno(), TIOCGWINSZ, s)
+ return struct.unpack('HHHH', x)[0:2]
+
+ def setwinsize(self, r, c):
+ """This sets the terminal window size of the child tty.
+ This will cause a SIGWINCH signal to be sent to the child.
+ This does not change the physical window size.
+ It changes the size reported to TTY-aware applications like
+ vi or curses -- applications that respond to the SIGWINCH signal.
+ """
+ # Check for buggy platforms. Some Python versions on some platforms
+ # (notably OSF1 Alpha and RedHat 7.1) truncate the value for
+ # termios.TIOCSWINSZ. It is not clear why this happens.
+ # These platforms don't seem to handle the signed int very well;
+ # yet other platforms like OpenBSD have a large negative value for
+ # TIOCSWINSZ and they don't have a truncate problem.
+ # Newer versions of Linux have totally different values for TIOCSWINSZ.
+ # Note that this fix is a hack.
+ if 'TIOCSWINSZ' in dir(termios):
+ TIOCSWINSZ = termios.TIOCSWINSZ
+ else:
+ TIOCSWINSZ = -2146929561
+ if TIOCSWINSZ == 2148037735L: # L is not required in Python >= 2.2.
+ TIOCSWINSZ = -2146929561 # Same bits, but with sign.
+ # Note, assume ws_xpixel and ws_ypixel are zero.
+ s = struct.pack('HHHH', r, c, 0, 0)
+ fcntl.ioctl(self.fileno(), TIOCSWINSZ, s)
+
+ def interact(self, escape_character = chr(29), input_filter = None, output_filter = None):
+ """This gives control of the child process to the interactive user
+ (the human at the keyboard).
+ Keystrokes are sent to the child process, and the stdout and stderr
+ output of the child process is printed.
+ This simply echos the child stdout and child stderr to the real
+ stdout and it echos the real stdin to the child stdin.
+ When the user types the escape_character this method will stop.
+ The default for escape_character is ^]. This should not be confused
+ with ASCII 27 -- the ESC character. ASCII 29 was chosen
+ for historical merit because this is the character used
+ by 'telnet' as the escape character. The escape_character will
+ not be sent to the child process.
+
+ You may pass in optional input and output filter functions.
+ These functions should take a string and return a string.
+ The output_filter will be passed all the output from the child process.
+ The input_filter will be passed all the keyboard input from the user.
+ The input_filter is run BEFORE the check for the escape_character.
+
+ Note that if you change the window size of the parent
+ the SIGWINCH signal will not be passed through to the child.
+ If you want the child window size to change when the parent's
+ window size changes then do something like the following example:
+ import pexpect, struct, fcntl, termios, signal, sys
+ def sigwinch_passthrough (sig, data):
+ s = struct.pack("HHHH", 0, 0, 0, 0)
+ a = struct.unpack('hhhh', fcntl.ioctl(sys.stdout.fileno(), termios.TIOCGWINSZ , s))
+ global p
+ p.setwinsize(a[0],a[1])
+ p = pexpect.spawn('/bin/bash') # Note this is global and used in sigwinch_passthrough.
+ signal.signal(signal.SIGWINCH, sigwinch_passthrough)
+ p.interact()
+ """
+ # Flush the buffer.
+ self.stdout.write (self.buffer)
+ self.stdout.flush()
+ self.buffer = ''
+ mode = tty.tcgetattr(self.STDIN_FILENO)
+ tty.setraw(self.STDIN_FILENO)
+ try:
+ self.__interact_copy(escape_character, input_filter, output_filter)
+ finally:
+ tty.tcsetattr(self.STDIN_FILENO, tty.TCSAFLUSH, mode)
+
+ def __interact_writen(self, fd, data):
+ """This is used by the interact() method.
+ """
+ while data != '' and self.isalive():
+ n = os.write(fd, data)
+ data = data[n:]
+ def __interact_read(self, fd):
+ """This is used by the interact() method.
+ """
+ return os.read(fd, 1000)
+ def __interact_copy(self, escape_character = None, input_filter = None, output_filter = None):
+ """This is used by the interact() method.
+ """
+ while self.isalive():
+ r,w,e = self.__select([self.child_fd, self.STDIN_FILENO], [], [])
+ if self.child_fd in r:
+ data = self.__interact_read(self.child_fd)
+ if output_filter: data = output_filter(data)
+ if self.logfile is not None:
+ self.logfile.write (data)
+ self.logfile.flush()
+ os.write(self.STDOUT_FILENO, data)
+ if self.STDIN_FILENO in r:
+ data = self.__interact_read(self.STDIN_FILENO)
+ if input_filter: data = input_filter(data)
+ i = data.rfind(escape_character)
+ if i != -1:
+ data = data[:i]
+ self.__interact_writen(self.child_fd, data)
+ break
+ self.__interact_writen(self.child_fd, data)
+ def __select (self, iwtd, owtd, ewtd, timeout=None):
+ """This is a wrapper around select.select() that ignores signals.
+ If select.select raises a select.error exception and errno is an EINTR error then
+ it is ignored. Mainly this is used to ignore sigwinch (terminal resize).
+ """
+ # if select() is interrupted by a signal (errno==EINTR) then
+ # we loop back and enter the select() again.
+ if timeout is not None:
+ end_time = time.time() + timeout
+ while True:
+ try:
+ return select.select (iwtd, owtd, ewtd, timeout)
+ except select.error, e:
+ if e[0] == errno.EINTR:
+ # if we loop back we have to subtract the amount of time we already waited.
+ if timeout is not None:
+ timeout = end_time - time.time()
+ if timeout < 0:
+ return ([],[],[])
+ else: # something else caused the select.error, so this really is an exception
+ raise
+
+##############################################################################
+# The following methods are no longer supported or allowed..
+ def setmaxread (self, maxread):
+ """This method is no longer supported or allowed.
+ I don't like getters and setters without a good reason.
+ """
+ raise ExceptionPexpect ('This method is no longer supported or allowed. Just assign a value to the maxread member variable.')
+ def expect_exact (self, pattern_list, timeout = -1):
+ """This method is no longer supported or allowed.
+ It was too hard to maintain and keep it up to date with expect_list.
+ Few people used this method. Most people favored reliability over speed.
+ The implementation is left in comments in case anyone needs to hack this
+ feature back into their copy.
+ If someone wants to diff this with expect_list and make them work
+ nearly the same then I will consider adding this make in.
+ """
+ raise ExceptionPexpect ('This method is no longer supported or allowed.')
+ def setlog (self, fileobject):
+ """This method is no longer supported or allowed.
+ """
+ raise ExceptionPexpect ('This method is no longer supported or allowed. Just assign a value to the logfile member variable.')
+
+##############################################################################
+# End of spawn class
+##############################################################################
+
+def which (filename):
+ """This takes a given filename; tries to find it in the environment path;
+ then checks if it is executable.
+ This returns the full path to the filename if found and executable.
+ Otherwise this returns None.
+ """
+ # Special case where filename already contains a path.
+ if os.path.dirname(filename) != '':
+ if os.access (filename, os.X_OK):
+ return filename
+
+ if not os.environ.has_key('PATH') or os.environ['PATH'] == '':
+ p = os.defpath
+ else:
+ p = os.environ['PATH']
+
+ # Oddly enough this was the one line that made Pexpect
+ # incompatible with Python 1.5.2.
+ #pathlist = p.split (os.pathsep)
+ pathlist = string.split (p, os.pathsep)
+
+ for path in pathlist:
+ f = os.path.join(path, filename)
+ if os.access(f, os.X_OK):
+ return f
+ return None
+
+def split_command_line(command_line):
+ """This splits a command line into a list of arguments.
+ It splits arguments on spaces, but handles
+ embedded quotes, doublequotes, and escaped characters.
+ It's impossible to do this with a regular expression, so
+ I wrote a little state machine to parse the command line.
+ """
+ arg_list = []
+ arg = ''
+
+ # Constants to name the states we can be in.
+ state_basic = 0
+ state_esc = 1
+ state_singlequote = 2
+ state_doublequote = 3
+ state_whitespace = 4 # The state of consuming whitespace between commands.
+ state = state_basic
+
+ for c in command_line:
+ if state == state_basic or state == state_whitespace:
+ if c == '\\': # Escape the next character
+ state = state_esc
+ elif c == r"'": # Handle single quote
+ state = state_singlequote
+ elif c == r'"': # Handle double quote
+ state = state_doublequote
+ elif c.isspace():
+ # Add arg to arg_list if we aren't in the middle of whitespace.
+ if state == state_whitespace:
+ None # Do nothing.
+ else:
+ arg_list.append(arg)
+ arg = ''
+ state = state_whitespace
+ else:
+ arg = arg + c
+ state = state_basic
+ elif state == state_esc:
+ arg = arg + c
+ state = state_basic
+ elif state == state_singlequote:
+ if c == r"'":
+ state = state_basic
+ else:
+ arg = arg + c
+ elif state == state_doublequote:
+ if c == r'"':
+ state = state_basic
+ else:
+ arg = arg + c
+
+ if arg != '':
+ arg_list.append(arg)
+ return arg_list
+
diff --git a/base/pkit.py b/base/pkit.py
new file mode 100644
index 0000000..06e98da
--- /dev/null
+++ b/base/pkit.py
@@ -0,0 +1,511 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2009 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Stan Dolson , Goutam Kodu
+#
+
+# Std Lib
+import os
+import os.path
+import sys
+import re
+import time
+import cStringIO
+import ConfigParser
+import shutil
+import stat
+
+# Local
+from base.logger import *
+from base.g import *
+from base.codes import *
+from base import utils, device
+
+# DBus
+import dbus
+import dbus.service
+import gobject
+
+import warnings
+# Ignore: .../dbus/connection.py:242: DeprecationWarning: object.__init__() takes no parameters
+# (occurring on Python 2.6/dBus 0.83/Ubuntu 9.04)
+warnings.simplefilter("ignore", DeprecationWarning)
+
+
+class AccessDeniedException(dbus.DBusException):
+ _dbus_error_name = 'com.hp.hplip.AccessDeniedException'
+
+class UnsupportedException(dbus.DBusException):
+ _dbus_error_name = 'com.hp.hplip.UnsupportedException'
+
+class UsageError(dbus.DBusException):
+ _dbus_error_name = 'com.hp.hplip.UsageError'
+
+
+POLICY_KIT_ACTION = "com.hp.hplip"
+INSTALL_PLUGIN_ACTION = "com.hp.hplip.installplugin"
+
+
+def get_service_bus():
+ return dbus.SystemBus()
+
+
+def get_service(bus=None):
+ if not bus:
+ bus = get_service_bus()
+
+ service = bus.get_object(BackendService.SERVICE_NAME, '/')
+ service = dbus.Interface(service, BackendService.INTERFACE_NAME)
+ return service
+
+
+class PolicyKitAuthentication(object):
+ def __init__(self):
+ super(PolicyKitAuthentication, self).__init__()
+ self.pkit = None
+ self.auth = None
+
+
+ def is_authorized(self, action_id, pid=None):
+ if pid == None:
+ pid = os.getpid()
+
+ pid = dbus.UInt32(pid)
+
+ authorized = self.policy_kit.IsProcessAuthorized(action_id, pid, False)
+ log.debug("is_authorized(%s) = %r" % (action_id, authorized))
+
+ return (authorized == 'yes')
+
+
+ def obtain_authorization(self, action_id, widget=None):
+ if self.is_authorized(action_id):
+ return True
+
+ xid = (widget and widget.get_toplevel().window.xid or 0)
+ xid, pid = dbus.UInt32(xid), dbus.UInt32(os.getpid())
+
+ granted = self.auth_agent.ObtainAuthorization(action_id, xid, pid)
+ log.debug("obtain_authorization(%s) = %r" % (action_id, granted))
+
+ return bool(granted)
+
+
+ def get_policy_kit(self):
+ if self.pkit:
+ return self.pkit
+
+ service = dbus.SystemBus().get_object('org.freedesktop.PolicyKit', '/')
+ self.pkit = dbus.Interface(service, 'org.freedesktop.PolicyKit')
+ return self.pkit
+
+ policy_kit = property(get_policy_kit)
+
+
+ def get_auth_agent(self):
+ if self.auth:
+ return self.auth
+
+ self.auth = dbus.SessionBus().get_object(
+ 'org.freedesktop.PolicyKit.AuthenticationAgent', '/')
+ return self.auth
+
+ auth_agent = property(get_auth_agent)
+
+
+
+class PolicyKitService(dbus.service.Object):
+ def check_permission_v0(self, sender, action=POLICY_KIT_ACTION):
+ if not sender:
+ log.error("Session not authorized by PolicyKit")
+ raise AccessDeniedException('Session not authorized by PolicyKit')
+
+ try:
+ policy_auth = PolicyKitAuthentication()
+ bus = dbus.SystemBus()
+
+ dbus_object = bus.get_object('org.freedesktop.DBus', '/')
+ dbus_object = dbus.Interface(dbus_object, 'org.freedesktop.DBus')
+
+ pid = dbus.UInt32(dbus_object.GetConnectionUnixProcessID(sender))
+
+ granted = policy_auth.is_authorized(action, pid)
+ if not granted:
+ log.error("Process not authorized by PolicyKit")
+ raise AccessDeniedException('Process not authorized by PolicyKit')
+
+ granted = policy_auth.policy_kit.IsSystemBusNameAuthorized(action,
+ sender,
+ False)
+ if granted != 'yes':
+ log.error("Session not authorized by PolicyKit version 0")
+ raise AccessDeniedException('Session not authorized by PolicyKit')
+
+ except AccessDeniedException:
+ log.warning("AccessDeniedException")
+ raise
+
+ except dbus.DBusException, ex:
+ log.warning("AccessDeniedException %r", ex)
+ raise AccessDeniedException(ex.message)
+
+
+ def check_permission_v1(self, sender, connection, action=POLICY_KIT_ACTION):
+ if not sender or not connection:
+ log.error("Session not authorized by PolicyKit")
+ raise AccessDeniedException('Session not authorized by PolicyKit')
+
+ system_bus = dbus.SystemBus()
+ obj = system_bus.get_object("org.freedesktop.PolicyKit1",
+ "/org/freedesktop/PolicyKit1/Authority",
+ "org.freedesktop.PolicyKit1.Authority")
+ policy_kit = dbus.Interface(obj, "org.freedesktop.PolicyKit1.Authority")
+ info = dbus.Interface(connection.get_object("org.freedesktop.DBus",
+ "/org/freedesktop/DBus/Bus",
+ False),
+ "org.freedesktop.DBus")
+ pid = info.GetConnectionUnixProcessID(sender)
+
+ subject = (
+ 'unix-process',
+ { 'pid' : dbus.UInt32(pid, variant_level = 1) }
+ )
+ details = { '' : '' }
+ flags = dbus.UInt32(1) # AllowUserInteraction = 0x00000001
+ cancel_id = ''
+
+ (ok, notused, details) = \
+ policy_kit.CheckAuthorization(subject,
+ action,
+ details,
+ flags,
+ cancel_id)
+ if not ok:
+ log.error("Session not authorized by PolicyKit version 1")
+
+ return ok
+
+
+if utils.to_bool(sys_conf.get('configure', 'policy-kit')):
+ class BackendService(PolicyKitService):
+ INTERFACE_NAME = 'com.hp.hplip'
+ SERVICE_NAME = 'com.hp.hplip'
+ LOGFILE_NAME = '/tmp/hp-pkservice.log'
+
+ def __init__(self, connection=None, path='/', logfile=LOGFILE_NAME):
+ if connection is None:
+ connection = get_service_bus()
+
+ super(BackendService, self).__init__(connection, path)
+
+ self.name = dbus.service.BusName(self.SERVICE_NAME, connection)
+ self.loop = gobject.MainLoop()
+ self.version = 0
+
+ log.set_logfile("%s.%d" % (logfile, os.getpid()))
+ log.set_level("debug")
+
+ def run(self, version=None):
+ if version is None:
+ version = policykit_version()
+ if version is None:
+ log.error("Unable to determine installed PolicyKit version")
+ return
+
+ self.version = version
+ log.set_where(Logger.LOG_TO_CONSOLE_AND_FILE)
+ log.debug("Starting back-end service loop (version %d)" % version)
+
+ self.loop.run()
+
+
+ @dbus.service.method(dbus_interface=INTERFACE_NAME,
+ in_signature='s', out_signature='b',
+ sender_keyword='sender',
+ connection_keyword='connection')
+ def installPlugin(self, src_dir, sender=None, connection=None):
+ if self.version == 0:
+ try:
+ self.check_permission_v0(sender, INSTALL_PLUGIN_ACTION)
+ except AccessDeniedException, e:
+ return False
+
+ elif self.version == 1:
+ if not self.check_permission_v1(sender,
+ connection,
+ INSTALL_PLUGIN_ACTION):
+ return False
+
+ else:
+ log.error("installPlugin: invalid PolicyKit version %d" % self.version)
+ return False
+
+ log.debug("installPlugin: installing from '%s'" % src_dir)
+
+ if not copyPluginFiles(src_dir):
+ log.error("Plugin installation failed")
+ return False
+
+ return True
+
+
+ @dbus.service.method(dbus_interface=INTERFACE_NAME,
+ in_signature='s', out_signature='b',
+ sender_keyword='sender',
+ connection_keyword='connection')
+ def shutdown(self, arg, sender=None, connection=None):
+ log.debug("Stopping backend service")
+ self.loop.quit()
+
+ return True
+
+
+
+class PolicyKit(object):
+ def __init__(self, version=None):
+ if version is None:
+ version = policykit_version()
+ if version is None:
+ log.debug("Unable to determine installed PolicyKit version")
+ return
+
+ self.bus = dbus.SystemBus()
+ self.obj = self.bus.get_object(POLICY_KIT_ACTION, "/")
+ self.iface = dbus.Interface(self.obj, dbus_interface=POLICY_KIT_ACTION)
+ self.version = version
+
+ def installPlugin(self, src_dir):
+ if self.version == 0:
+ auth = PolicyKitAuthentication()
+ if not auth.is_authorized(INSTALL_PLUGIN_ACTION):
+ if not auth.obtain_authorization(INSTALL_PLUGIN_ACTION):
+ return None
+
+ try:
+ ok = self.iface.installPlugin(src_dir)
+ return ok
+ except dbus.DBusException, e:
+ log.debug("installPlugin: %s" % str(e))
+ return False
+
+
+ def shutdown(self):
+ if self.version == 0:
+ auth = PolicyKitAuthentication()
+ if not auth.is_authorized(INSTALL_PLUGIN_ACTION):
+ if not auth.obtain_authorization(INSTALL_PLUGIN_ACTION):
+ return None
+
+ try:
+ ok = self.iface.shutdown("")
+ return ok
+ except dbus.DBusException, e:
+ log.debug("shutdown: %s" % str(e))
+ return False
+
+
+
+def copyPluginFiles(src_dir):
+ os.chdir(src_dir)
+
+ plugin_spec = ConfigBase("plugin.spec")
+ products = plugin_spec.keys("products")
+
+ BITNESS = utils.getBitness()
+ ENDIAN = utils.getEndian()
+ PPDDIR = sys_conf.get('dirs', 'ppd')
+ DRVDIR = sys_conf.get('dirs', 'drv')
+ HOMEDIR = sys_conf.get('dirs', 'home')
+ DOCDIR = sys_conf.get('dirs', 'doc')
+ CUPSBACKENDDIR = sys_conf.get('dirs', 'cupsbackend')
+ CUPSFILTERDIR = sys_conf.get('dirs', 'cupsfilter')
+ RULESDIR = '/etc/udev/rules.d'
+
+ processor = utils.getProcessor()
+ if processor == 'power_machintosh':
+ ARCH = 'ppc'
+ else:
+ ARCH = 'x86_%d' % BITNESS
+
+ if BITNESS == 64:
+ SANELIBDIR = '/usr/lib64/sane'
+ LIBDIR = '/usr/lib64'
+ else:
+ SANELIBDIR = '/usr/lib/sane'
+ LIBDIR = '/usr/lib'
+
+ copies = []
+
+ for PRODUCT in products:
+ MODEL = PRODUCT.replace('hp-', '').replace('hp_', '')
+ for s in plugin_spec.get("products", PRODUCT).split(','):
+
+ if not plugin_spec.has_section(s):
+ log.error("Missing section [%s]" % s)
+ return False
+
+ src = plugin_spec.get(s, 'src', '')
+ trg = plugin_spec.get(s, 'trg', '')
+ link = plugin_spec.get(s, 'link', '')
+
+ if not src:
+ log.error("Missing 'src=' value in section [%s]" % s)
+ return False
+
+ if not trg:
+ log.error("Missing 'trg=' value in section [%s]" % s)
+ return False
+
+ src = os.path.basename(utils.cat(src))
+ trg = utils.cat(trg)
+
+ if link:
+ link = utils.cat(link)
+
+ copies.append((src, trg, link))
+
+ copies = utils.uniqueList(copies)
+ copies.sort()
+
+ os.umask(0)
+
+ for src, trg, link in copies:
+
+ if not os.path.exists(src):
+ log.debug("Source file %s does not exist. Skipping." % src)
+ continue
+
+ if os.path.exists(trg):
+ log.debug("Target file %s already exists. Replacing." % trg)
+ os.remove(trg)
+
+ trg_dir = os.path.dirname(trg)
+
+ if not os.path.exists(trg_dir):
+ log.debug("Target directory %s does not exist. Creating." % trg_dir)
+ os.makedirs(trg_dir, 0755)
+
+ if not os.path.isdir(trg_dir):
+ log.error("Target directory %s exists but is not a directory. Skipping." % trg_dir)
+ continue
+
+ try:
+ shutil.copyfile(src, trg)
+ except (IOError, OSError), e:
+ log.error("File copy failed: %s" % e.strerror)
+ continue
+
+ else:
+ if not os.path.exists(trg):
+ log.error("Target file %s does not exist. File copy failed." % trg)
+ continue
+ else:
+ os.chmod(trg, stat.S_IRWXU | stat.S_IRGRP | stat.S_IXGRP | stat.S_IROTH)
+
+ if link:
+ if os.path.exists(link):
+ log.debug("Symlink already exists. Replacing.")
+ os.remove(link)
+
+ log.debug("Creating symlink %s (link) to file %s (target)..." %
+ (link, trg))
+
+ try:
+ os.symlink(trg, link)
+ except (OSError, IOError), e:
+ log.debug("Unable to create symlink: %s" % e.strerror)
+ pass
+
+ log.debug("Updating hplip.conf - installed = 1")
+ sys_state.set('plugin', "installed", '1')
+ log.debug("Updating hplip.conf - eula = 1")
+ sys_state.set('plugin', "eula", '1')
+ plugin_version = sys_conf.get('hplip', 'version', '0.0.0')
+ sys_state.set('plugin','version', plugin_version)
+ return True
+
+
+def run_plugin_command(required=True, plugin_reason=PLUGIN_REASON_NONE):
+ su_sudo = None
+ need_sudo = True
+ name = None
+ version = None
+
+ if utils.to_bool(sys_conf.get('configure', 'policy-kit')):
+ try:
+ obj = PolicyKit()
+ su_sudo = "%s"
+ need_sudo = False
+ log.debug("Using PolicyKit for authentication")
+ except dbus.DBusException, ex:
+ log.error("PolicyKit NOT installed when configured for use")
+
+ if os.geteuid() == 0:
+ su_sudo = "%s"
+ need_sudo = False
+
+ password_f = None
+ if need_sudo:
+ su_sudo = utils.su_sudo()
+ if su_sudo is "su":
+ name,version,is_su = utils.os_release()
+ log.debug("name = %s version = %s is_su = %s" %(name,version,is_su))
+ if ( name == 'Fedora' and version >= '14' and is_su == True):
+ #using su opening GUI apps fail in Fedora 14.
+ #To run GUI apps as root, you need a root login shell (su -) in Fedora 14
+ su_sudo = 'su - -c "%s"'
+ else:
+ su_sudo = 'su -c "%s"'
+ password_f = "get_password_ui"
+ if su_sudo is None:
+ log.error("Unable to find a suitable sudo command to run 'hp-plugin'")
+ return (False, False)
+
+ req = '--required'
+ if not required:
+ req = '--optional'
+
+
+ if utils.which("hp-plugin"):
+ p_path="hp-plugin"
+ else:
+ p_path="python ./plugin.py"
+
+ if 'gksu' in su_sudo:
+ cmd = su_sudo % ("%s -u %s --reason %s" % (p_path, req, plugin_reason))
+ cmd +=" -m"
+ cmd += (" \"hp-plugin:- HP Device requires to install HP proprietary plugin. Please enter user (sudo) password to continue\"")
+ else:
+ cmd = su_sudo % ("%s -u %s --reason %s To_install_plugin_for_HP_Device" % (p_path, req, plugin_reason))
+
+ log.debug("%s" % cmd)
+ if password_f is not None:
+ status, output = utils.run(cmd, log_output=True, password_func=password_f, timeout=1)
+ else:
+ status, output = utils.run(cmd, log_output=True, password_func=None, timeout=1)
+
+ return (status == 0, True)
+
+
+def policykit_version():
+ if os.path.isdir("/usr/share/polkit-1"):
+ return 1
+ elif os.path.isdir("/usr/share/PolicyKit"):
+ return 0
+ else:
+ return None
diff --git a/base/pml.py b/base/pml.py
new file mode 100644
index 0000000..f07721c
--- /dev/null
+++ b/base/pml.py
@@ -0,0 +1,780 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2007 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+# Std Lib
+import sys
+import struct
+
+# Local
+from g import *
+from base.utils import unprintable
+
+# Request codes
+GET_REQUEST = 0x00
+GET_NEXT_REQUEST = 0x01
+GET_BLOCK_REQUEST = 0x02
+GET_NEXT_BLOCK_REQUEST = 0x03
+SET_REQUEST = 0x04
+ENABLE_TRAP_REQUEST = 0x05
+DISABLE_TRAP_REQUEST = 0x06
+TRAP_REQUEST = 0x07
+
+# Reply codes
+GET_REPLY = 0x80
+GET_NEXT_REPLY = 0x81
+BLOCK_REPLY = 0x82
+NEXT_BLOCK_REPLY = 0x83
+SET_REPLY = 0x84
+ENABLE_TRAP_REPLY = 0x85
+DISABLE_TRAP_REPLY = 0x85
+
+# PML Reply error codes
+ERROR_OK = 0x00
+ERROR_OK_END_OF_SUPPORTED_OBJECTS = 0x01
+ERROR_OK_NEAREST_LEGAL_VALUE_SUBSITUTED = 0x02
+ERROR_MAX_OK = 0x7f
+ERROR_UNKNOWN_REQUEST = 0x80
+ERROR_BUFFER_OVERFLOW = 0x81
+ERROR_COMMAND_EXECUTION = 0x82
+ERROR_UNKNOWN_OID = 0x83
+ERROR_OBJ_DOES_NOT_SUPPORT_SPECIFIED_ACTION = 0x84
+ERROR_INVALID_OR_UNSUPPORTED_VALUE = 0x85
+ERROR_PAST_END_OF_SUPPORTED_OBJS = 0x86
+ERROR_ACTION_CANNOT_BE_PERFORMED_NOW = 0x87
+ERROR_SYNTAX = 0x88
+
+# Data types
+TYPE_MASK = 0xfc
+TYPE_OBJECT_IDENTIFIER = 0x00
+TYPE_ENUMERATION = 0x04
+TYPE_SIGNED_INTEGER = 0x08
+TYPE_REAL = 0x0C
+TYPE_STRING = 0x10
+TYPE_BINARY = 0x14
+TYPE_ERROR_CODE = 0x18
+TYPE_NULL_VALUE = 0x1c
+TYPE_COLLECTION = 0x20
+TYPE_UNKNOWN = 0xff
+
+# Misc. constants
+MAX_VALUE_LEN = 1023
+MAX_OID_LEN = 32
+MAX_DATALEN = 4096
+
+# desired_int_sizes
+INT_SIZE_BYTE = struct.calcsize('b')
+INT_SIZE_WORD = struct.calcsize('h')
+INT_SIZE_INT = struct.calcsize('i')
+
+
+def buildPMLGetPacket(oid): # String dotted notation
+ oid = ''.join([chr(int(b.strip())) for b in oid.split('.')])
+ return struct.pack('>BBB%ss' % len(oid),
+ GET_REQUEST,
+ TYPE_OBJECT_IDENTIFIER,
+ len(oid), oid)
+
+def buildPMLGetPacketEx(oid): # OID identifier dict
+ return buildPMLGetPacket(oid['oid'])
+
+def buildEmbeddedPMLSetPacket(oid, value, data_type):
+ return ''.join(['PML\x20', buildPMLSetPacket(oid, value, data_type)])
+
+def buildPMLSetPacket(oid, value, data_type): # String dotted notation
+ oid = ''.join([chr(int(b.strip())) for b in oid.split('.')])
+
+ if data_type in (TYPE_ENUMERATION, TYPE_SIGNED_INTEGER, TYPE_COLLECTION):
+ data = struct.pack(">i", int(value))
+
+ if value > 0:
+ while len(data) > 0 and data[0] == '\x00':
+ data = data[1:]
+ else:
+ while len(data) > 1 and data[0] == '\xff' and data[1] == '\xff':
+ data = data[1:]
+
+ data = struct.pack(">BB%ds" % len(data), data_type, len(data), data)
+
+ elif data_type == TYPE_REAL:
+ data = struct.pack(">BBf", data_type, struct.calcsize("f"), float(value))
+
+ elif data_type == TYPE_STRING:
+ data = struct.pack(">BBBB%ss" % len(value), data_type, len(value) + 2, 0x01, 0x15, value)
+
+ elif data_type == TYPE_BINARY:
+ data = struct.pack(">BB%ss" % len(value), data_type, len(value), ''.join([chr(x) for x in value]))
+
+ p = struct.pack('>BBB%ss%ss' % (len(oid), len(data)),
+ SET_REQUEST,
+ TYPE_OBJECT_IDENTIFIER,
+ len(oid), oid,
+ data)
+
+ return p
+
+def ConvertToPMLDataFormat(value, data_type):
+ if data_type in (TYPE_ENUMERATION, TYPE_SIGNED_INTEGER, TYPE_COLLECTION):
+ data = struct.pack(">i", int(value))
+
+ if value > 0:
+ while len(data) > 0 and data[0] == '\x00':
+ data = data[1:]
+ else:
+ while len(data) > 1 and data[0] == '\xff' and data[1] == '\xff':
+ data = data[1:]
+
+ data = struct.pack(">%ds" % len(data), data)
+
+ elif data_type == TYPE_REAL:
+ data = struct.pack(">f", float(value))
+
+ elif data_type == TYPE_STRING:
+ #data = struct.pack(">BB%ss" % len(value), 0x01, 0x15, value)
+ data = struct.pack(">BB%ss" % len(value), 0x00, 0x0e, value) # changed for K80, seems to work on others...
+
+ elif data_type == TYPE_BINARY:
+ if type(value) == type(''):
+ data = value
+ elif type(value) == type([]):
+ data = struct.pack(">%ds" % len(value), ''.join([chr(x) for x in value]))
+ else:
+ log.error("Value type error.")
+
+ return data
+
+def ConvertFromPMLDataFormat(data, data_type, desired_int_size=INT_SIZE_INT):
+ if data_type in (TYPE_ENUMERATION, TYPE_SIGNED_INTEGER, TYPE_COLLECTION):
+
+ if len(data):
+
+ if data[0] == '\xff':
+ while len(data) < 4:
+ data = '\xff' + data
+
+ else:
+ while len(data) < 4:
+ data = '\x00' + data
+
+ if desired_int_size == INT_SIZE_INT:
+ return struct.unpack(">i", data)[0]
+
+ elif desired_int_size == INT_SIZE_WORD:
+ return struct.unpack(">h", data[-INT_SIZE_WORD])[0]
+
+ elif desired_int_size == INT_SIZE_BYTE:
+ return struct.unpack(">b", data[-INT_SIZE_BYTE])[0]
+
+ else:
+ raise Error(ERROR_INTERNAL)
+
+ else:
+ return 0
+
+ elif data_type == TYPE_REAL:
+ if len(data) == struct.calcsize("f"):
+ return struct.unpack(">f", data)[0]
+ else:
+ return 0.0
+
+ elif data_type == TYPE_STRING:
+ return ''.join([c for c in data if c not in unprintable])
+
+ elif data_type == TYPE_BINARY:
+ return data
+
+ return None
+
+
+def parsePMLPacket(p, expected_data_type=TYPE_UNKNOWN):
+ pos, state = 0, 1
+
+ data_type = TYPE_UNKNOWN
+ error_state = False
+ while state:
+
+ if state == 1: # reply and error code
+ reply, error_code = struct.unpack(">BB", p[pos : pos + 2])
+ state, pos = 2, pos + 2
+
+ if error_code > ERROR_MAX_OK:
+ error_state = True
+
+ elif state == 2: # data type and length
+ data_type, length = struct.unpack(">BB", p[pos : pos + 2])
+ state, pos = 3, pos + 2
+
+ if error_state:
+
+ if expected_data_type in (TYPE_COLLECTION, TYPE_ENUMERATION,
+ TYPE_SIGNED_INTEGER, TYPE_BINARY):
+ data = 0
+
+ elif expected_data_type == TYPE_REAL:
+ data = 0.0
+
+ else:
+ data = ''
+
+ break
+
+ elif state == 3: # data
+ data = p[pos : pos + length]
+ state, pos = 0, pos + length
+
+ if data_type == TYPE_OBJECT_IDENTIFIER:
+ state = 2
+ continue
+
+ elif data_type == TYPE_STRING:
+ if length > 0:
+ symbol_set, data = struct.unpack(">H%ss" % (length - 2), data)
+ else:
+ data = ''
+
+ elif data_type == TYPE_BINARY:
+ data = [ord(b) for b in data]
+
+ elif data_type == TYPE_ENUMERATION:
+ if length > 0:
+ data = struct.unpack(">i", "%s%s" % ('\x00' * (4 - length), data))[0]
+ else:
+ data = 0
+
+ elif data_type == TYPE_REAL:
+ if length > 0:
+ data = struct.unpack(">f", data)[0]
+ else:
+ data = 0.0
+
+ elif data_type == TYPE_SIGNED_INTEGER:
+ if length > 0:
+ pad = '\x00'
+ if ord(data[0]) & 0x80: pad = '\xff' # negative number
+ data = struct.unpack(">i", "%s%s" % (pad * (4 - length), data))[0]
+ else:
+ data = 0
+
+ elif data_type == TYPE_COLLECTION:
+ if length > 0:
+ data = struct.unpack(">i", "%s%s" % ('\x00' * (4 - length), data))[0]
+ else:
+ data = 0
+
+ elif data_type == TYPE_ERROR_CODE:
+ data = struct.unpack(">B", data)[0]
+
+ elif data_type == TYPE_NULL_VALUE:
+ data = None
+
+ break
+
+ return data, data_type, error_code
+
+
+
+def HPToSNMP(oid): # 1.
+ return '.'.join(['1.3.6.1.4.1.11.2.3.9.4.2', oid, '0'])
+
+def StdToSNMP(oid): # 2.
+ return '.'.join(['1.3.6.1.2.1.43', oid[2:]])
+
+def HRToSNMP(oid): # 3.
+ return '.'.join(['1.3.6.1.2.1.25', oid[2:]])
+
+def PMLToSNMP(oid):
+ assert len(oid) > 2
+
+ if oid[0] == '0': # 0. means its already in SNMP format (will fail for PML)
+ return oid[2:]
+
+ elif oid[0] == '1': # HP MIB
+ return HPToSNMP(oid)
+
+ elif oid[0] == '2': # Std MIB
+ return StdToSNMP(oid)
+
+ elif oid[0] == '3': # Host Resources MIB
+ return HRToSNMP(oid)
+
+ assert False
+
+
+#
+# OIDs
+#
+
+OID_DEVICE_ID = ('0.1.3.6.1.4.1.11.2.3.9.1.1.7.0', TYPE_STRING) # network/SNMP only (undocumented)
+
+OID_DEVICE_SUPPORTED_FUNCTIONS = ('1.1.2.67', TYPE_COLLECTION)
+DEVICE_SUPPORTED_FUNCTIONS_SCAN = 0x00002
+DEVICE_SUPPORTED_FUNCTIONS_SCAN_SIMPLEX = 0x00004
+DEVICE_SUPPORTED_FUNCTIONS_SCAN_DUPLEX = 0x00008
+DEVICE_SUPPORTED_FUNCTIONS_COPY = 0x00010
+DEVICE_SUPPORTED_FUNCTIONS_COPY_SIMPLEX_SIMPLEX = 0x00020
+DEVICE_SUPPORTED_FUNCTIONS_COPY_SIMPLEX_DUPLEX = 0x00040
+DEVICE_SUPPORTED_FUNCTIONS_COPY_DUPLEX_SIMPLEX = 0x00080
+DEVICE_SUPPORTED_FUNCTIONS_COPY_DUPLEX_DUPLEX = 0x00100
+DEVICE_SUPPORTED_FUNCTIONS_COPY_COLLATION = 0x00200
+DEVICE_SUPPORTED_FUNCTIONS_PRINT = 0x00400
+DEVICE_SUPPORTED_FUNCTIONS_AUTO_FEED_SIMPLEX = 0x00800
+DEVICE_SUPPORTED_FUNCTIONS_AUTO_FEED_DUPLEX = 0x01000
+DEVICE_SUPPORTED_FUNCTIONS_FAX_SEND = 0x02000
+DEVICE_SUPPORTED_FUNCTIONS_FAX_RECV = 0x04000
+DEVICE_SUPPORTED_FUNCTIONS_MASS_STORAGE = 0x08000
+DEVICE_SUPPORTED_FUNCTIONS_STREAMING_SAVE = 0x10000
+DEVICE_SUPPORTED_FUNCTIONS_FAX_CONFIG = 0x20000
+DEVICE_SUPPORTED_FUNCTIONS_FAX_CFG_SPEEDDIAL = 0x40000
+DEVICE_SUPPORTED_FUNCTIONS_FAX_CFG_GROUPDIAL = 0x80000
+
+OID_CLEAN = ('1.4.1.5.1.1', TYPE_ENUMERATION)
+CLEAN_CLEAN = 100
+CLEAN_PRIME = 200
+CLEAN_WIPE_AND_SPIT = 300
+
+OID_SERIAL_NUMBER = ('1.1.3.3', TYPE_STRING)
+OID_R_SETTING = ('1.1.1.35', TYPE_SIGNED_INTEGER)
+
+OID_PRINT_INTERNAL_PAGE = ('1.1.5.2', TYPE_ENUMERATION)
+PRINT_INTERNAL_PAGE_SUPPLIES_PAGE = 101
+PRINT_INTERNAL_PAGE_COLOR_PALETTE_CMYK_PAGE = 259
+PRINT_INTERNAL_PAGE_COLOR_CAL = 1102
+PRINT_INTERNAL_PAGE_COLOR_CAL_VERIFICATION = 1104
+PRINT_INTERNAL_PAGE_ALIGNMENT_PAGE = 1100 # LBOW/OJ Pro L7xxx
+PRINT_INTERNAL_PAGE_ALIGNMENT_PAGE_VERIFICATION = 1150 # LBOW
+PRINT_INTERNAL_PAGE_LINEFEED_CALIBRATION = 1407 # OJ Pro
+PRINT_INTERNAL_PAGE_AUTOMATIC_COLOR_CALIBRATION = 1408 # PS Pro B8800
+PRINT_INTERNAL_PAGE_PRINT_QUALITY_DIAGNOSTIC = 1409 # OJ Pro
+
+# From xojpanel
+OID_SPM_LINE1 = ('2.16.5.1.2.1.1', TYPE_STRING)
+OID_SPM_LINE2 = ('2.16.5.1.2.1.2', TYPE_STRING)
+
+OID_HP_LINE1 = ('1.1.2.20.2.1.1', TYPE_STRING)
+OID_HP_LINE2 = ('1.1.2.20.2.2.1', TYPE_STRING)
+
+
+# LaserJet Status (status type 3)
+OID_ON_OFF_LINE = ('1.1.2.5', TYPE_SIGNED_INTEGER)
+ON_OFF_LINE_ONLINE = 1
+ON_OFF_LINE_OFFLINE = 2
+ON_OFF_LINE_OFFLINE_AT_END_OF_JOB = 3
+
+OID_SLEEP_MODE = ('1.1.1.2', TYPE_SIGNED_INTEGER)
+SLEEP_MODE_FALSE = 1
+SLEEP_MODE_TRUE = 2
+
+OID_PRINTER_STATUS = ('3.3.5.1.1.1', TYPE_SIGNED_INTEGER)
+PRINTER_STATUS_OTHER = 1
+PRINTER_STATUS_UNKNOWN = 2
+PRINTER_STATUS_IDLE = 3
+PRINTER_STATUS_PRINTING = 4
+PRINTER_STATUS_WARMUP = 5
+
+OID_COVER_STATUS = ('2.6.1.1.3.1.1', TYPE_SIGNED_INTEGER)
+COVER_STATUS_OPEN = 3
+COVER_STATUS_CLOSED = 4
+
+OID_DETECTED_ERROR_STATE = ('3.3.5.1.2.1', TYPE_BINARY)
+DETECTED_ERROR_STATE_LOW_PAPER_MASK = 0x80
+DETECTED_ERROR_STATE_NO_PAPER_MASK = 0x40
+DETECTED_ERROR_STATE_LOW_CART_MASK = 0x20
+DETECTED_ERROR_STATE_OUT_CART_MASK = 0x10
+DETECTED_ERROR_STATE_DOOR_OPEN_MASK = 0x08
+DETECTED_ERROR_STATE_JAMMED_MASK = 0x04
+DETECTED_ERROR_STATE_OFFLINE_MASK = 0x02
+DETECTED_ERROR_STATE_SERVICE_REQUEST_MASK = 0x01
+DETECTED_ERROR_STATE_NO_ERROR = 0x00
+
+OID_MARKER_SUPPLIES_TYPE_x = '2.11.1.1.5.1.%d'
+OID_MARKER_SUPPLIES_TYPE_x_TYPE = TYPE_ENUMERATION
+OID_MARKER_SUPPLIES_TYPE_OTHER = 1
+OID_MARKER_SUPPLIES_TYPE_UNKNOWN = 2
+OID_MARKER_SUPPLIES_TYPE_TONER = 3
+OID_MARKER_SUPPLIES_TYPE_WASTE_TONER = 4
+OID_MARKER_SUPPLIES_TYPE_INK = 5
+OID_MARKER_SUPPLIES_TYPE_INK_CART = 6
+OID_MARKER_SUPPLIES_TYPE_INK_RIBBON = 7
+OID_MARKER_SUPPLIES_TYPE_WASTE_INK = 8
+OID_MARKER_SUPPLIES_TYPE_OPC = 9
+OID_MARKER_SUPPLIES_TYPE_DEVELOPER = 10
+OID_MARKER_SUPPLIES_TYPE_FUSER_OIL = 11
+OID_MARKER_SUPPLIES_TYPE_SOLID_WAX = 12
+OID_MARKER_SUPPLIES_TYPE_RIBBON_WAX = 13
+OID_MARKER_SUPPLIES_TYPE_WASTE_WAX = 14
+OID_MARKER_SUPPLIES_TYPE_FUSER = 15
+OID_MARKER_SUPPLIES_TYPE_CORONA_WIRE = 16
+OID_MARKER_SUPPLIES_TYPE_FUSER_OIL_WICK = 17
+OID_MARKER_SUPPLIES_TYPE_CLEANER_UNIT = 18
+OID_MARKER_SUPPLIES_TYPE_FUSER_CLEANING_PAD = 19
+OID_MARKER_SUPPLIES_TYPE_TRANSFER_UNIT = 20
+OID_MARKER_SUPPLIES_TYPE_TONER_CART = 21
+OID_MARKER_SUPPLIES_TYPE_FUSER_OILER = 22
+OID_MARKER_SUPPLIES_TYPE_ADF_MAINT_KIT = 23
+
+OID_MARKER_SUPPLIES_COLORANT_INDEX_x = '2.11.1.1.3.1.%d'
+OID_MARKER_SUPPLIES_COLORANT_INDEX_x_TYPE = TYPE_SIGNED_INTEGER
+
+OID_MARKER_SUPPLIES_MAX_x = '2.11.1.1.8.1.%d'
+OID_MARKER_SUPPLIES_MAX_x_TYPE = TYPE_SIGNED_INTEGER
+
+OID_MARKER_SUPPLIES_LEVEL_x = '2.11.1.1.9.1.%d'
+OID_MARKER_SUPPLIES_LEVEL_x_TYPE = TYPE_SIGNED_INTEGER
+
+OID_MARKER_COLORANT_VALUE_x = '2.12.1.1.4.1.%d'
+OID_MARKER_COLORANT_VALUE_x_TYPE = TYPE_STRING
+
+OID_MARKER_STATUS_x = '2.10.2.1.15.1.%d'
+OID_MARKER_STATUS_x_TYPE = TYPE_SIGNED_INTEGER
+OID_MARKER_STATUS_OK = 0
+OID_MARKER_STATUS_LOW_TONER_CONT = 8
+OID_MARKER_STATUS_LOW_TONER_STOP = 49
+OID_MARKER_STATUS_MISINSTALLED = 51
+
+OID_MARKER_SUPPLIES_DESCRIPTION_x = '2.11.1.1.6.1.%d'
+OID_MARKER_SUPPLIES_DESCRIPTION_x_TYPE = TYPE_BINARY
+
+OID_DEVICE_STATUS = ('3.3.2.1.5.1', TYPE_ENUMERATION)
+DEVICE_STATUS_UNKNOWN = 1
+DEVICE_STATUS_RUNNING = 2
+DEVICE_STATUS_WARNING = 3
+DEVICE_STATUS_TESTING = 4
+DEVICE_STATUS_DOWN = 5
+#end
+
+# alignment, cleaning, etc.
+OID_AUTO_ALIGNMENT = ('1.1.5.2', TYPE_ENUMERATION)
+AUTO_ALIGNMENT = 1100
+OID_ZCA = ('1.4.1.8.5.4.1', TYPE_SIGNED_INTEGER)
+OID_AGENT2_VERTICAL_ALIGNMENT = ('1.4.1.5.3.2.5', TYPE_SIGNED_INTEGER)
+OID_AGENT2_HORIZONTAL_ALIGNMENT = ('1.4.1.5.3.2.6', TYPE_SIGNED_INTEGER)
+OID_AGENT1_BIDIR_ADJUSTMENT = ('1.4.1.5.3.1.7', TYPE_SIGNED_INTEGER)
+OID_AGENT2_BIDIR_ADJUSTMENT = ('1.4.1.5.3.2.7', TYPE_SIGNED_INTEGER)
+OID_MARKING_AGENTS_INITIALIZED = ('1.4.1.5.1.4', TYPE_COLLECTION)
+OID_AGENT3_VERTICAL_ALIGNMENT = ("1.4.1.5.3.3.5", TYPE_SIGNED_INTEGER)
+OID_AGENT3_HORIZONTAL_ALIGNMENT = ("1.4.1.5.3.3.6", TYPE_SIGNED_INTEGER)
+OID_AGENT3_BIDIR_ADJUSTMENT = ("1.4.1.5.3.3.7", TYPE_SIGNED_INTEGER)
+OID_COLOR_CALIBRATION_SELECTION = ("1.4.1.5.1.9", TYPE_SIGNED_INTEGER)
+
+# Type 4 color cal
+OID_COLOR_CALIBRATION_ARRAY_1 = ("1.4.1.1.30.1.1", TYPE_SIGNED_INTEGER) # K
+OID_COLOR_CALIBRATION_ARRAY_2 = ("1.4.1.1.30.1.2", TYPE_SIGNED_INTEGER) # C
+OID_COLOR_CALIBRATION_ARRAY_3 = ("1.4.1.1.30.1.3", TYPE_SIGNED_INTEGER) # M
+OID_COLOR_CALIBRATION_ARRAY_4 = ("1.4.1.1.30.1.4", TYPE_SIGNED_INTEGER) # Y
+OID_COLOR_CALIBRATION_ARRAY_5 = ("1.4.1.1.30.1.5", TYPE_SIGNED_INTEGER) # c
+OID_COLOR_CALIBRATION_ARRAY_6 = ("1.4.1.1.30.1.6", TYPE_SIGNED_INTEGER) # m
+
+# Supported funcs
+OID_DEVICE_SUPPORTED_FUNCTIONS = ('1.1.2.67', TYPE_COLLECTION)
+DEVICE_SUPPORTED_FUNCTIONS_SCAN = 0x00002
+DEVICE_SUPPORTED_FUNCTIONS_SCAN_SIMPLEX = 0x00004
+DEVICE_SUPPORTED_FUNCTIONS_SCAN_DUPLEX = 0x00008
+DEVICE_SUPPORTED_FUNCTIONS_COPY = 0x00010
+DEVICE_SUPPORTED_FUNCTIONS_COPY_SIMPLEX_SIMPLEX = 0x00020
+DEVICE_SUPPORTED_FUNCTIONS_COPY_SIMPLEX_DUPLEX = 0x00040
+DEVICE_SUPPORTED_FUNCTIONS_COPY_DUPLEX_SIMPLEX = 0x00080
+DEVICE_SUPPORTED_FUNCTIONS_COPY_DUPLEX_DUPLEX = 0x00100
+DEVICE_SUPPORTED_FUNCTIONS_COPY_COLLATION = 0x00200
+DEVICE_SUPPORTED_FUNCTIONS_PRINT = 0x00400
+DEVICE_SUPPORTED_FUNCTIONS_AUTO_FEED_SIMPLEX = 0x00800
+DEVICE_SUPPORTED_FUNCTIONS_AUTO_FEED_DUPLEX = 0x01000
+DEVICE_SUPPORTED_FUNCTIONS_FAX_SEND = 0x02000
+DEVICE_SUPPORTED_FUNCTIONS_FAX_RECV = 0x04000
+DEVICE_SUPPORTED_FUNCTIONS_MASS_STORAGE = 0x08000
+DEVICE_SUPPORTED_FUNCTIONS_STREAMING_SAVE = 0x10000
+DEVICE_SUPPORTED_FUNCTIONS_FAX_CONFIG = 0x20000
+DEVICE_SUPPORTED_FUNCTIONS_FAX_CFG_SPEEDDIAL = 0x40000
+DEVICE_SUPPORTED_FUNCTIONS_FAX_CFG_GROUPDIAL = 0x80000
+
+
+OID_BATTERY_LEVEL = ('1.1.2.13', TYPE_SIGNED_INTEGER)
+OID_POWER_MODE = ('1.1.2.14', TYPE_ENUMERATION)
+POWER_MODE_ADPATER = 0x01
+POWER_MODE_BATTERY = 0x02
+POWER_MODE_CHARGING = 0x04
+POWER_MODE_DISCHARGING = 0x08
+POWER_MODE_BATTERY_LEVEL_KNOWN = 0x10
+
+OID_BATTERY_LEVEL_2 = ('1.1.2.61', TYPE_SIGNED_INTEGER)
+
+OID_POWER_SETTINGS = ('1.1.2.118', TYPE_ENUMERATION)
+OID_POWER_SETTINGS_15MIN = 1
+OID_POWER_SETTINGS_30MIN = 2
+OID_POWER_SETTINGS_45MIN = 3
+OID_POWER_SETTINGS_1HR = 4
+OID_POWER_SETTINGS_2HR = 5
+OID_POWER_SETTINGS_3HR = 6
+OID_POWER_SETTINGS_NEVER = 999
+
+#
+# Fax
+#
+
+OID_DEV_DOWNLOAD_TIMEOUT = ('1.1.1.17', TYPE_SIGNED_INTEGER)
+DEFAULT_DOWNLOAD_TIMEOUT = 600
+
+OID_FAX_DOWNLOAD_ERROR = ('1.3.7.2.6', TYPE_SIGNED_INTEGER)
+
+OID_FAXJOB_TX_TYPE = ('1.1.6.3.1.3', TYPE_ENUMERATION)
+FAXJOB_TX_TYPE_HOST_ONLY = 2
+
+OID_FAXJOB_TX_STATUS = ('1.1.6.3.3.3.1', TYPE_ENUMERATION)
+FAXJOB_TX_STATUS_IDLE = 1
+FAXJOB_TX_STATUS_DIALING = 2
+FAXJOB_TX_STATUS_CONNECTING = 3
+FAXJOB_TX_STATUS_TRANSMITTING = 4
+FAXJOB_TX_STATUS_DONE = 5
+
+FAXJOB_TX_STATUS_STR = {FAXJOB_TX_STATUS_IDLE: "Idle",
+ FAXJOB_TX_STATUS_DIALING: "Dialing",
+ FAXJOB_TX_STATUS_CONNECTING: "Connecting",
+ FAXJOB_TX_STATUS_TRANSMITTING: "Transmitting",
+ FAXJOB_TX_STATUS_DONE: "Done",}
+
+OID_FAXJOB_RX_STATUS = ('1.1.6.3.3.1.1', TYPE_ENUMERATION)
+FAXJOB_RX_STATUS_IDLE = 1
+FAXJOB_RX_STATUS_RINGING = 2
+FAXJOB_RX_STATUS_ANSWERING = 3
+FAXJOB_RX_STATUS_RECEIVING = 4
+FAXJOB_RX_STATUS_DONE = 5
+
+FAXJOB_RX_STATUS_STR = {FAXJOB_RX_STATUS_IDLE: "Idle",
+ FAXJOB_RX_STATUS_RINGING: "Ringing",
+ FAXJOB_RX_STATUS_ANSWERING: "Answering",
+ FAXJOB_RX_STATUS_RECEIVING: "Receiving",
+ FAXJOB_RX_STATUS_DONE: "Done",}
+
+OID_FAX_DOWNLOAD = ('1.3.7.1.6', TYPE_ENUMERATION)
+UPDN_STATE_IDLE = 1
+UPDN_STATE_REQSTART = 2
+UPDN_STATE_XFERACTIVE = 3
+UPDN_STATE_ERRORABORT = 4
+UPDN_STATE_XFERDONE = 5
+UPDN_STATE_NEWPAGE = 6
+UPDN_STATE_DISABLED = 7
+
+UPDN_STATE_STR = {UPDN_STATE_IDLE: "Idle",
+ UPDN_STATE_REQSTART: "Request start",
+ UPDN_STATE_XFERACTIVE: "Transfer active",
+ UPDN_STATE_ERRORABORT: "Error abort",
+ UPDN_STATE_XFERDONE: "Transfer done",
+ UPDN_STATE_NEWPAGE: "New page",
+ UPDN_STATE_DISABLED: "Disabled",}
+
+# Fax download errors (taken from doc/Fax/WindowsFax/sdcore/DevIO/DevIODefs.h)
+#
+DN_ERROR_NONE = 0
+DN_ERROR_HOST_ABORT = 705
+DN_ERROR_STOP_KEY_PRESSED = 706
+DN_ERROR_SESSION_FAIL = 709
+DN_ERROR_TX_ERROR = 710
+DN_ERROR_PHONE_UNAVAILABLE = 711
+DN_ERROR_OUT_OF_MEMORY = 713
+DN_ERROR_RESULT_BUSY = 714
+DN_ERROR_NO_ANSWER = 715
+DN_ERROR_NO_DIAL_TONE = 716
+DN_ERROR_DOC_JAM = 717
+DN_ERROR_DOOR_OPEN = 718
+DN_ERROR_POWER_FAILED = 719
+DN_ERROR_BLACKLIST = 720
+DN_ERROR_DOC_STORAGE_FULL = 721
+DN_ERROR_RESULT_COLOR_UNSUP = 722
+DN_ERROR_UNKNOWN = 9999
+
+DN_ERROR_STR = {DN_ERROR_NONE: "None",
+ DN_ERROR_HOST_ABORT: "Host aborted",
+ DN_ERROR_STOP_KEY_PRESSED: "Stop key pressed",
+ DN_ERROR_SESSION_FAIL: "Session failed",
+ DN_ERROR_TX_ERROR: "Transmit error",
+ DN_ERROR_PHONE_UNAVAILABLE: "Phone unavailable",
+ DN_ERROR_OUT_OF_MEMORY: "Out of memory",
+ DN_ERROR_RESULT_BUSY: "Result busy",
+ DN_ERROR_NO_ANSWER: "No answer",
+ DN_ERROR_NO_DIAL_TONE: "No dial tone",
+ DN_ERROR_DOC_JAM: "Document jammed",
+ DN_ERROR_DOOR_OPEN: "Door open",
+ DN_ERROR_POWER_FAILED: "Power failed",
+ DN_ERROR_BLACKLIST: "Blacklisted",
+ DN_ERROR_DOC_STORAGE_FULL: "Document storage full",
+ DN_ERROR_RESULT_COLOR_UNSUP: "Color unsupported",
+ DN_ERROR_UNKNOWN: "Unknown error"}
+
+OID_FAX_TOKEN = ('1.1.1.27', TYPE_BINARY)
+
+OID_FAX_TX_ID = ('1.1.6.3.2.3', TYPE_SIGNED_INTEGER)
+OID_FAXJOB_TX_ERROR = ('1.1.6.3.3.4.1', TYPE_SIGNED_INTEGER)
+
+OID_FAX_LOCAL_PHONE_NUM = ('1.1.3.8', TYPE_STRING)
+OID_FAX_STATION_NAME = ('1.1.3.9', TYPE_STRING)
+OID_FAX_LINE_TYPE = ('1.3.7.1.16', TYPE_ENUMERATION)
+OID_FAX_ANSWERMODE = ('1.1.9.2.1.1', TYPE_ENUMERATION)
+OID_FAX_RING_ENABLE = ('1.3.7.1.8', TYPE_ENUMERATION)
+OID_FAX_NUM_RINGS_PICKUP = ('1.1.9.2.1.2', TYPE_SIGNED_INTEGER)
+OID_FAX_MIN_RINGS_PICKUP = ('1.3.7.2.2', TYPE_SIGNED_INTEGER)
+OID_FAX_MAX_RINGS_PICKUP = ('1.3.7.2.3', TYPE_SIGNED_INTEGER)
+OID_FAX_RING_TYPE_PICKUP = ('1.1.9.2.1.3', TYPE_COLLECTION)
+OID_FAX_DIAL_MODE = ('1.1.9.1.1.1', TYPE_ENUMERATION)
+OID_FAX_ALLOW_REDIALS = ('1.4.2.5.3', TYPE_ENUMERATION)
+OID_FAX_REDIAL = ('1.1.9.1.1.2', TYPE_COLLECTION)
+OID_FAX_RESOLUTION = ('1.4.2.1.1', TYPE_BINARY)
+OID_FAX_CONTRAST = ('1.4.2.1.2', TYPE_SIGNED_INTEGER)
+
+#OID_FAX_UPLOAD = ('1.3.7.2.1', TYPE_ENUMERATION)
+#OID_FAX_UPLOAD_ERROR = ('1.3.7.2.7', TYPE_SIGNED_INTEGER)
+
+OID_FAX_CFG_UPLOAD_DATA_TYPE = ('1.1.1.14', TYPE_ENUMERATION)
+FAX_CFG_UPLOAD_DATA_TYPE_SPEEDDIALS = 5
+FAX_CFG_UPLOAD_DATA_TYPE_FAXLOGS = 6
+FAX_CFG_UPLOAD_DATA_TYPE_CONFIG_PARAMS = 7
+FAX_CFG_UPLOAD_DATA_TYPE_JUNK_FAX_DIAL_STRINGS = 8
+
+OID_UPLOAD_TIMEOUT = ('1.1.1.18', TYPE_SIGNED_INTEGER)
+DEFAULT_UPLOAD_TIMEOUT = 60
+
+OID_DEVICE_CFG_UPLOAD = ('1.1.1.13', TYPE_ENUMERATION)
+
+#
+# Copier
+#
+
+OID_COPIER_TOKEN = ('1.1.1.24', TYPE_BINARY)
+OID_COPY_SCANNER_DIMENSIONS = ('1.2.2.2.13', TYPE_STRING)
+
+# Sticky settings
+OID_COPIER_CONTRAST = ('1.5.1.2', TYPE_SIGNED_INTEGER) # -125, -100, -75, -50, -25, 0, 25, 50, 75, 100, 125
+OID_COPIER_REDUCTION = ('1.5.1.4', TYPE_SIGNED_INTEGER) # (100%=no scaling) (OID_COPIER_FIT_TO_PAGE overrides)
+ # range: COPIER-REDUCTION-MAXIMUM (25) - COPIER-ENLARGEMENT-MAXIMUM (400)
+OID_COPIER_NUM_COPIES = ('1.5.1.6', TYPE_SIGNED_INTEGER) # 1-99
+
+OID_COPIER_COLLATION = ('1.5.1.7', TYPE_ENUMERATION)
+COPIER_COLLATION_DISABLED = 1
+COPIER_COLLATION_FORWARD = 2
+
+OID_COPIER_ENLARGEMENT_MAXIMUM = ('1.5.1.11', TYPE_SIGNED_INTEGER) # default 400
+OID_COPIER_REDUCTION_MAXIMUM = ('1.5.1.12', TYPE_SIGNED_INTEGER) # default 25
+
+OID_COPIER_QUALITY = ('1.5.1.13', TYPE_ENUMERATION)
+COPIER_QUALITY_FAST = 1
+COPIER_QUALITY_NORMAL = 2
+COPIER_QUALITY_PRESENTATION = 3
+COPIER_QUALITY_DRAFT = 4
+COPIER_QUALITY_BEST = 5
+
+OID_COPIER_ADF_PAGE_COUNT = ('1.5.1.19', TYPE_SIGNED_INTEGER)
+OID_COPIER_PRINT_PAGE_COUNT = ('1.5.1.20', TYPE_SIGNED_INTEGER)
+
+OID_COPIER_FIT_TO_PAGE = ('1.5.1.47', TYPE_ENUMERATION)
+COPIER_FIT_TO_PAGE_DISABLED = 1
+COPIER_FIT_TO_PAGE_ENABLED = 2
+
+# Job (non-sticky) settings
+OID_COPIER_JOB_QUALITY = ('1.5.1.22', TYPE_ENUMERATION)
+# use enums from OID_COPIER_QUALITY
+
+OID_COPIER_JOB_MEDIA_SIZE = ('1.5.1.21', TYPE_ENUMERATION)
+COPIER_JOB_MEDIA_SIZE_US_LETTER = 2
+COPIER_JOB_MEDIA_SIZE_US_LEGAL = 3
+COPIER_JOB_MEDIA_SIZE_A4 = 26
+
+OID_COPIER_JOB_COLLATION = ('1.5.1.23', TYPE_ENUMERATION)
+# use enums from OID_COPIER_COLLATION
+
+OID_COPIER_JOB_NUM_COPIES = ('1.5.1.24', TYPE_SIGNED_INTEGER)
+OID_COPIER_JOB_REDUCTION = ('1.5.1.25', TYPE_SIGNED_INTEGER)
+OID_COPIER_JOB_CONTRAST = ('1.5.1.26', TYPE_SIGNED_INTEGER) # -125, -100, -75, -50, -25, 0, 25, 50, 75, 100, 125
+
+OID_COPIER_JOB_FIT_TO_PAGE = ('1.5.1.48', TYPE_ENUMERATION)
+# use enums from OID_COPIER_FIT_TO_PAGE
+
+# Copy job
+
+OID_COPIER_JOB = ('1.5.1.27', TYPE_ENUMERATION)
+COPIER_JOB_IDLE = 1
+COPIER_JOB_START = 2
+COPIER_JOB_ACTIVE = 3
+COPIER_JOB_ABORTING = 4
+COPIER_JOB_SETUP = 5
+
+# AiO Specific Copy
+
+OID_COLOR_COPY_REQUEST = ('1.5.1.8', TYPE_ENUMERATION)
+OID_SCAN_TO_PRINTER = ('1.5.1.5', TYPE_SIGNED_INTEGER)
+SCAN_TO_PRINTER_IDLE = 1
+SCAN_TO_PRINTER_START = 2
+SCAN_TO_PRINTER_ACTIVE = 3
+SCAN_TO_PRINTER_ABORTED = 4
+SCAN_TO_PRINTER_SET_DEFAULTS = 5
+SCAN_TO_PRINTER_GET_DEFAULTS = 6
+
+OID_PIXEL_DATA_TYPE = ('1.5.1.3', TYPE_SIGNED_INTEGER)
+PIXEL_DATA_TYPE_GRAYSCALE_256 = 8
+PIXEL_DATA_TYPE_COLOR_24_BIT = 24
+
+OID_COPIER_SPECIAL_FEATURES = ('1.5.1.16', TYPE_SIGNED_INTEGER)
+COPY_FEATURE_NONE = 1
+COPY_FEATURE_CLONE = 2
+COPY_FEATURE_POSTER = 3
+COPY_FEATURE_MIRROR = 4
+COPY_FEATURE_AUTOFIT = 5
+COPY_FEATURE_TWOUP = 6
+COPY_FEATURE_AUTOFILL = 7
+
+
+OID_COPIER_PHOTO_MODE = ('1.5.1.15', TYPE_COLLECTION)
+ENHANCE_LIGHT_COLORS = 0x00000001 # Bit 0
+ENHANCE_TEXT = 0x00000002 # Bit 1
+
+OID_COPIER_NUM_COPIES_AIO = ('1.5.1.6', TYPE_SIGNED_INTEGER)
+OID_COPIER_CONTRAST_AIO = ('1.5.1.2', TYPE_SIGNED_INTEGER)
+OID_COPIER_REDUCTION_AIO = ('1.5.1.4', TYPE_SIGNED_INTEGER)
+OID_COPIER_QUALITY_AIO = ('1.5.1.13', TYPE_ENUMERATION)
+
+OID_COPIER_JOB_INPUT_TRAY_SELECT = ('1.5.1.51', TYPE_SIGNED_INTEGER)
+COPIER_JOB_INPUT_TRAY_1 = 1
+COPIER_JOB_INPUT_TRAY_2 = 1
+COPIER_JOB_INPUT_TRAY_3 = 1
+
+OID_COPIER_MEDIA_TYPE = ('1.5.1.14', TYPE_SIGNED_INTEGER)
+COPIER_MEDIA_TYPE_PLAIN = 1
+COPIER_MEDIA_TYPE_BRIGHT_WHITE = 2
+COPIER_MEDIA_TYPE_PREMIUM_PHOTO = 3
+COPIER_MEDIA_TYPE_SPECIAL = 4
+COPIER_MEDIA_TYPE_TRANSPARENCY = 5
+COPIER_MEDIA_TYPE_IRON_ON = 6
+COPIER_MEDIA_TYPE_FAST_TRANSPARANCEY = 7
+COPIER_MEDIA_TYPE_BROCHURE_MATTE = 8
+COPIER_MEDIA_TYPE_BROCHURE_GLOSSY = 9
+COPIER_MEDIA_TYPE_PHOTO_GLOSSY = 10
+COPIER_MEDIA_TYPE_MATTE_PAPER = 11
+COPIER_MEDIA_TYPE_EVERYDAY_PHOTO = 12
+COPIER_MEDIA_TYPE_PHOTO_QUAL_INKJET = 13
+COPIER_MEDIA_TYPE_PHOTO = 14
+COPIER_MEDIA_TYPE_AUTOMATIC = 15
+COPIER_MEDIA_TYPE_ADVANCED_PHOTO = 16
+COPIER_MEDIA_TYPE_IRON_ON_MIRRORED = 17
+
+
+
+# Misc
+
+OID_DATE_AND_TIME = ('1.1.2.17', TYPE_BINARY)
+
+
+
diff --git a/base/slp.py b/base/slp.py
new file mode 100644
index 0000000..02a4325
--- /dev/null
+++ b/base/slp.py
@@ -0,0 +1,178 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2007 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+# Std Lib
+import sys
+import time
+import socket
+import select
+import struct
+import random
+import re
+
+# Local
+from g import *
+import utils
+
+prod_pat = re.compile(r"""\(\s*x-hp-prod_id\s*=\s*(.*?)\s*\)""", re.IGNORECASE)
+mac_pat = re.compile(r"""\(\s*x-hp-mac\s*=\s*(.*?)\s*\)""", re.IGNORECASE)
+num_port_pat = re.compile(r"""\(\s*x-hp-num_port\s*=\s*(.*?)\s*\)""", re.IGNORECASE)
+ip_pat = re.compile(r"""\(\s*x-hp-ip\s*=\s*(.*?)\s*\)""", re.IGNORECASE)
+p1_pat = re.compile(r"""\(\s*x-hp-p1\s*=(?:\d\)|\s*(.*?)\s*\))""", re.IGNORECASE)
+p2_pat = re.compile(r"""\(\s*x-hp-p2\s*=(?:\d\)|\s*(.*?)\s*\))""", re.IGNORECASE)
+p3_pat = re.compile(r"""\(\s*x-hp-p3\s*=(?:\d\)|\s*(.*?)\s*\))""", re.IGNORECASE)
+hn_pat = re.compile(r"""\(\s*x-hp-hn\s*=\s*(.*?)\s*\)""", re.IGNORECASE)
+
+
+def detectNetworkDevices(ttl=4, timeout=10): #, xid=None, qappobj = None):
+ mcast_addr, mcast_port ='224.0.1.60', 427
+ found_devices = {}
+
+ s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
+
+ x = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
+
+ try:
+ x.connect(('1.2.3.4', 56))
+ except socket.error:
+ log.error("Network is unreachable. Please check your network connection and try again.")
+ return {}
+
+ intf = x.getsockname()[0]
+ x.close()
+
+ s.setblocking(0)
+ ttl = struct.pack('B', ttl)
+
+ try:
+ s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
+ s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
+ except (AttributeError, socket.error):
+ pass
+
+ try:
+ s.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_TTL, ttl)
+ s.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_IF, socket.inet_aton(intf) + socket.inet_aton('0.0.0.0'))
+ s.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_LOOP ,1)
+ except Exception, e:
+ log.error("Unable to setup multicast socket for SLP: %s" % e)
+ return {}
+
+ packet = ''.join(['\x01\x06\x00\x2c\x00\x00\x65\x6e\x00\x03',
+ struct.pack('!H', random.randint(1, 65535)), '\x00\x00\x00\x18service:x-hpnp-discover:\x00\x00\x00\x00'])
+
+ try:
+ s.sendto(packet, 0, (mcast_addr, mcast_port))
+ except socket.error, e:
+ log.error("Unable to send broadcast SLP packet: %s" % e)
+
+ time_left = timeout
+ while time_left > 0:
+ start_time = time.time()
+ r, w, e = select.select([s], [], [s], time_left)
+ time_left -= (time.time() - start_time)
+ if not r: continue
+
+ data, addr = s.recvfrom(2048)
+ update_spinner()
+
+ log.log_data(data, width=32)
+
+ try:
+ ver, func, length, flags, dialect, lang_code, char_encode, recv_xid, status_code, attr_length = \
+ struct.unpack("!BBHBBHHHHH", data[:16])
+
+ x = struct.unpack("!%ds" % attr_length, data[16:])[0].strip()
+ except struct.error:
+ continue
+
+ try:
+ num_ports = int(num_port_pat.search(x).group(1))
+ except (AttributeError, ValueError):
+ num_ports = 1
+
+ if num_ports == 0: # Embedded devices
+ num_ports = 1
+
+ y = {'num_devices' : 0, 'num_ports': num_ports, 'product_id' : '',
+ 'status_code': 0, 'device2': '0', 'device3': '0', 'note': '', 'device1': '0'}
+
+ # Check port 1
+ try:
+ y['device1'] = p1_pat.search(x).group(1)
+ except AttributeError:
+ y['device1'] = '0'
+ else:
+ y['num_devices'] += 1
+
+
+ if num_ports > 1: # Check port 2
+ try:
+ y['device2'] = p2_pat.search(x).group(1)
+ except AttributeError:
+ y['device2'] = '0'
+ else:
+ y['num_devices'] += 1
+
+
+ if num_ports > 2: # Check port 3
+ try:
+ y['device3'] = p3_pat.search(x).group(1)
+ except AttributeError:
+ y['device3'] = '0'
+ else:
+ y['num_devices'] += 1
+
+ if y['device1'] is None:
+ y['device1'] = '0'
+
+ if y['device2'] is None:
+ y['device2'] = '0'
+
+ if y['device3'] is None:
+ y['device3'] = '0'
+
+ try:
+ y['product_id'] = prod_pat.search(x).group(1)
+ except AttributeError:
+ y['product_id'] = ''
+ try:
+ y['mac'] = mac_pat.search(x).group(1)
+ except AttributeError:
+ y['mac'] = ''
+ try:
+ y['ip'] = ip_pat.search(x).group(1)
+ except AttributeError:
+ y['ip'] = ''
+ try:
+ y['hn'] = hn_pat.search(x).group(1)
+ except AttributeError:
+ y['hn'] = ''
+
+ y['status_code'] = status_code
+ found_devices[addr[0]] = y
+
+ log.debug("Found device: %s" % y)
+
+
+ return found_devices
+
+
diff --git a/base/status.py b/base/status.py
new file mode 100644
index 0000000..d0cd605
--- /dev/null
+++ b/base/status.py
@@ -0,0 +1,1695 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2007 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch, Narla Naga Samrat Chowdary, Yashwant Kumar Sahu
+#
+
+from __future__ import division
+
+# Std Lib
+import struct
+import cStringIO
+import xml.parsers.expat as expat
+import re
+import urllib
+try:
+ from xml.etree import ElementTree
+ etree_loaded = True
+except ImportError:
+ try:
+ from elementtree.ElementTree import XML
+ elementtree_loaded = True
+ except ImportError:
+ elementtree_loaded = False
+ etree_loaded = False
+
+# Local
+from g import *
+from codes import *
+import pml, utils
+import hpmudext
+
+"""
+status dict structure:
+ { 'revision' : STATUS_REV_00 .. STATUS_REV_04,
+ 'agents' : [ list of pens/agents/supplies (dicts) ],
+ 'top-door' : TOP_DOOR_NOT_PRESENT | TOP_DOOR_CLOSED | TOP_DOOR_OPEN,
+ 'status-code' : STATUS_...,
+ 'supply-door' : SUPPLY_DOOR_NOT_PRESENT | SUPPLY_DOOR_CLOSED | SUPPLY_DOOR_OPEN.
+ 'duplexer' : DUPLEXER_NOT_PRESENT | DUPLEXER_DOOR_CLOSED | DUPLEXER_DOOR_OPEN,
+ 'photo_tray' : PHOTO_TRAY_NOT_PRESENT | PHOTO_TRAY_ENGAGED | PHOTO_TRAY_NOT_ENGAGED,
+ 'in-tray1' : IN_TRAY_NOT_PRESENT | IN_TRAY_CLOSED | IN_TRAY_OPEN (| IN_TRAY_DEFAULT | IN_TRAY_LOCKED)*,
+ 'in-tray2' : IN_TRAY_NOT_PRESENT | IN_TRAY_CLOSED | IN_TRAY_OPEN (| IN_TRAY_DEFAULT | IN_TRAY_LOCKED)*,
+ 'media-path' : MEDIA_PATH_NOT_PRESENT | MEDIA_PATH_CUT_SHEET | MEDIA_PATH_BANNER | MEDIA_PATH_PHOTO,
+ }
+
+ * S:02 only
+
+agent dict structure: (pens/supplies/agents/etc)
+ { 'kind' : AGENT_KIND_NONE ... AGENT_KIND_ADF_KIT,
+ 'type' : TYPE_BLACK ... AGENT_TYPE_UNSPECIFIED, # aka color
+ 'health' : AGENT_HEALTH_OK ... AGENT_HEALTH_UNKNOWN,
+ 'level' : 0 ... 100,
+ 'level-trigger' : AGENT_LEVEL_TRIGGER_SUFFICIENT_0 ... AGENT_LEVEL_TRIGGER_ALMOST_DEFINITELY_OUT,
+ }
+"""
+
+
+
+# 'revision'
+STATUS_REV_00 = 0x00
+STATUS_REV_01 = 0x01
+STATUS_REV_02 = 0x02
+STATUS_REV_03 = 0x03
+STATUS_REV_04 = 0x04
+STATUS_REV_V = 0xff
+STATUS_REV_UNKNOWN = 0xfe
+
+vstatus_xlate = {'busy' : STATUS_PRINTER_BUSY,
+ 'idle' : STATUS_PRINTER_IDLE,
+ 'prnt' : STATUS_PRINTER_PRINTING,
+ 'offf' : STATUS_PRINTER_TURNING_OFF,
+ 'rprt' : STATUS_PRINTER_REPORT_PRINTING,
+ 'cncl' : STATUS_PRINTER_CANCELING,
+ 'iost' : STATUS_PRINTER_IO_STALL,
+ 'dryw' : STATUS_PRINTER_DRY_WAIT_TIME,
+ 'penc' : STATUS_PRINTER_PEN_CHANGE,
+ 'oopa' : STATUS_PRINTER_OUT_OF_PAPER,
+ 'bnej' : STATUS_PRINTER_BANNER_EJECT,
+ 'bnmz' : STATUS_PRINTER_BANNER_MISMATCH,
+ 'phmz' : STATUS_PRINTER_PHOTO_MISMATCH,
+ 'dpmz' : STATUS_PRINTER_DUPLEX_MISMATCH,
+ 'pajm' : STATUS_PRINTER_MEDIA_JAM,
+ 'cars' : STATUS_PRINTER_CARRIAGE_STALL,
+ 'paps' : STATUS_PRINTER_PAPER_STALL,
+ 'penf' : STATUS_PRINTER_PEN_FAILURE,
+ 'erro' : STATUS_PRINTER_HARD_ERROR,
+ 'pwdn' : STATUS_PRINTER_POWER_DOWN,
+ 'fpts' : STATUS_PRINTER_FRONT_PANEL_TEST,
+ 'clno' : STATUS_PRINTER_CLEAN_OUT_TRAY_MISSING}
+
+REVISION_2_TYPE_MAP = {0 : AGENT_TYPE_NONE,
+ 1 : AGENT_TYPE_BLACK,
+ 2 : AGENT_TYPE_CYAN,
+ 3 : AGENT_TYPE_MAGENTA,
+ 4 : AGENT_TYPE_YELLOW,
+ 5 : AGENT_TYPE_BLACK,
+ 6 : AGENT_TYPE_CYAN,
+ 7 : AGENT_TYPE_MAGENTA,
+ 8 : AGENT_TYPE_YELLOW,
+ }
+
+STATUS_BLOCK_UNKNOWN = {'revision' : STATUS_REV_UNKNOWN,
+ 'agents' : [],
+ 'status-code' : STATUS_UNKNOWN,
+ }
+
+NUM_PEN_POS = {STATUS_REV_00 : 16,
+ STATUS_REV_01 : 16,
+ STATUS_REV_02 : 16,
+ STATUS_REV_03 : 18,
+ STATUS_REV_04 : 22}
+
+PEN_DATA_SIZE = {STATUS_REV_00 : 8,
+ STATUS_REV_01 : 8,
+ STATUS_REV_02 : 4,
+ STATUS_REV_03 : 8,
+ STATUS_REV_04 : 8}
+
+STATUS_POS = {STATUS_REV_00 : 14,
+ STATUS_REV_01 : 14,
+ STATUS_REV_02 : 14,
+ STATUS_REV_03 : 16,
+ STATUS_REV_04 : 20}
+
+def parseSStatus(s, z=''):
+ revision = ''
+ pens = []
+ top_door = TOP_DOOR_NOT_PRESENT
+ stat = STATUS_UNKNOWN
+ supply_door = SUPPLY_DOOR_NOT_PRESENT
+ duplexer = DUPLEXER_NOT_PRESENT
+ photo_tray = PHOTO_TRAY_NOT_PRESENT
+ in_tray1 = IN_TRAY_NOT_PRESENT
+ in_tray2 = IN_TRAY_NOT_PRESENT
+ media_path = MEDIA_PATH_NOT_PRESENT
+ Z_SIZE = 6
+
+ try:
+ z1 = []
+ if len(z) > 0:
+ z_fields = z.split(',')
+
+ for z_field in z_fields:
+
+ if len(z_field) > 2 and z_field[:2] == '05':
+ z1s = z_field[2:]
+ z1 = [int(x, 16) for x in z1s]
+
+ s1 = [int(x, 16) for x in s]
+
+ revision = s1[1]
+
+ assert STATUS_REV_00 <= revision <= STATUS_REV_04
+
+ top_door = bool(s1[2] & 0x8L) + s1[2] & 0x1L
+ supply_door = bool(s1[3] & 0x8L) + s1[3] & 0x1L
+ duplexer = bool(s1[4] & 0xcL) + s1[4] & 0x1L
+ photo_tray = bool(s1[5] & 0x8L) + s1[5] & 0x1L
+
+ if revision == STATUS_REV_02:
+ in_tray1 = bool(s1[6] & 0x8L) + s1[6] & 0x1L
+ in_tray2 = bool(s1[7] & 0x8L) + s1[7] & 0x1L
+ else:
+ in_tray1 = bool(s1[6] & 0x8L)
+ in_tray2 = bool(s1[7] & 0x8L)
+
+ media_path = bool(s1[8] & 0x8L) + (s1[8] & 0x1L) + ((bool(s1[18] & 0x2L))<<1)
+ status_pos = STATUS_POS[revision]
+ status_byte = s1[status_pos]<<4
+ if status_byte != 48:
+ status_byte = (s1[status_pos]<<4) + s1[status_pos + 1]
+ stat = status_byte + STATUS_PRINTER_BASE
+
+ pen, c, d = {}, NUM_PEN_POS[revision]+1, 0
+ num_pens = s1[NUM_PEN_POS[revision]]
+ index = 0
+ pen_data_size = PEN_DATA_SIZE[revision]
+
+ log.debug("num_pens = %d" % num_pens)
+ for p in range(num_pens):
+ info = long(s[c : c + pen_data_size], 16)
+
+ pen['index'] = index
+
+ if pen_data_size == 4:
+ pen['type'] = REVISION_2_TYPE_MAP.get(int((info & 0xf000L) >> 12L), 0)
+
+ if index < (num_pens / 2):
+ pen['kind'] = AGENT_KIND_HEAD
+ else:
+ pen['kind'] = AGENT_KIND_SUPPLY
+
+ pen['level-trigger'] = int ((info & 0x0e00L) >> 9L)
+ pen['health'] = int((info & 0x0180L) >> 7L)
+ pen['level'] = int(info & 0x007fL)
+ pen['id'] = 0x1f
+
+ elif pen_data_size == 8:
+ pen['kind'] = bool(info & 0x80000000L) + ((bool(info & 0x40000000L))<<1L)
+ pen['type'] = int((info & 0x3f000000L) >> 24L)
+ pen['id'] = int((info & 0xf80000) >> 19L)
+ pen['level-trigger'] = int((info & 0x70000L) >> 16L)
+ pen['health'] = int((info & 0xc000L) >> 14L)
+ pen['level'] = int(info & 0xffL)
+
+ else:
+ log.error("Pen data size error")
+
+ if len(z1) > 0:
+ # TODO: Determine cause of IndexError for C6100 (defect #1111)
+ try:
+ pen['dvc'] = long(z1s[d+1:d+5], 16)
+ pen['virgin'] = bool(z1[d+5] & 0x8L)
+ pen['hp-ink'] = bool(z1[d+5] & 0x4L)
+ pen['known'] = bool(z1[d+5] & 0x2L)
+ pen['ack'] = bool(z1[d+5] & 0x1L)
+ except IndexError:
+ pen['dvc'] = 0
+ pen['virgin'] = 0
+ pen['hp-ink'] = 0
+ pen['known'] = 0
+ pen['ack'] = 0
+
+ log.debug("pen %d %s" % (index, pen))
+
+ index += 1
+ pens.append(pen)
+ pen = {}
+ c += pen_data_size
+ d += Z_SIZE
+
+ except (IndexError, ValueError, TypeError), e:
+ log.warn("Status parsing error: %s" % str(e))
+
+ return {'revision' : revision,
+ 'agents' : pens,
+ 'top-door' : top_door,
+ 'status-code' : stat,
+ 'supply-door' : supply_door,
+ 'duplexer' : duplexer,
+ 'photo-tray' : photo_tray,
+ 'in-tray1' : in_tray1,
+ 'in-tray2' : in_tray2,
+ 'media-path' : media_path,
+ }
+
+
+
+# $HB0$NC0,ff,DN,IDLE,CUT,K0,C0,DP,NR,KP092,CP041
+# 0 1 2 3 4 5 6 7 8 9 10
+def parseVStatus(s):
+ pens, pen, c = [], {}, 0
+ fields = s.split(',')
+ log.debug(fields)
+ f0 = fields[0]
+
+ if len(f0) == 20:
+ # TODO: $H00000000$M00000000 style (OJ Pro 1150/70)
+ # Need spec
+ pass
+ elif len(f0) == 8:
+ for p in f0:
+ if c == 0:
+ #assert p == '$'
+ c += 1
+ elif c == 1:
+ if p in ('a', 'A'):
+ pen['type'], pen['kind'] = AGENT_TYPE_NONE, AGENT_KIND_NONE
+ c += 1
+ elif c == 2:
+ pen['health'] = AGENT_HEALTH_OK
+ pen['kind'] = AGENT_KIND_HEAD_AND_SUPPLY
+ if p in ('b', 'B'): pen['type'] = AGENT_TYPE_BLACK
+ elif p in ('c', 'C'): pen['type'] = AGENT_TYPE_CMY
+ elif p in ('d', 'D'): pen['type'] = AGENT_TYPE_KCM
+ elif p in ('u', 'U'): pen['type'], pen['health'] = AGENT_TYPE_NONE, AGENT_HEALTH_MISINSTALLED
+ c += 1
+ elif c == 3:
+ if p == '0': pen['state'] = 1
+ else: pen['state'] = 0
+
+ pen['level'] = 0
+ i = 8
+
+ while True:
+ try:
+ f = fields[i]
+ except IndexError:
+ break
+ else:
+ if f[:2] == 'KP' and pen['type'] == AGENT_TYPE_BLACK:
+ pen['level'] = int(f[2:])
+ elif f[:2] == 'CP' and pen['type'] == AGENT_TYPE_CMY:
+ pen['level'] = int(f[2:])
+ i += 1
+
+ pens.append(pen)
+ pen = {}
+ c = 0
+ else:
+ pass
+
+ try:
+ fields[2]
+ except IndexError:
+ top_lid = 1 # something went wrong!
+ else:
+ if fields[2] == 'DN':
+ top_lid = 1
+ else:
+ top_lid = 2
+
+ try:
+ stat = vstatus_xlate.get(fields[3].lower(), STATUS_PRINTER_IDLE)
+ except IndexError:
+ stat = STATUS_PRINTER_IDLE # something went wrong!
+
+ return {'revision' : STATUS_REV_V,
+ 'agents' : pens,
+ 'top-door' : top_lid,
+ 'status-code': stat,
+ 'supply-door': SUPPLY_DOOR_NOT_PRESENT,
+ 'duplexer' : DUPLEXER_NOT_PRESENT,
+ 'photo-tray' : PHOTO_TRAY_NOT_PRESENT,
+ 'in-tray1' : IN_TRAY_NOT_PRESENT,
+ 'in-tray2' : IN_TRAY_NOT_PRESENT,
+ 'media-path' : MEDIA_PATH_CUT_SHEET, # ?
+ }
+
+
+def parseStatus(DeviceID):
+ if 'VSTATUS' in DeviceID:
+ return parseVStatus(DeviceID['VSTATUS'])
+ elif 'S' in DeviceID:
+ return parseSStatus(DeviceID['S'], DeviceID.get('Z', ''))
+ else:
+ return STATUS_BLOCK_UNKNOWN
+
+def LaserJetDeviceStatusToPrinterStatus(device_status, printer_status, detected_error_state):
+ stat = STATUS_PRINTER_IDLE
+
+ if device_status in (pml.DEVICE_STATUS_WARNING, pml.DEVICE_STATUS_DOWN):
+
+ if detected_error_state & pml.DETECTED_ERROR_STATE_LOW_PAPER_MASK and \
+ not (detected_error_state & pml.DETECTED_ERROR_STATE_NO_PAPER_MASK):
+ stat = STATUS_PRINTER_LOW_PAPER
+
+ elif detected_error_state & pml.DETECTED_ERROR_STATE_NO_PAPER_MASK:
+ stat = STATUS_PRINTER_OUT_OF_PAPER
+
+ elif detected_error_state & pml.DETECTED_ERROR_STATE_DOOR_OPEN_MASK:
+ stat = STATUS_PRINTER_DOOR_OPEN
+
+ elif detected_error_state & pml.DETECTED_ERROR_STATE_JAMMED_MASK:
+ stat = STATUS_PRINTER_MEDIA_JAM
+
+ elif detected_error_state & pml.DETECTED_ERROR_STATE_OUT_CART_MASK:
+ stat = STATUS_PRINTER_NO_TONER
+
+ elif detected_error_state & pml.DETECTED_ERROR_STATE_LOW_CART_MASK:
+ stat = STATUS_PRINTER_LOW_TONER
+
+ elif detected_error_state == pml.DETECTED_ERROR_STATE_SERVICE_REQUEST_MASK:
+ stat = STATUS_PRINTER_SERVICE_REQUEST
+
+ elif detected_error_state & pml.DETECTED_ERROR_STATE_OFFLINE_MASK:
+ stat = STATUS_PRINTER_OFFLINE
+
+ else:
+
+ if printer_status == pml.PRINTER_STATUS_IDLE:
+ stat = STATUS_PRINTER_IDLE
+
+ elif printer_status == pml.PRINTER_STATUS_PRINTING:
+ stat = STATUS_PRINTER_PRINTING
+
+ elif printer_status == pml.PRINTER_STATUS_WARMUP:
+ stat = STATUS_PRINTER_WARMING_UP
+
+ return stat
+
+# Map from ISO 10175/10180 to HPLIP types
+COLORANT_INDEX_TO_AGENT_TYPE_MAP = {
+ 'other' : AGENT_TYPE_UNSPECIFIED,
+ 'unknown' : AGENT_TYPE_UNSPECIFIED,
+ 'blue' : AGENT_TYPE_BLUE,
+ 'cyan' : AGENT_TYPE_CYAN,
+ 'magenta': AGENT_TYPE_MAGENTA,
+ 'yellow' : AGENT_TYPE_YELLOW,
+ 'black' : AGENT_TYPE_BLACK,
+ }
+
+MARKER_SUPPLES_TYPE_TO_AGENT_KIND_MAP = {
+ pml.OID_MARKER_SUPPLIES_TYPE_OTHER : AGENT_KIND_UNKNOWN,
+ pml.OID_MARKER_SUPPLIES_TYPE_UNKNOWN : AGENT_KIND_UNKNOWN,
+ pml.OID_MARKER_SUPPLIES_TYPE_TONER : AGENT_KIND_TONER_CARTRIDGE,
+ pml.OID_MARKER_SUPPLIES_TYPE_WASTE_TONER : AGENT_KIND_UNKNOWN,
+ pml.OID_MARKER_SUPPLIES_TYPE_INK : AGENT_KIND_SUPPLY,
+ pml.OID_MARKER_SUPPLIES_TYPE_INK_CART : AGENT_KIND_HEAD_AND_SUPPLY,
+ pml.OID_MARKER_SUPPLIES_TYPE_INK_RIBBON : AGENT_KIND_HEAD_AND_SUPPLY,
+ pml.OID_MARKER_SUPPLIES_TYPE_WASTE_INK : AGENT_KIND_UNKNOWN,
+ pml.OID_MARKER_SUPPLIES_TYPE_OPC : AGENT_KIND_DRUM_KIT,
+ pml.OID_MARKER_SUPPLIES_TYPE_DEVELOPER : AGENT_KIND_UNKNOWN,
+ pml.OID_MARKER_SUPPLIES_TYPE_FUSER_OIL : AGENT_KIND_UNKNOWN,
+ pml.OID_MARKER_SUPPLIES_TYPE_SOLID_WAX : AGENT_KIND_UNKNOWN,
+ pml.OID_MARKER_SUPPLIES_TYPE_RIBBON_WAX : AGENT_KIND_UNKNOWN,
+ pml.OID_MARKER_SUPPLIES_TYPE_WASTE_WAX : AGENT_KIND_UNKNOWN,
+ pml.OID_MARKER_SUPPLIES_TYPE_FUSER : AGENT_KIND_MAINT_KIT,
+ pml.OID_MARKER_SUPPLIES_TYPE_CORONA_WIRE : AGENT_KIND_UNKNOWN,
+ pml.OID_MARKER_SUPPLIES_TYPE_FUSER_OIL_WICK : AGENT_KIND_UNKNOWN,
+ pml.OID_MARKER_SUPPLIES_TYPE_CLEANER_UNIT : AGENT_KIND_UNKNOWN,
+ pml.OID_MARKER_SUPPLIES_TYPE_FUSER_CLEANING_PAD : AGENT_KIND_UNKNOWN,
+ pml.OID_MARKER_SUPPLIES_TYPE_TRANSFER_UNIT : AGENT_KIND_TRANSFER_KIT,
+ pml.OID_MARKER_SUPPLIES_TYPE_TONER_CART : AGENT_KIND_TONER_CARTRIDGE,
+ pml.OID_MARKER_SUPPLIES_TYPE_FUSER_OILER : AGENT_KIND_UNKNOWN,
+ pml.OID_MARKER_SUPPLIES_TYPE_ADF_MAINT_KIT : AGENT_KIND_ADF_KIT,
+}
+
+
+def StatusType3( dev, parsedID ): # LaserJet Status (PML/SNMP)
+ try:
+ dev.openPML()
+ #result_code, on_off_line = dev.getPML( pml.OID_ON_OFF_LINE, pml.INT_SIZE_BYTE )
+ #result_code, sleep_mode = dev.getPML( pml.OID_SLEEP_MODE, pml.INT_SIZE_BYTE )
+ result_code, printer_status = dev.getPML( pml.OID_PRINTER_STATUS, pml.INT_SIZE_BYTE )
+ result_code, device_status = dev.getPML( pml.OID_DEVICE_STATUS, pml.INT_SIZE_BYTE )
+ result_code, cover_status = dev.getPML( pml.OID_COVER_STATUS, pml.INT_SIZE_BYTE )
+ result_code, value = dev.getPML( pml.OID_DETECTED_ERROR_STATE )
+ except Error:
+ dev.closePML()
+
+ return {'revision' : STATUS_REV_UNKNOWN,
+ 'agents' : [],
+ 'top-door' : 0,
+ 'status-code' : STATUS_UNKNOWN,
+ 'supply-door' : 0,
+ 'duplexer' : 1,
+ 'photo-tray' : 0,
+ 'in-tray1' : 0,
+ 'in-tray2' : 0,
+ 'media-path' : 0,
+ }
+
+ try:
+ detected_error_state = struct.unpack( 'B', value[0])[0]
+ except (IndexError, TypeError):
+ detected_error_state = pml.DETECTED_ERROR_STATE_OFFLINE_MASK
+
+ agents, x = [], 1
+
+ while True:
+ log.debug( "%s Agent: %d %s" % ("*"*10, x, "*"*10))
+ log.debug("OID_MARKER_SUPPLIES_TYPE_%d:" % x)
+ oid = ( pml.OID_MARKER_SUPPLIES_TYPE_x % x, pml.OID_MARKER_SUPPLIES_TYPE_x_TYPE )
+ result_code, value = dev.getPML( oid, pml.INT_SIZE_BYTE )
+
+ if result_code != ERROR_SUCCESS or value is None:
+ log.debug("End of supply information.")
+ break
+
+ for a in MARKER_SUPPLES_TYPE_TO_AGENT_KIND_MAP:
+ if value == a:
+ agent_kind = MARKER_SUPPLES_TYPE_TO_AGENT_KIND_MAP[a]
+ break
+ else:
+ agent_kind = AGENT_KIND_UNKNOWN
+
+ # TODO: Deal with printers that return -1 and -2 for level and max (LJ3380)
+
+ log.debug("OID_MARKER_SUPPLIES_LEVEL_%d:" % x)
+ oid = ( pml.OID_MARKER_SUPPLIES_LEVEL_x % x, pml.OID_MARKER_SUPPLIES_LEVEL_x_TYPE )
+ result_code, agent_level = dev.getPML( oid )
+
+ if result_code != ERROR_SUCCESS:
+ log.debug("Failed")
+ break
+
+ log.debug( 'agent%d-level: %d' % ( x, agent_level ) )
+ log.debug("OID_MARKER_SUPPLIES_MAX_%d:" % x)
+ oid = ( pml.OID_MARKER_SUPPLIES_MAX_x % x, pml.OID_MARKER_SUPPLIES_MAX_x_TYPE )
+ result_code, agent_max = dev.getPML( oid )
+
+ if agent_max == 0: agent_max = 1
+
+ if result_code != ERROR_SUCCESS:
+ log.debug("Failed")
+ break
+
+ log.debug( 'agent%d-max: %d' % ( x, agent_max ) )
+ log.debug("OID_MARKER_SUPPLIES_COLORANT_INDEX_%d:" % x)
+ oid = ( pml.OID_MARKER_SUPPLIES_COLORANT_INDEX_x % x, pml.OID_MARKER_SUPPLIES_COLORANT_INDEX_x_TYPE )
+ result_code, colorant_index = dev.getPML( oid )
+
+ if result_code != ERROR_SUCCESS: # 3080, 3055 will fail here
+ log.debug("Failed")
+ agent_type = AGENT_TYPE_BLACK
+ #break
+ else:
+ log.debug("Colorant index: %d" % colorant_index)
+
+ log.debug("OID_MARKER_COLORANT_VALUE_%d" % x)
+ oid = ( pml.OID_MARKER_COLORANT_VALUE_x % colorant_index, pml.OID_MARKER_COLORANT_VALUE_x_TYPE )
+ result_code, colorant_value = dev.getPML( oid )
+
+ if result_code != ERROR_SUCCESS:
+ log.debug("Failed. Defaulting to black.")
+ agent_type = AGENT_TYPE_BLACK
+ #else:
+ if 1:
+ if agent_kind in (AGENT_KIND_MAINT_KIT, AGENT_KIND_ADF_KIT,
+ AGENT_KIND_DRUM_KIT, AGENT_KIND_TRANSFER_KIT):
+
+ agent_type = AGENT_TYPE_UNSPECIFIED
+
+ else:
+ agent_type = AGENT_TYPE_BLACK
+
+ if result_code != ERROR_SUCCESS:
+ log.debug("OID_MARKER_SUPPLIES_DESCRIPTION_%d:" % x)
+ oid = (pml.OID_MARKER_SUPPLIES_DESCRIPTION_x % x, pml.OID_MARKER_SUPPLIES_DESCRIPTION_x_TYPE)
+ result_code, colorant_value = dev.getPML( oid )
+
+ if result_code != ERROR_SUCCESS:
+ log.debug("Failed")
+ break
+
+ if colorant_value is not None:
+ log.debug("colorant value: %s" % colorant_value)
+ colorant_value = colorant_value.lower().strip()
+
+ for c in COLORANT_INDEX_TO_AGENT_TYPE_MAP:
+ if colorant_value.find(c) >= 0:
+ agent_type = COLORANT_INDEX_TO_AGENT_TYPE_MAP[c]
+ break
+ else:
+ agent_type = AGENT_TYPE_BLACK
+
+ else: # SUCCESS
+ if colorant_value is not None:
+ log.debug("colorant value: %s" % colorant_value)
+ agent_type = COLORANT_INDEX_TO_AGENT_TYPE_MAP.get( colorant_value, AGENT_TYPE_BLACK )
+
+ if agent_type == AGENT_TYPE_NONE:
+ if agent_kind == AGENT_KIND_TONER_CARTRIDGE:
+ agent_type = AGENT_TYPE_BLACK
+ else:
+ agent_type = AGENT_TYPE_UNSPECIFIED
+
+ log.debug("OID_MARKER_STATUS_%d:" % x)
+ oid = ( pml.OID_MARKER_STATUS_x % x, pml.OID_MARKER_STATUS_x_TYPE )
+ result_code, agent_status = dev.getPML( oid )
+
+ if result_code != ERROR_SUCCESS:
+ log.debug("Failed")
+ agent_trigger = AGENT_LEVEL_TRIGGER_SUFFICIENT_0
+ agent_health = AGENT_HEALTH_OK
+ else:
+ agent_trigger = AGENT_LEVEL_TRIGGER_SUFFICIENT_0
+
+ if agent_status is None:
+ agent_health = AGENT_HEALTH_OK
+
+ elif agent_status == pml.OID_MARKER_STATUS_OK:
+ agent_health = AGENT_HEALTH_OK
+
+ elif agent_status == pml.OID_MARKER_STATUS_MISINSTALLED:
+ agent_health = AGENT_HEALTH_MISINSTALLED
+
+ elif agent_status in ( pml.OID_MARKER_STATUS_LOW_TONER_CONT,
+ pml.OID_MARKER_STATUS_LOW_TONER_STOP ):
+
+ agent_health = AGENT_HEALTH_OK
+ agent_trigger = AGENT_LEVEL_TRIGGER_MAY_BE_LOW
+
+ else:
+ agent_health = AGENT_HEALTH_OK
+
+ agent_level = int(agent_level/agent_max * 100)
+
+ log.debug("agent%d: kind=%d, type=%d, health=%d, level=%d, level-trigger=%d" % \
+ (x, agent_kind, agent_type, agent_health, agent_level, agent_trigger))
+
+
+ agents.append({'kind' : agent_kind,
+ 'type' : agent_type,
+ 'health' : agent_health,
+ 'level' : agent_level,
+ 'level-trigger' : agent_trigger,})
+
+ x += 1
+
+ if x > 20:
+ break
+
+
+ printer_status = printer_status or STATUS_PRINTER_IDLE
+ log.debug("printer_status=%d" % printer_status)
+ device_status = device_status or pml.DEVICE_STATUS_RUNNING
+ log.debug("device_status=%d" % device_status)
+ cover_status = cover_status or pml.COVER_STATUS_CLOSED
+ log.debug("cover_status=%d" % cover_status)
+ detected_error_state = detected_error_state or pml.DETECTED_ERROR_STATE_NO_ERROR
+ log.debug("detected_error_state=%d (0x%x)" % (detected_error_state, detected_error_state))
+
+ stat = LaserJetDeviceStatusToPrinterStatus(device_status, printer_status, detected_error_state)
+
+ log.debug("Printer status=%d" % stat)
+
+ if stat == STATUS_PRINTER_DOOR_OPEN:
+ supply_door = 0
+ else:
+ supply_door = 1
+
+ return {'revision' : STATUS_REV_UNKNOWN,
+ 'agents' : agents,
+ 'top-door' : cover_status,
+ 'status-code' : stat,
+ 'supply-door' : supply_door,
+ 'duplexer' : 1,
+ 'photo-tray' : 0,
+ 'in-tray1' : 1,
+ 'in-tray2' : 1,
+ 'media-path' : 1,
+ }
+
+def setup_panel_translator():
+ printables = list(
+"""0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
+!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~""")
+
+ map = {}
+ for x in [chr(x) for x in range(0,256)]:
+ if x in printables:
+ map[x] = x
+ else:
+ map[x] = '\x20'
+
+ map.update({'\x10' : '\xab',
+ '\x11' : '\xbb',
+ '\x12' : '\xa3',
+ '\x13' : '\xbb',
+ '\x80' : '\xab',
+ '\x81' : '\xbb',
+ '\x82' : '\x2a',
+ '\x83' : '\x2a',
+ '\x85' : '\x2a',
+ '\xa0' : '\xab',
+ '\x1f' : '\x3f',
+ '=' : '\x20',
+ })
+
+ frm, to = '', ''
+ map_keys = map.keys()
+ map_keys.sort()
+ for x in map_keys:
+ frm = ''.join([frm, x])
+ to = ''.join([to, map[x]])
+
+ global PANEL_TRANSLATOR_FUNC
+ PANEL_TRANSLATOR_FUNC = utils.Translator(frm, to)
+
+PANEL_TRANSLATOR_FUNC = None
+setup_panel_translator()
+
+
+def PanelCheck(dev):
+ line1, line2 = '', ''
+
+ if dev.io_mode not in (IO_MODE_RAW, IO_MODE_UNI):
+
+ try:
+ dev.openPML()
+ except Error:
+ pass
+ else:
+
+ oids = [(pml.OID_HP_LINE1, pml.OID_HP_LINE2),
+ (pml.OID_SPM_LINE1, pml.OID_SPM_LINE2)]
+
+ for oid1, oid2 in oids:
+ result, line1 = dev.getPML(oid1)
+
+ if result < pml.ERROR_MAX_OK:
+ line1 = PANEL_TRANSLATOR_FUNC(line1).rstrip()
+
+ if '\x0a' in line1:
+ line1, line2 = line1.split('\x0a', 1)
+ break
+
+ result, line2 = dev.getPML(oid2)
+
+ if result < pml.ERROR_MAX_OK:
+ line2 = PANEL_TRANSLATOR_FUNC(line2).rstrip()
+ break
+
+ return bool(line1 or line2), line1 or '', line2 or ''
+
+
+BATTERY_HEALTH_MAP = {0 : AGENT_HEALTH_OK,
+ 1 : AGENT_HEALTH_OVERTEMP,
+ 2 : AGENT_HEALTH_CHARGING,
+ 3 : AGENT_HEALTH_MISINSTALLED,
+ 4 : AGENT_HEALTH_FAILED,
+ }
+
+
+BATTERY_TRIGGER_MAP = {0 : AGENT_LEVEL_TRIGGER_SUFFICIENT_0,
+ 1 : AGENT_LEVEL_TRIGGER_ALMOST_DEFINITELY_OUT,
+ 2 : AGENT_LEVEL_TRIGGER_PROBABLY_OUT,
+ 3 : AGENT_LEVEL_TRIGGER_SUFFICIENT_4,
+ 4 : AGENT_LEVEL_TRIGGER_SUFFICIENT_2,
+ 5 : AGENT_LEVEL_TRIGGER_SUFFICIENT_0,
+ }
+
+BATTERY_PML_TRIGGER_MAP = {
+ (100, 80) : AGENT_LEVEL_TRIGGER_SUFFICIENT_0,
+ (79, 60) : AGENT_LEVEL_TRIGGER_SUFFICIENT_1,
+ (59, 40) : AGENT_LEVEL_TRIGGER_SUFFICIENT_2,
+ (39, 30) : AGENT_LEVEL_TRIGGER_SUFFICIENT_3,
+ (29, 20) : AGENT_LEVEL_TRIGGER_SUFFICIENT_4,
+ (19, 10) : AGENT_LEVEL_TRIGGER_MAY_BE_LOW,
+ (9, 5) : AGENT_LEVEL_TRIGGER_PROBABLY_OUT,
+ (4, -1) : AGENT_LEVEL_TRIGGER_ALMOST_DEFINITELY_OUT,
+ }
+
+
+def BatteryCheck(dev, status_block, battery_check):
+ try_dynamic_counters = False
+
+ try:
+ try:
+ dev.openPML()
+ except Error:
+ if battery_check == STATUS_BATTERY_CHECK_STD:
+ log.debug("PML channel open failed. Trying dynamic counters...")
+ try_dynamic_counters = True
+ else:
+ if battery_check == STATUS_BATTERY_CHECK_PML:
+ result, battery_level = dev.getPML(pml.OID_BATTERY_LEVEL_2)
+
+ if result > pml.ERROR_MAX_OK:
+ status_block['agents'].append({
+ 'kind' : AGENT_KIND_INT_BATTERY,
+ 'type' : AGENT_TYPE_UNSPECIFIED,
+ 'health' : AGENT_HEALTH_UNKNOWN,
+ 'level' : 0,
+ 'level-trigger' : AGENT_LEVEL_TRIGGER_SUFFICIENT_0,
+ })
+ return
+
+ else:
+ status_block['agents'].append({
+ 'kind' : AGENT_KIND_INT_BATTERY,
+ 'type' : AGENT_TYPE_UNSPECIFIED,
+ 'health' : AGENT_HEALTH_OK,
+ 'level' : battery_level,
+ 'level-trigger' : AGENT_LEVEL_TRIGGER_SUFFICIENT_0,
+ })
+ return
+
+ else: # STATUS_BATTERY_CHECK_STD
+ result, battery_level = dev.getPML(pml.OID_BATTERY_LEVEL)
+ result, power_mode = dev.getPML(pml.OID_POWER_MODE)
+
+ if battery_level is not None and \
+ power_mode is not None:
+
+ if power_mode & pml.POWER_MODE_BATTERY_LEVEL_KNOWN and \
+ battery_level >= 0:
+
+ for x in BATTERY_PML_TRIGGER_MAP:
+ if x[0] >= battery_level > x[1]:
+ battery_trigger_level = BATTERY_PML_TRIGGER_MAP[x]
+ break
+
+ if power_mode & pml.POWER_MODE_CHARGING:
+ agent_health = AGENT_HEALTH_CHARGING
+
+ elif power_mode & pml.POWER_MODE_DISCHARGING:
+ agent_health = AGENT_HEALTH_DISCHARGING
+
+ else:
+ agent_health = AGENT_HEALTH_OK
+
+ status_block['agents'].append({
+ 'kind' : AGENT_KIND_INT_BATTERY,
+ 'type' : AGENT_TYPE_UNSPECIFIED,
+ 'health' : agent_health,
+ 'level' : battery_level,
+ 'level-trigger' : battery_trigger_level,
+ })
+ return
+
+ else:
+ status_block['agents'].append({
+ 'kind' : AGENT_KIND_INT_BATTERY,
+ 'type' : AGENT_TYPE_UNSPECIFIED,
+ 'health' : AGENT_HEALTH_UNKNOWN,
+ 'level' : 0,
+ 'level-trigger' : AGENT_LEVEL_TRIGGER_SUFFICIENT_0,
+ })
+ return
+
+ else:
+ try_dynamic_counters = True
+
+ finally:
+ dev.closePML()
+
+
+ if battery_check == STATUS_BATTERY_CHECK_STD and \
+ try_dynamic_counters:
+
+ try:
+ try:
+ battery_health = dev.getDynamicCounter(200)
+ battery_trigger_level = dev.getDynamicCounter(201)
+ battery_level = dev.getDynamicCounter(202)
+
+ status_block['agents'].append({
+ 'kind' : AGENT_KIND_INT_BATTERY,
+ 'type' : AGENT_TYPE_UNSPECIFIED,
+ 'health' : BATTERY_HEALTH_MAP[battery_health],
+ 'level' : battery_level,
+ 'level-trigger' : BATTERY_TRIGGER_MAP[battery_trigger_level],
+ })
+ except Error:
+ status_block['agents'].append({
+ 'kind' : AGENT_KIND_INT_BATTERY,
+ 'type' : AGENT_TYPE_UNSPECIFIED,
+ 'health' : AGENT_HEALTH_UNKNOWN,
+ 'level' : 0,
+ 'level-trigger' : AGENT_LEVEL_TRIGGER_SUFFICIENT_0,
+ })
+ finally:
+ dev.closePrint()
+
+ else:
+ status_block['agents'].append({
+ 'kind' : AGENT_KIND_INT_BATTERY,
+ 'type' : AGENT_TYPE_UNSPECIFIED,
+ 'health' : AGENT_HEALTH_UNKNOWN,
+ 'level' : 0,
+ 'level-trigger' : AGENT_LEVEL_TRIGGER_SUFFICIENT_0,
+ })
+
+
+
+# this works for 2 pen products that allow 1 or 2 pens inserted
+# from: k, kcm, cmy, ggk
+def getPenConfiguration(s): # s=status dict from parsed device ID
+ pens = [p['type'] for p in s['agents']]
+
+ if utils.all(pens, lambda x : x==AGENT_TYPE_NONE):
+ return AGENT_CONFIG_NONE
+
+ if AGENT_TYPE_NONE in pens:
+
+ if AGENT_TYPE_BLACK in pens:
+ return AGENT_CONFIG_BLACK_ONLY
+
+ elif AGENT_TYPE_CMY in pens:
+ return AGENT_CONFIG_COLOR_ONLY
+
+ elif AGENT_TYPE_KCM in pens:
+ return AGENT_CONFIG_PHOTO_ONLY
+
+ elif AGENT_TYPE_GGK in pens:
+ return AGENT_CONFIG_GREY_ONLY
+
+ else:
+ return AGENT_CONFIG_INVALID
+
+ else:
+ if AGENT_TYPE_BLACK in pens and AGENT_TYPE_CMY in pens:
+ return AGENT_CONFIG_COLOR_AND_BLACK
+
+ elif AGENT_TYPE_CMY in pens and AGENT_TYPE_KCM in pens:
+ return AGENT_CONFIG_COLOR_AND_PHOTO
+
+ elif AGENT_TYPE_CMY in pens and AGENT_TYPE_GGK in pens:
+ return AGENT_CONFIG_COLOR_AND_GREY
+
+ else:
+ return AGENT_CONFIG_INVALID
+
+
+def getFaxStatus(dev):
+ tx_active, rx_active = False, False
+
+ if dev.io_mode not in (IO_MODE_UNI, IO_MODE_RAW):
+ try:
+ dev.openPML()
+
+ result_code, tx_state = dev.getPML(pml.OID_FAXJOB_TX_STATUS)
+
+ if result_code == ERROR_SUCCESS and tx_state:
+ if tx_state not in (pml.FAXJOB_TX_STATUS_IDLE, pml.FAXJOB_TX_STATUS_DONE):
+ tx_active = True
+
+ result_code, rx_state = dev.getPML(pml.OID_FAXJOB_RX_STATUS)
+
+ if result_code == ERROR_SUCCESS and rx_state:
+ if rx_state not in (pml.FAXJOB_RX_STATUS_IDLE, pml.FAXJOB_RX_STATUS_DONE):
+ rx_active = True
+
+ finally:
+ dev.closePML()
+
+ return tx_active, rx_active
+
+
+TYPE6_STATUS_CODE_MAP = {
+ 0 : STATUS_PRINTER_IDLE, #</DevStatusUnknown>
+ -19928: STATUS_PRINTER_IDLE,
+ -18995: STATUS_PRINTER_CANCELING,
+ -17974: STATUS_PRINTER_WARMING_UP,
+ -17973: STATUS_PRINTER_PEN_CLEANING, # sic
+ -18993: STATUS_PRINTER_BUSY,
+ -17949: STATUS_PRINTER_BUSY,
+ -19720: STATUS_PRINTER_MANUAL_DUPLEX_BLOCK,
+ -19678: STATUS_PRINTER_BUSY,
+ -19695: STATUS_PRINTER_OUT_OF_PAPER,
+ -17985: STATUS_PRINTER_MEDIA_JAM,
+ -19731: STATUS_PRINTER_OUT_OF_PAPER,
+ -18974: STATUS_PRINTER_BUSY, #?
+ -19730: STATUS_PRINTER_OUT_OF_PAPER,
+ -19729: STATUS_PRINTER_OUT_OF_PAPER,
+ -19933: STATUS_PRINTER_HARD_ERROR, # out of memory
+ -17984: STATUS_PRINTER_DOOR_OPEN,
+ -19694: STATUS_PRINTER_DOOR_OPEN,
+ -18992: STATUS_PRINTER_MANUAL_FEED_BLOCKED, # ?
+ -19690: STATUS_PRINTER_MEDIA_JAM, # tray 1
+ -19689: STATUS_PRINTER_MEDIA_JAM, # tray 2
+ -19611: STATUS_PRINTER_MEDIA_JAM, # tray 3
+ -19686: STATUS_PRINTER_MEDIA_JAM,
+ -19688: STATUS_PRINTER_MEDIA_JAM, # paper path
+ -19685: STATUS_PRINTER_MEDIA_JAM, # cart area
+ -19684: STATUS_PRINTER_MEDIA_JAM, # output bin
+ -18848: STATUS_PRINTER_MEDIA_JAM, # duplexer
+ -18847: STATUS_PRINTER_MEDIA_JAM, # door open
+ -18846: STATUS_PRINTER_MEDIA_JAM, # tray 2
+ -19687: STATUS_PRINTER_MEDIA_JAM, # open door
+ -17992: STATUS_PRINTER_MEDIA_JAM, # mispick
+ -19700: STATUS_PRINTER_HARD_ERROR, # invalid driver
+ -17996: STATUS_PRINTER_FUSER_ERROR, # fuser error
+ -17983: STATUS_PRINTER_FUSER_ERROR,
+ -17982: STATUS_PRINTER_FUSER_ERROR,
+ -17981: STATUS_PRINTER_FUSER_ERROR,
+ -17971: STATUS_PRINTER_FUSER_ERROR,
+ -17995: STATUS_PRINTER_HARD_ERROR, # beam error
+ -17994: STATUS_PRINTER_HARD_ERROR, # scanner error
+ -17993: STATUS_PRINTER_HARD_ERROR, # fan error
+ -18994: STATUS_PRINTER_HARD_ERROR,
+ -17986: STATUS_PRINTER_HARD_ERROR,
+ -19904: STATUS_PRINTER_HARD_ERROR,
+ -19701: STATUS_PRINTER_NON_HP_INK, # [sic]
+ -19613: STATUS_PRINTER_IDLE, # HP
+ -19654: STATUS_PRINTER_NON_HP_INK, # [sic]
+ -19682: STATUS_PRINTER_HARD_ERROR, # resinstall
+ -19693: STATUS_PRINTER_IDLE, # ?? To Accept
+ -19752: STATUS_PRINTER_LOW_TONER,
+ -19723: STATUS_PRINTER_BUSY,
+ -19703: STATUS_PRINTER_BUSY,
+ -19739: STATUS_PRINTER_NO_TONER,
+ -19927: STATUS_PRINTER_BUSY,
+ -19932: STATUS_PRINTER_BUSY,
+ -19931: STATUS_PRINTER_BUSY,
+ -11989: STATUS_PRINTER_BUSY,
+ -11995: STATUS_PRINTER_BUSY, # ADF loaded
+ -19954: STATUS_PRINTER_CANCELING,
+ -19955: STATUS_PRINTER_REPORT_PRINTING,
+ -19956: STATUS_PRINTER_REPORT_PRINTING,
+ -19934: STATUS_PRINTER_HARD_ERROR,
+ -19930: STATUS_PRINTER_BUSY,
+ -11990: STATUS_PRINTER_DOOR_OPEN,
+ -11999: STATUS_PRINTER_MEDIA_JAM, # ADF
+ -12000: STATUS_PRINTER_MEDIA_JAM, # ADF
+ -11998: STATUS_PRINTER_MEDIA_JAM, # ADF
+ -11986: STATUS_PRINTER_HARD_ERROR, # scanner
+ -11994: STATUS_PRINTER_BUSY,
+ -14967: STATUS_PRINTER_BUSY,
+ -19912: STATUS_PRINTER_HARD_ERROR,
+ -14962: STATUS_PRINTER_BUSY, # copy pending
+ -14971: STATUS_PRINTER_BUSY, # copying
+ -14973: STATUS_PRINTER_BUSY, # copying being canceled
+ -14972: STATUS_PRINTER_BUSY, # copying canceled
+ -14966: STATUS_PRINTER_DOOR_OPEN,
+ -14974: STATUS_PRINTER_MEDIA_JAM,
+ -14969: STATUS_PRINTER_HARD_ERROR,
+ -14968: STATUS_PRINTER_HARD_ERROR,
+ -12996: STATUS_PRINTER_BUSY, # scan
+ -12994: STATUS_PRINTER_BUSY, # scan
+ -12993: STATUS_PRINTER_BUSY, # scan
+ -12991: STATUS_PRINTER_BUSY, # scan
+ -12995: STATUS_PRINTER_BUSY, # scan
+ -12997: STATUS_PRINTER_HARD_ERROR, # scan
+ -12990: STATUS_PRINTER_BUSY,
+ -12998: STATUS_PRINTER_BUSY,
+ -13000: STATUS_PRINTER_DOOR_OPEN,
+ -12999: STATUS_PRINTER_MEDIA_JAM,
+ -13859: STATUS_PRINTER_BUSY,
+ -13858: STATUS_PRINTER_BUSY, #</DevStatusDialingOut>
+ -13868: STATUS_PRINTER_BUSY, #</DevStatusRedialPending>
+ -13867: STATUS_PRINTER_BUSY, #</DevStatusFaxSendCanceled>
+ -13857: STATUS_PRINTER_BUSY, #</DevStatusConnecting>
+ -13856: STATUS_PRINTER_BUSY, #</DevStatusSendingPage>
+ -13855: STATUS_PRINTER_BUSY, #</DevStatusOnePageSend>
+ -13854: STATUS_PRINTER_BUSY, #</DevStatusMultiplePagesSent>
+ -13853: STATUS_PRINTER_BUSY, #</DevStatusSenderCancelingFax>
+ -13839: STATUS_PRINTER_BUSY, #</DevStatusIncomingCall>
+ -13842: STATUS_PRINTER_BUSY, #</DevStatusBlockingFax>
+ -13838: STATUS_PRINTER_BUSY, #</DevStatusReceivingFax>
+ -13847: STATUS_PRINTER_BUSY, #</DevStatusSinglePageReceived>
+ -13846: STATUS_PRINTER_BUSY, #</DevStatusDoublePagesReceived>
+ -13845: STATUS_PRINTER_BUSY, #</DevStatusTriplePagesReceived>
+ -13844: STATUS_PRINTER_BUSY, #</DevStatusPrintingFax>
+ -13840: STATUS_PRINTER_BUSY, #</DevStatusCancelingFaxPrint>
+ -13843: STATUS_PRINTER_BUSY, #</DevStatusFaxCancelingReceive>
+ -13850: STATUS_PRINTER_BUSY, #</DevStatusFaxCanceledReceive>
+ -13851: STATUS_PRINTER_BUSY, #</DevStatusFaxDelayedSendMemoryFull>
+ -13836: STATUS_PRINTER_BUSY, #</DevStatusNoDialTone>
+ -13864: STATUS_PRINTER_BUSY, #</DevStatusNoFaxAnswer>
+ -13863: STATUS_PRINTER_BUSY, #</DevStatusFaxBusy>
+ -13865: STATUS_PRINTER_BUSY, #</DevStatusNoDocumentSent>
+ -13862: STATUS_PRINTER_BUSY, #</DevStatusFaxSendError>
+ -13837: STATUS_PRINTER_BUSY, #</DevStatusT30Error>
+ -13861: STATUS_PRINTER_BUSY, #</DevStatusFaxMemoryFullSend>
+ -13866: STATUS_PRINTER_BUSY, #</DevStatusADFNotCleared>
+ -13841: STATUS_PRINTER_BUSY, #</DevStatusNoFaxDetected>
+ -13848: STATUS_PRINTER_BUSY, #</DevStatusFaxMemoryFullReceive>
+ -13849: STATUS_PRINTER_BUSY, #</DevStatusFaxReceiveError>
+
+}
+
+def StatusType6(dev): # LaserJet Status (XML)
+ info_device_status = cStringIO.StringIO()
+ info_ssp = cStringIO.StringIO()
+
+ try:
+ dev.getEWSUrl("/hp/device/info_device_status.xml", info_device_status)
+ dev.getEWSUrl("/hp/device/info_ssp.xml", info_ssp)
+ except:
+ pass
+
+ info_device_status = info_device_status.getvalue()
+ info_ssp = info_ssp.getvalue()
+
+ device_status = {}
+ ssp = {}
+
+ if info_device_status:
+ try:
+ log.debug_block("info_device_status", info_device_status)
+ device_status = utils.XMLToDictParser().parseXML(info_device_status)
+ log.debug(device_status)
+ except expat.ExpatError:
+ log.error("Device Status XML parse error")
+ device_status = {}
+
+ if info_ssp:
+ try:
+ log.debug_block("info_spp", info_ssp)
+ ssp = utils.XMLToDictParser().parseXML(info_ssp)
+ log.debug(ssp)
+ except expat.ExpatError:
+ log.error("SSP XML parse error")
+ ssp = {}
+
+ status_code = device_status.get('devicestatuspage-devicestatus-statuslist-status-code-0', 0)
+
+ if not status_code:
+ status_code = ssp.get('devicestatuspage-devicestatus-statuslist-status-code-0', 0)
+
+ black_supply_level = device_status.get('devicestatuspage-suppliesstatus-blacksupply-percentremaining', 0)
+ black_supply_low = ssp.get('suppliesstatuspage-blacksupply-lowreached', 0)
+ agents = []
+
+ agents.append({ 'kind' : AGENT_KIND_TONER_CARTRIDGE,
+ 'type' : AGENT_TYPE_BLACK,
+ 'health' : 0,
+ 'level' : black_supply_level,
+ 'level-trigger' : 0,
+ })
+
+ if dev.tech_type == TECH_TYPE_COLOR_LASER:
+ cyan_supply_level = device_status.get('devicestatuspage-suppliesstatus-cyansupply-percentremaining', 0)
+ agents.append({ 'kind' : AGENT_KIND_TONER_CARTRIDGE,
+ 'type' : AGENT_TYPE_CYAN,
+ 'health' : 0,
+ 'level' : cyan_supply_level,
+ 'level-trigger' : 0,
+ })
+
+ magenta_supply_level = device_status.get('devicestatuspage-suppliesstatus-magentasupply-percentremaining', 0)
+ agents.append({ 'kind' : AGENT_KIND_TONER_CARTRIDGE,
+ 'type' : AGENT_TYPE_MAGENTA,
+ 'health' : 0,
+ 'level' : magenta_supply_level,
+ 'level-trigger' : 0,
+ })
+
+ yellow_supply_level = device_status.get('devicestatuspage-suppliesstatus-yellowsupply-percentremaining', 0)
+ agents.append({ 'kind' : AGENT_KIND_TONER_CARTRIDGE,
+ 'type' : AGENT_TYPE_YELLOW,
+ 'health' : 0,
+ 'level' : yellow_supply_level,
+ 'level-trigger' : 0,
+ })
+
+ return {'revision' : STATUS_REV_UNKNOWN,
+ 'agents' : agents,
+ 'top-door' : 0,
+ 'supply-door' : 0,
+ 'duplexer' : 1,
+ 'photo-tray' : 0,
+ 'in-tray1' : 1,
+ 'in-tray2' : 1,
+ 'media-path' : 1,
+ 'status-code' : TYPE6_STATUS_CODE_MAP.get(status_code, STATUS_PRINTER_IDLE),
+ }
+
+# PJL status codes
+PJL_STATUS_MAP = {
+ 10001: STATUS_PRINTER_IDLE, # online
+ 10002: STATUS_PRINTER_OFFLINE, # offline
+ 10003: STATUS_PRINTER_WARMING_UP,
+ 10004: STATUS_PRINTER_BUSY, # self test
+ 10005: STATUS_PRINTER_BUSY, # reset
+ 10006: STATUS_PRINTER_LOW_TONER,
+ 10007: STATUS_PRINTER_CANCELING,
+ 10010: STATUS_PRINTER_SERVICE_REQUEST,
+ 10011: STATUS_PRINTER_OFFLINE,
+ 10013: STATUS_PRINTER_BUSY,
+ 10014: STATUS_PRINTER_REPORT_PRINTING,
+ 10015: STATUS_PRINTER_BUSY,
+ 10016: STATUS_PRINTER_BUSY,
+ 10017: STATUS_PRINTER_REPORT_PRINTING,
+ 10018: STATUS_PRINTER_BUSY,
+ 10019: STATUS_PRINTER_BUSY,
+ 10020: STATUS_PRINTER_BUSY,
+ 10021: STATUS_PRINTER_BUSY,
+ 10022: STATUS_PRINTER_REPORT_PRINTING,
+ 10023: STATUS_PRINTER_PRINTING,
+ 10024: STATUS_PRINTER_SERVICE_REQUEST,
+ 10025: STATUS_PRINTER_SERVICE_REQUEST,
+ 10026: STATUS_PRINTER_BUSY,
+ 10027: STATUS_PRINTER_MEDIA_JAM,
+ 10028: STATUS_PRINTER_REPORT_PRINTING,
+ 10029: STATUS_PRINTER_PRINTING,
+ 10030: STATUS_PRINTER_BUSY,
+ 10031: STATUS_PRINTER_BUSY,
+ 10032: STATUS_PRINTER_BUSY,
+ 10033: STATUS_PRINTER_SERVICE_REQUEST,
+ 10034: STATUS_PRINTER_CANCELING,
+ 10035: STATUS_PRINTER_PRINTING,
+ 10036: STATUS_PRINTER_WARMING_UP,
+ 10200: STATUS_PRINTER_LOW_BLACK_TONER,
+ 10201: STATUS_PRINTER_LOW_CYAN_TONER,
+ 10202: STATUS_PRINTER_LOW_MAGENTA_TONER,
+ 10203: STATUS_PRINTER_LOW_YELLOW_TONER,
+ 10204: STATUS_PRINTER_LOW_TONER, # order image drum
+ 10205: STATUS_PRINTER_LOW_BLACK_TONER, # order black drum
+ 10206: STATUS_PRINTER_LOW_CYAN_TONER, # order cyan drum
+ 10207: STATUS_PRINTER_LOW_MAGENTA_TONER, # order magenta drum
+ 10208: STATUS_PRINTER_LOW_YELLOW_TONER, # order yellow drum
+ 10209: STATUS_PRINTER_LOW_BLACK_TONER,
+ 10210: STATUS_PRINTER_LOW_CYAN_TONER,
+ 10211: STATUS_PRINTER_LOW_MAGENTA_TONER,
+ 10212: STATUS_PRINTER_LOW_YELLOW_TONER,
+ 10213: STATUS_PRINTER_SERVICE_REQUEST, # order transport kit
+ 10214: STATUS_PRINTER_SERVICE_REQUEST, # order cleaning kit
+ 10215: STATUS_PRINTER_SERVICE_REQUEST, # order transfer kit
+ 10216: STATUS_PRINTER_SERVICE_REQUEST, # order fuser kit
+ 10217: STATUS_PRINTER_SERVICE_REQUEST, # maintenance
+ 10218: STATUS_PRINTER_LOW_TONER,
+ 10300: STATUS_PRINTER_LOW_BLACK_TONER, # replace black toner
+ 10301: STATUS_PRINTER_LOW_CYAN_TONER, # replace cyan toner
+ 10302: STATUS_PRINTER_LOW_MAGENTA_TONER, # replace magenta toner
+ 10303: STATUS_PRINTER_LOW_YELLOW_TONER, # replace yellow toner
+ 10304: STATUS_PRINTER_SERVICE_REQUEST, # replace image drum
+ 10305: STATUS_PRINTER_SERVICE_REQUEST, # replace black drum
+ 10306: STATUS_PRINTER_SERVICE_REQUEST, # replace cyan drum
+ 10307: STATUS_PRINTER_SERVICE_REQUEST, # replace magenta drum
+ 10308: STATUS_PRINTER_SERVICE_REQUEST, # replace yellow drum
+ 10309: STATUS_PRINTER_SERVICE_REQUEST, # replace black cart
+ 10310: STATUS_PRINTER_SERVICE_REQUEST, # replace cyan cart
+ 10311: STATUS_PRINTER_SERVICE_REQUEST, # replace magenta cart
+ 10312: STATUS_PRINTER_SERVICE_REQUEST, # replace yellow cart
+ 10313: STATUS_PRINTER_SERVICE_REQUEST, # replace transport kit
+ 10314: STATUS_PRINTER_SERVICE_REQUEST, # replace cleaning kit
+ 10315: STATUS_PRINTER_SERVICE_REQUEST, # replace transfer kit
+ 10316: STATUS_PRINTER_SERVICE_REQUEST, # replace fuser kit
+ 10317: STATUS_PRINTER_SERVICE_REQUEST,
+ 10318: STATUS_PRINTER_SERVICE_REQUEST, # replace supplies
+ 10400: STATUS_PRINTER_NON_HP_INK, # [sic]
+ 10401: STATUS_PRINTER_IDLE,
+ 10402: STATUS_PRINTER_SERVICE_REQUEST,
+ 10403: STATUS_PRINTER_IDLE,
+ # 11xyy - Background paper-loading
+ # 12xyy - Background paper-tray status
+ # 15xxy - Output-bin status
+ # 20xxx - PJL parser errors
+ # 25xxx - PJL parser warnings
+ # 27xxx - PJL semantic errors
+ # 30xxx - Auto continuable conditions
+ 30119: STATUS_PRINTER_MEDIA_JAM,
+ # 32xxx - PJL file system errors
+ # 35xxx - Potential operator intervention conditions
+ # 40xxx - Operator intervention conditions
+ 40021: STATUS_PRINTER_DOOR_OPEN,
+ 40022: STATUS_PRINTER_MEDIA_JAM,
+ 40038: STATUS_PRINTER_LOW_TONER,
+ 40600: STATUS_PRINTER_NO_TONER,
+ # 41xyy - Foreground paper-loading messages
+ # 43xyy - Optional paper handling device messages
+ # 44xyy - LJ 4xxx/5xxx paper jam messages
+ # 50xxx - Hardware errors
+ # 55xxx - Personality errors
+
+}
+
+MIN_PJL_ERROR_CODE = 10001
+DEFAULT_PJL_ERROR_CODE = 10001
+
+def MapPJLErrorCode(error_code, str_code=None):
+ if error_code < MIN_PJL_ERROR_CODE:
+ return STATUS_PRINTER_BUSY
+
+ if str_code is None:
+ str_code = str(error_code)
+
+ if len(str_code) < 5:
+ return STATUS_PRINTER_BUSY
+
+ status_code = PJL_STATUS_MAP.get(error_code, None)
+
+ if status_code is None:
+ status_code = STATUS_PRINTER_BUSY
+
+ if 10999 < error_code < 12000: # 11xyy - Background paper-loading
+ # x = tray #
+ # yy = media code
+ tray = int(str_code[2])
+ media = int(str_code[3:])
+ log.debug("Background paper loading for tray #%d" % tray)
+ log.debug("Media code = %d" % media)
+
+ elif 11999 < error_code < 13000: # 12xyy - Background paper-tray status
+ # x = tray #
+ # yy = status code
+ tray = int(str_code[2])
+ status = int(str_code[3:])
+ log.debug("Background paper tray status for tray #%d" % tray)
+ log.debug("Status code = %d" % status)
+
+ elif 14999 < error_code < 16000: # 15xxy - Output-bin status
+ # xx = output bin
+ # y = status code
+ bin = int(str_code[2:4])
+ status = int(str_code[4])
+ log.debug("Output bin full for bin #%d" % bin)
+ status_code = STATUS_PRINTER_OUTPUT_BIN_FULL
+
+ elif 19999 < error_code < 28000: # 20xxx, 25xxx, 27xxx PJL errors
+ status_code = STATUS_PRINTER_SERVICE_REQUEST
+
+ elif 29999 < error_code < 31000: # 30xxx - Auto continuable conditions
+ log.debug("Auto continuation condition #%d" % error_code)
+ status_code = STATUS_PRINTER_BUSY
+
+ elif 34999 < error_code < 36000: # 35xxx - Potential operator intervention conditions
+ status_code = STATUS_PRINTER_SERVICE_REQUEST
+
+ elif 39999 < error_code < 41000: # 40xxx - Operator intervention conditions
+ status_code = STATUS_PRINTER_SERVICE_REQUEST
+
+ elif 40999 < error_code < 42000: # 41xyy - Foreground paper-loading messages
+ # x = tray
+ # yy = media code
+ tray = int(str_code[2])
+ media = int(str_code[3:])
+ log.debug("Foreground paper loading for tray #%d" % tray)
+ log.debug("Media code = %d" % media)
+ status_code = STATUS_PRINTER_OUT_OF_PAPER
+
+ elif 41999 < error_code < 43000:
+ status_code = STATUS_PRINTER_MEDIA_JAM
+
+ elif 42999 < error_code < 44000: # 43xyy - Optional paper handling device messages
+ status_code = STATUS_PRINTER_SERVICE_REQUEST
+
+ elif 43999 < error_code < 45000: # 44xyy - LJ 4xxx/5xxx paper jam messages
+ status_code = STATUS_PRINTER_MEDIA_JAM
+
+ elif 49999 < error_code < 51000: # 50xxx - Hardware errors
+ status_code = STATUS_PRINTER_HARD_ERROR
+
+ elif 54999 < error_code < 56000 : # 55xxx - Personality errors
+ status_code = STATUS_PRINTER_HARD_ERROR
+
+ log.debug("Mapped PJL error code %d to status code %d" % (error_code, status_code))
+ return status_code
+
+
+pjl_code_pat = re.compile("""^CODE\s*=\s*(\d.*)$""", re.IGNORECASE)
+
+
+
+def StatusType8(dev): # LaserJet PJL (B&W only)
+ try:
+ # Will error if printer is busy printing...
+ dev.openPrint()
+ except Error, e:
+ log.warn(e.msg)
+ status_code = STATUS_PRINTER_BUSY
+ else:
+ try:
+ try:
+ dev.writePrint("\x1b%-12345X@PJL INFO STATUS \r\n\x1b%-12345X")
+ pjl_return = dev.readPrint(1024, timeout=5, allow_short_read=True)
+ dev.close()
+
+ log.debug_block("PJL return:", pjl_return)
+
+ str_code = '10001'
+
+ for line in pjl_return.splitlines():
+ line = line.strip()
+ match = pjl_code_pat.match(line)
+
+ if match is not None:
+ str_code = match.group(1)
+ break
+
+ log.debug("Code = %s" % str_code)
+
+ try:
+ error_code = int(str_code)
+ except ValueError:
+ error_code = DEFAULT_PJL_ERROR_CODE
+
+ log.debug("Error code = %d" % error_code)
+
+ status_code = MapPJLErrorCode(error_code, str_code)
+ except Error:
+ status_code = STATUS_PRINTER_HARD_ERROR
+ finally:
+ try:
+ dev.closePrint()
+ except Error:
+ pass
+
+ agents = []
+
+ # TODO: Only handles mono lasers...
+ if status_code in (STATUS_PRINTER_LOW_TONER, STATUS_PRINTER_LOW_BLACK_TONER):
+ health = AGENT_HEALTH_OK
+ level_trigger = AGENT_LEVEL_TRIGGER_MAY_BE_LOW
+ level = 0
+
+ elif status_code == STATUS_PRINTER_NO_TONER:
+ health = AGENT_HEALTH_MISINSTALLED
+ level_trigger = AGENT_LEVEL_TRIGGER_MAY_BE_LOW
+ level = 0
+
+ else:
+ health = AGENT_HEALTH_OK
+ level_trigger = AGENT_LEVEL_TRIGGER_SUFFICIENT_0
+ level = 100
+
+ log.debug("Agent: health=%d, level=%d, trigger=%d" % (health, level, level_trigger))
+
+ agents.append({ 'kind' : AGENT_KIND_TONER_CARTRIDGE,
+ 'type' : AGENT_TYPE_BLACK,
+ 'health' : health,
+ 'level' : level,
+ 'level-trigger' : level_trigger,
+ })
+
+ if dev.tech_type == TECH_TYPE_COLOR_LASER:
+ level = 100
+ level_trigger = AGENT_LEVEL_TRIGGER_SUFFICIENT_0
+ if status_code == STATUS_PRINTER_LOW_CYAN_TONER:
+ level = 0
+ level_trigger = AGENT_LEVEL_TRIGGER_MAY_BE_LOW
+
+ log.debug("Agent: health=%d, level=%d, trigger=%d" % (health, level, level_trigger))
+
+ agents.append({ 'kind' : AGENT_KIND_TONER_CARTRIDGE,
+ 'type' : AGENT_TYPE_CYAN,
+ 'health' : AGENT_HEALTH_OK,
+ 'level' : level,
+ 'level-trigger' : level_trigger,
+ })
+
+ level = 100
+ level_trigger = AGENT_LEVEL_TRIGGER_SUFFICIENT_0
+ if status_code == STATUS_PRINTER_LOW_MAGENTA_TONER:
+ level = 0
+ level_trigger = AGENT_LEVEL_TRIGGER_MAY_BE_LOW
+
+ log.debug("Agent: health=%d, level=%d, trigger=%d" % (health, level, level_trigger))
+
+ agents.append({ 'kind' : AGENT_KIND_TONER_CARTRIDGE,
+ 'type' : AGENT_TYPE_MAGENTA,
+ 'health' : AGENT_HEALTH_OK,
+ 'level' : level,
+ 'level-trigger' : level_trigger,
+ })
+
+ level = 100
+ level_trigger = AGENT_LEVEL_TRIGGER_SUFFICIENT_0
+ if status_code == STATUS_PRINTER_LOW_YELLOW_TONER:
+ level = 0
+ level_trigger = AGENT_LEVEL_TRIGGER_MAY_BE_LOW
+
+ log.debug("Agent: health=%d, level=%d, trigger=%d" % (health, level, level_trigger))
+
+ agents.append({ 'kind' : AGENT_KIND_TONER_CARTRIDGE,
+ 'type' : AGENT_TYPE_YELLOW,
+ 'health' : AGENT_HEALTH_OK,
+ 'level' : level,
+ 'level-trigger' : level_trigger,
+ })
+
+ if status_code == 40021:
+ top_door = 0
+ else:
+ top_door = 1
+
+ log.debug("Status code = %d" % status_code)
+
+ return { 'revision' : STATUS_REV_UNKNOWN,
+ 'agents' : agents,
+ 'top-door' : top_door,
+ 'supply-door' : top_door,
+ 'duplexer' : 0,
+ 'photo-tray' : 0,
+ 'in-tray1' : 1,
+ 'in-tray2' : 1,
+ 'media-path' : 1,
+ 'status-code' : status_code,
+ }
+
+
+element_type10_xlate = { 'ink' : AGENT_KIND_SUPPLY,
+ 'inkCartridge' : AGENT_KIND_HEAD_AND_SUPPLY,
+ 'printhead' : AGENT_KIND_HEAD,
+ 'toner' : AGENT_KIND_TONER_CARTRIDGE,
+ 'tonerCartridge' : AGENT_KIND_TONER_CARTRIDGE,
+ }
+
+pen_type10_xlate = { 'pK' : AGENT_TYPE_PG,
+ 'CMY' : AGENT_TYPE_CMY,
+ 'M' : AGENT_TYPE_MAGENTA,
+ 'C' : AGENT_TYPE_CYAN,
+ 'Y' : AGENT_TYPE_YELLOW,
+ 'K' : AGENT_TYPE_BLACK,
+ }
+
+pen_level10_xlate = { 'ok' : AGENT_LEVEL_TRIGGER_SUFFICIENT_0,
+ 'low' : AGENT_LEVEL_TRIGGER_MAY_BE_LOW,
+ 'out' : AGENT_LEVEL_TRIGGER_ALMOST_DEFINITELY_OUT,
+ 'empty' : AGENT_LEVEL_TRIGGER_ALMOST_DEFINITELY_OUT,
+ 'missing' : AGENT_LEVEL_TRIGGER_ALMOST_DEFINITELY_OUT,
+ }
+
+pen_health10_xlate = { 'ok' : AGENT_HEALTH_OK,
+ 'misinstalled' : AGENT_HEALTH_MISINSTALLED,
+ 'missing' : AGENT_HEALTH_MISINSTALLED,
+ }
+
+def clean(data):
+ if data[0] is not '<':
+ size = -1
+ temp = ""
+ while size:
+ index = data.find('\r\n')
+ size = int(data[0:index+1], 16)
+ temp = temp + data[index+2:index+2+size]
+ data = data[index+2+size+2:len(data)]
+ data = temp
+ return data
+
+def StatusType10FetchUrl(func, url, footer=""):
+ data_fp = cStringIO.StringIO()
+ if footer:
+ #data = dev.getEWSUrl_LEDM(url, data_fp, footer)
+ data = func(url, data_fp, footer)
+ else:
+ #data = dev.getEWSUrl_LEDM(url, data_fp)
+ data = func(url, data_fp)
+ if data:
+ data = data.split('\r\n\r\n', 1)[1]
+ if data:
+ data = clean(data)
+ return data
+
+def StatusType10(func): # Low End Data Model
+ status_block = { 'revision' : STATUS_REV_UNKNOWN,
+ 'agents' : [],
+ 'top-door' : TOP_DOOR_NOT_PRESENT,
+ 'supply-door' : TOP_DOOR_NOT_PRESENT,
+ 'duplexer' : DUPLEXER_NOT_PRESENT,
+ 'photo-tray' : PHOTO_TRAY_NOT_PRESENT,
+ 'in-tray1' : IN_TRAY_NOT_PRESENT,
+ 'in-tray2' : IN_TRAY_NOT_PRESENT,
+ 'media-path' : MEDIA_PATH_NOT_PRESENT,
+ 'status-code' : STATUS_PRINTER_IDLE,
+ }
+
+ if not etree_loaded and not elementtree_loaded:
+ log.error("cannot get status for printer. please load ElementTree module")
+ return status_block
+
+ # Get the dynamic consumables configuration
+ data = StatusType10FetchUrl(func, "/DevMgmt/ConsumableConfigDyn.xml")
+ if not data:
+ return status_block
+ data = data.replace("ccdyn:", "").replace("dd:", "")
+
+ # Parse the agent status XML
+ agents = []
+ try:
+ if etree_loaded:
+ tree = ElementTree.XML(data)
+ if not etree_loaded and elementtree_loaded:
+ tree = XML(data)
+ elements = tree.findall("ConsumableInfo")
+ for e in elements:
+ health = AGENT_HEALTH_OK
+ ink_level = 0
+ try:
+ type = e.find("ConsumableTypeEnum").text
+ state = e.find("ConsumableLifeState/ConsumableState").text
+
+ # level
+ if type == "ink" or type == "inkCartridge" or type == "toner" or type == "tonerCartridge":
+ ink_type = e.find("ConsumableLabelCode").text
+ if state != "missing":
+ try:
+ ink_level = int(e.find("ConsumablePercentageLevelRemaining").text)
+ except:
+ ink_level = 0
+ else:
+ ink_type = ''
+ if state == "ok":
+ ink_level = 100
+
+ log.debug("type '%s' state '%s' ink_type '%s' ink_level %d" % (type, state, ink_type, ink_level))
+
+ entry = { 'kind' : element_type10_xlate.get(type, AGENT_KIND_NONE),
+ 'type' : pen_type10_xlate.get(ink_type, AGENT_TYPE_NONE),
+ 'health' : pen_health10_xlate.get(state, AGENT_HEALTH_OK),
+ 'level' : int(ink_level),
+ 'level-trigger' : pen_level10_xlate.get(state, AGENT_LEVEL_TRIGGER_SUFFICIENT_0)
+ }
+
+ log.debug("%s" % entry)
+ agents.append(entry)
+ except AttributeError:
+ log.debug("no value found for attribute")
+ except (expat.ExpatError, UnboundLocalError):
+ agents = []
+ status_block['agents'] = agents
+
+ # Get the media handling configuration
+ data = StatusType10FetchUrl(func, "/DevMgmt/MediaHandlingDyn.xml")
+ if not data:
+ return status_block
+ data = data.replace("mhdyn:", "").replace("dd:", "")
+
+ # Parse the media handling XML
+ try:
+ if etree_loaded:
+ tree = ElementTree.XML(data)
+ if not etree_loaded and elementtree_loaded:
+ tree = XML(data)
+ elements = tree.findall("InputTray")
+ except (expat.ExpatError, UnboundLocalError):
+ elements = []
+ for e in elements:
+ bin_name = e.find("InputBin").text
+ if bin_name == "Tray1":
+ status_block['in-tray1'] = IN_TRAY_PRESENT
+ elif bin_name == "Tray2":
+ status_block['in-tray2'] = IN_TRAY_PRESENT
+ elif bin_name == "PhotoTray":
+ status_block['photo-tray'] = PHOTO_TRAY_ENGAGED
+ else:
+ log.error("found invalid bin name '%s'" % bin_name)
+
+ try:
+ elements = tree.findall("Accessories/MediaHandlingDeviceFunctionType")
+ except UnboundLocalError:
+ elements = []
+ for e in elements:
+ if e.text == "autoDuplexor":
+ status_block['duplexer'] = DUPLEXER_DOOR_CLOSED
+
+ # Get the product status
+ data = StatusType10FetchUrl(func, "/DevMgmt/ProductStatusDyn.xml")
+ if not data:
+ return status_block
+ data = data.replace("psdyn:", "").replace("locid:", "")
+ data = data.replace("pscat:", "").replace("dd:", "").replace("ad:", "")
+
+ # Parse the product status XML
+ try:
+ if etree_loaded:
+ tree = ElementTree.XML(data)
+ if not etree_loaded and elementtree_loaded:
+ tree = XML(data)
+ elements = tree.findall("Status/StatusCategory")
+ except (expat.ExpatError, UnboundLocalError):
+ elements = []
+ for e in elements:
+ if e.text == "processing":
+ status_block['status-code'] = STATUS_PRINTER_PRINTING
+ if e.text == "closeDoorOrCover":
+ status_block['status-code'] = STATUS_PRINTER_DOOR_OPEN
+ elif e.text == "shuttingDown":
+ status_block['status-code'] = STATUS_PRINTER_TURNING_OFF
+ elif e.text == "cancelJob":
+ status_block['status-code'] = STATUS_PRINTER_CANCELING
+ elif e.text == "trayEmptyOrOpen":
+ status_block['status-code'] = STATUS_PRINTER_OUT_OF_PAPER
+ elif e.text == "jamInPrinter":
+ status_block['status-code'] = STATUS_PRINTER_MEDIA_JAM
+ elif e.text == "hardError":
+ status_block['status-code'] = STATUS_PRINTER_HARD_ERROR
+ elif e.text == "outputBinFull":
+ status_block['status-code'] = STATUS_PRINTER_OUTPUT_BIN_FULL
+ elif e.text == "unexpectedSizeInTray" or e.text == "sizeMismatchInTray":
+ status_block['status-code'] = STATUS_PRINTER_MEDIA_SIZE_MISMATCH
+ elif e.text == "insertOrCloseTray2":
+ status_block['status-code'] = STATUS_PRINTER_TRAY_2_MISSING
+ elif e.text == "scannerError":
+ status_block['status-code'] = EVENT_SCANNER_FAIL
+ elif e.text == "scanProcessing":
+ status_block['status-code'] = EVENT_START_SCAN_JOB
+ elif e.text == "scannerAdfLoaded":
+ status_block['status-code'] = EVENT_SCAN_ADF_LOADED
+ elif e.text == "scanToDestinationNotSet":
+ status_block['status-code'] = EVENT_SCAN_TO_DESTINATION_NOTSET
+ elif e.text == "scanWaitingForPC":
+ status_block['status-code'] = EVENT_SCAN_WAITING_FOR_PC
+ elif e.text == "scannerAdfJam":
+ status_block['status-code'] = EVENT_SCAN_ADF_JAM
+ elif e.text == "scannerAdfDoorOpen":
+ status_block['status-code'] = EVENT_SCAN_ADF_DOOR_OPEN
+ elif e.text == "faxProcessing":
+ status_block['status-code'] = EVENT_START_FAX_JOB
+ elif e.text == "faxSending":
+ status_block['status-code'] = STATUS_FAX_TX_ACTIVE
+ elif e.text == "faxReceiving":
+ status_block['status-code'] = STATUS_FAX_RX_ACTIVE
+ elif e.text == "faxDialing":
+ status_block['status-code'] = EVENT_FAX_DIALING
+ elif e.text == "faxConnecting":
+ status_block['status-code'] = EVENT_FAX_CONNECTING
+ elif e.text == "faxSendError":
+ status_block['status-code'] = EVENT_FAX_SEND_ERROR
+ elif e.text == "faxErrorStorageFull":
+ status_block['status-code'] = EVENT_FAX_ERROR_STORAGE_FULL
+ elif e.text == "faxReceiveError":
+ status_block['status-code'] = EVENT_FAX_RECV_ERROR
+ elif e.text == "faxBlocking":
+ status_block['status-code'] = EVENT_FAX_BLOCKING
+ elif e.text == "inPowerSave":
+ status_block['status-code'] = STATUS_PRINTER_POWER_SAVE
+ elif e.text == "incorrectCartridge":
+ status_block['status-code'] = STATUS_PRINTER_CARTRIDGE_WRONG
+ elif e.text == "cartridgeMissing":
+ status_block['status-code'] = STATUS_PRINTER_CARTRIDGE_MISSING
+ elif e.text == "missingPrintHead":
+ status_block['status-code'] = STATUS_PRINTER_PRINTHEAD_MISSING
+
+ return status_block
diff --git a/base/strings.py b/base/strings.py
new file mode 100644
index 0000000..83fdb46
--- /dev/null
+++ b/base/strings.py
@@ -0,0 +1,276 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2007 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch, Naga Samrat Chowdary Narla, Yashwant Kumar Sahu
+#
+
+# string_table := { 'string_id' : 'short', 'long' ), ... }
+
+# string_id's for error codes are the string form of the error code
+# Strings that need localization use (self.__tr'string' ) form.
+# Strings that refer to other strings, use '%reference%' form.
+# Blank strings use '' form.
+
+class StringTable:
+ def __init__(self):
+
+ self.string_table = {
+ '0' : (self.__tr('Unknown'), ''),
+ 'unknown' : (self.__tr('Unknown'), ''),
+ 'try_again' : ('', self.__tr('Please correct the problem and try again')),
+ 'press_continue' : ('',self.__tr('Please correct the problem and press continue on the printer')),
+ '500' : (self.__tr('Started a print job'), ''),
+ '501' : (self.__tr('Print job has completed'), ''),
+ '502' : (self.__tr("Print job failed - required plug-in not found"), self.__tr("Please run hp-plugin (as root) to install the required plug-in")),
+ '600' : (self.__tr('Started a fax job'), ''),
+ '601' : (self.__tr('Fax job is ready for send'), ''),
+ '700' : (self.__tr('Printer queue stopped'), ''),
+ '701' : (self.__tr('Printer queue started'), ''),
+ '702' : (self.__tr('Printer is rejecting jobs'), ''),
+ '703' : (self.__tr('Printer is accepting jobs'), ''),
+ '704' : (self.__tr('Printer set as default'), ''),
+ '800' : (self.__tr('Fax queue stopped'), ''),
+ '801' : (self.__tr('Fax queue started'), ''),
+ '802' : (self.__tr('Fax is rejecting jobs'), ''),
+ '803' : (self.__tr('Fax is accepting jobs'), ''),
+ '804' : (self.__tr('Fax set as default'), ''),
+ '805' : (self.__tr("Fax job failed - required plug-in not found"), '%502%'),
+ '1000' : (self.__tr('Idle'), ''),
+ '1001' : (self.__tr('Busy'), ''),
+ '1002' : (self.__tr('Print job is continuing'), ''),
+ '1003' : (self.__tr('Turning off'), ''),
+ '1004' : (self.__tr('Report printing'), ''),
+ '1005' : (self.__tr('Canceling'), ''),
+ '1006' : ('%5002%', '%try_again%'),
+ '1007' : (self.__tr('Waiting for ink to dry'), ''),
+ '1008' : (self.__tr('Pen change'), ''),
+ '1009' : (self.__tr('The printer is out of paper'), self.__tr('Please load more paper and follow the instructions on the front panel (if any) to continue printing')),
+ '1010' : (self.__tr('Banner eject needed'), ''),
+ '1011' : (self.__tr('Banner mismatch'), '%try_again%'),
+ '1012' : (self.__tr('Photo mismatch'), '%try_again%'),
+ '1013' : (self.__tr('Duplex mismatch'), '%try_again'),
+ '1014' : (self.__tr('Paper or cartridge carriage jammed'), self.__tr('Please clear the jam and press continue on the printer')),
+ '1015' : ('%1014%', '%1014%'),
+ '1016' : ('%1014%', '%1014%'),
+ '1017' : (self.__tr('There is a problem with a print cartridge'), '%press_continue%'),
+ '1018' : ('%unknown_error%', '%try_again%'),
+ '1019' : (self.__tr('Powering down'), ''),
+ '1020' : (self.__tr('Front panel test'), ''),
+ '1021' : (self.__tr('Clean out tray missing'), '%try_again%'),
+ '1022' : (self.__tr('Output bin full'), '%try_again%'),
+ '1023' : (self.__tr('Media size mismatch'), '%try_again%'),
+ '1024' : (self.__tr('Duplexer is jammed'), '%1014%'),
+ '1025' : ('%1014%', '%1014%'),
+ '1026' : (self.__tr('An ink cartridge is out of ink'), '%try_again%'),
+ '1027' : (self.__tr('Internal device error'), '%try_again%'),
+ '1028' : ('%1014%', '%1014%'),
+ '1029' : (self.__tr('Second tray missing'), '%try_again%'),
+ '1030' : (self.__tr('Duplexer missing'), '%try_again%'),
+ '1031' : (self.__tr('Rear tray missing'), '%try_again%'),
+ '1032' : (self.__tr('Cartridge not latched'), '%try_again%'),
+ '1033' : (self.__tr('Battery very low'), '%try_again%'),
+ '1034' : ('%1017%', '%try_again%'),
+ '1035' : (self.__tr('Output tray closed'), '%try_again%'),
+ '1036' : (self.__tr('Manual feed blocked'), '%1014%'),
+ '1037' : (self.__tr('Rear feed blocked'), '%1014%'),
+ '1038' : (self.__tr('Second tray out of paper'), '%1009%'),
+ '1039' : (self.__tr('Input tray locked'), '%try_again%'),
+ '1040' : (self.__tr('Non-HP ink'), '%try_again%'),
+ '1041' : (self.__tr('Pen calibration needs resume'), '%press_continue%'),
+ '1042' : (self.__tr('Media type mismatch'), '%try_again%'),
+ '1043' : (self.__tr('Custom media mismatch'), '%try_again%'),
+ '1044' : (self.__tr('Pen cleaning in progress'), ''),
+ '1045' : (self.__tr('Pen checking in progress'), ''),
+ '1046' : (self.__tr('In power save mode'), ''),
+ '1047' : (self.__tr('Incorrect cartridge'), ''),
+ '1048' : (self.__tr('Missing cartridge'), ''),
+ '1049' : (self.__tr('Printhead(s): Missing or Damaged'), ''),
+ '1501' : (self.__tr('Black cartridge is low on ink'), ''),
+ '1502' : (self.__tr('Tri-color cartridge is low on ink'), ''),
+ '1503' : (self.__tr('Photo cartridge is low on ink'), ''),
+ '1504' : (self.__tr('Cyan cartridge is low on ink'), ''),
+ '1505' : (self.__tr('Magenta cartridge is low on ink'), ''),
+ '1506' : (self.__tr('Yellow cartridge is low on ink'), ''),
+ '1507' : (self.__tr('Photo cyan cartridge is low on ink'), ''),
+ '1508' : (self.__tr('Photo magenta cartridge is low on ink'), ''),
+ '1509' : (self.__tr('Photo yellow cartridge is low on ink'), ''),
+ '1510' : (self.__tr('Photo gray cartridge is low on ink'), ''),
+ '1511' : (self.__tr('Photo blue cartridge is low on ink'), ''),
+ '1601' : (self.__tr('Black cartridge is low on toner'), ''),
+ '1604' : (self.__tr('Cyan cartridge is low on toner'), ''),
+ '1605' : (self.__tr('Magenta cartridge is low on toner'), ''),
+ '1606' : (self.__tr('Yellow cartridge is low on toner'), ''),
+ '1800' : (self.__tr('Warming up'), ''),
+ '1801' : (self.__tr('Low paper'), ''),
+ '1802' : (self.__tr('Door open'), '%try_again%'),
+ '1803' : (self.__tr('Offline'), ''),
+ '1804' : (self.__tr('Low toner'), ''),
+ '1805' : (self.__tr('No toner'), '%try_again%'),
+ '1806' : (self.__tr('Service request'), '%try_again%'),
+ '1807' : (self.__tr('Fuser error'), '%try_again%'),
+ '1900' : (self.__tr('Unsupported printer model'), ''),
+ '2000' : (self.__tr('Scan job started'), ''),
+ '2001' : (self.__tr('Scan job completed'), ''),
+ '2002' : (self.__tr('Scan job failed'), '%try_again%'),
+ '2003' : (self.__tr("Scan job failed - Required plug-in not found"), '%502%'),
+ '2004' : (self.__tr('Scanner automatic document feeder is loaded'), ''),
+ '2005' : (self.__tr('Scan to a destination is not specified'), ''),
+ '2006' : (self.__tr('Scanner is waiting for PC'), ''),
+ '2007' : (self.__tr('Scanner automatic document feeder jam'), ''),
+ '2008' : (self.__tr('Scanner automatic document feeder door opened'), ''),
+ '2009' : (self.__tr('Scan job cancelled'), ''),
+ '2010' : (self.__tr('Check scan image size requirements'), ''),
+ '2011' : (self.__tr('Scanner ADF empty'), ''),
+ '2012' : (self.__tr('Scanner ADF mispick'), ''),
+ '2013' : (self.__tr('Scanner busy'), ''),
+ '3000' : (self.__tr('Fax job started'), ''),
+ '3001' : (self.__tr('Fax job complete'), ''),
+ '3002' : (self.__tr('Fax job failed'), '%try_again%'),
+ '3003' : (self.__tr('Fax job canceled'), ''),
+ '3004' : (self.__tr('Fax send job continuing'), ''),
+ '3005' : (self.__tr('Fax receive job continuing'), ''),
+ '3006' : (self.__tr('Fax dialing'), ''),
+ '3007' : (self.__tr('Fax connecting'), ''),
+ '3008' : (self.__tr('Fax send error'), ''),
+ '3009' : (self.__tr('Fax error storage full'), ''),
+ '3010' : (self.__tr('Fax receive error'), ''),
+ '3011' : (self.__tr('Fax blocking'), ''),
+ '4000' : (self.__tr('Copy job started'), ''),
+ '4001' : (self.__tr('Copy job complete'), ''),
+ '4002' : (self.__tr('Copy job failed'), '%try_again%'),
+ '4003' : (self.__tr('Copy job canceled'), ''),
+ '5002' : (self.__tr('Device is busy, powered down, or unplugged'), '%5012%'),
+ '5004' : (self.__tr('Invalid device URI'), '%5012%'),
+ '5012' : (self.__tr('Device communication error'), '%try_again%'),
+ '5021' : (self.__tr('Device is busy'), ''),
+ '5026' : (self.__tr("Device status not available"), ''),
+ '5031' : ('%5021%', ''),
+ '5034' : (self.__tr('Device does not support requested operation'), '%try_again%'),
+ '5501' : (self.__tr('Device added'), ''),
+ '6000' : (self.__tr('Photocard unload started'), ''),
+ '6001' : (self.__tr('Photocard unload ended'), ''),
+ '6002' : (self.__tr('Photocard unload failed'), self.__tr('Make sure photocard is inserted properly and try again')),
+ '6003' : (self.__tr('Unable to mount photocard on device'), '%6002%'),
+ '6004' : (self.__tr('Photocard unloaded successfully'), ''),
+ 'unknown_error' : (self.__tr('Unknown error'), ''),
+ 'print' : (self.__tr('Print'), ''),
+ 'scan' : (self.__tr('Scan'), ''),
+ 'send_fax' : (self.__tr('Send fax'), ''),
+ 'make_copies' : (self.__tr('Make copies'), ''),
+ 'access_photo_cards' : (self.__tr('Access photo cards'), ''),
+ 'agent_invalid_invalid' : (self.__tr('Invalid/missing'), ''),
+ 'agent_invalid_supply' : (self.__tr('Invalid/missing ink cartridge'), ''),
+ 'agent_invalid_cartridge':(self.__tr('Invalid/missing cartridge'), ''),
+ 'agent_invalid_head' : (self.__tr('Invalid/missing print head'), ''),
+ 'agent_unknown_unknown' : ('%unknown%', ''),
+ 'agent_unspecified_battery' : ('Battery', ''),
+ 'agent_black_head' : (self.__tr('Black print head'), ''),
+ 'agent_black_supply' : (self.__tr('Black ink cartridge'), ''),
+ 'agent_black_cartridge' : (self.__tr('Black cartridge'), ''),
+ 'agent_cmy_head' : (self.__tr('Tri-color print head'), ''),
+ 'agent_cmy_supply' : (self.__tr('Tri-color ink cartridge'), ''),
+ 'agent_cmy_cartridge' : (self.__tr('Tri-color cartridge'), ''),
+ 'agent_kcm_head' : (self.__tr('Photo print head'), ''),
+ 'agent_kcm_supply' : (self.__tr('Photo ink cartridge'), ''),
+ 'agent_kcm_cartridge' : (self.__tr('Photo cartridge'), ''),
+ 'agent_cyan_head' : (self.__tr('Cyan print head'), ''),
+ 'agent_cyan_supply' : (self.__tr('Cyan ink cartridge'), ''),
+ 'agent_cyan_cartridge' : (self.__tr('Cyan cartridge'), ''),
+ 'agent_magenta_head' : (self.__tr('Magenta print head'), ''),
+ 'agent_magenta_supply' : (self.__tr('Magenta ink cartridge'), ''),
+ 'agent_magenta_cartridge':(self.__tr('Magenta cartridge'), ''),
+ 'agent_yellow_head' : (self.__tr('Yellow print head'), ''),
+ 'agent_yellow_supply' : (self.__tr('Yellow ink cartridge'), ''),
+ 'agent_yellow_cartridge': (self.__tr('Yellow cartridge'), ''),
+ 'agent_photo_cyan_head' : (self.__tr('Photo cyan print head'), ''),
+ 'agent_photo_cyan_supply' : (self.__tr('Photo cyan ink cartridge'), ''),
+ 'agent_photo_cyan_cartridge' : (self.__tr('Photo cyan cartridge'), ''),
+ 'agent_photo_magenta_head' : (self.__tr('Photo magenta print head'), ''),
+ 'agent_photo_magenta_supply' : (self.__tr('Photo magenta ink cartridge'), ''),
+ 'agent_photo_magenta_cartridge':(self.__tr('Photo magenta cartridge'), ''),
+ 'agent_photo_yellow_head' : (self.__tr('Photo yellow print head'), ''),
+ 'agent_photo_yellow_supply' : (self.__tr('Photo yellow ink cartridge'), ''),
+ 'agent_photo_yellow_cartridge': (self.__tr('Photo yellow cartridge'), ''),
+ 'agent_photo_gray_head' : (self.__tr('Photo gray print head'), ''),
+ 'agent_photo_gray_supply' : (self.__tr('Photo gray ink cartridge'), ''),
+ 'agent_photo_gray_cartridge' : (self.__tr('Photo gray cartridge'), ''),
+ 'agent_photo_blue_head' : (self.__tr('Photo blue print head'), ''),
+ 'agent_photo_blue_supply' : (self.__tr('Photo blue ink cartridge'), ''),
+ 'agent_photo_blue_cartridge' : (self.__tr('Photo blue cartridge'), ''),
+ 'agent_kcmy_cm_head' : (self.__tr('Print head'), ''),
+ 'agent_photo_cyan_and_photo_magenta_head' : (self.__tr('Photo magenta and photo cyan print head'), ''),
+ 'agent_yellow_and_magenta_head' : (self.__tr('Magenta and yellow print head'), '' ),
+ 'agent_cyan_and_black_head' : (self.__tr('Black and cyan print head'), '' ),
+ 'agent_light_gray_and_photo_black_head' : (self.__tr('Light gray and photo black print head'), '' ),
+ 'agent_light_gray_supply' : (self.__tr('Light gray ink cartridge'), '' ),
+ 'agent_medium_gray_supply' : (self.__tr('Medium gray ink cartridge'), '' ),
+ 'agent_photo_gray_supply' : (self.__tr('Photo black ink cartridge'), '' ),
+ 'agent_cyan_and_magenta_head' : (self.__tr('Cyan and magenta print head'), ''),
+ 'agent_black_and_yellow_head' : (self.__tr('Black and yellow print head'), ''),
+ 'agent_black_toner' : (self.__tr('Black toner cartridge'), ''),
+ 'agent_cyan_toner' : (self.__tr('Cyan toner cartridge'), ''),
+ 'agent_magenta_toner' : (self.__tr('Magenta toner cartridge'), ''),
+ 'agent_yellow_toner' : (self.__tr('Yellow toner cartridge'), ''),
+ 'agent_unspecified_maint_kit' : (self.__tr('Maintenance kit (fuser)'), ''),
+ 'agent_unspecified_adf_kit' : (self.__tr('Document feeder (ADF) kit'), ''),
+ 'agent_unspecified_drum_kit' : (self.__tr('Drum maintenance kit'), ''),
+ 'agent_unspecified_transfer_kit' : (self.__tr('Image transfer kit'), ''),
+ 'agent_health_unknown' : ('Unknown', ''),
+ 'agent_health_ok' : (self.__tr('Good/OK'), ''),
+ 'agent_health_fair_moderate' : (self.__tr('Fair/Moderate'), ''),
+ 'agent_health_misinstalled': (self.__tr('Not installed'), ''),
+ 'agent_health_incorrect' : (self.__tr('Incorrect'), ''),
+ 'agent_health_failed' : (self.__tr('Failed'),''),
+ 'agent_health_overtemp' : (self.__tr('Overheated'),''),
+ 'agent_health_discharging' : (self.__tr('Discharging'), ''),
+ 'agent_health_charging' : (self.__tr('Charging'), ''),
+ 'agent_level_unknown' : ('%unknown%', ''),
+ 'agent_level_low' : (self.__tr('Low'), ''),
+ 'agent_level_out' : (self.__tr('Very low'),''),
+ 'vsa_000' : (self.__tr("The Ethernet cable is plugged in which will prevent you from connecting to a wireless network. To connect wirelessly, remove the cable and try again. (VSA000)"), ''),
+ 'vsa_001' : (self.__tr("A wireless network was found that matches what you have configured. However, the Ethernet cable is plugged in which will prevent you from connecting to it. To connect wirelessly, remove the cable and try again. (VSA001)"), ''),
+ 'vsa_002' : (self.__tr("The wireless adaptor on your printer is not enabled. You cannot connect to a wireless network until this is turned on. (VSA002)"), ''),
+ 'vsa_003' : (self.__tr("Your Access Point (AP) is not broadcasting its SSID. This feature is probably disabled. (VSA003)"), ''),
+ 'vsa_004' : (self.__tr("The wireless adaptor on your printer is not functioning properly. There may be a problem with the hardware. (VSA004)"), ''),
+ 'vsa_100' : (self.__tr("Check if MAC address filtering or IP address filtering is being used by your Access Point. If it is, then refer to your troubleshooting documentation that came with your HP device and make any necessary corrections. (VSA100)"), ''),
+ 'vsa_101' : (self.__tr("The access point you are trying to connect to has settings that are NOT consistent with the ones in the printer. (VSA101)"), ''),
+ 'vsa_102' : (self.__tr("Unknown (VSA102)"), ''),
+ 'vsa_200' : (self.__tr("Your printer is configured to connect to an Access Point (AP) with the manufacturer's default (SSID) name. You should consider changing the AP name to avoid connecting to the wrong access point. (VSA200)"), ''),
+ 'vsa_201' : (self.__tr("The network that you are trying to connect to cannot be found. Please make sure your access point is powered on. (VSA201)"), ''),
+ 'vsa_202' : (self.__tr("You are trying to connect to an ad hoc network, and no other devices with that SSID can be found. (VSA202)"), ''),
+ 'vsa_203' : (self.__tr("Check that your HP device (SSID) name matches your Access Point (SSID) name exactly (SSID names are case sensitive). (VSA203)"), ''),
+ 'vsa_204' : (self.__tr("The SSID that you have configured is empty. In order to connect wirelessly you must enter a valid, non-blank SSID. (VSA204)"), ''),
+ 'vsa_300' : (self.__tr("The printer is configured to connect to an ad hoc wireless network in 802.11g mode. This can cause compatibility issues with older 802.11b devices. (VSA300)"), ''),
+ 'vsa_301' : (self.__tr("The printer is configured so that it shows that it is connected to an ad hoc network even if no other devices are present. This setting should only be used to connect to non-compliant 802.11 devices. WiFi certified devices won't have this issue. (VSA301)"), ''),
+ 'vsa_302' : (self.__tr("The printer is configured to show that it isn't connected to an ad hoc network when no other devices are present. This setting should only be used to connect to compliant/WiFi certified 802.11 devices. (VSA302)"), ''),
+ 'vsa_303' : (self.__tr("The printer is configured to connect to the wireless network in 802.11b mode. This setting should only be used to connect to a non-compliant 802.11 device. WiFi certified devices don't have this issue. (VSA303)"), ''),
+ 'vsa_400' : (self.__tr("The signal strength for your wireless network too low (below -85dBm) which may result in your network becoming unstable. (VSA400)"), ''),
+ 'vsa_401' : (self.__tr("You are not currently associated with a wireless network. However, a network that is consistent with your settings has been detected, but its signal strength is below -85dBm which could be preventing association. (VSA401)"), ''),
+ 'vsa_500' : (self.__tr("There were multiple access points (or wireless repeaters) with your configured found in the area. The printer will connect to the one with the strongest signal. If you have setup a network with multiple APs, this is normal and this message is for information purposes only. (VSA500)"), ''),
+ 'vsa_501' : (self.__tr("There were multiple access points (or wireless repeaters) with your configured found in the area. Some of these networks have settings that are inconsistent with your printer's wireless settings. (VSA501)"), '' ),
+ 'vsa_600' : (self.__tr("Your wireless network requires a WEP key. The key you have provided does not match what is expected. Click <i>&lt; Back</i> to re-enter the key. (VSA600)"), ''),
+ 'vsa_601' : (self.__tr("Your wireless network requires a WEP key. However, no data has been received to decrypt. Please try again in a few seconds. (VSA601)"), ''),
+ 'vsa_602' : (self.__tr("The WEP key index on your HP device does not match that of your Access Point. Refer to the documentation that came with your HP device regarding changing the WEP key index. (VSA602)"), ''),
+ 'vsa_603' : (self.__tr("Your Access Point (AP) requires a WPA pass phrase. The pass phrase you entered for your HP device does not match exactly your AP pass phrase. Click <i>&lt; Back</i> to re-enter the pass phase. (VSA603)"), ''),
+ 'vsa_604' : (self.__tr("The HP printer is configured to connect to a WEP wireless network and the authentication method has been changed from the default setting. (VSA604)"), ''),
+ 'vsa_605' : (self.__tr("The HP printer is configured to connect using WPA-PSK authentication. However, the encryption method you have chosen is not the default. (VSA605)"), ''),
+ 'vsa_606' : (self.__tr("The HP printer is configured to connect using WPA-PSK authentication. However, the authentication method you have chosen is not the default. (VSA606)"), ''),
+ }
+
+ def __tr(self,s,c = None):
+ return s
diff --git a/base/tui.py b/base/tui.py
new file mode 100644
index 0000000..e012636
--- /dev/null
+++ b/base/tui.py
@@ -0,0 +1,483 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2009 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+# Std Lib
+import sys
+import re
+
+# Local
+from g import *
+import pexpect
+import utils
+
+
+def enter_yes_no(question, default_value='y', choice_prompt=None):
+ if type(default_value) == type(""):
+ if default_value == 'y':
+ default_value = True
+ else:
+ default_value = False
+
+ #assert default_value in [True, False]
+
+ if choice_prompt is None:
+ if default_value:
+ question += " (y=yes*, n=no, q=quit) ? "
+ else:
+ question += " (y=yes, n=no*, q=quit) ? "
+ else:
+ question += choice_prompt
+
+ while True:
+ try:
+ user_input = raw_input(log.bold(question)).lower().strip()
+ except EOFError:
+ continue
+
+ if not user_input:
+ return True, default_value
+
+ if user_input == 'n':
+ return True, False
+
+ if user_input == 'y':
+ return True, True
+
+ if user_input in ('q', 'c'): # q -> quit, c -> cancel
+ return False, default_value
+
+ log.error("Please press <enter> or enter 'y', 'n', or 'q'.")
+
+
+def enter_range(question, min_value, max_value, default_value=None):
+ while True:
+ try:
+ user_input = raw_input(log.bold(question)).lower().strip()
+ except EOFError:
+ continue
+
+ if not user_input:
+ if default_value is not None:
+ return True, default_value
+
+ if user_input == 'q':
+ return False, default_value
+
+ try:
+ value_int = int(user_input)
+ except ValueError:
+ log.error('Please enter a number between %d and %d, or "q" to quit.' %
+ (min_value, max_value))
+ continue
+
+ if value_int < min_value or value_int > max_value:
+ log.error('Please enter a number between %d and %d, or "q" to quit.' %
+ (min_value, max_value))
+ continue
+
+ return True, value_int
+
+
+def enter_choice(question, choices, default_value=None):
+ if 'q' not in choices:
+ choices.append('q')
+
+ while True:
+ try:
+ user_input = raw_input(log.bold(question)).lower().strip()
+ except EOFError:
+ continue
+
+
+ if (not user_input and default_value) or user_input == default_value:
+ if default_value == 'q':
+ return False, default_value
+ else:
+ return True, default_value
+
+ #print user_input
+ if user_input == 'q':
+ return False, user_input
+
+ if user_input in choices:
+ return True, user_input
+
+ log.error("Please enter %s or press <enter> for the default of '%s'." %
+ (', '.join(["'%s'" % x for x in choices]), default_value))
+
+
+def title(text):
+ log.info("")
+ log.info("")
+ log.info(log.bold(text))
+ log.info(log.bold("-"*len(text)))
+
+
+def header(text):
+ c = len(text)
+ log.info("")
+ log.info("-"*(c+4))
+ log.info("| "+text+" |")
+ log.info("-"*(c+4))
+ log.info("")
+
+
+def load_paper_prompt():
+ return continue_prompt("A page will be printed.\nPlease load plain paper into the printer.")
+
+
+def load_scanner_for_align_prompt():
+ return continue_prompt("Load the alignment page on the scanner bed and push the 'Scan' or 'Enter' button on the printer to complete the alignment.")
+
+def load_photo_paper_prompt():
+ return continue_prompt("A page will be printed.\nPlease load HP Advanced Photo Paper - Glossy into the printer.")
+
+
+def continue_prompt(prompt=''):
+ while True:
+ try:
+ x = raw_input(log.bold(prompt + " Press <enter> to continue or 'q' to quit: ")).lower().strip()
+ except EOFError:
+ continue
+
+ if not x:
+ return True
+
+ elif x == 'q':
+ return False
+
+ log.error("Please press <enter> or enter 'q' to quit.")
+
+
+def enter_regex(regex, prompt, pattern, default_value=None):
+ re_obj = re.compile(regex)
+ while True:
+ try:
+ x = raw_input(log.bold(prompt))
+ except EOFError:
+ continue
+
+ if not x and default_value is not None:
+ return default_value, x
+
+ elif x == 'q':
+ return False, default_value
+
+ match = re_obj.search(x)
+
+ if not match:
+ log.error("Incorrect input. Please enter correct input.")
+ continue
+
+ return True, x
+
+
+def ttysize():
+ try:
+ import commands # TODO: Replace with subprocess (commands is deprecated in Python 3.0)
+ ln1 = commands.getoutput('stty -a').splitlines()[0]
+ vals = {'rows':None, 'columns':None}
+ for ph in ln1.split(';'):
+ x = ph.split()
+ if len(x) == 2:
+ vals[x[0]] = x[1]
+ vals[x[1]] = x[0]
+ return int(vals['rows']), int(vals['columns'])
+ except TypeError:
+ return 40, 64
+
+
+class ProgressMeter(object):
+ def __init__(self, prompt="Progress:"):
+ self.progress = 0
+ self.prompt = prompt
+ self.prev_length = 0
+ self.spinner = "\|/-\|/-*"
+ self.spinner_pos = 0
+ self.max_size = ttysize()[1] - len(prompt) - 25
+ self.update(0)
+
+ def update(self, progress, msg=''): # progress in %
+ self.progress = progress
+
+ x = self.progress * self.max_size / 100
+ if x > self.max_size: x = self.max_size
+
+ if self.progress >= 100:
+ self.spinner_pos = 8
+ self.progress = 100
+
+ sys.stdout.write("\b" * self.prev_length)
+
+ y = "%s [%s%s%s] %d%% %s " % \
+ (self.prompt, '*'*(x-1), self.spinner[self.spinner_pos],
+ ' '*(self.max_size-x), self.progress, msg)
+
+ sys.stdout.write(y)
+
+ sys.stdout.flush()
+ self.prev_length = len(y)
+ self.spinner_pos = (self.spinner_pos + 1) % 8
+
+
+
+class Formatter(object):
+ def __init__(self, margin=2, header=None, min_widths=None, max_widths=None):
+ self.margin = margin # int
+ self.header = header # tuple of strings
+ self.rows = [] # list of tuples
+ self.max_widths = max_widths # tuple of ints
+ self.min_widths = min_widths # tuple of ints
+
+
+ def add(self, row_data): # tuple of strings
+ self.rows.append(row_data)
+
+
+ def output(self):
+ if self.rows:
+ num_cols = len(self.rows[0])
+ for r in self.rows:
+ if len(r) != num_cols:
+ log.error("Invalid number of items in row: %s" % r)
+ return
+
+ if len(self.header) != num_cols:
+ log.error("Invalid number of items in header.")
+
+ min_calc_widths = []
+ for c in self.header:
+ header_parts = c.split(' ')
+ max_width = 0
+ for x in header_parts:
+ max_width = max(max_width, len(x))
+
+ min_calc_widths.append(max_width)
+
+ max_calc_widths = []
+ for x, c in enumerate(self.header):
+ max_width = 0
+ for r in self.rows:
+ max_width = max(max_width, len(r[x]))
+
+ max_calc_widths.append(max_width)
+
+ max_screen_width = None
+
+ if self.max_widths is None:
+ max_screen_width = ttysize()[1]
+ def_max = 8*(max_screen_width/num_cols)/10
+ self.max_widths = []
+ for c in self.header:
+ self.max_widths.append(def_max)
+ else:
+ if len(self.max_widths) != num_cols:
+ log.error("Invalid number of items in max col widths.")
+
+ if self.min_widths is None:
+ if max_screen_width is None:
+ max_screen_width = ttysize()[1]
+ def_min = 4*(max_screen_width/num_cols)/10
+ self.min_widths = []
+ for c in self.header:
+ self.min_widths.append(def_min)
+ else:
+ if len(self.min_widths) != num_cols:
+ log.error("Invalid number of items in min col widths.")
+
+ col_widths = []
+ formats = []
+ for m1, m2, m3, m4 in zip(self.min_widths, min_calc_widths,
+ self.max_widths, max_calc_widths):
+ col_width = max(max(m1, m2), min(m3, m4))
+ col_widths.append(col_width)
+ formats.append({'width': col_width, 'margin': self.margin})
+
+ formatter = utils.TextFormatter(tuple(formats))
+
+ log.info(formatter.compose(self.header))
+
+ sep = []
+ for c in col_widths:
+ sep.append('-'*c)
+
+ log.info(formatter.compose(tuple(sep)))
+
+ for r in self.rows:
+ log.info(formatter.compose(r))
+
+ else:
+ log.error("No data rows")
+
+
+
+ALIGN_LEFT = 0
+ALIGN_CENTER = 1
+ALIGN_RIGHT = 2
+
+
+def align(line, width=70, alignment=ALIGN_LEFT):
+ space = width - len(line)
+
+ if alignment == ALIGN_CENTER:
+ return ' '*(space/2) + line + \
+ ' '*(space/2 + space%2)
+
+ elif alignment == ALIGN_RIGHT:
+ return ' '*space + line
+
+ else:
+ return line + ' '*space
+
+
+def format_paragraph(paragraph, width=None, alignment=ALIGN_LEFT):
+ if width is None:
+ width = ttysize()[1]
+
+ result = []
+ words = paragraph.split()
+ try:
+ current, words = words[0], words[1:]
+ except IndexError:
+ return [paragraph]
+
+ for word in words:
+ increment = 1 + len(word)
+
+ if len(current) + increment > width:
+ result.append(align(current, width, alignment))
+ current = word
+
+ else:
+ current = current+" "+word
+
+ result.append(align(current, width, alignment))
+ return result
+
+
+def printer_table(printers):
+ header("SELECT PRINTER")
+ last_used_printer_name = user_conf.get('last_used', 'printer_name')
+ ret = None
+
+ table = Formatter(header=('Num', 'CUPS Printer'),
+ max_widths=(8, 100), min_widths=(8, 20))
+
+ default_index = None
+ for x, _ in enumerate(printers):
+ if last_used_printer_name == printers[x]:
+ table.add((str(x) + '*', printers[x]))
+ default_index = x
+ else:
+ table.add((str(x), printers[x]))
+
+ table.output()
+
+ if default_index is not None:
+ ok, i = enter_range("\nEnter number 0...%d for printer (q=quit, <enter>=default: *%d) ?" % (x, default_index),
+ 0, x, default_index)
+ else:
+ ok, i = enter_range("\nEnter number 0...%d for printer (q=quit) ?" % x, 0, x)
+
+ if ok:
+ ret = printers[i]
+
+ return ret
+
+
+def device_table(devices, scan_flag=False):
+ header("SELECT DEVICE")
+ last_used_device_uri = user_conf.get('last_used', 'device_uri')
+ ret = None
+
+ if scan_flag:
+ table = Formatter(header=('Num', 'Scan device URI'),
+ max_widths=(8, 100), min_widths=(8, 12))
+ else:
+ table = Formatter(header=('Num', 'Device URI', 'CUPS Printer(s)'),
+ max_widths=(8, 100, 100), min_widths=(8, 12, 12))
+
+ default_index = None
+ device_index = {}
+ for x, d in enumerate(devices):
+ device_index[x] = d
+ if last_used_device_uri == d:
+ if scan_flag:
+ table.add((str(x) + "*", d))
+ else:
+ table.add((str(x) + "*", d, ','.join(devices[d])))
+ default_index = x
+ else:
+ if scan_flag:
+ table.add((str(x), d))
+ else:
+ table.add((str(x), d, ','.join(devices[d])))
+
+ table.output()
+
+ if default_index is not None:
+ ok, i = enter_range("\nEnter number 0...%d for device (q=quit, <enter>=default: %d*) ?" % (x, default_index),
+ 0, x, default_index)
+ else:
+ ok, i = enter_range("\nEnter number 0...%d for device (q=quit) ?" % x, 0, x)
+
+ if ok:
+ ret = device_index[i]
+
+ return ret
+
+
+def connection_table():
+ ret, ios, x = None, {0: ('usb', "Universal Serial Bus (USB)") }, 1
+
+ if prop.net_build:
+ ios[x] = ('net', "Network/Ethernet/Wireless (direct connection or JetDirect)")
+ x += 1
+
+ if prop.par_build:
+ ios[x] = ('par', "Parallel Port (LPT:)")
+ x += 1
+
+ if len(ios) > 1:
+ header("SELECT CONNECTION (I/O) TYPE")
+
+ table = Formatter(header=('Num', 'Connection Type', 'Description'),
+ max_widths=(8, 20, 80), min_widths=(8, 10, 40))
+
+ for x, data in ios.items():
+ if x == 0:
+ table.add((str(x) + "*", data[0], data[1]))
+ else:
+ table.add((str(x), data[0], data[1]))
+
+ table.output()
+
+ ok, val = enter_range("\nEnter number 0...%d for connection type (q=quit, enter=usb*) ? " % x,
+ 0, x, 0)
+
+ if ok:
+ ret = [ios[val][0]]
+
+ else:
+ ret = ['usb']
+
+ return ret
+
diff --git a/base/utils.py b/base/utils.py
new file mode 100644
index 0000000..ae22c5c
--- /dev/null
+++ b/base/utils.py
@@ -0,0 +1,1871 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2001-2009 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch, Naga Samrat Chowdary Narla, Goutam Kodu, Amarnath Chitumalla
+#
+# Thanks to Henrique M. Holschuh <hmh@debian.org> for various security patches
+#
+
+from __future__ import generators
+
+# Std Lib
+import sys
+import os
+from subprocess import Popen, PIPE
+import grp
+import fnmatch
+import tempfile
+import socket
+import struct
+import select
+import time
+import fcntl
+import errno
+import stat
+import string
+import commands # TODO: Replace with subprocess (commands is deprecated in Python 3.0)
+import cStringIO
+import re
+import xml.parsers.expat as expat
+import getpass
+import locale
+import htmlentitydefs
+import urllib
+
+try:
+ import platform
+ platform_avail = True
+except ImportError:
+ platform_avail = False
+
+# Local
+from g import *
+from codes import *
+import pexpect
+
+BIG_ENDIAN = 0
+LITTLE_ENDIAN = 1
+
+def addgroup():
+ lis = []
+ try:
+ fp=open('/etc/cups/cupsd.conf')
+ except IOError:
+ try:
+ if "root" != grp.getgrgid(os.stat('/etc/cups/cupsd.conf').st_gid).gr_name:
+ return [grp.getgrgid(os.stat('/etc/cups/cupsd.conf').st_gid).gr_name]
+ except OSError:
+ return lis
+
+ try:
+ lis = ((re.findall('SystemGroup [\w* ]*',fp.read()))[0].replace('SystemGroup ','')).split(' ')
+ except IndexError:
+ return lis
+
+ if 'root' in lis:
+ lis.remove('root')
+ fp.close()
+ return lis
+
+def list_to_string(lis):
+ if len(lis) == 0:
+ return ""
+ if len(lis) == 1:
+ return str("\""+lis[0]+"\"")
+ if len(lis) >= 1:
+ return "\""+"\", \"".join(lis)+"\" and \""+str(lis.pop())+"\""
+
+def lock(f):
+ log.debug("Locking: %s" % f.name)
+ try:
+ fcntl.flock(f.fileno(), fcntl.LOCK_EX | fcntl.LOCK_NB)
+ return True
+ except (IOError, OSError):
+ log.debug("Failed to unlock %s." % f.name)
+ return False
+
+
+def unlock(f):
+ if f is not None:
+ log.debug("Unlocking: %s" % f.name)
+ try:
+ fcntl.flock(f.fileno(), fcntl.LOCK_UN)
+ os.remove(f.name)
+ except (IOError, OSError):
+ pass
+
+
+def lock_app(application, suppress_error=False):
+ dir = prop.user_dir
+ if os.geteuid() == 0:
+ dir = '/var'
+
+ elif not os.path.exists(dir):
+ os.makedirs(dir)
+
+ lock_file = os.path.join(dir, '.'.join([application, 'lock']))
+ try:
+ lock_file_f = open(lock_file, "w")
+ except IOError:
+ if not suppress_error:
+ log.error("Unable to open %s lock file." % lock_file)
+ return False, None
+
+ #log.debug("Locking file: %s" % lock_file)
+
+ if not lock(lock_file_f):
+ if not suppress_error:
+ log.error("Unable to lock %s. Is %s already running?" % (lock_file, application))
+ return False, None
+
+ return True, lock_file_f
+
+
+#xml_basename_pat = re.compile(r"""HPLIP-(\d*)_(\d*)_(\d*).xml""", re.IGNORECASE)
+
+
+def Translator(frm='', to='', delete='', keep=None):
+ allchars = string.maketrans('','')
+
+ if len(to) == 1:
+ to = to * len(frm)
+ trans = string.maketrans(frm, to)
+
+ if keep is not None:
+ delete = allchars.translate(allchars, keep.translate(allchars, delete))
+
+ def callable(s):
+ return s.translate(trans, delete)
+
+ return callable
+
+
+def to_bool_str(s, default='0'):
+ """ Convert an arbitrary 0/1/T/F/Y/N string to a normalized string 0/1."""
+ if isinstance(s, str) and s:
+ if s[0].lower() in ['1', 't', 'y']:
+ return u'1'
+ elif s[0].lower() in ['0', 'f', 'n']:
+ return u'0'
+
+ return default
+
+def to_bool(s, default=False):
+ """ Convert an arbitrary 0/1/T/F/Y/N string to a boolean True/False value."""
+ if isinstance(s, str) and s:
+ if s[0].lower() in ['1', 't', 'y']:
+ return True
+ elif s[0].lower() in ['0', 'f', 'n']:
+ return False
+ elif isinstance(s, bool):
+ return s
+
+ return default
+
+
+def walkFiles(root, recurse=True, abs_paths=False, return_folders=False, pattern='*', path=None):
+ if path is None:
+ path = root
+
+ try:
+ names = os.listdir(root)
+ except os.error:
+ raise StopIteration
+
+ pattern = pattern or '*'
+ pat_list = pattern.split(';')
+
+ for name in names:
+ fullname = os.path.normpath(os.path.join(root, name))
+
+ for pat in pat_list:
+ if fnmatch.fnmatch(name, pat):
+ if return_folders or not os.path.isdir(fullname):
+ if abs_paths:
+ yield fullname
+ else:
+ try:
+ yield os.path.basename(fullname)
+ except ValueError:
+ yield fullname
+
+ #if os.path.islink(fullname):
+ # fullname = os.path.realpath(os.readlink(fullname))
+
+ if recurse and os.path.isdir(fullname): # or os.path.islink(fullname):
+ for f in walkFiles(fullname, recurse, abs_paths, return_folders, pattern, path):
+ yield f
+
+
+def is_path_writable(path):
+ if os.path.exists(path):
+ s = os.stat(path)
+ mode = s[stat.ST_MODE] & 0777
+
+ if mode & 02:
+ return True
+ elif s[stat.ST_GID] == os.getgid() and mode & 020:
+ return True
+ elif s[stat.ST_UID] == os.getuid() and mode & 0200:
+ return True
+
+ return False
+
+
+# Provides the TextFormatter class for formatting text into columns.
+# Original Author: Hamish B Lawson, 1999
+# Modified by: Don Welch, 2003
+class TextFormatter:
+
+ LEFT = 0
+ CENTER = 1
+ RIGHT = 2
+
+ def __init__(self, colspeclist):
+ self.columns = []
+ for colspec in colspeclist:
+ self.columns.append(Column(**colspec))
+
+ def compose(self, textlist, add_newline=False):
+ numlines = 0
+ textlist = list(textlist)
+ if len(textlist) != len(self.columns):
+ log.error("Formatter: Number of text items does not match columns")
+ return
+ for text, column in map(None, textlist, self.columns):
+ column.wrap(text)
+ numlines = max(numlines, len(column.lines))
+ complines = [''] * numlines
+ for ln in range(numlines):
+ for column in self.columns:
+ complines[ln] = complines[ln] + column.getline(ln)
+ if add_newline:
+ return '\n'.join(complines) + '\n'
+ else:
+ return '\n'.join(complines)
+
+class Column:
+
+ def __init__(self, width=78, alignment=TextFormatter.LEFT, margin=0):
+ self.width = width
+ self.alignment = alignment
+ self.margin = margin
+ self.lines = []
+
+ def align(self, line):
+ if self.alignment == TextFormatter.CENTER:
+ return line.center(self.width)
+ elif self.alignment == TextFormatter.RIGHT:
+ return line.rjust(self.width)
+ else:
+ return line.ljust(self.width)
+
+ def wrap(self, text):
+ self.lines = []
+ words = []
+ for word in text.split():
+ if word <= self.width:
+ words.append(word)
+ else:
+ for i in range(0, len(word), self.width):
+ words.append(word[i:i+self.width])
+ if not len(words): return
+ current = words.pop(0)
+ for word in words:
+ increment = 1 + len(word)
+ if len(current) + increment > self.width:
+ self.lines.append(self.align(current))
+ current = word
+ else:
+ current = current + ' ' + word
+ self.lines.append(self.align(current))
+
+ def getline(self, index):
+ if index < len(self.lines):
+ return ' '*self.margin + self.lines[index]
+ else:
+ return ' ' * (self.margin + self.width)
+
+
+
+class Stack:
+ def __init__(self):
+ self.stack = []
+
+ def pop(self):
+ return self.stack.pop()
+
+ def push(self, value):
+ self.stack.append(value)
+
+ def as_list(self):
+ return self.stack
+
+ def clear(self):
+ self.stack = []
+
+ def __len__(self):
+ return len(self.stack)
+
+
+
+class Queue(Stack):
+ def __init__(self):
+ Stack.__init__(self)
+
+ def get(self):
+ return self.stack.pop(0)
+
+ def put(self, value):
+ Stack.push(self, value)
+
+
+
+# RingBuffer class
+# Source: Python Cookbook 1st Ed., sec. 5.18, pg. 201
+# Credit: Sebastien Keim
+# License: Modified BSD
+class RingBuffer:
+ def __init__(self, size_max=50):
+ self.max = size_max
+ self.data = []
+
+ def append(self,x):
+ """append an element at the end of the buffer"""
+ self.data.append(x)
+
+ if len(self.data) == self.max:
+ self.cur = 0
+ self.__class__ = RingBufferFull
+
+ def replace(self, x):
+ """replace the last element instead off appending"""
+ self.data[-1] = x
+
+ def get(self):
+ """ return a list of elements from the oldest to the newest"""
+ return self.data
+
+
+class RingBufferFull:
+ def __init__(self, n):
+ #raise "you should use RingBuffer"
+ pass
+
+ def append(self, x):
+ self.data[self.cur] = x
+ self.cur = (self.cur+1) % self.max
+
+ def replace(self, x):
+ # back up 1 position to previous location
+ self.cur = (self.cur-1) % self.max
+ self.data[self.cur] = x
+ # setup for next item
+ self.cur = (self.cur+1) % self.max
+
+ def get(self):
+ return self.data[self.cur:] + self.data[:self.cur]
+
+
+
+def sort_dict_by_value(d):
+ """ Returns the keys of dictionary d sorted by their values """
+ items=d.items()
+ backitems=[[v[1],v[0]] for v in items]
+ backitems.sort()
+ return [backitems[i][1] for i in range(0, len(backitems))]
+
+
+def commafy(val):
+ return unicode(locale.format("%d", val, grouping=True))
+
+
+def format_bytes(s, show_bytes=False):
+ if s < 1024:
+ return ''.join([commafy(s), ' B'])
+ elif 1024 < s < 1048576:
+ if show_bytes:
+ return ''.join([unicode(round(s/1024.0, 1)) , u' KB (', commafy(s), ')'])
+ else:
+ return ''.join([unicode(round(s/1024.0, 1)) , u' KB'])
+ elif 1048576 < s < 1073741824:
+ if show_bytes:
+ return ''.join([unicode(round(s/1048576.0, 1)), u' MB (', commafy(s), ')'])
+ else:
+ return ''.join([unicode(round(s/1048576.0, 1)), u' MB'])
+ else:
+ if show_bytes:
+ return ''.join([unicode(round(s/1073741824.0, 1)), u' GB (', commafy(s), ')'])
+ else:
+ return ''.join([unicode(round(s/1073741824.0, 1)), u' GB'])
+
+
+
+try:
+ make_temp_file = tempfile.mkstemp # 2.3+
+except AttributeError:
+ def make_temp_file(suffix='', prefix='', dir='', text=False): # pre-2.3
+ path = tempfile.mktemp(suffix)
+ fd = os.open(path, os.O_RDWR|os.O_CREAT|os.O_EXCL, 0700)
+ return ( os.fdopen( fd, 'w+b' ), path )
+
+
+
+def which(command, return_full_path=False):
+ path = os.getenv('PATH').split(':')
+
+ # Add these paths for Fedora
+ path.append('/sbin')
+ path.append('/usr/sbin')
+ path.append('/usr/local/sbin')
+
+ found_path = ''
+ for p in path:
+ try:
+ files = os.listdir(p)
+ except OSError:
+ continue
+ else:
+ if command in files:
+ found_path = p
+ break
+
+ if return_full_path:
+ if found_path:
+ return os.path.join(found_path, command)
+ else:
+ return ''
+ else:
+ return found_path
+
+
+class UserSettings(object): # Note: Deprecated after 2.8.8 in Qt4 (see ui4/ui_utils.py)
+ def __init__(self):
+ self.load()
+
+ def loadDefaults(self):
+ # Print
+ self.cmd_print = ''
+ path = which('hp-print')
+
+ if len(path) > 0:
+ self.cmd_print = 'hp-print -p%PRINTER%'
+ else:
+ path = which('kprinter')
+ if len(path) > 0:
+ self.cmd_print = 'kprinter -P%PRINTER% --system cups'
+ else:
+ path = which('gtklp')
+ if len(path) > 0:
+ self.cmd_print = 'gtklp -P%PRINTER%'
+ else:
+ path = which('xpp')
+ if len(path) > 0:
+ self.cmd_print = 'xpp -P%PRINTER%'
+
+ # Scan
+ self.cmd_scan = ''
+ path = which('xsane')
+
+ if len(path) > 0:
+ self.cmd_scan = 'xsane -V %SANE_URI%'
+ else:
+ path = which('kooka')
+ if len(path) > 0:
+ self.cmd_scan = 'kooka'
+ else:
+ path = which('xscanimage')
+ if len(path) > 0:
+ self.cmd_scan = 'xscanimage'
+
+ # Photo Card
+ path = which('hp-unload')
+
+ if len(path):
+ self.cmd_pcard = 'hp-unload -d %DEVICE_URI%'
+ else:
+ self.cmd_pcard = 'python %HOME%/unload.py -d %DEVICE_URI%'
+
+ # Copy
+ path = which('hp-makecopies')
+
+ if len(path):
+ self.cmd_copy = 'hp-makecopies -d %DEVICE_URI%'
+ else:
+ self.cmd_copy = 'python %HOME%/makecopies.py -d %DEVICE_URI%'
+
+ # Fax
+ path = which('hp-sendfax')
+
+ if len(path):
+ self.cmd_fax = 'hp-sendfax -d %FAX_URI%'
+ else:
+ self.cmd_fax = 'python %HOME%/sendfax.py -d %FAX_URI%'
+
+ # Fax Address Book
+ path = which('hp-fab')
+
+ if len(path):
+ self.cmd_fab = 'hp-fab'
+ else:
+ self.cmd_fab = 'python %HOME%/fab.py'
+
+ def load(self):
+ self.loadDefaults()
+ log.debug("Loading user settings...")
+ self.auto_refresh = to_bool(user_conf.get('refresh', 'enable', '0'))
+
+ try:
+ self.auto_refresh_rate = int(user_conf.get('refresh', 'rate', '30'))
+ except ValueError:
+ self.auto_refresh_rate = 30 # (secs)
+
+ try:
+ self.auto_refresh_type = int(user_conf.get('refresh', 'type', '0'))
+ except ValueError:
+ self.auto_refresh_type = 0 # refresh 1 (1=refresh all)
+
+ self.cmd_print = user_conf.get('commands', 'prnt', self.cmd_print)
+ self.cmd_scan = user_conf.get('commands', 'scan', self.cmd_scan)
+ self.cmd_pcard = user_conf.get('commands', 'pcard', self.cmd_pcard)
+ self.cmd_copy = user_conf.get('commands', 'cpy', self.cmd_copy)
+ self.cmd_fax = user_conf.get('commands', 'fax', self.cmd_fax)
+ self.cmd_fab = user_conf.get('commands', 'fab', self.cmd_fab)
+
+ self.upgrade_notify= to_bool(user_conf.get('upgrade', 'notify_upgrade', '0'))
+ self.upgrade_last_update_time = int(user_conf.get('upgrade','last_upgraded_time', '0'))
+ self.upgrade_pending_update_time =int(user_conf.get('upgrade', 'pending_upgrade_time', '0'))
+ self.latest_available_version=str(user_conf.get('upgrade', 'latest_available_version',''))
+ self.debug()
+
+ def debug(self):
+ log.debug("Print command: %s" % self.cmd_print)
+ log.debug("PCard command: %s" % self.cmd_pcard)
+ log.debug("Fax command: %s" % self.cmd_fax)
+ log.debug("FAB command: %s" % self.cmd_fab)
+ log.debug("Copy command: %s " % self.cmd_copy)
+ log.debug("Scan command: %s" % self.cmd_scan)
+ log.debug("Auto refresh: %s" % self.auto_refresh)
+ log.debug("Auto refresh rate: %s" % self.auto_refresh_rate)
+ log.debug("Auto refresh type: %s" % self.auto_refresh_type)
+ log.debug("Upgrade notification:%d" %self.upgrade_notify)
+ log.debug("Last Installed time:%d" %self.upgrade_last_update_time)
+ log.debug("Next scheduled installation time:%d" % self.upgrade_pending_update_time)
+
+
+ def save(self):
+ log.debug("Saving user settings...")
+ user_conf.set('commands', 'prnt', self.cmd_print)
+ user_conf.set('commands', 'pcard', self.cmd_pcard)
+ user_conf.set('commands', 'fax', self.cmd_fax)
+ user_conf.set('commands', 'scan', self.cmd_scan)
+ user_conf.set('commands', 'cpy', self.cmd_copy)
+ user_conf.set('refresh', 'enable',self.auto_refresh)
+ user_conf.set('refresh', 'rate', self.auto_refresh_rate)
+ user_conf.set('refresh', 'type', self.auto_refresh_type)
+ user_conf.set('upgrade', 'notify_upgrade', self.upgrade_notify)
+ user_conf.set('upgrade','last_upgraded_time', self.upgrade_last_update_time)
+ user_conf.set('upgrade', 'pending_upgrade_time', self.upgrade_pending_update_time)
+ user_conf.set('upgrade', 'latest_available_version', self.latest_available_version)
+
+ self.debug()
+
+
+
+def no_qt_message_gtk():
+ try:
+ import gtk
+ w = gtk.Window()
+ dialog = gtk.MessageDialog(w, gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
+ gtk.MESSAGE_WARNING, gtk.BUTTONS_OK,
+ "PyQt not installed. GUI not available. Please check that the PyQt package is installed. Exiting.")
+ dialog.run()
+ dialog.destroy()
+
+ except ImportError:
+ log.error("PyQt not installed. GUI not available. Please check that the PyQt package is installed. Exiting.")
+
+
+def canEnterGUIMode(): # qt3
+ if not prop.gui_build:
+ log.warn("GUI mode disabled in build.")
+ return False
+
+ elif not os.getenv('DISPLAY'):
+ log.warn("No display found.")
+ return False
+
+ elif not checkPyQtImport():
+ log.warn("Qt/PyQt 3 initialization failed.")
+ return False
+
+ return True
+
+
+def canEnterGUIMode4(): # qt4
+ if not prop.gui_build:
+ log.warn("GUI mode disabled in build.")
+ return False
+
+ elif not os.getenv('DISPLAY'):
+ log.warn("No display found.")
+ return False
+
+ elif not checkPyQtImport4():
+ log.warn("Qt/PyQt 4 initialization failed.")
+ return False
+
+ return True
+
+
+def checkPyQtImport(): # qt3
+ # PyQt
+ try:
+ import qt
+ except ImportError:
+ if os.getenv('DISPLAY') and os.getenv('STARTED_FROM_MENU'):
+ no_qt_message_gtk()
+
+ log.error("PyQt not installed. GUI not available. Exiting.")
+ return False
+
+ # check version of Qt
+ qtMajor = int(qt.qVersion().split('.')[0])
+
+ if qtMajor < MINIMUM_QT_MAJOR_VER:
+
+ log.error("Incorrect version of Qt installed. Ver. 3.0.0 or greater required.")
+ return False
+
+ #check version of PyQt
+ try:
+ pyqtVersion = qt.PYQT_VERSION_STR
+ except AttributeError:
+ pyqtVersion = qt.PYQT_VERSION
+
+ while pyqtVersion.count('.') < 2:
+ pyqtVersion += '.0'
+
+ (maj_ver, min_ver, pat_ver) = pyqtVersion.split('.')
+
+ if pyqtVersion.find('snapshot') >= 0:
+ log.warning("A non-stable snapshot version of PyQt is installed.")
+ else:
+ try:
+ maj_ver = int(maj_ver)
+ min_ver = int(min_ver)
+ pat_ver = int(pat_ver)
+ except ValueError:
+ maj_ver, min_ver, pat_ver = 0, 0, 0
+
+ if maj_ver < MINIMUM_PYQT_MAJOR_VER or \
+ (maj_ver == MINIMUM_PYQT_MAJOR_VER and min_ver < MINIMUM_PYQT_MINOR_VER):
+ log.error("This program may not function properly with the version of PyQt that is installed (%d.%d.%d)." % (maj_ver, min_ver, pat_ver))
+ log.error("Incorrect version of pyQt installed. Ver. %d.%d or greater required." % (MINIMUM_PYQT_MAJOR_VER, MINIMUM_PYQT_MINOR_VER))
+ log.error("This program will continue, but you may experience errors, crashes or other problems.")
+ return True
+
+ return True
+
+
+def checkPyQtImport4():
+ try:
+ import PyQt4
+ except ImportError:
+ return False
+ else:
+ return True
+
+
+try:
+ from string import Template # will fail in Python <= 2.3
+except ImportError:
+ # Code from Python 2.4 string.py
+ #import re as _re
+
+ class _multimap:
+ """Helper class for combining multiple mappings.
+
+ Used by .{safe_,}substitute() to combine the mapping and keyword
+ arguments.
+ """
+ def __init__(self, primary, secondary):
+ self._primary = primary
+ self._secondary = secondary
+
+ def __getitem__(self, key):
+ try:
+ return self._primary[key]
+ except KeyError:
+ return self._secondary[key]
+
+
+ class _TemplateMetaclass(type):
+ pattern = r"""
+ %(delim)s(?:
+ (?P<escaped>%(delim)s) | # Escape sequence of two delimiters
+ (?P<named>%(id)s) | # delimiter and a Python identifier
+ {(?P<braced>%(id)s)} | # delimiter and a braced identifier
+ (?P<invalid>) # Other ill-formed delimiter exprs
+ )
+ """
+
+ def __init__(cls, name, bases, dct):
+ super(_TemplateMetaclass, cls).__init__(name, bases, dct)
+ if 'pattern' in dct:
+ pattern = cls.pattern
+ else:
+ pattern = _TemplateMetaclass.pattern % {
+ 'delim' : re.escape(cls.delimiter),
+ 'id' : cls.idpattern,
+ }
+ cls.pattern = re.compile(pattern, re.IGNORECASE | re.VERBOSE)
+
+
+ class Template:
+ """A string class for supporting $-substitutions."""
+ __metaclass__ = _TemplateMetaclass
+
+ delimiter = '$'
+ idpattern = r'[_a-z][_a-z0-9]*'
+
+ def __init__(self, template):
+ self.template = template
+
+ # Search for $$, $identifier, ${identifier}, and any bare $'s
+ def _invalid(self, mo):
+ i = mo.start('invalid')
+ lines = self.template[:i].splitlines(True)
+ if not lines:
+ colno = 1
+ lineno = 1
+ else:
+ colno = i - len(''.join(lines[:-1]))
+ lineno = len(lines)
+ raise ValueError('Invalid placeholder in string: line %d, col %d' %
+ (lineno, colno))
+
+ def substitute(self, *args, **kws):
+ if len(args) > 1:
+ raise TypeError('Too many positional arguments')
+ if not args:
+ mapping = kws
+ elif kws:
+ mapping = _multimap(kws, args[0])
+ else:
+ mapping = args[0]
+ # Helper function for .sub()
+ def convert(mo):
+ # Check the most common path first.
+ named = mo.group('named') or mo.group('braced')
+ if named is not None:
+ val = mapping[named]
+ # We use this idiom instead of str() because the latter will
+ # fail if val is a Unicode containing non-ASCII characters.
+ return '%s' % val
+ if mo.group('escaped') is not None:
+ return self.delimiter
+ if mo.group('invalid') is not None:
+ self._invalid(mo)
+ raise ValueError('Unrecognized named group in pattern',
+ self.pattern)
+ return self.pattern.sub(convert, self.template)
+
+
+ def safe_substitute(self, *args, **kws):
+ if len(args) > 1:
+ raise TypeError('Too many positional arguments')
+ if not args:
+ mapping = kws
+ elif kws:
+ mapping = _multimap(kws, args[0])
+ else:
+ mapping = args[0]
+ # Helper function for .sub()
+ def convert(mo):
+ named = mo.group('named')
+ if named is not None:
+ try:
+ # We use this idiom instead of str() because the latter
+ # will fail if val is a Unicode containing non-ASCII
+ return '%s' % mapping[named]
+ except KeyError:
+ return self.delimiter + named
+ braced = mo.group('braced')
+ if braced is not None:
+ try:
+ return '%s' % mapping[braced]
+ except KeyError:
+ return self.delimiter + '{' + braced + '}'
+ if mo.group('escaped') is not None:
+ return self.delimiter
+ if mo.group('invalid') is not None:
+ return self.delimiter
+ raise ValueError('Unrecognized named group in pattern',
+ self.pattern)
+ return self.pattern.sub(convert, self.template)
+
+
+
+#cat = lambda _ : Template(_).substitute(sys._getframe(1).f_globals, **sys._getframe(1).f_locals)
+
+def cat(s):
+ globals = sys._getframe(1).f_globals.copy()
+ if 'self' in globals:
+ del globals['self']
+
+ locals = sys._getframe(1).f_locals.copy()
+ if 'self' in locals:
+ del locals['self']
+
+ return Template(s).substitute(sys._getframe(1).f_globals, **locals)
+
+
+identity = string.maketrans('','')
+unprintable = identity.translate(identity, string.printable)
+
+
+def printable(s):
+ return s.translate(identity, unprintable)
+
+
+def any(S,f=lambda x:x):
+ for x in S:
+ if f(x): return True
+ return False
+
+
+def all(S,f=lambda x:x):
+ for x in S:
+ if not f(x): return False
+ return True
+
+
+BROWSERS = ['firefox', 'mozilla', 'konqueror', 'galeon', 'skipstone'] # in preferred order
+BROWSER_OPTS = {'firefox': '-new-window', 'mozilla' : '', 'konqueror': '', 'galeon': '-w', 'skipstone': ''}
+
+
+def find_browser():
+ if platform_avail and platform.system() == 'Darwin':
+ return "open"
+ else:
+ for b in BROWSERS:
+ if which(b):
+ return b
+ else:
+ return None
+
+
+def openURL(url, use_browser_opts=True):
+ if platform_avail and platform.system() == 'Darwin':
+ cmd = 'open "%s"' % url
+ log.debug(cmd)
+ os.system(cmd)
+ else:
+ for b in BROWSERS:
+ bb = which(b)
+ if bb:
+ bb = os.path.join(bb, b)
+ if use_browser_opts:
+ cmd = """%s %s "%s" &""" % (bb, BROWSER_OPTS[b], url)
+ else:
+ cmd = """%s "%s" &""" % (bb, url)
+ log.debug(cmd)
+ os.system(cmd)
+ break
+ else:
+ log.warn("Unable to open URL: %s" % url)
+
+
+def uniqueList(input):
+ temp = []
+ [temp.append(i) for i in input if not temp.count(i)]
+ return temp
+
+
+def list_move_up(l, m, cmp=None):
+ if cmp is None:
+ f = lambda x: l[x] == m
+ else:
+ f = lambda x: cmp(l[x], m)
+
+ for i in range(1, len(l)):
+ if f(i):
+ l[i-1], l[i] = l[i], l[i-1]
+
+
+def list_move_down(l, m, cmp=None):
+ if cmp is None:
+ f = lambda x: l[x] == m
+ else:
+ f = lambda x: cmp(l[x], m)
+
+ for i in range(len(l)-2, -1, -1):
+ if f(i):
+ l[i], l[i+1] = l[i+1], l[i]
+
+
+
+class XMLToDictParser:
+ def __init__(self):
+ self.stack = []
+ self.data = {}
+ self.last_start = ''
+
+ def startElement(self, name, attrs):
+ #print "START:", name, attrs
+ self.stack.append(unicode(name).lower())
+ self.last_start = unicode(name).lower()
+
+ if len(attrs):
+ for a in attrs:
+ self.stack.append(unicode(a).lower())
+ self.addData(attrs[a])
+ self.stack.pop()
+
+ def endElement(self, name):
+ if name.lower() == self.last_start:
+ self.addData('')
+
+ #print "END:", name
+ self.stack.pop()
+
+ def charData(self, data):
+ data = unicode(data).strip()
+
+ if data and self.stack:
+ self.addData(data)
+
+ def addData(self, data):
+ #print "DATA:", data
+ self.last_start = ''
+ try:
+ data = int(data)
+ except ValueError:
+ data = unicode(data)
+
+ stack_str = '-'.join(self.stack)
+ stack_str_0 = '-'.join([stack_str, '0'])
+
+ try:
+ self.data[stack_str]
+ except KeyError:
+ try:
+ self.data[stack_str_0]
+ except KeyError:
+ self.data[stack_str] = data
+ else:
+ j = 2
+ while True:
+ try:
+ self.data['-'.join([stack_str, unicode(j)])]
+ except KeyError:
+ self.data['-'.join([stack_str, unicode(j)])] = data
+ break
+ j += 1
+
+ else:
+ self.data[stack_str_0] = self.data[stack_str]
+ self.data['-'.join([stack_str, '1'])] = data
+ del self.data[stack_str]
+
+
+ def parseXML(self, text):
+ parser = expat.ParserCreate()
+ parser.StartElementHandler = self.startElement
+ parser.EndElementHandler = self.endElement
+ parser.CharacterDataHandler = self.charData
+ parser.Parse(text.encode('utf-8'), True)
+ return self.data
+
+
+def dquote(s):
+ return ''.join(['"', s, '"'])
+
+
+# Python 2.2.x compatibility functions (strip() family with char argument added in Python 2.2.3)
+if sys.hexversion < 0x020203f0:
+ def xlstrip(s, chars=' '):
+ i = 0
+ for c, i in zip(s, range(len(s))):
+ if c not in chars:
+ break
+
+ return s[i:]
+
+ def xrstrip(s, chars=' '):
+ return xreverse(xlstrip(xreverse(s), chars))
+
+ def xreverse(s):
+ l = list(s)
+ l.reverse()
+ return ''.join(l)
+
+ def xstrip(s, chars=' '):
+ return xreverse(xlstrip(xreverse(xlstrip(s, chars)), chars))
+
+else:
+ xlstrip = string.lstrip
+ xrstrip = string.rstrip
+ xstrip = string.strip
+
+
+def getBitness():
+ if platform_avail:
+ return int(platform.architecture()[0][:-3])
+ else:
+ return struct.calcsize("P") << 3
+
+
+def getProcessor():
+ if platform_avail:
+ return platform.machine().replace(' ', '_').lower() # i386, i686, power_macintosh, etc.
+ else:
+ return "i686" # TODO: Need a fix here
+
+
+def getEndian():
+ if sys.byteorder == 'big':
+ return BIG_ENDIAN
+ else:
+ return LITTLE_ENDIAN
+
+
+def get_password():
+ return getpass.getpass("Enter password: ")
+
+def get_password_ui(pswd_msg=''):
+ fp = open("/etc/hp/hplip.conf", "r")
+ qt = "qt3"
+ for line in fp:
+ if string.find(line, "qt4") is not -1 and string.find(line, "yes") is not -1:
+ qt = "qt4"
+ fp.close()
+ if qt is "qt4":
+ from ui4.setupdialog import showPasswordUI
+ if pswd_msg == '':
+ username, password = showPasswordUI("Your HP Device requires to install HP proprietary plugin\nPlease enter root/superuser password to continue", "root", False)
+ else:
+ username, password = showPasswordUI(pswd_msg, "root", False)
+ if qt is "qt3":
+ from ui.setupform import showPasswordUI
+ if pswd_msg == '':
+ username, password = showPasswordUI("Your HP Device requires to install HP proprietary plugin\nPlease enter root/superuser password to continue", "root", False)
+ else:
+ username, password = showPasswordUI(pswd_msg, "root", False)
+ return password
+
+def run(cmd, log_output=True, password_func=get_password, timeout=1, spinner=True, pswd_msg=''):
+ output = cStringIO.StringIO()
+
+ try:
+ child = pexpect.spawn(cmd, timeout=timeout)
+ except pexpect.ExceptionPexpect:
+ return -1, ''
+
+ try:
+ while True:
+ if spinner:
+ update_spinner()
+
+ i = child.expect(["[pP]assword:", pexpect.EOF, pexpect.TIMEOUT])
+
+ if child.before:
+ output.write(child.before)
+ if log_output:
+ log.debug(child.before)
+
+ if i == 0: # Password:
+ if password_func is not None:
+ if password_func == "get_password_ui":
+ child.sendline(get_password_ui(pswd_msg))
+ else:
+ child.sendline(password_func())
+ else:
+ child.sendline(get_password())
+
+
+ elif i == 1: # EOF
+ break
+
+ elif i == 2: # TIMEOUT
+ continue
+
+
+ except Exception, e:
+ log.error("Exception: %s" % e)
+ if spinner:
+ cleanup_spinner()
+ child.close()
+
+ return child.exitstatus, output.getvalue()
+
+
+def expand_range(ns): # ns -> string repr. of numeric range, e.g. "1-4, 7, 9-12"
+ """Credit: Jean Brouwers, comp.lang.python 16-7-2004
+ Convert a string representation of a set of ranges into a
+ list of ints, e.g.
+ u"1-4, 7, 9-12" --> [1,2,3,4,7,9,10,11,12]
+ """
+ fs = []
+ for n in ns.split(u','):
+ n = n.strip()
+ r = n.split('-')
+ if len(r) == 2: # expand name with range
+ h = r[0].rstrip(u'0123456789') # header
+ r[0] = r[0][len(h):]
+ # range can't be empty
+ if not (r[0] and r[1]):
+ raise ValueError, 'empty range: ' + n
+ # handle leading zeros
+ if r[0] == u'0' or r[0][0] != u'0':
+ h += '%d'
+ else:
+ w = [len(i) for i in r]
+ if w[1] > w[0]:
+ raise ValueError, 'wide range: ' + n
+ h += u'%%0%dd' % max(w)
+ # check range
+ r = [int(i, 10) for i in r]
+ if r[0] > r[1]:
+ raise ValueError, 'bad range: ' + n
+ for i in range(r[0], r[1]+1):
+ fs.append(h % i)
+ else: # simple name
+ fs.append(n)
+
+ # remove duplicates
+ fs = dict([(n, i) for i, n in enumerate(fs)]).keys()
+ # convert to ints and sort
+ fs = [int(x) for x in fs if x]
+ fs.sort()
+
+ return fs
+
+
+def collapse_range(x): # x --> sorted list of ints
+ """ Convert a list of integers into a string
+ range representation:
+ [1,2,3,4,7,9,10,11,12] --> u"1-4,7,9-12"
+ """
+ if not x:
+ return ''
+
+ s, c, r = [str(x[0])], x[0], False
+
+ for i in x[1:]:
+ if i == (c+1):
+ r = True
+ else:
+ if r:
+ s.append(u'-%s,%s' % (c,i))
+ r = False
+ else:
+ s.append(u',%s' % i)
+
+ c = i
+
+ if r:
+ s.append(u'-%s' % i)
+
+ return ''.join(s)
+
+
+def createSequencedFilename(basename, ext, dir=None, digits=3):
+ if dir is None:
+ dir = os.getcwd()
+
+ m = 0
+ for f in walkFiles(dir, recurse=False, abs_paths=False, return_folders=False, pattern='*', path=None):
+ r, e = os.path.splitext(f)
+
+ if r.startswith(basename) and ext == e:
+ try:
+ i = int(r[len(basename):])
+ except ValueError:
+ continue
+ else:
+ m = max(m, i)
+
+ return os.path.join(dir, "%s%0*d%s" % (basename, digits, m+1, ext))
+
+
+def validate_language(lang, default='en_US'):
+ if lang is None:
+ loc, encoder = locale.getdefaultlocale()
+ else:
+ lang = lang.lower().strip()
+ for loc, ll in supported_locales.items():
+ if lang in ll:
+ break
+ else:
+ loc = 'en_US'
+ log.warn("Unknown lang/locale. Using default of %s." % loc)
+
+ return loc
+
+
+def gen_random_uuid():
+ try:
+ import uuid # requires Python 2.5+
+ return str(uuid.uuid4())
+
+ except ImportError:
+ uuidgen = which("uuidgen")
+ if uuidgen:
+ uuidgen = os.path.join(uuidgen, "uuidgen")
+ return commands.getoutput(uuidgen) # TODO: Replace with subprocess (commands is deprecated in Python 3.0)
+ else:
+ return ''
+
+
+class RestTableFormatter(object):
+ def __init__(self, header=None):
+ self.header = header # tuple of strings
+ self.rows = [] # list of tuples
+
+ def add(self, row_data): # tuple of strings
+ self.rows.append(row_data)
+
+ def output(self, w):
+ if self.rows:
+ num_cols = len(self.rows[0])
+ for r in self.rows:
+ if len(r) != num_cols:
+ log.error("Invalid number of items in row: %s" % r)
+ return
+
+ if len(self.header) != num_cols:
+ log.error("Invalid number of items in header.")
+
+ col_widths = []
+ for x, c in enumerate(self.header):
+ max_width = len(c)
+ for r in self.rows:
+ max_width = max(max_width, len(r[x]))
+
+ col_widths.append(max_width+2)
+
+ x = '+'
+ for c in col_widths:
+ x = ''.join([x, '-' * (c+2), '+'])
+
+ x = ''.join([x, '\n'])
+ w.write(x)
+
+ # header
+ if self.header:
+ x = '|'
+ for i, c in enumerate(col_widths):
+ x = ''.join([x, ' ', self.header[i], ' ' * (c+1-len(self.header[i])), '|'])
+
+ x = ''.join([x, '\n'])
+ w.write(x)
+
+ x = '+'
+ for c in col_widths:
+ x = ''.join([x, '=' * (c+2), '+'])
+
+ x = ''.join([x, '\n'])
+ w.write(x)
+
+ # data rows
+ for j, r in enumerate(self.rows):
+ x = '|'
+ for i, c in enumerate(col_widths):
+ x = ''.join([x, ' ', self.rows[j][i], ' ' * (c+1-len(self.rows[j][i])), '|'])
+
+ x = ''.join([x, '\n'])
+ w.write(x)
+
+ x = '+'
+ for c in col_widths:
+ x = ''.join([x, '-' * (c+2), '+'])
+
+ x = ''.join([x, '\n'])
+ w.write(x)
+
+ else:
+ log.error("No data rows")
+
+
+def mixin(cls):
+ import inspect
+
+ locals = inspect.stack()[1][0].f_locals
+ if "__module__" not in locals:
+ raise TypeError("Must call mixin() from within class def.")
+
+ dict = cls.__dict__.copy()
+ dict.pop("__doc__", None)
+ dict.pop("__module__", None)
+
+ locals.update(dict)
+
+
+
+# TODO: Move usage stuff to to base/module/Module class
+
+
+ # ------------------------- Usage Help
+USAGE_OPTIONS = ("[OPTIONS]", "", "heading", False)
+USAGE_LOGGING1 = ("Set the logging level:", "-l<level> or --logging=<level>", 'option', False)
+USAGE_LOGGING2 = ("", "<level>: none, info\*, error, warn, debug (\*default)", "option", False)
+USAGE_LOGGING3 = ("Run in debug mode:", "-g (same as option: -ldebug)", "option", False)
+USAGE_LOGGING_PLAIN = ("Output plain text only:", "-t", "option", False)
+USAGE_ARGS = ("[PRINTER|DEVICE-URI]", "", "heading", False)
+USAGE_ARGS2 = ("[PRINTER]", "", "heading", False)
+USAGE_DEVICE = ("To specify a device-URI:", "-d<device-uri> or --device=<device-uri>", "option", False)
+USAGE_PRINTER = ("To specify a CUPS printer:", "-p<printer> or --printer=<printer>", "option", False)
+USAGE_BUS1 = ("Bus to probe (if device not specified):", "-b<bus> or --bus=<bus>", "option", False)
+USAGE_BUS2 = ("", "<bus>: cups\*, usb\*, net, bt, fw, par\* (\*defaults) (Note: bt and fw not supported in this release.)", 'option', False)
+USAGE_HELP = ("This help information:", "-h or --help", "option", True)
+USAGE_SPACE = ("", "", "space", False)
+USAGE_EXAMPLES = ("Examples:", "", "heading", False)
+USAGE_NOTES = ("Notes:", "", "heading", False)
+USAGE_STD_NOTES1 = ("If device or printer is not specified, the local device bus is probed and the program enters interactive mode.", "", "note", False)
+USAGE_STD_NOTES2 = ("If -p\* is specified, the default CUPS printer will be used.", "", "note", False)
+USAGE_SEEALSO = ("See Also:", "", "heading", False)
+USAGE_LANGUAGE = ("Set the language:", "-q <lang> or --lang=<lang>. Use -q? or --lang=? to see a list of available language codes.", "option", False)
+USAGE_LANGUAGE2 = ("Set the language:", "--lang=<lang>. Use --lang=? to see a list of available language codes.", "option", False)
+USAGE_MODE = ("[MODE]", "", "header", False)
+USAGE_NON_INTERACTIVE_MODE = ("Run in non-interactive mode:", "-n or --non-interactive", "option", False)
+USAGE_GUI_MODE = ("Run in graphical UI mode:", "-u or --gui (Default)", "option", False)
+USAGE_INTERACTIVE_MODE = ("Run in interactive mode:", "-i or --interactive", "option", False)
+
+if sys_conf.get('configure', 'ui-toolkit', 'qt3') == 'qt3':
+ USAGE_USE_QT3 = ("Use Qt3:", "--qt3 (Default)", "option", False)
+ USAGE_USE_QT4 = ("Use Qt4:", "--qt4", "option", False)
+else:
+ USAGE_USE_QT3 = ("Use Qt3:", "--qt3", "option", False)
+ USAGE_USE_QT4 = ("Use Qt4:", "--qt4 (Default)", "option", False)
+
+
+
+
+def ttysize(): # TODO: Move to base/tui
+ ln1 = commands.getoutput('stty -a').splitlines()[0]
+ vals = {'rows':None, 'columns':None}
+ for ph in ln1.split(';'):
+ x = ph.split()
+ if len(x) == 2:
+ vals[x[0]] = x[1]
+ vals[x[1]] = x[0]
+ try:
+ rows, cols = int(vals['rows']), int(vals['columns'])
+ except TypeError:
+ rows, cols = 25, 80
+
+ return rows, cols
+
+
+def usage_formatter(override=0): # TODO: Move to base/module/Module class
+ rows, cols = ttysize()
+
+ if override:
+ col1 = override
+ col2 = cols - col1 - 8
+ else:
+ col1 = int(cols / 3) - 8
+ col2 = cols - col1 - 8
+
+ return TextFormatter(({'width': col1, 'margin' : 2},
+ {'width': col2, 'margin' : 2},))
+
+
+def format_text(text_list, typ='text', title='', crumb='', version=''): # TODO: Move to base/module/Module class
+ """
+ Format usage text in multiple formats:
+ text: for --help in the console
+ rest: for conversion with rst2web for the website
+ man: for manpages
+ """
+ if typ == 'text':
+ formatter = usage_formatter()
+
+ for line in text_list:
+ text1, text2, format, trailing_space = line
+
+ # remove any reST/man escapes
+ text1 = text1.replace("\\", "")
+ text2 = text2.replace("\\", "")
+
+ if format == 'summary':
+ log.info(log.bold(text1))
+ log.info("")
+
+ elif format in ('para', 'name', 'seealso'):
+ log.info(text1)
+
+ if trailing_space:
+ log.info("")
+
+ elif format in ('heading', 'header'):
+ log.info(log.bold(text1))
+
+ elif format in ('option', 'example'):
+ log.info(formatter.compose((text1, text2), trailing_space))
+
+ elif format == 'note':
+ if text1.startswith(' '):
+ log.info('\t' + text1.lstrip())
+ else:
+ log.info(text1)
+
+ elif format == 'space':
+ log.info("")
+
+ log.info("")
+
+
+ elif typ == 'rest':
+ opt_colwidth1, opt_colwidth2 = 0, 0
+ exmpl_colwidth1, exmpl_colwidth2 = 0, 0
+ note_colwidth1, note_colwidth2 = 0, 0
+
+ for line in text_list:
+ text1, text2, format, trailing_space = line
+
+ if format == 'option':
+ opt_colwidth1 = max(len(text1), opt_colwidth1)
+ opt_colwidth2 = max(len(text2), opt_colwidth2)
+
+ elif format == 'example':
+ exmpl_colwidth1 = max(len(text1), exmpl_colwidth1)
+ exmpl_colwidth2 = max(len(text2), exmpl_colwidth2)
+
+ elif format == 'note':
+ note_colwidth1 = max(len(text1), note_colwidth1)
+ note_colwidth2 = max(len(text2), note_colwidth2)
+
+ opt_colwidth1 += 4
+ opt_colwidth2 += 4
+ exmpl_colwidth1 += 4
+ exmpl_colwidth2 += 4
+ note_colwidth1 += 4
+ note_colwidth2 += 4
+ opt_tablewidth = opt_colwidth1 + opt_colwidth2
+ exmpl_tablewidth = exmpl_colwidth1 + exmpl_colwidth2
+ note_tablewidth = note_colwidth1 + note_colwidth2
+
+ # write the rst2web header
+ log.info("""restindex
+page-title: %s
+crumb: %s
+format: rest
+file-extension: html
+encoding: utf8
+/restindex\n""" % (title, crumb))
+
+ t = "%s: %s (ver. %s)" % (crumb, title, version)
+ log.info(t)
+ log.info("="*len(t))
+ log.info("")
+
+ links = []
+ needs_header = False
+ for line in text_list:
+ text1, text2, format, trailing_space = line
+
+ if format == 'seealso':
+ links.append(text1)
+ text1 = "`%s`_" % text1
+
+ len1, len2 = len(text1), len(text2)
+
+ if format == 'summary':
+ log.info(''.join(["**", text1, "**"]))
+ log.info("")
+
+ elif format in ('para', 'name'):
+ log.info("")
+ log.info(text1)
+ log.info("")
+
+ elif format in ('heading', 'header'):
+
+ log.info("")
+ log.info("**" + text1 + "**")
+ log.info("")
+ needs_header = True
+
+ elif format == 'option':
+ if needs_header:
+ log.info(".. class:: borderless")
+ log.info("")
+ log.info(''.join(["+", "-"*opt_colwidth1, "+", "-"*opt_colwidth2, "+"]))
+ needs_header = False
+
+ if text1 and '`_' not in text1:
+ log.info(''.join(["| *", text1, '*', " "*(opt_colwidth1-len1-3), "|", text2, " "*(opt_colwidth2-len2), "|"]))
+ elif text1:
+ log.info(''.join(["|", text1, " "*(opt_colwidth1-len1), "|", text2, " "*(opt_colwidth2-len2), "|"]))
+ else:
+ log.info(''.join(["|", " "*(opt_colwidth1), "|", text2, " "*(opt_colwidth2-len2), "|"]))
+
+ log.info(''.join(["+", "-"*opt_colwidth1, "+", "-"*opt_colwidth2, "+"]))
+
+ elif format == 'example':
+ if needs_header:
+ log.info(".. class:: borderless")
+ log.info("")
+ log.info(''.join(["+", "-"*exmpl_colwidth1, "+", "-"*exmpl_colwidth2, "+"]))
+ needs_header = False
+
+ if text1 and '`_' not in text1:
+ log.info(''.join(["| *", text1, '*', " "*(exmpl_colwidth1-len1-3), "|", text2, " "*(exmpl_colwidth2-len2), "|"]))
+ elif text1:
+ log.info(''.join(["|", text1, " "*(exmpl_colwidth1-len1), "|", text2, " "*(exmpl_colwidth2-len2), "|"]))
+ else:
+ log.info(''.join(["|", " "*(exmpl_colwidth1), "|", text2, " "*(exmpl_colwidth2-len2), "|"]))
+
+ log.info(''.join(["+", "-"*exmpl_colwidth1, "+", "-"*exmpl_colwidth2, "+"]))
+
+ elif format == 'seealso':
+ if text1 and '`_' not in text1:
+ log.info(text1)
+
+
+ elif format == 'note':
+ if needs_header:
+ log.info(".. class:: borderless")
+ log.info("")
+ log.info(''.join(["+", "-"*note_colwidth1, "+", "-"*note_colwidth2, "+"]))
+ needs_header = False
+
+ if text1.startswith(' '):
+ log.info(''.join(["|", " "*(note_tablewidth+1), "|"]))
+
+ log.info(''.join(["|", text1, " "*(note_tablewidth-len1+1), "|"]))
+ log.info(''.join(["+", "-"*note_colwidth1, "+", "-"*note_colwidth2, "+"]))
+
+ elif format == 'space':
+ log.info("")
+
+ for l in links:
+ log.info("\n.. _`%s`: %s.html\n" % (l, l.replace('hp-', '')))
+
+ log.info("")
+
+ elif typ == 'man':
+ log.info('.TH "%s" 1 "%s" Linux "User Manuals"' % (crumb, version))
+ log.info(".SH NAME\n%s \- %s" % (crumb, title))
+
+ for line in text_list:
+ text1, text2, format, trailing_space = line
+
+ text1 = text1.replace("\\*", "*")
+ text2 = text2.replace("\\*", "*")
+
+ len1, len2 = len(text1), len(text2)
+
+ if format == 'summary':
+ log.info(".SH SYNOPSIS")
+ log.info(".B %s" % text1.replace('Usage:', ''))
+
+ elif format == 'name':
+ log.info(".SH DESCRIPTION\n%s" % text1)
+
+ elif format in ('option', 'example', 'note'):
+ if text1:
+ log.info('.IP "%s"\n%s' % (text1, text2))
+ else:
+ log.info(text2)
+
+ elif format in ('header', 'heading'):
+ log.info(".SH %s" % text1.upper().replace(':', '').replace('[', '').replace(']', ''))
+
+ elif format in ('seealso, para'):
+ log.info(text1)
+
+ log.info(".SH AUTHOR")
+ log.info("HPLIP (Hewlett-Packard Linux Imaging and Printing) is an")
+ log.info("HP developed solution for printing, scanning, and faxing with")
+ log.info("HP inkjet and laser based printers in Linux.")
+
+ log.info(".SH REPORTING BUGS")
+ log.info("The HPLIP Launchpad.net site")
+ log.info(".B https://launchpad.net/hplip")
+ log.info("is available to get help, report")
+ log.info("bugs, make suggestions, discuss the HPLIP project or otherwise")
+ log.info("contact the HPLIP Team.")
+
+ log.info(".SH COPYRIGHT")
+ log.info("Copyright (c) 2001-14 Hewlett-Packard Development Company, L.P.")
+ log.info(".LP")
+ log.info("This software comes with ABSOLUTELY NO WARRANTY.")
+ log.info("This is free software, and you are welcome to distribute it")
+ log.info("under certain conditions. See COPYING file for more details.")
+
+ log.info("")
+
+
+def log_title(program_name, version, show_ver=True): # TODO: Move to base/module/Module class
+ log.info("")
+
+ if show_ver:
+ log.info(log.bold("HP Linux Imaging and Printing System (ver. %s)" % prop.version))
+ else:
+ log.info(log.bold("HP Linux Imaging and Printing System"))
+
+ log.info(log.bold("%s ver. %s" % (program_name, version)))
+ log.info("")
+ log.info("Copyright (c) 2001-14 Hewlett-Packard Development Company, LP")
+ log.info("This software comes with ABSOLUTELY NO WARRANTY.")
+ log.info("This is free software, and you are welcome to distribute it")
+ log.info("under certain conditions. See COPYING file for more details.")
+ log.info("")
+
+
+def ireplace(old, search, replace):
+ regex = '(?i)' + re.escape(search)
+ return re.sub(regex, replace, old)
+
+
+def su_sudo():
+ su_sudo_str = None
+
+ if which('kdesu'):
+ su_sudo_str = 'kdesu -- %s'
+
+ elif which('gnomesu'):
+ su_sudo_str = 'gnomesu -c "%s"'
+
+ elif which('gksu'):
+ su_sudo_str = 'gksu "%s"'
+
+ elif which('su'):
+ su_sudo_str = 'su'
+
+ return su_sudo_str
+
+# This function returns the distro name and distro version.
+#This is provided to check on Fedora 14 in pkit.py file for Plugin-installation.
+#is_su variable is used to provide a check on Fedora 8
+def os_release():
+ os_name = None;
+ os_version = None;
+ is_su = None;
+ if which('lsb_release'):
+ name = os.popen('lsb_release -i | cut -f 2')
+ os_name = name.read().strip()
+ name.close()
+ version = os.popen('lsb_release -r | cut -f 2')
+ os_version=version.read().strip()
+ version.close()
+ is_su = True
+ else:
+ name = os.popen('cat /etc/issue | cut -c 1-6 | head -n 1')
+ os_name = name.read().strip()
+ name.close()
+ version1=os.popen('cat /etc/issue | cut -c 16 | head -n 1')
+ version2=version1.read().strip()
+ version1.close()
+ if (version2 == '1'):
+ version=os.popen('cat /etc/issue | cut -c 16-17 | head -n 1')
+ is_su = True
+ else:
+ version=os.popen('cat /etc/issue | cut -c 16 | head -n 1')
+ is_su = False
+ os_version=version.read().strip()
+ version.close()
+
+ return os_name,os_version,is_su
+
+
+#
+# Removes HTML or XML character references and entities from a text string.
+#
+
+def unescape(text):
+ def fixup(m):
+ text = m.group(0)
+ if text[:2] == "&#":
+ # character reference
+ try:
+ if text[:3] == "&#x":
+ #return unichr(int(text[3:-1], 16))
+ return chr(int(text[3:-1], 16))
+ else:
+ #return unichr(int(text[2:-1]))
+ return chr(int(text[2:-1]))
+ except ValueError:
+ pass
+ else:
+ # named entity
+ try:
+ #text = unichr(htmlentitydefs.name2codepoint[text[1:-1]])
+ text = chr(htmlentitydefs.name2codepoint[text[1:-1]])
+ except KeyError:
+ pass
+ return text # leave as is
+ return re.sub("&#?\w+;", fixup, text)
+
+
+# Adds HTML or XML character references and entities from a text string
+
+def escape(s):
+ if not isinstance(s, unicode):
+ s = unicode(s) # hmmm...
+
+ s = s.replace(u"&", u"&amp;")
+
+ for c in htmlentitydefs.codepoint2name:
+ if c != 0x26: # exclude &
+ s = s.replace(unichr(c), u"&%s;" % htmlentitydefs.codepoint2name[c])
+
+ for c in range(0x20) + range(0x7f, 0xa0):
+ s = s.replace(unichr(c), u"&#%d;" % c)
+
+ return s
+
+# checks if given process is running.
+#return value:
+# True or False
+# None - if process is not running
+# grep output - if process is running
+
+def Is_Process_Running(process_name):
+ try:
+ p1 = Popen(["ps", "aux"], stdout=PIPE)
+ p2 = Popen(["grep", process_name], stdin=p1.stdout, stdout=PIPE)
+ p3 = Popen(["grep", "-v", "grep"], stdin=p2.stdout, stdout=PIPE)
+ output = p3.communicate()[0]
+ log.debug("Is_Process_Running outpu = %s " %output)
+
+ if process_name in output:
+ return True, output
+ else:
+ return False, None
+
+ except Exception, e:
+ log.error("Execution failed: process Name[%s]" %process_name)
+ print >>sys.stderr, "Execution failed:", e
+ return False, None
+
+#return tye: strings
+#Return values.
+# None --> on error.
+# "terminal name"-->success
+def get_terminal():
+ terminal_list=['gnome-terminal', 'konsole','x-terminal-emulator', 'xterm', 'gtkterm']
+ cnt = 0
+ terminal_cmd = None
+ while cnt < len(terminal_list):
+ if which(terminal_list[cnt]):
+ terminal_cmd = terminal_list[cnt]+" -e "
+ log.debug("Available Terminal = %s " %terminal_cmd)
+ break
+
+ return terminal_cmd
+
+#Return Type: bool
+# Return values:
+# True --> if it is older version
+# False --> if it is same or later version.
+
+def Is_HPLIP_older_version(installed_version, available_version):
+
+ if available_version == "" or available_version == None or installed_version == "" or installed_version == None:
+ log.debug("available_version is ''")
+ return False
+
+ installed_array=installed_version.split('.')
+ available_array=available_version.split('.')
+
+ log.debug("HPLIP Installed_version=%s Available_version=%s"%(installed_version,available_version))
+ cnt = 0
+ Is_older = False
+ while cnt <len(installed_array) and cnt <len(available_array):
+ if(int(installed_array[cnt]) < int(available_array[cnt])):
+ Is_older = True
+ break
+ elif(int(installed_array[cnt]) > int(available_array[cnt])):
+ log.debug("Already new verison is installed")
+ return False
+ cnt += 1
+
+ # To check internal version is installed.
+ if Is_older is False and len(installed_array) >len(available_array):
+ Is_older = True
+
+ return Is_older
+
+
+def downLoad_status(count, blockSize, totalSize):
+ percent = int(count*blockSize*100/totalSize)
+ if count != 0:
+ sys.stdout.write("\b\b\b")
+ sys.stdout.write("%s" %(log.color("%2d%%"%percent, 'bold')))
+ sys.stdout.flush()
+
+
+def download_from_network(weburl, outputFile = None, useURLLIB=False):
+ result =False
+
+ if weburl is "" or weburl is None:
+ log.error("URL is empty")
+ return result, ""
+
+ if outputFile is None:
+ fp, outputFile = make_temp_file()
+
+ try:
+ if useURLLIB is False:
+ wget = which("wget")
+ if wget:
+ wget = os.path.join(wget, "wget")
+ status, output = run("%s --cache=off --timeout=60 --output-document=%s %s" %(wget, outputFile, weburl))
+ if status:
+ log.error("Failed to connect to HPLIP site. Error code = %d" %status)
+ return False, ""
+ else:
+ useURLLIB = True
+
+ if useURLLIB:
+ sys.stdout.write("Download in progress...")
+ urllib.urlretrieve(weburl, outputFile, downLoad_status)
+
+ except IOError, e:
+ log.error("I/O Error: %s" % e.strerror)
+ return False, ""
+
+ if not os.path.exists(outputFile):
+ log.error("Failed to get hplip version/ %s file not found."%hplip_version_file)
+ return False, ""
+
+ return True, outputFile
+
+
+
+
+
+class Sync_Lock:
+ def __init__(self, filename):
+ self.Lock_filename = filename
+ self.handler = open(self.Lock_filename, 'w')
+
+# Wait for another process to release resource and acquires the resource.
+ def acquire(self):
+ fcntl.flock(self.handler, fcntl.LOCK_EX)
+
+ def release(self):
+ fcntl.flock(self.handler, fcntl.LOCK_UN)
+
+ def __del__(self):
+ self.handler.close()
diff --git a/base/vcard.py b/base/vcard.py
new file mode 100644
index 0000000..9992851
--- /dev/null
+++ b/base/vcard.py
@@ -0,0 +1,1431 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2001-2008 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# ****************************************************************************
+#
+# Copyright (C) 2003-2004 Roger Binns <rogerb@rogerbinns.com>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the BitPim license as detailed in the LICENSE file.
+#
+# Code for reading and writing Vcard
+#
+# VCARD is defined in RFC 2425 and 2426
+#
+# Original author: Roger Binns <rogerb@rogerbinns.com>
+# Modified for HPLIP by: Don Welch
+#
+
+# Local
+from base.g import *
+
+# Std Lib
+import quopri
+import base64
+import codecs
+import cStringIO
+import re
+import StringIO
+import codecs
+
+
+
+_boms = []
+# 64 bit
+try:
+ import encodings.utf_64
+ _boms.append( (codecs.BOM64_BE, "utf_64") )
+ _boms.append( (codecs.BOM64_LE, "utf_64") )
+except: pass
+
+# 32 bit
+try:
+ import encodings.utf_32
+ _boms.append( (codecs.BOM_UTF32, "utf_32") )
+ _boms.append( (codecs.BOM_UTF32_BE, "utf_32") )
+ _boms.append( (codecs.BOM_UTF32_LE, "utf_32") )
+except: pass
+
+# 16 bit
+try:
+ import encodings.utf_16
+ _boms.append( (codecs.BOM_UTF16, "utf_16") )
+ _boms.append( (codecs.BOM_UTF16_BE, "utf_16_be") )
+ _boms.append( (codecs.BOM_UTF16_LE, "utf_16_le") )
+except: pass
+
+# 8 bit
+try:
+ import encodings.utf_8
+ _boms.append( (codecs.BOM_UTF8, "utf_8") )
+except: pass
+
+# Work arounds for Apple
+_boms.append( ("\0B\0E\0G\0I\0N\0:\0V\0C\0A\0R\0D", "utf_16_be") )
+_boms.append( ("B\0E\0G\0I\0N\0:\0V\0C\0A\0R\0D\0", "utf_16_le") )
+
+
+# NB: the 32 bit and 64 bit versions have the BOM constants defined in Py 2.3
+# but no corresponding encodings module. They are here for completeness.
+# The order of above also matters since the first ones have longer
+# boms than the latter ones, and we need to be unambiguous
+
+_maxbomlen = max([len(bom) for bom,codec in _boms])
+
+def opentextfile(name):
+ """This function detects unicode byte order markers and if present
+ uses the codecs module instead to open the file instead with
+ appropriate unicode decoding, else returns the file using standard
+ open function"""
+ #with file(name, 'rb') as f:
+ f = file(name, 'rb')
+ start = f.read(_maxbomlen)
+ for bom,codec in _boms:
+ if start.startswith(bom):
+ # some codecs don't do readline, so we have to vector via stringio
+ # many postings also claim that the BOM is returned as the first
+ # character but that hasn't been the case in my testing
+ return StringIO.StringIO(codecs.open(name, "r", codec).read())
+ return file(name, "rtU")
+
+
+_notdigits = re.compile("[^0-9]*")
+_tendigits = re.compile("^[0-9]{10}$")
+_sevendigits = re.compile("^[0-9]{7}$")
+
+
+def phonenumber_normalise(n):
+ # this was meant to remove the long distance '1' prefix,
+ # temporary disable it, will be done on a phone-by-phone case.
+ return n
+ nums = "".join(re.split(_notdigits, n))
+ if len(nums) == 10:
+ return nums
+
+ if len(nums) == 11 and nums[0] == "1":
+ return nums[1:]
+
+ return n
+
+def phonenumber_format(n):
+ if re.match(_tendigits, n) is not None:
+ return "(%s) %s-%s" % (n[0:3], n[3:6], n[6:])
+ elif re.match(_sevendigits, n) is not None:
+ return "%s-%s" %(n[:3], n[3:])
+ return n
+
+
+def nameparser_formatsimplename(name):
+ "like L{formatname}, except we use the first matching component"
+ _fullname = nameparser_getfullname(name)
+ if _fullname:
+ return _fullname
+ return name.get('nickname', "")
+
+
+def nameparser_getfullname(name):
+ """Gets the full name, joining the first/middle/last if necessary"""
+ if name.has_key("full"):
+ return name["full"]
+ return ' '.join([x for x in nameparser_getparts(name) if x])
+
+
+# See the following references for name parsing and how little fun it
+# is.
+#
+# The simple way:
+# http://cvs.gnome.org/lxr/source/evolution-data-server/addressbook/libebook/
+# e-name-western*
+#
+# The "proper" way:
+# http://cvs.xemacs.org/viewcvs.cgi/XEmacs/packages/xemacs-packages/mail-lib/mail-extr.el
+#
+# How we do it
+#
+# [1] The name is split into white-space seperated parts
+# [2] If there is only one part, it becomes the firstname
+# [3] If there are only two parts, they become first name and surname
+# [4] For three or more parts, the first part is the first name and the last
+# part is the surname. Then while the last part of the remainder starts with
+# a lower case letter or is in the list below, it is prepended to the surname.
+# Whatever is left becomes the middle name.
+
+lastparts = [ "van", "von", "de", "di" ]
+
+# I would also like to proudly point out that this code has no comment saying
+# "Have I no shame". It will be considered incomplete until that happens
+
+def nameparser_getparts_FML(name):
+ n = name.get("full")
+
+ # [1]
+ parts = n.split()
+
+ # [2]
+ if len(parts) <= 1:
+ return (n, "", "")
+
+ # [3]
+ if len(parts) == 2:
+ return (parts[0], "", parts[1])
+
+ # [4]
+ f = [parts[0]]
+ m = []
+ l = [parts[-1]]
+ del parts[0]
+ del parts[-1]
+
+ while len(parts) and (parts[-1][0].lower() == parts[-1][0] or parts[-1].lower() in lastparts):
+ l = [parts[-1]]+l
+ del parts[-1]
+
+ m = parts
+
+ # return it all
+ return (" ".join(f), " ".join(m), " ".join(l))
+
+
+def nameparser_getparts_LFM(name):
+ n = name.get("full")
+
+ parts = n.split(',')
+
+ if len(parts) <= 1:
+ return (n, '', '')
+
+ _last = parts[0]
+ _first = ''
+ _middle = ''
+ parts = parts[1].split()
+
+ if len(parts) >= 1:
+ _first = parts[0]
+
+ if len(parts) > 1:
+ _middle = ' '.join(parts[1:])
+
+ return (_first, _middle, _last)
+
+
+def nameparser_getparts(name):
+ """Returns (first, middle, last) for name. If the part doesn't exist
+ then a blank string is returned"""
+
+ # do we have any of the parts?
+ for i in ("first", "middle", "last"):
+ if name.has_key(i):
+ return (name.get("first", ""), name.get("middle", ""), name.get("last", ""))
+
+ # check we have full. if not return nickname
+ if not name.has_key("full"):
+ return (name.get("nickname", ""), "", "")
+
+ n = name.nameparser_get("full")
+
+ if ',' in n:
+ return nameparser_getparts_LFM(name)
+
+ return nameparser_getparts_FML(name)
+
+
+
+
+class VFileException(Exception):
+ pass
+
+
+
+class VFile:
+ _charset_aliases = {
+ 'MACINTOSH': 'MAC_ROMAN'
+ }
+
+ def __init__(self, source):
+ self.source = source
+ self.saved = None
+
+
+ def __iter__(self):
+ return self
+
+
+ def next(self):
+ # Get the next non-blank line
+ while True: # python desperately needs do-while
+ line = self._getnextline()
+
+ if line is None:
+ raise StopIteration()
+
+ if len(line) != 0:
+ break
+
+ # Hack for evolution. If ENCODING is QUOTED-PRINTABLE then it doesn't
+ # offset the next line, so we look to see what the first char is
+ normalcontinuations = True
+ colon = line.find(':')
+ if colon > 0:
+ s = line[:colon].lower().split(";")
+
+ if "quoted-printable" in s or 'encoding=quoted-printable' in s:
+ normalcontinuations = False
+ while line[-1] == "=" or line[-2] == '=':
+ if line[-1] == '=':
+ i = -1
+ else:
+ i = -2
+
+ nextl = self._getnextline()
+ if nextl[0] in ("\t", " "): nextl = nextl[1:]
+ line = line[:i]+nextl
+
+ while normalcontinuations:
+ nextline = self._lookahead()
+
+ if nextline is None:
+ break
+
+ if len(nextline) == 0:
+ break
+
+ if nextline[0] != ' ' and nextline[0] != '\t':
+ break
+
+ line += self._getnextline()[1:]
+
+ colon = line.find(':')
+
+ if colon < 1:
+ # some evolution vcards don't even have colons
+ # raise VFileException("Invalid property: "+line)
+ log.debug("Fixing up bad line: %s" % line)
+
+ colon = len(line)
+ line += ":"
+
+ b4 = line[:colon]
+ line = line[colon+1:].strip()
+
+ # upper case and split on semicolons
+ items = b4.upper().split(";")
+
+ newitems = []
+ if isinstance(line, unicode):
+ charset = None
+
+ else:
+ charset = "LATIN-1"
+
+ for i in items:
+ # ::TODO:: probably delete anything preceding a '.'
+ # (see 5.8.2 in rfc 2425)
+ # look for charset parameter
+ if i.startswith("CHARSET="):
+ charset = i[8:] or "LATIN-1"
+ continue
+
+ # unencode anything that needs it
+ if not i.startswith("ENCODING=") and not i=="QUOTED-PRINTABLE": # evolution doesn't bother with "ENCODING="
+ # ::TODO:: deal with backslashes, being especially careful with ones quoting semicolons
+ newitems.append(i)
+ continue
+
+ try:
+ if i == 'QUOTED-PRINTABLE' or i == "ENCODING=QUOTED-PRINTABLE":
+ # technically quoted printable is ascii only but we decode anyway since not all vcards comply
+ line = quopri.decodestring(line)
+
+ elif i == 'ENCODING=B':
+ line = base64.decodestring(line)
+ charset = None
+
+ else:
+ raise VFileException("unknown encoding: "+i)
+
+ except Exception,e:
+ if isinstance(e,VFileException):
+ raise e
+ raise VFileException("Exception %s while processing encoding %s on data '%s'" % (str(e), i, line))
+
+ # ::TODO:: repeat above shenanigans looking for a VALUE= thingy and
+ # convert line as in 5.8.4 of rfc 2425
+ if len(newitems) == 0:
+ raise VFileException("Line contains no property: %s" % (line,))
+
+ # charset frigging
+ if charset is not None:
+ try:
+ decoder = codecs.getdecoder(self._charset_aliases.get(charset, charset))
+ line,_ = decoder(line)
+ except LookupError:
+ raise VFileException("unknown character set '%s' in parameters %s" % (charset, b4))
+
+ if newitems == ["BEGIN"] or newitems == ["END"]:
+ line = line.upper()
+
+ return newitems, line
+
+
+ def _getnextline(self):
+ if self.saved is not None:
+ line = self.saved
+ self.saved = None
+ return line
+ else:
+ return self._readandstripline()
+
+
+ def _readandstripline(self):
+ line = self.source.readline()
+ if line is not None:
+ if len(line) == 0:
+ return None
+
+ elif line[-2:] == "\r\n":
+ return line[:-2]
+
+ elif line[-1] == '\r' or line[-1] == '\n':
+ return line[:-1]
+
+ return line
+
+
+ def _lookahead(self):
+ assert self.saved is None
+ self.saved = self._readandstripline()
+ return self.saved
+
+
+
+class VCards:
+ "Understands vcards in a vfile"
+
+
+ def __init__(self, vfile):
+ self.vfile = vfile
+
+
+ def __iter__(self):
+ return self
+
+
+ def next(self):
+ # find vcard start
+ field = value = None
+ for field,value in self.vfile:
+ if (field,value) != (["BEGIN"], "VCARD"):
+ continue
+
+ found = True
+ break
+
+ if (field,value) != (["BEGIN"], "VCARD"):
+ # hit eof without any BEGIN:vcard
+ raise StopIteration()
+
+ # suck up lines
+ lines = []
+ for field,value in self.vfile:
+ if (field,value) != (["END"], "VCARD"):
+ lines.append( (field,value) )
+ continue
+
+ break
+
+ if (field,value) != (["END"], "VCARD"):
+ raise VFileException("There is a BEGIN:VCARD but no END:VCARD")
+
+ return VCard(lines)
+
+
+
+class VCard:
+ "A single vcard"
+
+ def __init__(self, lines):
+ self._version = (2,0) # which version of the vcard spec the card conforms to
+ self._origin = None # which program exported the vcard
+ self._data = {}
+ self._groups = {}
+ self.lines = []
+
+ # extract version field
+ for f,v in lines:
+ assert len(f)
+
+ if f == ["X-EVOLUTION-FILE-AS"]: # all evolution cards have this
+ self._origin = "evolution"
+
+ if f[0].startswith("ITEM") and (f[0].endswith(".X-ABADR") or f[0].endswith(".X-ABLABEL")):
+ self._origin = "apple"
+
+ if len(v) and v[0].find(">!$_") > v[0].find("_$!<") >= 0:
+ self.origin = "apple"
+
+ if f == ["VERSION"]:
+ ver = v.split(".")
+ try:
+ ver = [int(xx) for xx in ver]
+ except ValueError:
+ raise VFileException(v+" is not a valid vcard version")
+
+ self._version = ver
+ continue
+
+ # convert {home,work}.{tel,label} to {tel,label};{home,work}
+ # this probably dates from *very* early vcards
+ if f[0] == "HOME.TEL":
+ f[0:1] = ["TEL", "HOME"]
+
+ elif f[0] == "HOME.LABEL":
+ f[0:1] = ["LABEL", "HOME"]
+
+ elif f[0] == "WORK.TEL":
+ f[0:1] = ["TEL", "WORK"]
+
+ elif f[0] == "WORK.LABEL":
+ f[0:1] = ["LABEL", "WORK"]
+
+ self.lines.append( (f,v) )
+
+ self._parse(self.lines, self._data)
+ self._update_groups(self._data)
+
+
+ def getdata(self):
+ "Returns a dict of the data parsed out of the vcard"
+ return self._data
+
+ def get(self, key, default=''):
+ return self._data.get(key, default)
+
+
+ def _getfieldname(self, name, dict):
+ """Returns the fieldname to use in the dict.
+
+ For example, if name is "email" and there is no "email" field
+ in dict, then "email" is returned. If there is already an "email"
+ field then "email2" is returned, etc"""
+ if name not in dict:
+ return name
+ for i in xrange(2,99999):
+ if name+`i` not in dict:
+ return name+`i`
+
+
+ def _parse(self, lines, result):
+ for field,value in lines:
+ if len(value.strip()) == 0: # ignore blank values
+ continue
+
+ if '.' in field[0]:
+ f = field[0][field[0].find('.')+1:]
+ else:
+ f = field[0]
+
+ t = f.replace("-", "_")
+ func = getattr(self, "_field_"+t, self._default_field)
+ func(field, value, result)
+
+
+ def _update_groups(self, result):
+ """Update the groups info """
+ for k,e in self._groups.items():
+ self._setvalue(result, *e)
+
+
+ # fields we ignore
+
+ def _field_ignore(self, field, value, result):
+ pass
+
+
+ _field_LABEL = _field_ignore # we use the ADR field instead
+ _field_BDAY = _field_ignore # not stored in bitpim
+ _field_ROLE = _field_ignore # not stored in bitpim
+ _field_CALURI = _field_ignore # not stored in bitpim
+ _field_CALADRURI = _field_ignore # variant of above
+ _field_FBURL = _field_ignore # not stored in bitpim
+ _field_REV = _field_ignore # not stored in bitpim
+ _field_KEY = _field_ignore # not stored in bitpim
+ _field_SOURCE = _field_ignore # not stored in bitpim (although arguably part of serials)
+ _field_PHOTO = _field_ignore # contained either binary image, or external URL, not used by BitPim
+
+
+ # simple fields
+
+ def _field_FN(self, field, value, result):
+ result[self._getfieldname("name", result)] = self.unquote(value)
+
+
+ def _field_TITLE(self, field, value, result):
+ result[self._getfieldname("title", result)] = self.unquote(value)
+
+
+ def _field_NICKNAME(self, field, value, result):
+ # ::TODO:: technically this is a comma seperated list ..
+ result[self._getfieldname("nickname", result)] = self.unquote(value)
+
+
+ def _field_NOTE(self, field, value, result):
+ result[self._getfieldname("notes", result)] = self.unquote(value)
+
+
+ def _field_UID(self, field, value, result):
+ result["uid"] = self.unquote(value) # note that we only store one UID (the "U" does stand for unique)
+
+
+ #
+ # Complex fields
+ #
+
+ def _field_N(self, field, value, result):
+ value = self.splitandunquote(value)
+ familyname = givenname = additionalnames = honorificprefixes = honorificsuffixes = None
+ try:
+ familyname = value[0]
+ givenname = value[1]
+ additionalnames = value[2]
+ honorificprefixes = value[3]
+ honorificsuffixes = value[4]
+ except IndexError:
+ pass
+
+ if familyname is not None and len(familyname):
+ result[self._getfieldname("last name", result)] = familyname
+
+ if givenname is not None and len(givenname):
+ result[self._getfieldname("first name", result)] = givenname
+
+ if additionalnames is not None and len(additionalnames):
+ result[self._getfieldname("middle name", result)] = additionalnames
+
+ if honorificprefixes is not None and len(honorificprefixes):
+ result[self._getfieldname("prefix", result)] = honorificprefixes
+
+ if honorificsuffixes is not None and len(honorificsuffixes):
+ result[self._getfieldname("suffix", result)] = honorificsuffixes
+
+
+ _field_NAME = _field_N # early versions of vcard did this
+
+
+ def _field_ORG(self, field, value, result):
+ value = self.splitandunquote(value)
+ if len(value):
+ result[self._getfieldname("organisation", result)] = value[0]
+
+ for f in value[1:]:
+ result[self._getfieldname("organisational unit", result)] = f
+
+
+ _field_O = _field_ORG # early versions of vcard did this
+
+
+ def _field_EMAIL(self, field, value, result):
+ value = self.unquote(value)
+ # work out the types
+ types = []
+ for f in field[1:]:
+ if f.startswith("TYPE="):
+ ff = f[len("TYPE="):].split(",")
+ else:
+ ff = [f]
+
+ types.extend(ff)
+
+ # the standard doesn't specify types of "home" and "work" but
+ # does allow for random user defined types, so we look for them
+ type = None
+ for t in types:
+ if t == "HOME":
+ type="home"
+
+ if t == "WORK":
+ type="business"
+
+ if t == "X400":
+ return # we don't want no steenking X.400
+
+ preferred = "PREF" in types
+
+ if type is None:
+ self._setvalue(result, "email", value, preferred)
+ else:
+ addr = {'email': value, 'type': type}
+ self._setvalue(result, "email", addr, preferred)
+
+
+ def _field_URL(self, field, value, result):
+ # the standard doesn't specify url types or a pref type,
+ # but we implement it anyway
+ value = self.unquote(value)
+ # work out the types
+ types = []
+ for f in field[1:]:
+ if f.startswith("TYPE="):
+ ff = f[len("TYPE="):].split(",")
+ else:
+ ff=[f]
+
+ types.extend(ff)
+
+ type = None
+ for t in types:
+ if t == "HOME":
+ type="home"
+
+ if t == "WORK":
+ type="business"
+
+ preferred = "PREF" in types
+
+ if type is None:
+ self._setvalue(result, "url", value, preferred)
+ else:
+ addr = {'url': value, 'type': type}
+ self._setvalue(result, "url", addr, preferred)
+
+
+ def _field_X_SPEEDDIAL(self, field, value, result):
+ if '.' in field[0]:
+ group = field[0][:field[0].find('.')]
+ else:
+ group = None
+ if group is None:
+ # this has to belong to a group!!
+ #print 'speedial has no group'
+ log.debug("speeddial has no group")
+ else:
+ self._setgroupvalue(result, 'phone', { 'speeddial': int(value) },
+ group, False)
+
+
+ def _field_TEL(self, field, value, result):
+ value = self.unquote(value)
+ # see if this is part of a group
+ if '.' in field[0]:
+ group = field[0][:field[0].find('.')]
+ else:
+ group = None
+
+ # work out the types
+ types = []
+
+ for f in field[1:]:
+ if f.startswith("TYPE="):
+ ff = f[len("TYPE="):].split(",")
+ else:
+ ff = [f]
+
+ types.extend(ff)
+
+ # type munging - we map vcard types to simpler ones
+ munge = { "BBS": "DATA", "MODEM": "DATA", "ISDN": "DATA", "CAR": "CELL",
+ "PCS": "CELL" }
+
+ types = [munge.get(t, t) for t in types]
+
+ # reduce types to home, work, msg, pref, voice, fax, cell, video, pager, data
+ types = [t for t in types if t in ("HOME", "WORK", "MSG", "PREF", "VOICE",
+ "FAX", "CELL", "VIDEO", "PAGER", "DATA")]
+
+ # if type is in this list and voice not explicitly mentioned then it is not a voice type
+ antivoice = ["FAX", "PAGER", "DATA"]
+
+ if "VOICE" in types:
+ voice = True
+
+ else:
+ voice = True # default is voice
+
+ for f in antivoice:
+ if f in types:
+ voice = False
+ break
+
+ preferred = "PREF" in types
+
+ # vcard allows numbers to be multiple things at the same time, such as home voice, home fax
+ # and work fax so we have to test for all variations
+
+ # if neither work or home is specified, then no default (otherwise things get really complicated)
+ iswork = False
+ ishome = False
+ if "WORK" in types:
+ iswork = True
+
+ if "HOME" in types:
+ ishome = True
+
+ if len(types) == 0 or types == ["PREF"]:
+ iswork = True # special case when nothing else is specified
+
+
+ value = phonenumber_normalise(value)
+ if iswork and voice:
+ self._setgroupvalue(result,
+ "phone", {"type": "business", "number": value},
+ group, preferred)
+
+ if ishome and voice:
+ self._setgroupvalue(result,
+ "phone", {"type": "home", "number": value},
+ group, preferred)
+
+ if not iswork and not ishome and "FAX" in types:
+ # fax without explicit work or home
+ self._setgroupvalue(result,
+ "phone", {"type": "fax", "number": value},
+ group, preferred)
+
+ else:
+ if iswork and "FAX" in types:
+ self._setgroupvalue(result, "phone",
+ {"type": "business fax", "number": value},
+ group, preferred)
+
+ if ishome and "FAX" in types:
+ self._setgroupvalue(result, "phone",
+ {"type": "home fax", "number": value},
+ group, preferred)
+
+ if "CELL" in types:
+ self._setgroupvalue(result,
+ "phone", {"type": "cell", "number": value},
+ group, preferred)
+
+ if "PAGER" in types:
+ self._setgroupvalue(result,
+ "phone", {"type": "pager", "number": value},
+ group, preferred)
+
+ if "DATA" in types:
+ self._setgroupvalue(result,
+ "phone", {"type": "data", "number": value},
+ group, preferred)
+
+
+ def _setgroupvalue(self, result, type, value, group, preferred=False):
+ """ Set value of an item of a group
+ """
+ if group is None:
+ # no groups specified
+ return self._setvalue(result, type, value, preferred)
+
+ group_type = self._groups.get(group, None)
+
+ if group_type is None:
+ # 1st one of the group
+ self._groups[group] = [type, value, preferred]
+
+ else:
+ if type != group_type[0]:
+ log.debug('Group %s has different types: %s, %s' % (group, type,groups_type[0]))
+
+ if preferred:
+ group_type[2] = True
+
+ group_type[1].update(value)
+
+
+ def _setvalue(self, result, type, value, preferred=False):
+ if type not in result:
+ result[type] = value
+ return
+
+ if not preferred:
+ result[self._getfieldname(type, result)] = value
+ return
+
+ # we need to insert our value at the begining
+ values = [value]
+
+ for suffix in [""]+range(2,99):
+ if type+str(suffix) in result:
+ values.append(result[type+str(suffix)])
+ else:
+ break
+
+ suffixes = [""]+range(2,len(values)+1)
+
+ for l in range(len(suffixes)):
+ result[type+str(suffixes[l])] = values[l]
+
+
+ def _field_CATEGORIES(self, field, value, result):
+ # comma seperated just for fun
+ values = self.splitandunquote(value, seperator=",")
+ values = [v.replace(";", "").strip() for v in values] # semi colon is used as seperator in bitpim text field
+ values = [v for v in values if len(v)]
+ v = result.get('categories', None)
+
+ if v:
+ result['categories'] = ';'.join([v, ";".join(values)])
+
+ else:
+ result['categories'] = ';'.join(values)
+
+
+ def _field_SOUND(self, field, value, result):
+ # comma seperated just for fun
+ values = self.splitandunquote(value, seperator=",")
+ values = [v.replace(";", "").strip() for v in values] # semi colon is used as seperator in bitpim text field
+ values = [v for v in values if len(v)]
+ result[self._getfieldname("ringtones", result)] = ";".join(values)
+
+
+ _field_CATEGORY = _field_CATEGORIES # apple use "category" which is not in the spec
+
+
+ def _field_ADR(self, field, value, result):
+ # work out the type
+ preferred = False
+ type = "business"
+
+ for f in field[1:]:
+ if f.startswith("TYPE="):
+ ff = f[len("TYPE="):].split(",")
+
+ else:
+ ff = [f]
+
+ for x in ff:
+ if x == "HOME":
+ type = "home"
+ if x == "PREF":
+ preferred = True
+
+ value = self.splitandunquote(value)
+ pobox = extendedaddress = streetaddress = locality = region = postalcode = country = None
+ try:
+ pobox = value[0]
+ extendedaddress = value[1]
+ streetaddress = value[2]
+ locality = value[3]
+ region = value[4]
+ postalcode = value[5]
+ country = value[6]
+ except IndexError:
+ pass
+
+ addr = {}
+
+ if pobox is not None and len(pobox):
+ addr["pobox"] = pobox
+
+ if extendedaddress is not None and len(extendedaddress):
+ addr["street2"] = extendedaddress
+
+ if streetaddress is not None and len(streetaddress):
+ addr["street"] = streetaddress
+
+ if locality is not None and len(locality):
+ addr["city"] = locality
+
+ if region is not None and len(region):
+ addr["state"] = region
+
+ if postalcode is not None and len(postalcode):
+ addr["postalcode"] = postalcode
+
+ if country is not None and len(country):
+ addr["country"] = country
+
+ if len(addr):
+ addr["type"] = type
+ self._setvalue(result, "address", addr, preferred)
+
+
+ def _field_X_PALM(self, field, value, result):
+ # handle a few PALM custom fields
+ ff = field[0].split(".")
+ f0 = ff[0]
+
+ if len(ff) > 1:
+ f1 = ff[1]
+ else:
+ f1 = ''
+
+ if f0.startswith('X-PALM-CATEGORY') or f1.startswith('X-PALM-CATEGORY'):
+ self._field_CATEGORIES(['CATEGORIES'], value, result)
+
+ elif f0 == 'X-PALM-NICKNAME' or f1 == 'X-PALM-NICKNAME':
+ self._field_NICKNAME(['NICKNAME'], value, result)
+
+ else:
+ log.debug("Ignoring PALM custom field: %s" % field)
+
+
+ def _default_field(self, field, value, result):
+ ff = field[0].split(".")
+ f0 = ff[0]
+
+ if len(ff) > 1:
+ f1 = ff[1]
+ else:
+ f1 = ''
+
+ if f0.startswith('X-PALM-') or f1.startswith('X-PALM-'):
+ self._field_X_PALM(field, value, result)
+ return
+
+ elif f0.startswith("X-") or f1.startswith("X-"):
+ log.debug("Ignoring custom field: %s" % field)
+ return
+
+ log.debug("No idea what to do with %s (%s)" % (field, value[:80]))
+
+
+
+ def unquote(self, value):
+ # ::TODO:: do this properly (deal with all backslashes)
+ return value.replace(r"\;", ";") \
+ .replace(r"\,", ",") \
+ .replace(r"\n", "\n") \
+ .replace(r"\r\n", "\r\n") \
+ .replace("\r\n", "\n") \
+ .replace("\r", "\n")
+
+
+ def splitandunquote(self, value, seperator=";"):
+ # also need a splitandsplitandunquote since some ; delimited fields are then comma delimited
+
+ # short cut for normal case - no quoted seperators
+ if value.find("\\"+seperator)<0:
+ return [self.unquote(v) for v in value.split(seperator)]
+
+ # funky quoting, do it the slow hard way
+ res = []
+ build = ""
+ v = 0
+ while v < len(value):
+ if value[v] == seperator:
+ res.append(build)
+ build = ""
+ v += 1
+ continue
+
+
+ if value[v] == "\\":
+ build += value[v:v+2]
+ v += 2
+ continue
+
+ build += value[v]
+ v += 1
+
+ if len(build):
+ res.append(build)
+
+ return [self.unquote(v) for v in res]
+
+
+ def version(self):
+ "Best guess as to vcard version"
+ return self._version
+
+
+ def origin(self):
+ "Best guess as to what program wrote the vcard"
+ return self._origin
+
+
+ def __getitem__(self, item):
+ return self._data[item]
+
+ def __repr__(self):
+ return repr(self._data)
+
+
+# The formatters return a string
+def myqpencodestring(value):
+ """My own routine to do qouted printable since the builtin one doesn't encode CR or NL!"""
+ return quopri.encodestring(value).replace("\r", "=0D").replace("\n", "=0A")
+
+
+def format_stringv2(value):
+ """Return a vCard v2 string. Any embedded commas or semi-colons are removed."""
+ return value.replace("\\", "").replace(",", "").replace(";", "")
+
+
+def format_stringv3(value):
+ """Return a vCard v3 string. Embedded commas and semi-colons are backslash quoted"""
+ return value.replace("\\", "").replace(",", r"\,").replace(";", r"\;")
+
+
+_string_formatters = (format_stringv2, format_stringv3)
+
+
+def format_binary(value):
+ """Return base 64 encoded string"""
+ # encodestring always adds a newline so we have to strip it off
+ return base64.encodestring(value).rstrip()
+
+
+def _is_sequence(v):
+ """Determine if v is a sequence such as passed to value in out_line.
+ Note that a sequence of chars is not a sequence for our purposes."""
+ return isinstance(v, (type( () ), type([])))
+
+
+def out_line(name, attributes, value, formatter, join_char=";"):
+ """Returns a single field correctly formatted and encoded (including trailing newline)
+
+ @param name: The field name
+ @param attributes: A list of string attributes (eg "TYPE=intl,post" ). Usually
+ empty except for TEL and ADR. You can also pass in None.
+ @param value: The field value. You can also pass in a list of components which will be
+ joined with join_char such as the 6 components of N
+ @param formatter: The function that formats the value/components. See the
+ various format_ functions. They will automatically ensure that
+ ENCODING=foo attributes are added if appropriate"""
+
+ if attributes is None:
+ attributes = [] # ensure it is a list
+ else:
+ attributes = list(attributes[:]) # ensure we work with a copy
+
+ if formatter in _string_formatters:
+ if _is_sequence(value):
+ qp = False
+ for f in value:
+ f = formatter(f)
+ if myqpencodestring(f) != f:
+ qp = True
+ break
+
+ if qp:
+ attributes.append("ENCODING=QUOTED-PRINTABLE")
+ value = [myqpencodestring(f) for f in value]
+
+ value = join_char.join(value)
+ else:
+ value = formatter(value)
+ # do the qp test
+ qp = myqpencodestring(value) != value
+ if qp:
+ value = myqpencodestring(value)
+ attributes.append("ENCODING=QUOTED-PRINTABLE")
+ else:
+ assert not _is_sequence(value)
+ if formatter is not None:
+ value = formatter(value) # ::TODO:: deal with binary and other formatters and their encoding types
+
+ res = ";".join([name]+attributes)+":"
+ res += _line_reformat(value, 70, 70-len(res))
+ assert res[-1] != "\n"
+
+ return res+"\n"
+
+
+def _line_reformat(line, width=70, firstlinewidth=0):
+ """Takes line string and inserts newlines
+ and spaces on following continuation lines
+ so it all fits in width characters
+
+ @param width: how many characters to fit it in
+ @param firstlinewidth: if >0 then first line is this width.
+ if equal to zero then first line is same width as rest.
+ if <0 then first line will go immediately to continuation.
+ """
+ if firstlinewidth == 0:
+ firstlinewidth = width
+
+ if len(line) < firstlinewidth:
+ return line
+
+ res = ""
+
+ if firstlinewidth > 0:
+ res += line[:firstlinewidth]
+ line = line[firstlinewidth:]
+
+ while len(line):
+ res += "\n "+line[:width]
+ if len(line)<width:
+ break
+
+ line = line[width:]
+
+ return res
+
+def out_names(vals, formatter, limit=1):
+ res = ""
+ for v in vals[:limit]:
+ # full name
+ res += out_line("FN", None, nameparser_formatsimplename(v), formatter)
+ # name parts
+ f,m,l = nameparser_getparts(v)
+ res += out_line("N", None, (l,f,m,"",""), formatter)
+ # nickname
+ nn = v.get("nickname", "")
+
+ if len(nn):
+ res += out_line("NICKNAME", None, nn, formatter)
+
+ return res
+
+# Apple uses wrong field name so we do some futzing ...
+def out_categories(vals, formatter, field="CATEGORIES"):
+ cats = [v.get("category") for v in vals]
+ if len(cats):
+ return out_line(field, None, cats, formatter, join_char=",")
+
+ return ""
+
+
+def out_categories_apple(vals, formatter):
+ return out_categories(vals, formatter, field="CATEGORY")
+
+
+# Used for both email and urls. we don't put any limits on how many are output
+def out_eu(vals, formatter, field, bpkey):
+ res = ""
+ first = True
+ for v in vals:
+ val = v.get(bpkey)
+ type = v.get("type", "")
+
+ if len(type):
+ if type == "business":
+ type = "work" # vcard uses different name
+
+ type = type.upper()
+
+ if first:
+ type = type+",PREF"
+
+ elif first:
+ type = "PREF"
+
+ if len(type):
+ type = ["TYPE="+type+["",",INTERNET"][field == "EMAIL"]] # email also has "INTERNET"
+ else:
+ type = None
+
+ res += out_line(field, type, val, formatter)
+ first = False
+
+ return res
+
+
+def out_emails(vals, formatter):
+ return out_eu(vals, formatter, "EMAIL", "email")
+
+
+def out_urls(vals, formatter):
+ return out_eu(vals, formatter, "URL", "url")
+
+_out_tel_mapping = {
+'home': 'HOME',
+'office': 'WORK',
+'cell': 'CELL',
+'fax': 'FAX',
+'pager': 'PAGER',
+'data': 'MODEM',
+'none': 'VOICE'
+}
+
+
+def out_tel(vals, formatter):
+ # ::TODO:: limit to one type of each number
+ phones = ['phone'+str(x) for x in ['']+range(2,len(vals)+1)]
+ res = ""
+ first = True
+ idx = 0
+
+ for v in vals:
+ sp = v.get('speeddial', None)
+
+ if sp is None:
+ # no speed dial
+ res += out_line("TEL",
+ ["TYPE=%s%s" % (_out_tel_mapping[v['type']], ("", ",PREF")[first])],
+ phonenumber_format(v['number']), formatter)
+ else:
+ res += out_line(phones[idx]+".TEL",
+ ["TYPE=%s%s" % (_out_tel_mapping[v['type']], ("", ",PREF")[first])],
+ phonenumber_format(v['number']), formatter)
+ res += out_line(phones[idx]+".X-SPEEDDIAL", None, str(sp), formatter)
+ idx += 1
+ first = False
+
+ return res
+
+
+# and addresses
+def out_adr(vals, formatter):
+ # ::TODO:: limit to one type of each address, and only one org
+ res = ""
+ first = True
+ for v in vals:
+ o = v.get("company", "")
+
+ if len(o):
+ res += out_line("ORG", None, o, formatter)
+
+ if v.get("type") == "home":
+ type = "HOME"
+ else:
+ type = "WORK"
+
+ type = "TYPE="+type+("", ",PREF")[first]
+ res += out_line("ADR", [type], [v.get(k, "") for k in (None, "street2", "street", "city", "state", "postalcode", "country")], formatter)
+ first = False
+
+ return res
+
+
+def out_note(vals, formatter, limit=1):
+ return "".join([out_line("NOTE", None, v["memo"], formatter) for v in vals[:limit]])
+
+
+# Sany SCP-6600 (Katana) support
+def out_tel_scp6600(vals, formatter):
+ res = ""
+ _pref = len(vals) > 1
+
+ if _pref:
+ s = "PREF,"
+ else:
+ s = ''
+
+ for v in vals:
+ res += out_line("TEL", s,
+ ["TYPE=%s%s" % (s, _out_tel_mapping[v['type']])],
+ phonenumber_format(v['number']), formatter)
+
+ _pref = False
+
+ return res
+
+
+def out_email_scp6600(vals, formatter):
+ res = ''
+ for _idx in range(min(len(vals), 2)):
+ v = vals[_idx]
+
+ if v.get('email', None):
+ res += out_line('EMAIL', ['TYPE=INTERNET'],
+ v['email'], formatter)
+
+ return res
+
+
+def out_url_scp660(vals, formatter):
+ if vals and vals[0].get('url', None):
+ return out_line('URL', None, vals[0]['url'], formatter)
+ return ''
+
+
+def out_adr_scp6600(vals, formatter):
+ for v in vals:
+ if v.get('type', None) == 'home':
+ _type = 'HOME'
+ else:
+ _type = 'WORK'
+ return out_line("ADR", ['TYPE=%s' % _type],
+ [v.get(k, "") for k in (None, "street2", "street", "city", "state", "postalcode", "country")],
+ formatter)
+ return ''
+
+
+# This is the order we write things out to the vcard. Although
+# vCard doesn't require an ordering, it looks nicer if it
+# is (eg name first)
+_field_order = ("names", "wallpapers", "addresses", "numbers", "categories",
+ "emails", "urls", "ringtones", "flags", "memos", "serials")
+
+
+def output_entry(entry, profile, limit_fields=None):
+
+ # debug build assertion that limit_fields only contains fields we know about
+ if __debug__ and limit_fields is not None:
+ assert len([f for f in limit_fields if f not in _field_order]) == 0
+
+ fmt = profile["_formatter"]
+ io = cStringIO.StringIO()
+ io.write(out_line("BEGIN", None, "VCARD", None))
+ io.write(out_line("VERSION", None, profile["_version"], None))
+
+ if limit_fields is None:
+ fields = _field_order
+ else:
+ fields = [f for f in _field_order if f in limit_fields]
+
+ for f in fields:
+ if f in entry and f in profile:
+ func = profile[f]
+ # does it have a limit? (nice scary introspection :-)
+ if "limit" in func.func_code.co_varnames[:func.func_code.co_argcount]:
+ lines = func(entry[f], fmt, limit = profile["_limit"])
+ else:
+ lines = func(entry[f], fmt)
+ if len(lines):
+ io.write(lines)
+
+ io.write(out_line("END", None, "VCARD", fmt))
+ return io.getvalue()
+
+
+profile_vcard2 = {
+'_formatter': format_stringv2,
+'_limit': 1,
+'_version': "2.1",
+'names': out_names,
+'categories': out_categories,
+'emails': out_emails,
+'urls': out_urls,
+'numbers': out_tel,
+'addresses': out_adr,
+'memos': out_note,
+ }
+
+profile_vcard3 = profile_vcard2.copy()
+profile_vcard3['_formatter'] = format_stringv3
+profile_vcard3['_version'] = "3.0"
+
+profile_apple = profile_vcard3.copy()
+profile_apple['categories'] = out_categories_apple
+
+profile_full = profile_vcard3.copy()
+profile_full['_limit'] = 99999
+
+profile_scp6600 = profile_full.copy()
+del profile_scp6600['categories']
+
+profile_scp6600.update(
+{ 'numbers': out_tel_scp6600,
+ 'emails': out_email_scp6600,
+ 'urls': out_url_scp660,
+ 'addresses': out_adr_scp6600,
+ })
+
+profiles = {
+'vcard2': { 'description': "vCard v2.1", 'profile': profile_vcard2 },
+'vcard3': { 'description': "vCard v3.0", 'profile': profile_vcard3 },
+'apple': { 'description': "Apple", 'profile': profile_apple },
+'fullv3': { 'description': "Full vCard v3.0", 'profile': profile_full},
+'scp6600': { 'description': "Sanyo SCP-6600 (Katana)",
+ 'profile': profile_scp6600 },
+}
+
+
+
diff --git a/base/wifi.py b/base/wifi.py
new file mode 100644
index 0000000..a0c460e
--- /dev/null
+++ b/base/wifi.py
@@ -0,0 +1,655 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2009 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+# StdLib
+import time
+import cStringIO
+import xml.parsers.expat
+
+# Local
+from base.g import *
+from base import device, utils
+
+MAX_NETWORKS = 100
+MAX_RETRIES = 20
+NS = "http://www.hp.com/schemas/imaging/cnc/dcsl/2006/05/WifiConfig"
+PREAMBLE = """<?xml version="1.0" encoding="utf-8"?>
+<WiFiConfig xmlns="%s">
+""" % NS
+
+def _readWriteWifiConfig(dev, request):
+ if not request:
+ log.error("Invalid request")
+ return 'executionfailed', {}
+
+ log.debug("Sending request on wifi config channel...")
+ log.log_data(request)
+ #log.xml(request)
+
+ bytes_written = dev.writeWifiConfig(request)
+ log.debug("Wrote %d bytes." % bytes_written)
+
+ data = cStringIO.StringIO()
+ log.debug("Reading response on wifi config channel...")
+ bytesread = dev.readWifiConfig(device.MAX_BUFFER, stream=data, timeout=30)
+ i = 0
+ # if response data is > 8192 bytes, make sure we have read it all...
+ while True:
+ i += 1
+ bytesread = dev.readWifiConfig(device.MAX_BUFFER, stream=data, timeout=1)
+ if not bytesread or i > MAX_RETRIES:
+ break
+
+ data = data.getvalue()
+
+ #log.xml(repr(data))
+
+ # Convert any char references
+ data = utils.unescape(data)
+
+ #log.xml(repr(data))
+ data = unicode(data, 'utf-8')
+
+ #log.xml(repr(data))
+
+ # C4380 returns invalid XML for DeviceCapabilitiesResponse
+ # Eliminate any invalid characters
+ data = data.replace(u"Devicecapabilities", u"DeviceCapabilities").replace('\x00', '')
+
+ log.log_data(data)
+ log.debug("Read %d bytes." % len(data))
+
+ if not data:
+ log.error("No data")
+ return 'executionfailed', {}
+
+ #log.xml(data)
+
+ try:
+ params = utils.XMLToDictParser().parseXML(data)
+ except xml.parsers.expat.ExpatError, e:
+ log.error("XML parser failed: %s" % e)
+ match = re.search(r"""line\s*(\d+).*?column\s*(\d+)""", str(e), re.I)
+ if match is not None:
+ log.error(data[int(match.group(2)):])
+ return 'executionfailed', {}
+
+ #log.pprint(params)
+
+ errorreturn = 'executionfailed'
+ for p in params:
+ if p.lower().endswith('errorreturn'):
+ errorreturn = params[p].lower()
+ break
+
+ params['errorreturn'] = errorreturn
+
+ return errorreturn, params
+
+# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+
+
+def getDeviceCapabilities(dev):
+ ret = {}
+ request = PREAMBLE + """<GetDeviceCapabilitiesRequest>
+</GetDeviceCapabilitiesRequest>
+</WiFiConfig>"""
+
+ errorreturn, params = _readWriteWifiConfig(dev, request)
+ if not params:
+ return {}
+
+ ret['errorreturn'] = errorreturn
+ if errorreturn != 'ok':
+ log.error("GetDeviceCapabilities returned an error: %s" % errorreturn)
+ return ret
+
+ param_keys = ['wificonfig-getdevicecapabilitiesresponse-devicecapabilities-numberofsupportedwifiaccessories',
+ 'wificonfig-getdevicecapabilitiesresponse-interfaceversion-minorreleasenumber',
+ 'wificonfig-getdevicecapabilitiesresponse-interfaceversion-majorreleasenumber',
+ ]
+
+ for p in param_keys:
+ try:
+ ret[p.split('-')[-1]] = params[p]
+ except KeyError:
+ log.debug("Missing response key: %s" % p)
+ continue
+
+ return ret
+
+# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+
+
+def getAdaptorList(dev):
+ ret = {}
+ request = PREAMBLE + """<GetAdaptorListRequest>
+</GetAdaptorListRequest>
+</WiFiConfig>"""
+
+ errorreturn, params = _readWriteWifiConfig(dev, request)
+ if not params:
+ return {'adaptorlistlength': 0}
+
+ ret['errorreturn'] = errorreturn
+ if errorreturn != 'ok':
+ log.error("GetAdaptorList returned an error: %s" % errorreturn)
+ return ret
+
+ try:
+ adaptor_list_length = int(params['wificonfig-getadaptorlistresponse-adaptorlistlength'])
+ except (ValueError, KeyError):
+ adaptor_list_length = 0
+
+ ret['adaptorlistlength'] = adaptor_list_length
+
+ if adaptor_list_length == 0:
+ log.error("GetAdaptorList returned 0 adaptors")
+
+ elif adaptor_list_length == 1:
+ try:
+ ret['adaptorid-0'] = params['wificonfig-getadaptorlistresponse-adaptorlist-adaptorinfo-adaptorid']
+ ret['adaptorname-0'] = params['wificonfig-getadaptorlistresponse-adaptorlist-adaptorinfo-adaptorname']
+ ret['adaptorpresence-0'] = params['wificonfig-getadaptorlistresponse-adaptorlist-adaptorinfo-adaptorpresence']
+ ret['adaptorstate-0'] = params['wificonfig-getadaptorlistresponse-adaptorlist-adaptorinfo-adaptorstate']
+ ret['adaptortype-0'] = params['wificonfig-getadaptorlistresponse-adaptorlist-adaptorinfo-adaptortype']
+ except KeyError, e:
+ log.debug("Missing response key: %s" % e)
+ else:
+ for a in xrange(adaptor_list_length):
+ try:
+ ret['adaptorid-%d' % a] = params['wificonfig-getadaptorlistresponse-adaptorlist-adaptorinfo-adaptorid-%d' % a]
+ ret['adaptorname-%d' % a] = params['wificonfig-getadaptorlistresponse-adaptorlist-adaptorinfo-adaptorname-%d' % a]
+ ret['adaptorpresence-%d' % a] = params['wificonfig-getadaptorlistresponse-adaptorlist-adaptorinfo-adaptorpresence-%d' % a]
+ ret['adaptorstate-%d' % a] = params['wificonfig-getadaptorlistresponse-adaptorlist-adaptorinfo-adaptorstate-%d' % a]
+ ret['adaptortype-%d' % a] = params['wificonfig-getadaptorlistresponse-adaptorlist-adaptorinfo-adaptortype-%d' % a]
+ except KeyError, e:
+ log.debug("Missing response key: %s" % e)
+
+ return ret
+
+# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+
+def getWifiAdaptorID(dev):
+ # ret: adaptor_id, name, state, presence
+ ret = getAdaptorList(dev)
+
+ try:
+ num_adaptors = ret['adaptorlistlength']
+ except KeyError:
+ num_adaptors = 0
+
+ for n in xrange(num_adaptors):
+ try:
+ name = ret['adaptortype-%d' % n]
+ except KeyError:
+ name = ''
+
+ if name.lower() in ('wifiembedded', 'wifiaccessory'):
+ params = ['adaptorid', 'adaptorname', 'adaptorstate', 'adaptorpresence']
+
+ r = []
+ for p in params:
+ try:
+ x = ret[''.join([p, '-', str(n)])]
+ except KeyError:
+ if p == 'adaptorid':
+ x = -1
+ else:
+ x = 'Unknown'
+
+ r.append(x)
+
+ return r
+
+ return -1, 'Unknown', 'Unknown', 'Unknown'
+
+# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+
+
+def setAdaptorPower(dev, adapterName, adaptor_id=0, power_state='PowerOn'):
+ ret = {}
+ request = PREAMBLE + """<SetAdaptorPowerRequest>
+<AdaptorID>%s</AdaptorID>
+<PowerState>%s</PowerState>
+</SetAdaptorPowerRequest>
+</WiFiConfig>""" % (adaptor_id, power_state.encode('utf-8'))
+
+ errorreturn, params = _readWriteWifiConfig(dev, request)
+ if not params:
+ return {}
+
+ ret['errorreturn'] = errorreturn
+ if errorreturn != 'ok':
+ log.error("SetAdaptorPower returned an error: %s" % errorreturn)
+ return ret
+
+ return ret
+
+# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+
+
+def performScan(dev, adapterName, ssid=None):
+ ret, i, scan_state = {}, 0, "NewScan"
+
+ while True:
+ if ssid is None: # Undirected
+ request = PREAMBLE + """<UndirectedScanRequest>
+<ScanState>%s</ScanState>
+</UndirectedScanRequest>
+</WiFiConfig>""" % scan_state
+
+ typ = 'UndirectedScan'
+ rsp = 'undirectedscanresponse'
+
+ else: # Directed
+ request = PREAMBLE + """<DirectedScanRequest>
+<SSID>%s</SSID>
+<ScanState>%s</ScanState>
+</DirectedScanRequest>
+</WiFiConfig>""" % (ssid.encode('utf-8'), scan_state)
+
+ typ = 'Directed'
+ rsp = 'directedscanresponse'
+
+ errorreturn, params = _readWriteWifiConfig(dev, request)
+ if not params:
+ return {'numberofscanentries': 0}
+
+ ret['errorreturn'] = errorreturn
+ if errorreturn != 'ok':
+ log.error("%s returned an error: %s" % (typ, errorreturn))
+ return ret
+
+ try:
+ number_of_scan_entries = int(params['wificonfig-%s-numberofscanentries' % rsp])
+ except (ValueError, KeyError):
+ number_of_scan_entries = 0
+
+ ret['numberofscanentries'] = number_of_scan_entries
+
+ if number_of_scan_entries == 0:
+ if scan_state.lower() == 'scancomplete':
+ log.debug("%s returned 0 entries. Scan complete." % typ)
+ else:
+ log.debug("%s returned 0 entries. Resuming scan..." % typ)
+
+ elif number_of_scan_entries == 1:
+ try:
+ ssid = params['wificonfig-%s-scanlist-scanentry-ssid' % rsp]
+ if not ssid:
+ ret['ssid-0'] = u'(unknown)'
+ else:
+ ret['ssid-0'] = ssid
+ ret['bssid-0'] = params['wificonfig-%s-scanlist-scanentry-bssid' % rsp]
+ ret['channel-0'] = params['wificonfig-%s-scanlist-scanentry-channel' % rsp]
+ ret['communicationmode-0'] = params['wificonfig-%s-scanlist-scanentry-communicationmode' % rsp]
+ ret['dbm-0'] = params['wificonfig-%s-scanlist-scanentry-dbm' % rsp]
+ ret['encryptiontype-0'] = params['wificonfig-%s-scanlist-scanentry-encryptiontype' % rsp]
+ ret['rank-0'] = params['wificonfig-%s-scanlist-scanentry-rank' % rsp]
+ ret['signalstrength-0'] = params['wificonfig-%s-scanlist-scanentry-signalstrength' % rsp]
+ except KeyError, e:
+ log.debug("Missing response key: %s" % e)
+
+ else:
+ for a in xrange(number_of_scan_entries):
+ j = a+i
+ try:
+ ssid = params['wificonfig-%s-scanlist-scanentry-ssid-%d' % (rsp, j)]
+ if not ssid:
+ ret['ssid-%d' % j] = u'(unknown)'
+ else:
+ ret['ssid-%d' % j] = ssid
+ ret['bssid-%d' % j] = params['wificonfig-%s-scanlist-scanentry-bssid-%d' % (rsp, j)]
+ ret['channel-%d' % j] = params['wificonfig-%s-scanlist-scanentry-channel-%d' % (rsp, j)]
+ ret['communicationmode-%d' % j] = params['wificonfig-%s-scanlist-scanentry-communicationmode-%d' % (rsp, j)]
+ ret['dbm-%d' % j] = params['wificonfig-%s-scanlist-scanentry-dbm-%d' % (rsp, j)]
+ ret['encryptiontype-%d' % j] = params['wificonfig-%s-scanlist-scanentry-encryptiontype-%d' % (rsp, j)]
+ ret['rank-%d' % j] = params['wificonfig-%s-scanlist-scanentry-rank-%d' % (rsp, j)]
+ ret['signalstrength-%d' % j] = params['wificonfig-%s-scanlist-scanentry-signalstrength-%d' % (rsp, j)]
+ except KeyError, e:
+ log.debug("Missing response key: %s" % e)
+
+ try:
+ scan_state = ret['scanstate'] = params['wificonfig-%s-scanstate' % rsp] # MoreEntriesAvailable, ScanComplete
+ ret['signalstrengthmax'] = params['wificonfig-%s-scansettings-signalstrengthmax' % rsp]
+ ret['signalstrengthmin'] = params['wificonfig-%s-scansettings-signalstrengthmin' % rsp]
+ except KeyError, e:
+ log.debug("Missing response key: %s" % e)
+
+ if scan_state.lower() == 'scancomplete':
+ break
+
+ scan_state = "ResumeScan"
+ i += number_of_scan_entries
+
+ if i > MAX_NETWORKS:
+ break
+
+ time.sleep(2)
+
+ return ret
+
+# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+
+
+def associate(dev, adapterName,ssid, communication_mode, encryption_type, key):
+ ret = {}
+ request = PREAMBLE + """<AssociateRequest>
+<SSID>%s</SSID>
+<CommunicationMode>%s</CommunicationMode>
+<EncryptionType>%s</EncryptionType>
+<EncryptedParameters>%s</EncryptedParameters>
+<Key>%s</Key>
+</AssociateRequest>
+</WiFiConfig>""" % (ssid.encode('utf-8'), communication_mode.encode('utf-8'),
+ encryption_type.encode('utf-8'), u"False".encode('utf-8'),
+ key.encode('utf-8'))
+
+ errorreturn, params = _readWriteWifiConfig(dev, request)
+ if not params:
+ return {}
+
+ ret['errorreturn'] = errorreturn
+ if errorreturn != 'ok':
+ log.error("Associate returned an error: %s" % errorreturn)
+ return ret
+
+ return ret
+
+# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+
+
+def getVSACodes(dev,adapterName):
+ ret = []
+ request = PREAMBLE + """<GetVSACodesRequest>
+</GetVSACodesRequest>
+</WiFiConfig>"""
+
+ errorreturn, params = _readWriteWifiConfig(dev, request)
+ if not params:
+ return []
+
+ if errorreturn != 'ok':
+ log.error("GetVSACodes returned an error: %s" % errorreturn)
+ return ret
+
+ try:
+ rule = params['wificonfig-getvsacodesresponse-vsacodelist-vsacode-rulenumber']
+ severity = params['wificonfig-getvsacodesresponse-vsacodelist-vsacode-severity']
+ except KeyError:
+ n = 0
+ while True:
+ try:
+ rule = params['wificonfig-getvsacodesresponse-vsacodelist-vsacode-rulenumber-%d' % n]
+ except KeyError:
+ break
+
+ severity = params['wificonfig-getvsacodesresponse-vsacodelist-vsacode-severity-%d' % n]
+
+ ret.append((rule, severity))
+ n += 1
+ else:
+ ret.append((rule, severity))
+
+ return ret
+
+# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+
+def __getIPConfiguration(dev, adaptor_id=0):
+ ret = {}
+ request = PREAMBLE + """<GetIPConfigurationRequest>
+<AdaptorID>%d</AdaptorID>
+</GetIPConfigurationRequest>
+</WiFiConfig>""" % adaptor_id
+
+ errorreturn, params = _readWriteWifiConfig(dev, request)
+ if not params:
+ return {}
+
+ ret['errorreturn'] = errorreturn
+ if errorreturn != 'ok':
+ log.error("GetIPConfiguration returned an error: %s" % errorreturn)
+ return ret
+
+ param_keys = ['wificonfig-getipconfigurationresponse-ipconfiguration-addressmode',
+ 'wificonfig-getipconfigurationresponse-ipconfiguration-alternatednsaddress',
+ 'wificonfig-getipconfigurationresponse-ipconfiguration-gatewayaddress',
+ 'wificonfig-getipconfigurationresponse-ipconfiguration-ipaddress',
+ 'wificonfig-getipconfigurationresponse-ipconfiguration-primarydnsaddress',
+ 'wificonfig-getipconfigurationresponse-ipconfiguration-subnetmask',
+ 'wificonfig-getipconfigurationresponse-networkconfiguration-hostname',
+ ]
+
+ for p in param_keys:
+ try:
+ ret[p.split('-')[-1]] = params[p]
+ except KeyError:
+ log.debug("Missing response key: %s" % p)
+ continue
+
+ return ret
+
+
+def getIPConfiguration(dev, adapterName, adaptor_id=0):
+ ip, hostname, addressmode, subnetmask, gateway, pridns, sec_dns = \
+ '0.0.0.0', 'Unknown', 'Unknown', '0.0.0.0', '0.0.0.0', '0.0.0.0', '0.0.0.0'
+ ret = __getIPConfiguration(dev, adaptor_id)
+
+ if ret and ret['errorreturn'].lower() == 'ok':
+ try:
+ ip = ret['ipaddress']
+ hostname = ret['hostname']
+ addressmode = ret['addressmode']
+ subnetmask = ret['subnetmask']
+ gateway = ret['gatewayaddress']
+ pridns = ret['primarydnsaddress']
+ sec_dns = ret['alternatednsaddress']
+ except KeyError, e:
+ log.debug("Missing response key: %s" % str(e))
+
+ return ip, hostname, addressmode, subnetmask, gateway, pridns, sec_dns
+
+# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+
+def __getSignalStrength(dev, adaptor_id=0):
+ ret = {}
+ request = PREAMBLE + """<GetSignalStrengthRequest>
+<AdaptorID>%d</AdaptorID>
+</GetSignalStrengthRequest>
+</WiFiConfig>""" % adaptor_id
+
+ errorreturn, params = _readWriteWifiConfig(dev, request)
+ if not params:
+ return {}
+
+ ret['errorreturn'] = errorreturn
+ if errorreturn != 'ok':
+ log.error("GetSignalStrength returned an error: %s" % errorreturn)
+ return ret
+
+ param_keys = ['wificonfig-getsignalstrengthresponse-signalstrength-dbm',
+ 'wificonfig-getsignalstrengthresponse-signalstrength-signalstrengthmax',
+ 'wificonfig-getsignalstrengthresponse-signalstrength-signalstrengthmin',
+ 'wificonfig-getsignalstrengthresponse-signalstrength-signalstrengthvalue',
+ ]
+
+ for p in param_keys:
+ try:
+ ret[p.split('-')[-1]] = params[p]
+ except KeyError:
+ log.debug("Missing response key: %s" % p)
+ continue
+
+ return ret
+
+
+def getSignalStrength(dev, adapterName, ssid, adaptor_id=0):
+ ss_max, ss_min, ss_val, ss_dbm = 5, 0, 0, -200
+ ret = __getSignalStrength(dev, adaptor_id)
+
+ if ret and ret['errorreturn'].lower() == 'ok':
+ try:
+ ss_max = ret['signalstrengthmax']
+ ss_min = ret['signalstrengthmin']
+ ss_val = ret['signalstrengthvalue']
+ ss_dbm = ret['dbm']
+ except KeyError, e:
+ log.debug("Missing response key: %s" % str(e))
+
+ return ss_max, ss_min, ss_val, ss_dbm
+
+
+# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+
+def __getCryptoSuite(dev):
+ ret = {}
+ request = PREAMBLE + """<GetCryptoSuiteRequest>
+</GetCryptoSuiteRequest>
+</WiFiConfig>"""
+
+ errorreturn, params = _readWriteWifiConfig(dev, request)
+ if not params:
+ return {}
+
+ ret['errorreturn'] = errorreturn
+ if errorreturn != 'ok':
+ log.error("GetSignalStrength returned an error: %s" % errorreturn)
+ return ret
+
+ #log.pprint(params)
+
+ param_keys = ['wificonfig-getcryptosuiteresponse-cryposuite-crypoalgorithm',
+ 'wificonfig-getcryptosuiteresponse-cryposuite-crypomode',
+ 'wificonfig-getcryptosuiteresponse-cryposuite-secretid',]
+
+ for p in param_keys:
+ try:
+ ret[p.split('-')[-1]] = params[p]
+ except KeyError:
+ log.debug("Missing response key: %s" % p)
+ continue
+
+ return ret
+
+
+def getCryptoSuite(dev, adapterName):
+ alg, mode, secretid = '', '', ''
+ ret = __getCryptoSuite(dev)
+
+ if ret and ret['errorreturn'].lower() == 'ok':
+ try:
+ alg = ret['crypoalgorithm']
+ mode = ret['crypomode']
+ secretid = ret['secretid']
+ except KeyError, e:
+ log.debug("Missing response key: %s" % str(e))
+
+ return alg, mode, secretid
+
+# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+
+def getHostname(dev):
+ ret = ''
+ request = PREAMBLE + """<GetHostnameRequest>
+</GetHostnameRequest>
+</WiFiConfig>"""
+
+ errorreturn, params = _readWriteWifiConfig(dev, request)
+ if not params:
+ return ret
+
+ if errorreturn != 'ok':
+ # log.error("GetHostname returned an error: %s" % errorreturn)
+ return ret
+
+ try:
+ ret = params['wificonfig-gethostnameresponse-hostname']
+ except KeyError:
+ log.debug("Missing response key: hostname")
+
+ return ret
+
+# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+
+
+def getLocation(bssid, ss):
+ log.debug("Getting location for wifi AP: %s" % bssid)
+ request = """<?xml version='1.0'?>
+<LocationRQ xmlns='http://skyhookwireless.com/wps/2005' version='2.6' street-address-lookup='full'>
+<authentication version='2.0'>
+<simple>
+<username>beta</username>
+<realm>js.loki.com</realm>
+</simple>
+</authentication>
+<access-point>
+<mac>%s</mac>
+<signal-strength>%d</signal-strength>
+</access-point>
+</LocationRQ>""" % (bssid.encode("utf-8"), ss)
+
+ import httplib, socket
+ ret = {}
+ request_len = len(request)
+
+ log.log_data(request)
+
+ try:
+ conn = httplib.HTTPSConnection("api.skyhookwireless.com")
+ conn.putrequest("POST", "/wps2/location")
+ conn.putheader("Content-type", "text/xml")
+ conn.putheader("Content-Length", str(request_len))
+ conn.endheaders()
+ conn.send(request)
+ except (socket.gaierror, socket.error):
+ log.debug("Host connection error")
+ return {}
+
+ response = conn.getresponse()
+ if response.status != 200:
+ log.debug("Connection to location server failed")
+ return {}
+
+ xml = response.read()
+ log.log_data(xml)
+
+ try:
+ params = utils.XMLToDictParser().parseXML(xml)
+ except xml.parsers.expat.ExpatError:
+ return {}
+
+ if 'locationrs-error' in params:
+ log.debug("Location server returned failure")
+ return {}
+
+ ret['latitude'] = params.get('locationrs-location-latitude', 0)
+ ret['longitude'] = params.get('locationrs-location-longitude', 0)
+ street_number = params.get('locationrs-location-street-address-street-number', '')
+ street_name = params.get('locationrs-location-street-address-address-line', '')
+ city = params.get('locationrs-location-street-address-city', '')
+ country = params.get('locationrs-location-street-address-country-code', '')
+
+ address = "%s %s, %s, %s" % (street_number, street_name, city, country)
+ ret['address'] = address.strip()
+
+ return ret
+
diff --git a/check-plugin.py b/check-plugin.py
new file mode 100755
index 0000000..aed07e8
--- /dev/null
+++ b/check-plugin.py
@@ -0,0 +1,306 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2011-2014 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Suma Byrappa, Amarnath Chitumalla
+#
+#
+
+__version__ = '1.0'
+__title__ = 'AutoConfig Utility for Plug-in Installation'
+__mod__ = 'hp-check-plugin'
+__doc__ = "Auto config utility for HPLIP supported multifunction Devices for installing proprietary plug-ins."
+
+# Std Lib
+import sys
+import os
+import os.path
+import getopt
+import signal
+import operator
+import time
+
+# Local
+from base.g import *
+from base import utils, device, tui, module, pkit
+from installer import core_install
+
+
+# Temp values for testing; May not be needed
+username = ""
+device_uri = ""
+printer_name = ""
+LOG_FILE = "/var/log/hp/hplip_ac.log"
+DBUS_SERVICE='com.hplip.StatusService'
+
+##### METHODS #####
+
+# Send dbus event to hpssd on dbus system bus
+def send_message(device_uri, printer_name, event_code, username, job_id, title, pipe_name=''):
+ log.debug("send_message() entered")
+ args = [device_uri, printer_name, event_code, username, job_id, title, pipe_name]
+ msg = lowlevel.SignalMessage('/', DBUS_SERVICE, 'Event')
+ msg.append(signature='ssisiss', *args)
+
+ SystemBus().send_message(msg)
+ log.debug("send_message() returning")
+
+# plugin installation
+def install_Plugin(systray_running_status, run_directly=False):
+ if run_directly:
+ plugin = PLUGIN_REQUIRED
+ plugin_reason = PLUGIN_REASON_NONE
+ ok, sudo_ok = pkit.run_plugin_command(plugin == PLUGIN_REQUIRED, plugin_reason)
+ if not ok or not sudo_ok:
+ log.error("Failed to install plug-in.")
+ elif systray_running_status:
+ send_message( device_uri, printer_name, EVENT_AUTO_CONFIGURE, username, 0, "AutoConfig")
+ log.debug("Event EVENT_AUTO_CONFIGURE sent to hp-systray to invoke hp-plugin")
+ else:
+ log.error("Run hp-systray manually and re-plugin printer")
+ #TBD: needs to run hp-plugin in silent mode. or needs to show error UI to user.
+
+
+#install Firmware after plugin installation completion.
+def install_firmware(Plugin_Installation_Completed):
+
+ #timeout check for plugin installation
+ sleep_timeout = 6000 # 10 mins time out
+ while Plugin_Installation_Completed is False and sleep_timeout != 0:
+ time.sleep(0.3) #0.3 sec delay
+ sleep_timeout = sleep_timeout -3
+
+ ps_plugin,output = utils.Is_Process_Running('hp-plugin')
+ ps_diagnose_plugin,output = utils.Is_Process_Running('hp-diagnose_plugin')
+
+ if ps_plugin is False and ps_diagnose_plugin is False:
+ Plugin_Installation_Completed = True
+ if core.check_for_plugin() == PLUGIN_INSTALLED:
+ break
+ else:
+ log.error("Failed to download firmware required files. manually run hp-plugin command in terminal fisrt")
+ sys.exit(1)
+
+ execmd="hp-firmware"
+ options=""
+ if usb_bus_id is not None and usb_device_id is not None:
+ options += " -y3 %s:%s"%(usb_bus_id, usb_device_id)
+
+ if log_level is 'debug':
+ options += " -g"
+
+ cmd= execmd + options
+ log.info("Starting Firmware installation.")
+ log.debug("Running command : %s " %cmd)
+ Status, out=utils.run(cmd)
+
+# if Status == 0:
+# log.info("Installed firmware ")
+# else:
+# log.error("Failed to install firmware = %s" %Status)
+
+
+#Usage details
+USAGE = [(__doc__, "", "name", True),
+ ("Usage: %s [MODE] [OPTIONS]" % __mod__, "", "summary", True),
+ utils.USAGE_MODE,
+ utils.USAGE_GUI_MODE,
+ ("Run in interactive mode:", "-i or --interactive (For future use)", "option", False),
+ utils.USAGE_OPTIONS,
+ ("Install Plug-in through HP System Tray:", "-m (Default)", "option", False),
+ ("Install Plug-in through hp-plugin:", "-p", "option", False),
+ ("Download firmware into the device:", "-F", "option", False),
+ ("Download firmware into the known device:", "-f bbb:ddd, where bbb is the USB bus ID and ddd is the USB device ID. The ':' and all leading zeroes must be present", "option", False),
+ utils.USAGE_HELP,
+ utils.USAGE_LOGGING1, utils.USAGE_LOGGING2, utils.USAGE_LOGGING3,
+ utils.USAGE_NOTES,
+ ("-m and -p options can't be used together. ","","note",False),
+ ("-f and -F options can't be used together. ","","note",False)
+ ]
+
+
+def usage(typ='text'):
+ if typ == 'text':
+ utils.log_title(__title__, __version__)
+
+ utils.format_text(USAGE, typ, __title__, __mod__, __version__)
+ sys.exit(0)
+
+##### MAIN #####
+
+
+try:
+ import dbus
+ from dbus import SystemBus, lowlevel
+except ImportError:
+ log.error("hp-check-plugin Tool requires dBus and python-dbus")
+ sys.exit(1)
+try:
+ opts, args = getopt.getopt(sys.argv[1:],'l:hHuUmMf:FpPgG',['gui','help', 'help-rest', 'help-man', 'help-desc','logging='])
+
+except getopt.GetoptError, e:
+ log.error(e.msg)
+ usage()
+ sys.exit(1)
+
+if os.getenv("HPLIP_DEBUG"):
+ log.set_level('debug')
+
+log_level = 'info'
+Systray_Msg_Enabled = False
+Plugin_option_Enabled = False
+Firmware_Option_Enabled = False
+Firmware_GUI_Option_Enabled = False
+GUI_Mode = True
+Is_Plugin_Already_Installed = False
+usb_bus_id=None
+usb_device_id=None
+
+for o, a in opts:
+ if o in ('-h','-H', '--help'):
+ usage()
+
+ elif o == '--help-rest':
+ usage('rest')
+
+ elif o == '--help-man':
+ usage('man')
+
+ elif o in ('-u', '-U','--gui'):
+ # currenlty only GUI mode is supported. hence not reading this option
+ GUI_Mode = True
+
+# elif o in ('-i', '-I', '--interactive'):
+# #this is future use
+# GUI_Mode = False
+
+ elif o == '--help-desc':
+ print __doc__,
+ sys.exit(0)
+
+ elif o in ('-l', '--logging'):
+ log_level = a.lower().strip()
+
+ elif o in('-g', '-G'):
+ log_level = 'debug'
+
+ elif o in ('-m', '-M'):
+ Systray_Msg_Enabled = True
+
+ elif o in ('-p', '-P'):
+ Plugin_option_Enabled = True
+
+ elif o== '-F':
+ Firmware_GUI_Option_Enabled = True
+
+ elif o =='-f':
+ usb_bus_id, usb_device_id = a.split(":", 1)
+ Firmware_Option_Enabled = True
+
+if not log.set_level (log_level):
+ usage()
+
+LOG_FILE = os.path.normpath(LOG_FILE)
+log.info(log.bold("Saving output in log file: %s" % LOG_FILE))
+if os.path.exists(LOG_FILE):
+ os.remove(LOG_FILE)
+
+log.set_logfile(LOG_FILE)
+log.set_where(log.LOG_TO_CONSOLE_AND_FILE)
+cmd="chmod 774 "+LOG_FILE
+sts,output = utils.run(cmd)
+if sts != 0:
+ log.warn("Failed to change log file permissions: %s" %output)
+
+cmd="chgrp lp "+LOG_FILE
+sts,output = utils.run(cmd)
+if sts != 0:
+ log.warn("Failed to change log file group permissions: %s" %output)
+
+log.debug(" hp-check-plugin started")
+
+if Plugin_option_Enabled and Systray_Msg_Enabled:
+ log.error("Both -m and -p options can't be used together.")
+ usage()
+ sys.exit(1)
+
+if Firmware_GUI_Option_Enabled and Firmware_Option_Enabled:
+ log.error("Both -f and -F options can't be used together.")
+ usage()
+ sys.exit(1)
+
+if Firmware_GUI_Option_Enabled:
+ Firmware_Option_Enabled =True # Firmware_GUI_Option_Enabled is just to check both -f: and -F enabled or not
+
+if not Plugin_option_Enabled:
+ Systray_Msg_Enabled = True
+
+# checking whether HP-systray is running or not. Invokes, if systray is not running
+status,output = utils.Is_Process_Running('hp-systray')
+if status is False:
+ Systray_Is_Running=False
+ log.info("hp-systray is not running.")
+ if os.getuid() == 0:
+ log.error(" hp-systray must be running.\n Run \'hp-systray &\' in a terminal. ")
+ else:
+ log.info("Starting hp-systray service")
+ child_pid = os.fork()
+ if child_pid == 0:
+ Systray_Is_Running=True
+ status,output =utils.run('hp-systray &', True, None, 1, False)
+ if status is not 0:
+ log.error("Failed to start \'hp-systray\' service. Manually run \'hp-sysray &\' from terminal as non-root user.")
+ Systray_Is_Running=False
+
+ sys.exit()
+ else:
+ Systray_Is_Running=True
+ time.sleep(2)
+else:
+ Systray_Is_Running=True
+ log.info("hp-systray service is running\n")
+
+core = core_install.CoreInstall()
+core.set_plugin_version()
+plugin_sts = core.check_for_plugin()
+if plugin_sts == PLUGIN_INSTALLED:
+ log.info("Device Plugin is already installed")
+ Is_Plugin_Already_Installed = True
+elif plugin_sts == PLUGIN_VERSION_MISMATCH:
+ log.info("HP Device Plug-in version mismatch or some files are corrupted")
+else:
+ log.info("HP Device Plug-in is not found.")
+
+if Systray_Msg_Enabled:
+ if not Is_Plugin_Already_Installed:
+ install_Plugin( Systray_Is_Running)
+
+elif Plugin_option_Enabled:
+ if not Is_Plugin_Already_Installed:
+ install_Plugin (Systray_Is_Running, True) # needs to run hp-plugin without usig systray
+
+if Firmware_Option_Enabled:
+ if Is_Plugin_Already_Installed is False:
+ Plugin_Installation_Completed = False
+ else:
+ Plugin_Installation_Completed = True
+
+ install_firmware(Plugin_Installation_Completed)
+
+log.info()
+log.info("Done.")
diff --git a/check.py b/check.py
new file mode 100755
index 0000000..5e28306
--- /dev/null
+++ b/check.py
@@ -0,0 +1,900 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2009 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+__version__ = '14.3'
+__title__ = 'Dependency/Version Check Utility'
+__mod__ = 'hp-check'
+__doc__ = """Check the existence and versions of HPLIP dependencies. (Run as 'python ./check.py' from the HPLIP tarball before installation.)"""
+
+# Std Lib
+import sys
+import os
+import getopt
+import commands
+import re
+
+# Local
+from base.g import *
+from base import utils, tui, models
+from installer import dcheck
+from installer.core_install import *
+
+device_avail = False
+try:
+ from base import device, pml
+ # This can fail due to hpmudext not being present
+except ImportError:
+ log.debug("Device library is not avail.")
+else:
+ device_avail = True
+
+
+USAGE = [(__doc__, "", "name", True),
+ ("Usage: %s [OPTIONS]" % __mod__, "", "summary", True),
+ utils.USAGE_OPTIONS,
+ ("Compile-time check:", "-c or --compile", "option", False),
+ ("Run-time check:", "-r or --run", "option", False),
+ ("Compile and run-time checks:", "-b or --both (default)", "option", False),
+ utils.USAGE_LOGGING1, utils.USAGE_LOGGING2, utils.USAGE_LOGGING3,
+ utils.USAGE_LOGGING_PLAIN,
+ utils.USAGE_HELP,
+ utils.USAGE_NOTES,
+ ("1. For checking for the proper build environment for the HPLIP supplied tarball (.tar.gz or .run),", "", "note", False),
+ ("use the --compile or --both switches.", "", "note", False),
+ ("2. For checking for the proper runtime environment for a distro supplied package (.deb, .rpm, etc),", "", "note", False),
+ ("use the --runtime switch.", "", "note", False),
+ ]
+
+def usage(typ='text'):
+ if typ == 'text':
+ utils.log_title(__title__, __version__)
+
+ utils.format_text(USAGE, typ, __title__, __mod__, __version__)
+ sys.exit(0)
+
+
+build_str = "HPLIP will not build, install, and/or function properly without this dependency."
+
+pat_deviceuri = re.compile(r"""(.*):/(.*?)/(\S*?)\?(?:serial=(\S*)|device=(\S*)|ip=(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}[^&]*)|zc=(\S+))(?:&port=(\d))?""", re.I)
+#pat_deviceuri = re.compile(r"""(.*):/(.*?)/(\S*?)\?(?:serial=(\S*)|device=(\S*)|ip=(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}[^&]*))(?:&port=(\d))?""", re.I)
+
+pat_cups_error_log = re.compile("""^loglevel\s?(debug|debug2|warn|info|error|none)""", re.I)
+
+
+def parseDeviceURI(device_uri):
+ m = pat_deviceuri.match(device_uri)
+
+ if m is None:
+ raise Error(ERROR_INVALID_DEVICE_URI)
+
+ back_end = m.group(1).lower() or ''
+ is_hp = (back_end in ('hp', 'hpfax', 'hpaio'))
+ bus = m.group(2).lower() or ''
+
+ if bus not in ('usb', 'net', 'bt', 'fw', 'par'):
+ raise Error(ERROR_INVALID_DEVICE_URI)
+
+ model = m.group(3) or ''
+ serial = m.group(4) or ''
+ dev_file = m.group(5) or ''
+ host = m.group(6) or ''
+ zc = ''
+ if not host:
+ zc = host = m.group(7) or ''
+ port = m.group(8) or 1
+
+ if bus == 'net':
+ try:
+ port = int(port)
+ except (ValueError, TypeError):
+ port = 1
+
+ if port == 0:
+ port = 1
+
+# log.debug("%s: back_end '%s' is_hp '%s' bus '%s' model '%s' serial '%s' dev_file '%s' host '%s' zc '%s' port '%s' " %
+# (device_uri, back_end, is_hp, bus, model, serial, dev_file, host, zc, port))
+
+ return back_end, is_hp, bus, model, serial, dev_file, host, zc, port
+
+num_errors = 0
+fmt = True
+overall_commands_to_run = []
+time_flag = DEPENDENCY_RUN_AND_COMPILE_TIME
+
+try:
+ log.set_module(__mod__)
+
+ try:
+ opts, args = getopt.getopt(sys.argv[1:], 'hl:gtcrb',
+ ['help', 'help-rest', 'help-man', 'help-desc', 'logging=',
+ 'run', 'runtime', 'compile', 'both'])
+
+ except getopt.GetoptError, e:
+ log.error(e.msg)
+ usage()
+ sys.exit(1)
+
+ if os.getenv("HPLIP_DEBUG"):
+ log.set_level('debug')
+
+ log_level = 'info'
+
+ for o, a in opts:
+ if o in ('-h', '--help'):
+ usage()
+
+ elif o == '--help-rest':
+ usage('rest')
+
+ elif o == '--help-man':
+ usage('man')
+
+ elif o == '--help-desc':
+ print __doc__,
+ sys.exit(0)
+
+ elif o in ('-l', '--logging'):
+ log_level = a.lower().strip()
+
+ elif o == '-g':
+ log_level = 'debug'
+
+ elif o == '-t':
+ fmt = False
+
+ elif o in ('-c', '--compile'):
+ time_flag = DEPENDENCY_COMPILE_TIME
+
+ elif o in ('-r', '--runtime', '--run'):
+ time_flag = DEPENDENCY_RUN_TIME
+
+ elif o in ('-b', '--both'):
+ time_flag = DEPENDENCY_RUN_AND_COMPILE_TIME
+
+ if not log.set_level(log_level):
+ usage()
+
+ if not fmt:
+ log.no_formatting()
+
+ utils.log_title(__title__, __version__)
+
+ log.info(log.bold("Note: hp-check can be run in three modes:"))
+
+ for l in tui.format_paragraph("1. Compile-time check mode (-c or --compile): Use this mode before compiling the HPLIP supplied tarball (.tar.gz or .run) to determine if the proper dependencies are installed to successfully compile HPLIP."):
+ log.info(l)
+
+ for l in tui.format_paragraph("2. Run-time check mode (-r or --run): Use this mode to determine if a distro supplied package (.deb, .rpm, etc) or an already built HPLIP supplied tarball has the proper dependencies installed to successfully run."):
+ log.info(l)
+
+ for l in tui.format_paragraph("3. Both compile- and run-time check mode (-b or --both) (Default): This mode will check both of the above cases (both compile- and run-time dependencies)."):
+ log.info(l)
+
+ log.info()
+
+ log_file = os.path.normpath('./hp-check.log')
+ log.info(log.bold("Saving output in log file: %s" % log_file))
+ log.debug("Log file=%s" % log_file)
+ if os.path.exists(log_file):
+ os.remove(log_file)
+
+ log.set_logfile(log_file)
+ log.set_where(log.LOG_TO_CONSOLE_AND_FILE)
+
+ log.info("\nInitializing. Please wait...")
+ core = CoreInstall(MODE_CHECK)
+ core.init()
+ core.set_plugin_version()
+
+ tui.header("SYSTEM INFO")
+
+ log.info(log.bold("Basic system information:"))
+ log.info(core.sys_uname_info)
+
+ log.info()
+ log.info(log.bold("Distribution:"))
+ log.info("%s %s" % (core.distro_name, core.distro_version))
+
+ #log.info(log.bold("\nHPOJ running?"))
+
+ #if core.hpoj_present:
+ #log.error("Yes, HPOJ is running. HPLIP is not compatible with HPOJ. To run HPLIP, please remove HPOJ.")
+ #num_errors += 1
+ #else:
+ #log.info("No, HPOJ is not running (OK).")
+
+
+ log.info()
+ log.info(log.bold("Checking Python version..."))
+ ver = sys.version_info
+ log.debug("sys.version_info = %s" % repr(ver))
+ ver_maj = ver[0]
+ ver_min = ver[1]
+ ver_pat = ver[2]
+
+ if ver_maj == 2:
+ if ver_min >= 1:
+ log.info("OK, version %d.%d.%d installed" % ver[:3])
+ else:
+ log.error("Version %d.%d.%d installed. Please update to Python >= 2.1" % ver[:3])
+ sys.exit(1)
+
+ ui_toolkit = sys_conf.get('ui_toolkit', 'qt4')
+ if ui_toolkit == 'qt3':
+ log.info()
+ log.info(log.bold("Checking PyQt 3.x version..."))
+
+ # PyQt 3
+ try:
+ import qt
+ except ImportError:
+ num_errors += 1
+ log.error("NOT FOUND OR FAILED TO LOAD!")
+ else:
+ # check version of Qt
+ qtMajor = int(qt.qVersion().split('.')[0])
+
+ if qtMajor < MINIMUM_QT_MAJOR_VER:
+ log.error("Incorrect version of Qt installed. Ver. 3.0.0 or greater required.")
+ else:
+ #check version of PyQt
+ try:
+ pyqtVersion = qt.PYQT_VERSION_STR
+ except AttributeError:
+ pyqtVersion = qt.PYQT_VERSION
+
+ while pyqtVersion.count('.') < 2:
+ pyqtVersion += '.0'
+
+ (maj_ver, min_ver, pat_ver) = pyqtVersion.split('.')
+
+ if pyqtVersion.find('snapshot') >= 0:
+ log.error("A non-stable snapshot version of PyQt is installed (%s)." % pyqtVersion)
+ num_errors += 1
+ else:
+ try:
+ maj_ver = int(maj_ver)
+ min_ver = int(min_ver)
+ pat_ver = int(pat_ver)
+ except ValueError:
+ maj_ver, min_ver, pat_ver = 0, 0, 0
+
+ if maj_ver < MINIMUM_PYQT_MAJOR_VER or \
+ (maj_ver == MINIMUM_PYQT_MAJOR_VER and min_ver < MINIMUM_PYQT_MINOR_VER):
+ num_errors += 1
+ log.error("HPLIP may not function properly with the version of PyQt that is installed (%d.%d.%d)." % (maj_ver, min_ver, pat_ver))
+ log.error("Ver. %d.%d or greater required." % (MINIMUM_PYQT_MAJOR_VER, MINIMUM_PYQT_MINOR_VER))
+ else:
+ log.info("OK, version %d.%d installed." % (maj_ver, min_ver))
+ del qt
+
+
+ else:
+
+ log.info()
+ log.info(log.bold("Checking PyQt 4.x version..."))
+
+ # PyQt 4
+ try:
+ import PyQt4
+ except ImportError:
+ num_errors += 1
+ log.error("NOT FOUND OR FAILED TO LOAD!")
+ else:
+ from PyQt4 import QtCore
+ log.info("OK, version %s installed." % QtCore.PYQT_VERSION_STR)
+
+
+# log.info()
+# log.info(log.bold("Checking SIP version..."))
+#
+# sip_ver = None
+# try:
+# import pyqtconfig
+# except ImportError:
+# pass
+# else:
+# sip_ver = pyqtconfig.Configuration().sip_version_str
+#
+# if sip_ver is not None:
+# log.info("OK, Version %s installed" % sip_ver)
+# else:
+# num_errors += 1
+# log.error("SIP not installed or version not found.")
+
+ log.info()
+ log.info(log.bold("Checking for CUPS..."))
+ cups_ok = True
+
+ status, output = utils.run('lpstat -r')
+ if status == 0:
+ log.info("Status: %s" % output.strip())
+ else:
+ log.error("Status: (Not available. CUPS may not be installed or not running.)")
+ cups_ok = False
+ num_errors += 1
+
+ if cups_ok:
+ status, output = utils.run('cups-config --version')
+ if status == 0:
+ log.info("Version: %s" % output.strip())
+ else:
+ log.warn("Version: (cups-config) Not available. Unable to determine installed version of CUPS.)")
+
+ if cups_ok:
+ cups_conf = '/etc/cups/cupsd.conf'
+
+ try:
+ f = file(cups_conf, 'r')
+ except (IOError, OSError):
+ log.warn("%s file not found or not accessible." % cups_conf)
+ else:
+ for l in f:
+ m = pat_cups_error_log.match(l)
+ if m is not None:
+ level = m.group(1).lower()
+ log.info("error_log is set to level: %s" % level)
+
+ #if level not in ('debug', 'debug2'):
+ #log.note("For troubleshooting printing issues, it is best to have the CUPS 'LogLevel'")
+ #log.note("set to 'debug'. To set the LogLevel to debug, edit the file %s (as root)," % cups_conf)
+ #log.note("and change the line near the top of the file that begins with 'LogLevel' to read:")
+ #log.note("LogLevel debug")
+ #log.note("Save the file and then restart CUPS (see your OS/distro docs on how to restart CUPS).")
+ #log.note("Now, when you print, helpful debug information will be saved to the file:")
+ #log.note("/var/log/cups/error_log")
+ #log.note("You can monitor this file by running this command in a console/shell:")
+ #log.note("tail -f /var/log/cups/error_log")
+
+ break
+
+
+ log.info()
+
+ log.info(log.bold("Checking for dbus/python-dbus..."))
+
+ if dcheck.check_ps(['dbus-daemon']):
+ log.info("dbus daemon is running.")
+ else:
+ log.warn("dbus daemon is not running.")
+
+ try:
+ import dbus
+ try:
+ log.info("python-dbus version: %s" % dbus.__version__)
+ except AttributeError:
+ try:
+ log.info("python-dbus version: %s" % '.'.join([str(x) for x in dbus.version]))
+ except AttributeError:
+ log.warn("python-dbus imported OK, but unknown version.")
+ except ImportError:
+ log.warn("python-dbus not installed.")
+
+ log.info()
+
+
+ if time_flag == DEPENDENCY_RUN_AND_COMPILE_TIME:
+ tui.header("COMPILE AND RUNTIME DEPENDENCIES")
+ log.note("To check for compile-time only dependencies, re-run hp-check with the -c parameter (ie, hp-check -c).")
+ log.note("To check for run-time only dependencies, re-run hp-check with the -r parameter (ie, hp-check -r).")
+
+ elif time_flag == DEPENDENCY_COMPILE_TIME:
+ tui.header("COMPILE TIME DEPENDENCIES")
+
+ elif time_flag == DEPENDENCY_RUN_TIME:
+ tui.header("RUNTIME DEPENDENCIES")
+
+ log.info()
+
+ dd = core.dependencies.keys()
+
+ status, output = utils.run('cups-config --version')
+ import string
+ if status == 0 and (string.count(output, '.') == 1 or string.count(output, '.') == 2):
+ if string.count(output, '.') == 1:
+ major, minor = string.split(output, '.', 2)
+ if string.count(output, '.') == 2:
+ major, minor, release = string.split(output, '.', 3)
+ if len(minor) > 1 and minor[1] >= '0' and minor[1] <= '9':
+ minor = ((ord(minor[0]) - ord('0')) * 10) + (ord(minor[1]) - ord('0'))
+ else:
+ minor = ord(minor[0]) - ord('0')
+ if major > '1' or (major == '1' and minor >= 4):
+ dd.remove('cups-ddk')
+
+ dd.sort()
+ for d in dd:
+ if (d == 'pyqt' and ui_toolkit != 'qt3') or \
+ (d == 'pyqt4' and ui_toolkit != 'qt4'):
+ continue
+
+ log.debug("***")
+
+ if time_flag == DEPENDENCY_RUN_AND_COMPILE_TIME or time_flag == core.dependencies[d][4]:
+
+ log.info(log.bold("Checking for dependency: %s..." % core.dependencies[d][2]))
+
+ if core.have_dependencies[d]:
+ log.info("OK, found.")
+ else:
+ num_errors += 1
+
+ if core.dependencies[d][4] == DEPENDENCY_RUN_AND_COMPILE_TIME:
+ s = ''
+ elif core.dependencies[d][4] == DEPENDENCY_COMPILE_TIME:
+ s = '/COMPILE TIME ONLY'
+
+ elif core.dependencies[d][4] == DEPENDENCY_RUN_TIME:
+ s = '/RUNTIME ONLY'
+
+ if core.dependencies[d][0]:
+ log.error("NOT FOUND! This is a REQUIRED%s dependency. Please make sure that this dependency is installed before installing or running HPLIP." % s)
+ else:
+ log.warn("NOT FOUND! This is an OPTIONAL%s dependency. Some HPLIP functionality may not function properly." %s)
+
+ if core.distro_supported():
+ packages_to_install, commands = core.get_dependency_data(d)
+
+ commands_to_run = []
+
+ if packages_to_install:
+ package_mgr_cmd = core.get_distro_data('package_mgr_cmd')
+
+ if package_mgr_cmd:
+ packages_to_install = ' '.join(packages_to_install)
+ commands_to_run.append(utils.cat(package_mgr_cmd))
+
+ if commands:
+ commands_to_run.extend(commands)
+
+ overall_commands_to_run.extend(commands_to_run)
+
+ if len(commands_to_run) == 1:
+ log.info("To install this dependency, execute this command:")
+ log.info(commands_to_run[0])
+
+ elif len(commands_to_run) > 1:
+ log.info("To install this dependency, execute these commands:")
+ for c in commands_to_run:
+ log.info(c)
+
+
+ log.info()
+
+ if time_flag in (DEPENDENCY_RUN_TIME, DEPENDENCY_RUN_AND_COMPILE_TIME):
+ tui.header("HPLIP INSTALLATION")
+
+ scanning_enabled = utils.to_bool(sys_conf.get('configure', 'scanner-build', '0'))
+
+ log.info()
+ log.info(log.bold("Currently installed HPLIP version..."))
+ v = sys_conf.get('hplip', 'version')
+ home = sys_conf.get('dirs', 'home')
+
+ if v:
+ log.info("HPLIP %s currently installed in '%s'." % (v, home))
+
+ log.info()
+ log.info(log.bold("Current contents of '/etc/hp/hplip.conf' file:"))
+ try:
+ output = file('/etc/hp/hplip.conf', 'r').read()
+ except (IOError, OSError), e:
+ log.error("Could not access file: %s" % e.strerror)
+ else:
+ log.info(output)
+
+ log.info()
+ log.info(log.bold("Current contents of '/var/lib/hp/hplip.state' file:"))
+ try:
+ output = file(os.path.expanduser('/var/lib/hp/hplip.state'), 'r').read()
+ except (IOError, OSError), e:
+ log.info("Plugins are not installed. Could not access file: %s" % e.strerror)
+ else:
+ log.info(output)
+
+ log.info()
+ log.info(log.bold("Current contents of '~/.hplip/hplip.conf' file:"))
+ try:
+ output = file(os.path.expanduser('~/.hplip/hplip.conf'), 'r').read()
+ except (IOError, OSError), e:
+ log.error("Could not access file: %s" % e.strerror)
+ else:
+ log.info(output)
+
+ else:
+ log.info("Not found.")
+
+
+ if device_avail:
+ #if prop.par_build:
+ #tui.header("DISCOVERED PARALLEL DEVICES")
+
+ #devices = device.probeDevices(['par'])
+
+ #if devices:
+ #f = tui.Formatter()
+ #f.header = ("Device URI", "Model")
+
+ #for d, dd in devices.items():
+ #f.add((d, dd[0]))
+
+ #f.output()
+
+ #else:
+ #log.info("No devices found.")
+
+ #if not core.have_dependencies['ppdev']:
+ #log.error("'ppdev' kernel module not loaded.")
+
+ if prop.usb_build:
+ tui.header("DISCOVERED USB DEVICES")
+
+ devices = device.probeDevices(['usb'])
+
+ if devices:
+ f = tui.Formatter()
+ f.header = ("Device URI", "Model")
+
+ for d, dd in devices.items():
+ f.add((d, dd[0]))
+
+ f.output()
+
+ else:
+ log.info("No devices found.")
+
+
+ tui.header("INSTALLED CUPS PRINTER QUEUES")
+
+ lpstat_pat = re.compile(r"""(\S*): (.*)""", re.IGNORECASE)
+ status, output = utils.run('lpstat -v')
+ log.info()
+
+ cups_printers = []
+ for p in output.splitlines():
+ try:
+ match = lpstat_pat.search(p)
+ printer_name = match.group(1)
+ device_uri = match.group(2)
+ cups_printers.append((printer_name, device_uri))
+ except AttributeError:
+ pass
+
+ log.debug(cups_printers)
+
+ if cups_printers:
+ #non_hp = False
+ for p in cups_printers:
+ printer_name, device_uri = p
+
+ if device_uri.startswith("cups-pdf:/") or \
+ device_uri.startswith('ipp://'):
+ continue
+
+ try:
+ back_end, is_hp, bus, model, serial, dev_file, host, zc, port = \
+ parseDeviceURI(device_uri)
+ except Error:
+ back_end, is_hp, bus, model, serial, dev_file, host, zc, port = \
+ '', False, '', '', '', '', '', '', 1
+
+ #print back_end, is_hp, bus, model, serial, dev_file, host, zc, port
+
+ log.info(log.bold(printer_name))
+ log.info(log.bold('-'*len(printer_name)))
+
+ x = "Unknown"
+ if back_end == 'hpfax':
+ x = "Fax"
+ elif back_end == 'hp':
+ x = "Printer"
+
+ log.info("Type: %s" % x)
+
+ #if is_hp:
+ # x = 'Yes, using the %s: CUPS backend.' % back_end
+ #else:
+ # x = 'No, not using the hp: or hpfax: CUPS backend.'
+ # non_hp = True
+
+ #log.info("Installed in HPLIP?: %s" % x)
+ log.info("Device URI: %s" % device_uri)
+
+ ppd = os.path.join('/etc/cups/ppd', printer_name + '.ppd')
+
+ if os.path.exists(ppd):
+ log.info("PPD: %s" % ppd)
+ nickname_pat = re.compile(r'''\*NickName:\s*\"(.*)"''', re.MULTILINE)
+
+ f = file(ppd, 'r').read(4096)
+
+ try:
+ desc = nickname_pat.search(f).group(1)
+ except AttributeError:
+ desc = ''
+
+ log.info("PPD Description: %s" % desc)
+
+ status, output = utils.run('lpstat -p%s' % printer_name)
+ log.info("Printer status: %s" % output.replace("\n", ""))
+
+ if back_end == 'hpfax' and not 'HP Fax' in desc:
+ num_errors += 1
+ log.error("Incorrect PPD file for fax queue '%s'. Fax queues must use 'HP-Fax-hplip.ppd'." % printer_name)
+
+ elif back_end == 'hp' and 'HP Fax' in desc:
+ num_errors += 1
+ log.error("Incorrect PPD file for a print queue '%s'. Print queues must not use 'HP-Fax-hplip.ppd'." % printer_name)
+
+ elif back_end not in ('hp', 'hpfax'):
+ log.warn("Printer is not HPLIP installed. Printers must use the hp: or hpfax: CUPS backend to function in HPLIP.")
+ num_errors += 1
+
+ if device_avail and is_hp:
+ d = None
+ try:
+ try:
+ d = device.Device(device_uri)
+ except Error:
+ log.error("Device initialization failed.")
+ continue
+
+ plugin = d.mq.get('plugin', PLUGIN_NONE)
+ if plugin in (PLUGIN_REQUIRED, PLUGIN_OPTIONAL):
+ plugin_sts = core.check_for_plugin()
+ if plugin_sts == PLUGIN_INSTALLED:
+ if plugin == PLUGIN_REQUIRED:
+ log.info("Required plug-in status: Installed")
+ else:
+ log.info("Optional plug-in status: Installed")
+ elif plugin_sts == PLUGIN_VERSION_MISMATCH:
+ num_errors += 1
+ log.warn("Optional plug-in status: Version mismatch")
+
+ else:
+ num_errors += 1
+ if plugin == PLUGIN_REQUIRED:
+ log.error("Required plug-in status: Not installed")
+ else:
+ log.warn("Optional plug-in status: Not installed")
+
+
+ if bus in ('par', 'usb'):
+ try:
+ d.open()
+ except Error, e:
+ log.error(e.msg)
+ deviceid = ''
+ else:
+ deviceid = d.getDeviceID()
+ log.debug(deviceid)
+
+ #print deviceid
+ if not deviceid:
+ log.error("Communication status: Failed")
+ #error_code = pml.ERROR_COMMAND_EXECUTION
+ num_errors += 1
+ else:
+ log.info("Communication status: Good")
+
+ elif bus == 'net':
+ try:
+ error_code, deviceid = d.getPML(pml.OID_DEVICE_ID)
+ except Error:
+ #log.error("Communication with device failed.")
+ #error_code = pml.ERROR_COMMAND_EXECUTION
+ pass
+
+ #print error_code
+ if not deviceid:
+ log.error("Communication status: Failed")
+ num_errors += 1
+ else:
+ log.info("Communication status: Good")
+
+ finally:
+ if d is not None:
+ d.close()
+
+ log.info()
+
+
+
+ else:
+ log.warn("No queues found.")
+
+ if scanning_enabled:
+ tui.header("SANE CONFIGURATION")
+ log.info(log.bold("'hpaio' in '/etc/sane.d/dll.conf'..."))
+ try:
+ f = file('/etc/sane.d/dll.conf', 'r')
+ except IOError:
+ log.error("'/etc/sane.d/dll.conf' not found. Is SANE installed?")
+ num_errors += 1
+ else:
+ found = False
+ for line in f:
+ lineNoSpace = re.sub(r'\s', '', line)
+ hpaiomatched=re.match('hpaio',lineNoSpace)
+# if 'hpaio' in line:
+ if hpaiomatched:
+ found = True
+
+ if found:
+ log.info("OK, found. SANE backend 'hpaio' is properly set up.")
+ else:
+ num_errors += 1
+ log.error("Not found. SANE backend 'hpaio' NOT properly setup (needs to be added to /etc/sane.d/dll.conf).")
+
+ log.info()
+ log.info(log.bold("Checking output of 'scanimage -L'..."))
+ if utils.which('scanimage'):
+ status, output = utils.run("scanimage -L")
+ log.info(output)
+ else:
+ log.error("scanimage not found.")
+
+ tui.header("PYTHON EXTENSIONS")
+
+ log.info(log.bold("Checking 'cupsext' CUPS extension..."))
+ try:
+ import cupsext
+ except ImportError:
+ num_errors += 1
+ log.error("NOT FOUND OR FAILED TO LOAD! Please reinstall HPLIP and check for the proper installation of cupsext.")
+ else:
+ log.info("OK, found.")
+
+ log.info()
+ log.info(log.bold("Checking 'pcardext' Photocard extension..."))
+ try:
+ import pcardext
+ except ImportError:
+ num_errors += 1
+ log.error("NOT FOUND OR FAILED TO LOAD! Please reinstall HPLIP and check for the proper installation of pcardext.")
+ else:
+ log.info("OK, found.")
+
+ log.info()
+ log.info(log.bold("Checking 'hpmudext' I/O extension..."))
+ try:
+ import hpmudext
+ hpmudext_avail = True
+ except ImportError:
+ hpmudext_avail = False
+ num_errors += 1
+ log.error("NOT FOUND OR FAILED TO LOAD! Please reinstall HPLIP and check for the proper installation of hpmudext.")
+ else:
+ log.info("OK, found.")
+
+ if scanning_enabled:
+ log.info()
+ log.info(log.bold("Checking 'scanext' SANE scanning extension..."))
+ try:
+ import scanext
+ except ImportError:
+ num_errors += 1
+ log.error("NOT FOUND OR FAILED TO LOAD! Please reinstall HPLIP and check for the proper installation of scanext.")
+ else:
+ log.info("OK, found.")
+
+ log.info()
+
+
+ if hpmudext_avail:
+ lsusb = utils.which('lsusb')
+ if lsusb:
+ log.info()
+
+ lsusb = os.path.join(lsusb, 'lsusb')
+ status, output = utils.run("%s -d03f0:" % lsusb)
+
+ if output:
+ tui.header("USB I/O SETUP")
+ log.info(log.bold("Checking for permissions of USB attached printers..."))
+
+ lsusb_pat = re.compile("""^Bus\s([0-9a-fA-F]{3,3})\sDevice\s([0-9a-fA-F]{3,3}):\sID\s([0-9a-fA-F]{4,4}):([0-9a-fA-F]{4,4})(.*)""", re.IGNORECASE)
+ log.debug(output)
+
+ for o in output.splitlines():
+ ok = True
+ match = lsusb_pat.search(o)
+
+ if match is not None:
+ bus, dev, vid, pid, mfg = match.groups()
+ log.info("\nHP Device 0x%x at %s:%s: " % (int(pid, 16), bus, dev))
+ result_code, deviceuri = hpmudext.make_usb_uri(bus, dev)
+
+ if result_code == hpmudext.HPMUD_R_OK:
+ log.info(" Device URI: %s" % deviceuri)
+ d = None
+ try:
+ d = device.Device(deviceuri)
+ except Error:
+ continue
+ if not d.supported:
+ continue
+ else:
+ log.warn(" Device URI: (Makeuri FAILED)")
+ continue
+
+ devnode = os.path.join("/", "dev", "bus", "usb", bus, dev)
+
+ if not os.path.exists(devnode):
+ devnode = os.path.join("/", "proc", "bus", "usb", bus, dev)
+
+ if os.path.exists(devnode):
+ log.info(" Device node: %s" % devnode)
+
+ st_mode, st_ino, st_dev, st_nlink, st_uid, st_gid, \
+ st_size, st_atime, st_mtime, st_ctime = \
+ os.stat(devnode)
+
+ log.info(" Mode: 0%o" % (st_mode & 0777))
+
+ getfacl = utils.which('getfacl')
+ if getfacl:
+ getfacl = os.path.join(getfacl, "getfacl")
+
+ status, output = utils.run("%s %s" % (getfacl, devnode))
+
+ log.info(output)
+
+ tui.header("USER GROUPS")
+
+ groups = utils.which('groups')
+ if groups:
+ groups = os.path.join(groups, 'groups')
+ status, output = utils.run(groups)
+
+ if status == 0:
+ log.info(output)
+
+
+ tui.header("SUMMARY")
+
+ if num_errors:
+ if num_errors == 1:
+ log.error("1 error or warning.")
+ else:
+ log.error("%d errors and/or warnings." % num_errors)
+
+ if overall_commands_to_run:
+ log.info()
+ log.info(log.bold("Summary of needed commands to run to satisfy missing dependencies:"))
+ for c in overall_commands_to_run:
+ log.info(c)
+
+ log.info()
+ log.info("Please refer to the installation instructions at:")
+ log.info("http://hplip.sourceforge.net/install/index.html\n")
+
+ else:
+ log.info(log.green("No errors or warnings."))
+
+except KeyboardInterrupt:
+ log.error("User exit")
+
+log.info()
+log.info("Done.")
+
diff --git a/clean.py b/clean.py
new file mode 100755
index 0000000..027e2df
--- /dev/null
+++ b/clean.py
@@ -0,0 +1,194 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2008 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+__version__ = '4.0'
+__title__ = 'Printer Cartridge Cleaning Utility'
+__mod__ = 'hp-clean'
+__doc__ = "Cartridge cleaning utility for HPLIP supported inkjet printers."
+
+#Std Lib
+import sys
+import re
+import getopt
+import time
+import operator
+import os
+
+# Local
+from base.g import *
+from base import device, utils, maint, tui, module
+from prnt import cups
+
+
+def CleanUIx(level):
+ global d
+ ok = tui.continue_prompt("Ready to perform level %d cleaning (Note: Wait for previous print to finish)." % level)
+
+ if ok:
+ timeout = 0
+ time.sleep(5)
+
+ try:
+ while True:
+ update_spinner()
+ try:
+ d.open()
+ except Error:
+ time.sleep(2)
+ timeout += 2
+ continue
+
+ if d.isIdleAndNoError():
+ break
+
+ time.sleep(1)
+ timeout += 1
+
+ if timeout > 45:
+ log.error("Timeout waiting for print to finish.")
+ sys.exit(0)
+
+
+ finally:
+ cleanup_spinner()
+ d.close()
+
+ return ok
+
+def CleanUI1():
+ log.note("Please wait for page to complete printing before continuing.")
+ log.info("\nLevel 1 cleaning complete. If the printout looks OK, enter 'q' to quit or <enter> to do a level 2 cleaning.")
+ return CleanUIx(2)
+
+
+def CleanUI2():
+ log.note("Please wait for page to complete printing before continuing.")
+ log.info("\nLevel 2 cleaning complete. If the printout looks OK, enter 'q' to quit or <enter> to do a level 3 cleaning.")
+ log.warn("Level 3 uses a lot of ink.")
+ return CleanUIx(3)
+
+def CleanUI3():
+ log.info("\nLevel 3 cleaning complete. Check this page to see if the problem was fixed. If the test page was not printed OK, replace the print cartridge(s).")
+
+
+try:
+ mod = module.Module(__mod__, __title__, __version__, __doc__, None,
+ (INTERACTIVE_MODE, GUI_MODE), (UI_TOOLKIT_QT4,))
+
+ mod.setUsage(module.USAGE_FLAG_DEVICE_ARGS,
+ see_also_list=['hp-align', 'hp-clean', 'hp-linefeedcal',
+ 'hp-pqdiag'])
+
+ opts, device_uri, printer_name, mode, ui_toolkit, lang = \
+ mod.parseStdOpts()
+
+ device_uri = mod.getDeviceUri(device_uri, printer_name,
+ filter={'clean-type': (operator.ne, CLEAN_TYPE_NONE)})
+
+ if mode == GUI_MODE:
+ if not utils.canEnterGUIMode4():
+ log.error("%s -u/--gui requires Qt4 GUI support. Entering interactive mode." % __mod__)
+ mode = INTERACTIVE_MODE
+
+ if mode == INTERACTIVE_MODE:
+ try:
+ d = device.Device(device_uri, printer_name)
+ except Error, e:
+ log.error("Unable to open device: %s" % e.msg)
+ sys.exit(0)
+
+ try:
+ try:
+ d.open()
+ except Error:
+ log.error("Unable to print to printer. Please check device and try again.")
+ sys.exit(1)
+
+ if d.isIdleAndNoError():
+ clean_type = d.mq.get('clean-type', CLEAN_TYPE_NONE)
+ log.debug("Clean type=%d" % clean_type)
+ d.close()
+
+ try:
+ if clean_type == CLEAN_TYPE_UNSUPPORTED:
+ log.error("Cleaning through HPLIP not supported for this printer. Please use the printer's front panel to perform cartridge cleaning.")
+
+ elif clean_type == CLEAN_TYPE_PCL:
+ maint.cleaning(d, clean_type, maint.cleanType1, maint.primeType1,
+ maint.wipeAndSpitType1, tui.load_paper_prompt,
+ CleanUI1, CleanUI2, CleanUI3,
+ None)
+
+ elif clean_type == CLEAN_TYPE_LIDIL:
+ maint.cleaning(d, clean_type, maint.cleanType2, maint.primeType2,
+ maint.wipeAndSpitType2, tui.load_paper_prompt,
+ CleanUI1, CleanUI2, CleanUI3,
+ None)
+
+ elif clean_type == CLEAN_TYPE_PCL_WITH_PRINTOUT:
+ maint.cleaning(d, clean_type, maint.cleanType1, maint.primeType1,
+ maint.wipeAndSpitType1, tui.load_paper_prompt,
+ CleanUI1, CleanUI2, CleanUI3,
+ None)
+
+ else:
+ log.error("Cleaning not needed or supported on this device.")
+
+ except Error, e:
+ log.error("An error occured: %s" % e[0])
+
+ else:
+ log.error("Device is busy or in an error state. Please check device and try again.")
+ sys.exit(1)
+ finally:
+ d.close()
+
+ else:
+ try:
+ from PyQt4.QtGui import QApplication
+ from ui4.cleandialog import CleanDialog
+ except ImportError:
+ log.error("Unable to load Qt4 support. Is it installed?")
+ sys.exit(1)
+
+
+ #try:
+ if 1:
+ app = QApplication(sys.argv)
+
+ dlg = CleanDialog(None, device_uri)
+ dlg.show()
+ try:
+ log.debug("Starting GUI loop...")
+ app.exec_()
+ except KeyboardInterrupt:
+ sys.exit(0)
+
+ #finally:
+ if 1:
+ sys.exit(0)
+
+except KeyboardInterrupt:
+ log.error("User exit")
+
+log.info("")
+log.info("Done.")
diff --git a/colorcal.py b/colorcal.py
new file mode 100755
index 0000000..648b718
--- /dev/null
+++ b/colorcal.py
@@ -0,0 +1,255 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2009 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+__version__ = '3.0'
+__title__ = 'Printer Cartridge Color Calibration Utility'
+__mod__ = 'hp-colorcal'
+__doc__ = "Perform color calibration on HPLIP supported inkjet printers. (Note: Not all printers require the use of this utility)."
+
+# Std Lib
+import sys
+import re
+import getopt
+import operator
+import os
+
+# Local
+from base.g import *
+from base import device, status, utils, maint, tui, module
+from prnt import cups
+
+
+def enterAlignmentNumber(letter, hortvert, colors, minimum, maximum):
+ return tui.enter_range("Enter the best aligned value for line %s (%d-%d or q=quit): " %
+ (letter, minimum, maximum), minimum, maximum)
+
+def enterPaperEdge(maximum):
+ return tui.enter_range("Enter numbered arrow that is best aligned with the paper edge (1-%d or q=quit): " %
+ maximum, 1, maximum)
+
+def colorAdj(line, maximum):
+ return tui.enter_range("Enter the numbered box on line %s that is best color matched to the background color (1-%d or q=quit): " %
+ (line, maximum), 1, maximum)
+
+def colorCal():
+ return tui.enter_range("""Enter the numbered image labeled "1" thru "7" that is best color matched to the image labeled "X""", 1, 7)
+
+def colorCal2():
+ return tui.enter_range("""Select the number between 1 and 81 of the numbered patch that best matches the background.""", 1, 81)
+
+def invalidPen():
+ log.error("Invalid cartridge(s) installed.\nPlease install valid cartridges and try again.")
+
+def photoPenRequired():
+ log.error("Photo cartridge not installed.\nPlease install the photo cartridge and try again.")
+
+def photoPenRequired2():
+ log.error("Photo cartridge or photo blue cartridge not installed.\nPlease install the photo (or photo blue) cartridge and try again.")
+
+
+def colorCal4():
+ log.info("""Instructions:\n1. Hold the calibration page at arm's length in front of your eyes.
+2. Tilt the page away from you. Look at the two large squares, each containing colored patches. For each large square, find the colored path that most closely matches the background color. Each patch has an associated letter and number.
+""")
+ values = [0, 0, 0, 0]
+ ok = True
+ while True:
+ x = raw_input(log.bold("""Enter the letter ('A' thru 'N') and number (1 thru 14) for the GRAY plot (eg, "C5") or "q" to quit: """))
+
+ if x.lower().strip() == 'q':
+ ok = False
+ break
+
+ if x.lower().strip() == 'd': # use defaults
+ values[0], values[1] = -1, -1
+ break
+
+ if len(x) < 2:
+ log.error("You must enter at least two characters (a letter and a number)")
+ continue
+
+ if len(x) > 3:
+ log.error('Enter only a single letter and a one or two digit number (eg, "C5").')
+ continue
+
+ letter = x[0].lower()
+
+ if letter not in 'abcdefghijklmn':
+ log.error("You must enter a letter 'A' thru 'N'")
+ continue
+
+ try:
+ number = int(x[1:])
+ except ValueError:
+ log.error("You must enter a letter 'A' thru 'N' followed by a number 1 thru 14.")
+ continue
+
+ if number < 0 or number > 14:
+ log.error("You must enter a letter 'A' thru 'N' followed by a number 1 thru 14.")
+ continue
+
+ values[0] = ord(str(letter).upper()) - ord('A')
+ values[1] = number - 1
+ break
+
+ if ok:
+ while True:
+ x = raw_input(log.bold("""Enter the letter ('P' thru 'V') and number (1 thru 7) for the COLOR plot (eg, "R3") or "q" to quit: """))
+
+ if x.lower().strip() == 'q':
+ ok = False
+ break
+
+ if x.lower().strip() == 'd': # use defaults
+ values[2], values[3] = -1, -1
+ break
+
+ if len(x) < 2:
+ log.error("You must enter at least two characters (a letter and a number)")
+ continue
+
+ if len(x) > 3:
+ log.error('Enter only a single letter and a one or two digit number (eg, "R3").')
+ continue
+
+ letter = x[0].lower()
+
+ if letter not in 'pqrstuv':
+ log.error("You must enter a letter 'P' thru 'V'")
+ continue
+
+ try:
+ number = int(x[1:])
+ except ValueError:
+ log.error("You must enter a letter 'P' thru 'V' followed by a number 1 thru 7.")
+ continue
+
+ if number < 0 or number > 7:
+ log.error("You must enter a letter 'P' thru 'V' followed by a number 1 thru 7.")
+ continue
+
+ values[2] = ord(str(letter).upper()) - ord('P')
+ values[3] = number - 1
+ break
+
+ return ok, values
+
+
+try:
+ mod = module.Module(__mod__, __title__, __version__, __doc__, None,
+ (INTERACTIVE_MODE, GUI_MODE), (UI_TOOLKIT_QT4,))
+
+ mod.setUsage(module.USAGE_FLAG_DEVICE_ARGS,
+ see_also_list=['hp-align', 'hp-clean', 'hp-linefeedcal',
+ 'hp-pqdiag'])
+
+ opts, device_uri, printer_name, mode, ui_toolkit, lang = \
+ mod.parseStdOpts()
+
+ device_uri = mod.getDeviceUri(device_uri, printer_name,
+ filter={'color-cal-type': (operator.ne, COLOR_CAL_TYPE_NONE)})
+
+ if mode == GUI_MODE:
+ if not utils.canEnterGUIMode4():
+ log.error("%s -u/--gui requires Qt4 GUI support. Entering interactive mode." % __mod__)
+ mode = INTERACTIVE_MODE
+
+ if mode == INTERACTIVE_MODE:
+ try:
+ d = device.Device(device_uri, printer_name)
+ except Error, e:
+ log.error("Unable to open device: %s" % e.msg)
+ sys.exit(1)
+
+ try:
+ try:
+ d.open()
+ except Error:
+ log.error("Unable to print to printer. Please check device and try again.")
+ sys.exit(1)
+
+ if d.isIdleAndNoError():
+ color_cal_type = d.mq.get('color-cal-type', COLOR_CAL_TYPE_NONE)
+ log.debug("Color calibration type=%d" % color_cal_type)
+
+ if color_cal_type == COLOR_CAL_TYPE_UNSUPPORTED:
+ log.error("Color calibration through HPLIP not supported for this printer. Please use the printer's front panel to perform color calibration.")
+
+ elif color_cal_type == COLOR_CAL_TYPE_DESKJET_450: #1
+ maint.colorCalType1(d, tui.load_paper_prompt, colorCal, photoPenRequired)
+
+ elif color_cal_type == COLOR_CAL_TYPE_MALIBU_CRICK: #2
+ maint.colorCalType2(d, tui.load_paper_prompt, colorCal2, invalidPen)
+
+ elif color_cal_type == COLOR_CAL_TYPE_STRINGRAY_LONGBOW_TORNADO: #2
+ maint.colorCalType3(d, tui.load_paper_prompt, colorAdj, photoPenRequired2)
+
+ elif color_cal_type == COLOR_CAL_TYPE_CONNERY: # 4
+ maint.colorCalType4(d, tui.load_paper_prompt, colorCal4, None)
+
+ elif color_cal_type == COLOR_CAL_TYPE_COUSTEAU: # 5
+ maint.colorCalType5(d, tui.load_paper_prompt)
+
+ elif color_cal_type == COLOR_CAL_TYPE_CARRIER: # 6
+ maint.colorCalType6(d, tui.load_paper_prompt)
+
+ elif color_cal_type == COLOR_CAL_TYPE_TYPHOON: # 7
+ maint.colorCalType7(d, tui.load_photo_paper_prompt)
+
+ else:
+ log.error("Invalid color calibration type.")
+
+ else:
+ log.error("Device is busy or in an error state. Please check device and try again.")
+ sys.exit(1)
+ finally:
+ d.close()
+
+ else:
+ try:
+ from PyQt4.QtGui import QApplication
+ from ui4.colorcaldialog import ColorCalDialog
+ except ImportError:
+ log.error("Unable to load Qt4 support. Is it installed?")
+ sys.exit(1)
+
+ #try:
+ if 1:
+ app = QApplication(sys.argv)
+
+ dlg = ColorCalDialog(None, device_uri)
+ dlg.show()
+ try:
+ log.debug("Starting GUI loop...")
+ app.exec_()
+ except KeyboardInterrupt:
+ sys.exit(0)
+
+ #finally:
+ if 1:
+ sys.exit(0)
+
+except KeyboardInterrupt:
+ log.error("User exit")
+
+log.info("")
+log.info('Done.')
diff --git a/config.guess b/config.guess
new file mode 100755
index 0000000..f32079a
--- /dev/null
+++ b/config.guess
@@ -0,0 +1,1526 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
+# Free Software Foundation, Inc.
+
+timestamp='2008-01-23'
+
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
+# 02110-1301, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+
+# Originally written by Per Bothner <per@bothner.com>.
+# Please send patches to <config-patches@gnu.org>. Submit a context
+# diff and a properly formatted ChangeLog entry.
+#
+# This script attempts to guess a canonical system name similar to
+# config.sub. If it succeeds, it prints the system name on stdout, and
+# exits with 0. Otherwise, it exits with 1.
+#
+# The plan is that this can be called by configure scripts if you
+# don't specify an explicit build system type.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION]
+
+Output the configuration name of the system \`$me' is run on.
+
+Operation modes:
+ -h, --help print this help, then exit
+ -t, --time-stamp print date of last modification, then exit
+ -v, --version print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.guess ($timestamp)
+
+Originally written by Per Bothner.
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
+2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions. There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+ case $1 in
+ --time-stamp | --time* | -t )
+ echo "$timestamp" ; exit ;;
+ --version | -v )
+ echo "$version" ; exit ;;
+ --help | --h* | -h )
+ echo "$usage"; exit ;;
+ -- ) # Stop option processing
+ shift; break ;;
+ - ) # Use stdin as input.
+ break ;;
+ -* )
+ echo "$me: invalid option $1$help" >&2
+ exit 1 ;;
+ * )
+ break ;;
+ esac
+done
+
+if test $# != 0; then
+ echo "$me: too many arguments$help" >&2
+ exit 1
+fi
+
+trap 'exit 1' 1 2 15
+
+# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
+# compiler to aid in system detection is discouraged as it requires
+# temporary files to be created and, as you can see below, it is a
+# headache to deal with in a portable fashion.
+
+# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
+# use `HOST_CC' if defined, but it is deprecated.
+
+# Portable tmp directory creation inspired by the Autoconf team.
+
+set_cc_for_build='
+trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
+trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
+: ${TMPDIR=/tmp} ;
+ { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
+ { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
+ { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
+ { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
+dummy=$tmp/dummy ;
+tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;
+case $CC_FOR_BUILD,$HOST_CC,$CC in
+ ,,) echo "int x;" > $dummy.c ;
+ for c in cc gcc c89 c99 ; do
+ if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then
+ CC_FOR_BUILD="$c"; break ;
+ fi ;
+ done ;
+ if test x"$CC_FOR_BUILD" = x ; then
+ CC_FOR_BUILD=no_compiler_found ;
+ fi
+ ;;
+ ,,*) CC_FOR_BUILD=$CC ;;
+ ,*,*) CC_FOR_BUILD=$HOST_CC ;;
+esac ; set_cc_for_build= ;'
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi@noc.rutgers.edu 1994-08-24)
+if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
+ PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+# Note: order is significant - the case branches are not exclusive.
+
+case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+ *:NetBSD:*:*)
+ # NetBSD (nbsd) targets should (where applicable) match one or
+ # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,
+ # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently
+ # switched to ELF, *-*-netbsd* would select the old
+ # object file format. This provides both forward
+ # compatibility and a consistent mechanism for selecting the
+ # object file format.
+ #
+ # Note: NetBSD doesn't particularly care about the vendor
+ # portion of the name. We always set it to "unknown".
+ sysctl="sysctl -n hw.machine_arch"
+ UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
+ /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
+ case "${UNAME_MACHINE_ARCH}" in
+ armeb) machine=armeb-unknown ;;
+ arm*) machine=arm-unknown ;;
+ sh3el) machine=shl-unknown ;;
+ sh3eb) machine=sh-unknown ;;
+ sh5el) machine=sh5le-unknown ;;
+ *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
+ esac
+ # The Operating System including object format, if it has switched
+ # to ELF recently, or will in the future.
+ case "${UNAME_MACHINE_ARCH}" in
+ arm*|i386|m68k|ns32k|sh3*|sparc|vax)
+ eval $set_cc_for_build
+ if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
+ | grep __ELF__ >/dev/null
+ then
+ # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
+ # Return netbsd for either. FIX?
+ os=netbsd
+ else
+ os=netbsdelf
+ fi
+ ;;
+ *)
+ os=netbsd
+ ;;
+ esac
+ # The OS release
+ # Debian GNU/NetBSD machines have a different userland, and
+ # thus, need a distinct triplet. However, they do not need
+ # kernel version information, so it can be replaced with a
+ # suitable tag, in the style of linux-gnu.
+ case "${UNAME_VERSION}" in
+ Debian*)
+ release='-gnu'
+ ;;
+ *)
+ release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+ ;;
+ esac
+ # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
+ # contains redundant information, the shorter form:
+ # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
+ echo "${machine}-${os}${release}"
+ exit ;;
+ *:OpenBSD:*:*)
+ UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
+ echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
+ exit ;;
+ *:ekkoBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
+ exit ;;
+ *:SolidBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE}
+ exit ;;
+ macppc:MirBSD:*:*)
+ echo powerpc-unknown-mirbsd${UNAME_RELEASE}
+ exit ;;
+ *:MirBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
+ exit ;;
+ alpha:OSF1:*:*)
+ case $UNAME_RELEASE in
+ *4.0)
+ UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+ ;;
+ *5.*)
+ UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
+ ;;
+ esac
+ # According to Compaq, /usr/sbin/psrinfo has been available on
+ # OSF/1 and Tru64 systems produced since 1995. I hope that
+ # covers most systems running today. This code pipes the CPU
+ # types through head -n 1, so we only detect the type of CPU 0.
+ ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1`
+ case "$ALPHA_CPU_TYPE" in
+ "EV4 (21064)")
+ UNAME_MACHINE="alpha" ;;
+ "EV4.5 (21064)")
+ UNAME_MACHINE="alpha" ;;
+ "LCA4 (21066/21068)")
+ UNAME_MACHINE="alpha" ;;
+ "EV5 (21164)")
+ UNAME_MACHINE="alphaev5" ;;
+ "EV5.6 (21164A)")
+ UNAME_MACHINE="alphaev56" ;;
+ "EV5.6 (21164PC)")
+ UNAME_MACHINE="alphapca56" ;;
+ "EV5.7 (21164PC)")
+ UNAME_MACHINE="alphapca57" ;;
+ "EV6 (21264)")
+ UNAME_MACHINE="alphaev6" ;;
+ "EV6.7 (21264A)")
+ UNAME_MACHINE="alphaev67" ;;
+ "EV6.8CB (21264C)")
+ UNAME_MACHINE="alphaev68" ;;
+ "EV6.8AL (21264B)")
+ UNAME_MACHINE="alphaev68" ;;
+ "EV6.8CX (21264D)")
+ UNAME_MACHINE="alphaev68" ;;
+ "EV6.9A (21264/EV69A)")
+ UNAME_MACHINE="alphaev69" ;;
+ "EV7 (21364)")
+ UNAME_MACHINE="alphaev7" ;;
+ "EV7.9 (21364A)")
+ UNAME_MACHINE="alphaev79" ;;
+ esac
+ # A Pn.n version is a patched version.
+ # A Vn.n version is a released version.
+ # A Tn.n version is a released field test version.
+ # A Xn.n version is an unreleased experimental baselevel.
+ # 1.2 uses "1.2" for uname -r.
+ echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+ exit ;;
+ Alpha\ *:Windows_NT*:*)
+ # How do we know it's Interix rather than the generic POSIX subsystem?
+ # Should we change UNAME_MACHINE based on the output of uname instead
+ # of the specific Alpha model?
+ echo alpha-pc-interix
+ exit ;;
+ 21064:Windows_NT:50:3)
+ echo alpha-dec-winnt3.5
+ exit ;;
+ Amiga*:UNIX_System_V:4.0:*)
+ echo m68k-unknown-sysv4
+ exit ;;
+ *:[Aa]miga[Oo][Ss]:*:*)
+ echo ${UNAME_MACHINE}-unknown-amigaos
+ exit ;;
+ *:[Mm]orph[Oo][Ss]:*:*)
+ echo ${UNAME_MACHINE}-unknown-morphos
+ exit ;;
+ *:OS/390:*:*)
+ echo i370-ibm-openedition
+ exit ;;
+ *:z/VM:*:*)
+ echo s390-ibm-zvmoe
+ exit ;;
+ *:OS400:*:*)
+ echo powerpc-ibm-os400
+ exit ;;
+ arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+ echo arm-acorn-riscix${UNAME_RELEASE}
+ exit ;;
+ arm:riscos:*:*|arm:RISCOS:*:*)
+ echo arm-unknown-riscos
+ exit ;;
+ SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
+ echo hppa1.1-hitachi-hiuxmpp
+ exit ;;
+ Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
+ # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+ if test "`(/bin/universe) 2>/dev/null`" = att ; then
+ echo pyramid-pyramid-sysv3
+ else
+ echo pyramid-pyramid-bsd
+ fi
+ exit ;;
+ NILE*:*:*:dcosx)
+ echo pyramid-pyramid-svr4
+ exit ;;
+ DRS?6000:unix:4.0:6*)
+ echo sparc-icl-nx6
+ exit ;;
+ DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
+ case `/usr/bin/uname -p` in
+ sparc) echo sparc-icl-nx7; exit ;;
+ esac ;;
+ sun4H:SunOS:5.*:*)
+ echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit ;;
+ sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+ echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit ;;
+ i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
+ echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit ;;
+ sun4*:SunOS:6*:*)
+ # According to config.sub, this is the proper way to canonicalize
+ # SunOS6. Hard to guess exactly what SunOS6 will be like, but
+ # it's likely to be more like Solaris than SunOS4.
+ echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit ;;
+ sun4*:SunOS:*:*)
+ case "`/usr/bin/arch -k`" in
+ Series*|S4*)
+ UNAME_RELEASE=`uname -v`
+ ;;
+ esac
+ # Japanese Language versions have a version number like `4.1.3-JL'.
+ echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
+ exit ;;
+ sun3*:SunOS:*:*)
+ echo m68k-sun-sunos${UNAME_RELEASE}
+ exit ;;
+ sun*:*:4.2BSD:*)
+ UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+ test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
+ case "`/bin/arch`" in
+ sun3)
+ echo m68k-sun-sunos${UNAME_RELEASE}
+ ;;
+ sun4)
+ echo sparc-sun-sunos${UNAME_RELEASE}
+ ;;
+ esac
+ exit ;;
+ aushp:SunOS:*:*)
+ echo sparc-auspex-sunos${UNAME_RELEASE}
+ exit ;;
+ # The situation for MiNT is a little confusing. The machine name
+ # can be virtually everything (everything which is not
+ # "atarist" or "atariste" at least should have a processor
+ # > m68000). The system name ranges from "MiNT" over "FreeMiNT"
+ # to the lowercase version "mint" (or "freemint"). Finally
+ # the system name "TOS" denotes a system which is actually not
+ # MiNT. But MiNT is downward compatible to TOS, so this should
+ # be no problem.
+ atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
+ echo m68k-atari-mint${UNAME_RELEASE}
+ exit ;;
+ atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
+ echo m68k-atari-mint${UNAME_RELEASE}
+ exit ;;
+ *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
+ echo m68k-atari-mint${UNAME_RELEASE}
+ exit ;;
+ milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
+ echo m68k-milan-mint${UNAME_RELEASE}
+ exit ;;
+ hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
+ echo m68k-hades-mint${UNAME_RELEASE}
+ exit ;;
+ *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
+ echo m68k-unknown-mint${UNAME_RELEASE}
+ exit ;;
+ m68k:machten:*:*)
+ echo m68k-apple-machten${UNAME_RELEASE}
+ exit ;;
+ powerpc:machten:*:*)
+ echo powerpc-apple-machten${UNAME_RELEASE}
+ exit ;;
+ RISC*:Mach:*:*)
+ echo mips-dec-mach_bsd4.3
+ exit ;;
+ RISC*:ULTRIX:*:*)
+ echo mips-dec-ultrix${UNAME_RELEASE}
+ exit ;;
+ VAX*:ULTRIX*:*:*)
+ echo vax-dec-ultrix${UNAME_RELEASE}
+ exit ;;
+ 2020:CLIX:*:* | 2430:CLIX:*:*)
+ echo clipper-intergraph-clix${UNAME_RELEASE}
+ exit ;;
+ mips:*:*:UMIPS | mips:*:*:RISCos)
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+#ifdef __cplusplus
+#include <stdio.h> /* for printf() prototype */
+ int main (int argc, char *argv[]) {
+#else
+ int main (argc, argv) int argc; char *argv[]; {
+#endif
+ #if defined (host_mips) && defined (MIPSEB)
+ #if defined (SYSTYPE_SYSV)
+ printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
+ #endif
+ #if defined (SYSTYPE_SVR4)
+ printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
+ #endif
+ #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+ printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
+ #endif
+ #endif
+ exit (-1);
+ }
+EOF
+ $CC_FOR_BUILD -o $dummy $dummy.c &&
+ dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` &&
+ SYSTEM_NAME=`$dummy $dummyarg` &&
+ { echo "$SYSTEM_NAME"; exit; }
+ echo mips-mips-riscos${UNAME_RELEASE}
+ exit ;;
+ Motorola:PowerMAX_OS:*:*)
+ echo powerpc-motorola-powermax
+ exit ;;
+ Motorola:*:4.3:PL8-*)
+ echo powerpc-harris-powermax
+ exit ;;
+ Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
+ echo powerpc-harris-powermax
+ exit ;;
+ Night_Hawk:Power_UNIX:*:*)
+ echo powerpc-harris-powerunix
+ exit ;;
+ m88k:CX/UX:7*:*)
+ echo m88k-harris-cxux7
+ exit ;;
+ m88k:*:4*:R4*)
+ echo m88k-motorola-sysv4
+ exit ;;
+ m88k:*:3*:R3*)
+ echo m88k-motorola-sysv3
+ exit ;;
+ AViiON:dgux:*:*)
+ # DG/UX returns AViiON for all architectures
+ UNAME_PROCESSOR=`/usr/bin/uname -p`
+ if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
+ then
+ if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
+ [ ${TARGET_BINARY_INTERFACE}x = x ]
+ then
+ echo m88k-dg-dgux${UNAME_RELEASE}
+ else
+ echo m88k-dg-dguxbcs${UNAME_RELEASE}
+ fi
+ else
+ echo i586-dg-dgux${UNAME_RELEASE}
+ fi
+ exit ;;
+ M88*:DolphinOS:*:*) # DolphinOS (SVR3)
+ echo m88k-dolphin-sysv3
+ exit ;;
+ M88*:*:R3*:*)
+ # Delta 88k system running SVR3
+ echo m88k-motorola-sysv3
+ exit ;;
+ XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+ echo m88k-tektronix-sysv3
+ exit ;;
+ Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+ echo m68k-tektronix-bsd
+ exit ;;
+ *:IRIX*:*:*)
+ echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
+ exit ;;
+ ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+ echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id
+ exit ;; # Note that: echo "'`uname -s`'" gives 'AIX '
+ i*86:AIX:*:*)
+ echo i386-ibm-aix
+ exit ;;
+ ia64:AIX:*:*)
+ if [ -x /usr/bin/oslevel ] ; then
+ IBM_REV=`/usr/bin/oslevel`
+ else
+ IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+ fi
+ echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
+ exit ;;
+ *:AIX:2:3)
+ if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #include <sys/systemcfg.h>
+
+ main()
+ {
+ if (!__power_pc())
+ exit(1);
+ puts("powerpc-ibm-aix3.2.5");
+ exit(0);
+ }
+EOF
+ if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy`
+ then
+ echo "$SYSTEM_NAME"
+ else
+ echo rs6000-ibm-aix3.2.5
+ fi
+ elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+ echo rs6000-ibm-aix3.2.4
+ else
+ echo rs6000-ibm-aix3.2
+ fi
+ exit ;;
+ *:AIX:*:[456])
+ IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
+ if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
+ IBM_ARCH=rs6000
+ else
+ IBM_ARCH=powerpc
+ fi
+ if [ -x /usr/bin/oslevel ] ; then
+ IBM_REV=`/usr/bin/oslevel`
+ else
+ IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+ fi
+ echo ${IBM_ARCH}-ibm-aix${IBM_REV}
+ exit ;;
+ *:AIX:*:*)
+ echo rs6000-ibm-aix
+ exit ;;
+ ibmrt:4.4BSD:*|romp-ibm:BSD:*)
+ echo romp-ibm-bsd4.4
+ exit ;;
+ ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and
+ echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to
+ exit ;; # report: romp-ibm BSD 4.3
+ *:BOSX:*:*)
+ echo rs6000-bull-bosx
+ exit ;;
+ DPX/2?00:B.O.S.:*:*)
+ echo m68k-bull-sysv3
+ exit ;;
+ 9000/[34]??:4.3bsd:1.*:*)
+ echo m68k-hp-bsd
+ exit ;;
+ hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+ echo m68k-hp-bsd4.4
+ exit ;;
+ 9000/[34678]??:HP-UX:*:*)
+ HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+ case "${UNAME_MACHINE}" in
+ 9000/31? ) HP_ARCH=m68000 ;;
+ 9000/[34]?? ) HP_ARCH=m68k ;;
+ 9000/[678][0-9][0-9])
+ if [ -x /usr/bin/getconf ]; then
+ sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
+ sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+ case "${sc_cpu_version}" in
+ 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
+ 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
+ 532) # CPU_PA_RISC2_0
+ case "${sc_kernel_bits}" in
+ 32) HP_ARCH="hppa2.0n" ;;
+ 64) HP_ARCH="hppa2.0w" ;;
+ '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20
+ esac ;;
+ esac
+ fi
+ if [ "${HP_ARCH}" = "" ]; then
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+
+ #define _HPUX_SOURCE
+ #include <stdlib.h>
+ #include <unistd.h>
+
+ int main ()
+ {
+ #if defined(_SC_KERNEL_BITS)
+ long bits = sysconf(_SC_KERNEL_BITS);
+ #endif
+ long cpu = sysconf (_SC_CPU_VERSION);
+
+ switch (cpu)
+ {
+ case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+ case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+ case CPU_PA_RISC2_0:
+ #if defined(_SC_KERNEL_BITS)
+ switch (bits)
+ {
+ case 64: puts ("hppa2.0w"); break;
+ case 32: puts ("hppa2.0n"); break;
+ default: puts ("hppa2.0"); break;
+ } break;
+ #else /* !defined(_SC_KERNEL_BITS) */
+ puts ("hppa2.0"); break;
+ #endif
+ default: puts ("hppa1.0"); break;
+ }
+ exit (0);
+ }
+EOF
+ (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
+ test -z "$HP_ARCH" && HP_ARCH=hppa
+ fi ;;
+ esac
+ if [ ${HP_ARCH} = "hppa2.0w" ]
+ then
+ eval $set_cc_for_build
+
+ # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
+ # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler
+ # generating 64-bit code. GNU and HP use different nomenclature:
+ #
+ # $ CC_FOR_BUILD=cc ./config.guess
+ # => hppa2.0w-hp-hpux11.23
+ # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
+ # => hppa64-hp-hpux11.23
+
+ if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
+ grep __LP64__ >/dev/null
+ then
+ HP_ARCH="hppa2.0w"
+ else
+ HP_ARCH="hppa64"
+ fi
+ fi
+ echo ${HP_ARCH}-hp-hpux${HPUX_REV}
+ exit ;;
+ ia64:HP-UX:*:*)
+ HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+ echo ia64-hp-hpux${HPUX_REV}
+ exit ;;
+ 3050*:HI-UX:*:*)
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #include <unistd.h>
+ int
+ main ()
+ {
+ long cpu = sysconf (_SC_CPU_VERSION);
+ /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+ true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct
+ results, however. */
+ if (CPU_IS_PA_RISC (cpu))
+ {
+ switch (cpu)
+ {
+ case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+ case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+ case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+ default: puts ("hppa-hitachi-hiuxwe2"); break;
+ }
+ }
+ else if (CPU_IS_HP_MC68K (cpu))
+ puts ("m68k-hitachi-hiuxwe2");
+ else puts ("unknown-hitachi-hiuxwe2");
+ exit (0);
+ }
+EOF
+ $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` &&
+ { echo "$SYSTEM_NAME"; exit; }
+ echo unknown-hitachi-hiuxwe2
+ exit ;;
+ 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
+ echo hppa1.1-hp-bsd
+ exit ;;
+ 9000/8??:4.3bsd:*:*)
+ echo hppa1.0-hp-bsd
+ exit ;;
+ *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
+ echo hppa1.0-hp-mpeix
+ exit ;;
+ hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
+ echo hppa1.1-hp-osf
+ exit ;;
+ hp8??:OSF1:*:*)
+ echo hppa1.0-hp-osf
+ exit ;;
+ i*86:OSF1:*:*)
+ if [ -x /usr/sbin/sysversion ] ; then
+ echo ${UNAME_MACHINE}-unknown-osf1mk
+ else
+ echo ${UNAME_MACHINE}-unknown-osf1
+ fi
+ exit ;;
+ parisc*:Lites*:*:*)
+ echo hppa1.1-hp-lites
+ exit ;;
+ C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+ echo c1-convex-bsd
+ exit ;;
+ C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+ if getsysinfo -f scalar_acc
+ then echo c32-convex-bsd
+ else echo c2-convex-bsd
+ fi
+ exit ;;
+ C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+ echo c34-convex-bsd
+ exit ;;
+ C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+ echo c38-convex-bsd
+ exit ;;
+ C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+ echo c4-convex-bsd
+ exit ;;
+ CRAY*Y-MP:*:*:*)
+ echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ CRAY*[A-Z]90:*:*:*)
+ echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
+ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
+ -e 's/\.[^.]*$/.X/'
+ exit ;;
+ CRAY*TS:*:*:*)
+ echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ CRAY*T3E:*:*:*)
+ echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ CRAY*SV1:*:*:*)
+ echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ *:UNICOS/mp:*:*)
+ echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
+ FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+ FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+ FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+ echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+ exit ;;
+ 5000:UNIX_System_V:4.*:*)
+ FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+ FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
+ echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+ exit ;;
+ i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
+ echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
+ exit ;;
+ sparc*:BSD/OS:*:*)
+ echo sparc-unknown-bsdi${UNAME_RELEASE}
+ exit ;;
+ *:BSD/OS:*:*)
+ echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
+ exit ;;
+ *:FreeBSD:*:*)
+ case ${UNAME_MACHINE} in
+ pc98)
+ echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+ amd64)
+ echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+ *)
+ echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+ esac
+ exit ;;
+ i*:CYGWIN*:*)
+ echo ${UNAME_MACHINE}-pc-cygwin
+ exit ;;
+ *:MINGW*:*)
+ echo ${UNAME_MACHINE}-pc-mingw32
+ exit ;;
+ i*:windows32*:*)
+ # uname -m includes "-pc" on this system.
+ echo ${UNAME_MACHINE}-mingw32
+ exit ;;
+ i*:PW*:*)
+ echo ${UNAME_MACHINE}-pc-pw32
+ exit ;;
+ *:Interix*:[3456]*)
+ case ${UNAME_MACHINE} in
+ x86)
+ echo i586-pc-interix${UNAME_RELEASE}
+ exit ;;
+ EM64T | authenticamd)
+ echo x86_64-unknown-interix${UNAME_RELEASE}
+ exit ;;
+ IA64)
+ echo ia64-unknown-interix${UNAME_RELEASE}
+ exit ;;
+ esac ;;
+ [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
+ echo i${UNAME_MACHINE}-pc-mks
+ exit ;;
+ i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
+ # How do we know it's Interix rather than the generic POSIX subsystem?
+ # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
+ # UNAME_MACHINE based on the output of uname instead of i386?
+ echo i586-pc-interix
+ exit ;;
+ i*:UWIN*:*)
+ echo ${UNAME_MACHINE}-pc-uwin
+ exit ;;
+ amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
+ echo x86_64-unknown-cygwin
+ exit ;;
+ p*:CYGWIN*:*)
+ echo powerpcle-unknown-cygwin
+ exit ;;
+ prep*:SunOS:5.*:*)
+ echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit ;;
+ *:GNU:*:*)
+ # the GNU system
+ echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+ exit ;;
+ *:GNU/*:*:*)
+ # other systems with GNU libc and userland
+ echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu
+ exit ;;
+ i*86:Minix:*:*)
+ echo ${UNAME_MACHINE}-pc-minix
+ exit ;;
+ arm*:Linux:*:*)
+ eval $set_cc_for_build
+ if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
+ | grep -q __ARM_EABI__
+ then
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ else
+ echo ${UNAME_MACHINE}-unknown-linux-gnueabi
+ fi
+ exit ;;
+ avr32*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ cris:Linux:*:*)
+ echo cris-axis-linux-gnu
+ exit ;;
+ crisv32:Linux:*:*)
+ echo crisv32-axis-linux-gnu
+ exit ;;
+ frv:Linux:*:*)
+ echo frv-unknown-linux-gnu
+ exit ;;
+ ia64:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ m32r*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ m68*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ mips:Linux:*:*)
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #undef CPU
+ #undef mips
+ #undef mipsel
+ #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+ CPU=mipsel
+ #else
+ #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+ CPU=mips
+ #else
+ CPU=
+ #endif
+ #endif
+EOF
+ eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
+ /^CPU/{
+ s: ::g
+ p
+ }'`"
+ test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
+ ;;
+ mips64:Linux:*:*)
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #undef CPU
+ #undef mips64
+ #undef mips64el
+ #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+ CPU=mips64el
+ #else
+ #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+ CPU=mips64
+ #else
+ CPU=
+ #endif
+ #endif
+EOF
+ eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
+ /^CPU/{
+ s: ::g
+ p
+ }'`"
+ test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
+ ;;
+ or32:Linux:*:*)
+ echo or32-unknown-linux-gnu
+ exit ;;
+ ppc:Linux:*:*)
+ echo powerpc-unknown-linux-gnu
+ exit ;;
+ ppc64:Linux:*:*)
+ echo powerpc64-unknown-linux-gnu
+ exit ;;
+ alpha:Linux:*:*)
+ case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
+ EV5) UNAME_MACHINE=alphaev5 ;;
+ EV56) UNAME_MACHINE=alphaev56 ;;
+ PCA56) UNAME_MACHINE=alphapca56 ;;
+ PCA57) UNAME_MACHINE=alphapca56 ;;
+ EV6) UNAME_MACHINE=alphaev6 ;;
+ EV67) UNAME_MACHINE=alphaev67 ;;
+ EV68*) UNAME_MACHINE=alphaev68 ;;
+ esac
+ objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null
+ if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
+ echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
+ exit ;;
+ parisc:Linux:*:* | hppa:Linux:*:*)
+ # Look for CPU level
+ case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
+ PA7*) echo hppa1.1-unknown-linux-gnu ;;
+ PA8*) echo hppa2.0-unknown-linux-gnu ;;
+ *) echo hppa-unknown-linux-gnu ;;
+ esac
+ exit ;;
+ parisc64:Linux:*:* | hppa64:Linux:*:*)
+ echo hppa64-unknown-linux-gnu
+ exit ;;
+ s390:Linux:*:* | s390x:Linux:*:*)
+ echo ${UNAME_MACHINE}-ibm-linux
+ exit ;;
+ sh64*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ sh*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ sparc:Linux:*:* | sparc64:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ vax:Linux:*:*)
+ echo ${UNAME_MACHINE}-dec-linux-gnu
+ exit ;;
+ x86_64:Linux:*:*)
+ echo x86_64-unknown-linux-gnu
+ exit ;;
+ xtensa*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ i*86:Linux:*:*)
+ # The BFD linker knows what the default object file format is, so
+ # first see if it will tell us. cd to the root directory to prevent
+ # problems with other programs or directories called `ld' in the path.
+ # Set LC_ALL=C to ensure ld outputs messages in English.
+ ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \
+ | sed -ne '/supported targets:/!d
+ s/[ ][ ]*/ /g
+ s/.*supported targets: *//
+ s/ .*//
+ p'`
+ case "$ld_supported_targets" in
+ elf32-i386)
+ TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu"
+ ;;
+ a.out-i386-linux)
+ echo "${UNAME_MACHINE}-pc-linux-gnuaout"
+ exit ;;
+ coff-i386)
+ echo "${UNAME_MACHINE}-pc-linux-gnucoff"
+ exit ;;
+ "")
+ # Either a pre-BFD a.out linker (linux-gnuoldld) or
+ # one that does not give us useful --help.
+ echo "${UNAME_MACHINE}-pc-linux-gnuoldld"
+ exit ;;
+ esac
+ # Determine whether the default compiler is a.out or elf
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #include <features.h>
+ #ifdef __ELF__
+ # ifdef __GLIBC__
+ # if __GLIBC__ >= 2
+ LIBC=gnu
+ # else
+ LIBC=gnulibc1
+ # endif
+ # else
+ LIBC=gnulibc1
+ # endif
+ #else
+ #if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__SUNPRO_C) || defined(__SUNPRO_CC)
+ LIBC=gnu
+ #else
+ LIBC=gnuaout
+ #endif
+ #endif
+ #ifdef __dietlibc__
+ LIBC=dietlibc
+ #endif
+EOF
+ eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
+ /^LIBC/{
+ s: ::g
+ p
+ }'`"
+ test x"${LIBC}" != x && {
+ echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
+ exit
+ }
+ test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; }
+ ;;
+ i*86:DYNIX/ptx:4*:*)
+ # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
+ # earlier versions are messed up and put the nodename in both
+ # sysname and nodename.
+ echo i386-sequent-sysv4
+ exit ;;
+ i*86:UNIX_SV:4.2MP:2.*)
+ # Unixware is an offshoot of SVR4, but it has its own version
+ # number series starting with 2...
+ # I am not positive that other SVR4 systems won't match this,
+ # I just have to hope. -- rms.
+ # Use sysv4.2uw... so that sysv4* matches it.
+ echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
+ exit ;;
+ i*86:OS/2:*:*)
+ # If we were able to find `uname', then EMX Unix compatibility
+ # is probably installed.
+ echo ${UNAME_MACHINE}-pc-os2-emx
+ exit ;;
+ i*86:XTS-300:*:STOP)
+ echo ${UNAME_MACHINE}-unknown-stop
+ exit ;;
+ i*86:atheos:*:*)
+ echo ${UNAME_MACHINE}-unknown-atheos
+ exit ;;
+ i*86:syllable:*:*)
+ echo ${UNAME_MACHINE}-pc-syllable
+ exit ;;
+ i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*)
+ echo i386-unknown-lynxos${UNAME_RELEASE}
+ exit ;;
+ i*86:*DOS:*:*)
+ echo ${UNAME_MACHINE}-pc-msdosdjgpp
+ exit ;;
+ i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
+ UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
+ if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+ echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
+ else
+ echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
+ fi
+ exit ;;
+ i*86:*:5:[678]*)
+ # UnixWare 7.x, OpenUNIX and OpenServer 6.
+ case `/bin/uname -X | grep "^Machine"` in
+ *486*) UNAME_MACHINE=i486 ;;
+ *Pentium) UNAME_MACHINE=i586 ;;
+ *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
+ esac
+ echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
+ exit ;;
+ i*86:*:3.2:*)
+ if test -f /usr/options/cb.name; then
+ UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+ echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
+ elif /bin/uname -X 2>/dev/null >/dev/null ; then
+ UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
+ (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
+ (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
+ && UNAME_MACHINE=i586
+ (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
+ && UNAME_MACHINE=i686
+ (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
+ && UNAME_MACHINE=i686
+ echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
+ else
+ echo ${UNAME_MACHINE}-pc-sysv32
+ fi
+ exit ;;
+ pc:*:*:*)
+ # Left here for compatibility:
+ # uname -m prints for DJGPP always 'pc', but it prints nothing about
+ # the processor, so we play safe by assuming i386.
+ echo i386-pc-msdosdjgpp
+ exit ;;
+ Intel:Mach:3*:*)
+ echo i386-pc-mach3
+ exit ;;
+ paragon:*:*:*)
+ echo i860-intel-osf1
+ exit ;;
+ i860:*:4.*:*) # i860-SVR4
+ if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+ echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
+ else # Add other i860-SVR4 vendors below as they are discovered.
+ echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4
+ fi
+ exit ;;
+ mini*:CTIX:SYS*5:*)
+ # "miniframe"
+ echo m68010-convergent-sysv
+ exit ;;
+ mc68k:UNIX:SYSTEM5:3.51m)
+ echo m68k-convergent-sysv
+ exit ;;
+ M680?0:D-NIX:5.3:*)
+ echo m68k-diab-dnix
+ exit ;;
+ M68*:*:R3V[5678]*:*)
+ test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
+ 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
+ OS_REL=''
+ test -r /etc/.relid \
+ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+ && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
+ /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
+ 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+ && { echo i486-ncr-sysv4; exit; } ;;
+ m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
+ echo m68k-unknown-lynxos${UNAME_RELEASE}
+ exit ;;
+ mc68030:UNIX_System_V:4.*:*)
+ echo m68k-atari-sysv4
+ exit ;;
+ TSUNAMI:LynxOS:2.*:*)
+ echo sparc-unknown-lynxos${UNAME_RELEASE}
+ exit ;;
+ rs6000:LynxOS:2.*:*)
+ echo rs6000-unknown-lynxos${UNAME_RELEASE}
+ exit ;;
+ PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*)
+ echo powerpc-unknown-lynxos${UNAME_RELEASE}
+ exit ;;
+ SM[BE]S:UNIX_SV:*:*)
+ echo mips-dde-sysv${UNAME_RELEASE}
+ exit ;;
+ RM*:ReliantUNIX-*:*:*)
+ echo mips-sni-sysv4
+ exit ;;
+ RM*:SINIX-*:*:*)
+ echo mips-sni-sysv4
+ exit ;;
+ *:SINIX-*:*:*)
+ if uname -p 2>/dev/null >/dev/null ; then
+ UNAME_MACHINE=`(uname -p) 2>/dev/null`
+ echo ${UNAME_MACHINE}-sni-sysv4
+ else
+ echo ns32k-sni-sysv
+ fi
+ exit ;;
+ PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+ # says <Richard.M.Bartel@ccMail.Census.GOV>
+ echo i586-unisys-sysv4
+ exit ;;
+ *:UNIX_System_V:4*:FTX*)
+ # From Gerald Hewes <hewes@openmarket.com>.
+ # How about differentiating between stratus architectures? -djm
+ echo hppa1.1-stratus-sysv4
+ exit ;;
+ *:*:*:FTX*)
+ # From seanf@swdc.stratus.com.
+ echo i860-stratus-sysv4
+ exit ;;
+ i*86:VOS:*:*)
+ # From Paul.Green@stratus.com.
+ echo ${UNAME_MACHINE}-stratus-vos
+ exit ;;
+ *:VOS:*:*)
+ # From Paul.Green@stratus.com.
+ echo hppa1.1-stratus-vos
+ exit ;;
+ mc68*:A/UX:*:*)
+ echo m68k-apple-aux${UNAME_RELEASE}
+ exit ;;
+ news*:NEWS-OS:6*:*)
+ echo mips-sony-newsos6
+ exit ;;
+ R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
+ if [ -d /usr/nec ]; then
+ echo mips-nec-sysv${UNAME_RELEASE}
+ else
+ echo mips-unknown-sysv${UNAME_RELEASE}
+ fi
+ exit ;;
+ BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only.
+ echo powerpc-be-beos
+ exit ;;
+ BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only.
+ echo powerpc-apple-beos
+ exit ;;
+ BePC:BeOS:*:*) # BeOS running on Intel PC compatible.
+ echo i586-pc-beos
+ exit ;;
+ SX-4:SUPER-UX:*:*)
+ echo sx4-nec-superux${UNAME_RELEASE}
+ exit ;;
+ SX-5:SUPER-UX:*:*)
+ echo sx5-nec-superux${UNAME_RELEASE}
+ exit ;;
+ SX-6:SUPER-UX:*:*)
+ echo sx6-nec-superux${UNAME_RELEASE}
+ exit ;;
+ SX-7:SUPER-UX:*:*)
+ echo sx7-nec-superux${UNAME_RELEASE}
+ exit ;;
+ SX-8:SUPER-UX:*:*)
+ echo sx8-nec-superux${UNAME_RELEASE}
+ exit ;;
+ SX-8R:SUPER-UX:*:*)
+ echo sx8r-nec-superux${UNAME_RELEASE}
+ exit ;;
+ Power*:Rhapsody:*:*)
+ echo powerpc-apple-rhapsody${UNAME_RELEASE}
+ exit ;;
+ *:Rhapsody:*:*)
+ echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
+ exit ;;
+ *:Darwin:*:*)
+ UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
+ case $UNAME_PROCESSOR in
+ unknown) UNAME_PROCESSOR=powerpc ;;
+ esac
+ echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
+ exit ;;
+ *:procnto*:*:* | *:QNX:[0123456789]*:*)
+ UNAME_PROCESSOR=`uname -p`
+ if test "$UNAME_PROCESSOR" = "x86"; then
+ UNAME_PROCESSOR=i386
+ UNAME_MACHINE=pc
+ fi
+ echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}
+ exit ;;
+ *:QNX:*:4*)
+ echo i386-pc-qnx
+ exit ;;
+ NSE-?:NONSTOP_KERNEL:*:*)
+ echo nse-tandem-nsk${UNAME_RELEASE}
+ exit ;;
+ NSR-?:NONSTOP_KERNEL:*:*)
+ echo nsr-tandem-nsk${UNAME_RELEASE}
+ exit ;;
+ *:NonStop-UX:*:*)
+ echo mips-compaq-nonstopux
+ exit ;;
+ BS2000:POSIX*:*:*)
+ echo bs2000-siemens-sysv
+ exit ;;
+ DS/*:UNIX_System_V:*:*)
+ echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
+ exit ;;
+ *:Plan9:*:*)
+ # "uname -m" is not consistent, so use $cputype instead. 386
+ # is converted to i386 for consistency with other x86
+ # operating systems.
+ if test "$cputype" = "386"; then
+ UNAME_MACHINE=i386
+ else
+ UNAME_MACHINE="$cputype"
+ fi
+ echo ${UNAME_MACHINE}-unknown-plan9
+ exit ;;
+ *:TOPS-10:*:*)
+ echo pdp10-unknown-tops10
+ exit ;;
+ *:TENEX:*:*)
+ echo pdp10-unknown-tenex
+ exit ;;
+ KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
+ echo pdp10-dec-tops20
+ exit ;;
+ XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
+ echo pdp10-xkl-tops20
+ exit ;;
+ *:TOPS-20:*:*)
+ echo pdp10-unknown-tops20
+ exit ;;
+ *:ITS:*:*)
+ echo pdp10-unknown-its
+ exit ;;
+ SEI:*:*:SEIUX)
+ echo mips-sei-seiux${UNAME_RELEASE}
+ exit ;;
+ *:DragonFly:*:*)
+ echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+ exit ;;
+ *:*VMS:*:*)
+ UNAME_MACHINE=`(uname -p) 2>/dev/null`
+ case "${UNAME_MACHINE}" in
+ A*) echo alpha-dec-vms ; exit ;;
+ I*) echo ia64-dec-vms ; exit ;;
+ V*) echo vax-dec-vms ; exit ;;
+ esac ;;
+ *:XENIX:*:SysV)
+ echo i386-pc-xenix
+ exit ;;
+ i*86:skyos:*:*)
+ echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'
+ exit ;;
+ i*86:rdos:*:*)
+ echo ${UNAME_MACHINE}-pc-rdos
+ exit ;;
+esac
+
+#echo '(No uname command or uname output not recognized.)' 1>&2
+#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
+
+eval $set_cc_for_build
+cat >$dummy.c <<EOF
+#ifdef _SEQUENT_
+# include <sys/types.h>
+# include <sys/utsname.h>
+#endif
+main ()
+{
+#if defined (sony)
+#if defined (MIPSEB)
+ /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed,
+ I don't know.... */
+ printf ("mips-sony-bsd\n"); exit (0);
+#else
+#include <sys/param.h>
+ printf ("m68k-sony-newsos%s\n",
+#ifdef NEWSOS4
+ "4"
+#else
+ ""
+#endif
+ ); exit (0);
+#endif
+#endif
+
+#if defined (__arm) && defined (__acorn) && defined (__unix)
+ printf ("arm-acorn-riscix\n"); exit (0);
+#endif
+
+#if defined (hp300) && !defined (hpux)
+ printf ("m68k-hp-bsd\n"); exit (0);
+#endif
+
+#if defined (NeXT)
+#if !defined (__ARCHITECTURE__)
+#define __ARCHITECTURE__ "m68k"
+#endif
+ int version;
+ version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
+ if (version < 4)
+ printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
+ else
+ printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
+ exit (0);
+#endif
+
+#if defined (MULTIMAX) || defined (n16)
+#if defined (UMAXV)
+ printf ("ns32k-encore-sysv\n"); exit (0);
+#else
+#if defined (CMU)
+ printf ("ns32k-encore-mach\n"); exit (0);
+#else
+ printf ("ns32k-encore-bsd\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (__386BSD__)
+ printf ("i386-pc-bsd\n"); exit (0);
+#endif
+
+#if defined (sequent)
+#if defined (i386)
+ printf ("i386-sequent-dynix\n"); exit (0);
+#endif
+#if defined (ns32000)
+ printf ("ns32k-sequent-dynix\n"); exit (0);
+#endif
+#endif
+
+#if defined (_SEQUENT_)
+ struct utsname un;
+
+ uname(&un);
+
+ if (strncmp(un.version, "V2", 2) == 0) {
+ printf ("i386-sequent-ptx2\n"); exit (0);
+ }
+ if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
+ printf ("i386-sequent-ptx1\n"); exit (0);
+ }
+ printf ("i386-sequent-ptx\n"); exit (0);
+
+#endif
+
+#if defined (vax)
+# if !defined (ultrix)
+# include <sys/param.h>
+# if defined (BSD)
+# if BSD == 43
+ printf ("vax-dec-bsd4.3\n"); exit (0);
+# else
+# if BSD == 199006
+ printf ("vax-dec-bsd4.3reno\n"); exit (0);
+# else
+ printf ("vax-dec-bsd\n"); exit (0);
+# endif
+# endif
+# else
+ printf ("vax-dec-bsd\n"); exit (0);
+# endif
+# else
+ printf ("vax-dec-ultrix\n"); exit (0);
+# endif
+#endif
+
+#if defined (alliant) && defined (i860)
+ printf ("i860-alliant-bsd\n"); exit (0);
+#endif
+
+ exit (1);
+}
+EOF
+
+$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&
+ { echo "$SYSTEM_NAME"; exit; }
+
+# Apollos put the system type in the environment.
+
+test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }
+
+# Convex versions that predate uname can use getsysinfo(1)
+
+if [ -x /usr/convex/getsysinfo ]
+then
+ case `getsysinfo -f cpu_type` in
+ c1*)
+ echo c1-convex-bsd
+ exit ;;
+ c2*)
+ if getsysinfo -f scalar_acc
+ then echo c32-convex-bsd
+ else echo c2-convex-bsd
+ fi
+ exit ;;
+ c34*)
+ echo c34-convex-bsd
+ exit ;;
+ c38*)
+ echo c38-convex-bsd
+ exit ;;
+ c4*)
+ echo c4-convex-bsd
+ exit ;;
+ esac
+fi
+
+cat >&2 <<EOF
+$0: unable to guess system type
+
+This script, last modified $timestamp, has failed to recognize
+the operating system you are using. It is advised that you
+download the most up to date version of the config scripts from
+
+ http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
+and
+ http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
+
+If the version you run ($0) is already up to date, please
+send the following data and any information you think might be
+pertinent to <config-patches@gnu.org> in order to provide the needed
+information to handle your system.
+
+config.guess timestamp = $timestamp
+
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
+/bin/uname -X = `(/bin/uname -X) 2>/dev/null`
+
+hostinfo = `(hostinfo) 2>/dev/null`
+/bin/universe = `(/bin/universe) 2>/dev/null`
+/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null`
+/bin/arch = `(/bin/arch) 2>/dev/null`
+/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
+
+UNAME_MACHINE = ${UNAME_MACHINE}
+UNAME_RELEASE = ${UNAME_RELEASE}
+UNAME_SYSTEM = ${UNAME_SYSTEM}
+UNAME_VERSION = ${UNAME_VERSION}
+EOF
+
+exit 1
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/config.sub b/config.sub
new file mode 100755
index 0000000..6759825
--- /dev/null
+++ b/config.sub
@@ -0,0 +1,1658 @@
+#! /bin/sh
+# Configuration validation subroutine script.
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
+# Free Software Foundation, Inc.
+
+timestamp='2008-01-16'
+
+# This file is (in principle) common to ALL GNU software.
+# The presence of a machine in this file suggests that SOME GNU software
+# can handle that machine. It does not imply ALL GNU software can.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
+# 02110-1301, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+
+# Please send patches to <config-patches@gnu.org>. Submit a context
+# diff and a properly formatted ChangeLog entry.
+#
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support. The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION] CPU-MFR-OPSYS
+ $0 [OPTION] ALIAS
+
+Canonicalize a configuration name.
+
+Operation modes:
+ -h, --help print this help, then exit
+ -t, --time-stamp print date of last modification, then exit
+ -v, --version print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.sub ($timestamp)
+
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
+2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions. There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+ case $1 in
+ --time-stamp | --time* | -t )
+ echo "$timestamp" ; exit ;;
+ --version | -v )
+ echo "$version" ; exit ;;
+ --help | --h* | -h )
+ echo "$usage"; exit ;;
+ -- ) # Stop option processing
+ shift; break ;;
+ - ) # Use stdin as input.
+ break ;;
+ -* )
+ echo "$me: invalid option $1$help"
+ exit 1 ;;
+
+ *local*)
+ # First pass through any local machine types.
+ echo $1
+ exit ;;
+
+ * )
+ break ;;
+ esac
+done
+
+case $# in
+ 0) echo "$me: missing argument$help" >&2
+ exit 1;;
+ 1) ;;
+ *) echo "$me: too many arguments$help" >&2
+ exit 1;;
+esac
+
+# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
+# Here we must recognize all the valid KERNEL-OS combinations.
+maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+case $maybe_os in
+ nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \
+ uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \
+ storm-chaos* | os2-emx* | rtmk-nova*)
+ os=-$maybe_os
+ basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+ ;;
+ *)
+ basic_machine=`echo $1 | sed 's/-[^-]*$//'`
+ if [ $basic_machine != $1 ]
+ then os=`echo $1 | sed 's/.*-/-/'`
+ else os=; fi
+ ;;
+esac
+
+### Let's recognize common machines as not being operating systems so
+### that things like config.sub decstation-3100 work. We also
+### recognize some manufacturers as not being operating systems, so we
+### can provide default operating systems below.
+case $os in
+ -sun*os*)
+ # Prevent following clause from handling this invalid input.
+ ;;
+ -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
+ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
+ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
+ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
+ -apple | -axis | -knuth | -cray)
+ os=
+ basic_machine=$1
+ ;;
+ -sim | -cisco | -oki | -wec | -winbond)
+ os=
+ basic_machine=$1
+ ;;
+ -scout)
+ ;;
+ -wrs)
+ os=-vxworks
+ basic_machine=$1
+ ;;
+ -chorusos*)
+ os=-chorusos
+ basic_machine=$1
+ ;;
+ -chorusrdb)
+ os=-chorusrdb
+ basic_machine=$1
+ ;;
+ -hiux*)
+ os=-hiuxwe2
+ ;;
+ -sco6)
+ os=-sco5v6
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco5)
+ os=-sco3.2v5
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco4)
+ os=-sco3.2v4
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco3.2.[4-9]*)
+ os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco3.2v[4-9]*)
+ # Don't forget version if it is 3.2v4 or newer.
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco5v6*)
+ # Don't forget version if it is 3.2v4 or newer.
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco*)
+ os=-sco3.2v2
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -udk*)
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -isc)
+ os=-isc2.2
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -clix*)
+ basic_machine=clipper-intergraph
+ ;;
+ -isc*)
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -lynx*)
+ os=-lynxos
+ ;;
+ -ptx*)
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
+ ;;
+ -windowsnt*)
+ os=`echo $os | sed -e 's/windowsnt/winnt/'`
+ ;;
+ -psos*)
+ os=-psos
+ ;;
+ -mint | -mint[0-9]*)
+ basic_machine=m68k-atari
+ os=-mint
+ ;;
+esac
+
+# Decode aliases for certain CPU-COMPANY combinations.
+case $basic_machine in
+ # Recognize the basic CPU types without company name.
+ # Some are omitted here because they have special meanings below.
+ 1750a | 580 \
+ | a29k \
+ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
+ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
+ | am33_2.0 \
+ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
+ | bfin \
+ | c4x | clipper \
+ | d10v | d30v | dlx | dsp16xx \
+ | fido | fr30 | frv \
+ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+ | i370 | i860 | i960 | ia64 \
+ | ip2k | iq2000 \
+ | m32c | m32r | m32rle | m68000 | m68k | m88k \
+ | maxq | mb | microblaze | mcore | mep \
+ | mips | mipsbe | mipseb | mipsel | mipsle \
+ | mips16 \
+ | mips64 | mips64el \
+ | mips64vr | mips64vrel \
+ | mips64orion | mips64orionel \
+ | mips64vr4100 | mips64vr4100el \
+ | mips64vr4300 | mips64vr4300el \
+ | mips64vr5000 | mips64vr5000el \
+ | mips64vr5900 | mips64vr5900el \
+ | mipsisa32 | mipsisa32el \
+ | mipsisa32r2 | mipsisa32r2el \
+ | mipsisa64 | mipsisa64el \
+ | mipsisa64r2 | mipsisa64r2el \
+ | mipsisa64sb1 | mipsisa64sb1el \
+ | mipsisa64sr71k | mipsisa64sr71kel \
+ | mipstx39 | mipstx39el \
+ | mn10200 | mn10300 \
+ | mt \
+ | msp430 \
+ | nios | nios2 \
+ | ns16k | ns32k \
+ | or32 \
+ | pdp10 | pdp11 | pj | pjl \
+ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
+ | pyramid \
+ | score \
+ | sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
+ | sh64 | sh64le \
+ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
+ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \
+ | spu | strongarm \
+ | tahoe | thumb | tic4x | tic80 | tron \
+ | v850 | v850e \
+ | we32k \
+ | x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \
+ | z8k)
+ basic_machine=$basic_machine-unknown
+ ;;
+ m6811 | m68hc11 | m6812 | m68hc12)
+ # Motorola 68HC11/12.
+ basic_machine=$basic_machine-unknown
+ os=-none
+ ;;
+ m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
+ ;;
+ ms1)
+ basic_machine=mt-unknown
+ ;;
+
+ # We use `pc' rather than `unknown'
+ # because (1) that's what they normally are, and
+ # (2) the word "unknown" tends to confuse beginning users.
+ i*86 | x86_64)
+ basic_machine=$basic_machine-pc
+ ;;
+ # Object if more than one company name word.
+ *-*-*)
+ echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+ exit 1
+ ;;
+ # Recognize the basic CPU types with company name.
+ 580-* \
+ | a29k-* \
+ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
+ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
+ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
+ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \
+ | avr-* | avr32-* \
+ | bfin-* | bs2000-* \
+ | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
+ | clipper-* | craynv-* | cydra-* \
+ | d10v-* | d30v-* | dlx-* \
+ | elxsi-* \
+ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
+ | h8300-* | h8500-* \
+ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
+ | i*86-* | i860-* | i960-* | ia64-* \
+ | ip2k-* | iq2000-* \
+ | m32c-* | m32r-* | m32rle-* \
+ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
+ | m88110-* | m88k-* | maxq-* | mcore-* \
+ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
+ | mips16-* \
+ | mips64-* | mips64el-* \
+ | mips64vr-* | mips64vrel-* \
+ | mips64orion-* | mips64orionel-* \
+ | mips64vr4100-* | mips64vr4100el-* \
+ | mips64vr4300-* | mips64vr4300el-* \
+ | mips64vr5000-* | mips64vr5000el-* \
+ | mips64vr5900-* | mips64vr5900el-* \
+ | mipsisa32-* | mipsisa32el-* \
+ | mipsisa32r2-* | mipsisa32r2el-* \
+ | mipsisa64-* | mipsisa64el-* \
+ | mipsisa64r2-* | mipsisa64r2el-* \
+ | mipsisa64sb1-* | mipsisa64sb1el-* \
+ | mipsisa64sr71k-* | mipsisa64sr71kel-* \
+ | mipstx39-* | mipstx39el-* \
+ | mmix-* \
+ | mt-* \
+ | msp430-* \
+ | nios-* | nios2-* \
+ | none-* | np1-* | ns16k-* | ns32k-* \
+ | orion-* \
+ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
+ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
+ | pyramid-* \
+ | romp-* | rs6000-* \
+ | sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
+ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
+ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
+ | sparclite-* \
+ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \
+ | tahoe-* | thumb-* \
+ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
+ | tron-* \
+ | v850-* | v850e-* | vax-* \
+ | we32k-* \
+ | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \
+ | xstormy16-* | xtensa*-* \
+ | ymp-* \
+ | z8k-*)
+ ;;
+ # Recognize the basic CPU types without company name, with glob match.
+ xtensa*)
+ basic_machine=$basic_machine-unknown
+ ;;
+ # Recognize the various machine names and aliases which stand
+ # for a CPU type and a company and sometimes even an OS.
+ 386bsd)
+ basic_machine=i386-unknown
+ os=-bsd
+ ;;
+ 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+ basic_machine=m68000-att
+ ;;
+ 3b*)
+ basic_machine=we32k-att
+ ;;
+ a29khif)
+ basic_machine=a29k-amd
+ os=-udi
+ ;;
+ abacus)
+ basic_machine=abacus-unknown
+ ;;
+ adobe68k)
+ basic_machine=m68010-adobe
+ os=-scout
+ ;;
+ alliant | fx80)
+ basic_machine=fx80-alliant
+ ;;
+ altos | altos3068)
+ basic_machine=m68k-altos
+ ;;
+ am29k)
+ basic_machine=a29k-none
+ os=-bsd
+ ;;
+ amd64)
+ basic_machine=x86_64-pc
+ ;;
+ amd64-*)
+ basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ amdahl)
+ basic_machine=580-amdahl
+ os=-sysv
+ ;;
+ amiga | amiga-*)
+ basic_machine=m68k-unknown
+ ;;
+ amigaos | amigados)
+ basic_machine=m68k-unknown
+ os=-amigaos
+ ;;
+ amigaunix | amix)
+ basic_machine=m68k-unknown
+ os=-sysv4
+ ;;
+ apollo68)
+ basic_machine=m68k-apollo
+ os=-sysv
+ ;;
+ apollo68bsd)
+ basic_machine=m68k-apollo
+ os=-bsd
+ ;;
+ aux)
+ basic_machine=m68k-apple
+ os=-aux
+ ;;
+ balance)
+ basic_machine=ns32k-sequent
+ os=-dynix
+ ;;
+ blackfin)
+ basic_machine=bfin-unknown
+ os=-linux
+ ;;
+ blackfin-*)
+ basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'`
+ os=-linux
+ ;;
+ c90)
+ basic_machine=c90-cray
+ os=-unicos
+ ;;
+ convex-c1)
+ basic_machine=c1-convex
+ os=-bsd
+ ;;
+ convex-c2)
+ basic_machine=c2-convex
+ os=-bsd
+ ;;
+ convex-c32)
+ basic_machine=c32-convex
+ os=-bsd
+ ;;
+ convex-c34)
+ basic_machine=c34-convex
+ os=-bsd
+ ;;
+ convex-c38)
+ basic_machine=c38-convex
+ os=-bsd
+ ;;
+ cray | j90)
+ basic_machine=j90-cray
+ os=-unicos
+ ;;
+ craynv)
+ basic_machine=craynv-cray
+ os=-unicosmp
+ ;;
+ cr16)
+ basic_machine=cr16-unknown
+ os=-elf
+ ;;
+ crds | unos)
+ basic_machine=m68k-crds
+ ;;
+ crisv32 | crisv32-* | etraxfs*)
+ basic_machine=crisv32-axis
+ ;;
+ cris | cris-* | etrax*)
+ basic_machine=cris-axis
+ ;;
+ crx)
+ basic_machine=crx-unknown
+ os=-elf
+ ;;
+ da30 | da30-*)
+ basic_machine=m68k-da30
+ ;;
+ decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
+ basic_machine=mips-dec
+ ;;
+ decsystem10* | dec10*)
+ basic_machine=pdp10-dec
+ os=-tops10
+ ;;
+ decsystem20* | dec20*)
+ basic_machine=pdp10-dec
+ os=-tops20
+ ;;
+ delta | 3300 | motorola-3300 | motorola-delta \
+ | 3300-motorola | delta-motorola)
+ basic_machine=m68k-motorola
+ ;;
+ delta88)
+ basic_machine=m88k-motorola
+ os=-sysv3
+ ;;
+ djgpp)
+ basic_machine=i586-pc
+ os=-msdosdjgpp
+ ;;
+ dpx20 | dpx20-*)
+ basic_machine=rs6000-bull
+ os=-bosx
+ ;;
+ dpx2* | dpx2*-bull)
+ basic_machine=m68k-bull
+ os=-sysv3
+ ;;
+ ebmon29k)
+ basic_machine=a29k-amd
+ os=-ebmon
+ ;;
+ elxsi)
+ basic_machine=elxsi-elxsi
+ os=-bsd
+ ;;
+ encore | umax | mmax)
+ basic_machine=ns32k-encore
+ ;;
+ es1800 | OSE68k | ose68k | ose | OSE)
+ basic_machine=m68k-ericsson
+ os=-ose
+ ;;
+ fx2800)
+ basic_machine=i860-alliant
+ ;;
+ genix)
+ basic_machine=ns32k-ns
+ ;;
+ gmicro)
+ basic_machine=tron-gmicro
+ os=-sysv
+ ;;
+ go32)
+ basic_machine=i386-pc
+ os=-go32
+ ;;
+ h3050r* | hiux*)
+ basic_machine=hppa1.1-hitachi
+ os=-hiuxwe2
+ ;;
+ h8300hms)
+ basic_machine=h8300-hitachi
+ os=-hms
+ ;;
+ h8300xray)
+ basic_machine=h8300-hitachi
+ os=-xray
+ ;;
+ h8500hms)
+ basic_machine=h8500-hitachi
+ os=-hms
+ ;;
+ harris)
+ basic_machine=m88k-harris
+ os=-sysv3
+ ;;
+ hp300-*)
+ basic_machine=m68k-hp
+ ;;
+ hp300bsd)
+ basic_machine=m68k-hp
+ os=-bsd
+ ;;
+ hp300hpux)
+ basic_machine=m68k-hp
+ os=-hpux
+ ;;
+ hp3k9[0-9][0-9] | hp9[0-9][0-9])
+ basic_machine=hppa1.0-hp
+ ;;
+ hp9k2[0-9][0-9] | hp9k31[0-9])
+ basic_machine=m68000-hp
+ ;;
+ hp9k3[2-9][0-9])
+ basic_machine=m68k-hp
+ ;;
+ hp9k6[0-9][0-9] | hp6[0-9][0-9])
+ basic_machine=hppa1.0-hp
+ ;;
+ hp9k7[0-79][0-9] | hp7[0-79][0-9])
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k78[0-9] | hp78[0-9])
+ # FIXME: really hppa2.0-hp
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
+ # FIXME: really hppa2.0-hp
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k8[0-9][13679] | hp8[0-9][13679])
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k8[0-9][0-9] | hp8[0-9][0-9])
+ basic_machine=hppa1.0-hp
+ ;;
+ hppa-next)
+ os=-nextstep3
+ ;;
+ hppaosf)
+ basic_machine=hppa1.1-hp
+ os=-osf
+ ;;
+ hppro)
+ basic_machine=hppa1.1-hp
+ os=-proelf
+ ;;
+ i370-ibm* | ibm*)
+ basic_machine=i370-ibm
+ ;;
+# I'm not sure what "Sysv32" means. Should this be sysv3.2?
+ i*86v32)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-sysv32
+ ;;
+ i*86v4*)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-sysv4
+ ;;
+ i*86v)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-sysv
+ ;;
+ i*86sol2)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-solaris2
+ ;;
+ i386mach)
+ basic_machine=i386-mach
+ os=-mach
+ ;;
+ i386-vsta | vsta)
+ basic_machine=i386-unknown
+ os=-vsta
+ ;;
+ iris | iris4d)
+ basic_machine=mips-sgi
+ case $os in
+ -irix*)
+ ;;
+ *)
+ os=-irix4
+ ;;
+ esac
+ ;;
+ isi68 | isi)
+ basic_machine=m68k-isi
+ os=-sysv
+ ;;
+ m68knommu)
+ basic_machine=m68k-unknown
+ os=-linux
+ ;;
+ m68knommu-*)
+ basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'`
+ os=-linux
+ ;;
+ m88k-omron*)
+ basic_machine=m88k-omron
+ ;;
+ magnum | m3230)
+ basic_machine=mips-mips
+ os=-sysv
+ ;;
+ merlin)
+ basic_machine=ns32k-utek
+ os=-sysv
+ ;;
+ mingw32)
+ basic_machine=i386-pc
+ os=-mingw32
+ ;;
+ mingw32ce)
+ basic_machine=arm-unknown
+ os=-mingw32ce
+ ;;
+ miniframe)
+ basic_machine=m68000-convergent
+ ;;
+ *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
+ basic_machine=m68k-atari
+ os=-mint
+ ;;
+ mips3*-*)
+ basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
+ ;;
+ mips3*)
+ basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
+ ;;
+ monitor)
+ basic_machine=m68k-rom68k
+ os=-coff
+ ;;
+ morphos)
+ basic_machine=powerpc-unknown
+ os=-morphos
+ ;;
+ msdos)
+ basic_machine=i386-pc
+ os=-msdos
+ ;;
+ ms1-*)
+ basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
+ ;;
+ mvs)
+ basic_machine=i370-ibm
+ os=-mvs
+ ;;
+ ncr3000)
+ basic_machine=i486-ncr
+ os=-sysv4
+ ;;
+ netbsd386)
+ basic_machine=i386-unknown
+ os=-netbsd
+ ;;
+ netwinder)
+ basic_machine=armv4l-rebel
+ os=-linux
+ ;;
+ news | news700 | news800 | news900)
+ basic_machine=m68k-sony
+ os=-newsos
+ ;;
+ news1000)
+ basic_machine=m68030-sony
+ os=-newsos
+ ;;
+ news-3600 | risc-news)
+ basic_machine=mips-sony
+ os=-newsos
+ ;;
+ necv70)
+ basic_machine=v70-nec
+ os=-sysv
+ ;;
+ next | m*-next )
+ basic_machine=m68k-next
+ case $os in
+ -nextstep* )
+ ;;
+ -ns2*)
+ os=-nextstep2
+ ;;
+ *)
+ os=-nextstep3
+ ;;
+ esac
+ ;;
+ nh3000)
+ basic_machine=m68k-harris
+ os=-cxux
+ ;;
+ nh[45]000)
+ basic_machine=m88k-harris
+ os=-cxux
+ ;;
+ nindy960)
+ basic_machine=i960-intel
+ os=-nindy
+ ;;
+ mon960)
+ basic_machine=i960-intel
+ os=-mon960
+ ;;
+ nonstopux)
+ basic_machine=mips-compaq
+ os=-nonstopux
+ ;;
+ np1)
+ basic_machine=np1-gould
+ ;;
+ nsr-tandem)
+ basic_machine=nsr-tandem
+ ;;
+ op50n-* | op60c-*)
+ basic_machine=hppa1.1-oki
+ os=-proelf
+ ;;
+ openrisc | openrisc-*)
+ basic_machine=or32-unknown
+ ;;
+ os400)
+ basic_machine=powerpc-ibm
+ os=-os400
+ ;;
+ OSE68000 | ose68000)
+ basic_machine=m68000-ericsson
+ os=-ose
+ ;;
+ os68k)
+ basic_machine=m68k-none
+ os=-os68k
+ ;;
+ pa-hitachi)
+ basic_machine=hppa1.1-hitachi
+ os=-hiuxwe2
+ ;;
+ paragon)
+ basic_machine=i860-intel
+ os=-osf
+ ;;
+ parisc)
+ basic_machine=hppa-unknown
+ os=-linux
+ ;;
+ parisc-*)
+ basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'`
+ os=-linux
+ ;;
+ pbd)
+ basic_machine=sparc-tti
+ ;;
+ pbb)
+ basic_machine=m68k-tti
+ ;;
+ pc532 | pc532-*)
+ basic_machine=ns32k-pc532
+ ;;
+ pc98)
+ basic_machine=i386-pc
+ ;;
+ pc98-*)
+ basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pentium | p5 | k5 | k6 | nexgen | viac3)
+ basic_machine=i586-pc
+ ;;
+ pentiumpro | p6 | 6x86 | athlon | athlon_*)
+ basic_machine=i686-pc
+ ;;
+ pentiumii | pentium2 | pentiumiii | pentium3)
+ basic_machine=i686-pc
+ ;;
+ pentium4)
+ basic_machine=i786-pc
+ ;;
+ pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
+ basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pentiumpro-* | p6-* | 6x86-* | athlon-*)
+ basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
+ basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pentium4-*)
+ basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pn)
+ basic_machine=pn-gould
+ ;;
+ power) basic_machine=power-ibm
+ ;;
+ ppc) basic_machine=powerpc-unknown
+ ;;
+ ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ppcle | powerpclittle | ppc-le | powerpc-little)
+ basic_machine=powerpcle-unknown
+ ;;
+ ppcle-* | powerpclittle-*)
+ basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ppc64) basic_machine=powerpc64-unknown
+ ;;
+ ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ppc64le | powerpc64little | ppc64-le | powerpc64-little)
+ basic_machine=powerpc64le-unknown
+ ;;
+ ppc64le-* | powerpc64little-*)
+ basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ps2)
+ basic_machine=i386-ibm
+ ;;
+ pw32)
+ basic_machine=i586-unknown
+ os=-pw32
+ ;;
+ rdos)
+ basic_machine=i386-pc
+ os=-rdos
+ ;;
+ rom68k)
+ basic_machine=m68k-rom68k
+ os=-coff
+ ;;
+ rm[46]00)
+ basic_machine=mips-siemens
+ ;;
+ rtpc | rtpc-*)
+ basic_machine=romp-ibm
+ ;;
+ s390 | s390-*)
+ basic_machine=s390-ibm
+ ;;
+ s390x | s390x-*)
+ basic_machine=s390x-ibm
+ ;;
+ sa29200)
+ basic_machine=a29k-amd
+ os=-udi
+ ;;
+ sb1)
+ basic_machine=mipsisa64sb1-unknown
+ ;;
+ sb1el)
+ basic_machine=mipsisa64sb1el-unknown
+ ;;
+ sde)
+ basic_machine=mipsisa32-sde
+ os=-elf
+ ;;
+ sei)
+ basic_machine=mips-sei
+ os=-seiux
+ ;;
+ sequent)
+ basic_machine=i386-sequent
+ ;;
+ sh)
+ basic_machine=sh-hitachi
+ os=-hms
+ ;;
+ sh5el)
+ basic_machine=sh5le-unknown
+ ;;
+ sh64)
+ basic_machine=sh64-unknown
+ ;;
+ sparclite-wrs | simso-wrs)
+ basic_machine=sparclite-wrs
+ os=-vxworks
+ ;;
+ sps7)
+ basic_machine=m68k-bull
+ os=-sysv2
+ ;;
+ spur)
+ basic_machine=spur-unknown
+ ;;
+ st2000)
+ basic_machine=m68k-tandem
+ ;;
+ stratus)
+ basic_machine=i860-stratus
+ os=-sysv4
+ ;;
+ sun2)
+ basic_machine=m68000-sun
+ ;;
+ sun2os3)
+ basic_machine=m68000-sun
+ os=-sunos3
+ ;;
+ sun2os4)
+ basic_machine=m68000-sun
+ os=-sunos4
+ ;;
+ sun3os3)
+ basic_machine=m68k-sun
+ os=-sunos3
+ ;;
+ sun3os4)
+ basic_machine=m68k-sun
+ os=-sunos4
+ ;;
+ sun4os3)
+ basic_machine=sparc-sun
+ os=-sunos3
+ ;;
+ sun4os4)
+ basic_machine=sparc-sun
+ os=-sunos4
+ ;;
+ sun4sol2)
+ basic_machine=sparc-sun
+ os=-solaris2
+ ;;
+ sun3 | sun3-*)
+ basic_machine=m68k-sun
+ ;;
+ sun4)
+ basic_machine=sparc-sun
+ ;;
+ sun386 | sun386i | roadrunner)
+ basic_machine=i386-sun
+ ;;
+ sv1)
+ basic_machine=sv1-cray
+ os=-unicos
+ ;;
+ symmetry)
+ basic_machine=i386-sequent
+ os=-dynix
+ ;;
+ t3e)
+ basic_machine=alphaev5-cray
+ os=-unicos
+ ;;
+ t90)
+ basic_machine=t90-cray
+ os=-unicos
+ ;;
+ tic54x | c54x*)
+ basic_machine=tic54x-unknown
+ os=-coff
+ ;;
+ tic55x | c55x*)
+ basic_machine=tic55x-unknown
+ os=-coff
+ ;;
+ tic6x | c6x*)
+ basic_machine=tic6x-unknown
+ os=-coff
+ ;;
+ tile*)
+ basic_machine=tile-unknown
+ os=-linux-gnu
+ ;;
+ tx39)
+ basic_machine=mipstx39-unknown
+ ;;
+ tx39el)
+ basic_machine=mipstx39el-unknown
+ ;;
+ toad1)
+ basic_machine=pdp10-xkl
+ os=-tops20
+ ;;
+ tower | tower-32)
+ basic_machine=m68k-ncr
+ ;;
+ tpf)
+ basic_machine=s390x-ibm
+ os=-tpf
+ ;;
+ udi29k)
+ basic_machine=a29k-amd
+ os=-udi
+ ;;
+ ultra3)
+ basic_machine=a29k-nyu
+ os=-sym1
+ ;;
+ v810 | necv810)
+ basic_machine=v810-nec
+ os=-none
+ ;;
+ vaxv)
+ basic_machine=vax-dec
+ os=-sysv
+ ;;
+ vms)
+ basic_machine=vax-dec
+ os=-vms
+ ;;
+ vpp*|vx|vx-*)
+ basic_machine=f301-fujitsu
+ ;;
+ vxworks960)
+ basic_machine=i960-wrs
+ os=-vxworks
+ ;;
+ vxworks68)
+ basic_machine=m68k-wrs
+ os=-vxworks
+ ;;
+ vxworks29k)
+ basic_machine=a29k-wrs
+ os=-vxworks
+ ;;
+ w65*)
+ basic_machine=w65-wdc
+ os=-none
+ ;;
+ w89k-*)
+ basic_machine=hppa1.1-winbond
+ os=-proelf
+ ;;
+ xbox)
+ basic_machine=i686-pc
+ os=-mingw32
+ ;;
+ xps | xps100)
+ basic_machine=xps100-honeywell
+ ;;
+ ymp)
+ basic_machine=ymp-cray
+ os=-unicos
+ ;;
+ z8k-*-coff)
+ basic_machine=z8k-unknown
+ os=-sim
+ ;;
+ none)
+ basic_machine=none-none
+ os=-none
+ ;;
+
+# Here we handle the default manufacturer of certain CPU types. It is in
+# some cases the only manufacturer, in others, it is the most popular.
+ w89k)
+ basic_machine=hppa1.1-winbond
+ ;;
+ op50n)
+ basic_machine=hppa1.1-oki
+ ;;
+ op60c)
+ basic_machine=hppa1.1-oki
+ ;;
+ romp)
+ basic_machine=romp-ibm
+ ;;
+ mmix)
+ basic_machine=mmix-knuth
+ ;;
+ rs6000)
+ basic_machine=rs6000-ibm
+ ;;
+ vax)
+ basic_machine=vax-dec
+ ;;
+ pdp10)
+ # there are many clones, so DEC is not a safe bet
+ basic_machine=pdp10-unknown
+ ;;
+ pdp11)
+ basic_machine=pdp11-dec
+ ;;
+ we32k)
+ basic_machine=we32k-att
+ ;;
+ sh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele)
+ basic_machine=sh-unknown
+ ;;
+ sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)
+ basic_machine=sparc-sun
+ ;;
+ cydra)
+ basic_machine=cydra-cydrome
+ ;;
+ orion)
+ basic_machine=orion-highlevel
+ ;;
+ orion105)
+ basic_machine=clipper-highlevel
+ ;;
+ mac | mpw | mac-mpw)
+ basic_machine=m68k-apple
+ ;;
+ pmac | pmac-mpw)
+ basic_machine=powerpc-apple
+ ;;
+ *-unknown)
+ # Make sure to match an already-canonicalized machine name.
+ ;;
+ *)
+ echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+ exit 1
+ ;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $basic_machine in
+ *-digital*)
+ basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
+ ;;
+ *-commodore*)
+ basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
+ ;;
+ *)
+ ;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if [ x"$os" != x"" ]
+then
+case $os in
+ # First match some system type aliases
+ # that might get confused with valid system types.
+ # -solaris* is a basic system type, with this one exception.
+ -solaris1 | -solaris1.*)
+ os=`echo $os | sed -e 's|solaris1|sunos4|'`
+ ;;
+ -solaris)
+ os=-solaris2
+ ;;
+ -svr4*)
+ os=-sysv4
+ ;;
+ -unixware*)
+ os=-sysv4.2uw
+ ;;
+ -gnu/linux*)
+ os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
+ ;;
+ # First accept the basic system types.
+ # The portable systems comes first.
+ # Each alternative MUST END IN A *, to match a version number.
+ # -sysv* is not here because it comes later, after sysvr4.
+ -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+ | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\
+ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
+ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+ | -aos* \
+ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
+ | -openbsd* | -solidbsd* \
+ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
+ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
+ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+ | -chorusos* | -chorusrdb* \
+ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+ | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \
+ | -uxpv* | -beos* | -mpeix* | -udk* \
+ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
+ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
+ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
+ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
+ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
+ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
+ | -skyos* | -haiku* | -rdos* | -toppers* | -drops*)
+ # Remember, each alternative MUST END IN *, to match a version number.
+ ;;
+ -qnx*)
+ case $basic_machine in
+ x86-* | i*86-*)
+ ;;
+ *)
+ os=-nto$os
+ ;;
+ esac
+ ;;
+ -nto-qnx*)
+ ;;
+ -nto*)
+ os=`echo $os | sed -e 's|nto|nto-qnx|'`
+ ;;
+ -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
+ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \
+ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
+ ;;
+ -mac*)
+ os=`echo $os | sed -e 's|mac|macos|'`
+ ;;
+ -linux-dietlibc)
+ os=-linux-dietlibc
+ ;;
+ -linux*)
+ os=`echo $os | sed -e 's|linux|linux-gnu|'`
+ ;;
+ -sunos5*)
+ os=`echo $os | sed -e 's|sunos5|solaris2|'`
+ ;;
+ -sunos6*)
+ os=`echo $os | sed -e 's|sunos6|solaris3|'`
+ ;;
+ -opened*)
+ os=-openedition
+ ;;
+ -os400*)
+ os=-os400
+ ;;
+ -wince*)
+ os=-wince
+ ;;
+ -osfrose*)
+ os=-osfrose
+ ;;
+ -osf*)
+ os=-osf
+ ;;
+ -utek*)
+ os=-bsd
+ ;;
+ -dynix*)
+ os=-bsd
+ ;;
+ -acis*)
+ os=-aos
+ ;;
+ -atheos*)
+ os=-atheos
+ ;;
+ -syllable*)
+ os=-syllable
+ ;;
+ -386bsd)
+ os=-bsd
+ ;;
+ -ctix* | -uts*)
+ os=-sysv
+ ;;
+ -nova*)
+ os=-rtmk-nova
+ ;;
+ -ns2 )
+ os=-nextstep2
+ ;;
+ -nsk*)
+ os=-nsk
+ ;;
+ # Preserve the version number of sinix5.
+ -sinix5.*)
+ os=`echo $os | sed -e 's|sinix|sysv|'`
+ ;;
+ -sinix*)
+ os=-sysv4
+ ;;
+ -tpf*)
+ os=-tpf
+ ;;
+ -triton*)
+ os=-sysv3
+ ;;
+ -oss*)
+ os=-sysv3
+ ;;
+ -svr4)
+ os=-sysv4
+ ;;
+ -svr3)
+ os=-sysv3
+ ;;
+ -sysvr4)
+ os=-sysv4
+ ;;
+ # This must come after -sysvr4.
+ -sysv*)
+ ;;
+ -ose*)
+ os=-ose
+ ;;
+ -es1800*)
+ os=-ose
+ ;;
+ -xenix)
+ os=-xenix
+ ;;
+ -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+ os=-mint
+ ;;
+ -aros*)
+ os=-aros
+ ;;
+ -kaos*)
+ os=-kaos
+ ;;
+ -zvmoe)
+ os=-zvmoe
+ ;;
+ -none)
+ ;;
+ *)
+ # Get rid of the `-' at the beginning of $os.
+ os=`echo $os | sed 's/[^-]*-//'`
+ echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
+ exit 1
+ ;;
+esac
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system. Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+case $basic_machine in
+ score-*)
+ os=-elf
+ ;;
+ spu-*)
+ os=-elf
+ ;;
+ *-acorn)
+ os=-riscix1.2
+ ;;
+ arm*-rebel)
+ os=-linux
+ ;;
+ arm*-semi)
+ os=-aout
+ ;;
+ c4x-* | tic4x-*)
+ os=-coff
+ ;;
+ # This must come before the *-dec entry.
+ pdp10-*)
+ os=-tops20
+ ;;
+ pdp11-*)
+ os=-none
+ ;;
+ *-dec | vax-*)
+ os=-ultrix4.2
+ ;;
+ m68*-apollo)
+ os=-domain
+ ;;
+ i386-sun)
+ os=-sunos4.0.2
+ ;;
+ m68000-sun)
+ os=-sunos3
+ # This also exists in the configure program, but was not the
+ # default.
+ # os=-sunos4
+ ;;
+ m68*-cisco)
+ os=-aout
+ ;;
+ mep-*)
+ os=-elf
+ ;;
+ mips*-cisco)
+ os=-elf
+ ;;
+ mips*-*)
+ os=-elf
+ ;;
+ or32-*)
+ os=-coff
+ ;;
+ *-tti) # must be before sparc entry or we get the wrong os.
+ os=-sysv3
+ ;;
+ sparc-* | *-sun)
+ os=-sunos4.1.1
+ ;;
+ *-be)
+ os=-beos
+ ;;
+ *-haiku)
+ os=-haiku
+ ;;
+ *-ibm)
+ os=-aix
+ ;;
+ *-knuth)
+ os=-mmixware
+ ;;
+ *-wec)
+ os=-proelf
+ ;;
+ *-winbond)
+ os=-proelf
+ ;;
+ *-oki)
+ os=-proelf
+ ;;
+ *-hp)
+ os=-hpux
+ ;;
+ *-hitachi)
+ os=-hiux
+ ;;
+ i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+ os=-sysv
+ ;;
+ *-cbm)
+ os=-amigaos
+ ;;
+ *-dg)
+ os=-dgux
+ ;;
+ *-dolphin)
+ os=-sysv3
+ ;;
+ m68k-ccur)
+ os=-rtu
+ ;;
+ m88k-omron*)
+ os=-luna
+ ;;
+ *-next )
+ os=-nextstep
+ ;;
+ *-sequent)
+ os=-ptx
+ ;;
+ *-crds)
+ os=-unos
+ ;;
+ *-ns)
+ os=-genix
+ ;;
+ i370-*)
+ os=-mvs
+ ;;
+ *-next)
+ os=-nextstep3
+ ;;
+ *-gould)
+ os=-sysv
+ ;;
+ *-highlevel)
+ os=-bsd
+ ;;
+ *-encore)
+ os=-bsd
+ ;;
+ *-sgi)
+ os=-irix
+ ;;
+ *-siemens)
+ os=-sysv4
+ ;;
+ *-masscomp)
+ os=-rtu
+ ;;
+ f30[01]-fujitsu | f700-fujitsu)
+ os=-uxpv
+ ;;
+ *-rom68k)
+ os=-coff
+ ;;
+ *-*bug)
+ os=-coff
+ ;;
+ *-apple)
+ os=-macos
+ ;;
+ *-atari*)
+ os=-mint
+ ;;
+ *)
+ os=-none
+ ;;
+esac
+fi
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer. We pick the logical manufacturer.
+vendor=unknown
+case $basic_machine in
+ *-unknown)
+ case $os in
+ -riscix*)
+ vendor=acorn
+ ;;
+ -sunos*)
+ vendor=sun
+ ;;
+ -aix*)
+ vendor=ibm
+ ;;
+ -beos*)
+ vendor=be
+ ;;
+ -hpux*)
+ vendor=hp
+ ;;
+ -mpeix*)
+ vendor=hp
+ ;;
+ -hiux*)
+ vendor=hitachi
+ ;;
+ -unos*)
+ vendor=crds
+ ;;
+ -dgux*)
+ vendor=dg
+ ;;
+ -luna*)
+ vendor=omron
+ ;;
+ -genix*)
+ vendor=ns
+ ;;
+ -mvs* | -opened*)
+ vendor=ibm
+ ;;
+ -os400*)
+ vendor=ibm
+ ;;
+ -ptx*)
+ vendor=sequent
+ ;;
+ -tpf*)
+ vendor=ibm
+ ;;
+ -vxsim* | -vxworks* | -windiss*)
+ vendor=wrs
+ ;;
+ -aux*)
+ vendor=apple
+ ;;
+ -hms*)
+ vendor=hitachi
+ ;;
+ -mpw* | -macos*)
+ vendor=apple
+ ;;
+ -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+ vendor=atari
+ ;;
+ -vos*)
+ vendor=stratus
+ ;;
+ esac
+ basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
+ ;;
+esac
+
+echo $basic_machine$os
+exit
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/config_usb_printer.py b/config_usb_printer.py
new file mode 100755
index 0000000..62e2a6b
--- /dev/null
+++ b/config_usb_printer.py
@@ -0,0 +1,272 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2011-2014 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Amarnath Chitumalla
+#
+
+__version__ = '1.0'
+__title__ = 'HP device setup using USB'
+__mod__ = 'hp-config_usb_printer'
+__doc__ = "Detects HP printers connected using USB and installs HPLIP printers and faxes in the CUPS spooler. Tries to automatically determine the correct PPD file to use."
+
+# Std Lib
+import sys
+import os
+import getopt
+import commands
+import re
+import time
+
+# Local
+from base.g import *
+from base import device,utils, tui, models,module
+from prnt import cups
+
+
+LPSTAT_PAT = re.compile(r"""(\S*): (.*)""", re.IGNORECASE)
+USB_PATTERN = re.compile(r'''serial=(.*)''',re.IGNORECASE)
+BACK_END_PATTERN = re.compile(r'''(.*):(.*)''',re.IGNORECASE)
+DBUS_SERVICE='com.hplip.StatusService'
+
+##### METHODS #####
+
+# Returns already existing print queues for this printer.
+def get_already_added_queues(udev_MDL, udev_serial_no, udev_back_end,remove_non_hp_config):
+ status, output = utils.run('lpstat -v')
+
+ same_printer_queues = []
+ for p in output.splitlines():
+ try:
+ match = LPSTAT_PAT.search(p)
+ printer_name = match.group(1)
+ device_uri = match.group(2)
+ if device_uri.startswith("cups-pdf:/"):
+ continue
+ if not USB_PATTERN.search(device_uri):
+ continue
+
+ back_end = BACK_END_PATTERN.search(device_uri).group(1)
+ serial = USB_PATTERN.search(device_uri).group(1)
+ log.debug("udev_serial_no[%s] serial[%s] udev_back_end[%s] back_end[%s]"%(udev_serial_no, serial, udev_back_end, back_end))
+ if udev_serial_no == serial and (udev_back_end == back_end or back_end == 'usb'):
+ if remove_non_hp_config and printer_name.find('_') == -1 and printer_name.find('-') != -1:
+ log.debug("Removed %s Queue"%printer_name)
+ # remove queues using cups API
+ cups.delPrinter(printer_name)
+ else:
+ same_printer_queues.append(printer_name)
+
+ except AttributeError:
+ pass
+
+ log.debug(same_printer_queues)
+ return same_printer_queues
+
+def check_cups_process():
+ cups_running_sts = False
+ sts, output = utils.run('lpstat -r')
+ if sts == 0 and ('is running' in output):
+ cups_running_sts = True
+
+ return cups_running_sts
+
+
+def showPasswordUI(prompt):
+ import getpass
+ print ""
+ print log.bold(prompt)
+ username = raw_input("Username: ")
+ password = getpass.getpass("Password: ")
+
+ return (username, password)
+
+
+# Restart cups
+def restart_cups():
+ if os.path.exists('/etc/init.d/cups'):
+ return '/etc/init.d/cups restart'
+
+ elif os.path.exists('/etc/init.d/cupsys'):
+ return '/etc/init.d/cupsys restart'
+
+ else:
+ return 'killall -HUP cupsd'
+
+
+# Send dbus event to hpssd on dbus system bus
+def send_message(device_uri, printer_name, event_code, username, job_id, title, pipe_name=''):
+ log.debug("send_message() entered")
+ args = [device_uri, printer_name, event_code, username, job_id, title, pipe_name]
+ msg = lowlevel.SignalMessage('/', DBUS_SERVICE, 'Event')
+ msg.append(signature='ssisiss', *args)
+ SystemBus().send_message(msg)
+ log.debug("send_message() returning")
+
+
+# Usage function
+def usage(typ='text'):
+ utils.format_text(USAGE, typ, __title__, __mod__, __version__)
+ sys.exit(0)
+
+# Systray service. If hp-systray is not running, starts.
+def start_systray():
+ Systray_Is_Running=False
+ status,output = utils.Is_Process_Running('hp-systray')
+ if status is False:
+ log.debug("hp-systray is not running.")
+ if os.getuid() == 0:
+ log.error("Run \'hp-systray &\' in a terminal. ")
+ else:
+ log.debug("Starting hp-systray service")
+ child_pid = os.fork()
+ if child_pid == 0:
+ status,output =utils.run('hp-systray &', True, None, 1, False)
+ if status is not 0:
+ log.error("Failed to start \'hp-systray\' service. Manually run \'hp-sysray &\' from terminal as non-root user.")
+ sys.exit()
+ else:
+ time.sleep(1)
+ status,output = utils.Is_Process_Running('hp-systray')
+ if status is True:
+ Systray_Is_Running=True
+ else:
+ Systray_Is_Running=True
+ log.debug("hp-systray service is running\n")
+ return Systray_Is_Running
+
+
+USAGE = [ (__doc__, "", "name", True),
+ ("Usage: %s [OPTIONS] [SERIAL NO.|USB bus:device]" % __mod__, "", "summary", True),
+ utils.USAGE_OPTIONS,
+ utils.USAGE_LOGGING1, utils.USAGE_LOGGING2, utils.USAGE_LOGGING3,
+ utils.USAGE_HELP,
+ ("[SERIAL NO.|USB bus:device]", "", "heading", False),
+ ("USB bus:device :", """"xxx:yyy" where 'xxx' is the USB bus and 'yyy' is the USB device. (Note: The ':' and all leading zeros must be present.)""", 'option', False),
+ ("", "Use the 'lsusb' command to obtain this information.", "option", False),
+ ("SERIAL NO.:", '"serial no." (future use)', "option", True),
+ utils.USAGE_EXAMPLES,
+ ("USB, IDs specified:", "$%s 001:002"%(__mod__), "example", False),
+ ("USB, using serial number:", "$%s US12345678A"%(__mod__), "example", False),
+ utils.USAGE_SPACE,
+ utils.USAGE_NOTES,
+ ("1. Using 'lsusb' to obtain USB IDs: (example)", "", 'note', False),
+ (" $ lsusb", "", 'note', False),
+ (" Bus 003 Device 011: ID 03f0:c202 Hewlett-Packard", "", 'note', False),
+ (" $ %s 003:011"%(__mod__), "", 'note', False),
+ (" (Note: You may have to run 'lsusb' from /sbin or another location. Use '$ locate lsusb' to determine this.)", "", 'note', True),
+ ]
+
+
+
+mod = module.Module(__mod__, __title__, __version__, __doc__, USAGE, (INTERACTIVE_MODE, GUI_MODE), (UI_TOOLKIT_QT3, UI_TOOLKIT_QT4), run_as_root_ok=True, quiet=True)
+
+opts, device_uri, printer_name, mode, ui_toolkit, loc = \
+ mod.parseStdOpts('gh',['time-out=', 'timeout='],handle_device_printer=False)
+
+
+LOG_FILE = "/var/log/hp/hplip_config_usb_printer.log"
+if os.path.exists(LOG_FILE):
+ os.remove(LOG_FILE)
+
+log.set_logfile(LOG_FILE)
+log.set_where(log.LOG_TO_CONSOLE_AND_FILE)
+cmd="chmod 777 "+LOG_FILE
+sts,output = utils.run(cmd)
+if sts != 0:
+ log.warn("Failed to change log file permissions: %s" %output)
+
+cmd="chgrp lp "+LOG_FILE
+sts,output = utils.run(cmd)
+if sts != 0:
+ log.warn("Failed to change log file group permissions: %s" %output)
+
+try:
+ import dbus
+ from dbus import SystemBus, lowlevel
+except ImportError:
+ log.error("hp-check-plugin Tool requires dBus and python-dbus")
+ sys.exit(1)
+
+try:
+ param = mod.args[0]
+except IndexError:
+ param = ''
+
+log.debug("param=%s" % param)
+if len(param) < 1:
+ usage()
+ sys.exit()
+
+try:
+ # ******************************* MAKEURI
+ if param:
+ device_uri, sane_uri, fax_uri = device.makeURI(param)
+ if not device_uri:
+ log.error("This is not a valid device")
+ sys.exit(0)
+
+ # ******************************* QUERY MODEL AND COLLECT PPDS
+ log.debug("\nSetting up device: %s\n" % device_uri)
+ back_end, is_hp, bus, model, serial, dev_file, host, zc, port = device.parseDeviceURI(device_uri)
+
+ mq = device.queryModelByURI(device_uri)
+ if not mq or mq.get('support-type', SUPPORT_TYPE_NONE) == SUPPORT_TYPE_NONE:
+ log.error("Unsupported printer model.")
+ sys.exit(1)
+ while check_cups_process() is False:
+ log.debug("CUPS is not running.. waiting for 30 sec")
+ time.sleep(30)
+
+ time.sleep(1)
+ norm_model = models.normalizeModelName(model).lower()
+ remove_non_hp_config =True
+ if not mq.get('fax-type', FAX_TYPE_NONE) in (FAX_TYPE_NONE, FAX_TYPE_NOT_SUPPORTED):
+ fax_config_list = get_already_added_queues(norm_model, serial, 'hpfax',remove_non_hp_config)
+
+
+ printer_config_list = get_already_added_queues(norm_model, serial, back_end, remove_non_hp_config)
+ if len(printer_config_list) ==0 or len(printer_config_list) == 0:
+ cmd ="hp-setup -i -x -a -q %s"%param
+ log.debug("%s"%cmd)
+ os.system(cmd)
+
+ if start_systray():
+ printer_name = ""
+ username = ""
+ send_message( device_uri, printer_name, EVENT_ADD_PRINTQUEUE, username, 0,'')
+ send_message( device_uri, printer_name, EVENT_DIAGNOSE_PRINTQUEUE, username, 0,'')
+ else:
+ if start_systray():
+ printer_name = ""
+ username = ""
+ send_message( device_uri, printer_name, EVENT_DIAGNOSE_PRINTQUEUE, username, 0,'')
+
+ # Cleaning CUPS created Queues. If any,
+ i =0
+ while i <24:
+ time.sleep(5)
+ get_already_added_queues(norm_model, serial, 'hpfax',remove_non_hp_config)
+ get_already_added_queues(norm_model, serial, 'hp',remove_non_hp_config)
+ i += 1
+
+
+except KeyboardInterrupt:
+ log.error("User exit")
+
+log.debug("Done.")
diff --git a/configure b/configure
new file mode 100755
index 0000000..9d54dde
--- /dev/null
+++ b/configure
@@ -0,0 +1,25721 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.63 for HP Linux Imaging and Printing 3.12.4.
+#
+# Report bugs to <3.12.4>.
+#
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+# 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## --------------------- ##
+## M4sh Initialization. ##
+## --------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else
+ case `(set -o) 2>/dev/null` in
+ *posix*) set -o posix ;;
+esac
+
+fi
+
+
+
+
+# PATH needs CR
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+if (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+ as_echo='printf %s\n'
+ as_echo_n='printf %s'
+else
+ if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+ as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+ as_echo_n='/usr/ucb/echo -n'
+ else
+ as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+ as_echo_n_body='eval
+ arg=$1;
+ case $arg in
+ *"$as_nl"*)
+ expr "X$arg" : "X\\(.*\\)$as_nl";
+ arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+ esac;
+ expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+ '
+ export as_echo_n_body
+ as_echo_n='sh -c $as_echo_n_body as_echo'
+ fi
+ export as_echo_body
+ as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ PATH_SEPARATOR=:
+ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+ (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+ PATH_SEPARATOR=';'
+ }
+fi
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+ as_unset=unset
+else
+ as_unset=false
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order. Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" "" $as_nl"
+
+# Find who we are. Look in the path if we contain no directory separator.
+case $0 in
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+IFS=$as_save_IFS
+
+ ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+ as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+ $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ { (exit 1); exit 1; }
+fi
+
+# Work around bugs in pre-3.0 UWIN ksh.
+for as_var in ENV MAIL MAILPATH
+do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+ test "X`expr 00001 : '.*\(...\)'`" = X001; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+
+# CDPATH.
+$as_unset CDPATH
+
+
+if test "x$CONFIG_SHELL" = x; then
+ if (eval ":") 2>/dev/null; then
+ as_have_required=yes
+else
+ as_have_required=no
+fi
+
+ if test $as_have_required = yes && (eval ":
+(as_func_return () {
+ (exit \$1)
+}
+as_func_success () {
+ as_func_return 0
+}
+as_func_failure () {
+ as_func_return 1
+}
+as_func_ret_success () {
+ return 0
+}
+as_func_ret_failure () {
+ return 1
+}
+
+exitcode=0
+if as_func_success; then
+ :
+else
+ exitcode=1
+ echo as_func_success failed.
+fi
+
+if as_func_failure; then
+ exitcode=1
+ echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+ :
+else
+ exitcode=1
+ echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+ exitcode=1
+ echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = \"\$1\" ); then
+ :
+else
+ exitcode=1
+ echo positional parameters were not saved.
+fi
+
+test \$exitcode = 0) || { (exit 1); exit 1; }
+
+(
+ as_lineno_1=\$LINENO
+ as_lineno_2=\$LINENO
+ test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" &&
+ test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; }
+") 2> /dev/null; then
+ :
+else
+ as_candidate_shells=
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ case $as_dir in
+ /*)
+ for as_base in sh bash ksh sh5; do
+ as_candidate_shells="$as_candidate_shells $as_dir/$as_base"
+ done;;
+ esac
+done
+IFS=$as_save_IFS
+
+
+ for as_shell in $as_candidate_shells $SHELL; do
+ # Try only shells that exist, to save several forks.
+ if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+ { ("$as_shell") 2> /dev/null <<\_ASEOF
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else
+ case `(set -o) 2>/dev/null` in
+ *posix*) set -o posix ;;
+esac
+
+fi
+
+
+:
+_ASEOF
+}; then
+ CONFIG_SHELL=$as_shell
+ as_have_required=yes
+ if { "$as_shell" 2> /dev/null <<\_ASEOF
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else
+ case `(set -o) 2>/dev/null` in
+ *posix*) set -o posix ;;
+esac
+
+fi
+
+
+:
+(as_func_return () {
+ (exit $1)
+}
+as_func_success () {
+ as_func_return 0
+}
+as_func_failure () {
+ as_func_return 1
+}
+as_func_ret_success () {
+ return 0
+}
+as_func_ret_failure () {
+ return 1
+}
+
+exitcode=0
+if as_func_success; then
+ :
+else
+ exitcode=1
+ echo as_func_success failed.
+fi
+
+if as_func_failure; then
+ exitcode=1
+ echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+ :
+else
+ exitcode=1
+ echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+ exitcode=1
+ echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = "$1" ); then
+ :
+else
+ exitcode=1
+ echo positional parameters were not saved.
+fi
+
+test $exitcode = 0) || { (exit 1); exit 1; }
+
+(
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; }
+
+_ASEOF
+}; then
+ break
+fi
+
+fi
+
+ done
+
+ if test "x$CONFIG_SHELL" != x; then
+ for as_var in BASH_ENV ENV
+ do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+ done
+ export CONFIG_SHELL
+ exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"}
+fi
+
+
+ if test $as_have_required = no; then
+ echo This script requires a shell more modern than all the
+ echo shells that I found on your system. Please install a
+ echo modern shell, or manually run the script under such a
+ echo shell if you do have one.
+ { (exit 1); exit 1; }
+fi
+
+
+fi
+
+fi
+
+
+
+(eval "as_func_return () {
+ (exit \$1)
+}
+as_func_success () {
+ as_func_return 0
+}
+as_func_failure () {
+ as_func_return 1
+}
+as_func_ret_success () {
+ return 0
+}
+as_func_ret_failure () {
+ return 1
+}
+
+exitcode=0
+if as_func_success; then
+ :
+else
+ exitcode=1
+ echo as_func_success failed.
+fi
+
+if as_func_failure; then
+ exitcode=1
+ echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+ :
+else
+ exitcode=1
+ echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+ exitcode=1
+ echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = \"\$1\" ); then
+ :
+else
+ exitcode=1
+ echo positional parameters were not saved.
+fi
+
+test \$exitcode = 0") || {
+ echo No shell found that supports shell functions.
+ echo Please tell bug-autoconf@gnu.org about your system,
+ echo including any error possibly output before this message.
+ echo This can help us improve future autoconf versions.
+ echo Configuration will now proceed without shell functions.
+}
+
+
+
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || {
+
+ # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+ # uniformly replaced by the line number. The first 'sed' inserts a
+ # line-number line after each line using $LINENO; the second 'sed'
+ # does the real work. The second script uses 'N' to pair each
+ # line-number line with the line containing $LINENO, and appends
+ # trailing '-' during substitution so that $LINENO is not a special
+ # case at line end.
+ # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+ # scripts with optimization help from Paolo Bonzini. Blame Lee
+ # E. McMahon (1931-1989) for sed's syntax. :-)
+ sed -n '
+ p
+ /[$]LINENO/=
+ ' <$as_myself |
+ sed '
+ s/[$]LINENO.*/&-/
+ t lineno
+ b
+ :lineno
+ N
+ :loop
+ s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+ t loop
+ s/-\n.*//
+ ' >$as_me.lineno &&
+ chmod +x "$as_me.lineno" ||
+ { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+ { (exit 1); exit 1; }; }
+
+ # Don't try to exec as it changes $[0], causing all sort of problems
+ # (the dirname of $[0] is not the place where we might find the
+ # original and so on. Autoconf is especially sensitive to this).
+ . "./$as_me.lineno"
+ # Exit status is that of the last command.
+ exit
+}
+
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+ as_dirname=dirname
+else
+ as_dirname=false
+fi
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in
+-n*)
+ case `echo 'x\c'` in
+ *c*) ECHO_T=' ';; # ECHO_T is single tab character.
+ *) ECHO_C='\c';;
+ esac;;
+*)
+ ECHO_N='-n';;
+esac
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+ test "X`expr 00001 : '.*\(...\)'`" = X001; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+ rm -f conf$$.dir/conf$$.file
+else
+ rm -f conf$$.dir
+ mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+ if ln -s conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s='ln -s'
+ # ... but there are two gotchas:
+ # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+ # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+ # In both cases, we have to default to `cp -p'.
+ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+ as_ln_s='cp -p'
+ elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+ else
+ as_ln_s='cp -p'
+ fi
+else
+ as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p=:
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+if test -x / >/dev/null 2>&1; then
+ as_test_x='test -x'
+else
+ if ls -dL / >/dev/null 2>&1; then
+ as_ls_L_option=L
+ else
+ as_ls_L_option=
+ fi
+ as_test_x='
+ eval sh -c '\''
+ if test -d "$1"; then
+ test -d "$1/.";
+ else
+ case $1 in
+ -*)set "./$1";;
+ esac;
+ case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in
+ ???[sx]*):;;*)false;;esac;fi
+ '\'' sh
+ '
+fi
+as_executable_p=$as_test_x
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+
+
+# Check that we are running under the correct shell.
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+case X$ECHO in
+X*--fallback-echo)
+ # Remove one level of quotation (which was required for Make).
+ ECHO=`echo "$ECHO" | sed 's,\\\\\$\\$0,'$0','`
+ ;;
+esac
+
+echo=${ECHO-echo}
+if test "X$1" = X--no-reexec; then
+ # Discard the --no-reexec flag, and continue.
+ shift
+elif test "X$1" = X--fallback-echo; then
+ # Avoid inline document here, it may be left over
+ :
+elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then
+ # Yippee, $echo works!
+ :
+else
+ # Restart under the correct shell.
+ exec $SHELL "$0" --no-reexec ${1+"$@"}
+fi
+
+if test "X$1" = X--fallback-echo; then
+ # used as fallback echo
+ shift
+ cat <<EOF
+$*
+EOF
+ exit 0
+fi
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+if test -z "$ECHO"; then
+if test "X${echo_test_string+set}" != Xset; then
+# find a string as large as possible, as long as the shell can cope with it
+ for cmd in 'sed 50q "$0"' 'sed 20q "$0"' 'sed 10q "$0"' 'sed 2q "$0"' 'echo test'; do
+ # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ...
+ if (echo_test_string=`eval $cmd`) 2>/dev/null &&
+ echo_test_string=`eval $cmd` &&
+ (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null
+ then
+ break
+ fi
+ done
+fi
+
+if test "X`($echo '\t') 2>/dev/null`" = 'X\t' &&
+ echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ :
+else
+ # The Solaris, AIX, and Digital Unix default echo programs unquote
+ # backslashes. This makes it impossible to quote backslashes using
+ # echo "$something" | sed 's/\\/\\\\/g'
+ #
+ # So, first we look for a working echo in the user's PATH.
+
+ lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+ for dir in $PATH /usr/ucb; do
+ IFS="$lt_save_ifs"
+ if (test -f $dir/echo || test -f $dir/echo$ac_exeext) &&
+ test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' &&
+ echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ echo="$dir/echo"
+ break
+ fi
+ done
+ IFS="$lt_save_ifs"
+
+ if test "X$echo" = Xecho; then
+ # We didn't find a better echo, so look for alternatives.
+ if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' &&
+ echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ # This shell has a builtin print -r that does the trick.
+ echo='print -r'
+ elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) &&
+ test "X$CONFIG_SHELL" != X/bin/ksh; then
+ # If we have ksh, try running configure again with it.
+ ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
+ export ORIGINAL_CONFIG_SHELL
+ CONFIG_SHELL=/bin/ksh
+ export CONFIG_SHELL
+ exec $CONFIG_SHELL "$0" --no-reexec ${1+"$@"}
+ else
+ # Try using printf.
+ echo='printf %s\n'
+ if test "X`($echo '\t') 2>/dev/null`" = 'X\t' &&
+ echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ # Cool, printf works
+ :
+ elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` &&
+ test "X$echo_testing_string" = 'X\t' &&
+ echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL
+ export CONFIG_SHELL
+ SHELL="$CONFIG_SHELL"
+ export SHELL
+ echo="$CONFIG_SHELL $0 --fallback-echo"
+ elif echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` &&
+ test "X$echo_testing_string" = 'X\t' &&
+ echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ echo="$CONFIG_SHELL $0 --fallback-echo"
+ else
+ # maybe with a smaller string...
+ prev=:
+
+ for cmd in 'echo test' 'sed 2q "$0"' 'sed 10q "$0"' 'sed 20q "$0"' 'sed 50q "$0"'; do
+ if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null
+ then
+ break
+ fi
+ prev="$cmd"
+ done
+
+ if test "$prev" != 'sed 50q "$0"'; then
+ echo_test_string=`eval $prev`
+ export echo_test_string
+ exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "$0" ${1+"$@"}
+ else
+ # Oops. We lost completely, so just stick with echo.
+ echo=echo
+ fi
+ fi
+ fi
+ fi
+fi
+fi
+
+# Copy echo and quote the copy suitably for passing to libtool from
+# the Makefile, instead of quoting the original, which is used later.
+ECHO=$echo
+if test "X$ECHO" = "X$CONFIG_SHELL $0 --fallback-echo"; then
+ ECHO="$CONFIG_SHELL \\\$\$0 --fallback-echo"
+fi
+
+
+
+
+tagnames=${tagnames+${tagnames},}CXX
+
+tagnames=${tagnames+${tagnames},}F77
+
+exec 7<&0 </dev/null 6>&1
+
+# Name of the host.
+# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_clean_files=
+ac_config_libobj_dir=.
+LIBOBJS=
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+# Identity of this package.
+PACKAGE_NAME='HP Linux Imaging and Printing'
+PACKAGE_TARNAME='hplip'
+PACKAGE_VERSION='3.12.4'
+PACKAGE_STRING='HP Linux Imaging and Printing 3.12.4'
+PACKAGE_BUGREPORT='3.12.4'
+
+# Factoring default headers for most tests.
+ac_includes_default="\
+#include <stdio.h>
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#ifdef STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# ifdef HAVE_STDLIB_H
+# include <stdlib.h>
+# endif
+#endif
+#ifdef HAVE_STRING_H
+# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
+# include <memory.h>
+# endif
+# include <string.h>
+#endif
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
+#ifdef HAVE_STDINT_H
+# include <stdint.h>
+#endif
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif"
+
+ac_subst_vars='am__EXEEXT_FALSE
+am__EXEEXT_TRUE
+LTLIBOBJS
+LIBOBJS
+udev_acl_rules
+SNMPLIB
+hpcups_only_build
+lite_build
+hpijs_only_build
+policykit_dir
+policykit
+epm_scan
+epm_print_only_exclude
+epm_hpijs_only
+epm_hpcups_only
+epm_lite
+epm_full
+epm_qt3
+epm_qt4
+epm_hpcups_install
+epm_hpijs_install
+epm_cups_drv_install
+epm_foomatic_drv_install
+epm_cups_ppd_install
+epm_foomatic_ppd_install
+epm_foomatic_rip_hplip_install
+qt4
+qt3
+platform
+ui_toolkit
+APDK_AUTO_INCLUDE_FLAG
+APDK_ENDIAN_FLAG
+shadow_build
+doc_build
+hpcups_install
+hpijs_install
+cups_drv_install
+cups_ppd_install
+foomatic_filter
+foomatic_rip_hplip_install
+foomatic_ppd_install
+foomatic_drv_install
+cups11_build
+dbus_build
+fax_build
+scan_build
+gui_build
+pp_build
+network_build
+drvdir
+hpdocdir
+hpppddir
+cupsfilterdir
+cupsbackenddir
+systraydir
+icondir
+mimedir
+abs_mimedir
+abs_drvdir
+abs_ppddir
+abs_docdir
+abs_hpppddir
+abs_sbindir
+abs_datadir
+DBUS_LIBS
+DBUS_CFLAGS
+PKG_CONFIG
+PYTHONINCLUDEDIR
+pkgpyexecdir
+pyexecdir
+pkgpythondir
+pythondir
+PYTHON_PLATFORM
+PYTHON_EXEC_PREFIX
+PYTHON_PREFIX
+PYTHON_VERSION
+PYTHON
+POLICYKIT_INSTALL_FALSE
+POLICYKIT_INSTALL_TRUE
+QT3_INSTALL_FALSE
+QT3_INSTALL_TRUE
+QT4_INSTALL_FALSE
+QT4_INSTALL_TRUE
+RIP_INSTALL_FALSE
+RIP_INSTALL_TRUE
+CUPS_PPD_INSTALL_FALSE
+CUPS_PPD_INSTALL_TRUE
+CUPS_DRV_INSTALL_FALSE
+CUPS_DRV_INSTALL_TRUE
+FOOMATIC_DRV_INSTALL_FALSE
+FOOMATIC_DRV_INSTALL_TRUE
+FOOMATIC_PPD_INSTALL_FALSE
+FOOMATIC_PPD_INSTALL_TRUE
+SHADOW_BUILD_FALSE
+SHADOW_BUILD_TRUE
+UDEV_ACL_RULES_FALSE
+UDEV_ACL_RULES_TRUE
+FAX_BUILD_FALSE
+FAX_BUILD_TRUE
+GUI_BUILD_FALSE
+GUI_BUILD_TRUE
+SCAN_BUILD_FALSE
+SCAN_BUILD_TRUE
+NETWORK_BUILD_FALSE
+NETWORK_BUILD_TRUE
+NEW_HPCUPS_FALSE
+NEW_HPCUPS_TRUE
+HPCUPS_INSTALL_FALSE
+HPCUPS_INSTALL_TRUE
+HPIJS_INSTALL_FALSE
+HPIJS_INSTALL_TRUE
+FULL_BUILD_FALSE
+FULL_BUILD_TRUE
+HPLIP_BUILD_FALSE
+HPLIP_BUILD_TRUE
+HPCUPS_ONLY_BUILD_FALSE
+HPCUPS_ONLY_BUILD_TRUE
+LITE_BUILD_FALSE
+LITE_BUILD_TRUE
+HPIJS_ONLY_BUILD_FALSE
+HPIJS_ONLY_BUILD_TRUE
+DOC_BUILD_FALSE
+DOC_BUILD_TRUE
+DARWIN_BUILD_FALSE
+DARWIN_BUILD_TRUE
+LIBTOOL
+ac_ct_F77
+FFLAGS
+F77
+CXXCPP
+CPP
+NMEDIT
+DSYMUTIL
+RANLIB
+AR
+ECHO
+LN_S
+EGREP
+GREP
+SED
+host_os
+host_vendor
+host_cpu
+host
+build_os
+build_vendor
+build_cpu
+build
+am__fastdepCC_FALSE
+am__fastdepCC_TRUE
+CCDEPMODE
+ac_ct_CC
+CFLAGS
+CC
+am__fastdepCXX_FALSE
+am__fastdepCXX_TRUE
+CXXDEPMODE
+AMDEPBACKSLASH
+AMDEP_FALSE
+AMDEP_TRUE
+am__quote
+am__include
+DEPDIR
+OBJEXT
+EXEEXT
+ac_ct_CXX
+CPPFLAGS
+LDFLAGS
+CXXFLAGS
+CXX
+am__untar
+am__tar
+AMTAR
+am__leading_dot
+SET_MAKE
+AWK
+mkdir_p
+MKDIR_P
+INSTALL_STRIP_PROGRAM
+STRIP
+install_sh
+MAKEINFO
+AUTOHEADER
+AUTOMAKE
+AUTOCONF
+ACLOCAL
+VERSION
+PACKAGE
+CYGPATH_W
+am__isrc
+INSTALL_DATA
+INSTALL_SCRIPT
+INSTALL_PROGRAM
+target_alias
+host_alias
+build_alias
+LIBS
+ECHO_T
+ECHO_N
+ECHO_C
+DEFS
+mandir
+localedir
+libdir
+psdir
+pdfdir
+dvidir
+htmldir
+infodir
+docdir
+oldincludedir
+includedir
+localstatedir
+sharedstatedir
+sysconfdir
+datadir
+datarootdir
+libexecdir
+sbindir
+bindir
+program_transform_name
+prefix
+exec_prefix
+PACKAGE_BUGREPORT
+PACKAGE_STRING
+PACKAGE_VERSION
+PACKAGE_TARNAME
+PACKAGE_NAME
+PATH_SEPARATOR
+SHELL'
+ac_subst_files=''
+ac_user_opts='
+enable_option_checking
+enable_static
+enable_dependency_tracking
+enable_shared
+enable_fast_install
+with_gnu_ld
+enable_libtool_lock
+with_pic
+with_tags
+enable_doc_build
+enable_hpijs_only_build
+enable_lite_build
+enable_hpcups_only_build
+enable_hpijs_install
+enable_hpcups_install
+enable_new_hpcups
+enable_network_build
+enable_pp_build
+enable_scan_build
+enable_gui_build
+enable_fax_build
+enable_dbus_build
+enable_cups11_build
+enable_udev_acl_rules
+enable_shadow_build
+with_cupsbackenddir
+with_cupsfilterdir
+with_icondir
+with_systraydir
+with_hpppddir
+with_mimedir
+with_docdir
+enable_foomatic_ppd_install
+with_drvdir
+enable_foomatic_drv_install
+enable_cups_drv_install
+enable_cups_ppd_install
+enable_foomatic_rip_hplip_install
+enable_qt4
+enable_qt3
+enable_policykit
+'
+ ac_precious_vars='build_alias
+host_alias
+target_alias
+CXX
+CXXFLAGS
+LDFLAGS
+LIBS
+CPPFLAGS
+CCC
+CC
+CFLAGS
+CPP
+CXXCPP
+F77
+FFLAGS
+PYTHON
+PYTHONINCLUDEDIR
+PKG_CONFIG
+DBUS_CFLAGS
+DBUS_LIBS'
+
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+ac_unrecognized_opts=
+ac_unrecognized_sep=
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+# (The list follows the same order as the GNU Coding Standards.)
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datarootdir='${prefix}/share'
+datadir='${datarootdir}'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
+infodir='${datarootdir}/info'
+htmldir='${docdir}'
+dvidir='${docdir}'
+pdfdir='${docdir}'
+psdir='${docdir}'
+libdir='${exec_prefix}/lib'
+localedir='${datarootdir}/locale'
+mandir='${datarootdir}/man'
+
+ac_prev=
+ac_dashdash=
+for ac_option
+do
+ # If the previous option needs an argument, assign it.
+ if test -n "$ac_prev"; then
+ eval $ac_prev=\$ac_option
+ ac_prev=
+ continue
+ fi
+
+ case $ac_option in
+ *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+ *) ac_optarg=yes ;;
+ esac
+
+ # Accept the important Cygnus configure options, so we can diagnose typos.
+
+ case $ac_dashdash$ac_option in
+ --)
+ ac_dashdash=yes ;;
+
+ -bindir | --bindir | --bindi | --bind | --bin | --bi)
+ ac_prev=bindir ;;
+ -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+ bindir=$ac_optarg ;;
+
+ -build | --build | --buil | --bui | --bu)
+ ac_prev=build_alias ;;
+ -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+ build_alias=$ac_optarg ;;
+
+ -cache-file | --cache-file | --cache-fil | --cache-fi \
+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+ ac_prev=cache_file ;;
+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+ cache_file=$ac_optarg ;;
+
+ --config-cache | -C)
+ cache_file=config.cache ;;
+
+ -datadir | --datadir | --datadi | --datad)
+ ac_prev=datadir ;;
+ -datadir=* | --datadir=* | --datadi=* | --datad=*)
+ datadir=$ac_optarg ;;
+
+ -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
+ | --dataroo | --dataro | --datar)
+ ac_prev=datarootdir ;;
+ -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
+ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
+ datarootdir=$ac_optarg ;;
+
+ -disable-* | --disable-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ { $as_echo "$as_me: error: invalid feature name: $ac_useropt" >&2
+ { (exit 1); exit 1; }; }
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"enable_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval enable_$ac_useropt=no ;;
+
+ -docdir | --docdir | --docdi | --doc | --do)
+ ac_prev=docdir ;;
+ -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
+ docdir=$ac_optarg ;;
+
+ -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
+ ac_prev=dvidir ;;
+ -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
+ dvidir=$ac_optarg ;;
+
+ -enable-* | --enable-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ { $as_echo "$as_me: error: invalid feature name: $ac_useropt" >&2
+ { (exit 1); exit 1; }; }
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"enable_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval enable_$ac_useropt=\$ac_optarg ;;
+
+ -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+ | --exec | --exe | --ex)
+ ac_prev=exec_prefix ;;
+ -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+ | --exec=* | --exe=* | --ex=*)
+ exec_prefix=$ac_optarg ;;
+
+ -gas | --gas | --ga | --g)
+ # Obsolete; use --with-gas.
+ with_gas=yes ;;
+
+ -help | --help | --hel | --he | -h)
+ ac_init_help=long ;;
+ -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+ ac_init_help=recursive ;;
+ -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+ ac_init_help=short ;;
+
+ -host | --host | --hos | --ho)
+ ac_prev=host_alias ;;
+ -host=* | --host=* | --hos=* | --ho=*)
+ host_alias=$ac_optarg ;;
+
+ -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
+ ac_prev=htmldir ;;
+ -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
+ | --ht=*)
+ htmldir=$ac_optarg ;;
+
+ -includedir | --includedir | --includedi | --included | --include \
+ | --includ | --inclu | --incl | --inc)
+ ac_prev=includedir ;;
+ -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+ | --includ=* | --inclu=* | --incl=* | --inc=*)
+ includedir=$ac_optarg ;;
+
+ -infodir | --infodir | --infodi | --infod | --info | --inf)
+ ac_prev=infodir ;;
+ -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+ infodir=$ac_optarg ;;
+
+ -libdir | --libdir | --libdi | --libd)
+ ac_prev=libdir ;;
+ -libdir=* | --libdir=* | --libdi=* | --libd=*)
+ libdir=$ac_optarg ;;
+
+ -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+ | --libexe | --libex | --libe)
+ ac_prev=libexecdir ;;
+ -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+ | --libexe=* | --libex=* | --libe=*)
+ libexecdir=$ac_optarg ;;
+
+ -localedir | --localedir | --localedi | --localed | --locale)
+ ac_prev=localedir ;;
+ -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
+ localedir=$ac_optarg ;;
+
+ -localstatedir | --localstatedir | --localstatedi | --localstated \
+ | --localstate | --localstat | --localsta | --localst | --locals)
+ ac_prev=localstatedir ;;
+ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
+ localstatedir=$ac_optarg ;;
+
+ -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+ ac_prev=mandir ;;
+ -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+ mandir=$ac_optarg ;;
+
+ -nfp | --nfp | --nf)
+ # Obsolete; use --without-fp.
+ with_fp=no ;;
+
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c | -n)
+ no_create=yes ;;
+
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+ no_recursion=yes ;;
+
+ -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+ | --oldin | --oldi | --old | --ol | --o)
+ ac_prev=oldincludedir ;;
+ -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+ oldincludedir=$ac_optarg ;;
+
+ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+ ac_prev=prefix ;;
+ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+ prefix=$ac_optarg ;;
+
+ -program-prefix | --program-prefix | --program-prefi | --program-pref \
+ | --program-pre | --program-pr | --program-p)
+ ac_prev=program_prefix ;;
+ -program-prefix=* | --program-prefix=* | --program-prefi=* \
+ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+ program_prefix=$ac_optarg ;;
+
+ -program-suffix | --program-suffix | --program-suffi | --program-suff \
+ | --program-suf | --program-su | --program-s)
+ ac_prev=program_suffix ;;
+ -program-suffix=* | --program-suffix=* | --program-suffi=* \
+ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+ program_suffix=$ac_optarg ;;
+
+ -program-transform-name | --program-transform-name \
+ | --program-transform-nam | --program-transform-na \
+ | --program-transform-n | --program-transform- \
+ | --program-transform | --program-transfor \
+ | --program-transfo | --program-transf \
+ | --program-trans | --program-tran \
+ | --progr-tra | --program-tr | --program-t)
+ ac_prev=program_transform_name ;;
+ -program-transform-name=* | --program-transform-name=* \
+ | --program-transform-nam=* | --program-transform-na=* \
+ | --program-transform-n=* | --program-transform-=* \
+ | --program-transform=* | --program-transfor=* \
+ | --program-transfo=* | --program-transf=* \
+ | --program-trans=* | --program-tran=* \
+ | --progr-tra=* | --program-tr=* | --program-t=*)
+ program_transform_name=$ac_optarg ;;
+
+ -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
+ ac_prev=pdfdir ;;
+ -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
+ pdfdir=$ac_optarg ;;
+
+ -psdir | --psdir | --psdi | --psd | --ps)
+ ac_prev=psdir ;;
+ -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
+ psdir=$ac_optarg ;;
+
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ silent=yes ;;
+
+ -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+ ac_prev=sbindir ;;
+ -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+ | --sbi=* | --sb=*)
+ sbindir=$ac_optarg ;;
+
+ -sharedstatedir | --sharedstatedir | --sharedstatedi \
+ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+ | --sharedst | --shareds | --shared | --share | --shar \
+ | --sha | --sh)
+ ac_prev=sharedstatedir ;;
+ -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+ | --sha=* | --sh=*)
+ sharedstatedir=$ac_optarg ;;
+
+ -site | --site | --sit)
+ ac_prev=site ;;
+ -site=* | --site=* | --sit=*)
+ site=$ac_optarg ;;
+
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+ ac_prev=srcdir ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+ srcdir=$ac_optarg ;;
+
+ -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+ | --syscon | --sysco | --sysc | --sys | --sy)
+ ac_prev=sysconfdir ;;
+ -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+ sysconfdir=$ac_optarg ;;
+
+ -target | --target | --targe | --targ | --tar | --ta | --t)
+ ac_prev=target_alias ;;
+ -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+ target_alias=$ac_optarg ;;
+
+ -v | -verbose | --verbose | --verbos | --verbo | --verb)
+ verbose=yes ;;
+
+ -version | --version | --versio | --versi | --vers | -V)
+ ac_init_version=: ;;
+
+ -with-* | --with-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ { $as_echo "$as_me: error: invalid package name: $ac_useropt" >&2
+ { (exit 1); exit 1; }; }
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"with_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval with_$ac_useropt=\$ac_optarg ;;
+
+ -without-* | --without-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ { $as_echo "$as_me: error: invalid package name: $ac_useropt" >&2
+ { (exit 1); exit 1; }; }
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"with_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval with_$ac_useropt=no ;;
+
+ --x)
+ # Obsolete; use --with-x.
+ with_x=yes ;;
+
+ -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+ | --x-incl | --x-inc | --x-in | --x-i)
+ ac_prev=x_includes ;;
+ -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+ x_includes=$ac_optarg ;;
+
+ -x-libraries | --x-libraries | --x-librarie | --x-librari \
+ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+ ac_prev=x_libraries ;;
+ -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+ x_libraries=$ac_optarg ;;
+
+ -*) { $as_echo "$as_me: error: unrecognized option: $ac_option
+Try \`$0 --help' for more information." >&2
+ { (exit 1); exit 1; }; }
+ ;;
+
+ *=*)
+ ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
+ { $as_echo "$as_me: error: invalid variable name: $ac_envvar" >&2
+ { (exit 1); exit 1; }; }
+ eval $ac_envvar=\$ac_optarg
+ export $ac_envvar ;;
+
+ *)
+ # FIXME: should be removed in autoconf 3.0.
+ $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+ expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+ $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+ : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
+ ;;
+
+ esac
+done
+
+if test -n "$ac_prev"; then
+ ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+ { $as_echo "$as_me: error: missing argument to $ac_option" >&2
+ { (exit 1); exit 1; }; }
+fi
+
+if test -n "$ac_unrecognized_opts"; then
+ case $enable_option_checking in
+ no) ;;
+ fatal) { $as_echo "$as_me: error: unrecognized options: $ac_unrecognized_opts" >&2
+ { (exit 1); exit 1; }; } ;;
+ *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
+ esac
+fi
+
+# Check all directory arguments for consistency.
+for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \
+ datadir sysconfdir sharedstatedir localstatedir includedir \
+ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
+ libdir localedir mandir
+do
+ eval ac_val=\$$ac_var
+ # Remove trailing slashes.
+ case $ac_val in
+ */ )
+ ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
+ eval $ac_var=\$ac_val;;
+ esac
+ # Be sure to have absolute directory names.
+ case $ac_val in
+ [\\/$]* | ?:[\\/]* ) continue;;
+ NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
+ esac
+ { $as_echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+ { (exit 1); exit 1; }; }
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+ if test "x$build_alias" = x; then
+ cross_compiling=maybe
+ $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
+ If a cross compiler is detected then cross compile mode will be used." >&2
+ elif test "x$build_alias" != "x$host_alias"; then
+ cross_compiling=yes
+ fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+ac_pwd=`pwd` && test -n "$ac_pwd" &&
+ac_ls_di=`ls -di .` &&
+ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
+ { $as_echo "$as_me: error: working directory cannot be determined" >&2
+ { (exit 1); exit 1; }; }
+test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+ { $as_echo "$as_me: error: pwd does not report name of working directory" >&2
+ { (exit 1); exit 1; }; }
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+ ac_srcdir_defaulted=yes
+ # Try the directory containing this script, then the parent directory.
+ ac_confdir=`$as_dirname -- "$as_myself" ||
+$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_myself" : 'X\(//\)[^/]' \| \
+ X"$as_myself" : 'X\(//\)$' \| \
+ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_myself" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ srcdir=$ac_confdir
+ if test ! -r "$srcdir/$ac_unique_file"; then
+ srcdir=..
+ fi
+else
+ ac_srcdir_defaulted=no
+fi
+if test ! -r "$srcdir/$ac_unique_file"; then
+ test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
+ { $as_echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
+ { (exit 1); exit 1; }; }
+fi
+ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ac_abs_confdir=`(
+ cd "$srcdir" && test -r "./$ac_unique_file" || { $as_echo "$as_me: error: $ac_msg" >&2
+ { (exit 1); exit 1; }; }
+ pwd)`
+# When building in place, set srcdir=.
+if test "$ac_abs_confdir" = "$ac_pwd"; then
+ srcdir=.
+fi
+# Remove unnecessary trailing slashes from srcdir.
+# Double slashes in file names in object file debugging info
+# mess up M-x gdb in Emacs.
+case $srcdir in
+*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
+esac
+for ac_var in $ac_precious_vars; do
+ eval ac_env_${ac_var}_set=\${${ac_var}+set}
+ eval ac_env_${ac_var}_value=\$${ac_var}
+ eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
+ eval ac_cv_env_${ac_var}_value=\$${ac_var}
+done
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+ # Omit some internal or obsolete options to make the list less imposing.
+ # This message is too long to be a string in the A/UX 3.1 sh.
+ cat <<_ACEOF
+\`configure' configures HP Linux Imaging and Printing 3.12.4 to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE. See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+ -h, --help display this help and exit
+ --help=short display options specific to this package
+ --help=recursive display the short help of all the included packages
+ -V, --version display version information and exit
+ -q, --quiet, --silent do not print \`checking...' messages
+ --cache-file=FILE cache test results in FILE [disabled]
+ -C, --config-cache alias for \`--cache-file=config.cache'
+ -n, --no-create do not create output files
+ --srcdir=DIR find the sources in DIR [configure dir or \`..']
+
+Installation directories:
+ --prefix=PREFIX install architecture-independent files in PREFIX
+ [$ac_default_prefix]
+ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
+ [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+ --bindir=DIR user executables [EPREFIX/bin]
+ --sbindir=DIR system admin executables [EPREFIX/sbin]
+ --libexecdir=DIR program executables [EPREFIX/libexec]
+ --sysconfdir=DIR read-only single-machine data [PREFIX/etc]
+ --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
+ --localstatedir=DIR modifiable single-machine data [PREFIX/var]
+ --libdir=DIR object code libraries [EPREFIX/lib]
+ --includedir=DIR C header files [PREFIX/include]
+ --oldincludedir=DIR C header files for non-gcc [/usr/include]
+ --datarootdir=DIR read-only arch.-independent data root [PREFIX/share]
+ --datadir=DIR read-only architecture-independent data [DATAROOTDIR]
+ --infodir=DIR info documentation [DATAROOTDIR/info]
+ --localedir=DIR locale-dependent data [DATAROOTDIR/locale]
+ --mandir=DIR man documentation [DATAROOTDIR/man]
+ --docdir=DIR documentation root [DATAROOTDIR/doc/hplip]
+ --htmldir=DIR html documentation [DOCDIR]
+ --dvidir=DIR dvi documentation [DOCDIR]
+ --pdfdir=DIR pdf documentation [DOCDIR]
+ --psdir=DIR ps documentation [DOCDIR]
+_ACEOF
+
+ cat <<\_ACEOF
+
+Program names:
+ --program-prefix=PREFIX prepend PREFIX to installed program names
+ --program-suffix=SUFFIX append SUFFIX to installed program names
+ --program-transform-name=PROGRAM run sed PROGRAM on installed program names
+
+System types:
+ --build=BUILD configure for building on BUILD [guessed]
+ --host=HOST cross-compile to build programs to run on HOST [BUILD]
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+ case $ac_init_help in
+ short | recursive ) echo "Configuration of HP Linux Imaging and Printing 3.12.4:";;
+ esac
+ cat <<\_ACEOF
+
+Optional Features:
+ --disable-option-checking ignore unrecognized --enable/--with options
+ --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
+ --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
+ --enable-static[=PKGS] build static libraries [default=no]
+ --disable-dependency-tracking speeds up one-time build
+ --enable-dependency-tracking do not reject slow dependency extractors
+ --enable-shared[=PKGS] build shared libraries [default=yes]
+ --enable-fast-install[=PKGS]
+ optimize for fast installation [default=yes]
+ --disable-libtool-lock avoid locking (might break parallel builds)
+ --enable-doc-build enable documentation build (default=yes)
+ --enable-hpijs-only-build enable hpijs only build (default=yes)
+ --enable-lite-build enable lite build, print & scan only (default=no)
+ --enable-hpcups-only-build enable hpcups only build, print only (default=no)
+ --enable-hpijs-install enable hpijs install (default=no)
+ --enable-hpcups-install enable hpcups install (default=yes)
+ --enable-new-hpcups enable new hpcups install (default=no)
+ --enable-network-build enable network build (default=yes)
+ --enable-pp-build enable parallel port build (default=no)
+ --enable-scan-build enable scanner build (default=yes)
+ --enable-gui-build enable gui build (default=yes)
+ --enable-fax-build enable fax build (default=yes)
+ --enable-dbus-build enable dbus build (default=yes)
+ --enable-cups11-build enable cups 1.1.x build (default=no)
+ --enable-udev-acl-rules enable udev acl rules (default=no)
+ --enable-shadow-build enable shadow build (default=no)
+ --enable-foomatic-ppd-install enable foomatic static ppd install (default=no), uses hpppddir
+ --enable-foomatic-drv-install enable foomatic dynamic ppd install (default=no), uses drvdir and hpppddir
+ --enable-cups-drv-install enable cups dynamic ppd install (default=yes), uses drvdir and hpppddir
+ --enable-cups-ppd-install enable cups static ppd install (default=no), uses hpppddir
+ --enable-foomatic-rip-hplip-install enable foomatic-rip-hplip install (default=no), uses cupsfilterdir
+ --enable-qt4 enable qt4 (default=yes)
+ --enable-qt3 enable qt3 (default=no)
+ --enable-policykit enable PolicyKit (default=no)
+
+Optional Packages:
+ --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
+ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
+ --with-gnu-ld assume the C compiler uses GNU ld [default=no]
+ --with-pic try to use only PIC/non-PIC objects [default=use
+ both]
+ --with-tags[=TAGS] include additional configurations [automatic]
+ --with-cupsbackenddir=DIR
+ set cups backend install directory
+ default=/usr/lib/cups/backend
+ --with-cupsfilterdir=DIR
+ set cups filter install directory
+ default=/usr/lib/cups/filter
+ --with-icondir=DIR set hplip.desktop install directory
+ default=/usr/share/applications
+ --with-systraydir=DIR set hplip-systray.desktop install directory
+ default=/etc/xdg/autostart
+ --with-hpppddir=DIR set hp ppd install directory
+ default=datadir/ppd/HP
+ --with-mimedir=DIR set cups mime.types location default=abs_mimedir
+ --with-docdir=DIR set hplip documentation directory
+ default=datadir/doc
+ --with-drvdir=DIR set cups drv install directory
+ default=datadir/cups/drv/hp
+
+Some influential environment variables:
+ CXX C++ compiler command
+ CXXFLAGS C++ compiler flags
+ LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a
+ nonstandard directory <lib dir>
+ LIBS libraries to pass to the linker, e.g. -l<library>
+ CPPFLAGS C/C++/Objective C preprocessor flags, e.g. -I<include dir> if
+ you have headers in a nonstandard directory <include dir>
+ CC C compiler command
+ CFLAGS C compiler flags
+ CPP C preprocessor
+ CXXCPP C++ preprocessor
+ F77 Fortran 77 compiler command
+ FFLAGS Fortran 77 compiler flags
+ PYTHON Python interpreter/compiler command
+ PYTHONINCLUDEDIR
+ path to Python.h C header file
+ PKG_CONFIG path to pkg-config utility
+ DBUS_CFLAGS C compiler flags for DBUS, overriding pkg-config
+ DBUS_LIBS linker flags for DBUS, overriding pkg-config
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+Report bugs to <3.12.4>.
+_ACEOF
+ac_status=$?
+fi
+
+if test "$ac_init_help" = "recursive"; then
+ # If there are subdirs, report their specific --help.
+ for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+ test -d "$ac_dir" ||
+ { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
+ continue
+ ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+ ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+ # A ".." for each directory in $ac_dir_suffix.
+ ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+ case $ac_top_builddir_sub in
+ "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+ *) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+ esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+ .) # We are building in place.
+ ac_srcdir=.
+ ac_top_srcdir=$ac_top_builddir_sub
+ ac_abs_top_srcdir=$ac_pwd ;;
+ [\\/]* | ?:[\\/]* ) # Absolute name.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir
+ ac_abs_top_srcdir=$srcdir ;;
+ *) # Relative name.
+ ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_build_prefix$srcdir
+ ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+ cd "$ac_dir" || { ac_status=$?; continue; }
+ # Check for guested configure.
+ if test -f "$ac_srcdir/configure.gnu"; then
+ echo &&
+ $SHELL "$ac_srcdir/configure.gnu" --help=recursive
+ elif test -f "$ac_srcdir/configure"; then
+ echo &&
+ $SHELL "$ac_srcdir/configure" --help=recursive
+ else
+ $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+ fi || ac_status=$?
+ cd "$ac_pwd" || { ac_status=$?; break; }
+ done
+fi
+
+test -n "$ac_init_help" && exit $ac_status
+if $ac_init_version; then
+ cat <<\_ACEOF
+HP Linux Imaging and Printing configure 3.12.4
+generated by GNU Autoconf 2.63
+
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+ exit
+fi
+cat >config.log <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by HP Linux Imaging and Printing $as_me 3.12.4, which was
+generated by GNU Autoconf 2.63. Invocation command line was
+
+ $ $0 $@
+
+_ACEOF
+exec 5>>config.log
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown`
+
+/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown`
+/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown`
+/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown`
+/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown`
+/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ $as_echo "PATH: $as_dir"
+done
+IFS=$as_save_IFS
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+ for ac_arg
+ do
+ case $ac_arg in
+ -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ continue ;;
+ *\'*)
+ ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ case $ac_pass in
+ 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;;
+ 2)
+ ac_configure_args1="$ac_configure_args1 '$ac_arg'"
+ if test $ac_must_keep_next = true; then
+ ac_must_keep_next=false # Got value, back to normal.
+ else
+ case $ac_arg in
+ *=* | --config-cache | -C | -disable-* | --disable-* \
+ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+ | -with-* | --with-* | -without-* | --without-* | --x)
+ case "$ac_configure_args0 " in
+ "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+ esac
+ ;;
+ -* ) ac_must_keep_next=true ;;
+ esac
+ fi
+ ac_configure_args="$ac_configure_args '$ac_arg'"
+ ;;
+ esac
+ done
+done
+$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; }
+$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; }
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log. We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Use '\'' to represent an apostrophe within the trap.
+# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
+trap 'exit_status=$?
+ # Save into config.log some information that might help in debugging.
+ {
+ echo
+
+ cat <<\_ASBOX
+## ---------------- ##
+## Cache variables. ##
+## ---------------- ##
+_ASBOX
+ echo
+ # The following way of writing the cache mishandles newlines in values,
+(
+ for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
+ eval ac_val=\$$ac_var
+ case $ac_val in #(
+ *${as_nl}*)
+ case $ac_var in #(
+ *_cv_*) { $as_echo "$as_me:$LINENO: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+ esac
+ case $ac_var in #(
+ _ | IFS | as_nl) ;; #(
+ BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+ *) $as_unset $ac_var ;;
+ esac ;;
+ esac
+ done
+ (set) 2>&1 |
+ case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
+ *${as_nl}ac_space=\ *)
+ sed -n \
+ "s/'\''/'\''\\\\'\'''\''/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
+ ;; #(
+ *)
+ sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+ ;;
+ esac |
+ sort
+)
+ echo
+
+ cat <<\_ASBOX
+## ----------------- ##
+## Output variables. ##
+## ----------------- ##
+_ASBOX
+ echo
+ for ac_var in $ac_subst_vars
+ do
+ eval ac_val=\$$ac_var
+ case $ac_val in
+ *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ esac
+ $as_echo "$ac_var='\''$ac_val'\''"
+ done | sort
+ echo
+
+ if test -n "$ac_subst_files"; then
+ cat <<\_ASBOX
+## ------------------- ##
+## File substitutions. ##
+## ------------------- ##
+_ASBOX
+ echo
+ for ac_var in $ac_subst_files
+ do
+ eval ac_val=\$$ac_var
+ case $ac_val in
+ *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ esac
+ $as_echo "$ac_var='\''$ac_val'\''"
+ done | sort
+ echo
+ fi
+
+ if test -s confdefs.h; then
+ cat <<\_ASBOX
+## ----------- ##
+## confdefs.h. ##
+## ----------- ##
+_ASBOX
+ echo
+ cat confdefs.h
+ echo
+ fi
+ test "$ac_signal" != 0 &&
+ $as_echo "$as_me: caught signal $ac_signal"
+ $as_echo "$as_me: exit $exit_status"
+ } >&5
+ rm -f core *.core core.conftest.* &&
+ rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
+ exit $exit_status
+' 0
+for ac_signal in 1 2 13 15; do
+ trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -f -r conftest* confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer an explicitly selected file to automatically selected ones.
+ac_site_file1=NONE
+ac_site_file2=NONE
+if test -n "$CONFIG_SITE"; then
+ ac_site_file1=$CONFIG_SITE
+elif test "x$prefix" != xNONE; then
+ ac_site_file1=$prefix/share/config.site
+ ac_site_file2=$prefix/etc/config.site
+else
+ ac_site_file1=$ac_default_prefix/share/config.site
+ ac_site_file2=$ac_default_prefix/etc/config.site
+fi
+for ac_site_file in "$ac_site_file1" "$ac_site_file2"
+do
+ test "x$ac_site_file" = xNONE && continue
+ if test -r "$ac_site_file"; then
+ { $as_echo "$as_me:$LINENO: loading site script $ac_site_file" >&5
+$as_echo "$as_me: loading site script $ac_site_file" >&6;}
+ sed 's/^/| /' "$ac_site_file" >&5
+ . "$ac_site_file"
+ fi
+done
+
+if test -r "$cache_file"; then
+ # Some versions of bash will fail to source /dev/null (special
+ # files actually), so we avoid doing that.
+ if test -f "$cache_file"; then
+ { $as_echo "$as_me:$LINENO: loading cache $cache_file" >&5
+$as_echo "$as_me: loading cache $cache_file" >&6;}
+ case $cache_file in
+ [\\/]* | ?:[\\/]* ) . "$cache_file";;
+ *) . "./$cache_file";;
+ esac
+ fi
+else
+ { $as_echo "$as_me:$LINENO: creating cache $cache_file" >&5
+$as_echo "$as_me: creating cache $cache_file" >&6;}
+ >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in $ac_precious_vars; do
+ eval ac_old_set=\$ac_cv_env_${ac_var}_set
+ eval ac_new_set=\$ac_env_${ac_var}_set
+ eval ac_old_val=\$ac_cv_env_${ac_var}_value
+ eval ac_new_val=\$ac_env_${ac_var}_value
+ case $ac_old_set,$ac_new_set in
+ set,)
+ { $as_echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,set)
+ { $as_echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,);;
+ *)
+ if test "x$ac_old_val" != "x$ac_new_val"; then
+ # differences in whitespace do not lead to failure.
+ ac_old_val_w=`echo x $ac_old_val`
+ ac_new_val_w=`echo x $ac_new_val`
+ if test "$ac_old_val_w" != "$ac_new_val_w"; then
+ { $as_echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5
+$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+ ac_cache_corrupted=:
+ else
+ { $as_echo "$as_me:$LINENO: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
+$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
+ eval $ac_var=\$ac_old_val
+ fi
+ { $as_echo "$as_me:$LINENO: former value: \`$ac_old_val'" >&5
+$as_echo "$as_me: former value: \`$ac_old_val'" >&2;}
+ { $as_echo "$as_me:$LINENO: current value: \`$ac_new_val'" >&5
+$as_echo "$as_me: current value: \`$ac_new_val'" >&2;}
+ fi;;
+ esac
+ # Pass precious variables to config.status.
+ if test "$ac_new_set" = set; then
+ case $ac_new_val in
+ *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+ *) ac_arg=$ac_var=$ac_new_val ;;
+ esac
+ case " $ac_configure_args " in
+ *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy.
+ *) ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+ esac
+ fi
+done
+if $ac_cache_corrupted; then
+ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+ { $as_echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5
+$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+ { { $as_echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
+$as_echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+#AM_INIT_AUTOMAKE([1.9 foreign])
+am__api_version='1.11'
+
+ac_aux_dir=
+for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do
+ if test -f "$ac_dir/install-sh"; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install-sh -c"
+ break
+ elif test -f "$ac_dir/install.sh"; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install.sh -c"
+ break
+ elif test -f "$ac_dir/shtool"; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/shtool install -c"
+ break
+ fi
+done
+if test -z "$ac_aux_dir"; then
+ { { $as_echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&5
+$as_echo "$as_me: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+# These three variables are undocumented and unsupported,
+# and are intended to be withdrawn in a future Autoconf release.
+# They can cause serious problems if a builder's source tree is in a directory
+# whose full name contains unusual characters.
+ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var.
+ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var.
+ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var.
+
+
+# Find a good install program. We prefer a C program (faster),
+# so one script is as good as another. But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+# Reject install programs that cannot install multiple files.
+{ $as_echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
+$as_echo_n "checking for a BSD-compatible install... " >&6; }
+if test -z "$INSTALL"; then
+if test "${ac_cv_path_install+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in
+ ./ | .// | /cC/* | \
+ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+ ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \
+ /usr/ucb/* ) ;;
+ *)
+ # OSF1 and SCO ODT 3.0 have their own names for install.
+ # Don't use installbsd from OSF since it installs stuff as root
+ # by default.
+ for ac_prog in ginstall scoinst install; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then
+ if test $ac_prog = install &&
+ grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ # AIX install. It has an incompatible calling convention.
+ :
+ elif test $ac_prog = install &&
+ grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ # program-specific install script used by HP pwplus--don't use.
+ :
+ else
+ rm -rf conftest.one conftest.two conftest.dir
+ echo one > conftest.one
+ echo two > conftest.two
+ mkdir conftest.dir
+ if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" &&
+ test -s conftest.one && test -s conftest.two &&
+ test -s conftest.dir/conftest.one &&
+ test -s conftest.dir/conftest.two
+ then
+ ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+ break 3
+ fi
+ fi
+ fi
+ done
+ done
+ ;;
+esac
+
+done
+IFS=$as_save_IFS
+
+rm -rf conftest.one conftest.two conftest.dir
+
+fi
+ if test "${ac_cv_path_install+set}" = set; then
+ INSTALL=$ac_cv_path_install
+ else
+ # As a last resort, use the slow shell script. Don't cache a
+ # value for INSTALL within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the value is a relative name.
+ INSTALL=$ac_install_sh
+ fi
+fi
+{ $as_echo "$as_me:$LINENO: result: $INSTALL" >&5
+$as_echo "$INSTALL" >&6; }
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+{ $as_echo "$as_me:$LINENO: checking whether build environment is sane" >&5
+$as_echo_n "checking whether build environment is sane... " >&6; }
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Reject unsafe characters in $srcdir or the absolute working directory
+# name. Accept space and tab only in the latter.
+am_lf='
+'
+case `pwd` in
+ *[\\\"\#\$\&\'\`$am_lf]*)
+ { { $as_echo "$as_me:$LINENO: error: unsafe absolute working directory name" >&5
+$as_echo "$as_me: error: unsafe absolute working directory name" >&2;}
+ { (exit 1); exit 1; }; };;
+esac
+case $srcdir in
+ *[\\\"\#\$\&\'\`$am_lf\ \ ]*)
+ { { $as_echo "$as_me:$LINENO: error: unsafe srcdir value: \`$srcdir'" >&5
+$as_echo "$as_me: error: unsafe srcdir value: \`$srcdir'" >&2;}
+ { (exit 1); exit 1; }; };;
+esac
+
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments. Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+ set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+ if test "$*" = "X"; then
+ # -L didn't work.
+ set X `ls -t "$srcdir/configure" conftest.file`
+ fi
+ rm -f conftest.file
+ if test "$*" != "X $srcdir/configure conftest.file" \
+ && test "$*" != "X conftest.file $srcdir/configure"; then
+
+ # If neither matched, then we have a broken ls. This can happen
+ # if, for instance, CONFIG_SHELL is bash and it inherits a
+ # broken ls alias from the environment. This has actually
+ # happened. Such a system could not be considered "sane".
+ { { $as_echo "$as_me:$LINENO: error: ls -t appears to fail. Make sure there is not a broken
+alias in your environment" >&5
+$as_echo "$as_me: error: ls -t appears to fail. Make sure there is not a broken
+alias in your environment" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+
+ test "$2" = conftest.file
+ )
+then
+ # Ok.
+ :
+else
+ { { $as_echo "$as_me:$LINENO: error: newly created file is older than distributed files!
+Check your system clock" >&5
+$as_echo "$as_me: error: newly created file is older than distributed files!
+Check your system clock" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+{ $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+test "$program_prefix" != NONE &&
+ program_transform_name="s&^&$program_prefix&;$program_transform_name"
+# Use a double $ so make ignores it.
+test "$program_suffix" != NONE &&
+ program_transform_name="s&\$&$program_suffix&;$program_transform_name"
+# Double any \ or $.
+# By default was `s,x,x', remove it if useless.
+ac_script='s/[\\$]/&&/g;s/;s,x,x,$//'
+program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"`
+
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+
+if test x"${MISSING+set}" != xset; then
+ case $am_aux_dir in
+ *\ * | *\ *)
+ MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
+ *)
+ MISSING="\${SHELL} $am_aux_dir/missing" ;;
+ esac
+fi
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+ am_missing_run="$MISSING --run "
+else
+ am_missing_run=
+ { $as_echo "$as_me:$LINENO: WARNING: \`missing' script is too old or missing" >&5
+$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;}
+fi
+
+if test x"${install_sh}" != xset; then
+ case $am_aux_dir in
+ *\ * | *\ *)
+ install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
+ *)
+ install_sh="\${SHELL} $am_aux_dir/install-sh"
+ esac
+fi
+
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'. However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+if test "$cross_compiling" != no; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_STRIP+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$STRIP"; then
+ ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+ $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+ { $as_echo "$as_me:$LINENO: result: $STRIP" >&5
+$as_echo "$STRIP" >&6; }
+else
+ { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+ ac_ct_STRIP=$STRIP
+ # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_STRIP"; then
+ ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_prog_ac_ct_STRIP="strip"
+ $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+ { $as_echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5
+$as_echo "$ac_ct_STRIP" >&6; }
+else
+ { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_STRIP" = x; then
+ STRIP=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ STRIP=$ac_ct_STRIP
+ fi
+else
+ STRIP="$ac_cv_prog_STRIP"
+fi
+
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+
+{ $as_echo "$as_me:$LINENO: checking for a thread-safe mkdir -p" >&5
+$as_echo_n "checking for a thread-safe mkdir -p... " >&6; }
+if test -z "$MKDIR_P"; then
+ if test "${ac_cv_path_mkdir+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_prog in mkdir gmkdir; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue
+ case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #(
+ 'mkdir (GNU coreutils) '* | \
+ 'mkdir (coreutils) '* | \
+ 'mkdir (fileutils) '4.1*)
+ ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext
+ break 3;;
+ esac
+ done
+ done
+done
+IFS=$as_save_IFS
+
+fi
+
+ if test "${ac_cv_path_mkdir+set}" = set; then
+ MKDIR_P="$ac_cv_path_mkdir -p"
+ else
+ # As a last resort, use the slow shell script. Don't cache a
+ # value for MKDIR_P within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the value is a relative name.
+ test -d ./--version && rmdir ./--version
+ MKDIR_P="$ac_install_sh -d"
+ fi
+fi
+{ $as_echo "$as_me:$LINENO: result: $MKDIR_P" >&5
+$as_echo "$MKDIR_P" >&6; }
+
+mkdir_p="$MKDIR_P"
+case $mkdir_p in
+ [\\/$]* | ?:[\\/]*) ;;
+ */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
+esac
+
+for ac_prog in gawk mawk nawk awk
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_AWK+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$AWK"; then
+ ac_cv_prog_AWK="$AWK" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_prog_AWK="$ac_prog"
+ $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+AWK=$ac_cv_prog_AWK
+if test -n "$AWK"; then
+ { $as_echo "$as_me:$LINENO: result: $AWK" >&5
+$as_echo "$AWK" >&6; }
+else
+ { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$AWK" && break
+done
+
+{ $as_echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
+set x ${MAKE-make}
+ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
+if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then
+ $as_echo_n "(cached) " >&6
+else
+ cat >conftest.make <<\_ACEOF
+SHELL = /bin/sh
+all:
+ @echo '@@@%%%=$(MAKE)=@@@%%%'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+case `${MAKE-make} -f conftest.make 2>/dev/null` in
+ *@@@%%%=?*=@@@%%%*)
+ eval ac_cv_prog_make_${ac_make}_set=yes;;
+ *)
+ eval ac_cv_prog_make_${ac_make}_set=no;;
+esac
+rm -f conftest.make
+fi
+if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
+ { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+ SET_MAKE=
+else
+ { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+ SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+ am__leading_dot=.
+else
+ am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+ # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+ # is not polluted with repeated "-I."
+ am__isrc=' -I$(srcdir)'
+ # test to see if srcdir already configured
+ if test -f $srcdir/config.status; then
+ { { $as_echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5
+$as_echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+ if (cygpath --version) >/dev/null 2>/dev/null; then
+ CYGPATH_W='cygpath -w'
+ else
+ CYGPATH_W=echo
+ fi
+fi
+
+
+# Define the identity of the package.
+ PACKAGE='hplip'
+ VERSION='3.12.4'
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE "$PACKAGE"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define VERSION "$VERSION"
+_ACEOF
+
+# Some tools Automake needs.
+
+ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}
+
+
+AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}
+
+
+AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}
+
+
+AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
+
+
+MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
+
+# We need awk for the "check" target. The system "awk" is bad on
+# some platforms.
+# Always define AMTAR for backward compatibility.
+
+AMTAR=${AMTAR-"${am_missing_run}tar"}
+
+am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'
+
+
+
+
+
+# Check whether --enable-static was given.
+if test "${enable_static+set}" = set; then
+ enableval=$enable_static; p=${PACKAGE-default}
+ case $enableval in
+ yes) enable_static=yes ;;
+ no) enable_static=no ;;
+ *)
+ enable_static=no
+ # Look at the argument we got. We use all the common list separators.
+ lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+ for pkg in $enableval; do
+ IFS="$lt_save_ifs"
+ if test "X$pkg" = "X$p"; then
+ enable_static=yes
+ fi
+ done
+ IFS="$lt_save_ifs"
+ ;;
+ esac
+else
+ enable_static=no
+fi
+
+
+
+
+# Checks for programs.
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+if test -z "$CXX"; then
+ if test -n "$CCC"; then
+ CXX=$CCC
+ else
+ if test -n "$ac_tool_prefix"; then
+ for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_CXX+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$CXX"; then
+ ac_cv_prog_CXX="$CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
+ $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+CXX=$ac_cv_prog_CXX
+if test -n "$CXX"; then
+ { $as_echo "$as_me:$LINENO: result: $CXX" >&5
+$as_echo "$CXX" >&6; }
+else
+ { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$CXX" && break
+ done
+fi
+if test -z "$CXX"; then
+ ac_ct_CXX=$CXX
+ for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_CXX"; then
+ ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_prog_ac_ct_CXX="$ac_prog"
+ $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
+if test -n "$ac_ct_CXX"; then
+ { $as_echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5
+$as_echo "$ac_ct_CXX" >&6; }
+else
+ { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$ac_ct_CXX" && break
+done
+
+ if test "x$ac_ct_CXX" = x; then
+ CXX="g++"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CXX=$ac_ct_CXX
+ fi
+fi
+
+ fi
+fi
+# Provide some information about the compiler.
+$as_echo "$as_me:$LINENO: checking for C++ compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+{ (ac_try="$ac_compiler --version >&5"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_compiler --version >&5") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+{ (ac_try="$ac_compiler -v >&5"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_compiler -v >&5") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+{ (ac_try="$ac_compiler -V >&5"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_compiler -V >&5") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+{ $as_echo "$as_me:$LINENO: checking for C++ compiler default output file name" >&5
+$as_echo_n "checking for C++ compiler default output file name... " >&6; }
+ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+
+# The possible output files:
+ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
+
+ac_rmfiles=
+for ac_file in $ac_files
+do
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+ * ) ac_rmfiles="$ac_rmfiles $ac_file";;
+ esac
+done
+rm -f $ac_rmfiles
+
+if { (ac_try="$ac_link_default"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_link_default") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
+# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
+# in a Makefile. We should not override ac_cv_exeext if it was cached,
+# so that the user can short-circuit this test for compilers unknown to
+# Autoconf.
+for ac_file in $ac_files ''
+do
+ test -f "$ac_file" || continue
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
+ ;;
+ [ab].out )
+ # We found the default executable, but exeext='' is most
+ # certainly right.
+ break;;
+ *.* )
+ if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
+ then :; else
+ ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ fi
+ # We set ac_cv_exeext here because the later test for it is not
+ # safe: cross compilers may not add the suffix if given an `-o'
+ # argument, so we may need to know it at that point already.
+ # Even if this section looks crufty: it has the advantage of
+ # actually working.
+ break;;
+ * )
+ break;;
+ esac
+done
+test "$ac_cv_exeext" = no && ac_cv_exeext=
+
+else
+ ac_file=''
+fi
+
+{ $as_echo "$as_me:$LINENO: result: $ac_file" >&5
+$as_echo "$ac_file" >&6; }
+if test -z "$ac_file"; then
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+{ { $as_echo "$as_me:$LINENO: error: C++ compiler cannot create executables
+See \`config.log' for more details." >&5
+$as_echo "$as_me: error: C++ compiler cannot create executables
+See \`config.log' for more details." >&2;}
+ { (exit 77); exit 77; }; }; }
+fi
+
+ac_exeext=$ac_cv_exeext
+
+# Check that the compiler produces executables we can run. If not, either
+# the compiler is broken, or we cross compile.
+{ $as_echo "$as_me:$LINENO: checking whether the C++ compiler works" >&5
+$as_echo_n "checking whether the C++ compiler works... " >&6; }
+# FIXME: These cross compiler hacks should be removed for Autoconf 3.0
+# If not cross compiling, check that we can run a simple program.
+if test "$cross_compiling" != yes; then
+ if { ac_try='./$ac_file'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ cross_compiling=no
+ else
+ if test "$cross_compiling" = maybe; then
+ cross_compiling=yes
+ else
+ { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+{ { $as_echo "$as_me:$LINENO: error: cannot run C++ compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&5
+$as_echo "$as_me: error: cannot run C++ compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }; }
+ fi
+ fi
+fi
+{ $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+
+rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+# Check that the compiler produces executables we can run. If not, either
+# the compiler is broken, or we cross compile.
+{ $as_echo "$as_me:$LINENO: checking whether we are cross compiling" >&5
+$as_echo_n "checking whether we are cross compiling... " >&6; }
+{ $as_echo "$as_me:$LINENO: result: $cross_compiling" >&5
+$as_echo "$cross_compiling" >&6; }
+
+{ $as_echo "$as_me:$LINENO: checking for suffix of executables" >&5
+$as_echo_n "checking for suffix of executables... " >&6; }
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+ test -f "$ac_file" || continue
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+ *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ break;;
+ * ) break;;
+ esac
+done
+else
+ { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+{ { $as_echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&5
+$as_echo "$as_me: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }; }
+fi
+
+rm -f conftest$ac_cv_exeext
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5
+$as_echo "$ac_cv_exeext" >&6; }
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+{ $as_echo "$as_me:$LINENO: checking for suffix of object files" >&5
+$as_echo_n "checking for suffix of object files... " >&6; }
+if test "${ac_cv_objext+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_compile") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ for ac_file in conftest.o conftest.obj conftest.*; do
+ test -f "$ac_file" || continue;
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
+ *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+ break;;
+ esac
+done
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+{ { $as_echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&5
+$as_echo "$as_me: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }; }
+fi
+
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_objext" >&5
+$as_echo "$ac_cv_objext" >&6; }
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+{ $as_echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5
+$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; }
+if test "${ac_cv_cxx_compiler_gnu+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+#ifndef __GNUC__
+ choke me
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_cxx_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_compiler_gnu=yes
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_compiler_gnu=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_cxx_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5
+$as_echo "$ac_cv_cxx_compiler_gnu" >&6; }
+if test $ac_compiler_gnu = yes; then
+ GXX=yes
+else
+ GXX=
+fi
+ac_test_CXXFLAGS=${CXXFLAGS+set}
+ac_save_CXXFLAGS=$CXXFLAGS
+{ $as_echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5
+$as_echo_n "checking whether $CXX accepts -g... " >&6; }
+if test "${ac_cv_prog_cxx_g+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ ac_save_cxx_werror_flag=$ac_cxx_werror_flag
+ ac_cxx_werror_flag=yes
+ ac_cv_prog_cxx_g=no
+ CXXFLAGS="-g"
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_cxx_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_cv_prog_cxx_g=yes
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ CXXFLAGS=""
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_cxx_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ :
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cxx_werror_flag=$ac_save_cxx_werror_flag
+ CXXFLAGS="-g"
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_cxx_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_cv_prog_cxx_g=yes
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ ac_cxx_werror_flag=$ac_save_cxx_werror_flag
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5
+$as_echo "$ac_cv_prog_cxx_g" >&6; }
+if test "$ac_test_CXXFLAGS" = set; then
+ CXXFLAGS=$ac_save_CXXFLAGS
+elif test $ac_cv_prog_cxx_g = yes; then
+ if test "$GXX" = yes; then
+ CXXFLAGS="-g -O2"
+ else
+ CXXFLAGS="-g"
+ fi
+else
+ if test "$GXX" = yes; then
+ CXXFLAGS="-O2"
+ else
+ CXXFLAGS=
+ fi
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+DEPDIR="${am__leading_dot}deps"
+
+ac_config_commands="$ac_config_commands depfiles"
+
+
+am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+ @echo this is the am__doit target
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+{ $as_echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5
+$as_echo_n "checking for style of include used by $am_make... " >&6; }
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# Ignore all kinds of additional output from `make'.
+case `$am_make -s -f confmf 2> /dev/null` in #(
+*the\ am__doit\ target*)
+ am__include=include
+ am__quote=
+ _am_result=GNU
+ ;;
+esac
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+ echo '.include "confinc"' > confmf
+ case `$am_make -s -f confmf 2> /dev/null` in #(
+ *the\ am__doit\ target*)
+ am__include=.include
+ am__quote="\""
+ _am_result=BSD
+ ;;
+ esac
+fi
+
+
+{ $as_echo "$as_me:$LINENO: result: $_am_result" >&5
+$as_echo "$_am_result" >&6; }
+rm -f confinc confmf
+
+# Check whether --enable-dependency-tracking was given.
+if test "${enable_dependency_tracking+set}" = set; then
+ enableval=$enable_dependency_tracking;
+fi
+
+if test "x$enable_dependency_tracking" != xno; then
+ am_depcomp="$ac_aux_dir/depcomp"
+ AMDEPBACKSLASH='\'
+fi
+ if test "x$enable_dependency_tracking" != xno; then
+ AMDEP_TRUE=
+ AMDEP_FALSE='#'
+else
+ AMDEP_TRUE='#'
+ AMDEP_FALSE=
+fi
+
+
+
+depcc="$CXX" am_compiler_list=
+
+{ $as_echo "$as_me:$LINENO: checking dependency style of $depcc" >&5
+$as_echo_n "checking dependency style of $depcc... " >&6; }
+if test "${am_cv_CXX_dependencies_compiler_type+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+ # We make a subdir and do the tests there. Otherwise we can end up
+ # making bogus files that we don't know about and never remove. For
+ # instance it was reported that on HP-UX the gcc test will end up
+ # making a dummy file named `D' -- because `-MD' means `put the output
+ # in D'.
+ mkdir conftest.dir
+ # Copy depcomp to subdir because otherwise we won't find it if we're
+ # using a relative directory.
+ cp "$am_depcomp" conftest.dir
+ cd conftest.dir
+ # We will build objects and dependencies in a subdirectory because
+ # it helps to detect inapplicable dependency modes. For instance
+ # both Tru64's cc and ICC support -MD to output dependencies as a
+ # side effect of compilation, but ICC will put the dependencies in
+ # the current directory while Tru64 will put them in the object
+ # directory.
+ mkdir sub
+
+ am_cv_CXX_dependencies_compiler_type=none
+ if test "$am_compiler_list" = ""; then
+ am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+ fi
+ am__universal=false
+ case " $depcc " in #(
+ *\ -arch\ *\ -arch\ *) am__universal=true ;;
+ esac
+
+ for depmode in $am_compiler_list; do
+ # Setup a source with many dependencies, because some compilers
+ # like to wrap large dependency lists on column 80 (with \), and
+ # we should not choose a depcomp mode which is confused by this.
+ #
+ # We need to recreate these files for each test, as the compiler may
+ # overwrite some of them when testing with obscure command lines.
+ # This happens at least with the AIX C compiler.
+ : > sub/conftest.c
+ for i in 1 2 3 4 5 6; do
+ echo '#include "conftst'$i'.h"' >> sub/conftest.c
+ # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+ # Solaris 8's {/usr,}/bin/sh.
+ touch sub/conftst$i.h
+ done
+ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+ # We check with `-c' and `-o' for the sake of the "dashmstdout"
+ # mode. It turns out that the SunPro C++ compiler does not properly
+ # handle `-M -o', and we need to detect this. Also, some Intel
+ # versions had trouble with output in subdirs
+ am__obj=sub/conftest.${OBJEXT-o}
+ am__minus_obj="-o $am__obj"
+ case $depmode in
+ gcc)
+ # This depmode causes a compiler race in universal mode.
+ test "$am__universal" = false || continue
+ ;;
+ nosideeffect)
+ # after this tag, mechanisms are not by side-effect, so they'll
+ # only be used when explicitly requested
+ if test "x$enable_dependency_tracking" = xyes; then
+ continue
+ else
+ break
+ fi
+ ;;
+ msvisualcpp | msvcmsys)
+ # This compiler won't grok `-c -o', but also, the minuso test has
+ # not run yet. These depmodes are late enough in the game, and
+ # so weak that their functioning should not be impacted.
+ am__obj=conftest.${OBJEXT-o}
+ am__minus_obj=
+ ;;
+ none) break ;;
+ esac
+ if depmode=$depmode \
+ source=sub/conftest.c object=$am__obj \
+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+ >/dev/null 2>conftest.err &&
+ grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+ ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+ # icc doesn't choke on unknown options, it will just issue warnings
+ # or remarks (even with -Werror). So we grep stderr for any message
+ # that says an option was ignored or not supported.
+ # When given -MP, icc 7.0 and 7.1 complain thusly:
+ # icc: Command line warning: ignoring option '-M'; no argument required
+ # The diagnosis changed in icc 8.0:
+ # icc: Command line remark: option '-MP' not supported
+ if (grep 'ignoring option' conftest.err ||
+ grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+ am_cv_CXX_dependencies_compiler_type=$depmode
+ break
+ fi
+ fi
+ done
+
+ cd ..
+ rm -rf conftest.dir
+else
+ am_cv_CXX_dependencies_compiler_type=none
+fi
+
+fi
+{ $as_echo "$as_me:$LINENO: result: $am_cv_CXX_dependencies_compiler_type" >&5
+$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; }
+CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type
+
+ if
+ test "x$enable_dependency_tracking" != xno \
+ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then
+ am__fastdepCXX_TRUE=
+ am__fastdepCXX_FALSE='#'
+else
+ am__fastdepCXX_TRUE='#'
+ am__fastdepCXX_FALSE=
+fi
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_prog_CC="${ac_tool_prefix}gcc"
+ $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { $as_echo "$as_me:$LINENO: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+ { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+ ac_ct_CC=$CC
+ # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_prog_ac_ct_CC="gcc"
+ $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+ { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_CC" = x; then
+ CC=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CC=$ac_ct_CC
+ fi
+else
+ CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_prog_CC="${ac_tool_prefix}cc"
+ $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { $as_echo "$as_me:$LINENO: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+ { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ fi
+fi
+if test -z "$CC"; then
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+ ac_prog_rejected=yes
+ continue
+ fi
+ ac_cv_prog_CC="cc"
+ $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+IFS=$as_save_IFS
+
+if test $ac_prog_rejected = yes; then
+ # We found a bogon in the path, so make sure we never use it.
+ set dummy $ac_cv_prog_CC
+ shift
+ if test $# != 0; then
+ # We chose a different compiler from the bogus one.
+ # However, it has the same basename, so the bogon will be chosen
+ # first if we set CC to just the basename; use the full file name.
+ shift
+ ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+ fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { $as_echo "$as_me:$LINENO: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+ { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ for ac_prog in cl.exe
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+ $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { $as_echo "$as_me:$LINENO: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+ { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$CC" && break
+ done
+fi
+if test -z "$CC"; then
+ ac_ct_CC=$CC
+ for ac_prog in cl.exe
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_prog_ac_ct_CC="$ac_prog"
+ $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+ { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$ac_ct_CC" && break
+done
+
+ if test "x$ac_ct_CC" = x; then
+ CC=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CC=$ac_ct_CC
+ fi
+fi
+
+fi
+
+
+test -z "$CC" && { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+{ { $as_echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&5
+$as_echo "$as_me: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }; }
+
+# Provide some information about the compiler.
+$as_echo "$as_me:$LINENO: checking for C compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+{ (ac_try="$ac_compiler --version >&5"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_compiler --version >&5") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+{ (ac_try="$ac_compiler -v >&5"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_compiler -v >&5") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+{ (ac_try="$ac_compiler -V >&5"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_compiler -V >&5") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+
+{ $as_echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
+$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
+if test "${ac_cv_c_compiler_gnu+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+#ifndef __GNUC__
+ choke me
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_compiler_gnu=yes
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_compiler_gnu=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
+$as_echo "$ac_cv_c_compiler_gnu" >&6; }
+if test $ac_compiler_gnu = yes; then
+ GCC=yes
+else
+ GCC=
+fi
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+{ $as_echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
+$as_echo_n "checking whether $CC accepts -g... " >&6; }
+if test "${ac_cv_prog_cc_g+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ ac_save_c_werror_flag=$ac_c_werror_flag
+ ac_c_werror_flag=yes
+ ac_cv_prog_cc_g=no
+ CFLAGS="-g"
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_cv_prog_cc_g=yes
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ CFLAGS=""
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ :
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_c_werror_flag=$ac_save_c_werror_flag
+ CFLAGS="-g"
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_cv_prog_cc_g=yes
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
+$as_echo "$ac_cv_prog_cc_g" >&6; }
+if test "$ac_test_CFLAGS" = set; then
+ CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+ if test "$GCC" = yes; then
+ CFLAGS="-g -O2"
+ else
+ CFLAGS="-g"
+ fi
+else
+ if test "$GCC" = yes; then
+ CFLAGS="-O2"
+ else
+ CFLAGS=
+ fi
+fi
+{ $as_echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5
+$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
+if test "${ac_cv_prog_cc_c89+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+ char **p;
+ int i;
+{
+ return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+ char *s;
+ va_list v;
+ va_start (v,p);
+ s = g (p, va_arg (v,int));
+ va_end (v);
+ return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has
+ function prototypes and stuff, but not '\xHH' hex character constants.
+ These don't provoke an error unfortunately, instead are silently treated
+ as 'x'. The following induces an error, until -std is added to get
+ proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an
+ array size at least. It's necessary to write '\x00'==0 to get something
+ that's true only with -std. */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+ inside strings and character constants. */
+#define FOO(x) 'x'
+int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1];
+ ;
+ return 0;
+}
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
+ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+ CC="$ac_save_CC $ac_arg"
+ rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_cv_prog_cc_c89=$ac_arg
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext
+ test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c89" in
+ x)
+ { $as_echo "$as_me:$LINENO: result: none needed" >&5
+$as_echo "none needed" >&6; } ;;
+ xno)
+ { $as_echo "$as_me:$LINENO: result: unsupported" >&5
+$as_echo "unsupported" >&6; } ;;
+ *)
+ CC="$CC $ac_cv_prog_cc_c89"
+ { $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5
+$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
+esac
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+depcc="$CC" am_compiler_list=
+
+{ $as_echo "$as_me:$LINENO: checking dependency style of $depcc" >&5
+$as_echo_n "checking dependency style of $depcc... " >&6; }
+if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+ # We make a subdir and do the tests there. Otherwise we can end up
+ # making bogus files that we don't know about and never remove. For
+ # instance it was reported that on HP-UX the gcc test will end up
+ # making a dummy file named `D' -- because `-MD' means `put the output
+ # in D'.
+ mkdir conftest.dir
+ # Copy depcomp to subdir because otherwise we won't find it if we're
+ # using a relative directory.
+ cp "$am_depcomp" conftest.dir
+ cd conftest.dir
+ # We will build objects and dependencies in a subdirectory because
+ # it helps to detect inapplicable dependency modes. For instance
+ # both Tru64's cc and ICC support -MD to output dependencies as a
+ # side effect of compilation, but ICC will put the dependencies in
+ # the current directory while Tru64 will put them in the object
+ # directory.
+ mkdir sub
+
+ am_cv_CC_dependencies_compiler_type=none
+ if test "$am_compiler_list" = ""; then
+ am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+ fi
+ am__universal=false
+ case " $depcc " in #(
+ *\ -arch\ *\ -arch\ *) am__universal=true ;;
+ esac
+
+ for depmode in $am_compiler_list; do
+ # Setup a source with many dependencies, because some compilers
+ # like to wrap large dependency lists on column 80 (with \), and
+ # we should not choose a depcomp mode which is confused by this.
+ #
+ # We need to recreate these files for each test, as the compiler may
+ # overwrite some of them when testing with obscure command lines.
+ # This happens at least with the AIX C compiler.
+ : > sub/conftest.c
+ for i in 1 2 3 4 5 6; do
+ echo '#include "conftst'$i'.h"' >> sub/conftest.c
+ # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+ # Solaris 8's {/usr,}/bin/sh.
+ touch sub/conftst$i.h
+ done
+ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+ # We check with `-c' and `-o' for the sake of the "dashmstdout"
+ # mode. It turns out that the SunPro C++ compiler does not properly
+ # handle `-M -o', and we need to detect this. Also, some Intel
+ # versions had trouble with output in subdirs
+ am__obj=sub/conftest.${OBJEXT-o}
+ am__minus_obj="-o $am__obj"
+ case $depmode in
+ gcc)
+ # This depmode causes a compiler race in universal mode.
+ test "$am__universal" = false || continue
+ ;;
+ nosideeffect)
+ # after this tag, mechanisms are not by side-effect, so they'll
+ # only be used when explicitly requested
+ if test "x$enable_dependency_tracking" = xyes; then
+ continue
+ else
+ break
+ fi
+ ;;
+ msvisualcpp | msvcmsys)
+ # This compiler won't grok `-c -o', but also, the minuso test has
+ # not run yet. These depmodes are late enough in the game, and
+ # so weak that their functioning should not be impacted.
+ am__obj=conftest.${OBJEXT-o}
+ am__minus_obj=
+ ;;
+ none) break ;;
+ esac
+ if depmode=$depmode \
+ source=sub/conftest.c object=$am__obj \
+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+ >/dev/null 2>conftest.err &&
+ grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+ ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+ # icc doesn't choke on unknown options, it will just issue warnings
+ # or remarks (even with -Werror). So we grep stderr for any message
+ # that says an option was ignored or not supported.
+ # When given -MP, icc 7.0 and 7.1 complain thusly:
+ # icc: Command line warning: ignoring option '-M'; no argument required
+ # The diagnosis changed in icc 8.0:
+ # icc: Command line remark: option '-MP' not supported
+ if (grep 'ignoring option' conftest.err ||
+ grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+ am_cv_CC_dependencies_compiler_type=$depmode
+ break
+ fi
+ fi
+ done
+
+ cd ..
+ rm -rf conftest.dir
+else
+ am_cv_CC_dependencies_compiler_type=none
+fi
+
+fi
+{ $as_echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5
+$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; }
+CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
+
+ if
+ test "x$enable_dependency_tracking" != xno \
+ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
+ am__fastdepCC_TRUE=
+ am__fastdepCC_FALSE='#'
+else
+ am__fastdepCC_TRUE='#'
+ am__fastdepCC_FALSE=
+fi
+
+
+# Find a good install program. We prefer a C program (faster),
+# so one script is as good as another. But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+# Reject install programs that cannot install multiple files.
+{ $as_echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
+$as_echo_n "checking for a BSD-compatible install... " >&6; }
+if test -z "$INSTALL"; then
+if test "${ac_cv_path_install+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in
+ ./ | .// | /cC/* | \
+ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+ ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \
+ /usr/ucb/* ) ;;
+ *)
+ # OSF1 and SCO ODT 3.0 have their own names for install.
+ # Don't use installbsd from OSF since it installs stuff as root
+ # by default.
+ for ac_prog in ginstall scoinst install; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then
+ if test $ac_prog = install &&
+ grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ # AIX install. It has an incompatible calling convention.
+ :
+ elif test $ac_prog = install &&
+ grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ # program-specific install script used by HP pwplus--don't use.
+ :
+ else
+ rm -rf conftest.one conftest.two conftest.dir
+ echo one > conftest.one
+ echo two > conftest.two
+ mkdir conftest.dir
+ if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" &&
+ test -s conftest.one && test -s conftest.two &&
+ test -s conftest.dir/conftest.one &&
+ test -s conftest.dir/conftest.two
+ then
+ ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+ break 3
+ fi
+ fi
+ fi
+ done
+ done
+ ;;
+esac
+
+done
+IFS=$as_save_IFS
+
+rm -rf conftest.one conftest.two conftest.dir
+
+fi
+ if test "${ac_cv_path_install+set}" = set; then
+ INSTALL=$ac_cv_path_install
+ else
+ # As a last resort, use the slow shell script. Don't cache a
+ # value for INSTALL within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the value is a relative name.
+ INSTALL=$ac_install_sh
+ fi
+fi
+{ $as_echo "$as_me:$LINENO: result: $INSTALL" >&5
+$as_echo "$INSTALL" >&6; }
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+# Check whether --enable-shared was given.
+if test "${enable_shared+set}" = set; then
+ enableval=$enable_shared; p=${PACKAGE-default}
+ case $enableval in
+ yes) enable_shared=yes ;;
+ no) enable_shared=no ;;
+ *)
+ enable_shared=no
+ # Look at the argument we got. We use all the common list separators.
+ lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+ for pkg in $enableval; do
+ IFS="$lt_save_ifs"
+ if test "X$pkg" = "X$p"; then
+ enable_shared=yes
+ fi
+ done
+ IFS="$lt_save_ifs"
+ ;;
+ esac
+else
+ enable_shared=yes
+fi
+
+
+# Check whether --enable-fast-install was given.
+if test "${enable_fast_install+set}" = set; then
+ enableval=$enable_fast_install; p=${PACKAGE-default}
+ case $enableval in
+ yes) enable_fast_install=yes ;;
+ no) enable_fast_install=no ;;
+ *)
+ enable_fast_install=no
+ # Look at the argument we got. We use all the common list separators.
+ lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+ for pkg in $enableval; do
+ IFS="$lt_save_ifs"
+ if test "X$pkg" = "X$p"; then
+ enable_fast_install=yes
+ fi
+ done
+ IFS="$lt_save_ifs"
+ ;;
+ esac
+else
+ enable_fast_install=yes
+fi
+
+
+# Make sure we can run config.sub.
+$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
+ { { $as_echo "$as_me:$LINENO: error: cannot run $SHELL $ac_aux_dir/config.sub" >&5
+$as_echo "$as_me: error: cannot run $SHELL $ac_aux_dir/config.sub" >&2;}
+ { (exit 1); exit 1; }; }
+
+{ $as_echo "$as_me:$LINENO: checking build system type" >&5
+$as_echo_n "checking build system type... " >&6; }
+if test "${ac_cv_build+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ ac_build_alias=$build_alias
+test "x$ac_build_alias" = x &&
+ ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
+test "x$ac_build_alias" = x &&
+ { { $as_echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5
+$as_echo "$as_me: error: cannot guess build type; you must specify one" >&2;}
+ { (exit 1); exit 1; }; }
+ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
+ { { $as_echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&5
+$as_echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&2;}
+ { (exit 1); exit 1; }; }
+
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_build" >&5
+$as_echo "$ac_cv_build" >&6; }
+case $ac_cv_build in
+*-*-*) ;;
+*) { { $as_echo "$as_me:$LINENO: error: invalid value of canonical build" >&5
+$as_echo "$as_me: error: invalid value of canonical build" >&2;}
+ { (exit 1); exit 1; }; };;
+esac
+build=$ac_cv_build
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_build
+shift
+build_cpu=$1
+build_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+build_os=$*
+IFS=$ac_save_IFS
+case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
+
+
+{ $as_echo "$as_me:$LINENO: checking host system type" >&5
+$as_echo_n "checking host system type... " >&6; }
+if test "${ac_cv_host+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ if test "x$host_alias" = x; then
+ ac_cv_host=$ac_cv_build
+else
+ ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
+ { { $as_echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&5
+$as_echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_host" >&5
+$as_echo "$ac_cv_host" >&6; }
+case $ac_cv_host in
+*-*-*) ;;
+*) { { $as_echo "$as_me:$LINENO: error: invalid value of canonical host" >&5
+$as_echo "$as_me: error: invalid value of canonical host" >&2;}
+ { (exit 1); exit 1; }; };;
+esac
+host=$ac_cv_host
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_host
+shift
+host_cpu=$1
+host_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+host_os=$*
+IFS=$ac_save_IFS
+case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
+
+
+{ $as_echo "$as_me:$LINENO: checking for a sed that does not truncate output" >&5
+$as_echo_n "checking for a sed that does not truncate output... " >&6; }
+if test "${lt_cv_path_SED+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ # Loop through the user's path and test for sed and gsed.
+# Then use that list of sed's as ones to test for truncation.
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for lt_ac_prog in sed gsed; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$lt_ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$lt_ac_prog$ac_exec_ext"; }; then
+ lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext"
+ fi
+ done
+ done
+done
+IFS=$as_save_IFS
+lt_ac_max=0
+lt_ac_count=0
+# Add /usr/xpg4/bin/sed as it is typically found on Solaris
+# along with /bin/sed that truncates output.
+for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do
+ test ! -f $lt_ac_sed && continue
+ cat /dev/null > conftest.in
+ lt_ac_count=0
+ echo $ECHO_N "0123456789$ECHO_C" >conftest.in
+ # Check for GNU sed and select it if it is found.
+ if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then
+ lt_cv_path_SED=$lt_ac_sed
+ break
+ fi
+ while true; do
+ cat conftest.in conftest.in >conftest.tmp
+ mv conftest.tmp conftest.in
+ cp conftest.in conftest.nl
+ echo >>conftest.nl
+ $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break
+ cmp -s conftest.out conftest.nl || break
+ # 10000 chars as input seems more than enough
+ test $lt_ac_count -gt 10 && break
+ lt_ac_count=`expr $lt_ac_count + 1`
+ if test $lt_ac_count -gt $lt_ac_max; then
+ lt_ac_max=$lt_ac_count
+ lt_cv_path_SED=$lt_ac_sed
+ fi
+ done
+done
+
+fi
+
+SED=$lt_cv_path_SED
+
+{ $as_echo "$as_me:$LINENO: result: $SED" >&5
+$as_echo "$SED" >&6; }
+
+{ $as_echo "$as_me:$LINENO: checking for grep that handles long lines and -e" >&5
+$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
+if test "${ac_cv_path_GREP+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ if test -z "$GREP"; then
+ ac_path_GREP_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_prog in grep ggrep; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
+ { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue
+# Check for GNU ac_path_GREP and select it if it is found.
+ # Check for GNU $ac_path_GREP
+case `"$ac_path_GREP" --version 2>&1` in
+*GNU*)
+ ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
+*)
+ ac_count=0
+ $as_echo_n 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ $as_echo 'GREP' >> "conftest.nl"
+ "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ ac_count=`expr $ac_count + 1`
+ if test $ac_count -gt ${ac_path_GREP_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_GREP="$ac_path_GREP"
+ ac_path_GREP_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+ $ac_path_GREP_found && break 3
+ done
+ done
+done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_GREP"; then
+ { { $as_echo "$as_me:$LINENO: error: no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5
+$as_echo "$as_me: error: no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+else
+ ac_cv_path_GREP=$GREP
+fi
+
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_path_GREP" >&5
+$as_echo "$ac_cv_path_GREP" >&6; }
+ GREP="$ac_cv_path_GREP"
+
+
+{ $as_echo "$as_me:$LINENO: checking for egrep" >&5
+$as_echo_n "checking for egrep... " >&6; }
+if test "${ac_cv_path_EGREP+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
+ then ac_cv_path_EGREP="$GREP -E"
+ else
+ if test -z "$EGREP"; then
+ ac_path_EGREP_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_prog in egrep; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
+ { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue
+# Check for GNU ac_path_EGREP and select it if it is found.
+ # Check for GNU $ac_path_EGREP
+case `"$ac_path_EGREP" --version 2>&1` in
+*GNU*)
+ ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
+*)
+ ac_count=0
+ $as_echo_n 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ $as_echo 'EGREP' >> "conftest.nl"
+ "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ ac_count=`expr $ac_count + 1`
+ if test $ac_count -gt ${ac_path_EGREP_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_EGREP="$ac_path_EGREP"
+ ac_path_EGREP_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+ $ac_path_EGREP_found && break 3
+ done
+ done
+done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_EGREP"; then
+ { { $as_echo "$as_me:$LINENO: error: no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5
+$as_echo "$as_me: error: no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+else
+ ac_cv_path_EGREP=$EGREP
+fi
+
+ fi
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5
+$as_echo "$ac_cv_path_EGREP" >&6; }
+ EGREP="$ac_cv_path_EGREP"
+
+
+
+# Check whether --with-gnu-ld was given.
+if test "${with_gnu_ld+set}" = set; then
+ withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
+else
+ with_gnu_ld=no
+fi
+
+ac_prog=ld
+if test "$GCC" = yes; then
+ # Check if gcc -print-prog-name=ld gives a path.
+ { $as_echo "$as_me:$LINENO: checking for ld used by $CC" >&5
+$as_echo_n "checking for ld used by $CC... " >&6; }
+ case $host in
+ *-*-mingw*)
+ # gcc leaves a trailing carriage return which upsets mingw
+ ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+ *)
+ ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+ esac
+ case $ac_prog in
+ # Accept absolute paths.
+ [\\/]* | ?:[\\/]*)
+ re_direlt='/[^/][^/]*/\.\./'
+ # Canonicalize the pathname of ld
+ ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'`
+ while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
+ ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"`
+ done
+ test -z "$LD" && LD="$ac_prog"
+ ;;
+ "")
+ # If it fails, then pretend we aren't using GCC.
+ ac_prog=ld
+ ;;
+ *)
+ # If it is relative, then search for the first ld in PATH.
+ with_gnu_ld=unknown
+ ;;
+ esac
+elif test "$with_gnu_ld" = yes; then
+ { $as_echo "$as_me:$LINENO: checking for GNU ld" >&5
+$as_echo_n "checking for GNU ld... " >&6; }
+else
+ { $as_echo "$as_me:$LINENO: checking for non-GNU ld" >&5
+$as_echo_n "checking for non-GNU ld... " >&6; }
+fi
+if test "${lt_cv_path_LD+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ if test -z "$LD"; then
+ lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+ for ac_dir in $PATH; do
+ IFS="$lt_save_ifs"
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+ lt_cv_path_LD="$ac_dir/$ac_prog"
+ # Check to see if the program is GNU ld. I'd rather use --version,
+ # but apparently some variants of GNU ld only accept -v.
+ # Break only if it was the GNU/non-GNU ld that we prefer.
+ case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+ *GNU* | *'with BFD'*)
+ test "$with_gnu_ld" != no && break
+ ;;
+ *)
+ test "$with_gnu_ld" != yes && break
+ ;;
+ esac
+ fi
+ done
+ IFS="$lt_save_ifs"
+else
+ lt_cv_path_LD="$LD" # Let the user override the test with a path.
+fi
+fi
+
+LD="$lt_cv_path_LD"
+if test -n "$LD"; then
+ { $as_echo "$as_me:$LINENO: result: $LD" >&5
+$as_echo "$LD" >&6; }
+else
+ { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+test -z "$LD" && { { $as_echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5
+$as_echo "$as_me: error: no acceptable ld found in \$PATH" >&2;}
+ { (exit 1); exit 1; }; }
+{ $as_echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5
+$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; }
+if test "${lt_cv_prog_gnu_ld+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ # I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+ lt_cv_prog_gnu_ld=yes
+ ;;
+*)
+ lt_cv_prog_gnu_ld=no
+ ;;
+esac
+fi
+{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_gnu_ld" >&5
+$as_echo "$lt_cv_prog_gnu_ld" >&6; }
+with_gnu_ld=$lt_cv_prog_gnu_ld
+
+
+{ $as_echo "$as_me:$LINENO: checking for $LD option to reload object files" >&5
+$as_echo_n "checking for $LD option to reload object files... " >&6; }
+if test "${lt_cv_ld_reload_flag+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_ld_reload_flag='-r'
+fi
+{ $as_echo "$as_me:$LINENO: result: $lt_cv_ld_reload_flag" >&5
+$as_echo "$lt_cv_ld_reload_flag" >&6; }
+reload_flag=$lt_cv_ld_reload_flag
+case $reload_flag in
+"" | " "*) ;;
+*) reload_flag=" $reload_flag" ;;
+esac
+reload_cmds='$LD$reload_flag -o $output$reload_objs'
+case $host_os in
+ darwin*)
+ if test "$GCC" = yes; then
+ reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
+ else
+ reload_cmds='$LD$reload_flag -o $output$reload_objs'
+ fi
+ ;;
+esac
+
+{ $as_echo "$as_me:$LINENO: checking for BSD-compatible nm" >&5
+$as_echo_n "checking for BSD-compatible nm... " >&6; }
+if test "${lt_cv_path_NM+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$NM"; then
+ # Let the user override the test.
+ lt_cv_path_NM="$NM"
+else
+ lt_nm_to_check="${ac_tool_prefix}nm"
+ if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
+ lt_nm_to_check="$lt_nm_to_check nm"
+ fi
+ for lt_tmp_nm in $lt_nm_to_check; do
+ lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+ for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
+ IFS="$lt_save_ifs"
+ test -z "$ac_dir" && ac_dir=.
+ tmp_nm="$ac_dir/$lt_tmp_nm"
+ if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
+ # Check to see if the nm accepts a BSD-compat flag.
+ # Adding the `sed 1q' prevents false positives on HP-UX, which says:
+ # nm: unknown option "B" ignored
+ # Tru64's nm complains that /dev/null is an invalid object file
+ case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
+ */dev/null* | *'Invalid file or object type'*)
+ lt_cv_path_NM="$tmp_nm -B"
+ break
+ ;;
+ *)
+ case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
+ */dev/null*)
+ lt_cv_path_NM="$tmp_nm -p"
+ break
+ ;;
+ *)
+ lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
+ continue # so that we can try to find one that supports BSD flags
+ ;;
+ esac
+ ;;
+ esac
+ fi
+ done
+ IFS="$lt_save_ifs"
+ done
+ test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm
+fi
+fi
+{ $as_echo "$as_me:$LINENO: result: $lt_cv_path_NM" >&5
+$as_echo "$lt_cv_path_NM" >&6; }
+NM="$lt_cv_path_NM"
+
+{ $as_echo "$as_me:$LINENO: checking whether ln -s works" >&5
+$as_echo_n "checking whether ln -s works... " >&6; }
+LN_S=$as_ln_s
+if test "$LN_S" = "ln -s"; then
+ { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+ { $as_echo "$as_me:$LINENO: result: no, using $LN_S" >&5
+$as_echo "no, using $LN_S" >&6; }
+fi
+
+{ $as_echo "$as_me:$LINENO: checking how to recognize dependent libraries" >&5
+$as_echo_n "checking how to recognize dependent libraries... " >&6; }
+if test "${lt_cv_deplibs_check_method+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_file_magic_cmd='$MAGIC_CMD'
+lt_cv_file_magic_test_file=
+lt_cv_deplibs_check_method='unknown'
+# Need to set the preceding variable on all platforms that support
+# interlibrary dependencies.
+# 'none' -- dependencies not supported.
+# `unknown' -- same as none, but documents that we really don't know.
+# 'pass_all' -- all dependencies passed with no checks.
+# 'test_compile' -- check by making test program.
+# 'file_magic [[regex]]' -- check by looking for files in library path
+# which responds to the $file_magic_cmd with a given extended regex.
+# If you have `file' or equivalent on your system and you're not sure
+# whether `pass_all' will *always* work, you probably want this one.
+
+case $host_os in
+aix[4-9]*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+beos*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+bsdi[45]*)
+ lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)'
+ lt_cv_file_magic_cmd='/usr/bin/file -L'
+ lt_cv_file_magic_test_file=/shlib/libc.so
+ ;;
+
+cygwin*)
+ # func_win32_libid is a shell function defined in ltmain.sh
+ lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+ lt_cv_file_magic_cmd='func_win32_libid'
+ ;;
+
+mingw* | pw32*)
+ # Base MSYS/MinGW do not provide the 'file' command needed by
+ # func_win32_libid shell function, so use a weaker test based on 'objdump',
+ # unless we find 'file', for example because we are cross-compiling.
+ if ( file / ) >/dev/null 2>&1; then
+ lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+ lt_cv_file_magic_cmd='func_win32_libid'
+ else
+ lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?'
+ lt_cv_file_magic_cmd='$OBJDUMP -f'
+ fi
+ ;;
+
+darwin* | rhapsody*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+freebsd* | dragonfly*)
+ if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+ case $host_cpu in
+ i*86 )
+ # Not sure whether the presence of OpenBSD here was a mistake.
+ # Let's accept both of them until this is cleared up.
+ lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library'
+ lt_cv_file_magic_cmd=/usr/bin/file
+ lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
+ ;;
+ esac
+ else
+ lt_cv_deplibs_check_method=pass_all
+ fi
+ ;;
+
+gnu*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+hpux10.20* | hpux11*)
+ lt_cv_file_magic_cmd=/usr/bin/file
+ case $host_cpu in
+ ia64*)
+ lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64'
+ lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
+ ;;
+ hppa*64*)
+ lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]'
+ lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
+ ;;
+ *)
+ lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library'
+ lt_cv_file_magic_test_file=/usr/lib/libc.sl
+ ;;
+ esac
+ ;;
+
+interix[3-9]*)
+ # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
+ lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$'
+ ;;
+
+irix5* | irix6* | nonstopux*)
+ case $LD in
+ *-32|*"-32 ") libmagic=32-bit;;
+ *-n32|*"-n32 ") libmagic=N32;;
+ *-64|*"-64 ") libmagic=64-bit;;
+ *) libmagic=never-match;;
+ esac
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+# This must be Linux ELF.
+linux* | k*bsd*-gnu)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+netbsd*)
+ if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+ lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
+ else
+ lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$'
+ fi
+ ;;
+
+newos6*)
+ lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)'
+ lt_cv_file_magic_cmd=/usr/bin/file
+ lt_cv_file_magic_test_file=/usr/lib/libnls.so
+ ;;
+
+nto-qnx*)
+ lt_cv_deplibs_check_method=unknown
+ ;;
+
+openbsd*)
+ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+ lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$'
+ else
+ lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
+ fi
+ ;;
+
+osf3* | osf4* | osf5*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+rdos*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+solaris*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+sysv4 | sysv4.3*)
+ case $host_vendor in
+ motorola)
+ lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]'
+ lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
+ ;;
+ ncr)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+ sequent)
+ lt_cv_file_magic_cmd='/bin/file'
+ lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )'
+ ;;
+ sni)
+ lt_cv_file_magic_cmd='/bin/file'
+ lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib"
+ lt_cv_file_magic_test_file=/lib/libc.so
+ ;;
+ siemens)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+ pc)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+ esac
+ ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+esac
+
+fi
+{ $as_echo "$as_me:$LINENO: result: $lt_cv_deplibs_check_method" >&5
+$as_echo "$lt_cv_deplibs_check_method" >&6; }
+file_magic_cmd=$lt_cv_file_magic_cmd
+deplibs_check_method=$lt_cv_deplibs_check_method
+test -z "$deplibs_check_method" && deplibs_check_method=unknown
+
+
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+# Check whether --enable-libtool-lock was given.
+if test "${enable_libtool_lock+set}" = set; then
+ enableval=$enable_libtool_lock;
+fi
+
+test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
+
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+case $host in
+ia64-*-hpux*)
+ # Find out which ABI we are using.
+ echo 'int i;' > conftest.$ac_ext
+ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ case `/usr/bin/file conftest.$ac_objext` in
+ *ELF-32*)
+ HPUX_IA64_MODE="32"
+ ;;
+ *ELF-64*)
+ HPUX_IA64_MODE="64"
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+*-*-irix6*)
+ # Find out which ABI we are using.
+ echo '#line 5262 "configure"' > conftest.$ac_ext
+ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ if test "$lt_cv_prog_gnu_ld" = yes; then
+ case `/usr/bin/file conftest.$ac_objext` in
+ *32-bit*)
+ LD="${LD-ld} -melf32bsmip"
+ ;;
+ *N32*)
+ LD="${LD-ld} -melf32bmipn32"
+ ;;
+ *64-bit*)
+ LD="${LD-ld} -melf64bmip"
+ ;;
+ esac
+ else
+ case `/usr/bin/file conftest.$ac_objext` in
+ *32-bit*)
+ LD="${LD-ld} -32"
+ ;;
+ *N32*)
+ LD="${LD-ld} -n32"
+ ;;
+ *64-bit*)
+ LD="${LD-ld} -64"
+ ;;
+ esac
+ fi
+ fi
+ rm -rf conftest*
+ ;;
+
+x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \
+s390*-*linux*|sparc*-*linux*)
+ # Find out which ABI we are using.
+ echo 'int i;' > conftest.$ac_ext
+ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ case `/usr/bin/file conftest.o` in
+ *32-bit*)
+ case $host in
+ x86_64-*kfreebsd*-gnu)
+ LD="${LD-ld} -m elf_i386_fbsd"
+ ;;
+ x86_64-*linux*)
+ LD="${LD-ld} -m elf_i386"
+ ;;
+ ppc64-*linux*|powerpc64-*linux*)
+ LD="${LD-ld} -m elf32ppclinux"
+ ;;
+ s390x-*linux*)
+ LD="${LD-ld} -m elf_s390"
+ ;;
+ sparc64-*linux*)
+ LD="${LD-ld} -m elf32_sparc"
+ ;;
+ esac
+ ;;
+ *64-bit*)
+ libsuff=64
+ case $host in
+ x86_64-*kfreebsd*-gnu)
+ LD="${LD-ld} -m elf_x86_64_fbsd"
+ ;;
+ x86_64-*linux*)
+ LD="${LD-ld} -m elf_x86_64"
+ ;;
+ ppc*-*linux*|powerpc*-*linux*)
+ LD="${LD-ld} -m elf64ppc"
+ ;;
+ s390*-*linux*)
+ LD="${LD-ld} -m elf64_s390"
+ ;;
+ sparc*-*linux*)
+ LD="${LD-ld} -m elf64_sparc"
+ ;;
+ esac
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+
+*-*-sco3.2v5*)
+ # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+ SAVE_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS -belf"
+ { $as_echo "$as_me:$LINENO: checking whether the C compiler needs -belf" >&5
+$as_echo_n "checking whether the C compiler needs -belf... " >&6; }
+if test "${lt_cv_cc_needs_belf+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext && {
+ test "$cross_compiling" = yes ||
+ $as_test_x conftest$ac_exeext
+ }; then
+ lt_cv_cc_needs_belf=yes
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ lt_cv_cc_needs_belf=no
+fi
+
+rm -rf conftest.dSYM
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+ conftest$ac_exeext conftest.$ac_ext
+ ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+fi
+{ $as_echo "$as_me:$LINENO: result: $lt_cv_cc_needs_belf" >&5
+$as_echo "$lt_cv_cc_needs_belf" >&6; }
+ if test x"$lt_cv_cc_needs_belf" != x"yes"; then
+ # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
+ CFLAGS="$SAVE_CFLAGS"
+ fi
+ ;;
+sparc*-*solaris*)
+ # Find out which ABI we are using.
+ echo 'int i;' > conftest.$ac_ext
+ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ case `/usr/bin/file conftest.o` in
+ *64-bit*)
+ case $lt_cv_prog_gnu_ld in
+ yes*) LD="${LD-ld} -m elf64_sparc" ;;
+ *)
+ if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
+ LD="${LD-ld} -64"
+ fi
+ ;;
+ esac
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+
+
+esac
+
+need_locks="$enable_libtool_lock"
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ $as_echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5
+$as_echo_n "checking how to run the C preprocessor... " >&6; }
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+ CPP=
+fi
+if test -z "$CPP"; then
+ if test "${ac_cv_prog_CPP+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ # Double quotes because CPP needs to be expanded
+ for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+ do
+ ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ # <limits.h> exists even on freestanding compilers.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+ Syntax error
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null && {
+ test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ }; then
+ :
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Broken: fails on valid input.
+continue
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether nonexistent headers
+ # can be detected and how.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null && {
+ test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ }; then
+ # Broken: success on invalid input.
+continue
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+ break
+fi
+
+ done
+ ac_cv_prog_CPP=$CPP
+
+fi
+ CPP=$ac_cv_prog_CPP
+else
+ ac_cv_prog_CPP=$CPP
+fi
+{ $as_echo "$as_me:$LINENO: result: $CPP" >&5
+$as_echo "$CPP" >&6; }
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ # <limits.h> exists even on freestanding compilers.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+ Syntax error
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null && {
+ test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ }; then
+ :
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Broken: fails on valid input.
+continue
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether nonexistent headers
+ # can be detected and how.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null && {
+ test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ }; then
+ # Broken: success on invalid input.
+continue
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+ :
+else
+ { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+{ { $as_echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details." >&5
+$as_echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+{ $as_echo "$as_me:$LINENO: checking for ANSI C header files" >&5
+$as_echo_n "checking for ANSI C header files... " >&6; }
+if test "${ac_cv_header_stdc+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_cv_header_stdc=yes
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_header_stdc=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test $ac_cv_header_stdc = yes; then
+ # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "memchr" >/dev/null 2>&1; then
+ :
+else
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stdlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "free" >/dev/null 2>&1; then
+ :
+else
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+ if test "$cross_compiling" = yes; then
+ :
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <ctype.h>
+#include <stdlib.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) \
+ (('a' <= (c) && (c) <= 'i') \
+ || ('j' <= (c) && (c) <= 'r') \
+ || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main ()
+{
+ int i;
+ for (i = 0; i < 256; i++)
+ if (XOR (islower (i), ISLOWER (i))
+ || toupper (i) != TOUPPER (i))
+ return 2;
+ return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ :
+else
+ $as_echo "$as_me: program exited with status $ac_status" >&5
+$as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ac_cv_header_stdc=no
+fi
+rm -rf conftest.dSYM
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+
+fi
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5
+$as_echo "$ac_cv_header_stdc" >&6; }
+if test $ac_cv_header_stdc = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define STDC_HEADERS 1
+_ACEOF
+
+fi
+
+# On IRIX 5.3, sys/types and inttypes.h are conflicting.
+
+
+
+
+
+
+
+
+
+for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
+ inttypes.h stdint.h unistd.h
+do
+as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5
+$as_echo_n "checking for $ac_header... " >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ $as_echo_n "(cached) " >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ eval "$as_ac_Header=yes"
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ eval "$as_ac_Header=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+ac_res=`eval 'as_val=${'$as_ac_Header'}
+ $as_echo "$as_val"'`
+ { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+as_val=`eval 'as_val=${'$as_ac_Header'}
+ $as_echo "$as_val"'`
+ if test "x$as_val" = x""yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+
+for ac_header in dlfcn.h
+do
+as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5
+$as_echo_n "checking for $ac_header... " >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ $as_echo_n "(cached) " >&6
+fi
+ac_res=`eval 'as_val=${'$as_ac_Header'}
+ $as_echo "$as_val"'`
+ { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+else
+ # Is the header compilable?
+{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5
+$as_echo_n "checking $ac_header usability... " >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_header_compiler=yes
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_compiler=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+$as_echo "$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5
+$as_echo_n "checking $ac_header presence... " >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <$ac_header>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null && {
+ test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ }; then
+ ac_header_preproc=yes
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_preproc=no
+fi
+
+rm -f conftest.err conftest.$ac_ext
+{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+$as_echo "$ac_header_preproc" >&6; }
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+ yes:no: )
+ { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+ ac_header_preproc=yes
+ ;;
+ no:yes:* )
+ { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+ { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
+$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
+ { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+ { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5
+$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;}
+ { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+ { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+ ( cat <<\_ASBOX
+## --------------------- ##
+## Report this to 3.12.4 ##
+## --------------------- ##
+_ASBOX
+ ) | sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5
+$as_echo_n "checking for $ac_header... " >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ $as_echo_n "(cached) " >&6
+else
+ eval "$as_ac_Header=\$ac_header_preproc"
+fi
+ac_res=`eval 'as_val=${'$as_ac_Header'}
+ $as_echo "$as_val"'`
+ { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+
+fi
+as_val=`eval 'as_val=${'$as_ac_Header'}
+ $as_echo "$as_val"'`
+ if test "x$as_val" = x""yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+
+if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
+ ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
+ (test "X$CXX" != "Xg++"))) ; then
+ ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+{ $as_echo "$as_me:$LINENO: checking how to run the C++ preprocessor" >&5
+$as_echo_n "checking how to run the C++ preprocessor... " >&6; }
+if test -z "$CXXCPP"; then
+ if test "${ac_cv_prog_CXXCPP+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ # Double quotes because CXXCPP needs to be expanded
+ for CXXCPP in "$CXX -E" "/lib/cpp"
+ do
+ ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ # <limits.h> exists even on freestanding compilers.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+ Syntax error
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null && {
+ test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
+ test ! -s conftest.err
+ }; then
+ :
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Broken: fails on valid input.
+continue
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether nonexistent headers
+ # can be detected and how.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null && {
+ test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
+ test ! -s conftest.err
+ }; then
+ # Broken: success on invalid input.
+continue
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+ break
+fi
+
+ done
+ ac_cv_prog_CXXCPP=$CXXCPP
+
+fi
+ CXXCPP=$ac_cv_prog_CXXCPP
+else
+ ac_cv_prog_CXXCPP=$CXXCPP
+fi
+{ $as_echo "$as_me:$LINENO: result: $CXXCPP" >&5
+$as_echo "$CXXCPP" >&6; }
+ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ # <limits.h> exists even on freestanding compilers.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+ Syntax error
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null && {
+ test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
+ test ! -s conftest.err
+ }; then
+ :
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Broken: fails on valid input.
+continue
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether nonexistent headers
+ # can be detected and how.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null && {
+ test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
+ test ! -s conftest.err
+ }; then
+ # Broken: success on invalid input.
+continue
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+ :
+else
+ { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+{ { $as_echo "$as_me:$LINENO: error: C++ preprocessor \"$CXXCPP\" fails sanity check
+See \`config.log' for more details." >&5
+$as_echo "$as_me: error: C++ preprocessor \"$CXXCPP\" fails sanity check
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }; }
+fi
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+fi
+
+
+ac_ext=f
+ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5'
+ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_f77_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+ for ac_prog in g77 xlf f77 frt pgf77 cf77 fort77 fl32 af77 xlf90 f90 pgf90 pghpf epcf90 gfortran g95 xlf95 f95 fort ifort ifc efc pgf95 lf95 ftn
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_F77+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$F77"; then
+ ac_cv_prog_F77="$F77" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_prog_F77="$ac_tool_prefix$ac_prog"
+ $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+F77=$ac_cv_prog_F77
+if test -n "$F77"; then
+ { $as_echo "$as_me:$LINENO: result: $F77" >&5
+$as_echo "$F77" >&6; }
+else
+ { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$F77" && break
+ done
+fi
+if test -z "$F77"; then
+ ac_ct_F77=$F77
+ for ac_prog in g77 xlf f77 frt pgf77 cf77 fort77 fl32 af77 xlf90 f90 pgf90 pghpf epcf90 gfortran g95 xlf95 f95 fort ifort ifc efc pgf95 lf95 ftn
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_ac_ct_F77+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_F77"; then
+ ac_cv_prog_ac_ct_F77="$ac_ct_F77" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_prog_ac_ct_F77="$ac_prog"
+ $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_F77=$ac_cv_prog_ac_ct_F77
+if test -n "$ac_ct_F77"; then
+ { $as_echo "$as_me:$LINENO: result: $ac_ct_F77" >&5
+$as_echo "$ac_ct_F77" >&6; }
+else
+ { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$ac_ct_F77" && break
+done
+
+ if test "x$ac_ct_F77" = x; then
+ F77=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ F77=$ac_ct_F77
+ fi
+fi
+
+
+# Provide some information about the compiler.
+$as_echo "$as_me:$LINENO: checking for Fortran 77 compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+{ (ac_try="$ac_compiler --version >&5"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_compiler --version >&5") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+{ (ac_try="$ac_compiler -v >&5"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_compiler -v >&5") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+{ (ac_try="$ac_compiler -V >&5"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_compiler -V >&5") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+rm -f a.out
+
+# If we don't use `.F' as extension, the preprocessor is not run on the
+# input file. (Note that this only needs to work for GNU compilers.)
+ac_save_ext=$ac_ext
+ac_ext=F
+{ $as_echo "$as_me:$LINENO: checking whether we are using the GNU Fortran 77 compiler" >&5
+$as_echo_n "checking whether we are using the GNU Fortran 77 compiler... " >&6; }
+if test "${ac_cv_f77_compiler_gnu+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+ program main
+#ifndef __GNUC__
+ choke me
+#endif
+
+ end
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_f77_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_compiler_gnu=yes
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_compiler_gnu=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_f77_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_f77_compiler_gnu" >&5
+$as_echo "$ac_cv_f77_compiler_gnu" >&6; }
+ac_ext=$ac_save_ext
+ac_test_FFLAGS=${FFLAGS+set}
+ac_save_FFLAGS=$FFLAGS
+FFLAGS=
+{ $as_echo "$as_me:$LINENO: checking whether $F77 accepts -g" >&5
+$as_echo_n "checking whether $F77 accepts -g... " >&6; }
+if test "${ac_cv_prog_f77_g+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ FFLAGS=-g
+cat >conftest.$ac_ext <<_ACEOF
+ program main
+
+ end
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_f77_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_cv_prog_f77_g=yes
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_prog_f77_g=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_prog_f77_g" >&5
+$as_echo "$ac_cv_prog_f77_g" >&6; }
+if test "$ac_test_FFLAGS" = set; then
+ FFLAGS=$ac_save_FFLAGS
+elif test $ac_cv_prog_f77_g = yes; then
+ if test "x$ac_cv_f77_compiler_gnu" = xyes; then
+ FFLAGS="-g -O2"
+ else
+ FFLAGS="-g"
+ fi
+else
+ if test "x$ac_cv_f77_compiler_gnu" = xyes; then
+ FFLAGS="-O2"
+ else
+ FFLAGS=
+ fi
+fi
+
+if test $ac_compiler_gnu = yes; then
+ G77=yes
+else
+ G77=
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+# Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers!
+# find the maximum length of command line arguments
+{ $as_echo "$as_me:$LINENO: checking the maximum length of command line arguments" >&5
+$as_echo_n "checking the maximum length of command line arguments... " >&6; }
+if test "${lt_cv_sys_max_cmd_len+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ i=0
+ teststring="ABCD"
+
+ case $build_os in
+ msdosdjgpp*)
+ # On DJGPP, this test can blow up pretty badly due to problems in libc
+ # (any single argument exceeding 2000 bytes causes a buffer overrun
+ # during glob expansion). Even if it were fixed, the result of this
+ # check would be larger than it should be.
+ lt_cv_sys_max_cmd_len=12288; # 12K is about right
+ ;;
+
+ gnu*)
+ # Under GNU Hurd, this test is not required because there is
+ # no limit to the length of command line arguments.
+ # Libtool will interpret -1 as no limit whatsoever
+ lt_cv_sys_max_cmd_len=-1;
+ ;;
+
+ cygwin* | mingw*)
+ # On Win9x/ME, this test blows up -- it succeeds, but takes
+ # about 5 minutes as the teststring grows exponentially.
+ # Worse, since 9x/ME are not pre-emptively multitasking,
+ # you end up with a "frozen" computer, even though with patience
+ # the test eventually succeeds (with a max line length of 256k).
+ # Instead, let's just punt: use the minimum linelength reported by
+ # all of the supported platforms: 8192 (on NT/2K/XP).
+ lt_cv_sys_max_cmd_len=8192;
+ ;;
+
+ amigaos*)
+ # On AmigaOS with pdksh, this test takes hours, literally.
+ # So we just punt and use a minimum line length of 8192.
+ lt_cv_sys_max_cmd_len=8192;
+ ;;
+
+ netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
+ # This has been around since 386BSD, at least. Likely further.
+ if test -x /sbin/sysctl; then
+ lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
+ elif test -x /usr/sbin/sysctl; then
+ lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
+ else
+ lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs
+ fi
+ # And add a safety zone
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+ ;;
+
+ interix*)
+ # We know the value 262144 and hardcode it with a safety zone (like BSD)
+ lt_cv_sys_max_cmd_len=196608
+ ;;
+
+ osf*)
+ # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
+ # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
+ # nice to cause kernel panics so lets avoid the loop below.
+ # First set a reasonable default.
+ lt_cv_sys_max_cmd_len=16384
+ #
+ if test -x /sbin/sysconfig; then
+ case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
+ *1*) lt_cv_sys_max_cmd_len=-1 ;;
+ esac
+ fi
+ ;;
+ sco3.2v5*)
+ lt_cv_sys_max_cmd_len=102400
+ ;;
+ sysv5* | sco5v6* | sysv4.2uw2*)
+ kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
+ if test -n "$kargmax"; then
+ lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'`
+ else
+ lt_cv_sys_max_cmd_len=32768
+ fi
+ ;;
+ *)
+ lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
+ if test -n "$lt_cv_sys_max_cmd_len"; then
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+ else
+ SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
+ while (test "X"`$SHELL $0 --fallback-echo "X$teststring" 2>/dev/null` \
+ = "XX$teststring") >/dev/null 2>&1 &&
+ new_result=`expr "X$teststring" : ".*" 2>&1` &&
+ lt_cv_sys_max_cmd_len=$new_result &&
+ test $i != 17 # 1/2 MB should be enough
+ do
+ i=`expr $i + 1`
+ teststring=$teststring$teststring
+ done
+ teststring=
+ # Add a significant safety factor because C++ compilers can tack on massive
+ # amounts of additional arguments before passing them to the linker.
+ # It appears as though 1/2 is a usable value.
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
+ fi
+ ;;
+ esac
+
+fi
+
+if test -n $lt_cv_sys_max_cmd_len ; then
+ { $as_echo "$as_me:$LINENO: result: $lt_cv_sys_max_cmd_len" >&5
+$as_echo "$lt_cv_sys_max_cmd_len" >&6; }
+else
+ { $as_echo "$as_me:$LINENO: result: none" >&5
+$as_echo "none" >&6; }
+fi
+
+
+
+
+
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+{ $as_echo "$as_me:$LINENO: checking command to parse $NM output from $compiler object" >&5
+$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; }
+if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+
+# These are sane defaults that work on at least a few old systems.
+# [They come from Ultrix. What could be older than Ultrix?!! ;)]
+
+# Character class describing NM global symbol codes.
+symcode='[BCDEGRST]'
+
+# Regexp to match symbols that can be accessed directly from C.
+sympat='\([_A-Za-z][_A-Za-z0-9]*\)'
+
+# Transform an extracted symbol line into a proper C declaration
+lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'"
+
+# Transform an extracted symbol line into symbol name and symbol address
+lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'"
+
+# Define system-specific variables.
+case $host_os in
+aix*)
+ symcode='[BCDT]'
+ ;;
+cygwin* | mingw* | pw32*)
+ symcode='[ABCDGISTW]'
+ ;;
+hpux*) # Its linker distinguishes data from code symbols
+ if test "$host_cpu" = ia64; then
+ symcode='[ABCDEGRST]'
+ fi
+ lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+ lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'"
+ ;;
+linux* | k*bsd*-gnu)
+ if test "$host_cpu" = ia64; then
+ symcode='[ABCDGIRSTW]'
+ lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+ lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'"
+ fi
+ ;;
+irix* | nonstopux*)
+ symcode='[BCDEGRST]'
+ ;;
+osf*)
+ symcode='[BCDEGQRST]'
+ ;;
+solaris*)
+ symcode='[BDRT]'
+ ;;
+sco3.2v5*)
+ symcode='[DT]'
+ ;;
+sysv4.2uw2*)
+ symcode='[DT]'
+ ;;
+sysv5* | sco5v6* | unixware* | OpenUNIX*)
+ symcode='[ABDT]'
+ ;;
+sysv4)
+ symcode='[DFNSTU]'
+ ;;
+esac
+
+# Handle CRLF in mingw tool chain
+opt_cr=
+case $build_os in
+mingw*)
+ opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp
+ ;;
+esac
+
+# If we're using GNU nm, then use its standard symbol codes.
+case `$NM -V 2>&1` in
+*GNU* | *'with BFD'*)
+ symcode='[ABCDGIRSTW]' ;;
+esac
+
+# Try without a prefix undercore, then with it.
+for ac_symprfx in "" "_"; do
+
+ # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
+ symxfrm="\\1 $ac_symprfx\\2 \\2"
+
+ # Write the raw and C identifiers.
+ lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
+
+ # Check to see that the pipe works correctly.
+ pipe_works=no
+
+ rm -f conftest*
+ cat > conftest.$ac_ext <<EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func();return(0);}
+EOF
+
+ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ # Now try to grab the symbols.
+ nlist=conftest.nm
+ if { (eval echo "$as_me:$LINENO: \"$NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist\"") >&5
+ (eval $NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && test -s "$nlist"; then
+ # Try sorting and uniquifying the output.
+ if sort "$nlist" | uniq > "$nlist"T; then
+ mv -f "$nlist"T "$nlist"
+ else
+ rm -f "$nlist"T
+ fi
+
+ # Make sure that we snagged all the symbols we need.
+ if grep ' nm_test_var$' "$nlist" >/dev/null; then
+ if grep ' nm_test_func$' "$nlist" >/dev/null; then
+ cat <<EOF > conftest.$ac_ext
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+EOF
+ # Now generate the symbol file.
+ eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext'
+
+ cat <<EOF >> conftest.$ac_ext
+#if defined (__STDC__) && __STDC__
+# define lt_ptr_t void *
+#else
+# define lt_ptr_t char *
+# define const
+#endif
+
+/* The mapping between symbol names and symbols. */
+const struct {
+ const char *name;
+ lt_ptr_t address;
+}
+lt_preloaded_symbols[] =
+{
+EOF
+ $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext
+ cat <<\EOF >> conftest.$ac_ext
+ {0, (lt_ptr_t) 0}
+};
+
+#ifdef __cplusplus
+}
+#endif
+EOF
+ # Now try linking the two files.
+ mv conftest.$ac_objext conftstm.$ac_objext
+ lt_save_LIBS="$LIBS"
+ lt_save_CFLAGS="$CFLAGS"
+ LIBS="conftstm.$ac_objext"
+ CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag"
+ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && test -s conftest${ac_exeext}; then
+ pipe_works=yes
+ fi
+ LIBS="$lt_save_LIBS"
+ CFLAGS="$lt_save_CFLAGS"
+ else
+ echo "cannot find nm_test_func in $nlist" >&5
+ fi
+ else
+ echo "cannot find nm_test_var in $nlist" >&5
+ fi
+ else
+ echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5
+ fi
+ else
+ echo "$progname: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ fi
+ rm -rf conftest* conftst*
+
+ # Do not use the global_symbol_pipe unless it works.
+ if test "$pipe_works" = yes; then
+ break
+ else
+ lt_cv_sys_global_symbol_pipe=
+ fi
+done
+
+fi
+
+if test -z "$lt_cv_sys_global_symbol_pipe"; then
+ lt_cv_sys_global_symbol_to_cdecl=
+fi
+if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
+ { $as_echo "$as_me:$LINENO: result: failed" >&5
+$as_echo "failed" >&6; }
+else
+ { $as_echo "$as_me:$LINENO: result: ok" >&5
+$as_echo "ok" >&6; }
+fi
+
+{ $as_echo "$as_me:$LINENO: checking for objdir" >&5
+$as_echo_n "checking for objdir... " >&6; }
+if test "${lt_cv_objdir+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ rm -f .libs 2>/dev/null
+mkdir .libs 2>/dev/null
+if test -d .libs; then
+ lt_cv_objdir=.libs
+else
+ # MS-DOS does not allow filenames that begin with a dot.
+ lt_cv_objdir=_libs
+fi
+rmdir .libs 2>/dev/null
+fi
+{ $as_echo "$as_me:$LINENO: result: $lt_cv_objdir" >&5
+$as_echo "$lt_cv_objdir" >&6; }
+objdir=$lt_cv_objdir
+
+
+
+
+
+case $host_os in
+aix3*)
+ # AIX sometimes has problems with the GCC collect2 program. For some
+ # reason, if we set the COLLECT_NAMES environment variable, the problems
+ # vanish in a puff of smoke.
+ if test "X${COLLECT_NAMES+set}" != Xset; then
+ COLLECT_NAMES=
+ export COLLECT_NAMES
+ fi
+ ;;
+esac
+
+# Sed substitution that helps us do robust quoting. It backslashifies
+# metacharacters that are still active within double-quoted strings.
+Xsed='sed -e 1s/^X//'
+sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g'
+
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g'
+
+# Sed substitution to delay expansion of an escaped shell variable in a
+# double_quote_subst'ed string.
+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
+
+# Sed substitution to avoid accidental globbing in evaled expressions
+no_glob_subst='s/\*/\\\*/g'
+
+# Constants:
+rm="rm -f"
+
+# Global variables:
+default_ofile=libtool
+can_build_shared=yes
+
+# All known linkers require a `.a' archive for static linking (except MSVC,
+# which needs '.lib').
+libext=a
+ltmain="$ac_aux_dir/ltmain.sh"
+ofile="$default_ofile"
+with_gnu_ld="$lt_cv_prog_gnu_ld"
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ar; ac_word=$2
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_AR+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$AR"; then
+ ac_cv_prog_AR="$AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_prog_AR="${ac_tool_prefix}ar"
+ $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+AR=$ac_cv_prog_AR
+if test -n "$AR"; then
+ { $as_echo "$as_me:$LINENO: result: $AR" >&5
+$as_echo "$AR" >&6; }
+else
+ { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_AR"; then
+ ac_ct_AR=$AR
+ # Extract the first word of "ar", so it can be a program name with args.
+set dummy ar; ac_word=$2
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_ac_ct_AR+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_AR"; then
+ ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_prog_ac_ct_AR="ar"
+ $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_AR=$ac_cv_prog_ac_ct_AR
+if test -n "$ac_ct_AR"; then
+ { $as_echo "$as_me:$LINENO: result: $ac_ct_AR" >&5
+$as_echo "$ac_ct_AR" >&6; }
+else
+ { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_AR" = x; then
+ AR="false"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ AR=$ac_ct_AR
+ fi
+else
+ AR="$ac_cv_prog_AR"
+fi
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ranlib; ac_word=$2
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_RANLIB+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$RANLIB"; then
+ ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
+ $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+RANLIB=$ac_cv_prog_RANLIB
+if test -n "$RANLIB"; then
+ { $as_echo "$as_me:$LINENO: result: $RANLIB" >&5
+$as_echo "$RANLIB" >&6; }
+else
+ { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_RANLIB"; then
+ ac_ct_RANLIB=$RANLIB
+ # Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_RANLIB"; then
+ ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_prog_ac_ct_RANLIB="ranlib"
+ $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
+if test -n "$ac_ct_RANLIB"; then
+ { $as_echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5
+$as_echo "$ac_ct_RANLIB" >&6; }
+else
+ { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_RANLIB" = x; then
+ RANLIB=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ RANLIB=$ac_ct_RANLIB
+ fi
+else
+ RANLIB="$ac_cv_prog_RANLIB"
+fi
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_STRIP+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$STRIP"; then
+ ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+ $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+ { $as_echo "$as_me:$LINENO: result: $STRIP" >&5
+$as_echo "$STRIP" >&6; }
+else
+ { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+ ac_ct_STRIP=$STRIP
+ # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_STRIP"; then
+ ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_prog_ac_ct_STRIP="strip"
+ $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+ { $as_echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5
+$as_echo "$ac_ct_STRIP" >&6; }
+else
+ { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_STRIP" = x; then
+ STRIP=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ STRIP=$ac_ct_STRIP
+ fi
+else
+ STRIP="$ac_cv_prog_STRIP"
+fi
+
+
+old_CC="$CC"
+old_CFLAGS="$CFLAGS"
+
+# Set sane defaults for various variables
+test -z "$AR" && AR=ar
+test -z "$AR_FLAGS" && AR_FLAGS=cru
+test -z "$AS" && AS=as
+test -z "$CC" && CC=cc
+test -z "$LTCC" && LTCC=$CC
+test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+test -z "$LD" && LD=ld
+test -z "$LN_S" && LN_S="ln -s"
+test -z "$MAGIC_CMD" && MAGIC_CMD=file
+test -z "$NM" && NM=nm
+test -z "$SED" && SED=sed
+test -z "$OBJDUMP" && OBJDUMP=objdump
+test -z "$RANLIB" && RANLIB=:
+test -z "$STRIP" && STRIP=:
+test -z "$ac_objext" && ac_objext=o
+
+# Determine commands to create old-style static archives.
+old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
+old_postinstall_cmds='chmod 644 $oldlib'
+old_postuninstall_cmds=
+
+if test -n "$RANLIB"; then
+ case $host_os in
+ openbsd*)
+ old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib"
+ ;;
+ *)
+ old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib"
+ ;;
+ esac
+ old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib"
+fi
+
+for cc_temp in $compiler""; do
+ case $cc_temp in
+ compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+ distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+ \-*) ;;
+ *) break;;
+ esac
+done
+cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+
+
+# Only perform the check for file, if the check method requires it
+case $deplibs_check_method in
+file_magic*)
+ if test "$file_magic_cmd" = '$MAGIC_CMD'; then
+ { $as_echo "$as_me:$LINENO: checking for ${ac_tool_prefix}file" >&5
+$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; }
+if test "${lt_cv_path_MAGIC_CMD+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ case $MAGIC_CMD in
+[\\/*] | ?:[\\/]*)
+ lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+ ;;
+*)
+ lt_save_MAGIC_CMD="$MAGIC_CMD"
+ lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+ ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
+ for ac_dir in $ac_dummy; do
+ IFS="$lt_save_ifs"
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/${ac_tool_prefix}file; then
+ lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file"
+ if test -n "$file_magic_test_file"; then
+ case $deplibs_check_method in
+ "file_magic "*)
+ file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+ MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+ if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+ $EGREP "$file_magic_regex" > /dev/null; then
+ :
+ else
+ cat <<EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such. This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem. Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool@gnu.org
+
+EOF
+ fi ;;
+ esac
+ fi
+ break
+ fi
+ done
+ IFS="$lt_save_ifs"
+ MAGIC_CMD="$lt_save_MAGIC_CMD"
+ ;;
+esac
+fi
+
+MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+if test -n "$MAGIC_CMD"; then
+ { $as_echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5
+$as_echo "$MAGIC_CMD" >&6; }
+else
+ { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+if test -z "$lt_cv_path_MAGIC_CMD"; then
+ if test -n "$ac_tool_prefix"; then
+ { $as_echo "$as_me:$LINENO: checking for file" >&5
+$as_echo_n "checking for file... " >&6; }
+if test "${lt_cv_path_MAGIC_CMD+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ case $MAGIC_CMD in
+[\\/*] | ?:[\\/]*)
+ lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+ ;;
+*)
+ lt_save_MAGIC_CMD="$MAGIC_CMD"
+ lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+ ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
+ for ac_dir in $ac_dummy; do
+ IFS="$lt_save_ifs"
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/file; then
+ lt_cv_path_MAGIC_CMD="$ac_dir/file"
+ if test -n "$file_magic_test_file"; then
+ case $deplibs_check_method in
+ "file_magic "*)
+ file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+ MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+ if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+ $EGREP "$file_magic_regex" > /dev/null; then
+ :
+ else
+ cat <<EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such. This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem. Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool@gnu.org
+
+EOF
+ fi ;;
+ esac
+ fi
+ break
+ fi
+ done
+ IFS="$lt_save_ifs"
+ MAGIC_CMD="$lt_save_MAGIC_CMD"
+ ;;
+esac
+fi
+
+MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+if test -n "$MAGIC_CMD"; then
+ { $as_echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5
+$as_echo "$MAGIC_CMD" >&6; }
+else
+ { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ else
+ MAGIC_CMD=:
+ fi
+fi
+
+ fi
+ ;;
+esac
+
+
+ case $host_os in
+ rhapsody* | darwin*)
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args.
+set dummy ${ac_tool_prefix}dsymutil; ac_word=$2
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_DSYMUTIL+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$DSYMUTIL"; then
+ ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil"
+ $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+DSYMUTIL=$ac_cv_prog_DSYMUTIL
+if test -n "$DSYMUTIL"; then
+ { $as_echo "$as_me:$LINENO: result: $DSYMUTIL" >&5
+$as_echo "$DSYMUTIL" >&6; }
+else
+ { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_DSYMUTIL"; then
+ ac_ct_DSYMUTIL=$DSYMUTIL
+ # Extract the first word of "dsymutil", so it can be a program name with args.
+set dummy dsymutil; ac_word=$2
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_ac_ct_DSYMUTIL+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_DSYMUTIL"; then
+ ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_prog_ac_ct_DSYMUTIL="dsymutil"
+ $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL
+if test -n "$ac_ct_DSYMUTIL"; then
+ { $as_echo "$as_me:$LINENO: result: $ac_ct_DSYMUTIL" >&5
+$as_echo "$ac_ct_DSYMUTIL" >&6; }
+else
+ { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_DSYMUTIL" = x; then
+ DSYMUTIL=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ DSYMUTIL=$ac_ct_DSYMUTIL
+ fi
+else
+ DSYMUTIL="$ac_cv_prog_DSYMUTIL"
+fi
+
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args.
+set dummy ${ac_tool_prefix}nmedit; ac_word=$2
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_NMEDIT+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$NMEDIT"; then
+ ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit"
+ $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+NMEDIT=$ac_cv_prog_NMEDIT
+if test -n "$NMEDIT"; then
+ { $as_echo "$as_me:$LINENO: result: $NMEDIT" >&5
+$as_echo "$NMEDIT" >&6; }
+else
+ { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_NMEDIT"; then
+ ac_ct_NMEDIT=$NMEDIT
+ # Extract the first word of "nmedit", so it can be a program name with args.
+set dummy nmedit; ac_word=$2
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_ac_ct_NMEDIT+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_NMEDIT"; then
+ ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_prog_ac_ct_NMEDIT="nmedit"
+ $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT
+if test -n "$ac_ct_NMEDIT"; then
+ { $as_echo "$as_me:$LINENO: result: $ac_ct_NMEDIT" >&5
+$as_echo "$ac_ct_NMEDIT" >&6; }
+else
+ { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_NMEDIT" = x; then
+ NMEDIT=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ NMEDIT=$ac_ct_NMEDIT
+ fi
+else
+ NMEDIT="$ac_cv_prog_NMEDIT"
+fi
+
+
+ { $as_echo "$as_me:$LINENO: checking for -single_module linker flag" >&5
+$as_echo_n "checking for -single_module linker flag... " >&6; }
+if test "${lt_cv_apple_cc_single_mod+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_apple_cc_single_mod=no
+ if test -z "${LT_MULTI_MODULE}"; then
+ # By default we will add the -single_module flag. You can override
+ # by either setting the environment variable LT_MULTI_MODULE
+ # non-empty at configure time, or by adding -multi_module to the
+ # link flags.
+ echo "int foo(void){return 1;}" > conftest.c
+ $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+ -dynamiclib ${wl}-single_module conftest.c
+ if test -f libconftest.dylib; then
+ lt_cv_apple_cc_single_mod=yes
+ rm -rf libconftest.dylib*
+ fi
+ rm conftest.c
+ fi
+fi
+{ $as_echo "$as_me:$LINENO: result: $lt_cv_apple_cc_single_mod" >&5
+$as_echo "$lt_cv_apple_cc_single_mod" >&6; }
+ { $as_echo "$as_me:$LINENO: checking for -exported_symbols_list linker flag" >&5
+$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; }
+if test "${lt_cv_ld_exported_symbols_list+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_ld_exported_symbols_list=no
+ save_LDFLAGS=$LDFLAGS
+ echo "_main" > conftest.sym
+ LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext && {
+ test "$cross_compiling" = yes ||
+ $as_test_x conftest$ac_exeext
+ }; then
+ lt_cv_ld_exported_symbols_list=yes
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ lt_cv_ld_exported_symbols_list=no
+fi
+
+rm -rf conftest.dSYM
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+ conftest$ac_exeext conftest.$ac_ext
+ LDFLAGS="$save_LDFLAGS"
+
+fi
+{ $as_echo "$as_me:$LINENO: result: $lt_cv_ld_exported_symbols_list" >&5
+$as_echo "$lt_cv_ld_exported_symbols_list" >&6; }
+ case $host_os in
+ rhapsody* | darwin1.[0123])
+ _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
+ darwin1.*)
+ _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+ darwin*)
+ # if running on 10.5 or later, the deployment target defaults
+ # to the OS version, if on x86, and 10.4, the deployment
+ # target defaults to 10.4. Don't you love it?
+ case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
+ 10.0,*86*-darwin8*|10.0,*-darwin[91]*)
+ _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+ 10.[012]*)
+ _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+ 10.*)
+ _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+ esac
+ ;;
+ esac
+ if test "$lt_cv_apple_cc_single_mod" = "yes"; then
+ _lt_dar_single_mod='$single_module'
+ fi
+ if test "$lt_cv_ld_exported_symbols_list" = "yes"; then
+ _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'
+ else
+ _lt_dar_export_syms="~$NMEDIT -s \$output_objdir/\${libname}-symbols.expsym \${lib}"
+ fi
+ if test "$DSYMUTIL" != ":"; then
+ _lt_dsymutil="~$DSYMUTIL \$lib || :"
+ else
+ _lt_dsymutil=
+ fi
+ ;;
+ esac
+
+
+enable_dlopen=no
+enable_win32_dll=no
+
+# Check whether --enable-libtool-lock was given.
+if test "${enable_libtool_lock+set}" = set; then
+ enableval=$enable_libtool_lock;
+fi
+
+test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
+
+
+# Check whether --with-pic was given.
+if test "${with_pic+set}" = set; then
+ withval=$with_pic; pic_mode="$withval"
+else
+ pic_mode=default
+fi
+
+test -z "$pic_mode" && pic_mode=default
+
+# Use C for the default configuration in the libtool script
+tagname=
+lt_save_CC="$CC"
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+# Source file extension for C test sources.
+ac_ext=c
+
+# Object file extension for compiled C test sources.
+objext=o
+objext=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(){return(0);}'
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+# save warnings/boilerplate of simple test code
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$rm conftest*
+
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$rm -r conftest*
+
+
+
+lt_prog_compiler_no_builtin_flag=
+
+if test "$GCC" = yes; then
+ lt_prog_compiler_no_builtin_flag=' -fno-builtin'
+
+
+{ $as_echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
+$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; }
+if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_prog_compiler_rtti_exceptions=no
+ ac_outfile=conftest.$ac_objext
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+ lt_compiler_flag="-fno-rtti -fno-exceptions"
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ # The option is referenced via a variable to avoid confusing sed.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:7868: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&5
+ echo "$as_me:7872: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s "$ac_outfile"; then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings other than the usual output.
+ $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_rtti_exceptions=yes
+ fi
+ fi
+ $rm conftest*
+
+fi
+{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
+$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; }
+
+if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then
+ lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions"
+else
+ :
+fi
+
+fi
+
+lt_prog_compiler_wl=
+lt_prog_compiler_pic=
+lt_prog_compiler_static=
+
+{ $as_echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5
+$as_echo_n "checking for $compiler option to produce PIC... " >&6; }
+
+ if test "$GCC" = yes; then
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_static='-static'
+
+ case $host_os in
+ aix*)
+ # All AIX code is PIC.
+ if test "$host_cpu" = ia64; then
+ # AIX 5 now supports IA64 processor
+ lt_prog_compiler_static='-Bstatic'
+ fi
+ ;;
+
+ amigaos*)
+ # FIXME: we need at least 68020 code to build shared libraries, but
+ # adding the `-m68020' flag to GCC prevents building anything better,
+ # like `-m68040'.
+ lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4'
+ ;;
+
+ beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+ # PIC is the default for these OSes.
+ ;;
+
+ mingw* | cygwin* | pw32* | os2*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ # Although the cygwin gcc ignores -fPIC, still need this for old-style
+ # (--disable-auto-import) libraries
+ lt_prog_compiler_pic='-DDLL_EXPORT'
+ ;;
+
+ darwin* | rhapsody*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ lt_prog_compiler_pic='-fno-common'
+ ;;
+
+ interix[3-9]*)
+ # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+ # Instead, we relocate shared libraries at runtime.
+ ;;
+
+ msdosdjgpp*)
+ # Just because we use GCC doesn't mean we suddenly get shared libraries
+ # on systems that don't support them.
+ lt_prog_compiler_can_build_shared=no
+ enable_shared=no
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ lt_prog_compiler_pic=-Kconform_pic
+ fi
+ ;;
+
+ hpux*)
+ # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+ # not for PA HP-UX.
+ case $host_cpu in
+ hppa*64*|ia64*)
+ # +Z the default
+ ;;
+ *)
+ lt_prog_compiler_pic='-fPIC'
+ ;;
+ esac
+ ;;
+
+ *)
+ lt_prog_compiler_pic='-fPIC'
+ ;;
+ esac
+ else
+ # PORTME Check for flag to pass linker flags through the system compiler.
+ case $host_os in
+ aix*)
+ lt_prog_compiler_wl='-Wl,'
+ if test "$host_cpu" = ia64; then
+ # AIX 5 now supports IA64 processor
+ lt_prog_compiler_static='-Bstatic'
+ else
+ lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp'
+ fi
+ ;;
+ darwin*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ case $cc_basename in
+ xlc*)
+ lt_prog_compiler_pic='-qnocommon'
+ lt_prog_compiler_wl='-Wl,'
+ ;;
+ esac
+ ;;
+
+ mingw* | cygwin* | pw32* | os2*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ lt_prog_compiler_pic='-DDLL_EXPORT'
+ ;;
+
+ hpux9* | hpux10* | hpux11*)
+ lt_prog_compiler_wl='-Wl,'
+ # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+ # not for PA HP-UX.
+ case $host_cpu in
+ hppa*64*|ia64*)
+ # +Z the default
+ ;;
+ *)
+ lt_prog_compiler_pic='+Z'
+ ;;
+ esac
+ # Is there a better lt_prog_compiler_static that works with the bundled CC?
+ lt_prog_compiler_static='${wl}-a ${wl}archive'
+ ;;
+
+ irix5* | irix6* | nonstopux*)
+ lt_prog_compiler_wl='-Wl,'
+ # PIC (with -KPIC) is the default.
+ lt_prog_compiler_static='-non_shared'
+ ;;
+
+ newsos6)
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+
+ linux* | k*bsd*-gnu)
+ case $cc_basename in
+ icc* | ecc*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-static'
+ ;;
+ pgcc* | pgf77* | pgf90* | pgf95*)
+ # Portland Group compilers (*not* the Pentium gcc compiler,
+ # which looks to be a dead project)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-fpic'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+ ccc*)
+ lt_prog_compiler_wl='-Wl,'
+ # All Alpha code is PIC.
+ lt_prog_compiler_static='-non_shared'
+ ;;
+ *)
+ case `$CC -V 2>&1 | sed 5q` in
+ *Sun\ C*)
+ # Sun C 5.9
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ lt_prog_compiler_wl='-Wl,'
+ ;;
+ *Sun\ F*)
+ # Sun Fortran 8.3 passes all unrecognized flags to the linker
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ lt_prog_compiler_wl=''
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+
+ osf3* | osf4* | osf5*)
+ lt_prog_compiler_wl='-Wl,'
+ # All OSF/1 code is PIC.
+ lt_prog_compiler_static='-non_shared'
+ ;;
+
+ rdos*)
+ lt_prog_compiler_static='-non_shared'
+ ;;
+
+ solaris*)
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ case $cc_basename in
+ f77* | f90* | f95*)
+ lt_prog_compiler_wl='-Qoption ld ';;
+ *)
+ lt_prog_compiler_wl='-Wl,';;
+ esac
+ ;;
+
+ sunos4*)
+ lt_prog_compiler_wl='-Qoption ld '
+ lt_prog_compiler_pic='-PIC'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+
+ sysv4 | sysv4.2uw2* | sysv4.3*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec ;then
+ lt_prog_compiler_pic='-Kconform_pic'
+ lt_prog_compiler_static='-Bstatic'
+ fi
+ ;;
+
+ sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+
+ unicos*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_can_build_shared=no
+ ;;
+
+ uts4*)
+ lt_prog_compiler_pic='-pic'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+
+ *)
+ lt_prog_compiler_can_build_shared=no
+ ;;
+ esac
+ fi
+
+{ $as_echo "$as_me:$LINENO: result: $lt_prog_compiler_pic" >&5
+$as_echo "$lt_prog_compiler_pic" >&6; }
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic"; then
+
+{ $as_echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5
+$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; }
+if test "${lt_cv_prog_compiler_pic_works+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_prog_compiler_pic_works=no
+ ac_outfile=conftest.$ac_objext
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+ lt_compiler_flag="$lt_prog_compiler_pic -DPIC"
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ # The option is referenced via a variable to avoid confusing sed.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:8158: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&5
+ echo "$as_me:8162: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s "$ac_outfile"; then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings other than the usual output.
+ $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_pic_works=yes
+ fi
+ fi
+ $rm conftest*
+
+fi
+{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_pic_works" >&5
+$as_echo "$lt_cv_prog_compiler_pic_works" >&6; }
+
+if test x"$lt_cv_prog_compiler_pic_works" = xyes; then
+ case $lt_prog_compiler_pic in
+ "" | " "*) ;;
+ *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;;
+ esac
+else
+ lt_prog_compiler_pic=
+ lt_prog_compiler_can_build_shared=no
+fi
+
+fi
+case $host_os in
+ # For platforms which do not support PIC, -DPIC is meaningless:
+ *djgpp*)
+ lt_prog_compiler_pic=
+ ;;
+ *)
+ lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC"
+ ;;
+esac
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\"
+{ $as_echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
+if test "${lt_cv_prog_compiler_static_works+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_prog_compiler_static_works=no
+ save_LDFLAGS="$LDFLAGS"
+ LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
+ echo "$lt_simple_link_test_code" > conftest.$ac_ext
+ if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+ # The linker can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ if test -s conftest.err; then
+ # Append any errors to the config.log.
+ cat conftest.err 1>&5
+ $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if diff conftest.exp conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_static_works=yes
+ fi
+ else
+ lt_cv_prog_compiler_static_works=yes
+ fi
+ fi
+ $rm -r conftest*
+ LDFLAGS="$save_LDFLAGS"
+
+fi
+{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_static_works" >&5
+$as_echo "$lt_cv_prog_compiler_static_works" >&6; }
+
+if test x"$lt_cv_prog_compiler_static_works" = xyes; then
+ :
+else
+ lt_prog_compiler_static=
+fi
+
+
+{ $as_echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5
+$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if test "${lt_cv_prog_compiler_c_o+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_prog_compiler_c_o=no
+ $rm -r conftest 2>/dev/null
+ mkdir conftest
+ cd conftest
+ mkdir out
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ lt_compiler_flag="-o out/conftest2.$ac_objext"
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:8262: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>out/conftest.err)
+ ac_status=$?
+ cat out/conftest.err >&5
+ echo "$as_me:8266: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s out/conftest2.$ac_objext
+ then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp
+ $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+ if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_c_o=yes
+ fi
+ fi
+ chmod u+w . 2>&5
+ $rm conftest*
+ # SGI C++ compiler will create directory out/ii_files/ for
+ # template instantiation
+ test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files
+ $rm out/* && rmdir out
+ cd ..
+ rmdir conftest
+ $rm conftest*
+
+fi
+{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o" >&5
+$as_echo "$lt_cv_prog_compiler_c_o" >&6; }
+
+
+hard_links="nottested"
+if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then
+ # do not overwrite the value of need_locks provided by the user
+ { $as_echo "$as_me:$LINENO: checking if we can lock with hard links" >&5
+$as_echo_n "checking if we can lock with hard links... " >&6; }
+ hard_links=yes
+ $rm conftest*
+ ln conftest.a conftest.b 2>/dev/null && hard_links=no
+ touch conftest.a
+ ln conftest.a conftest.b 2>&5 || hard_links=no
+ ln conftest.a conftest.b 2>/dev/null && hard_links=no
+ { $as_echo "$as_me:$LINENO: result: $hard_links" >&5
+$as_echo "$hard_links" >&6; }
+ if test "$hard_links" = no; then
+ { $as_echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
+$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
+ need_locks=warn
+ fi
+else
+ need_locks=no
+fi
+
+{ $as_echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
+
+ runpath_var=
+ allow_undefined_flag=
+ enable_shared_with_static_runtimes=no
+ archive_cmds=
+ archive_expsym_cmds=
+ old_archive_From_new_cmds=
+ old_archive_from_expsyms_cmds=
+ export_dynamic_flag_spec=
+ whole_archive_flag_spec=
+ thread_safe_flag_spec=
+ hardcode_libdir_flag_spec=
+ hardcode_libdir_flag_spec_ld=
+ hardcode_libdir_separator=
+ hardcode_direct=no
+ hardcode_minus_L=no
+ hardcode_shlibpath_var=unsupported
+ link_all_deplibs=unknown
+ hardcode_automatic=no
+ module_cmds=
+ module_expsym_cmds=
+ always_export_symbols=no
+ export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+ # include_expsyms should be a list of space-separated symbols to be *always*
+ # included in the symbol list
+ include_expsyms=
+ # exclude_expsyms can be an extended regexp of symbols to exclude
+ # it will be wrapped by ` (' and `)$', so one must not match beginning or
+ # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
+ # as well as any symbol that contains `d'.
+ exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
+ # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+ # platforms (ab)use it in PIC code, but their linkers get confused if
+ # the symbol is explicitly referenced. Since portable code cannot
+ # rely on this symbol name, it's probably fine to never include it in
+ # preloaded symbol tables.
+ # Exclude shared library initialization/finalization symbols.
+ extract_expsyms_cmds=
+ # Just being paranoid about ensuring that cc_basename is set.
+ for cc_temp in $compiler""; do
+ case $cc_temp in
+ compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+ distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+ \-*) ;;
+ *) break;;
+ esac
+done
+cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+
+ case $host_os in
+ cygwin* | mingw* | pw32*)
+ # FIXME: the MSVC++ port hasn't been tested in a loooong time
+ # When not using gcc, we currently assume that we are using
+ # Microsoft Visual C++.
+ if test "$GCC" != yes; then
+ with_gnu_ld=no
+ fi
+ ;;
+ interix*)
+ # we just hope/assume this is gcc and not c89 (= MSVC++)
+ with_gnu_ld=yes
+ ;;
+ openbsd*)
+ with_gnu_ld=no
+ ;;
+ esac
+
+ ld_shlibs=yes
+ if test "$with_gnu_ld" = yes; then
+ # If archive_cmds runs LD, not CC, wlarc should be empty
+ wlarc='${wl}'
+
+ # Set some defaults for GNU ld with shared library support. These
+ # are reset later if shared libraries are not supported. Putting them
+ # here allows them to be overridden if necessary.
+ runpath_var=LD_RUN_PATH
+ hardcode_libdir_flag_spec='${wl}--rpath ${wl}$libdir'
+ export_dynamic_flag_spec='${wl}--export-dynamic'
+ # ancient GNU ld didn't support --whole-archive et. al.
+ if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then
+ whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+ else
+ whole_archive_flag_spec=
+ fi
+ supports_anon_versioning=no
+ case `$LD -v 2>/dev/null` in
+ *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
+ *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
+ *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
+ *\ 2.11.*) ;; # other 2.11 versions
+ *) supports_anon_versioning=yes ;;
+ esac
+
+ # See if GNU ld supports shared libraries.
+ case $host_os in
+ aix[3-9]*)
+ # On AIX/PPC, the GNU linker is very broken
+ if test "$host_cpu" != ia64; then
+ ld_shlibs=no
+ cat <<EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.9.1, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support. If you
+*** really care for shared libraries, you may want to modify your PATH
+*** so that a non-GNU linker is found, and then restart.
+
+EOF
+ fi
+ ;;
+
+ amigaos*)
+ archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+
+ # Samuel A. Falvo II <kc5tja@dolphin.openprojects.net> reports
+ # that the semantics of dynamic libraries on AmigaOS, at least up
+ # to version 4, is to share data among multiple programs linked
+ # with the same dynamic library. Since this doesn't match the
+ # behavior of shared libraries on other platforms, we can't use
+ # them.
+ ld_shlibs=no
+ ;;
+
+ beos*)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ allow_undefined_flag=unsupported
+ # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+ # support --undefined. This deserves some investigation. FIXME
+ archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ else
+ ld_shlibs=no
+ fi
+ ;;
+
+ cygwin* | mingw* | pw32*)
+ # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless,
+ # as there is no search path for DLLs.
+ hardcode_libdir_flag_spec='-L$libdir'
+ allow_undefined_flag=unsupported
+ always_export_symbols=no
+ enable_shared_with_static_runtimes=yes
+ export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/'\'' -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols'
+
+ if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+ # If the export-symbols file already is a .def file (1st line
+ # is EXPORTS), use it as is; otherwise, prepend...
+ archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+ cp $export_symbols $output_objdir/$soname.def;
+ else
+ echo EXPORTS > $output_objdir/$soname.def;
+ cat $export_symbols >> $output_objdir/$soname.def;
+ fi~
+ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+ else
+ ld_shlibs=no
+ fi
+ ;;
+
+ interix[3-9]*)
+ hardcode_direct=no
+ hardcode_shlibpath_var=no
+ hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+ export_dynamic_flag_spec='${wl}-E'
+ # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+ # Instead, shared libraries are loaded at an image base (0x10000000 by
+ # default) and relocated if they conflict, which is a slow very memory
+ # consuming and fragmenting process. To avoid this, we pick a random,
+ # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+ # time. Moving up from 0x10000000 also allows more sbrk(2) space.
+ archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+ archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+ ;;
+
+ gnu* | linux* | k*bsd*-gnu)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ tmp_addflag=
+ case $cc_basename,$host_cpu in
+ pgcc*) # Portland Group C compiler
+ whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
+ tmp_addflag=' $pic_flag'
+ ;;
+ pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers
+ whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
+ tmp_addflag=' $pic_flag -Mnomain' ;;
+ ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64
+ tmp_addflag=' -i_dynamic' ;;
+ efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64
+ tmp_addflag=' -i_dynamic -nofor_main' ;;
+ ifc* | ifort*) # Intel Fortran compiler
+ tmp_addflag=' -nofor_main' ;;
+ esac
+ case `$CC -V 2>&1 | sed 5q` in
+ *Sun\ C*) # Sun C 5.9
+ whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
+ tmp_sharedflag='-G' ;;
+ *Sun\ F*) # Sun Fortran 8.3
+ tmp_sharedflag='-G' ;;
+ *)
+ tmp_sharedflag='-shared' ;;
+ esac
+ archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+
+ if test $supports_anon_versioning = yes; then
+ archive_expsym_cmds='$echo "{ global:" > $output_objdir/$libname.ver~
+ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+ $echo "local: *; };" >> $output_objdir/$libname.ver~
+ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+ fi
+ else
+ ld_shlibs=no
+ fi
+ ;;
+
+ netbsd*)
+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+ archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+ wlarc=
+ else
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ fi
+ ;;
+
+ solaris*)
+ if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then
+ ld_shlibs=no
+ cat <<EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems. Therefore, libtool
+*** is disabling shared libraries support. We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer. Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+EOF
+ elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ else
+ ld_shlibs=no
+ fi
+ ;;
+
+ sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+ case `$LD -v 2>&1` in
+ *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
+ ld_shlibs=no
+ cat <<_LT_EOF 1>&2
+
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
+*** reliably create shared libraries on SCO systems. Therefore, libtool
+*** is disabling shared libraries support. We urge you to upgrade GNU
+*** binutils to release 2.16.91.0.3 or newer. Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+ ;;
+ *)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`'
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib'
+ archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib'
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ esac
+ ;;
+
+ sunos4*)
+ archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ wlarc=
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ *)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ esac
+
+ if test "$ld_shlibs" = no; then
+ runpath_var=
+ hardcode_libdir_flag_spec=
+ export_dynamic_flag_spec=
+ whole_archive_flag_spec=
+ fi
+ else
+ # PORTME fill in a description of your system's linker (not GNU ld)
+ case $host_os in
+ aix3*)
+ allow_undefined_flag=unsupported
+ always_export_symbols=yes
+ archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+ # Note: this linker hardcodes the directories in LIBPATH if there
+ # are no directories specified by -L.
+ hardcode_minus_L=yes
+ if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
+ # Neither direct hardcoding nor static linking is supported with a
+ # broken collect2.
+ hardcode_direct=unsupported
+ fi
+ ;;
+
+ aix[4-9]*)
+ if test "$host_cpu" = ia64; then
+ # On IA64, the linker does run time linking by default, so we don't
+ # have to do anything special.
+ aix_use_runtimelinking=no
+ exp_sym_flag='-Bexport'
+ no_entry_flag=""
+ else
+ # If we're using GNU nm, then we don't want the "-C" option.
+ # -C means demangle to AIX nm, but means don't demangle with GNU nm
+ if $NM -V 2>&1 | grep 'GNU' > /dev/null; then
+ export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols'
+ else
+ export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols'
+ fi
+ aix_use_runtimelinking=no
+
+ # Test if we are trying to use run time linking or normal
+ # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+ # need to do runtime linking.
+ case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
+ for ld_flag in $LDFLAGS; do
+ if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+ aix_use_runtimelinking=yes
+ break
+ fi
+ done
+ ;;
+ esac
+
+ exp_sym_flag='-bexport'
+ no_entry_flag='-bnoentry'
+ fi
+
+ # When large executables or shared objects are built, AIX ld can
+ # have problems creating the table of contents. If linking a library
+ # or program results in "error TOC overflow" add -mminimal-toc to
+ # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not
+ # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+ archive_cmds=''
+ hardcode_direct=yes
+ hardcode_libdir_separator=':'
+ link_all_deplibs=yes
+
+ if test "$GCC" = yes; then
+ case $host_os in aix4.[012]|aix4.[012].*)
+ # We only want to do this on AIX 4.2 and lower, the check
+ # below for broken collect2 doesn't work under 4.3+
+ collect2name=`${CC} -print-prog-name=collect2`
+ if test -f "$collect2name" && \
+ strings "$collect2name" | grep resolve_lib_name >/dev/null
+ then
+ # We have reworked collect2
+ :
+ else
+ # We have old collect2
+ hardcode_direct=unsupported
+ # It fails to find uninstalled libraries when the uninstalled
+ # path is not listed in the libpath. Setting hardcode_minus_L
+ # to unsupported forces relinking
+ hardcode_minus_L=yes
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_libdir_separator=
+ fi
+ ;;
+ esac
+ shared_flag='-shared'
+ if test "$aix_use_runtimelinking" = yes; then
+ shared_flag="$shared_flag "'${wl}-G'
+ fi
+ else
+ # not using gcc
+ if test "$host_cpu" = ia64; then
+ # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+ # chokes on -Wl,-G. The following line is correct:
+ shared_flag='-G'
+ else
+ if test "$aix_use_runtimelinking" = yes; then
+ shared_flag='${wl}-G'
+ else
+ shared_flag='${wl}-bM:SRE'
+ fi
+ fi
+ fi
+
+ # It seems that -bexpall does not export symbols beginning with
+ # underscore (_), so it is better to generate a list of symbols to export.
+ always_export_symbols=yes
+ if test "$aix_use_runtimelinking" = yes; then
+ # Warning - without using the other runtime loading flags (-brtl),
+ # -berok will link without error, but may produce a broken library.
+ allow_undefined_flag='-berok'
+ # Determine the default libpath from the value encoded in an empty executable.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext && {
+ test "$cross_compiling" = yes ||
+ $as_test_x conftest$ac_exeext
+ }; then
+
+lt_aix_libpath_sed='
+ /Import File Strings/,/^$/ {
+ /^0/ {
+ s/^0 *\(.*\)$/\1/
+ p
+ }
+ }'
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then
+ aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+fi
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -rf conftest.dSYM
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+ conftest$ac_exeext conftest.$ac_ext
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+
+ hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+ archive_expsym_cmds="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+ else
+ if test "$host_cpu" = ia64; then
+ hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
+ allow_undefined_flag="-z nodefs"
+ archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+ else
+ # Determine the default libpath from the value encoded in an empty executable.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext && {
+ test "$cross_compiling" = yes ||
+ $as_test_x conftest$ac_exeext
+ }; then
+
+lt_aix_libpath_sed='
+ /Import File Strings/,/^$/ {
+ /^0/ {
+ s/^0 *\(.*\)$/\1/
+ p
+ }
+ }'
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then
+ aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+fi
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -rf conftest.dSYM
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+ conftest$ac_exeext conftest.$ac_ext
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+
+ hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+ # Warning - without using the other run time loading flags,
+ # -berok will link without error, but may produce a broken library.
+ no_undefined_flag=' ${wl}-bernotok'
+ allow_undefined_flag=' ${wl}-berok'
+ # Exported symbols can be pulled into shared objects from archives
+ whole_archive_flag_spec='$convenience'
+ archive_cmds_need_lc=yes
+ # This is similar to how AIX traditionally builds its shared libraries.
+ archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+ fi
+ fi
+ ;;
+
+ amigaos*)
+ archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+ # see comment about different semantics on the GNU ld section
+ ld_shlibs=no
+ ;;
+
+ bsdi[45]*)
+ export_dynamic_flag_spec=-rdynamic
+ ;;
+
+ cygwin* | mingw* | pw32*)
+ # When not using gcc, we currently assume that we are using
+ # Microsoft Visual C++.
+ # hardcode_libdir_flag_spec is actually meaningless, as there is
+ # no search path for DLLs.
+ hardcode_libdir_flag_spec=' '
+ allow_undefined_flag=unsupported
+ # Tell ltmain to make .lib files, not .a files.
+ libext=lib
+ # Tell ltmain to make .dll files, not .so files.
+ shrext_cmds=".dll"
+ # FIXME: Setting linknames here is a bad hack.
+ archive_cmds='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames='
+ # The linker will automatically build a .lib file if we build a DLL.
+ old_archive_From_new_cmds='true'
+ # FIXME: Should let the user specify the lib program.
+ old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs'
+ fix_srcfile_path='`cygpath -w "$srcfile"`'
+ enable_shared_with_static_runtimes=yes
+ ;;
+
+ darwin* | rhapsody*)
+ case $host_os in
+ rhapsody* | darwin1.[012])
+ allow_undefined_flag='${wl}-undefined ${wl}suppress'
+ ;;
+ *) # Darwin 1.3 on
+ if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then
+ allow_undefined_flag='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
+ else
+ case ${MACOSX_DEPLOYMENT_TARGET} in
+ 10.[012])
+ allow_undefined_flag='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
+ ;;
+ 10.*)
+ allow_undefined_flag='${wl}-undefined ${wl}dynamic_lookup'
+ ;;
+ esac
+ fi
+ ;;
+ esac
+ archive_cmds_need_lc=no
+ hardcode_direct=no
+ hardcode_automatic=yes
+ hardcode_shlibpath_var=unsupported
+ whole_archive_flag_spec=''
+ link_all_deplibs=yes
+ if test "$GCC" = yes ; then
+ output_verbose_link_cmd='echo'
+ archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
+ module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
+ archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
+ module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
+ else
+ case $cc_basename in
+ xlc*)
+ output_verbose_link_cmd='echo'
+ archive_cmds='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $xlcverstring'
+ module_cmds='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
+ archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $xlcverstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ module_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ ;;
+ *)
+ ld_shlibs=no
+ ;;
+ esac
+ fi
+ ;;
+
+ dgux*)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_shlibpath_var=no
+ ;;
+
+ freebsd1*)
+ ld_shlibs=no
+ ;;
+
+ # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+ # support. Future versions do this automatically, but an explicit c++rt0.o
+ # does not break anything, and helps significantly (at the cost of a little
+ # extra space).
+ freebsd2.2*)
+ archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+ freebsd2*)
+ archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct=yes
+ hardcode_minus_L=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+ freebsd* | dragonfly*)
+ archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ hpux9*)
+ if test "$GCC" = yes; then
+ archive_cmds='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+ else
+ archive_cmds='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+ fi
+ hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+ hardcode_libdir_separator=:
+ hardcode_direct=yes
+
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L=yes
+ export_dynamic_flag_spec='${wl}-E'
+ ;;
+
+ hpux10*)
+ if test "$GCC" = yes -a "$with_gnu_ld" = no; then
+ archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+ fi
+ if test "$with_gnu_ld" = no; then
+ hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+ hardcode_libdir_separator=:
+
+ hardcode_direct=yes
+ export_dynamic_flag_spec='${wl}-E'
+
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L=yes
+ fi
+ ;;
+
+ hpux11*)
+ if test "$GCC" = yes -a "$with_gnu_ld" = no; then
+ case $host_cpu in
+ hppa*64*)
+ archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ ia64*)
+ archive_cmds='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+ archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ esac
+ else
+ case $host_cpu in
+ hppa*64*)
+ archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ ia64*)
+ archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+ archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ esac
+ fi
+ if test "$with_gnu_ld" = no; then
+ hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+ hardcode_libdir_separator=:
+
+ case $host_cpu in
+ hppa*64*|ia64*)
+ hardcode_libdir_flag_spec_ld='+b $libdir'
+ hardcode_direct=no
+ hardcode_shlibpath_var=no
+ ;;
+ *)
+ hardcode_direct=yes
+ export_dynamic_flag_spec='${wl}-E'
+
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L=yes
+ ;;
+ esac
+ fi
+ ;;
+
+ irix5* | irix6* | nonstopux*)
+ if test "$GCC" = yes; then
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ else
+ archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+ hardcode_libdir_flag_spec_ld='-rpath $libdir'
+ fi
+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator=:
+ link_all_deplibs=yes
+ ;;
+
+ netbsd*)
+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+ archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out
+ else
+ archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF
+ fi
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ newsos6)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct=yes
+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator=:
+ hardcode_shlibpath_var=no
+ ;;
+
+ openbsd*)
+ if test -f /usr/libexec/ld.so; then
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+ archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
+ hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+ export_dynamic_flag_spec='${wl}-E'
+ else
+ case $host_os in
+ openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
+ archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_libdir_flag_spec='-R$libdir'
+ ;;
+ *)
+ archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+ ;;
+ esac
+ fi
+ else
+ ld_shlibs=no
+ fi
+ ;;
+
+ os2*)
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+ allow_undefined_flag=unsupported
+ archive_cmds='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
+ old_archive_From_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+ ;;
+
+ osf3*)
+ if test "$GCC" = yes; then
+ allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
+ archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ else
+ allow_undefined_flag=' -expect_unresolved \*'
+ archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+ fi
+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator=:
+ ;;
+
+ osf4* | osf5*) # as osf3* with the addition of -msym flag
+ if test "$GCC" = yes; then
+ allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
+ archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ else
+ allow_undefined_flag=' -expect_unresolved \*'
+ archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+ archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~
+ $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp'
+
+ # Both c and cxx compiler support -rpath directly
+ hardcode_libdir_flag_spec='-rpath $libdir'
+ fi
+ hardcode_libdir_separator=:
+ ;;
+
+ solaris*)
+ no_undefined_flag=' -z text'
+ if test "$GCC" = yes; then
+ wlarc='${wl}'
+ archive_cmds='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+ $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp'
+ else
+ wlarc=''
+ archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp'
+ fi
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_shlibpath_var=no
+ case $host_os in
+ solaris2.[0-5] | solaris2.[0-5].*) ;;
+ *)
+ # The compiler driver will combine and reorder linker options,
+ # but understands `-z linker_flag'. GCC discards it without `$wl',
+ # but is careful enough not to reorder.
+ # Supported since Solaris 2.6 (maybe 2.5.1?)
+ if test "$GCC" = yes; then
+ whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+ else
+ whole_archive_flag_spec='-z allextract$convenience -z defaultextract'
+ fi
+ ;;
+ esac
+ link_all_deplibs=yes
+ ;;
+
+ sunos4*)
+ if test "x$host_vendor" = xsequent; then
+ # Use $CC to link under sequent, because it throws in some extra .o
+ # files that make .init and .fini sections work.
+ archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+ fi
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_direct=yes
+ hardcode_minus_L=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ sysv4)
+ case $host_vendor in
+ sni)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct=yes # is this really true???
+ ;;
+ siemens)
+ ## LD is ld it makes a PLAMLIB
+ ## CC just makes a GrossModule.
+ archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+ reload_cmds='$CC -r -o $output$reload_objs'
+ hardcode_direct=no
+ ;;
+ motorola)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct=no #Motorola manual says yes, but my tests say they lie
+ ;;
+ esac
+ runpath_var='LD_RUN_PATH'
+ hardcode_shlibpath_var=no
+ ;;
+
+ sysv4.3*)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_shlibpath_var=no
+ export_dynamic_flag_spec='-Bexport'
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_shlibpath_var=no
+ runpath_var=LD_RUN_PATH
+ hardcode_runpath_var=yes
+ ld_shlibs=yes
+ fi
+ ;;
+
+ sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
+ no_undefined_flag='${wl}-z,text'
+ archive_cmds_need_lc=no
+ hardcode_shlibpath_var=no
+ runpath_var='LD_RUN_PATH'
+
+ if test "$GCC" = yes; then
+ archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ fi
+ ;;
+
+ sysv5* | sco3.2v5* | sco5v6*)
+ # Note: We can NOT use -z defs as we might desire, because we do not
+ # link with -lc, and that would cause any symbols used from libc to
+ # always be unresolved, which means just about no library would
+ # ever link correctly. If we're not using GNU ld we use -z text
+ # though, which does catch some bad symbols but isn't as heavy-handed
+ # as -z defs.
+ no_undefined_flag='${wl}-z,text'
+ allow_undefined_flag='${wl}-z,nodefs'
+ archive_cmds_need_lc=no
+ hardcode_shlibpath_var=no
+ hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`'
+ hardcode_libdir_separator=':'
+ link_all_deplibs=yes
+ export_dynamic_flag_spec='${wl}-Bexport'
+ runpath_var='LD_RUN_PATH'
+
+ if test "$GCC" = yes; then
+ archive_cmds='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ fi
+ ;;
+
+ uts4*)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_shlibpath_var=no
+ ;;
+
+ *)
+ ld_shlibs=no
+ ;;
+ esac
+ fi
+
+{ $as_echo "$as_me:$LINENO: result: $ld_shlibs" >&5
+$as_echo "$ld_shlibs" >&6; }
+test "$ld_shlibs" = no && can_build_shared=no
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$archive_cmds_need_lc" in
+x|xyes)
+ # Assume -lc should be added
+ archive_cmds_need_lc=yes
+
+ if test "$enable_shared" = yes && test "$GCC" = yes; then
+ case $archive_cmds in
+ *'~'*)
+ # FIXME: we may have to deal with multi-command sequences.
+ ;;
+ '$CC '*)
+ # Test whether the compiler implicitly links with -lc since on some
+ # systems, -lgcc has to come before -lc. If gcc already passes -lc
+ # to ld, don't add -lc before -lgcc.
+ { $as_echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5
+$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; }
+ $rm conftest*
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } 2>conftest.err; then
+ soname=conftest
+ lib=conftest
+ libobjs=conftest.$ac_objext
+ deplibs=
+ wl=$lt_prog_compiler_wl
+ pic_flag=$lt_prog_compiler_pic
+ compiler_flags=-v
+ linker_flags=-v
+ verstring=
+ output_objdir=.
+ libname=conftest
+ lt_save_allow_undefined_flag=$allow_undefined_flag
+ allow_undefined_flag=
+ if { (eval echo "$as_me:$LINENO: \"$archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5
+ (eval $archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+ then
+ archive_cmds_need_lc=no
+ else
+ archive_cmds_need_lc=yes
+ fi
+ allow_undefined_flag=$lt_save_allow_undefined_flag
+ else
+ cat conftest.err 1>&5
+ fi
+ $rm conftest*
+ { $as_echo "$as_me:$LINENO: result: $archive_cmds_need_lc" >&5
+$as_echo "$archive_cmds_need_lc" >&6; }
+ ;;
+ esac
+ fi
+ ;;
+esac
+
+{ $as_echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5
+$as_echo_n "checking dynamic linker characteristics... " >&6; }
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=".so"
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+
+if test "$GCC" = yes; then
+ case $host_os in
+ darwin*) lt_awk_arg="/^libraries:/,/LR/" ;;
+ *) lt_awk_arg="/^libraries:/" ;;
+ esac
+ lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+ if echo "$lt_search_path_spec" | grep ';' >/dev/null ; then
+ # if the path contains ";" then we assume it to be the separator
+ # otherwise default to the standard path separator (i.e. ":") - it is
+ # assumed that no part of a normal pathname contains ";" but that should
+ # okay in the real world where ";" in dirpaths is itself problematic.
+ lt_search_path_spec=`echo "$lt_search_path_spec" | $SED -e 's/;/ /g'`
+ else
+ lt_search_path_spec=`echo "$lt_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+ fi
+ # Ok, now we have the path, separated by spaces, we can step through it
+ # and add multilib dir if necessary.
+ lt_tmp_lt_search_path_spec=
+ lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
+ for lt_sys_path in $lt_search_path_spec; do
+ if test -d "$lt_sys_path/$lt_multi_os_dir"; then
+ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir"
+ else
+ test -d "$lt_sys_path" && \
+ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
+ fi
+ done
+ lt_search_path_spec=`echo $lt_tmp_lt_search_path_spec | awk '
+BEGIN {RS=" "; FS="/|\n";} {
+ lt_foo="";
+ lt_count=0;
+ for (lt_i = NF; lt_i > 0; lt_i--) {
+ if ($lt_i != "" && $lt_i != ".") {
+ if ($lt_i == "..") {
+ lt_count++;
+ } else {
+ if (lt_count == 0) {
+ lt_foo="/" $lt_i lt_foo;
+ } else {
+ lt_count--;
+ }
+ }
+ }
+ }
+ if (lt_foo != "") { lt_freq[lt_foo]++; }
+ if (lt_freq[lt_foo] == 1) { print lt_foo; }
+}'`
+ sys_lib_search_path_spec=`echo $lt_search_path_spec`
+else
+ sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+case $host_os in
+aix3*)
+ version_type=linux
+ library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+ shlibpath_var=LIBPATH
+
+ # AIX 3 has no versioning support, so we append a major version to the name.
+ soname_spec='${libname}${release}${shared_ext}$major'
+ ;;
+
+aix[4-9]*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ hardcode_into_libs=yes
+ if test "$host_cpu" = ia64; then
+ # AIX 5 supports IA64
+ library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+ shlibpath_var=LD_LIBRARY_PATH
+ else
+ # With GCC up to 2.95.x, collect2 would create an import file
+ # for dependence libraries. The import file would start with
+ # the line `#! .'. This would cause the generated library to
+ # depend on `.', always an invalid library. This was fixed in
+ # development snapshots of GCC prior to 3.0.
+ case $host_os in
+ aix4 | aix4.[01] | aix4.[01].*)
+ if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+ echo ' yes '
+ echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then
+ :
+ else
+ can_build_shared=no
+ fi
+ ;;
+ esac
+ # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+ # soname into executable. Probably we can add versioning support to
+ # collect2, so additional links can be useful in future.
+ if test "$aix_use_runtimelinking" = yes; then
+ # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+ # instead of lib<name>.a to let people know that these are not
+ # typical AIX shared libraries.
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ else
+ # We preserve .a as extension for shared libraries through AIX4.2
+ # and later when we are not doing run time linking.
+ library_names_spec='${libname}${release}.a $libname.a'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ fi
+ shlibpath_var=LIBPATH
+ fi
+ ;;
+
+amigaos*)
+ library_names_spec='$libname.ixlibrary $libname.a'
+ # Create ${libname}_ixlibrary.a entries in /sys/libs.
+ finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+ ;;
+
+beos*)
+ library_names_spec='${libname}${shared_ext}'
+ dynamic_linker="$host_os ld.so"
+ shlibpath_var=LIBRARY_PATH
+ ;;
+
+bsdi[45]*)
+ version_type=linux
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+ sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+ # the default ld.so.conf also contains /usr/contrib/lib and
+ # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+ # libtool to hard-code these into programs
+ ;;
+
+cygwin* | mingw* | pw32*)
+ version_type=windows
+ shrext_cmds=".dll"
+ need_version=no
+ need_lib_prefix=no
+
+ case $GCC,$host_os in
+ yes,cygwin* | yes,mingw* | yes,pw32*)
+ library_names_spec='$libname.dll.a'
+ # DLL is installed to $(libdir)/../bin by postinstall_cmds
+ postinstall_cmds='base_file=`basename \${file}`~
+ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~
+ dldir=$destdir/`dirname \$dlpath`~
+ test -d \$dldir || mkdir -p \$dldir~
+ $install_prog $dir/$dlname \$dldir/$dlname~
+ chmod a+x \$dldir/$dlname'
+ postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+ dlpath=$dir/\$dldll~
+ $rm \$dlpath'
+ shlibpath_overrides_runpath=yes
+
+ case $host_os in
+ cygwin*)
+ # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+ soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+ sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib"
+ ;;
+ mingw*)
+ # MinGW DLLs use traditional 'lib' prefix
+ soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+ sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+ if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then
+ # It is most probably a Windows format PATH printed by
+ # mingw gcc, but we are running on Cygwin. Gcc prints its search
+ # path with ; separators, and with drive letters. We can handle the
+ # drive letters (cygwin fileutils understands them), so leave them,
+ # especially as we might pass files found there to a mingw objdump,
+ # which wouldn't understand a cygwinified path. Ahh.
+ sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+ else
+ sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+ fi
+ ;;
+ pw32*)
+ # pw32 DLLs use 'pw' prefix rather than 'lib'
+ library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+ ;;
+ esac
+ ;;
+
+ *)
+ library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
+ ;;
+ esac
+ dynamic_linker='Win32 ld.exe'
+ # FIXME: first we should search . and the directory the executable is in
+ shlibpath_var=PATH
+ ;;
+
+darwin* | rhapsody*)
+ dynamic_linker="$host_os dyld"
+ version_type=darwin
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext'
+ soname_spec='${libname}${release}${major}$shared_ext'
+ shlibpath_overrides_runpath=yes
+ shlibpath_var=DYLD_LIBRARY_PATH
+ shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+
+ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"
+ sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+ ;;
+
+dgux*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+freebsd1*)
+ dynamic_linker=no
+ ;;
+
+freebsd* | dragonfly*)
+ # DragonFly does not have aout. When/if they implement a new
+ # versioning mechanism, adjust this.
+ if test -x /usr/bin/objformat; then
+ objformat=`/usr/bin/objformat`
+ else
+ case $host_os in
+ freebsd[123]*) objformat=aout ;;
+ *) objformat=elf ;;
+ esac
+ fi
+ version_type=freebsd-$objformat
+ case $version_type in
+ freebsd-elf*)
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+ need_version=no
+ need_lib_prefix=no
+ ;;
+ freebsd-*)
+ library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+ need_version=yes
+ ;;
+ esac
+ shlibpath_var=LD_LIBRARY_PATH
+ case $host_os in
+ freebsd2*)
+ shlibpath_overrides_runpath=yes
+ ;;
+ freebsd3.[01]* | freebsdelf3.[01]*)
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+ freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
+ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+ *) # from 4.6 on, and DragonFly
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+ esac
+ ;;
+
+gnu*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ hardcode_into_libs=yes
+ ;;
+
+hpux9* | hpux10* | hpux11*)
+ # Give a soname corresponding to the major version so that dld.sl refuses to
+ # link against other versions.
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=no
+ case $host_cpu in
+ ia64*)
+ shrext_cmds='.so'
+ hardcode_into_libs=yes
+ dynamic_linker="$host_os dld.so"
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ if test "X$HPUX_IA64_MODE" = X32; then
+ sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+ else
+ sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+ fi
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ ;;
+ hppa*64*)
+ shrext_cmds='.sl'
+ hardcode_into_libs=yes
+ dynamic_linker="$host_os dld.sl"
+ shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ ;;
+ *)
+ shrext_cmds='.sl'
+ dynamic_linker="$host_os dld.sl"
+ shlibpath_var=SHLIB_PATH
+ shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ ;;
+ esac
+ # HP-UX runs *really* slowly unless shared libraries are mode 555.
+ postinstall_cmds='chmod 555 $lib'
+ ;;
+
+interix[3-9]*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+
+irix5* | irix6* | nonstopux*)
+ case $host_os in
+ nonstopux*) version_type=nonstopux ;;
+ *)
+ if test "$lt_cv_prog_gnu_ld" = yes; then
+ version_type=linux
+ else
+ version_type=irix
+ fi ;;
+ esac
+ need_lib_prefix=no
+ need_version=no
+ soname_spec='${libname}${release}${shared_ext}$major'
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+ case $host_os in
+ irix5* | nonstopux*)
+ libsuff= shlibsuff=
+ ;;
+ *)
+ case $LD in # libtool.m4 will add one of these switches to LD
+ *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+ libsuff= shlibsuff= libmagic=32-bit;;
+ *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+ libsuff=32 shlibsuff=N32 libmagic=N32;;
+ *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+ libsuff=64 shlibsuff=64 libmagic=64-bit;;
+ *) libsuff= shlibsuff= libmagic=never-match;;
+ esac
+ ;;
+ esac
+ shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+ shlibpath_overrides_runpath=no
+ sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+ sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+ hardcode_into_libs=yes
+ ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+ dynamic_linker=no
+ ;;
+
+# This must be Linux ELF.
+linux* | k*bsd*-gnu)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ # This implies no fast_install, which is unacceptable.
+ # Some rework will be needed to allow for fast_install
+ # before this can be enabled.
+ hardcode_into_libs=yes
+ sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+ sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+
+ # Append ld.so.conf contents to the search path
+ if test -f /etc/ld.so.conf; then
+ lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '`
+ sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra"
+ fi
+
+ # We used to test for /lib/ld.so.1 and disable shared libraries on
+ # powerpc, because MkLinux only supported shared libraries with the
+ # GNU dynamic linker. Since this was broken with cross compilers,
+ # most powerpc-linux boxes support dynamic linking these days and
+ # people can always --disable-shared, the test was removed, and we
+ # assume the GNU/Linux dynamic linker is in use.
+ dynamic_linker='GNU/Linux ld.so'
+ ;;
+
+netbsd*)
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=no
+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+ dynamic_linker='NetBSD (a.out) ld.so'
+ else
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ dynamic_linker='NetBSD ld.elf_so'
+ fi
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+
+newsos6)
+ version_type=linux
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ ;;
+
+nto-qnx*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ ;;
+
+openbsd*)
+ version_type=sunos
+ sys_lib_dlsearch_path_spec="/usr/lib"
+ need_lib_prefix=no
+ # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
+ case $host_os in
+ openbsd3.3 | openbsd3.3.*) need_version=yes ;;
+ *) need_version=no ;;
+ esac
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+ case $host_os in
+ openbsd2.[89] | openbsd2.[89].*)
+ shlibpath_overrides_runpath=no
+ ;;
+ *)
+ shlibpath_overrides_runpath=yes
+ ;;
+ esac
+ else
+ shlibpath_overrides_runpath=yes
+ fi
+ ;;
+
+os2*)
+ libname_spec='$name'
+ shrext_cmds=".dll"
+ need_lib_prefix=no
+ library_names_spec='$libname${shared_ext} $libname.a'
+ dynamic_linker='OS/2 ld.exe'
+ shlibpath_var=LIBPATH
+ ;;
+
+osf3* | osf4* | osf5*)
+ version_type=osf
+ need_lib_prefix=no
+ need_version=no
+ soname_spec='${libname}${release}${shared_ext}$major'
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ shlibpath_var=LD_LIBRARY_PATH
+ sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+ sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+ ;;
+
+rdos*)
+ dynamic_linker=no
+ ;;
+
+solaris*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ # ldd complains unless libraries are executable
+ postinstall_cmds='chmod +x $lib'
+ ;;
+
+sunos4*)
+ version_type=sunos
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+ finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ if test "$with_gnu_ld" = yes; then
+ need_lib_prefix=no
+ fi
+ need_version=yes
+ ;;
+
+sysv4 | sysv4.3*)
+ version_type=linux
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ case $host_vendor in
+ sni)
+ shlibpath_overrides_runpath=no
+ need_lib_prefix=no
+ export_dynamic_flag_spec='${wl}-Blargedynsym'
+ runpath_var=LD_RUN_PATH
+ ;;
+ siemens)
+ need_lib_prefix=no
+ ;;
+ motorola)
+ need_lib_prefix=no
+ need_version=no
+ shlibpath_overrides_runpath=no
+ sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+ ;;
+ esac
+ ;;
+
+sysv4*MP*)
+ if test -d /usr/nec ;then
+ version_type=linux
+ library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
+ soname_spec='$libname${shared_ext}.$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ fi
+ ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+ version_type=freebsd-elf
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ hardcode_into_libs=yes
+ if test "$with_gnu_ld" = yes; then
+ sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+ shlibpath_overrides_runpath=no
+ else
+ sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+ shlibpath_overrides_runpath=yes
+ case $host_os in
+ sco3.2v5*)
+ sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+ ;;
+ esac
+ fi
+ sys_lib_dlsearch_path_spec='/usr/lib'
+ ;;
+
+uts4*)
+ version_type=linux
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+*)
+ dynamic_linker=no
+ ;;
+esac
+{ $as_echo "$as_me:$LINENO: result: $dynamic_linker" >&5
+$as_echo "$dynamic_linker" >&6; }
+test "$dynamic_linker" = no && can_build_shared=no
+
+if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_sys_lib_search_path_spec="$sys_lib_search_path_spec"
+fi
+
+sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
+if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec"
+fi
+
+sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test "$GCC" = yes; then
+ variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+{ $as_echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5
+$as_echo_n "checking how to hardcode library paths into programs... " >&6; }
+hardcode_action=
+if test -n "$hardcode_libdir_flag_spec" || \
+ test -n "$runpath_var" || \
+ test "X$hardcode_automatic" = "Xyes" ; then
+
+ # We can hardcode non-existant directories.
+ if test "$hardcode_direct" != no &&
+ # If the only mechanism to avoid hardcoding is shlibpath_var, we
+ # have to relink, otherwise we might link with an installed library
+ # when we should be linking with a yet-to-be-installed one
+ ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, )" != no &&
+ test "$hardcode_minus_L" != no; then
+ # Linking always hardcodes the temporary library directory.
+ hardcode_action=relink
+ else
+ # We can link without hardcoding, and we can hardcode nonexisting dirs.
+ hardcode_action=immediate
+ fi
+else
+ # We cannot hardcode anything, or else we can only hardcode existing
+ # directories.
+ hardcode_action=unsupported
+fi
+{ $as_echo "$as_me:$LINENO: result: $hardcode_action" >&5
+$as_echo "$hardcode_action" >&6; }
+
+if test "$hardcode_action" = relink; then
+ # Fast installation is not supported
+ enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+ test "$enable_shared" = no; then
+ # Fast installation is not necessary
+ enable_fast_install=needless
+fi
+
+striplib=
+old_striplib=
+{ $as_echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5
+$as_echo_n "checking whether stripping libraries is possible... " >&6; }
+if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then
+ test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
+ test -z "$striplib" && striplib="$STRIP --strip-unneeded"
+ { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+# FIXME - insert some real tests, host_os isn't really good enough
+ case $host_os in
+ darwin*)
+ if test -n "$STRIP" ; then
+ striplib="$STRIP -x"
+ old_striplib="$STRIP -S"
+ { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+ else
+ { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+ ;;
+ *)
+ { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+ ;;
+ esac
+fi
+
+if test "x$enable_dlopen" != xyes; then
+ enable_dlopen=unknown
+ enable_dlopen_self=unknown
+ enable_dlopen_self_static=unknown
+else
+ lt_cv_dlopen=no
+ lt_cv_dlopen_libs=
+
+ case $host_os in
+ beos*)
+ lt_cv_dlopen="load_add_on"
+ lt_cv_dlopen_libs=
+ lt_cv_dlopen_self=yes
+ ;;
+
+ mingw* | pw32*)
+ lt_cv_dlopen="LoadLibrary"
+ lt_cv_dlopen_libs=
+ ;;
+
+ cygwin*)
+ lt_cv_dlopen="dlopen"
+ lt_cv_dlopen_libs=
+ ;;
+
+ darwin*)
+ # if libdl is installed we need to link against it
+ { $as_echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5
+$as_echo_n "checking for dlopen in -ldl... " >&6; }
+if test "${ac_cv_lib_dl_dlopen+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+int
+main ()
+{
+return dlopen ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext && {
+ test "$cross_compiling" = yes ||
+ $as_test_x conftest$ac_exeext
+ }; then
+ ac_cv_lib_dl_dlopen=yes
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_lib_dl_dlopen=no
+fi
+
+rm -rf conftest.dSYM
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5
+$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
+if test "x$ac_cv_lib_dl_dlopen" = x""yes; then
+ lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
+else
+
+ lt_cv_dlopen="dyld"
+ lt_cv_dlopen_libs=
+ lt_cv_dlopen_self=yes
+
+fi
+
+ ;;
+
+ *)
+ { $as_echo "$as_me:$LINENO: checking for shl_load" >&5
+$as_echo_n "checking for shl_load... " >&6; }
+if test "${ac_cv_func_shl_load+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define shl_load to an innocuous variant, in case <limits.h> declares shl_load.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define shl_load innocuous_shl_load
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char shl_load (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef shl_load
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char shl_load ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined __stub_shl_load || defined __stub___shl_load
+choke me
+#endif
+
+int
+main ()
+{
+return shl_load ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext && {
+ test "$cross_compiling" = yes ||
+ $as_test_x conftest$ac_exeext
+ }; then
+ ac_cv_func_shl_load=yes
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_func_shl_load=no
+fi
+
+rm -rf conftest.dSYM
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5
+$as_echo "$ac_cv_func_shl_load" >&6; }
+if test "x$ac_cv_func_shl_load" = x""yes; then
+ lt_cv_dlopen="shl_load"
+else
+ { $as_echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5
+$as_echo_n "checking for shl_load in -ldld... " >&6; }
+if test "${ac_cv_lib_dld_shl_load+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char shl_load ();
+int
+main ()
+{
+return shl_load ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext && {
+ test "$cross_compiling" = yes ||
+ $as_test_x conftest$ac_exeext
+ }; then
+ ac_cv_lib_dld_shl_load=yes
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_lib_dld_shl_load=no
+fi
+
+rm -rf conftest.dSYM
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5
+$as_echo "$ac_cv_lib_dld_shl_load" >&6; }
+if test "x$ac_cv_lib_dld_shl_load" = x""yes; then
+ lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"
+else
+ { $as_echo "$as_me:$LINENO: checking for dlopen" >&5
+$as_echo_n "checking for dlopen... " >&6; }
+if test "${ac_cv_func_dlopen+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define dlopen to an innocuous variant, in case <limits.h> declares dlopen.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define dlopen innocuous_dlopen
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char dlopen (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef dlopen
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined __stub_dlopen || defined __stub___dlopen
+choke me
+#endif
+
+int
+main ()
+{
+return dlopen ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext && {
+ test "$cross_compiling" = yes ||
+ $as_test_x conftest$ac_exeext
+ }; then
+ ac_cv_func_dlopen=yes
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_func_dlopen=no
+fi
+
+rm -rf conftest.dSYM
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5
+$as_echo "$ac_cv_func_dlopen" >&6; }
+if test "x$ac_cv_func_dlopen" = x""yes; then
+ lt_cv_dlopen="dlopen"
+else
+ { $as_echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5
+$as_echo_n "checking for dlopen in -ldl... " >&6; }
+if test "${ac_cv_lib_dl_dlopen+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+int
+main ()
+{
+return dlopen ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext && {
+ test "$cross_compiling" = yes ||
+ $as_test_x conftest$ac_exeext
+ }; then
+ ac_cv_lib_dl_dlopen=yes
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_lib_dl_dlopen=no
+fi
+
+rm -rf conftest.dSYM
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5
+$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
+if test "x$ac_cv_lib_dl_dlopen" = x""yes; then
+ lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
+else
+ { $as_echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5
+$as_echo_n "checking for dlopen in -lsvld... " >&6; }
+if test "${ac_cv_lib_svld_dlopen+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsvld $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+int
+main ()
+{
+return dlopen ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext && {
+ test "$cross_compiling" = yes ||
+ $as_test_x conftest$ac_exeext
+ }; then
+ ac_cv_lib_svld_dlopen=yes
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_lib_svld_dlopen=no
+fi
+
+rm -rf conftest.dSYM
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5
+$as_echo "$ac_cv_lib_svld_dlopen" >&6; }
+if test "x$ac_cv_lib_svld_dlopen" = x""yes; then
+ lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"
+else
+ { $as_echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5
+$as_echo_n "checking for dld_link in -ldld... " >&6; }
+if test "${ac_cv_lib_dld_dld_link+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dld_link ();
+int
+main ()
+{
+return dld_link ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext && {
+ test "$cross_compiling" = yes ||
+ $as_test_x conftest$ac_exeext
+ }; then
+ ac_cv_lib_dld_dld_link=yes
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_lib_dld_dld_link=no
+fi
+
+rm -rf conftest.dSYM
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5
+$as_echo "$ac_cv_lib_dld_dld_link" >&6; }
+if test "x$ac_cv_lib_dld_dld_link" = x""yes; then
+ lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+ ;;
+ esac
+
+ if test "x$lt_cv_dlopen" != xno; then
+ enable_dlopen=yes
+ else
+ enable_dlopen=no
+ fi
+
+ case $lt_cv_dlopen in
+ dlopen)
+ save_CPPFLAGS="$CPPFLAGS"
+ test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+
+ save_LDFLAGS="$LDFLAGS"
+ wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
+
+ save_LIBS="$LIBS"
+ LIBS="$lt_cv_dlopen_libs $LIBS"
+
+ { $as_echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5
+$as_echo_n "checking whether a program can dlopen itself... " >&6; }
+if test "${lt_cv_dlopen_self+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ if test "$cross_compiling" = yes; then :
+ lt_cv_dlopen_self=cross
+else
+ lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+ lt_status=$lt_dlunknown
+ cat > conftest.$ac_ext <<EOF
+#line 10664 "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+# define LT_DLGLOBAL RTLD_GLOBAL
+#else
+# ifdef DL_GLOBAL
+# define LT_DLGLOBAL DL_GLOBAL
+# else
+# define LT_DLGLOBAL 0
+# endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+ find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+# ifdef RTLD_LAZY
+# define LT_DLLAZY_OR_NOW RTLD_LAZY
+# else
+# ifdef DL_LAZY
+# define LT_DLLAZY_OR_NOW DL_LAZY
+# else
+# ifdef RTLD_NOW
+# define LT_DLLAZY_OR_NOW RTLD_NOW
+# else
+# ifdef DL_NOW
+# define LT_DLLAZY_OR_NOW DL_NOW
+# else
+# define LT_DLLAZY_OR_NOW 0
+# endif
+# endif
+# endif
+# endif
+#endif
+
+#ifdef __cplusplus
+extern "C" void exit (int);
+#endif
+
+void fnord() { int i=42;}
+int main ()
+{
+ void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+ int status = $lt_dlunknown;
+
+ if (self)
+ {
+ if (dlsym (self,"fnord")) status = $lt_dlno_uscore;
+ else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
+ /* dlclose (self); */
+ }
+ else
+ puts (dlerror ());
+
+ exit (status);
+}
+EOF
+ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then
+ (./conftest; exit; ) >&5 2>/dev/null
+ lt_status=$?
+ case x$lt_status in
+ x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;;
+ x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;;
+ x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;;
+ esac
+ else :
+ # compilation failed
+ lt_cv_dlopen_self=no
+ fi
+fi
+rm -fr conftest*
+
+
+fi
+{ $as_echo "$as_me:$LINENO: result: $lt_cv_dlopen_self" >&5
+$as_echo "$lt_cv_dlopen_self" >&6; }
+
+ if test "x$lt_cv_dlopen_self" = xyes; then
+ wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
+ { $as_echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5
+$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; }
+if test "${lt_cv_dlopen_self_static+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ if test "$cross_compiling" = yes; then :
+ lt_cv_dlopen_self_static=cross
+else
+ lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+ lt_status=$lt_dlunknown
+ cat > conftest.$ac_ext <<EOF
+#line 10764 "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+# define LT_DLGLOBAL RTLD_GLOBAL
+#else
+# ifdef DL_GLOBAL
+# define LT_DLGLOBAL DL_GLOBAL
+# else
+# define LT_DLGLOBAL 0
+# endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+ find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+# ifdef RTLD_LAZY
+# define LT_DLLAZY_OR_NOW RTLD_LAZY
+# else
+# ifdef DL_LAZY
+# define LT_DLLAZY_OR_NOW DL_LAZY
+# else
+# ifdef RTLD_NOW
+# define LT_DLLAZY_OR_NOW RTLD_NOW
+# else
+# ifdef DL_NOW
+# define LT_DLLAZY_OR_NOW DL_NOW
+# else
+# define LT_DLLAZY_OR_NOW 0
+# endif
+# endif
+# endif
+# endif
+#endif
+
+#ifdef __cplusplus
+extern "C" void exit (int);
+#endif
+
+void fnord() { int i=42;}
+int main ()
+{
+ void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+ int status = $lt_dlunknown;
+
+ if (self)
+ {
+ if (dlsym (self,"fnord")) status = $lt_dlno_uscore;
+ else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
+ /* dlclose (self); */
+ }
+ else
+ puts (dlerror ());
+
+ exit (status);
+}
+EOF
+ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then
+ (./conftest; exit; ) >&5 2>/dev/null
+ lt_status=$?
+ case x$lt_status in
+ x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;;
+ x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;;
+ x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;;
+ esac
+ else :
+ # compilation failed
+ lt_cv_dlopen_self_static=no
+ fi
+fi
+rm -fr conftest*
+
+
+fi
+{ $as_echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5
+$as_echo "$lt_cv_dlopen_self_static" >&6; }
+ fi
+
+ CPPFLAGS="$save_CPPFLAGS"
+ LDFLAGS="$save_LDFLAGS"
+ LIBS="$save_LIBS"
+ ;;
+ esac
+
+ case $lt_cv_dlopen_self in
+ yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
+ *) enable_dlopen_self=unknown ;;
+ esac
+
+ case $lt_cv_dlopen_self_static in
+ yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
+ *) enable_dlopen_self_static=unknown ;;
+ esac
+fi
+
+
+# Report which library types will actually be built
+{ $as_echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5
+$as_echo_n "checking if libtool supports shared libraries... " >&6; }
+{ $as_echo "$as_me:$LINENO: result: $can_build_shared" >&5
+$as_echo "$can_build_shared" >&6; }
+
+{ $as_echo "$as_me:$LINENO: checking whether to build shared libraries" >&5
+$as_echo_n "checking whether to build shared libraries... " >&6; }
+test "$can_build_shared" = "no" && enable_shared=no
+
+# On AIX, shared libraries and static libraries use the same namespace, and
+# are all built from PIC.
+case $host_os in
+aix3*)
+ test "$enable_shared" = yes && enable_static=no
+ if test -n "$RANLIB"; then
+ archive_cmds="$archive_cmds~\$RANLIB \$lib"
+ postinstall_cmds='$RANLIB $lib'
+ fi
+ ;;
+
+aix[4-9]*)
+ if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+ test "$enable_shared" = yes && enable_static=no
+ fi
+ ;;
+esac
+{ $as_echo "$as_me:$LINENO: result: $enable_shared" >&5
+$as_echo "$enable_shared" >&6; }
+
+{ $as_echo "$as_me:$LINENO: checking whether to build static libraries" >&5
+$as_echo_n "checking whether to build static libraries... " >&6; }
+# Make sure either enable_shared or enable_static is yes.
+test "$enable_shared" = yes || enable_static=yes
+{ $as_echo "$as_me:$LINENO: result: $enable_static" >&5
+$as_echo "$enable_static" >&6; }
+
+# The else clause should only fire when bootstrapping the
+# libtool distribution, otherwise you forgot to ship ltmain.sh
+# with your package, and you will get complaints that there are
+# no rules to generate ltmain.sh.
+if test -f "$ltmain"; then
+ # See if we are running on zsh, and set the options which allow our commands through
+ # without removal of \ escapes.
+ if test -n "${ZSH_VERSION+set}" ; then
+ setopt NO_GLOB_SUBST
+ fi
+ # Now quote all the things that may contain metacharacters while being
+ # careful not to overquote the AC_SUBSTed values. We take copies of the
+ # variables and quote the copies for generation of the libtool script.
+ for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \
+ SED SHELL STRIP \
+ libname_spec library_names_spec soname_spec extract_expsyms_cmds \
+ old_striplib striplib file_magic_cmd finish_cmds finish_eval \
+ deplibs_check_method reload_flag reload_cmds need_locks \
+ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \
+ lt_cv_sys_global_symbol_to_c_name_address \
+ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \
+ old_postinstall_cmds old_postuninstall_cmds \
+ compiler \
+ CC \
+ LD \
+ lt_prog_compiler_wl \
+ lt_prog_compiler_pic \
+ lt_prog_compiler_static \
+ lt_prog_compiler_no_builtin_flag \
+ export_dynamic_flag_spec \
+ thread_safe_flag_spec \
+ whole_archive_flag_spec \
+ enable_shared_with_static_runtimes \
+ old_archive_cmds \
+ old_archive_from_new_cmds \
+ predep_objects \
+ postdep_objects \
+ predeps \
+ postdeps \
+ compiler_lib_search_path \
+ compiler_lib_search_dirs \
+ archive_cmds \
+ archive_expsym_cmds \
+ postinstall_cmds \
+ postuninstall_cmds \
+ old_archive_from_expsyms_cmds \
+ allow_undefined_flag \
+ no_undefined_flag \
+ export_symbols_cmds \
+ hardcode_libdir_flag_spec \
+ hardcode_libdir_flag_spec_ld \
+ hardcode_libdir_separator \
+ hardcode_automatic \
+ module_cmds \
+ module_expsym_cmds \
+ lt_cv_prog_compiler_c_o \
+ fix_srcfile_path \
+ exclude_expsyms \
+ include_expsyms; do
+
+ case $var in
+ old_archive_cmds | \
+ old_archive_from_new_cmds | \
+ archive_cmds | \
+ archive_expsym_cmds | \
+ module_cmds | \
+ module_expsym_cmds | \
+ old_archive_from_expsyms_cmds | \
+ export_symbols_cmds | \
+ extract_expsyms_cmds | reload_cmds | finish_cmds | \
+ postinstall_cmds | postuninstall_cmds | \
+ old_postinstall_cmds | old_postuninstall_cmds | \
+ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec)
+ # Double-quote double-evaled strings.
+ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\""
+ ;;
+ *)
+ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\""
+ ;;
+ esac
+ done
+
+ case $lt_echo in
+ *'\$0 --fallback-echo"')
+ lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'`
+ ;;
+ esac
+
+cfgfile="${ofile}T"
+ trap "$rm \"$cfgfile\"; exit 1" 1 2 15
+ $rm -f "$cfgfile"
+ { $as_echo "$as_me:$LINENO: creating $ofile" >&5
+$as_echo "$as_me: creating $ofile" >&6;}
+
+ cat <<__EOF__ >> "$cfgfile"
+#! $SHELL
+
+# `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
+# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP)
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+#
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
+# Free Software Foundation, Inc.
+#
+# This file is part of GNU Libtool:
+# Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# A sed program that does not truncate output.
+SED=$lt_SED
+
+# Sed that helps us avoid accidentally triggering echo(1) options like -n.
+Xsed="$SED -e 1s/^X//"
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+# The names of the tagged configurations supported by this script.
+available_tags=
+
+# ### BEGIN LIBTOOL CONFIG
+
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc
+
+# Whether or not to disallow shared libs when runtime libs are static
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# The host system.
+host_alias=$host_alias
+host=$host
+host_os=$host_os
+
+# The build system.
+build_alias=$build_alias
+build=$build
+build_os=$build_os
+
+# An echo program that does not interpret backslashes.
+echo=$lt_echo
+
+# The archiver.
+AR=$lt_AR
+AR_FLAGS=$lt_AR_FLAGS
+
+# A C compiler.
+LTCC=$lt_LTCC
+
+# LTCC compiler flags.
+LTCFLAGS=$lt_LTCFLAGS
+
+# A language-specific compiler.
+CC=$lt_compiler
+
+# Is the compiler the GNU C compiler?
+with_gcc=$GCC
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# The linker used to build libraries.
+LD=$lt_LD
+
+# Whether we need hard or soft links.
+LN_S=$lt_LN_S
+
+# A BSD-compatible nm program.
+NM=$lt_NM
+
+# A symbol stripping program
+STRIP=$lt_STRIP
+
+# Used to examine libraries when file_magic_cmd begins "file"
+MAGIC_CMD=$MAGIC_CMD
+
+# Used on cygwin: DLL creation program.
+DLLTOOL="$DLLTOOL"
+
+# Used on cygwin: object dumper.
+OBJDUMP="$OBJDUMP"
+
+# Used on cygwin: assembler.
+AS="$AS"
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl
+
+# Object file suffix (normally "o").
+objext="$ac_objext"
+
+# Old archive suffix (normally "a").
+libext="$libext"
+
+# Shared library suffix (normally ".so").
+shrext_cmds='$shrext_cmds'
+
+# Executable file suffix (normally "").
+exeext="$exeext"
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic
+pic_mode=$pic_mode
+
+# What is the maximum length of a command?
+max_cmd_len=$lt_cv_sys_max_cmd_len
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o
+
+# Must we lock files when doing compilation?
+need_locks=$lt_need_locks
+
+# Do we need the lib prefix for modules?
+need_lib_prefix=$need_lib_prefix
+
+# Do we need a version for libraries?
+need_version=$need_version
+
+# Whether dlopen is supported.
+dlopen_support=$enable_dlopen
+
+# Whether dlopen of programs is supported.
+dlopen_self=$enable_dlopen_self
+
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=$enable_dlopen_self_static
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec
+
+# Compiler flag to generate thread-safe objects.
+thread_safe_flag_spec=$lt_thread_safe_flag_spec
+
+# Library versioning type.
+version_type=$version_type
+
+# Format of library name prefix.
+libname_spec=$lt_libname_spec
+
+# List of archive names. First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME.
+library_names_spec=$lt_library_names_spec
+
+# The coded name of the library, if different from the real name.
+soname_spec=$lt_soname_spec
+
+# Commands used to build and install an old-style archive.
+RANLIB=$lt_RANLIB
+old_archive_cmds=$lt_old_archive_cmds
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds
+
+# Commands used to build and install a shared archive.
+archive_cmds=$lt_archive_cmds
+archive_expsym_cmds=$lt_archive_expsym_cmds
+postinstall_cmds=$lt_postinstall_cmds
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to build a loadable module (assumed same as above if empty)
+module_cmds=$lt_module_cmds
+module_expsym_cmds=$lt_module_expsym_cmds
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predep_objects=$lt_predep_objects
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdep_objects=$lt_postdep_objects
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predeps=$lt_predeps
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdeps=$lt_postdeps
+
+# The directories searched by this compiler when creating a shared
+# library
+compiler_lib_search_dirs=$lt_compiler_lib_search_dirs
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_compiler_lib_search_path
+
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method=$lt_deplibs_check_method
+
+# Command to use when deplibs_check_method == file_magic.
+file_magic_cmd=$lt_file_magic_cmd
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag
+
+# Flag that forces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# Same as above, but a single script fragment to be evaled but not shown.
+finish_eval=$lt_finish_eval
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
+
+# Transform the output of nm in a proper C declaration
+global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
+
+# Transform the output of nm in a C name address pair
+global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
+
+# This is the shared library runtime path variable.
+runpath_var=$runpath_var
+
+# This is the shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist.
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec
+
+# If ld is used when linking, flag to hardcode \$libdir into
+# a binary during linking. This must work even if \$libdir does
+# not exist.
+hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld
+
+# Whether we need a single -rpath flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator
+
+# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the
+# resulting binary.
+hardcode_direct=$hardcode_direct
+
+# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
+# resulting binary.
+hardcode_minus_L=$hardcode_minus_L
+
+# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into
+# the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var
+
+# Set to yes if building a shared library automatically hardcodes DIR into the library
+# and all subsequent libraries and executables linked against it.
+hardcode_automatic=$hardcode_automatic
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at relink time.
+variables_saved_for_relink="$variables_saved_for_relink"
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs
+
+# Compile-time system search path for libraries
+sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
+
+# Run-time system search path for libraries
+sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
+
+# Fix the shell variable \$srcfile for the compiler.
+fix_srcfile_path=$lt_fix_srcfile_path
+
+# Set to yes if exported symbols are required.
+always_export_symbols=$always_export_symbols
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms
+
+# ### END LIBTOOL CONFIG
+
+__EOF__
+
+
+ case $host_os in
+ aix3*)
+ cat <<\EOF >> "$cfgfile"
+
+# AIX sometimes has problems with the GCC collect2 program. For some
+# reason, if we set the COLLECT_NAMES environment variable, the problems
+# vanish in a puff of smoke.
+if test "X${COLLECT_NAMES+set}" != Xset; then
+ COLLECT_NAMES=
+ export COLLECT_NAMES
+fi
+EOF
+ ;;
+ esac
+
+ # We use sed instead of cat because bash on DJGPP gets confused if
+ # if finds mixed CR/LF and LF-only lines. Since sed operates in
+ # text mode, it properly converts lines to CR/LF. This bash problem
+ # is reportedly fixed, but why not run on old versions too?
+ sed '$q' "$ltmain" >> "$cfgfile" || (rm -f "$cfgfile"; exit 1)
+
+ mv -f "$cfgfile" "$ofile" || \
+ (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
+ chmod +x "$ofile"
+
+else
+ # If there is no Makefile yet, we rely on a make rule to execute
+ # `config.status --recheck' to rerun these tests and create the
+ # libtool script then.
+ ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'`
+ if test -f "$ltmain_in"; then
+ test -f Makefile && make "$ltmain"
+ fi
+fi
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+CC="$lt_save_CC"
+
+
+# Check whether --with-tags was given.
+if test "${with_tags+set}" = set; then
+ withval=$with_tags; tagnames="$withval"
+fi
+
+
+if test -f "$ltmain" && test -n "$tagnames"; then
+ if test ! -f "${ofile}"; then
+ { $as_echo "$as_me:$LINENO: WARNING: output file \`$ofile' does not exist" >&5
+$as_echo "$as_me: WARNING: output file \`$ofile' does not exist" >&2;}
+ fi
+
+ if test -z "$LTCC"; then
+ eval "`$SHELL ${ofile} --config | grep '^LTCC='`"
+ if test -z "$LTCC"; then
+ { $as_echo "$as_me:$LINENO: WARNING: output file \`$ofile' does not look like a libtool script" >&5
+$as_echo "$as_me: WARNING: output file \`$ofile' does not look like a libtool script" >&2;}
+ else
+ { $as_echo "$as_me:$LINENO: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&5
+$as_echo "$as_me: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&2;}
+ fi
+ fi
+ if test -z "$LTCFLAGS"; then
+ eval "`$SHELL ${ofile} --config | grep '^LTCFLAGS='`"
+ fi
+
+ # Extract list of available tagged configurations in $ofile.
+ # Note that this assumes the entire list is on one line.
+ available_tags=`grep "^available_tags=" "${ofile}" | $SED -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'`
+
+ lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+ for tagname in $tagnames; do
+ IFS="$lt_save_ifs"
+ # Check whether tagname contains only valid characters
+ case `$echo "X$tagname" | $Xsed -e 's:[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]::g'` in
+ "") ;;
+ *) { { $as_echo "$as_me:$LINENO: error: invalid tag name: $tagname" >&5
+$as_echo "$as_me: error: invalid tag name: $tagname" >&2;}
+ { (exit 1); exit 1; }; }
+ ;;
+ esac
+
+ if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null
+ then
+ { { $as_echo "$as_me:$LINENO: error: tag name \"$tagname\" already exists" >&5
+$as_echo "$as_me: error: tag name \"$tagname\" already exists" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+
+ # Update the list of available tags.
+ if test -n "$tagname"; then
+ echo appending configuration tag \"$tagname\" to $ofile
+
+ case $tagname in
+ CXX)
+ if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
+ ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
+ (test "X$CXX" != "Xg++"))) ; then
+ ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+
+
+archive_cmds_need_lc_CXX=no
+allow_undefined_flag_CXX=
+always_export_symbols_CXX=no
+archive_expsym_cmds_CXX=
+export_dynamic_flag_spec_CXX=
+hardcode_direct_CXX=no
+hardcode_libdir_flag_spec_CXX=
+hardcode_libdir_flag_spec_ld_CXX=
+hardcode_libdir_separator_CXX=
+hardcode_minus_L_CXX=no
+hardcode_shlibpath_var_CXX=unsupported
+hardcode_automatic_CXX=no
+module_cmds_CXX=
+module_expsym_cmds_CXX=
+link_all_deplibs_CXX=unknown
+old_archive_cmds_CXX=$old_archive_cmds
+no_undefined_flag_CXX=
+whole_archive_flag_spec_CXX=
+enable_shared_with_static_runtimes_CXX=no
+
+# Dependencies to place before and after the object being linked:
+predep_objects_CXX=
+postdep_objects_CXX=
+predeps_CXX=
+postdeps_CXX=
+compiler_lib_search_path_CXX=
+compiler_lib_search_dirs_CXX=
+
+# Source file extension for C++ test sources.
+ac_ext=cpp
+
+# Object file extension for compiled C++ test sources.
+objext=o
+objext_CXX=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(int, char *[]) { return(0); }'
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+# save warnings/boilerplate of simple test code
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$rm conftest*
+
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$rm -r conftest*
+
+
+# Allow CC to be a program name with arguments.
+lt_save_CC=$CC
+lt_save_LD=$LD
+lt_save_GCC=$GCC
+GCC=$GXX
+lt_save_with_gnu_ld=$with_gnu_ld
+lt_save_path_LD=$lt_cv_path_LD
+if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
+ lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
+else
+ $as_unset lt_cv_prog_gnu_ld
+fi
+if test -n "${lt_cv_path_LDCXX+set}"; then
+ lt_cv_path_LD=$lt_cv_path_LDCXX
+else
+ $as_unset lt_cv_path_LD
+fi
+test -z "${LDCXX+set}" || LD=$LDCXX
+CC=${CXX-"c++"}
+compiler=$CC
+compiler_CXX=$CC
+for cc_temp in $compiler""; do
+ case $cc_temp in
+ compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+ distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+ \-*) ;;
+ *) break;;
+ esac
+done
+cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+
+
+# We don't want -fno-exception wen compiling C++ code, so set the
+# no_builtin_flag separately
+if test "$GXX" = yes; then
+ lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin'
+else
+ lt_prog_compiler_no_builtin_flag_CXX=
+fi
+
+if test "$GXX" = yes; then
+ # Set up default GNU C++ configuration
+
+
+# Check whether --with-gnu-ld was given.
+if test "${with_gnu_ld+set}" = set; then
+ withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
+else
+ with_gnu_ld=no
+fi
+
+ac_prog=ld
+if test "$GCC" = yes; then
+ # Check if gcc -print-prog-name=ld gives a path.
+ { $as_echo "$as_me:$LINENO: checking for ld used by $CC" >&5
+$as_echo_n "checking for ld used by $CC... " >&6; }
+ case $host in
+ *-*-mingw*)
+ # gcc leaves a trailing carriage return which upsets mingw
+ ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+ *)
+ ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+ esac
+ case $ac_prog in
+ # Accept absolute paths.
+ [\\/]* | ?:[\\/]*)
+ re_direlt='/[^/][^/]*/\.\./'
+ # Canonicalize the pathname of ld
+ ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'`
+ while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
+ ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"`
+ done
+ test -z "$LD" && LD="$ac_prog"
+ ;;
+ "")
+ # If it fails, then pretend we aren't using GCC.
+ ac_prog=ld
+ ;;
+ *)
+ # If it is relative, then search for the first ld in PATH.
+ with_gnu_ld=unknown
+ ;;
+ esac
+elif test "$with_gnu_ld" = yes; then
+ { $as_echo "$as_me:$LINENO: checking for GNU ld" >&5
+$as_echo_n "checking for GNU ld... " >&6; }
+else
+ { $as_echo "$as_me:$LINENO: checking for non-GNU ld" >&5
+$as_echo_n "checking for non-GNU ld... " >&6; }
+fi
+if test "${lt_cv_path_LD+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ if test -z "$LD"; then
+ lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+ for ac_dir in $PATH; do
+ IFS="$lt_save_ifs"
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+ lt_cv_path_LD="$ac_dir/$ac_prog"
+ # Check to see if the program is GNU ld. I'd rather use --version,
+ # but apparently some variants of GNU ld only accept -v.
+ # Break only if it was the GNU/non-GNU ld that we prefer.
+ case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+ *GNU* | *'with BFD'*)
+ test "$with_gnu_ld" != no && break
+ ;;
+ *)
+ test "$with_gnu_ld" != yes && break
+ ;;
+ esac
+ fi
+ done
+ IFS="$lt_save_ifs"
+else
+ lt_cv_path_LD="$LD" # Let the user override the test with a path.
+fi
+fi
+
+LD="$lt_cv_path_LD"
+if test -n "$LD"; then
+ { $as_echo "$as_me:$LINENO: result: $LD" >&5
+$as_echo "$LD" >&6; }
+else
+ { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+test -z "$LD" && { { $as_echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5
+$as_echo "$as_me: error: no acceptable ld found in \$PATH" >&2;}
+ { (exit 1); exit 1; }; }
+{ $as_echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5
+$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; }
+if test "${lt_cv_prog_gnu_ld+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ # I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+ lt_cv_prog_gnu_ld=yes
+ ;;
+*)
+ lt_cv_prog_gnu_ld=no
+ ;;
+esac
+fi
+{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_gnu_ld" >&5
+$as_echo "$lt_cv_prog_gnu_ld" >&6; }
+with_gnu_ld=$lt_cv_prog_gnu_ld
+
+
+
+ # Check if GNU C++ uses GNU ld as the underlying linker, since the
+ # archiving commands below assume that GNU ld is being used.
+ if test "$with_gnu_ld" = yes; then
+ archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ archive_expsym_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+
+ hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir'
+ export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
+
+ # If archive_cmds runs LD, not CC, wlarc should be empty
+ # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
+ # investigate it a little bit more. (MM)
+ wlarc='${wl}'
+
+ # ancient GNU ld didn't support --whole-archive et. al.
+ if eval "`$CC -print-prog-name=ld` --help 2>&1" | \
+ grep 'no-whole-archive' > /dev/null; then
+ whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+ else
+ whole_archive_flag_spec_CXX=
+ fi
+ else
+ with_gnu_ld=no
+ wlarc=
+
+ # A generic and very simple default shared library creation
+ # command for GNU C++ for the case where it uses the native
+ # linker, instead of GNU ld. If possible, this setting should
+ # overridden to take advantage of the native linker features on
+ # the platform it is being used on.
+ archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+ fi
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"'
+
+else
+ GXX=no
+ with_gnu_ld=no
+ wlarc=
+fi
+
+# PORTME: fill in a description of your system's C++ link characteristics
+{ $as_echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
+ld_shlibs_CXX=yes
+case $host_os in
+ aix3*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ aix[4-9]*)
+ if test "$host_cpu" = ia64; then
+ # On IA64, the linker does run time linking by default, so we don't
+ # have to do anything special.
+ aix_use_runtimelinking=no
+ exp_sym_flag='-Bexport'
+ no_entry_flag=""
+ else
+ aix_use_runtimelinking=no
+
+ # Test if we are trying to use run time linking or normal
+ # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+ # need to do runtime linking.
+ case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
+ for ld_flag in $LDFLAGS; do
+ case $ld_flag in
+ *-brtl*)
+ aix_use_runtimelinking=yes
+ break
+ ;;
+ esac
+ done
+ ;;
+ esac
+
+ exp_sym_flag='-bexport'
+ no_entry_flag='-bnoentry'
+ fi
+
+ # When large executables or shared objects are built, AIX ld can
+ # have problems creating the table of contents. If linking a library
+ # or program results in "error TOC overflow" add -mminimal-toc to
+ # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not
+ # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+ archive_cmds_CXX=''
+ hardcode_direct_CXX=yes
+ hardcode_libdir_separator_CXX=':'
+ link_all_deplibs_CXX=yes
+
+ if test "$GXX" = yes; then
+ case $host_os in aix4.[012]|aix4.[012].*)
+ # We only want to do this on AIX 4.2 and lower, the check
+ # below for broken collect2 doesn't work under 4.3+
+ collect2name=`${CC} -print-prog-name=collect2`
+ if test -f "$collect2name" && \
+ strings "$collect2name" | grep resolve_lib_name >/dev/null
+ then
+ # We have reworked collect2
+ :
+ else
+ # We have old collect2
+ hardcode_direct_CXX=unsupported
+ # It fails to find uninstalled libraries when the uninstalled
+ # path is not listed in the libpath. Setting hardcode_minus_L
+ # to unsupported forces relinking
+ hardcode_minus_L_CXX=yes
+ hardcode_libdir_flag_spec_CXX='-L$libdir'
+ hardcode_libdir_separator_CXX=
+ fi
+ ;;
+ esac
+ shared_flag='-shared'
+ if test "$aix_use_runtimelinking" = yes; then
+ shared_flag="$shared_flag "'${wl}-G'
+ fi
+ else
+ # not using gcc
+ if test "$host_cpu" = ia64; then
+ # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+ # chokes on -Wl,-G. The following line is correct:
+ shared_flag='-G'
+ else
+ if test "$aix_use_runtimelinking" = yes; then
+ shared_flag='${wl}-G'
+ else
+ shared_flag='${wl}-bM:SRE'
+ fi
+ fi
+ fi
+
+ # It seems that -bexpall does not export symbols beginning with
+ # underscore (_), so it is better to generate a list of symbols to export.
+ always_export_symbols_CXX=yes
+ if test "$aix_use_runtimelinking" = yes; then
+ # Warning - without using the other runtime loading flags (-brtl),
+ # -berok will link without error, but may produce a broken library.
+ allow_undefined_flag_CXX='-berok'
+ # Determine the default libpath from the value encoded in an empty executable.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_cxx_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext && {
+ test "$cross_compiling" = yes ||
+ $as_test_x conftest$ac_exeext
+ }; then
+
+lt_aix_libpath_sed='
+ /Import File Strings/,/^$/ {
+ /^0/ {
+ s/^0 *\(.*\)$/\1/
+ p
+ }
+ }'
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then
+ aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+fi
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -rf conftest.dSYM
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+ conftest$ac_exeext conftest.$ac_ext
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+
+ hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath"
+
+ archive_expsym_cmds_CXX="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+ else
+ if test "$host_cpu" = ia64; then
+ hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib'
+ allow_undefined_flag_CXX="-z nodefs"
+ archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+ else
+ # Determine the default libpath from the value encoded in an empty executable.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_cxx_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext && {
+ test "$cross_compiling" = yes ||
+ $as_test_x conftest$ac_exeext
+ }; then
+
+lt_aix_libpath_sed='
+ /Import File Strings/,/^$/ {
+ /^0/ {
+ s/^0 *\(.*\)$/\1/
+ p
+ }
+ }'
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then
+ aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+fi
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -rf conftest.dSYM
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+ conftest$ac_exeext conftest.$ac_ext
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+
+ hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath"
+ # Warning - without using the other run time loading flags,
+ # -berok will link without error, but may produce a broken library.
+ no_undefined_flag_CXX=' ${wl}-bernotok'
+ allow_undefined_flag_CXX=' ${wl}-berok'
+ # Exported symbols can be pulled into shared objects from archives
+ whole_archive_flag_spec_CXX='$convenience'
+ archive_cmds_need_lc_CXX=yes
+ # This is similar to how AIX traditionally builds its shared libraries.
+ archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+ fi
+ fi
+ ;;
+
+ beos*)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ allow_undefined_flag_CXX=unsupported
+ # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+ # support --undefined. This deserves some investigation. FIXME
+ archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ else
+ ld_shlibs_CXX=no
+ fi
+ ;;
+
+ chorus*)
+ case $cc_basename in
+ *)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ esac
+ ;;
+
+ cygwin* | mingw* | pw32*)
+ # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless,
+ # as there is no search path for DLLs.
+ hardcode_libdir_flag_spec_CXX='-L$libdir'
+ allow_undefined_flag_CXX=unsupported
+ always_export_symbols_CXX=no
+ enable_shared_with_static_runtimes_CXX=yes
+
+ if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
+ archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+ # If the export-symbols file already is a .def file (1st line
+ # is EXPORTS), use it as is; otherwise, prepend...
+ archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+ cp $export_symbols $output_objdir/$soname.def;
+ else
+ echo EXPORTS > $output_objdir/$soname.def;
+ cat $export_symbols >> $output_objdir/$soname.def;
+ fi~
+ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+ else
+ ld_shlibs_CXX=no
+ fi
+ ;;
+ darwin* | rhapsody*)
+ archive_cmds_need_lc_CXX=no
+ hardcode_direct_CXX=no
+ hardcode_automatic_CXX=yes
+ hardcode_shlibpath_var_CXX=unsupported
+ whole_archive_flag_spec_CXX=''
+ link_all_deplibs_CXX=yes
+ allow_undefined_flag_CXX="$_lt_dar_allow_undefined"
+ if test "$GXX" = yes ; then
+ output_verbose_link_cmd='echo'
+ archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
+ module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
+ archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
+ module_expsym_cmds_CXX="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
+ if test "$lt_cv_apple_cc_single_mod" != "yes"; then
+ archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}"
+ archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}"
+ fi
+ else
+ case $cc_basename in
+ xlc*)
+ output_verbose_link_cmd='echo'
+ archive_cmds_CXX='$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $xlcverstring'
+ module_cmds_CXX='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
+ archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $xlcverstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ module_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ ;;
+ *)
+ ld_shlibs_CXX=no
+ ;;
+ esac
+ fi
+ ;;
+
+ dgux*)
+ case $cc_basename in
+ ec++*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ ghcx*)
+ # Green Hills C++ Compiler
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ esac
+ ;;
+ freebsd[12]*)
+ # C++ shared libraries reported to be fairly broken before switch to ELF
+ ld_shlibs_CXX=no
+ ;;
+ freebsd-elf*)
+ archive_cmds_need_lc_CXX=no
+ ;;
+ freebsd* | dragonfly*)
+ # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
+ # conventions
+ ld_shlibs_CXX=yes
+ ;;
+ gnu*)
+ ;;
+ hpux9*)
+ hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir'
+ hardcode_libdir_separator_CXX=:
+ export_dynamic_flag_spec_CXX='${wl}-E'
+ hardcode_direct_CXX=yes
+ hardcode_minus_L_CXX=yes # Not in the search PATH,
+ # but as the default
+ # location of the library.
+
+ case $cc_basename in
+ CC*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ aCC*)
+ archive_cmds_CXX='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "[-]L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+ ;;
+ *)
+ if test "$GXX" = yes; then
+ archive_cmds_CXX='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+ else
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ fi
+ ;;
+ esac
+ ;;
+ hpux10*|hpux11*)
+ if test $with_gnu_ld = no; then
+ hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir'
+ hardcode_libdir_separator_CXX=:
+
+ case $host_cpu in
+ hppa*64*|ia64*) ;;
+ *)
+ export_dynamic_flag_spec_CXX='${wl}-E'
+ ;;
+ esac
+ fi
+ case $host_cpu in
+ hppa*64*|ia64*)
+ hardcode_direct_CXX=no
+ hardcode_shlibpath_var_CXX=no
+ ;;
+ *)
+ hardcode_direct_CXX=yes
+ hardcode_minus_L_CXX=yes # Not in the search PATH,
+ # but as the default
+ # location of the library.
+ ;;
+ esac
+
+ case $cc_basename in
+ CC*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ aCC*)
+ case $host_cpu in
+ hppa*64*)
+ archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ ia64*)
+ archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ *)
+ archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ esac
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+ ;;
+ *)
+ if test "$GXX" = yes; then
+ if test $with_gnu_ld = no; then
+ case $host_cpu in
+ hppa*64*)
+ archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ ia64*)
+ archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ *)
+ archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ esac
+ fi
+ else
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ fi
+ ;;
+ esac
+ ;;
+ interix[3-9]*)
+ hardcode_direct_CXX=no
+ hardcode_shlibpath_var_CXX=no
+ hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
+ export_dynamic_flag_spec_CXX='${wl}-E'
+ # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+ # Instead, shared libraries are loaded at an image base (0x10000000 by
+ # default) and relocated if they conflict, which is a slow very memory
+ # consuming and fragmenting process. To avoid this, we pick a random,
+ # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+ # time. Moving up from 0x10000000 also allows more sbrk(2) space.
+ archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+ archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+ ;;
+ irix5* | irix6*)
+ case $cc_basename in
+ CC*)
+ # SGI C++
+ archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+
+ # Archives containing C++ object files must be created using
+ # "CC -ar", where "CC" is the IRIX C++ compiler. This is
+ # necessary to make sure instantiated templates are included
+ # in the archive.
+ old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs'
+ ;;
+ *)
+ if test "$GXX" = yes; then
+ if test "$with_gnu_ld" = no; then
+ archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ else
+ archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib'
+ fi
+ fi
+ link_all_deplibs_CXX=yes
+ ;;
+ esac
+ hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator_CXX=:
+ ;;
+ linux* | k*bsd*-gnu)
+ case $cc_basename in
+ KCC*)
+ # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+ # KCC will only create a shared library if the output file
+ # ends with ".so" (or ".sl" for HP-UX), so rename the library
+ # to its proper name (with version) after linking.
+ archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+ archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib'
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | grep "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+
+ hardcode_libdir_flag_spec_CXX='${wl}--rpath,$libdir'
+ export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
+
+ # Archives containing C++ object files must be created using
+ # "CC -Bstatic", where "CC" is the KAI C++ compiler.
+ old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs'
+ ;;
+ icpc*)
+ # Intel C++
+ with_gnu_ld=yes
+ # version 8.0 and above of icpc choke on multiply defined symbols
+ # if we add $predep_objects and $postdep_objects, however 7.1 and
+ # earlier do not add the objects themselves.
+ case `$CC -V 2>&1` in
+ *"Version 7."*)
+ archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ ;;
+ *) # Version 8.0 or newer
+ tmp_idyn=
+ case $host_cpu in
+ ia64*) tmp_idyn=' -i_dynamic';;
+ esac
+ archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ ;;
+ esac
+ archive_cmds_need_lc_CXX=no
+ hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
+ export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
+ whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+ ;;
+ pgCC* | pgcpp*)
+ # Portland Group C++ compiler
+ archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
+ archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+
+ hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir'
+ export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
+ whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
+ ;;
+ cxx*)
+ # Compaq C++
+ archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols'
+
+ runpath_var=LD_RUN_PATH
+ hardcode_libdir_flag_spec_CXX='-rpath $libdir'
+ hardcode_libdir_separator_CXX=:
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+ ;;
+ *)
+ case `$CC -V 2>&1 | sed 5q` in
+ *Sun\ C*)
+ # Sun C++ 5.9
+ no_undefined_flag_CXX=' -zdefs'
+ archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ archive_expsym_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols'
+ hardcode_libdir_flag_spec_CXX='-R$libdir'
+ whole_archive_flag_spec_CXX='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
+
+ # Not sure whether something based on
+ # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1
+ # would be better.
+ output_verbose_link_cmd='echo'
+
+ # Archives containing C++ object files must be created using
+ # "CC -xar", where "CC" is the Sun C++ compiler. This is
+ # necessary to make sure instantiated templates are included
+ # in the archive.
+ old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs'
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ lynxos*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ m88k*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ mvs*)
+ case $cc_basename in
+ cxx*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ esac
+ ;;
+ netbsd*)
+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+ archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
+ wlarc=
+ hardcode_libdir_flag_spec_CXX='-R$libdir'
+ hardcode_direct_CXX=yes
+ hardcode_shlibpath_var_CXX=no
+ fi
+ # Workaround some broken pre-1.5 toolchains
+ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"'
+ ;;
+ openbsd2*)
+ # C++ shared libraries are fairly broken
+ ld_shlibs_CXX=no
+ ;;
+ openbsd*)
+ if test -f /usr/libexec/ld.so; then
+ hardcode_direct_CXX=yes
+ hardcode_shlibpath_var_CXX=no
+ archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+ hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
+ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+ archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib'
+ export_dynamic_flag_spec_CXX='${wl}-E'
+ whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+ fi
+ output_verbose_link_cmd='echo'
+ else
+ ld_shlibs_CXX=no
+ fi
+ ;;
+ osf3*)
+ case $cc_basename in
+ KCC*)
+ # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+ # KCC will only create a shared library if the output file
+ # ends with ".so" (or ".sl" for HP-UX), so rename the library
+ # to its proper name (with version) after linking.
+ archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+
+ hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
+ hardcode_libdir_separator_CXX=:
+
+ # Archives containing C++ object files must be created using
+ # "CC -Bstatic", where "CC" is the KAI C++ compiler.
+ old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs'
+
+ ;;
+ RCC*)
+ # Rational C++ 2.4.1
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ cxx*)
+ allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*'
+ archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+
+ hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator_CXX=:
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+ ;;
+ *)
+ if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+ allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*'
+ archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+
+ hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator_CXX=:
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"'
+
+ else
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ fi
+ ;;
+ esac
+ ;;
+ osf4* | osf5*)
+ case $cc_basename in
+ KCC*)
+ # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+ # KCC will only create a shared library if the output file
+ # ends with ".so" (or ".sl" for HP-UX), so rename the library
+ # to its proper name (with version) after linking.
+ archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+
+ hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
+ hardcode_libdir_separator_CXX=:
+
+ # Archives containing C++ object files must be created using
+ # the KAI C++ compiler.
+ old_archive_cmds_CXX='$CC -o $oldlib $oldobjs'
+ ;;
+ RCC*)
+ # Rational C++ 2.4.1
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ cxx*)
+ allow_undefined_flag_CXX=' -expect_unresolved \*'
+ archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+ archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
+ echo "-hidden">> $lib.exp~
+ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~
+ $rm $lib.exp'
+
+ hardcode_libdir_flag_spec_CXX='-rpath $libdir'
+ hardcode_libdir_separator_CXX=:
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+ ;;
+ *)
+ if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+ allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*'
+ archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+
+ hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator_CXX=:
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"'
+
+ else
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ fi
+ ;;
+ esac
+ ;;
+ psos*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ sunos4*)
+ case $cc_basename in
+ CC*)
+ # Sun C++ 4.x
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ lcc*)
+ # Lucid
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ esac
+ ;;
+ solaris*)
+ case $cc_basename in
+ CC*)
+ # Sun C++ 4.2, 5.x and Centerline C++
+ archive_cmds_need_lc_CXX=yes
+ no_undefined_flag_CXX=' -zdefs'
+ archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+ $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp'
+
+ hardcode_libdir_flag_spec_CXX='-R$libdir'
+ hardcode_shlibpath_var_CXX=no
+ case $host_os in
+ solaris2.[0-5] | solaris2.[0-5].*) ;;
+ *)
+ # The compiler driver will combine and reorder linker options,
+ # but understands `-z linker_flag'.
+ # Supported since Solaris 2.6 (maybe 2.5.1?)
+ whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract'
+ ;;
+ esac
+ link_all_deplibs_CXX=yes
+
+ output_verbose_link_cmd='echo'
+
+ # Archives containing C++ object files must be created using
+ # "CC -xar", where "CC" is the Sun C++ compiler. This is
+ # necessary to make sure instantiated templates are included
+ # in the archive.
+ old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs'
+ ;;
+ gcx*)
+ # Green Hills C++ Compiler
+ archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+
+ # The C++ compiler must be used to create the archive.
+ old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
+ ;;
+ *)
+ # GNU C++ compiler with Solaris linker
+ if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+ no_undefined_flag_CXX=' ${wl}-z ${wl}defs'
+ if $CC --version | grep -v '^2\.7' > /dev/null; then
+ archive_cmds_CXX='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+ archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+ $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp'
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ output_verbose_link_cmd="$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\""
+ else
+ # g++ 2.7 appears to require `-G' NOT `-shared' on this
+ # platform.
+ archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+ archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp'
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ output_verbose_link_cmd="$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\""
+ fi
+
+ hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir'
+ case $host_os in
+ solaris2.[0-5] | solaris2.[0-5].*) ;;
+ *)
+ whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+ ;;
+ esac
+ fi
+ ;;
+ esac
+ ;;
+ sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
+ no_undefined_flag_CXX='${wl}-z,text'
+ archive_cmds_need_lc_CXX=no
+ hardcode_shlibpath_var_CXX=no
+ runpath_var='LD_RUN_PATH'
+
+ case $cc_basename in
+ CC*)
+ archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+ archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ esac
+ ;;
+ sysv5* | sco3.2v5* | sco5v6*)
+ # Note: We can NOT use -z defs as we might desire, because we do not
+ # link with -lc, and that would cause any symbols used from libc to
+ # always be unresolved, which means just about no library would
+ # ever link correctly. If we're not using GNU ld we use -z text
+ # though, which does catch some bad symbols but isn't as heavy-handed
+ # as -z defs.
+ # For security reasons, it is highly recommended that you always
+ # use absolute paths for naming shared libraries, and exclude the
+ # DT_RUNPATH tag from executables and libraries. But doing so
+ # requires that you compile everything twice, which is a pain.
+ # So that behaviour is only enabled if SCOABSPATH is set to a
+ # non-empty value in the environment. Most likely only useful for
+ # creating official distributions of packages.
+ # This is a hack until libtool officially supports absolute path
+ # names for shared libraries.
+ no_undefined_flag_CXX='${wl}-z,text'
+ allow_undefined_flag_CXX='${wl}-z,nodefs'
+ archive_cmds_need_lc_CXX=no
+ hardcode_shlibpath_var_CXX=no
+ hardcode_libdir_flag_spec_CXX='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`'
+ hardcode_libdir_separator_CXX=':'
+ link_all_deplibs_CXX=yes
+ export_dynamic_flag_spec_CXX='${wl}-Bexport'
+ runpath_var='LD_RUN_PATH'
+
+ case $cc_basename in
+ CC*)
+ archive_cmds_CXX='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+ archive_cmds_CXX='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ esac
+ ;;
+ tandem*)
+ case $cc_basename in
+ NCC*)
+ # NonStop-UX NCC 3.20
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ esac
+ ;;
+ vxworks*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+esac
+{ $as_echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5
+$as_echo "$ld_shlibs_CXX" >&6; }
+test "$ld_shlibs_CXX" = no && can_build_shared=no
+
+GCC_CXX="$GXX"
+LD_CXX="$LD"
+
+cat > conftest.$ac_ext <<EOF
+class Foo
+{
+public:
+ Foo (void) { a = 0; }
+private:
+ int a;
+};
+EOF
+
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ # Parse the compiler output and extract the necessary
+ # objects, libraries and library flags.
+
+ # Sentinel used to keep track of whether or not we are before
+ # the conftest object file.
+ pre_test_object_deps_done=no
+
+ # The `*' in the case matches for architectures that use `case' in
+ # $output_verbose_cmd can trigger glob expansion during the loop
+ # eval without this substitution.
+ output_verbose_link_cmd=`$echo "X$output_verbose_link_cmd" | $Xsed -e "$no_glob_subst"`
+
+ for p in `eval $output_verbose_link_cmd`; do
+ case $p in
+
+ -L* | -R* | -l*)
+ # Some compilers place space between "-{L,R}" and the path.
+ # Remove the space.
+ if test $p = "-L" \
+ || test $p = "-R"; then
+ prev=$p
+ continue
+ else
+ prev=
+ fi
+
+ if test "$pre_test_object_deps_done" = no; then
+ case $p in
+ -L* | -R*)
+ # Internal compiler library paths should come after those
+ # provided the user. The postdeps already come after the
+ # user supplied libs so there is no need to process them.
+ if test -z "$compiler_lib_search_path_CXX"; then
+ compiler_lib_search_path_CXX="${prev}${p}"
+ else
+ compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}"
+ fi
+ ;;
+ # The "-l" case would never come before the object being
+ # linked, so don't bother handling this case.
+ esac
+ else
+ if test -z "$postdeps_CXX"; then
+ postdeps_CXX="${prev}${p}"
+ else
+ postdeps_CXX="${postdeps_CXX} ${prev}${p}"
+ fi
+ fi
+ ;;
+
+ *.$objext)
+ # This assumes that the test object file only shows up
+ # once in the compiler output.
+ if test "$p" = "conftest.$objext"; then
+ pre_test_object_deps_done=yes
+ continue
+ fi
+
+ if test "$pre_test_object_deps_done" = no; then
+ if test -z "$predep_objects_CXX"; then
+ predep_objects_CXX="$p"
+ else
+ predep_objects_CXX="$predep_objects_CXX $p"
+ fi
+ else
+ if test -z "$postdep_objects_CXX"; then
+ postdep_objects_CXX="$p"
+ else
+ postdep_objects_CXX="$postdep_objects_CXX $p"
+ fi
+ fi
+ ;;
+
+ *) ;; # Ignore the rest.
+
+ esac
+ done
+
+ # Clean up.
+ rm -f a.out a.exe
+else
+ echo "libtool.m4: error: problem compiling CXX test program"
+fi
+
+$rm -f confest.$objext
+
+compiler_lib_search_dirs_CXX=
+if test -n "$compiler_lib_search_path_CXX"; then
+ compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | ${SED} -e 's! -L! !g' -e 's!^ !!'`
+fi
+
+# PORTME: override above test on systems where it is broken
+case $host_os in
+interix[3-9]*)
+ # Interix 3.5 installs completely hosed .la files for C++, so rather than
+ # hack all around it, let's just trust "g++" to DTRT.
+ predep_objects_CXX=
+ postdep_objects_CXX=
+ postdeps_CXX=
+ ;;
+
+linux*)
+ case `$CC -V 2>&1 | sed 5q` in
+ *Sun\ C*)
+ # Sun C++ 5.9
+ #
+ # The more standards-conforming stlport4 library is
+ # incompatible with the Cstd library. Avoid specifying
+ # it if it's in CXXFLAGS. Ignore libCrun as
+ # -library=stlport4 depends on it.
+ case " $CXX $CXXFLAGS " in
+ *" -library=stlport4 "*)
+ solaris_use_stlport4=yes
+ ;;
+ esac
+ if test "$solaris_use_stlport4" != yes; then
+ postdeps_CXX='-library=Cstd -library=Crun'
+ fi
+ ;;
+ esac
+ ;;
+
+solaris*)
+ case $cc_basename in
+ CC*)
+ # The more standards-conforming stlport4 library is
+ # incompatible with the Cstd library. Avoid specifying
+ # it if it's in CXXFLAGS. Ignore libCrun as
+ # -library=stlport4 depends on it.
+ case " $CXX $CXXFLAGS " in
+ *" -library=stlport4 "*)
+ solaris_use_stlport4=yes
+ ;;
+ esac
+
+ # Adding this requires a known-good setup of shared libraries for
+ # Sun compiler versions before 5.6, else PIC objects from an old
+ # archive will be linked into the output, leading to subtle bugs.
+ if test "$solaris_use_stlport4" != yes; then
+ postdeps_CXX='-library=Cstd -library=Crun'
+ fi
+ ;;
+ esac
+ ;;
+esac
+
+case " $postdeps_CXX " in
+*" -lc "*) archive_cmds_need_lc_CXX=no ;;
+esac
+
+lt_prog_compiler_wl_CXX=
+lt_prog_compiler_pic_CXX=
+lt_prog_compiler_static_CXX=
+
+{ $as_echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5
+$as_echo_n "checking for $compiler option to produce PIC... " >&6; }
+
+ # C++ specific cases for pic, static, wl, etc.
+ if test "$GXX" = yes; then
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_static_CXX='-static'
+
+ case $host_os in
+ aix*)
+ # All AIX code is PIC.
+ if test "$host_cpu" = ia64; then
+ # AIX 5 now supports IA64 processor
+ lt_prog_compiler_static_CXX='-Bstatic'
+ fi
+ ;;
+ amigaos*)
+ # FIXME: we need at least 68020 code to build shared libraries, but
+ # adding the `-m68020' flag to GCC prevents building anything better,
+ # like `-m68040'.
+ lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4'
+ ;;
+ beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+ # PIC is the default for these OSes.
+ ;;
+ mingw* | cygwin* | os2* | pw32*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ # Although the cygwin gcc ignores -fPIC, still need this for old-style
+ # (--disable-auto-import) libraries
+ lt_prog_compiler_pic_CXX='-DDLL_EXPORT'
+ ;;
+ darwin* | rhapsody*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ lt_prog_compiler_pic_CXX='-fno-common'
+ ;;
+ *djgpp*)
+ # DJGPP does not support shared libraries at all
+ lt_prog_compiler_pic_CXX=
+ ;;
+ interix[3-9]*)
+ # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+ # Instead, we relocate shared libraries at runtime.
+ ;;
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ lt_prog_compiler_pic_CXX=-Kconform_pic
+ fi
+ ;;
+ hpux*)
+ # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+ # not for PA HP-UX.
+ case $host_cpu in
+ hppa*64*|ia64*)
+ ;;
+ *)
+ lt_prog_compiler_pic_CXX='-fPIC'
+ ;;
+ esac
+ ;;
+ *)
+ lt_prog_compiler_pic_CXX='-fPIC'
+ ;;
+ esac
+ else
+ case $host_os in
+ aix[4-9]*)
+ # All AIX code is PIC.
+ if test "$host_cpu" = ia64; then
+ # AIX 5 now supports IA64 processor
+ lt_prog_compiler_static_CXX='-Bstatic'
+ else
+ lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp'
+ fi
+ ;;
+ chorus*)
+ case $cc_basename in
+ cxch68*)
+ # Green Hills C++ Compiler
+ # _LT_AC_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a"
+ ;;
+ esac
+ ;;
+ darwin*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ case $cc_basename in
+ xlc*)
+ lt_prog_compiler_pic_CXX='-qnocommon'
+ lt_prog_compiler_wl_CXX='-Wl,'
+ ;;
+ esac
+ ;;
+ dgux*)
+ case $cc_basename in
+ ec++*)
+ lt_prog_compiler_pic_CXX='-KPIC'
+ ;;
+ ghcx*)
+ # Green Hills C++ Compiler
+ lt_prog_compiler_pic_CXX='-pic'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ freebsd* | dragonfly*)
+ # FreeBSD uses GNU C++
+ ;;
+ hpux9* | hpux10* | hpux11*)
+ case $cc_basename in
+ CC*)
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_static_CXX='${wl}-a ${wl}archive'
+ if test "$host_cpu" != ia64; then
+ lt_prog_compiler_pic_CXX='+Z'
+ fi
+ ;;
+ aCC*)
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_static_CXX='${wl}-a ${wl}archive'
+ case $host_cpu in
+ hppa*64*|ia64*)
+ # +Z the default
+ ;;
+ *)
+ lt_prog_compiler_pic_CXX='+Z'
+ ;;
+ esac
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ interix*)
+ # This is c89, which is MS Visual C++ (no shared libs)
+ # Anyone wants to do a port?
+ ;;
+ irix5* | irix6* | nonstopux*)
+ case $cc_basename in
+ CC*)
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_static_CXX='-non_shared'
+ # CC pic flag -KPIC is the default.
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ linux* | k*bsd*-gnu)
+ case $cc_basename in
+ KCC*)
+ # KAI C++ Compiler
+ lt_prog_compiler_wl_CXX='--backend -Wl,'
+ lt_prog_compiler_pic_CXX='-fPIC'
+ ;;
+ icpc* | ecpc*)
+ # Intel C++
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_pic_CXX='-KPIC'
+ lt_prog_compiler_static_CXX='-static'
+ ;;
+ pgCC* | pgcpp*)
+ # Portland Group C++ compiler.
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_pic_CXX='-fpic'
+ lt_prog_compiler_static_CXX='-Bstatic'
+ ;;
+ cxx*)
+ # Compaq C++
+ # Make sure the PIC flag is empty. It appears that all Alpha
+ # Linux and Compaq Tru64 Unix objects are PIC.
+ lt_prog_compiler_pic_CXX=
+ lt_prog_compiler_static_CXX='-non_shared'
+ ;;
+ *)
+ case `$CC -V 2>&1 | sed 5q` in
+ *Sun\ C*)
+ # Sun C++ 5.9
+ lt_prog_compiler_pic_CXX='-KPIC'
+ lt_prog_compiler_static_CXX='-Bstatic'
+ lt_prog_compiler_wl_CXX='-Qoption ld '
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ lynxos*)
+ ;;
+ m88k*)
+ ;;
+ mvs*)
+ case $cc_basename in
+ cxx*)
+ lt_prog_compiler_pic_CXX='-W c,exportall'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ netbsd*)
+ ;;
+ osf3* | osf4* | osf5*)
+ case $cc_basename in
+ KCC*)
+ lt_prog_compiler_wl_CXX='--backend -Wl,'
+ ;;
+ RCC*)
+ # Rational C++ 2.4.1
+ lt_prog_compiler_pic_CXX='-pic'
+ ;;
+ cxx*)
+ # Digital/Compaq C++
+ lt_prog_compiler_wl_CXX='-Wl,'
+ # Make sure the PIC flag is empty. It appears that all Alpha
+ # Linux and Compaq Tru64 Unix objects are PIC.
+ lt_prog_compiler_pic_CXX=
+ lt_prog_compiler_static_CXX='-non_shared'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ psos*)
+ ;;
+ solaris*)
+ case $cc_basename in
+ CC*)
+ # Sun C++ 4.2, 5.x and Centerline C++
+ lt_prog_compiler_pic_CXX='-KPIC'
+ lt_prog_compiler_static_CXX='-Bstatic'
+ lt_prog_compiler_wl_CXX='-Qoption ld '
+ ;;
+ gcx*)
+ # Green Hills C++ Compiler
+ lt_prog_compiler_pic_CXX='-PIC'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ sunos4*)
+ case $cc_basename in
+ CC*)
+ # Sun C++ 4.x
+ lt_prog_compiler_pic_CXX='-pic'
+ lt_prog_compiler_static_CXX='-Bstatic'
+ ;;
+ lcc*)
+ # Lucid
+ lt_prog_compiler_pic_CXX='-pic'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ tandem*)
+ case $cc_basename in
+ NCC*)
+ # NonStop-UX NCC 3.20
+ lt_prog_compiler_pic_CXX='-KPIC'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+ case $cc_basename in
+ CC*)
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_pic_CXX='-KPIC'
+ lt_prog_compiler_static_CXX='-Bstatic'
+ ;;
+ esac
+ ;;
+ vxworks*)
+ ;;
+ *)
+ lt_prog_compiler_can_build_shared_CXX=no
+ ;;
+ esac
+ fi
+
+{ $as_echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_CXX" >&5
+$as_echo "$lt_prog_compiler_pic_CXX" >&6; }
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic_CXX"; then
+
+{ $as_echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5
+$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; }
+if test "${lt_cv_prog_compiler_pic_works_CXX+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_prog_compiler_pic_works_CXX=no
+ ac_outfile=conftest.$ac_objext
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+ lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC"
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ # The option is referenced via a variable to avoid confusing sed.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:13173: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&5
+ echo "$as_me:13177: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s "$ac_outfile"; then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings other than the usual output.
+ $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_pic_works_CXX=yes
+ fi
+ fi
+ $rm conftest*
+
+fi
+{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_pic_works_CXX" >&5
+$as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; }
+
+if test x"$lt_cv_prog_compiler_pic_works_CXX" = xyes; then
+ case $lt_prog_compiler_pic_CXX in
+ "" | " "*) ;;
+ *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;;
+ esac
+else
+ lt_prog_compiler_pic_CXX=
+ lt_prog_compiler_can_build_shared_CXX=no
+fi
+
+fi
+case $host_os in
+ # For platforms which do not support PIC, -DPIC is meaningless:
+ *djgpp*)
+ lt_prog_compiler_pic_CXX=
+ ;;
+ *)
+ lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC"
+ ;;
+esac
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\"
+{ $as_echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
+if test "${lt_cv_prog_compiler_static_works_CXX+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_prog_compiler_static_works_CXX=no
+ save_LDFLAGS="$LDFLAGS"
+ LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
+ echo "$lt_simple_link_test_code" > conftest.$ac_ext
+ if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+ # The linker can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ if test -s conftest.err; then
+ # Append any errors to the config.log.
+ cat conftest.err 1>&5
+ $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if diff conftest.exp conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_static_works_CXX=yes
+ fi
+ else
+ lt_cv_prog_compiler_static_works_CXX=yes
+ fi
+ fi
+ $rm -r conftest*
+ LDFLAGS="$save_LDFLAGS"
+
+fi
+{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_static_works_CXX" >&5
+$as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; }
+
+if test x"$lt_cv_prog_compiler_static_works_CXX" = xyes; then
+ :
+else
+ lt_prog_compiler_static_CXX=
+fi
+
+
+{ $as_echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5
+$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if test "${lt_cv_prog_compiler_c_o_CXX+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_prog_compiler_c_o_CXX=no
+ $rm -r conftest 2>/dev/null
+ mkdir conftest
+ cd conftest
+ mkdir out
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ lt_compiler_flag="-o out/conftest2.$ac_objext"
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:13277: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>out/conftest.err)
+ ac_status=$?
+ cat out/conftest.err >&5
+ echo "$as_me:13281: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s out/conftest2.$ac_objext
+ then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp
+ $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+ if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_c_o_CXX=yes
+ fi
+ fi
+ chmod u+w . 2>&5
+ $rm conftest*
+ # SGI C++ compiler will create directory out/ii_files/ for
+ # template instantiation
+ test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files
+ $rm out/* && rmdir out
+ cd ..
+ rmdir conftest
+ $rm conftest*
+
+fi
+{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_CXX" >&5
+$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; }
+
+
+hard_links="nottested"
+if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then
+ # do not overwrite the value of need_locks provided by the user
+ { $as_echo "$as_me:$LINENO: checking if we can lock with hard links" >&5
+$as_echo_n "checking if we can lock with hard links... " >&6; }
+ hard_links=yes
+ $rm conftest*
+ ln conftest.a conftest.b 2>/dev/null && hard_links=no
+ touch conftest.a
+ ln conftest.a conftest.b 2>&5 || hard_links=no
+ ln conftest.a conftest.b 2>/dev/null && hard_links=no
+ { $as_echo "$as_me:$LINENO: result: $hard_links" >&5
+$as_echo "$hard_links" >&6; }
+ if test "$hard_links" = no; then
+ { $as_echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
+$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
+ need_locks=warn
+ fi
+else
+ need_locks=no
+fi
+
+{ $as_echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
+
+ export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+ case $host_os in
+ aix[4-9]*)
+ # If we're using GNU nm, then we don't want the "-C" option.
+ # -C means demangle to AIX nm, but means don't demangle with GNU nm
+ if $NM -V 2>&1 | grep 'GNU' > /dev/null; then
+ export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols'
+ else
+ export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols'
+ fi
+ ;;
+ pw32*)
+ export_symbols_cmds_CXX="$ltdll_cmds"
+ ;;
+ cygwin* | mingw*)
+ export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;/^.*[ ]__nm__/s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols'
+ ;;
+ *)
+ export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+ ;;
+ esac
+ exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
+
+{ $as_echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5
+$as_echo "$ld_shlibs_CXX" >&6; }
+test "$ld_shlibs_CXX" = no && can_build_shared=no
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$archive_cmds_need_lc_CXX" in
+x|xyes)
+ # Assume -lc should be added
+ archive_cmds_need_lc_CXX=yes
+
+ if test "$enable_shared" = yes && test "$GCC" = yes; then
+ case $archive_cmds_CXX in
+ *'~'*)
+ # FIXME: we may have to deal with multi-command sequences.
+ ;;
+ '$CC '*)
+ # Test whether the compiler implicitly links with -lc since on some
+ # systems, -lgcc has to come before -lc. If gcc already passes -lc
+ # to ld, don't add -lc before -lgcc.
+ { $as_echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5
+$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; }
+ $rm conftest*
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } 2>conftest.err; then
+ soname=conftest
+ lib=conftest
+ libobjs=conftest.$ac_objext
+ deplibs=
+ wl=$lt_prog_compiler_wl_CXX
+ pic_flag=$lt_prog_compiler_pic_CXX
+ compiler_flags=-v
+ linker_flags=-v
+ verstring=
+ output_objdir=.
+ libname=conftest
+ lt_save_allow_undefined_flag=$allow_undefined_flag_CXX
+ allow_undefined_flag_CXX=
+ if { (eval echo "$as_me:$LINENO: \"$archive_cmds_CXX 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5
+ (eval $archive_cmds_CXX 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+ then
+ archive_cmds_need_lc_CXX=no
+ else
+ archive_cmds_need_lc_CXX=yes
+ fi
+ allow_undefined_flag_CXX=$lt_save_allow_undefined_flag
+ else
+ cat conftest.err 1>&5
+ fi
+ $rm conftest*
+ { $as_echo "$as_me:$LINENO: result: $archive_cmds_need_lc_CXX" >&5
+$as_echo "$archive_cmds_need_lc_CXX" >&6; }
+ ;;
+ esac
+ fi
+ ;;
+esac
+
+{ $as_echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5
+$as_echo_n "checking dynamic linker characteristics... " >&6; }
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=".so"
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+case $host_os in
+aix3*)
+ version_type=linux
+ library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+ shlibpath_var=LIBPATH
+
+ # AIX 3 has no versioning support, so we append a major version to the name.
+ soname_spec='${libname}${release}${shared_ext}$major'
+ ;;
+
+aix[4-9]*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ hardcode_into_libs=yes
+ if test "$host_cpu" = ia64; then
+ # AIX 5 supports IA64
+ library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+ shlibpath_var=LD_LIBRARY_PATH
+ else
+ # With GCC up to 2.95.x, collect2 would create an import file
+ # for dependence libraries. The import file would start with
+ # the line `#! .'. This would cause the generated library to
+ # depend on `.', always an invalid library. This was fixed in
+ # development snapshots of GCC prior to 3.0.
+ case $host_os in
+ aix4 | aix4.[01] | aix4.[01].*)
+ if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+ echo ' yes '
+ echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then
+ :
+ else
+ can_build_shared=no
+ fi
+ ;;
+ esac
+ # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+ # soname into executable. Probably we can add versioning support to
+ # collect2, so additional links can be useful in future.
+ if test "$aix_use_runtimelinking" = yes; then
+ # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+ # instead of lib<name>.a to let people know that these are not
+ # typical AIX shared libraries.
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ else
+ # We preserve .a as extension for shared libraries through AIX4.2
+ # and later when we are not doing run time linking.
+ library_names_spec='${libname}${release}.a $libname.a'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ fi
+ shlibpath_var=LIBPATH
+ fi
+ ;;
+
+amigaos*)
+ library_names_spec='$libname.ixlibrary $libname.a'
+ # Create ${libname}_ixlibrary.a entries in /sys/libs.
+ finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+ ;;
+
+beos*)
+ library_names_spec='${libname}${shared_ext}'
+ dynamic_linker="$host_os ld.so"
+ shlibpath_var=LIBRARY_PATH
+ ;;
+
+bsdi[45]*)
+ version_type=linux
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+ sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+ # the default ld.so.conf also contains /usr/contrib/lib and
+ # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+ # libtool to hard-code these into programs
+ ;;
+
+cygwin* | mingw* | pw32*)
+ version_type=windows
+ shrext_cmds=".dll"
+ need_version=no
+ need_lib_prefix=no
+
+ case $GCC,$host_os in
+ yes,cygwin* | yes,mingw* | yes,pw32*)
+ library_names_spec='$libname.dll.a'
+ # DLL is installed to $(libdir)/../bin by postinstall_cmds
+ postinstall_cmds='base_file=`basename \${file}`~
+ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~
+ dldir=$destdir/`dirname \$dlpath`~
+ test -d \$dldir || mkdir -p \$dldir~
+ $install_prog $dir/$dlname \$dldir/$dlname~
+ chmod a+x \$dldir/$dlname'
+ postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+ dlpath=$dir/\$dldll~
+ $rm \$dlpath'
+ shlibpath_overrides_runpath=yes
+
+ case $host_os in
+ cygwin*)
+ # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+ soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+ sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib"
+ ;;
+ mingw*)
+ # MinGW DLLs use traditional 'lib' prefix
+ soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+ sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+ if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then
+ # It is most probably a Windows format PATH printed by
+ # mingw gcc, but we are running on Cygwin. Gcc prints its search
+ # path with ; separators, and with drive letters. We can handle the
+ # drive letters (cygwin fileutils understands them), so leave them,
+ # especially as we might pass files found there to a mingw objdump,
+ # which wouldn't understand a cygwinified path. Ahh.
+ sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+ else
+ sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+ fi
+ ;;
+ pw32*)
+ # pw32 DLLs use 'pw' prefix rather than 'lib'
+ library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+ ;;
+ esac
+ ;;
+
+ *)
+ library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
+ ;;
+ esac
+ dynamic_linker='Win32 ld.exe'
+ # FIXME: first we should search . and the directory the executable is in
+ shlibpath_var=PATH
+ ;;
+
+darwin* | rhapsody*)
+ dynamic_linker="$host_os dyld"
+ version_type=darwin
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext'
+ soname_spec='${libname}${release}${major}$shared_ext'
+ shlibpath_overrides_runpath=yes
+ shlibpath_var=DYLD_LIBRARY_PATH
+ shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+
+ sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+ ;;
+
+dgux*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+freebsd1*)
+ dynamic_linker=no
+ ;;
+
+freebsd* | dragonfly*)
+ # DragonFly does not have aout. When/if they implement a new
+ # versioning mechanism, adjust this.
+ if test -x /usr/bin/objformat; then
+ objformat=`/usr/bin/objformat`
+ else
+ case $host_os in
+ freebsd[123]*) objformat=aout ;;
+ *) objformat=elf ;;
+ esac
+ fi
+ version_type=freebsd-$objformat
+ case $version_type in
+ freebsd-elf*)
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+ need_version=no
+ need_lib_prefix=no
+ ;;
+ freebsd-*)
+ library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+ need_version=yes
+ ;;
+ esac
+ shlibpath_var=LD_LIBRARY_PATH
+ case $host_os in
+ freebsd2*)
+ shlibpath_overrides_runpath=yes
+ ;;
+ freebsd3.[01]* | freebsdelf3.[01]*)
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+ freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
+ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+ *) # from 4.6 on, and DragonFly
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+ esac
+ ;;
+
+gnu*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ hardcode_into_libs=yes
+ ;;
+
+hpux9* | hpux10* | hpux11*)
+ # Give a soname corresponding to the major version so that dld.sl refuses to
+ # link against other versions.
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=no
+ case $host_cpu in
+ ia64*)
+ shrext_cmds='.so'
+ hardcode_into_libs=yes
+ dynamic_linker="$host_os dld.so"
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ if test "X$HPUX_IA64_MODE" = X32; then
+ sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+ else
+ sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+ fi
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ ;;
+ hppa*64*)
+ shrext_cmds='.sl'
+ hardcode_into_libs=yes
+ dynamic_linker="$host_os dld.sl"
+ shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ ;;
+ *)
+ shrext_cmds='.sl'
+ dynamic_linker="$host_os dld.sl"
+ shlibpath_var=SHLIB_PATH
+ shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ ;;
+ esac
+ # HP-UX runs *really* slowly unless shared libraries are mode 555.
+ postinstall_cmds='chmod 555 $lib'
+ ;;
+
+interix[3-9]*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+
+irix5* | irix6* | nonstopux*)
+ case $host_os in
+ nonstopux*) version_type=nonstopux ;;
+ *)
+ if test "$lt_cv_prog_gnu_ld" = yes; then
+ version_type=linux
+ else
+ version_type=irix
+ fi ;;
+ esac
+ need_lib_prefix=no
+ need_version=no
+ soname_spec='${libname}${release}${shared_ext}$major'
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+ case $host_os in
+ irix5* | nonstopux*)
+ libsuff= shlibsuff=
+ ;;
+ *)
+ case $LD in # libtool.m4 will add one of these switches to LD
+ *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+ libsuff= shlibsuff= libmagic=32-bit;;
+ *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+ libsuff=32 shlibsuff=N32 libmagic=N32;;
+ *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+ libsuff=64 shlibsuff=64 libmagic=64-bit;;
+ *) libsuff= shlibsuff= libmagic=never-match;;
+ esac
+ ;;
+ esac
+ shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+ shlibpath_overrides_runpath=no
+ sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+ sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+ hardcode_into_libs=yes
+ ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+ dynamic_linker=no
+ ;;
+
+# This must be Linux ELF.
+linux* | k*bsd*-gnu)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ # This implies no fast_install, which is unacceptable.
+ # Some rework will be needed to allow for fast_install
+ # before this can be enabled.
+ hardcode_into_libs=yes
+ sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+ sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+
+ # Append ld.so.conf contents to the search path
+ if test -f /etc/ld.so.conf; then
+ lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '`
+ sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra"
+ fi
+
+ # We used to test for /lib/ld.so.1 and disable shared libraries on
+ # powerpc, because MkLinux only supported shared libraries with the
+ # GNU dynamic linker. Since this was broken with cross compilers,
+ # most powerpc-linux boxes support dynamic linking these days and
+ # people can always --disable-shared, the test was removed, and we
+ # assume the GNU/Linux dynamic linker is in use.
+ dynamic_linker='GNU/Linux ld.so'
+ ;;
+
+netbsd*)
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=no
+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+ dynamic_linker='NetBSD (a.out) ld.so'
+ else
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ dynamic_linker='NetBSD ld.elf_so'
+ fi
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+
+newsos6)
+ version_type=linux
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ ;;
+
+nto-qnx*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ ;;
+
+openbsd*)
+ version_type=sunos
+ sys_lib_dlsearch_path_spec="/usr/lib"
+ need_lib_prefix=no
+ # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
+ case $host_os in
+ openbsd3.3 | openbsd3.3.*) need_version=yes ;;
+ *) need_version=no ;;
+ esac
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+ case $host_os in
+ openbsd2.[89] | openbsd2.[89].*)
+ shlibpath_overrides_runpath=no
+ ;;
+ *)
+ shlibpath_overrides_runpath=yes
+ ;;
+ esac
+ else
+ shlibpath_overrides_runpath=yes
+ fi
+ ;;
+
+os2*)
+ libname_spec='$name'
+ shrext_cmds=".dll"
+ need_lib_prefix=no
+ library_names_spec='$libname${shared_ext} $libname.a'
+ dynamic_linker='OS/2 ld.exe'
+ shlibpath_var=LIBPATH
+ ;;
+
+osf3* | osf4* | osf5*)
+ version_type=osf
+ need_lib_prefix=no
+ need_version=no
+ soname_spec='${libname}${release}${shared_ext}$major'
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ shlibpath_var=LD_LIBRARY_PATH
+ sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+ sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+ ;;
+
+rdos*)
+ dynamic_linker=no
+ ;;
+
+solaris*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ # ldd complains unless libraries are executable
+ postinstall_cmds='chmod +x $lib'
+ ;;
+
+sunos4*)
+ version_type=sunos
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+ finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ if test "$with_gnu_ld" = yes; then
+ need_lib_prefix=no
+ fi
+ need_version=yes
+ ;;
+
+sysv4 | sysv4.3*)
+ version_type=linux
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ case $host_vendor in
+ sni)
+ shlibpath_overrides_runpath=no
+ need_lib_prefix=no
+ export_dynamic_flag_spec='${wl}-Blargedynsym'
+ runpath_var=LD_RUN_PATH
+ ;;
+ siemens)
+ need_lib_prefix=no
+ ;;
+ motorola)
+ need_lib_prefix=no
+ need_version=no
+ shlibpath_overrides_runpath=no
+ sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+ ;;
+ esac
+ ;;
+
+sysv4*MP*)
+ if test -d /usr/nec ;then
+ version_type=linux
+ library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
+ soname_spec='$libname${shared_ext}.$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ fi
+ ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+ version_type=freebsd-elf
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ hardcode_into_libs=yes
+ if test "$with_gnu_ld" = yes; then
+ sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+ shlibpath_overrides_runpath=no
+ else
+ sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+ shlibpath_overrides_runpath=yes
+ case $host_os in
+ sco3.2v5*)
+ sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+ ;;
+ esac
+ fi
+ sys_lib_dlsearch_path_spec='/usr/lib'
+ ;;
+
+uts4*)
+ version_type=linux
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+*)
+ dynamic_linker=no
+ ;;
+esac
+{ $as_echo "$as_me:$LINENO: result: $dynamic_linker" >&5
+$as_echo "$dynamic_linker" >&6; }
+test "$dynamic_linker" = no && can_build_shared=no
+
+if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_sys_lib_search_path_spec="$sys_lib_search_path_spec"
+fi
+
+sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
+if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec"
+fi
+
+sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test "$GCC" = yes; then
+ variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+{ $as_echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5
+$as_echo_n "checking how to hardcode library paths into programs... " >&6; }
+hardcode_action_CXX=
+if test -n "$hardcode_libdir_flag_spec_CXX" || \
+ test -n "$runpath_var_CXX" || \
+ test "X$hardcode_automatic_CXX" = "Xyes" ; then
+
+ # We can hardcode non-existant directories.
+ if test "$hardcode_direct_CXX" != no &&
+ # If the only mechanism to avoid hardcoding is shlibpath_var, we
+ # have to relink, otherwise we might link with an installed library
+ # when we should be linking with a yet-to-be-installed one
+ ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, CXX)" != no &&
+ test "$hardcode_minus_L_CXX" != no; then
+ # Linking always hardcodes the temporary library directory.
+ hardcode_action_CXX=relink
+ else
+ # We can link without hardcoding, and we can hardcode nonexisting dirs.
+ hardcode_action_CXX=immediate
+ fi
+else
+ # We cannot hardcode anything, or else we can only hardcode existing
+ # directories.
+ hardcode_action_CXX=unsupported
+fi
+{ $as_echo "$as_me:$LINENO: result: $hardcode_action_CXX" >&5
+$as_echo "$hardcode_action_CXX" >&6; }
+
+if test "$hardcode_action_CXX" = relink; then
+ # Fast installation is not supported
+ enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+ test "$enable_shared" = no; then
+ # Fast installation is not necessary
+ enable_fast_install=needless
+fi
+
+
+# The else clause should only fire when bootstrapping the
+# libtool distribution, otherwise you forgot to ship ltmain.sh
+# with your package, and you will get complaints that there are
+# no rules to generate ltmain.sh.
+if test -f "$ltmain"; then
+ # See if we are running on zsh, and set the options which allow our commands through
+ # without removal of \ escapes.
+ if test -n "${ZSH_VERSION+set}" ; then
+ setopt NO_GLOB_SUBST
+ fi
+ # Now quote all the things that may contain metacharacters while being
+ # careful not to overquote the AC_SUBSTed values. We take copies of the
+ # variables and quote the copies for generation of the libtool script.
+ for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \
+ SED SHELL STRIP \
+ libname_spec library_names_spec soname_spec extract_expsyms_cmds \
+ old_striplib striplib file_magic_cmd finish_cmds finish_eval \
+ deplibs_check_method reload_flag reload_cmds need_locks \
+ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \
+ lt_cv_sys_global_symbol_to_c_name_address \
+ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \
+ old_postinstall_cmds old_postuninstall_cmds \
+ compiler_CXX \
+ CC_CXX \
+ LD_CXX \
+ lt_prog_compiler_wl_CXX \
+ lt_prog_compiler_pic_CXX \
+ lt_prog_compiler_static_CXX \
+ lt_prog_compiler_no_builtin_flag_CXX \
+ export_dynamic_flag_spec_CXX \
+ thread_safe_flag_spec_CXX \
+ whole_archive_flag_spec_CXX \
+ enable_shared_with_static_runtimes_CXX \
+ old_archive_cmds_CXX \
+ old_archive_from_new_cmds_CXX \
+ predep_objects_CXX \
+ postdep_objects_CXX \
+ predeps_CXX \
+ postdeps_CXX \
+ compiler_lib_search_path_CXX \
+ compiler_lib_search_dirs_CXX \
+ archive_cmds_CXX \
+ archive_expsym_cmds_CXX \
+ postinstall_cmds_CXX \
+ postuninstall_cmds_CXX \
+ old_archive_from_expsyms_cmds_CXX \
+ allow_undefined_flag_CXX \
+ no_undefined_flag_CXX \
+ export_symbols_cmds_CXX \
+ hardcode_libdir_flag_spec_CXX \
+ hardcode_libdir_flag_spec_ld_CXX \
+ hardcode_libdir_separator_CXX \
+ hardcode_automatic_CXX \
+ module_cmds_CXX \
+ module_expsym_cmds_CXX \
+ lt_cv_prog_compiler_c_o_CXX \
+ fix_srcfile_path_CXX \
+ exclude_expsyms_CXX \
+ include_expsyms_CXX; do
+
+ case $var in
+ old_archive_cmds_CXX | \
+ old_archive_from_new_cmds_CXX | \
+ archive_cmds_CXX | \
+ archive_expsym_cmds_CXX | \
+ module_cmds_CXX | \
+ module_expsym_cmds_CXX | \
+ old_archive_from_expsyms_cmds_CXX | \
+ export_symbols_cmds_CXX | \
+ extract_expsyms_cmds | reload_cmds | finish_cmds | \
+ postinstall_cmds | postuninstall_cmds | \
+ old_postinstall_cmds | old_postuninstall_cmds | \
+ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec)
+ # Double-quote double-evaled strings.
+ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\""
+ ;;
+ *)
+ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\""
+ ;;
+ esac
+ done
+
+ case $lt_echo in
+ *'\$0 --fallback-echo"')
+ lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'`
+ ;;
+ esac
+
+cfgfile="$ofile"
+
+ cat <<__EOF__ >> "$cfgfile"
+# ### BEGIN LIBTOOL TAG CONFIG: $tagname
+
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc_CXX
+
+# Whether or not to disallow shared libs when runtime libs are static
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# The host system.
+host_alias=$host_alias
+host=$host
+host_os=$host_os
+
+# The build system.
+build_alias=$build_alias
+build=$build
+build_os=$build_os
+
+# An echo program that does not interpret backslashes.
+echo=$lt_echo
+
+# The archiver.
+AR=$lt_AR
+AR_FLAGS=$lt_AR_FLAGS
+
+# A C compiler.
+LTCC=$lt_LTCC
+
+# LTCC compiler flags.
+LTCFLAGS=$lt_LTCFLAGS
+
+# A language-specific compiler.
+CC=$lt_compiler_CXX
+
+# Is the compiler the GNU C compiler?
+with_gcc=$GCC_CXX
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# The linker used to build libraries.
+LD=$lt_LD_CXX
+
+# Whether we need hard or soft links.
+LN_S=$lt_LN_S
+
+# A BSD-compatible nm program.
+NM=$lt_NM
+
+# A symbol stripping program
+STRIP=$lt_STRIP
+
+# Used to examine libraries when file_magic_cmd begins "file"
+MAGIC_CMD=$MAGIC_CMD
+
+# Used on cygwin: DLL creation program.
+DLLTOOL="$DLLTOOL"
+
+# Used on cygwin: object dumper.
+OBJDUMP="$OBJDUMP"
+
+# Used on cygwin: assembler.
+AS="$AS"
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl_CXX
+
+# Object file suffix (normally "o").
+objext="$ac_objext"
+
+# Old archive suffix (normally "a").
+libext="$libext"
+
+# Shared library suffix (normally ".so").
+shrext_cmds='$shrext_cmds'
+
+# Executable file suffix (normally "").
+exeext="$exeext"
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic_CXX
+pic_mode=$pic_mode
+
+# What is the maximum length of a command?
+max_cmd_len=$lt_cv_sys_max_cmd_len
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX
+
+# Must we lock files when doing compilation?
+need_locks=$lt_need_locks
+
+# Do we need the lib prefix for modules?
+need_lib_prefix=$need_lib_prefix
+
+# Do we need a version for libraries?
+need_version=$need_version
+
+# Whether dlopen is supported.
+dlopen_support=$enable_dlopen
+
+# Whether dlopen of programs is supported.
+dlopen_self=$enable_dlopen_self
+
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=$enable_dlopen_self_static
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static_CXX
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX
+
+# Compiler flag to generate thread-safe objects.
+thread_safe_flag_spec=$lt_thread_safe_flag_spec_CXX
+
+# Library versioning type.
+version_type=$version_type
+
+# Format of library name prefix.
+libname_spec=$lt_libname_spec
+
+# List of archive names. First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME.
+library_names_spec=$lt_library_names_spec
+
+# The coded name of the library, if different from the real name.
+soname_spec=$lt_soname_spec
+
+# Commands used to build and install an old-style archive.
+RANLIB=$lt_RANLIB
+old_archive_cmds=$lt_old_archive_cmds_CXX
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX
+
+# Commands used to build and install a shared archive.
+archive_cmds=$lt_archive_cmds_CXX
+archive_expsym_cmds=$lt_archive_expsym_cmds_CXX
+postinstall_cmds=$lt_postinstall_cmds
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to build a loadable module (assumed same as above if empty)
+module_cmds=$lt_module_cmds_CXX
+module_expsym_cmds=$lt_module_expsym_cmds_CXX
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predep_objects=$lt_predep_objects_CXX
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdep_objects=$lt_postdep_objects_CXX
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predeps=$lt_predeps_CXX
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdeps=$lt_postdeps_CXX
+
+# The directories searched by this compiler when creating a shared
+# library
+compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_compiler_lib_search_path_CXX
+
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method=$lt_deplibs_check_method
+
+# Command to use when deplibs_check_method == file_magic.
+file_magic_cmd=$lt_file_magic_cmd
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag_CXX
+
+# Flag that forces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag_CXX
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# Same as above, but a single script fragment to be evaled but not shown.
+finish_eval=$lt_finish_eval
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
+
+# Transform the output of nm in a proper C declaration
+global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
+
+# Transform the output of nm in a C name address pair
+global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
+
+# This is the shared library runtime path variable.
+runpath_var=$runpath_var
+
+# This is the shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action_CXX
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist.
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX
+
+# If ld is used when linking, flag to hardcode \$libdir into
+# a binary during linking. This must work even if \$libdir does
+# not exist.
+hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_CXX
+
+# Whether we need a single -rpath flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX
+
+# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the
+# resulting binary.
+hardcode_direct=$hardcode_direct_CXX
+
+# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
+# resulting binary.
+hardcode_minus_L=$hardcode_minus_L_CXX
+
+# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into
+# the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX
+
+# Set to yes if building a shared library automatically hardcodes DIR into the library
+# and all subsequent libraries and executables linked against it.
+hardcode_automatic=$hardcode_automatic_CXX
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at relink time.
+variables_saved_for_relink="$variables_saved_for_relink"
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs_CXX
+
+# Compile-time system search path for libraries
+sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
+
+# Run-time system search path for libraries
+sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
+
+# Fix the shell variable \$srcfile for the compiler.
+fix_srcfile_path=$lt_fix_srcfile_path
+
+# Set to yes if exported symbols are required.
+always_export_symbols=$always_export_symbols_CXX
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds_CXX
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms_CXX
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms_CXX
+
+# ### END LIBTOOL TAG CONFIG: $tagname
+
+__EOF__
+
+
+else
+ # If there is no Makefile yet, we rely on a make rule to execute
+ # `config.status --recheck' to rerun these tests and create the
+ # libtool script then.
+ ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'`
+ if test -f "$ltmain_in"; then
+ test -f Makefile && make "$ltmain"
+ fi
+fi
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+CC=$lt_save_CC
+LDCXX=$LD
+LD=$lt_save_LD
+GCC=$lt_save_GCC
+with_gnu_ldcxx=$with_gnu_ld
+with_gnu_ld=$lt_save_with_gnu_ld
+lt_cv_path_LDCXX=$lt_cv_path_LD
+lt_cv_path_LD=$lt_save_path_LD
+lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
+lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
+
+ else
+ tagname=""
+ fi
+ ;;
+
+ F77)
+ if test -n "$F77" && test "X$F77" != "Xno"; then
+
+ac_ext=f
+ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5'
+ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_f77_compiler_gnu
+
+
+archive_cmds_need_lc_F77=no
+allow_undefined_flag_F77=
+always_export_symbols_F77=no
+archive_expsym_cmds_F77=
+export_dynamic_flag_spec_F77=
+hardcode_direct_F77=no
+hardcode_libdir_flag_spec_F77=
+hardcode_libdir_flag_spec_ld_F77=
+hardcode_libdir_separator_F77=
+hardcode_minus_L_F77=no
+hardcode_automatic_F77=no
+module_cmds_F77=
+module_expsym_cmds_F77=
+link_all_deplibs_F77=unknown
+old_archive_cmds_F77=$old_archive_cmds
+no_undefined_flag_F77=
+whole_archive_flag_spec_F77=
+enable_shared_with_static_runtimes_F77=no
+
+# Source file extension for f77 test sources.
+ac_ext=f
+
+# Object file extension for compiled f77 test sources.
+objext=o
+objext_F77=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="\
+ subroutine t
+ return
+ end
+"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code="\
+ program t
+ end
+"
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+# save warnings/boilerplate of simple test code
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$rm conftest*
+
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$rm -r conftest*
+
+
+# Allow CC to be a program name with arguments.
+lt_save_CC="$CC"
+CC=${F77-"f77"}
+compiler=$CC
+compiler_F77=$CC
+for cc_temp in $compiler""; do
+ case $cc_temp in
+ compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+ distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+ \-*) ;;
+ *) break;;
+ esac
+done
+cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+
+
+{ $as_echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5
+$as_echo_n "checking if libtool supports shared libraries... " >&6; }
+{ $as_echo "$as_me:$LINENO: result: $can_build_shared" >&5
+$as_echo "$can_build_shared" >&6; }
+
+{ $as_echo "$as_me:$LINENO: checking whether to build shared libraries" >&5
+$as_echo_n "checking whether to build shared libraries... " >&6; }
+test "$can_build_shared" = "no" && enable_shared=no
+
+# On AIX, shared libraries and static libraries use the same namespace, and
+# are all built from PIC.
+case $host_os in
+aix3*)
+ test "$enable_shared" = yes && enable_static=no
+ if test -n "$RANLIB"; then
+ archive_cmds="$archive_cmds~\$RANLIB \$lib"
+ postinstall_cmds='$RANLIB $lib'
+ fi
+ ;;
+aix[4-9]*)
+ if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+ test "$enable_shared" = yes && enable_static=no
+ fi
+ ;;
+esac
+{ $as_echo "$as_me:$LINENO: result: $enable_shared" >&5
+$as_echo "$enable_shared" >&6; }
+
+{ $as_echo "$as_me:$LINENO: checking whether to build static libraries" >&5
+$as_echo_n "checking whether to build static libraries... " >&6; }
+# Make sure either enable_shared or enable_static is yes.
+test "$enable_shared" = yes || enable_static=yes
+{ $as_echo "$as_me:$LINENO: result: $enable_static" >&5
+$as_echo "$enable_static" >&6; }
+
+GCC_F77="$G77"
+LD_F77="$LD"
+
+lt_prog_compiler_wl_F77=
+lt_prog_compiler_pic_F77=
+lt_prog_compiler_static_F77=
+
+{ $as_echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5
+$as_echo_n "checking for $compiler option to produce PIC... " >&6; }
+
+ if test "$GCC" = yes; then
+ lt_prog_compiler_wl_F77='-Wl,'
+ lt_prog_compiler_static_F77='-static'
+
+ case $host_os in
+ aix*)
+ # All AIX code is PIC.
+ if test "$host_cpu" = ia64; then
+ # AIX 5 now supports IA64 processor
+ lt_prog_compiler_static_F77='-Bstatic'
+ fi
+ ;;
+
+ amigaos*)
+ # FIXME: we need at least 68020 code to build shared libraries, but
+ # adding the `-m68020' flag to GCC prevents building anything better,
+ # like `-m68040'.
+ lt_prog_compiler_pic_F77='-m68020 -resident32 -malways-restore-a4'
+ ;;
+
+ beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+ # PIC is the default for these OSes.
+ ;;
+
+ mingw* | cygwin* | pw32* | os2*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ # Although the cygwin gcc ignores -fPIC, still need this for old-style
+ # (--disable-auto-import) libraries
+ lt_prog_compiler_pic_F77='-DDLL_EXPORT'
+ ;;
+
+ darwin* | rhapsody*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ lt_prog_compiler_pic_F77='-fno-common'
+ ;;
+
+ interix[3-9]*)
+ # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+ # Instead, we relocate shared libraries at runtime.
+ ;;
+
+ msdosdjgpp*)
+ # Just because we use GCC doesn't mean we suddenly get shared libraries
+ # on systems that don't support them.
+ lt_prog_compiler_can_build_shared_F77=no
+ enable_shared=no
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ lt_prog_compiler_pic_F77=-Kconform_pic
+ fi
+ ;;
+
+ hpux*)
+ # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+ # not for PA HP-UX.
+ case $host_cpu in
+ hppa*64*|ia64*)
+ # +Z the default
+ ;;
+ *)
+ lt_prog_compiler_pic_F77='-fPIC'
+ ;;
+ esac
+ ;;
+
+ *)
+ lt_prog_compiler_pic_F77='-fPIC'
+ ;;
+ esac
+ else
+ # PORTME Check for flag to pass linker flags through the system compiler.
+ case $host_os in
+ aix*)
+ lt_prog_compiler_wl_F77='-Wl,'
+ if test "$host_cpu" = ia64; then
+ # AIX 5 now supports IA64 processor
+ lt_prog_compiler_static_F77='-Bstatic'
+ else
+ lt_prog_compiler_static_F77='-bnso -bI:/lib/syscalls.exp'
+ fi
+ ;;
+ darwin*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ case $cc_basename in
+ xlc*)
+ lt_prog_compiler_pic_F77='-qnocommon'
+ lt_prog_compiler_wl_F77='-Wl,'
+ ;;
+ esac
+ ;;
+
+ mingw* | cygwin* | pw32* | os2*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ lt_prog_compiler_pic_F77='-DDLL_EXPORT'
+ ;;
+
+ hpux9* | hpux10* | hpux11*)
+ lt_prog_compiler_wl_F77='-Wl,'
+ # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+ # not for PA HP-UX.
+ case $host_cpu in
+ hppa*64*|ia64*)
+ # +Z the default
+ ;;
+ *)
+ lt_prog_compiler_pic_F77='+Z'
+ ;;
+ esac
+ # Is there a better lt_prog_compiler_static that works with the bundled CC?
+ lt_prog_compiler_static_F77='${wl}-a ${wl}archive'
+ ;;
+
+ irix5* | irix6* | nonstopux*)
+ lt_prog_compiler_wl_F77='-Wl,'
+ # PIC (with -KPIC) is the default.
+ lt_prog_compiler_static_F77='-non_shared'
+ ;;
+
+ newsos6)
+ lt_prog_compiler_pic_F77='-KPIC'
+ lt_prog_compiler_static_F77='-Bstatic'
+ ;;
+
+ linux* | k*bsd*-gnu)
+ case $cc_basename in
+ icc* | ecc*)
+ lt_prog_compiler_wl_F77='-Wl,'
+ lt_prog_compiler_pic_F77='-KPIC'
+ lt_prog_compiler_static_F77='-static'
+ ;;
+ pgcc* | pgf77* | pgf90* | pgf95*)
+ # Portland Group compilers (*not* the Pentium gcc compiler,
+ # which looks to be a dead project)
+ lt_prog_compiler_wl_F77='-Wl,'
+ lt_prog_compiler_pic_F77='-fpic'
+ lt_prog_compiler_static_F77='-Bstatic'
+ ;;
+ ccc*)
+ lt_prog_compiler_wl_F77='-Wl,'
+ # All Alpha code is PIC.
+ lt_prog_compiler_static_F77='-non_shared'
+ ;;
+ *)
+ case `$CC -V 2>&1 | sed 5q` in
+ *Sun\ C*)
+ # Sun C 5.9
+ lt_prog_compiler_pic_F77='-KPIC'
+ lt_prog_compiler_static_F77='-Bstatic'
+ lt_prog_compiler_wl_F77='-Wl,'
+ ;;
+ *Sun\ F*)
+ # Sun Fortran 8.3 passes all unrecognized flags to the linker
+ lt_prog_compiler_pic_F77='-KPIC'
+ lt_prog_compiler_static_F77='-Bstatic'
+ lt_prog_compiler_wl_F77=''
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+
+ osf3* | osf4* | osf5*)
+ lt_prog_compiler_wl_F77='-Wl,'
+ # All OSF/1 code is PIC.
+ lt_prog_compiler_static_F77='-non_shared'
+ ;;
+
+ rdos*)
+ lt_prog_compiler_static_F77='-non_shared'
+ ;;
+
+ solaris*)
+ lt_prog_compiler_pic_F77='-KPIC'
+ lt_prog_compiler_static_F77='-Bstatic'
+ case $cc_basename in
+ f77* | f90* | f95*)
+ lt_prog_compiler_wl_F77='-Qoption ld ';;
+ *)
+ lt_prog_compiler_wl_F77='-Wl,';;
+ esac
+ ;;
+
+ sunos4*)
+ lt_prog_compiler_wl_F77='-Qoption ld '
+ lt_prog_compiler_pic_F77='-PIC'
+ lt_prog_compiler_static_F77='-Bstatic'
+ ;;
+
+ sysv4 | sysv4.2uw2* | sysv4.3*)
+ lt_prog_compiler_wl_F77='-Wl,'
+ lt_prog_compiler_pic_F77='-KPIC'
+ lt_prog_compiler_static_F77='-Bstatic'
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec ;then
+ lt_prog_compiler_pic_F77='-Kconform_pic'
+ lt_prog_compiler_static_F77='-Bstatic'
+ fi
+ ;;
+
+ sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+ lt_prog_compiler_wl_F77='-Wl,'
+ lt_prog_compiler_pic_F77='-KPIC'
+ lt_prog_compiler_static_F77='-Bstatic'
+ ;;
+
+ unicos*)
+ lt_prog_compiler_wl_F77='-Wl,'
+ lt_prog_compiler_can_build_shared_F77=no
+ ;;
+
+ uts4*)
+ lt_prog_compiler_pic_F77='-pic'
+ lt_prog_compiler_static_F77='-Bstatic'
+ ;;
+
+ *)
+ lt_prog_compiler_can_build_shared_F77=no
+ ;;
+ esac
+ fi
+
+{ $as_echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_F77" >&5
+$as_echo "$lt_prog_compiler_pic_F77" >&6; }
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic_F77"; then
+
+{ $as_echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works" >&5
+$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works... " >&6; }
+if test "${lt_cv_prog_compiler_pic_works_F77+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_prog_compiler_pic_works_F77=no
+ ac_outfile=conftest.$ac_objext
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+ lt_compiler_flag="$lt_prog_compiler_pic_F77"
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ # The option is referenced via a variable to avoid confusing sed.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:14862: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&5
+ echo "$as_me:14866: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s "$ac_outfile"; then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings other than the usual output.
+ $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_pic_works_F77=yes
+ fi
+ fi
+ $rm conftest*
+
+fi
+{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_pic_works_F77" >&5
+$as_echo "$lt_cv_prog_compiler_pic_works_F77" >&6; }
+
+if test x"$lt_cv_prog_compiler_pic_works_F77" = xyes; then
+ case $lt_prog_compiler_pic_F77 in
+ "" | " "*) ;;
+ *) lt_prog_compiler_pic_F77=" $lt_prog_compiler_pic_F77" ;;
+ esac
+else
+ lt_prog_compiler_pic_F77=
+ lt_prog_compiler_can_build_shared_F77=no
+fi
+
+fi
+case $host_os in
+ # For platforms which do not support PIC, -DPIC is meaningless:
+ *djgpp*)
+ lt_prog_compiler_pic_F77=
+ ;;
+ *)
+ lt_prog_compiler_pic_F77="$lt_prog_compiler_pic_F77"
+ ;;
+esac
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$lt_prog_compiler_wl_F77 eval lt_tmp_static_flag=\"$lt_prog_compiler_static_F77\"
+{ $as_echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
+if test "${lt_cv_prog_compiler_static_works_F77+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_prog_compiler_static_works_F77=no
+ save_LDFLAGS="$LDFLAGS"
+ LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
+ echo "$lt_simple_link_test_code" > conftest.$ac_ext
+ if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+ # The linker can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ if test -s conftest.err; then
+ # Append any errors to the config.log.
+ cat conftest.err 1>&5
+ $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if diff conftest.exp conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_static_works_F77=yes
+ fi
+ else
+ lt_cv_prog_compiler_static_works_F77=yes
+ fi
+ fi
+ $rm -r conftest*
+ LDFLAGS="$save_LDFLAGS"
+
+fi
+{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_static_works_F77" >&5
+$as_echo "$lt_cv_prog_compiler_static_works_F77" >&6; }
+
+if test x"$lt_cv_prog_compiler_static_works_F77" = xyes; then
+ :
+else
+ lt_prog_compiler_static_F77=
+fi
+
+
+{ $as_echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5
+$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if test "${lt_cv_prog_compiler_c_o_F77+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_prog_compiler_c_o_F77=no
+ $rm -r conftest 2>/dev/null
+ mkdir conftest
+ cd conftest
+ mkdir out
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ lt_compiler_flag="-o out/conftest2.$ac_objext"
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:14966: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>out/conftest.err)
+ ac_status=$?
+ cat out/conftest.err >&5
+ echo "$as_me:14970: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s out/conftest2.$ac_objext
+ then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp
+ $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+ if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_c_o_F77=yes
+ fi
+ fi
+ chmod u+w . 2>&5
+ $rm conftest*
+ # SGI C++ compiler will create directory out/ii_files/ for
+ # template instantiation
+ test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files
+ $rm out/* && rmdir out
+ cd ..
+ rmdir conftest
+ $rm conftest*
+
+fi
+{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_F77" >&5
+$as_echo "$lt_cv_prog_compiler_c_o_F77" >&6; }
+
+
+hard_links="nottested"
+if test "$lt_cv_prog_compiler_c_o_F77" = no && test "$need_locks" != no; then
+ # do not overwrite the value of need_locks provided by the user
+ { $as_echo "$as_me:$LINENO: checking if we can lock with hard links" >&5
+$as_echo_n "checking if we can lock with hard links... " >&6; }
+ hard_links=yes
+ $rm conftest*
+ ln conftest.a conftest.b 2>/dev/null && hard_links=no
+ touch conftest.a
+ ln conftest.a conftest.b 2>&5 || hard_links=no
+ ln conftest.a conftest.b 2>/dev/null && hard_links=no
+ { $as_echo "$as_me:$LINENO: result: $hard_links" >&5
+$as_echo "$hard_links" >&6; }
+ if test "$hard_links" = no; then
+ { $as_echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
+$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
+ need_locks=warn
+ fi
+else
+ need_locks=no
+fi
+
+{ $as_echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
+
+ runpath_var=
+ allow_undefined_flag_F77=
+ enable_shared_with_static_runtimes_F77=no
+ archive_cmds_F77=
+ archive_expsym_cmds_F77=
+ old_archive_From_new_cmds_F77=
+ old_archive_from_expsyms_cmds_F77=
+ export_dynamic_flag_spec_F77=
+ whole_archive_flag_spec_F77=
+ thread_safe_flag_spec_F77=
+ hardcode_libdir_flag_spec_F77=
+ hardcode_libdir_flag_spec_ld_F77=
+ hardcode_libdir_separator_F77=
+ hardcode_direct_F77=no
+ hardcode_minus_L_F77=no
+ hardcode_shlibpath_var_F77=unsupported
+ link_all_deplibs_F77=unknown
+ hardcode_automatic_F77=no
+ module_cmds_F77=
+ module_expsym_cmds_F77=
+ always_export_symbols_F77=no
+ export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+ # include_expsyms should be a list of space-separated symbols to be *always*
+ # included in the symbol list
+ include_expsyms_F77=
+ # exclude_expsyms can be an extended regexp of symbols to exclude
+ # it will be wrapped by ` (' and `)$', so one must not match beginning or
+ # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
+ # as well as any symbol that contains `d'.
+ exclude_expsyms_F77='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
+ # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+ # platforms (ab)use it in PIC code, but their linkers get confused if
+ # the symbol is explicitly referenced. Since portable code cannot
+ # rely on this symbol name, it's probably fine to never include it in
+ # preloaded symbol tables.
+ # Exclude shared library initialization/finalization symbols.
+ extract_expsyms_cmds=
+ # Just being paranoid about ensuring that cc_basename is set.
+ for cc_temp in $compiler""; do
+ case $cc_temp in
+ compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+ distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+ \-*) ;;
+ *) break;;
+ esac
+done
+cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+
+ case $host_os in
+ cygwin* | mingw* | pw32*)
+ # FIXME: the MSVC++ port hasn't been tested in a loooong time
+ # When not using gcc, we currently assume that we are using
+ # Microsoft Visual C++.
+ if test "$GCC" != yes; then
+ with_gnu_ld=no
+ fi
+ ;;
+ interix*)
+ # we just hope/assume this is gcc and not c89 (= MSVC++)
+ with_gnu_ld=yes
+ ;;
+ openbsd*)
+ with_gnu_ld=no
+ ;;
+ esac
+
+ ld_shlibs_F77=yes
+ if test "$with_gnu_ld" = yes; then
+ # If archive_cmds runs LD, not CC, wlarc should be empty
+ wlarc='${wl}'
+
+ # Set some defaults for GNU ld with shared library support. These
+ # are reset later if shared libraries are not supported. Putting them
+ # here allows them to be overridden if necessary.
+ runpath_var=LD_RUN_PATH
+ hardcode_libdir_flag_spec_F77='${wl}--rpath ${wl}$libdir'
+ export_dynamic_flag_spec_F77='${wl}--export-dynamic'
+ # ancient GNU ld didn't support --whole-archive et. al.
+ if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then
+ whole_archive_flag_spec_F77="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+ else
+ whole_archive_flag_spec_F77=
+ fi
+ supports_anon_versioning=no
+ case `$LD -v 2>/dev/null` in
+ *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
+ *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
+ *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
+ *\ 2.11.*) ;; # other 2.11 versions
+ *) supports_anon_versioning=yes ;;
+ esac
+
+ # See if GNU ld supports shared libraries.
+ case $host_os in
+ aix[3-9]*)
+ # On AIX/PPC, the GNU linker is very broken
+ if test "$host_cpu" != ia64; then
+ ld_shlibs_F77=no
+ cat <<EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.9.1, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support. If you
+*** really care for shared libraries, you may want to modify your PATH
+*** so that a non-GNU linker is found, and then restart.
+
+EOF
+ fi
+ ;;
+
+ amigaos*)
+ archive_cmds_F77='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+ hardcode_libdir_flag_spec_F77='-L$libdir'
+ hardcode_minus_L_F77=yes
+
+ # Samuel A. Falvo II <kc5tja@dolphin.openprojects.net> reports
+ # that the semantics of dynamic libraries on AmigaOS, at least up
+ # to version 4, is to share data among multiple programs linked
+ # with the same dynamic library. Since this doesn't match the
+ # behavior of shared libraries on other platforms, we can't use
+ # them.
+ ld_shlibs_F77=no
+ ;;
+
+ beos*)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ allow_undefined_flag_F77=unsupported
+ # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+ # support --undefined. This deserves some investigation. FIXME
+ archive_cmds_F77='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ else
+ ld_shlibs_F77=no
+ fi
+ ;;
+
+ cygwin* | mingw* | pw32*)
+ # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, F77) is actually meaningless,
+ # as there is no search path for DLLs.
+ hardcode_libdir_flag_spec_F77='-L$libdir'
+ allow_undefined_flag_F77=unsupported
+ always_export_symbols_F77=no
+ enable_shared_with_static_runtimes_F77=yes
+ export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/'\'' -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols'
+
+ if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
+ archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+ # If the export-symbols file already is a .def file (1st line
+ # is EXPORTS), use it as is; otherwise, prepend...
+ archive_expsym_cmds_F77='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+ cp $export_symbols $output_objdir/$soname.def;
+ else
+ echo EXPORTS > $output_objdir/$soname.def;
+ cat $export_symbols >> $output_objdir/$soname.def;
+ fi~
+ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+ else
+ ld_shlibs_F77=no
+ fi
+ ;;
+
+ interix[3-9]*)
+ hardcode_direct_F77=no
+ hardcode_shlibpath_var_F77=no
+ hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir'
+ export_dynamic_flag_spec_F77='${wl}-E'
+ # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+ # Instead, shared libraries are loaded at an image base (0x10000000 by
+ # default) and relocated if they conflict, which is a slow very memory
+ # consuming and fragmenting process. To avoid this, we pick a random,
+ # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+ # time. Moving up from 0x10000000 also allows more sbrk(2) space.
+ archive_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+ archive_expsym_cmds_F77='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+ ;;
+
+ gnu* | linux* | k*bsd*-gnu)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ tmp_addflag=
+ case $cc_basename,$host_cpu in
+ pgcc*) # Portland Group C compiler
+ whole_archive_flag_spec_F77='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
+ tmp_addflag=' $pic_flag'
+ ;;
+ pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers
+ whole_archive_flag_spec_F77='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
+ tmp_addflag=' $pic_flag -Mnomain' ;;
+ ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64
+ tmp_addflag=' -i_dynamic' ;;
+ efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64
+ tmp_addflag=' -i_dynamic -nofor_main' ;;
+ ifc* | ifort*) # Intel Fortran compiler
+ tmp_addflag=' -nofor_main' ;;
+ esac
+ case `$CC -V 2>&1 | sed 5q` in
+ *Sun\ C*) # Sun C 5.9
+ whole_archive_flag_spec_F77='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
+ tmp_sharedflag='-G' ;;
+ *Sun\ F*) # Sun Fortran 8.3
+ tmp_sharedflag='-G' ;;
+ *)
+ tmp_sharedflag='-shared' ;;
+ esac
+ archive_cmds_F77='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+
+ if test $supports_anon_versioning = yes; then
+ archive_expsym_cmds_F77='$echo "{ global:" > $output_objdir/$libname.ver~
+ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+ $echo "local: *; };" >> $output_objdir/$libname.ver~
+ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+ fi
+ else
+ ld_shlibs_F77=no
+ fi
+ ;;
+
+ netbsd*)
+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+ archive_cmds_F77='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+ wlarc=
+ else
+ archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ fi
+ ;;
+
+ solaris*)
+ if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then
+ ld_shlibs_F77=no
+ cat <<EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems. Therefore, libtool
+*** is disabling shared libraries support. We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer. Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+EOF
+ elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ else
+ ld_shlibs_F77=no
+ fi
+ ;;
+
+ sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+ case `$LD -v 2>&1` in
+ *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
+ ld_shlibs_F77=no
+ cat <<_LT_EOF 1>&2
+
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
+*** reliably create shared libraries on SCO systems. Therefore, libtool
+*** is disabling shared libraries support. We urge you to upgrade GNU
+*** binutils to release 2.16.91.0.3 or newer. Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+ ;;
+ *)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ hardcode_libdir_flag_spec_F77='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`'
+ archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib'
+ archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib'
+ else
+ ld_shlibs_F77=no
+ fi
+ ;;
+ esac
+ ;;
+
+ sunos4*)
+ archive_cmds_F77='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ wlarc=
+ hardcode_direct_F77=yes
+ hardcode_shlibpath_var_F77=no
+ ;;
+
+ *)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ else
+ ld_shlibs_F77=no
+ fi
+ ;;
+ esac
+
+ if test "$ld_shlibs_F77" = no; then
+ runpath_var=
+ hardcode_libdir_flag_spec_F77=
+ export_dynamic_flag_spec_F77=
+ whole_archive_flag_spec_F77=
+ fi
+ else
+ # PORTME fill in a description of your system's linker (not GNU ld)
+ case $host_os in
+ aix3*)
+ allow_undefined_flag_F77=unsupported
+ always_export_symbols_F77=yes
+ archive_expsym_cmds_F77='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+ # Note: this linker hardcodes the directories in LIBPATH if there
+ # are no directories specified by -L.
+ hardcode_minus_L_F77=yes
+ if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
+ # Neither direct hardcoding nor static linking is supported with a
+ # broken collect2.
+ hardcode_direct_F77=unsupported
+ fi
+ ;;
+
+ aix[4-9]*)
+ if test "$host_cpu" = ia64; then
+ # On IA64, the linker does run time linking by default, so we don't
+ # have to do anything special.
+ aix_use_runtimelinking=no
+ exp_sym_flag='-Bexport'
+ no_entry_flag=""
+ else
+ # If we're using GNU nm, then we don't want the "-C" option.
+ # -C means demangle to AIX nm, but means don't demangle with GNU nm
+ if $NM -V 2>&1 | grep 'GNU' > /dev/null; then
+ export_symbols_cmds_F77='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols'
+ else
+ export_symbols_cmds_F77='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols'
+ fi
+ aix_use_runtimelinking=no
+
+ # Test if we are trying to use run time linking or normal
+ # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+ # need to do runtime linking.
+ case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
+ for ld_flag in $LDFLAGS; do
+ if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+ aix_use_runtimelinking=yes
+ break
+ fi
+ done
+ ;;
+ esac
+
+ exp_sym_flag='-bexport'
+ no_entry_flag='-bnoentry'
+ fi
+
+ # When large executables or shared objects are built, AIX ld can
+ # have problems creating the table of contents. If linking a library
+ # or program results in "error TOC overflow" add -mminimal-toc to
+ # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not
+ # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+ archive_cmds_F77=''
+ hardcode_direct_F77=yes
+ hardcode_libdir_separator_F77=':'
+ link_all_deplibs_F77=yes
+
+ if test "$GCC" = yes; then
+ case $host_os in aix4.[012]|aix4.[012].*)
+ # We only want to do this on AIX 4.2 and lower, the check
+ # below for broken collect2 doesn't work under 4.3+
+ collect2name=`${CC} -print-prog-name=collect2`
+ if test -f "$collect2name" && \
+ strings "$collect2name" | grep resolve_lib_name >/dev/null
+ then
+ # We have reworked collect2
+ :
+ else
+ # We have old collect2
+ hardcode_direct_F77=unsupported
+ # It fails to find uninstalled libraries when the uninstalled
+ # path is not listed in the libpath. Setting hardcode_minus_L
+ # to unsupported forces relinking
+ hardcode_minus_L_F77=yes
+ hardcode_libdir_flag_spec_F77='-L$libdir'
+ hardcode_libdir_separator_F77=
+ fi
+ ;;
+ esac
+ shared_flag='-shared'
+ if test "$aix_use_runtimelinking" = yes; then
+ shared_flag="$shared_flag "'${wl}-G'
+ fi
+ else
+ # not using gcc
+ if test "$host_cpu" = ia64; then
+ # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+ # chokes on -Wl,-G. The following line is correct:
+ shared_flag='-G'
+ else
+ if test "$aix_use_runtimelinking" = yes; then
+ shared_flag='${wl}-G'
+ else
+ shared_flag='${wl}-bM:SRE'
+ fi
+ fi
+ fi
+
+ # It seems that -bexpall does not export symbols beginning with
+ # underscore (_), so it is better to generate a list of symbols to export.
+ always_export_symbols_F77=yes
+ if test "$aix_use_runtimelinking" = yes; then
+ # Warning - without using the other runtime loading flags (-brtl),
+ # -berok will link without error, but may produce a broken library.
+ allow_undefined_flag_F77='-berok'
+ # Determine the default libpath from the value encoded in an empty executable.
+ cat >conftest.$ac_ext <<_ACEOF
+ program main
+
+ end
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_f77_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext && {
+ test "$cross_compiling" = yes ||
+ $as_test_x conftest$ac_exeext
+ }; then
+
+lt_aix_libpath_sed='
+ /Import File Strings/,/^$/ {
+ /^0/ {
+ s/^0 *\(.*\)$/\1/
+ p
+ }
+ }'
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then
+ aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+fi
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -rf conftest.dSYM
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+ conftest$ac_exeext conftest.$ac_ext
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+
+ hardcode_libdir_flag_spec_F77='${wl}-blibpath:$libdir:'"$aix_libpath"
+ archive_expsym_cmds_F77="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+ else
+ if test "$host_cpu" = ia64; then
+ hardcode_libdir_flag_spec_F77='${wl}-R $libdir:/usr/lib:/lib'
+ allow_undefined_flag_F77="-z nodefs"
+ archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+ else
+ # Determine the default libpath from the value encoded in an empty executable.
+ cat >conftest.$ac_ext <<_ACEOF
+ program main
+
+ end
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_f77_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext && {
+ test "$cross_compiling" = yes ||
+ $as_test_x conftest$ac_exeext
+ }; then
+
+lt_aix_libpath_sed='
+ /Import File Strings/,/^$/ {
+ /^0/ {
+ s/^0 *\(.*\)$/\1/
+ p
+ }
+ }'
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then
+ aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+fi
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -rf conftest.dSYM
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+ conftest$ac_exeext conftest.$ac_ext
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+
+ hardcode_libdir_flag_spec_F77='${wl}-blibpath:$libdir:'"$aix_libpath"
+ # Warning - without using the other run time loading flags,
+ # -berok will link without error, but may produce a broken library.
+ no_undefined_flag_F77=' ${wl}-bernotok'
+ allow_undefined_flag_F77=' ${wl}-berok'
+ # Exported symbols can be pulled into shared objects from archives
+ whole_archive_flag_spec_F77='$convenience'
+ archive_cmds_need_lc_F77=yes
+ # This is similar to how AIX traditionally builds its shared libraries.
+ archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+ fi
+ fi
+ ;;
+
+ amigaos*)
+ archive_cmds_F77='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+ hardcode_libdir_flag_spec_F77='-L$libdir'
+ hardcode_minus_L_F77=yes
+ # see comment about different semantics on the GNU ld section
+ ld_shlibs_F77=no
+ ;;
+
+ bsdi[45]*)
+ export_dynamic_flag_spec_F77=-rdynamic
+ ;;
+
+ cygwin* | mingw* | pw32*)
+ # When not using gcc, we currently assume that we are using
+ # Microsoft Visual C++.
+ # hardcode_libdir_flag_spec is actually meaningless, as there is
+ # no search path for DLLs.
+ hardcode_libdir_flag_spec_F77=' '
+ allow_undefined_flag_F77=unsupported
+ # Tell ltmain to make .lib files, not .a files.
+ libext=lib
+ # Tell ltmain to make .dll files, not .so files.
+ shrext_cmds=".dll"
+ # FIXME: Setting linknames here is a bad hack.
+ archive_cmds_F77='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames='
+ # The linker will automatically build a .lib file if we build a DLL.
+ old_archive_From_new_cmds_F77='true'
+ # FIXME: Should let the user specify the lib program.
+ old_archive_cmds_F77='lib -OUT:$oldlib$oldobjs$old_deplibs'
+ fix_srcfile_path_F77='`cygpath -w "$srcfile"`'
+ enable_shared_with_static_runtimes_F77=yes
+ ;;
+
+ darwin* | rhapsody*)
+ case $host_os in
+ rhapsody* | darwin1.[012])
+ allow_undefined_flag_F77='${wl}-undefined ${wl}suppress'
+ ;;
+ *) # Darwin 1.3 on
+ if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then
+ allow_undefined_flag_F77='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
+ else
+ case ${MACOSX_DEPLOYMENT_TARGET} in
+ 10.[012])
+ allow_undefined_flag_F77='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
+ ;;
+ 10.*)
+ allow_undefined_flag_F77='${wl}-undefined ${wl}dynamic_lookup'
+ ;;
+ esac
+ fi
+ ;;
+ esac
+ archive_cmds_need_lc_F77=no
+ hardcode_direct_F77=no
+ hardcode_automatic_F77=yes
+ hardcode_shlibpath_var_F77=unsupported
+ whole_archive_flag_spec_F77=''
+ link_all_deplibs_F77=yes
+ if test "$GCC" = yes ; then
+ output_verbose_link_cmd='echo'
+ archive_cmds_F77="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
+ module_cmds_F77="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
+ archive_expsym_cmds_F77="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
+ module_expsym_cmds_F77="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
+ else
+ case $cc_basename in
+ xlc*)
+ output_verbose_link_cmd='echo'
+ archive_cmds_F77='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $xlcverstring'
+ module_cmds_F77='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
+ archive_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $xlcverstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ module_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ ;;
+ *)
+ ld_shlibs_F77=no
+ ;;
+ esac
+ fi
+ ;;
+
+ dgux*)
+ archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_libdir_flag_spec_F77='-L$libdir'
+ hardcode_shlibpath_var_F77=no
+ ;;
+
+ freebsd1*)
+ ld_shlibs_F77=no
+ ;;
+
+ # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+ # support. Future versions do this automatically, but an explicit c++rt0.o
+ # does not break anything, and helps significantly (at the cost of a little
+ # extra space).
+ freebsd2.2*)
+ archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+ hardcode_libdir_flag_spec_F77='-R$libdir'
+ hardcode_direct_F77=yes
+ hardcode_shlibpath_var_F77=no
+ ;;
+
+ # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+ freebsd2*)
+ archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct_F77=yes
+ hardcode_minus_L_F77=yes
+ hardcode_shlibpath_var_F77=no
+ ;;
+
+ # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+ freebsd* | dragonfly*)
+ archive_cmds_F77='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
+ hardcode_libdir_flag_spec_F77='-R$libdir'
+ hardcode_direct_F77=yes
+ hardcode_shlibpath_var_F77=no
+ ;;
+
+ hpux9*)
+ if test "$GCC" = yes; then
+ archive_cmds_F77='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+ else
+ archive_cmds_F77='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+ fi
+ hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir'
+ hardcode_libdir_separator_F77=:
+ hardcode_direct_F77=yes
+
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L_F77=yes
+ export_dynamic_flag_spec_F77='${wl}-E'
+ ;;
+
+ hpux10*)
+ if test "$GCC" = yes -a "$with_gnu_ld" = no; then
+ archive_cmds_F77='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds_F77='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+ fi
+ if test "$with_gnu_ld" = no; then
+ hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir'
+ hardcode_libdir_separator_F77=:
+
+ hardcode_direct_F77=yes
+ export_dynamic_flag_spec_F77='${wl}-E'
+
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L_F77=yes
+ fi
+ ;;
+
+ hpux11*)
+ if test "$GCC" = yes -a "$with_gnu_ld" = no; then
+ case $host_cpu in
+ hppa*64*)
+ archive_cmds_F77='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ ia64*)
+ archive_cmds_F77='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+ archive_cmds_F77='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ esac
+ else
+ case $host_cpu in
+ hppa*64*)
+ archive_cmds_F77='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ ia64*)
+ archive_cmds_F77='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+ archive_cmds_F77='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ esac
+ fi
+ if test "$with_gnu_ld" = no; then
+ hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir'
+ hardcode_libdir_separator_F77=:
+
+ case $host_cpu in
+ hppa*64*|ia64*)
+ hardcode_libdir_flag_spec_ld_F77='+b $libdir'
+ hardcode_direct_F77=no
+ hardcode_shlibpath_var_F77=no
+ ;;
+ *)
+ hardcode_direct_F77=yes
+ export_dynamic_flag_spec_F77='${wl}-E'
+
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L_F77=yes
+ ;;
+ esac
+ fi
+ ;;
+
+ irix5* | irix6* | nonstopux*)
+ if test "$GCC" = yes; then
+ archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ else
+ archive_cmds_F77='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+ hardcode_libdir_flag_spec_ld_F77='-rpath $libdir'
+ fi
+ hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator_F77=:
+ link_all_deplibs_F77=yes
+ ;;
+
+ netbsd*)
+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+ archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out
+ else
+ archive_cmds_F77='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF
+ fi
+ hardcode_libdir_flag_spec_F77='-R$libdir'
+ hardcode_direct_F77=yes
+ hardcode_shlibpath_var_F77=no
+ ;;
+
+ newsos6)
+ archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct_F77=yes
+ hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator_F77=:
+ hardcode_shlibpath_var_F77=no
+ ;;
+
+ openbsd*)
+ if test -f /usr/libexec/ld.so; then
+ hardcode_direct_F77=yes
+ hardcode_shlibpath_var_F77=no
+ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+ archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
+ hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir'
+ export_dynamic_flag_spec_F77='${wl}-E'
+ else
+ case $host_os in
+ openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
+ archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_libdir_flag_spec_F77='-R$libdir'
+ ;;
+ *)
+ archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir'
+ ;;
+ esac
+ fi
+ else
+ ld_shlibs_F77=no
+ fi
+ ;;
+
+ os2*)
+ hardcode_libdir_flag_spec_F77='-L$libdir'
+ hardcode_minus_L_F77=yes
+ allow_undefined_flag_F77=unsupported
+ archive_cmds_F77='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
+ old_archive_From_new_cmds_F77='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+ ;;
+
+ osf3*)
+ if test "$GCC" = yes; then
+ allow_undefined_flag_F77=' ${wl}-expect_unresolved ${wl}\*'
+ archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ else
+ allow_undefined_flag_F77=' -expect_unresolved \*'
+ archive_cmds_F77='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+ fi
+ hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator_F77=:
+ ;;
+
+ osf4* | osf5*) # as osf3* with the addition of -msym flag
+ if test "$GCC" = yes; then
+ allow_undefined_flag_F77=' ${wl}-expect_unresolved ${wl}\*'
+ archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir'
+ else
+ allow_undefined_flag_F77=' -expect_unresolved \*'
+ archive_cmds_F77='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+ archive_expsym_cmds_F77='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~
+ $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp'
+
+ # Both c and cxx compiler support -rpath directly
+ hardcode_libdir_flag_spec_F77='-rpath $libdir'
+ fi
+ hardcode_libdir_separator_F77=:
+ ;;
+
+ solaris*)
+ no_undefined_flag_F77=' -z text'
+ if test "$GCC" = yes; then
+ wlarc='${wl}'
+ archive_cmds_F77='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+ $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp'
+ else
+ wlarc=''
+ archive_cmds_F77='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp'
+ fi
+ hardcode_libdir_flag_spec_F77='-R$libdir'
+ hardcode_shlibpath_var_F77=no
+ case $host_os in
+ solaris2.[0-5] | solaris2.[0-5].*) ;;
+ *)
+ # The compiler driver will combine and reorder linker options,
+ # but understands `-z linker_flag'. GCC discards it without `$wl',
+ # but is careful enough not to reorder.
+ # Supported since Solaris 2.6 (maybe 2.5.1?)
+ if test "$GCC" = yes; then
+ whole_archive_flag_spec_F77='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+ else
+ whole_archive_flag_spec_F77='-z allextract$convenience -z defaultextract'
+ fi
+ ;;
+ esac
+ link_all_deplibs_F77=yes
+ ;;
+
+ sunos4*)
+ if test "x$host_vendor" = xsequent; then
+ # Use $CC to link under sequent, because it throws in some extra .o
+ # files that make .init and .fini sections work.
+ archive_cmds_F77='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds_F77='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+ fi
+ hardcode_libdir_flag_spec_F77='-L$libdir'
+ hardcode_direct_F77=yes
+ hardcode_minus_L_F77=yes
+ hardcode_shlibpath_var_F77=no
+ ;;
+
+ sysv4)
+ case $host_vendor in
+ sni)
+ archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct_F77=yes # is this really true???
+ ;;
+ siemens)
+ ## LD is ld it makes a PLAMLIB
+ ## CC just makes a GrossModule.
+ archive_cmds_F77='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+ reload_cmds_F77='$CC -r -o $output$reload_objs'
+ hardcode_direct_F77=no
+ ;;
+ motorola)
+ archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct_F77=no #Motorola manual says yes, but my tests say they lie
+ ;;
+ esac
+ runpath_var='LD_RUN_PATH'
+ hardcode_shlibpath_var_F77=no
+ ;;
+
+ sysv4.3*)
+ archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_shlibpath_var_F77=no
+ export_dynamic_flag_spec_F77='-Bexport'
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_shlibpath_var_F77=no
+ runpath_var=LD_RUN_PATH
+ hardcode_runpath_var=yes
+ ld_shlibs_F77=yes
+ fi
+ ;;
+
+ sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
+ no_undefined_flag_F77='${wl}-z,text'
+ archive_cmds_need_lc_F77=no
+ hardcode_shlibpath_var_F77=no
+ runpath_var='LD_RUN_PATH'
+
+ if test "$GCC" = yes; then
+ archive_cmds_F77='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_F77='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds_F77='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_F77='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ fi
+ ;;
+
+ sysv5* | sco3.2v5* | sco5v6*)
+ # Note: We can NOT use -z defs as we might desire, because we do not
+ # link with -lc, and that would cause any symbols used from libc to
+ # always be unresolved, which means just about no library would
+ # ever link correctly. If we're not using GNU ld we use -z text
+ # though, which does catch some bad symbols but isn't as heavy-handed
+ # as -z defs.
+ no_undefined_flag_F77='${wl}-z,text'
+ allow_undefined_flag_F77='${wl}-z,nodefs'
+ archive_cmds_need_lc_F77=no
+ hardcode_shlibpath_var_F77=no
+ hardcode_libdir_flag_spec_F77='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`'
+ hardcode_libdir_separator_F77=':'
+ link_all_deplibs_F77=yes
+ export_dynamic_flag_spec_F77='${wl}-Bexport'
+ runpath_var='LD_RUN_PATH'
+
+ if test "$GCC" = yes; then
+ archive_cmds_F77='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_F77='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds_F77='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_F77='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ fi
+ ;;
+
+ uts4*)
+ archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_libdir_flag_spec_F77='-L$libdir'
+ hardcode_shlibpath_var_F77=no
+ ;;
+
+ *)
+ ld_shlibs_F77=no
+ ;;
+ esac
+ fi
+
+{ $as_echo "$as_me:$LINENO: result: $ld_shlibs_F77" >&5
+$as_echo "$ld_shlibs_F77" >&6; }
+test "$ld_shlibs_F77" = no && can_build_shared=no
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$archive_cmds_need_lc_F77" in
+x|xyes)
+ # Assume -lc should be added
+ archive_cmds_need_lc_F77=yes
+
+ if test "$enable_shared" = yes && test "$GCC" = yes; then
+ case $archive_cmds_F77 in
+ *'~'*)
+ # FIXME: we may have to deal with multi-command sequences.
+ ;;
+ '$CC '*)
+ # Test whether the compiler implicitly links with -lc since on some
+ # systems, -lgcc has to come before -lc. If gcc already passes -lc
+ # to ld, don't add -lc before -lgcc.
+ { $as_echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5
+$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; }
+ $rm conftest*
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } 2>conftest.err; then
+ soname=conftest
+ lib=conftest
+ libobjs=conftest.$ac_objext
+ deplibs=
+ wl=$lt_prog_compiler_wl_F77
+ pic_flag=$lt_prog_compiler_pic_F77
+ compiler_flags=-v
+ linker_flags=-v
+ verstring=
+ output_objdir=.
+ libname=conftest
+ lt_save_allow_undefined_flag=$allow_undefined_flag_F77
+ allow_undefined_flag_F77=
+ if { (eval echo "$as_me:$LINENO: \"$archive_cmds_F77 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5
+ (eval $archive_cmds_F77 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+ then
+ archive_cmds_need_lc_F77=no
+ else
+ archive_cmds_need_lc_F77=yes
+ fi
+ allow_undefined_flag_F77=$lt_save_allow_undefined_flag
+ else
+ cat conftest.err 1>&5
+ fi
+ $rm conftest*
+ { $as_echo "$as_me:$LINENO: result: $archive_cmds_need_lc_F77" >&5
+$as_echo "$archive_cmds_need_lc_F77" >&6; }
+ ;;
+ esac
+ fi
+ ;;
+esac
+
+{ $as_echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5
+$as_echo_n "checking dynamic linker characteristics... " >&6; }
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=".so"
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+case $host_os in
+aix3*)
+ version_type=linux
+ library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+ shlibpath_var=LIBPATH
+
+ # AIX 3 has no versioning support, so we append a major version to the name.
+ soname_spec='${libname}${release}${shared_ext}$major'
+ ;;
+
+aix[4-9]*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ hardcode_into_libs=yes
+ if test "$host_cpu" = ia64; then
+ # AIX 5 supports IA64
+ library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+ shlibpath_var=LD_LIBRARY_PATH
+ else
+ # With GCC up to 2.95.x, collect2 would create an import file
+ # for dependence libraries. The import file would start with
+ # the line `#! .'. This would cause the generated library to
+ # depend on `.', always an invalid library. This was fixed in
+ # development snapshots of GCC prior to 3.0.
+ case $host_os in
+ aix4 | aix4.[01] | aix4.[01].*)
+ if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+ echo ' yes '
+ echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then
+ :
+ else
+ can_build_shared=no
+ fi
+ ;;
+ esac
+ # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+ # soname into executable. Probably we can add versioning support to
+ # collect2, so additional links can be useful in future.
+ if test "$aix_use_runtimelinking" = yes; then
+ # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+ # instead of lib<name>.a to let people know that these are not
+ # typical AIX shared libraries.
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ else
+ # We preserve .a as extension for shared libraries through AIX4.2
+ # and later when we are not doing run time linking.
+ library_names_spec='${libname}${release}.a $libname.a'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ fi
+ shlibpath_var=LIBPATH
+ fi
+ ;;
+
+amigaos*)
+ library_names_spec='$libname.ixlibrary $libname.a'
+ # Create ${libname}_ixlibrary.a entries in /sys/libs.
+ finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+ ;;
+
+beos*)
+ library_names_spec='${libname}${shared_ext}'
+ dynamic_linker="$host_os ld.so"
+ shlibpath_var=LIBRARY_PATH
+ ;;
+
+bsdi[45]*)
+ version_type=linux
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+ sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+ # the default ld.so.conf also contains /usr/contrib/lib and
+ # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+ # libtool to hard-code these into programs
+ ;;
+
+cygwin* | mingw* | pw32*)
+ version_type=windows
+ shrext_cmds=".dll"
+ need_version=no
+ need_lib_prefix=no
+
+ case $GCC,$host_os in
+ yes,cygwin* | yes,mingw* | yes,pw32*)
+ library_names_spec='$libname.dll.a'
+ # DLL is installed to $(libdir)/../bin by postinstall_cmds
+ postinstall_cmds='base_file=`basename \${file}`~
+ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~
+ dldir=$destdir/`dirname \$dlpath`~
+ test -d \$dldir || mkdir -p \$dldir~
+ $install_prog $dir/$dlname \$dldir/$dlname~
+ chmod a+x \$dldir/$dlname'
+ postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+ dlpath=$dir/\$dldll~
+ $rm \$dlpath'
+ shlibpath_overrides_runpath=yes
+
+ case $host_os in
+ cygwin*)
+ # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+ soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+ sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib"
+ ;;
+ mingw*)
+ # MinGW DLLs use traditional 'lib' prefix
+ soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+ sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+ if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then
+ # It is most probably a Windows format PATH printed by
+ # mingw gcc, but we are running on Cygwin. Gcc prints its search
+ # path with ; separators, and with drive letters. We can handle the
+ # drive letters (cygwin fileutils understands them), so leave them,
+ # especially as we might pass files found there to a mingw objdump,
+ # which wouldn't understand a cygwinified path. Ahh.
+ sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+ else
+ sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+ fi
+ ;;
+ pw32*)
+ # pw32 DLLs use 'pw' prefix rather than 'lib'
+ library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+ ;;
+ esac
+ ;;
+
+ *)
+ library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
+ ;;
+ esac
+ dynamic_linker='Win32 ld.exe'
+ # FIXME: first we should search . and the directory the executable is in
+ shlibpath_var=PATH
+ ;;
+
+darwin* | rhapsody*)
+ dynamic_linker="$host_os dyld"
+ version_type=darwin
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext'
+ soname_spec='${libname}${release}${major}$shared_ext'
+ shlibpath_overrides_runpath=yes
+ shlibpath_var=DYLD_LIBRARY_PATH
+ shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+
+ sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+ ;;
+
+dgux*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+freebsd1*)
+ dynamic_linker=no
+ ;;
+
+freebsd* | dragonfly*)
+ # DragonFly does not have aout. When/if they implement a new
+ # versioning mechanism, adjust this.
+ if test -x /usr/bin/objformat; then
+ objformat=`/usr/bin/objformat`
+ else
+ case $host_os in
+ freebsd[123]*) objformat=aout ;;
+ *) objformat=elf ;;
+ esac
+ fi
+ version_type=freebsd-$objformat
+ case $version_type in
+ freebsd-elf*)
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+ need_version=no
+ need_lib_prefix=no
+ ;;
+ freebsd-*)
+ library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+ need_version=yes
+ ;;
+ esac
+ shlibpath_var=LD_LIBRARY_PATH
+ case $host_os in
+ freebsd2*)
+ shlibpath_overrides_runpath=yes
+ ;;
+ freebsd3.[01]* | freebsdelf3.[01]*)
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+ freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
+ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+ *) # from 4.6 on, and DragonFly
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+ esac
+ ;;
+
+gnu*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ hardcode_into_libs=yes
+ ;;
+
+hpux9* | hpux10* | hpux11*)
+ # Give a soname corresponding to the major version so that dld.sl refuses to
+ # link against other versions.
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=no
+ case $host_cpu in
+ ia64*)
+ shrext_cmds='.so'
+ hardcode_into_libs=yes
+ dynamic_linker="$host_os dld.so"
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ if test "X$HPUX_IA64_MODE" = X32; then
+ sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+ else
+ sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+ fi
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ ;;
+ hppa*64*)
+ shrext_cmds='.sl'
+ hardcode_into_libs=yes
+ dynamic_linker="$host_os dld.sl"
+ shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ ;;
+ *)
+ shrext_cmds='.sl'
+ dynamic_linker="$host_os dld.sl"
+ shlibpath_var=SHLIB_PATH
+ shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ ;;
+ esac
+ # HP-UX runs *really* slowly unless shared libraries are mode 555.
+ postinstall_cmds='chmod 555 $lib'
+ ;;
+
+interix[3-9]*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+
+irix5* | irix6* | nonstopux*)
+ case $host_os in
+ nonstopux*) version_type=nonstopux ;;
+ *)
+ if test "$lt_cv_prog_gnu_ld" = yes; then
+ version_type=linux
+ else
+ version_type=irix
+ fi ;;
+ esac
+ need_lib_prefix=no
+ need_version=no
+ soname_spec='${libname}${release}${shared_ext}$major'
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+ case $host_os in
+ irix5* | nonstopux*)
+ libsuff= shlibsuff=
+ ;;
+ *)
+ case $LD in # libtool.m4 will add one of these switches to LD
+ *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+ libsuff= shlibsuff= libmagic=32-bit;;
+ *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+ libsuff=32 shlibsuff=N32 libmagic=N32;;
+ *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+ libsuff=64 shlibsuff=64 libmagic=64-bit;;
+ *) libsuff= shlibsuff= libmagic=never-match;;
+ esac
+ ;;
+ esac
+ shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+ shlibpath_overrides_runpath=no
+ sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+ sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+ hardcode_into_libs=yes
+ ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+ dynamic_linker=no
+ ;;
+
+# This must be Linux ELF.
+linux* | k*bsd*-gnu)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ # This implies no fast_install, which is unacceptable.
+ # Some rework will be needed to allow for fast_install
+ # before this can be enabled.
+ hardcode_into_libs=yes
+ sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+ sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+
+ # Append ld.so.conf contents to the search path
+ if test -f /etc/ld.so.conf; then
+ lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '`
+ sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra"
+ fi
+
+ # We used to test for /lib/ld.so.1 and disable shared libraries on
+ # powerpc, because MkLinux only supported shared libraries with the
+ # GNU dynamic linker. Since this was broken with cross compilers,
+ # most powerpc-linux boxes support dynamic linking these days and
+ # people can always --disable-shared, the test was removed, and we
+ # assume the GNU/Linux dynamic linker is in use.
+ dynamic_linker='GNU/Linux ld.so'
+ ;;
+
+netbsd*)
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=no
+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+ dynamic_linker='NetBSD (a.out) ld.so'
+ else
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ dynamic_linker='NetBSD ld.elf_so'
+ fi
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+
+newsos6)
+ version_type=linux
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ ;;
+
+nto-qnx*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ ;;
+
+openbsd*)
+ version_type=sunos
+ sys_lib_dlsearch_path_spec="/usr/lib"
+ need_lib_prefix=no
+ # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
+ case $host_os in
+ openbsd3.3 | openbsd3.3.*) need_version=yes ;;
+ *) need_version=no ;;
+ esac
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+ case $host_os in
+ openbsd2.[89] | openbsd2.[89].*)
+ shlibpath_overrides_runpath=no
+ ;;
+ *)
+ shlibpath_overrides_runpath=yes
+ ;;
+ esac
+ else
+ shlibpath_overrides_runpath=yes
+ fi
+ ;;
+
+os2*)
+ libname_spec='$name'
+ shrext_cmds=".dll"
+ need_lib_prefix=no
+ library_names_spec='$libname${shared_ext} $libname.a'
+ dynamic_linker='OS/2 ld.exe'
+ shlibpath_var=LIBPATH
+ ;;
+
+osf3* | osf4* | osf5*)
+ version_type=osf
+ need_lib_prefix=no
+ need_version=no
+ soname_spec='${libname}${release}${shared_ext}$major'
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ shlibpath_var=LD_LIBRARY_PATH
+ sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+ sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+ ;;
+
+rdos*)
+ dynamic_linker=no
+ ;;
+
+solaris*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ # ldd complains unless libraries are executable
+ postinstall_cmds='chmod +x $lib'
+ ;;
+
+sunos4*)
+ version_type=sunos
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+ finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ if test "$with_gnu_ld" = yes; then
+ need_lib_prefix=no
+ fi
+ need_version=yes
+ ;;
+
+sysv4 | sysv4.3*)
+ version_type=linux
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ case $host_vendor in
+ sni)
+ shlibpath_overrides_runpath=no
+ need_lib_prefix=no
+ export_dynamic_flag_spec='${wl}-Blargedynsym'
+ runpath_var=LD_RUN_PATH
+ ;;
+ siemens)
+ need_lib_prefix=no
+ ;;
+ motorola)
+ need_lib_prefix=no
+ need_version=no
+ shlibpath_overrides_runpath=no
+ sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+ ;;
+ esac
+ ;;
+
+sysv4*MP*)
+ if test -d /usr/nec ;then
+ version_type=linux
+ library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
+ soname_spec='$libname${shared_ext}.$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ fi
+ ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+ version_type=freebsd-elf
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ hardcode_into_libs=yes
+ if test "$with_gnu_ld" = yes; then
+ sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+ shlibpath_overrides_runpath=no
+ else
+ sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+ shlibpath_overrides_runpath=yes
+ case $host_os in
+ sco3.2v5*)
+ sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+ ;;
+ esac
+ fi
+ sys_lib_dlsearch_path_spec='/usr/lib'
+ ;;
+
+uts4*)
+ version_type=linux
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+*)
+ dynamic_linker=no
+ ;;
+esac
+{ $as_echo "$as_me:$LINENO: result: $dynamic_linker" >&5
+$as_echo "$dynamic_linker" >&6; }
+test "$dynamic_linker" = no && can_build_shared=no
+
+if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_sys_lib_search_path_spec="$sys_lib_search_path_spec"
+fi
+
+sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
+if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec"
+fi
+
+sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test "$GCC" = yes; then
+ variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+{ $as_echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5
+$as_echo_n "checking how to hardcode library paths into programs... " >&6; }
+hardcode_action_F77=
+if test -n "$hardcode_libdir_flag_spec_F77" || \
+ test -n "$runpath_var_F77" || \
+ test "X$hardcode_automatic_F77" = "Xyes" ; then
+
+ # We can hardcode non-existant directories.
+ if test "$hardcode_direct_F77" != no &&
+ # If the only mechanism to avoid hardcoding is shlibpath_var, we
+ # have to relink, otherwise we might link with an installed library
+ # when we should be linking with a yet-to-be-installed one
+ ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, F77)" != no &&
+ test "$hardcode_minus_L_F77" != no; then
+ # Linking always hardcodes the temporary library directory.
+ hardcode_action_F77=relink
+ else
+ # We can link without hardcoding, and we can hardcode nonexisting dirs.
+ hardcode_action_F77=immediate
+ fi
+else
+ # We cannot hardcode anything, or else we can only hardcode existing
+ # directories.
+ hardcode_action_F77=unsupported
+fi
+{ $as_echo "$as_me:$LINENO: result: $hardcode_action_F77" >&5
+$as_echo "$hardcode_action_F77" >&6; }
+
+if test "$hardcode_action_F77" = relink; then
+ # Fast installation is not supported
+ enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+ test "$enable_shared" = no; then
+ # Fast installation is not necessary
+ enable_fast_install=needless
+fi
+
+
+# The else clause should only fire when bootstrapping the
+# libtool distribution, otherwise you forgot to ship ltmain.sh
+# with your package, and you will get complaints that there are
+# no rules to generate ltmain.sh.
+if test -f "$ltmain"; then
+ # See if we are running on zsh, and set the options which allow our commands through
+ # without removal of \ escapes.
+ if test -n "${ZSH_VERSION+set}" ; then
+ setopt NO_GLOB_SUBST
+ fi
+ # Now quote all the things that may contain metacharacters while being
+ # careful not to overquote the AC_SUBSTed values. We take copies of the
+ # variables and quote the copies for generation of the libtool script.
+ for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \
+ SED SHELL STRIP \
+ libname_spec library_names_spec soname_spec extract_expsyms_cmds \
+ old_striplib striplib file_magic_cmd finish_cmds finish_eval \
+ deplibs_check_method reload_flag reload_cmds need_locks \
+ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \
+ lt_cv_sys_global_symbol_to_c_name_address \
+ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \
+ old_postinstall_cmds old_postuninstall_cmds \
+ compiler_F77 \
+ CC_F77 \
+ LD_F77 \
+ lt_prog_compiler_wl_F77 \
+ lt_prog_compiler_pic_F77 \
+ lt_prog_compiler_static_F77 \
+ lt_prog_compiler_no_builtin_flag_F77 \
+ export_dynamic_flag_spec_F77 \
+ thread_safe_flag_spec_F77 \
+ whole_archive_flag_spec_F77 \
+ enable_shared_with_static_runtimes_F77 \
+ old_archive_cmds_F77 \
+ old_archive_from_new_cmds_F77 \
+ predep_objects_F77 \
+ postdep_objects_F77 \
+ predeps_F77 \
+ postdeps_F77 \
+ compiler_lib_search_path_F77 \
+ compiler_lib_search_dirs_F77 \
+ archive_cmds_F77 \
+ archive_expsym_cmds_F77 \
+ postinstall_cmds_F77 \
+ postuninstall_cmds_F77 \
+ old_archive_from_expsyms_cmds_F77 \
+ allow_undefined_flag_F77 \
+ no_undefined_flag_F77 \
+ export_symbols_cmds_F77 \
+ hardcode_libdir_flag_spec_F77 \
+ hardcode_libdir_flag_spec_ld_F77 \
+ hardcode_libdir_separator_F77 \
+ hardcode_automatic_F77 \
+ module_cmds_F77 \
+ module_expsym_cmds_F77 \
+ lt_cv_prog_compiler_c_o_F77 \
+ fix_srcfile_path_F77 \
+ exclude_expsyms_F77 \
+ include_expsyms_F77; do
+
+ case $var in
+ old_archive_cmds_F77 | \
+ old_archive_from_new_cmds_F77 | \
+ archive_cmds_F77 | \
+ archive_expsym_cmds_F77 | \
+ module_cmds_F77 | \
+ module_expsym_cmds_F77 | \
+ old_archive_from_expsyms_cmds_F77 | \
+ export_symbols_cmds_F77 | \
+ extract_expsyms_cmds | reload_cmds | finish_cmds | \
+ postinstall_cmds | postuninstall_cmds | \
+ old_postinstall_cmds | old_postuninstall_cmds | \
+ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec)
+ # Double-quote double-evaled strings.
+ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\""
+ ;;
+ *)
+ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\""
+ ;;
+ esac
+ done
+
+ case $lt_echo in
+ *'\$0 --fallback-echo"')
+ lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'`
+ ;;
+ esac
+
+cfgfile="$ofile"
+
+ cat <<__EOF__ >> "$cfgfile"
+# ### BEGIN LIBTOOL TAG CONFIG: $tagname
+
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc_F77
+
+# Whether or not to disallow shared libs when runtime libs are static
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_F77
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# The host system.
+host_alias=$host_alias
+host=$host
+host_os=$host_os
+
+# The build system.
+build_alias=$build_alias
+build=$build
+build_os=$build_os
+
+# An echo program that does not interpret backslashes.
+echo=$lt_echo
+
+# The archiver.
+AR=$lt_AR
+AR_FLAGS=$lt_AR_FLAGS
+
+# A C compiler.
+LTCC=$lt_LTCC
+
+# LTCC compiler flags.
+LTCFLAGS=$lt_LTCFLAGS
+
+# A language-specific compiler.
+CC=$lt_compiler_F77
+
+# Is the compiler the GNU C compiler?
+with_gcc=$GCC_F77
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# The linker used to build libraries.
+LD=$lt_LD_F77
+
+# Whether we need hard or soft links.
+LN_S=$lt_LN_S
+
+# A BSD-compatible nm program.
+NM=$lt_NM
+
+# A symbol stripping program
+STRIP=$lt_STRIP
+
+# Used to examine libraries when file_magic_cmd begins "file"
+MAGIC_CMD=$MAGIC_CMD
+
+# Used on cygwin: DLL creation program.
+DLLTOOL="$DLLTOOL"
+
+# Used on cygwin: object dumper.
+OBJDUMP="$OBJDUMP"
+
+# Used on cygwin: assembler.
+AS="$AS"
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl_F77
+
+# Object file suffix (normally "o").
+objext="$ac_objext"
+
+# Old archive suffix (normally "a").
+libext="$libext"
+
+# Shared library suffix (normally ".so").
+shrext_cmds='$shrext_cmds'
+
+# Executable file suffix (normally "").
+exeext="$exeext"
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic_F77
+pic_mode=$pic_mode
+
+# What is the maximum length of a command?
+max_cmd_len=$lt_cv_sys_max_cmd_len
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o_F77
+
+# Must we lock files when doing compilation?
+need_locks=$lt_need_locks
+
+# Do we need the lib prefix for modules?
+need_lib_prefix=$need_lib_prefix
+
+# Do we need a version for libraries?
+need_version=$need_version
+
+# Whether dlopen is supported.
+dlopen_support=$enable_dlopen
+
+# Whether dlopen of programs is supported.
+dlopen_self=$enable_dlopen_self
+
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=$enable_dlopen_self_static
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static_F77
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_F77
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_F77
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec_F77
+
+# Compiler flag to generate thread-safe objects.
+thread_safe_flag_spec=$lt_thread_safe_flag_spec_F77
+
+# Library versioning type.
+version_type=$version_type
+
+# Format of library name prefix.
+libname_spec=$lt_libname_spec
+
+# List of archive names. First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME.
+library_names_spec=$lt_library_names_spec
+
+# The coded name of the library, if different from the real name.
+soname_spec=$lt_soname_spec
+
+# Commands used to build and install an old-style archive.
+RANLIB=$lt_RANLIB
+old_archive_cmds=$lt_old_archive_cmds_F77
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_F77
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_F77
+
+# Commands used to build and install a shared archive.
+archive_cmds=$lt_archive_cmds_F77
+archive_expsym_cmds=$lt_archive_expsym_cmds_F77
+postinstall_cmds=$lt_postinstall_cmds
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to build a loadable module (assumed same as above if empty)
+module_cmds=$lt_module_cmds_F77
+module_expsym_cmds=$lt_module_expsym_cmds_F77
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predep_objects=$lt_predep_objects_F77
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdep_objects=$lt_postdep_objects_F77
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predeps=$lt_predeps_F77
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdeps=$lt_postdeps_F77
+
+# The directories searched by this compiler when creating a shared
+# library
+compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_F77
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_compiler_lib_search_path_F77
+
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method=$lt_deplibs_check_method
+
+# Command to use when deplibs_check_method == file_magic.
+file_magic_cmd=$lt_file_magic_cmd
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag_F77
+
+# Flag that forces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag_F77
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# Same as above, but a single script fragment to be evaled but not shown.
+finish_eval=$lt_finish_eval
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
+
+# Transform the output of nm in a proper C declaration
+global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
+
+# Transform the output of nm in a C name address pair
+global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
+
+# This is the shared library runtime path variable.
+runpath_var=$runpath_var
+
+# This is the shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action_F77
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist.
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_F77
+
+# If ld is used when linking, flag to hardcode \$libdir into
+# a binary during linking. This must work even if \$libdir does
+# not exist.
+hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_F77
+
+# Whether we need a single -rpath flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator_F77
+
+# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the
+# resulting binary.
+hardcode_direct=$hardcode_direct_F77
+
+# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
+# resulting binary.
+hardcode_minus_L=$hardcode_minus_L_F77
+
+# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into
+# the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var_F77
+
+# Set to yes if building a shared library automatically hardcodes DIR into the library
+# and all subsequent libraries and executables linked against it.
+hardcode_automatic=$hardcode_automatic_F77
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at relink time.
+variables_saved_for_relink="$variables_saved_for_relink"
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs_F77
+
+# Compile-time system search path for libraries
+sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
+
+# Run-time system search path for libraries
+sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
+
+# Fix the shell variable \$srcfile for the compiler.
+fix_srcfile_path=$lt_fix_srcfile_path
+
+# Set to yes if exported symbols are required.
+always_export_symbols=$always_export_symbols_F77
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds_F77
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms_F77
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms_F77
+
+# ### END LIBTOOL TAG CONFIG: $tagname
+
+__EOF__
+
+
+else
+ # If there is no Makefile yet, we rely on a make rule to execute
+ # `config.status --recheck' to rerun these tests and create the
+ # libtool script then.
+ ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'`
+ if test -f "$ltmain_in"; then
+ test -f Makefile && make "$ltmain"
+ fi
+fi
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+CC="$lt_save_CC"
+
+ else
+ tagname=""
+ fi
+ ;;
+
+ GCJ)
+ if test -n "$GCJ" && test "X$GCJ" != "Xno"; then
+
+
+# Source file extension for Java test sources.
+ac_ext=java
+
+# Object file extension for compiled Java test sources.
+objext=o
+objext_GCJ=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="class foo {}"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='public class conftest { public static void main(String[] argv) {}; }'
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+# save warnings/boilerplate of simple test code
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$rm conftest*
+
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$rm -r conftest*
+
+
+# Allow CC to be a program name with arguments.
+lt_save_CC="$CC"
+CC=${GCJ-"gcj"}
+compiler=$CC
+compiler_GCJ=$CC
+for cc_temp in $compiler""; do
+ case $cc_temp in
+ compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+ distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+ \-*) ;;
+ *) break;;
+ esac
+done
+cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+
+
+# GCJ did not exist at the time GCC didn't implicitly link libc in.
+archive_cmds_need_lc_GCJ=no
+
+old_archive_cmds_GCJ=$old_archive_cmds
+
+
+lt_prog_compiler_no_builtin_flag_GCJ=
+
+if test "$GCC" = yes; then
+ lt_prog_compiler_no_builtin_flag_GCJ=' -fno-builtin'
+
+
+{ $as_echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
+$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; }
+if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_prog_compiler_rtti_exceptions=no
+ ac_outfile=conftest.$ac_objext
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+ lt_compiler_flag="-fno-rtti -fno-exceptions"
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ # The option is referenced via a variable to avoid confusing sed.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:17183: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&5
+ echo "$as_me:17187: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s "$ac_outfile"; then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings other than the usual output.
+ $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_rtti_exceptions=yes
+ fi
+ fi
+ $rm conftest*
+
+fi
+{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
+$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; }
+
+if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then
+ lt_prog_compiler_no_builtin_flag_GCJ="$lt_prog_compiler_no_builtin_flag_GCJ -fno-rtti -fno-exceptions"
+else
+ :
+fi
+
+fi
+
+lt_prog_compiler_wl_GCJ=
+lt_prog_compiler_pic_GCJ=
+lt_prog_compiler_static_GCJ=
+
+{ $as_echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5
+$as_echo_n "checking for $compiler option to produce PIC... " >&6; }
+
+ if test "$GCC" = yes; then
+ lt_prog_compiler_wl_GCJ='-Wl,'
+ lt_prog_compiler_static_GCJ='-static'
+
+ case $host_os in
+ aix*)
+ # All AIX code is PIC.
+ if test "$host_cpu" = ia64; then
+ # AIX 5 now supports IA64 processor
+ lt_prog_compiler_static_GCJ='-Bstatic'
+ fi
+ ;;
+
+ amigaos*)
+ # FIXME: we need at least 68020 code to build shared libraries, but
+ # adding the `-m68020' flag to GCC prevents building anything better,
+ # like `-m68040'.
+ lt_prog_compiler_pic_GCJ='-m68020 -resident32 -malways-restore-a4'
+ ;;
+
+ beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+ # PIC is the default for these OSes.
+ ;;
+
+ mingw* | cygwin* | pw32* | os2*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ # Although the cygwin gcc ignores -fPIC, still need this for old-style
+ # (--disable-auto-import) libraries
+
+ ;;
+
+ darwin* | rhapsody*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ lt_prog_compiler_pic_GCJ='-fno-common'
+ ;;
+
+ interix[3-9]*)
+ # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+ # Instead, we relocate shared libraries at runtime.
+ ;;
+
+ msdosdjgpp*)
+ # Just because we use GCC doesn't mean we suddenly get shared libraries
+ # on systems that don't support them.
+ lt_prog_compiler_can_build_shared_GCJ=no
+ enable_shared=no
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ lt_prog_compiler_pic_GCJ=-Kconform_pic
+ fi
+ ;;
+
+ hpux*)
+ # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+ # not for PA HP-UX.
+ case $host_cpu in
+ hppa*64*|ia64*)
+ # +Z the default
+ ;;
+ *)
+ lt_prog_compiler_pic_GCJ='-fPIC'
+ ;;
+ esac
+ ;;
+
+ *)
+ lt_prog_compiler_pic_GCJ='-fPIC'
+ ;;
+ esac
+ else
+ # PORTME Check for flag to pass linker flags through the system compiler.
+ case $host_os in
+ aix*)
+ lt_prog_compiler_wl_GCJ='-Wl,'
+ if test "$host_cpu" = ia64; then
+ # AIX 5 now supports IA64 processor
+ lt_prog_compiler_static_GCJ='-Bstatic'
+ else
+ lt_prog_compiler_static_GCJ='-bnso -bI:/lib/syscalls.exp'
+ fi
+ ;;
+ darwin*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ case $cc_basename in
+ xlc*)
+ lt_prog_compiler_pic_GCJ='-qnocommon'
+ lt_prog_compiler_wl_GCJ='-Wl,'
+ ;;
+ esac
+ ;;
+
+ mingw* | cygwin* | pw32* | os2*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+
+ ;;
+
+ hpux9* | hpux10* | hpux11*)
+ lt_prog_compiler_wl_GCJ='-Wl,'
+ # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+ # not for PA HP-UX.
+ case $host_cpu in
+ hppa*64*|ia64*)
+ # +Z the default
+ ;;
+ *)
+ lt_prog_compiler_pic_GCJ='+Z'
+ ;;
+ esac
+ # Is there a better lt_prog_compiler_static that works with the bundled CC?
+ lt_prog_compiler_static_GCJ='${wl}-a ${wl}archive'
+ ;;
+
+ irix5* | irix6* | nonstopux*)
+ lt_prog_compiler_wl_GCJ='-Wl,'
+ # PIC (with -KPIC) is the default.
+ lt_prog_compiler_static_GCJ='-non_shared'
+ ;;
+
+ newsos6)
+ lt_prog_compiler_pic_GCJ='-KPIC'
+ lt_prog_compiler_static_GCJ='-Bstatic'
+ ;;
+
+ linux* | k*bsd*-gnu)
+ case $cc_basename in
+ icc* | ecc*)
+ lt_prog_compiler_wl_GCJ='-Wl,'
+ lt_prog_compiler_pic_GCJ='-KPIC'
+ lt_prog_compiler_static_GCJ='-static'
+ ;;
+ pgcc* | pgf77* | pgf90* | pgf95*)
+ # Portland Group compilers (*not* the Pentium gcc compiler,
+ # which looks to be a dead project)
+ lt_prog_compiler_wl_GCJ='-Wl,'
+ lt_prog_compiler_pic_GCJ='-fpic'
+ lt_prog_compiler_static_GCJ='-Bstatic'
+ ;;
+ ccc*)
+ lt_prog_compiler_wl_GCJ='-Wl,'
+ # All Alpha code is PIC.
+ lt_prog_compiler_static_GCJ='-non_shared'
+ ;;
+ *)
+ case `$CC -V 2>&1 | sed 5q` in
+ *Sun\ C*)
+ # Sun C 5.9
+ lt_prog_compiler_pic_GCJ='-KPIC'
+ lt_prog_compiler_static_GCJ='-Bstatic'
+ lt_prog_compiler_wl_GCJ='-Wl,'
+ ;;
+ *Sun\ F*)
+ # Sun Fortran 8.3 passes all unrecognized flags to the linker
+ lt_prog_compiler_pic_GCJ='-KPIC'
+ lt_prog_compiler_static_GCJ='-Bstatic'
+ lt_prog_compiler_wl_GCJ=''
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+
+ osf3* | osf4* | osf5*)
+ lt_prog_compiler_wl_GCJ='-Wl,'
+ # All OSF/1 code is PIC.
+ lt_prog_compiler_static_GCJ='-non_shared'
+ ;;
+
+ rdos*)
+ lt_prog_compiler_static_GCJ='-non_shared'
+ ;;
+
+ solaris*)
+ lt_prog_compiler_pic_GCJ='-KPIC'
+ lt_prog_compiler_static_GCJ='-Bstatic'
+ case $cc_basename in
+ f77* | f90* | f95*)
+ lt_prog_compiler_wl_GCJ='-Qoption ld ';;
+ *)
+ lt_prog_compiler_wl_GCJ='-Wl,';;
+ esac
+ ;;
+
+ sunos4*)
+ lt_prog_compiler_wl_GCJ='-Qoption ld '
+ lt_prog_compiler_pic_GCJ='-PIC'
+ lt_prog_compiler_static_GCJ='-Bstatic'
+ ;;
+
+ sysv4 | sysv4.2uw2* | sysv4.3*)
+ lt_prog_compiler_wl_GCJ='-Wl,'
+ lt_prog_compiler_pic_GCJ='-KPIC'
+ lt_prog_compiler_static_GCJ='-Bstatic'
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec ;then
+ lt_prog_compiler_pic_GCJ='-Kconform_pic'
+ lt_prog_compiler_static_GCJ='-Bstatic'
+ fi
+ ;;
+
+ sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+ lt_prog_compiler_wl_GCJ='-Wl,'
+ lt_prog_compiler_pic_GCJ='-KPIC'
+ lt_prog_compiler_static_GCJ='-Bstatic'
+ ;;
+
+ unicos*)
+ lt_prog_compiler_wl_GCJ='-Wl,'
+ lt_prog_compiler_can_build_shared_GCJ=no
+ ;;
+
+ uts4*)
+ lt_prog_compiler_pic_GCJ='-pic'
+ lt_prog_compiler_static_GCJ='-Bstatic'
+ ;;
+
+ *)
+ lt_prog_compiler_can_build_shared_GCJ=no
+ ;;
+ esac
+ fi
+
+{ $as_echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_GCJ" >&5
+$as_echo "$lt_prog_compiler_pic_GCJ" >&6; }
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic_GCJ"; then
+
+{ $as_echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works" >&5
+$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works... " >&6; }
+if test "${lt_cv_prog_compiler_pic_works_GCJ+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_prog_compiler_pic_works_GCJ=no
+ ac_outfile=conftest.$ac_objext
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+ lt_compiler_flag="$lt_prog_compiler_pic_GCJ"
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ # The option is referenced via a variable to avoid confusing sed.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:17473: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&5
+ echo "$as_me:17477: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s "$ac_outfile"; then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings other than the usual output.
+ $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_pic_works_GCJ=yes
+ fi
+ fi
+ $rm conftest*
+
+fi
+{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_pic_works_GCJ" >&5
+$as_echo "$lt_cv_prog_compiler_pic_works_GCJ" >&6; }
+
+if test x"$lt_cv_prog_compiler_pic_works_GCJ" = xyes; then
+ case $lt_prog_compiler_pic_GCJ in
+ "" | " "*) ;;
+ *) lt_prog_compiler_pic_GCJ=" $lt_prog_compiler_pic_GCJ" ;;
+ esac
+else
+ lt_prog_compiler_pic_GCJ=
+ lt_prog_compiler_can_build_shared_GCJ=no
+fi
+
+fi
+case $host_os in
+ # For platforms which do not support PIC, -DPIC is meaningless:
+ *djgpp*)
+ lt_prog_compiler_pic_GCJ=
+ ;;
+ *)
+ lt_prog_compiler_pic_GCJ="$lt_prog_compiler_pic_GCJ"
+ ;;
+esac
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$lt_prog_compiler_wl_GCJ eval lt_tmp_static_flag=\"$lt_prog_compiler_static_GCJ\"
+{ $as_echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
+if test "${lt_cv_prog_compiler_static_works_GCJ+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_prog_compiler_static_works_GCJ=no
+ save_LDFLAGS="$LDFLAGS"
+ LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
+ echo "$lt_simple_link_test_code" > conftest.$ac_ext
+ if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+ # The linker can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ if test -s conftest.err; then
+ # Append any errors to the config.log.
+ cat conftest.err 1>&5
+ $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if diff conftest.exp conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_static_works_GCJ=yes
+ fi
+ else
+ lt_cv_prog_compiler_static_works_GCJ=yes
+ fi
+ fi
+ $rm -r conftest*
+ LDFLAGS="$save_LDFLAGS"
+
+fi
+{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_static_works_GCJ" >&5
+$as_echo "$lt_cv_prog_compiler_static_works_GCJ" >&6; }
+
+if test x"$lt_cv_prog_compiler_static_works_GCJ" = xyes; then
+ :
+else
+ lt_prog_compiler_static_GCJ=
+fi
+
+
+{ $as_echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5
+$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if test "${lt_cv_prog_compiler_c_o_GCJ+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_prog_compiler_c_o_GCJ=no
+ $rm -r conftest 2>/dev/null
+ mkdir conftest
+ cd conftest
+ mkdir out
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ lt_compiler_flag="-o out/conftest2.$ac_objext"
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:17577: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>out/conftest.err)
+ ac_status=$?
+ cat out/conftest.err >&5
+ echo "$as_me:17581: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s out/conftest2.$ac_objext
+ then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp
+ $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+ if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_c_o_GCJ=yes
+ fi
+ fi
+ chmod u+w . 2>&5
+ $rm conftest*
+ # SGI C++ compiler will create directory out/ii_files/ for
+ # template instantiation
+ test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files
+ $rm out/* && rmdir out
+ cd ..
+ rmdir conftest
+ $rm conftest*
+
+fi
+{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_GCJ" >&5
+$as_echo "$lt_cv_prog_compiler_c_o_GCJ" >&6; }
+
+
+hard_links="nottested"
+if test "$lt_cv_prog_compiler_c_o_GCJ" = no && test "$need_locks" != no; then
+ # do not overwrite the value of need_locks provided by the user
+ { $as_echo "$as_me:$LINENO: checking if we can lock with hard links" >&5
+$as_echo_n "checking if we can lock with hard links... " >&6; }
+ hard_links=yes
+ $rm conftest*
+ ln conftest.a conftest.b 2>/dev/null && hard_links=no
+ touch conftest.a
+ ln conftest.a conftest.b 2>&5 || hard_links=no
+ ln conftest.a conftest.b 2>/dev/null && hard_links=no
+ { $as_echo "$as_me:$LINENO: result: $hard_links" >&5
+$as_echo "$hard_links" >&6; }
+ if test "$hard_links" = no; then
+ { $as_echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
+$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
+ need_locks=warn
+ fi
+else
+ need_locks=no
+fi
+
+{ $as_echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
+
+ runpath_var=
+ allow_undefined_flag_GCJ=
+ enable_shared_with_static_runtimes_GCJ=no
+ archive_cmds_GCJ=
+ archive_expsym_cmds_GCJ=
+ old_archive_From_new_cmds_GCJ=
+ old_archive_from_expsyms_cmds_GCJ=
+ export_dynamic_flag_spec_GCJ=
+ whole_archive_flag_spec_GCJ=
+ thread_safe_flag_spec_GCJ=
+ hardcode_libdir_flag_spec_GCJ=
+ hardcode_libdir_flag_spec_ld_GCJ=
+ hardcode_libdir_separator_GCJ=
+ hardcode_direct_GCJ=no
+ hardcode_minus_L_GCJ=no
+ hardcode_shlibpath_var_GCJ=unsupported
+ link_all_deplibs_GCJ=unknown
+ hardcode_automatic_GCJ=no
+ module_cmds_GCJ=
+ module_expsym_cmds_GCJ=
+ always_export_symbols_GCJ=no
+ export_symbols_cmds_GCJ='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+ # include_expsyms should be a list of space-separated symbols to be *always*
+ # included in the symbol list
+ include_expsyms_GCJ=
+ # exclude_expsyms can be an extended regexp of symbols to exclude
+ # it will be wrapped by ` (' and `)$', so one must not match beginning or
+ # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
+ # as well as any symbol that contains `d'.
+ exclude_expsyms_GCJ='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
+ # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+ # platforms (ab)use it in PIC code, but their linkers get confused if
+ # the symbol is explicitly referenced. Since portable code cannot
+ # rely on this symbol name, it's probably fine to never include it in
+ # preloaded symbol tables.
+ # Exclude shared library initialization/finalization symbols.
+ extract_expsyms_cmds=
+ # Just being paranoid about ensuring that cc_basename is set.
+ for cc_temp in $compiler""; do
+ case $cc_temp in
+ compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+ distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+ \-*) ;;
+ *) break;;
+ esac
+done
+cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+
+ case $host_os in
+ cygwin* | mingw* | pw32*)
+ # FIXME: the MSVC++ port hasn't been tested in a loooong time
+ # When not using gcc, we currently assume that we are using
+ # Microsoft Visual C++.
+ if test "$GCC" != yes; then
+ with_gnu_ld=no
+ fi
+ ;;
+ interix*)
+ # we just hope/assume this is gcc and not c89 (= MSVC++)
+ with_gnu_ld=yes
+ ;;
+ openbsd*)
+ with_gnu_ld=no
+ ;;
+ esac
+
+ ld_shlibs_GCJ=yes
+ if test "$with_gnu_ld" = yes; then
+ # If archive_cmds runs LD, not CC, wlarc should be empty
+ wlarc='${wl}'
+
+ # Set some defaults for GNU ld with shared library support. These
+ # are reset later if shared libraries are not supported. Putting them
+ # here allows them to be overridden if necessary.
+ runpath_var=LD_RUN_PATH
+ hardcode_libdir_flag_spec_GCJ='${wl}--rpath ${wl}$libdir'
+ export_dynamic_flag_spec_GCJ='${wl}--export-dynamic'
+ # ancient GNU ld didn't support --whole-archive et. al.
+ if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then
+ whole_archive_flag_spec_GCJ="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+ else
+ whole_archive_flag_spec_GCJ=
+ fi
+ supports_anon_versioning=no
+ case `$LD -v 2>/dev/null` in
+ *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
+ *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
+ *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
+ *\ 2.11.*) ;; # other 2.11 versions
+ *) supports_anon_versioning=yes ;;
+ esac
+
+ # See if GNU ld supports shared libraries.
+ case $host_os in
+ aix[3-9]*)
+ # On AIX/PPC, the GNU linker is very broken
+ if test "$host_cpu" != ia64; then
+ ld_shlibs_GCJ=no
+ cat <<EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.9.1, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support. If you
+*** really care for shared libraries, you may want to modify your PATH
+*** so that a non-GNU linker is found, and then restart.
+
+EOF
+ fi
+ ;;
+
+ amigaos*)
+ archive_cmds_GCJ='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+ hardcode_libdir_flag_spec_GCJ='-L$libdir'
+ hardcode_minus_L_GCJ=yes
+
+ # Samuel A. Falvo II <kc5tja@dolphin.openprojects.net> reports
+ # that the semantics of dynamic libraries on AmigaOS, at least up
+ # to version 4, is to share data among multiple programs linked
+ # with the same dynamic library. Since this doesn't match the
+ # behavior of shared libraries on other platforms, we can't use
+ # them.
+ ld_shlibs_GCJ=no
+ ;;
+
+ beos*)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ allow_undefined_flag_GCJ=unsupported
+ # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+ # support --undefined. This deserves some investigation. FIXME
+ archive_cmds_GCJ='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ else
+ ld_shlibs_GCJ=no
+ fi
+ ;;
+
+ cygwin* | mingw* | pw32*)
+ # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, GCJ) is actually meaningless,
+ # as there is no search path for DLLs.
+ hardcode_libdir_flag_spec_GCJ='-L$libdir'
+ allow_undefined_flag_GCJ=unsupported
+ always_export_symbols_GCJ=no
+ enable_shared_with_static_runtimes_GCJ=yes
+ export_symbols_cmds_GCJ='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/'\'' -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols'
+
+ if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
+ archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+ # If the export-symbols file already is a .def file (1st line
+ # is EXPORTS), use it as is; otherwise, prepend...
+ archive_expsym_cmds_GCJ='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+ cp $export_symbols $output_objdir/$soname.def;
+ else
+ echo EXPORTS > $output_objdir/$soname.def;
+ cat $export_symbols >> $output_objdir/$soname.def;
+ fi~
+ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+ else
+ ld_shlibs_GCJ=no
+ fi
+ ;;
+
+ interix[3-9]*)
+ hardcode_direct_GCJ=no
+ hardcode_shlibpath_var_GCJ=no
+ hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir'
+ export_dynamic_flag_spec_GCJ='${wl}-E'
+ # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+ # Instead, shared libraries are loaded at an image base (0x10000000 by
+ # default) and relocated if they conflict, which is a slow very memory
+ # consuming and fragmenting process. To avoid this, we pick a random,
+ # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+ # time. Moving up from 0x10000000 also allows more sbrk(2) space.
+ archive_cmds_GCJ='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+ archive_expsym_cmds_GCJ='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+ ;;
+
+ gnu* | linux* | k*bsd*-gnu)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ tmp_addflag=
+ case $cc_basename,$host_cpu in
+ pgcc*) # Portland Group C compiler
+ whole_archive_flag_spec_GCJ='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
+ tmp_addflag=' $pic_flag'
+ ;;
+ pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers
+ whole_archive_flag_spec_GCJ='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
+ tmp_addflag=' $pic_flag -Mnomain' ;;
+ ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64
+ tmp_addflag=' -i_dynamic' ;;
+ efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64
+ tmp_addflag=' -i_dynamic -nofor_main' ;;
+ ifc* | ifort*) # Intel Fortran compiler
+ tmp_addflag=' -nofor_main' ;;
+ esac
+ case `$CC -V 2>&1 | sed 5q` in
+ *Sun\ C*) # Sun C 5.9
+ whole_archive_flag_spec_GCJ='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
+ tmp_sharedflag='-G' ;;
+ *Sun\ F*) # Sun Fortran 8.3
+ tmp_sharedflag='-G' ;;
+ *)
+ tmp_sharedflag='-shared' ;;
+ esac
+ archive_cmds_GCJ='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+
+ if test $supports_anon_versioning = yes; then
+ archive_expsym_cmds_GCJ='$echo "{ global:" > $output_objdir/$libname.ver~
+ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+ $echo "local: *; };" >> $output_objdir/$libname.ver~
+ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+ fi
+ else
+ ld_shlibs_GCJ=no
+ fi
+ ;;
+
+ netbsd*)
+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+ archive_cmds_GCJ='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+ wlarc=
+ else
+ archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ fi
+ ;;
+
+ solaris*)
+ if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then
+ ld_shlibs_GCJ=no
+ cat <<EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems. Therefore, libtool
+*** is disabling shared libraries support. We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer. Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+EOF
+ elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ else
+ ld_shlibs_GCJ=no
+ fi
+ ;;
+
+ sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+ case `$LD -v 2>&1` in
+ *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
+ ld_shlibs_GCJ=no
+ cat <<_LT_EOF 1>&2
+
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
+*** reliably create shared libraries on SCO systems. Therefore, libtool
+*** is disabling shared libraries support. We urge you to upgrade GNU
+*** binutils to release 2.16.91.0.3 or newer. Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+ ;;
+ *)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ hardcode_libdir_flag_spec_GCJ='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`'
+ archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib'
+ archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib'
+ else
+ ld_shlibs_GCJ=no
+ fi
+ ;;
+ esac
+ ;;
+
+ sunos4*)
+ archive_cmds_GCJ='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ wlarc=
+ hardcode_direct_GCJ=yes
+ hardcode_shlibpath_var_GCJ=no
+ ;;
+
+ *)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ else
+ ld_shlibs_GCJ=no
+ fi
+ ;;
+ esac
+
+ if test "$ld_shlibs_GCJ" = no; then
+ runpath_var=
+ hardcode_libdir_flag_spec_GCJ=
+ export_dynamic_flag_spec_GCJ=
+ whole_archive_flag_spec_GCJ=
+ fi
+ else
+ # PORTME fill in a description of your system's linker (not GNU ld)
+ case $host_os in
+ aix3*)
+ allow_undefined_flag_GCJ=unsupported
+ always_export_symbols_GCJ=yes
+ archive_expsym_cmds_GCJ='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+ # Note: this linker hardcodes the directories in LIBPATH if there
+ # are no directories specified by -L.
+ hardcode_minus_L_GCJ=yes
+ if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
+ # Neither direct hardcoding nor static linking is supported with a
+ # broken collect2.
+ hardcode_direct_GCJ=unsupported
+ fi
+ ;;
+
+ aix[4-9]*)
+ if test "$host_cpu" = ia64; then
+ # On IA64, the linker does run time linking by default, so we don't
+ # have to do anything special.
+ aix_use_runtimelinking=no
+ exp_sym_flag='-Bexport'
+ no_entry_flag=""
+ else
+ # If we're using GNU nm, then we don't want the "-C" option.
+ # -C means demangle to AIX nm, but means don't demangle with GNU nm
+ if $NM -V 2>&1 | grep 'GNU' > /dev/null; then
+ export_symbols_cmds_GCJ='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols'
+ else
+ export_symbols_cmds_GCJ='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols'
+ fi
+ aix_use_runtimelinking=no
+
+ # Test if we are trying to use run time linking or normal
+ # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+ # need to do runtime linking.
+ case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
+ for ld_flag in $LDFLAGS; do
+ if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+ aix_use_runtimelinking=yes
+ break
+ fi
+ done
+ ;;
+ esac
+
+ exp_sym_flag='-bexport'
+ no_entry_flag='-bnoentry'
+ fi
+
+ # When large executables or shared objects are built, AIX ld can
+ # have problems creating the table of contents. If linking a library
+ # or program results in "error TOC overflow" add -mminimal-toc to
+ # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not
+ # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+ archive_cmds_GCJ=''
+ hardcode_direct_GCJ=yes
+ hardcode_libdir_separator_GCJ=':'
+ link_all_deplibs_GCJ=yes
+
+ if test "$GCC" = yes; then
+ case $host_os in aix4.[012]|aix4.[012].*)
+ # We only want to do this on AIX 4.2 and lower, the check
+ # below for broken collect2 doesn't work under 4.3+
+ collect2name=`${CC} -print-prog-name=collect2`
+ if test -f "$collect2name" && \
+ strings "$collect2name" | grep resolve_lib_name >/dev/null
+ then
+ # We have reworked collect2
+ :
+ else
+ # We have old collect2
+ hardcode_direct_GCJ=unsupported
+ # It fails to find uninstalled libraries when the uninstalled
+ # path is not listed in the libpath. Setting hardcode_minus_L
+ # to unsupported forces relinking
+ hardcode_minus_L_GCJ=yes
+ hardcode_libdir_flag_spec_GCJ='-L$libdir'
+ hardcode_libdir_separator_GCJ=
+ fi
+ ;;
+ esac
+ shared_flag='-shared'
+ if test "$aix_use_runtimelinking" = yes; then
+ shared_flag="$shared_flag "'${wl}-G'
+ fi
+ else
+ # not using gcc
+ if test "$host_cpu" = ia64; then
+ # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+ # chokes on -Wl,-G. The following line is correct:
+ shared_flag='-G'
+ else
+ if test "$aix_use_runtimelinking" = yes; then
+ shared_flag='${wl}-G'
+ else
+ shared_flag='${wl}-bM:SRE'
+ fi
+ fi
+ fi
+
+ # It seems that -bexpall does not export symbols beginning with
+ # underscore (_), so it is better to generate a list of symbols to export.
+ always_export_symbols_GCJ=yes
+ if test "$aix_use_runtimelinking" = yes; then
+ # Warning - without using the other runtime loading flags (-brtl),
+ # -berok will link without error, but may produce a broken library.
+ allow_undefined_flag_GCJ='-berok'
+ # Determine the default libpath from the value encoded in an empty executable.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext && {
+ test "$cross_compiling" = yes ||
+ $as_test_x conftest$ac_exeext
+ }; then
+
+lt_aix_libpath_sed='
+ /Import File Strings/,/^$/ {
+ /^0/ {
+ s/^0 *\(.*\)$/\1/
+ p
+ }
+ }'
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then
+ aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+fi
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -rf conftest.dSYM
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+ conftest$ac_exeext conftest.$ac_ext
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+
+ hardcode_libdir_flag_spec_GCJ='${wl}-blibpath:$libdir:'"$aix_libpath"
+ archive_expsym_cmds_GCJ="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+ else
+ if test "$host_cpu" = ia64; then
+ hardcode_libdir_flag_spec_GCJ='${wl}-R $libdir:/usr/lib:/lib'
+ allow_undefined_flag_GCJ="-z nodefs"
+ archive_expsym_cmds_GCJ="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+ else
+ # Determine the default libpath from the value encoded in an empty executable.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext && {
+ test "$cross_compiling" = yes ||
+ $as_test_x conftest$ac_exeext
+ }; then
+
+lt_aix_libpath_sed='
+ /Import File Strings/,/^$/ {
+ /^0/ {
+ s/^0 *\(.*\)$/\1/
+ p
+ }
+ }'
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then
+ aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+fi
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -rf conftest.dSYM
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+ conftest$ac_exeext conftest.$ac_ext
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+
+ hardcode_libdir_flag_spec_GCJ='${wl}-blibpath:$libdir:'"$aix_libpath"
+ # Warning - without using the other run time loading flags,
+ # -berok will link without error, but may produce a broken library.
+ no_undefined_flag_GCJ=' ${wl}-bernotok'
+ allow_undefined_flag_GCJ=' ${wl}-berok'
+ # Exported symbols can be pulled into shared objects from archives
+ whole_archive_flag_spec_GCJ='$convenience'
+ archive_cmds_need_lc_GCJ=yes
+ # This is similar to how AIX traditionally builds its shared libraries.
+ archive_expsym_cmds_GCJ="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+ fi
+ fi
+ ;;
+
+ amigaos*)
+ archive_cmds_GCJ='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+ hardcode_libdir_flag_spec_GCJ='-L$libdir'
+ hardcode_minus_L_GCJ=yes
+ # see comment about different semantics on the GNU ld section
+ ld_shlibs_GCJ=no
+ ;;
+
+ bsdi[45]*)
+ export_dynamic_flag_spec_GCJ=-rdynamic
+ ;;
+
+ cygwin* | mingw* | pw32*)
+ # When not using gcc, we currently assume that we are using
+ # Microsoft Visual C++.
+ # hardcode_libdir_flag_spec is actually meaningless, as there is
+ # no search path for DLLs.
+ hardcode_libdir_flag_spec_GCJ=' '
+ allow_undefined_flag_GCJ=unsupported
+ # Tell ltmain to make .lib files, not .a files.
+ libext=lib
+ # Tell ltmain to make .dll files, not .so files.
+ shrext_cmds=".dll"
+ # FIXME: Setting linknames here is a bad hack.
+ archive_cmds_GCJ='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames='
+ # The linker will automatically build a .lib file if we build a DLL.
+ old_archive_From_new_cmds_GCJ='true'
+ # FIXME: Should let the user specify the lib program.
+ old_archive_cmds_GCJ='lib -OUT:$oldlib$oldobjs$old_deplibs'
+ fix_srcfile_path_GCJ='`cygpath -w "$srcfile"`'
+ enable_shared_with_static_runtimes_GCJ=yes
+ ;;
+
+ darwin* | rhapsody*)
+ case $host_os in
+ rhapsody* | darwin1.[012])
+ allow_undefined_flag_GCJ='${wl}-undefined ${wl}suppress'
+ ;;
+ *) # Darwin 1.3 on
+ if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then
+ allow_undefined_flag_GCJ='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
+ else
+ case ${MACOSX_DEPLOYMENT_TARGET} in
+ 10.[012])
+ allow_undefined_flag_GCJ='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
+ ;;
+ 10.*)
+ allow_undefined_flag_GCJ='${wl}-undefined ${wl}dynamic_lookup'
+ ;;
+ esac
+ fi
+ ;;
+ esac
+ archive_cmds_need_lc_GCJ=no
+ hardcode_direct_GCJ=no
+ hardcode_automatic_GCJ=yes
+ hardcode_shlibpath_var_GCJ=unsupported
+ whole_archive_flag_spec_GCJ=''
+ link_all_deplibs_GCJ=yes
+ if test "$GCC" = yes ; then
+ output_verbose_link_cmd='echo'
+ archive_cmds_GCJ="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
+ module_cmds_GCJ="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
+ archive_expsym_cmds_GCJ="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
+ module_expsym_cmds_GCJ="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
+ else
+ case $cc_basename in
+ xlc*)
+ output_verbose_link_cmd='echo'
+ archive_cmds_GCJ='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $xlcverstring'
+ module_cmds_GCJ='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
+ archive_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $xlcverstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ module_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ ;;
+ *)
+ ld_shlibs_GCJ=no
+ ;;
+ esac
+ fi
+ ;;
+
+ dgux*)
+ archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_libdir_flag_spec_GCJ='-L$libdir'
+ hardcode_shlibpath_var_GCJ=no
+ ;;
+
+ freebsd1*)
+ ld_shlibs_GCJ=no
+ ;;
+
+ # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+ # support. Future versions do this automatically, but an explicit c++rt0.o
+ # does not break anything, and helps significantly (at the cost of a little
+ # extra space).
+ freebsd2.2*)
+ archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+ hardcode_libdir_flag_spec_GCJ='-R$libdir'
+ hardcode_direct_GCJ=yes
+ hardcode_shlibpath_var_GCJ=no
+ ;;
+
+ # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+ freebsd2*)
+ archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct_GCJ=yes
+ hardcode_minus_L_GCJ=yes
+ hardcode_shlibpath_var_GCJ=no
+ ;;
+
+ # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+ freebsd* | dragonfly*)
+ archive_cmds_GCJ='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
+ hardcode_libdir_flag_spec_GCJ='-R$libdir'
+ hardcode_direct_GCJ=yes
+ hardcode_shlibpath_var_GCJ=no
+ ;;
+
+ hpux9*)
+ if test "$GCC" = yes; then
+ archive_cmds_GCJ='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+ else
+ archive_cmds_GCJ='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+ fi
+ hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir'
+ hardcode_libdir_separator_GCJ=:
+ hardcode_direct_GCJ=yes
+
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L_GCJ=yes
+ export_dynamic_flag_spec_GCJ='${wl}-E'
+ ;;
+
+ hpux10*)
+ if test "$GCC" = yes -a "$with_gnu_ld" = no; then
+ archive_cmds_GCJ='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds_GCJ='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+ fi
+ if test "$with_gnu_ld" = no; then
+ hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir'
+ hardcode_libdir_separator_GCJ=:
+
+ hardcode_direct_GCJ=yes
+ export_dynamic_flag_spec_GCJ='${wl}-E'
+
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L_GCJ=yes
+ fi
+ ;;
+
+ hpux11*)
+ if test "$GCC" = yes -a "$with_gnu_ld" = no; then
+ case $host_cpu in
+ hppa*64*)
+ archive_cmds_GCJ='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ ia64*)
+ archive_cmds_GCJ='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+ archive_cmds_GCJ='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ esac
+ else
+ case $host_cpu in
+ hppa*64*)
+ archive_cmds_GCJ='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ ia64*)
+ archive_cmds_GCJ='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+ archive_cmds_GCJ='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ esac
+ fi
+ if test "$with_gnu_ld" = no; then
+ hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir'
+ hardcode_libdir_separator_GCJ=:
+
+ case $host_cpu in
+ hppa*64*|ia64*)
+ hardcode_libdir_flag_spec_ld_GCJ='+b $libdir'
+ hardcode_direct_GCJ=no
+ hardcode_shlibpath_var_GCJ=no
+ ;;
+ *)
+ hardcode_direct_GCJ=yes
+ export_dynamic_flag_spec_GCJ='${wl}-E'
+
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L_GCJ=yes
+ ;;
+ esac
+ fi
+ ;;
+
+ irix5* | irix6* | nonstopux*)
+ if test "$GCC" = yes; then
+ archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ else
+ archive_cmds_GCJ='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+ hardcode_libdir_flag_spec_ld_GCJ='-rpath $libdir'
+ fi
+ hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator_GCJ=:
+ link_all_deplibs_GCJ=yes
+ ;;
+
+ netbsd*)
+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+ archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out
+ else
+ archive_cmds_GCJ='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF
+ fi
+ hardcode_libdir_flag_spec_GCJ='-R$libdir'
+ hardcode_direct_GCJ=yes
+ hardcode_shlibpath_var_GCJ=no
+ ;;
+
+ newsos6)
+ archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct_GCJ=yes
+ hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator_GCJ=:
+ hardcode_shlibpath_var_GCJ=no
+ ;;
+
+ openbsd*)
+ if test -f /usr/libexec/ld.so; then
+ hardcode_direct_GCJ=yes
+ hardcode_shlibpath_var_GCJ=no
+ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+ archive_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
+ hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir'
+ export_dynamic_flag_spec_GCJ='${wl}-E'
+ else
+ case $host_os in
+ openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
+ archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_libdir_flag_spec_GCJ='-R$libdir'
+ ;;
+ *)
+ archive_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir'
+ ;;
+ esac
+ fi
+ else
+ ld_shlibs_GCJ=no
+ fi
+ ;;
+
+ os2*)
+ hardcode_libdir_flag_spec_GCJ='-L$libdir'
+ hardcode_minus_L_GCJ=yes
+ allow_undefined_flag_GCJ=unsupported
+ archive_cmds_GCJ='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
+ old_archive_From_new_cmds_GCJ='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+ ;;
+
+ osf3*)
+ if test "$GCC" = yes; then
+ allow_undefined_flag_GCJ=' ${wl}-expect_unresolved ${wl}\*'
+ archive_cmds_GCJ='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ else
+ allow_undefined_flag_GCJ=' -expect_unresolved \*'
+ archive_cmds_GCJ='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+ fi
+ hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator_GCJ=:
+ ;;
+
+ osf4* | osf5*) # as osf3* with the addition of -msym flag
+ if test "$GCC" = yes; then
+ allow_undefined_flag_GCJ=' ${wl}-expect_unresolved ${wl}\*'
+ archive_cmds_GCJ='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir'
+ else
+ allow_undefined_flag_GCJ=' -expect_unresolved \*'
+ archive_cmds_GCJ='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+ archive_expsym_cmds_GCJ='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~
+ $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp'
+
+ # Both c and cxx compiler support -rpath directly
+ hardcode_libdir_flag_spec_GCJ='-rpath $libdir'
+ fi
+ hardcode_libdir_separator_GCJ=:
+ ;;
+
+ solaris*)
+ no_undefined_flag_GCJ=' -z text'
+ if test "$GCC" = yes; then
+ wlarc='${wl}'
+ archive_cmds_GCJ='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+ $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp'
+ else
+ wlarc=''
+ archive_cmds_GCJ='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp'
+ fi
+ hardcode_libdir_flag_spec_GCJ='-R$libdir'
+ hardcode_shlibpath_var_GCJ=no
+ case $host_os in
+ solaris2.[0-5] | solaris2.[0-5].*) ;;
+ *)
+ # The compiler driver will combine and reorder linker options,
+ # but understands `-z linker_flag'. GCC discards it without `$wl',
+ # but is careful enough not to reorder.
+ # Supported since Solaris 2.6 (maybe 2.5.1?)
+ if test "$GCC" = yes; then
+ whole_archive_flag_spec_GCJ='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+ else
+ whole_archive_flag_spec_GCJ='-z allextract$convenience -z defaultextract'
+ fi
+ ;;
+ esac
+ link_all_deplibs_GCJ=yes
+ ;;
+
+ sunos4*)
+ if test "x$host_vendor" = xsequent; then
+ # Use $CC to link under sequent, because it throws in some extra .o
+ # files that make .init and .fini sections work.
+ archive_cmds_GCJ='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds_GCJ='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+ fi
+ hardcode_libdir_flag_spec_GCJ='-L$libdir'
+ hardcode_direct_GCJ=yes
+ hardcode_minus_L_GCJ=yes
+ hardcode_shlibpath_var_GCJ=no
+ ;;
+
+ sysv4)
+ case $host_vendor in
+ sni)
+ archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct_GCJ=yes # is this really true???
+ ;;
+ siemens)
+ ## LD is ld it makes a PLAMLIB
+ ## CC just makes a GrossModule.
+ archive_cmds_GCJ='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+ reload_cmds_GCJ='$CC -r -o $output$reload_objs'
+ hardcode_direct_GCJ=no
+ ;;
+ motorola)
+ archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct_GCJ=no #Motorola manual says yes, but my tests say they lie
+ ;;
+ esac
+ runpath_var='LD_RUN_PATH'
+ hardcode_shlibpath_var_GCJ=no
+ ;;
+
+ sysv4.3*)
+ archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_shlibpath_var_GCJ=no
+ export_dynamic_flag_spec_GCJ='-Bexport'
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_shlibpath_var_GCJ=no
+ runpath_var=LD_RUN_PATH
+ hardcode_runpath_var=yes
+ ld_shlibs_GCJ=yes
+ fi
+ ;;
+
+ sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
+ no_undefined_flag_GCJ='${wl}-z,text'
+ archive_cmds_need_lc_GCJ=no
+ hardcode_shlibpath_var_GCJ=no
+ runpath_var='LD_RUN_PATH'
+
+ if test "$GCC" = yes; then
+ archive_cmds_GCJ='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_GCJ='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds_GCJ='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_GCJ='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ fi
+ ;;
+
+ sysv5* | sco3.2v5* | sco5v6*)
+ # Note: We can NOT use -z defs as we might desire, because we do not
+ # link with -lc, and that would cause any symbols used from libc to
+ # always be unresolved, which means just about no library would
+ # ever link correctly. If we're not using GNU ld we use -z text
+ # though, which does catch some bad symbols but isn't as heavy-handed
+ # as -z defs.
+ no_undefined_flag_GCJ='${wl}-z,text'
+ allow_undefined_flag_GCJ='${wl}-z,nodefs'
+ archive_cmds_need_lc_GCJ=no
+ hardcode_shlibpath_var_GCJ=no
+ hardcode_libdir_flag_spec_GCJ='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`'
+ hardcode_libdir_separator_GCJ=':'
+ link_all_deplibs_GCJ=yes
+ export_dynamic_flag_spec_GCJ='${wl}-Bexport'
+ runpath_var='LD_RUN_PATH'
+
+ if test "$GCC" = yes; then
+ archive_cmds_GCJ='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_GCJ='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds_GCJ='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_GCJ='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ fi
+ ;;
+
+ uts4*)
+ archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_libdir_flag_spec_GCJ='-L$libdir'
+ hardcode_shlibpath_var_GCJ=no
+ ;;
+
+ *)
+ ld_shlibs_GCJ=no
+ ;;
+ esac
+ fi
+
+{ $as_echo "$as_me:$LINENO: result: $ld_shlibs_GCJ" >&5
+$as_echo "$ld_shlibs_GCJ" >&6; }
+test "$ld_shlibs_GCJ" = no && can_build_shared=no
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$archive_cmds_need_lc_GCJ" in
+x|xyes)
+ # Assume -lc should be added
+ archive_cmds_need_lc_GCJ=yes
+
+ if test "$enable_shared" = yes && test "$GCC" = yes; then
+ case $archive_cmds_GCJ in
+ *'~'*)
+ # FIXME: we may have to deal with multi-command sequences.
+ ;;
+ '$CC '*)
+ # Test whether the compiler implicitly links with -lc since on some
+ # systems, -lgcc has to come before -lc. If gcc already passes -lc
+ # to ld, don't add -lc before -lgcc.
+ { $as_echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5
+$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; }
+ $rm conftest*
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } 2>conftest.err; then
+ soname=conftest
+ lib=conftest
+ libobjs=conftest.$ac_objext
+ deplibs=
+ wl=$lt_prog_compiler_wl_GCJ
+ pic_flag=$lt_prog_compiler_pic_GCJ
+ compiler_flags=-v
+ linker_flags=-v
+ verstring=
+ output_objdir=.
+ libname=conftest
+ lt_save_allow_undefined_flag=$allow_undefined_flag_GCJ
+ allow_undefined_flag_GCJ=
+ if { (eval echo "$as_me:$LINENO: \"$archive_cmds_GCJ 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5
+ (eval $archive_cmds_GCJ 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+ then
+ archive_cmds_need_lc_GCJ=no
+ else
+ archive_cmds_need_lc_GCJ=yes
+ fi
+ allow_undefined_flag_GCJ=$lt_save_allow_undefined_flag
+ else
+ cat conftest.err 1>&5
+ fi
+ $rm conftest*
+ { $as_echo "$as_me:$LINENO: result: $archive_cmds_need_lc_GCJ" >&5
+$as_echo "$archive_cmds_need_lc_GCJ" >&6; }
+ ;;
+ esac
+ fi
+ ;;
+esac
+
+{ $as_echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5
+$as_echo_n "checking dynamic linker characteristics... " >&6; }
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=".so"
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+case $host_os in
+aix3*)
+ version_type=linux
+ library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+ shlibpath_var=LIBPATH
+
+ # AIX 3 has no versioning support, so we append a major version to the name.
+ soname_spec='${libname}${release}${shared_ext}$major'
+ ;;
+
+aix[4-9]*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ hardcode_into_libs=yes
+ if test "$host_cpu" = ia64; then
+ # AIX 5 supports IA64
+ library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+ shlibpath_var=LD_LIBRARY_PATH
+ else
+ # With GCC up to 2.95.x, collect2 would create an import file
+ # for dependence libraries. The import file would start with
+ # the line `#! .'. This would cause the generated library to
+ # depend on `.', always an invalid library. This was fixed in
+ # development snapshots of GCC prior to 3.0.
+ case $host_os in
+ aix4 | aix4.[01] | aix4.[01].*)
+ if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+ echo ' yes '
+ echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then
+ :
+ else
+ can_build_shared=no
+ fi
+ ;;
+ esac
+ # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+ # soname into executable. Probably we can add versioning support to
+ # collect2, so additional links can be useful in future.
+ if test "$aix_use_runtimelinking" = yes; then
+ # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+ # instead of lib<name>.a to let people know that these are not
+ # typical AIX shared libraries.
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ else
+ # We preserve .a as extension for shared libraries through AIX4.2
+ # and later when we are not doing run time linking.
+ library_names_spec='${libname}${release}.a $libname.a'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ fi
+ shlibpath_var=LIBPATH
+ fi
+ ;;
+
+amigaos*)
+ library_names_spec='$libname.ixlibrary $libname.a'
+ # Create ${libname}_ixlibrary.a entries in /sys/libs.
+ finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+ ;;
+
+beos*)
+ library_names_spec='${libname}${shared_ext}'
+ dynamic_linker="$host_os ld.so"
+ shlibpath_var=LIBRARY_PATH
+ ;;
+
+bsdi[45]*)
+ version_type=linux
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+ sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+ # the default ld.so.conf also contains /usr/contrib/lib and
+ # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+ # libtool to hard-code these into programs
+ ;;
+
+cygwin* | mingw* | pw32*)
+ version_type=windows
+ shrext_cmds=".dll"
+ need_version=no
+ need_lib_prefix=no
+
+ case $GCC,$host_os in
+ yes,cygwin* | yes,mingw* | yes,pw32*)
+ library_names_spec='$libname.dll.a'
+ # DLL is installed to $(libdir)/../bin by postinstall_cmds
+ postinstall_cmds='base_file=`basename \${file}`~
+ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~
+ dldir=$destdir/`dirname \$dlpath`~
+ test -d \$dldir || mkdir -p \$dldir~
+ $install_prog $dir/$dlname \$dldir/$dlname~
+ chmod a+x \$dldir/$dlname'
+ postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+ dlpath=$dir/\$dldll~
+ $rm \$dlpath'
+ shlibpath_overrides_runpath=yes
+
+ case $host_os in
+ cygwin*)
+ # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+ soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+ sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib"
+ ;;
+ mingw*)
+ # MinGW DLLs use traditional 'lib' prefix
+ soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+ sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+ if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then
+ # It is most probably a Windows format PATH printed by
+ # mingw gcc, but we are running on Cygwin. Gcc prints its search
+ # path with ; separators, and with drive letters. We can handle the
+ # drive letters (cygwin fileutils understands them), so leave them,
+ # especially as we might pass files found there to a mingw objdump,
+ # which wouldn't understand a cygwinified path. Ahh.
+ sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+ else
+ sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+ fi
+ ;;
+ pw32*)
+ # pw32 DLLs use 'pw' prefix rather than 'lib'
+ library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+ ;;
+ esac
+ ;;
+
+ *)
+ library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
+ ;;
+ esac
+ dynamic_linker='Win32 ld.exe'
+ # FIXME: first we should search . and the directory the executable is in
+ shlibpath_var=PATH
+ ;;
+
+darwin* | rhapsody*)
+ dynamic_linker="$host_os dyld"
+ version_type=darwin
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext'
+ soname_spec='${libname}${release}${major}$shared_ext'
+ shlibpath_overrides_runpath=yes
+ shlibpath_var=DYLD_LIBRARY_PATH
+ shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+
+ sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+ ;;
+
+dgux*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+freebsd1*)
+ dynamic_linker=no
+ ;;
+
+freebsd* | dragonfly*)
+ # DragonFly does not have aout. When/if they implement a new
+ # versioning mechanism, adjust this.
+ if test -x /usr/bin/objformat; then
+ objformat=`/usr/bin/objformat`
+ else
+ case $host_os in
+ freebsd[123]*) objformat=aout ;;
+ *) objformat=elf ;;
+ esac
+ fi
+ version_type=freebsd-$objformat
+ case $version_type in
+ freebsd-elf*)
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+ need_version=no
+ need_lib_prefix=no
+ ;;
+ freebsd-*)
+ library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+ need_version=yes
+ ;;
+ esac
+ shlibpath_var=LD_LIBRARY_PATH
+ case $host_os in
+ freebsd2*)
+ shlibpath_overrides_runpath=yes
+ ;;
+ freebsd3.[01]* | freebsdelf3.[01]*)
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+ freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
+ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+ *) # from 4.6 on, and DragonFly
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+ esac
+ ;;
+
+gnu*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ hardcode_into_libs=yes
+ ;;
+
+hpux9* | hpux10* | hpux11*)
+ # Give a soname corresponding to the major version so that dld.sl refuses to
+ # link against other versions.
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=no
+ case $host_cpu in
+ ia64*)
+ shrext_cmds='.so'
+ hardcode_into_libs=yes
+ dynamic_linker="$host_os dld.so"
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ if test "X$HPUX_IA64_MODE" = X32; then
+ sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+ else
+ sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+ fi
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ ;;
+ hppa*64*)
+ shrext_cmds='.sl'
+ hardcode_into_libs=yes
+ dynamic_linker="$host_os dld.sl"
+ shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ ;;
+ *)
+ shrext_cmds='.sl'
+ dynamic_linker="$host_os dld.sl"
+ shlibpath_var=SHLIB_PATH
+ shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ ;;
+ esac
+ # HP-UX runs *really* slowly unless shared libraries are mode 555.
+ postinstall_cmds='chmod 555 $lib'
+ ;;
+
+interix[3-9]*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+
+irix5* | irix6* | nonstopux*)
+ case $host_os in
+ nonstopux*) version_type=nonstopux ;;
+ *)
+ if test "$lt_cv_prog_gnu_ld" = yes; then
+ version_type=linux
+ else
+ version_type=irix
+ fi ;;
+ esac
+ need_lib_prefix=no
+ need_version=no
+ soname_spec='${libname}${release}${shared_ext}$major'
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+ case $host_os in
+ irix5* | nonstopux*)
+ libsuff= shlibsuff=
+ ;;
+ *)
+ case $LD in # libtool.m4 will add one of these switches to LD
+ *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+ libsuff= shlibsuff= libmagic=32-bit;;
+ *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+ libsuff=32 shlibsuff=N32 libmagic=N32;;
+ *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+ libsuff=64 shlibsuff=64 libmagic=64-bit;;
+ *) libsuff= shlibsuff= libmagic=never-match;;
+ esac
+ ;;
+ esac
+ shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+ shlibpath_overrides_runpath=no
+ sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+ sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+ hardcode_into_libs=yes
+ ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+ dynamic_linker=no
+ ;;
+
+# This must be Linux ELF.
+linux* | k*bsd*-gnu)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ # This implies no fast_install, which is unacceptable.
+ # Some rework will be needed to allow for fast_install
+ # before this can be enabled.
+ hardcode_into_libs=yes
+ sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+ sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+
+ # Append ld.so.conf contents to the search path
+ if test -f /etc/ld.so.conf; then
+ lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '`
+ sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra"
+ fi
+
+ # We used to test for /lib/ld.so.1 and disable shared libraries on
+ # powerpc, because MkLinux only supported shared libraries with the
+ # GNU dynamic linker. Since this was broken with cross compilers,
+ # most powerpc-linux boxes support dynamic linking these days and
+ # people can always --disable-shared, the test was removed, and we
+ # assume the GNU/Linux dynamic linker is in use.
+ dynamic_linker='GNU/Linux ld.so'
+ ;;
+
+netbsd*)
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=no
+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+ dynamic_linker='NetBSD (a.out) ld.so'
+ else
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ dynamic_linker='NetBSD ld.elf_so'
+ fi
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+
+newsos6)
+ version_type=linux
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ ;;
+
+nto-qnx*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ ;;
+
+openbsd*)
+ version_type=sunos
+ sys_lib_dlsearch_path_spec="/usr/lib"
+ need_lib_prefix=no
+ # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
+ case $host_os in
+ openbsd3.3 | openbsd3.3.*) need_version=yes ;;
+ *) need_version=no ;;
+ esac
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+ case $host_os in
+ openbsd2.[89] | openbsd2.[89].*)
+ shlibpath_overrides_runpath=no
+ ;;
+ *)
+ shlibpath_overrides_runpath=yes
+ ;;
+ esac
+ else
+ shlibpath_overrides_runpath=yes
+ fi
+ ;;
+
+os2*)
+ libname_spec='$name'
+ shrext_cmds=".dll"
+ need_lib_prefix=no
+ library_names_spec='$libname${shared_ext} $libname.a'
+ dynamic_linker='OS/2 ld.exe'
+ shlibpath_var=LIBPATH
+ ;;
+
+osf3* | osf4* | osf5*)
+ version_type=osf
+ need_lib_prefix=no
+ need_version=no
+ soname_spec='${libname}${release}${shared_ext}$major'
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ shlibpath_var=LD_LIBRARY_PATH
+ sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+ sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+ ;;
+
+rdos*)
+ dynamic_linker=no
+ ;;
+
+solaris*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ # ldd complains unless libraries are executable
+ postinstall_cmds='chmod +x $lib'
+ ;;
+
+sunos4*)
+ version_type=sunos
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+ finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ if test "$with_gnu_ld" = yes; then
+ need_lib_prefix=no
+ fi
+ need_version=yes
+ ;;
+
+sysv4 | sysv4.3*)
+ version_type=linux
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ case $host_vendor in
+ sni)
+ shlibpath_overrides_runpath=no
+ need_lib_prefix=no
+ export_dynamic_flag_spec='${wl}-Blargedynsym'
+ runpath_var=LD_RUN_PATH
+ ;;
+ siemens)
+ need_lib_prefix=no
+ ;;
+ motorola)
+ need_lib_prefix=no
+ need_version=no
+ shlibpath_overrides_runpath=no
+ sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+ ;;
+ esac
+ ;;
+
+sysv4*MP*)
+ if test -d /usr/nec ;then
+ version_type=linux
+ library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
+ soname_spec='$libname${shared_ext}.$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ fi
+ ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+ version_type=freebsd-elf
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ hardcode_into_libs=yes
+ if test "$with_gnu_ld" = yes; then
+ sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+ shlibpath_overrides_runpath=no
+ else
+ sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+ shlibpath_overrides_runpath=yes
+ case $host_os in
+ sco3.2v5*)
+ sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+ ;;
+ esac
+ fi
+ sys_lib_dlsearch_path_spec='/usr/lib'
+ ;;
+
+uts4*)
+ version_type=linux
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+*)
+ dynamic_linker=no
+ ;;
+esac
+{ $as_echo "$as_me:$LINENO: result: $dynamic_linker" >&5
+$as_echo "$dynamic_linker" >&6; }
+test "$dynamic_linker" = no && can_build_shared=no
+
+if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_sys_lib_search_path_spec="$sys_lib_search_path_spec"
+fi
+
+sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
+if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec"
+fi
+
+sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test "$GCC" = yes; then
+ variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+{ $as_echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5
+$as_echo_n "checking how to hardcode library paths into programs... " >&6; }
+hardcode_action_GCJ=
+if test -n "$hardcode_libdir_flag_spec_GCJ" || \
+ test -n "$runpath_var_GCJ" || \
+ test "X$hardcode_automatic_GCJ" = "Xyes" ; then
+
+ # We can hardcode non-existant directories.
+ if test "$hardcode_direct_GCJ" != no &&
+ # If the only mechanism to avoid hardcoding is shlibpath_var, we
+ # have to relink, otherwise we might link with an installed library
+ # when we should be linking with a yet-to-be-installed one
+ ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, GCJ)" != no &&
+ test "$hardcode_minus_L_GCJ" != no; then
+ # Linking always hardcodes the temporary library directory.
+ hardcode_action_GCJ=relink
+ else
+ # We can link without hardcoding, and we can hardcode nonexisting dirs.
+ hardcode_action_GCJ=immediate
+ fi
+else
+ # We cannot hardcode anything, or else we can only hardcode existing
+ # directories.
+ hardcode_action_GCJ=unsupported
+fi
+{ $as_echo "$as_me:$LINENO: result: $hardcode_action_GCJ" >&5
+$as_echo "$hardcode_action_GCJ" >&6; }
+
+if test "$hardcode_action_GCJ" = relink; then
+ # Fast installation is not supported
+ enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+ test "$enable_shared" = no; then
+ # Fast installation is not necessary
+ enable_fast_install=needless
+fi
+
+
+# The else clause should only fire when bootstrapping the
+# libtool distribution, otherwise you forgot to ship ltmain.sh
+# with your package, and you will get complaints that there are
+# no rules to generate ltmain.sh.
+if test -f "$ltmain"; then
+ # See if we are running on zsh, and set the options which allow our commands through
+ # without removal of \ escapes.
+ if test -n "${ZSH_VERSION+set}" ; then
+ setopt NO_GLOB_SUBST
+ fi
+ # Now quote all the things that may contain metacharacters while being
+ # careful not to overquote the AC_SUBSTed values. We take copies of the
+ # variables and quote the copies for generation of the libtool script.
+ for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \
+ SED SHELL STRIP \
+ libname_spec library_names_spec soname_spec extract_expsyms_cmds \
+ old_striplib striplib file_magic_cmd finish_cmds finish_eval \
+ deplibs_check_method reload_flag reload_cmds need_locks \
+ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \
+ lt_cv_sys_global_symbol_to_c_name_address \
+ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \
+ old_postinstall_cmds old_postuninstall_cmds \
+ compiler_GCJ \
+ CC_GCJ \
+ LD_GCJ \
+ lt_prog_compiler_wl_GCJ \
+ lt_prog_compiler_pic_GCJ \
+ lt_prog_compiler_static_GCJ \
+ lt_prog_compiler_no_builtin_flag_GCJ \
+ export_dynamic_flag_spec_GCJ \
+ thread_safe_flag_spec_GCJ \
+ whole_archive_flag_spec_GCJ \
+ enable_shared_with_static_runtimes_GCJ \
+ old_archive_cmds_GCJ \
+ old_archive_from_new_cmds_GCJ \
+ predep_objects_GCJ \
+ postdep_objects_GCJ \
+ predeps_GCJ \
+ postdeps_GCJ \
+ compiler_lib_search_path_GCJ \
+ compiler_lib_search_dirs_GCJ \
+ archive_cmds_GCJ \
+ archive_expsym_cmds_GCJ \
+ postinstall_cmds_GCJ \
+ postuninstall_cmds_GCJ \
+ old_archive_from_expsyms_cmds_GCJ \
+ allow_undefined_flag_GCJ \
+ no_undefined_flag_GCJ \
+ export_symbols_cmds_GCJ \
+ hardcode_libdir_flag_spec_GCJ \
+ hardcode_libdir_flag_spec_ld_GCJ \
+ hardcode_libdir_separator_GCJ \
+ hardcode_automatic_GCJ \
+ module_cmds_GCJ \
+ module_expsym_cmds_GCJ \
+ lt_cv_prog_compiler_c_o_GCJ \
+ fix_srcfile_path_GCJ \
+ exclude_expsyms_GCJ \
+ include_expsyms_GCJ; do
+
+ case $var in
+ old_archive_cmds_GCJ | \
+ old_archive_from_new_cmds_GCJ | \
+ archive_cmds_GCJ | \
+ archive_expsym_cmds_GCJ | \
+ module_cmds_GCJ | \
+ module_expsym_cmds_GCJ | \
+ old_archive_from_expsyms_cmds_GCJ | \
+ export_symbols_cmds_GCJ | \
+ extract_expsyms_cmds | reload_cmds | finish_cmds | \
+ postinstall_cmds | postuninstall_cmds | \
+ old_postinstall_cmds | old_postuninstall_cmds | \
+ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec)
+ # Double-quote double-evaled strings.
+ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\""
+ ;;
+ *)
+ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\""
+ ;;
+ esac
+ done
+
+ case $lt_echo in
+ *'\$0 --fallback-echo"')
+ lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'`
+ ;;
+ esac
+
+cfgfile="$ofile"
+
+ cat <<__EOF__ >> "$cfgfile"
+# ### BEGIN LIBTOOL TAG CONFIG: $tagname
+
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc_GCJ
+
+# Whether or not to disallow shared libs when runtime libs are static
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_GCJ
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# The host system.
+host_alias=$host_alias
+host=$host
+host_os=$host_os
+
+# The build system.
+build_alias=$build_alias
+build=$build
+build_os=$build_os
+
+# An echo program that does not interpret backslashes.
+echo=$lt_echo
+
+# The archiver.
+AR=$lt_AR
+AR_FLAGS=$lt_AR_FLAGS
+
+# A C compiler.
+LTCC=$lt_LTCC
+
+# LTCC compiler flags.
+LTCFLAGS=$lt_LTCFLAGS
+
+# A language-specific compiler.
+CC=$lt_compiler_GCJ
+
+# Is the compiler the GNU C compiler?
+with_gcc=$GCC_GCJ
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# The linker used to build libraries.
+LD=$lt_LD_GCJ
+
+# Whether we need hard or soft links.
+LN_S=$lt_LN_S
+
+# A BSD-compatible nm program.
+NM=$lt_NM
+
+# A symbol stripping program
+STRIP=$lt_STRIP
+
+# Used to examine libraries when file_magic_cmd begins "file"
+MAGIC_CMD=$MAGIC_CMD
+
+# Used on cygwin: DLL creation program.
+DLLTOOL="$DLLTOOL"
+
+# Used on cygwin: object dumper.
+OBJDUMP="$OBJDUMP"
+
+# Used on cygwin: assembler.
+AS="$AS"
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl_GCJ
+
+# Object file suffix (normally "o").
+objext="$ac_objext"
+
+# Old archive suffix (normally "a").
+libext="$libext"
+
+# Shared library suffix (normally ".so").
+shrext_cmds='$shrext_cmds'
+
+# Executable file suffix (normally "").
+exeext="$exeext"
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic_GCJ
+pic_mode=$pic_mode
+
+# What is the maximum length of a command?
+max_cmd_len=$lt_cv_sys_max_cmd_len
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o_GCJ
+
+# Must we lock files when doing compilation?
+need_locks=$lt_need_locks
+
+# Do we need the lib prefix for modules?
+need_lib_prefix=$need_lib_prefix
+
+# Do we need a version for libraries?
+need_version=$need_version
+
+# Whether dlopen is supported.
+dlopen_support=$enable_dlopen
+
+# Whether dlopen of programs is supported.
+dlopen_self=$enable_dlopen_self
+
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=$enable_dlopen_self_static
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static_GCJ
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_GCJ
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_GCJ
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec_GCJ
+
+# Compiler flag to generate thread-safe objects.
+thread_safe_flag_spec=$lt_thread_safe_flag_spec_GCJ
+
+# Library versioning type.
+version_type=$version_type
+
+# Format of library name prefix.
+libname_spec=$lt_libname_spec
+
+# List of archive names. First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME.
+library_names_spec=$lt_library_names_spec
+
+# The coded name of the library, if different from the real name.
+soname_spec=$lt_soname_spec
+
+# Commands used to build and install an old-style archive.
+RANLIB=$lt_RANLIB
+old_archive_cmds=$lt_old_archive_cmds_GCJ
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_GCJ
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_GCJ
+
+# Commands used to build and install a shared archive.
+archive_cmds=$lt_archive_cmds_GCJ
+archive_expsym_cmds=$lt_archive_expsym_cmds_GCJ
+postinstall_cmds=$lt_postinstall_cmds
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to build a loadable module (assumed same as above if empty)
+module_cmds=$lt_module_cmds_GCJ
+module_expsym_cmds=$lt_module_expsym_cmds_GCJ
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predep_objects=$lt_predep_objects_GCJ
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdep_objects=$lt_postdep_objects_GCJ
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predeps=$lt_predeps_GCJ
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdeps=$lt_postdeps_GCJ
+
+# The directories searched by this compiler when creating a shared
+# library
+compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_GCJ
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_compiler_lib_search_path_GCJ
+
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method=$lt_deplibs_check_method
+
+# Command to use when deplibs_check_method == file_magic.
+file_magic_cmd=$lt_file_magic_cmd
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag_GCJ
+
+# Flag that forces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag_GCJ
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# Same as above, but a single script fragment to be evaled but not shown.
+finish_eval=$lt_finish_eval
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
+
+# Transform the output of nm in a proper C declaration
+global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
+
+# Transform the output of nm in a C name address pair
+global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
+
+# This is the shared library runtime path variable.
+runpath_var=$runpath_var
+
+# This is the shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action_GCJ
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist.
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_GCJ
+
+# If ld is used when linking, flag to hardcode \$libdir into
+# a binary during linking. This must work even if \$libdir does
+# not exist.
+hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_GCJ
+
+# Whether we need a single -rpath flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator_GCJ
+
+# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the
+# resulting binary.
+hardcode_direct=$hardcode_direct_GCJ
+
+# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
+# resulting binary.
+hardcode_minus_L=$hardcode_minus_L_GCJ
+
+# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into
+# the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var_GCJ
+
+# Set to yes if building a shared library automatically hardcodes DIR into the library
+# and all subsequent libraries and executables linked against it.
+hardcode_automatic=$hardcode_automatic_GCJ
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at relink time.
+variables_saved_for_relink="$variables_saved_for_relink"
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs_GCJ
+
+# Compile-time system search path for libraries
+sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
+
+# Run-time system search path for libraries
+sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
+
+# Fix the shell variable \$srcfile for the compiler.
+fix_srcfile_path=$lt_fix_srcfile_path
+
+# Set to yes if exported symbols are required.
+always_export_symbols=$always_export_symbols_GCJ
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds_GCJ
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms_GCJ
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms_GCJ
+
+# ### END LIBTOOL TAG CONFIG: $tagname
+
+__EOF__
+
+
+else
+ # If there is no Makefile yet, we rely on a make rule to execute
+ # `config.status --recheck' to rerun these tests and create the
+ # libtool script then.
+ ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'`
+ if test -f "$ltmain_in"; then
+ test -f Makefile && make "$ltmain"
+ fi
+fi
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+CC="$lt_save_CC"
+
+ else
+ tagname=""
+ fi
+ ;;
+
+ RC)
+
+
+# Source file extension for RC test sources.
+ac_ext=rc
+
+# Object file extension for compiled RC test sources.
+objext=o
+objext_RC=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }'
+
+# Code to be used in simple link tests
+lt_simple_link_test_code="$lt_simple_compile_test_code"
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+# save warnings/boilerplate of simple test code
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$rm conftest*
+
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$rm -r conftest*
+
+
+# Allow CC to be a program name with arguments.
+lt_save_CC="$CC"
+CC=${RC-"windres"}
+compiler=$CC
+compiler_RC=$CC
+for cc_temp in $compiler""; do
+ case $cc_temp in
+ compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+ distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+ \-*) ;;
+ *) break;;
+ esac
+done
+cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+
+lt_cv_prog_compiler_c_o_RC=yes
+
+# The else clause should only fire when bootstrapping the
+# libtool distribution, otherwise you forgot to ship ltmain.sh
+# with your package, and you will get complaints that there are
+# no rules to generate ltmain.sh.
+if test -f "$ltmain"; then
+ # See if we are running on zsh, and set the options which allow our commands through
+ # without removal of \ escapes.
+ if test -n "${ZSH_VERSION+set}" ; then
+ setopt NO_GLOB_SUBST
+ fi
+ # Now quote all the things that may contain metacharacters while being
+ # careful not to overquote the AC_SUBSTed values. We take copies of the
+ # variables and quote the copies for generation of the libtool script.
+ for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \
+ SED SHELL STRIP \
+ libname_spec library_names_spec soname_spec extract_expsyms_cmds \
+ old_striplib striplib file_magic_cmd finish_cmds finish_eval \
+ deplibs_check_method reload_flag reload_cmds need_locks \
+ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \
+ lt_cv_sys_global_symbol_to_c_name_address \
+ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \
+ old_postinstall_cmds old_postuninstall_cmds \
+ compiler_RC \
+ CC_RC \
+ LD_RC \
+ lt_prog_compiler_wl_RC \
+ lt_prog_compiler_pic_RC \
+ lt_prog_compiler_static_RC \
+ lt_prog_compiler_no_builtin_flag_RC \
+ export_dynamic_flag_spec_RC \
+ thread_safe_flag_spec_RC \
+ whole_archive_flag_spec_RC \
+ enable_shared_with_static_runtimes_RC \
+ old_archive_cmds_RC \
+ old_archive_from_new_cmds_RC \
+ predep_objects_RC \
+ postdep_objects_RC \
+ predeps_RC \
+ postdeps_RC \
+ compiler_lib_search_path_RC \
+ compiler_lib_search_dirs_RC \
+ archive_cmds_RC \
+ archive_expsym_cmds_RC \
+ postinstall_cmds_RC \
+ postuninstall_cmds_RC \
+ old_archive_from_expsyms_cmds_RC \
+ allow_undefined_flag_RC \
+ no_undefined_flag_RC \
+ export_symbols_cmds_RC \
+ hardcode_libdir_flag_spec_RC \
+ hardcode_libdir_flag_spec_ld_RC \
+ hardcode_libdir_separator_RC \
+ hardcode_automatic_RC \
+ module_cmds_RC \
+ module_expsym_cmds_RC \
+ lt_cv_prog_compiler_c_o_RC \
+ fix_srcfile_path_RC \
+ exclude_expsyms_RC \
+ include_expsyms_RC; do
+
+ case $var in
+ old_archive_cmds_RC | \
+ old_archive_from_new_cmds_RC | \
+ archive_cmds_RC | \
+ archive_expsym_cmds_RC | \
+ module_cmds_RC | \
+ module_expsym_cmds_RC | \
+ old_archive_from_expsyms_cmds_RC | \
+ export_symbols_cmds_RC | \
+ extract_expsyms_cmds | reload_cmds | finish_cmds | \
+ postinstall_cmds | postuninstall_cmds | \
+ old_postinstall_cmds | old_postuninstall_cmds | \
+ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec)
+ # Double-quote double-evaled strings.
+ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\""
+ ;;
+ *)
+ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\""
+ ;;
+ esac
+ done
+
+ case $lt_echo in
+ *'\$0 --fallback-echo"')
+ lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'`
+ ;;
+ esac
+
+cfgfile="$ofile"
+
+ cat <<__EOF__ >> "$cfgfile"
+# ### BEGIN LIBTOOL TAG CONFIG: $tagname
+
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc_RC
+
+# Whether or not to disallow shared libs when runtime libs are static
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_RC
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# The host system.
+host_alias=$host_alias
+host=$host
+host_os=$host_os
+
+# The build system.
+build_alias=$build_alias
+build=$build
+build_os=$build_os
+
+# An echo program that does not interpret backslashes.
+echo=$lt_echo
+
+# The archiver.
+AR=$lt_AR
+AR_FLAGS=$lt_AR_FLAGS
+
+# A C compiler.
+LTCC=$lt_LTCC
+
+# LTCC compiler flags.
+LTCFLAGS=$lt_LTCFLAGS
+
+# A language-specific compiler.
+CC=$lt_compiler_RC
+
+# Is the compiler the GNU C compiler?
+with_gcc=$GCC_RC
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# The linker used to build libraries.
+LD=$lt_LD_RC
+
+# Whether we need hard or soft links.
+LN_S=$lt_LN_S
+
+# A BSD-compatible nm program.
+NM=$lt_NM
+
+# A symbol stripping program
+STRIP=$lt_STRIP
+
+# Used to examine libraries when file_magic_cmd begins "file"
+MAGIC_CMD=$MAGIC_CMD
+
+# Used on cygwin: DLL creation program.
+DLLTOOL="$DLLTOOL"
+
+# Used on cygwin: object dumper.
+OBJDUMP="$OBJDUMP"
+
+# Used on cygwin: assembler.
+AS="$AS"
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl_RC
+
+# Object file suffix (normally "o").
+objext="$ac_objext"
+
+# Old archive suffix (normally "a").
+libext="$libext"
+
+# Shared library suffix (normally ".so").
+shrext_cmds='$shrext_cmds'
+
+# Executable file suffix (normally "").
+exeext="$exeext"
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic_RC
+pic_mode=$pic_mode
+
+# What is the maximum length of a command?
+max_cmd_len=$lt_cv_sys_max_cmd_len
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o_RC
+
+# Must we lock files when doing compilation?
+need_locks=$lt_need_locks
+
+# Do we need the lib prefix for modules?
+need_lib_prefix=$need_lib_prefix
+
+# Do we need a version for libraries?
+need_version=$need_version
+
+# Whether dlopen is supported.
+dlopen_support=$enable_dlopen
+
+# Whether dlopen of programs is supported.
+dlopen_self=$enable_dlopen_self
+
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=$enable_dlopen_self_static
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static_RC
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_RC
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_RC
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec_RC
+
+# Compiler flag to generate thread-safe objects.
+thread_safe_flag_spec=$lt_thread_safe_flag_spec_RC
+
+# Library versioning type.
+version_type=$version_type
+
+# Format of library name prefix.
+libname_spec=$lt_libname_spec
+
+# List of archive names. First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME.
+library_names_spec=$lt_library_names_spec
+
+# The coded name of the library, if different from the real name.
+soname_spec=$lt_soname_spec
+
+# Commands used to build and install an old-style archive.
+RANLIB=$lt_RANLIB
+old_archive_cmds=$lt_old_archive_cmds_RC
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_RC
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_RC
+
+# Commands used to build and install a shared archive.
+archive_cmds=$lt_archive_cmds_RC
+archive_expsym_cmds=$lt_archive_expsym_cmds_RC
+postinstall_cmds=$lt_postinstall_cmds
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to build a loadable module (assumed same as above if empty)
+module_cmds=$lt_module_cmds_RC
+module_expsym_cmds=$lt_module_expsym_cmds_RC
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predep_objects=$lt_predep_objects_RC
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdep_objects=$lt_postdep_objects_RC
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predeps=$lt_predeps_RC
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdeps=$lt_postdeps_RC
+
+# The directories searched by this compiler when creating a shared
+# library
+compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_RC
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_compiler_lib_search_path_RC
+
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method=$lt_deplibs_check_method
+
+# Command to use when deplibs_check_method == file_magic.
+file_magic_cmd=$lt_file_magic_cmd
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag_RC
+
+# Flag that forces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag_RC
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# Same as above, but a single script fragment to be evaled but not shown.
+finish_eval=$lt_finish_eval
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
+
+# Transform the output of nm in a proper C declaration
+global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
+
+# Transform the output of nm in a C name address pair
+global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
+
+# This is the shared library runtime path variable.
+runpath_var=$runpath_var
+
+# This is the shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action_RC
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist.
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_RC
+
+# If ld is used when linking, flag to hardcode \$libdir into
+# a binary during linking. This must work even if \$libdir does
+# not exist.
+hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_RC
+
+# Whether we need a single -rpath flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator_RC
+
+# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the
+# resulting binary.
+hardcode_direct=$hardcode_direct_RC
+
+# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
+# resulting binary.
+hardcode_minus_L=$hardcode_minus_L_RC
+
+# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into
+# the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var_RC
+
+# Set to yes if building a shared library automatically hardcodes DIR into the library
+# and all subsequent libraries and executables linked against it.
+hardcode_automatic=$hardcode_automatic_RC
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at relink time.
+variables_saved_for_relink="$variables_saved_for_relink"
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs_RC
+
+# Compile-time system search path for libraries
+sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
+
+# Run-time system search path for libraries
+sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
+
+# Fix the shell variable \$srcfile for the compiler.
+fix_srcfile_path=$lt_fix_srcfile_path
+
+# Set to yes if exported symbols are required.
+always_export_symbols=$always_export_symbols_RC
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds_RC
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms_RC
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms_RC
+
+# ### END LIBTOOL TAG CONFIG: $tagname
+
+__EOF__
+
+
+else
+ # If there is no Makefile yet, we rely on a make rule to execute
+ # `config.status --recheck' to rerun these tests and create the
+ # libtool script then.
+ ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'`
+ if test -f "$ltmain_in"; then
+ test -f Makefile && make "$ltmain"
+ fi
+fi
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+CC="$lt_save_CC"
+
+ ;;
+
+ *)
+ { { $as_echo "$as_me:$LINENO: error: Unsupported tag name: $tagname" >&5
+$as_echo "$as_me: error: Unsupported tag name: $tagname" >&2;}
+ { (exit 1); exit 1; }; }
+ ;;
+ esac
+
+ # Append the new tag name to the list of available tags.
+ if test -n "$tagname" ; then
+ available_tags="$available_tags $tagname"
+ fi
+ fi
+ done
+ IFS="$lt_save_ifs"
+
+ # Now substitute the updated list of available tags.
+ if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then
+ mv "${ofile}T" "$ofile"
+ chmod +x "$ofile"
+ else
+ rm -f "${ofile}T"
+ { { $as_echo "$as_me:$LINENO: error: unable to update list of available tagged configurations." >&5
+$as_echo "$as_me: error: unable to update list of available tagged configurations." >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+fi
+
+
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh"
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+
+# Prevent multiple expansion
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# Checks for required libraries, don't set global -lpthread, -lm, -ljpeg, ... here, set in Makefile.
+{ $as_echo "$as_me:$LINENO: checking for pthread_create in -lpthread" >&5
+$as_echo_n "checking for pthread_create in -lpthread... " >&6; }
+if test "${ac_cv_lib_pthread_pthread_create+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lpthread $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char pthread_create ();
+int
+main ()
+{
+return pthread_create ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext && {
+ test "$cross_compiling" = yes ||
+ $as_test_x conftest$ac_exeext
+ }; then
+ ac_cv_lib_pthread_pthread_create=yes
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_lib_pthread_pthread_create=no
+fi
+
+rm -rf conftest.dSYM
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_pthread_pthread_create" >&5
+$as_echo "$ac_cv_lib_pthread_pthread_create" >&6; }
+if test "x$ac_cv_lib_pthread_pthread_create" = x""yes; then
+ LIBS="$LIBS"
+else
+ { { $as_echo "$as_me:$LINENO: error: cannot find libpthread support" >&5
+$as_echo "$as_me: error: cannot find libpthread support" >&2;}
+ { (exit 7); exit 7; }; }
+fi
+
+{ $as_echo "$as_me:$LINENO: checking for pow in -lm" >&5
+$as_echo_n "checking for pow in -lm... " >&6; }
+if test "${ac_cv_lib_m_pow+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lm $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char pow ();
+int
+main ()
+{
+return pow ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext && {
+ test "$cross_compiling" = yes ||
+ $as_test_x conftest$ac_exeext
+ }; then
+ ac_cv_lib_m_pow=yes
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_lib_m_pow=no
+fi
+
+rm -rf conftest.dSYM
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_m_pow" >&5
+$as_echo "$ac_cv_lib_m_pow" >&6; }
+if test "x$ac_cv_lib_m_pow" = x""yes; then
+ LIBS="$LIBS"
+else
+ { { $as_echo "$as_me:$LINENO: error: cannot find libm math support" >&5
+$as_echo "$as_me: error: cannot find libm math support" >&2;}
+ { (exit 10); exit 10; }; }
+fi
+
+{ $as_echo "$as_me:$LINENO: checking for jpeg_set_defaults in -ljpeg" >&5
+$as_echo_n "checking for jpeg_set_defaults in -ljpeg... " >&6; }
+if test "${ac_cv_lib_jpeg_jpeg_set_defaults+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ljpeg $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char jpeg_set_defaults ();
+int
+main ()
+{
+return jpeg_set_defaults ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext && {
+ test "$cross_compiling" = yes ||
+ $as_test_x conftest$ac_exeext
+ }; then
+ ac_cv_lib_jpeg_jpeg_set_defaults=yes
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_lib_jpeg_jpeg_set_defaults=no
+fi
+
+rm -rf conftest.dSYM
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_jpeg_jpeg_set_defaults" >&5
+$as_echo "$ac_cv_lib_jpeg_jpeg_set_defaults" >&6; }
+if test "x$ac_cv_lib_jpeg_jpeg_set_defaults" = x""yes; then
+ LIBS="$LIBS"
+else
+ { { $as_echo "$as_me:$LINENO: error: \"cannot find libjpeg support\"" >&5
+$as_echo "$as_me: error: \"cannot find libjpeg support\"" >&2;}
+ { (exit 102); exit 102; }; }
+fi
+
+{ $as_echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5
+$as_echo_n "checking for dlopen in -ldl... " >&6; }
+if test "${ac_cv_lib_dl_dlopen+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+int
+main ()
+{
+return dlopen ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext && {
+ test "$cross_compiling" = yes ||
+ $as_test_x conftest$ac_exeext
+ }; then
+ ac_cv_lib_dl_dlopen=yes
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_lib_dl_dlopen=no
+fi
+
+rm -rf conftest.dSYM
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5
+$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
+if test "x$ac_cv_lib_dl_dlopen" = x""yes; then
+ LIBS="$LIBS" cat >>confdefs.h <<\_ACEOF
+#define HAVE_LIBDL 1
+_ACEOF
+
+else
+ { { $as_echo "$as_me:$LINENO: error: \"cannot find libdl support\"" >&5
+$as_echo "$as_me: error: \"cannot find libdl support\"" >&2;}
+ { (exit 104); exit 104; }; }
+fi
+
+
+# Checks for required header files.
+
+for ac_header in pthread.h
+do
+as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5
+$as_echo_n "checking for $ac_header... " >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ $as_echo_n "(cached) " >&6
+fi
+ac_res=`eval 'as_val=${'$as_ac_Header'}
+ $as_echo "$as_val"'`
+ { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+else
+ # Is the header compilable?
+{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5
+$as_echo_n "checking $ac_header usability... " >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_header_compiler=yes
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_compiler=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+$as_echo "$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5
+$as_echo_n "checking $ac_header presence... " >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <$ac_header>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null && {
+ test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ }; then
+ ac_header_preproc=yes
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_preproc=no
+fi
+
+rm -f conftest.err conftest.$ac_ext
+{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+$as_echo "$ac_header_preproc" >&6; }
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+ yes:no: )
+ { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+ ac_header_preproc=yes
+ ;;
+ no:yes:* )
+ { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+ { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
+$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
+ { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+ { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5
+$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;}
+ { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+ { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+ ( cat <<\_ASBOX
+## --------------------- ##
+## Report this to 3.12.4 ##
+## --------------------- ##
+_ASBOX
+ ) | sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5
+$as_echo_n "checking for $ac_header... " >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ $as_echo_n "(cached) " >&6
+else
+ eval "$as_ac_Header=\$ac_header_preproc"
+fi
+ac_res=`eval 'as_val=${'$as_ac_Header'}
+ $as_echo "$as_val"'`
+ { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+
+fi
+as_val=`eval 'as_val=${'$as_ac_Header'}
+ $as_echo "$as_val"'`
+ if test "x$as_val" = x""yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+else
+ { { $as_echo "$as_me:$LINENO: error: cannot find pthread-devel support" >&5
+$as_echo "$as_me: error: cannot find pthread-devel support" >&2;}
+ { (exit 7); exit 7; }; }
+fi
+
+done
+
+
+for ac_header in jpeglib.h
+do
+as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5
+$as_echo_n "checking for $ac_header... " >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ $as_echo_n "(cached) " >&6
+fi
+ac_res=`eval 'as_val=${'$as_ac_Header'}
+ $as_echo "$as_val"'`
+ { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+else
+ # Is the header compilable?
+{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5
+$as_echo_n "checking $ac_header usability... " >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_header_compiler=yes
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_compiler=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+$as_echo "$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5
+$as_echo_n "checking $ac_header presence... " >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <$ac_header>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null && {
+ test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ }; then
+ ac_header_preproc=yes
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_preproc=no
+fi
+
+rm -f conftest.err conftest.$ac_ext
+{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+$as_echo "$ac_header_preproc" >&6; }
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+ yes:no: )
+ { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+ ac_header_preproc=yes
+ ;;
+ no:yes:* )
+ { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+ { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
+$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
+ { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+ { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5
+$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;}
+ { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+ { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+ ( cat <<\_ASBOX
+## --------------------- ##
+## Report this to 3.12.4 ##
+## --------------------- ##
+_ASBOX
+ ) | sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5
+$as_echo_n "checking for $ac_header... " >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ $as_echo_n "(cached) " >&6
+else
+ eval "$as_ac_Header=\$ac_header_preproc"
+fi
+ac_res=`eval 'as_val=${'$as_ac_Header'}
+ $as_echo "$as_val"'`
+ { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+
+fi
+as_val=`eval 'as_val=${'$as_ac_Header'}
+ $as_echo "$as_val"'`
+ if test "x$as_val" = x""yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+else
+ { { $as_echo "$as_me:$LINENO: error: cannot find libjpeg-devel support" >&5
+$as_echo "$as_me: error: cannot find libjpeg-devel support" >&2;}
+ { (exit 103); exit 103; }; }
+fi
+
+done
+
+
+# Checks for typedefs, structures, and compiler characteristics.
+
+ { $as_echo "$as_me:$LINENO: checking whether byte ordering is bigendian" >&5
+$as_echo_n "checking whether byte ordering is bigendian... " >&6; }
+if test "${ac_cv_c_bigendian+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ ac_cv_c_bigendian=unknown
+ # See if we're dealing with a universal compiler.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#ifndef __APPLE_CC__
+ not a universal capable compiler
+ #endif
+ typedef int dummy;
+
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+
+ # Check for potential -arch flags. It is not universal unless
+ # there are some -arch flags. Note that *ppc* also matches
+ # ppc64. This check is also rather less than ideal.
+ case "${CC} ${CFLAGS} ${CPPFLAGS} ${LDFLAGS}" in #(
+ *-arch*ppc*|*-arch*i386*|*-arch*x86_64*) ac_cv_c_bigendian=universal;;
+ esac
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ if test $ac_cv_c_bigendian = unknown; then
+ # See if sys/param.h defines the BYTE_ORDER macro.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <sys/types.h>
+ #include <sys/param.h>
+
+int
+main ()
+{
+#if ! (defined BYTE_ORDER && defined BIG_ENDIAN \
+ && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \
+ && LITTLE_ENDIAN)
+ bogus endian macros
+ #endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ # It does; now see whether it defined to BIG_ENDIAN or not.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <sys/types.h>
+ #include <sys/param.h>
+
+int
+main ()
+{
+#if BYTE_ORDER != BIG_ENDIAN
+ not big endian
+ #endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_cv_c_bigendian=yes
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_c_bigendian=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ fi
+ if test $ac_cv_c_bigendian = unknown; then
+ # See if <limits.h> defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris).
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <limits.h>
+
+int
+main ()
+{
+#if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN)
+ bogus endian macros
+ #endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ # It does; now see whether it defined to _BIG_ENDIAN or not.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <limits.h>
+
+int
+main ()
+{
+#ifndef _BIG_ENDIAN
+ not big endian
+ #endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_cv_c_bigendian=yes
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_c_bigendian=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ fi
+ if test $ac_cv_c_bigendian = unknown; then
+ # Compile a test program.
+ if test "$cross_compiling" = yes; then
+ # Try to guess by grepping values from an object file.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+short int ascii_mm[] =
+ { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 };
+ short int ascii_ii[] =
+ { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 };
+ int use_ascii (int i) {
+ return ascii_mm[i] + ascii_ii[i];
+ }
+ short int ebcdic_ii[] =
+ { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 };
+ short int ebcdic_mm[] =
+ { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 };
+ int use_ebcdic (int i) {
+ return ebcdic_mm[i] + ebcdic_ii[i];
+ }
+ extern int foo;
+
+int
+main ()
+{
+return use_ascii (foo) == use_ebcdic (foo);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then
+ ac_cv_c_bigendian=yes
+ fi
+ if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then
+ if test "$ac_cv_c_bigendian" = unknown; then
+ ac_cv_c_bigendian=no
+ else
+ # finding both strings is unlikely to happen, but who knows?
+ ac_cv_c_bigendian=unknown
+ fi
+ fi
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+
+ /* Are we little or big endian? From Harbison&Steele. */
+ union
+ {
+ long int l;
+ char c[sizeof (long int)];
+ } u;
+ u.l = 1;
+ return u.c[sizeof (long int) - 1] == 1;
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_c_bigendian=no
+else
+ $as_echo "$as_me: program exited with status $ac_status" >&5
+$as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ac_cv_c_bigendian=yes
+fi
+rm -rf conftest.dSYM
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+
+ fi
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_c_bigendian" >&5
+$as_echo "$ac_cv_c_bigendian" >&6; }
+ case $ac_cv_c_bigendian in #(
+ yes)
+ cat >>confdefs.h <<\_ACEOF
+#define WORDS_BIGENDIAN 1
+_ACEOF
+;; #(
+ no)
+ APDK_ENDIAN_FLAG="-DAPDK_LITTLE_ENDIAN" ;; #(
+ universal)
+
+cat >>confdefs.h <<\_ACEOF
+#define AC_APPLE_UNIVERSAL_BUILD 1
+_ACEOF
+
+ ;; #(
+ *)
+ { { $as_echo "$as_me:$LINENO: error: unknown endianness
+ presetting ac_cv_c_bigendian=no (or yes) will help" >&5
+$as_echo "$as_me: error: unknown endianness
+ presetting ac_cv_c_bigendian=no (or yes) will help" >&2;}
+ { (exit 1); exit 1; }; } ;;
+ esac
+
+
+# Autoconf-style header tests for APDK
+cat >prnt/hpijs/auto-include.h <<EOFH
+#ifdef HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+#ifdef HAVE_STDINT_H
+#include <stdint.h>
+#endif
+#ifdef HAVE_MACHINE_TYPES_H
+#include <machine/types.h>
+#endif
+EOFH
+{ $as_echo "$as_me:$LINENO: checking for uint32_t" >&5
+$as_echo_n "checking for uint32_t... " >&6; }
+if test "${ac_cv_type_uint32_t+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ ac_cv_type_uint32_t=no
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include "prnt/hpijs/auto-include.h"
+
+int
+main ()
+{
+if (sizeof (uint32_t))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include "prnt/hpijs/auto-include.h"
+
+int
+main ()
+{
+if (sizeof ((uint32_t)))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ :
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_type_uint32_t=yes
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_type_uint32_t" >&5
+$as_echo "$ac_cv_type_uint32_t" >&6; }
+if test "x$ac_cv_type_uint32_t" = x""yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_UINT32_T 1
+_ACEOF
+
+APDK_AUTO_INCLUDE_FLAG="-DAPDK_AUTO_INCLUDE"
+fi
+
+
+{ $as_echo "$as_me:$LINENO: checking \"for platform-dependencies\"" >&5
+$as_echo_n "checking \"for platform-dependencies\"... " >&6; }
+darwin_build="no"
+case "$host" in
+ *-darwin*)
+ { $as_echo "$as_me:$LINENO: result: \"using Mac OS X platform.h\"" >&5
+$as_echo "\"using Mac OS X platform.h\"" >&6; }
+ cat >prnt/hpijs/platform.h <<EOF
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/malloc.h>
+#include <memory.h>
+#include <string.h>
+#include <stdio.h>
+#include <math.h>
+EOF
+ darwin_build="yes"
+ ;;
+
+ *)
+ { $as_echo "$as_me:$LINENO: result: \"using Default platform.h\"" >&5
+$as_echo "\"using Default platform.h\"" >&6; }
+ cat >prnt/hpijs/platform.h <<EOF
+#include <stdlib.h>
+#include <memory.h>
+#include <string.h>
+#include <stdio.h>
+#include <math.h>
+EOF
+ ;;
+esac
+ if test x$darwin_build = xyes; then
+ DARWIN_BUILD_TRUE=
+ DARWIN_BUILD_FALSE='#'
+else
+ DARWIN_BUILD_TRUE='#'
+ DARWIN_BUILD_FALSE=
+fi
+
+
+{ $as_echo "$as_me:$LINENO: checking for documentation build" >&5
+$as_echo_n "checking for documentation build... " >&6; }
+# Check whether --enable-doc_build was given.
+if test "${enable_doc_build+set}" = set; then
+ enableval=$enable_doc_build; doc_build=$enableval
+else
+ doc_build=yes
+fi
+
+if test "$doc_build" = "yes"; then
+ { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+ { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+ if test x$doc_build = xyes; then
+ DOC_BUILD_TRUE=
+ DOC_BUILD_FALSE='#'
+else
+ DOC_BUILD_TRUE='#'
+ DOC_BUILD_FALSE=
+fi
+
+
+{ $as_echo "$as_me:$LINENO: checking for hpijs only build" >&5
+$as_echo_n "checking for hpijs only build... " >&6; }
+# Check whether --enable-hpijs_only_build was given.
+if test "${enable_hpijs_only_build+set}" = set; then
+ enableval=$enable_hpijs_only_build; hpijs_only_build=$enableval
+else
+ hpijs_only_build=no
+fi
+
+if test "$hpijs_only_build" = "yes"; then
+ { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+ epm_full=\#
+ epm_lite=\#
+ epm_hpcups_only=\#
+ epm_print_only_exclude=\#
+ epm_hpijs_only=
+else
+ { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+ epm_hpijs_only=\#
+ cat >>confdefs.h <<\_ACEOF
+#define HAVE_LIBHPIP 1
+_ACEOF
+
+fi
+ if test x$hpijs_only_build = xyes; then
+ HPIJS_ONLY_BUILD_TRUE=
+ HPIJS_ONLY_BUILD_FALSE='#'
+else
+ HPIJS_ONLY_BUILD_TRUE='#'
+ HPIJS_ONLY_BUILD_FALSE=
+fi
+
+
+{ $as_echo "$as_me:$LINENO: checking for lite build" >&5
+$as_echo_n "checking for lite build... " >&6; }
+# Check whether --enable-lite_build was given.
+if test "${enable_lite_build+set}" = set; then
+ enableval=$enable_lite_build; lite_build=$enableval
+else
+ lite_build=no
+fi
+
+if test "$lite_build" = "yes"; then
+ { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+ epm_full=\#
+ epm_hpcups_only=\#
+ epm_print_only_exclude=
+ epm_lite=
+else
+ { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+ if test x$lite_build = xyes; then
+ LITE_BUILD_TRUE=
+ LITE_BUILD_FALSE='#'
+else
+ LITE_BUILD_TRUE='#'
+ LITE_BUILD_FALSE=
+fi
+
+
+{ $as_echo "$as_me:$LINENO: checking for hpcups only build" >&5
+$as_echo_n "checking for hpcups only build... " >&6; }
+# Check whether --enable-hpcups_only_build was given.
+if test "${enable_hpcups_only_build+set}" = set; then
+ enableval=$enable_hpcups_only_build; hpcups_only_build=$enableval
+else
+ hpcups_only_build=no
+fi
+
+if test "$hpcups_only_build" = "yes"; then
+ { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+ epm_full=\#
+ epm_lite=\#
+ epm_hpcups_only=
+ epm_print_only_exclude=\#
+else
+ { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+ if test x$hpcups_only_build = xyes; then
+ HPCUPS_ONLY_BUILD_TRUE=
+ HPCUPS_ONLY_BUILD_FALSE='#'
+else
+ HPCUPS_ONLY_BUILD_TRUE='#'
+ HPCUPS_ONLY_BUILD_FALSE=
+fi
+
+
+ if test x$hpcups_only_build = xno && test x$hpijs_only_build = xno; then
+ HPLIP_BUILD_TRUE=
+ HPLIP_BUILD_FALSE='#'
+else
+ HPLIP_BUILD_TRUE='#'
+ HPLIP_BUILD_FALSE=
+fi
+
+if test "$hpijs_only_build" = "no" && test "$hpcups_only_build" = "no"; then
+ cat >>confdefs.h <<\_ACEOF
+#define HAVE_LIBHPIP 1
+_ACEOF
+
+fi
+
+if test "$lite_build" = "no" && test "$hpcups_only_build" = "no" && test "$hpijs_only_build" = "no"; then
+ epm_full=
+ epm_lite=\#
+ epm_hpcups_only=\#
+ epm_print_only_exclude=
+fi
+ if test x$hpcups_only_build = xno && test x$lite_build = xno && test x$hpijs_only_build = xno; then
+ FULL_BUILD_TRUE=
+ FULL_BUILD_FALSE='#'
+else
+ FULL_BUILD_TRUE='#'
+ FULL_BUILD_FALSE=
+fi
+
+
+{ $as_echo "$as_me:$LINENO: checking for hpijs install" >&5
+$as_echo_n "checking for hpijs install... " >&6; }
+# Check whether --enable-hpijs_install was given.
+if test "${enable_hpijs_install+set}" = set; then
+ enableval=$enable_hpijs_install; hpijs_install=$enableval
+else
+ hpijs_install=no
+fi
+
+if test "$hpijs_install" = "yes"; then
+ { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+ epm_hpijs_install=yes
+else
+ { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+ if test x$hpijs_install = xyes; then
+ HPIJS_INSTALL_TRUE=
+ HPIJS_INSTALL_FALSE='#'
+else
+ HPIJS_INSTALL_TRUE='#'
+ HPIJS_INSTALL_FALSE=
+fi
+
+
+{ $as_echo "$as_me:$LINENO: checking for hpcups install" >&5
+$as_echo_n "checking for hpcups install... " >&6; }
+# Check whether --enable-hpcups_install was given.
+if test "${enable_hpcups_install+set}" = set; then
+ enableval=$enable_hpcups_install; hpcups_install=$enableval
+else
+ hpcups_install=yes
+fi
+
+if test "$hpcups_install" = "yes" && test "$hpijs_only_build" = "no"; then
+ { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+ epm_hpcups_install=yes
+else
+ { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+ if test x$hpcups_install = xyes && test x$hpijs_only_build = xno; then
+ HPCUPS_INSTALL_TRUE=
+ HPCUPS_INSTALL_FALSE='#'
+else
+ HPCUPS_INSTALL_TRUE='#'
+ HPCUPS_INSTALL_FALSE=
+fi
+
+
+{ $as_echo "$as_me:$LINENO: checking for new hpcups install" >&5
+$as_echo_n "checking for new hpcups install... " >&6; }
+# Check whether --enable-new_hpcups was given.
+if test "${enable_new_hpcups+set}" = set; then
+ enableval=$enable_new_hpcups; new_hpcups=$enableval
+else
+ new_hpcups=no
+fi
+
+if test "$new_hpcups" = "yes"; then
+ { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+ { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+ if test x$new_hpcups = xyes; then
+ NEW_HPCUPS_TRUE=
+ NEW_HPCUPS_FALSE='#'
+else
+ NEW_HPCUPS_TRUE='#'
+ NEW_HPCUPS_FALSE=
+fi
+
+
+{ $as_echo "$as_me:$LINENO: checking for network build" >&5
+$as_echo_n "checking for network build... " >&6; }
+# Check whether --enable-network_build was given.
+if test "${enable_network_build+set}" = set; then
+ enableval=$enable_network_build; network_build=$enableval
+else
+ network_build=yes
+fi
+
+if test "$network_build" = "yes"; then
+ { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+ { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+ if test x$network_build = xyes; then
+ NETWORK_BUILD_TRUE=
+ NETWORK_BUILD_FALSE='#'
+else
+ NETWORK_BUILD_TRUE='#'
+ NETWORK_BUILD_FALSE=
+fi
+
+
+{ $as_echo "$as_me:$LINENO: checking for parallel port build" >&5
+$as_echo_n "checking for parallel port build... " >&6; }
+# Check whether --enable-pp_build was given.
+if test "${enable_pp_build+set}" = set; then
+ enableval=$enable_pp_build; pp_build=$enableval
+else
+ pp_build=no
+fi
+
+if test "$pp_build" = "yes"; then
+ { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+ cat >>confdefs.h <<\_ACEOF
+#define HAVE_PPORT 1
+_ACEOF
+
+else
+ { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+{ $as_echo "$as_me:$LINENO: checking for scanner build" >&5
+$as_echo_n "checking for scanner build... " >&6; }
+# Check whether --enable-scan_build was given.
+if test "${enable_scan_build+set}" = set; then
+ enableval=$enable_scan_build; scan_build=$enableval
+else
+ scan_build=yes
+fi
+
+if test "$scan_build" = "yes"; then
+ { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+ epm_scan=
+else
+ { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+ epm_scan=\#
+fi
+ if test x$scan_build = xyes; then
+ SCAN_BUILD_TRUE=
+ SCAN_BUILD_FALSE='#'
+else
+ SCAN_BUILD_TRUE='#'
+ SCAN_BUILD_FALSE=
+fi
+
+
+{ $as_echo "$as_me:$LINENO: checking for gui build" >&5
+$as_echo_n "checking for gui build... " >&6; }
+# Check whether --enable-gui_build was given.
+if test "${enable_gui_build+set}" = set; then
+ enableval=$enable_gui_build; gui_build=$enableval
+else
+ gui_build=yes
+fi
+
+if test "$gui_build" = "yes"; then
+ { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+ { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+ if test x$gui_build = xyes; then
+ GUI_BUILD_TRUE=
+ GUI_BUILD_FALSE='#'
+else
+ GUI_BUILD_TRUE='#'
+ GUI_BUILD_FALSE=
+fi
+
+
+{ $as_echo "$as_me:$LINENO: checking for fax build" >&5
+$as_echo_n "checking for fax build... " >&6; }
+# Check whether --enable-fax_build was given.
+if test "${enable_fax_build+set}" = set; then
+ enableval=$enable_fax_build; fax_build=$enableval
+else
+ fax_build=yes
+fi
+
+if test "$fax_build" = "yes"; then
+ { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+ { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+ if test x$fax_build = xyes; then
+ FAX_BUILD_TRUE=
+ FAX_BUILD_FALSE='#'
+else
+ FAX_BUILD_TRUE='#'
+ FAX_BUILD_FALSE=
+fi
+
+
+{ $as_echo "$as_me:$LINENO: checking for dbus build" >&5
+$as_echo_n "checking for dbus build... " >&6; }
+# Check whether --enable-dbus_build was given.
+if test "${enable_dbus_build+set}" = set; then
+ enableval=$enable_dbus_build; dbus_build=$enableval
+else
+ dbus_build=yes
+fi
+
+if test "$dbus_build" = "yes"; then
+ { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+ { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+{ $as_echo "$as_me:$LINENO: checking for cups 1.1.x build" >&5
+$as_echo_n "checking for cups 1.1.x build... " >&6; }
+# Check whether --enable-cups11_build was given.
+if test "${enable_cups11_build+set}" = set; then
+ enableval=$enable_cups11_build; cups11_build=$enableval
+else
+ cups11_build=no
+fi
+
+if test "$cups11_build" = "yes"; then
+ { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+ cat >>confdefs.h <<\_ACEOF
+#define HAVE_CUPS11 1
+_ACEOF
+
+else
+ { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+{ $as_echo "$as_me:$LINENO: checking for udev acl rules" >&5
+$as_echo_n "checking for udev acl rules... " >&6; }
+# Check whether --enable-udev_acl_rules was given.
+if test "${enable_udev_acl_rules+set}" = set; then
+ enableval=$enable_udev_acl_rules; udev_acl_rules=$enableval
+else
+ udev_acl_rules=no
+fi
+
+if test "$udev_acl_rules" = "yes"; then
+ { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+ { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+ if test x$udev_acl_rules = xyes; then
+ UDEV_ACL_RULES_TRUE=
+ UDEV_ACL_RULES_FALSE='#'
+else
+ UDEV_ACL_RULES_TRUE='#'
+ UDEV_ACL_RULES_FALSE=
+fi
+
+
+{ $as_echo "$as_me:$LINENO: checking for shadow build" >&5
+$as_echo_n "checking for shadow build... " >&6; }
+# Check whether --enable-shadow_build was given.
+if test "${enable_shadow_build+set}" = set; then
+ enableval=$enable_shadow_build; shadow_build=$enableval
+else
+ shadow_build=no
+fi
+
+if test "$shadow_build" = "yes"; then
+ { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+ { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+ if test x$shadow_build = xyes; then
+ SHADOW_BUILD_TRUE=
+ SHADOW_BUILD_FALSE='#'
+else
+ SHADOW_BUILD_TRUE='#'
+ SHADOW_BUILD_FALSE=
+fi
+
+
+
+# Check whether --with-cupsbackenddir was given.
+if test "${with_cupsbackenddir+set}" = set; then
+ withval=$with_cupsbackenddir; cupsbackenddir=$withval
+else
+ cupsbackenddir="/usr/lib/cups/backend"
+fi
+
+
+
+# Check whether --with-cupsfilterdir was given.
+if test "${with_cupsfilterdir+set}" = set; then
+ withval=$with_cupsfilterdir; cupsfilterdir=$withval
+else
+ cupsfilterdir="/usr/lib/cups/filter"
+fi
+
+
+
+# Check whether --with-icondir was given.
+if test "${with_icondir+set}" = set; then
+ withval=$with_icondir; icondir=$withval
+else
+ icondir="/usr/share/applications"
+fi
+
+
+
+# Check whether --with-systraydir was given.
+if test "${with_systraydir+set}" = set; then
+ withval=$with_systraydir; systraydir=$withval
+else
+ systraydir="/etc/xdg/autostart"
+fi
+
+
+
+# Check whether --with-hpppddir was given.
+if test "${with_hpppddir+set}" = set; then
+ withval=$with_hpppddir; hpppddir=$withval
+else
+ hpppddir="$datadir/ppd/HP"
+fi
+
+
+if test -f "/usr/share/cups/mime/mime.types"; then
+ abs_mimedir="/usr/share/cups/mime/"
+else
+ abs_mimedir="/etc/cups/"
+fi
+
+# Check whether --with-mimedir was given.
+if test "${with_mimedir+set}" = set; then
+ withval=$with_mimedir; mimedir=$withval
+else
+ mimedir="$abs_mimedir"
+fi
+
+
+
+# Check whether --with-docdir was given.
+if test "${with_docdir+set}" = set; then
+ withval=$with_docdir; hpdocdir=$withval
+else
+ hpdocdir="$datadir/doc/hplip-$VERSION"
+fi
+
+
+{ $as_echo "$as_me:$LINENO: checking for foomatic ppd install" >&5
+$as_echo_n "checking for foomatic ppd install... " >&6; }
+# Check whether --enable-foomatic_ppd_install was given.
+if test "${enable_foomatic_ppd_install+set}" = set; then
+ enableval=$enable_foomatic_ppd_install; foomatic_ppd_install=$enableval
+else
+ foomatic_ppd_install=no
+fi
+
+if test $foomatic_ppd_install = yes; then
+ { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+ epm_foomatic_ppd_install=yes
+else
+ { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+ if test x$foomatic_ppd_install = xyes; then
+ FOOMATIC_PPD_INSTALL_TRUE=
+ FOOMATIC_PPD_INSTALL_FALSE='#'
+else
+ FOOMATIC_PPD_INSTALL_TRUE='#'
+ FOOMATIC_PPD_INSTALL_FALSE=
+fi
+
+
+
+# Check whether --with-drvdir was given.
+if test "${with_drvdir+set}" = set; then
+ withval=$with_drvdir; drvdir=$withval
+else
+ drvdir="$datadir/cups/drv/hp"
+fi
+
+
+{ $as_echo "$as_me:$LINENO: checking for foomatic drv install" >&5
+$as_echo_n "checking for foomatic drv install... " >&6; }
+# Check whether --enable-foomatic_drv_install was given.
+if test "${enable_foomatic_drv_install+set}" = set; then
+ enableval=$enable_foomatic_drv_install; foomatic_drv_install=$enableval
+else
+ foomatic_drv_install=no
+fi
+
+if test $foomatic_drv_install = yes; then
+ { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+ epm_foomatic_drv_install=yes
+else
+ { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+ if test x$foomatic_drv_install = xyes; then
+ FOOMATIC_DRV_INSTALL_TRUE=
+ FOOMATIC_DRV_INSTALL_FALSE='#'
+else
+ FOOMATIC_DRV_INSTALL_TRUE='#'
+ FOOMATIC_DRV_INSTALL_FALSE=
+fi
+
+
+{ $as_echo "$as_me:$LINENO: checking for cups drv install" >&5
+$as_echo_n "checking for cups drv install... " >&6; }
+# Check whether --enable-cups_drv_install was given.
+if test "${enable_cups_drv_install+set}" = set; then
+ enableval=$enable_cups_drv_install; cups_drv_install=$enableval
+else
+ cups_drv_install=yes
+fi
+
+if test $cups_drv_install = yes && test $hpijs_only_build = no; then
+ { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+ epm_cups_drv_install=yes
+else
+ { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+ if test x$cups_drv_install = xyes && test x$hpijs_only_build = xno; then
+ CUPS_DRV_INSTALL_TRUE=
+ CUPS_DRV_INSTALL_FALSE='#'
+else
+ CUPS_DRV_INSTALL_TRUE='#'
+ CUPS_DRV_INSTALL_FALSE=
+fi
+
+
+{ $as_echo "$as_me:$LINENO: checking for cups ppd install" >&5
+$as_echo_n "checking for cups ppd install... " >&6; }
+# Check whether --enable-cups_ppd_install was given.
+if test "${enable_cups_ppd_install+set}" = set; then
+ enableval=$enable_cups_ppd_install; cups_ppd_install=$enableval
+else
+ cups_ppd_install=no
+fi
+
+if test $cups_ppd_install = yes && test $hpijs_only_build = no; then
+ { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+ epm_cups_ppd_install=yes
+else
+ { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+ if test x$cups_ppd_install = xyes && test x$hpijs_only_build = xno; then
+ CUPS_PPD_INSTALL_TRUE=
+ CUPS_PPD_INSTALL_FALSE='#'
+else
+ CUPS_PPD_INSTALL_TRUE='#'
+ CUPS_PPD_INSTALL_FALSE=
+fi
+
+
+{ $as_echo "$as_me:$LINENO: checking for foomatic-rip-hplip install" >&5
+$as_echo_n "checking for foomatic-rip-hplip install... " >&6; }
+# Check whether --enable-foomatic_rip_hplip_install was given.
+if test "${enable_foomatic_rip_hplip_install+set}" = set; then
+ enableval=$enable_foomatic_rip_hplip_install; foomatic_rip_hplip_install=$enableval
+else
+ foomatic_rip_hplip_install=no
+fi
+
+if test "$foomatic_rip_hplip_install" = "yes"; then
+ { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+ foomatic_filter="foomatic-rip-hplip"
+ epm_foomatic_rip_hplip_install=yes
+else
+ { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+ foomatic_filter="foomatic-rip"
+fi
+ if test x$foomatic_rip_hplip_install = xyes; then
+ RIP_INSTALL_TRUE=
+ RIP_INSTALL_FALSE='#'
+else
+ RIP_INSTALL_TRUE='#'
+ RIP_INSTALL_FALSE=
+fi
+
+
+{ $as_echo "$as_me:$LINENO: checking for qt4" >&5
+$as_echo_n "checking for qt4... " >&6; }
+# Check whether --enable-qt4 was given.
+if test "${enable_qt4+set}" = set; then
+ enableval=$enable_qt4; qt4=$enableval
+else
+ qt4=yes
+fi
+
+if test "$qt4" = "yes"; then
+ { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+ { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+ if test x$qt4 = xyes; then
+ QT4_INSTALL_TRUE=
+ QT4_INSTALL_FALSE='#'
+else
+ QT4_INSTALL_TRUE='#'
+ QT4_INSTALL_FALSE=
+fi
+
+
+{ $as_echo "$as_me:$LINENO: checking for qt3" >&5
+$as_echo_n "checking for qt3... " >&6; }
+# Check whether --enable-qt3 was given.
+if test "${enable_qt3+set}" = set; then
+ enableval=$enable_qt3; qt3=$enableval
+else
+ qt3=no
+fi
+
+if test "$qt3" = "yes"; then
+ { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+ { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+ if test x$qt3 = xyes; then
+ QT3_INSTALL_TRUE=
+ QT3_INSTALL_FALSE='#'
+else
+ QT3_INSTALL_TRUE='#'
+ QT3_INSTALL_FALSE=
+fi
+
+
+if test "$gui_build" = "no"; then
+ qt3=no
+ qt4=no
+fi
+
+epm_qt3=\#
+epm_qt4=\#
+if test "$hpcups_only_build" = "no" && test "$hpijs_only_build" = "no"; then
+if test "$qt3" = "yes" && test "$qt4" = "no"; then
+ ui_toolkit=qt3
+ epm_qt3=
+elif test "$qt4" = "yes"; then
+ ui_toolkit=qt4
+ epm_qt4=
+else
+ ui_toolkit=no
+fi
+fi
+
+{ $as_echo "$as_me:$LINENO: checking for policykit" >&5
+$as_echo_n "checking for policykit... " >&6; }
+# Check whether --enable-policykit was given.
+if test "${enable_policykit+set}" = set; then
+ enableval=$enable_policykit; policykit=$enableval
+else
+ policykit=no
+fi
+
+if test "$policykit" = "yes"; then
+ { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+ { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+ if test x$policykit = xyes; then
+ POLICYKIT_INSTALL_TRUE=
+ POLICYKIT_INSTALL_FALSE='#'
+else
+ POLICYKIT_INSTALL_TRUE='#'
+ POLICYKIT_INSTALL_FALSE=
+fi
+
+
+# Determine where the PolicyKit policy file goes
+if test "$policykit" = "yes"; then
+ if test -d /usr/share/polkit-1; then
+ policykit_dir=/usr/share/polkit-1/actions
+ elif test -d /usr/share/PolicyKit; then
+ policykit_dir=/usr/share/PolicyKit/policy
+ else
+ policykit_dir=/usr/share/PolicyKit/policy
+ fi
+else
+ policykit_dir=
+fi
+
+{ $as_echo "$as_me:$LINENO: checking for host machine platform" >&5
+$as_echo_n "checking for host machine platform... " >&6; }
+machine=`uname -m`
+if test "$machine" = "x86_32" || test "$machine" = "i686"; then
+ platform="x86_32"
+elif test "$machine" = "x86_64"; then
+ platform="x86_64"
+elif test "$machine" = "ppc"; then
+ platform="ppc"
+else
+ platform="unsupport"
+fi
+{ $as_echo "$as_me:$LINENO: result: $platform" >&5
+$as_echo "$platform" >&6; }
+
+# Check conditional packages.
+
+if test "$hpijs_only_build" = "no" && test "$network_build" = "yes"; then
+# AC_CHECK_LIB([crypto], [CRYPTO_free], [LIBS="$LIBS"], [AC_MSG_ERROR([cannot find net-snmp support (or --disable-network-build)], 4)])
+# AC_CHECK_LIB([netsnmp], [snmp_timeout], [LIBS="$LIBS" AC_DEFINE([HAVE_LIBNETSNMP])], [AC_MSG_ERROR([cannot find net-snmp support (or --disable-network-build)], 4)])
+# AC_CHECK_HEADERS(net-snmp/net-snmp-config.h,, [AC_MSG_ERROR([cannot find net-snmp-devel support (or --disable-network-build)], 5)])
+
+ old_LIBS="$LIBS"
+
+{ $as_echo "$as_me:$LINENO: checking for CRYPTO_free in -lcrypto" >&5
+$as_echo_n "checking for CRYPTO_free in -lcrypto... " >&6; }
+if test "${ac_cv_lib_crypto_CRYPTO_free+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lcrypto $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char CRYPTO_free ();
+int
+main ()
+{
+return CRYPTO_free ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext && {
+ test "$cross_compiling" = yes ||
+ $as_test_x conftest$ac_exeext
+ }; then
+ ac_cv_lib_crypto_CRYPTO_free=yes
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_lib_crypto_CRYPTO_free=no
+fi
+
+rm -rf conftest.dSYM
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_crypto_CRYPTO_free" >&5
+$as_echo "$ac_cv_lib_crypto_CRYPTO_free" >&6; }
+if test "x$ac_cv_lib_crypto_CRYPTO_free" = x""yes; then
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBCRYPTO 1
+_ACEOF
+
+ LIBS="-lcrypto $LIBS"
+
+else
+ { { $as_echo "$as_me:$LINENO: error: cannot find net-snmp support (or --disable-network-build)" >&5
+$as_echo "$as_me: error: cannot find net-snmp support (or --disable-network-build)" >&2;}
+ { (exit 4); exit 4; }; }
+fi
+
+ { $as_echo "$as_me:$LINENO: checking for snmp_timeout in -lnetsnmp" >&5
+$as_echo_n "checking for snmp_timeout in -lnetsnmp... " >&6; }
+if test "${ac_cv_lib_netsnmp_snmp_timeout+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lnetsnmp $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char snmp_timeout ();
+int
+main ()
+{
+return snmp_timeout ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext && {
+ test "$cross_compiling" = yes ||
+ $as_test_x conftest$ac_exeext
+ }; then
+ ac_cv_lib_netsnmp_snmp_timeout=yes
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_lib_netsnmp_snmp_timeout=no
+fi
+
+rm -rf conftest.dSYM
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_netsnmp_snmp_timeout" >&5
+$as_echo "$ac_cv_lib_netsnmp_snmp_timeout" >&6; }
+if test "x$ac_cv_lib_netsnmp_snmp_timeout" = x""yes; then
+ LIBS="$old_LIBS" cat >>confdefs.h <<\_ACEOF
+#define HAVE_LIBNETSNMP 1
+_ACEOF
+ SNMPLIB="netsnmp"
+else
+ check_ucd=yes
+fi
+
+if test "$check_ucd" = "yes"; then
+ { $as_echo "$as_me:$LINENO: checking for snmp_timeout in -lsnmp" >&5
+$as_echo_n "checking for snmp_timeout in -lsnmp... " >&6; }
+if test "${ac_cv_lib_snmp_snmp_timeout+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsnmp $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char snmp_timeout ();
+int
+main ()
+{
+return snmp_timeout ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext && {
+ test "$cross_compiling" = yes ||
+ $as_test_x conftest$ac_exeext
+ }; then
+ ac_cv_lib_snmp_snmp_timeout=yes
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_lib_snmp_snmp_timeout=no
+fi
+
+rm -rf conftest.dSYM
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_snmp_snmp_timeout" >&5
+$as_echo "$ac_cv_lib_snmp_snmp_timeout" >&6; }
+if test "x$ac_cv_lib_snmp_snmp_timeout" = x""yes; then
+ LIBS="$old_LIBS" cat >>confdefs.h <<\_ACEOF
+#define HAVE_LIBNETSNMP 1
+_ACEOF
+ cat >>confdefs.h <<\_ACEOF
+#define HAVE_UCDSNMP 1
+_ACEOF
+ SNMPLIB="snmp"
+else
+ { { $as_echo "$as_me:$LINENO: error: cannot find net/ucd-snmp support (or --disable-network-build)" >&5
+$as_echo "$as_me: error: cannot find net/ucd-snmp support (or --disable-network-build)" >&2;}
+ { (exit 4); exit 4; }; }
+fi
+
+
+for ac_header in ucd-snmp/ucd-snmp-config.h
+do
+as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5
+$as_echo_n "checking for $ac_header... " >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ $as_echo_n "(cached) " >&6
+fi
+ac_res=`eval 'as_val=${'$as_ac_Header'}
+ $as_echo "$as_val"'`
+ { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+else
+ # Is the header compilable?
+{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5
+$as_echo_n "checking $ac_header usability... " >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_header_compiler=yes
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_compiler=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+$as_echo "$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5
+$as_echo_n "checking $ac_header presence... " >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <$ac_header>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null && {
+ test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ }; then
+ ac_header_preproc=yes
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_preproc=no
+fi
+
+rm -f conftest.err conftest.$ac_ext
+{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+$as_echo "$ac_header_preproc" >&6; }
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+ yes:no: )
+ { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+ ac_header_preproc=yes
+ ;;
+ no:yes:* )
+ { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+ { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
+$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
+ { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+ { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5
+$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;}
+ { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+ { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+ ( cat <<\_ASBOX
+## --------------------- ##
+## Report this to 3.12.4 ##
+## --------------------- ##
+_ASBOX
+ ) | sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5
+$as_echo_n "checking for $ac_header... " >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ $as_echo_n "(cached) " >&6
+else
+ eval "$as_ac_Header=\$ac_header_preproc"
+fi
+ac_res=`eval 'as_val=${'$as_ac_Header'}
+ $as_echo "$as_val"'`
+ { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+
+fi
+as_val=`eval 'as_val=${'$as_ac_Header'}
+ $as_echo "$as_val"'`
+ if test "x$as_val" = x""yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+else
+ { { $as_echo "$as_me:$LINENO: error: cannot find ucd-snmp-devel support (or --disable-network-build)" >&5
+$as_echo "$as_me: error: cannot find ucd-snmp-devel support (or --disable-network-build)" >&2;}
+ { (exit 5); exit 5; }; }
+fi
+
+done
+
+else
+
+for ac_header in net-snmp/net-snmp-config.h
+do
+as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5
+$as_echo_n "checking for $ac_header... " >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ $as_echo_n "(cached) " >&6
+fi
+ac_res=`eval 'as_val=${'$as_ac_Header'}
+ $as_echo "$as_val"'`
+ { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+else
+ # Is the header compilable?
+{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5
+$as_echo_n "checking $ac_header usability... " >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_header_compiler=yes
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_compiler=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+$as_echo "$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5
+$as_echo_n "checking $ac_header presence... " >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <$ac_header>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null && {
+ test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ }; then
+ ac_header_preproc=yes
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_preproc=no
+fi
+
+rm -f conftest.err conftest.$ac_ext
+{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+$as_echo "$ac_header_preproc" >&6; }
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+ yes:no: )
+ { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+ ac_header_preproc=yes
+ ;;
+ no:yes:* )
+ { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+ { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
+$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
+ { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+ { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5
+$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;}
+ { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+ { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+ ( cat <<\_ASBOX
+## --------------------- ##
+## Report this to 3.12.4 ##
+## --------------------- ##
+_ASBOX
+ ) | sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5
+$as_echo_n "checking for $ac_header... " >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ $as_echo_n "(cached) " >&6
+else
+ eval "$as_ac_Header=\$ac_header_preproc"
+fi
+ac_res=`eval 'as_val=${'$as_ac_Header'}
+ $as_echo "$as_val"'`
+ { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+
+fi
+as_val=`eval 'as_val=${'$as_ac_Header'}
+ $as_echo "$as_val"'`
+ if test "x$as_val" = x""yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+else
+ { { $as_echo "$as_me:$LINENO: error: cannot find net-snmp-devel support (or --disable-network-build)" >&5
+$as_echo "$as_me: error: cannot find net-snmp-devel support (or --disable-network-build)" >&2;}
+ { (exit 5); exit 5; }; }
+fi
+
+done
+
+fi
+fi
+
+if test "$hpijs_only_build" = "no" && test "$pp_build" = "yes"; then
+
+for ac_header in linux/ppdev.h
+do
+as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5
+$as_echo_n "checking for $ac_header... " >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ $as_echo_n "(cached) " >&6
+fi
+ac_res=`eval 'as_val=${'$as_ac_Header'}
+ $as_echo "$as_val"'`
+ { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+else
+ # Is the header compilable?
+{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5
+$as_echo_n "checking $ac_header usability... " >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_header_compiler=yes
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_compiler=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+$as_echo "$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5
+$as_echo_n "checking $ac_header presence... " >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <$ac_header>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null && {
+ test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ }; then
+ ac_header_preproc=yes
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_preproc=no
+fi
+
+rm -f conftest.err conftest.$ac_ext
+{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+$as_echo "$ac_header_preproc" >&6; }
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+ yes:no: )
+ { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+ ac_header_preproc=yes
+ ;;
+ no:yes:* )
+ { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+ { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
+$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
+ { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+ { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5
+$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;}
+ { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+ { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+ ( cat <<\_ASBOX
+## --------------------- ##
+## Report this to 3.12.4 ##
+## --------------------- ##
+_ASBOX
+ ) | sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5
+$as_echo_n "checking for $ac_header... " >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ $as_echo_n "(cached) " >&6
+else
+ eval "$as_ac_Header=\$ac_header_preproc"
+fi
+ac_res=`eval 'as_val=${'$as_ac_Header'}
+ $as_echo "$as_val"'`
+ { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+
+fi
+as_val=`eval 'as_val=${'$as_ac_Header'}
+ $as_echo "$as_val"'`
+ if test "x$as_val" = x""yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+else
+ { { $as_echo "$as_me:$LINENO: error: cannot find ppdev-devel support (or --disable-pp-build)" >&5
+$as_echo "$as_me: error: cannot find ppdev-devel support (or --disable-pp-build)" >&2;}
+ { (exit 8); exit 8; }; }
+fi
+
+done
+
+fi
+
+if test "$hpijs_only_build" = "no"; then
+ { $as_echo "$as_me:$LINENO: checking for cupsDoFileRequest in -lcups" >&5
+$as_echo_n "checking for cupsDoFileRequest in -lcups... " >&6; }
+if test "${ac_cv_lib_cups_cupsDoFileRequest+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lcups $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char cupsDoFileRequest ();
+int
+main ()
+{
+return cupsDoFileRequest ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext && {
+ test "$cross_compiling" = yes ||
+ $as_test_x conftest$ac_exeext
+ }; then
+ ac_cv_lib_cups_cupsDoFileRequest=yes
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_lib_cups_cupsDoFileRequest=no
+fi
+
+rm -rf conftest.dSYM
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_cups_cupsDoFileRequest" >&5
+$as_echo "$ac_cv_lib_cups_cupsDoFileRequest" >&6; }
+if test "x$ac_cv_lib_cups_cupsDoFileRequest" = x""yes; then
+ LIBS="$LIBS"
+else
+ { { $as_echo "$as_me:$LINENO: error: cannot find libcups support" >&5
+$as_echo "$as_me: error: cannot find libcups support" >&2;}
+ { (exit 9); exit 9; }; }
+fi
+
+
+for ac_header in cups/cups.h
+do
+as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5
+$as_echo_n "checking for $ac_header... " >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ $as_echo_n "(cached) " >&6
+fi
+ac_res=`eval 'as_val=${'$as_ac_Header'}
+ $as_echo "$as_val"'`
+ { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+else
+ # Is the header compilable?
+{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5
+$as_echo_n "checking $ac_header usability... " >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_header_compiler=yes
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_compiler=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+$as_echo "$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5
+$as_echo_n "checking $ac_header presence... " >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <$ac_header>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null && {
+ test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ }; then
+ ac_header_preproc=yes
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_preproc=no
+fi
+
+rm -f conftest.err conftest.$ac_ext
+{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+$as_echo "$ac_header_preproc" >&6; }
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+ yes:no: )
+ { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+ ac_header_preproc=yes
+ ;;
+ no:yes:* )
+ { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+ { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
+$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
+ { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+ { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5
+$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;}
+ { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+ { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+ ( cat <<\_ASBOX
+## --------------------- ##
+## Report this to 3.12.4 ##
+## --------------------- ##
+_ASBOX
+ ) | sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5
+$as_echo_n "checking for $ac_header... " >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ $as_echo_n "(cached) " >&6
+else
+ eval "$as_ac_Header=\$ac_header_preproc"
+fi
+ac_res=`eval 'as_val=${'$as_ac_Header'}
+ $as_echo "$as_val"'`
+ { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+
+fi
+as_val=`eval 'as_val=${'$as_ac_Header'}
+ $as_echo "$as_val"'`
+ if test "x$as_val" = x""yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+else
+ { { $as_echo "$as_me:$LINENO: error: cannot find cups-devel support" >&5
+$as_echo "$as_me: error: cannot find cups-devel support" >&2;}
+ { (exit 3); exit 3; }; }
+fi
+
+done
+
+ { $as_echo "$as_me:$LINENO: checking for usb_init in -lusb" >&5
+$as_echo_n "checking for usb_init in -lusb... " >&6; }
+if test "${ac_cv_lib_usb_usb_init+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lusb $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char usb_init ();
+int
+main ()
+{
+return usb_init ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext && {
+ test "$cross_compiling" = yes ||
+ $as_test_x conftest$ac_exeext
+ }; then
+ ac_cv_lib_usb_usb_init=yes
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_lib_usb_usb_init=no
+fi
+
+rm -rf conftest.dSYM
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_usb_usb_init" >&5
+$as_echo "$ac_cv_lib_usb_usb_init" >&6; }
+if test "x$ac_cv_lib_usb_usb_init" = x""yes; then
+ LIBS="$LIBS"
+else
+ { { $as_echo "$as_me:$LINENO: error: cannot find libusb support" >&5
+$as_echo "$as_me: error: cannot find libusb support" >&2;}
+ { (exit 2); exit 2; }; }
+fi
+
+
+for ac_header in usb.h
+do
+as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5
+$as_echo_n "checking for $ac_header... " >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ $as_echo_n "(cached) " >&6
+fi
+ac_res=`eval 'as_val=${'$as_ac_Header'}
+ $as_echo "$as_val"'`
+ { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+else
+ # Is the header compilable?
+{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5
+$as_echo_n "checking $ac_header usability... " >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_header_compiler=yes
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_compiler=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+$as_echo "$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5
+$as_echo_n "checking $ac_header presence... " >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <$ac_header>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null && {
+ test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ }; then
+ ac_header_preproc=yes
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_preproc=no
+fi
+
+rm -f conftest.err conftest.$ac_ext
+{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+$as_echo "$ac_header_preproc" >&6; }
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+ yes:no: )
+ { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+ ac_header_preproc=yes
+ ;;
+ no:yes:* )
+ { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+ { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
+$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
+ { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+ { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5
+$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;}
+ { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+ { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+ ( cat <<\_ASBOX
+## --------------------- ##
+## Report this to 3.12.4 ##
+## --------------------- ##
+_ASBOX
+ ) | sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5
+$as_echo_n "checking for $ac_header... " >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ $as_echo_n "(cached) " >&6
+else
+ eval "$as_ac_Header=\$ac_header_preproc"
+fi
+ac_res=`eval 'as_val=${'$as_ac_Header'}
+ $as_echo "$as_val"'`
+ { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+
+fi
+as_val=`eval 'as_val=${'$as_ac_Header'}
+ $as_echo "$as_val"'`
+ if test "x$as_val" = x""yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+else
+ { { $as_echo "$as_me:$LINENO: error: cannot find libusb-devel support" >&5
+$as_echo "$as_me: error: cannot find libusb-devel support" >&2;}
+ { (exit 11); exit 11; }; }
+fi
+
+done
+
+fi
+
+if test "$hpijs_only_build" = "no" && test "$lite_build" = "no" && test "$hpcups_only_build" = "no"; then
+
+
+
+
+
+ if test -n "$PYTHON"; then
+ # If the user set $PYTHON, use it and don't search something else.
+ { $as_echo "$as_me:$LINENO: checking whether $PYTHON version >= 2.2" >&5
+$as_echo_n "checking whether $PYTHON version >= 2.2... " >&6; }
+ prog="import sys
+# split strings by '.' and convert to numeric. Append some zeros
+# because we need at least 4 digits for the hex conversion.
+# map returns an iterator in Python 3.0 and a list in 2.x
+minver = list(map(int, '2.2'.split('.'))) + [0, 0, 0]
+minverhex = 0
+# xrange is not present in Python 3.0 and range returns an iterator
+for i in list(range(0, 4)): minverhex = (minverhex << 8) + minver[i]
+sys.exit(sys.hexversion < minverhex)"
+ if { echo "$as_me:$LINENO: $PYTHON -c "$prog"" >&5
+ ($PYTHON -c "$prog") >&5 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+ { { $as_echo "$as_me:$LINENO: error: too old" >&5
+$as_echo "$as_me: error: too old" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+ am_display_PYTHON=$PYTHON
+ else
+ # Otherwise, try each interpreter until we find one that satisfies
+ # VERSION.
+ { $as_echo "$as_me:$LINENO: checking for a Python interpreter with version >= 2.2" >&5
+$as_echo_n "checking for a Python interpreter with version >= 2.2... " >&6; }
+if test "${am_cv_pathless_PYTHON+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+
+ for am_cv_pathless_PYTHON in python python2 python3 python3.0 python2.5 python2.4 python2.3 python2.2 python2.1 python2.0 none; do
+ test "$am_cv_pathless_PYTHON" = none && break
+ prog="import sys
+# split strings by '.' and convert to numeric. Append some zeros
+# because we need at least 4 digits for the hex conversion.
+# map returns an iterator in Python 3.0 and a list in 2.x
+minver = list(map(int, '2.2'.split('.'))) + [0, 0, 0]
+minverhex = 0
+# xrange is not present in Python 3.0 and range returns an iterator
+for i in list(range(0, 4)): minverhex = (minverhex << 8) + minver[i]
+sys.exit(sys.hexversion < minverhex)"
+ if { echo "$as_me:$LINENO: $am_cv_pathless_PYTHON -c "$prog"" >&5
+ ($am_cv_pathless_PYTHON -c "$prog") >&5 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ break
+fi
+
+ done
+fi
+{ $as_echo "$as_me:$LINENO: result: $am_cv_pathless_PYTHON" >&5
+$as_echo "$am_cv_pathless_PYTHON" >&6; }
+ # Set $PYTHON to the absolute path of $am_cv_pathless_PYTHON.
+ if test "$am_cv_pathless_PYTHON" = none; then
+ PYTHON=:
+ else
+ # Extract the first word of "$am_cv_pathless_PYTHON", so it can be a program name with args.
+set dummy $am_cv_pathless_PYTHON; ac_word=$2
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_path_PYTHON+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ case $PYTHON in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_PYTHON="$PYTHON" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_path_PYTHON="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+PYTHON=$ac_cv_path_PYTHON
+if test -n "$PYTHON"; then
+ { $as_echo "$as_me:$LINENO: result: $PYTHON" >&5
+$as_echo "$PYTHON" >&6; }
+else
+ { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ fi
+ am_display_PYTHON=$am_cv_pathless_PYTHON
+ fi
+
+
+ if test "$PYTHON" = :; then
+ { { $as_echo "$as_me:$LINENO: error: no suitable Python interpreter found" >&5
+$as_echo "$as_me: error: no suitable Python interpreter found" >&2;}
+ { (exit 1); exit 1; }; }
+ else
+
+
+ { $as_echo "$as_me:$LINENO: checking for $am_display_PYTHON version" >&5
+$as_echo_n "checking for $am_display_PYTHON version... " >&6; }
+if test "${am_cv_python_version+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ am_cv_python_version=`$PYTHON -c "import sys; sys.stdout.write(sys.version[:3])"`
+fi
+{ $as_echo "$as_me:$LINENO: result: $am_cv_python_version" >&5
+$as_echo "$am_cv_python_version" >&6; }
+ PYTHON_VERSION=$am_cv_python_version
+
+
+
+ PYTHON_PREFIX='${prefix}'
+
+ PYTHON_EXEC_PREFIX='${exec_prefix}'
+
+
+
+ { $as_echo "$as_me:$LINENO: checking for $am_display_PYTHON platform" >&5
+$as_echo_n "checking for $am_display_PYTHON platform... " >&6; }
+if test "${am_cv_python_platform+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ am_cv_python_platform=`$PYTHON -c "import sys; sys.stdout.write(sys.platform)"`
+fi
+{ $as_echo "$as_me:$LINENO: result: $am_cv_python_platform" >&5
+$as_echo "$am_cv_python_platform" >&6; }
+ PYTHON_PLATFORM=$am_cv_python_platform
+
+
+
+
+ { $as_echo "$as_me:$LINENO: checking for $am_display_PYTHON script directory" >&5
+$as_echo_n "checking for $am_display_PYTHON script directory... " >&6; }
+if test "${am_cv_python_pythondir+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ if test "x$prefix" = xNONE
+ then
+ am_py_prefix=$ac_default_prefix
+ else
+ am_py_prefix=$prefix
+ fi
+ am_cv_python_pythondir=`$PYTHON -c "import sys; from distutils import sysconfig; sys.stdout.write(sysconfig.get_python_lib(0,0,prefix='$am_py_prefix'))" 2>/dev/null ||
+ echo "$PYTHON_PREFIX/lib/python$PYTHON_VERSION/site-packages"`
+ case $am_cv_python_pythondir in
+ $am_py_prefix*)
+ am__strip_prefix=`echo "$am_py_prefix" | sed 's|.|.|g'`
+ am_cv_python_pythondir=`echo "$am_cv_python_pythondir" | sed "s,^$am__strip_prefix,$PYTHON_PREFIX,"`
+ ;;
+ esac
+
+fi
+{ $as_echo "$as_me:$LINENO: result: $am_cv_python_pythondir" >&5
+$as_echo "$am_cv_python_pythondir" >&6; }
+ pythondir=$am_cv_python_pythondir
+
+
+
+ pkgpythondir=\${pythondir}/$PACKAGE
+
+
+ { $as_echo "$as_me:$LINENO: checking for $am_display_PYTHON extension module directory" >&5
+$as_echo_n "checking for $am_display_PYTHON extension module directory... " >&6; }
+if test "${am_cv_python_pyexecdir+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ if test "x$exec_prefix" = xNONE
+ then
+ am_py_exec_prefix=$am_py_prefix
+ else
+ am_py_exec_prefix=$exec_prefix
+ fi
+ am_cv_python_pyexecdir=`$PYTHON -c "import sys; from distutils import sysconfig; sys.stdout.write(sysconfig.get_python_lib(1,0,prefix='$am_py_exec_prefix'))" 2>/dev/null ||
+ echo "$PYTHON_EXEC_PREFIX/lib/python$PYTHON_VERSION/site-packages"`
+ case $am_cv_python_pyexecdir in
+ $am_py_exec_prefix*)
+ am__strip_prefix=`echo "$am_py_exec_prefix" | sed 's|.|.|g'`
+ am_cv_python_pyexecdir=`echo "$am_cv_python_pyexecdir" | sed "s,^$am__strip_prefix,$PYTHON_EXEC_PREFIX,"`
+ ;;
+ esac
+
+fi
+{ $as_echo "$as_me:$LINENO: result: $am_cv_python_pyexecdir" >&5
+$as_echo "$am_cv_python_pyexecdir" >&6; }
+ pyexecdir=$am_cv_python_pyexecdir
+
+
+
+ pkgpyexecdir=\${pyexecdir}/$PACKAGE
+
+
+
+ fi
+
+
+ { $as_echo "$as_me:$LINENO: checking for path to Python.h" >&5
+$as_echo_n "checking for path to Python.h... " >&6; }
+ PYTHONINCLUDEDIR=`$PYTHON -c "from distutils.sysconfig import get_python_inc; print get_python_inc();"`
+ { $as_echo "$as_me:$LINENO: result: \"using $PYTHONINCLUDEDIR\"" >&5
+$as_echo "\"using $PYTHONINCLUDEDIR\"" >&6; }
+
+
+for ac_header in python$PYTHON_VERSION/Python.h
+do
+as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5
+$as_echo_n "checking for $ac_header... " >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ $as_echo_n "(cached) " >&6
+fi
+ac_res=`eval 'as_val=${'$as_ac_Header'}
+ $as_echo "$as_val"'`
+ { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+else
+ # Is the header compilable?
+{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5
+$as_echo_n "checking $ac_header usability... " >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_header_compiler=yes
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_compiler=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+$as_echo "$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5
+$as_echo_n "checking $ac_header presence... " >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <$ac_header>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null && {
+ test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ }; then
+ ac_header_preproc=yes
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_preproc=no
+fi
+
+rm -f conftest.err conftest.$ac_ext
+{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+$as_echo "$ac_header_preproc" >&6; }
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+ yes:no: )
+ { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+ ac_header_preproc=yes
+ ;;
+ no:yes:* )
+ { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+ { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
+$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
+ { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+ { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5
+$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;}
+ { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+ { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+ ( cat <<\_ASBOX
+## --------------------- ##
+## Report this to 3.12.4 ##
+## --------------------- ##
+_ASBOX
+ ) | sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5
+$as_echo_n "checking for $ac_header... " >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ $as_echo_n "(cached) " >&6
+else
+ eval "$as_ac_Header=\$ac_header_preproc"
+fi
+ac_res=`eval 'as_val=${'$as_ac_Header'}
+ $as_echo "$as_val"'`
+ { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+
+fi
+as_val=`eval 'as_val=${'$as_ac_Header'}
+ $as_echo "$as_val"'`
+ if test "x$as_val" = x""yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+else
+ { { $as_echo "$as_me:$LINENO: error: cannot find python-devel support" >&5
+$as_echo "$as_me: error: cannot find python-devel support" >&2;}
+ { (exit 6); exit 6; }; }
+fi
+
+done
+
+fi
+
+if test "$hpijs_only_build" = "no" && test "$scan_build" = "yes" && test "$hpcups_only_build" = "no"; then
+ { $as_echo "$as_me:$LINENO: checking for sane_open in -lsane" >&5
+$as_echo_n "checking for sane_open in -lsane... " >&6; }
+if test "${ac_cv_lib_sane_sane_open+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsane $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char sane_open ();
+int
+main ()
+{
+return sane_open ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext && {
+ test "$cross_compiling" = yes ||
+ $as_test_x conftest$ac_exeext
+ }; then
+ ac_cv_lib_sane_sane_open=yes
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_lib_sane_sane_open=no
+fi
+
+rm -rf conftest.dSYM
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_sane_sane_open" >&5
+$as_echo "$ac_cv_lib_sane_sane_open" >&6; }
+if test "x$ac_cv_lib_sane_sane_open" = x""yes; then
+ LIBS="$LIBS"
+else
+ { { $as_echo "$as_me:$LINENO: error: cannot find sane-backends-devel support (or --disable-scan-build)" >&5
+$as_echo "$as_me: error: cannot find sane-backends-devel support (or --disable-scan-build)" >&2;}
+ { (exit 12); exit 12; }; }
+fi
+
+fi
+
+# The PKG_CHECK_MODULES macro requires the pkgconfig package (pkg-config). Otherwise you get a strange shell script error
+# "syntax error near upexpected token: DBUS".
+if test "$hpijs_only_build" = "no" && test "$lite_build" = "no" && test "$hpcups_only_build" = "no" && test "$dbus_build" = "yes"; then
+# PKG_CHECK_MODULES(DBUS, [dbus-1 >= 1.0.0, dbus-glib-1 >= 0.61],,[AC_MSG_ERROR([cannot find dbus-devel support: $DBUS_PKG_ERRORS], 14)])
+
+
+if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args.
+set dummy ${ac_tool_prefix}pkg-config; ac_word=$2
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_path_PKG_CONFIG+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ case $PKG_CONFIG in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+PKG_CONFIG=$ac_cv_path_PKG_CONFIG
+if test -n "$PKG_CONFIG"; then
+ { $as_echo "$as_me:$LINENO: result: $PKG_CONFIG" >&5
+$as_echo "$PKG_CONFIG" >&6; }
+else
+ { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_path_PKG_CONFIG"; then
+ ac_pt_PKG_CONFIG=$PKG_CONFIG
+ # Extract the first word of "pkg-config", so it can be a program name with args.
+set dummy pkg-config; ac_word=$2
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_path_ac_pt_PKG_CONFIG+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ case $ac_pt_PKG_CONFIG in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG
+if test -n "$ac_pt_PKG_CONFIG"; then
+ { $as_echo "$as_me:$LINENO: result: $ac_pt_PKG_CONFIG" >&5
+$as_echo "$ac_pt_PKG_CONFIG" >&6; }
+else
+ { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_pt_PKG_CONFIG" = x; then
+ PKG_CONFIG=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ PKG_CONFIG=$ac_pt_PKG_CONFIG
+ fi
+else
+ PKG_CONFIG="$ac_cv_path_PKG_CONFIG"
+fi
+
+fi
+if test -n "$PKG_CONFIG"; then
+ _pkg_min_version=0.9.0
+ { $as_echo "$as_me:$LINENO: checking pkg-config is at least version $_pkg_min_version" >&5
+$as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; }
+ if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
+ { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+ else
+ { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+ PKG_CONFIG=""
+ fi
+
+fi
+
+pkg_failed=no
+{ $as_echo "$as_me:$LINENO: checking for DBUS" >&5
+$as_echo_n "checking for DBUS... " >&6; }
+
+if test -n "$DBUS_CFLAGS"; then
+ pkg_cv_DBUS_CFLAGS="$DBUS_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+ if test -n "$PKG_CONFIG" && \
+ { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"dbus-1 >= 1.0.0\"") >&5
+ ($PKG_CONFIG --exists --print-errors "dbus-1 >= 1.0.0") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ pkg_cv_DBUS_CFLAGS=`$PKG_CONFIG --cflags "dbus-1 >= 1.0.0" 2>/dev/null`
+else
+ pkg_failed=yes
+fi
+ else
+ pkg_failed=untried
+fi
+if test -n "$DBUS_LIBS"; then
+ pkg_cv_DBUS_LIBS="$DBUS_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+ if test -n "$PKG_CONFIG" && \
+ { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"dbus-1 >= 1.0.0\"") >&5
+ ($PKG_CONFIG --exists --print-errors "dbus-1 >= 1.0.0") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ pkg_cv_DBUS_LIBS=`$PKG_CONFIG --libs "dbus-1 >= 1.0.0" 2>/dev/null`
+else
+ pkg_failed=yes
+fi
+ else
+ pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+ _pkg_short_errors_supported=yes
+else
+ _pkg_short_errors_supported=no
+fi
+ if test $_pkg_short_errors_supported = yes; then
+ DBUS_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "dbus-1 >= 1.0.0" 2>&1`
+ else
+ DBUS_PKG_ERRORS=`$PKG_CONFIG --print-errors "dbus-1 >= 1.0.0" 2>&1`
+ fi
+ # Put the nasty error message in config.log where it belongs
+ echo "$DBUS_PKG_ERRORS" >&5
+
+ { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+ { { $as_echo "$as_me:$LINENO: error: cannot find dbus-devel support: $DBUS_PKG_ERRORS" >&5
+$as_echo "$as_me: error: cannot find dbus-devel support: $DBUS_PKG_ERRORS" >&2;}
+ { (exit 14); exit 14; }; }
+elif test $pkg_failed = untried; then
+ { { $as_echo "$as_me:$LINENO: error: cannot find dbus-devel support: $DBUS_PKG_ERRORS" >&5
+$as_echo "$as_me: error: cannot find dbus-devel support: $DBUS_PKG_ERRORS" >&2;}
+ { (exit 14); exit 14; }; }
+else
+ DBUS_CFLAGS=$pkg_cv_DBUS_CFLAGS
+ DBUS_LIBS=$pkg_cv_DBUS_LIBS
+ { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+ :
+fi
+ { $as_echo "$as_me:$LINENO: checking for dbus_connection_open in -ldbus-1" >&5
+$as_echo_n "checking for dbus_connection_open in -ldbus-1... " >&6; }
+if test "${ac_cv_lib_dbus_1_dbus_connection_open+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldbus-1 $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dbus_connection_open ();
+int
+main ()
+{
+return dbus_connection_open ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext && {
+ test "$cross_compiling" = yes ||
+ $as_test_x conftest$ac_exeext
+ }; then
+ ac_cv_lib_dbus_1_dbus_connection_open=yes
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_lib_dbus_1_dbus_connection_open=no
+fi
+
+rm -rf conftest.dSYM
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_dbus_1_dbus_connection_open" >&5
+$as_echo "$ac_cv_lib_dbus_1_dbus_connection_open" >&6; }
+if test "x$ac_cv_lib_dbus_1_dbus_connection_open" = x""yes; then
+ LIBS="$LIBS" cat >>confdefs.h <<\_ACEOF
+#define HAVE_DBUS 1
+_ACEOF
+
+else
+ { { $as_echo "$as_me:$LINENO: error: cannot find libdbus support" >&5
+$as_echo "$as_me: error: cannot find libdbus support" >&2;}
+ { (exit 13); exit 13; }; }
+fi
+
+fi
+
+if test "$hpijs_only_build" = "no" && test "$lite_build" = "no" && test "$hpcups_only_build" = "no" && test "$fax_build" = "yes" && test "$dbus_build" = "no"; then
+ { { $as_echo "$as_me:$LINENO: error: fax requires dbus support" >&5
+$as_echo "$as_me: error: fax requires dbus support" >&2;}
+ { (exit 15); exit 15; }; }
+fi
+
+# AC_DEFINE_DIR([DATADIR], [datadir])
+# Copyright © 2006 Stepan Kasal <kasal@ucw.cz>
+# Copyright © 2006 Andreas Schwab <schwab@suse.de>
+# Copyright © 2006 Guido U. Draheim <guidod@gmx.de>
+# Copyright © 2006 Alexandre Oliva
+# Copying and distribution of this file, with or without modification, are permitted in any medium without
+# royalty provided the copyright notice and this notice are preserved.
+
+
+
+ prefix_NONE=
+ exec_prefix_NONE=
+ test "x$prefix" = xNONE && prefix_NONE=yes && prefix=$ac_default_prefix
+ test "x$exec_prefix" = xNONE && exec_prefix_NONE=yes && exec_prefix=$prefix
+ eval ac_define_dir="\"$datadir\""
+ eval ac_define_dir="\"$ac_define_dir\""
+ abs_datadir="$ac_define_dir"
+ test "$prefix_NONE" && prefix=NONE
+ test "$exec_prefix_NONE" && exec_prefix=NONE
+
+
+ prefix_NONE=
+ exec_prefix_NONE=
+ test "x$prefix" = xNONE && prefix_NONE=yes && prefix=$ac_default_prefix
+ test "x$exec_prefix" = xNONE && exec_prefix_NONE=yes && exec_prefix=$prefix
+ eval ac_define_dir="\"$sbindir\""
+ eval ac_define_dir="\"$ac_define_dir\""
+ abs_sbindir="$ac_define_dir"
+ test "$prefix_NONE" && prefix=NONE
+ test "$exec_prefix_NONE" && exec_prefix=NONE
+
+
+ prefix_NONE=
+ exec_prefix_NONE=
+ test "x$prefix" = xNONE && prefix_NONE=yes && prefix=$ac_default_prefix
+ test "x$exec_prefix" = xNONE && exec_prefix_NONE=yes && exec_prefix=$prefix
+ eval ac_define_dir="\"$hpppddir\""
+ eval ac_define_dir="\"$ac_define_dir\""
+ abs_hpppddir="$ac_define_dir"
+ test "$prefix_NONE" && prefix=NONE
+ test "$exec_prefix_NONE" && exec_prefix=NONE
+
+
+ prefix_NONE=
+ exec_prefix_NONE=
+ test "x$prefix" = xNONE && prefix_NONE=yes && prefix=$ac_default_prefix
+ test "x$exec_prefix" = xNONE && exec_prefix_NONE=yes && exec_prefix=$prefix
+ eval ac_define_dir="\"$hpdocdir\""
+ eval ac_define_dir="\"$ac_define_dir\""
+ abs_docdir="$ac_define_dir"
+ test "$prefix_NONE" && prefix=NONE
+ test "$exec_prefix_NONE" && exec_prefix=NONE
+
+abs_ppddir=${abs_hpppddir%/*}
+
+ prefix_NONE=
+ exec_prefix_NONE=
+ test "x$prefix" = xNONE && prefix_NONE=yes && prefix=$ac_default_prefix
+ test "x$exec_prefix" = xNONE && exec_prefix_NONE=yes && exec_prefix=$prefix
+ eval ac_define_dir="\"$drvdir\""
+ eval ac_define_dir="\"$ac_define_dir\""
+ abs_drvdir="$ac_define_dir"
+ test "$prefix_NONE" && prefix=NONE
+ test "$exec_prefix_NONE" && exec_prefix=NONE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ac_config_files="$ac_config_files Makefile hplip.conf hplip.desktop hplip-systray.desktop prnt/drv/hpijs.drv prnt/drv/hpcups.drv hplip.list data/policykit/com.hp.hplip.service"
+
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems. If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, we kill variables containing newlines.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(
+ for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
+ eval ac_val=\$$ac_var
+ case $ac_val in #(
+ *${as_nl}*)
+ case $ac_var in #(
+ *_cv_*) { $as_echo "$as_me:$LINENO: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+ esac
+ case $ac_var in #(
+ _ | IFS | as_nl) ;; #(
+ BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+ *) $as_unset $ac_var ;;
+ esac ;;
+ esac
+ done
+
+ (set) 2>&1 |
+ case $as_nl`(ac_space=' '; set) 2>&1` in #(
+ *${as_nl}ac_space=\ *)
+ # `set' does not quote correctly, so add quotes (double-quote
+ # substitution turns \\\\ into \\, and sed turns \\ into \).
+ sed -n \
+ "s/'/'\\\\''/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+ ;; #(
+ *)
+ # `set' quotes correctly as required by POSIX, so do not add quotes.
+ sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+ ;;
+ esac |
+ sort
+) |
+ sed '
+ /^ac_cv_env_/b end
+ t clear
+ :clear
+ s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+ t end
+ s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+ :end' >>confcache
+if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
+ if test -w "$cache_file"; then
+ test "x$cache_file" != "x/dev/null" &&
+ { $as_echo "$as_me:$LINENO: updating cache $cache_file" >&5
+$as_echo "$as_me: updating cache $cache_file" >&6;}
+ cat confcache >$cache_file
+ else
+ { $as_echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5
+$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+ fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# Transform confdefs.h into DEFS.
+# Protect against shell expansion while executing Makefile rules.
+# Protect against Makefile macro expansion.
+#
+# If the first sed substitution is executed (which looks for macros that
+# take arguments), then branch to the quote section. Otherwise,
+# look for a macro that doesn't take arguments.
+ac_script='
+:mline
+/\\$/{
+ N
+ s,\\\n,,
+ b mline
+}
+t clear
+:clear
+s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g
+t quote
+s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g
+t quote
+b any
+:quote
+s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g
+s/\[/\\&/g
+s/\]/\\&/g
+s/\$/$$/g
+H
+:any
+${
+ g
+ s/^\n//
+ s/\n/ /g
+ p
+}
+'
+DEFS=`sed -n "$ac_script" confdefs.h`
+
+
+ac_libobjs=
+ac_ltlibobjs=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+ # 1. Remove the extension, and $U if already installed.
+ ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
+ ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
+ # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR
+ # will be set to the directory where LIBOBJS objects are built.
+ ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext"
+ ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+ if test -n "$EXEEXT"; then
+ am__EXEEXT_TRUE=
+ am__EXEEXT_FALSE='#'
+else
+ am__EXEEXT_TRUE='#'
+ am__EXEEXT_FALSE=
+fi
+
+if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
+ { { $as_echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+$as_echo "$as_me: error: conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then
+ { { $as_echo "$as_me:$LINENO: error: conditional \"am__fastdepCXX\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+$as_echo "$as_me: error: conditional \"am__fastdepCXX\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+ { { $as_echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+$as_echo "$as_me: error: conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+if test -z "${DARWIN_BUILD_TRUE}" && test -z "${DARWIN_BUILD_FALSE}"; then
+ { { $as_echo "$as_me:$LINENO: error: conditional \"DARWIN_BUILD\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+$as_echo "$as_me: error: conditional \"DARWIN_BUILD\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${DOC_BUILD_TRUE}" && test -z "${DOC_BUILD_FALSE}"; then
+ { { $as_echo "$as_me:$LINENO: error: conditional \"DOC_BUILD\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+$as_echo "$as_me: error: conditional \"DOC_BUILD\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${HPIJS_ONLY_BUILD_TRUE}" && test -z "${HPIJS_ONLY_BUILD_FALSE}"; then
+ { { $as_echo "$as_me:$LINENO: error: conditional \"HPIJS_ONLY_BUILD\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+$as_echo "$as_me: error: conditional \"HPIJS_ONLY_BUILD\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${LITE_BUILD_TRUE}" && test -z "${LITE_BUILD_FALSE}"; then
+ { { $as_echo "$as_me:$LINENO: error: conditional \"LITE_BUILD\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+$as_echo "$as_me: error: conditional \"LITE_BUILD\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${HPCUPS_ONLY_BUILD_TRUE}" && test -z "${HPCUPS_ONLY_BUILD_FALSE}"; then
+ { { $as_echo "$as_me:$LINENO: error: conditional \"HPCUPS_ONLY_BUILD\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+$as_echo "$as_me: error: conditional \"HPCUPS_ONLY_BUILD\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${HPLIP_BUILD_TRUE}" && test -z "${HPLIP_BUILD_FALSE}"; then
+ { { $as_echo "$as_me:$LINENO: error: conditional \"HPLIP_BUILD\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+$as_echo "$as_me: error: conditional \"HPLIP_BUILD\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${FULL_BUILD_TRUE}" && test -z "${FULL_BUILD_FALSE}"; then
+ { { $as_echo "$as_me:$LINENO: error: conditional \"FULL_BUILD\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+$as_echo "$as_me: error: conditional \"FULL_BUILD\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${HPIJS_INSTALL_TRUE}" && test -z "${HPIJS_INSTALL_FALSE}"; then
+ { { $as_echo "$as_me:$LINENO: error: conditional \"HPIJS_INSTALL\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+$as_echo "$as_me: error: conditional \"HPIJS_INSTALL\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${HPCUPS_INSTALL_TRUE}" && test -z "${HPCUPS_INSTALL_FALSE}"; then
+ { { $as_echo "$as_me:$LINENO: error: conditional \"HPCUPS_INSTALL\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+$as_echo "$as_me: error: conditional \"HPCUPS_INSTALL\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${NEW_HPCUPS_TRUE}" && test -z "${NEW_HPCUPS_FALSE}"; then
+ { { $as_echo "$as_me:$LINENO: error: conditional \"NEW_HPCUPS\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+$as_echo "$as_me: error: conditional \"NEW_HPCUPS\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${NETWORK_BUILD_TRUE}" && test -z "${NETWORK_BUILD_FALSE}"; then
+ { { $as_echo "$as_me:$LINENO: error: conditional \"NETWORK_BUILD\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+$as_echo "$as_me: error: conditional \"NETWORK_BUILD\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${SCAN_BUILD_TRUE}" && test -z "${SCAN_BUILD_FALSE}"; then
+ { { $as_echo "$as_me:$LINENO: error: conditional \"SCAN_BUILD\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+$as_echo "$as_me: error: conditional \"SCAN_BUILD\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${GUI_BUILD_TRUE}" && test -z "${GUI_BUILD_FALSE}"; then
+ { { $as_echo "$as_me:$LINENO: error: conditional \"GUI_BUILD\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+$as_echo "$as_me: error: conditional \"GUI_BUILD\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${FAX_BUILD_TRUE}" && test -z "${FAX_BUILD_FALSE}"; then
+ { { $as_echo "$as_me:$LINENO: error: conditional \"FAX_BUILD\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+$as_echo "$as_me: error: conditional \"FAX_BUILD\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${UDEV_ACL_RULES_TRUE}" && test -z "${UDEV_ACL_RULES_FALSE}"; then
+ { { $as_echo "$as_me:$LINENO: error: conditional \"UDEV_ACL_RULES\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+$as_echo "$as_me: error: conditional \"UDEV_ACL_RULES\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${SHADOW_BUILD_TRUE}" && test -z "${SHADOW_BUILD_FALSE}"; then
+ { { $as_echo "$as_me:$LINENO: error: conditional \"SHADOW_BUILD\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+$as_echo "$as_me: error: conditional \"SHADOW_BUILD\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${FOOMATIC_PPD_INSTALL_TRUE}" && test -z "${FOOMATIC_PPD_INSTALL_FALSE}"; then
+ { { $as_echo "$as_me:$LINENO: error: conditional \"FOOMATIC_PPD_INSTALL\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+$as_echo "$as_me: error: conditional \"FOOMATIC_PPD_INSTALL\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${FOOMATIC_DRV_INSTALL_TRUE}" && test -z "${FOOMATIC_DRV_INSTALL_FALSE}"; then
+ { { $as_echo "$as_me:$LINENO: error: conditional \"FOOMATIC_DRV_INSTALL\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+$as_echo "$as_me: error: conditional \"FOOMATIC_DRV_INSTALL\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${CUPS_DRV_INSTALL_TRUE}" && test -z "${CUPS_DRV_INSTALL_FALSE}"; then
+ { { $as_echo "$as_me:$LINENO: error: conditional \"CUPS_DRV_INSTALL\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+$as_echo "$as_me: error: conditional \"CUPS_DRV_INSTALL\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${CUPS_PPD_INSTALL_TRUE}" && test -z "${CUPS_PPD_INSTALL_FALSE}"; then
+ { { $as_echo "$as_me:$LINENO: error: conditional \"CUPS_PPD_INSTALL\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+$as_echo "$as_me: error: conditional \"CUPS_PPD_INSTALL\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${RIP_INSTALL_TRUE}" && test -z "${RIP_INSTALL_FALSE}"; then
+ { { $as_echo "$as_me:$LINENO: error: conditional \"RIP_INSTALL\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+$as_echo "$as_me: error: conditional \"RIP_INSTALL\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${QT4_INSTALL_TRUE}" && test -z "${QT4_INSTALL_FALSE}"; then
+ { { $as_echo "$as_me:$LINENO: error: conditional \"QT4_INSTALL\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+$as_echo "$as_me: error: conditional \"QT4_INSTALL\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${QT3_INSTALL_TRUE}" && test -z "${QT3_INSTALL_FALSE}"; then
+ { { $as_echo "$as_me:$LINENO: error: conditional \"QT3_INSTALL\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+$as_echo "$as_me: error: conditional \"QT3_INSTALL\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${POLICYKIT_INSTALL_TRUE}" && test -z "${POLICYKIT_INSTALL_FALSE}"; then
+ { { $as_echo "$as_me:$LINENO: error: conditional \"POLICYKIT_INSTALL\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+$as_echo "$as_me: error: conditional \"POLICYKIT_INSTALL\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+: ${CONFIG_STATUS=./config.status}
+ac_write_fail=0
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ $as_echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5
+$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
+cat >$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+SHELL=\${CONFIG_SHELL-$SHELL}
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+## --------------------- ##
+## M4sh Initialization. ##
+## --------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else
+ case `(set -o) 2>/dev/null` in
+ *posix*) set -o posix ;;
+esac
+
+fi
+
+
+
+
+# PATH needs CR
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+if (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+ as_echo='printf %s\n'
+ as_echo_n='printf %s'
+else
+ if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+ as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+ as_echo_n='/usr/ucb/echo -n'
+ else
+ as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+ as_echo_n_body='eval
+ arg=$1;
+ case $arg in
+ *"$as_nl"*)
+ expr "X$arg" : "X\\(.*\\)$as_nl";
+ arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+ esac;
+ expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+ '
+ export as_echo_n_body
+ as_echo_n='sh -c $as_echo_n_body as_echo'
+ fi
+ export as_echo_body
+ as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ PATH_SEPARATOR=:
+ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+ (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+ PATH_SEPARATOR=';'
+ }
+fi
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+ as_unset=unset
+else
+ as_unset=false
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order. Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" "" $as_nl"
+
+# Find who we are. Look in the path if we contain no directory separator.
+case $0 in
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+IFS=$as_save_IFS
+
+ ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+ as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+ $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ { (exit 1); exit 1; }
+fi
+
+# Work around bugs in pre-3.0 UWIN ksh.
+for as_var in ENV MAIL MAILPATH
+do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+ test "X`expr 00001 : '.*\(...\)'`" = X001; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+
+# CDPATH.
+$as_unset CDPATH
+
+
+
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || {
+
+ # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+ # uniformly replaced by the line number. The first 'sed' inserts a
+ # line-number line after each line using $LINENO; the second 'sed'
+ # does the real work. The second script uses 'N' to pair each
+ # line-number line with the line containing $LINENO, and appends
+ # trailing '-' during substitution so that $LINENO is not a special
+ # case at line end.
+ # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+ # scripts with optimization help from Paolo Bonzini. Blame Lee
+ # E. McMahon (1931-1989) for sed's syntax. :-)
+ sed -n '
+ p
+ /[$]LINENO/=
+ ' <$as_myself |
+ sed '
+ s/[$]LINENO.*/&-/
+ t lineno
+ b
+ :lineno
+ N
+ :loop
+ s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+ t loop
+ s/-\n.*//
+ ' >$as_me.lineno &&
+ chmod +x "$as_me.lineno" ||
+ { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+ { (exit 1); exit 1; }; }
+
+ # Don't try to exec as it changes $[0], causing all sort of problems
+ # (the dirname of $[0] is not the place where we might find the
+ # original and so on. Autoconf is especially sensitive to this).
+ . "./$as_me.lineno"
+ # Exit status is that of the last command.
+ exit
+}
+
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+ as_dirname=dirname
+else
+ as_dirname=false
+fi
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in
+-n*)
+ case `echo 'x\c'` in
+ *c*) ECHO_T=' ';; # ECHO_T is single tab character.
+ *) ECHO_C='\c';;
+ esac;;
+*)
+ ECHO_N='-n';;
+esac
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+ test "X`expr 00001 : '.*\(...\)'`" = X001; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+ rm -f conf$$.dir/conf$$.file
+else
+ rm -f conf$$.dir
+ mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+ if ln -s conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s='ln -s'
+ # ... but there are two gotchas:
+ # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+ # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+ # In both cases, we have to default to `cp -p'.
+ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+ as_ln_s='cp -p'
+ elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+ else
+ as_ln_s='cp -p'
+ fi
+else
+ as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p=:
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+if test -x / >/dev/null 2>&1; then
+ as_test_x='test -x'
+else
+ if ls -dL / >/dev/null 2>&1; then
+ as_ls_L_option=L
+ else
+ as_ls_L_option=
+ fi
+ as_test_x='
+ eval sh -c '\''
+ if test -d "$1"; then
+ test -d "$1/.";
+ else
+ case $1 in
+ -*)set "./$1";;
+ esac;
+ case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in
+ ???[sx]*):;;*)false;;esac;fi
+ '\'' sh
+ '
+fi
+as_executable_p=$as_test_x
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+exec 6>&1
+
+# Save the log message, to keep $[0] and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.
+ac_log="
+This file was extended by HP Linux Imaging and Printing $as_me 3.12.4, which was
+generated by GNU Autoconf 2.63. Invocation command line was
+
+ CONFIG_FILES = $CONFIG_FILES
+ CONFIG_HEADERS = $CONFIG_HEADERS
+ CONFIG_LINKS = $CONFIG_LINKS
+ CONFIG_COMMANDS = $CONFIG_COMMANDS
+ $ $0 $@
+
+on `(hostname || uname -n) 2>/dev/null | sed 1q`
+"
+
+_ACEOF
+
+case $ac_config_files in *"
+"*) set x $ac_config_files; shift; ac_config_files=$*;;
+esac
+
+
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+# Files that config.status was made for.
+config_files="$ac_config_files"
+config_commands="$ac_config_commands"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ac_cs_usage="\
+\`$as_me' instantiates files from templates according to the
+current configuration.
+
+Usage: $0 [OPTION]... [FILE]...
+
+ -h, --help print this help, then exit
+ -V, --version print version number and configuration settings, then exit
+ -q, --quiet, --silent
+ do not print progress messages
+ -d, --debug don't remove temporary files
+ --recheck update $as_me by reconfiguring in the same conditions
+ --file=FILE[:TEMPLATE]
+ instantiate the configuration file FILE
+
+Configuration files:
+$config_files
+
+Configuration commands:
+$config_commands
+
+Report bugs to <bug-autoconf@gnu.org>."
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_cs_version="\\
+HP Linux Imaging and Printing config.status 3.12.4
+configured by $0, generated by GNU Autoconf 2.63,
+ with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"
+
+Copyright (C) 2008 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+
+ac_pwd='$ac_pwd'
+srcdir='$srcdir'
+INSTALL='$INSTALL'
+MKDIR_P='$MKDIR_P'
+AWK='$AWK'
+test -n "\$AWK" || AWK=awk
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# The default lists apply if the user does not specify any file.
+ac_need_defaults=:
+while test $# != 0
+do
+ case $1 in
+ --*=*)
+ ac_option=`expr "X$1" : 'X\([^=]*\)='`
+ ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
+ ac_shift=:
+ ;;
+ *)
+ ac_option=$1
+ ac_optarg=$2
+ ac_shift=shift
+ ;;
+ esac
+
+ case $ac_option in
+ # Handling of the options.
+ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+ ac_cs_recheck=: ;;
+ --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
+ $as_echo "$ac_cs_version"; exit ;;
+ --debug | --debu | --deb | --de | --d | -d )
+ debug=: ;;
+ --file | --fil | --fi | --f )
+ $ac_shift
+ case $ac_optarg in
+ *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ CONFIG_FILES="$CONFIG_FILES '$ac_optarg'"
+ ac_need_defaults=false;;
+ --he | --h | --help | --hel | -h )
+ $as_echo "$ac_cs_usage"; exit ;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil | --si | --s)
+ ac_cs_silent=: ;;
+
+ # This is an error.
+ -*) { $as_echo "$as_me: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&2
+ { (exit 1); exit 1; }; } ;;
+
+ *) ac_config_targets="$ac_config_targets $1"
+ ac_need_defaults=false ;;
+
+ esac
+ shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+ exec 6>/dev/null
+ ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+if \$ac_cs_recheck; then
+ set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+ shift
+ \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
+ CONFIG_SHELL='$SHELL'
+ export CONFIG_SHELL
+ exec "\$@"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+exec 5>>config.log
+{
+ echo
+ sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+ $as_echo "$ac_log"
+} >&5
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+#
+# INIT-COMMANDS
+#
+AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+
+# Handling of arguments.
+for ac_config_target in $ac_config_targets
+do
+ case $ac_config_target in
+ "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
+ "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+ "hplip.conf") CONFIG_FILES="$CONFIG_FILES hplip.conf" ;;
+ "hplip.desktop") CONFIG_FILES="$CONFIG_FILES hplip.desktop" ;;
+ "hplip-systray.desktop") CONFIG_FILES="$CONFIG_FILES hplip-systray.desktop" ;;
+ "prnt/drv/hpijs.drv") CONFIG_FILES="$CONFIG_FILES prnt/drv/hpijs.drv" ;;
+ "prnt/drv/hpcups.drv") CONFIG_FILES="$CONFIG_FILES prnt/drv/hpcups.drv" ;;
+ "hplip.list") CONFIG_FILES="$CONFIG_FILES hplip.list" ;;
+ "data/policykit/com.hp.hplip.service") CONFIG_FILES="$CONFIG_FILES data/policykit/com.hp.hplip.service" ;;
+
+ *) { { $as_echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
+$as_echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
+ { (exit 1); exit 1; }; };;
+ esac
+done
+
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used. Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+ test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+ test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
+fi
+
+# Have a temporary directory for convenience. Make it in the build tree
+# simply because there is no reason against having it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Hook for its removal unless debugging.
+# Note that there is a small window in which the directory will not be cleaned:
+# after its creation but before its name has been assigned to `$tmp'.
+$debug ||
+{
+ tmp=
+ trap 'exit_status=$?
+ { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status
+' 0
+ trap '{ (exit 1); exit 1; }' 1 2 13 15
+}
+# Create a (secure) tmp directory for tmp files.
+
+{
+ tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
+ test -n "$tmp" && test -d "$tmp"
+} ||
+{
+ tmp=./conf$$-$RANDOM
+ (umask 077 && mkdir "$tmp")
+} ||
+{
+ $as_echo "$as_me: cannot create a temporary directory in ." >&2
+ { (exit 1); exit 1; }
+}
+
+# Set up the scripts for CONFIG_FILES section.
+# No need to generate them if there are no CONFIG_FILES.
+# This happens for instance with `./config.status config.h'.
+if test -n "$CONFIG_FILES"; then
+
+
+ac_cr=' '
+ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
+if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
+ ac_cs_awk_cr='\\r'
+else
+ ac_cs_awk_cr=$ac_cr
+fi
+
+echo 'BEGIN {' >"$tmp/subs1.awk" &&
+_ACEOF
+
+
+{
+ echo "cat >conf$$subs.awk <<_ACEOF" &&
+ echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
+ echo "_ACEOF"
+} >conf$$subs.sh ||
+ { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
+$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;}
+ { (exit 1); exit 1; }; }
+ac_delim_num=`echo "$ac_subst_vars" | grep -c '$'`
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+ . ./conf$$subs.sh ||
+ { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
+$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;}
+ { (exit 1); exit 1; }; }
+
+ ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
+ if test $ac_delim_n = $ac_delim_num; then
+ break
+ elif $ac_last_try; then
+ { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
+$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;}
+ { (exit 1); exit 1; }; }
+ else
+ ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+ fi
+done
+rm -f conf$$subs.sh
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+cat >>"\$tmp/subs1.awk" <<\\_ACAWK &&
+_ACEOF
+sed -n '
+h
+s/^/S["/; s/!.*/"]=/
+p
+g
+s/^[^!]*!//
+:repl
+t repl
+s/'"$ac_delim"'$//
+t delim
+:nl
+h
+s/\(.\{148\}\).*/\1/
+t more1
+s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
+p
+n
+b repl
+:more1
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t nl
+:delim
+h
+s/\(.\{148\}\).*/\1/
+t more2
+s/["\\]/\\&/g; s/^/"/; s/$/"/
+p
+b
+:more2
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t delim
+' <conf$$subs.awk | sed '
+/^[^""]/{
+ N
+ s/\n//
+}
+' >>$CONFIG_STATUS || ac_write_fail=1
+rm -f conf$$subs.awk
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+_ACAWK
+cat >>"\$tmp/subs1.awk" <<_ACAWK &&
+ for (key in S) S_is_set[key] = 1
+ FS = ""
+
+}
+{
+ line = $ 0
+ nfields = split(line, field, "@")
+ substed = 0
+ len = length(field[1])
+ for (i = 2; i < nfields; i++) {
+ key = field[i]
+ keylen = length(key)
+ if (S_is_set[key]) {
+ value = S[key]
+ line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
+ len += length(value) + length(field[++i])
+ substed = 1
+ } else
+ len += 1 + keylen
+ }
+
+ print line
+}
+
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
+ sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
+else
+ cat
+fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \
+ || { { $as_echo "$as_me:$LINENO: error: could not setup config files machinery" >&5
+$as_echo "$as_me: error: could not setup config files machinery" >&2;}
+ { (exit 1); exit 1; }; }
+_ACEOF
+
+# VPATH may cause trouble with some makes, so we remove $(srcdir),
+# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+ ac_vpsub='/^[ ]*VPATH[ ]*=/{
+s/:*\$(srcdir):*/:/
+s/:*\${srcdir}:*/:/
+s/:*@srcdir@:*/:/
+s/^\([^=]*=[ ]*\):*/\1/
+s/:*$//
+s/^[^=]*=[ ]*$//
+}'
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+fi # test -n "$CONFIG_FILES"
+
+
+eval set X " :F $CONFIG_FILES :C $CONFIG_COMMANDS"
+shift
+for ac_tag
+do
+ case $ac_tag in
+ :[FHLC]) ac_mode=$ac_tag; continue;;
+ esac
+ case $ac_mode$ac_tag in
+ :[FHL]*:*);;
+ :L* | :C*:*) { { $as_echo "$as_me:$LINENO: error: invalid tag $ac_tag" >&5
+$as_echo "$as_me: error: invalid tag $ac_tag" >&2;}
+ { (exit 1); exit 1; }; };;
+ :[FH]-) ac_tag=-:-;;
+ :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
+ esac
+ ac_save_IFS=$IFS
+ IFS=:
+ set x $ac_tag
+ IFS=$ac_save_IFS
+ shift
+ ac_file=$1
+ shift
+
+ case $ac_mode in
+ :L) ac_source=$1;;
+ :[FH])
+ ac_file_inputs=
+ for ac_f
+ do
+ case $ac_f in
+ -) ac_f="$tmp/stdin";;
+ *) # Look for the file first in the build tree, then in the source tree
+ # (if the path is not absolute). The absolute path cannot be DOS-style,
+ # because $ac_f cannot contain `:'.
+ test -f "$ac_f" ||
+ case $ac_f in
+ [\\/$]*) false;;
+ *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
+ esac ||
+ { { $as_echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5
+$as_echo "$as_me: error: cannot find input file: $ac_f" >&2;}
+ { (exit 1); exit 1; }; };;
+ esac
+ case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
+ ac_file_inputs="$ac_file_inputs '$ac_f'"
+ done
+
+ # Let's still pretend it is `configure' which instantiates (i.e., don't
+ # use $as_me), people would be surprised to read:
+ # /* config.h. Generated by config.status. */
+ configure_input='Generated from '`
+ $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
+ `' by configure.'
+ if test x"$ac_file" != x-; then
+ configure_input="$ac_file. $configure_input"
+ { $as_echo "$as_me:$LINENO: creating $ac_file" >&5
+$as_echo "$as_me: creating $ac_file" >&6;}
+ fi
+ # Neutralize special characters interpreted by sed in replacement strings.
+ case $configure_input in #(
+ *\&* | *\|* | *\\* )
+ ac_sed_conf_input=`$as_echo "$configure_input" |
+ sed 's/[\\\\&|]/\\\\&/g'`;; #(
+ *) ac_sed_conf_input=$configure_input;;
+ esac
+
+ case $ac_tag in
+ *:-:* | *:-) cat >"$tmp/stdin" \
+ || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5
+$as_echo "$as_me: error: could not create $ac_file" >&2;}
+ { (exit 1); exit 1; }; } ;;
+ esac
+ ;;
+ esac
+
+ ac_dir=`$as_dirname -- "$ac_file" ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$ac_file" : 'X\(//\)[^/]' \| \
+ X"$ac_file" : 'X\(//\)$' \| \
+ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$ac_file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ { as_dir="$ac_dir"
+ case $as_dir in #(
+ -*) as_dir=./$as_dir;;
+ esac
+ test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || {
+ as_dirs=
+ while :; do
+ case $as_dir in #(
+ *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+ *) as_qdir=$as_dir;;
+ esac
+ as_dirs="'$as_qdir' $as_dirs"
+ as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ test -d "$as_dir" && break
+ done
+ test -z "$as_dirs" || eval "mkdir $as_dirs"
+ } || test -d "$as_dir" || { { $as_echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5
+$as_echo "$as_me: error: cannot create directory $as_dir" >&2;}
+ { (exit 1); exit 1; }; }; }
+ ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+ ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+ # A ".." for each directory in $ac_dir_suffix.
+ ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+ case $ac_top_builddir_sub in
+ "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+ *) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+ esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+ .) # We are building in place.
+ ac_srcdir=.
+ ac_top_srcdir=$ac_top_builddir_sub
+ ac_abs_top_srcdir=$ac_pwd ;;
+ [\\/]* | ?:[\\/]* ) # Absolute name.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir
+ ac_abs_top_srcdir=$srcdir ;;
+ *) # Relative name.
+ ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_build_prefix$srcdir
+ ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+
+ case $ac_mode in
+ :F)
+ #
+ # CONFIG_FILE
+ #
+
+ case $INSTALL in
+ [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+ *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
+ esac
+ ac_MKDIR_P=$MKDIR_P
+ case $MKDIR_P in
+ [\\/$]* | ?:[\\/]* ) ;;
+ */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;;
+ esac
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# If the template does not know about datarootdir, expand it.
+# FIXME: This hack should be removed a few years after 2.60.
+ac_datarootdir_hack=; ac_datarootdir_seen=
+
+ac_sed_dataroot='
+/datarootdir/ {
+ p
+ q
+}
+/@datadir@/p
+/@docdir@/p
+/@infodir@/p
+/@localedir@/p
+/@mandir@/p
+'
+case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
+*datarootdir*) ac_datarootdir_seen=yes;;
+*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
+ { $as_echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ ac_datarootdir_hack='
+ s&@datadir@&$datadir&g
+ s&@docdir@&$docdir&g
+ s&@infodir@&$infodir&g
+ s&@localedir@&$localedir&g
+ s&@mandir@&$mandir&g
+ s&\\\${datarootdir}&$datarootdir&g' ;;
+esac
+_ACEOF
+
+# Neutralize VPATH when `$srcdir' = `.'.
+# Shell code in configure.ac might set extrasub.
+# FIXME: do we really want to maintain this feature?
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_sed_extra="$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s|@configure_input@|$ac_sed_conf_input|;t t
+s&@top_builddir@&$ac_top_builddir_sub&;t t
+s&@top_build_prefix@&$ac_top_build_prefix&;t t
+s&@srcdir@&$ac_srcdir&;t t
+s&@abs_srcdir@&$ac_abs_srcdir&;t t
+s&@top_srcdir@&$ac_top_srcdir&;t t
+s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
+s&@builddir@&$ac_builddir&;t t
+s&@abs_builddir@&$ac_abs_builddir&;t t
+s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
+s&@INSTALL@&$ac_INSTALL&;t t
+s&@MKDIR_P@&$ac_MKDIR_P&;t t
+$ac_datarootdir_hack
+"
+eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \
+ || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5
+$as_echo "$as_me: error: could not create $ac_file" >&2;}
+ { (exit 1); exit 1; }; }
+
+test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
+ { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } &&
+ { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } &&
+ { $as_echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined. Please make sure it is defined." >&5
+$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined. Please make sure it is defined." >&2;}
+
+ rm -f "$tmp/stdin"
+ case $ac_file in
+ -) cat "$tmp/out" && rm -f "$tmp/out";;
+ *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";;
+ esac \
+ || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5
+$as_echo "$as_me: error: could not create $ac_file" >&2;}
+ { (exit 1); exit 1; }; }
+ ;;
+
+
+ :C) { $as_echo "$as_me:$LINENO: executing $ac_file commands" >&5
+$as_echo "$as_me: executing $ac_file commands" >&6;}
+ ;;
+ esac
+
+
+ case $ac_file$ac_mode in
+ "depfiles":C) test x"$AMDEP_TRUE" != x"" || {
+ # Autoconf 2.62 quotes --file arguments for eval, but not when files
+ # are listed without --file. Let's play safe and only enable the eval
+ # if we detect the quoting.
+ case $CONFIG_FILES in
+ *\'*) eval set x "$CONFIG_FILES" ;;
+ *) set x $CONFIG_FILES ;;
+ esac
+ shift
+ for mf
+ do
+ # Strip MF so we end up with the name of the file.
+ mf=`echo "$mf" | sed -e 's/:.*$//'`
+ # Check whether this is an Automake generated Makefile or not.
+ # We used to match only the files named `Makefile.in', but
+ # some people rename them; so instead we look at the file content.
+ # Grep'ing the first line is not enough: some people post-process
+ # each Makefile.in and add a new line on top of each file to say so.
+ # Grep'ing the whole file is not good either: AIX grep has a line
+ # limit of 2048, but all sed's we know have understand at least 4000.
+ if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
+ dirpart=`$as_dirname -- "$mf" ||
+$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$mf" : 'X\(//\)[^/]' \| \
+ X"$mf" : 'X\(//\)$' \| \
+ X"$mf" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$mf" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ else
+ continue
+ fi
+ # Extract the definition of DEPDIR, am__include, and am__quote
+ # from the Makefile without running `make'.
+ DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+ test -z "$DEPDIR" && continue
+ am__include=`sed -n 's/^am__include = //p' < "$mf"`
+ test -z "am__include" && continue
+ am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+ # When using ansi2knr, U may be empty or an underscore; expand it
+ U=`sed -n 's/^U = //p' < "$mf"`
+ # Find all dependency output files, they are included files with
+ # $(DEPDIR) in their names. We invoke sed twice because it is the
+ # simplest approach to changing $(DEPDIR) to its actual value in the
+ # expansion.
+ for file in `sed -n "
+ s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+ # Make sure the directory exists.
+ test -f "$dirpart/$file" && continue
+ fdir=`$as_dirname -- "$file" ||
+$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$file" : 'X\(//\)[^/]' \| \
+ X"$file" : 'X\(//\)$' \| \
+ X"$file" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ { as_dir=$dirpart/$fdir
+ case $as_dir in #(
+ -*) as_dir=./$as_dir;;
+ esac
+ test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || {
+ as_dirs=
+ while :; do
+ case $as_dir in #(
+ *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+ *) as_qdir=$as_dir;;
+ esac
+ as_dirs="'$as_qdir' $as_dirs"
+ as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ test -d "$as_dir" && break
+ done
+ test -z "$as_dirs" || eval "mkdir $as_dirs"
+ } || test -d "$as_dir" || { { $as_echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5
+$as_echo "$as_me: error: cannot create directory $as_dir" >&2;}
+ { (exit 1); exit 1; }; }; }
+ # echo "creating $dirpart/$file"
+ echo '# dummy' > "$dirpart/$file"
+ done
+ done
+}
+ ;;
+
+ esac
+done # for ac_tag
+
+
+{ (exit 0); exit 0; }
+_ACEOF
+chmod +x $CONFIG_STATUS
+ac_clean_files=$ac_clean_files_save
+
+test $ac_write_fail = 0 ||
+ { { $as_echo "$as_me:$LINENO: error: write failure creating $CONFIG_STATUS" >&5
+$as_echo "$as_me: error: write failure creating $CONFIG_STATUS" >&2;}
+ { (exit 1); exit 1; }; }
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded. So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status. When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+ ac_cs_success=:
+ ac_config_status_args=
+ test "$silent" = yes &&
+ ac_config_status_args="$ac_config_status_args --quiet"
+ exec 5>/dev/null
+ $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+ exec 5>>config.log
+ # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+ # would make configure fail if this is the last instruction.
+ $ac_cs_success || { (exit 1); exit 1; }
+fi
+if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
+ { $as_echo "$as_me:$LINENO: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
+$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
+fi
+
diff --git a/configure.in b/configure.in
new file mode 100755
index 0000000..d00af87
--- /dev/null
+++ b/configure.in
@@ -0,0 +1,620 @@
+#
+# configure.in - hplip autoconf input file
+#
+# (c) 2004-2007 Copyright Hewlett-Packard Development Company, LP
+#
+# exit status:
+# 0 = ok
+# 1 = error
+# 2 = no libusb
+# 3 = no cups-devel
+# 4 = no libnetsnmp
+# 5 = no netsnmp-devel
+# 6 = no python-devel
+# 7 = no pthread-devel
+# 8 = no ppdev-devel
+# 9 = no libcups
+# 10 = no libm
+# 11 = no libusb-devel
+# 12 = no sane-backends-devel
+# 13 = no libdbus-1 support
+# 14 = no dbus-devel support
+# 15 = fax requries dbus support
+#
+# 102 = no libjpeg
+# 103 = no jpeg-devel
+# 104 = no libdl
+
+#AC_PREREQ(2.59)
+AC_INIT([HP Linux Imaging and Printing], [3.12.4], [3.12.4], [hplip])
+#AM_INIT_AUTOMAKE([1.9 foreign])
+AM_INIT_AUTOMAKE
+AC_DISABLE_STATIC
+
+# Checks for programs.
+AC_PROG_CXX
+AC_PROG_CC
+AC_PROG_INSTALL
+AC_PROG_LIBTOOL
+
+# Checks for required libraries, don't set global -lpthread, -lm, -ljpeg, ... here, set in Makefile.
+AC_CHECK_LIB([pthread], [pthread_create], [LIBS="$LIBS"], [AC_MSG_ERROR([cannot find libpthread support], 7)])
+AC_CHECK_LIB([m], [pow], [LIBS="$LIBS"], [AC_MSG_ERROR([cannot find libm math support], 10)])
+AC_CHECK_LIB([jpeg], [jpeg_set_defaults],[LIBS="$LIBS"], [AC_MSG_ERROR(["cannot find libjpeg support"], 102)])
+AC_CHECK_LIB([dl], [dlopen], [LIBS="$LIBS" AC_DEFINE([HAVE_LIBDL])], [AC_MSG_ERROR(["cannot find libdl support"], 104)])
+
+# Checks for required header files.
+AC_CHECK_HEADERS(pthread.h,, [AC_MSG_ERROR([cannot find pthread-devel support], 7)])
+AC_CHECK_HEADERS(jpeglib.h,, [AC_MSG_ERROR([cannot find libjpeg-devel support], 103)])
+
+# Checks for typedefs, structures, and compiler characteristics.
+AC_C_BIGENDIAN(,[APDK_ENDIAN_FLAG="-DAPDK_LITTLE_ENDIAN"])
+
+# Autoconf-style header tests for APDK
+cat >prnt/hpijs/auto-include.h <<EOFH
+#ifdef HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+#ifdef HAVE_STDINT_H
+#include <stdint.h>
+#endif
+#ifdef HAVE_MACHINE_TYPES_H
+#include <machine/types.h>
+#endif
+EOFH
+AC_CHECK_TYPES([uint32_t], [APDK_AUTO_INCLUDE_FLAG="-DAPDK_AUTO_INCLUDE"],, [#include "prnt/hpijs/auto-include.h"])
+
+AC_MSG_CHECKING("for platform-dependencies")
+darwin_build="no"
+case "$host" in
+ *-darwin*)
+ AC_MSG_RESULT("using Mac OS X platform.h")
+ cat >prnt/hpijs/platform.h <<EOF
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/malloc.h>
+#include <memory.h>
+#include <string.h>
+#include <stdio.h>
+#include <math.h>
+EOF
+ darwin_build="yes"
+ ;;
+
+ *)
+ AC_MSG_RESULT("using Default platform.h")
+ cat >prnt/hpijs/platform.h <<EOF
+#include <stdlib.h>
+#include <memory.h>
+#include <string.h>
+#include <stdio.h>
+#include <math.h>
+EOF
+ ;;
+esac
+AM_CONDITIONAL(DARWIN_BUILD, test x$darwin_build = xyes)
+
+AC_MSG_CHECKING([for documentation build])
+AC_ARG_ENABLE(doc_build,
+ [ --enable-doc-build enable documentation build (default=yes)],
+ doc_build=$enableval, doc_build=yes)
+if test "$doc_build" = "yes"; then
+ AC_MSG_RESULT(yes)
+else
+ AC_MSG_RESULT(no)
+fi
+AM_CONDITIONAL(DOC_BUILD, test x$doc_build = xyes)
+
+AC_MSG_CHECKING([for hpijs only build])
+AC_ARG_ENABLE(hpijs_only_build,
+ [ --enable-hpijs-only-build enable hpijs only build (default=yes)],
+ hpijs_only_build=$enableval, hpijs_only_build=no)
+if test "$hpijs_only_build" = "yes"; then
+ AC_MSG_RESULT(yes)
+ epm_full=\#
+ epm_lite=\#
+ epm_hpcups_only=\#
+ epm_print_only_exclude=\#
+ epm_hpijs_only=
+else
+ AC_MSG_RESULT(no)
+ epm_hpijs_only=\#
+ AC_DEFINE(HAVE_LIBHPIP)
+fi
+AM_CONDITIONAL(HPIJS_ONLY_BUILD, test x$hpijs_only_build = xyes)
+
+AC_MSG_CHECKING([for lite build])
+AC_ARG_ENABLE(lite_build,
+ [ --enable-lite-build enable lite build, print & scan only (default=no)],
+ lite_build=$enableval, lite_build=no)
+if test "$lite_build" = "yes"; then
+ AC_MSG_RESULT(yes)
+ epm_full=\#
+ epm_hpcups_only=\#
+ epm_print_only_exclude=
+ epm_lite=
+else
+ AC_MSG_RESULT(no)
+fi
+AM_CONDITIONAL(LITE_BUILD, test x$lite_build = xyes)
+
+AC_MSG_CHECKING([for hpcups only build])
+AC_ARG_ENABLE(hpcups_only_build,
+ [ --enable-hpcups-only-build enable hpcups only build, print only (default=no)],
+ hpcups_only_build=$enableval, hpcups_only_build=no)
+if test "$hpcups_only_build" = "yes"; then
+ AC_MSG_RESULT(yes)
+ epm_full=\#
+ epm_lite=\#
+ epm_hpcups_only=
+ epm_print_only_exclude=\#
+else
+ AC_MSG_RESULT(no)
+fi
+AM_CONDITIONAL(HPCUPS_ONLY_BUILD, test x$hpcups_only_build = xyes)
+
+AM_CONDITIONAL(HPLIP_BUILD, test x$hpcups_only_build = xno && test x$hpijs_only_build = xno)
+if test "$hpijs_only_build" = "no" && test "$hpcups_only_build" = "no"; then
+ AC_DEFINE(HAVE_LIBHPIP)
+fi
+
+if test "$lite_build" = "no" && test "$hpcups_only_build" = "no" && test "$hpijs_only_build" = "no"; then
+ epm_full=
+ epm_lite=\#
+ epm_hpcups_only=\#
+ epm_print_only_exclude=
+fi
+AM_CONDITIONAL(FULL_BUILD, test x$hpcups_only_build = xno && test x$lite_build = xno && test x$hpijs_only_build = xno)
+
+AC_MSG_CHECKING([for hpijs install])
+AC_ARG_ENABLE(hpijs_install,
+ [ --enable-hpijs-install enable hpijs install (default=no)],
+ hpijs_install=$enableval, hpijs_install=no)
+if test "$hpijs_install" = "yes"; then
+ AC_MSG_RESULT(yes)
+ epm_hpijs_install=yes
+else
+ AC_MSG_RESULT(no)
+fi
+AM_CONDITIONAL(HPIJS_INSTALL, test x$hpijs_install = xyes)
+
+AC_MSG_CHECKING([for hpcups install])
+AC_ARG_ENABLE(hpcups_install,
+ [ --enable-hpcups-install enable hpcups install (default=yes)],
+ hpcups_install=$enableval, hpcups_install=yes)
+if test "$hpcups_install" = "yes" && test "$hpijs_only_build" = "no"; then
+ AC_MSG_RESULT(yes)
+ epm_hpcups_install=yes
+else
+ AC_MSG_RESULT(no)
+fi
+AM_CONDITIONAL(HPCUPS_INSTALL, test x$hpcups_install = xyes && test x$hpijs_only_build = xno)
+
+AC_MSG_CHECKING([for new hpcups install])
+AC_ARG_ENABLE(new_hpcups,
+ [ --enable-new-hpcups enable new hpcups install (default=no)],
+ new_hpcups=$enableval, new_hpcups=no)
+if test "$new_hpcups" = "yes"; then
+ AC_MSG_RESULT(yes)
+else
+ AC_MSG_RESULT(no)
+fi
+AM_CONDITIONAL(NEW_HPCUPS, test x$new_hpcups = xyes)
+
+AC_MSG_CHECKING([for network build])
+AC_ARG_ENABLE(network_build,
+ [ --enable-network-build enable network build (default=yes)],
+ network_build=$enableval, network_build=yes)
+if test "$network_build" = "yes"; then
+ AC_MSG_RESULT(yes)
+else
+ AC_MSG_RESULT(no)
+fi
+AM_CONDITIONAL(NETWORK_BUILD, test x$network_build = xyes)
+
+AC_MSG_CHECKING([for parallel port build])
+AC_ARG_ENABLE(pp_build,
+ [ --enable-pp-build enable parallel port build (default=no)],
+ pp_build=$enableval, pp_build=no)
+if test "$pp_build" = "yes"; then
+ AC_MSG_RESULT(yes)
+ AC_DEFINE(HAVE_PPORT)
+else
+ AC_MSG_RESULT(no)
+fi
+
+AC_MSG_CHECKING([for scanner build])
+AC_ARG_ENABLE(scan_build,
+ [ --enable-scan-build enable scanner build (default=yes)],
+ scan_build=$enableval, scan_build=yes)
+if test "$scan_build" = "yes"; then
+ AC_MSG_RESULT(yes)
+ epm_scan=
+else
+ AC_MSG_RESULT(no)
+ epm_scan=\#
+fi
+AM_CONDITIONAL(SCAN_BUILD, test x$scan_build = xyes)
+
+AC_MSG_CHECKING([for gui build])
+AC_ARG_ENABLE(gui_build,
+ [ --enable-gui-build enable gui build (default=yes)],
+ gui_build=$enableval, gui_build=yes)
+if test "$gui_build" = "yes"; then
+ AC_MSG_RESULT(yes)
+else
+ AC_MSG_RESULT(no)
+fi
+AM_CONDITIONAL(GUI_BUILD, test x$gui_build = xyes)
+
+AC_MSG_CHECKING([for fax build])
+AC_ARG_ENABLE(fax_build,
+ [ --enable-fax-build enable fax build (default=yes)],
+ fax_build=$enableval, fax_build=yes)
+if test "$fax_build" = "yes"; then
+ AC_MSG_RESULT(yes)
+else
+ AC_MSG_RESULT(no)
+fi
+AM_CONDITIONAL(FAX_BUILD, test x$fax_build = xyes)
+
+AC_MSG_CHECKING([for dbus build])
+AC_ARG_ENABLE(dbus_build,
+ [ --enable-dbus-build enable dbus build (default=yes)],
+ dbus_build=$enableval, dbus_build=yes)
+if test "$dbus_build" = "yes"; then
+ AC_MSG_RESULT(yes)
+else
+ AC_MSG_RESULT(no)
+fi
+
+AC_MSG_CHECKING([for cups 1.1.x build])
+AC_ARG_ENABLE(cups11_build,
+ [ --enable-cups11-build enable cups 1.1.x build (default=no)],
+ cups11_build=$enableval, cups11_build=no)
+if test "$cups11_build" = "yes"; then
+ AC_MSG_RESULT(yes)
+ AC_DEFINE(HAVE_CUPS11)
+else
+ AC_MSG_RESULT(no)
+fi
+
+AC_MSG_CHECKING([for udev acl rules])
+AC_ARG_ENABLE(udev_acl_rules,
+ [ --enable-udev-acl-rules enable udev acl rules (default=no)],
+ udev_acl_rules=$enableval, udev_acl_rules=no)
+if test "$udev_acl_rules" = "yes"; then
+ AC_MSG_RESULT(yes)
+else
+ AC_MSG_RESULT(no)
+fi
+AM_CONDITIONAL(UDEV_ACL_RULES, test x$udev_acl_rules = xyes)
+
+AC_MSG_CHECKING([for shadow build])
+AC_ARG_ENABLE(shadow_build,
+ [ --enable-shadow-build enable shadow build (default=no)],
+ shadow_build=$enableval, shadow_build=no)
+if test "$shadow_build" = "yes"; then
+ AC_MSG_RESULT(yes)
+else
+ AC_MSG_RESULT(no)
+fi
+AM_CONDITIONAL(SHADOW_BUILD, test x$shadow_build = xyes)
+
+AC_ARG_WITH(cupsbackenddir, AC_HELP_STRING([--with-cupsbackenddir=DIR], [set cups backend install directory [default=/usr/lib/cups/backend]]),
+ cupsbackenddir=$withval, cupsbackenddir="/usr/lib/cups/backend")
+
+AC_ARG_WITH(cupsfilterdir, AC_HELP_STRING([--with-cupsfilterdir=DIR], [set cups filter install directory [default=/usr/lib/cups/filter]]),
+ cupsfilterdir=$withval, cupsfilterdir="/usr/lib/cups/filter")
+
+AC_ARG_WITH(icondir, AC_HELP_STRING([--with-icondir=DIR], [set hplip.desktop install directory [default=/usr/share/applications]]),
+ icondir=$withval, icondir="/usr/share/applications")
+
+AC_ARG_WITH(systraydir, AC_HELP_STRING([--with-systraydir=DIR], [set hplip-systray.desktop install directory [default=/etc/xdg/autostart]]),
+ systraydir=$withval, systraydir="/etc/xdg/autostart")
+
+AC_ARG_WITH(hpppddir, AC_HELP_STRING([--with-hpppddir=DIR], [set hp ppd install directory [default=datadir/ppd/HP]]),
+ hpppddir=$withval, hpppddir="$datadir/ppd/HP")
+
+if test -f "/usr/share/cups/mime/mime.types"; then
+ abs_mimedir="/usr/share/cups/mime/"
+else
+ abs_mimedir="/etc/cups/"
+fi
+AC_ARG_WITH(mimedir, AC_HELP_STRING([--with-mimedir=DIR], [set cups mime.types location [default=abs_mimedir]]),
+ mimedir=$withval, mimedir="$abs_mimedir")
+
+AC_ARG_WITH(docdir, AC_HELP_STRING([--with-docdir=DIR], [set hplip documentation directory [default=datadir/doc]]),
+ hpdocdir=$withval, hpdocdir="$datadir/doc/hplip-$VERSION")
+
+AC_MSG_CHECKING([for foomatic ppd install])
+AC_ARG_ENABLE(foomatic_ppd_install,
+ [ --enable-foomatic-ppd-install enable foomatic static ppd install (default=no), uses hpppddir],
+ foomatic_ppd_install=$enableval, foomatic_ppd_install=no)
+if test $foomatic_ppd_install = yes; then
+ AC_MSG_RESULT(yes)
+ epm_foomatic_ppd_install=yes
+else
+ AC_MSG_RESULT(no)
+fi
+AM_CONDITIONAL(FOOMATIC_PPD_INSTALL, test x$foomatic_ppd_install = xyes)
+
+AC_ARG_WITH(drvdir, AC_HELP_STRING([--with-drvdir=DIR], [set cups drv install directory [default=datadir/cups/drv/hp]]),
+ drvdir=$withval, drvdir="$datadir/cups/drv/hp")
+
+AC_MSG_CHECKING([for foomatic drv install])
+AC_ARG_ENABLE(foomatic_drv_install,
+ [ --enable-foomatic-drv-install enable foomatic dynamic ppd install (default=no), uses drvdir and hpppddir],
+ foomatic_drv_install=$enableval, foomatic_drv_install=no)
+if test $foomatic_drv_install = yes; then
+ AC_MSG_RESULT(yes)
+ epm_foomatic_drv_install=yes
+else
+ AC_MSG_RESULT(no)
+fi
+AM_CONDITIONAL(FOOMATIC_DRV_INSTALL, test x$foomatic_drv_install = xyes)
+
+AC_MSG_CHECKING([for cups drv install])
+AC_ARG_ENABLE(cups_drv_install,
+ [ --enable-cups-drv-install enable cups dynamic ppd install (default=yes), uses drvdir and hpppddir],
+ cups_drv_install=$enableval, cups_drv_install=yes)
+if test $cups_drv_install = yes && test $hpijs_only_build = no; then
+ AC_MSG_RESULT(yes)
+ epm_cups_drv_install=yes
+else
+ AC_MSG_RESULT(no)
+fi
+AM_CONDITIONAL(CUPS_DRV_INSTALL, test x$cups_drv_install = xyes && test x$hpijs_only_build = xno)
+
+AC_MSG_CHECKING([for cups ppd install])
+AC_ARG_ENABLE(cups_ppd_install,
+ [ --enable-cups-ppd-install enable cups static ppd install (default=no), uses hpppddir],
+ cups_ppd_install=$enableval, cups_ppd_install=no)
+if test $cups_ppd_install = yes && test $hpijs_only_build = no; then
+ AC_MSG_RESULT(yes)
+ epm_cups_ppd_install=yes
+else
+ AC_MSG_RESULT(no)
+fi
+AM_CONDITIONAL(CUPS_PPD_INSTALL, test x$cups_ppd_install = xyes && test x$hpijs_only_build = xno)
+
+AC_MSG_CHECKING([for foomatic-rip-hplip install])
+AC_ARG_ENABLE(foomatic_rip_hplip_install,
+ [ --enable-foomatic-rip-hplip-install enable foomatic-rip-hplip install (default=no), uses cupsfilterdir],
+ foomatic_rip_hplip_install=$enableval, foomatic_rip_hplip_install=no)
+if test "$foomatic_rip_hplip_install" = "yes"; then
+ AC_MSG_RESULT(yes)
+ foomatic_filter="foomatic-rip-hplip"
+ epm_foomatic_rip_hplip_install=yes
+else
+ AC_MSG_RESULT(no)
+ foomatic_filter="foomatic-rip"
+fi
+AM_CONDITIONAL(RIP_INSTALL, test x$foomatic_rip_hplip_install = xyes)
+
+AC_MSG_CHECKING([for qt4])
+AC_ARG_ENABLE(qt4,
+ [ --enable-qt4 enable qt4 (default=yes)],
+ qt4=$enableval, qt4=yes)
+if test "$qt4" = "yes"; then
+ AC_MSG_RESULT(yes)
+else
+ AC_MSG_RESULT(no)
+fi
+AM_CONDITIONAL(QT4_INSTALL, test x$qt4 = xyes)
+
+AC_MSG_CHECKING([for qt3])
+AC_ARG_ENABLE(qt3,
+ [ --enable-qt3 enable qt3 (default=no)],
+ qt3=$enableval, qt3=no)
+if test "$qt3" = "yes"; then
+ AC_MSG_RESULT(yes)
+else
+ AC_MSG_RESULT(no)
+fi
+AM_CONDITIONAL(QT3_INSTALL, test x$qt3 = xyes)
+
+if test "$gui_build" = "no"; then
+ qt3=no
+ qt4=no
+fi
+
+epm_qt3=\#
+epm_qt4=\#
+if test "$hpcups_only_build" = "no" && test "$hpijs_only_build" = "no"; then
+if test "$qt3" = "yes" && test "$qt4" = "no"; then
+ ui_toolkit=qt3
+ epm_qt3=
+elif test "$qt4" = "yes"; then
+ ui_toolkit=qt4
+ epm_qt4=
+else
+ ui_toolkit=no
+fi
+fi
+
+AC_MSG_CHECKING([for policykit])
+AC_ARG_ENABLE(policykit,
+ [ --enable-policykit enable PolicyKit (default=no)],
+ policykit=$enableval, policykit=no)
+if test "$policykit" = "yes"; then
+ AC_MSG_RESULT(yes)
+else
+ AC_MSG_RESULT(no)
+fi
+AM_CONDITIONAL(POLICYKIT_INSTALL, test x$policykit = xyes)
+
+# Determine where the PolicyKit policy file goes
+if test "$policykit" = "yes"; then
+ if test -d /usr/share/polkit-1; then
+ policykit_dir=/usr/share/polkit-1/actions
+ elif test -d /usr/share/PolicyKit; then
+ policykit_dir=/usr/share/PolicyKit/policy
+ else
+ policykit_dir=/usr/share/PolicyKit/policy
+ fi
+else
+ policykit_dir=
+fi
+
+AC_MSG_CHECKING(for host machine platform)
+machine=`uname -m`
+if test "$machine" = "x86_32" || test "$machine" = "i686"; then
+ platform="x86_32"
+elif test "$machine" = "x86_64"; then
+ platform="x86_64"
+elif test "$machine" = "ppc"; then
+ platform="ppc"
+else
+ platform="unsupport"
+fi
+AC_MSG_RESULT($platform)
+
+# Check conditional packages.
+
+if test "$hpijs_only_build" = "no" && test "$network_build" = "yes"; then
+# AC_CHECK_LIB([crypto], [CRYPTO_free], [LIBS="$LIBS"], [AC_MSG_ERROR([cannot find net-snmp support (or --disable-network-build)], 4)])
+# AC_CHECK_LIB([netsnmp], [snmp_timeout], [LIBS="$LIBS" AC_DEFINE([HAVE_LIBNETSNMP])], [AC_MSG_ERROR([cannot find net-snmp support (or --disable-network-build)], 4)])
+# AC_CHECK_HEADERS(net-snmp/net-snmp-config.h,, [AC_MSG_ERROR([cannot find net-snmp-devel support (or --disable-network-build)], 5)])
+
+ old_LIBS="$LIBS"
+ AC_CHECK_LIB([crypto], [CRYPTO_free],, [AC_MSG_ERROR([cannot find net-snmp support (or --disable-network-build)], 4)])
+ AC_CHECK_LIB([netsnmp], [snmp_timeout], [LIBS="$old_LIBS" AC_DEFINE([HAVE_LIBNETSNMP]) SNMPLIB="netsnmp"], check_ucd=yes)
+if test "$check_ucd" = "yes"; then
+ AC_CHECK_LIB([snmp], [snmp_timeout], [LIBS="$old_LIBS" AC_DEFINE([HAVE_LIBNETSNMP]) AC_DEFINE([HAVE_UCDSNMP]) SNMPLIB="snmp"],
+ [AC_MSG_ERROR([cannot find net/ucd-snmp support (or --disable-network-build)], 4)])
+ AC_CHECK_HEADERS(ucd-snmp/ucd-snmp-config.h,, [AC_MSG_ERROR([cannot find ucd-snmp-devel support (or --disable-network-build)], 5)])
+else
+ AC_CHECK_HEADERS(net-snmp/net-snmp-config.h,, [AC_MSG_ERROR([cannot find net-snmp-devel support (or --disable-network-build)], 5)])
+fi
+fi
+
+if test "$hpijs_only_build" = "no" && test "$pp_build" = "yes"; then
+ AC_CHECK_HEADERS(linux/ppdev.h, ,[AC_MSG_ERROR([cannot find ppdev-devel support (or --disable-pp-build)], 8)])
+fi
+
+if test "$hpijs_only_build" = "no"; then
+ AC_CHECK_LIB([cups], [cupsDoFileRequest], [LIBS="$LIBS"], [AC_MSG_ERROR([cannot find libcups support], 9)])
+ AC_CHECK_HEADERS(cups/cups.h, ,[AC_MSG_ERROR([cannot find cups-devel support], 3)])
+ AC_CHECK_LIB([usb], [usb_init], [LIBS="$LIBS"], [AC_MSG_ERROR([cannot find libusb support], 2)])
+ AC_CHECK_HEADERS(usb.h, ,[AC_MSG_ERROR([cannot find libusb-devel support], 11)])
+fi
+
+if test "$hpijs_only_build" = "no" && test "$lite_build" = "no" && test "$hpcups_only_build" = "no"; then
+ AC_ARG_VAR([PYTHON], [Python interpreter/compiler command])
+ AM_PATH_PYTHON([2.2])
+ AC_MSG_CHECKING([for path to Python.h])
+ PYTHONINCLUDEDIR=`$PYTHON -c "from distutils.sysconfig import get_python_inc; print get_python_inc();"`
+ AC_MSG_RESULT("using $PYTHONINCLUDEDIR")
+ AC_ARG_VAR(PYTHONINCLUDEDIR, [path to Python.h C header file])
+ AC_CHECK_HEADERS(python$PYTHON_VERSION/Python.h, ,[AC_MSG_ERROR([cannot find python-devel support], 6)])
+fi
+
+if test "$hpijs_only_build" = "no" && test "$scan_build" = "yes" && test "$hpcups_only_build" = "no"; then
+ AC_CHECK_LIB([sane], [sane_open], [LIBS="$LIBS"], [AC_MSG_ERROR([cannot find sane-backends-devel support (or --disable-scan-build)], 12)])
+fi
+
+# The PKG_CHECK_MODULES macro requires the pkgconfig package (pkg-config). Otherwise you get a strange shell script error
+# "syntax error near upexpected token: DBUS".
+if test "$hpijs_only_build" = "no" && test "$lite_build" = "no" && test "$hpcups_only_build" = "no" && test "$dbus_build" = "yes"; then
+# PKG_CHECK_MODULES(DBUS, [dbus-1 >= 1.0.0, dbus-glib-1 >= 0.61],,[AC_MSG_ERROR([cannot find dbus-devel support: $DBUS_PKG_ERRORS], 14)])
+ PKG_CHECK_MODULES([DBUS], [dbus-1 >= 1.0.0],,[AC_MSG_ERROR([cannot find dbus-devel support: $DBUS_PKG_ERRORS], 14)])
+ AC_CHECK_LIB([dbus-1], [dbus_connection_open], [LIBS="$LIBS" AC_DEFINE([HAVE_DBUS])], [AC_MSG_ERROR([cannot find libdbus support], 13)])
+fi
+
+if test "$hpijs_only_build" = "no" && test "$lite_build" = "no" && test "$hpcups_only_build" = "no" && test "$fax_build" = "yes" && test "$dbus_build" = "no"; then
+ AC_MSG_ERROR([fax requires dbus support], 15)
+fi
+
+# AC_DEFINE_DIR([DATADIR], [datadir])
+# Copyright © 2006 Stepan Kasal <kasal@ucw.cz>
+# Copyright © 2006 Andreas Schwab <schwab@suse.de>
+# Copyright © 2006 Guido U. Draheim <guidod@gmx.de>
+# Copyright © 2006 Alexandre Oliva
+# Copying and distribution of this file, with or without modification, are permitted in any medium without
+# royalty provided the copyright notice and this notice are preserved.
+AC_DEFUN([AC_DEFINE_DIR], [
+ prefix_NONE=
+ exec_prefix_NONE=
+ test "x$prefix" = xNONE && prefix_NONE=yes && prefix=$ac_default_prefix
+ test "x$exec_prefix" = xNONE && exec_prefix_NONE=yes && exec_prefix=$prefix
+dnl In Autoconf 2.60, ${datadir} refers to ${datarootdir}, which in turn
+dnl refers to ${prefix}. Thus we have to use `eval' twice.
+ eval ac_define_dir="\"[$]$2\""
+ eval ac_define_dir="\"$ac_define_dir\""
+ $1="$ac_define_dir"
+ test "$prefix_NONE" && prefix=NONE
+ test "$exec_prefix_NONE" && exec_prefix=NONE
+])
+
+AC_DEFINE_DIR([abs_datadir], [datadir])
+AC_DEFINE_DIR([abs_sbindir], [sbindir])
+AC_DEFINE_DIR([abs_hpppddir], [hpppddir])
+AC_DEFINE_DIR([abs_docdir], [hpdocdir])
+abs_ppddir=${abs_hpppddir%/*}
+AC_DEFINE_DIR([abs_drvdir], [drvdir])
+
+AC_SUBST(abs_datadir)
+AC_SUBST(abs_sbindir)
+AC_SUBST(abs_hpppddir)
+AC_SUBST(abs_docdir)
+AC_SUBST(abs_ppddir)
+AC_SUBST(abs_drvdir)
+AC_SUBST(abs_mimedir)
+AC_SUBST(mimedir)
+AC_SUBST(icondir)
+AC_SUBST(systraydir)
+AC_SUBST(cupsbackenddir)
+AC_SUBST(cupsfilterdir)
+AC_SUBST(hpppddir)
+AC_SUBST(hpdocdir)
+AC_SUBST(drvdir)
+AC_SUBST(network_build)
+AC_SUBST(pp_build)
+AC_SUBST(gui_build)
+AC_SUBST(scan_build)
+AC_SUBST(fax_build)
+AC_SUBST(dbus_build)
+AC_SUBST(cups11_build)
+AC_SUBST(foomatic_drv_install)
+AC_SUBST(foomatic_ppd_install)
+AC_SUBST(foomatic_rip_hplip_install)
+AC_SUBST(foomatic_filter)
+AC_SUBST(cups_ppd_install)
+AC_SUBST(cups_drv_install)
+AC_SUBST(hpijs_install)
+AC_SUBST(hpcups_install)
+AC_SUBST(doc_build)
+AC_SUBST(shadow_build)
+AC_SUBST(APDK_ENDIAN_FLAG)
+AC_SUBST(APDK_AUTO_INCLUDE_FLAG)
+AC_SUBST(ui_toolkit)
+AC_SUBST(platform)
+AC_SUBST(qt3)
+AC_SUBST(qt4)
+AC_SUBST(epm_foomatic_rip_hplip_install)
+AC_SUBST(epm_foomatic_ppd_install)
+AC_SUBST(epm_cups_ppd_install)
+AC_SUBST(epm_foomatic_drv_install)
+AC_SUBST(epm_cups_drv_install)
+AC_SUBST(epm_hpijs_install)
+AC_SUBST(epm_hpcups_install)
+AC_SUBST(epm_qt4)
+AC_SUBST(epm_qt3)
+AC_SUBST(epm_full)
+AC_SUBST(epm_lite)
+AC_SUBST(epm_hpcups_only)
+AC_SUBST(epm_hpijs_only)
+AC_SUBST(epm_print_only_exclude)
+AC_SUBST(epm_scan)
+AC_SUBST(policykit)
+AC_SUBST(policykit_dir)
+AC_SUBST(hpijs_only_build)
+AC_SUBST(lite_build)
+AC_SUBST(hpcups_only_build)
+AC_SUBST(SNMPLIB)
+AC_SUBST(prefix)
+AC_SUBST(udev_acl_rules)
+
+AC_CONFIG_FILES(Makefile hplip.conf hplip.desktop hplip-systray.desktop prnt/drv/hpijs.drv prnt/drv/hpcups.drv hplip.list data/policykit/com.hp.hplip.service)
+AC_OUTPUT
diff --git a/copier/__init__.py b/copier/__init__.py
new file mode 100644
index 0000000..41cd78c
--- /dev/null
+++ b/copier/__init__.py
@@ -0,0 +1,19 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2007 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+
diff --git a/copier/copier.py b/copier/copier.py
new file mode 100644
index 0000000..83f6c09
--- /dev/null
+++ b/copier/copier.py
@@ -0,0 +1,381 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2007 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+from __future__ import generators
+
+# Std Lib
+import sys
+import os
+import os.path
+import time
+import threading
+import Queue
+from cStringIO import StringIO
+
+# Local
+from base.g import *
+from base.codes import *
+from base import device, utils, status, pml
+
+# Event queue values (UI ==> Copy thread)
+COPY_CANCELED = 1
+
+# Update queue values (Copy thread ==> UI)
+STATUS_IDLE = 0
+STATUS_SETTING_UP = 1
+STATUS_WARMING_UP = 2
+STATUS_ACTIVE = 3
+STATUS_DONE = 4
+STATUS_ERROR = 5
+
+
+# PML Copier Only
+class PMLCopyDevice(device.Device):
+ def __init__(self, device_uri=None, printer_name=None,
+ service=None, callback=None):
+
+ device.Device.__init__(self, device_uri, printer_name,
+ service, callback)
+
+ self.copy_thread = None
+
+ def copy(self, num_copies=1, contrast=0, reduction=100,
+ quality=pml.COPIER_QUALITY_NORMAL,
+ fit_to_page=pml.COPIER_FIT_TO_PAGE_ENABLED,
+ scan_src=SCAN_SRC_FLATBED,
+ update_queue=None, event_queue=None):
+
+ if not self.isCopyActive():
+ self.copy_thread = PMLCopyThread(self, num_copies, contrast, reduction, quality,
+ fit_to_page, scan_src, update_queue, event_queue)
+ self.copy_thread.start()
+ return True
+ else:
+ return False
+
+ def isCopyActive(self):
+ if self.copy_thread is not None:
+ return self.copy_thread.isAlive()
+ else:
+ return False
+
+ def waitForCopyThread(self):
+ if self.copy_thread is not None and \
+ self.copy_thread.isAlive():
+
+ self.copy_thread.join()
+
+
+
+class PMLCopyThread(threading.Thread):
+ def __init__(self, dev, num_copies, contrast, reduction, quality,
+ fit_to_page, scan_src,
+ update_queue=None, event_queue=None):
+
+ threading.Thread.__init__(self)
+ self.dev = dev
+ self.num_copies = num_copies
+ self.contrast = contrast
+ self.reduction = reduction
+ self.quality = quality
+ self.fit_to_page = fit_to_page
+ self.scan_src = scan_src
+ self.event_queue = event_queue
+ self.update_queue = update_queue
+ self.prev_update = ''
+ self.copy_type = self.dev.copy_type
+ log.debug("Copy-type = %d" % self.copy_type)
+
+ def run(self):
+ STATE_DONE = 0
+ STATE_ERROR = 5
+ STATE_ABORTED = 10
+ STATE_SUCCESS = 20
+ STATE_BUSY = 25
+ STATE_SET_TOKEN = 30
+ STATE_SETUP_STATE = 40
+ STATE_SETUP_PARAMS = 50
+ STATE_START = 60
+ STATE_ACTIVE = 70
+ STATE_RESET_TOKEN = 80
+
+# state = STATE_SET_TOKEN
+ state = STATE_SETUP_STATE
+
+ while state != STATE_DONE: # ------------------------- Copier Thread
+ # revisit - Checking cancel and setting state here means
+ # every state can unconditionally transition to STATE_ABORTED.
+ # This has not been verified.
+ # if self.check_for_cancel():
+ # state = STATE_ABORTED
+
+ if state == STATE_ABORTED:
+ log.debug("%s State: Aborted" % ("*"*20))
+ self.write_queue(STATUS_DONE) # This was STATUS_ERROR.
+ state = STATE_RESET_TOKEN
+
+ if state == STATE_ERROR:
+ log.debug("%s State: Error" % ("*"*20))
+ self.write_queue(STATUS_ERROR)
+ state = STATE_RESET_TOKEN
+
+ elif state == STATE_SUCCESS:
+ log.debug("%s State: Success" % ("*"*20))
+ self.write_queue(STATUS_DONE)
+ state = STATE_RESET_TOKEN
+
+ elif state == STATE_BUSY:
+ log.debug("%s State: Busy" % ("*"*20))
+ self.write_queue(STATUS_ERROR)
+ state = STATE_RESET_TOKEN
+
+ elif state == STATE_SET_TOKEN:
+ log.debug("%s State: Acquire copy token" % ("*"*20))
+
+ self.write_queue(STATUS_SETTING_UP)
+
+ try:
+ result_code, token = self.dev.getPML(pml.OID_COPIER_TOKEN)
+ except Error:
+ log.debug("Unable to acquire copy token (1).")
+ state = STATE_SETUP_STATE
+ else:
+ if result_code > pml.ERROR_MAX_OK:
+ state = STATE_SETUP_STATE
+ log.debug("Skipping token acquisition.")
+ else:
+ token = time.strftime("%d%m%Y%H:%M:%S", time.gmtime())
+ log.debug("Setting token: %s" % token)
+ try:
+ self.dev.setPML(pml.OID_COPIER_TOKEN, token)
+ except Error:
+ log.error("Unable to acquire copy token (2).")
+ state = STATUS_ERROR
+ else:
+ result_code, check_token = self.dev.getPML(pml.OID_COPIER_TOKEN)
+
+ if check_token == token:
+ state = STATE_SETUP_STATE
+ else:
+ log.error("Unable to acquire copy token (3).")
+ state = STATE_ERROR
+
+ elif state == STATE_SETUP_STATE:
+ log.debug("%s State: Setup state" % ("*"*20))
+
+ if self.copy_type == COPY_TYPE_DEVICE:
+ result_code, copy_state = self.dev.getPML(pml.OID_COPIER_JOB)
+
+ if copy_state == pml.COPIER_JOB_IDLE:
+ self.dev.setPML(pml.OID_COPIER_JOB, pml.COPIER_JOB_SETUP)
+ state = STATE_SETUP_PARAMS
+
+ else:
+ state = STATE_BUSY
+
+ elif self.copy_type == COPY_TYPE_AIO_DEVICE:
+ result_code, copy_state = self.dev.getPML(pml.OID_SCAN_TO_PRINTER)
+
+ if copy_state == pml.SCAN_TO_PRINTER_IDLE:
+ state = STATE_SETUP_PARAMS
+
+ else:
+ state = STATE_BUSY
+
+
+
+ elif state == STATE_SETUP_PARAMS:
+ log.debug("%s State: Setup Params" % ("*"*20))
+
+ if self.num_copies < 0: self.num_copies = 1
+ if self.num_copies > 99: self.num_copies = 99
+
+ if self.copy_type == COPY_TYPE_DEVICE: # MFP
+
+ # num_copies
+ self.dev.setPML(pml.OID_COPIER_JOB_NUM_COPIES, self.num_copies)
+
+ # contrast
+ self.dev.setPML(pml.OID_COPIER_JOB_CONTRAST, self.contrast)
+
+ # reduction
+ self.dev.setPML(pml.OID_COPIER_JOB_REDUCTION, self.reduction)
+
+ # quality
+ self.dev.setPML(pml.OID_COPIER_JOB_QUALITY, self.quality)
+
+ # fit_to_page
+ if self.scan_src == SCAN_SRC_FLATBED:
+ self.dev.setPML(pml.OID_COPIER_JOB_FIT_TO_PAGE, self.fit_to_page)
+
+ else: # AiO
+ # num_copies
+ self.dev.setPML(pml.OID_COPIER_NUM_COPIES_AIO, self.num_copies)
+
+ # contrast
+ self.contrast = (self.contrast * 10 / 25) + 50
+ self.dev.setPML(pml.OID_COPIER_CONTRAST_AIO, self.contrast)
+
+ if self.fit_to_page == pml.COPIER_FIT_TO_PAGE_ENABLED:
+ self.reduction = 0
+
+ # reduction
+ self.dev.setPML(pml.OID_COPIER_REDUCTION_AIO, self.reduction)
+
+ # quality
+ self.dev.setPML(pml.OID_COPIER_QUALITY_AIO, self.quality)
+
+ self.dev.setPML(pml.OID_PIXEL_DATA_TYPE, pml.PIXEL_DATA_TYPE_COLOR_24_BIT)
+ self.dev.setPML(pml.OID_COPIER_SPECIAL_FEATURES, pml.COPY_FEATURE_NONE)
+ self.dev.setPML(pml.OID_COPIER_PHOTO_MODE, pml.ENHANCE_LIGHT_COLORS | pml.ENHANCE_TEXT)
+
+ # tray select
+ self.dev.setPML(pml.OID_COPIER_JOB_INPUT_TRAY_SELECT, pml.COPIER_JOB_INPUT_TRAY_1)
+
+ # media type
+ self.dev.setPML(pml.OID_COPIER_MEDIA_TYPE, pml.COPIER_MEDIA_TYPE_AUTOMATIC)
+
+ # pixel data type
+ self.dev.setPML(pml.OID_PIXEL_DATA_TYPE, pml.PIXEL_DATA_TYPE_COLOR_24_BIT)
+
+ # special features
+ self.dev.setPML(pml.OID_COPIER_SPECIAL_FEATURES, pml.COPY_FEATURE_NONE)
+
+ # media size
+ self.dev.setPML(pml.OID_COPIER_JOB_MEDIA_SIZE, pml.COPIER_JOB_MEDIA_SIZE_US_LETTER)
+
+
+
+
+ log.debug("num_copies = %d" % self.num_copies)
+ log.debug("contrast= %d" % self.contrast)
+ log.debug("reduction = %d" % self.reduction)
+ log.debug("quality = %d" % self.quality)
+ log.debug("fit_to_page = %d" % self.fit_to_page)
+
+ state = STATE_START
+
+ elif state == STATE_START:
+ log.debug("%s State: Start" % ("*"*20))
+
+ if self.copy_type == COPY_TYPE_DEVICE:
+ self.dev.setPML(pml.OID_COPIER_JOB, pml.COPIER_JOB_START)
+
+ elif self.copy_type == COPY_TYPE_AIO_DEVICE:
+ self.dev.setPML(pml.OID_SCAN_TO_PRINTER, pml.SCAN_TO_PRINTER_START)
+
+ state = STATE_ACTIVE
+
+ elif state == STATE_ACTIVE:
+ log.debug("%s State: Active" % ("*"*20))
+
+ if self.copy_type == COPY_TYPE_DEVICE:
+ while True:
+ result_code, copy_state = self.dev.getPML(pml.OID_COPIER_JOB)
+
+ if self.check_for_cancel():
+ self.dev.setPML(pml.OID_COPIER_JOB, pml.COPIER_JOB_IDLE) # cancel
+ state = STATE_ABORTED
+ break
+
+ if copy_state == pml.COPIER_JOB_START:
+ log.debug("state = start")
+ time.sleep(1)
+ continue
+
+ if copy_state == pml.COPIER_JOB_ACTIVE:
+ self.write_queue(STATUS_ACTIVE)
+ log.debug("state = active")
+ time.sleep(2)
+ continue
+
+ elif copy_state == pml.COPIER_JOB_ABORTING:
+ log.debug("state = aborting")
+ state = STATE_ABORTED
+ break
+
+ elif copy_state == pml.COPIER_JOB_IDLE:
+ log.debug("state = idle")
+ state = STATE_SUCCESS
+ break
+
+ elif self.copy_type == COPY_TYPE_AIO_DEVICE:
+ while True:
+ result_code, copy_state = self.dev.getPML(pml.OID_SCAN_TO_PRINTER)
+
+ if self.check_for_cancel():
+ self.dev.setPML(pml.OID_SCAN_TO_PRINTER, pml.SCAN_TO_PRINTER_IDLE) # cancel
+ state = STATE_ABORTED
+ break
+
+ if copy_state == pml.SCAN_TO_PRINTER_START:
+ log.debug("state = start")
+ time.sleep(1)
+ continue
+
+ if copy_state == pml.SCAN_TO_PRINTER_ACTIVE:
+ self.write_queue(STATUS_ACTIVE)
+ log.debug("state = active")
+ time.sleep(2)
+ continue
+
+ elif copy_state == pml.SCAN_TO_PRINTER_ABORTED:
+ log.debug("state = aborting")
+ state = STATE_ABORTED
+ break
+
+ elif copy_state == pml.SCAN_TO_PRINTER_IDLE:
+ log.debug("state = idle")
+ state = STATE_SUCCESS
+ break
+
+
+ elif state == STATE_RESET_TOKEN:
+ log.debug("%s State: Release copy token" % ("*"*20))
+
+ try:
+ self.dev.setPML(pml.OID_COPIER_TOKEN, '\x00'*16)
+ except Error:
+ log.error("Unable to release copier token.")
+
+ self.dev.close() # Close the device.
+
+ state = STATE_DONE
+
+
+ def check_for_cancel(self):
+ canceled = False
+ while self.event_queue.qsize():
+ try:
+ event = self.event_queue.get(0)
+ if event == COPY_CANCELED:
+ canceled = True
+ log.debug("Cancel pressed!")
+ except Queue.Empty:
+ break
+
+ return canceled
+
+ def write_queue(self, message):
+ if self.update_queue is not None and message != self.prev_update:
+ self.update_queue.put(message)
+ time.sleep(0)
+ self.prev_update = message
diff --git a/copyright b/copyright
new file mode 100755
index 0000000..1bad092
--- /dev/null
+++ b/copyright
@@ -0,0 +1,364 @@
+This package was created by David Suffield <david.suffield@hp.com>
+
+It was downloaded from:
+ http://prdownloads.sourceforge.net/hplip/
+
+Upstream website:
+ http://hplip.sourceforge.net/
+
+Copyright:
+ Copyright (c) 2001-2009 Hewlett-Packard Development Company, L.P. All rights reserved.
+
+The GPL license applies to the files in these directories:
+
+base
+data
+data/pcl
+data/ps
+data/ldl
+data/xml
+data/images
+ip
+pcard
+pcard/pcardext
+prnt
+prnt/cupsext
+scan
+ui
+io/mudext
+
+
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+
+
+The MIT license applies to the files in these directories:
+
+prnt/backend
+io/hpmud
+scan/sane
+
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+and associated documentation files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom
+the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies
+or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+
+The BSD license applies to the files in these directories:
+
+prnt/hpijs
+
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+3. Neither the name of the Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
diff --git a/cups_drv.inc b/cups_drv.inc
new file mode 100644
index 0000000..e2e0de2
--- /dev/null
+++ b/cups_drv.inc
@@ -0,0 +1,687 @@
+cups_ppd_printers = \
+ ppd/hpcups/apollo-2100.ppd.gz \
+ ppd/hpcups/apollo-2150.ppd.gz \
+ ppd/hpcups/apollo-2200.ppd.gz \
+ ppd/hpcups/apollo-2500.ppd.gz \
+ ppd/hpcups/apollo-2600.ppd.gz \
+ ppd/hpcups/apollo-2650.ppd.gz \
+ ppd/hpcups/apollo-p2000-u.ppd.gz \
+ ppd/hpcups/apollo-p2250.ppd.gz \
+ ppd/hpcups/hp-2000c.ppd.gz \
+ ppd/hpcups/hp-2500c.ppd.gz \
+ ppd/hpcups/hp-910.ppd.gz \
+ ppd/hpcups/hp-915.ppd.gz \
+ ppd/hpcups/hp-business_inkjet_1000.ppd.gz \
+ ppd/hpcups/hp-business_inkjet_1100.ppd.gz \
+ ppd/hpcups/hp-business_inkjet_1200.ppd.gz \
+ ppd/hpcups/hp-business_inkjet_2200.ppd.gz \
+ ppd/hpcups/hp-business_inkjet_2230.ppd.gz \
+ ppd/hpcups/hp-business_inkjet_2250-pcl3.ppd.gz \
+ ppd/hpcups/hp-business_inkjet_2280-pcl3.ppd.gz \
+ ppd/hpcups/hp-business_inkjet_2300-pcl3.ppd.gz \
+ ppd/hpcups/hp-business_inkjet_2600-pcl3.ppd.gz \
+ ppd/hpcups/hp-business_inkjet_2800-pcl3.ppd.gz \
+ ppd/hpcups/hp-business_inkjet_3000-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_inkjet_cp1700.ppd.gz \
+ ppd/hpcups/hp-color_inkjet_printer_cp1700.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_1600.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_2500-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_2500_series.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_2600n.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_3000-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_3500n.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_3500.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_3550n.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_3550.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_3600.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_3700n.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_3700-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_3800-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_4500-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_4550-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_4600-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_4600_series.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_4610-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_4650-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_4700-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_4730mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_5500-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_5550-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_5m-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_5.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_8500-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_8550-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_9500_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_9500-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cm1312_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cm1312nfi_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cm2320fxi_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cm2320_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cm2320nf_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cm2320n_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cm3530_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cm4540_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cm4730_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cm6030_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cm6040_mfp.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cm6049_mfp.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cp1215.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cp1217.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cp1514n-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cp1515n-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cp1518ni-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cp2025dn-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cp2025n-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cp2025-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cp2025x-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cp3505-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cp3525-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cp4005-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cp4020_series-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cp4520_series-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cp5225dn-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cp5225n-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cp5225-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cp5520_series-pcl3.ppd.gz \
+ ppd/hpcups/hp-color_laserjet_cp6015-pcl3.ppd.gz \
+ ppd/hpcups/hp-cp1160.ppd.gz \
+ ppd/hpcups/hp-deskjet_1000_j110_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_1050_j410_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_1100.ppd.gz \
+ ppd/hpcups/hp-deskjet_1120.ppd.gz \
+ ppd/hpcups/hp-deskjet_1125.ppd.gz \
+ ppd/hpcups/hp-deskjet_1200c.ppd.gz \
+ ppd/hpcups/hp-deskjet_1220c.ppd.gz \
+ ppd/hpcups/hp-deskjet_1280.ppd.gz \
+ ppd/hpcups/hp-deskjet_1600cm.ppd.gz \
+ ppd/hpcups/hp-deskjet_1600cn.ppd.gz \
+ ppd/hpcups/hp-deskjet_1600c.ppd.gz \
+ ppd/hpcups/hp-deskjet_2000_j210_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_2050_j510_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_3000_j310_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_3050a_j611_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_3050_j610_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_3070_b611_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_3320.ppd.gz \
+ ppd/hpcups/hp-deskjet_3325.ppd.gz \
+ ppd/hpcups/hp-deskjet_3420.ppd.gz \
+ ppd/hpcups/hp-deskjet_3425.ppd.gz \
+ ppd/hpcups/hp-deskjet_3450.ppd.gz \
+ ppd/hpcups/hp-deskjet_3500.ppd.gz \
+ ppd/hpcups/hp-deskjet_3550.ppd.gz \
+ ppd/hpcups/hp-deskjet_3600.ppd.gz \
+ ppd/hpcups/hp-deskjet_3650.ppd.gz \
+ ppd/hpcups/hp-deskjet_3740.ppd.gz \
+ ppd/hpcups/hp-deskjet_3810.ppd.gz \
+ ppd/hpcups/hp-deskjet_3816.ppd.gz \
+ ppd/hpcups/hp-deskjet_3819.ppd.gz \
+ ppd/hpcups/hp-deskjet_3820.ppd.gz \
+ ppd/hpcups/hp-deskjet_3822.ppd.gz \
+ ppd/hpcups/hp-deskjet_3840.ppd.gz \
+ ppd/hpcups/hp-deskjet_3870.ppd.gz \
+ ppd/hpcups/hp-deskjet_3900.ppd.gz \
+ ppd/hpcups/hp-deskjet_3910.ppd.gz \
+ ppd/hpcups/hp-deskjet_3920.ppd.gz \
+ ppd/hpcups/hp-deskjet_3940.ppd.gz \
+ ppd/hpcups/hp-deskjet_400l.ppd.gz \
+ ppd/hpcups/hp-deskjet_400.ppd.gz \
+ ppd/hpcups/hp-deskjet_460.ppd.gz \
+ ppd/hpcups/hp-deskjet_500c.ppd.gz \
+ ppd/hpcups/hp-deskjet_500.ppd.gz \
+ ppd/hpcups/hp-deskjet_505j.ppd.gz \
+ ppd/hpcups/hp-deskjet_5100.ppd.gz \
+ ppd/hpcups/hp-deskjet_510.ppd.gz \
+ ppd/hpcups/hp-deskjet_520.ppd.gz \
+ ppd/hpcups/hp-deskjet_5400_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_540.ppd.gz \
+ ppd/hpcups/hp-deskjet_550c.ppd.gz \
+ ppd/hpcups/hp-deskjet_5550.ppd.gz \
+ ppd/hpcups/hp-deskjet_5551.ppd.gz \
+ ppd/hpcups/hp-deskjet_5552.ppd.gz \
+ ppd/hpcups/hp-deskjet_5600.ppd.gz \
+ ppd/hpcups/hp-deskjet_5650.ppd.gz \
+ ppd/hpcups/hp-deskjet_5652.ppd.gz \
+ ppd/hpcups/hp-deskjet_5700.ppd.gz \
+ ppd/hpcups/hp-deskjet_5800.ppd.gz \
+ ppd/hpcups/hp-deskjet_5850.ppd.gz \
+ ppd/hpcups/hp-deskjet_5900_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_600.ppd.gz \
+ ppd/hpcups/hp-deskjet_610cl.ppd.gz \
+ ppd/hpcups/hp-deskjet_610c.ppd.gz \
+ ppd/hpcups/hp-deskjet_6120.ppd.gz \
+ ppd/hpcups/hp-deskjet_6122.ppd.gz \
+ ppd/hpcups/hp-deskjet_6127.ppd.gz \
+ ppd/hpcups/hp-deskjet_612c.ppd.gz \
+ ppd/hpcups/hp-deskjet_630c.ppd.gz \
+ ppd/hpcups/hp-deskjet_632c.ppd.gz \
+ ppd/hpcups/hp-deskjet_640c.ppd.gz \
+ ppd/hpcups/hp-deskjet_648c.ppd.gz \
+ ppd/hpcups/hp-deskjet_6500.ppd.gz \
+ ppd/hpcups/hp-deskjet_656c.ppd.gz \
+ ppd/hpcups/hp-deskjet_6600.ppd.gz \
+ ppd/hpcups/hp-deskjet_660.ppd.gz \
+ ppd/hpcups/hp-deskjet_670c.ppd.gz \
+ ppd/hpcups/hp-deskjet_670.ppd.gz \
+ ppd/hpcups/hp-deskjet_670tv.ppd.gz \
+ ppd/hpcups/hp-deskjet_672c.ppd.gz \
+ ppd/hpcups/hp-deskjet_6800.ppd.gz \
+ ppd/hpcups/hp-deskjet_680.ppd.gz \
+ ppd/hpcups/hp-deskjet_682.ppd.gz \
+ ppd/hpcups/hp-deskjet_690c.ppd.gz \
+ ppd/hpcups/hp-deskjet_690.ppd.gz \
+ ppd/hpcups/hp-deskjet_692.ppd.gz \
+ ppd/hpcups/hp-deskjet_693.ppd.gz \
+ ppd/hpcups/hp-deskjet_6940_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_694.ppd.gz \
+ ppd/hpcups/hp-deskjet_695.ppd.gz \
+ ppd/hpcups/hp-deskjet_697.ppd.gz \
+ ppd/hpcups/hp-deskjet_6980_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_810c.ppd.gz \
+ ppd/hpcups/hp-deskjet_812c.ppd.gz \
+ ppd/hpcups/hp-deskjet_815c.ppd.gz \
+ ppd/hpcups/hp-deskjet_816c.ppd.gz \
+ ppd/hpcups/hp-deskjet_825c.ppd.gz \
+ ppd/hpcups/hp-deskjet_830c.ppd.gz \
+ ppd/hpcups/hp-deskjet_832c.ppd.gz \
+ ppd/hpcups/hp-deskjet_840c.ppd.gz \
+ ppd/hpcups/hp-deskjet_841c.ppd.gz \
+ ppd/hpcups/hp-deskjet_842c.ppd.gz \
+ ppd/hpcups/hp-deskjet_843c.ppd.gz \
+ ppd/hpcups/hp-deskjet_845c.ppd.gz \
+ ppd/hpcups/hp-deskjet_850c.ppd.gz \
+ ppd/hpcups/hp-deskjet_855c.ppd.gz \
+ ppd/hpcups/hp-deskjet_870c.ppd.gz \
+ ppd/hpcups/hp-deskjet_880c.ppd.gz \
+ ppd/hpcups/hp-deskjet_882c.ppd.gz \
+ ppd/hpcups/hp-deskjet_890c.ppd.gz \
+ ppd/hpcups/hp-deskjet_895c.ppd.gz \
+ ppd/hpcups/hp-deskjet_916c.ppd.gz \
+ ppd/hpcups/hp-deskjet_920c.ppd.gz \
+ ppd/hpcups/hp-deskjet_9300.ppd.gz \
+ ppd/hpcups/hp-deskjet_930c.ppd.gz \
+ ppd/hpcups/hp-deskjet_932c.ppd.gz \
+ ppd/hpcups/hp-deskjet_933c.ppd.gz \
+ ppd/hpcups/hp-deskjet_934c.ppd.gz \
+ ppd/hpcups/hp-deskjet_935c.ppd.gz \
+ ppd/hpcups/hp-deskjet_940c.ppd.gz \
+ ppd/hpcups/hp-deskjet_948c.ppd.gz \
+ ppd/hpcups/hp-deskjet_950c.ppd.gz \
+ ppd/hpcups/hp-deskjet_952c.ppd.gz \
+ ppd/hpcups/hp-deskjet_955c.ppd.gz \
+ ppd/hpcups/hp-deskjet_957c.ppd.gz \
+ ppd/hpcups/hp-deskjet_959c.ppd.gz \
+ ppd/hpcups/hp-deskjet_9600.ppd.gz \
+ ppd/hpcups/hp-deskjet_960c.ppd.gz \
+ ppd/hpcups/hp-deskjet_970c.ppd.gz \
+ ppd/hpcups/hp-deskjet_975c.ppd.gz \
+ ppd/hpcups/hp-deskjet_9800.ppd.gz \
+ ppd/hpcups/hp-deskjet_980c.ppd.gz \
+ ppd/hpcups/hp-deskjet_990c.ppd.gz \
+ ppd/hpcups/hp-deskjet_995c.ppd.gz \
+ ppd/hpcups/hp-deskjet_d1300_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_d1400_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_d1500_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_d1600_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_d2300_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_d2400_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_d2500_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_d2600_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_d4100_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_d4200_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_d4300_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_d5500_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_d730.ppd.gz \
+ ppd/hpcups/hp-deskjet_f2100_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_f2200_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_f2400_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_f300_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_f4100_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_f4200_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_f4210_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_f4213_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_f4400_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_f4500_series.ppd.gz \
+ ppd/hpcups/hp-deskjet_f735.ppd.gz \
+ ppd/hpcups/hp-deskjet_ink_adv_2010_k010.ppd.gz \
+ ppd/hpcups/hp-deskjet_ink_adv_2060_k110.ppd.gz \
+ ppd/hpcups/hp-deskjet_ink_advant_k109a-z.ppd.gz \
+ ppd/hpcups/hp-deskjet_ink_advant_k209a-z.ppd.gz \
+ ppd/hpcups/hp-dj350.ppd.gz \
+ ppd/hpcups/hp-dj450.ppd.gz \
+ ppd/hpcups/hp-envy_100_d410_series.ppd.gz \
+ ppd/hpcups/hp-envy_110_series.ppd.gz \
+ ppd/hpcups/hp-laserjet_1000.ppd.gz \
+ ppd/hpcups/hp-laserjet_1005_series.ppd.gz \
+ ppd/hpcups/hp-laserjet_1010.ppd.gz \
+ ppd/hpcups/hp-laserjet_1012.ppd.gz \
+ ppd/hpcups/hp-laserjet_1015.ppd.gz \
+ ppd/hpcups/hp-laserjet_1018.ppd.gz \
+ ppd/hpcups/hp-laserjet_1020.ppd.gz \
+ ppd/hpcups/hp-laserjet_1022n-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_1022nw-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_1022nw-zjs.ppd.gz \
+ ppd/hpcups/hp-laserjet_1022n-zjs.ppd.gz \
+ ppd/hpcups/hp-laserjet_1022-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_1022-zjs.ppd.gz \
+ ppd/hpcups/hp-laserjet_1100a.ppd.gz \
+ ppd/hpcups/hp-laserjet_1100.ppd.gz \
+ ppd/hpcups/hp-laserjet_1100xi.ppd.gz \
+ ppd/hpcups/hp-laserjet_1150.ppd.gz \
+ ppd/hpcups/hp-laserjet_1160.ppd.gz \
+ ppd/hpcups/hp-laserjet_1160_series.ppd.gz \
+ ppd/hpcups/hp-laserjet_1200n.ppd.gz \
+ ppd/hpcups/hp-laserjet_1200-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_1220-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_1220se.ppd.gz \
+ ppd/hpcups/hp-laserjet_1300n-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_1300-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_1300xi-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_1320n.ppd.gz \
+ ppd/hpcups/hp-laserjet_1320nw.ppd.gz \
+ ppd/hpcups/hp-laserjet_1320.ppd.gz \
+ ppd/hpcups/hp-laserjet_1320_series-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_1320tn.ppd.gz \
+ ppd/hpcups/hp-laserjet_2100.ppd.gz \
+ ppd/hpcups/hp-laserjet_2100_series-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_2200-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_2200_series.ppd.gz \
+ ppd/hpcups/hp-laserjet_2300-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_2300_series.ppd.gz \
+ ppd/hpcups/hp-laserjet_2410-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_2420-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_2430-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_3015-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_3020-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_3030-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_3050-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_3052-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_3055.ppd.gz \
+ ppd/hpcups/hp-laserjet_3100.ppd.gz \
+ ppd/hpcups/hp-laserjet_3150.ppd.gz \
+ ppd/hpcups/hp-laserjet_3200m-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_3200.ppd.gz \
+ ppd/hpcups/hp-laserjet_3200se.ppd.gz \
+ ppd/hpcups/hp-laserjet_3300_3310_3320-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_3330.ppd.gz \
+ ppd/hpcups/hp-laserjet_3380-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_3390-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_3392.ppd.gz \
+ ppd/hpcups/hp-laserjet_4000_series-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_4050_series-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_4100_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_4100_series-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_4150_series.ppd.gz \
+ ppd/hpcups/hp-laserjet_4200-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_4240-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_4250-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_4300-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_4345_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_4350-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_4l.ppd.gz \
+ ppd/hpcups/hp-laserjet_4ml.ppd.gz \
+ ppd/hpcups/hp-laserjet_4mp-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_4_plus-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_4si-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_4v-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_5000.ppd.gz \
+ ppd/hpcups/hp-laserjet_5000_series-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_5100_series-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_5200l-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_5200lx.ppd.gz \
+ ppd/hpcups/hp-laserjet_5200-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_5l.ppd.gz \
+ ppd/hpcups/hp-laserjet_5mp-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_5p.ppd.gz \
+ ppd/hpcups/hp-laserjet_5si_mopier-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_5si-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_6l.ppd.gz \
+ ppd/hpcups/hp-laserjet_6mp-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_6p.ppd.gz \
+ ppd/hpcups/hp-laserjet_8000.ppd.gz \
+ ppd/hpcups/hp-laserjet_8000_series-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_8100_mfp.ppd.gz \
+ ppd/hpcups/hp-laserjet_8100_series-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_8150_mfp.ppd.gz \
+ ppd/hpcups/hp-laserjet_8150_series-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_9000_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_9000_series-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_9040_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_9040-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_9050_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_9050-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_9055mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_9065mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_cm1411fn-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_cm1412fn-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_cm1413fn-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_cm1415fn-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_cm1415fnw-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_cm1416fnw-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_cm1417fnw-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_cm1418fnw-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_cp_1025nw.ppd.gz \
+ ppd/hpcups/hp-laserjet_cp1025nw.ppd.gz \
+ ppd/hpcups/hp-laserjet_cp_1025.ppd.gz \
+ ppd/hpcups/hp-laserjet_cp1025.ppd.gz \
+ ppd/hpcups/hp-laserjet_m1005.ppd.gz \
+ ppd/hpcups/hp-laserjet_m1120_mfp.ppd.gz \
+ ppd/hpcups/hp-laserjet_m1120n_mfp.ppd.gz \
+ ppd/hpcups/hp-laserjet_m1319f_mfp.ppd.gz \
+ ppd/hpcups/hp-laserjet_m1522nf_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_m1536dnf_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_m1537dnf_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_m1538dnf_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_m1539dnf_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_m2727_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_m3027_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_m3035_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_m4345_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_m4349_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_m5025_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_m5035_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_m5039_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_m9040_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_m9050_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_m9059_mfp-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_p1005.ppd.gz \
+ ppd/hpcups/hp-laserjet_p1006.ppd.gz \
+ ppd/hpcups/hp-laserjet_p1007.ppd.gz \
+ ppd/hpcups/hp-laserjet_p1008.ppd.gz \
+ ppd/hpcups/hp-laserjet_p1009.ppd.gz \
+ ppd/hpcups/hp-laserjet_p1505n-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_p1505n-zxs.ppd.gz \
+ ppd/hpcups/hp-laserjet_p1505.ppd.gz \
+ ppd/hpcups/hp-laserjet_p2014n-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_p2014n-zxs.ppd.gz \
+ ppd/hpcups/hp-laserjet_p2014-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_p2014-zxs.ppd.gz \
+ ppd/hpcups/hp-laserjet_p2015dn_series.ppd.gz \
+ ppd/hpcups/hp-laserjet_p2015d_series.ppd.gz \
+ ppd/hpcups/hp-laserjet_p2015n_series.ppd.gz \
+ ppd/hpcups/hp-laserjet_p2015_series-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_p2015x_series.ppd.gz \
+ ppd/hpcups/hp-laserjet_p2035n-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_p2035n-zjs.ppd.gz \
+ ppd/hpcups/hp-laserjet_p2035-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_p2035-zjs.ppd.gz \
+ ppd/hpcups/hp-laserjet_p2055dn-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_p2055d-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_p2055-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_p2055x-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_p3004-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_p3005-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_p3010_series-pcl3.ppd.gz \
+ ppd/hpcups/hp-laserjet_p4014dn.ppd.gz \
+ ppd/hpcups/hp-laserjet_p4014n.ppd.gz \
+ ppd/hpcups/hp-laserjet_p4014.ppd.gz \
+ ppd/hpcups/hp-laserjet_p4015dn.ppd.gz \
+ ppd/hpcups/hp-laserjet_p4015n.ppd.gz \
+ ppd/hpcups/hp-laserjet_p4015.ppd.gz \
+ ppd/hpcups/hp-laserjet_p4015tn.ppd.gz \
+ ppd/hpcups/hp-laserjet_p4015x.ppd.gz \
+ ppd/hpcups/hp-laserjet_p4515n.ppd.gz \
+ ppd/hpcups/hp-laserjet_p4515.ppd.gz \
+ ppd/hpcups/hp-laserjet_p4515tn.ppd.gz \
+ ppd/hpcups/hp-laserjet_p4515xm.ppd.gz \
+ ppd/hpcups/hp-laserjet_p4515x.ppd.gz \
+ ppd/hpcups/hp-laserjet_professional_m1132_mfp.ppd.gz \
+ ppd/hpcups/hp-laserjet_professional_m1136_mfp.ppd.gz \
+ ppd/hpcups/hp-laserjet_professional_m1212nf_mfp.ppd.gz \
+ ppd/hpcups/hp-laserjet_professional_m1213nf_mfp.ppd.gz \
+ ppd/hpcups/hp-laserjet_professional_m1214nfh_mfp.ppd.gz \
+ ppd/hpcups/hp-laserjet_professional_m1216nfh_mfp.ppd.gz \
+ ppd/hpcups/hp-laserjet_professional_m1217nfw_mfp.ppd.gz \
+ ppd/hpcups/hp-laserjet_professional_m1219nf_mfp.ppd.gz \
+ ppd/hpcups/hp-laserjet_professional_p1102.ppd.gz \
+ ppd/hpcups/hp-laserjet_professional_p_1102w.ppd.gz \
+ ppd/hpcups/hp-laserjet_professional_p1102w.ppd.gz \
+ ppd/hpcups/hp-laserjet_professional_p1106.ppd.gz \
+ ppd/hpcups/hp-laserjet_professional_p1108.ppd.gz \
+ ppd/hpcups/hp-laserjet_professional_p1566.ppd.gz \
+ ppd/hpcups/hp-laserjet_professional_p1606dn.ppd.gz \
+ ppd/hpcups/hp-mopier_240-pcl3.ppd.gz \
+ ppd/hpcups/hp-mopier_320-pcl3.ppd.gz \
+ ppd/hpcups/hp-officejet_100_mobile_l411.ppd.gz \
+ ppd/hpcups/hp-officejet_4000_k210.ppd.gz \
+ ppd/hpcups/hp-officejet_4100_series.ppd.gz \
+ ppd/hpcups/hp-officejet_4105.ppd.gz \
+ ppd/hpcups/hp-officejet_4115_series.ppd.gz \
+ ppd/hpcups/hp-officejet_4200_series.ppd.gz \
+ ppd/hpcups/hp-officejet_4255.ppd.gz \
+ ppd/hpcups/hp-officejet_4300_series.ppd.gz \
+ ppd/hpcups/hp-officejet_4400_k410.ppd.gz \
+ ppd/hpcups/hp-officejet_4500_g510a-f.ppd.gz \
+ ppd/hpcups/hp-officejet_4500_g510g-m.ppd.gz \
+ ppd/hpcups/hp-officejet_4500_g510n-z.ppd.gz \
+ ppd/hpcups/hp-officejet_4500_k710.ppd.gz \
+ ppd/hpcups/hp-officejet_5100_series.ppd.gz \
+ ppd/hpcups/hp-officejet_5105.ppd.gz \
+ ppd/hpcups/hp-officejet_5110.ppd.gz \
+ ppd/hpcups/hp-officejet_5110v.ppd.gz \
+ ppd/hpcups/hp-officejet_5500_series.ppd.gz \
+ ppd/hpcups/hp-officejet_5600_series.ppd.gz \
+ ppd/hpcups/hp-officejet_6000_e609a.ppd.gz \
+ ppd/hpcups/hp-officejet_6000_e609n.ppd.gz \
+ ppd/hpcups/hp-officejet_6100.ppd.gz \
+ ppd/hpcups/hp-officejet_6100_series.ppd.gz \
+ ppd/hpcups/hp-officejet_6150_series.ppd.gz \
+ ppd/hpcups/hp-officejet_6200_series.ppd.gz \
+ ppd/hpcups/hp-officejet_6300_series.ppd.gz \
+ ppd/hpcups/hp-officejet_6500_e709a.ppd.gz \
+ ppd/hpcups/hp-officejet_6500_e709n.ppd.gz \
+ ppd/hpcups/hp-officejet_6500_e710a-f.ppd.gz \
+ ppd/hpcups/hp-officejet_6500_e710n-z.ppd.gz \
+ ppd/hpcups/hp-officejet_6600.ppd.gz \
+ ppd/hpcups/hp-officejet_6700.ppd.gz \
+ ppd/hpcups/hp-officejet_7000_e809a.ppd.gz \
+ ppd/hpcups/hp-officejet_7000_e809a_series.ppd.gz \
+ ppd/hpcups/hp-officejet_7100_series.ppd.gz \
+ ppd/hpcups/hp-officejet_7200_series.ppd.gz \
+ ppd/hpcups/hp-officejet_7300_series.ppd.gz \
+ ppd/hpcups/hp-officejet_7400_series.ppd.gz \
+ ppd/hpcups/hp-officejet_7500_e910.ppd.gz \
+ ppd/hpcups/hp-officejet_9100_series-pcl3.ppd.gz \
+ ppd/hpcups/hp-officejet_d_series.ppd.gz \
+ ppd/hpcups/hp-officejet_g55.ppd.gz \
+ ppd/hpcups/hp-officejet_g55xi.ppd.gz \
+ ppd/hpcups/hp-officejet_g85.ppd.gz \
+ ppd/hpcups/hp-officejet_g85xi.ppd.gz \
+ ppd/hpcups/hp-officejet_g95.ppd.gz \
+ ppd/hpcups/hp-officejet_h470.ppd.gz \
+ ppd/hpcups/hp-officejet_j3500_series.ppd.gz \
+ ppd/hpcups/hp-officejet_j3600_series.ppd.gz \
+ ppd/hpcups/hp-officejet_j4500_series.ppd.gz \
+ ppd/hpcups/hp-officejet_j4660_series.ppd.gz \
+ ppd/hpcups/hp-officejet_j4680_series.ppd.gz \
+ ppd/hpcups/hp-officejet_j5500_series.ppd.gz \
+ ppd/hpcups/hp-officejet_j5700_series.ppd.gz \
+ ppd/hpcups/hp-officejet_j6400_series.ppd.gz \
+ ppd/hpcups/hp-officejet_k60.ppd.gz \
+ ppd/hpcups/hp-officejet_k60xi.ppd.gz \
+ ppd/hpcups/hp-officejet_k7100.ppd.gz \
+ ppd/hpcups/hp-officejet_k80.ppd.gz \
+ ppd/hpcups/hp-officejet_k80xi.ppd.gz \
+ ppd/hpcups/hp-officejet_lx.ppd.gz \
+ ppd/hpcups/hp-officejet.ppd.gz \
+ ppd/hpcups/hp-officejet_pro_1150c.ppd.gz \
+ ppd/hpcups/hp-officejet_pro_1170c_series.ppd.gz \
+ ppd/hpcups/hp-officejet_pro_8000_a809.ppd.gz \
+ ppd/hpcups/hp-officejet_pro_8100.ppd.gz \
+ ppd/hpcups/hp-officejet_pro_8500_a909a.ppd.gz \
+ ppd/hpcups/hp-officejet_pro_8500_a909g.ppd.gz \
+ ppd/hpcups/hp-officejet_pro_8500_a909n.ppd.gz \
+ ppd/hpcups/hp-officejet_pro_8500_a910.ppd.gz \
+ ppd/hpcups/hp-officejet_pro_8600.ppd.gz \
+ ppd/hpcups/hp-officejet_pro_k5300.ppd.gz \
+ ppd/hpcups/hp-officejet_pro_k5400.ppd.gz \
+ ppd/hpcups/hp-officejet_pro_k550.ppd.gz \
+ ppd/hpcups/hp-officejet_pro_k850.ppd.gz \
+ ppd/hpcups/hp-officejet_pro_k8600.ppd.gz \
+ ppd/hpcups/hp-officejet_pro_l7300.ppd.gz \
+ ppd/hpcups/hp-officejet_pro_l7400.ppd.gz \
+ ppd/hpcups/hp-officejet_pro_l7500.ppd.gz \
+ ppd/hpcups/hp-officejet_pro_l7600.ppd.gz \
+ ppd/hpcups/hp-officejet_pro_l7700.ppd.gz \
+ ppd/hpcups/hp-officejet_r40.ppd.gz \
+ ppd/hpcups/hp-officejet_r40xi.ppd.gz \
+ ppd/hpcups/hp-officejet_r45.ppd.gz \
+ ppd/hpcups/hp-officejet_r60.ppd.gz \
+ ppd/hpcups/hp-officejet_r65.ppd.gz \
+ ppd/hpcups/hp-officejet_r80.ppd.gz \
+ ppd/hpcups/hp-officejet_r80xi.ppd.gz \
+ ppd/hpcups/hp-officejet_series_300.ppd.gz \
+ ppd/hpcups/hp-officejet_series_310.ppd.gz \
+ ppd/hpcups/hp-officejet_series_320.ppd.gz \
+ ppd/hpcups/hp-officejet_series_330.ppd.gz \
+ ppd/hpcups/hp-officejet_series_350.ppd.gz \
+ ppd/hpcups/hp-officejet_series_520.ppd.gz \
+ ppd/hpcups/hp-officejet_series_570.ppd.gz \
+ ppd/hpcups/hp-officejet_series_580.ppd.gz \
+ ppd/hpcups/hp-officejet_series_590.ppd.gz \
+ ppd/hpcups/hp-officejet_series_600.ppd.gz \
+ ppd/hpcups/hp-officejet_series_610.ppd.gz \
+ ppd/hpcups/hp-officejet_series_630.ppd.gz \
+ ppd/hpcups/hp-officejet_series_700.ppd.gz \
+ ppd/hpcups/hp-officejet_series_710.ppd.gz \
+ ppd/hpcups/hp-officejet_series_720.ppd.gz \
+ ppd/hpcups/hp-officejet_series_725.ppd.gz \
+ ppd/hpcups/hp-officejet_t_series.ppd.gz \
+ ppd/hpcups/hp-officejet_v30.ppd.gz \
+ ppd/hpcups/hp-officejet_v40.ppd.gz \
+ ppd/hpcups/hp-officejet_v40xi.ppd.gz \
+ ppd/hpcups/hp-officejet_v45.ppd.gz \
+ ppd/hpcups/hp-photosmart_100.ppd.gz \
+ ppd/hpcups/hp-photosmart_1115.ppd.gz \
+ ppd/hpcups/hp-photosmart_1215.ppd.gz \
+ ppd/hpcups/hp-photosmart_1218.ppd.gz \
+ ppd/hpcups/hp-photosmart_130.ppd.gz \
+ ppd/hpcups/hp-photosmart_1315.ppd.gz \
+ ppd/hpcups/hp-photosmart_140_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_230.ppd.gz \
+ ppd/hpcups/hp-photosmart_240_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_2570_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_2600_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_2700_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_3100_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_3200_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_320_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_3300_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_330_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_370_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_380_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_420_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_470_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_5510d_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_5510_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_6510_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_7150.ppd.gz \
+ ppd/hpcups/hp-photosmart_7200_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_7345.ppd.gz \
+ ppd/hpcups/hp-photosmart_7350.ppd.gz \
+ ppd/hpcups/hp-photosmart_7400_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_7510_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_7550.ppd.gz \
+ ppd/hpcups/hp-photosmart_7600_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_7700_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_7800_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_7900_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_8000_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_8100_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_8200_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_8400_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_8700_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_a310_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_a320_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_a430_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_a440_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_a510_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_a520_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_a530_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_a610_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_a620_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_a630_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_a640_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_a710_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_a820_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_b010_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_b109a-m.ppd.gz \
+ ppd/hpcups/hp-photosmart_b109a_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_b110_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_b8500_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_c309a_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_c3100_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_c4100_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_c4200_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_c4340_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_c4380_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_c4400_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_c4500_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_c4600_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_c4700_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_c5100_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_c5200_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_c5300_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_c5500_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_c6100_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_c6200_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_c6300_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_c7100_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_c7200_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_c8100_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_d110_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_d5060_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_d5100_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_d5300_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_d5400_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_d6100_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_d7100_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_d7200_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_d7300_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_d7400_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_d7500_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_estn_c510_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_ink_adv_k510.ppd.gz \
+ ppd/hpcups/hp-photosmart_p1000.ppd.gz \
+ ppd/hpcups/hp-photosmart_p1100.ppd.gz \
+ ppd/hpcups/hp-photosmart_plus_b209a-m.ppd.gz \
+ ppd/hpcups/hp-photosmart_plus_b210_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_prem_c310_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_prem_c410_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_premium_c309g-m.ppd.gz \
+ ppd/hpcups/hp-photosmart_prem-web_c309n-s.ppd.gz \
+ ppd/hpcups/hp-photosmart_pro_b8300_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_pro_b8800_series.ppd.gz \
+ ppd/hpcups/hp-photosmart_wireless_b109n-z.ppd.gz \
+ ppd/hpcups/hp-printer_scanner_copier_300.ppd.gz \
+ ppd/hpcups/hp-psc_1000_series.ppd.gz \
+ ppd/hpcups/hp-psc_1100_series.ppd.gz \
+ ppd/hpcups/hp-psc_1200_series.ppd.gz \
+ ppd/hpcups/hp-psc_1300_series.ppd.gz \
+ ppd/hpcups/hp-psc_1310_series.ppd.gz \
+ ppd/hpcups/hp-psc_1358_series.ppd.gz \
+ ppd/hpcups/hp-psc_1400_series.ppd.gz \
+ ppd/hpcups/hp-psc_1500_series.ppd.gz \
+ ppd/hpcups/hp-psc_1510_series.ppd.gz \
+ ppd/hpcups/hp-psc_1600_series.ppd.gz \
+ ppd/hpcups/hp-psc_2100_series.ppd.gz \
+ ppd/hpcups/hp-psc_2150_series.ppd.gz \
+ ppd/hpcups/hp-psc_2170_series.ppd.gz \
+ ppd/hpcups/hp-psc_2200_series.ppd.gz \
+ ppd/hpcups/hp-psc_2210_series.ppd.gz \
+ ppd/hpcups/hp-psc_2300_series.ppd.gz \
+ ppd/hpcups/hp-psc_2350_series.ppd.gz \
+ ppd/hpcups/hp-psc_2400_series.ppd.gz \
+ ppd/hpcups/hp-psc_2500_series.ppd.gz \
+ ppd/hpcups/hp-psc_500.ppd.gz \
+ ppd/hpcups/hp-psc_720.ppd.gz \
+ ppd/hpcups/hp-psc_750.ppd.gz \
+ ppd/hpcups/hp-psc_750xi.ppd.gz \
+ ppd/hpcups/hp-psc_760.ppd.gz \
+ ppd/hpcups/hp-psc_780.ppd.gz \
+ ppd/hpcups/hp-psc_780xi.ppd.gz \
+ ppd/hpcups/hp-psc_900_series.ppd.gz \
+ ppd/hpcups/hp-psc_920.ppd.gz \
+ ppd/hpcups/hp-psc_950.ppd.gz \
+ ppd/hpcups/hp-psc_950vr.ppd.gz \
+ ppd/hpcups/hp-psc_950xi.ppd.gz
+cups_drv = prnt/drv/hpcups.drv
diff --git a/dat2drv.py b/dat2drv.py
new file mode 100755
index 0000000..f70a317
--- /dev/null
+++ b/dat2drv.py
@@ -0,0 +1,926 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2008-9 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+__version__ = "3.3"
+__title__ = 'DAT to DRV.IN converter. Also creates Foomatic XML files.'
+__doc__ = "Create DRV.IN file and Foomatic XML files from MODELS.DAT data. Processes all *.in.template files in prnt/drv directory."
+
+import os
+os.putenv("HPLIP_BUILD", "1")
+
+# Std Lib
+import os.path
+import sys
+import getopt
+import re
+from xml.dom.minidom import Document, parse, parseString
+from types import StringType, UnicodeType
+import string
+
+# Local
+from base.g import *
+from base import utils, tui, models
+#from prnt import printable_areas
+
+# Globals
+errors = 0
+count = 0
+enc = 'utf-8'
+
+models_dict = {}
+norm_models = {} # { 'norm'd model' : ( 'model', type, has_scanner ), ... }
+norm_models_keys = {}
+model_dat = None
+total_models = 0
+sorted_category_models = {}
+unsupported_models = []
+
+pat_prod_num = re.compile("""(\d+)""", re.I)
+pat_template = re.compile("""^(\s*)//\s*<%(\S+)%>""", re.I)
+pat_template2 = re.compile("""^\s*<%(\S+)%>""", re.I)
+
+
+SHORTENING_REPLACEMENTS = {
+'color laserjet' : 'CLJ',
+'laserjet' : 'LJ',
+'photosmart': 'PS',
+'deskjet' : 'DJ',
+'color inkjet printer' : '',
+'officejet' : 'OJ',
+'business inkjet' : 'BIJ',
+'designjet' : 'DESIGNJ',
+'printer scanner copier' : 'PSC',
+'color lj' : 'CLJ',
+'professional' : 'Pro',
+}
+
+
+USAGE = [(__doc__, "", "name", True),
+ ("Usage: dat2drv.py [OPTIONS]", "", "summary", True),
+ utils.USAGE_OPTIONS,
+ ("Verbose mode:", "-v or --verbose", "option", False),
+ ("Quiet mode:", "-q or --quiet", "option", False),
+ utils.USAGE_LOGGING1, utils.USAGE_LOGGING2,
+ utils.USAGE_HELP,
+ ]
+
+def usage(typ='text'):
+ if typ == 'text':
+ utils.log_title(__title__, __version__)
+
+ utils.format_text(USAGE, typ, __title__, 'drv2xml.py', __version__)
+ sys.exit(0)
+
+
+
+def _encode(v):
+ if isinstance(v, UnicodeType):
+ v = v.encode(enc)
+ return v
+
+
+
+class XMLElement:
+ def __init__(self, doc, el):
+ self.doc = doc
+ self.el = el
+
+ def __getitem__(self, name):
+ a = self.el.getAttributeNode(name)
+ if a:
+ return _encode(a.value)
+ return None
+
+ def __setitem__(self, name, value):
+ self.el.setAttribute(name, _encode(value))
+
+ def __delitem__(self, name):
+ self.el.removeAttribute(name)
+
+ def __str__(self):
+ return _encode(self.doc.toxml())
+
+ def toString(self):
+ return _encode(self.doc.toxml())
+
+ def _inst(self, el):
+ return XMLElement(self.doc, el)
+
+ def get(self, name, default=None):
+ a = self.el.getAttributeNode(name)
+ if a:
+ return _encode(a.value)
+ return _encode(default)
+
+ def add(self, tag, **kwargs):
+ el = self.doc.createElement(tag)
+ for k, v in kwargs.items():
+ el.setAttribute(k, _encode(str(v)))
+ return self._inst(self.el.appendChild(el))
+
+ def addText(self, data):
+ return self._inst(
+ self.el.appendChild(
+ self.doc.createTextNode(_encode(data))))
+
+ def addComment(self, data):
+ return self._inst(
+ self.el.appendChild(
+ self.doc.createComment(data)))
+
+ def getText(self, sep=" "):
+ rc = []
+ for node in self.el.childNodes:
+ if node.nodeType == node.TEXT_NODE:
+ rc.append(node.data)
+ return _encode(string.join(rc, sep))
+
+ def getAll(self, tag):
+ return map(self._inst, self.el.getElementsByTagName(tag))
+
+
+class XMLDocument(XMLElement):
+
+ def __init__(self, tag=None, **kwargs):
+ self.doc = Document()
+ XMLElement.__init__(self, self.doc, self.doc)
+ if tag:
+ self.el = self.add(tag, **kwargs).el
+
+ def parse(self, d):
+ self.doc = self.el = parse(d)
+ return self
+
+ def parseString(self, d):
+ self.doc = self.el = parseString(_encode(d))
+ return self
+
+
+
+
+def fixFileName(model):
+ if model.startswith('hp_'):
+ model = model.replace('hp_', 'hp-')
+
+ elif model.startswith('apollo_'):
+ model = model.replace('apollo_', 'apollo-')
+
+ elif not model.startswith('hp-'):
+ model = 'hp-' + model
+
+ return model.strip('~')
+
+
+def categorize2(m):
+ is_aio = (models_dict[m]['scan-type'] != SCAN_TYPE_NONE or
+ models_dict[m]['copy-type'] != COPY_TYPE_NONE or
+ models_dict[m]['fax-type'] != FAX_TYPE_NONE)
+
+ if "deskjet" in m or \
+ ("color" in m and "inkjet" in m) or \
+ m.startswith("dj") or \
+ m.startswith("cp"):
+
+ if is_aio:
+ i = MODEL_TYPE2_DESKJET_AIO
+ else:
+ i = MODEL_TYPE2_DESKJET
+
+ elif "photosmart" in m:
+ i = MODEL_TYPE2_PHOTOSMART
+
+ elif "officejet" in m:
+ i = MODEL_TYPE2_OFFICEJET
+
+ elif "psc" in m or \
+ "printer_scanner_copier" in m:
+
+ i = MODEL_TYPE2_PSC
+
+ elif "laserjet" in m:
+ if "color" in m:
+ i = MODEL_TYPE2_COLOR_LASERJET
+ else:
+ i = MODEL_TYPE2_LASERJET
+
+ elif "mopier" in m:
+ i = MODEL_TYPE2_LASERJET
+
+ elif "business" in m and \
+ "inkjet" in m:
+
+ i = MODEL_TYPE2_BIJ
+
+ elif "edgeline" in m:
+ i = MODEL_TYPE2_EDGELINE
+
+ elif "apollo" in m:
+ i = MODEL_TYPE2_APOLLO
+
+ elif "designjet" in m or \
+ "plotter" in m or \
+ "draft" in m or \
+ "eagle" in m or \
+ "electrostatic" in m or \
+ m.startswith('hp_2') or \
+ m.startswith('hp_7') or \
+ m.startswith('hp_9'):
+
+ i = MODEL_TYPE2_DESIGNJET
+
+ else: # Other
+ i = MODEL_TYPE2_OTHER
+
+ return (m, i, models_dict[m])
+
+
+def sort_product(x, y):
+ try:
+ _x = int(pat_prod_num.search(x).group(1))
+ except (TypeError, AttributeError):
+ _x = 0
+
+ try:
+ _y = int(pat_prod_num.search(y).group(1))
+ except (TypeError, AttributeError):
+ _y = 0
+
+ if not _x and not _y:
+ return cmp(x, y)
+
+ return cmp(_x, _y)
+
+
+def sort_product2(x, y): # sort key is first element of tuple
+ return sort_product(x[0], y[0])
+
+
+def load_models(unreleased=True):
+ global models_dict
+ global norm_models
+ global norm_models_keys
+ global model_dat
+ global total_models
+ global sorted_category_models
+ global unsupported_models
+
+ models_dict = model_dat.read_all_files(unreleased)
+
+ log.debug("Raw models:")
+
+ for m in models_dict:
+ nm = models.normalizeModelUIName(m)
+ models_dict[m]['norm_model'] = nm.strip('~')
+ models_dict[m]['case_models'] = []
+
+ i, case_models = 1, []
+ while True:
+ try:
+ cm = models.normalizeModelUIName(models_dict[m]['model%d' % i])
+ except KeyError:
+ break
+
+ case_models.append(cm)
+ i+= 1
+
+ if not case_models:
+ case_models = [nm]
+
+ models_dict[m]['case_models'] = case_models[:]
+ cat = categorize2(m)
+ models_dict[m]['category'] = cat
+
+ for c in case_models:
+ norm_models[c] = cat
+
+ if models_dict[m]['support-type'] == SUPPORT_TYPE_NONE:
+ unsupported_models.append((c, m))
+
+ norm_models_keys = norm_models.keys()
+ norm_models_keys.sort(lambda x, y: sort_product(x, y))
+
+ unsupported_models.sort(lambda x, y: sort_product2(x, y))
+
+ total_models = len(norm_models)
+
+ #log.info("Loaded %d models." % total_models)
+
+
+
+
+def main(args):
+ global errors
+ global model_dat
+ line_num = 0
+ log.set_module("dat2drv.py")
+ cur_path = os.path.realpath(os.path.normpath(os.getcwd()))
+ dat_path = os.path.join(cur_path, 'data', 'models')
+ model_dat = models.ModelData(dat_path)
+ load_models()
+
+
+
+ verbose = False
+ quiet = False
+
+ try:
+ opts, args = getopt.getopt(args, 'd:l:ho:vq',
+ ['logging=', 'help',
+ 'help-rest', 'help-man',
+ 'drv=', 'output=',
+ 'verbose', 'quiet'])
+ except getopt.GetoptError, e:
+ log.error(e.msg)
+ usage()
+ sys.exit(0)
+
+ log_level = 'info'
+ if os.getenv("HPLIP_DEBUG"):
+ log.set_level('debug')
+
+ for o, a in opts:
+ if o in ('-h', '--help'):
+ usage()
+
+ elif o == '--help-rest':
+ usage('rest')
+
+ elif o == '--help-man':
+ usage('man')
+
+ elif o in ('-v', '--verbose'):
+ verbose = True
+
+ elif o in ('-q', '--quiet'):
+ quiet = True
+
+ elif o in ('-l', '--logging'):
+ log.set_level(a.lower().strip())
+
+
+ if not quiet:
+ utils.log_title(__title__, __version__)
+
+ drv_dir = os.path.join(cur_path, 'prnt', 'drv')
+
+ errors = []
+ warns = []
+ notes = []
+
+ for template_file in utils.walkFiles(drv_dir, recurse=False, abs_paths=True,
+ return_folders=False, pattern='*.in.template'):
+
+ basename = os.path.basename(template_file).split('.')[0]
+
+ # Output
+ drv_in_file = os.path.join(cur_path, 'prnt', 'drv', '%s.drv.in' % basename)
+
+ # XML output (per model)
+ output_path = os.path.join(cur_path, 'prnt', 'drv', 'foomatic_xml', basename)
+
+ # XML Output (master driver list)
+ driver_path = os.path.join(cur_path, 'prnt', 'drv', 'foomatic_xml', basename, '%s.xml' % basename)
+
+ log.info("Working on %s file..." % basename)
+ log.info("Input file: %s" % template_file)
+ log.info("Output file: %s" % drv_in_file)
+ log.info("Output XML directory: %s" % output_path)
+ log.info("Output driver XML file: %s" % driver_path)
+
+
+
+ # CREATE DRV.IN FILE
+
+ log.info("Processing %s.drv.in.template..." % basename)
+ tui.update_spinner()
+
+ template_classes = []
+
+ template_file_f = open(template_file, 'r')
+ drv_in_file_f = open(drv_in_file, 'w')
+
+ models_placement = {}
+ for m in models_dict:
+ models_placement[m] = 0
+
+ line = 0
+
+ for x in template_file_f:
+ if verbose:
+ log.info(x.strip())
+
+ line += 1
+ tui.update_spinner()
+ drv_in_file_f.write(x)
+ match = pat_template.match(x)
+ if match is not None:
+ matches = []
+ indent = match.group(1)
+ indent2 = ' '*(len(indent)+2)
+
+ classes = match.group(2).split(':')
+ tech_class = classes[0]
+
+ if tech_class not in models.TECH_CLASSES:
+ errors.append("(%s:line %d) Invalid tech-class (%s): %s" % (basename, line, tech_class, x.strip()))
+ continue
+
+ template_classes.append(tech_class)
+
+ tech_subclass = classes[1:]
+
+ ok = True
+ for sc in tech_subclass:
+ if sc not in models.TECH_SUBCLASSES:
+ errors.append("(%s:line %d) Invalid tech-subclass (%s): %s" % (basename, line, sc, x.strip()))
+ ok = False
+
+ if not ok:
+ continue
+
+ for m in models_dict:
+ include = False
+
+ if tech_class in models_dict[m]['tech-class'] and \
+ len(models_dict[m]['tech-subclass']) == len(tech_subclass):
+
+ for msc in models_dict[m]['tech-subclass']:
+ if msc not in tech_subclass:
+ break
+ else:
+ include = True
+
+ if include:
+ models_placement[m] += 1
+ matches.append(m)
+
+ if matches:
+ matches.sort(lambda x, y: sort_product(x, y))
+
+ for p in matches:
+
+ if verbose:
+ log.info("(%s) Adding section for model: %s" % (basename, p))
+
+ drv_in_file_f.write("%s{\n" % indent)
+
+ if basename == 'hpcups':
+ model_name = models_dict[p]['norm_model']
+ else:
+ model_name = models_dict[p]['norm_model'] + " %s" % basename
+
+ orig_model_name = model_name
+
+ while True:
+ if len(model_name) > 31:
+ for k in SHORTENING_REPLACEMENTS:
+ if k in model_name.lower():
+ model_name = utils.ireplace(model_name, k, SHORTENING_REPLACEMENTS[k])
+ model_name = model_name.replace(' ', ' ')
+
+ if len(model_name) < 32:
+ warns.append('len("%s")>31, shortened to len("%s")=%d using sub-brand shortening replacements.' % (orig_model_name, model_name, len(model_name)))
+ break
+
+ if len(model_name) < 32:
+ break
+
+ if "series" in model_name.lower():
+ model_name = utils.ireplace(model_name, "series", "Ser.")
+ model_name = model_name.replace(' ', ' ')
+
+ if len(model_name) < 32:
+ warns.append('len("%s")>31, shortened to len("%s")=%d using "series" to "ser." replacement.' % (orig_model_name, model_name, len(model_name)))
+ break
+
+ if "ser." in model_name.lower():
+ model_name = utils.ireplace(model_name, "ser.", "")
+ model_name = model_name.replace(' ', ' ')
+
+ if len(model_name) < 32:
+ warns.append('len("%s")>31, shortened to len("%s")=%d using "ser." removal.' % (orig_model_name, model_name, len(model_name)))
+ break
+
+ if len(model_name) > 31:
+ model_name = model_name[:31]
+ errors.append('len("%s")>31 chars, could not shorten to <32. Truncating to 31 chars (%s).' % (orig_model_name, model_name))
+
+ break
+
+ drv_in_file_f.write('%sModelName "%s"\n' % (indent2, orig_model_name))
+
+ if len(models_dict[p]['tech-class']) > 1:
+ drv_in_file_f.write('%sAttribute "NickName" "" "%s %s, $Version' %
+ (indent2, orig_model_name, models.TECH_CLASS_PDLS[tech_class]))
+ else:
+ drv_in_file_f.write('%sAttribute "NickName" "" "%s, $Version' %
+ (indent2, orig_model_name))
+
+ if models_dict[p]['plugin'] in (1, 2):
+ if (models_dict[p]['plugin-reason'] & 15 ) in (1, 2, 3, 4, 5, 6, 8, 9, 10, 12):
+ drv_in_file_f.write(', requires proprietary plugin')
+
+ drv_in_file_f.write('"\n')
+
+ drv_in_file_f.write('%sAttribute "ShortNickName" "" "%s"\n' % (indent2, model_name))
+
+ pp = p.replace('_', ' ')
+ if 'apollo' in p.lower():
+ devid = "MFG:Apollo;MDL:%s;DES:%s;" % (pp, pp)
+ else:
+ devid = "MFG:HP;MDL:%s;DES:%s;" % (pp, pp)
+
+ drv_in_file_f.write('%sAttribute "1284DeviceID" "" "%s"\n' % (indent2, devid))
+
+ if len(models_dict[p]['tech-class']) > 1:
+ if basename == 'hpcups':
+ drv_in_file_f.write('%sPCFileName "%s-%s.ppd"\n' %
+ (indent2, fixFileName(p), models.TECH_CLASS_PDLS[tech_class]))
+ else:
+ drv_in_file_f.write('%sPCFileName "%s-%s-%s.ppd"\n' %
+ (indent2, fixFileName(p), basename, models.TECH_CLASS_PDLS[tech_class]))
+
+ elif tech_class != 'Postscript':
+ if basename == 'hpcups':
+ drv_in_file_f.write('%sPCFileName "%s.ppd"\n' % (indent2, fixFileName(p)))
+ else:
+ drv_in_file_f.write('%sPCFileName "%s-%s.ppd"\n' % (indent2, fixFileName(p), basename))
+
+ else:
+ drv_in_file_f.write('%sPCFileName "%s-ps.ppd"\n' % (indent2, fixFileName(p)))
+
+ for c in models_dict[p]['case_models']:
+ drv_in_file_f.write('%sAttribute "Product" "" "(%s)"\n' % (indent2, c))
+
+ drv_in_file_f.write("%s}\n" % indent)
+
+ else:
+ errors.append("(%s:line %d) No models matched the specified classes on line: %s" % (basename, line, x.strip()))
+
+ else:
+ match = pat_template2.match(x)
+ if match is not None:
+ errors.append("(%s:line %d) Malformed line: %s (missing initial //)" % (basename, line, x.strip()))
+
+
+ template_file_f.close()
+ drv_in_file_f.close()
+ tui.cleanup_spinner()
+
+ for tc in models.TECH_CLASSES:
+ if tc.lower() in ('undefined', 'postscript', 'unsupported'):
+ continue
+
+ if tc not in template_classes:
+ warns.append("(%s) Section <%%%s:...%%> not found." % (basename, tc))
+
+
+ # OUTPUT XML FILES
+
+ if not os.path.exists(output_path):
+ os.makedirs(output_path)
+
+ if os.path.exists(driver_path):
+ os.remove(driver_path)
+
+ files_to_delete = []
+ for f in utils.walkFiles(output_path, recurse=True, abs_paths=True, return_folders=False, pattern='*'):
+ files_to_delete.append(f)
+
+ for f in files_to_delete:
+ os.remove(f)
+
+ driver_f = file(driver_path, 'w')
+
+ driver_doc = XMLDocument("driver", id="driver/hplip")
+ name_node = driver_doc.add("name")
+ name_node.addText("hplip")
+ url_node = driver_doc.add("url")
+ url_node.addText("http://hplipopensource.com")
+ supplier_node = driver_doc.add("supplier")
+ supplier_node.addText("Hewlett-Packard")
+ mfg_node = driver_doc.add("manufacturersupplied")
+ mfg_node.addText("HP|Apollo")
+ lic_node = driver_doc.add("license")
+ lic_node.addText("BSD/GPL/MIT")
+ driver_doc.add("freesoftware")
+ support_node = driver_doc.add("supportcontact", level="voluntary", url="https://launchpad.net/hplip")
+ support_node.addText("HPLIP Support at Launchpad.net")
+ shortdesc_node = driver_doc.add("shortdescription")
+ shortdesc_en_node = shortdesc_node.add("en")
+ shortdesc_en_node.addText("HP's driver suite for printers and multi-function devices")
+ func_node = driver_doc.add("functionality")
+ maxresx_node = func_node.add("maxresx")
+ maxresx_node.addText("1200")
+ maxresy_node = func_node.add("maxresy")
+ maxresy_node.addText("1200")
+ func_node.add("color")
+ exec_node = driver_doc.add("execution")
+ exec_node.add("nopjl")
+ exec_node.add("ijs")
+ proto_node = exec_node.add("prototype")
+ #proto_node.addText("gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPAUSE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFile=- -")
+ comments_node = driver_doc.add("comments")
+ comments_en_node = comments_node.add("en")
+ comments_en_node.addText("")
+
+ printers_node = driver_doc.add("printers")
+
+ for m in models_dict:
+
+ if models_dict[m]['support-type'] == SUPPORT_TYPE_NONE:
+ continue
+
+ if 'apollo' in m.lower():
+ make = 'Apollo'
+ else:
+ make = 'HP'
+
+ if 'apollo' in m.lower():
+ ieee1284 = "MFG:Apollo;MDL:%s;DES:%s;" % (m, m)
+
+ else:
+ ieee1284 = "MFG:HP;MDL:%s;DES:%s;" % (m, m)
+
+ postscriptppd = ''
+ if 'Postscript' in models_dict[m]['tech-class']:
+ postscriptppd = "%s-ps.ppd" % fixFileName(m)
+
+ stripped_model = m
+
+ if stripped_model.startswith('hp_'):
+ stripped_model = stripped_model.replace('hp_', '').capitalize()
+
+ elif stripped_model.startswith('apollo_'):
+ stripped_model = stripped_model.replace('apollo_', '').capitalize()
+
+ fixed_model = stripped_model.replace('_', ' ').capitalize()
+
+ # Output to the per-model XML file
+ outputModel(m, fixed_model, stripped_model, make, postscriptppd, ieee1284, output_path, verbose)
+
+ # Output to driver master XML file
+ outputDriver(m, fixed_model, stripped_model, make, printers_node, verbose)
+
+ driver_f.write(str(driver_doc))
+ driver_f.close()
+
+ # Make sure all models ended up in drv.in file
+ log.info("Checking for errors...")
+ tui.update_spinner()
+
+ for m in models_dict:
+ tui.update_spinner()
+ tc = models_dict[m]['tech-class']
+ st = models_dict[m]['support-type']
+
+ if not tc or 'Undefined' in tc:
+ if st:
+ errors.append('(%s) Invalid tech-class for model %s ("Undefined" or missing)' % (basename, m))
+ #else:
+ # warns.append('(%s) Invalid tech-class for unsupported model %s ("Undefined" or missing)' % (basename, m))
+
+ else:
+ if not models_placement[m] and st and \
+ len(tc) == 1 and 'Postscript' not in tc:
+
+ sects = []
+ for tc in models_dict[m]['tech-class']:
+ for sc in models_dict[m]['tech-subclass']:
+ sects.append(sc)
+
+ errors.append("(%s) Model '%s' did not have a matching section. Needed section: <%%%s:%s%%>" %
+ (basename, m, tc, ':'.join(sects)))
+
+ if len(tc) == 1 and 'Postscript' in tc:
+ notes.append("(%s) Postscript-only model %s was not included in DRV file." % (basename, m))
+
+ tui.cleanup_spinner()
+
+ # end for
+
+ if not quiet or verbose:
+ if notes:
+ tui.header("NOTES")
+ for n in notes:
+ log.note(n)
+
+ if warns:
+ tui.header("WARNINGS")
+ for w in warns:
+ log.warn(w)
+
+ if errors:
+ tui.header("ERRORS")
+ for e in errors:
+ log.error(e)
+
+ else:
+ if warns:
+ log.warn("%d warnings" % len(warns))
+
+ if errors:
+ log.error("%d errors" % len(errors))
+
+
+def parseDeviceID(device_id):
+ d= {}
+ x = [y.strip() for y in device_id.strip().split(';') if y]
+
+ for z in x:
+ y = z.split(':')
+ try:
+ d.setdefault(y[0].strip(), y[1])
+ except IndexError:
+ d.setdefault(y[0].strip(), None)
+
+ d.setdefault('MDL', '')
+ d.setdefault('SN', '')
+
+ if 'MODEL' in d:
+ d['MDL'] = d['MODEL']
+ del d['MODEL']
+
+ if 'SERIAL' in d:
+ d['SN'] = d['SERIAL']
+ del d['SERIAL']
+
+ elif 'SERN' in d:
+ d['SN'] = d['SERN']
+ del d['SERN']
+
+ if d['SN'].startswith('X'):
+ d['SN'] = ''
+
+ return d
+
+
+def outputModel(model, fixed_model, stripped_model, make, postscriptppd, ieee1284, output_path, verbose=False):
+ global errors
+ global count
+
+ count += 1
+
+## fixed_model = model.replace(' ', '_')
+##
+## if fixed_model.startswith('hp_'):
+## fixed_model = fixed_model.replace('hp_', 'hp-')
+##
+## elif fixed_model.startswith('apollo_'):
+## fixed_model = fixed_model.replace('apollo_', 'apollo-')
+##
+## else:
+## fixed_model = 'hp-' + fixed_model
+##
+## stripped_model = model
+## if stripped_model.startswith('hp '):
+## stripped_model = stripped_model.replace('hp ', '')
+
+
+ printerID = make + '-' + stripped_model
+
+ output_filename = os.path.join(output_path, printerID+".xml")
+
+ if verbose:
+ log.info("\n\n%s:" % output_filename)
+
+ output_f = file(output_filename, 'w')
+
+ doc = XMLDocument("printer", id="printer/%s" % printerID)
+ make_node = doc.add("make")
+ make_node.addText(make)
+ model_node = doc.add("model")
+ model_node.addText(fixed_model)
+ url_node = doc.add("url")
+ url_node.addText("http://www.hp.com")
+
+ lang_node = doc.add("lang")
+ lang_node.add("pcl", level="3")
+
+ autodetect_node = doc.add("autodetect")
+ usb_node = autodetect_node.add("usb")
+
+ driver_node = doc.add("driver")
+ driver_node.addText('hplip')
+
+ drivers_node = doc.add("drivers")
+ driver_node = drivers_node.add("driver")
+ id_node = driver_node.add("id")
+ id_node.addText("hplip")
+
+ if postscriptppd:
+ # Postscript
+ lang_node.add("postscript", level="2")
+ lang_node.add("pjl")
+ text_node = lang_node.add("text")
+ charset_node = text_node.add("charset")
+ charset_node.addText("us-ascii")
+ #ppd_node = driver_node.add("ppd")
+ #ppd_node.addText(postscriptppd)
+ #else:
+ # id_node.addText("hpijs")
+
+ if 1:
+ #ieee1284_node = usb_node.add("ieee1284")
+ #ieee1284_node.addText(ieee1284)
+
+ device_id = parseDeviceID(ieee1284)
+
+ desc_node = usb_node.add("description")
+ #desc_node.addText(device_id['DES'])
+ desc_node.addText(make + ' ' + fixed_model)
+
+ mfg_node = usb_node.add("manufacturer")
+ #mfg_node.addText(device_id['MFG'])
+ mfg_node.addText("Hewlett-Packard")
+
+ model_node = usb_node.add("model")
+ #model_node.addText(device_id['MDL'])
+ model_node.addText(make + ' ' + fixed_model)
+
+ #cmdset_node = usb_node.add("commandset")
+ #cmdset_node.addText("???")
+
+ if verbose:
+ log.info(str(doc))
+
+ output_f.write(str(doc))
+
+ output_f.close()
+
+
+def outputDriver(m, fixed_model, stripped_model, make, printers_node, verbose):
+
+ printerID = make + '-' + stripped_model
+
+ tech_classes = models_dict[m]['tech-class']
+ #print tech_classes
+ printer_node = printers_node.add("printer")
+ id_node = printer_node.add("id")
+ id_node.addText("printer/%s" % printerID)
+
+## margins_node = printer_node.add("margins")
+## general_margins_node = margins_node.add("general")
+
+## unit_node = general_margins_node.add("unit")
+## unit_node.addText("in")
+##
+## for tc in tech_classes:
+## if tc not in ('Undefined', 'Unsupported', 'PostScript'):
+## try:
+## margins_data = printable_areas.data[tc]
+## except KeyError:
+## continue
+## else:
+## print margins_data
+## break
+
+##<printer>
+## <id>printer/HP-DeskJet_350C</id><!-- HP DeskJet 350C -->
+## <functionality>
+## <maxresx>600</maxresx>
+## <maxresy>300</maxresy>
+## </functionality>
+## <ppdentry>
+## *DefaultResolution: 600dpi
+## </ppdentry>
+## <margins>
+## <general>
+## <unit>in</unit>
+## <relative />
+## <left>0.25</left>
+## <right>0.25</right>
+## <top>0.125</top>
+## <bottom>0.67</bottom>
+## </general>
+## <exception PageSize="A4">
+## <left>0.135</left>
+## <right>0.135</right>
+## </exception>
+## </margins>
+## </printer>
+
+
+
+if __name__ == '__main__':
+ sys.exit(main(sys.argv[1:]))
+
diff --git a/data/images/128x128/audio.png b/data/images/128x128/audio.png
new file mode 100644
index 0000000..66d9e93
--- /dev/null
+++ b/data/images/128x128/audio.png
Binary files differ
diff --git a/data/images/128x128/bmp.png b/data/images/128x128/bmp.png
new file mode 100644
index 0000000..a654384
--- /dev/null
+++ b/data/images/128x128/bmp.png
Binary files differ
diff --git a/data/images/128x128/gif.png b/data/images/128x128/gif.png
new file mode 100644
index 0000000..5b0e5d3
--- /dev/null
+++ b/data/images/128x128/gif.png
Binary files differ
diff --git a/data/images/128x128/hp_logo.png b/data/images/128x128/hp_logo.png
new file mode 100755
index 0000000..28a6fe9
--- /dev/null
+++ b/data/images/128x128/hp_logo.png
Binary files differ
diff --git a/data/images/128x128/jpg.png b/data/images/128x128/jpg.png
new file mode 100644
index 0000000..d93827e
--- /dev/null
+++ b/data/images/128x128/jpg.png
Binary files differ
diff --git a/data/images/128x128/movie.png b/data/images/128x128/movie.png
new file mode 100644
index 0000000..ee520ae
--- /dev/null
+++ b/data/images/128x128/movie.png
Binary files differ
diff --git a/data/images/128x128/mpg.png b/data/images/128x128/mpg.png
new file mode 100644
index 0000000..fc05118
--- /dev/null
+++ b/data/images/128x128/mpg.png
Binary files differ
diff --git a/data/images/128x128/png.png b/data/images/128x128/png.png
new file mode 100644
index 0000000..83139c9
--- /dev/null
+++ b/data/images/128x128/png.png
Binary files differ
diff --git a/data/images/128x128/tif.png b/data/images/128x128/tif.png
new file mode 100644
index 0000000..3738cac
--- /dev/null
+++ b/data/images/128x128/tif.png
Binary files differ
diff --git a/data/images/128x128/unknown.png b/data/images/128x128/unknown.png
new file mode 100644
index 0000000..246d16b
--- /dev/null
+++ b/data/images/128x128/unknown.png
Binary files differ
diff --git a/data/images/16x16/active.png b/data/images/16x16/active.png
new file mode 100644
index 0000000..d623615
--- /dev/null
+++ b/data/images/16x16/active.png
Binary files differ
diff --git a/data/images/16x16/add_user.png b/data/images/16x16/add_user.png
new file mode 100644
index 0000000..3e6b85e
--- /dev/null
+++ b/data/images/16x16/add_user.png
Binary files differ
diff --git a/data/images/16x16/add_user_quick.png b/data/images/16x16/add_user_quick.png
new file mode 100644
index 0000000..c131b56
--- /dev/null
+++ b/data/images/16x16/add_user_quick.png
Binary files differ
diff --git a/data/images/16x16/add_users.png b/data/images/16x16/add_users.png
new file mode 100644
index 0000000..1fc1d1e
--- /dev/null
+++ b/data/images/16x16/add_users.png
Binary files differ
diff --git a/data/images/16x16/battery.png b/data/images/16x16/battery.png
new file mode 100644
index 0000000..726eccd
--- /dev/null
+++ b/data/images/16x16/battery.png
Binary files differ
diff --git a/data/images/16x16/busy.png b/data/images/16x16/busy.png
new file mode 100644
index 0000000..28eff29
--- /dev/null
+++ b/data/images/16x16/busy.png
Binary files differ
diff --git a/data/images/16x16/cancel.png b/data/images/16x16/cancel.png
new file mode 100644
index 0000000..25037ee
--- /dev/null
+++ b/data/images/16x16/cancel.png
Binary files differ
diff --git a/data/images/16x16/close.png b/data/images/16x16/close.png
new file mode 100644
index 0000000..9197dc0
--- /dev/null
+++ b/data/images/16x16/close.png
Binary files differ
diff --git a/data/images/16x16/down.png b/data/images/16x16/down.png
new file mode 100644
index 0000000..2dd28e9
--- /dev/null
+++ b/data/images/16x16/down.png
Binary files differ
diff --git a/data/images/16x16/down_user.png b/data/images/16x16/down_user.png
new file mode 100644
index 0000000..ee0687c
--- /dev/null
+++ b/data/images/16x16/down_user.png
Binary files differ
diff --git a/data/images/16x16/download.png b/data/images/16x16/download.png
new file mode 100644
index 0000000..5fe7c85
--- /dev/null
+++ b/data/images/16x16/download.png
Binary files differ
diff --git a/data/images/16x16/edit.png b/data/images/16x16/edit.png
new file mode 100644
index 0000000..fc1dd04
--- /dev/null
+++ b/data/images/16x16/edit.png
Binary files differ
diff --git a/data/images/16x16/error.png b/data/images/16x16/error.png
new file mode 100644
index 0000000..5ad0f3e
--- /dev/null
+++ b/data/images/16x16/error.png
Binary files differ
diff --git a/data/images/16x16/fab.png b/data/images/16x16/fab.png
new file mode 100644
index 0000000..9d2d500
--- /dev/null
+++ b/data/images/16x16/fab.png
Binary files differ
diff --git a/data/images/16x16/fax.png b/data/images/16x16/fax.png
new file mode 100644
index 0000000..e02406e
--- /dev/null
+++ b/data/images/16x16/fax.png
Binary files differ
diff --git a/data/images/16x16/folder_open.png b/data/images/16x16/folder_open.png
new file mode 100644
index 0000000..2c3650e
--- /dev/null
+++ b/data/images/16x16/folder_open.png
Binary files differ
diff --git a/data/images/16x16/folder_remove.png b/data/images/16x16/folder_remove.png
new file mode 100644
index 0000000..d78b54e
--- /dev/null
+++ b/data/images/16x16/folder_remove.png
Binary files differ
diff --git a/data/images/16x16/help.png b/data/images/16x16/help.png
new file mode 100644
index 0000000..f25fc3f
--- /dev/null
+++ b/data/images/16x16/help.png
Binary files differ
diff --git a/data/images/16x16/hp_logo.png b/data/images/16x16/hp_logo.png
new file mode 100755
index 0000000..57f0307
--- /dev/null
+++ b/data/images/16x16/hp_logo.png
Binary files differ
diff --git a/data/images/16x16/idle.png b/data/images/16x16/idle.png
new file mode 100644
index 0000000..08b9c9d
--- /dev/null
+++ b/data/images/16x16/idle.png
Binary files differ
diff --git a/data/images/16x16/info.png b/data/images/16x16/info.png
new file mode 100644
index 0000000..b8ad505
--- /dev/null
+++ b/data/images/16x16/info.png
Binary files differ
diff --git a/data/images/16x16/inkdrop.png b/data/images/16x16/inkdrop.png
new file mode 100644
index 0000000..1bb75bd
--- /dev/null
+++ b/data/images/16x16/inkdrop.png
Binary files differ
diff --git a/data/images/16x16/list_add.png b/data/images/16x16/list_add.png
new file mode 100644
index 0000000..6332fef
--- /dev/null
+++ b/data/images/16x16/list_add.png
Binary files differ
diff --git a/data/images/16x16/list_remove.png b/data/images/16x16/list_remove.png
new file mode 100644
index 0000000..08f2493
--- /dev/null
+++ b/data/images/16x16/list_remove.png
Binary files differ
diff --git a/data/images/16x16/makecopies.png b/data/images/16x16/makecopies.png
new file mode 100644
index 0000000..f8c27bc
--- /dev/null
+++ b/data/images/16x16/makecopies.png
Binary files differ
diff --git a/data/images/16x16/mimetypes.png b/data/images/16x16/mimetypes.png
new file mode 100644
index 0000000..d195268
--- /dev/null
+++ b/data/images/16x16/mimetypes.png
Binary files differ
diff --git a/data/images/16x16/minus.png b/data/images/16x16/minus.png
new file mode 100644
index 0000000..7b4defe
--- /dev/null
+++ b/data/images/16x16/minus.png
Binary files differ
diff --git a/data/images/16x16/next.png b/data/images/16x16/next.png
new file mode 100644
index 0000000..70cfd5f
--- /dev/null
+++ b/data/images/16x16/next.png
Binary files differ
diff --git a/data/images/16x16/ok.png b/data/images/16x16/ok.png
new file mode 100644
index 0000000..d90fdc9
--- /dev/null
+++ b/data/images/16x16/ok.png
Binary files differ
diff --git a/data/images/16x16/paper.png b/data/images/16x16/paper.png
new file mode 100644
index 0000000..92b95a2
--- /dev/null
+++ b/data/images/16x16/paper.png
Binary files differ
diff --git a/data/images/16x16/pcard.png b/data/images/16x16/pcard.png
new file mode 100644
index 0000000..e01fb5b
--- /dev/null
+++ b/data/images/16x16/pcard.png
Binary files differ
diff --git a/data/images/16x16/plus.png b/data/images/16x16/plus.png
new file mode 100644
index 0000000..1d92647
--- /dev/null
+++ b/data/images/16x16/plus.png
Binary files differ
diff --git a/data/images/16x16/prev.png b/data/images/16x16/prev.png
new file mode 100644
index 0000000..5b07c5e
--- /dev/null
+++ b/data/images/16x16/prev.png
Binary files differ
diff --git a/data/images/16x16/print.png b/data/images/16x16/print.png
new file mode 100644
index 0000000..a350d18
--- /dev/null
+++ b/data/images/16x16/print.png
Binary files differ
diff --git a/data/images/16x16/quit.png b/data/images/16x16/quit.png
new file mode 100644
index 0000000..a77152b
--- /dev/null
+++ b/data/images/16x16/quit.png
Binary files differ
diff --git a/data/images/16x16/refresh.png b/data/images/16x16/refresh.png
new file mode 100644
index 0000000..0de2656
--- /dev/null
+++ b/data/images/16x16/refresh.png
Binary files differ
diff --git a/data/images/16x16/refresh1.png b/data/images/16x16/refresh1.png
new file mode 100644
index 0000000..041ae56
--- /dev/null
+++ b/data/images/16x16/refresh1.png
Binary files differ
diff --git a/data/images/16x16/remove_user.png b/data/images/16x16/remove_user.png
new file mode 100644
index 0000000..062e7a5
--- /dev/null
+++ b/data/images/16x16/remove_user.png
Binary files differ
diff --git a/data/images/16x16/scan.png b/data/images/16x16/scan.png
new file mode 100644
index 0000000..c4d24f6
--- /dev/null
+++ b/data/images/16x16/scan.png
Binary files differ
diff --git a/data/images/16x16/settings.png b/data/images/16x16/settings.png
new file mode 100644
index 0000000..04663b1
--- /dev/null
+++ b/data/images/16x16/settings.png
Binary files differ
diff --git a/data/images/16x16/status_refresh.png b/data/images/16x16/status_refresh.png
new file mode 100644
index 0000000..0de2656
--- /dev/null
+++ b/data/images/16x16/status_refresh.png
Binary files differ
diff --git a/data/images/16x16/thumbnail.png b/data/images/16x16/thumbnail.png
new file mode 100644
index 0000000..60af7d2
--- /dev/null
+++ b/data/images/16x16/thumbnail.png
Binary files differ
diff --git a/data/images/16x16/toner.png b/data/images/16x16/toner.png
new file mode 100644
index 0000000..3644f4c
--- /dev/null
+++ b/data/images/16x16/toner.png
Binary files differ
diff --git a/data/images/16x16/up.png b/data/images/16x16/up.png
new file mode 100644
index 0000000..c6bd1fb
--- /dev/null
+++ b/data/images/16x16/up.png
Binary files differ
diff --git a/data/images/16x16/up_user.png b/data/images/16x16/up_user.png
new file mode 100644
index 0000000..69afffe
--- /dev/null
+++ b/data/images/16x16/up_user.png
Binary files differ
diff --git a/data/images/16x16/warning.png b/data/images/16x16/warning.png
new file mode 100644
index 0000000..f2e1a82
--- /dev/null
+++ b/data/images/16x16/warning.png
Binary files differ
diff --git a/data/images/24x24/add_to_group.png b/data/images/24x24/add_to_group.png
new file mode 100644
index 0000000..97f8896
--- /dev/null
+++ b/data/images/24x24/add_to_group.png
Binary files differ
diff --git a/data/images/24x24/new_group.png b/data/images/24x24/new_group.png
new file mode 100644
index 0000000..2562343
--- /dev/null
+++ b/data/images/24x24/new_group.png
Binary files differ
diff --git a/data/images/24x24/new_group_from_selection.png b/data/images/24x24/new_group_from_selection.png
new file mode 100644
index 0000000..a8b98a2
--- /dev/null
+++ b/data/images/24x24/new_group_from_selection.png
Binary files differ
diff --git a/data/images/24x24/new_user.png b/data/images/24x24/new_user.png
new file mode 100644
index 0000000..67bc3ed
--- /dev/null
+++ b/data/images/24x24/new_user.png
Binary files differ
diff --git a/data/images/24x24/remove_from_group.png b/data/images/24x24/remove_from_group.png
new file mode 100644
index 0000000..fa2fcb3
--- /dev/null
+++ b/data/images/24x24/remove_from_group.png
Binary files differ
diff --git a/data/images/24x24/remove_group.png b/data/images/24x24/remove_group.png
new file mode 100644
index 0000000..904dad8
--- /dev/null
+++ b/data/images/24x24/remove_group.png
Binary files differ
diff --git a/data/images/24x24/remove_user.png b/data/images/24x24/remove_user.png
new file mode 100644
index 0000000..753fd49
--- /dev/null
+++ b/data/images/24x24/remove_user.png
Binary files differ
diff --git a/data/images/24x24/rename_group.png b/data/images/24x24/rename_group.png
new file mode 100644
index 0000000..3e5e471
--- /dev/null
+++ b/data/images/24x24/rename_group.png
Binary files differ
diff --git a/data/images/256x256/hp_logo.png b/data/images/256x256/hp_logo.png
new file mode 100755
index 0000000..57401d1
--- /dev/null
+++ b/data/images/256x256/hp_logo.png
Binary files differ
diff --git a/data/images/256x256/logo.png b/data/images/256x256/logo.png
new file mode 100755
index 0000000..57401d1
--- /dev/null
+++ b/data/images/256x256/logo.png
Binary files differ
diff --git a/data/images/32x32/align.png b/data/images/32x32/align.png
new file mode 100644
index 0000000..77cc5a3
--- /dev/null
+++ b/data/images/32x32/align.png
Binary files differ
diff --git a/data/images/32x32/battery.png b/data/images/32x32/battery.png
new file mode 100644
index 0000000..2c8a313
--- /dev/null
+++ b/data/images/32x32/battery.png
Binary files differ
diff --git a/data/images/32x32/busy.png b/data/images/32x32/busy.png
new file mode 100644
index 0000000..37e50bf
--- /dev/null
+++ b/data/images/32x32/busy.png
Binary files differ
diff --git a/data/images/32x32/clean.png b/data/images/32x32/clean.png
new file mode 100644
index 0000000..5405be4
--- /dev/null
+++ b/data/images/32x32/clean.png
Binary files differ
diff --git a/data/images/32x32/colorcal.png b/data/images/32x32/colorcal.png
new file mode 100644
index 0000000..9473066
--- /dev/null
+++ b/data/images/32x32/colorcal.png
Binary files differ
diff --git a/data/images/32x32/cups.png b/data/images/32x32/cups.png
new file mode 100644
index 0000000..1f42b86
--- /dev/null
+++ b/data/images/32x32/cups.png
Binary files differ
diff --git a/data/images/32x32/download.png b/data/images/32x32/download.png
new file mode 100644
index 0000000..0fb93ef
--- /dev/null
+++ b/data/images/32x32/download.png
Binary files differ
diff --git a/data/images/32x32/error.png b/data/images/32x32/error.png
new file mode 100644
index 0000000..1de7a6f
--- /dev/null
+++ b/data/images/32x32/error.png
Binary files differ
diff --git a/data/images/32x32/ews.png b/data/images/32x32/ews.png
new file mode 100644
index 0000000..27976e8
--- /dev/null
+++ b/data/images/32x32/ews.png
Binary files differ
diff --git a/data/images/32x32/fab.png b/data/images/32x32/fab.png
new file mode 100644
index 0000000..f97a47d
--- /dev/null
+++ b/data/images/32x32/fab.png
Binary files differ
diff --git a/data/images/32x32/fax-disabled.png b/data/images/32x32/fax-disabled.png
new file mode 100644
index 0000000..50d2782
--- /dev/null
+++ b/data/images/32x32/fax-disabled.png
Binary files differ
diff --git a/data/images/32x32/fax.png b/data/images/32x32/fax.png
new file mode 100644
index 0000000..00e83ea
--- /dev/null
+++ b/data/images/32x32/fax.png
Binary files differ
diff --git a/data/images/32x32/fax_machine.png b/data/images/32x32/fax_machine.png
new file mode 100644
index 0000000..b4860a7
--- /dev/null
+++ b/data/images/32x32/fax_machine.png
Binary files differ
diff --git a/data/images/32x32/fax_setup.png b/data/images/32x32/fax_setup.png
new file mode 100644
index 0000000..4911adf
--- /dev/null
+++ b/data/images/32x32/fax_setup.png
Binary files differ
diff --git a/data/images/32x32/firmware.png b/data/images/32x32/firmware.png
new file mode 100644
index 0000000..023837e
--- /dev/null
+++ b/data/images/32x32/firmware.png
Binary files differ
diff --git a/data/images/32x32/help.png b/data/images/32x32/help.png
new file mode 100644
index 0000000..d60425f
--- /dev/null
+++ b/data/images/32x32/help.png
Binary files differ
diff --git a/data/images/32x32/hp_logo.png b/data/images/32x32/hp_logo.png
new file mode 100755
index 0000000..f706319
--- /dev/null
+++ b/data/images/32x32/hp_logo.png
Binary files differ
diff --git a/data/images/32x32/idle.png b/data/images/32x32/idle.png
new file mode 100644
index 0000000..ace989d
--- /dev/null
+++ b/data/images/32x32/idle.png
Binary files differ
diff --git a/data/images/32x32/info.png b/data/images/32x32/info.png
new file mode 100644
index 0000000..454a71d
--- /dev/null
+++ b/data/images/32x32/info.png
Binary files differ
diff --git a/data/images/32x32/inkdrop.png b/data/images/32x32/inkdrop.png
new file mode 100644
index 0000000..3787392
--- /dev/null
+++ b/data/images/32x32/inkdrop.png
Binary files differ
diff --git a/data/images/32x32/keys.png b/data/images/32x32/keys.png
new file mode 100644
index 0000000..0fbad90
--- /dev/null
+++ b/data/images/32x32/keys.png
Binary files differ
diff --git a/data/images/32x32/linefeed_cal.png b/data/images/32x32/linefeed_cal.png
new file mode 100644
index 0000000..f4311b7
--- /dev/null
+++ b/data/images/32x32/linefeed_cal.png
Binary files differ
diff --git a/data/images/32x32/lock.png b/data/images/32x32/lock.png
new file mode 100644
index 0000000..7c30072
--- /dev/null
+++ b/data/images/32x32/lock.png
Binary files differ
diff --git a/data/images/32x32/lporg.png b/data/images/32x32/lporg.png
new file mode 100644
index 0000000..05a591d
--- /dev/null
+++ b/data/images/32x32/lporg.png
Binary files differ
diff --git a/data/images/32x32/makecopies-disabled.png b/data/images/32x32/makecopies-disabled.png
new file mode 100644
index 0000000..a9348f9
--- /dev/null
+++ b/data/images/32x32/makecopies-disabled.png
Binary files differ
diff --git a/data/images/32x32/makecopies.png b/data/images/32x32/makecopies.png
new file mode 100644
index 0000000..51ef85e
--- /dev/null
+++ b/data/images/32x32/makecopies.png
Binary files differ
diff --git a/data/images/32x32/ok.png b/data/images/32x32/ok.png
new file mode 100644
index 0000000..22bb2fd
--- /dev/null
+++ b/data/images/32x32/ok.png
Binary files differ
diff --git a/data/images/32x32/paper.png b/data/images/32x32/paper.png
new file mode 100644
index 0000000..463971a
--- /dev/null
+++ b/data/images/32x32/paper.png
Binary files differ
diff --git a/data/images/32x32/pcard-disabled.png b/data/images/32x32/pcard-disabled.png
new file mode 100644
index 0000000..fc7f147
--- /dev/null
+++ b/data/images/32x32/pcard-disabled.png
Binary files differ
diff --git a/data/images/32x32/pcard.png b/data/images/32x32/pcard.png
new file mode 100644
index 0000000..4768479
--- /dev/null
+++ b/data/images/32x32/pcard.png
Binary files differ
diff --git a/data/images/32x32/plugin.png b/data/images/32x32/plugin.png
new file mode 100644
index 0000000..bafe9bf
--- /dev/null
+++ b/data/images/32x32/plugin.png
Binary files differ
diff --git a/data/images/32x32/pq_diag.png b/data/images/32x32/pq_diag.png
new file mode 100644
index 0000000..393fbd3
--- /dev/null
+++ b/data/images/32x32/pq_diag.png
Binary files differ
diff --git a/data/images/32x32/print-disabled.png b/data/images/32x32/print-disabled.png
new file mode 100644
index 0000000..72433b4
--- /dev/null
+++ b/data/images/32x32/print-disabled.png
Binary files differ
diff --git a/data/images/32x32/print.png b/data/images/32x32/print.png
new file mode 100644
index 0000000..e831921
--- /dev/null
+++ b/data/images/32x32/print.png
Binary files differ
diff --git a/data/images/32x32/scan-disabled.png b/data/images/32x32/scan-disabled.png
new file mode 100644
index 0000000..ff53068
--- /dev/null
+++ b/data/images/32x32/scan-disabled.png
Binary files differ
diff --git a/data/images/32x32/scan.png b/data/images/32x32/scan.png
new file mode 100644
index 0000000..1262e1e
--- /dev/null
+++ b/data/images/32x32/scan.png
Binary files differ
diff --git a/data/images/32x32/settings.png b/data/images/32x32/settings.png
new file mode 100644
index 0000000..d6d079b
--- /dev/null
+++ b/data/images/32x32/settings.png
Binary files differ
diff --git a/data/images/32x32/testpage.png b/data/images/32x32/testpage.png
new file mode 100644
index 0000000..4e79aa6
--- /dev/null
+++ b/data/images/32x32/testpage.png
Binary files differ
diff --git a/data/images/32x32/toner.png b/data/images/32x32/toner.png
new file mode 100644
index 0000000..63e0c3c
--- /dev/null
+++ b/data/images/32x32/toner.png
Binary files differ
diff --git a/data/images/32x32/toner_cartridge.png b/data/images/32x32/toner_cartridge.png
new file mode 100644
index 0000000..d2d36ed
--- /dev/null
+++ b/data/images/32x32/toner_cartridge.png
Binary files differ
diff --git a/data/images/32x32/warning.png b/data/images/32x32/warning.png
new file mode 100644
index 0000000..d83f349
--- /dev/null
+++ b/data/images/32x32/warning.png
Binary files differ
diff --git a/data/images/32x32/wireless.png b/data/images/32x32/wireless.png
new file mode 100644
index 0000000..e878b28
--- /dev/null
+++ b/data/images/32x32/wireless.png
Binary files differ
diff --git a/data/images/64x64/hp_logo.png b/data/images/64x64/hp_logo.png
new file mode 100755
index 0000000..4aeb721
--- /dev/null
+++ b/data/images/64x64/hp_logo.png
Binary files differ
diff --git a/data/images/devices/120.png b/data/images/devices/120.png
new file mode 100644
index 0000000..a094671
--- /dev/null
+++ b/data/images/devices/120.png
Binary files differ
diff --git a/data/images/devices/COLOR_INKJET_PRINTER_CP1700.png b/data/images/devices/COLOR_INKJET_PRINTER_CP1700.png
new file mode 100644
index 0000000..d482199
--- /dev/null
+++ b/data/images/devices/COLOR_INKJET_PRINTER_CP1700.png
Binary files differ
diff --git a/data/images/devices/CP_1700.png b/data/images/devices/CP_1700.png
new file mode 100644
index 0000000..48a8c84
--- /dev/null
+++ b/data/images/devices/CP_1700.png
Binary files differ
diff --git a/data/images/devices/DESKJET_1120C.png b/data/images/devices/DESKJET_1120C.png
new file mode 100644
index 0000000..ff948bf
--- /dev/null
+++ b/data/images/devices/DESKJET_1120C.png
Binary files differ
diff --git a/data/images/devices/DESKJET_1220C.png b/data/images/devices/DESKJET_1220C.png
new file mode 100644
index 0000000..7937ac7
--- /dev/null
+++ b/data/images/devices/DESKJET_1220C.png
Binary files differ
diff --git a/data/images/devices/DESKJET_2500C.png b/data/images/devices/DESKJET_2500C.png
new file mode 100644
index 0000000..441a2f4
--- /dev/null
+++ b/data/images/devices/DESKJET_2500C.png
Binary files differ
diff --git a/data/images/devices/DESKJET_3820.png b/data/images/devices/DESKJET_3820.png
new file mode 100644
index 0000000..06d0995
--- /dev/null
+++ b/data/images/devices/DESKJET_3820.png
Binary files differ
diff --git a/data/images/devices/DESKJET_5740.png b/data/images/devices/DESKJET_5740.png
new file mode 100644
index 0000000..016eef8
--- /dev/null
+++ b/data/images/devices/DESKJET_5740.png
Binary files differ
diff --git a/data/images/devices/DESKJET_610.png b/data/images/devices/DESKJET_610.png
new file mode 100644
index 0000000..4f665b1
--- /dev/null
+++ b/data/images/devices/DESKJET_610.png
Binary files differ
diff --git a/data/images/devices/DESKJET_630C.png b/data/images/devices/DESKJET_630C.png
new file mode 100644
index 0000000..9ab17ba
--- /dev/null
+++ b/data/images/devices/DESKJET_630C.png
Binary files differ
diff --git a/data/images/devices/DESKJET_650C.png b/data/images/devices/DESKJET_650C.png
new file mode 100644
index 0000000..b7ff364
--- /dev/null
+++ b/data/images/devices/DESKJET_650C.png
Binary files differ
diff --git a/data/images/devices/DESKJET_840C.png b/data/images/devices/DESKJET_840C.png
new file mode 100644
index 0000000..a5e145e
--- /dev/null
+++ b/data/images/devices/DESKJET_840C.png
Binary files differ
diff --git a/data/images/devices/DESKJET_916C.png b/data/images/devices/DESKJET_916C.png
new file mode 100644
index 0000000..58a16c4
--- /dev/null
+++ b/data/images/devices/DESKJET_916C.png
Binary files differ
diff --git a/data/images/devices/DESKJET_9600.png b/data/images/devices/DESKJET_9600.png
new file mode 100644
index 0000000..72e2df4
--- /dev/null
+++ b/data/images/devices/DESKJET_9600.png
Binary files differ
diff --git a/data/images/devices/DESKJET_960C.png b/data/images/devices/DESKJET_960C.png
new file mode 100644
index 0000000..f91b0a1
--- /dev/null
+++ b/data/images/devices/DESKJET_960C.png
Binary files differ
diff --git a/data/images/devices/DESKJET_970C.png b/data/images/devices/DESKJET_970C.png
new file mode 100644
index 0000000..de3354c
--- /dev/null
+++ b/data/images/devices/DESKJET_970C.png
Binary files differ
diff --git a/data/images/devices/DESKJET_990C.png b/data/images/devices/DESKJET_990C.png
new file mode 100644
index 0000000..6263051
--- /dev/null
+++ b/data/images/devices/DESKJET_990C.png
Binary files differ
diff --git a/data/images/devices/DESKJET_995C.png b/data/images/devices/DESKJET_995C.png
new file mode 100644
index 0000000..8e7f0ca
--- /dev/null
+++ b/data/images/devices/DESKJET_995C.png
Binary files differ
diff --git a/data/images/devices/Deskjet_3740.png b/data/images/devices/Deskjet_3740.png
new file mode 100644
index 0000000..53a3361
--- /dev/null
+++ b/data/images/devices/Deskjet_3740.png
Binary files differ
diff --git a/data/images/devices/Deskjet_5400_series.png b/data/images/devices/Deskjet_5400_series.png
new file mode 100644
index 0000000..92a1cb7
--- /dev/null
+++ b/data/images/devices/Deskjet_5400_series.png
Binary files differ
diff --git a/data/images/devices/Deskjet_5700.png b/data/images/devices/Deskjet_5700.png
new file mode 100644
index 0000000..0f362ae
--- /dev/null
+++ b/data/images/devices/Deskjet_5700.png
Binary files differ
diff --git a/data/images/devices/Deskjet_5900_series.png b/data/images/devices/Deskjet_5900_series.png
new file mode 100644
index 0000000..b8b1c06
--- /dev/null
+++ b/data/images/devices/Deskjet_5900_series.png
Binary files differ
diff --git a/data/images/devices/Deskjet_6500.png b/data/images/devices/Deskjet_6500.png
new file mode 100644
index 0000000..8d327dd
--- /dev/null
+++ b/data/images/devices/Deskjet_6500.png
Binary files differ
diff --git a/data/images/devices/Deskjet_6800.png b/data/images/devices/Deskjet_6800.png
new file mode 100644
index 0000000..7b069a6
--- /dev/null
+++ b/data/images/devices/Deskjet_6800.png
Binary files differ
diff --git a/data/images/devices/HP_2000C.png b/data/images/devices/HP_2000C.png
new file mode 100644
index 0000000..4eb8132
--- /dev/null
+++ b/data/images/devices/HP_2000C.png
Binary files differ
diff --git a/data/images/devices/HP_2500C.png b/data/images/devices/HP_2500C.png
new file mode 100644
index 0000000..6e4b4fc
--- /dev/null
+++ b/data/images/devices/HP_2500C.png
Binary files differ
diff --git a/data/images/devices/HP_BI_3000.png b/data/images/devices/HP_BI_3000.png
new file mode 100644
index 0000000..4eb1876
--- /dev/null
+++ b/data/images/devices/HP_BI_3000.png
Binary files differ
diff --git a/data/images/devices/HP_Business_Inkjet_1200.png b/data/images/devices/HP_Business_Inkjet_1200.png
new file mode 100644
index 0000000..33b1fcb
--- /dev/null
+++ b/data/images/devices/HP_Business_Inkjet_1200.png
Binary files differ
diff --git a/data/images/devices/HP_Color_LaserJet_1500.png b/data/images/devices/HP_Color_LaserJet_1500.png
new file mode 100644
index 0000000..815ca86
--- /dev/null
+++ b/data/images/devices/HP_Color_LaserJet_1500.png
Binary files differ
diff --git a/data/images/devices/HP_Color_LaserJet_2840.png b/data/images/devices/HP_Color_LaserJet_2840.png
new file mode 100644
index 0000000..33e012c
--- /dev/null
+++ b/data/images/devices/HP_Color_LaserJet_2840.png
Binary files differ
diff --git a/data/images/devices/HP_Color_LaserJet_4500.png b/data/images/devices/HP_Color_LaserJet_4500.png
new file mode 100644
index 0000000..85fd172
--- /dev/null
+++ b/data/images/devices/HP_Color_LaserJet_4500.png
Binary files differ
diff --git a/data/images/devices/HP_Color_LaserJet_4730mfp.png b/data/images/devices/HP_Color_LaserJet_4730mfp.png
new file mode 100644
index 0000000..1f99af1
--- /dev/null
+++ b/data/images/devices/HP_Color_LaserJet_4730mfp.png
Binary files differ
diff --git a/data/images/devices/HP_Color_LaserJet_8550.png b/data/images/devices/HP_Color_LaserJet_8550.png
new file mode 100644
index 0000000..322930c
--- /dev/null
+++ b/data/images/devices/HP_Color_LaserJet_8550.png
Binary files differ
diff --git a/data/images/devices/HP_LJ1xxx.png b/data/images/devices/HP_LJ1xxx.png
new file mode 100644
index 0000000..1d3e6fe
--- /dev/null
+++ b/data/images/devices/HP_LJ1xxx.png
Binary files differ
diff --git a/data/images/devices/HP_LaserJet_1012.png b/data/images/devices/HP_LaserJet_1012.png
new file mode 100644
index 0000000..37ba31d
--- /dev/null
+++ b/data/images/devices/HP_LaserJet_1012.png
Binary files differ
diff --git a/data/images/devices/HP_LaserJet_1220.png b/data/images/devices/HP_LaserJet_1220.png
new file mode 100644
index 0000000..ef4165c
--- /dev/null
+++ b/data/images/devices/HP_LaserJet_1220.png
Binary files differ
diff --git a/data/images/devices/HP_LaserJet_3200M.png b/data/images/devices/HP_LaserJet_3200M.png
new file mode 100644
index 0000000..9346f6c
--- /dev/null
+++ b/data/images/devices/HP_LaserJet_3200M.png
Binary files differ
diff --git a/data/images/devices/HP_LaserJet_3300_3310_3320.png b/data/images/devices/HP_LaserJet_3300_3310_3320.png
new file mode 100644
index 0000000..ad8d121
--- /dev/null
+++ b/data/images/devices/HP_LaserJet_3300_3310_3320.png
Binary files differ
diff --git a/data/images/devices/HP_LaserJet_4000.png b/data/images/devices/HP_LaserJet_4000.png
new file mode 100644
index 0000000..287a871
--- /dev/null
+++ b/data/images/devices/HP_LaserJet_4000.png
Binary files differ
diff --git a/data/images/devices/HP_LaserJet_4100_MFP.png b/data/images/devices/HP_LaserJet_4100_MFP.png
new file mode 100644
index 0000000..a678694
--- /dev/null
+++ b/data/images/devices/HP_LaserJet_4100_MFP.png
Binary files differ
diff --git a/data/images/devices/HP_LaserJet_4M.png b/data/images/devices/HP_LaserJet_4M.png
new file mode 100644
index 0000000..d8c54a9
--- /dev/null
+++ b/data/images/devices/HP_LaserJet_4M.png
Binary files differ
diff --git a/data/images/devices/HP_LaserJet_5Si.png b/data/images/devices/HP_LaserJet_5Si.png
new file mode 100644
index 0000000..176f40a
--- /dev/null
+++ b/data/images/devices/HP_LaserJet_5Si.png
Binary files differ
diff --git a/data/images/devices/HP_LaserJet_6MP.png b/data/images/devices/HP_LaserJet_6MP.png
new file mode 100644
index 0000000..43fb52a
--- /dev/null
+++ b/data/images/devices/HP_LaserJet_6MP.png
Binary files differ
diff --git a/data/images/devices/HP_LaserJet_8100_Series.png b/data/images/devices/HP_LaserJet_8100_Series.png
new file mode 100644
index 0000000..feed28d
--- /dev/null
+++ b/data/images/devices/HP_LaserJet_8100_Series.png
Binary files differ
diff --git a/data/images/devices/HP_LaserJet_9000_MFP.png b/data/images/devices/HP_LaserJet_9000_MFP.png
new file mode 100644
index 0000000..c6ec3d9
--- /dev/null
+++ b/data/images/devices/HP_LaserJet_9000_MFP.png
Binary files differ
diff --git a/data/images/devices/HP_LaserJet_9040_MFP.png b/data/images/devices/HP_LaserJet_9040_MFP.png
new file mode 100644
index 0000000..2413749
--- /dev/null
+++ b/data/images/devices/HP_LaserJet_9040_MFP.png
Binary files differ
diff --git a/data/images/devices/HP_LaserJet_9500dn.png b/data/images/devices/HP_LaserJet_9500dn.png
new file mode 100644
index 0000000..d228609
--- /dev/null
+++ b/data/images/devices/HP_LaserJet_9500dn.png
Binary files differ
diff --git a/data/images/devices/HP_LaserJet_m1005.png b/data/images/devices/HP_LaserJet_m1005.png
new file mode 100644
index 0000000..a3045fc
--- /dev/null
+++ b/data/images/devices/HP_LaserJet_m1005.png
Binary files differ
diff --git a/data/images/devices/HP_LaserJet_m1522.png b/data/images/devices/HP_LaserJet_m1522.png
new file mode 100644
index 0000000..b2b33ec
--- /dev/null
+++ b/data/images/devices/HP_LaserJet_m1522.png
Binary files differ
diff --git a/data/images/devices/HP_Officejet_Pro_L7700.png b/data/images/devices/HP_Officejet_Pro_L7700.png
new file mode 100644
index 0000000..06315a9
--- /dev/null
+++ b/data/images/devices/HP_Officejet_Pro_L7700.png
Binary files differ
diff --git a/data/images/devices/LASERJET_3500.png b/data/images/devices/LASERJET_3500.png
new file mode 100644
index 0000000..0b2bfa2
--- /dev/null
+++ b/data/images/devices/LASERJET_3500.png
Binary files differ
diff --git a/data/images/devices/LASERJET_4650.png b/data/images/devices/LASERJET_4650.png
new file mode 100644
index 0000000..b4f11bb
--- /dev/null
+++ b/data/images/devices/LASERJET_4650.png
Binary files differ
diff --git a/data/images/devices/LASERJET_4650dtn.png b/data/images/devices/LASERJET_4650dtn.png
new file mode 100644
index 0000000..5350618
--- /dev/null
+++ b/data/images/devices/LASERJET_4650dtn.png
Binary files differ
diff --git a/data/images/devices/LASERJET_5500.png b/data/images/devices/LASERJET_5500.png
new file mode 100644
index 0000000..0a2d2f0
--- /dev/null
+++ b/data/images/devices/LASERJET_5500.png
Binary files differ
diff --git a/data/images/devices/LASERJET_5500dtn.png b/data/images/devices/LASERJET_5500dtn.png
new file mode 100644
index 0000000..20809dd
--- /dev/null
+++ b/data/images/devices/LASERJET_5500dtn.png
Binary files differ
diff --git a/data/images/devices/LASERJET_5550.png b/data/images/devices/LASERJET_5550.png
new file mode 100644
index 0000000..e063a50
--- /dev/null
+++ b/data/images/devices/LASERJET_5550.png
Binary files differ
diff --git a/data/images/devices/LASERJET_5550DTN.png b/data/images/devices/LASERJET_5550DTN.png
new file mode 100644
index 0000000..228ee8a
--- /dev/null
+++ b/data/images/devices/LASERJET_5550DTN.png
Binary files differ
diff --git a/data/images/devices/OFFICEJET_PRO_1150C.png b/data/images/devices/OFFICEJET_PRO_1150C.png
new file mode 100644
index 0000000..4d8db25
--- /dev/null
+++ b/data/images/devices/OFFICEJET_PRO_1150C.png
Binary files differ
diff --git a/data/images/devices/OfficeJet_5105.png b/data/images/devices/OfficeJet_5105.png
new file mode 100644
index 0000000..7a69fad
--- /dev/null
+++ b/data/images/devices/OfficeJet_5105.png
Binary files differ
diff --git a/data/images/devices/OfficeJet_6100_Series.png b/data/images/devices/OfficeJet_6100_Series.png
new file mode 100644
index 0000000..dfeebd4
--- /dev/null
+++ b/data/images/devices/OfficeJet_6100_Series.png
Binary files differ
diff --git a/data/images/devices/OfficeJet_8500_a910.png b/data/images/devices/OfficeJet_8500_a910.png
new file mode 100644
index 0000000..06e7403
--- /dev/null
+++ b/data/images/devices/OfficeJet_8500_a910.png
Binary files differ
diff --git a/data/images/devices/OfficeJet_G85.png b/data/images/devices/OfficeJet_G85.png
new file mode 100644
index 0000000..db30ec6
--- /dev/null
+++ b/data/images/devices/OfficeJet_G85.png
Binary files differ
diff --git a/data/images/devices/OfficeJet_Series_300.png b/data/images/devices/OfficeJet_Series_300.png
new file mode 100644
index 0000000..931bc34
--- /dev/null
+++ b/data/images/devices/OfficeJet_Series_300.png
Binary files differ
diff --git a/data/images/devices/Officejet_6150_Series.png b/data/images/devices/Officejet_6150_Series.png
new file mode 100644
index 0000000..d384826
--- /dev/null
+++ b/data/images/devices/Officejet_6150_Series.png
Binary files differ
diff --git a/data/images/devices/Officejet_6200_series.png b/data/images/devices/Officejet_6200_series.png
new file mode 100644
index 0000000..c7a4b7d
--- /dev/null
+++ b/data/images/devices/Officejet_6200_series.png
Binary files differ
diff --git a/data/images/devices/Officejet_7200_series.png b/data/images/devices/Officejet_7200_series.png
new file mode 100644
index 0000000..9f47ad4
--- /dev/null
+++ b/data/images/devices/Officejet_7200_series.png
Binary files differ
diff --git a/data/images/devices/Officejet_9100_series.png b/data/images/devices/Officejet_9100_series.png
new file mode 100644
index 0000000..c5924ae
--- /dev/null
+++ b/data/images/devices/Officejet_9100_series.png
Binary files differ
diff --git a/data/images/devices/PHOTOSMART_100.png b/data/images/devices/PHOTOSMART_100.png
new file mode 100644
index 0000000..96d4596
--- /dev/null
+++ b/data/images/devices/PHOTOSMART_100.png
Binary files differ
diff --git a/data/images/devices/PHOTOSMART_1218.png b/data/images/devices/PHOTOSMART_1218.png
new file mode 100644
index 0000000..fccfc34
--- /dev/null
+++ b/data/images/devices/PHOTOSMART_1218.png
Binary files differ
diff --git a/data/images/devices/PHOTOSMART_1315.png b/data/images/devices/PHOTOSMART_1315.png
new file mode 100644
index 0000000..68732b8
--- /dev/null
+++ b/data/images/devices/PHOTOSMART_1315.png
Binary files differ
diff --git a/data/images/devices/PHOTOSMART_P1100.png b/data/images/devices/PHOTOSMART_P1100.png
new file mode 100644
index 0000000..4004866
--- /dev/null
+++ b/data/images/devices/PHOTOSMART_P1100.png
Binary files differ
diff --git a/data/images/devices/PSC_900_Series.png b/data/images/devices/PSC_900_Series.png
new file mode 100644
index 0000000..018115c
--- /dev/null
+++ b/data/images/devices/PSC_900_Series.png
Binary files differ
diff --git a/data/images/devices/Photosmart_2600_series.png b/data/images/devices/Photosmart_2600_series.png
new file mode 100644
index 0000000..2191156
--- /dev/null
+++ b/data/images/devices/Photosmart_2600_series.png
Binary files differ
diff --git a/data/images/devices/Photosmart_2700_series.png b/data/images/devices/Photosmart_2700_series.png
new file mode 100644
index 0000000..bb0fa95
--- /dev/null
+++ b/data/images/devices/Photosmart_2700_series.png
Binary files differ
diff --git a/data/images/devices/Photosmart_3300_series.png b/data/images/devices/Photosmart_3300_series.png
new file mode 100644
index 0000000..40db57c
--- /dev/null
+++ b/data/images/devices/Photosmart_3300_series.png
Binary files differ
diff --git a/data/images/devices/Photosmart_370_series.png b/data/images/devices/Photosmart_370_series.png
new file mode 100644
index 0000000..9bd68cd
--- /dev/null
+++ b/data/images/devices/Photosmart_370_series.png
Binary files differ
diff --git a/data/images/devices/Photosmart_7400_series.png b/data/images/devices/Photosmart_7400_series.png
new file mode 100644
index 0000000..8271cad
--- /dev/null
+++ b/data/images/devices/Photosmart_7400_series.png
Binary files differ
diff --git a/data/images/devices/Photosmart_8050.png b/data/images/devices/Photosmart_8050.png
new file mode 100644
index 0000000..37eeef0
--- /dev/null
+++ b/data/images/devices/Photosmart_8050.png
Binary files differ
diff --git a/data/images/devices/Photosmart_8100_series.png b/data/images/devices/Photosmart_8100_series.png
new file mode 100644
index 0000000..b2a373f
--- /dev/null
+++ b/data/images/devices/Photosmart_8100_series.png
Binary files differ
diff --git a/data/images/devices/Photosmart_8250.png b/data/images/devices/Photosmart_8250.png
new file mode 100644
index 0000000..5869da8
--- /dev/null
+++ b/data/images/devices/Photosmart_8250.png
Binary files differ
diff --git a/data/images/devices/Photosmart_8400_series.png b/data/images/devices/Photosmart_8400_series.png
new file mode 100644
index 0000000..caf88d6
--- /dev/null
+++ b/data/images/devices/Photosmart_8400_series.png
Binary files differ
diff --git a/data/images/devices/Photosmart_8750_series.png b/data/images/devices/Photosmart_8750_series.png
new file mode 100644
index 0000000..f95c7fa
--- /dev/null
+++ b/data/images/devices/Photosmart_8750_series.png
Binary files differ
diff --git a/data/images/devices/Photosmart_C3100.png b/data/images/devices/Photosmart_C3100.png
new file mode 100644
index 0000000..fbb075c
--- /dev/null
+++ b/data/images/devices/Photosmart_C3100.png
Binary files differ
diff --git a/data/images/devices/Photosmart_C4100.png b/data/images/devices/Photosmart_C4100.png
new file mode 100644
index 0000000..dab8283
--- /dev/null
+++ b/data/images/devices/Photosmart_C4100.png
Binary files differ
diff --git a/data/images/devices/Photosmart_C5100.png b/data/images/devices/Photosmart_C5100.png
new file mode 100644
index 0000000..635a25c
--- /dev/null
+++ b/data/images/devices/Photosmart_C5100.png
Binary files differ
diff --git a/data/images/devices/Photosmart_C6100.png b/data/images/devices/Photosmart_C6100.png
new file mode 100644
index 0000000..5b3cc82
--- /dev/null
+++ b/data/images/devices/Photosmart_C6100.png
Binary files differ
diff --git a/data/images/devices/Photosmart_D5060.png b/data/images/devices/Photosmart_D5060.png
new file mode 100644
index 0000000..bc1f923
--- /dev/null
+++ b/data/images/devices/Photosmart_D5060.png
Binary files differ
diff --git a/data/images/devices/Photosmart_D5100.png b/data/images/devices/Photosmart_D5100.png
new file mode 100644
index 0000000..b0aadda
--- /dev/null
+++ b/data/images/devices/Photosmart_D5100.png
Binary files differ
diff --git a/data/images/devices/Photosmart_D6160.png b/data/images/devices/Photosmart_D6160.png
new file mode 100644
index 0000000..832a32b
--- /dev/null
+++ b/data/images/devices/Photosmart_D6160.png
Binary files differ
diff --git a/data/images/devices/Photosmart_D7100.png b/data/images/devices/Photosmart_D7100.png
new file mode 100644
index 0000000..4cc41e3
--- /dev/null
+++ b/data/images/devices/Photosmart_D7100.png
Binary files differ
diff --git a/data/images/devices/Photosmart_D7300.png b/data/images/devices/Photosmart_D7300.png
new file mode 100644
index 0000000..8c455c2
--- /dev/null
+++ b/data/images/devices/Photosmart_D7300.png
Binary files differ
diff --git a/data/images/devices/Photosmart_Pro_B8300.png b/data/images/devices/Photosmart_Pro_B8300.png
new file mode 100644
index 0000000..c75a41e
--- /dev/null
+++ b/data/images/devices/Photosmart_Pro_B8300.png
Binary files differ
diff --git a/data/images/devices/Photosmart_Pro_B9180.png b/data/images/devices/Photosmart_Pro_B9180.png
new file mode 100644
index 0000000..2e90878
--- /dev/null
+++ b/data/images/devices/Photosmart_Pro_B9180.png
Binary files differ
diff --git a/data/images/devices/Photosmart_a310.png b/data/images/devices/Photosmart_a310.png
new file mode 100644
index 0000000..2d88772
--- /dev/null
+++ b/data/images/devices/Photosmart_a310.png
Binary files differ
diff --git a/data/images/devices/Photosmart_a510.png b/data/images/devices/Photosmart_a510.png
new file mode 100644
index 0000000..95de2ed
--- /dev/null
+++ b/data/images/devices/Photosmart_a510.png
Binary files differ
diff --git a/data/images/devices/Photosmart_a710.png b/data/images/devices/Photosmart_a710.png
new file mode 100644
index 0000000..0f83a47
--- /dev/null
+++ b/data/images/devices/Photosmart_a710.png
Binary files differ
diff --git a/data/images/devices/cp1160.png b/data/images/devices/cp1160.png
new file mode 100644
index 0000000..dd7602d
--- /dev/null
+++ b/data/images/devices/cp1160.png
Binary files differ
diff --git a/data/images/devices/default_business_inkjet.png b/data/images/devices/default_business_inkjet.png
new file mode 100644
index 0000000..5b89d18
--- /dev/null
+++ b/data/images/devices/default_business_inkjet.png
Binary files differ
diff --git a/data/images/devices/default_designjet.png b/data/images/devices/default_designjet.png
new file mode 100644
index 0000000..d0734f9
--- /dev/null
+++ b/data/images/devices/default_designjet.png
Binary files differ
diff --git a/data/images/devices/default_deskjet.png b/data/images/devices/default_deskjet.png
new file mode 100644
index 0000000..fe7df21
--- /dev/null
+++ b/data/images/devices/default_deskjet.png
Binary files differ
diff --git a/data/images/devices/default_laserjet.png b/data/images/devices/default_laserjet.png
new file mode 100644
index 0000000..31e06b0
--- /dev/null
+++ b/data/images/devices/default_laserjet.png
Binary files differ
diff --git a/data/images/devices/default_officejet.png b/data/images/devices/default_officejet.png
new file mode 100644
index 0000000..4fd0300
--- /dev/null
+++ b/data/images/devices/default_officejet.png
Binary files differ
diff --git a/data/images/devices/default_photosmart.png b/data/images/devices/default_photosmart.png
new file mode 100644
index 0000000..25680b4
--- /dev/null
+++ b/data/images/devices/default_photosmart.png
Binary files differ
diff --git a/data/images/devices/default_printer.png b/data/images/devices/default_printer.png
new file mode 100644
index 0000000..9497ce4
--- /dev/null
+++ b/data/images/devices/default_printer.png
Binary files differ
diff --git a/data/images/devices/default_psc.png b/data/images/devices/default_psc.png
new file mode 100644
index 0000000..25680b4
--- /dev/null
+++ b/data/images/devices/default_psc.png
Binary files differ
diff --git a/data/images/devices/desket_5650.png b/data/images/devices/desket_5650.png
new file mode 100644
index 0000000..9ae908d
--- /dev/null
+++ b/data/images/devices/desket_5650.png
Binary files differ
diff --git a/data/images/devices/deskjet_1280.png b/data/images/devices/deskjet_1280.png
new file mode 100644
index 0000000..371d727
--- /dev/null
+++ b/data/images/devices/deskjet_1280.png
Binary files differ
diff --git a/data/images/devices/deskjet_3200.png b/data/images/devices/deskjet_3200.png
new file mode 100644
index 0000000..492d9c9
--- /dev/null
+++ b/data/images/devices/deskjet_3200.png
Binary files differ
diff --git a/data/images/devices/deskjet_3320.png b/data/images/devices/deskjet_3320.png
new file mode 100644
index 0000000..9d76595
--- /dev/null
+++ b/data/images/devices/deskjet_3320.png
Binary files differ
diff --git a/data/images/devices/deskjet_3325.png b/data/images/devices/deskjet_3325.png
new file mode 100644
index 0000000..52c86bb
--- /dev/null
+++ b/data/images/devices/deskjet_3325.png
Binary files differ
diff --git a/data/images/devices/deskjet_3420.png b/data/images/devices/deskjet_3420.png
new file mode 100644
index 0000000..b958623
--- /dev/null
+++ b/data/images/devices/deskjet_3420.png
Binary files differ
diff --git a/data/images/devices/deskjet_3425.png b/data/images/devices/deskjet_3425.png
new file mode 100644
index 0000000..81145a6
--- /dev/null
+++ b/data/images/devices/deskjet_3425.png
Binary files differ
diff --git a/data/images/devices/deskjet_3500.png b/data/images/devices/deskjet_3500.png
new file mode 100644
index 0000000..5396833
--- /dev/null
+++ b/data/images/devices/deskjet_3500.png
Binary files differ
diff --git a/data/images/devices/deskjet_3600.png b/data/images/devices/deskjet_3600.png
new file mode 100644
index 0000000..c3a81ef
--- /dev/null
+++ b/data/images/devices/deskjet_3600.png
Binary files differ
diff --git a/data/images/devices/deskjet_3840.png b/data/images/devices/deskjet_3840.png
new file mode 100644
index 0000000..72b92c2
--- /dev/null
+++ b/data/images/devices/deskjet_3840.png
Binary files differ
diff --git a/data/images/devices/deskjet_5100.png b/data/images/devices/deskjet_5100.png
new file mode 100644
index 0000000..fcda182
--- /dev/null
+++ b/data/images/devices/deskjet_5100.png
Binary files differ
diff --git a/data/images/devices/deskjet_5550.png b/data/images/devices/deskjet_5550.png
new file mode 100644
index 0000000..a64dfcd
--- /dev/null
+++ b/data/images/devices/deskjet_5550.png
Binary files differ
diff --git a/data/images/devices/deskjet_5552.png b/data/images/devices/deskjet_5552.png
new file mode 100644
index 0000000..ddf11ca
--- /dev/null
+++ b/data/images/devices/deskjet_5552.png
Binary files differ
diff --git a/data/images/devices/deskjet_5600.png b/data/images/devices/deskjet_5600.png
new file mode 100644
index 0000000..e1f8cc8
--- /dev/null
+++ b/data/images/devices/deskjet_5600.png
Binary files differ
diff --git a/data/images/devices/deskjet_6120.png b/data/images/devices/deskjet_6120.png
new file mode 100644
index 0000000..8380a4b
--- /dev/null
+++ b/data/images/devices/deskjet_6120.png
Binary files differ
diff --git a/data/images/devices/deskjet_6980.png b/data/images/devices/deskjet_6980.png
new file mode 100644
index 0000000..0f74909
--- /dev/null
+++ b/data/images/devices/deskjet_6980.png
Binary files differ
diff --git a/data/images/devices/deskjet_D2360.png b/data/images/devices/deskjet_D2360.png
new file mode 100644
index 0000000..39a33a0
--- /dev/null
+++ b/data/images/devices/deskjet_D2360.png
Binary files differ
diff --git a/data/images/devices/dj350.png b/data/images/devices/dj350.png
new file mode 100755
index 0000000..9a692f3
--- /dev/null
+++ b/data/images/devices/dj350.png
Binary files differ
diff --git a/data/images/devices/dj450.png b/data/images/devices/dj450.png
new file mode 100644
index 0000000..168328f
--- /dev/null
+++ b/data/images/devices/dj450.png
Binary files differ
diff --git a/data/images/devices/hp_LaserJet_1200.png b/data/images/devices/hp_LaserJet_1200.png
new file mode 100644
index 0000000..a5ccd53
--- /dev/null
+++ b/data/images/devices/hp_LaserJet_1200.png
Binary files differ
diff --git a/data/images/devices/hp_LaserJet_2100.png b/data/images/devices/hp_LaserJet_2100.png
new file mode 100644
index 0000000..66b6511
--- /dev/null
+++ b/data/images/devices/hp_LaserJet_2100.png
Binary files differ
diff --git a/data/images/devices/hp_LaserJet_3015.png b/data/images/devices/hp_LaserJet_3015.png
new file mode 100644
index 0000000..62e4ce4
--- /dev/null
+++ b/data/images/devices/hp_LaserJet_3015.png
Binary files differ
diff --git a/data/images/devices/hp_LaserJet_3020.png b/data/images/devices/hp_LaserJet_3020.png
new file mode 100644
index 0000000..57b6287
--- /dev/null
+++ b/data/images/devices/hp_LaserJet_3020.png
Binary files differ
diff --git a/data/images/devices/hp_LaserJet_4345_mfp.png b/data/images/devices/hp_LaserJet_4345_mfp.png
new file mode 100644
index 0000000..277bb78
--- /dev/null
+++ b/data/images/devices/hp_LaserJet_4345_mfp.png
Binary files differ
diff --git a/data/images/devices/hp_LaserJet_5000.png b/data/images/devices/hp_LaserJet_5000.png
new file mode 100644
index 0000000..5b58736
--- /dev/null
+++ b/data/images/devices/hp_LaserJet_5000.png
Binary files differ
diff --git a/data/images/devices/hp_LaserJet_8000.png b/data/images/devices/hp_LaserJet_8000.png
new file mode 100644
index 0000000..f9e8141
--- /dev/null
+++ b/data/images/devices/hp_LaserJet_8000.png
Binary files differ
diff --git a/data/images/devices/hp_business_inkjet_1100.png b/data/images/devices/hp_business_inkjet_1100.png
new file mode 100644
index 0000000..05dadd1
--- /dev/null
+++ b/data/images/devices/hp_business_inkjet_1100.png
Binary files differ
diff --git a/data/images/devices/hp_business_inkjet_2200.png b/data/images/devices/hp_business_inkjet_2200.png
new file mode 100644
index 0000000..3aae121
--- /dev/null
+++ b/data/images/devices/hp_business_inkjet_2200.png
Binary files differ
diff --git a/data/images/devices/hp_business_inkjet_2600.png b/data/images/devices/hp_business_inkjet_2600.png
new file mode 100644
index 0000000..29adc1a
--- /dev/null
+++ b/data/images/devices/hp_business_inkjet_2600.png
Binary files differ
diff --git a/data/images/devices/hp_business_inkjet_3000.png b/data/images/devices/hp_business_inkjet_3000.png
new file mode 100644
index 0000000..92a3964
--- /dev/null
+++ b/data/images/devices/hp_business_inkjet_3000.png
Binary files differ
diff --git a/data/images/devices/hp_color_LaserJet_2550.png b/data/images/devices/hp_color_LaserJet_2550.png
new file mode 100644
index 0000000..4c9ca6e
--- /dev/null
+++ b/data/images/devices/hp_color_LaserJet_2550.png
Binary files differ
diff --git a/data/images/devices/hp_color_LaserJet_3700.png b/data/images/devices/hp_color_LaserJet_3700.png
new file mode 100644
index 0000000..4c71e0c
--- /dev/null
+++ b/data/images/devices/hp_color_LaserJet_3700.png
Binary files differ
diff --git a/data/images/devices/hp_color_LaserJet_4600.png b/data/images/devices/hp_color_LaserJet_4600.png
new file mode 100644
index 0000000..8e3bd30
--- /dev/null
+++ b/data/images/devices/hp_color_LaserJet_4600.png
Binary files differ
diff --git a/data/images/devices/hp_color_LaserJet_9500.png b/data/images/devices/hp_color_LaserJet_9500.png
new file mode 100644
index 0000000..814cd07
--- /dev/null
+++ b/data/images/devices/hp_color_LaserJet_9500.png
Binary files differ
diff --git a/data/images/devices/hp_color_laserjet_cm1015_mfp.png b/data/images/devices/hp_color_laserjet_cm1015_mfp.png
new file mode 100644
index 0000000..f8299bf
--- /dev/null
+++ b/data/images/devices/hp_color_laserjet_cm1015_mfp.png
Binary files differ
diff --git a/data/images/devices/hp_color_laserjet_cm1312_mfp.png b/data/images/devices/hp_color_laserjet_cm1312_mfp.png
new file mode 100644
index 0000000..85a9adf
--- /dev/null
+++ b/data/images/devices/hp_color_laserjet_cm1312_mfp.png
Binary files differ
diff --git a/data/images/devices/hp_color_laserjet_cp2025.png b/data/images/devices/hp_color_laserjet_cp2025.png
new file mode 100644
index 0000000..b2da4df
--- /dev/null
+++ b/data/images/devices/hp_color_laserjet_cp2025.png
Binary files differ
diff --git a/data/images/devices/hp_color_laserjet_cp3505.png b/data/images/devices/hp_color_laserjet_cp3505.png
new file mode 100644
index 0000000..d6f7a07
--- /dev/null
+++ b/data/images/devices/hp_color_laserjet_cp3505.png
Binary files differ
diff --git a/data/images/devices/hp_color_laserjet_cp3525.png b/data/images/devices/hp_color_laserjet_cp3525.png
new file mode 100644
index 0000000..c6a52f5
--- /dev/null
+++ b/data/images/devices/hp_color_laserjet_cp3525.png
Binary files differ
diff --git a/data/images/devices/hp_color_laserjet_cp4005.png b/data/images/devices/hp_color_laserjet_cp4005.png
new file mode 100644
index 0000000..2aa5e13
--- /dev/null
+++ b/data/images/devices/hp_color_laserjet_cp4005.png
Binary files differ
diff --git a/data/images/devices/hp_color_laserjet_cp6015.png b/data/images/devices/hp_color_laserjet_cp6015.png
new file mode 100644
index 0000000..5a4924c
--- /dev/null
+++ b/data/images/devices/hp_color_laserjet_cp6015.png
Binary files differ
diff --git a/data/images/devices/hp_deskjet_9300.png b/data/images/devices/hp_deskjet_9300.png
new file mode 100644
index 0000000..600ac28
--- /dev/null
+++ b/data/images/devices/hp_deskjet_9300.png
Binary files differ
diff --git a/data/images/devices/hp_deskjet_f4200.png b/data/images/devices/hp_deskjet_f4200.png
new file mode 100644
index 0000000..8d82d6c
--- /dev/null
+++ b/data/images/devices/hp_deskjet_f4200.png
Binary files differ
diff --git a/data/images/devices/hp_laserjet_3050.png b/data/images/devices/hp_laserjet_3050.png
new file mode 100644
index 0000000..7380bce
--- /dev/null
+++ b/data/images/devices/hp_laserjet_3050.png
Binary files differ
diff --git a/data/images/devices/hp_laserjet_m2727_mfp.png b/data/images/devices/hp_laserjet_m2727_mfp.png
new file mode 100644
index 0000000..cfaf8aa
--- /dev/null
+++ b/data/images/devices/hp_laserjet_m2727_mfp.png
Binary files differ
diff --git a/data/images/devices/hp_laserjet_p2015.png b/data/images/devices/hp_laserjet_p2015.png
new file mode 100644
index 0000000..77c0c1a
--- /dev/null
+++ b/data/images/devices/hp_laserjet_p2015.png
Binary files differ
diff --git a/data/images/devices/hp_photosmart_b8500_series.png b/data/images/devices/hp_photosmart_b8500_series.png
new file mode 100644
index 0000000..23647eb
--- /dev/null
+++ b/data/images/devices/hp_photosmart_b8500_series.png
Binary files differ
diff --git a/data/images/devices/laserjet_2410.png b/data/images/devices/laserjet_2410.png
new file mode 100644
index 0000000..63cf613
--- /dev/null
+++ b/data/images/devices/laserjet_2410.png
Binary files differ
diff --git a/data/images/devices/officejet_4200_series.png b/data/images/devices/officejet_4200_series.png
new file mode 100644
index 0000000..ddbee4d
--- /dev/null
+++ b/data/images/devices/officejet_4200_series.png
Binary files differ
diff --git a/data/images/devices/officejet_500.png b/data/images/devices/officejet_500.png
new file mode 100644
index 0000000..52e4452
--- /dev/null
+++ b/data/images/devices/officejet_500.png
Binary files differ
diff --git a/data/images/devices/officejet_5500_series.png b/data/images/devices/officejet_5500_series.png
new file mode 100644
index 0000000..d88551b
--- /dev/null
+++ b/data/images/devices/officejet_5500_series.png
Binary files differ
diff --git a/data/images/devices/officejet_5600.png b/data/images/devices/officejet_5600.png
new file mode 100644
index 0000000..9bd99d9
--- /dev/null
+++ b/data/images/devices/officejet_5600.png
Binary files differ
diff --git a/data/images/devices/officejet_j3600_series.png b/data/images/devices/officejet_j3600_series.png
new file mode 100644
index 0000000..7263661
--- /dev/null
+++ b/data/images/devices/officejet_j3600_series.png
Binary files differ
diff --git a/data/images/devices/officejet_j5500_series.png b/data/images/devices/officejet_j5500_series.png
new file mode 100644
index 0000000..c730c3c
--- /dev/null
+++ b/data/images/devices/officejet_j5500_series.png
Binary files differ
diff --git a/data/images/devices/officejet_k550.png b/data/images/devices/officejet_k550.png
new file mode 100644
index 0000000..b731717
--- /dev/null
+++ b/data/images/devices/officejet_k550.png
Binary files differ
diff --git a/data/images/devices/officejet_k80.png b/data/images/devices/officejet_k80.png
new file mode 100644
index 0000000..8c88364
--- /dev/null
+++ b/data/images/devices/officejet_k80.png
Binary files differ
diff --git a/data/images/devices/photosmart_7150.png b/data/images/devices/photosmart_7150.png
new file mode 100644
index 0000000..ab223ea
--- /dev/null
+++ b/data/images/devices/photosmart_7150.png
Binary files differ
diff --git a/data/images/devices/photosmart_7900_series.png b/data/images/devices/photosmart_7900_series.png
new file mode 100644
index 0000000..3a01498
--- /dev/null
+++ b/data/images/devices/photosmart_7900_series.png
Binary files differ
diff --git a/data/images/devices/photosmart_a610.png b/data/images/devices/photosmart_a610.png
new file mode 100644
index 0000000..7303b8b
--- /dev/null
+++ b/data/images/devices/photosmart_a610.png
Binary files differ
diff --git a/data/images/devices/photosmart_a820_series.png b/data/images/devices/photosmart_a820_series.png
new file mode 100644
index 0000000..5d5d76d
--- /dev/null
+++ b/data/images/devices/photosmart_a820_series.png
Binary files differ
diff --git a/data/images/devices/psc_1100_series.png b/data/images/devices/psc_1100_series.png
new file mode 100644
index 0000000..ebc1026
--- /dev/null
+++ b/data/images/devices/psc_1100_series.png
Binary files differ
diff --git a/data/images/devices/psc_1610.png b/data/images/devices/psc_1610.png
new file mode 100644
index 0000000..3a41de4
--- /dev/null
+++ b/data/images/devices/psc_1610.png
Binary files differ
diff --git a/data/images/devices/psc_2300_series.png b/data/images/devices/psc_2300_series.png
new file mode 100644
index 0000000..74f1ddd
--- /dev/null
+++ b/data/images/devices/psc_2300_series.png
Binary files differ
diff --git a/data/images/other/aio_align.png b/data/images/other/aio_align.png
new file mode 100644
index 0000000..5595b9c
--- /dev/null
+++ b/data/images/other/aio_align.png
Binary files differ
diff --git a/data/images/other/align10.png b/data/images/other/align10.png
new file mode 100644
index 0000000..92317ff
--- /dev/null
+++ b/data/images/other/align10.png
Binary files differ
diff --git a/data/images/other/clean.png b/data/images/other/clean.png
new file mode 100644
index 0000000..72265a1
--- /dev/null
+++ b/data/images/other/clean.png
Binary files differ
diff --git a/data/images/other/color_adj.png b/data/images/other/color_adj.png
new file mode 100644
index 0000000..e841ff9
--- /dev/null
+++ b/data/images/other/color_adj.png
Binary files differ
diff --git a/data/images/other/confidential_coverpage.png b/data/images/other/confidential_coverpage.png
new file mode 100644
index 0000000..1f10e3c
--- /dev/null
+++ b/data/images/other/confidential_coverpage.png
Binary files differ
diff --git a/data/images/other/confidential_title.png b/data/images/other/confidential_title.png
new file mode 100644
index 0000000..dfea6ca
--- /dev/null
+++ b/data/images/other/confidential_title.png
Binary files differ
diff --git a/data/images/other/fax.png b/data/images/other/fax.png
new file mode 100644
index 0000000..e4f2bf4
--- /dev/null
+++ b/data/images/other/fax.png
Binary files differ
diff --git a/data/images/other/fax2.png b/data/images/other/fax2.png
new file mode 100644
index 0000000..14b6d11
--- /dev/null
+++ b/data/images/other/fax2.png
Binary files differ
diff --git a/data/images/other/generic_coverpage.png b/data/images/other/generic_coverpage.png
new file mode 100644
index 0000000..b021923
--- /dev/null
+++ b/data/images/other/generic_coverpage.png
Binary files differ
diff --git a/data/images/other/generic_title.png b/data/images/other/generic_title.png
new file mode 100644
index 0000000..17b56cc
--- /dev/null
+++ b/data/images/other/generic_title.png
Binary files differ
diff --git a/data/images/other/h-k-2.png b/data/images/other/h-k-2.png
new file mode 100644
index 0000000..f24fa30
--- /dev/null
+++ b/data/images/other/h-k-2.png
Binary files differ
diff --git a/data/images/other/h-k-3.png b/data/images/other/h-k-3.png
new file mode 100644
index 0000000..ca0837c
--- /dev/null
+++ b/data/images/other/h-k-3.png
Binary files differ
diff --git a/data/images/other/h-kc-2.png b/data/images/other/h-kc-2.png
new file mode 100644
index 0000000..f41927c
--- /dev/null
+++ b/data/images/other/h-kc-2.png
Binary files differ
diff --git a/data/images/other/h-kc-3.png b/data/images/other/h-kc-3.png
new file mode 100644
index 0000000..1ca868d
--- /dev/null
+++ b/data/images/other/h-kc-3.png
Binary files differ
diff --git a/data/images/other/hp-tux-printer.png b/data/images/other/hp-tux-printer.png
new file mode 100644
index 0000000..6ea6252
--- /dev/null
+++ b/data/images/other/hp-tux-printer.png
Binary files differ
diff --git a/data/images/other/load_paper.png b/data/images/other/load_paper.png
new file mode 100644
index 0000000..16dc921
--- /dev/null
+++ b/data/images/other/load_paper.png
Binary files differ
diff --git a/data/images/other/opensource-75x65.png b/data/images/other/opensource-75x65.png
new file mode 100644
index 0000000..f95e213
--- /dev/null
+++ b/data/images/other/opensource-75x65.png
Binary files differ
diff --git a/data/images/other/panel_lcd.png b/data/images/other/panel_lcd.png
new file mode 100644
index 0000000..625d6a8
--- /dev/null
+++ b/data/images/other/panel_lcd.png
Binary files differ
diff --git a/data/images/other/pens.png b/data/images/other/pens.png
new file mode 100644
index 0000000..f654a85
--- /dev/null
+++ b/data/images/other/pens.png
Binary files differ
diff --git a/data/images/other/powered_by_python.png b/data/images/other/powered_by_python.png
new file mode 100644
index 0000000..e160bf7
--- /dev/null
+++ b/data/images/other/powered_by_python.png
Binary files differ
diff --git a/data/images/other/signal0.png b/data/images/other/signal0.png
new file mode 100644
index 0000000..5848e2d
--- /dev/null
+++ b/data/images/other/signal0.png
Binary files differ
diff --git a/data/images/other/signal1.png b/data/images/other/signal1.png
new file mode 100644
index 0000000..c114e03
--- /dev/null
+++ b/data/images/other/signal1.png
Binary files differ
diff --git a/data/images/other/signal2.png b/data/images/other/signal2.png
new file mode 100644
index 0000000..7404bb6
--- /dev/null
+++ b/data/images/other/signal2.png
Binary files differ
diff --git a/data/images/other/signal3.png b/data/images/other/signal3.png
new file mode 100644
index 0000000..76b4a32
--- /dev/null
+++ b/data/images/other/signal3.png
Binary files differ
diff --git a/data/images/other/signal4.png b/data/images/other/signal4.png
new file mode 100644
index 0000000..8652013
--- /dev/null
+++ b/data/images/other/signal4.png
Binary files differ
diff --git a/data/images/other/signal5.png b/data/images/other/signal5.png
new file mode 100644
index 0000000..ca655c9
--- /dev/null
+++ b/data/images/other/signal5.png
Binary files differ
diff --git a/data/images/other/standard_coverpage.png b/data/images/other/standard_coverpage.png
new file mode 100644
index 0000000..13ab151
--- /dev/null
+++ b/data/images/other/standard_coverpage.png
Binary files differ
diff --git a/data/images/other/type4_color_patch.png b/data/images/other/type4_color_patch.png
new file mode 100644
index 0000000..3b56ece
--- /dev/null
+++ b/data/images/other/type4_color_patch.png
Binary files differ
diff --git a/data/images/other/type4_gray_patch.png b/data/images/other/type4_gray_patch.png
new file mode 100644
index 0000000..6fc2d0a
--- /dev/null
+++ b/data/images/other/type4_gray_patch.png
Binary files differ
diff --git a/data/images/other/urgent_coverpage.png b/data/images/other/urgent_coverpage.png
new file mode 100644
index 0000000..10549af
--- /dev/null
+++ b/data/images/other/urgent_coverpage.png
Binary files differ
diff --git a/data/images/other/urgent_title.png b/data/images/other/urgent_title.png
new file mode 100644
index 0000000..e4f0013
--- /dev/null
+++ b/data/images/other/urgent_title.png
Binary files differ
diff --git a/data/images/other/usb_connection.png b/data/images/other/usb_connection.png
new file mode 100644
index 0000000..b0184cf
--- /dev/null
+++ b/data/images/other/usb_connection.png
Binary files differ
diff --git a/data/images/other/v-c-2.png b/data/images/other/v-c-2.png
new file mode 100644
index 0000000..f4cd6e5
--- /dev/null
+++ b/data/images/other/v-c-2.png
Binary files differ
diff --git a/data/images/other/v-c-3.png b/data/images/other/v-c-3.png
new file mode 100644
index 0000000..0fb574a
--- /dev/null
+++ b/data/images/other/v-c-3.png
Binary files differ
diff --git a/data/images/other/v-k-2.png b/data/images/other/v-k-2.png
new file mode 100644
index 0000000..9ab0dcc
--- /dev/null
+++ b/data/images/other/v-k-2.png
Binary files differ
diff --git a/data/images/other/v-k-3.png b/data/images/other/v-k-3.png
new file mode 100644
index 0000000..752c70e
--- /dev/null
+++ b/data/images/other/v-k-3.png
Binary files differ
diff --git a/data/images/other/v-kc-2.png b/data/images/other/v-kc-2.png
new file mode 100644
index 0000000..2c1a0fa
--- /dev/null
+++ b/data/images/other/v-kc-2.png
Binary files differ
diff --git a/data/images/other/v-kc-3.png b/data/images/other/v-kc-3.png
new file mode 100644
index 0000000..28c56f8
--- /dev/null
+++ b/data/images/other/v-kc-3.png
Binary files differ
diff --git a/data/images/other/zca.png b/data/images/other/zca.png
new file mode 100644
index 0000000..19dc674
--- /dev/null
+++ b/data/images/other/zca.png
Binary files differ
diff --git a/data/ldl/cb2pcal.ldl.gz b/data/ldl/cb2pcal.ldl.gz
new file mode 100644
index 0000000..e3c1453
--- /dev/null
+++ b/data/ldl/cb2pcal.ldl.gz
Binary files differ
diff --git a/data/ldl/cb2pcal_done.ldl.gz b/data/ldl/cb2pcal_done.ldl.gz
new file mode 100644
index 0000000..e22e1b8
--- /dev/null
+++ b/data/ldl/cb2pcal_done.ldl.gz
Binary files differ
diff --git a/data/ldl/cbbcal.ldl.gz b/data/ldl/cbbcal.ldl.gz
new file mode 100644
index 0000000..ac56bb3
--- /dev/null
+++ b/data/ldl/cbbcal.ldl.gz
Binary files differ
diff --git a/data/ldl/cbccal.ldl.gz b/data/ldl/cbccal.ldl.gz
new file mode 100644
index 0000000..1893cfd
--- /dev/null
+++ b/data/ldl/cbccal.ldl.gz
Binary files differ
diff --git a/data/ldl/cbccal_done.ldl.gz b/data/ldl/cbccal_done.ldl.gz
new file mode 100644
index 0000000..b8b4120
--- /dev/null
+++ b/data/ldl/cbccal_done.ldl.gz
Binary files differ
diff --git a/data/ldl/cbcpcal.ldl.gz b/data/ldl/cbcpcal.ldl.gz
new file mode 100644
index 0000000..98237e5
--- /dev/null
+++ b/data/ldl/cbcpcal.ldl.gz
Binary files differ
diff --git a/data/ldl/cbpcal.ldl.gz b/data/ldl/cbpcal.ldl.gz
new file mode 100644
index 0000000..a04babd
--- /dev/null
+++ b/data/ldl/cbpcal.ldl.gz
Binary files differ
diff --git a/data/localization/hplip_de.qm b/data/localization/hplip_de.qm
new file mode 100644
index 0000000..dc91b21
--- /dev/null
+++ b/data/localization/hplip_de.qm
Binary files differ
diff --git a/data/localization/hplip_de.ts b/data/localization/hplip_de.ts
new file mode 100755
index 0000000..6f20eaf
--- /dev/null
+++ b/data/localization/hplip_de.ts
@@ -0,0 +1,5048 @@
+<!DOCTYPE TS><TS>
+<context>
+ <name>@default</name>
+ <message>
+ <source>&lt;b&gt;Unable to mount photo card on device.&lt;/b&gt;&lt;p&gt;Check that device is powered on and photo card is correctly inserted.</source>
+<translation>&lt;b&gt;Die Fotokarte kann nicht im Gerät aktiviert werden.&lt;/b&gt;&lt;p&gt;Überprüfen Sie, ob das Gerät eingeschaltet und die Fotokarte korrekt eingesetzt ist.</translation>
+ </message>
+</context>
+<context>
+ <name>AboutDlg_base</name>
+ <message>
+ <source>HP Device Manager - About</source>
+ <translation>HP Geräte-Manager – Info</translation>
+ </message>
+ <message>
+ <source>&lt;font size=&quot;+3&quot;&gt;&lt;p align=&quot;center&quot;&gt;HP Linux Imaging and Printing (HPLIP)&lt;/p&gt;&lt;/font&gt;</source>
+ <translation>&lt;font size=&quot;+3&quot;&gt;&lt;p align=&quot;center&quot;&gt;HP Linux Imaging and Printing (HPLIP)&lt;/p&gt;&lt;/font&gt;</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Schließen</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;HPLIP Software Version:&lt;/b&gt;</source>
+ <translation>&lt;b&gt;HPLIP-Softwareversion:&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>0.0.0</source>
+ <translation>0.0.0</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Device Manager Software Version:&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Softwareversion des Geräte-Managers:&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Authors and Contributors:&lt;/b&gt;\nDavid Suffield, Don Welch, Shiyun Yie, Raghothama Cauligi, John Oleinik, Cory Meisch, Foster Nuffer, Pete Parks, Jacqueline Pitter, David Paschal,\nSteve DeRoos, Mark Overton, Aaron Albright, Smith Kennedy, John Hosszu, Chris Wiesner, Henrique M. Holschuh, Till Kamppeter, Linus Araque, Mark Crawford, Charlie Moore</source>
+ <translation>&lt;b&gt;Autoren und Mitwirkende:&lt;/b&gt;
+David Suffield, Don Welch, Shiyun Yie, Raghothama Cauligi, John Oleinik, Cory Meisch, Foster Nuffer, Pete Parks, Jacqueline Pitter, David Paschal,
+Steve DeRoos, Mark Overton, Aaron Albright, Smith Kennedy, John Hosszu, Chris Wiesner, Henrique M. Holschuh, Till Kamppeter, Linus Araque, Mark Crawford, Charlie Moore</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;License and Copyright:&lt;/b&gt;
+(c) Copyright 2006 Hewlett-Packard Development Company, L.P. This software is licensed under the GNU General Public License (GPL), BSD, and MIT licenses. See the software sources for details.</source>
+ <translation>&lt;b&gt;Lizenz und Copyright:&lt;/b&gt;
+(c) Copyright 2006 Hewlett-Packard Development Company, L.P. Diese Software ist unter folgenden Lizenzen lizenziert: GNU-General Public License (GPL), BSD und MIT. Weitere Informationen finden Sie in den Softwarequellen.</translation>
+ </message>
+</context>
+<context>
+ <name>Align10Form_Base</name>
+ <message>
+ <source>HP Device Manager - Alignment</source>
+ <translation>HP Geräte-Manager – Ausrichtung</translation>
+ </message>
+ <message>
+ <source>Examine the page that was printed. Several rows of boxes, each made up of thin lines, appear on the printed page.&lt;p&gt;
+For each row, select the label representing the box in which the shorter inner lines are the most aligned with the longer outer lines..</source>
+ <translation>Sehen Sie sich die gedruckte Seite an. Die Seite enthält einige Reihen mit aus dünnen Linien bestehenden Kästchen.&lt;p&gt;
+Wählen Sie für jede Reihe die Beschriftung des Kästchens aus, in dem die kürzeren Innenlinien am besten an den längeren Außenlinien ausgerichtet sind.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;B:&lt;/font&gt;&lt;/b&gt;</source>
+ <translation>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;B:&lt;/font&gt;&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;F:&lt;/font&gt;&lt;/b&gt;</source>
+ <translation>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;F:&lt;/font&gt;&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;C:&lt;/font&gt;&lt;/b&gt;</source>
+ <translation>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;C:&lt;/font&gt;&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;D:&lt;/font&gt;&lt;/b&gt;</source>
+ <translation>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;D:&lt;/font&gt;&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;G:&lt;/font&gt;&lt;/b&gt;</source>
+ <translation>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;G:&lt;/font&gt;&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;A:&lt;/font&gt;&lt;/b&gt;</source>
+ <translation>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;A:&lt;/font&gt;&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;E:&lt;/font&gt;&lt;/b&gt;</source>
+ <translation>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;E:&lt;/font&gt;&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;H:&lt;/font&gt;&lt;/b&gt;</source>
+ <translation>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;H:&lt;/font&gt;&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Next &gt;</source>
+ <translation>Weiter &gt;</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Abbrechen</translation>
+ </message>
+</context>
+<context>
+ <name>AlignForm</name>
+ <message>
+ <source>HP Device Manager - Alignment</source>
+ <translation>HP Geräte-Manager – Ausrichtung</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Abbrechen</translation>
+ </message>
+ <message>
+ <source>Next &gt;</source>
+ <translation>Weiter &gt;</translation>
+ </message>
+ <message>
+ <source>Choose the set of lines where the line segments are &lt;b&gt;best&lt;/b&gt; aligned.</source>
+ <translation>Wählen Sie die Liniengruppe aus, deren Segmente am &lt;b&gt;besten&lt;/b&gt; ausgerichtet sind.</translation>
+ </message>
+</context>
+<context>
+ <name>AlignType6Form1_base</name>
+ <message>
+ <source>HP Device Manager - Alignment</source>
+ <translation>HP Geräte-Manager – Ausrichtung</translation>
+ </message>
+ <message>
+ <source>To perform alignment, you will need the &lt;b&gt;alignment page&lt;/b&gt; that is automatically printed after you install a print cartridge.
+&lt;p&gt; If you do &lt;b&gt;not&lt;/b&gt; have this page, click &lt;i&gt;Print Page&lt;/i&gt;.
+&lt;p&gt;If you already have this page, click &lt;i&gt;Next &gt;&lt;/i&gt;.</source>
+ <translation>Zum Durchführen der Ausrichtung benötigen Sie die &lt;b&gt;Ausrichtungsseite&lt;/b&gt;, die automatisch nach dem Einsetzen einer neuen Tintenpatrone gedruckt wird.
+&lt;p&gt; Sollten Sie diese Seite &lt;b&gt;nicht&lt;/b&gt; vorliegen haben, klicken Sie auf &lt;i&gt;Seite drucken&lt;/i&gt;.
+&lt;p&gt;Ist die Seite bereits vorhanden, klicken Sie auf &lt;i&gt;Weiter &gt;&lt;/i&gt;.</translation>
+ </message>
+ <message>
+ <source>Next &gt;</source>
+ <translation>Weiter &gt;</translation>
+ </message>
+ <message>
+ <source>Print Page</source>
+ <translation>Seite drucken</translation>
+ </message>
+</context>
+<context>
+ <name>AlignType6Form2_base</name>
+ <message>
+ <source>HP Device Manager - Alignment</source>
+ <translation>HP Geräte-Manager – Ausrichtung</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Follow these steps to complete the alignment:&lt;/b&gt;
+&lt;p&gt;&lt;b&gt;1.&lt;/b&gt; Place the alignment page, with the printed side facing down, on the scanner.
+&lt;p&gt;&lt;b&gt;2.&lt;/b&gt; Press the &lt;i&gt;Enter&lt;/i&gt; or &lt;i&gt;Scan&lt;/i&gt; button on the printer.
+&lt;p&gt;&lt;b&gt;3.&lt;/b&gt; &quot;Alignment Complete&quot; will be displayed when the process is finished (on some models)..</source>
+ <translation>&lt;b&gt;Gehen Sie zum Durchführen der Ausrichtung folgendermaßen vor:&lt;/b&gt;
+&lt;p&gt;&lt;b&gt;1.&lt;/b&gt; Legen Sie die Ausrichtungsseite mit der bedruckten Seite nach unten auf den Scanner.
+&lt;p&gt;&lt;b&gt;2.&lt;/b&gt; Drücken Sie auf dem Drucker die Eingabe- oder Scantaste.
+&lt;p&gt;&lt;b&gt;3.&lt;/b&gt; Nach Abschluss des Vorgangs werden Sie darauf hingewiesen, dass die Ausrichtung abgeschlossen ist (nicht bei allen Modellen).</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+</context>
+<context>
+ <name>AllowableTypesDlg_base</name>
+ <message>
+ <source>MIME Type</source>
+ <translation>MIME-Typ</translation>
+ </message>
+ <message>
+ <source>Description</source>
+ <translation>Beschreibung</translation>
+ </message>
+ <message>
+ <source>Usual File Extension(s)</source>
+ <translation>Häufig verwendete Dateierweiterung(en)</translation>
+ </message>
+ <message>
+ <source>HP Device Manager - Allowable Types</source>
+ <translation>HP Geräte-Manager – Zulässige Typen</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;File/document types that can be added to the file list.&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Datei- und Dokumenttypen, die der Dateiliste hinzugefügt werden können.&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>&lt;i&gt;Note: To print or fax file/document types that do not appear on this list, print the document from the application that created it through the appropriate CUPS printer.&lt;/i&gt;</source>
+ <translation>&lt;i&gt;Hinweis: Wenn Sie einen Datei- oder Dokumenttyp drucken oder per Fax versenden möchten, der nicht in dieser Liste aufgeführt ist, drucken Sie das Dokument mithilfe der Anwendung, mit der das Dokument erstellt wurde, auf einem geeigneten CUPS-Drucker.&lt;/i&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>ChooseDeviceDlg</name>
+ <message>
+ <source>Choose Device</source>
+ <translation>Gerät auswählen</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Abbrechen</translation>
+ </message>
+ <message>
+ <source>Available Devices:</source>
+ <translation>Verfügbare Geräte:</translation>
+ </message>
+</context>
+<context>
+ <name>ChoosePrinterDlg</name>
+ <message>
+ <source>Choose Device</source>
+ <translation>Gerät auswählen</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Abbrechen</translation>
+ </message>
+ <message>
+ <source>Available Devices:</source>
+ <translation>Verfügbare Geräte:</translation>
+ </message>
+ <message>
+ <source>Available Printers:</source>
+ <translation>Verfügbare Drucker:</translation>
+ </message>
+ <message>
+ <source>Available Faxes:</source>
+ <translation>Verfügbare Faxgeräte:</translation>
+ </message>
+</context>
+<context>
+ <name>ChoosePrinterDlg2</name>
+ <message>
+ <source>Choose Printer</source>
+ <translation>Drucker auswählen</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Abbrechen</translation>
+ </message>
+ <message>
+ <source>Printers:</source>
+ <translation>Drucker:</translation>
+ </message>
+</context>
+<context>
+ <name>CleaningForm2_base</name>
+ <message>
+ <source>HP Device Manager - Cleaning</source>
+ <translation>HP Geräte-Manager – Reinigung</translation>
+ </message>
+ <message>
+ <source>Finish</source>
+ <translation>Fertig stellen</translation>
+ </message>
+ <message>
+ <source>Please wait while the test page is printed. Check this page to see if the problem was fixed. If the test page looks fine click &lt;b&gt;Finish &lt;/b&gt;to quit the cleaning procedure. Otherwise, replace the print cartridges and click &lt;b&gt;Finish&lt;/b&gt;.</source>
+ <translation>Bitte warten Sie, bis die Testseite gedruckt wurde. Überprüfen Sie auf der Seite, ob das Problem behoben wurde. Lassen sich auf der Testseite keine Fehler feststellen, klicken Sie zum Beenden des Reinigungsvorgangs auf &lt;b&gt;Fertig stellen&lt;/b&gt;. Ersetzen Sie andernfalls die Tintenpatronen, und klicken Sie anschließend auf &lt;b&gt;Fertig stellen&lt;/b&gt;.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Cleaning Level 3 Performed&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Reinigungsstufe 3 ausgeführt.&lt;/b&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>CleaningForm_base</name>
+ <message>
+ <source>HP Device Manager - Please Wait - Cleaning</source>
+ <translation>HP Geräte-Manager – Bitte warten – Reinigung</translation>
+ </message>
+ <message>
+ <source>Finish</source>
+ <translation>Fertig stellen</translation>
+ </message>
+ <message>
+ <source>Cleaning Level %s</source>
+ <translation>Reinigungsstufe %s</translation>
+ </message>
+ <message>
+ <source>Please wait while the test page is printed. Check this page to see if the problem was fixed. If the test page looks fine click &lt;b&gt;Finish &lt;/b&gt;to quit the cleaning procedure. Otherwise, click &lt;b&gt;Cleaning Level %s&lt;/b&gt; to continue with cleaning.</source>
+ <translation>Bitte warten Sie, bis die Testseite gedruckt wurde. Überprüfen Sie auf der Seite, ob das Problem behoben wurde. Lassen sich auf der Testseite keine Fehler feststellen, klicken Sie zum Beenden des Reinigungsvorgangs auf &lt;b&gt;Fertig stellen&lt;/b&gt;. Klicken Sie andernfalls auf &lt;b&gt;Reinigungsstufe %s&lt;/b&gt;, um den Reinigungsvorgang fortzusetzen.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Please Wait - Cleaning Level %s Being Performed&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Bitte warten – Reinigungsstufe %s wird ausgeführt&lt;/b&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>ColorAdjForm_base</name>
+ <message>
+ <source>HP Device Manager - Color Adjustment</source>
+ <translation>HP Geräte-Manager – Farbanpassung</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Abbrechen</translation>
+ </message>
+ <message>
+ <source>Next &gt;</source>
+ <translation>Weiter &gt;</translation>
+ </message>
+ <message>
+ <source>Choose the numbered colored box that the color &lt;b&gt;best &lt;/b&gt;matches the background color of the bar.</source>
+ <translation>Wählen Sie das nummerierte farbige Kästchen aus, dessen Farbe am &lt;b&gt;besten&lt;/b&gt; der Hintergrundfarbe des Balkens entspricht.</translation>
+ </message>
+ <message>
+ <source>1</source>
+ <translation>1</translation>
+ </message>
+ <message>
+ <source>2</source>
+ <translation>2</translation>
+ </message>
+ <message>
+ <source>3</source>
+ <translation>3</translation>
+ </message>
+ <message>
+ <source>4</source>
+ <translation>4</translation>
+ </message>
+ <message>
+ <source>5</source>
+ <translation>5</translation>
+ </message>
+ <message>
+ <source>6</source>
+ <translation>6</translation>
+ </message>
+ <message>
+ <source>7</source>
+ <translation>7</translation>
+ </message>
+ <message>
+ <source>8</source>
+ <translation>8</translation>
+ </message>
+ <message>
+ <source>9</source>
+ <translation>9</translation>
+ </message>
+ <message>
+ <source>10</source>
+ <translation>10</translation>
+ </message>
+ <message>
+ <source>11</source>
+ <translation>11</translation>
+ </message>
+ <message>
+ <source>12</source>
+ <translation>12</translation>
+ </message>
+ <message>
+ <source>13</source>
+ <translation>13</translation>
+ </message>
+ <message>
+ <source>14</source>
+ <translation>14</translation>
+ </message>
+ <message>
+ <source>15</source>
+ <translation>15</translation>
+ </message>
+ <message>
+ <source>16</source>
+ <translation>16</translation>
+ </message>
+ <message>
+ <source>17</source>
+ <translation>17</translation>
+ </message>
+ <message>
+ <source>18</source>
+ <translation>18</translation>
+ </message>
+ <message>
+ <source>19</source>
+ <translation>19</translation>
+ </message>
+ <message>
+ <source>20</source>
+ <translation>20</translation>
+ </message>
+ <message>
+ <source>21</source>
+ <translation>21</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;&lt;font size=&quot;+1&quot;&gt;Line&lt;/font&gt;&lt;/b&gt;</source>
+ <translation>&lt;b&gt;&lt;font size=&quot;+1&quot;&gt;Linie&lt;/font&gt;&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;&lt;font size=&quot;+1&quot;&gt;X&lt;/font&gt;&lt;/b&gt;</source>
+ <translation>&lt;b&gt;&lt;font size=&quot;+1&quot;&gt;X&lt;/font&gt;&lt;/b&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>ColorCal4Form_base</name>
+ <message>
+ <source>HP Device Manager - Color Calibration</source>
+ <translation>HP Geräte-Manager – Farbkalibrierung</translation>
+ </message>
+ <message>
+ <source>Calibrate</source>
+ <translation>Kalibrieren</translation>
+ </message>
+ <message>
+ <source>1. Hold the calibration page at arm&apos;s length in front of your eyes.
+&lt;p&gt;&lt;p&gt;
+2. Tilt the page away from you. Look at the two large squares, each containing colored patches. For each large square, find the colored path that &lt;b&gt;most closely&lt;/b&gt; matches the background color. Each patch has an associated letter and number.
+&lt;p&gt;&lt;p&gt;
+3. Choose the letter and number for the matching patches for the gray and color plots.
+&lt;p&gt;&lt;p&gt;
+4. Click &lt;i&gt;&quot;Calibrate&quot;.&lt;/i&gt; to continue.
+&lt;p&gt;&lt;p&gt;
+(To reset the printer to known defaults, click &lt;i&gt;&quot;Use Factory Defaults&quot;&lt;/i&gt;)</source>
+ <translation>1. Halten Sie die Kalibrierungsseite ungefähr in Armeslänge vor sich.
+&lt;p&gt;&lt;p&gt;
+2. Kippen Sie die Seite von sich weg. Betrachten Sie die beiden großen Rechtecke mit den farbigen Feldern. Ermitteln Sie für jedes der großen Rechtecke die Farbstrecke, die &lt;b&gt;am besten&lt;/b&gt; mit der Hintergrundfarbe übereinstimmt. Jedes Feld ist mit einem entsprechenden Buchstaben und einer Zahl versehen.
+&lt;p&gt;&lt;p&gt;
+3. Ermitteln Sie für den grauen sowie für den farbigen Ausdruck den entsprechenden Buchstaben und die Zahl der übereinstimmenden Felder.
+&lt;p&gt;&lt;p&gt;
+4. Klicken Sie zum Fortfahren auf &lt;i&gt;&quot;Kalibrieren&quot;&lt;/i&gt;.
+&lt;p&gt;&lt;p&gt;
+(Klicken Sie auf &lt;i&gt;&quot;Standardeinstellungen verwenden&quot;&lt;/i&gt;, um den Drucker auf die Standardeinstellungen zurückzusetzen.)</translation>
+ </message>
+ <message>
+ <source>Gray Plot</source>
+ <translation>Grauer Ausdruck</translation>
+ </message>
+ <message>
+ <source>A</source>
+ <translation>A</translation>
+ </message>
+ <message>
+ <source>B</source>
+ <translation>B</translation>
+ </message>
+ <message>
+ <source>C</source>
+ <translation>C</translation>
+ </message>
+ <message>
+ <source>D</source>
+ <translation>D</translation>
+ </message>
+ <message>
+ <source>E</source>
+ <translation>E</translation>
+ </message>
+ <message>
+ <source>F</source>
+ <translation>F</translation>
+ </message>
+ <message>
+ <source>G</source>
+ <translation>G</translation>
+ </message>
+ <message>
+ <source>H</source>
+ <translation>H</translation>
+ </message>
+ <message>
+ <source>I</source>
+ <translation>I</translation>
+ </message>
+ <message>
+ <source>J</source>
+ <translation>J</translation>
+ </message>
+ <message>
+ <source>K</source>
+ <translation>K</translation>
+ </message>
+ <message>
+ <source>L</source>
+ <translation>L</translation>
+ </message>
+ <message>
+ <source>M</source>
+ <translation>M</translation>
+ </message>
+ <message>
+ <source>N</source>
+ <translation>N</translation>
+ </message>
+ <message>
+ <source>1</source>
+ <translation>1</translation>
+ </message>
+ <message>
+ <source>2</source>
+ <translation>2</translation>
+ </message>
+ <message>
+ <source>3</source>
+ <translation>3</translation>
+ </message>
+ <message>
+ <source>4</source>
+ <translation>4</translation>
+ </message>
+ <message>
+ <source>5</source>
+ <translation>5</translation>
+ </message>
+ <message>
+ <source>6</source>
+ <translation>6</translation>
+ </message>
+ <message>
+ <source>7</source>
+ <translation>7</translation>
+ </message>
+ <message>
+ <source>8</source>
+ <translation>8</translation>
+ </message>
+ <message>
+ <source>9</source>
+ <translation>9</translation>
+ </message>
+ <message>
+ <source>10</source>
+ <translation>10</translation>
+ </message>
+ <message>
+ <source>11</source>
+ <translation>11</translation>
+ </message>
+ <message>
+ <source>12</source>
+ <translation>12</translation>
+ </message>
+ <message>
+ <source>13</source>
+ <translation>13</translation>
+ </message>
+ <message>
+ <source>14</source>
+ <translation>14</translation>
+ </message>
+ <message>
+ <source>Color Plot</source>
+ <translation>Farbiger Ausdruck</translation>
+ </message>
+ <message>
+ <source>P</source>
+ <translation>P</translation>
+ </message>
+ <message>
+ <source>Q</source>
+ <translation>Q</translation>
+ </message>
+ <message>
+ <source>R</source>
+ <translation>R</translation>
+ </message>
+ <message>
+ <source>S</source>
+ <translation>S</translation>
+ </message>
+ <message>
+ <source>T</source>
+ <translation>T</translation>
+ </message>
+ <message>
+ <source>U</source>
+ <translation>U</translation>
+ </message>
+ <message>
+ <source>V</source>
+ <translation>V</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Abbrechen</translation>
+ </message>
+ <message>
+ <source>Use Factory Defaults</source>
+ <translation>Standardeinstellungen verwenden</translation>
+ </message>
+</context>
+<context>
+ <name>ColorCalForm2_base</name>
+ <message>
+ <source>HP Device Manager - Color Calibration</source>
+ <translation>HP Geräte-Manager – Farbkalibrierung</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Abbrechen</translation>
+ </message>
+ <message>
+ <source>Next &gt;</source>
+ <translation>Weiter &gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;A page of color patches is printing. When it is complete, follow these steps:&lt;/b&gt;
+&lt;p&gt;&lt;b&gt;1.&lt;/b&gt; Hold the page approximately 8 inches (~20cm) in front of your eyes.
+&lt;p&gt;&lt;b&gt;2.&lt;/b&gt; Slowly move the page away from you until the numbered patches fade to match the background.
+&lt;p&gt;&lt;b&gt;3.&lt;/b&gt; Select the number (below) between &lt;i&gt;1&lt;/i&gt; and &lt;i&gt;81 &lt;/i&gt;of the numbered patch that &lt;b&gt;best &lt;/b&gt;matches the background:</source>
+ <translation>&lt;b&gt;Eine Seite mit Farbfeldern wird gedruckt. Gehen Sie nach Abschluss des Druckvorgangs folgendermaßen vor:&lt;/b&gt;
+&lt;p&gt;&lt;b&gt;1.&lt;/b&gt; Halten Sie die Seite in einem Abstand von etwa 20 cm vor sich.
+&lt;p&gt;&lt;b&gt;2.&lt;/b&gt; Bewegen Sie die Seite langsam von sich weg, bis die nummerierten Felder beginnen, mit dem Hintergrund zu verschmelzen.
+&lt;p&gt;&lt;b&gt;3.&lt;/b&gt; Ermitteln Sie die Zahl (zwischen &lt;i&gt;1&lt;/i&gt; und &lt;i&gt;81&lt;/i&gt;) des nummerierten Felds, das &lt;b&gt;am besten&lt;/b&gt; mit dem Hintergrund übereinstimmt:</translation>
+ </message>
+ <message>
+ <source>Number of best matching patch (1-81):</source>
+ <translation>Zahl des Felds mit der besten Ãœbereinstimmung (1 - 81):</translation>
+ </message>
+</context>
+<context>
+ <name>ColorCalForm_base</name>
+ <message>
+ <source>HP Device Manager - Color Calibration</source>
+ <translation>HP Geräte-Manager – Farbkalibrierung</translation>
+ </message>
+ <message>
+ <source>Next &gt;</source>
+ <translation>Weiter &gt;</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Abbrechen</translation>
+ </message>
+ <message>
+ <source>Color Calibration</source>
+ <translation>Farbkalibrierung</translation>
+ </message>
+ <message>
+ <source>1</source>
+ <translation>1</translation>
+ </message>
+ <message>
+ <source>2</source>
+ <translation>2</translation>
+ </message>
+ <message>
+ <source>3</source>
+ <translation>3</translation>
+ </message>
+ <message>
+ <source>4</source>
+ <translation>4</translation>
+ </message>
+ <message>
+ <source>5</source>
+ <translation>5</translation>
+ </message>
+ <message>
+ <source>6</source>
+ <translation>6</translation>
+ </message>
+ <message>
+ <source>7</source>
+ <translation>7</translation>
+ </message>
+ <message>
+ <source>Choose the numbered image labeled &quot;1&quot; thru &quot;7&quot; that is &lt;b&gt;best color matched&lt;/b&gt; to the image labeled &quot;X&quot;.</source>
+ <translation>Ermitteln Sie aus den von &quot;1&quot; bis &quot;7&quot; nummerierten Grafiken die Grafik, deren &lt;b&gt;Farbe am besten&lt;/b&gt; mit der durch ein &quot;X&quot; gekennzeichneten Grafik übereinstimmt.</translation>
+ </message>
+</context>
+<context>
+ <name>CoverpageForm_base</name>
+ <message>
+ <source>HP Device Manager - Coverpages</source>
+ <translation>HP Geräte-Manager – Deckblätter</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Abbrechen</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>Coverpage Design</source>
+ <translation>Deckblattdesign</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Choose coverpage and enter optional message.&lt;b&gt;</source>
+ <translation>&lt;b&gt;Auswählen des Deckblatts und Eingeben einer optionalen Nachricht.&lt;b&gt;</translation>
+ </message>
+ <message>
+ <source>Regarding:</source>
+ <translation>Betreff:</translation>
+ </message>
+ <message>
+ <source>Optional Message &lt;i&gt;(Maximum 2048 characters or 32 lines preformatted)&lt;/i&gt;:</source>
+ <translation>Optionale Nachricht &lt;i&gt;(maximal 2.048 vorformatierte Zeichen oder 32 Zeilen)&lt;/i&gt;:</translation>
+ </message>
+ <message>
+ <source>Preformatted (preserve formatting)</source>
+ <translation>Vorformatiert (Formatierung beibehalten)</translation>
+ </message>
+</context>
+<context>
+ <name>DevMgr4</name>
+ <message>
+ <source>Functions</source>
+ <translation>Funktionen</translation>
+ </message>
+ <message>
+ <source>Functions &gt; Print</source>
+ <translation>Funktionen &gt; Drucken</translation>
+ </message>
+ <message>
+ <source>Functions &gt; Make Copies</source>
+ <translation>Funktionen &gt; Kopieren</translation>
+ </message>
+ <message>
+ <source>Functions &gt; Fax</source>
+ <translation>Funktionen &gt; Faxen</translation>
+ </message>
+ <message>
+ <source>Functions &gt; Unload Photo Card</source>
+ <translation>Funktionen &gt; Fotokarte entladen</translation>
+ </message>
+ <message>
+ <source>Tools</source>
+ <translation>Extras</translation>
+ </message>
+ <message>
+ <source>Tools &gt; Device Information</source>
+ <translation>Extras &gt; Geräteinformationen</translation>
+ </message>
+ <message>
+ <source>Tools &gt; Printer Information</source>
+ <translation>Extras &gt; Druckerinformationen</translation>
+ </message>
+ <message>
+ <source>Tools &gt; Print Test Page</source>
+ <translation>Extras &gt; Testseite drucken</translation>
+ </message>
+ <message>
+ <source>Printer Name:</source>
+ <translation>Druckername:</translation>
+ </message>
+ <message>
+ <source>Print &gt;&gt;</source>
+ <translation>Drucken &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>Print...</source>
+ <translation>Drucken...</translation>
+ </message>
+ <message>
+ <source>Scan &gt;&gt;</source>
+ <translation>Scannen &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>Scan...</source>
+ <translation>Scannen...</translation>
+ </message>
+ <message>
+ <source>Access Photo Cards &gt;&gt;</source>
+ <translation>Fotokarten öffnen &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>Access Photo Cards...</source>
+ <translation>Fotokarten öffnen...</translation>
+ </message>
+ <message>
+ <source>Send Fax &gt;&gt;</source>
+ <translation>Fax senden &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>Send Fax...</source>
+ <translation>Fax senden...</translation>
+ </message>
+ <message>
+ <source>Make Copies &gt;&gt;</source>
+ <translation>Kopieren &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>Make Copies...</source>
+ <translation>Kopieren...</translation>
+ </message>
+ <message>
+ <source>Device Settings...</source>
+ <translation>Geräteeinstellungen...</translation>
+ </message>
+ <message>
+ <source>Refresh Device</source>
+ <translation>Gerät aktualisieren</translation>
+ </message>
+ <message>
+ <source>Refresh All</source>
+ <translation>Alle aktualisieren</translation>
+ </message>
+ <message>
+ <source>HP Device Manager - %1</source>
+ <translation>HP Geräte-Manager – %1</translation>
+ </message>
+ <message>
+ <source>Refreshing Device List - HP Device Manager</source>
+ <translation>Aktualisieren der Geräteliste – HP Geräte-Manager</translation>
+ </message>
+ <message>
+ <source>Refreshing device list...</source>
+ <translation>Geräteliste wird aktualisiert...</translation>
+ </message>
+ <message>
+ <source>Press F6 to refresh.</source>
+ <translation>Drücken Sie zum Aktualisieren die F6-Taste.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Photocards on your printer are only available by mounting them as drives using USB mass storage.&lt;/b&gt;&lt;p&gt;Please refer to your distribution&apos;s documentation for setup and usage instructions.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Fotokarten sind auf dem Drucker nur verfügbar, wenn sie als Laufwerk mit USB-Massenspeicher bereitgestellt (gemounted) werden.&lt;/b&gt;&lt;p&gt;Informationen zur Einrichtung und Verwendung finden Sie in der Dokumentation der jeweiligen Distribution.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Unable to run command. No command specified.&lt;/b&gt;&lt;p&gt;Use &lt;pre&gt;Configure...&lt;/pre&gt; to specify a command to run.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Der Befehl kann nicht ausgeführt werden. Es wurde kein Befehl angegeben.&lt;/b&gt;&lt;p&gt;Verwenden Sie zum Angeben eines auszuführenden Befehls die Option &lt;pre&gt;Konfigurieren...&lt;/pre&gt;.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Unable to find an appropriate su/sudo utility to run hp-setup.&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Zum Ausführen des HP Setups wurde kein geeignetes su/sudo-Programm gefunden.&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Annoying Confirmation: Are you sure you want to remove this device?&lt;/b&gt;</source>
+<translation>&lt;b&gt;Störende Bestätigungsaufforderung: Möchten Sie dieses Gerät wirklich entfernen?&lt;/b&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>DevMgr4_base</name>
+ <message>
+ <source>HP Device Manager</source>
+ <translation>HP Geräte-Manager</translation>
+ </message>
+ <message>
+ <source>Functions</source>
+ <translation>Funktionen</translation>
+ </message>
+ <message>
+ <source>Status</source>
+ <translation>Status</translation>
+ </message>
+ <message>
+ <source>Supplies</source>
+ <translation>Verbrauchsmaterialien</translation>
+ </message>
+ <message>
+ <source>Tools</source>
+ <translation>Extras</translation>
+ </message>
+ <message>
+ <source>Print Settings</source>
+ <translation>Druckereinstellungen</translation>
+ </message>
+ <message>
+ <source>Print Control</source>
+ <translation>Druckersteuerung</translation>
+ </message>
+ <message>
+ <source>Contents</source>
+ <translation>Inhalt</translation>
+ </message>
+ <message>
+ <source>&amp;Contents...</source>
+ <translation>&amp;Inhalt...</translation>
+ </message>
+ <message>
+ <source>Help Contents (F1)</source>
+ <translation>Hilfeinhalt (F1)</translation>
+ </message>
+ <message>
+ <source>F1</source>
+ <translation>F1</translation>
+ </message>
+ <message>
+ <source>Index</source>
+ <translation>Index</translation>
+ </message>
+ <message>
+ <source>&amp;Index...</source>
+ <translation>&amp;Index...</translation>
+ </message>
+ <message>
+ <source>&amp;About...</source>
+ <translation>&amp;Info...</translation>
+ </message>
+ <message>
+ <source>About HP Device Manager...</source>
+ <translation>Info...</translation>
+ </message>
+ <message>
+ <source>Refresh Device</source>
+ <translation>Gerät aktualisieren</translation>
+ </message>
+ <message>
+ <source>Refresh Device (F5)</source>
+ <translation>Gerät aktualisieren (F5)</translation>
+ </message>
+ <message>
+ <source>F5</source>
+ <translation>F5</translation>
+ </message>
+ <message>
+ <source>Exit</source>
+ <translation>Beenden</translation>
+ </message>
+ <message>
+ <source>Exit HP Device Manager</source>
+ <translation>HP Geräte-Manager beenden</translation>
+ </message>
+ <message>
+ <source>Ctrl+Q</source>
+ <translation>STRG+Q</translation>
+ </message>
+ <message>
+ <source>Popup Alerts...</source>
+ <translation>Popupwarnhinweise...</translation>
+ </message>
+ <message>
+ <source>Popup alerts...</source>
+ <translation>Popupwarnhinweise...</translation>
+ </message>
+ <message>
+ <source>Configure popup alerts</source>
+ <translation>Popupwarnhinweise konfigurieren</translation>
+ </message>
+ <message>
+ <source>Email alerts...</source>
+ <translation>E-Mail-Warnhinweise...</translation>
+ </message>
+ <message>
+ <source>Configure email alerts</source>
+ <translation>E-Mail-Warnhinweise konfigurieren</translation>
+ </message>
+ <message>
+ <source>Settings...</source>
+ <translation>Einstellungen...</translation>
+ </message>
+ <message>
+ <source>F2</source>
+ <translation>F2</translation>
+ </message>
+ <message>
+ <source>Refresh All</source>
+ <translation>Alle aktualisieren</translation>
+ </message>
+ <message>
+ <source>F6</source>
+ <translation>F6</translation>
+ </message>
+ <message>
+ <source>Auto Refresh</source>
+ <translation>Automatische Aktualisierung</translation>
+ </message>
+ <message>
+ <source>Turn on/off Auto Refresh (Ctrl+A)</source>
+ <translation>Automatische Aktualisierung aktivieren/deaktivieren (STRG+A)</translation>
+ </message>
+ <message>
+ <source>Ctrl+A</source>
+ <translation>STRG+A</translation>
+ </message>
+ <message>
+ <source>Action</source>
+ <translation>Aktion</translation>
+ </message>
+ <message>
+ <source>Device Settings (F3)</source>
+ <translation>Geräteeinstellungen (F3)</translation>
+ </message>
+ <message>
+ <source>F3</source>
+ <translation>F3</translation>
+ </message>
+ <message>
+ <source>Support...</source>
+ <translation>Support...</translation>
+ </message>
+ <message>
+ <source>Setup New Device...</source>
+ <translation>Neues Gerät einrichten...</translation>
+ </message>
+ <message>
+ <source>Ins</source>
+ <translation>EINFG</translation>
+ </message>
+ <message>
+ <source>Remove Device...</source>
+ <translation>Gerät entfernen...</translation>
+ </message>
+ <message>
+ <source>Del</source>
+ <translation>ENTF</translation>
+ </message>
+ <message>
+ <source>Device</source>
+ <translation>Gerät</translation>
+ </message>
+ <message>
+ <source>Configure</source>
+ <translation>Konfigurieren</translation>
+ </message>
+ <message>
+ <source>&amp;Help</source>
+ <translation>&amp;Hilfe</translation>
+ </message>
+</context>
+<context>
+ <name>FaxAddrBookEditForm</name>
+ <message>
+ <source>New Fax Group</source>
+ <translation type="obsolete">Neue Faxgruppe</translation>
+ </message>
+ <message>
+ <source>New Group Name:</source>
+ <translation type="obsolete">Name der neuen Gruppe:</translation>
+ </message>
+</context>
+<context>
+ <name>FaxAddrBookEditForm_base</name>
+ <message>
+ <source>Group Name</source>
+ <translation>Gruppenname</translation>
+ </message>
+ <message>
+ <source>HP Device Manager - Fax Address Book Entry</source>
+ <translation>HP Geräte-Manager – Eintrag für Faxadressbuch</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Abbrechen</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>First Name:</source>
+ <translation>Vorname:</translation>
+ </message>
+ <message>
+ <source>New Group...</source>
+ <translation type="obsolete">Neue Gruppe...</translation>
+ </message>
+ <message>
+ <source>Member of Group(s):</source>
+ <translation>Mitglied der Gruppe(n):</translation>
+ </message>
+ <message>
+ <source>Last Name:</source>
+ <translation>Nachname:</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Fax Number:&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Faxnummer:&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Notes/Other Information:</source>
+ <translation>Hinweise/Weitere Informationen:</translation>
+ </message>
+ <message>
+ <source>Title:</source>
+ <translation>Titel:</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Nickname:&lt;/b&gt;</source>
+ <translation type="obsolete">&lt;b&gt;Spitzname:&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Note: Items in &lt;b&gt;bold&lt;/b&gt; are required fields.</source>
+ <translation>Hinweis: Bei den &lt;b&gt;fett formatierten Elementen&lt;/b&gt; handelt es sich um erforderliche Felder.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Name/Nickname:&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Name/Spitzname:&lt;/b&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>FaxAddrBookForm</name>
+ <message>
+ <source>New...</source>
+ <translation>Neu...</translation>
+ </message>
+ <message>
+ <source>Edit...</source>
+ <translation>Bearbeiten...</translation>
+ </message>
+ <message>
+ <source>Delete...</source>
+ <translation>Löschen...</translation>
+ </message>
+ <message>
+ <source>Refresh List</source>
+ <translation>Liste aktualisieren</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Annoying Confirmation: Are you sure you want to delete this address book entry?&lt;/b&gt;</source>
+<translation>&lt;b&gt;Störende Bestätigungsaufforderung: Möchten Sie diesen Adressbucheintrag wirklich löschen?&lt;/b&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>FaxAddrBookForm_base</name>
+ <message>
+ <source>Nickname</source>
+ <translation>Spitzname</translation>
+ </message>
+ <message>
+ <source>Title</source>
+ <translation>Title</translation>
+ </message>
+ <message>
+ <source>First Name</source>
+ <translation>Vorname</translation>
+ </message>
+ <message>
+ <source>Last Name</source>
+ <translation>Nachname</translation>
+ </message>
+ <message>
+ <source>Fax Number</source>
+ <translation>Faxnummer</translation>
+ </message>
+ <message>
+ <source>Member of Group(s)</source>
+ <translation>Mitglied der Gruppe(n)</translation>
+ </message>
+ <message>
+ <source>Notes/Other Information</source>
+ <translation>Hinweise/Weitere Informationen</translation>
+ </message>
+ <message>
+ <source>HP Device Manager - Fax Address Book</source>
+ <translation>HP Geräte-Manager – Faxadressbuch</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>New...</source>
+ <translation>Neu...</translation>
+ </message>
+ <message>
+ <source>Edit...</source>
+ <translation>Bearbeiten...</translation>
+ </message>
+ <message>
+ <source>Delete...</source>
+ <translation>Löschen...</translation>
+ </message>
+ <message>
+ <source>Groups...</source>
+ <translation>Gruppen...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Fax Addresses:&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Faxadressen:&lt;/b&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>FaxAddrBookGroupEditForm_base</name>
+ <message>
+ <source>Group Members</source>
+ <translation>Gruppenmitglieder</translation>
+ </message>
+ <message>
+ <source>HP Device Manager - Fax Address Book Group</source>
+ <translation>HP Geräte-Manager – Faxadressbuchgruppe</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Group Name:&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Gruppenname:&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Member Address Book Entries:&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Einträge für Mitgliederadressbuch:&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Abbrechen</translation>
+ </message>
+</context>
+<context>
+ <name>FaxAddrBookGroupsForm</name>
+ <message>
+ <source>New...</source>
+ <translation>Neu...</translation>
+ </message>
+ <message>
+ <source>Edit...</source>
+ <translation>Bearbeiten...</translation>
+ </message>
+ <message>
+ <source>Delete...</source>
+ <translation>Löschen...</translation>
+ </message>
+ <message>
+ <source>Refresh List</source>
+ <translation>Liste aktualisieren</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Annoying Confirmation: Are you sure you want to delete this group?&lt;/b&gt;</source>
+<translation>&lt;b&gt;Störende Bestätigungsaufforderung: Möchten Sie diese Gruppe wirklich löschen?&lt;/b&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>FaxAddrBookGroupsForm_base</name>
+ <message>
+ <source>Group Name</source>
+ <translation>Gruppenname</translation>
+ </message>
+ <message>
+ <source>Group Members</source>
+ <translation>Gruppenmitglieder</translation>
+ </message>
+ <message>
+ <source>HP Device Manager - Fax Address Book Groups</source>
+ <translation>HP Geräte-Manager – Faxadressbuchgruppen</translation>
+ </message>
+ <message>
+ <source>New...</source>
+ <translation>Neu...</translation>
+ </message>
+ <message>
+ <source>Delete...</source>
+ <translation>Löschen...</translation>
+ </message>
+ <message>
+ <source>Edit...</source>
+ <translation>Bearbeiten...</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Groups:&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Gruppen:&lt;/b&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>FaxSendJobForm</name>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;You may not specify both a printer (-p) and a device (-d).</source>
+ <translation>&lt;p&gt;&lt;b&gt;Das gleichzeitige Angeben eines Druckers (-p) und eines Geräts (-d) ist nicht möglich.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Unknown printer name: %1&lt;/b&gt;&lt;p&gt;Please check the printer name and try again.</source>
+ <translation>&lt;b&gt;Unbekannter Druckername: %1&lt;/b&gt;&lt;p&gt;Überprüfen Sie den Druckernamen, und wiederholen Sie den Vorgang.</translation>
+ </message>
+ <message>
+ <source>You must specify a printer that has a device URI in the form &apos;hpfax:/...&apos;</source>
+ <translation>Der angegebene Drucker muss einen Geräte-URI im folgenden Format besitzen: &apos;hpfax:/...&apos;</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;No devices found.&lt;/b&gt;&lt;p&gt;Please make sure your device is properly installed and try again.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Es wurden keine Geräte gefunden.&lt;/b&gt;&lt;p&gt;Vergewissern Sie sich, dass das Gerät ordnungsgemäß installiert ist, und wiederholen Sie den Vorgang.</translation>
+ </message>
+ <message>
+ <source>HP Device Manager - Send Fax</source>
+ <translation>HP Geräte-Manager – Faxversand</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Fax send completed successfully.&lt;/b&gt;</source>
+ <translation>&lt;p&gt;&lt;b&gt;Sendevorgang für Fax abgeschlossen.&lt;/b&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>FaxSettingsForm_base</name>
+ <message>
+ <source>HP Device Manager - Fax Settings</source>
+ <translation>HP Geräte-Manager – Faxeinstellungen</translation>
+ </message>
+ <message>
+ <source>Fax Header Information</source>
+ <translation>Kopfzeileninformationen für Fax</translation>
+ </message>
+ <message>
+ <source>Device Fax Number:</source>
+ <translation>Faxnummer des Geräts:</translation>
+ </message>
+ <message>
+ <source>Name and/or Company:</source>
+ <translation>Name bzw. Unternehmen:</translation>
+ </message>
+ <message>
+ <source>&lt;i&gt;This information will appear at the top of each fax that you send.&lt;/i&gt;</source>
+ <translation>&lt;i&gt;Diese Informationen erscheinen am oberen Rand jedes gesendeten Fax.&lt;/i&gt;</translation>
+ </message>
+ <message>
+ <source>Coverpage Information</source>
+ <translation>Deckblattinformationen</translation>
+ </message>
+ <message>
+ <source>Voice phone number:</source>
+ <translation>Telefonnummer:</translation>
+ </message>
+ <message>
+ <source>Email address:</source>
+ <translation>E-Mail-Adresse:</translation>
+ </message>
+ <message>
+ <source>&lt;i&gt;This information will appear on any coverpage that you send.&lt;/i&gt;</source>
+ <translation>&lt;i&gt;Diese Informationen erscheinen auf jedem gesendeten Deckblatt.&lt;/i&gt;</translation>
+ </message>
+ <message>
+ <source>Information</source>
+ <translation>Informationen</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Configure device settings for sending faxes.&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Konfigurieren der Geräteeinstellungen für den Faxversand.&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Abbrechen</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+</context>
+<context>
+ <name>ImagePropertiesDlg_base</name>
+ <message>
+ <source>EXIF Labels</source>
+ <translation>EXIF-Beschriftungen</translation>
+ </message>
+ <message>
+ <source>Contents </source>
+ <translation>Inhalt</translation>
+ </message>
+ <message>
+ <source>Properties for</source>
+ <translation>Eigenschaften für</translation>
+ </message>
+ <message>
+ <source>MIME Type:</source>
+ <translation>MIME-Typ:</translation>
+ </message>
+ <message>
+ <source>Size:</source>
+ <translation>Größe:</translation>
+ </message>
+ <message>
+ <source>Location:</source>
+ <translation>Speicherort:</translation>
+ </message>
+ <message>
+ <source>LOCATION</source>
+ <translation>SPEICHERORT</translation>
+ </message>
+ <message>
+ <source>MIME TYPE</source>
+ <translation>MIME-TYP</translation>
+ </message>
+ <message>
+ <source>SIZE</source>
+ <translation>GRÖSSE</translation>
+ </message>
+ <message>
+ <source>FILENAME</source>
+ <translation>DATEINAME</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+</context>
+<context>
+ <name>LoadPaperForm_base</name>
+ <message>
+ <source>HP Device Manager - Load Plain Paper</source>
+ <translation>HP Geräte-Manager – Einlegen von Normalpapier</translation>
+ </message>
+ <message>
+ <source>Continue</source>
+ <translation>Weiter</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Abbrechen</translation>
+ </message>
+ <message>
+ <source>A page will be printed. Please load &lt;b&gt;plain paper&lt;/b&gt; in the printer and then press continue.</source>
+ <translation>Eine Seite wird gedruckt. Legen Sie &lt;b&gt;Normalpapier&lt;/b&gt; in den Drucker ein, und klicken Sie anschließend auf &lt;i&gt;&quot;Weiter&quot;&lt;/i&gt;.</translation>
+ </message>
+</context>
+<context>
+ <name>MakeCopiesForm</name>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;You may not specify both a printer (-p) and a device (-d).</source>
+ <translation>&lt;p&gt;&lt;b&gt;Das gleichzeitige Angeben eines Druckers (-p) und eines Geräts (-d) ist nicht möglich.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;No devices found.&lt;/b&gt;&lt;p&gt;Please make sure your device is properly installed and try again.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Es wurden keine Geräte gefunden.&lt;/b&gt;&lt;p&gt;Vergewissern Sie sich, dass das Gerät ordnungsgemäß installiert ist, und wiederholen Sie den Vorgang.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Sorry, make copies functionality is not implemented for this device.&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Dieses Gerät verfügt leider nicht über eine Kopierfunktion.&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>HP Device Manager - Make Copies</source>
+ <translation>HP Geräte-Manager – Kopieren</translation>
+ </message>
+</context>
+<context>
+ <name>MakeCopiesForm_base</name>
+ <message>
+ <source>HP Device Manager - Make Copies</source>
+ <translation>HP Geräte-Manager – Kopieren</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Schließen</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Make copies.&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Erstellen von Kopien.&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Make Copies</source>
+ <translation>Kopieren</translation>
+ </message>
+ <message>
+ <source>Quality:</source>
+ <translation>Qualität:</translation>
+ </message>
+ <message>
+ <source>Fast</source>
+ <translation>Schnell</translation>
+ </message>
+ <message>
+ <source>Draft</source>
+ <translation>Entwurf</translation>
+ </message>
+ <message>
+ <source>Normal</source>
+ <translation>Normal</translation>
+ </message>
+ <message>
+ <source>Presentation</source>
+ <translation>Präsentation</translation>
+ </message>
+ <message>
+ <source>Best</source>
+ <translation>Maximal</translation>
+ </message>
+ <message>
+ <source>Number of Copies:</source>
+ <translation>Kopien:</translation>
+ </message>
+ <message>
+ <source>Contrast:</source>
+ <translation>Kontrast:</translation>
+ </message>
+ <message>
+ <source>+0</source>
+ <translation>+0</translation>
+ </message>
+ <message>
+ <source>Enlargement/Reduction:</source>
+ <translation>Vergrößern/Verkleinern:</translation>
+ </message>
+ <message>
+ <source>400%</source>
+ <translation>400 %</translation>
+ </message>
+ <message>
+ <source>Fit to page</source>
+ <translation>Auf Seite einpassen</translation>
+ </message>
+ <message>
+ <source>Copy</source>
+ <translation>Kopieren</translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation>Name:</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Device information/status and output queue name.&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Geräteinformationen/-status und Name der Ausgabewarteschlange.&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Status:</source>
+ <translation>Status:</translation>
+ </message>
+ <message>
+ <source>Refresh status</source>
+ <translation>Status aktualisieren</translation>
+ </message>
+ <message>
+ <source>Comment:</source>
+ <translation>Anmerkung:</translation>
+ </message>
+ <message>
+ <source>Location:</source>
+ <translation>Speicherort:</translation>
+ </message>
+ <message>
+ <source>Device URI:</source>
+ <translation>Geräte-URI:</translation>
+ </message>
+ <message>
+ <source>Device</source>
+ <translation>Gerät</translation>
+ </message>
+</context>
+<context>
+ <name>NoDevicesForm</name>
+ <message>
+ <source>&lt;b&gt;Unable to find an appropriate su/sudo utility to run hp-setup.&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Zum Ausführen des HP Setups wurde kein geeignetes su/sudo-Programm gefunden.&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;An I/O error occurred.&lt;/b&gt;&lt;p&gt;Please re-start the Device Manager and try again.</source>
+<translation>&lt;b&gt;Ein E/A-Fehler ist aufgetreten.&lt;/b&gt;&lt;p&gt;Starten Sie den Geräte-Manager neu, und wiederholen Sie den Vorgang.</translation>
+ </message>
+</context>
+<context>
+ <name>NoDevicesForm_base</name>
+ <message>
+ <source>HP Device Manager - No Installed HP Devices Found</source>
+ <translation>HP Geräte-Manager – Keine installierten HP Geräte gefunden</translation>
+ </message>
+ <message>
+ <source>Setup Device...</source>
+ <translation>Gerät einrichten...</translation>
+ </message>
+ <message>
+ <source>CUPS Web Interface</source>
+ <translation>CUPS-Weboberfläche</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Schließen</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;&lt;font size=&quot;+2&quot;&gt;No Installed HP Devices Found.&lt;/font&gt;&lt;/b&gt;&lt;p&gt;To install a device, use one of the following methods:&lt;p&gt;
+1.Run &lt;b&gt;hp-setup&lt;/b&gt; (in a shell/terminal or click &lt;tt&gt;Setup Device...&lt;/tt&gt; below).&lt;p&gt;
+2. &lt;b&gt;CUPS web interface&lt;/b&gt; (open a browser to: &lt;u&gt;http://localhost:631&lt;/u&gt; or press the button below),&lt;p&gt;
+3. The &lt;b&gt;printer installation utility&lt;/b&gt; that came with your operating system (YaST, PrinterDrake, etc).
+&lt;p&gt;&lt;p&gt;After setting up a printer, you may have to press &lt;tt&gt;F6&lt;/tt&gt; or chose &lt;tt&gt;Device | Refresh All&lt;/tt&gt; for the printer to appear in the HP Device Manager.&lt;p&gt;
+&lt;i&gt;&lt;b&gt;Note: Only devices installed with the &lt;tt&gt;hp:&lt;/tt&gt; CUPS backend will appear in the HP Device Manager.&lt;/b&gt;&lt;/i&gt;&lt;p&gt;</source>
+ <translation>&lt;b&gt;&lt;font size=&quot;+2&quot;&gt;Es wurden keine installierten HP Geräte gefunden.&lt;/font&gt;&lt;/b&gt;&lt;p&gt;Verwenden Sie zum Installieren eines Geräts eine der folgenden Methoden:&lt;p&gt;
+1.Führen Sie &lt;b&gt;hp-setup&lt;/b&gt; aus (in einer Shell/einem Terminal oder durch Klicken auf &lt;tt&gt;Gerät einrichten...&lt;/tt&gt;).&lt;p&gt;
+2. &lt;b&gt;CUPS-Weboberfläche&lt;/b&gt;. (Öffnen Sie &lt;u&gt;http://localhost:631&lt;/u&gt; in einem Browser, oder klicken Sie auf die angezeigte Schaltfläche.)&lt;p&gt;
+3. &lt;b&gt;Druckerinstallationsprogramm&lt;/b&gt; des verwendeten Betriebssystems (YaST, PrinterDrake usw.).
+&lt;p&gt;&lt;p&gt;Nach dem Einrichten des Druckers ist möglicherweise das Drücken der Taste &lt;tt&gt;F6&lt;/tt&gt; oder das Klicken auf &lt;tt&gt;Gerät | Alle aktualisieren&lt;/tt&gt; erforderlich, damit der Drucker im HP Geräte-Manager angezeigt wird.&lt;p&gt;
+&lt;i&gt;&lt;b&gt;Hinweis: Im HP Geräte-Manager werden ausschließlich Geräte angezeigt, die mit dem CUPS-Back-End &lt;tt&gt;hp:&lt;/tt&gt; installiert wurden.&lt;/b&gt;&lt;/i&gt;&lt;p&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>PaperEdgeAlignForm_base</name>
+ <message>
+ <source>HP Device Manager - Paper Edge Alignment</source>
+ <translation>HP Geräte-Manager – Papierkantenausrichtung</translation>
+ </message>
+ <message>
+ <source>Next &gt;</source>
+ <translation>Weiter &gt;</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Abbrechen</translation>
+ </message>
+ <message>
+ <source>Paper Edge</source>
+ <translation>Papierkante</translation>
+ </message>
+ <message>
+ <source>1</source>
+ <translation>1</translation>
+ </message>
+ <message>
+ <source>2</source>
+ <translation>2</translation>
+ </message>
+ <message>
+ <source>3</source>
+ <translation>3</translation>
+ </message>
+ <message>
+ <source>4</source>
+ <translation>4</translation>
+ </message>
+ <message>
+ <source>5</source>
+ <translation>5</translation>
+ </message>
+ <message>
+ <source>6</source>
+ <translation>6</translation>
+ </message>
+ <message>
+ <source>7</source>
+ <translation>7</translation>
+ </message>
+ <message>
+ <source>8</source>
+ <translation>8</translation>
+ </message>
+ <message>
+ <source>9</source>
+ <translation>9</translation>
+ </message>
+ <message>
+ <source>10</source>
+ <translation>10</translation>
+ </message>
+ <message>
+ <source>11</source>
+ <translation>11</translation>
+ </message>
+ <message>
+ <source>12</source>
+ <translation>12</translation>
+ </message>
+ <message>
+ <source>13</source>
+ <translation>13</translation>
+ </message>
+ <message>
+ <source>Choose the &lt;b&gt;numbered arrow&lt;/b&gt; that &lt;b&gt;best &lt;/b&gt;marks the edge of the paper.</source>
+ <translation>Ermitteln Sie den &lt;b&gt;nummerierten Pfeil&lt;/b&gt;, der den Seitenrand &lt;b&gt;am besten&lt;/b&gt; markiert.</translation>
+ </message>
+</context>
+<context>
+ <name>PasswordDialog</name>
+ <message>
+ <source>HP Device Manager - Enter Password</source>
+ <translation>HP Geräte-Manager – Kennworteingabe</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+</context>
+<context>
+ <name>PowerSettingsDialog</name>
+ <message>
+ <source>15 minutes</source>
+ <translation>15 Minuten</translation>
+ </message>
+ <message>
+ <source>30 minutes</source>
+ <translation>30 Minuten</translation>
+ </message>
+ <message>
+ <source>45 minutes</source>
+ <translation>45 Minuten</translation>
+ </message>
+ <message>
+ <source>1 hour</source>
+ <translation>1 Stunde</translation>
+ </message>
+ <message>
+ <source>2 hours</source>
+ <translation>2 Stunden</translation>
+ </message>
+ <message>
+ <source>3 hours</source>
+ <translation>3 Stunden</translation>
+ </message>
+</context>
+<context>
+ <name>PowerSettingsDialog_base</name>
+ <message>
+ <source>HP Device Manager - Battery Mode Power Settings</source>
+ <translation>HP Geräte-Manager – Energieeinstellungen für Akkumodus</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Configure the power off settings when operating on battery power&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Konfigurieren der Abschalteinstellungen für den Akkubetrieb.&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Abbrechen</translation>
+ </message>
+ <message>
+ <source>Power Settings</source>
+ <translation>Energieeinstellungen</translation>
+ </message>
+ <message>
+ <source>Automatically turn off printer after:</source>
+ <translation>Drucker automatisch ausschalten nach:</translation>
+ </message>
+ <message>
+ <source>Always leave printer on</source>
+ <translation>Drucker nicht ausschalten</translation>
+ </message>
+</context>
+<context>
+ <name>PrinterForm</name>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;You may not specify both a printer (-p) and a device (-d).</source>
+ <translation>&lt;p&gt;&lt;b&gt;Das gleichzeitige Angeben eines Druckers (-p) und eines Geräts (-d) ist nicht möglich.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;No devices found.&lt;/b&gt;&lt;p&gt;Please make sure your device is properly installed and try again.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Es wurden keine Geräte gefunden.&lt;/b&gt;&lt;p&gt;Vergewissern Sie sich, dass das Gerät ordnungsgemäß installiert ist, und wiederholen Sie den Vorgang.</translation>
+ </message>
+ <message>
+ <source>HP Device Manager - Print</source>
+ <translation>HP Geräte-Manager – Drucken</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollCopyView</name>
+ <message>
+ <source>Number of Copies</source>
+<translation>Kopien</translation>
+ </message>
+ <message>
+ <source>Enlargement, Reduction and Fit to Page</source>
+<translation>Vergrößern, Verkleinern und Auf Seite einpassen</translation>
+ </message>
+ <message>
+ <source>Copy Contrast</source>
+<translation>Kopierkontrast</translation>
+ </message>
+ <message>
+ <source>Copy Quality</source>
+<translation>Kopierqualität</translation>
+ </message>
+ <message>
+ <source>&lt;&lt; Functions</source>
+<translation>&lt;&lt; Funktionen</translation>
+ </message>
+ <message>
+ <source>Close</source>
+<translation>Schließen</translation>
+ </message>
+ <message>
+ <source>Make Copies(s)</source>
+<translation>Kopieren</translation>
+ </message>
+ <message>
+ <source>Number of copies:</source>
+<translation>Anzahl Kopien:</translation>
+ </message>
+ <message>
+ <source>Default</source>
+<translation>Standard</translation>
+ </message>
+ <message>
+ <source>Quality:</source>
+<translation>Qualität:</translation>
+ </message>
+ <message>
+ <source>Fast</source>
+<translation>Schnell</translation>
+ </message>
+ <message>
+ <source>Draft</source>
+<translation>Entwurf</translation>
+ </message>
+ <message>
+ <source>Normal</source>
+<translation>Normal</translation>
+ </message>
+ <message>
+ <source>Presentation</source>
+<translation>Präsentation</translation>
+ </message>
+ <message>
+ <source>Best</source>
+ <translation>Maximal</translation>
+ </message>
+ <message>
+ <source>Enlargement or reduction (percent):</source>
+<translation>Vergrößern oder Verkleinern (Prozent):</translation>
+ </message>
+ <message>
+ <source>Fit to Page</source>
+<translation>Vergrößern, Verkleinern und Auf Seite einpassen</translation>
+ </message>
+ <message>
+ <source>Contrast (-5 lighter to +5 darker):</source>
+<translation>Kontrast (-5 heller bis +5 dunkler):</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Copier error.&lt;/b&gt;&lt;p&gt;</source>
+<translation>&lt;b&gt;Kopiererfehler.&lt;/b&gt;&lt;p&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Cannot copy: Device is busy or not available.&lt;/b&gt;&lt;p&gt;Please check device and try again. [1]</source>
+<translation>&lt;b&gt;Kopieren nicht möglich: Das Gerät ist ausgelastet oder nicht verfügbar.&lt;/b&gt;&lt;p&gt;Überprüfen Sie das Gerät, und wiederholen Sie den Vorgang. [1]</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollDeviceInfoView</name>
+ <message>
+ <source>&lt;&lt; Tools</source>
+ <translation>&lt;&lt; Extras</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Schließen</translation>
+ </message>
+ <message>
+ <source>Device Information</source>
+ <translation>Geräteinformationen</translation>
+ </message>
+ <message>
+ <source>Static/Dynamic</source>
+ <translation>Statisch/Dynamisch</translation>
+ </message>
+ <message>
+ <source>Key</source>
+ <translation>Schlüssel</translation>
+ </message>
+ <message>
+ <source>Value</source>
+ <translation>Wert</translation>
+ </message>
+ <message>
+ <source>Static</source>
+ <translation>Statisch</translation>
+ </message>
+ <message>
+ <source>Dynamic</source>
+ <translation>Dynamisch</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollFaxView</name>
+ <message>
+ <source>PDF Document</source>
+ <translation>PDF-Dokument</translation>
+ </message>
+ <message>
+ <source>Postscript Document</source>
+ <translation>Postscript-Dokument</translation>
+ </message>
+ <message>
+ <source>HP Graphics Language File</source>
+ <translation>HP Graphics Language-Datei</translation>
+ </message>
+ <message>
+ <source>C Shell Script</source>
+ <translation>C-Shell-Skript</translation>
+ </message>
+ <message>
+ <source>C Source Code</source>
+ <translation>C-Quellcode</translation>
+ </message>
+ <message>
+ <source>C++ Source Code</source>
+ <translation>C++-Quellcode</translation>
+ </message>
+ <message>
+ <source>Perl Script</source>
+ <translation>Perl-Skript</translation>
+ </message>
+ <message>
+ <source>Python Program</source>
+ <translation>Python-Programm</translation>
+ </message>
+ <message>
+ <source>Shell Script</source>
+ <translation>Shell-Skript</translation>
+ </message>
+ <message>
+ <source>Plain Text</source>
+ <translation>Normaltext</translation>
+ </message>
+ <message>
+ <source>HTML Dcoument</source>
+ <translation>HTML-Dokument</translation>
+ </message>
+ <message>
+ <source>GIF Image</source>
+ <translation>GIF-Grafik</translation>
+ </message>
+ <message>
+ <source>PNG Image</source>
+ <translation>PNG-Grafik</translation>
+ </message>
+ <message>
+ <source>JPEG Image</source>
+ <translation>JPEG-Grafik</translation>
+ </message>
+ <message>
+ <source>TIFF Image</source>
+ <translation>TIFF-Grafik</translation>
+ </message>
+ <message>
+ <source>Bitmap (BMP) Image</source>
+ <translation>Bitmap-Grafik (BMP)</translation>
+ </message>
+ <message>
+ <source>Photo CD Image</source>
+ <translation>Foto-CD-Grafik</translation>
+ </message>
+ <message>
+ <source>Portable Image (PNM)</source>
+ <translation>Portable-Grafik (PNM)</translation>
+ </message>
+ <message>
+ <source>Portable B&amp;W Image (PBM)</source>
+ <translation>Portable-Schwarzweißgrafik (PBM)</translation>
+ </message>
+ <message>
+ <source>Portable Grayscale Image (PGM)</source>
+ <translation>Portable-Graustufengrafik (PGM)</translation>
+ </message>
+ <message>
+ <source>Portable Color Image (PPM)</source>
+ <translation>Portable-Farbgrafik (PGM)</translation>
+ </message>
+ <message>
+ <source>SGI RGB</source>
+ <translation>SGI RGB</translation>
+ </message>
+ <message>
+ <source>X11 Bitmap (XBM)</source>
+ <translation>X11-Bitmap (XBM)</translation>
+ </message>
+ <message>
+ <source>X11 Pixmap (XPM)</source>
+ <translation>X11-Pixmap (XPM)</translation>
+ </message>
+ <message>
+ <source>Sun Raster Format</source>
+ <translation>Sun-Raster-Format</translation>
+ </message>
+ <message>
+ <source>File(s) to Fax</source>
+ <translation>Zu faxende Datei(en)</translation>
+ </message>
+ <message>
+ <source>Add/Edit Fax Coverpage</source>
+ <translation>Faxdeckblatt hinzufügen/bearbeiten</translation>
+ </message>
+ <message>
+ <source>Recipient(s)</source>
+ <translation>Empfänger</translation>
+ </message>
+ <message>
+ <source>Add Recipients from the Fax Address Book</source>
+ <translation>Empfänger aus dem Faxadressbuch hinzufügen</translation>
+ </message>
+ <message>
+ <source>&lt;i&gt;Quick Add&lt;/i&gt; an Individual Recipient</source>
+ <translation>Einzelnen Empfänger &lt;i&gt;schnell hinzufügen&lt;/i&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;&lt; Functions</source>
+ <translation>&lt;&lt; Funktionen</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Schließen</translation>
+ </message>
+ <message>
+ <source>Send Fax Now</source>
+ <translation>Fax jetzt senden</translation>
+ </message>
+ <message>
+ <source>Processing fax...</source>
+ <translation>Fax wird verarbeitet...</translation>
+ </message>
+ <message>
+ <source>Receiving fax data...</source>
+ <translation>Faxdaten werden empfangen...</translation>
+ </message>
+ <message>
+ <source>Read %1 of fax data...</source>
+ <translation>%1 der Faxdaten gelesen...</translation>
+ </message>
+ <message>
+ <source>Order</source>
+ <translation>Reihenfolge</translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation>Name</translation>
+ </message>
+ <message>
+ <source>Type</source>
+ <translation>Typ</translation>
+ </message>
+ <message>
+ <source>Pages</source>
+ <translation>Seiten</translation>
+ </message>
+ <message>
+ <source>Path</source>
+ <translation>Pfad</translation>
+ </message>
+ <message>
+ <source>Add File...</source>
+ <translation>Datei hinzufügen...</translation>
+ </message>
+ <message>
+ <source>Show Types...</source>
+ <translation>Typen anzeigen...</translation>
+ </message>
+ <message>
+ <source>Remove File</source>
+ <translation>Datei entfernen</translation>
+ </message>
+ <message>
+ <source>Move Down</source>
+ <translation>Nach unten</translation>
+ </message>
+ <message>
+ <source>Move Up</source>
+ <translation>Nach oben</translation>
+ </message>
+ <message>
+ <source>Show File Types...</source>
+ <translation>Dateitypen anzeigen...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Invalid HPLIP Fax file.&lt;/b&gt;&lt;p&gt;Bad magic!</source>
+ <translation>&lt;b&gt;Ungültige HPLIP-Faxdatei.&lt;/b&gt;&lt;p&gt;Schlechtes Karma!</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;You are trying to add a file that cannot be directly faxed with this utility.&lt;/b&gt;&lt;p&gt;To print this file, use the print command in the application that created it.</source>
+ <translation>&lt;b&gt;Sie versuchen, eine Datei hinzuzufügen, die mit diesem Programm nicht direkt gefaxt werden kann.&lt;/b&gt;&lt;p&gt;Verwenden Sie zum Drucken der Datei den Druckbefehl der Anwendung, mit der die Datei erstellt wurde.</translation>
+ </message>
+ <message>
+ <source>Processing fax file...</source>
+ <translation>Faxdatei wird verarbeitet...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Printer &apos;%1&apos; is in a stopped or error state.&lt;/b&gt;&lt;p&gt;Check the printer queue in CUPS and try again.</source>
+ <translation>&lt;b&gt;Der Drucker &apos;%1&apos; wurde angehalten oder weist einen Fehler auf.&lt;/b&gt;&lt;p&gt;Überprüfen Sie die Druckerwarteschlange in CUPS, und wiederholen Sie den Vorgang.</translation>
+ </message>
+ <message>
+ <source>Edit...</source>
+ <translation>Bearbeiten...</translation>
+ </message>
+ <message>
+ <source>Add...</source>
+ <translation>Hinzufügen...</translation>
+ </message>
+ <message>
+ <source>HP Fax Coverpage</source>
+ <translation>HP Faxdeckblatt</translation>
+ </message>
+ <message>
+ <source>Cover Page</source>
+ <translation>Deckblatt</translation>
+ </message>
+ <message>
+ <source>Fax Number</source>
+ <translation>Faxnummer</translation>
+ </message>
+ <message>
+ <source>Notes</source>
+ <translation>Hinweise</translation>
+ </message>
+ <message>
+ <source>Fax Address Book...</source>
+ <translation>Faxadressbuch...</translation>
+ </message>
+ <message>
+ <source>Remove</source>
+ <translation>Entfernen</translation>
+ </message>
+ <message>
+ <source>Add Individual</source>
+ <translation>Person hinzufügen</translation>
+ </message>
+ <message>
+ <source>Add Group</source>
+ <translation>Gruppe hinzufügen</translation>
+ </message>
+ <message>
+ <source>Add an &lt;b&gt;individual &lt;/b&gt;from the fax address book:</source>
+ <translation>&lt;b&gt;Person&lt;/b&gt; aus dem Faxadressbuch hinzufügen:</translation>
+ </message>
+ <message>
+ <source>Add a &lt;b&gt;group&lt;/b&gt; from the fax address book:</source>
+ <translation>&lt;b&gt;Gruppe&lt;/b&gt; aus dem Faxadressbuch hinzufügen:</translation>
+ </message>
+ <message>
+ <source>Add</source>
+ <translation>Hinzufügen</translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation>Name:</translation>
+ </message>
+ <message>
+ <source>Fax Number:</source>
+ <translation>Faxnummer:</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Fax configuration error.&lt;/b&gt;&lt;p&gt;The CUPS fax queue for &apos;%1&apos; is incorrectly configured.&lt;p&gt;Please make sure that the CUPS fax queue is configured with the &apos;HPLIP Fax&apos; Model/Driver.</source>
+ <translation>&lt;b&gt;Faxkonfigurationsfehler.&lt;/b&gt;&lt;p&gt;Die CUPS-Faxwarteschlange für &apos;%1&apos; ist nicht ordnungsgemäß konfiguriert.&lt;p&gt;Stellen Sie sicher, dass die CUPS-Faxwarteschlange mit dem Modell/Treiber &apos;HPLIP Fax&apos; konfiguriert ist.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Device is busy or in an error state (code=%1)&lt;/b&gt;&lt;p&gt;Please wait for the device to become idle or clear the error and try again.</source>
+ <translation>&lt;b&gt;Das Gerät ist ausgelastet oder weist einen Fehler auf. (Code = %1)&lt;/b&gt;&lt;p&gt;Warten Sie, bis sich das Gerät im Leerlauf befindet, oder löschen Sie den Fehler, und wiederholen Sie den Vorgang.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;The CUPS queue for &apos;%1&apos; is in a stopped or busy state.&lt;/b&gt;&lt;p&gt;Please check the queue and try again.</source>
+ <translation>&lt;b&gt;Die CUPS-Warteschlange für &apos;%1&apos; ist ausgelastet oder wurde angehalten.&lt;/b&gt;&lt;p&gt;Überprüfen Sie die Warteschlange, und wiederholen Sie den Vorgang.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Send fax is active.&lt;/b&gt;&lt;p&gt;Please wait for operation to complete.</source>
+ <translation>&lt;b&gt;Ein Fax wird gerade gesendet.&lt;/b&gt;&lt;p&gt;Warten Sie, bis der Vorgang abgeschlossen ist.</translation>
+ </message>
+ <message>
+ <source>Initializing...</source>
+ <translation>Initialisierung...</translation>
+ </message>
+ <message>
+ <source>Processing page %1...</source>
+ <translation>Seite %1 wird verarbeitet...</translation>
+ </message>
+ <message>
+ <source>Dialing %1...</source>
+ <translation>%1 wird gewählt...</translation>
+ </message>
+ <message>
+ <source>Connecting to %1...</source>
+ <translation>Verbindung mit %1 wird hergestellt...</translation>
+ </message>
+ <message>
+ <source>Sending page %1 to %2...</source>
+ <translation>Seite %1 bis %2 wird gesendet...</translation>
+ </message>
+ <message>
+ <source>Cleaning up...</source>
+ <translation>Bereinigung...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Fax send error.&lt;/b&gt;&lt;p&gt;</source>
+ <translation>&lt;b&gt;Faxsendefehler.&lt;/b&gt;&lt;p&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Fax device is busy.&lt;/b&gt;&lt;p&gt;Please try again later.</source>
+ <translation>&lt;b&gt;Das Faxgerät ist ausgelastet.&lt;/b&gt;&lt;p&gt;Wiederholen Sie den Vorgang zu einem späteren Zeitpunkt.</translation>
+ </message>
+ <message>
+ <source>Added with Quick Add</source>
+<translation>Mit der Funktion zum schnellen Hinzufügen hinzugefügt</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollFunctionsView</name>
+ <message>
+ <source>Print &gt;&gt;</source>
+ <translation>Drucken &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>Print...</source>
+ <translation>Drucken...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Print&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Drucken&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Print documents or files.</source>
+ <translation>Drucken von Dokumenten oder Dateien.</translation>
+ </message>
+ <message>
+ <source>Scan &gt;&gt;</source>
+ <translation>Scannen &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>Scan...</source>
+ <translation>Scannen...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Scan&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Scannen&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Scan a document, image, or photograph.</source>
+ <translation>Scannen von Dokumenten, Grafiken oder Fotos.</translation>
+ </message>
+ <message>
+ <source>Send PC Fax &gt;&gt;</source>
+ <translation>PC-Fax senden &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>Send PC Fax...</source>
+ <translation>PC-Fax senden...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Send PC Fax&lt;/b&gt;</source>
+ <translation>&lt;b&gt;PC-Fax senden&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Send a fax from the PC.</source>
+ <translation>Senden eines Fax mithilfe des PCs.</translation>
+ </message>
+ <message>
+ <source>Make Copies &gt;&gt;</source>
+ <translation>Kopieren &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>Make Copies...</source>
+ <translation>Kopieren...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Make Copies&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Kopieren&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Make copies on the device controlled by the PC.</source>
+ <translation>PC-gesteuertes Erstellen von Kopien mithilfe des Geräts.</translation>
+ </message>
+ <message>
+ <source>Unload Photo Card &gt;&gt;</source>
+ <translation>Fotokarte entladen &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>Unload Photo Card...</source>
+ <translation>Fotokarte entladen...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Unload Photo Card&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Fotokarte entladen&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Copy images from the device&apos;s photo card to the PC.</source>
+ <translation>Kopieren von Bildern der Fotokarte des Geräts auf den PC.</translation>
+ </message>
+ <message>
+ <source>ERROR: Device not supported.</source>
+ <translation>FEHLER: Das Gerät wird nicht unterstützt.</translation>
+ </message>
+ <message>
+ <source>ERROR: Device not found. Please check connection and power-on device.</source>
+ <translation>FEHLER: Das Gerät wurde nicht gefunden. Überprüfen Sie, ob das Gerät eingeschaltet und ordnungsgemäß angeschlossen ist.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Photocards on your printer are only available by mounting them as drives using USB mass storage.&lt;/b&gt;&lt;p&gt;Please refer to your distribution&apos;s documentation for setup and usage instructions.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Fotokarten sind auf dem Drucker nur verfügbar, wenn sie als Laufwerk mit USB-Massenspeicher bereitgestellt (gemounted) werden.&lt;/b&gt;&lt;p&gt;Informationen zur Einrichtung und Verwendung finden Sie in der Dokumentation der jeweiligen Distribution.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Unable to run command. No command specified.&lt;/b&gt;&lt;p&gt;Use &lt;pre&gt;Configure...&lt;/pre&gt; to specify a command to run.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Der Befehl kann nicht ausgeführt werden. Es wurde kein Befehl angegeben.&lt;/b&gt;&lt;p&gt;Verwenden Sie zum Angeben eines auszuführenden Befehls die Option &lt;pre&gt;Konfigurieren...&lt;/pre&gt;.</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollPrintJobView</name>
+ <message>
+ <source>Pending</source>
+ <translation>Ausstehend</translation>
+ </message>
+ <message>
+ <source>On hold</source>
+ <translation>Im Wartezustand</translation>
+ </message>
+ <message>
+ <source>Printing</source>
+ <translation>Wird gedruckt</translation>
+ </message>
+ <message>
+ <source>Stopped</source>
+ <translation>Angehalten</translation>
+ </message>
+ <message>
+ <source>Canceled</source>
+ <translation>Verworfen</translation>
+ </message>
+ <message>
+ <source>Aborted</source>
+ <translation>Abgebrochen</translation>
+ </message>
+ <message>
+ <source>Completed</source>
+ <translation>Abgeschlossen</translation>
+ </message>
+ <message>
+ <source>Print Control</source>
+ <translation>Druckersteuerung</translation>
+ </message>
+ <message>
+ <source>Job Control</source>
+ <translation>Druckauftragssteuerung</translation>
+ </message>
+ <message>
+ <source>1 Active Print Job</source>
+ <translation>Ein aktiver Druckauftrag</translation>
+ </message>
+ <message>
+ <source>%1 Active Print Jobs</source>
+ <translation>%1 aktive Druckaufträge</translation>
+ </message>
+ <message>
+ <source>Set as Default</source>
+ <translation>Standard</translation>
+ </message>
+ <message>
+ <source>SET AS DEFAULT</source>
+ <translation>STANDARD</translation>
+ </message>
+ <message>
+ <source>NOT SET AS DEFAULT</source>
+ <translation>KEIN STANDARD</translation>
+ </message>
+ <message>
+ <source>The printer is currently: %1</source>
+ <translation>Derzeitiger Druckerstatus: %1</translation>
+ </message>
+ <message>
+ <source>IDLE</source>
+ <translation>LEERLAUF</translation>
+ </message>
+ <message>
+ <source>Stop Printer</source>
+ <translation>Drucker anhalten</translation>
+ </message>
+ <message>
+ <source>PROCESSING</source>
+ <translation>VERARBEITUNG</translation>
+ </message>
+ <message>
+ <source>STOPPED</source>
+ <translation>ANGEHALTEN</translation>
+ </message>
+ <message>
+ <source>Start Printer</source>
+ <translation>Drucker starten</translation>
+ </message>
+ <message>
+ <source>ACCEPTING JOBS</source>
+ <translation>ANNAHME VON DRUCKAUFTRÄGEN</translation>
+ </message>
+ <message>
+ <source>Reject Jobs</source>
+ <translation>Druckaufträge ablehnen</translation>
+ </message>
+ <message>
+ <source>REJECTING JOBS</source>
+ <translation>ABLEHNUNG VON DRUCKAUFTRÄGEN</translation>
+ </message>
+ <message>
+ <source>Accept Jobs</source>
+ <translation>Druckaufträge annehmen</translation>
+ </message>
+ <message>
+ <source>Cancel all active print jobs</source>
+ <translation>Alle aktiven Druckaufträge verwerfen</translation>
+ </message>
+ <message>
+ <source>Cancel All Jobs</source>
+ <translation>Alle Druckaufträge verwerfen</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;%1&lt;/b&gt;</source>
+ <translation>&lt;b&gt;%1&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Job ID: %1</source>
+ <translation>Druckauftrags-ID: %1</translation>
+ </message>
+ <message>
+ <source>Cancel Job</source>
+ <translation>Druckauftrag verwerfen</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollPrintSettingsView</name>
+ <message>
+ <source>Basic</source>
+<translation>Einfach</translation>
+ </message>
+ <message>
+ <source>Page Orientation</source>
+<translation>Ausrichtung</translation>
+ </message>
+ <message>
+ <source>Portrait</source>
+<translation>Hochformat</translation>
+ </message>
+ <message>
+ <source>Landscape</source>
+<translation>Querformat</translation>
+ </message>
+ <message>
+ <source>Reverse landscape</source>
+<translation>Umgekehrtes Querformat</translation>
+ </message>
+ <message>
+ <source>Reverse portrait</source>
+<translation>Umgekehrtes Hochformat</translation>
+ </message>
+ <message>
+ <source>Duplex (Print on both sides of the page)</source>
+<translation>Duplex (beide Seiten eines Blatts bedrucken)</translation>
+ </message>
+ <message>
+ <source>Single sided</source>
+<translation>Einseitig</translation>
+ </message>
+ <message>
+ <source>Two sided (long edge)</source>
+<translation>Beidseitig (lange Seite)</translation>
+ </message>
+ <message>
+ <source>Two sided (short edge)</source>
+<translation>Beidseitig (kurze Seite)</translation>
+ </message>
+ <message>
+ <source>Output Order (Print last page first)</source>
+<translation>Ausgabereihenfolge (letzte Seite zuerst drucken)</translation>
+ </message>
+ <message>
+ <source>Normal (Print first page first)</source>
+<translation>Normal (erste Seite zuerst drucken)</translation>
+ </message>
+ <message>
+ <source>Reversed (Print last page first)</source>
+<translation>Umgekehrt (letzte Seite zuerst drucken)</translation>
+ </message>
+ <message>
+ <source>Collate (Group together multiple copies)</source>
+<translation>Sortieren (mehrere Kopien zusammenfassen)</translation>
+ </message>
+ <message>
+ <source>Quality</source>
+<translation>Kopierqualität</translation>
+ </message>
+ <message>
+ <source>N-Up (Multiple document pages per printed page)</source>
+<translation>N-Up (Mehrere Dokumentseiten pro gedruckter Seite)</translation>
+ </message>
+ <message>
+ <source>Pages per Sheet</source>
+<translation>Seiten pro Blatt</translation>
+ </message>
+ <message>
+ <source>1 sheet per page</source>
+<translation>1 Blatt pro Seite</translation>
+ </message>
+ <message>
+ <source>2 sheets per page</source>
+<translation>2 Blätter pro Seite</translation>
+ </message>
+ <message>
+ <source>4 sheets per page</source>
+<translation>4 Blätter pro Seite</translation>
+ </message>
+ <message>
+ <source>Layout</source>
+<translation>Layout</translation>
+ </message>
+ <message>
+ <source>Bottom to top, left to right</source>
+<translation>Von unten nach oben, links nach rechts</translation>
+ </message>
+ <message>
+ <source>Bottom to top, right to left</source>
+<translation>Von unten nach oben, rechts nach links</translation>
+ </message>
+ <message>
+ <source>Left to right, bottom to top</source>
+<translation>Von links nach rechts, unten nach oben</translation>
+ </message>
+ <message>
+ <source>Left to right, top to bottom</source>
+<translation>Von links nach rechts, oben nach unten</translation>
+ </message>
+ <message>
+ <source>Right to left, bottom to top</source>
+<translation>Von rechts nach links, unten nach oben</translation>
+ </message>
+ <message>
+ <source>Right to left, top to bottom</source>
+<translation>Von rechts nach links, oben nach unten</translation>
+ </message>
+ <message>
+ <source>Top to bottom, left to right</source>
+<translation>Von oben nach unten, links nach rechts</translation>
+ </message>
+ <message>
+ <source>Top to bottom, right to left</source>
+<translation>Von oben nach unten, rechts nach links</translation>
+ </message>
+ <message>
+ <source>Printed Border Around Each Page</source>
+<translation>Gedruckter Rand um jede Seite</translation>
+ </message>
+ <message>
+ <source>Two thin borders</source>
+<translation>Zwei dünne Ränder</translation>
+ </message>
+ <message>
+ <source>Two thick borders</source>
+<translation>Zwei dicke Ränder</translation>
+ </message>
+ <message>
+ <source>No border</source>
+<translation>Kein Rand</translation>
+ </message>
+ <message>
+ <source>One thin border</source>
+<translation>Ein dünner Rand</translation>
+ </message>
+ <message>
+ <source>One thick border</source>
+<translation>Ein dicker Rand</translation>
+ </message>
+ <message>
+ <source>Printout Appearance</source>
+<translation>Darstellung des Ausdrucks</translation>
+ </message>
+ <message>
+ <source>Brightness</source>
+<translation>Helligkeit</translation>
+ </message>
+ <message>
+ <source>Gamma</source>
+<translation>Gammawert</translation>
+ </message>
+ <message>
+ <source>Image Printing</source>
+<translation>Bilddruck</translation>
+ </message>
+ <message>
+ <source>Fit to Page</source>
+<translation>Vergrößern, Verkleinern und Auf Seite einpassen</translation>
+ </message>
+ <message>
+ <source>Position on Page</source>
+<translation>Auf Seite positionieren</translation>
+ </message>
+ <message>
+ <source>Centered</source>
+<translation>Zentriert</translation>
+ </message>
+ <message>
+ <source>Top</source>
+<translation>Von oben nach unten, links nach rechts</translation>
+ </message>
+ <message>
+ <source>Left</source>
+<translation>Von links nach rechts, unten nach oben</translation>
+ </message>
+ <message>
+ <source>Right</source>
+<translation>Von rechts nach links, unten nach oben</translation>
+ </message>
+ <message>
+ <source>Top left</source>
+<translation>Oben links</translation>
+ </message>
+ <message>
+ <source>Top right</source>
+<translation>Oben rechts</translation>
+ </message>
+ <message>
+ <source>Bottom</source>
+<translation>Von unten nach oben, links nach rechts</translation>
+ </message>
+ <message>
+ <source>Bottom left</source>
+<translation>Unten links</translation>
+ </message>
+ <message>
+ <source>Bottom right</source>
+<translation>Unten rechts</translation>
+ </message>
+ <message>
+ <source>Saturation</source>
+<translation>Sättigung</translation>
+ </message>
+ <message>
+ <source>Hue (color shift/rotation)</source>
+<translation>Farbton (Farbverschiebung/-rotation)</translation>
+ </message>
+ <message>
+ <source>&quot;Natural&quot; Scaling (relative to image)</source>
+<translation>&quot;Natürliche&quot; Skalierung (in Bezug zum Bild)</translation>
+ </message>
+ <message>
+ <source>Scaling (relative to page)</source>
+<translation>Skalierung (in Bezug zur Seite)</translation>
+ </message>
+ <message>
+ <source>Miscellaneous</source>
+<translation>Verschiedenes</translation>
+ </message>
+ <message>
+ <source>&quot;Pretty Print&quot; Text Documents (Add headers and formatting)</source>
+<translation>&quot;Schöner Druck&quot; von Textdokumenten (Kopfzeilen und Formatierung hinzufügen)</translation>
+ </message>
+ <message>
+ <source>Banner Pages</source>
+<translation>Bannerseiten</translation>
+ </message>
+ <message>
+ <source>No banner page</source>
+<translation>Keine Bannerseite</translation>
+ </message>
+ <message>
+ <source>Classified</source>
+<translation>Klassifiziert</translation>
+ </message>
+ <message>
+ <source>Confidential</source>
+<translation>Vertraulich</translation>
+ </message>
+ <message>
+ <source>Secret</source>
+<translation>Geheim</translation>
+ </message>
+ <message>
+ <source>Standard</source>
+<translation>Quality:</translation>
+ </message>
+ <message>
+ <source>Top secret</source>
+<translation>Streng geheim</translation>
+ </message>
+ <message>
+ <source>Unclassified</source>
+<translation>Nicht klassifiziert</translation>
+ </message>
+ <message>
+ <source>Mirror Printing</source>
+<translation>Spiegelbilddruck</translation>
+ </message>
+ <message>
+ <source>Set Quality to &quot;Controlled by &apos;Printout Mode&apos;&quot; to enable.</source>
+<translation>Stellen Sie die Qualität zum Aktivieren dieser Funktion auf &quot;Steuerung durch Druckmodus&apos;&quot; ein.</translation>
+ </message>
+ <message>
+ <source>On</source>
+<translation>Ein dünner Rand</translation>
+ </message>
+ <message>
+ <source>Off</source>
+<translation>Aus</translation>
+ </message>
+ <message>
+ <source>Set to default value of &quot;%1&quot;.</source>
+<translation>Auf den Standardwert &quot;%1&quot; setzen.</translation>
+ </message>
+ <message>
+ <source>Start:</source>
+<translation>Start:</translation>
+ </message>
+ <message>
+ <source>End:</source>
+<translation>Ende:</translation>
+ </message>
+ <message>
+ <source>Set to default value of &quot;Start: %1, End: %2&quot;.</source>
+<translation>Auf den Standardwert von &quot;Start: %1, Ende: %2&quot; setzen.</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollPrintView</name>
+ <message>
+ <source>PDF Document</source>
+ <translation>PDF-Dokument</translation>
+ </message>
+ <message>
+ <source>Postscript Document</source>
+ <translation>Postscript-Dokument</translation>
+ </message>
+ <message>
+ <source>HP Graphics Language File</source>
+ <translation>HP Graphics Language-Datei</translation>
+ </message>
+ <message>
+ <source>C Shell Script</source>
+ <translation>C-Shell-Skript</translation>
+ </message>
+ <message>
+ <source>C Source Code</source>
+ <translation>C-Quellcode</translation>
+ </message>
+ <message>
+ <source>C++ Source Code</source>
+ <translation>C++-Quellcode</translation>
+ </message>
+ <message>
+ <source>Perl Script</source>
+ <translation>Perl-Skript</translation>
+ </message>
+ <message>
+ <source>Python Program</source>
+ <translation>Python-Programm</translation>
+ </message>
+ <message>
+ <source>Shell Script</source>
+ <translation>Shell-Skript</translation>
+ </message>
+ <message>
+ <source>Plain Text</source>
+ <translation>Normaltext</translation>
+ </message>
+ <message>
+ <source>HTML Dcoument</source>
+ <translation>HTML-Dokument</translation>
+ </message>
+ <message>
+ <source>GIF Image</source>
+ <translation>GIF-Grafik</translation>
+ </message>
+ <message>
+ <source>PNG Image</source>
+ <translation>PNG-Grafik</translation>
+ </message>
+ <message>
+ <source>JPEG Image</source>
+ <translation>JPEG-Grafik</translation>
+ </message>
+ <message>
+ <source>TIFF Image</source>
+ <translation>TIFF-Grafik</translation>
+ </message>
+ <message>
+ <source>Bitmap (BMP) Image</source>
+ <translation>Bitmap-Grafik (BMP)</translation>
+ </message>
+ <message>
+ <source>Photo CD Image</source>
+ <translation>Foto-CD-Grafik</translation>
+ </message>
+ <message>
+ <source>Portable Image (PNM)</source>
+ <translation>Portable-Grafik (PNM)</translation>
+ </message>
+ <message>
+ <source>Portable B&amp;W Image (PBM)</source>
+ <translation>Portable-Schwarzweißgrafik (PBM)</translation>
+ </message>
+ <message>
+ <source>Portable Grayscale Image (PGM)</source>
+ <translation>Portable-Graustufengrafik (PGM)</translation>
+ </message>
+ <message>
+ <source>Portable Color Image (PPM)</source>
+ <translation>Portable-Farbgrafik (PGM)</translation>
+ </message>
+ <message>
+ <source>SGI RGB</source>
+ <translation>SGI RGB</translation>
+ </message>
+ <message>
+ <source>X11 Bitmap (XBM)</source>
+ <translation>X11-Bitmap (XBM)</translation>
+ </message>
+ <message>
+ <source>X11 Pixmap (XPM)</source>
+ <translation>X11-Pixmap (XPM)</translation>
+ </message>
+ <message>
+ <source>Sun Raster Format</source>
+ <translation>Sun-Raster-Format</translation>
+ </message>
+ <message>
+ <source>File(s) to Print</source>
+ <translation>Zu druckende Datei(en)</translation>
+ </message>
+ <message>
+ <source>Print Options</source>
+ <translation>Druckoptionen</translation>
+ </message>
+ <message>
+ <source>&lt;&lt; Functions</source>
+ <translation>&lt;&lt; Funktionen</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Schließen</translation>
+ </message>
+ <message>
+ <source>Print File(s)</source>
+ <translation>Datei(en) drucken</translation>
+ </message>
+ <message>
+ <source>Order</source>
+ <translation>Reihenfolge</translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation>Name</translation>
+ </message>
+ <message>
+ <source>Type</source>
+ <translation>Typ</translation>
+ </message>
+ <message>
+ <source>Path</source>
+ <translation>Pfad</translation>
+ </message>
+ <message>
+ <source>Add File...</source>
+ <translation>Datei hinzufügen...</translation>
+ </message>
+ <message>
+ <source>Show Types...</source>
+ <translation>Typen anzeigen...</translation>
+ </message>
+ <message>
+ <source>Remove File</source>
+ <translation>Datei entfernen</translation>
+ </message>
+ <message>
+ <source>Move Down</source>
+ <translation>Nach unten</translation>
+ </message>
+ <message>
+ <source>Move Up</source>
+ <translation>Nach oben</translation>
+ </message>
+ <message>
+ <source>Show File Types...</source>
+ <translation>Dateitypen anzeigen...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;You are trying to add a file that cannot be directly printed with this utility.&lt;/b&gt;&lt;p&gt;To print this file, use the print command in the application that created it.</source>
+ <translation>&lt;b&gt;Sie versuchen, eine Datei hinzuzufügen, die mit diesem Programm nicht direkt gedruckt werden kann.&lt;/b&gt;&lt;p&gt;Verwenden Sie zum Drucken der Datei den Druckbefehl der Anwendung, mit der die Datei erstellt wurde.</translation>
+ </message>
+ <message>
+ <source>Number of copies:</source>
+ <translation>Kopien:</translation>
+ </message>
+ <message>
+ <source>Default</source>
+ <translation>Standard</translation>
+ </message>
+ <message>
+ <source>Page Range:</source>
+ <translation>Seitenbereich:</translation>
+ </message>
+ <message>
+ <source>All pages</source>
+ <translation>Alle Seiten</translation>
+ </message>
+ <message>
+ <source>Page range:</source>
+ <translation>Seitenbereich:</translation>
+ </message>
+ <message>
+ <source>Page set:</source>
+ <translation>Seitensatz:</translation>
+ </message>
+ <message>
+ <source>Even pages</source>
+ <translation>Seiten mit gerader Seitenzahl</translation>
+ </message>
+ <message>
+ <source>Odd pages</source>
+ <translation>Seiten mit ungerader Seitenzahl</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Cannot print: Invalid page range: %1&lt;/b&gt;&lt;p&gt;A valid page range is a list of pages or ranges of pages separated by commas (e.g., 1-2,4,6-7)</source>
+ <translation>&lt;b&gt;Drucken nicht möglich: Ungültiger Seitenbereich: %1&lt;/b&gt;&lt;p&gt;Bei einem gültigen Seitenbereich handelt es sich um eine Liste mit Seiten oder Seitenbereichen, die jeweils durch ein Komma getrennt sind. (Beispiel: 1-2,4,6-7)</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Cannot print: Device is busy or not available.&lt;/b&gt;&lt;p&gt;Please check device and try again. [1]</source>
+ <translation type="obsolete">&lt;b&gt;Drucken nicht möglich: Das Gerät ist ausgelastet oder nicht verfügbar.&lt;/b&gt;&lt;p&gt;Überprüfen Sie das Gerät, und wiederholen Sie den Vorgang. [1]</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Cannot print: Printer is stopped.&lt;/b&gt;&lt;p&gt;Please START the printer to continue this print. Job will begin printing once printer is started.</source>
+ <translation>&lt;b&gt;Drucken nicht möglich: Der Drucker wurde angehalten.&lt;/b&gt;&lt;p&gt;Starten Sie den Drucker, um den Druckvorgang fortzusetzen. Der Druckvorgang wird gestartet, sobald der Drucker gestartet wurde.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Cannot print: Printer is not accepting jobs.&lt;/b&gt;&lt;p&gt;Please set the printer to ACCEPTING JOBS to continue printing.</source>
+ <translation>&lt;b&gt;Drucken nicht möglich: Vom Drucker werden keine Druckaufträge angenommen.&lt;/b&gt;&lt;p&gt;Versetzen Sie den Drucker in den Status ANNAHME VON DRUCKAUFTRÄGEN, um das Drucken fortzusetzen.</translation>
+ </message>
+ <message>
+ <source>Print command failed with error code %1</source>
+ <translation>Für den Druckbefehl ist der folgende Fehler aufgetreten: %1</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Cannot print: Device is busy or not available.&lt;/b&gt;&lt;p&gt;Please check device and try again.</source>
+<translation>&lt;b&gt;Drucken nicht möglich: Das Gerät ist ausgelastet oder nicht verfügbar.&lt;/b&gt;&lt;p&gt;Überprüfen Sie das Gerät, und wiederholen Sie den Vorgang.</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollPrinterInfoView</name>
+ <message>
+ <source>No printers found for this device.</source>
+ <translation>Für das Gerät wurden keine Drucker gefunden.</translation>
+ </message>
+ <message>
+ <source>&lt;&lt; Tools</source>
+ <translation>&lt;&lt; Extras</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Schließen</translation>
+ </message>
+ <message>
+ <source>Fax</source>
+ <translation>Fax</translation>
+ </message>
+ <message>
+ <source>Printer</source>
+ <translation>Drucker</translation>
+ </message>
+ <message>
+ <source>Type: %1</source>
+ <translation>Typ: %1</translation>
+ </message>
+ <message>
+ <source>Location: %1</source>
+ <translation>Speicherort: %1</translation>
+ </message>
+ <message>
+ <source>Description/Info: %1</source>
+ <translation>Beschreibung/Info: %1</translation>
+ </message>
+ <message>
+ <source>Idle</source>
+ <translation>Leerlauf</translation>
+ </message>
+ <message>
+ <source>Processing</source>
+ <translation>Verarbeitung</translation>
+ </message>
+ <message>
+ <source>Stopped</source>
+ <translation>Angehalten</translation>
+ </message>
+ <message>
+ <source>Unknown</source>
+ <translation>Unbekannt</translation>
+ </message>
+ <message>
+ <source>State: %1</source>
+ <translation>Status: %1</translation>
+ </message>
+ <message>
+ <source>PPD/Driver: %1</source>
+ <translation>PPD/Treiber: %1</translation>
+ </message>
+ <message>
+ <source>CUPS/IPP Printer URI: %1</source>
+ <translation>CUPS-/IPP-Drucker-URI: %1</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollStatusView</name>
+ <message>
+ <source>year</source>
+ <translation>Jahr</translation>
+ </message>
+ <message>
+ <source>years</source>
+ <translation>Jahre(n)</translation>
+ </message>
+ <message>
+ <source>month</source>
+ <translation>Monat</translation>
+ </message>
+ <message>
+ <source>months</source>
+ <translation>Monate(n)</translation>
+ </message>
+ <message>
+ <source>week</source>
+ <translation>Woche</translation>
+ </message>
+ <message>
+ <source>weeks</source>
+ <translation>Wochen</translation>
+ </message>
+ <message>
+ <source>day</source>
+ <translation>Tag</translation>
+ </message>
+ <message>
+ <source>days</source>
+ <translation>Tage(n)</translation>
+ </message>
+ <message>
+ <source>hour</source>
+ <translation>Stunde</translation>
+ </message>
+ <message>
+ <source>hours</source>
+ <translation>Stunden</translation>
+ </message>
+ <message>
+ <source>minute</source>
+ <translation>Minute</translation>
+ </message>
+ <message>
+ <source>minutes</source>
+ <translation>Minuten</translation>
+ </message>
+ <message>
+ <source>second</source>
+ <translation>Sekunde</translation>
+ </message>
+ <message>
+ <source>seconds</source>
+ <translation>Sekunden</translation>
+ </message>
+ <message>
+ <source>one</source>
+ <translation>1</translation>
+ </message>
+ <message>
+ <source>two</source>
+ <translation>zwei</translation>
+ </message>
+ <message>
+ <source>three</source>
+ <translation>drei</translation>
+ </message>
+ <message>
+ <source>four</source>
+ <translation>vier</translation>
+ </message>
+ <message>
+ <source>five</source>
+ <translation>fünf</translation>
+ </message>
+ <message>
+ <source>six</source>
+ <translation>sechs</translation>
+ </message>
+ <message>
+ <source>seven</source>
+ <translation>sieben</translation>
+ </message>
+ <message>
+ <source>eight</source>
+ <translation>acht</translation>
+ </message>
+ <message>
+ <source>nine</source>
+ <translation>neun</translation>
+ </message>
+ <message>
+ <source>ten</source>
+ <translation>zehn</translation>
+ </message>
+ <message>
+ <source>eleven</source>
+ <translation>elf</translation>
+ </message>
+ <message>
+ <source>twelve</source>
+ <translation>zwölf</translation>
+ </message>
+ <message>
+ <source>(most recent)</source>
+ <translation>(neuestes Element)</translation>
+ </message>
+ <message>
+ <source>User:</source>
+ <translation>Benutzer:</translation>
+ </message>
+ <message>
+ <source>Job ID:</source>
+ <translation>Druckauftrags-ID:</translation>
+ </message>
+ <message>
+ <source>n/a</source>
+ <translation>k. A.</translation>
+ </message>
+ <message>
+ <source>Code:</source>
+ <translation>Code:</translation>
+ </message>
+ <message>
+ <source>(about %1 ago)</source>
+ <translation>(vor ca. %1)</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollSuppliesView</name>
+ <message>
+ <source>ERROR: Device not supported.</source>
+ <translation>FEHLER: Das Gerät wird nicht unterstützt.</translation>
+ </message>
+ <message>
+ <source>ERROR: Supplies status is not supported on this device.</source>
+ <translation>FEHLER: Der Verbrauchsmaterialstatus wird auf diesem Gerät nicht unterstützt.</translation>
+ </message>
+ <message>
+ <source>ERROR: Device not found. Please check connection and power-on device.</source>
+ <translation>FEHLER: Das Gerät wurde nicht gefunden. Überprüfen Sie, ob das Gerät eingeschaltet und ordnungsgemäß angeschlossen ist.</translation>
+ </message>
+ <message>
+ <source>Part No. %1</source>
+ <translation>Teilenummer %1</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollTestpageView</name>
+ <message>
+ <source>&lt;&lt; Tools</source>
+ <translation>&lt;&lt; Extras</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Schließen</translation>
+ </message>
+ <message>
+ <source>Print Test Page</source>
+ <translation>Testseite drucken</translation>
+ </message>
+ <message>
+ <source>Test Page Type</source>
+ <translation>Testseitentyp</translation>
+ </message>
+ <message>
+ <source>Printer diagnostic page (does not test print driver)</source>
+ <translation>Seite für die Druckerdiagnose (kein Test des Druckertreibers)</translation>
+ </message>
+ <message>
+ <source>HPLIP test page (tests print driver)</source>
+ <translation>HPLIP-Testseite (Test des Druckertreibers)</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;A test page should be printing on your printer.&lt;/b&gt;&lt;p&gt;If the page fails to print, please visit http://hplip.sourceforge.net for troubleshooting and support.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Auf dem Drucker sollte eine Testseite ausgegeben werden.&lt;/b&gt;&lt;p&gt;Sollte die Seite nicht ausgedruckt werden, finden Sie unter &quot;http://hplip.sourceforge.net&quot; Support sowie weitere Informationen zur Fehlerbehebung.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Device is busy or in an error state.&lt;/b&gt;&lt;p&gt;Please check device and try again.</source>
+<translation>&lt;b&gt;Das Gerät ist ausgelastet, oder es liegt ein Fehler vor.&lt;/b&gt;&lt;p&gt;Überprüfen Sie das Gerät, und wiederholen Sie den Vorgang.</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollToolView</name>
+ <message>
+ <source>&lt;b&gt;Device Settings&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Geräteeinstellungen&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Your device has special device settings. You may alter these settings here.</source>
+ <translation>Das Gerät verfügt über besondere Geräteeinstellungen. Diese Einstellungen können hier festgelegt werden.</translation>
+ </message>
+ <message>
+ <source>Device Settings...</source>
+ <translation>Geräteeinstellungen...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Fax Setup&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Faxsetup&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Fax support must be setup before you can send faxes.</source>
+ <translation>Die Faxunterstützung muss zunächst eingerichtet werden, damit der Faxversand verwendet werden kann.</translation>
+ </message>
+ <message>
+ <source>Setup Fax...</source>
+ <translation>Fax einrichten...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Fax Address Book&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Faxadressbuch&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Setup fax phone numbers to use when sending faxes from the PC.</source>
+ <translation>Einrichten der Faxnummern für den PC-gestützten Faxversand.</translation>
+ </message>
+ <message>
+ <source>Fax Address Book...</source>
+ <translation>Faxadressbuch...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Print Test Page&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Testseite drucken&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Print a test page to test the setup of your printer.</source>
+ <translation>Drucken einer Testseite, um die Einrichtung des Druckers zu überprüfen.</translation>
+ </message>
+ <message>
+ <source>Print Test Page &gt;&gt;</source>
+ <translation>Testseite drucken &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;View Printer (Queue) Information&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Drucker-/Warteschlangeninformationen anzeigen&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>View the printers (queues) installed in CUPS.</source>
+ <translation>Anzeigen der in CUPS installierten Drucker/Warteschlangen.</translation>
+ </message>
+ <message>
+ <source>View Printer Information &gt;&gt;</source>
+ <translation>Druckerinformationen anzeigen &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;View Device Information&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Geräteinformationen anzeigen&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>This information is primarily useful for debugging and troubleshooting (advanced).</source>
+ <translation>Diese Informationen dienen in erster Linie dem Debugging bzw. der Fehlerbehebung (erweitert).</translation>
+ </message>
+ <message>
+ <source>View Device Information &gt;&gt;</source>
+ <translation>Geräteinformationen anzeigen &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Print Quality Diagnostics&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Diagnose der Druckqualität&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Your printer can print a test page to help diagnose print quality problems.</source>
+ <translation>Zum Untersuchen von Problemen mit der Druckqualität kann auf dem Drucker eine Testseite ausgegeben werden.</translation>
+ </message>
+ <message>
+ <source>Print Diagnostic Page...</source>
+ <translation>Diagnoseseite drucken...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Download Firmware&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Firmware herunterladen&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Download firmware to your printer (required on some devices after each power-up).</source>
+ <translation>Herunterladen von Firmware auf den Drucker (auf einigen Geräten nach jedem Einschalten erforderlich).</translation>
+ </message>
+ <message>
+ <source>Download Firmware...</source>
+ <translation>Firmware herunterladen...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Clean Cartridges&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Tintenpatronen reinigen&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>You only need to perform this action if you are having problems with poor printout quality due to clogged ink nozzles.</source>
+ <translation>Diese Aktion ist nur erforderlich, wenn beim Drucken Probleme mit der Druckqualität auftreten, die auf verstopfte Düsen zurückzuführen sind.</translation>
+ </message>
+ <message>
+ <source>Clean Cartridges...</source>
+ <translation>Tintenpatronen reinigen...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Align Cartridges&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Tintenpatronen ausrichten&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>This will improve the quality of output when a new cartridge is installed.</source>
+ <translation>Hierdurch lässt sich nach dem Einsetzen einer neuen Tintenpatrone eine höhere Ausgabequalität erzielen.</translation>
+ </message>
+ <message>
+ <source>Align Cartridges...</source>
+ <translation>Tintenpatronen ausrichten...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Perform Color Calibration&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Farbkalibrierung durchführen&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Use this procedure to optimimize your printer&apos;s color output.</source>
+ <translation>Dieser Vorgang dient zum Optimieren der Farbausgabe des Druckers.</translation>
+ </message>
+ <message>
+ <source>Color Calibration...</source>
+ <translation>Farbkalibrierung...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Perform Line Feed Calibration&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Kalibrierung des Zeilenvorschubs ausführen&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Use line feed calibration to optimize print quality (to remove gaps in the printed output).</source>
+ <translation>Die Kalibrierung des Zeilenvorschubs dient zum Optimieren der Druckqualität, indem Lücken auf dem Ausdruck entfernt werden.</translation>
+ </message>
+ <message>
+ <source>Line Feed Calibration...</source>
+ <translation>Kalibrierung des Zeilenvorschubs...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Access Embedded Web Page&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Eingebettete Webseite öffnen&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>You can use your printer&apos;s embedded web server to configure, maintain, and monitor the device from a web browser.</source>
+ <translation>Mithilfe des eingebetteten Webservers des Druckers lässt sich das Gerät mithilfe eines Webbrowsers konfigurieren, verwalten und überwachen.</translation>
+ </message>
+ <message>
+ <source>Open in Browser...</source>
+ <translation>Im Browser öffnen...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;View Documentation&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Dokumentation anzeigen&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>View documentation installed on your system.</source>
+ <translation>Anzeigen der auf dem System installierten Dokumentation.</translation>
+ </message>
+ <message>
+ <source>View Documentation...</source>
+ <translation>Dokumentation anzeigen...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;An error occured downloading firmware file.&lt;/b&gt;&lt;p&gt;Please check your printer and try again.</source>
+ <translation>&lt;b&gt;Beim Herunterladen der Firmwaredatei ist ein Fehler aufgetreten.&lt;/b&gt;&lt;p&gt;Überprüfen Sie den Drucker, und wiederholen Sie den Vorgang.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Device is busy or in an error state.&lt;/b&gt;&lt;p&gt;Please check device and try again.</source>
+ <translation>&lt;b&gt;Das Gerät ist ausgelastet oder weist einen Fehler auf.&lt;/b&gt;&lt;p&gt;Überprüfen Sie das Gerät, und wiederholen Sie den Vorgang.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Both cartridges are required for alignment.&lt;/b&gt;&lt;p&gt;Please install both cartridges and try again.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Für die Ausrichtung werden beide Tintenpatronen benötigt.&lt;/b&gt;&lt;p&gt;Setzen Sie beide Tintenpatronen ein, und wiederholen Sie den Vorgang.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;One or more cartiridges are missing from the printer.&lt;/b&gt;&lt;p&gt;Please install cartridge(s) and try again.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Mindestens eine Tintenpatrone ist nicht vorhanden.&lt;/b&gt;&lt;p&gt;Setzen Sie die Tintenpatrone(n) ein, und wiederholen Sie den Vorgang.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Both the photo and color cartridges must be inserted into the printer to perform color calibration.&lt;/b&gt;&lt;p&gt;If you are planning on printing with the photo cartridge, please insert it and try again.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Für die Farbkalibrierung müssen sowohl die Foto- als auch die Farbpatrone in den Drucker eingesetzt werden.&lt;/b&gt;&lt;p&gt;Setzen Sie die Fotopatrone ein, wenn Sie diese verwenden möchten, und wiederholen Sie den Vorgang.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Both the photo (regular photo or photo blue) and color cartridges must be inserted into the printer to perform color calibration.&lt;/b&gt;&lt;p&gt;If you are planning on printing with the photo or photo blue cartridge, please insert it and try again.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Für die Farbkalibrierung müssen sowohl die Foto- (normal oder blau) als auch die Farbpatrone in den Drucker eingesetzt werden.&lt;/b&gt;&lt;p&gt;Setzen Sie die entsprechende Fotopatrone ein, wenn Sie diese verwenden möchten, und wiederholen Sie den Vorgang.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Cannot align with only the photo cartridge installed.&lt;/b&gt;&lt;p&gt;Please install other cartridges and try again.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Ausrichtung bei ausschließlicher Verwendung der Fotopatrone nicht möglich.&lt;/b&gt;&lt;p&gt;Setzen Sie weitere Tintenpatronen ein, und wiederholen Sie den Vorgang.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Operation failed. Device busy.&lt;/b&gt;</source>
+ <translation>&lt;p&gt;&lt;b&gt;Vorgangsfehler. Das Gerät ist ausgelastet.&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Unable to run command. No command specified.&lt;/b&gt;&lt;p&gt;Use &lt;pre&gt;Configure...&lt;/pre&gt; to specify a command to run.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Der Befehl kann nicht ausgeführt werden. Es wurde kein Befehl angegeben.&lt;/b&gt;&lt;p&gt;Verwenden Sie zum Angeben eines auszuführenden Befehls die Option &lt;pre&gt;Konfigurieren...&lt;/pre&gt;.</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollUnloadView</name>
+ <message>
+ <source>ERROR: Photo Card Failed to Mount Properly. Please check device and card and try again.</source>
+ <translation>FEHLER: Die Fotokarte wurde nicht korrekt aktiviert. Überprüfen Sie das Gerät und die Karte, und wiederholen Sie den Vorgang.</translation>
+ </message>
+ <message>
+ <source>Select File(s) to Unload from Photo Card</source>
+ <translation>Von der Fotokarte zu entladende Datei(en) auswählen</translation>
+ </message>
+ <message>
+ <source>Unload Folder</source>
+ <translation>Ordner entladen</translation>
+ </message>
+ <message>
+ <source>Unload Options</source>
+ <translation>Entladeoptionen</translation>
+ </message>
+ <message>
+ <source>&lt;&lt; Functions</source>
+ <translation>&lt;&lt; Funktionen</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Schließen</translation>
+ </message>
+ <message>
+ <source>Unload File(s)</source>
+ <translation>Datei(en) entladen</translation>
+ </message>
+ <message>
+ <source>Select All</source>
+ <translation>Alle auswählen</translation>
+ </message>
+ <message>
+ <source>Select None</source>
+ <translation>Auswahl aufheben</translation>
+ </message>
+ <message>
+ <source>Show Thumbnails</source>
+ <translation>Miniaturansichten anzeigen</translation>
+ </message>
+ <message>
+ <source>No files selected</source>
+ <translation>Es sind keine Dateien ausgewählt.</translation>
+ </message>
+ <message>
+ <source>1 file selected, %1</source>
+ <translation>1 Datei ausgewählt, %1</translation>
+ </message>
+ <message>
+ <source>%1 files selected, %2</source>
+ <translation>%1 Dateien ausgewählt, %2</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;No thumbnail found in image.&lt;/b&gt;</source>
+ <translation>&lt;p&gt;&lt;b&gt;Es wurde keine Miniaturansicht im Bild gefunden.&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Loading...</source>
+ <translation>Laden...</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Abbrechen</translation>
+ </message>
+ <message>
+ <source>HP Device Manager</source>
+ <translation>HP Geräte-Manager</translation>
+ </message>
+ <message>
+ <source>Browse...</source>
+ <translation>Durchsuchen...</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;The unload directory path you entered is not valid.&lt;/b&gt;&lt;p&gt;The directory must exist and you must have write permissions.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Der für das Entladen eingegebene Verzeichnispfad ist nicht gültig.&lt;/b&gt;&lt;p&gt;Das Verzeichnis muss vorhanden sein, und Sie müssen Schreibberechtigungen besitzen.</translation>
+ </message>
+ <message>
+ <source>File removal:</source>
+ <translation>Dateien entfernen:</translation>
+ </message>
+ <message>
+ <source>Leave unloaded files on photo card</source>
+ <translation>Entladene Dateien auf der Fotokarte belassen</translation>
+ </message>
+ <message>
+ <source>Remove all unloaded files from photo card</source>
+ <translation>Alle entladenen Dateien von der Fotokarte entfernen</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;The unload directory path is not valid.&lt;/b&gt;&lt;p&gt;Please enter a new path and try again.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Der Verzeichnispfad für das Entladen ist nicht gültig.&lt;/b&gt;&lt;p&gt;Geben Sie einen neuen Pfad ein, und wiederholen Sie den Vorgang.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;No files are selected to unload.&lt;/b&gt;&lt;p&gt;Please select one or more files to unload and try again.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Es sind keine Dateien zum Entladen ausgewählt.&lt;/b&gt;&lt;p&gt;Wählen Sie mindestens eine zu entladende Datei aus, und wiederholen Sie den Vorgang.</translation>
+ </message>
+ <message>
+ <source>Unloading card...</source>
+ <translation>Karte wird entladen...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Unload cancelled at user request.&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Das Entladen wurde vom Benutzer abgebrochen.&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>ERROR: Photo Card Failed to Mount Properly. Please check device and card and try again.</source>
+<translation>FEHLER: Die Fotokarte wurde nicht korrekt aktiviert. Überprüfen Sie das Gerät und die Karte, und wiederholen Sie den Vorgang.</translation>
+ </message>
+ <message>
+ <source>Select File(s) to Unload from Photo Card</source>
+<translation>Von der Fotokarte zu entladende Datei(en) auswählen</translation>
+ </message>
+ <message>
+ <source>Unload Folder</source>
+<translation>Ordner entladen</translation>
+ </message>
+ <message>
+ <source>Unload Options</source>
+<translation>Entladeoptionen</translation>
+ </message>
+ <message>
+ <source>&lt;&lt; Functions</source>
+<translation>&lt;&lt; Funktionen</translation>
+ </message>
+ <message>
+ <source>Close</source>
+<translation>Schließen</translation>
+ </message>
+ <message>
+ <source>Unload File(s)</source>
+<translation>Datei(en) entladen</translation>
+ </message>
+ <message>
+ <source>Select All</source>
+<translation>Alle auswählen</translation>
+ </message>
+ <message>
+ <source>Select None</source>
+<translation>Auswahl aufheben</translation>
+ </message>
+ <message>
+ <source>Show Thumbnails</source>
+<translation>Miniaturansichten anzeigen</translation>
+ </message>
+ <message>
+ <source>No files selected</source>
+<translation>Es sind keine Dateien ausgewählt.</translation>
+ </message>
+ <message>
+ <source>1 file selected, %1</source>
+<translation>1 Datei ausgewählt, %1</translation>
+ </message>
+ <message>
+ <source>%1 files selected, %2</source>
+<translation>%1 Dateien ausgewählt, %2</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;No thumbnail found in image.&lt;/b&gt;</source>
+<translation>&lt;p&gt;&lt;b&gt;Es wurde keine Miniaturansicht im Bild gefunden.&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Loading...</source>
+<translation>Laden...</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+<translation>Abbrechen</translation>
+ </message>
+ <message>
+ <source>HP Device Manager</source>
+<translation>HP Geräte-Manager</translation>
+ </message>
+ <message>
+ <source>Browse...</source>
+<translation>Durchsuchen...</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;The unload directory path you entered is not valid.&lt;/b&gt;&lt;p&gt;The directory must exist and you must have write permissions.</source>
+<translation>&lt;p&gt;&lt;b&gt;Der für das Entladen eingegebene Verzeichnispfad ist nicht gültig.&lt;/b&gt;&lt;p&gt;Das Verzeichnis muss vorhanden sein, und Sie müssen Schreibberechtigungen besitzen.</translation>
+ </message>
+ <message>
+ <source>File removal:</source>
+<translation>Dateien entfernen:</translation>
+ </message>
+ <message>
+ <source>Leave unloaded files on photo card</source>
+<translation>Entladene Dateien auf der Fotokarte belassen</translation>
+ </message>
+ <message>
+ <source>Remove all unloaded files from photo card</source>
+<translation>Alle entladenen Dateien von der Fotokarte entfernen</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;The unload directory path is not valid.&lt;/b&gt;&lt;p&gt;Please enter a new path and try again.</source>
+<translation>&lt;p&gt;&lt;b&gt;Der Verzeichnispfad für das Entladen ist nicht gültig.&lt;/b&gt;&lt;p&gt;Geben Sie einen neuen Pfad ein, und wiederholen Sie den Vorgang.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;No files are selected to unload.&lt;/b&gt;&lt;p&gt;Please select one or more files to unload and try again.</source>
+<translation>&lt;p&gt;&lt;b&gt;Es sind keine Dateien zum Entladen ausgewählt.&lt;/b&gt;&lt;p&gt;Wählen Sie mindestens eine zu entladende Datei aus, und wiederholen Sie den Vorgang.</translation>
+ </message>
+ <message>
+ <source>Unloading card...</source>
+<translation>Karte wird entladen...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Unload cancelled at user request.&lt;/b&gt;</source>
+<translation>&lt;b&gt;Das Entladen wurde vom Benutzer abgebrochen.&lt;/b&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollView</name>
+ <message>
+ <source>ERROR: No device found or unsupported device.</source>
+ <translation>FEHLER: Es wurde kein Gerät gefunden, oder das Gerät wird nicht unterstützt.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;%1 (read only)&lt;/b&gt;</source>
+ <translation>&lt;b&gt;%1 (schreibgeschützt)&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Printer/Fax</source>
+ <translation>Drucker/Fax</translation>
+ </message>
+ <message>
+ <source>Printer/Fax Name:</source>
+ <translation>Drucker-/Faxname:</translation>
+ </message>
+ <message>
+ <source>Printer</source>
+ <translation>Drucker</translation>
+ </message>
+ <message>
+ <source>Printer Name:</source>
+ <translation>Druckername:</translation>
+ </message>
+ <message>
+ <source>Fax</source>
+ <translation>Fax</translation>
+ </message>
+ <message>
+ <source>Fax Name:</source>
+ <translation>Faxname:</translation>
+ </message>
+ <message>
+ <source>Load Paper</source>
+ <translation>Papier einlegen</translation>
+ </message>
+ <message>
+ <source>A page will be printed. Please load &lt;b&gt;plain paper&lt;/b&gt; into the printer.</source>
+ <translation>Eine Seite wird gedruckt. Legen Sie &lt;b&gt;Normalpapier&lt;/b&gt; in den Drucker ein.</translation>
+ </message>
+</context>
+<context>
+ <name>SettingsDialog</name>
+ <message>
+ <source>&lt;b&gt;One or more email addresses are missing.&lt;/b&gt;&lt;p&gt;Please enter this information and try again.</source>
+ <translation>&lt;b&gt;Mindestens eine E-Mail-Adresse ist nicht vorhanden.&lt;/b&gt;&lt;p&gt;Geben Sie die entsprechenden Informationen ein, und wiederholen Sie den Vorgang.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Please check your email for a test message.&lt;/b&gt;&lt;p&gt;If the message doesn&apos;t arrive, please check your settings and try again.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Sehen Sie in Ihrem E-Mail-Postfach nach, ob Sie eine Testnachricht erhalten haben.&lt;/b&gt;&lt;p&gt;Sollten Sie keine Nachricht erhalten, überprüfen Sie die vorgenommenen Einstellungen, und wiederholen Sie den Vorgang.</translation>
+ </message>
+</context>
+<context>
+ <name>SettingsDialog_base</name>
+ <message>
+ <source>HP Device Manager - Settings</source>
+ <translation>HP Geräte-Manager – Einstellungen</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Abbrechen</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Configure if and when device(s) are automatically refreshed&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Konfigurieren der automatischen Geräteaktualisierung.&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Enable device auto refresh</source>
+ <translation>Automatische Geräteaktualisierung aktivieren</translation>
+ </message>
+ <message>
+ <source>Auto Interval</source>
+ <translation>Automatisches Intervall</translation>
+ </message>
+ <message>
+ <source>Refresh every:</source>
+ <translation>Aktualisierungsintervall:</translation>
+ </message>
+ <message>
+ <source>seconds</source>
+ <translation>Sekunden</translation>
+ </message>
+ <message>
+ <source>Device(s) to Refresh </source>
+ <translation>Zu aktualisierende Geräte</translation>
+ </message>
+ <message>
+ <source>Only currently selected device</source>
+ <translation>Nur aktuell ausgewähltes Gerät</translation>
+ </message>
+ <message>
+ <source>All devices</source>
+ <translation>Alle Geräte</translation>
+ </message>
+ <message>
+ <source>Auto Refresh</source>
+ <translation>Automatische Aktualisierung</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Configure if the HP Device Manager will send email on alerts&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Konfigurieren des E-Mail-Versands bei Auftreten von Warnmeldungen.&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Send email when device errors occur:</source>
+ <translation>E-Mail bei Auftreten von Gerätefehlern senden:</translation>
+ </message>
+ <message>
+ <source>Test</source>
+ <translation>Test</translation>
+ </message>
+ <message>
+ <source>To: Address(es)</source>
+ <translation>An: Adresse(n)</translation>
+ </message>
+ <message>
+ <source>Email address(es):</source>
+ <translation>E-Mail-Adresse(n):</translation>
+ </message>
+ <message>
+ <source>&lt;i&gt;Note: Separate multiple email address with a commas.&lt;/i&gt;</source>
+ <translation>&lt;i&gt;Hinweis: Trennen Sie mehrere E-Mail-Adressen durch ein Komma.&lt;/i&gt;</translation>
+ </message>
+ <message>
+ <source>From: Address</source>
+ <translation>Von: Adresse</translation>
+ </message>
+ <message>
+ <source>Sender email address:</source>
+ <translation>E-Mail-Adresse des Absenders:</translation>
+ </message>
+ <message>
+ <source>&lt;i&gt;Note: This should generally be your email address.&lt;/i&gt;</source>
+ <translation>&lt;i&gt;Hinweis: Hierbei handelt es sich in der Regel um Ihre eigene E-Mail-Adresse.&lt;/i&gt;</translation>
+ </message>
+ <message>
+ <source>Email Alerts</source>
+ <translation>E-Mail-Warnhinweise</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Configure what commands to run for device functions&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Konfigurieren der für die Gerätefunktionen auszuführenden Befehle.&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Access Photo Cards</source>
+ <translation>Fotokarten öffnen</translation>
+ </message>
+ <message>
+ <source>Built-in access photo cards function</source>
+ <translation>Integrierte Funktion zum Zugreifen auf Fotokarten.</translation>
+ </message>
+ <message>
+ <source>External command:</source>
+ <translation>Externer Befehl:</translation>
+ </message>
+ <message>
+ <source>Send PC Fax</source>
+ <translation>PC-Fax senden</translation>
+ </message>
+ <message>
+ <source>Built-in send PC fax function</source>
+ <translation>Integrierte Funktion für den Faxversand per PC.</translation>
+ </message>
+ <message>
+ <source>Scan</source>
+ <translation>Scannen</translation>
+ </message>
+ <message>
+ <source>Built-in scan function</source>
+ <translation>Integrierte Scanfunktion.</translation>
+ </message>
+ <message>
+ <source>External scan command:</source>
+ <translation>Externer Scanbefehl:</translation>
+ </message>
+ <message>
+ <source>Print</source>
+ <translation>Drucken</translation>
+ </message>
+ <message>
+ <source>Built-in print function</source>
+ <translation>Integrierte Druckfunktion.</translation>
+ </message>
+ <message>
+ <source>Set Defaults</source>
+ <translation>Standardeinstellungen</translation>
+ </message>
+ <message>
+ <source>Make Copies</source>
+ <translation>Kopieren</translation>
+ </message>
+ <message>
+ <source>Built-in make copies function</source>
+ <translation>Integrierte Kopierfunktion.</translation>
+ </message>
+ <message>
+ <source>Functions (Advanced)</source>
+ <translation>Funktionen (erweitert)</translation>
+ </message>
+</context>
+<context>
+ <name>SetupForm</name>
+ <message>
+ <source>Current: Filter: &quot;%2&quot; Search: &quot;%3&quot; TTL: %4 Timeout: %5s</source>
+ <translation>Aktuell: Filter: &quot;%2&quot; Suche: &quot;%3&quot; Gültigkeit: %4 Zeitlimit: %5s</translation>
+ </message>
+ <message>
+ <source>The printer name and fax name must be different. Please choose different names.</source>
+<translation>Für den Drucker und das Fax müssen verschiedene Namen verwendet werden. Wählen Sie bitte andere Namen.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Device not found.&lt;/b&gt; &lt;p&gt;Please make sure your printer is properly connected and powered-on.</source>
+<translation>&lt;b&gt;Das Gerät wurde nicht gefunden.&lt;/b&gt; &lt;p&gt;Vergewissern Sie sich, dass der Drucker eingeschaltet und ordnungsgemäß angeschlossen ist.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;No devices found.&lt;/b&gt;&lt;p&gt;Please make sure your printer is properly connected and powered-on.</source>
+ <translation>&lt;b&gt;Es wurden keine Geräte gefunden.&lt;/b&gt;&lt;p&gt;Vergewissern Sie sich, dass der Drucker eingeschaltet und ordnungsgemäß angeschlossen ist.</translation>
+ </message>
+ <message>
+ <source>Current Settings: Filter: &quot;%2&quot; Search: &quot;%3&quot; TTL: %4 Timeout: %5s</source>
+ <translation>Aktuelle Einstellungen: Filter: &quot;%2&quot; Suche: &quot;%3&quot; Gültigkeit: %4 Zeitlimit: %5s</translation>
+ </message>
+ <message>
+ <source>network</source>
+ <translation>Netzwerk</translation>
+ </message>
+ <message>
+ <source>USB bus</source>
+ <translation>USB</translation>
+ </message>
+ <message>
+ <source>parallel port</source>
+ <translation>Paralleler Anschluss</translation>
+ </message>
+ <message>
+ <source>Model</source>
+ <translation>Modell</translation>
+ </message>
+ <message>
+ <source>Serial No.</source>
+ <translation>Seriennr.</translation>
+ </message>
+ <message>
+ <source>IP Address</source>
+ <translation>IP-Adresse</translation>
+ </message>
+ <message>
+ <source>Host Name</source>
+ <translation>Hostname</translation>
+ </message>
+ <message>
+ <source>Device</source>
+ <translation>Gerät</translation>
+ </message>
+ <message>
+ <source>Device URI</source>
+ <translation>Geräte-URI</translation>
+ </message>
+ <message>
+ <source>%1 device(s) found on the %1:</source>
+ <translation>%1 Gerät(e) gefunden auf %1:</translation>
+ </message>
+ <message>
+ <source>%1 device(s) found on the %1 at address %2:</source>
+ <translation>%1 Gerät(e) gefunden auf %1 mit der Adresse %2:</translation>
+ </message>
+ <message>
+ <source>%1 device(s) found on the %1 at ID %2:</source>
+ <translation>%1 Gerät(e) gefunden auf %1 mit der ID %2:</translation>
+ </message>
+ <message>
+ <source>%1 device(s) found on the %1 device node ID %2:</source>
+ <translation>%1 Gerät(e) gefunden auf %1 mit der Geräteknoten-ID %2:</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Device not found or invalid HPLIP device.&lt;/b&gt;&lt;p&gt;If you specified a USB ID, IP address, or other parameter, please re-check it and try again.</source>
+ <translation>&lt;b&gt;Das Gerät wurde nicht gefunden, oder es handelt sich um ein ungültiges HPLIP-Gerät.&lt;/b&gt;&lt;p&gt;Überprüfen Sie bei Angabe einer USB-ID, IP-Adresse oder anderer Parameter diese Angabe, und wiederholen Sie den Vorgang.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;PPD not file found.&lt;/b&gt;&lt;p&gt;An appropriate PPD file could not be found. Please check your HPLIP install, use &lt;i&gt;Select Other...&lt;/i&gt;, or download one from linuxprinting.org.</source>
+ <translation>&lt;b&gt;Die PPD-Datei wurde nicht gefunden.&lt;/b&gt;&lt;p&gt;Es wurde keine geeignete PPD-Datei gefunden. Überprüfen Sie die HPLIP-Installation, verwenden Sie &lt;i&gt;Anderes Gerät auswählen...&lt;/i&gt;, oder laden Sie die Datei von &quot;linuxprinting.org&quot; herunter.</translation>
+ </message>
+ <message>
+ <source>You must enter a name for the printer.</source>
+ <translation>Geben Sie einen Druckernamen ein.</translation>
+ </message>
+ <message>
+ <source>A printer already exists with this name. Please choose a different name.</source>
+ <translation>Ein Drucker mit diesem Namen ist bereits vorhanden. Wählen Sie einen anderen Namen.</translation>
+ </message>
+ <message>
+ <source>You must enter a fax name.</source>
+ <translation>Geben Sie einen Faxnamen ein.</translation>
+ </message>
+ <message>
+ <source>A fax already exists with this name. Please choose a different name.</source>
+ <translation>Ein Fax mit diesem Namen ist bereits vorhanden. Wählen Sie einen anderen Namen.</translation>
+ </message>
+ <message>
+ <source>Unable to communicate with the device. Please check the device and try again.</source>
+ <translation>Kommunikation mit dem Gerät nicht möglich. Überprüfen Sie das Gerät, und wiederholen Sie den Vorgang.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Device I/O Error&lt;/b&gt;&lt;p&gt;Could not communicate with device. Device may be busy.</source>
+ <translation>&lt;b&gt;Geräte-E/A-Fehler.&lt;/b&gt;&lt;p&gt;Kommunikation mit dem Gerät nicht möglich. Das Gerät ist möglicherweise ausgelastet.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Printer queue setup failed.&lt;/b&gt;&lt;p&gt;Please restart CUPS and try again.</source>
+ <translation>&lt;b&gt;Fehler beim Einrichten der Druckerwarteschlange.&lt;/b&gt;&lt;p&gt;Starten Sie CUPS neu, und wiederholen Sie den Vorgang.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Unable to find HP fax PPD file.&lt;/b&gt;&lt;p&gt;Please check you HPLIP installation and try again.</source>
+ <translation>&lt;b&gt;PPD-Datei für HP Fax wurde nicht gefunden.&lt;/b&gt;&lt;p&gt;Überprüfen Sie die HPLIP-Installation, und wiederholen Sie den Vorgang.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Fax queue setup failed.&lt;/b&gt;&lt;p&gt;Please restart CUPS and try again.</source>
+ <translation>&lt;b&gt;Fehler beim Einrichten der Faxwarteschlange.&lt;/b&gt;&lt;p&gt;Starten Sie CUPS neu, und wiederholen Sie den Vorgang.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Unable to print to printer.&lt;/b&gt;&lt;p&gt;Please check device and try again.</source>
+ <translation>&lt;b&gt;Ausgabe auf dem Drucker nicht möglich.&lt;/b&gt;&lt;p&gt;Überprüfen Sie das Gerät, und wiederholen Sie den Vorgang.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;No CUPS queue found for device.&lt;/b&gt;&lt;p&gt;Please install the printer in CUPS and try again.</source>
+ <translation>&lt;b&gt;Für das Gerät wurde keine CUPS-Warteschlange gefunden.&lt;/b&gt;&lt;p&gt;Installieren Sie den Drucker in CUPS, und wiederholen Sie den Vorgang.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Printer Error.&lt;/b&gt;&lt;p&gt;Printer is busy, offline, or in an error state. Please check the device and try again.</source>
+ <translation>&lt;b&gt;Druckerfehler.&lt;/b&gt;&lt;p&gt;Der Drucker ist ausgelastet, offline oder weist einen Fehler auf. Überprüfen Sie das Gerät, und wiederholen Sie den Vorgang.</translation>
+ </message>
+</context>
+<context>
+ <name>SetupForm_base</name>
+ <message>
+ <source>PPD File</source>
+ <translation>PPD-Datei</translation>
+ </message>
+ <message>
+ <source>Description</source>
+ <translation>Beschreibung</translation>
+ </message>
+ <message>
+ <source>HP Device Manger - Printer Setup Wizard</source>
+ <translation>HP Geräte-Manager – Druckereinrichtungs-Assistent</translation>
+ </message>
+ <message>
+ <source>Connection (I/O) Type</source>
+ <translation>Verbindungstyp (E/A)</translation>
+ </message>
+ <message>
+ <source>Universal Serial Bus (USB)</source>
+ <translation>Universal Serial Bus (USB)</translation>
+ </message>
+ <message>
+ <source>Network/Ethernet/Wireless (direct connection or JetDirect)</source>
+ <translation>Netzwerk/Ethernet/Wireless (direkte Verbindung oder JetDirect)</translation>
+ </message>
+ <message>
+ <source>Parallel Port (LPT)</source>
+ <translation>Paralleler Anschluss (LPT)</translation>
+ </message>
+ <message>
+ <source>Advanced...</source>
+ <translation>Erweitert...</translation>
+ </message>
+ <message>
+ <source>Choose Connection Type</source>
+ <translation>Verbindungstyp auswählen</translation>
+ </message>
+ <message>
+ <source>probeHeadingTextLabel</source>
+ <translation>probeHeadingTextLabel</translation>
+ </message>
+ <message>
+ <source>Find Manually...</source>
+ <translation>Manuell suchen...</translation>
+ </message>
+ <message>
+ <source>Refresh</source>
+ <translation>Aktualisieren</translation>
+ </message>
+ <message>
+ <source>Select from Discovered Devices</source>
+ <translation>Aus erkannten Geräten auswählen</translation>
+ </message>
+ <message>
+ <source>Select Other...</source>
+ <translation>Anderes Gerät auswählen...</translation>
+ </message>
+ <message>
+ <source>Defaults</source>
+ <translation>Standard</translation>
+ </message>
+ <message>
+ <source>Please chose the PPD file (by name and description) that most closely matches your printer. &lt;i&gt;Note: The model name of the printer may vary somehwat from the PPD file name, for example, a Deskjet 5550 may have a PPD file with the model name of Deskjet_5500_series.&lt;/i&gt;</source>
+ <translation>Wählen Sie (nach Name und Beschreibung) die PPD-Datei aus, die dem Drucker am ehesten entspricht. &lt;i&gt;Hinweis: Der Modellname des Druckers kann etwas vom Namen der PPD-Datei abweichen. Beispiel: Die PPD-Datei für einen Deskjet 5550 ist möglicherweise mit &quot;Deskjet_5500_series&quot; benannt.&lt;/i&gt;</translation>
+ </message>
+ <message>
+ <source>Select/Confirm PPD File</source>
+ <translation>PPD-Datei auswählen/bestätigen</translation>
+ </message>
+ <message>
+ <source>Printer Information</source>
+ <translation>Druckerinformationen</translation>
+ </message>
+ <message>
+ <source>Default</source>
+ <translation>Standard</translation>
+ </message>
+ <message>
+ <source>Location:</source>
+ <translation>Speicherort:</translation>
+ </message>
+ <message>
+ <source>Printer Name:</source>
+ <translation>Druckername:</translation>
+ </message>
+ <message>
+ <source>Description:</source>
+ <translation>Beschreibung:</translation>
+ </message>
+ <message>
+ <source>Fax Information</source>
+ <translation>Faxinformationen</translation>
+ </message>
+ <message>
+ <source>Fax Name:</source>
+ <translation>Faxname:</translation>
+ </message>
+ <message>
+ <source>Name/Company:</source>
+ <translation>Name/Unternehmen:</translation>
+ </message>
+ <message>
+ <source>Fax Number:</source>
+ <translation>Faxnummer:</translation>
+ </message>
+ <message>
+ <source>Setup PC send fax</source>
+ <translation>Faxversand per PC einrichten</translation>
+ </message>
+ <message>
+ <source>Click &quot;Next &gt;&quot; to install the printer on your system.</source>
+ <translation>Klicken Sie auf &quot;Weiter&gt;&quot;, um den Drucker im System zu installieren.</translation>
+ </message>
+ <message>
+ <source>Enter Printer Information</source>
+ <translation>Druckerinformationen eingeben</translation>
+ </message>
+ <message>
+ <source>Send test page to printer</source>
+ <translation>Testseite an Drucker senden</translation>
+ </message>
+ <message>
+ <source>Fax Summary</source>
+ <translation>Faxübersicht</translation>
+ </message>
+ <message>
+ <source>Printer Summary</source>
+ <translation>Druckerübersicht</translation>
+ </message>
+ <message>
+ <source>PPD File:</source>
+ <translation>PPD-Datei:</translation>
+ </message>
+ <message>
+ <source>The printer has been successfully installed on your system.</source>
+ <translation>Der Drucker wurde erfolgreich im System installiert.</translation>
+ </message>
+ <message>
+ <source>Finished Adding Printer</source>
+ <translation>Drucker hinzugefügt</translation>
+ </message>
+</context>
+<context>
+ <name>SetupManualFind</name>
+ <message>
+ <source>Please enter the printer&apos;s network hostname or IP address.</source>
+ <translation>Geben Sie den Netzwerkhostnamen oder die IP-Adresse des Druckers ein.</translation>
+ </message>
+ <message>
+ <source>&lt;i&gt;(IPv4 address &quot;a.b.c.d&quot; or &quot;hostname&quot;.)&lt;/i&gt;</source>
+ <translation>&lt;i&gt;(IPv4-Adresse &quot;a.b.c.d&quot; oder &quot;Hostname&quot;.)&lt;/i&gt;</translation>
+ </message>
+ <message>
+ <source>Hostname or IP Address:</source>
+ <translation>Hostname oder IP-Adresse:</translation>
+ </message>
+ <message>
+ <source>Please enter the USB ID for the printer.</source>
+ <translation>Geben Sie die USB-ID des Druckers ein.</translation>
+ </message>
+ <message>
+ <source>&lt;i&gt;(&quot;xxx:yyy&quot; where xxx is the USB bus ID and yyy is the USB device ID. The &apos;:&apos; and all leading zeroes must be present. Use &apos;lsusb&apos; to determine this information.)&lt;/i&gt;</source>
+ <translation>&lt;i&gt;(&quot;xxx:yyy&quot;; Erläuterung: &quot;xxx&quot; steht für die USB-ID, &quot;yyy&quot; steht für die USB-Geräte-ID. Der Doppelpunkt sowie alle führenden Nullen müssen vorhanden sein. Verwenden Sie zum Ermitteln dieser Information den Befehl &apos;lsusb&apos;.)&lt;/i&gt;</translation>
+ </message>
+ <message>
+ <source>USB ID:</source>
+ <translation>USB-ID:</translation>
+ </message>
+ <message>
+ <source>Please enter the filesystem device node for the printer.</source>
+ <translation>Geben Sie den Dateisystem-Geräteknoten für den Drucker ein.</translation>
+ </message>
+ <message>
+ <source> &lt;i&gt;(&quot;/dev/parportX&quot;, X=0,1,2,...)&lt;/i&gt;</source>
+ <translation>&lt;i&gt;(&quot;/dev/parportX&quot;, X=0,1,2,...)&lt;/i&gt;</translation>
+ </message>
+ <message>
+ <source>Device Node:</source>
+ <translation>Geräteknoten:</translation>
+ </message>
+</context>
+<context>
+ <name>SetupManualFind_base</name>
+ <message>
+ <source>HP Device Manager - Manually Find Device</source>
+ <translation>HP Geräte-Manager – Manuelle Gerätesuche</translation>
+ </message>
+ <message>
+ <source>TEXT</source>
+ <translation>TEXT</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Abbrechen</translation>
+ </message>
+ <message>
+ <source>Find</source>
+ <translation>Suchen</translation>
+ </message>
+ <message>
+ <source>textLabel1</source>
+ <translation>textLabel1</translation>
+ </message>
+ <message>
+ <source>IP/HN/SER/USB/DEV:</source>
+ <translation>IP/HN/SER/USB/GER:</translation>
+ </message>
+</context>
+<context>
+ <name>SetupSettings_base</name>
+ <message>
+ <source>HP Device Manager - Setup Filters, Search and Settings</source>
+ <translation>HP Geräte-Manager – Einrichten von Filtern, Suchen und Einstellungen</translation>
+ </message>
+ <message>
+ <source>Discovery Filter</source>
+ <translation>Erkennungsfilter</translation>
+ </message>
+ <message>
+ <source>Discover all devices</source>
+ <translation>Alle Geräte erkennen</translation>
+ </message>
+ <message>
+ <source>Only discover devices that support the following functionality:</source>
+ <translation>Nur Geräte mit Unterstützung der folgenden Funktionen erkennen:</translation>
+ </message>
+ <message>
+ <source>PC Initiated Copying</source>
+ <translation>PC-gestütztes Kopieren</translation>
+ </message>
+ <message>
+ <source>PC Photocard Access</source>
+ <translation>Fotokartenzugriff per PC</translation>
+ </message>
+ <message>
+ <source>Scan to PC</source>
+ <translation>PC-gestütztes Scannen</translation>
+ </message>
+ <message>
+ <source>PC Send Fax</source>
+ <translation>PC-gestützter Faxversand</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Abbrechen</translation>
+ </message>
+ <message>
+ <source>Defaults</source>
+ <translation>Standard</translation>
+ </message>
+ <message>
+ <source>Discovery Search</source>
+ <translation>Erkennungssuche</translation>
+ </message>
+ <message>
+ <source>Search Term:</source>
+ <translation>Begriff suchen:</translation>
+ </message>
+ <message>
+ <source>Network Discovery Settings</source>
+ <translation>Netzwerkerkennungseinstellungen</translation>
+ </message>
+ <message>
+ <source>TTL:</source>
+ <translation>Gültigkeit:</translation>
+ </message>
+ <message>
+ <source>Timeout (secs):</source>
+ <translation>Zeitlimit (Sek.):</translation>
+ </message>
+</context>
+<context>
+ <name>StringTable</name>
+ <message>
+ <source>Unknown</source>
+<translation>Unbekannt</translation>
+ </message>
+ <message>
+ <source>Please correct the problem and try again.</source>
+<translation>Beheben Sie das Problem, und wiederholen Sie den Vorgang.</translation>
+ </message>
+ <message>
+ <source>Please correct the problem and press continue on the printer.</source>
+<translation>Beheben Sie das Problem, und drücken Sie die Weiter-Taste auf dem Drucker.</translation>
+ </message>
+ <message>
+ <source>The printer has started a print job.</source>
+<translation>Der Drucker hat einen Druckauftrag gestartet.</translation>
+ </message>
+ <message>
+ <source>Print job has completed.</source>
+<translation>Druckauftrag ist abgeschlossen.</translation>
+ </message>
+ <message>
+ <source>Started rendering a fax job.</source>
+<translation>Wiedergabe eines Faxauftrags gestartet.</translation>
+ </message>
+ <message>
+ <source>Rendering job completed.</source>
+<translation>Wiedergabe des Auftrags abgeschlossen.</translation>
+ </message>
+ <message>
+ <source>The printer is idle.</source>
+<translation>Der Drucker befindet sich im Standby-Modus.</translation>
+ </message>
+ <message>
+ <source>The printer is busy.</source>
+<translation>Der Drucker ist in Betrieb.</translation>
+ </message>
+ <message>
+ <source>The print job is continuing.</source>
+<translation>Der Druckauftrag wird fortgesetzt.</translation>
+ </message>
+ <message>
+ <source>Turning off.</source>
+<translation>Aussschalten.</translation>
+ </message>
+ <message>
+ <source>Report printing.</source>
+<translation>Bericht wird gedruckt.</translation>
+ </message>
+ <message>
+ <source>Canceling.</source>
+<translation>Abbruch.</translation>
+ </message>
+ <message>
+ <source>Waiting for ink to dry.</source>
+<translation>Warten auf Trocknen der Tinte.</translation>
+ </message>
+ <message>
+ <source>Pen change.</source>
+<translation>Patronenwechsel.</translation>
+ </message>
+ <message>
+ <source>The printer is out of paper.</source>
+<translation>Der Drucker enthält kein Papier mehr.</translation>
+ </message>
+ <message>
+ <source>Please load more paper and follow the instructions on the front panel (if any) to continue printing.</source>
+<translation>Legen Sie Papier ein, und folgen Sie den Anweisungen auf dem Bedienfeld (sofern verfügbar), um den Druckvorgang fortzusetzen.</translation>
+ </message>
+ <message>
+ <source>Banner eject needed.</source>
+<translation>Ein Banner muss ausgeworfen werden.</translation>
+ </message>
+ <message>
+ <source>Banner mismatch.</source>
+<translation>Banner passt nicht.</translation>
+ </message>
+ <message>
+ <source>Photo mismatch.</source>
+<translation>Foto passt nicht.</translation>
+ </message>
+ <message>
+ <source>Duplex mismatch.</source>
+<translation>Duplex passt nicht.</translation>
+ </message>
+ <message>
+ <source>Paper or cartridge carriage jammed.</source>
+<translation>Papier- oder Patronentransportstau.</translation>
+ </message>
+ <message>
+ <source>Please clear the jam and press continue on the printer.</source>
+<translation>Beheben Sie den Stau, und drücken Sie die Weiter-Taste auf dem Drucker.</translation>
+ </message>
+ <message>
+ <source>There is a problem with a cartridge.</source>
+<translation>Es liegt ein Problem mit einer Tintenpatrone vor.</translation>
+ </message>
+ <message>
+ <source>Powering down.</source>
+<translation>Wird heruntergefahren.</translation>
+ </message>
+ <message>
+ <source>Front panel test.</source>
+<translation>Bedienfeldtest.</translation>
+ </message>
+ <message>
+ <source>Clean out tray missing.</source>
+<translation>Säuberungsfach fehlt.</translation>
+ </message>
+ <message>
+ <source>Output bin full.</source>
+<translation>Ausgabefach voll.</translation>
+ </message>
+ <message>
+ <source>Media size mismatch.</source>
+<translation>Medienformat passt nicht.</translation>
+ </message>
+ <message>
+ <source>Duplexer is jammed.</source>
+<translation>Duplexer-Stau.</translation>
+ </message>
+ <message>
+ <source>An ink cartridge is out of ink.</source>
+<translation>Eine Tintenpatrone ist leer.</translation>
+ </message>
+ <message>
+ <source>Internal device error.</source>
+<translation>Interner Gerätefehler.</translation>
+ </message>
+ <message>
+ <source>Second tray missing.</source>
+<translation>Zweites Papierfach fehlt.</translation>
+ </message>
+ <message>
+ <source>Duplexer missing.</source>
+<translation>Duplexer fehlt.</translation>
+ </message>
+ <message>
+ <source>Rear tray missing.</source>
+<translation>Hinteres Papierfach fehlt.</translation>
+ </message>
+ <message>
+ <source>Cartridge not latched.</source>
+<translation>Patrone ist nicht korrekt eingesetzt.</translation>
+ </message>
+ <message>
+ <source>Battery very low.</source>
+<translation>Batterie ist fast leer.</translation>
+ </message>
+ <message>
+ <source>Output tray closed.</source>
+<translation>Ausgabefach geschlossen.</translation>
+ </message>
+ <message>
+ <source>Manual feed blocked.</source>
+<translation>Manuelle Zufuhr ist blockiert.</translation>
+ </message>
+ <message>
+ <source>Rear feed blocked.</source>
+<translation>Hintere Zufuhr ist blockiert.</translation>
+ </message>
+ <message>
+ <source>Second tray out of paper.</source>
+<translation>Zweites Papierfach enthält kein Papier.</translation>
+ </message>
+ <message>
+ <source>Input tray locked.</source>
+<translation>Papierzufuhr ist gesperrt.</translation>
+ </message>
+ <message>
+ <source>Non-HP ink.</source>
+<translation>Keine HP Tinte.</translation>
+ </message>
+ <message>
+ <source>Pen calibration needs resume.</source>
+<translation>Patronenkalibrierung muss fortgesetzt werden.</translation>
+ </message>
+ <message>
+ <source>Media type mismatch.</source>
+<translation>Druckmedientyp passt nicht.</translation>
+ </message>
+ <message>
+ <source>Custom media mismatch.</source>
+<translation>Benutzerdefinierter Druckmedientyp passt nicht.</translation>
+ </message>
+ <message>
+ <source>Pen cleaning in progress.</source>
+<translation>Patrone wird gereinigt.</translation>
+ </message>
+ <message>
+ <source>Pen checking in progress.</source>
+<translation>Patrone wird überprüft.</translation>
+ </message>
+ <message>
+ <source>Black cartridge is low on ink</source>
+<translation>Die schwarze Tintenpatrone ist fast aufgebraucht.</translation>
+ </message>
+ <message>
+ <source>Tri-color cartridge is low on ink</source>
+<translation>Die Dreikammer-Tintenpatrone ist fast aufgebraucht.</translation>
+ </message>
+ <message>
+ <source>Photo cartridge is low on ink</source>
+<translation>Die Fotopatrone ist fast aufgebraucht.</translation>
+ </message>
+ <message>
+ <source>Cyan cartridge is low on ink</source>
+<translation>Die zyanblaue Tintenpatrone ist fast aufgebraucht.</translation>
+ </message>
+ <message>
+ <source>Magenta cartridge is low on ink</source>
+<translation>Die magentarote Tintenpatrone ist fast aufgebraucht.</translation>
+ </message>
+ <message>
+ <source>Yellow cartridge is low on ink</source>
+<translation>Die gelbe Tintenpatrone ist fast aufgebraucht.</translation>
+ </message>
+ <message>
+ <source>Photo cyan cartridge is low on ink</source>
+<translation>Die zyanblaue Fotopatrone ist fast aufgebraucht.</translation>
+ </message>
+ <message>
+ <source>Photo magenta cartridge is low on ink</source>
+<translation>Die magentarote Fotopatrone ist fast aufgebraucht.</translation>
+ </message>
+ <message>
+ <source>Photo yellow cartridge is low on ink</source>
+<translation>Die gelbe Fotopatrone ist fast aufgebraucht.</translation>
+ </message>
+ <message>
+ <source>Photo gray cartridge is low on ink</source>
+<translation>Die graue Fotopatrone ist fast aufgebraucht.</translation>
+ </message>
+ <message>
+ <source>Photo blue cartridge is low on ink</source>
+<translation>Die blaue Fotopatrone ist fast aufgebraucht.</translation>
+ </message>
+ <message>
+ <source>Black cartridge is low on toner</source>
+<translation>Die schwarze Tintenpatrone ist fast leer.</translation>
+ </message>
+ <message>
+ <source>Cyan cartridge is low on toner</source>
+<translation>Die zyanblaue Tintenpatrone ist fast leer.</translation>
+ </message>
+ <message>
+ <source>Magenta cartridge is low on toner</source>
+<translation>Die magentarote Tintenpatrone ist fast leer.</translation>
+ </message>
+ <message>
+ <source>Yellow cartridge is low on toner</source>
+<translation>Die gelbe Tintenpatrone ist fast leer.</translation>
+ </message>
+ <message>
+ <source>Warming up.</source>
+<translation>Aufwärmphase.</translation>
+ </message>
+ <message>
+ <source>Low paper.</source>
+<translation>Wenig Papier.</translation>
+ </message>
+ <message>
+ <source>Door open.</source>
+<translation>Abdeckung offen.</translation>
+ </message>
+ <message>
+ <source>Offline.</source>
+<translation>Offline.</translation>
+ </message>
+ <message>
+ <source>Low toner.</source>
+<translation>Wenig Toner.</translation>
+ </message>
+ <message>
+ <source>No toner.</source>
+<translation>Kein Toner.</translation>
+ </message>
+ <message>
+ <source>Service request.</source>
+<translation>Serviceanforderung.</translation>
+ </message>
+ <message>
+ <source>Fuser error.</source>
+<translation>Fixierfehler.</translation>
+ </message>
+ <message>
+ <source>Unsupported printer model.</source>
+<translation>Nicht unterstütztes Druckermodell.</translation>
+ </message>
+ <message>
+ <source>Scan job started.</source>
+<translation>Scanauftrag gestartet.</translation>
+ </message>
+ <message>
+ <source>Scan job completed.</source>
+<translation>Scanauftrag abgeschlossen.</translation>
+ </message>
+ <message>
+ <source>Scan job failed.</source>
+<translation>Fehler beim Scanauftrag.</translation>
+ </message>
+ <message>
+ <source>Fax job started.</source>
+<translation>Faxauftrag gestartet.</translation>
+ </message>
+ <message>
+ <source>Fax job complete.</source>
+<translation>Faxauftrag abgeschlossen.</translation>
+ </message>
+ <message>
+ <source>Fax job failed.</source>
+<translation>Fehler beim Faxauftrag.</translation>
+ </message>
+ <message>
+ <source>Fax job canceled.</source>
+<translation>Faxauftrag abgebrochen.</translation>
+ </message>
+ <message>
+ <source>Fax send job continuing.</source>
+<translation>Senden des Fax wird fortgesetzt.</translation>
+ </message>
+ <message>
+ <source>Fax receive job continuing.</source>
+<translation>Empfangen des Fax wird fortgesetzt.</translation>
+ </message>
+ <message>
+ <source>Copy job started.</source>
+<translation>Kopierauftrag gestartet.</translation>
+ </message>
+ <message>
+ <source>Copy job complete.</source>
+<translation>Kopierauftrag abgeschlossen.</translation>
+ </message>
+ <message>
+ <source>Copy job failed.</source>
+<translation>Fehler beim Kopierauftrag.</translation>
+ </message>
+ <message>
+ <source>Copy job canceled.</source>
+<translation>Kopierauftrag abgebrochen.</translation>
+ </message>
+ <message>
+ <source>Device is powered down or unplugged.</source>
+<translation>Das Gerät ist ausgeschaltet, oder der Stecker wurde abgezogen.</translation>
+ </message>
+ <message>
+ <source>Device communication error.</source>
+<translation>Gerätekommunikationsfehler.</translation>
+ </message>
+ <message>
+ <source>Device is busy.</source>
+<translation>Das Gerät ist ausgelastet.</translation>
+ </message>
+ <message>
+ <source>No data.</source>
+<translation>Keine Daten.</translation>
+ </message>
+ <message>
+ <source>Unsupported I/O bus.</source>
+<translation>Nicht unterstützter E/A-Bus.</translation>
+ </message>
+ <message>
+ <source>Device does not support requested operation.</source>
+<translation>Das Gerät unterstützt den angeforderten Vorgang nicht.</translation>
+ </message>
+ <message>
+ <source>To send a fax you must run hp-sendfax first.</source>
+<translation>Zum Senden eines Fax müssen Sie zunächst &quot;hp-sendfax&quot; ausführen.</translation>
+ </message>
+ <message>
+ <source>Run hp-sendfax now to continue. Fax will resume within 10 seconds.</source>
+<translation>Führen Sie jetzt &quot;hp-sendfax&quot; aus, um den Vorgang fortzusetzen. Der Faxvorgang wird innerhalb von 10 Sekunden fortgesetzt.</translation>
+ </message>
+ <message>
+ <source>Photocard unload started.</source>
+<translation>Entladen der Fotokarte gestartet.</translation>
+ </message>
+ <message>
+ <source>Photocard unload ended.</source>
+<translation>Entladen der Fotokarte beendet.</translation>
+ </message>
+ <message>
+ <source>Photocard unload failed.</source>
+<translation>Fehler beim Entladen der Fotokarte.</translation>
+ </message>
+ <message>
+ <source>Make sure photocard is inserted properly and try again.</source>
+<translation>Stellen Sie sicher, dass die Fotokarte korrekt eingesetzt ist, und wiederholen Sie den Vorgang.</translation>
+ </message>
+ <message>
+ <source>Unable to mount photocard on device.</source>
+<translation>Die Fotokarte kann nicht im Gerät aktiviert werden.</translation>
+ </message>
+ <message>
+ <source>Photocard unloaded successfully.</source>
+<translation>Die Fotokarte wurde erfolgreich entladen.</translation>
+ </message>
+ <message>
+ <source>Unknown error.</source>
+<translation>Unbekannter Fehler.</translation>
+ </message>
+ <message>
+ <source>Print</source>
+<translation>Installationsprogramm für HP Linux Imaging and Printing (HPLIP)</translation>
+ </message>
+ <message>
+ <source>Scan</source>
+<translation>Scanauftrag gestartet.</translation>
+ </message>
+ <message>
+ <source>Send fax</source>
+<translation>Fax senden</translation>
+ </message>
+ <message>
+ <source>Make copies</source>
+<translation>Kopien erstellen</translation>
+ </message>
+ <message>
+ <source>Access photo cards</source>
+<translation>Fotokarten öffnen</translation>
+ </message>
+ <message>
+ <source>Invalid/missing</source>
+<translation>Ungültig/fehlt</translation>
+ </message>
+ <message>
+ <source>Invalid/missing ink cartridge</source>
+<translation>Ungültige/fehlende Tintenpatrone</translation>
+ </message>
+ <message>
+ <source>Invalid/missing cartridge</source>
+<translation>Ungültige/fehlende Patrone</translation>
+ </message>
+ <message>
+ <source>Invalid/missing print head</source>
+<translation>Ungültiger/fehlender Druckkopf</translation>
+ </message>
+ <message>
+ <source>Black print head</source>
+<translation>Schwarzer Druckkopf</translation>
+ </message>
+ <message>
+ <source>Black ink cartridge</source>
+<translation>Schwarze Tintenpatrone</translation>
+ </message>
+ <message>
+ <source>Black cartridge</source>
+<translation>Die schwarze Tintenpatrone ist fast aufgebraucht.</translation>
+ </message>
+ <message>
+ <source>Tri-color print head</source>
+<translation>Dreikammer-Druckkopf</translation>
+ </message>
+ <message>
+ <source>Tri-color ink cartridge</source>
+<translation>Dreikammer-Tintenpatrone</translation>
+ </message>
+ <message>
+ <source>Tri-color cartridge</source>
+<translation>Die Dreikammer-Tintenpatrone ist fast aufgebraucht.</translation>
+ </message>
+ <message>
+ <source>Photo print head</source>
+<translation>Fotodruckkopf</translation>
+ </message>
+ <message>
+ <source>Photo ink cartridge</source>
+<translation>Fototintenpatrone</translation>
+ </message>
+ <message>
+ <source>Photo cartridge</source>
+<translation>Die Fotopatrone ist fast aufgebraucht.</translation>
+ </message>
+ <message>
+ <source>Cyan print head</source>
+<translation>Zyanblauer Druckkopf</translation>
+ </message>
+ <message>
+ <source>Cyan ink cartridge</source>
+<translation>Zyanblaue Tintenpatrone</translation>
+ </message>
+ <message>
+ <source>Cyan cartridge</source>
+<translation>Die zyanblaue Tintenpatrone ist fast aufgebraucht.</translation>
+ </message>
+ <message>
+ <source>Magenta print head</source>
+<translation>Magentaroter Druckkopf</translation>
+ </message>
+ <message>
+ <source>Magenta ink cartridge</source>
+<translation>Magentarote Tintenpatrone</translation>
+ </message>
+ <message>
+ <source>Magenta cartridge</source>
+<translation>Die magentarote Tintenpatrone ist fast aufgebraucht.</translation>
+ </message>
+ <message>
+ <source>Yellow print head</source>
+<translation>Gelber Druckkopf</translation>
+ </message>
+ <message>
+ <source>Yellow ink cartridge</source>
+<translation>Gelbe Tintenpatrone</translation>
+ </message>
+ <message>
+ <source>Yellow cartridge</source>
+<translation>Die gelbe Tintenpatrone ist fast aufgebraucht.</translation>
+ </message>
+ <message>
+ <source>Photo cyan print head</source>
+<translation>Zyanblauer Fotodruckkopf</translation>
+ </message>
+ <message>
+ <source>Photo cyan ink cartridge</source>
+<translation>Zyanblaue Fototintenpatrone</translation>
+ </message>
+ <message>
+ <source>Photo cyan cartridge</source>
+<translation>Die zyanblaue Fotopatrone ist fast aufgebraucht.</translation>
+ </message>
+ <message>
+ <source>Photo magenta print head</source>
+<translation>Magentaroter Fotodruckkopf</translation>
+ </message>
+ <message>
+ <source>Photo magenta ink cartridge</source>
+<translation>Magentarote Fototintenpatrone</translation>
+ </message>
+ <message>
+ <source>Photo magenta cartridge</source>
+<translation>Die magentarote Fotopatrone ist fast aufgebraucht.</translation>
+ </message>
+ <message>
+ <source>Photo yellow print head</source>
+<translation>Gelber Fotodruckkopf</translation>
+ </message>
+ <message>
+ <source>Photo yellow ink cartridge</source>
+<translation>Gelbe Fototintenpatrone</translation>
+ </message>
+ <message>
+ <source>Photo yellow cartridge</source>
+<translation>Die gelbe Fotopatrone ist fast aufgebraucht.</translation>
+ </message>
+ <message>
+ <source>Photo gray print head</source>
+<translation>Grauer Fotodruckkopf</translation>
+ </message>
+ <message>
+ <source>Photo gray ink cartridge</source>
+<translation>Graue Fototintenpatrone</translation>
+ </message>
+ <message>
+ <source>Photo gray cartridge</source>
+<translation>Die graue Fotopatrone ist fast aufgebraucht.</translation>
+ </message>
+ <message>
+ <source>Photo blue print head</source>
+<translation>Blauer Fotodruckkopf</translation>
+ </message>
+ <message>
+ <source>Photo blue ink cartridge</source>
+<translation>Blaue Fototintenpatrone</translation>
+ </message>
+ <message>
+ <source>Photo blue cartridge</source>
+<translation>Die blaue Fotopatrone ist fast aufgebraucht.</translation>
+ </message>
+ <message>
+ <source>Print head</source>
+<translation>Druckkopf</translation>
+ </message>
+ <message>
+ <source>Photo magenta and photo cyan print head</source>
+<translation>Magentaroter und zyanblauer Fotodruckkopf</translation>
+ </message>
+ <message>
+ <source>Magenta and yellow print head</source>
+<translation>Magentaroter und gelber Druckkopf</translation>
+ </message>
+ <message>
+ <source>Black and cyan print head</source>
+<translation>Schwarzer und zyanblauer Druckkopf</translation>
+ </message>
+ <message>
+ <source>Light gray and photo black print head</source>
+<translation>Hellgrauer und schwarzer Fotodruckkopf</translation>
+ </message>
+ <message>
+ <source>Light gray ink cartridge</source>
+<translation>Hellgraue Tintenpatrone</translation>
+ </message>
+ <message>
+ <source>Medium gray ink cartridge</source>
+<translation>Mittelgraue Tintenpatrone</translation>
+ </message>
+ <message>
+ <source>Photo black ink cartridge</source>
+<translation>Schwarze Fototintenpatrone</translation>
+ </message>
+ <message>
+ <source>Cyan and magenta print head</source>
+<translation>Zyanblauer und magentaroter Druckkopf</translation>
+ </message>
+ <message>
+ <source>Black and yellow print head</source>
+<translation>Schwarzer und gelber Druckkopf</translation>
+ </message>
+ <message>
+ <source>Black toner cartridge</source>
+<translation>Schwarze Tonerpatrone</translation>
+ </message>
+ <message>
+ <source>Cyan toner cartridge</source>
+<translation>Zyanblaue Tonerpatrone</translation>
+ </message>
+ <message>
+ <source>Magenta toner cartridge</source>
+<translation>Magentarote Tonerpatrone</translation>
+ </message>
+ <message>
+ <source>Yellow toner cartridge</source>
+<translation>Gelbe Tonerpatrone</translation>
+ </message>
+ <message>
+ <source>Maintenance kit (fuser)</source>
+<translation>Wartungs-Kit (Fixierer)</translation>
+ </message>
+ <message>
+ <source>Document feeder (ADF) kit</source>
+<translation>ADF-Kit (automatische Papierzufuhr)</translation>
+ </message>
+ <message>
+ <source>Drum maintenance kit</source>
+<translation>Trommelwartungs-Kit</translation>
+ </message>
+ <message>
+ <source>Image transfer kit</source>
+<translation>Bildtransfer-Kit</translation>
+ </message>
+ <message>
+ <source>Good/OK</source>
+<translation>Gut/OK</translation>
+ </message>
+ <message>
+ <source>Fair/Moderate</source>
+<translation>Ausreichend/Mittelmäßig</translation>
+ </message>
+ <message>
+ <source>Not installed</source>
+<translation>Nicht installiert</translation>
+ </message>
+ <message>
+ <source>Incorrect</source>
+<translation>Falsch</translation>
+ </message>
+ <message>
+ <source>Failed</source>
+<translation>FEHLER: Die Fotokarte wurde nicht korrekt aktiviert. Überprüfen Sie das Gerät und die Karte, und wiederholen Sie den Vorgang.</translation>
+ </message>
+ <message>
+ <source>Overheated</source>
+<translation>Ãœberhitzt</translation>
+ </message>
+ <message>
+ <source>Discharging</source>
+<translation>Wird entladen</translation>
+ </message>
+ <message>
+ <source>Charging</source>
+<translation>Wird aufgeladen</translation>
+ </message>
+ <message>
+ <source>Low</source>
+<translation>Wenig Papier.</translation>
+ </message>
+ <message>
+ <source>Very low</source>
+<translation>Sehr niedrig</translation>
+ </message>
+ <message>
+ <source>HPLIP: Email alert test message</source>
+<translation>HPLIP: Testnachricht für E-Mail-Warnhinweise</translation>
+ </message>
+ <message>
+ <source>This email is to test the functionality of HPLIP email alerts.</source>
+<translation>Diese E-Mail dient zum Testen der Funktionalität der E-Mail-Warnhinweise von HPLIP.</translation>
+ </message>
+ <message>
+ <source>HPLIP: Error/alert on device: </source>
+<translation>HPLIP: Fehler/Warnhinweis für Gerät:</translation>
+ </message>
+</context>
+<context>
+ <name>SupportForm_base</name>
+ <message>
+ <source>HP Device Manager - Support Information</source>
+ <translation>HP Geräte-Manager – Supportinformationen</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Schließen</translation>
+ </message>
+ <message>
+ <source>http://hplip.sourceforge.net</source>
+ <translation>http://hplip.sourceforge.net</translation>
+ </message>
+ <message>
+ <source>HPLIP is free, open source software distributed under the MIT, BSD, and GPL licenses. &lt;b&gt;&lt;i&gt;HP does not provide formal consumer or commercial support for this software.&lt;/i&gt;&lt;/b&gt;&lt;p&gt; Support is provided informally through a series of resources on a Sourceforge.net website. On this HP sponsored website, you will find FAQs, open discussion forums, installation instructions, a product support table, and other support materials.</source>
+ <translation>Bei HPLIP handelt es sich um eine freie Open Source-Software, die unter den folgenden Lizenzen lizenziert ist: MIT, BSD und GPL. &lt;b&gt;&lt;i&gt;HP stellt für diese Software keinerlei formalen Support zur Verfügung.&lt;/i&gt;&lt;/b&gt;&lt;p&gt; Support wird lediglich über eine Reihe von Ressourcen auf der Sourceforge.net-Website bereitgestellt. Auf dieser von HP gesponserten Website finden Sie FAQs, offene Diskussionsforen, Installationsanleitungen, eine Tabelle mit unterstützten Produkten sowie weiteres Supportmaterial.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;HP Sponsored Support&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Von HP gesponserter Support&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>NOTE: Sourceforge.net is owned and operated by OSTG, Inc. and is not affiliated with HP.</source>
+ <translation>HINWEIS: Sourceforge.net wird von OSTG, Inc. betrieben, ist deren Eigentum und nicht Teil von HP.</translation>
+ </message>
+ <message>
+ <source>HP</source>
+ <translation>HP</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;README File&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Infodatei&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>A readme file was shipped with your version of HPLIP. This file contains the product support table, a troubleshooting guide, and other support resources.</source>
+ <translation>Die Version von HPLIP wurde mit einer Infodatei versehen. Diese Datei enthält die Tabelle mit unterstützten Produkten, ein Handbuch zur Fehlerbehebung sowie andere Supportressourcen.</translation>
+ </message>
+ <message>
+ <source>hplip_readme.html</source>
+ <translation>hplip_readme.html</translation>
+ </message>
+ <message>
+ <source>README File</source>
+ <translation>Infodatei</translation>
+ </message>
+ <message>
+ <source>http://linuxprinting.org</source>
+ <translation>http://linuxprinting.org</translation>
+ </message>
+ <message>
+ <source>General Linux printing assistance is also available from open discussion forums, documentation, access to PPD files, etc. from:</source>
+ <translation>Allgemeine Unterstützung zum Thema &quot;Drucken unter Linux&quot; steht auch in offenen Diskussionsforen zur Verfügung. Dokumentationen, PPD-Dateien usw. finden Sie auch auf der folgenden Website:</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;linuxprinting.org&lt;/b&gt;</source>
+ <translation>&lt;b&gt;linuxprinting.org&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>NOTE: Linuxprinting.org is operated through the generous efforts of Grant Taylor and Till Kamppeter and is not affiliated with HP.</source>
+ <translation>HINWEIS: Linuxprinting.org wird mit unermüdlichem, persönlichem Einsatz von Grant Taylor und Till Kamppeter betrieben und ist nicht Teil von HP.</translation>
+ </message>
+ <message>
+ <source>linuxprinting.org</source>
+ <translation>linuxprinting.org</translation>
+ </message>
+ <message>
+ <source>http://cups.org</source>
+ <translation>http://cups.org</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;CUPS&lt;/b&gt;</source>
+ <translation>&lt;b&gt;CUPS&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Information about CUPS (Common UNIX Printing System) is available at cups.org. This website also contains forums and other support resources for printing on Linux:</source>
+ <translation>Informationen zu CUPS (Common UNIX Printing System) finden Sie unter &quot;cups.org&quot;. Diese Website enthält auch Foren und andere Supportressourcen zum Thema &quot;Drucken unter Linux&quot;:</translation>
+ </message>
+ <message>
+ <source>NOTE: CUPS and the CUPS website is owned and operated by Easy Software Products and is not affiliated with HP.</source>
+ <translation>HINWEIS: CUPS und die CUPS-Website werden von Easy Software Products betrieben, sind deren Eigentum und nicht Teil von HP.</translation>
+ </message>
+ <message>
+ <source>CUPS</source>
+ <translation>CUPS</translation>
+ </message>
+</context>
+<context>
+ <name>UnloadForm</name>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;No devices found that support photo card access.&lt;/b&gt;&lt;p&gt;Please make sure your device is properly installed and try again.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Es wurden keine Geräte mit Zugriffsunterstützung für Fotokarten gefunden.&lt;/b&gt;&lt;p&gt;Vergewissern Sie sich, dass das Gerät ordnungsgemäß installiert ist, und wiederholen Sie den Vorgang.</translation>
+ </message>
+ <message>
+ <source>HP Device Manager - Unload Photo Card</source>
+ <translation>HP Geräte-Manager – Entladen von Fotokarten</translation>
+ </message>
+</context>
+<context>
+ <name>UnloadForm_base</name>
+ <message>
+ <source>HP Device Manager - Unload Files from Photo Card</source>
+ <translation>HP Geräte-Manager – Entladen der Dateien von Fotokarten</translation>
+ </message>
+ <message>
+ <source>Device:</source>
+ <translation>Gerät:</translation>
+ </message>
+ <message>
+ <source>Unload Selected Files</source>
+ <translation>Ausgewählte Dateien entladen</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Schließen</translation>
+ </message>
+ <message>
+ <source>Unload Directory:</source>
+ <translation>Verzeichnis entladen:</translation>
+ </message>
+ <message>
+ <source>Browse...</source>
+ <translation>Durchsuchen...</translation>
+ </message>
+ <message>
+ <source>File Removal:</source>
+ <translation>Dateien entfernen:</translation>
+ </message>
+ <message>
+ <source>Leave all files on photo card</source>
+ <translation>Alle Dateien auf der Fotokarte belassen</translation>
+ </message>
+ <message>
+ <source>Remove selected files</source>
+ <translation>Ausgewählte Dateien entfernen</translation>
+ </message>
+ <message>
+ <source>Select Files to Unload from Photo Card:</source>
+ <translation>Zu entladende Dateien:</translation>
+ </message>
+ <message>
+ <source>Select All</source>
+ <translation>Alle auswählen</translation>
+ </message>
+ <message>
+ <source>Select None</source>
+ <translation>Auswahl aufheben</translation>
+ </message>
+ <message>
+ <source>Show Thumbnails</source>
+ <translation>Miniaturansichten anzeigen</translation>
+ </message>
+</context>
+<context>
+ <name>WaitForm_base</name>
+ <message>
+ <source>HP Device Manager - Waiting</source>
+ <translation>HP Geräte-Manager – Warten</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Waiting for procedure to finish...&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Warten auf Abschluss des Vorgangs...&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Abbrechen</translation>
+ </message>
+</context>
+<context>
+ <name>self.form.FailureUI</name>
+ <message>
+ <source>&lt;b&gt;Unable to mount photo card on device.&lt;/b&gt;&lt;p&gt;Check that device is powered on and photo card is correctly inserted.</source>
+<translation>&lt;b&gt;Die Fotokarte kann nicht im Gerät aktiviert werden.&lt;/b&gt;&lt;p&gt;Überprüfen Sie, ob das Gerät eingeschaltet und die Fotokarte korrekt eingesetzt ist.</translation>
+ </message>
+</context>
+</TS>
diff --git a/data/localization/hplip_es.qm b/data/localization/hplip_es.qm
new file mode 100644
index 0000000..eb1769f
--- /dev/null
+++ b/data/localization/hplip_es.qm
Binary files differ
diff --git a/data/localization/hplip_es.ts b/data/localization/hplip_es.ts
new file mode 100755
index 0000000..4669839
--- /dev/null
+++ b/data/localization/hplip_es.ts
@@ -0,0 +1,5048 @@
+<!DOCTYPE TS><TS>
+<context>
+ <name>@default</name>
+ <message>
+ <source>&lt;b&gt;Unable to mount photo card on device.&lt;/b&gt;&lt;p&gt;Check that device is powered on and photo card is correctly inserted.</source>
+<translation>&lt;b&gt;No se pudo montar la tarjeta fotográfica en el dispositivo.&lt;/b&gt;&lt;p&gt;Verifique que el dispositivo está encendido y que la tarjeta fotográfica está insertada correctamente.</translation>
+ </message>
+</context>
+<context>
+ <name>AboutDlg_base</name>
+ <message>
+ <source>HP Device Manager - About</source>
+ <translation>Administrador de dispositivos HP: Acerca de</translation>
+ </message>
+ <message>
+ <source>&lt;font size=&quot;+3&quot;&gt;&lt;p align=&quot;center&quot;&gt;HP Linux Imaging and Printing (HPLIP)&lt;/p&gt;&lt;/font&gt;</source>
+ <translation>&lt;font size=&quot;+3&quot;&gt;&lt;p align=&quot;center&quot;&gt;Impresión e imágenes Linux de HP (HPLIP)&lt;/p&gt;&lt;/font&gt;</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Cerrar</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;HPLIP Software Version:&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Versión de software de HPLIP:&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>0.0.0</source>
+ <translation>0.0.0</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Device Manager Software Version:&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Versión de software de Administrador de dispositivos:&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Authors and Contributors:&lt;/b&gt;\nDavid Suffield, Don Welch, Shiyun Yie, Raghothama Cauligi, John Oleinik, Cory Meisch, Foster Nuffer, Pete Parks, Jacqueline Pitter, David Paschal,\nSteve DeRoos, Mark Overton, Aaron Albright, Smith Kennedy, John Hosszu, Chris Wiesner, Henrique M. Holschuh, Till Kamppeter, Linus Araque, Mark Crawford, Charlie Moore</source>
+ <translation>&lt;b&gt;Autores y colaboradores:&lt;/b&gt;
+David Suffield, Don Welch, Shiyun Yie, Raghothama Cauligi, John Oleinik, Cory Meisch, Foster Nuffer, Pete Parks, Jacqueline Pitter, David Paschal,
+Steve DeRoos, Mark Overton, Aaron Albright, Smith Kennedy, John Hosszu, Chris Wiesner, Henrique M. Holschuh, Till Kamppeter, Linus Araque, Mark Crawford, Charlie Moore</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;License and Copyright:&lt;/b&gt;
+(c) Copyright 2006 Hewlett-Packard Development Company, L.P. This software is licensed under the GNU General Public License (GPL), BSD, and MIT licenses. See the software sources for details.</source>
+ <translation>&lt;b&gt;Licencia y Propiedad intelectual:&lt;/b&gt;
+(c) Copyright 2006 Hewlett-Packard Development Company, L.P. Se autoriza el uso de este software con licencias GNU GPL (General Public License), BSD y MIT. Consulte los códigos fuente del software para obtener más detalles.</translation>
+ </message>
+</context>
+<context>
+ <name>Align10Form_Base</name>
+ <message>
+ <source>HP Device Manager - Alignment</source>
+ <translation>Administrador de dispositivos HP: Alineación</translation>
+ </message>
+ <message>
+ <source>Examine the page that was printed. Several rows of boxes, each made up of thin lines, appear on the printed page.&lt;p&gt;
+For each row, select the label representing the box in which the shorter inner lines are the most aligned with the longer outer lines..</source>
+ <translation>Examine la página impresa. En ella aparecen varias filas de cuadros, cada uno compuesto de líneas finas.&lt;p&gt;
+En cada fila, seleccione la etiqueta que representa el cuadro en el que las líneas interiores más cortas son las que están más alineadas con las líneas exteriores más largas.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;B:&lt;/font&gt;&lt;/b&gt;</source>
+ <translation>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;B:&lt;/font&gt;&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;F:&lt;/font&gt;&lt;/b&gt;</source>
+ <translation>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;F:&lt;/font&gt;&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;C:&lt;/font&gt;&lt;/b&gt;</source>
+ <translation>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;C:&lt;/font&gt;&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;D:&lt;/font&gt;&lt;/b&gt;</source>
+ <translation>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;D:&lt;/font&gt;&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;G:&lt;/font&gt;&lt;/b&gt;</source>
+ <translation>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;G:&lt;/font&gt;&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;A:&lt;/font&gt;&lt;/b&gt;</source>
+ <translation>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;A:&lt;/font&gt;&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;E:&lt;/font&gt;&lt;/b&gt;</source>
+ <translation>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;E:&lt;/font&gt;&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;H:&lt;/font&gt;&lt;/b&gt;</source>
+ <translation>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;H:&lt;/font&gt;&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Next &gt;</source>
+ <translation>Siguiente &gt;</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Cancelar</translation>
+ </message>
+</context>
+<context>
+ <name>AlignForm</name>
+ <message>
+ <source>HP Device Manager - Alignment</source>
+ <translation>Administrador de dispositivos HP: Alineación</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Cancelar</translation>
+ </message>
+ <message>
+ <source>Next &gt;</source>
+ <translation>Siguiente &gt;</translation>
+ </message>
+ <message>
+ <source>Choose the set of lines where the line segments are &lt;b&gt;best&lt;/b&gt; aligned.</source>
+ <translation>Seleccione el grupo de líneas en las que los segmentos de línea están &lt;b&gt;mejor&lt;/b&gt; alineados.</translation>
+ </message>
+</context>
+<context>
+ <name>AlignType6Form1_base</name>
+ <message>
+ <source>HP Device Manager - Alignment</source>
+ <translation>Administrador de dispositivos HP: Alineación</translation>
+ </message>
+ <message>
+ <source>To perform alignment, you will need the &lt;b&gt;alignment page&lt;/b&gt; that is automatically printed after you install a print cartridge.
+&lt;p&gt; If you do &lt;b&gt;not&lt;/b&gt; have this page, click &lt;i&gt;Print Page&lt;/i&gt;.
+&lt;p&gt;If you already have this page, click &lt;i&gt;Next &gt;&lt;/i&gt;.</source>
+ <translation>Para realizar la alineación, necesitará la &lt;b&gt;página de alineación&lt;/b&gt; que se imprime automáticamente después de instalar un cartucho de impresión.
+&lt;p&gt; Si &lt;b&gt;no&lt;/b&gt; tiene esa página, haga clic en &lt;i&gt;Imprimir página&lt;/i&gt;.
+&lt;p&gt;Si ya tiene la página, haga clic en &lt;i&gt;Siguiente &gt;&lt;/i&gt;.</translation>
+ </message>
+ <message>
+ <source>Next &gt;</source>
+ <translation>Siguiente &gt;</translation>
+ </message>
+ <message>
+ <source>Print Page</source>
+ <translation>Imprimir página</translation>
+ </message>
+</context>
+<context>
+ <name>AlignType6Form2_base</name>
+ <message>
+ <source>HP Device Manager - Alignment</source>
+ <translation>Administrador de dispositivos HP: Alineación</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Follow these steps to complete the alignment:&lt;/b&gt;
+&lt;p&gt;&lt;b&gt;1.&lt;/b&gt; Place the alignment page, with the printed side facing down, on the scanner.
+&lt;p&gt;&lt;b&gt;2.&lt;/b&gt; Press the &lt;i&gt;Enter&lt;/i&gt; or &lt;i&gt;Scan&lt;/i&gt; button on the printer.
+&lt;p&gt;&lt;b&gt;3.&lt;/b&gt; &quot;Alignment Complete&quot; will be displayed when the process is finished (on some models)..</source>
+ <translation>&lt;b&gt;Siga estos pasos para completar la alineación:&lt;/b&gt;
+&lt;p&gt;&lt;b&gt;1.&lt;/b&gt; Coloque la página de alineación, con el lado impreso hacia abajo, en el escáner.
+&lt;p&gt;&lt;b&gt;2.&lt;/b&gt;Presione el botón &lt;i&gt;Entrar&lt;/i&gt; o &lt;i&gt;Escanear&lt;/i&gt; de la impresora;
+&lt;p&gt;&lt;b&gt;3.&lt;/b&gt; Aparecerá &quot;Alineación finalizada&quot; cuando el proceso termine (en algunos modelos).</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+</context>
+<context>
+ <name>AllowableTypesDlg_base</name>
+ <message>
+ <source>MIME Type</source>
+ <translation>Tipo MIME</translation>
+ </message>
+ <message>
+ <source>Description</source>
+ <translation>Descripción</translation>
+ </message>
+ <message>
+ <source>Usual File Extension(s)</source>
+ <translation>Extensiones normales</translation>
+ </message>
+ <message>
+ <source>HP Device Manager - Allowable Types</source>
+ <translation>Administrador de dispositivos HP: Tipos permitidos</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;File/document types that can be added to the file list.&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Tipos de archivo/documento que se pueden agregar a la lista de archivos.&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>&lt;i&gt;Note: To print or fax file/document types that do not appear on this list, print the document from the application that created it through the appropriate CUPS printer.&lt;/i&gt;</source>
+ <translation>&lt;i&gt;Nota: Para imprimir o transmitir por fax tipos de archivo/documento que no aparecen en la lista, imprima el documento desde la aplicación en la que se creó por medio de la impresora CUPS correspondiente.&lt;/i&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>ChooseDeviceDlg</name>
+ <message>
+ <source>Choose Device</source>
+ <translation>Seleccionar dispositivo</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Cancelar</translation>
+ </message>
+ <message>
+ <source>Available Devices:</source>
+ <translation>Dispositivos disponibles:</translation>
+ </message>
+</context>
+<context>
+ <name>ChoosePrinterDlg</name>
+ <message>
+ <source>Choose Device</source>
+ <translation>Seleccionar dispositivo</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Cancelar</translation>
+ </message>
+ <message>
+ <source>Available Devices:</source>
+ <translation>Dispositivos disponibles:</translation>
+ </message>
+ <message>
+ <source>Available Printers:</source>
+ <translation>Impresoras disponibles:</translation>
+ </message>
+ <message>
+ <source>Available Faxes:</source>
+ <translation>Faxes disponibles:</translation>
+ </message>
+</context>
+<context>
+ <name>ChoosePrinterDlg2</name>
+ <message>
+ <source>Choose Printer</source>
+ <translation>Seleccionar impresora</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Cancelar</translation>
+ </message>
+ <message>
+ <source>Printers:</source>
+ <translation>Impresoras:</translation>
+ </message>
+</context>
+<context>
+ <name>CleaningForm2_base</name>
+ <message>
+ <source>HP Device Manager - Cleaning</source>
+ <translation>Administrador de dispositivos HP: Limpieza</translation>
+ </message>
+ <message>
+ <source>Finish</source>
+ <translation>Finalizar</translation>
+ </message>
+ <message>
+ <source>Please wait while the test page is printed. Check this page to see if the problem was fixed. If the test page looks fine click &lt;b&gt;Finish &lt;/b&gt;to quit the cleaning procedure. Otherwise, replace the print cartridges and click &lt;b&gt;Finish&lt;/b&gt;.</source>
+ <translation>Espere mientras se imprime la página de prueba. Verifique esta página para ver si se resolvió el problema. Si la página de prueba se ve bien, haga clic en &lt;/b&gt;Finalizar&lt;/b&gt; para terminar el proceso de limpieza. De lo contrario, reemplace los cartuchos de impresión y haga clic en &lt;/b&gt;Finalizar&lt;/b&gt;.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Cleaning Level 3 Performed&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Limpieza de nivel 3 realizada&lt;/b&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>CleaningForm_base</name>
+ <message>
+ <source>HP Device Manager - Please Wait - Cleaning</source>
+ <translation>Administrador de dispositivos HP: Espere - Limpieza</translation>
+ </message>
+ <message>
+ <source>Finish</source>
+ <translation>Finalizar</translation>
+ </message>
+ <message>
+ <source>Cleaning Level %s</source>
+ <translation>Limpieza de nivel %s</translation>
+ </message>
+ <message>
+ <source>Please wait while the test page is printed. Check this page to see if the problem was fixed. If the test page looks fine click &lt;b&gt;Finish &lt;/b&gt;to quit the cleaning procedure. Otherwise, click &lt;b&gt;Cleaning Level %s&lt;/b&gt; to continue with cleaning.</source>
+ <translation>Espere mientras se imprime la página de prueba. Verifique esta página para ver si se resolvió el problema. Si la página de prueba se ve bien, haga clic en &lt;/b&gt;Finalizar&lt;/b&gt; para terminar el proceso de limpieza. De lo contrario, haga clic en %s&lt;/b&gt;Limpieza de nivel %s&lt;/b&gt; para continuar con el proceso de limpieza.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Please Wait - Cleaning Level %s Being Performed&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Espere: se está realizando la limpieza de nivel %s&lt;/b&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>ColorAdjForm_base</name>
+ <message>
+ <source>HP Device Manager - Color Adjustment</source>
+ <translation>Administrador de dispositivos HP: Ajuste de Color</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Cancelar</translation>
+ </message>
+ <message>
+ <source>Next &gt;</source>
+ <translation>Siguiente &gt;</translation>
+ </message>
+ <message>
+ <source>Choose the numbered colored box that the color &lt;b&gt;best &lt;/b&gt;matches the background color of the bar.</source>
+ <translation>Seleccione el cuadro numerado cuyo color se iguale &lt;b&gt;mejor &lt;/b&gt;con el color de fondo de la barra.</translation>
+ </message>
+ <message>
+ <source>1</source>
+ <translation>1</translation>
+ </message>
+ <message>
+ <source>2</source>
+ <translation>2</translation>
+ </message>
+ <message>
+ <source>3</source>
+ <translation>3</translation>
+ </message>
+ <message>
+ <source>4</source>
+ <translation>4</translation>
+ </message>
+ <message>
+ <source>5</source>
+ <translation>5</translation>
+ </message>
+ <message>
+ <source>6</source>
+ <translation>6</translation>
+ </message>
+ <message>
+ <source>7</source>
+ <translation>7</translation>
+ </message>
+ <message>
+ <source>8</source>
+ <translation>8</translation>
+ </message>
+ <message>
+ <source>9</source>
+ <translation>9</translation>
+ </message>
+ <message>
+ <source>10</source>
+ <translation>10</translation>
+ </message>
+ <message>
+ <source>11</source>
+ <translation>11</translation>
+ </message>
+ <message>
+ <source>12</source>
+ <translation>12</translation>
+ </message>
+ <message>
+ <source>13</source>
+ <translation>13</translation>
+ </message>
+ <message>
+ <source>14</source>
+ <translation>14</translation>
+ </message>
+ <message>
+ <source>15</source>
+ <translation>15</translation>
+ </message>
+ <message>
+ <source>16</source>
+ <translation>16</translation>
+ </message>
+ <message>
+ <source>17</source>
+ <translation>17</translation>
+ </message>
+ <message>
+ <source>18</source>
+ <translation>18</translation>
+ </message>
+ <message>
+ <source>19</source>
+ <translation>19</translation>
+ </message>
+ <message>
+ <source>20</source>
+ <translation>20</translation>
+ </message>
+ <message>
+ <source>21</source>
+ <translation>21</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;&lt;font size=&quot;+1&quot;&gt;Line&lt;/font&gt;&lt;/b&gt;</source>
+ <translation>&lt;b&gt;&lt;font size=&quot;+1&quot;&gt;Línea&lt;/font&gt;&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;&lt;font size=&quot;+1&quot;&gt;X&lt;/font&gt;&lt;/b&gt;</source>
+ <translation>&lt;b&gt;&lt;font size=&quot;+1&quot;&gt;X&lt;/font&gt;&lt;/b&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>ColorCal4Form_base</name>
+ <message>
+ <source>HP Device Manager - Color Calibration</source>
+ <translation>Administrador de dispositivos HP: Color Calibration</translation>
+ </message>
+ <message>
+ <source>Calibrate</source>
+ <translation>Calibrar</translation>
+ </message>
+ <message>
+ <source>1. Hold the calibration page at arm&apos;s length in front of your eyes.
+&lt;p&gt;&lt;p&gt;
+2. Tilt the page away from you. Look at the two large squares, each containing colored patches. For each large square, find the colored path that &lt;b&gt;most closely&lt;/b&gt; matches the background color. Each patch has an associated letter and number.
+&lt;p&gt;&lt;p&gt;
+3. Choose the letter and number for the matching patches for the gray and color plots.
+&lt;p&gt;&lt;p&gt;
+4. Click &lt;i&gt;&quot;Calibrate&quot;.&lt;/i&gt; to continue.
+&lt;p&gt;&lt;p&gt;
+(To reset the printer to known defaults, click &lt;i&gt;&quot;Use Factory Defaults&quot;&lt;/i&gt;)</source>
+ <translation>1. Sostenga la página de calibración alargando el brazo a la altura de los ojos.
+&lt;p&gt;&lt;p&gt;
+2. Incline la página hacia el lado opuesto a usted. Observe los dos cuadrados grandes, cada uno con parches de color. En cada cuadrado grande, encuentre la trayectoria cuyo color se iguale &lt;b&gt;más&lt;/b&gt; con el color de fondo. Cada parche está asociado a una letra y un número.
+&lt;p&gt;&lt;p&gt;
+3. Seleccione la letra y el número de los parches de igualación para los gráficos en gris y en color.
+&lt;p&gt;&lt;p&gt;
+4. Haga clic en &lt;i&gt;&quot;Calibrar&quot;.&lt;/i&gt; para continuar.
+&lt;p&gt;&lt;p&gt;
+(Para restablecer la impresora a valores predeterminados conocidos, haga clic en &lt;i&gt;&quot;Usar predeterminados de fábrica&quot;&lt;/i&gt;)</translation>
+ </message>
+ <message>
+ <source>Gray Plot</source>
+ <translation>Gráfico gris</translation>
+ </message>
+ <message>
+ <source>A</source>
+ <translation>A</translation>
+ </message>
+ <message>
+ <source>B</source>
+ <translation>B</translation>
+ </message>
+ <message>
+ <source>C</source>
+ <translation>C</translation>
+ </message>
+ <message>
+ <source>D</source>
+ <translation>D</translation>
+ </message>
+ <message>
+ <source>E</source>
+ <translation>E</translation>
+ </message>
+ <message>
+ <source>F</source>
+ <translation>F</translation>
+ </message>
+ <message>
+ <source>G</source>
+ <translation>G</translation>
+ </message>
+ <message>
+ <source>H</source>
+ <translation>H</translation>
+ </message>
+ <message>
+ <source>I</source>
+ <translation>I</translation>
+ </message>
+ <message>
+ <source>J</source>
+ <translation>J</translation>
+ </message>
+ <message>
+ <source>K</source>
+ <translation>K</translation>
+ </message>
+ <message>
+ <source>L</source>
+ <translation>L</translation>
+ </message>
+ <message>
+ <source>M</source>
+ <translation>M</translation>
+ </message>
+ <message>
+ <source>N</source>
+ <translation>N</translation>
+ </message>
+ <message>
+ <source>1</source>
+ <translation>1</translation>
+ </message>
+ <message>
+ <source>2</source>
+ <translation>2</translation>
+ </message>
+ <message>
+ <source>3</source>
+ <translation>3</translation>
+ </message>
+ <message>
+ <source>4</source>
+ <translation>4</translation>
+ </message>
+ <message>
+ <source>5</source>
+ <translation>5</translation>
+ </message>
+ <message>
+ <source>6</source>
+ <translation>6</translation>
+ </message>
+ <message>
+ <source>7</source>
+ <translation>7</translation>
+ </message>
+ <message>
+ <source>8</source>
+ <translation>8</translation>
+ </message>
+ <message>
+ <source>9</source>
+ <translation>9</translation>
+ </message>
+ <message>
+ <source>10</source>
+ <translation>10</translation>
+ </message>
+ <message>
+ <source>11</source>
+ <translation>11</translation>
+ </message>
+ <message>
+ <source>12</source>
+ <translation>12</translation>
+ </message>
+ <message>
+ <source>13</source>
+ <translation>13</translation>
+ </message>
+ <message>
+ <source>14</source>
+ <translation>14</translation>
+ </message>
+ <message>
+ <source>Color Plot</source>
+ <translation>Gráfico de color</translation>
+ </message>
+ <message>
+ <source>P</source>
+ <translation>P</translation>
+ </message>
+ <message>
+ <source>Q</source>
+ <translation>Q</translation>
+ </message>
+ <message>
+ <source>R</source>
+ <translation>R</translation>
+ </message>
+ <message>
+ <source>S</source>
+ <translation>S</translation>
+ </message>
+ <message>
+ <source>T</source>
+ <translation>T</translation>
+ </message>
+ <message>
+ <source>U</source>
+ <translation>U</translation>
+ </message>
+ <message>
+ <source>V</source>
+ <translation>V</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Cancelar</translation>
+ </message>
+ <message>
+ <source>Use Factory Defaults</source>
+ <translation>Usar predeterminados de fábrica</translation>
+ </message>
+</context>
+<context>
+ <name>ColorCalForm2_base</name>
+ <message>
+ <source>HP Device Manager - Color Calibration</source>
+ <translation>Administrador de dispositivos HP: Color Calibration</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Cancelar</translation>
+ </message>
+ <message>
+ <source>Next &gt;</source>
+ <translation>Siguiente &gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;A page of color patches is printing. When it is complete, follow these steps:&lt;/b&gt;
+&lt;p&gt;&lt;b&gt;1.&lt;/b&gt; Hold the page approximately 8 inches (~20cm) in front of your eyes.
+&lt;p&gt;&lt;b&gt;2.&lt;/b&gt; Slowly move the page away from you until the numbered patches fade to match the background.
+&lt;p&gt;&lt;b&gt;3.&lt;/b&gt; Select the number (below) between &lt;i&gt;1&lt;/i&gt; and &lt;i&gt;81 &lt;/i&gt;of the numbered patch that &lt;b&gt;best &lt;/b&gt;matches the background:</source>
+ <translation>&lt;b&gt;Se está imprimiendo una página de parches de color. Cuando haya finalizado, siga estos pasos:&lt;/b&gt;
+&lt;p&gt;&lt;b&gt;1.&lt;/b&gt; Sostenga el papel aproximadamente a 20 cm a la altura de los ojos.
+&lt;p&gt;&lt;b&gt;2.&lt;/b&gt; Aleje lentamente la página hasta que el color de los parches numerados se desvanezca y se iguale el color del fondo.
+&lt;p&gt;&lt;b&gt;3.&lt;/b&gt; Seleccione el número (a continuación) entre &lt;i&gt;1&lt;/i&gt; y &lt;i&gt;81 &lt;/i&gt;del parche numerado que &lt;b&gt;más &lt;/b&gt;se iguale con el color de fondo:</translation>
+ </message>
+ <message>
+ <source>Number of best matching patch (1-81):</source>
+ <translation>Número del parche que más se iguala (1-81):</translation>
+ </message>
+</context>
+<context>
+ <name>ColorCalForm_base</name>
+ <message>
+ <source>HP Device Manager - Color Calibration</source>
+ <translation>Administrador de dispositivos HP: Color Calibration</translation>
+ </message>
+ <message>
+ <source>Next &gt;</source>
+ <translation>Siguiente &gt;</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Cancelar</translation>
+ </message>
+ <message>
+ <source>Color Calibration</source>
+ <translation>Color Calibration</translation>
+ </message>
+ <message>
+ <source>1</source>
+ <translation>1</translation>
+ </message>
+ <message>
+ <source>2</source>
+ <translation>2</translation>
+ </message>
+ <message>
+ <source>3</source>
+ <translation>3</translation>
+ </message>
+ <message>
+ <source>4</source>
+ <translation>4</translation>
+ </message>
+ <message>
+ <source>5</source>
+ <translation>5</translation>
+ </message>
+ <message>
+ <source>6</source>
+ <translation>6</translation>
+ </message>
+ <message>
+ <source>7</source>
+ <translation>7</translation>
+ </message>
+ <message>
+ <source>Choose the numbered image labeled &quot;1&quot; thru &quot;7&quot; that is &lt;b&gt;best color matched&lt;/b&gt; to the image labeled &quot;X&quot;.</source>
+ <translation>Seleccione la imagen numerada rotulada de &quot;1&quot; a &quot;7&quot; cuyo &lt;b&gt;color se iguale mejor&lt;/b&gt; con el de la imagen rotulada &quot;X&quot;.</translation>
+ </message>
+</context>
+<context>
+ <name>CoverpageForm_base</name>
+ <message>
+ <source>HP Device Manager - Coverpages</source>
+ <translation>Administrador de dispositivos HP: Portadas</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Cancelar</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>Coverpage Design</source>
+ <translation>Diseño de portada</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Choose coverpage and enter optional message.&lt;b&gt;</source>
+ <translation>&lt;b&gt;Seleccione la portada e introduzca un mensaje opcional.&lt;b&gt;</translation>
+ </message>
+ <message>
+ <source>Regarding:</source>
+ <translation>Con relación a:</translation>
+ </message>
+ <message>
+ <source>Optional Message &lt;i&gt;(Maximum 2048 characters or 32 lines preformatted)&lt;/i&gt;:</source>
+ <translation>Mensaje opcional &lt;i&gt;(máximo 2.048 caracteres o 32 líneas preformateadas)&lt;/i&gt;:</translation>
+ </message>
+ <message>
+ <source>Preformatted (preserve formatting)</source>
+ <translation>Preformateado (conservar formatos)</translation>
+ </message>
+</context>
+<context>
+ <name>DevMgr4</name>
+ <message>
+ <source>Functions</source>
+ <translation>Funciones</translation>
+ </message>
+ <message>
+ <source>Functions &gt; Print</source>
+ <translation>Funciones &gt; Imprimir</translation>
+ </message>
+ <message>
+ <source>Functions &gt; Make Copies</source>
+ <translation>Funciones &gt; Realizar copias</translation>
+ </message>
+ <message>
+ <source>Functions &gt; Fax</source>
+ <translation>Funciones &gt; Fax</translation>
+ </message>
+ <message>
+ <source>Functions &gt; Unload Photo Card</source>
+ <translation>Funciones &gt; Descargar tarjeta fotográfica</translation>
+ </message>
+ <message>
+ <source>Tools</source>
+ <translation>Herramientas</translation>
+ </message>
+ <message>
+ <source>Tools &gt; Device Information</source>
+ <translation>Herramientas &gt; Información del dispositivo</translation>
+ </message>
+ <message>
+ <source>Tools &gt; Printer Information</source>
+ <translation>Herramientas &gt; Información de la impresora</translation>
+ </message>
+ <message>
+ <source>Tools &gt; Print Test Page</source>
+ <translation>Herramientas &gt; Imprimir página de prueba</translation>
+ </message>
+ <message>
+ <source>Printer Name:</source>
+ <translation>Nombre de la impresora:</translation>
+ </message>
+ <message>
+ <source>Print &gt;&gt;</source>
+ <translation>Imprimir &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>Print...</source>
+ <translation>Imprimir...</translation>
+ </message>
+ <message>
+ <source>Scan &gt;&gt;</source>
+ <translation>Escanear &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>Scan...</source>
+ <translation>Escanear...</translation>
+ </message>
+ <message>
+ <source>Access Photo Cards &gt;&gt;</source>
+ <translation>Acceso a tarjetas fotográficas&gt;&gt;</translation>
+ </message>
+ <message>
+ <source>Access Photo Cards...</source>
+ <translation>Acceso a tarjetas fotográficas...</translation>
+ </message>
+ <message>
+ <source>Send Fax &gt;&gt;</source>
+ <translation>Enviar fax &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>Send Fax...</source>
+ <translation>Enviar fax...</translation>
+ </message>
+ <message>
+ <source>Make Copies &gt;&gt;</source>
+ <translation>Realizar copias &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>Make Copies...</source>
+ <translation>Realizar copias...</translation>
+ </message>
+ <message>
+ <source>Device Settings...</source>
+ <translation>Ajustes del dispositivo...</translation>
+ </message>
+ <message>
+ <source>Refresh Device</source>
+ <translation>Actualizar dispositivo</translation>
+ </message>
+ <message>
+ <source>Refresh All</source>
+ <translation>Actualizar todo</translation>
+ </message>
+ <message>
+ <source>HP Device Manager - %1</source>
+ <translation>Administrador de dispositivos HP: %1</translation>
+ </message>
+ <message>
+ <source>Refreshing Device List - HP Device Manager</source>
+ <translation>Actualizando lista de dispositivos: Administrador de dispositivos HP</translation>
+ </message>
+ <message>
+ <source>Refreshing device list...</source>
+ <translation>Actualizando lista de dispositivos...</translation>
+ </message>
+ <message>
+ <source>Press F6 to refresh.</source>
+ <translation>Presione F6 para actualizar.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Photocards on your printer are only available by mounting them as drives using USB mass storage.&lt;/b&gt;&lt;p&gt;Please refer to your distribution&apos;s documentation for setup and usage instructions.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Las tarjetas fotográficas de la impresora sólo están disponibles cuando se montan como unidades con almacenamiento masivo de datos USB.&lt;/b&gt;&lt;p&gt;Consulte la documentación de distribución para obtener instrucciones de configuración y uso.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Unable to run command. No command specified.&lt;/b&gt;&lt;p&gt;Use &lt;pre&gt;Configure...&lt;/pre&gt; to specify a command to run.</source>
+ <translation>&lt;p&gt;&lt;b&gt;No se pudo ejecutar el comando. No se ha especificado ningún comando.&lt;/b&gt;&lt;p&gt;Utilice &lt;pre&gt;Configurar...&lt;/pre&gt; para especificar un comando para que se ejecute.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Unable to find an appropriate su/sudo utility to run hp-setup.&lt;/b&gt;</source>
+ <translation>&lt;b&gt;No se pudo encontrar una utilidad su/sudo adecuada para ejecutar hp-setup.&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Annoying Confirmation: Are you sure you want to remove this device?&lt;/b&gt;</source>
+<translation>&lt;b&gt;Confirmación molesta: ¿Realmente desea eliminar este dispositivo?&lt;/b&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>DevMgr4_base</name>
+ <message>
+ <source>HP Device Manager</source>
+ <translation>Administrador de dispositivos HP</translation>
+ </message>
+ <message>
+ <source>Functions</source>
+ <translation>Funciones</translation>
+ </message>
+ <message>
+ <source>Status</source>
+ <translation>Estado</translation>
+ </message>
+ <message>
+ <source>Supplies</source>
+ <translation>Suministros</translation>
+ </message>
+ <message>
+ <source>Tools</source>
+ <translation>Herramientas</translation>
+ </message>
+ <message>
+ <source>Print Settings</source>
+ <translation>Ajustes de impresión</translation>
+ </message>
+ <message>
+ <source>Print Control</source>
+ <translation>Control de impresión</translation>
+ </message>
+ <message>
+ <source>Contents</source>
+ <translation>Contenido</translation>
+ </message>
+ <message>
+ <source>&amp;Contents...</source>
+ <translation>&amp;Contenido...</translation>
+ </message>
+ <message>
+ <source>Help Contents (F1)</source>
+ <translation>Contenido de la Ayuda (F1)</translation>
+ </message>
+ <message>
+ <source>F1</source>
+ <translation>F1</translation>
+ </message>
+ <message>
+ <source>Index</source>
+ <translation>Ficha</translation>
+ </message>
+ <message>
+ <source>&amp;Index...</source>
+ <translation>F&amp;icha...</translation>
+ </message>
+ <message>
+ <source>&amp;About...</source>
+ <translation>&amp;Acerca de...</translation>
+ </message>
+ <message>
+ <source>About HP Device Manager...</source>
+ <translation>Acerca de Administrador de dispositivos HP...</translation>
+ </message>
+ <message>
+ <source>Refresh Device</source>
+ <translation>Actualizar dispositivo</translation>
+ </message>
+ <message>
+ <source>Refresh Device (F5)</source>
+ <translation>Actualizar dispositivo (F5)</translation>
+ </message>
+ <message>
+ <source>F5</source>
+ <translation>F5</translation>
+ </message>
+ <message>
+ <source>Exit</source>
+ <translation>Salir</translation>
+ </message>
+ <message>
+ <source>Exit HP Device Manager</source>
+ <translation>Salir de Administrador de dispositivos HP</translation>
+ </message>
+ <message>
+ <source>Ctrl+Q</source>
+ <translation>Ctrl+Q</translation>
+ </message>
+ <message>
+ <source>Popup Alerts...</source>
+ <translation>Alertas emergentes...</translation>
+ </message>
+ <message>
+ <source>Popup alerts...</source>
+ <translation>Alertas emergentes...</translation>
+ </message>
+ <message>
+ <source>Configure popup alerts</source>
+ <translation>Configurar alertas emergentes</translation>
+ </message>
+ <message>
+ <source>Email alerts...</source>
+ <translation>Alertas de correo electrónico...</translation>
+ </message>
+ <message>
+ <source>Configure email alerts</source>
+ <translation>Configurar alertas de correo electrónico</translation>
+ </message>
+ <message>
+ <source>Settings...</source>
+ <translation>Ajustes...</translation>
+ </message>
+ <message>
+ <source>F2</source>
+ <translation>F2</translation>
+ </message>
+ <message>
+ <source>Refresh All</source>
+ <translation>Actualizar todo</translation>
+ </message>
+ <message>
+ <source>F6</source>
+ <translation>F6</translation>
+ </message>
+ <message>
+ <source>Auto Refresh</source>
+ <translation>Actualización automática</translation>
+ </message>
+ <message>
+ <source>Turn on/off Auto Refresh (Ctrl+A)</source>
+ <translation>Activar/desactivar Actualización automática (Ctrl+A)</translation>
+ </message>
+ <message>
+ <source>Ctrl+A</source>
+ <translation>Ctrl+A</translation>
+ </message>
+ <message>
+ <source>Action</source>
+ <translation>Acción</translation>
+ </message>
+ <message>
+ <source>Device Settings (F3)</source>
+ <translation>Ajustes del dispositivo (F3)</translation>
+ </message>
+ <message>
+ <source>F3</source>
+ <translation>F3</translation>
+ </message>
+ <message>
+ <source>Support...</source>
+ <translation>Soporte...</translation>
+ </message>
+ <message>
+ <source>Setup New Device...</source>
+ <translation>Configurar nuevo dispositivo...</translation>
+ </message>
+ <message>
+ <source>Ins</source>
+ <translation>Ins</translation>
+ </message>
+ <message>
+ <source>Remove Device...</source>
+ <translation>Eliminar dispositivo...</translation>
+ </message>
+ <message>
+ <source>Del</source>
+ <translation>Supr</translation>
+ </message>
+ <message>
+ <source>Device</source>
+ <translation>Dispositivo</translation>
+ </message>
+ <message>
+ <source>Configure</source>
+ <translation>Configurar</translation>
+ </message>
+ <message>
+ <source>&amp;Help</source>
+ <translation>Ay&amp;uda</translation>
+ </message>
+</context>
+<context>
+ <name>FaxAddrBookEditForm</name>
+ <message>
+ <source>New Fax Group</source>
+ <translation type="obsolete">Nuevo grupo de fax</translation>
+ </message>
+ <message>
+ <source>New Group Name:</source>
+ <translation type="obsolete">Nombre del nuevo grupo:</translation>
+ </message>
+</context>
+<context>
+ <name>FaxAddrBookEditForm_base</name>
+ <message>
+ <source>Group Name</source>
+ <translation>Nombre de grupo</translation>
+ </message>
+ <message>
+ <source>HP Device Manager - Fax Address Book Entry</source>
+ <translation>Administrador de dispositivos HP: Entrada de la agenda de fax</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Cancelar</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>First Name:</source>
+ <translation>Nombre:</translation>
+ </message>
+ <message>
+ <source>New Group...</source>
+ <translation type="obsolete">Nuevo grupo...</translation>
+ </message>
+ <message>
+ <source>Member of Group(s):</source>
+ <translation>Miembro de grupo o grupos:</translation>
+ </message>
+ <message>
+ <source>Last Name:</source>
+ <translation>Apellido:</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Fax Number:&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Número de fax:&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Notes/Other Information:</source>
+ <translation>Notas/Otra información:</translation>
+ </message>
+ <message>
+ <source>Title:</source>
+ <translation>Título:</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Nickname:&lt;/b&gt;</source>
+ <translation type="obsolete">&lt;b&gt;Sobrenombre:&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Note: Items in &lt;b&gt;bold&lt;/b&gt; are required fields.</source>
+ <translation>Nota: Los elementos en &lt;b&gt;negrita&lt;/b&gt; son campos obligatorios.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Name/Nickname:&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Nombre/sobrenombre:&lt;/b&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>FaxAddrBookForm</name>
+ <message>
+ <source>New...</source>
+ <translation>Nuevo...</translation>
+ </message>
+ <message>
+ <source>Edit...</source>
+ <translation>Editar...</translation>
+ </message>
+ <message>
+ <source>Delete...</source>
+ <translation>Eliminar...</translation>
+ </message>
+ <message>
+ <source>Refresh List</source>
+ <translation>Actualizar lista</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Annoying Confirmation: Are you sure you want to delete this address book entry?&lt;/b&gt;</source>
+<translation>&lt;b&gt;Confirmación molesta: ¿Realmente desea eliminar esta entrada de la agenda?&lt;/b&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>FaxAddrBookForm_base</name>
+ <message>
+ <source>Nickname</source>
+ <translation>Sobrenombre</translation>
+ </message>
+ <message>
+ <source>Title</source>
+ <translation>Título</translation>
+ </message>
+ <message>
+ <source>First Name</source>
+ <translation>Nombre</translation>
+ </message>
+ <message>
+ <source>Last Name</source>
+ <translation>Apellido</translation>
+ </message>
+ <message>
+ <source>Fax Number</source>
+ <translation>Número de fax</translation>
+ </message>
+ <message>
+ <source>Member of Group(s)</source>
+ <translation>Miembro de grupo o grupos</translation>
+ </message>
+ <message>
+ <source>Notes/Other Information</source>
+ <translation>Notas/Otra información</translation>
+ </message>
+ <message>
+ <source>HP Device Manager - Fax Address Book</source>
+ <translation>Administrador de dispositivos HP: Agenda de fax</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>New...</source>
+ <translation>Nuevo...</translation>
+ </message>
+ <message>
+ <source>Edit...</source>
+ <translation>Editar...</translation>
+ </message>
+ <message>
+ <source>Delete...</source>
+ <translation>Eliminar...</translation>
+ </message>
+ <message>
+ <source>Groups...</source>
+ <translation>Grupos...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Fax Addresses:&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Direcciones de fax:&lt;/b&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>FaxAddrBookGroupEditForm_base</name>
+ <message>
+ <source>Group Members</source>
+ <translation>Miembros del grupo</translation>
+ </message>
+ <message>
+ <source>HP Device Manager - Fax Address Book Group</source>
+ <translation>Administrador de dispositivos HP: Grupo de la agenda de fax</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Group Name:&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Nombre de grupo:&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Member Address Book Entries:&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Entradas de la agenda del miembro:&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Cancelar</translation>
+ </message>
+</context>
+<context>
+ <name>FaxAddrBookGroupsForm</name>
+ <message>
+ <source>New...</source>
+ <translation>Nuevo...</translation>
+ </message>
+ <message>
+ <source>Edit...</source>
+ <translation>Editar...</translation>
+ </message>
+ <message>
+ <source>Delete...</source>
+ <translation>Eliminar...</translation>
+ </message>
+ <message>
+ <source>Refresh List</source>
+ <translation>Actualizar lista</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Annoying Confirmation: Are you sure you want to delete this group?&lt;/b&gt;</source>
+<translation>&lt;b&gt;Confirmación molesta: ¿Realmente desea eliminar este grupo?&lt;/b&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>FaxAddrBookGroupsForm_base</name>
+ <message>
+ <source>Group Name</source>
+ <translation>Nombre de grupo</translation>
+ </message>
+ <message>
+ <source>Group Members</source>
+ <translation>Miembros del grupo</translation>
+ </message>
+ <message>
+ <source>HP Device Manager - Fax Address Book Groups</source>
+ <translation>Administrador de dispositivos HP: Grupos de la agenda de fax</translation>
+ </message>
+ <message>
+ <source>New...</source>
+ <translation>Nuevo...</translation>
+ </message>
+ <message>
+ <source>Delete...</source>
+ <translation>Eliminar...</translation>
+ </message>
+ <message>
+ <source>Edit...</source>
+ <translation>Editar...</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Groups:&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Grupos:&lt;/b&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>FaxSendJobForm</name>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;You may not specify both a printer (-p) and a device (-d).</source>
+ <translation>&lt;p&gt;&lt;b&gt;Es posible que no pueda especificar una impresora (-p) y un dispositivo (-d).</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Unknown printer name: %1&lt;/b&gt;&lt;p&gt;Please check the printer name and try again.</source>
+ <translation>&lt;b&gt;Nombre de impresora desconocido: %1&lt;/b&gt;&lt;p&gt;Compruebe el nombre de la impresora e inténtelo de nuevo.</translation>
+ </message>
+ <message>
+ <source>You must specify a printer that has a device URI in the form &apos;hpfax:/...&apos;</source>
+ <translation>Debe especificar una impresora que cuente con un URI de dispositivo con el formato &apos;hpfax:/...&apos;</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;No devices found.&lt;/b&gt;&lt;p&gt;Please make sure your device is properly installed and try again.</source>
+ <translation>&lt;p&gt;&lt;b&gt;No se encontraron dispositivos.&lt;/b&gt;&lt;p&gt;Asegúrese de que el dispositivo está instalado correctamente e inténtelo de nuevo.</translation>
+ </message>
+ <message>
+ <source>HP Device Manager - Send Fax</source>
+ <translation>Administrador de dispositivos HP: Enviar fax</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Fax send completed successfully.&lt;/b&gt;</source>
+ <translation>&lt;p&gt;&lt;b&gt;El envío de fax se ha completado satisfactoriamente.&lt;/b&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>FaxSettingsForm_base</name>
+ <message>
+ <source>HP Device Manager - Fax Settings</source>
+ <translation>Administrador de dispositivos HP: Ajustes de fax</translation>
+ </message>
+ <message>
+ <source>Fax Header Information</source>
+ <translation>Información de cabecera de fax</translation>
+ </message>
+ <message>
+ <source>Device Fax Number:</source>
+ <translation>Número de fax del dispositivo:</translation>
+ </message>
+ <message>
+ <source>Name and/or Company:</source>
+ <translation>Nombre y/o empresa:</translation>
+ </message>
+ <message>
+ <source>&lt;i&gt;This information will appear at the top of each fax that you send.&lt;/i&gt;</source>
+ <translation>&lt;i&gt;Esta información aparecerá en la parte superior de cada fax que se envíe.&lt;/i&gt;</translation>
+ </message>
+ <message>
+ <source>Coverpage Information</source>
+ <translation>Información de portada</translation>
+ </message>
+ <message>
+ <source>Voice phone number:</source>
+ <translation>Número de teléfono de voz:</translation>
+ </message>
+ <message>
+ <source>Email address:</source>
+ <translation>Dirección de correo electrónico:</translation>
+ </message>
+ <message>
+ <source>&lt;i&gt;This information will appear on any coverpage that you send.&lt;/i&gt;</source>
+ <translation>&lt;i&gt;Esta información aparecerá en cualquier portada que se envíe.&lt;/i&gt;</translation>
+ </message>
+ <message>
+ <source>Information</source>
+ <translation>Información</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Configure device settings for sending faxes.&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Configure los ajustes del dispositivo para enviar faxes.&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Cancelar</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+</context>
+<context>
+ <name>ImagePropertiesDlg_base</name>
+ <message>
+ <source>EXIF Labels</source>
+ <translation>Etiquetas EXIF</translation>
+ </message>
+ <message>
+ <source>Contents </source>
+ <translation>Contenido</translation>
+ </message>
+ <message>
+ <source>Properties for</source>
+ <translation>Propiedades de</translation>
+ </message>
+ <message>
+ <source>MIME Type:</source>
+ <translation>Tipo MIME:</translation>
+ </message>
+ <message>
+ <source>Size:</source>
+ <translation>Tamaño:</translation>
+ </message>
+ <message>
+ <source>Location:</source>
+ <translation>Ubicación:</translation>
+ </message>
+ <message>
+ <source>LOCATION</source>
+ <translation>UBICACIÓN</translation>
+ </message>
+ <message>
+ <source>MIME TYPE</source>
+ <translation>TIPO MIME</translation>
+ </message>
+ <message>
+ <source>SIZE</source>
+ <translation>TAMAÑO</translation>
+ </message>
+ <message>
+ <source>FILENAME</source>
+ <translation>NOMBRE DE ARCHIVO</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+</context>
+<context>
+ <name>LoadPaperForm_base</name>
+ <message>
+ <source>HP Device Manager - Load Plain Paper</source>
+ <translation>Administrador de dispositivos HP: Cargar papel normal</translation>
+ </message>
+ <message>
+ <source>Continue</source>
+ <translation>Continuar</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Cancelar</translation>
+ </message>
+ <message>
+ <source>A page will be printed. Please load &lt;b&gt;plain paper&lt;/b&gt; in the printer and then press continue.</source>
+ <translation>Se imprimirá una página. Cargue &lt;b&gt;papel normal&lt;/b&gt; en la impresora y presione Continuar.</translation>
+ </message>
+</context>
+<context>
+ <name>MakeCopiesForm</name>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;You may not specify both a printer (-p) and a device (-d).</source>
+ <translation>&lt;p&gt;&lt;b&gt;Es posible que no pueda especificar una impresora (-p) y un dispositivo (-d).</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;No devices found.&lt;/b&gt;&lt;p&gt;Please make sure your device is properly installed and try again.</source>
+ <translation>&lt;p&gt;&lt;b&gt;No se encontraron dispositivos.&lt;/b&gt;&lt;p&gt;Asegúrese de que el dispositivo está instalado correctamente e inténtelo de nuevo.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Sorry, make copies functionality is not implemented for this device.&lt;/b&gt;</source>
+ <translation>&lt;b&gt;La funcionalidad de realización de copias no está implementada en este dispositivo.&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>HP Device Manager - Make Copies</source>
+ <translation>Administrador de dispositivos HP: Realizar copias</translation>
+ </message>
+</context>
+<context>
+ <name>MakeCopiesForm_base</name>
+ <message>
+ <source>HP Device Manager - Make Copies</source>
+ <translation>Administrador de dispositivos HP: Realizar copias</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Cerrar</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Make copies.&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Cree copias.&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Make Copies</source>
+ <translation>Realizar copias</translation>
+ </message>
+ <message>
+ <source>Quality:</source>
+ <translation>Calidad:</translation>
+ </message>
+ <message>
+ <source>Fast</source>
+ <translation>Rápida</translation>
+ </message>
+ <message>
+ <source>Draft</source>
+ <translation>Borrador</translation>
+ </message>
+ <message>
+ <source>Normal</source>
+ <translation>Normal</translation>
+ </message>
+ <message>
+ <source>Presentation</source>
+ <translation>Presentación</translation>
+ </message>
+ <message>
+ <source>Best</source>
+ <translation>Óptima</translation>
+ </message>
+ <message>
+ <source>Number of Copies:</source>
+ <translation>Número de copias:</translation>
+ </message>
+ <message>
+ <source>Contrast:</source>
+ <translation>Contraste:</translation>
+ </message>
+ <message>
+ <source>+0</source>
+ <translation>+0</translation>
+ </message>
+ <message>
+ <source>Enlargement/Reduction:</source>
+ <translation>Ampliación/Reducción:</translation>
+ </message>
+ <message>
+ <source>400%</source>
+ <translation>400%</translation>
+ </message>
+ <message>
+ <source>Fit to page</source>
+ <translation>Ajustar a la página</translation>
+ </message>
+ <message>
+ <source>Copy</source>
+ <translation>Copiar</translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation>Nombre:</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Device information/status and output queue name.&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Información/estado del dispositivo y nombre de la cola de salida.&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Status:</source>
+ <translation>Estado:</translation>
+ </message>
+ <message>
+ <source>Refresh status</source>
+ <translation>Actualizar estado</translation>
+ </message>
+ <message>
+ <source>Comment:</source>
+ <translation>Comentario:</translation>
+ </message>
+ <message>
+ <source>Location:</source>
+ <translation>Ubicación:</translation>
+ </message>
+ <message>
+ <source>Device URI:</source>
+ <translation>URI del dispositivo:</translation>
+ </message>
+ <message>
+ <source>Device</source>
+ <translation>Dispositivo</translation>
+ </message>
+</context>
+<context>
+ <name>NoDevicesForm</name>
+ <message>
+ <source>&lt;b&gt;Unable to find an appropriate su/sudo utility to run hp-setup.&lt;/b&gt;</source>
+ <translation>&lt;b&gt;No se pudo encontrar una utilidad su/sudo adecuada para ejecutar hp-setup.&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;An I/O error occurred.&lt;/b&gt;&lt;p&gt;Please re-start the Device Manager and try again.</source>
+<translation>&lt;b&gt;Ha ocurrido un error de E/S.&lt;/b&gt;&lt;p&gt;Vuelva a ejecutar el administrador de dispositivos e inténtelo de nuevo.</translation>
+ </message>
+</context>
+<context>
+ <name>NoDevicesForm_base</name>
+ <message>
+ <source>HP Device Manager - No Installed HP Devices Found</source>
+ <translation>Administrador de dispositivos HP: No se encontraron dispositivos HP instalados</translation>
+ </message>
+ <message>
+ <source>Setup Device...</source>
+ <translation>Configurar dispositivo...</translation>
+ </message>
+ <message>
+ <source>CUPS Web Interface</source>
+ <translation>Interfaz Web CUPS</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Cerrar</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;&lt;font size=&quot;+2&quot;&gt;No Installed HP Devices Found.&lt;/font&gt;&lt;/b&gt;&lt;p&gt;To install a device, use one of the following methods:&lt;p&gt;
+1.Run &lt;b&gt;hp-setup&lt;/b&gt; (in a shell/terminal or click &lt;tt&gt;Setup Device...&lt;/tt&gt; below).&lt;p&gt;
+2. &lt;b&gt;CUPS web interface&lt;/b&gt; (open a browser to: &lt;u&gt;http://localhost:631&lt;/u&gt; or press the button below),&lt;p&gt;
+3. The &lt;b&gt;printer installation utility&lt;/b&gt; that came with your operating system (YaST, PrinterDrake, etc).
+&lt;p&gt;&lt;p&gt;After setting up a printer, you may have to press &lt;tt&gt;F6&lt;/tt&gt; or chose &lt;tt&gt;Device | Refresh All&lt;/tt&gt; for the printer to appear in the HP Device Manager.&lt;p&gt;
+&lt;i&gt;&lt;b&gt;Note: Only devices installed with the &lt;tt&gt;hp:&lt;/tt&gt; CUPS backend will appear in the HP Device Manager.&lt;/b&gt;&lt;/i&gt;&lt;p&gt;</source>
+ <translation>&lt;b&gt;&lt;font size=&quot;+2&quot;&gt;No se encontraron dispositivos HP instalados.&lt;/font&gt;&lt;/b&gt;&lt;p&gt;Para instalar un dispositivo, utilice uno de los siguientes métodos:&lt;p&gt;
+1.Ejecute &lt;b&gt;hp-setup&lt;/b&gt; (en un shell/terminal o haga clic en &lt;tt&gt;Configurar dispositivo...&lt;/tt&gt; a continuación).&lt;p&gt;
+2. &lt;b&gt;Interfaz Web CUPS&lt;/b&gt; (abra un navegador en: &lt;u&gt;http://localhost:631&lt;/u&gt; o presione el botón siguiente),&lt;p&gt;
+3. La &lt;b&gt;utilidad de instalación de impresoras&lt;/b&gt; incluida en el sistema operativo (YaST, PrinterDrake, etc).
+&lt;p&gt;&lt;p&gt;Una vez configurada la impresora, puede presionar &lt;tt&gt;F6&lt;/tt&gt; o seleccionar &lt;tt&gt;Dispositivo | Actualizar todo&lt;/tt&gt; para que aparezca la impresora en el Administrador de dispositivos HP.&lt;p&gt;
+&lt;i&gt;&lt;b&gt;Nota: Sólo los dispositivos instalados con &lt;tt&gt;hp:&lt;/tt&gt; CUPS backend aparecerán en el Administrador de dispositivos HP.&lt;/b&gt;&lt;/i&gt;&lt;p&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>PaperEdgeAlignForm_base</name>
+ <message>
+ <source>HP Device Manager - Paper Edge Alignment</source>
+ <translation>Administrador de dispositivos HP: Alineación del borde del papel</translation>
+ </message>
+ <message>
+ <source>Next &gt;</source>
+ <translation>Siguiente &gt;</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Cancelar</translation>
+ </message>
+ <message>
+ <source>Paper Edge</source>
+ <translation>Borde del papel</translation>
+ </message>
+ <message>
+ <source>1</source>
+ <translation>1</translation>
+ </message>
+ <message>
+ <source>2</source>
+ <translation>2</translation>
+ </message>
+ <message>
+ <source>3</source>
+ <translation>3</translation>
+ </message>
+ <message>
+ <source>4</source>
+ <translation>4</translation>
+ </message>
+ <message>
+ <source>5</source>
+ <translation>5</translation>
+ </message>
+ <message>
+ <source>6</source>
+ <translation>6</translation>
+ </message>
+ <message>
+ <source>7</source>
+ <translation>7</translation>
+ </message>
+ <message>
+ <source>8</source>
+ <translation>8</translation>
+ </message>
+ <message>
+ <source>9</source>
+ <translation>9</translation>
+ </message>
+ <message>
+ <source>10</source>
+ <translation>10</translation>
+ </message>
+ <message>
+ <source>11</source>
+ <translation>11</translation>
+ </message>
+ <message>
+ <source>12</source>
+ <translation>12</translation>
+ </message>
+ <message>
+ <source>13</source>
+ <translation>13</translation>
+ </message>
+ <message>
+ <source>Choose the &lt;b&gt;numbered arrow&lt;/b&gt; that &lt;b&gt;best &lt;/b&gt;marks the edge of the paper.</source>
+ <translation>Seleccione la &lt;b&gt;flecha numerada&lt;/b&gt; que indique &lt;b&gt;mejor &lt;/b&gt;el borde del papel.</translation>
+ </message>
+</context>
+<context>
+ <name>PasswordDialog</name>
+ <message>
+ <source>HP Device Manager - Enter Password</source>
+ <translation>Administrador de dispositivos HP: Introducir contraseña</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+</context>
+<context>
+ <name>PowerSettingsDialog</name>
+ <message>
+ <source>15 minutes</source>
+ <translation>15 minutos</translation>
+ </message>
+ <message>
+ <source>30 minutes</source>
+ <translation>30 minutos</translation>
+ </message>
+ <message>
+ <source>45 minutes</source>
+ <translation>45 minutos</translation>
+ </message>
+ <message>
+ <source>1 hour</source>
+ <translation>1 hora</translation>
+ </message>
+ <message>
+ <source>2 hours</source>
+ <translation>2 horas</translation>
+ </message>
+ <message>
+ <source>3 hours</source>
+ <translation>3 horas</translation>
+ </message>
+</context>
+<context>
+ <name>PowerSettingsDialog_base</name>
+ <message>
+ <source>HP Device Manager - Battery Mode Power Settings</source>
+ <translation>Administrador de dispositivos HP; Ajustes de energía en modo batería</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Configure the power off settings when operating on battery power&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Configurar los ajustes de apagado cuando se opera con energía de batería&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Cancelar</translation>
+ </message>
+ <message>
+ <source>Power Settings</source>
+ <translation>Ajustes de energía</translation>
+ </message>
+ <message>
+ <source>Automatically turn off printer after:</source>
+ <translation>Apagar automáticamente la impresora después de:</translation>
+ </message>
+ <message>
+ <source>Always leave printer on</source>
+ <translation>Dejar siempre encendida la impresora</translation>
+ </message>
+</context>
+<context>
+ <name>PrinterForm</name>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;You may not specify both a printer (-p) and a device (-d).</source>
+ <translation>&lt;p&gt;&lt;b&gt;Es posible que no pueda especificar una impresora (-p) y un dispositivo (-d).</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;No devices found.&lt;/b&gt;&lt;p&gt;Please make sure your device is properly installed and try again.</source>
+ <translation>&lt;p&gt;&lt;b&gt;No se encontraron dispositivos.&lt;/b&gt;&lt;p&gt;Asegúrese de que el dispositivo está instalado correctamente e inténtelo de nuevo.</translation>
+ </message>
+ <message>
+ <source>HP Device Manager - Print</source>
+ <translation>Administrador de dispositivos HP: Imprimir</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollCopyView</name>
+ <message>
+ <source>Number of Copies</source>
+<translation>Número de copias</translation>
+ </message>
+ <message>
+ <source>Enlargement, Reduction and Fit to Page</source>
+<translation>Ampliación, reducción y ajuste a la página</translation>
+ </message>
+ <message>
+ <source>Copy Contrast</source>
+<translation>Contraste de copia</translation>
+ </message>
+ <message>
+ <source>Copy Quality</source>
+<translation>Calidad de copia</translation>
+ </message>
+ <message>
+ <source>&lt;&lt; Functions</source>
+<translation>&lt;&lt; Functions</translation>
+ </message>
+ <message>
+ <source>Close</source>
+<translation>Close</translation>
+ </message>
+ <message>
+ <source>Make Copies(s)</source>
+<translation>Make Copies(s)</translation>
+ </message>
+ <message>
+ <source>Number of copies:</source>
+<translation>Number of copies:</translation>
+ </message>
+ <message>
+ <source>Default</source>
+<translation>Default</translation>
+ </message>
+ <message>
+ <source>Quality:</source>
+<translation>Quality:</translation>
+ </message>
+ <message>
+ <source>Fast</source>
+<translation>Fast</translation>
+ </message>
+ <message>
+ <source>Draft</source>
+<translation>Draft</translation>
+ </message>
+ <message>
+ <source>Normal</source>
+<translation>Normal</translation>
+ </message>
+ <message>
+ <source>Presentation</source>
+<translation>Presentation</translation>
+ </message>
+ <message>
+ <source>Best</source>
+<translation>Best</translation>
+ </message>
+ <message>
+ <source>Enlargement or reduction (percent):</source>
+<translation>Enlargement or reduction (percent):</translation>
+ </message>
+ <message>
+ <source>Fit to Page</source>
+<translation>Ampliación, reducción y ajuste a la página</translation>
+ </message>
+ <message>
+ <source>Contrast (-5 lighter to +5 darker):</source>
+<translation>Contrast (-5 lighter to +5 darker):</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Copier error.&lt;/b&gt;&lt;p&gt;</source>
+<translation>&lt;b&gt;Error de la copiadora.&lt;/b&gt;&lt;p&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Cannot copy: Device is busy or not available.&lt;/b&gt;&lt;p&gt;Please check device and try again. [1]</source>
+<translation>&lt;b&gt;No se puede copiar: El dispositivo está ocupado o no está disponible.&lt;/b&gt;&lt;p&gt;Compruebe el dispositivo e inténtelo de nuevo. [1]</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollDeviceInfoView</name>
+ <message>
+ <source>&lt;&lt; Tools</source>
+ <translation>&lt;&lt; Herramientas</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Cerrar</translation>
+ </message>
+ <message>
+ <source>Device Information</source>
+ <translation>Información del dispositivo</translation>
+ </message>
+ <message>
+ <source>Static/Dynamic</source>
+ <translation>Estático/Dinámico</translation>
+ </message>
+ <message>
+ <source>Key</source>
+ <translation>Clave</translation>
+ </message>
+ <message>
+ <source>Value</source>
+ <translation>Valor</translation>
+ </message>
+ <message>
+ <source>Static</source>
+ <translation>Estático</translation>
+ </message>
+ <message>
+ <source>Dynamic</source>
+ <translation>Dinámico</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollFaxView</name>
+ <message>
+ <source>PDF Document</source>
+ <translation>Documento PDF</translation>
+ </message>
+ <message>
+ <source>Postscript Document</source>
+ <translation>Documento Postscript</translation>
+ </message>
+ <message>
+ <source>HP Graphics Language File</source>
+ <translation>Archivo de idioma de gráficos HP</translation>
+ </message>
+ <message>
+ <source>C Shell Script</source>
+ <translation>Script de shell C</translation>
+ </message>
+ <message>
+ <source>C Source Code</source>
+ <translation>Código fuente C</translation>
+ </message>
+ <message>
+ <source>C++ Source Code</source>
+ <translation>Código fuente C++</translation>
+ </message>
+ <message>
+ <source>Perl Script</source>
+ <translation>Script Perl</translation>
+ </message>
+ <message>
+ <source>Python Program</source>
+ <translation>Programa Python</translation>
+ </message>
+ <message>
+ <source>Shell Script</source>
+ <translation>Script de shell</translation>
+ </message>
+ <message>
+ <source>Plain Text</source>
+ <translation>Texto normal</translation>
+ </message>
+ <message>
+ <source>HTML Dcoument</source>
+ <translation>Documento HTML</translation>
+ </message>
+ <message>
+ <source>GIF Image</source>
+ <translation>Imagen GIF</translation>
+ </message>
+ <message>
+ <source>PNG Image</source>
+ <translation>Imagen PNG</translation>
+ </message>
+ <message>
+ <source>JPEG Image</source>
+ <translation>Imagen JPEG</translation>
+ </message>
+ <message>
+ <source>TIFF Image</source>
+ <translation>Imagen TIFF</translation>
+ </message>
+ <message>
+ <source>Bitmap (BMP) Image</source>
+ <translation>Imagen de mapa de bits (BMP)</translation>
+ </message>
+ <message>
+ <source>Photo CD Image</source>
+ <translation>Imagen de CD de fotos</translation>
+ </message>
+ <message>
+ <source>Portable Image (PNM)</source>
+ <translation>Imagen portátil (PNM)</translation>
+ </message>
+ <message>
+ <source>Portable B&amp;W Image (PBM)</source>
+ <translation>Imagen en B/N portátil (PBM)</translation>
+ </message>
+ <message>
+ <source>Portable Grayscale Image (PGM)</source>
+ <translation>Imagen en escala de grises portátil (PGM)</translation>
+ </message>
+ <message>
+ <source>Portable Color Image (PPM)</source>
+ <translation>Imagen en color (PPM)</translation>
+ </message>
+ <message>
+ <source>SGI RGB</source>
+ <translation>SGI RGB</translation>
+ </message>
+ <message>
+ <source>X11 Bitmap (XBM)</source>
+ <translation>Mapa de bits X11 (XBM)</translation>
+ </message>
+ <message>
+ <source>X11 Pixmap (XPM)</source>
+ <translation>Mapa de píxeles X11 (XPM)</translation>
+ </message>
+ <message>
+ <source>Sun Raster Format</source>
+ <translation>Formato Sun Raster</translation>
+ </message>
+ <message>
+ <source>File(s) to Fax</source>
+ <translation>Archivos para fax</translation>
+ </message>
+ <message>
+ <source>Add/Edit Fax Coverpage</source>
+ <translation>Agregar/Editar portada de fax</translation>
+ </message>
+ <message>
+ <source>Recipient(s)</source>
+ <translation>Destinatarios</translation>
+ </message>
+ <message>
+ <source>Add Recipients from the Fax Address Book</source>
+ <translation>Agregar destinatarios a la agenda de fax</translation>
+ </message>
+ <message>
+ <source>&lt;i&gt;Quick Add&lt;/i&gt; an Individual Recipient</source>
+ <translation>&lt;i&gt;Adición rápida&lt;/i&gt; de un destinatario individual</translation>
+ </message>
+ <message>
+ <source>&lt;&lt; Functions</source>
+ <translation>&lt;&lt; Funciones</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Cerrar</translation>
+ </message>
+ <message>
+ <source>Send Fax Now</source>
+ <translation>Enviar fax ahora</translation>
+ </message>
+ <message>
+ <source>Processing fax...</source>
+ <translation>Procesando fax...</translation>
+ </message>
+ <message>
+ <source>Receiving fax data...</source>
+ <translation>Recibiendo datos de fax...</translation>
+ </message>
+ <message>
+ <source>Read %1 of fax data...</source>
+ <translation>Leer %1 de los datos de fax...</translation>
+ </message>
+ <message>
+ <source>Order</source>
+ <translation>Pedir</translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation>Nombre</translation>
+ </message>
+ <message>
+ <source>Type</source>
+ <translation>Tipo</translation>
+ </message>
+ <message>
+ <source>Pages</source>
+ <translation>Páginas</translation>
+ </message>
+ <message>
+ <source>Path</source>
+ <translation>Ruta</translation>
+ </message>
+ <message>
+ <source>Add File...</source>
+ <translation>Agregar archivo...</translation>
+ </message>
+ <message>
+ <source>Show Types...</source>
+ <translation>Mostrar tipos...</translation>
+ </message>
+ <message>
+ <source>Remove File</source>
+ <translation>Eliminar archivo</translation>
+ </message>
+ <message>
+ <source>Move Down</source>
+ <translation>Bajar</translation>
+ </message>
+ <message>
+ <source>Move Up</source>
+ <translation>Subir</translation>
+ </message>
+ <message>
+ <source>Show File Types...</source>
+ <translation>Mostrar tipos de archivo...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Invalid HPLIP Fax file.&lt;/b&gt;&lt;p&gt;Bad magic!</source>
+ <translation>&lt;b&gt;Archivo de fax HPLIP no válido.&lt;/b&gt;&lt;p&gt;¡Bad magic!</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;You are trying to add a file that cannot be directly faxed with this utility.&lt;/b&gt;&lt;p&gt;To print this file, use the print command in the application that created it.</source>
+ <translation>&lt;b&gt;Está intentando agregar un archivo que no se puede enviar por fax directamente con esta utilidad.&lt;/b&gt;&lt;p&gt;Para imprimir el archivo, utilice el comando de impresión de la aplicación en que se creó.</translation>
+ </message>
+ <message>
+ <source>Processing fax file...</source>
+ <translation>Procesando archivo de fax...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Printer &apos;%1&apos; is in a stopped or error state.&lt;/b&gt;&lt;p&gt;Check the printer queue in CUPS and try again.</source>
+ <translation>&lt;b&gt;La impresora &apos;%1&apos; se encuentra en estado de error o detenido.&lt;/b&gt;&lt;p&gt;Verifique la cola de impresión de CUPS e inténtelo de nuevo.</translation>
+ </message>
+ <message>
+ <source>Edit...</source>
+ <translation>Editar...</translation>
+ </message>
+ <message>
+ <source>Add...</source>
+ <translation>Agregar...</translation>
+ </message>
+ <message>
+ <source>HP Fax Coverpage</source>
+ <translation>Portada de fax HP</translation>
+ </message>
+ <message>
+ <source>Cover Page</source>
+ <translation>Portada</translation>
+ </message>
+ <message>
+ <source>Fax Number</source>
+ <translation>Número de fax</translation>
+ </message>
+ <message>
+ <source>Notes</source>
+ <translation>Notas</translation>
+ </message>
+ <message>
+ <source>Fax Address Book...</source>
+ <translation>Agenda de fax...</translation>
+ </message>
+ <message>
+ <source>Remove</source>
+ <translation>Eliminar</translation>
+ </message>
+ <message>
+ <source>Add Individual</source>
+ <translation>Agregar persona</translation>
+ </message>
+ <message>
+ <source>Add Group</source>
+ <translation>Agregar grupo</translation>
+ </message>
+ <message>
+ <source>Add an &lt;b&gt;individual &lt;/b&gt;from the fax address book:</source>
+ <translation>Agregar una &lt;/b&gt;persona&lt;b&gt; de la agenda de fax:</translation>
+ </message>
+ <message>
+ <source>Add a &lt;b&gt;group&lt;/b&gt; from the fax address book:</source>
+ <translation>Agregar un &lt;/b&gt;grupo&lt;b&gt; de la agenda de fax:</translation>
+ </message>
+ <message>
+ <source>Add</source>
+ <translation>Agregar</translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation>Nombre:</translation>
+ </message>
+ <message>
+ <source>Fax Number:</source>
+ <translation>Número de fax:</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Fax configuration error.&lt;/b&gt;&lt;p&gt;The CUPS fax queue for &apos;%1&apos; is incorrectly configured.&lt;p&gt;Please make sure that the CUPS fax queue is configured with the &apos;HPLIP Fax&apos; Model/Driver.</source>
+ <translation>&lt;b&gt;Error de configuración del fax.&lt;/b&gt;&lt;p&gt;La cola de fax CUPS para &apos;%1&apos; está configurada incorrectamente.&lt;p&gt;Asegúrese de que la cola de fax CUPS se ha configurado con el modelo/controlador &apos;Fax HPLIP&apos;.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Device is busy or in an error state (code=%1)&lt;/b&gt;&lt;p&gt;Please wait for the device to become idle or clear the error and try again.</source>
+ <translation>&lt;b&gt;El dispositivo está ocupado o en estado de error (código=%1)&lt;/b&gt;&lt;p&gt;Espere a que el dispositivo quede inactivo o borre el error e inténtelo de nuevo.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;The CUPS queue for &apos;%1&apos; is in a stopped or busy state.&lt;/b&gt;&lt;p&gt;Please check the queue and try again.</source>
+ <translation>&lt;b&gt;La cola CUPS para &apos;%1&apos; se encuentra en estado de error o detenido.&lt;/b&gt;&lt;p&gt;Compruebe la cola e inténtelo de nuevo.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Send fax is active.&lt;/b&gt;&lt;p&gt;Please wait for operation to complete.</source>
+ <translation>&lt;b&gt;El envío de faxes está activo.&lt;/b&gt;&lt;p&gt;Espere a que se complete la operación.</translation>
+ </message>
+ <message>
+ <source>Initializing...</source>
+ <translation>Inicializando...</translation>
+ </message>
+ <message>
+ <source>Processing page %1...</source>
+ <translation>Procesando página %1...</translation>
+ </message>
+ <message>
+ <source>Dialing %1...</source>
+ <translation>Marcando %1...</translation>
+ </message>
+ <message>
+ <source>Connecting to %1...</source>
+ <translation>Conectando con %1...</translation>
+ </message>
+ <message>
+ <source>Sending page %1 to %2...</source>
+ <translation>Enviando página %1 a %2...</translation>
+ </message>
+ <message>
+ <source>Cleaning up...</source>
+ <translation>Ordenando...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Fax send error.&lt;/b&gt;&lt;p&gt;</source>
+ <translation>&lt;b&gt;Error de envío de fax.&lt;/b&gt;&lt;p&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Fax device is busy.&lt;/b&gt;&lt;p&gt;Please try again later.</source>
+ <translation>&lt;b&gt;El dispositivo de fax está ocupado.&lt;/b&gt;&lt;p&gt;Inténtelo de nuevo más tarde.</translation>
+ </message>
+ <message>
+ <source>Added with Quick Add</source>
+<translation>Agregado con Adición rápida</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollFunctionsView</name>
+ <message>
+ <source>Print &gt;&gt;</source>
+ <translation>Imprimir &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>Print...</source>
+ <translation>Imprimir...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Print&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Imprimir&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Print documents or files.</source>
+ <translation>Imprima documentos o archivos.</translation>
+ </message>
+ <message>
+ <source>Scan &gt;&gt;</source>
+ <translation>Escanear &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>Scan...</source>
+ <translation>Escanear...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Scan&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Escanear&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Scan a document, image, or photograph.</source>
+ <translation>Escanee un documento, imagen o fotografía.</translation>
+ </message>
+ <message>
+ <source>Send PC Fax &gt;&gt;</source>
+ <translation>Enviar fax de PC &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>Send PC Fax...</source>
+ <translation>Enviar fax de PC...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Send PC Fax&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Enviar fax de PC&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Send a fax from the PC.</source>
+ <translation>Envíe un fax desde el PC.</translation>
+ </message>
+ <message>
+ <source>Make Copies &gt;&gt;</source>
+ <translation>Realizar copias &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>Make Copies...</source>
+ <translation>Realizar copias...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Make Copies&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Realizar copias&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Make copies on the device controlled by the PC.</source>
+ <translation>Realice copias en el dispositivo controlado por el PC.</translation>
+ </message>
+ <message>
+ <source>Unload Photo Card &gt;&gt;</source>
+ <translation>Descargar tarjeta fotográfica &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>Unload Photo Card...</source>
+ <translation>Descargar tarjeta fotográfica...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Unload Photo Card&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Descargar tarjeta fotográfica&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Copy images from the device&apos;s photo card to the PC.</source>
+ <translation>Copie imágenes de la tarjeta fotográfica del dispositivo en el PC.</translation>
+ </message>
+ <message>
+ <source>ERROR: Device not supported.</source>
+ <translation>ERROR: El dispositivo no es soportado.</translation>
+ </message>
+ <message>
+ <source>ERROR: Device not found. Please check connection and power-on device.</source>
+ <translation>ERROR: No se encontró el dispositivo. Compruebe la conexión y encienda el dispositivo.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Photocards on your printer are only available by mounting them as drives using USB mass storage.&lt;/b&gt;&lt;p&gt;Please refer to your distribution&apos;s documentation for setup and usage instructions.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Las tarjetas fotográficas de la impresora sólo están disponibles cuando se montan como unidades con almacenamiento masivo de datos USB.&lt;/b&gt;&lt;p&gt;Consulte la documentación de distribución para obtener instrucciones de configuración y uso.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Unable to run command. No command specified.&lt;/b&gt;&lt;p&gt;Use &lt;pre&gt;Configure...&lt;/pre&gt; to specify a command to run.</source>
+ <translation>&lt;p&gt;&lt;b&gt;No se pudo ejecutar el comando. No se ha especificado ningún comando.&lt;/b&gt;&lt;p&gt;Utilice &lt;pre&gt;Configurar...&lt;/pre&gt; para especificar un comando para que se ejecute.</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollPrintJobView</name>
+ <message>
+ <source>Pending</source>
+ <translation>Pendiente</translation>
+ </message>
+ <message>
+ <source>On hold</source>
+ <translation>En pausa</translation>
+ </message>
+ <message>
+ <source>Printing</source>
+ <translation>Imprimiendo</translation>
+ </message>
+ <message>
+ <source>Stopped</source>
+ <translation>Detenido</translation>
+ </message>
+ <message>
+ <source>Canceled</source>
+ <translation>Cancelado</translation>
+ </message>
+ <message>
+ <source>Aborted</source>
+ <translation>Anulado</translation>
+ </message>
+ <message>
+ <source>Completed</source>
+ <translation>Completado</translation>
+ </message>
+ <message>
+ <source>Print Control</source>
+ <translation>Control de impresión</translation>
+ </message>
+ <message>
+ <source>Job Control</source>
+ <translation>Control de trabajos</translation>
+ </message>
+ <message>
+ <source>1 Active Print Job</source>
+ <translation>1 trabajo de impresión activo</translation>
+ </message>
+ <message>
+ <source>%1 Active Print Jobs</source>
+ <translation>%1 trabajos de impresión activos</translation>
+ </message>
+ <message>
+ <source>Set as Default</source>
+ <translation>Establecer como predeterminado</translation>
+ </message>
+ <message>
+ <source>SET AS DEFAULT</source>
+ <translation>ESTABLECER COMO PREDETERMINADO</translation>
+ </message>
+ <message>
+ <source>NOT SET AS DEFAULT</source>
+ <translation>NO ESTABLECER COMO PREDETERMINADO</translation>
+ </message>
+ <message>
+ <source>The printer is currently: %1</source>
+ <translation>La impresora se encuentra actualmente en estado: %1</translation>
+ </message>
+ <message>
+ <source>IDLE</source>
+ <translation>INACTIVO</translation>
+ </message>
+ <message>
+ <source>Stop Printer</source>
+ <translation>Detener impresora</translation>
+ </message>
+ <message>
+ <source>PROCESSING</source>
+ <translation>PROCESANDO</translation>
+ </message>
+ <message>
+ <source>STOPPED</source>
+ <translation>DETENIDO</translation>
+ </message>
+ <message>
+ <source>Start Printer</source>
+ <translation>Iniciar impresora</translation>
+ </message>
+ <message>
+ <source>ACCEPTING JOBS</source>
+ <translation>ACEPTANDO TRABAJOS</translation>
+ </message>
+ <message>
+ <source>Reject Jobs</source>
+ <translation>Rechazar trabajos</translation>
+ </message>
+ <message>
+ <source>REJECTING JOBS</source>
+ <translation>RECHAZANDO TRABAJOS</translation>
+ </message>
+ <message>
+ <source>Accept Jobs</source>
+ <translation>Aceptar trabajos</translation>
+ </message>
+ <message>
+ <source>Cancel all active print jobs</source>
+ <translation>Cancelar todos los trabajos de impresión</translation>
+ </message>
+ <message>
+ <source>Cancel All Jobs</source>
+ <translation>Cancelar todos los trabajos</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;%1&lt;/b&gt;</source>
+ <translation>&lt;b&gt;%1&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Job ID: %1</source>
+ <translation>ID de trabajo: %1</translation>
+ </message>
+ <message>
+ <source>Cancel Job</source>
+ <translation>Cancelar trabajo</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollPrintSettingsView</name>
+ <message>
+ <source>Basic</source>
+<translation>Básico</translation>
+ </message>
+ <message>
+ <source>Page Orientation</source>
+<translation>Orientación de la página</translation>
+ </message>
+ <message>
+ <source>Portrait</source>
+<translation>Vertical (retrato)</translation>
+ </message>
+ <message>
+ <source>Landscape</source>
+<translation>Horizontal (apaisado)</translation>
+ </message>
+ <message>
+ <source>Reverse landscape</source>
+<translation>Horizontal inverso</translation>
+ </message>
+ <message>
+ <source>Reverse portrait</source>
+<translation>Vertical inverso</translation>
+ </message>
+ <message>
+ <source>Duplex (Print on both sides of the page)</source>
+<translation>Dúplex (impresión en ambos lados del papel)</translation>
+ </message>
+ <message>
+ <source>Single sided</source>
+<translation>A un cara</translation>
+ </message>
+ <message>
+ <source>Two sided (long edge)</source>
+<translation>A dos caras (borde largo)</translation>
+ </message>
+ <message>
+ <source>Two sided (short edge)</source>
+<translation>A doble cara (borde corto)</translation>
+ </message>
+ <message>
+ <source>Output Order (Print last page first)</source>
+<translation>Orden de impresión (imprimir primero la última página)</translation>
+ </message>
+ <message>
+ <source>Normal (Print first page first)</source>
+<translation>Normal (imprimir primero la primera página)</translation>
+ </message>
+ <message>
+ <source>Reversed (Print last page first)</source>
+<translation>Inverso (imprimir primero la última página)</translation>
+ </message>
+ <message>
+ <source>Collate (Group together multiple copies)</source>
+<translation>Intercalado (agrupar copias múltiples)</translation>
+ </message>
+ <message>
+ <source>Quality</source>
+<translation>Calidad de copia</translation>
+ </message>
+ <message>
+ <source>N-Up (Multiple document pages per printed page)</source>
+<translation>N arriba (múltiples páginas del documento en cada página impresa)</translation>
+ </message>
+ <message>
+ <source>Pages per Sheet</source>
+<translation>Páginas por hoja</translation>
+ </message>
+ <message>
+ <source>1 sheet per page</source>
+<translation>1 hoja por página</translation>
+ </message>
+ <message>
+ <source>2 sheets per page</source>
+<translation>2 hojas por página</translation>
+ </message>
+ <message>
+ <source>4 sheets per page</source>
+<translation>4 hojas por página</translation>
+ </message>
+ <message>
+ <source>Layout</source>
+<translation>Disposición</translation>
+ </message>
+ <message>
+ <source>Bottom to top, left to right</source>
+<translation>De abajo arriba y de izquierda a derecha</translation>
+ </message>
+ <message>
+ <source>Bottom to top, right to left</source>
+<translation>De abajo arriba y de derecha a izquierda</translation>
+ </message>
+ <message>
+ <source>Left to right, bottom to top</source>
+<translation>De izquierda a derecha y de abajo arriba</translation>
+ </message>
+ <message>
+ <source>Left to right, top to bottom</source>
+<translation>De izquierda a derecha y de arriba abajo</translation>
+ </message>
+ <message>
+ <source>Right to left, bottom to top</source>
+<translation>De derecha a izquierda y de abajo arriba</translation>
+ </message>
+ <message>
+ <source>Right to left, top to bottom</source>
+<translation>De derecha a izquierda y de arriba abajo</translation>
+ </message>
+ <message>
+ <source>Top to bottom, left to right</source>
+<translation>De arriba abajo y de izquierda a derecha</translation>
+ </message>
+ <message>
+ <source>Top to bottom, right to left</source>
+<translation>De arriba abajo y de derecha a izquierda</translation>
+ </message>
+ <message>
+ <source>Printed Border Around Each Page</source>
+<translation>Borde impreso alrededor de cada página</translation>
+ </message>
+ <message>
+ <source>Two thin borders</source>
+<translation>Dos bordes finos</translation>
+ </message>
+ <message>
+ <source>Two thick borders</source>
+<translation>Dos bordes gruesos</translation>
+ </message>
+ <message>
+ <source>No border</source>
+<translation>Sin borde</translation>
+ </message>
+ <message>
+ <source>One thin border</source>
+<translation>Un borde fino</translation>
+ </message>
+ <message>
+ <source>One thick border</source>
+<translation>Un borde grueso</translation>
+ </message>
+ <message>
+ <source>Printout Appearance</source>
+<translation>Apariencia de la impresión</translation>
+ </message>
+ <message>
+ <source>Brightness</source>
+<translation>Brillo</translation>
+ </message>
+ <message>
+ <source>Gamma</source>
+<translation>Gamma</translation>
+ </message>
+ <message>
+ <source>Image Printing</source>
+<translation>Impresión de imágenes</translation>
+ </message>
+ <message>
+ <source>Fit to Page</source>
+<translation>Ampliación, reducción y ajuste a la página</translation>
+ </message>
+ <message>
+ <source>Position on Page</source>
+<translation>Posición en la página</translation>
+ </message>
+ <message>
+ <source>Centered</source>
+<translation>Centrada</translation>
+ </message>
+ <message>
+ <source>Top</source>
+<translation>De arriba abajo y de izquierda a derecha</translation>
+ </message>
+ <message>
+ <source>Left</source>
+<translation>De izquierda a derecha y de abajo arriba</translation>
+ </message>
+ <message>
+ <source>Right</source>
+<translation>De derecha a izquierda y de abajo arriba</translation>
+ </message>
+ <message>
+ <source>Top left</source>
+<translation>Superior izquierda</translation>
+ </message>
+ <message>
+ <source>Top right</source>
+<translation>Superior derecha</translation>
+ </message>
+ <message>
+ <source>Bottom</source>
+<translation>De abajo arriba y de izquierda a derecha</translation>
+ </message>
+ <message>
+ <source>Bottom left</source>
+<translation>Inferior izquierda</translation>
+ </message>
+ <message>
+ <source>Bottom right</source>
+<translation>Inferior derecha</translation>
+ </message>
+ <message>
+ <source>Saturation</source>
+<translation>Saturación</translation>
+ </message>
+ <message>
+ <source>Hue (color shift/rotation)</source>
+<translation>Matiz (variación/rotación de colores)</translation>
+ </message>
+ <message>
+ <source>&quot;Natural&quot; Scaling (relative to image)</source>
+<translation>Escalado &quot;natural&quot; (relativo a la imagen)</translation>
+ </message>
+ <message>
+ <source>Scaling (relative to page)</source>
+<translation>Escalado (relativo a la página)</translation>
+ </message>
+ <message>
+ <source>Miscellaneous</source>
+<translation>Varios</translation>
+ </message>
+ <message>
+ <source>&quot;Pretty Print&quot; Text Documents (Add headers and formatting)</source>
+<translation>Documentos de texto &quot;Pretty Print&quot; (añadir encabezados y formateo)</translation>
+ </message>
+ <message>
+ <source>Banner Pages</source>
+<translation>Páginas de separación</translation>
+ </message>
+ <message>
+ <source>No banner page</source>
+<translation>Sin página de separación</translation>
+ </message>
+ <message>
+ <source>Classified</source>
+<translation>Clasificado</translation>
+ </message>
+ <message>
+ <source>Confidential</source>
+<translation>Confidencial</translation>
+ </message>
+ <message>
+ <source>Secret</source>
+<translation>Secreto</translation>
+ </message>
+ <message>
+ <source>Standard</source>
+<translation>Normal</translation>
+ </message>
+ <message>
+ <source>Top secret</source>
+<translation>Máximo secreto</translation>
+ </message>
+ <message>
+ <source>Unclassified</source>
+<translation>Desclasificado</translation>
+ </message>
+ <message>
+ <source>Mirror Printing</source>
+<translation>Impresión en espejo</translation>
+ </message>
+ <message>
+ <source>Set Quality to &quot;Controlled by &apos;Printout Mode&apos;&quot; to enable.</source>
+<translation>Para activar, ajuste la calidad a &quot;Controlado por &apos;Modo de impresión&apos;&quot;.</translation>
+ </message>
+ <message>
+ <source>On</source>
+<translation>Un borde fino</translation>
+ </message>
+ <message>
+ <source>Off</source>
+<translation>Desactivado</translation>
+ </message>
+ <message>
+ <source>Set to default value of &quot;%1&quot;.</source>
+<translation>Ajustar al valor predeterminado de &quot;%1&quot;.</translation>
+ </message>
+ <message>
+ <source>Start:</source>
+<translation>Comienzo:</translation>
+ </message>
+ <message>
+ <source>End:</source>
+<translation>Final:</translation>
+ </message>
+ <message>
+ <source>Set to default value of &quot;Start: %1, End: %2&quot;.</source>
+<translation>Ajustar al valor predeterminado de &quot;Comienzo: %1, Final: %2&quot;.</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollPrintView</name>
+ <message>
+ <source>PDF Document</source>
+ <translation>Documento PDF</translation>
+ </message>
+ <message>
+ <source>Postscript Document</source>
+ <translation>Documento Postscript</translation>
+ </message>
+ <message>
+ <source>HP Graphics Language File</source>
+ <translation>Archivo de idioma de gráficos HP</translation>
+ </message>
+ <message>
+ <source>C Shell Script</source>
+ <translation>Script de shell C</translation>
+ </message>
+ <message>
+ <source>C Source Code</source>
+ <translation>Código fuente C</translation>
+ </message>
+ <message>
+ <source>C++ Source Code</source>
+ <translation>Código fuente C++</translation>
+ </message>
+ <message>
+ <source>Perl Script</source>
+ <translation>Script Perl</translation>
+ </message>
+ <message>
+ <source>Python Program</source>
+ <translation>Programa Python</translation>
+ </message>
+ <message>
+ <source>Shell Script</source>
+ <translation>Script de shell</translation>
+ </message>
+ <message>
+ <source>Plain Text</source>
+ <translation>Texto normal</translation>
+ </message>
+ <message>
+ <source>HTML Dcoument</source>
+ <translation>Documento HTML</translation>
+ </message>
+ <message>
+ <source>GIF Image</source>
+ <translation>Imagen GIF</translation>
+ </message>
+ <message>
+ <source>PNG Image</source>
+ <translation>Imagen PNG</translation>
+ </message>
+ <message>
+ <source>JPEG Image</source>
+ <translation>Imagen JPEG</translation>
+ </message>
+ <message>
+ <source>TIFF Image</source>
+ <translation>Imagen TIFF</translation>
+ </message>
+ <message>
+ <source>Bitmap (BMP) Image</source>
+ <translation>Imagen de mapa de bits (BMP)</translation>
+ </message>
+ <message>
+ <source>Photo CD Image</source>
+ <translation>Imagen de CD de fotos</translation>
+ </message>
+ <message>
+ <source>Portable Image (PNM)</source>
+ <translation>Imagen portátil (PNM)</translation>
+ </message>
+ <message>
+ <source>Portable B&amp;W Image (PBM)</source>
+ <translation>Imagen en B/N portátil (PBM)</translation>
+ </message>
+ <message>
+ <source>Portable Grayscale Image (PGM)</source>
+ <translation>Imagen en escala de grises portátil (PGM)</translation>
+ </message>
+ <message>
+ <source>Portable Color Image (PPM)</source>
+ <translation>Imagen en color (PPM)</translation>
+ </message>
+ <message>
+ <source>SGI RGB</source>
+ <translation>SGI RGB</translation>
+ </message>
+ <message>
+ <source>X11 Bitmap (XBM)</source>
+ <translation>Mapa de bits X11 (XBM)</translation>
+ </message>
+ <message>
+ <source>X11 Pixmap (XPM)</source>
+ <translation>Mapa de píxeles X11 (XPM)</translation>
+ </message>
+ <message>
+ <source>Sun Raster Format</source>
+ <translation>Formato Sun Raster</translation>
+ </message>
+ <message>
+ <source>File(s) to Print</source>
+ <translation>Archivos para imprimir</translation>
+ </message>
+ <message>
+ <source>Print Options</source>
+ <translation>Opciones de impresión</translation>
+ </message>
+ <message>
+ <source>&lt;&lt; Functions</source>
+ <translation>&lt;&lt; Funciones</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Cerrar</translation>
+ </message>
+ <message>
+ <source>Print File(s)</source>
+ <translation>Imprimir archivos</translation>
+ </message>
+ <message>
+ <source>Order</source>
+ <translation>Pedir</translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation>Nombre</translation>
+ </message>
+ <message>
+ <source>Type</source>
+ <translation>Tipo</translation>
+ </message>
+ <message>
+ <source>Path</source>
+ <translation>Ruta</translation>
+ </message>
+ <message>
+ <source>Add File...</source>
+ <translation>Agregar archivo...</translation>
+ </message>
+ <message>
+ <source>Show Types...</source>
+ <translation>Mostrar tipos...</translation>
+ </message>
+ <message>
+ <source>Remove File</source>
+ <translation>Eliminar archivo</translation>
+ </message>
+ <message>
+ <source>Move Down</source>
+ <translation>Bajar</translation>
+ </message>
+ <message>
+ <source>Move Up</source>
+ <translation>Subir</translation>
+ </message>
+ <message>
+ <source>Show File Types...</source>
+ <translation>Mostrar tipos de archivo...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;You are trying to add a file that cannot be directly printed with this utility.&lt;/b&gt;&lt;p&gt;To print this file, use the print command in the application that created it.</source>
+ <translation>&lt;b&gt;Está intentando agregar un archivo que no se puede imprimir directamente con esta utilidad.&lt;/b&gt;&lt;p&gt;Para imprimir el archivo, utilice el comando de impresión de la aplicación en que se creó.</translation>
+ </message>
+ <message>
+ <source>Number of copies:</source>
+ <translation>Número de copias:</translation>
+ </message>
+ <message>
+ <source>Default</source>
+ <translation>Predeterminado</translation>
+ </message>
+ <message>
+ <source>Page Range:</source>
+ <translation>Rango de páginas:</translation>
+ </message>
+ <message>
+ <source>All pages</source>
+ <translation>Todas las páginas</translation>
+ </message>
+ <message>
+ <source>Page range:</source>
+ <translation>Rango de páginas:</translation>
+ </message>
+ <message>
+ <source>Page set:</source>
+ <translation>Grupo de páginas:</translation>
+ </message>
+ <message>
+ <source>Even pages</source>
+ <translation>Páginas pares</translation>
+ </message>
+ <message>
+ <source>Odd pages</source>
+ <translation>Páginas impares</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Cannot print: Invalid page range: %1&lt;/b&gt;&lt;p&gt;A valid page range is a list of pages or ranges of pages separated by commas (e.g., 1-2,4,6-7)</source>
+ <translation>&lt;b&gt;No se puede imprimir: Rango de páginas no válido: %1&lt;/b&gt;&lt;p&gt;Un rango de páginas válido es una lista de páginas o rangos de páginas separados por comas (por ejemplo, 1-2,4,6-7)</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Cannot print: Device is busy or not available.&lt;/b&gt;&lt;p&gt;Please check device and try again. [1]</source>
+ <translation type="obsolete">&lt;b&gt;No se puede imprimir: El dispositivo está ocupado o no está disponible.&lt;/b&gt;&lt;p&gt;Compruebe el dispositivo e inténtelo de nuevo. [1]</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Cannot print: Printer is stopped.&lt;/b&gt;&lt;p&gt;Please START the printer to continue this print. Job will begin printing once printer is started.</source>
+ <translation>&lt;b&gt;No se puede imprimir: La impresora se ha detenido.&lt;/b&gt;&lt;p&gt;Inicie la impresora para continuar esta impresión. El trabajo empezará a imprimirse una vez iniciada la impresora.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Cannot print: Printer is not accepting jobs.&lt;/b&gt;&lt;p&gt;Please set the printer to ACCEPTING JOBS to continue printing.</source>
+ <translation>&lt;b&gt;No se puede imprimir: La impresora no acepta trabajos.&lt;/b&gt;&lt;p&gt;;Establezca la impresora en ACEPTANDO TRABAJOS para continuar imprimiendo.</translation>
+ </message>
+ <message>
+ <source>Print command failed with error code %1</source>
+ <translation>Fallo de comando de impresión con código de error %1</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Cannot print: Device is busy or not available.&lt;/b&gt;&lt;p&gt;Please check device and try again.</source>
+<translation>&lt;b&gt;No se puede imprimir: El dispositivo está ocupado o no está disponible.&lt;/b&gt;&lt;p&gt;Compruebe el dispositivo e inténtelo de nuevo.</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollPrinterInfoView</name>
+ <message>
+ <source>No printers found for this device.</source>
+ <translation>No se encontraron impresoras para este dispositivo.</translation>
+ </message>
+ <message>
+ <source>&lt;&lt; Tools</source>
+ <translation>&lt;&lt; Herramientas</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Cerrar</translation>
+ </message>
+ <message>
+ <source>Fax</source>
+ <translation>Fax</translation>
+ </message>
+ <message>
+ <source>Printer</source>
+ <translation>Impresora</translation>
+ </message>
+ <message>
+ <source>Type: %1</source>
+ <translation>Tipo: %1</translation>
+ </message>
+ <message>
+ <source>Location: %1</source>
+ <translation>Ubicación: %1</translation>
+ </message>
+ <message>
+ <source>Description/Info: %1</source>
+ <translation>Descripción/Información: %1</translation>
+ </message>
+ <message>
+ <source>Idle</source>
+ <translation>Inactivo</translation>
+ </message>
+ <message>
+ <source>Processing</source>
+ <translation>Procesando</translation>
+ </message>
+ <message>
+ <source>Stopped</source>
+ <translation>Detenido</translation>
+ </message>
+ <message>
+ <source>Unknown</source>
+ <translation>Desconocido</translation>
+ </message>
+ <message>
+ <source>State: %1</source>
+ <translation>Estado: %1</translation>
+ </message>
+ <message>
+ <source>PPD/Driver: %1</source>
+ <translation>PPD/Controlador: %1</translation>
+ </message>
+ <message>
+ <source>CUPS/IPP Printer URI: %1</source>
+ <translation>CUPS/URI de impresora IPP: %1</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollStatusView</name>
+ <message>
+ <source>year</source>
+ <translation>año</translation>
+ </message>
+ <message>
+ <source>years</source>
+ <translation>años</translation>
+ </message>
+ <message>
+ <source>month</source>
+ <translation>mes</translation>
+ </message>
+ <message>
+ <source>months</source>
+ <translation>meses</translation>
+ </message>
+ <message>
+ <source>week</source>
+ <translation>semana</translation>
+ </message>
+ <message>
+ <source>weeks</source>
+ <translation>semanas</translation>
+ </message>
+ <message>
+ <source>day</source>
+ <translation>día</translation>
+ </message>
+ <message>
+ <source>days</source>
+ <translation>días</translation>
+ </message>
+ <message>
+ <source>hour</source>
+ <translation>hora</translation>
+ </message>
+ <message>
+ <source>hours</source>
+ <translation>horas</translation>
+ </message>
+ <message>
+ <source>minute</source>
+ <translation>minuto</translation>
+ </message>
+ <message>
+ <source>minutes</source>
+ <translation>minutos</translation>
+ </message>
+ <message>
+ <source>second</source>
+ <translation>segundo</translation>
+ </message>
+ <message>
+ <source>seconds</source>
+ <translation>segundos</translation>
+ </message>
+ <message>
+ <source>one</source>
+ <translation>uno</translation>
+ </message>
+ <message>
+ <source>two</source>
+ <translation>dos</translation>
+ </message>
+ <message>
+ <source>three</source>
+ <translation>tres</translation>
+ </message>
+ <message>
+ <source>four</source>
+ <translation>cuatro</translation>
+ </message>
+ <message>
+ <source>five</source>
+ <translation>cinco</translation>
+ </message>
+ <message>
+ <source>six</source>
+ <translation>seis</translation>
+ </message>
+ <message>
+ <source>seven</source>
+ <translation>siete</translation>
+ </message>
+ <message>
+ <source>eight</source>
+ <translation>ocho</translation>
+ </message>
+ <message>
+ <source>nine</source>
+ <translation>nueve</translation>
+ </message>
+ <message>
+ <source>ten</source>
+ <translation>diez</translation>
+ </message>
+ <message>
+ <source>eleven</source>
+ <translation>once</translation>
+ </message>
+ <message>
+ <source>twelve</source>
+ <translation>doce</translation>
+ </message>
+ <message>
+ <source>(most recent)</source>
+ <translation>(más recientes)</translation>
+ </message>
+ <message>
+ <source>User:</source>
+ <translation>Usuario:</translation>
+ </message>
+ <message>
+ <source>Job ID:</source>
+ <translation>ID de trabajo:</translation>
+ </message>
+ <message>
+ <source>n/a</source>
+ <translation>n/d</translation>
+ </message>
+ <message>
+ <source>Code:</source>
+ <translation>Código:</translation>
+ </message>
+ <message>
+ <source>(about %1 ago)</source>
+ <translation>(hace aprox. %1)</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollSuppliesView</name>
+ <message>
+ <source>ERROR: Device not supported.</source>
+ <translation>ERROR: El dispositivo no es soportado.</translation>
+ </message>
+ <message>
+ <source>ERROR: Supplies status is not supported on this device.</source>
+ <translation>ERROR: El estado de los suministros no es soportado en este dispositivo.</translation>
+ </message>
+ <message>
+ <source>ERROR: Device not found. Please check connection and power-on device.</source>
+ <translation>ERROR: No se encontró el dispositivo. Compruebe la conexión y encienda el dispositivo.</translation>
+ </message>
+ <message>
+ <source>Part No. %1</source>
+ <translation>Pieza No. %1</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollTestpageView</name>
+ <message>
+ <source>&lt;&lt; Tools</source>
+ <translation>&lt;&lt; Herramientas</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Cerrar</translation>
+ </message>
+ <message>
+ <source>Print Test Page</source>
+ <translation>Imprimir página de prueba</translation>
+ </message>
+ <message>
+ <source>Test Page Type</source>
+ <translation>Tipo de página de prueba</translation>
+ </message>
+ <message>
+ <source>Printer diagnostic page (does not test print driver)</source>
+ <translation>Página de diagnósticos de la impresora (no prueba el controlador de impresora)</translation>
+ </message>
+ <message>
+ <source>HPLIP test page (tests print driver)</source>
+ <translation>Página de prueba HPLIP (prueba el controlador de impresora)</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;A test page should be printing on your printer.&lt;/b&gt;&lt;p&gt;If the page fails to print, please visit http://hplip.sourceforge.net for troubleshooting and support.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Debe imprimirse una página de prueba en la impresora.&lt;/b&gt;&lt;p&gt;Si no se puede imprimir la página, visite http://hplip.sourceforge.net para obtener información de resolución de problemas y soporte.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Device is busy or in an error state.&lt;/b&gt;&lt;p&gt;Please check device and try again.</source>
+<translation>&lt;b&gt;El dispositivo está ocupado o en un estado de error.&lt;/b&gt;&lt;p&gt;Compruebe el dispositivo e inténtelo de nuevo.</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollToolView</name>
+ <message>
+ <source>&lt;b&gt;Device Settings&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Ajustes del dispositivo&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Your device has special device settings. You may alter these settings here.</source>
+ <translation>El dispositivo tiene ajustes del dispositivo especiales. Aquí puede modificar esos ajustes.</translation>
+ </message>
+ <message>
+ <source>Device Settings...</source>
+ <translation>Ajustes del dispositivo...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Fax Setup&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Configuración del fax&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Fax support must be setup before you can send faxes.</source>
+ <translation>Debe configurarse el soporte de fax para poder enviar faxes.</translation>
+ </message>
+ <message>
+ <source>Setup Fax...</source>
+ <translation>Configurar fax...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Fax Address Book&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Agenda de fax&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Setup fax phone numbers to use when sending faxes from the PC.</source>
+ <translation>Configure los números de teléfono de fax que se utilizarán al enviar faxes desde el PC.</translation>
+ </message>
+ <message>
+ <source>Fax Address Book...</source>
+ <translation>Agenda de fax...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Print Test Page&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Imprimir página de prueba&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Print a test page to test the setup of your printer.</source>
+ <translation>Imprima una página de prueba para probar la configuración de la impresora.</translation>
+ </message>
+ <message>
+ <source>Print Test Page &gt;&gt;</source>
+ <translation>Imprimir página de prueba &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;View Printer (Queue) Information&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Ver información de la impresora (cola)&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>View the printers (queues) installed in CUPS.</source>
+ <translation>Vea las impresoras (colas) instaladas en CUPS.</translation>
+ </message>
+ <message>
+ <source>View Printer Information &gt;&gt;</source>
+ <translation>Ver información de la impresora &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;View Device Information&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Ver información del dispositivo&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>This information is primarily useful for debugging and troubleshooting (advanced).</source>
+ <translation>Esta información es especialmente útil en la depuración y resolución de problemas (avanzada).</translation>
+ </message>
+ <message>
+ <source>View Device Information &gt;&gt;</source>
+ <translation>Ver información del dispositivo &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Print Quality Diagnostics&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Diagnósticos de calidad de impresión&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Your printer can print a test page to help diagnose print quality problems.</source>
+ <translation>La impresora puede imprimir una página de prueba para ayudar a diagnosticar problemas de calidad de impresión.</translation>
+ </message>
+ <message>
+ <source>Print Diagnostic Page...</source>
+ <translation>Imprimir página de diagnósticos...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Download Firmware&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Descargar firmware&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Download firmware to your printer (required on some devices after each power-up).</source>
+ <translation>Descargue firmware para la impresora (obligatorio en algunos dispositivos después de cada encendido).</translation>
+ </message>
+ <message>
+ <source>Download Firmware...</source>
+ <translation>Descargar firmware...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Clean Cartridges&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Limpiar cartuchos&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>You only need to perform this action if you are having problems with poor printout quality due to clogged ink nozzles.</source>
+ <translation>Sólo es necesario realizar esta acción si se tienen problemas de calidad de impresión deficiente a causa de boquillas de tinta obstruidas.</translation>
+ </message>
+ <message>
+ <source>Clean Cartridges...</source>
+ <translation>Limpiar cartuchos...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Align Cartridges&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Alinear cartuchos&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>This will improve the quality of output when a new cartridge is installed.</source>
+ <translation>Esto mejorará la calidad de impresión cuando se instale un nuevo cartucho.</translation>
+ </message>
+ <message>
+ <source>Align Cartridges...</source>
+ <translation>Alinear cartuchos...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Perform Color Calibration&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Realizar Color Calibration&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Use this procedure to optimimize your printer&apos;s color output.</source>
+ <translation>Utilice este procedimiento para optimizar la salida de color de la impresora.</translation>
+ </message>
+ <message>
+ <source>Color Calibration...</source>
+ <translation>Color Calibration...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Perform Line Feed Calibration&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Realizar calibración de avance de línea&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Use line feed calibration to optimize print quality (to remove gaps in the printed output).</source>
+ <translation>Utilice la calibración de avance de línea para optimizar la calidad de impresión (para eliminar espacios en blanco en la salida impresa).</translation>
+ </message>
+ <message>
+ <source>Line Feed Calibration...</source>
+ <translation>Calibración de avance de línea...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Access Embedded Web Page&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Acceso a página Web incorporada&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>You can use your printer&apos;s embedded web server to configure, maintain, and monitor the device from a web browser.</source>
+ <translation>Puede utilizar el servidor Web incorporado de la impresora para configurar, mantener y supervisar el dispositivo desde un navegador Web.</translation>
+ </message>
+ <message>
+ <source>Open in Browser...</source>
+ <translation>Abrir en navegador...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;View Documentation&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Ver documentación&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>View documentation installed on your system.</source>
+ <translation>Vea la documentación instalada en el sistema.</translation>
+ </message>
+ <message>
+ <source>View Documentation...</source>
+ <translation>Ver documentación...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;An error occured downloading firmware file.&lt;/b&gt;&lt;p&gt;Please check your printer and try again.</source>
+ <translation>&lt;b&gt;Se produjo un error al descargar archivo de firmware.&lt;/b&gt;&lt;p&gt;Compruebe la impresora e inténtelo de nuevo.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Device is busy or in an error state.&lt;/b&gt;&lt;p&gt;Please check device and try again.</source>
+ <translation>&lt;b&gt;El dispositivo está ocupado o en estado de error&lt;/b&gt;&lt;p&gt;Compruebe el dispositivo e inténtelo de nuevo.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Both cartridges are required for alignment.&lt;/b&gt;&lt;p&gt;Please install both cartridges and try again.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Se necesitan ambos cartuchos para la alineación.&lt;/b&gt;&lt;p&gt;Instale ambos cartuchos e inténtelo de nuevo.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;One or more cartiridges are missing from the printer.&lt;/b&gt;&lt;p&gt;Please install cartridge(s) and try again.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Falta uno o varios cartuchos en la impresora.&lt;/b&gt;&lt;p&gt;Instale los cartuchos e inténtelo de nuevo.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Both the photo and color cartridges must be inserted into the printer to perform color calibration.&lt;/b&gt;&lt;p&gt;If you are planning on printing with the photo cartridge, please insert it and try again.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Deben insertarse ambos cartuchos, para fotos y de color, en la impresora para realizar la calibración del color.&lt;/b&gt;&lt;p&gt;Si piensa imprimir con el cartucho para fotos, insértelo e inténtelo de nuevo.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Both the photo (regular photo or photo blue) and color cartridges must be inserted into the printer to perform color calibration.&lt;/b&gt;&lt;p&gt;If you are planning on printing with the photo or photo blue cartridge, please insert it and try again.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Deben insertarse ambos cartuchos, para fotos (foto normal o azul foto) y de color, en la impresora para realizar la calibración del color.&lt;/b&gt;&lt;p&gt;Si piensa imprimir con el cartucho para fotos o azul foto, insértelo e inténtelo de nuevo.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Cannot align with only the photo cartridge installed.&lt;/b&gt;&lt;p&gt;Please install other cartridges and try again.</source>
+ <translation>&lt;p&gt;&lt;b&gt;No se puede alinear si sólo está instalado el cartucho para fotos.&lt;/b&gt;&lt;p&gt;Instale otros cartuchos e inténtelo de nuevo.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Operation failed. Device busy.&lt;/b&gt;</source>
+ <translation>&lt;p&gt;&lt;b&gt;No se pudo realizar la operación. Dispositivo ocupado.&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Unable to run command. No command specified.&lt;/b&gt;&lt;p&gt;Use &lt;pre&gt;Configure...&lt;/pre&gt; to specify a command to run.</source>
+ <translation>&lt;p&gt;&lt;b&gt;No se pudo ejecutar el comando. No se ha especificado ningún comando.&lt;/b&gt;&lt;p&gt;Utilice &lt;pre&gt;Configurar...&lt;/pre&gt; para especificar un comando para que se ejecute.</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollUnloadView</name>
+ <message>
+ <source>ERROR: Photo Card Failed to Mount Properly. Please check device and card and try again.</source>
+<translation>ERROR: La tarjeta fotográfica no se montó correctamente. Compruebe el dispositivo y la tarjeta e inténtelo de nuevo.</translation>
+ </message>
+ <message>
+ <source>Select File(s) to Unload from Photo Card</source>
+<translation>Seleccionar archivos para descargar de la tarjeta fotográfica</translation>
+ </message>
+ <message>
+ <source>Unload Folder</source>
+<translation>Directorio de descarga</translation>
+ </message>
+ <message>
+ <source>Unload Options</source>
+<translation>Opciones de descarga</translation>
+ </message>
+ <message>
+ <source>&lt;&lt; Functions</source>
+<translation>&lt;&lt; Funciones</translation>
+ </message>
+ <message>
+ <source>Close</source>
+<translation>Cerrar</translation>
+ </message>
+ <message>
+ <source>Unload File(s)</source>
+<translation>Descargar archivos</translation>
+ </message>
+ <message>
+ <source>Select All</source>
+<translation>Seleccionar todo</translation>
+ </message>
+ <message>
+ <source>Select None</source>
+<translation>No seleccionar ninguno</translation>
+ </message>
+ <message>
+ <source>Show Thumbnails</source>
+<translation>Mostrar miniaturas</translation>
+ </message>
+ <message>
+ <source>No files selected</source>
+<translation>Ningún archivo seleccionado</translation>
+ </message>
+ <message>
+ <source>1 file selected, %1</source>
+<translation>1 archivo seleccionado, %1</translation>
+ </message>
+ <message>
+ <source>%1 files selected, %2</source>
+<translation>%1 archivos seleccionados, %2</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;No thumbnail found in image.&lt;/b&gt;</source>
+<translation>&lt;p&gt;&lt;b&gt;No se encontró ninguna miniatura en la imagen.&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Loading...</source>
+<translation>Cargando...</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+<translation>Cancelar</translation>
+ </message>
+ <message>
+ <source>HP Device Manager</source>
+<translation>Administrador de dispositivos HP</translation>
+ </message>
+ <message>
+ <source>Browse...</source>
+<translation>Examinar...</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;The unload directory path you entered is not valid.&lt;/b&gt;&lt;p&gt;The directory must exist and you must have write permissions.</source>
+<translation>&lt;p&gt;&lt;b&gt;La ruta del directorio de descargas introducido no es válida.&lt;/b&gt;&lt;p&gt;El directorio debe existir y usted debe tener permiso de escritura en el mismo.</translation>
+ </message>
+ <message>
+ <source>File removal:</source>
+<translation>Eliminación de archivos:</translation>
+ </message>
+ <message>
+ <source>Leave unloaded files on photo card</source>
+<translation>Dejar archivos descargados en la tarjeta fotográfica</translation>
+ </message>
+ <message>
+ <source>Remove all unloaded files from photo card</source>
+<translation>Eliminar todos los archivos descargados en la tarjeta fotográfica</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;The unload directory path is not valid.&lt;/b&gt;&lt;p&gt;Please enter a new path and try again.</source>
+<translation>&lt;p&gt;&lt;b&gt;La ruta del directorio de descargas no es válida.&lt;/b&gt;&lt;p&gt;Introduzca otra ruta y vuelva a intentarlo.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;No files are selected to unload.&lt;/b&gt;&lt;p&gt;Please select one or more files to unload and try again.</source>
+<translation>&lt;p&gt;&lt;b&gt;No hay seleccionado ningún archivo para descargar.&lt;/b&gt;&lt;p&gt;Seleccione al menos un archivo para descargar y vuelva a intentarlo.</translation>
+ </message>
+ <message>
+ <source>Unloading card...</source>
+<translation>Descargando tarjeta...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Unload cancelled at user request.&lt;/b&gt;</source>
+<translation>&lt;b&gt;Descarga cancelada por el usuario.&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>ERROR: Photo Card Failed to Mount Properly. Please check device and card and try again.</source>
+<translation>ERROR: La tarjeta fotográfica no se montó correctamente. Compruebe el dispositivo y la tarjeta e inténtelo de nuevo.</translation>
+ </message>
+ <message>
+ <source>Select File(s) to Unload from Photo Card</source>
+<translation>Seleccionar archivos para descargar de la tarjeta fotográfica</translation>
+ </message>
+ <message>
+ <source>Unload Folder</source>
+<translation>Directorio de descarga</translation>
+ </message>
+ <message>
+ <source>Unload Options</source>
+<translation>Opciones de descarga</translation>
+ </message>
+ <message>
+ <source>&lt;&lt; Functions</source>
+<translation>&lt;&lt; Functions</translation>
+ </message>
+ <message>
+ <source>Close</source>
+<translation>Close</translation>
+ </message>
+ <message>
+ <source>Unload File(s)</source>
+<translation>Descargar archivos</translation>
+ </message>
+ <message>
+ <source>Select All</source>
+<translation>Seleccionar todo</translation>
+ </message>
+ <message>
+ <source>Select None</source>
+<translation>No seleccionar ninguno</translation>
+ </message>
+ <message>
+ <source>Show Thumbnails</source>
+<translation>Mostrar miniaturas</translation>
+ </message>
+ <message>
+ <source>No files selected</source>
+<translation>Ningún archivo seleccionado</translation>
+ </message>
+ <message>
+ <source>1 file selected, %1</source>
+<translation>1 archivo seleccionado, %1</translation>
+ </message>
+ <message>
+ <source>%1 files selected, %2</source>
+<translation>%1 archivos seleccionados, %2</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;No thumbnail found in image.&lt;/b&gt;</source>
+<translation>&lt;p&gt;&lt;b&gt;No se encontró ninguna miniatura en la imagen.&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Loading...</source>
+<translation>Cargando...</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+<translation>Cancelar</translation>
+ </message>
+ <message>
+ <source>HP Device Manager</source>
+<translation>Administrador de dispositivos HP</translation>
+ </message>
+ <message>
+ <source>Browse...</source>
+<translation>Examinar...</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;The unload directory path you entered is not valid.&lt;/b&gt;&lt;p&gt;The directory must exist and you must have write permissions.</source>
+<translation>&lt;p&gt;&lt;b&gt;La ruta del directorio de descargas introducido no es válida.&lt;/b&gt;&lt;p&gt;El directorio debe existir y usted debe tener permiso de escritura en el mismo.</translation>
+ </message>
+ <message>
+ <source>File removal:</source>
+<translation>Eliminación de archivos:</translation>
+ </message>
+ <message>
+ <source>Leave unloaded files on photo card</source>
+<translation>Dejar archivos descargados en la tarjeta fotográfica</translation>
+ </message>
+ <message>
+ <source>Remove all unloaded files from photo card</source>
+<translation>Eliminar todos los archivos descargados en la tarjeta fotográfica</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;The unload directory path is not valid.&lt;/b&gt;&lt;p&gt;Please enter a new path and try again.</source>
+<translation>&lt;p&gt;&lt;b&gt;La ruta del directorio de descargas no es válida.&lt;/b&gt;&lt;p&gt;Introduzca otra ruta y vuelva a intentarlo.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;No files are selected to unload.&lt;/b&gt;&lt;p&gt;Please select one or more files to unload and try again.</source>
+<translation>&lt;p&gt;&lt;b&gt;No hay seleccionado ningún archivo para descargar.&lt;/b&gt;&lt;p&gt;Seleccione al menos un archivo para descargar y vuelva a intentarlo.</translation>
+ </message>
+ <message>
+ <source>Unloading card...</source>
+<translation>Descargando tarjeta...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Unload cancelled at user request.&lt;/b&gt;</source>
+<translation>&lt;b&gt;Descarga cancelada por el usuario.&lt;/b&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollView</name>
+ <message>
+ <source>ERROR: No device found or unsupported device.</source>
+ <translation>ERROR: No se encontró un dispositivo o dispositivo incompatible.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;%1 (read only)&lt;/b&gt;</source>
+ <translation>&lt;b&gt;%1 (de sólo lectura)&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Printer/Fax</source>
+ <translation>Impresora/Fax</translation>
+ </message>
+ <message>
+ <source>Printer/Fax Name:</source>
+ <translation>Nombre de impresora/fax:</translation>
+ </message>
+ <message>
+ <source>Printer</source>
+ <translation>Impresora</translation>
+ </message>
+ <message>
+ <source>Printer Name:</source>
+ <translation>Nombre de la impresora:</translation>
+ </message>
+ <message>
+ <source>Fax</source>
+ <translation>Fax</translation>
+ </message>
+ <message>
+ <source>Fax Name:</source>
+ <translation>Nombre del fax:</translation>
+ </message>
+ <message>
+ <source>Load Paper</source>
+ <translation>Cargar papel</translation>
+ </message>
+ <message>
+ <source>A page will be printed. Please load &lt;b&gt;plain paper&lt;/b&gt; into the printer.</source>
+ <translation>Se imprimirá una página. Cargue &lt;/b&gt;papel normal&lt;/b&gt; en la impresora.</translation>
+ </message>
+</context>
+<context>
+ <name>SettingsDialog</name>
+ <message>
+ <source>&lt;b&gt;One or more email addresses are missing.&lt;/b&gt;&lt;p&gt;Please enter this information and try again.</source>
+ <translation>&lt;b&gt;Falta una o varias direcciones de correo electrónico.&lt;/b&gt;&lt;p&gt;Introduzca esta información e inténtelo de nuevo.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Please check your email for a test message.&lt;/b&gt;&lt;p&gt;If the message doesn&apos;t arrive, please check your settings and try again.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Busque un mensaje de prueba en el correo electrónico.&lt;/b&gt;&lt;p&gt;Si el mensaje no llega, compruebe los ajustes e inténtelo de nuevo.</translation>
+ </message>
+</context>
+<context>
+ <name>SettingsDialog_base</name>
+ <message>
+ <source>HP Device Manager - Settings</source>
+ <translation>Administrador de dispositivos HP: Ajustes</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Cancelar</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Configure if and when device(s) are automatically refreshed&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Configurar si los dispositivos se actualizan automáticamente y cuándo&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Enable device auto refresh</source>
+ <translation>Activar actualización automática del dispositivo</translation>
+ </message>
+ <message>
+ <source>Auto Interval</source>
+ <translation>Intervalo automático</translation>
+ </message>
+ <message>
+ <source>Refresh every:</source>
+ <translation>Actualizar cada:</translation>
+ </message>
+ <message>
+ <source>seconds</source>
+ <translation>segundos</translation>
+ </message>
+ <message>
+ <source>Device(s) to Refresh </source>
+ <translation>Dispositivos que actualizar</translation>
+ </message>
+ <message>
+ <source>Only currently selected device</source>
+ <translation>Sólo el dispositivo actualmente seleccionado</translation>
+ </message>
+ <message>
+ <source>All devices</source>
+ <translation>Todos los dispositivos</translation>
+ </message>
+ <message>
+ <source>Auto Refresh</source>
+ <translation>Actualización automática</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Configure if the HP Device Manager will send email on alerts&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Configurar si el Administrador de dispositivos HP enviará correo electrónico en alertas&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Send email when device errors occur:</source>
+ <translation>Enviar correo electrónico cuando se produzcan errores de dispositivo:</translation>
+ </message>
+ <message>
+ <source>Test</source>
+ <translation>Prueba</translation>
+ </message>
+ <message>
+ <source>To: Address(es)</source>
+ <translation>A: Direcciones</translation>
+ </message>
+ <message>
+ <source>Email address(es):</source>
+ <translation>Direcciones de correo electrónico:</translation>
+ </message>
+ <message>
+ <source>&lt;i&gt;Note: Separate multiple email address with a commas.&lt;/i&gt;</source>
+ <translation>&lt;i&gt;Nota: Separe varias direcciones de correo electrónico con comas.&lt;/i&gt;</translation>
+ </message>
+ <message>
+ <source>From: Address</source>
+ <translation>De: Dirección</translation>
+ </message>
+ <message>
+ <source>Sender email address:</source>
+ <translation>Dirección de correo electrónico del remitente:</translation>
+ </message>
+ <message>
+ <source>&lt;i&gt;Note: This should generally be your email address.&lt;/i&gt;</source>
+ <translation>&lt;i&gt;Nota: Ésta suele ser su dirección de correo electrónico.&lt;/i&gt;</translation>
+ </message>
+ <message>
+ <source>Email Alerts</source>
+ <translation>Alertas de correo electrónico</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Configure what commands to run for device functions&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Configurar los comandos que se van a ejecutar para funciones de dispositivo&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Access Photo Cards</source>
+ <translation>Acceso a tarjetas fotográficas</translation>
+ </message>
+ <message>
+ <source>Built-in access photo cards function</source>
+ <translation>Función de acceso a tarjetas fotográficas incorporada</translation>
+ </message>
+ <message>
+ <source>External command:</source>
+ <translation>Comando externo:</translation>
+ </message>
+ <message>
+ <source>Send PC Fax</source>
+ <translation>Enviar fax de PC</translation>
+ </message>
+ <message>
+ <source>Built-in send PC fax function</source>
+ <translation>Función de envío de fax de PC incorporada</translation>
+ </message>
+ <message>
+ <source>Scan</source>
+ <translation>Escanear</translation>
+ </message>
+ <message>
+ <source>Built-in scan function</source>
+ <translation>Función de escaneado incorporada</translation>
+ </message>
+ <message>
+ <source>External scan command:</source>
+ <translation>Comando de escaneado externo:</translation>
+ </message>
+ <message>
+ <source>Print</source>
+ <translation>Imprimir</translation>
+ </message>
+ <message>
+ <source>Built-in print function</source>
+ <translation>Función de impresión incorporada</translation>
+ </message>
+ <message>
+ <source>Set Defaults</source>
+ <translation>Establecer predeterminados</translation>
+ </message>
+ <message>
+ <source>Make Copies</source>
+ <translation>Realizar copias</translation>
+ </message>
+ <message>
+ <source>Built-in make copies function</source>
+ <translation>Función de realización de copias incorporada</translation>
+ </message>
+ <message>
+ <source>Functions (Advanced)</source>
+ <translation>Funciones (Avanzadas)</translation>
+ </message>
+</context>
+<context>
+ <name>SetupForm</name>
+ <message>
+ <source>Current: Filter: &quot;%2&quot; Search: &quot;%3&quot; TTL: %4 Timeout: %5s</source>
+ <translation>Actual: Filtro: Búsqueda de &quot;%2&quot;: TTL de &quot;%3&quot;: Tiempo de espera de %4: %5s</translation>
+ </message>
+ <message>
+ <source>The printer name and fax name must be different. Please choose different names.</source>
+<translation>El nombre de la impresora y el del fax deben ser diferentes. Elija nombres diferentes.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Device not found.&lt;/b&gt; &lt;p&gt;Please make sure your printer is properly connected and powered-on.</source>
+ <translation>&lt;b&gt;Device not found.&lt;/b&gt; &lt;p&gt;Please make sure your printer is properly connected and powered-on.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;No devices found.&lt;/b&gt;&lt;p&gt;Please make sure your printer is properly connected and powered-on.</source>
+ <translation>&lt;b&gt;No se encontraron dispositivos.&lt;/b&gt;&lt;p&gt;Asegúrese de que la impresora está conectada correctamente y enciéndala.</translation>
+ </message>
+ <message>
+ <source>Current Settings: Filter: &quot;%2&quot; Search: &quot;%3&quot; TTL: %4 Timeout: %5s</source>
+ <translation>Ajustes actuales: Filtro: Búsqueda de &quot;%2&quot;: TTL de &quot;%3&quot;: Tiempo de espera de %4: %5s</translation>
+ </message>
+ <message>
+ <source>network</source>
+ <translation>red</translation>
+ </message>
+ <message>
+ <source>USB bus</source>
+ <translation>Bus USB</translation>
+ </message>
+ <message>
+ <source>parallel port</source>
+ <translation>puerto paralelo</translation>
+ </message>
+ <message>
+ <source>Model</source>
+ <translation>Modelo</translation>
+ </message>
+ <message>
+ <source>Serial No.</source>
+ <translation>Serie No.</translation>
+ </message>
+ <message>
+ <source>IP Address</source>
+ <translation>Dirección IP</translation>
+ </message>
+ <message>
+ <source>Host Name</source>
+ <translation>Nombre de host</translation>
+ </message>
+ <message>
+ <source>Device</source>
+ <translation>Dispositivo</translation>
+ </message>
+ <message>
+ <source>Device URI</source>
+ <translation>URI del dispositivo</translation>
+ </message>
+ <message>
+ <source>%1 device(s) found on the %1:</source>
+ <translation>%1 dispositivos encontrados en %1:</translation>
+ </message>
+ <message>
+ <source>%1 device(s) found on the %1 at address %2:</source>
+ <translation>%1 dispositivos encontrados en %1 en la dirección %2:</translation>
+ </message>
+ <message>
+ <source>%1 device(s) found on the %1 at ID %2:</source>
+ <translation>%1 dispositivos encontrados en %1 en el ID %2:</translation>
+ </message>
+ <message>
+ <source>%1 device(s) found on the %1 device node ID %2:</source>
+ <translation>%1 dispositivos encontrados en %1 en el ID de nodo de dispositivo %2:</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Device not found or invalid HPLIP device.&lt;/b&gt;&lt;p&gt;If you specified a USB ID, IP address, or other parameter, please re-check it and try again.</source>
+ <translation>&lt;b&gt;No se encontró el dispositivo o es un dispositivo HPLIP no válido.&lt;/b&gt;&lt;p&gt;Si especificó un ID de USB, una dirección de IP u otro parámetro, vuelva a comprobarlo e inténtelo de nuevo.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;PPD not file found.&lt;/b&gt;&lt;p&gt;An appropriate PPD file could not be found. Please check your HPLIP install, use &lt;i&gt;Select Other...&lt;/i&gt;, or download one from linuxprinting.org.</source>
+ <translation>&lt;b&gt;No se encontró archivo PPD.&lt;/b&gt;&lt;p&gt;No se ha encontrado el archivo PPD correspondiente. Compruebe la instalación de HPLIP, utilice &lt;i&gt;Seleccionar otro...&lt;/i&gt;, o descargue uno de linuxprinting.org.</translation>
+ </message>
+ <message>
+ <source>You must enter a name for the printer.</source>
+ <translation>Debe introducir un nombre para la impresora.</translation>
+ </message>
+ <message>
+ <source>A printer already exists with this name. Please choose a different name.</source>
+ <translation>Ya existe una impresora con ese nombre. Seleccione un nombre diferente.</translation>
+ </message>
+ <message>
+ <source>You must enter a fax name.</source>
+ <translation>Debe introducir un nombre de fax.</translation>
+ </message>
+ <message>
+ <source>A fax already exists with this name. Please choose a different name.</source>
+ <translation>Ya existe un fax con ese nombre. Seleccione un nombre diferente.</translation>
+ </message>
+ <message>
+ <source>Unable to communicate with the device. Please check the device and try again.</source>
+ <translation>No se pudo comunicar con el dispositivo. Compruebe el dispositivo e inténtelo de nuevo.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Device I/O Error&lt;/b&gt;&lt;p&gt;Could not communicate with device. Device may be busy.</source>
+ <translation>&lt;b&gt;Error de E/S del dispositivo&lt;/b&gt;&lt;p&gt;No se pudo comunicar con del dispositivo. Dispositivo posiblemente ocupado.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Printer queue setup failed.&lt;/b&gt;&lt;p&gt;Please restart CUPS and try again.</source>
+ <translation>&lt;b&gt;No se pudo realizar la configuración de cola de impresión.&lt;/b&gt;&lt;p&gt;Reinicie CUPS e inténtelo de nuevo.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Unable to find HP fax PPD file.&lt;/b&gt;&lt;p&gt;Please check you HPLIP installation and try again.</source>
+ <translation>&lt;b&gt;No se encontró archivo PPD de fax HP.&lt;/b&gt;&lt;p&gt;Compruebe la instalación de HPLIP e inténtelo de nuevo.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Fax queue setup failed.&lt;/b&gt;&lt;p&gt;Please restart CUPS and try again.</source>
+ <translation>&lt;b&gt;No se pudo realizar la configuración de cola de fax.&lt;/b&gt;&lt;p&gt;Reinicie CUPS e inténtelo de nuevo.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Unable to print to printer.&lt;/b&gt;&lt;p&gt;Please check device and try again.</source>
+ <translation>&lt;b&gt;El dispositivo está ocupado o no está disponible.&lt;/b&gt;&lt;p&gt;Compruebe el dispositivo e inténtelo de nuevo.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;No CUPS queue found for device.&lt;/b&gt;&lt;p&gt;Please install the printer in CUPS and try again.</source>
+ <translation>&lt;b&gt;No se encontró cola de CUPS para dispositivo.&lt;/b&gt;&lt;p&gt;Instale la impresora en CUPS e inténtelo de nuevo.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Printer Error.&lt;/b&gt;&lt;p&gt;Printer is busy, offline, or in an error state. Please check the device and try again.</source>
+ <translation>&lt;b&gt;Error de la impresora.&lt;/b&gt;&lt;p&gt;La impresora está ocupada, fuera de línea o en un estado de error. Compruebe el dispositivo e inténtelo de nuevo.</translation>
+ </message>
+</context>
+<context>
+ <name>SetupForm_base</name>
+ <message>
+ <source>PPD File</source>
+ <translation>Archivo PPD</translation>
+ </message>
+ <message>
+ <source>Description</source>
+ <translation>Descripción</translation>
+ </message>
+ <message>
+ <source>HP Device Manger - Printer Setup Wizard</source>
+ <translation>Administrador de dispositivos HP: Asistente de configuración de impresoras</translation>
+ </message>
+ <message>
+ <source>Connection (I/O) Type</source>
+ <translation>Tipo de (E/S) conexión</translation>
+ </message>
+ <message>
+ <source>Universal Serial Bus (USB)</source>
+ <translation>Bus serie universal (USB)</translation>
+ </message>
+ <message>
+ <source>Network/Ethernet/Wireless (direct connection or JetDirect)</source>
+ <translation>Red/Ethernet/Inalámbrico (conexión directa o JetDirect)</translation>
+ </message>
+ <message>
+ <source>Parallel Port (LPT)</source>
+ <translation>Puerto paralelo (LPT)</translation>
+ </message>
+ <message>
+ <source>Advanced...</source>
+ <translation>Avanzado...</translation>
+ </message>
+ <message>
+ <source>Choose Connection Type</source>
+ <translation>Elegir tipo de conexión</translation>
+ </message>
+ <message>
+ <source>probeHeadingTextLabel</source>
+ <translation>probeHeadingTextLabel</translation>
+ </message>
+ <message>
+ <source>Find Manually...</source>
+ <translation>Buscar manualmente...</translation>
+ </message>
+ <message>
+ <source>Refresh</source>
+ <translation>Refrescar</translation>
+ </message>
+ <message>
+ <source>Select from Discovered Devices</source>
+ <translation>Seleccionar de dispositivos detectados</translation>
+ </message>
+ <message>
+ <source>Select Other...</source>
+ <translation>Seleccionar otro...</translation>
+ </message>
+ <message>
+ <source>Defaults</source>
+ <translation>Predeterminados</translation>
+ </message>
+ <message>
+ <source>Please chose the PPD file (by name and description) that most closely matches your printer. &lt;i&gt;Note: The model name of the printer may vary somehwat from the PPD file name, for example, a Deskjet 5550 may have a PPD file with the model name of Deskjet_5500_series.&lt;/i&gt;</source>
+ <translation>Elija el archivo PPD (por nombre y descripción) que más se iguala con la impresora. &lt;i&gt;Nota: El nombre de modelo de la impresora varía algo con respecto al nombre del archivo PPD; por ejemplo, puede que una Deskjet 5550 tenga un archivo PPD con el nombre del modelo de Deskjet_5500_series.&lt;/i&gt;</translation>
+ </message>
+ <message>
+ <source>Select/Confirm PPD File</source>
+ <translation>Seleccionar/Confirmar archivo PPD</translation>
+ </message>
+ <message>
+ <source>Printer Information</source>
+ <translation>Información de la impresora</translation>
+ </message>
+ <message>
+ <source>Default</source>
+ <translation>Predeterminado</translation>
+ </message>
+ <message>
+ <source>Location:</source>
+ <translation>Ubicación:</translation>
+ </message>
+ <message>
+ <source>Printer Name:</source>
+ <translation>Nombre de la impresora:</translation>
+ </message>
+ <message>
+ <source>Description:</source>
+ <translation>Descripción:</translation>
+ </message>
+ <message>
+ <source>Fax Information</source>
+ <translation>Información del fax</translation>
+ </message>
+ <message>
+ <source>Fax Name:</source>
+ <translation>Nombre del fax:</translation>
+ </message>
+ <message>
+ <source>Name/Company:</source>
+ <translation>Nombre/Empresa:</translation>
+ </message>
+ <message>
+ <source>Fax Number:</source>
+ <translation>Número de fax:</translation>
+ </message>
+ <message>
+ <source>Setup PC send fax</source>
+ <translation>Configurar envío de fax de PC</translation>
+ </message>
+ <message>
+ <source>Click &quot;Next &gt;&quot; to install the printer on your system.</source>
+ <translation>Haga clic en &gt;&quot;Siguiente&gt;&quot; para instalar la impresora en el sistema.</translation>
+ </message>
+ <message>
+ <source>Enter Printer Information</source>
+ <translation>Introducir información de la impresora</translation>
+ </message>
+ <message>
+ <source>Send test page to printer</source>
+ <translation>Enviar página de prueba a la impresora</translation>
+ </message>
+ <message>
+ <source>Fax Summary</source>
+ <translation>Resumen del fax</translation>
+ </message>
+ <message>
+ <source>Printer Summary</source>
+ <translation>Resumen de la impresora</translation>
+ </message>
+ <message>
+ <source>PPD File:</source>
+ <translation>Archivo PPD:</translation>
+ </message>
+ <message>
+ <source>The printer has been successfully installed on your system.</source>
+ <translation>La impresora se ha instalado con éxito en el sistema.</translation>
+ </message>
+ <message>
+ <source>Finished Adding Printer</source>
+ <translation>Adición de impresora finalizada</translation>
+ </message>
+</context>
+<context>
+ <name>SetupManualFind</name>
+ <message>
+ <source>Please enter the printer&apos;s network hostname or IP address.</source>
+ <translation>Introduzca el nombre de host de red de la impresora o la dirección IP.</translation>
+ </message>
+ <message>
+ <source>&lt;i&gt;(IPv4 address &quot;a.b.c.d&quot; or &quot;hostname&quot;.)&lt;/i&gt;</source>
+ <translation>&lt;i&gt;(dirección IPv4 &quot;a.b.c.d&quot; o &quot;nombre de host&quot;.)&lt;/i&gt;</translation>
+ </message>
+ <message>
+ <source>Hostname or IP Address:</source>
+ <translation>Nombre de host o dirección IP:</translation>
+ </message>
+ <message>
+ <source>Please enter the USB ID for the printer.</source>
+ <translation>Introduzca el ID de USB de la impresora.</translation>
+ </message>
+ <message>
+ <source>&lt;i&gt;(&quot;xxx:yyy&quot; where xxx is the USB bus ID and yyy is the USB device ID. The &apos;:&apos; and all leading zeroes must be present. Use &apos;lsusb&apos; to determine this information.)&lt;/i&gt;</source>
+ <translation>&lt;i&gt;(&quot;xxx:yyy&quot; donde xxx corresponde al ID de bus USB e yyy corresponde al ID de dispositivo USB. Debe incluirse &apos;:&apos; y todos los ceros a la izquierda. Utilice &apos;lsusb&apos; para determinar esta información.)&lt;/i&gt;</translation>
+ </message>
+ <message>
+ <source>USB ID:</source>
+ <translation>ID de USB:</translation>
+ </message>
+ <message>
+ <source>Please enter the filesystem device node for the printer.</source>
+ <translation>Introduzca el nodo de dispositivo del sistema de archivos para la impresora.</translation>
+ </message>
+ <message>
+ <source> &lt;i&gt;(&quot;/dev/parportX&quot;, X=0,1,2,...)&lt;/i&gt;</source>
+ <translation>&lt;i&gt;(&quot;/dev/parportX&quot;, X=0,1,2,...)&lt;/i&gt;</translation>
+ </message>
+ <message>
+ <source>Device Node:</source>
+ <translation>Nodo de dispositivo:</translation>
+ </message>
+</context>
+<context>
+ <name>SetupManualFind_base</name>
+ <message>
+ <source>HP Device Manager - Manually Find Device</source>
+ <translation>Administrador de dispositivos HP: Buscar dispositivo manualmente</translation>
+ </message>
+ <message>
+ <source>TEXT</source>
+ <translation>TEXTO</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Cancelar</translation>
+ </message>
+ <message>
+ <source>Find</source>
+ <translation>Buscar</translation>
+ </message>
+ <message>
+ <source>textLabel1</source>
+ <translation>textLabel1</translation>
+ </message>
+ <message>
+ <source>IP/HN/SER/USB/DEV:</source>
+ <translation>IP/HN/SER/USB/DEV:</translation>
+ </message>
+</context>
+<context>
+ <name>SetupSettings_base</name>
+ <message>
+ <source>HP Device Manager - Setup Filters, Search and Settings</source>
+ <translation>Administrador de dispositivos HP; Configurar filtros, búsqueda y ajustes</translation>
+ </message>
+ <message>
+ <source>Discovery Filter</source>
+ <translation>Filtro de detección</translation>
+ </message>
+ <message>
+ <source>Discover all devices</source>
+ <translation>Detectar todos los dispositivos</translation>
+ </message>
+ <message>
+ <source>Only discover devices that support the following functionality:</source>
+ <translation>Sólo dispositivos detectados que soporten la siguiente funcionalidad:</translation>
+ </message>
+ <message>
+ <source>PC Initiated Copying</source>
+ <translation>Copia iniciada por PC</translation>
+ </message>
+ <message>
+ <source>PC Photocard Access</source>
+ <translation>Acceso a tarjeta fotográfica de PC</translation>
+ </message>
+ <message>
+ <source>Scan to PC</source>
+ <translation>Escanear en PC</translation>
+ </message>
+ <message>
+ <source>PC Send Fax</source>
+ <translation>Envío de fax de PC</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Cancelar</translation>
+ </message>
+ <message>
+ <source>Defaults</source>
+ <translation>Predeterminados</translation>
+ </message>
+ <message>
+ <source>Discovery Search</source>
+ <translation>Búsqueda de detección</translation>
+ </message>
+ <message>
+ <source>Search Term:</source>
+ <translation>Buscar término:</translation>
+ </message>
+ <message>
+ <source>Network Discovery Settings</source>
+ <translation>Ajustes de detección de red</translation>
+ </message>
+ <message>
+ <source>TTL:</source>
+ <translation>TTL:</translation>
+ </message>
+ <message>
+ <source>Timeout (secs):</source>
+ <translation>Tiempo de espera (segundos):</translation>
+ </message>
+</context>
+<context>
+ <name>StringTable</name>
+ <message>
+ <source>Unknown</source>
+<translation>Desconocido</translation>
+ </message>
+ <message>
+ <source>Please correct the problem and try again.</source>
+<translation>Corrija el problema e inténtelo de nuevo.</translation>
+ </message>
+ <message>
+ <source>Please correct the problem and press continue on the printer.</source>
+<translation>Corrija el problema y presione Continuar en la impresora.</translation>
+ </message>
+ <message>
+ <source>The printer has started a print job.</source>
+<translation>La impresora ha comenzado un trabajo de impresión.</translation>
+ </message>
+ <message>
+ <source>Print job has completed.</source>
+<translation>Trabajo de impresión completado.</translation>
+ </message>
+ <message>
+ <source>Started rendering a fax job.</source>
+<translation>Iniciada la producción de un trabajo de fax.</translation>
+ </message>
+ <message>
+ <source>Rendering job completed.</source>
+<translation>Trabajo de producción completado.</translation>
+ </message>
+ <message>
+ <source>The printer is idle.</source>
+<translation>La impresora está inactiva.</translation>
+ </message>
+ <message>
+ <source>The printer is busy.</source>
+<translation>La impresora está ocupada.</translation>
+ </message>
+ <message>
+ <source>The print job is continuing.</source>
+<translation>El trabajo de impresión continúa.</translation>
+ </message>
+ <message>
+ <source>Turning off.</source>
+<translation>Apagando.</translation>
+ </message>
+ <message>
+ <source>Report printing.</source>
+<translation>Impresión de informes.</translation>
+ </message>
+ <message>
+ <source>Canceling.</source>
+<translation>Cancelando.</translation>
+ </message>
+ <message>
+ <source>Waiting for ink to dry.</source>
+<translation>Esperando a que la tinta se seque.</translation>
+ </message>
+ <message>
+ <source>Pen change.</source>
+<translation>Cambio de pluma.</translation>
+ </message>
+ <message>
+ <source>The printer is out of paper.</source>
+<translation>La impresora no tiene papel.</translation>
+ </message>
+ <message>
+ <source>Please load more paper and follow the instructions on the front panel (if any) to continue printing.</source>
+<translation>Coloque más papel y siga las instrucciones del panel frontal (si lo hay) para continuar imprimiendo.</translation>
+ </message>
+ <message>
+ <source>Banner eject needed.</source>
+<translation>Se requiere expulsar hoja de separación.</translation>
+ </message>
+ <message>
+ <source>Banner mismatch.</source>
+<translation>Las hojas de separación no coinciden.</translation>
+ </message>
+ <message>
+ <source>Photo mismatch.</source>
+<translation>Las fotos no coinciden.</translation>
+ </message>
+ <message>
+ <source>Duplex mismatch.</source>
+<translation>Los datos de dúplex no coinciden.</translation>
+ </message>
+ <message>
+ <source>Paper or cartridge carriage jammed.</source>
+<translation>Papel o carro de cartuchos atascado.</translation>
+ </message>
+ <message>
+ <source>Please clear the jam and press continue on the printer.</source>
+<translation>Elimine el atasco y presione 'Continuar' en la impresora.</translation>
+ </message>
+ <message>
+ <source>There is a problem with a cartridge.</source>
+<translation>Hay un problema con un cartucho.</translation>
+ </message>
+ <message>
+ <source>Powering down.</source>
+<translation>Apagando.</translation>
+ </message>
+ <message>
+ <source>Front panel test.</source>
+<translation>Prueba del panel frontal.</translation>
+ </message>
+ <message>
+ <source>Clean out tray missing.</source>
+<translation>Falta la bandeja de limpieza.</translation>
+ </message>
+ <message>
+ <source>Output bin full.</source>
+<translation>Bandeja de salida llena.</translation>
+ </message>
+ <message>
+ <source>Media size mismatch.</source>
+<translation>Los tamaños de medios no coinciden.</translation>
+ </message>
+ <message>
+ <source>Duplexer is jammed.</source>
+<translation>Unidad dúplex atascada.</translation>
+ </message>
+ <message>
+ <source>An ink cartridge is out of ink.</source>
+<translation>Tinta agotada en un cartucho.</translation>
+ </message>
+ <message>
+ <source>Internal device error.</source>
+<translation>Error de dispositivo interno.</translation>
+ </message>
+ <message>
+ <source>Second tray missing.</source>
+<translation>Falta la segunda bandeja.</translation>
+ </message>
+ <message>
+ <source>Duplexer missing.</source>
+<translation>Falta la unidad dúplex.</translation>
+ </message>
+ <message>
+ <source>Rear tray missing.</source>
+<translation>Falta la bandeja posterior.</translation>
+ </message>
+ <message>
+ <source>Cartridge not latched.</source>
+<translation>El cartucho no está trabado.</translation>
+ </message>
+ <message>
+ <source>Battery very low.</source>
+<translation>Batería muy baja.</translation>
+ </message>
+ <message>
+ <source>Output tray closed.</source>
+<translation>Bandeja de salida cerrada.</translation>
+ </message>
+ <message>
+ <source>Manual feed blocked.</source>
+<translation>Alimentación manual bloqueada.</translation>
+ </message>
+ <message>
+ <source>Rear feed blocked.</source>
+<translation>Alimentación posterior bloqueada.</translation>
+ </message>
+ <message>
+ <source>Second tray out of paper.</source>
+<translation>Segunda bandeja sin papel.</translation>
+ </message>
+ <message>
+ <source>Input tray locked.</source>
+<translation>Bandeja de entrada bloqueada.</translation>
+ </message>
+ <message>
+ <source>Non-HP ink.</source>
+<translation>Tinta no de HP.</translation>
+ </message>
+ <message>
+ <source>Pen calibration needs resume.</source>
+<translation>La calibración de plumas necesita reanudarse.</translation>
+ </message>
+ <message>
+ <source>Media type mismatch.</source>
+<translation>Los tamaños de medios no coinciden.</translation>
+ </message>
+ <message>
+ <source>Custom media mismatch.</source>
+<translation>Los medios personalizados no coinciden.</translation>
+ </message>
+ <message>
+ <source>Pen cleaning in progress.</source>
+<translation>Limpieza de plumas ejecutándose.</translation>
+ </message>
+ <message>
+ <source>Pen checking in progress.</source>
+<translation>Comprobación de plumas ejecutándose.</translation>
+ </message>
+ <message>
+ <source>Black cartridge is low on ink</source>
+<translation>El cartucho de color negro tiene poca tinta</translation>
+ </message>
+ <message>
+ <source>Tri-color cartridge is low on ink</source>
+<translation>El cartucho tricolor tiene poca tinta</translation>
+ </message>
+ <message>
+ <source>Photo cartridge is low on ink</source>
+<translation>El cartucho fotográfico tiene poca tinta</translation>
+ </message>
+ <message>
+ <source>Cyan cartridge is low on ink</source>
+<translation>El cartucho de color cian tiene poca tinta</translation>
+ </message>
+ <message>
+ <source>Magenta cartridge is low on ink</source>
+<translation>El cartucho de color magenta tiene poca tinta</translation>
+ </message>
+ <message>
+ <source>Yellow cartridge is low on ink</source>
+<translation>El cartucho de color amarillo tiene poca tinta</translation>
+ </message>
+ <message>
+ <source>Photo cyan cartridge is low on ink</source>
+<translation>El cartucho fotográfico de color cian tiene poca tinta</translation>
+ </message>
+ <message>
+ <source>Photo magenta cartridge is low on ink</source>
+<translation>El cartucho fotográfico de color magenta tiene poca tinta</translation>
+ </message>
+ <message>
+ <source>Photo yellow cartridge is low on ink</source>
+<translation>El cartucho fotográfico de color amarillo tiene poca tinta</translation>
+ </message>
+ <message>
+ <source>Photo gray cartridge is low on ink</source>
+<translation>El cartucho fotográfico de color gris tiene poca tinta</translation>
+ </message>
+ <message>
+ <source>Photo blue cartridge is low on ink</source>
+<translation>El cartucho fotográfico de color azul tiene poca tinta</translation>
+ </message>
+ <message>
+ <source>Black cartridge is low on toner</source>
+<translation>El cartucho de color negro tiene poco tóner</translation>
+ </message>
+ <message>
+ <source>Cyan cartridge is low on toner</source>
+<translation>El cartucho de color cian tiene poco tóner</translation>
+ </message>
+ <message>
+ <source>Magenta cartridge is low on toner</source>
+<translation>El cartucho de color magenta tiene poco tóner</translation>
+ </message>
+ <message>
+ <source>Yellow cartridge is low on toner</source>
+<translation>El cartucho de color amarillo tiene poco tóner</translation>
+ </message>
+ <message>
+ <source>Warming up.</source>
+<translation>Calentando.</translation>
+ </message>
+ <message>
+ <source>Low paper.</source>
+<translation>Poco papel.</translation>
+ </message>
+ <message>
+ <source>Door open.</source>
+<translation>Puerta abierta.</translation>
+ </message>
+ <message>
+ <source>Offline.</source>
+<translation>Fuera de línea.</translation>
+ </message>
+ <message>
+ <source>Low toner.</source>
+<translation>Poco tóner.</translation>
+ </message>
+ <message>
+ <source>No toner.</source>
+<translation>Tóner agotado.</translation>
+ </message>
+ <message>
+ <source>Service request.</source>
+<translation>Solicitud de reparación.</translation>
+ </message>
+ <message>
+ <source>Fuser error.</source>
+<translation>Error del fusor.</translation>
+ </message>
+ <message>
+ <source>Unsupported printer model.</source>
+<translation>Modelo de impresora incompatible.</translation>
+ </message>
+ <message>
+ <source>Scan job started.</source>
+<translation>Trabajo de escaneado iniciado.</translation>
+ </message>
+ <message>
+ <source>Scan job completed.</source>
+<translation>Trabajo de escaneado completado.</translation>
+ </message>
+ <message>
+ <source>Scan job failed.</source>
+<translation>El trabajo de escaneado falló.</translation>
+ </message>
+ <message>
+ <source>Fax job started.</source>
+<translation>Trabajo de fax iniciado.</translation>
+ </message>
+ <message>
+ <source>Fax job complete.</source>
+<translation>Trabajo de fax completado.</translation>
+ </message>
+ <message>
+ <source>Fax job failed.</source>
+<translation>El trabajo de fax falló.</translation>
+ </message>
+ <message>
+ <source>Fax job canceled.</source>
+<translation>Trabajo de fax cancelado.</translation>
+ </message>
+ <message>
+ <source>Fax send job continuing.</source>
+<translation>Trabajo de envío de fax continuando.</translation>
+ </message>
+ <message>
+ <source>Fax receive job continuing.</source>
+<translation>Trabajo de recepción de fax continuando.</translation>
+ </message>
+ <message>
+ <source>Copy job started.</source>
+<translation>Trabajo de copia iniciado.</translation>
+ </message>
+ <message>
+ <source>Copy job complete.</source>
+<translation>Trabajo de copia completado.</translation>
+ </message>
+ <message>
+ <source>Copy job failed.</source>
+<translation>El trabajo de copia falló.</translation>
+ </message>
+ <message>
+ <source>Copy job canceled.</source>
+<translation>Trabajo de copia cancelado.</translation>
+ </message>
+ <message>
+ <source>Device is powered down or unplugged.</source>
+<translation>El dispositivo está apagado o desconectado.</translation>
+ </message>
+ <message>
+ <source>Device communication error.</source>
+<translation>Error de comunicación del dispositivo.</translation>
+ </message>
+ <message>
+ <source>Device is busy.</source>
+<translation>Dispositivo ocupado.</translation>
+ </message>
+ <message>
+ <source>No data.</source>
+<translation>No hay datos.</translation>
+ </message>
+ <message>
+ <source>Unsupported I/O bus.</source>
+<translation>Bus de E/S incompatible.</translation>
+ </message>
+ <message>
+ <source>Device does not support requested operation.</source>
+<translation>El dispositivo no puede ejecutar la operación solicitada.</translation>
+ </message>
+ <message>
+ <source>To send a fax you must run hp-sendfax first.</source>
+<translation>Para enviar un fax, primero debe ejecutar hp-sendfax.</translation>
+ </message>
+ <message>
+ <source>Run hp-sendfax now to continue. Fax will resume within 10 seconds.</source>
+<translation>Ahora hp-sendfax continuará. El fax se reanudará en 10 segundos.</translation>
+ </message>
+ <message>
+ <source>Photocard unload started.</source>
+<translation>Descarga de la tarjeta fotográfica iniciada.</translation>
+ </message>
+ <message>
+ <source>Photocard unload ended.</source>
+<translation>Descarga de la tarjeta fotográfica finalizada.</translation>
+ </message>
+ <message>
+ <source>Photocard unload failed.</source>
+<translation>La descarga de la tarjeta fotográfica falló.</translation>
+ </message>
+ <message>
+ <source>Make sure photocard is inserted properly and try again.</source>
+<translation>Asegúrese de que la tarjeta fotográfica esté insertada correctamente e inténtelo de nuevo.</translation>
+ </message>
+ <message>
+ <source>Unable to mount photocard on device.</source>
+<translation>Imposible montar la tarjeta fotográfica en el dispositivo.</translation>
+ </message>
+ <message>
+ <source>Photocard unloaded successfully.</source>
+<translation>Tarjeta fotográfica descargada correctamente.</translation>
+ </message>
+ <message>
+ <source>Unknown error.</source>
+<translation>Error desconocido.</translation>
+ </message>
+ <message>
+ <source>Print</source>
+<translation>Instalador de Impresión e imágenes Linux de HP (HPLIP)</translation>
+ </message>
+ <message>
+ <source>Scan</source>
+<translation>Trabajo de escaneado iniciado.</translation>
+ </message>
+ <message>
+ <source>Send fax</source>
+<translation>Enviar fax</translation>
+ </message>
+ <message>
+ <source>Make copies</source>
+<translation>Hacer copias</translation>
+ </message>
+ <message>
+ <source>Access photo cards</source>
+<translation>Acceso a tarjetas fotográficas</translation>
+ </message>
+ <message>
+ <source>Invalid/missing</source>
+<translation>No válido o falta</translation>
+ </message>
+ <message>
+ <source>Invalid/missing ink cartridge</source>
+<translation>Cartucho de tinta no válido o falta.</translation>
+ </message>
+ <message>
+ <source>Invalid/missing cartridge</source>
+<translation>Cartucho no válido o falta</translation>
+ </message>
+ <message>
+ <source>Invalid/missing print head</source>
+<translation>Cabezal de impresión no válido o falta</translation>
+ </message>
+ <message>
+ <source>Black print head</source>
+<translation>Cabezal de impresión negro</translation>
+ </message>
+ <message>
+ <source>Black ink cartridge</source>
+<translation>Cartucho de tinta negra</translation>
+ </message>
+ <message>
+ <source>Black cartridge</source>
+<translation>El cartucho de color negro tiene poca tinta</translation>
+ </message>
+ <message>
+ <source>Tri-color print head</source>
+<translation>Cabezal de impresión tricolor</translation>
+ </message>
+ <message>
+ <source>Tri-color ink cartridge</source>
+<translation>Cartucho de tinta tricolor</translation>
+ </message>
+ <message>
+ <source>Tri-color cartridge</source>
+<translation>El cartucho tricolor tiene poca tinta</translation>
+ </message>
+ <message>
+ <source>Photo print head</source>
+<translation>Cabezal de impresión fotográfico</translation>
+ </message>
+ <message>
+ <source>Photo ink cartridge</source>
+<translation>Cartucho de tinta fotográfico</translation>
+ </message>
+ <message>
+ <source>Photo cartridge</source>
+<translation>El cartucho fotográfico tiene poca tinta</translation>
+ </message>
+ <message>
+ <source>Cyan print head</source>
+<translation>Cabezal de impresión cian</translation>
+ </message>
+ <message>
+ <source>Cyan ink cartridge</source>
+<translation>Cartucho de tinta cian</translation>
+ </message>
+ <message>
+ <source>Cyan cartridge</source>
+<translation>El cartucho de color cian tiene poca tinta</translation>
+ </message>
+ <message>
+ <source>Magenta print head</source>
+<translation>Cabezal de impresión magenta</translation>
+ </message>
+ <message>
+ <source>Magenta ink cartridge</source>
+<translation>Cartucho de tinta magenta</translation>
+ </message>
+ <message>
+ <source>Magenta cartridge</source>
+<translation>El cartucho de color magenta tiene poca tinta</translation>
+ </message>
+ <message>
+ <source>Yellow print head</source>
+<translation>Cabezal de impresión amarillo</translation>
+ </message>
+ <message>
+ <source>Yellow ink cartridge</source>
+<translation>Cartucho de tinta amarilla</translation>
+ </message>
+ <message>
+ <source>Yellow cartridge</source>
+<translation>El cartucho de color amarillo tiene poca tinta</translation>
+ </message>
+ <message>
+ <source>Photo cyan print head</source>
+<translation>Cabezal de impresión fotográfico cian</translation>
+ </message>
+ <message>
+ <source>Photo cyan ink cartridge</source>
+<translation>Cartucho de tinta fotográfico cian</translation>
+ </message>
+ <message>
+ <source>Photo cyan cartridge</source>
+<translation>El cartucho fotográfico de color cian tiene poca tinta</translation>
+ </message>
+ <message>
+ <source>Photo magenta print head</source>
+<translation>Cabezal de impresión fotográfico magenta</translation>
+ </message>
+ <message>
+ <source>Photo magenta ink cartridge</source>
+<translation>Cartucho de tinta fotográfico magenta</translation>
+ </message>
+ <message>
+ <source>Photo magenta cartridge</source>
+<translation>El cartucho fotográfico de color magenta tiene poca tinta</translation>
+ </message>
+ <message>
+ <source>Photo yellow print head</source>
+<translation>Cabezal de impresión fotográfico amarillo</translation>
+ </message>
+ <message>
+ <source>Photo yellow ink cartridge</source>
+<translation>Cartucho de tinta fotográfico amarillo</translation>
+ </message>
+ <message>
+ <source>Photo yellow cartridge</source>
+<translation>El cartucho fotográfico de color amarillo tiene poca tinta</translation>
+ </message>
+ <message>
+ <source>Photo gray print head</source>
+<translation>Cabezal de impresión fotográfico gris</translation>
+ </message>
+ <message>
+ <source>Photo gray ink cartridge</source>
+<translation>Cartucho de tinta fotográfico gris</translation>
+ </message>
+ <message>
+ <source>Photo gray cartridge</source>
+<translation>El cartucho fotográfico de color gris tiene poca tinta</translation>
+ </message>
+ <message>
+ <source>Photo blue print head</source>
+<translation>Cabezal de impresión fotográfico azul</translation>
+ </message>
+ <message>
+ <source>Photo blue ink cartridge</source>
+<translation>Cartucho de tinta fotográfico azul</translation>
+ </message>
+ <message>
+ <source>Photo blue cartridge</source>
+<translation>El cartucho fotográfico de color azul tiene poca tinta</translation>
+ </message>
+ <message>
+ <source>Print head</source>
+<translation>Cabezal de impresión</translation>
+ </message>
+ <message>
+ <source>Photo magenta and photo cyan print head</source>
+<translation>Cabezal de impresión fotográfico magenta y cian</translation>
+ </message>
+ <message>
+ <source>Magenta and yellow print head</source>
+<translation>Cabezal de impresión magenta y amarillo</translation>
+ </message>
+ <message>
+ <source>Black and cyan print head</source>
+<translation>Cabezal de impresión negro y cian</translation>
+ </message>
+ <message>
+ <source>Light gray and photo black print head</source>
+<translation>Cabezal de impresión fotográfico gris claro y negro</translation>
+ </message>
+ <message>
+ <source>Light gray ink cartridge</source>
+<translation>Cartucho de tinta gris claro</translation>
+ </message>
+ <message>
+ <source>Medium gray ink cartridge</source>
+<translation>Cartucho de tinta gris medio</translation>
+ </message>
+ <message>
+ <source>Photo black ink cartridge</source>
+<translation>Cartucho de impresión fotográfico negro</translation>
+ </message>
+ <message>
+ <source>Cyan and magenta print head</source>
+<translation>Cabezal de impresión cian y magenta</translation>
+ </message>
+ <message>
+ <source>Black and yellow print head</source>
+<translation>Cabezal de impresión negro y amarillo</translation>
+ </message>
+ <message>
+ <source>Black toner cartridge</source>
+<translation>Cartucho de tóner negro</translation>
+ </message>
+ <message>
+ <source>Cyan toner cartridge</source>
+<translation>Cartucho de tóner cian</translation>
+ </message>
+ <message>
+ <source>Magenta toner cartridge</source>
+<translation>Cartucho de tóner magenta</translation>
+ </message>
+ <message>
+ <source>Yellow toner cartridge</source>
+<translation>Cartucho de tóner amarillo</translation>
+ </message>
+ <message>
+ <source>Maintenance kit (fuser)</source>
+<translation>Kit de mantenimiento (fusor)</translation>
+ </message>
+ <message>
+ <source>Document feeder (ADF) kit</source>
+<translation>Kit del alimentador automático de documentos (ADF)</translation>
+ </message>
+ <message>
+ <source>Drum maintenance kit</source>
+<translation>Kit de mantenimiento de tambores</translation>
+ </message>
+ <message>
+ <source>Image transfer kit</source>
+<translation>Kit de transferencia de imágenes</translation>
+ </message>
+ <message>
+ <source>Good/OK</source>
+<translation>Bien/correcto</translation>
+ </message>
+ <message>
+ <source>Fair/Moderate</source>
+<translation>Regular/moderado</translation>
+ </message>
+ <message>
+ <source>Not installed</source>
+<translation>No instalado</translation>
+ </message>
+ <message>
+ <source>Incorrect</source>
+<translation>Incorrecto</translation>
+ </message>
+ <message>
+ <source>Failed</source>
+<translation>ERROR: La tarjeta fotográfica no se montó correctamente. Compruebe el dispositivo y la tarjeta e inténtelo de nuevo.</translation>
+ </message>
+ <message>
+ <source>Overheated</source>
+<translation>Sobrecalentado</translation>
+ </message>
+ <message>
+ <source>Discharging</source>
+<translation>Descargando</translation>
+ </message>
+ <message>
+ <source>Charging</source>
+<translation>Cargando</translation>
+ </message>
+ <message>
+ <source>Low</source>
+<translation>Poco papel.</translation>
+ </message>
+ <message>
+ <source>Very low</source>
+<translation>Muy bajo</translation>
+ </message>
+ <message>
+ <source>HPLIP: Email alert test message</source>
+<translation>HPLIP: Mensaje de prueba de alerta por correo electrónico</translation>
+ </message>
+ <message>
+ <source>This email is to test the functionality of HPLIP email alerts.</source>
+<translation>Este mensaje de correo electrónico sirve para comprobar el funcionamiento de las alertas por correo electrónico de HPLIB.</translation>
+ </message>
+ <message>
+ <source>HPLIP: Error/alert on device: </source>
+<translation>HPLIP: Error/alerta en dispositivo:</translation>
+ </message>
+</context>
+<context>
+ <name>SupportForm_base</name>
+ <message>
+ <source>HP Device Manager - Support Information</source>
+ <translation>Administrador de dispositivos HP: Información de configuración</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Cerrar</translation>
+ </message>
+ <message>
+ <source>http://hplip.sourceforge.net</source>
+ <translation>http://hplip.sourceforge.net</translation>
+ </message>
+ <message>
+ <source>HPLIP is free, open source software distributed under the MIT, BSD, and GPL licenses. &lt;b&gt;&lt;i&gt;HP does not provide formal consumer or commercial support for this software.&lt;/i&gt;&lt;/b&gt;&lt;p&gt; Support is provided informally through a series of resources on a Sourceforge.net website. On this HP sponsored website, you will find FAQs, open discussion forums, installation instructions, a product support table, and other support materials.</source>
+ <translation>HPLIP es un software libre de código abierto que se distribuye con licencias MIT, BSD y GPL. &lt;b&gt;&lt;i&gt;HP no proporciona soporte comercial o al consumidor de modo oficial para este software.&lt;/i&gt;&lt;/b&gt;&lt;p&gt; El soporte se proporciona de manera informal a través de una serie de recursos en un sitio Web Sourceforge.net. En este sitio Web patrocinado por HP, encontrará preguntas más frecuentes (FAQ), foros de discusión abierta, instrucciones de instalación, una tabla de soporte de productos y otros materiales de soporte.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;HP Sponsored Support&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Soporte patrocinado por HP&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>NOTE: Sourceforge.net is owned and operated by OSTG, Inc. and is not affiliated with HP.</source>
+ <translation>NOTA: Sourceforge.net es propiedad y está gestionado por OSTG, Inc. y no está afiliado a HP.</translation>
+ </message>
+ <message>
+ <source>HP</source>
+ <translation>HP</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;README File&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Archivo LÉAME&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>A readme file was shipped with your version of HPLIP. This file contains the product support table, a troubleshooting guide, and other support resources.</source>
+ <translation>Se ha incluido un archivo léame con la versión de HPLIP. Este archivo contiene la tabla de soporte de productos, una guía de resolución de problemas y otros recursos de soporte.</translation>
+ </message>
+ <message>
+ <source>hplip_readme.html</source>
+ <translation>hplip_readme.html</translation>
+ </message>
+ <message>
+ <source>README File</source>
+ <translation>Archivo LÉAME</translation>
+ </message>
+ <message>
+ <source>http://linuxprinting.org</source>
+ <translation>http://linuxprinting.org</translation>
+ </message>
+ <message>
+ <source>General Linux printing assistance is also available from open discussion forums, documentation, access to PPD files, etc. from:</source>
+ <translation>También encontrará asistencia general sobre impresión de Linux en foros de discusión abierta, documentación, acceso a archivos PPD, etc. en:</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;linuxprinting.org&lt;/b&gt;</source>
+ <translation>&lt;b&gt;linuxprinting.org&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>NOTE: Linuxprinting.org is operated through the generous efforts of Grant Taylor and Till Kamppeter and is not affiliated with HP.</source>
+ <translation>NOTA: Linuxprinting.org se gestiona a gracias a las generosas iniciativas de Grant Taylor y Till Kamppeter, y no está afiliado a HP.</translation>
+ </message>
+ <message>
+ <source>linuxprinting.org</source>
+ <translation>linuxprinting.org</translation>
+ </message>
+ <message>
+ <source>http://cups.org</source>
+ <translation>http://cups.org</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;CUPS&lt;/b&gt;</source>
+ <translation>&lt;b&gt;CUPS&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Information about CUPS (Common UNIX Printing System) is available at cups.org. This website also contains forums and other support resources for printing on Linux:</source>
+ <translation>Existe información disponible sobre CUPS (Common UNIX Printing System) en cups.org: Este sitio Web también incluye foros y otros recursos de soporte para imprimir en Linux:</translation>
+ </message>
+ <message>
+ <source>NOTE: CUPS and the CUPS website is owned and operated by Easy Software Products and is not affiliated with HP.</source>
+ <translation>NOTA: CUPS y el sitio Web CUPS son propiedad y están gestionados por Easy Software Products, y no están afiliados a HP.</translation>
+ </message>
+ <message>
+ <source>CUPS</source>
+ <translation>CUPS</translation>
+ </message>
+</context>
+<context>
+ <name>UnloadForm</name>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;No devices found that support photo card access.&lt;/b&gt;&lt;p&gt;Please make sure your device is properly installed and try again.</source>
+ <translation>&lt;p&gt;&lt;b&gt;No se encontraron dispositivos que soporten acceso a tarjetas fotográficas.&lt;/b&gt;&lt;p&gt;Asegúrese de que el dispositivo está instalado correctamente e inténtelo de nuevo.</translation>
+ </message>
+ <message>
+ <source>HP Device Manager - Unload Photo Card</source>
+ <translation>Administrador de dispositivos HP: Descargar tarjeta fotográfica</translation>
+ </message>
+</context>
+<context>
+ <name>UnloadForm_base</name>
+ <message>
+ <source>HP Device Manager - Unload Files from Photo Card</source>
+ <translation>Administrador de dispositivos HP: Descargar archivos de tarjeta fotográfica</translation>
+ </message>
+ <message>
+ <source>Device:</source>
+ <translation>Dispositivo:</translation>
+ </message>
+ <message>
+ <source>Unload Selected Files</source>
+ <translation>Descargar archivos seleccionados</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Cerrar</translation>
+ </message>
+ <message>
+ <source>Unload Directory:</source>
+ <translation>Descargar directorio:</translation>
+ </message>
+ <message>
+ <source>Browse...</source>
+ <translation>Examinar...</translation>
+ </message>
+ <message>
+ <source>File Removal:</source>
+ <translation>Eliminación de archivos:</translation>
+ </message>
+ <message>
+ <source>Leave all files on photo card</source>
+ <translation>Deja todos los archivos en la tarjeta fotográfica</translation>
+ </message>
+ <message>
+ <source>Remove selected files</source>
+ <translation>Eliminar los archivos seleccionados</translation>
+ </message>
+ <message>
+ <source>Select Files to Unload from Photo Card:</source>
+ <translation>Seleccionar archivos para descargar de la tarjeta fotográfica:</translation>
+ </message>
+ <message>
+ <source>Select All</source>
+ <translation>Seleccionar todo</translation>
+ </message>
+ <message>
+ <source>Select None</source>
+ <translation>No seleccionar ninguno</translation>
+ </message>
+ <message>
+ <source>Show Thumbnails</source>
+ <translation>Mostrar miniaturas</translation>
+ </message>
+</context>
+<context>
+ <name>WaitForm_base</name>
+ <message>
+ <source>HP Device Manager - Waiting</source>
+ <translation>Administrador de dispositivos HP: Esperando</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Waiting for procedure to finish...&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Esperando a que finalice el procedimiento...&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Cancelar</translation>
+ </message>
+</context>
+<context>
+ <name>self.form.FailureUI</name>
+ <message>
+ <source>&lt;b&gt;Unable to mount photo card on device.&lt;/b&gt;&lt;p&gt;Check that device is powered on and photo card is correctly inserted.</source>
+<translation>&lt;b&gt;No se pudo montar la tarjeta fotográfica en el dispositivo.&lt;/b&gt;&lt;p&gt;Verifique que el dispositivo está encendido y que la tarjeta fotográfica está insertada correctamente.</translation>
+ </message>
+</context>
+</TS>
diff --git a/data/localization/hplip_fr.qm b/data/localization/hplip_fr.qm
new file mode 100644
index 0000000..28b2c4e
--- /dev/null
+++ b/data/localization/hplip_fr.qm
Binary files differ
diff --git a/data/localization/hplip_fr.ts b/data/localization/hplip_fr.ts
new file mode 100755
index 0000000..4f457d9
--- /dev/null
+++ b/data/localization/hplip_fr.ts
@@ -0,0 +1,5048 @@
+<!DOCTYPE TS><TS>
+<context>
+ <name>@default</name>
+ <message>
+ <source>&lt;b&gt;Unable to mount photo card on device.&lt;/b&gt;&lt;p&gt;Check that device is powered on and photo card is correctly inserted.</source>
+<translation>&lt;b&gt;Impossible de monter la carte photo sur le périphérique.&lt;/b&gt;&lt;p&gt;Assurez-vous que le périphérique est en marche et que la carte photo est correctement installée.</translation>
+ </message>
+</context>
+<context>
+ <name>AboutDlg_base</name>
+ <message>
+ <source>HP Device Manager - About</source>
+ <translation>Gestionnaire de périphériques HP – A propos</translation>
+ </message>
+ <message>
+ <source>&lt;font size=&quot;+3&quot;&gt;&lt;p align=&quot;center&quot;&gt;HP Linux Imaging and Printing (HPLIP)&lt;/p&gt;&lt;/font&gt;</source>
+ <translation>&lt;font size=&quot;+3&quot;&gt;&lt;p align=&quot;center&quot;&gt;Imagerie et impression Linux HP (HPLIP)&lt;/p&gt;&lt;/font&gt;</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Fermer</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;HPLIP Software Version:&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Version du logiciel HPLIP :&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>0.0.0</source>
+ <translation>0.0.0</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Device Manager Software Version:&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Version du logiciel Gestionnaire de périphériques&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Authors and Contributors:&lt;/b&gt;\nDavid Suffield, Don Welch, Shiyun Yie, Raghothama Cauligi, John Oleinik, Cory Meisch, Foster Nuffer, Pete Parks, Jacqueline Pitter, David Paschal,\nSteve DeRoos, Mark Overton, Aaron Albright, Smith Kennedy, John Hosszu, Chris Wiesner, Henrique M. Holschuh, Till Kamppeter, Linus Araque, Mark Crawford, Charlie Moore</source>
+ <translation>&lt;b&gt;Auteurs et contributeurs :&lt;/b&gt;
+David Suffield, Don Welch, Shiyun Yie, Raghothama Cauligi, John Oleinik, Cory Meisch, Foster Nuffer, Pete Parks, Jacqueline Pitter, David Paschal,
+Steve DeRoos, Mark Overton, Aaron Albright, Smith Kennedy, John Hosszu, Chris Wiesner, Henrique M. Holschuh, Till Kamppeter, Linus Araque, Mark Crawford, Charlie Moore</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;License and Copyright:&lt;/b&gt;
+(c) Copyright 2006 Hewlett-Packard Development Company, L.P. This software is licensed under the GNU General Public License (GPL), BSD, and MIT licenses. See the software sources for details.</source>
+ <translation>&lt;b&gt;Licence et copyright :&lt;/b&gt;
+(c) Copyright 2006 Hewlett-Packard Development Company, L.P. Ce logiciel bénéficie des licences GPL GNU, BSD et MIT. Pour plus d&apos;informations, consultez les sources du logiciel.</translation>
+ </message>
+</context>
+<context>
+ <name>Align10Form_Base</name>
+ <message>
+ <source>HP Device Manager - Alignment</source>
+ <translation>Gestionnaire de périphériques HP - Alignement</translation>
+ </message>
+ <message>
+ <source>Examine the page that was printed. Several rows of boxes, each made up of thin lines, appear on the printed page.&lt;p&gt;
+For each row, select the label representing the box in which the shorter inner lines are the most aligned with the longer outer lines..</source>
+ <translation>Examinez la page imprimée. Plusieurs rangées de cadres, chacun composé de lignes fines, apparaissent sur la page imprimée.&lt;p&gt;
+Pour chaque rangée, sélectionnez l&apos;étiquette qui représente le cadre dans lequel les lignes les plus courtes à l&apos;intérieur sont le mieux alignées avec les lignes les plus longues à l&apos;extérieur.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;B:&lt;/font&gt;&lt;/b&gt;</source>
+ <translation>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;B :&lt;/font&gt;&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;F:&lt;/font&gt;&lt;/b&gt;</source>
+ <translation>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;F :&lt;/font&gt;&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;C:&lt;/font&gt;&lt;/b&gt;</source>
+ <translation>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;C :&lt;/font&gt;&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;D:&lt;/font&gt;&lt;/b&gt;</source>
+ <translation>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;D :&lt;/font&gt;&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;G:&lt;/font&gt;&lt;/b&gt;</source>
+ <translation>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;G :&lt;/font&gt;&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;A:&lt;/font&gt;&lt;/b&gt;</source>
+ <translation>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;A :&lt;/font&gt;&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;E:&lt;/font&gt;&lt;/b&gt;</source>
+ <translation>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;E :&lt;/font&gt;&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;H:&lt;/font&gt;&lt;/b&gt;</source>
+ <translation>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;H :&lt;/font&gt;&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Next &gt;</source>
+ <translation>Suivant &gt;</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Annuler</translation>
+ </message>
+</context>
+<context>
+ <name>AlignForm</name>
+ <message>
+ <source>HP Device Manager - Alignment</source>
+ <translation>Gestionnaire de périphériques HP - Alignement</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Annuler</translation>
+ </message>
+ <message>
+ <source>Next &gt;</source>
+ <translation>Suivant &gt;</translation>
+ </message>
+ <message>
+ <source>Choose the set of lines where the line segments are &lt;b&gt;best&lt;/b&gt; aligned.</source>
+ <translation>Choisissez un motif dans lequel les segments sont &lt;b&gt;best&lt;/b&gt; alignés.</translation>
+ </message>
+</context>
+<context>
+ <name>AlignType6Form1_base</name>
+ <message>
+ <source>HP Device Manager - Alignment</source>
+ <translation>Gestionnaire de périphériques HP - Alignement</translation>
+ </message>
+ <message>
+ <source>To perform alignment, you will need the &lt;b&gt;alignment page&lt;/b&gt; that is automatically printed after you install a print cartridge.
+&lt;p&gt; If you do &lt;b&gt;not&lt;/b&gt; have this page, click &lt;i&gt;Print Page&lt;/i&gt;.
+&lt;p&gt;If you already have this page, click &lt;i&gt;Next &gt;&lt;/i&gt;.</source>
+ <translation>Pour effectuer un alignement, vous aurez besoin de la &lt;b&gt;page d&apos;alignement&lt;/b&gt; qui s’imprime automatiquement après l’installation d’une cartouche d’impression.
+&lt;p&gt; Si vous ne disposez &lt;b&gt;pas&lt;/b&gt; de cette page, cliquez sur &lt;i&gt;Impression de la page&lt;/i&gt;.
+&lt;p&gt;Si vous avez déjà cette page, cliquez sur &lt;i&gt;Suivant&gt;&lt;/i&gt;.</translation>
+ </message>
+ <message>
+ <source>Next &gt;</source>
+ <translation>Suivant &gt;</translation>
+ </message>
+ <message>
+ <source>Print Page</source>
+ <translation>Impression de la page</translation>
+ </message>
+</context>
+<context>
+ <name>AlignType6Form2_base</name>
+ <message>
+ <source>HP Device Manager - Alignment</source>
+ <translation>Gestionnaire de périphériques HP - Alignement</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Follow these steps to complete the alignment:&lt;/b&gt;
+&lt;p&gt;&lt;b&gt;1.&lt;/b&gt; Place the alignment page, with the printed side facing down, on the scanner.
+&lt;p&gt;&lt;b&gt;2.&lt;/b&gt; Press the &lt;i&gt;Enter&lt;/i&gt; or &lt;i&gt;Scan&lt;/i&gt; button on the printer.
+&lt;p&gt;&lt;b&gt;3.&lt;/b&gt; &quot;Alignment Complete&quot; will be displayed when the process is finished (on some models)..</source>
+ <translation>&lt;b&gt;Suivez ces étapes pour poursuivre l’alignement :&lt;/b&gt;
+&lt;p&gt;&lt;b&gt;1.&lt;/b&gt; Placez la page d&apos;alignement dans le scanner, face imprimée vers le bas.
+&lt;p&gt;&lt;b&gt;2.&lt;/b&gt; Appuyez sur le bouton &lt;i&gt;Entrée&lt;/i&gt; ou &lt;i&gt;Scanner&lt;/i&gt; de l&apos;imprimante.
+&lt;p&gt;&lt;b&gt;3.&lt;/b&gt; Le message &quot;Alignement terminé&quot; s&apos;affiche lorsque le processus est terminé (sur certains modèles).</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+</context>
+<context>
+ <name>AllowableTypesDlg_base</name>
+ <message>
+ <source>MIME Type</source>
+ <translation>Type MIME</translation>
+ </message>
+ <message>
+ <source>Description</source>
+ <translation>Description</translation>
+ </message>
+ <message>
+ <source>Usual File Extension(s)</source>
+ <translation>Extension(s) de fichier habituel(s)</translation>
+ </message>
+ <message>
+ <source>HP Device Manager - Allowable Types</source>
+ <translation>Gestionnaire de périphériques HP – Types autorisés</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;File/document types that can be added to the file list.&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Types de fichiers/documents pouvant être ajoutés à la liste de fichiers.&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>&lt;i&gt;Note: To print or fax file/document types that do not appear on this list, print the document from the application that created it through the appropriate CUPS printer.&lt;/i&gt;</source>
+ <translation>&lt;i&gt;Remarque : Pour imprimer ou télécopier un fichier/document dont le type ne figure pas dans cette liste, imprimez le document dans l&apos;application où il a été créé, sur l&apos;imprimante CUPS appropriée.&lt;/i&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>ChooseDeviceDlg</name>
+ <message>
+ <source>Choose Device</source>
+ <translation>Choisir un périphérique</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Annuler</translation>
+ </message>
+ <message>
+ <source>Available Devices:</source>
+ <translation>Périphériques disponibles :</translation>
+ </message>
+</context>
+<context>
+ <name>ChoosePrinterDlg</name>
+ <message>
+ <source>Choose Device</source>
+ <translation>Choisir un périphérique</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Annuler</translation>
+ </message>
+ <message>
+ <source>Available Devices:</source>
+ <translation>Périphériques disponibles :</translation>
+ </message>
+ <message>
+ <source>Available Printers:</source>
+ <translation>Imprimantes disponibles :</translation>
+ </message>
+ <message>
+ <source>Available Faxes:</source>
+ <translation>Télécopieurs disponibles :</translation>
+ </message>
+</context>
+<context>
+ <name>ChoosePrinterDlg2</name>
+ <message>
+ <source>Choose Printer</source>
+ <translation>Choisir une imprimante</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Annuler</translation>
+ </message>
+ <message>
+ <source>Printers:</source>
+ <translation>Imprimantes :</translation>
+ </message>
+</context>
+<context>
+ <name>CleaningForm2_base</name>
+ <message>
+ <source>HP Device Manager - Cleaning</source>
+ <translation>Gestionnaire de périphériques HP - Nettoyage</translation>
+ </message>
+ <message>
+ <source>Finish</source>
+ <translation>Terminer</translation>
+ </message>
+ <message>
+ <source>Please wait while the test page is printed. Check this page to see if the problem was fixed. If the test page looks fine click &lt;b&gt;Finish &lt;/b&gt;to quit the cleaning procedure. Otherwise, replace the print cartridges and click &lt;b&gt;Finish&lt;/b&gt;.</source>
+ <translation>Veuillez attendre que la page de test soit imprimée. Vérifiez à l&apos;aide de cette page si le problème a été résolu. Si la page de test se présente correctement, cliquez sur &lt;b&gt;Terminer&lt;/b&gt; pour quitter le processus de nettoyage. Sinon, remplacez les cartouches d&apos;impression, puis cliquez sur &lt;b&gt;Terminer&lt;/b&gt;.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Cleaning Level 3 Performed&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Nettoyage de Niveau 3 effectué&lt;/b&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>CleaningForm_base</name>
+ <message>
+ <source>HP Device Manager - Please Wait - Cleaning</source>
+ <translation>Gestionnaire de périphériques HP – Veuillez attendre - Nettoyage</translation>
+ </message>
+ <message>
+ <source>Finish</source>
+ <translation>Terminer</translation>
+ </message>
+ <message>
+ <source>Cleaning Level %s</source>
+ <translation>Niveau de nettoyage %s</translation>
+ </message>
+ <message>
+ <source>Please wait while the test page is printed. Check this page to see if the problem was fixed. If the test page looks fine click &lt;b&gt;Finish &lt;/b&gt;to quit the cleaning procedure. Otherwise, click &lt;b&gt;Cleaning Level %s&lt;/b&gt; to continue with cleaning.</source>
+ <translation>Veuillez attendre que la page de test soit imprimée. Vérifiez à l&apos;aide de cette page si le problème a été résolu. Si la page de test se présente correctement, cliquez sur &lt;b&gt;Terminer&lt;/b&gt; pour quitter le processus de nettoyage. Sinon, cliquez sur &lt;b&gt;Niveau de nettoyage%s&lt;/b&gt; pour continuer le nettoyage.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Please Wait - Cleaning Level %s Being Performed&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Veuillez attendre – Nettoyage de niveau %s en cours&lt;/b&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>ColorAdjForm_base</name>
+ <message>
+ <source>HP Device Manager - Color Adjustment</source>
+ <translation>Gestionnaire de périphériques HP – Ajustement des couleurs</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Annuler</translation>
+ </message>
+ <message>
+ <source>Next &gt;</source>
+ <translation>Suivant &gt;</translation>
+ </message>
+ <message>
+ <source>Choose the numbered colored box that the color &lt;b&gt;best &lt;/b&gt;matches the background color of the bar.</source>
+ <translation>Choisissez le cadre couleur numéroté dont la couleur correspond &lt;b&gt;le mieux &lt;/b&gt;à l&apos;arrière-plan de la barre.</translation>
+ </message>
+ <message>
+ <source>1</source>
+ <translation>1</translation>
+ </message>
+ <message>
+ <source>2</source>
+ <translation>2</translation>
+ </message>
+ <message>
+ <source>3</source>
+ <translation>3</translation>
+ </message>
+ <message>
+ <source>4</source>
+ <translation>4</translation>
+ </message>
+ <message>
+ <source>5</source>
+ <translation>5</translation>
+ </message>
+ <message>
+ <source>6</source>
+ <translation>6</translation>
+ </message>
+ <message>
+ <source>7</source>
+ <translation>7</translation>
+ </message>
+ <message>
+ <source>8</source>
+ <translation>8</translation>
+ </message>
+ <message>
+ <source>9</source>
+ <translation>9</translation>
+ </message>
+ <message>
+ <source>10</source>
+ <translation>10</translation>
+ </message>
+ <message>
+ <source>11</source>
+ <translation>11</translation>
+ </message>
+ <message>
+ <source>12</source>
+ <translation>12</translation>
+ </message>
+ <message>
+ <source>13</source>
+ <translation>13</translation>
+ </message>
+ <message>
+ <source>14</source>
+ <translation>14</translation>
+ </message>
+ <message>
+ <source>15</source>
+ <translation>15</translation>
+ </message>
+ <message>
+ <source>16</source>
+ <translation>16</translation>
+ </message>
+ <message>
+ <source>17</source>
+ <translation>17</translation>
+ </message>
+ <message>
+ <source>18</source>
+ <translation>18</translation>
+ </message>
+ <message>
+ <source>19</source>
+ <translation>19</translation>
+ </message>
+ <message>
+ <source>20</source>
+ <translation>20</translation>
+ </message>
+ <message>
+ <source>21</source>
+ <translation>21</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;&lt;font size=&quot;+1&quot;&gt;Line&lt;/font&gt;&lt;/b&gt;</source>
+ <translation>&lt;b&gt;&lt;font size=&quot;+1&quot;&gt;Ligne&lt;/font&gt;&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;&lt;font size=&quot;+1&quot;&gt;X&lt;/font&gt;&lt;/b&gt;</source>
+ <translation>&lt;b&gt;&lt;font size=&quot;+1&quot;&gt;X&lt;/font&gt;&lt;/b&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>ColorCal4Form_base</name>
+ <message>
+ <source>HP Device Manager - Color Calibration</source>
+ <translation>Gestionnaire de périphériques HP – Calibrage des couleurs</translation>
+ </message>
+ <message>
+ <source>Calibrate</source>
+ <translation>Calibrer</translation>
+ </message>
+ <message>
+ <source>1. Hold the calibration page at arm&apos;s length in front of your eyes.
+&lt;p&gt;&lt;p&gt;
+2. Tilt the page away from you. Look at the two large squares, each containing colored patches. For each large square, find the colored path that &lt;b&gt;most closely&lt;/b&gt; matches the background color. Each patch has an associated letter and number.
+&lt;p&gt;&lt;p&gt;
+3. Choose the letter and number for the matching patches for the gray and color plots.
+&lt;p&gt;&lt;p&gt;
+4. Click &lt;i&gt;&quot;Calibrate&quot;.&lt;/i&gt; to continue.
+&lt;p&gt;&lt;p&gt;
+(To reset the printer to known defaults, click &lt;i&gt;&quot;Use Factory Defaults&quot;&lt;/i&gt;)</source>
+ <translation>1. Tenez la page de calibrage à bout de bras à la hauteur de vos yeux.
+&lt;p&gt;&lt;p&gt;
+2. Inclinez la page vers l&apos;arrière. Regardez les deux grands carrés qui contiennent des motifs de couleur. Trouvez, dans chaque carré, le motif dont la couleur correspond &lt;b&gt;le mieux&lt;/b&gt; à la couleur d&apos;arrière-plan. Une lettre et un numéro sont associés à chaque motif.
+&lt;p&gt;&lt;p&gt;
+3. Choisissez la lettre et le numéro des motifs correspondant aux tracés gris et en couleurs.
+&lt;p&gt;&lt;p&gt;
+4. Cliquez sur &lt;i&gt;&quot;Calibrer&quot;.&lt;/i&gt; pour continuer.
+&lt;p&gt;&lt;p&gt;
+(Pour rétablir les valeurs par défaut des paramètres de l&apos;imprimante, cliquez sur &lt;i&gt;&quot;Paramètres usine par défaut&quot;&lt;/i&gt;)</translation>
+ </message>
+ <message>
+ <source>Gray Plot</source>
+ <translation>Tracé gris</translation>
+ </message>
+ <message>
+ <source>A</source>
+ <translation>A</translation>
+ </message>
+ <message>
+ <source>B</source>
+ <translation>B</translation>
+ </message>
+ <message>
+ <source>C</source>
+ <translation>C</translation>
+ </message>
+ <message>
+ <source>D</source>
+ <translation>D</translation>
+ </message>
+ <message>
+ <source>E</source>
+ <translation>E</translation>
+ </message>
+ <message>
+ <source>F</source>
+ <translation>F</translation>
+ </message>
+ <message>
+ <source>G</source>
+ <translation>G</translation>
+ </message>
+ <message>
+ <source>H</source>
+ <translation>H</translation>
+ </message>
+ <message>
+ <source>I</source>
+ <translation>I</translation>
+ </message>
+ <message>
+ <source>J</source>
+ <translation>J</translation>
+ </message>
+ <message>
+ <source>K</source>
+ <translation>K</translation>
+ </message>
+ <message>
+ <source>L</source>
+ <translation>L</translation>
+ </message>
+ <message>
+ <source>M</source>
+ <translation>M</translation>
+ </message>
+ <message>
+ <source>N</source>
+ <translation>N</translation>
+ </message>
+ <message>
+ <source>1</source>
+ <translation>1</translation>
+ </message>
+ <message>
+ <source>2</source>
+ <translation>2</translation>
+ </message>
+ <message>
+ <source>3</source>
+ <translation>3</translation>
+ </message>
+ <message>
+ <source>4</source>
+ <translation>4</translation>
+ </message>
+ <message>
+ <source>5</source>
+ <translation>5</translation>
+ </message>
+ <message>
+ <source>6</source>
+ <translation>6</translation>
+ </message>
+ <message>
+ <source>7</source>
+ <translation>7</translation>
+ </message>
+ <message>
+ <source>8</source>
+ <translation>8</translation>
+ </message>
+ <message>
+ <source>9</source>
+ <translation>9</translation>
+ </message>
+ <message>
+ <source>10</source>
+ <translation>10</translation>
+ </message>
+ <message>
+ <source>11</source>
+ <translation>11</translation>
+ </message>
+ <message>
+ <source>12</source>
+ <translation>12</translation>
+ </message>
+ <message>
+ <source>13</source>
+ <translation>13</translation>
+ </message>
+ <message>
+ <source>14</source>
+ <translation>14</translation>
+ </message>
+ <message>
+ <source>Color Plot</source>
+ <translation>Tracé couleur</translation>
+ </message>
+ <message>
+ <source>P</source>
+ <translation>P</translation>
+ </message>
+ <message>
+ <source>Q</source>
+ <translation>Q</translation>
+ </message>
+ <message>
+ <source>R</source>
+ <translation>R</translation>
+ </message>
+ <message>
+ <source>S</source>
+ <translation>S</translation>
+ </message>
+ <message>
+ <source>T</source>
+ <translation>T</translation>
+ </message>
+ <message>
+ <source>U</source>
+ <translation>U</translation>
+ </message>
+ <message>
+ <source>V</source>
+ <translation>V</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Annuler</translation>
+ </message>
+ <message>
+ <source>Use Factory Defaults</source>
+ <translation>Paramètres usine par défaut</translation>
+ </message>
+</context>
+<context>
+ <name>ColorCalForm2_base</name>
+ <message>
+ <source>HP Device Manager - Color Calibration</source>
+ <translation>Gestionnaire de périphériques HP – Calibrage des couleurs</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Annuler</translation>
+ </message>
+ <message>
+ <source>Next &gt;</source>
+ <translation>Suivant &gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;A page of color patches is printing. When it is complete, follow these steps:&lt;/b&gt;
+&lt;p&gt;&lt;b&gt;1.&lt;/b&gt; Hold the page approximately 8 inches (~20cm) in front of your eyes.
+&lt;p&gt;&lt;b&gt;2.&lt;/b&gt; Slowly move the page away from you until the numbered patches fade to match the background.
+&lt;p&gt;&lt;b&gt;3.&lt;/b&gt; Select the number (below) between &lt;i&gt;1&lt;/i&gt; and &lt;i&gt;81 &lt;/i&gt;of the numbered patch that &lt;b&gt;best &lt;/b&gt;matches the background:</source>
+ <translation>&lt;b&gt;Une page de motifs couleur s&apos;imprime. Quand vous avez terminé, suivez les étapes ci-dessous :&lt;/b&gt;
+&lt;p&gt;&lt;b&gt;1.&lt;/b&gt; Tenez la page à 20 cm environ à hauteur des yeux.
+&lt;p&gt;&lt;b&gt;2.&lt;/b&gt; Eloignez lentement la page jusqu&apos;à ce que les motifs numérotés ne correspondent plus à l&apos;arrière-plan.
+&lt;p&gt;&lt;b&gt;3.&lt;/b&gt; Sélectionnez le numéro (ci-dessous), entre &lt;i&gt;1&lt;/i&gt; et &lt;i&gt;81 &lt;/i&gt;du motif correspondant &lt;b&gt;le mieux &lt;/b&gt;à l&apos;arrière-plan :</translation>
+ </message>
+ <message>
+ <source>Number of best matching patch (1-81):</source>
+ <translation>Numéro du motif correspondant le mieux (1-81):</translation>
+ </message>
+</context>
+<context>
+ <name>ColorCalForm_base</name>
+ <message>
+ <source>HP Device Manager - Color Calibration</source>
+ <translation>Gestionnaire de périphériques HP – Calibrage des couleurs</translation>
+ </message>
+ <message>
+ <source>Next &gt;</source>
+ <translation>Suivant &gt;</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Annuler</translation>
+ </message>
+ <message>
+ <source>Color Calibration</source>
+ <translation>Calibrage des couleurs</translation>
+ </message>
+ <message>
+ <source>1</source>
+ <translation>1</translation>
+ </message>
+ <message>
+ <source>2</source>
+ <translation>2</translation>
+ </message>
+ <message>
+ <source>3</source>
+ <translation>3</translation>
+ </message>
+ <message>
+ <source>4</source>
+ <translation>4</translation>
+ </message>
+ <message>
+ <source>5</source>
+ <translation>5</translation>
+ </message>
+ <message>
+ <source>6</source>
+ <translation>6</translation>
+ </message>
+ <message>
+ <source>7</source>
+ <translation>7</translation>
+ </message>
+ <message>
+ <source>Choose the numbered image labeled &quot;1&quot; thru &quot;7&quot; that is &lt;b&gt;best color matched&lt;/b&gt; to the image labeled &quot;X&quot;.</source>
+ <translation>Choisissez l&apos;image numérotée entre &quot;1&quot; et &quot;7&quot; dont la couleur correspond &lt;b&gt;le mieux&lt;/b&gt; à l&apos;image &quot;X&quot;.</translation>
+ </message>
+</context>
+<context>
+ <name>CoverpageForm_base</name>
+ <message>
+ <source>HP Device Manager - Coverpages</source>
+ <translation>Gestionnaire de périphériques HP – Pages de garde</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Annuler</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>Coverpage Design</source>
+ <translation>Création de la page de garde</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Choose coverpage and enter optional message.&lt;b&gt;</source>
+ <translation>&lt;b&gt;Choisissez une page de garde et saisissez le message optionnel.&lt;b&gt;</translation>
+ </message>
+ <message>
+ <source>Regarding:</source>
+ <translation>Objet :</translation>
+ </message>
+ <message>
+ <source>Optional Message &lt;i&gt;(Maximum 2048 characters or 32 lines preformatted)&lt;/i&gt;:</source>
+ <translation>Message optionnel &lt;i&gt;(2048 caractères ou 32 lignes préformatées au maximum)&lt;/i&gt;:</translation>
+ </message>
+ <message>
+ <source>Preformatted (preserve formatting)</source>
+ <translation>Préformaté (conserver le formatage)</translation>
+ </message>
+</context>
+<context>
+ <name>DevMgr4</name>
+ <message>
+ <source>Functions</source>
+ <translation>Fonctions</translation>
+ </message>
+ <message>
+ <source>Functions &gt; Print</source>
+ <translation>Fonctions &gt; Imprimer</translation>
+ </message>
+ <message>
+ <source>Functions &gt; Make Copies</source>
+ <translation>Fonctions &gt; Photocopie</translation>
+ </message>
+ <message>
+ <source>Functions &gt; Fax</source>
+ <translation>Fonctions &gt; Télécopie</translation>
+ </message>
+ <message>
+ <source>Functions &gt; Unload Photo Card</source>
+ <translation>Fonctions &gt; Télécharger une carte mémoire</translation>
+ </message>
+ <message>
+ <source>Tools</source>
+ <translation>Outils</translation>
+ </message>
+ <message>
+ <source>Tools &gt; Device Information</source>
+ <translation>Outils &gt; Informations sur le périphérique</translation>
+ </message>
+ <message>
+ <source>Tools &gt; Printer Information</source>
+ <translation>Outils &gt; Informations sur l&apos;imprimante</translation>
+ </message>
+ <message>
+ <source>Tools &gt; Print Test Page</source>
+ <translation>Outils &gt; Imprimer une page de test</translation>
+ </message>
+ <message>
+ <source>Printer Name:</source>
+ <translation>Imprimante :</translation>
+ </message>
+ <message>
+ <source>Print &gt;&gt;</source>
+ <translation>Imprimer &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>Print...</source>
+ <translation>Imprimer …</translation>
+ </message>
+ <message>
+ <source>Scan &gt;&gt;</source>
+ <translation>Scanner &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>Scan...</source>
+ <translation>Scanner ...</translation>
+ </message>
+ <message>
+ <source>Access Photo Cards &gt;&gt;</source>
+ <translation>Accès aux cartes mémoire photo &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>Access Photo Cards...</source>
+ <translation>Accès aux cartes mémoire photo ...</translation>
+ </message>
+ <message>
+ <source>Send Fax &gt;&gt;</source>
+ <translation>Envoyer une télécopie &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>Send Fax...</source>
+ <translation>Envoyer une télécopie ...</translation>
+ </message>
+ <message>
+ <source>Make Copies &gt;&gt;</source>
+ <translation>Photocopier &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>Make Copies...</source>
+ <translation>Photocopier ...</translation>
+ </message>
+ <message>
+ <source>Device Settings...</source>
+ <translation>Paramètres du périphérique ...</translation>
+ </message>
+ <message>
+ <source>Refresh Device</source>
+ <translation>Actualiser le périphérique</translation>
+ </message>
+ <message>
+ <source>Refresh All</source>
+ <translation>Tout actualiser</translation>
+ </message>
+ <message>
+ <source>HP Device Manager - %1</source>
+ <translation>Gestionnaire de périphériques HP - %1</translation>
+ </message>
+ <message>
+ <source>Refreshing Device List - HP Device Manager</source>
+ <translation>Actualisation de la liste de périphériques – Gestionnaire de périphériques HP</translation>
+ </message>
+ <message>
+ <source>Refreshing device list...</source>
+ <translation>Actualisation de la liste des périphériques ...</translation>
+ </message>
+ <message>
+ <source>Press F6 to refresh.</source>
+ <translation>Appuyez sur F6 pour actualiser.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Photocards on your printer are only available by mounting them as drives using USB mass storage.&lt;/b&gt;&lt;p&gt;Please refer to your distribution&apos;s documentation for setup and usage instructions.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Avec votre imprimante, les cartes mémoire photo sont uniquement disponibles lorsqu&apos;elles sont installées comme unités de stockage de masse USB.&lt;/b&gt;&lt;p&gt;Veuillez consulter la documentation fournie pour plus d&apos;informations sur la configuration et l&apos;utilisation.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Unable to run command. No command specified.&lt;/b&gt;&lt;p&gt;Use &lt;pre&gt;Configure...&lt;/pre&gt; to specify a command to run.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Impossible d&apos;exécuter une commande. Aucune commande n&apos;a été spécifiée.&lt;/b&gt;&lt;p&gt;Utilisez &lt;pre&gt;Configurer...&lt;/pre&gt; pour indiquer la commande à exécuter.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Unable to find an appropriate su/sudo utility to run hp-setup.&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Impossible de trouver un utilitaire su/sudo correct pour exécuter hp-setup.&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Annoying Confirmation: Are you sure you want to remove this device?&lt;/b&gt;</source>
+<translation>&lt;b&gt;Confirmation agaçante : voulez-vous vraiment supprimer ce périphérique ?&lt;/b&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>DevMgr4_base</name>
+ <message>
+ <source>HP Device Manager</source>
+ <translation>Gestionnaire de périphériques HP</translation>
+ </message>
+ <message>
+ <source>Functions</source>
+ <translation>Fonctions</translation>
+ </message>
+ <message>
+ <source>Status</source>
+ <translation>État</translation>
+ </message>
+ <message>
+ <source>Supplies</source>
+ <translation>Fournitures</translation>
+ </message>
+ <message>
+ <source>Tools</source>
+ <translation>Outils</translation>
+ </message>
+ <message>
+ <source>Print Settings</source>
+ <translation>Paramètres d&apos;impression</translation>
+ </message>
+ <message>
+ <source>Print Control</source>
+ <translation>Contrôle de l&apos;impression</translation>
+ </message>
+ <message>
+ <source>Contents</source>
+ <translation>Sommaire</translation>
+ </message>
+ <message>
+ <source>&amp;Contents...</source>
+ <translation>&amp;Sommaire</translation>
+ </message>
+ <message>
+ <source>Help Contents (F1)</source>
+ <translation>Sommaire de l&apos;aide (F1)</translation>
+ </message>
+ <message>
+ <source>F1</source>
+ <translation>F1</translation>
+ </message>
+ <message>
+ <source>Index</source>
+ <translation>Index</translation>
+ </message>
+ <message>
+ <source>&amp;Index...</source>
+ <translation>&amp;Index …</translation>
+ </message>
+ <message>
+ <source>&amp;About...</source>
+ <translation>À propos de … &amp;</translation>
+ </message>
+ <message>
+ <source>About HP Device Manager...</source>
+ <translation>A propos du Gestionnaire de périphériques HP …</translation>
+ </message>
+ <message>
+ <source>Refresh Device</source>
+ <translation>Actualiser le périphérique</translation>
+ </message>
+ <message>
+ <source>Refresh Device (F5)</source>
+ <translation>Actualiser le périphérique (F5)</translation>
+ </message>
+ <message>
+ <source>F5</source>
+ <translation>F5</translation>
+ </message>
+ <message>
+ <source>Exit</source>
+ <translation>Quitter</translation>
+ </message>
+ <message>
+ <source>Exit HP Device Manager</source>
+ <translation>Quitter le Gestionnaire de périphériques HP</translation>
+ </message>
+ <message>
+ <source>Ctrl+Q</source>
+ <translation>Ctrl+Q</translation>
+ </message>
+ <message>
+ <source>Popup Alerts...</source>
+ <translation>Alertes instantanées ...</translation>
+ </message>
+ <message>
+ <source>Popup alerts...</source>
+ <translation>Alertes instantanées ...</translation>
+ </message>
+ <message>
+ <source>Configure popup alerts</source>
+ <translation>Configurer les alertes instantanées</translation>
+ </message>
+ <message>
+ <source>Email alerts...</source>
+ <translation>Alertes par courriel ...</translation>
+ </message>
+ <message>
+ <source>Configure email alerts</source>
+ <translation>Configurer les alertes par courriel</translation>
+ </message>
+ <message>
+ <source>Settings...</source>
+ <translation>Réglages...</translation>
+ </message>
+ <message>
+ <source>F2</source>
+ <translation>F2</translation>
+ </message>
+ <message>
+ <source>Refresh All</source>
+ <translation>Tout actualiser</translation>
+ </message>
+ <message>
+ <source>F6</source>
+ <translation>F6</translation>
+ </message>
+ <message>
+ <source>Auto Refresh</source>
+ <translation>Actualisation automatique</translation>
+ </message>
+ <message>
+ <source>Turn on/off Auto Refresh (Ctrl+A)</source>
+ <translation>Activer/Désactiver l&apos;actualisation automatique (Ctrl+A)</translation>
+ </message>
+ <message>
+ <source>Ctrl+A</source>
+ <translation>Ctrl+A</translation>
+ </message>
+ <message>
+ <source>Action</source>
+ <translation>Action</translation>
+ </message>
+ <message>
+ <source>Device Settings (F3)</source>
+ <translation>Paramètres du périphérique (F3)</translation>
+ </message>
+ <message>
+ <source>F3</source>
+ <translation>F3</translation>
+ </message>
+ <message>
+ <source>Support...</source>
+ <translation>Support...</translation>
+ </message>
+ <message>
+ <source>Setup New Device...</source>
+ <translation>Configurer un nouveau périphérique ...</translation>
+ </message>
+ <message>
+ <source>Ins</source>
+ <translation>Inser</translation>
+ </message>
+ <message>
+ <source>Remove Device...</source>
+ <translation>Supprimer un périphérique ...</translation>
+ </message>
+ <message>
+ <source>Del</source>
+ <translation>Suppr</translation>
+ </message>
+ <message>
+ <source>Device</source>
+ <translation>Périphérique</translation>
+ </message>
+ <message>
+ <source>Configure</source>
+ <translation>Configurer</translation>
+ </message>
+ <message>
+ <source>Help</source>
+ <translation>Aide</translation>
+ </message>
+</context>
+<context>
+ <name>FaxAddrBookEditForm</name>
+ <message>
+ <source>New Fax Group</source>
+ <translation type="obsolete">Nouveau groupe de télécopie</translation>
+ </message>
+ <message>
+ <source>New Group Name:</source>
+ <translation type="obsolete">Nouveau groupe :</translation>
+ </message>
+</context>
+<context>
+ <name>FaxAddrBookEditForm_base</name>
+ <message>
+ <source>Group Name</source>
+ <translation>Nom du groupe</translation>
+ </message>
+ <message>
+ <source>HP Device Manager - Fax Address Book Entry</source>
+ <translation>Gestionnaire de périphériques HP – Entrée du carnet d&apos;adresses de télécopie</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Annuler</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>First Name:</source>
+ <translation>Prénom :</translation>
+ </message>
+ <message>
+ <source>New Group...</source>
+ <translation type="obsolete">Nouveau groupe ...</translation>
+ </message>
+ <message>
+ <source>Member of Group(s):</source>
+ <translation>Membre du/des groupe(s) :</translation>
+ </message>
+ <message>
+ <source>Last Name:</source>
+ <translation>Nom :</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Fax Number:&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Numéro de télécopie :&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Notes/Other Information:</source>
+ <translation>Remarques/Autres informations :</translation>
+ </message>
+ <message>
+ <source>Title:</source>
+ <translation>Titre :</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Nickname:&lt;/b&gt;</source>
+ <translation type="obsolete">&lt;b&gt;Pseudonyme :&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Note: Items in &lt;b&gt;bold&lt;/b&gt; are required fields.</source>
+ <translation>Remarque : Les champs en &lt;b&gt;gras&lt;/b&gt; doivent obligatoirement être remplis.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Name/Nickname:&lt;/b&gt;</source>
+<translation>&lt;b&gt;Nom/Surnom :&lt;/b&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>FaxAddrBookForm</name>
+ <message>
+ <source>New...</source>
+ <translation>Nouveau …</translation>
+ </message>
+ <message>
+ <source>Edit...</source>
+ <translation>Modifier...</translation>
+ </message>
+ <message>
+ <source>Delete...</source>
+ <translation>Supprimer …</translation>
+ </message>
+ <message>
+ <source>Refresh List</source>
+ <translation>Actualiser la liste</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Annoying Confirmation: Are you sure you want to delete this address book entry?&lt;/b&gt;</source>
+<translation>&lt;b&gt;Confirmation agaçante : voulez-vous vraiment supprimer cette entrée du carnet d'adresses ?&lt;/b&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>FaxAddrBookForm_base</name>
+ <message>
+ <source>Nickname</source>
+ <translation>Pseudonyme</translation>
+ </message>
+ <message>
+ <source>Title</source>
+ <translation>Titre</translation>
+ </message>
+ <message>
+ <source>First Name</source>
+ <translation>Prénom</translation>
+ </message>
+ <message>
+ <source>Last Name</source>
+ <translation>Nom</translation>
+ </message>
+ <message>
+ <source>Fax Number</source>
+ <translation>Numéro de télécopie</translation>
+ </message>
+ <message>
+ <source>Member of Group(s)</source>
+ <translation>Membre du/des groupe(s)</translation>
+ </message>
+ <message>
+ <source>Notes/Other Information</source>
+ <translation>Remarques/Autres informations</translation>
+ </message>
+ <message>
+ <source>HP Device Manager - Fax Address Book</source>
+ <translation>Gestionnaire de périphériques HP – Carnet d&apos;adressses de télécopie</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>New...</source>
+ <translation>Nouveau …</translation>
+ </message>
+ <message>
+ <source>Edit...</source>
+ <translation>Modifier...</translation>
+ </message>
+ <message>
+ <source>Delete...</source>
+ <translation>Supprimer …</translation>
+ </message>
+ <message>
+ <source>Groups...</source>
+ <translation>Groupes...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Fax Addresses:&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Adresses de télécopie :&lt;/b&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>FaxAddrBookGroupEditForm_base</name>
+ <message>
+ <source>Group Members</source>
+ <translation>Membres du groupe</translation>
+ </message>
+ <message>
+ <source>HP Device Manager - Fax Address Book Group</source>
+ <translation>Gestionnaire de périphériques HP – Groupe de carnet d&apos;adresses de télécopie</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Group Name:&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Groupe :&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Member Address Book Entries:&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Entrées du carnet d&apos;adresses de membres :&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Annuler</translation>
+ </message>
+</context>
+<context>
+ <name>FaxAddrBookGroupsForm</name>
+ <message>
+ <source>New...</source>
+ <translation>Nouveau …</translation>
+ </message>
+ <message>
+ <source>Edit...</source>
+ <translation>Modifier...</translation>
+ </message>
+ <message>
+ <source>Delete...</source>
+ <translation>Supprimer …</translation>
+ </message>
+ <message>
+ <source>Refresh List</source>
+ <translation>Actualiser la liste</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Annoying Confirmation: Are you sure you want to delete this group?&lt;/b&gt;</source>
+<translation>&lt;b&gt;Confirmation agaçante : voulez-vous vraiment supprimer ce groupe ?&lt;/b&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>FaxAddrBookGroupsForm_base</name>
+ <message>
+ <source>Group Name</source>
+ <translation>Nom du groupe</translation>
+ </message>
+ <message>
+ <source>Group Members</source>
+ <translation>Membres du groupe</translation>
+ </message>
+ <message>
+ <source>HP Device Manager - Fax Address Book Groups</source>
+ <translation>Gestionnaire de périphériques HP – Groupes du carnet d&apos;adresses de télécopie</translation>
+ </message>
+ <message>
+ <source>New...</source>
+ <translation>Nouveau …</translation>
+ </message>
+ <message>
+ <source>Delete...</source>
+ <translation>Supprimer …</translation>
+ </message>
+ <message>
+ <source>Edit...</source>
+ <translation>Modifier...</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Groups:&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Groupes :&lt;/b&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>FaxSendJobForm</name>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;You may not specify both a printer (-p) and a device (-d).</source>
+ <translation>&lt;p&gt;&lt;b&gt;Vous ne pouvez pas choisir simultanément les options imprimante (-p) et périphérique (-d).</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Unknown printer name: %1&lt;/b&gt;&lt;p&gt;Please check the printer name and try again.</source>
+ <translation>&lt;b&gt;Nom d&apos;imprimante inconnu : %1&lt;/b&gt;&lt;p&gt;Veuillez vérifier le nom de l&apos;imprimante et recommencer.</translation>
+ </message>
+ <message>
+ <source>You must specify a printer that has a device URI in the form &apos;hpfax:/...&apos;</source>
+ <translation>Vous devez indiquer une imprimante avec une URI périphérique de type &apos;hpfax:/...&apos;</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;No devices found.&lt;/b&gt;&lt;p&gt;Please make sure your device is properly installed and try again.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Aucun périphérique détecté.&lt;/b&gt;&lt;p&gt;Vérifiez que votre périphérique est correctement installé et recommencez.</translation>
+ </message>
+ <message>
+ <source>HP Device Manager - Send Fax</source>
+ <translation>Gestionnaire de périphériques HP – Envoyer une télécopie</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Fax send completed successfully.&lt;/b&gt;</source>
+ <translation>&lt;p&gt;&lt;b&gt;Envoi de la télécopie réussi.&lt;/b&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>FaxSettingsForm_base</name>
+ <message>
+ <source>HP Device Manager - Fax Settings</source>
+ <translation>Gestionnaire de périphériques HP – Paramètres de télécopie</translation>
+ </message>
+ <message>
+ <source>Fax Header Information</source>
+ <translation>En-tête de la télécopie</translation>
+ </message>
+ <message>
+ <source>Device Fax Number:</source>
+ <translation>Numéro de télécopie du périphérique :</translation>
+ </message>
+ <message>
+ <source>Name and/or Company:</source>
+ <translation>Nom et/ou Société :</translation>
+ </message>
+ <message>
+ <source>&lt;i&gt;This information will appear at the top of each fax that you send.&lt;/i&gt;</source>
+ <translation>&lt;i&gt;Ces informations seront placées en haut de chaque télécopie envoyée.&lt;/i&gt;</translation>
+ </message>
+ <message>
+ <source>Coverpage Information</source>
+ <translation>Page de garde</translation>
+ </message>
+ <message>
+ <source>Voice phone number:</source>
+ <translation>Numéro de téléphone :</translation>
+ </message>
+ <message>
+ <source>Email address:</source>
+ <translation>Adresse électronique :</translation>
+ </message>
+ <message>
+ <source>&lt;i&gt;This information will appear on any coverpage that you send.&lt;/i&gt;</source>
+ <translation>&lt;i&gt;Ces informations seront placées sur toutes les pages de garde envoyées.&lt;/i&gt;</translation>
+ </message>
+ <message>
+ <source>Information</source>
+ <translation>Informations</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Configure device settings for sending faxes.&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Définissez les paramètres pour l&apos;envoi de télécopie.&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Annuler</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+</context>
+<context>
+ <name>ImagePropertiesDlg_base</name>
+ <message>
+ <source>EXIF Labels</source>
+ <translation>Informations EXIF</translation>
+ </message>
+ <message>
+ <source>Contents </source>
+ <translation>Sommaire</translation>
+ </message>
+ <message>
+ <source>Properties for</source>
+ <translation>Propriétés de</translation>
+ </message>
+ <message>
+ <source>MIME Type:</source>
+ <translation>Type MIME :</translation>
+ </message>
+ <message>
+ <source>Size:</source>
+ <translation>Taille :</translation>
+ </message>
+ <message>
+ <source>Location:</source>
+ <translation>Emplacement :</translation>
+ </message>
+ <message>
+ <source>LOCATION</source>
+ <translation>EMPLACEMENT</translation>
+ </message>
+ <message>
+ <source>MIME TYPE</source>
+ <translation>TYPE MIME</translation>
+ </message>
+ <message>
+ <source>SIZE</source>
+ <translation>TAILLE</translation>
+ </message>
+ <message>
+ <source>FILENAME</source>
+ <translation>NOM DE FICHIER</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+</context>
+<context>
+ <name>LoadPaperForm_base</name>
+ <message>
+ <source>HP Device Manager - Load Plain Paper</source>
+ <translation>Gestionnaire de périphériques HP – Chargement de papier ordinaire</translation>
+ </message>
+ <message>
+ <source>Continue</source>
+ <translation>Continuer</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Annuler</translation>
+ </message>
+ <message>
+ <source>A page will be printed. Please load &lt;b&gt;plain paper&lt;/b&gt; in the printer and then press continue.</source>
+ <translation>Une page va être imprimée. Veuillez mettre du &lt;b&gt;papier ordinaire&lt;/b&gt; dans l&apos;imprimante, puis appuyer sur Continuer.</translation>
+ </message>
+</context>
+<context>
+ <name>MakeCopiesForm</name>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;You may not specify both a printer (-p) and a device (-d).</source>
+ <translation>&lt;p&gt;&lt;b&gt;Vous ne pouvez pas choisir simultanément les options imprimante (-p) et périphérique (-d).</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;No devices found.&lt;/b&gt;&lt;p&gt;Please make sure your device is properly installed and try again.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Aucun périphérique détecté.&lt;/b&gt;&lt;p&gt;Vérifiez que votre périphérique est correctement installé et recommencez.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Sorry, make copies functionality is not implemented for this device.&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Désolé, ce périphérique n&apos;offre pas de fonction de photocopie.&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>HP Device Manager - Make Copies</source>
+ <translation>Gestionnaire de périphériques HP - Photocopier</translation>
+ </message>
+</context>
+<context>
+ <name>MakeCopiesForm_base</name>
+ <message>
+ <source>HP Device Manager - Make Copies</source>
+ <translation>Gestionnaire de périphériques HP - Photocopier</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Fermer</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Make copies.&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Photocopier.&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Make Copies</source>
+ <translation>Photocopier</translation>
+ </message>
+ <message>
+ <source>Quality:</source>
+ <translation>Qualité :</translation>
+ </message>
+ <message>
+ <source>Fast</source>
+ <translation>Rapide</translation>
+ </message>
+ <message>
+ <source>Draft</source>
+ <translation>Brouillon</translation>
+ </message>
+ <message>
+ <source>Normal</source>
+ <translation>Normal</translation>
+ </message>
+ <message>
+ <source>Presentation</source>
+ <translation>Présentation</translation>
+ </message>
+ <message>
+ <source>Best</source>
+ <translation>Supérieur</translation>
+ </message>
+ <message>
+ <source>Number of Copies:</source>
+ <translation>Nombre d&apos;exemplaires :</translation>
+ </message>
+ <message>
+ <source>Contrast:</source>
+ <translation>Contraste :</translation>
+ </message>
+ <message>
+ <source>+0</source>
+ <translation>+0</translation>
+ </message>
+ <message>
+ <source>Enlargement/Reduction:</source>
+ <translation>Agrandissement/Réduction :</translation>
+ </message>
+ <message>
+ <source>400%</source>
+ <translation>400%</translation>
+ </message>
+ <message>
+ <source>Fit to page</source>
+ <translation>Ajuster à la page</translation>
+ </message>
+ <message>
+ <source>Copy</source>
+ <translation>Copier</translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation>Nom :</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Device information/status and output queue name.&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Informations/état du périphérique et nom de la file d&apos;impression.&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Status:</source>
+ <translation>Etat :</translation>
+ </message>
+ <message>
+ <source>Refresh status</source>
+ <translation>Actualiser l&apos;état</translation>
+ </message>
+ <message>
+ <source>Comment:</source>
+ <translation>Commentaire :</translation>
+ </message>
+ <message>
+ <source>Location:</source>
+ <translation>Emplacement :</translation>
+ </message>
+ <message>
+ <source>Device URI:</source>
+ <translation>URI périphérique :</translation>
+ </message>
+ <message>
+ <source>Device</source>
+ <translation>Périphérique</translation>
+ </message>
+</context>
+<context>
+ <name>NoDevicesForm</name>
+ <message>
+ <source>&lt;b&gt;Unable to find an appropriate su/sudo utility to run hp-setup.&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Impossible de trouver un utilitaire su/sudo correct pour exécuter hp-setup.&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;An I/O error occurred.&lt;/b&gt;&lt;p&gt;Please re-start the Device Manager and try again.</source>
+<translation>&lt;b&gt;Une erreur d'E/S s'est produite.&lt;/b&gt;&lt;p&gt;Veuillez redémarrer le gestionnaire de périphériques, puis réessayer.</translation>
+ </message>
+</context>
+<context>
+ <name>NoDevicesForm_base</name>
+ <message>
+ <source>HP Device Manager - No Installed HP Devices Found</source>
+ <translation>Gestionnaire de périphériques HP – Impossible de trouver les périphériques HP installés</translation>
+ </message>
+ <message>
+ <source>Setup Device...</source>
+ <translation>Configurer un périphérique ...</translation>
+ </message>
+ <message>
+ <source>CUPS Web Interface</source>
+ <translation>Interface Web CUPS</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Fermer</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;&lt;font size=&quot;+2&quot;&gt;No Installed HP Devices Found.&lt;/font&gt;&lt;/b&gt;&lt;p&gt;To install a device, use one of the following methods:&lt;p&gt;
+1.Run &lt;b&gt;hp-setup&lt;/b&gt; (in a shell/terminal or click &lt;tt&gt;Setup Device...&lt;/tt&gt; below).&lt;p&gt;
+2. &lt;b&gt;CUPS web interface&lt;/b&gt; (open a browser to: &lt;u&gt;http://localhost:631&lt;/u&gt; or press the button below),&lt;p&gt;
+3. The &lt;b&gt;printer installation utility&lt;/b&gt; that came with your operating system (YaST, PrinterDrake, etc).
+&lt;p&gt;&lt;p&gt;After setting up a printer, you may have to press &lt;tt&gt;F6&lt;/tt&gt; or chose &lt;tt&gt;Device | Refresh All&lt;/tt&gt; for the printer to appear in the HP Device Manager.&lt;p&gt;
+&lt;i&gt;&lt;b&gt;Note: Only devices installed with the &lt;tt&gt;hp:&lt;/tt&gt; CUPS backend will appear in the HP Device Manager.&lt;/b&gt;&lt;/i&gt;&lt;p&gt;</source>
+ <translation>&lt;b&gt;&lt;font size=&quot;+2&quot;&gt;Impossible de trouver les périphériques HP installés.&lt;/font&gt;&lt;/b&gt;&lt;p&gt;Pour installer un périphérique, utilisez l&apos;une des méthodes suivantes :&lt;p&gt;
+1. Exécutez &lt;b&gt;hp-setup&lt;/b&gt; (dans un shell/terminal ou en cliquant ci-dessous sur &lt;tt&gt;Configurer un périphérique ...&lt;/tt&gt;).&lt;p&gt;
+2. &lt;b&gt;Via l&apos;interface Web CUPS &lt;/b&gt; (ouvrez une fenêtre avec : &lt;u&gt;http://localhost:631&lt;/u&gt; ou appuyez sur le bouton ci-dessous),&lt;p&gt;
+3. Via l&apos;&lt;b&gt;utilitaire d&apos;installation d&apos;imprimantes&lt;/b&gt; fourni avec votre système d&apos;exploitation (YaST, PrinterDrake, etc).
+&lt;p&gt;&lt;p&gt;Après la configuration de l&apos;imprimante, vous pouvez être obligé d&apos;appuyer sur &lt;tt&gt;F6&lt;/tt&gt; ou de sélectionner &lt;tt&gt;Périphérique | Tout actualiser&lt;/tt&gt; pour que votre imprimante apparaisse dans HP Device Manager.&lt;p&gt;
+&lt;i&gt;&lt;b&gt;Remarque : Seuls les périphériques installés à l&apos;aide du &lt;tt&gt;hp:&lt;/tt&gt; CUPS backend figureront dans le Gestionnaire de périphériques HP.&lt;/b&gt;&lt;/i&gt;&lt;p&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>PaperEdgeAlignForm_base</name>
+ <message>
+ <source>HP Device Manager - Paper Edge Alignment</source>
+ <translation>Gestionnaire de périphériques HP – Alignement du bord de la feuille</translation>
+ </message>
+ <message>
+ <source>Next &gt;</source>
+ <translation>Suivant &gt;</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Annuler</translation>
+ </message>
+ <message>
+ <source>Paper Edge</source>
+ <translation>Bord de la feuille</translation>
+ </message>
+ <message>
+ <source>1</source>
+ <translation>1</translation>
+ </message>
+ <message>
+ <source>2</source>
+ <translation>2</translation>
+ </message>
+ <message>
+ <source>3</source>
+ <translation>3</translation>
+ </message>
+ <message>
+ <source>4</source>
+ <translation>4</translation>
+ </message>
+ <message>
+ <source>5</source>
+ <translation>5</translation>
+ </message>
+ <message>
+ <source>6</source>
+ <translation>6</translation>
+ </message>
+ <message>
+ <source>7</source>
+ <translation>7</translation>
+ </message>
+ <message>
+ <source>8</source>
+ <translation>8</translation>
+ </message>
+ <message>
+ <source>9</source>
+ <translation>9</translation>
+ </message>
+ <message>
+ <source>10</source>
+ <translation>10</translation>
+ </message>
+ <message>
+ <source>11</source>
+ <translation>11</translation>
+ </message>
+ <message>
+ <source>12</source>
+ <translation>12</translation>
+ </message>
+ <message>
+ <source>13</source>
+ <translation>13</translation>
+ </message>
+ <message>
+ <source>Choose the &lt;b&gt;numbered arrow&lt;/b&gt; that &lt;b&gt;best &lt;/b&gt;marks the edge of the paper.</source>
+ <translation>Sélectionnez la &lt;b&gt;flèche numérotée &lt;/b&gt; qui indique le &lt;b&gt;mieux &lt;/b&gt;le bord de la feuille.</translation>
+ </message>
+</context>
+<context>
+ <name>PasswordDialog</name>
+ <message>
+ <source>HP Device Manager - Enter Password</source>
+ <translation>Gestionnaire de périphériques HP – Saisir un mot de passe</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+</context>
+<context>
+ <name>PowerSettingsDialog</name>
+ <message>
+ <source>15 minutes</source>
+ <translation>15 minutes</translation>
+ </message>
+ <message>
+ <source>30 minutes</source>
+ <translation>30 minutes</translation>
+ </message>
+ <message>
+ <source>45 minutes</source>
+ <translation>45 minutes</translation>
+ </message>
+ <message>
+ <source>1 hour</source>
+ <translation>1 heure</translation>
+ </message>
+ <message>
+ <source>2 hours</source>
+ <translation>2 heures</translation>
+ </message>
+ <message>
+ <source>3 hours</source>
+ <translation>3 heures</translation>
+ </message>
+</context>
+<context>
+ <name>PowerSettingsDialog_base</name>
+ <message>
+ <source>HP Device Manager - Battery Mode Power Settings</source>
+ <translation>Gestionnaire de périphériques HP – Paramètres d&apos;alimentation sur batterie</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Configure the power off settings when operating on battery power&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Configurer les paramètres de mise en veille pour le fonctionnement sur batterie&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Annuler</translation>
+ </message>
+ <message>
+ <source>Power Settings</source>
+ <translation>Paramètres de l&apos;alimentation</translation>
+ </message>
+ <message>
+ <source>Automatically turn off printer after:</source>
+ <translation>Mise en veille automatique de l&apos;imprimante :</translation>
+ </message>
+ <message>
+ <source>Always leave printer on</source>
+ <translation>Imprimante toujours allumée</translation>
+ </message>
+</context>
+<context>
+ <name>PrinterForm</name>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;You may not specify both a printer (-p) and a device (-d).</source>
+ <translation>&lt;p&gt;&lt;b&gt;Vous ne pouvez pas choisir simultanément les options imprimante (-p) et périphérique (-d).</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;No devices found.&lt;/b&gt;&lt;p&gt;Please make sure your device is properly installed and try again.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Aucun périphérique détecté.&lt;/b&gt;&lt;p&gt;Vérifiez que votre périphérique est correctement installé et recommencez.</translation>
+ </message>
+ <message>
+ <source>HP Device Manager - Print</source>
+ <translation>Gestionnaire de périphériques HP – Imprimer</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollCopyView</name>
+ <message>
+ <source>Number of Copies</source>
+<translation>Nombre d'exemplaires</translation>
+ </message>
+ <message>
+ <source>Enlargement, Reduction and Fit to Page</source>
+<translation>Agrandissement, Réduction et Ajuster à la page</translation>
+ </message>
+ <message>
+ <source>Copy Contrast</source>
+<translation>Contraste de la photocopie</translation>
+ </message>
+ <message>
+ <source>Copy Quality</source>
+<translation>Qualité de la photocopie</translation>
+ </message>
+ <message>
+ <source>&lt;&lt; Functions</source>
+<translation>&lt;&lt; Fonctions</translation>
+ </message>
+ <message>
+ <source>Close</source>
+<translation>Fermer</translation>
+ </message>
+ <message>
+ <source>Make Copies(s)</source>
+<translation>Photocopier</translation>
+ </message>
+ <message>
+ <source>Number of copies:</source>
+<translation>Nombre d'exemplaires :</translation>
+ </message>
+ <message>
+ <source>Default</source>
+<translation>Par défaut</translation>
+ </message>
+ <message>
+ <source>Quality:</source>
+<translation>Qualité :</translation>
+ </message>
+ <message>
+ <source>Fast</source>
+<translation>Rapide</translation>
+ </message>
+ <message>
+ <source>Draft</source>
+<translation>Brouillon</translation>
+ </message>
+ <message>
+ <source>Normal</source>
+<translation>Normal</translation>
+ </message>
+ <message>
+ <source>Presentation</source>
+<translation>Présentation</translation>
+ </message>
+ <message>
+ <source>Best</source>
+<translation>Supérieur</translation>
+ </message>
+ <message>
+ <source>Enlargement or reduction (percent):</source>
+<translation>Agrandissement ou réduction (pourcentage) :</translation>
+ </message>
+ <message>
+ <source>Fit to Page</source>
+<translation>Agrandissement, Réduction et Ajuster à la page</translation>
+ </message>
+ <message>
+ <source>Contrast (-5 lighter to +5 darker):</source>
+<translation>Contraste (-5, plus clair à +5, plus foncé) :</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Copier error.&lt;/b&gt;&lt;p&gt;</source>
+<translation>&lt;b&gt;Erreur de la photocopieuse.&lt;/b&gt;&lt;p&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Cannot copy: Device is busy or not available.&lt;/b&gt;&lt;p&gt;Please check device and try again. [1]</source>
+<translation>&lt;b&gt;Photocopie impossible : Le périphérique est occupé ou indisponible.&lt;/b&gt;&lt;p&gt;Veuillez vérifier le périphérique, puis réessayer. [1]</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollDeviceInfoView</name>
+ <message>
+ <source>&lt;&lt; Tools</source>
+ <translation>&lt;&lt;Outils</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Fermer</translation>
+ </message>
+ <message>
+ <source>Device Information</source>
+ <translation>Informations sur le périphérique</translation>
+ </message>
+ <message>
+ <source>Static/Dynamic</source>
+ <translation>Statique/Dynamique</translation>
+ </message>
+ <message>
+ <source>Key</source>
+ <translation>Touche</translation>
+ </message>
+ <message>
+ <source>Value</source>
+ <translation>Valeur</translation>
+ </message>
+ <message>
+ <source>Static</source>
+ <translation>Statique</translation>
+ </message>
+ <message>
+ <source>Dynamic</source>
+ <translation>Dynamique</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollFaxView</name>
+ <message>
+ <source>PDF Document</source>
+ <translation>Document PDF</translation>
+ </message>
+ <message>
+ <source>Postscript Document</source>
+ <translation>Document Postscript</translation>
+ </message>
+ <message>
+ <source>HP Graphics Language File</source>
+ <translation>HP Graphics Language File</translation>
+ </message>
+ <message>
+ <source>C Shell Script</source>
+ <translation>Script Shell C</translation>
+ </message>
+ <message>
+ <source>C Source Code</source>
+ <translation>Code source C</translation>
+ </message>
+ <message>
+ <source>C++ Source Code</source>
+ <translation>Code source C++</translation>
+ </message>
+ <message>
+ <source>Perl Script</source>
+ <translation>Script Perl</translation>
+ </message>
+ <message>
+ <source>Python Program</source>
+ <translation>Programme Python</translation>
+ </message>
+ <message>
+ <source>Shell Script</source>
+ <translation>Script Shell</translation>
+ </message>
+ <message>
+ <source>Plain Text</source>
+ <translation>Texte normal</translation>
+ </message>
+ <message>
+ <source>HTML Dcoument</source>
+ <translation>Dcoument HTML</translation>
+ </message>
+ <message>
+ <source>GIF Image</source>
+ <translation>Image GIF</translation>
+ </message>
+ <message>
+ <source>PNG Image</source>
+ <translation>Image PNG</translation>
+ </message>
+ <message>
+ <source>JPEG Image</source>
+ <translation>Image JPEG</translation>
+ </message>
+ <message>
+ <source>TIFF Image</source>
+ <translation>Image TIFF</translation>
+ </message>
+ <message>
+ <source>Bitmap (BMP) Image</source>
+ <translation>Image Bitmap (BMP)</translation>
+ </message>
+ <message>
+ <source>Photo CD Image</source>
+ <translation>Image Photo CD</translation>
+ </message>
+ <message>
+ <source>Portable Image (PNM)</source>
+ <translation>Image Portable (PNM)</translation>
+ </message>
+ <message>
+ <source>Portable B&amp;W Image (PBM)</source>
+ <translation>Image Portable N&amp;B (PBM)</translation>
+ </message>
+ <message>
+ <source>Portable Grayscale Image (PGM)</source>
+ <translation>Image Portable Niveaux de gris (PGM)</translation>
+ </message>
+ <message>
+ <source>Portable Color Image (PPM)</source>
+ <translation>Image Portable Couleur (PPM)</translation>
+ </message>
+ <message>
+ <source>SGI RGB</source>
+ <translation>SGI RVB</translation>
+ </message>
+ <message>
+ <source>X11 Bitmap (XBM)</source>
+ <translation>X11 Bitmap (XBM)</translation>
+ </message>
+ <message>
+ <source>X11 Pixmap (XPM)</source>
+ <translation>X11 Pixmap (XPM)</translation>
+ </message>
+ <message>
+ <source>Sun Raster Format</source>
+ <translation>Sun Raster Format</translation>
+ </message>
+ <message>
+ <source>File(s) to Fax</source>
+ <translation>Fichier(s) à envoyer par télécopie</translation>
+ </message>
+ <message>
+ <source>Add/Edit Fax Coverpage</source>
+ <translation>Ajouter/Modifier la page de garde</translation>
+ </message>
+ <message>
+ <source>Recipient(s)</source>
+ <translation>Destinataire(s)</translation>
+ </message>
+ <message>
+ <source>Add Recipients from the Fax Address Book</source>
+ <translation>Ajouter des destinataires figurant dans le carnet d&apos;adresses de télécopie</translation>
+ </message>
+ <message>
+ <source>&lt;i&gt;Quick Add&lt;/i&gt; an Individual Recipient</source>
+ <translation>&lt;i&gt;Ajout rapide&lt;/i&gt; d&apos;un destinataire unique</translation>
+ </message>
+ <message>
+ <source>&lt;&lt; Functions</source>
+ <translation>&lt;&lt;Fonctions</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Fermer</translation>
+ </message>
+ <message>
+ <source>Send Fax Now</source>
+ <translation>Envoyer une télécopie immédiatement</translation>
+ </message>
+ <message>
+ <source>Processing fax...</source>
+ <translation>Envoi de télécopie en cours ...</translation>
+ </message>
+ <message>
+ <source>Receiving fax data...</source>
+ <translation>Réception d&apos;une télécopie en cours ...</translation>
+ </message>
+ <message>
+ <source>Read %1 of fax data...</source>
+ <translation>Lecture de %1 de la télécopie ...</translation>
+ </message>
+ <message>
+ <source>Order</source>
+ <translation>Ordre</translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation>Nom</translation>
+ </message>
+ <message>
+ <source>Type</source>
+ <translation>Type</translation>
+ </message>
+ <message>
+ <source>Pages</source>
+ <translation>Pages</translation>
+ </message>
+ <message>
+ <source>Path</source>
+ <translation>Chemin d&apos;accès</translation>
+ </message>
+ <message>
+ <source>Add File...</source>
+ <translation>Ajouter le fichier ...</translation>
+ </message>
+ <message>
+ <source>Show Types...</source>
+ <translation>Afficher les types ...</translation>
+ </message>
+ <message>
+ <source>Remove File</source>
+ <translation>Supprimer le fichier</translation>
+ </message>
+ <message>
+ <source>Move Down</source>
+ <translation>Vers le bas</translation>
+ </message>
+ <message>
+ <source>Move Up</source>
+ <translation>Vers le haut</translation>
+ </message>
+ <message>
+ <source>Show File Types...</source>
+ <translation>Afficher les types de fichiers ...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Invalid HPLIP Fax file.&lt;/b&gt;&lt;p&gt;Bad magic!</source>
+ <translation>&lt;b&gt;Fichier de télécopie HPLIP incorrect.&lt;/b&gt;&lt;p&gt;Fichier corrompu !</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;You are trying to add a file that cannot be directly faxed with this utility.&lt;/b&gt;&lt;p&gt;To print this file, use the print command in the application that created it.</source>
+ <translation>&lt;b&gt;Vous tentez d&apos;ajouter un fichier qui ne peut pas être directement transmis par télécopie à l&apos;aide de cet utilitaire.&lt;/b&gt;&lt;p&gt;Pour imprimer ce fichier, utilisez la commande d&apos;impression de l&apos;application où il a été créé.</translation>
+ </message>
+ <message>
+ <source>Processing fax file...</source>
+ <translation>Envoi d&apos;un fichier par télécopie en cours ...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Printer &apos;%1&apos; is in a stopped or error state.&lt;/b&gt;&lt;p&gt;Check the printer queue in CUPS and try again.</source>
+ <translation>&lt;b&gt;L&apos;imprimante &apos;%1&apos; est arrêtée suite à une ereur.&lt;/b&gt;&lt;p&gt;Consultez la liste des impressions dans CUPS et recommencez.</translation>
+ </message>
+ <message>
+ <source>Edit...</source>
+ <translation>Modifier...</translation>
+ </message>
+ <message>
+ <source>Add...</source>
+ <translation>Ajouter...</translation>
+ </message>
+ <message>
+ <source>HP Fax Coverpage</source>
+ <translation>Page de garde de télécopie HP</translation>
+ </message>
+ <message>
+ <source>Cover Page</source>
+ <translation>Page de garde</translation>
+ </message>
+ <message>
+ <source>Fax Number</source>
+ <translation>Numéro de télécopie</translation>
+ </message>
+ <message>
+ <source>Notes</source>
+ <translation>Remarques</translation>
+ </message>
+ <message>
+ <source>Fax Address Book...</source>
+ <translation>Carnet d&apos;adresses de télécopie …</translation>
+ </message>
+ <message>
+ <source>Remove</source>
+ <translation>Supprimer</translation>
+ </message>
+ <message>
+ <source>Add Individual</source>
+ <translation>Ajouter un destinataire</translation>
+ </message>
+ <message>
+ <source>Add Group</source>
+ <translation>Ajouter un groupe</translation>
+ </message>
+ <message>
+ <source>Add an &lt;b&gt;individual &lt;/b&gt;from the fax address book:</source>
+ <translation>Ajouter un &lt;b&gt;destinataire &lt;/b&gt;du carnet d&apos;adresses de télécopie :</translation>
+ </message>
+ <message>
+ <source>Add a &lt;b&gt;group&lt;/b&gt; from the fax address book:</source>
+ <translation>Ajouter un &lt;b&gt;groupe &lt;/b&gt;du carnet d&apos;adresses de télécopie :</translation>
+ </message>
+ <message>
+ <source>Add</source>
+ <translation>Ajouter</translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation>Nom :</translation>
+ </message>
+ <message>
+ <source>Fax Number:</source>
+ <translation>Numéro de télécopie :</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Fax configuration error.&lt;/b&gt;&lt;p&gt;The CUPS fax queue for &apos;%1&apos; is incorrectly configured.&lt;p&gt;Please make sure that the CUPS fax queue is configured with the &apos;HPLIP Fax&apos; Model/Driver.</source>
+ <translation>&lt;b&gt;Erreur de configuration de télécopie.&lt;/b&gt;&lt;p&gt;La file de télécopies CUPS de &apos;%1&apos; n&apos;est pas correctement configurée.&lt;p&gt;Vérifiez que la configuration de la file de télécopies CUPS comprend le modèle/pilote HPLIP Fax.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Device is busy or in an error state (code=%1)&lt;/b&gt;&lt;p&gt;Please wait for the device to become idle or clear the error and try again.</source>
+ <translation>&lt;b&gt;Périphérique occupé ou en état d&apos;erreur (code = %1)&lt;/b&gt;&lt;p&gt;Veuillez attendre que le périphérique soit libre ou corrigez l&apos;erreur et recommencez.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;The CUPS queue for &apos;%1&apos; is in a stopped or busy state.&lt;/b&gt;&lt;p&gt;Please check the queue and try again.</source>
+ <translation>&lt;b&gt;La file CUPS de &apos;%1&apos; est arrêtée ou occupée.&lt;/b&gt;&lt;p&gt;Veuillez consulter la file et recommencer.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Send fax is active.&lt;/b&gt;&lt;p&gt;Please wait for operation to complete.</source>
+ <translation>&lt;b&gt;La fonction d&apos;envoi de télécopie est active.&lt;/b&gt;&lt;p&gt;Veuillez attendre la fin de l&apos;envoi.</translation>
+ </message>
+ <message>
+ <source>Initializing...</source>
+ <translation>Initialisation en cours …</translation>
+ </message>
+ <message>
+ <source>Processing page %1...</source>
+ <translation>Envoi de la page %1 ...</translation>
+ </message>
+ <message>
+ <source>Dialing %1...</source>
+ <translation>Numérotation %1 ...</translation>
+ </message>
+ <message>
+ <source>Connecting to %1...</source>
+ <translation>Connexion à %1...</translation>
+ </message>
+ <message>
+ <source>Sending page %1 to %2...</source>
+ <translation>Envoi de la page %1 à %2 ...</translation>
+ </message>
+ <message>
+ <source>Cleaning up...</source>
+ <translation>Nettoyage en cours …</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Fax send error.&lt;/b&gt;&lt;p&gt;</source>
+ <translation>&lt;b&gt;Erreur d&apos;envoi de télécopie.&lt;/b&gt;&lt;p&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Fax device is busy.&lt;/b&gt;&lt;p&gt;Please try again later.</source>
+ <translation>&lt;b&gt;Le télécopieur est occupé. &lt;/b&gt;&lt;p&gt;Veuillez essayer à nouveau plus tard.</translation>
+ </message>
+ <message>
+ <source>Added with Quick Add</source>
+<translation>Ajouté avec la fonction Ajout rapide</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollFunctionsView</name>
+ <message>
+ <source>Print &gt;&gt;</source>
+ <translation>Imprimer &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>Print...</source>
+ <translation>Imprimer …</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Print&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Imprimer&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Print documents or files.</source>
+ <translation>Imprimer des documents ou des fichiers.</translation>
+ </message>
+ <message>
+ <source>Scan &gt;&gt;</source>
+ <translation>Scanner &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>Scan...</source>
+ <translation>Scanner ...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Scan&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Scanner&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Scan a document, image, or photograph.</source>
+ <translation>Scanner un document, image, ou photo.</translation>
+ </message>
+ <message>
+ <source>Send PC Fax &gt;&gt;</source>
+ <translation>Envoyer une télécopie via le PC &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>Send PC Fax...</source>
+ <translation>Envoyer une télécopie via le PC ...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Send PC Fax&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Envoyer une télécopie via le PC&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Send a fax from the PC.</source>
+ <translation>Envoyer une télécopie à partir du PC.</translation>
+ </message>
+ <message>
+ <source>Make Copies &gt;&gt;</source>
+ <translation>Photocopier &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>Make Copies...</source>
+ <translation>Photocopier ...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Make Copies&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Photocopier&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Make copies on the device controlled by the PC.</source>
+ <translation>Faire des photocopies sur le périphérique contrôlé par le PC.</translation>
+ </message>
+ <message>
+ <source>Unload Photo Card &gt;&gt;</source>
+ <translation>Télécharger une carte mémoire photo &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>Unload Photo Card...</source>
+ <translation>Télécharger une carte mémoire photo …</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Unload Photo Card&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Télécharger une carte mémoire photo&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Copy images from the device&apos;s photo card to the PC.</source>
+ <translation>Copier des images à partir de la carte mémoire photo du périphérique vers le PC.</translation>
+ </message>
+ <message>
+ <source>ERROR: Device not supported.</source>
+ <translation>ERREUR : Périphérique non pris en charge.</translation>
+ </message>
+ <message>
+ <source>ERROR: Device not found. Please check connection and power-on device.</source>
+ <translation>ERREUR : Impossible de trouver le périphérique. Veuillez vérifier la connexion et la mise en marche du périphérique.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Photocards on your printer are only available by mounting them as drives using USB mass storage.&lt;/b&gt;&lt;p&gt;Please refer to your distribution&apos;s documentation for setup and usage instructions.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Avec votre imprimante, les cartes mémoire photo sont uniquement disponibles lorsqu&apos;elles sont installées comme unités de stockage de masse USB.&lt;/b&gt;&lt;p&gt;Veuillez consulter la documentation fournie pour plus d&apos;informations sur la configuration et l&apos;utilisation.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Unable to run command. No command specified.&lt;/b&gt;&lt;p&gt;Use &lt;pre&gt;Configure...&lt;/pre&gt; to specify a command to run.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Impossible d&apos;exécuter une commande. Aucune commande n&apos;a été spécifiée.&lt;/b&gt;&lt;p&gt;Utilisez &lt;pre&gt;Configurer...&lt;/pre&gt; pour indiquer la commande à exécuter.</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollPrintJobView</name>
+ <message>
+ <source>Pending</source>
+ <translation>En attente</translation>
+ </message>
+ <message>
+ <source>On hold</source>
+ <translation>En attente</translation>
+ </message>
+ <message>
+ <source>Printing</source>
+ <translation>Impression</translation>
+ </message>
+ <message>
+ <source>Stopped</source>
+ <translation>Arrêt</translation>
+ </message>
+ <message>
+ <source>Canceled</source>
+ <translation>Annulé</translation>
+ </message>
+ <message>
+ <source>Aborted</source>
+ <translation>Abandon</translation>
+ </message>
+ <message>
+ <source>Completed</source>
+ <translation>Terminé</translation>
+ </message>
+ <message>
+ <source>Print Control</source>
+ <translation>Contrôle de l&apos;impression</translation>
+ </message>
+ <message>
+ <source>Job Control</source>
+ <translation>Contrôle de la tâche</translation>
+ </message>
+ <message>
+ <source>1 Active Print Job</source>
+ <translation>1 Impression active</translation>
+ </message>
+ <message>
+ <source>%1 Active Print Jobs</source>
+ <translation>%1 impressions actives</translation>
+ </message>
+ <message>
+ <source>Set as Default</source>
+ <translation>Défini par défaut</translation>
+ </message>
+ <message>
+ <source>SET AS DEFAULT</source>
+ <translation>DEFINI PAR DEFAUT</translation>
+ </message>
+ <message>
+ <source>NOT SET AS DEFAULT</source>
+ <translation>NON DEFINI PAR DEFAUT</translation>
+ </message>
+ <message>
+ <source>The printer is currently: %1</source>
+ <translation>L’imprimante est actuellement : %1</translation>
+ </message>
+ <message>
+ <source>IDLE</source>
+ <translation>EN ATTENTE</translation>
+ </message>
+ <message>
+ <source>Stop Printer</source>
+ <translation>Arrêter l&apos;imprimante</translation>
+ </message>
+ <message>
+ <source>PROCESSING</source>
+ <translation>TRAITEMENT EN COURS</translation>
+ </message>
+ <message>
+ <source>STOPPED</source>
+ <translation>ARRETEE</translation>
+ </message>
+ <message>
+ <source>Start Printer</source>
+ <translation>Démarrer l&apos;imprimante</translation>
+ </message>
+ <message>
+ <source>ACCEPTING JOBS</source>
+ <translation>ACCEPTER LES TACHES</translation>
+ </message>
+ <message>
+ <source>Reject Jobs</source>
+ <translation>Rejeter les tâches</translation>
+ </message>
+ <message>
+ <source>REJECTING JOBS</source>
+ <translation>REJETER LES TACHES</translation>
+ </message>
+ <message>
+ <source>Accept Jobs</source>
+ <translation>Accepter les tâches</translation>
+ </message>
+ <message>
+ <source>Cancel all active print jobs</source>
+ <translation>Annuler toutes les impressions actives</translation>
+ </message>
+ <message>
+ <source>Cancel All Jobs</source>
+ <translation>Annuler toutes les tâches</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;%1&lt;/b&gt;</source>
+ <translation>&lt;b&gt;%1&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Job ID: %1</source>
+ <translation>ID de tâche : %1</translation>
+ </message>
+ <message>
+ <source>Cancel Job</source>
+ <translation>Annuler la tâche</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollPrintSettingsView</name>
+ <message>
+ <source>Basic</source>
+<translation>Simple</translation>
+ </message>
+ <message>
+ <source>Page Orientation</source>
+<translation>Orientation de la page</translation>
+ </message>
+ <message>
+ <source>Portrait</source>
+<translation>Portrait</translation>
+ </message>
+ <message>
+ <source>Landscape</source>
+<translation>Paysage</translation>
+ </message>
+ <message>
+ <source>Reverse landscape</source>
+<translation>Paysage inversé</translation>
+ </message>
+ <message>
+ <source>Reverse portrait</source>
+<translation>Portrait inversé</translation>
+ </message>
+ <message>
+ <source>Duplex (Print on both sides of the page)</source>
+<translation>Recto verso (impression sur les deux côtés de la page)</translation>
+ </message>
+ <message>
+ <source>Single sided</source>
+<translation>D'un côté</translation>
+ </message>
+ <message>
+ <source>Two sided (long edge)</source>
+<translation>Des deux côtés (côté long)</translation>
+ </message>
+ <message>
+ <source>Two sided (short edge)</source>
+<translation>Des deux côtés (côté court)</translation>
+ </message>
+ <message>
+ <source>Output Order (Print last page first)</source>
+<translation>Ordre de sortie (imprimer d'abord la dernière page)</translation>
+ </message>
+ <message>
+ <source>Normal (Print first page first)</source>
+<translation>Normal (imprimer d'abord la première page)</translation>
+ </message>
+ <message>
+ <source>Reversed (Print last page first)</source>
+<translation>Inversé (imprimer d'abord la dernière page)</translation>
+ </message>
+ <message>
+ <source>Collate (Group together multiple copies)</source>
+<translation>Assembler (grouper les exemplaires multiples)</translation>
+ </message>
+ <message>
+ <source>Quality</source>
+<translation>Qualité de la photocopie</translation>
+ </message>
+ <message>
+ <source>N-Up (Multiple document pages per printed page)</source>
+<translation>Disposition (plusieurs pages de document par page imprimée)</translation>
+ </message>
+ <message>
+ <source>Pages per Sheet</source>
+<translation>Pages par feuille</translation>
+ </message>
+ <message>
+ <source>1 sheet per page</source>
+<translation>1 feuille par page</translation>
+ </message>
+ <message>
+ <source>2 sheets per page</source>
+<translation>2 feuilles par page</translation>
+ </message>
+ <message>
+ <source>4 sheets per page</source>
+<translation>4 feuilles par page</translation>
+ </message>
+ <message>
+ <source>Layout</source>
+<translation>Disposition</translation>
+ </message>
+ <message>
+ <source>Bottom to top, left to right</source>
+<translation>De bas en haut, de gauche à droite</translation>
+ </message>
+ <message>
+ <source>Bottom to top, right to left</source>
+<translation>De bas en haut, de droite à gauche</translation>
+ </message>
+ <message>
+ <source>Left to right, bottom to top</source>
+<translation>De gauche à droite, de bas en haut</translation>
+ </message>
+ <message>
+ <source>Left to right, top to bottom</source>
+<translation>De gauche à droite, de bas en haut</translation>
+ </message>
+ <message>
+ <source>Right to left, bottom to top</source>
+<translation>De droite à gauche, de bas en haut</translation>
+ </message>
+ <message>
+ <source>Right to left, top to bottom</source>
+<translation>De droite à gauche, de haut en bas</translation>
+ </message>
+ <message>
+ <source>Top to bottom, left to right</source>
+<translation>De haut en bas, de gauche à droite</translation>
+ </message>
+ <message>
+ <source>Top to bottom, right to left</source>
+<translation>De haut en bas, de droite à gauche</translation>
+ </message>
+ <message>
+ <source>Printed Border Around Each Page</source>
+<translation>Bordure imprimée autour de chaque page</translation>
+ </message>
+ <message>
+ <source>Two thin borders</source>
+<translation>Deux bordures fines</translation>
+ </message>
+ <message>
+ <source>Two thick borders</source>
+<translation>Deux bordures épaisses</translation>
+ </message>
+ <message>
+ <source>No border</source>
+<translation>Aucune bordure</translation>
+ </message>
+ <message>
+ <source>One thin border</source>
+<translation>Une bordure fine</translation>
+ </message>
+ <message>
+ <source>One thick border</source>
+<translation>Une bordure épaisse</translation>
+ </message>
+ <message>
+ <source>Printout Appearance</source>
+<translation>Apparence de l'impression</translation>
+ </message>
+ <message>
+ <source>Brightness</source>
+<translation>Luminosité</translation>
+ </message>
+ <message>
+ <source>Gamma</source>
+<translation>Gamma</translation>
+ </message>
+ <message>
+ <source>Image Printing</source>
+<translation>Impression des images</translation>
+ </message>
+ <message>
+ <source>Fit to Page</source>
+<translation>Agrandissement, Réduction et Ajuster à la page</translation>
+ </message>
+ <message>
+ <source>Position on Page</source>
+<translation>Positionner sur la page</translation>
+ </message>
+ <message>
+ <source>Centered</source>
+<translation>Centrée</translation>
+ </message>
+ <message>
+ <source>Top</source>
+<translation>De haut en bas, de gauche à droite</translation>
+ </message>
+ <message>
+ <source>Left</source>
+<translation>De gauche à droite, de bas en haut</translation>
+ </message>
+ <message>
+ <source>Right</source>
+<translation>De droite à gauche, de bas en haut</translation>
+ </message>
+ <message>
+ <source>Top left</source>
+<translation>En haut à gauche</translation>
+ </message>
+ <message>
+ <source>Top right</source>
+<translation>En haut à droite</translation>
+ </message>
+ <message>
+ <source>Bottom</source>
+<translation>De bas en haut, de gauche à droite</translation>
+ </message>
+ <message>
+ <source>Bottom left</source>
+<translation>En bas à gauche</translation>
+ </message>
+ <message>
+ <source>Bottom right</source>
+<translation>En bas à droite</translation>
+ </message>
+ <message>
+ <source>Saturation</source>
+<translation>Saturation</translation>
+ </message>
+ <message>
+ <source>Hue (color shift/rotation)</source>
+<translation>Teinte (décalage des couleurs/rotation)</translation>
+ </message>
+ <message>
+ <source>&quot;Natural&quot; Scaling (relative to image)</source>
+<translation>Mise à l'échelle &quot;naturelle&quot; (par rapport à l'image)</translation>
+ </message>
+ <message>
+ <source>Scaling (relative to page)</source>
+<translation>Mise à l'échelle (par rapport à la page)</translation>
+ </message>
+ <message>
+ <source>Miscellaneous</source>
+<translation>Divers</translation>
+ </message>
+ <message>
+ <source>&quot;Pretty Print&quot; Text Documents (Add headers and formatting)</source>
+<translation>Impression &quot;Pretty Print&quot; des documents texte (ajout d'en-têtes et de mise en forme)</translation>
+ </message>
+ <message>
+ <source>Banner Pages</source>
+<translation>Pages de bannière</translation>
+ </message>
+ <message>
+ <source>No banner page</source>
+<translation>Aucune page de bannière</translation>
+ </message>
+ <message>
+ <source>Classified</source>
+<translation>Protégé</translation>
+ </message>
+ <message>
+ <source>Confidential</source>
+<translation>Confidentiel</translation>
+ </message>
+ <message>
+ <source>Secret</source>
+<translation>Secret</translation>
+ </message>
+ <message>
+ <source>Standard</source>
+<translation>Standard</translation>
+ </message>
+ <message>
+ <source>Top secret</source>
+<translation>Ultra secret</translation>
+ </message>
+ <message>
+ <source>Unclassified</source>
+<translation>Non protégé</translation>
+ </message>
+ <message>
+ <source>Mirror Printing</source>
+<translation>Impression en miroir</translation>
+ </message>
+ <message>
+ <source>Set Quality to &quot;Controlled by &apos;Printout Mode&apos;&quot; to enable.</source>
+<translation>Définir la qualité sur &quot;Contrôlée par le &apos;Mode d'impression&apos;&quot; pour activer l'option.</translation>
+ </message>
+ <message>
+ <source>On</source>
+<translation>Une bordure fine</translation>
+ </message>
+ <message>
+ <source>Off</source>
+<translation>Désactivé</translation>
+ </message>
+ <message>
+ <source>Set to default value of &quot;%1&quot;.</source>
+<translation>Ajuster à la valeur par défaut de &quot;%1&quot;.</translation>
+ </message>
+ <message>
+ <source>Start:</source>
+<translation>Début :</translation>
+ </message>
+ <message>
+ <source>End:</source>
+<translation>Fin :</translation>
+ </message>
+ <message>
+ <source>Set to default value of &quot;Start: %1, End: %2&quot;.</source>
+<translation>Ajuster à la valeur par défaut de &quot;Début : %1, Fin : %2&quot;.</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollPrintView</name>
+ <message>
+ <source>PDF Document</source>
+ <translation>Document PDF</translation>
+ </message>
+ <message>
+ <source>Postscript Document</source>
+ <translation>Document Postscript</translation>
+ </message>
+ <message>
+ <source>HP Graphics Language File</source>
+ <translation>HP Graphics Language File</translation>
+ </message>
+ <message>
+ <source>C Shell Script</source>
+ <translation>Script Shell C</translation>
+ </message>
+ <message>
+ <source>C Source Code</source>
+ <translation>Code source C</translation>
+ </message>
+ <message>
+ <source>C++ Source Code</source>
+ <translation>Code source C++</translation>
+ </message>
+ <message>
+ <source>Perl Script</source>
+ <translation>Script Perl</translation>
+ </message>
+ <message>
+ <source>Python Program</source>
+ <translation>Programme Python</translation>
+ </message>
+ <message>
+ <source>Shell Script</source>
+ <translation>Script Shell</translation>
+ </message>
+ <message>
+ <source>Plain Text</source>
+ <translation>Texte normal</translation>
+ </message>
+ <message>
+ <source>HTML Dcoument</source>
+ <translation>Dcoument HTML</translation>
+ </message>
+ <message>
+ <source>GIF Image</source>
+ <translation>Image GIF</translation>
+ </message>
+ <message>
+ <source>PNG Image</source>
+ <translation>Image PNG</translation>
+ </message>
+ <message>
+ <source>JPEG Image</source>
+ <translation>Image JPEG</translation>
+ </message>
+ <message>
+ <source>TIFF Image</source>
+ <translation>Image TIFF</translation>
+ </message>
+ <message>
+ <source>Bitmap (BMP) Image</source>
+ <translation>Image Bitmap (BMP)</translation>
+ </message>
+ <message>
+ <source>Photo CD Image</source>
+ <translation>Image Photo CD</translation>
+ </message>
+ <message>
+ <source>Portable Image (PNM)</source>
+ <translation>Image Portable (PNM)</translation>
+ </message>
+ <message>
+ <source>Portable B&amp;W Image (PBM)</source>
+ <translation>Image Portable N&amp;B (PBM)</translation>
+ </message>
+ <message>
+ <source>Portable Grayscale Image (PGM)</source>
+ <translation>Image Portable Niveaux de gris (PGM)</translation>
+ </message>
+ <message>
+ <source>Portable Color Image (PPM)</source>
+ <translation>Image Portable Couleur (PPM)</translation>
+ </message>
+ <message>
+ <source>SGI RGB</source>
+ <translation>SGI RVB</translation>
+ </message>
+ <message>
+ <source>X11 Bitmap (XBM)</source>
+ <translation>X11 Bitmap (XBM)</translation>
+ </message>
+ <message>
+ <source>X11 Pixmap (XPM)</source>
+ <translation>X11 Pixmap (XPM)</translation>
+ </message>
+ <message>
+ <source>Sun Raster Format</source>
+ <translation>Sun Raster Format</translation>
+ </message>
+ <message>
+ <source>File(s) to Print</source>
+ <translation>Ficher(s) à imprimer</translation>
+ </message>
+ <message>
+ <source>Print Options</source>
+ <translation>Options d&apos;impression</translation>
+ </message>
+ <message>
+ <source>&lt;&lt; Functions</source>
+ <translation>&lt;&lt;Fonctions</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Fermer</translation>
+ </message>
+ <message>
+ <source>Print File(s)</source>
+ <translation>Imprimer le(s) ficher(s)</translation>
+ </message>
+ <message>
+ <source>Order</source>
+ <translation>Ordre</translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation>Nom</translation>
+ </message>
+ <message>
+ <source>Type</source>
+ <translation>Type</translation>
+ </message>
+ <message>
+ <source>Path</source>
+ <translation>Chemin d&apos;accès</translation>
+ </message>
+ <message>
+ <source>Add File...</source>
+ <translation>Ajouter le fichier ...</translation>
+ </message>
+ <message>
+ <source>Show Types...</source>
+ <translation>Afficher les types ...</translation>
+ </message>
+ <message>
+ <source>Remove File</source>
+ <translation>Supprimer le fichier</translation>
+ </message>
+ <message>
+ <source>Move Down</source>
+ <translation>Vers le bas</translation>
+ </message>
+ <message>
+ <source>Move Up</source>
+ <translation>Vers le haut</translation>
+ </message>
+ <message>
+ <source>Show File Types...</source>
+ <translation>Afficher les types de fichiers ...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;You are trying to add a file that cannot be directly printed with this utility.&lt;/b&gt;&lt;p&gt;To print this file, use the print command in the application that created it.</source>
+ <translation>&lt;b&gt;Vous tentez d&apos;ajouter un fichier qui ne peut pas être directement imprimé à l&apos;aide de cet utilitaire.&lt;/b&gt;&lt;p&gt;Pour imprimer ce fichier, utilisez la commande d&apos;impression de l&apos;application où il a été créé.</translation>
+ </message>
+ <message>
+ <source>Number of copies:</source>
+ <translation>Nombre d&apos;exemplaires :</translation>
+ </message>
+ <message>
+ <source>Default</source>
+ <translation>Par défaut</translation>
+ </message>
+ <message>
+ <source>Page Range:</source>
+ <translation>Pages :</translation>
+ </message>
+ <message>
+ <source>All pages</source>
+ <translation>Toutes les pages</translation>
+ </message>
+ <message>
+ <source>Page range:</source>
+ <translation>Pages :</translation>
+ </message>
+ <message>
+ <source>Page set:</source>
+ <translation>Page en cours :</translation>
+ </message>
+ <message>
+ <source>Even pages</source>
+ <translation>Pages paires</translation>
+ </message>
+ <message>
+ <source>Odd pages</source>
+ <translation>Pages impaires</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Cannot print: Invalid page range: %1&lt;/b&gt;&lt;p&gt;A valid page range is a list of pages or ranges of pages separated by commas (e.g., 1-2,4,6-7)</source>
+ <translation>&lt;b&gt;Impression impossible : Groupe de pages incorrect : %1&lt;/b&gt;&lt;p&gt;Un groupe de pages doit être une liste de pages ou de plages de pages séparées par des virgules (e.g., 1-2,4,6-7)</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Cannot print: Device is busy or not available.&lt;/b&gt;&lt;p&gt;Please check device and try again. [1]</source>
+ <translation type="obsolete">&lt;b&gt;Impression impossible : Le périphérique est occupé ou indisponible.&lt;/b&gt;&lt;p&gt;Veuillez vérifier le périphérique et recommencer. [1]</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Cannot print: Printer is stopped.&lt;/b&gt;&lt;p&gt;Please START the printer to continue this print. Job will begin printing once printer is started.</source>
+ <translation>&lt;b&gt;Impression impossible : L&apos;imprimante est arrêtée.&lt;/b&gt;&lt;p&gt;Veuillez DEMARRER l&apos;imprimante pour continuer l&apos;impression. L&apos;impression commencera au démarrage de l&apos;imprimante.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Cannot print: Printer is not accepting jobs.&lt;/b&gt;&lt;p&gt;Please set the printer to ACCEPTING JOBS to continue printing.</source>
+ <translation>&lt;b&gt;Impression impossible : L&apos;imprimante n&apos;accepte pas les impressions.&lt;/b&gt;&lt;p&gt;Veuillez régler l&apos;imprimante sur ACCEPTER LES TACHES pour continuer l&apos;impression.</translation>
+ </message>
+ <message>
+ <source>Print command failed with error code %1</source>
+ <translation>Echec de la commande d&apos;impression, code d&apos;erreur : %1</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Cannot print: Device is busy or not available.&lt;/b&gt;&lt;p&gt;Please check device and try again.</source>
+<translation>&lt;b&gt;Impression impossible : Le périphérique est occupé ou indisponible.&lt;/b&gt;&lt;p&gt;Veuillez vérifier le périphérique, puis réessayer.</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollPrinterInfoView</name>
+ <message>
+ <source>No printers found for this device.</source>
+ <translation>Aucune imprimante trouvée pour ce périphérique.</translation>
+ </message>
+ <message>
+ <source>&lt;&lt; Tools</source>
+ <translation>&lt;&lt;Outils</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Fermer</translation>
+ </message>
+ <message>
+ <source>Fax</source>
+ <translation>Télécopieur</translation>
+ </message>
+ <message>
+ <source>Printer</source>
+ <translation>Imprimante</translation>
+ </message>
+ <message>
+ <source>Type: %1</source>
+ <translation>Type : %1</translation>
+ </message>
+ <message>
+ <source>Location: %1</source>
+ <translation>Emplacement : %1</translation>
+ </message>
+ <message>
+ <source>Description/Info: %1</source>
+ <translation>Description/Info : %1</translation>
+ </message>
+ <message>
+ <source>Idle</source>
+ <translation>En attente</translation>
+ </message>
+ <message>
+ <source>Processing</source>
+ <translation>Traitement en cours</translation>
+ </message>
+ <message>
+ <source>Stopped</source>
+ <translation>Arrêt</translation>
+ </message>
+ <message>
+ <source>Unknown</source>
+ <translation>Inconnu</translation>
+ </message>
+ <message>
+ <source>State: %1</source>
+ <translation>Etat : %1</translation>
+ </message>
+ <message>
+ <source>PPD/Driver: %1</source>
+ <translation>PPD/Pilote : %1</translation>
+ </message>
+ <message>
+ <source>CUPS/IPP Printer URI: %1</source>
+ <translation>URI de l&apos;imprimante CUPS/IPP : %1</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollStatusView</name>
+ <message>
+ <source>year</source>
+ <translation>an</translation>
+ </message>
+ <message>
+ <source>years</source>
+ <translation>ans</translation>
+ </message>
+ <message>
+ <source>month</source>
+ <translation>mois</translation>
+ </message>
+ <message>
+ <source>months</source>
+ <translation>mois</translation>
+ </message>
+ <message>
+ <source>week</source>
+ <translation>semaine</translation>
+ </message>
+ <message>
+ <source>weeks</source>
+ <translation>semaines</translation>
+ </message>
+ <message>
+ <source>day</source>
+ <translation>jour</translation>
+ </message>
+ <message>
+ <source>days</source>
+ <translation>jours</translation>
+ </message>
+ <message>
+ <source>hour</source>
+ <translation>heure</translation>
+ </message>
+ <message>
+ <source>hours</source>
+ <translation>heures</translation>
+ </message>
+ <message>
+ <source>minute</source>
+ <translation>minute</translation>
+ </message>
+ <message>
+ <source>minutes</source>
+ <translation>minutes</translation>
+ </message>
+ <message>
+ <source>second</source>
+ <translation>seconde</translation>
+ </message>
+ <message>
+ <source>seconds</source>
+ <translation>secondes</translation>
+ </message>
+ <message>
+ <source>one</source>
+ <translation>un(e)</translation>
+ </message>
+ <message>
+ <source>two</source>
+ <translation>deux</translation>
+ </message>
+ <message>
+ <source>three</source>
+ <translation>trois</translation>
+ </message>
+ <message>
+ <source>four</source>
+ <translation>quatre</translation>
+ </message>
+ <message>
+ <source>five</source>
+ <translation>cinq</translation>
+ </message>
+ <message>
+ <source>six</source>
+ <translation>six</translation>
+ </message>
+ <message>
+ <source>seven</source>
+ <translation>sept</translation>
+ </message>
+ <message>
+ <source>eight</source>
+ <translation>huit</translation>
+ </message>
+ <message>
+ <source>nine</source>
+ <translation>neuf</translation>
+ </message>
+ <message>
+ <source>ten</source>
+ <translation>dix</translation>
+ </message>
+ <message>
+ <source>eleven</source>
+ <translation>onze</translation>
+ </message>
+ <message>
+ <source>twelve</source>
+ <translation>douze</translation>
+ </message>
+ <message>
+ <source>(most recent)</source>
+ <translation>(plus récent)</translation>
+ </message>
+ <message>
+ <source>User:</source>
+ <translation>Utilisateur :</translation>
+ </message>
+ <message>
+ <source>Job ID:</source>
+ <translation>ID de tâche :</translation>
+ </message>
+ <message>
+ <source>n/a</source>
+ <translation>n/a</translation>
+ </message>
+ <message>
+ <source>Code:</source>
+ <translation>Code :</translation>
+ </message>
+ <message>
+ <source>(about %1 ago)</source>
+ <translation>(il y a environ %1)</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollSuppliesView</name>
+ <message>
+ <source>ERROR: Device not supported.</source>
+ <translation>ERREUR : Périphérique non pris en charge.</translation>
+ </message>
+ <message>
+ <source>ERROR: Supplies status is not supported on this device.</source>
+ <translation>ERREUR : La fonction d&apos;état des fournitures n&apos;est pas prise en charge par ce périphérique.</translation>
+ </message>
+ <message>
+ <source>ERROR: Device not found. Please check connection and power-on device.</source>
+ <translation>ERREUR : Impossible de trouver le périphérique. Veuillez vérifier la connexion et la mise en marche du périphérique.</translation>
+ </message>
+ <message>
+ <source>Part No. %1</source>
+ <translation>Référence %1</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollTestpageView</name>
+ <message>
+ <source>&lt;&lt; Tools</source>
+ <translation>&lt;&lt;Outils</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Fermer</translation>
+ </message>
+ <message>
+ <source>Print Test Page</source>
+ <translation>Imprimer une page de test</translation>
+ </message>
+ <message>
+ <source>Test Page Type</source>
+ <translation>Type de page de test</translation>
+ </message>
+ <message>
+ <source>Printer diagnostic page (does not test print driver)</source>
+ <translation>Page de diagnostic de l&apos;imprimante (pas de test du pilote de l&apos;imprimante)</translation>
+ </message>
+ <message>
+ <source>HPLIP test page (tests print driver)</source>
+ <translation>Page de test HPLIP (teste le pilote de l&apos;imprimante)</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;A test page should be printing on your printer.&lt;/b&gt;&lt;p&gt;If the page fails to print, please visit http://hplip.sourceforge.net for troubleshooting and support.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Une page de test doit s&apos;imprimer sur votre imprimante.&lt;/b&gt;&lt;p&gt;En cas d&apos;échec, veuillez consulter le site http://hplip.sourceforge.net qui fournit des informations de dépannage et d&apos;assistance.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Device is busy or in an error state.&lt;/b&gt;&lt;p&gt;Please check device and try again.</source>
+<translation>&lt;b&gt;Le périphérique est occupé ou dans un état d'erreur&lt;/b&gt;&lt;p&gt;Veuillez vérifier le périphérique et recommencer.</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollToolView</name>
+ <message>
+ <source>&lt;b&gt;Device Settings&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Paramètres du périphérique&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Your device has special device settings. You may alter these settings here.</source>
+ <translation>Votre périphérique a des paramètres spéciaux. Vous pouvez les modifier ici.</translation>
+ </message>
+ <message>
+ <source>Device Settings...</source>
+ <translation>Paramètres du périphérique ...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Fax Setup&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Configuration du télécopieur&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Fax support must be setup before you can send faxes.</source>
+ <translation>La prise en charge de la télécopie doit être configurée pour que vous puissez envoyer des télécopies.</translation>
+ </message>
+ <message>
+ <source>Setup Fax...</source>
+ <translation>Configuration du télécopieur …</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Fax Address Book&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Carnet d&apos;adresses de télécopie&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Setup fax phone numbers to use when sending faxes from the PC.</source>
+ <translation>Configure les numéros de télécopie pour l&apos;envoi de télécopies à partir du PC.</translation>
+ </message>
+ <message>
+ <source>Fax Address Book...</source>
+ <translation>Carnet d&apos;adresses de télécopie …</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Print Test Page&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Imprimer une page de test&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Print a test page to test the setup of your printer.</source>
+ <translation>Imprimer une page de test pour vérifier la configuration de votre imprimante.</translation>
+ </message>
+ <message>
+ <source>Print Test Page &gt;&gt;</source>
+ <translation>Imprimer une page de test &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;View Printer (Queue) Information&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Afficher les informations de l&apos;imprimante (File)&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>View the printers (queues) installed in CUPS.</source>
+ <translation>Afficher les imprimantes (files) installées dans CUPS.</translation>
+ </message>
+ <message>
+ <source>View Printer Information &gt;&gt;</source>
+ <translation>Afficher les informations sur l’imprimante &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;View Device Information&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Afficher les informations sur le périphérique&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>This information is primarily useful for debugging and troubleshooting (advanced).</source>
+ <translation>Ces informations sont spécialement utiles pour la recherche d&apos;erreurs et le dépannage (avancé).</translation>
+ </message>
+ <message>
+ <source>View Device Information &gt;&gt;</source>
+ <translation>Afficher les informations sur le périphérique &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Print Quality Diagnostics&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Diagnostics de la qualité d&apos;impression&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Your printer can print a test page to help diagnose print quality problems.</source>
+ <translation>Votre imprimante peut fournir une page de test pour vous aider à diagnostiquer les problèmes de qualité d&apos;impression.</translation>
+ </message>
+ <message>
+ <source>Print Diagnostic Page...</source>
+ <translation>Imprimer une page de diagnostic …</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Download Firmware&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Télécharger le micrologiciel&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Download firmware to your printer (required on some devices after each power-up).</source>
+ <translation>Télécharger le micrologiciel dans votre imprimante (requis après chaque mise en marche pour certains périphériques).</translation>
+ </message>
+ <message>
+ <source>Download Firmware...</source>
+ <translation>Télécharger le micrologiciel …</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Clean Cartridges&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Nettoyer les cartouches&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>You only need to perform this action if you are having problems with poor printout quality due to clogged ink nozzles.</source>
+ <translation>Cette opération ne doit être effectuée qu&apos;en cas de problème de réduction de la qualité dûe au bouchage des buses d&apos;encre.</translation>
+ </message>
+ <message>
+ <source>Clean Cartridges...</source>
+ <translation>Nettoyer les cartouches …</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Align Cartridges&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Aligner les cartouches&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>This will improve the quality of output when a new cartridge is installed.</source>
+ <translation>Cette opération améliore la qualité d&apos;impression après l&apos;installation d&apos;une nouvelle cartouche.</translation>
+ </message>
+ <message>
+ <source>Align Cartridges...</source>
+ <translation>Aligner les cartouches …</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Perform Color Calibration&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Calibrage des couleurs&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Use this procedure to optimimize your printer&apos;s color output.</source>
+ <translation>Cette opération permet d&apos;optimiser les impressions en couleurs.</translation>
+ </message>
+ <message>
+ <source>Color Calibration...</source>
+ <translation>Calibrage des couleurs …</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Perform Line Feed Calibration&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Calibrage du saut de ligne&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Use line feed calibration to optimize print quality (to remove gaps in the printed output).</source>
+ <translation>Le calibrage du saut de ligne permet d&apos;optimiser la qualité d&apos;impression (en supprimant les trous dans l&apos;impression).</translation>
+ </message>
+ <message>
+ <source>Line Feed Calibration...</source>
+ <translation>Calibrage du saut de ligne …</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Access Embedded Web Page&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Accès aux pages web incorporées&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>You can use your printer&apos;s embedded web server to configure, maintain, and monitor the device from a web browser.</source>
+ <translation>Vous pouvez utiliser le serveur web incorporé de votre imprimante pour configurer, gérer et surveiller le périphérique depuis un navigateur Web.</translation>
+ </message>
+ <message>
+ <source>Open in Browser...</source>
+ <translation>Ouvrir dans le navigateur ...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;View Documentation&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Afficher la documentation&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>View documentation installed on your system.</source>
+ <translation>Afficher la documentation installée dans votre système.</translation>
+ </message>
+ <message>
+ <source>View Documentation...</source>
+ <translation>Afficher la documentation …</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;An error occured downloading firmware file.&lt;/b&gt;&lt;p&gt;Please check your printer and try again.</source>
+ <translation>&lt;b&gt;Une erreur s&apos;est produite pendant le téléchargement du fichier du micrologiciel.&lt;/b&gt;&lt;p&gt;Veuillez vérifier votre imprimante et recommencer.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Device is busy or in an error state.&lt;/b&gt;&lt;p&gt;Please check device and try again.</source>
+ <translation>&lt;b&gt;Le périphérique est occupé ou dans un état d&apos;erreur&lt;/b&gt;&lt;p&gt;Veuillez vérifier le périphérique et recommencer.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Both cartridges are required for alignment.&lt;/b&gt;&lt;p&gt;Please install both cartridges and try again.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Les deux cartouches sont nécessaires pour l&apos;alignement.&lt;/b&gt;&lt;p&gt;Veuillez les installer toutes les deux et recommencer.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;One or more cartiridges are missing from the printer.&lt;/b&gt;&lt;p&gt;Please install cartridge(s) and try again.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Il manque une ou plusieur cartouches dans l&apos;imprimante.&lt;/b&gt;&lt;p&gt;Veuillez installer la/les cartouche(s) et recommencer.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Both the photo and color cartridges must be inserted into the printer to perform color calibration.&lt;/b&gt;&lt;p&gt;If you are planning on printing with the photo cartridge, please insert it and try again.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Les cartouches photo et couleur doivent être installées dans l&apos;imprimante pour le calibrage des couleurs.&lt;/b&gt;&lt;p&gt;Si vous avez l&apos;intention d&apos;utiliser la cartouche photo, veuillez l&apos;installer et recommencer.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Both the photo (regular photo or photo blue) and color cartridges must be inserted into the printer to perform color calibration.&lt;/b&gt;&lt;p&gt;If you are planning on printing with the photo or photo blue cartridge, please insert it and try again.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Les cartouches photo (cartouche photo normale ou photo bleue) et couleur doivent être installées dans l&apos;imprimante pour le calibrage des couleurs.&lt;/b&gt;&lt;p&gt;Si vous avez l&apos;intention d&apos;utiliser la cartouche photo ou la cartouche photo bleue, veuillez l&apos;installer et recommencer.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Cannot align with only the photo cartridge installed.&lt;/b&gt;&lt;p&gt;Please install other cartridges and try again.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Impossible d&apos;effectuer l&apos;alignement avec la cartouche photo seule.&lt;/b&gt;&lt;p&gt;Veuillez installer d&apos;autres cartouches et recommencer.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Operation failed. Device busy.&lt;/b&gt;</source>
+ <translation>&lt;p&gt;&lt;b&gt;Echec de l&apos;opération. Périphérique occupé.&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Unable to run command. No command specified.&lt;/b&gt;&lt;p&gt;Use &lt;pre&gt;Configure...&lt;/pre&gt; to specify a command to run.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Impossible d&apos;exécuter une commande. Aucune commande n&apos;a été spécifiée.&lt;/b&gt;&lt;p&gt;Utilisez &lt;pre&gt;Configurer...&lt;/pre&gt; pour indiquer la commande à exécuter.</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollUnloadView</name>
+ <message>
+ <source>ERROR: Photo Card Failed to Mount Properly. Please check device and card and try again.</source>
+ <translation>ERREUR : erreur de montage de la carte photo. Veuillez vérifier le périphérique et la carte, puis réessayer.</translation>
+ </message>
+ <message>
+ <source>Select File(s) to Unload from Photo Card</source>
+ <translation>Sélectionnez le(s) fichier(s) à télécharger depuis la carte photo</translation>
+ </message>
+ <message>
+ <source>Unload Folder</source>
+ <translation>Répertoire de déchargement</translation>
+ </message>
+ <message>
+ <source>Unload Options</source>
+ <translation>Options de déchargement</translation>
+ </message>
+ <message>
+ <source>&lt;&lt; Functions</source>
+ <translation>&lt;&lt; Fonctions</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Fermer</translation>
+ </message>
+ <message>
+ <source>Unload File(s)</source>
+ <translation>Décharger le(s) ficher(s)</translation>
+ </message>
+ <message>
+ <source>Select All</source>
+ <translation>Tout sélectionner</translation>
+ </message>
+ <message>
+ <source>Select None</source>
+ <translation>Aucun</translation>
+ </message>
+ <message>
+ <source>Show Thumbnails</source>
+ <translation>Afficher les miniatures</translation>
+ </message>
+ <message>
+ <source>No files selected</source>
+ <translation>Aucun fichier sélectionné</translation>
+ </message>
+ <message>
+ <source>1 file selected, %1</source>
+ <translation>1 fichier sélectionné, %1</translation>
+ </message>
+ <message>
+ <source>%1 files selected, %2</source>
+ <translation>%1 fichiers sélectionnés, %2</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;No thumbnail found in image.&lt;/b&gt;</source>
+ <translation>&lt;p&gt;&lt;b&gt;Aucune miniature trouvée dans l'image.&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Loading...</source>
+ <translation>Chargement en cours...</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Annuler</translation>
+ </message>
+ <message>
+ <source>HP Device Manager</source>
+ <translation>Gestionnaire de périphériques HP</translation>
+ </message>
+ <message>
+ <source>Browse...</source>
+ <translation>Parcourir...</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;The unload directory path you entered is not valid.&lt;/b&gt;&lt;p&gt;The directory must exist and you must have write permissions.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Le chemin d'accès au répertoire de déchargement spécifié n'est pas valide.&lt;/b&gt;&lt;p&gt;Le répertoire doit exister et vous devez disposer des autorisations d'écriture requises.</translation>
+ </message>
+ <message>
+ <source>File removal:</source>
+ <translation>Suppression du fichier :</translation>
+ </message>
+ <message>
+ <source>Leave unloaded files on photo card</source>
+ <translation>Laisser tous les fichiers déchargés sur la carte photo</translation>
+ </message>
+ <message>
+ <source>Remove all unloaded files from photo card</source>
+ <translation>Supprimer tous les fichiers déchargés de la carte mémoire</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;The unload directory path is not valid.&lt;/b&gt;&lt;p&gt;Please enter a new path and try again.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Le répertoire de déchargement spécifié n'est pas valide.&lt;/b&gt;&lt;p&gt;Veuillez spécifier un nouveau chemin d'accès, puis réessayer.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;No files are selected to unload.&lt;/b&gt;&lt;p&gt;Please select one or more files to unload and try again.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Aucun fichier n'a été sélectionné pour le déchargement.&lt;/b&gt;&lt;p&gt;Veuillez sélectionner un ou plusieurs fichiers à décharger, puis réessayer.</translation>
+ </message>
+ <message>
+ <source>Unloading card...</source>
+ <translation>Déchargement de la carte...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Unload cancelled at user request.&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Déchargement annulé à la demande de l'utilisateur.&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>ERROR: Photo Card Failed to Mount Properly. Please check device and card and try again.</source>
+<translation>ERREUR : erreur de montage de la carte photo. Veuillez vérifier le périphérique et la carte, puis réessayer.</translation>
+ </message>
+ <message>
+ <source>Select File(s) to Unload from Photo Card</source>
+<translation>Sélectionnez le(s) fichier(s) à télécharger depuis la carte photo</translation>
+ </message>
+ <message>
+ <source>Unload Folder</source>
+<translation>Répertoire de déchargement</translation>
+ </message>
+ <message>
+ <source>Unload Options</source>
+<translation>Options de déchargement</translation>
+ </message>
+ <message>
+ <source>&lt;&lt; Functions</source>
+<translation>&lt;&lt; Fonctions</translation>
+ </message>
+ <message>
+ <source>Close</source>
+<translation>Fermer</translation>
+ </message>
+ <message>
+ <source>Unload File(s)</source>
+<translation>Décharger le(s) ficher(s)</translation>
+ </message>
+ <message>
+ <source>Select All</source>
+<translation>Tout sélectionner</translation>
+ </message>
+ <message>
+ <source>Select None</source>
+<translation>Aucun</translation>
+ </message>
+ <message>
+ <source>Show Thumbnails</source>
+<translation>Afficher les miniatures</translation>
+ </message>
+ <message>
+ <source>No files selected</source>
+<translation>Aucun fichier sélectionné</translation>
+ </message>
+ <message>
+ <source>1 file selected, %1</source>
+<translation>1 fichier sélectionné, %1</translation>
+ </message>
+ <message>
+ <source>%1 files selected, %2</source>
+<translation>%1 fichiers sélectionnés, %2</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;No thumbnail found in image.&lt;/b&gt;</source>
+<translation>&lt;p&gt;&lt;b&gt;Aucune miniature trouvée dans l'image.&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Loading...</source>
+<translation>Chargement en cours...</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+<translation>Annuler</translation>
+ </message>
+ <message>
+ <source>HP Device Manager</source>
+<translation>Gestionnaire de périphériques HP</translation>
+ </message>
+ <message>
+ <source>Browse...</source>
+<translation>Parcourir...</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;The unload directory path you entered is not valid.&lt;/b&gt;&lt;p&gt;The directory must exist and you must have write permissions.</source>
+<translation>&lt;p&gt;&lt;b&gt;Le chemin d'accès au répertoire de déchargement spécifié n'est pas valide.&lt;/b&gt;&lt;p&gt;Le répertoire doit exister et vous devez disposer des autorisations d'écriture requises.</translation>
+ </message>
+ <message>
+ <source>File removal:</source>
+<translation>Suppression du fichier :</translation>
+ </message>
+ <message>
+ <source>Leave unloaded files on photo card</source>
+<translation>Laisser tous les fichiers déchargés sur la carte photo</translation>
+ </message>
+ <message>
+ <source>Remove all unloaded files from photo card</source>
+<translation>Supprimer tous les fichiers déchargés de la carte mémoire</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;The unload directory path is not valid.&lt;/b&gt;&lt;p&gt;Please enter a new path and try again.</source>
+<translation>&lt;p&gt;&lt;b&gt;Le répertoire de déchargement spécifié n'est pas valide.&lt;/b&gt;&lt;p&gt;Veuillez spécifier un nouveau chemin d'accès, puis réessayer.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;No files are selected to unload.&lt;/b&gt;&lt;p&gt;Please select one or more files to unload and try again.</source>
+<translation>&lt;p&gt;&lt;b&gt;Aucun fichier n'a été sélectionné pour le déchargement.&lt;/b&gt;&lt;p&gt;Veuillez sélectionner un ou plusieurs fichiers à décharger, puis réessayer.</translation>
+ </message>
+ <message>
+ <source>Unloading card...</source>
+<translation>Déchargement de la carte...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Unload cancelled at user request.&lt;/b&gt;</source>
+<translation>&lt;b&gt;Déchargement annulé à la demande de l'utilisateur.&lt;/b&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollView</name>
+ <message>
+ <source>ERROR: No device found or unsupported device.</source>
+ <translation>ERREUR : Aucun périphérique trouvé ou périphérique non pris en charge.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;%1 (read only)&lt;/b&gt;</source>
+ <translation>&lt;b&gt;%1 (lecture seule)&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Printer/Fax</source>
+ <translation>Imprimante/Télécopieur</translation>
+ </message>
+ <message>
+ <source>Printer/Fax Name:</source>
+ <translation>Imprimante/Télécopieur :</translation>
+ </message>
+ <message>
+ <source>Printer</source>
+ <translation>Imprimante</translation>
+ </message>
+ <message>
+ <source>Printer Name:</source>
+ <translation>Imprimante :</translation>
+ </message>
+ <message>
+ <source>Fax</source>
+ <translation>Télécopieur</translation>
+ </message>
+ <message>
+ <source>Fax Name:</source>
+ <translation>Télécopieur :</translation>
+ </message>
+ <message>
+ <source>Load Paper</source>
+ <translation>Charger le papier</translation>
+ </message>
+ <message>
+ <source>A page will be printed. Please load &lt;b&gt;plain paper&lt;/b&gt; into the printer.</source>
+ <translation>Une page va être imprimée. Veuillez charger du &lt;b&gt;papier ordinaire&lt;/b&gt; dans l&apos;imprimante.</translation>
+ </message>
+</context>
+<context>
+ <name>SettingsDialog</name>
+ <message>
+ <source>&lt;b&gt;One or more email addresses are missing.&lt;/b&gt;&lt;p&gt;Please enter this information and try again.</source>
+ <translation>&lt;b&gt;Il manque une ou plusieurs adresses électroniques.&lt;/b&gt;&lt;p&gt;Veuillez saisir cette information et recommencer.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Please check your email for a test message.&lt;/b&gt;&lt;p&gt;If the message doesn&apos;t arrive, please check your settings and try again.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Vérifiez le message de test dans votre boîte à lettres.&lt;/b&gt;&lt;p&gt;Si le message n&apos;est pas arrivé, veuillez vérifier vos paramètres et recommencer.</translation>
+ </message>
+</context>
+<context>
+ <name>SettingsDialog_base</name>
+ <message>
+ <source>HP Device Manager - Settings</source>
+ <translation>Gestionnaire de périphériques HP - Paramètres</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Annuler</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Configure if and when device(s) are automatically refreshed&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Choisir le(s) périphérique(s) automatiquement actualisé(s) et le moment de l&apos;actualisation&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Enable device auto refresh</source>
+ <translation>Activer l&apos;actualisation automatique du périphérique</translation>
+ </message>
+ <message>
+ <source>Auto Interval</source>
+ <translation>Intervalle automatique</translation>
+ </message>
+ <message>
+ <source>Refresh every:</source>
+ <translation>Actualiser toutes les :</translation>
+ </message>
+ <message>
+ <source>seconds</source>
+ <translation>secondes</translation>
+ </message>
+ <message>
+ <source>Device(s) to Refresh </source>
+ <translation>Périphérique(s) à actualiser</translation>
+ </message>
+ <message>
+ <source>Only currently selected device</source>
+ <translation>Uniquement le périphérique sélectionné</translation>
+ </message>
+ <message>
+ <source>All devices</source>
+ <translation>Tous les périphériques</translation>
+ </message>
+ <message>
+ <source>Auto Refresh</source>
+ <translation>Actualisation automatique</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Configure if the HP Device Manager will send email on alerts&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Définir si le Gestionnaire de périphériques HP doit envoyer des alertes par courriel&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Send email when device errors occur:</source>
+ <translation>Envoyer un courriel en cas d&apos;erreur sur le périphérique :</translation>
+ </message>
+ <message>
+ <source>Test</source>
+ <translation>Test</translation>
+ </message>
+ <message>
+ <source>To: Address(es)</source>
+ <translation>A : Adresse(s)</translation>
+ </message>
+ <message>
+ <source>Email address(es):</source>
+ <translation>Adresse(s) électronique(s) :</translation>
+ </message>
+ <message>
+ <source>&lt;i&gt;Note: Separate multiple email address with a commas.&lt;/i&gt;</source>
+ <translation>&lt;i&gt;Remarque : Séparez les adresses électroniques par des virgules.&lt;/i&gt;</translation>
+ </message>
+ <message>
+ <source>From: Address</source>
+ <translation>De : Adresse</translation>
+ </message>
+ <message>
+ <source>Sender email address:</source>
+ <translation>Adresse électronique de l&apos;expéditeur :</translation>
+ </message>
+ <message>
+ <source>&lt;i&gt;Note: This should generally be your email address.&lt;/i&gt;</source>
+ <translation>&lt;i&gt;Remarque : Il s&apos;agit généralement de votre propre adresse électronique.&lt;/i&gt;</translation>
+ </message>
+ <message>
+ <source>Email Alerts</source>
+ <translation>Alertes par courriel</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Configure what commands to run for device functions&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Définir les commandes à exécuter pour les différentes fonctions du périphérique&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Access Photo Cards</source>
+ <translation>Accès aux cartes mémoire photo</translation>
+ </message>
+ <message>
+ <source>Built-in access photo cards function</source>
+ <translation>Fonction intégrée d&apos;accès aux cartes photo</translation>
+ </message>
+ <message>
+ <source>External command:</source>
+ <translation>Commande externe :</translation>
+ </message>
+ <message>
+ <source>Send PC Fax</source>
+ <translation>Envoyer une télécopie via le PC</translation>
+ </message>
+ <message>
+ <source>Built-in send PC fax function</source>
+ <translation>Fonction intégrée d&apos;envoi de télécopie via le PC</translation>
+ </message>
+ <message>
+ <source>Scan</source>
+ <translation>Scanner</translation>
+ </message>
+ <message>
+ <source>Built-in scan function</source>
+ <translation>Fonction intégrée de numérisation</translation>
+ </message>
+ <message>
+ <source>External scan command:</source>
+ <translation>Commande externe de numérisation :</translation>
+ </message>
+ <message>
+ <source>Print</source>
+ <translation>Imprimer</translation>
+ </message>
+ <message>
+ <source>Built-in print function</source>
+ <translation>Fonction intégrée d&apos;impression</translation>
+ </message>
+ <message>
+ <source>Set Defaults</source>
+ <translation>Définir les paramètres par défaut</translation>
+ </message>
+ <message>
+ <source>Make Copies</source>
+ <translation>Photocopier</translation>
+ </message>
+ <message>
+ <source>Built-in make copies function</source>
+ <translation>Fonction intégrée de photocopie</translation>
+ </message>
+ <message>
+ <source>Functions (Advanced)</source>
+ <translation>Fonctions (Avancées)</translation>
+ </message>
+</context>
+<context>
+ <name>SetupForm</name>
+ <message>
+ <source>Current: Filter: &quot;%2&quot; Search: &quot;%3&quot; TTL: %4 Timeout: %5s</source>
+ <translation>Actuelles : Filtre : &quot;%2&quot; Rechercher : &quot;%3&quot; TTL : %4 Délai : %5s</translation>
+ </message>
+ <message>
+ <source>The printer name and fax name must be different. Please choose different names.</source>
+<translation>Les noms de l’imprimante et du télécopieur doivent être différents. Veuillez choisir des noms différents.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Device not found.&lt;/b&gt; &lt;p&gt;Please make sure your printer is properly connected and powered-on.</source>
+<translation>&lt;b&gt;Impossible de trouver le périphérique.&lt;/b&gt; &lt;p&gt;Vérifiez que votre imprimante est correctement connectée et en marche.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;No devices found.&lt;/b&gt;&lt;p&gt;Please make sure your printer is properly connected and powered-on.</source>
+ <translation>&lt;b&gt;Aucun périphérique détecté.&lt;/b&gt;&lt;p&gt;Vérifiez que votre imprimante est correctement connctée et en marche.</translation>
+ </message>
+ <message>
+ <source>Current Settings: Filter: &quot;%2&quot; Search: &quot;%3&quot; TTL: %4 Timeout: %5s</source>
+ <translation>Paramètres actuels : Filtre : &quot;%2&quot; Rechercher : &quot;%3&quot; TTL : %4 Délai : %5s</translation>
+ </message>
+ <message>
+ <source>network</source>
+ <translation>réseau</translation>
+ </message>
+ <message>
+ <source>USB bus</source>
+ <translation>bus USB</translation>
+ </message>
+ <message>
+ <source>parallel port</source>
+ <translation>port parallèle</translation>
+ </message>
+ <message>
+ <source>Model</source>
+ <translation>Modèle</translation>
+ </message>
+ <message>
+ <source>Serial No.</source>
+ <translation>Numéro de série</translation>
+ </message>
+ <message>
+ <source>IP Address</source>
+ <translation>Adresse IP</translation>
+ </message>
+ <message>
+ <source>Host Name</source>
+ <translation>Nom d&apos;hôte</translation>
+ </message>
+ <message>
+ <source>Device</source>
+ <translation>Périphérique</translation>
+ </message>
+ <message>
+ <source>Device URI</source>
+ <translation>URI périphérique</translation>
+ </message>
+ <message>
+ <source>%1 device(s) found on the %1:</source>
+ <translation>%1 périphérique(s) trouvé(s) sur le %1 :</translation>
+ </message>
+ <message>
+ <source>%1 device(s) found on the %1 at address %2:</source>
+ <translation>%1 périphérique(s) trouvé(s) sur le %1 à l&apos;adresse %2 :</translation>
+ </message>
+ <message>
+ <source>%1 device(s) found on the %1 at ID %2:</source>
+ <translation>%1 périphérique(s) trouvé(s) sur le %1 à l&apos;ID %2 :</translation>
+ </message>
+ <message>
+ <source>%1 device(s) found on the %1 device node ID %2:</source>
+ <translation>%1 périphérique(s) trouvé(s) sur le %1 au noeud périphérique %2 :</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Device not found or invalid HPLIP device.&lt;/b&gt;&lt;p&gt;If you specified a USB ID, IP address, or other parameter, please re-check it and try again.</source>
+ <translation>&lt;b&gt;Périphérique non trouvé ou périphérique HPLIP incorrect.&lt;/b&gt;&lt;p&gt;Si vous avez indiqué un ID USB, une adresse IP ou un autre paramètre, vérifiez-le et recommencez.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;PPD not file found.&lt;/b&gt;&lt;p&gt;An appropriate PPD file could not be found. Please check your HPLIP install, use &lt;i&gt;Select Other...&lt;/i&gt;, or download one from linuxprinting.org.</source>
+ <translation>&lt;b&gt;Aucun fichier PPD trouvé.&lt;/b&gt;&lt;p&gt;Impossible de trouver un fichier PPD correct. Veuillez vérifier votre installation HPLIP, utilisez &lt;i&gt;Sélectionner un autre ...&lt;/i&gt;, ou téléchargez-en un sur le site linuxprinting.org.</translation>
+ </message>
+ <message>
+ <source>You must enter a name for the printer.</source>
+ <translation>Vous devez saisir un nom pour l&apos;imprimante.</translation>
+ </message>
+ <message>
+ <source>A printer already exists with this name. Please choose a different name.</source>
+ <translation>Il existe déjà une imprimante portant le même nom. Veuillez choisir un autre nom.</translation>
+ </message>
+ <message>
+ <source>You must enter a fax name.</source>
+ <translation>Vous devez saisir un nom pour le télécopieur.</translation>
+ </message>
+ <message>
+ <source>A fax already exists with this name. Please choose a different name.</source>
+ <translation>Il existe déjà un télécopieur imprimante portant le même nom. Veuillez choisir un autre nom.</translation>
+ </message>
+ <message>
+ <source>Unable to communicate with the device. Please check the device and try again.</source>
+ <translation>Impossible de communiquer avec le périphérique. Veuillez vérifier le périphérique et recommencer.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Device I/O Error&lt;/b&gt;&lt;p&gt;Could not communicate with device. Device may be busy.</source>
+ <translation>&lt;b&gt;Erreur d&apos;E/S du périphérique&lt;/b&gt;&lt;p&gt;Impossible de communiquer avec le périphérique. Le périphérique peut être occupé.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Printer queue setup failed.&lt;/b&gt;&lt;p&gt;Please restart CUPS and try again.</source>
+ <translation>&lt;b&gt;Echec de la configuration de la liste d&apos;imprimantes.&lt;/b&gt;&lt;p&gt;Veuillez redémarrer CUPS et recommencer.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Unable to find HP fax PPD file.&lt;/b&gt;&lt;p&gt;Please check you HPLIP installation and try again.</source>
+ <translation>&lt;b&gt;Impossible de trouver le fichier PPD du télécopieur HP.&lt;/b&gt;&lt;p&gt;Veuillez vérifier l&apos;installation de HPLIP et recommencer.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Fax queue setup failed.&lt;/b&gt;&lt;p&gt;Please restart CUPS and try again.</source>
+ <translation>&lt;b&gt;Echec de la configuration de la liste de télécopieurs.&lt;/b&gt;&lt;p&gt;Veuillez redémarrer CUPS et recommencer.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Unable to print to printer.&lt;/b&gt;&lt;p&gt;Please check device and try again.</source>
+ <translation>&lt;b&gt;Impossible d&apos;imprimer.&lt;/b&gt;&lt;p&gt;Veuillez vérifier le périphérique et recommencer.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;No CUPS queue found for device.&lt;/b&gt;&lt;p&gt;Please install the printer in CUPS and try again.</source>
+ <translation>&lt;b&gt;Aucune file CUPS trouvée pour ce périphérique.&lt;/b&gt;&lt;p&gt;Veuillez installer l&apos;imprimante dans CUPS et recommencer.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Printer Error.&lt;/b&gt;&lt;p&gt;Printer is busy, offline, or in an error state. Please check the device and try again.</source>
+ <translation>&lt;b&gt;Erreur de l&apos;imprimante.&lt;/b&gt;&lt;p&gt;L&apos;imprimante est occupée, désactivée ou en erreur. Veuillez vérifier le périphérique et recommencer.</translation>
+ </message>
+</context>
+<context>
+ <name>SetupForm_base</name>
+ <message>
+ <source>PPD File</source>
+ <translation>Fichier PPD</translation>
+ </message>
+ <message>
+ <source>Description</source>
+ <translation>Description</translation>
+ </message>
+ <message>
+ <source>HP Device Manger - Printer Setup Wizard</source>
+ <translation>Gestionnaire de périphériques HP – Assistant de configuration de l&apos;imprimante</translation>
+ </message>
+ <message>
+ <source>Connection (I/O) Type</source>
+ <translation>Type de connexion (E/S)</translation>
+ </message>
+ <message>
+ <source>Universal Serial Bus (USB)</source>
+ <translation>USB (Universal Serial Bus)</translation>
+ </message>
+ <message>
+ <source>Network/Ethernet/Wireless (direct connection or JetDirect)</source>
+ <translation>Réseau/Ethernet/Sans fil (connexion directe ou via JetDirect)</translation>
+ </message>
+ <message>
+ <source>Parallel Port (LPT)</source>
+ <translation>Port parallèle (LPT)</translation>
+ </message>
+ <message>
+ <source>Advanced...</source>
+ <translation>Avancé …</translation>
+ </message>
+ <message>
+ <source>Choose Connection Type</source>
+ <translation>Choisir un type de connexion</translation>
+ </message>
+ <message>
+ <source>probeHeadingTextLabel</source>
+ <translation>probeHeadingTextLabel</translation>
+ </message>
+ <message>
+ <source>Find Manually...</source>
+ <translation>Rechercher manuellement ...</translation>
+ </message>
+ <message>
+ <source>Refresh</source>
+ <translation>Actualiser</translation>
+ </message>
+ <message>
+ <source>Select from Discovered Devices</source>
+ <translation>Sélectionner dans la liste des périphériques trouvés</translation>
+ </message>
+ <message>
+ <source>Select Other...</source>
+ <translation>Sélectionner un autre périphérique...</translation>
+ </message>
+ <message>
+ <source>Defaults</source>
+ <translation>Paramètres par défaut</translation>
+ </message>
+ <message>
+ <source>Please chose the PPD file (by name and description) that most closely matches your printer. &lt;i&gt;Note: The model name of the printer may vary somehwat from the PPD file name, for example, a Deskjet 5550 may have a PPD file with the model name of Deskjet_5500_series.&lt;/i&gt;</source>
+ <translation>Veuillez sélectionner le fichier PPPD (par nom et description) correspondant le mieux à votre imprimante. &lt;i&gt;Remarque : Le nom du modèle peut être légèrement différent dans le nom du fichier PPD, par exemple une Deskjet 5550 pet avoir un fichier PPD dans lequel son nom est Deskjet_5500_series.&lt;/i&gt;</translation>
+ </message>
+ <message>
+ <source>Select/Confirm PPD File</source>
+ <translation>Sélectionner/Confirmer le fichier PPD</translation>
+ </message>
+ <message>
+ <source>Printer Information</source>
+ <translation>Informations sur l’imprimante</translation>
+ </message>
+ <message>
+ <source>Default</source>
+ <translation>Par défaut</translation>
+ </message>
+ <message>
+ <source>Location:</source>
+ <translation>Emplacement :</translation>
+ </message>
+ <message>
+ <source>Printer Name:</source>
+ <translation>Imprimante :</translation>
+ </message>
+ <message>
+ <source>Description:</source>
+ <translation>Description :</translation>
+ </message>
+ <message>
+ <source>Fax Information</source>
+ <translation>Informations sur le télécopieur</translation>
+ </message>
+ <message>
+ <source>Fax Name:</source>
+ <translation>Télécopieur :</translation>
+ </message>
+ <message>
+ <source>Name/Company:</source>
+ <translation>Nom/Société :</translation>
+ </message>
+ <message>
+ <source>Fax Number:</source>
+ <translation>Numéro de télécopie :</translation>
+ </message>
+ <message>
+ <source>Setup PC send fax</source>
+ <translation>Configurer l&apos;envoi de télécopie via le PC</translation>
+ </message>
+ <message>
+ <source>Click &quot;Next &gt;&quot; to install the printer on your system.</source>
+ <translation>Clquez sur &quot;Suivant&gt;&quot; pour installer l&apos;imprimante sur votre système.</translation>
+ </message>
+ <message>
+ <source>Enter Printer Information</source>
+ <translation>Saisissez les informations sur l&apos;imprimante</translation>
+ </message>
+ <message>
+ <source>Send test page to printer</source>
+ <translation>Envoyer une page de test à l&apos;imprimante</translation>
+ </message>
+ <message>
+ <source>Fax Summary</source>
+ <translation>Vue d&apos;ensemble du télécopieur</translation>
+ </message>
+ <message>
+ <source>Printer Summary</source>
+ <translation>Vue d&apos;ensemble de l&apos;imprimante</translation>
+ </message>
+ <message>
+ <source>PPD File:</source>
+ <translation>Fichier PPD :</translation>
+ </message>
+ <message>
+ <source>The printer has been successfully installed on your system.</source>
+ <translation>L&apos;imprimante a bien été installée sur votre système.</translation>
+ </message>
+ <message>
+ <source>Finished Adding Printer</source>
+ <translation>Ajout d&apos;imprimante terminé</translation>
+ </message>
+</context>
+<context>
+ <name>SetupManualFind</name>
+ <message>
+ <source>Please enter the printer&apos;s network hostname or IP address.</source>
+ <translation>Veuillez saisir le nom d&apos;hôte de l&apos;imprimante dans le réseau ou son adresse IP.</translation>
+ </message>
+ <message>
+ <source>&lt;i&gt;(IPv4 address &quot;a.b.c.d&quot; or &quot;hostname&quot;.)&lt;/i&gt;</source>
+ <translation>&lt;i&gt;(adresse IPv4 &quot;a.b.c.d&quot; ou &quot;nom d&apos;hôte&quot;.)&lt;/i&gt;</translation>
+ </message>
+ <message>
+ <source>Hostname or IP Address:</source>
+ <translation>Nom d&apos;hôte ou adresse IP :</translation>
+ </message>
+ <message>
+ <source>Please enter the USB ID for the printer.</source>
+ <translation>Veuillez saisir l&apos;ID USB de l&apos;imprimante.</translation>
+ </message>
+ <message>
+ <source>&lt;i&gt;(&quot;xxx:yyy&quot; where xxx is the USB bus ID and yyy is the USB device ID. The &apos;:&apos; and all leading zeroes must be present. Use &apos;lsusb&apos; to determine this information.)&lt;/i&gt;</source>
+ <translation>&lt;i&gt;(&quot;xxx:yyy&quot; où xxx est l&apos;ID du bus USB et yyy l&apos;ID du périphérique USB. Les &apos;:&apos; et tous les zéros de gauche doivent être présents. Utilisez &apos;lsusb&apos; pour trouver cette information.)&lt;/i&gt;</translation>
+ </message>
+ <message>
+ <source>USB ID:</source>
+ <translation>ID USB :</translation>
+ </message>
+ <message>
+ <source>Please enter the filesystem device node for the printer.</source>
+ <translation>Veuillez saisir le noeud du système de fichier pour l&apos;imprimante.</translation>
+ </message>
+ <message>
+ <source> &lt;i&gt;(&quot;/dev/parportX&quot;, X=0,1,2,...)&lt;/i&gt;</source>
+ <translation>&lt;i&gt;(&quot;/dev/parportX&quot;, X=0,1,2,...)&lt;/i&gt;</translation>
+ </message>
+ <message>
+ <source>Device Node:</source>
+ <translation>Noeud périphérique :</translation>
+ </message>
+</context>
+<context>
+ <name>SetupManualFind_base</name>
+ <message>
+ <source>HP Device Manager - Manually Find Device</source>
+ <translation>Gestionnaire de périphériques HP – Rechercher manuellement un périphérique</translation>
+ </message>
+ <message>
+ <source>TEXT</source>
+ <translation>TEXTE</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Annuler</translation>
+ </message>
+ <message>
+ <source>Find</source>
+ <translation>Rechercher</translation>
+ </message>
+ <message>
+ <source>textLabel1</source>
+ <translation>textLabel1</translation>
+ </message>
+ <message>
+ <source>IP/HN/SER/USB/DEV:</source>
+ <translation>IP/HN/SER/USB/DEV:</translation>
+ </message>
+</context>
+<context>
+ <name>SetupSettings_base</name>
+ <message>
+ <source>HP Device Manager - Setup Filters, Search and Settings</source>
+ <translation>Gestionnaire de périphériques HP – Filtres, Rechercher et Paramètres</translation>
+ </message>
+ <message>
+ <source>Discovery Filter</source>
+ <translation>Filtre de découverte</translation>
+ </message>
+ <message>
+ <source>Discover all devices</source>
+ <translation>Découvrir tous les périphériques</translation>
+ </message>
+ <message>
+ <source>Only discover devices that support the following functionality:</source>
+ <translation>Découvrir uniquement les périphériques prenant en charge la fonction suivante :</translation>
+ </message>
+ <message>
+ <source>PC Initiated Copying</source>
+ <translation>Copie lancée par le PC</translation>
+ </message>
+ <message>
+ <source>PC Photocard Access</source>
+ <translation>Accès aux cartes photo du PC</translation>
+ </message>
+ <message>
+ <source>Scan to PC</source>
+ <translation>Scanner dans le PC</translation>
+ </message>
+ <message>
+ <source>PC Send Fax</source>
+ <translation>Envoyer une télécopie via le PC</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Annuler</translation>
+ </message>
+ <message>
+ <source>Defaults</source>
+ <translation>Paramètres par défaut</translation>
+ </message>
+ <message>
+ <source>Discovery Search</source>
+ <translation>Recherche de découverte</translation>
+ </message>
+ <message>
+ <source>Search Term:</source>
+ <translation>Terme recherché :</translation>
+ </message>
+ <message>
+ <source>Network Discovery Settings</source>
+ <translation>Paramètres de découverte réseau</translation>
+ </message>
+ <message>
+ <source>TTL:</source>
+ <translation>TTL :</translation>
+ </message>
+ <message>
+ <source>Timeout (secs):</source>
+ <translation>Délai (s) :</translation>
+ </message>
+</context>
+<context>
+ <name>StringTable</name>
+ <message>
+ <source>Unknown</source>
+<translation>Inconnu</translation>
+ </message>
+ <message>
+ <source>Please correct the problem and try again.</source>
+<translation>Veuillez remédier au problème, puis réessayer.</translation>
+ </message>
+ <message>
+ <source>Please correct the problem and press continue on the printer.</source>
+<translation>Veuillez remédier au problème, puis appuyer sur Continuer sur l'imprimante.</translation>
+ </message>
+ <message>
+ <source>The printer has started a print job.</source>
+<translation>L'imprimante a démarré une tâche d'impression.</translation>
+ </message>
+ <message>
+ <source>Print job has completed.</source>
+<translation>La tâche d'impression est terminée.</translation>
+ </message>
+ <message>
+ <source>Started rendering a fax job.</source>
+<translation>Calcul d'une tâche de télécopie en cours.</translation>
+ </message>
+ <message>
+ <source>Rendering job completed.</source>
+<translation>Calcul de la tâche terminé.</translation>
+ </message>
+ <message>
+ <source>The printer is idle.</source>
+<translation>L’imprimante est en attente.</translation>
+ </message>
+ <message>
+ <source>The printer is busy.</source>
+<translation>L’imprimante est occupée.</translation>
+ </message>
+ <message>
+ <source>The print job is continuing.</source>
+<translation>La tâche d'impression continue.</translation>
+ </message>
+ <message>
+ <source>Turning off.</source>
+<translation>Arrêt en cours.</translation>
+ </message>
+ <message>
+ <source>Report printing.</source>
+<translation>Impression du rapport en cours.</translation>
+ </message>
+ <message>
+ <source>Canceling.</source>
+<translation>Annulation en cours.</translation>
+ </message>
+ <message>
+ <source>Waiting for ink to dry.</source>
+<translation>En attente du séchage de l'encre.</translation>
+ </message>
+ <message>
+ <source>Pen change.</source>
+<translation>Changement de stylet.</translation>
+ </message>
+ <message>
+ <source>The printer is out of paper.</source>
+<translation>L'imprimante n'a plus de papier.</translation>
+ </message>
+ <message>
+ <source>Please load more paper and follow the instructions on the front panel (if any) to continue printing.</source>
+<translation>Veuillez charger davantage de papier et suivre les instructions affichées sur le panneau avant (le cas échéant) pour poursuivre l'impression.</translation>
+ </message>
+ <message>
+ <source>Banner eject needed.</source>
+<translation>Éjection de la bannière nécessaire.</translation>
+ </message>
+ <message>
+ <source>Banner mismatch.</source>
+<translation>Défaut de correspondance de la bannière.</translation>
+ </message>
+ <message>
+ <source>Photo mismatch.</source>
+<translation>Défaut de correspondance de la photo.</translation>
+ </message>
+ <message>
+ <source>Duplex mismatch.</source>
+<translation>Erreur de correspondance de l'impression recto verso.</translation>
+ </message>
+ <message>
+ <source>Paper or cartridge carriage jammed.</source>
+<translation>Bourrage papier ou cartouche d'impression bloquée.</translation>
+ </message>
+ <message>
+ <source>Please clear the jam and press continue on the printer.</source>
+<translation>Veuillez remédier au bourrage ou blocage, puis appuyer sur Continuer sur l'imprimante.</translation>
+ </message>
+ <message>
+ <source>There is a problem with a cartridge.</source>
+<translation>Un problème s'est produit au niveau de la cartouche.</translation>
+ </message>
+ <message>
+ <source>Powering down.</source>
+<translation>Arrêt en cours.</translation>
+ </message>
+ <message>
+ <source>Front panel test.</source>
+<translation>Test du panneau avant.</translation>
+ </message>
+ <message>
+ <source>Clean out tray missing.</source>
+<translation>Le bac d'élimination est manquant.</translation>
+ </message>
+ <message>
+ <source>Output bin full.</source>
+<translation>Le bac de sortie est plein.</translation>
+ </message>
+ <message>
+ <source>Media size mismatch.</source>
+<translation>Défaut de correspondance de la taille de support.</translation>
+ </message>
+ <message>
+ <source>Duplexer is jammed.</source>
+<translation>Le module recto verso est bloqué.</translation>
+ </message>
+ <message>
+ <source>An ink cartridge is out of ink.</source>
+<translation>L'une des cartouches d'encre est vide.</translation>
+ </message>
+ <message>
+ <source>Internal device error.</source>
+<translation>Erreur interne du périphérique.</translation>
+ </message>
+ <message>
+ <source>Second tray missing.</source>
+<translation>Le deuxième bac est manquant.</translation>
+ </message>
+ <message>
+ <source>Duplexer missing.</source>
+<translation>Le module recto verso est manquant.</translation>
+ </message>
+ <message>
+ <source>Rear tray missing.</source>
+<translation>Le bac arrière est manquant.</translation>
+ </message>
+ <message>
+ <source>Cartridge not latched.</source>
+<translation>La cartouche n'est pas verrouillée.</translation>
+ </message>
+ <message>
+ <source>Battery very low.</source>
+<translation>Niveau de la batterie très faible.</translation>
+ </message>
+ <message>
+ <source>Output tray closed.</source>
+<translation>Le bac de sortie est fermé.</translation>
+ </message>
+ <message>
+ <source>Manual feed blocked.</source>
+<translation>L'alimentation manuelle est bloquée.</translation>
+ </message>
+ <message>
+ <source>Rear feed blocked.</source>
+<translation>L'alimentation arrière est bloquée.</translation>
+ </message>
+ <message>
+ <source>Second tray out of paper.</source>
+<translation>Le deuxième bac n'a plus de papier.</translation>
+ </message>
+ <message>
+ <source>Input tray locked.</source>
+<translation>Le bac d'alimentation est verrouillé.</translation>
+ </message>
+ <message>
+ <source>Non-HP ink.</source>
+<translation>Encre non HP.</translation>
+ </message>
+ <message>
+ <source>Pen calibration needs resume.</source>
+<translation>Le calibrage du stylet doit être repris.</translation>
+ </message>
+ <message>
+ <source>Media type mismatch.</source>
+<translation>Défaut de correspondance du type de support.</translation>
+ </message>
+ <message>
+ <source>Custom media mismatch.</source>
+<translation>Défaut de correspondance du support personnalisé.</translation>
+ </message>
+ <message>
+ <source>Pen cleaning in progress.</source>
+<translation>Nettoyage du stylet en cours.</translation>
+ </message>
+ <message>
+ <source>Pen checking in progress.</source>
+<translation>Vérification du stylet en cours.</translation>
+ </message>
+ <message>
+ <source>Black cartridge is low on ink</source>
+<translation>La cartouche d'encre noire est presque vide.</translation>
+ </message>
+ <message>
+ <source>Tri-color cartridge is low on ink</source>
+<translation>La cartouche d'encre tricolore est presque vide.</translation>
+ </message>
+ <message>
+ <source>Photo cartridge is low on ink</source>
+<translation>La cartouche d'encre photo est presque vide.</translation>
+ </message>
+ <message>
+ <source>Cyan cartridge is low on ink</source>
+<translation>La cartouche d'encre cyan est presque vide.</translation>
+ </message>
+ <message>
+ <source>Magenta cartridge is low on ink</source>
+<translation>La cartouche d'encre magenta est presque vide.</translation>
+ </message>
+ <message>
+ <source>Yellow cartridge is low on ink</source>
+<translation>La cartouche d'encre jaune est presque vide.</translation>
+ </message>
+ <message>
+ <source>Photo cyan cartridge is low on ink</source>
+<translation>La cartouche d'encre photo cyan est presque vide.</translation>
+ </message>
+ <message>
+ <source>Photo magenta cartridge is low on ink</source>
+<translation>La cartouche d'encre photo magenta est presque vide.</translation>
+ </message>
+ <message>
+ <source>Photo yellow cartridge is low on ink</source>
+<translation>La cartouche d'encre photo jaune est presque vide.</translation>
+ </message>
+ <message>
+ <source>Photo gray cartridge is low on ink</source>
+<translation>La cartouche d'encre photo grise est presque vide.</translation>
+ </message>
+ <message>
+ <source>Photo blue cartridge is low on ink</source>
+<translation>La cartouche d'encre photo bleue est presque vide.</translation>
+ </message>
+ <message>
+ <source>Black cartridge is low on toner</source>
+<translation>La cartouche de toner noire est presque vide.</translation>
+ </message>
+ <message>
+ <source>Cyan cartridge is low on toner</source>
+<translation>La cartouche de toner cyan est presque vide.</translation>
+ </message>
+ <message>
+ <source>Magenta cartridge is low on toner</source>
+<translation>La cartouche de toner magenta est presque vide.</translation>
+ </message>
+ <message>
+ <source>Yellow cartridge is low on toner</source>
+<translation>La cartouche de toner jaune est presque vide.</translation>
+ </message>
+ <message>
+ <source>Warming up.</source>
+<translation>Préchauffage en cours.</translation>
+ </message>
+ <message>
+ <source>Low paper.</source>
+<translation>Le bac à papier est presque vide.</translation>
+ </message>
+ <message>
+ <source>Door open.</source>
+<translation>La porte est ouverte.</translation>
+ </message>
+ <message>
+ <source>Offline.</source>
+<translation>Hors ligne.</translation>
+ </message>
+ <message>
+ <source>Low toner.</source>
+<translation>La cartouche de toner est presque vide.</translation>
+ </message>
+ <message>
+ <source>No toner.</source>
+<translation>Toner manquant.</translation>
+ </message>
+ <message>
+ <source>Service request.</source>
+<translation>Maintenance nécessaire.</translation>
+ </message>
+ <message>
+ <source>Fuser error.</source>
+<translation>Erreur de l'unité de fusion.</translation>
+ </message>
+ <message>
+ <source>Unsupported printer model.</source>
+<translation>Modèle d'imprimante non pris en charge.</translation>
+ </message>
+ <message>
+ <source>Scan job started.</source>
+<translation>Tâche de numérisation démarrée.</translation>
+ </message>
+ <message>
+ <source>Scan job completed.</source>
+<translation>Tâche de numérisation terminée.</translation>
+ </message>
+ <message>
+ <source>Scan job failed.</source>
+<translation>Échec de la tâche de numérisation.</translation>
+ </message>
+ <message>
+ <source>Fax job started.</source>
+<translation>Tâche de télécopie démarrée.</translation>
+ </message>
+ <message>
+ <source>Fax job complete.</source>
+<translation>Tâche de télécopie terminée.</translation>
+ </message>
+ <message>
+ <source>Fax job failed.</source>
+<translation>Échec de la tâche de télécopie.</translation>
+ </message>
+ <message>
+ <source>Fax job canceled.</source>
+<translation>Tâche de télécopie annulée.</translation>
+ </message>
+ <message>
+ <source>Fax send job continuing.</source>
+<translation>La tâche d'envoi de télécopie continue.</translation>
+ </message>
+ <message>
+ <source>Fax receive job continuing.</source>
+<translation>La tâche de réception de télécopie continue.</translation>
+ </message>
+ <message>
+ <source>Copy job started.</source>
+<translation>Tâche de photocopie démarrée.</translation>
+ </message>
+ <message>
+ <source>Copy job complete.</source>
+<translation>Tâche de photocopie terminée.</translation>
+ </message>
+ <message>
+ <source>Copy job failed.</source>
+<translation>Échec de la tâche de photocopie.</translation>
+ </message>
+ <message>
+ <source>Copy job canceled.</source>
+<translation>Tâche de photocopie annulée.</translation>
+ </message>
+ <message>
+ <source>Device is powered down or unplugged.</source>
+<translation>Le périphérique est éteint ou débranché.</translation>
+ </message>
+ <message>
+ <source>Device communication error.</source>
+<translation>Erreur de communication avec le périphérique.</translation>
+ </message>
+ <message>
+ <source>Device is busy.</source>
+<translation>Le périphérique est occupé.</translation>
+ </message>
+ <message>
+ <source>No data.</source>
+<translation>Aucune donnée.</translation>
+ </message>
+ <message>
+ <source>Unsupported I/O bus.</source>
+<translation>Bus E/S non pris en charge.</translation>
+ </message>
+ <message>
+ <source>Device does not support requested operation.</source>
+<translation>Le périphérique ne prend pas en charge l'opération demandée.</translation>
+ </message>
+ <message>
+ <source>To send a fax you must run hp-sendfax first.</source>
+<translation>Pour envoyer une télécopie, vous devez d'abord démarrer le programme hp-sendfax.</translation>
+ </message>
+ <message>
+ <source>Run hp-sendfax now to continue. Fax will resume within 10 seconds.</source>
+<translation>Démarrez hp-sendfax maintenant pour continuer. L'envoi de la télécopie reprendra d'ici 10 secondes.</translation>
+ </message>
+ <message>
+ <source>Photocard unload started.</source>
+<translation>Déchargement de la carte photo démarré.</translation>
+ </message>
+ <message>
+ <source>Photocard unload ended.</source>
+<translation>Déchargement de la carte photo terminé.</translation>
+ </message>
+ <message>
+ <source>Photocard unload failed.</source>
+<translation>Échec du déchargement de la carte photo.</translation>
+ </message>
+ <message>
+ <source>Make sure photocard is inserted properly and try again.</source>
+<translation>Assurez-vous que la carte photo est correctement insérée, puis réessayez.</translation>
+ </message>
+ <message>
+ <source>Unable to mount photocard on device.</source>
+<translation>Impossible de monter la carte photo sur le périphérique.</translation>
+ </message>
+ <message>
+ <source>Photocard unloaded successfully.</source>
+<translation>Déchargement de la carte photo réussi.</translation>
+ </message>
+ <message>
+ <source>Unknown error.</source>
+<translation>Erreur inconnue.</translation>
+ </message>
+ <message>
+ <source>Print</source>
+<translation>Programme d'installation du logiciel Imagerie et impression Linux HP (HPLIP)</translation>
+ </message>
+ <message>
+ <source>Scan</source>
+<translation>Tâche de numérisation démarrée.</translation>
+ </message>
+ <message>
+ <source>Send fax</source>
+<translation>Envoyer une télécopie</translation>
+ </message>
+ <message>
+ <source>Make copies</source>
+<translation>Photocopier</translation>
+ </message>
+ <message>
+ <source>Access photo cards</source>
+<translation>Accès aux cartes photo</translation>
+ </message>
+ <message>
+ <source>Invalid/missing</source>
+<translation>Incompatible/manquant(e)</translation>
+ </message>
+ <message>
+ <source>Invalid/missing ink cartridge</source>
+<translation>Cartouche d'encre incompatible/manquante</translation>
+ </message>
+ <message>
+ <source>Invalid/missing cartridge</source>
+<translation>Cartouche incompatible/manquante</translation>
+ </message>
+ <message>
+ <source>Invalid/missing print head</source>
+<translation>Tête d'impression incompatible/manquante</translation>
+ </message>
+ <message>
+ <source>Black print head</source>
+<translation>Tête d'impression noire</translation>
+ </message>
+ <message>
+ <source>Black ink cartridge</source>
+<translation>Cartouche d'encre noire</translation>
+ </message>
+ <message>
+ <source>Black cartridge</source>
+<translation>La cartouche d'encre noire est presque vide.</translation>
+ </message>
+ <message>
+ <source>Tri-color print head</source>
+<translation>Tête d'impression tricolore</translation>
+ </message>
+ <message>
+ <source>Tri-color ink cartridge</source>
+<translation>Cartouche d'encre tricolore</translation>
+ </message>
+ <message>
+ <source>Tri-color cartridge</source>
+<translation>La cartouche d'encre tricolore est presque vide.</translation>
+ </message>
+ <message>
+ <source>Photo print head</source>
+<translation>Tête d'impression photo</translation>
+ </message>
+ <message>
+ <source>Photo ink cartridge</source>
+<translation>Cartouche d'encre photo</translation>
+ </message>
+ <message>
+ <source>Photo cartridge</source>
+<translation>La cartouche d'encre photo est presque vide.</translation>
+ </message>
+ <message>
+ <source>Cyan print head</source>
+<translation>Tête d'impression cyan</translation>
+ </message>
+ <message>
+ <source>Cyan ink cartridge</source>
+<translation>Cartouche d'encore cyan</translation>
+ </message>
+ <message>
+ <source>Cyan cartridge</source>
+<translation>La cartouche d'encre cyan est presque vide.</translation>
+ </message>
+ <message>
+ <source>Magenta print head</source>
+<translation>Tête d'impression magenta</translation>
+ </message>
+ <message>
+ <source>Magenta ink cartridge</source>
+<translation>Cartouche d'encre magenta</translation>
+ </message>
+ <message>
+ <source>Magenta cartridge</source>
+<translation>La cartouche d'encre magenta est presque vide.</translation>
+ </message>
+ <message>
+ <source>Yellow print head</source>
+<translation>Tête d'impression jaune</translation>
+ </message>
+ <message>
+ <source>Yellow ink cartridge</source>
+<translation>Cartouche d'encre jaune</translation>
+ </message>
+ <message>
+ <source>Yellow cartridge</source>
+<translation>La cartouche d'encre jaune est presque vide.</translation>
+ </message>
+ <message>
+ <source>Photo cyan print head</source>
+<translation>Tête d'impression photo cyan</translation>
+ </message>
+ <message>
+ <source>Photo cyan ink cartridge</source>
+<translation>Cartouche d'encre photo cyan</translation>
+ </message>
+ <message>
+ <source>Photo cyan cartridge</source>
+<translation>La cartouche d'encre photo cyan est presque vide.</translation>
+ </message>
+ <message>
+ <source>Photo magenta print head</source>
+<translation>Tête d'impression photo magenta</translation>
+ </message>
+ <message>
+ <source>Photo magenta ink cartridge</source>
+<translation>Cartouche d'encre photo magenta</translation>
+ </message>
+ <message>
+ <source>Photo magenta cartridge</source>
+<translation>La cartouche d'encre photo magenta est presque vide.</translation>
+ </message>
+ <message>
+ <source>Photo yellow print head</source>
+<translation>Tête d'impression photo jaune</translation>
+ </message>
+ <message>
+ <source>Photo yellow ink cartridge</source>
+<translation>Cartouche d'encre photo jaune</translation>
+ </message>
+ <message>
+ <source>Photo yellow cartridge</source>
+<translation>La cartouche d'encre photo jaune est presque vide.</translation>
+ </message>
+ <message>
+ <source>Photo gray print head</source>
+<translation>Tête d'impression photo grise</translation>
+ </message>
+ <message>
+ <source>Photo gray ink cartridge</source>
+<translation>Cartouche d'encre photo grise</translation>
+ </message>
+ <message>
+ <source>Photo gray cartridge</source>
+<translation>La cartouche d'encre photo grise est presque vide.</translation>
+ </message>
+ <message>
+ <source>Photo blue print head</source>
+<translation>Tête d'impression photo bleue</translation>
+ </message>
+ <message>
+ <source>Photo blue ink cartridge</source>
+<translation>Cartouche d'encre photo bleue</translation>
+ </message>
+ <message>
+ <source>Photo blue cartridge</source>
+<translation>La cartouche d'encre photo bleue est presque vide.</translation>
+ </message>
+ <message>
+ <source>Print head</source>
+<translation>Tête d'impression</translation>
+ </message>
+ <message>
+ <source>Photo magenta and photo cyan print head</source>
+<translation>Tête d'impression photo magenta et photo cyan</translation>
+ </message>
+ <message>
+ <source>Magenta and yellow print head</source>
+<translation>Tête d'impression magenta et jaune</translation>
+ </message>
+ <message>
+ <source>Black and cyan print head</source>
+<translation>Tête d'impression noire et cyan</translation>
+ </message>
+ <message>
+ <source>Light gray and photo black print head</source>
+<translation>Tête d'impression photo gris clair et noire</translation>
+ </message>
+ <message>
+ <source>Light gray ink cartridge</source>
+<translation>Cartouche d'encre gris clair</translation>
+ </message>
+ <message>
+ <source>Medium gray ink cartridge</source>
+<translation>Cartouche d'encre gris moyen</translation>
+ </message>
+ <message>
+ <source>Photo black ink cartridge</source>
+<translation>Cartouche d'encre photo noire</translation>
+ </message>
+ <message>
+ <source>Cyan and magenta print head</source>
+<translation>Tête d'impression cyan et magenta</translation>
+ </message>
+ <message>
+ <source>Black and yellow print head</source>
+<translation>Tête d'impression noire et jaune</translation>
+ </message>
+ <message>
+ <source>Black toner cartridge</source>
+<translation>Cartouche de toner noir</translation>
+ </message>
+ <message>
+ <source>Cyan toner cartridge</source>
+<translation>Cartouche de toner cyan</translation>
+ </message>
+ <message>
+ <source>Magenta toner cartridge</source>
+<translation>Cartouche de toner magenta</translation>
+ </message>
+ <message>
+ <source>Yellow toner cartridge</source>
+<translation>Cartouche de toner jaune</translation>
+ </message>
+ <message>
+ <source>Maintenance kit (fuser)</source>
+<translation>Kit de maintenance (unité de fusion)</translation>
+ </message>
+ <message>
+ <source>Document feeder (ADF) kit</source>
+<translation>Kit de dispositif d’alimentation automatique</translation>
+ </message>
+ <message>
+ <source>Drum maintenance kit</source>
+<translation>Kit de maintenance du tambour</translation>
+ </message>
+ <message>
+ <source>Image transfer kit</source>
+<translation>Kit de transfert d'image</translation>
+ </message>
+ <message>
+ <source>Good/OK</source>
+<translation>Bon/OK</translation>
+ </message>
+ <message>
+ <source>Fair/Moderate</source>
+<translation>Correct/Moyen</translation>
+ </message>
+ <message>
+ <source>Not installed</source>
+<translation>Non installé</translation>
+ </message>
+ <message>
+ <source>Incorrect</source>
+<translation>Incorrect</translation>
+ </message>
+ <message>
+ <source>Failed</source>
+<translation>ERREUR : erreur de montage de la carte photo. Veuillez vérifier le périphérique et la carte, puis réessayer.</translation>
+ </message>
+ <message>
+ <source>Overheated</source>
+<translation>Surchauffe</translation>
+ </message>
+ <message>
+ <source>Discharging</source>
+<translation>Décharge en cours</translation>
+ </message>
+ <message>
+ <source>Charging</source>
+<translation>Charge en cours</translation>
+ </message>
+ <message>
+ <source>Low</source>
+<translation>Le bac à papier est presque vide.</translation>
+ </message>
+ <message>
+ <source>Very low</source>
+<translation>Très faible</translation>
+ </message>
+ <message>
+ <source>HPLIP: Email alert test message</source>
+<translation>HPLIP : Message test d'alerte par courriel</translation>
+ </message>
+ <message>
+ <source>This email is to test the functionality of HPLIP email alerts.</source>
+<translation>Ce courriel est destiné à tester le fonctionnement des alertes par courriel du logiciel HPLIP.</translation>
+ </message>
+ <message>
+ <source>HPLIP: Error/alert on device: </source>
+<translation>HPLIP : Erreur/alerte sur le périphérique :</translation>
+ </message>
+</context>
+<context>
+ <name>SupportForm_base</name>
+ <message>
+ <source>HP Device Manager - Support Information</source>
+ <translation>Gestionnaire de périphérique HP – Informations d&apos;assistance</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Fermer</translation>
+ </message>
+ <message>
+ <source>http://hplip.sourceforge.net</source>
+ <translation>http://hplip.sourceforge.net</translation>
+ </message>
+ <message>
+ <source>HPLIP is free, open source software distributed under the MIT, BSD, and GPL licenses. &lt;b&gt;&lt;i&gt;HP does not provide formal consumer or commercial support for this software.&lt;/i&gt;&lt;/b&gt;&lt;p&gt; Support is provided informally through a series of resources on a Sourceforge.net website. On this HP sponsored website, you will find FAQs, open discussion forums, installation instructions, a product support table, and other support materials.</source>
+ <translation>HPLIP est un logiciel libre, open source distribé sous licences MIT, BSD et GPL. &lt;b&gt;&lt;i&gt;HP ne fournit aucune assistance commerciale ou officielle au client pour ce logiciel.&lt;/i&gt;&lt;/b&gt;&lt;p&gt; L&apos;assistance est assurée, de manière informelle, via une série de ressources sur le site web Sourceforge.net. Ce site web parainé par HP contient des questions/réponses, des forums de discussion ouverts, des instructions pour l&apos;installation, un tableau de compatibilité des produits et d&apos;autres documents d&apos;assistance.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;HP Sponsored Support&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Assistance parainée par HP&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>NOTE: Sourceforge.net is owned and operated by OSTG, Inc. and is not affiliated with HP.</source>
+ <translation>REMARQUE : Sourceforge.net appartient à OSTG Inc. qui en assure l&apos;administration ; il n&apos;est nullement affilié à HP.</translation>
+ </message>
+ <message>
+ <source>HP</source>
+ <translation>HP</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;README File&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Fichier README&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>A readme file was shipped with your version of HPLIP. This file contains the product support table, a troubleshooting guide, and other support resources.</source>
+ <translation>Un fichier readme a été fourni avec votre version de HPLIP. Il contient un tableau de compatibilité des produits, un guide de dépannage ainsi que d&apos;autres ressources d&apos;assistance.</translation>
+ </message>
+ <message>
+ <source>hplip_readme.html</source>
+ <translation>hplip_readme.html</translation>
+ </message>
+ <message>
+ <source>README File</source>
+ <translation>Fichier README</translation>
+ </message>
+ <message>
+ <source>http://linuxprinting.org</source>
+ <translation>http://linuxprinting.org</translation>
+ </message>
+ <message>
+ <source>General Linux printing assistance is also available from open discussion forums, documentation, access to PPD files, etc. from:</source>
+ <translation>L&apos;assistance concernant les problèmes d&apos;impression sous Linux en général est également accessible via des forums de discussion ouvert, la documentation, l&apos;accès aux fichiers PPD, etc. à partir du site :</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;linuxprinting.org&lt;/b&gt;</source>
+ <translation>&lt;b&gt;linuxprinting.org&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>NOTE: Linuxprinting.org is operated through the generous efforts of Grant Taylor and Till Kamppeter and is not affiliated with HP.</source>
+ <translation>REMARQUE : Linuxprinting.org fonctionne grâce à la générosité de Grant Taylor et Till Kamppeter et n&apos;est nullement affilié à HP.</translation>
+ </message>
+ <message>
+ <source>linuxprinting.org</source>
+ <translation>linuxprinting.org</translation>
+ </message>
+ <message>
+ <source>http://cups.org</source>
+ <translation>http://cups.org</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;CUPS&lt;/b&gt;</source>
+ <translation>&lt;b&gt;CUPS&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Information about CUPS (Common UNIX Printing System) is available at cups.org. This website also contains forums and other support resources for printing on Linux:</source>
+ <translation>Des informations relatives à CUPS (Common UNIX Printing System) figurent sur le site cups.org. Ce dernier comprend également des forums ainsi que des ressources d&apos;assistance pour l&apos;impression sous Linux :</translation>
+ </message>
+ <message>
+ <source>NOTE: CUPS and the CUPS website is owned and operated by Easy Software Products and is not affiliated with HP.</source>
+ <translation>REMARQUE : CUPS et le site web CUPS appartiennent à Easy Software Products qui en assure l&apos;administration ; ils ne sont nullement affiliés à HP.</translation>
+ </message>
+ <message>
+ <source>CUPS</source>
+ <translation>CUPS</translation>
+ </message>
+</context>
+<context>
+ <name>UnloadForm</name>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;No devices found that support photo card access.&lt;/b&gt;&lt;p&gt;Please make sure your device is properly installed and try again.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Aucun périphérique supportant l&apos;accès aux cartes photo détecté.&lt;/b&gt;&lt;p&gt;Vérifiez que votre périphérique est correctement installé et recommencez.</translation>
+ </message>
+ <message>
+ <source>HP Device Manager - Unload Photo Card</source>
+ <translation>Gestionnaire de périphériques HP – Télécharger une carte mémoire photo</translation>
+ </message>
+</context>
+<context>
+ <name>UnloadForm_base</name>
+ <message>
+ <source>HP Device Manager - Unload Files from Photo Card</source>
+ <translation>Gestionnaire de périphériques HP – Télécharger des fichiers à partir d&apos;une carte mémoire photo</translation>
+ </message>
+ <message>
+ <source>Device:</source>
+ <translation>Périphérique :</translation>
+ </message>
+ <message>
+ <source>Unload Selected Files</source>
+ <translation>Télécharger les fichiers sélectionnés</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Fermer</translation>
+ </message>
+ <message>
+ <source>Unload Directory:</source>
+ <translation>Télécharger le dossier :</translation>
+ </message>
+ <message>
+ <source>Browse...</source>
+ <translation>Parcourir...</translation>
+ </message>
+ <message>
+ <source>File Removal:</source>
+ <translation>Suppression du fichier :</translation>
+ </message>
+ <message>
+ <source>Leave all files on photo card</source>
+ <translation>Laisser tous les fichiers sur la carte photo</translation>
+ </message>
+ <message>
+ <source>Remove selected files</source>
+ <translation>Supprimer les fichiers sélectionnés</translation>
+ </message>
+ <message>
+ <source>Select Files to Unload from Photo Card:</source>
+ <translation>Sélectionnez les fichiers à télécharger de la carte photo :</translation>
+ </message>
+ <message>
+ <source>Select All</source>
+ <translation>Tout sélectionner</translation>
+ </message>
+ <message>
+ <source>Select None</source>
+ <translation>Aucun</translation>
+ </message>
+ <message>
+ <source>Show Thumbnails</source>
+ <translation>Afficher les miniatures</translation>
+ </message>
+</context>
+<context>
+ <name>WaitForm_base</name>
+ <message>
+ <source>HP Device Manager - Waiting</source>
+ <translation>Gestionnaire de périphériques HP – En attente</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Waiting for procedure to finish...&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Attente de la fin de la procédure …&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Annuler</translation>
+ </message>
+</context>
+<context>
+ <name>self.form.FailureUI</name>
+ <message>
+ <source>&lt;b&gt;Unable to mount photo card on device.&lt;/b&gt;&lt;p&gt;Check that device is powered on and photo card is correctly inserted.</source>
+<translation>&lt;b&gt;Impossible de monter la carte photo sur le périphérique.&lt;/b&gt;&lt;p&gt;Assurez-vous que le périphérique est en marche et que la carte photo est correctement installée.</translation>
+ </message>
+</context>
+</TS>
diff --git a/data/localization/hplip_it.qm b/data/localization/hplip_it.qm
new file mode 100644
index 0000000..6f23414
--- /dev/null
+++ b/data/localization/hplip_it.qm
Binary files differ
diff --git a/data/localization/hplip_it.ts b/data/localization/hplip_it.ts
new file mode 100755
index 0000000..8490b52
--- /dev/null
+++ b/data/localization/hplip_it.ts
@@ -0,0 +1,5048 @@
+<!DOCTYPE TS><TS>
+<context>
+ <name>@default</name>
+ <message>
+ <source>&lt;b&gt;Unable to mount photo card on device.&lt;/b&gt;&lt;p&gt;Check that device is powered on and photo card is correctly inserted.</source>
+<translation>&lt;b&gt;Impossibile montare la scheda fotografica sul dispositivo.&lt;/b&gt;&lt;p&gt;Verificare che il dispositivo sia alimentato e che la scheda sia stata inserita correttamente.</translation>
+ </message>
+</context>
+<context>
+ <name>AboutDlg_base</name>
+ <message>
+ <source>HP Device Manager - About</source>
+ <translation>HP Device Manager – Info su</translation>
+ </message>
+ <message>
+ <source>&lt;font size=&quot;+3&quot;&gt;&lt;p align=&quot;center&quot;&gt;HP Linux Imaging and Printing (HPLIP)&lt;/p&gt;&lt;/font&gt;</source>
+ <translation>&lt;font size=&quot;+3&quot;&gt;&lt;p align=&quot;center&quot;&gt;HPLIP (HP Linux Imaging and Printing)&lt;/p&gt;&lt;/font&gt;</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Chiudi</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;HPLIP Software Version:&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Versione del software HPLIP:&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>0.0.0</source>
+ <translation>0.0.0</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Device Manager Software Version:&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Versione del software Device Manager:&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Authors and Contributors:&lt;/b&gt;\nDavid Suffield, Don Welch, Shiyun Yie, Raghothama Cauligi, John Oleinik, Cory Meisch, Foster Nuffer, Pete Parks, Jacqueline Pitter, David Paschal,\nSteve DeRoos, Mark Overton, Aaron Albright, Smith Kennedy, John Hosszu, Chris Wiesner, Henrique M. Holschuh, Till Kamppeter, Linus Araque, Mark Crawford, Charlie Moore</source>
+ <translation>&lt;b&gt;Autori e collaboratori:&lt;/b&gt;
+David Suffield, Don Welch, Shiyun Yie, Raghothama Cauligi, John Oleinik, Cory Meisch, Foster Nuffer, Pete Parks, Jacqueline Pitter, David Paschal,
+Steve DeRoos, Mark Overton, Aaron Albright, Smith Kennedy, John Hosszu, Chris Wiesner, Henrique M. Holschuh, Till Kamppeter, Linus Araque, Mark Crawford, Charlie Moore</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;License and Copyright:&lt;/b&gt;
+(c) Copyright 2006 Hewlett-Packard Development Company, L.P. This software is licensed under the GNU General Public License (GPL), BSD, and MIT licenses. See the software sources for details.</source>
+ <translation>&lt;b&gt;Licenza e Copyright:&lt;/b&gt;
+(c) Copyright 2006 Hewlett-Packard Development Company, L.P. Questo software è concesso in licenza in base alle licenze GNU GPL (General Public License), BSD e MIT. Vedere le sorgenti software per i dettagli.</translation>
+ </message>
+</context>
+<context>
+ <name>Align10Form_Base</name>
+ <message>
+ <source>HP Device Manager - Alignment</source>
+ <translation>HP Device Manager - Allineamento</translation>
+ </message>
+ <message>
+ <source>Examine the page that was printed. Several rows of boxes, each made up of thin lines, appear on the printed page.&lt;p&gt;
+For each row, select the label representing the box in which the shorter inner lines are the most aligned with the longer outer lines..</source>
+ <translation>Esaminare la pagina stampata. La pagina stampata presenta diverse righe di caselle, ciascuna composta da linee sottili.&lt;p&gt;
+Per ciascuna riga, selezionare l&apos;etichetta che rappresenta la casella in cui le linee interne più corte sono maggiormente allineate alle linee esterne più lunghe.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;B:&lt;/font&gt;&lt;/b&gt;</source>
+ <translation>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;B:&lt;/font&gt;&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;F:&lt;/font&gt;&lt;/b&gt;</source>
+ <translation>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;F:&lt;/font&gt;&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;C:&lt;/font&gt;&lt;/b&gt;</source>
+ <translation>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;C:&lt;/font&gt;&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;D:&lt;/font&gt;&lt;/b&gt;</source>
+ <translation>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;D:&lt;/font&gt;&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;G:&lt;/font&gt;&lt;/b&gt;</source>
+ <translation>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;G:&lt;/font&gt;&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;A:&lt;/font&gt;&lt;/b&gt;</source>
+ <translation>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;A:&lt;/font&gt;&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;E:&lt;/font&gt;&lt;/b&gt;</source>
+ <translation>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;E:&lt;/font&gt;&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;H:&lt;/font&gt;&lt;/b&gt;</source>
+ <translation>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;H:&lt;/font&gt;&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Next &gt;</source>
+ <translation>Avanti &gt;</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Annulla</translation>
+ </message>
+</context>
+<context>
+ <name>AlignForm</name>
+ <message>
+ <source>HP Device Manager - Alignment</source>
+ <translation>HP Device Manager - Allineamento</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Annulla</translation>
+ </message>
+ <message>
+ <source>Next &gt;</source>
+ <translation>Avanti &gt;</translation>
+ </message>
+ <message>
+ <source>Choose the set of lines where the line segments are &lt;b&gt;best&lt;/b&gt; aligned.</source>
+ <translation>Scegliere il gruppo di linee in cui i segmenti sono &lt;b&gt;meglio&lt;/b&gt; allineati.</translation>
+ </message>
+</context>
+<context>
+ <name>AlignType6Form1_base</name>
+ <message>
+ <source>HP Device Manager - Alignment</source>
+ <translation>HP Device Manager - Allineamento</translation>
+ </message>
+ <message>
+ <source>To perform alignment, you will need the &lt;b&gt;alignment page&lt;/b&gt; that is automatically printed after you install a print cartridge.
+&lt;p&gt; If you do &lt;b&gt;not&lt;/b&gt; have this page, click &lt;i&gt;Print Page&lt;/i&gt;.
+&lt;p&gt;If you already have this page, click &lt;i&gt;Next &gt;&lt;/i&gt;.</source>
+ <translation>Per eseguire l&apos;allineamento, occorre la &lt;b&gt;pagina di allineamento&lt;/b&gt; che viene stampata automaticamente dopo l&apos;installazione di una cartuccia di stampa.
+&lt;p&gt; Se &lt;b&gt;non&lt;/b&gt; si dispone di questa pagina, fare clic su &lt;i&gt;Stampa pagina&lt;/i&gt;.
+&lt;p&gt;Se si dispone già di questa pagina, fare clic su &lt;i&gt;Avanti &gt;&lt;/i&gt;.</translation>
+ </message>
+ <message>
+ <source>Next &gt;</source>
+ <translation>Avanti &gt;</translation>
+ </message>
+ <message>
+ <source>Print Page</source>
+ <translation>Stampa pagina</translation>
+ </message>
+</context>
+<context>
+ <name>AlignType6Form2_base</name>
+ <message>
+ <source>HP Device Manager - Alignment</source>
+ <translation>HP Device Manager - Allineamento</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Follow these steps to complete the alignment:&lt;/b&gt;
+&lt;p&gt;&lt;b&gt;1.&lt;/b&gt; Place the alignment page, with the printed side facing down, on the scanner.
+&lt;p&gt;&lt;b&gt;2.&lt;/b&gt; Press the &lt;i&gt;Enter&lt;/i&gt; or &lt;i&gt;Scan&lt;/i&gt; button on the printer.
+&lt;p&gt;&lt;b&gt;3.&lt;/b&gt; &quot;Alignment Complete&quot; will be displayed when the process is finished (on some models)..</source>
+ <translation>&lt;b&gt;Attenersi alle istruzioni riportate di seguito per completare l’allineamento:&lt;/b&gt;
+&lt;p&gt;&lt;b&gt;1.&lt;/b&gt; Sistemare la pagina di allineamento nello scanner con il lato stampato rivolto verso il basso.
+&lt;p&gt;&lt;b&gt;2.&lt;/b&gt; Premere il pulsante &lt;i&gt;Invio&lt;/i&gt; o &lt;i&gt;Scansione&lt;/i&gt; sulla stampante.
+&lt;p&gt;&lt;b&gt;3.&lt;/b&gt; Al termine dell&apos;operazione, verrà visualizzato &quot;Allineamento completato&quot; (in alcuni modelli).</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+</context>
+<context>
+ <name>AllowableTypesDlg_base</name>
+ <message>
+ <source>MIME Type</source>
+ <translation>Tipo MIME</translation>
+ </message>
+ <message>
+ <source>Description</source>
+ <translation>Descrizione</translation>
+ </message>
+ <message>
+ <source>Usual File Extension(s)</source>
+ <translation>Estensioni di file comuni</translation>
+ </message>
+ <message>
+ <source>HP Device Manager - Allowable Types</source>
+ <translation>HP Device Manager - Tipi consentiti</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;File/document types that can be added to the file list.&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Tipi di file/documenti che è possibile aggiungere all&apos;elenco di file.&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>&lt;i&gt;Note: To print or fax file/document types that do not appear on this list, print the document from the application that created it through the appropriate CUPS printer.&lt;/i&gt;</source>
+ <translation>&lt;i&gt;Nota: per stampare o inviare via fax tipi di file/documenti non presenti in questo elenco, stampare il documento dall&apos;applicazione in cui è stato creato mediante la stampante CUPS appropriata.&lt;/i&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>ChooseDeviceDlg</name>
+ <message>
+ <source>Choose Device</source>
+ <translation>Scegli dispositivo</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Annulla</translation>
+ </message>
+ <message>
+ <source>Available Devices:</source>
+ <translation>Dispositivi disponibili:</translation>
+ </message>
+</context>
+<context>
+ <name>ChoosePrinterDlg</name>
+ <message>
+ <source>Choose Device</source>
+ <translation>Scegli dispositivo</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Annulla</translation>
+ </message>
+ <message>
+ <source>Available Devices:</source>
+ <translation>Dispositivi disponibili:</translation>
+ </message>
+ <message>
+ <source>Available Printers:</source>
+ <translation>Stampanti disponibili:</translation>
+ </message>
+ <message>
+ <source>Available Faxes:</source>
+ <translation>Fax disponibili:</translation>
+ </message>
+</context>
+<context>
+ <name>ChoosePrinterDlg2</name>
+ <message>
+ <source>Choose Printer</source>
+ <translation>Scegli stampante</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Annulla</translation>
+ </message>
+ <message>
+ <source>Printers:</source>
+ <translation>Stampanti:</translation>
+ </message>
+</context>
+<context>
+ <name>CleaningForm2_base</name>
+ <message>
+ <source>HP Device Manager - Cleaning</source>
+ <translation>HP Device Manager - Pulizia</translation>
+ </message>
+ <message>
+ <source>Finish</source>
+ <translation>Fine</translation>
+ </message>
+ <message>
+ <source>Please wait while the test page is printed. Check this page to see if the problem was fixed. If the test page looks fine click &lt;b&gt;Finish &lt;/b&gt;to quit the cleaning procedure. Otherwise, replace the print cartridges and click &lt;b&gt;Finish&lt;/b&gt;.</source>
+ <translation>Attendere che la stampa della pagina di prova sia completata. Analizzare questa pagina per verificare che il problema sia stato risolto. Se la pagina di prova viene stampata correttamente, fare clic su &lt;b&gt;Fine &lt;/b&gt;per uscire dalla procedura di pulizia. In caso contrario, sostituire le cartucce di stampa e fare clic su &lt;b&gt;Fine&lt;/b&gt;.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Cleaning Level 3 Performed&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Livello di pulizia 3 eseguito&lt;/b&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>CleaningForm_base</name>
+ <message>
+ <source>HP Device Manager - Please Wait - Cleaning</source>
+ <translation>HP Device Manager - Attendere - Pulizia</translation>
+ </message>
+ <message>
+ <source>Finish</source>
+ <translation>Fine</translation>
+ </message>
+ <message>
+ <source>Cleaning Level %s</source>
+ <translation>Livello di pulizia %s</translation>
+ </message>
+ <message>
+ <source>Please wait while the test page is printed. Check this page to see if the problem was fixed. If the test page looks fine click &lt;b&gt;Finish &lt;/b&gt;to quit the cleaning procedure. Otherwise, click &lt;b&gt;Cleaning Level %s&lt;/b&gt; to continue with cleaning.</source>
+ <translation>Attendere che la stampa della pagina di prova sia completata. Analizzare questa pagina per verificare che il problema sia stato risolto. Se la pagina di prova viene stampata correttamente, fare clic su &lt;b&gt;Fine &lt;/b&gt;per uscire dalla procedura di pulizia. In caso contrario, fare clic su &lt;b&gt;Livello di pulizia %s&lt;/b&gt; per continuare con la pulizia.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Please Wait - Cleaning Level %s Being Performed&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Attendere - Esecuzione del livello di pulizia %s in corso&lt;/b&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>ColorAdjForm_base</name>
+ <message>
+ <source>HP Device Manager - Color Adjustment</source>
+ <translation>HP Device Manager - Regolazione del colore</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Annulla</translation>
+ </message>
+ <message>
+ <source>Next &gt;</source>
+ <translation>Avanti &gt;</translation>
+ </message>
+ <message>
+ <source>Choose the numbered colored box that the color &lt;b&gt;best &lt;/b&gt;matches the background color of the bar.</source>
+ <translation>Scegliere la casella colorata numerata che &lt;b&gt;meglio &lt;/b&gt;corrisponde al colore dello sfondo della barra.</translation>
+ </message>
+ <message>
+ <source>1</source>
+ <translation>1</translation>
+ </message>
+ <message>
+ <source>2</source>
+ <translation>2</translation>
+ </message>
+ <message>
+ <source>3</source>
+ <translation>3</translation>
+ </message>
+ <message>
+ <source>4</source>
+ <translation>4</translation>
+ </message>
+ <message>
+ <source>5</source>
+ <translation>5</translation>
+ </message>
+ <message>
+ <source>6</source>
+ <translation>6</translation>
+ </message>
+ <message>
+ <source>7</source>
+ <translation>7</translation>
+ </message>
+ <message>
+ <source>8</source>
+ <translation>8</translation>
+ </message>
+ <message>
+ <source>9</source>
+ <translation>9</translation>
+ </message>
+ <message>
+ <source>10</source>
+ <translation>10</translation>
+ </message>
+ <message>
+ <source>11</source>
+ <translation>11</translation>
+ </message>
+ <message>
+ <source>12</source>
+ <translation>12</translation>
+ </message>
+ <message>
+ <source>13</source>
+ <translation>13</translation>
+ </message>
+ <message>
+ <source>14</source>
+ <translation>14</translation>
+ </message>
+ <message>
+ <source>15</source>
+ <translation>15</translation>
+ </message>
+ <message>
+ <source>16</source>
+ <translation>16</translation>
+ </message>
+ <message>
+ <source>17</source>
+ <translation>17</translation>
+ </message>
+ <message>
+ <source>18</source>
+ <translation>18</translation>
+ </message>
+ <message>
+ <source>19</source>
+ <translation>19</translation>
+ </message>
+ <message>
+ <source>20</source>
+ <translation>20</translation>
+ </message>
+ <message>
+ <source>21</source>
+ <translation>21</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;&lt;font size=&quot;+1&quot;&gt;Line&lt;/font&gt;&lt;/b&gt;</source>
+ <translation>&lt;b&gt;&lt;font size=&quot;+1&quot;&gt;Linea&lt;/font&gt;&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;&lt;font size=&quot;+1&quot;&gt;X&lt;/font&gt;&lt;/b&gt;</source>
+ <translation>&lt;b&gt;&lt;font size=&quot;+1&quot;&gt;X&lt;/font&gt;&lt;/b&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>ColorCal4Form_base</name>
+ <message>
+ <source>HP Device Manager - Color Calibration</source>
+ <translation>HP Device Manager - Calibrazione del colore</translation>
+ </message>
+ <message>
+ <source>Calibrate</source>
+ <translation>Calibra</translation>
+ </message>
+ <message>
+ <source>1. Hold the calibration page at arm&apos;s length in front of your eyes.
+&lt;p&gt;&lt;p&gt;
+2. Tilt the page away from you. Look at the two large squares, each containing colored patches. For each large square, find the colored path that &lt;b&gt;most closely&lt;/b&gt; matches the background color. Each patch has an associated letter and number.
+&lt;p&gt;&lt;p&gt;
+3. Choose the letter and number for the matching patches for the gray and color plots.
+&lt;p&gt;&lt;p&gt;
+4. Click &lt;i&gt;&quot;Calibrate&quot;.&lt;/i&gt; to continue.
+&lt;p&gt;&lt;p&gt;
+(To reset the printer to known defaults, click &lt;i&gt;&quot;Use Factory Defaults&quot;&lt;/i&gt;)</source>
+ <translation>1. Tenere la pagina di calibrazione alla distanza di un braccio dagli occhi.
+&lt;p&gt;&lt;p&gt;
+2. Inclinare la pagina lontano da sé. Osservare i due quadrati grandi, ciascuno contenente i campioni di colore. Per ciascun quadrato grande, trovare il campione di colore che &lt;b&gt;meglio&lt;/b&gt; corrisponde al colore dello sfondo. Ciascun campione ha una lettera e un numero associati.
+&lt;p&gt;&lt;p&gt;
+3. Scegliere la lettera e il numero dei campioni corrispondenti ai tracciati in grigio e a colori.
+&lt;p&gt;&lt;p&gt;
+4. Fare clic su &lt;i&gt;&quot;Calibra&quot;.&lt;/i&gt; per continuare.
+&lt;p&gt;&lt;p&gt;
+Per ripristinare i valori predefiniti noti della stampante, fare clic su &lt;i&gt;&quot;Usa impostazioni di fabbrica&quot;&lt;/i&gt;.</translation>
+ </message>
+ <message>
+ <source>Gray Plot</source>
+ <translation>Tracciato in grigio</translation>
+ </message>
+ <message>
+ <source>A</source>
+ <translation>A</translation>
+ </message>
+ <message>
+ <source>B</source>
+ <translation>B</translation>
+ </message>
+ <message>
+ <source>C</source>
+ <translation>C</translation>
+ </message>
+ <message>
+ <source>D</source>
+ <translation>D</translation>
+ </message>
+ <message>
+ <source>E</source>
+ <translation>E</translation>
+ </message>
+ <message>
+ <source>F</source>
+ <translation>F</translation>
+ </message>
+ <message>
+ <source>G</source>
+ <translation>G</translation>
+ </message>
+ <message>
+ <source>H</source>
+ <translation>H</translation>
+ </message>
+ <message>
+ <source>I</source>
+ <translation>I</translation>
+ </message>
+ <message>
+ <source>J</source>
+ <translation>J</translation>
+ </message>
+ <message>
+ <source>K</source>
+ <translation>K</translation>
+ </message>
+ <message>
+ <source>L</source>
+ <translation>L</translation>
+ </message>
+ <message>
+ <source>M</source>
+ <translation>M</translation>
+ </message>
+ <message>
+ <source>N</source>
+ <translation>N</translation>
+ </message>
+ <message>
+ <source>1</source>
+ <translation>1</translation>
+ </message>
+ <message>
+ <source>2</source>
+ <translation>2</translation>
+ </message>
+ <message>
+ <source>3</source>
+ <translation>3</translation>
+ </message>
+ <message>
+ <source>4</source>
+ <translation>4</translation>
+ </message>
+ <message>
+ <source>5</source>
+ <translation>5</translation>
+ </message>
+ <message>
+ <source>6</source>
+ <translation>6</translation>
+ </message>
+ <message>
+ <source>7</source>
+ <translation>7</translation>
+ </message>
+ <message>
+ <source>8</source>
+ <translation>8</translation>
+ </message>
+ <message>
+ <source>9</source>
+ <translation>9</translation>
+ </message>
+ <message>
+ <source>10</source>
+ <translation>10</translation>
+ </message>
+ <message>
+ <source>11</source>
+ <translation>11</translation>
+ </message>
+ <message>
+ <source>12</source>
+ <translation>12</translation>
+ </message>
+ <message>
+ <source>13</source>
+ <translation>13</translation>
+ </message>
+ <message>
+ <source>14</source>
+ <translation>14</translation>
+ </message>
+ <message>
+ <source>Color Plot</source>
+ <translation>Tracciato a colori</translation>
+ </message>
+ <message>
+ <source>P</source>
+ <translation>P</translation>
+ </message>
+ <message>
+ <source>Q</source>
+ <translation>Q</translation>
+ </message>
+ <message>
+ <source>R</source>
+ <translation>R</translation>
+ </message>
+ <message>
+ <source>S</source>
+ <translation>S</translation>
+ </message>
+ <message>
+ <source>T</source>
+ <translation>T</translation>
+ </message>
+ <message>
+ <source>U</source>
+ <translation>U</translation>
+ </message>
+ <message>
+ <source>V</source>
+ <translation>V</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Annulla</translation>
+ </message>
+ <message>
+ <source>Use Factory Defaults</source>
+ <translation>Usa impostazioni di fabbrica</translation>
+ </message>
+</context>
+<context>
+ <name>ColorCalForm2_base</name>
+ <message>
+ <source>HP Device Manager - Color Calibration</source>
+ <translation>HP Device Manager - Calibrazione del colore</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Annulla</translation>
+ </message>
+ <message>
+ <source>Next &gt;</source>
+ <translation>Avanti &gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;A page of color patches is printing. When it is complete, follow these steps:&lt;/b&gt;
+&lt;p&gt;&lt;b&gt;1.&lt;/b&gt; Hold the page approximately 8 inches (~20cm) in front of your eyes.
+&lt;p&gt;&lt;b&gt;2.&lt;/b&gt; Slowly move the page away from you until the numbered patches fade to match the background.
+&lt;p&gt;&lt;b&gt;3.&lt;/b&gt; Select the number (below) between &lt;i&gt;1&lt;/i&gt; and &lt;i&gt;81 &lt;/i&gt;of the numbered patch that &lt;b&gt;best &lt;/b&gt;matches the background:</source>
+ <translation>&lt;b&gt;Una pagina con campioni di colore è in fase di stampa. Al termine della stampa, attenersi alle istruzioni riportate di seguito:&lt;/b&gt;
+&lt;p&gt;&lt;b&gt;1.&lt;/b&gt; Tenere la pagina a una distanza di circa 20 cm dagli occhi.
+&lt;p&gt;&lt;b&gt;2.&lt;/b&gt; Allontanare lentamente la pagina fino a quando i campioni numerati diventano sfumati e corrispondono allo sfondo.
+&lt;p&gt;&lt;b&gt;3.&lt;/b&gt; Selezionare il numero (riportato di seguito) tra &lt;i&gt;1&lt;/i&gt; e &lt;i&gt;81 &lt;/i&gt;del campione numerato che &lt;b&gt;meglio &lt;/b&gt;corrisponde allo sfondo:</translation>
+ </message>
+ <message>
+ <source>Number of best matching patch (1-81):</source>
+ <translation>Numero del campione meglio corrispondente (1-81):</translation>
+ </message>
+</context>
+<context>
+ <name>ColorCalForm_base</name>
+ <message>
+ <source>HP Device Manager - Color Calibration</source>
+ <translation>HP Device Manager - Calibrazione del colore</translation>
+ </message>
+ <message>
+ <source>Next &gt;</source>
+ <translation>Avanti &gt;</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Annulla</translation>
+ </message>
+ <message>
+ <source>Color Calibration</source>
+ <translation>Calibrazione del colore</translation>
+ </message>
+ <message>
+ <source>1</source>
+ <translation>1</translation>
+ </message>
+ <message>
+ <source>2</source>
+ <translation>2</translation>
+ </message>
+ <message>
+ <source>3</source>
+ <translation>3</translation>
+ </message>
+ <message>
+ <source>4</source>
+ <translation>4</translation>
+ </message>
+ <message>
+ <source>5</source>
+ <translation>5</translation>
+ </message>
+ <message>
+ <source>6</source>
+ <translation>6</translation>
+ </message>
+ <message>
+ <source>7</source>
+ <translation>7</translation>
+ </message>
+ <message>
+ <source>Choose the numbered image labeled &quot;1&quot; thru &quot;7&quot; that is &lt;b&gt;best color matched&lt;/b&gt; to the image labeled &quot;X&quot;.</source>
+ <translation>Scegliere l&apos;immagine numerata contrassegnata da un numero compreso tra &quot;1&quot; e &quot;7&quot;, ovvero il &lt;b&gt;colore che meglio corrisponde&lt;/b&gt; all&apos;immagine contrassegnata da &quot;X&quot;.</translation>
+ </message>
+</context>
+<context>
+ <name>CoverpageForm_base</name>
+ <message>
+ <source>HP Device Manager - Coverpages</source>
+ <translation>HP Device Manager - Frontespizi</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Annulla</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>Coverpage Design</source>
+ <translation>Progettazione frontespizi</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Choose coverpage and enter optional message.&lt;b&gt;</source>
+ <translation>&lt;b&gt;Scegliere il frontespizio e immettere un messaggio facoltativo.&lt;b&gt;</translation>
+ </message>
+ <message>
+ <source>Regarding:</source>
+ <translation>Tema:</translation>
+ </message>
+ <message>
+ <source>Optional Message &lt;i&gt;(Maximum 2048 characters or 32 lines preformatted)&lt;/i&gt;:</source>
+ <translation>Messaggio facoltativo &lt;i&gt;(massimo 2048 caratteri o 32 linee preformattate)&lt;/i&gt;:</translation>
+ </message>
+ <message>
+ <source>Preformatted (preserve formatting)</source>
+ <translation>Preformattato (mantieni formattazione)</translation>
+ </message>
+</context>
+<context>
+ <name>DevMgr4</name>
+ <message>
+ <source>Functions</source>
+ <translation>Funzioni</translation>
+ </message>
+ <message>
+ <source>Functions &gt; Print</source>
+ <translation>Funzioni &gt; Stampa</translation>
+ </message>
+ <message>
+ <source>Functions &gt; Make Copies</source>
+ <translation>Funzioni &gt; Crea copie</translation>
+ </message>
+ <message>
+ <source>Functions &gt; Fax</source>
+ <translation>Funzioni &gt; Fax</translation>
+ </message>
+ <message>
+ <source>Functions &gt; Unload Photo Card</source>
+ <translation>Funzioni &gt; Scarica scheda fotografica</translation>
+ </message>
+ <message>
+ <source>Tools</source>
+ <translation>Strumenti</translation>
+ </message>
+ <message>
+ <source>Tools &gt; Device Information</source>
+ <translation>Strumenti &gt; Informazioni dispositivo</translation>
+ </message>
+ <message>
+ <source>Tools &gt; Printer Information</source>
+ <translation>Strumenti &gt; Informazioni stampante</translation>
+ </message>
+ <message>
+ <source>Tools &gt; Print Test Page</source>
+ <translation>Strumenti &gt; Stampa pagina di prova</translation>
+ </message>
+ <message>
+ <source>Printer Name:</source>
+ <translation>Nome della stampante:</translation>
+ </message>
+ <message>
+ <source>Print &gt;&gt;</source>
+ <translation>Stampa &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>Print...</source>
+ <translation>Stampa...</translation>
+ </message>
+ <message>
+ <source>Scan &gt;&gt;</source>
+ <translation>Scansione &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>Scan...</source>
+ <translation>Scansione...</translation>
+ </message>
+ <message>
+ <source>Access Photo Cards &gt;&gt;</source>
+ <translation>Accedi alle schede fotografiche &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>Access Photo Cards...</source>
+ <translation>Accedi alle schede fotografiche...</translation>
+ </message>
+ <message>
+ <source>Send Fax &gt;&gt;</source>
+ <translation>Invia fax &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>Send Fax...</source>
+ <translation>Invia fax...</translation>
+ </message>
+ <message>
+ <source>Make Copies &gt;&gt;</source>
+ <translation>Crea copie &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>Make Copies...</source>
+ <translation>Crea copie...</translation>
+ </message>
+ <message>
+ <source>Device Settings...</source>
+ <translation>Impostazioni dispositivo...</translation>
+ </message>
+ <message>
+ <source>Refresh Device</source>
+ <translation>Aggiorna dispositivo</translation>
+ </message>
+ <message>
+ <source>Refresh All</source>
+ <translation>Aggiorna tutto</translation>
+ </message>
+ <message>
+ <source>HP Device Manager - %1</source>
+ <translation>HP Device Manager - %1</translation>
+ </message>
+ <message>
+ <source>Refreshing Device List - HP Device Manager</source>
+ <translation>Aggiornamento elenco dispositivi - HP Device Manager</translation>
+ </message>
+ <message>
+ <source>Refreshing device list...</source>
+ <translation>Aggiornamento elenco dispositivi...</translation>
+ </message>
+ <message>
+ <source>Press F6 to refresh.</source>
+ <translation>Premere F6 per aggiornare.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Photocards on your printer are only available by mounting them as drives using USB mass storage.&lt;/b&gt;&lt;p&gt;Please refer to your distribution&apos;s documentation for setup and usage instructions.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Le schede fotografiche della stampante sono disponibili solo se vengono montate come unità utilizzando la memorizzazione di massa USB.&lt;/b&gt;&lt;p&gt;Per istruzioni sull&apos;impostazione e sull&apos;utilizzo, consultare la documentazione di distribuzione.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Unable to run command. No command specified.&lt;/b&gt;&lt;p&gt;Use &lt;pre&gt;Configure...&lt;/pre&gt; to specify a command to run.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Impossibile eseguire il comando. Nessun comando specificato.&lt;/b&gt;&lt;p&gt;Utilizzare &lt;pre&gt;Configura...&lt;/pre&gt; per specificare un comando da eseguire.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Unable to find an appropriate su/sudo utility to run hp-setup.&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Impossibile trovare un&apos;utilità su/sudo appropriata per eseguire hp-setup.&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Annoying Confirmation: Are you sure you want to remove this device?&lt;/b&gt;</source>
+<translation>&lt;b&gt;Conferma reiterata: Rimuovere questo dispositivo?&lt;/b&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>DevMgr4_base</name>
+ <message>
+ <source>HP Device Manager</source>
+ <translation>HP Device Manager</translation>
+ </message>
+ <message>
+ <source>Functions</source>
+ <translation>Funzioni</translation>
+ </message>
+ <message>
+ <source>Status</source>
+ <translation>Stato</translation>
+ </message>
+ <message>
+ <source>Supplies</source>
+ <translation>Forniture</translation>
+ </message>
+ <message>
+ <source>Tools</source>
+ <translation>Strumenti</translation>
+ </message>
+ <message>
+ <source>Print Settings</source>
+ <translation>Impostazioni di stampa</translation>
+ </message>
+ <message>
+ <source>Print Control</source>
+ <translation>Controllo stampa</translation>
+ </message>
+ <message>
+ <source>Contents</source>
+ <translation>Sommario</translation>
+ </message>
+ <message>
+ <source>&amp;Contents...</source>
+ <translation>&amp;Sommario...</translation>
+ </message>
+ <message>
+ <source>Help Contents (F1)</source>
+ <translation>Sommario dell&apos;Aiuto (F1)</translation>
+ </message>
+ <message>
+ <source>F1</source>
+ <translation>F1</translation>
+ </message>
+ <message>
+ <source>Index</source>
+ <translation>Indice</translation>
+ </message>
+ <message>
+ <source>&amp;Index...</source>
+ <translation>&amp;Indice...</translation>
+ </message>
+ <message>
+ <source>&amp;About...</source>
+ <translation>&amp;Info su...</translation>
+ </message>
+ <message>
+ <source>About HP Device Manager...</source>
+ <translation>Info su HP Device Manager...</translation>
+ </message>
+ <message>
+ <source>Refresh Device</source>
+ <translation>Aggiorna dispositivo</translation>
+ </message>
+ <message>
+ <source>Refresh Device (F5)</source>
+ <translation>Aggiorna dispositivo (F5)</translation>
+ </message>
+ <message>
+ <source>F5</source>
+ <translation>F5</translation>
+ </message>
+ <message>
+ <source>Exit</source>
+ <translation>Esci</translation>
+ </message>
+ <message>
+ <source>Exit HP Device Manager</source>
+ <translation>Esci da HP Device Manager</translation>
+ </message>
+ <message>
+ <source>Ctrl+Q</source>
+ <translation>Ctrl+Q</translation>
+ </message>
+ <message>
+ <source>Popup Alerts...</source>
+ <translation>Avvisi popup...</translation>
+ </message>
+ <message>
+ <source>Popup alerts...</source>
+ <translation>Avvisi popup...</translation>
+ </message>
+ <message>
+ <source>Configure popup alerts</source>
+ <translation>Configura avvisi popup</translation>
+ </message>
+ <message>
+ <source>Email alerts...</source>
+ <translation>Avvisi tramite e-mail...</translation>
+ </message>
+ <message>
+ <source>Configure email alerts</source>
+ <translation>Configura avvisi tramite e-mail</translation>
+ </message>
+ <message>
+ <source>Settings...</source>
+ <translation>Impostazioni...</translation>
+ </message>
+ <message>
+ <source>F2</source>
+ <translation>F2</translation>
+ </message>
+ <message>
+ <source>Refresh All</source>
+ <translation>Aggiorna tutto</translation>
+ </message>
+ <message>
+ <source>F6</source>
+ <translation>F6</translation>
+ </message>
+ <message>
+ <source>Auto Refresh</source>
+ <translation>Aggiornamento automatico</translation>
+ </message>
+ <message>
+ <source>Turn on/off Auto Refresh (Ctrl+A)</source>
+ <translation>Attiva/Disattiva aggiornamento automatico (Ctrl+A)</translation>
+ </message>
+ <message>
+ <source>Ctrl+A</source>
+ <translation>Ctrl+A</translation>
+ </message>
+ <message>
+ <source>Action</source>
+ <translation>Azione</translation>
+ </message>
+ <message>
+ <source>Device Settings (F3)</source>
+ <translation>Impostazioni dispositivo (F3)</translation>
+ </message>
+ <message>
+ <source>F3</source>
+ <translation>F3</translation>
+ </message>
+ <message>
+ <source>Support...</source>
+ <translation>Assistenza...</translation>
+ </message>
+ <message>
+ <source>Setup New Device...</source>
+ <translation>Imposta nuovo dispositivo...</translation>
+ </message>
+ <message>
+ <source>Ins</source>
+ <translation>Ins</translation>
+ </message>
+ <message>
+ <source>Remove Device...</source>
+ <translation>Rimuovi dispositivo...</translation>
+ </message>
+ <message>
+ <source>Del</source>
+ <translation>Canc</translation>
+ </message>
+ <message>
+ <source>Device</source>
+ <translation>Dispositivo</translation>
+ </message>
+ <message>
+ <source>Configure</source>
+ <translation>Configura</translation>
+ </message>
+ <message>
+ <source>&amp;Help</source>
+ <translation>&amp;Aiuto</translation>
+ </message>
+</context>
+<context>
+ <name>FaxAddrBookEditForm</name>
+ <message>
+ <source>New Fax Group</source>
+ <translation type="obsolete">Nuovo gruppo di fax</translation>
+ </message>
+ <message>
+ <source>New Group Name:</source>
+ <translation type="obsolete">Nome nuovo gruppo:</translation>
+ </message>
+</context>
+<context>
+ <name>FaxAddrBookEditForm_base</name>
+ <message>
+ <source>Group Name</source>
+ <translation>Nome gruppo</translation>
+ </message>
+ <message>
+ <source>HP Device Manager - Fax Address Book Entry</source>
+ <translation>HP Device Manager - Voce della rubrica fax</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Annulla</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>First Name:</source>
+ <translation>Nome:</translation>
+ </message>
+ <message>
+ <source>New Group...</source>
+ <translation type="obsolete">Nuovo gruppo...</translation>
+ </message>
+ <message>
+ <source>Member of Group(s):</source>
+ <translation>Membro del gruppo:</translation>
+ </message>
+ <message>
+ <source>Last Name:</source>
+ <translation>Cognome:</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Fax Number:&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Numero fax:&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Notes/Other Information:</source>
+ <translation>Note/Altre informazioni:</translation>
+ </message>
+ <message>
+ <source>Title:</source>
+ <translation>Titolo:</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Nickname:&lt;/b&gt;</source>
+ <translation type="obsolete">&lt;b&gt;Nome alternativo:&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Note: Items in &lt;b&gt;bold&lt;/b&gt; are required fields.</source>
+ <translation>Nota: le voci in &lt;b&gt;grassetto&lt;/b&gt; rappresentano i campi obbligatori.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Name/Nickname:&lt;/b&gt;</source>
+<translation>&lt;b&gt;Nome/nickname:&lt;/b&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>FaxAddrBookForm</name>
+ <message>
+ <source>New...</source>
+ <translation>Nuovo...</translation>
+ </message>
+ <message>
+ <source>Edit...</source>
+ <translation>Modifica...</translation>
+ </message>
+ <message>
+ <source>Delete...</source>
+ <translation>Elimina...</translation>
+ </message>
+ <message>
+ <source>Refresh List</source>
+ <translation>Aggiorna elenco</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Annoying Confirmation: Are you sure you want to delete this address book entry?&lt;/b&gt;</source>
+<translation>&lt;b&gt;Conferma reiterata: Eliminare questa voce di rubrica?&lt;/b&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>FaxAddrBookForm_base</name>
+ <message>
+ <source>Nickname</source>
+ <translation>Nome alternativo</translation>
+ </message>
+ <message>
+ <source>Title</source>
+ <translation>Titolo</translation>
+ </message>
+ <message>
+ <source>First Name</source>
+ <translation>Nome</translation>
+ </message>
+ <message>
+ <source>Last Name</source>
+ <translation>Cognome</translation>
+ </message>
+ <message>
+ <source>Fax Number</source>
+ <translation>Numero fax</translation>
+ </message>
+ <message>
+ <source>Member of Group(s)</source>
+ <translation>Membro del gruppo</translation>
+ </message>
+ <message>
+ <source>Notes/Other Information</source>
+ <translation>Note/Altre informazioni</translation>
+ </message>
+ <message>
+ <source>HP Device Manager - Fax Address Book</source>
+ <translation>HP Device Manager - Rubrica fax</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>New...</source>
+ <translation>Nuovo...</translation>
+ </message>
+ <message>
+ <source>Edit...</source>
+ <translation>Modifica...</translation>
+ </message>
+ <message>
+ <source>Delete...</source>
+ <translation>Elimina...</translation>
+ </message>
+ <message>
+ <source>Groups...</source>
+ <translation>Gruppi...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Fax Addresses:&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Indirizzi fax:&lt;/b&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>FaxAddrBookGroupEditForm_base</name>
+ <message>
+ <source>Group Members</source>
+ <translation>Membri del gruppo</translation>
+ </message>
+ <message>
+ <source>HP Device Manager - Fax Address Book Group</source>
+ <translation>HP Device Manager - Gruppo rubrica fax</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Group Name:&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Nome gruppo:&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Member Address Book Entries:&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Voci della rubrica del membro:&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Annulla</translation>
+ </message>
+</context>
+<context>
+ <name>FaxAddrBookGroupsForm</name>
+ <message>
+ <source>New...</source>
+ <translation>Nuovo...</translation>
+ </message>
+ <message>
+ <source>Edit...</source>
+ <translation>Modifica...</translation>
+ </message>
+ <message>
+ <source>Delete...</source>
+ <translation>Elimina...</translation>
+ </message>
+ <message>
+ <source>Refresh List</source>
+ <translation>Aggiorna elenco</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Annoying Confirmation: Are you sure you want to delete this group?&lt;/b&gt;</source>
+<translation>&lt;b&gt;Conferma reiterata: Eliminare questo gruppo?&lt;/b&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>FaxAddrBookGroupsForm_base</name>
+ <message>
+ <source>Group Name</source>
+ <translation>Nome gruppo</translation>
+ </message>
+ <message>
+ <source>Group Members</source>
+ <translation>Membri del gruppo</translation>
+ </message>
+ <message>
+ <source>HP Device Manager - Fax Address Book Groups</source>
+ <translation>HP Device Manager - Gruppi rubrica fax</translation>
+ </message>
+ <message>
+ <source>New...</source>
+ <translation>Nuovo...</translation>
+ </message>
+ <message>
+ <source>Delete...</source>
+ <translation>Elimina...</translation>
+ </message>
+ <message>
+ <source>Edit...</source>
+ <translation>Modifica...</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Groups:&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Gruppi:&lt;/b&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>FaxSendJobForm</name>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;You may not specify both a printer (-p) and a device (-d).</source>
+ <translation>&lt;p&gt;&lt;b&gt;Non è possibile specificare sia una stampante (-p) che un dispositivo (-d).</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Unknown printer name: %1&lt;/b&gt;&lt;p&gt;Please check the printer name and try again.</source>
+ <translation>&lt;b&gt;Nome stampante sconosciuto: %1&lt;/b&gt;&lt;p&gt;Verificare il nome della stampante e riprovare.</translation>
+ </message>
+ <message>
+ <source>You must specify a printer that has a device URI in the form &apos;hpfax:/...&apos;</source>
+ <translation>È necessario specificare una stampante con un URI del dispositivo nel formato &apos;hpfax:/...&apos;</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;No devices found.&lt;/b&gt;&lt;p&gt;Please make sure your device is properly installed and try again.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Nessun dispositivo trovato.&lt;/b&gt;&lt;p&gt;Verificare che il dispositivo sia installato correttamente e riprovare.</translation>
+ </message>
+ <message>
+ <source>HP Device Manager - Send Fax</source>
+ <translation>HP Device Manager - Invia fax</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Fax send completed successfully.&lt;/b&gt;</source>
+ <translation>&lt;p&gt;&lt;b&gt;Fax inviato correttamente.&lt;/b&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>FaxSettingsForm_base</name>
+ <message>
+ <source>HP Device Manager - Fax Settings</source>
+ <translation>HP Device Manager - Impostazioni fax</translation>
+ </message>
+ <message>
+ <source>Fax Header Information</source>
+ <translation>Informazioni intestazione fax</translation>
+ </message>
+ <message>
+ <source>Device Fax Number:</source>
+ <translation>Numero fax del dispositivo:</translation>
+ </message>
+ <message>
+ <source>Name and/or Company:</source>
+ <translation>Nome e/o società:</translation>
+ </message>
+ <message>
+ <source>&lt;i&gt;This information will appear at the top of each fax that you send.&lt;/i&gt;</source>
+ <translation>&lt;i&gt;Queste informazioni verranno visualizzate nella parte superiore di ciascun fax inviato.&lt;/i&gt;</translation>
+ </message>
+ <message>
+ <source>Coverpage Information</source>
+ <translation>Informazioni frontespizio</translation>
+ </message>
+ <message>
+ <source>Voice phone number:</source>
+ <translation>Numero di telefono vocale:</translation>
+ </message>
+ <message>
+ <source>Email address:</source>
+ <translation>Indirizzo e-mail:</translation>
+ </message>
+ <message>
+ <source>&lt;i&gt;This information will appear on any coverpage that you send.&lt;/i&gt;</source>
+ <translation>&lt;i&gt;Queste informazioni verranno visualizzate su tutti i frontespizi inviati.&lt;/i&gt;</translation>
+ </message>
+ <message>
+ <source>Information</source>
+ <translation>Informazioni</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Configure device settings for sending faxes.&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Configurare le impostazioni del dispositivo per l&apos;invio di fax.&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Annulla</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+</context>
+<context>
+ <name>ImagePropertiesDlg_base</name>
+ <message>
+ <source>EXIF Labels</source>
+ <translation>Etichetta EXIF</translation>
+ </message>
+ <message>
+ <source>Contents </source>
+ <translation>Sommario</translation>
+ </message>
+ <message>
+ <source>Properties for</source>
+ <translation>Proprietà per</translation>
+ </message>
+ <message>
+ <source>MIME Type:</source>
+ <translation>Tipo MIME:</translation>
+ </message>
+ <message>
+ <source>Size:</source>
+ <translation>Formato:</translation>
+ </message>
+ <message>
+ <source>Location:</source>
+ <translation>Destinazione:</translation>
+ </message>
+ <message>
+ <source>LOCATION</source>
+ <translation>DESTINAZIONE</translation>
+ </message>
+ <message>
+ <source>MIME TYPE</source>
+ <translation>TIPO MIME</translation>
+ </message>
+ <message>
+ <source>SIZE</source>
+ <translation>FORMATO</translation>
+ </message>
+ <message>
+ <source>FILENAME</source>
+ <translation>NOME FILE</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+</context>
+<context>
+ <name>LoadPaperForm_base</name>
+ <message>
+ <source>HP Device Manager - Load Plain Paper</source>
+ <translation>HP Device Manager - Carica carta comune</translation>
+ </message>
+ <message>
+ <source>Continue</source>
+ <translation>Continua</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Annulla</translation>
+ </message>
+ <message>
+ <source>A page will be printed. Please load &lt;b&gt;plain paper&lt;/b&gt; in the printer and then press continue.</source>
+ <translation>Verrà stampata una pagina. Caricare &lt;b&gt;carta comune&lt;/b&gt; nella stampante e premere Continua.</translation>
+ </message>
+</context>
+<context>
+ <name>MakeCopiesForm</name>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;You may not specify both a printer (-p) and a device (-d).</source>
+ <translation>&lt;p&gt;&lt;b&gt;Non è possibile specificare sia una stampante (-p) che un dispositivo (-d).</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;No devices found.&lt;/b&gt;&lt;p&gt;Please make sure your device is properly installed and try again.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Nessun dispositivo trovato.&lt;/b&gt;&lt;p&gt;Verificare che il dispositivo sia installato correttamente e riprovare.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Sorry, make copies functionality is not implemented for this device.&lt;/b&gt;</source>
+ <translation>&lt;b&gt;La funzione Crea copie non è implementata per questo dispositivo.&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>HP Device Manager - Make Copies</source>
+ <translation>HP Device Manager - Crea copie</translation>
+ </message>
+</context>
+<context>
+ <name>MakeCopiesForm_base</name>
+ <message>
+ <source>HP Device Manager - Make Copies</source>
+ <translation>HP Device Manager - Crea copie</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Chiudi</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Make copies.&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Crea copie.&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Make Copies</source>
+ <translation>Crea copie</translation>
+ </message>
+ <message>
+ <source>Quality:</source>
+ <translation>Qualità:</translation>
+ </message>
+ <message>
+ <source>Fast</source>
+ <translation>Molto veloce</translation>
+ </message>
+ <message>
+ <source>Draft</source>
+ <translation>Bozza</translation>
+ </message>
+ <message>
+ <source>Normal</source>
+ <translation>Normale</translation>
+ </message>
+ <message>
+ <source>Presentation</source>
+ <translation>Presentazione</translation>
+ </message>
+ <message>
+ <source>Best</source>
+ <translation>Ottima</translation>
+ </message>
+ <message>
+ <source>Number of Copies:</source>
+ <translation>Numero di copie:</translation>
+ </message>
+ <message>
+ <source>Contrast:</source>
+ <translation>Contrasto</translation>
+ </message>
+ <message>
+ <source>+0</source>
+ <translation>+0</translation>
+ </message>
+ <message>
+ <source>Enlargement/Reduction:</source>
+ <translation>Ingrandimento/Riduzione:</translation>
+ </message>
+ <message>
+ <source>400%</source>
+ <translation>400%</translation>
+ </message>
+ <message>
+ <source>Fit to page</source>
+ <translation>Adatta alla pagina</translation>
+ </message>
+ <message>
+ <source>Copy</source>
+ <translation>Copia</translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation>Nome:</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Device information/status and output queue name.&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Informazioni/stato del dispositivo e nome della coda di output.&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Status:</source>
+ <translation>Stato:</translation>
+ </message>
+ <message>
+ <source>Refresh status</source>
+ <translation>Aggiorna stato</translation>
+ </message>
+ <message>
+ <source>Comment:</source>
+ <translation>Commento:</translation>
+ </message>
+ <message>
+ <source>Location:</source>
+ <translation>Destinazione:</translation>
+ </message>
+ <message>
+ <source>Device URI:</source>
+ <translation>URI dispositivo:</translation>
+ </message>
+ <message>
+ <source>Device</source>
+ <translation>Dispositivo</translation>
+ </message>
+</context>
+<context>
+ <name>NoDevicesForm</name>
+ <message>
+ <source>&lt;b&gt;Unable to find an appropriate su/sudo utility to run hp-setup.&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Impossibile trovare un&apos;utilità su/sudo appropriata per eseguire hp-setup.&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;An I/O error occurred.&lt;/b&gt;&lt;p&gt;Please re-start the Device Manager and try again.</source>
+<translation>&lt;b&gt;Errore I/O.&lt;/b&gt;&lt;p&gt;Riavviare il Device Manager e riprovare.</translation>
+ </message>
+</context>
+<context>
+ <name>NoDevicesForm_base</name>
+ <message>
+ <source>HP Device Manager - No Installed HP Devices Found</source>
+ <translation>HP Device Manager - Nessun dispositivo HP installato trovato</translation>
+ </message>
+ <message>
+ <source>Setup Device...</source>
+ <translation>Imposta dispositivo...</translation>
+ </message>
+ <message>
+ <source>CUPS Web Interface</source>
+ <translation>Interfaccia Web CUPS</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Chiudi</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;&lt;font size=&quot;+2&quot;&gt;No Installed HP Devices Found.&lt;/font&gt;&lt;/b&gt;&lt;p&gt;To install a device, use one of the following methods:&lt;p&gt;
+1.Run &lt;b&gt;hp-setup&lt;/b&gt; (in a shell/terminal or click &lt;tt&gt;Setup Device...&lt;/tt&gt; below).&lt;p&gt;
+2. &lt;b&gt;CUPS web interface&lt;/b&gt; (open a browser to: &lt;u&gt;http://localhost:631&lt;/u&gt; or press the button below),&lt;p&gt;
+3. The &lt;b&gt;printer installation utility&lt;/b&gt; that came with your operating system (YaST, PrinterDrake, etc).
+&lt;p&gt;&lt;p&gt;After setting up a printer, you may have to press &lt;tt&gt;F6&lt;/tt&gt; or chose &lt;tt&gt;Device | Refresh All&lt;/tt&gt; for the printer to appear in the HP Device Manager.&lt;p&gt;
+&lt;i&gt;&lt;b&gt;Note: Only devices installed with the &lt;tt&gt;hp:&lt;/tt&gt; CUPS backend will appear in the HP Device Manager.&lt;/b&gt;&lt;/i&gt;&lt;p&gt;</source>
+ <translation>&lt;b&gt;&lt;font size=&quot;+2&quot;&gt;Nessun dispositivo HP installato trovato.&lt;/font&gt;&lt;/b&gt;&lt;p&gt;Per installare un dispositivo, utilizzare uno dei seguenti metodi:&lt;p&gt;
+1.Eseguire &lt;b&gt;hp-setup&lt;/b&gt; (in una shell/terminale o fare clic su &lt;tt&gt;Imposta dispositivo...&lt;/tt&gt; riportato di seguito).&lt;p&gt;
+2. &lt;b&gt;Interfaccia Web CUPS&lt;/b&gt; (aprire un browser e digitare l&apos;indirizzo &lt;u&gt;http://localhost:631&lt;/u&gt; o premere il pulsante riportato di seguito)&lt;p&gt;
+3. &lt;b&gt;Utilità di installazione della stampante&lt;/b&gt; fornita con il sistema operativo utilizzato (YaST, PrinterDrake, ecc).
+&lt;p&gt;&lt;p&gt;Dopo aver impostato una stampante, è possibile che sia necessario premere &lt;tt&gt;F6&lt;/tt&gt; o scegliere &lt;tt&gt;Dispositivo | Aggiorna tutto&lt;/tt&gt; affinché la stampante venga visualizzata in HP Device Manager.&lt;p&gt;
+&lt;i&gt;&lt;b&gt;Nota: solo i dispositivi installati con &lt;tt&gt;hp:&lt;/tt&gt; CUPS backend verranno visualizzati in HP Device Manager.&lt;/b&gt;&lt;/i&gt;&lt;p&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>PaperEdgeAlignForm_base</name>
+ <message>
+ <source>HP Device Manager - Paper Edge Alignment</source>
+ <translation>HP Device Manager - Allineamento del bordo del foglio</translation>
+ </message>
+ <message>
+ <source>Next &gt;</source>
+ <translation>Avanti &gt;</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Annulla</translation>
+ </message>
+ <message>
+ <source>Paper Edge</source>
+ <translation>Bordo del foglio</translation>
+ </message>
+ <message>
+ <source>1</source>
+ <translation>1</translation>
+ </message>
+ <message>
+ <source>2</source>
+ <translation>2</translation>
+ </message>
+ <message>
+ <source>3</source>
+ <translation>3</translation>
+ </message>
+ <message>
+ <source>4</source>
+ <translation>4</translation>
+ </message>
+ <message>
+ <source>5</source>
+ <translation>5</translation>
+ </message>
+ <message>
+ <source>6</source>
+ <translation>6</translation>
+ </message>
+ <message>
+ <source>7</source>
+ <translation>7</translation>
+ </message>
+ <message>
+ <source>8</source>
+ <translation>8</translation>
+ </message>
+ <message>
+ <source>9</source>
+ <translation>9</translation>
+ </message>
+ <message>
+ <source>10</source>
+ <translation>10</translation>
+ </message>
+ <message>
+ <source>11</source>
+ <translation>11</translation>
+ </message>
+ <message>
+ <source>12</source>
+ <translation>12</translation>
+ </message>
+ <message>
+ <source>13</source>
+ <translation>13</translation>
+ </message>
+ <message>
+ <source>Choose the &lt;b&gt;numbered arrow&lt;/b&gt; that &lt;b&gt;best &lt;/b&gt;marks the edge of the paper.</source>
+ <translation>Scegliere la &lt;b&gt;freccia numerata&lt;/b&gt; che &lt;b&gt;meglio &lt;/b&gt;contrassegna il bordo del foglio.</translation>
+ </message>
+</context>
+<context>
+ <name>PasswordDialog</name>
+ <message>
+ <source>HP Device Manager - Enter Password</source>
+ <translation>HP Device Manager - Inserisci password</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+</context>
+<context>
+ <name>PowerSettingsDialog</name>
+ <message>
+ <source>15 minutes</source>
+ <translation>15 minuti</translation>
+ </message>
+ <message>
+ <source>30 minutes</source>
+ <translation>30 minuti</translation>
+ </message>
+ <message>
+ <source>45 minutes</source>
+ <translation>45 minuti</translation>
+ </message>
+ <message>
+ <source>1 hour</source>
+ <translation>1 ora</translation>
+ </message>
+ <message>
+ <source>2 hours</source>
+ <translation>2 ore</translation>
+ </message>
+ <message>
+ <source>3 hours</source>
+ <translation>3 ore</translation>
+ </message>
+</context>
+<context>
+ <name>PowerSettingsDialog_base</name>
+ <message>
+ <source>HP Device Manager - Battery Mode Power Settings</source>
+ <translation>HP Device Manager - Impostazioni della modalità di alimentazione a batterie</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Configure the power off settings when operating on battery power&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Configurare le impostazioni di spegnimento durante il funzionamento con alimentazione a batterie&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Annulla</translation>
+ </message>
+ <message>
+ <source>Power Settings</source>
+ <translation>Impostazioni di risparmio energia</translation>
+ </message>
+ <message>
+ <source>Automatically turn off printer after:</source>
+ <translation>Spegnere automaticamente la stampante dopo:</translation>
+ </message>
+ <message>
+ <source>Always leave printer on</source>
+ <translation>Lasciare sempre la stampante accesa</translation>
+ </message>
+</context>
+<context>
+ <name>PrinterForm</name>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;You may not specify both a printer (-p) and a device (-d).</source>
+ <translation>&lt;p&gt;&lt;b&gt;Non è possibile specificare sia una stampante (-p) che un dispositivo (-d).</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;No devices found.&lt;/b&gt;&lt;p&gt;Please make sure your device is properly installed and try again.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Nessun dispositivo trovato.&lt;/b&gt;&lt;p&gt;Verificare che il dispositivo sia installato correttamente e riprovare.</translation>
+ </message>
+ <message>
+ <source>HP Device Manager - Print</source>
+ <translation>HP Device Manager - Stampa</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollCopyView</name>
+ <message>
+ <source>Number of Copies</source>
+<translation>Numero di copie</translation>
+ </message>
+ <message>
+ <source>Enlargement, Reduction and Fit to Page</source>
+<translation>Ingrandimento, Riduzione e Adatta alla pagina</translation>
+ </message>
+ <message>
+ <source>Copy Contrast</source>
+<translation>Contrasto copia</translation>
+ </message>
+ <message>
+ <source>Copy Quality</source>
+<translation>Qualità copia</translation>
+ </message>
+ <message>
+ <source>&lt;&lt; Functions</source>
+<translation>&lt;&lt; Functions</translation>
+ </message>
+ <message>
+ <source>Close</source>
+<translation>Close</translation>
+ </message>
+ <message>
+ <source>Make Copies(s)</source>
+<translation>Make Copies(s)</translation>
+ </message>
+ <message>
+ <source>Number of copies:</source>
+<translation>Number of copies:</translation>
+ </message>
+ <message>
+ <source>Default</source>
+<translation>Default</translation>
+ </message>
+ <message>
+ <source>Quality:</source>
+<translation>Quality:</translation>
+ </message>
+ <message>
+ <source>Fast</source>
+<translation>Fast</translation>
+ </message>
+ <message>
+ <source>Draft</source>
+<translation>Draft</translation>
+ </message>
+ <message>
+ <source>Normal</source>
+<translation>Normal</translation>
+ </message>
+ <message>
+ <source>Presentation</source>
+<translation>Presentation</translation>
+ </message>
+ <message>
+ <source>Best</source>
+<translation>Best</translation>
+ </message>
+ <message>
+ <source>Enlargement or reduction (percent):</source>
+<translation>Enlargement or reduction (percent):</translation>
+ </message>
+ <message>
+ <source>Fit to Page</source>
+<translation>Ingrandimento, Riduzione e Adatta alla pagina</translation>
+ </message>
+ <message>
+ <source>Contrast (-5 lighter to +5 darker):</source>
+<translation>Contrast (-5 lighter to +5 darker):</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Copier error.&lt;/b&gt;&lt;p&gt;</source>
+<translation>&lt;b&gt;Errore fotocopiatrice.&lt;/b&gt;&lt;p&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Cannot copy: Device is busy or not available.&lt;/b&gt;&lt;p&gt;Please check device and try again. [1]</source>
+<translation>&lt;b&gt;Impossibile copiare: il dispositivo è occupato o non disponibile.&lt;/b&gt;&lt;p&gt;Verificare il dispositivo e riprovare. [1]</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollDeviceInfoView</name>
+ <message>
+ <source>&lt;&lt; Tools</source>
+ <translation>&lt;&lt; Strumenti</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Chiudi</translation>
+ </message>
+ <message>
+ <source>Device Information</source>
+ <translation>Informazioni dispositivo</translation>
+ </message>
+ <message>
+ <source>Static/Dynamic</source>
+ <translation>Statico/Dinamico</translation>
+ </message>
+ <message>
+ <source>Key</source>
+ <translation>Chiave</translation>
+ </message>
+ <message>
+ <source>Value</source>
+ <translation>Valore</translation>
+ </message>
+ <message>
+ <source>Static</source>
+ <translation>Statico</translation>
+ </message>
+ <message>
+ <source>Dynamic</source>
+ <translation>Dinamico</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollFaxView</name>
+ <message>
+ <source>PDF Document</source>
+ <translation>Documento PDF</translation>
+ </message>
+ <message>
+ <source>Postscript Document</source>
+ <translation>Documento Postscript</translation>
+ </message>
+ <message>
+ <source>HP Graphics Language File</source>
+ <translation>File HP Graphics Language</translation>
+ </message>
+ <message>
+ <source>C Shell Script</source>
+ <translation>Script shell C</translation>
+ </message>
+ <message>
+ <source>C Source Code</source>
+ <translation>Codice sorgente C</translation>
+ </message>
+ <message>
+ <source>C++ Source Code</source>
+ <translation>Codice sorgente C++</translation>
+ </message>
+ <message>
+ <source>Perl Script</source>
+ <translation>Script Perl</translation>
+ </message>
+ <message>
+ <source>Python Program</source>
+ <translation>Programma Python</translation>
+ </message>
+ <message>
+ <source>Shell Script</source>
+ <translation>Script shell</translation>
+ </message>
+ <message>
+ <source>Plain Text</source>
+ <translation>Testo normale</translation>
+ </message>
+ <message>
+ <source>HTML Dcoument</source>
+ <translation>Documento HTML</translation>
+ </message>
+ <message>
+ <source>GIF Image</source>
+ <translation>Immagine GIF</translation>
+ </message>
+ <message>
+ <source>PNG Image</source>
+ <translation>Immagine PNG</translation>
+ </message>
+ <message>
+ <source>JPEG Image</source>
+ <translation>Immagine JPEG</translation>
+ </message>
+ <message>
+ <source>TIFF Image</source>
+ <translation>Immagine TIFF</translation>
+ </message>
+ <message>
+ <source>Bitmap (BMP) Image</source>
+ <translation>Immagine bitmap (BMP)</translation>
+ </message>
+ <message>
+ <source>Photo CD Image</source>
+ <translation>Immagine Photo CD</translation>
+ </message>
+ <message>
+ <source>Portable Image (PNM)</source>
+ <translation>Portable Image (PNM)</translation>
+ </message>
+ <message>
+ <source>Portable B&amp;W Image (PBM)</source>
+ <translation>Portable B&amp;W Image (PBM)</translation>
+ </message>
+ <message>
+ <source>Portable Grayscale Image (PGM)</source>
+ <translation>Portable Grayscale Image (PGM)</translation>
+ </message>
+ <message>
+ <source>Portable Color Image (PPM)</source>
+ <translation>Portable Color Image (PPM)</translation>
+ </message>
+ <message>
+ <source>SGI RGB</source>
+ <translation>SGI RGB</translation>
+ </message>
+ <message>
+ <source>X11 Bitmap (XBM)</source>
+ <translation>X11 Bitmap (XBM)</translation>
+ </message>
+ <message>
+ <source>X11 Pixmap (XPM)</source>
+ <translation>X11 Pixmap (XPM)</translation>
+ </message>
+ <message>
+ <source>Sun Raster Format</source>
+ <translation>Formato Sun Raster</translation>
+ </message>
+ <message>
+ <source>File(s) to Fax</source>
+ <translation>File da inviare via fax</translation>
+ </message>
+ <message>
+ <source>Add/Edit Fax Coverpage</source>
+ <translation>Aggiungi/Modifica frontespizio fax</translation>
+ </message>
+ <message>
+ <source>Recipient(s)</source>
+ <translation>Destinatari</translation>
+ </message>
+ <message>
+ <source>Add Recipients from the Fax Address Book</source>
+ <translation>Aggiungi destinatari dalla rubrica fax</translation>
+ </message>
+ <message>
+ <source>&lt;i&gt;Quick Add&lt;/i&gt; an Individual Recipient</source>
+ <translation>&lt;i&gt;Aggiungi rapidamente&lt;/i&gt; un solo destinatario</translation>
+ </message>
+ <message>
+ <source>&lt;&lt; Functions</source>
+ <translation>&lt;&lt; Funzioni</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Chiudi</translation>
+ </message>
+ <message>
+ <source>Send Fax Now</source>
+ <translation>Invia fax ora</translation>
+ </message>
+ <message>
+ <source>Processing fax...</source>
+ <translation>Elaborazione fax in corso...</translation>
+ </message>
+ <message>
+ <source>Receiving fax data...</source>
+ <translation>Ricezione dati fax in corso...</translation>
+ </message>
+ <message>
+ <source>Read %1 of fax data...</source>
+ <translation>%1 di dati fax letti...</translation>
+ </message>
+ <message>
+ <source>Order</source>
+ <translation>Ordina</translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation>Nome</translation>
+ </message>
+ <message>
+ <source>Type</source>
+ <translation>Tipo</translation>
+ </message>
+ <message>
+ <source>Pages</source>
+ <translation>Pagine</translation>
+ </message>
+ <message>
+ <source>Path</source>
+ <translation>Percorso</translation>
+ </message>
+ <message>
+ <source>Add File...</source>
+ <translation>Aggiungi file...</translation>
+ </message>
+ <message>
+ <source>Show Types...</source>
+ <translation>Mostra tipi...</translation>
+ </message>
+ <message>
+ <source>Remove File</source>
+ <translation>Rimuovi file</translation>
+ </message>
+ <message>
+ <source>Move Down</source>
+ <translation>Sposta giù</translation>
+ </message>
+ <message>
+ <source>Move Up</source>
+ <translation>Sposta su</translation>
+ </message>
+ <message>
+ <source>Show File Types...</source>
+ <translation>Mostra tipi di file...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Invalid HPLIP Fax file.&lt;/b&gt;&lt;p&gt;Bad magic!</source>
+ <translation>&lt;b&gt;File fax HPLIP non valido.&lt;/b&gt;&lt;p&gt;Numero errato.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;You are trying to add a file that cannot be directly faxed with this utility.&lt;/b&gt;&lt;p&gt;To print this file, use the print command in the application that created it.</source>
+ <translation>&lt;b&gt;Si sta tentando di aggiungere un file che non può essere inviato direttamente via fax con questa utilità.&lt;/b&gt;&lt;p&gt;Per stampare questo file, utilizzare il comando di stampa nell&apos;applicazione in cui è stato creato.</translation>
+ </message>
+ <message>
+ <source>Processing fax file...</source>
+ <translation>Elaborazione file fax in corso...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Printer &apos;%1&apos; is in a stopped or error state.&lt;/b&gt;&lt;p&gt;Check the printer queue in CUPS and try again.</source>
+ <translation>&lt;b&gt;Lo stato della stampante &apos;%1&apos; è arrestato o in errore.&lt;/b&gt;&lt;p&gt;Verificare la coda della stampante in CUPS e riprovare.</translation>
+ </message>
+ <message>
+ <source>Edit...</source>
+ <translation>Modifica...</translation>
+ </message>
+ <message>
+ <source>Add...</source>
+ <translation>Aggiungi...</translation>
+ </message>
+ <message>
+ <source>HP Fax Coverpage</source>
+ <translation>Frontespizio fax HP</translation>
+ </message>
+ <message>
+ <source>Cover Page</source>
+ <translation>Frontespizio</translation>
+ </message>
+ <message>
+ <source>Fax Number</source>
+ <translation>Numero fax</translation>
+ </message>
+ <message>
+ <source>Notes</source>
+ <translation>Note</translation>
+ </message>
+ <message>
+ <source>Fax Address Book...</source>
+ <translation>Rubrica fax...</translation>
+ </message>
+ <message>
+ <source>Remove</source>
+ <translation>Rimuovi</translation>
+ </message>
+ <message>
+ <source>Add Individual</source>
+ <translation>Aggiungi contatto</translation>
+ </message>
+ <message>
+ <source>Add Group</source>
+ <translation>Aggiungi gruppo</translation>
+ </message>
+ <message>
+ <source>Add an &lt;b&gt;individual &lt;/b&gt;from the fax address book:</source>
+ <translation>Aggiungere un &lt;b&gt;contatto &lt;/b&gt;dalla rubrica fax:</translation>
+ </message>
+ <message>
+ <source>Add a &lt;b&gt;group&lt;/b&gt; from the fax address book:</source>
+ <translation>Aggiungere un &lt;b&gt;gruppo&lt;/b&gt; dalla rubrica fax:</translation>
+ </message>
+ <message>
+ <source>Add</source>
+ <translation>Aggiungi</translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation>Nome:</translation>
+ </message>
+ <message>
+ <source>Fax Number:</source>
+ <translation>Numero fax:</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Fax configuration error.&lt;/b&gt;&lt;p&gt;The CUPS fax queue for &apos;%1&apos; is incorrectly configured.&lt;p&gt;Please make sure that the CUPS fax queue is configured with the &apos;HPLIP Fax&apos; Model/Driver.</source>
+ <translation>&lt;b&gt;Errore di configurazione fax.&lt;/b&gt;&lt;p&gt;La coda fax CUPS per &apos;%1&apos; non è configurata correttamente.&lt;p&gt;Verificare che la coda fax CUPS sia configurata con il modello/driver di &apos;HPLIP Fax&apos;.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Device is busy or in an error state (code=%1)&lt;/b&gt;&lt;p&gt;Please wait for the device to become idle or clear the error and try again.</source>
+ <translation>&lt;b&gt;Il dispositivo è occupato o in stato di errore (codice=%1)&lt;/b&gt;&lt;p&gt;Attendere che il dispositivo diventi inattivo o eliminare l&apos;errore e riprovare.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;The CUPS queue for &apos;%1&apos; is in a stopped or busy state.&lt;/b&gt;&lt;p&gt;Please check the queue and try again.</source>
+ <translation>&lt;b&gt;Lo stato della coda CUPS per &apos;%1&apos; è arrestato o occupato.&lt;/b&gt;&lt;p&gt;Verificare la coda e riprovare.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Send fax is active.&lt;/b&gt;&lt;p&gt;Please wait for operation to complete.</source>
+ <translation>&lt;b&gt;È attivo l&apos;invio fax.&lt;/b&gt;&lt;p&gt;Attendere il completamento dell&apos;operazione.</translation>
+ </message>
+ <message>
+ <source>Initializing...</source>
+ <translation>Inizializzazione in corso...</translation>
+ </message>
+ <message>
+ <source>Processing page %1...</source>
+ <translation>Elaborazione della pagina %1 in corso...</translation>
+ </message>
+ <message>
+ <source>Dialing %1...</source>
+ <translation>Composizione di %1 in corso...</translation>
+ </message>
+ <message>
+ <source>Connecting to %1...</source>
+ <translation>Connessione a %1 in corso...</translation>
+ </message>
+ <message>
+ <source>Sending page %1 to %2...</source>
+ <translation>Invio della pagina %1 a %2 in corso...</translation>
+ </message>
+ <message>
+ <source>Cleaning up...</source>
+ <translation>Pulizia in corso...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Fax send error.&lt;/b&gt;&lt;p&gt;</source>
+ <translation>&lt;b&gt;Errore di invio fax.&lt;/b&gt;&lt;p&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Fax device is busy.&lt;/b&gt;&lt;p&gt;Please try again later.</source>
+ <translation>&lt;b&gt;Il dispositivo fax è occupato.&lt;/b&gt;&lt;p&gt;Riprovare più tardi.</translation>
+ </message>
+ <message>
+ <source>Added with Quick Add</source>
+<translation>Aggiunto con Aggiungi rapidamente</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollFunctionsView</name>
+ <message>
+ <source>Print &gt;&gt;</source>
+ <translation>Stampa &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>Print...</source>
+ <translation>Stampa...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Print&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Stampa&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Print documents or files.</source>
+ <translation>Stampare documenti o file.</translation>
+ </message>
+ <message>
+ <source>Scan &gt;&gt;</source>
+ <translation>Scansione &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>Scan...</source>
+ <translation>Scansione...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Scan&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Scansione&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Scan a document, image, or photograph.</source>
+ <translation>Eseguire la scansione di un documento, di un&apos;immagine o di una fotografia.</translation>
+ </message>
+ <message>
+ <source>Send PC Fax &gt;&gt;</source>
+ <translation>Invia fax da PC &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>Send PC Fax...</source>
+ <translation>Invia fax da PC...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Send PC Fax&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Invia fax da PC&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Send a fax from the PC.</source>
+ <translation>Inviare un fax dal PC.</translation>
+ </message>
+ <message>
+ <source>Make Copies &gt;&gt;</source>
+ <translation>Crea copie &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>Make Copies...</source>
+ <translation>Crea copie...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Make Copies&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Crea copie&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Make copies on the device controlled by the PC.</source>
+ <translation>Creare copie sul dispositivo controllato dal PC.</translation>
+ </message>
+ <message>
+ <source>Unload Photo Card &gt;&gt;</source>
+ <translation>Scarica scheda fotografica &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>Unload Photo Card...</source>
+ <translation>Scarica scheda fotografica...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Unload Photo Card&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Scarica scheda fotografica&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Copy images from the device&apos;s photo card to the PC.</source>
+ <translation>Copiare le immagini dalla scheda fotografica del dispositivo nel PC.</translation>
+ </message>
+ <message>
+ <source>ERROR: Device not supported.</source>
+ <translation>ERRORE: dispositivo non supportato.</translation>
+ </message>
+ <message>
+ <source>ERROR: Device not found. Please check connection and power-on device.</source>
+ <translation>ERRORE: dispositivo non trovato. Verificare la connessione e accendere il dispositivo.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Photocards on your printer are only available by mounting them as drives using USB mass storage.&lt;/b&gt;&lt;p&gt;Please refer to your distribution&apos;s documentation for setup and usage instructions.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Le schede fotografiche della stampante sono disponibili solo se vengono montate come unità utilizzando la memorizzazione di massa USB.&lt;/b&gt;&lt;p&gt;Per istruzioni sull&apos;impostazione e sull&apos;utilizzo, consultare la documentazione di distribuzione.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Unable to run command. No command specified.&lt;/b&gt;&lt;p&gt;Use &lt;pre&gt;Configure...&lt;/pre&gt; to specify a command to run.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Impossibile eseguire il comando. Nessun comando specificato.&lt;/b&gt;&lt;p&gt;Utilizzare &lt;pre&gt;Configura...&lt;/pre&gt; per specificare un comando da eseguire.</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollPrintJobView</name>
+ <message>
+ <source>Pending</source>
+ <translation>In sospeso</translation>
+ </message>
+ <message>
+ <source>On hold</source>
+ <translation>In attesa</translation>
+ </message>
+ <message>
+ <source>Printing</source>
+ <translation>Stampa in corso</translation>
+ </message>
+ <message>
+ <source>Stopped</source>
+ <translation>Arrestato</translation>
+ </message>
+ <message>
+ <source>Canceled</source>
+ <translation>Annullato</translation>
+ </message>
+ <message>
+ <source>Aborted</source>
+ <translation>Interrotto</translation>
+ </message>
+ <message>
+ <source>Completed</source>
+ <translation>Completato</translation>
+ </message>
+ <message>
+ <source>Print Control</source>
+ <translation>Controllo stampa</translation>
+ </message>
+ <message>
+ <source>Job Control</source>
+ <translation>Controllo lavoro</translation>
+ </message>
+ <message>
+ <source>1 Active Print Job</source>
+ <translation>1 lavoro di stampa attivo</translation>
+ </message>
+ <message>
+ <source>%1 Active Print Jobs</source>
+ <translation>%1 lavori di stampa attivi</translation>
+ </message>
+ <message>
+ <source>Set as Default</source>
+ <translation>Imposta come predefinita</translation>
+ </message>
+ <message>
+ <source>SET AS DEFAULT</source>
+ <translation>IMPOSTA COME PREDEFINITA</translation>
+ </message>
+ <message>
+ <source>NOT SET AS DEFAULT</source>
+ <translation>NON IMPOSTARE COME PREDEFINITA</translation>
+ </message>
+ <message>
+ <source>The printer is currently: %1</source>
+ <translation>La stampante attualmente è: %1</translation>
+ </message>
+ <message>
+ <source>IDLE</source>
+ <translation>INATTIVA</translation>
+ </message>
+ <message>
+ <source>Stop Printer</source>
+ <translation>Arresta stampante</translation>
+ </message>
+ <message>
+ <source>PROCESSING</source>
+ <translation>IN ELABORAZIONE</translation>
+ </message>
+ <message>
+ <source>STOPPED</source>
+ <translation>ARRESTATA</translation>
+ </message>
+ <message>
+ <source>Start Printer</source>
+ <translation>Avvia stampante</translation>
+ </message>
+ <message>
+ <source>ACCEPTING JOBS</source>
+ <translation>ACCETTAZIONE LAVORI</translation>
+ </message>
+ <message>
+ <source>Reject Jobs</source>
+ <translation>Rifiuta lavori</translation>
+ </message>
+ <message>
+ <source>REJECTING JOBS</source>
+ <translation>RIFIUTO LAVORI</translation>
+ </message>
+ <message>
+ <source>Accept Jobs</source>
+ <translation>Accetta lavori</translation>
+ </message>
+ <message>
+ <source>Cancel all active print jobs</source>
+ <translation>Annulla tutti i lavori di stampa attivi</translation>
+ </message>
+ <message>
+ <source>Cancel All Jobs</source>
+ <translation>Annulla tutti i lavori</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;%1&lt;/b&gt;</source>
+ <translation>&lt;b&gt;%1&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Job ID: %1</source>
+ <translation>ID lavoro: %1</translation>
+ </message>
+ <message>
+ <source>Cancel Job</source>
+ <translation>Annulla lavoro</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollPrintSettingsView</name>
+ <message>
+ <source>Basic</source>
+<translation>Base</translation>
+ </message>
+ <message>
+ <source>Page Orientation</source>
+<translation>Orientamento pagina</translation>
+ </message>
+ <message>
+ <source>Portrait</source>
+<translation>Verticale</translation>
+ </message>
+ <message>
+ <source>Landscape</source>
+<translation>Orizzontale</translation>
+ </message>
+ <message>
+ <source>Reverse landscape</source>
+<translation>Orizzontale invertito</translation>
+ </message>
+ <message>
+ <source>Reverse portrait</source>
+<translation>Verticale invertito</translation>
+ </message>
+ <message>
+ <source>Duplex (Print on both sides of the page)</source>
+<translation>Fronte/retro (stampa su entrambi i lati della pagina)</translation>
+ </message>
+ <message>
+ <source>Single sided</source>
+<translation>Un lato</translation>
+ </message>
+ <message>
+ <source>Two sided (long edge)</source>
+<translation>Due lati (lato lungo)</translation>
+ </message>
+ <message>
+ <source>Two sided (short edge)</source>
+<translation>Due lati (lato corto)</translation>
+ </message>
+ <message>
+ <source>Output Order (Print last page first)</source>
+<translation>Ordine di uscita (inizia dall'ultima pagina)</translation>
+ </message>
+ <message>
+ <source>Normal (Print first page first)</source>
+<translation>Normale (inizia dalla prima pagina)</translation>
+ </message>
+ <message>
+ <source>Reversed (Print last page first)</source>
+<translation>Invertito (inizia dall'ultima pagina)</translation>
+ </message>
+ <message>
+ <source>Collate (Group together multiple copies)</source>
+<translation>Fascicolazione (raggruppa più copie)</translation>
+ </message>
+ <message>
+ <source>Quality</source>
+<translation>Qualità copia</translation>
+ </message>
+ <message>
+ <source>N-Up (Multiple document pages per printed page)</source>
+<translation>Stampa multipla (più pagine di documento per pagina stampata)</translation>
+ </message>
+ <message>
+ <source>Pages per Sheet</source>
+<translation>Pagine per foglio</translation>
+ </message>
+ <message>
+ <source>1 sheet per page</source>
+<translation>1 foglio per pagina</translation>
+ </message>
+ <message>
+ <source>2 sheets per page</source>
+<translation>2 fogli per pagina</translation>
+ </message>
+ <message>
+ <source>4 sheets per page</source>
+<translation>4 fogli per pagina</translation>
+ </message>
+ <message>
+ <source>Layout</source>
+<translation>Formato</translation>
+ </message>
+ <message>
+ <source>Bottom to top, left to right</source>
+<translation>Dal basso in alto, da sinistra a destra</translation>
+ </message>
+ <message>
+ <source>Bottom to top, right to left</source>
+<translation>Dal basso in alto, da destra a sinistra</translation>
+ </message>
+ <message>
+ <source>Left to right, bottom to top</source>
+<translation>Da sinistra a destra, dal basso in alto</translation>
+ </message>
+ <message>
+ <source>Left to right, top to bottom</source>
+<translation>Da sinistra a destra, dall'alto in basso</translation>
+ </message>
+ <message>
+ <source>Right to left, bottom to top</source>
+<translation>Da destra a sinistra, dal basso in alto</translation>
+ </message>
+ <message>
+ <source>Right to left, top to bottom</source>
+<translation>Da destra a sinistra, dall'alto in basso</translation>
+ </message>
+ <message>
+ <source>Top to bottom, left to right</source>
+<translation>Dall'alto in basso, da sinistra a destra</translation>
+ </message>
+ <message>
+ <source>Top to bottom, right to left</source>
+<translation>Dall'alto in basso, da destra a sinistra</translation>
+ </message>
+ <message>
+ <source>Printed Border Around Each Page</source>
+<translation>Bordo stampato intorno a ciascuna pagina</translation>
+ </message>
+ <message>
+ <source>Two thin borders</source>
+<translation>Due bordi sottili</translation>
+ </message>
+ <message>
+ <source>Two thick borders</source>
+<translation>Due bordi spessi</translation>
+ </message>
+ <message>
+ <source>No border</source>
+<translation>Nessun bordo</translation>
+ </message>
+ <message>
+ <source>One thin border</source>
+<translation>Un bordo sottile</translation>
+ </message>
+ <message>
+ <source>One thick border</source>
+<translation>Un bordo spesso</translation>
+ </message>
+ <message>
+ <source>Printout Appearance</source>
+<translation>Aspetto stampa</translation>
+ </message>
+ <message>
+ <source>Brightness</source>
+<translation>Luminosità</translation>
+ </message>
+ <message>
+ <source>Gamma</source>
+<translation>Gamma</translation>
+ </message>
+ <message>
+ <source>Image Printing</source>
+<translation>Stampa immagini</translation>
+ </message>
+ <message>
+ <source>Fit to Page</source>
+<translation>Ingrandimento, Riduzione e Adatta alla pagina</translation>
+ </message>
+ <message>
+ <source>Position on Page</source>
+<translation>Posizione nella pagina</translation>
+ </message>
+ <message>
+ <source>Centered</source>
+<translation>Al centro</translation>
+ </message>
+ <message>
+ <source>Top</source>
+<translation>Dall'alto in basso, da sinistra a destra</translation>
+ </message>
+ <message>
+ <source>Left</source>
+<translation>Da sinistra a destra, dal basso in alto</translation>
+ </message>
+ <message>
+ <source>Right</source>
+<translation>Da destra a sinistra, dal basso in alto</translation>
+ </message>
+ <message>
+ <source>Top left</source>
+<translation>In alto a sinistra</translation>
+ </message>
+ <message>
+ <source>Top right</source>
+<translation>In alto a destra</translation>
+ </message>
+ <message>
+ <source>Bottom</source>
+<translation>Dal basso in alto, da sinistra a destra</translation>
+ </message>
+ <message>
+ <source>Bottom left</source>
+<translation>In basso a sinistra</translation>
+ </message>
+ <message>
+ <source>Bottom right</source>
+<translation>In basso a destra</translation>
+ </message>
+ <message>
+ <source>Saturation</source>
+<translation>Saturazione</translation>
+ </message>
+ <message>
+ <source>Hue (color shift/rotation)</source>
+<translation>Tonalità (tendenza/rotazione colore)</translation>
+ </message>
+ <message>
+ <source>&quot;Natural&quot; Scaling (relative to image)</source>
+<translation>Proporzioni &quot;naturali&quot; (relative all'immagine)</translation>
+ </message>
+ <message>
+ <source>Scaling (relative to page)</source>
+<translation>Proporzioni (relative alla pagina)</translation>
+ </message>
+ <message>
+ <source>Miscellaneous</source>
+<translation>Varie</translation>
+ </message>
+ <message>
+ <source>&quot;Pretty Print&quot; Text Documents (Add headers and formatting)</source>
+<translation>&quot;Stampa&quot; documenti di testo (aggiunta di intestazioni e formattazione)</translation>
+ </message>
+ <message>
+ <source>Banner Pages</source>
+<translation>Pagine di intestazione</translation>
+ </message>
+ <message>
+ <source>No banner page</source>
+<translation>Nessuna pagina di intestazione</translation>
+ </message>
+ <message>
+ <source>Classified</source>
+<translation>Classificato</translation>
+ </message>
+ <message>
+ <source>Confidential</source>
+<translation>Riservato</translation>
+ </message>
+ <message>
+ <source>Secret</source>
+<translation>Segreto</translation>
+ </message>
+ <message>
+ <source>Standard</source>
+<translation>Standard</translation>
+ </message>
+ <message>
+ <source>Top secret</source>
+<translation>Segretissimo</translation>
+ </message>
+ <message>
+ <source>Unclassified</source>
+<translation>Non classificato</translation>
+ </message>
+ <message>
+ <source>Mirror Printing</source>
+<translation>Stampa speculare</translation>
+ </message>
+ <message>
+ <source>Set Quality to &quot;Controlled by &apos;Printout Mode&apos;&quot; to enable.</source>
+<translation>Per l'attivazione, impostare la qualità su &quot;Controllato da &apos;modo stampa&apos;&quot;.</translation>
+ </message>
+ <message>
+ <source>On</source>
+<translation>Un bordo sottile</translation>
+ </message>
+ <message>
+ <source>Off</source>
+<translation>Spento</translation>
+ </message>
+ <message>
+ <source>Set to default value of &quot;%1&quot;.</source>
+<translation>Impostare sul valore predefinito di &quot;%1&quot;.</translation>
+ </message>
+ <message>
+ <source>Start:</source>
+<translation>Inizio:</translation>
+ </message>
+ <message>
+ <source>End:</source>
+<translation>Fine:</translation>
+ </message>
+ <message>
+ <source>Set to default value of &quot;Start: %1, End: %2&quot;.</source>
+<translation>Impostare il valore predefinito di &quot;Inizio: %1, Fine: %2&quot;.</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollPrintView</name>
+ <message>
+ <source>PDF Document</source>
+ <translation>Documento PDF</translation>
+ </message>
+ <message>
+ <source>Postscript Document</source>
+ <translation>Documento Postscript</translation>
+ </message>
+ <message>
+ <source>HP Graphics Language File</source>
+ <translation>File HP Graphics Language</translation>
+ </message>
+ <message>
+ <source>C Shell Script</source>
+ <translation>Script shell C</translation>
+ </message>
+ <message>
+ <source>C Source Code</source>
+ <translation>Codice sorgente C</translation>
+ </message>
+ <message>
+ <source>C++ Source Code</source>
+ <translation>Codice sorgente C++</translation>
+ </message>
+ <message>
+ <source>Perl Script</source>
+ <translation>Script Perl</translation>
+ </message>
+ <message>
+ <source>Python Program</source>
+ <translation>Programma Python</translation>
+ </message>
+ <message>
+ <source>Shell Script</source>
+ <translation>Script shell</translation>
+ </message>
+ <message>
+ <source>Plain Text</source>
+ <translation>Testo normale</translation>
+ </message>
+ <message>
+ <source>HTML Dcoument</source>
+ <translation>Documento HTML</translation>
+ </message>
+ <message>
+ <source>GIF Image</source>
+ <translation>Immagine GIF</translation>
+ </message>
+ <message>
+ <source>PNG Image</source>
+ <translation>Immagine PNG</translation>
+ </message>
+ <message>
+ <source>JPEG Image</source>
+ <translation>Immagine JPEG</translation>
+ </message>
+ <message>
+ <source>TIFF Image</source>
+ <translation>Immagine TIFF</translation>
+ </message>
+ <message>
+ <source>Bitmap (BMP) Image</source>
+ <translation>Immagine bitmap (BMP)</translation>
+ </message>
+ <message>
+ <source>Photo CD Image</source>
+ <translation>Immagine Photo CD</translation>
+ </message>
+ <message>
+ <source>Portable Image (PNM)</source>
+ <translation>Portable Image (PNM)</translation>
+ </message>
+ <message>
+ <source>Portable B&amp;W Image (PBM)</source>
+ <translation>Portable B&amp;W Image (PBM)</translation>
+ </message>
+ <message>
+ <source>Portable Grayscale Image (PGM)</source>
+ <translation>Portable Grayscale Image (PGM)</translation>
+ </message>
+ <message>
+ <source>Portable Color Image (PPM)</source>
+ <translation>Portable Color Image (PPM)</translation>
+ </message>
+ <message>
+ <source>SGI RGB</source>
+ <translation>SGI RGB</translation>
+ </message>
+ <message>
+ <source>X11 Bitmap (XBM)</source>
+ <translation>X11 Bitmap (XBM)</translation>
+ </message>
+ <message>
+ <source>X11 Pixmap (XPM)</source>
+ <translation>X11 Pixmap (XPM)</translation>
+ </message>
+ <message>
+ <source>Sun Raster Format</source>
+ <translation>Formato Sun Raster</translation>
+ </message>
+ <message>
+ <source>File(s) to Print</source>
+ <translation>File da stampare</translation>
+ </message>
+ <message>
+ <source>Print Options</source>
+ <translation>Opzioni di stampa</translation>
+ </message>
+ <message>
+ <source>&lt;&lt; Functions</source>
+ <translation>&lt;&lt; Funzioni</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Chiudi</translation>
+ </message>
+ <message>
+ <source>Print File(s)</source>
+ <translation>Stampa file</translation>
+ </message>
+ <message>
+ <source>Order</source>
+ <translation>Ordina</translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation>Nome</translation>
+ </message>
+ <message>
+ <source>Type</source>
+ <translation>Tipo</translation>
+ </message>
+ <message>
+ <source>Path</source>
+ <translation>Percorso</translation>
+ </message>
+ <message>
+ <source>Add File...</source>
+ <translation>Aggiungi file...</translation>
+ </message>
+ <message>
+ <source>Show Types...</source>
+ <translation>Mostra tipi...</translation>
+ </message>
+ <message>
+ <source>Remove File</source>
+ <translation>Rimuovi file</translation>
+ </message>
+ <message>
+ <source>Move Down</source>
+ <translation>Sposta giù</translation>
+ </message>
+ <message>
+ <source>Move Up</source>
+ <translation>Sposta su</translation>
+ </message>
+ <message>
+ <source>Show File Types...</source>
+ <translation>Mostra tipi di file...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;You are trying to add a file that cannot be directly printed with this utility.&lt;/b&gt;&lt;p&gt;To print this file, use the print command in the application that created it.</source>
+ <translation>&lt;b&gt;Si sta tentando di aggiungere un file che non può essere stampato direttamente con questa utilità.&lt;/b&gt;&lt;p&gt;Per stampare questo file, utilizzare il comando di stampa nell&apos;applicazione in cui è stato creato.</translation>
+ </message>
+ <message>
+ <source>Number of copies:</source>
+ <translation>Numero di copie:</translation>
+ </message>
+ <message>
+ <source>Default</source>
+ <translation>Valore predefinito</translation>
+ </message>
+ <message>
+ <source>Page Range:</source>
+ <translation>Intervallo pagine:</translation>
+ </message>
+ <message>
+ <source>All pages</source>
+ <translation>Tutte le pagine</translation>
+ </message>
+ <message>
+ <source>Page range:</source>
+ <translation>Intervallo pagine:</translation>
+ </message>
+ <message>
+ <source>Page set:</source>
+ <translation>Gruppo di pagine:</translation>
+ </message>
+ <message>
+ <source>Even pages</source>
+ <translation>Pagine pari</translation>
+ </message>
+ <message>
+ <source>Odd pages</source>
+ <translation>Pagine dispari</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Cannot print: Invalid page range: %1&lt;/b&gt;&lt;p&gt;A valid page range is a list of pages or ranges of pages separated by commas (e.g., 1-2,4,6-7)</source>
+ <translation>&lt;b&gt;Impossibile stampare: intervallo di pagine non valido: %1&lt;/b&gt;&lt;p&gt;Un intervallo di pagine valido è un elenco di pagine o intervalli di pagine separati da virgole (ad esempio, 1-2,4,6-7)</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Cannot print: Device is busy or not available.&lt;/b&gt;&lt;p&gt;Please check device and try again. [1]</source>
+ <translation type="obsolete">&lt;b&gt;Impossibile stampare: il dispositivo è occupato o non disponibile.&lt;/b&gt;&lt;p&gt;Verificare il dispositivo e riprovare. [1]</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Cannot print: Printer is stopped.&lt;/b&gt;&lt;p&gt;Please START the printer to continue this print. Job will begin printing once printer is started.</source>
+ <translation>&lt;b&gt;Impossibile stampare: la stampante è stata arrestata.&lt;/b&gt;&lt;p&gt;Avviare la stampante per continuare a stampare. La stampa del lavoro inizierà non appena verrà avviata la stampante.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Cannot print: Printer is not accepting jobs.&lt;/b&gt;&lt;p&gt;Please set the printer to ACCEPTING JOBS to continue printing.</source>
+ <translation>&lt;b&gt;Impossibile stampare: la stampante non accetta lavori.&lt;/b&gt;&lt;p&gt;Impostare la stampante su ACCETTAZIONE LAVORI per proseguire con la stampa.</translation>
+ </message>
+ <message>
+ <source>Print command failed with error code %1</source>
+ <translation>Comando di stampa non riuscito con codice di errore %1</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Cannot print: Device is busy or not available.&lt;/b&gt;&lt;p&gt;Please check device and try again.</source>
+<translation>&lt;b&gt;Impossibile stampare: il dispositivo è occupato o non disponibile.&lt;/b&gt;&lt;p&gt;Verificare il dispositivo e riprovare.</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollPrinterInfoView</name>
+ <message>
+ <source>No printers found for this device.</source>
+ <translation>Nessuna stampante trovata per questo dispositivo.</translation>
+ </message>
+ <message>
+ <source>&lt;&lt; Tools</source>
+ <translation>&lt;&lt; Strumenti</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Chiudi</translation>
+ </message>
+ <message>
+ <source>Fax</source>
+ <translation>Fax</translation>
+ </message>
+ <message>
+ <source>Printer</source>
+ <translation>Stampante</translation>
+ </message>
+ <message>
+ <source>Type: %1</source>
+ <translation>Tipo: %1</translation>
+ </message>
+ <message>
+ <source>Location: %1</source>
+ <translation>Destinazione: %1</translation>
+ </message>
+ <message>
+ <source>Description/Info: %1</source>
+ <translation>Descrizione/Informazioni: %1</translation>
+ </message>
+ <message>
+ <source>Idle</source>
+ <translation>Inattiva</translation>
+ </message>
+ <message>
+ <source>Processing</source>
+ <translation>In elaborazione</translation>
+ </message>
+ <message>
+ <source>Stopped</source>
+ <translation>Arrestata</translation>
+ </message>
+ <message>
+ <source>Unknown</source>
+ <translation>Ignoto</translation>
+ </message>
+ <message>
+ <source>State: %1</source>
+ <translation>Stato: %1</translation>
+ </message>
+ <message>
+ <source>PPD/Driver: %1</source>
+ <translation>PPD/Driver: %1</translation>
+ </message>
+ <message>
+ <source>CUPS/IPP Printer URI: %1</source>
+ <translation>CUPS/URI della stampante IPP: %1</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollStatusView</name>
+ <message>
+ <source>year</source>
+ <translation>anno</translation>
+ </message>
+ <message>
+ <source>years</source>
+ <translation>anni</translation>
+ </message>
+ <message>
+ <source>month</source>
+ <translation>mese</translation>
+ </message>
+ <message>
+ <source>months</source>
+ <translation>mesi</translation>
+ </message>
+ <message>
+ <source>week</source>
+ <translation>settimana</translation>
+ </message>
+ <message>
+ <source>weeks</source>
+ <translation>settimane</translation>
+ </message>
+ <message>
+ <source>day</source>
+ <translation>giorno</translation>
+ </message>
+ <message>
+ <source>days</source>
+ <translation>giorni</translation>
+ </message>
+ <message>
+ <source>hour</source>
+ <translation>ora</translation>
+ </message>
+ <message>
+ <source>hours</source>
+ <translation>ore</translation>
+ </message>
+ <message>
+ <source>minute</source>
+ <translation>minuto</translation>
+ </message>
+ <message>
+ <source>minutes</source>
+ <translation>minuti</translation>
+ </message>
+ <message>
+ <source>second</source>
+ <translation>secondo</translation>
+ </message>
+ <message>
+ <source>seconds</source>
+ <translation>secondi</translation>
+ </message>
+ <message>
+ <source>one</source>
+ <translation>uno</translation>
+ </message>
+ <message>
+ <source>two</source>
+ <translation>due</translation>
+ </message>
+ <message>
+ <source>three</source>
+ <translation>tre</translation>
+ </message>
+ <message>
+ <source>four</source>
+ <translation>quattro</translation>
+ </message>
+ <message>
+ <source>five</source>
+ <translation>cinque</translation>
+ </message>
+ <message>
+ <source>six</source>
+ <translation>sei</translation>
+ </message>
+ <message>
+ <source>seven</source>
+ <translation>sette</translation>
+ </message>
+ <message>
+ <source>eight</source>
+ <translation>otto</translation>
+ </message>
+ <message>
+ <source>nine</source>
+ <translation>nove</translation>
+ </message>
+ <message>
+ <source>ten</source>
+ <translation>dieci</translation>
+ </message>
+ <message>
+ <source>eleven</source>
+ <translation>undici</translation>
+ </message>
+ <message>
+ <source>twelve</source>
+ <translation>dodici</translation>
+ </message>
+ <message>
+ <source>(most recent)</source>
+ <translation>(più recente)</translation>
+ </message>
+ <message>
+ <source>User:</source>
+ <translation>Utente:</translation>
+ </message>
+ <message>
+ <source>Job ID:</source>
+ <translation>ID lavoro:</translation>
+ </message>
+ <message>
+ <source>n/a</source>
+ <translation>n/d</translation>
+ </message>
+ <message>
+ <source>Code:</source>
+ <translation>Codice:</translation>
+ </message>
+ <message>
+ <source>(about %1 ago)</source>
+ <translation>(circa %1 fa)</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollSuppliesView</name>
+ <message>
+ <source>ERROR: Device not supported.</source>
+ <translation>ERRORE: dispositivo non supportato.</translation>
+ </message>
+ <message>
+ <source>ERROR: Supplies status is not supported on this device.</source>
+ <translation>ERRORE: lo stato forniture non è supportato su questo dispositivo.</translation>
+ </message>
+ <message>
+ <source>ERROR: Device not found. Please check connection and power-on device.</source>
+ <translation>ERRORE: dispositivo non trovato. Verificare la connessione e accendere il dispositivo.</translation>
+ </message>
+ <message>
+ <source>Part No. %1</source>
+ <translation>N. parte %1</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollTestpageView</name>
+ <message>
+ <source>&lt;&lt; Tools</source>
+ <translation>&lt;&lt; Strumenti</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Chiudi</translation>
+ </message>
+ <message>
+ <source>Print Test Page</source>
+ <translation>Stampa pagina di prova</translation>
+ </message>
+ <message>
+ <source>Test Page Type</source>
+ <translation>Tipo pagina di prova</translation>
+ </message>
+ <message>
+ <source>Printer diagnostic page (does not test print driver)</source>
+ <translation>Pagina di diagnostica della stampante (non esegue il test del driver di stampa)</translation>
+ </message>
+ <message>
+ <source>HPLIP test page (tests print driver)</source>
+ <translation>Pagina di prova HPLIP (esegue il test del driver di stampa)</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;A test page should be printing on your printer.&lt;/b&gt;&lt;p&gt;If the page fails to print, please visit http://hplip.sourceforge.net for troubleshooting and support.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Verrà stampata una pagina di prova.&lt;/b&gt;&lt;p&gt;Se la pagina non viene stampata, visitare il sito http://hplip.sourceforge.net per la risoluzione dei problemi e l&apos;assistenza.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Device is busy or in an error state.&lt;/b&gt;&lt;p&gt;Please check device and try again.</source>
+<translation>&lt;b&gt;Il dispositivo è occupato o in stato di errore.&lt;/b&gt;&lt;p&gt;Verificare il dispositivo e riprovare.</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollToolView</name>
+ <message>
+ <source>&lt;b&gt;Device Settings&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Impostazioni dispositivo&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Your device has special device settings. You may alter these settings here.</source>
+ <translation>Il dispositivo ha impostazioni speciali. Modificare qui queste impostazioni.</translation>
+ </message>
+ <message>
+ <source>Device Settings...</source>
+ <translation>Impostazioni dispositivo...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Fax Setup&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Impostazione fax&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Fax support must be setup before you can send faxes.</source>
+ <translation>Per potere inviare fax, è necessario impostare il supporto del fax.</translation>
+ </message>
+ <message>
+ <source>Setup Fax...</source>
+ <translation>Imposta fax...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Fax Address Book&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Rubrica fax&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Setup fax phone numbers to use when sending faxes from the PC.</source>
+ <translation>Impostare i numeri di fax da utilizzare quando si inviano i fax dal PC.</translation>
+ </message>
+ <message>
+ <source>Fax Address Book...</source>
+ <translation>Rubrica fax...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Print Test Page&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Stampa pagina di prova&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Print a test page to test the setup of your printer.</source>
+ <translation>Stampare una pagina di prova per verificare l&apos;impostazione della stampante.</translation>
+ </message>
+ <message>
+ <source>Print Test Page &gt;&gt;</source>
+ <translation>Stampa pagina di prova &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;View Printer (Queue) Information&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Visualizza informazioni (coda) stampante&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>View the printers (queues) installed in CUPS.</source>
+ <translation>Visualizzare le stampanti (code) installate in CUPS.</translation>
+ </message>
+ <message>
+ <source>View Printer Information &gt;&gt;</source>
+ <translation>Visualizza informazioni stampante &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;View Device Information&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Visualizza informazioni dispositivo&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>This information is primarily useful for debugging and troubleshooting (advanced).</source>
+ <translation>Queste informazioni sono utili soprattutto per il debug e la risoluzione dei problemi (avanzata).</translation>
+ </message>
+ <message>
+ <source>View Device Information &gt;&gt;</source>
+ <translation>Visualizza informazioni dispositivo &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Print Quality Diagnostics&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Diagnostica qualità di stampa&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Your printer can print a test page to help diagnose print quality problems.</source>
+ <translation>È possibile stampare una pagina di prova per diagnosticare i problemi relativi alla qualità di stampa.</translation>
+ </message>
+ <message>
+ <source>Print Diagnostic Page...</source>
+ <translation>Stampa pagina di diagnostica...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Download Firmware&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Scarica firmware&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Download firmware to your printer (required on some devices after each power-up).</source>
+ <translation>Scaricare il firmware per la stampante (richiesto dopo ogni accensione per alcuni dispositivi).</translation>
+ </message>
+ <message>
+ <source>Download Firmware...</source>
+ <translation>Scarica firmware...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Clean Cartridges&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Pulisci cartucce&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>You only need to perform this action if you are having problems with poor printout quality due to clogged ink nozzles.</source>
+ <translation>È necessario eseguire questa azione solo in caso di una scarsa qualità di stampa dovuta agli ugelli dell&apos;inchiostro ostruiti.</translation>
+ </message>
+ <message>
+ <source>Clean Cartridges...</source>
+ <translation>Pulisci cartucce...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Align Cartridges&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Allinea cartucce&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>This will improve the quality of output when a new cartridge is installed.</source>
+ <translation>Consente di migliorare la qualità di stampa quando viene installata una nuova cartuccia.</translation>
+ </message>
+ <message>
+ <source>Align Cartridges...</source>
+ <translation>Allinea cartucce...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Perform Color Calibration&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Esegui calibrazione del colore&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Use this procedure to optimimize your printer&apos;s color output.</source>
+ <translation>Utilizzare questa procedura per ottimizzare la stampa a colori.</translation>
+ </message>
+ <message>
+ <source>Color Calibration...</source>
+ <translation>Calibrazione del colore...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Perform Line Feed Calibration&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Esegui calibrazione dell&apos;avanzamento riga&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Use line feed calibration to optimize print quality (to remove gaps in the printed output).</source>
+ <translation>Utilizzare la calibrazione dell&apos;avanzamento riga per ottimizzare la qualità di stampa (per rimuovere gli spazi nella stampa).</translation>
+ </message>
+ <message>
+ <source>Line Feed Calibration...</source>
+ <translation>Calibrazione dell&apos;avanzamento riga...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Access Embedded Web Page&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Accedi alla pagina Web incorporata&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>You can use your printer&apos;s embedded web server to configure, maintain, and monitor the device from a web browser.</source>
+ <translation>È possibile utilizzare il server Web incorporato della stampante per configurare, gestire e monitorare il dispositivo da un browser Web.</translation>
+ </message>
+ <message>
+ <source>Open in Browser...</source>
+ <translation>Apri nel browser...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;View Documentation&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Visualizza documentazione&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>View documentation installed on your system.</source>
+ <translation>Visualizzare la documentazione installata nel sistema.</translation>
+ </message>
+ <message>
+ <source>View Documentation...</source>
+ <translation>Visualizza documentazione...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;An error occured downloading firmware file.&lt;/b&gt;&lt;p&gt;Please check your printer and try again.</source>
+ <translation>&lt;b&gt;Si è verificato un errore durante lo scaricamento del file del firmware.&lt;/b&gt;&lt;p&gt;Verificare la stampante e riprovare.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Device is busy or in an error state.&lt;/b&gt;&lt;p&gt;Please check device and try again.</source>
+ <translation>&lt;b&gt;Il dispositivo è occupato o in stato di errore.&lt;/b&gt;&lt;p&gt;Verificare il dispositivo e riprovare.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Both cartridges are required for alignment.&lt;/b&gt;&lt;p&gt;Please install both cartridges and try again.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Entrambe le cartucce sono necessarie per l&apos;allineamento.&lt;/b&gt;&lt;p&gt;Installare entrambe le cartucce e riprovare.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;One or more cartiridges are missing from the printer.&lt;/b&gt;&lt;p&gt;Please install cartridge(s) and try again.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Nella stampante mancano una o più cartucce.&lt;/b&gt;&lt;p&gt;Installare le cartucce e riprovare.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Both the photo and color cartridges must be inserted into the printer to perform color calibration.&lt;/b&gt;&lt;p&gt;If you are planning on printing with the photo cartridge, please insert it and try again.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Per eseguire la calibrazione del colore, è necessario installare le cartucce di stampa a colori e fotografica.&lt;/b&gt;&lt;p&gt;Se si intende stampare con la cartuccia fotografica, inserire tale cartuccia e riprovare.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Both the photo (regular photo or photo blue) and color cartridges must be inserted into the printer to perform color calibration.&lt;/b&gt;&lt;p&gt;If you are planning on printing with the photo or photo blue cartridge, please insert it and try again.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Per eseguire la calibrazione del colore, è necessario installare le cartucce di stampa a colori e fotografica (regolare o in blu).&lt;/b&gt;&lt;p&gt;Se si intende stampare con la cartuccia fotografica o la cartuccia fotografica in blu, inserire tale cartuccia e riprovare.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Cannot align with only the photo cartridge installed.&lt;/b&gt;&lt;p&gt;Please install other cartridges and try again.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Non è possibile eseguire l&apos;allineamento solo con la cartuccia fotografica installata.&lt;/b&gt;&lt;p&gt;Installare le altre cartucce e riprovare.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Operation failed. Device busy.&lt;/b&gt;</source>
+ <translation>&lt;p&gt;&lt;b&gt;Operazione non riuscita. Dispositivo occupato.&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Unable to run command. No command specified.&lt;/b&gt;&lt;p&gt;Use &lt;pre&gt;Configure...&lt;/pre&gt; to specify a command to run.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Impossibile eseguire il comando. Nessun comando specificato.&lt;/b&gt;&lt;p&gt;Utilizzare &lt;pre&gt;Configura...&lt;/pre&gt; per specificare un comando da eseguire.</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollUnloadView</name>
+ <message>
+ <source>ERROR: Photo Card Failed to Mount Properly. Please check device and card and try again.</source>
+ <translation>ERRORE: montaggio della scheda fotografica non riuscito. Verificare il dispositivo e la scheda e riprovare.</translation>
+ </message>
+ <message>
+ <source>Select File(s) to Unload from Photo Card</source>
+ <translation>Seleziona file da scaricare dalla scheda fotografica</translation>
+ </message>
+ <message>
+ <source>Unload Folder</source>
+ <translation>Cartella di scaricamento</translation>
+ </message>
+ <message>
+ <source>Unload Options</source>
+ <translation>Opzioni di scaricamento</translation>
+ </message>
+ <message>
+ <source>&lt;&lt; Functions</source>
+ <translation>&lt;&lt; Funzioni</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Chiudi</translation>
+ </message>
+ <message>
+ <source>Unload File(s)</source>
+ <translation>Scarica file</translation>
+ </message>
+ <message>
+ <source>Select All</source>
+ <translation>Seleziona tutto</translation>
+ </message>
+ <message>
+ <source>Select None</source>
+ <translation>Deseleziona tutto</translation>
+ </message>
+ <message>
+ <source>Show Thumbnails</source>
+ <translation>Mostra miniature</translation>
+ </message>
+ <message>
+ <source>No files selected</source>
+ <translation>Nessun file selezionato</translation>
+ </message>
+ <message>
+ <source>1 file selected, %1</source>
+ <translation>1 file selezionato, %1</translation>
+ </message>
+ <message>
+ <source>%1 files selected, %2</source>
+ <translation>%1 file selezionati, %2</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;No thumbnail found in image.&lt;/b&gt;</source>
+ <translation>&lt;p&gt;&lt;b&gt;Nessuna miniatura per l'immagine.&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Loading...</source>
+ <translation>Caricamento...</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Annulla</translation>
+ </message>
+ <message>
+ <source>HP Device Manager</source>
+ <translation>HP Device Manager</translation>
+ </message>
+ <message>
+ <source>Browse...</source>
+ <translation>Sfoglia...</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;The unload directory path you entered is not valid.&lt;/b&gt;&lt;p&gt;The directory must exist and you must have write permissions.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Il percorso di scaricamento immesso non è valido.&lt;/b&gt;&lt;p&gt;La directory deve esistere ed occorre possedere i permessi di scrittura.</translation>
+ </message>
+ <message>
+ <source>File removal:</source>
+ <translation>Rimozione file:</translation>
+ </message>
+ <message>
+ <source>Leave unloaded files on photo card</source>
+ <translation>Lascia i file non scaricati nella scheda fotografica</translation>
+ </message>
+ <message>
+ <source>Remove all unloaded files from photo card</source>
+ <translation>Rimuovi tutti i file non scaricati dalla scheda fotografica</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;The unload directory path is not valid.&lt;/b&gt;&lt;p&gt;Please enter a new path and try again.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Il percorso di scaricamento non è valido.&lt;/b&gt;&lt;p&gt;Immettere un nuovo percorso e riprovare.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;No files are selected to unload.&lt;/b&gt;&lt;p&gt;Please select one or more files to unload and try again.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Nessun file selezionato per lo scaricamento.&lt;/b&gt;&lt;p&gt;Selezionare uno o più file da scaricare e riprovare.</translation>
+ </message>
+ <message>
+ <source>Unloading card...</source>
+ <translation>Scaricamento scheda...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Unload cancelled at user request.&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Scaricamento annullato su richiesta dell'utente.&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>ERROR: Photo Card Failed to Mount Properly. Please check device and card and try again.</source>
+<translation>ERRORE: montaggio della scheda fotografica non riuscito. Verificare il dispositivo e la scheda e riprovare.</translation>
+ </message>
+ <message>
+ <source>Select File(s) to Unload from Photo Card</source>
+<translation>Seleziona file da scaricare dalla scheda fotografica</translation>
+ </message>
+ <message>
+ <source>Unload Folder</source>
+<translation>Cartella di scaricamento</translation>
+ </message>
+ <message>
+ <source>Unload Options</source>
+<translation>Opzioni di scaricamento</translation>
+ </message>
+ <message>
+ <source>&lt;&lt; Functions</source>
+<translation>&lt;&lt; Functions</translation>
+ </message>
+ <message>
+ <source>Close</source>
+<translation>Close</translation>
+ </message>
+ <message>
+ <source>Unload File(s)</source>
+<translation>Scarica file</translation>
+ </message>
+ <message>
+ <source>Select All</source>
+<translation>Seleziona tutto</translation>
+ </message>
+ <message>
+ <source>Select None</source>
+<translation>Deseleziona tutto</translation>
+ </message>
+ <message>
+ <source>Show Thumbnails</source>
+<translation>Mostra miniature</translation>
+ </message>
+ <message>
+ <source>No files selected</source>
+<translation>Nessun file selezionato</translation>
+ </message>
+ <message>
+ <source>1 file selected, %1</source>
+<translation>1 file selezionato, %1</translation>
+ </message>
+ <message>
+ <source>%1 files selected, %2</source>
+<translation>%1 file selezionati, %2</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;No thumbnail found in image.&lt;/b&gt;</source>
+<translation>&lt;p&gt;&lt;b&gt;Nessuna miniatura per l'immagine.&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Loading...</source>
+<translation>Caricamento...</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+<translation>Annulla</translation>
+ </message>
+ <message>
+ <source>HP Device Manager</source>
+<translation>HP Device Manager</translation>
+ </message>
+ <message>
+ <source>Browse...</source>
+<translation>Sfoglia...</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;The unload directory path you entered is not valid.&lt;/b&gt;&lt;p&gt;The directory must exist and you must have write permissions.</source>
+<translation>&lt;p&gt;&lt;b&gt;Il percorso di scaricamento immesso non è valido.&lt;/b&gt;&lt;p&gt;La directory deve esistere ed occorre possedere i permessi di scrittura.</translation>
+ </message>
+ <message>
+ <source>File removal:</source>
+<translation>Rimozione file:</translation>
+ </message>
+ <message>
+ <source>Leave unloaded files on photo card</source>
+<translation>Lascia i file non scaricati nella scheda fotografica</translation>
+ </message>
+ <message>
+ <source>Remove all unloaded files from photo card</source>
+<translation>Rimuovi tutti i file non scaricati dalla scheda fotografica</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;The unload directory path is not valid.&lt;/b&gt;&lt;p&gt;Please enter a new path and try again.</source>
+<translation>&lt;p&gt;&lt;b&gt;Il percorso di scaricamento non è valido.&lt;/b&gt;&lt;p&gt;Immettere un nuovo percorso e riprovare.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;No files are selected to unload.&lt;/b&gt;&lt;p&gt;Please select one or more files to unload and try again.</source>
+<translation>&lt;p&gt;&lt;b&gt;Nessun file selezionato per lo scaricamento.&lt;/b&gt;&lt;p&gt;Selezionare uno o più file da scaricare e riprovare.</translation>
+ </message>
+ <message>
+ <source>Unloading card...</source>
+<translation>Scaricamento scheda...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Unload cancelled at user request.&lt;/b&gt;</source>
+<translation>&lt;b&gt;Scaricamento annullato su richiesta dell'utente.&lt;/b&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollView</name>
+ <message>
+ <source>ERROR: No device found or unsupported device.</source>
+ <translation>ERRORE: nessun dispositivo trovato o dispositivo non supportato.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;%1 (read only)&lt;/b&gt;</source>
+ <translation>&lt;b&gt;%1 (sola lettura)&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Printer/Fax</source>
+ <translation>Stampante/Fax</translation>
+ </message>
+ <message>
+ <source>Printer/Fax Name:</source>
+ <translation>Nome stampante/fax:</translation>
+ </message>
+ <message>
+ <source>Printer</source>
+ <translation>Stampante</translation>
+ </message>
+ <message>
+ <source>Printer Name:</source>
+ <translation>Nome della stampante:</translation>
+ </message>
+ <message>
+ <source>Fax</source>
+ <translation>Fax</translation>
+ </message>
+ <message>
+ <source>Fax Name:</source>
+ <translation>Nome del fax:</translation>
+ </message>
+ <message>
+ <source>Load Paper</source>
+ <translation>Carica carta</translation>
+ </message>
+ <message>
+ <source>A page will be printed. Please load &lt;b&gt;plain paper&lt;/b&gt; into the printer.</source>
+ <translation>Verrà stampata una pagina. Caricare &lt;b&gt;carta comune&lt;/b&gt; nella stampante.</translation>
+ </message>
+</context>
+<context>
+ <name>SettingsDialog</name>
+ <message>
+ <source>&lt;b&gt;One or more email addresses are missing.&lt;/b&gt;&lt;p&gt;Please enter this information and try again.</source>
+ <translation>&lt;b&gt;Mancano uno o più indirizzi e-mail.&lt;/b&gt;&lt;p&gt;Immettere tali informazioni e riprovare.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Please check your email for a test message.&lt;/b&gt;&lt;p&gt;If the message doesn&apos;t arrive, please check your settings and try again.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Controllare la presenza di un messaggio di prova.&lt;/b&gt;&lt;p&gt;Se non si riceve il messaggio, verificare le impostazioni e riprovare.</translation>
+ </message>
+</context>
+<context>
+ <name>SettingsDialog_base</name>
+ <message>
+ <source>HP Device Manager - Settings</source>
+ <translation>HP Device Manager - Impostazioni</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Annulla</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Configure if and when device(s) are automatically refreshed&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Configura se e quando i dispositivi vengono automaticamente aggiornati&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Enable device auto refresh</source>
+ <translation>Abilita aggiornamento automatico del dispositivo</translation>
+ </message>
+ <message>
+ <source>Auto Interval</source>
+ <translation>Intervallo automatico</translation>
+ </message>
+ <message>
+ <source>Refresh every:</source>
+ <translation>Aggiorna ogni:</translation>
+ </message>
+ <message>
+ <source>seconds</source>
+ <translation>secondi</translation>
+ </message>
+ <message>
+ <source>Device(s) to Refresh </source>
+ <translation>Dispositivi da aggiornare</translation>
+ </message>
+ <message>
+ <source>Only currently selected device</source>
+ <translation>Solo il dispositivo attualmente selezionato</translation>
+ </message>
+ <message>
+ <source>All devices</source>
+ <translation>Tutti i dispositivi</translation>
+ </message>
+ <message>
+ <source>Auto Refresh</source>
+ <translation>Aggiornamento automatico</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Configure if the HP Device Manager will send email on alerts&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Configura l&apos;invio di un&apos;e-mail da parte di HP Device Manager in caso di avvisi&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Send email when device errors occur:</source>
+ <translation>Invia e-mail quando si verificano errori nel dispositivo:</translation>
+ </message>
+ <message>
+ <source>Test</source>
+ <translation>Prova</translation>
+ </message>
+ <message>
+ <source>To: Address(es)</source>
+ <translation>A: Indirizzi</translation>
+ </message>
+ <message>
+ <source>Email address(es):</source>
+ <translation>Indirizzi e-mail:</translation>
+ </message>
+ <message>
+ <source>&lt;i&gt;Note: Separate multiple email address with a commas.&lt;/i&gt;</source>
+ <translation>&lt;i&gt;Nota: separare più indirizzi e-mail con una virgola.&lt;/i&gt;</translation>
+ </message>
+ <message>
+ <source>From: Address</source>
+ <translation>Da: Indirizzo</translation>
+ </message>
+ <message>
+ <source>Sender email address:</source>
+ <translation>Indirizzo e-mail del mittente:</translation>
+ </message>
+ <message>
+ <source>&lt;i&gt;Note: This should generally be your email address.&lt;/i&gt;</source>
+ <translation>&lt;i&gt;Nota: generalmente è l&apos;indirizzo e-mail dell&apos;utente.&lt;/i&gt;</translation>
+ </message>
+ <message>
+ <source>Email Alerts</source>
+ <translation>Avvisi tramite e-mail</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Configure what commands to run for device functions&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Configura i comandi da eseguire per le funzioni del dispositivo&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Access Photo Cards</source>
+ <translation>Accedi alle schede fotografiche</translation>
+ </message>
+ <message>
+ <source>Built-in access photo cards function</source>
+ <translation>Funzione incorporata per l&apos;accesso alle schede fotografiche</translation>
+ </message>
+ <message>
+ <source>External command:</source>
+ <translation>Comando esterno:</translation>
+ </message>
+ <message>
+ <source>Send PC Fax</source>
+ <translation>Invia fax da PC</translation>
+ </message>
+ <message>
+ <source>Built-in send PC fax function</source>
+ <translation>Funzione incorporata per l&apos;invio di fax dal PC</translation>
+ </message>
+ <message>
+ <source>Scan</source>
+ <translation>Scansione</translation>
+ </message>
+ <message>
+ <source>Built-in scan function</source>
+ <translation>Funzione di scansione incorporata</translation>
+ </message>
+ <message>
+ <source>External scan command:</source>
+ <translation>Comando di scansione esterno:</translation>
+ </message>
+ <message>
+ <source>Print</source>
+ <translation>Stampa</translation>
+ </message>
+ <message>
+ <source>Built-in print function</source>
+ <translation>Funzione di stampa incorporata</translation>
+ </message>
+ <message>
+ <source>Set Defaults</source>
+ <translation>Imposta valori predefiniti</translation>
+ </message>
+ <message>
+ <source>Make Copies</source>
+ <translation>Crea copie</translation>
+ </message>
+ <message>
+ <source>Built-in make copies function</source>
+ <translation>Funzione incorporata per la creazione di copie</translation>
+ </message>
+ <message>
+ <source>Functions (Advanced)</source>
+ <translation>Funzioni (avanzate)</translation>
+ </message>
+</context>
+<context>
+ <name>SetupForm</name>
+ <message>
+ <source>Current: Filter: &quot;%2&quot; Search: &quot;%3&quot; TTL: %4 Timeout: %5s</source>
+ <translation>Corrente: Filtro: &quot;%2&quot; Ricerca: &quot;%3&quot; TTL: %4 Timeout: %5s</translation>
+ </message>
+ <message>
+ <source>The printer name and fax name must be different. Please choose different names.</source>
+<translation>Il nome della stampante e quello del fax devono essere diversi. Scegliere nomi diversi.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Device not found.&lt;/b&gt; &lt;p&gt;Please make sure your printer is properly connected and powered-on.</source>
+<translation>&lt;b&gt;Nessun dispositivo trovato.&lt;/b&gt; &lt;p&gt;Verificare che la stampante sia correttamente collegata e accesa.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;No devices found.&lt;/b&gt;&lt;p&gt;Please make sure your printer is properly connected and powered-on.</source>
+ <translation>&lt;b&gt;Nessun dispositivo trovato.&lt;/b&gt;&lt;p&gt;Verificare che la stampante sia correttamente collegata e accesa.</translation>
+ </message>
+ <message>
+ <source>Current Settings: Filter: &quot;%2&quot; Search: &quot;%3&quot; TTL: %4 Timeout: %5s</source>
+ <translation>Impostazioni correnti: Filtro: &quot;%2&quot; Ricerca: &quot;%3&quot; TTL: %4 Timeout: %5s</translation>
+ </message>
+ <message>
+ <source>network</source>
+ <translation>rete</translation>
+ </message>
+ <message>
+ <source>USB bus</source>
+ <translation>bus USB</translation>
+ </message>
+ <message>
+ <source>parallel port</source>
+ <translation>porta parallela</translation>
+ </message>
+ <message>
+ <source>Model</source>
+ <translation>Modello</translation>
+ </message>
+ <message>
+ <source>Serial No.</source>
+ <translation>N. di serie</translation>
+ </message>
+ <message>
+ <source>IP Address</source>
+ <translation>Indirizzo IP</translation>
+ </message>
+ <message>
+ <source>Host Name</source>
+ <translation>Nome host</translation>
+ </message>
+ <message>
+ <source>Device</source>
+ <translation>Dispositivo</translation>
+ </message>
+ <message>
+ <source>Device URI</source>
+ <translation>URI dispositivo</translation>
+ </message>
+ <message>
+ <source>%1 device(s) found on the %1:</source>
+ <translation>%1 dispositivi trovati in %1:</translation>
+ </message>
+ <message>
+ <source>%1 device(s) found on the %1 at address %2:</source>
+ <translation>%1 dispositivi trovati in %1 all&apos;indirizzo %2:</translation>
+ </message>
+ <message>
+ <source>%1 device(s) found on the %1 at ID %2:</source>
+ <translation>%1 dispositivi trovati in %1 all&apos;ID %2:</translation>
+ </message>
+ <message>
+ <source>%1 device(s) found on the %1 device node ID %2:</source>
+ <translation>%1 dispositivi trovati in %1 con ID nodo dispositivo %2:</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Device not found or invalid HPLIP device.&lt;/b&gt;&lt;p&gt;If you specified a USB ID, IP address, or other parameter, please re-check it and try again.</source>
+ <translation>&lt;b&gt;Dispositivo non trovato o dispositivo HPLIP non valido.&lt;/b&gt;&lt;p&gt;Se sono stati specificati un ID USB, un indirizzo IP o un altro parametro, verificarne le impostazioni e riprovare.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;PPD not file found.&lt;/b&gt;&lt;p&gt;An appropriate PPD file could not be found. Please check your HPLIP install, use &lt;i&gt;Select Other...&lt;/i&gt;, or download one from linuxprinting.org.</source>
+ <translation>&lt;b&gt;File PPD non trovato.&lt;/b&gt;&lt;p&gt;Non è stato possibile trovare un file PPD appropriato. Verificare l&apos;installazione di HPLIP, utilizzare &lt;i&gt;Seleziona altro...&lt;/i&gt; o scaricarne uno da linuxprinting.org.</translation>
+ </message>
+ <message>
+ <source>You must enter a name for the printer.</source>
+ <translation>Immettere un nome per la stampante.</translation>
+ </message>
+ <message>
+ <source>A printer already exists with this name. Please choose a different name.</source>
+ <translation>Una stampante con questo nome già esiste. Scegliere un altro nome.</translation>
+ </message>
+ <message>
+ <source>You must enter a fax name.</source>
+ <translation>Immettere un nome per il fax.</translation>
+ </message>
+ <message>
+ <source>A fax already exists with this name. Please choose a different name.</source>
+ <translation>Un fax con questo nome già esiste. Scegliere un altro nome.</translation>
+ </message>
+ <message>
+ <source>Unable to communicate with the device. Please check the device and try again.</source>
+ <translation>Impossibile comunicare con il dispositivo. Verificare il dispositivo e riprovare.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Device I/O Error&lt;/b&gt;&lt;p&gt;Could not communicate with device. Device may be busy.</source>
+ <translation>&lt;b&gt;Errore I/O del dispositivo&lt;/b&gt;&lt;p&gt;Impossibile comunicare con il dispositivo. Il dispositivo potrebbe essere occupato.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Printer queue setup failed.&lt;/b&gt;&lt;p&gt;Please restart CUPS and try again.</source>
+ <translation>&lt;b&gt;Impostazione della coda della stampante non riuscita.&lt;/b&gt;&lt;p&gt;Riavviare CUPS e riprovare.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Unable to find HP fax PPD file.&lt;/b&gt;&lt;p&gt;Please check you HPLIP installation and try again.</source>
+ <translation>&lt;b&gt;Impossibile trovare un file PPD per il fax HP.&lt;/b&gt;&lt;p&gt;Verificare l&apos;installazione di HPLIP e riprovare.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Fax queue setup failed.&lt;/b&gt;&lt;p&gt;Please restart CUPS and try again.</source>
+ <translation>&lt;b&gt;Impostazione della coda del fax non riuscita.&lt;/b&gt;&lt;p&gt;Riavviare CUPS e riprovare.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Unable to print to printer.&lt;/b&gt;&lt;p&gt;Please check device and try again.</source>
+ <translation>&lt;b&gt;Impossibile stampare.&lt;/b&gt;&lt;p&gt;Verificare il dispositivo e riprovare.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;No CUPS queue found for device.&lt;/b&gt;&lt;p&gt;Please install the printer in CUPS and try again.</source>
+ <translation>&lt;b&gt;Nessuna coda CUPS trovata per il dispositivo.&lt;/b&gt;&lt;p&gt;Installare la stampante in CUPS e riprovare.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Printer Error.&lt;/b&gt;&lt;p&gt;Printer is busy, offline, or in an error state. Please check the device and try again.</source>
+ <translation>&lt;b&gt;Errore della stampante.&lt;/b&gt;&lt;p&gt;La stampante è occupata, non è in linea o è in stato di errore. Verificare il dispositivo e riprovare.</translation>
+ </message>
+</context>
+<context>
+ <name>SetupForm_base</name>
+ <message>
+ <source>PPD File</source>
+ <translation>File PPD</translation>
+ </message>
+ <message>
+ <source>Description</source>
+ <translation>Descrizione</translation>
+ </message>
+ <message>
+ <source>HP Device Manger - Printer Setup Wizard</source>
+ <translation>HP Device Manager - Impostazione guidata della stampante</translation>
+ </message>
+ <message>
+ <source>Connection (I/O) Type</source>
+ <translation>Tipo di connessione (I/O)</translation>
+ </message>
+ <message>
+ <source>Universal Serial Bus (USB)</source>
+ <translation>USB (Universal Serial Bus)</translation>
+ </message>
+ <message>
+ <source>Network/Ethernet/Wireless (direct connection or JetDirect)</source>
+ <translation>Rete/Ethernet/Wireless (connessione diretta o JetDirect)</translation>
+ </message>
+ <message>
+ <source>Parallel Port (LPT)</source>
+ <translation>Porta parallela (LPT)</translation>
+ </message>
+ <message>
+ <source>Advanced...</source>
+ <translation>Avanzato...</translation>
+ </message>
+ <message>
+ <source>Choose Connection Type</source>
+ <translation>Scegli tipo di connessione</translation>
+ </message>
+ <message>
+ <source>probeHeadingTextLabel</source>
+ <translation>probeHeadingTextLabel</translation>
+ </message>
+ <message>
+ <source>Find Manually...</source>
+ <translation>Trova manualmente...</translation>
+ </message>
+ <message>
+ <source>Refresh</source>
+ <translation>Aggiorna</translation>
+ </message>
+ <message>
+ <source>Select from Discovered Devices</source>
+ <translation>Seleziona da dispositivi rilevati</translation>
+ </message>
+ <message>
+ <source>Select Other...</source>
+ <translation>Seleziona altro…</translation>
+ </message>
+ <message>
+ <source>Defaults</source>
+ <translation>Valori predefiniti</translation>
+ </message>
+ <message>
+ <source>Please chose the PPD file (by name and description) that most closely matches your printer. &lt;i&gt;Note: The model name of the printer may vary somehwat from the PPD file name, for example, a Deskjet 5550 may have a PPD file with the model name of Deskjet_5500_series.&lt;/i&gt;</source>
+ <translation>Scegliere il file PPD (in base al nome e alla descrizione) che meglio corrisponde alla stampante. &lt;i&gt;Nota: il nome del modello della stampante può variare leggermente dal nome del file PPD, ad esempio Deskjet 5550 può avere un file PPD con il nome del modello di Deskjet_5500_series.&lt;/i&gt;</translation>
+ </message>
+ <message>
+ <source>Select/Confirm PPD File</source>
+ <translation>Seleziona/Conferma file PPD</translation>
+ </message>
+ <message>
+ <source>Printer Information</source>
+ <translation>Informaz. stampante</translation>
+ </message>
+ <message>
+ <source>Default</source>
+ <translation>Valore predefinito</translation>
+ </message>
+ <message>
+ <source>Location:</source>
+ <translation>Destinazione:</translation>
+ </message>
+ <message>
+ <source>Printer Name:</source>
+ <translation>Nome della stampante:</translation>
+ </message>
+ <message>
+ <source>Description:</source>
+ <translation>Descrizione:</translation>
+ </message>
+ <message>
+ <source>Fax Information</source>
+ <translation>Informazioni fax</translation>
+ </message>
+ <message>
+ <source>Fax Name:</source>
+ <translation>Nome del fax:</translation>
+ </message>
+ <message>
+ <source>Name/Company:</source>
+ <translation>Nome/Società:</translation>
+ </message>
+ <message>
+ <source>Fax Number:</source>
+ <translation>Numero fax:</translation>
+ </message>
+ <message>
+ <source>Setup PC send fax</source>
+ <translation>Imposta invio fax da PC</translation>
+ </message>
+ <message>
+ <source>Click &quot;Next &gt;&quot; to install the printer on your system.</source>
+ <translation>Fare clic su &quot;Avanti &gt;&quot; per installare la stampante nel sistema.</translation>
+ </message>
+ <message>
+ <source>Enter Printer Information</source>
+ <translation>Immetti informazioni stampante</translation>
+ </message>
+ <message>
+ <source>Send test page to printer</source>
+ <translation>Invia pagina di prova alla stampante</translation>
+ </message>
+ <message>
+ <source>Fax Summary</source>
+ <translation>Riepilogo fax</translation>
+ </message>
+ <message>
+ <source>Printer Summary</source>
+ <translation>Riepilogo stampante</translation>
+ </message>
+ <message>
+ <source>PPD File:</source>
+ <translation>File PPD:</translation>
+ </message>
+ <message>
+ <source>The printer has been successfully installed on your system.</source>
+ <translation>La stampante è stata installata correttamente nel sistema.</translation>
+ </message>
+ <message>
+ <source>Finished Adding Printer</source>
+ <translation>Aggiunta stampante completata</translation>
+ </message>
+</context>
+<context>
+ <name>SetupManualFind</name>
+ <message>
+ <source>Please enter the printer&apos;s network hostname or IP address.</source>
+ <translation>Immettere l&apos;indirizzo IP o il nome host di rete della stampante.</translation>
+ </message>
+ <message>
+ <source>&lt;i&gt;(IPv4 address &quot;a.b.c.d&quot; or &quot;hostname&quot;.)&lt;/i&gt;</source>
+ <translation>&lt;i&gt;(indirizzo IPv4 &quot;a.b.c.d&quot; o &quot;nomehost&quot;.)&lt;/i&gt;</translation>
+ </message>
+ <message>
+ <source>Hostname or IP Address:</source>
+ <translation>Nome host o indirizzo IP:</translation>
+ </message>
+ <message>
+ <source>Please enter the USB ID for the printer.</source>
+ <translation>Immettere l&apos;ID USB per la stampante.</translation>
+ </message>
+ <message>
+ <source>&lt;i&gt;(&quot;xxx:yyy&quot; where xxx is the USB bus ID and yyy is the USB device ID. The &apos;:&apos; and all leading zeroes must be present. Use &apos;lsusb&apos; to determine this information.)&lt;/i&gt;</source>
+ <translation>&lt;i&gt;(&quot;xxx:yyy&quot; dove xxx è l&apos;ID bus USB e yyy è l&apos;ID dispositivo USB. I &apos;:&apos; e tutti gli zero iniziali devono essere presenti. Utilizzare &apos;lsusb&apos; per determinare tali informazioni).&lt;/i&gt;</translation>
+ </message>
+ <message>
+ <source>USB ID:</source>
+ <translation>ID USB:</translation>
+ </message>
+ <message>
+ <source>Please enter the filesystem device node for the printer.</source>
+ <translation>Immettere il nodo del dispositivo per il file system della stampante.</translation>
+ </message>
+ <message>
+ <source> &lt;i&gt;(&quot;/dev/parportX&quot;, X=0,1,2,...)&lt;/i&gt;</source>
+ <translation>&lt;i&gt;(&quot;/dev/parportX&quot;, X=0,1,2,...)&lt;/i&gt;</translation>
+ </message>
+ <message>
+ <source>Device Node:</source>
+ <translation>Nodo dispositivo:</translation>
+ </message>
+</context>
+<context>
+ <name>SetupManualFind_base</name>
+ <message>
+ <source>HP Device Manager - Manually Find Device</source>
+ <translation>HP Device Manager - Trova dispositivo manualmente</translation>
+ </message>
+ <message>
+ <source>TEXT</source>
+ <translation>TESTO</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Annulla</translation>
+ </message>
+ <message>
+ <source>Find</source>
+ <translation>Trova</translation>
+ </message>
+ <message>
+ <source>textLabel1</source>
+ <translation>textLabel1</translation>
+ </message>
+ <message>
+ <source>IP/HN/SER/USB/DEV:</source>
+ <translation>IP/HN/SER/USB/DEV:</translation>
+ </message>
+</context>
+<context>
+ <name>SetupSettings_base</name>
+ <message>
+ <source>HP Device Manager - Setup Filters, Search and Settings</source>
+ <translation>HP Device Manager - Imposta filtri, ricerca e impostazioni</translation>
+ </message>
+ <message>
+ <source>Discovery Filter</source>
+ <translation>Filtro di ricerca</translation>
+ </message>
+ <message>
+ <source>Discover all devices</source>
+ <translation>Rileva tutti i dispositivi</translation>
+ </message>
+ <message>
+ <source>Only discover devices that support the following functionality:</source>
+ <translation>Rileva solo i dispositivi che supportano la seguente funzionalità:</translation>
+ </message>
+ <message>
+ <source>PC Initiated Copying</source>
+ <translation>Copia avviata da PC</translation>
+ </message>
+ <message>
+ <source>PC Photocard Access</source>
+ <translation>Accesso scheda fotografica da PC</translation>
+ </message>
+ <message>
+ <source>Scan to PC</source>
+ <translation>Scansione su PC</translation>
+ </message>
+ <message>
+ <source>PC Send Fax</source>
+ <translation>Invio fax da PC</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Annulla</translation>
+ </message>
+ <message>
+ <source>Defaults</source>
+ <translation>Valori predefiniti</translation>
+ </message>
+ <message>
+ <source>Discovery Search</source>
+ <translation>Ricerca</translation>
+ </message>
+ <message>
+ <source>Search Term:</source>
+ <translation>Ricerca termine:</translation>
+ </message>
+ <message>
+ <source>Network Discovery Settings</source>
+ <translation>Impostazioni individuazione rete</translation>
+ </message>
+ <message>
+ <source>TTL:</source>
+ <translation>TTL:</translation>
+ </message>
+ <message>
+ <source>Timeout (secs):</source>
+ <translation>Timeout (sec):</translation>
+ </message>
+</context>
+<context>
+ <name>StringTable</name>
+ <message>
+ <source>Unknown</source>
+<translation>Sconosciuto</translation>
+ </message>
+ <message>
+ <source>Please correct the problem and try again.</source>
+<translation>Risolvere il problema e riprovare.</translation>
+ </message>
+ <message>
+ <source>Please correct the problem and press continue on the printer.</source>
+<translation>Risolvere il problema e premere Continua sulla stampante.</translation>
+ </message>
+ <message>
+ <source>The printer has started a print job.</source>
+<translation>La stampante ha avviato un lavoro di stampa.</translation>
+ </message>
+ <message>
+ <source>Print job has completed.</source>
+<translation>Lavoro di stampa completato.</translation>
+ </message>
+ <message>
+ <source>Started rendering a fax job.</source>
+<translation>Avviato il rendering di un fax.</translation>
+ </message>
+ <message>
+ <source>Rendering job completed.</source>
+<translation>Rendering completato.</translation>
+ </message>
+ <message>
+ <source>The printer is idle.</source>
+<translation>La stampante è inattiva.</translation>
+ </message>
+ <message>
+ <source>The printer is busy.</source>
+<translation>La stampante è occupata.</translation>
+ </message>
+ <message>
+ <source>The print job is continuing.</source>
+<translation>Lavoro di stampa in proseguimento.</translation>
+ </message>
+ <message>
+ <source>Turning off.</source>
+<translation>In spegnimento.</translation>
+ </message>
+ <message>
+ <source>Report printing.</source>
+<translation>Stampa rapporto.</translation>
+ </message>
+ <message>
+ <source>Canceling.</source>
+<translation>Annullamento in corso.</translation>
+ </message>
+ <message>
+ <source>Waiting for ink to dry.</source>
+<translation>In attesa dell'asciugatura.</translation>
+ </message>
+ <message>
+ <source>Pen change.</source>
+<translation>Modifica penna.</translation>
+ </message>
+ <message>
+ <source>The printer is out of paper.</source>
+<translation>La stampante ha esaurito la carta.</translation>
+ </message>
+ <message>
+ <source>Please load more paper and follow the instructions on the front panel (if any) to continue printing.</source>
+<translation>Caricare altra carta e seguire le istruzioni sul pannello anteriore (se presenti) per continuare a stampare.</translation>
+ </message>
+ <message>
+ <source>Banner eject needed.</source>
+<translation>Espellere la carta a modulo continuo.</translation>
+ </message>
+ <message>
+ <source>Banner mismatch.</source>
+<translation>Carta a modulo continuo non omogenea.</translation>
+ </message>
+ <message>
+ <source>Photo mismatch.</source>
+<translation>Carta fotografica non omogenea.</translation>
+ </message>
+ <message>
+ <source>Duplex mismatch.</source>
+<translation>Stampa fronte/retro non omogenea.</translation>
+ </message>
+ <message>
+ <source>Paper or cartridge carriage jammed.</source>
+<translation>Inceppamento carta o carrello cartuccia.</translation>
+ </message>
+ <message>
+ <source>Please clear the jam and press continue on the printer.</source>
+<translation>Risolvere l'inceppamento e premere Continua sulla stampante.</translation>
+ </message>
+ <message>
+ <source>There is a problem with a cartridge.</source>
+<translation>Si è verificato un problema con una cartuccia.</translation>
+ </message>
+ <message>
+ <source>Powering down.</source>
+<translation>Spegnimento in corso.</translation>
+ </message>
+ <message>
+ <source>Front panel test.</source>
+<translation>Test pannello anteriore.</translation>
+ </message>
+ <message>
+ <source>Clean out tray missing.</source>
+<translation>Vassoio per la pulizia mancante.</translation>
+ </message>
+ <message>
+ <source>Output bin full.</source>
+<translation>Raccoglitore pieno.</translation>
+ </message>
+ <message>
+ <source>Media size mismatch.</source>
+<translation>Formato supporto non omogeneo.</translation>
+ </message>
+ <message>
+ <source>Duplexer is jammed.</source>
+<translation>Unità fronte/retro inceppata.</translation>
+ </message>
+ <message>
+ <source>An ink cartridge is out of ink.</source>
+<translation>Cartuccia di inchiostro esaurita.</translation>
+ </message>
+ <message>
+ <source>Internal device error.</source>
+<translation>Errore interno dispositivo.</translation>
+ </message>
+ <message>
+ <source>Second tray missing.</source>
+<translation>Secondo vassoio mancante.</translation>
+ </message>
+ <message>
+ <source>Duplexer missing.</source>
+<translation>Unità fronte/retro mancante.</translation>
+ </message>
+ <message>
+ <source>Rear tray missing.</source>
+<translation>Vassoio posteriore mancante.</translation>
+ </message>
+ <message>
+ <source>Cartridge not latched.</source>
+<translation>Cartuccia non fissata.</translation>
+ </message>
+ <message>
+ <source>Battery very low.</source>
+<translation>Batteria quasi esaurita.</translation>
+ </message>
+ <message>
+ <source>Output tray closed.</source>
+<translation>Vassoio di uscita chiuso.</translation>
+ </message>
+ <message>
+ <source>Manual feed blocked.</source>
+<translation>Alimentazione manuale bloccata.</translation>
+ </message>
+ <message>
+ <source>Rear feed blocked.</source>
+<translation>Alimentazione posteriore bloccata.</translation>
+ </message>
+ <message>
+ <source>Second tray out of paper.</source>
+<translation>Carta esaurita nel secondo vassoio.</translation>
+ </message>
+ <message>
+ <source>Input tray locked.</source>
+<translation>Vassoio di immissione bloccato.</translation>
+ </message>
+ <message>
+ <source>Non-HP ink.</source>
+<translation>Inchiostro non HP.</translation>
+ </message>
+ <message>
+ <source>Pen calibration needs resume.</source>
+<translation>Riprendere la calibrazione della penna.</translation>
+ </message>
+ <message>
+ <source>Media type mismatch.</source>
+<translation>Tipo di supporto non omogeneo.</translation>
+ </message>
+ <message>
+ <source>Custom media mismatch.</source>
+<translation>Supporto personalizzato non omogeneo.</translation>
+ </message>
+ <message>
+ <source>Pen cleaning in progress.</source>
+<translation>Pulizia penna in corso.</translation>
+ </message>
+ <message>
+ <source>Pen checking in progress.</source>
+<translation>Controllo penna in corso.</translation>
+ </message>
+ <message>
+ <source>Black cartridge is low on ink</source>
+<translation>La cartuccia del nero è quasi esaurita</translation>
+ </message>
+ <message>
+ <source>Tri-color cartridge is low on ink</source>
+<translation>La cartuccia tricromatica è quasi esaurita</translation>
+ </message>
+ <message>
+ <source>Photo cartridge is low on ink</source>
+<translation>La cartuccia per stampa fotografica è quasi esaurita</translation>
+ </message>
+ <message>
+ <source>Cyan cartridge is low on ink</source>
+<translation>La cartuccia del ciano è quasi esaurita</translation>
+ </message>
+ <message>
+ <source>Magenta cartridge is low on ink</source>
+<translation>La cartuccia del magenta è quasi esaurita</translation>
+ </message>
+ <message>
+ <source>Yellow cartridge is low on ink</source>
+<translation>La cartuccia del giallo è quasi esaurita</translation>
+ </message>
+ <message>
+ <source>Photo cyan cartridge is low on ink</source>
+<translation>La cartuccia per stampa fotografica in ciano è quasi esaurita</translation>
+ </message>
+ <message>
+ <source>Photo magenta cartridge is low on ink</source>
+<translation>La cartuccia per stampa fotografica in magenta è quasi esaurita</translation>
+ </message>
+ <message>
+ <source>Photo yellow cartridge is low on ink</source>
+<translation>La cartuccia per stampa fotografica in giallo è quasi esaurita</translation>
+ </message>
+ <message>
+ <source>Photo gray cartridge is low on ink</source>
+<translation>La cartuccia per stampa fotografica in grigio è quasi esaurita</translation>
+ </message>
+ <message>
+ <source>Photo blue cartridge is low on ink</source>
+<translation>La cartuccia per stampa fotografica in blu è quasi esaurita</translation>
+ </message>
+ <message>
+ <source>Black cartridge is low on toner</source>
+<translation>La cartuccia del nero ha quasi esaurito il toner</translation>
+ </message>
+ <message>
+ <source>Cyan cartridge is low on toner</source>
+<translation>La cartuccia del ciano ha quasi esaurito il toner</translation>
+ </message>
+ <message>
+ <source>Magenta cartridge is low on toner</source>
+<translation>La cartuccia del magenta ha quasi esaurito il toner</translation>
+ </message>
+ <message>
+ <source>Yellow cartridge is low on toner</source>
+<translation>La cartuccia del giallo ha quasi esaurito il toner</translation>
+ </message>
+ <message>
+ <source>Warming up.</source>
+<translation>In riscaldamento.</translation>
+ </message>
+ <message>
+ <source>Low paper.</source>
+<translation>Carta quasi esaurita.</translation>
+ </message>
+ <message>
+ <source>Door open.</source>
+<translation>Porta aperta.</translation>
+ </message>
+ <message>
+ <source>Offline.</source>
+<translation>Fuori linea.</translation>
+ </message>
+ <message>
+ <source>Low toner.</source>
+<translation>Toner quasi esaurito.</translation>
+ </message>
+ <message>
+ <source>No toner.</source>
+<translation>Nessun toner.</translation>
+ </message>
+ <message>
+ <source>Service request.</source>
+<translation>Richiesta manutenzione.</translation>
+ </message>
+ <message>
+ <source>Fuser error.</source>
+<translation>Errore area di fusione.</translation>
+ </message>
+ <message>
+ <source>Unsupported printer model.</source>
+<translation>Modello di stampante non supportato.</translation>
+ </message>
+ <message>
+ <source>Scan job started.</source>
+<translation>Scansione avviata.</translation>
+ </message>
+ <message>
+ <source>Scan job completed.</source>
+<translation>Scansione completata.</translation>
+ </message>
+ <message>
+ <source>Scan job failed.</source>
+<translation>Scansione non riuscita.</translation>
+ </message>
+ <message>
+ <source>Fax job started.</source>
+<translation>Operazione fax avviata.</translation>
+ </message>
+ <message>
+ <source>Fax job complete.</source>
+<translation>Operazione fax completata.</translation>
+ </message>
+ <message>
+ <source>Fax job failed.</source>
+<translation>Operazione fax non riuscita.</translation>
+ </message>
+ <message>
+ <source>Fax job canceled.</source>
+<translation>Operazione fax annullata.</translation>
+ </message>
+ <message>
+ <source>Fax send job continuing.</source>
+<translation>Invio fax in proseguimento.</translation>
+ </message>
+ <message>
+ <source>Fax receive job continuing.</source>
+<translation>Ricezione fax in proseguimento.</translation>
+ </message>
+ <message>
+ <source>Copy job started.</source>
+<translation>Copia avviata.</translation>
+ </message>
+ <message>
+ <source>Copy job complete.</source>
+<translation>Copia completata.</translation>
+ </message>
+ <message>
+ <source>Copy job failed.</source>
+<translation>Copia non riuscita.</translation>
+ </message>
+ <message>
+ <source>Copy job canceled.</source>
+<translation>Copia annullata.</translation>
+ </message>
+ <message>
+ <source>Device is powered down or unplugged.</source>
+<translation>Dispositivo spento o scollegato.</translation>
+ </message>
+ <message>
+ <source>Device communication error.</source>
+<translation>Errore di comunicazione dispositivo.</translation>
+ </message>
+ <message>
+ <source>Device is busy.</source>
+<translation>Dispositivo occupato.</translation>
+ </message>
+ <message>
+ <source>No data.</source>
+<translation>Nessun dato.</translation>
+ </message>
+ <message>
+ <source>Unsupported I/O bus.</source>
+<translation>Bus I/O non supportato.</translation>
+ </message>
+ <message>
+ <source>Device does not support requested operation.</source>
+<translation>Il dispositivo non supporta l'operazione richiesta.</translation>
+ </message>
+ <message>
+ <source>To send a fax you must run hp-sendfax first.</source>
+<translation>Per inviare un fax, avviare prima hp-sendfax.</translation>
+ </message>
+ <message>
+ <source>Run hp-sendfax now to continue. Fax will resume within 10 seconds.</source>
+<translation>Avviare hp-sendfax adesso per continuare. L'operazione fax verrà ripresa entro 10 secondi.</translation>
+ </message>
+ <message>
+ <source>Photocard unload started.</source>
+<translation>Scaricamento scheda fotografica avviato.</translation>
+ </message>
+ <message>
+ <source>Photocard unload ended.</source>
+<translation>Scaricamento scheda fotografica terminato.</translation>
+ </message>
+ <message>
+ <source>Photocard unload failed.</source>
+<translation>Scaricamento scheda fotografica non riuscito.</translation>
+ </message>
+ <message>
+ <source>Make sure photocard is inserted properly and try again.</source>
+<translation>Accertarsi che la scheda fotografica sia inserita correttamente e riprovare.</translation>
+ </message>
+ <message>
+ <source>Unable to mount photocard on device.</source>
+<translation>Impossibile montare la scheda fotografica sul dispositivo.</translation>
+ </message>
+ <message>
+ <source>Photocard unloaded successfully.</source>
+<translation>Scaricamento scheda fotografica completato.</translation>
+ </message>
+ <message>
+ <source>Unknown error.</source>
+<translation>Errore sconosciuto.</translation>
+ </message>
+ <message>
+ <source>Print</source>
+<translation>Programma di installazione HPLIP (HP Linux Imaging and Printing)</translation>
+ </message>
+ <message>
+ <source>Scan</source>
+<translation>Scansione avviata.</translation>
+ </message>
+ <message>
+ <source>Send fax</source>
+<translation>Invia fax</translation>
+ </message>
+ <message>
+ <source>Make copies</source>
+<translation>Crea copie</translation>
+ </message>
+ <message>
+ <source>Access photo cards</source>
+<translation>Accedi a schede fotografiche</translation>
+ </message>
+ <message>
+ <source>Invalid/missing</source>
+<translation>Non valida/mancante</translation>
+ </message>
+ <message>
+ <source>Invalid/missing ink cartridge</source>
+<translation>Cartuccia inchiostro non valida/mancante</translation>
+ </message>
+ <message>
+ <source>Invalid/missing cartridge</source>
+<translation>Cartuccia non valida/mancante</translation>
+ </message>
+ <message>
+ <source>Invalid/missing print head</source>
+<translation>Testina di stampa non valida/mancante</translation>
+ </message>
+ <message>
+ <source>Black print head</source>
+<translation>Testina di stampa in nero</translation>
+ </message>
+ <message>
+ <source>Black ink cartridge</source>
+<translation>Cartuccia d'inchiostro in nero</translation>
+ </message>
+ <message>
+ <source>Black cartridge</source>
+<translation>La cartuccia del nero è quasi esaurita</translation>
+ </message>
+ <message>
+ <source>Tri-color print head</source>
+<translation>Testina di stampa in tricromia</translation>
+ </message>
+ <message>
+ <source>Tri-color ink cartridge</source>
+<translation>Cartuccia d'inchiostro in tricromia</translation>
+ </message>
+ <message>
+ <source>Tri-color cartridge</source>
+<translation>La cartuccia tricromatica è quasi esaurita</translation>
+ </message>
+ <message>
+ <source>Photo print head</source>
+<translation>Testina di stampa fotografica</translation>
+ </message>
+ <message>
+ <source>Photo ink cartridge</source>
+<translation>Cartuccia d'inchiostro per foto</translation>
+ </message>
+ <message>
+ <source>Photo cartridge</source>
+<translation>La cartuccia per stampa fotografica è quasi esaurita</translation>
+ </message>
+ <message>
+ <source>Cyan print head</source>
+<translation>Testina di stampa in ciano</translation>
+ </message>
+ <message>
+ <source>Cyan ink cartridge</source>
+<translation>Cartuccia d'inchiostro in ciano</translation>
+ </message>
+ <message>
+ <source>Cyan cartridge</source>
+<translation>La cartuccia del ciano è quasi esaurita</translation>
+ </message>
+ <message>
+ <source>Magenta print head</source>
+<translation>Testina di stampa in magenta</translation>
+ </message>
+ <message>
+ <source>Magenta ink cartridge</source>
+<translation>Cartuccia d'inchiostro in magenta</translation>
+ </message>
+ <message>
+ <source>Magenta cartridge</source>
+<translation>La cartuccia del magenta è quasi esaurita</translation>
+ </message>
+ <message>
+ <source>Yellow print head</source>
+<translation>Testina di stampa in giallo</translation>
+ </message>
+ <message>
+ <source>Yellow ink cartridge</source>
+<translation>Cartuccia d'inchiostro in giallo</translation>
+ </message>
+ <message>
+ <source>Yellow cartridge</source>
+<translation>La cartuccia del giallo è quasi esaurita</translation>
+ </message>
+ <message>
+ <source>Photo cyan print head</source>
+<translation>Testina di stampa fotografica in ciano</translation>
+ </message>
+ <message>
+ <source>Photo cyan ink cartridge</source>
+<translation>Cartuccia d'inchiostro in ciano per foto</translation>
+ </message>
+ <message>
+ <source>Photo cyan cartridge</source>
+<translation>La cartuccia per stampa fotografica in ciano è quasi esaurita</translation>
+ </message>
+ <message>
+ <source>Photo magenta print head</source>
+<translation>Testina di stampa fotografica in magenta</translation>
+ </message>
+ <message>
+ <source>Photo magenta ink cartridge</source>
+<translation>Cartuccia d'inchiostro in nero per foto</translation>
+ </message>
+ <message>
+ <source>Photo magenta cartridge</source>
+<translation>La cartuccia per stampa fotografica in magenta è quasi esaurita</translation>
+ </message>
+ <message>
+ <source>Photo yellow print head</source>
+<translation>Testina di stampa in giallo per foto</translation>
+ </message>
+ <message>
+ <source>Photo yellow ink cartridge</source>
+<translation>Cartuccia d'inchiostro in giallo per foto</translation>
+ </message>
+ <message>
+ <source>Photo yellow cartridge</source>
+<translation>La cartuccia per stampa fotografica in giallo è quasi esaurita</translation>
+ </message>
+ <message>
+ <source>Photo gray print head</source>
+<translation>Testina di stampa fotografica in grigio</translation>
+ </message>
+ <message>
+ <source>Photo gray ink cartridge</source>
+<translation>Cartuccia d'inchiostro in grigio per foto</translation>
+ </message>
+ <message>
+ <source>Photo gray cartridge</source>
+<translation>La cartuccia per stampa fotografica in grigio è quasi esaurita</translation>
+ </message>
+ <message>
+ <source>Photo blue print head</source>
+<translation>Testina di stampa fotografica in blu</translation>
+ </message>
+ <message>
+ <source>Photo blue ink cartridge</source>
+<translation>Cartuccia d'inchiostro in blu per foto</translation>
+ </message>
+ <message>
+ <source>Photo blue cartridge</source>
+<translation>La cartuccia per stampa fotografica in blu è quasi esaurita</translation>
+ </message>
+ <message>
+ <source>Print head</source>
+<translation>Testina di stampa</translation>
+ </message>
+ <message>
+ <source>Photo magenta and photo cyan print head</source>
+<translation>Testina di stampa fotografica in magenta e ciano</translation>
+ </message>
+ <message>
+ <source>Magenta and yellow print head</source>
+<translation>Testina di stampa in magenta e giallo</translation>
+ </message>
+ <message>
+ <source>Black and cyan print head</source>
+<translation>Testina di stampa in nero e ciano</translation>
+ </message>
+ <message>
+ <source>Light gray and photo black print head</source>
+<translation>Testina di stampa fotografica in grigio chiaro e nero</translation>
+ </message>
+ <message>
+ <source>Light gray ink cartridge</source>
+<translation>Cartuccia d'inchiostro in grigio chiaro</translation>
+ </message>
+ <message>
+ <source>Medium gray ink cartridge</source>
+<translation>Cartuccia d'inchiostro in grigio intermedio</translation>
+ </message>
+ <message>
+ <source>Photo black ink cartridge</source>
+<translation>Cartuccia d'inchiostro in nero per foto</translation>
+ </message>
+ <message>
+ <source>Cyan and magenta print head</source>
+<translation>Testina di stampa in ciano e magenta</translation>
+ </message>
+ <message>
+ <source>Black and yellow print head</source>
+<translation>Testina di stampa in nero e giallo</translation>
+ </message>
+ <message>
+ <source>Black toner cartridge</source>
+<translation>Cartuccia toner in nero</translation>
+ </message>
+ <message>
+ <source>Cyan toner cartridge</source>
+<translation>Cartuccia toner in ciano</translation>
+ </message>
+ <message>
+ <source>Magenta toner cartridge</source>
+<translation>Cartuccia toner in magenta</translation>
+ </message>
+ <message>
+ <source>Yellow toner cartridge</source>
+<translation>Cartuccia toner in giallo</translation>
+ </message>
+ <message>
+ <source>Maintenance kit (fuser)</source>
+<translation>Kit di manutenzione (area di fusione)</translation>
+ </message>
+ <message>
+ <source>Document feeder (ADF) kit</source>
+<translation>Kit alimentatore documenti (ADF)</translation>
+ </message>
+ <message>
+ <source>Drum maintenance kit</source>
+<translation>Kit di manutenzione tamburi</translation>
+ </message>
+ <message>
+ <source>Image transfer kit</source>
+<translation>Kit di trasferimento immagini</translation>
+ </message>
+ <message>
+ <source>Good/OK</source>
+<translation>Buono/OK</translation>
+ </message>
+ <message>
+ <source>Fair/Moderate</source>
+<translation>Discreto/Moderato</translation>
+ </message>
+ <message>
+ <source>Not installed</source>
+<translation>Non installato</translation>
+ </message>
+ <message>
+ <source>Incorrect</source>
+<translation>Non corretto</translation>
+ </message>
+ <message>
+ <source>Failed</source>
+<translation>ERRORE: montaggio della scheda fotografica non riuscito. Verificare il dispositivo e la scheda e riprovare.</translation>
+ </message>
+ <message>
+ <source>Overheated</source>
+<translation>Surriscaldato</translation>
+ </message>
+ <message>
+ <source>Discharging</source>
+<translation>In esaurimento</translation>
+ </message>
+ <message>
+ <source>Charging</source>
+<translation>In carica</translation>
+ </message>
+ <message>
+ <source>Low</source>
+<translation>Carta quasi esaurita.</translation>
+ </message>
+ <message>
+ <source>Very low</source>
+<translation>Molto basso</translation>
+ </message>
+ <message>
+ <source>HPLIP: Email alert test message</source>
+<translation>HPLIP: messaggio e-mail di prova avvisi</translation>
+ </message>
+ <message>
+ <source>This email is to test the functionality of HPLIP email alerts.</source>
+<translation>Questo messaggio serve a provare la funzionalità degli avvisi HPLIP via e-mail.</translation>
+ </message>
+ <message>
+ <source>HPLIP: Error/alert on device: </source>
+<translation>HPLIP: Errore/avviso dispositivo:</translation>
+ </message>
+</context>
+<context>
+ <name>SupportForm_base</name>
+ <message>
+ <source>HP Device Manager - Support Information</source>
+ <translation>HP Device Manager - Informazioni per l&apos;assistenza</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Chiudi</translation>
+ </message>
+ <message>
+ <source>http://hplip.sourceforge.net</source>
+ <translation>http://hplip.sourceforge.net</translation>
+ </message>
+ <message>
+ <source>HPLIP is free, open source software distributed under the MIT, BSD, and GPL licenses. &lt;b&gt;&lt;i&gt;HP does not provide formal consumer or commercial support for this software.&lt;/i&gt;&lt;/b&gt;&lt;p&gt; Support is provided informally through a series of resources on a Sourceforge.net website. On this HP sponsored website, you will find FAQs, open discussion forums, installation instructions, a product support table, and other support materials.</source>
+ <translation>HPLIP è un software open source gratuito distribuito in base alle licenze MIT, BSD e GPL. &lt;b&gt;&lt;i&gt;HP non fornisce per questo software assistenza commerciale o al consumatore in modo formale.&lt;/i&gt;&lt;/b&gt;&lt;p&gt; L&apos;assistenza viene fornita in via informale attraverso una serie di risorse disponibili nel sito Web Sourceforge.net. In questo sito Web sponsorizzato da HP sono disponibili FAQ, forum di discussione aperti, istruzioni di installazione, una tabella dei prodotti supportati e altri materiali di supporto.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;HP Sponsored Support&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Assistenza sponsorizzata da HP&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>NOTE: Sourceforge.net is owned and operated by OSTG, Inc. and is not affiliated with HP.</source>
+ <translation>NOTA: Sourceforge.net è di proprietà e a cura di OSTG, Inc. e non è affiliato a HP.</translation>
+ </message>
+ <message>
+ <source>HP</source>
+ <translation>HP</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;README File&lt;/b&gt;</source>
+ <translation>&lt;b&gt;File README&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>A readme file was shipped with your version of HPLIP. This file contains the product support table, a troubleshooting guide, and other support resources.</source>
+ <translation>Con la versione di HPLIP è stato fornito un file readme. Questo file contiene la tabella dei prodotti supportati, una guida per la risoluzione dei problemi e altre risorse di supporto.</translation>
+ </message>
+ <message>
+ <source>hplip_readme.html</source>
+ <translation>hplip_readme.html</translation>
+ </message>
+ <message>
+ <source>README File</source>
+ <translation>File README</translation>
+ </message>
+ <message>
+ <source>http://linuxprinting.org</source>
+ <translation>http://linuxprinting.org</translation>
+ </message>
+ <message>
+ <source>General Linux printing assistance is also available from open discussion forums, documentation, access to PPD files, etc. from:</source>
+ <translation>Un&apos;assistenza generale per la stampa Linux è disponibile anche nei forum di discussione aperti, nella documentazione, nell&apos;accesso ai file PPD, ecc. disponibili in:</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;linuxprinting.org&lt;/b&gt;</source>
+ <translation>&lt;b&gt;linuxprinting.org&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>NOTE: Linuxprinting.org is operated through the generous efforts of Grant Taylor and Till Kamppeter and is not affiliated with HP.</source>
+ <translation>NOTA: Linuxprinting.org è a cura di Grant Taylor e Till Kamppeter e non è affiliato a HP.</translation>
+ </message>
+ <message>
+ <source>linuxprinting.org</source>
+ <translation>linuxprinting.org</translation>
+ </message>
+ <message>
+ <source>http://cups.org</source>
+ <translation>http://cups.org</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;CUPS&lt;/b&gt;</source>
+ <translation>&lt;b&gt;CUPS&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Information about CUPS (Common UNIX Printing System) is available at cups.org. This website also contains forums and other support resources for printing on Linux:</source>
+ <translation>Le informazioni su CUPS (Common UNIX Printing System) sono disponibili nel sito Web cups.org. Questo sito contiene inoltre forum e altre risorse di supporto per la stampa con Linux:</translation>
+ </message>
+ <message>
+ <source>NOTE: CUPS and the CUPS website is owned and operated by Easy Software Products and is not affiliated with HP.</source>
+ <translation>NOTA: CUPS e il sito Web CUPS sono di proprietà e a cura di Easy Software Products e non sono affiliati a HP.</translation>
+ </message>
+ <message>
+ <source>CUPS</source>
+ <translation>CUPS</translation>
+ </message>
+</context>
+<context>
+ <name>UnloadForm</name>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;No devices found that support photo card access.&lt;/b&gt;&lt;p&gt;Please make sure your device is properly installed and try again.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Nessun dispositivo trovato che supporti l&apos;accesso alla scheda fotografica.&lt;/b&gt;&lt;p&gt;Verificare che il dispositivo sia installato correttamente e riprovare.</translation>
+ </message>
+ <message>
+ <source>HP Device Manager - Unload Photo Card</source>
+ <translation>HP Device Manager - Scarica scheda fotografica</translation>
+ </message>
+</context>
+<context>
+ <name>UnloadForm_base</name>
+ <message>
+ <source>HP Device Manager - Unload Files from Photo Card</source>
+ <translation>HP Device Manager - Scarica file dalla scheda fotografica</translation>
+ </message>
+ <message>
+ <source>Device:</source>
+ <translation>Dispositivo:</translation>
+ </message>
+ <message>
+ <source>Unload Selected Files</source>
+ <translation>Scarica file selezionati</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Chiudi</translation>
+ </message>
+ <message>
+ <source>Unload Directory:</source>
+ <translation>Scarica directory:</translation>
+ </message>
+ <message>
+ <source>Browse...</source>
+ <translation>Sfoglia...</translation>
+ </message>
+ <message>
+ <source>File Removal:</source>
+ <translation>Rimozione file:</translation>
+ </message>
+ <message>
+ <source>Leave all files on photo card</source>
+ <translation>Lascia tutti i file nella scheda fotografica</translation>
+ </message>
+ <message>
+ <source>Remove selected files</source>
+ <translation>Rimuovi i file selezionati</translation>
+ </message>
+ <message>
+ <source>Select Files to Unload from Photo Card:</source>
+ <translation>Seleziona file da scaricare dalla scheda fotografica:</translation>
+ </message>
+ <message>
+ <source>Select All</source>
+ <translation>Seleziona tutto</translation>
+ </message>
+ <message>
+ <source>Select None</source>
+ <translation>Deseleziona tutto</translation>
+ </message>
+ <message>
+ <source>Show Thumbnails</source>
+ <translation>Mostra miniature</translation>
+ </message>
+</context>
+<context>
+ <name>WaitForm_base</name>
+ <message>
+ <source>HP Device Manager - Waiting</source>
+ <translation>HP Device Manager - In attesa</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Waiting for procedure to finish...&lt;/b&gt;</source>
+ <translation>&lt;b&gt;In attesa del completamento della procedura...&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Annulla</translation>
+ </message>
+</context>
+<context>
+ <name>self.form.FailureUI</name>
+ <message>
+ <source>&lt;b&gt;Unable to mount photo card on device.&lt;/b&gt;&lt;p&gt;Check that device is powered on and photo card is correctly inserted.</source>
+<translation>&lt;b&gt;Impossibile montare la scheda fotografica sul dispositivo.&lt;/b&gt;&lt;p&gt;Verificare che il dispositivo sia alimentato e che la scheda sia stata inserita correttamente.</translation>
+ </message>
+</context>
+</TS>
diff --git a/data/localization/hplip_pt.qm b/data/localization/hplip_pt.qm
new file mode 100644
index 0000000..d8d340b
--- /dev/null
+++ b/data/localization/hplip_pt.qm
Binary files differ
diff --git a/data/localization/hplip_pt.ts b/data/localization/hplip_pt.ts
new file mode 100755
index 0000000..8c07a44
--- /dev/null
+++ b/data/localization/hplip_pt.ts
@@ -0,0 +1,5048 @@
+<!DOCTYPE TS><TS>
+<context>
+ <name>@default</name>
+ <message>
+ <source>&lt;b&gt;Unable to mount photo card on device.&lt;/b&gt;&lt;p&gt;Check that device is powered on and photo card is correctly inserted.</source>
+<translation>&lt;b&gt;Não foi possível montar o cartão de foto no dispositivo.&lt;/b&gt;&lt;p&gt;Verifique se o dispositivo está ligado e se o cartão de foto está inserido corretamente.</translation>
+ </message>
+</context>
+<context>
+ <name>AboutDlg_base</name>
+ <message>
+ <source>HP Device Manager - About</source>
+ <translation>HP Device Manager - Sobre</translation>
+ </message>
+ <message>
+ <source>&lt;font size=&quot;+3&quot;&gt;&lt;p align=&quot;center&quot;&gt;HP Linux Imaging and Printing (HPLIP)&lt;/p&gt;&lt;/font&gt;</source>
+ <translation>&lt;font size=&quot;+3&quot;&gt;&lt;p align=&quot;center&quot;&gt;HP Linux Imaging and Printing (HPLIP)&lt;/p&gt;&lt;/font&gt;</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Fechar</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;HPLIP Software Version:&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Versão do software HPLIP: &lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>0.0.0</source>
+ <translation>0.0.0</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Device Manager Software Version:&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Versão do software Device Manager: &lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Authors and Contributors:&lt;/b&gt;\nDavid Suffield, Don Welch, Shiyun Yie, Raghothama Cauligi, John Oleinik, Cory Meisch, Foster Nuffer, Pete Parks, Jacqueline Pitter, David Paschal,\nSteve DeRoos, Mark Overton, Aaron Albright, Smith Kennedy, John Hosszu, Chris Wiesner, Henrique M. Holschuh, Till Kamppeter, Linus Araque, Mark Crawford, Charlie Moore</source>
+ <translation>&lt;b&gt;Autores e colaboradores:&lt;/b&gt;
+David Suffield, Don Welch, Shiyun Yie, Raghothama Cauligi, John Oleinik, Cory Meisch, Foster Nuffer, Pete Parks, Jacqueline Pitter, David Paschal,
+Steve DeRoos, Mark Overton, Aaron Albright, Smith Kennedy, John Hosszu, Chris Wiesner, Henrique M. Holschuh, Till Kamppeter, Linus Araque, Mark Crawford, Charlie Moore</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;License and Copyright:&lt;/b&gt;
+(c) Copyright 2006 Hewlett-Packard Development Company, L.P. This software is licensed under the GNU General Public License (GPL), BSD, and MIT licenses. See the software sources for details.</source>
+ <translation>&lt;b&gt;Licença e direitos autorais:&lt;/b&gt;
+© Copyright 2006 Hewlett-Packard Development Company, L.P. Este software está licenciado nos termos das licenças GNU GPL (Licença pública geral), BSD e MIT. Consulte as fontes do software para obter detalhes.</translation>
+ </message>
+</context>
+<context>
+ <name>Align10Form_Base</name>
+ <message>
+ <source>HP Device Manager - Alignment</source>
+ <translation>HP Device Manager - Alinhamento</translation>
+ </message>
+ <message>
+ <source>Examine the page that was printed. Several rows of boxes, each made up of thin lines, appear on the printed page.&lt;p&gt;
+For each row, select the label representing the box in which the shorter inner lines are the most aligned with the longer outer lines..</source>
+ <translation>Examine a página impressa. Várias fileiras de caixas, cada uma formada por linhas finas, aparecem na página impressa.&lt;p&gt;
+Para cada fileira, selecione a legenda que representa a caixa na qual as linhas internas mais curtas estão mais alinhadas às linhas externas mais longas.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;B:&lt;/font&gt;&lt;/b&gt;</source>
+ <translation>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;B:&lt;/font&gt;&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;F:&lt;/font&gt;&lt;/b&gt;</source>
+ <translation>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;F:&lt;/font&gt;&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;C:&lt;/font&gt;&lt;/b&gt;</source>
+ <translation>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;C:&lt;/font&gt;&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;D:&lt;/font&gt;&lt;/b&gt;</source>
+ <translation>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;D:&lt;/font&gt;&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;G:&lt;/font&gt;&lt;/b&gt;</source>
+ <translation>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;G:&lt;/font&gt;&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;A:&lt;/font&gt;&lt;/b&gt;</source>
+ <translation>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;A:&lt;/font&gt;&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;E:&lt;/font&gt;&lt;/b&gt;</source>
+ <translation>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;E:&lt;/font&gt;&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;H:&lt;/font&gt;&lt;/b&gt;</source>
+ <translation>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;H:&lt;/font&gt;&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Next &gt;</source>
+ <translation>Avançar &gt;</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Cancelar</translation>
+ </message>
+</context>
+<context>
+ <name>AlignForm</name>
+ <message>
+ <source>HP Device Manager - Alignment</source>
+ <translation>HP Device Manager - Alinhamento</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Cancelar</translation>
+ </message>
+ <message>
+ <source>Next &gt;</source>
+ <translation>Avançar &gt;</translation>
+ </message>
+ <message>
+ <source>Choose the set of lines where the line segments are &lt;b&gt;best&lt;/b&gt; aligned.</source>
+ <translation>Selecione o conjunto de linhas em que os segmentos das linhas estão &lt;b&gt;melhor &lt;/b&gt; alinhados.</translation>
+ </message>
+</context>
+<context>
+ <name>AlignType6Form1_base</name>
+ <message>
+ <source>HP Device Manager - Alignment</source>
+ <translation>HP Device Manager - Alinhamento</translation>
+ </message>
+ <message>
+ <source>To perform alignment, you will need the &lt;b&gt;alignment page&lt;/b&gt; that is automatically printed after you install a print cartridge.
+&lt;p&gt; If you do &lt;b&gt;not&lt;/b&gt; have this page, click &lt;i&gt;Print Page&lt;/i&gt;.
+&lt;p&gt;If you already have this page, click &lt;i&gt;Next &gt;&lt;/i&gt;.</source>
+ <translation>Para executar fazer o alinhamento, é necessária a &lt;b&gt;página de alinhamento&lt;/b&gt; que é impressa automaticamente após a instalação de um cartucho de impressão.
+&lt;p&gt; Caso &lt;b&gt;não&lt;/b&gt; tenha essa página, clique em &lt;i&gt;Imprimir página&lt;/i&gt;.
+&lt;p&gt;Se já tiver essa página, clique em &lt;i&gt;Avançar&gt;&lt;/i&gt;.</translation>
+ </message>
+ <message>
+ <source>Next &gt;</source>
+ <translation>Avançar &gt;</translation>
+ </message>
+ <message>
+ <source>Print Page</source>
+ <translation>Imprimir página</translation>
+ </message>
+</context>
+<context>
+ <name>AlignType6Form2_base</name>
+ <message>
+ <source>HP Device Manager - Alignment</source>
+ <translation>HP Device Manager - Alinhamento</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Follow these steps to complete the alignment:&lt;/b&gt;
+&lt;p&gt;&lt;b&gt;1.&lt;/b&gt; Place the alignment page, with the printed side facing down, on the scanner.
+&lt;p&gt;&lt;b&gt;2.&lt;/b&gt; Press the &lt;i&gt;Enter&lt;/i&gt; or &lt;i&gt;Scan&lt;/i&gt; button on the printer.
+&lt;p&gt;&lt;b&gt;3.&lt;/b&gt; &quot;Alignment Complete&quot; will be displayed when the process is finished (on some models)..</source>
+ <translation>&lt;b&gt;Siga estas etapas para finalizar o alinhamento:&lt;/b&gt;
+&lt;p&gt;&lt;b&gt;1.&lt;/b&gt; Coloque a página de alinhamento, com a parte impressa voltada para baixo, no scanner.
+&lt;p&gt;&lt;b&gt;2.&lt;/b&gt; Pressione a tecla &lt;i&gt;Enter&lt;/i&gt; ou &lt;i&gt;Digitalizar&lt;/i&gt; na impressora.
+&lt;p&gt;&lt;b&gt;3.&lt;/b&gt; &quot;Alinhamento concluído&quot; será exibido quando o processo estiver finalizado (em alguns modelos).</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+</context>
+<context>
+ <name>AllowableTypesDlg_base</name>
+ <message>
+ <source>MIME Type</source>
+ <translation>Tipo MIME</translation>
+ </message>
+ <message>
+ <source>Description</source>
+ <translation>Descrição</translation>
+ </message>
+ <message>
+ <source>Usual File Extension(s)</source>
+ <translation>Extensão(ões) comuns de arquivos</translation>
+ </message>
+ <message>
+ <source>HP Device Manager - Allowable Types</source>
+ <translation>HP Device Manager - Tipos permitidos</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;File/document types that can be added to the file list.&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Tipos de arquivos/documentos que podem ser acrescentados à lista de arquivos.&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>&lt;i&gt;Note: To print or fax file/document types that do not appear on this list, print the document from the application that created it through the appropriate CUPS printer.&lt;/i&gt;</source>
+ <translation>&lt;i&gt;Nota: Para imprimir ou enviar por fax tipos de arquivos/documentos que não aparecem nesta lista, imprima o documento a partir do aplicativo que o criou por meio da impressora CUPS adequada.&lt;/i&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>ChooseDeviceDlg</name>
+ <message>
+ <source>Choose Device</source>
+ <translation>Escolher dispositivo</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Cancelar</translation>
+ </message>
+ <message>
+ <source>Available Devices:</source>
+ <translation>Dispositivos disponíveis:</translation>
+ </message>
+</context>
+<context>
+ <name>ChoosePrinterDlg</name>
+ <message>
+ <source>Choose Device</source>
+ <translation>Escolher dispositivo</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Cancelar</translation>
+ </message>
+ <message>
+ <source>Available Devices:</source>
+ <translation>Dispositivos disponíveis:</translation>
+ </message>
+ <message>
+ <source>Available Printers:</source>
+ <translation>Impressoras disponíveis:</translation>
+ </message>
+ <message>
+ <source>Available Faxes:</source>
+ <translation>Fax disponíveis:</translation>
+ </message>
+</context>
+<context>
+ <name>ChoosePrinterDlg2</name>
+ <message>
+ <source>Choose Printer</source>
+ <translation>Escolher impressora</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Cancelar</translation>
+ </message>
+ <message>
+ <source>Printers:</source>
+ <translation>Impressoras:</translation>
+ </message>
+</context>
+<context>
+ <name>CleaningForm2_base</name>
+ <message>
+ <source>HP Device Manager - Cleaning</source>
+ <translation>HP Device Manager - Limpeza</translation>
+ </message>
+ <message>
+ <source>Finish</source>
+ <translation>Concluir</translation>
+ </message>
+ <message>
+ <source>Please wait while the test page is printed. Check this page to see if the problem was fixed. If the test page looks fine click &lt;b&gt;Finish &lt;/b&gt;to quit the cleaning procedure. Otherwise, replace the print cartridges and click &lt;b&gt;Finish&lt;/b&gt;.</source>
+ <translation>Aguarde a impressão da página de teste. Verifique esta página para saber se o problema foi corrigido. Se a página de teste estiver em ordem, clique em &lt;b&gt;Concluir &lt;/b&gt;para sair do processo de limpeza. Caso contrário, substitua os cartuchos de impressão e clique em &lt;b&gt;Concluir&lt;/b&gt;.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Cleaning Level 3 Performed&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Nível 3 de limpeza realizado&lt;/b&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>CleaningForm_base</name>
+ <message>
+ <source>HP Device Manager - Please Wait - Cleaning</source>
+ <translation>HP Device Manager - Aguarde - Limpando</translation>
+ </message>
+ <message>
+ <source>Finish</source>
+ <translation>Concluir</translation>
+ </message>
+ <message>
+ <source>Cleaning Level %s</source>
+ <translation>Nível de limpeza %s</translation>
+ </message>
+ <message>
+ <source>Please wait while the test page is printed. Check this page to see if the problem was fixed. If the test page looks fine click &lt;b&gt;Finish &lt;/b&gt;to quit the cleaning procedure. Otherwise, click &lt;b&gt;Cleaning Level %s&lt;/b&gt; to continue with cleaning.</source>
+ <translation>Aguarde a impressão da página de teste. Verifique esta página para saber se o problema foi corrigido. Se a página de teste estiver em ordem, clique em &lt;b&gt;Concluir &lt;/b&gt;para sair do processo de limpeza. Caso contrário, clique em &lt;b&gt;Nível de Limpeza %s&lt;/b&gt; para continuar a limpar.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Please Wait - Cleaning Level %s Being Performed&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Aguarde - Nível de limpeza %s sendo executado&lt;/b&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>ColorAdjForm_base</name>
+ <message>
+ <source>HP Device Manager - Color Adjustment</source>
+ <translation>HP Device Manager – Ajuste de cores</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Cancelar</translation>
+ </message>
+ <message>
+ <source>Next &gt;</source>
+ <translation>Avançar &gt;</translation>
+ </message>
+ <message>
+ <source>Choose the numbered colored box that the color &lt;b&gt;best &lt;/b&gt;matches the background color of the bar.</source>
+ <translation>Escolha a caixa colorida numerada cuja cor &lt;b&gt;mais &lt;/b&gt;coincida com a cor de fundo da barra.</translation>
+ </message>
+ <message>
+ <source>1</source>
+ <translation>1</translation>
+ </message>
+ <message>
+ <source>2</source>
+ <translation>2</translation>
+ </message>
+ <message>
+ <source>3</source>
+ <translation>3</translation>
+ </message>
+ <message>
+ <source>4</source>
+ <translation>4</translation>
+ </message>
+ <message>
+ <source>5</source>
+ <translation>5</translation>
+ </message>
+ <message>
+ <source>6</source>
+ <translation>6</translation>
+ </message>
+ <message>
+ <source>7</source>
+ <translation>7</translation>
+ </message>
+ <message>
+ <source>8</source>
+ <translation>8</translation>
+ </message>
+ <message>
+ <source>9</source>
+ <translation>9</translation>
+ </message>
+ <message>
+ <source>10</source>
+ <translation>10</translation>
+ </message>
+ <message>
+ <source>11</source>
+ <translation>11</translation>
+ </message>
+ <message>
+ <source>12</source>
+ <translation>12</translation>
+ </message>
+ <message>
+ <source>13</source>
+ <translation>13</translation>
+ </message>
+ <message>
+ <source>14</source>
+ <translation>14</translation>
+ </message>
+ <message>
+ <source>15</source>
+ <translation>15</translation>
+ </message>
+ <message>
+ <source>16</source>
+ <translation>16</translation>
+ </message>
+ <message>
+ <source>17</source>
+ <translation>17</translation>
+ </message>
+ <message>
+ <source>18</source>
+ <translation>18</translation>
+ </message>
+ <message>
+ <source>19</source>
+ <translation>19</translation>
+ </message>
+ <message>
+ <source>20</source>
+ <translation>20</translation>
+ </message>
+ <message>
+ <source>21</source>
+ <translation>21</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;&lt;font size=&quot;+1&quot;&gt;Line&lt;/font&gt;&lt;/b&gt;</source>
+ <translation>&lt;b&gt;&lt;font size=&quot;+1&quot;&gt;Linha&lt;/font&gt;&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;&lt;font size=&quot;+1&quot;&gt;X&lt;/font&gt;&lt;/b&gt;</source>
+ <translation>&lt;b&gt;&lt;font size=&quot;+1&quot;&gt;X&lt;/font&gt;&lt;/b&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>ColorCal4Form_base</name>
+ <message>
+ <source>HP Device Manager - Color Calibration</source>
+ <translation>HP Device Manager - Calibragem de cores</translation>
+ </message>
+ <message>
+ <source>Calibrate</source>
+ <translation>Calibrar</translation>
+ </message>
+ <message>
+ <source>1. Hold the calibration page at arm&apos;s length in front of your eyes.
+&lt;p&gt;&lt;p&gt;
+2. Tilt the page away from you. Look at the two large squares, each containing colored patches. For each large square, find the colored path that &lt;b&gt;most closely&lt;/b&gt; matches the background color. Each patch has an associated letter and number.
+&lt;p&gt;&lt;p&gt;
+3. Choose the letter and number for the matching patches for the gray and color plots.
+&lt;p&gt;&lt;p&gt;
+4. Click &lt;i&gt;&quot;Calibrate&quot;.&lt;/i&gt; to continue.
+&lt;p&gt;&lt;p&gt;
+(To reset the printer to known defaults, click &lt;i&gt;&quot;Use Factory Defaults&quot;&lt;/i&gt;)</source>
+ <translation>1. Segure a página de calibragem à distância de um braço em frente aos seus olhos.
+&lt;p&gt;&lt;p&gt;
+2. Incline a página afastando-a de você. Olhe para os dois quadrados grandes, cada um contendo retângulos de cores. Para cada quadrado grande, encontre o retângulo de cores que &lt;b&gt;mais&lt;/b&gt; combine com a cor de fundo. Cada retângulo tem uma letra e um número associado.
+&lt;p&gt;&lt;p&gt;
+3. Escolha a letra e o número dos retângulos coincidentes para os gráficos de escala de cinza e cores.
+&lt;p&gt;&lt;p&gt;
+4. Clique em &lt;i&gt;&quot;Calibrar&quot;.&lt;/i&gt; para continuar.
+&lt;p&gt;&lt;p&gt;
+(Para redefinir a impressora com padrões conhecidos, clique em &lt;i&gt;&quot;Usar padrões de fábrica&quot;&lt;/i&gt;)</translation>
+ </message>
+ <message>
+ <source>Gray Plot</source>
+ <translation>Gráfico de escala de cinza</translation>
+ </message>
+ <message>
+ <source>A</source>
+ <translation>A</translation>
+ </message>
+ <message>
+ <source>B</source>
+ <translation>B</translation>
+ </message>
+ <message>
+ <source>C</source>
+ <translation>C</translation>
+ </message>
+ <message>
+ <source>D</source>
+ <translation>D</translation>
+ </message>
+ <message>
+ <source>E</source>
+ <translation>E</translation>
+ </message>
+ <message>
+ <source>F</source>
+ <translation>F</translation>
+ </message>
+ <message>
+ <source>G</source>
+ <translation>G</translation>
+ </message>
+ <message>
+ <source>H</source>
+ <translation>H</translation>
+ </message>
+ <message>
+ <source>I</source>
+ <translation>I</translation>
+ </message>
+ <message>
+ <source>J</source>
+ <translation>J</translation>
+ </message>
+ <message>
+ <source>K</source>
+ <translation>K</translation>
+ </message>
+ <message>
+ <source>L</source>
+ <translation>L</translation>
+ </message>
+ <message>
+ <source>M</source>
+ <translation>M</translation>
+ </message>
+ <message>
+ <source>N</source>
+ <translation>N</translation>
+ </message>
+ <message>
+ <source>1</source>
+ <translation>1</translation>
+ </message>
+ <message>
+ <source>2</source>
+ <translation>2</translation>
+ </message>
+ <message>
+ <source>3</source>
+ <translation>3</translation>
+ </message>
+ <message>
+ <source>4</source>
+ <translation>4</translation>
+ </message>
+ <message>
+ <source>5</source>
+ <translation>5</translation>
+ </message>
+ <message>
+ <source>6</source>
+ <translation>6</translation>
+ </message>
+ <message>
+ <source>7</source>
+ <translation>7</translation>
+ </message>
+ <message>
+ <source>8</source>
+ <translation>8</translation>
+ </message>
+ <message>
+ <source>9</source>
+ <translation>9</translation>
+ </message>
+ <message>
+ <source>10</source>
+ <translation>10</translation>
+ </message>
+ <message>
+ <source>11</source>
+ <translation>11</translation>
+ </message>
+ <message>
+ <source>12</source>
+ <translation>12</translation>
+ </message>
+ <message>
+ <source>13</source>
+ <translation>13</translation>
+ </message>
+ <message>
+ <source>14</source>
+ <translation>14</translation>
+ </message>
+ <message>
+ <source>Color Plot</source>
+ <translation>Gráfico de cores</translation>
+ </message>
+ <message>
+ <source>P</source>
+ <translation>P</translation>
+ </message>
+ <message>
+ <source>Q</source>
+ <translation>Q</translation>
+ </message>
+ <message>
+ <source>R</source>
+ <translation>R</translation>
+ </message>
+ <message>
+ <source>S</source>
+ <translation>S</translation>
+ </message>
+ <message>
+ <source>T</source>
+ <translation>T</translation>
+ </message>
+ <message>
+ <source>U</source>
+ <translation>U</translation>
+ </message>
+ <message>
+ <source>V</source>
+ <translation>V</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Cancelar</translation>
+ </message>
+ <message>
+ <source>Use Factory Defaults</source>
+ <translation>Usar padrões de fábrica</translation>
+ </message>
+</context>
+<context>
+ <name>ColorCalForm2_base</name>
+ <message>
+ <source>HP Device Manager - Color Calibration</source>
+ <translation>HP Device Manager - Calibragem de cores</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Cancelar</translation>
+ </message>
+ <message>
+ <source>Next &gt;</source>
+ <translation>Avançar &gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;A page of color patches is printing. When it is complete, follow these steps:&lt;/b&gt;
+&lt;p&gt;&lt;b&gt;1.&lt;/b&gt; Hold the page approximately 8 inches (~20cm) in front of your eyes.
+&lt;p&gt;&lt;b&gt;2.&lt;/b&gt; Slowly move the page away from you until the numbered patches fade to match the background.
+&lt;p&gt;&lt;b&gt;3.&lt;/b&gt; Select the number (below) between &lt;i&gt;1&lt;/i&gt; and &lt;i&gt;81 &lt;/i&gt;of the numbered patch that &lt;b&gt;best &lt;/b&gt;matches the background:</source>
+ <translation>&lt;b&gt;Está sendo impressa uma página de retângulos de cores. Quando estiver finalizada, siga as etapas a seguir:&lt;/b&gt;
+&lt;p&gt;&lt;b&gt;1.&lt;/b&gt; Coloque a página a aproximadamente 20 cm de distância dos olhos.
+&lt;p&gt;&lt;b&gt;2.&lt;/b&gt; Afaste a página lentamente até que os retângulos numerados coincidam com o fundo.
+&lt;p&gt;&lt;b&gt;3.&lt;/b&gt; Selecione (abaixo) o número entre &lt;i&gt;1&lt;/i&gt; e &lt;i&gt;81 &lt;/i&gt;do retângulo numerado que &lt;b&gt;mais &lt;/b&gt;coincida com o fundo:</translation>
+ </message>
+ <message>
+ <source>Number of best matching patch (1-81):</source>
+ <translation>Número do retângulo que mais coincide (1-81):</translation>
+ </message>
+</context>
+<context>
+ <name>ColorCalForm_base</name>
+ <message>
+ <source>HP Device Manager - Color Calibration</source>
+ <translation>HP Device Manager - Calibragem de cores</translation>
+ </message>
+ <message>
+ <source>Next &gt;</source>
+ <translation>Avançar &gt;</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Cancelar</translation>
+ </message>
+ <message>
+ <source>Color Calibration</source>
+ <translation>Calibragem de cores</translation>
+ </message>
+ <message>
+ <source>1</source>
+ <translation>1</translation>
+ </message>
+ <message>
+ <source>2</source>
+ <translation>2</translation>
+ </message>
+ <message>
+ <source>3</source>
+ <translation>3</translation>
+ </message>
+ <message>
+ <source>4</source>
+ <translation>4</translation>
+ </message>
+ <message>
+ <source>5</source>
+ <translation>5</translation>
+ </message>
+ <message>
+ <source>6</source>
+ <translation>6</translation>
+ </message>
+ <message>
+ <source>7</source>
+ <translation>7</translation>
+ </message>
+ <message>
+ <source>Choose the numbered image labeled &quot;1&quot; thru &quot;7&quot; that is &lt;b&gt;best color matched&lt;/b&gt; to the image labeled &quot;X&quot;.</source>
+ <translation>Escolha a imagem numerada de &quot;1&quot; a &quot;7&quot; cujas &lt;b&gt;cores mais coincidam &lt;/b&gt; com a imagem rotulada &quot;X&quot;.</translation>
+ </message>
+</context>
+<context>
+ <name>CoverpageForm_base</name>
+ <message>
+ <source>HP Device Manager - Coverpages</source>
+ <translation>HP Device Manager - Folhas de rosto</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Cancelar</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>Coverpage Design</source>
+ <translation>Design da folha de rosto</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Choose coverpage and enter optional message.&lt;b&gt;</source>
+ <translation>&lt;b&gt;Escolha a folha de rosto e digite uma mensagem opcional.&lt;b&gt;</translation>
+ </message>
+ <message>
+ <source>Regarding:</source>
+ <translation>Assunto:</translation>
+ </message>
+ <message>
+ <source>Optional Message &lt;i&gt;(Maximum 2048 characters or 32 lines preformatted)&lt;/i&gt;:</source>
+ <translation>Mensagem opcional &lt;i&gt;(Máximo de 2048 caracteres ou 32 linhas pré-formatadas)&lt;/i&gt;:</translation>
+ </message>
+ <message>
+ <source>Preformatted (preserve formatting)</source>
+ <translation>Pré-formatada (preservar formatação)</translation>
+ </message>
+</context>
+<context>
+ <name>DevMgr4</name>
+ <message>
+ <source>Functions</source>
+ <translation>Funções</translation>
+ </message>
+ <message>
+ <source>Functions &gt; Print</source>
+ <translation>Funções &gt; Imprimir</translation>
+ </message>
+ <message>
+ <source>Functions &gt; Make Copies</source>
+ <translation>Funções &gt; Fazer cópias</translation>
+ </message>
+ <message>
+ <source>Functions &gt; Fax</source>
+ <translation>Funções &gt; Fax</translation>
+ </message>
+ <message>
+ <source>Functions &gt; Unload Photo Card</source>
+ <translation>Funções &gt; Descarregar cartão de foto</translation>
+ </message>
+ <message>
+ <source>Tools</source>
+ <translation>Ferramentas</translation>
+ </message>
+ <message>
+ <source>Tools &gt; Device Information</source>
+ <translation>Ferramentas &gt; Informação do dispositivo</translation>
+ </message>
+ <message>
+ <source>Tools &gt; Printer Information</source>
+ <translation>Ferramentas &gt; Informação da impressora</translation>
+ </message>
+ <message>
+ <source>Tools &gt; Print Test Page</source>
+ <translation>Ferramentas &gt; Imprimir página de teste</translation>
+ </message>
+ <message>
+ <source>Printer Name:</source>
+ <translation>Nome da impressora:</translation>
+ </message>
+ <message>
+ <source>Print &gt;&gt;</source>
+ <translation>Imprimir &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>Print...</source>
+ <translation>Imprimir…</translation>
+ </message>
+ <message>
+ <source>Scan &gt;&gt;</source>
+ <translation>Digitalizar &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>Scan...</source>
+ <translation>Digitalizar…</translation>
+ </message>
+ <message>
+ <source>Access Photo Cards &gt;&gt;</source>
+ <translation>Acessar cartões de foto &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>Access Photo Cards...</source>
+ <translation>Acessar os cartões de foto...</translation>
+ </message>
+ <message>
+ <source>Send Fax &gt;&gt;</source>
+ <translation>Enviar fax &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>Send Fax...</source>
+ <translation>Enviar fax...</translation>
+ </message>
+ <message>
+ <source>Make Copies &gt;&gt;</source>
+ <translation>Fazer cópias &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>Make Copies...</source>
+ <translation>Fazer cópias...</translation>
+ </message>
+ <message>
+ <source>Device Settings...</source>
+ <translation>Configurações do dispositivo…</translation>
+ </message>
+ <message>
+ <source>Refresh Device</source>
+ <translation>Atualizar dispositivo</translation>
+ </message>
+ <message>
+ <source>Refresh All</source>
+ <translation>Atualizar tudo</translation>
+ </message>
+ <message>
+ <source>HP Device Manager - %1</source>
+ <translation>HP Device Manager - %1</translation>
+ </message>
+ <message>
+ <source>Refreshing Device List - HP Device Manager</source>
+ <translation>Atualizando a lista de dispositivos – HP Device Manager</translation>
+ </message>
+ <message>
+ <source>Refreshing device list...</source>
+ <translation>Atualizando a lista de dispositivos...</translation>
+ </message>
+ <message>
+ <source>Press F6 to refresh.</source>
+ <translation>Pressione F6 para atualizar.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Photocards on your printer are only available by mounting them as drives using USB mass storage.&lt;/b&gt;&lt;p&gt;Please refer to your distribution&apos;s documentation for setup and usage instructions.</source>
+ <translation>&lt;p&gt;&lt;b&gt; Os cartões de foto na impressora estão disponíveis apenas montando-os como unidades de disco utilizando o recurso de armazenamento em massa USB.&lt;/b&gt;&lt;p&gt;Consulte a documentação de sua distribuição para obter instruções de configuração e utilização.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Unable to run command. No command specified.&lt;/b&gt;&lt;p&gt;Use &lt;pre&gt;Configure...&lt;/pre&gt; to specify a command to run.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Não foi possível executar o comando. Nenhum comando especificado.&lt;/b&gt;&lt;p&gt;Utilize &lt;pre&gt;Configurar...&lt;/pre&gt; para especificar um comando para execução.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Unable to find an appropriate su/sudo utility to run hp-setup.&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Não foi possível encontrar um utilitário su/sudo adequado para executar o programa de instalação da HP.&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Annoying Confirmation: Are you sure you want to remove this device?&lt;/b&gt;</source>
+<translation>&lt;b&gt;Confirmação: Tem certeza de que deseja remover este dispositivo?&lt;/b&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>DevMgr4_base</name>
+ <message>
+ <source>HP Device Manager</source>
+ <translation>HP Device Manager</translation>
+ </message>
+ <message>
+ <source>Functions</source>
+ <translation>Funções</translation>
+ </message>
+ <message>
+ <source>Status</source>
+ <translation>Status</translation>
+ </message>
+ <message>
+ <source>Supplies</source>
+ <translation>Suprimentos</translation>
+ </message>
+ <message>
+ <source>Tools</source>
+ <translation>Ferramentas</translation>
+ </message>
+ <message>
+ <source>Print Settings</source>
+ <translation>Configurações de impressão</translation>
+ </message>
+ <message>
+ <source>Print Control</source>
+ <translation>Controle de impressão</translation>
+ </message>
+ <message>
+ <source>Contents</source>
+ <translation>Conteúdo</translation>
+ </message>
+ <message>
+ <source>&amp;Contents...</source>
+ <translation>&amp;Conteúdo...</translation>
+ </message>
+ <message>
+ <source>Help Contents (F1)</source>
+ <translation>Conteúdo da Ajuda (F1)</translation>
+ </message>
+ <message>
+ <source>F1</source>
+ <translation>F1</translation>
+ </message>
+ <message>
+ <source>Index</source>
+ <translation>Ãndice</translation>
+ </message>
+ <message>
+ <source>&amp;Index...</source>
+ <translation>&amp;Ãndice...</translation>
+ </message>
+ <message>
+ <source>&amp;About...</source>
+ <translation>&amp;Sobre...</translation>
+ </message>
+ <message>
+ <source>About HP Device Manager...</source>
+ <translation>Sobre o HP Device Manager...</translation>
+ </message>
+ <message>
+ <source>Refresh Device</source>
+ <translation>Atualizar dispositivo</translation>
+ </message>
+ <message>
+ <source>Refresh Device (F5)</source>
+ <translation>Atualizar dispositivo (F5)</translation>
+ </message>
+ <message>
+ <source>F5</source>
+ <translation>F5</translation>
+ </message>
+ <message>
+ <source>Exit</source>
+ <translation>Sair</translation>
+ </message>
+ <message>
+ <source>Exit HP Device Manager</source>
+ <translation>Sair do HP Device Manager</translation>
+ </message>
+ <message>
+ <source>Ctrl+Q</source>
+ <translation>Ctrl+Q</translation>
+ </message>
+ <message>
+ <source>Popup Alerts...</source>
+ <translation>Alertas pop-up...</translation>
+ </message>
+ <message>
+ <source>Popup alerts...</source>
+ <translation>Alertas pop-up...</translation>
+ </message>
+ <message>
+ <source>Configure popup alerts</source>
+ <translation>Configurar alertas pop-up</translation>
+ </message>
+ <message>
+ <source>Email alerts...</source>
+ <translation>Alertas de e-mail…</translation>
+ </message>
+ <message>
+ <source>Configure email alerts</source>
+ <translation>Configurar alertas de e-mail</translation>
+ </message>
+ <message>
+ <source>Settings...</source>
+ <translation>Configurações...</translation>
+ </message>
+ <message>
+ <source>F2</source>
+ <translation>F2</translation>
+ </message>
+ <message>
+ <source>Refresh All</source>
+ <translation>Atualizar tudo</translation>
+ </message>
+ <message>
+ <source>F6</source>
+ <translation>F6</translation>
+ </message>
+ <message>
+ <source>Auto Refresh</source>
+ <translation>Atualização automática</translation>
+ </message>
+ <message>
+ <source>Turn on/off Auto Refresh (Ctrl+A)</source>
+ <translation>Ativar/desativar Atualização automática (Ctrl+A)</translation>
+ </message>
+ <message>
+ <source>Ctrl+A</source>
+ <translation>Ctrl+A</translation>
+ </message>
+ <message>
+ <source>Action</source>
+ <translation>Ação</translation>
+ </message>
+ <message>
+ <source>Device Settings (F3)</source>
+ <translation>Configurações de dispositivos (F3)</translation>
+ </message>
+ <message>
+ <source>F3</source>
+ <translation>F3</translation>
+ </message>
+ <message>
+ <source>Support...</source>
+ <translation>Suporte...</translation>
+ </message>
+ <message>
+ <source>Setup New Device...</source>
+ <translation>Instalar novo dispositivo…</translation>
+ </message>
+ <message>
+ <source>Ins</source>
+ <translation>Ins</translation>
+ </message>
+ <message>
+ <source>Remove Device...</source>
+ <translation>Remover dispositivo...</translation>
+ </message>
+ <message>
+ <source>Del</source>
+ <translation>Del</translation>
+ </message>
+ <message>
+ <source>Device</source>
+ <translation>Dispositivo</translation>
+ </message>
+ <message>
+ <source>Configure</source>
+ <translation>Configurar</translation>
+ </message>
+ <message>
+ <source>&amp;Help</source>
+ <translation>&amp;Ajuda</translation>
+ </message>
+</context>
+<context>
+ <name>FaxAddrBookEditForm</name>
+ <message>
+ <source>New Fax Group</source>
+ <translation type="obsolete">Novo grupo de fax</translation>
+ </message>
+ <message>
+ <source>New Group Name:</source>
+ <translation type="obsolete">Nome do novo grupo:</translation>
+ </message>
+</context>
+<context>
+ <name>FaxAddrBookEditForm_base</name>
+ <message>
+ <source>Group Name</source>
+ <translation>Nome do grupo</translation>
+ </message>
+ <message>
+ <source>HP Device Manager - Fax Address Book Entry</source>
+ <translation>HP Device Manager - Entrada na Agenda de fax</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Cancelar</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>First Name:</source>
+ <translation>Nome:</translation>
+ </message>
+ <message>
+ <source>New Group...</source>
+ <translation type="obsolete">Novo grupo…</translation>
+ </message>
+ <message>
+ <source>Member of Group(s):</source>
+ <translation>Membro do(s) grupo(s):</translation>
+ </message>
+ <message>
+ <source>Last Name:</source>
+ <translation>Sobrenome:</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Fax Number:&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Fax:&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Notes/Other Information:</source>
+ <translation>Notas/Outras informações:</translation>
+ </message>
+ <message>
+ <source>Title:</source>
+ <translation>Cargo:</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Nickname:&lt;/b&gt;</source>
+ <translation type="obsolete">&lt;b&gt;Apelido:&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Note: Items in &lt;b&gt;bold&lt;/b&gt; are required fields.</source>
+ <translation>Nota: Os itens em &lt;b&gt;negrito&lt;/b&gt; são campos obrigatórios.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Name/Nickname:&lt;/b&gt;</source>
+<translation>&lt;b&gt;Nome/apelido:&lt;/b&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>FaxAddrBookForm</name>
+ <message>
+ <source>New...</source>
+ <translation>Novo...</translation>
+ </message>
+ <message>
+ <source>Edit...</source>
+ <translation>Editar...</translation>
+ </message>
+ <message>
+ <source>Delete...</source>
+ <translation>Excluir…</translation>
+ </message>
+ <message>
+ <source>Refresh List</source>
+ <translation>Atualizar lista</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Annoying Confirmation: Are you sure you want to delete this address book entry?&lt;/b&gt;</source>
+<translation>&lt;b&gt;Confirmação: Tem certeza de que deseja excluir essa entrada da agenda?&lt;/b&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>FaxAddrBookForm_base</name>
+ <message>
+ <source>Nickname</source>
+ <translation>Apelido</translation>
+ </message>
+ <message>
+ <source>Title</source>
+ <translation>Cargo</translation>
+ </message>
+ <message>
+ <source>First Name</source>
+ <translation>Nome</translation>
+ </message>
+ <message>
+ <source>Last Name</source>
+ <translation>Sobrenome</translation>
+ </message>
+ <message>
+ <source>Fax Number</source>
+ <translation>Fax</translation>
+ </message>
+ <message>
+ <source>Member of Group(s)</source>
+ <translation>Membro do(s) grupo(s)</translation>
+ </message>
+ <message>
+ <source>Notes/Other Information</source>
+ <translation>Notas/Outras informações</translation>
+ </message>
+ <message>
+ <source>HP Device Manager - Fax Address Book</source>
+ <translation>HP Device Manager - Agenda de fax</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>New...</source>
+ <translation>Novo...</translation>
+ </message>
+ <message>
+ <source>Edit...</source>
+ <translation>Editar...</translation>
+ </message>
+ <message>
+ <source>Delete...</source>
+ <translation>Excluir…</translation>
+ </message>
+ <message>
+ <source>Groups...</source>
+ <translation>Grupos...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Fax Addresses:&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Endereços de fax:&lt;/b&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>FaxAddrBookGroupEditForm_base</name>
+ <message>
+ <source>Group Members</source>
+ <translation>Membros do grupo</translation>
+ </message>
+ <message>
+ <source>HP Device Manager - Fax Address Book Group</source>
+ <translation>HP Device Manager - Grupo da Agenda de fax</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Group Name:&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Nome do grupo:&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Member Address Book Entries:&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Entradas na Agenda do membro:&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Cancelar</translation>
+ </message>
+</context>
+<context>
+ <name>FaxAddrBookGroupsForm</name>
+ <message>
+ <source>New...</source>
+ <translation>Novo...</translation>
+ </message>
+ <message>
+ <source>Edit...</source>
+ <translation>Editar...</translation>
+ </message>
+ <message>
+ <source>Delete...</source>
+ <translation>Excluir…</translation>
+ </message>
+ <message>
+ <source>Refresh List</source>
+ <translation>Atualizar lista</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Annoying Confirmation: Are you sure you want to delete this group?&lt;/b&gt;</source>
+<translation>&lt;b&gt;Confirmação: Tem certeza de que deseja excluir este grupo?&lt;/b&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>FaxAddrBookGroupsForm_base</name>
+ <message>
+ <source>Group Name</source>
+ <translation>Nome do grupo</translation>
+ </message>
+ <message>
+ <source>Group Members</source>
+ <translation>Membros do grupo</translation>
+ </message>
+ <message>
+ <source>HP Device Manager - Fax Address Book Groups</source>
+ <translation>HP Device Manager - Grupos da Agenda de fax</translation>
+ </message>
+ <message>
+ <source>New...</source>
+ <translation>Novo...</translation>
+ </message>
+ <message>
+ <source>Delete...</source>
+ <translation>Excluir…</translation>
+ </message>
+ <message>
+ <source>Edit...</source>
+ <translation>Editar...</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Groups:&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Grupos:&lt;/b&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>FaxSendJobForm</name>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;You may not specify both a printer (-p) and a device (-d).</source>
+ <translation>&lt;p&gt;&lt;b&gt;Não é possível especificar uma impressora (-p) e um dispositivo (-d).</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Unknown printer name: %1&lt;/b&gt;&lt;p&gt;Please check the printer name and try again.</source>
+ <translation>&lt;b&gt;Nome de impressora desconhecido: %1&lt;/b&gt;&lt;p&gt;Verifique o nome da impressora e tente novamente.</translation>
+ </message>
+ <message>
+ <source>You must specify a printer that has a device URI in the form &apos;hpfax:/...&apos;</source>
+ <translation>É necessário especificar a impressora que tenha um URI de dispositivo na forma &apos;hpfax:/...&apos;</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;No devices found.&lt;/b&gt;&lt;p&gt;Please make sure your device is properly installed and try again.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Nenhum dispositivo encontrado.&lt;p&gt;&lt;b&gt;Verifique se o dispositivo está instalado corretamente e tente novamente.</translation>
+ </message>
+ <message>
+ <source>HP Device Manager - Send Fax</source>
+ <translation>HP Device Manager - Enviar fax</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Fax send completed successfully.&lt;/b&gt;</source>
+ <translation>&lt;p&gt;&lt;b&gt;Fax enviado com êxito.&lt;/b&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>FaxSettingsForm_base</name>
+ <message>
+ <source>HP Device Manager - Fax Settings</source>
+ <translation>HP Device Manager - Configurações de fax</translation>
+ </message>
+ <message>
+ <source>Fax Header Information</source>
+ <translation>Informação do cabeçalho do fax</translation>
+ </message>
+ <message>
+ <source>Device Fax Number:</source>
+ <translation>Fax do dispositivo:</translation>
+ </message>
+ <message>
+ <source>Name and/or Company:</source>
+ <translation>Nome e/ou empresa:</translation>
+ </message>
+ <message>
+ <source>&lt;i&gt;This information will appear at the top of each fax that you send.&lt;/i&gt;</source>
+ <translation>&lt;i&gt;Essas informações aparecerão no cabeçalho de todos os fax enviados.&lt;/i&gt;</translation>
+ </message>
+ <message>
+ <source>Coverpage Information</source>
+ <translation>Informação da folha de rosto</translation>
+ </message>
+ <message>
+ <source>Voice phone number:</source>
+ <translation>Telefone:</translation>
+ </message>
+ <message>
+ <source>Email address:</source>
+ <translation>Endereço de e-mail:</translation>
+ </message>
+ <message>
+ <source>&lt;i&gt;This information will appear on any coverpage that you send.&lt;/i&gt;</source>
+ <translation>&lt;i&gt;Essas informações aparecerão em todas as folhas de rosto enviadas.&lt;/i&gt;</translation>
+ </message>
+ <message>
+ <source>Information</source>
+ <translation>Informações</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Configure device settings for sending faxes.&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Defina as configurações do dispositivo para enviar fax.&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Cancelar</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+</context>
+<context>
+ <name>ImagePropertiesDlg_base</name>
+ <message>
+ <source>EXIF Labels</source>
+ <translation>Rótulos EXIF</translation>
+ </message>
+ <message>
+ <source>Contents </source>
+ <translation>Conteúdo</translation>
+ </message>
+ <message>
+ <source>Properties for</source>
+ <translation>Propriedades de</translation>
+ </message>
+ <message>
+ <source>MIME Type:</source>
+ <translation>Tipo MIME:</translation>
+ </message>
+ <message>
+ <source>Size:</source>
+ <translation>Tamanho:</translation>
+ </message>
+ <message>
+ <source>Location:</source>
+ <translation>Local:</translation>
+ </message>
+ <message>
+ <source>LOCATION</source>
+ <translation>LOCAL</translation>
+ </message>
+ <message>
+ <source>MIME TYPE</source>
+ <translation>TIPO MIME</translation>
+ </message>
+ <message>
+ <source>SIZE</source>
+ <translation>TAMANHO</translation>
+ </message>
+ <message>
+ <source>FILENAME</source>
+ <translation>NOME DE ARQUIVO</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+</context>
+<context>
+ <name>LoadPaperForm_base</name>
+ <message>
+ <source>HP Device Manager - Load Plain Paper</source>
+ <translation>HP Device Manager - Carregar papel comum</translation>
+ </message>
+ <message>
+ <source>Continue</source>
+ <translation>Continuar</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Cancelar</translation>
+ </message>
+ <message>
+ <source>A page will be printed. Please load &lt;b&gt;plain paper&lt;/b&gt; in the printer and then press continue.</source>
+ <translation>Será impressa uma página. Carregue &lt;b&gt;papel comum&lt;/b&gt; na impressora e pressione Continuar.</translation>
+ </message>
+</context>
+<context>
+ <name>MakeCopiesForm</name>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;You may not specify both a printer (-p) and a device (-d).</source>
+ <translation>&lt;p&gt;&lt;b&gt;Não é possível especificar uma impressora (-p) e um dispositivo (-d).</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;No devices found.&lt;/b&gt;&lt;p&gt;Please make sure your device is properly installed and try again.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Nenhum dispositivo encontrado.&lt;p&gt;&lt;b&gt;Verifique se o dispositivo está instalado corretamente e tente novamente.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Sorry, make copies functionality is not implemented for this device.&lt;/b&gt;</source>
+ <translation>&lt;b&gt;A funcionalidade Fazer cópias não foi implementada para este dispositivo.&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>HP Device Manager - Make Copies</source>
+ <translation>HP Device Manager - Fazer cópias</translation>
+ </message>
+</context>
+<context>
+ <name>MakeCopiesForm_base</name>
+ <message>
+ <source>HP Device Manager - Make Copies</source>
+ <translation>HP Device Manager - Fazer cópias</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Fechar</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Make copies.&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Fazer cópias.&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Make Copies</source>
+ <translation>Fazer cópias</translation>
+ </message>
+ <message>
+ <source>Quality:</source>
+ <translation>Qualidade:</translation>
+ </message>
+ <message>
+ <source>Fast</source>
+ <translation>Rápido</translation>
+ </message>
+ <message>
+ <source>Draft</source>
+ <translation>Rascunho</translation>
+ </message>
+ <message>
+ <source>Normal</source>
+ <translation>Normal</translation>
+ </message>
+ <message>
+ <source>Presentation</source>
+ <translation>Apresentação</translation>
+ </message>
+ <message>
+ <source>Best</source>
+ <translation>Melhor</translation>
+ </message>
+ <message>
+ <source>Number of Copies:</source>
+ <translation>Número de cópias:</translation>
+ </message>
+ <message>
+ <source>Contrast:</source>
+ <translation>Contraste:</translation>
+ </message>
+ <message>
+ <source>+0</source>
+ <translation>+0</translation>
+ </message>
+ <message>
+ <source>Enlargement/Reduction:</source>
+ <translation>Ampliação/redução:</translation>
+ </message>
+ <message>
+ <source>400%</source>
+ <translation>400%</translation>
+ </message>
+ <message>
+ <source>Fit to page</source>
+ <translation>Ajustar à página</translation>
+ </message>
+ <message>
+ <source>Copy</source>
+ <translation>Copiar</translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation>Nome:</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Device information/status and output queue name.&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Informação/status do dispositivo e nome da fila de saída.&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Status:</source>
+ <translation>Status:</translation>
+ </message>
+ <message>
+ <source>Refresh status</source>
+ <translation>Atualizar status</translation>
+ </message>
+ <message>
+ <source>Comment:</source>
+ <translation>Comentário:</translation>
+ </message>
+ <message>
+ <source>Location:</source>
+ <translation>Local:</translation>
+ </message>
+ <message>
+ <source>Device URI:</source>
+ <translation>URI do dispositivo:</translation>
+ </message>
+ <message>
+ <source>Device</source>
+ <translation>Dispositivo</translation>
+ </message>
+</context>
+<context>
+ <name>NoDevicesForm</name>
+ <message>
+ <source>&lt;b&gt;Unable to find an appropriate su/sudo utility to run hp-setup.&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Não foi possível encontrar um utilitário su/sudo adequado para executar o programa de instalação da HP.&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;An I/O error occurred.&lt;/b&gt;&lt;p&gt;Please re-start the Device Manager and try again.</source>
+<translation>&lt;b&gt;Ocorreu um erro de E/S.&lt;/b&gt;&lt;p&gt;Reinicie o Device Manager (Gerenciador de dispositivos) e tente novamente.</translation>
+ </message>
+</context>
+<context>
+ <name>NoDevicesForm_base</name>
+ <message>
+ <source>HP Device Manager - No Installed HP Devices Found</source>
+ <translation>HP Device Manager - Nenhum dispositivo HP encontrado</translation>
+ </message>
+ <message>
+ <source>Setup Device...</source>
+ <translation>Instalar dispositivo…</translation>
+ </message>
+ <message>
+ <source>CUPS Web Interface</source>
+ <translation>Interface Web CUPS</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Fechar</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;&lt;font size=&quot;+2&quot;&gt;No Installed HP Devices Found.&lt;/font&gt;&lt;/b&gt;&lt;p&gt;To install a device, use one of the following methods:&lt;p&gt;
+1.Run &lt;b&gt;hp-setup&lt;/b&gt; (in a shell/terminal or click &lt;tt&gt;Setup Device...&lt;/tt&gt; below).&lt;p&gt;
+2. &lt;b&gt;CUPS web interface&lt;/b&gt; (open a browser to: &lt;u&gt;http://localhost:631&lt;/u&gt; or press the button below),&lt;p&gt;
+3. The &lt;b&gt;printer installation utility&lt;/b&gt; that came with your operating system (YaST, PrinterDrake, etc).
+&lt;p&gt;&lt;p&gt;After setting up a printer, you may have to press &lt;tt&gt;F6&lt;/tt&gt; or chose &lt;tt&gt;Device | Refresh All&lt;/tt&gt; for the printer to appear in the HP Device Manager.&lt;p&gt;
+&lt;i&gt;&lt;b&gt;Note: Only devices installed with the &lt;tt&gt;hp:&lt;/tt&gt; CUPS backend will appear in the HP Device Manager.&lt;/b&gt;&lt;/i&gt;&lt;p&gt;</source>
+ <translation>&lt;b&gt;&lt;font size=&quot;+2&quot;&gt;Nenhum dispositivo HP encontrado.&lt;/font&gt;&lt;/b&gt;&lt;p&gt;Para instalar um dispositivo, utilize um dos métodos a seguir:&lt;p&gt;
+1.Execute o &lt;b&gt;programa de instalação da HP&lt;/b&gt; (em um shell/terminal ou clique em &lt;tt&gt;Instalar dispositivo...&lt;/tt&gt; abaixo).&lt;p&gt;
+2. &lt;b&gt;Interface Web CUPS&lt;/b&gt; (abra um navegador em: &lt;u&gt;http://localhost:631&lt;/u&gt; ou pressione o botão abaixo),&lt;p&gt;
+3. O &lt;b&gt;utilitário de instalação da impressora&lt;/b&gt; fornecido com o sistema operacional (YaST, PrinterDrake, etc).
+&lt;p&gt;&lt;p&gt;Após instalar uma impressora, pode ser necessário pressionar &lt;tt&gt;F6&lt;/tt&gt; ou escolher &lt;tt&gt;Dispositivo | Atualizar tudo&lt;/tt&gt; para que a impressora apareça no HP Device Manager.&lt;p&gt;
+&lt;i&gt;&lt;b&gt;Nota: Apenas dispositivos instalados com o back-end &lt;tt&gt;hp:&lt;/tt&gt; CUPS aparecerão no HP Device Manager.&lt;/b&gt;&lt;/i&gt;&lt;p&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>PaperEdgeAlignForm_base</name>
+ <message>
+ <source>HP Device Manager - Paper Edge Alignment</source>
+ <translation>HP Device Manager - Alinhamento da borda do papel</translation>
+ </message>
+ <message>
+ <source>Next &gt;</source>
+ <translation>Avançar &gt;</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Cancelar</translation>
+ </message>
+ <message>
+ <source>Paper Edge</source>
+ <translation>Borda do papel</translation>
+ </message>
+ <message>
+ <source>1</source>
+ <translation>1</translation>
+ </message>
+ <message>
+ <source>2</source>
+ <translation>2</translation>
+ </message>
+ <message>
+ <source>3</source>
+ <translation>3</translation>
+ </message>
+ <message>
+ <source>4</source>
+ <translation>4</translation>
+ </message>
+ <message>
+ <source>5</source>
+ <translation>5</translation>
+ </message>
+ <message>
+ <source>6</source>
+ <translation>6</translation>
+ </message>
+ <message>
+ <source>7</source>
+ <translation>7</translation>
+ </message>
+ <message>
+ <source>8</source>
+ <translation>8</translation>
+ </message>
+ <message>
+ <source>9</source>
+ <translation>9</translation>
+ </message>
+ <message>
+ <source>10</source>
+ <translation>10</translation>
+ </message>
+ <message>
+ <source>11</source>
+ <translation>11</translation>
+ </message>
+ <message>
+ <source>12</source>
+ <translation>12</translation>
+ </message>
+ <message>
+ <source>13</source>
+ <translation>13</translation>
+ </message>
+ <message>
+ <source>Choose the &lt;b&gt;numbered arrow&lt;/b&gt; that &lt;b&gt;best &lt;/b&gt;marks the edge of the paper.</source>
+ <translation>Escolha a &lt;b&gt;seta numerada&lt;/b&gt; que &lt;b&gt;melhor &lt;/b&gt;marque a borda do papel.</translation>
+ </message>
+</context>
+<context>
+ <name>PasswordDialog</name>
+ <message>
+ <source>HP Device Manager - Enter Password</source>
+ <translation>HP Device Manager - Digitar senha</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+</context>
+<context>
+ <name>PowerSettingsDialog</name>
+ <message>
+ <source>15 minutes</source>
+ <translation>15 minutos</translation>
+ </message>
+ <message>
+ <source>30 minutes</source>
+ <translation>30 minutos</translation>
+ </message>
+ <message>
+ <source>45 minutes</source>
+ <translation>45 minutos</translation>
+ </message>
+ <message>
+ <source>1 hour</source>
+ <translation>1 hora</translation>
+ </message>
+ <message>
+ <source>2 hours</source>
+ <translation>2 horas</translation>
+ </message>
+ <message>
+ <source>3 hours</source>
+ <translation>3 horas</translation>
+ </message>
+</context>
+<context>
+ <name>PowerSettingsDialog_base</name>
+ <message>
+ <source>HP Device Manager - Battery Mode Power Settings</source>
+ <translation>HP Device Manager - Configurações de energia do modo Bateria</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Configure the power off settings when operating on battery power&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Defina as configurações de desligamento ao operar com bateria&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Cancelar</translation>
+ </message>
+ <message>
+ <source>Power Settings</source>
+ <translation>Configurações de energia</translation>
+ </message>
+ <message>
+ <source>Automatically turn off printer after:</source>
+ <translation>Desligar automaticamente a impressora após:</translation>
+ </message>
+ <message>
+ <source>Always leave printer on</source>
+ <translation>Deixar a impressora sempre ligada</translation>
+ </message>
+</context>
+<context>
+ <name>PrinterForm</name>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;You may not specify both a printer (-p) and a device (-d).</source>
+ <translation>&lt;p&gt;&lt;b&gt;Não é possível especificar uma impressora (-p) e um dispositivo (-d).</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;No devices found.&lt;/b&gt;&lt;p&gt;Please make sure your device is properly installed and try again.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Nenhum dispositivo encontrado.&lt;p&gt;&lt;b&gt;Verifique se o dispositivo está instalado corretamente e tente novamente.</translation>
+ </message>
+ <message>
+ <source>HP Device Manager - Print</source>
+ <translation>HP Device Manager - Imprimir</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollCopyView</name>
+ <message>
+ <source>Number of Copies</source>
+<translation>Número de cópias</translation>
+ </message>
+ <message>
+ <source>Enlargement, Reduction and Fit to Page</source>
+<translation>Ampliação, redução e ajuste à página</translation>
+ </message>
+ <message>
+ <source>Copy Contrast</source>
+<translation>Contraste da cópia</translation>
+ </message>
+ <message>
+ <source>Copy Quality</source>
+<translation>Qualidade da cópia</translation>
+ </message>
+ <message>
+ <source>&lt;&lt; Functions</source>
+<translation>&lt;&lt; Funções</translation>
+ </message>
+ <message>
+ <source>Close</source>
+<translation>Fechar</translation>
+ </message>
+ <message>
+ <source>Make Copies(s)</source>
+<translation>Fazer cópias</translation>
+ </message>
+ <message>
+ <source>Number of copies:</source>
+<translation>Número de cópias:</translation>
+ </message>
+ <message>
+ <source>Default</source>
+<translation>Padrão</translation>
+ </message>
+ <message>
+ <source>Quality:</source>
+<translation>Qualidade:</translation>
+ </message>
+ <message>
+ <source>Fast</source>
+<translation>Rápido</translation>
+ </message>
+ <message>
+ <source>Draft</source>
+<translation>Rascunho</translation>
+ </message>
+ <message>
+ <source>Normal</source>
+<translation>Normal</translation>
+ </message>
+ <message>
+ <source>Presentation</source>
+<translation>Apresentação</translation>
+ </message>
+ <message>
+ <source>Best</source>
+<translation>Melhor</translation>
+ </message>
+ <message>
+ <source>Enlargement or reduction (percent):</source>
+<translation>Ampliação ou redução (porcentagem):</translation>
+ </message>
+ <message>
+ <source>Fit to Page</source>
+<translation>Ampliação, redução e ajuste à página</translation>
+ </message>
+ <message>
+ <source>Contrast (-5 lighter to +5 darker):</source>
+<translation>Contraste (de -5 mais claro a +5 mais escuro):</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Copier error.&lt;/b&gt;&lt;p&gt;</source>
+<translation>&lt;b&gt;Erro da copiadora.&lt;/b&gt;&lt;p&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Cannot copy: Device is busy or not available.&lt;/b&gt;&lt;p&gt;Please check device and try again. [1]</source>
+<translation>&lt;b&gt;Não é possível copiar: O dispositivo está ocupado ou indisponível.&lt;/b&gt;&lt;p&gt;Verifique o dispositivo e tente novamente. [1]</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollDeviceInfoView</name>
+ <message>
+ <source>&lt;&lt; Tools</source>
+ <translation>&lt;&lt; Ferramentas</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Fechar</translation>
+ </message>
+ <message>
+ <source>Device Information</source>
+ <translation>Informações do dispositivo</translation>
+ </message>
+ <message>
+ <source>Static/Dynamic</source>
+ <translation>Estático/Dinâmico</translation>
+ </message>
+ <message>
+ <source>Key</source>
+ <translation>Chave</translation>
+ </message>
+ <message>
+ <source>Value</source>
+ <translation>Valor</translation>
+ </message>
+ <message>
+ <source>Static</source>
+ <translation>Estático</translation>
+ </message>
+ <message>
+ <source>Dynamic</source>
+ <translation>Dinâmico</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollFaxView</name>
+ <message>
+ <source>PDF Document</source>
+ <translation>Documento PDF</translation>
+ </message>
+ <message>
+ <source>Postscript Document</source>
+ <translation>Documento Postscript</translation>
+ </message>
+ <message>
+ <source>HP Graphics Language File</source>
+ <translation>Arquivo de linguagem de gráficos HP</translation>
+ </message>
+ <message>
+ <source>C Shell Script</source>
+ <translation>Script Shell C</translation>
+ </message>
+ <message>
+ <source>C Source Code</source>
+ <translation>Código-fonte C</translation>
+ </message>
+ <message>
+ <source>C++ Source Code</source>
+ <translation>Código-fonte C++</translation>
+ </message>
+ <message>
+ <source>Perl Script</source>
+ <translation>Script Perl</translation>
+ </message>
+ <message>
+ <source>Python Program</source>
+ <translation>Programa Python</translation>
+ </message>
+ <message>
+ <source>Shell Script</source>
+ <translation>Script Shell</translation>
+ </message>
+ <message>
+ <source>Plain Text</source>
+ <translation>Texto comum</translation>
+ </message>
+ <message>
+ <source>HTML Dcoument</source>
+ <translation>Documento HTML</translation>
+ </message>
+ <message>
+ <source>GIF Image</source>
+ <translation>Imagem GIF</translation>
+ </message>
+ <message>
+ <source>PNG Image</source>
+ <translation>Imagem PNG</translation>
+ </message>
+ <message>
+ <source>JPEG Image</source>
+ <translation>Imagem JPEG</translation>
+ </message>
+ <message>
+ <source>TIFF Image</source>
+ <translation>Imagem TIFF</translation>
+ </message>
+ <message>
+ <source>Bitmap (BMP) Image</source>
+ <translation>Imagem Bitmap (BMP)</translation>
+ </message>
+ <message>
+ <source>Photo CD Image</source>
+ <translation>Imagem de CD de fotos</translation>
+ </message>
+ <message>
+ <source>Portable Image (PNM)</source>
+ <translation>Imagem portátil (PNM)</translation>
+ </message>
+ <message>
+ <source>Portable B&amp;W Image (PBM)</source>
+ <translation>Imagem portátil P&amp;B (PBM)</translation>
+ </message>
+ <message>
+ <source>Portable Grayscale Image (PGM)</source>
+ <translation>Imagem portátil em escala de cinza (PGM)</translation>
+ </message>
+ <message>
+ <source>Portable Color Image (PPM)</source>
+ <translation>Imagem portátil colorida (PPM)</translation>
+ </message>
+ <message>
+ <source>SGI RGB</source>
+ <translation>SGI RGB</translation>
+ </message>
+ <message>
+ <source>X11 Bitmap (XBM)</source>
+ <translation>X11 Bitmap (XBM)</translation>
+ </message>
+ <message>
+ <source>X11 Pixmap (XPM)</source>
+ <translation>X11 Pixmap (XPM)</translation>
+ </message>
+ <message>
+ <source>Sun Raster Format</source>
+ <translation>Formato Sun Raster</translation>
+ </message>
+ <message>
+ <source>File(s) to Fax</source>
+ <translation>Arquivo(s) a enviar por fax</translation>
+ </message>
+ <message>
+ <source>Add/Edit Fax Coverpage</source>
+ <translation>Acrescentar/editar folha de rosto do fax</translation>
+ </message>
+ <message>
+ <source>Recipient(s)</source>
+ <translation>Destinatário(s)</translation>
+ </message>
+ <message>
+ <source>Add Recipients from the Fax Address Book</source>
+ <translation>Acrescentar destinatários da Agenda de fax</translation>
+ </message>
+ <message>
+ <source>&lt;i&gt;Quick Add&lt;/i&gt; an Individual Recipient</source>
+ <translation>&lt;i&gt;Acréscimo rápido&lt;/i&gt;; de destinatário individual</translation>
+ </message>
+ <message>
+ <source>&lt;&lt; Functions</source>
+ <translation>&lt;&lt; Funções</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Fechar</translation>
+ </message>
+ <message>
+ <source>Send Fax Now</source>
+ <translation>Enviar fax agora</translation>
+ </message>
+ <message>
+ <source>Processing fax...</source>
+ <translation>Processando fax...</translation>
+ </message>
+ <message>
+ <source>Receiving fax data...</source>
+ <translation>Recebendo dados de fax...</translation>
+ </message>
+ <message>
+ <source>Read %1 of fax data...</source>
+ <translation>Lidos %1 dos dados de fax…</translation>
+ </message>
+ <message>
+ <source>Order</source>
+ <translation>Ordem</translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation>Nome</translation>
+ </message>
+ <message>
+ <source>Type</source>
+ <translation>Tipo</translation>
+ </message>
+ <message>
+ <source>Pages</source>
+ <translation>Páginas</translation>
+ </message>
+ <message>
+ <source>Path</source>
+ <translation>Caminho</translation>
+ </message>
+ <message>
+ <source>Add File...</source>
+ <translation>Acrescentar arquivo...</translation>
+ </message>
+ <message>
+ <source>Show Types...</source>
+ <translation>Mostrar tipos...</translation>
+ </message>
+ <message>
+ <source>Remove File</source>
+ <translation>Remover arquivo</translation>
+ </message>
+ <message>
+ <source>Move Down</source>
+ <translation>Mover para baixo</translation>
+ </message>
+ <message>
+ <source>Move Up</source>
+ <translation>Mover para cima</translation>
+ </message>
+ <message>
+ <source>Show File Types...</source>
+ <translation>Mostrar tipos de arquivo...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Invalid HPLIP Fax file.&lt;/b&gt;&lt;p&gt;Bad magic!</source>
+ <translation>&lt;b&gt;Arquivo de fax HPLIP inválido.&lt;/b&gt;&lt;p&gt;Falha!</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;You are trying to add a file that cannot be directly faxed with this utility.&lt;/b&gt;&lt;p&gt;To print this file, use the print command in the application that created it.</source>
+ <translation>&lt;b&gt;Você está tentando acrescentar um arquivo que não pode ser enviado diretamente por fax com este utilitário.&lt;/b&gt;&lt;p&gt;Para imprimir este arquivo, utilize o comando de impressão no aplicativo que o criou.</translation>
+ </message>
+ <message>
+ <source>Processing fax file...</source>
+ <translation>Processando arquivo de fax...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Printer &apos;%1&apos; is in a stopped or error state.&lt;/b&gt;&lt;p&gt;Check the printer queue in CUPS and try again.</source>
+ <translation>A &lt;b&gt;Impressora &apos;%1&apos; está em um estado parado ou de erro.&lt;/b&gt;&lt;p&gt;Verifique a fila de impressoras no CUPS e tente novamente.</translation>
+ </message>
+ <message>
+ <source>Edit...</source>
+ <translation>Editar...</translation>
+ </message>
+ <message>
+ <source>Add...</source>
+ <translation>Acrescentar...</translation>
+ </message>
+ <message>
+ <source>HP Fax Coverpage</source>
+ <translation>Folha de rosto de fax HP</translation>
+ </message>
+ <message>
+ <source>Cover Page</source>
+ <translation>Folha de rosto</translation>
+ </message>
+ <message>
+ <source>Fax Number</source>
+ <translation>Fax</translation>
+ </message>
+ <message>
+ <source>Notes</source>
+ <translation>Notas</translation>
+ </message>
+ <message>
+ <source>Fax Address Book...</source>
+ <translation>Agenda de fax...</translation>
+ </message>
+ <message>
+ <source>Remove</source>
+ <translation>Remover</translation>
+ </message>
+ <message>
+ <source>Add Individual</source>
+ <translation>Acrescentar indivíduo</translation>
+ </message>
+ <message>
+ <source>Add Group</source>
+ <translation>Acrescentar grupo</translation>
+ </message>
+ <message>
+ <source>Add an &lt;b&gt;individual &lt;/b&gt;from the fax address book:</source>
+ <translation>Acrescentar um &lt;b&gt;indivíduo &lt;/b&gt;da Agenda de fax:</translation>
+ </message>
+ <message>
+ <source>Add a &lt;b&gt;group&lt;/b&gt; from the fax address book:</source>
+ <translation>Acrescentar um &lt;b&gt;grupo &lt;/b&gt;da Agenda de fax:</translation>
+ </message>
+ <message>
+ <source>Add</source>
+ <translation>Acrescentar</translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation>Nome:</translation>
+ </message>
+ <message>
+ <source>Fax Number:</source>
+ <translation>Fax:</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Fax configuration error.&lt;/b&gt;&lt;p&gt;The CUPS fax queue for &apos;%1&apos; is incorrectly configured.&lt;p&gt;Please make sure that the CUPS fax queue is configured with the &apos;HPLIP Fax&apos; Model/Driver.</source>
+ <translation>&lt;b&gt;Erro de configuração de fax.&lt;/b&gt;&lt;p&gt;A fila de fax do CUPS para &apos;%1&apos; está configurada incorretamente.&lt;p&gt;Verifique se a fila de fax do CUPS está configurada com o Modelo/driver &apos;HPLIP Fax&apos;.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Device is busy or in an error state (code=%1)&lt;/b&gt;&lt;p&gt;Please wait for the device to become idle or clear the error and try again.</source>
+ <translation>&lt;b&gt;O dispositivo está ocupado ou em um estado de erro (código=%1)&lt;/b&gt;&lt;p&gt;Aguarde o dispositivo ficar ocioso ou limpe o erro e tente novamente.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;The CUPS queue for &apos;%1&apos; is in a stopped or busy state.&lt;/b&gt;&lt;p&gt;Please check the queue and try again.</source>
+ <translation>&lt;b&gt;A fila do CUPS para &apos;%1&apos; está em um estado parado ou ocupado&lt;/b&gt;&lt;p&gt;Verifique a fila e tente novamente.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Send fax is active.&lt;/b&gt;&lt;p&gt;Please wait for operation to complete.</source>
+ <translation>&lt;b&gt;Enviar fax está ativo.&lt;/b&gt;&lt;p&gt;Aguarde a conclusão da operação.</translation>
+ </message>
+ <message>
+ <source>Initializing...</source>
+ <translation>Inicializando...</translation>
+ </message>
+ <message>
+ <source>Processing page %1...</source>
+ <translation>Processando página %1…</translation>
+ </message>
+ <message>
+ <source>Dialing %1...</source>
+ <translation>Discando %1…</translation>
+ </message>
+ <message>
+ <source>Connecting to %1...</source>
+ <translation>Conectando a %1...</translation>
+ </message>
+ <message>
+ <source>Sending page %1 to %2...</source>
+ <translation>Enviando página %1 de %2...</translation>
+ </message>
+ <message>
+ <source>Cleaning up...</source>
+ <translation>Limpando...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Fax send error.&lt;/b&gt;&lt;p&gt;</source>
+ <translation>&lt;b&gt;Erro no envio do fax.&lt;/b&gt;&lt;p&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Fax device is busy.&lt;/b&gt;&lt;p&gt;Please try again later.</source>
+ <translation>&lt;b&gt;O dispositivo de fax está ocupado.&lt;/b&gt;&lt;p&gt;Tente novamente mais tarde.</translation>
+ </message>
+ <message>
+ <source>Added with Quick Add</source>
+<translation>Adicionado com Acréscimo rápido</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollFunctionsView</name>
+ <message>
+ <source>Print &gt;&gt;</source>
+ <translation>Imprimir &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>Print...</source>
+ <translation>Imprimir…</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Print&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Imprimir&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Print documents or files.</source>
+ <translation>Imprima documentos ou arquivos.</translation>
+ </message>
+ <message>
+ <source>Scan &gt;&gt;</source>
+ <translation>Digitalizar &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>Scan...</source>
+ <translation>Digitalizar…</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Scan&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Digitalizar&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Scan a document, image, or photograph.</source>
+ <translation>Digitalize um documento, uma imagem ou fotografia.</translation>
+ </message>
+ <message>
+ <source>Send PC Fax &gt;&gt;</source>
+ <translation>Enviar fax do PC &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>Send PC Fax...</source>
+ <translation>Enviar fax do PC…</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Send PC Fax&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Enviar fax do PC&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Send a fax from the PC.</source>
+ <translation>Envia um fax do computador.</translation>
+ </message>
+ <message>
+ <source>Make Copies &gt;&gt;</source>
+ <translation>Fazer cópias &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>Make Copies...</source>
+ <translation>Fazer cópias...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Make Copies&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Fazer cópias&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Make copies on the device controlled by the PC.</source>
+ <translation>Faça cópias no dispositivo controlado pelo computador.</translation>
+ </message>
+ <message>
+ <source>Unload Photo Card &gt;&gt;</source>
+ <translation>Descarregar cartão de foto &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>Unload Photo Card...</source>
+ <translation>Descarregar cartão de foto...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Unload Photo Card&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Descarregar cartão de foto&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Copy images from the device&apos;s photo card to the PC.</source>
+ <translation>Copie imagens do cartão de foto do dispositivo para o computador.</translation>
+ </message>
+ <message>
+ <source>ERROR: Device not supported.</source>
+ <translation>ERRO: Dispositivo não suportado.</translation>
+ </message>
+ <message>
+ <source>ERROR: Device not found. Please check connection and power-on device.</source>
+ <translation>ERRO: Dispositivo não encontrado. Verifique a conexão e ligue o dispositivo.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Photocards on your printer are only available by mounting them as drives using USB mass storage.&lt;/b&gt;&lt;p&gt;Please refer to your distribution&apos;s documentation for setup and usage instructions.</source>
+ <translation>&lt;p&gt;&lt;b&gt; Os cartões de foto na impressora estão disponíveis apenas montando-os como unidades de disco utilizando o recurso de armazenamento &lt;/b&gt;&lt;p&gt;Consulte a documentação de sua distribuição para obter instruções de configuração e utilização.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Unable to run command. No command specified.&lt;/b&gt;&lt;p&gt;Use &lt;pre&gt;Configure...&lt;/pre&gt; to specify a command to run.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Não foi possível executar o comando. Nenhum comando especificado.&lt;/b&gt;&lt;p&gt;Utilize &lt;pre&gt;Configurar...&lt;/pre&gt; para especificar um comando para execução.</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollPrintJobView</name>
+ <message>
+ <source>Pending</source>
+ <translation>Pendente</translation>
+ </message>
+ <message>
+ <source>On hold</source>
+ <translation>Em espera</translation>
+ </message>
+ <message>
+ <source>Printing</source>
+ <translation>Imprimindo</translation>
+ </message>
+ <message>
+ <source>Stopped</source>
+ <translation>Parado</translation>
+ </message>
+ <message>
+ <source>Canceled</source>
+ <translation>Cancelado</translation>
+ </message>
+ <message>
+ <source>Aborted</source>
+ <translation>Interrompido</translation>
+ </message>
+ <message>
+ <source>Completed</source>
+ <translation>Finalizado</translation>
+ </message>
+ <message>
+ <source>Print Control</source>
+ <translation>Controle de impressão</translation>
+ </message>
+ <message>
+ <source>Job Control</source>
+ <translation>Controle de trabalhos</translation>
+ </message>
+ <message>
+ <source>1 Active Print Job</source>
+ <translation>1 trabalho de impressão ativo</translation>
+ </message>
+ <message>
+ <source>%1 Active Print Jobs</source>
+ <translation>%1 trabalhos de impressão ativos</translation>
+ </message>
+ <message>
+ <source>Set as Default</source>
+ <translation>Definir como padrão</translation>
+ </message>
+ <message>
+ <source>SET AS DEFAULT</source>
+ <translation>DEFINIR COMO PADRÃO</translation>
+ </message>
+ <message>
+ <source>NOT SET AS DEFAULT</source>
+ <translation>NÃO DEFINIR COMO PADRÃO</translation>
+ </message>
+ <message>
+ <source>The printer is currently: %1</source>
+ <translation>A impressora atualmente está: %1</translation>
+ </message>
+ <message>
+ <source>IDLE</source>
+ <translation>OCIOSA</translation>
+ </message>
+ <message>
+ <source>Stop Printer</source>
+ <translation>Parar impressora</translation>
+ </message>
+ <message>
+ <source>PROCESSING</source>
+ <translation>PROCESSANDO</translation>
+ </message>
+ <message>
+ <source>STOPPED</source>
+ <translation>PARADA</translation>
+ </message>
+ <message>
+ <source>Start Printer</source>
+ <translation>Iniciar impressora</translation>
+ </message>
+ <message>
+ <source>ACCEPTING JOBS</source>
+ <translation>ACEITANDO TRABALHOS</translation>
+ </message>
+ <message>
+ <source>Reject Jobs</source>
+ <translation>Rejeitar trabalhos</translation>
+ </message>
+ <message>
+ <source>REJECTING JOBS</source>
+ <translation>REJEITANDO TRABALHOS</translation>
+ </message>
+ <message>
+ <source>Accept Jobs</source>
+ <translation>Aceitar trabalhos</translation>
+ </message>
+ <message>
+ <source>Cancel all active print jobs</source>
+ <translation>Cancelar todos os trabalhos de impressão ativos</translation>
+ </message>
+ <message>
+ <source>Cancel All Jobs</source>
+ <translation>Cancelar todos os trabalhos</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;%1&lt;/b&gt;</source>
+ <translation>&lt;b&gt;%1&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Job ID: %1</source>
+ <translation>ID do trabalho: %1</translation>
+ </message>
+ <message>
+ <source>Cancel Job</source>
+ <translation>Cancelar trabalho</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollPrintSettingsView</name>
+ <message>
+ <source>Basic</source>
+<translation>Básico</translation>
+ </message>
+ <message>
+ <source>Page Orientation</source>
+<translation>Orientação da página</translation>
+ </message>
+ <message>
+ <source>Portrait</source>
+<translation>Retrato</translation>
+ </message>
+ <message>
+ <source>Landscape</source>
+<translation>Paisagem</translation>
+ </message>
+ <message>
+ <source>Reverse landscape</source>
+<translation>Inverter paisagem</translation>
+ </message>
+ <message>
+ <source>Reverse portrait</source>
+<translation>Inverter retrato</translation>
+ </message>
+ <message>
+ <source>Duplex (Print on both sides of the page)</source>
+<translation>Duplex (imprimir nos dois lados da página)</translation>
+ </message>
+ <message>
+ <source>Single sided</source>
+<translation>Uma face</translation>
+ </message>
+ <message>
+ <source>Two sided (long edge)</source>
+<translation>Dupla-face (borda longa)</translation>
+ </message>
+ <message>
+ <source>Two sided (short edge)</source>
+<translation>Dupla-face (borda curta)</translation>
+ </message>
+ <message>
+ <source>Output Order (Print last page first)</source>
+<translation>Ordem de saída (imprimir a última página primeiro)</translation>
+ </message>
+ <message>
+ <source>Normal (Print first page first)</source>
+<translation>Normal (imprimir a primeira página primeiro)</translation>
+ </message>
+ <message>
+ <source>Reversed (Print last page first)</source>
+<translation>Inversa (imprimir a última página primeiro)</translation>
+ </message>
+ <message>
+ <source>Collate (Group together multiple copies)</source>
+<translation>Intercalar (agrupar várias cópias)</translation>
+ </message>
+ <message>
+ <source>Quality</source>
+<translation>Qualidade da cópia</translation>
+ </message>
+ <message>
+ <source>N-Up (Multiple document pages per printed page)</source>
+<translation>N ou mais (várias páginas do documento por página impressa)</translation>
+ </message>
+ <message>
+ <source>Pages per Sheet</source>
+<translation>Folhas por página</translation>
+ </message>
+ <message>
+ <source>1 sheet per page</source>
+<translation>1 folha por página</translation>
+ </message>
+ <message>
+ <source>2 sheets per page</source>
+<translation>2 folhas por página</translation>
+ </message>
+ <message>
+ <source>4 sheets per page</source>
+<translation>4 folhas por página</translation>
+ </message>
+ <message>
+ <source>Layout</source>
+<translation>Layout</translation>
+ </message>
+ <message>
+ <source>Bottom to top, left to right</source>
+<translation>Da parte inferior para a superior, da esquerda para a direita</translation>
+ </message>
+ <message>
+ <source>Bottom to top, right to left</source>
+<translation>Da parte inferior para a superior, da direita para a esquerda</translation>
+ </message>
+ <message>
+ <source>Left to right, bottom to top</source>
+<translation>Da esquerda para a direita, da parte inferior para a superior</translation>
+ </message>
+ <message>
+ <source>Left to right, top to bottom</source>
+<translation>Da esquerda para a direita, da parte superior para a inferior</translation>
+ </message>
+ <message>
+ <source>Right to left, bottom to top</source>
+<translation>Da direita para a esquerda, da parte inferior para a superior</translation>
+ </message>
+ <message>
+ <source>Right to left, top to bottom</source>
+<translation>Da direita para a esquerda, da parte superior para a inferior</translation>
+ </message>
+ <message>
+ <source>Top to bottom, left to right</source>
+<translation>Da parte superior para a inferior, da esquerda para a direita</translation>
+ </message>
+ <message>
+ <source>Top to bottom, right to left</source>
+<translation>Da parte superior para a inferior, da direita para a esquerda</translation>
+ </message>
+ <message>
+ <source>Printed Border Around Each Page</source>
+<translation>Borda impressa ao redor de cada página</translation>
+ </message>
+ <message>
+ <source>Two thin borders</source>
+<translation>Duas bordas finas</translation>
+ </message>
+ <message>
+ <source>Two thick borders</source>
+<translation>Duas bordas grossas</translation>
+ </message>
+ <message>
+ <source>No border</source>
+<translation>Nenhuma borda</translation>
+ </message>
+ <message>
+ <source>One thin border</source>
+<translation>Uma borda fina</translation>
+ </message>
+ <message>
+ <source>One thick border</source>
+<translation>Uma borda grossa</translation>
+ </message>
+ <message>
+ <source>Printout Appearance</source>
+<translation>Aparência da impressão</translation>
+ </message>
+ <message>
+ <source>Brightness</source>
+<translation>Brilho</translation>
+ </message>
+ <message>
+ <source>Gamma</source>
+<translation>Gama</translation>
+ </message>
+ <message>
+ <source>Image Printing</source>
+<translation>Impressão de imagens</translation>
+ </message>
+ <message>
+ <source>Fit to Page</source>
+<translation>Ampliação, redução e ajuste à página</translation>
+ </message>
+ <message>
+ <source>Position on Page</source>
+<translation>Posição na página</translation>
+ </message>
+ <message>
+ <source>Centered</source>
+<translation>Centralizado</translation>
+ </message>
+ <message>
+ <source>Top</source>
+<translation>Da parte superior para a inferior, da esquerda para a direita</translation>
+ </message>
+ <message>
+ <source>Left</source>
+<translation>Da esquerda para a direita, da parte inferior para a superior</translation>
+ </message>
+ <message>
+ <source>Right</source>
+<translation>Da direita para a esquerda, da parte inferior para a superior</translation>
+ </message>
+ <message>
+ <source>Top left</source>
+<translation>Parte superior esquerda</translation>
+ </message>
+ <message>
+ <source>Top right</source>
+<translation>Parte superior direita</translation>
+ </message>
+ <message>
+ <source>Bottom</source>
+<translation>Da parte inferior para a superior, da esquerda para a direita</translation>
+ </message>
+ <message>
+ <source>Bottom left</source>
+<translation>Parte inferior esquerda</translation>
+ </message>
+ <message>
+ <source>Bottom right</source>
+<translation>Parte inferior direita</translation>
+ </message>
+ <message>
+ <source>Saturation</source>
+<translation>Saturação</translation>
+ </message>
+ <message>
+ <source>Hue (color shift/rotation)</source>
+<translation>Matiz (mudança de cor/rotação)</translation>
+ </message>
+ <message>
+ <source>&quot;Natural&quot; Scaling (relative to image)</source>
+<translation>Escala &quot;Natural&quot; (em relação à imagem)</translation>
+ </message>
+ <message>
+ <source>Scaling (relative to page)</source>
+<translation>Escala (em relação à página)</translation>
+ </message>
+ <message>
+ <source>Miscellaneous</source>
+<translation>Diversos</translation>
+ </message>
+ <message>
+ <source>&quot;Pretty Print&quot; Text Documents (Add headers and formatting)</source>
+<translation>&quot;Impressão bonita&quot; - documentos de texto (adicionar cabeçalhos e formatação)</translation>
+ </message>
+ <message>
+ <source>Banner Pages</source>
+<translation>Páginas de faixas</translation>
+ </message>
+ <message>
+ <source>No banner page</source>
+<translation>Nenhuma página de faixa</translation>
+ </message>
+ <message>
+ <source>Classified</source>
+<translation>Restrito</translation>
+ </message>
+ <message>
+ <source>Confidential</source>
+<translation>Confidencial</translation>
+ </message>
+ <message>
+ <source>Secret</source>
+<translation>Secreto</translation>
+ </message>
+ <message>
+ <source>Standard</source>
+<translation>Padrão</translation>
+ </message>
+ <message>
+ <source>Top secret</source>
+<translation>Sigiloso</translation>
+ </message>
+ <message>
+ <source>Unclassified</source>
+<translation>Não classificado</translation>
+ </message>
+ <message>
+ <source>Mirror Printing</source>
+<translation>Impressão espelhada</translation>
+ </message>
+ <message>
+ <source>Set Quality to &quot;Controlled by &apos;Printout Mode&apos;&quot; to enable.</source>
+<translation>Defina Qualidade como &quot;Controlado pelo &apos;modo de impressão&apos;&quot; para ativar.</translation>
+ </message>
+ <message>
+ <source>On</source>
+<translation>Uma borda fina</translation>
+ </message>
+ <message>
+ <source>Off</source>
+<translation>Desligado</translation>
+ </message>
+ <message>
+ <source>Set to default value of &quot;%1&quot;.</source>
+<translation>Defina como o valor padrão de &quot;%1&quot;.</translation>
+ </message>
+ <message>
+ <source>Start:</source>
+<translation>Inicial:</translation>
+ </message>
+ <message>
+ <source>End:</source>
+<translation>Final:</translation>
+ </message>
+ <message>
+ <source>Set to default value of &quot;Start: %1, End: %2&quot;.</source>
+<translation>Defina como o valor padrão de &quot;Inicial: %1, Final: %2&quot;.</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollPrintView</name>
+ <message>
+ <source>PDF Document</source>
+ <translation>Documento PDF</translation>
+ </message>
+ <message>
+ <source>Postscript Document</source>
+ <translation>Documento Postscript</translation>
+ </message>
+ <message>
+ <source>HP Graphics Language File</source>
+ <translation>Arquivo de linguagem de gráficos HP</translation>
+ </message>
+ <message>
+ <source>C Shell Script</source>
+ <translation>Script Shell C</translation>
+ </message>
+ <message>
+ <source>C Source Code</source>
+ <translation>Código-fonte C</translation>
+ </message>
+ <message>
+ <source>C++ Source Code</source>
+ <translation>Código-fonte C++</translation>
+ </message>
+ <message>
+ <source>Perl Script</source>
+ <translation>Script Perl</translation>
+ </message>
+ <message>
+ <source>Python Program</source>
+ <translation>Programa Python</translation>
+ </message>
+ <message>
+ <source>Shell Script</source>
+ <translation>Script Shell</translation>
+ </message>
+ <message>
+ <source>Plain Text</source>
+ <translation>Texto comum</translation>
+ </message>
+ <message>
+ <source>HTML Dcoument</source>
+ <translation>Documento HTML</translation>
+ </message>
+ <message>
+ <source>GIF Image</source>
+ <translation>Imagem GIF</translation>
+ </message>
+ <message>
+ <source>PNG Image</source>
+ <translation>Imagem PNG</translation>
+ </message>
+ <message>
+ <source>JPEG Image</source>
+ <translation>Imagem JPEG</translation>
+ </message>
+ <message>
+ <source>TIFF Image</source>
+ <translation>Imagem TIFF</translation>
+ </message>
+ <message>
+ <source>Bitmap (BMP) Image</source>
+ <translation>Imagem Bitmap (BMP)</translation>
+ </message>
+ <message>
+ <source>Photo CD Image</source>
+ <translation>Imagem de CD de fotos</translation>
+ </message>
+ <message>
+ <source>Portable Image (PNM)</source>
+ <translation>Imagem portátil (PNM)</translation>
+ </message>
+ <message>
+ <source>Portable B&amp;W Image (PBM)</source>
+ <translation>Imagem portátil P&amp;B (PBM)</translation>
+ </message>
+ <message>
+ <source>Portable Grayscale Image (PGM)</source>
+ <translation>Imagem portátil em escala de cinza (PGM)</translation>
+ </message>
+ <message>
+ <source>Portable Color Image (PPM)</source>
+ <translation>Imagem portátil colorida (PPM)</translation>
+ </message>
+ <message>
+ <source>SGI RGB</source>
+ <translation>SGI RGB</translation>
+ </message>
+ <message>
+ <source>X11 Bitmap (XBM)</source>
+ <translation>X11 Bitmap (XBM)</translation>
+ </message>
+ <message>
+ <source>X11 Pixmap (XPM)</source>
+ <translation>X11 Pixmap (XPM)</translation>
+ </message>
+ <message>
+ <source>Sun Raster Format</source>
+ <translation>Formato Sun Raster</translation>
+ </message>
+ <message>
+ <source>File(s) to Print</source>
+ <translation>Arquivo(s) a imprimir</translation>
+ </message>
+ <message>
+ <source>Print Options</source>
+ <translation>Opções de impressão</translation>
+ </message>
+ <message>
+ <source>&lt;&lt; Functions</source>
+ <translation>&lt;&lt; Funções</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Fechar</translation>
+ </message>
+ <message>
+ <source>Print File(s)</source>
+ <translation>Imprimir arquivo(s)</translation>
+ </message>
+ <message>
+ <source>Order</source>
+ <translation>Ordem</translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation>Nome</translation>
+ </message>
+ <message>
+ <source>Type</source>
+ <translation>Tipo</translation>
+ </message>
+ <message>
+ <source>Path</source>
+ <translation>Caminho</translation>
+ </message>
+ <message>
+ <source>Add File...</source>
+ <translation>Acrescentar arquivo...</translation>
+ </message>
+ <message>
+ <source>Show Types...</source>
+ <translation>Mostrar tipos...</translation>
+ </message>
+ <message>
+ <source>Remove File</source>
+ <translation>Remover arquivo</translation>
+ </message>
+ <message>
+ <source>Move Down</source>
+ <translation>Mover para baixo</translation>
+ </message>
+ <message>
+ <source>Move Up</source>
+ <translation>Mover para cima</translation>
+ </message>
+ <message>
+ <source>Show File Types...</source>
+ <translation>Mostrar tipos de arquivo...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;You are trying to add a file that cannot be directly printed with this utility.&lt;/b&gt;&lt;p&gt;To print this file, use the print command in the application that created it.</source>
+ <translation>&lt;b&gt;Você está tentando acrescentar um arquivo que não pode ser impresso diretamente com este utilitário.&lt;/b&gt;&lt;p&gt;Para imprimir este arquivo, utilize o comando de impressão no aplicativo que o criou.</translation>
+ </message>
+ <message>
+ <source>Number of copies:</source>
+ <translation>Número de cópias:</translation>
+ </message>
+ <message>
+ <source>Default</source>
+ <translation>Padrão</translation>
+ </message>
+ <message>
+ <source>Page Range:</source>
+ <translation>Intervalo de páginas:</translation>
+ </message>
+ <message>
+ <source>All pages</source>
+ <translation>Todas as páginas</translation>
+ </message>
+ <message>
+ <source>Page range:</source>
+ <translation>Intervalo de páginas:</translation>
+ </message>
+ <message>
+ <source>Page set:</source>
+ <translation>Conjunto de páginas:</translation>
+ </message>
+ <message>
+ <source>Even pages</source>
+ <translation>Páginas pares</translation>
+ </message>
+ <message>
+ <source>Odd pages</source>
+ <translation>Páginas ímpares</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Cannot print: Invalid page range: %1&lt;/b&gt;&lt;p&gt;A valid page range is a list of pages or ranges of pages separated by commas (e.g., 1-2,4,6-7)</source>
+ <translation>&lt;b&gt;Não é possível imprimir: Intervalo de páginas inválido: %1&lt;/b&gt;&lt;p&gt;Um intervalo de páginas válido é uma lista de páginas ou intervalos de páginas separados por vírgulas (Exemplo: 1-2,4,6-7).</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Cannot print: Device is busy or not available.&lt;/b&gt;&lt;p&gt;Please check device and try again. [1]</source>
+ <translation type="obsolete">&lt;b&gt;Não é possível imprimir: O dispositivo está ocupado ou indisponível.&lt;/b&gt;&lt;p&gt;Verifique o dispositivo e tente novamente. [1]</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Cannot print: Printer is stopped.&lt;/b&gt;&lt;p&gt;Please START the printer to continue this print. Job will begin printing once printer is started.</source>
+ <translation>&lt;b&gt;Não é possível imprimir: A impressora está parada.&lt;/b&gt;&lt;p&gt;INICIE a impressora para continuar esta impressão. O trabalho começará a ser impresso assim que a impressora for iniciada.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Cannot print: Printer is not accepting jobs.&lt;/b&gt;&lt;p&gt;Please set the printer to ACCEPTING JOBS to continue printing.</source>
+ <translation>&lt;b&gt;Não é possível imprimir: A impressora não está aceitando trabalhos.&lt;/b&gt;&lt;p&gt;Configure a impressora para ACEITANDO TRABALHOS para continuar a impressão.</translation>
+ </message>
+ <message>
+ <source>Print command failed with error code %1</source>
+ <translation>Falha no comando de impressão com o código de erro %1</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Cannot print: Device is busy or not available.&lt;/b&gt;&lt;p&gt;Please check device and try again.</source>
+<translation>&lt;b&gt;Não é possível imprimir: O dispositivo está ocupado ou indisponível.&lt;/b&gt;&lt;p&gt;Verifique o dispositivo e tente novamente.</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollPrinterInfoView</name>
+ <message>
+ <source>No printers found for this device.</source>
+ <translation>Nenhuma impressora encontrada para este dispositivo.</translation>
+ </message>
+ <message>
+ <source>&lt;&lt; Tools</source>
+ <translation>&lt;&lt; Ferramentas</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Fechar</translation>
+ </message>
+ <message>
+ <source>Fax</source>
+ <translation>Fax</translation>
+ </message>
+ <message>
+ <source>Printer</source>
+ <translation>Impressora</translation>
+ </message>
+ <message>
+ <source>Type: %1</source>
+ <translation>Tipo: %1</translation>
+ </message>
+ <message>
+ <source>Location: %1</source>
+ <translation>Local: %1</translation>
+ </message>
+ <message>
+ <source>Description/Info: %1</source>
+ <translation>Descrição/Informações: %1</translation>
+ </message>
+ <message>
+ <source>Idle</source>
+ <translation>Ociosa</translation>
+ </message>
+ <message>
+ <source>Processing</source>
+ <translation>Processando</translation>
+ </message>
+ <message>
+ <source>Stopped</source>
+ <translation>Parada</translation>
+ </message>
+ <message>
+ <source>Unknown</source>
+ <translation>Desconhecida</translation>
+ </message>
+ <message>
+ <source>State: %1</source>
+ <translation>Estado: %1</translation>
+ </message>
+ <message>
+ <source>PPD/Driver: %1</source>
+ <translation>PPD/Driver: %1</translation>
+ </message>
+ <message>
+ <source>CUPS/IPP Printer URI: %1</source>
+ <translation>URI da impressora CUPS/IPP: %1</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollStatusView</name>
+ <message>
+ <source>year</source>
+ <translation>ano</translation>
+ </message>
+ <message>
+ <source>years</source>
+ <translation>anos</translation>
+ </message>
+ <message>
+ <source>month</source>
+ <translation>mês</translation>
+ </message>
+ <message>
+ <source>months</source>
+ <translation>meses</translation>
+ </message>
+ <message>
+ <source>week</source>
+ <translation>semana</translation>
+ </message>
+ <message>
+ <source>weeks</source>
+ <translation>semanas</translation>
+ </message>
+ <message>
+ <source>day</source>
+ <translation>dia</translation>
+ </message>
+ <message>
+ <source>days</source>
+ <translation>dias</translation>
+ </message>
+ <message>
+ <source>hour</source>
+ <translation>hora</translation>
+ </message>
+ <message>
+ <source>hours</source>
+ <translation>horas</translation>
+ </message>
+ <message>
+ <source>minute</source>
+ <translation>minuto</translation>
+ </message>
+ <message>
+ <source>minutes</source>
+ <translation>minutos</translation>
+ </message>
+ <message>
+ <source>second</source>
+ <translation>segundo</translation>
+ </message>
+ <message>
+ <source>seconds</source>
+ <translation>segundos</translation>
+ </message>
+ <message>
+ <source>one</source>
+ <translation>um</translation>
+ </message>
+ <message>
+ <source>two</source>
+ <translation>dois</translation>
+ </message>
+ <message>
+ <source>three</source>
+ <translation>três</translation>
+ </message>
+ <message>
+ <source>four</source>
+ <translation>quatro</translation>
+ </message>
+ <message>
+ <source>five</source>
+ <translation>cinco</translation>
+ </message>
+ <message>
+ <source>six</source>
+ <translation>seis</translation>
+ </message>
+ <message>
+ <source>seven</source>
+ <translation>sete</translation>
+ </message>
+ <message>
+ <source>eight</source>
+ <translation>oito</translation>
+ </message>
+ <message>
+ <source>nine</source>
+ <translation>nove</translation>
+ </message>
+ <message>
+ <source>ten</source>
+ <translation>dez</translation>
+ </message>
+ <message>
+ <source>eleven</source>
+ <translation>onze</translation>
+ </message>
+ <message>
+ <source>twelve</source>
+ <translation>doze</translation>
+ </message>
+ <message>
+ <source>(most recent)</source>
+ <translation>(mais recente)</translation>
+ </message>
+ <message>
+ <source>User:</source>
+ <translation>Usuário:</translation>
+ </message>
+ <message>
+ <source>Job ID:</source>
+ <translation>ID do trabalho:</translation>
+ </message>
+ <message>
+ <source>n/a</source>
+ <translation>n/d</translation>
+ </message>
+ <message>
+ <source>Code:</source>
+ <translation>Código:</translation>
+ </message>
+ <message>
+ <source>(about %1 ago)</source>
+ <translation>(há cerca de %1)</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollSuppliesView</name>
+ <message>
+ <source>ERROR: Device not supported.</source>
+ <translation>ERRO: Dispositivo não suportado.</translation>
+ </message>
+ <message>
+ <source>ERROR: Supplies status is not supported on this device.</source>
+ <translation>ERRO: O status dos suprimentos não é suportado neste dispositivo.</translation>
+ </message>
+ <message>
+ <source>ERROR: Device not found. Please check connection and power-on device.</source>
+ <translation>ERRO: Dispositivo não encontrado. Verifique a conexão e ligue o dispositivo.</translation>
+ </message>
+ <message>
+ <source>Part No. %1</source>
+ <translation>Nº. de Peça %1</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollTestpageView</name>
+ <message>
+ <source>&lt;&lt; Tools</source>
+ <translation>&lt;&lt; Ferramentas</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Fechar</translation>
+ </message>
+ <message>
+ <source>Print Test Page</source>
+ <translation>Imprimir página teste</translation>
+ </message>
+ <message>
+ <source>Test Page Type</source>
+ <translation>Tipo de página de teste</translation>
+ </message>
+ <message>
+ <source>Printer diagnostic page (does not test print driver)</source>
+ <translation>Página de diagnóstico da impressora (não testa o driver de impressão)</translation>
+ </message>
+ <message>
+ <source>HPLIP test page (tests print driver)</source>
+ <translation>Página de teste HPLIP (testa o driver de impressão)</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;A test page should be printing on your printer.&lt;/b&gt;&lt;p&gt;If the page fails to print, please visit http://hplip.sourceforge.net for troubleshooting and support.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Uma página de teste deve estar sendo impressa na impressora.&lt;/b&gt;&lt;p&gt;Se a página não for impressa, visite http://hplip.sourceforge.net para obter informações sobre solução de problemas e suporte.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Device is busy or in an error state.&lt;/b&gt;&lt;p&gt;Please check device and try again.</source>
+<translation>&lt;b&gt;O dispositivo está ocupado ou em um estado de erro.&lt;/b&gt;&lt;p&gt;Verifique o dispositivo e tente novamente.</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollToolView</name>
+ <message>
+ <source>&lt;b&gt;Device Settings&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Configurações do dispositivo&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Your device has special device settings. You may alter these settings here.</source>
+ <translation>O dispositivo tem configurações especiais. Essas configurações podem ser alteradas aqui.</translation>
+ </message>
+ <message>
+ <source>Device Settings...</source>
+ <translation>Configurações do dispositivo…</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Fax Setup&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Instalação do fax&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Fax support must be setup before you can send faxes.</source>
+ <translation>O suporte a fax deve ser instalado para que seja possível enviar fax.</translation>
+ </message>
+ <message>
+ <source>Setup Fax...</source>
+ <translation>Instalar fax...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Fax Address Book&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Agenda de fax&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Setup fax phone numbers to use when sending faxes from the PC.</source>
+ <translation>Defina os números de fax a utilizar ao enviar fax do computador.</translation>
+ </message>
+ <message>
+ <source>Fax Address Book...</source>
+ <translation>Agenda de fax...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Print Test Page&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Imprimir página teste&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Print a test page to test the setup of your printer.</source>
+ <translation>Imprima uma página de teste para testar a instalação da impressora.</translation>
+ </message>
+ <message>
+ <source>Print Test Page &gt;&gt;</source>
+ <translation>Imprimir página de teste &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;View Printer (Queue) Information&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Exibir informações da impressora (fila)&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>View the printers (queues) installed in CUPS.</source>
+ <translation>Exibir impressoras (filas) instaladas no CUPS.</translation>
+ </message>
+ <message>
+ <source>View Printer Information &gt;&gt;</source>
+ <translation>Exibir informações da impressora &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;View Device Information&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Exibir informações do dispositivo&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>This information is primarily useful for debugging and troubleshooting (advanced).</source>
+ <translation>Essas informações são úteis principalmente para depurar e solucionar problemas (avançado).</translation>
+ </message>
+ <message>
+ <source>View Device Information &gt;&gt;</source>
+ <translation>Exibir informações do dispositivo &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Print Quality Diagnostics&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Diagnóstico da qualidade da impressão&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Your printer can print a test page to help diagnose print quality problems.</source>
+ <translation>A impressora pode imprimir uma página de teste para ajudar a diagnosticar problemas de qualidade de impressão.</translation>
+ </message>
+ <message>
+ <source>Print Diagnostic Page...</source>
+ <translation>Imprimir página de diagnóstico...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Download Firmware&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Download do firmware&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Download firmware to your printer (required on some devices after each power-up).</source>
+ <translation>Faça o download do firmware para a impressora (necessário em alguns dispositivos após cada inicialização).</translation>
+ </message>
+ <message>
+ <source>Download Firmware...</source>
+ <translation>Download do firmware...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Clean Cartridges&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Limpar cartuchos&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>You only need to perform this action if you are having problems with poor printout quality due to clogged ink nozzles.</source>
+ <translation>Esta ação precisa ser executada apenas se ocorrerem problemas de baixa qualidade de impressão devido a injetores de tinta entupidos.</translation>
+ </message>
+ <message>
+ <source>Clean Cartridges...</source>
+ <translation>Limpar cartuchos...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Align Cartridges&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Alinhar cartuchos&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>This will improve the quality of output when a new cartridge is installed.</source>
+ <translation>Isso melhorará a qualidade do resultado quando um novo cartucho for instalado.</translation>
+ </message>
+ <message>
+ <source>Align Cartridges...</source>
+ <translation>Alinhar cartuchos...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Perform Color Calibration&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Executar calibragem de cores&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Use this procedure to optimimize your printer&apos;s color output.</source>
+ <translation>Utilize este procedimento para otimizar a impressão colorida da impressora.</translation>
+ </message>
+ <message>
+ <source>Color Calibration...</source>
+ <translation>Calibragem de cores...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Perform Line Feed Calibration&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Executar calibragem da alimentação de linhas&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Use line feed calibration to optimize print quality (to remove gaps in the printed output).</source>
+ <translation>Utilize a calibragem da alimentação de linhas para otimizar a qualidade da impressão (para remover lacunas na saída impressa).</translation>
+ </message>
+ <message>
+ <source>Line Feed Calibration...</source>
+ <translation>Calibragem da alimentação de linhas...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Access Embedded Web Page&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Acessar a página Web integrada&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>You can use your printer&apos;s embedded web server to configure, maintain, and monitor the device from a web browser.</source>
+ <translation>É possível utilizar o servidor Web integrado da impressora para configurar, executar a manutenção e monitorar o dispositivo a partir de um navegador da Web.</translation>
+ </message>
+ <message>
+ <source>Open in Browser...</source>
+ <translation>Abrir no navegador...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;View Documentation&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Exibir documentação&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>View documentation installed on your system.</source>
+ <translation>Exibir documentação instalada no sistema.</translation>
+ </message>
+ <message>
+ <source>View Documentation...</source>
+ <translation>Exibir documentação...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;An error occured downloading firmware file.&lt;/b&gt;&lt;p&gt;Please check your printer and try again.</source>
+ <translation>&lt;b&gt;Ocorreu um erro durante o download do arquivo de firmware.&lt;/b&gt;&lt;p&gt;Verifique a impressora e tente novamente.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Device is busy or in an error state.&lt;/b&gt;&lt;p&gt;Please check device and try again.</source>
+ <translation>&lt;b&gt;O dispositivo está ocupado ou em um estado de erro.&lt;/b&gt;&lt;p&gt;Verifique o dispositivo e tente novamente.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Both cartridges are required for alignment.&lt;/b&gt;&lt;p&gt;Please install both cartridges and try again.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Ambos os cartuchos são necessários para o alinhamento.&lt;/b&gt;&lt;p&gt;Instale os dois cartuchos e tente novamente.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;One or more cartiridges are missing from the printer.&lt;/b&gt;&lt;p&gt;Please install cartridge(s) and try again.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Um ou mais cartuchos estão faltando na impressora.&lt;/b&gt;&lt;p&gt;Instale o(s) cartucho(s) e tente novamente.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Both the photo and color cartridges must be inserted into the printer to perform color calibration.&lt;/b&gt;&lt;p&gt;If you are planning on printing with the photo cartridge, please insert it and try again.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Os cartuchos de fotos e o colorido devem ser inseridos na impressora para executar a calibragem de cores.&lt;/b&gt;&lt;p&gt;Se desejar imprimir com o cartucho de fotos, insira-o e tente novamente.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Both the photo (regular photo or photo blue) and color cartridges must be inserted into the printer to perform color calibration.&lt;/b&gt;&lt;p&gt;If you are planning on printing with the photo or photo blue cartridge, please insert it and try again.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Os cartuchos de fotos (foto comum ou azul) e o colorido devem ser inseridos na impressora para executar a calibragem de cores. &lt;/b&gt;&lt;p&gt;Se desejar imprimir com o cartucho de fotos ou de fotos em azul, insira-o e tente novamente.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Cannot align with only the photo cartridge installed.&lt;/b&gt;&lt;p&gt;Please install other cartridges and try again.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Não é possível alinhar com apenas o cartucho de fotos instalado.&lt;/b&gt;&lt;p&gt;Instale os outros cartuchos e tente novamente.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Operation failed. Device busy.&lt;/b&gt;</source>
+ <translation>&lt;p&gt;&lt;b&gt;Falha na operação. Dispositivo ocupado.&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Unable to run command. No command specified.&lt;/b&gt;&lt;p&gt;Use &lt;pre&gt;Configure...&lt;/pre&gt; to specify a command to run.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Não foi possível executar o comando. Nenhum comando especificado.&lt;/b&gt;&lt;p&gt;Utilize &lt;pre&gt;Configurar...&lt;/pre&gt; para especificar um comando para execução.</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollUnloadView</name>
+ <message>
+ <source>ERROR: Photo Card Failed to Mount Properly. Please check device and card and try again.</source>
+ <translation>ERRO: Falha ao montar o cartão de foto corretamente. Verifique o dispositivo e o cartão e tente novamente.</translation>
+ </message>
+ <message>
+ <source>Select File(s) to Unload from Photo Card</source>
+ <translation>Selecionar arquivo(s) para descarregar a partir do cartão de foto</translation>
+ </message>
+ <message>
+ <source>Unload Folder</source>
+ <translation>Descarregar pasta</translation>
+ </message>
+ <message>
+ <source>Unload Options</source>
+ <translation>Opções de descarregamento</translation>
+ </message>
+ <message>
+ <source>&lt;&lt; Functions</source>
+ <translation>&lt;&lt; Funções</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Fechar</translation>
+ </message>
+ <message>
+ <source>Unload File(s)</source>
+ <translation>Descarregar arquivo(s)</translation>
+ </message>
+ <message>
+ <source>Select All</source>
+ <translation>Selecionar todos</translation>
+ </message>
+ <message>
+ <source>Select None</source>
+ <translation>Não selecionar nenhum</translation>
+ </message>
+ <message>
+ <source>Show Thumbnails</source>
+ <translation>Mostrar miniaturas</translation>
+ </message>
+ <message>
+ <source>No files selected</source>
+ <translation>Nenhum arquivo selecionado</translation>
+ </message>
+ <message>
+ <source>1 file selected, %1</source>
+ <translation>1 arquivo selecionado, %1</translation>
+ </message>
+ <message>
+ <source>%1 files selected, %2</source>
+ <translation>%1 arquivos selecionados, %2</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;No thumbnail found in image.&lt;/b&gt;</source>
+ <translation>&lt;p&gt;&lt;b&gt;Nenhuma miniatura encontrada na imagem.&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Loading...</source>
+ <translation>Carregando...</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Cancelar</translation>
+ </message>
+ <message>
+ <source>HP Device Manager</source>
+ <translation>HP Device Manager</translation>
+ </message>
+ <message>
+ <source>Browse...</source>
+ <translation>Procurar...</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;The unload directory path you entered is not valid.&lt;/b&gt;&lt;p&gt;The directory must exist and you must have write permissions.</source>
+ <translation>&lt;p&gt;&lt;b&gt;O caminho do diretório de descarregamento inserido não é válido.&lt;/b&gt;&lt;p&gt;O diretório deve existir e você deve ter permissões de gravação.</translation>
+ </message>
+ <message>
+ <source>File removal:</source>
+ <translation>Remoção de arquivos:</translation>
+ </message>
+ <message>
+ <source>Leave unloaded files on photo card</source>
+ <translation>Deixar arquivos descarregados no cartão de foto</translation>
+ </message>
+ <message>
+ <source>Remove all unloaded files from photo card</source>
+ <translation>Remover todos os arquivos descarregados do cartão de foto</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;The unload directory path is not valid.&lt;/b&gt;&lt;p&gt;Please enter a new path and try again.</source>
+ <translation>&lt;p&gt;&lt;b&gt;O caminho do diretório de descarregamento não é válido.&lt;/b&gt;&lt;p&gt;Insira um novo caminho e tente novamente.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;No files are selected to unload.&lt;/b&gt;&lt;p&gt;Please select one or more files to unload and try again.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Nenhum arquivo foi selecionado para ser descarregado.&lt;/b&gt;&lt;p&gt;Selecione um ou mais arquivos para serem descarregados e tente novamente.</translation>
+ </message>
+ <message>
+ <source>Unloading card...</source>
+ <translation>Descarregando cartão...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Unload cancelled at user request.&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Descarregamento cancelado na solicitação do usuário.&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>ERROR: Photo Card Failed to Mount Properly. Please check device and card and try again.</source>
+<translation>ERRO: Falha ao montar o cartão de foto corretamente. Verifique o dispositivo e o cartão e tente novamente.</translation>
+ </message>
+ <message>
+ <source>Select File(s) to Unload from Photo Card</source>
+<translation>Selecionar arquivo(s) para descarregar a partir do cartão de foto</translation>
+ </message>
+ <message>
+ <source>Unload Folder</source>
+<translation>Descarregar pasta</translation>
+ </message>
+ <message>
+ <source>Unload Options</source>
+<translation>Opções de descarregamento</translation>
+ </message>
+ <message>
+ <source>&lt;&lt; Functions</source>
+<translation>&lt;&lt; Funções</translation>
+ </message>
+ <message>
+ <source>Close</source>
+<translation>Fechar</translation>
+ </message>
+ <message>
+ <source>Unload File(s)</source>
+<translation>Descarregar arquivo(s)</translation>
+ </message>
+ <message>
+ <source>Select All</source>
+<translation>Selecionar todos</translation>
+ </message>
+ <message>
+ <source>Select None</source>
+<translation>Não selecionar nenhum</translation>
+ </message>
+ <message>
+ <source>Show Thumbnails</source>
+<translation>Mostrar miniaturas</translation>
+ </message>
+ <message>
+ <source>No files selected</source>
+<translation>Nenhum arquivo selecionado</translation>
+ </message>
+ <message>
+ <source>1 file selected, %1</source>
+<translation>1 arquivo selecionado, %1</translation>
+ </message>
+ <message>
+ <source>%1 files selected, %2</source>
+<translation>%1 arquivos selecionados, %2</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;No thumbnail found in image.&lt;/b&gt;</source>
+<translation>&lt;p&gt;&lt;b&gt;Nenhuma miniatura encontrada na imagem.&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Loading...</source>
+<translation>Carregando...</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+<translation>Cancelar</translation>
+ </message>
+ <message>
+ <source>HP Device Manager</source>
+<translation>HP Device Manager</translation>
+ </message>
+ <message>
+ <source>Browse...</source>
+<translation>Procurar...</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;The unload directory path you entered is not valid.&lt;/b&gt;&lt;p&gt;The directory must exist and you must have write permissions.</source>
+<translation>&lt;p&gt;&lt;b&gt;O caminho do diretório de descarregamento inserido não é válido.&lt;/b&gt;&lt;p&gt;O diretório deve existir e você deve ter permissões de gravação.</translation>
+ </message>
+ <message>
+ <source>File removal:</source>
+<translation>Remoção de arquivos:</translation>
+ </message>
+ <message>
+ <source>Leave unloaded files on photo card</source>
+<translation>Deixar arquivos descarregados no cartão de foto</translation>
+ </message>
+ <message>
+ <source>Remove all unloaded files from photo card</source>
+<translation>Remover todos os arquivos descarregados do cartão de foto</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;The unload directory path is not valid.&lt;/b&gt;&lt;p&gt;Please enter a new path and try again.</source>
+<translation>&lt;p&gt;&lt;b&gt;O caminho do diretório de descarregamento não é válido.&lt;/b&gt;&lt;p&gt;Insira um novo caminho e tente novamente.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;No files are selected to unload.&lt;/b&gt;&lt;p&gt;Please select one or more files to unload and try again.</source>
+<translation>&lt;p&gt;&lt;b&gt;Nenhum arquivo foi selecionado para ser descarregado.&lt;/b&gt;&lt;p&gt;Selecione um ou mais arquivos para serem descarregados e tente novamente.</translation>
+ </message>
+ <message>
+ <source>Unloading card...</source>
+<translation>Descarregando cartão...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Unload cancelled at user request.&lt;/b&gt;</source>
+<translation>&lt;b&gt;Descarregamento cancelado na solicitação do usuário.&lt;/b&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollView</name>
+ <message>
+ <source>ERROR: No device found or unsupported device.</source>
+ <translation>ERRO: Nenhum dispositivo encontrado ou dispositivo incompatível.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;%1 (read only)&lt;/b&gt;</source>
+ <translation>&lt;b&gt;%1 (somente leitura)&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Printer/Fax</source>
+ <translation>Impressora/fax</translation>
+ </message>
+ <message>
+ <source>Printer/Fax Name:</source>
+ <translation>Nome da impressora/fax:</translation>
+ </message>
+ <message>
+ <source>Printer</source>
+ <translation>Impressora</translation>
+ </message>
+ <message>
+ <source>Printer Name:</source>
+ <translation>Nome da impressora:</translation>
+ </message>
+ <message>
+ <source>Fax</source>
+ <translation>Fax</translation>
+ </message>
+ <message>
+ <source>Fax Name:</source>
+ <translation>Nome do fax:</translation>
+ </message>
+ <message>
+ <source>Load Paper</source>
+ <translation>Carregar papel</translation>
+ </message>
+ <message>
+ <source>A page will be printed. Please load &lt;b&gt;plain paper&lt;/b&gt; into the printer.</source>
+ <translation>Será impressa uma página. Carregue &lt;b&gt;papel comum&lt;/b&gt; na impressora.</translation>
+ </message>
+</context>
+<context>
+ <name>SettingsDialog</name>
+ <message>
+ <source>&lt;b&gt;One or more email addresses are missing.&lt;/b&gt;&lt;p&gt;Please enter this information and try again.</source>
+ <translation>&lt;b&gt;Um ou mais endereços de e-mail estão faltando.&lt;/b&gt;&lt;p&gt;Digite essas informações e tente novamente.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Please check your email for a test message.&lt;/b&gt;&lt;p&gt;If the message doesn&apos;t arrive, please check your settings and try again.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Verifique em seu e-mail se há uma mensagem de teste.&lt;/b&gt;&lt;p&gt;Se a mensagem não chegar, verifique as configurações e tente novamente.</translation>
+ </message>
+</context>
+<context>
+ <name>SettingsDialog_base</name>
+ <message>
+ <source>HP Device Manager - Settings</source>
+ <translation>HP Device Manager - Configurações</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Cancelar</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Configure if and when device(s) are automatically refreshed&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Configure se e quando o(s) dispositivo(s) devem ser atualizados automaticamente.&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Enable device auto refresh</source>
+ <translation>Ativar atualização automática do dispositivo</translation>
+ </message>
+ <message>
+ <source>Auto Interval</source>
+ <translation>Intervalo automático</translation>
+ </message>
+ <message>
+ <source>Refresh every:</source>
+ <translation>Atualizar a cada:</translation>
+ </message>
+ <message>
+ <source>seconds</source>
+ <translation>segundos</translation>
+ </message>
+ <message>
+ <source>Device(s) to Refresh </source>
+ <translation>Dispositivo(s) a atualizar</translation>
+ </message>
+ <message>
+ <source>Only currently selected device</source>
+ <translation>Apenas dispositivo selecionado atualmente</translation>
+ </message>
+ <message>
+ <source>All devices</source>
+ <translation>Todos os dispositivos</translation>
+ </message>
+ <message>
+ <source>Auto Refresh</source>
+ <translation>Atualização automática</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Configure if the HP Device Manager will send email on alerts&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Configure se o HP Device Manager enviará e-mails no caso de alertas.&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Send email when device errors occur:</source>
+ <translation>Enviar e-mail quando ocorrerem erros do dispositivo:</translation>
+ </message>
+ <message>
+ <source>Test</source>
+ <translation>Teste</translation>
+ </message>
+ <message>
+ <source>To: Address(es)</source>
+ <translation>Para: Endereço(s)</translation>
+ </message>
+ <message>
+ <source>Email address(es):</source>
+ <translation>Endereço(s) de e-mail:</translation>
+ </message>
+ <message>
+ <source>&lt;i&gt;Note: Separate multiple email address with a commas.&lt;/i&gt;</source>
+ <translation>&lt;i&gt;Nota: Separe vários endereços de e-mail com vírgulas.&lt;/i&gt;</translation>
+ </message>
+ <message>
+ <source>From: Address</source>
+ <translation>De: Endereço</translation>
+ </message>
+ <message>
+ <source>Sender email address:</source>
+ <translation>Endereço de e-mail do remetente:</translation>
+ </message>
+ <message>
+ <source>&lt;i&gt;Note: This should generally be your email address.&lt;/i&gt;</source>
+ <translation>&lt;i&gt;Nota: Normalmente deve ser seu endereço de e-mail.&lt;/i&gt;</translation>
+ </message>
+ <message>
+ <source>Email Alerts</source>
+ <translation>Alertas de e-mail</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Configure what commands to run for device functions&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Configure quais comandos executar para as funções do dispositivo.&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Access Photo Cards</source>
+ <translation>Acessar cartões de foto</translation>
+ </message>
+ <message>
+ <source>Built-in access photo cards function</source>
+ <translation>Função integrada de acesso a cartões de foto</translation>
+ </message>
+ <message>
+ <source>External command:</source>
+ <translation>Comando externo:</translation>
+ </message>
+ <message>
+ <source>Send PC Fax</source>
+ <translation>Enviar fax do PC</translation>
+ </message>
+ <message>
+ <source>Built-in send PC fax function</source>
+ <translation>Função integrada de envio de fax do PC</translation>
+ </message>
+ <message>
+ <source>Scan</source>
+ <translation>Digitalizar</translation>
+ </message>
+ <message>
+ <source>Built-in scan function</source>
+ <translation>Função integrada de digitalização</translation>
+ </message>
+ <message>
+ <source>External scan command:</source>
+ <translation>Comando externo de digitalização:</translation>
+ </message>
+ <message>
+ <source>Print</source>
+ <translation>Imprimir</translation>
+ </message>
+ <message>
+ <source>Built-in print function</source>
+ <translation>Função integrada de impressão</translation>
+ </message>
+ <message>
+ <source>Set Defaults</source>
+ <translation>Definir padrões</translation>
+ </message>
+ <message>
+ <source>Make Copies</source>
+ <translation>Fazer cópias</translation>
+ </message>
+ <message>
+ <source>Built-in make copies function</source>
+ <translation>Função integrada de cópias</translation>
+ </message>
+ <message>
+ <source>Functions (Advanced)</source>
+ <translation>Funções (Avançadas)</translation>
+ </message>
+</context>
+<context>
+ <name>SetupForm</name>
+ <message>
+ <source>Current: Filter: &quot;%2&quot; Search: &quot;%3&quot; TTL: %4 Timeout: %5s</source>
+ <translation>Atual: Filtro: &quot;%2&quot; Busca: &quot;%3&quot; TTL: %4 Tempo limite: %5s</translation>
+ </message>
+ <message>
+ <source>The printer name and fax name must be different. Please choose different names.</source>
+<translation>O nome da impressora e o nome do fax devem ser diferentes. Escolha nomes diferentes.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Device not found.&lt;/b&gt; &lt;p&gt;Please make sure your printer is properly connected and powered-on.</source>
+ <translation>&lt;b&gt;Dispositivo não encontrado.&lt;/b&gt; &lt;p&gt;Verifique se a impressora está conectada corretamente e ligada.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;No devices found.&lt;/b&gt;&lt;p&gt;Please make sure your printer is properly connected and powered-on.</source>
+ <translation>&lt;b&gt;Nenhum dispositivo encontrado.&lt;/b&gt;&lt;p&gt;Verifique se a impressora está conectada corretamente e ligada.</translation>
+ </message>
+ <message>
+ <source>Current Settings: Filter: &quot;%2&quot; Search: &quot;%3&quot; TTL: %4 Timeout: %5s</source>
+ <translation>Configurações atuais: Filtro: &quot;%2&quot; Busca: &quot;%3&quot; TTL: %4 Tempo limite: %5s</translation>
+ </message>
+ <message>
+ <source>network</source>
+ <translation>rede</translation>
+ </message>
+ <message>
+ <source>USB bus</source>
+ <translation>Barramento USB</translation>
+ </message>
+ <message>
+ <source>parallel port</source>
+ <translation>porta paralela</translation>
+ </message>
+ <message>
+ <source>Model</source>
+ <translation>Modelo</translation>
+ </message>
+ <message>
+ <source>Serial No.</source>
+ <translation>Nº. de Série</translation>
+ </message>
+ <message>
+ <source>IP Address</source>
+ <translation>Endereço IP</translation>
+ </message>
+ <message>
+ <source>Host Name</source>
+ <translation>Nome do host</translation>
+ </message>
+ <message>
+ <source>Device</source>
+ <translation>Dispositivo</translation>
+ </message>
+ <message>
+ <source>Device URI</source>
+ <translation>URI do dispositivo</translation>
+ </message>
+ <message>
+ <source>%1 device(s) found on the %1:</source>
+ <translation>%1 dispositivo(s) encontrado(s) em %1:</translation>
+ </message>
+ <message>
+ <source>%1 device(s) found on the %1 at address %2:</source>
+ <translation>%1 dispositivo(s) encontrado(s) em %1 no endereço %2:</translation>
+ </message>
+ <message>
+ <source>%1 device(s) found on the %1 at ID %2:</source>
+ <translation>%1 dispositivo(s) encontrado(s) em %1 no ID %2:</translation>
+ </message>
+ <message>
+ <source>%1 device(s) found on the %1 device node ID %2:</source>
+ <translation>%1 dispositivo(s) encontrado(s) em %1 no ID de nós de dispositivos %2:</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Device not found or invalid HPLIP device.&lt;/b&gt;&lt;p&gt;If you specified a USB ID, IP address, or other parameter, please re-check it and try again.</source>
+ <translation>&lt;b&gt;Dispositivo não encontrado ou dispositivo HPLIP inválido.&lt;/b&gt;&lt;p&gt;Se foi especificado um ID USB, um endereço de IP ou outro parâmetro, verifique e tente novamente.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;PPD not file found.&lt;/b&gt;&lt;p&gt;An appropriate PPD file could not be found. Please check your HPLIP install, use &lt;i&gt;Select Other...&lt;/i&gt;, or download one from linuxprinting.org.</source>
+ <translation>&lt;b&gt;Arquivo PPD não encontrado.&lt;/b&gt;&lt;p&gt;Não foi encontrado um arquivo PPD adequado. Verifique a instalação do HPLIP, utilize &lt;i&gt;Selecionar outro...&lt;/i&gt;, ou faça o download de um de linuxprinting.org.</translation>
+ </message>
+ <message>
+ <source>You must enter a name for the printer.</source>
+ <translation>É necessário digitar um nome para a impressora.</translation>
+ </message>
+ <message>
+ <source>A printer already exists with this name. Please choose a different name.</source>
+ <translation>Já existe uma impressora com esse nome. Escolha um nome diferente.</translation>
+ </message>
+ <message>
+ <source>You must enter a fax name.</source>
+ <translation>É necessário digitar um nome de fax.</translation>
+ </message>
+ <message>
+ <source>A fax already exists with this name. Please choose a different name.</source>
+ <translation>Já existe um fax com esse nome. Escolha um nome diferente.</translation>
+ </message>
+ <message>
+ <source>Unable to communicate with the device. Please check the device and try again.</source>
+ <translation>Não foi possível se comunicar com o dispositivo. Verifique o dispositivo e tente novamente.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Device I/O Error&lt;/b&gt;&lt;p&gt;Could not communicate with device. Device may be busy.</source>
+ <translation>&lt;b&gt;Erro de E/S do dispositivo&lt;/b&gt;&lt;p&gt;Não foi possível se comunicar com o dispositivo. O dispositivo pode estar ocupado.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Printer queue setup failed.&lt;/b&gt;&lt;p&gt;Please restart CUPS and try again.</source>
+ <translation>&lt;b&gt;Falha na configuração da fila de impressoras.&lt;/b&gt;&lt;p&gt;Reinicie o CUPS e tente novamente.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Unable to find HP fax PPD file.&lt;/b&gt;&lt;p&gt;Please check you HPLIP installation and try again.</source>
+ <translation>&lt;b&gt;Não foi possível encontrar o arquivo PPD do fax HP.&lt;/b&gt;&lt;p&gt;Verifique a instalação do HPLIP e tente novamente.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Fax queue setup failed.&lt;/b&gt;&lt;p&gt;Please restart CUPS and try again.</source>
+ <translation>&lt;b&gt;Falha na configuração da fila de fax.&lt;/b&gt;&lt;p&gt;Reinicie o CUPS e tente novamente.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Unable to print to printer.&lt;/b&gt;&lt;p&gt;Please check device and try again.</source>
+ <translation>&lt;b&gt;Não foi possível imprimir na impressora.&lt;/b&gt;&lt;p&gt;Verifique o dispositivo e tente novamente.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;No CUPS queue found for device.&lt;/b&gt;&lt;p&gt;Please install the printer in CUPS and try again.</source>
+ <translation>&lt;b&gt;Nenhuma fila do CUPS encontrada para o dispositivo.&lt;/b&gt;&lt;p&gt;Instale a impressora no CUPS e tente novamente.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Printer Error.&lt;/b&gt;&lt;p&gt;Printer is busy, offline, or in an error state. Please check the device and try again.</source>
+ <translation>&lt;b&gt;Erro da impressora.&lt;/b&gt;&lt;p&gt;A impressora está ocupada, off-line ou em um estado de erro. Verifique o dispositivo e tente novamente.</translation>
+ </message>
+</context>
+<context>
+ <name>SetupForm_base</name>
+ <message>
+ <source>PPD File</source>
+ <translation>Arquivo PPD</translation>
+ </message>
+ <message>
+ <source>Description</source>
+ <translation>Descrição</translation>
+ </message>
+ <message>
+ <source>HP Device Manger - Printer Setup Wizard</source>
+ <translation>HP Device Manager - Assistente de instalação da impressora</translation>
+ </message>
+ <message>
+ <source>Connection (I/O) Type</source>
+ <translation>Tipo de conexão (E/S)</translation>
+ </message>
+ <message>
+ <source>Universal Serial Bus (USB)</source>
+ <translation>Barramento serial universal (USB)</translation>
+ </message>
+ <message>
+ <source>Network/Ethernet/Wireless (direct connection or JetDirect)</source>
+ <translation>Rede/Ethernet/Sem fio (conexão direta ou JetDirect)</translation>
+ </message>
+ <message>
+ <source>Parallel Port (LPT)</source>
+ <translation>Porta paralela (LPT)</translation>
+ </message>
+ <message>
+ <source>Advanced...</source>
+ <translation>Avançado...</translation>
+ </message>
+ <message>
+ <source>Choose Connection Type</source>
+ <translation>Escolher tipo de conexão</translation>
+ </message>
+ <message>
+ <source>probeHeadingTextLabel</source>
+ <translation>probeHeadingTextLabel</translation>
+ </message>
+ <message>
+ <source>Find Manually...</source>
+ <translation>Encontrar manualmente...</translation>
+ </message>
+ <message>
+ <source>Refresh</source>
+ <translation>Atualizar</translation>
+ </message>
+ <message>
+ <source>Select from Discovered Devices</source>
+ <translation>Selecionar de dispositivos descobertos</translation>
+ </message>
+ <message>
+ <source>Select Other...</source>
+ <translation>Selecionar outra...</translation>
+ </message>
+ <message>
+ <source>Defaults</source>
+ <translation>Padrões</translation>
+ </message>
+ <message>
+ <source>Please chose the PPD file (by name and description) that most closely matches your printer. &lt;i&gt;Note: The model name of the printer may vary somehwat from the PPD file name, for example, a Deskjet 5550 may have a PPD file with the model name of Deskjet_5500_series.&lt;/i&gt;</source>
+ <translation>Escolha o arquivo PPD (por nome e descrição) que mais combine com a impressora. &lt;i&gt;Nota: O nome do modelo da impressora pode ser um pouco diferente do nome do arquivo PPD. Por exemplo, uma Deskjet 5550 pode ter um arquivo PPD com o nome do modelo Deskjet_5550_series.&lt;/i&gt;</translation>
+ </message>
+ <message>
+ <source>Select/Confirm PPD File</source>
+ <translation>Selecionar/confirmar arquivo PPD</translation>
+ </message>
+ <message>
+ <source>Printer Information</source>
+ <translation>Informações da impressora</translation>
+ </message>
+ <message>
+ <source>Default</source>
+ <translation>Padrão</translation>
+ </message>
+ <message>
+ <source>Location:</source>
+ <translation>Local:</translation>
+ </message>
+ <message>
+ <source>Printer Name:</source>
+ <translation>Nome da impressora:</translation>
+ </message>
+ <message>
+ <source>Description:</source>
+ <translation>Descrição:</translation>
+ </message>
+ <message>
+ <source>Fax Information</source>
+ <translation>Informações do fax</translation>
+ </message>
+ <message>
+ <source>Fax Name:</source>
+ <translation>Nome do fax:</translation>
+ </message>
+ <message>
+ <source>Name/Company:</source>
+ <translation>Nome/empresa:</translation>
+ </message>
+ <message>
+ <source>Fax Number:</source>
+ <translation>Fax:</translation>
+ </message>
+ <message>
+ <source>Setup PC send fax</source>
+ <translation>Instalar envio de fax do PC</translation>
+ </message>
+ <message>
+ <source>Click &quot;Next &gt;&quot; to install the printer on your system.</source>
+ <translation>Clique em &quot;Avançar&gt;&quot; para instalar a impressora no sistema.</translation>
+ </message>
+ <message>
+ <source>Enter Printer Information</source>
+ <translation>Digitar informações da impressora</translation>
+ </message>
+ <message>
+ <source>Send test page to printer</source>
+ <translation>Enviar página de teste à impressora</translation>
+ </message>
+ <message>
+ <source>Fax Summary</source>
+ <translation>Resumo do fax</translation>
+ </message>
+ <message>
+ <source>Printer Summary</source>
+ <translation>Resumo da impressora</translation>
+ </message>
+ <message>
+ <source>PPD File:</source>
+ <translation>Arquivo PPD:</translation>
+ </message>
+ <message>
+ <source>The printer has been successfully installed on your system.</source>
+ <translation>A impressora foi instalada no sistema com êxito.</translation>
+ </message>
+ <message>
+ <source>Finished Adding Printer</source>
+ <translation>Acréscimo da impressora finalizado</translation>
+ </message>
+</context>
+<context>
+ <name>SetupManualFind</name>
+ <message>
+ <source>Please enter the printer&apos;s network hostname or IP address.</source>
+ <translation>Digite o nome do host da rede ou o endereço de IP da impressora.</translation>
+ </message>
+ <message>
+ <source>&lt;i&gt;(IPv4 address &quot;a.b.c.d&quot; or &quot;hostname&quot;.)&lt;/i&gt;</source>
+ <translation>&lt;i&gt;(Endereço IPv4 &quot;a.b.c.d&quot; ou &quot;nome do host&quot;.)&lt;/i&gt;</translation>
+ </message>
+ <message>
+ <source>Hostname or IP Address:</source>
+ <translation>Nome do host ou endereço IP:</translation>
+ </message>
+ <message>
+ <source>Please enter the USB ID for the printer.</source>
+ <translation>Digite o ID USB da impressora.</translation>
+ </message>
+ <message>
+ <source>&lt;i&gt;(&quot;xxx:yyy&quot; where xxx is the USB bus ID and yyy is the USB device ID. The &apos;:&apos; and all leading zeroes must be present. Use &apos;lsusb&apos; to determine this information.)&lt;/i&gt;</source>
+ <translation>&lt;i&gt;(&quot;xxx:yyy&quot; onde xxx é o ID do barramento USB e yyy é o ID do dispositivo USB. Os &apos;:&apos; e todos os zeros à esquerda devem estar presentes. Utilize &apos;lsusb&apos; para determinar essas informações).&lt;/i&gt;</translation>
+ </message>
+ <message>
+ <source>USB ID:</source>
+ <translation>ID USB:</translation>
+ </message>
+ <message>
+ <source>Please enter the filesystem device node for the printer.</source>
+ <translation>Digite o nó do dispositivo do sistema de arquivos da impressora.</translation>
+ </message>
+ <message>
+ <source> &lt;i&gt;(&quot;/dev/parportX&quot;, X=0,1,2,...)&lt;/i&gt;</source>
+ <translation>&lt;i&gt;(&quot;/dev/parportX&quot;, X=0,1,2,...)&lt;/i&gt;</translation>
+ </message>
+ <message>
+ <source>Device Node:</source>
+ <translation>Nó do dispositivo:</translation>
+ </message>
+</context>
+<context>
+ <name>SetupManualFind_base</name>
+ <message>
+ <source>HP Device Manager - Manually Find Device</source>
+ <translation>HP Device Manager - Encontrar dispositivo manualmente</translation>
+ </message>
+ <message>
+ <source>TEXT</source>
+ <translation>TEXTO</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Cancelar</translation>
+ </message>
+ <message>
+ <source>Find</source>
+ <translation>Encontrar</translation>
+ </message>
+ <message>
+ <source>textLabel1</source>
+ <translation>textLabel1</translation>
+ </message>
+ <message>
+ <source>IP/HN/SER/USB/DEV:</source>
+ <translation>IP/HN/SER/USB/DEV:</translation>
+ </message>
+</context>
+<context>
+ <name>SetupSettings_base</name>
+ <message>
+ <source>HP Device Manager - Setup Filters, Search and Settings</source>
+ <translation>HP Device Manager - Definir filtros, buscas e configurações</translation>
+ </message>
+ <message>
+ <source>Discovery Filter</source>
+ <translation>Filtro de descoberta</translation>
+ </message>
+ <message>
+ <source>Discover all devices</source>
+ <translation>Descobrir todos os dispositivos</translation>
+ </message>
+ <message>
+ <source>Only discover devices that support the following functionality:</source>
+ <translation>Descobrir apenas dispositivos que suportem a funcionalidade a seguir:</translation>
+ </message>
+ <message>
+ <source>PC Initiated Copying</source>
+ <translation>Cópia iniciada no PC</translation>
+ </message>
+ <message>
+ <source>PC Photocard Access</source>
+ <translation>Acesso a cartões de foto do PC</translation>
+ </message>
+ <message>
+ <source>Scan to PC</source>
+ <translation>Digitalizar para PC</translation>
+ </message>
+ <message>
+ <source>PC Send Fax</source>
+ <translation>Enviar fax do PC</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Cancelar</translation>
+ </message>
+ <message>
+ <source>Defaults</source>
+ <translation>Padrões</translation>
+ </message>
+ <message>
+ <source>Discovery Search</source>
+ <translation>Busca de descoberta</translation>
+ </message>
+ <message>
+ <source>Search Term:</source>
+ <translation>Termo de busca:</translation>
+ </message>
+ <message>
+ <source>Network Discovery Settings</source>
+ <translation>Configurações de descoberta de rede</translation>
+ </message>
+ <message>
+ <source>TTL:</source>
+ <translation>TTL:</translation>
+ </message>
+ <message>
+ <source>Timeout (secs):</source>
+ <translation>Tempo limite (s):</translation>
+ </message>
+</context>
+<context>
+ <name>StringTable</name>
+ <message>
+ <source>Unknown</source>
+<translation>Desconhecido</translation>
+ </message>
+ <message>
+ <source>Please correct the problem and try again.</source>
+<translation>Corrija o problema e tente novamente.</translation>
+ </message>
+ <message>
+ <source>Please correct the problem and press continue on the printer.</source>
+<translation>Corrija o problema e pressione Continuar na impressora.</translation>
+ </message>
+ <message>
+ <source>The printer has started a print job.</source>
+<translation>A impressora iniciou um trabalho de impressão.</translation>
+ </message>
+ <message>
+ <source>Print job has completed.</source>
+<translation>O trabalho de impressão foi concluído.</translation>
+ </message>
+ <message>
+ <source>Started rendering a fax job.</source>
+<translation>A renderização de um trabalho de fax foi iniciada.</translation>
+ </message>
+ <message>
+ <source>Rendering job completed.</source>
+<translation>Renderização do trabalho concluída.</translation>
+ </message>
+ <message>
+ <source>The printer is idle.</source>
+<translation>A impressora está ociosa.</translation>
+ </message>
+ <message>
+ <source>The printer is busy.</source>
+<translation>A impressora está ocupada.</translation>
+ </message>
+ <message>
+ <source>The print job is continuing.</source>
+<translation>O trabalho de impressão está em andamento.</translation>
+ </message>
+ <message>
+ <source>Turning off.</source>
+<translation>Desligando.</translation>
+ </message>
+ <message>
+ <source>Report printing.</source>
+<translation>Relatório sendo impresso.</translation>
+ </message>
+ <message>
+ <source>Canceling.</source>
+<translation>Cancelando.</translation>
+ </message>
+ <message>
+ <source>Waiting for ink to dry.</source>
+<translation>Aguardando a secagem da tinta.</translation>
+ </message>
+ <message>
+ <source>Pen change.</source>
+<translation>Mudança de caneta.</translation>
+ </message>
+ <message>
+ <source>The printer is out of paper.</source>
+<translation>A impressora está sem papel.</translation>
+ </message>
+ <message>
+ <source>Please load more paper and follow the instructions on the front panel (if any) to continue printing.</source>
+<translation>Coloque mais papel e siga as instruções do painel frontal (se houver) para continuar a impressão.</translation>
+ </message>
+ <message>
+ <source>Banner eject needed.</source>
+<translation>É preciso ejetar a faixa.</translation>
+ </message>
+ <message>
+ <source>Banner mismatch.</source>
+<translation>A faixa é diferente.</translation>
+ </message>
+ <message>
+ <source>Photo mismatch.</source>
+<translation>A foto é diferente.</translation>
+ </message>
+ <message>
+ <source>Duplex mismatch.</source>
+<translation>O duplex é diferente.</translation>
+ </message>
+ <message>
+ <source>Paper or cartridge carriage jammed.</source>
+<translation>Congestionamento do papel ou do carro do cartucho.</translation>
+ </message>
+ <message>
+ <source>Please clear the jam and press continue on the printer.</source>
+<translation>Solucione a obstrução e pressione Continuar na impressora.</translation>
+ </message>
+ <message>
+ <source>There is a problem with a cartridge.</source>
+<translation>Há um problema com um cartucho.</translation>
+ </message>
+ <message>
+ <source>Powering down.</source>
+<translation>Desligando.</translation>
+ </message>
+ <message>
+ <source>Front panel test.</source>
+<translation>Teste do painel frontal.</translation>
+ </message>
+ <message>
+ <source>Clean out tray missing.</source>
+<translation>Falta a bandeja de limpeza.</translation>
+ </message>
+ <message>
+ <source>Output bin full.</source>
+<translation>Compartimento de saída cheio.</translation>
+ </message>
+ <message>
+ <source>Media size mismatch.</source>
+<translation>O tamanho da mídia é diferente.</translation>
+ </message>
+ <message>
+ <source>Duplexer is jammed.</source>
+<translation>O duplexador está congestionado.</translation>
+ </message>
+ <message>
+ <source>An ink cartridge is out of ink.</source>
+<translation>Um cartucho está sem tinta.</translation>
+ </message>
+ <message>
+ <source>Internal device error.</source>
+<translation>Erro do dispositivo interno.</translation>
+ </message>
+ <message>
+ <source>Second tray missing.</source>
+<translation>Falta a segunda bandeja.</translation>
+ </message>
+ <message>
+ <source>Duplexer missing.</source>
+<translation>Falta o duplexador.</translation>
+ </message>
+ <message>
+ <source>Rear tray missing.</source>
+<translation>Falta a bandeja traseira.</translation>
+ </message>
+ <message>
+ <source>Cartridge not latched.</source>
+<translation>O cartucho não está travado.</translation>
+ </message>
+ <message>
+ <source>Battery very low.</source>
+<translation>Bateria muito fraca.</translation>
+ </message>
+ <message>
+ <source>Output tray closed.</source>
+<translation>Bandeja de saída fechada.</translation>
+ </message>
+ <message>
+ <source>Manual feed blocked.</source>
+<translation>Alimentação manual bloqueada.</translation>
+ </message>
+ <message>
+ <source>Rear feed blocked.</source>
+<translation>Alimentação traseira bloqueada.</translation>
+ </message>
+ <message>
+ <source>Second tray out of paper.</source>
+<translation>A segunda bandeja está sem papel.</translation>
+ </message>
+ <message>
+ <source>Input tray locked.</source>
+<translation>Bandeja de entrada bloqueada.</translation>
+ </message>
+ <message>
+ <source>Non-HP ink.</source>
+<translation>A tinta não é HP.</translation>
+ </message>
+ <message>
+ <source>Pen calibration needs resume.</source>
+<translation>É necessário retomar a calibragem da caneta.</translation>
+ </message>
+ <message>
+ <source>Media type mismatch.</source>
+<translation>O tipo de mídia é diferente.</translation>
+ </message>
+ <message>
+ <source>Custom media mismatch.</source>
+<translation>A mídia personalizada é diferente.</translation>
+ </message>
+ <message>
+ <source>Pen cleaning in progress.</source>
+<translation>Limpeza da caneta em andamento.</translation>
+ </message>
+ <message>
+ <source>Pen checking in progress.</source>
+<translation>Verificação da caneta em andamento.</translation>
+ </message>
+ <message>
+ <source>Black cartridge is low on ink</source>
+<translation>O cartucho preto está com pouca tinta.</translation>
+ </message>
+ <message>
+ <source>Tri-color cartridge is low on ink</source>
+<translation>O cartucho de três cores está com pouca tinta.</translation>
+ </message>
+ <message>
+ <source>Photo cartridge is low on ink</source>
+<translation>O cartucho de fotos está com pouca tinta.</translation>
+ </message>
+ <message>
+ <source>Cyan cartridge is low on ink</source>
+<translation>O cartucho ciano está com pouca tinta.</translation>
+ </message>
+ <message>
+ <source>Magenta cartridge is low on ink</source>
+<translation>O cartucho magenta está com pouca tinta.</translation>
+ </message>
+ <message>
+ <source>Yellow cartridge is low on ink</source>
+<translation>O cartucho amarelo está com pouca tinta.</translation>
+ </message>
+ <message>
+ <source>Photo cyan cartridge is low on ink</source>
+<translation>O cartucho ciano de fotos está com pouca tinta.</translation>
+ </message>
+ <message>
+ <source>Photo magenta cartridge is low on ink</source>
+<translation>O cartucho magenta de fotos está com pouca tinta.</translation>
+ </message>
+ <message>
+ <source>Photo yellow cartridge is low on ink</source>
+<translation>O cartucho amarelo de fotos está com pouca tinta.</translation>
+ </message>
+ <message>
+ <source>Photo gray cartridge is low on ink</source>
+<translation>O cartucho cinza de fotos está com pouca tinta.</translation>
+ </message>
+ <message>
+ <source>Photo blue cartridge is low on ink</source>
+<translation>O cartucho azul de fotos está com pouca tinta.</translation>
+ </message>
+ <message>
+ <source>Black cartridge is low on toner</source>
+<translation>O cartucho preto está com pouco toner.</translation>
+ </message>
+ <message>
+ <source>Cyan cartridge is low on toner</source>
+<translation>O cartucho ciano está com pouco toner.</translation>
+ </message>
+ <message>
+ <source>Magenta cartridge is low on toner</source>
+<translation>O cartucho magenta está com pouco toner.</translation>
+ </message>
+ <message>
+ <source>Yellow cartridge is low on toner</source>
+<translation>O cartucho amarelo está com pouco toner.</translation>
+ </message>
+ <message>
+ <source>Warming up.</source>
+<translation>Aquecendo.</translation>
+ </message>
+ <message>
+ <source>Low paper.</source>
+<translation>Pouco papel.</translation>
+ </message>
+ <message>
+ <source>Door open.</source>
+<translation>Porta aberta.</translation>
+ </message>
+ <message>
+ <source>Offline.</source>
+<translation>Offline.</translation>
+ </message>
+ <message>
+ <source>Low toner.</source>
+<translation>Pouco toner.</translation>
+ </message>
+ <message>
+ <source>No toner.</source>
+<translation>Sem toner.</translation>
+ </message>
+ <message>
+ <source>Service request.</source>
+<translation>Solicitação de manutenção.</translation>
+ </message>
+ <message>
+ <source>Fuser error.</source>
+<translation>Erro do fusível.</translation>
+ </message>
+ <message>
+ <source>Unsupported printer model.</source>
+<translation>Modelo de impressora incompatível.</translation>
+ </message>
+ <message>
+ <source>Scan job started.</source>
+<translation>Trabalho de digitalização iniciado.</translation>
+ </message>
+ <message>
+ <source>Scan job completed.</source>
+<translation>Trabalho de digitalização concluído.</translation>
+ </message>
+ <message>
+ <source>Scan job failed.</source>
+<translation>Falha do trabalho de digitalização.</translation>
+ </message>
+ <message>
+ <source>Fax job started.</source>
+<translation>Trabalho de fax iniciado.</translation>
+ </message>
+ <message>
+ <source>Fax job complete.</source>
+<translation>Trabalho de fax concluído.</translation>
+ </message>
+ <message>
+ <source>Fax job failed.</source>
+<translation>Falha do trabalho de fax.</translation>
+ </message>
+ <message>
+ <source>Fax job canceled.</source>
+<translation>Trabalho de fax cancelado.</translation>
+ </message>
+ <message>
+ <source>Fax send job continuing.</source>
+<translation>Trabalho de envio do fax em andamento.</translation>
+ </message>
+ <message>
+ <source>Fax receive job continuing.</source>
+<translation>Trabalho de recebimento do fax em andamento.</translation>
+ </message>
+ <message>
+ <source>Copy job started.</source>
+<translation>Trabalho de cópia iniciado.</translation>
+ </message>
+ <message>
+ <source>Copy job complete.</source>
+<translation>Trabalho de cópia concluído.</translation>
+ </message>
+ <message>
+ <source>Copy job failed.</source>
+<translation>Falha do trabalho de cópia.</translation>
+ </message>
+ <message>
+ <source>Copy job canceled.</source>
+<translation>Trabalho de cópia cancelado.</translation>
+ </message>
+ <message>
+ <source>Device is powered down or unplugged.</source>
+<translation>O dispositivo está desligado ou desconectado.</translation>
+ </message>
+ <message>
+ <source>Device communication error.</source>
+<translation>Erro de comunicação do dispositivo.</translation>
+ </message>
+ <message>
+ <source>Device is busy.</source>
+<translation>Dispositivo ocupado.</translation>
+ </message>
+ <message>
+ <source>No data.</source>
+<translation>Nenhum dado.</translation>
+ </message>
+ <message>
+ <source>Unsupported I/O bus.</source>
+<translation>Barramento E/S incompatível.</translation>
+ </message>
+ <message>
+ <source>Device does not support requested operation.</source>
+<translation>O dispositivo não oferece suporte para a operação solicitada.</translation>
+ </message>
+ <message>
+ <source>To send a fax you must run hp-sendfax first.</source>
+<translation>Para enviar um fax, execute o hp-sendfax primeiro.</translation>
+ </message>
+ <message>
+ <source>Run hp-sendfax now to continue. Fax will resume within 10 seconds.</source>
+<translation>Execute o hp-sendfax agora para continuar. O fax será retomado em 10 segundos.</translation>
+ </message>
+ <message>
+ <source>Photocard unload started.</source>
+<translation>Descarregamento do cartão de foto iniciado.</translation>
+ </message>
+ <message>
+ <source>Photocard unload ended.</source>
+<translation>Descarregamento do cartão de foto encerrado.</translation>
+ </message>
+ <message>
+ <source>Photocard unload failed.</source>
+<translation>Falha do descarregamento do cartão de foto.</translation>
+ </message>
+ <message>
+ <source>Make sure photocard is inserted properly and try again.</source>
+<translation>Verifique se o cartão de foto está inserido corretamente e tente novamente.</translation>
+ </message>
+ <message>
+ <source>Unable to mount photocard on device.</source>
+<translation>Não foi possível montar o cartão de foto no dispositivo.</translation>
+ </message>
+ <message>
+ <source>Photocard unloaded successfully.</source>
+<translation>Descarregamento do cartão de foto realizado com êxito.</translation>
+ </message>
+ <message>
+ <source>Unknown error.</source>
+<translation>Erro desconhecido.</translation>
+ </message>
+ <message>
+ <source>Print</source>
+<translation>Instalador do HP Linux Imaging and Printing (HPLIP)</translation>
+ </message>
+ <message>
+ <source>Scan</source>
+<translation>Trabalho de digitalização iniciado.</translation>
+ </message>
+ <message>
+ <source>Send fax</source>
+<translation>Enviar fax</translation>
+ </message>
+ <message>
+ <source>Make copies</source>
+<translation>Fazer cópias</translation>
+ </message>
+ <message>
+ <source>Access photo cards</source>
+<translation>Acessar cartões de foto</translation>
+ </message>
+ <message>
+ <source>Invalid/missing</source>
+<translation>Inválido/ausente</translation>
+ </message>
+ <message>
+ <source>Invalid/missing ink cartridge</source>
+<translation>Cartucho de tinta inválido/ausente</translation>
+ </message>
+ <message>
+ <source>Invalid/missing cartridge</source>
+<translation>Cartucho inválido/ausente</translation>
+ </message>
+ <message>
+ <source>Invalid/missing print head</source>
+<translation>Cabeçote de impressão inválido/ausente</translation>
+ </message>
+ <message>
+ <source>Black print head</source>
+<translation>Cabeçote preto</translation>
+ </message>
+ <message>
+ <source>Black ink cartridge</source>
+<translation>Cartucho de tinta preta</translation>
+ </message>
+ <message>
+ <source>Black cartridge</source>
+<translation>O cartucho preto está com pouca tinta.</translation>
+ </message>
+ <message>
+ <source>Tri-color print head</source>
+<translation>Cabeçote de três cores</translation>
+ </message>
+ <message>
+ <source>Tri-color ink cartridge</source>
+<translation>Cartucho de tinta de três cores</translation>
+ </message>
+ <message>
+ <source>Tri-color cartridge</source>
+<translation>O cartucho de três cores está com pouca tinta.</translation>
+ </message>
+ <message>
+ <source>Photo print head</source>
+<translation>Cabeçote para fotos</translation>
+ </message>
+ <message>
+ <source>Photo ink cartridge</source>
+<translation>Cartucho de tinta para fotos</translation>
+ </message>
+ <message>
+ <source>Photo cartridge</source>
+<translation>O cartucho de fotos está com pouca tinta.</translation>
+ </message>
+ <message>
+ <source>Cyan print head</source>
+<translation>Cabeçote ciano</translation>
+ </message>
+ <message>
+ <source>Cyan ink cartridge</source>
+<translation>Cartucho de tinta ciano</translation>
+ </message>
+ <message>
+ <source>Cyan cartridge</source>
+<translation>O cartucho ciano está com pouca tinta.</translation>
+ </message>
+ <message>
+ <source>Magenta print head</source>
+<translation>Cabeçote magenta</translation>
+ </message>
+ <message>
+ <source>Magenta ink cartridge</source>
+<translation>Cartucho de tinta magenta</translation>
+ </message>
+ <message>
+ <source>Magenta cartridge</source>
+<translation>O cartucho magenta está com pouca tinta.</translation>
+ </message>
+ <message>
+ <source>Yellow print head</source>
+<translation>Cabeçote amarelo</translation>
+ </message>
+ <message>
+ <source>Yellow ink cartridge</source>
+<translation>Cartucho de tinta amarela</translation>
+ </message>
+ <message>
+ <source>Yellow cartridge</source>
+<translation>O cartucho amarelo está com pouca tinta.</translation>
+ </message>
+ <message>
+ <source>Photo cyan print head</source>
+<translation>Cabeçote ciano para fotos</translation>
+ </message>
+ <message>
+ <source>Photo cyan ink cartridge</source>
+<translation>Cartucho de tinta ciano para fotos</translation>
+ </message>
+ <message>
+ <source>Photo cyan cartridge</source>
+<translation>O cartucho ciano de fotos está com pouca tinta.</translation>
+ </message>
+ <message>
+ <source>Photo magenta print head</source>
+<translation>Cabeçote magenta para fotos</translation>
+ </message>
+ <message>
+ <source>Photo magenta ink cartridge</source>
+<translation>Cartucho de tinta magenta para fotos</translation>
+ </message>
+ <message>
+ <source>Photo magenta cartridge</source>
+<translation>O cartucho magenta de fotos está com pouca tinta.</translation>
+ </message>
+ <message>
+ <source>Photo yellow print head</source>
+<translation>Cabeçote amarelo para fotos</translation>
+ </message>
+ <message>
+ <source>Photo yellow ink cartridge</source>
+<translation>Cartucho de tinta amarela para fotos</translation>
+ </message>
+ <message>
+ <source>Photo yellow cartridge</source>
+<translation>O cartucho amarelo de fotos está com pouca tinta.</translation>
+ </message>
+ <message>
+ <source>Photo gray print head</source>
+<translation>Cabeçote cinza para fotos</translation>
+ </message>
+ <message>
+ <source>Photo gray ink cartridge</source>
+<translation>Cartucho de tinta cinza para fotos</translation>
+ </message>
+ <message>
+ <source>Photo gray cartridge</source>
+<translation>O cartucho cinza de fotos está com pouca tinta.</translation>
+ </message>
+ <message>
+ <source>Photo blue print head</source>
+<translation>Cabeçote azul para fotos</translation>
+ </message>
+ <message>
+ <source>Photo blue ink cartridge</source>
+<translation>Cartucho de tinta azul para fotos</translation>
+ </message>
+ <message>
+ <source>Photo blue cartridge</source>
+<translation>O cartucho azul de fotos está com pouca tinta.</translation>
+ </message>
+ <message>
+ <source>Print head</source>
+<translation>Cabeçote de impressão</translation>
+ </message>
+ <message>
+ <source>Photo magenta and photo cyan print head</source>
+<translation>Cabeçote ciano e magenta para fotos</translation>
+ </message>
+ <message>
+ <source>Magenta and yellow print head</source>
+<translation>Cabeçote magenta e amarelo</translation>
+ </message>
+ <message>
+ <source>Black and cyan print head</source>
+<translation>Cabeçote preto e ciano</translation>
+ </message>
+ <message>
+ <source>Light gray and photo black print head</source>
+<translation>Cabeçote cinza claro e preto para fotos</translation>
+ </message>
+ <message>
+ <source>Light gray ink cartridge</source>
+<translation>Cartucho de tinta cinza claro</translation>
+ </message>
+ <message>
+ <source>Medium gray ink cartridge</source>
+<translation>Cartucho de tinta cinza médio</translation>
+ </message>
+ <message>
+ <source>Photo black ink cartridge</source>
+<translation>Cartucho de tinta preta para fotos</translation>
+ </message>
+ <message>
+ <source>Cyan and magenta print head</source>
+<translation>Cabeçote ciano e magenta</translation>
+ </message>
+ <message>
+ <source>Black and yellow print head</source>
+<translation>Cabeçote preto e amarelo</translation>
+ </message>
+ <message>
+ <source>Black toner cartridge</source>
+<translation>Cartucho de toner preto</translation>
+ </message>
+ <message>
+ <source>Cyan toner cartridge</source>
+<translation>Cartucho de toner ciano</translation>
+ </message>
+ <message>
+ <source>Magenta toner cartridge</source>
+<translation>Cartucho de toner magenta</translation>
+ </message>
+ <message>
+ <source>Yellow toner cartridge</source>
+<translation>Cartucho de toner amarelo</translation>
+ </message>
+ <message>
+ <source>Maintenance kit (fuser)</source>
+<translation>Kit de manutenção (fusível)</translation>
+ </message>
+ <message>
+ <source>Document feeder (ADF) kit</source>
+<translation>Kit do alimentador de documentos (ADF)</translation>
+ </message>
+ <message>
+ <source>Drum maintenance kit</source>
+<translation>Kit de manutenção do cilindro</translation>
+ </message>
+ <message>
+ <source>Image transfer kit</source>
+<translation>Kit de transferência de imagens</translation>
+ </message>
+ <message>
+ <source>Good/OK</source>
+<translation>Bom/OK</translation>
+ </message>
+ <message>
+ <source>Fair/Moderate</source>
+<translation>Regular/Moderado</translation>
+ </message>
+ <message>
+ <source>Not installed</source>
+<translation>Não instalado</translation>
+ </message>
+ <message>
+ <source>Incorrect</source>
+<translation>Incorreto</translation>
+ </message>
+ <message>
+ <source>Failed</source>
+<translation>ERRO: Falha ao montar o cartão de foto corretamente. Verifique o dispositivo e o cartão e tente novamente.</translation>
+ </message>
+ <message>
+ <source>Overheated</source>
+<translation>Superaquecido</translation>
+ </message>
+ <message>
+ <source>Discharging</source>
+<translation>Descarregando</translation>
+ </message>
+ <message>
+ <source>Charging</source>
+<translation>Carregando</translation>
+ </message>
+ <message>
+ <source>Low</source>
+<translation>Pouco papel.</translation>
+ </message>
+ <message>
+ <source>Very low</source>
+<translation>Muito baixo</translation>
+ </message>
+ <message>
+ <source>HPLIP: Email alert test message</source>
+<translation>HPLIP: Mensagem de teste do alerta de e-mail</translation>
+ </message>
+ <message>
+ <source>This email is to test the functionality of HPLIP email alerts.</source>
+<translation>Este e-mail serve para testar a funcionalidade dos alertas de e-mail do HPLIP.</translation>
+ </message>
+ <message>
+ <source>HPLIP: Error/alert on device: </source>
+<translation>HPLIP: Erro/alerta no dispositivo:</translation>
+ </message>
+</context>
+<context>
+ <name>SupportForm_base</name>
+ <message>
+ <source>HP Device Manager - Support Information</source>
+ <translation>HP Device Manager - Informações de suporte</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Fechar</translation>
+ </message>
+ <message>
+ <source>http://hplip.sourceforge.net</source>
+ <translation>http://hplip.sourceforge.net</translation>
+ </message>
+ <message>
+ <source>HPLIP is free, open source software distributed under the MIT, BSD, and GPL licenses. &lt;b&gt;&lt;i&gt;HP does not provide formal consumer or commercial support for this software.&lt;/i&gt;&lt;/b&gt;&lt;p&gt; Support is provided informally through a series of resources on a Sourceforge.net website. On this HP sponsored website, you will find FAQs, open discussion forums, installation instructions, a product support table, and other support materials.</source>
+ <translation>O HPLIP é um software gratuito, de código aberto, distribuído com as licenças MIT, BSD e GPL. &lt;b&gt;&lt;i&gt;A HP não fornece suporte formal comercial ou aos consumidores deste software.&lt;/i&gt;&lt;/b&gt;&lt;p&gt; O suporte é fornecido informalmente por meio de uma série de recursos em um website da Sourceforge.net. Nesse website patrocinado pela HP, é possível encontrar FAQs, fóruns abertos de discussão, instruções de instalação, uma tabela de suporte a produtos e outros materiais de suporte.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;HP Sponsored Support&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Suporte patrocinado pela HP&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>NOTE: Sourceforge.net is owned and operated by OSTG, Inc. and is not affiliated with HP.</source>
+ <translation>NOTA: A Sourceforge.net pertence e é operada pela OSTG, Inc. e não é afiliada à HP.</translation>
+ </message>
+ <message>
+ <source>HP</source>
+ <translation>HP</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;README File&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Arquivo LEIAME&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>A readme file was shipped with your version of HPLIP. This file contains the product support table, a troubleshooting guide, and other support resources.</source>
+ <translation>Um arquivo Leiame foi fornecido com sua versão do HPLIP. Esse arquivo contém a tabela de suporte a produtos, um guia de solução de problemas e outros recursos de suporte.</translation>
+ </message>
+ <message>
+ <source>hplip_readme.html</source>
+ <translation>hplip_leiame.html</translation>
+ </message>
+ <message>
+ <source>README File</source>
+ <translation>Arquivo LEIAME</translation>
+ </message>
+ <message>
+ <source>http://linuxprinting.org</source>
+ <translation>http://linuxprinting.org</translation>
+ </message>
+ <message>
+ <source>General Linux printing assistance is also available from open discussion forums, documentation, access to PPD files, etc. from:</source>
+ <translation>A assistência geral à impressão do Linux também está disponível em forums abertos de discussão, documentação, acesso a arquivos PPD, etc., em:</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;linuxprinting.org&lt;/b&gt;</source>
+ <translation>&lt;b&gt;linuxprinting.org&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>NOTE: Linuxprinting.org is operated through the generous efforts of Grant Taylor and Till Kamppeter and is not affiliated with HP.</source>
+ <translation>NOTA: O website Linuxprinting.org é operado por meio dos generosos esforços de Grant Taylor e Till Kamppeter e não é afiliado à HP.</translation>
+ </message>
+ <message>
+ <source>linuxprinting.org</source>
+ <translation>linuxprinting.org</translation>
+ </message>
+ <message>
+ <source>http://cups.org</source>
+ <translation>http://cups.org</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;CUPS&lt;/b&gt;</source>
+ <translation>&lt;b&gt;CUPS&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Information about CUPS (Common UNIX Printing System) is available at cups.org. This website also contains forums and other support resources for printing on Linux:</source>
+ <translation>Informações sobre o CUPS (Common UNIX Printing System) estão disponíveis em cups.org . Esse website também contém fóruns e outros recursos de suporte para impressão no Linux:</translation>
+ </message>
+ <message>
+ <source>NOTE: CUPS and the CUPS website is owned and operated by Easy Software Products and is not affiliated with HP.</source>
+ <translation>NOTA: O CUPS e o website do CUPS pertencem e são operados pela Easy Software Products e não são afiliados à HP.</translation>
+ </message>
+ <message>
+ <source>CUPS</source>
+ <translation>CUPS</translation>
+ </message>
+</context>
+<context>
+ <name>UnloadForm</name>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;No devices found that support photo card access.&lt;/b&gt;&lt;p&gt;Please make sure your device is properly installed and try again.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Nenhum dispositivo encontrado que suporte acesso a cartões de foto.&lt;/b&gt;&lt;p&gt;Verifique se o dispositivo está instalado corretamente e tente novamente.</translation>
+ </message>
+ <message>
+ <source>HP Device Manager - Unload Photo Card</source>
+ <translation>HP Device Manager - Descarregar cartão de foto</translation>
+ </message>
+</context>
+<context>
+ <name>UnloadForm_base</name>
+ <message>
+ <source>HP Device Manager - Unload Files from Photo Card</source>
+ <translation>HP Device Manager - Descarregar arquivos de cartão de foto</translation>
+ </message>
+ <message>
+ <source>Device:</source>
+ <translation>Dispositivo:</translation>
+ </message>
+ <message>
+ <source>Unload Selected Files</source>
+ <translation>Descarregar arquivos selecionados</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Fechar</translation>
+ </message>
+ <message>
+ <source>Unload Directory:</source>
+ <translation>Descarregar diretório:</translation>
+ </message>
+ <message>
+ <source>Browse...</source>
+ <translation>Procurar...</translation>
+ </message>
+ <message>
+ <source>File Removal:</source>
+ <translation>Remoção de arquivos:</translation>
+ </message>
+ <message>
+ <source>Leave all files on photo card</source>
+ <translation>Deixar todos os arquivos no cartão de foto</translation>
+ </message>
+ <message>
+ <source>Remove selected files</source>
+ <translation>Remover arquivos selecionados</translation>
+ </message>
+ <message>
+ <source>Select Files to Unload from Photo Card:</source>
+ <translation>Selecionar arquivos para descarregar do cartão de foto:</translation>
+ </message>
+ <message>
+ <source>Select All</source>
+ <translation>Selecionar todos</translation>
+ </message>
+ <message>
+ <source>Select None</source>
+ <translation>Não selecionar nenhum</translation>
+ </message>
+ <message>
+ <source>Show Thumbnails</source>
+ <translation>Mostrar miniaturas</translation>
+ </message>
+</context>
+<context>
+ <name>WaitForm_base</name>
+ <message>
+ <source>HP Device Manager - Waiting</source>
+ <translation>Gerente de dispositivos HP - Aguardando</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Waiting for procedure to finish...&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Aguardando conclusão do procedimento…&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Cancelar</translation>
+ </message>
+</context>
+<context>
+ <name>self.form.FailureUI</name>
+ <message>
+ <source>&lt;b&gt;Unable to mount photo card on device.&lt;/b&gt;&lt;p&gt;Check that device is powered on and photo card is correctly inserted.</source>
+<translation>&lt;b&gt;Não foi possível montar o cartão de foto no dispositivo.&lt;/b&gt;&lt;p&gt;Verifique se o dispositivo está ligado e se o cartão de foto está inserido corretamente.</translation>
+ </message>
+</context>
+</TS>
diff --git a/data/localization/hplip_ru.qm b/data/localization/hplip_ru.qm
new file mode 100644
index 0000000..c2b4e74
--- /dev/null
+++ b/data/localization/hplip_ru.qm
Binary files differ
diff --git a/data/localization/hplip_ru.ts b/data/localization/hplip_ru.ts
new file mode 100755
index 0000000..5a14078
--- /dev/null
+++ b/data/localization/hplip_ru.ts
@@ -0,0 +1,5048 @@
+<!DOCTYPE TS><TS>
+<context>
+ <name>@default</name>
+ <message>
+ <source>&lt;b&gt;Unable to mount photo card on device.&lt;/b&gt;&lt;p&gt;Check that device is powered on and photo card is correctly inserted.</source>
+<translation>&lt;b&gt;Ðе удаетÑÑ ÑƒÑтановить в уÑтройÑтво карту памÑти Ð´Ð»Ñ Ñ„Ð¾Ñ‚Ð¾Ð³Ñ€Ð°Ñ„Ð¸Ð¹.&lt;/b&gt;&lt;p&gt;УбедитеÑÑŒ, что уÑтройÑтво включено и карта памÑти вÑтавлена правильно.</translation>
+ </message>
+</context>
+<context>
+ <name>AboutDlg_base</name>
+ <message>
+ <source>HP Device Manager - About</source>
+ <translation>ДиÑпетчер уÑтройÑтв HP — О программе</translation>
+ </message>
+ <message>
+ <source>&lt;font size=&quot;+3&quot;&gt;&lt;p align=&quot;center&quot;&gt;HP Linux Imaging and Printing (HPLIP)&lt;/p&gt;&lt;/font&gt;</source>
+ <translation>&lt;font size=&quot;+3&quot;&gt;&lt;p align=&quot;center&quot;&gt;Создание изображений и печать в операционной ÑиÑтеме (HPLIP)&lt;/p&gt;&lt;/font&gt;</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Закрыть</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;HPLIP Software Version:&lt;/b&gt;</source>
+ <translation>&lt;b&gt;ВерÑÐ¸Ñ Ð¿Ð°ÐºÐµÑ‚Ð° программ HPLIP:&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>0.0.0</source>
+ <translation>0.0.0</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Device Manager Software Version:&lt;/b&gt;</source>
+ <translation>&lt;b&gt;ВерÑÐ¸Ñ Ð´Ð¸Ñпетчера уÑтройÑтв:&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Authors and Contributors:&lt;/b&gt;\nDavid Suffield, Don Welch, Shiyun Yie, Raghothama Cauligi, John Oleinik, Cory Meisch, Foster Nuffer, Pete Parks, Jacqueline Pitter, David Paschal,\nSteve DeRoos, Mark Overton, Aaron Albright, Smith Kennedy, John Hosszu, Chris Wiesner, Henrique M. Holschuh, Till Kamppeter, Linus Araque, Mark Crawford, Charlie Moore</source>
+ <translation>&lt;b&gt;Ðвторы и корреÑпонденты:&lt;/b&gt;
+ДÑвид Саффилд, Дон УÑлч, Шийюн Йи, Раготама Колиджи, Джон Олейник, Кори Мейх, ФоÑтер Ðаффер, Пит ПаркÑ, Жаклин Питтер, ДÑвид ПаÑкаль,
+Стив ДеруÑ, Марк Овертон, Ðарон Олбрайт, Смит Кеннеди, Джон Хошу, ÐšÑ€Ð¸Ñ Ð’Ð¸Ñнер, Генрих Ðœ. Хольшух, Тил Кампетер, Linus Araque, Mark Crawford, Charlie Moore</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;License and Copyright:&lt;/b&gt;
+(c) Copyright 2006 Hewlett-Packard Development Company, L.P. This software is licensed under the GNU General Public License (GPL), BSD, and MIT licenses. See the software sources for details.</source>
+ <translation>&lt;b&gt;Ð›Ð¸Ñ†ÐµÐ½Ð·Ð¸Ñ Ð¸ авторÑкое право:&lt;/b&gt;
+(c) ÐšÐ¾Ð¼Ð¿Ð°Ð½Ð¸Ñ Hewlett-Packard Development, L.P., 2006 г. Данное программное обеÑпечение имеет Ñтандартную общедоÑтупную лицензию GNU (GPL), лицензии BSD и MIT. Подробнее Ñм. в иÑходных текÑтах ПО.</translation>
+ </message>
+</context>
+<context>
+ <name>Align10Form_Base</name>
+ <message>
+ <source>HP Device Manager - Alignment</source>
+ <translation>ДиÑпетчер уÑтройÑтв HP — Выравнивание</translation>
+ </message>
+ <message>
+ <source>Examine the page that was printed. Several rows of boxes, each made up of thin lines, appear on the printed page.&lt;p&gt;
+For each row, select the label representing the box in which the shorter inner lines are the most aligned with the longer outer lines..</source>
+ <translation>РаÑÑмотрите отпечатанную Ñтраницу. Ðа Ñтранице раÑпечатываетÑÑ Ð½ÐµÑколько Ñ€Ñдов прÑмоугольников, ÑоÑтоÑщих из тонких линий.&lt;p&gt;
+Ð’ каждом Ñ€Ñду выберите метку, ÑоответÑтвующую прÑмоугольнику, в котором короткие внутренние линии оптимальным образом выровнены отноÑительно длинных внешних линий.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;B:&lt;/font&gt;&lt;/b&gt;</source>
+ <translation>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;B:&lt;/font&gt;&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;F:&lt;/font&gt;&lt;/b&gt;</source>
+ <translation>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;F:&lt;/font&gt;&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;C:&lt;/font&gt;&lt;/b&gt;</source>
+ <translation>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;C:&lt;/font&gt;&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;D:&lt;/font&gt;&lt;/b&gt;</source>
+ <translation>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;D:&lt;/font&gt;&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;G:&lt;/font&gt;&lt;/b&gt;</source>
+ <translation>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;G:&lt;/font&gt;&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;A:&lt;/font&gt;&lt;/b&gt;</source>
+ <translation>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;A:&lt;/font&gt;&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;E:&lt;/font&gt;&lt;/b&gt;</source>
+ <translation>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;E:&lt;/font&gt;&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;H:&lt;/font&gt;&lt;/b&gt;</source>
+ <translation>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;H:&lt;/font&gt;&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Next &gt;</source>
+ <translation>Далее &gt;</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Отмена</translation>
+ </message>
+</context>
+<context>
+ <name>AlignForm</name>
+ <message>
+ <source>HP Device Manager - Alignment</source>
+ <translation>ДиÑпетчер уÑтройÑтв HP — Выравнивание</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Отмена</translation>
+ </message>
+ <message>
+ <source>Next &gt;</source>
+ <translation>Далее &gt;</translation>
+ </message>
+ <message>
+ <source>Choose the set of lines where the line segments are &lt;b&gt;best&lt;/b&gt; aligned.</source>
+ <translation>Выберите набор линий, Ð´Ð»Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ñ… учаÑтки линий выровнены &lt;b&gt;оптимальным&lt;/b&gt;образом.</translation>
+ </message>
+</context>
+<context>
+ <name>AlignType6Form1_base</name>
+ <message>
+ <source>HP Device Manager - Alignment</source>
+ <translation>ДиÑпетчер уÑтройÑтв HP — Выравнивание</translation>
+ </message>
+ <message>
+ <source>To perform alignment, you will need the &lt;b&gt;alignment page&lt;/b&gt; that is automatically printed after you install a print cartridge.
+&lt;p&gt; If you do &lt;b&gt;not&lt;/b&gt; have this page, click &lt;i&gt;Print Page&lt;/i&gt;.
+&lt;p&gt;If you already have this page, click &lt;i&gt;Next &gt;&lt;/i&gt;.</source>
+ <translation>Ð”Ð»Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð²Ñ‹Ñ€Ð°Ð²Ð½Ð¸Ð²Ð°Ð½Ð¸Ñ Ð½ÐµÐ¾Ð±Ñ…Ð¾Ð´Ð¸Ð¼Ð¾ наличие &lt;b&gt;Ñтраницы выравниваниÑ&lt;/b&gt;, автоматичеÑки раÑпечатываемой поÑле уÑтановки печатающего картриджа.
+&lt;p&gt; Ð’ Ñлучае &lt;b&gt;отÑутÑтвиÑ&lt;/b&gt; Ñтой Ñтраницы выберите &lt;i&gt;Печать Ñтраницы&lt;/i&gt;.
+&lt;p&gt;ЕÑли Ñта Ñтраница имеетÑÑ, выберите &lt;i&gt;Далее &gt;&lt;/i&gt;.</translation>
+ </message>
+ <message>
+ <source>Next &gt;</source>
+ <translation>Далее &gt;</translation>
+ </message>
+ <message>
+ <source>Print Page</source>
+ <translation>Печать Ñтраницы</translation>
+ </message>
+</context>
+<context>
+ <name>AlignType6Form2_base</name>
+ <message>
+ <source>HP Device Manager - Alignment</source>
+ <translation>ДиÑпетчер уÑтройÑтв HP — Выравнивание</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Follow these steps to complete the alignment:&lt;/b&gt;
+&lt;p&gt;&lt;b&gt;1.&lt;/b&gt; Place the alignment page, with the printed side facing down, on the scanner.
+&lt;p&gt;&lt;b&gt;2.&lt;/b&gt; Press the &lt;i&gt;Enter&lt;/i&gt; or &lt;i&gt;Scan&lt;/i&gt; button on the printer.
+&lt;p&gt;&lt;b&gt;3.&lt;/b&gt; &quot;Alignment Complete&quot; will be displayed when the process is finished (on some models)..</source>
+ <translation>&lt;b&gt;Ð”Ð»Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð²Ñ‹Ñ€Ð°Ð²Ð½Ð¸Ð²Ð°Ð½Ð¸Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½Ð¸Ñ‚Ðµ Ñледующие дейÑтвиÑ.&lt;/b&gt;
+&lt;p&gt;&lt;b&gt;1.&lt;/b&gt; ПомеÑтите Ñтраницу Ð²Ñ‹Ñ€Ð°Ð²Ð½Ð¸Ð²Ð°Ð½Ð¸Ñ Ð½Ð° Ñканер отпечатанной Ñтороной вниз.
+&lt;p&gt;&lt;b&gt;2.&lt;/b&gt; Ðажмите на принтере кнопку &lt;i&gt;Ввод&lt;/i&gt; или &lt;i&gt;Сканирование&lt;/i&gt;.
+&lt;p&gt;&lt;b&gt;3.&lt;/b&gt; Ðа некоторых моделÑÑ… принтера по окончании обработки отображаетÑÑ Ñообщение &quot;Выравнивание завершено&quot;.</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+</context>
+<context>
+ <name>AllowableTypesDlg_base</name>
+ <message>
+ <source>MIME Type</source>
+ <translation>Тип MIME:</translation>
+ </message>
+ <message>
+ <source>Description</source>
+ <translation>ОпиÑание</translation>
+ </message>
+ <message>
+ <source>Usual File Extension(s)</source>
+ <translation>Обычные раÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð²</translation>
+ </message>
+ <message>
+ <source>HP Device Manager - Allowable Types</source>
+ <translation>ДиÑпетчер уÑтройÑтв HP — ДопуÑтимые типы</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;File/document types that can be added to the file list.&lt;/b&gt;</source>
+ <translation>&lt;b&gt;ПредуÑмотрено добавление типов файлов и документов к ÑпиÑку файлов.&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>&lt;i&gt;Note: To print or fax file/document types that do not appear on this list, print the document from the application that created it through the appropriate CUPS printer.&lt;/i&gt;</source>
+ <translation>&lt;i&gt;Примечание. Печать файлов факÑов и документов, типы которых отÑутÑтвуют в Ñтом ÑпиÑке, Ñледует выполнÑÑ‚ÑŒ на ÑоответÑтвующем принтере CUPS из приложениÑ, в котором они Ñозданы.&lt;/i&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>ChooseDeviceDlg</name>
+ <message>
+ <source>Choose Device</source>
+ <translation>Выбор уÑтройÑтва</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Отмена</translation>
+ </message>
+ <message>
+ <source>Available Devices:</source>
+ <translation>ДоÑтупные уÑтройÑтва:</translation>
+ </message>
+</context>
+<context>
+ <name>ChoosePrinterDlg</name>
+ <message>
+ <source>Choose Device</source>
+ <translation>Выбор уÑтройÑтва</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Отмена</translation>
+ </message>
+ <message>
+ <source>Available Devices:</source>
+ <translation>ДоÑтупные уÑтройÑтва:</translation>
+ </message>
+ <message>
+ <source>Available Printers:</source>
+ <translation>ДоÑтупные принтеры:</translation>
+ </message>
+ <message>
+ <source>Available Faxes:</source>
+ <translation>ДоÑтупные аппараты факÑимильной ÑвÑзи:</translation>
+ </message>
+</context>
+<context>
+ <name>ChoosePrinterDlg2</name>
+ <message>
+ <source>Choose Printer</source>
+ <translation>Выбор принтера</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Отмена</translation>
+ </message>
+ <message>
+ <source>Printers:</source>
+ <translation>Принтеры:</translation>
+ </message>
+</context>
+<context>
+ <name>CleaningForm2_base</name>
+ <message>
+ <source>HP Device Manager - Cleaning</source>
+ <translation>ДиÑпетчер уÑтройÑтв HP — ОчиÑтка</translation>
+ </message>
+ <message>
+ <source>Finish</source>
+ <translation>Готово</translation>
+ </message>
+ <message>
+ <source>Please wait while the test page is printed. Check this page to see if the problem was fixed. If the test page looks fine click &lt;b&gt;Finish &lt;/b&gt;to quit the cleaning procedure. Otherwise, replace the print cartridges and click &lt;b&gt;Finish&lt;/b&gt;.</source>
+ <translation>ДождитеÑÑŒ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ð¿ÐµÑ‡Ð°Ñ‚Ð¸ теÑтовой Ñтраницы. Проверьте Ñтраницу, чтобы выÑÑнить, уÑтранена ли неполадка печати. ЕÑли дефекты отÑутÑтвуют, Ð´Ð»Ñ Ð²Ñ‹Ñ…Ð¾Ð´Ð° из процедуры очиÑтки выберите &lt;b&gt;Готово &lt;/b&gt;. Ð’ противном Ñлучае замените печатающие картриджи и выберите &lt;b&gt;Готово&lt;/b&gt;.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Cleaning Level 3 Performed&lt;/b&gt;</source>
+ <translation>&lt;b&gt;ОчиÑтка ÑƒÑ€Ð¾Ð²Ð½Ñ 3 выполнена&lt;/b&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>CleaningForm_base</name>
+ <message>
+ <source>HP Device Manager - Please Wait - Cleaning</source>
+ <translation>ДиÑпетчер уÑтройÑтв HP — Подождите — ОчиÑтка</translation>
+ </message>
+ <message>
+ <source>Finish</source>
+ <translation>Готово</translation>
+ </message>
+ <message>
+ <source>Cleaning Level %s</source>
+ <translation>ОчиÑтка, уровень %s</translation>
+ </message>
+ <message>
+ <source>Please wait while the test page is printed. Check this page to see if the problem was fixed. If the test page looks fine click &lt;b&gt;Finish &lt;/b&gt;to quit the cleaning procedure. Otherwise, click &lt;b&gt;Cleaning Level %s&lt;/b&gt; to continue with cleaning.</source>
+ <translation>ДождитеÑÑŒ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ð¿ÐµÑ‡Ð°Ñ‚Ð¸ теÑтовой Ñтраницы. Проверьте Ñтраницу, чтобы выÑÑнить, уÑтранена ли неполадка печати. ЕÑли дефекты отÑутÑтвуют, Ð´Ð»Ñ Ð²Ñ‹Ñ…Ð¾Ð´Ð° из процедуры очиÑтки выберите &lt;b&gt;Готово &lt;/b&gt;. Ð’ противном Ñлучае выберите &lt;b&gt;ОчиÑтка, уровень %s&lt;/b&gt; Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÑ…Ð¾Ð´Ð° к процедуре очиÑтки.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Please Wait - Cleaning Level %s Being Performed&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Подождите – ВыполнÑетÑÑ Ð¾Ñ‡Ð¸Ñтка, уровень %s&lt;/b&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>ColorAdjForm_base</name>
+ <message>
+ <source>HP Device Manager - Color Adjustment</source>
+ <translation>ДиÑпетчер уÑтройÑтв HP — ÐаÑтройка цвета</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Отмена</translation>
+ </message>
+ <message>
+ <source>Next &gt;</source>
+ <translation>Далее &gt;</translation>
+ </message>
+ <message>
+ <source>Choose the numbered colored box that the color &lt;b&gt;best &lt;/b&gt;matches the background color of the bar.</source>
+ <translation>Выберите пронумерованный цветной прÑмоугольник, цвет которого &lt;b&gt;оптимальным образом &lt;/b&gt;ÑоответÑтвует цвету фона полоÑÑ‹.</translation>
+ </message>
+ <message>
+ <source>1</source>
+ <translation>1</translation>
+ </message>
+ <message>
+ <source>2</source>
+ <translation>2</translation>
+ </message>
+ <message>
+ <source>3</source>
+ <translation>3</translation>
+ </message>
+ <message>
+ <source>4</source>
+ <translation>4</translation>
+ </message>
+ <message>
+ <source>5</source>
+ <translation>5</translation>
+ </message>
+ <message>
+ <source>6</source>
+ <translation>6</translation>
+ </message>
+ <message>
+ <source>7</source>
+ <translation>7</translation>
+ </message>
+ <message>
+ <source>8</source>
+ <translation>8</translation>
+ </message>
+ <message>
+ <source>9</source>
+ <translation>9</translation>
+ </message>
+ <message>
+ <source>10</source>
+ <translation>10</translation>
+ </message>
+ <message>
+ <source>11</source>
+ <translation>11</translation>
+ </message>
+ <message>
+ <source>12</source>
+ <translation>12</translation>
+ </message>
+ <message>
+ <source>13</source>
+ <translation>13</translation>
+ </message>
+ <message>
+ <source>14</source>
+ <translation>14</translation>
+ </message>
+ <message>
+ <source>15</source>
+ <translation>15</translation>
+ </message>
+ <message>
+ <source>16</source>
+ <translation>16</translation>
+ </message>
+ <message>
+ <source>17</source>
+ <translation>17</translation>
+ </message>
+ <message>
+ <source>18</source>
+ <translation>18</translation>
+ </message>
+ <message>
+ <source>19</source>
+ <translation>19</translation>
+ </message>
+ <message>
+ <source>20</source>
+ <translation>20</translation>
+ </message>
+ <message>
+ <source>21</source>
+ <translation>21</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;&lt;font size=&quot;+1&quot;&gt;Line&lt;/font&gt;&lt;/b&gt;</source>
+ <translation>&lt;b&gt;&lt;font size=&quot;+1&quot;&gt;ЛиниÑ&lt;/font&gt;&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;&lt;font size=&quot;+1&quot;&gt;X&lt;/font&gt;&lt;/b&gt;</source>
+ <translation>&lt;b&gt;&lt;font size=&quot;+1&quot;&gt;X&lt;/font&gt;&lt;/b&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>ColorCal4Form_base</name>
+ <message>
+ <source>HP Device Manager - Color Calibration</source>
+ <translation>ДиÑпетчер уÑтройÑтв HP — Калибровка цвета</translation>
+ </message>
+ <message>
+ <source>Calibrate</source>
+ <translation>Калибровка</translation>
+ </message>
+ <message>
+ <source>1. Hold the calibration page at arm&apos;s length in front of your eyes.
+&lt;p&gt;&lt;p&gt;
+2. Tilt the page away from you. Look at the two large squares, each containing colored patches. For each large square, find the colored path that &lt;b&gt;most closely&lt;/b&gt; matches the background color. Each patch has an associated letter and number.
+&lt;p&gt;&lt;p&gt;
+3. Choose the letter and number for the matching patches for the gray and color plots.
+&lt;p&gt;&lt;p&gt;
+4. Click &lt;i&gt;&quot;Calibrate&quot;.&lt;/i&gt; to continue.
+&lt;p&gt;&lt;p&gt;
+(To reset the printer to known defaults, click &lt;i&gt;&quot;Use Factory Defaults&quot;&lt;/i&gt;)</source>
+ <translation>1. Держите Ñтраницу калибровки перед глазами на раÑÑтоÑнии вытÑнутой руки.
+&lt;p&gt;&lt;p&gt;
+2. Ðаклоните Ñтраницу по направлению от ÑебÑ. ПоÑмотрите на два больших квадрата Ñ Ð¾Ð±Ñ€Ð°Ð·Ñ†Ð°Ð¼Ð¸ цветов. Ð”Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ большого квадрата отыщите образец цвета, цвет которого &lt;b&gt;наиболее близок&lt;/b&gt; к цвету фона. Каждому образцу ÑопоÑтавлена буква и номер.
+&lt;p&gt;&lt;p&gt;
+3. Выберите букву и номер Ð´Ð»Ñ ÑоглаÑующихÑÑ Ð¾Ð±Ñ€Ð°Ð·Ñ†Ð¾Ð² цветов из Ñхемы оттенков Ñерого и цветной Ñхемы.
+&lt;p&gt;&lt;p&gt;
+4. Ð”Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð»Ð¶ÐµÐ½Ð¸Ñ Ð²Ñ‹Ð±ÐµÑ€Ð¸Ñ‚Ðµ &lt;i&gt;&quot;Калибровка&quot;.&lt;/i&gt;.
+&lt;p&gt;&lt;p&gt;
+(Ð”Ð»Ñ Ð²Ð¾ÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð¾Ð² принтера по умолчанию выберите &lt;i&gt;&quot;ИÑпользовать Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾ умолчанию, заданные изготовителем&quot;&lt;/i&gt;)</translation>
+ </message>
+ <message>
+ <source>Gray Plot</source>
+ <translation>Схема оттенков Ñерого</translation>
+ </message>
+ <message>
+ <source>A</source>
+ <translation>A</translation>
+ </message>
+ <message>
+ <source>B</source>
+ <translation>B</translation>
+ </message>
+ <message>
+ <source>C</source>
+ <translation>C</translation>
+ </message>
+ <message>
+ <source>D</source>
+ <translation>D</translation>
+ </message>
+ <message>
+ <source>E</source>
+ <translation>E</translation>
+ </message>
+ <message>
+ <source>F</source>
+ <translation>F</translation>
+ </message>
+ <message>
+ <source>G</source>
+ <translation>G</translation>
+ </message>
+ <message>
+ <source>H</source>
+ <translation>H</translation>
+ </message>
+ <message>
+ <source>I</source>
+ <translation>I</translation>
+ </message>
+ <message>
+ <source>J</source>
+ <translation>J</translation>
+ </message>
+ <message>
+ <source>K</source>
+ <translation>K</translation>
+ </message>
+ <message>
+ <source>L</source>
+ <translation>L</translation>
+ </message>
+ <message>
+ <source>M</source>
+ <translation>M</translation>
+ </message>
+ <message>
+ <source>N</source>
+ <translation>N</translation>
+ </message>
+ <message>
+ <source>1</source>
+ <translation>1</translation>
+ </message>
+ <message>
+ <source>2</source>
+ <translation>2</translation>
+ </message>
+ <message>
+ <source>3</source>
+ <translation>3</translation>
+ </message>
+ <message>
+ <source>4</source>
+ <translation>4</translation>
+ </message>
+ <message>
+ <source>5</source>
+ <translation>5</translation>
+ </message>
+ <message>
+ <source>6</source>
+ <translation>6</translation>
+ </message>
+ <message>
+ <source>7</source>
+ <translation>7</translation>
+ </message>
+ <message>
+ <source>8</source>
+ <translation>8</translation>
+ </message>
+ <message>
+ <source>9</source>
+ <translation>9</translation>
+ </message>
+ <message>
+ <source>10</source>
+ <translation>10</translation>
+ </message>
+ <message>
+ <source>11</source>
+ <translation>11</translation>
+ </message>
+ <message>
+ <source>12</source>
+ <translation>12</translation>
+ </message>
+ <message>
+ <source>13</source>
+ <translation>13</translation>
+ </message>
+ <message>
+ <source>14</source>
+ <translation>14</translation>
+ </message>
+ <message>
+ <source>Color Plot</source>
+ <translation>Ð¦Ð²ÐµÑ‚Ð½Ð°Ñ Ñхема</translation>
+ </message>
+ <message>
+ <source>P</source>
+ <translation>P</translation>
+ </message>
+ <message>
+ <source>Q</source>
+ <translation>Q</translation>
+ </message>
+ <message>
+ <source>R</source>
+ <translation>R</translation>
+ </message>
+ <message>
+ <source>S</source>
+ <translation>S</translation>
+ </message>
+ <message>
+ <source>T</source>
+ <translation>T</translation>
+ </message>
+ <message>
+ <source>U</source>
+ <translation>U</translation>
+ </message>
+ <message>
+ <source>V</source>
+ <translation>V</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Отмена</translation>
+ </message>
+ <message>
+ <source>Use Factory Defaults</source>
+ <translation>ИÑпользовать Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾ умолчанию, заданные изготовителем</translation>
+ </message>
+</context>
+<context>
+ <name>ColorCalForm2_base</name>
+ <message>
+ <source>HP Device Manager - Color Calibration</source>
+ <translation>ДиÑпетчер уÑтройÑтв HP — Калибровка цвета</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Отмена</translation>
+ </message>
+ <message>
+ <source>Next &gt;</source>
+ <translation>Далее &gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;A page of color patches is printing. When it is complete, follow these steps:&lt;/b&gt;
+&lt;p&gt;&lt;b&gt;1.&lt;/b&gt; Hold the page approximately 8 inches (~20cm) in front of your eyes.
+&lt;p&gt;&lt;b&gt;2.&lt;/b&gt; Slowly move the page away from you until the numbered patches fade to match the background.
+&lt;p&gt;&lt;b&gt;3.&lt;/b&gt; Select the number (below) between &lt;i&gt;1&lt;/i&gt; and &lt;i&gt;81 &lt;/i&gt;of the numbered patch that &lt;b&gt;best &lt;/b&gt;matches the background:</source>
+ <translation>&lt;b&gt;ВыполнÑетÑÑ Ð¿ÐµÑ‡Ð°Ñ‚ÑŒ Ñтраницы Ñ Ð¾Ð±Ñ€Ð°Ð·Ñ†Ð°Ð¼Ð¸ цветов. По окончании печати выполните Ñледующие дейÑтвиÑ:&lt;/b&gt;
+&lt;p&gt;&lt;b&gt;1.&lt;/b&gt; Держите Ñтраницу перед глазами на раÑÑтоÑнии приблизительно 8 дюймов (~20 Ñм).
+&lt;p&gt;&lt;b&gt;2.&lt;/b&gt; Медленно удалÑйте от ÑÐµÐ±Ñ Ñтраницу до тех пор, пока пронумерованные образцы не ÑольютÑÑ Ñ Ñ„Ð¾Ð½Ð¾Ð¼.
+&lt;p&gt;&lt;b&gt;3.&lt;/b&gt; Выберите ниже из интервала между &lt;i&gt;1&lt;/i&gt; и &lt;i&gt;81 &lt;/i&gt; номер того пронумерованного образца, который &lt;b&gt;оптимальным &lt;/b&gt;образом ÑоответÑтвует фону.</translation>
+ </message>
+ <message>
+ <source>Number of best matching patch (1-81):</source>
+ <translation>Ðомер оптимального образца (1-81):</translation>
+ </message>
+</context>
+<context>
+ <name>ColorCalForm_base</name>
+ <message>
+ <source>HP Device Manager - Color Calibration</source>
+ <translation>ДиÑпетчер уÑтройÑтв HP — Калибровка цвета</translation>
+ </message>
+ <message>
+ <source>Next &gt;</source>
+ <translation>Далее &gt;</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Отмена</translation>
+ </message>
+ <message>
+ <source>Color Calibration</source>
+ <translation>Калибровка цвета</translation>
+ </message>
+ <message>
+ <source>1</source>
+ <translation>1</translation>
+ </message>
+ <message>
+ <source>2</source>
+ <translation>2</translation>
+ </message>
+ <message>
+ <source>3</source>
+ <translation>3</translation>
+ </message>
+ <message>
+ <source>4</source>
+ <translation>4</translation>
+ </message>
+ <message>
+ <source>5</source>
+ <translation>5</translation>
+ </message>
+ <message>
+ <source>6</source>
+ <translation>6</translation>
+ </message>
+ <message>
+ <source>7</source>
+ <translation>7</translation>
+ </message>
+ <message>
+ <source>Choose the numbered image labeled &quot;1&quot; thru &quot;7&quot; that is &lt;b&gt;best color matched&lt;/b&gt; to the image labeled &quot;X&quot;.</source>
+ <translation>Выберите пронумерованное изображение Ñ Ð½Ð¾Ð¼ÐµÑ€Ð¾Ð¼ от &quot;1&quot; до &quot;7&quot;, &lt;b&gt;цвет которого оптимальным образом ÑоответÑтвует&lt;/b&gt; изображению, помеченному &quot;X&quot;.</translation>
+ </message>
+</context>
+<context>
+ <name>CoverpageForm_base</name>
+ <message>
+ <source>HP Device Manager - Coverpages</source>
+ <translation>ДиÑпетчер уÑтройÑтв HP — Титульные Ñтраницы</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Отмена</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>Coverpage Design</source>
+ <translation>Шаблон титульной Ñтраницы</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Choose coverpage and enter optional message.&lt;b&gt;</source>
+ <translation>&lt;b&gt;Выберите титульную Ñтраницу и введите дополнительное Ñообщение.&lt;b&gt;</translation>
+ </message>
+ <message>
+ <source>Regarding:</source>
+ <translation>Учтите Ñледующее:</translation>
+ </message>
+ <message>
+ <source>Optional Message &lt;i&gt;(Maximum 2048 characters or 32 lines preformatted)&lt;/i&gt;:</source>
+ <translation>Дополнительное Ñообщение &lt;i&gt;(Ðе более 2048 Ñимволов или 32 предварительно Ñтрок)&lt;/i&gt;:</translation>
+ </message>
+ <message>
+ <source>Preformatted (preserve formatting)</source>
+ <translation>Предварительно отформатировано (Ñохранение форматированиÑ)</translation>
+ </message>
+</context>
+<context>
+ <name>DevMgr4</name>
+ <message>
+ <source>Functions</source>
+ <translation>Функции</translation>
+ </message>
+ <message>
+ <source>Functions &gt; Print</source>
+ <translation>Функции &gt; Печать</translation>
+ </message>
+ <message>
+ <source>Functions &gt; Make Copies</source>
+ <translation>Функции &gt; Создание копий</translation>
+ </message>
+ <message>
+ <source>Functions &gt; Fax</source>
+ <translation>Функции &gt; ФакÑ</translation>
+ </message>
+ <message>
+ <source>Functions &gt; Unload Photo Card</source>
+ <translation>Функции &gt; Выгрузить карту памÑти Ð´Ð»Ñ Ñ„Ð¾Ñ‚Ð¾Ð³Ñ€Ð°Ñ„Ð¸Ð¹</translation>
+ </message>
+ <message>
+ <source>Tools</source>
+ <translation>СервиÑ</translation>
+ </message>
+ <message>
+ <source>Tools &gt; Device Information</source>
+ <translation>Ð¡ÐµÑ€Ð²Ð¸Ñ &gt; Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾Ð± уÑтройÑтве</translation>
+ </message>
+ <message>
+ <source>Tools &gt; Printer Information</source>
+ <translation>Ð¡ÐµÑ€Ð²Ð¸Ñ &gt; Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ принтере</translation>
+ </message>
+ <message>
+ <source>Tools &gt; Print Test Page</source>
+ <translation>Ð¡ÐµÑ€Ð²Ð¸Ñ &gt; Печать теÑтовой Ñтраницы</translation>
+ </message>
+ <message>
+ <source>Printer Name:</source>
+ <translation>Ð˜Ð¼Ñ Ð¿Ñ€Ð¸Ð½Ñ‚ÐµÑ€Ð°:</translation>
+ </message>
+ <message>
+ <source>Print &gt;&gt;</source>
+ <translation>Печать &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>Print...</source>
+ <translation>Печать...</translation>
+ </message>
+ <message>
+ <source>Scan &gt;&gt;</source>
+ <translation>Сканирование &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>Scan...</source>
+ <translation>Сканирование...</translation>
+ </message>
+ <message>
+ <source>Access Photo Cards &gt;&gt;</source>
+ <translation>ДоÑтуп к картам памÑти Ð´Ð»Ñ Ñ„Ð¾Ñ‚Ð¾Ð³Ñ€Ð°Ñ„Ð¸Ð¹ &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>Access Photo Cards...</source>
+ <translation>ДоÑтуп к картам памÑти Ð´Ð»Ñ Ñ„Ð¾Ñ‚Ð¾Ð³Ñ€Ð°Ñ„Ð¸Ð¹...</translation>
+ </message>
+ <message>
+ <source>Send Fax &gt;&gt;</source>
+ <translation>Передача факÑа &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>Send Fax...</source>
+ <translation>Передача факÑа...</translation>
+ </message>
+ <message>
+ <source>Make Copies &gt;&gt;</source>
+ <translation>Создание копий &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>Make Copies...</source>
+ <translation>Создание копий...</translation>
+ </message>
+ <message>
+ <source>Device Settings...</source>
+ <translation>Параметры уÑтройÑтва...</translation>
+ </message>
+ <message>
+ <source>Refresh Device</source>
+ <translation>Обновление уÑтройÑтва</translation>
+ </message>
+ <message>
+ <source>Refresh All</source>
+ <translation>Обновить вÑе</translation>
+ </message>
+ <message>
+ <source>HP Device Manager - %1</source>
+ <translation>ДиÑпетчер уÑтройÑтв HP — %1</translation>
+ </message>
+ <message>
+ <source>Refreshing Device List - HP Device Manager</source>
+ <translation>Обновление ÑпиÑка уÑтройÑтв – ДиÑпетчер уÑтройÑтв HP</translation>
+ </message>
+ <message>
+ <source>Refreshing device list...</source>
+ <translation>Обновление ÑпиÑка уÑтройÑтв...</translation>
+ </message>
+ <message>
+ <source>Press F6 to refresh.</source>
+ <translation>Ð”Ð»Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð½Ð°Ð¶Ð¼Ð¸Ñ‚Ðµ F6.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Photocards on your printer are only available by mounting them as drives using USB mass storage.&lt;/b&gt;&lt;p&gt;Please refer to your distribution&apos;s documentation for setup and usage instructions.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Ðа данном принтере карты памÑти Ð´Ð»Ñ Ñ„Ð¾Ñ‚Ð¾Ð³Ñ€Ð°Ñ„Ð¸Ð¹ доÑтупны только поÑле уÑтановки их в качеÑтве ноÑителей Ñ Ð¸Ñпользованием запоминающего уÑтройÑтва USB.&lt;/b&gt;&lt;p&gt;За инÑтрукциÑми по уÑтановке и иÑпользованию обратитеÑÑŒ к документации, входÑщей в комплект поÑтавки.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Unable to run command. No command specified.&lt;/b&gt;&lt;p&gt;Use &lt;pre&gt;Configure...&lt;/pre&gt; to specify a command to run.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Ðевозможно выполнить команду. Команда не указана.&lt;/b&gt;&lt;p&gt;Ð”Ð»Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½Ñемой команды воÑпользуйтеÑÑŒ пунктом меню &lt;pre&gt;ÐаÑтройка...&lt;/pre&gt;.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Unable to find an appropriate su/sudo utility to run hp-setup.&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Ðе найдена Ð½ÐµÐ¾Ð±Ñ…Ð¾Ð´Ð¸Ð¼Ð°Ñ Ð´Ð»Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ‹ hp-setup ÑÐ»ÑƒÐ¶ÐµÐ±Ð½Ð°Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ð° su/sudo.&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Annoying Confirmation: Are you sure you want to remove this device?&lt;/b&gt;</source>
+<translation>&lt;b&gt;Повторное подтверждение: Удалить данное уÑтройÑтво?&lt;/b&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>DevMgr4_base</name>
+ <message>
+ <source>HP Device Manager</source>
+ <translation>ДиÑпетчер уÑтройÑтв HP</translation>
+ </message>
+ <message>
+ <source>Functions</source>
+ <translation>Функции</translation>
+ </message>
+ <message>
+ <source>Status</source>
+ <translation>СоÑтоÑние</translation>
+ </message>
+ <message>
+ <source>Supplies</source>
+ <translation>РаÑходные материалы</translation>
+ </message>
+ <message>
+ <source>Tools</source>
+ <translation>СервиÑ</translation>
+ </message>
+ <message>
+ <source>Print Settings</source>
+ <translation>Параметры печати</translation>
+ </message>
+ <message>
+ <source>Print Control</source>
+ <translation>Управление печатью</translation>
+ </message>
+ <message>
+ <source>Contents</source>
+ <translation>Содержание</translation>
+ </message>
+ <message>
+ <source>&amp;Contents...</source>
+ <translation>&amp;Содержание...</translation>
+ </message>
+ <message>
+ <source>Help Contents (F1)</source>
+ <translation>Содержание Ñправки (F1)</translation>
+ </message>
+ <message>
+ <source>F1</source>
+ <translation>F1</translation>
+ </message>
+ <message>
+ <source>Index</source>
+ <translation>Указатель</translation>
+ </message>
+ <message>
+ <source>&amp;Index...</source>
+ <translation>&amp;Указатель...</translation>
+ </message>
+ <message>
+ <source>&amp;About...</source>
+ <translation>&amp;О...</translation>
+ </message>
+ <message>
+ <source>About HP Device Manager...</source>
+ <translation>О диÑпетчере уÑтройÑтв HP...</translation>
+ </message>
+ <message>
+ <source>Refresh Device</source>
+ <translation>Обновление уÑтройÑтва</translation>
+ </message>
+ <message>
+ <source>Refresh Device (F5)</source>
+ <translation>Обновление уÑтройÑтва (F5)</translation>
+ </message>
+ <message>
+ <source>F5</source>
+ <translation>F5</translation>
+ </message>
+ <message>
+ <source>Exit</source>
+ <translation>Выход</translation>
+ </message>
+ <message>
+ <source>Exit HP Device Manager</source>
+ <translation>Выход из диÑпетчера уÑтройÑтв HP</translation>
+ </message>
+ <message>
+ <source>Ctrl+Q</source>
+ <translation>Ctrl+Q</translation>
+ </message>
+ <message>
+ <source>Popup Alerts...</source>
+ <translation>Ð’Ñплывающие предупреждениÑ...</translation>
+ </message>
+ <message>
+ <source>Popup alerts...</source>
+ <translation>Ð’Ñплывающие предупреждениÑ...</translation>
+ </message>
+ <message>
+ <source>Configure popup alerts</source>
+ <translation>ÐаÑтройка вÑплывающих предупреждений...</translation>
+ </message>
+ <message>
+ <source>Email alerts...</source>
+ <translation>ÐŸÑ€ÐµÐ´ÑƒÐ¿Ñ€ÐµÐ¶Ð´ÐµÐ½Ð¸Ñ Ð¿Ð¾ Ñлектронной почте...</translation>
+ </message>
+ <message>
+ <source>Configure email alerts</source>
+ <translation>ÐаÑтройка предупреждений по Ñлектронной почте...</translation>
+ </message>
+ <message>
+ <source>Settings...</source>
+ <translation>Параметры...</translation>
+ </message>
+ <message>
+ <source>F2</source>
+ <translation>F2</translation>
+ </message>
+ <message>
+ <source>Refresh All</source>
+ <translation>Обновить вÑе</translation>
+ </message>
+ <message>
+ <source>F6</source>
+ <translation>F6</translation>
+ </message>
+ <message>
+ <source>Auto Refresh</source>
+ <translation>ÐвтоматичеÑкое обновление</translation>
+ </message>
+ <message>
+ <source>Turn on/off Auto Refresh (Ctrl+A)</source>
+ <translation>Включение и выключение автоматичеÑкого Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ (Ctrl+A)</translation>
+ </message>
+ <message>
+ <source>Ctrl+A</source>
+ <translation>Ctrl+Q</translation>
+ </message>
+ <message>
+ <source>Action</source>
+ <translation>ДейÑтвие</translation>
+ </message>
+ <message>
+ <source>Device Settings (F3)</source>
+ <translation>Параметры уÑтройÑтва (F3)</translation>
+ </message>
+ <message>
+ <source>F3</source>
+ <translation>F3</translation>
+ </message>
+ <message>
+ <source>Support...</source>
+ <translation>Поддержка...</translation>
+ </message>
+ <message>
+ <source>Setup New Device...</source>
+ <translation>УÑтановка нового уÑтройÑтва...</translation>
+ </message>
+ <message>
+ <source>Ins</source>
+ <translation>Ins</translation>
+ </message>
+ <message>
+ <source>Remove Device...</source>
+ <translation>Удаление уÑтройÑтва...</translation>
+ </message>
+ <message>
+ <source>Del</source>
+ <translation>Del</translation>
+ </message>
+ <message>
+ <source>Device</source>
+ <translation>УÑтройÑтво</translation>
+ </message>
+ <message>
+ <source>Configure</source>
+ <translation>ÐаÑтройка</translation>
+ </message>
+ <message>
+ <source>&amp;Help</source>
+ <translation>&amp;Справка</translation>
+ </message>
+</context>
+<context>
+ <name>FaxAddrBookEditForm</name>
+ <message>
+ <source>New Fax Group</source>
+ <translation type="obsolete">ÐÐ¾Ð²Ð°Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ð° факÑов</translation>
+ </message>
+ <message>
+ <source>New Group Name:</source>
+ <translation type="obsolete">Ð˜Ð¼Ñ Ð½Ð¾Ð²Ð¾Ð¹ группы:</translation>
+ </message>
+</context>
+<context>
+ <name>FaxAddrBookEditForm_base</name>
+ <message>
+ <source>Group Name</source>
+ <translation>Ð˜Ð¼Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ñ‹</translation>
+ </message>
+ <message>
+ <source>HP Device Manager - Fax Address Book Entry</source>
+ <translation>ДиÑпетчер уÑтройÑтв HP — ЗапиÑÑŒ адреÑной книги факÑа</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Отмена</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>First Name:</source>
+ <translation>ИмÑ:</translation>
+ </message>
+ <message>
+ <source>New Group...</source>
+ <translation type="obsolete">ÐÐ¾Ð²Ð°Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ð°...</translation>
+ </message>
+ <message>
+ <source>Member of Group(s):</source>
+ <translation>Входит в группы:</translation>
+ </message>
+ <message>
+ <source>Last Name:</source>
+ <translation>ФамилиÑ:</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Fax Number:&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Ðомер аппарата факÑимильной ÑвÑзи:&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Notes/Other Information:</source>
+ <translation>ÐŸÑ€Ð¸Ð¼ÐµÑ‡Ð°Ð½Ð¸Ñ Ð¸ прочие ÑведениÑ:</translation>
+ </message>
+ <message>
+ <source>Title:</source>
+ <translation>Ðазвание:</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Nickname:&lt;/b&gt;</source>
+ <translation type="obsolete">&lt;b&gt;ПÑевдоним:&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Note: Items in &lt;b&gt;bold&lt;/b&gt; are required fields.</source>
+ <translation>Примечание. ÐŸÐ¾Ð»Ñ Ñ Ð²Ñ‹Ð´ÐµÐ»ÐµÐ½Ð½Ñ‹Ð¼Ð¸ &lt;b&gt;полужирным шрифтом&lt;/b&gt; названиÑми ÑвлÑÑŽÑ‚ÑÑ Ð¾Ð±Ñзательными.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Name/Nickname:&lt;/b&gt;</source>
+ <translation>&lt;b&gt;ИмÑ/ПÑевдоним:&lt;/b&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>FaxAddrBookForm</name>
+ <message>
+ <source>New...</source>
+ <translation>Создать...</translation>
+ </message>
+ <message>
+ <source>Edit...</source>
+ <translation>Изменить...</translation>
+ </message>
+ <message>
+ <source>Delete...</source>
+ <translation>Удалить...</translation>
+ </message>
+ <message>
+ <source>Refresh List</source>
+ <translation>Обновить ÑпиÑок</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Annoying Confirmation: Are you sure you want to delete this address book entry?&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Повторное подтверждение: Удалить данную запиÑÑŒ в адреÑной книге?&lt;/b&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>FaxAddrBookForm_base</name>
+ <message>
+ <source>Nickname</source>
+ <translation>ПÑевдоним</translation>
+ </message>
+ <message>
+ <source>Title</source>
+ <translation>Ðазвание</translation>
+ </message>
+ <message>
+ <source>First Name</source>
+ <translation>ИмÑ</translation>
+ </message>
+ <message>
+ <source>Last Name</source>
+ <translation>ФамилиÑ</translation>
+ </message>
+ <message>
+ <source>Fax Number</source>
+ <translation>Ðомер аппарата факÑимильной ÑвÑзи</translation>
+ </message>
+ <message>
+ <source>Member of Group(s)</source>
+ <translation>Входит в группы</translation>
+ </message>
+ <message>
+ <source>Notes/Other Information</source>
+ <translation>ÐŸÑ€Ð¸Ð¼ÐµÑ‡Ð°Ð½Ð¸Ñ Ð¸ прочие ÑведениÑ</translation>
+ </message>
+ <message>
+ <source>HP Device Manager - Fax Address Book</source>
+ <translation>ДиÑпетчер уÑтройÑтв HP — ÐдреÑÐ½Ð°Ñ ÐºÐ½Ð¸Ð³Ð° факÑа</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>New...</source>
+ <translation>Создать...</translation>
+ </message>
+ <message>
+ <source>Edit...</source>
+ <translation>Изменить...</translation>
+ </message>
+ <message>
+ <source>Delete...</source>
+ <translation>Удалить...</translation>
+ </message>
+ <message>
+ <source>Groups...</source>
+ <translation>Группы...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Fax Addresses:&lt;/b&gt;</source>
+ <translation>&lt;b&gt;ÐдреÑа аппаратов факÑимильной ÑвÑзи:&lt;/b&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>FaxAddrBookGroupEditForm_base</name>
+ <message>
+ <source>Group Members</source>
+ <translation>Члены группы</translation>
+ </message>
+ <message>
+ <source>HP Device Manager - Fax Address Book Group</source>
+ <translation>ДиÑпетчер уÑтройÑтв HP — Группа адреÑной книги факÑа</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Group Name:&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Ð˜Ð¼Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ñ‹:&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Member Address Book Entries:&lt;/b&gt;</source>
+ <translation>&lt;b&gt;ЗапиÑи адреÑной книги членов:&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Отмена</translation>
+ </message>
+</context>
+<context>
+ <name>FaxAddrBookGroupsForm</name>
+ <message>
+ <source>New...</source>
+ <translation>Создать...</translation>
+ </message>
+ <message>
+ <source>Edit...</source>
+ <translation>Изменить...</translation>
+ </message>
+ <message>
+ <source>Delete...</source>
+ <translation>Удалить...</translation>
+ </message>
+ <message>
+ <source>Refresh List</source>
+ <translation>Обновить ÑпиÑок</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Annoying Confirmation: Are you sure you want to delete this group?&lt;/b&gt;</source>
+<translation>&lt;b&gt;Повторное подтверждение: Удалить данную группу?&lt;/b&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>FaxAddrBookGroupsForm_base</name>
+ <message>
+ <source>Group Name</source>
+ <translation>Ð˜Ð¼Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ñ‹</translation>
+ </message>
+ <message>
+ <source>Group Members</source>
+ <translation>Члены группы</translation>
+ </message>
+ <message>
+ <source>HP Device Manager - Fax Address Book Groups</source>
+ <translation>ДиÑпетчер уÑтройÑтв HP — Группы адреÑной книги факÑа</translation>
+ </message>
+ <message>
+ <source>New...</source>
+ <translation>Создать...</translation>
+ </message>
+ <message>
+ <source>Delete...</source>
+ <translation>Удалить...</translation>
+ </message>
+ <message>
+ <source>Edit...</source>
+ <translation>Изменить...</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Groups:&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Группы:&lt;/b&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>FaxSendJobForm</name>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;You may not specify both a printer (-p) and a device (-d).</source>
+ <translation>&lt;p&gt;&lt;b&gt;Ðе предуÑмотрено одновременное задание параметра Ð´Ð»Ñ Ð¿Ñ€Ð¸Ð½Ñ‚ÐµÑ€Ð° (-p) и Ð´Ð»Ñ ÑƒÑтройÑтва (-d).</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Unknown printer name: %1&lt;/b&gt;&lt;p&gt;Please check the printer name and try again.</source>
+ <translation>&lt;b&gt;ÐеизвеÑтное Ð¸Ð¼Ñ Ð¿Ñ€Ð¸Ð½Ñ‚ÐµÑ€Ð°: %1&lt;/b&gt;&lt;p&gt;Проверьте Ð¸Ð¼Ñ Ð¿Ñ€Ð¸Ð½Ñ‚ÐµÑ€Ð° и повторите попытку.</translation>
+ </message>
+ <message>
+ <source>You must specify a printer that has a device URI in the form &apos;hpfax:/...&apos;</source>
+ <translation>ТребуетÑÑ ÑƒÐºÐ°Ð·Ð°Ñ‚ÑŒ принтер Ñ Ð°Ð´Ñ€ÐµÑом уÑтройÑтва URI в Ñледующем формате: &apos;hpfax:/...&apos;</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;No devices found.&lt;/b&gt;&lt;p&gt;Please make sure your device is properly installed and try again.</source>
+ <translation>&lt;p&gt;&lt;b&gt;УÑтройÑтва не обнаружены.&lt;/b&gt;&lt;p&gt;Проверьте правильноÑÑ‚ÑŒ уÑтановки уÑтройÑтва и повторите попытку.</translation>
+ </message>
+ <message>
+ <source>HP Device Manager - Send Fax</source>
+ <translation>ДиÑпетчер уÑтройÑтв HP — Передача факÑа</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Fax send completed successfully.&lt;/b&gt;</source>
+ <translation>&lt;p&gt;&lt;b&gt;Передача факÑа выполнена уÑпешно.&lt;/b&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>FaxSettingsForm_base</name>
+ <message>
+ <source>HP Device Manager - Fax Settings</source>
+ <translation>ДиÑпетчер уÑтройÑтв HP — Параметры факÑа</translation>
+ </message>
+ <message>
+ <source>Fax Header Information</source>
+ <translation>Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ° факÑа</translation>
+ </message>
+ <message>
+ <source>Device Fax Number:</source>
+ <translation>Ðомер аппарата факÑимильной ÑвÑзи:</translation>
+ </message>
+ <message>
+ <source>Name and/or Company:</source>
+ <translation>Ð˜Ð¼Ñ Ð¸/или название компании:</translation>
+ </message>
+ <message>
+ <source>&lt;i&gt;This information will appear at the top of each fax that you send.&lt;/i&gt;</source>
+ <translation>&lt;i&gt;Эта Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶Ð°ÐµÑ‚ÑÑ Ð² верхней чаÑти отправлÑемого факÑа.&lt;/i&gt;</translation>
+ </message>
+ <message>
+ <source>Coverpage Information</source>
+ <translation>Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ñ‚Ð¸Ñ‚ÑƒÐ»ÑŒÐ½Ð¾Ð¹ Ñтраницы</translation>
+ </message>
+ <message>
+ <source>Voice phone number:</source>
+ <translation>Ðомер обычного телефона:</translation>
+ </message>
+ <message>
+ <source>Email address:</source>
+ <translation>ÐÐ´Ñ€ÐµÑ Ñлектронной почты:</translation>
+ </message>
+ <message>
+ <source>&lt;i&gt;This information will appear on any coverpage that you send.&lt;/i&gt;</source>
+ <translation>&lt;i&gt;Эта Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶Ð°ÐµÑ‚ÑÑ Ð½Ð° вÑех отправлÑемых титульных Ñтраницах.&lt;/i&gt;</translation>
+ </message>
+ <message>
+ <source>Information</source>
+ <translation>ИнформациÑ</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Configure device settings for sending faxes.&lt;/b&gt;</source>
+ <translation>&lt;b&gt;ÐаÑтройка параметров уÑтройÑтва Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð¸ факÑов.&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Отмена</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+</context>
+<context>
+ <name>ImagePropertiesDlg_base</name>
+ <message>
+ <source>EXIF Labels</source>
+ <translation>Метки EXIF</translation>
+ </message>
+ <message>
+ <source>Contents </source>
+ <translation>Содержание</translation>
+ </message>
+ <message>
+ <source>Properties for</source>
+ <translation>СвойÑтва длÑ</translation>
+ </message>
+ <message>
+ <source>MIME Type:</source>
+ <translation>Тип MIME:</translation>
+ </message>
+ <message>
+ <source>Size:</source>
+ <translation>Размер:</translation>
+ </message>
+ <message>
+ <source>Location:</source>
+ <translation>МеÑтонахождение:</translation>
+ </message>
+ <message>
+ <source>LOCATION</source>
+ <translation>МЕСТОÐÐХОЖДЕÐИЕ</translation>
+ </message>
+ <message>
+ <source>MIME TYPE</source>
+ <translation>ТИП MIME</translation>
+ </message>
+ <message>
+ <source>SIZE</source>
+ <translation>РÐЗМЕР</translation>
+ </message>
+ <message>
+ <source>FILENAME</source>
+ <translation>ИМЯ_ФÐЙЛÐ</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+</context>
+<context>
+ <name>LoadPaperForm_base</name>
+ <message>
+ <source>HP Device Manager - Load Plain Paper</source>
+ <translation>ДиÑпетчер уÑтройÑтв HP — Загрузка обычной бумаги</translation>
+ </message>
+ <message>
+ <source>Continue</source>
+ <translation>Продолжить</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Отмена</translation>
+ </message>
+ <message>
+ <source>A page will be printed. Please load &lt;b&gt;plain paper&lt;/b&gt; in the printer and then press continue.</source>
+ <translation>При Ñтом раÑпечатываетÑÑ Ñтраница. Загрузите в принтер &lt;b&gt;обычную бумагу&lt;/b&gt; и нажмите кнопку продолжениÑ.</translation>
+ </message>
+</context>
+<context>
+ <name>MakeCopiesForm</name>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;You may not specify both a printer (-p) and a device (-d).</source>
+ <translation>&lt;p&gt;&lt;b&gt;Ðе предуÑмотрено одновременное задание параметра Ð´Ð»Ñ Ð¿Ñ€Ð¸Ð½Ñ‚ÐµÑ€Ð° (-p) и Ð´Ð»Ñ ÑƒÑтройÑтва (-d).</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;No devices found.&lt;/b&gt;&lt;p&gt;Please make sure your device is properly installed and try again.</source>
+ <translation>&lt;p&gt;&lt;b&gt;УÑтройÑтва не обнаружены.&lt;/b&gt;&lt;p&gt;Проверьте правильноÑÑ‚ÑŒ уÑтановки уÑтройÑтва и повторите попытку.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Sorry, make copies functionality is not implemented for this device.&lt;/b&gt;</source>
+ <translation>&lt;b&gt;К Ñожалению, функции ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÐºÐ¾Ð¿Ð¸Ð¸ не поддерживаютÑÑ Ð´Ð°Ð½Ð½Ñ‹Ð¼ уÑтройÑтвом.&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>HP Device Manager - Make Copies</source>
+ <translation>ДиÑпетчер уÑтройÑтв HP — Создание копий</translation>
+ </message>
+</context>
+<context>
+ <name>MakeCopiesForm_base</name>
+ <message>
+ <source>HP Device Manager - Make Copies</source>
+ <translation>ДиÑпетчер уÑтройÑтв HP — Создание копий</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Закрыть</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Make copies.&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Создание копий.&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Make Copies</source>
+ <translation>Создание копий</translation>
+ </message>
+ <message>
+ <source>Quality:</source>
+ <translation>КачеÑтво:</translation>
+ </message>
+ <message>
+ <source>Fast</source>
+ <translation>БыÑтро</translation>
+ </message>
+ <message>
+ <source>Draft</source>
+ <translation>Черновое</translation>
+ </message>
+ <message>
+ <source>Normal</source>
+ <translation>Обычное</translation>
+ </message>
+ <message>
+ <source>Presentation</source>
+ <translation>ПрезентациÑ</translation>
+ </message>
+ <message>
+ <source>Best</source>
+ <translation>Ð’Ñ‹Ñокое</translation>
+ </message>
+ <message>
+ <source>Number of Copies:</source>
+ <translation>КоличеÑтво копий:</translation>
+ </message>
+ <message>
+ <source>Contrast:</source>
+ <translation>КонтраÑтноÑÑ‚ÑŒ:</translation>
+ </message>
+ <message>
+ <source>+0</source>
+ <translation>+0</translation>
+ </message>
+ <message>
+ <source>Enlargement/Reduction:</source>
+ <translation>Увеличение/уменьшение:</translation>
+ </message>
+ <message>
+ <source>400%</source>
+ <translation>400%</translation>
+ </message>
+ <message>
+ <source>Fit to page</source>
+ <translation>ПомеÑтить на Ñтранице</translation>
+ </message>
+ <message>
+ <source>Copy</source>
+ <translation>Копирование</translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation>ИмÑ:</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Device information/status and output queue name.&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾Ð± уÑтройÑтве и ÑоÑтоÑнии и Ð¸Ð¼Ñ Ð²Ñ‹Ñ…Ð¾Ð´Ð½Ð¾Ð¹ очереди.&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Status:</source>
+ <translation>СоÑтоÑние:</translation>
+ </message>
+ <message>
+ <source>Refresh status</source>
+ <translation>Обновление ÑоÑтоÑниÑ</translation>
+ </message>
+ <message>
+ <source>Comment:</source>
+ <translation>Комментарий:</translation>
+ </message>
+ <message>
+ <source>Location:</source>
+ <translation>МеÑтонахождение:</translation>
+ </message>
+ <message>
+ <source>Device URI:</source>
+ <translation>URI уÑтройÑтва:</translation>
+ </message>
+ <message>
+ <source>Device</source>
+ <translation>УÑтройÑтво</translation>
+ </message>
+</context>
+<context>
+ <name>NoDevicesForm</name>
+ <message>
+ <source>&lt;b&gt;Unable to find an appropriate su/sudo utility to run hp-setup.&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Ðе найдена Ð½ÐµÐ¾Ð±Ñ…Ð¾Ð´Ð¸Ð¼Ð°Ñ Ð´Ð»Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ‹ hp-setup ÑÐ»ÑƒÐ¶ÐµÐ±Ð½Ð°Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ð° su/sudo.&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;An I/O error occurred.&lt;/b&gt;&lt;p&gt;Please re-start the Device Manager and try again.</source>
+<translation>&lt;b&gt;Ошибка ввода/вывода.&lt;/b&gt;&lt;p&gt;ПерезапуÑтите диÑпетчер уÑтройÑтва и повторите попытку.</translation>
+ </message>
+</context>
+<context>
+ <name>NoDevicesForm_base</name>
+ <message>
+ <source>HP Device Manager - No Installed HP Devices Found</source>
+ <translation>ДиÑпетчер уÑтройÑтв HP — УÑтановленные уÑтройÑтва HP не найдены</translation>
+ </message>
+ <message>
+ <source>Setup Device...</source>
+ <translation>УÑтановка уÑтройÑтва...</translation>
+ </message>
+ <message>
+ <source>CUPS Web Interface</source>
+ <translation>Веб-Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ CUPS</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Закрыть</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;&lt;font size=&quot;+2&quot;&gt;No Installed HP Devices Found.&lt;/font&gt;&lt;/b&gt;&lt;p&gt;To install a device, use one of the following methods:&lt;p&gt;
+1.Run &lt;b&gt;hp-setup&lt;/b&gt; (in a shell/terminal or click &lt;tt&gt;Setup Device...&lt;/tt&gt; below).&lt;p&gt;
+2. &lt;b&gt;CUPS web interface&lt;/b&gt; (open a browser to: &lt;u&gt;http://localhost:631&lt;/u&gt; or press the button below),&lt;p&gt;
+3. The &lt;b&gt;printer installation utility&lt;/b&gt; that came with your operating system (YaST, PrinterDrake, etc).
+&lt;p&gt;&lt;p&gt;After setting up a printer, you may have to press &lt;tt&gt;F6&lt;/tt&gt; or chose &lt;tt&gt;Device | Refresh All&lt;/tt&gt; for the printer to appear in the HP Device Manager.&lt;p&gt;
+&lt;i&gt;&lt;b&gt;Note: Only devices installed with the &lt;tt&gt;hp:&lt;/tt&gt; CUPS backend will appear in the HP Device Manager.&lt;/b&gt;&lt;/i&gt;&lt;p&gt;</source>
+ <translation>&lt;b&gt;&lt;font size=&quot;+2&quot;&gt;УÑтановленные уÑтройÑтва HP не найдены.&lt;/font&gt;&lt;/b&gt;&lt;p&gt;Ð”Ð»Ñ ÑƒÑтановки уÑтройÑтва иÑпользуйте один из Ñледующих ÑпоÑобов:&lt;p&gt;
+1.Выполните команду &lt;b&gt;hp-setup&lt;/b&gt; (в оболочке или Ñ Ñ‚ÐµÑ€Ð¼Ð¸Ð½Ð°Ð»Ð°, или выбрав ниже &lt;tt&gt;УÑтановка уÑтройÑтва...&lt;/tt&gt;).&lt;p&gt;
+2. &lt;b&gt;Веб-Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ CUPS&lt;/b&gt; (откройте браузер длÑ: &lt;u&gt;http://localhost:631&lt;/u&gt; или нажмите ниже кнопку),&lt;p&gt;
+3. &lt;b&gt;Ð¡Ð»ÑƒÐ¶ÐµÐ±Ð½Ð°Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ð° уÑтановки принтера&lt;/b&gt;, входÑÑ‰Ð°Ñ Ð² комплект поÑтавки операционной ÑиÑтемы (YaST, PrinterDrake и Ñ‚.п.).
+&lt;p&gt;&lt;p&gt;ПоÑле уÑтановки принтера может потребоватьÑÑ Ð½Ð°Ð¶Ð°Ñ‚ÑŒ клавишу &lt;tt&gt;F6&lt;/tt&gt; или выбрать &lt;tt&gt;УÑтройÑтво | Обновить вÑе&lt;/tt&gt;, чтобы принтер отобразилÑÑ Ð² окне диÑпетчера уÑтройÑтв HP.&lt;p&gt;
+&lt;i&gt;&lt;b&gt;Примечание. Ð’ окне диÑпетчера уÑтройÑтв HP отображаютÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ уÑтройÑтва, уÑтановленные Ñ Ð¸Ñпользованием базы данных &lt;tt&gt;hp:&lt;/tt&gt; CUPS.&lt;/b&gt;&lt;/i&gt;&lt;p&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>PaperEdgeAlignForm_base</name>
+ <message>
+ <source>HP Device Manager - Paper Edge Alignment</source>
+ <translation>ДиÑпетчер уÑтройÑтв HP — Выравнивание краев бумаги</translation>
+ </message>
+ <message>
+ <source>Next &gt;</source>
+ <translation>Далее &gt;</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Отмена</translation>
+ </message>
+ <message>
+ <source>Paper Edge</source>
+ <translation>Край бумаги</translation>
+ </message>
+ <message>
+ <source>1</source>
+ <translation>1</translation>
+ </message>
+ <message>
+ <source>2</source>
+ <translation>2</translation>
+ </message>
+ <message>
+ <source>3</source>
+ <translation>3</translation>
+ </message>
+ <message>
+ <source>4</source>
+ <translation>4</translation>
+ </message>
+ <message>
+ <source>5</source>
+ <translation>5</translation>
+ </message>
+ <message>
+ <source>6</source>
+ <translation>6</translation>
+ </message>
+ <message>
+ <source>7</source>
+ <translation>7</translation>
+ </message>
+ <message>
+ <source>8</source>
+ <translation>8</translation>
+ </message>
+ <message>
+ <source>9</source>
+ <translation>9</translation>
+ </message>
+ <message>
+ <source>10</source>
+ <translation>10</translation>
+ </message>
+ <message>
+ <source>11</source>
+ <translation>11</translation>
+ </message>
+ <message>
+ <source>12</source>
+ <translation>12</translation>
+ </message>
+ <message>
+ <source>13</source>
+ <translation>13</translation>
+ </message>
+ <message>
+ <source>Choose the &lt;b&gt;numbered arrow&lt;/b&gt; that &lt;b&gt;best &lt;/b&gt;marks the edge of the paper.</source>
+ <translation>Выберите &lt;b&gt;Ñтрелку Ñ Ð½Ð¾Ð¼ÐµÑ€Ð¾Ð¼&lt;/b&gt;, &lt;b&gt;наиболее точно &lt;/b&gt;отмечающую край бумаги.</translation>
+ </message>
+</context>
+<context>
+ <name>PasswordDialog</name>
+ <message>
+ <source>HP Device Manager - Enter Password</source>
+ <translation>ДиÑпетчер уÑтройÑтв HP — Ввод паролÑ</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+</context>
+<context>
+ <name>PowerSettingsDialog</name>
+ <message>
+ <source>15 minutes</source>
+ <translation>15 минут</translation>
+ </message>
+ <message>
+ <source>30 minutes</source>
+ <translation>30 минут</translation>
+ </message>
+ <message>
+ <source>45 minutes</source>
+ <translation>45 минут</translation>
+ </message>
+ <message>
+ <source>1 hour</source>
+ <translation>1 чаÑ</translation>
+ </message>
+ <message>
+ <source>2 hours</source>
+ <translation>2 чаÑа</translation>
+ </message>
+ <message>
+ <source>3 hours</source>
+ <translation>3 чаÑа</translation>
+ </message>
+</context>
+<context>
+ <name>PowerSettingsDialog_base</name>
+ <message>
+ <source>HP Device Manager - Battery Mode Power Settings</source>
+ <translation>ДиÑпетчер уÑтройÑтв HP — Параметры подачи Ð¿Ð¸Ñ‚Ð°Ð½Ð¸Ñ Ð² режиме работы от аккумулÑтора</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Configure the power off settings when operating on battery power&lt;/b&gt;</source>
+ <translation>&lt;b&gt;ÐаÑтройка параметров Ð´Ð»Ñ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¿Ð¸Ñ‚Ð°Ð½Ð¸Ñ Ð¿Ñ€Ð¸ работе от аккумулÑтора&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Отмена</translation>
+ </message>
+ <message>
+ <source>Power Settings</source>
+ <translation>Параметры подачи питаниÑ</translation>
+ </message>
+ <message>
+ <source>Automatically turn off printer after:</source>
+ <translation>ÐвтоматичеÑкое отключение принтера по иÑтечении:</translation>
+ </message>
+ <message>
+ <source>Always leave printer on</source>
+ <translation>Ð’Ñегда оÑтавлÑÑ‚ÑŒ принтер включенным</translation>
+ </message>
+</context>
+<context>
+ <name>PrinterForm</name>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;You may not specify both a printer (-p) and a device (-d).</source>
+ <translation>&lt;p&gt;&lt;b&gt;Ðе предуÑмотрено одновременное задание параметра Ð´Ð»Ñ Ð¿Ñ€Ð¸Ð½Ñ‚ÐµÑ€Ð° (-p) и Ð´Ð»Ñ ÑƒÑтройÑтва (-d).</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;No devices found.&lt;/b&gt;&lt;p&gt;Please make sure your device is properly installed and try again.</source>
+ <translation>&lt;p&gt;&lt;b&gt;УÑтройÑтва не обнаружены.&lt;/b&gt;&lt;p&gt;Проверьте правильноÑÑ‚ÑŒ уÑтановки уÑтройÑтва и повторите попытку.</translation>
+ </message>
+ <message>
+ <source>HP Device Manager - Print</source>
+ <translation>ДиÑпетчер уÑтройÑтв HP — Печать</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollCopyView</name>
+ <message>
+ <source>Number of Copies</source>
+<translation>КоличеÑтво копий</translation>
+ </message>
+ <message>
+ <source>Enlargement, Reduction and Fit to Page</source>
+<translation>Увеличение, уменьшение или в размер Ñтраницы</translation>
+ </message>
+ <message>
+ <source>Copy Contrast</source>
+<translation>КонтраÑÑ‚ копии</translation>
+ </message>
+ <message>
+ <source>Copy Quality</source>
+<translation>КачеÑтво копии</translation>
+ </message>
+ <message>
+ <source>&lt;&lt; Functions</source>
+<translation>&lt;&lt; Функции</translation>
+ </message>
+ <message>
+ <source>Close</source>
+<translation>Закрыть</translation>
+ </message>
+ <message>
+ <source>Make Copies(s)</source>
+<translation>Копировать</translation>
+ </message>
+ <message>
+ <source>Number of copies:</source>
+<translation>КоличеÑтво копий:</translation>
+ </message>
+ <message>
+ <source>Default</source>
+<translation>Значение по умолчанию</translation>
+ </message>
+ <message>
+ <source>Quality:</source>
+<translation>КачеÑтво:</translation>
+ </message>
+ <message>
+ <source>Fast</source>
+<translation>БыÑтро</translation>
+ </message>
+ <message>
+ <source>Draft</source>
+<translation>Черновое</translation>
+ </message>
+ <message>
+ <source>Normal</source>
+<translation>Обычное</translation>
+ </message>
+ <message>
+ <source>Presentation</source>
+<translation>ПрезентациÑ</translation>
+ </message>
+ <message>
+ <source>Best</source>
+<translation>Ð’Ñ‹Ñокое</translation>
+ </message>
+ <message>
+ <source>Enlargement or reduction (percent):</source>
+<translation>Увеличение или уменьшение (в процентах):</translation>
+ </message>
+ <message>
+ <source>Fit to Page</source>
+<translation>Увеличение, уменьшение или в размер Ñтраницы</translation>
+ </message>
+ <message>
+ <source>Contrast (-5 lighter to +5 darker):</source>
+<translation>КонтраÑÑ‚ (от Ñветлого (-5) к темному (+5)):</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Copier error.&lt;/b&gt;&lt;p&gt;</source>
+<translation>&lt;b&gt;Ошибка копированиÑ.&lt;/b&gt;&lt;p&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Cannot copy: Device is busy or not available.&lt;/b&gt;&lt;p&gt;Please check device and try again. [1]</source>
+<translation>&lt;b&gt;Ðевозможно копировать: УÑтройÑтво занÑто или не доÑтупно.&lt;/b&gt;&lt;p&gt;Проверьте уÑтройÑтво и повторите попытку. [1]</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollDeviceInfoView</name>
+ <message>
+ <source>&lt;&lt; Tools</source>
+ <translation>&lt;&lt; СервиÑ</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Закрыть</translation>
+ </message>
+ <message>
+ <source>Device Information</source>
+ <translation>Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾Ð± уÑтройÑтве</translation>
+ </message>
+ <message>
+ <source>Static/Dynamic</source>
+ <translation>СтатичеÑкаÑ/динамичеÑкаÑ</translation>
+ </message>
+ <message>
+ <source>Key</source>
+ <translation>Ключ</translation>
+ </message>
+ <message>
+ <source>Value</source>
+ <translation>Значение</translation>
+ </message>
+ <message>
+ <source>Static</source>
+ <translation>СтатичеÑкаÑ</translation>
+ </message>
+ <message>
+ <source>Dynamic</source>
+ <translation>ДинамичеÑкаÑ</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollFaxView</name>
+ <message>
+ <source>PDF Document</source>
+ <translation>Документ PDF</translation>
+ </message>
+ <message>
+ <source>Postscript Document</source>
+ <translation>Документ Postscript</translation>
+ </message>
+ <message>
+ <source>HP Graphics Language File</source>
+ <translation>Файл на графичеÑком Ñзыке HPGL</translation>
+ </message>
+ <message>
+ <source>C Shell Script</source>
+ <translation>Сценарий оболочки на Ñзыке C</translation>
+ </message>
+ <message>
+ <source>C Source Code</source>
+ <translation>ИÑходный код на Ñзыке C</translation>
+ </message>
+ <message>
+ <source>C++ Source Code</source>
+ <translation>ИÑходный код на C++</translation>
+ </message>
+ <message>
+ <source>Perl Script</source>
+ <translation>Сценарий на Ñзыке Perl</translation>
+ </message>
+ <message>
+ <source>Python Program</source>
+ <translation>Программа Python</translation>
+ </message>
+ <message>
+ <source>Shell Script</source>
+ <translation>Сценарий оболочки</translation>
+ </message>
+ <message>
+ <source>Plain Text</source>
+ <translation>Обычный текÑÑ‚</translation>
+ </message>
+ <message>
+ <source>HTML Dcoument</source>
+ <translation>Документ HTML</translation>
+ </message>
+ <message>
+ <source>GIF Image</source>
+ <translation>Изображение в формате GIF</translation>
+ </message>
+ <message>
+ <source>PNG Image</source>
+ <translation>Изображение в формате PNG</translation>
+ </message>
+ <message>
+ <source>JPEG Image</source>
+ <translation>Изображение в формате JPEG</translation>
+ </message>
+ <message>
+ <source>TIFF Image</source>
+ <translation>Изображение в формате TIFF</translation>
+ </message>
+ <message>
+ <source>Bitmap (BMP) Image</source>
+ <translation>РаÑтровое изображение (BMP)</translation>
+ </message>
+ <message>
+ <source>Photo CD Image</source>
+ <translation>Фотоизображение Ð´Ð»Ñ ÐºÐ¾Ð¼Ð¿Ð°ÐºÑ‚-диÑков</translation>
+ </message>
+ <message>
+ <source>Portable Image (PNM)</source>
+ <translation>Изображение в переноÑимом формате (PNM)</translation>
+ </message>
+ <message>
+ <source>Portable B&amp;W Image (PBM)</source>
+ <translation>Изображение в переноÑимом формате, черно-белое (PBM)</translation>
+ </message>
+ <message>
+ <source>Portable Grayscale Image (PGM)</source>
+ <translation>Изображение в переноÑимом формате, шкала Ñерого (PGM)</translation>
+ </message>
+ <message>
+ <source>Portable Color Image (PPM)</source>
+ <translation>Изображение в переноÑимом формате, цветное (PPM)</translation>
+ </message>
+ <message>
+ <source>SGI RGB</source>
+ <translation>SGI RGB</translation>
+ </message>
+ <message>
+ <source>X11 Bitmap (XBM)</source>
+ <translation>X11, раÑтровое (XBM)</translation>
+ </message>
+ <message>
+ <source>X11 Pixmap (XPM)</source>
+ <translation>X11, пикÑельное (XPM)</translation>
+ </message>
+ <message>
+ <source>Sun Raster Format</source>
+ <translation>РаÑтровый формат Sun</translation>
+ </message>
+ <message>
+ <source>File(s) to Fax</source>
+ <translation>Файлы Ð´Ð»Ñ Ñ„Ð°ÐºÑимильной передачи</translation>
+ </message>
+ <message>
+ <source>Add/Edit Fax Coverpage</source>
+ <translation>Добавить/изменить титульную Ñтраницу факÑа</translation>
+ </message>
+ <message>
+ <source>Recipient(s)</source>
+ <translation>Получатели</translation>
+ </message>
+ <message>
+ <source>Add Recipients from the Fax Address Book</source>
+ <translation>Добавить получателей из адреÑной книги факÑа</translation>
+ </message>
+ <message>
+ <source>&lt;i&gt;Quick Add&lt;/i&gt; an Individual Recipient</source>
+ <translation>&lt;i&gt;БыÑтрое добавление&lt;/i&gt; одного получателÑ</translation>
+ </message>
+ <message>
+ <source>&lt;&lt; Functions</source>
+ <translation>&lt;&lt; Функции</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Закрыть</translation>
+ </message>
+ <message>
+ <source>Send Fax Now</source>
+ <translation>Передать факÑ</translation>
+ </message>
+ <message>
+ <source>Processing fax...</source>
+ <translation>Обработка факÑа...</translation>
+ </message>
+ <message>
+ <source>Receiving fax data...</source>
+ <translation>Прием данных факÑа...</translation>
+ </message>
+ <message>
+ <source>Read %1 of fax data...</source>
+ <translation>Прочтено %1 данных факÑа...</translation>
+ </message>
+ <message>
+ <source>Order</source>
+ <translation>ПорÑдок</translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation>ИмÑ</translation>
+ </message>
+ <message>
+ <source>Type</source>
+ <translation>Тип</translation>
+ </message>
+ <message>
+ <source>Pages</source>
+ <translation>Страницы</translation>
+ </message>
+ <message>
+ <source>Path</source>
+ <translation>Путь</translation>
+ </message>
+ <message>
+ <source>Add File...</source>
+ <translation>Добавить файл...</translation>
+ </message>
+ <message>
+ <source>Show Types...</source>
+ <translation>Показать типы...</translation>
+ </message>
+ <message>
+ <source>Remove File</source>
+ <translation>Удалить файл</translation>
+ </message>
+ <message>
+ <source>Move Down</source>
+ <translation>Вниз</translation>
+ </message>
+ <message>
+ <source>Move Up</source>
+ <translation>Вверх</translation>
+ </message>
+ <message>
+ <source>Show File Types...</source>
+ <translation>Показать типы файлов...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Invalid HPLIP Fax file.&lt;/b&gt;&lt;p&gt;Bad magic!</source>
+ <translation>&lt;b&gt;ÐедопуÑтимый файл факÑа HPLIP.&lt;/b&gt;&lt;p&gt;Ðеверный ключ!</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;You are trying to add a file that cannot be directly faxed with this utility.&lt;/b&gt;&lt;p&gt;To print this file, use the print command in the application that created it.</source>
+ <translation>&lt;b&gt;ВыполнÑетÑÑ Ð¿Ð¾Ð¿Ñ‹Ñ‚ÐºÐ° Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð°, который невозможно напрÑмую передать по факÑу Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ данной Ñлужебной программы.&lt;/b&gt;&lt;p&gt;Ð”Ð»Ñ Ñ€Ð°Ñпечатки Ñтого файла воÑпользуйтеÑÑŒ командой приложениÑ, в котором Ñоздан файл.</translation>
+ </message>
+ <message>
+ <source>Processing fax file...</source>
+ <translation>Обработка файла факÑа...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Printer &apos;%1&apos; is in a stopped or error state.&lt;/b&gt;&lt;p&gt;Check the printer queue in CUPS and try again.</source>
+ <translation>&lt;b&gt;Принтер &apos;%1&apos; находитÑÑ Ð² ÑоÑтоÑнии оÑтановки или ошибки.&lt;/b&gt;&lt;p&gt;Проверьте в CUPS очередь принтера и повторите попытку.</translation>
+ </message>
+ <message>
+ <source>Edit...</source>
+ <translation>Изменить...</translation>
+ </message>
+ <message>
+ <source>Add...</source>
+ <translation>Добавить...</translation>
+ </message>
+ <message>
+ <source>HP Fax Coverpage</source>
+ <translation>Ð¢Ð¸Ñ‚ÑƒÐ»ÑŒÐ½Ð°Ñ Ñтраница факÑа HP</translation>
+ </message>
+ <message>
+ <source>Cover Page</source>
+ <translation>Ð¢Ð¸Ñ‚ÑƒÐ»ÑŒÐ½Ð°Ñ Ñтраница</translation>
+ </message>
+ <message>
+ <source>Fax Number</source>
+ <translation>Ðомер аппарата факÑимильной ÑвÑзи</translation>
+ </message>
+ <message>
+ <source>Notes</source>
+ <translation>ПримечаниÑ</translation>
+ </message>
+ <message>
+ <source>Fax Address Book...</source>
+ <translation>ÐдреÑÐ½Ð°Ñ ÐºÐ½Ð¸Ð³Ð° факÑа...</translation>
+ </message>
+ <message>
+ <source>Remove</source>
+ <translation>Удалить</translation>
+ </message>
+ <message>
+ <source>Add Individual</source>
+ <translation>Добавить один</translation>
+ </message>
+ <message>
+ <source>Add Group</source>
+ <translation>Добавить группу</translation>
+ </message>
+ <message>
+ <source>Add an &lt;b&gt;individual &lt;/b&gt;from the fax address book:</source>
+ <translation>Добавить &lt;b&gt;одного &lt;/b&gt;Ð¿Ð¾Ð»ÑƒÑ‡Ð°Ñ‚ÐµÐ»Ñ Ð¸Ð· адреÑной книги факÑа:</translation>
+ </message>
+ <message>
+ <source>Add a &lt;b&gt;group&lt;/b&gt; from the fax address book:</source>
+ <translation>Добавить &lt;b&gt;группу &lt;/b&gt;получателей из адреÑной книги факÑа:</translation>
+ </message>
+ <message>
+ <source>Add</source>
+ <translation>Добавить</translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation>ИмÑ:</translation>
+ </message>
+ <message>
+ <source>Fax Number:</source>
+ <translation>Ðомер аппарата факÑимильной ÑвÑзи:</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Fax configuration error.&lt;/b&gt;&lt;p&gt;The CUPS fax queue for &apos;%1&apos; is incorrectly configured.&lt;p&gt;Please make sure that the CUPS fax queue is configured with the &apos;HPLIP Fax&apos; Model/Driver.</source>
+ <translation>&lt;b&gt;Ошибка наÑтройки факÑа.&lt;/b&gt;&lt;p&gt;Очередь факÑа CUPS Ð´Ð»Ñ &apos;%1&apos; неправильно наÑтроена.&lt;p&gt;ÐаÑтройте очередь факÑа CUPS Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ модели &apos;HPLIP Fax&apos; или драйвера.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Device is busy or in an error state (code=%1)&lt;/b&gt;&lt;p&gt;Please wait for the device to become idle or clear the error and try again.</source>
+ <translation>&lt;b&gt;УÑтройÑтво занÑто или возникло ÑоÑтоÑние ошибки (код=%1)&lt;/b&gt;&lt;p&gt;ДождитеÑÑŒ оÑÐ²Ð¾Ð±Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ ÑƒÑтройÑтва или ÑброÑьте ошибку и повторите попытку.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;The CUPS queue for &apos;%1&apos; is in a stopped or busy state.&lt;/b&gt;&lt;p&gt;Please check the queue and try again.</source>
+ <translation>&lt;b&gt;Очередь CUPS Ð´Ð»Ñ &apos;%1&apos; находитÑÑ Ð² ÑоÑтоÑнии оÑтановки или занÑта.&lt;/b&gt;&lt;p&gt;Проверьте очередь и повторите попытку.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Send fax is active.&lt;/b&gt;&lt;p&gt;Please wait for operation to complete.</source>
+ <translation>&lt;b&gt;ВыполнÑетÑÑ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð° факÑа.&lt;/b&gt;&lt;p&gt;ДождитеÑÑŒ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ð¸.</translation>
+ </message>
+ <message>
+ <source>Initializing...</source>
+ <translation>ИнициализациÑ...</translation>
+ </message>
+ <message>
+ <source>Processing page %1...</source>
+ <translation>ОбрабатываетÑÑ Ñтраница %1...</translation>
+ </message>
+ <message>
+ <source>Dialing %1...</source>
+ <translation>ВыполнÑетÑÑ Ð½Ð°Ð±Ð¾Ñ€ %1...</translation>
+ </message>
+ <message>
+ <source>Connecting to %1...</source>
+ <translation>ВыполнÑетÑÑ Ñоединение Ñ %1...</translation>
+ </message>
+ <message>
+ <source>Sending page %1 to %2...</source>
+ <translation>ПередаетÑÑ Ñтраница %1 на %2...</translation>
+ </message>
+ <message>
+ <source>Cleaning up...</source>
+ <translation>ВыполнÑетÑÑ Ð¾Ñ‡Ð¸Ñтка...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Fax send error.&lt;/b&gt;&lt;p&gt;</source>
+ <translation>&lt;b&gt;Ошибка передачи факÑа.&lt;/b&gt;&lt;p&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Fax device is busy.&lt;/b&gt;&lt;p&gt;Please try again later.</source>
+ <translation>&lt;b&gt;Ðппарат факÑимильной ÑвÑзи занÑÑ‚.&lt;/b&gt;&lt;p&gt;Повторите попытку позднее.</translation>
+ </message>
+ <message>
+ <source>Added with Quick Add</source>
+<translation>Добавлено Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ функции быÑтрого добавлениÑ</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollFunctionsView</name>
+ <message>
+ <source>Print &gt;&gt;</source>
+ <translation>Печать &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>Print...</source>
+ <translation>Печать...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Print&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Печать&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Print documents or files.</source>
+ <translation>Печать документов или файлов.</translation>
+ </message>
+ <message>
+ <source>Scan &gt;&gt;</source>
+ <translation>Сканирование &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>Scan...</source>
+ <translation>Сканирование...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Scan&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Сканирование&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Scan a document, image, or photograph.</source>
+ <translation>Сканирование документа, Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ фотографии.</translation>
+ </message>
+ <message>
+ <source>Send PC Fax &gt;&gt;</source>
+ <translation>Передача факÑа Ñ ÐŸÐš &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>Send PC Fax...</source>
+ <translation>Передача факÑа Ñ ÐŸÐš...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Send PC Fax&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Передача факÑа Ñ ÐŸÐš&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Send a fax from the PC.</source>
+ <translation>Передача факÑа Ñ ÐŸÐš.</translation>
+ </message>
+ <message>
+ <source>Make Copies &gt;&gt;</source>
+ <translation>Создание копий &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>Make Copies...</source>
+ <translation>Создание копий...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Make Copies&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Создание копий&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Make copies on the device controlled by the PC.</source>
+ <translation>Создание копий на уÑтройÑтве, управлÑемом ПК.</translation>
+ </message>
+ <message>
+ <source>Unload Photo Card &gt;&gt;</source>
+ <translation>Выгрузка карты памÑти Ð´Ð»Ñ Ñ„Ð¾Ñ‚Ð¾Ð³Ñ€Ð°Ñ„Ð¸Ð¹ &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>Unload Photo Card...</source>
+ <translation>Выгрузка карты памÑти Ð´Ð»Ñ Ñ„Ð¾Ñ‚Ð¾Ð³Ñ€Ð°Ñ„Ð¸Ð¹...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Unload Photo Card&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Выгрузка карты памÑти Ð´Ð»Ñ Ñ„Ð¾Ñ‚Ð¾Ð³Ñ€Ð°Ñ„Ð¸Ð¹&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Copy images from the device&apos;s photo card to the PC.</source>
+ <translation>Копирование изображений Ñ ÐºÐ°Ñ€Ñ‚Ñ‹ памÑти Ð´Ð»Ñ Ñ„Ð¾Ñ‚Ð¾Ð³Ñ€Ð°Ñ„Ð¸Ð¹ данного уÑтройÑтва на ПК.</translation>
+ </message>
+ <message>
+ <source>ERROR: Device not supported.</source>
+ <translation>ОШИБКÐ: УÑтройÑтво не поддерживаетÑÑ.</translation>
+ </message>
+ <message>
+ <source>ERROR: Device not found. Please check connection and power-on device.</source>
+ <translation>ОШИБКÐ: УÑтройÑтво не найдено. Проверьте Ñоединение и подачу Ð¿Ð¸Ñ‚Ð°Ð½Ð¸Ñ Ð½Ð° уÑтройÑтво.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Photocards on your printer are only available by mounting them as drives using USB mass storage.&lt;/b&gt;&lt;p&gt;Please refer to your distribution&apos;s documentation for setup and usage instructions.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Ðа данном принтере карты памÑти Ð´Ð»Ñ Ñ„Ð¾Ñ‚Ð¾Ð³Ñ€Ð°Ñ„Ð¸Ð¹ доÑтупны только поÑле уÑтановки их в качеÑтве ноÑителей Ñ Ð¸Ñпользованием запоминающего уÑтройÑтва USB.&lt;/b&gt;&lt;p&gt;За инÑтрукциÑми по уÑтановке и иÑпользованию обратитеÑÑŒ к документации, входÑщей в комплект поÑтавки.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Unable to run command. No command specified.&lt;/b&gt;&lt;p&gt;Use &lt;pre&gt;Configure...&lt;/pre&gt; to specify a command to run.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Ðевозможно выполнить команду. Команда не указана.&lt;/b&gt;&lt;p&gt;Ð”Ð»Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½Ñемой команды воÑпользуйтеÑÑŒ пунктом меню &lt;pre&gt;ÐаÑтройка...&lt;/pre&gt;.</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollPrintJobView</name>
+ <message>
+ <source>Pending</source>
+ <translation>Ожидание</translation>
+ </message>
+ <message>
+ <source>On hold</source>
+ <translation>Отложено</translation>
+ </message>
+ <message>
+ <source>Printing</source>
+ <translation>Печать</translation>
+ </message>
+ <message>
+ <source>Stopped</source>
+ <translation>ОÑтановлено</translation>
+ </message>
+ <message>
+ <source>Canceled</source>
+ <translation>Отменено</translation>
+ </message>
+ <message>
+ <source>Aborted</source>
+ <translation>Прервано</translation>
+ </message>
+ <message>
+ <source>Completed</source>
+ <translation>Завершено</translation>
+ </message>
+ <message>
+ <source>Print Control</source>
+ <translation>Управление печатью</translation>
+ </message>
+ <message>
+ <source>Job Control</source>
+ <translation>Управление заданиÑми</translation>
+ </message>
+ <message>
+ <source>1 Active Print Job</source>
+ <translation>1 активное задание на печать</translation>
+ </message>
+ <message>
+ <source>%1 Active Print Jobs</source>
+ <translation>%1 активных заданий на печать</translation>
+ </message>
+ <message>
+ <source>Set as Default</source>
+ <translation>Заданы параметры по умолчанию</translation>
+ </message>
+ <message>
+ <source>SET AS DEFAULT</source>
+ <translation>ЗÐДÐÐЫ ПÐРÐМЕТРЫ ПО УМОЛЧÐÐИЮ</translation>
+ </message>
+ <message>
+ <source>NOT SET AS DEFAULT</source>
+ <translation>ÐЕ ЗÐДÐÐО ИСПОЛЬЗОВÐÐИЕ ПÐРÐМЕТРОВ ПО УМОЛЧÐÐИЮ</translation>
+ </message>
+ <message>
+ <source>The printer is currently: %1</source>
+ <translation>В текущий момент принтер: %1</translation>
+ </message>
+ <message>
+ <source>IDLE</source>
+ <translation>БЕЗДЕЙСТВУЕТ</translation>
+ </message>
+ <message>
+ <source>Stop Printer</source>
+ <translation>ОÑтановить принтера</translation>
+ </message>
+ <message>
+ <source>PROCESSING</source>
+ <translation>ВЫПОЛÐЯЕТ ОБРÐБОТКУ</translation>
+ </message>
+ <message>
+ <source>STOPPED</source>
+ <translation>ОСТÐÐОВЛЕÐ</translation>
+ </message>
+ <message>
+ <source>Start Printer</source>
+ <translation>ЗапуÑтить принтер</translation>
+ </message>
+ <message>
+ <source>ACCEPTING JOBS</source>
+ <translation>ПРИÐИМÐЕТ ЗÐДÐÐИЯ</translation>
+ </message>
+ <message>
+ <source>Reject Jobs</source>
+ <translation>Отклонить заданиÑ</translation>
+ </message>
+ <message>
+ <source>REJECTING JOBS</source>
+ <translation>ОТКЛОÐЕÐИЕ ЗÐДÐÐИЙ</translation>
+ </message>
+ <message>
+ <source>Accept Jobs</source>
+ <translation>ПринÑÑ‚ÑŒ заданиÑ</translation>
+ </message>
+ <message>
+ <source>Cancel all active print jobs</source>
+ <translation>Отменить вÑе активные Ð·Ð°Ð´Ð°Ð½Ð¸Ñ Ð½Ð° печать</translation>
+ </message>
+ <message>
+ <source>Cancel All Jobs</source>
+ <translation>Отменить вÑе заданиÑ</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;%1&lt;/b&gt;</source>
+ <translation>&lt;b&gt;%1&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Job ID: %1</source>
+ <translation>ID заданиÑ: %1</translation>
+ </message>
+ <message>
+ <source>Cancel Job</source>
+ <translation>Отменить задание</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollPrintSettingsView</name>
+ <message>
+ <source>Basic</source>
+<translation>ОÑновной</translation>
+ </message>
+ <message>
+ <source>Page Orientation</source>
+<translation>ÐžÑ€Ð¸ÐµÐ½Ñ‚Ð°Ñ†Ð¸Ñ Ñтраницы</translation>
+ </message>
+ <message>
+ <source>Portrait</source>
+<translation>КнижнаÑ</translation>
+ </message>
+ <message>
+ <source>Landscape</source>
+<translation>ÐльбомнаÑ</translation>
+ </message>
+ <message>
+ <source>Reverse landscape</source>
+<translation>Ð—ÐµÑ€ÐºÐ°Ð»ÑŒÐ½Ð°Ñ Ð°Ð»ÑŒÐ±Ð¾Ð¼Ð½Ð°Ñ</translation>
+ </message>
+ <message>
+ <source>Reverse portrait</source>
+<translation>Ð—ÐµÑ€ÐºÐ°Ð»ÑŒÐ½Ð°Ñ ÐºÐ½Ð¸Ð¶Ð½Ð°Ñ</translation>
+ </message>
+ <message>
+ <source>Duplex (Print on both sides of the page)</source>
+<translation>Ð”ÑƒÐ¿Ð»ÐµÐºÑ (печать на обеих Ñторонах лиÑта)</translation>
+ </message>
+ <message>
+ <source>Single sided</source>
+<translation>ОдноÑтороннÑÑ</translation>
+ </message>
+ <message>
+ <source>Two sided (long edge)</source>
+<translation>ДвуÑтороннÑÑ (длинный край)</translation>
+ </message>
+ <message>
+ <source>Two sided (short edge)</source>
+<translation>ДвуÑтороннÑÑ (короткий край)</translation>
+ </message>
+ <message>
+ <source>Output Order (Print last page first)</source>
+<translation>ПорÑдок вывода (поÑледнÑÑ Ñтраница печатаетÑÑ Ð¿ÐµÑ€Ð²Ð¾Ð¹)</translation>
+ </message>
+ <message>
+ <source>Normal (Print first page first)</source>
+<translation>Ðормальный (Ð¿ÐµÑ€Ð²Ð°Ñ Ñтраница печатаетÑÑ Ð¿ÐµÑ€Ð²Ð¾Ð¹)</translation>
+ </message>
+ <message>
+ <source>Reversed (Print last page first)</source>
+<translation>Обратный (поÑледнÑÑ Ñтраница печатаетÑÑ Ð¿ÐµÑ€Ð²Ð¾Ð¹)</translation>
+ </message>
+ <message>
+ <source>Collate (Group together multiple copies)</source>
+<translation>Объединить (Ñгруппировать на Ñтранице неÑколько копий)</translation>
+ </message>
+ <message>
+ <source>Quality</source>
+<translation>КачеÑтво копии</translation>
+ </message>
+ <message>
+ <source>N-Up (Multiple document pages per printed page)</source>
+<translation>N-ÑÑ‚Ñ€ (неÑколько Ñтраниц документа на одной Ñтранице раÑпечатки)</translation>
+ </message>
+ <message>
+ <source>Pages per Sheet</source>
+<translation>Страниц на лиÑте</translation>
+ </message>
+ <message>
+ <source>1 sheet per page</source>
+<translation>1 Ñтраница на лиÑте</translation>
+ </message>
+ <message>
+ <source>2 sheets per page</source>
+<translation>2 Ñтраницы на лиÑте</translation>
+ </message>
+ <message>
+ <source>4 sheets per page</source>
+<translation>4 Ñтраницы на лиÑте</translation>
+ </message>
+ <message>
+ <source>Layout</source>
+<translation>Компоновка</translation>
+ </message>
+ <message>
+ <source>Bottom to top, left to right</source>
+<translation>Снизу вверх, Ñлева направо</translation>
+ </message>
+ <message>
+ <source>Bottom to top, right to left</source>
+<translation>Снизу вверх, Ñправа налево</translation>
+ </message>
+ <message>
+ <source>Left to right, bottom to top</source>
+<translation>Слева направо, Ñнизу вверх</translation>
+ </message>
+ <message>
+ <source>Left to right, top to bottom</source>
+<translation>Слева направо, Ñверху вниз</translation>
+ </message>
+ <message>
+ <source>Right to left, bottom to top</source>
+<translation>Справа налево, Ñнизу вверх</translation>
+ </message>
+ <message>
+ <source>Right to left, top to bottom</source>
+<translation>Справа налево, Ñверху вниз</translation>
+ </message>
+ <message>
+ <source>Top to bottom, left to right</source>
+<translation>Сверху вниз, Ñлева направо</translation>
+ </message>
+ <message>
+ <source>Top to bottom, right to left</source>
+<translation>Сверху вниз, Ñправа налево</translation>
+ </message>
+ <message>
+ <source>Printed Border Around Each Page</source>
+<translation>Печать рамки вокруг Ñтраницы</translation>
+ </message>
+ <message>
+ <source>Two thin borders</source>
+<translation>Две тонких линии</translation>
+ </message>
+ <message>
+ <source>Two thick borders</source>
+<translation>Две толÑÑ‚Ñ‹Ñ… линии</translation>
+ </message>
+ <message>
+ <source>No border</source>
+<translation>Без рамки</translation>
+ </message>
+ <message>
+ <source>One thin border</source>
+<translation>Одна Ñ‚Ð¾Ð½ÐºÐ°Ñ Ð»Ð¸Ð½Ð¸Ñ</translation>
+ </message>
+ <message>
+ <source>One thick border</source>
+<translation>Одна толÑÑ‚Ð°Ñ Ð»Ð¸Ð½Ð¸Ñ</translation>
+ </message>
+ <message>
+ <source>Printout Appearance</source>
+<translation>Выход раÑпечаток</translation>
+ </message>
+ <message>
+ <source>Brightness</source>
+<translation>ЯркоÑÑ‚ÑŒ</translation>
+ </message>
+ <message>
+ <source>Gamma</source>
+<translation>Гамма</translation>
+ </message>
+ <message>
+ <source>Image Printing</source>
+<translation>Печать изображениÑ</translation>
+ </message>
+ <message>
+ <source>Fit to Page</source>
+<translation>Увеличение, уменьшение или в размер Ñтраницы</translation>
+ </message>
+ <message>
+ <source>Position on Page</source>
+<translation>Положение на Ñтранице</translation>
+ </message>
+ <message>
+ <source>Centered</source>
+<translation>По центру</translation>
+ </message>
+ <message>
+ <source>Top</source>
+<translation>Сверху вниз, Ñлева направо</translation>
+ </message>
+ <message>
+ <source>Left</source>
+<translation>Слева направо, Ñнизу вверх</translation>
+ </message>
+ <message>
+ <source>Right</source>
+<translation>Справа налево, Ñнизу вверх</translation>
+ </message>
+ <message>
+ <source>Top left</source>
+<translation>Вверху Ñлева</translation>
+ </message>
+ <message>
+ <source>Top right</source>
+<translation>Вверху Ñправа</translation>
+ </message>
+ <message>
+ <source>Bottom</source>
+<translation>Снизу вверх, Ñлева направо</translation>
+ </message>
+ <message>
+ <source>Bottom left</source>
+<translation>Внизу Ñлева</translation>
+ </message>
+ <message>
+ <source>Bottom right</source>
+<translation>Внизу Ñправа</translation>
+ </message>
+ <message>
+ <source>Saturation</source>
+<translation>ÐаÑыщенноÑÑ‚ÑŒ</translation>
+ </message>
+ <message>
+ <source>Hue (color shift/rotation)</source>
+<translation>Оттенок (Ñмещение/Ñдвиг цвета)</translation>
+ </message>
+ <message>
+ <source>&quot;Natural&quot; Scaling (relative to image)</source>
+<translation>&quot;ЕÑтеÑтвенный&quot; маÑштаб (отноÑительно изображениÑ)</translation>
+ </message>
+ <message>
+ <source>Scaling (relative to page)</source>
+<translation>МаÑштаб (отноÑительно Ñтраницы)</translation>
+ </message>
+ <message>
+ <source>Miscellaneous</source>
+<translation>Прочее</translation>
+ </message>
+ <message>
+ <source>&quot;Pretty Print&quot; Text Documents (Add headers and formatting)</source>
+<translation>&quot;Украшение&quot; текÑтовых документов (добавление верхних колонтитулов и форматирование)</translation>
+ </message>
+ <message>
+ <source>Banner Pages</source>
+<translation>ТранÑпаранты</translation>
+ </message>
+ <message>
+ <source>No banner page</source>
+<translation>ТранÑпарант отÑутÑтвует</translation>
+ </message>
+ <message>
+ <source>Classified</source>
+<translation>Закрытый</translation>
+ </message>
+ <message>
+ <source>Confidential</source>
+<translation>Конфиденциальный</translation>
+ </message>
+ <message>
+ <source>Secret</source>
+<translation>Секретный</translation>
+ </message>
+ <message>
+ <source>Standard</source>
+<translation>Стандартный</translation>
+ </message>
+ <message>
+ <source>Top secret</source>
+<translation>Совершенно Ñекретный</translation>
+ </message>
+ <message>
+ <source>Unclassified</source>
+<translation>Открытый</translation>
+ </message>
+ <message>
+ <source>Mirror Printing</source>
+<translation>Ð—ÐµÑ€ÐºÐ°Ð»ÑŒÐ½Ð°Ñ Ð¿ÐµÑ‡Ð°Ñ‚ÑŒ</translation>
+ </message>
+ <message>
+ <source>Set Quality to &quot;Controlled by &apos;Printout Mode&apos;&quot; to enable.</source>
+<translation>Ð”Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° ‘КачеÑтво’ задать значение &quot;УправлÑетÑÑ &apos;режимом раÑпечатки&apos;&quot;.</translation>
+ </message>
+ <message>
+ <source>On</source>
+<translation>Одна Ñ‚Ð¾Ð½ÐºÐ°Ñ Ð»Ð¸Ð½Ð¸Ñ</translation>
+ </message>
+ <message>
+ <source>Off</source>
+<translation>Выкл</translation>
+ </message>
+ <message>
+ <source>Set to default value of &quot;%1&quot;.</source>
+<translation>Задать значение по умолчанию: &quot;%1&quot;.</translation>
+ </message>
+ <message>
+ <source>Start:</source>
+<translation>Ðачать:</translation>
+ </message>
+ <message>
+ <source>End:</source>
+<translation>Закончить:</translation>
+ </message>
+ <message>
+ <source>Set to default value of &quot;Start: %1, End: %2&quot;.</source>
+<translation>Задать значение по умолчанию: &quot;Ðачать: %1, Закончить: %2&quot;.</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollPrintView</name>
+ <message>
+ <source>PDF Document</source>
+ <translation>Документ PDF</translation>
+ </message>
+ <message>
+ <source>Postscript Document</source>
+ <translation>Документ Postscript</translation>
+ </message>
+ <message>
+ <source>HP Graphics Language File</source>
+ <translation>Файл на графичеÑком Ñзыке HPGL</translation>
+ </message>
+ <message>
+ <source>C Shell Script</source>
+ <translation>Сценарий оболочки на C</translation>
+ </message>
+ <message>
+ <source>C Source Code</source>
+ <translation>ИÑходный код на Ñзыке C</translation>
+ </message>
+ <message>
+ <source>C++ Source Code</source>
+ <translation>ИÑходный код на C++</translation>
+ </message>
+ <message>
+ <source>Perl Script</source>
+ <translation>Сценарий на Ñзыке Perl</translation>
+ </message>
+ <message>
+ <source>Python Program</source>
+ <translation>Программа Python</translation>
+ </message>
+ <message>
+ <source>Shell Script</source>
+ <translation>Сценарий оболочки</translation>
+ </message>
+ <message>
+ <source>Plain Text</source>
+ <translation>Обычный текÑÑ‚</translation>
+ </message>
+ <message>
+ <source>HTML Dcoument</source>
+ <translation>Документ HTML</translation>
+ </message>
+ <message>
+ <source>GIF Image</source>
+ <translation>Изображение в формате GIF</translation>
+ </message>
+ <message>
+ <source>PNG Image</source>
+ <translation>Изображение в формате PNG</translation>
+ </message>
+ <message>
+ <source>JPEG Image</source>
+ <translation>Изображение в формате JPEG</translation>
+ </message>
+ <message>
+ <source>TIFF Image</source>
+ <translation>Изображение в формате TIFF</translation>
+ </message>
+ <message>
+ <source>Bitmap (BMP) Image</source>
+ <translation>РаÑтровое изображение (BMP)</translation>
+ </message>
+ <message>
+ <source>Photo CD Image</source>
+ <translation>Фотоизображение Ð´Ð»Ñ ÐºÐ¾Ð¼Ð¿Ð°ÐºÑ‚-диÑков</translation>
+ </message>
+ <message>
+ <source>Portable Image (PNM)</source>
+ <translation>Изображение в переноÑимом формате (PNM)</translation>
+ </message>
+ <message>
+ <source>Portable B&amp;W Image (PBM)</source>
+ <translation>Изображение в переноÑимом формате, черно-белое (PBM)</translation>
+ </message>
+ <message>
+ <source>Portable Grayscale Image (PGM)</source>
+ <translation>Изображение в переноÑимом формате, шкала Ñерого (PGM)</translation>
+ </message>
+ <message>
+ <source>Portable Color Image (PPM)</source>
+ <translation>Изображение в переноÑимом формате, цветное (PPM)</translation>
+ </message>
+ <message>
+ <source>SGI RGB</source>
+ <translation>SGI RGB</translation>
+ </message>
+ <message>
+ <source>X11 Bitmap (XBM)</source>
+ <translation>X11, раÑтровое (XBM)</translation>
+ </message>
+ <message>
+ <source>X11 Pixmap (XPM)</source>
+ <translation>X11, пикÑельное (XPM)</translation>
+ </message>
+ <message>
+ <source>Sun Raster Format</source>
+ <translation>РаÑтровый формат Sun</translation>
+ </message>
+ <message>
+ <source>File(s) to Print</source>
+ <translation>Файлы Ð´Ð»Ñ Ð¿ÐµÑ‡Ð°Ñ‚Ð¸</translation>
+ </message>
+ <message>
+ <source>Print Options</source>
+ <translation>Параметры печати</translation>
+ </message>
+ <message>
+ <source>&lt;&lt; Functions</source>
+ <translation>&lt;&lt; Функции</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Закрыть</translation>
+ </message>
+ <message>
+ <source>Print File(s)</source>
+ <translation>Печать файлов</translation>
+ </message>
+ <message>
+ <source>Order</source>
+ <translation>ПорÑдок</translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation>ИмÑ</translation>
+ </message>
+ <message>
+ <source>Type</source>
+ <translation>Тип</translation>
+ </message>
+ <message>
+ <source>Path</source>
+ <translation>Путь</translation>
+ </message>
+ <message>
+ <source>Add File...</source>
+ <translation>Добавить файл...</translation>
+ </message>
+ <message>
+ <source>Show Types...</source>
+ <translation>Показать типы...</translation>
+ </message>
+ <message>
+ <source>Remove File</source>
+ <translation>Удалить файл</translation>
+ </message>
+ <message>
+ <source>Move Down</source>
+ <translation>Вниз</translation>
+ </message>
+ <message>
+ <source>Move Up</source>
+ <translation>Вверх</translation>
+ </message>
+ <message>
+ <source>Show File Types...</source>
+ <translation>Показать типы файлов...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;You are trying to add a file that cannot be directly printed with this utility.&lt;/b&gt;&lt;p&gt;To print this file, use the print command in the application that created it.</source>
+ <translation>&lt;b&gt;ВыполнÑетÑÑ Ð¿Ð¾Ð¿Ñ‹Ñ‚ÐºÐ° Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð°, который невозможно напрÑмую раÑпечатать Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ данной Ñлужебной программы.&lt;/b&gt;&lt;p&gt;Ð”Ð»Ñ Ñ€Ð°Ñпечатки Ñтого файла воÑпользуйтеÑÑŒ командой приложениÑ, в котором Ñоздан файл.</translation>
+ </message>
+ <message>
+ <source>Number of copies:</source>
+ <translation>КоличеÑтво копий:</translation>
+ </message>
+ <message>
+ <source>Default</source>
+ <translation>Значение по умолчанию</translation>
+ </message>
+ <message>
+ <source>Page Range:</source>
+ <translation>Диапазон Ñтраниц:</translation>
+ </message>
+ <message>
+ <source>All pages</source>
+ <translation>Ð’Ñе Ñтраницы</translation>
+ </message>
+ <message>
+ <source>Page range:</source>
+ <translation>Диапазон Ñтраниц:</translation>
+ </message>
+ <message>
+ <source>Page set:</source>
+ <translation>Ðабор Ñтраниц:</translation>
+ </message>
+ <message>
+ <source>Even pages</source>
+ <translation>Четные Ñтраницы</translation>
+ </message>
+ <message>
+ <source>Odd pages</source>
+ <translation>Ðечетные Ñтраницы</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Cannot print: Invalid page range: %1&lt;/b&gt;&lt;p&gt;A valid page range is a list of pages or ranges of pages separated by commas (e.g., 1-2,4,6-7)</source>
+ <translation>&lt;b&gt;Ðевозможно раÑпечатать: Ðеверный диапазон Ñтраниц: %1&lt;/b&gt;&lt;p&gt;Правильный диапазон Ñтраниц ÑвлÑетÑÑ ÑпиÑком Ñтраниц или диапазонов Ñтраниц, разделенных запÑтыми (например, 1-2,4,6-7)</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Cannot print: Device is busy or not available.&lt;/b&gt;&lt;p&gt;Please check device and try again. [1]</source>
+ <translation type="obsolete">&lt;b&gt;Ðевозможно раÑпечатать: УÑтройÑтво занÑто или не доÑтупно.&lt;/b&gt;&lt;p&gt;Проверьте уÑтройÑтво и повторите попытку. [1]</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Cannot print: Printer is stopped.&lt;/b&gt;&lt;p&gt;Please START the printer to continue this print. Job will begin printing once printer is started.</source>
+ <translation>&lt;b&gt;Ðевозможно раÑпечатать: Принтер оÑтановлен.&lt;/b&gt;&lt;p&gt;Ð”Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð»Ð¶ÐµÐ½Ð¸Ñ Ð¿ÐµÑ‡Ð°Ñ‚Ð¸ на принтере нажмите кнопку ПУСК. Печать Ð·Ð°Ð´Ð°Ð½Ð¸Ñ Ð½Ð°Ñ‡Ð½ÐµÑ‚ÑÑ Ð¿Ð¾Ñле запуÑка принтера.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Cannot print: Printer is not accepting jobs.&lt;/b&gt;&lt;p&gt;Please set the printer to ACCEPTING JOBS to continue printing.</source>
+ <translation>&lt;b&gt;Ðевозможно раÑпечатать: Принтер не принимает заданиÑ.&lt;/b&gt;&lt;p&gt;Ð”Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð»Ð¶ÐµÐ½Ð¸Ñ Ð¿ÐµÑ‡Ð°Ñ‚Ð¸ переведите принтер в ÑоÑтоÑние ПРИЕМ ЗÐДÐÐИЙ.</translation>
+ </message>
+ <message>
+ <source>Print command failed with error code %1</source>
+ <translation>Команда принтера закончила работу Ñ ÐºÐ¾Ð´Ð¾Ð¼ ошибки %1</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Cannot print: Device is busy or not available.&lt;/b&gt;&lt;p&gt;Please check device and try again.</source>
+<translation>&lt;b&gt;Ðевозможно раÑпечатать: УÑтройÑтво занÑто или не доÑтупно.&lt;/b&gt;&lt;p&gt;Проверьте уÑтройÑтво и повторите попытку.</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollPrinterInfoView</name>
+ <message>
+ <source>No printers found for this device.</source>
+ <translation>Ð”Ð»Ñ Ñтого уÑтройÑтва не найдены принтеры.</translation>
+ </message>
+ <message>
+ <source>&lt;&lt; Tools</source>
+ <translation>&lt;&lt; СервиÑ</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Закрыть</translation>
+ </message>
+ <message>
+ <source>Fax</source>
+ <translation>ФакÑ</translation>
+ </message>
+ <message>
+ <source>Printer</source>
+ <translation>Принтер</translation>
+ </message>
+ <message>
+ <source>Type: %1</source>
+ <translation>Тип: %1</translation>
+ </message>
+ <message>
+ <source>Location: %1</source>
+ <translation>МеÑтонахождение: %1</translation>
+ </message>
+ <message>
+ <source>Description/Info: %1</source>
+ <translation>ОпиÑание/информациÑ: %1</translation>
+ </message>
+ <message>
+ <source>Idle</source>
+ <translation>БездейÑтвует</translation>
+ </message>
+ <message>
+ <source>Processing</source>
+ <translation>ВыполнÑет обработку</translation>
+ </message>
+ <message>
+ <source>Stopped</source>
+ <translation>ОÑтановлен</translation>
+ </message>
+ <message>
+ <source>Unknown</source>
+ <translation>ÐеизвеÑтно</translation>
+ </message>
+ <message>
+ <source>State: %1</source>
+ <translation>СоÑтоÑние: %1</translation>
+ </message>
+ <message>
+ <source>PPD/Driver: %1</source>
+ <translation>PPD/драйвер: %1</translation>
+ </message>
+ <message>
+ <source>CUPS/IPP Printer URI: %1</source>
+ <translation>CUPS/URI принтера IPP: %1</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollStatusView</name>
+ <message>
+ <source>year</source>
+ <translation>год</translation>
+ </message>
+ <message>
+ <source>years</source>
+ <translation>годы</translation>
+ </message>
+ <message>
+ <source>month</source>
+ <translation>меÑÑц</translation>
+ </message>
+ <message>
+ <source>months</source>
+ <translation>меÑÑцы</translation>
+ </message>
+ <message>
+ <source>week</source>
+ <translation>неделÑ</translation>
+ </message>
+ <message>
+ <source>weeks</source>
+ <translation>недели</translation>
+ </message>
+ <message>
+ <source>day</source>
+ <translation>день</translation>
+ </message>
+ <message>
+ <source>days</source>
+ <translation>дни</translation>
+ </message>
+ <message>
+ <source>hour</source>
+ <translation>чаÑ</translation>
+ </message>
+ <message>
+ <source>hours</source>
+ <translation>чаÑÑ‹</translation>
+ </message>
+ <message>
+ <source>minute</source>
+ <translation>минута</translation>
+ </message>
+ <message>
+ <source>minutes</source>
+ <translation>минуты</translation>
+ </message>
+ <message>
+ <source>second</source>
+ <translation>Ñекунда</translation>
+ </message>
+ <message>
+ <source>seconds</source>
+ <translation>Ñекунды</translation>
+ </message>
+ <message>
+ <source>one</source>
+ <translation>один</translation>
+ </message>
+ <message>
+ <source>two</source>
+ <translation>два</translation>
+ </message>
+ <message>
+ <source>three</source>
+ <translation>три</translation>
+ </message>
+ <message>
+ <source>four</source>
+ <translation>четыре</translation>
+ </message>
+ <message>
+ <source>five</source>
+ <translation>пÑÑ‚ÑŒ</translation>
+ </message>
+ <message>
+ <source>six</source>
+ <translation>шеÑÑ‚ÑŒ</translation>
+ </message>
+ <message>
+ <source>seven</source>
+ <translation>Ñемь</translation>
+ </message>
+ <message>
+ <source>eight</source>
+ <translation>воÑемь</translation>
+ </message>
+ <message>
+ <source>nine</source>
+ <translation>девÑÑ‚ÑŒ</translation>
+ </message>
+ <message>
+ <source>ten</source>
+ <translation>деÑÑÑ‚ÑŒ</translation>
+ </message>
+ <message>
+ <source>eleven</source>
+ <translation>одиннадцать</translation>
+ </message>
+ <message>
+ <source>twelve</source>
+ <translation>двенадцать</translation>
+ </message>
+ <message>
+ <source>(most recent)</source>
+ <translation>(Ñамые недавние)</translation>
+ </message>
+ <message>
+ <source>User:</source>
+ <translation>Пользователь:</translation>
+ </message>
+ <message>
+ <source>Job ID:</source>
+ <translation>ID заданиÑ:</translation>
+ </message>
+ <message>
+ <source>n/a</source>
+ <translation>-</translation>
+ </message>
+ <message>
+ <source>Code:</source>
+ <translation>Код:</translation>
+ </message>
+ <message>
+ <source>(about %1 ago)</source>
+ <translation>(приблизительно %1 назад)</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollSuppliesView</name>
+ <message>
+ <source>ERROR: Device not supported.</source>
+ <translation>ОШИБКÐ: УÑтройÑтво не поддерживаетÑÑ.</translation>
+ </message>
+ <message>
+ <source>ERROR: Supplies status is not supported on this device.</source>
+ <translation>ОШИБКÐ: Ðа Ñтом уÑтройÑтве не поддерживаетÑÑ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ðµ ÑоÑтоÑÐ½Ð¸Ñ Ñ€Ð°Ñходных материалов.</translation>
+ </message>
+ <message>
+ <source>ERROR: Device not found. Please check connection and power-on device.</source>
+ <translation>ОШИБКÐ: УÑтройÑтво не найдено. Проверьте Ñоединение и подачу Ð¿Ð¸Ñ‚Ð°Ð½Ð¸Ñ Ð½Ð° уÑтройÑтво.</translation>
+ </message>
+ <message>
+ <source>Part No. %1</source>
+ <translation>ЧаÑÑ‚ÑŒ â„– %1...</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollTestpageView</name>
+ <message>
+ <source>&lt;&lt; Tools</source>
+ <translation>&lt;&lt; СервиÑ</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Закрыть</translation>
+ </message>
+ <message>
+ <source>Print Test Page</source>
+ <translation>Печать теÑтовой Ñтраницы</translation>
+ </message>
+ <message>
+ <source>Test Page Type</source>
+ <translation>Тип теÑтовой Ñтраницы</translation>
+ </message>
+ <message>
+ <source>Printer diagnostic page (does not test print driver)</source>
+ <translation>Страница диагноÑтики принтера (проверка драйвера принтера не выполнÑетÑÑ)</translation>
+ </message>
+ <message>
+ <source>HPLIP test page (tests print driver)</source>
+ <translation>ТеÑÑ‚Ð¾Ð²Ð°Ñ Ñтраница HPLIP (проверка драйвера принтера)</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;A test page should be printing on your printer.&lt;/b&gt;&lt;p&gt;If the page fails to print, please visit http://hplip.sourceforge.net for troubleshooting and support.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Ðа принтере должна раÑпечатыватьÑÑ Ñ‚ÐµÑÑ‚Ð¾Ð²Ð°Ñ Ñтраница.&lt;/b&gt;&lt;p&gt;ЕÑли Ñтраница не раÑпечатываетÑÑ, обратитеÑÑŒ за инÑтрукциÑми уÑтранению неполадок и техничеÑкой поддержкой на веб-узел по адреÑу http://hplip.sourceforge.net.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Device is busy or in an error state.&lt;/b&gt;&lt;p&gt;Please check device and try again.</source>
+<translation>&lt;b&gt;УÑтройÑтво занÑто или возникло ÑоÑтоÑние ошибки.&lt;/b&gt;&lt;p&gt;Проверьте уÑтройÑтво и повторите попытку.</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollToolView</name>
+ <message>
+ <source>&lt;b&gt;Device Settings&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Параметры уÑтройÑтва&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Your device has special device settings. You may alter these settings here.</source>
+ <translation>Ð”Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ уÑтройÑтва предуÑмотрены Ñпециальные параметры. ЗдеÑÑŒ Ñти параметры можно изменить.</translation>
+ </message>
+ <message>
+ <source>Device Settings...</source>
+ <translation>Параметры уÑтройÑтва...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Fax Setup&lt;/b&gt;</source>
+ <translation>&lt;b&gt;ÐаÑтройка факÑа&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Fax support must be setup before you can send faxes.</source>
+ <translation>Ð”Ð»Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð¸ факÑов необходимо наÑтроить поддержку факÑимильной ÑвÑзи.</translation>
+ </message>
+ <message>
+ <source>Setup Fax...</source>
+ <translation>ÐаÑтройка факÑа...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Fax Address Book&lt;/b&gt;</source>
+ <translation>&lt;b&gt;ÐдреÑÐ½Ð°Ñ ÐºÐ½Ð¸Ð³Ð° факÑа&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Setup fax phone numbers to use when sending faxes from the PC.</source>
+ <translation>Ð”Ð»Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð¸ факÑов Ñ ÐŸÐš необходимо задать номера телефонов Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð¸ факÑов.</translation>
+ </message>
+ <message>
+ <source>Fax Address Book...</source>
+ <translation>ÐдреÑÐ½Ð°Ñ ÐºÐ½Ð¸Ð³Ð° факÑа...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Print Test Page&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Печать теÑтовой Ñтраницы&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Print a test page to test the setup of your printer.</source>
+ <translation>Печать теÑтовой Ñтраницы Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸ наÑтройки принтера.</translation>
+ </message>
+ <message>
+ <source>Print Test Page &gt;&gt;</source>
+ <translation>Печать теÑтовой Ñтраницы &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;View Printer (Queue) Information&lt;/b&gt;</source>
+ <translation>&lt;b&gt;ПроÑмотр информации о принтере (очереди)&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>View the printers (queues) installed in CUPS.</source>
+ <translation>ПроÑмотр принтеров (очередей), уÑтановленных в CUPS.</translation>
+ </message>
+ <message>
+ <source>View Printer Information &gt;&gt;</source>
+ <translation>ПроÑмотр информации о принтере &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;View Device Information&lt;/b&gt;</source>
+ <translation>&lt;b&gt;ПроÑмотр информации об уÑтройÑтве&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>This information is primarily useful for debugging and troubleshooting (advanced).</source>
+ <translation>Ð”Ð°Ð½Ð½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾Ñобенно полезна при отладке и поиÑке и уÑтранении неполадок (раÑширенных).</translation>
+ </message>
+ <message>
+ <source>View Device Information &gt;&gt;</source>
+ <translation>ПроÑмотр информации об уÑтройÑтве &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Print Quality Diagnostics&lt;/b&gt;</source>
+ <translation>&lt;b&gt;ДиагноÑтика качеÑтва печати&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Your printer can print a test page to help diagnose print quality problems.</source>
+ <translation>Ð’ данном принтере предуÑмотрена печать теÑтовой Ñтраницы, предназначенной Ð´Ð»Ñ Ð²Ñ‹ÑÐ²Ð»ÐµÐ½Ð¸Ñ Ð½ÐµÐ¿Ð¾Ð»Ð°Ð´Ð¾Ðº, влиÑющих на качеÑтво печати.</translation>
+ </message>
+ <message>
+ <source>Print Diagnostic Page...</source>
+ <translation>Печать теÑтовой Ñтраницы...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Download Firmware&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Загрузка микропрограммного обеÑпечениÑ&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Download firmware to your printer (required on some devices after each power-up).</source>
+ <translation>Загрузка в принтер микропрограммного обеÑÐ¿ÐµÑ‡ÐµÐ½Ð¸Ñ (на некоторых уÑтройÑтвах необходимо выполнÑÑ‚ÑŒ поÑле каждого Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¿Ð¸Ñ‚Ð°Ð½Ð¸Ñ).</translation>
+ </message>
+ <message>
+ <source>Download Firmware...</source>
+ <translation>Загрузка микропрограммного обеÑпечениÑ...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Clean Cartridges&lt;/b&gt;</source>
+ <translation>&lt;b&gt;ЧиÑтка картриджей&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>You only need to perform this action if you are having problems with poor printout quality due to clogged ink nozzles.</source>
+ <translation>Эту операцию необходимо выполнÑÑ‚ÑŒ только при низком качеÑтве раÑпечаток, вызванном заÑоренноÑтью наÑадок Ð´Ð»Ñ Ñ‡ÐµÑ€Ð½Ð¸Ð».</translation>
+ </message>
+ <message>
+ <source>Clean Cartridges...</source>
+ <translation>ЧиÑтка картриджей...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Align Cartridges&lt;/b&gt;</source>
+ <translation>&lt;b&gt;ЮÑтировка картриджей&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>This will improve the quality of output when a new cartridge is installed.</source>
+ <translation>Эта Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð¿Ð¾Ð²Ñ‹ÑˆÐ°ÐµÑ‚ качеÑтво раÑпечаток при уÑтановке нового картриджа.</translation>
+ </message>
+ <message>
+ <source>Align Cartridges...</source>
+ <translation>ЮÑтировка картриджей...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Perform Color Calibration&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Выполнить калибровку цвета&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Use this procedure to optimimize your printer&apos;s color output.</source>
+ <translation>Эта процедура предуÑмотрена Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð¾Ð¿Ñ‚Ð¸Ð¼Ð°Ð»ÑŒÐ½Ñ‹Ñ… цветных раÑпечаток.</translation>
+ </message>
+ <message>
+ <source>Color Calibration...</source>
+ <translation>Калибровка цвета...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Perform Line Feed Calibration&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Выполнить калибровку перевода Ñтроки&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Use line feed calibration to optimize print quality (to remove gaps in the printed output).</source>
+ <translation>Калибровка перевода Ñтроки предназначена Ð´Ð»Ñ Ð´Ð¾ÑÑ‚Ð¸Ð¶ÐµÐ½Ð¸Ñ Ð¾Ð¿Ñ‚Ð¸Ð¼Ð°Ð»ÑŒÐ½Ð¾Ð³Ð¾ качеÑтва печати (Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð² раÑпечатках пуÑÑ‚Ñ‹Ñ… промежутков).</translation>
+ </message>
+ <message>
+ <source>Line Feed Calibration...</source>
+ <translation>Калибровка перевода Ñтроки...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Access Embedded Web Page&lt;/b&gt;</source>
+ <translation>&lt;b&gt;ДоÑтуп к вÑтроенной веб-Ñтранице&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>You can use your printer&apos;s embedded web server to configure, maintain, and monitor the device from a web browser.</source>
+ <translation>Ð’Ñтроенный веб-Ñервер принтера можно иÑпользовать Ð´Ð»Ñ Ð½Ð°Ñтройки, обÑÐ»ÑƒÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð¸ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»Ñ ÑƒÑтройÑтва из веб-браузера.</translation>
+ </message>
+ <message>
+ <source>Open in Browser...</source>
+ <translation>Открыть в браузере...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;View Documentation&lt;/b&gt;</source>
+ <translation>&lt;b&gt;ПроÑмотр документации&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>View documentation installed on your system.</source>
+ <translation>ПроÑмотр документации, уÑтановленной в ÑиÑтеме.</translation>
+ </message>
+ <message>
+ <source>View Documentation...</source>
+ <translation>ПроÑмотр документации...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;An error occured downloading firmware file.&lt;/b&gt;&lt;p&gt;Please check your printer and try again.</source>
+ <translation>&lt;b&gt;При загрузке файла микропрограммного обеÑÐ¿ÐµÑ‡ÐµÐ½Ð¸Ñ Ð²Ð¾Ð·Ð½Ð¸ÐºÐ»Ð° ошибка.&lt;/b&gt;&lt;p&gt;Проверьте принтер и повторите попытку.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Device is busy or in an error state.&lt;/b&gt;&lt;p&gt;Please check device and try again.</source>
+ <translation>&lt;b&gt;УÑтройÑтво занÑто или возникло ÑоÑтоÑние ошибки.&lt;/b&gt;&lt;p&gt;Проверьте уÑтройÑтво и повторите попытку.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Both cartridges are required for alignment.&lt;/b&gt;&lt;p&gt;Please install both cartridges and try again.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Ð”Ð»Ñ Ð²Ñ‹Ñ€Ð°Ð²Ð½Ð¸Ð²Ð°Ð½Ð¸Ñ Ð½ÐµÐ¾Ð±Ñ…Ð¾Ð´Ð¸Ð¼Ñ‹ оба картриджа.&lt;/b&gt;&lt;p&gt;УÑтановите оба картриджа и повторите попытку.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;One or more cartiridges are missing from the printer.&lt;/b&gt;&lt;p&gt;Please install cartridge(s) and try again.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Ð’ принтере отÑутÑтвует один или неÑколько картриджей.&lt;/b&gt;&lt;p&gt;УÑтановите картриджи и повторите попытку.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Both the photo and color cartridges must be inserted into the printer to perform color calibration.&lt;/b&gt;&lt;p&gt;If you are planning on printing with the photo cartridge, please insert it and try again.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Ð”Ð»Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐºÐ°Ð»Ð¸Ð±Ñ€Ð¾Ð²ÐºÐ¸ цвета должны быть уÑтановлены фотокартридж и цветной картридж.&lt;/b&gt;&lt;p&gt;ЕÑли будет выполнÑÑ‚ÑŒÑÑ Ð¿ÐµÑ‡Ð°Ñ‚ÑŒ Ñ Ð¸Ñпользованием фотокартриджа, вÑтавьте его и повторите попытку.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Both the photo (regular photo or photo blue) and color cartridges must be inserted into the printer to perform color calibration.&lt;/b&gt;&lt;p&gt;If you are planning on printing with the photo or photo blue cartridge, please insert it and try again.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Ð”Ð»Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐºÐ°Ð»Ð¸Ð±Ñ€Ð¾Ð²ÐºÐ¸ цвета в принтер должны быть уÑтановлены оба фотокартриджа (обычный фотокартридж и голубой фотокартридж) и цветной картридж.&lt;/b&gt;&lt;p&gt;ЕÑли будет выполнÑÑ‚ÑŒÑÑ Ð¿ÐµÑ‡Ð°Ñ‚ÑŒ Ñ Ð¸Ñпользованием фотокартриджа или голубого фотокартриджа, вÑтавьте его и повторите попытку.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Cannot align with only the photo cartridge installed.&lt;/b&gt;&lt;p&gt;Please install other cartridges and try again.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Ðевозможно выполнить ÑŽÑтировку, еÑли уÑтановлен только один фотокартридж.&lt;/b&gt;&lt;p&gt;УÑтановите оÑтальные картриджи и повторите попытку.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Operation failed. Device busy.&lt;/b&gt;</source>
+ <translation>&lt;p&gt;&lt;b&gt;ÐžÐ¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð·Ð°ÐºÐ¾Ð½Ñ‡Ð¸Ð»Ð°ÑÑŒ Ñбоем. УÑтройÑтво занÑто.&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Unable to run command. No command specified.&lt;/b&gt;&lt;p&gt;Use &lt;pre&gt;Configure...&lt;/pre&gt; to specify a command to run.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Ðевозможно выполнить команду. Команда не указана.&lt;/b&gt;&lt;p&gt;Ð”Ð»Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½Ñемой команды воÑпользуйтеÑÑŒ пунктом меню &lt;pre&gt;ÐаÑтройка...&lt;/pre&gt;.</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollUnloadView</name>
+ <message>
+ <source>ERROR: Photo Card Failed to Mount Properly. Please check device and card and try again.</source>
+ <translation>ОШИБКÐ: Карта памÑти Ð´Ð»Ñ Ñ„Ð¾Ñ‚Ð¾Ð³Ñ€Ð°Ñ„Ð¸Ð¹ уÑтановлена неправильно. Проверьте уÑтройÑтво и карту и повторите попытку.</translation>
+ </message>
+ <message>
+ <source>Select File(s) to Unload from Photo Card</source>
+ <translation>Выберите файл(Ñ‹) Ð´Ð»Ñ Ð²Ñ‹Ð³Ñ€ÑƒÐ·ÐºÐ¸ Ñ ÐºÐ°Ñ€Ñ‚Ñ‹ памÑти Ð´Ð»Ñ Ñ„Ð¾Ñ‚Ð¾Ð³Ñ€Ð°Ñ„Ð¸Ð¹</translation>
+ </message>
+ <message>
+ <source>Unload Folder</source>
+ <translation>Выгрузить папку</translation>
+ </message>
+ <message>
+ <source>Unload Options</source>
+ <translation>Функции выгрузки</translation>
+ </message>
+ <message>
+ <source>&lt;&lt; Functions</source>
+ <translation>&lt;&lt; Функции</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Закрыть</translation>
+ </message>
+ <message>
+ <source>Unload File(s)</source>
+ <translation>Выгрузить файл(ы)</translation>
+ </message>
+ <message>
+ <source>Select All</source>
+ <translation>Выбрать вÑе</translation>
+ </message>
+ <message>
+ <source>Select None</source>
+ <translation>Ðе выбирать</translation>
+ </message>
+ <message>
+ <source>Show Thumbnails</source>
+ <translation>Показать ÑÑкизы</translation>
+ </message>
+ <message>
+ <source>No files selected</source>
+ <translation>Ðет выбранных файлов</translation>
+ </message>
+ <message>
+ <source>1 file selected, %1</source>
+ <translation>Выбран 1 файл, %1</translation>
+ </message>
+ <message>
+ <source>%1 files selected, %2</source>
+ <translation>%1 файлов выбрано, %2</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;No thumbnail found in image.&lt;/b&gt;</source>
+ <translation>&lt;p&gt;&lt;b&gt;Ðе найден ÑÑкиз изображениÑ.&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Loading...</source>
+ <translation>Загрузка...</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Отмена</translation>
+ </message>
+ <message>
+ <source>HP Device Manager</source>
+ <translation>ДиÑпетчер уÑтройÑтв HP</translation>
+ </message>
+ <message>
+ <source>Browse...</source>
+ <translation>Обзор...</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;The unload directory path you entered is not valid.&lt;/b&gt;&lt;p&gt;The directory must exist and you must have write permissions.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Задан недейÑтвительный путь к папке.&lt;/b&gt;&lt;p&gt;Ðеобходимо задать ÑущеÑтвующую и обладать Ð´Ð»Ñ Ð½ÐµÐµ правами на запиÑÑŒ.</translation>
+ </message>
+ <message>
+ <source>File removal:</source>
+ <translation>Удаление файла:</translation>
+ </message>
+ <message>
+ <source>Leave unloaded files on photo card</source>
+ <translation>ОÑтавить невыгруженные файлы на карте памÑти Ð´Ð»Ñ Ñ„Ð¾Ñ‚Ð¾Ð³Ñ€Ð°Ñ„Ð¸Ð¹</translation>
+ </message>
+ <message>
+ <source>Remove all unloaded files from photo card</source>
+ <translation>Удалить невыгруженные файлы Ñ ÐºÐ°Ñ€Ñ‚Ñ‹ памÑти Ð´Ð»Ñ Ñ„Ð¾Ñ‚Ð¾Ð³Ñ€Ð°Ñ„Ð¸Ð¹</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;The unload directory path is not valid.&lt;/b&gt;&lt;p&gt;Please enter a new path and try again.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Задан недейÑтвительный путь к папке.&lt;/b&gt;&lt;p&gt;Введите путь заново и повторите попытку.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;No files are selected to unload.&lt;/b&gt;&lt;p&gt;Please select one or more files to unload and try again.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Выгружаемые файлы не заданы.&lt;/b&gt;&lt;p&gt;Выберите один или более файлов и повторите попытку.</translation>
+ </message>
+ <message>
+ <source>Unloading card...</source>
+ <translation>Карта выгружаетÑÑ...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Unload cancelled at user request.&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Выгрузка отменена по запроÑу пользователÑ.&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>ERROR: Photo Card Failed to Mount Properly. Please check device and card and try again.</source>
+<translation>ОШИБКÐ: Карта памÑти Ð´Ð»Ñ Ñ„Ð¾Ñ‚Ð¾Ð³Ñ€Ð°Ñ„Ð¸Ð¹ уÑтановлена неправильно. Проверьте уÑтройÑтво и карту и повторите попытку.</translation>
+ </message>
+ <message>
+ <source>Select File(s) to Unload from Photo Card</source>
+<translation>Выберите файл(Ñ‹) Ð´Ð»Ñ Ð²Ñ‹Ð³Ñ€ÑƒÐ·ÐºÐ¸ Ñ ÐºÐ°Ñ€Ñ‚Ñ‹ памÑти Ð´Ð»Ñ Ñ„Ð¾Ñ‚Ð¾Ð³Ñ€Ð°Ñ„Ð¸Ð¹</translation>
+ </message>
+ <message>
+ <source>Unload Folder</source>
+<translation>Выгрузить папку</translation>
+ </message>
+ <message>
+ <source>Unload Options</source>
+<translation>Функции выгрузки</translation>
+ </message>
+ <message>
+ <source>&lt;&lt; Functions</source>
+<translation>&lt;&lt; Функции</translation>
+ </message>
+ <message>
+ <source>Close</source>
+<translation>Закрыть</translation>
+ </message>
+ <message>
+ <source>Unload File(s)</source>
+<translation>Выгрузить файл(ы)</translation>
+ </message>
+ <message>
+ <source>Select All</source>
+<translation>Выбрать вÑе</translation>
+ </message>
+ <message>
+ <source>Select None</source>
+<translation>Ðе выбирать</translation>
+ </message>
+ <message>
+ <source>Show Thumbnails</source>
+<translation>Показать ÑÑкизы</translation>
+ </message>
+ <message>
+ <source>No files selected</source>
+<translation>Ðет выбранных файлов</translation>
+ </message>
+ <message>
+ <source>1 file selected, %1</source>
+<translation>Выбран 1 файл, %1</translation>
+ </message>
+ <message>
+ <source>%1 files selected, %2</source>
+<translation>%1 файлов выбрано, %2</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;No thumbnail found in image.&lt;/b&gt;</source>
+<translation>&lt;p&gt;&lt;b&gt;Ðе найден ÑÑкиз изображениÑ.&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Loading...</source>
+<translation>Загрузка...</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+<translation>Отмена</translation>
+ </message>
+ <message>
+ <source>HP Device Manager</source>
+<translation>ДиÑпетчер уÑтройÑтв HP</translation>
+ </message>
+ <message>
+ <source>Browse...</source>
+<translation>Обзор...</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;The unload directory path you entered is not valid.&lt;/b&gt;&lt;p&gt;The directory must exist and you must have write permissions.</source>
+<translation>&lt;p&gt;&lt;b&gt;Задан недейÑтвительный путь к папке.&lt;/b&gt;&lt;p&gt;Ðеобходимо задать ÑущеÑтвующую папку и обладать Ð´Ð»Ñ Ð½ÐµÐµ правами на запиÑÑŒ.</translation>
+ </message>
+ <message>
+ <source>File removal:</source>
+<translation>Удаление файла:</translation>
+ </message>
+ <message>
+ <source>Leave unloaded files on photo card</source>
+<translation>ОÑтавить невыгруженные файлы на карте памÑти Ð´Ð»Ñ Ñ„Ð¾Ñ‚Ð¾Ð³Ñ€Ð°Ñ„Ð¸Ð¹</translation>
+ </message>
+ <message>
+ <source>Remove all unloaded files from photo card</source>
+<translation>Удалить невыгруженные файлы Ñ ÐºÐ°Ñ€Ñ‚Ñ‹ памÑти Ð´Ð»Ñ Ñ„Ð¾Ñ‚Ð¾Ð³Ñ€Ð°Ñ„Ð¸Ð¹</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;The unload directory path is not valid.&lt;/b&gt;&lt;p&gt;Please enter a new path and try again.</source>
+<translation>&lt;p&gt;&lt;b&gt;Задан неправильный путь к папке.&lt;/b&gt;&lt;p&gt;Введите путь заново и повторите попытку.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;No files are selected to unload.&lt;/b&gt;&lt;p&gt;Please select one or more files to unload and try again.</source>
+<translation>&lt;p&gt;&lt;b&gt;Выгружаемые файлы не заданы.&lt;/b&gt;&lt;p&gt;Выберите один или более файлов и повторите попытку.</translation>
+ </message>
+ <message>
+ <source>Unloading card...</source>
+<translation>Карта выгружаетÑÑ...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Unload cancelled at user request.&lt;/b&gt;</source>
+<translation>&lt;b&gt;Выгрузка отменена по запроÑу пользователÑ.&lt;/b&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollView</name>
+ <message>
+ <source>ERROR: No device found or unsupported device.</source>
+ <translation>ОШИБКÐ: УÑтройÑтво не обнаружено или не поддерживаетÑÑ.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;%1 (read only)&lt;/b&gt;</source>
+ <translation>&lt;b&gt;%1 (только чтение)&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Printer/Fax</source>
+ <translation>Принтер/факÑ</translation>
+ </message>
+ <message>
+ <source>Printer/Fax Name:</source>
+ <translation>Ð˜Ð¼Ñ Ð¿Ñ€Ð¸Ð½Ñ‚ÐµÑ€Ð°/факÑа:</translation>
+ </message>
+ <message>
+ <source>Printer</source>
+ <translation>Принтер</translation>
+ </message>
+ <message>
+ <source>Printer Name:</source>
+ <translation>Ð˜Ð¼Ñ Ð¿Ñ€Ð¸Ð½Ñ‚ÐµÑ€Ð°:</translation>
+ </message>
+ <message>
+ <source>Fax</source>
+ <translation>ФакÑ</translation>
+ </message>
+ <message>
+ <source>Fax Name:</source>
+ <translation>Ð˜Ð¼Ñ Ñ„Ð°ÐºÑа:</translation>
+ </message>
+ <message>
+ <source>Load Paper</source>
+ <translation>Загрузка бумаги</translation>
+ </message>
+ <message>
+ <source>A page will be printed. Please load &lt;b&gt;plain paper&lt;/b&gt; into the printer.</source>
+ <translation>При Ñтом раÑпечатываетÑÑ Ñтраница. Загрузите в принтер &lt;b&gt;обычную бумагу&lt;/b&gt;.</translation>
+ </message>
+</context>
+<context>
+ <name>SettingsDialog</name>
+ <message>
+ <source>&lt;b&gt;One or more email addresses are missing.&lt;/b&gt;&lt;p&gt;Please enter this information and try again.</source>
+ <translation>&lt;b&gt;Ð’ принтере отÑутÑтвует один или неÑколько адреÑов Ñлектронной почты.&lt;/b&gt;&lt;p&gt;Введите требуемую информацию и повторите попытку.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Please check your email for a test message.&lt;/b&gt;&lt;p&gt;If the message doesn&apos;t arrive, please check your settings and try again.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Проверьте работу программы Ñлектронной почты на теÑтовом Ñообщении.&lt;/b&gt;&lt;p&gt;ЕÑли Ñообщение не доÑтавлÑетÑÑ, проверьте наÑтройки и повторите попытку.</translation>
+ </message>
+</context>
+<context>
+ <name>SettingsDialog_base</name>
+ <message>
+ <source>HP Device Manager - Settings</source>
+ <translation>ДиÑпетчер уÑтройÑтв HP — Параметры</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Отмена</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Configure if and when device(s) are automatically refreshed&lt;/b&gt;</source>
+ <translation>&lt;b&gt;ÐаÑтройка автоматичеÑкого Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ ÑƒÑтройÑтв и интервала обновлениÑ&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Enable device auto refresh</source>
+ <translation>Включить автоматичеÑкое обновление уÑтройÑтв</translation>
+ </message>
+ <message>
+ <source>Auto Interval</source>
+ <translation>Интервал автоматичеÑкого обновлениÑ</translation>
+ </message>
+ <message>
+ <source>Refresh every:</source>
+ <translation>ОбновлÑÑ‚ÑŒ каждые:</translation>
+ </message>
+ <message>
+ <source>seconds</source>
+ <translation>Ñекунды</translation>
+ </message>
+ <message>
+ <source>Device(s) to Refresh </source>
+ <translation>Обновление уÑтройÑтв</translation>
+ </message>
+ <message>
+ <source>Only currently selected device</source>
+ <translation>Только выбранное в текущий момент уÑтройÑтво</translation>
+ </message>
+ <message>
+ <source>All devices</source>
+ <translation>Ð’Ñе уÑтройÑтва</translation>
+ </message>
+ <message>
+ <source>Auto Refresh</source>
+ <translation>ÐвтоматичеÑкое обновление</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Configure if the HP Device Manager will send email on alerts&lt;/b&gt;</source>
+ <translation>&lt;b&gt;ÐаÑтройка передачи по Ñлектронной почте предупреждений диÑпетчера уÑтройÑтв HP&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Send email when device errors occur:</source>
+ <translation>Передавать Ñообщение Ñлектронной почты в Ñлучае Ð²Ð¾Ð·Ð½Ð¸ÐºÐ½Ð¾Ð²ÐµÐ½Ð¸Ñ Ð¾ÑˆÐ¸Ð±Ð¾Ðº уÑтройÑтв:</translation>
+ </message>
+ <message>
+ <source>Test</source>
+ <translation>Проверка</translation>
+ </message>
+ <message>
+ <source>To: Address(es)</source>
+ <translation>Кому: ÐдреÑа</translation>
+ </message>
+ <message>
+ <source>Email address(es):</source>
+ <translation>ÐдреÑа Ñлектронной почты:</translation>
+ </message>
+ <message>
+ <source>&lt;i&gt;Note: Separate multiple email address with a commas.&lt;/i&gt;</source>
+ <translation>&lt;i&gt;Примечание. ÐдреÑа Ñлектронной почты должны быть разделены запÑтыми.&lt;/i&gt;</translation>
+ </message>
+ <message>
+ <source>From: Address</source>
+ <translation>От: ÐдреÑ</translation>
+ </message>
+ <message>
+ <source>Sender email address:</source>
+ <translation>ÐÐ´Ñ€ÐµÑ Ñлектронной почты отправителÑ:</translation>
+ </message>
+ <message>
+ <source>&lt;i&gt;Note: This should generally be your email address.&lt;/i&gt;</source>
+ <translation>&lt;i&gt;Примечание. Как правило, Ñто Ð°Ð´Ñ€ÐµÑ Ñлектронной почты пользователÑ.&lt;/i&gt;</translation>
+ </message>
+ <message>
+ <source>Email Alerts</source>
+ <translation>ÐŸÑ€ÐµÐ´ÑƒÐ¿Ñ€ÐµÐ¶Ð´ÐµÐ½Ð¸Ñ Ð¿Ð¾ Ñлектронной почте</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Configure what commands to run for device functions&lt;/b&gt;</source>
+ <translation>&lt;b&gt;ÐаÑтройка команд, запуÑкаемых Ð´Ð»Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¹ уÑтройÑтва&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Access Photo Cards</source>
+ <translation>ДоÑтуп к картам памÑти Ð´Ð»Ñ Ñ„Ð¾Ñ‚Ð¾Ð³Ñ€Ð°Ñ„Ð¸Ð¹</translation>
+ </message>
+ <message>
+ <source>Built-in access photo cards function</source>
+ <translation>Ð’ÑÑ‚Ñ€Ð¾ÐµÐ½Ð½Ð°Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð´Ð¾Ñтупа к картам памÑти Ð´Ð»Ñ Ñ„Ð¾Ñ‚Ð¾Ð³Ñ€Ð°Ñ„Ð¸Ð¹</translation>
+ </message>
+ <message>
+ <source>External command:</source>
+ <translation>ВнешнÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°:</translation>
+ </message>
+ <message>
+ <source>Send PC Fax</source>
+ <translation>Передача факÑа Ñ ÐŸÐš</translation>
+ </message>
+ <message>
+ <source>Built-in send PC fax function</source>
+ <translation>Ð’ÑÑ‚Ñ€Ð¾ÐµÐ½Ð½Ð°Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð¸ факÑа Ñ ÐŸÐš</translation>
+ </message>
+ <message>
+ <source>Scan</source>
+ <translation>Сканирование</translation>
+ </message>
+ <message>
+ <source>Built-in scan function</source>
+ <translation>Ð’ÑÑ‚Ñ€Ð¾ÐµÐ½Ð½Ð°Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ ÑканированиÑ</translation>
+ </message>
+ <message>
+ <source>External scan command:</source>
+ <translation>ВнешнÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° ÑканированиÑ:</translation>
+ </message>
+ <message>
+ <source>Print</source>
+ <translation>Печать</translation>
+ </message>
+ <message>
+ <source>Built-in print function</source>
+ <translation>Ð’ÑÑ‚Ñ€Ð¾ÐµÐ½Ð½Ð°Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð¿ÐµÑ‡Ð°Ñ‚Ð¸</translation>
+ </message>
+ <message>
+ <source>Set Defaults</source>
+ <translation>Задание значений по умолчанию</translation>
+ </message>
+ <message>
+ <source>Make Copies</source>
+ <translation>Создание копий</translation>
+ </message>
+ <message>
+ <source>Built-in make copies function</source>
+ <translation>Ð’ÑÑ‚Ñ€Ð¾ÐµÐ½Ð½Ð°Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÐºÐ¾Ð¿Ð¸Ð¹</translation>
+ </message>
+ <message>
+ <source>Functions (Advanced)</source>
+ <translation>Функции (РаÑширенные)</translation>
+ </message>
+</context>
+<context>
+ <name>SetupForm</name>
+ <message>
+ <source>Current: Filter: &quot;%2&quot; Search: &quot;%3&quot; TTL: %4 Timeout: %5s</source>
+ <translation>Текущее: Фильтр: &quot;%2&quot; ПоиÑк: &quot;%3&quot; TTL: %4 Ð’Ñ€ÐµÐ¼Ñ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ: %5 Ñек</translation>
+ </message>
+ <message>
+ <source>The printer name and fax name must be different. Please choose different names.</source>
+<translation>Ð˜Ð¼Ñ Ð¿Ñ€Ð¸Ð½Ñ‚ÐµÑ€Ð° и Ð¸Ð¼Ñ Ñ„Ð°ÐºÑа должны быть различны. Выберите другое имÑ.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Device not found.&lt;/b&gt; &lt;p&gt;Please make sure your printer is properly connected and powered-on.</source>
+ <translation>&lt;b&gt;УÑтройÑтво не найдено.&lt;/b&gt; &lt;p&gt;УбедитеÑÑŒ в том, что принтер правильно подÑоединен и на него подаетÑÑ Ð¿Ð¸Ñ‚Ð°Ð½Ð¸Ðµ.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;No devices found.&lt;/b&gt;&lt;p&gt;Please make sure your printer is properly connected and powered-on.</source>
+ <translation>&lt;b&gt;УÑтройÑтва не обнаружены.&lt;/b&gt;&lt;p&gt;УбедитеÑÑŒ в том, что принтер правильно подÑоединен и на него подаетÑÑ Ð¿Ð¸Ñ‚Ð°Ð½Ð¸Ðµ.</translation>
+ </message>
+ <message>
+ <source>Current Settings: Filter: &quot;%2&quot; Search: &quot;%3&quot; TTL: %4 Timeout: %5s</source>
+ <translation>Текущие параметры: Фильтр: &quot;%2&quot; ПоиÑк: &quot;%3&quot; TTL: %4 Ð’Ñ€ÐµÐ¼Ñ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ: %5 Ñек</translation>
+ </message>
+ <message>
+ <source>network</source>
+ <translation>Ñеть</translation>
+ </message>
+ <message>
+ <source>USB bus</source>
+ <translation>шина USB</translation>
+ </message>
+ <message>
+ <source>parallel port</source>
+ <translation>параллельный порт</translation>
+ </message>
+ <message>
+ <source>Model</source>
+ <translation>Модель</translation>
+ </message>
+ <message>
+ <source>Serial No.</source>
+ <translation>Серийный номер</translation>
+ </message>
+ <message>
+ <source>IP Address</source>
+ <translation>ÐÐ´Ñ€ÐµÑ IP:</translation>
+ </message>
+ <message>
+ <source>Host Name</source>
+ <translation>Ð˜Ð¼Ñ ÑƒÐ·Ð»Ð°</translation>
+ </message>
+ <message>
+ <source>Device</source>
+ <translation>УÑтройÑтво</translation>
+ </message>
+ <message>
+ <source>Device URI</source>
+ <translation>URI уÑтройÑтва</translation>
+ </message>
+ <message>
+ <source>%1 device(s) found on the %1:</source>
+ <translation>%1 уÑтройÑтв обнаружено на %1:</translation>
+ </message>
+ <message>
+ <source>%1 device(s) found on the %1 at address %2:</source>
+ <translation>%1 уÑтройÑтв обнаружено на %1 по адреÑу %2:</translation>
+ </message>
+ <message>
+ <source>%1 device(s) found on the %1 at ID %2:</source>
+ <translation>%1 уÑтройÑтв обнаружено на %1 Ñ ID %2:</translation>
+ </message>
+ <message>
+ <source>%1 device(s) found on the %1 device node ID %2:</source>
+ <translation>%1 уÑтройÑтв обнаружено на узел уÑтройÑтв %1 Ñ ID %2:</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Device not found or invalid HPLIP device.&lt;/b&gt;&lt;p&gt;If you specified a USB ID, IP address, or other parameter, please re-check it and try again.</source>
+ <translation>&lt;b&gt;УÑтройÑтво не обнаружено или недопуÑтимое уÑтройÑтво HPLIP.&lt;/b&gt;&lt;p&gt;ЕÑли указывалÑÑ USB ID, Ð°Ð´Ñ€ÐµÑ IP или другой параметр, проверьте его значение и повторите попытку.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;PPD not file found.&lt;/b&gt;&lt;p&gt;An appropriate PPD file could not be found. Please check your HPLIP install, use &lt;i&gt;Select Other...&lt;/i&gt;, or download one from linuxprinting.org.</source>
+ <translation>&lt;b&gt;Ðе найден файл PPD.&lt;/b&gt;&lt;p&gt;Ðе удаетÑÑ Ð¾Ð±Ð½Ð°Ñ€ÑƒÐ¶Ð¸Ñ‚ÑŒ требуемый файл PPD. Проверьте уÑтановку HPLIP, воÑпользуйтеÑÑŒ режимом &lt;i&gt;Выбрать другой...&lt;/i&gt; или загрузите файл Ñ Ð²ÐµÐ±-узла linuxprinting.org.</translation>
+ </message>
+ <message>
+ <source>You must enter a name for the printer.</source>
+ <translation>Ðеобходимо ввеÑти Ð¸Ð¼Ñ Ð¿Ñ€Ð¸Ð½Ñ‚ÐµÑ€Ð°.</translation>
+ </message>
+ <message>
+ <source>A printer already exists with this name. Please choose a different name.</source>
+ <translation>Принтер Ñ Ñ‚Ð°ÐºÐ¸Ð¼ именем уже ÑущеÑтвует. Выберите другое имÑ.</translation>
+ </message>
+ <message>
+ <source>You must enter a fax name.</source>
+ <translation>Ðеобходимо ввеÑти Ð¸Ð¼Ñ Ñ„Ð°ÐºÑа.</translation>
+ </message>
+ <message>
+ <source>A fax already exists with this name. Please choose a different name.</source>
+ <translation>Ð¤Ð°ÐºÑ Ñ Ñ‚Ð°ÐºÐ¸Ð¼ именем уже ÑущеÑтвует. Выберите другое имÑ.</translation>
+ </message>
+ <message>
+ <source>Unable to communicate with the device. Please check the device and try again.</source>
+ <translation>Ðе удаетÑÑ ÑƒÑтановить ÑвÑзь Ñ ÑƒÑтройÑтвом. Проверьте уÑтройÑтво и повторите попытку.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Device I/O Error&lt;/b&gt;&lt;p&gt;Could not communicate with device. Device may be busy.</source>
+ <translation>&lt;b&gt;Ошибка ввода/вывода&lt;/b&gt;&lt;p&gt;Ðе удаетÑÑ ÑƒÑтановить ÑвÑзь Ñ ÑƒÑтройÑтвом. Возможно, уÑтройÑтво занÑто.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Printer queue setup failed.&lt;/b&gt;&lt;p&gt;Please restart CUPS and try again.</source>
+ <translation>&lt;b&gt;ÐаÑтройка очереди принтера закончилаÑÑŒ Ñбоем.&lt;/b&gt;&lt;p&gt;ПерезапуÑтите CUPS и повторите попытку.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Unable to find HP fax PPD file.&lt;/b&gt;&lt;p&gt;Please check you HPLIP installation and try again.</source>
+ <translation>&lt;b&gt;Ðе удаетÑÑ Ð½Ð°Ð¹Ñ‚Ð¸ файл PPD факÑа HP.&lt;/b&gt;&lt;p&gt;Проверьте уÑтановку HPLIP и повторите попытку.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Fax queue setup failed.&lt;/b&gt;&lt;p&gt;Please restart CUPS and try again.</source>
+ <translation>&lt;b&gt;ÐаÑтройка очереди факÑа закончилаÑÑŒ Ñбоем.&lt;/b&gt;&lt;p&gt;ПерезапуÑтите CUPS и повторите попытку.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Unable to print to printer.&lt;/b&gt;&lt;p&gt;Please check device and try again.</source>
+ <translation>&lt;b&gt;Ðе удаетÑÑ Ð·Ð°Ð¿ÑƒÑтить печать на принтере.&lt;/b&gt;&lt;p&gt;Проверьте уÑтройÑтво и повторите попытку.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;No CUPS queue found for device.&lt;/b&gt;&lt;p&gt;Please install the printer in CUPS and try again.</source>
+ <translation>&lt;b&gt;Ðе найдена очередь CUPS Ð´Ð»Ñ ÑƒÑтройÑтва.&lt;/b&gt;&lt;p&gt;УÑтановите принтер в CUPS и повторите попытку.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Printer Error.&lt;/b&gt;&lt;p&gt;Printer is busy, offline, or in an error state. Please check the device and try again.</source>
+ <translation>&lt;b&gt;Ошибка принтера.&lt;/b&gt;&lt;p&gt;Принтер занÑÑ‚, находитÑÑ Ð² автономном режиме или на нем возникло ÑоÑтоÑние ошибки. Проверьте уÑтройÑтво и повторите попытку.</translation>
+ </message>
+</context>
+<context>
+ <name>SetupForm_base</name>
+ <message>
+ <source>PPD File</source>
+ <translation>Файл PPD</translation>
+ </message>
+ <message>
+ <source>Description</source>
+ <translation>ОпиÑание</translation>
+ </message>
+ <message>
+ <source>HP Device Manger - Printer Setup Wizard</source>
+ <translation>ДиÑпетчер уÑтройÑтв HP — МаÑтер уÑтановки принтера</translation>
+ </message>
+ <message>
+ <source>Connection (I/O) Type</source>
+ <translation>Тип ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ (ввод/вывод)</translation>
+ </message>
+ <message>
+ <source>Universal Serial Bus (USB)</source>
+ <translation>УниверÑÐ°Ð»ÑŒÐ½Ð°Ñ Ð¿Ð¾ÑÐ»ÐµÐ´Ð¾Ð²Ð°Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ ÑˆÐ¸Ð½Ð° (USB)</translation>
+ </message>
+ <message>
+ <source>Network/Ethernet/Wireless (direct connection or JetDirect)</source>
+ <translation>Сеть/Ethernet/беÑÐ¿Ñ€Ð¾Ð²Ð¾Ð´Ð½Ð°Ñ (прÑмое подключение или JetDirect)</translation>
+ </message>
+ <message>
+ <source>Parallel Port (LPT)</source>
+ <translation>Параллельный порт (LPT)</translation>
+ </message>
+ <message>
+ <source>Advanced...</source>
+ <translation>Дополнительно...</translation>
+ </message>
+ <message>
+ <source>Choose Connection Type</source>
+ <translation>Выбор типа подключениÑ</translation>
+ </message>
+ <message>
+ <source>probeHeadingTextLabel</source>
+ <translation>probeHeadingTextLabel</translation>
+ </message>
+ <message>
+ <source>Find Manually...</source>
+ <translation>Ðайти вручную...</translation>
+ </message>
+ <message>
+ <source>Refresh</source>
+ <translation>Обновить</translation>
+ </message>
+ <message>
+ <source>Select from Discovered Devices</source>
+ <translation>Выбрать из обнаруженных уÑтройÑтв</translation>
+ </message>
+ <message>
+ <source>Select Other...</source>
+ <translation>Выбрать другое...</translation>
+ </message>
+ <message>
+ <source>Defaults</source>
+ <translation>Ð—Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾ умолчанию</translation>
+ </message>
+ <message>
+ <source>Please chose the PPD file (by name and description) that most closely matches your printer. &lt;i&gt;Note: The model name of the printer may vary somehwat from the PPD file name, for example, a Deskjet 5550 may have a PPD file with the model name of Deskjet_5500_series.&lt;/i&gt;</source>
+ <translation>Выберите файл PPD (по имени и опиÑанию), наиболее точно ÑоответÑтвующий принтеру. &lt;i&gt;Примечание. Ð˜Ð¼Ñ Ð¼Ð¾Ð´ÐµÐ»Ð¸ принтера может неÑколько отличатьÑÑ Ð¾Ñ‚ имени файла PPD, например, принтеру Deskjet 5550 может ÑоответÑтвовать файл PPD Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ модели Deskjet_5500_series.&lt;/i&gt;</translation>
+ </message>
+ <message>
+ <source>Select/Confirm PPD File</source>
+ <translation>Выбрать/подтвердить файл PPD</translation>
+ </message>
+ <message>
+ <source>Printer Information</source>
+ <translation>Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ принтере</translation>
+ </message>
+ <message>
+ <source>Default</source>
+ <translation>Значение по умолчанию</translation>
+ </message>
+ <message>
+ <source>Location:</source>
+ <translation>МеÑтонахождение:</translation>
+ </message>
+ <message>
+ <source>Printer Name:</source>
+ <translation>Ð˜Ð¼Ñ Ð¿Ñ€Ð¸Ð½Ñ‚ÐµÑ€Ð°:</translation>
+ </message>
+ <message>
+ <source>Description:</source>
+ <translation>ОпиÑание:</translation>
+ </message>
+ <message>
+ <source>Fax Information</source>
+ <translation>Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾Ð± аппарате факÑимильной ÑвÑзи</translation>
+ </message>
+ <message>
+ <source>Fax Name:</source>
+ <translation>Ð˜Ð¼Ñ Ð°Ð¿Ð¿Ð°Ñ€Ð°Ñ‚Ð° факÑимильной ÑвÑзи:</translation>
+ </message>
+ <message>
+ <source>Name/Company:</source>
+ <translation>ИмÑ/КомпаниÑ:</translation>
+ </message>
+ <message>
+ <source>Fax Number:</source>
+ <translation>Ðомер аппарата факÑимильной ÑвÑзи:</translation>
+ </message>
+ <message>
+ <source>Setup PC send fax</source>
+ <translation>ÐаÑтройка передачи факÑа Ñ ÐŸÐš</translation>
+ </message>
+ <message>
+ <source>Click &quot;Next &gt;&quot; to install the printer on your system.</source>
+ <translation>Ð”Ð»Ñ ÑƒÑтановки принтера в ÑиÑтеме щелкните &quot;Далее &gt;&quot;.</translation>
+ </message>
+ <message>
+ <source>Enter Printer Information</source>
+ <translation>Введите информацию о принтере</translation>
+ </message>
+ <message>
+ <source>Send test page to printer</source>
+ <translation>Передать теÑтовую Ñтраницу на принтер</translation>
+ </message>
+ <message>
+ <source>Fax Summary</source>
+ <translation>Итоговые ÑÐ²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾Ð± аппарате факÑимильной ÑвÑзи</translation>
+ </message>
+ <message>
+ <source>Printer Summary</source>
+ <translation>Итоговые ÑÐ²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾ принтере</translation>
+ </message>
+ <message>
+ <source>PPD File:</source>
+ <translation>Файл PPD:</translation>
+ </message>
+ <message>
+ <source>The printer has been successfully installed on your system.</source>
+ <translation>Принтер уÑпешно уÑтановлен в ÑиÑтеме.</translation>
+ </message>
+ <message>
+ <source>Finished Adding Printer</source>
+ <translation>Добавление принтера завершено</translation>
+ </message>
+</context>
+<context>
+ <name>SetupManualFind</name>
+ <message>
+ <source>Please enter the printer&apos;s network hostname or IP address.</source>
+ <translation>Введите Ð´Ð»Ñ Ð¿Ñ€Ð¸Ð½Ñ‚ÐµÑ€Ð° Ð¸Ð¼Ñ Ñетевого узла или Ð°Ð´Ñ€ÐµÑ IP.</translation>
+ </message>
+ <message>
+ <source>&lt;i&gt;(IPv4 address &quot;a.b.c.d&quot; or &quot;hostname&quot;.)&lt;/i&gt;</source>
+ <translation>&lt;i&gt;(Ð°Ð´Ñ€ÐµÑ IPv4 &quot;a.b.c.d&quot; или &quot;имÑ_узла&quot;.)&lt;/i&gt;</translation>
+ </message>
+ <message>
+ <source>Hostname or IP Address:</source>
+ <translation>Ð˜Ð¼Ñ ÑƒÐ·Ð»Ð° или Ð°Ð´Ñ€ÐµÑ IP:</translation>
+ </message>
+ <message>
+ <source>Please enter the USB ID for the printer.</source>
+ <translation>Введите USB ID Ð´Ð»Ñ Ð¿Ñ€Ð¸Ð½Ñ‚ÐµÑ€Ð°.</translation>
+ </message>
+ <message>
+ <source>&lt;i&gt;(&quot;xxx:yyy&quot; where xxx is the USB bus ID and yyy is the USB device ID. The &apos;:&apos; and all leading zeroes must be present. Use &apos;lsusb&apos; to determine this information.)&lt;/i&gt;</source>
+ <translation>&lt;i&gt;(&quot;xxx:yyy&quot; где xxx — идентификатор шины USB, а yyy — идентификатор уÑтройÑтва USB. Знак &apos;:&apos; и вÑе ведущие нули обÑзательны. Ð”Ð»Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ñтой информации иÑпользуйте &apos;lsusb&apos;.)&lt;/i&gt;</translation>
+ </message>
+ <message>
+ <source>USB ID:</source>
+ <translation>USB ID:</translation>
+ </message>
+ <message>
+ <source>Please enter the filesystem device node for the printer.</source>
+ <translation>Введите Ð´Ð»Ñ Ð¿Ñ€Ð¸Ð½Ñ‚ÐµÑ€Ð° узел уÑтройÑтва файловой ÑиÑтемы.</translation>
+ </message>
+ <message>
+ <source> &lt;i&gt;(&quot;/dev/parportX&quot;, X=0,1,2,...)&lt;/i&gt;</source>
+ <translation>&lt;i&gt;(&quot;/dev/parportX&quot;, X=0,1,2,...)&lt;/i&gt;</translation>
+ </message>
+ <message>
+ <source>Device Node:</source>
+ <translation>Узел уÑтройÑтва:</translation>
+ </message>
+</context>
+<context>
+ <name>SetupManualFind_base</name>
+ <message>
+ <source>HP Device Manager - Manually Find Device</source>
+ <translation>ДиÑпетчер уÑтройÑтв HP — ПоиÑк уÑтройÑтва вручную</translation>
+ </message>
+ <message>
+ <source>TEXT</source>
+ <translation>ТЕКСТ</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Отмена</translation>
+ </message>
+ <message>
+ <source>Find</source>
+ <translation>ПоиÑк</translation>
+ </message>
+ <message>
+ <source>textLabel1</source>
+ <translation>textLabel1</translation>
+ </message>
+ <message>
+ <source>IP/HN/SER/USB/DEV:</source>
+ <translation>IP/HN/SER/USB/DEV:</translation>
+ </message>
+</context>
+<context>
+ <name>SetupSettings_base</name>
+ <message>
+ <source>HP Device Manager - Setup Filters, Search and Settings</source>
+ <translation>ДиÑпетчер уÑтройÑтв HP — ÐаÑтройка фильтров, поиÑк и параметры</translation>
+ </message>
+ <message>
+ <source>Discovery Filter</source>
+ <translation>Фильтр обнаружениÑ</translation>
+ </message>
+ <message>
+ <source>Discover all devices</source>
+ <translation>Обнаружить вÑе уÑтройÑтва</translation>
+ </message>
+ <message>
+ <source>Only discover devices that support the following functionality:</source>
+ <translation>Обнаружить только уÑтройÑтва, поддерживающие Ñледующий набор функций:</translation>
+ </message>
+ <message>
+ <source>PC Initiated Copying</source>
+ <translation>Копирование, запуÑкаемое Ñ ÐŸÐš</translation>
+ </message>
+ <message>
+ <source>PC Photocard Access</source>
+ <translation>ДоÑтуп Ñ ÐŸÐš к картам памÑти Ð´Ð»Ñ Ñ„Ð¾Ñ‚Ð¾Ð³Ñ€Ð°Ñ„Ð¸Ð¹</translation>
+ </message>
+ <message>
+ <source>Scan to PC</source>
+ <translation>Сканирование Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡ÐµÐ¹ на ПК</translation>
+ </message>
+ <message>
+ <source>PC Send Fax</source>
+ <translation>Передача факÑа Ñ ÐŸÐš</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Отмена</translation>
+ </message>
+ <message>
+ <source>Defaults</source>
+ <translation>Ð—Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾ умолчанию</translation>
+ </message>
+ <message>
+ <source>Discovery Search</source>
+ <translation>ПоиÑк Ð´Ð»Ñ Ð¾Ð±Ð½Ð°Ñ€ÑƒÐ¶ÐµÐ½Ð¸Ñ:</translation>
+ </message>
+ <message>
+ <source>Search Term:</source>
+ <translation>Строка Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка:</translation>
+ </message>
+ <message>
+ <source>Network Discovery Settings</source>
+ <translation>Параметры Ð´Ð»Ñ Ð¾Ð±Ð½Ð°Ñ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Ñети</translation>
+ </message>
+ <message>
+ <source>TTL:</source>
+ <translation>TTL:</translation>
+ </message>
+ <message>
+ <source>Timeout (secs):</source>
+ <translation>Ð’Ñ€ÐµÐ¼Ñ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ (Ñек):</translation>
+ </message>
+</context>
+<context>
+ <name>StringTable</name>
+ <message>
+ <source>Unknown</source>
+<translation>ÐеизвеÑтно</translation>
+ </message>
+ <message>
+ <source>Please correct the problem and try again.</source>
+<translation>УÑтраните неиÑправноÑÑ‚ÑŒ и повторите попытку.</translation>
+ </message>
+ <message>
+ <source>Please correct the problem and press continue on the printer.</source>
+<translation>УÑтраните неиÑправноÑÑ‚ÑŒ и нажмите на принтере кнопку ‘Продолжить’.</translation>
+ </message>
+ <message>
+ <source>The printer has started a print job.</source>
+<translation>Принтер начал выполнение Ð·Ð°Ð´Ð°Ð½Ð¸Ñ Ð½Ð° печать.</translation>
+ </message>
+ <message>
+ <source>Print job has completed.</source>
+<translation>Печать Ð·Ð°Ð´Ð°Ð½Ð¸Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð°.</translation>
+ </message>
+ <message>
+ <source>Started rendering a fax job.</source>
+<translation>Запущена передача факÑа.</translation>
+ </message>
+ <message>
+ <source>Rendering job completed.</source>
+<translation>Передача завершена.</translation>
+ </message>
+ <message>
+ <source>The printer is idle.</source>
+<translation>Принтер бездейÑтвует.</translation>
+ </message>
+ <message>
+ <source>The printer is busy.</source>
+<translation>Принтер занÑÑ‚.</translation>
+ </message>
+ <message>
+ <source>The print job is continuing.</source>
+<translation>Печать Ð·Ð°Ð´Ð°Ð½Ð¸Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð»Ð¶Ð°ÐµÑ‚ÑÑ.</translation>
+ </message>
+ <message>
+ <source>Turning off.</source>
+<translation>Выключение.</translation>
+ </message>
+ <message>
+ <source>Report printing.</source>
+<translation>Печать отчета.</translation>
+ </message>
+ <message>
+ <source>Canceling.</source>
+<translation>Отмена.</translation>
+ </message>
+ <message>
+ <source>Waiting for ink to dry.</source>
+<translation>Ожидание выÑÑ‹Ñ…Ð°Ð½Ð¸Ñ Ñ‡ÐµÑ€Ð½Ð¸Ð».</translation>
+ </message>
+ <message>
+ <source>Pen change.</source>
+<translation>Замена пера.</translation>
+ </message>
+ <message>
+ <source>The printer is out of paper.</source>
+<translation>Ð’ принтере закончилаÑÑŒ бумага.</translation>
+ </message>
+ <message>
+ <source>Please load more paper and follow the instructions on the front panel (if any) to continue printing.</source>
+<translation>Загрузите бумагу и Ñледуйте инÑтрукциÑм на передней панели (при их наличии) Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð»Ð¶ÐµÐ½Ð¸Ñ Ð¿ÐµÑ‡Ð°Ñ‚Ð¸.</translation>
+ </message>
+ <message>
+ <source>Banner eject needed.</source>
+<translation>Ðеобходимо извлечь транÑпарант.</translation>
+ </message>
+ <message>
+ <source>Banner mismatch.</source>
+<translation>ТранÑпарант - неÑоответÑтвие.</translation>
+ </message>
+ <message>
+ <source>Photo mismatch.</source>
+<translation>Фото - неÑоответÑтвие.</translation>
+ </message>
+ <message>
+ <source>Duplex mismatch.</source>
+<translation>ДвуÑторонний режим - неÑоответÑтвие.</translation>
+ </message>
+ <message>
+ <source>Paper or cartridge carriage jammed.</source>
+<translation>ЗаÑтревание бумаги или каретки картриджа.</translation>
+ </message>
+ <message>
+ <source>Please clear the jam and press continue on the printer.</source>
+<translation>УÑтраните заÑтревание и нажмите на принтере кнопку ‘Продолжить’.</translation>
+ </message>
+ <message>
+ <source>There is a problem with a cartridge.</source>
+<translation>ÐеиÑправноÑÑ‚ÑŒ картриджа.</translation>
+ </message>
+ <message>
+ <source>Powering down.</source>
+<translation>Отключение питаниÑ.</translation>
+ </message>
+ <message>
+ <source>Front panel test.</source>
+<translation>Проверьте переднюю панель.</translation>
+ </message>
+ <message>
+ <source>Clean out tray missing.</source>
+<translation>УÑтановите отÑутÑтвующий лоток.</translation>
+ </message>
+ <message>
+ <source>Output bin full.</source>
+<translation>Выходной лоток заполнен.</translation>
+ </message>
+ <message>
+ <source>Media size mismatch.</source>
+<translation>ÐеÑоответÑтвие формата материала Ð´Ð»Ñ Ð¿ÐµÑ‡Ð°Ñ‚Ð¸.</translation>
+ </message>
+ <message>
+ <source>Duplexer is jammed.</source>
+<translation>УÑтройÑтво двуÑторонней печати заÑÑ‚Ñ€Ñло.</translation>
+ </message>
+ <message>
+ <source>An ink cartridge is out of ink.</source>
+<translation>Ð’ картридже закончилиÑÑŒ чернила.</translation>
+ </message>
+ <message>
+ <source>Internal device error.</source>
+<translation>ВнутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ° уÑтройÑтва.</translation>
+ </message>
+ <message>
+ <source>Second tray missing.</source>
+<translation>ОтÑутÑтвует второй лоток.</translation>
+ </message>
+ <message>
+ <source>Duplexer missing.</source>
+<translation>ОтÑутÑтвует уÑтройÑтво двуÑторонней печати.</translation>
+ </message>
+ <message>
+ <source>Rear tray missing.</source>
+<translation>ОтÑутÑтвует задний лоток.</translation>
+ </message>
+ <message>
+ <source>Cartridge not latched.</source>
+<translation>Картридж не зафикÑирован.</translation>
+ </message>
+ <message>
+ <source>Battery very low.</source>
+<translation>Ðизкий уровень зарÑда батареи.</translation>
+ </message>
+ <message>
+ <source>Output tray closed.</source>
+<translation>Выходной лоток закрыт.</translation>
+ </message>
+ <message>
+ <source>Manual feed blocked.</source>
+<translation>Ð ÑƒÑ‡Ð½Ð°Ñ Ð¿Ð¾Ð´Ð°Ñ‡Ð° заблокирована.</translation>
+ </message>
+ <message>
+ <source>Rear feed blocked.</source>
+<translation>Подача Ñзади заблокирована.</translation>
+ </message>
+ <message>
+ <source>Second tray out of paper.</source>
+<translation>Во втором лотке закончилаÑÑŒ бумага.</translation>
+ </message>
+ <message>
+ <source>Input tray locked.</source>
+<translation>Входной лоток заблокирован.</translation>
+ </message>
+ <message>
+ <source>Non-HP ink.</source>
+<translation>Чернила не HP.</translation>
+ </message>
+ <message>
+ <source>Pen calibration needs resume.</source>
+<translation>ТребуетÑÑ ÐºÐ°Ð»Ð¸Ð±Ñ€Ð¾Ð²ÐºÐ° пера.</translation>
+ </message>
+ <message>
+ <source>Media type mismatch.</source>
+<translation>ÐеподходÑщий тип материала Ð´Ð»Ñ Ð¿ÐµÑ‡Ð°Ñ‚Ð¸.</translation>
+ </message>
+ <message>
+ <source>Custom media mismatch.</source>
+<translation>Выбран неподходÑщий материал Ð´Ð»Ñ Ð¿ÐµÑ‡Ð°Ñ‚Ð¸.</translation>
+ </message>
+ <message>
+ <source>Pen cleaning in progress.</source>
+<translation>ПроизводитÑÑ Ñ‡Ð¸Ñтка пера.</translation>
+ </message>
+ <message>
+ <source>Pen checking in progress.</source>
+<translation>ПроизводитÑÑ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ° пера.</translation>
+ </message>
+ <message>
+ <source>Black cartridge is low on ink</source>
+<translation>Ð’ черном картридже заканчиваютÑÑ Ñ‡ÐµÑ€Ð½Ð¸Ð»Ð°</translation>
+ </message>
+ <message>
+ <source>Tri-color cartridge is low on ink</source>
+<translation>Ð’ трехцветном картридже заканчиваютÑÑ Ñ‡ÐµÑ€Ð½Ð¸Ð»Ð°</translation>
+ </message>
+ <message>
+ <source>Photo cartridge is low on ink</source>
+<translation>Ð’ фотокартридже заканчиваютÑÑ Ñ‡ÐµÑ€Ð½Ð¸Ð»Ð°</translation>
+ </message>
+ <message>
+ <source>Cyan cartridge is low on ink</source>
+<translation>Ð’ голубом картридже заканчиваютÑÑ Ñ‡ÐµÑ€Ð½Ð¸Ð»Ð°</translation>
+ </message>
+ <message>
+ <source>Magenta cartridge is low on ink</source>
+<translation>Ð’ пурпурном картридже заканчиваютÑÑ Ñ‡ÐµÑ€Ð½Ð¸Ð»Ð°</translation>
+ </message>
+ <message>
+ <source>Yellow cartridge is low on ink</source>
+<translation>Ð’ желтом картридже заканчиваютÑÑ Ñ‡ÐµÑ€Ð½Ð¸Ð»Ð°</translation>
+ </message>
+ <message>
+ <source>Photo cyan cartridge is low on ink</source>
+<translation>Ð’ голубом фотокартридже заканчиваютÑÑ Ñ‡ÐµÑ€Ð½Ð¸Ð»Ð°</translation>
+ </message>
+ <message>
+ <source>Photo magenta cartridge is low on ink</source>
+<translation>Ð’ пурпурном фотокартридже заканчиваютÑÑ Ñ‡ÐµÑ€Ð½Ð¸Ð»Ð°</translation>
+ </message>
+ <message>
+ <source>Photo yellow cartridge is low on ink</source>
+<translation>Ð’ желтом фотокартридже заканчиваютÑÑ Ñ‡ÐµÑ€Ð½Ð¸Ð»Ð°</translation>
+ </message>
+ <message>
+ <source>Photo gray cartridge is low on ink</source>
+<translation>Ð’ Ñером фотокартридже заканчиваютÑÑ Ñ‡ÐµÑ€Ð½Ð¸Ð»Ð°</translation>
+ </message>
+ <message>
+ <source>Photo blue cartridge is low on ink</source>
+<translation>Ð’ голубом фотокартридже заканчиваютÑÑ Ñ‡ÐµÑ€Ð½Ð¸Ð»Ð°</translation>
+ </message>
+ <message>
+ <source>Black cartridge is low on toner</source>
+<translation>Ð’ черном картридже заканчиваетÑÑ Ñ‚Ð¾Ð½ÐµÑ€</translation>
+ </message>
+ <message>
+ <source>Cyan cartridge is low on toner</source>
+<translation>Ð’ голубом картридже заканчиваетÑÑ Ñ‚Ð¾Ð½ÐµÑ€</translation>
+ </message>
+ <message>
+ <source>Magenta cartridge is low on toner</source>
+<translation>Ð’ пурпурном картридже заканчиваетÑÑ Ñ‚Ð¾Ð½ÐµÑ€</translation>
+ </message>
+ <message>
+ <source>Yellow cartridge is low on toner</source>
+<translation>Ð’ желтом картридже заканчиваетÑÑ Ñ‚Ð¾Ð½ÐµÑ€</translation>
+ </message>
+ <message>
+ <source>Warming up.</source>
+<translation>Идет прогревание.</translation>
+ </message>
+ <message>
+ <source>Low paper.</source>
+<translation>Мало бумаги.</translation>
+ </message>
+ <message>
+ <source>Door open.</source>
+<translation>Дверца открыта.</translation>
+ </message>
+ <message>
+ <source>Offline.</source>
+<translation>Ðвтономный режим.</translation>
+ </message>
+ <message>
+ <source>Low toner.</source>
+<translation>Мало тонера.</translation>
+ </message>
+ <message>
+ <source>No toner.</source>
+<translation>Ðет тонера.</translation>
+ </message>
+ <message>
+ <source>Service request.</source>
+<translation>Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° обÑлуживание.</translation>
+ </message>
+ <message>
+ <source>Fuser error.</source>
+<translation>Сбой термичеÑкого закреплениÑ.</translation>
+ </message>
+ <message>
+ <source>Unsupported printer model.</source>
+<translation>ÐÐµÐ¿Ð¾Ð´Ð´ÐµÑ€Ð¶Ð¸Ð²Ð°ÐµÐ¼Ð°Ñ Ð¼Ð¾Ð´ÐµÐ»ÑŒ принтера.</translation>
+ </message>
+ <message>
+ <source>Scan job started.</source>
+<translation>ЗапуÑк ÑканированиÑ.</translation>
+ </message>
+ <message>
+ <source>Scan job completed.</source>
+<translation>Сканирование завершено.</translation>
+ </message>
+ <message>
+ <source>Scan job failed.</source>
+<translation>Сбой ÑканированиÑ.</translation>
+ </message>
+ <message>
+ <source>Fax job started.</source>
+<translation>ЗапуÑк факÑа.</translation>
+ </message>
+ <message>
+ <source>Fax job complete.</source>
+<translation>Работа факÑа завершена.</translation>
+ </message>
+ <message>
+ <source>Fax job failed.</source>
+<translation>Сбой факÑа.</translation>
+ </message>
+ <message>
+ <source>Fax job canceled.</source>
+<translation>Отмена факÑа.</translation>
+ </message>
+ <message>
+ <source>Fax send job continuing.</source>
+<translation>ПродолжаетÑÑ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð° факÑа.</translation>
+ </message>
+ <message>
+ <source>Fax receive job continuing.</source>
+<translation>ПродолжаетÑÑ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ðµ факÑа.</translation>
+ </message>
+ <message>
+ <source>Copy job started.</source>
+<translation>ЗапуÑк копированиÑ.</translation>
+ </message>
+ <message>
+ <source>Copy job complete.</source>
+<translation>Копирование завершено.</translation>
+ </message>
+ <message>
+ <source>Copy job failed.</source>
+<translation>Сбой копированиÑ.</translation>
+ </message>
+ <message>
+ <source>Copy job canceled.</source>
+<translation>Отмена копированиÑ.</translation>
+ </message>
+ <message>
+ <source>Device is powered down or unplugged.</source>
+<translation>Питание уÑтройÑтва выключено или уÑтройÑтво отÑоединено.</translation>
+ </message>
+ <message>
+ <source>Device communication error.</source>
+<translation>Ошибка ÑвÑзи Ñ ÑƒÑтройÑтвом.</translation>
+ </message>
+ <message>
+ <source>Device is busy.</source>
+<translation>УÑтройÑтво занÑто.</translation>
+ </message>
+ <message>
+ <source>No data.</source>
+<translation>Данные отÑутÑтвуют.</translation>
+ </message>
+ <message>
+ <source>Unsupported I/O bus.</source>
+<translation>ÐÐµÐ¿Ð¾Ð´Ð´ÐµÑ€Ð¶Ð¸Ð²Ð°ÐµÐ¼Ð°Ñ ÑˆÐ¸Ð½Ð° ввода/вывода.</translation>
+ </message>
+ <message>
+ <source>Device does not support requested operation.</source>
+<translation>УÑтройÑтво не поддерживает требуемую операцию.</translation>
+ </message>
+ <message>
+ <source>To send a fax you must run hp-sendfax first.</source>
+<translation>Ð”Ð»Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð¸ факÑа необходимо запуÑтить Ñначала функцию hp-sendfax.</translation>
+ </message>
+ <message>
+ <source>Run hp-sendfax now to continue. Fax will resume within 10 seconds.</source>
+<translation>Ð”Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð»Ð¶ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑƒÑтите hp-sendfax. Работа факÑа возобновитÑÑ Ð½Ðµ более, чем через 10 Ñекунд.</translation>
+ </message>
+ <message>
+ <source>Photocard unload started.</source>
+<translation>Запущена выгрузка карты памÑти Ð´Ð»Ñ Ñ„Ð¾Ñ‚Ð¾Ð³Ñ€Ð°Ñ„Ð¸Ð¹.</translation>
+ </message>
+ <message>
+ <source>Photocard unload ended.</source>
+<translation>Выгрузка карты памÑти Ð´Ð»Ñ Ñ„Ð¾Ñ‚Ð¾Ð³Ñ€Ð°Ñ„Ð¸Ð¹ завершена.</translation>
+ </message>
+ <message>
+ <source>Photocard unload failed.</source>
+<translation>Сбой выгрузки карты памÑти Ð´Ð»Ñ Ñ„Ð¾Ñ‚Ð¾Ð³Ñ€Ð°Ñ„Ð¸Ð¹.</translation>
+ </message>
+ <message>
+ <source>Make sure photocard is inserted properly and try again.</source>
+<translation>Проверьте правильноÑÑ‚ÑŒ уÑтановки карты памÑти Ð´Ð»Ñ Ñ„Ð¾Ñ‚Ð¾Ð³Ñ€Ð°Ñ„Ð¸Ð¹ и повторите попытку.</translation>
+ </message>
+ <message>
+ <source>Unable to mount photocard on device.</source>
+<translation>Ðе удаетÑÑ ÑƒÑтановить в уÑтройÑтво карту памÑти Ð´Ð»Ñ Ñ„Ð¾Ñ‚Ð¾Ð³Ñ€Ð°Ñ„Ð¸Ð¹.</translation>
+ </message>
+ <message>
+ <source>Photocard unloaded successfully.</source>
+<translation>Выгрузка карты памÑти Ð´Ð»Ñ Ñ„Ð¾Ñ‚Ð¾Ð³Ñ€Ð°Ñ„Ð¸Ð¹ завершена уÑпешно.</translation>
+ </message>
+ <message>
+ <source>Unknown error.</source>
+<translation>ÐеизвеÑÑ‚Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°.</translation>
+ </message>
+ <message>
+ <source>Print</source>
+<translation>УÑтановка ÑиÑтемы работы Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñми и печати Ð´Ð»Ñ HP в Ñреде Linux (HPLIP)</translation>
+ </message>
+ <message>
+ <source>Scan</source>
+<translation>ЗапуÑк ÑканированиÑ.</translation>
+ </message>
+ <message>
+ <source>Send fax</source>
+<translation>Передача факÑа</translation>
+ </message>
+ <message>
+ <source>Make copies</source>
+<translation>Создание копий</translation>
+ </message>
+ <message>
+ <source>Access photo cards</source>
+<translation>ДоÑтуп к картам памÑти Ð´Ð»Ñ Ñ„Ð¾Ñ‚Ð¾Ð³Ñ€Ð°Ñ„Ð¸Ð¹</translation>
+ </message>
+ <message>
+ <source>Invalid/missing</source>
+<translation>ÐедопуÑтимый/отÑутÑтвует</translation>
+ </message>
+ <message>
+ <source>Invalid/missing ink cartridge</source>
+<translation>Картридж недопуÑтимый/отÑутÑтвует</translation>
+ </message>
+ <message>
+ <source>Invalid/missing cartridge</source>
+<translation>Картридж недопуÑтимый/отÑутÑтвует</translation>
+ </message>
+ <message>
+ <source>Invalid/missing print head</source>
+<translation>ÐŸÐµÑ‡Ð°Ñ‚Ð°ÑŽÑ‰Ð°Ñ Ð³Ð¾Ð»Ð¾Ð²ÐºÐ° недопуÑтимаÑ/отÑутÑтвует</translation>
+ </message>
+ <message>
+ <source>Black print head</source>
+<translation>Ð§ÐµÑ€Ð½Ð°Ñ Ð¿ÐµÑ‡Ð°Ñ‚Ð°ÑŽÑ‰Ð°Ñ Ð³Ð¾Ð»Ð¾Ð²ÐºÐ°</translation>
+ </message>
+ <message>
+ <source>Black ink cartridge</source>
+<translation>Черный картридж</translation>
+ </message>
+ <message>
+ <source>Black cartridge</source>
+<translation>Ð’ черном картридже заканчиваютÑÑ Ñ‡ÐµÑ€Ð½Ð¸Ð»Ð°</translation>
+ </message>
+ <message>
+ <source>Tri-color print head</source>
+<translation>Ð¢Ñ€ÐµÑ…Ñ†Ð²ÐµÑ‚Ð½Ð°Ñ Ð¿ÐµÑ‡Ð°Ñ‚Ð°ÑŽÑ‰Ð°Ñ Ð³Ð¾Ð»Ð¾Ð²ÐºÐ°</translation>
+ </message>
+ <message>
+ <source>Tri-color ink cartridge</source>
+<translation>Трехцветный картридж</translation>
+ </message>
+ <message>
+ <source>Tri-color cartridge</source>
+<translation>Ð’ трехцветном картридже заканчиваютÑÑ Ñ‡ÐµÑ€Ð½Ð¸Ð»Ð°</translation>
+ </message>
+ <message>
+ <source>Photo print head</source>
+<translation>ÐŸÐµÑ‡Ð°Ñ‚Ð°ÑŽÑ‰Ð°Ñ Ñ„Ð¾Ñ‚Ð¾Ð³Ð¾Ð»Ð¾Ð²ÐºÐ°</translation>
+ </message>
+ <message>
+ <source>Photo ink cartridge</source>
+<translation>Фотокартридж</translation>
+ </message>
+ <message>
+ <source>Photo cartridge</source>
+<translation>Ð’ фотокартридже заканчиваютÑÑ Ñ‡ÐµÑ€Ð½Ð¸Ð»Ð°</translation>
+ </message>
+ <message>
+ <source>Cyan print head</source>
+<translation>Ð“Ð¾Ð»ÑƒÐ±Ð°Ñ Ð¿ÐµÑ‡Ð°Ñ‚Ð°ÑŽÑ‰Ð°Ñ Ð³Ð¾Ð»Ð¾Ð²ÐºÐ°</translation>
+ </message>
+ <message>
+ <source>Cyan ink cartridge</source>
+<translation>Голубой картридж</translation>
+ </message>
+ <message>
+ <source>Cyan cartridge</source>
+<translation>Ð’ голубом картридже заканчиваютÑÑ Ñ‡ÐµÑ€Ð½Ð¸Ð»Ð°</translation>
+ </message>
+ <message>
+ <source>Magenta print head</source>
+<translation>ÐŸÑƒÑ€Ð¿ÑƒÑ€Ð½Ð°Ñ Ð¿ÐµÑ‡Ð°Ñ‚Ð°ÑŽÑ‰Ð°Ñ Ð³Ð¾Ð»Ð¾Ð²ÐºÐ°</translation>
+ </message>
+ <message>
+ <source>Magenta ink cartridge</source>
+<translation>Пурпурный картридж</translation>
+ </message>
+ <message>
+ <source>Magenta cartridge</source>
+<translation>Ð’ пурпурном картридже заканчиваютÑÑ Ñ‡ÐµÑ€Ð½Ð¸Ð»Ð°</translation>
+ </message>
+ <message>
+ <source>Yellow print head</source>
+<translation>Ð–ÐµÐ»Ñ‚Ð°Ñ Ð¿ÐµÑ‡Ð°Ñ‚Ð°ÑŽÑ‰Ð°Ñ Ð³Ð¾Ð»Ð¾Ð²ÐºÐ°</translation>
+ </message>
+ <message>
+ <source>Yellow ink cartridge</source>
+<translation>Желтый картридж</translation>
+ </message>
+ <message>
+ <source>Yellow cartridge</source>
+<translation>Ð’ желтом картридже заканчиваютÑÑ Ñ‡ÐµÑ€Ð½Ð¸Ð»Ð°</translation>
+ </message>
+ <message>
+ <source>Photo cyan print head</source>
+<translation>Ð“Ð¾Ð»ÑƒÐ±Ð°Ñ Ð¿ÐµÑ‡Ð°Ñ‚Ð°ÑŽÑ‰Ð°Ñ Ñ„Ð¾Ñ‚Ð¾Ð³Ð¾Ð»Ð¾Ð²ÐºÐ°</translation>
+ </message>
+ <message>
+ <source>Photo cyan ink cartridge</source>
+<translation>Голубой фотокартридж</translation>
+ </message>
+ <message>
+ <source>Photo cyan cartridge</source>
+<translation>Ð’ голубом фотокартридже заканчиваютÑÑ Ñ‡ÐµÑ€Ð½Ð¸Ð»Ð°</translation>
+ </message>
+ <message>
+ <source>Photo magenta print head</source>
+<translation>ÐŸÑƒÑ€Ð¿ÑƒÑ€Ð½Ð°Ñ Ð¿ÐµÑ‡Ð°Ñ‚Ð°ÑŽÑ‰Ð°Ñ Ñ„Ð¾Ñ‚Ð¾Ð³Ð¾Ð»Ð¾Ð²ÐºÐ°</translation>
+ </message>
+ <message>
+ <source>Photo magenta ink cartridge</source>
+<translation>Пурпурный фотокартридж</translation>
+ </message>
+ <message>
+ <source>Photo magenta cartridge</source>
+<translation>Ð’ пурпурном фотокартридже заканчиваютÑÑ Ñ‡ÐµÑ€Ð½Ð¸Ð»Ð°</translation>
+ </message>
+ <message>
+ <source>Photo yellow print head</source>
+<translation>Ð–ÐµÐ»Ñ‚Ð°Ñ Ð¿ÐµÑ‡Ð°Ñ‚Ð°ÑŽÑ‰Ð°Ñ Ñ„Ð¾Ñ‚Ð¾Ð³Ð¾Ð»Ð¾Ð²ÐºÐ°</translation>
+ </message>
+ <message>
+ <source>Photo yellow ink cartridge</source>
+<translation>Желтый фотокартридж</translation>
+ </message>
+ <message>
+ <source>Photo yellow cartridge</source>
+<translation>Ð’ желтом фотокартридже заканчиваютÑÑ Ñ‡ÐµÑ€Ð½Ð¸Ð»Ð°</translation>
+ </message>
+ <message>
+ <source>Photo gray print head</source>
+<translation>Ð¡ÐµÑ€Ð°Ñ Ð¿ÐµÑ‡Ð°Ñ‚Ð°ÑŽÑ‰Ð°Ñ Ñ„Ð¾Ñ‚Ð¾Ð³Ð¾Ð»Ð¾Ð²ÐºÐ°</translation>
+ </message>
+ <message>
+ <source>Photo gray ink cartridge</source>
+<translation>Серый фотокартридж</translation>
+ </message>
+ <message>
+ <source>Photo gray cartridge</source>
+<translation>Ð’ Ñером фотокартридже заканчиваютÑÑ Ñ‡ÐµÑ€Ð½Ð¸Ð»Ð°</translation>
+ </message>
+ <message>
+ <source>Photo blue print head</source>
+<translation>Ð“Ð¾Ð»ÑƒÐ±Ð°Ñ Ð¿ÐµÑ‡Ð°Ñ‚Ð°ÑŽÑ‰Ð°Ñ Ñ„Ð¾Ñ‚Ð¾Ð³Ð¾Ð»Ð¾Ð²ÐºÐ°</translation>
+ </message>
+ <message>
+ <source>Photo blue ink cartridge</source>
+<translation>Голубой фотокартридж</translation>
+ </message>
+ <message>
+ <source>Photo blue cartridge</source>
+<translation>Ð’ голубом фотокартридже заканчиваютÑÑ Ñ‡ÐµÑ€Ð½Ð¸Ð»Ð°</translation>
+ </message>
+ <message>
+ <source>Print head</source>
+<translation>ÐŸÐµÑ‡Ð°Ñ‚Ð°ÑŽÑ‰Ð°Ñ Ð³Ð¾Ð»Ð¾Ð²ÐºÐ°</translation>
+ </message>
+ <message>
+ <source>Photo magenta and photo cyan print head</source>
+<translation>ÐŸÑƒÑ€Ð¿ÑƒÑ€Ð½Ð°Ñ Ð¸ Ð³Ð¾Ð»ÑƒÐ±Ð°Ñ Ð¿ÐµÑ‡Ð°Ñ‚Ð°ÑŽÑ‰Ð°Ñ Ñ„Ð¾Ñ‚Ð¾Ð³Ð¾Ð»Ð¾Ð²ÐºÐ°</translation>
+ </message>
+ <message>
+ <source>Magenta and yellow print head</source>
+<translation>ÐŸÑƒÑ€Ð¿ÑƒÑ€Ð½Ð°Ñ Ð¸ Ð¶ÐµÐ»Ñ‚Ð°Ñ Ð¿ÐµÑ‡Ð°Ñ‚Ð°ÑŽÑ‰Ð°Ñ Ð³Ð¾Ð»Ð¾Ð²ÐºÐ°</translation>
+ </message>
+ <message>
+ <source>Black and cyan print head</source>
+<translation>Ð§ÐµÑ€Ð½Ð°Ñ Ð¸ Ð³Ð¾Ð»ÑƒÐ±Ð°Ñ Ð¿ÐµÑ‡Ð°Ñ‚Ð°ÑŽÑ‰Ð°Ñ Ð³Ð¾Ð»Ð¾Ð²ÐºÐ°</translation>
+ </message>
+ <message>
+ <source>Light gray and photo black print head</source>
+<translation>Светло-ÑÐµÑ€Ð°Ñ Ð¸ Ñ‡ÐµÑ€Ð½Ð°Ñ Ð¿ÐµÑ‡Ð°Ñ‚Ð°ÑŽÑ‰Ð°Ñ Ñ„Ð¾Ñ‚Ð¾Ð³Ð¾Ð»Ð¾Ð²ÐºÐ°</translation>
+ </message>
+ <message>
+ <source>Light gray ink cartridge</source>
+<translation>Светло-Ñерый картридж</translation>
+ </message>
+ <message>
+ <source>Medium gray ink cartridge</source>
+<translation>Средне-Ñерый картридж</translation>
+ </message>
+ <message>
+ <source>Photo black ink cartridge</source>
+<translation>Черный фотокартридж</translation>
+ </message>
+ <message>
+ <source>Cyan and magenta print head</source>
+<translation>Ð“Ð¾Ð»ÑƒÐ±Ð°Ñ Ð¸ Ð¿ÑƒÑ€Ð¿ÑƒÑ€Ð½Ð°Ñ Ð¿ÐµÑ‡Ð°Ñ‚Ð°ÑŽÑ‰Ð°Ñ Ð³Ð¾Ð»Ð¾Ð²ÐºÐ°</translation>
+ </message>
+ <message>
+ <source>Black and yellow print head</source>
+<translation>Ð§ÐµÑ€Ð½Ð°Ñ Ð¸ Ð¶ÐµÐ»Ñ‚Ð°Ñ Ð¿ÐµÑ‡Ð°Ñ‚Ð°ÑŽÑ‰Ð°Ñ Ð³Ð¾Ð»Ð¾Ð²ÐºÐ°</translation>
+ </message>
+ <message>
+ <source>Black toner cartridge</source>
+<translation>Черный картридж</translation>
+ </message>
+ <message>
+ <source>Cyan toner cartridge</source>
+<translation>Голубой картридж</translation>
+ </message>
+ <message>
+ <source>Magenta toner cartridge</source>
+<translation>Пурпурный картридж</translation>
+ </message>
+ <message>
+ <source>Yellow toner cartridge</source>
+<translation>Желтый картридж</translation>
+ </message>
+ <message>
+ <source>Maintenance kit (fuser)</source>
+<translation>Комплект техобÑÐ»ÑƒÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ (блок термозакреплениÑ)</translation>
+ </message>
+ <message>
+ <source>Document feeder (ADF) kit</source>
+<translation>Комплект Ð´Ð»Ñ ÑƒÑтройÑтва подачи документов (ÐПД)</translation>
+ </message>
+ <message>
+ <source>Drum maintenance kit</source>
+<translation>Комплект техобÑÐ»ÑƒÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð±Ð°Ñ€Ð°Ð±Ð°Ð½Ð°</translation>
+ </message>
+ <message>
+ <source>Image transfer kit</source>
+<translation>Комплект Ð´Ð»Ñ ÑƒÑтройÑтва передачи изображений</translation>
+ </message>
+ <message>
+ <source>Good/OK</source>
+<translation>Хорошо/ОК</translation>
+ </message>
+ <message>
+ <source>Fair/Moderate</source>
+<translation>Хорошо/Средне</translation>
+ </message>
+ <message>
+ <source>Not installed</source>
+<translation>Ðе уÑтановлен</translation>
+ </message>
+ <message>
+ <source>Incorrect</source>
+<translation>Ðеверно</translation>
+ </message>
+ <message>
+ <source>Failed</source>
+<translation>ОШИБКÐ: Карта памÑти Ð´Ð»Ñ Ñ„Ð¾Ñ‚Ð¾Ð³Ñ€Ð°Ñ„Ð¸Ð¹ уÑтановлена неправильно. Проверьте уÑтройÑтво и карту и повторите попытку.</translation>
+ </message>
+ <message>
+ <source>Overheated</source>
+<translation>Перегрев</translation>
+ </message>
+ <message>
+ <source>Discharging</source>
+<translation>РазрÑжаетÑÑ</translation>
+ </message>
+ <message>
+ <source>Charging</source>
+<translation>ЗарÑжаетÑÑ</translation>
+ </message>
+ <message>
+ <source>Low</source>
+<translation>Мало бумаги.</translation>
+ </message>
+ <message>
+ <source>Very low</source>
+<translation>Очень низкий</translation>
+ </message>
+ <message>
+ <source>HPLIP: Email alert test message</source>
+<translation>HPLIP: ТеÑтовое Ñообщение-предупреждение Ñлектронной почты</translation>
+ </message>
+ <message>
+ <source>This email is to test the functionality of HPLIP email alerts.</source>
+<translation>Данное Ñообщение Ñлектронной почты проверÑет функционирование в HPLIP ÑиÑтемы выдачи предупреждений по Ñлектронной почте.</translation>
+ </message>
+ <message>
+ <source>HPLIP: Error/alert on device: </source>
+<translation>HPLIP: Ошибка/предупреждение на уÑтройÑтве:</translation>
+ </message>
+</context>
+<context>
+ <name>SupportForm_base</name>
+ <message>
+ <source>HP Device Manager - Support Information</source>
+ <translation>ДиÑпетчер уÑтройÑтв HP — Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ техничеÑкой поддержке</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Закрыть</translation>
+ </message>
+ <message>
+ <source>http://hplip.sourceforge.net</source>
+ <translation>http://hplip.sourceforge.net</translation>
+ </message>
+ <message>
+ <source>HPLIP is free, open source software distributed under the MIT, BSD, and GPL licenses. &lt;b&gt;&lt;i&gt;HP does not provide formal consumer or commercial support for this software.&lt;/i&gt;&lt;/b&gt;&lt;p&gt; Support is provided informally through a series of resources on a Sourceforge.net website. On this HP sponsored website, you will find FAQs, open discussion forums, installation instructions, a product support table, and other support materials.</source>
+ <translation>HPLIP ÑвлÑетÑÑ Ð±ÐµÑплатным программным обеÑпечением Ñ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ñ‹Ð¼ иÑходным кодом, раÑпроÑтранÑемым Ñ Ð»Ð¸Ñ†ÐµÐ½Ð·Ð¸Ñми MIT, BSD и GPL. &lt;b&gt;&lt;i&gt;HP не предоÑтавлÑет официальной потребительÑкой или торговой поддержки Ð´Ð»Ñ Ñтого программного обеÑпечениÑ.&lt;/i&gt;&lt;/b&gt;&lt;p&gt; Поддержка предоÑтавлÑетÑÑ Ð² неофициальном порÑдке поÑредÑтвом Ñ€Ñда реÑурÑов на веб-узле Sourceforge.net. Ðа Ñтом веб-узле, ÑпонÑором которого ÑвлÑетÑÑ HP, предÑтавлены чаÑто задаваемые вопроÑÑ‹ Ñ Ð¾Ñ‚Ð²ÐµÑ‚Ð°Ð¼Ð¸, имеютÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ñ‹Ðµ диÑкуÑÑионные форумы, инÑтрукции по уÑтановке, таблица поддержки Ð¸Ð·Ð´ÐµÐ»Ð¸Ñ Ð¸ другие материалы по техничеÑкой поддержке.</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;HP Sponsored Support&lt;/b&gt;</source>
+ <translation>&lt;b&gt;ТехничеÑÐºÐ°Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ°, ÑпонÑором которой ÑвлÑетÑÑ HP&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>NOTE: Sourceforge.net is owned and operated by OSTG, Inc. and is not affiliated with HP.</source>
+ <translation>Примечание. Веб-узел Sourceforge.net принадлежит и управлÑетÑÑ ÐºÐ¾Ñ€Ð¿Ð¾Ñ€Ð°Ñ†Ð¸ÐµÐ¹ OSTG и не ÑвÑзан Ñ ÐºÐ¾Ð¼Ð¿Ð°Ð½Ð¸ÐµÐ¹ HP.</translation>
+ </message>
+ <message>
+ <source>HP</source>
+ <translation>HP</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;README File&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Файл README&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>A readme file was shipped with your version of HPLIP. This file contains the product support table, a troubleshooting guide, and other support resources.</source>
+ <translation>Файл readme поÑтавлÑетÑÑ Ð²Ð¼ÐµÑте Ñ Ð²ÐµÑ€Ñией HPLIP. Ð’ Ñтом файле ÑодержитÑÑ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ð° поддержки изделиÑ, руководÑтво по поиÑку и уÑтранению неполадок и прочие реÑурÑÑ‹ техничеÑкой поддержки.</translation>
+ </message>
+ <message>
+ <source>hplip_readme.html</source>
+ <translation>hplip_readme.html</translation>
+ </message>
+ <message>
+ <source>README File</source>
+ <translation>Файл README</translation>
+ </message>
+ <message>
+ <source>http://linuxprinting.org</source>
+ <translation>http://linuxprinting.org</translation>
+ </message>
+ <message>
+ <source>General Linux printing assistance is also available from open discussion forums, documentation, access to PPD files, etc. from:</source>
+ <translation>Общие ÑÐ²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾ ÑредÑтвах печати в операционной ÑиÑтеме Linux доÑтупны также в открытых диÑкуÑÑионных форумах, в документации, в файлах PPD и Ñ‚.п., находÑщихÑÑ Ð½Ð° веб-узле по адреÑу:</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;linuxprinting.org&lt;/b&gt;</source>
+ <translation>&lt;b&gt;linuxprinting.org&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>NOTE: Linuxprinting.org is operated through the generous efforts of Grant Taylor and Till Kamppeter and is not affiliated with HP.</source>
+ <translation>Примечание. Веб-узел Linuxprinting.org работает вÑецело Ð±Ð»Ð°Ð³Ð¾Ð´Ð°Ñ€Ñ ÑƒÑилиÑм Гранта Тейлора и Тилла Кампетера и не ÑвÑзан Ñ ÐºÐ¾Ð¼Ð¿Ð°Ð½Ð¸ÐµÐ¹ HP.</translation>
+ </message>
+ <message>
+ <source>linuxprinting.org</source>
+ <translation>linuxprinting.org</translation>
+ </message>
+ <message>
+ <source>http://cups.org</source>
+ <translation>http://cups.org</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;CUPS&lt;/b&gt;</source>
+ <translation>&lt;b&gt;CUPS&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Information about CUPS (Common UNIX Printing System) is available at cups.org. This website also contains forums and other support resources for printing on Linux:</source>
+ <translation>Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ CUPS (Common UNIX Printing System) предÑтавлена на веб-узле cups.org. Ðа Ñтом веб-узле также имеютÑÑ Ñ„Ð¾Ñ€ÑƒÐ¼Ñ‹ и другие реÑурÑÑ‹ поддержки печати в операционной ÑиÑтеме Linux:</translation>
+ </message>
+ <message>
+ <source>NOTE: CUPS and the CUPS website is owned and operated by Easy Software Products and is not affiliated with HP.</source>
+ <translation>Примечание. CUPS и веб-узел CUPS принадлежат и управлÑÑŽÑ‚ÑÑ ÐºÐ¾Ð¼Ð¿Ð°Ð½Ð¸ÐµÐ¹ Easy Software Products и не ÑвÑзаны Ñ ÐºÐ¾Ð¼Ð¿Ð°Ð½Ð¸ÐµÐ¹ HP.</translation>
+ </message>
+ <message>
+ <source>CUPS</source>
+ <translation>CUPS</translation>
+ </message>
+</context>
+<context>
+ <name>UnloadForm</name>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;No devices found that support photo card access.&lt;/b&gt;&lt;p&gt;Please make sure your device is properly installed and try again.</source>
+ <translation>&lt;p&gt;&lt;b&gt;Ðе обнаружены уÑтройÑтва, поддерживающие доÑтуп к картам памÑти Ð´Ð»Ñ Ñ„Ð¾Ñ‚Ð¾Ð³Ñ€Ð°Ñ„Ð¸Ð¹.&lt;/b&gt;&lt;p&gt;Проверьте правильноÑÑ‚ÑŒ уÑтановки уÑтройÑтва и повторите попытку.</translation>
+ </message>
+ <message>
+ <source>HP Device Manager - Unload Photo Card</source>
+ <translation>ДиÑпетчер уÑтройÑтв HP — Выгрузка карты памÑти Ð´Ð»Ñ Ñ„Ð¾Ñ‚Ð¾Ð³Ñ€Ð°Ñ„Ð¸Ð¹</translation>
+ </message>
+</context>
+<context>
+ <name>UnloadForm_base</name>
+ <message>
+ <source>HP Device Manager - Unload Files from Photo Card</source>
+ <translation>ДиÑпетчер уÑтройÑтв HP — Выгрузка файлов Ñ ÐºÐ°Ñ€Ñ‚Ñ‹ памÑти Ð´Ð»Ñ Ñ„Ð¾Ñ‚Ð¾Ð³Ñ€Ð°Ñ„Ð¸Ð¹</translation>
+ </message>
+ <message>
+ <source>Device:</source>
+ <translation>УÑтройÑтво:</translation>
+ </message>
+ <message>
+ <source>Unload Selected Files</source>
+ <translation>Выгрузка выбранных файлов</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Закрыть</translation>
+ </message>
+ <message>
+ <source>Unload Directory:</source>
+ <translation>Выгрузить каталог:</translation>
+ </message>
+ <message>
+ <source>Browse...</source>
+ <translation>Обзор...</translation>
+ </message>
+ <message>
+ <source>File Removal:</source>
+ <translation>Удаление файла:</translation>
+ </message>
+ <message>
+ <source>Leave all files on photo card</source>
+ <translation>ОÑтавить вÑе файлы на карте памÑти Ð´Ð»Ñ Ñ„Ð¾Ñ‚Ð¾Ð³Ñ€Ð°Ñ„Ð¸Ð¹</translation>
+ </message>
+ <message>
+ <source>Remove selected files</source>
+ <translation>Удаление выбранных файлов</translation>
+ </message>
+ <message>
+ <source>Select Files to Unload from Photo Card:</source>
+ <translation>Выберите файлы Ð´Ð»Ñ Ð²Ñ‹Ð³Ñ€ÑƒÐ·ÐºÐ¸ Ñ ÐºÐ°Ñ€Ñ‚Ñ‹ памÑти Ð´Ð»Ñ Ñ„Ð¾Ñ‚Ð¾Ð³Ñ€Ð°Ñ„Ð¸Ð¹</translation>
+ </message>
+ <message>
+ <source>Select All</source>
+ <translation>Выбрать вÑе</translation>
+ </message>
+ <message>
+ <source>Select None</source>
+ <translation>Ðе выбирать</translation>
+ </message>
+ <message>
+ <source>Show Thumbnails</source>
+ <translation>Показать ÑÑкизы</translation>
+ </message>
+</context>
+<context>
+ <name>WaitForm_base</name>
+ <message>
+ <source>HP Device Manager - Waiting</source>
+ <translation>ДиÑпетчер уÑтройÑтв HP — Ожидание</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Waiting for procedure to finish...&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Ожидание Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ Ð¿Ñ€Ð¾Ñ†ÐµÐ´ÑƒÑ€Ñ‹...&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Отмена</translation>
+ </message>
+</context>
+<context>
+ <name>self.form.FailureUI</name>
+ <message>
+ <source>&lt;b&gt;Unable to mount photo card on device.&lt;/b&gt;&lt;p&gt;Check that device is powered on and photo card is correctly inserted.</source>
+<translation>&lt;b&gt;Ðе удаетÑÑ ÑƒÑтановить в уÑтройÑтво карту памÑти Ð´Ð»Ñ Ñ„Ð¾Ñ‚Ð¾Ð³Ñ€Ð°Ñ„Ð¸Ð¹.&lt;/b&gt;&lt;p&gt;УбедитеÑÑŒ, что уÑтройÑтво включено и карта памÑти вÑтавлена правильно.</translation>
+ </message>
+</context>
+</TS>
diff --git a/data/localization/hplip_zh.qm b/data/localization/hplip_zh.qm
new file mode 100644
index 0000000..50b104d
--- /dev/null
+++ b/data/localization/hplip_zh.qm
Binary files differ
diff --git a/data/localization/hplip_zh.ts b/data/localization/hplip_zh.ts
new file mode 100755
index 0000000..2b1dcd8
--- /dev/null
+++ b/data/localization/hplip_zh.ts
@@ -0,0 +1,5048 @@
+<!DOCTYPE TS><TS>
+<context>
+ <name>@default</name>
+ <message>
+ <source>&lt;b&gt;Unable to mount photo card on device.&lt;/b&gt;&lt;p&gt;Check that device is powered on and photo card is correctly inserted.</source>
+<translation>&lt;b&gt;无法在设备上安装照片å¡ã€‚&lt;/b&gt;&lt;p&gt;请检查以确ä¿è®¾å¤‡é€šç”µï¼Œä¸”已正确æ’入照片å¡ã€‚</translation>
+ </message>
+</context>
+<context>
+ <name>AboutDlg_base</name>
+ <message>
+ <source>HP Device Manager - About</source>
+ <translation>HP 设备管ç†å™¨ – 关于</translation>
+ </message>
+ <message>
+ <source>&lt;font size=&quot;+3&quot;&gt;&lt;p align=&quot;center&quot;&gt;HP Linux Imaging and Printing (HPLIP)&lt;/p&gt;&lt;/font&gt;</source>
+ <translation>&lt;font size=&quot;+3&quot;&gt;&lt;p align=&quot;center&quot;&gt;HP Linux æˆåƒä¸Žæ‰“å°ç³»ç»Ÿ (HPLIP)&lt;/p&gt;&lt;/font&gt;</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>关闭</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;HPLIP Software Version:&lt;/b&gt;</source>
+ <translation>&lt;b&gt;HPLIP 软件版本:&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>0.0.0</source>
+ <translation>0.0.0</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Device Manager Software Version:&lt;/b&gt;</source>
+ <translation>&lt;b&gt;设备管ç†å™¨è½¯ä»¶ç‰ˆæœ¬ï¼š&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Authors and Contributors:&lt;/b&gt;\nDavid Suffield, Don Welch, Shiyun Yie, Raghothama Cauligi, John Oleinik, Cory Meisch, Foster Nuffer, Pete Parks, Jacqueline Pitter, David Paschal,\nSteve DeRoos, Mark Overton, Aaron Albright, Smith Kennedy, John Hosszu, Chris Wiesner, Henrique M. Holschuh, Till Kamppeter, Linus Araque, Mark Crawford, Charlie Moore</source>
+ <translation>&lt;b&gt;作者和贡献者:&lt;/b&gt;
+David Suffieldã€Don Welchã€Shiyun Yieã€Raghothama Cauligiã€John Oleinikã€Cory Meischã€Foster Nufferã€Pete Parksã€Jacqueline Pitterã€David Paschalã€
+Steve DeRoosã€Mark Overtonã€Aaron Albrightã€Smith Kennedyã€John Hosszuã€Chris Wiesnerã€Henrique M. Holschuh,ã€Till Kamppeter, Linus Araque, Mark Crawford, Charlie Moore</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;License and Copyright:&lt;/b&gt;
+(c) Copyright 2006 Hewlett-Packard Development Company, L.P. This software is licensed under the GNU General Public License (GPL), BSD, and MIT licenses. See the software sources for details.</source>
+ <translation>&lt;b&gt;许å¯è¯ä¸Žç‰ˆæƒï¼š&lt;/b&gt;
+(c) 版æƒæ‰€æœ‰ 2006 Hewlett-Packard Development Company, L.P. æœ¬è½¯ä»¶å·²èŽ·ç» GNU 通用公共许å¯è¯ (GPL)ã€BSD ä»¥åŠ MIT 许å¯è¯çš„授æƒã€‚有关详细信æ¯ï¼Œè¯·å‚阅软件原始资料。</translation>
+ </message>
+</context>
+<context>
+ <name>Align10Form_Base</name>
+ <message>
+ <source>HP Device Manager - Alignment</source>
+ <translation>HP 设备管ç†å™¨ – 对é½</translation>
+ </message>
+ <message>
+ <source>Examine the page that was printed. Several rows of boxes, each made up of thin lines, appear on the printed page.&lt;p&gt;
+For each row, select the label representing the box in which the shorter inner lines are the most aligned with the longer outer lines..</source>
+ <translation>检查已打å°çš„页。打å°çš„页上å°æœ‰å¤šè¡Œæ¡†ä½“,且æ¯ä¸ªæ¡†ä½“å‡ç”±ç»†çº¿ç»„æˆã€‚&lt;p&gt;
+选择代表框体中较短内线与较长外线最æˆç›´çº¿çš„æ¯ä¸€è¡Œçš„标签。</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;B:&lt;/font&gt;&lt;/b&gt;</source>
+ <translation>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;B:&lt;/font&gt;&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;F:&lt;/font&gt;&lt;/b&gt;</source>
+ <translation>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;F:&lt;/font&gt;&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;C:&lt;/font&gt;&lt;/b&gt;</source>
+ <translation>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;C:&lt;/font&gt;&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;D:&lt;/font&gt;&lt;/b&gt;</source>
+ <translation>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;D:&lt;/font&gt;&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;G:&lt;/font&gt;&lt;/b&gt;</source>
+ <translation>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;G:&lt;/font&gt;&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;A:&lt;/font&gt;&lt;/b&gt;</source>
+ <translation>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;A:&lt;/font&gt;&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;E:&lt;/font&gt;&lt;/b&gt;</source>
+ <translation>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;E:&lt;/font&gt;&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;H:&lt;/font&gt;&lt;/b&gt;</source>
+ <translation>&lt;b&gt;&lt;font face=&quot;Courier&quot;&gt;H:&lt;/font&gt;&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Next &gt;</source>
+ <translation>下一步 &gt;</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>å–消</translation>
+ </message>
+</context>
+<context>
+ <name>AlignForm</name>
+ <message>
+ <source>HP Device Manager - Alignment</source>
+ <translation>HP 设备管ç†å™¨ – 对é½</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>å–消</translation>
+ </message>
+ <message>
+ <source>Next &gt;</source>
+ <translation>下一步 &gt;</translation>
+ </message>
+ <message>
+ <source>Choose the set of lines where the line segments are &lt;b&gt;best&lt;/b&gt; aligned.</source>
+ <translation>选择其线段排列&lt;b&gt;最&lt;/b&gt;æˆç›´çº¿çš„一组线æ¡ã€‚</translation>
+ </message>
+</context>
+<context>
+ <name>AlignType6Form1_base</name>
+ <message>
+ <source>HP Device Manager - Alignment</source>
+ <translation>HP 设备管ç†å™¨ – 对é½</translation>
+ </message>
+ <message>
+ <source>To perform alignment, you will need the &lt;b&gt;alignment page&lt;/b&gt; that is automatically printed after you install a print cartridge.
+&lt;p&gt; If you do &lt;b&gt;not&lt;/b&gt; have this page, click &lt;i&gt;Print Page&lt;/i&gt;.
+&lt;p&gt;If you already have this page, click &lt;i&gt;Next &gt;&lt;/i&gt;.</source>
+ <translation>è¦è¿›è¡Œå¯¹é½ï¼Œéœ€è¦åœ¨å®‰è£…打å°å¢¨ç›’åŽè‡ªåŠ¨æ‰“å°çš„&lt;b&gt;对é½é¡µ&lt;/b&gt;。
+&lt;p&gt;如果&lt;b&gt;没有&lt;/b&gt;该页é¢ï¼Œåˆ™è¯·å•å‡»&lt;i&gt;打å°é¡µé¢&lt;/i&gt;。
+&lt;p&gt;如果已有此页é¢ï¼Œåˆ™è¯·å•å‡»&lt;i&gt;下一步&gt;&lt;/i&gt;。</translation>
+ </message>
+ <message>
+ <source>Next &gt;</source>
+ <translation>下一步 &gt;</translation>
+ </message>
+ <message>
+ <source>Print Page</source>
+ <translation>打å°é¡µé¢</translation>
+ </message>
+</context>
+<context>
+ <name>AlignType6Form2_base</name>
+ <message>
+ <source>HP Device Manager - Alignment</source>
+ <translation>HP 设备管ç†å™¨ – 对é½</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Follow these steps to complete the alignment:&lt;/b&gt;
+&lt;p&gt;&lt;b&gt;1.&lt;/b&gt; Place the alignment page, with the printed side facing down, on the scanner.
+&lt;p&gt;&lt;b&gt;2.&lt;/b&gt; Press the &lt;i&gt;Enter&lt;/i&gt; or &lt;i&gt;Scan&lt;/i&gt; button on the printer.
+&lt;p&gt;&lt;b&gt;3.&lt;/b&gt; &quot;Alignment Complete&quot; will be displayed when the process is finished (on some models)..</source>
+ <translation>&lt;b&gt;按下列步骤进行对é½ï¼š&lt;/b&gt;
+&lt;p&gt;&lt;b&gt;1.&lt;/b&gt;将对é½é¡µé¢ç½®äºŽæ‰«æ仪上,且打å°é¢æœä¸‹ã€‚
+&lt;p&gt;&lt;b&gt;2.&lt;/b&gt;按打å°æœºä¸Šçš„&lt;i&gt; Enter&lt;/i&gt; 键或&lt;i&gt;扫æ&lt;/i&gt;按钮。
+&lt;p&gt;&lt;b&gt;3.&lt;/b&gt; 完æˆæ­¤è¿‡ç¨‹åŽï¼Œéšå³æ˜¾ç¤ºâ€œå¯¹é½å®Œæˆâ€ï¼ˆåœ¨æŸäº›åž‹å·ä¸­ï¼‰ã€‚</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>确定</translation>
+ </message>
+</context>
+<context>
+ <name>AllowableTypesDlg_base</name>
+ <message>
+ <source>MIME Type</source>
+ <translation>MIME 类型</translation>
+ </message>
+ <message>
+ <source>Description</source>
+ <translation>说明</translation>
+ </message>
+ <message>
+ <source>Usual File Extension(s)</source>
+ <translation>常è§æ–‡ä»¶æ‰©å±•å</translation>
+ </message>
+ <message>
+ <source>HP Device Manager - Allowable Types</source>
+ <translation>HP 设备管ç†å™¨ – å…许类型</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;File/document types that can be added to the file list.&lt;/b&gt;</source>
+ <translation>&lt;b&gt;å¯æ·»åŠ åˆ°æ–‡ä»¶åˆ—表的文件/文档类型。&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>确定</translation>
+ </message>
+ <message>
+ <source>&lt;i&gt;Note: To print or fax file/document types that do not appear on this list, print the document from the application that created it through the appropriate CUPS printer.&lt;/i&gt;</source>
+ <translation>&lt;i&gt;注æ„:è¦æ‰“å°æˆ–传真该列表以外的文件/文档类型,请从创建它的应用程åºä¸­é€šè¿‡ç›¸åº” CUPS 打å°æœºæ¥æ‰“å°æ–‡æ¡£ã€‚&lt;/i&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>ChooseDeviceDlg</name>
+ <message>
+ <source>Choose Device</source>
+ <translation>选择设备</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>确定</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>å–消</translation>
+ </message>
+ <message>
+ <source>Available Devices:</source>
+ <translation>å¯ç”¨è®¾å¤‡ï¼š</translation>
+ </message>
+</context>
+<context>
+ <name>ChoosePrinterDlg</name>
+ <message>
+ <source>Choose Device</source>
+ <translation>选择设备</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>确定</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>å–消</translation>
+ </message>
+ <message>
+ <source>Available Devices:</source>
+ <translation>å¯ç”¨è®¾å¤‡ï¼š</translation>
+ </message>
+ <message>
+ <source>Available Printers:</source>
+ <translation>å¯ç”¨æ‰“å°æœºï¼š</translation>
+ </message>
+ <message>
+ <source>Available Faxes:</source>
+ <translation>å¯ç”¨ä¼ çœŸæœºï¼š</translation>
+ </message>
+</context>
+<context>
+ <name>ChoosePrinterDlg2</name>
+ <message>
+ <source>Choose Printer</source>
+ <translation>选择打å°æœº</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>确定</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>å–消</translation>
+ </message>
+ <message>
+ <source>Printers:</source>
+ <translation>打å°æœºï¼š</translation>
+ </message>
+</context>
+<context>
+ <name>CleaningForm2_base</name>
+ <message>
+ <source>HP Device Manager - Cleaning</source>
+ <translation>HP 设备管ç†å™¨ – 清æ´</translation>
+ </message>
+ <message>
+ <source>Finish</source>
+ <translation>完æˆ</translation>
+ </message>
+ <message>
+ <source>Please wait while the test page is printed. Check this page to see if the problem was fixed. If the test page looks fine click &lt;b&gt;Finish &lt;/b&gt;to quit the cleaning procedure. Otherwise, replace the print cartridges and click &lt;b&gt;Finish&lt;/b&gt;.</source>
+ <translation>打å°æµ‹è¯•é¡µæ—¶è¯·ç­‰å¾…。检查此页以查看问题是å¦å·²è§£å†³ã€‚若测试页显示良好,则请å•å‡»&lt;b&gt;完æˆ&lt;/b&gt;以退出清æ´æ­¥éª¤ã€‚å¦åˆ™ï¼Œè¯·æ›´æ¢æ‰“å°å¢¨ç›’并å•å‡»&lt;b&gt;完æˆ&lt;/b&gt;。</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Cleaning Level 3 Performed&lt;/b&gt;</source>
+ <translation>&lt;b&gt;清æ´çº§åˆ« 3 执行完毕&lt;/b&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>CleaningForm_base</name>
+ <message>
+ <source>HP Device Manager - Please Wait - Cleaning</source>
+ <translation>HP 设备管ç†å™¨ – 请ç¨å€™ – 正在清æ´</translation>
+ </message>
+ <message>
+ <source>Finish</source>
+ <translation>完æˆ</translation>
+ </message>
+ <message>
+ <source>Cleaning Level %s</source>
+ <translation>清æ´çº§åˆ« %s</translation>
+ </message>
+ <message>
+ <source>Please wait while the test page is printed. Check this page to see if the problem was fixed. If the test page looks fine click &lt;b&gt;Finish &lt;/b&gt;to quit the cleaning procedure. Otherwise, click &lt;b&gt;Cleaning Level %s&lt;/b&gt; to continue with cleaning.</source>
+ <translation>打å°æµ‹è¯•é¡µæ—¶è¯·ç­‰å¾…。检查此页以查看问题是å¦å·²è§£å†³ã€‚若测试页显示良好,则请å•å‡»&lt;b&gt;完æˆ&lt;/b&gt;以退出清æ´ç¨‹åºã€‚å¦åˆ™ï¼Œè¯·å•å‡»&lt;b&gt;清æ´çº§åˆ« %s&lt;/b&gt; 以继续清æ´ã€‚</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Please Wait - Cleaning Level %s Being Performed&lt;/b&gt;</source>
+ <translation>&lt;b&gt;请ç¨å€™ – 正在执行清æ´çº§åˆ« %s&lt;/b&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>ColorAdjForm_base</name>
+ <message>
+ <source>HP Device Manager - Color Adjustment</source>
+ <translation>HP 设备管ç†å™¨ – 色彩调整</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>å–消</translation>
+ </message>
+ <message>
+ <source>Next &gt;</source>
+ <translation>下一步 &gt;</translation>
+ </message>
+ <message>
+ <source>Choose the numbered colored box that the color &lt;b&gt;best &lt;/b&gt;matches the background color of the bar.</source>
+ <translation>选择与æ¡å¸¦èƒŒæ™¯è‰²å½©&lt;b&gt;最&lt;/b&gt;匹é…çš„ç¼–å·å½©è‰²æ¡†ã€‚</translation>
+ </message>
+ <message>
+ <source>1</source>
+ <translation>1</translation>
+ </message>
+ <message>
+ <source>2</source>
+ <translation>2</translation>
+ </message>
+ <message>
+ <source>3</source>
+ <translation>3</translation>
+ </message>
+ <message>
+ <source>4</source>
+ <translation>4</translation>
+ </message>
+ <message>
+ <source>5</source>
+ <translation>5</translation>
+ </message>
+ <message>
+ <source>6</source>
+ <translation>6</translation>
+ </message>
+ <message>
+ <source>7</source>
+ <translation>7</translation>
+ </message>
+ <message>
+ <source>8</source>
+ <translation>8</translation>
+ </message>
+ <message>
+ <source>9</source>
+ <translation>9</translation>
+ </message>
+ <message>
+ <source>10</source>
+ <translation>10</translation>
+ </message>
+ <message>
+ <source>11</source>
+ <translation>11</translation>
+ </message>
+ <message>
+ <source>12</source>
+ <translation>12</translation>
+ </message>
+ <message>
+ <source>13</source>
+ <translation>13</translation>
+ </message>
+ <message>
+ <source>14</source>
+ <translation>14</translation>
+ </message>
+ <message>
+ <source>15</source>
+ <translation>15</translation>
+ </message>
+ <message>
+ <source>16</source>
+ <translation>16</translation>
+ </message>
+ <message>
+ <source>17</source>
+ <translation>17</translation>
+ </message>
+ <message>
+ <source>18</source>
+ <translation>18</translation>
+ </message>
+ <message>
+ <source>19</source>
+ <translation>19</translation>
+ </message>
+ <message>
+ <source>20</source>
+ <translation>20</translation>
+ </message>
+ <message>
+ <source>21</source>
+ <translation>21</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;&lt;font size=&quot;+1&quot;&gt;Line&lt;/font&gt;&lt;/b&gt;</source>
+ <translation>&lt;b&gt;&lt;font size=&quot;+1&quot;&gt;线æ¡&lt;/font&gt;&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;&lt;font size=&quot;+1&quot;&gt;X&lt;/font&gt;&lt;/b&gt;</source>
+ <translation>&lt;b&gt;&lt;font size=&quot;+1&quot;&gt;X&lt;/font&gt;&lt;/b&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>ColorCal4Form_base</name>
+ <message>
+ <source>HP Device Manager - Color Calibration</source>
+ <translation>HP 设备管ç†å™¨ – 色彩校准</translation>
+ </message>
+ <message>
+ <source>Calibrate</source>
+ <translation>校准</translation>
+ </message>
+ <message>
+ <source>1. Hold the calibration page at arm&apos;s length in front of your eyes.
+&lt;p&gt;&lt;p&gt;
+2. Tilt the page away from you. Look at the two large squares, each containing colored patches. For each large square, find the colored path that &lt;b&gt;most closely&lt;/b&gt; matches the background color. Each patch has an associated letter and number.
+&lt;p&gt;&lt;p&gt;
+3. Choose the letter and number for the matching patches for the gray and color plots.
+&lt;p&gt;&lt;p&gt;
+4. Click &lt;i&gt;&quot;Calibrate&quot;.&lt;/i&gt; to continue.
+&lt;p&gt;&lt;p&gt;
+(To reset the printer to known defaults, click &lt;i&gt;&quot;Use Factory Defaults&quot;&lt;/i&gt;)</source>
+ <translation>1. 将校准页置于眼å‰è·ç¦»çº¦ä¸ºæ‰‹è‡‚长度的ä½ç½®ã€‚
+&lt;p&gt;&lt;p&gt;
+2. 倾斜页é¢ã€‚观察å‡å«é¢œè‰²è¡¥ç¼€çš„两个较大正方形。为æ¯ä¸ªè¾ƒå¤§æ­£æ–¹å½¢æŸ¥æ‰¾ä¸ŽèƒŒæ™¯é¢œè‰²&lt;b&gt;最&lt;/b&gt;匹é…的彩色补缀。æ¯ä¸ªè¡¥ç¼€å‡æœ‰ä¸€ç›¸å…³å­—æ¯å’Œç¼–å·ã€‚
+&lt;p&gt;&lt;p&gt;
+3. 为匹é…的补缀选择相应字æ¯å’Œç¼–å·ï¼Œä»¥ç”¨äºŽç°è‰²åŠå½©è‰²ç»˜å›¾ã€‚
+&lt;p&gt;&lt;p&gt;
+4. å•å‡»&lt;i&gt;&quot;校准&quot;.&lt;/i&gt;以继续。
+&lt;p&gt;&lt;p&gt;
+(è¦å°†æ‰“å°æœºé‡ç½®ä¸ºå·²çŸ¥é»˜è®¤è®¾ç½®ï¼Œè¯·å•å‡»&lt;i&gt;&quot;使用出厂默认设置&quot;&lt;/i&gt;)</translation>
+ </message>
+ <message>
+ <source>Gray Plot</source>
+ <translation>ç°è‰²ç»˜å›¾</translation>
+ </message>
+ <message>
+ <source>A</source>
+ <translation>A</translation>
+ </message>
+ <message>
+ <source>B</source>
+ <translation>B</translation>
+ </message>
+ <message>
+ <source>C</source>
+ <translation>C</translation>
+ </message>
+ <message>
+ <source>D</source>
+ <translation>D</translation>
+ </message>
+ <message>
+ <source>E</source>
+ <translation>E</translation>
+ </message>
+ <message>
+ <source>F</source>
+ <translation>F</translation>
+ </message>
+ <message>
+ <source>G</source>
+ <translation>G</translation>
+ </message>
+ <message>
+ <source>H</source>
+ <translation>H</translation>
+ </message>
+ <message>
+ <source>I</source>
+ <translation>I</translation>
+ </message>
+ <message>
+ <source>J</source>
+ <translation>J</translation>
+ </message>
+ <message>
+ <source>K</source>
+ <translation>K</translation>
+ </message>
+ <message>
+ <source>L</source>
+ <translation>L</translation>
+ </message>
+ <message>
+ <source>M</source>
+ <translation>M</translation>
+ </message>
+ <message>
+ <source>N</source>
+ <translation>N</translation>
+ </message>
+ <message>
+ <source>1</source>
+ <translation>1</translation>
+ </message>
+ <message>
+ <source>2</source>
+ <translation>2</translation>
+ </message>
+ <message>
+ <source>3</source>
+ <translation>3</translation>
+ </message>
+ <message>
+ <source>4</source>
+ <translation>4</translation>
+ </message>
+ <message>
+ <source>5</source>
+ <translation>5</translation>
+ </message>
+ <message>
+ <source>6</source>
+ <translation>6</translation>
+ </message>
+ <message>
+ <source>7</source>
+ <translation>7</translation>
+ </message>
+ <message>
+ <source>8</source>
+ <translation>8</translation>
+ </message>
+ <message>
+ <source>9</source>
+ <translation>9</translation>
+ </message>
+ <message>
+ <source>10</source>
+ <translation>10</translation>
+ </message>
+ <message>
+ <source>11</source>
+ <translation>11</translation>
+ </message>
+ <message>
+ <source>12</source>
+ <translation>12</translation>
+ </message>
+ <message>
+ <source>13</source>
+ <translation>13</translation>
+ </message>
+ <message>
+ <source>14</source>
+ <translation>14</translation>
+ </message>
+ <message>
+ <source>Color Plot</source>
+ <translation>彩色绘图</translation>
+ </message>
+ <message>
+ <source>P</source>
+ <translation>P</translation>
+ </message>
+ <message>
+ <source>Q</source>
+ <translation>Q</translation>
+ </message>
+ <message>
+ <source>R</source>
+ <translation>R</translation>
+ </message>
+ <message>
+ <source>S</source>
+ <translation>S</translation>
+ </message>
+ <message>
+ <source>T</source>
+ <translation>T</translation>
+ </message>
+ <message>
+ <source>U</source>
+ <translation>U</translation>
+ </message>
+ <message>
+ <source>V</source>
+ <translation>V</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>å–消</translation>
+ </message>
+ <message>
+ <source>Use Factory Defaults</source>
+ <translation>使用出厂默认设置</translation>
+ </message>
+</context>
+<context>
+ <name>ColorCalForm2_base</name>
+ <message>
+ <source>HP Device Manager - Color Calibration</source>
+ <translation>HP 设备管ç†å™¨ – 色彩校准</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>å–消</translation>
+ </message>
+ <message>
+ <source>Next &gt;</source>
+ <translation>下一步 &gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;A page of color patches is printing. When it is complete, follow these steps:&lt;/b&gt;
+&lt;p&gt;&lt;b&gt;1.&lt;/b&gt; Hold the page approximately 8 inches (~20cm) in front of your eyes.
+&lt;p&gt;&lt;b&gt;2.&lt;/b&gt; Slowly move the page away from you until the numbered patches fade to match the background.
+&lt;p&gt;&lt;b&gt;3.&lt;/b&gt; Select the number (below) between &lt;i&gt;1&lt;/i&gt; and &lt;i&gt;81 &lt;/i&gt;of the numbered patch that &lt;b&gt;best &lt;/b&gt;matches the background:</source>
+ <translation>&lt;b&gt;正在打å°ä¸€é¡µé¢œè‰²è¡¥ç¼€ã€‚打å°å®ŒæˆåŽï¼Œè¯·æ‰§è¡Œä¸‹åˆ—步骤:&lt;/b&gt;
+&lt;p&gt;&lt;b&gt;1.&lt;/b&gt;将纸张放在眼å‰çº¦ 8 英寸 (~20cm) çš„ä½ç½®ã€‚
+&lt;p&gt;&lt;b&gt;2.&lt;/b&gt;将纸张缓缓移å‘远处,直到编å·è¡¥ç¼€æ·¡åŒ–至与背景相匹é…。
+&lt;p&gt;&lt;b&gt;3.&lt;/b&gt;从以下介于 &lt;i&gt;1&lt;/i&gt; 到 &lt;i&gt;81 &lt;/i&gt;之间的数字选择与背景颜色lt;b&gt;最&lt;/b&gt;匹é…的颜色补缀编å·ï¼š</translation>
+ </message>
+ <message>
+ <source>Number of best matching patch (1-81):</source>
+ <translation>最匹é…è¡¥ç¼€çš„ç¼–å· (1-81):</translation>
+ </message>
+</context>
+<context>
+ <name>ColorCalForm_base</name>
+ <message>
+ <source>HP Device Manager - Color Calibration</source>
+ <translation>HP 设备管ç†å™¨ – 色彩校准</translation>
+ </message>
+ <message>
+ <source>Next &gt;</source>
+ <translation>下一步 &gt;</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>å–消</translation>
+ </message>
+ <message>
+ <source>Color Calibration</source>
+ <translation>色彩校准</translation>
+ </message>
+ <message>
+ <source>1</source>
+ <translation>1</translation>
+ </message>
+ <message>
+ <source>2</source>
+ <translation>2</translation>
+ </message>
+ <message>
+ <source>3</source>
+ <translation>3</translation>
+ </message>
+ <message>
+ <source>4</source>
+ <translation>4</translation>
+ </message>
+ <message>
+ <source>5</source>
+ <translation>5</translation>
+ </message>
+ <message>
+ <source>6</source>
+ <translation>6</translation>
+ </message>
+ <message>
+ <source>7</source>
+ <translation>7</translation>
+ </message>
+ <message>
+ <source>Choose the numbered image labeled &quot;1&quot; thru &quot;7&quot; that is &lt;b&gt;best color matched&lt;/b&gt; to the image labeled &quot;X&quot;.</source>
+ <translation>从标记为 &quot;1&quot; 到 &quot;7&quot; çš„ç¼–å·å›¾åƒä¸­ï¼Œé€‰æ‹©ä¸Žæ ‡è®°ä¸º &quot;X&quot; 的图åƒ&lt;b&gt;颜色最匹é…&lt;/b&gt;çš„ç¼–å·å›¾åƒã€‚</translation>
+ </message>
+</context>
+<context>
+ <name>CoverpageForm_base</name>
+ <message>
+ <source>HP Device Manager - Coverpages</source>
+ <translation>HP 设备管ç†å™¨ – 首页</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>å–消</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>确定</translation>
+ </message>
+ <message>
+ <source>Coverpage Design</source>
+ <translation>首页设计</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Choose coverpage and enter optional message.&lt;b&gt;</source>
+ <translation>&lt;b&gt;选择首页并输入å¯é€‰ä¿¡æ¯ã€‚&lt;b&gt;</translation>
+ </message>
+ <message>
+ <source>Regarding:</source>
+ <translation>关于:</translation>
+ </message>
+ <message>
+ <source>Optional Message &lt;i&gt;(Maximum 2048 characters or 32 lines preformatted)&lt;/i&gt;:</source>
+ <translation>å¯é€‰ä¿¡æ¯&lt;i&gt;(最多 2048 个字符,或预设格å¼ä¸º 32 行)&lt;/i&gt;:</translation>
+ </message>
+ <message>
+ <source>Preformatted (preserve formatting)</source>
+ <translation>已预设格å¼ï¼ˆä¿ç•™æ ¼å¼ï¼‰</translation>
+ </message>
+</context>
+<context>
+ <name>DevMgr4</name>
+ <message>
+ <source>Functions</source>
+ <translation>功能</translation>
+ </message>
+ <message>
+ <source>Functions &gt; Print</source>
+ <translation>功能 &gt; 打å°</translation>
+ </message>
+ <message>
+ <source>Functions &gt; Make Copies</source>
+ <translation>功能 &gt; 制作备份</translation>
+ </message>
+ <message>
+ <source>Functions &gt; Fax</source>
+ <translation>功能 &gt; 传真</translation>
+ </message>
+ <message>
+ <source>Functions &gt; Unload Photo Card</source>
+ <translation>功能 &gt; å¸ä¸‹ç…§ç‰‡å¡</translation>
+ </message>
+ <message>
+ <source>Tools</source>
+ <translation>工具</translation>
+ </message>
+ <message>
+ <source>Tools &gt; Device Information</source>
+ <translation>工具 &gt; 设备信æ¯</translation>
+ </message>
+ <message>
+ <source>Tools &gt; Printer Information</source>
+ <translation>工具 &gt; 打å°æœºä¿¡æ¯</translation>
+ </message>
+ <message>
+ <source>Tools &gt; Print Test Page</source>
+ <translation>工具 &gt; 打å°æµ‹è¯•é¡µ</translation>
+ </message>
+ <message>
+ <source>Printer Name:</source>
+ <translation>打å°æœºå称:</translation>
+ </message>
+ <message>
+ <source>Print &gt;&gt;</source>
+ <translation>æ‰“å° &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>Print...</source>
+ <translation>打å°...</translation>
+ </message>
+ <message>
+ <source>Scan &gt;&gt;</source>
+ <translation>扫æ &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>Scan...</source>
+ <translation>扫æ...</translation>
+ </message>
+ <message>
+ <source>Access Photo Cards &gt;&gt;</source>
+ <translation>读å–ç…§ç‰‡å¡ &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>Access Photo Cards...</source>
+ <translation>读å–照片å¡...</translation>
+ </message>
+ <message>
+ <source>Send Fax &gt;&gt;</source>
+ <translation>å‘é€ä¼ çœŸ &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>Send Fax...</source>
+ <translation>å‘é€ä¼ çœŸ...</translation>
+ </message>
+ <message>
+ <source>Make Copies &gt;&gt;</source>
+ <translation>制作备份 &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>Make Copies...</source>
+ <translation>制作备份...</translation>
+ </message>
+ <message>
+ <source>Device Settings...</source>
+ <translation>设备设置...</translation>
+ </message>
+ <message>
+ <source>Refresh Device</source>
+ <translation>刷新设备</translation>
+ </message>
+ <message>
+ <source>Refresh All</source>
+ <translation>全部刷新</translation>
+ </message>
+ <message>
+ <source>HP Device Manager - %1</source>
+ <translation>HP 设备管ç†å™¨ - %1</translation>
+ </message>
+ <message>
+ <source>Refreshing Device List - HP Device Manager</source>
+ <translation>刷新设备列表 - HP 设备管ç†å™¨</translation>
+ </message>
+ <message>
+ <source>Refreshing device list...</source>
+ <translation>正在刷新设备列表...</translation>
+ </message>
+ <message>
+ <source>Press F6 to refresh.</source>
+ <translation>按 F6 刷新。</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Photocards on your printer are only available by mounting them as drives using USB mass storage.&lt;/b&gt;&lt;p&gt;Please refer to your distribution&apos;s documentation for setup and usage instructions.</source>
+ <translation>&lt;p&gt;&lt;b&gt;仅当将打å°æœºä¸Šçš„照片å¡ä½œä¸ºé‡‡ç”¨ USB 大容é‡å­˜å‚¨å™¨çš„驱动器进行加载时,方å¯å¯¹å…¶è¿›è¡Œä½¿ç”¨ã€‚&lt;/b&gt;&lt;p&gt;请å‚阅分å‘文档以了解其设置和使用说明。</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Unable to run command. No command specified.&lt;/b&gt;&lt;p&gt;Use &lt;pre&gt;Configure...&lt;/pre&gt; to specify a command to run.</source>
+ <translation>&lt;p&gt;&lt;b&gt;无法è¿è¡Œå‘½ä»¤ã€‚未指定命令。&lt;/b&gt;&lt;p&gt;请使用&lt;pre&gt;é…ç½®...&lt;/pre&gt; 以指定è¦è¿è¡Œçš„命令。</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Unable to find an appropriate su/sudo utility to run hp-setup.&lt;/b&gt;</source>
+ <translation>&lt;b&gt;无法找到相应的 su/sudo 实用程åºæ¥è¿è¡Œ hp-setup。&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Annoying Confirmation: Are you sure you want to remove this device?&lt;/b&gt;</source>
+<translation>&lt;b&gt;多余项确认:确定è¦åˆ é™¤è¯¥è®¾å¤‡å—?&lt;/b&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>DevMgr4_base</name>
+ <message>
+ <source>HP Device Manager</source>
+ <translation>HP 设备管ç†å™¨</translation>
+ </message>
+ <message>
+ <source>Functions</source>
+ <translation>功能</translation>
+ </message>
+ <message>
+ <source>Status</source>
+ <translation>状æ€</translation>
+ </message>
+ <message>
+ <source>Supplies</source>
+ <translation>耗æ</translation>
+ </message>
+ <message>
+ <source>Tools</source>
+ <translation>工具</translation>
+ </message>
+ <message>
+ <source>Print Settings</source>
+ <translation>打å°è®¾ç½®</translation>
+ </message>
+ <message>
+ <source>Print Control</source>
+ <translation>打å°æŽ§åˆ¶</translation>
+ </message>
+ <message>
+ <source>Contents</source>
+ <translation>内容</translation>
+ </message>
+ <message>
+ <source>&amp;Contents...</source>
+ <translation>&amp;内容...</translation>
+ </message>
+ <message>
+ <source>Help Contents (F1)</source>
+ <translation>帮助内容 (F1)</translation>
+ </message>
+ <message>
+ <source>F1</source>
+ <translation>F1</translation>
+ </message>
+ <message>
+ <source>Index</source>
+ <translation>索引</translation>
+ </message>
+ <message>
+ <source>&amp;Index...</source>
+ <translation>&amp;索引...</translation>
+ </message>
+ <message>
+ <source>&amp;About...</source>
+ <translation>&amp;关于...</translation>
+ </message>
+ <message>
+ <source>About HP Device Manager...</source>
+ <translation>关于 HP 设备管ç†å™¨...</translation>
+ </message>
+ <message>
+ <source>Refresh Device</source>
+ <translation>刷新设备</translation>
+ </message>
+ <message>
+ <source>Refresh Device (F5)</source>
+ <translation>刷新设备 (F5)</translation>
+ </message>
+ <message>
+ <source>F5</source>
+ <translation>F5</translation>
+ </message>
+ <message>
+ <source>Exit</source>
+ <translation>退出</translation>
+ </message>
+ <message>
+ <source>Exit HP Device Manager</source>
+ <translation>退出 HP 设备管ç†å™¨</translation>
+ </message>
+ <message>
+ <source>Ctrl+Q</source>
+ <translation>Ctrl+Q</translation>
+ </message>
+ <message>
+ <source>Popup Alerts...</source>
+ <translation>弹出å¼è­¦æŠ¥...</translation>
+ </message>
+ <message>
+ <source>Popup alerts...</source>
+ <translation>弹出å¼è­¦æŠ¥...</translation>
+ </message>
+ <message>
+ <source>Configure popup alerts</source>
+ <translation>é…置弹出å¼è­¦æŠ¥</translation>
+ </message>
+ <message>
+ <source>Email alerts...</source>
+ <translation>电å­é‚®ä»¶è­¦æŠ¥...</translation>
+ </message>
+ <message>
+ <source>Configure email alerts</source>
+ <translation>é…置电å­é‚®ä»¶è­¦æŠ¥</translation>
+ </message>
+ <message>
+ <source>Settings...</source>
+ <translation>设置...</translation>
+ </message>
+ <message>
+ <source>F2</source>
+ <translation>F2</translation>
+ </message>
+ <message>
+ <source>Refresh All</source>
+ <translation>全部刷新</translation>
+ </message>
+ <message>
+ <source>F6</source>
+ <translation>F6</translation>
+ </message>
+ <message>
+ <source>Auto Refresh</source>
+ <translation>自动刷新</translation>
+ </message>
+ <message>
+ <source>Turn on/off Auto Refresh (Ctrl+A)</source>
+ <translation>打开/关闭自动刷新 (Ctrl+A)</translation>
+ </message>
+ <message>
+ <source>Ctrl+A</source>
+ <translation>Ctrl+A</translation>
+ </message>
+ <message>
+ <source>Action</source>
+ <translation>æ“作</translation>
+ </message>
+ <message>
+ <source>Device Settings (F3)</source>
+ <translation>设备设置 (F3)</translation>
+ </message>
+ <message>
+ <source>F3</source>
+ <translation>F3</translation>
+ </message>
+ <message>
+ <source>Support...</source>
+ <translation>支æŒ...</translation>
+ </message>
+ <message>
+ <source>Setup New Device...</source>
+ <translation>设置新设备...</translation>
+ </message>
+ <message>
+ <source>Ins</source>
+ <translation>Ins</translation>
+ </message>
+ <message>
+ <source>Remove Device...</source>
+ <translation>删除设备...</translation>
+ </message>
+ <message>
+ <source>Del</source>
+ <translation>Del</translation>
+ </message>
+ <message>
+ <source>Device</source>
+ <translation>设备</translation>
+ </message>
+ <message>
+ <source>Configure</source>
+ <translation>é…ç½®</translation>
+ </message>
+ <message>
+ <source>&amp;Help</source>
+ <translation>&amp;帮助</translation>
+ </message>
+</context>
+<context>
+ <name>FaxAddrBookEditForm</name>
+ <message>
+ <source>New Fax Group</source>
+ <translation type="obsolete">新建传真组</translation>
+ </message>
+ <message>
+ <source>New Group Name:</source>
+ <translation type="obsolete">新组å称:</translation>
+ </message>
+</context>
+<context>
+ <name>FaxAddrBookEditForm_base</name>
+ <message>
+ <source>Group Name</source>
+ <translation>组å称</translation>
+ </message>
+ <message>
+ <source>HP Device Manager - Fax Address Book Entry</source>
+ <translation>HP 设备管ç†å™¨ – 传真通讯簿项目</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>å–消</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>确定</translation>
+ </message>
+ <message>
+ <source>First Name:</source>
+ <translation>å字:</translation>
+ </message>
+ <message>
+ <source>New Group...</source>
+ <translation type="obsolete">新建组...</translation>
+ </message>
+ <message>
+ <source>Member of Group(s):</source>
+ <translation>组æˆå‘˜ï¼š</translation>
+ </message>
+ <message>
+ <source>Last Name:</source>
+ <translation>姓æ°ï¼š</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Fax Number:&lt;/b&gt;</source>
+ <translation>&lt;b&gt;传真å·ç ï¼š&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Notes/Other Information:</source>
+ <translation>注释/其他信æ¯ï¼š</translation>
+ </message>
+ <message>
+ <source>Title:</source>
+ <translation>标题:</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Nickname:&lt;/b&gt;</source>
+ <translation type="obsolete">&lt;b&gt;昵称:&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Note: Items in &lt;b&gt;bold&lt;/b&gt; are required fields.</source>
+ <translation>注释:&lt;b&gt;粗体&lt;/b&gt;项目为必填字段。</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Name/Nickname:&lt;/b&gt;</source>
+ <translation>&lt;b&gt;姓å/昵称:&lt;/b&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>FaxAddrBookForm</name>
+ <message>
+ <source>New...</source>
+ <translation>新建...</translation>
+ </message>
+ <message>
+ <source>Edit...</source>
+ <translation>编辑...</translation>
+ </message>
+ <message>
+ <source>Delete...</source>
+ <translation>删除...</translation>
+ </message>
+ <message>
+ <source>Refresh List</source>
+ <translation>刷新列表</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Annoying Confirmation: Are you sure you want to delete this address book entry?&lt;/b&gt;</source>
+<translation>&lt;b&gt;多余项确认:确定è¦åˆ é™¤è¯¥é€šè®¯ç°¿é¡¹ç›®å—?&lt;/b&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>FaxAddrBookForm_base</name>
+ <message>
+ <source>Nickname</source>
+ <translation>昵称</translation>
+ </message>
+ <message>
+ <source>Title</source>
+ <translation>标题</translation>
+ </message>
+ <message>
+ <source>First Name</source>
+ <translation>åå­—</translation>
+ </message>
+ <message>
+ <source>Last Name</source>
+ <translation>姓æ°</translation>
+ </message>
+ <message>
+ <source>Fax Number</source>
+ <translation>传真å·ç </translation>
+ </message>
+ <message>
+ <source>Member of Group(s)</source>
+ <translation>组æˆå‘˜</translation>
+ </message>
+ <message>
+ <source>Notes/Other Information</source>
+ <translation>注释/其他信æ¯</translation>
+ </message>
+ <message>
+ <source>HP Device Manager - Fax Address Book</source>
+ <translation>HP 设备管ç†å™¨ – 传真通讯簿</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>确定</translation>
+ </message>
+ <message>
+ <source>New...</source>
+ <translation>新建...</translation>
+ </message>
+ <message>
+ <source>Edit...</source>
+ <translation>编辑...ui</translation>
+ </message>
+ <message>
+ <source>Delete...</source>
+ <translation>删除...</translation>
+ </message>
+ <message>
+ <source>Groups...</source>
+ <translation>组...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Fax Addresses:&lt;/b&gt;</source>
+ <translation>&lt;b&gt;传真地å€ï¼š&lt;/b&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>FaxAddrBookGroupEditForm_base</name>
+ <message>
+ <source>Group Members</source>
+ <translation>组æˆå‘˜</translation>
+ </message>
+ <message>
+ <source>HP Device Manager - Fax Address Book Group</source>
+ <translation>HP 设备管ç†å™¨ – 传真通讯簿组</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Group Name:&lt;/b&gt;</source>
+ <translation>&lt;b&gt;组å称:&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Member Address Book Entries:&lt;/b&gt;</source>
+ <translation>&lt;b&gt;æˆå‘˜é€šè®¯ç°¿é¡¹ç›®ï¼š&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>确定</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>å–消</translation>
+ </message>
+</context>
+<context>
+ <name>FaxAddrBookGroupsForm</name>
+ <message>
+ <source>New...</source>
+ <translation>新建...</translation>
+ </message>
+ <message>
+ <source>Edit...</source>
+ <translation>编辑...</translation>
+ </message>
+ <message>
+ <source>Delete...</source>
+ <translation>删除...</translation>
+ </message>
+ <message>
+ <source>Refresh List</source>
+ <translation>刷新列表</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Annoying Confirmation: Are you sure you want to delete this group?&lt;/b&gt;</source>
+<translation>&lt;b&gt;多余项确认:确定è¦åˆ é™¤è¯¥ç»„å—?&lt;/b&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>FaxAddrBookGroupsForm_base</name>
+ <message>
+ <source>Group Name</source>
+ <translation>组å称</translation>
+ </message>
+ <message>
+ <source>Group Members</source>
+ <translation>组æˆå‘˜</translation>
+ </message>
+ <message>
+ <source>HP Device Manager - Fax Address Book Groups</source>
+ <translation>HP 设备管ç†å™¨ – 传真通讯簿组</translation>
+ </message>
+ <message>
+ <source>New...</source>
+ <translation>新建...</translation>
+ </message>
+ <message>
+ <source>Delete...</source>
+ <translation>删除...</translation>
+ </message>
+ <message>
+ <source>Edit...</source>
+ <translation>编辑...</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>确定</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Groups:&lt;/b&gt;</source>
+ <translation>&lt;b&gt;组:&lt;/b&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>FaxSendJobForm</name>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;You may not specify both a printer (-p) and a device (-d).</source>
+ <translation>&lt;p&gt;&lt;b&gt;ä¸å¾—åŒæ—¶æŒ‡å®šæ‰“å°æœº (-p) 和设备 (-d)。</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Unknown printer name: %1&lt;/b&gt;&lt;p&gt;Please check the printer name and try again.</source>
+ <translation>&lt;b&gt;未知打å°æœºå称:%1&lt;/b&gt;&lt;p&gt;请检查打å°æœºå称并é‡è¯•ã€‚</translation>
+ </message>
+ <message>
+ <source>You must specify a printer that has a device URI in the form &apos;hpfax:/...&apos;</source>
+ <translation>必须指定设备 URI 形为 &apos;hpfax:/...&apos; 的打å°æœºã€‚</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;No devices found.&lt;/b&gt;&lt;p&gt;Please make sure your device is properly installed and try again.</source>
+ <translation>&lt;p&gt;&lt;b&gt;未找到任何设备。&lt;/b&gt;&lt;p&gt;请确认已正确安装设备并é‡è¯•ã€‚</translation>
+ </message>
+ <message>
+ <source>HP Device Manager - Send Fax</source>
+ <translation>HP 设备管ç†å™¨ – å‘é€ä¼ çœŸ</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Fax send completed successfully.&lt;/b&gt;</source>
+ <translation>&lt;p&gt;&lt;b&gt;å·²æˆåŠŸå‘é€ä¼ çœŸã€‚&lt;/b&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>FaxSettingsForm_base</name>
+ <message>
+ <source>HP Device Manager - Fax Settings</source>
+ <translation>HP 设备管ç†å™¨ – 传真设置</translation>
+ </message>
+ <message>
+ <source>Fax Header Information</source>
+ <translation>传真标题信æ¯</translation>
+ </message>
+ <message>
+ <source>Device Fax Number:</source>
+ <translation>设备传真å·ç ï¼š</translation>
+ </message>
+ <message>
+ <source>Name and/or Company:</source>
+ <translation>å称和/或公å¸ï¼š</translation>
+ </message>
+ <message>
+ <source>&lt;i&gt;This information will appear at the top of each fax that you send.&lt;/i&gt;</source>
+ <translation>&lt;i&gt;此信æ¯å°†æ˜¾ç¤ºäºŽæ¯ä»½æ‰€å‘é€ä¼ çœŸçš„顶部。&lt;/i&gt;</translation>
+ </message>
+ <message>
+ <source>Coverpage Information</source>
+ <translation>首页信æ¯</translation>
+ </message>
+ <message>
+ <source>Voice phone number:</source>
+ <translation>语音电è¯å·ç ï¼š</translation>
+ </message>
+ <message>
+ <source>Email address:</source>
+ <translation>电å­é‚®ä»¶åœ°å€ï¼š</translation>
+ </message>
+ <message>
+ <source>&lt;i&gt;This information will appear on any coverpage that you send.&lt;/i&gt;</source>
+ <translation>&lt;i&gt;此信æ¯å°†æ˜¾ç¤ºäºŽæ‰€å‘é€çš„æ¯ä¸ªé¦–页上。&lt;/i&gt;</translation>
+ </message>
+ <message>
+ <source>Information</source>
+ <translation>ä¿¡æ¯</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Configure device settings for sending faxes.&lt;/b&gt;</source>
+ <translation>&lt;b&gt;é…ç½®å‘é€ä¼ çœŸæ‰€ç”¨çš„设备设置。&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>å–消</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>确定</translation>
+ </message>
+</context>
+<context>
+ <name>ImagePropertiesDlg_base</name>
+ <message>
+ <source>EXIF Labels</source>
+ <translation>EXIF 标签</translation>
+ </message>
+ <message>
+ <source>Contents </source>
+ <translation>内容</translation>
+ </message>
+ <message>
+ <source>Properties for</source>
+ <translation>对象属性</translation>
+ </message>
+ <message>
+ <source>MIME Type:</source>
+ <translation>MIME 类型:</translation>
+ </message>
+ <message>
+ <source>Size:</source>
+ <translation>尺寸:</translation>
+ </message>
+ <message>
+ <source>Location:</source>
+ <translation>ä½ç½®ï¼š</translation>
+ </message>
+ <message>
+ <source>LOCATION</source>
+ <translation>ä½ç½®</translation>
+ </message>
+ <message>
+ <source>MIME TYPE</source>
+ <translation>MIME 类型</translation>
+ </message>
+ <message>
+ <source>SIZE</source>
+ <translation>尺寸</translation>
+ </message>
+ <message>
+ <source>FILENAME</source>
+ <translation>文件å</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>确定</translation>
+ </message>
+</context>
+<context>
+ <name>LoadPaperForm_base</name>
+ <message>
+ <source>HP Device Manager - Load Plain Paper</source>
+ <translation>HP 设备管ç†å™¨ – 载入普通纸</translation>
+ </message>
+ <message>
+ <source>Continue</source>
+ <translation>继续</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>å–消</translation>
+ </message>
+ <message>
+ <source>A page will be printed. Please load &lt;b&gt;plain paper&lt;/b&gt; in the printer and then press continue.</source>
+ <translation>将打å°ä¸€é¡µã€‚请在打å°æœºä¸­è½½å…¥&lt;b&gt;普通纸&lt;/b&gt;,然åŽæŒ‰ç»§ç»­ã€‚</translation>
+ </message>
+</context>
+<context>
+ <name>MakeCopiesForm</name>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;You may not specify both a printer (-p) and a device (-d).</source>
+ <translation>&lt;p&gt;&lt;b&gt;ä¸å¾—åŒæ—¶æŒ‡å®šæ‰“å°æœº (-p) 和设备 (-d)。</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;No devices found.&lt;/b&gt;&lt;p&gt;Please make sure your device is properly installed and try again.</source>
+ <translation>&lt;p&gt;&lt;b&gt;未找到任何设备。&lt;/b&gt;&lt;p&gt;请确认已正确安装设备并é‡è¯•ã€‚</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Sorry, make copies functionality is not implemented for this device.&lt;/b&gt;</source>
+ <translation>&lt;b&gt;对ä¸èµ·ï¼Œæ— æ³•ä¸ºæ­¤è®¾å¤‡æ‰§è¡Œå¤‡ä»½åˆ¶ä½œåŠŸèƒ½ã€‚&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>HP Device Manager - Make Copies</source>
+ <translation>HP 设备管ç†å™¨ – 制作备份</translation>
+ </message>
+</context>
+<context>
+ <name>MakeCopiesForm_base</name>
+ <message>
+ <source>HP Device Manager - Make Copies</source>
+ <translation>HP 设备管ç†å™¨ – 制作备份</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>关闭</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Make copies.&lt;/b&gt;</source>
+ <translation>&lt;b&gt;制作备份。&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Make Copies</source>
+ <translation>制作备份</translation>
+ </message>
+ <message>
+ <source>Quality:</source>
+ <translation>è´¨é‡ï¼š</translation>
+ </message>
+ <message>
+ <source>Fast</source>
+ <translation>快速</translation>
+ </message>
+ <message>
+ <source>Draft</source>
+ <translation>è‰å›¾</translation>
+ </message>
+ <message>
+ <source>Normal</source>
+ <translation>标准</translation>
+ </message>
+ <message>
+ <source>Presentation</source>
+ <translation>演示</translation>
+ </message>
+ <message>
+ <source>Best</source>
+ <translation>最佳</translation>
+ </message>
+ <message>
+ <source>Number of Copies:</source>
+ <translation>备份数é‡ï¼š</translation>
+ </message>
+ <message>
+ <source>Contrast:</source>
+ <translation>对比度:</translation>
+ </message>
+ <message>
+ <source>&#43;0</source>
+ <translation>&#43;0</translation>
+ </message>
+ <message>
+ <source>Enlargement/Reduction:</source>
+ <translation>放大/缩å°</translation>
+ </message>
+ <message>
+ <source>400%</source>
+ <translation>400%</translation>
+ </message>
+ <message>
+ <source>Fit to page</source>
+ <translation>调整为页é¢å¤§å°</translation>
+ </message>
+ <message>
+ <source>Copy</source>
+ <translation>å¤åˆ¶</translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation>å称:</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Device information/status and output queue name.&lt;/b&gt;</source>
+ <translation>&lt;b&gt;设备信æ¯/状æ€å’Œè¾“出队列å称。&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Status:</source>
+ <translation>状æ€ï¼š</translation>
+ </message>
+ <message>
+ <source>Refresh status</source>
+ <translation>刷新状æ€</translation>
+ </message>
+ <message>
+ <source>Comment:</source>
+ <translation>备注:</translation>
+ </message>
+ <message>
+ <source>Location:</source>
+ <translation>ä½ç½®ï¼š</translation>
+ </message>
+ <message>
+ <source>Device URI:</source>
+ <translation>设备 URI:</translation>
+ </message>
+ <message>
+ <source>Device</source>
+ <translation>设备</translation>
+ </message>
+</context>
+<context>
+ <name>NoDevicesForm</name>
+ <message>
+ <source>&lt;b&gt;Unable to find an appropriate su/sudo utility to run hp-setup.&lt;/b&gt;</source>
+ <translation>&lt;b&gt;无法找到相应的 su/sudo 实用程åºæ¥è¿è¡Œ hp-setup。&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;An I/O error occurred.&lt;/b&gt;&lt;p&gt;Please re-start the Device Manager and try again.</source>
+<translation>&lt;b&gt;å‘生了 I/O 错误。&lt;/b&gt;&lt;p&gt;请é‡æ–°å¯åŠ¨è®¾å¤‡ç®¡ç†å™¨ï¼Œç„¶åŽé‡è¯•ã€‚</translation>
+ </message>
+</context>
+<context>
+ <name>NoDevicesForm_base</name>
+ <message>
+ <source>HP Device Manager - No Installed HP Devices Found</source>
+ <translation>HP 设备管ç†å™¨ – 未找到已安装的 HP 设备</translation>
+ </message>
+ <message>
+ <source>Setup Device...</source>
+ <translation>安装设备...</translation>
+ </message>
+ <message>
+ <source>CUPS Web Interface</source>
+ <translation>CUPS Web ç•Œé¢</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>关闭</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;&lt;font size=&quot;+2&quot;&gt;No Installed HP Devices Found.&lt;/font&gt;&lt;/b&gt;&lt;p&gt;To install a device, use one of the following methods:&lt;p&gt;
+1. Run &lt;b&gt;hp-setup&lt;/b&gt; (in a shell/terminal or click &lt;tt&gt;Setup Device...&lt;/tt&gt; below).&lt;p&gt;
+2. &lt;b&gt;CUPS web interface&lt;/b&gt; (open a browser to: &lt;u&gt;http://localhost:631&lt;/u&gt; or press the button below),&lt;p&gt;
+3. The &lt;b&gt;printer installation utility&lt;/b&gt; that came with your operating system (YaST, PrinterDrake, etc).
+&lt;p&gt;&lt;p&gt;After setting up a printer, you may have to press &lt;tt&gt;F6&lt;/tt&gt; or chose &lt;tt&gt;Device | Refresh All&lt;/tt&gt; for the printer to appear in the HP Device Manager.&lt;p&gt;
+&lt;i&gt;&lt;b&gt;Note: Only devices installed with the &lt;tt&gt;hp:&lt;/tt&gt; CUPS backend will appear in the HP Device Manager.&lt;/b&gt;&lt;/i&gt;&lt;p&gt;</source>
+ <translation>&lt;b&gt;&lt;font size=&quot;+2&quot;&gt;未找到已安装的 HP 设备。&lt;/font&gt;&lt;/b&gt;&lt;p&gt;è¦å®‰è£…设备,请采用下列任一方法:&lt;p&gt;
+1. è¿è¡Œ &lt;b&gt;hp-setup&lt;/b&gt;(在 shell/终端中或å•å‡»ä¸‹æ–¹çš„&lt;tt&gt;安装设备...&lt;/tt&gt;)。&lt;p&gt;
+2. &lt;b&gt;CUPS web ç•Œé¢&lt;/b&gt;(打开æµè§ˆå™¨è¾“入:&lt;u&gt;http://localhost:631&lt;/u&gt; 或按下方的按钮),&lt;p&gt;
+3. æ“作系统附带的&lt;b&gt;打å°æœºå®‰è£…实用程åº&lt;/b&gt;(YaSTã€PrinterDrake 等)。
+&lt;p&gt;&lt;p&gt;完æˆæ‰“å°æœºå®‰è£…åŽï¼Œå¿…须按 &lt;tt&gt;F6&lt;/tt&gt; 或选择&lt;tt&gt;设备|全部刷新&lt;/tt&gt;以便在 HP 设备管ç†å™¨ä¸­æ˜¾ç¤ºæ‰“å°æœºã€‚&lt;p&gt;
+&lt;i&gt;&lt;b&gt;注æ„:åªæœ‰å®‰è£…了 &lt;tt&gt;hp:&lt;/tt&gt; CUPS åŽç«¯çš„设备æ‰ä¼šæ˜¾ç¤ºäºŽ HP 设备管ç†å™¨ä¸­ã€‚&lt;/b&gt;&lt;/i&gt;&lt;p&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>PaperEdgeAlignForm_base</name>
+ <message>
+ <source>HP Device Manager - Paper Edge Alignment</source>
+ <translation>HP 设备管ç†å™¨ – 纸张边缘对é½</translation>
+ </message>
+ <message>
+ <source>Next &gt;</source>
+ <translation>下一步 &gt;</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>å–消</translation>
+ </message>
+ <message>
+ <source>Paper Edge</source>
+ <translation>纸张边缘</translation>
+ </message>
+ <message>
+ <source>1</source>
+ <translation>1</translation>
+ </message>
+ <message>
+ <source>2</source>
+ <translation>2</translation>
+ </message>
+ <message>
+ <source>3</source>
+ <translation>3</translation>
+ </message>
+ <message>
+ <source>4</source>
+ <translation>4</translation>
+ </message>
+ <message>
+ <source>5</source>
+ <translation>5</translation>
+ </message>
+ <message>
+ <source>6</source>
+ <translation>6</translation>
+ </message>
+ <message>
+ <source>7</source>
+ <translation>7</translation>
+ </message>
+ <message>
+ <source>8</source>
+ <translation>8</translation>
+ </message>
+ <message>
+ <source>9</source>
+ <translation>9</translation>
+ </message>
+ <message>
+ <source>10</source>
+ <translation>10</translation>
+ </message>
+ <message>
+ <source>11</source>
+ <translation>11</translation>
+ </message>
+ <message>
+ <source>12</source>
+ <translation>12</translation>
+ </message>
+ <message>
+ <source>13</source>
+ <translation>13</translation>
+ </message>
+ <message>
+ <source>Choose the &lt;b&gt;numbered arrow&lt;/b&gt; that &lt;b&gt;best &lt;/b&gt;marks the edge of the paper.</source>
+ <translation>选择&lt;b&gt;最适于&lt;/b&gt;标记纸张边缘的&lt;b&gt;ç¼–å·ç®­å¤´&lt;/b&gt;。</translation>
+ </message>
+</context>
+<context>
+ <name>PasswordDialog</name>
+ <message>
+ <source>HP Device Manager - Enter Password</source>
+ <translation>HP 设备管ç†å™¨ – 输入密ç </translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>确定</translation>
+ </message>
+</context>
+<context>
+ <name>PowerSettingsDialog</name>
+ <message>
+ <source>15 minutes</source>
+ <translation>15 分钟</translation>
+ </message>
+ <message>
+ <source>30 minutes</source>
+ <translation>30 分钟</translation>
+ </message>
+ <message>
+ <source>45 minutes</source>
+ <translation>45 分钟</translation>
+ </message>
+ <message>
+ <source>1 hour</source>
+ <translation>1 å°æ—¶</translation>
+ </message>
+ <message>
+ <source>2 hours</source>
+ <translation>2 å°æ—¶</translation>
+ </message>
+ <message>
+ <source>3 hours</source>
+ <translation>3 å°æ—¶</translation>
+ </message>
+</context>
+<context>
+ <name>PowerSettingsDialog_base</name>
+ <message>
+ <source>HP Device Manager - Battery Mode Power Settings</source>
+ <translation>HP 设备管ç†å™¨ – 电池模å¼ç”µæºè®¾ç½®</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Configure the power off settings when operating on battery power&lt;/b&gt;</source>
+ <translation>&lt;b&gt;é…置以电池供电方å¼è¿è¡Œæ—¶çš„断电设置&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>确定</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>å–消</translation>
+ </message>
+ <message>
+ <source>Power Settings</source>
+ <translation>电æºè®¾ç½®</translation>
+ </message>
+ <message>
+ <source>Automatically turn off printer after:</source>
+ <translation>出现下列情况时自动关闭打å°æœºç”µæºï¼š</translation>
+ </message>
+ <message>
+ <source>Always leave printer on</source>
+ <translation>始终开å¯æ‰“å°æœºç”µæº</translation>
+ </message>
+</context>
+<context>
+ <name>PrinterForm</name>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;You may not specify both a printer (-p) and a device (-d).</source>
+ <translation>&lt;p&gt;&lt;b&gt;ä¸å¾—åŒæ—¶æŒ‡å®šæ‰“å°æœº (-p) 和设备 (-d)。</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;No devices found.&lt;/b&gt;&lt;p&gt;Please make sure your device is properly installed and try again.</source>
+ <translation>&lt;p&gt;&lt;b&gt;未找到任何设备。&lt;/b&gt;&lt;p&gt;请确认已正确安装设备并é‡è¯•ã€‚</translation>
+ </message>
+ <message>
+ <source>HP Device Manager - Print</source>
+ <translation>HP 设备管ç†å™¨ – 打å°</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollCopyView</name>
+ <message>
+ <source>Number of Copies</source>
+<translation>打å°æ•°é‡</translation>
+ </message>
+ <message>
+ <source>Enlargement, Reduction and Fit to Page</source>
+<translation>放大ã€ç¼©å°å’Œè°ƒæ•´ä¸ºé¡µé¢å¤§å°</translation>
+ </message>
+ <message>
+ <source>Copy Contrast</source>
+<translation>å¤å°å¯¹æ¯”度</translation>
+ </message>
+ <message>
+ <source>Copy Quality</source>
+<translation>å¤å°è´¨é‡</translation>
+ </message>
+ <message>
+ <source>&lt;&lt; Functions</source>
+<translation>&lt;&lt;功能</translation>
+ </message>
+ <message>
+ <source>Close</source>
+<translation>关闭</translation>
+ </message>
+ <message>
+ <source>Make Copies(s)</source>
+<translation>å¤å°</translation>
+ </message>
+ <message>
+ <source>Number of copies:</source>
+<translation>打å°æ•°é‡ï¼š</translation>
+ </message>
+ <message>
+ <source>Default</source>
+<translation>默认</translation>
+ </message>
+ <message>
+ <source>Quality:</source>
+<translation>è´¨é‡ï¼š</translation>
+ </message>
+ <message>
+ <source>Fast</source>
+<translation>快速</translation>
+ </message>
+ <message>
+ <source>Draft</source>
+<translation>è‰å›¾</translation>
+ </message>
+ <message>
+ <source>Normal</source>
+<translation>标准</translation>
+ </message>
+ <message>
+ <source>Presentation</source>
+<translation>演示</translation>
+ </message>
+ <message>
+ <source>Best</source>
+<translation>最佳</translation>
+ </message>
+ <message>
+ <source>Enlargement or reduction (percent):</source>
+<translation>放大或缩å°ï¼ˆç™¾åˆ†æ¯”):</translation>
+ </message>
+ <message>
+ <source>Fit to Page</source>
+<translation>放大ã€ç¼©å°å’Œè°ƒæ•´ä¸ºé¡µé¢å¤§å°</translation>
+ </message>
+ <message>
+ <source>Contrast (-5 lighter to +5 darker):</source>
+<translation>对比度(-5 浅色至 +5 深色):</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Copier error.&lt;/b&gt;&lt;p&gt;</source>
+<translation>&lt;b&gt;å¤å°æœºé”™è¯¯ã€‚&lt;/b&gt;&lt;p&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Cannot copy: Device is busy or not available.&lt;/b&gt;&lt;p&gt;Please check device and try again. [1]</source>
+<translation>&lt;b&gt;无法å¤å°ï¼šè®¾å¤‡å¿™æˆ–ä¸å¯ç”¨ã€‚&lt;/b&gt;&lt;p&gt;请检查设备并é‡è¯•ã€‚ [1]</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollDeviceInfoView</name>
+ <message>
+ <source>&lt;&lt; Tools</source>
+ <translation>&lt;&lt; 工具</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>关闭</translation>
+ </message>
+ <message>
+ <source>Device Information</source>
+ <translation>设备信æ¯</translation>
+ </message>
+ <message>
+ <source>Static/Dynamic</source>
+ <translation>é™æ€/动æ€</translation>
+ </message>
+ <message>
+ <source>Key</source>
+ <translation>é”®</translation>
+ </message>
+ <message>
+ <source>Value</source>
+ <translation>值</translation>
+ </message>
+ <message>
+ <source>Static</source>
+ <translation>é™æ€</translation>
+ </message>
+ <message>
+ <source>Dynamic</source>
+ <translation>动æ€</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollFaxView</name>
+ <message>
+ <source>PDF Document</source>
+ <translation>PDF 文档</translation>
+ </message>
+ <message>
+ <source>Postscript Document</source>
+ <translation>Postscript 文档</translation>
+ </message>
+ <message>
+ <source>HP Graphics Language File</source>
+ <translation>HP 图形语言文件</translation>
+ </message>
+ <message>
+ <source>C Shell Script</source>
+ <translation>C Shell 脚本</translation>
+ </message>
+ <message>
+ <source>C Source Code</source>
+ <translation>C æºä»£ç </translation>
+ </message>
+ <message>
+ <source>C&#43;&#43; Source Code</source>
+ <translation>C&#43;&#43; æºä»£ç </translation>
+ </message>
+ <message>
+ <source>Perl Script</source>
+ <translation>Perl 脚本</translation>
+ </message>
+ <message>
+ <source>Python Program</source>
+ <translation>Python 程åº</translation>
+ </message>
+ <message>
+ <source>Shell Script</source>
+ <translation>Shell 脚本</translation>
+ </message>
+ <message>
+ <source>Plain Text</source>
+ <translation>纯文本</translation>
+ </message>
+ <message>
+ <source>HTML Dcoument</source>
+ <translation>HTML 文档</translation>
+ </message>
+ <message>
+ <source>GIF Image</source>
+ <translation>GIF 图åƒ</translation>
+ </message>
+ <message>
+ <source>PNG Image</source>
+ <translation>PNG 图åƒ</translation>
+ </message>
+ <message>
+ <source>JPEG Image</source>
+ <translation>JPEG 图åƒ</translation>
+ </message>
+ <message>
+ <source>TIFF Image</source>
+ <translation>TIFF 图åƒ</translation>
+ </message>
+ <message>
+ <source>Bitmap (BMP) Image</source>
+ <translation>ä½å›¾ (BMP) 图åƒ</translation>
+ </message>
+ <message>
+ <source>Photo CD Image</source>
+ <translation>Photo CD 图åƒ</translation>
+ </message>
+ <message>
+ <source>Portable Image (PNM)</source>
+ <translation>便æºå¼å›¾åƒ (PNM)</translation>
+ </message>
+ <message>
+ <source>Portable B&amp;W Image (PBM)</source>
+ <translation>便æºå¼é»‘ç™½å›¾åƒ (PBM)</translation>
+ </message>
+ <message>
+ <source>Portable Grayscale Image (PGM)</source>
+ <translation>便æºå¼ç°åº¦å›¾åƒ (PGM)</translation>
+ </message>
+ <message>
+ <source>Portable Color Image (PPM)</source>
+ <translation>便æºå¼å½©è‰²å›¾åƒ (PPM)</translation>
+ </message>
+ <message>
+ <source>SGI RGB</source>
+ <translation>SGI RGB</translation>
+ </message>
+ <message>
+ <source>X11 Bitmap (XBM)</source>
+ <translation>X11 ä½å›¾ (XBM)</translation>
+ </message>
+ <message>
+ <source>X11 Pixmap (XPM)</source>
+ <translation>X11 åƒç´ å›¾ (XPM)</translation>
+ </message>
+ <message>
+ <source>Sun Raster Format</source>
+ <translation>Sun Raster æ ¼å¼</translation>
+ </message>
+ <message>
+ <source>File(s) to Fax</source>
+ <translation>待传真文件</translation>
+ </message>
+ <message>
+ <source>Add/Edit Fax Coverpage</source>
+ <translation>添加/编辑传真首页</translation>
+ </message>
+ <message>
+ <source>Recipient(s)</source>
+ <translation>收件人</translation>
+ </message>
+ <message>
+ <source>Add Recipients from the Fax Address Book</source>
+ <translation>添加æ¥è‡ªä¼ çœŸé€šè®¯ç°¿çš„收件人</translation>
+ </message>
+ <message>
+ <source>&lt;i&gt;Quick Add&lt;/i&gt; an Individual Recipient</source>
+ <translation>&lt;i&gt;快速添加&lt;/i&gt;å•ä¸ªæ”¶ä»¶äºº</translation>
+ </message>
+ <message>
+ <source>&lt;&lt; Functions</source>
+ <translation>&lt;&lt; 功能</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>关闭</translation>
+ </message>
+ <message>
+ <source>Send Fax Now</source>
+ <translation>ç«‹å³å‘é€ä¼ çœŸ</translation>
+ </message>
+ <message>
+ <source>Processing fax...</source>
+ <translation>正在处ç†ä¼ çœŸ...</translation>
+ </message>
+ <message>
+ <source>Receiving fax data...</source>
+ <translation>正在接收传真数æ®...</translation>
+ </message>
+ <message>
+ <source>Read %1 of fax data...</source>
+ <translation>å·²è¯»å– %1 的传真数æ®...</translation>
+ </message>
+ <message>
+ <source>Order</source>
+ <translation>顺åº</translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation>å称</translation>
+ </message>
+ <message>
+ <source>Type</source>
+ <translation>类型</translation>
+ </message>
+ <message>
+ <source>Pages</source>
+ <translation>页é¢</translation>
+ </message>
+ <message>
+ <source>Path</source>
+ <translation>路径</translation>
+ </message>
+ <message>
+ <source>Add File...</source>
+ <translation>添加文件...</translation>
+ </message>
+ <message>
+ <source>Show Types...</source>
+ <translation>显示类型...</translation>
+ </message>
+ <message>
+ <source>Remove File</source>
+ <translation>删除文件</translation>
+ </message>
+ <message>
+ <source>Move Down</source>
+ <translation>下移</translation>
+ </message>
+ <message>
+ <source>Move Up</source>
+ <translation>上移</translation>
+ </message>
+ <message>
+ <source>Show File Types...</source>
+ <translation>显示文件类型...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Invalid HPLIP Fax file.&lt;/b&gt;&lt;p&gt;Bad magic!</source>
+ <translation>&lt;b&gt;HPLIP 传真文件无效。&lt;/b&gt;&lt;p&gt;Bad magic!</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;You are trying to add a file that cannot be directly faxed with this utility.&lt;/b&gt;&lt;p&gt;To print this file, use the print command in the application that created it.</source>
+ <translation>&lt;b&gt;您当å‰å°è¯•æ·»åŠ çš„文件无法直接通过此实用程åºå‘é€ä¼ çœŸã€‚&lt;/b&gt;&lt;p&gt;è¦æ‰“å°æ­¤æ–‡ä»¶ï¼Œè¯·åœ¨åˆ›å»ºè¯¥æ–‡ä»¶çš„应用程åºä¸­ä½¿ç”¨æ‰“å°å‘½ä»¤ã€‚</translation>
+ </message>
+ <message>
+ <source>Processing fax file...</source>
+ <translation>正在处ç†ä¼ çœŸæ–‡ä»¶...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Printer &apos;%1&apos; is in a stopped or error state.&lt;/b&gt;&lt;p&gt;Check the printer queue in CUPS and try again.</source>
+ <translation>&lt;b&gt;打å°æœº &apos;%1&apos; 正处于åœæ­¢æˆ–错误状æ€ã€‚&lt;/b&gt;&lt;p&gt;请检查 CUPS 中的打å°æœºé˜Ÿåˆ—,并é‡è¯•ã€‚</translation>
+ </message>
+ <message>
+ <source>Edit...</source>
+ <translation>编辑...</translation>
+ </message>
+ <message>
+ <source>Add...</source>
+ <translation>添加...</translation>
+ </message>
+ <message>
+ <source>HP Fax Coverpage</source>
+ <translation>HP 传真首页</translation>
+ </message>
+ <message>
+ <source>Cover Page</source>
+ <translation>首页</translation>
+ </message>
+ <message>
+ <source>Fax Number</source>
+ <translation>传真å·ç </translation>
+ </message>
+ <message>
+ <source>Notes</source>
+ <translation>注释</translation>
+ </message>
+ <message>
+ <source>Fax Address Book...</source>
+ <translation>传真通讯簿...</translation>
+ </message>
+ <message>
+ <source>Remove</source>
+ <translation>删除</translation>
+ </message>
+ <message>
+ <source>Add Individual</source>
+ <translation>添加å•ä¸ª</translation>
+ </message>
+ <message>
+ <source>Add Group</source>
+ <translation>添加组</translation>
+ </message>
+ <message>
+ <source>Add an &lt;b&gt;individual &lt;/b&gt;from the fax address book:</source>
+ <translation>添加传真通讯簿中的&lt;b&gt;å•ä¸ª&lt;/b&gt;对象:</translation>
+ </message>
+ <message>
+ <source>Add a &lt;b&gt;group&lt;/b&gt; from the fax address book:</source>
+ <translation>添加传真通讯簿中的&lt;b&gt;组&lt;/b&gt;对象:</translation>
+ </message>
+ <message>
+ <source>Add</source>
+ <translation>添加</translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation>å称:</translation>
+ </message>
+ <message>
+ <source>Fax Number:</source>
+ <translation>传真å·ç ï¼š</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Fax configuration error.&lt;/b&gt;&lt;p&gt;The CUPS fax queue for &apos;%1&apos; is incorrectly configured.&lt;p&gt;Please make sure that the CUPS fax queue is configured with the &apos;HPLIP Fax&apos; Model/Driver.</source>
+ <translation>&lt;b&gt;传真é…置错误。&lt;/b&gt;&lt;p&gt;针对 &apos;%1&apos; çš„ CUPS 传真队列é…置有误。&lt;p&gt;请确认已通过 &apos;HPLIP 传真&apos;模å¼/驱动程åºæ¥é…ç½® CUPS 传真队列。</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Device is busy or in an error state (code=%1)&lt;/b&gt;&lt;p&gt;Please wait for the device to become idle or clear the error and try again.</source>
+ <translation>&lt;b&gt;è®¾å¤‡å¿™æˆ–å¤„äºŽé”™è¯¯çŠ¶æ€ (code=%1)&lt;/b&gt;&lt;p&gt;请等待设备å˜ä¸ºç©ºé—²çŠ¶æ€æˆ–清除错误并é‡è¯•ã€‚</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;The CUPS queue for &apos;%1&apos; is in a stopped or busy state.&lt;/b&gt;&lt;p&gt;Please check the queue and try again.</source>
+ <translation>&lt;b&gt;针对 &apos;%1&apos; çš„ CUPS 队列正处于åœæ­¢æˆ–忙碌状æ€ã€‚&lt;/b&gt;&lt;p&gt;请检查队列并é‡è¯•ã€‚</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Send fax is active.&lt;/b&gt;&lt;p&gt;Please wait for operation to complete.</source>
+ <translation>&lt;b&gt;正在å‘é€ä¼ çœŸã€‚&lt;/b&gt;&lt;p&gt;请等待æ“作完æˆã€‚</translation>
+ </message>
+ <message>
+ <source>Initializing...</source>
+ <translation>正在åˆå§‹åŒ–...</translation>
+ </message>
+ <message>
+ <source>Processing page %1...</source>
+ <translation>正在处ç†é¡µé¢ %1...</translation>
+ </message>
+ <message>
+ <source>Dialing %1...</source>
+ <translation>æ­£åœ¨æ‹¨å· %1...</translation>
+ </message>
+ <message>
+ <source>Connecting to %1...</source>
+ <translation>正在连接 %1...</translation>
+ </message>
+ <message>
+ <source>Sending page %1 to %2...</source>
+ <translation>æ­£åœ¨å‘ %2 å‘é€é¡µé¢ %1...</translation>
+ </message>
+ <message>
+ <source>Cleaning up...</source>
+ <translation>正在清除...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Fax send error.&lt;/b&gt;&lt;p&gt;</source>
+ <translation>&lt;b&gt;传真å‘é€é”™è¯¯ã€‚&lt;/b&gt;&lt;p&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Fax device is busy.&lt;/b&gt;&lt;p&gt;Please try again later.</source>
+ <translation>&lt;b&gt;传真设备忙。&lt;/b&gt;&lt;p&gt;请ç¨åŽå†è¯•ã€‚</translation>
+ </message>
+ <message>
+ <source>Added with Quick Add</source>
+<translation>使用“快速添加â€æ¥æ·»åŠ </translation>
+ </message>
+</context>
+<context>
+ <name>ScrollFunctionsView</name>
+ <message>
+ <source>Print &gt;&gt;</source>
+ <translation>æ‰“å° &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>Print...</source>
+ <translation>打å°...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Print&lt;/b&gt;</source>
+ <translation>&lt;b&gt;打å°&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Print documents or files.</source>
+ <translation>打å°æ–‡æ¡£æˆ–文件。</translation>
+ </message>
+ <message>
+ <source>Scan &gt;&gt;</source>
+ <translation>扫æ &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>Scan...</source>
+ <translation>扫æ...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Scan&lt;/b&gt;</source>
+ <translation>&lt;b&gt;扫æ&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Scan a document, image, or photograph.</source>
+ <translation>扫æ文档ã€å›¾åƒæˆ–图形。</translation>
+ </message>
+ <message>
+ <source>Send PC Fax &gt;&gt;</source>
+ <translation>å‘é€ PC 传真 &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>Send PC Fax...</source>
+ <translation>å‘é€ PC 传真...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Send PC Fax&lt;/b&gt;</source>
+ <translation>&lt;b&gt;å‘é€ PC 传真&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Send a fax from the PC.</source>
+ <translation>从 PC å‘é€ä¼ çœŸã€‚</translation>
+ </message>
+ <message>
+ <source>Make Copies &gt;&gt;</source>
+ <translation>制作备份 &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>Make Copies...</source>
+ <translation>制作备份...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Make Copies&lt;/b&gt;</source>
+ <translation>&lt;b&gt;制作备份&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Make copies on the device controlled by the PC.</source>
+ <translation>在 PC 所控制的设备上制作备份。</translation>
+ </message>
+ <message>
+ <source>Unload Photo Card &gt;&gt;</source>
+ <translation>å¸ä¸‹ç…§ç‰‡å¡ &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>Unload Photo Card...</source>
+ <translation>å¸ä¸‹ç…§ç‰‡å¡...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Unload Photo Card&lt;/b&gt;</source>
+ <translation>&lt;b&gt;å¸ä¸‹ç…§ç‰‡å¡&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Copy images from the device&apos;s photo card to the PC.</source>
+ <translation>将设备照片å¡ä¸­çš„图åƒå¤åˆ¶åˆ° PC。</translation>
+ </message>
+ <message>
+ <source>ERROR: Device not supported.</source>
+ <translation>错误:ä¸æ”¯æŒæ­¤è®¾å¤‡ã€‚</translation>
+ </message>
+ <message>
+ <source>ERROR: Device not found. Please check connection and power-on device.</source>
+ <translation>错误:未找到设备。请检查连接并开å¯è®¾å¤‡ç”µæºã€‚</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Photocards on your printer are only available by mounting them as drives using USB mass storage.&lt;/b&gt;&lt;p&gt;Please refer to your distribution&apos;s documentation for setup and usage instructions.</source>
+ <translation>&lt;p&gt;&lt;b&gt;仅当使用 USB 大容é‡å­˜å‚¨å™¨å°†æ‰“å°æœºä¸Šçš„照片å¡ä½œä¸ºé©±åŠ¨å™¨è¿›è¡ŒåŠ è½½æ—¶ï¼Œæ–¹å¯ä½¿ç”¨ã€‚&lt;/b&gt;&lt;p&gt;请å‚阅分å‘文档以了解其设置和使用说明。</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Unable to run command. No command specified.&lt;/b&gt;&lt;p&gt;Use &lt;pre&gt;Configure...&lt;/pre&gt; to specify a command to run.</source>
+ <translation>&lt;p&gt;&lt;b&gt;无法è¿è¡Œå‘½ä»¤ã€‚未指定命令。&lt;/b&gt;&lt;p&gt;请使用&lt;pre&gt;é…ç½®...&lt;/pre&gt; 以指定æŸä¸€å¾…è¿è¡Œå‘½ä»¤ã€‚</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollPrintJobView</name>
+ <message>
+ <source>Pending</source>
+ <translation>待定</translation>
+ </message>
+ <message>
+ <source>On hold</source>
+ <translation>å·²é”定</translation>
+ </message>
+ <message>
+ <source>Printing</source>
+ <translation>正在打å°</translation>
+ </message>
+ <message>
+ <source>Stopped</source>
+ <translation>å·²åœæ­¢</translation>
+ </message>
+ <message>
+ <source>Canceled</source>
+ <translation>å·²å–消</translation>
+ </message>
+ <message>
+ <source>Aborted</source>
+ <translation>已中止</translation>
+ </message>
+ <message>
+ <source>Completed</source>
+ <translation>已完æˆ</translation>
+ </message>
+ <message>
+ <source>Print Control</source>
+ <translation>打å°æŽ§åˆ¶</translation>
+ </message>
+ <message>
+ <source>Job Control</source>
+ <translation>作业控制</translation>
+ </message>
+ <message>
+ <source>1 Active Print Job</source>
+ <translation>有 1 个处于活动状æ€çš„打å°ä½œä¸š</translation>
+ </message>
+ <message>
+ <source>%1 Active Print Jobs</source>
+ <translation>有 %1 个处于活动状æ€çš„打å°ä½œä¸š</translation>
+ </message>
+ <message>
+ <source>Set as Default</source>
+ <translation>设为默认值</translation>
+ </message>
+ <message>
+ <source>SET AS DEFAULT</source>
+ <translation>设为默认值</translation>
+ </message>
+ <message>
+ <source>NOT SET AS DEFAULT</source>
+ <translation>ä¸è®¾ä¸ºé»˜è®¤å€¼</translation>
+ </message>
+ <message>
+ <source>The printer is currently: %1</source>
+ <translation>打å°æœºå½“å‰å¤„于: %1</translation>
+ </message>
+ <message>
+ <source>IDLE</source>
+ <translation>空闲</translation>
+ </message>
+ <message>
+ <source>Stop Printer</source>
+ <translation>åœæ­¢æ‰“å°æœº</translation>
+ </message>
+ <message>
+ <source>PROCESSING</source>
+ <translation>正在处ç†</translation>
+ </message>
+ <message>
+ <source>STOPPED</source>
+ <translation>å·²åœæ­¢</translation>
+ </message>
+ <message>
+ <source>Start Printer</source>
+ <translation>å¯åŠ¨æ‰“å°æœº</translation>
+ </message>
+ <message>
+ <source>ACCEPTING JOBS</source>
+ <translation>接å—作业</translation>
+ </message>
+ <message>
+ <source>Reject Jobs</source>
+ <translation>æ‹’ç»ä½œä¸š</translation>
+ </message>
+ <message>
+ <source>REJECTING JOBS</source>
+ <translation>æ‹’ç»ä½œä¸š</translation>
+ </message>
+ <message>
+ <source>Accept Jobs</source>
+ <translation>接å—作业</translation>
+ </message>
+ <message>
+ <source>Cancel all active print jobs</source>
+ <translation>å–消所有处于活动状æ€çš„打å°ä½œä¸š</translation>
+ </message>
+ <message>
+ <source>Cancel All Jobs</source>
+ <translation>å–消所有作业</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;%1&lt;/b&gt;</source>
+ <translation>&lt;b&gt;%1&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Job ID: %1</source>
+ <translation>作业 ID: %1</translation>
+ </message>
+ <message>
+ <source>Cancel Job</source>
+ <translation>å–消作业</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollPrintSettingsView</name>
+ <message>
+ <source>Basic</source>
+<translation>基本</translation>
+ </message>
+ <message>
+ <source>Page Orientation</source>
+<translation>纸张方å‘</translation>
+ </message>
+ <message>
+ <source>Portrait</source>
+<translation>纵å‘</translation>
+ </message>
+ <message>
+ <source>Landscape</source>
+<translation>横å‘</translation>
+ </message>
+ <message>
+ <source>Reverse landscape</source>
+<translation>å转横å‘</translation>
+ </message>
+ <message>
+ <source>Reverse portrait</source>
+<translation>å转纵å‘</translation>
+ </message>
+ <message>
+ <source>Duplex (Print on both sides of the page)</source>
+<translation>åŒé¢ï¼ˆçº¸å¼ ä¸¤é¢å‡æ‰“å°ï¼‰</translation>
+ </message>
+ <message>
+ <source>Single sided</source>
+<translation>å•é¢</translation>
+ </message>
+ <message>
+ <source>Two sided (long edge)</source>
+<translation>åŒé¢ï¼ˆé•¿è¾¹ï¼‰</translation>
+ </message>
+ <message>
+ <source>Two sided (short edge)</source>
+<translation>åŒé¢ï¼ˆçŸ­è¾¹ï¼‰</translation>
+ </message>
+ <message>
+ <source>Output Order (Print last page first)</source>
+<translation>输出顺åºï¼ˆé¦–先打å°æœ€åŽä¸€é¡µï¼‰</translation>
+ </message>
+ <message>
+ <source>Normal (Print first page first)</source>
+<translation>正常(首先打å°ç¬¬ä¸€é¡µï¼‰</translation>
+ </message>
+ <message>
+ <source>Reversed (Print last page first)</source>
+<translation>å转(首先打å°æœ€åŽä¸€é¡µï¼‰</translation>
+ </message>
+ <message>
+ <source>Collate (Group together multiple copies)</source>
+<translation>校订(将多份å¤å°ä»¶é›†ä¸­ï¼‰</translation>
+ </message>
+ <message>
+ <source>Quality</source>
+<translation>å¤å°è´¨é‡</translation>
+ </message>
+ <message>
+ <source>N-Up (Multiple document pages per printed page)</source>
+<translation>N-Up(æ¯é¡µæ‰“å°å¤šä¸ªæ–‡æ¡£é¡µï¼‰</translation>
+ </message>
+ <message>
+ <source>Pages per Sheet</source>
+<translation>æ¯å¼ çº¸æ‰“å°çš„页数</translation>
+ </message>
+ <message>
+ <source>1 sheet per page</source>
+<translation>æ¯å¼ çº¸æ‰“å° 1 页</translation>
+ </message>
+ <message>
+ <source>2 sheets per page</source>
+<translation>æ¯å¼ çº¸æ‰“å° 2 页</translation>
+ </message>
+ <message>
+ <source>4 sheets per page</source>
+<translation>æ¯å¼ çº¸æ‰“å° 4 页</translation>
+ </message>
+ <message>
+ <source>Layout</source>
+<translation>布局</translation>
+ </message>
+ <message>
+ <source>Bottom to top, left to right</source>
+<translation>从底到顶,从左到å³</translation>
+ </message>
+ <message>
+ <source>Bottom to top, right to left</source>
+<translation>从底到顶,从å³åˆ°å·¦</translation>
+ </message>
+ <message>
+ <source>Left to right, bottom to top</source>
+<translation>从左到å³ï¼Œä»Žåº•åˆ°é¡¶</translation>
+ </message>
+ <message>
+ <source>Left to right, top to bottom</source>
+<translation>从左到å³ï¼Œä»Žé¡¶åˆ°åº•</translation>
+ </message>
+ <message>
+ <source>Right to left, bottom to top</source>
+<translation>从å³åˆ°å·¦ï¼Œä»Žåº•åˆ°é¡¶</translation>
+ </message>
+ <message>
+ <source>Right to left, top to bottom</source>
+<translation>从å³åˆ°å·¦ï¼Œä»Žé¡¶åˆ°åº•</translation>
+ </message>
+ <message>
+ <source>Top to bottom, left to right</source>
+<translation>从顶到底,从左到å³</translation>
+ </message>
+ <message>
+ <source>Top to bottom, right to left</source>
+<translation>从顶到底,从å³åˆ°å·¦</translation>
+ </message>
+ <message>
+ <source>Printed Border Around Each Page</source>
+<translation>æ¯å¼ çº¸å‘¨å›´çš„打å°è¾¹æ¡†çº¿</translation>
+ </message>
+ <message>
+ <source>Two thin borders</source>
+<translation>两æ¡çª„边框线</translation>
+ </message>
+ <message>
+ <source>Two thick borders</source>
+<translation>两æ¡ç²—边框线</translation>
+ </message>
+ <message>
+ <source>No border</source>
+<translation>无边框线</translation>
+ </message>
+ <message>
+ <source>One thin border</source>
+<translation>一æ¡çª„边框线</translation>
+ </message>
+ <message>
+ <source>One thick border</source>
+<translation>一æ¡ç²—边框线</translation>
+ </message>
+ <message>
+ <source>Printout Appearance</source>
+<translation>打å°å¤–观</translation>
+ </message>
+ <message>
+ <source>Brightness</source>
+<translation>亮度</translation>
+ </message>
+ <message>
+ <source>Gamma</source>
+<translation>伽玛值</translation>
+ </message>
+ <message>
+ <source>Image Printing</source>
+<translation>图åƒæ‰“å°</translation>
+ </message>
+ <message>
+ <source>Fit to Page</source>
+<translation>放大ã€ç¼©å°å’Œè°ƒæ•´ä¸ºé¡µé¢å¤§å°</translation>
+ </message>
+ <message>
+ <source>Position on Page</source>
+<translation>页é¢ä¸Šçš„ä½ç½®</translation>
+ </message>
+ <message>
+ <source>Centered</source>
+<translation>居中</translation>
+ </message>
+ <message>
+ <source>Top</source>
+<translation>从顶到底,从左到å³</translation>
+ </message>
+ <message>
+ <source>Left</source>
+<translation>从左到å³ï¼Œä»Žåº•åˆ°é¡¶</translation>
+ </message>
+ <message>
+ <source>Right</source>
+<translation>从å³åˆ°å·¦ï¼Œä»Žåº•åˆ°é¡¶</translation>
+ </message>
+ <message>
+ <source>Top left</source>
+<translation>左上角</translation>
+ </message>
+ <message>
+ <source>Top right</source>
+<translation>å³ä¸Šè§’</translation>
+ </message>
+ <message>
+ <source>Bottom</source>
+<translation>从底到顶,从左到å³</translation>
+ </message>
+ <message>
+ <source>Bottom left</source>
+<translation>左下角</translation>
+ </message>
+ <message>
+ <source>Bottom right</source>
+<translation>å³ä¸‹è§’</translation>
+ </message>
+ <message>
+ <source>Saturation</source>
+<translation>饱和度</translation>
+ </message>
+ <message>
+ <source>Hue (color shift/rotation)</source>
+<translation>色调(色移/å色)</translation>
+ </message>
+ <message>
+ <source>&quot;Natural&quot; Scaling (relative to image)</source>
+<translation>“自然â€è°ƒæ•´ï¼ˆä¸Žå›¾åƒç›¸å…³ï¼‰</translation>
+ </message>
+ <message>
+ <source>Scaling (relative to page)</source>
+<translation>调整(与纸页相关)</translation>
+ </message>
+ <message>
+ <source>Miscellaneous</source>
+<translation>其他</translation>
+ </message>
+ <message>
+ <source>&quot;Pretty Print&quot; Text Documents (Add headers and formatting)</source>
+<translation>“优质打å°â€æ–‡æœ¬æ–‡æ¡£ï¼ˆæ·»åŠ é¡µçœ‰å’Œæ ¼å¼ï¼‰</translation>
+ </message>
+ <message>
+ <source>Banner Pages</source>
+<translation>标题页</translation>
+ </message>
+ <message>
+ <source>No banner page</source>
+<translation>无标题页</translation>
+ </message>
+ <message>
+ <source>Classified</source>
+<translation>秘密</translation>
+ </message>
+ <message>
+ <source>Confidential</source>
+<translation>机密</translation>
+ </message>
+ <message>
+ <source>Secret</source>
+<translation>ä¿å¯†</translation>
+ </message>
+ <message>
+ <source>Standard</source>
+<translation>标准</translation>
+ </message>
+ <message>
+ <source>Top secret</source>
+<translation>ç»å¯†</translation>
+ </message>
+ <message>
+ <source>Unclassified</source>
+<translation>éžæœºå¯†</translation>
+ </message>
+ <message>
+ <source>Mirror Printing</source>
+<translation>é•œåƒæ‰“å°</translation>
+ </message>
+ <message>
+ <source>Set Quality to &quot;Controlled by &apos;Printout Mode&apos;&quot; to enable.</source>
+<translation>将“质é‡â€è®¾ç½®ä¸ºâ€œå—‘打å°æ¨¡å¼â€™æŽ§åˆ¶â€å³å¯å¯ç”¨ã€‚</translation>
+ </message>
+ <message>
+ <source>On</source>
+<translation>一æ¡çª„边框线</translation>
+ </message>
+ <message>
+ <source>Off</source>
+<translation>关闭</translation>
+ </message>
+ <message>
+ <source>Set to default value of &quot;%1&quot;.</source>
+<translation>设置为默认值 &quot;%1&quot;。</translation>
+ </message>
+ <message>
+ <source>Start:</source>
+<translation>开始:</translation>
+ </message>
+ <message>
+ <source>End:</source>
+<translation>结æŸï¼š</translation>
+ </message>
+ <message>
+ <source>Set to default value of &quot;Start: %1, End: %2&quot;.</source>
+<translation>设置为“开始:%1,结æŸï¼š%2â€çš„默认值</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollPrintView</name>
+ <message>
+ <source>PDF Document</source>
+ <translation>PDF 文档</translation>
+ </message>
+ <message>
+ <source>Postscript Document</source>
+ <translation>Postscript 文档</translation>
+ </message>
+ <message>
+ <source>HP Graphics Language File</source>
+ <translation>HP 图形语言文件</translation>
+ </message>
+ <message>
+ <source>C Shell Script</source>
+ <translation>C Shell 脚本</translation>
+ </message>
+ <message>
+ <source>C Source Code</source>
+ <translation>C æºä»£ç </translation>
+ </message>
+ <message>
+ <source>C&#43;&#43; Source Code</source>
+ <translation>C&#43;&#43; æºä»£ç </translation>
+ </message>
+ <message>
+ <source>Perl Script</source>
+ <translation>Perl 脚本</translation>
+ </message>
+ <message>
+ <source>Python Program</source>
+ <translation>Python 程åº</translation>
+ </message>
+ <message>
+ <source>Shell Script</source>
+ <translation>Shell 脚本</translation>
+ </message>
+ <message>
+ <source>Plain Text</source>
+ <translation>纯文本</translation>
+ </message>
+ <message>
+ <source>HTML Dcoument</source>
+ <translation>HTML 文档</translation>
+ </message>
+ <message>
+ <source>GIF Image</source>
+ <translation>GIF 图åƒ</translation>
+ </message>
+ <message>
+ <source>PNG Image</source>
+ <translation>PNG 图åƒ</translation>
+ </message>
+ <message>
+ <source>JPEG Image</source>
+ <translation>JPEG 图åƒ</translation>
+ </message>
+ <message>
+ <source>TIFF Image</source>
+ <translation>TIFF 图åƒ</translation>
+ </message>
+ <message>
+ <source>Bitmap (BMP) Image</source>
+ <translation>ä½å›¾ (BMP) 图åƒ</translation>
+ </message>
+ <message>
+ <source>Photo CD Image</source>
+ <translation>Photo CD 图åƒ</translation>
+ </message>
+ <message>
+ <source>Portable Image (PNM)</source>
+ <translation>便æºå¼å›¾åƒ (PNM)</translation>
+ </message>
+ <message>
+ <source>Portable B&amp;W Image (PBM)</source>
+ <translation>便æºå¼é»‘ç™½å›¾åƒ (PBM)</translation>
+ </message>
+ <message>
+ <source>Portable Grayscale Image (PGM)</source>
+ <translation>便æºå¼ç°åº¦å›¾åƒ (PGM)</translation>
+ </message>
+ <message>
+ <source>Portable Color Image (PPM)</source>
+ <translation>便æºå¼å½©è‰²å›¾åƒ (PPM)</translation>
+ </message>
+ <message>
+ <source>SGI RGB</source>
+ <translation>SGI RGB</translation>
+ </message>
+ <message>
+ <source>X11 Bitmap (XBM)</source>
+ <translation>X11 ä½å›¾ (XBM)</translation>
+ </message>
+ <message>
+ <source>X11 Pixmap (XPM)</source>
+ <translation>X11 åƒç´ å›¾ (XPM)</translation>
+ </message>
+ <message>
+ <source>Sun Raster Format</source>
+ <translation>Sun Raster æ ¼å¼</translation>
+ </message>
+ <message>
+ <source>File(s) to Print</source>
+ <translation>待打å°æ–‡ä»¶</translation>
+ </message>
+ <message>
+ <source>Print Options</source>
+ <translation>打å°é€‰é¡¹</translation>
+ </message>
+ <message>
+ <source>&lt;&lt; Functions</source>
+ <translation>&lt;&lt; 功能</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>关闭</translation>
+ </message>
+ <message>
+ <source>Print File(s)</source>
+ <translation>打å°æ–‡ä»¶</translation>
+ </message>
+ <message>
+ <source>Order</source>
+ <translation>顺åº</translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation>å称</translation>
+ </message>
+ <message>
+ <source>Type</source>
+ <translation>类型</translation>
+ </message>
+ <message>
+ <source>Path</source>
+ <translation>路径</translation>
+ </message>
+ <message>
+ <source>Add File...</source>
+ <translation>添加文件...</translation>
+ </message>
+ <message>
+ <source>Show Types...</source>
+ <translation>显示类型...</translation>
+ </message>
+ <message>
+ <source>Remove File</source>
+ <translation>删除文件</translation>
+ </message>
+ <message>
+ <source>Move Down</source>
+ <translation>下移</translation>
+ </message>
+ <message>
+ <source>Move Up</source>
+ <translation>上移</translation>
+ </message>
+ <message>
+ <source>Show File Types...</source>
+ <translation>显示文件类型...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;You are trying to add a file that cannot be directly printed with this utility.&lt;/b&gt;&lt;p&gt;To print this file, use the print command in the application that created it.</source>
+ <translation>&lt;b&gt;您当å‰å°è¯•æ·»åŠ çš„文件无法通过此实用程åºç›´æŽ¥è¿›è¡Œæ‰“å°ã€‚&lt;/b&gt;&lt;p&gt;è¦æ‰“å°æ­¤æ–‡ä»¶ï¼Œè¯·åœ¨åˆ›å»ºè¯¥æ–‡ä»¶çš„应用程åºä¸­ä½¿ç”¨æ‰“å°å‘½ä»¤ã€‚</translation>
+ </message>
+ <message>
+ <source>Number of copies:</source>
+ <translation>备份数é‡ï¼š</translation>
+ </message>
+ <message>
+ <source>Default</source>
+ <translation>默认</translation>
+ </message>
+ <message>
+ <source>Page Range:</source>
+ <translation>页ç èŒƒå›´ï¼š</translation>
+ </message>
+ <message>
+ <source>All pages</source>
+ <translation>所有页</translation>
+ </message>
+ <message>
+ <source>Page range:</source>
+ <translation>页ç èŒƒå›´ï¼š</translation>
+ </message>
+ <message>
+ <source>Page set:</source>
+ <translation>页é¢è®¾ç½®ï¼š</translation>
+ </message>
+ <message>
+ <source>Even pages</source>
+ <translation>å¶æ•°é¡µ</translation>
+ </message>
+ <message>
+ <source>Odd pages</source>
+ <translation>奇数页</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Cannot print: Invalid page range: %1&lt;/b&gt;&lt;p&gt;A valid page range is a list of pages or ranges of pages separated by commas (e.g., 1-2,4,6-7)</source>
+ <translation>&lt;b&gt;无法打å°ï¼šé¡µç èŒƒå›´æ— æ•ˆï¼š%1&lt;/b&gt;&lt;p&gt;有效页ç èŒƒå›´ä¸ºå„页列表,或是以逗å·éš”开的多个页ç èŒƒå›´ï¼ˆå¦‚ 1-2,4,6-7)</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Cannot print: Device is busy or not available.&lt;/b&gt;&lt;p&gt;Please check device and try again. [1]</source>
+ <translation type="obsolete">&lt;b&gt;无法打å°ï¼šè®¾å¤‡å¿™æˆ–ä¸å¯ç”¨ã€‚&lt;/b&gt;&lt;p&gt;请检查设备并é‡è¯•ã€‚ [1]</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Cannot print: Printer is stopped.&lt;/b&gt;&lt;p&gt;Please START the printer to continue this print. Job will begin printing once printer is started.</source>
+ <translation>&lt;b&gt;无法打å°ï¼šæ‰“å°æœºå·²åœæ­¢ã€‚&lt;/b&gt;&lt;p&gt;请å¯åŠ¨æ‰“å°æœºä»¥ç»§ç»­æ‰§è¡Œè¯¥æ‰“å°ã€‚å¯åŠ¨æ‰“å°æœºåŽï¼Œä¾¿å¼€å§‹æ‰“å°ä½œä¸šã€‚</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Cannot print: Printer is not accepting jobs.&lt;/b&gt;&lt;p&gt;Please set the printer to ACCEPTING JOBS to continue printing.</source>
+ <translation>&lt;b&gt;无法打å°ï¼šæ‰“å°æœºæœªæŽ¥å—作业。&lt;/b&gt;&lt;p&gt;请将打å°æœºè®¾ç½®ä¸ºâ€œæŽ¥å—作业â€ä»¥ç»§ç»­æ‰“å°ã€‚</translation>
+ </message>
+ <message>
+ <source>Print command failed with error code %1</source>
+ <translation>打å°å‘½ä»¤å¤±è´¥ï¼Œé”™è¯¯ä»£ç  %1</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Cannot print: Device is busy or not available.&lt;/b&gt;&lt;p&gt;Please check device and try again.</source>
+<translation>&lt;b&gt;无法打å°ï¼šè®¾å¤‡å¿™æˆ–ä¸å¯ç”¨ã€‚&lt;/b&gt;&lt;p&gt;请检查设备并é‡è¯•ã€‚</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollPrinterInfoView</name>
+ <message>
+ <source>No printers found for this device.</source>
+ <translation>未找到此设备的打å°æœºã€‚</translation>
+ </message>
+ <message>
+ <source>&lt;&lt; Tools</source>
+ <translation>&lt;&lt; 工具</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>关闭</translation>
+ </message>
+ <message>
+ <source>Fax</source>
+ <translation>传真</translation>
+ </message>
+ <message>
+ <source>Printer</source>
+ <translation>打å°æœº</translation>
+ </message>
+ <message>
+ <source>Type: %1</source>
+ <translation>类型: %1</translation>
+ </message>
+ <message>
+ <source>Location: %1</source>
+ <translation>ä½ç½®ï¼š %1</translation>
+ </message>
+ <message>
+ <source>Description/Info: %1</source>
+ <translation>说明/ä¿¡æ¯ï¼š %1</translation>
+ </message>
+ <message>
+ <source>Idle</source>
+ <translation>空闲</translation>
+ </message>
+ <message>
+ <source>Processing</source>
+ <translation>正在处ç†</translation>
+ </message>
+ <message>
+ <source>Stopped</source>
+ <translation>å·²åœæ­¢</translation>
+ </message>
+ <message>
+ <source>Unknown</source>
+ <translation>未知的</translation>
+ </message>
+ <message>
+ <source>State: %1</source>
+ <translation>状æ€ï¼š %1</translation>
+ </message>
+ <message>
+ <source>PPD/Driver: %1</source>
+ <translation>PPD/驱动程åºï¼š %1</translation>
+ </message>
+ <message>
+ <source>CUPS/IPP Printer URI: %1</source>
+ <translation>CUPS/IPP 打å°æœº URI: %1</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollStatusView</name>
+ <message>
+ <source>year</source>
+ <translation>å¹´</translation>
+ </message>
+ <message>
+ <source>years</source>
+ <translation>å¹´</translation>
+ </message>
+ <message>
+ <source>month</source>
+ <translation>月</translation>
+ </message>
+ <message>
+ <source>months</source>
+ <translation>月</translation>
+ </message>
+ <message>
+ <source>week</source>
+ <translation>周</translation>
+ </message>
+ <message>
+ <source>weeks</source>
+ <translation>周</translation>
+ </message>
+ <message>
+ <source>day</source>
+ <translation>æ—¥</translation>
+ </message>
+ <message>
+ <source>days</source>
+ <translation>æ—¥</translation>
+ </message>
+ <message>
+ <source>hour</source>
+ <translation>å°æ—¶</translation>
+ </message>
+ <message>
+ <source>hours</source>
+ <translation>å°æ—¶</translation>
+ </message>
+ <message>
+ <source>minute</source>
+ <translation>分</translation>
+ </message>
+ <message>
+ <source>minutes</source>
+ <translation>分</translation>
+ </message>
+ <message>
+ <source>second</source>
+ <translation>秒</translation>
+ </message>
+ <message>
+ <source>seconds</source>
+ <translation>秒</translation>
+ </message>
+ <message>
+ <source>one</source>
+ <translation>1</translation>
+ </message>
+ <message>
+ <source>two</source>
+ <translation>2</translation>
+ </message>
+ <message>
+ <source>three</source>
+ <translation>3</translation>
+ </message>
+ <message>
+ <source>four</source>
+ <translation>4</translation>
+ </message>
+ <message>
+ <source>five</source>
+ <translation>5</translation>
+ </message>
+ <message>
+ <source>six</source>
+ <translation>6</translation>
+ </message>
+ <message>
+ <source>seven</source>
+ <translation>7</translation>
+ </message>
+ <message>
+ <source>eight</source>
+ <translation>8</translation>
+ </message>
+ <message>
+ <source>nine</source>
+ <translation>9</translation>
+ </message>
+ <message>
+ <source>ten</source>
+ <translation>10</translation>
+ </message>
+ <message>
+ <source>eleven</source>
+ <translation>11</translation>
+ </message>
+ <message>
+ <source>twelve</source>
+ <translation>12</translation>
+ </message>
+ <message>
+ <source>(most recent)</source>
+ <translation>(最近)</translation>
+ </message>
+ <message>
+ <source>User:</source>
+ <translation>用户:</translation>
+ </message>
+ <message>
+ <source>Job ID:</source>
+ <translation>作业 ID:</translation>
+ </message>
+ <message>
+ <source>n/a</source>
+ <translation>æ— </translation>
+ </message>
+ <message>
+ <source>Code:</source>
+ <translation>代ç ï¼š</translation>
+ </message>
+ <message>
+ <source>(about %1 ago)</source>
+ <translation>(约 %1 å‰ï¼‰</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollSuppliesView</name>
+ <message>
+ <source>ERROR: Device not supported.</source>
+ <translation>错误:ä¸æ”¯æŒæ­¤è®¾å¤‡ã€‚</translation>
+ </message>
+ <message>
+ <source>ERROR: Supplies status is not supported on this device.</source>
+ <translation>错误:此设备ä¸æ”¯æŒè€—æ状æ€ã€‚</translation>
+ </message>
+ <message>
+ <source>ERROR: Device not found. Please check connection and power-on device.</source>
+ <translation>错误:未找到设备。请检查连接并开å¯è®¾å¤‡ç”µæºã€‚</translation>
+ </message>
+ <message>
+ <source>Part No. %1</source>
+ <translation>éƒ¨ä»¶å· %1</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollTestpageView</name>
+ <message>
+ <source>&lt;&lt; Tools</source>
+ <translation>&lt;&lt; 工具</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>关闭</translation>
+ </message>
+ <message>
+ <source>Print Test Page</source>
+ <translation>打å°æµ‹è¯•é¡µ</translation>
+ </message>
+ <message>
+ <source>Test Page Type</source>
+ <translation>测试页类型</translation>
+ </message>
+ <message>
+ <source>Printer diagnostic page (does not test print driver)</source>
+ <translation>打å°æœºè¯Šæ–­é¡µï¼ˆä¸æµ‹è¯•æ‰“å°é©±åŠ¨ç¨‹åºï¼‰</translation>
+ </message>
+ <message>
+ <source>HPLIP test page (tests print driver)</source>
+ <translation>HPLIP 测试页(测试打å°é©±åŠ¨ç¨‹åºï¼‰</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;A test page should be printing on your printer.&lt;/b&gt;&lt;p&gt;If the page fails to print, please visit http://hplip.sourceforge.net for troubleshooting and support.</source>
+ <translation>&lt;p&gt;&lt;b&gt;应在打å°æœºä¸Šæ‰“å°æµ‹è¯•é¡µã€‚&lt;/b&gt;&lt;p&gt;如果页é¢æ‰“å°å¤±è´¥ï¼Œåˆ™è¯·è®¿é—® http://hplip.sourceforge.net 以获å–故障排除方法和支æŒã€‚</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Device is busy or in an error state.&lt;/b&gt;&lt;p&gt;Please check device and try again.</source>
+<translation>&lt;b&gt;设备忙或处于错误状æ€ã€‚&lt;/b&gt;&lt;p&gt;请检查设备并é‡è¯•ã€‚</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollToolView</name>
+ <message>
+ <source>&lt;b&gt;Device Settings&lt;/b&gt;</source>
+ <translation>&lt;b&gt;设备设置&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Your device has special device settings. You may alter these settings here.</source>
+ <translation>设备具有特定设备设置。å¯åœ¨æ­¤å¤„更改这些设置。</translation>
+ </message>
+ <message>
+ <source>Device Settings...</source>
+ <translation>设备设置...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Fax Setup&lt;/b&gt;</source>
+ <translation>&lt;b&gt;传真设置&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Fax support must be setup before you can send faxes.</source>
+ <translation>必须首先设置传真支æŒï¼Œæ–¹å¯å‘é€ä¼ çœŸã€‚</translation>
+ </message>
+ <message>
+ <source>Setup Fax...</source>
+ <translation>设置传真...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Fax Address Book&lt;/b&gt;</source>
+ <translation>&lt;b&gt;传真通讯簿&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Setup fax phone numbers to use when sending faxes from the PC.</source>
+ <translation>设置传真通讯簿,以便从 PC å‘é€ä¼ çœŸæ—¶è¿›è¡Œä½¿ç”¨ã€‚</translation>
+ </message>
+ <message>
+ <source>Fax Address Book...</source>
+ <translation>传真通讯簿...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Print Test Page&lt;/b&gt;</source>
+ <translation>&lt;b&gt;打å°æµ‹è¯•é¡µ&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Print a test page to test the setup of your printer.</source>
+ <translation>打å°æµ‹è¯•é¡µä»¥æµ‹è¯•æ‰“å°æœºè®¾ç½®ã€‚</translation>
+ </message>
+ <message>
+ <source>Print Test Page &gt;&gt;</source>
+ <translation>打å°æµ‹è¯•é¡µ &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;View Printer (Queue) Information&lt;/b&gt;</source>
+ <translation>&lt;b&gt;查看打å°æœºï¼ˆé˜Ÿåˆ—)信æ¯&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>View the printers (queues) installed in CUPS.</source>
+ <translation>查看已在 CUPS 中安装的打å°æœºï¼ˆé˜Ÿåˆ—)。</translation>
+ </message>
+ <message>
+ <source>View Printer Information &gt;&gt;</source>
+ <translation>查看打å°æœºä¿¡æ¯&gt;&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;View Device Information&lt;/b&gt;</source>
+ <translation>&lt;b&gt;查看设备信æ¯&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>This information is primarily useful for debugging and troubleshooting (advanced).</source>
+ <translation>该信æ¯ä¸»è¦ç”¨äºŽè°ƒè¯•å’Œæ•…障排除(高级)。</translation>
+ </message>
+ <message>
+ <source>View Device Information &gt;&gt;</source>
+ <translation>æŸ¥çœ‹è®¾å¤‡ä¿¡æ¯ &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Print Quality Diagnostics&lt;/b&gt;</source>
+ <translation>&lt;b&gt;打å°è´¨é‡è¯Šæ–­&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Your printer can print a test page to help diagnose print quality problems.</source>
+ <translation>打å°æœºå¯æ‰“å°æµ‹è¯•é¡µä»¥å助诊断打å°è´¨é‡é—®é¢˜ã€‚</translation>
+ </message>
+ <message>
+ <source>Print Diagnostic Page...</source>
+ <translation>打å°è¯Šæ–­é¡µ...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Download Firmware&lt;/b&gt;</source>
+ <translation>&lt;b&gt;下载固件&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Download firmware to your printer (required on some devices after each power-up).</source>
+ <translation>将固件下载到打å°æœºä¸­ï¼ˆæ¯æ¬¡ä¸Šç”µåŽéœ€åœ¨æŸäº›è®¾å¤‡ä¸Šè¿›è¡Œä½¿ç”¨ï¼‰ã€‚</translation>
+ </message>
+ <message>
+ <source>Download Firmware...</source>
+ <translation>下载固件...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Clean Cartridges&lt;/b&gt;</source>
+ <translation>&lt;b&gt;清æ´å¢¨ç›’&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>You only need to perform this action if you are having problems with poor printout quality due to clogged ink nozzles.</source>
+ <translation>您åªéœ€åœ¨å› å–·å˜´å µå¡žè‡´ä½¿æ‰“å°è´¨é‡ä¸‹é™æ—¶ï¼Œæ‰§è¡Œæ­¤æ“作。</translation>
+ </message>
+ <message>
+ <source>Clean Cartridges...</source>
+ <translation>清æ´å¢¨ç›’...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Align Cartridges&lt;/b&gt;</source>
+ <translation>&lt;b&gt;对é½å¢¨ç›’&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>This will improve the quality of output when a new cartridge is installed.</source>
+ <translation>安装新墨盒åŽï¼Œæ­¤æ“作会æå‡è¾“出质é‡ã€‚</translation>
+ </message>
+ <message>
+ <source>Align Cartridges...</source>
+ <translation>对é½å¢¨ç›’...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Perform Color Calibration&lt;/b&gt;</source>
+ <translation>&lt;b&gt;执行色彩校准&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Use this procedure to optimimize your printer&apos;s color output.</source>
+ <translation>采用该步骤优化打å°æœºçš„色彩输出。</translation>
+ </message>
+ <message>
+ <source>Color Calibration...</source>
+ <translation>色彩校准...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Perform Line Feed Calibration&lt;/b&gt;</source>
+ <translation>&lt;b&gt;执行æ¢è¡Œæ ¡å‡†&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Use line feed calibration to optimize print quality (to remove gaps in the printed output).</source>
+ <translation>使用æ¢è¡Œæ ¡å‡†ä¼˜åŒ–打å°è´¨é‡ï¼ˆåˆ é™¤æ‰“å°è¾“出中的间隙)。</translation>
+ </message>
+ <message>
+ <source>Line Feed Calibration...</source>
+ <translation>æ¢è¡Œæ ¡å‡†...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Access Embedded Web Page&lt;/b&gt;</source>
+ <translation>&lt;b&gt;访问嵌入å¼ç½‘页&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>You can use your printer&apos;s embedded web server to configure, maintain, and monitor the device from a web browser.</source>
+ <translation>您å¯ä»¥ä½¿ç”¨æ‰“å°æœºçš„åµŒå…¥å¼ Web æœåŠ¡å™¨ï¼Œåœ¨ Web æµè§ˆå™¨ä¸­é…ç½®ã€ç»´æŠ¤å’Œç›‘控设备。</translation>
+ </message>
+ <message>
+ <source>Open in Browser...</source>
+ <translation>在æµè§ˆå™¨ä¸­æ‰“å¼€...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;View Documentation&lt;/b&gt;</source>
+ <translation>&lt;b&gt;查看文档&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>View documentation installed on your system.</source>
+ <translation>查看系统所安装的文档。</translation>
+ </message>
+ <message>
+ <source>View Documentation...</source>
+ <translation>查看文档...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;An error occured downloading firmware file.&lt;/b&gt;&lt;p&gt;Please check your printer and try again.</source>
+ <translation>&lt;b&gt;下载固件文件时出现错误。&lt;/b&gt;&lt;p&gt;请检查打å°æœºå¹¶é‡è¯•ã€‚</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Device is busy or in an error state.&lt;/b&gt;&lt;p&gt;Please check device and try again.</source>
+ <translation>&lt;b&gt;设备忙或处于错误状æ€ã€‚&lt;/b&gt;&lt;p&gt;请检查设备并é‡è¯•ã€‚</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Both cartridges are required for alignment.&lt;/b&gt;&lt;p&gt;Please install both cartridges and try again.</source>
+ <translation>&lt;p&gt;&lt;b&gt;对é½æ“作需用到两个墨盒。&lt;/b&gt;&lt;p&gt;请安装两个墨盒并é‡è¯•ã€‚</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;One or more cartiridges are missing from the printer.&lt;/b&gt;&lt;p&gt;Please install cartridge(s) and try again.</source>
+ <translation>&lt;p&gt;&lt;b&gt;打å°æœºä¸­ç¼ºå°‘一个或多个墨盒。&lt;/b&gt;&lt;p&gt;请安装墨盒并é‡è¯•ã€‚</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Both the photo and color cartridges must be inserted into the printer to perform color calibration.&lt;/b&gt;&lt;p&gt;If you are planning on printing with the photo cartridge, please insert it and try again.</source>
+ <translation>&lt;p&gt;&lt;b&gt;è¦æ‰§è¡Œè‰²å½©æ ¡å‡†ï¼Œå¿…须将照片和彩色墨盒æ’入到打å°æœºä¸­ã€‚&lt;/b&gt;&lt;p&gt;如果您è¦ç”¨ç…§ç‰‡å¢¨ç›’进行打å°ï¼Œåˆ™è¯·æ’入墨盒并é‡è¯•ã€‚</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Both the photo (regular photo or photo blue) and color cartridges must be inserted into the printer to perform color calibration.&lt;/b&gt;&lt;p&gt;If you are planning on printing with the photo or photo blue cartridge, please insert it and try again.</source>
+ <translation>&lt;p&gt;&lt;b&gt;è¦æ‰§è¡Œè‰²å½©æ ¡å‡†ï¼Œå¿…须将照片(普通照片墨盒或è“色照片墨盒)墨盒和彩色墨盒æ’入到打å°æœºä¸­ã€‚&lt;/b&gt;&lt;p&gt;如果您è¦ç”¨ç…§ç‰‡å¢¨ç›’或è“色照片墨盒进行打å°ï¼Œåˆ™è¯·æ’入墨盒并é‡è¯•ã€‚</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Cannot align with only the photo cartridge installed.&lt;/b&gt;&lt;p&gt;Please install other cartridges and try again.</source>
+ <translation>&lt;p&gt;&lt;b&gt;无法与已安装的照片墨盒对é½ã€‚&lt;/b&gt;&lt;p&gt;请安装其他墨盒并é‡è¯•ã€‚</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Operation failed. Device busy.&lt;/b&gt;</source>
+ <translation>&lt;p&gt;&lt;b&gt;æ“作失败。设备忙。&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Unable to run command. No command specified.&lt;/b&gt;&lt;p&gt;Use &lt;pre&gt;Configure...&lt;/pre&gt; to specify a command to run.</source>
+ <translation>&lt;p&gt;&lt;b&gt;无法è¿è¡Œå‘½ä»¤ã€‚未指定命令。&lt;/b&gt;&lt;p&gt;请使用&lt;pre&gt;é…ç½®...&lt;/pre&gt; 以指定æŸä¸€å¾…è¿è¡Œå‘½ä»¤ã€‚</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollUnloadView</name>
+ <message>
+ <source>ERROR: Photo Card Failed to Mount Properly. Please check device and card and try again.</source>
+ <translation>错误:照片å¡æ— æ³•æ­£ç¡®å®‰è£…。请检查设备和å¡ï¼Œç„¶åŽé‡è¯•ã€‚</translation>
+ </message>
+ <message>
+ <source>Select File(s) to Unload from Photo Card</source>
+ <translation>选择è¦ä»Žç…§ç‰‡å¡ä¸­å¸è½½çš„文件</translation>
+ </message>
+ <message>
+ <source>Unload Folder</source>
+ <translation>å¸è½½æ–‡ä»¶å¤¹</translation>
+ </message>
+ <message>
+ <source>Unload Options</source>
+ <translation>å¸è½½é€‰é¡¹</translation>
+ </message>
+ <message>
+ <source>&lt;&lt; Functions</source>
+ <translation>&lt;&lt;功能</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>关闭</translation>
+ </message>
+ <message>
+ <source>Unload File(s)</source>
+ <translation>å¸è½½æ–‡ä»¶</translation>
+ </message>
+ <message>
+ <source>Select All</source>
+ <translation>全选</translation>
+ </message>
+ <message>
+ <source>Select None</source>
+ <translation>选择“无â€</translation>
+ </message>
+ <message>
+ <source>Show Thumbnails</source>
+ <translation>显示缩略图</translation>
+ </message>
+ <message>
+ <source>No files selected</source>
+ <translation>未选择文件</translation>
+ </message>
+ <message>
+ <source>1 file selected, %1</source>
+ <translation>选择了 1 个文件,%1</translation>
+ </message>
+ <message>
+ <source>%1 files selected, %2</source>
+ <translation>选择了 %1 个文件,%2</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;No thumbnail found in image.&lt;/b&gt;</source>
+ <translation>&lt;p&gt;&lt;b&gt;图åƒä¸­æœªæ‰¾åˆ°ç¼©ç•¥å›¾ã€‚&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Loading...</source>
+ <translation>正在载入...</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>å–消</translation>
+ </message>
+ <message>
+ <source>HP Device Manager</source>
+ <translation>HP 设备管ç†å™¨</translation>
+ </message>
+ <message>
+ <source>Browse...</source>
+ <translation>æµè§ˆ...</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;The unload directory path you entered is not valid.&lt;/b&gt;&lt;p&gt;The directory must exist and you must have write permissions.</source>
+ <translation>&lt;p&gt;&lt;b&gt;输入的å¸è½½ç›®å½•è·¯å¾„无效。&lt;/b&gt;&lt;p&gt;该目录必须存在,且您必须拥有写入æƒé™ã€‚</translation>
+ </message>
+ <message>
+ <source>File removal:</source>
+ <translation>文件删除:</translation>
+ </message>
+ <message>
+ <source>Leave unloaded files on photo card</source>
+ <translation>在照片å¡ä¸­ä¿ç•™å¸è½½è¿‡çš„文件</translation>
+ </message>
+ <message>
+ <source>Remove all unloaded files from photo card</source>
+ <translation>从照片å¡ä¸­åˆ é™¤æ‰€æœ‰å¸è½½è¿‡çš„文件</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;The unload directory path is not valid.&lt;/b&gt;&lt;p&gt;Please enter a new path and try again.</source>
+ <translation>&lt;p&gt;&lt;b&gt;å¸è½½ç›®å½•è·¯å¾„无效。&lt;/b&gt;&lt;p&gt;请输入新的路径,然åŽé‡è¯•ã€‚</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;No files are selected to unload.&lt;/b&gt;&lt;p&gt;Please select one or more files to unload and try again.</source>
+ <translation>&lt;p&gt;&lt;b&gt;未选择è¦å¸è½½çš„文件。&lt;/b&gt;&lt;p&gt;请选择è¦å¸è½½çš„一个或多个文件,然åŽé‡è¯•ã€‚</translation>
+ </message>
+ <message>
+ <source>Unloading card...</source>
+ <translation>正在å¸è½½å¡...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Unload cancelled at user request.&lt;/b&gt;</source>
+ <translation>&lt;b&gt;已根æ®ç”¨æˆ·è¯·æ±‚å–消å¸è½½ã€‚&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>ERROR: Photo Card Failed to Mount Properly. Please check device and card and try again.</source>
+<translation>错误:照片å¡æ— æ³•æ­£ç¡®å®‰è£…。请检查设备和å¡ï¼Œç„¶åŽé‡è¯•ã€‚</translation>
+ </message>
+ <message>
+ <source>Select File(s) to Unload from Photo Card</source>
+<translation>选择è¦ä»Žç…§ç‰‡å¡ä¸­å¸è½½çš„文件</translation>
+ </message>
+ <message>
+ <source>Unload Folder</source>
+<translation>å¸è½½æ–‡ä»¶å¤¹</translation>
+ </message>
+ <message>
+ <source>Unload Options</source>
+<translation>å¸è½½é€‰é¡¹</translation>
+ </message>
+ <message>
+ <source>&lt;&lt; Functions</source>
+<translation>&lt;&lt;功能</translation>
+ </message>
+ <message>
+ <source>Close</source>
+<translation>关闭</translation>
+ </message>
+ <message>
+ <source>Unload File(s)</source>
+<translation>å¸è½½æ–‡ä»¶</translation>
+ </message>
+ <message>
+ <source>Select All</source>
+<translation>全选</translation>
+ </message>
+ <message>
+ <source>Select None</source>
+<translation>选择“无â€</translation>
+ </message>
+ <message>
+ <source>Show Thumbnails</source>
+<translation>显示缩略图</translation>
+ </message>
+ <message>
+ <source>No files selected</source>
+<translation>未选择文件</translation>
+ </message>
+ <message>
+ <source>1 file selected, %1</source>
+<translation>选择了 1 个文件,%1</translation>
+ </message>
+ <message>
+ <source>%1 files selected, %2</source>
+<translation>选择了 %1 个文件,%2</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;No thumbnail found in image.&lt;/b&gt;</source>
+<translation>&lt;p&gt;&lt;b&gt;图åƒä¸­æœªæ‰¾åˆ°ç¼©ç•¥å›¾ã€‚&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Loading...</source>
+<translation>正在载入...</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+<translation>å–消</translation>
+ </message>
+ <message>
+ <source>HP Device Manager</source>
+<translation>HP 设备管ç†å™¨</translation>
+ </message>
+ <message>
+ <source>Browse...</source>
+<translation>æµè§ˆ...</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;The unload directory path you entered is not valid.&lt;/b&gt;&lt;p&gt;The directory must exist and you must have write permissions.</source>
+<translation>&lt;p&gt;&lt;b&gt;输入的å¸è½½ç›®å½•è·¯å¾„无效。&lt;/b&gt;&lt;p&gt;该目录必须存在,且您必须拥有写入æƒé™ã€‚</translation>
+ </message>
+ <message>
+ <source>File removal:</source>
+<translation>文件删除:</translation>
+ </message>
+ <message>
+ <source>Leave unloaded files on photo card</source>
+<translation>在照片å¡ä¸­ä¿ç•™å¸è½½è¿‡çš„文件</translation>
+ </message>
+ <message>
+ <source>Remove all unloaded files from photo card</source>
+<translation>从照片å¡ä¸­åˆ é™¤æ‰€æœ‰å¸è½½è¿‡çš„文件</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;The unload directory path is not valid.&lt;/b&gt;&lt;p&gt;Please enter a new path and try again.</source>
+<translation>&lt;p&gt;&lt;b&gt;å¸è½½ç›®å½•è·¯å¾„无效。&lt;/b&gt;&lt;p&gt;请输入新的路径,然åŽé‡è¯•ã€‚</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;No files are selected to unload.&lt;/b&gt;&lt;p&gt;Please select one or more files to unload and try again.</source>
+<translation>&lt;p&gt;&lt;b&gt;未选择è¦å¸è½½çš„文件。&lt;/b&gt;&lt;p&gt;请选择è¦å¸è½½çš„一个或多个文件,然åŽé‡è¯•ã€‚</translation>
+ </message>
+ <message>
+ <source>Unloading card...</source>
+<translation>正在å¸è½½å¡...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Unload cancelled at user request.&lt;/b&gt;</source>
+<translation>&lt;b&gt;已根æ®ç”¨æˆ·è¯·æ±‚å–消å¸è½½ã€‚&lt;/b&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollView</name>
+ <message>
+ <source>ERROR: No device found or unsupported device.</source>
+ <translation>错误:未找到设备或是ä¸æ”¯æŒçš„设备。</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;%1 (read only)&lt;/b&gt;</source>
+ <translation>&lt;b&gt;%1(åªè¯»ï¼‰&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Printer/Fax</source>
+ <translation>打å°æœº/传真机</translation>
+ </message>
+ <message>
+ <source>Printer/Fax Name:</source>
+ <translation>打å°æœº/传真机å称:</translation>
+ </message>
+ <message>
+ <source>Printer</source>
+ <translation>打å°æœº</translation>
+ </message>
+ <message>
+ <source>Printer Name:</source>
+ <translation>打å°æœºå称:</translation>
+ </message>
+ <message>
+ <source>Fax</source>
+ <translation>传真机</translation>
+ </message>
+ <message>
+ <source>Fax Name:</source>
+ <translation>传真机å称:</translation>
+ </message>
+ <message>
+ <source>Load Paper</source>
+ <translation>载入纸张</translation>
+ </message>
+ <message>
+ <source>A page will be printed. Please load &lt;b&gt;plain paper&lt;/b&gt; into the printer.</source>
+ <translation>将打å°ä¸€é¡µã€‚请将&lt;b&gt;普通纸&lt;/b&gt;载入到打å°æœºä¸­ã€‚</translation>
+ </message>
+</context>
+<context>
+ <name>SettingsDialog</name>
+ <message>
+ <source>&lt;b&gt;One or more email addresses are missing.&lt;/b&gt;&lt;p&gt;Please enter this information and try again.</source>
+ <translation>&lt;b&gt;缺少一个或多个电å­é‚®ä»¶åœ°å€ã€‚&lt;/b&gt;&lt;p&gt;请输入此信æ¯å¹¶é‡è¯•ã€‚</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;Please check your email for a test message.&lt;/b&gt;&lt;p&gt;If the message doesn&apos;t arrive, please check your settings and try again.</source>
+ <translation>&lt;p&gt;&lt;b&gt;请查看有关测试信æ¯çš„电å­é‚®ä»¶ã€‚&lt;/b&gt;&lt;p&gt;如果信æ¯å°šæœªåˆ°è¾¾ï¼Œåˆ™è¯·æ£€æŸ¥è®¾ç½®å¹¶é‡è¯•ã€‚</translation>
+ </message>
+</context>
+<context>
+ <name>SettingsDialog_base</name>
+ <message>
+ <source>HP Device Manager - Settings</source>
+ <translation>HP 设备管ç†å™¨ – 设置</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>确定</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>å–消</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Configure if and when device(s) are automatically refreshed&lt;/b&gt;</source>
+ <translation>&lt;b&gt;é…置自动刷新设备的æ¡ä»¶å’Œæ—¶é—´&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Enable device auto refresh</source>
+ <translation>å¯ç”¨è®¾å¤‡è‡ªåŠ¨åˆ·æ–°</translation>
+ </message>
+ <message>
+ <source>Auto Interval</source>
+ <translation>自动时间间隔</translation>
+ </message>
+ <message>
+ <source>Refresh every:</source>
+ <translation>刷新频率:</translation>
+ </message>
+ <message>
+ <source>seconds</source>
+ <translation>秒</translation>
+ </message>
+ <message>
+ <source>Device(s) to Refresh </source>
+ <translation>待刷新的设备</translation>
+ </message>
+ <message>
+ <source>Only currently selected device</source>
+ <translation>仅当å‰æ‰€é€‰è®¾å¤‡</translation>
+ </message>
+ <message>
+ <source>All devices</source>
+ <translation>所有设备</translation>
+ </message>
+ <message>
+ <source>Auto Refresh</source>
+ <translation>自动刷新</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Configure if the HP Device Manager will send email on alerts&lt;/b&gt;</source>
+ <translation>&lt;b&gt;é…ç½® HP 设备管ç†å™¨å‘é€æœ‰å…³è­¦æŠ¥çš„电å­é‚®ä»¶çš„æ¡ä»¶&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Send email when device errors occur:</source>
+ <translation>当设备出现下列错误时å‘é€ç”µå­é‚®ä»¶ï¼š</translation>
+ </message>
+ <message>
+ <source>Test</source>
+ <translation>测试</translation>
+ </message>
+ <message>
+ <source>To: Address(es)</source>
+ <translation>收件人:地å€</translation>
+ </message>
+ <message>
+ <source>Email address(es):</source>
+ <translation>电å­é‚®ä»¶åœ°å€ï¼š</translation>
+ </message>
+ <message>
+ <source>&lt;i&gt;Note: Separate multiple email address with a commas.&lt;/i&gt;</source>
+ <translation>&lt;i&gt;注æ„:多个电å­é‚®ä»¶åœ°å€ä¹‹é—´ç”¨é€—å·è¿›è¡Œåˆ†éš”。&lt;/i&gt;</translation>
+ </message>
+ <message>
+ <source>From: Address</source>
+ <translation>å‘件人:地å€</translation>
+ </message>
+ <message>
+ <source>Sender email address:</source>
+ <translation>å‘件人电å­é‚®ä»¶åœ°å€ï¼š</translation>
+ </message>
+ <message>
+ <source>&lt;i&gt;Note: This should generally be your email address.&lt;/i&gt;</source>
+ <translation>&lt;i&gt;注æ„:该地å€é€šå¸¸åº”为您的电å­é‚®ä»¶åœ°å€ã€‚&lt;/i&gt;</translation>
+ </message>
+ <message>
+ <source>Email Alerts</source>
+ <translation>电å­é‚®ä»¶è­¦æŠ¥</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Configure what commands to run for device functions&lt;/b&gt;</source>
+ <translation>&lt;b&gt;é…置用于实现设备功能的命令&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Access Photo Cards</source>
+ <translation>读å–照片å¡</translation>
+ </message>
+ <message>
+ <source>Built-in access photo cards function</source>
+ <translation>内置读å–照片å¡åŠŸèƒ½</translation>
+ </message>
+ <message>
+ <source>External command:</source>
+ <translation>外部命令:</translation>
+ </message>
+ <message>
+ <source>Send PC Fax</source>
+ <translation>å‘é€ PC 传真</translation>
+ </message>
+ <message>
+ <source>Built-in send PC fax function</source>
+ <translation>内置å‘é€ PC 传真功能</translation>
+ </message>
+ <message>
+ <source>Scan</source>
+ <translation>扫æ</translation>
+ </message>
+ <message>
+ <source>Built-in scan function</source>
+ <translation>内置扫æ功能</translation>
+ </message>
+ <message>
+ <source>External scan command:</source>
+ <translation>外部扫æ命令:</translation>
+ </message>
+ <message>
+ <source>Print</source>
+ <translation>打å°</translation>
+ </message>
+ <message>
+ <source>Built-in print function</source>
+ <translation>内置打å°åŠŸèƒ½</translation>
+ </message>
+ <message>
+ <source>Set Defaults</source>
+ <translation>设置默认值</translation>
+ </message>
+ <message>
+ <source>Make Copies</source>
+ <translation>制作备份</translation>
+ </message>
+ <message>
+ <source>Built-in make copies function</source>
+ <translation>内置制作备份功能</translation>
+ </message>
+ <message>
+ <source>Functions (Advanced)</source>
+ <translation>功能(高级)</translation>
+ </message>
+</context>
+<context>
+ <name>SetupForm</name>
+ <message>
+ <source>Current: Filter: &quot;%2&quot; Search: &quot;%3&quot; TTL: %4 Timeout: %5s</source>
+ <translation>当å‰ï¼šè¿‡æ»¤å™¨ï¼š&quot;%2&quot; æœç´¢ï¼š&quot;%3&quot; TTL:%4 超时:%5 秒</translation>
+ </message>
+ <message>
+ <source>The printer name and fax name must be different. Please choose different names.</source>
+<translation>打å°æœºå称åŠä¼ çœŸæœºå称ä¸å¾—åŒå。请选择其他å称。</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Device not found.&lt;/b&gt; &lt;p&gt;Please make sure your printer is properly connected and powered-on.</source>
+ <translation>未找到设备。请确认打å°æœºè¿žæŽ¥æ­£ç¡®å¹¶å·²å¼€å¯ç”µæºã€‚</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;No devices found.&lt;/b&gt;&lt;p&gt;Please make sure your printer is properly connected and powered-on.</source>
+ <translation>&lt;b&gt;未找到设备。&lt;/b&gt;&lt;p&gt;请确认打å°æœºè¿žæŽ¥æ­£ç¡®å¹¶å·²å¼€å¯ç”µæºã€‚</translation>
+ </message>
+ <message>
+ <source>Current Settings: Filter: &quot;%2&quot; Search: &quot;%3&quot; TTL: %4 Timeout: %5s</source>
+ <translation>当å‰è®¾ç½®ï¼šè¿‡æ»¤å™¨ï¼š&quot;%2&quot; æœç´¢ï¼š&quot;%3&quot; TTL:%4 超时:%5 秒</translation>
+ </message>
+ <message>
+ <source>network</source>
+ <translation>网络</translation>
+ </message>
+ <message>
+ <source>USB bus</source>
+ <translation>USB 总线</translation>
+ </message>
+ <message>
+ <source>parallel port</source>
+ <translation>并行端å£</translation>
+ </message>
+ <message>
+ <source>Model</source>
+ <translation>åž‹å·</translation>
+ </message>
+ <message>
+ <source>Serial No.</source>
+ <translation>åºåˆ—å·</translation>
+ </message>
+ <message>
+ <source>IP Address</source>
+ <translation>IP 地å€</translation>
+ </message>
+ <message>
+ <source>Host Name</source>
+ <translation>主机å</translation>
+ </message>
+ <message>
+ <source>Device</source>
+ <translation>设备</translation>
+ </message>
+ <message>
+ <source>Device URI</source>
+ <translation>设备 URI</translation>
+ </message>
+ <message>
+ <source>%1 device(s) found on the %1:</source>
+ <translation>已在 %1 上找到 %1 设备:</translation>
+ </message>
+ <message>
+ <source>%1 device(s) found on the %1 at address %2:</source>
+ <translation>已在 %1 上找到地å€ä¸º %2 çš„ %1 设备:</translation>
+ </message>
+ <message>
+ <source>%1 device(s) found on the %1 at ID %2:</source>
+ <translation>已在 %1 上找到 ID 为 %2 的 %1 设备:</translation>
+ </message>
+ <message>
+ <source>%1 device(s) found on the %1 device node ID %2:</source>
+ <translation>已在 %1 设备的节点 ID %2 上找到 %1 设备:</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Device not found or invalid HPLIP device.&lt;/b&gt;&lt;p&gt;If you specified a USB ID, IP address, or other parameter, please re-check it and try again.</source>
+ <translation>&lt;b&gt;未找到设备或 HPLIP 设备无效。&lt;/b&gt;&lt;p&gt;如果指定了 USB IDã€IP 地å€æˆ–其他å‚数,则请é‡æ–°æ£€æŸ¥å¹¶é‡è¯•ã€‚</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;PPD not file found.&lt;/b&gt;&lt;p&gt;An appropriate PPD file could not be found. Please check your HPLIP install, use &lt;i&gt;Select Other...&lt;/i&gt;, or download one from linuxprinting.org.</source>
+ <translation>&lt;b&gt;未找到 PPD 文件。&lt;/b&gt;&lt;p&gt;未找到相应的 PPD 文件。请检查 HPLIP 安装,使用&lt;i&gt;选择其他...&lt;/i&gt;,或从 linuxprinting.org 下载。</translation>
+ </message>
+ <message>
+ <source>You must enter a name for the printer.</source>
+ <translation>必须输入打å°æœºçš„å称。</translation>
+ </message>
+ <message>
+ <source>A printer already exists with this name. Please choose a different name.</source>
+ <translation>已存在相åŒå称的打å°æœºã€‚请选择其他å称。</translation>
+ </message>
+ <message>
+ <source>You must enter a fax name.</source>
+ <translation>必须输入传真机å称。</translation>
+ </message>
+ <message>
+ <source>A fax already exists with this name. Please choose a different name.</source>
+ <translation>已存在相åŒå称的传真机。请选择其他å称。</translation>
+ </message>
+ <message>
+ <source>Unable to communicate with the device. Please check the device and try again.</source>
+ <translation>无法与设备进行通信。请检查设备并é‡è¯•ã€‚</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Device I/O Error&lt;/b&gt;&lt;p&gt;Could not communicate with device. Device may be busy.</source>
+ <translation>&lt;b&gt;设备 I/O 错误&lt;/b&gt;&lt;p&gt;无法与设备进行通信。设备å¯èƒ½æ­£å¿™ã€‚</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Printer queue setup failed.&lt;/b&gt;&lt;p&gt;Please restart CUPS and try again.</source>
+ <translation>&lt;b&gt;打å°æœºé˜Ÿåˆ—设置失败。&lt;/b&gt;&lt;p&gt;请é‡æ–°å¯åŠ¨ CUPS 并é‡è¯•ã€‚</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Unable to find HP fax PPD file.&lt;/b&gt;&lt;p&gt;Please check you HPLIP installation and try again.</source>
+ <translation>&lt;b&gt;无法找到 HP 传真机 PPD 文件。&lt;/b&gt;&lt;p&gt;请检查 HPLIP 安装并é‡è¯•ã€‚</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Fax queue setup failed.&lt;/b&gt;&lt;p&gt;Please restart CUPS and try again.</source>
+ <translation>&lt;b&gt;传真机队列设置失败。&lt;/b&gt;&lt;p&gt;请é‡æ–°å¯åŠ¨ CUPS 并é‡è¯•ã€‚</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Unable to print to printer.&lt;/b&gt;&lt;p&gt;Please check device and try again.</source>
+ <translation>&lt;b&gt;无法打å°åˆ°æ‰“å°æœºã€‚&lt;/b&gt;&lt;p&gt;请检查设备并é‡è¯•ã€‚</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;No CUPS queue found for device.&lt;/b&gt;&lt;p&gt;Please install the printer in CUPS and try again.</source>
+ <translation>&lt;b&gt;无法找到设备的 CUPS 队列。&lt;/b&gt;&lt;p&gt;请在 CUPS 中安装打å°æœºå¹¶é‡è¯•ã€‚</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Printer Error.&lt;/b&gt;&lt;p&gt;Printer is busy, offline, or in an error state. Please check the device and try again.</source>
+ <translation>&lt;b&gt;打å°æœºé”™è¯¯ã€‚&lt;/b&gt;&lt;p&gt;打å°æœºå¤„于忙ã€è„±æœºæˆ–错误状æ€ã€‚请检查设备并é‡è¯•ã€‚</translation>
+ </message>
+</context>
+<context>
+ <name>SetupForm_base</name>
+ <message>
+ <source>PPD File</source>
+ <translation>PPD 文件</translation>
+ </message>
+ <message>
+ <source>Description</source>
+ <translation>说明</translation>
+ </message>
+ <message>
+ <source>HP Device Manger - Printer Setup Wizard</source>
+ <translation>HP 设备管ç†å™¨ – 打å°æœºå®‰è£…å‘导</translation>
+ </message>
+ <message>
+ <source>Connection (I/O) Type</source>
+ <translation>连接 (I/O) 类型</translation>
+ </message>
+ <message>
+ <source>Universal Serial Bus (USB)</source>
+ <translation>通用串行总线 (USB)</translation>
+ </message>
+ <message>
+ <source>Network/Ethernet/Wireless (direct connection or JetDirect)</source>
+ <translation>网络/以太网/无线(直接连接或 JetDirect)</translation>
+ </message>
+ <message>
+ <source>Parallel Port (LPT)</source>
+ <translation>å¹¶è¡Œç«¯å£ (LPT)</translation>
+ </message>
+ <message>
+ <source>Advanced...</source>
+ <translation>高级...</translation>
+ </message>
+ <message>
+ <source>Choose Connection Type</source>
+ <translation>选择连接类型</translation>
+ </message>
+ <message>
+ <source>probeHeadingTextLabel</source>
+ <translation>probeHeadingTextLabel</translation>
+ </message>
+ <message>
+ <source>Find Manually...</source>
+ <translation>手动查找...</translation>
+ </message>
+ <message>
+ <source>Refresh</source>
+ <translation>刷新</translation>
+ </message>
+ <message>
+ <source>Select from Discovered Devices</source>
+ <translation>从已知设备中选择</translation>
+ </message>
+ <message>
+ <source>Select Other...</source>
+ <translation>选择其他...</translation>
+ </message>
+ <message>
+ <source>Defaults</source>
+ <translation>默认值</translation>
+ </message>
+ <message>
+ <source>Please chose the PPD file (by name and description) that most closely matches your printer. &lt;i&gt;Note: The model name of the printer may vary somehwat from the PPD file name, for example, a Deskjet 5550 may have a PPD file with the model name of Deskjet_5500_series.&lt;/i&gt;</source>
+ <translation>请选择与打å°æœºæœ€åŒ¹é…çš„ PPD 文件(借助文件åå’Œæ述)。&lt;i&gt;注æ„:打å°æœºçš„åž‹å·å称与 PPD 文件åå¯èƒ½æœ‰æ‰€ä¸åŒï¼Œä¾‹å¦‚,型å·ä¸º Deskjet 5550 的打å°æœºåœ¨ PPD 文件中å为 Deskjet_5500_series。</translation>
+ </message>
+ <message>
+ <source>Select/Confirm PPD File</source>
+ <translation>选择/确认 PPD 文件</translation>
+ </message>
+ <message>
+ <source>Printer Information</source>
+ <translation>打å°æœºä¿¡æ¯</translation>
+ </message>
+ <message>
+ <source>Default</source>
+ <translation>默认</translation>
+ </message>
+ <message>
+ <source>Location:</source>
+ <translation>ä½ç½®ï¼š</translation>
+ </message>
+ <message>
+ <source>Printer Name:</source>
+ <translation>打å°æœºå称:</translation>
+ </message>
+ <message>
+ <source>Description:</source>
+ <translation>说明:</translation>
+ </message>
+ <message>
+ <source>Fax Information</source>
+ <translation>传真信æ¯</translation>
+ </message>
+ <message>
+ <source>Fax Name:</source>
+ <translation>传真机å称:</translation>
+ </message>
+ <message>
+ <source>Name/Company:</source>
+ <translation>å称/å…¬å¸ï¼š</translation>
+ </message>
+ <message>
+ <source>Fax Number:</source>
+ <translation>传真å·ç ï¼š</translation>
+ </message>
+ <message>
+ <source>Setup PC send fax</source>
+ <translation>设置 PC å‘é€ä¼ çœŸ</translation>
+ </message>
+ <message>
+ <source>Click &quot;Next &gt;&quot; to install the printer on your system.</source>
+ <translation>å•å‡»&quot;下一步&gt;&quot;在系统上安装打å°æœºã€‚</translation>
+ </message>
+ <message>
+ <source>Enter Printer Information</source>
+ <translation>输入打å°æœºä¿¡æ¯</translation>
+ </message>
+ <message>
+ <source>Send test page to printer</source>
+ <translation>å‘打å°æœºå‘é€æµ‹è¯•é¡µ</translation>
+ </message>
+ <message>
+ <source>Fax Summary</source>
+ <translation>传真机摘è¦</translation>
+ </message>
+ <message>
+ <source>Printer Summary</source>
+ <translation>打å°æœºæ‘˜è¦</translation>
+ </message>
+ <message>
+ <source>PPD File:</source>
+ <translation>PPD 文件:</translation>
+ </message>
+ <message>
+ <source>The printer has been successfully installed on your system.</source>
+ <translation>已在系统中æˆåŠŸå®‰è£…打å°æœºã€‚</translation>
+ </message>
+ <message>
+ <source>Finished Adding Printer</source>
+ <translation>已完æˆæ‰“å°æœºæ·»åŠ </translation>
+ </message>
+</context>
+<context>
+ <name>SetupManualFind</name>
+ <message>
+ <source>Please enter the printer&apos;s network hostname or IP address.</source>
+ <translation>请输入打å°æœºçš„网络主机å或 IP 地å€ã€‚</translation>
+ </message>
+ <message>
+ <source>&lt;i&gt;(IPv4 address &quot;a.b.c.d&quot; or &quot;hostname&quot;.)&lt;/i&gt;</source>
+ <translation>&lt;i&gt;(IPv4 åœ°å€ &quot;a.b.c.d&quot; 或&quot;主机å&quot;。)&lt;/i&gt;</translation>
+ </message>
+ <message>
+ <source>Hostname or IP Address:</source>
+ <translation>主机å或 IP 地å€ï¼š</translation>
+ </message>
+ <message>
+ <source>Please enter the USB ID for the printer.</source>
+ <translation>请输入打å°æœºçš„ USB ID:</translation>
+ </message>
+ <message>
+ <source>&lt;i&gt;(&quot;xxx:yyy&quot; where xxx is the USB bus ID and yyy is the USB device ID. The &apos;:&apos; and all leading zeroes must be present. Use &apos;lsusb&apos; to determine this information.)&lt;/i&gt;</source>
+ <translation>&lt;i&gt;(&quot;xxx:yyy&quot;,其中 xxx 为 USB 总线 ID,而 yyy 为 USB 设备 ID。“&apos;:&apos;â€å’Œæ‰€æœ‰å‰å¯¼é›¶å¿…ä¸å¯å°‘。使用 &apos;lsusb&apos; 确认信æ¯ã€‚)&lt;/i&gt;</translation>
+ </message>
+ <message>
+ <source>USB ID:</source>
+ <translation>USB ID:</translation>
+ </message>
+ <message>
+ <source>Please enter the filesystem device node for the printer.</source>
+ <translation>请输入打å°æœºçš„文件系统设备节点。</translation>
+ </message>
+ <message>
+ <source> &lt;i&gt;(&quot;/dev/parportX&quot;, X=0,1,2,...)&lt;/i&gt;</source>
+ <translation>&lt;i&gt;(&quot;/dev/parportX&quot;, X=0,1,2,...)&lt;/i&gt;</translation>
+ </message>
+ <message>
+ <source>Device Node:</source>
+ <translation>设备节点:</translation>
+ </message>
+</context>
+<context>
+ <name>SetupManualFind_base</name>
+ <message>
+ <source>HP Device Manager - Manually Find Device</source>
+ <translation>HP 设备管ç†å™¨ – 手动查找设备</translation>
+ </message>
+ <message>
+ <source>TEXT</source>
+ <translation>文本</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>å–消</translation>
+ </message>
+ <message>
+ <source>Find</source>
+ <translation>查找</translation>
+ </message>
+ <message>
+ <source>textLabel1</source>
+ <translation>文本标签1</translation>
+ </message>
+ <message>
+ <source>IP/HN/SER/USB/DEV:</source>
+ <translation>IP/HN/SER/USB/DEV:</translation>
+ </message>
+</context>
+<context>
+ <name>SetupSettings_base</name>
+ <message>
+ <source>HP Device Manager - Setup Filters, Search and Settings</source>
+ <translation>HP 设备管ç†å™¨ – é…置过滤器ã€æœç´¢å’Œè®¾ç½®</translation>
+ </message>
+ <message>
+ <source>Discovery Filter</source>
+ <translation>查找过滤器</translation>
+ </message>
+ <message>
+ <source>Discover all devices</source>
+ <translation>查找所有设备</translation>
+ </message>
+ <message>
+ <source>Only discover devices that support the following functionality:</source>
+ <translation>仅查找支æŒä¸‹åˆ—功能的设备:</translation>
+ </message>
+ <message>
+ <source>PC Initiated Copying</source>
+ <translation>ç”± PC å¯åŠ¨çš„å¤åˆ¶</translation>
+ </message>
+ <message>
+ <source>PC Photocard Access</source>
+ <translation>PC 照片å¡è¯»å–</translation>
+ </message>
+ <message>
+ <source>Scan to PC</source>
+ <translation>扫æ到 PC</translation>
+ </message>
+ <message>
+ <source>PC Send Fax</source>
+ <translation>PC å‘é€ä¼ çœŸ</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>确定</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>å–消</translation>
+ </message>
+ <message>
+ <source>Defaults</source>
+ <translation>默认值</translation>
+ </message>
+ <message>
+ <source>Discovery Search</source>
+ <translation>查找æœç´¢</translation>
+ </message>
+ <message>
+ <source>Search Term:</source>
+ <translation>æœç´¢æœ¯è¯­ï¼š</translation>
+ </message>
+ <message>
+ <source>Network Discovery Settings</source>
+ <translation>网络查找设置</translation>
+ </message>
+ <message>
+ <source>TTL:</source>
+ <translation>TTL:</translation>
+ </message>
+ <message>
+ <source>Timeout (secs):</source>
+ <translation>超时(秒):</translation>
+ </message>
+</context>
+<context>
+ <name>StringTable</name>
+ <message>
+ <source>Unknown</source>
+<translation>未知的</translation>
+ </message>
+ <message>
+ <source>Please correct the problem and try again.</source>
+<translation>请修正该问题,然åŽé‡è¯•ã€‚</translation>
+ </message>
+ <message>
+ <source>Please correct the problem and press continue on the printer.</source>
+<translation>请修正该问题,然åŽæŒ‰æ‰“å°æœºä¸Šçš„“继续â€ã€‚</translation>
+ </message>
+ <message>
+ <source>The printer has started a print job.</source>
+<translation>打å°æœºå·²å¼€å§‹ä¸€é¡¹æ‰“å°ä½œä¸šã€‚</translation>
+ </message>
+ <message>
+ <source>Print job has completed.</source>
+<translation>打å°ä½œä¸šå·²å®Œæˆã€‚</translation>
+ </message>
+ <message>
+ <source>Started rendering a fax job.</source>
+<translation>已开始进行传真作业。</translation>
+ </message>
+ <message>
+ <source>Rendering job completed.</source>
+<translation>作业已完æˆã€‚</translation>
+ </message>
+ <message>
+ <source>The printer is idle.</source>
+<translation>打å°æœºç©ºé—²ã€‚</translation>
+ </message>
+ <message>
+ <source>The printer is busy.</source>
+<translation>打å°æœºå¿™ã€‚</translation>
+ </message>
+ <message>
+ <source>The print job is continuing.</source>
+<translation>正在继续打å°ä½œä¸šã€‚</translation>
+ </message>
+ <message>
+ <source>Turning off.</source>
+<translation>正在关闭。</translation>
+ </message>
+ <message>
+ <source>Report printing.</source>
+<translation>报表打å°ã€‚</translation>
+ </message>
+ <message>
+ <source>Canceling.</source>
+<translation>å–消。</translation>
+ </message>
+ <message>
+ <source>Waiting for ink to dry.</source>
+<translation>等待墨水晾干。</translation>
+ </message>
+ <message>
+ <source>Pen change.</source>
+<translation>更改喷头。</translation>
+ </message>
+ <message>
+ <source>The printer is out of paper.</source>
+<translation>打å°æœºç¼ºçº¸ã€‚</translation>
+ </message>
+ <message>
+ <source>Please load more paper and follow the instructions on the front panel (if any) to continue printing.</source>
+<translation>请装入更多纸张,并éµå¾ªå‰é¢æ¿ä¸Šçš„说明(如果有的è¯ï¼‰è¿›è¡Œæ“作,以继续打å°ã€‚</translation>
+ </message>
+ <message>
+ <source>Banner eject needed.</source>
+<translation>需è¦å¼¹å‡ºæ ‡é¢˜é¡µã€‚</translation>
+ </message>
+ <message>
+ <source>Banner mismatch.</source>
+<translation>标题页ä¸åŒ¹é…。</translation>
+ </message>
+ <message>
+ <source>Photo mismatch.</source>
+<translation>照片ä¸åŒ¹é…。</translation>
+ </message>
+ <message>
+ <source>Duplex mismatch.</source>
+<translation>åŒé¢ä¸åŒ¹é…。</translation>
+ </message>
+ <message>
+ <source>Paper or cartridge carriage jammed.</source>
+<translation>纸张或墨盒架å¡ä½ã€‚</translation>
+ </message>
+ <message>
+ <source>Please clear the jam and press continue on the printer.</source>
+<translation>请清ç†å µå¡žï¼Œç„¶åŽæŒ‰æ‰“å°æœºä¸Šçš„“继续â€ã€‚</translation>
+ </message>
+ <message>
+ <source>There is a problem with a cartridge.</source>
+<translation>墨盒出现问题。</translation>
+ </message>
+ <message>
+ <source>Powering down.</source>
+<translation>断电。</translation>
+ </message>
+ <message>
+ <source>Front panel test.</source>
+<translation>å‰é¢æ¿æµ‹è¯•ã€‚</translation>
+ </message>
+ <message>
+ <source>Clean out tray missing.</source>
+<translation>缺少出纸托盘。</translation>
+ </message>
+ <message>
+ <source>Output bin full.</source>
+<translation>出纸盒已满。</translation>
+ </message>
+ <message>
+ <source>Media size mismatch.</source>
+<translation>介质大å°ä¸åŒ¹é…。</translation>
+ </message>
+ <message>
+ <source>Duplexer is jammed.</source>
+<translation>åŒé¢æ‰“å°å™¨å¤¹çº¸ã€‚</translation>
+ </message>
+ <message>
+ <source>An ink cartridge is out of ink.</source>
+<translation>æŸä¸ªå¢¨ç›’的墨水已用光。</translation>
+ </message>
+ <message>
+ <source>Internal device error.</source>
+<translation>设备内部错误。</translation>
+ </message>
+ <message>
+ <source>Second tray missing.</source>
+<translation>缺少第二个托盘。</translation>
+ </message>
+ <message>
+ <source>Duplexer missing.</source>
+<translation>缺少åŒé¢æ‰“å°å™¨ã€‚</translation>
+ </message>
+ <message>
+ <source>Rear tray missing.</source>
+<translation>缺少åŽæ‰˜ç›˜ã€‚</translation>
+ </message>
+ <message>
+ <source>Cartridge not latched.</source>
+<translation>墨盒未é”ä½ã€‚</translation>
+ </message>
+ <message>
+ <source>Battery very low.</source>
+<translation>电池电é‡æžä½Žã€‚</translation>
+ </message>
+ <message>
+ <source>Output tray closed.</source>
+<translation>出纸托盘已关闭。</translation>
+ </message>
+ <message>
+ <source>Manual feed blocked.</source>
+<translation>手动é€çº¸å—阻。</translation>
+ </message>
+ <message>
+ <source>Rear feed blocked.</source>
+<translation>背é¢é€çº¸å—阻。</translation>
+ </message>
+ <message>
+ <source>Second tray out of paper.</source>
+<translation>第二个托盘缺纸。</translation>
+ </message>
+ <message>
+ <source>Input tray locked.</source>
+<translation>进纸托盘已é”定。</translation>
+ </message>
+ <message>
+ <source>Non-HP ink.</source>
+<translation>éž HP 墨水。</translation>
+ </message>
+ <message>
+ <source>Pen calibration needs resume.</source>
+<translation>需è¦æ¢å¤å–·å¤´æ ¡å‡†ã€‚</translation>
+ </message>
+ <message>
+ <source>Media type mismatch.</source>
+<translation>介质类型ä¸åŒ¹é…。</translation>
+ </message>
+ <message>
+ <source>Custom media mismatch.</source>
+<translation>自定义介质ä¸åŒ¹é…。</translation>
+ </message>
+ <message>
+ <source>Pen cleaning in progress.</source>
+<translation>正在清洗喷头。</translation>
+ </message>
+ <message>
+ <source>Pen checking in progress.</source>
+<translation>正在检查喷头。</translation>
+ </message>
+ <message>
+ <source>Black cartridge is low on ink</source>
+<translation>黑色墨盒墨水低</translation>
+ </message>
+ <message>
+ <source>Tri-color cartridge is low on ink</source>
+<translation>三色墨盒墨水低</translation>
+ </message>
+ <message>
+ <source>Photo cartridge is low on ink</source>
+<translation>照片墨盒墨水低</translation>
+ </message>
+ <message>
+ <source>Cyan cartridge is low on ink</source>
+<translation>é’色墨盒墨水低</translation>
+ </message>
+ <message>
+ <source>Magenta cartridge is low on ink</source>
+<translation>å“红色墨盒墨水低</translation>
+ </message>
+ <message>
+ <source>Yellow cartridge is low on ink</source>
+<translation>黄色墨盒墨水低</translation>
+ </message>
+ <message>
+ <source>Photo cyan cartridge is low on ink</source>
+<translation>照片é’色墨盒墨水低</translation>
+ </message>
+ <message>
+ <source>Photo magenta cartridge is low on ink</source>
+<translation>照片å“红色墨盒墨水低</translation>
+ </message>
+ <message>
+ <source>Photo yellow cartridge is low on ink</source>
+<translation>照片黄色墨盒墨水低</translation>
+ </message>
+ <message>
+ <source>Photo gray cartridge is low on ink</source>
+<translation>照片ç°è‰²å¢¨ç›’墨水低</translation>
+ </message>
+ <message>
+ <source>Photo blue cartridge is low on ink</source>
+<translation>照片è“色墨盒墨水低</translation>
+ </message>
+ <message>
+ <source>Black cartridge is low on toner</source>
+<translation>黑色墨盒墨粉低</translation>
+ </message>
+ <message>
+ <source>Cyan cartridge is low on toner</source>
+<translation>é’色墨盒墨粉低</translation>
+ </message>
+ <message>
+ <source>Magenta cartridge is low on toner</source>
+<translation>å“红色墨盒墨粉低</translation>
+ </message>
+ <message>
+ <source>Yellow cartridge is low on toner</source>
+<translation>黄色墨盒墨粉低</translation>
+ </message>
+ <message>
+ <source>Warming up.</source>
+<translation>正在热机。</translation>
+ </message>
+ <message>
+ <source>Low paper.</source>
+<translation>纸张é‡ä½Žã€‚</translation>
+ </message>
+ <message>
+ <source>Door open.</source>
+<translation>仓门已打开。</translation>
+ </message>
+ <message>
+ <source>Offline.</source>
+<translation>脱机。</translation>
+ </message>
+ <message>
+ <source>Low toner.</source>
+<translation>墨粉低。</translation>
+ </message>
+ <message>
+ <source>No toner.</source>
+<translation>无墨粉。</translation>
+ </message>
+ <message>
+ <source>Service request.</source>
+<translation>æœåŠ¡è¯·æ±‚。</translation>
+ </message>
+ <message>
+ <source>Fuser error.</source>
+<translation>熔å‡å™¨é”™è¯¯ã€‚</translation>
+ </message>
+ <message>
+ <source>Unsupported printer model.</source>
+<translation>ä¸æ”¯æŒçš„打å°æœºæ¨¡å¼ã€‚</translation>
+ </message>
+ <message>
+ <source>Scan job started.</source>
+<translation>扫æ作业已开始。</translation>
+ </message>
+ <message>
+ <source>Scan job completed.</source>
+<translation>扫æ作业已完æˆã€‚</translation>
+ </message>
+ <message>
+ <source>Scan job failed.</source>
+<translation>扫æ作业失败。</translation>
+ </message>
+ <message>
+ <source>Fax job started.</source>
+<translation>传真作业已开始。</translation>
+ </message>
+ <message>
+ <source>Fax job complete.</source>
+<translation>传真作业已完æˆã€‚</translation>
+ </message>
+ <message>
+ <source>Fax job failed.</source>
+<translation>传真作业失败。</translation>
+ </message>
+ <message>
+ <source>Fax job canceled.</source>
+<translation>传真作业已å–消。</translation>
+ </message>
+ <message>
+ <source>Fax send job continuing.</source>
+<translation>传真å‘é€ä½œä¸šæ­£åœ¨ç»§ç»­ã€‚</translation>
+ </message>
+ <message>
+ <source>Fax receive job continuing.</source>
+<translation>传真接收作业正在继续。</translation>
+ </message>
+ <message>
+ <source>Copy job started.</source>
+<translation>å¤å°ä½œä¸šå·²å¼€å§‹ã€‚</translation>
+ </message>
+ <message>
+ <source>Copy job complete.</source>
+<translation>å¤å°ä½œä¸šå®Œæˆã€‚</translation>
+ </message>
+ <message>
+ <source>Copy job failed.</source>
+<translation>å¤å°ä½œä¸šå¤±è´¥ã€‚</translation>
+ </message>
+ <message>
+ <source>Copy job canceled.</source>
+<translation>å¤å°ä½œä¸šå·²å–消。</translation>
+ </message>
+ <message>
+ <source>Device is powered down or unplugged.</source>
+<translation>设备断电或未接电。</translation>
+ </message>
+ <message>
+ <source>Device communication error.</source>
+<translation>设备通信错误。</translation>
+ </message>
+ <message>
+ <source>Device is busy.</source>
+<translation>设备忙。</translation>
+ </message>
+ <message>
+ <source>No data.</source>
+<translation>æ— æ•°æ®ã€‚</translation>
+ </message>
+ <message>
+ <source>Unsupported I/O bus.</source>
+<translation>ä¸æ”¯æŒçš„ I/O 总线。</translation>
+ </message>
+ <message>
+ <source>Device does not support requested operation.</source>
+<translation>设备ä¸æ”¯æŒè¯·æ±‚çš„æ“作。</translation>
+ </message>
+ <message>
+ <source>To send a fax you must run hp-sendfax first.</source>
+<translation>è¦å‘é€ä¼ çœŸï¼Œå¿…须首先è¿è¡Œ hp-sendfax。</translation>
+ </message>
+ <message>
+ <source>Run hp-sendfax now to continue. Fax will resume within 10 seconds.</source>
+<translation>现在è¿è¡Œ hp-sendfax 以继续。传真将在 10 秒内继续。</translation>
+ </message>
+ <message>
+ <source>Photocard unload started.</source>
+<translation>照片å¡å¸è½½å·²å¼€å§‹ã€‚</translation>
+ </message>
+ <message>
+ <source>Photocard unload ended.</source>
+<translation>照片å¡å¸è½½å·²ç»“æŸã€‚</translation>
+ </message>
+ <message>
+ <source>Photocard unload failed.</source>
+<translation>照片å¡å¸è½½å¤±è´¥ã€‚</translation>
+ </message>
+ <message>
+ <source>Make sure photocard is inserted properly and try again.</source>
+<translation>请确ä¿å·²æ­£ç¡®æ’入照片å¡ï¼Œç„¶åŽé‡è¯•ã€‚</translation>
+ </message>
+ <message>
+ <source>Unable to mount photocard on device.</source>
+<translation>无法在设备上安装照片å¡ã€‚</translation>
+ </message>
+ <message>
+ <source>Photocard unloaded successfully.</source>
+<translation>å·²æˆåŠŸå¸è½½ç…§ç‰‡å¡ã€‚</translation>
+ </message>
+ <message>
+ <source>Unknown error.</source>
+<translation>未知错误。</translation>
+ </message>
+ <message>
+ <source>Print</source>
+<translation>HP Linux æˆåƒä¸Žæ‰“å°ç³»ç»Ÿ (HPLIP) 安装程åº</translation>
+ </message>
+ <message>
+ <source>Scan</source>
+<translation>扫æ作业已开始。</translation>
+ </message>
+ <message>
+ <source>Send fax</source>
+<translation>å‘é€ä¼ çœŸ</translation>
+ </message>
+ <message>
+ <source>Make copies</source>
+<translation>å¤å°</translation>
+ </message>
+ <message>
+ <source>Access photo cards</source>
+<translation>读å–照片å¡</translation>
+ </message>
+ <message>
+ <source>Invalid/missing</source>
+<translation>无效/缺失</translation>
+ </message>
+ <message>
+ <source>Invalid/missing ink cartridge</source>
+<translation>无效/缺失墨水墨盒</translation>
+ </message>
+ <message>
+ <source>Invalid/missing cartridge</source>
+<translation>无效/缺失墨盒</translation>
+ </message>
+ <message>
+ <source>Invalid/missing print head</source>
+<translation>无效/缺失打å°å¤´</translation>
+ </message>
+ <message>
+ <source>Black print head</source>
+<translation>黑色打å°å¤´</translation>
+ </message>
+ <message>
+ <source>Black ink cartridge</source>
+<translation>黑色墨水墨盒</translation>
+ </message>
+ <message>
+ <source>Black cartridge</source>
+<translation>黑色墨盒墨水低</translation>
+ </message>
+ <message>
+ <source>Tri-color print head</source>
+<translation>三色打å°å¤´</translation>
+ </message>
+ <message>
+ <source>Tri-color ink cartridge</source>
+<translation>三色墨水墨盒</translation>
+ </message>
+ <message>
+ <source>Tri-color cartridge</source>
+<translation>三色墨盒墨水低</translation>
+ </message>
+ <message>
+ <source>Photo print head</source>
+<translation>照片打å°å¤´</translation>
+ </message>
+ <message>
+ <source>Photo ink cartridge</source>
+<translation>照片墨水墨盒</translation>
+ </message>
+ <message>
+ <source>Photo cartridge</source>
+<translation>照片墨盒墨水低</translation>
+ </message>
+ <message>
+ <source>Cyan print head</source>
+<translation>é’色打å°å¤´</translation>
+ </message>
+ <message>
+ <source>Cyan ink cartridge</source>
+<translation>é’色墨水墨盒</translation>
+ </message>
+ <message>
+ <source>Cyan cartridge</source>
+<translation>é’色墨盒墨水低</translation>
+ </message>
+ <message>
+ <source>Magenta print head</source>
+<translation>å“红色打å°å¤´</translation>
+ </message>
+ <message>
+ <source>Magenta ink cartridge</source>
+<translation>å“红色墨水墨盒</translation>
+ </message>
+ <message>
+ <source>Magenta cartridge</source>
+<translation>å“红色墨盒墨水低</translation>
+ </message>
+ <message>
+ <source>Yellow print head</source>
+<translation>黄色打å°å¤´</translation>
+ </message>
+ <message>
+ <source>Yellow ink cartridge</source>
+<translation>黄色墨水墨盒</translation>
+ </message>
+ <message>
+ <source>Yellow cartridge</source>
+<translation>黄色墨盒墨水低</translation>
+ </message>
+ <message>
+ <source>Photo cyan print head</source>
+<translation>照片é’色打å°å¤´</translation>
+ </message>
+ <message>
+ <source>Photo cyan ink cartridge</source>
+<translation>照片é’色墨水墨盒</translation>
+ </message>
+ <message>
+ <source>Photo cyan cartridge</source>
+<translation>照片é’色墨盒墨水低</translation>
+ </message>
+ <message>
+ <source>Photo magenta print head</source>
+<translation>照片å“红色打å°å¤´</translation>
+ </message>
+ <message>
+ <source>Photo magenta ink cartridge</source>
+<translation>照片å“红色墨水墨盒</translation>
+ </message>
+ <message>
+ <source>Photo magenta cartridge</source>
+<translation>照片å“红色墨盒墨水低</translation>
+ </message>
+ <message>
+ <source>Photo yellow print head</source>
+<translation>照片黄色打å°å¤´</translation>
+ </message>
+ <message>
+ <source>Photo yellow ink cartridge</source>
+<translation>照片黄色墨水墨盒</translation>
+ </message>
+ <message>
+ <source>Photo yellow cartridge</source>
+<translation>照片黄色墨盒墨水低</translation>
+ </message>
+ <message>
+ <source>Photo gray print head</source>
+<translation>照片ç°è‰²æ‰“å°å¤´</translation>
+ </message>
+ <message>
+ <source>Photo gray ink cartridge</source>
+<translation>照片ç°è‰²å¢¨æ°´å¢¨ç›’</translation>
+ </message>
+ <message>
+ <source>Photo gray cartridge</source>
+<translation>照片ç°è‰²å¢¨ç›’墨水低</translation>
+ </message>
+ <message>
+ <source>Photo blue print head</source>
+<translation>照片è“色打å°å¤´</translation>
+ </message>
+ <message>
+ <source>Photo blue ink cartridge</source>
+<translation>照片è“色墨水墨盒</translation>
+ </message>
+ <message>
+ <source>Photo blue cartridge</source>
+<translation>照片è“色墨盒墨水低</translation>
+ </message>
+ <message>
+ <source>Print head</source>
+<translation>打å°å¤´</translation>
+ </message>
+ <message>
+ <source>Photo magenta and photo cyan print head</source>
+<translation>照片å“红色和照片é’色打å°å¤´</translation>
+ </message>
+ <message>
+ <source>Magenta and yellow print head</source>
+<translation>å“红色和黄色打å°å¤´</translation>
+ </message>
+ <message>
+ <source>Black and cyan print head</source>
+<translation>黑色和é’色打å°å¤´</translation>
+ </message>
+ <message>
+ <source>Light gray and photo black print head</source>
+<translation>æ·¡ç°å’Œç…§ç‰‡é»‘色打å°å¤´</translation>
+ </message>
+ <message>
+ <source>Light gray ink cartridge</source>
+<translation>æ·¡ç°å¢¨æ°´å¢¨ç›’</translation>
+ </message>
+ <message>
+ <source>Medium gray ink cartridge</source>
+<translation>中ç°å¢¨æ°´å¢¨ç›’</translation>
+ </message>
+ <message>
+ <source>Photo black ink cartridge</source>
+<translation>照片黑色墨水墨盒</translation>
+ </message>
+ <message>
+ <source>Cyan and magenta print head</source>
+<translation>é’色和å“红色打å°å¤´</translation>
+ </message>
+ <message>
+ <source>Black and yellow print head</source>
+<translation>黑色和黄色打å°å¤´</translation>
+ </message>
+ <message>
+ <source>Black toner cartridge</source>
+<translation>黑色墨粉墨盒</translation>
+ </message>
+ <message>
+ <source>Cyan toner cartridge</source>
+<translation>é’色墨粉墨盒</translation>
+ </message>
+ <message>
+ <source>Magenta toner cartridge</source>
+<translation>å“红色墨粉墨盒</translation>
+ </message>
+ <message>
+ <source>Yellow toner cartridge</source>
+<translation>黄色墨粉墨盒</translation>
+ </message>
+ <message>
+ <source>Maintenance kit (fuser)</source>
+<translation>维护工具包(熔å‡å™¨ï¼‰</translation>
+ </message>
+ <message>
+ <source>Document feeder (ADF) kit</source>
+<translation>文档é€çº¸å™¨ (ADF) 工具包</translation>
+ </message>
+ <message>
+ <source>Drum maintenance kit</source>
+<translation>鼓维护工具包</translation>
+ </message>
+ <message>
+ <source>Image transfer kit</source>
+<translation>图åƒä¼ é€å·¥å…·åŒ…</translation>
+ </message>
+ <message>
+ <source>Good/OK</source>
+<translation>优秀/良好</translation>
+ </message>
+ <message>
+ <source>Fair/Moderate</source>
+<translation>ä¸é”™/一般</translation>
+ </message>
+ <message>
+ <source>Not installed</source>
+<translation>未安装</translation>
+ </message>
+ <message>
+ <source>Incorrect</source>
+<translation>ä¸æ­£ç¡®</translation>
+ </message>
+ <message>
+ <source>Failed</source>
+<translation>错误:照片å¡æ— æ³•æ­£ç¡®å®‰è£…。请检查设备和å¡ï¼Œç„¶åŽé‡è¯•ã€‚</translation>
+ </message>
+ <message>
+ <source>Overheated</source>
+<translation>过热</translation>
+ </message>
+ <message>
+ <source>Discharging</source>
+<translation>正在放电</translation>
+ </message>
+ <message>
+ <source>Charging</source>
+<translation>正在充电</translation>
+ </message>
+ <message>
+ <source>Low</source>
+<translation>纸张é‡ä½Žã€‚</translation>
+ </message>
+ <message>
+ <source>Very low</source>
+<translation>éžå¸¸ä½Ž</translation>
+ </message>
+ <message>
+ <source>HPLIP: Email alert test message</source>
+<translation>HPLIP:电å­é‚®ä»¶è­¦æŠ¥æµ‹è¯•æ¶ˆæ¯</translation>
+ </message>
+ <message>
+ <source>This email is to test the functionality of HPLIP email alerts.</source>
+<translation>该电å­é‚®ä»¶ç”¨äºŽæµ‹è¯• HPLIP 电å­é‚®ä»¶è­¦æŠ¥çš„功能。</translation>
+ </message>
+ <message>
+ <source>HPLIP: Error/alert on device: </source>
+<translation>HPLIP:设备错误/警报:</translation>
+ </message>
+</context>
+<context>
+ <name>SupportForm_base</name>
+ <message>
+ <source>HP Device Manager - Support Information</source>
+ <translation>HP 设备管ç†å™¨ – 支æŒä¿¡æ¯</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>关闭</translation>
+ </message>
+ <message>
+ <source>http://hplip.sourceforge.net</source>
+ <translation>http://hplip.sourceforge.net</translation>
+ </message>
+ <message>
+ <source>HPLIP is free, open source software distributed under the MIT, BSD, and GPL licenses. &lt;b&gt;&lt;i&gt;HP does not provide formal consumer or commercial support for this software.&lt;/i&gt;&lt;/b&gt;&lt;p&gt; Support is provided informally through a series of resources on a Sourceforge.net website. On this HP sponsored website, you will find FAQs, open discussion forums, installation instructions, a product support table, and other support materials.</source>
+ <translation>HPLIP 是按照 MITã€BSD å’Œ GPL 许å¯å议分å‘çš„å…费开æºè½¯ä»¶ã€‚&lt;b&gt;&lt;i&gt;HP ä¸ä¸ºè¯¥è½¯ä»¶æ供正å¼çš„用户或商业支æŒã€‚&lt;/i&gt;&lt;/b&gt;&lt;p&gt;而通过 Sourceforge.net 网站上的一系列资æºæä¾›éžæ­£å¼æ”¯æŒã€‚用户å¯åœ¨ HP 所赞助的这一网站上找到常è§é—®é¢˜è§£ç­”ã€å¼€æ”¾å¼è®ºå›ã€å®‰è£…说明ã€äº§å“支æŒè¡¨åŠå…¶ä»–支æŒæ料。</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;HP Sponsored Support&lt;/b&gt;</source>
+ <translation>&lt;b&gt;ç”± HP 赞助的支æŒ&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>NOTE: Sourceforge.net is owned and operated by OSTG, Inc. and is not affiliated with HP.</source>
+ <translation>注æ„:Sourceforge.net 为 OSTG, Inc. 所有并由其进行è¿ä½œï¼Œè€Œä¸éš¶å±žäºŽ HP。</translation>
+ </message>
+ <message>
+ <source>HP</source>
+ <translation>HP</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;README File&lt;/b&gt;</source>
+ <translation>&lt;b&gt;自述文件&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>A readme file was shipped with your version of HPLIP. This file contains the product support table, a troubleshooting guide, and other support resources.</source>
+ <translation>用户所购买 HPLIP 版本已附带自述文件。此文件包å«äº§å“支æŒè¡¨ã€æ•…障排除å‘导以åŠå…¶ä»–支æŒæ料。</translation>
+ </message>
+ <message>
+ <source>hplip_readme.html</source>
+ <translation>hplip_readme.html</translation>
+ </message>
+ <message>
+ <source>README File</source>
+ <translation>自述文件</translation>
+ </message>
+ <message>
+ <source>http://linuxprinting.org</source>
+ <translation>http://linuxprinting.org</translation>
+ </message>
+ <message>
+ <source>General Linux printing assistance is also available from open discussion forums, documentation, access to PPD files, etc. from:</source>
+ <translation>用户在以下网站中,å¯é€šè¿‡å¼€æ”¾å¼è®ºå›ã€æ–‡æ¡£ä»¥åŠè®¿é—® PPD 文件æ¥èŽ·å– Linux 常规打å°å¸®åŠ©ä¿¡æ¯ï¼š</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;linuxprinting.org&lt;/b&gt;</source>
+ <translation>&lt;b&gt;linuxprinting.org&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>NOTE: Linuxprinting.org is operated through the generous efforts of Grant Taylor and Till Kamppeter and is not affiliated with HP.</source>
+ <translation>注æ„:Linuxprinting.org çš„è¿ä½œå— Grant Taylor å’Œ Till Kamppeter 的大力支æŒï¼Œè€Œä¸éš¶å±žäºŽ HP。</translation>
+ </message>
+ <message>
+ <source>linuxprinting.org</source>
+ <translation>linuxprinting.org</translation>
+ </message>
+ <message>
+ <source>http://cups.org</source>
+ <translation>http://cups.org</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;CUPS&lt;/b&gt;</source>
+ <translation>&lt;b&gt;CUPS&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Information about CUPS (Common UNIX Printing System) is available at cups.org. This website also contains forums and other support resources for printing on Linux:</source>
+ <translation>有关 CUPS(通用 UNIX 打å°ç³»ç»Ÿï¼‰çš„ä¿¡æ¯ï¼Œè¯·è®¿é—® cups.org。该网站还包å«æœ‰å…³ Linux 打å°æŠ€æœ¯çš„论å›åŠå…¶ä»–支æŒèµ„æºï¼š</translation>
+ </message>
+ <message>
+ <source>NOTE: CUPS and the CUPS website is owned and operated by Easy Software Products and is not affiliated with HP.</source>
+ <translation>注æ„:CUPS å’Œ CUPS 网站为 Easy Software Products 所有并由其进行è¿ä½œï¼Œè€Œä¸éš¶å±žäºŽ HP。</translation>
+ </message>
+ <message>
+ <source>CUPS</source>
+ <translation>CUPS</translation>
+ </message>
+</context>
+<context>
+ <name>UnloadForm</name>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;No devices found that support photo card access.&lt;/b&gt;&lt;p&gt;Please make sure your device is properly installed and try again.</source>
+ <translation>&lt;p&gt;&lt;b&gt;未找到支æŒç…§ç‰‡å¡è¯»å–的设备。&lt;/b&gt;&lt;p&gt;请确认已正确安装设备并é‡è¯•ã€‚</translation>
+ </message>
+ <message>
+ <source>HP Device Manager - Unload Photo Card</source>
+ <translation>HP 设备管ç†å™¨ – å¸ä¸‹ç…§ç‰‡å¡</translation>
+ </message>
+</context>
+<context>
+ <name>UnloadForm_base</name>
+ <message>
+ <source>HP Device Manager - Unload Files from Photo Card</source>
+ <translation>HP 设备管ç†å™¨ – å¸è½½ç…§ç‰‡å¡ä¸­çš„文件</translation>
+ </message>
+ <message>
+ <source>Device:</source>
+ <translation>设备:</translation>
+ </message>
+ <message>
+ <source>Unload Selected Files</source>
+ <translation>å¸è½½æ‰€é€‰æ–‡ä»¶</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>关闭</translation>
+ </message>
+ <message>
+ <source>Unload Directory:</source>
+ <translation>å¸è½½ç›®å½•ï¼š</translation>
+ </message>
+ <message>
+ <source>Browse...</source>
+ <translation>æµè§ˆ...</translation>
+ </message>
+ <message>
+ <source>File Removal:</source>
+ <translation>文件删除:</translation>
+ </message>
+ <message>
+ <source>Leave all files on photo card</source>
+ <translation>在照片å¡ä¸­ä¿ç•™æ‰€æœ‰æ–‡ä»¶</translation>
+ </message>
+ <message>
+ <source>Remove selected files</source>
+ <translation>删除所选文件</translation>
+ </message>
+ <message>
+ <source>Select Files to Unload from Photo Card:</source>
+ <translation>选择è¦ä»Žç…§ç‰‡å¡ä¸­å¸è½½çš„文件:</translation>
+ </message>
+ <message>
+ <source>Select All</source>
+ <translation>全选</translation>
+ </message>
+ <message>
+ <source>Select None</source>
+ <translation>选择“无â€</translation>
+ </message>
+ <message>
+ <source>Show Thumbnails</source>
+ <translation>显示缩略图</translation>
+ </message>
+</context>
+<context>
+ <name>WaitForm_base</name>
+ <message>
+ <source>HP Device Manager - Waiting</source>
+ <translation>HP 设备管ç†å™¨ – 等待</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Waiting for procedure to finish...&lt;/b&gt;</source>
+ <translation>&lt;b&gt;等待步骤完æˆ...&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>å–消</translation>
+ </message>
+</context>
+<context>
+ <name>self.form.FailureUI</name>
+ <message>
+ <source>&lt;b&gt;Unable to mount photo card on device.&lt;/b&gt;&lt;p&gt;Check that device is powered on and photo card is correctly inserted.</source>
+<translation>&lt;b&gt;无法在设备上安装照片å¡ã€‚&lt;/b&gt;&lt;p&gt;请检查以确ä¿è®¾å¤‡é€šç”µï¼Œä¸”已正确æ’入照片å¡ã€‚</translation>
+ </message>
+</context>
+</TS>
diff --git a/data/models/models.dat b/data/models/models.dat
new file mode 100644
index 0000000..3e03f29
--- /dev/null
+++ b/data/models/models.dat
@@ -0,0 +1,48946 @@
+# (c) Copyright 2003-2009 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+#
+# NOTICE:
+#
+# This file automatically generated by the HPLIP model editor (model_editor.py).
+# Please do NOT hand edit this file.
+#
+# Last written on Tue, 10 Apr 2012 12:15:36 by sanjay.
+# Model editor version 10.2 (Qt4).
+
+
+[hp_colorpro_plotter]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=0
+io-mode=0
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP ColorPro Plotter
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=2b82
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_designjet]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=0
+io-mode=0
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP Designjet Printer
+model2=HP Designjet Scanner
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=219b2b
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_designjet_colorpro]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=0
+io-mode=0
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP Designjet ColorPro GA Printer
+model2=HP Designjet ColorPro CAD Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=38cb
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_deskjet_plus]
+align-type=0
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_printer.png
+io-mfp-mode=6
+io-mode=1
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet Plus Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=2518
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_draftmaster]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=0
+io-mode=0
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP Draftmaster mx Plotter
+model2=HP Draftmaster mx Plus Plotter
+model3=HP Draftmaster rx Plotter
+model4=HP Draftmaster rx Plus Plotter
+model5=HP Draftmaster sx Plotter
+model6=HP Draftmaster sx Plus Plotter
+model7=HP Draftmaster I/II Plotter
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=2d69
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_draftpro]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=0
+io-mode=0
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP Draftpro Plotter
+model2=HP Draftpro DXL Plotter
+model3=HP Draftpro EXL Plotter
+model4=HP Draftpro Plus Plotter
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=2b82
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_eaglejet]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_printer.png
+io-mfp-mode=0
+io-mode=0
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP Eaglejet Printer
+model2=HP AB Eaglejet II RTL (42 in) Printer
+model3=HP AB Eaglejet II RTL (60 in) Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=3a41
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_photosmart]
+align-type=0
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_printer.png
+io-mfp-mode=6
+io-mode=1
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart Photo Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=2eb8
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[officejet]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=officejet_k80.png
+io-mfp-mode=7
+io-mode=0
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP OfficeJet All-in-One Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=26(51626A)
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=2de2
+support-type=2
+support-ver=0.9.5
+tech-class=DJ540
+tech-subclass=GrayscaleOnly
+tech-type=1
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[officejet_d_series]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=1
+fw-download=False
+icon=Officejet_6150_Series.png
+io-mfp-mode=6
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet d125xi All-in-One Printer
+model2=HP Officejet d135 All-in-One Printer
+model3=HP Officejet d135xi All-in-One Printer
+model4=HP Officejet d145xi All-in-One Printer
+model5=HP Officejet d145 All-in-One Printer
+model6=HP Officejet d155xi All-in-One Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=2
+r0-agent1-sku=14d (C5011DN)
+r0-agent1-type=1
+r0-agent2-kind=2
+r0-agent2-sku=14d (C5010DN)
+r0-agent2-type=2
+r0-agent3-kind=1
+r0-agent3-sku=14 (C4920A)
+r0-agent3-type=1
+r0-agent4-kind=1
+r0-agent4-sku=14 (C4921A)
+r0-agent4-type=4
+r0-agent5-kind=1
+r0-agent5-sku=14 (C4922A)
+r0-agent5-type=5
+r0-agent6-kind=1
+r0-agent6-sku=14 (C4923A)
+r0-agent6-type=6
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJ9xxVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=2311
+usb-vid=3f0
+wifi-config=0
+
+[officejet_lx]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=officejet_k80.png
+io-mfp-mode=7
+io-mode=0
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet Lx All-in-One Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=26(51626A)
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=2de2
+support-type=2
+support-ver=0.9.5
+tech-class=DJ540
+tech-subclass=GrayscaleOnly
+tech-type=1
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[officejet_t_series]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=1
+fw-download=False
+icon=OfficeJet_G85.png
+io-mfp-mode=7
+io-mode=1
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP OfficeJet t45 All-in-One Printer
+model2=HP OfficeJet t45xi All-in-One Printer
+model3=HP OfficeJet t65 All-in-One Printer
+model4=HP OfficeJet t65xi All-in-One Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=45 (51645A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=23 (C1823D or C1823T)
+r0-agent2-type=2
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=1
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJ8xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_2]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=0
+io-mode=0
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP 2-pen Graphics Plotter
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=26a4
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_4ml]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=HP_LaserJet_4M.png
+io-mfp-mode=6
+io-mode=1
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 4mL Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=92274A
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=2b46
+support-type=2
+support-ver=0.9.5
+tech-class=LJMono
+tech-subclass=300dpiOnly
+tech-type=3
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_4mp]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=HP_LaserJet_4M.png
+io-mfp-mode=6
+io-mode=1
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 4mp Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=92298A
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=2bfd
+support-type=2
+support-ver=0.9.5
+tech-class=LJMono,Postscript
+tech-subclass=Normal
+tech-type=3
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_4_plus]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=HP_LaserJet_4M.png
+io-mfp-mode=6
+io-mode=1
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 4 Plus Printer
+model2=HP LaserJet 4m Plus Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=92298A
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=2dc7
+support-type=2
+support-ver=0.9.5
+tech-class=LJMono,Postscript
+tech-subclass=Normal
+tech-type=3
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_4l]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=HP_LaserJet_4M.png
+io-mfp-mode=6
+io-mode=1
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 4L Printer
+model2=HP LaserJet 4L Pro Printer
+model3=HP LaserJet 4Lc Printer
+model4=HP LaserJet 4ML Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=92274A
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=2e7b
+support-type=2
+support-ver=0.9.5
+tech-class=LJMono
+tech-subclass=300dpiOnly
+tech-type=3
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_4v]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=HP_LaserJet_4M.png
+io-mfp-mode=6
+io-mode=1
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 4v Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=92291A
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=30fb
+support-type=2
+support-ver=0.9.5
+tech-class=LJMono,Postscript
+tech-subclass=Normal
+tech-type=3
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_4si]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=HP_LaserJet_4M.png
+io-mfp-mode=6
+io-mode=1
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 4si Printer
+model2=HP LaserJet 4si mx Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=92291A
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=2cb3
+support-type=2
+support-ver=0.9.5
+tech-class=LJMono,Postscript
+tech-subclass=Normal
+tech-type=3
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_5si]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=HP_LaserJet_5Si.png
+io-mfp-mode=6
+io-mode=1
+io-support=3
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 5si Printer
+model2=HP LaserJet 5si hm Printer
+model3=HP LaserJet 5si mx Printer
+model4=HP LaserJet 5si nx Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=C3909A
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=3085
+support-type=2
+support-ver=0.9.5
+tech-class=LJMono,Postscript
+tech-subclass=LargeFormatA3
+tech-type=3
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_5l]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=HP_LaserJet_4M.png
+io-mfp-mode=6
+io-mode=1
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 5L Printer
+model2=HP LaserJet 5L-FS Printer
+model3=HP LaserJet 5L Xtra Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=C3906A
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=2e7c
+support-type=2
+support-ver=0.9.5
+tech-class=LJMono
+tech-subclass=Normal
+tech-type=3
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_5si_mopier]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=HP_LaserJet_5Si.png
+io-mfp-mode=6
+io-mode=1
+io-support=3
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 5Si Mopier
+model2=HP LaserJet 5si Mopier Engine
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=C3909A
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=3496
+support-type=2
+support-ver=0.9.5
+tech-class=LJMono,Postscript
+tech-subclass=LargeFormatA3
+tech-type=3
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_5mp]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=HP_LaserJet_4M.png
+io-mfp-mode=6
+io-mode=1
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 5mp Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=C3903A
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=2d89
+support-type=2
+support-ver=0.9.5
+tech-class=LJMono,Postscript
+tech-subclass=Normal
+tech-type=3
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_color_laserjet_5]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=HP_Color_LaserJet_4500.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Color LaserJet 5 Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=C3105A
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=2
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=4
+r0-agent3-type=5
+r0-agent4-kind=4
+r0-agent4-sku=3
+r0-agent4-type=6
+r0-agent5-kind=5
+r0-agent5-sku=67
+r0-agent5-type=62
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=30a1
+support-type=2
+support-ver=0.9.5
+tech-class=LJColor
+tech-subclass=300dpiOnly,LargeFormatA3
+tech-type=4
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_color_laserjet_5m]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=HP_Color_LaserJet_4500.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Color LaserJet 5M Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=C3105A
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=2
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=4
+r0-agent3-type=5
+r0-agent4-kind=4
+r0-agent4-sku=3
+r0-agent4-type=6
+r0-agent5-kind=5
+r0-agent5-sku=67
+r0-agent5-type=62
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=2f34
+support-type=2
+support-ver=0.9.5
+tech-class=LJColor,Postscript
+tech-subclass=300dpiOnly,LargeFormatA3
+tech-type=4
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_5p]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=HP_LaserJet_4M.png
+io-mfp-mode=6
+io-mode=1
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 5p Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=C3903A
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=2d89
+support-type=2
+support-ver=0.9.5
+tech-class=LJMono
+tech-subclass=Normal
+tech-type=3
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_6l]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=HP_LaserJet_6MP.png
+io-mfp-mode=6
+io-mode=1
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 6L Printer
+model2=HP LaserJet 6Lse Printer
+model3=HP LaserJet 6Lxi Printer
+model4=HP LaserJet 6L Gold Printer
+model5=HP LaserJet 6L Pro Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=C3906A
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=320e
+support-type=2
+support-ver=0.9.5
+tech-class=LJMono
+tech-subclass=Normal
+tech-type=3
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_6p]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=HP_LaserJet_6MP.png
+io-mfp-mode=6
+io-mode=1
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 6p Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=C3903A
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=3137
+support-type=2
+support-ver=0.9.5
+tech-class=LJMono
+tech-subclass=Normal
+tech-type=3
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_6mp]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=HP_LaserJet_6MP.png
+io-mfp-mode=6
+io-mode=1
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 6mp Printer
+model2=HP LaserJet 6mp se Printer
+model3=HP LaserJet 6mp xi Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=C3903A
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=3137
+support-type=2
+support-ver=0.9.5
+tech-class=LJMono,Postscript
+tech-subclass=Normal
+tech-type=3
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_b010_series]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=Photosmart_C5100.png
+io-mfp-mode=3
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart All-in-One Printer - B010
+monitor-type=0
+panel-check-type=1
+pcard-type=2
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=2
+r0-agent1-sku=564/564XL
+r0-agent1-type=1
+r0-agent2-kind=2
+r0-agent2-sku=564/564XL
+r0-agent2-type=4
+r0-agent3-kind=2
+r0-agent3-sku=564/564XL
+r0-agent3-type=5
+r0-agent4-kind=2
+r0-agent4-sku=564/564XL
+r0-agent4-type=6
+r1-agent1-kind=2
+r1-agent1-sku=564/564XL
+r1-agent1-type=1
+r1-agent2-kind=2
+r1-agent2-sku=564/564XL
+r1-agent2-type=4
+r1-agent3-kind=2
+r1-agent3-sku=564/564XL
+r1-agent3-type=5
+r1-agent4-kind=2
+r1-agent4-sku=564/564XL
+r1-agent4-type=6
+r2-agent1-kind=2
+r2-agent1-sku=364/364XL
+r2-agent1-type=1
+r2-agent2-kind=2
+r2-agent2-sku=364/364XL
+r2-agent2-type=4
+r2-agent3-kind=2
+r2-agent3-sku=364/364XL
+r2-agent3-type=5
+r2-agent4-kind=2
+r2-agent4-sku=364/364XL
+r2-agent4-type=6
+r4-agent1-kind=2
+r4-agent1-sku=178/178XL
+r4-agent1-type=1
+r4-agent2-kind=2
+r4-agent2-sku=178/178XL
+r4-agent2-type=4
+r4-agent3-kind=2
+r4-agent3-sku=178/178XL
+r4-agent3-type=5
+r4-agent4-kind=2
+r4-agent4-sku=178/178XL
+r4-agent4-type=6
+r8-agent1-kind=2
+r8-agent1-sku=862/862XL
+r8-agent1-type=1
+r8-agent2-kind=2
+r8-agent2-sku=862/862XL
+r8-agent2-type=4
+r8-agent3-kind=2
+r8-agent3-sku=862/862XL
+r8-agent3-type=5
+r8-agent4-kind=2
+r8-agent4-sku=862/862XL
+r8-agent4-type=6
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=2
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.10.6
+tech-class=Stabler
+tech-subclass=Normal
+tech-type=2
+usb-pid=9711
+usb-vid=3f0
+wifi-config=1
+
+[hp_designjet_10ps]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=0
+io-mode=0
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP Designjet 10ps Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=38d5
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_designjet_20ps]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=0
+io-mode=0
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP Designjet 20ps Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=38d5
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[officejet_v30]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=1
+fw-download=False
+icon=officejet_k80.png
+io-mfp-mode=6
+io-mode=6
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet v30 All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=45 (51645A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=78 (C6578DN/C6578AN)
+r0-agent2-type=2
+scan-src=3
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=1
+support-released=True
+support-subtype=33f2
+support-type=2
+support-ver=0.9.5
+tech-class=DJ9xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=1311
+usb-vid=3f0
+wifi-config=0
+
+[hp_designjet_30]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=0
+io-mode=0
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP Designjet 30 Printer
+model2=HP Designjet 30n Printer
+model3=HP Designjet 30gp Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=3ce0
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[officejet_v40xi]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=1
+fw-download=False
+icon=officejet_k80.png
+io-mfp-mode=6
+io-mode=6
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet v40xi All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=45 (51645A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=78 (C6578DN/C6578AN)
+r0-agent2-type=2
+scan-src=3
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=1
+support-released=True
+support-subtype=33f2
+support-type=2
+support-ver=0.9.5
+tech-class=DJ9xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=1011
+usb-vid=3f0
+wifi-config=0
+
+[officejet_r40]
+align-type=2
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=1
+fw-download=False
+icon=default_officejet.png
+io-mfp-mode=6
+io-mode=1
+io-support=5
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet r40 All-in-One Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=45 (51645A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=23 (C1823D)
+r0-agent2-type=2
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=1
+support-released=True
+support-subtype=2f6e
+support-type=2
+support-ver=0.9.5
+tech-class=DJ8xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[officejet_v40]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=1
+fw-download=False
+icon=officejet_k80.png
+io-mfp-mode=6
+io-mode=6
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet v40 All-in-One Printer
+model2=HP OfficeJet v40S All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=45 (51645A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=78 (C6578DN/C6578AN)
+r0-agent2-type=2
+scan-src=3
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=1
+support-released=True
+support-subtype=348d
+support-type=2
+support-ver=0.9.5
+tech-class=DJ9xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=f11
+usb-vid=3f0
+wifi-config=0
+
+[officejet_r40xi]
+align-type=2
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=1
+fw-download=False
+icon=default_officejet.png
+io-mfp-mode=6
+io-mode=1
+io-support=5
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet r40xi All-in-One Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=45 (51645A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=23 (C1823D)
+r0-agent2-type=2
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=1
+support-released=True
+support-subtype=2fab
+support-type=2
+support-ver=0.9.5
+tech-class=DJ8xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[officejet_r45]
+align-type=2
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=1
+fw-download=False
+icon=default_officejet.png
+io-mfp-mode=6
+io-mode=1
+io-support=5
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet r45 All-in-One Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=45 (51645A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=23 (C1823D)
+r0-agent2-type=2
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=1
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJ8xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[officejet_v45]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=1
+fw-download=False
+icon=officejet_k80.png
+io-mfp-mode=6
+io-mode=6
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet v45 All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=45 (51645A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=78 (C6578DN/C6578AN)
+r0-agent2-type=2
+scan-src=3
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=1
+support-released=True
+support-subtype=33f2
+support-type=2
+support-ver=0.9.5
+tech-class=DJ9xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=1911
+usb-vid=3f0
+wifi-config=0
+
+[hp_designjet_50ps]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=0
+io-mode=0
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP Designjet 50ps Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=38d5
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[officejet_g55]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=1
+fw-download=False
+icon=OfficeJet_G85.png
+io-mfp-mode=6
+io-mode=6
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet g55 All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=45 (51645A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=78 (C6578DN/C6578AN)
+r0-agent2-type=2
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=1
+support-released=True
+support-subtype=348d
+support-type=2
+support-ver=0.9.5
+tech-class=DJ9xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=11
+usb-vid=3f0
+wifi-config=0
+
+[officejet_g55xi]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=1
+fw-download=False
+icon=OfficeJet_G85.png
+io-mfp-mode=6
+io-mode=6
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet g55xi All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=45 (51645A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=78 (C6578DN/C6578AN)
+r0-agent2-type=2
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=1
+support-released=True
+support-subtype=324a
+support-type=2
+support-ver=0.9.5
+tech-class=DJ9xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=111
+usb-vid=3f0
+wifi-config=0
+
+[officejet_k60xi]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=1
+fw-download=False
+icon=officejet_k80.png
+io-mfp-mode=6
+io-mode=6
+io-support=3
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet k60xi All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=45 (51645A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=78 (C6578AN/C6578DN)
+r0-agent2-type=2
+scan-src=3
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=31f0
+support-type=2
+support-ver=0.9.5
+tech-class=DJ9xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=611
+usb-vid=3f0
+wifi-config=0
+
+[officejet_k60]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=1
+fw-download=False
+icon=officejet_k80.png
+io-mfp-mode=6
+io-mode=6
+io-support=3
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet k60 All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=45 (51645A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=78 (C6578AN/C6578DN)
+r0-agent2-type=2
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=324a
+support-type=2
+support-ver=0.9.5
+tech-class=DJ9xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=511
+usb-vid=3f0
+wifi-config=0
+
+[officejet_r60]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=1
+fw-download=False
+icon=default_officejet.png
+io-mfp-mode=6
+io-mode=1
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet r60 All-in-One Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=45 (51645A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=23 (C1823D or C1823T)
+r0-agent2-type=2
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=1
+support-released=True
+support-subtype=30dd
+support-type=2
+support-ver=0.9.5
+tech-class=DJ8xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[officejet_r65]
+align-type=2
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=1
+fw-download=False
+icon=default_officejet.png
+io-mfp-mode=6
+io-mode=1
+io-support=5
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet r65 All-in-One Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=45 (51645A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=23 (C1823D)
+r0-agent2-type=2
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=1
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJ8xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_designjet_70]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=0
+io-mode=0
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP Designjet 70 Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=4052
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[officejet_k80xi]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=1
+fw-download=False
+icon=officejet_k80.png
+io-mfp-mode=6
+io-mode=6
+io-support=3
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet k80xi All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=45 (51645A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=78 (C6578AN/C6578DN)
+r0-agent2-type=2
+scan-src=3
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=33bd
+support-type=2
+support-ver=0.9.5
+tech-class=DJ9xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=811
+usb-vid=3f0
+wifi-config=0
+
+[officejet_k80]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=1
+fw-download=False
+icon=officejet_k80.png
+io-mfp-mode=6
+io-mode=6
+io-support=3
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet k80 All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=45 (51645A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=78 (C6578AN/C6578DN)
+r0-agent2-type=2
+scan-src=3
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJ9xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=711
+usb-vid=3f0
+wifi-config=0
+
+[officejet_r80xi]
+align-type=2
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=1
+fw-download=False
+icon=default_officejet.png
+io-mfp-mode=6
+io-mode=1
+io-support=5
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet r80xi All-in-One Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=45 (51645A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=23 (C1823D)
+r0-agent2-type=2
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=1
+support-released=True
+support-subtype=30dd
+support-type=2
+support-ver=0.9.5
+tech-class=DJ8xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[officejet_r80]
+align-type=2
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=1
+fw-download=False
+icon=default_officejet.png
+io-mfp-mode=6
+io-mode=1
+io-support=5
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet r80 All-in-One Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=45 (51645A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=23 (C1823D)
+r0-agent2-type=2
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=1
+support-released=True
+support-subtype=2f6e
+support-type=2
+support-ver=0.9.5
+tech-class=DJ8xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[officejet_g85]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=OfficeJet_G85.png
+io-mfp-mode=6
+io-mode=6
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet g85 All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=45 (51645A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=78 (C6578DN/C6578AN)
+r0-agent2-type=2
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=1
+support-released=True
+support-subtype=348d
+support-type=2
+support-ver=0.9.5
+tech-class=DJ9xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=211
+usb-vid=3f0
+wifi-config=0
+
+[officejet_g85xi]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=default_officejet.png
+io-mfp-mode=6
+io-mode=6
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet g85xi All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=45 (51645A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=78 (C6578DN/C6578AN)
+r0-agent2-type=2
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=1
+support-released=True
+support-subtype=3396
+support-type=2
+support-ver=0.9.5
+tech-class=DJ9xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=311
+usb-vid=3f0
+wifi-config=0
+
+[hp_designjet_90]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=0
+io-mode=0
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP Designjet 90 Printer
+model2=HP Designjet 90r Printer
+model3=HP Designjet 90gp Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=4014
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[officejet_g95]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=1
+fw-download=False
+icon=OfficeJet_G85.png
+io-mfp-mode=6
+io-mode=6
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet g95 All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=45 (51645A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=78 (C6578AN/C6578DN)
+r0-agent2-type=2
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=1
+support-released=True
+support-subtype=348d
+support-type=2
+support-ver=0.9.5
+tech-class=DJ9xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=411
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_100_colormfp_m175nw]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_color_laserjet_cm1312_mfp.png
+io-mfp-mode=3
+io-mode=1
+io-support=14
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 100 Color MFP M175
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=1
+plugin-reason=64
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CE310A
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=CE311A
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=CE313A
+r0-agent3-type=5
+r0-agent4-kind=4
+r0-agent4-sku=CE312A
+r0-agent4-type=6
+scan-src=3
+scan-type=5
+status-battery-check=0
+status-dynamic-counters=0
+status-type=10
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.11.7
+tech-class=Postscript
+tech-subclass=Normal
+tech-type=4
+usb-pid=62a
+usb-vid=3f0
+wifi-config=-1
+
+[officejet_100_mobile_l411]
+align-type=10
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=dj450.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet 100 Mobile L411
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=1
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=94/98
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=95/97
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=99
+r0-agent3-type=3
+r0-agent4-kind=3
+r0-agent4-sku=100
+r0-agent4-type=19
+r0-agent5-kind=9
+r0-agent5-sku=C8222A/C8263A
+r0-agent5-type=62
+r1-agent1-kind=3
+r1-agent1-sku=94/98
+r1-agent1-type=1
+r1-agent2-kind=3
+r1-agent2-sku=95/97
+r1-agent2-type=2
+r1-agent3-kind=3
+r1-agent3-sku=99
+r1-agent3-type=3
+r1-agent4-kind=3
+r1-agent4-sku=100
+r1-agent4-type=19
+r2-agent1-kind=3
+r2-agent1-sku=338/337
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=343/344
+r2-agent2-type=2
+r2-agent3-kind=3
+r2-agent3-sku=348
+r2-agent3-type=3
+r2-agent4-kind=3
+r2-agent4-sku=100
+r2-agent4-type=19
+r4-agent1-kind=3
+r4-agent1-sku=131/129
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=135/134
+r4-agent2-type=2
+r4-agent3-kind=3
+r4-agent3-sku=138
+r4-agent3-type=3
+r4-agent4-kind=3
+r4-agent4-sku=100
+r4-agent4-type=19
+r8-agent1-kind=3
+r8-agent1-sku=852/851
+r8-agent1-type=1
+r8-agent2-kind=3
+r8-agent2-sku=855/857
+r8-agent2-type=2
+r8-agent3-kind=3
+r8-agent3-sku=858
+r8-agent3-type=3
+r8-agent4-kind=3
+r8-agent4-sku=100
+r8-agent4-type=19
+scan-src=0
+scan-type=0
+status-battery-check=2
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.11.3
+tech-class=StingrayOJ
+tech-subclass=Normal
+tech-type=2
+usb-pid=4912
+usb-vid=3f0
+wifi-config=0
+
+[hp_designjet_100]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=0
+io-mode=0
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP Designjet 100 Printer
+model2=HP Designjet 100 Plus Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=219b2b
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[envy_100_d410_series]
+align-type=16
+clean-type=3
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=psc_2300_series.png
+io-mfp-mode=1
+io-mode=1
+io-support=10
+job-storage=0
+linefeed-cal-type=0
+model1=HP Envy 100 D410 series
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=60/60XL/60b
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=60/60XL
+r0-agent2-type=2
+r10-agent1-kind=3
+r10-agent1-sku=818/818XL/818b
+r10-agent1-type=1
+r10-agent2-kind=3
+r10-agent2-sku=818/818XL
+r10-agent2-type=2
+r18-agent2-kind=3
+r18-agent2-sku=93/95
+r18-agent2-type=2
+r18-agent3-kind=3
+r18-agent3-sku=99
+r18-agent3-type=3
+r2-agent1-kind=3
+r2-agent1-sku=60/60XL/60b
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=60/60XL
+r2-agent2-type=2
+r4-agent1-kind=3
+r4-agent1-sku=300/300XL/300b
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=300/300XL
+r4-agent2-type=2
+r8-agent1-kind=3
+r8-agent1-sku=121/121XL/121b
+r8-agent1-type=1
+r8-agent2-kind=3
+r8-agent2-sku=121/121XL
+r8-agent2-type=2
+scan-src=1
+scan-type=7
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.10.9
+tech-class=Mimas
+tech-subclass=NoCDDVD
+tech-type=2
+usb-pid=9911
+usb-vid=3f0
+wifi-config=3
+
+[hp_laserjet_100_colormfp_m175r]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_color_laserjet_cm1312_mfp.png
+io-mfp-mode=3
+io-mode=1
+io-support=14
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 100 Color MFP M175
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=1
+plugin-reason=64
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CE310A
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=CE311A
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=CE313A
+r0-agent3-type=5
+r0-agent4-kind=4
+r0-agent4-sku=CE312A
+r0-agent4-type=6
+scan-src=3
+scan-type=5
+status-battery-check=0
+status-dynamic-counters=0
+status-type=10
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.11.7
+tech-class=Postscript
+tech-subclass=Normal
+tech-type=4
+usb-pid=62a
+usb-vid=3f0
+wifi-config=-1
+
+[hp_laserjet_100_colormfp_m175q]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_color_laserjet_cm1312_mfp.png
+io-mfp-mode=3
+io-mode=1
+io-support=14
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 100 Color MFP M175
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=1
+plugin-reason=64
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CE310A
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=CE311A
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=CE313A
+r0-agent3-type=5
+r0-agent4-kind=4
+r0-agent4-sku=CE312A
+r0-agent4-type=6
+scan-src=3
+scan-type=5
+status-battery-check=0
+status-dynamic-counters=0
+status-type=10
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.11.7
+tech-class=Postscript
+tech-subclass=Normal
+tech-type=4
+usb-pid=62a
+usb-vid=3f0
+wifi-config=-1
+
+[hp_laserjet_100_colormfp_m175p]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_color_laserjet_cm1312_mfp.png
+io-mfp-mode=3
+io-mode=1
+io-support=14
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 100 Color MFP M175
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=1
+plugin-reason=64
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CE310A
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=CE311A
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=CE313A
+r0-agent3-type=5
+r0-agent4-kind=4
+r0-agent4-sku=CE312A
+r0-agent4-type=6
+scan-src=3
+scan-type=5
+status-battery-check=0
+status-dynamic-counters=0
+status-type=10
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.11.7
+tech-class=Postscript
+tech-subclass=Normal
+tech-type=4
+usb-pid=62a
+usb-vid=3f0
+wifi-config=-1
+
+[hp_laserjet_100_colormfp_m175e]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_color_laserjet_cm1312_mfp.png
+io-mfp-mode=3
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 100 Color MFP M175
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=1
+plugin-reason=64
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CE310A
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=CE311A
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=CE313A
+r0-agent3-type=5
+r0-agent4-kind=4
+r0-agent4-sku=CE312A
+r0-agent4-type=6
+scan-src=3
+scan-type=5
+status-battery-check=0
+status-dynamic-counters=0
+status-type=10
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.11.7
+tech-class=Postscript
+tech-subclass=Normal
+tech-type=4
+usb-pid=62a
+usb-vid=3f0
+wifi-config=-1
+
+[hp_laserjet_100_colormfp_m175a]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_color_laserjet_cm1312_mfp.png
+io-mfp-mode=3
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 100 Color MFP M175
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=1
+plugin-reason=64
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CE310A
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=CE311A
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=CE313A
+r0-agent3-type=5
+r0-agent4-kind=4
+r0-agent4-sku=CE312A
+r0-agent4-type=6
+scan-src=3
+scan-type=5
+status-battery-check=0
+status-dynamic-counters=0
+status-type=10
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.11.7
+tech-class=Postscript
+tech-subclass=Normal
+tech-type=4
+usb-pid=62a
+usb-vid=3f0
+wifi-config=-1
+
+[hp_laserjet_100_colormfp_m175c]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_color_laserjet_cm1312_mfp.png
+io-mfp-mode=3
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 100 Color MFP M175
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=1
+plugin-reason=64
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CE310A
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=CE311A
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=CE313A
+r0-agent3-type=5
+r0-agent4-kind=4
+r0-agent4-sku=CE312A
+r0-agent4-type=6
+scan-src=3
+scan-type=5
+status-battery-check=0
+status-dynamic-counters=0
+status-type=10
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.11.7
+tech-class=Postscript
+tech-subclass=Normal
+tech-type=4
+usb-pid=62a
+usb-vid=3f0
+wifi-config=-1
+
+[hp_laserjet_100_colormfp_m175b]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_color_laserjet_cm1312_mfp.png
+io-mfp-mode=3
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 100 Color MFP M175
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=1
+plugin-reason=64
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CE310A
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=CE311A
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=CE313A
+r0-agent3-type=5
+r0-agent4-kind=4
+r0-agent4-sku=CE312A
+r0-agent4-type=6
+scan-src=3
+scan-type=5
+status-battery-check=0
+status-dynamic-counters=0
+status-type=10
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.11.7
+tech-class=Postscript
+tech-subclass=Normal
+tech-type=4
+usb-pid=62a
+usb-vid=3f0
+wifi-config=-1
+
+[photosmart_100]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=PHOTOSMART_100.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart 100 Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=57 (C6657AN)
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=3496
+support-type=2
+support-ver=0.9.5
+tech-class=PSP100
+tech-subclass=Normal
+tech-type=2
+usb-pid=3802
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_b109a_series]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=Photosmart_C5100.png
+io-mfp-mode=3
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart All-in-One Printer - B109a
+model2=HP Photosmart All-in-One Printer - B109c
+model3=HP Photosmart All-in-One Printer - B109d
+model4=HP Photosmart All-in-One Printer - B109e
+monitor-type=0
+panel-check-type=1
+pcard-type=2
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=2
+r0-agent1-sku=564/564XL
+r0-agent1-type=1
+r0-agent2-kind=2
+r0-agent2-sku=564/564XL
+r0-agent2-type=4
+r0-agent3-kind=2
+r0-agent3-sku=564/564XL
+r0-agent3-type=5
+r0-agent4-kind=2
+r0-agent4-sku=564/564XL
+r0-agent4-type=6
+r1-agent1-kind=2
+r1-agent1-sku=564/564XL
+r1-agent1-type=1
+r1-agent2-kind=2
+r1-agent2-sku=564/564XL
+r1-agent2-type=4
+r1-agent3-kind=2
+r1-agent3-sku=564/564XL
+r1-agent3-type=5
+r1-agent4-kind=2
+r1-agent4-sku=564/564XL
+r1-agent4-type=6
+r2-agent1-kind=2
+r2-agent1-sku=364/364XL
+r2-agent1-type=1
+r2-agent2-kind=2
+r2-agent2-sku=364/364XL
+r2-agent2-type=4
+r2-agent3-kind=2
+r2-agent3-sku=364/364XL
+r2-agent3-type=5
+r2-agent4-kind=2
+r2-agent4-sku=364/364XL
+r2-agent4-type=6
+r4-agent1-kind=2
+r4-agent1-sku=178/178XL
+r4-agent1-type=1
+r4-agent2-kind=2
+r4-agent2-sku=178/178XL
+r4-agent2-type=4
+r4-agent3-kind=2
+r4-agent3-sku=178/178XL
+r4-agent3-type=5
+r4-agent4-kind=2
+r4-agent4-sku=178/178XL
+r4-agent4-type=6
+r8-agent1-kind=2
+r8-agent1-sku=862/862XL
+r8-agent1-type=1
+r8-agent2-kind=2
+r8-agent2-sku=862/862XL
+r8-agent2-type=4
+r8-agent3-kind=2
+r8-agent3-sku=862/862XL
+r8-agent3-type=5
+r8-agent4-kind=2
+r8-agent4-sku=862/862XL
+r8-agent4-type=6
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=2
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.9.10
+tech-class=Stabler
+tech-subclass=Normal
+tech-type=2
+usb-pid=7a11
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_ink_advant_k109a-z]
+align-type=14
+clean-type=2
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=deskjet_3600.png
+io-mfp-mode=3
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet Ink Advantage K109a Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=703
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=703
+r0-agent2-type=2
+r10-agent1-kind=3
+r10-agent1-sku=703
+r10-agent1-type=1
+r10-agent2-kind=3
+r10-agent2-sku=703
+r10-agent2-type=2
+r2-agent1-kind=3
+r2-agent1-sku=703
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=703
+r2-agent2-type=2
+r4-agent1-kind=3
+r4-agent1-sku=703
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=703
+r4-agent2-type=2
+r7-agent1-sku=816 (C8816A/B/G)
+r8-agent1-kind=3
+r8-agent1-sku=703
+r8-agent1-type=1
+r8-agent2-kind=3
+r8-agent2-sku=703
+r8-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=3
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.9.8
+tech-class=ViperPlusTrim
+tech-subclass=Normal
+tech-type=2
+usb-pid=8311
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_wireless_b109n-z]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=Photosmart_C5100.png
+io-mfp-mode=3
+io-mode=1
+io-support=10
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart Wireless All-in-One Printer - B109n
+model2=HP Photosmart Wireless All-in-One Printer - B109q
+model3=HP Photosmart Wireless All-in-One Printer - B109q=r
+monitor-type=0
+panel-check-type=1
+pcard-type=2
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=2
+r0-agent1-sku=564/564XL
+r0-agent1-type=1
+r0-agent2-kind=2
+r0-agent2-sku=564/564XL
+r0-agent2-type=4
+r0-agent3-kind=2
+r0-agent3-sku=564/564XL
+r0-agent3-type=5
+r0-agent4-kind=2
+r0-agent4-sku=564/564XL
+r0-agent4-type=6
+r1-agent1-kind=2
+r1-agent1-sku=564/564XL
+r1-agent1-type=1
+r1-agent2-kind=2
+r1-agent2-sku=564/564XL
+r1-agent2-type=4
+r1-agent3-kind=2
+r1-agent3-sku=564/564XL
+r1-agent3-type=5
+r1-agent4-kind=2
+r1-agent4-sku=564/564XL
+r1-agent4-type=6
+r2-agent1-kind=2
+r2-agent1-sku=364/364XL
+r2-agent1-type=1
+r2-agent2-kind=2
+r2-agent2-sku=364/364XL
+r2-agent2-type=4
+r2-agent3-kind=2
+r2-agent3-sku=364/364XL
+r2-agent3-type=5
+r2-agent4-kind=2
+r2-agent4-sku=364/364XL
+r2-agent4-type=6
+r4-agent1-kind=2
+r4-agent1-sku=178/178XL
+r4-agent1-type=1
+r4-agent2-kind=2
+r4-agent2-sku=178/178XL
+r4-agent2-type=4
+r4-agent3-kind=2
+r4-agent3-sku=178/178XL
+r4-agent3-type=5
+r4-agent4-kind=2
+r4-agent4-sku=178/178XL
+r4-agent4-type=6
+r8-agent1-kind=2
+r8-agent1-sku=862/862XL
+r8-agent1-type=1
+r8-agent2-kind=2
+r8-agent2-sku=862/862XL
+r8-agent2-type=4
+r8-agent3-kind=2
+r8-agent3-sku=862/862XL
+r8-agent3-type=5
+r8-agent4-kind=2
+r8-agent4-sku=862/862XL
+r8-agent4-type=6
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=2
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.9.10
+tech-class=Stabler
+tech-subclass=Normal
+tech-type=2
+usb-pid=7b11
+usb-vid=3f0
+wifi-config=1
+
+[photosmart_b109a-m]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=Photosmart_C5100.png
+io-mfp-mode=3
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart All-in-One Printer - B109a
+model2=HP Photosmart All-in-One Printer - B109c
+model3=HP Photosmart All-in-One Printer - B109d
+model4=HP Photosmart All-in-One Printer - B109e
+monitor-type=0
+panel-check-type=1
+pcard-type=2
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=2
+r0-agent1-sku=564/564XL
+r0-agent1-type=1
+r0-agent2-kind=2
+r0-agent2-sku=564/564XL
+r0-agent2-type=4
+r0-agent3-kind=2
+r0-agent3-sku=564/564XL
+r0-agent3-type=5
+r0-agent4-kind=2
+r0-agent4-sku=564/564XL
+r0-agent4-type=6
+r1-agent1-kind=2
+r1-agent1-sku=564/564XL
+r1-agent1-type=1
+r1-agent2-kind=2
+r1-agent2-sku=564/564XL
+r1-agent2-type=4
+r1-agent3-kind=2
+r1-agent3-sku=564/564XL
+r1-agent3-type=5
+r1-agent4-kind=2
+r1-agent4-sku=564/564XL
+r1-agent4-type=6
+r2-agent1-kind=2
+r2-agent1-sku=364/364XL
+r2-agent1-type=1
+r2-agent2-kind=2
+r2-agent2-sku=364/364XL
+r2-agent2-type=4
+r2-agent3-kind=2
+r2-agent3-sku=364/364XL
+r2-agent3-type=5
+r2-agent4-kind=2
+r2-agent4-sku=364/364XL
+r2-agent4-type=6
+r4-agent1-kind=2
+r4-agent1-sku=178/178XL
+r4-agent1-type=1
+r4-agent2-kind=2
+r4-agent2-sku=178/178XL
+r4-agent2-type=4
+r4-agent3-kind=2
+r4-agent3-sku=178/178XL
+r4-agent3-type=5
+r4-agent4-kind=2
+r4-agent4-sku=178/178XL
+r4-agent4-type=6
+r8-agent1-kind=2
+r8-agent1-sku=862/862XL
+r8-agent1-type=1
+r8-agent2-kind=2
+r8-agent2-sku=862/862XL
+r8-agent2-type=4
+r8-agent3-kind=2
+r8-agent3-sku=862/862XL
+r8-agent3-type=5
+r8-agent4-kind=2
+r8-agent4-sku=862/862XL
+r8-agent4-type=6
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=2
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.9.10
+tech-class=Stabler
+tech-subclass=Normal
+tech-type=2
+usb-pid=7a11
+usb-vid=3f0
+wifi-config=0
+
+[hp_designjet_110]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=0
+io-mode=0
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP Designjet 110 Plus Printer
+model2=HP Designjet 110plus nr Printer
+model3=HP Designjet 110plus r Printer
+model4=HP Designjet 110 Color Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=219b2b
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[envy_110_series]
+align-type=16
+clean-type=3
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=psc_2300_series.png
+io-mfp-mode=1
+io-mode=1
+io-support=10
+job-storage=0
+linefeed-cal-type=0
+model1=HP Envy 110 e-All-in-One
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=2
+r0-agent1-sku=60/60XL/60b
+r0-agent1-type=1
+r0-agent2-kind=2
+r0-agent2-sku=60/60XL
+r0-agent2-type=2
+r10-agent1-kind=2
+r10-agent1-sku=818/818XL/818b
+r10-agent1-type=1
+r10-agent2-kind=3
+r10-agent2-sku=818/818XL
+r10-agent2-type=2
+r18-agent2-kind=3
+r18-agent2-sku=93/95
+r18-agent2-type=2
+r18-agent3-kind=3
+r18-agent3-sku=99
+r18-agent3-type=3
+r2-agent1-kind=2
+r2-agent1-sku=60/60XL/60b
+r2-agent1-type=1
+r2-agent2-kind=2
+r2-agent2-sku=60/60XL
+r2-agent2-type=2
+r4-agent1-kind=2
+r4-agent1-sku=300/300XL/300b
+r4-agent1-type=1
+r4-agent2-kind=2
+r4-agent2-sku=300/300XL
+r4-agent2-type=2
+r8-agent1-kind=2
+r8-agent1-sku=121/121XL/121b
+r8-agent1-type=1
+r8-agent2-kind=2
+r8-agent2-sku=121/121XL
+r8-agent2-type=2
+scan-src=1
+scan-type=7
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.11.10
+tech-class=Mimas
+tech-subclass=NoCDDVD
+tech-type=2
+usb-pid=a711
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_d110_series]
+align-type=13
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=Photosmart_C4100.png
+io-mfp-mode=3
+io-mode=1
+io-support=10
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart D110 Series Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=2
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=60/60XL
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=60/60XL
+r0-agent2-type=2
+r10-agent1-kind=3
+r10-agent1-sku=818/818XL
+r10-agent1-type=1
+r10-agent2-kind=3
+r10-agent2-sku=818/818XL
+r10-agent2-type=2
+r18-agent2-kind=3
+r18-agent2-sku=93/95
+r18-agent2-type=2
+r18-agent3-kind=3
+r18-agent3-sku=99
+r18-agent3-type=3
+r2-agent1-kind=3
+r2-agent1-sku=60/60XL
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=60/60XL
+r2-agent2-type=2
+r4-agent1-kind=3
+r4-agent1-sku=300/300XL
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=300/300XL
+r4-agent2-type=2
+r8-agent1-kind=3
+r8-agent1-sku=121/121XL
+r8-agent1-type=1
+r8-agent2-kind=3
+r8-agent2-sku=121/121XL
+r8-agent2-type=2
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.10.4
+tech-class=ViperPlusVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=8d11
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_b110_series]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=Photosmart_C5100.png
+io-mfp-mode=3
+io-mode=1
+io-support=10
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart Wireless All-in-One Printer - B110
+monitor-type=0
+panel-check-type=1
+pcard-type=2
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=2
+r0-agent1-sku=564/564XL
+r0-agent1-type=1
+r0-agent2-kind=2
+r0-agent2-sku=564/564XL
+r0-agent2-type=4
+r0-agent3-kind=2
+r0-agent3-sku=564/564XL
+r0-agent3-type=5
+r0-agent4-kind=2
+r0-agent4-sku=564/564XL
+r0-agent4-type=6
+r1-agent1-kind=2
+r1-agent1-sku=564/564XL
+r1-agent1-type=1
+r1-agent2-kind=2
+r1-agent2-sku=564/564XL
+r1-agent2-type=4
+r1-agent3-kind=2
+r1-agent3-sku=564/564XL
+r1-agent3-type=5
+r1-agent4-kind=2
+r1-agent4-sku=564/564XL
+r1-agent4-type=6
+r2-agent1-kind=2
+r2-agent1-sku=364/364XL
+r2-agent1-type=1
+r2-agent2-kind=2
+r2-agent2-sku=364/364XL
+r2-agent2-type=4
+r2-agent3-kind=2
+r2-agent3-sku=364/364XL
+r2-agent3-type=5
+r2-agent4-kind=2
+r2-agent4-sku=364/364XL
+r2-agent4-type=6
+r4-agent1-kind=2
+r4-agent1-sku=178/178XL
+r4-agent1-type=1
+r4-agent2-kind=2
+r4-agent2-sku=178/178XL
+r4-agent2-type=4
+r4-agent3-kind=2
+r4-agent3-sku=178/178XL
+r4-agent3-type=5
+r4-agent4-kind=2
+r4-agent4-sku=178/178XL
+r4-agent4-type=6
+r8-agent1-kind=2
+r8-agent1-sku=862/862XL
+r8-agent1-type=1
+r8-agent2-kind=2
+r8-agent2-sku=862/862XL
+r8-agent2-type=4
+r8-agent3-kind=2
+r8-agent3-sku=862/862XL
+r8-agent3-type=5
+r8-agent4-kind=2
+r8-agent4-sku=862/862XL
+r8-agent4-type=6
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=2
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.10.6
+tech-class=Stabler
+tech-subclass=Normal
+tech-type=2
+usb-pid=8a11
+usb-vid=3f0
+wifi-config=1
+
+[hp_designjet_120]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=0
+io-mode=0
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP Designjet 120 Printer
+model2=HP Designjet 120nr Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=38e2
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_130]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=PHOTOSMART_100.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart 130 Printer
+model2=HP Photosmart 130v Printer
+model3=HP Photosmart 130xi Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=57 (C6657AN)
+r0-agent1-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=PSP100
+tech-subclass=Normal
+tech-type=2
+usb-pid=3902
+usb-vid=3f0
+wifi-config=0
+
+[hp_designjet_130]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=0
+io-mode=0
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP Designjet 130 Printer
+model2=HP Designjet 130nr Printer
+model3=HP Designjet 130gp Printer
+model4=HP Designjet 130r Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=219b2b
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_140_series]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=PHOTOSMART_100.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart 140 Compact Photo Printer
+model2=HP Photosmart 145v Compact Photo Printer
+model3=HP Photosmart 145xi Compact Photo Printer
+model4=HP Photosmart 145 Compact Photo Printer
+model5=HP Photosmart 148 Compact Photo Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=57 (C6657A)
+r0-agent1-type=2
+r0-agent2-kind=3
+r0-agent2-sku=59 (C9359A)
+r0-agent2-type=10
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=3849
+support-type=2
+support-ver=0.9.5
+tech-class=PSP100
+tech-subclass=Normal
+tech-type=2
+usb-pid=1002
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_200_colormfp_m275s]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=HP_LaserJet_4000.png
+io-mfp-mode=1
+io-mode=1
+io-support=14
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 200 Color MFP M275s
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=1
+plugin-reason=64
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CE320A
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=CE321A
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=CE323A
+r0-agent3-type=5
+r0-agent4-kind=4
+r0-agent4-sku=CE322A
+r0-agent4-type=6
+scan-src=1
+scan-type=5
+status-battery-check=0
+status-dynamic-counters=0
+status-type=10
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.11.12
+tech-class=Postscript
+tech-subclass=Normal
+tech-type=4
+usb-pid=c2a
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_200_colormfp_m275u]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=HP_LaserJet_4000.png
+io-mfp-mode=1
+io-mode=1
+io-support=14
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 200 Color MFP M275u
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=1
+plugin-reason=64
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CE320A
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=CE321A
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=CE323A
+r0-agent3-type=5
+r0-agent4-kind=4
+r0-agent4-sku=CE322A
+r0-agent4-type=6
+scan-src=1
+scan-type=5
+status-battery-check=0
+status-dynamic-counters=0
+status-type=10
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.11.12
+tech-class=Postscript
+tech-subclass=Normal
+tech-type=4
+usb-pid=c2a
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_200_colormfp_m275t]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=HP_LaserJet_4000.png
+io-mfp-mode=1
+io-mode=1
+io-support=14
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 200 Color MFP M275t
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=1
+plugin-reason=64
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CE320A
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=CE321A
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=CE323A
+r0-agent3-type=5
+r0-agent4-kind=4
+r0-agent4-sku=CE322A
+r0-agent4-type=6
+scan-src=1
+scan-type=5
+status-battery-check=0
+status-dynamic-counters=0
+status-type=10
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.11.12
+tech-class=Postscript
+tech-subclass=Normal
+tech-type=4
+usb-pid=c2a
+usb-vid=3f0
+wifi-config=0
+
+[hp_deskjet_200]
+align-type=0
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_printer.png
+io-mfp-mode=6
+io-mode=1
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 200cci Printer
+model2=HP Deskjet 200 Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=2f8d
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_200_colormfp_m275nw]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=HP_LaserJet_4000.png
+io-mfp-mode=1
+io-mode=1
+io-support=14
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 200 Color MFP M275nw
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=1
+plugin-reason=64
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CE320A
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=CE321A
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=CE323A
+r0-agent3-type=5
+r0-agent4-kind=4
+r0-agent4-sku=CE322A
+r0-agent4-type=6
+scan-src=1
+scan-type=5
+status-battery-check=0
+status-dynamic-counters=0
+status-type=10
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.11.12
+tech-class=Postscript
+tech-subclass=Normal
+tech-type=4
+usb-pid=c2a
+usb-vid=3f0
+wifi-config=0
+
+[hp_designjet_200]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=0
+io-mode=0
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP C3180A Designjet 200 Printer
+model2=HP C3181A Designjet 200 Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=2a52
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_plus_b209a-m]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=Photosmart_C5100.png
+io-mfp-mode=3
+io-mode=1
+io-support=10
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart Plus All-in-One Printer - B209a
+model2=HP Photosmart Plus All-in-One Printer - B209b
+model3=HP Photosmart Plus All-in-One Printer - B209c
+monitor-type=0
+panel-check-type=1
+pcard-type=2
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=2
+r0-agent1-sku=564/564XL
+r0-agent1-type=1
+r0-agent2-kind=2
+r0-agent2-sku=564/564XL
+r0-agent2-type=4
+r0-agent3-kind=2
+r0-agent3-sku=564/564XL
+r0-agent3-type=5
+r0-agent4-kind=2
+r0-agent4-sku=564/564XL
+r0-agent4-type=6
+r1-agent1-kind=2
+r1-agent1-sku=564/564XL
+r1-agent1-type=1
+r1-agent2-kind=2
+r1-agent2-sku=564/564XL
+r1-agent2-type=4
+r1-agent3-kind=2
+r1-agent3-sku=564/564XL
+r1-agent3-type=5
+r1-agent4-kind=2
+r1-agent4-sku=564/564XL
+r1-agent4-type=6
+r2-agent1-kind=2
+r2-agent1-sku=364/364XL
+r2-agent1-type=1
+r2-agent2-kind=2
+r2-agent2-sku=364/364XL
+r2-agent2-type=4
+r2-agent3-kind=2
+r2-agent3-sku=364/364XL
+r2-agent3-type=5
+r2-agent4-kind=2
+r2-agent4-sku=364/364XL
+r2-agent4-type=6
+r4-agent1-kind=2
+r4-agent1-sku=178/178XL
+r4-agent1-type=1
+r4-agent2-kind=2
+r4-agent2-sku=178/178XL
+r4-agent2-type=4
+r4-agent3-kind=2
+r4-agent3-sku=178/178XL
+r4-agent3-type=5
+r4-agent4-kind=2
+r4-agent4-sku=178/178XL
+r4-agent4-type=6
+r8-agent1-kind=2
+r8-agent1-sku=862/862XL
+r8-agent1-type=1
+r8-agent2-kind=2
+r8-agent2-sku=862/862XL
+r8-agent2-type=4
+r8-agent3-kind=2
+r8-agent3-sku=862/862XL
+r8-agent3-type=5
+r8-agent4-kind=2
+r8-agent4-sku=862/862XL
+r8-agent4-type=6
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=2
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.9.8
+tech-class=Stabler
+tech-subclass=Normal
+tech-type=2
+usb-pid=7e11
+usb-vid=3f0
+wifi-config=1
+
+[deskjet_ink_advant_k209a-z]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=hp_deskjet_f4200.png
+io-mfp-mode=3
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet Ink Advantage K209a All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=703
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=703
+r0-agent2-type=2
+r10-agent1-kind=3
+r10-agent1-sku=703
+r10-agent1-type=1
+r10-agent2-kind=3
+r10-agent2-sku=703
+r10-agent2-type=2
+r18-agent2-kind=3
+r18-agent2-sku=93/95
+r18-agent2-type=2
+r18-agent3-kind=3
+r18-agent3-sku=99
+r18-agent3-type=3
+r2-agent1-kind=3
+r2-agent1-sku=703
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=703
+r2-agent2-type=2
+r4-agent1-kind=3
+r4-agent1-sku=703
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=703
+r4-agent2-type=2
+r8-agent1-kind=3
+r8-agent1-sku=703
+r8-agent1-type=1
+r8-agent2-kind=3
+r8-agent2-sku=703
+r8-agent2-type=2
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.9.8
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=7811
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_plus_b210_series]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=Photosmart_C5100.png
+io-mfp-mode=3
+io-mode=1
+io-support=10
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart Plus B210 series
+monitor-type=0
+panel-check-type=1
+pcard-type=2
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=2
+r0-agent1-sku=564/564XL
+r0-agent1-type=1
+r0-agent2-kind=2
+r0-agent2-sku=564/564XL
+r0-agent2-type=4
+r0-agent3-kind=2
+r0-agent3-sku=564/564XL
+r0-agent3-type=5
+r0-agent4-kind=2
+r0-agent4-sku=564/564XL
+r0-agent4-type=6
+r1-agent1-kind=2
+r1-agent1-sku=564/564XL
+r1-agent1-type=1
+r1-agent2-kind=2
+r1-agent2-sku=564/564XL
+r1-agent2-type=4
+r1-agent3-kind=2
+r1-agent3-sku=564/564XL
+r1-agent3-type=5
+r1-agent4-kind=2
+r1-agent4-sku=564/564XL
+r1-agent4-type=6
+r2-agent1-kind=2
+r2-agent1-sku=364/364XL
+r2-agent1-type=1
+r2-agent2-kind=2
+r2-agent2-sku=364/364XL
+r2-agent2-type=4
+r2-agent3-kind=2
+r2-agent3-sku=364/364XL
+r2-agent3-type=5
+r2-agent4-kind=2
+r2-agent4-sku=364/364XL
+r2-agent4-type=6
+r4-agent1-kind=2
+r4-agent1-sku=178/178XL
+r4-agent1-type=1
+r4-agent2-kind=2
+r4-agent2-sku=178/178XL
+r4-agent2-type=4
+r4-agent3-kind=2
+r4-agent3-sku=178/178XL
+r4-agent3-type=5
+r4-agent4-kind=2
+r4-agent4-sku=178/178XL
+r4-agent4-type=6
+r8-agent1-kind=2
+r8-agent1-sku=862/862XL
+r8-agent1-type=1
+r8-agent2-kind=2
+r8-agent2-sku=862/862XL
+r8-agent2-type=4
+r8-agent3-kind=2
+r8-agent3-sku=862/862XL
+r8-agent3-type=5
+r8-agent4-kind=2
+r8-agent4-sku=862/862XL
+r8-agent4-type=6
+scan-src=1
+scan-type=7
+status-battery-check=0
+status-dynamic-counters=2
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.10.9
+tech-class=Stabler
+tech-subclass=Normal
+tech-type=2
+usb-pid=e11
+usb-vid=3f0
+wifi-config=1
+
+[hp_designjet_220]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=0
+io-mode=0
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP Designjet 220 Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=2b64
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_electrostatic_225]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=0
+io-mode=0
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP Electrostatic 255 Plotter
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=2a8f
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_designjet_230]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=0
+io-mode=0
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP Designjet 230 Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=2cb2
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_230]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=PHOTOSMART_100.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart 230 Printer
+model2=HP Photosmart 230v Printer
+model3=HP Photosmart 230xi Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=57 (C6657AN)
+r0-agent1-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=3597
+support-type=2
+support-ver=0.9.5
+tech-class=PSP100
+tech-subclass=Normal
+tech-type=2
+usb-pid=3502
+usb-vid=3f0
+wifi-config=0
+
+[hp_mopier_240]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=HP_LaserJet_9000_MFP.png
+io-mfp-mode=6
+io-mode=6
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Mopier 240 Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=43 (C8543X)
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=32e9
+support-type=2
+support-ver=0.9.5
+tech-class=LJMono,Postscript
+tech-subclass=LargeFormatA3
+tech-type=3
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_240_series]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=PHOTOSMART_100.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart 240 Compact Photo Printer
+model2=HP Photosmart 245v Compact Photo Printer
+model3=HP Photosmart 245xi Compact Photo Printer
+model4=HP Photosmart 245 Compact Photo Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=57 (C6657A)
+r0-agent1-type=2
+r0-agent2-kind=3
+r0-agent2-sku=59 (C9359A)
+r0-agent2-type=10
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=3637
+support-type=2
+support-ver=0.9.5
+tech-class=PSP100
+tech-subclass=Normal
+tech-type=2
+usb-pid=1102
+usb-vid=3f0
+wifi-config=0
+
+[hp_electrostatic_240]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=0
+io-mode=0
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP Electrostatic 240d Plotter
+model2=HP Electrostatic 240e Plotter
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=26fd
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_designjet_250c]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=0
+io-mode=0
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP Designjet 250c Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=2cb2
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_electrostatic_250]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=0
+io-mode=0
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP Electrostatic 250 Plotter
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=2a8f
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_f300_series]
+align-type=6
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=psc_1100_series.png
+io-mfp-mode=3
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet F310 All-in-One Printer
+model10=HP Deskjet F380 All-in-One Printer
+model11=HP Deskjet F385 All-in-One Printer
+model12=HP Deskjet F388 All-in-One Printer
+model13=HP Deskjet F390 All-in-One Printer
+model14=HP Deskjet F394 All-in-One Printer
+model2=HP Deskjet F325 All-in-One Printer
+model3=HP Deskjet F335 All-in-One Printer
+model4=HP Deskjet F340 All-in-One Printer
+model5=HP Deskjet F350 All-in-One Printer
+model6=HP Deskjet F370 All-in-One Printer
+model7=HP Deskjet F375 All-in-One Printer
+model8=HP Deskjet F378 All-in-One Printer
+model9=HP Deskjet F379 All-in-One Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=21
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=22
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=58
+r0-agent3-type=3
+r1-agent1-kind=3
+r1-agent1-sku=21
+r1-agent1-type=1
+r1-agent2-kind=3
+r1-agent2-sku=22
+r1-agent2-type=2
+r1-agent3-kind=3
+r1-agent3-sku=58
+r1-agent3-type=3
+r7-agent1-kind=3
+r7-agent1-sku=816
+r7-agent1-type=1
+r7-agent2-kind=3
+r7-agent2-sku=817
+r7-agent2-type=2
+r7-agent3-kind=3
+r7-agent3-sku=58
+r7-agent3-type=3
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=3
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.9
+tech-class=DJ3600
+tech-subclass=Normal
+tech-type=2
+usb-pid=5511
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_300_color_m351a]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=hp_color_laserjet_cp2025.png
+io-mfp-mode=1
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 300 Color M351a
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+ppd-name=lj_300_400_color_m351_m451
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CE410A/CE410X
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=CE411A
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=CE413A
+r0-agent3-type=5
+r0-agent4-kind=4
+r0-agent4-sku=CE412A
+r0-agent4-type=6
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.12.2
+tech-class=Postscript
+tech-subclass=Normal
+tech-type=4
+usb-pid=f2a
+usb-vid=3f0
+wifi-config=0
+
+[officejet_series_300]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=2
+fw-download=False
+icon=OfficeJet_Series_300.png
+io-mfp-mode=7
+io-mode=0
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet 300 All-in-One Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=26 (51626A)
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=33da
+support-type=2
+support-ver=0.9.5
+tech-class=DJ540
+tech-subclass=Normal
+tech-type=1
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_300_colormfp_m375nw]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=7
+fw-download=False
+icon=hp_color_laserjet_cm1312_mfp.png
+io-mfp-mode=1
+io-mode=1
+io-support=14
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 300 Color MFP M375nw
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=1
+plugin-reason=64
+power-settings=0
+ppd-name=lj_300_400_color_mfp_m375_m475
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CE410A
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=CE411A
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=CE413A
+r0-agent3-type=5
+r0-agent4-kind=4
+r0-agent4-sku=CE412A
+r0-agent4-type=6
+scan-src=3
+scan-type=5
+status-battery-check=0
+status-dynamic-counters=0
+status-type=10
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.12.2
+tech-class=Postscript
+tech-subclass=Normal
+tech-type=4
+usb-pid=82a
+usb-vid=3f0
+wifi-config=3
+
+[printer_scanner_copier_300]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=OfficeJet_G85.png
+io-mfp-mode=7
+io-mode=1
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=Printer Scanner Copier 300
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=29 (51629A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=49 (51649A)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=16 (C1816A)
+r0-agent3-type=3
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=0
+support-type=2
+support-ver=0.9.5
+tech-class=DJ6xx
+tech-subclass=Normal
+tech-type=1
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_c309a_series]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=1
+fw-download=False
+icon=Photosmart_C6100.png
+io-mfp-mode=3
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart Premium Fax All-in-One Printer - C309a
+monitor-type=0
+panel-check-type=1
+pcard-type=2
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=2
+r0-agent1-sku=564/564XL
+r0-agent1-type=1
+r0-agent2-kind=2
+r0-agent2-sku=564/564XL
+r0-agent2-type=4
+r0-agent3-kind=2
+r0-agent3-sku=564/564XL
+r0-agent3-type=5
+r0-agent4-kind=2
+r0-agent4-sku=564/564XL
+r0-agent4-type=6
+r0-agent5-kind=2
+r0-agent5-sku=564/564XL
+r0-agent5-type=19
+r1-agent1-kind=2
+r1-agent1-sku=564/564XL
+r1-agent1-type=1
+r1-agent2-kind=2
+r1-agent2-sku=564/564XL
+r1-agent2-type=4
+r1-agent3-kind=2
+r1-agent3-sku=564/564XL
+r1-agent3-type=5
+r1-agent4-kind=2
+r1-agent4-sku=564/564XL
+r1-agent4-type=6
+r1-agent5-kind=2
+r1-agent5-sku=564/564XL
+r1-agent5-type=19
+r2-agent1-kind=2
+r2-agent1-sku=564/564XL
+r2-agent1-type=1
+r2-agent2-kind=2
+r2-agent2-sku=564/564XL
+r2-agent2-type=4
+r2-agent3-kind=2
+r2-agent3-sku=564/564XL
+r2-agent3-type=5
+r2-agent4-kind=2
+r2-agent4-sku=564/564XL
+r2-agent4-type=6
+r2-agent5-kind=2
+r2-agent5-sku=564/564XL
+r2-agent5-type=19
+r4-agent1-kind=2
+r4-agent1-sku=178/178XL
+r4-agent1-type=1
+r4-agent2-kind=2
+r4-agent2-sku=178/178XL
+r4-agent2-type=4
+r4-agent3-kind=2
+r4-agent3-sku=178/178XL
+r4-agent3-type=5
+r4-agent4-kind=2
+r4-agent4-sku=178/178XL
+r4-agent4-type=6
+r4-agent5-kind=2
+r4-agent5-sku=178/178XL
+r4-agent5-type=19
+r8-agent1-kind=2
+r8-agent1-sku=862/862XL
+r8-agent1-type=1
+r8-agent2-kind=2
+r8-agent2-sku=862/862XL
+r8-agent2-type=4
+r8-agent3-kind=2
+r8-agent3-sku=862/862XL
+r8-agent3-type=5
+r8-agent4-kind=2
+r8-agent4-sku=862/862XL
+r8-agent4-type=6
+r8-agent5-kind=2
+r8-agent5-sku=862/862XL
+r8-agent5-type=19
+scan-src=1
+scan-type=6
+status-battery-check=0
+status-dynamic-counters=2
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.9.2
+tech-class=Python
+tech-subclass=NoMaxDPI
+tech-type=2
+usb-pid=7311
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_prem-web_c309n-s]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=Photosmart_C6100.png
+io-mfp-mode=3
+io-mode=1
+io-support=14
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart Premium Fax All-in-One Printer series -C309a
+model2=HP Photosmart Premium Fax All-in-One Printer series -C309c
+monitor-type=0
+panel-check-type=1
+pcard-type=2
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=2
+r0-agent1-sku=564/564XL
+r0-agent1-type=1
+r0-agent2-kind=2
+r0-agent2-sku=564/564XL
+r0-agent2-type=4
+r0-agent3-kind=2
+r0-agent3-sku=564/564XL
+r0-agent3-type=5
+r0-agent4-kind=2
+r0-agent4-sku=564/564XL
+r0-agent4-type=6
+r0-agent5-kind=2
+r0-agent5-sku=564/564XL
+r0-agent5-type=19
+r1-agent2-kind=2
+r1-agent2-sku=564/564XL
+r1-agent2-type=4
+r1-agent3-kind=2
+r1-agent3-sku=564/564XL
+r1-agent3-type=5
+r1-agent4-kind=2
+r1-agent4-sku=564/564XL
+r1-agent4-type=6
+r1-agent5-kind=2
+r1-agent5-sku=564/564XL
+r1-agent5-type=19
+r10-agent1-kind=2
+r10-agent1-sku=862/862XL
+r10-agent1-type=1
+r10-agent2-kind=2
+r10-agent2-sku=862/862XL
+r10-agent2-type=4
+r10-agent3-kind=2
+r10-agent3-sku=862/862XL
+r10-agent3-type=5
+r10-agent4-kind=2
+r10-agent4-sku=862/862XL
+r10-agent4-type=6
+r10-agent5-kind=2
+r10-agent5-sku=862/862XL
+r10-agent5-type=19
+r2-agent1-kind=2
+r2-agent1-sku=564/564XL
+r2-agent1-type=1
+r2-agent2-kind=2
+r2-agent2-sku=564/564XL
+r2-agent2-type=4
+r2-agent3-kind=2
+r2-agent3-sku=564/564XL
+r2-agent3-type=5
+r2-agent4-kind=2
+r2-agent4-sku=564/564XL
+r2-agent4-type=6
+r2-agent5-kind=2
+r2-agent5-sku=564/564XL
+r2-agent5-type=19
+r4-agent1-kind=2
+r4-agent1-sku=364/364XL
+r4-agent1-type=1
+r4-agent2-kind=2
+r4-agent2-sku=364/364XL
+r4-agent2-type=4
+r4-agent3-kind=2
+r4-agent3-sku=364/364XL
+r4-agent3-type=5
+r4-agent4-kind=2
+r4-agent4-sku=364/364XL
+r4-agent4-type=6
+r4-agent5-kind=2
+r4-agent5-sku=364/364XL
+r4-agent5-type=19
+r8-agent1-kind=2
+r8-agent1-sku=178/178XL
+r8-agent1-type=1
+r8-agent2-kind=2
+r8-agent2-sku=178/178XL
+r8-agent2-type=4
+r8-agent3-kind=2
+r8-agent3-sku=178/178XL
+r8-agent3-type=5
+r8-agent4-kind=2
+r8-agent4-sku=178/178XL
+r8-agent4-type=6
+r8-agent5-kind=2
+r8-agent5-sku=178/178XL
+r8-agent5-type=19
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=2
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.9.10
+tech-class=Python
+tech-subclass=NoCDDVD,NoMaxDPI
+tech-type=2
+usb-pid=7c11
+usb-vid=3f0
+wifi-config=1
+
+[photosmart_premium_c309g-m]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=Photosmart_C6100.png
+io-mfp-mode=3
+io-mode=1
+io-support=14
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart Premium All-in-One Printer series - C309g
+model2=HP Photosmart Premium All-in-One Printer series - C309h
+monitor-type=0
+panel-check-type=1
+pcard-type=2
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=2
+r0-agent1-sku=564/564XL
+r0-agent1-type=1
+r0-agent2-kind=2
+r0-agent2-sku=564/564XL
+r0-agent2-type=4
+r0-agent3-kind=2
+r0-agent3-sku=564/564XL
+r0-agent3-type=5
+r0-agent4-kind=2
+r0-agent4-sku=564/564XL
+r0-agent4-type=6
+r0-agent5-kind=2
+r0-agent5-sku=564/564XL
+r0-agent5-type=19
+r1-agent2-kind=2
+r1-agent2-sku=564/564XL
+r1-agent2-type=4
+r1-agent3-kind=2
+r1-agent3-sku=564/564XL
+r1-agent3-type=5
+r1-agent4-kind=2
+r1-agent4-sku=564/564XL
+r1-agent4-type=6
+r1-agent5-kind=2
+r1-agent5-sku=564/564XL
+r1-agent5-type=19
+r10-agent1-kind=2
+r10-agent1-sku=862/862XL
+r10-agent1-type=1
+r10-agent2-kind=2
+r10-agent2-sku=862/862XL
+r10-agent2-type=4
+r10-agent3-kind=2
+r10-agent3-sku=862/862XL
+r10-agent3-type=5
+r10-agent4-kind=2
+r10-agent4-sku=862/862XL
+r10-agent4-type=6
+r10-agent5-kind=2
+r10-agent5-sku=862/862XL
+r10-agent5-type=19
+r2-agent1-kind=2
+r2-agent1-sku=564/564XL
+r2-agent1-type=1
+r2-agent2-kind=2
+r2-agent2-sku=564/564XL
+r2-agent2-type=4
+r2-agent3-kind=2
+r2-agent3-sku=564/564XL
+r2-agent3-type=5
+r2-agent4-kind=2
+r2-agent4-sku=564/564XL
+r2-agent4-type=6
+r2-agent5-kind=2
+r2-agent5-sku=564/564XL
+r2-agent5-type=19
+r4-agent1-kind=2
+r4-agent1-sku=364/364XL
+r4-agent1-type=1
+r4-agent2-kind=2
+r4-agent2-sku=364/364XL
+r4-agent2-type=4
+r4-agent3-kind=2
+r4-agent3-sku=364/364XL
+r4-agent3-type=5
+r4-agent4-kind=2
+r4-agent4-sku=364/364XL
+r4-agent4-type=6
+r4-agent5-kind=2
+r4-agent5-sku=364/364XL
+r4-agent5-type=19
+r8-agent1-kind=2
+r8-agent1-sku=178/178XL
+r8-agent1-type=1
+r8-agent2-kind=2
+r8-agent2-sku=178/178XL
+r8-agent2-type=4
+r8-agent3-kind=2
+r8-agent3-sku=178/178XL
+r8-agent3-type=5
+r8-agent4-kind=2
+r8-agent4-sku=178/178XL
+r8-agent4-type=6
+r8-agent5-kind=2
+r8-agent5-sku=178/178XL
+r8-agent5-type=19
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=2
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.9.10
+tech-class=Python
+tech-subclass=NoCDDVD,NoMaxDPI
+tech-type=2
+usb-pid=7d11
+usb-vid=3f0
+wifi-config=1
+
+[photosmart_a310_series]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=Photosmart_a310.png
+io-mfp-mode=3
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart A310 Compact Photo Printer
+model2=HP Photosmart A311 Compact Photo Printer
+model3=HP Photosmart A314 Compact Photo Printer
+model4=HP Photosmart A316 Compact Photo Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=110
+r0-agent1-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=3ee5
+support-type=2
+support-ver=1.6.9
+tech-class=DJGenericVIP
+tech-subclass=4x6FullBleed
+tech-type=2
+usb-pid=1d02
+usb-vid=3f0
+wifi-config=0
+
+[officejet_series_310]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=2
+fw-download=False
+icon=OfficeJet_Series_300.png
+io-mfp-mode=7
+io-mode=0
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet 310 All-in-One Series Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=26 (51626A)
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=0
+support-type=2
+support-ver=0.9.5
+tech-class=DJ540
+tech-subclass=Normal
+tech-type=1
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_prem_c310_series]
+align-type=1
+clean-type=3
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=Photosmart_C6100.png
+io-mfp-mode=3
+io-mode=1
+io-support=10
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart Prem C310 series
+monitor-type=0
+panel-check-type=1
+pcard-type=2
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=2
+r0-agent1-sku=564/564XL
+r0-agent1-type=1
+r0-agent2-kind=2
+r0-agent2-sku=564/564XL
+r0-agent2-type=4
+r0-agent3-kind=2
+r0-agent3-sku=564/564XL
+r0-agent3-type=5
+r0-agent4-kind=2
+r0-agent4-sku=564/564XL
+r0-agent4-type=6
+r0-agent5-kind=2
+r0-agent5-sku=564/564XL
+r0-agent5-type=19
+r1-agent1-kind=2
+r1-agent1-sku=564/564XL
+r1-agent1-type=1
+r1-agent2-kind=2
+r1-agent2-sku=564/564XL
+r1-agent2-type=4
+r1-agent3-kind=2
+r1-agent3-sku=564/564XL
+r1-agent3-type=5
+r1-agent4-kind=2
+r1-agent4-sku=564/564XL
+r1-agent4-type=6
+r1-agent5-kind=2
+r1-agent5-sku=564/564XL
+r1-agent5-type=19
+r2-agent1-kind=2
+r2-agent1-sku=364/364XL
+r2-agent1-type=1
+r2-agent2-kind=2
+r2-agent2-sku=364/364XL
+r2-agent2-type=4
+r2-agent3-kind=2
+r2-agent3-sku=364/364XL
+r2-agent3-type=5
+r2-agent4-kind=2
+r2-agent4-sku=364/364XL
+r2-agent4-type=6
+r2-agent5-kind=2
+r2-agent5-sku=364/364XL
+r2-agent5-type=19
+r4-agent1-kind=2
+r4-agent1-sku=178/178XL
+r4-agent1-type=1
+r4-agent2-kind=2
+r4-agent2-sku=178/178XL
+r4-agent2-type=4
+r4-agent3-kind=2
+r4-agent3-sku=178/178XL
+r4-agent3-type=5
+r4-agent4-kind=2
+r4-agent4-sku=178/178XL
+r4-agent4-type=6
+r4-agent5-kind=2
+r4-agent5-sku=178/178XL
+r4-agent5-type=19
+r8-agent1-kind=2
+r8-agent1-sku=862/862XL
+r8-agent1-type=1
+r8-agent2-kind=2
+r8-agent2-sku=862/862XL
+r8-agent2-type=4
+r8-agent3-kind=2
+r8-agent3-sku=862/862XL
+r8-agent3-type=5
+r8-agent4-kind=2
+r8-agent4-sku=862/862XL
+r8-agent4-type=6
+r8-agent5-kind=2
+r8-agent5-sku=862/862XL
+r8-agent5-type=19
+scan-src=1
+scan-type=10
+status-battery-check=0
+status-dynamic-counters=2
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.10.9
+tech-class=Python10
+tech-subclass=NoCDDVD,NoMaxDPI
+tech-type=2
+usb-pid=f11
+usb-vid=3f0
+wifi-config=1
+
+[officejet_series_320]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=2
+fw-download=False
+icon=OfficeJet_Series_300.png
+io-mfp-mode=7
+io-mode=0
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet 320 All-in-One Series Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=26 (51626A)
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=0
+support-type=2
+support-ver=0.9.5
+tech-class=DJ540
+tech-subclass=Normal
+tech-type=1
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_mopier_320]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=HP_LaserJet_9000_MFP.png
+io-mfp-mode=6
+io-mode=6
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Mopier 320 Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=43 (C8543X)
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=3496
+support-type=2
+support-ver=0.9.5
+tech-class=LJMono,Postscript
+tech-subclass=LargeFormatA3
+tech-type=3
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_deskjet_320]
+align-type=0
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_printer.png
+io-mfp-mode=6
+io-mode=1
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 320 Printer
+model2=HP Deskjet 320 Printer w/sheetfeeder
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=2c3a
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_320_series]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=Photosmart_370_series.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart 320 Compact Photo Printer
+model2=HP Photosmart 325xi Compact Photo Printer
+model3=HP Photosmart 325v Compact Photo Printer
+model4=HP Photosmart 325 Compact Photo Printer
+model5=HP Photosmart 329 Compact Photo Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=95 (C8766WN)/97 (C9363WN)
+r0-agent1-type=2
+r0-agent2-kind=3
+r0-agent2-sku=100 (C9368AN)
+r0-agent2-type=10
+r1-agent1-kind=3
+r1-agent1-sku=95 (C8766WN)/97 (C9363WN)
+r1-agent1-type=2
+r1-agent2-kind=3
+r1-agent2-sku=100 (C9368AN)
+r1-agent2-type=10
+r2-agent1-kind=3
+r2-agent1-sku=95 (C8766WN)/97 (C9363WN)
+r2-agent1-type=2
+r2-agent2-kind=3
+r2-agent2-sku=100 (C9368AN)
+r2-agent2-type=10
+r3-agent1-kind=3
+r3-agent1-sku=100 (C9368AN)
+r3-agent1-type=10
+r4-agent1-kind=3
+r4-agent1-sku=344 (C9363EN)/343 (C8766EN)
+r4-agent1-type=2
+r4-agent2-kind=3
+r4-agent2-sku=100 (C9368AN)
+r4-agent2-type=10
+r5-agent1-kind=3
+r5-agent1-sku=134 (C8766HN)/135 (C9363HN)
+r5-agent1-type=2
+r5-agent2-kind=3
+r5-agent2-sku=100 (C9368AN)
+r5-agent2-type=10
+r6-agent1-kind=3
+r6-agent1-sku=134 (C8766HN)/135 (C9363HN)
+r6-agent1-type=2
+r6-agent2-kind=3
+r6-agent2-sku=100 (C9368AN)
+r6-agent2-type=10
+r7-agent1-kind=3
+r7-agent1-sku=857 (C9363ZN)/855 (C8766ZN)
+r7-agent1-type=2
+r7-agent2-kind=3
+r7-agent2-sku=100 (C9368AN)
+r7-agent2-type=10
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJGenericVIP
+tech-subclass=4x6FullBleed
+tech-type=2
+usb-pid=1202
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_a320_series]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=Photosmart_a310.png
+io-mfp-mode=3
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart A320 Compact Photo Printer
+model2=HP Photosmart A321 Compact Photo Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=110
+r0-agent1-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.7.6
+tech-class=DJGenericVIP
+tech-subclass=4x6FullBleed
+tech-type=2
+usb-pid=1e02
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_330_series]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=Photosmart_370_series.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart 330 Series Compact Photo Printer
+model2=HP Photosmart 335 Compact Photo Printer
+model3=HP Photosmart 335xi Compact Photo Printer
+model4=HP Photosmart 335v Compact Photo Printer
+model5=HP Photosmart 337 Compact Photo Printer
+model6=HP Photosmart 338 Compact Photo Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=95 (C8766WN)/97 (C9363WN)
+r0-agent1-type=2
+r0-agent2-kind=3
+r0-agent2-sku=100 (C9368AN)
+r0-agent2-type=10
+r1-agent1-kind=3
+r1-agent1-sku=95 (C8766WN)/97 (C9363WN)
+r1-agent1-type=2
+r1-agent2-kind=3
+r1-agent2-sku=100 (C9368AN)
+r1-agent2-type=10
+r2-agent1-kind=3
+r2-agent1-sku=95 (C8766WN)/97 (C9363WN)
+r2-agent1-type=2
+r2-agent2-kind=3
+r2-agent2-sku=100 (C9368AN)
+r2-agent2-type=10
+r3-agent1-kind=3
+r3-agent1-sku=100 (C9368AN)
+r3-agent1-type=10
+r4-agent1-kind=3
+r4-agent1-sku=344 (C9363EN)/343 (C8766EN)
+r4-agent1-type=2
+r4-agent2-kind=3
+r4-agent2-sku=100 (C9368AN)
+r4-agent2-type=10
+r5-agent1-kind=3
+r5-agent1-sku=134 (C8766HN)/135 (C9363HN)
+r5-agent1-type=2
+r5-agent2-kind=3
+r5-agent2-sku=100 (C9368AN)
+r5-agent2-type=10
+r6-agent1-kind=3
+r6-agent1-sku=134 (C8766HN)/135 (C9363HN)
+r6-agent1-type=2
+r6-agent2-kind=3
+r6-agent2-sku=100 (C9368AN)
+r6-agent2-type=10
+r7-agent1-kind=3
+r7-agent1-sku=857 (C9363ZN)/855 (C8766ZN)
+r7-agent1-type=2
+r7-agent2-kind=3
+r7-agent2-sku=100 (C9368AN)
+r7-agent2-type=10
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=3984
+support-type=2
+support-ver=0.9.5
+tech-class=DJGenericVIP
+tech-subclass=4x6FullBleed
+tech-type=2
+usb-pid=1602
+usb-vid=3f0
+wifi-config=0
+
+[hp_designjet_330]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=0
+io-mode=0
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP Designjet 330 Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=2eb8
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[officejet_series_330]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=2
+fw-download=False
+icon=OfficeJet_Series_300.png
+io-mfp-mode=7
+io-mode=0
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet 330 All-in-One Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=26 (51626A)
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=2e1f
+support-type=2
+support-ver=0.9.5
+tech-class=DJ540
+tech-subclass=GrayscaleOnly
+tech-type=1
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_deskjet_340c]
+align-type=0
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_printer.png
+io-mfp-mode=6
+io-mode=1
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 340cv Printer
+model2=HP Deskjet 340cm Printer
+model3=HP Deskjet 340cbi Printer
+model4=HP Deskjet 340 Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=3320
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_designjet_350]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=0
+io-mode=0
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP Designjet 350c Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=2eb8
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[officejet_series_350]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=2
+fw-download=False
+icon=OfficeJet_Series_300.png
+io-mfp-mode=7
+io-mode=0
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet 350 All-in-One Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=26 (51626A)
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=2e1f
+support-type=2
+support-ver=0.9.5
+tech-class=DJ540
+tech-subclass=GrayscaleOnly
+tech-type=1
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[dj350]
+align-type=8
+clean-type=1
+color-cal-type=1
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=dj350.png
+io-mfp-mode=7
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 350c Printer
+model2=HP Deskjet 350cbi Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=56 (C6656AN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=57 (C6657AN)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=58 (C6658AN)
+r0-agent3-type=3
+r0-agent4-kind=9
+r0-agent4-sku=C8222A/C8263A
+r0-agent4-type=62
+scan-src=0
+scan-type=0
+status-battery-check=1
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=3636
+support-type=2
+support-ver=0.9.5
+tech-class=DJ350
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_electrostatic_355]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=0
+io-mode=0
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP Electrostatic 355 Plotter
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=2a8f
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_370_series]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=Photosmart_370_series.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart 370 Compact Photo Printer
+model2=HP Photosmart 375xi Compact Photo Printer
+model3=HP Photosmart 375v Compact Photo Printer
+model4=HP Photosmart 375 Compact Photo Printer
+model5=HP Photosmart 375Bxi Compact Photo Printer with Battery
+model6=HP Photosmart 375B Compact Photo Printer with Battery
+monitor-type=0
+panel-check-type=0
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=95 (C8766WN)/97 (C9363WN)
+r0-agent1-type=2
+r0-agent2-kind=3
+r0-agent2-sku=100 (C9368AN)
+r0-agent2-type=10
+r1-agent1-kind=3
+r1-agent1-sku=95 (C8766WN)/97 (C9363WN)
+r1-agent1-type=2
+r1-agent2-kind=3
+r1-agent2-sku=100 (C9368AN)
+r1-agent2-type=10
+r2-agent1-kind=3
+r2-agent1-sku=95 (C8766WN)/97 (C9363WN)
+r2-agent1-type=2
+r2-agent2-kind=3
+r2-agent2-sku=100 (C9368AN)
+r2-agent2-type=10
+r3-agent1-kind=3
+r3-agent1-sku=100 (C9368AN)
+r3-agent1-type=10
+r4-agent1-kind=3
+r4-agent1-sku=344 (C9363EN)/343 (C8766EN)
+r4-agent1-type=2
+r4-agent2-kind=3
+r4-agent2-sku=100 (C9368AN)
+r4-agent2-type=10
+r5-agent1-kind=3
+r5-agent1-sku=134 (C8766HN)/135 (C9363HN)
+r5-agent1-type=2
+r5-agent2-kind=3
+r5-agent2-sku=100 (C9368AN)
+r5-agent2-type=10
+r6-agent1-kind=3
+r6-agent1-sku=134 (C8766HN)/135 (C9363HN)
+r6-agent1-type=2
+r6-agent2-kind=3
+r6-agent2-sku=100 (C9368AN)
+r6-agent2-type=10
+r7-agent1-kind=3
+r7-agent1-sku=857 (C9363ZN)/855 (C8766ZN)
+r7-agent1-type=2
+r7-agent2-kind=3
+r7-agent2-sku=100 (C9368AN)
+r7-agent2-type=10
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJGenericVIP
+tech-subclass=4x6FullBleed
+tech-type=2
+usb-pid=1302
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_380_series]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=Photosmart_370_series.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart 385 Compact Photo Printer
+model2=HP Photosmart 385xi Compact Photo Printer
+model3=HP Photosmart 385v Compact Photo Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=95 (C8766WN)/97 (C9363WN)
+r0-agent1-type=2
+r0-agent2-kind=3
+r0-agent2-sku=100 (C9368AN)
+r0-agent2-type=10
+r1-agent1-kind=3
+r1-agent1-sku=95 (C8766WN)/97 (C9363WN)
+r1-agent1-type=2
+r1-agent2-kind=3
+r1-agent2-sku=100 (C9368AN)
+r1-agent2-type=10
+r2-agent1-kind=3
+r2-agent1-sku=95 (C8766WN)/97 (C9363WN)
+r2-agent1-type=2
+r2-agent2-kind=3
+r2-agent2-sku=100 (C9368AN)
+r2-agent2-type=10
+r3-agent1-kind=3
+r3-agent1-sku=100 (C9368AN)
+r3-agent1-type=10
+r4-agent1-kind=3
+r4-agent1-sku=344 (C9363EN)/343 (C8766EN)
+r4-agent1-type=2
+r4-agent2-kind=3
+r4-agent2-sku=100 (C9368AN)
+r4-agent2-type=10
+r5-agent1-kind=3
+r5-agent1-sku=134 (C8766HN)/135 (C9363HN)
+r5-agent1-type=2
+r5-agent2-kind=3
+r5-agent2-sku=100 (C9368AN)
+r5-agent2-type=10
+r6-agent1-kind=3
+r6-agent1-sku=134 (C8766HN)/135 (C9363HN)
+r6-agent1-type=2
+r6-agent2-kind=3
+r6-agent2-sku=100 (C9368AN)
+r6-agent2-type=10
+r7-agent1-kind=3
+r7-agent1-sku=857 (C9363ZN)/855 (C8766ZN)
+r7-agent1-type=2
+r7-agent2-kind=3
+r7-agent2-sku=100 (C9368AN)
+r7-agent2-type=10
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJGenericVIP
+tech-subclass=4x6FullBleed
+tech-type=2
+usb-pid=1702
+usb-vid=3f0
+wifi-config=0
+
+[hp_deskjet_400]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_deskjet.png
+io-mfp-mode=6
+io-mode=0
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 400 Printer
+model2=HP Deskjet 400 Color Capable Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=20 (C6614DN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=49 (51649A)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJ540
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_400_color_m451dn]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=hp_color_laserjet_cp2025.png
+io-mfp-mode=1
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 400 Color M451dn
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+ppd-name=lj_300_400_color_m351_m451
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CE410A/CE410X
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=CE411A
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=CE413A
+r0-agent3-type=5
+r0-agent4-kind=4
+r0-agent4-sku=CE412A
+r0-agent4-type=6
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.12.2
+tech-class=Postscript
+tech-subclass=Normal
+tech-type=4
+usb-pid=f2a
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_400_colormfp_m475dw]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=7
+fw-download=False
+icon=hp_color_laserjet_cm1312_mfp.png
+io-mfp-mode=1
+io-mode=1
+io-support=14
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 400 Color MFP M475dw
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=1
+plugin-reason=64
+power-settings=0
+ppd-name=lj_300_400_color_mfp_m375_m475
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CE410A
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=CE411A
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=CE413A
+r0-agent3-type=5
+r0-agent4-kind=4
+r0-agent4-sku=CE412A
+r0-agent4-type=6
+scan-src=3
+scan-type=5
+status-battery-check=0
+status-dynamic-counters=0
+status-type=10
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.12.2
+tech-class=Postscript
+tech-subclass=Normal
+tech-type=4
+usb-pid=82a
+usb-vid=3f0
+wifi-config=3
+
+[hp_laserjet_400_color_m451dw]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=hp_color_laserjet_cp2025.png
+io-mfp-mode=1
+io-mode=1
+io-support=14
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 400 Color M451dw
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+ppd-name=lj_300_400_color_m351_m451
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CE410A/CE410X
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=CE411A
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=CE413A
+r0-agent3-type=5
+r0-agent4-kind=4
+r0-agent4-sku=CE412A
+r0-agent4-type=6
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.12.2
+tech-class=Postscript
+tech-subclass=Normal
+tech-type=4
+usb-pid=f2a
+usb-vid=3f0
+wifi-config=3
+
+[hp_deskjet_400l]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_deskjet.png
+io-mfp-mode=6
+io-mode=0
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 400L Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=20 (C6614DN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=49 (51649A)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJ350
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_400_color_m451nw]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=hp_color_laserjet_cp2025.png
+io-mfp-mode=1
+io-mode=1
+io-support=14
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 400 Color M451nw
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+ppd-name=lj_300_400_color_m351_m451
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CE410A/CE410X
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=CE411A
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=CE413A
+r0-agent3-type=5
+r0-agent4-kind=4
+r0-agent4-sku=CE412A
+r0-agent4-type=6
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.12.2
+tech-class=Postscript
+tech-subclass=Normal
+tech-type=4
+usb-pid=f2a
+usb-vid=3f0
+wifi-config=3
+
+[hp_laserjet_400_colormfp_m475dn]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=7
+fw-download=False
+icon=hp_color_laserjet_cm1312_mfp.png
+io-mfp-mode=1
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 400 Color MFP M475dn
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=1
+plugin-reason=64
+power-settings=0
+ppd-name=lj_300_400_color_mfp_m375_m475
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CE410A
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=CE411A
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=CE413A
+r0-agent3-type=5
+r0-agent4-kind=4
+r0-agent4-sku=CE412A
+r0-agent4-type=6
+scan-src=3
+scan-type=5
+status-battery-check=0
+status-dynamic-counters=0
+status-type=10
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.12.2
+tech-class=Postscript
+tech-subclass=Normal
+tech-type=4
+usb-pid=82a
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_prem_c410_series]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=1
+fw-download=False
+icon=Photosmart_C6100.png
+io-mfp-mode=3
+io-mode=1
+io-support=14
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart Prem C410 series
+monitor-type=0
+panel-check-type=1
+pcard-type=2
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=2
+r0-agent1-sku=564/564XL
+r0-agent1-type=1
+r0-agent2-kind=2
+r0-agent2-sku=564/564XL
+r0-agent2-type=4
+r0-agent3-kind=2
+r0-agent3-sku=564/564XL
+r0-agent3-type=5
+r0-agent4-kind=2
+r0-agent4-sku=564/564XL
+r0-agent4-type=6
+r0-agent5-kind=2
+r0-agent5-sku=564/564XL
+r0-agent5-type=19
+r1-agent1-kind=2
+r1-agent1-sku=564/564XL
+r1-agent1-type=1
+r1-agent2-kind=2
+r1-agent2-sku=564/564XL
+r1-agent2-type=4
+r1-agent3-kind=2
+r1-agent3-sku=564/564XL
+r1-agent3-type=5
+r1-agent4-kind=2
+r1-agent4-sku=564/564XL
+r1-agent4-type=6
+r1-agent5-kind=2
+r1-agent5-sku=564/564XL
+r1-agent5-type=19
+r2-agent1-kind=2
+r2-agent1-sku=564/564XL
+r2-agent1-type=1
+r2-agent2-kind=2
+r2-agent2-sku=564/564XL
+r2-agent2-type=4
+r2-agent3-kind=2
+r2-agent3-sku=564/564XL
+r2-agent3-type=5
+r2-agent4-kind=2
+r2-agent4-sku=564/564XL
+r2-agent4-type=6
+r2-agent5-kind=2
+r2-agent5-sku=564/564XL
+r2-agent5-type=19
+r4-agent1-kind=2
+r4-agent1-sku=178/178XL
+r4-agent1-type=1
+r4-agent2-kind=2
+r4-agent2-sku=178/178XL
+r4-agent2-type=4
+r4-agent3-kind=2
+r4-agent3-sku=178/178XL
+r4-agent3-type=5
+r4-agent4-kind=2
+r4-agent4-sku=178/178XL
+r4-agent4-type=6
+r4-agent5-kind=2
+r4-agent5-sku=178/178XL
+r4-agent5-type=19
+r8-agent1-kind=2
+r8-agent1-sku=862/862XL
+r8-agent1-type=1
+r8-agent2-kind=2
+r8-agent2-sku=862/862XL
+r8-agent2-type=4
+r8-agent3-kind=2
+r8-agent3-sku=862/862XL
+r8-agent3-type=5
+r8-agent4-kind=2
+r8-agent4-sku=862/862XL
+r8-agent4-type=6
+r8-agent5-kind=2
+r8-agent5-sku=862/862XL
+r8-agent5-type=19
+scan-src=3
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=2
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.10.9
+tech-class=Python10
+tech-subclass=NoCDDVD,NoMaxDPI
+tech-type=2
+usb-pid=9611
+usb-vid=3f0
+wifi-config=1
+
+[photosmart_420_series]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=Photosmart_370_series.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart 420 Compact Photo Printer
+model2=HP Photosmart 422 Compact Photo Printer
+model3=HP Photosmart 422v Compact Photo Printer
+model4=HP Photosmart 422xi Compact Photo Printer
+model5=HP Photosmart 425 Compact Photo Printer
+model6=HP Photosmart 425v Compact Photo Printer
+model7=HP Photosmart 428 Compact Photo Printer
+model8=HP Photosmart 428v Compact Photo Printer
+model9=HP Photosmart 428xi Compact Photo Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=95 (C8766WN)/97 (C9363WN)
+r0-agent1-type=2
+r0-agent2-kind=3
+r0-agent2-sku=100 (C9368AN)
+r0-agent2-type=10
+r1-agent1-kind=3
+r1-agent1-sku=95 (C8766WN)/97 (C9363WN)
+r1-agent1-type=2
+r1-agent2-kind=3
+r1-agent2-sku=100 (C9368AN)
+r1-agent2-type=10
+r2-agent1-kind=3
+r2-agent1-sku=95 (C8766WN)/97 (C9363WN)
+r2-agent1-type=2
+r2-agent2-kind=3
+r2-agent2-sku=100 (C9368AN)
+r2-agent2-type=10
+r3-agent1-kind=3
+r3-agent1-sku=100 (C9368AN)
+r3-agent1-type=10
+r4-agent1-kind=3
+r4-agent1-sku=344 (C9363EN)/343 (C8766EN)
+r4-agent1-type=2
+r4-agent2-kind=3
+r4-agent2-sku=100 (C9368AN)
+r4-agent2-type=10
+r5-agent1-kind=3
+r5-agent1-sku=134 (C8766HN)/135 (C9363HN)
+r5-agent1-type=2
+r5-agent2-kind=3
+r5-agent2-sku=100 (C9368AN)
+r5-agent2-type=10
+r6-agent1-kind=3
+r6-agent1-sku=134 (C8766HN)/135 (C9363HN)
+r6-agent1-type=2
+r6-agent2-kind=3
+r6-agent2-sku=100 (C9368AN)
+r6-agent2-type=10
+r7-agent1-kind=3
+r7-agent1-sku=857 (C9363ZN)/855 (C8766ZN)
+r7-agent1-type=2
+r7-agent2-kind=3
+r7-agent2-sku=100 (C9368AN)
+r7-agent2-type=10
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=0
+support-type=2
+support-ver=0.9.5
+tech-class=DJGenericVIP
+tech-subclass=4x6FullBleed
+tech-type=2
+usb-pid=1502
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_a430_series]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=Photosmart_a510.png
+io-mfp-mode=3
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart A430 Compact Photo Printer
+model2=HP Photosmart A432 Compact Photo Printer
+model3=HP Photosmart A433 Compact Photo Printer
+model4=HP Photosmart A434 Compact Photo Printer
+model5=HP Photosmart A436 Compact Photo Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=110
+r0-agent1-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=0
+support-type=2
+support-ver=1.6.6
+tech-class=DJGenericVIP
+tech-subclass=4x6FullBleed
+tech-type=2
+usb-pid=1902
+usb-vid=3f0
+wifi-config=0
+
+[hp_designjet_430]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=0
+io-mode=0
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP Designjet 430 Printer (E/A0-size)
+model2=HP Designjet 430 Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=3c28
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_a440_series]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=Photosmart_370_series.png
+io-mfp-mode=3
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart A440 Compact Photo Printer
+model2=HP Photosmart A442 Compact Photo Printer
+model3=HP Photosmart A446 Compact Photo Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=2
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=110
+r0-agent1-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=3a05
+support-type=2
+support-ver=2.7.6
+tech-class=DJGenericVIP
+tech-subclass=4x6FullBleed
+tech-type=2
+usb-pid=1f02
+usb-vid=3f0
+wifi-config=0
+
+[hp_designjet_450]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=0
+io-mode=0
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP Designjet 450c Printer
+model2=HP Designjet 450c Printer (E/A0-size)
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=38cb
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[dj450]
+align-type=8
+clean-type=1
+color-cal-type=1
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=dj450.png
+io-mfp-mode=7
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 450ci Mobile Printer
+model2=HP Deskjet 450cbi Mobile Printer
+model3=HP Deskjet 450wbt Mobile Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=1
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=56 (C6656AN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=57 (C6657AN)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=58 (C6658AN)
+r0-agent3-type=3
+r0-agent4-kind=9
+r0-agent4-sku=C8222A/C8263A
+r0-agent4-type=62
+scan-src=0
+scan-type=0
+status-battery-check=1
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=381e
+support-type=2
+support-ver=0.9.5
+tech-class=DJ9xxVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=512
+usb-vid=3f0
+wifi-config=0
+
+[hp_designjet_455ca]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=0
+io-mode=0
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP Designjet 455ca Printer
+model2=HP Designjet 455ca Printer (E/A0-size)
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=3193
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_460]
+align-type=8
+clean-type=1
+color-cal-type=1
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=dj450.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 460c Mobile Printer
+model2=HP Deskjet 460cb Mobile Printer
+model3=HP Deskjet 460wf Mobile Printer
+model4=HP Deskjet 460wbt Mobile Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=1
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=94
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=95/97
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=99
+r0-agent3-type=3
+r0-agent4-kind=9
+r0-agent4-sku=C8263A
+r0-agent4-type=62
+r0-agent5-kind=3
+r0-agent5-sku=100
+r0-agent5-type=19
+scan-src=0
+scan-type=0
+status-battery-check=1
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=3b72
+support-type=2
+support-ver=0.9.6
+tech-class=DJ55xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=1312
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_470_series]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=Photosmart_370_series.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart 470 Series Compact Photo Printer
+model2=HP Photosmart 475xi Compact Photo Printer
+model3=HP Photosmart 475v Compact Photo Printer
+model4=HP Photosmart 475 Compact Photo Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=95 (C8766WN)/97 (C9363WN)
+r0-agent1-type=2
+r0-agent2-kind=3
+r0-agent2-sku=100 (C9368AN)
+r0-agent2-type=10
+r1-agent1-kind=3
+r1-agent1-sku=95 (C8766WN)/97 (C9363WN)
+r1-agent1-type=2
+r1-agent2-kind=3
+r1-agent2-sku=100 (C9368AN)
+r1-agent2-type=10
+r2-agent1-kind=3
+r2-agent1-sku=95 (C8766WN)/97 (C9363WN)
+r2-agent1-type=2
+r2-agent2-kind=3
+r2-agent2-sku=100 (C9368AN)
+r2-agent2-type=10
+r3-agent1-kind=3
+r3-agent1-sku=100 (C9368AN)
+r3-agent1-type=10
+r4-agent1-kind=3
+r4-agent1-sku=344 (C9363EN)/343 (C8766EN)
+r4-agent1-type=2
+r4-agent2-kind=3
+r4-agent2-sku=100 (C9368AN)
+r4-agent2-type=10
+r5-agent1-kind=3
+r5-agent1-sku=134 (C8766HN)/135 (C9363HN)
+r5-agent1-type=2
+r5-agent2-kind=3
+r5-agent2-sku=100 (C9368AN)
+r5-agent2-type=10
+r6-agent1-kind=3
+r6-agent1-sku=134 (C8766HN)/135 (C9363HN)
+r6-agent1-type=2
+r6-agent2-kind=3
+r6-agent2-sku=100 (C9368AN)
+r6-agent2-type=10
+r7-agent1-kind=3
+r7-agent1-sku=857 (C9363ZN)/855 (C8766ZN)
+r7-agent1-type=2
+r7-agent2-kind=3
+r7-agent2-sku=100 (C9368AN)
+r7-agent2-type=10
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=398c
+support-type=2
+support-ver=0.9.5
+tech-class=PSP470
+tech-subclass=FullBleed
+tech-type=2
+usb-pid=1802
+usb-vid=3f0
+wifi-config=0
+
+[officejet_h470]
+align-type=10
+clean-type=1
+color-cal-type=3
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=dj450.png
+io-mfp-mode=6
+io-mode=1
+io-support=26
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet H470 Mobile Printer
+model2=HP Officejet H470wbt Mobile Printer
+model3=HP Officejet H470wf Mobile Printer
+model4=HP Officejet H470bt Mobile Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=2
+plugin=0
+plugin-reason=0
+power-settings=2
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=94/98
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=95/97
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=99
+r0-agent3-type=3
+r0-agent4-kind=3
+r0-agent4-sku=100
+r0-agent4-type=19
+r0-agent5-kind=9
+r0-agent5-sku=C8222A/C8263A
+r0-agent5-type=62
+r1-agent1-kind=3
+r1-agent1-sku=94/98
+r1-agent1-type=1
+r1-agent2-kind=3
+r1-agent2-sku=95/97
+r1-agent2-type=2
+r1-agent3-kind=3
+r1-agent3-sku=99
+r1-agent3-type=3
+r1-agent4-kind=3
+r1-agent4-sku=100
+r1-agent4-type=19
+r1-agent5-kind=9
+r1-agent5-sku=
+r1-agent5-type=62
+r2-agent1-kind=3
+r2-agent1-sku=338/337
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=343/344
+r2-agent2-type=2
+r2-agent3-kind=3
+r2-agent3-sku=348
+r2-agent3-type=3
+r2-agent4-kind=3
+r2-agent4-sku=100
+r2-agent4-type=19
+r2-agent5-kind=9
+r2-agent5-sku=
+r2-agent5-type=62
+r4-agent1-kind=3
+r4-agent1-sku=131/129
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=135/134
+r4-agent2-type=2
+r4-agent3-kind=3
+r4-agent3-sku=138
+r4-agent3-type=3
+r4-agent4-kind=3
+r4-agent4-sku=100
+r4-agent4-type=19
+r4-agent5-kind=9
+r4-agent5-sku=
+r4-agent5-type=62
+r8-agent1-kind=3
+r8-agent1-sku=852/851
+r8-agent1-type=1
+r8-agent2-kind=3
+r8-agent2-sku=855/857
+r8-agent2-type=2
+r8-agent3-kind=3
+r8-agent3-sku=858
+r8-agent3-type=3
+r8-agent4-kind=3
+r8-agent4-sku=100
+r8-agent4-type=19
+r8-agent5-kind=9
+r8-agent5-sku=
+r8-agent5-type=62
+scan-src=0
+scan-type=0
+status-battery-check=2
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.8.2
+tech-class=DJ55xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=2812
+usb-vid=3f0
+wifi-config=1
+
+[hp_designjet_488ca]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=0
+io-mode=0
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP Designjet 488ca Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=3496
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_500c]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=DESKJET_630C.png
+io-mfp-mode=6
+io-mode=0
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 500c Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=20 (C6614DN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=49 (51649A)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=2bc1
+support-type=2
+support-ver=0.9.5
+tech-class=DJ540
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_designjet_500_plus]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=0
+io-mode=0
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP Designjet 500 Plus 24-in Roll Printer
+model2=HP Designjet 500 Plus 42-in Roll Printer
+model3=HP Designjet 500ps plus 24-in Printer
+model4=HP Designjet 500ps plus 42-in Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=3f9a
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[psc_500]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=PSC_900_Series.png
+io-mfp-mode=6
+io-mode=1
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP PSC 500 All-in-One Printer
+model2=HP PSC 500xi All-in-One Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=15 (C6615DN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=23 (C1823D or C1823T)
+r0-agent2-type=2
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=1
+support-released=True
+support-subtype=3489
+support-type=2
+support-ver=0.9.5
+tech-class=DJ8xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_500]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=DESKJET_630C.png
+io-mfp-mode=6
+io-mode=0
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 500 Printer
+model2=HP Deskjet 500j Printer
+model3=HP Deskjet 500q Printer
+model4=HP Deskjet 500k Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=20 (C6614DN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=49 (51649A)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=2bc1
+support-type=2
+support-ver=0.9.5
+tech-class=DJ540
+tech-subclass=GrayscaleOnly
+tech-type=1
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_500_color_m551]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_color_laserjet_cp3525.png
+io-mfp-mode=3
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet Enterprise 500 Color M551
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CE400X
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=CE401A
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=CE403A
+r0-agent3-type=5
+r0-agent4-kind=4
+r0-agent4-sku=CE402A
+r0-agent4-type=6
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.11.10
+tech-class=Postscript
+tech-subclass=Normal
+tech-type=4
+usb-pid=a417
+usb-vid=3f0
+wifi-config=0
+
+[hp_designjet_500]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=0
+io-mode=0
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP Designjet 500 Mono 24-in Roll Printer
+model2=HP Designjet 500 Mono 42-in Roll Printer
+model3=HP Designjet 500 24-in Roll Printer
+model4=HP Designjet 500 42-in Roll Printer
+model5=HP Designjet 500ps 24-in Roll Printer
+model6=HP Designjet 500ps 42-in Roll Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=219b2b
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_505j]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=DESKJET_630C.png
+io-mfp-mode=6
+io-mode=0
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 505j Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=20 (C6614DN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=49 (51649A)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=2b65
+support-type=2
+support-ver=0.9.5
+tech-class=DJ540
+tech-subclass=GrayscaleOnly
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_510]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=DESKJET_630C.png
+io-mfp-mode=6
+io-mode=0
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 510 Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=20 (C6614DN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=49 (51649A)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=299b
+support-type=2
+support-ver=0.9.5
+tech-class=DJ540
+tech-subclass=GrayscaleOnly
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_designjet_510ps]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=0
+io-mode=0
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP Designjet 510 24-in Printer
+model2=HP Designjet 510 42-in Printer
+model3=HP Designjet 510ps 24-in Printer
+model4=HP Designjet 510ps 42-in Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=219b2b
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_a510_series]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=Photosmart_a510.png
+io-mfp-mode=3
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart A510 Compact Photo Printer
+model2=HP Photosmart A512 Compact Photo Printer
+model3=HP Photosmart A516 Compact Photo Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=110
+r0-agent1-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=1.6.6
+tech-class=DJGenericVIP
+tech-subclass=4x6FullBleed
+tech-type=2
+usb-pid=1a02
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_ink_adv_k510]
+align-type=1
+clean-type=3
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=default_photosmart.png
+io-mfp-mode=3
+io-mode=1
+io-support=10
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart Ink Adv K510
+monitor-type=0
+panel-check-type=1
+pcard-type=2
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=60/60XL
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=60/60XL
+r0-agent2-type=2
+r10-agent1-kind=3
+r10-agent1-sku=818/818XL/818L
+r10-agent1-type=1
+r10-agent2-kind=3
+r10-agent2-sku=818/818XL/818L
+r10-agent2-type=2
+r18-agent2-kind=3
+r18-agent2-sku=93/95
+r18-agent2-type=2
+r18-agent3-kind=3
+r18-agent3-sku=99
+r18-agent3-type=3
+r2-agent1-kind=3
+r2-agent1-sku=60/60XL/60L
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=60/60XL/60L
+r2-agent2-type=2
+r4-agent1-kind=3
+r4-agent1-sku=300/300XL
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=300/300XL
+r4-agent2-type=2
+r8-agent1-kind=3
+r8-agent1-sku=121/121XL
+r8-agent1-type=1
+r8-agent2-kind=3
+r8-agent2-sku=121/121XL
+r8-agent2-type=2
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.11.1
+tech-class=ViperPlusVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=9e11
+usb-vid=3f0
+wifi-config=1
+
+[photosmart_estn_c510_series]
+align-type=1
+clean-type=3
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=Photosmart_C6100.png
+io-mfp-mode=3
+io-mode=1
+io-support=10
+job-storage=0
+linefeed-cal-type=0
+model1=HP PhotoSmart eStn C510 Series
+monitor-type=0
+panel-check-type=1
+pcard-type=2
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=2
+r0-agent1-sku=564/564XL
+r0-agent1-type=1
+r0-agent2-kind=2
+r0-agent2-sku=564/564XL
+r0-agent2-type=4
+r0-agent3-kind=2
+r0-agent3-sku=564/564XL
+r0-agent3-type=5
+r0-agent4-kind=2
+r0-agent4-sku=564/564XL
+r0-agent4-type=6
+r0-agent5-kind=2
+r0-agent5-sku=564/564XL
+r0-agent5-type=19
+r1-agent1-kind=2
+r1-agent1-sku=564/564XL
+r1-agent1-type=1
+r1-agent2-kind=2
+r1-agent2-sku=564/564XL
+r1-agent2-type=4
+r1-agent3-kind=2
+r1-agent3-sku=564/564XL
+r1-agent3-type=5
+r1-agent4-kind=2
+r1-agent4-sku=564/564XL
+r1-agent4-type=6
+r1-agent5-kind=2
+r1-agent5-sku=564/564XL
+r1-agent5-type=19
+r2-agent1-kind=2
+r2-agent1-sku=564/564XL
+r2-agent1-type=1
+r2-agent2-kind=2
+r2-agent2-sku=564/564XL
+r2-agent2-type=4
+r2-agent3-kind=2
+r2-agent3-sku=564/564XL
+r2-agent3-type=5
+r2-agent4-kind=2
+r2-agent4-sku=564/564XL
+r2-agent4-type=6
+r2-agent5-kind=2
+r2-agent5-sku=564/564XL
+r2-agent5-type=19
+r4-agent1-kind=2
+r4-agent1-sku=178/178XL
+r4-agent1-type=1
+r4-agent2-kind=2
+r4-agent2-sku=178/178XL
+r4-agent2-type=4
+r4-agent3-kind=2
+r4-agent3-sku=178/178XL
+r4-agent3-type=5
+r4-agent4-kind=2
+r4-agent4-sku=178/178XL
+r4-agent4-type=6
+r4-agent5-kind=2
+r4-agent5-sku=178/178XL
+r4-agent5-type=19
+r8-agent1-kind=2
+r8-agent1-sku=862/862XL
+r8-agent1-type=1
+r8-agent2-kind=2
+r8-agent2-sku=862/862XL
+r8-agent2-type=4
+r8-agent3-kind=2
+r8-agent3-sku=862/862XL
+r8-agent3-type=5
+r8-agent4-kind=2
+r8-agent4-sku=862/862XL
+r8-agent4-type=6
+r8-agent5-kind=2
+r8-agent5-sku=862/862XL
+r8-agent5-type=19
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=2
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.10.9
+tech-class=Python10
+tech-subclass=NoCDDVD,NoMaxDPI
+tech-type=2
+usb-pid=9011
+usb-vid=3f0
+wifi-config=1
+
+[deskjet_520]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=DESKJET_630C.png
+io-mfp-mode=6
+io-mode=0
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 520 Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=20 (C6614DN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=49 (51649A)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=2b28
+support-type=2
+support-ver=0.9.5
+tech-class=DJ540
+tech-subclass=GrayscaleOnly
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_a520_series]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=Photosmart_a510.png
+io-mfp-mode=3
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart A522xi Compact Photo Printer
+model2=HP Photosmart A522 Compact Photo Printer
+model3=HP Photosmart A525 Compact Photo Printer
+model4=HP Photosmart A526 Compact Photo Printer
+model5=HP Photosmart A528 Compact Photo Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=110
+r0-agent1-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.7.7
+tech-class=DJGenericVIP
+tech-subclass=4x6FullBleed
+tech-type=2
+usb-pid=2602
+usb-vid=3f0
+wifi-config=0
+
+[officejet_series_520]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=2
+fw-download=False
+icon=officejet_500.png
+io-mfp-mode=7
+io-mode=1
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet 520 All-in-One Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=29 (51629A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=49 (51649A)
+r0-agent2-type=2
+scan-src=3
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=2e3e
+support-type=2
+support-ver=0.9.5
+tech-class=DJ6xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_a530_series]
+align-type=1
+clean-type=-1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=Photosmart_a510.png
+io-mfp-mode=3
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart A532 Compact Photo Printer
+model2=HP Photosmart A536 Compact Photo Printer
+model3=HP Photosmart A538 Compact Photo Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=2
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=110
+r0-agent1-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.8.7
+tech-class=QuickConnect
+tech-subclass=Normal
+tech-type=2
+usb-pid=2b02
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_540]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=DESKJET_630C.png
+io-mfp-mode=6
+io-mode=0
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 540 Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=20 (C6614DN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=49 (51649A)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=2bc0
+support-type=2
+support-ver=0.9.5
+tech-class=DJ540
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_deskjet_550c]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_printer.png
+io-mfp-mode=6
+io-mode=1
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 550c Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=2bc1
+support-type=1
+support-ver=2.7.10
+tech-class=DJ540
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[officejet_pro_k550]
+align-type=1
+clean-type=1
+color-cal-type=5
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=officejet_k550.png
+io-mfp-mode=6
+io-mode=1
+io-support=14
+job-storage=0
+linefeed-cal-type=1
+model1=HP Officejet Pro K550dtwn Printer
+model2=HP Officejet Pro K550dtn Printer
+model3=HP Officejet Pro K550 Printer
+model4=HP Officejet Pro K550xi Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=1
+r-type=0
+r0-agent1-kind=1
+r0-agent1-sku=HP 68 (C9381)
+r0-agent1-type=14
+r0-agent2-kind=1
+r0-agent2-sku=HP 88 (C9382A)
+r0-agent2-type=15
+r0-agent3-kind=2
+r0-agent3-sku=HP 68 (C9396/C9385)
+r0-agent3-type=1
+r0-agent4-kind=2
+r0-agent4-sku=HP 88 (C9388/C9393)
+r0-agent4-type=6
+r0-agent5-kind=2
+r0-agent5-sku=HP 88 (C9386/C9391)
+r0-agent5-type=4
+r0-agent6-kind=2
+r0-agent6-sku=HP 88 (C9387/C9392)
+r0-agent6-type=5
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=3bcd
+support-type=2
+support-ver=0.9.6
+tech-class=OJProKx50
+tech-subclass=NoFullBleed
+tech-type=2
+usb-pid=1812
+usb-vid=3f0
+wifi-config=0
+
+[officejet_series_570]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=2
+fw-download=False
+icon=officejet_500.png
+io-mfp-mode=7
+io-mode=1
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet 570 All-in-One Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=29 (51629A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=49 (51649A)
+r0-agent2-type=2
+scan-src=2
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=2e3e
+support-type=2
+support-ver=0.9.5
+tech-class=DJ6xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[officejet_series_580]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=2
+fw-download=False
+icon=officejet_500.png
+io-mfp-mode=7
+io-mode=1
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet 580 All-in-One Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=29 (51629A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=49 (51649A)
+r0-agent2-type=2
+scan-src=2
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=2e3e
+support-type=2
+support-ver=0.9.5
+tech-class=DJ6xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[officejet_series_590]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=2
+fw-download=False
+icon=officejet_500.png
+io-mfp-mode=7
+io-mode=1
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet 590 All-in-One Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=29 (51629A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=49 (51649A)
+r0-agent2-type=2
+scan-src=2
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=2e3e
+support-type=2
+support-ver=0.9.5
+tech-class=DJ6xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[officejet_series_600]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=2
+fw-download=False
+icon=officejet_500.png
+io-mfp-mode=7
+io-mode=1
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet 600 All-in-One Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=29 (51629A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=49 (51649A)
+r0-agent2-type=2
+scan-src=2
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=320f
+support-type=2
+support-ver=0.9.5
+tech-class=DJ6xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_designjet_600]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=0
+io-mode=0
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP Designjet 600 Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=2d6a
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_600]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=DESKJET_610.png
+io-mfp-mode=6
+io-mode=0
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 600c Printer
+model2=HP Deskjet 600 Printer
+model3=HP Deskjet 600k Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=20 (C6614DN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=49 (51649A)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=2f6f
+support-type=2
+support-ver=0.9.5
+tech-class=DJ600
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_600_m601]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_LaserJet_4345_mfp.png
+io-mfp-mode=1
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet Enterprise 600 M601n
+model2=HP LaserJet Enterprise 600 M601dn
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+ppd-name=hp-laserjet_600_m601_m602_m603-ps.ppd
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CE390A
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.11.12
+tech-class=Postscript
+tech-subclass=Normal
+tech-type=3
+usb-pid=a517
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_600_m602]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_LaserJet_4345_mfp.png
+io-mfp-mode=1
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet Enterprise 600 M602n
+model2=HP LaserJet Enterprise 600 M602dn
+model3=HP LaserJet Enterprise 600 M602x
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+ppd-name=hp-laserjet_600_m601_m602_m603-ps.ppd
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CE390A
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.11.12
+tech-class=Postscript
+tech-subclass=Normal
+tech-type=3
+usb-pid=a517
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_600_m603]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_LaserJet_4345_mfp.png
+io-mfp-mode=1
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP laserJet Enterprise 600 M603n
+model2=HP laserJet Enterprise 600 M603dn
+model3=HP laserJet Enterprise 600 M603xh
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+ppd-name=hp-laserjet_600_m601_m602_m603-ps.ppd
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CE390A
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.11.12
+tech-class=Postscript
+tech-subclass=Normal
+tech-type=3
+usb-pid=a517
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_a610_series]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=photosmart_a610.png
+io-mfp-mode=3
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart A610 Compact Photo Printer
+model2=HP Photosmart A612 Compact Photo Printer
+model3=HP Photosmart A616 Compact Photo Printer
+model4=HP Photosmart A617 Compact Photo Printer
+model5=HP Photosmart A618 Compact Photo Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=110
+r0-agent1-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=1.6.6
+tech-class=PSP470
+tech-subclass=FullBleed
+tech-type=2
+usb-pid=1b02
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_610c]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=DESKJET_610.png
+io-mfp-mode=6
+io-mode=0
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 610c Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=20 (C6614DN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=49 (51649A)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=357e
+support-type=2
+support-ver=0.9.5
+tech-class=DJ6xxPhoto
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[officejet_series_610]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=2
+fw-download=False
+icon=officejet_500.png
+io-mfp-mode=7
+io-mode=1
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet 610 All-in-One Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=29 (51629A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=49 (51649A)
+r0-agent2-type=2
+scan-src=2
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=2e9a
+support-type=2
+support-ver=0.9.5
+tech-class=DJ6xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_610cl]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=DESKJET_610.png
+io-mfp-mode=6
+io-mode=0
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 610cl Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=20 (C6614DN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=49 (51649A)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=357e
+support-type=2
+support-ver=0.9.5
+tech-class=DJ6xxPhoto
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_designjet_t610]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=0
+io-mode=0
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP Designjet T610 24-in Printer
+model2=HP Designjet T610 44-in Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=219b2b
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_612c]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=DESKJET_610.png
+io-mfp-mode=6
+io-mode=0
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 612c Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=20 (C6614DN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=49 (51649A)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=3320
+support-type=2
+support-ver=0.9.5
+tech-class=DJ6xxPhoto
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_a620_series]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=photosmart_a610.png
+io-mfp-mode=3
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart A620 Compact Photo Printer
+model2=HP Photosmart A622 Compact Photo Printer
+model3=HP Photosmart A626 Compact Photo Printer
+model4=HP Photosmart A627 Compact Photo Printer
+model5=HP Photosmart A628 Compact Photo Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=110
+r0-agent1-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.7.7
+tech-class=PSP470
+tech-subclass=FullBleed
+tech-type=2
+usb-pid=2702
+usb-vid=3f0
+wifi-config=0
+
+[hp_designjet_t620]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=0
+io-mode=0
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP Desginjet T620 44-in Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=219b2b
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_a630_series]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=Photosmart_a510.png
+io-mfp-mode=3
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart A636 Compact Photo Printer
+model2=HP Photosmart A637 Compact Photo Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=2
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=110
+r0-agent1-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.8.9
+tech-class=QuickConnect
+tech-subclass=Normal
+tech-type=2
+usb-pid=2c02
+usb-vid=3f0
+wifi-config=0
+
+[officejet_series_630]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=2
+fw-download=False
+icon=officejet_500.png
+io-mfp-mode=7
+io-mode=1
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet 630 All-in-One Printer
+model2=HP Officejet 635 All-in-One Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=29 (51629A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=49 (51649A)
+r0-agent2-type=2
+scan-src=2
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=3062
+support-type=2
+support-ver=0.9.5
+tech-class=DJ6xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_630c]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=DESKJET_630C.png
+io-mfp-mode=6
+io-mode=0
+io-support=3
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 630c Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=20 (C6614DN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=49 (51649A)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=1
+support-released=True
+support-subtype=32c2
+support-type=2
+support-ver=0.9.5
+tech-class=DJ630
+tech-subclass=Normal
+tech-type=2
+usb-pid=2104
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_632c]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=DESKJET_630C.png
+io-mfp-mode=6
+io-mode=0
+io-support=3
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 632c Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=20 (C6614DN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=49 (51649A)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=1
+support-released=True
+support-subtype=3320
+support-type=2
+support-ver=0.9.5
+tech-class=DJ630
+tech-subclass=Normal
+tech-type=2
+usb-pid=2104
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_640c]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=DESKJET_630C.png
+io-mfp-mode=6
+io-mode=0
+io-support=3
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 640c Lite Printer
+model2=HP Deskjet 640c Printer
+model3=HP Deskjet 640u Printer
+model4=HP Deskjet 640c Pavilion Turbo Printer
+model5=HP Deskjet 642c Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=20 (C6614DN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=49 (51649A)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=16 (C1816A)
+r0-agent3-type=3
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=1
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJ6xxPhoto
+tech-subclass=Normal
+tech-type=2
+usb-pid=2004
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_a640_series]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=Photosmart_a510.png
+io-mfp-mode=3
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart A640 Printer Series
+monitor-type=0
+panel-check-type=0
+pcard-type=2
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=110
+r0-agent1-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.9.10
+tech-class=QuickConnect
+tech-subclass=Normal
+tech-type=2
+usb-pid=2c02
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_648c]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=DESKJET_630C.png
+io-mfp-mode=6
+io-mode=0
+io-support=3
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 648c Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=20 (C6614DN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=49 (51649A)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=16 (C1816A)
+r0-agent3-type=3
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=1
+support-released=True
+support-subtype=3b04
+support-type=2
+support-ver=0.9.5
+tech-class=DJ6xxPhoto
+tech-subclass=Normal
+tech-type=2
+usb-pid=2004
+usb-vid=3f0
+wifi-config=0
+
+[hp_designjet_650c]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=0
+io-mode=0
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP Designjet 650c Printer
+model2=HP Designjet 650c Printer Model B
+model3=HP Designjet 650c/ps Printer
+model4=HP Designjet 650c Printer Model B
+model5=HP Designjet 650c Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=2bde
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_656c]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=DESKJET_630C.png
+io-mfp-mode=6
+io-mode=0
+io-support=3
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 656c Printer
+model2=HP Deskjet 656cvr Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=20 (C6614DN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=49 (51649A)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=16 (C1816A)
+r0-agent3-type=3
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=1
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJ630
+tech-subclass=Normal
+tech-type=2
+usb-pid=2304
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_660]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=DESKJET_610.png
+io-mfp-mode=6
+io-mode=0
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 660k Printer
+model2=HP Deskjet 660c Printer
+model3=HP Deskjet 660cse Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=20 (C6614DN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=49 (51649A)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=2f6f
+support-type=2
+support-ver=0.9.5
+tech-class=DJ6xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_670]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=DESKJET_610.png
+io-mfp-mode=6
+io-mode=0
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 670k Printer
+model2=HP Deskjet 670c Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=20 (C6614DN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=49 (51649A)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=3007
+support-type=2
+support-ver=0.9.5
+tech-class=DJ6xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_670tv]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=DESKJET_610.png
+io-mfp-mode=6
+io-mode=0
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 670tv Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=20 (C6614DN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=49 (51649A)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=2f8d
+support-type=2
+support-ver=0.9.5
+tech-class=DJ6xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_670c]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=DESKJET_610.png
+io-mfp-mode=6
+io-mode=0
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model2=HP Deskjet 670c Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=20 (C6614DN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=49 (51649A)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=3007
+support-type=2
+support-ver=0.9.5
+tech-class=DJ6xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_672c]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=DESKJET_610.png
+io-mfp-mode=6
+io-mode=0
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 672c Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=20 (C6614DN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=49 (51649A)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=2eb9
+support-type=2
+support-ver=0.9.5
+tech-class=DJ6xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_680]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=DESKJET_610.png
+io-mfp-mode=6
+io-mode=0
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 680c Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=20 (C6614DN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=49 (51649A)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=2fe9
+support-type=2
+support-ver=0.9.5
+tech-class=DJ6xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_682]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=DESKJET_610.png
+io-mfp-mode=6
+io-mode=0
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 682c Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=20 (C6614DN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=49 (51649A)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=2e3d
+support-type=2
+support-ver=0.9.5
+tech-class=DJ6xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_690c]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=DESKJET_610.png
+io-mfp-mode=6
+io-mode=0
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 690c Plus Printer
+model2=HP Deskjet 690c Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=20 (C6614DN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=49 (51649A)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=16 (C1816A)
+r0-agent3-type=3
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=1
+support-released=True
+support-subtype=3007
+support-type=2
+support-ver=0.9.5
+tech-class=DJ6xxPhoto
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_690]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=DESKJET_610.png
+io-mfp-mode=6
+io-mode=0
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 690c Printer
+model2=HP Deskjet 690c Plus Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=20 (C6614DN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=49 (51649A)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=16 (C1816A)
+r0-agent3-type=3
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=1
+support-released=True
+support-subtype=3007
+support-type=2
+support-ver=0.9.5
+tech-class=DJ6xxPhoto
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_692]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=DESKJET_610.png
+io-mfp-mode=6
+io-mode=0
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 692k Printer
+model2=HP Deskjet 692c Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=20 (C6614DN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=49 (51649A)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=16 (C1816A)
+r0-agent3-type=3
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=1
+support-released=True
+support-subtype=3007
+support-type=2
+support-ver=0.9.5
+tech-class=DJ6xxPhoto
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_693]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=DESKJET_610.png
+io-mfp-mode=6
+io-mode=0
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 693c Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=20 (C6614DN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=49 (51649A)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=16 (C1816A)
+r0-agent3-type=3
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=1
+support-released=True
+support-subtype=3007
+support-type=2
+support-ver=0.9.5
+tech-class=DJ6xxPhoto
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_694]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=DESKJET_610.png
+io-mfp-mode=6
+io-mode=0
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 694c Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=20 (C6614DN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=49 (51649A)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=16 (C1816A)
+r0-agent3-type=3
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=1
+support-released=True
+support-subtype=3007
+support-type=2
+support-ver=0.9.5
+tech-class=DJ6xxPhoto
+tech-subclass=Normal
+tech-type=2
+usb-pid=8904
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_695]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=DESKJET_650C.png
+io-mfp-mode=6
+io-mode=0
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 695cci Printer
+model2=HP Deskjet 695c Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=20 (C6614DN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=49 (51649A)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=16 (C1816A)
+r0-agent3-type=3
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=1
+support-released=True
+support-subtype=357e
+support-type=2
+support-ver=0.9.5
+tech-class=DJ6xxPhoto
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_697]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=DESKJET_650C.png
+io-mfp-mode=6
+io-mode=0
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 697c Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=20 (C6614DN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=49 (51649A)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=16 (C1816A)
+r0-agent3-type=3
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=1
+support-released=True
+support-subtype=3007
+support-type=2
+support-ver=0.9.5
+tech-class=DJ6xxPhoto
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[officejet_series_700]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=2
+fw-download=False
+icon=officejet_500.png
+io-mfp-mode=7
+io-mode=1
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet 700 All-in-One Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=29 (51629A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=49 (51649A)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=16 (C1816A)
+r0-agent3-type=3
+scan-src=3
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=335d
+support-type=2
+support-ver=0.9.5
+tech-class=DJ6xxPhoto
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_designjet_700]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=0
+io-mode=0
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP Designjet 700 Printer
+model2=HP Designjet 700/B Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=38cb
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[officejet_series_710]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=2
+fw-download=False
+icon=officejet_500.png
+io-mfp-mode=7
+io-mode=1
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet 710 All-in-One Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=29 (51629A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=49 (51649A)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=16 (C1816A)
+r0-agent3-type=3
+scan-src=3
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=335d
+support-type=2
+support-ver=0.9.5
+tech-class=DJ6xxPhoto
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_deskjet_710c]
+align-type=0
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_printer.png
+io-mfp-mode=6
+io-mode=1
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 710c Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=357e
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_a710_series]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=Photosmart_a710.png
+io-mfp-mode=3
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart A712 Compact Photo Printer
+model2=HP Photosmart A716 Compact Photo Printer
+model3=HP Photosmart A717 Compact Photo Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=110
+r0-agent1-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=1.6.6
+tech-class=PSP470
+tech-subclass=FullBleed
+tech-type=2
+usb-pid=1c02
+usb-vid=3f0
+wifi-config=0
+
+[hp_deskjet_712c]
+align-type=0
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_printer.png
+io-mfp-mode=6
+io-mode=1
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 712c Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=2eb8
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_deskjet_720c]
+align-type=0
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_printer.png
+io-mfp-mode=6
+io-mode=1
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 720c Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=357e
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[officejet_series_720]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=2
+fw-download=False
+icon=officejet_500.png
+io-mfp-mode=7
+io-mode=1
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet 720 All-in-One Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=29 (51629A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=49 (51649A)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=16 (C1816A)
+r0-agent3-type=3
+scan-src=3
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=335d
+support-type=2
+support-ver=0.9.5
+tech-class=DJ6xxPhoto
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[psc_720]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=PSC_900_Series.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP PSC 720 All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=15 (C6615DN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=78 (C6578AN / C6578DN)
+r0-agent2-type=2
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=337c
+support-type=2
+support-ver=0.9.5
+tech-class=DJ9xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=1811
+usb-vid=3f0
+wifi-config=0
+
+[hp_deskjet_722c]
+align-type=0
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_printer.png
+io-mfp-mode=6
+io-mode=1
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 722c Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=3007
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[officejet_series_725]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=2
+fw-download=False
+icon=officejet_500.png
+io-mfp-mode=7
+io-mode=1
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet 725 All-in-One Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=29 (51629A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=49 (51649A)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=16 (C1816A)
+r0-agent3-type=3
+scan-src=3
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJ6xxPhoto
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_d730]
+align-type=5
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=Deskjet_5700.png
+io-mfp-mode=3
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet D730 Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=703
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=703
+r0-agent2-type=2
+r10-agent1-kind=3
+r10-agent1-sku=703
+r10-agent1-type=1
+r10-agent2-kind=3
+r10-agent2-sku=703
+r10-agent2-type=2
+r2-agent1-kind=3
+r2-agent1-sku=703
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=703
+r2-agent2-type=2
+r4-agent1-kind=3
+r4-agent1-sku=703
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=703
+r4-agent2-type=2
+r8-agent1-kind=3
+r8-agent1-sku=703
+r8-agent1-type=1
+r8-agent2-kind=3
+r8-agent2-sku=703
+r8-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.8.7
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=2804
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_f735]
+align-type=13
+clean-type=1
+color-cal-type=3
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=Photosmart_C4100.png
+io-mfp-mode=3
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet F735 All-in-One Printer
+model2=HP Deskjet F4280 All-in-One
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=703
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=703
+r0-agent2-type=2
+r10-agent1-kind=3
+r10-agent1-sku=703
+r10-agent1-type=1
+r10-agent2-kind=3
+r10-agent2-sku=703
+r10-agent2-type=2
+r2-agent1-kind=3
+r2-agent1-sku=703
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=703
+r2-agent2-type=2
+r4-agent1-kind=3
+r4-agent1-sku=703
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=703
+r4-agent2-type=2
+r8-agent1-kind=3
+r8-agent1-sku=703
+r8-agent1-type=1
+r8-agent2-kind=3
+r8-agent2-sku=703
+r8-agent2-type=2
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.8.7
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=2904
+usb-vid=3f0
+wifi-config=0
+
+[hp_designjet_750c]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=0
+io-mode=0
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP Designjet 750c Printer
+model2=HP Designjet 750c Plus Printer
+model3=HP Designjet 750c Plus/B Printer
+model4=HP Designjet 755cm Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=38cd
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[psc_750xi]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=PSC_900_Series.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP PSC 750xi All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=15 (C6615DN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=78 (C6578AN / C6578DN)
+r0-agent2-type=2
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=1
+support-released=True
+support-subtype=337c
+support-type=2
+support-ver=0.9.5
+tech-class=DJ9xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=1511
+usb-vid=3f0
+wifi-config=0
+
+[psc_750]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=PSC_900_Series.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP PSC 750 All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=15 (C6615DN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=78 (C6578AN / C6578DN)
+r0-agent2-type=2
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=1
+support-released=True
+support-subtype=352d
+support-type=2
+support-ver=0.9.5
+tech-class=DJ9xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=1411
+usb-vid=3f0
+wifi-config=0
+
+[psc_760]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=PSC_900_Series.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP PSC 760 All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=15 (C6615DN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=78 (C6578AN / C6578DN)
+r0-agent2-type=2
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=1
+support-released=True
+support-subtype=337c
+support-type=2
+support-ver=0.9.5
+tech-class=DJ9xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_designjet_t770ps_24in]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=1
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Designjet T770 24-in Postscript Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.10.9
+tech-class=Postscript
+tech-subclass=Normal
+tech-type=2
+usb-pid=d14
+usb-vid=3f0
+wifi-config=0
+
+[hp_designjet_t770_postscript]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=1
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Designjet T770 Postscript
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.9.12
+tech-class=Postscript
+tech-subclass=Normal
+tech-type=2
+usb-pid=d14
+usb-vid=3f0
+wifi-config=0
+
+[psc_780]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=PSC_900_Series.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP PSC 780 All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=15 (C6615DN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=78 (C6578AN / C6578DN)
+r0-agent2-type=2
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=1
+support-released=True
+support-subtype=0
+support-type=2
+support-ver=0.9.5
+tech-class=DJ9xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=1611
+usb-vid=3f0
+wifi-config=0
+
+[psc_780xi]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=PSC_900_Series.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP PSC 780xi All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=15 (C6615DN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=78 (C6578AN / C6578DN)
+r0-agent2-type=2
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=1
+support-released=True
+support-subtype=0
+support-type=2
+support-ver=0.9.5
+tech-class=DJ9xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=1711
+usb-vid=3f0
+wifi-config=0
+
+[hp_designjet_t790ps_24in]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=1
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Designjet T790ps 24in
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.11.5
+tech-class=Postscript
+tech-subclass=Normal
+tech-type=2
+usb-pid=f14
+usb-vid=3f0
+wifi-config=0
+
+[hp_designjet_t790ps_44in]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=1
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Designjet T790ps 24in
+model2=HP Designjet T790ps 44in
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=1
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.11.5
+tech-class=Postscript
+tech-subclass=Normal
+tech-type=2
+usb-pid=f14
+usb-vid=3f0
+wifi-config=0
+
+[hp_designjet_cc800ps]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=0
+io-mode=0
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP Designjet cc800ps Copier
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=37ff
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_designjet_800]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=0
+io-mode=0
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP Designjet 800 Printer (24 in)
+model2=HP Designjet 800 Printer (42 in)
+model3=HP Designjet 800ps Printer (24 in)
+model4=HP Designjet 800ps Printer (42 in)
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=3dd2
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_810c]
+align-type=2
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=DESKJET_840C.png
+io-mfp-mode=6
+io-mode=1
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 810c Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=15 (C6615DN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=23 (C1823D)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=1
+support-released=True
+support-subtype=357e
+support-type=2
+support-ver=0.9.5
+tech-class=DJ8xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=304
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_812c]
+align-type=2
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=DESKJET_840C.png
+io-mfp-mode=6
+io-mode=1
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 812c Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=15 (C6615DN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=23 (C1823D)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=1
+support-released=True
+support-subtype=3320
+support-type=2
+support-ver=0.9.5
+tech-class=DJ8xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_designjet_815]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=0
+io-mode=0
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP Designjet 815mfp
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=3b16
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_815c]
+align-type=2
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=DESKJET_840C.png
+io-mfp-mode=6
+io-mode=1
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 815c Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=15 (C6615DN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=23 (C1823D)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=1
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJ8xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=204
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_816c]
+align-type=2
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=DESKJET_840C.png
+io-mfp-mode=6
+io-mode=1
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 816 Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=15 (C6615DN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=23 (C1823D)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=1
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJ8xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=804
+usb-vid=3f0
+wifi-config=0
+
+[hp_designjet_820]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=0
+io-mode=0
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP Designjet 820 MFP
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=3e0e
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_deskjet_820c]
+align-type=0
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_printer.png
+io-mfp-mode=6
+io-mode=1
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 820cxi Printer
+model2=HP Deskjet 820c Printer
+model3=HP Deskjet 820cse Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=3026
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_a820_series]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=photosmart_a820_series.png
+io-mfp-mode=3
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart A826 Home Photo Center
+model2=HP Photosmart A827 Home Photo Center
+model3=HP Photosmart A828 Home Photo Center
+monitor-type=0
+panel-check-type=0
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=110
+r0-agent1-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.7.7
+tech-class=PSP470
+tech-subclass=FullBleed
+tech-type=2
+usb-pid=2902
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_825c]
+align-type=2
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=DESKJET_840C.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 825cvr Printer
+model2=HP Deskjet 825c Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=15 (C6615DN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=17 (C6625AN)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=1
+support-released=True
+support-subtype=357e
+support-type=2
+support-ver=0.9.5
+tech-class=DJ8x5
+tech-subclass=Normal
+tech-type=2
+usb-pid=704
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_830c]
+align-type=2
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=DESKJET_840C.png
+io-mfp-mode=6
+io-mode=1
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 830c Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=45 (51645A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=23 (C1823D)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=1
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJ8xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=404
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_832c]
+align-type=2
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=DESKJET_840C.png
+io-mfp-mode=6
+io-mode=1
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 832c Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=45 (51645A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=23 (C1823D)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=1
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJ8xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_840c]
+align-type=2
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=DESKJET_840C.png
+io-mfp-mode=6
+io-mode=1
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 840c Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=15 (C6615DN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=17 (C6625AN)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=1
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJ8xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=604
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_841c]
+align-type=2
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=DESKJET_840C.png
+io-mfp-mode=6
+io-mode=1
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 841c Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=15 (C6615DN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=17 (C6625AN)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=1
+support-released=True
+support-subtype=324a
+support-type=2
+support-ver=0.9.5
+tech-class=DJ8xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_842c]
+align-type=2
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=DESKJET_840C.png
+io-mfp-mode=6
+io-mode=1
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 842c Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=15 (C6615DN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=17 (C6625AN)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=1
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJ8xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_843c]
+align-type=2
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=DESKJET_840C.png
+io-mfp-mode=6
+io-mode=1
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 843c Printer
+model2=HP Deskjet 843cxe Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=15 (C6615DN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=17 (C6625AN)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=1
+support-released=True
+support-subtype=357e
+support-type=2
+support-ver=0.9.5
+tech-class=DJ8xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_845c]
+align-type=2
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=DESKJET_840C.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 845c Printer
+model2=HP Deskjet 845cvr Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=15 (C6615DN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=17 (C6625AN)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=1
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJ8x5
+tech-subclass=Normal
+tech-type=2
+usb-pid=904
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_850c]
+align-type=2
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=DESKJET_840C.png
+io-mfp-mode=6
+io-mode=1
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 850k Printer
+model2=HP Deskjet 850c Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=15 (C6615DN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=17 (C6625AN)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=1
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJ850
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[officejet_pro_k850]
+align-type=1
+clean-type=1
+color-cal-type=2
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=officejet_k550.png
+io-mfp-mode=6
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet Pro K850 Printer
+model2=HP Officejet Pro K850dn Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=1
+r0-agent1-sku=11 (C4810A)
+r0-agent1-type=1
+r0-agent2-kind=1
+r0-agent2-sku=11 (C4811A)
+r0-agent2-type=4
+r0-agent3-kind=2
+r0-agent3-sku=10 (C4844A)
+r0-agent3-type=1
+r0-agent4-kind=2
+r0-agent4-sku=11 (C4838AN)
+r0-agent4-type=6
+r0-agent5-kind=1
+r0-agent5-sku=11(C4812A)
+r0-agent5-type=5
+r0-agent6-kind=2
+r0-agent6-sku=11 (C4836N)
+r0-agent6-type=4
+r0-agent7-kind=1
+r0-agent7-sku=11 (C4813A)
+r0-agent7-type=6
+r0-agent8-kind=2
+r0-agent8-sku=11 (C4837AN)
+r0-agent8-type=5
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=3b0c
+support-type=2
+support-ver=0.9.6
+tech-class=OJProKx50
+tech-subclass=LargeFormatSuperB,NoFullBleed
+tech-type=2
+usb-pid=1512
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_855c]
+align-type=2
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=DESKJET_840C.png
+io-mfp-mode=6
+io-mode=1
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 855cxi Printer
+model2=HP Deskjet 855c Printer
+model3=HP Deskjet 855cse Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=15 (C6615DN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=17 (C6625AN)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=1
+support-released=True
+support-subtype=2dc7
+support-type=2
+support-ver=0.9.5
+tech-class=DJ850
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_870c]
+align-type=2
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=DESKJET_840C.png
+io-mfp-mode=6
+io-mode=1
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 870k Printer
+model2=HP Deskjet 870c Printer
+model3=HP Deskjet 870cse Printer
+model4=HP Deskjet 870cxi Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=15 (C6615DN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=17 (C6625AN)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=1
+support-released=True
+support-subtype=2de6
+support-type=2
+support-ver=0.9.5
+tech-class=DJ850
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_880c]
+align-type=2
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=DESKJET_840C.png
+io-mfp-mode=6
+io-mode=1
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 880c Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=45 (51645A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=23 (C1823D)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=1
+support-released=True
+support-subtype=357e
+support-type=2
+support-ver=0.9.5
+tech-class=DJ8xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=104
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_882c]
+align-type=2
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=DESKJET_840C.png
+io-mfp-mode=6
+io-mode=1
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 882c Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=45 (51645A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=23 (C1823D)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=1
+support-released=True
+support-subtype=3007
+support-type=2
+support-ver=0.9.5
+tech-class=DJ8xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_890c]
+align-type=2
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=DESKJET_840C.png
+io-mfp-mode=6
+io-mode=1
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 890cse Printer
+model2=HP Deskjet 890c Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=45 (51645A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=23 (C1823D)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=1
+support-released=True
+support-subtype=2de6
+support-type=2
+support-ver=0.9.5
+tech-class=DJ890
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_895c]
+align-type=2
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=DESKJET_840C.png
+io-mfp-mode=6
+io-mode=1
+io-support=3
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 895cse Printer
+model2=HP Deskjet 895c Printer
+model3=HP Deskjet 895cxi Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=45 (51645A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=23 (C1823D)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=1
+support-released=True
+support-subtype=357e
+support-type=2
+support-ver=0.9.5
+tech-class=DJ8xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=4
+usb-vid=3f0
+wifi-config=0
+
+[psc_900_series]
+align-type=9
+clean-type=3
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=PSC_900_Series.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP PSC 900 All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=15 (C6615DN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=78 (C6578AN / C6578DN)
+r0-agent2-type=2
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=1
+support-released=True
+support-subtype=0
+support-type=2
+support-ver=0.9.5
+tech-class=DJ9xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_910]
+align-type=5
+clean-type=2
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=Deskjet_3740.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP 910 Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=21/27/56/900
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=22/28/57/900
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=58
+r0-agent3-type=3
+r1-agent1-kind=3
+r1-agent1-sku=21/27/56/900
+r1-agent1-type=1
+r1-agent2-kind=3
+r1-agent2-sku=22/28/57/900
+r1-agent2-type=2
+r1-agent3-kind=3
+r1-agent3-sku=58
+r1-agent3-type=3
+r2-agent1-kind=3
+r2-agent1-sku=21/27/56/900
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=22/28/57/900
+r2-agent2-type=2
+r2-agent3-kind=3
+r2-agent3-sku=58
+r2-agent3-type=3
+r816-agent1-kind=3
+r816-agent1-sku=
+r816-agent1-type=1
+r816-agent2-kind=3
+r816-agent2-sku=
+r816-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.7.6
+tech-class=DJ3600
+tech-subclass=Normal
+tech-type=2
+usb-pid=2604
+usb-vid=3f0
+wifi-config=0
+
+[hp_915]
+align-type=5
+clean-type=2
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=psc_1100_series.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP 915 Inkjet All-in-One Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=21(C9153A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=22(C9352A)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=58 (C6658x)
+r0-agent3-type=3
+r1-agent1-kind=3
+r1-agent1-sku=21(C9351A)
+r1-agent1-type=1
+r1-agent2-kind=3
+r1-agent2-sku=22(C9352A)
+r1-agent2-type=2
+r1-agent3-kind=3
+r1-agent3-sku=58 (C6658x)
+r1-agent3-type=3
+r2-agent1-kind=3
+r2-agent1-sku=21 (C9351A)
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=22 (C9352A)
+r2-agent2-type=2
+r2-agent3-kind=3
+r2-agent3-sku=58 (C6658x)
+r2-agent3-type=3
+r3-agent1-kind=3
+r3-agent1-sku=21 (C9351A)
+r3-agent1-type=1
+r3-agent2-kind=3
+r3-agent2-sku=22 (C9352A)
+r3-agent2-type=2
+r3-agent3-kind=3
+r3-agent3-sku=58 (C6658x)
+r3-agent3-type=3
+r4-agent1-kind=3
+r4-agent1-sku=21 (C9351A)
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=22 (C9352A)
+r4-agent2-type=2
+r4-agent3-kind=3
+r4-agent3-sku=58 (C6658x)
+r4-agent3-type=3
+r5-agent1-kind=3
+r5-agent1-sku=21 (C9351A)
+r5-agent1-type=1
+r5-agent2-kind=3
+r5-agent2-sku=22 (C9352A)
+r5-agent2-type=2
+r5-agent3-kind=3
+r5-agent3-sku=58 (C6658x)
+r5-agent3-type=3
+r6-agent1-kind=3
+r6-agent1-sku=21 (C9351A)
+r6-agent1-type=1
+r6-agent2-kind=3
+r6-agent2-sku=22 (C9352A)
+r6-agent2-type=2
+r6-agent3-kind=3
+r6-agent3-sku=58 (C6658x)
+r6-agent3-type=3
+r7-agent1-kind=3
+r7-agent1-sku=816 (C8816A/B/G)
+r7-agent1-type=1
+r7-agent2-kind=3
+r7-agent2-sku=817 (C8817A/C8817G)
+r7-agent2-type=2
+r7-agent3-kind=3
+r7-agent3-sku=58 (C6658x)
+r7-agent3-type=3
+r816-agent1-kind=3
+r816-agent1-sku=
+r816-agent1-type=1
+r816-agent2-kind=3
+r816-agent2-sku=
+r816-agent2-type=2
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.7.6
+tech-class=DJ3600
+tech-subclass=Normal
+tech-type=2
+usb-pid=2704
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_916c]
+align-type=3
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=DESKJET_916C.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 916c Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=15 (C6615DN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=78 (C6578DN/C6578AN)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=1
+support-released=True
+support-subtype=357e
+support-type=2
+support-ver=0.9.5
+tech-class=DJ9xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=1804
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_920c]
+align-type=3
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=DESKJET_916C.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 920c Printer
+model2=HP Deskjet 920cvr Printer
+model3=HP Deskjet 920cw Printer
+model4=HP Deskjet 920cxi Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=15 (C6615DN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=78 (C6578DN/C6578AN)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=1
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJ9xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=1504
+usb-vid=3f0
+wifi-config=0
+
+[psc_920]
+align-type=9
+clean-type=3
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=PSC_900_Series.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP PSC 920 All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=15 (C6615DN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=78 (C6578AN / C6578DN)
+r0-agent2-type=2
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=1
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJ9xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=1f11
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_930c]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=DESKJET_960C.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 930c Printer
+model2=HP Deskjet 930cm Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=45 (51645A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=78 (C6578DN/C6578AN)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=1
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJ9xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=1204
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_932c]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=DESKJET_960C.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 932c Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=45 (51645A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=78 (C6578DN/C6578AN)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=1
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJ9xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=1204
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_933c]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=DESKJET_960C.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 933c Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=45 (51645A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=78 (C6578DN/C6578AN)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=1
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJ9xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=1204
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_934c]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=DESKJET_960C.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 934c Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=45 (51645A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=78 (C6578DN/C6578AN)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=1
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJ9xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=1204
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_935c]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=DESKJET_960C.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 935c Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=45 (51645A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=78 (C6578DN/C6578AN)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=1
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJ9xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=1204
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_940c]
+align-type=3
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=DESKJET_960C.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 940cvr Printer
+model2=HP Deskjet 940c Printer
+model3=HP Deskjet 940cw Printer
+model4=HP Deskjet 940cxi Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=15 (C6615DN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=78 (C6578DN/C6578AN)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=1
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJ9xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=1604
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_948c]
+align-type=3
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=DESKJET_960C.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 948c Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=15 (C6615DN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=78 (C6578DN/C6578AN)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=1
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJ9xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=1704
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_950c]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=DESKJET_960C.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 950c Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=45 (51645A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=78 (C6578DN/C6578AN)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJ9xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=1104
+usb-vid=3f0
+wifi-config=0
+
+[psc_950xi]
+align-type=9
+clean-type=3
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=PSC_900_Series.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP PSC 950xi All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=15 (C6615DN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=78 (C6578AN / C6578DN)
+r0-agent2-type=2
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=1
+support-released=True
+support-subtype=337c
+support-type=2
+support-ver=0.9.5
+tech-class=DJ9xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[psc_950vr]
+align-type=9
+clean-type=3
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=PSC_900_Series.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP PSC 950vr All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=15 (C6615DN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=78 (C6578AN / C6578DN)
+r0-agent2-type=2
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=1
+support-released=True
+support-subtype=337c
+support-type=2
+support-ver=0.9.5
+tech-class=DJ9xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[psc_950]
+align-type=9
+clean-type=3
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=PSC_900_Series.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP PSC 950 All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=15 (C6615DN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=78 (C6578AN / C6578DN)
+r0-agent2-type=2
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=1
+support-released=True
+support-subtype=324a
+support-type=2
+support-ver=0.9.5
+tech-class=DJ9xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=1e11
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_952c]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=DESKJET_960C.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 952c Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=45 (51645A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=78 (C6578DN/C6578AN)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=1
+support-released=True
+support-subtype=3320
+support-type=2
+support-ver=0.9.5
+tech-class=DJ9xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=1104
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_955c]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=DESKJET_960C.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 955c Printer
+model2=HP Deskjet 995ck Color Inkjet Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=45 (51645A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=78 (C6578DN/C6578AN)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=1
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJ9xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=1304
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_957c]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=DESKJET_960C.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 957c Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=45 (51645A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=78 (C6578DN/C6578AN)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=1
+support-released=True
+support-subtype=348d
+support-type=2
+support-ver=0.9.5
+tech-class=DJ9xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=1404
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_959c]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=DESKJET_960C.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 959c Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=45 (51645A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=78 (C6578DN/C6578AN)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=1
+support-released=True
+support-subtype=322b
+support-type=2
+support-ver=0.9.5
+tech-class=DJ9xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=1104
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_960c]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=DESKJET_960C.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 960cse Printer
+model2=HP Deskjet 960cxi Printer
+model3=HP Deskjet 960c Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=45 (51645A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=78 (C6578DN/C6578AN)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=3642
+support-type=2
+support-ver=0.9.5
+tech-class=DJ9xxVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=3104
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_970c]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=DESKJET_970C.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 970cxi Printer
+model2=HP Deskjet 970cse Printer
+model3=HP Deskjet 970c Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=45 (51645A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=78 (C6578DN/C6578AN)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=1
+support-released=True
+support-subtype=357e
+support-type=2
+support-ver=0.9.5
+tech-class=DJ9xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=1004
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_975c]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=DESKJET_970C.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 975c Printer
+model2=HP Deskjet 975cse Printer
+model3=HP Deskjet 975cxi Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=45 (51645A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=78 (C6578DN/C6578AN)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=1
+support-released=True
+support-subtype=0
+support-type=2
+support-ver=0.9.5
+tech-class=DJ9xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=1004
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_980c]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=DESKJET_970C.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 980cxi Printer
+model2=HP Deskjet 980c Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=45 (51645A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=78 (C6578DN/C6578AN)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=357e
+support-type=2
+support-ver=0.9.5
+tech-class=DJ9xxVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=3004
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_990c]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=DESKJET_990C.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 990cxi Printer
+model2=HP Deskjet 990cse Printer
+model3=HP Deskjet 990cm Printer
+model4=HP Deskjet 990c Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=45 (51645A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=78 (C6578DN/C6578AN)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJ9xxVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=3304
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_995c]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=DESKJET_995C.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 995c Printer
+model2=HP Deskjet 995ck Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=45 (51645A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=78 (C6578DN/C6578AN)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=3a3d
+support-type=2
+support-ver=0.9.5
+tech-class=DJ9xxVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=5004
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_p1000]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=PHOTOSMART_P1100.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart p1000/1000 Printer
+model2=HP Photosmart p1000xi Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=45 (51645A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=78 (C6578DN/C6578AN)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=3496
+support-type=2
+support-ver=0.9.5
+tech-class=DJ9xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_business_inkjet_1000]
+align-type=1
+clean-type=1
+color-cal-type=2
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=default_business_inkjet.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Business Inkjet 1000 Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=1
+r0-agent1-sku=11 (C4810A)
+r0-agent1-type=1
+r0-agent2-kind=1
+r0-agent2-sku=11 (C4811A)
+r0-agent2-type=4
+r0-agent3-kind=1
+r0-agent3-sku=11 (C4812A)
+r0-agent3-type=5
+r0-agent4-kind=1
+r0-agent4-sku=11 (C4813A)
+r0-agent4-type=6
+r0-agent5-kind=2
+r0-agent5-sku=10 (C4844A)
+r0-agent5-type=1
+r0-agent6-kind=2
+r0-agent6-sku=11 (C4836N)
+r0-agent6-type=4
+r0-agent7-kind=2
+r0-agent7-sku=11 (C4837AN)
+r0-agent7-type=5
+r0-agent8-kind=2
+r0-agent8-sku=11 (C4838AN)
+r0-agent8-type=6
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=39bb
+support-type=2
+support-ver=0.9.5
+tech-class=DJGenericVIP
+tech-subclass=NoFullBleed
+tech-type=2
+usb-pid=1712
+usb-vid=3f0
+wifi-config=0
+
+[psc_1000_series]
+align-type=4
+clean-type=2
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=psc_1100_series.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP PSC 1110 All-in-One Printer
+model2=HP PSC 1110v All-in-One Printer
+model3=HP PSC 1118 All-in-One Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=56 (C6656AN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=57 (C6657AN)/28 (C8728AN)
+r0-agent2-type=2
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJ3320
+tech-subclass=Normal
+tech-type=2
+usb-pid=2e11
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_1000]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=True
+icon=default_laserjet.png
+io-mfp-mode=1
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 1000 Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=1
+plugin-reason=1
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=8
+support-released=True
+support-subtype=3656
+support-type=2
+support-ver=2.7.12
+tech-class=LJZjsMono
+tech-subclass=Normal
+tech-type=3
+usb-pid=517
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_1000_j110_series]
+align-type=16
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=hp_deskjet_f4200.png
+io-mfp-mode=3
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 1000 J110 Series
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=61/61XL/61b
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=61/61XL
+r0-agent2-type=2
+r10-agent1-kind=3
+r10-agent1-sku=802/802XL/802b
+r10-agent1-type=1
+r10-agent2-kind=3
+r10-agent2-sku=802/802XL
+r10-agent2-type=2
+r18-agent2-kind=3
+r18-agent2-sku=93/95
+r18-agent2-type=2
+r18-agent3-kind=3
+r18-agent3-sku=99
+r18-agent3-type=3
+r2-agent1-kind=3
+r2-agent1-sku=61/61XL/61b
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=61/61XL
+r2-agent2-type=2
+r4-agent1-kind=3
+r4-agent1-sku=301/301XL/301b
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=301/301XL
+r4-agent2-type=2
+r8-agent1-kind=3
+r8-agent1-sku=122/122XL/122b
+r8-agent1-type=1
+r8-agent2-kind=3
+r8-agent2-sku=122/122XL
+r8-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.10.9
+tech-class=Pyramid
+tech-subclass=NoAutoDuplex,NoCDDVD
+tech-type=2
+usb-pid=8811
+usb-vid=3f0
+wifi-config=0
+
+[hp_deskjet_1000c]
+align-type=0
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_printer.png
+io-mfp-mode=6
+io-mode=1
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 1000cxi Printer
+model2=HP Deskjet 1000cse Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=3044
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[business_inkjet_1000]
+align-type=1
+clean-type=1
+color-cal-type=2
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=default_business_inkjet.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=Business Inkjet 1000 Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=1
+r0-agent1-sku=11 (C4810A)
+r0-agent1-type=1
+r0-agent2-kind=1
+r0-agent2-sku=11 (C4811A)
+r0-agent2-type=4
+r0-agent3-kind=1
+r0-agent3-sku=11 (C4812A)
+r0-agent3-type=5
+r0-agent4-kind=1
+r0-agent4-sku=11 (C4813A)
+r0-agent4-type=6
+r0-agent5-kind=2
+r0-agent5-sku=10 (C4844A)
+r0-agent5-type=1
+r0-agent6-kind=2
+r0-agent6-sku=11 (C4836N)
+r0-agent6-type=4
+r0-agent7-kind=2
+r0-agent7-sku=11 (C4837AN)
+r0-agent7-type=5
+r0-agent8-kind=2
+r0-agent8-sku=11 (C4838AN)
+r0-agent8-type=6
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=39bb
+support-type=2
+support-ver=0.9.5
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=1712
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_1005_series]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=True
+icon=default_laserjet.png
+io-mfp-mode=1
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 1005 Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=1
+plugin-reason=1
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=8
+support-released=True
+support-subtype=3656
+support-type=2
+support-ver=2.7.12
+tech-class=LJZjsMono
+tech-subclass=Normal
+tech-type=3
+usb-pid=1317
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_p1005]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=True
+icon=HP_LaserJet_1012.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet P1005 Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=1
+plugin-reason=1
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=35A
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=8
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.8.2
+tech-class=LJP1XXX
+tech-subclass=Normal
+tech-type=3
+usb-pid=4117
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_m1005]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=HP_LaserJet_m1005.png
+io-mfp-mode=4
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet M1005 Multifunction Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=1
+plugin-reason=65
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=Q2612A
+r0-agent1-type=1
+scan-src=1
+scan-type=4
+status-battery-check=0
+status-dynamic-counters=0
+status-type=8
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.8.9
+tech-class=LJm1005
+tech-subclass=Normal
+tech-type=3
+usb-pid=3217
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_p1006]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=True
+icon=HP_LaserJet_1012.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet P1006 Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=1
+plugin-reason=1
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=35A
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=8
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.8.2
+tech-class=LJP1XXX
+tech-subclass=Normal
+tech-type=3
+usb-pid=4117
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_p1007]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=True
+icon=HP_LaserJet_1012.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet P1007 Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=1
+plugin-reason=1
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=35A
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=8
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.8.6
+tech-class=LJP1XXX
+tech-subclass=Normal
+tech-type=3
+usb-pid=4117
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_p1008]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=True
+icon=HP_LaserJet_1012.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet P1008 Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=1
+plugin-reason=1
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=35A
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=8
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.8.6
+tech-class=LJP1XXX
+tech-subclass=Normal
+tech-type=3
+usb-pid=4117
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_p1009]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=True
+icon=HP_LaserJet_1012.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet P1009 Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=1
+plugin-reason=1
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=35A
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=8
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.9.4
+tech-class=LJP1XXX
+tech-subclass=Normal
+tech-type=3
+usb-pid=3e17
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_1010]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=HP_LaserJet_1012.png
+io-mfp-mode=3
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 1010 Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=Q2612A
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=3a32
+support-type=2
+support-ver=0.9.5
+tech-class=LJFastRaster
+tech-subclass=Normal
+tech-type=3
+usb-pid=c17
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_1012]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=HP_LaserJet_1012.png
+io-mfp-mode=3
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 1012 Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=Q2612A
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=3fc7
+support-type=2
+support-ver=0.9.5
+tech-class=LJFastRaster
+tech-subclass=Normal
+tech-type=3
+usb-pid=c17
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_1015]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=HP_LaserJet_1012.png
+io-mfp-mode=3
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 1015 Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=Q2612A
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=3a32
+support-type=2
+support-ver=0.9.5
+tech-class=LJMono
+tech-subclass=Normal
+tech-type=3
+usb-pid=c17
+usb-vid=3f0
+wifi-config=0
+
+[hp_color_laserjet_cm1015]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_color_laserjet_cm1015_mfp.png
+io-mfp-mode=1
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Color LaserJet CM1015 Multifunction Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=2
+plugin=1
+plugin-reason=64
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=Q6000A
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=Q6001A
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=Q6002A
+r0-agent3-type=6
+r0-agent4-kind=4
+r0-agent4-sku=Q6003A
+r0-agent4-type=5
+scan-src=1
+scan-type=3
+status-battery-check=0
+status-dynamic-counters=0
+status-type=6
+support-released=True
+support-subtype=3d04
+support-type=2
+support-ver=2.8.10
+tech-class=Postscript
+tech-subclass=Normal
+tech-type=4
+usb-pid=4217
+usb-vid=3f0
+wifi-config=0
+
+[hp_color_laserjet_cm1017]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_color_laserjet_cm1015_mfp.png
+io-mfp-mode=1
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Color LaserJet CM1017 Multifunction Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=2
+plugin=1
+plugin-reason=64
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=Q6000A
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=Q6001A
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=Q6002A
+r0-agent3-type=6
+r0-agent4-kind=4
+r0-agent4-sku=Q6003A
+r0-agent4-type=5
+scan-src=1
+scan-type=3
+status-battery-check=0
+status-dynamic-counters=0
+status-type=6
+support-released=True
+support-subtype=3d04
+support-type=2
+support-ver=2.8.10
+tech-class=Postscript
+tech-subclass=Normal
+tech-type=4
+usb-pid=4317
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_1018]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=True
+icon=HP_LaserJet_1012.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 1018 Printer
+model2=HP LaserJet 1018s Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=1
+plugin-reason=1
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=Q2612A
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=8
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.7.10
+tech-class=LJZjsMono
+tech-subclass=Normal
+tech-type=3
+usb-pid=4117
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_1020]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=True
+icon=HP_LaserJet_1012.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 1020 Printer
+model2=HP LaserJet 1020 Plus Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=1
+plugin-reason=1
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=Q2612A
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=8
+support-released=True
+support-subtype=40ac
+support-type=2
+support-ver=2.7.10
+tech-class=LJZjsMono
+tech-subclass=Normal
+tech-type=3
+usb-pid=2b17
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_1022nw]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=hp_LaserJet_1200.png
+io-mfp-mode=6
+io-mode=0
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 1022nw Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=2
+plugin-reason=2
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=Q2612A
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=3ccf
+support-type=2
+support-ver=2.7.10
+tech-class=LJMono,LJZjsMono
+tech-subclass=Normal
+tech-type=3
+usb-pid=3017
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_1022n]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=hp_LaserJet_1200.png
+io-mfp-mode=6
+io-mode=0
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 1022n Printer
+model2=HP LaserJet 1022nxi Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=2
+plugin-reason=2
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=Q2612A
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.7.10
+tech-class=LJMono,LJZjsMono
+tech-subclass=Normal
+tech-type=3
+usb-pid=2d17
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_1022]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=hp_LaserJet_1200.png
+io-mfp-mode=6
+io-mode=0
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 1022 Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=2
+plugin-reason=2
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=Q2612A
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=3ccf
+support-type=2
+support-ver=2.7.10
+tech-class=LJMono,LJZjsMono
+tech-subclass=Normal
+tech-type=3
+usb-pid=2c17
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_cp1025nw]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_color_laserjet_cp2025.png
+io-mfp-mode=3
+io-mode=1
+io-support=14
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet Pro CP1025nw Color Printer Series
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=1
+plugin-reason=1
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CE310A
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=CE311A
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=CE313A
+r0-agent3-type=5
+r0-agent4-kind=4
+r0-agent4-sku=CE312A
+r0-agent4-type=6
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=10
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.11.1
+tech-class=LJZjsColor
+tech-subclass=Advanced
+tech-type=4
+usb-pid=b2a
+usb-vid=3f0
+wifi-config=3
+
+[hp_laserjet_cp1025]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_color_laserjet_cp2025.png
+io-mfp-mode=3
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet Pro CP1025 Color Printer Series
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=1
+plugin-reason=1
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CE310A
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=CE311A
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=CE313A
+r0-agent3-type=5
+r0-agent4-kind=4
+r0-agent4-sku=CE312A
+r0-agent4-type=6
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=10
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.11.1
+tech-class=LJZjsColor
+tech-subclass=Advanced
+tech-type=4
+usb-pid=b2a
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_cp_1025nw]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_color_laserjet_cp2025.png
+io-mfp-mode=3
+io-mode=1
+io-support=14
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet Pro CP 1025nw Color Printer Series
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=1
+plugin-reason=1
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CE310A
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=CE311A
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=CE313A
+r0-agent3-type=5
+r0-agent4-kind=4
+r0-agent4-sku=CE312A
+r0-agent4-type=6
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=8
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.12.4
+tech-class=LJZjsColor
+tech-subclass=Advanced
+tech-type=4
+usb-pid=112a
+usb-vid=3f0
+wifi-config=3
+
+[hp_laserjet_cp_1025]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_color_laserjet_cp2025.png
+io-mfp-mode=3
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet Pro CP 1025 Color Printer Series
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=1
+plugin-reason=1
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CE310A
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=CE311A
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=CE313A
+r0-agent3-type=5
+r0-agent4-kind=4
+r0-agent4-sku=CE312A
+r0-agent4-type=6
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=10
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.12.4
+tech-class=LJZjsColor
+tech-subclass=Advanced
+tech-type=4
+usb-pid=112a
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_1050_j410_series]
+align-type=-1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=hp_deskjet_f4200.png
+io-mfp-mode=1
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 1050 J410 All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=61/61XL/61b
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=61/61XL
+r0-agent2-type=2
+r10-agent1-kind=3
+r10-agent1-sku=802/802XL/802b
+r10-agent1-type=1
+r10-agent2-kind=3
+r10-agent2-sku=802/802XL
+r10-agent2-type=2
+r18-agent2-kind=3
+r18-agent2-sku=93/95
+r18-agent2-type=2
+r18-agent3-kind=3
+r18-agent3-sku=99
+r18-agent3-type=3
+r2-agent1-kind=3
+r2-agent1-sku=61/61XL/61b
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=61/61XL
+r2-agent2-type=2
+r4-agent1-kind=3
+r4-agent1-sku=301/301XL/301b
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=301/301XL
+r4-agent2-type=2
+r8-agent1-kind=3
+r8-agent1-sku=122/122XL/122b
+r8-agent1-type=1
+r8-agent2-kind=3
+r8-agent2-sku=122/122XL
+r8-agent2-type=2
+scan-src=1
+scan-type=7
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.10.6
+tech-class=Pyramid
+tech-subclass=NoAutoDuplex,NoCDDVD
+tech-type=2
+usb-pid=8911
+usb-vid=3f0
+wifi-config=0
+
+[hp_designjet_1050c_plus]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=0
+io-mode=0
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP Designjet 1050c Printer
+model2=HP Designjet 1050c Plus Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=4014
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_designjet_1055cm_plus]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=0
+io-mode=0
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP Designjet 1055cm Printer
+model2=HP Designjet 1055cm Plus Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=4014
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_1100a]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=hp_LaserJet_1200.png
+io-mfp-mode=6
+io-mode=1
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 1100A All-in-One Printer
+model2=HP LaserJet 1100A se All-in-One Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=C4092A
+r0-agent1-type=1
+scan-src=2
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=348c
+support-type=2
+support-ver=0.9.5
+tech-class=LJMono
+tech-subclass=Normal
+tech-type=3
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_designjet_t1100ps_24in]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=1
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Designjet T1100 24-in Postscript Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.10.9
+tech-class=Postscript
+tech-subclass=Normal
+tech-type=2
+usb-pid=d14
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_p1100]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=PHOTOSMART_P1100.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart p1100 Printer
+model2=HP Photosmart p1100xi Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=45 (51645A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=78 (C6578DN/C6578AN)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=3496
+support-type=2
+support-ver=0.9.5
+tech-class=DJ9xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_designjet_t1100ps_44in]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=1
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Designjet T1100 44-in Postscript Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.10.9
+tech-class=Postscript
+tech-subclass=Normal
+tech-type=2
+usb-pid=d14
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_1100]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=DESKJET_1120C.png
+io-mfp-mode=6
+io-mode=0
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 1100c Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=15 (C6615DN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=23 (C1823D)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=3025
+support-type=2
+support-ver=0.9.5
+tech-class=DJ6xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=7c04
+usb-vid=3f0
+wifi-config=0
+
+[hp_business_inkjet_1100]
+align-type=1
+clean-type=1
+color-cal-type=2
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_business_inkjet_1100.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Business Inkjet 1100d Printer
+model2=HP Business Inkjet 1100dtn Printer
+model3=HP Business Inkjet 1100 Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=1
+r0-agent1-sku=11 (C4810A)
+r0-agent1-type=1
+r0-agent2-kind=1
+r0-agent2-sku=11 (C4811A)
+r0-agent2-type=4
+r0-agent3-kind=1
+r0-agent3-sku=11 (C4812A)
+r0-agent3-type=5
+r0-agent4-kind=1
+r0-agent4-sku=11 (C4813A)
+r0-agent4-type=6
+r0-agent5-kind=2
+r0-agent5-sku=10 (C4844A)
+r0-agent5-type=1
+r0-agent6-kind=2
+r0-agent6-sku=11 (C4836N)
+r0-agent6-type=4
+r0-agent7-kind=2
+r0-agent7-sku=11 (C4837AN)
+r0-agent7-type=5
+r0-agent8-kind=2
+r0-agent8-sku=11 (C4838AN)
+r0-agent8-type=6
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=3672
+support-type=2
+support-ver=0.9.5
+tech-class=DJGenericVIP
+tech-subclass=NoFullBleed
+tech-type=2
+usb-pid=912
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_1100]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=hp_LaserJet_1200.png
+io-mfp-mode=6
+io-mode=1
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 1100 Printer
+model2=HP LaserJet 1100se Printer
+model3=HP LaserJet 1100xi Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=C4092A
+r0-agent1-type=1
+scan-src=2
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=348c
+support-type=2
+support-ver=0.9.5
+tech-class=LJMono
+tech-subclass=Normal
+tech-type=3
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_1100xi]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=hp_LaserJet_1200.png
+io-mfp-mode=6
+io-mode=1
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 1100A xi All-in-One Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=C4092A
+r0-agent1-type=1
+scan-src=2
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=31d0
+support-type=2
+support-ver=0.9.5
+tech-class=LJMono
+tech-subclass=Normal
+tech-type=3
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_designjet_t1100ps]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=0
+io-mode=0
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP Designjet T1100 24-in Office Printer
+model2=HP Designjet T1100 44-in Office Printer
+model3=HP Designjet T1100ps 24-in Office Printer
+model4=HP Designjet T1100ps 44-in Office Printer
+model5=HP Designjet T1100 Multi-Function Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=219b2b
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[psc_1100_series]
+align-type=4
+clean-type=2
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=psc_1100_series.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP PSC 1110 All-in-One Printer
+model2=HP PSC 1110v All-in-One Printer
+model3=HP PSC 1118 All-in-One Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=56 (C6656AN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=57 (C6657AN)/28 (C8728AN)
+r0-agent2-type=2
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJ3320
+tech-subclass=Normal
+tech-type=2
+usb-pid=3011
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_professional_p1102w]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=HP_LaserJet_1012.png
+io-mfp-mode=6
+io-mode=1
+io-support=10
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet Professional P1102w Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=1
+plugin-reason=1
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=85A
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=8
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.10.4
+tech-class=LJZjsMono
+tech-subclass=NoAutoDuplex
+tech-type=3
+usb-pid=32a
+usb-vid=3f0
+wifi-config=3
+
+[hp_laserjet_professional_p1102]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=HP_LaserJet_1012.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Laserjet Professional P1102 Printer
+model2=HP Laserjet Professional P1102s Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=1
+plugin-reason=1
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=85A
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=8
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.10.4
+tech-class=LJZjsMono
+tech-subclass=NoAutoDuplex
+tech-type=3
+usb-pid=2a
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_professional_p_1102w]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=HP_LaserJet_1012.png
+io-mfp-mode=6
+io-mode=1
+io-support=10
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet Professional P 1102w Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=1
+plugin-reason=1
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=85A
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=8
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.10.4
+tech-class=LJZjsMono
+tech-subclass=NoAutoDuplex
+tech-type=3
+usb-pid=102a
+usb-vid=3f0
+wifi-config=3
+
+[hp_laserjet_professional_p1106]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=HP_LaserJet_1012.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Laserjet Professional P1106 Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=1
+plugin-reason=1
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=85A
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=8
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.12.2
+tech-class=LJZjsMono
+tech-subclass=NoAutoDuplex
+tech-type=3
+usb-pid=2a
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_professional_p1108]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=HP_LaserJet_1012.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Laserjet Professional P1108 Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=1
+plugin-reason=1
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=85A
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=8
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.12.2
+tech-class=LJZjsMono
+tech-subclass=NoAutoDuplex
+tech-type=3
+usb-pid=2a
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_1115]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=PHOTOSMART_P1100.png
+io-mfp-mode=6
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart 1115 Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=45 (51645A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=78 (C6578DN/C6578AN)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=36c1
+support-type=2
+support-ver=0.9.5
+tech-class=DJ9xxVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=3402
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_1120]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=DESKJET_1120C.png
+io-mfp-mode=6
+io-mode=0
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 1120cxi Printer
+model2=HP Deskjet 1120cse Printer
+model3=HP Deskjet 1120c Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=15 (C6615DN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=23 (C1823D)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=3301
+support-type=2
+support-ver=0.9.5
+tech-class=DJ9xx
+tech-subclass=LargeFormatSuperB,NoPhotoBestHiresModes
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_designjet_t1120ps_44in]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=1
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Designjet T1120 44-in Postscript Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.10.9
+tech-class=Postscript
+tech-subclass=Normal
+tech-type=2
+usb-pid=d14
+usb-vid=3f0
+wifi-config=0
+
+[hp_designjet_t1120ps_24in]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=1
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Designjet T1120 24-in Postscript Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.10.9
+tech-class=Postscript
+tech-subclass=Normal
+tech-type=2
+usb-pid=d14
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_m1120_mfp]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=HP_LaserJet_m1005.png
+io-mfp-mode=4
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet M1120 Multifunction Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=1
+plugin-reason=65
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=Q2612A
+r0-agent1-type=1
+scan-src=1
+scan-type=4
+status-battery-check=0
+status-dynamic-counters=0
+status-type=8
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.8.9
+tech-class=LJZjsMono
+tech-subclass=Normal
+tech-type=3
+usb-pid=5617
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_m1120n_mfp]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=HP_LaserJet_m1005.png
+io-mfp-mode=4
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet M1120n Multifunction Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=1
+plugin-reason=65
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=Q2612A
+r0-agent1-type=1
+scan-src=1
+scan-type=4
+status-battery-check=0
+status-dynamic-counters=0
+status-type=8
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.8.9
+tech-class=LJZjsMono
+tech-subclass=Normal
+tech-type=3
+usb-pid=5717
+usb-vid=3f0
+wifi-config=0
+
+[hp_designjet_t1120]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=0
+io-mode=0
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP Designjet T1120 24-in Printer
+model2=HP Designjet T1120 44-in Printer
+model3=HP Designjet T1120ps 24-in Printer
+model4=HP Designjet T1120ps 44-in Printer
+model5=HP Designjet T1120 HD Multifunction Printer
+model6=HP Designjet T1120 SD Multifunction Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=219b2b
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_1125]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=DESKJET_1120C.png
+io-mfp-mode=6
+io-mode=0
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 1125c Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=15 (C6615DN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=23 (C1823D)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=391a
+support-type=2
+support-ver=0.9.5
+tech-class=DJ9xx
+tech-subclass=LargeFormatSuperB,NoPhotoBestHiresModes
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_professional_m1132_mfp]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=HP_LaserJet_m1005.png
+io-mfp-mode=1
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet Professional M1132 Multifunction Printer
+model2=HP LaserJet Professional M1132s Multifunction Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=1
+plugin-reason=65
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=Q2612A
+r0-agent1-type=1
+scan-src=2
+scan-type=8
+status-battery-check=0
+status-dynamic-counters=0
+status-type=8
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.10.4
+tech-class=LJZjsMono
+tech-subclass=NoAutoDuplex
+tech-type=3
+usb-pid=42a
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_professional_m1136_mfp]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=HP_LaserJet_m1005.png
+io-mfp-mode=1
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Laserjet Professional M1136 Multifunction Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=1
+plugin-reason=65
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CE285A
+r0-agent1-type=1
+scan-src=2
+scan-type=8
+status-battery-check=0
+status-dynamic-counters=0
+status-type=8
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.10.6
+tech-class=LJZjsMono
+tech-subclass=NoAutoDuplex
+tech-type=3
+usb-pid=42a
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_1150]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=hp_LaserJet_1200.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 1150 Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=Q2624A
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=3a9d
+support-type=2
+support-ver=0.9.5
+tech-class=LJMono
+tech-subclass=Normal
+tech-type=3
+usb-pid=f17
+usb-vid=3f0
+wifi-config=0
+
+[officejet_pro_1150c]
+align-type=2
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=1
+fw-download=False
+icon=OFFICEJET_PRO_1150C.png
+io-mfp-mode=6
+io-mode=1
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet Pro 1150c All-in-One Printer
+model2=HP Officejet Pro 1150cse All-in-One Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=45 (51645A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=41 (51641A)
+r0-agent2-type=2
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=1
+support-released=True
+support-subtype=2f6e
+support-type=2
+support-ver=0.9.5
+tech-class=DJ850
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[cp1160]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=cp1160.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Color Inkjet cp1160 Printer
+model2=HP Color Inkjet cp1160tn Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=2
+r0-agent1-sku=14d (C5011DN)
+r0-agent1-type=1
+r0-agent2-kind=2
+r0-agent2-sku=14d (C5010DN)
+r0-agent2-type=2
+r0-agent3-kind=1
+r0-agent3-sku=14 (C4920A)
+r0-agent3-type=1
+r0-agent4-kind=1
+r0-agent4-sku=14 (C4921A)
+r0-agent4-type=4
+r0-agent5-kind=1
+r0-agent5-sku=14 (C4922A)
+r0-agent5-type=5
+r0-agent6-kind=1
+r0-agent6-sku=14 (C4923A)
+r0-agent6-type=6
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=3911
+support-type=2
+support-ver=0.9.5
+tech-class=DJ9xxVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=4004
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_1160]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=hp_LaserJet_1200.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 1160 Printer
+model2=HP LaserJet 1160Le Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=Q5949A
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=40ac
+support-type=2
+support-ver=0.9.5
+tech-class=LJMono
+tech-subclass=Normal
+tech-type=3
+usb-pid=1017
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_1160_series]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=hp_LaserJet_1200.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 1160 Series Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=Q5949A
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=40ac
+support-type=2
+support-ver=0.9.5
+tech-class=LJMono
+tech-subclass=Normal
+tech-type=3
+usb-pid=1e17
+usb-vid=3f0
+wifi-config=0
+
+[officejet_pro_1170c_series]
+align-type=2
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=1
+fw-download=False
+icon=OFFICEJET_PRO_1150C.png
+io-mfp-mode=6
+io-mode=1
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet Pro 1170c All-in-One Printer
+model2=HP Officejet Pro 1170cse All-in-One Printer
+model3=HP Officejet Pro 1170cxi All-in-One Printer
+model4=HP Officejet Pro 1175c All-in-One Printer
+model5=HP Officejet Pro 1175cse All-in-One Printer
+model6=HP Officejet Pro 1175cxi All-in-One Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=45 (51645A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=23 (C1823D or C1823T)
+r0-agent2-type=2
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=1
+support-released=True
+support-subtype=324a
+support-type=2
+support-ver=0.9.5
+tech-class=DJ890
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_1200]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_LaserJet_1200.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 1200 Printer
+model2=HP LaserJet 1200se Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=C7115X
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=9
+support-released=True
+support-subtype=3fba
+support-type=2
+support-ver=0.9.5
+tech-class=LJMono,Postscript
+tech-subclass=Normal
+tech-type=3
+usb-pid=317
+usb-vid=3f0
+wifi-config=0
+
+[business_inkjet_1200]
+align-type=1
+clean-type=1
+color-cal-type=2
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=HP_Business_Inkjet_1200.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Business Inkjet 1200dtn Printer
+model2=HP Business Inkjet 1200dn Printer
+model3=HP Business Inkjet 1200dtwn Printer
+model4=HP Business Inkjet 1200d Printer
+model5=HP Business Inkjet 1200 Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=1
+r0-agent1-sku=11 (C4810A)
+r0-agent1-type=1
+r0-agent2-kind=1
+r0-agent2-sku=11 (C4811A)
+r0-agent2-type=4
+r0-agent3-kind=1
+r0-agent3-sku=11 (C4812A)
+r0-agent3-type=5
+r0-agent4-kind=1
+r0-agent4-sku=11 (C4813A)
+r0-agent4-type=6
+r0-agent5-kind=2
+r0-agent5-sku=10 (C4844A)
+r0-agent5-type=1
+r0-agent6-kind=2
+r0-agent6-sku=11 (C4836AN)
+r0-agent6-type=4
+r0-agent7-kind=2
+r0-agent7-sku=11 (C4837AN)
+r0-agent7-type=5
+r0-agent8-kind=2
+r0-agent8-sku=11 (C4838AN)
+r0-agent8-type=6
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=3b04
+support-type=2
+support-ver=0.9.5
+tech-class=DJGenericVIP
+tech-subclass=NoFullBleed
+tech-type=2
+usb-pid=f12
+usb-vid=3f0
+wifi-config=0
+
+[hp_designjet_t1200_postscript]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=1
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Designjet T1200 Postscript
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=1
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.9.12
+tech-class=Postscript
+tech-subclass=Normal
+tech-type=2
+usb-pid=d14
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_1200n]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_LaserJet_1200.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 1200n Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=C7115X
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=9
+support-released=True
+support-subtype=357e
+support-type=2
+support-ver=0.9.5
+tech-class=LJMono
+tech-subclass=Normal
+tech-type=3
+usb-pid=317
+usb-vid=3f0
+wifi-config=0
+
+[psc_1200_series]
+align-type=6
+clean-type=2
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=psc_1100_series.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP PSC 1200 All-in-One Printer
+model10=HP PSC 1217 All-in-One Printer
+model11=HP PSC 1218 All-in-One Printer
+model12=HP PSC 1219 All-in-One Printer
+model2=HP PSC 1205 All-in-One Printer
+model3=HP PSC 1209 All-in-One Printer
+model4=HP PSC 1210 All-in-One Printer
+model5=HP PSC 1210xi All-in-One Printer
+model6=HP PSC 1210v All-in-One Printer
+model7=HP PSC 1213 All-in-One Printer
+model8=HP PSC 1215 All-in-One Printer
+model9=HP PSC 1216 All-in-One Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=56 (C6656AN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=57 (C6657AN)/28 (C8728AN)
+r0-agent2-type=2
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJ3320
+tech-subclass=Normal
+tech-type=2
+usb-pid=2f11
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_1200c]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=DESKJET_1120C.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 1200c/PS Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=2
+r0-agent1-sku=40
+r0-agent1-type=1
+r0-agent2-kind=2
+r0-agent2-sku=40
+r0-agent2-type=4
+r0-agent3-kind=2
+r0-agent3-sku=40
+r0-agent3-type=5
+r0-agent4-kind=2
+r0-agent4-sku=40
+r0-agent4-type=6
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=2d2e
+support-type=2
+support-ver=0.9.5
+tech-class=LJColor
+tech-subclass=300dpiOnly,LargeFormatA3
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_professional_m1212nf_mfp]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=5
+fw-download=False
+icon=hp_laserjet_3050.png
+io-mfp-mode=1
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet Professional M1212nf Multifunction Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=1
+plugin-reason=65
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CE285A
+r0-agent1-type=1
+scan-src=3
+scan-type=8
+status-battery-check=0
+status-dynamic-counters=0
+status-type=8
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.10.4
+tech-class=LJZjsMono
+tech-subclass=NoAutoDuplex
+tech-type=3
+usb-pid=52a
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_professional_m1213nf_mfp]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=5
+fw-download=False
+icon=hp_laserjet_3050.png
+io-mfp-mode=1
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet Professional M1213nf Multifunction Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=1
+plugin-reason=65
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CE285A
+r0-agent1-type=1
+scan-src=3
+scan-type=8
+status-battery-check=0
+status-dynamic-counters=0
+status-type=8
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.11.1
+tech-class=LJZjsMono
+tech-subclass=NoAutoDuplex
+tech-type=3
+usb-pid=52a
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_professional_m1214nfh_mfp]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=5
+fw-download=False
+icon=hp_laserjet_3050.png
+io-mfp-mode=1
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet Professional M1214nfh Multifunction Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=1
+plugin-reason=65
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CE285A
+r0-agent1-type=1
+scan-src=3
+scan-type=8
+status-battery-check=0
+status-dynamic-counters=0
+status-type=8
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.11.5
+tech-class=LJZjsMono
+tech-subclass=NoAutoDuplex
+tech-type=3
+usb-pid=52a
+usb-vid=3f0
+wifi-config=0
+
+[hp_color_laserjet_cp1215]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_color_laserjet_cp2025.png
+io-mfp-mode=3
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Color LaserJet CP1215 Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=1
+plugin-reason=1
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CB540A
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=CB541A
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=CB543A
+r0-agent3-type=5
+r0-agent4-kind=4
+r0-agent4-sku=CB542A
+r0-agent4-type=6
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=8
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.9.2
+tech-class=LJZjsColor
+tech-subclass=Normal
+tech-type=4
+usb-pid=4717
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_1215]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=PHOTOSMART_P1100.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart 1215 Printer
+model2=HP Photosmart 1215vm Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=45 (51645A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=78 (C6578DN/C6578AN)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=3496
+support-type=2
+support-ver=0.9.5
+tech-class=DJ9xxVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=3202
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_professional_m1216nfh_mfp]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=5
+fw-download=False
+icon=hp_laserjet_3050.png
+io-mfp-mode=1
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet Professional M1216nfh MFP
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=1
+plugin-reason=65
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CE285A
+r0-agent1-type=1
+scan-src=3
+scan-type=8
+status-battery-check=0
+status-dynamic-counters=0
+status-type=8
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.11.7
+tech-class=LJZjsMono
+tech-subclass=NoAutoDuplex
+tech-type=3
+usb-pid=52a
+usb-vid=3f0
+wifi-config=0
+
+[hp_color_laserjet_cp1217]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_color_laserjet_cp2025.png
+io-mfp-mode=3
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Color LaserJet CP1217 Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=1
+plugin-reason=1
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CB540A
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=CB541A
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=CB543A
+r0-agent3-type=5
+r0-agent4-kind=4
+r0-agent4-sku=CB542A
+r0-agent4-type=6
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=8
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.12.2
+tech-class=LJZjsColor
+tech-subclass=Normal
+tech-type=4
+usb-pid=4717
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_professional_m1217nfw_mfp]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=5
+fw-download=False
+icon=hp_laserjet_3050.png
+io-mfp-mode=1
+io-mode=1
+io-support=14
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet Professional M1217nfW Multifunction Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=1
+plugin-reason=65
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=Q2612A
+r0-agent1-type=1
+scan-src=3
+scan-type=8
+status-battery-check=0
+status-dynamic-counters=0
+status-type=8
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.10.9
+tech-class=LJZjsMono
+tech-subclass=NoAutoDuplex
+tech-type=3
+usb-pid=e2a
+usb-vid=3f0
+wifi-config=-1
+
+[photosmart_1218]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=PHOTOSMART_1218.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart 1218 Printer
+model2=HP Photosmart 1218xi Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=45 (51645A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=78 (C6578DN/C6578AN)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=3496
+support-type=2
+support-ver=0.9.5
+tech-class=DJ9xxVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=3302
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_professional_m1219nf_mfp]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=5
+fw-download=False
+icon=hp_laserjet_3050.png
+io-mfp-mode=1
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet Professional M1219nf MFP
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=1
+plugin-reason=65
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CE285A
+r0-agent1-type=1
+scan-src=3
+scan-type=8
+status-battery-check=0
+status-dynamic-counters=0
+status-type=8
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.11.7
+tech-class=LJZjsMono
+tech-subclass=NoAutoDuplex
+tech-type=3
+usb-pid=52a
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_1220se]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=1
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=HP_LaserJet_1220.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 1220se All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=C7115A/C7115X
+r0-agent1-type=1
+scan-src=2
+scan-type=2
+status-battery-check=0
+status-dynamic-counters=0
+status-type=9
+support-released=True
+support-subtype=357e
+support-type=2
+support-ver=0.9.5
+tech-class=LJMono
+tech-subclass=Normal
+tech-type=3
+usb-pid=417
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_1220]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=1
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=HP_LaserJet_1220.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 1220 All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=C7115A/C7115X
+r0-agent1-type=1
+scan-src=2
+scan-type=2
+status-battery-check=0
+status-dynamic-counters=0
+status-type=9
+support-released=True
+support-subtype=357e
+support-type=2
+support-ver=0.9.5
+tech-class=LJMono,Postscript
+tech-subclass=Normal
+tech-type=3
+usb-pid=417
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_1220c]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=DESKJET_1220C.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 1220c Printer
+model2=HP Deskjet 1220cse Printer
+model3=HP Deskjet 1220cxi Printer
+model4=HP Deskjet 1220c/PS Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=45 (51645A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=78 (C6578AN)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=1
+support-released=True
+support-subtype=3636
+support-type=2
+support-ver=0.9.5
+tech-class=DJ9xx
+tech-subclass=LargeFormatSuperB
+tech-type=2
+usb-pid=212
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_1280]
+align-type=1
+clean-type=1
+color-cal-type=3
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=deskjet_1280.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 1280 Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=(51645G)/ (51645A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=(C6578D)/ (C6578A)
+r0-agent2-type=2
+r1-agent1-kind=3
+r1-agent1-sku=94 (C8765WN)/96 (C8767WN)
+r1-agent1-type=1
+r1-agent2-kind=3
+r1-agent2-sku=95 (C8766WN)/97 (C9363WN)
+r1-agent2-type=2
+r1-agent3-kind=3
+r1-agent3-sku=99 (C9369WN)
+r1-agent3-type=3
+r1-agent4-kind=3
+r1-agent4-sku=100 (C9368AN)
+r1-agent4-type=10
+r2-agent1-kind=3
+r2-agent1-sku=94 (C8765WN)/96 (C8767WN)
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=95 (C8766WN)/97 (C9363WN)
+r2-agent2-type=2
+r2-agent3-kind=3
+r2-agent3-sku=99 (C9369WN)
+r2-agent3-type=3
+r2-agent4-kind=3
+r2-agent4-sku=100 (C9368AN)
+r2-agent4-type=10
+r3-agent1-kind=3
+r3-agent1-sku=94 (C8765WN)/96 (C8767WN)
+r3-agent1-type=1
+r3-agent2-kind=3
+r3-agent2-sku=95 (C8766WN)/97 (C9363WN)
+r3-agent2-type=2
+r3-agent3-kind=3
+r3-agent3-sku=99 (C9369WN)
+r3-agent3-type=3
+r3-agent4-kind=3
+r3-agent4-sku=100 (C9368AN)
+r3-agent4-type=10
+r4-agent1-kind=3
+r4-agent1-sku=339/338
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=344/343
+r4-agent2-type=2
+r4-agent3-kind=3
+r4-agent3-sku=348
+r4-agent3-type=3
+r4-agent4-kind=3
+r4-agent4-sku=100 (C9368AN)
+r4-agent4-type=10
+r5-agent1-kind=3
+r5-agent1-sku=130/131
+r5-agent1-type=1
+r5-agent2-kind=3
+r5-agent2-sku=134/135
+r5-agent2-type=2
+r5-agent3-kind=3
+r5-agent3-sku=138
+r5-agent3-type=3
+r5-agent4-kind=3
+r5-agent4-sku=100 (C9368AN)
+r5-agent4-type=10
+r6-agent1-kind=3
+r6-agent1-sku=130/131
+r6-agent1-type=1
+r6-agent2-kind=3
+r6-agent2-sku=134/135
+r6-agent2-type=2
+r6-agent3-kind=3
+r6-agent3-sku=138
+r6-agent3-type=3
+r6-agent4-kind=3
+r6-agent4-sku=100 (C9368AN)
+r6-agent4-type=10
+r7-agent1-kind=3
+r7-agent1-sku=853/852
+r7-agent1-type=1
+r7-agent2-kind=3
+r7-agent2-sku=857/855
+r7-agent2-type=2
+r7-agent3-kind=3
+r7-agent3-sku=858
+r7-agent3-type=3
+r7-agent4-kind=3
+r7-agent4-sku=100 (C9368AN)
+r7-agent4-type=10
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=3bec
+support-type=2
+support-ver=0.9.5
+tech-class=DJ9xx
+tech-subclass=LargeFormatSuperB
+tech-type=2
+usb-pid=1412
+usb-vid=3f0
+wifi-config=0
+
+[hp_designjet_t1300_postscript]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=1
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Designjet T1300 Postscript
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=1
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.11.5
+tech-class=Postscript
+tech-subclass=Normal
+tech-type=2
+usb-pid=f14
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_1300]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=hp_LaserJet_1200.png
+io-mfp-mode=6
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 1300 Printer
+model2=HP LaserJet 1300t Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=Q2613A/Q2613X
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=9
+support-released=True
+support-subtype=3786
+support-type=2
+support-ver=0.9.5
+tech-class=LJMono,Postscript
+tech-subclass=Normal
+tech-type=3
+usb-pid=1017
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_d1300_series]
+align-type=5
+clean-type=2
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=deskjet_3600.png
+io-mfp-mode=3
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet D1311 Printer
+model2=HP Deskjet D1320 Printer
+model3=HP Deskjet D1330 Printer
+model4=HP Deskjet D1341 Printer
+model5=HP Deskjet D1360 Printer
+model6=HP Deskjet D1368 Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=21
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=22
+r0-agent2-type=2
+r10-agent1-kind=3
+r10-agent1-sku=816
+r10-agent1-type=1
+r10-agent2-kind=3
+r10-agent2-sku=817
+r10-agent2-type=2
+r2-agent1-kind=3
+r2-agent1-sku=21
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=22
+r2-agent2-type=2
+r4-agent1-kind=3
+r4-agent1-sku=21
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=22
+r4-agent2-type=2
+r8-agent1-kind=3
+r8-agent1-sku=21
+r8-agent1-type=1
+r8-agent2-kind=3
+r8-agent2-sku=22
+r8-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=1.6.6
+tech-class=DJ3320
+tech-subclass=Normal
+tech-type=2
+usb-pid=7804
+usb-vid=3f0
+wifi-config=0
+
+[psc_1300_series]
+align-type=6
+clean-type=2
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=psc_1100_series.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP PSC 1300 All-in-One Printer
+model2=HP PSC 1340 All-in-One Printer
+model3=HP PSC 1345 All-in-One Printer
+model4=HP PSC 1350 All-in-One Printer
+model5=HP PSC 1350xi All-in-One Printer
+model6=HP PSC 1350v All-in-One Printer
+model7=HP PSC 1355 All-in-One Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=27 (C8727AN)/56 (C6656AN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=28 (C8728AN)/57 (C6657AN)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=58 (C6658AN)
+r0-agent3-type=3
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJ3600
+tech-subclass=Normal
+tech-type=2
+usb-pid=3b11
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_1300n]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=hp_LaserJet_1200.png
+io-mfp-mode=6
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 1300n Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=Q2613A/Q2613X
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=9
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=LJMono,Postscript
+tech-subclass=Normal
+tech-type=3
+usb-pid=1117
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_1300xi]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=hp_LaserJet_1200.png
+io-mfp-mode=6
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 1300xi Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=Q2613A/Q2613X
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=9
+support-released=True
+support-subtype=36af
+support-type=2
+support-ver=0.9.5
+tech-class=LJMono,Postscript
+tech-subclass=Normal
+tech-type=3
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[psc_1310_series]
+align-type=6
+clean-type=2
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=psc_1100_series.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP PSC 1310 All-in-One Printer
+model2=HP PSC 1311 All-in-One Printer
+model3=HP PSC 1312 All-in-One Printer
+model4=HP PSC 1315 All-in-One Printer
+model5=HP PSC 1315xi All-in-One Printer
+model6=HP PSC 1315v All-in-One Printer
+model7=HP PSC 1315s All-in-One Printer
+model8=HP PSC 1317 All-in-One Printer
+model9=HP PSC 1318 All-in-One Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=27 (C8727AN)/56 (C6656AN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=28 (C8728AN)/57 (C6657AN)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=58 (C6658AN)
+r0-agent3-type=3
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJ3600
+tech-subclass=Normal
+tech-type=2
+usb-pid=3f11
+usb-vid=3f0
+wifi-config=0
+
+[hp_color_laserjet_cm1312nfi_mfp]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=4
+fw-download=False
+icon=hp_color_laserjet_cm1312_mfp.png
+io-mfp-mode=1
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Color LaserJet CM1312nfi Multifunction Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=2
+plugin=1
+plugin-reason=64
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CB540A
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=CB541A
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=CB542A
+r0-agent3-type=6
+r0-agent4-kind=4
+r0-agent4-sku=CB543A
+r0-agent4-type=5
+scan-src=1
+scan-type=5
+status-battery-check=0
+status-dynamic-counters=0
+status-type=6
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.8.10
+tech-class=LJColor,Postscript
+tech-subclass=Normal
+tech-type=4
+usb-pid=4f17
+usb-vid=3f0
+wifi-config=0
+
+[hp_color_laserjet_cm1312_mfp]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=hp_color_laserjet_cm1312_mfp.png
+io-mfp-mode=1
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Color LaserJet CM1312 Multifunction Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=1
+plugin-reason=64
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CB540A
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=CB541A
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=CB542A
+r0-agent3-type=6
+r0-agent4-kind=4
+r0-agent4-sku=CB543A
+r0-agent4-type=5
+scan-src=1
+scan-type=5
+status-battery-check=0
+status-dynamic-counters=0
+status-type=6
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.8.10
+tech-class=LJColor,Postscript
+tech-subclass=Normal
+tech-type=4
+usb-pid=4e17
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_1315]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=PHOTOSMART_1315.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart 1315 Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=45 (51645A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=78 (C6578DN/C6578AN)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=36c1
+support-type=2
+support-ver=0.9.5
+tech-class=DJ9xxVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=3602
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_m1319f_mfp]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=5
+fw-download=False
+icon=hp_laserjet_3050.png
+io-mfp-mode=4
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet M1319f Multifunction Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=1
+plugin-reason=65
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=Q2612A
+r0-agent1-type=1
+scan-src=1
+scan-type=4
+status-battery-check=0
+status-dynamic-counters=0
+status-type=8
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.8.9
+tech-class=LJZjsMono
+tech-subclass=Normal
+tech-type=3
+usb-pid=5817
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_1320_series]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_LaserJet_1200.png
+io-mfp-mode=6
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 1320 Series Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=Q5949A/Q5949X
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=3a04
+support-type=2
+support-ver=0.9.5
+tech-class=LJMono,Postscript
+tech-subclass=Normal
+tech-type=3
+usb-pid=1d17
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_1320n]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_LaserJet_1200.png
+io-mfp-mode=6
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 1320n Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=Q5949A/Q5949X
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=LJMono
+tech-subclass=Normal
+tech-type=3
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_1320tn]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_LaserJet_1200.png
+io-mfp-mode=6
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 1320tn Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=Q5949A/Q5949X
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=3a04
+support-type=2
+support-ver=0.9.5
+tech-class=LJMono
+tech-subclass=Normal
+tech-type=3
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_1320]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_LaserJet_1200.png
+io-mfp-mode=6
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 1320 Printer
+model2=HP LaserJet 1320t Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=Q5949A/Q5949X
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=3a04
+support-type=2
+support-ver=0.9.5
+tech-class=LJMono
+tech-subclass=Normal
+tech-type=3
+usb-pid=1d17
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_1320nw]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_LaserJet_1200.png
+io-mfp-mode=6
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 1320nw Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=Q5949A/Q5949X
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=3879
+support-type=2
+support-ver=0.9.5
+tech-class=LJMono
+tech-subclass=Normal
+tech-type=3
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[psc_1358_series]
+align-type=6
+clean-type=2
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=psc_1100_series.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP PSC 1300 All-in-One Printer
+model2=HP PSC 1340 All-in-One Printer
+model3=HP PSC 1350v All-in-One Printer
+model4=HP PSC 1350xi All-in-One Printer
+model5=HP PSC 1350 All-in-One Printer
+model6=HP PSC 1355 All-in-One Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=27 (C8727AN)/56 (C6656AN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=28 (C8728AN)/57 (C6657AN)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=58 (C6658AN)
+r0-agent3-type=3
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJ3600
+tech-subclass=Normal
+tech-type=2
+usb-pid=3c11
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_d1400_series]
+align-type=5
+clean-type=2
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=Deskjet_3740.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet D1415 Printer
+model2=HP Deskjet D1420 Printer
+model3=HP Deskjet D1430 Printer
+model4=HP Deskjet D1445 Printer
+model5=HP Deskjet D1455 Printer
+model6=HP Deskjet D1460 Printer
+model7=HP Deskjet D1468 Printer
+model8=HP Deskjet D1470 Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=21(C9153A/G)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=22(C9352A/G)
+r0-agent2-type=2
+r1-agent1-kind=3
+r1-agent1-sku=21(C9351A/G)
+r1-agent1-type=1
+r1-agent2-kind=3
+r1-agent2-sku=22(C9352A/G)
+r1-agent2-type=2
+r10-agent1-kind=3
+r10-agent1-sku=816 (C8816A/B/G)
+r10-agent1-type=1
+r10-agent2-kind=3
+r10-agent2-sku=817 (C8817A/G)
+r10-agent2-type=2
+r2-agent1-kind=3
+r2-agent1-sku=21 (C9351A/G)
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=22 (C9352A/G)
+r2-agent2-type=2
+r3-agent1-kind=3
+r3-agent1-sku=21 (C9351A/G)
+r3-agent1-type=1
+r3-agent2-kind=3
+r3-agent2-sku=22 (C9352A/G)
+r3-agent2-type=2
+r4-agent1-kind=3
+r4-agent1-sku=21 (C9351A/G)
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=22 (C9352A/G)
+r4-agent2-type=2
+r5-agent1-kind=3
+r5-agent1-sku=21 (C9351A/G)
+r5-agent1-type=1
+r5-agent2-kind=3
+r5-agent2-sku=22 (C9352A/G)
+r5-agent2-type=2
+r6-agent1-kind=3
+r6-agent1-sku=21 (C9351A/G)
+r6-agent1-type=1
+r6-agent2-kind=3
+r6-agent2-sku=22 (C9352A/G)
+r6-agent2-type=2
+r7-agent1-kind=3
+r7-agent1-sku=816 (C8816A/B/G)
+r7-agent1-type=1
+r7-agent2-kind=3
+r7-agent2-sku=817 (C8817A/G)
+r7-agent2-type=2
+r8-agent1-kind=3
+r8-agent1-sku=21 (C9351A/G)
+r8-agent1-type=1
+r8-agent2-kind=3
+r8-agent2-sku=22 (C9352A/G)
+r8-agent2-type=2
+r816-agent1-kind=3
+r816-agent1-sku=
+r816-agent1-type=1
+r816-agent2-kind=3
+r816-agent2-sku=
+r816-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=1.7.4
+tech-class=DJ3320
+tech-subclass=Normal
+tech-type=2
+usb-pid=7904
+usb-vid=3f0
+wifi-config=0
+
+[psc_1400_series]
+align-type=6
+clean-type=2
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=psc_1100_series.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP PSC 1401 All-in-One Printer
+model10=HP PSC 1417 All-in-One Printer
+model2=HP PSC 1402 All-in-One Printer
+model3=HP PSC 1403 All-in-One Printer
+model4=HP PSC 1406 All-in-One Printer
+model5=HP PSC 1408 All-in-One Printer
+model6=HP PSC 1410 All-in-One Printer
+model7=HP PSC 1410v All-in-One Printer
+model8=HP PSC 1410xi All-in-One Printer
+model9=HP PSC 1415 All-in-One Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=21 (C9351A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=22 (C9352A)
+r0-agent2-type=2
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJ3600
+tech-subclass=Normal
+tech-type=2
+usb-pid=4d11
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_cm1411fn]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=7
+fw-download=False
+icon=hp_color_laserjet_cm1312_mfp.png
+io-mfp-mode=1
+io-mode=1
+io-support=14
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet Professional CM1411fn
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=1
+plugin-reason=64
+power-settings=0
+ppd-name=laserjet_cm1410_series
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CE320A
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=CE321A
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=CE322A
+r0-agent3-type=6
+r0-agent4-kind=4
+r0-agent4-sku=CE323A
+r0-agent4-type=5
+scan-src=1
+scan-type=5
+status-battery-check=0
+status-dynamic-counters=0
+status-type=10
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.11.1
+tech-class=LJColor,Postscript
+tech-subclass=Normal
+tech-type=4
+usb-pid=72a
+usb-vid=3f0
+wifi-config=3
+
+[hp_laserjet_cm1412fn]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=7
+fw-download=False
+icon=hp_color_laserjet_cm1312_mfp.png
+io-mfp-mode=1
+io-mode=1
+io-support=14
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet Professional CM1412fn
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=1
+plugin-reason=64
+power-settings=0
+ppd-name=laserjet_cm1410_series
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CE320A
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=CE321A
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=CE322A
+r0-agent3-type=6
+r0-agent4-kind=4
+r0-agent4-sku=CE323A
+r0-agent4-type=5
+scan-src=1
+scan-type=5
+status-battery-check=0
+status-dynamic-counters=0
+status-type=10
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.11.1
+tech-class=LJColor,Postscript
+tech-subclass=Normal
+tech-type=4
+usb-pid=72a
+usb-vid=3f0
+wifi-config=3
+
+[hp_laserjet_cm1413fn]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=7
+fw-download=False
+icon=hp_color_laserjet_cm1312_mfp.png
+io-mfp-mode=1
+io-mode=1
+io-support=14
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet Professional CM1413fn
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=1
+plugin-reason=64
+power-settings=0
+ppd-name=laserjet_cm1410_series
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CE320A
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=CE321A
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=CE322A
+r0-agent3-type=6
+r0-agent4-kind=4
+r0-agent4-sku=CE323A
+r0-agent4-type=5
+scan-src=1
+scan-type=5
+status-battery-check=0
+status-dynamic-counters=0
+status-type=10
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.11.1
+tech-class=LJColor,Postscript
+tech-subclass=Normal
+tech-type=4
+usb-pid=72a
+usb-vid=3f0
+wifi-config=3
+
+[hp_laserjet_cm1415fnw]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=7
+fw-download=False
+icon=hp_color_laserjet_cm1312_mfp.png
+io-mfp-mode=1
+io-mode=1
+io-support=14
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet Professional CM1415fnw
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=1
+plugin-reason=64
+power-settings=0
+ppd-name=laserjet_cm1410_series
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CE320A
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=CE321A
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=CE322A
+r0-agent3-type=6
+r0-agent4-kind=4
+r0-agent4-sku=CE323A
+r0-agent4-type=5
+scan-src=1
+scan-type=5
+status-battery-check=0
+status-dynamic-counters=0
+status-type=10
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.11.1
+tech-class=LJColor,Postscript
+tech-subclass=Normal
+tech-type=4
+usb-pid=72a
+usb-vid=3f0
+wifi-config=3
+
+[hp_laserjet_cm1415fn]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=7
+fw-download=False
+icon=hp_color_laserjet_cm1312_mfp.png
+io-mfp-mode=1
+io-mode=1
+io-support=14
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet Professional CM1415fn
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=1
+plugin-reason=64
+power-settings=0
+ppd-name=laserjet_cm1410_series
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CE320A
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=CE321A
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=CE322A
+r0-agent3-type=6
+r0-agent4-kind=4
+r0-agent4-sku=CE323A
+r0-agent4-type=5
+scan-src=1
+scan-type=5
+status-battery-check=0
+status-dynamic-counters=0
+status-type=10
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.11.1
+tech-class=LJColor,Postscript
+tech-subclass=Normal
+tech-type=4
+usb-pid=72a
+usb-vid=3f0
+wifi-config=3
+
+[hp_laserjet_cm1416fnw]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=7
+fw-download=False
+icon=hp_color_laserjet_cm1312_mfp.png
+io-mfp-mode=1
+io-mode=1
+io-support=14
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet Professional CM1416fnw
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=1
+plugin-reason=64
+power-settings=0
+ppd-name=laserjet_cm1410_series
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CE320A
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=CE321A
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=CE322A
+r0-agent3-type=6
+r0-agent4-kind=4
+r0-agent4-sku=CE323A
+r0-agent4-type=5
+scan-src=1
+scan-type=5
+status-battery-check=0
+status-dynamic-counters=0
+status-type=10
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.11.1
+tech-class=LJColor,Postscript
+tech-subclass=Normal
+tech-type=4
+usb-pid=72a
+usb-vid=3f0
+wifi-config=3
+
+[hp_laserjet_cm1417fnw]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=7
+fw-download=False
+icon=hp_color_laserjet_cm1312_mfp.png
+io-mfp-mode=1
+io-mode=1
+io-support=14
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet Professional CM1417fnw
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=1
+plugin-reason=64
+power-settings=0
+ppd-name=laserjet_cm1410_series
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CE320A
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=CE321A
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=CE322A
+r0-agent3-type=6
+r0-agent4-kind=4
+r0-agent4-sku=CE323A
+r0-agent4-type=5
+scan-src=1
+scan-type=5
+status-battery-check=0
+status-dynamic-counters=0
+status-type=10
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.11.1
+tech-class=LJColor,Postscript
+tech-subclass=Normal
+tech-type=4
+usb-pid=72a
+usb-vid=3f0
+wifi-config=3
+
+[hp_laserjet_cm1418fnw]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=7
+fw-download=False
+icon=hp_color_laserjet_cm1312_mfp.png
+io-mfp-mode=1
+io-mode=1
+io-support=14
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet Professional CM1418fnw
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=1
+plugin-reason=64
+power-settings=0
+ppd-name=laserjet_cm1410_series
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CE320A
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=CE321A
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=CE322A
+r0-agent3-type=6
+r0-agent4-kind=4
+r0-agent4-sku=CE323A
+r0-agent4-type=5
+scan-src=1
+scan-type=5
+status-battery-check=0
+status-dynamic-counters=0
+status-type=10
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.11.1
+tech-class=LJColor,Postscript
+tech-subclass=Normal
+tech-type=4
+usb-pid=72a
+usb-vid=3f0
+wifi-config=3
+
+[hp_color_laserjet_1500]
+align-type=0
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_laserjet.png
+io-mfp-mode=6
+io-mode=1
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP Color LaserJet 1500 Printer
+model2=HP Color LaserJet 1500L Printer
+model3=HP Color LaserJet 1500Lxi Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=35f9
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=4
+usb-pid=1417
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_d1500_series]
+align-type=5
+clean-type=2
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=Deskjet_3740.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet D1520 Printer
+model2=HP Deskjet D1530 Printer
+model3=HP Deskjet D1550 Printer
+model4=HP Deskjet D1555 Printer
+model5=HP Deskjet D1558 Printer
+model6=HP Deskjet D1560 Printer
+model7=HP Deskjet D1568 Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=21(C9153A/G)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=22(C9352A/G)
+r0-agent2-type=2
+r1-agent1-kind=3
+r1-agent1-sku=21(C9351A/G)
+r1-agent1-type=1
+r1-agent2-kind=3
+r1-agent2-sku=22(C9352A/G)
+r1-agent2-type=2
+r10-agent1-kind=3
+r10-agent1-sku=816 (C8816A/B/G)
+r10-agent1-type=1
+r10-agent2-kind=3
+r10-agent2-sku=817 (C8817A/G)
+r10-agent2-type=2
+r2-agent1-kind=3
+r2-agent1-sku=21 (C9351A/G)
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=22 (C9352A/G)
+r2-agent2-type=2
+r3-agent1-kind=3
+r3-agent1-sku=21 (C9351A/G)
+r3-agent1-type=1
+r3-agent2-kind=3
+r3-agent2-sku=22 (C9352A/G)
+r3-agent2-type=2
+r4-agent1-kind=3
+r4-agent1-sku=21 (C9351A/G)
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=22 (C9352A/G)
+r4-agent2-type=2
+r5-agent1-kind=3
+r5-agent1-sku=21 (C9351A/G)
+r5-agent1-type=1
+r5-agent2-kind=3
+r5-agent2-sku=22 (C9352A/G)
+r5-agent2-type=2
+r6-agent1-kind=3
+r6-agent1-sku=21 (C9351A/G)
+r6-agent1-type=1
+r6-agent2-kind=3
+r6-agent2-sku=22 (C9352A/G)
+r6-agent2-type=2
+r7-agent1-kind=3
+r7-agent1-sku=816 (C8816A/B/G)
+r7-agent1-type=1
+r7-agent2-kind=3
+r7-agent2-sku=817 (C8817A/G)
+r7-agent2-type=2
+r8-agent1-kind=3
+r8-agent1-sku=21 (C9351A/G)
+r8-agent1-type=1
+r8-agent2-kind=3
+r8-agent2-sku=22 (C9352A/G)
+r8-agent2-type=2
+r816-agent1-kind=3
+r816-agent1-sku=
+r816-agent1-type=1
+r816-agent2-kind=3
+r816-agent2-sku=
+r816-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.8.5
+tech-class=DJ3320
+tech-subclass=Normal
+tech-type=2
+usb-pid=7904
+usb-vid=3f0
+wifi-config=0
+
+[psc_1500_series]
+align-type=1
+clean-type=1
+color-cal-type=3
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=psc_1100_series.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP PSC 1503 All-in-One Printer
+model2=HP PSC 1504 All-in-One Printer
+model3=HP PSC 1507 All-in-One Printer
+model4=HP PSC 1508 All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=92 (C9361WN)/94 (C8765WN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=93 (C9362WN)/95 (C8766WN)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=99 (C9369WN)
+r0-agent3-type=3
+r1-agent1-kind=3
+r1-agent1-sku=92 (C9361WN)/94 (C8765WN)
+r1-agent1-type=1
+r1-agent2-kind=3
+r1-agent2-sku=93 (C9362WN)/95 (C8766WN)
+r1-agent2-type=2
+r1-agent3-kind=3
+r1-agent3-sku=99 (C9369WN)
+r1-agent3-type=3
+r2-agent1-kind=3
+r2-agent1-sku=92 (C9361WN)/94 (C8765WN)
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=93 (C9362WN)/95 (C8766WN)
+r2-agent2-type=2
+r2-agent3-kind=3
+r2-agent3-sku=99 (C9369WN)
+r2-agent3-type=3
+r3-agent1-kind=3
+r3-agent1-sku=92 (C9361WN)/94 (C8765WN)
+r3-agent1-type=1
+r3-agent2-kind=3
+r3-agent2-sku=93 (C9362WN)/95 (C8766WN)
+r3-agent2-type=2
+r3-agent3-kind=3
+r3-agent3-sku=99 (C9369WN)
+r3-agent3-type=3
+r4-agent1-kind=3
+r4-agent1-sku=337 (C9361EN)/338 (C8765EN)
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=342 (C9362EN)/343 (C8766EN)
+r4-agent2-type=2
+r4-agent3-kind=3
+r4-agent3-sku=348 (C9369EN)
+r4-agent3-type=3
+r5-agent1-kind=3
+r5-agent1-sku=132 (C9361HN)/131 (C8765HN)
+r5-agent1-type=1
+r5-agent2-kind=3
+r5-agent2-sku=136 (C9362HN)/135 (C8766HN)
+r5-agent2-type=2
+r5-agent3-kind=3
+r5-agent3-sku=138 (C9369HN)
+r5-agent3-type=3
+r6-agent1-kind=3
+r6-agent1-sku=132 (C9361HN)/131 (C8765HN)
+r6-agent1-type=1
+r6-agent2-kind=3
+r6-agent2-sku=136 (C9362HN)/135 (C8766HN)
+r6-agent2-type=2
+r6-agent3-kind=3
+r6-agent3-sku=138 (C9369HN)
+r6-agent3-type=3
+r7-agent1-kind=3
+r7-agent1-sku=850 (C9361ZN)/852 (C8765ZN)
+r7-agent1-type=1
+r7-agent2-kind=3
+r7-agent2-sku=854 (C9362ZN)/855 (C8766ZN)
+r7-agent2-type=2
+r7-agent3-kind=3
+r7-agent3-sku=858 (C9369ZN)
+r7-agent3-type=3
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=4c11
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_p1505n]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=HP_LaserJet_1012.png
+io-mfp-mode=6
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet P1505N Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=2
+plugin-reason=4
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=36A
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=8
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.8.2
+tech-class=LJm1005,LJMono
+tech-subclass=Normal
+tech-type=3
+usb-pid=4117
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_p1505]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=True
+icon=HP_LaserJet_1012.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet P1505 Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=1
+plugin-reason=1
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=36A
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=8
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.8.2
+tech-class=LJm1005
+tech-subclass=Normal
+tech-type=3
+usb-pid=4117
+usb-vid=3f0
+wifi-config=0
+
+[psc_1510_series]
+align-type=1
+clean-type=1
+color-cal-type=3
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=Photosmart_C3100.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP PSC 1508 All-in-One Printer
+model2=HP PSC 1510xi All-in-One Printer
+model3=HP PSC 1510v All-in-One Printer
+model4=HP PSC 1510s All-in-One Printer
+model5=HP PSC 1510 All-in-One Printer
+model6=HP PSC 1513s All-in-One Printer
+model7=HP PSC 1513 All-in-One Printer
+model8=HP PSC 1514 All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=92 (C9361WN)/94 (C8765WN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=93 (C9362WN)/95 (C8766WN)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=99 (C9369WN)
+r0-agent3-type=3
+r1-agent1-kind=3
+r1-agent1-sku=92 (C9361WN)/94 (C8765WN)
+r1-agent1-type=1
+r1-agent2-kind=3
+r1-agent2-sku=93 (C9362WN)/95 (C8766WN)
+r1-agent2-type=2
+r1-agent3-kind=3
+r1-agent3-sku=99 (C9369WN)
+r1-agent3-type=3
+r2-agent1-kind=3
+r2-agent1-sku=92 (C9361WN)/94 (C8765WN)
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=93 (C9362WN)/95 (C8766WN)
+r2-agent2-type=2
+r2-agent3-kind=3
+r2-agent3-sku=99 (C9369WN)
+r2-agent3-type=3
+r3-agent1-kind=3
+r3-agent1-sku=92 (C9361WN)/94 (C8765WN)
+r3-agent1-type=1
+r3-agent2-kind=3
+r3-agent2-sku=93 (C9362WN)/95 (C8766WN)
+r3-agent2-type=2
+r3-agent3-kind=3
+r3-agent3-sku=99 (C9369WN)
+r3-agent3-type=3
+r4-agent1-kind=3
+r4-agent1-sku=337 (C9361EN)/338 (C8765EN)
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=342 (C9362EN)/343 (C8766EN)
+r4-agent2-type=2
+r4-agent3-kind=3
+r4-agent3-sku=348 (C9369EN)
+r4-agent3-type=3
+r5-agent1-kind=3
+r5-agent1-sku=132 (C9361HN)/131 (C8765HN)
+r5-agent1-type=1
+r5-agent2-kind=3
+r5-agent2-sku=136 (C9362HN)/135 (C8766HN)
+r5-agent2-type=2
+r5-agent3-kind=3
+r5-agent3-sku=138 (C9369HN)
+r5-agent3-type=3
+r6-agent1-kind=3
+r6-agent1-sku=132 (C9361HN)/131 (C8765HN)
+r6-agent1-type=1
+r6-agent2-kind=3
+r6-agent2-sku=136 (C9362HN)/135 (C8766HN)
+r6-agent2-type=2
+r6-agent3-kind=3
+r6-agent3-sku=138 (C9369HN)
+r6-agent3-type=3
+r7-agent1-kind=3
+r7-agent1-sku=850 (C9361ZN)/852 (C8765ZN)
+r7-agent1-type=1
+r7-agent2-kind=3
+r7-agent2-sku=854 (C9362ZN)/855 (C8766ZN)
+r7-agent2-type=2
+r7-agent3-kind=3
+r7-agent3-sku=858 (C9369ZN)
+r7-agent3-type=3
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_color_laserjet_cp1514n]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_color_laserjet_cp2025.png
+io-mfp-mode=3
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Color LaserJet CP1514n Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=2
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CB540A
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=CB541A
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=CB542A
+r0-agent3-type=5
+r0-agent4-kind=4
+r0-agent4-sku=CB543A
+r0-agent4-type=6
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=6
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.8.12
+tech-class=LJColor,Postscript
+tech-subclass=Normal
+tech-type=4
+usb-pid=4417
+usb-vid=3f0
+wifi-config=0
+
+[hp_color_laserjet_cp1515n]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_color_laserjet_cp2025.png
+io-mfp-mode=3
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Color LaserJet CP1515n Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=2
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CB540A
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=CB541A
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=CB542A
+r0-agent3-type=5
+r0-agent4-kind=4
+r0-agent4-sku=CB543A
+r0-agent4-type=6
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=6
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.8.5
+tech-class=LJColor,Postscript
+tech-subclass=Normal
+tech-type=4
+usb-pid=4417
+usb-vid=3f0
+wifi-config=0
+
+[hp_color_laserjet_cp1518ni]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_color_laserjet_cp2025.png
+io-mfp-mode=3
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Color LaserJet CP1518ni Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=2
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CB540A
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=CB541A
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=CB542A
+r0-agent3-type=5
+r0-agent4-kind=4
+r0-agent4-sku=CB543A
+r0-agent4-type=6
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=6
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.8.5
+tech-class=LJColor,Postscript
+tech-subclass=Normal
+tech-type=4
+usb-pid=5017
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_cp1521n]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=hp_color_laserjet_cm1312_mfp.png
+io-mfp-mode=1
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet Professional CP1521n
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+ppd-name=laserjet_cp1520_series
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CE320A
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=CE321A
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=CE322A
+r0-agent3-type=6
+r0-agent4-kind=4
+r0-agent4-sku=CE323A
+r0-agent4-type=5
+scan-src=1
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=10
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.11.3
+tech-class=Postscript
+tech-subclass=Normal
+tech-type=4
+usb-pid=22a
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_m1522nf_mfp]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=4
+fw-download=False
+icon=HP_LaserJet_m1522.png
+io-mfp-mode=1
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet M1522nf Multifunction Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=1
+plugin-reason=64
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=Q7573
+r0-agent1-type=1
+scan-src=1
+scan-type=5
+status-battery-check=0
+status-dynamic-counters=0
+status-type=6
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.8.10
+tech-class=LJMono,Postscript
+tech-subclass=Normal
+tech-type=3
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_cp1522n]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=hp_color_laserjet_cm1312_mfp.png
+io-mfp-mode=1
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet Professional CP1522n
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+ppd-name=laserjet_cp1520_series
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CE320A
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=CE321A
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=CE322A
+r0-agent3-type=6
+r0-agent4-kind=4
+r0-agent4-sku=CE323A
+r0-agent4-type=5
+scan-src=1
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=10
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.11.3
+tech-class=Postscript
+tech-subclass=Normal
+tech-type=4
+usb-pid=22a
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_m1522_mfp]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=HP_LaserJet_m1522.png
+io-mfp-mode=1
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet M1522 Multifunction Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=1
+plugin-reason=64
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=Q7573
+r0-agent1-type=1
+scan-src=1
+scan-type=5
+status-battery-check=0
+status-dynamic-counters=0
+status-type=6
+support-released=True
+support-subtype=-4fc8
+support-type=2
+support-ver=2.8.10
+tech-class=Postscript
+tech-subclass=Normal
+tech-type=3
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_m1522n_mfp]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=HP_LaserJet_m1522.png
+io-mfp-mode=1
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet M1522n Multifunction Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=1
+plugin-reason=64
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=Q7573
+r0-agent1-type=1
+scan-src=1
+scan-type=5
+status-battery-check=0
+status-dynamic-counters=0
+status-type=6
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.8.10
+tech-class=Postscript
+tech-subclass=Normal
+tech-type=3
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_cp1523n]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=hp_color_laserjet_cm1312_mfp.png
+io-mfp-mode=1
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet Professional CP1523n
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+ppd-name=laserjet_cp1520_series
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CE320A
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=CE321A
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=CE322A
+r0-agent3-type=6
+r0-agent4-kind=4
+r0-agent4-sku=CE323A
+r0-agent4-type=5
+scan-src=1
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=10
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.11.3
+tech-class=Postscript
+tech-subclass=Normal
+tech-type=4
+usb-pid=22a
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_cp1525n]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=hp_color_laserjet_cm1312_mfp.png
+io-mfp-mode=1
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet Professional CP1525N
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+ppd-name=laserjet_cp1520_series
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CE320A
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=CE321A
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=CE322A
+r0-agent3-type=6
+r0-agent4-kind=4
+r0-agent4-sku=CE323A
+r0-agent4-type=5
+scan-src=1
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=10
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.11.3
+tech-class=Postscript
+tech-subclass=Normal
+tech-type=4
+usb-pid=22a
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_cp1525nw]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=hp_color_laserjet_cm1312_mfp.png
+io-mfp-mode=1
+io-mode=1
+io-support=14
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet Professional CP1525nw
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+ppd-name=laserjet_cp1520_series
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CE320A
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=CE321A
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=CE322A
+r0-agent3-type=6
+r0-agent4-kind=4
+r0-agent4-sku=CE323A
+r0-agent4-type=5
+scan-src=1
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=10
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.11.3
+tech-class=Postscript
+tech-subclass=Normal
+tech-type=4
+usb-pid=22a
+usb-vid=3f0
+wifi-config=3
+
+[hp_laserjet_cp1526nw]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=hp_color_laserjet_cm1312_mfp.png
+io-mfp-mode=1
+io-mode=1
+io-support=14
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet Professional CP1526nw
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+ppd-name=laserjet_cp1520_series
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CE320A
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=CE321A
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=CE322A
+r0-agent3-type=6
+r0-agent4-kind=4
+r0-agent4-sku=CE323A
+r0-agent4-type=5
+scan-src=1
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=10
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.11.3
+tech-class=Postscript
+tech-subclass=Normal
+tech-type=4
+usb-pid=22a
+usb-vid=3f0
+wifi-config=3
+
+[hp_laserjet_cp1527nw]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=hp_color_laserjet_cm1312_mfp.png
+io-mfp-mode=1
+io-mode=1
+io-support=14
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet Professional CP1527nw
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+ppd-name=laserjet_cp1520_series
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CE320A
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=CE321A
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=CE322A
+r0-agent3-type=6
+r0-agent4-kind=4
+r0-agent4-sku=CE323A
+r0-agent4-type=5
+scan-src=1
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=10
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.11.3
+tech-class=Postscript
+tech-subclass=Normal
+tech-type=4
+usb-pid=22a
+usb-vid=3f0
+wifi-config=3
+
+[hp_laserjet_cp1528nw]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=hp_color_laserjet_cm1312_mfp.png
+io-mfp-mode=1
+io-mode=1
+io-support=14
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet Professional CP1528nw
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+ppd-name=laserjet_cp1520_series
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CE320A
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=CE321A
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=CE322A
+r0-agent3-type=6
+r0-agent4-kind=4
+r0-agent4-sku=CE323A
+r0-agent4-type=5
+scan-src=1
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=10
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.11.3
+tech-class=Postscript
+tech-subclass=Normal
+tech-type=4
+usb-pid=22a
+usb-vid=3f0
+wifi-config=3
+
+[hp_laserjet_m1536dnf_mfp]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=7
+fw-download=False
+icon=HP_LaserJet_m1522.png
+io-mfp-mode=1
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet M1536dnf MFP
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=1
+plugin-reason=64
+power-settings=0
+ppd-name=laserjet_m1530_mfp_series
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CE278A
+r0-agent1-type=1
+scan-src=1
+scan-type=5
+status-battery-check=2
+status-dynamic-counters=0
+status-type=10
+support-released=True
+support-subtype=-4fc8
+support-type=2
+support-ver=3.11.1
+tech-class=LJMono,Postscript
+tech-subclass=Normal
+tech-type=3
+usb-pid=12a
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_m1537dnf_mfp]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=7
+fw-download=False
+icon=HP_LaserJet_m1522.png
+io-mfp-mode=1
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model2=HP LaserJet M1537dnf MFP
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=1
+plugin-reason=64
+power-settings=0
+ppd-name=laserjet_m1530_mfp_series
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CE278A
+r0-agent1-type=1
+scan-src=1
+scan-type=5
+status-battery-check=2
+status-dynamic-counters=0
+status-type=10
+support-released=True
+support-subtype=-4fc8
+support-type=2
+support-ver=3.11.1
+tech-class=LJMono,Postscript
+tech-subclass=Normal
+tech-type=3
+usb-pid=12a
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_m1538dnf_mfp]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=7
+fw-download=False
+icon=HP_LaserJet_m1522.png
+io-mfp-mode=1
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model3=HP LaserJet M1538dnf MFP
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=1
+plugin-reason=64
+power-settings=0
+ppd-name=laserjet_m1530_mfp_series
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CE278A
+r0-agent1-type=1
+scan-src=1
+scan-type=5
+status-battery-check=2
+status-dynamic-counters=0
+status-type=10
+support-released=True
+support-subtype=-4fc8
+support-type=2
+support-ver=3.11.1
+tech-class=LJMono,Postscript
+tech-subclass=Normal
+tech-type=3
+usb-pid=12a
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_m1539dnf_mfp]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=7
+fw-download=False
+icon=HP_LaserJet_m1522.png
+io-mfp-mode=1
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model4=HP LaserJet M1539dnf MFP
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=1
+plugin-reason=64
+power-settings=0
+ppd-name=laserjet_m1530_mfp_series
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CE278A
+r0-agent1-type=1
+scan-src=1
+scan-type=5
+status-battery-check=2
+status-dynamic-counters=0
+status-type=10
+support-released=True
+support-subtype=-4fc8
+support-type=2
+support-ver=3.11.1
+tech-class=LJMono,Postscript
+tech-subclass=Normal
+tech-type=3
+usb-pid=12a
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_professional_p1566]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=True
+icon=HP_LaserJet_1012.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet Professional P1566
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=1
+plugin-reason=1
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=36A
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=8
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.10.4
+tech-class=LJZjsMono
+tech-subclass=NoAutoDuplex
+tech-type=3
+usb-pid=92a
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_1600c]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=DESKJET_1120C.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 1600c Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=2
+r0-agent1-sku=45
+r0-agent1-type=1
+r0-agent2-kind=2
+r0-agent2-sku=40
+r0-agent2-type=4
+r0-agent3-kind=2
+r0-agent3-sku=40
+r0-agent3-type=5
+r0-agent4-kind=2
+r0-agent4-sku=40
+r0-agent4-type=6
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=2f6e
+support-type=2
+support-ver=0.9.5
+tech-class=LJColor
+tech-subclass=300dpiOnly,LargeFormatA3
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_d1600_series]
+align-type=14
+clean-type=2
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=deskjet_3600.png
+io-mfp-mode=3
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet D1620 Printer
+model2=HP Deskjet D1630 Printer
+model3=HP Deskjet D1650 Printer
+model4=HP Deskjet D1658 Printer
+model5=HP Deskjet D1660 Printer
+model6=HP Deskjet D1663 Printer
+model7=HP Deskjet D1668 Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=60/60XL
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=60/60XL
+r0-agent2-type=2
+r10-agent1-kind=3
+r10-agent1-sku=818/818XL
+r10-agent1-type=1
+r10-agent2-kind=3
+r10-agent2-sku=818/818XL
+r10-agent2-type=2
+r2-agent1-kind=3
+r2-agent1-sku=60/60XL
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=60/60XL
+r2-agent2-type=2
+r4-agent1-kind=3
+r4-agent1-sku=300/300XL
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=300/300XL
+r4-agent2-type=2
+r7-agent1-sku=816 (C8816A/B/G)
+r8-agent1-kind=3
+r8-agent1-sku=121/121XL
+r8-agent1-type=1
+r8-agent2-kind=3
+r8-agent2-sku=121/121XL
+r8-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=3
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.9.8
+tech-class=ViperMinusTrim
+tech-subclass=Normal
+tech-type=2
+usb-pid=7f11
+usb-vid=3f0
+wifi-config=0
+
+[psc_1600_series]
+align-type=1
+clean-type=1
+color-cal-type=3
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=psc_1610.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP PSC 1600 All-in-One Printer
+model2=HP PSC 1603 All-in-One Printer
+model3=HP PSC 1605 All-in-One Printer
+model4=HP PSC 1608 All-in-One Printer
+model5=HP PSC 1610xi All-in-One Printer
+model6=HP PSC 1610v All-in-One Printer
+model7=HP PSC 1610 All-in-One Printer
+model8=HP PSC 1613 All-in-One Printer
+model9=HP PSC 1615 All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=92 (C9361WN)/94 (C8765WN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=93 (C9362WN)/95 (C8766WN)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=99 (C9369WN)
+r0-agent3-type=3
+r1-agent1-kind=3
+r1-agent1-sku=92 (C9361WN)/94 (C8765WN)
+r1-agent1-type=1
+r1-agent2-kind=3
+r1-agent2-sku=93 (C9362WN)/95 (C8766WN)
+r1-agent2-type=2
+r1-agent3-kind=3
+r1-agent3-sku=99 (C9369WN)
+r1-agent3-type=3
+r2-agent1-kind=3
+r2-agent1-sku=92 (C9361WN)/94 (C8765WN)
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=93 (C9362WN)/95 (C8766WN)
+r2-agent2-type=2
+r2-agent3-kind=3
+r2-agent3-sku=99 (C9369WN)
+r2-agent3-type=3
+r3-agent1-kind=3
+r3-agent1-sku=92 (C9361WN)/94 (C8765WN)
+r3-agent1-type=1
+r3-agent2-kind=3
+r3-agent2-sku=93 (C9362WN)/95 (C8766WN)
+r3-agent2-type=2
+r3-agent3-kind=3
+r3-agent3-sku=99 (C9369WN)
+r3-agent3-type=3
+r4-agent1-kind=3
+r4-agent1-sku=337 (C9361EN)/338 (C8765EN)
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=342 (C9362EN)/343 (C8766EN)
+r4-agent2-type=2
+r4-agent3-kind=3
+r4-agent3-sku=348 (C9369EN)
+r4-agent3-type=3
+r5-agent1-kind=3
+r5-agent1-sku=132 (C9361HN)/131 (C8765HN)
+r5-agent1-type=1
+r5-agent2-kind=3
+r5-agent2-sku=136 (C9362HN)/135 (C8766HN)
+r5-agent2-type=2
+r5-agent3-kind=3
+r5-agent3-sku=138 (C9369HN)
+r5-agent3-type=3
+r6-agent1-kind=3
+r6-agent1-sku=132 (C9361HN)/131 (C8765HN)
+r6-agent1-type=1
+r6-agent2-kind=3
+r6-agent2-sku=136 (C9362HN)/135 (C8766HN)
+r6-agent2-type=2
+r6-agent3-kind=3
+r6-agent3-sku=138 (C9369HN)
+r6-agent3-type=3
+r7-agent1-kind=3
+r7-agent1-sku=850 (C9361ZN)/852 (C8765ZN)
+r7-agent1-type=1
+r7-agent2-kind=3
+r7-agent2-sku=854 (C9362ZN)/855 (C8766ZN)
+r7-agent2-type=2
+r7-agent3-kind=3
+r7-agent3-sku=858 (C9369ZN)
+r7-agent3-type=3
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=4811
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_1600cn]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=DESKJET_1120C.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 1600cn Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=2
+r0-agent1-sku=45
+r0-agent1-type=1
+r0-agent2-kind=2
+r0-agent2-sku=40
+r0-agent2-type=4
+r0-agent3-kind=2
+r0-agent3-sku=40
+r0-agent3-type=5
+r0-agent4-kind=2
+r0-agent4-sku=40
+r0-agent4-type=6
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=2d88
+support-type=2
+support-ver=0.9.5
+tech-class=LJColor
+tech-subclass=300dpiOnly,LargeFormatA3
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_1600cm]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=DESKJET_1120C.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 1600cm Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=2
+r0-agent1-sku=45
+r0-agent1-type=1
+r0-agent2-kind=2
+r0-agent2-sku=40
+r0-agent2-type=4
+r0-agent3-kind=2
+r0-agent3-sku=40
+r0-agent3-type=5
+r0-agent4-kind=2
+r0-agent4-sku=40
+r0-agent4-type=6
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=2f6e
+support-type=2
+support-ver=0.9.5
+tech-class=LJColor
+tech-subclass=300dpiOnly,LargeFormatA3
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_color_laserjet_1600]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_laserjet.png
+io-mfp-mode=6
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Color LaserJet 1600 Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=1
+plugin-reason=1
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=3c73
+support-type=2
+support-ver=3.9.2
+tech-class=LJZjsColor
+tech-subclass=Normal
+tech-type=4
+usb-pid=3a17
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_professional_p1606dn]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=HP_LaserJet_1012.png
+io-mfp-mode=6
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet Professional P1606dn Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=2
+plugin-reason=4
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=36A
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=8
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.10.4
+tech-class=LJZjsMono
+tech-subclass=Duplex
+tech-type=3
+usb-pid=a2a
+usb-vid=3f0
+wifi-config=0
+
+[color_inkjet_printer_cp1700]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=COLOR_INKJET_PRINTER_CP1700.png
+io-mfp-mode=6
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Color Inkjet cp1700 Printer
+model2=HP Color Inkjet cp1700ps Printer
+model3=HP Color Inkjet cp1700d Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=2
+r0-agent1-sku=10 (C4844A)
+r0-agent1-type=1
+r0-agent2-kind=2
+r0-agent2-sku=11 (C4836AN)
+r0-agent2-type=4
+r0-agent3-kind=2
+r0-agent3-sku=11 (C4837AN)
+r0-agent3-type=5
+r0-agent4-kind=2
+r0-agent4-sku=11 (C4838AN)
+r0-agent4-type=6
+r0-agent5-kind=1
+r0-agent5-sku=11 (4810A)
+r0-agent5-type=1
+r0-agent6-kind=1
+r0-agent6-sku=11 (4811A)
+r0-agent6-type=4
+r0-agent7-kind=1
+r0-agent7-sku=11 (4812A)
+r0-agent7-type=5
+r0-agent8-kind=1
+r0-agent8-sku=11 (4813A)
+r0-agent8-type=6
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=372a
+support-type=2
+support-ver=0.9.5
+tech-class=DJ9xxVIP
+tech-subclass=LargeFormatSuperB
+tech-type=2
+usb-pid=312
+usb-vid=3f0
+wifi-config=0
+
+[hp_color_inkjet_cp1700]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=CP_1700.png
+io-mfp-mode=6
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Color Inkjet cp1700 Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=2
+r0-agent1-sku=10 (C4844A)
+r0-agent1-type=1
+r0-agent2-kind=2
+r0-agent2-sku=11 (C4836AN)
+r0-agent2-type=4
+r0-agent3-kind=2
+r0-agent3-sku=11 (C4837AN)
+r0-agent3-type=5
+r0-agent4-kind=2
+r0-agent4-sku=11 (C4838AN)
+r0-agent4-type=6
+r0-agent5-kind=1
+r0-agent5-sku=11 (4810A)
+r0-agent5-type=1
+r0-agent6-kind=1
+r0-agent6-sku=11 (4811A)
+r0-agent6-type=4
+r0-agent7-kind=1
+r0-agent7-sku=11 (4812A)
+r0-agent7-type=5
+r0-agent8-kind=1
+r0-agent8-sku=11 (4813A)
+r0-agent8-type=6
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=372a
+support-type=2
+support-ver=0.9.5
+tech-class=DJ9xxVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=317
+usb-vid=3f0
+wifi-config=0
+
+[hp_designjet_2000cp]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=0
+io-mode=0
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP Designjet 2000cp Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=38cb
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[apollo_p2000-u]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_printer.png
+io-mfp-mode=6
+io-mode=0
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=Apollo P2000-U Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=0
+support-type=1
+support-ver=
+tech-class=AP21xx
+tech-subclass=Apollo2000
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_2000_j210_series]
+align-type=16
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=hp_deskjet_f4200.png
+io-mfp-mode=3
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 2000 J210 series
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=61/61XL/61b
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=61/61XL
+r0-agent2-type=2
+r10-agent1-kind=3
+r10-agent1-sku=802/802XL/802b
+r10-agent1-type=1
+r10-agent2-kind=3
+r10-agent2-sku=802/802XL
+r10-agent2-type=2
+r18-agent2-kind=3
+r18-agent2-sku=93/95
+r18-agent2-type=2
+r18-agent3-kind=3
+r18-agent3-sku=99
+r18-agent3-type=3
+r2-agent1-kind=3
+r2-agent1-sku=61/61XL/61b
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=61/61XL
+r2-agent2-type=2
+r4-agent1-kind=3
+r4-agent1-sku=301/301XL/301b
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=301/301XL
+r4-agent2-type=2
+r8-agent1-kind=3
+r8-agent1-sku=122/122XL/122b
+r8-agent1-type=1
+r8-agent2-kind=3
+r8-agent2-sku=122/122XL
+r8-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=1
+status-type=10
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.10.9
+tech-class=Pyramid
+tech-subclass=NoAutoDuplex,NoCDDVD
+tech-type=2
+usb-pid=9411
+usb-vid=3f0
+wifi-config=0
+
+[hp_2000c]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=HP_2000C.png
+io-mfp-mode=6
+io-mode=1
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP 2000cse Printer
+model2=HP 2000c Printer
+model3=HP 2000cn Printer
+model4=HP 2000cxi Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=2
+r0-agent1-sku=10 (C4844A)
+r0-agent1-type=1
+r0-agent2-kind=2
+r0-agent2-sku=10 (C4841A)
+r0-agent2-type=4
+r0-agent3-kind=2
+r0-agent3-sku=10 (C4843A)
+r0-agent3-type=5
+r0-agent4-kind=2
+r0-agent4-sku=10 (C4842A)
+r0-agent4-type=6
+r0-agent5-kind=1
+r0-agent5-sku=10 (C4800A)
+r0-agent5-type=1
+r0-agent6-kind=1
+r0-agent6-sku=10 (C4801A)
+r0-agent6-type=4
+r0-agent7-kind=1
+r0-agent7-sku=10 (C4802A)
+r0-agent7-type=5
+r0-agent8-kind=1
+r0-agent8-sku=10 (C4803A)
+r0-agent8-type=6
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=3320
+support-type=2
+support-ver=0.9.5
+tech-class=DJ9xx
+tech-subclass=NoPhotoMode
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_ink_adv_2010_k010]
+align-type=16
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_deskjet.png
+io-mfp-mode=3
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet Ink Adv 2010 K010
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=61/61XL/61b
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=61/61XL
+r0-agent2-type=2
+r10-agent1-kind=3
+r10-agent1-sku=802/802XL/802b
+r10-agent1-type=1
+r10-agent2-kind=3
+r10-agent2-sku=802/802XL
+r10-agent2-type=2
+r18-agent2-kind=3
+r18-agent2-sku=93/95
+r18-agent2-type=2
+r18-agent3-kind=3
+r18-agent3-sku=99
+r18-agent3-type=3
+r2-agent1-kind=3
+r2-agent1-sku=61/61XL/61b
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=61/61XL
+r2-agent2-type=2
+r4-agent1-kind=3
+r4-agent1-sku=301/301XL/301b
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=301/301XL
+r4-agent2-type=2
+r8-agent1-kind=3
+r8-agent1-sku=122/122XL/122b
+r8-agent1-type=1
+r8-agent2-kind=3
+r8-agent2-sku=122/122XL
+r8-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.11.1
+tech-class=Pyramid
+tech-subclass=NoAutoDuplex,NoCDDVD
+tech-type=2
+usb-pid=9b11
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_p2014]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=hp_LaserJet_1200.png
+io-mfp-mode=3
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet P2014 Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=2
+plugin-reason=2
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=Q5949A/Q5949X
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=6
+support-released=True
+support-subtype=3cdf
+support-type=2
+support-ver=2.7.6
+tech-class=LJm1005,LJMono
+tech-subclass=Normal
+tech-type=3
+usb-pid=3917
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_p2014n]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=hp_LaserJet_1200.png
+io-mfp-mode=3
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet P2014n Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=2
+plugin-reason=2
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=Q5949A/Q5949X
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=6
+support-released=True
+support-subtype=3cdf
+support-type=2
+support-ver=2.7.6
+tech-class=LJm1005,LJMono
+tech-subclass=Normal
+tech-type=3
+usb-pid=4a17
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_p2015dn_series]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_laserjet_p2015.png
+io-mfp-mode=1
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet P2015dn Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+ppd-name=laserjet_p2015_series
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=Q5949A/Q5949X
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=6
+support-released=True
+support-subtype=3cdf
+support-type=2
+support-ver=1.6.10
+tech-class=LJMono
+tech-subclass=Normal
+tech-type=3
+usb-pid=4a17
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_p2015x_series]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_laserjet_p2015.png
+io-mfp-mode=1
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet P2015x Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+ppd-name=laserjet_p2015_series
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=Q5949A/Q5949X
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=6
+support-released=True
+support-subtype=3cdf
+support-type=2
+support-ver=1.6.10
+tech-class=LJMono
+tech-subclass=Normal
+tech-type=3
+usb-pid=3917
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_p2015d_series]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_laserjet_p2015.png
+io-mfp-mode=1
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet P2015d Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+ppd-name=laserjet_p2015_series
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=Q5949A/Q5949X
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=6
+support-released=True
+support-subtype=3cdf
+support-type=2
+support-ver=1.6.10
+tech-class=LJMono
+tech-subclass=Normal
+tech-type=3
+usb-pid=3817
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_p2015_series]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_laserjet_p2015.png
+io-mfp-mode=1
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet P2015 Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+ppd-name=laserjet_p2015_series
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=Q5949A/Q5949X
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=6
+support-released=True
+support-subtype=3cdf
+support-type=2
+support-ver=1.6.10
+tech-class=LJMono,Postscript
+tech-subclass=Normal
+tech-type=3
+usb-pid=3817
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_p2015n_series]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_laserjet_p2015.png
+io-mfp-mode=1
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet P2015n Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+ppd-name=laserjet_p2015_series
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=Q5949A/Q5949X
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=6
+support-released=True
+support-subtype=3cdf
+support-type=2
+support-ver=1.6.10
+tech-class=LJMono
+tech-subclass=Normal
+tech-type=3
+usb-pid=4a17
+usb-vid=3f0
+wifi-config=0
+
+[hp_color_laserjet_cp2025dn]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_color_laserjet_cp2025.png
+io-mfp-mode=1
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Color LaserJet CP2025dn Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CC530A
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=CC531A
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=CC533A
+r0-agent3-type=5
+r0-agent4-kind=4
+r0-agent4-sku=CC532A
+r0-agent4-type=6
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=6
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.8.10
+tech-class=LJColor,Postscript
+tech-subclass=Normal
+tech-type=4
+usb-pid=5417
+usb-vid=3f0
+wifi-config=0
+
+[hp_color_laserjet_cp2025]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_color_laserjet_cp2025.png
+io-mfp-mode=1
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Color LaserJet CP2025 Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CC530A
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=CC531A
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=CC533A
+r0-agent3-type=5
+r0-agent4-kind=4
+r0-agent4-sku=CC532A
+r0-agent4-type=6
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=6
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.8.10
+tech-class=LJColor,Postscript
+tech-subclass=Normal
+tech-type=4
+usb-pid=5217
+usb-vid=3f0
+wifi-config=0
+
+[hp_color_laserjet_cp2025n]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_color_laserjet_cp2025.png
+io-mfp-mode=1
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Color LaserJet CP2025n Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CC530A
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=CC531A
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=CC533A
+r0-agent3-type=5
+r0-agent4-kind=4
+r0-agent4-sku=CC532A
+r0-agent4-type=6
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=6
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.8.10
+tech-class=LJColor,Postscript
+tech-subclass=Normal
+tech-type=4
+usb-pid=5317
+usb-vid=3f0
+wifi-config=0
+
+[hp_color_laserjet_cp2025x]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_color_laserjet_cp2025.png
+io-mfp-mode=1
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Color LaserJet CP2025x Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CC530A
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=CC531A
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=CC533A
+r0-agent3-type=5
+r0-agent4-kind=4
+r0-agent4-sku=CC532A
+r0-agent4-type=6
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=6
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.8.10
+tech-class=LJColor,Postscript
+tech-subclass=Normal
+tech-type=4
+usb-pid=5317
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_p2035n]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=HP_LaserJet_1012.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet P2035n Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=1
+plugin-reason=1
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CE505A
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=8
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.8.10
+tech-class=LJMono,LJZjsMono
+tech-subclass=Normal
+tech-type=3
+usb-pid=5d17
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_p2035]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=HP_LaserJet_1012.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet P2035 Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=1
+plugin-reason=1
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CE505A
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=8
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.8.10
+tech-class=LJMono,LJZjsMono
+tech-subclass=Normal
+tech-type=3
+usb-pid=5d17
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_2050_j510_series]
+align-type=-1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=hp_deskjet_f4200.png
+io-mfp-mode=1
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 2050 J510 All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=61/61XL/61b
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=61/61XL
+r0-agent2-type=2
+r10-agent1-kind=3
+r10-agent1-sku=802/802XL/802b
+r10-agent1-type=1
+r10-agent2-kind=3
+r10-agent2-sku=802/802XL
+r10-agent2-type=2
+r18-agent2-kind=3
+r18-agent2-sku=93/95
+r18-agent2-type=2
+r18-agent3-kind=3
+r18-agent3-sku=99
+r18-agent3-type=3
+r2-agent1-kind=3
+r2-agent1-sku=61/61XL/61b
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=61/61XL
+r2-agent2-type=2
+r4-agent1-kind=3
+r4-agent1-sku=301/301XL/301b
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=301/301XL
+r4-agent2-type=2
+r8-agent1-kind=3
+r8-agent1-sku=122/122XL/122b
+r8-agent1-type=1
+r8-agent2-kind=3
+r8-agent2-sku=122/122XL
+r8-agent2-type=2
+scan-src=1
+scan-type=7
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.10.6
+tech-class=Pyramid
+tech-subclass=NoAutoDuplex,NoCDDVD
+tech-type=2
+usb-pid=8711
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_p2055dn]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=HP_LaserJet_1012.png
+io-mfp-mode=6
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet P2055dn Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+ppd-name=laserjet_p2055_series
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CE505A
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=8
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.8.10
+tech-class=LJMono,Postscript
+tech-subclass=Normal
+tech-type=3
+usb-pid=5c17
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_p2055]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=HP_LaserJet_1012.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet P2055 Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+ppd-name=laserjet_p2055_series
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CE505A
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=8
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.8.10
+tech-class=LJMono,Postscript
+tech-subclass=Normal
+tech-type=3
+usb-pid=5c17
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_p2055d]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=HP_LaserJet_1012.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet P2055d Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+ppd-name=laserjet_p2055_series
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CE505A
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=8
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.8.10
+tech-class=LJMono,Postscript
+tech-subclass=Normal
+tech-type=3
+usb-pid=5c17
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_p2055x]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=HP_LaserJet_1012.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet P2055x Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+ppd-name=laserjet_p2055_series
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CE505A
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=8
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.8.10
+tech-class=LJMono,Postscript
+tech-subclass=Normal
+tech-type=3
+usb-pid=5c17
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_ink_adv_2060_k110]
+align-type=-1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_deskjet.png
+io-mfp-mode=1
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet Ink Adv 2060 K110
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=61/61XL/61b
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=61/61XL
+r0-agent2-type=2
+r10-agent1-kind=3
+r10-agent1-sku=802/802XL/802b
+r10-agent1-type=1
+r10-agent2-kind=3
+r10-agent2-sku=802/802XL
+r10-agent2-type=2
+r18-agent2-kind=3
+r18-agent2-sku=93/95
+r18-agent2-type=2
+r18-agent3-kind=3
+r18-agent3-sku=99
+r18-agent3-type=3
+r2-agent1-kind=3
+r2-agent1-sku=61/61XL/61b
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=61/61XL
+r2-agent2-type=2
+r4-agent1-kind=3
+r4-agent1-sku=301/301XL/301b
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=301/301XL
+r4-agent2-type=2
+r8-agent1-kind=3
+r8-agent1-sku=122/122XL/122b
+r8-agent1-type=1
+r8-agent2-kind=3
+r8-agent2-sku=122/122XL
+r8-agent2-type=2
+scan-src=1
+scan-type=7
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.11.1
+tech-class=Pyramid
+tech-subclass=NoAutoDuplex,NoCDDVD
+tech-type=2
+usb-pid=9a11
+usb-vid=3f0
+wifi-config=0
+
+[apollo_2100]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_printer.png
+io-mfp-mode=6
+io-mode=0
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=Apollo 2100 Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=0
+support-type=1
+support-ver=0.9.5
+tech-class=AP21xx
+tech-subclass=Apollo2000
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[psc_2100_series]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_psc.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP PSC 2105 All-in-One Printer
+model2=HP PSC 2108 All-in-One Printer
+model3=HP PSC 2110v All-in-One Printer
+model4=HP PSC 2110 All-in-One Printer
+model5=HP PSC 2110xi All-in-One Printer
+model6=HP PSC 2115 All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=56 (C6656A) / 27 (C8727A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=57 (C6657A) / 28 (C8728A)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=58 (C6658A)
+r0-agent3-type=3
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=391a
+support-type=2
+support-ver=0.9.5
+tech-class=DJ9xxVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=2811
+usb-vid=3f0
+wifi-config=0
+
+[hp_designjet_z2100]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=0
+io-mode=0
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP Designjet Z2100 24-in Photo Printer
+model2=HP Designjet Z2100 44-in Photo Printer
+model3=HP Designjet Z2100 24 in GP Photo Printer/Advanced Profiling Solution Bundle
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=219b2b
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_2100]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_LaserJet_2100.png
+io-mfp-mode=6
+io-mode=1
+io-support=7
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 2100 Printer
+model2=HP LaserJet 2100m Printer
+model3=HP LaserJet 2100se Printer
+model4=HP LaserJet 2100tn Printer
+model5=HP LaserJet 2100xi Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=C4096A
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=3617
+support-type=2
+support-ver=0.9.5
+tech-class=LJMono
+tech-subclass=Normal
+tech-type=3
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_2100_series]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_LaserJet_2100.png
+io-mfp-mode=6
+io-mode=1
+io-support=3
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 2100 Series Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=C4096A
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=3617
+support-type=2
+support-ver=0.9.5
+tech-class=LJMono,Postscript
+tech-subclass=Normal
+tech-type=3
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_f2100_series]
+align-type=5
+clean-type=2
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=psc_1100_series.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet F2110 All-in-One Printer
+model2=HP Deskjet F2120 All-in-One Printer
+model3=HP Deskjet F2128 All-in-One Printer
+model4=HP Deskjet F2140 All-in-One Printer
+model5=HP Deskjet F2179 All-in-One Printer
+model6=HP Deskjet F2180 All-in-One Printer
+model7=HP Deskjet F2185 All-in-One Printer
+model8=HP Deskjet F2187 All-in-One Printer
+model9=HP Deskjet F2188 All-in-One Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=21(C9153A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=22(C9352A)
+r0-agent2-type=2
+r1-agent1-kind=3
+r1-agent1-sku=21(C9351A)
+r1-agent1-type=1
+r1-agent2-kind=3
+r1-agent2-sku=22(C9352A)
+r1-agent2-type=2
+r2-agent1-kind=3
+r2-agent1-sku=21 (C9351A)
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=22 (C9352A)
+r2-agent2-type=2
+r3-agent1-kind=3
+r3-agent1-sku=21 (C9351A)
+r3-agent1-type=1
+r3-agent2-kind=3
+r3-agent2-sku=22 (C9352A)
+r3-agent2-type=2
+r4-agent1-kind=3
+r4-agent1-sku=21 (C9351A)
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=22 (C9352A)
+r4-agent2-type=2
+r5-agent1-kind=3
+r5-agent1-sku=21 (C9351A)
+r5-agent1-type=1
+r5-agent2-kind=3
+r5-agent2-sku=22 (C9352A)
+r5-agent2-type=2
+r6-agent1-kind=3
+r6-agent1-sku=21 (C9351A)
+r6-agent1-type=1
+r6-agent2-kind=3
+r6-agent2-sku=22 (C9352A)
+r6-agent2-type=2
+r7-agent1-kind=3
+r7-agent1-sku=816 (C8816A/B)
+r7-agent1-type=1
+r7-agent2-kind=3
+r7-agent2-sku=817 (C8817A/C8817G)
+r7-agent2-type=2
+r816-agent1-kind=3
+r816-agent1-sku=
+r816-agent1-type=1
+r816-agent2-kind=3
+r816-agent2-sku=
+r816-agent2-type=2
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=1.7.4
+tech-class=DJ3320
+tech-subclass=Normal
+tech-type=2
+usb-pid=7d04
+usb-vid=3f0
+wifi-config=0
+
+[psc_2150_series]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_psc.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP PSC 2150 All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=56 (C6656A) / 27 (C8727A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=57 (C6657A) / 28 (C8728A)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=58 (C6658A)
+r0-agent3-type=3
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=359e
+support-type=2
+support-ver=0.9.5
+tech-class=DJ9xxVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=2a11
+usb-vid=3f0
+wifi-config=0
+
+[apollo_2150]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_printer.png
+io-mfp-mode=6
+io-mode=0
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=Apollo 2150 Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=0
+support-type=1
+support-ver=0.9.5
+tech-class=AP21xx
+tech-subclass=Apollo2000
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[psc_2170_series]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_psc.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP PSC 2170 All-in-One Printer
+model2=HP PSC 2171 All-in-One Printer
+model3=HP PSC 2175xi All-in-One Printer
+model4=HP PSC 2175v All-in-One Printer
+model5=HP PSC 2175 All-in-One Printer
+model6=HP PSC 2179 All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=56 (C6656A) / 27 (C8727A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=57 (C6657A) / 28 (C8728A)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=58 (C6658A)
+r0-agent3-type=3
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJ9xxVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=2b11
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_2200_series]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_LaserJet_2100.png
+io-mfp-mode=6
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 2200 Series Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=C4096A
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=9
+support-released=True
+support-subtype=3752
+support-type=2
+support-ver=0.9.5
+tech-class=LJMono
+tech-subclass=Normal
+tech-type=3
+usb-pid=217
+usb-vid=3f0
+wifi-config=0
+
+[hp_business_inkjet_2200]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=hp_business_inkjet_2200.png
+io-mfp-mode=6
+io-mode=1
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP Business Inkjet 2200 Printer
+model2=HP Business Inkjet 2200se Printer
+model3=HP Business Inkjet 2200xi Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=1
+r0-agent1-sku=11 (C4810A)
+r0-agent1-type=1
+r0-agent2-kind=1
+r0-agent2-sku=11 (C4811A)
+r0-agent2-type=4
+r0-agent3-kind=1
+r0-agent3-sku=11 (C4812A)
+r0-agent3-type=5
+r0-agent4-kind=1
+r0-agent4-sku=11 (C4813A)
+r0-agent4-type=6
+r0-agent5-kind=2
+r0-agent5-sku=10 (C4844A)
+r0-agent5-type=1
+r0-agent6-kind=2
+r0-agent6-sku=11 (C4836AN)
+r0-agent6-type=4
+r0-agent7-kind=2
+r0-agent7-sku=11 (C4837AN)
+r0-agent7-type=5
+r0-agent8-kind=2
+r0-agent8-sku=11 (C4838AN)
+r0-agent8-type=6
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=34c9
+support-type=2
+support-ver=0.9.5
+tech-class=DJ9xxVIP
+tech-subclass=No1200dpiNoSensor
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[psc_2200_series]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=1
+fw-download=False
+icon=default_psc.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP PSC 2200 All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=56 (C6656A) / 27 (C8727A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=57 (C6657A) / 28 (C8728A)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=58 (C6658A)
+r0-agent3-type=3
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=0
+support-type=2
+support-ver=0.9.5
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=2911
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_2200]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_LaserJet_2100.png
+io-mfp-mode=6
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 2200 Printer
+model2=HP LaserJet 2200d Printer
+model3=HP LaserJet 2200dn Printer
+model4=HP LaserJet 2200dse Printer
+model5=HP LaserJet 2200dt Printer
+model6=HP LaserJet 2200dtn Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=C4096A
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=9
+support-released=True
+support-subtype=3fba
+support-type=2
+support-ver=0.9.5
+tech-class=LJMono,Postscript
+tech-subclass=Normal
+tech-type=3
+usb-pid=217
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_f2200_series]
+align-type=13
+clean-type=2
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=psc_1100_series.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet F2210 All-in-One Printer
+model10=HP Deskjet F2276 All-in-One Printer
+model11=HP Deskjet F2280 All-in-One Printer
+model12=HP Deskjet F2288 All-in-One Printer
+model13=HP Deskjet F2290 All-in-One Printer
+model2=HP Deskjet F2212 All-in-One Printer
+model3=HP Deskjet F2214 All-in-One Printer
+model4=HP Deskjet F2224 All-in-One Printer
+model5=HP Deskjet F2235 All-in-One Printer
+model6=HP Deskjet F2238 All-in-One Printer
+model7=HP Deskjet F2240 All-in-One Printer
+model8=HP Deskjet F2250 All-in-One Printer
+model9=HP Deskjet F2275 All-in-One Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=21(C9153A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=22(C9352A)
+r0-agent2-type=2
+r1-agent1-kind=3
+r1-agent1-sku=21(C9351A)
+r1-agent1-type=1
+r1-agent2-kind=3
+r1-agent2-sku=22(C9352A)
+r1-agent2-type=2
+r2-agent1-kind=3
+r2-agent1-sku=21 (C9351A)
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=22 (C9352A)
+r2-agent2-type=2
+r3-agent1-kind=3
+r3-agent1-sku=21 (C9351A)
+r3-agent1-type=1
+r3-agent2-kind=3
+r3-agent2-sku=22 (C9352A)
+r3-agent2-type=2
+r4-agent1-kind=3
+r4-agent1-sku=21 (C9351A)
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=22 (C9352A)
+r4-agent2-type=2
+r5-agent1-kind=3
+r5-agent1-sku=21 (C9351A)
+r5-agent1-type=1
+r5-agent2-kind=3
+r5-agent2-sku=22 (C9352A)
+r5-agent2-type=2
+r6-agent1-kind=3
+r6-agent1-sku=21 (C9351A)
+r6-agent1-type=1
+r6-agent2-kind=3
+r6-agent2-sku=22 (C9352A)
+r6-agent2-type=2
+r7-agent1-kind=3
+r7-agent1-sku=816 (C8816A/B)
+r7-agent1-type=1
+r7-agent2-kind=3
+r7-agent2-sku=817 (C8817A/C8817G)
+r7-agent2-type=2
+r816-agent1-kind=3
+r816-agent1-sku=
+r816-agent1-type=1
+r816-agent2-kind=3
+r816-agent2-sku=
+r816-agent2-type=2
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.8.6
+tech-class=DJ3320
+tech-subclass=Normal
+tech-type=2
+usb-pid=2404
+usb-vid=3f0
+wifi-config=0
+
+[apollo_2200]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_printer.png
+io-mfp-mode=6
+io-mode=0
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=Apollo 2200 Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=0
+support-type=1
+support-ver=0.9.5
+tech-class=AP2xxx
+tech-subclass=Apollo2200
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[psc_2210_series]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=1
+fw-download=False
+icon=default_psc.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP PSC 2210 All-in-One Printer
+model2=HP PSC 2210xi All-in-One Printer
+model3=HP PSC 2210v All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=56 (C6656A) / 27 (C8727A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=57 (C6657A) / 28 (C8728A)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=58 (C6658A)
+r0-agent3-type=3
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=3496
+support-type=2
+support-ver=0.9.5
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_business_inkjet_2230]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=hp_business_inkjet_2200.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Business Inkjet 2230 Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=1
+r0-agent1-sku=11 (C4810A)
+r0-agent1-type=1
+r0-agent2-kind=1
+r0-agent2-sku=11 (C4811A)
+r0-agent2-type=4
+r0-agent3-kind=1
+r0-agent3-sku=11 (C4812A)
+r0-agent3-type=5
+r0-agent4-kind=1
+r0-agent4-sku=11 (C4813A)
+r0-agent4-type=6
+r0-agent5-kind=2
+r0-agent5-sku=10 (C4844A)
+r0-agent5-type=1
+r0-agent6-kind=2
+r0-agent6-sku=11 (C4836AN)
+r0-agent6-type=4
+r0-agent7-kind=2
+r0-agent7-sku=11 (C4837AN)
+r0-agent7-type=5
+r0-agent8-kind=2
+r0-agent8-sku=11 (C4838AN)
+r0-agent8-type=6
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=33b7
+support-type=2
+support-ver=0.9.5
+tech-class=DJ9xxVIP
+tech-subclass=No1200dpiNoSensor
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_business_inkjet_2250]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=hp_business_inkjet_2200.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Business Inkjet 2250 Printer
+model2=HP Business Inkjet 2250tn Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=1
+r0-agent1-sku=11 (C4810A)
+r0-agent1-type=1
+r0-agent2-kind=1
+r0-agent2-sku=11 (C4811A)
+r0-agent2-type=4
+r0-agent3-kind=1
+r0-agent3-sku=11 (C4812A)
+r0-agent3-type=5
+r0-agent4-kind=1
+r0-agent4-sku=11 (C4813A)
+r0-agent4-type=6
+r0-agent5-kind=2
+r0-agent5-sku=10 (C4844A)
+r0-agent5-type=1
+r0-agent6-kind=2
+r0-agent6-sku=11 (C4836AN)
+r0-agent6-type=4
+r0-agent7-kind=2
+r0-agent7-sku=11 (C4837AN)
+r0-agent7-type=5
+r0-agent8-kind=2
+r0-agent8-sku=11 (C4838AN)
+r0-agent8-type=6
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=3812
+support-type=2
+support-ver=0.9.5
+tech-class=DJ9xxVIP,Postscript
+tech-subclass=No1200dpiNoSensor
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[apollo_p2250]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_printer.png
+io-mfp-mode=6
+io-mode=0
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=Apollo P2250 Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=0
+support-type=1
+support-ver=0.9.5
+tech-class=AP2xxx
+tech-subclass=Apollo2200
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_business_inkjet_2280]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=hp_business_inkjet_2200.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Business Inkjet 2280 Printer
+model2=HP Business Inkjet 2280tn Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=1
+r0-agent1-sku=11 (C4810A)
+r0-agent1-type=1
+r0-agent2-kind=1
+r0-agent2-sku=11 (C4811A)
+r0-agent2-type=4
+r0-agent3-kind=1
+r0-agent3-sku=11 (C4812A)
+r0-agent3-type=5
+r0-agent4-kind=1
+r0-agent4-sku=11 (C4813A)
+r0-agent4-type=6
+r0-agent5-kind=2
+r0-agent5-sku=10 (C4844A)
+r0-agent5-type=1
+r0-agent6-kind=2
+r0-agent6-sku=11 (C4836AN)
+r0-agent6-type=4
+r0-agent7-kind=2
+r0-agent7-sku=11 (C4837AN)
+r0-agent7-type=5
+r0-agent8-kind=2
+r0-agent8-sku=11 (C4838AN)
+r0-agent8-type=6
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJ9xxVIP,Postscript
+tech-subclass=No1200dpiNoSensor
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[psc_2300_series]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=default_psc.png
+io-mfp-mode=6
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP PSC 2300 Series All-in-One Printer
+model2=HP PSC 2310 All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=56 (C6656AN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=57 (C6657AN)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=58 (C6658AN)
+r0-agent3-type=3
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=3511
+usb-vid=3f0
+wifi-config=0
+
+[hp_designjet_t2300_postscript]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=1
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Designjet t2300 Postscript
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.11.3
+tech-class=Postscript
+tech-subclass=Normal
+tech-type=2
+usb-pid=f14
+usb-vid=3f0
+wifi-config=0
+
+[hp_business_inkjet_2300]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_business_inkjet_2200.png
+io-mfp-mode=6
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Business Inkjet 2300 Printer
+model2=HP Business Inkjet 2300n Printer
+model3=HP Business Inkjet 2300dtn Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=2
+r0-agent1-sku=10 (C4844A)
+r0-agent1-type=1
+r0-agent2-kind=2
+r0-agent2-sku=11 (C4836AN)
+r0-agent2-type=4
+r0-agent3-kind=2
+r0-agent3-sku=11 (C4837AN)
+r0-agent3-type=5
+r0-agent4-kind=2
+r0-agent4-sku=11 (C4838AN)
+r0-agent4-type=6
+r0-agent5-kind=1
+r0-agent5-sku=11 (C4810A)
+r0-agent5-type=1
+r0-agent6-kind=1
+r0-agent6-sku=11 (C4811A)
+r0-agent6-type=4
+r0-agent7-kind=1
+r0-agent7-sku=11 (C4812A)
+r0-agent7-type=5
+r0-agent8-kind=1
+r0-agent8-sku=11 (C4813A)
+r0-agent8-type=6
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=3ddf
+support-type=2
+support-ver=0.9.5
+tech-class=LJColor,Postscript
+tech-subclass=Normal
+tech-type=2
+usb-pid=812
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_2300]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_LaserJet_2100.png
+io-mfp-mode=6
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 2300 Printer
+model2=HP LaserJet 2300n Printer
+model3=HP LaserJet 2300d Printer
+model4=HP LaserJet 2300dn Printer
+model5=HP LaserJet 2300dtn Printer
+model6=HP LaserJet 2300L Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=Q2160A/Q2610D
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=9
+support-released=True
+support-subtype=3a05
+support-type=2
+support-ver=0.9.5
+tech-class=LJMono,Postscript
+tech-subclass=Normal
+tech-type=3
+usb-pid=b17
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_d2300_series]
+align-type=5
+clean-type=2
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=deskjet_D2360.png
+io-mfp-mode=3
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet D2320 Printer
+model2=HP Deskjet D2330 Printer
+model3=HP Deskjet D2345 Printer
+model4=HP Deskjet D2360 Printer
+model5=HP Deskjet D2368 Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=21
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=22
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=58
+r0-agent3-type=3
+r10-agent1-kind=3
+r10-agent1-sku=816
+r10-agent1-type=1
+r10-agent2-kind=3
+r10-agent2-sku=817
+r10-agent2-type=2
+r10-agent3-kind=3
+r10-agent3-sku=58
+r10-agent3-type=3
+r2-agent1-kind=3
+r2-agent1-sku=21
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=22
+r2-agent2-type=2
+r2-agent3-kind=3
+r2-agent3-sku=58
+r2-agent3-type=3
+r4-agent1-kind=3
+r4-agent1-sku=21
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=22
+r4-agent2-type=2
+r4-agent3-kind=3
+r4-agent3-sku=58
+r4-agent3-type=3
+r8-agent1-kind=3
+r8-agent1-sku=21
+r8-agent1-type=1
+r8-agent2-kind=3
+r8-agent2-sku=22
+r8-agent2-type=2
+r8-agent3-kind=3
+r8-agent3-sku=58
+r8-agent3-type=3
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=1.6.6
+tech-class=DJ3600
+tech-subclass=Normal
+tech-type=2
+usb-pid=c302
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_2300_series]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_LaserJet_2100.png
+io-mfp-mode=6
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 2300 Series Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=Q2160A/Q2610D
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=9
+support-released=True
+support-subtype=3a05
+support-type=2
+support-ver=0.9.5
+tech-class=LJMono
+tech-subclass=Normal
+tech-type=3
+usb-pid=b17
+usb-vid=3f0
+wifi-config=0
+
+[hp_color_laserjet_cm2320_mfp]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=4
+fw-download=False
+icon=hp_color_laserjet_cm1312_mfp.png
+io-mfp-mode=1
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Color LaserJet CM2320 Multifuntion Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=1
+plugin-reason=64
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CC530A
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=CC531A
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=CC533A
+r0-agent3-type=5
+r0-agent4-kind=4
+r0-agent4-sku=CC532A
+r0-agent4-type=6
+scan-src=0
+scan-type=5
+status-battery-check=0
+status-dynamic-counters=0
+status-type=6
+support-released=True
+support-subtype=3ee5
+support-type=2
+support-ver=2.8.10
+tech-class=LJColor,Postscript
+tech-subclass=Normal,Advanced
+tech-type=4
+usb-pid=5917
+usb-vid=3f0
+wifi-config=0
+
+[hp_color_laserjet_cm2320fxi_mfp]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=4
+fw-download=False
+icon=hp_color_laserjet_cm1312_mfp.png
+io-mfp-mode=1
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Color LaserJet CM2320fxi Multifunction Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=1
+plugin-reason=64
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CC530A
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=CC531A
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=CC533A
+r0-agent3-type=5
+r0-agent4-kind=4
+r0-agent4-sku=CC532A
+r0-agent4-type=6
+scan-src=0
+scan-type=5
+status-battery-check=0
+status-dynamic-counters=0
+status-type=6
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.8.10
+tech-class=LJColor,Postscript
+tech-subclass=Normal,Advanced
+tech-type=4
+usb-pid=5b17
+usb-vid=3f0
+wifi-config=0
+
+[hp_color_laserjet_cm2320n_mfp]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=4
+fw-download=False
+icon=hp_color_laserjet_cm1312_mfp.png
+io-mfp-mode=1
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Color LaserJet CM2320n Multifunction Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=1
+plugin-reason=64
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CC530A
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=CC531A
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=CC533A
+r0-agent3-type=5
+r0-agent4-kind=4
+r0-agent4-sku=CC532A
+r0-agent4-type=6
+scan-src=0
+scan-type=5
+status-battery-check=0
+status-dynamic-counters=0
+status-type=6
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.8.10
+tech-class=LJColor,Postscript
+tech-subclass=Normal,Advanced
+tech-type=4
+usb-pid=5917
+usb-vid=3f0
+wifi-config=0
+
+[hp_color_laserjet_cm2320nf_mfp]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=4
+fw-download=False
+icon=hp_color_laserjet_cm1312_mfp.png
+io-mfp-mode=1
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Color LaserJet CM2320nf Multifunction Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=1
+plugin-reason=64
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CC530A
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=CC531A
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=CC533A
+r0-agent3-type=5
+r0-agent4-kind=4
+r0-agent4-sku=CC532A
+r0-agent4-type=6
+scan-src=0
+scan-type=5
+status-battery-check=0
+status-dynamic-counters=0
+status-type=6
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.8.10
+tech-class=LJColor,Postscript
+tech-subclass=Normal,Advanced
+tech-type=4
+usb-pid=5a17
+usb-vid=3f0
+wifi-config=0
+
+[psc_2350_series]
+align-type=1
+clean-type=1
+color-cal-type=3
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=psc_2300_series.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP PSC 2350 All-in-One Printer
+model10=HP PSC 2358 All-in-One Printer
+model2=HP PSC 2352 All-in-One Printer
+model3=HP PSC 2353 All-in-One Printer
+model4=HP PSC 2353p All-in-One Printer
+model5=HP PSC 2355xi All-in-One Printer
+model6=HP PSC 2355v All-in-One Printer
+model7=HP PSC 2355 All-in-One Printer
+model8=HP PSC 2355p All-in-One Printer
+model9=HP PSC 2357 All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=92 (C9361WN)/94 (C8765WN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=93 (C9362WN)/95 (C8766WN)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=99 (C9369WN)
+r0-agent3-type=3
+r1-agent1-kind=3
+r1-agent1-sku=92 (C9361WN)/94 (C8765WN)
+r1-agent1-type=1
+r1-agent2-kind=3
+r1-agent2-sku=93 (C9362WN)/95 (C8766WN)
+r1-agent2-type=2
+r1-agent3-kind=3
+r1-agent3-sku=99 (C9369WN)
+r1-agent3-type=3
+r2-agent1-kind=3
+r2-agent1-sku=92 (C9361WN)/94 (C8765WN)
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=93 (C9362WN)/95 (C8766WN)
+r2-agent2-type=2
+r2-agent3-kind=3
+r2-agent3-sku=99 (C9369WN)
+r2-agent3-type=3
+r3-agent1-kind=3
+r3-agent1-sku=92 (C9361WN)/94 (C8765WN)
+r3-agent1-type=1
+r3-agent2-kind=3
+r3-agent2-sku=93 (C9362WN)/95 (C8766WN)
+r3-agent2-type=2
+r3-agent3-kind=3
+r3-agent3-sku=99 (C9369WN)
+r3-agent3-type=3
+r4-agent1-kind=3
+r4-agent1-sku=337 (C9361EN)/338 (C8765EN)
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=342 (C9362EN)/343 (C8766EN)
+r4-agent2-type=2
+r4-agent3-kind=3
+r4-agent3-sku=348 (C9369EN)
+r4-agent3-type=3
+r5-agent1-kind=3
+r5-agent1-sku=132 (C9361HN)/131 (C8765HN)
+r5-agent1-type=1
+r5-agent2-kind=3
+r5-agent2-sku=136 (C9362HN)/135 (C8766HN)
+r5-agent2-type=2
+r5-agent3-kind=3
+r5-agent3-sku=138 (C9369HN)
+r5-agent3-type=3
+r6-agent1-kind=3
+r6-agent1-sku=132 (C9361HN)/131 (C8765HN)
+r6-agent1-type=1
+r6-agent2-kind=3
+r6-agent2-sku=136 (C9362HN)/135 (C8766HN)
+r6-agent2-type=2
+r6-agent3-kind=3
+r6-agent3-sku=138 (C9369HN)
+r6-agent3-type=3
+r7-agent1-kind=3
+r7-agent1-sku=850 (C9361ZN)/852 (C8765ZN)
+r7-agent1-type=1
+r7-agent2-kind=3
+r7-agent2-sku=854 (C9362ZN)/855 (C8766ZN)
+r7-agent2-type=2
+r7-agent3-kind=3
+r7-agent3-sku=858 (C9369ZN)
+r7-agent3-type=3
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=4911
+usb-vid=3f0
+wifi-config=0
+
+[psc_2400_series]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=1
+fw-download=False
+icon=default_psc.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP PSC 2405 Photosmart All-in-One Printer
+model2=HP PSC 2410xi Photosmart All-in-One Printer
+model3=HP PSC 2410v Photosmart All-in-One Printer
+model4=HP PSC 2410 Photosmart All-in-One Printer
+model5=HP PSC 2420 Photosmart All-in-One Printer
+model6=HP PSC 2450 Photosmart All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=56 (C6656AN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=57 (C6657AN)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=58 (C6658AN)
+r0-agent3-type=3
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=3611
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_f2400_series]
+align-type=13
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=hp_deskjet_f4200.png
+io-mfp-mode=3
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet F2410 All-in-One Printer
+model10=HP Deskjet F2488 All-in-One Printer
+model11=HP Deskjet F2492 All-in-One Printer
+model12=HP Deskjet F2493 All-in-One Printer
+model2=HP Deskjet F2418 All-in-One Printer
+model3=HP Deskjet F2420 All-in-One Printer
+model4=HP Deskjet F2423 All-in-One Printer
+model5=HP Deskjet F2430 All-in-One Printer
+model6=HP Deskjet F2440 All-in-One Printer
+model7=HP Deskjet F2476 All-in-One Printer
+model8=HP Deskjet F2480 All-in-One Printer
+model9=HP Deskjet F2483 All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=60/60XL/60b
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=60/60XL
+r0-agent2-type=2
+r10-agent1-kind=3
+r10-agent1-sku=818/818XL/818b
+r10-agent1-type=1
+r10-agent2-kind=3
+r10-agent2-sku=818/818XL
+r10-agent2-type=2
+r18-agent2-kind=3
+r18-agent2-sku=93/95
+r18-agent2-type=2
+r18-agent3-kind=3
+r18-agent3-sku=99
+r18-agent3-type=3
+r2-agent1-kind=3
+r2-agent1-sku=60/60XL/60b
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=60/60XL
+r2-agent2-type=2
+r4-agent1-kind=3
+r4-agent1-sku=300/300XL/300b
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=300/300XL
+r4-agent2-type=2
+r8-agent1-kind=3
+r8-agent1-sku=121/121XL/121b
+r8-agent1-type=1
+r8-agent2-kind=3
+r8-agent2-sku=121/121XL
+r8-agent2-type=2
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.9.10
+tech-class=ViperMinusVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=7611
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_d2400_series]
+align-type=5
+clean-type=2
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=Deskjet_3740.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet D2430 Printer
+model2=HP Deskjet D2445 Printer
+model3=HP Deskjet D2460 Printer
+model4=HP Deskjet D2466 Printer
+model5=HP Deskjet D2468 Printer
+model6=HP Deskjet D4263 Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=21(C9153A/G)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=22(C9352A/G)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=58 (C6658x)
+r0-agent3-type=3
+r1-agent1-kind=3
+r1-agent1-sku=21(C9351A/G)
+r1-agent1-type=1
+r1-agent2-kind=3
+r1-agent2-sku=22(C9352A/G)
+r1-agent2-type=2
+r1-agent3-kind=3
+r1-agent3-sku=58 (C6658x)
+r1-agent3-type=3
+r10-agent1-kind=3
+r10-agent1-sku=816 (C8816A/B/G)
+r10-agent1-type=1
+r10-agent2-kind=3
+r10-agent2-sku=817 (C8817A/G)
+r10-agent2-type=2
+r10-agent3-kind=3
+r10-agent3-sku=58 (C6658x)
+r10-agent3-type=3
+r2-agent1-kind=3
+r2-agent1-sku=21 (C9351A/G)
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=22 (C9352A/G)
+r2-agent2-type=2
+r2-agent3-kind=3
+r2-agent3-sku=58 (C6658x)
+r2-agent3-type=3
+r3-agent1-kind=3
+r3-agent1-sku=21 (C9351A/G)
+r3-agent1-type=1
+r3-agent2-kind=3
+r3-agent2-sku=22 (C9352A/G)
+r3-agent2-type=2
+r3-agent3-kind=3
+r3-agent3-sku=58 (C6658x)
+r3-agent3-type=3
+r4-agent1-kind=3
+r4-agent1-sku=21 (C9351A/G)
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=22 (C9352A/G)
+r4-agent2-type=2
+r4-agent3-kind=3
+r4-agent3-sku=58 (C6658x)
+r4-agent3-type=3
+r5-agent1-kind=3
+r5-agent1-sku=21 (C9351A/G)
+r5-agent1-type=1
+r5-agent2-kind=3
+r5-agent2-sku=22 (C9352A/G)
+r5-agent2-type=2
+r5-agent3-kind=3
+r5-agent3-sku=58 (C6658x)
+r5-agent3-type=3
+r6-agent1-kind=3
+r6-agent1-sku=21 (C9351A/G)
+r6-agent1-type=1
+r6-agent2-kind=3
+r6-agent2-sku=22 (C9352A/G)
+r6-agent2-type=2
+r6-agent3-kind=3
+r6-agent3-sku=58 (C6658x)
+r6-agent3-type=3
+r7-agent1-kind=3
+r7-agent1-sku=816 (C8816A/B/G)
+r7-agent1-type=1
+r7-agent2-kind=3
+r7-agent2-sku=817 (C8817A/G)
+r7-agent2-type=2
+r7-agent3-kind=3
+r7-agent3-sku=58 (C6658x)
+r7-agent3-type=3
+r8-agent1-kind=3
+r8-agent1-sku=21 (C9351A/G)
+r8-agent1-type=1
+r8-agent2-kind=3
+r8-agent2-sku=22 (C9352A/G)
+r8-agent2-type=2
+r8-agent3-kind=3
+r8-agent3-sku=58 (C6658x)
+r8-agent3-type=3
+r816-agent1-kind=3
+r816-agent1-sku=
+r816-agent1-type=1
+r816-agent2-kind=3
+r816-agent2-sku=
+r816-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=1.7.4
+tech-class=DJ3600
+tech-subclass=Normal
+tech-type=2
+usb-pid=7a04
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_2410]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=laserjet_2410.png
+io-mfp-mode=3
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 2410 Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=Q6511A/Q6511X
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=3c64
+support-type=2
+support-ver=0.9.5
+tech-class=LJMono,Postscript
+tech-subclass=Normal
+tech-type=3
+usb-pid=2517
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_2420]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=laserjet_2410.png
+io-mfp-mode=3
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 2420 Printer
+model2=HP LaserJet 2420d Printer
+model3=HP LaserJet 2420dn Printer
+model4=HP LaserJet 2420n Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=Q6511A/Q6511X
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=3c64
+support-type=2
+support-ver=0.9.5
+tech-class=LJMono,Postscript
+tech-subclass=Normal
+tech-type=3
+usb-pid=2917
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_2430]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=laserjet_2410.png
+io-mfp-mode=3
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 2430t Printer
+model2=HP LaserJet 2430 Printer
+model3=HP LaserJet 2430dtn Printer
+model4=HP LaserJet 2430n Printer
+model5=HP LaserJet 2430tn Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=Q6511A/Q6511X
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=3c64
+support-type=2
+support-ver=0.9.5
+tech-class=LJMono,Postscript
+tech-subclass=Normal
+tech-type=3
+usb-pid=2a17
+usb-vid=3f0
+wifi-config=0
+
+[hp_2500c]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=HP_2500C.png
+io-mfp-mode=6
+io-mode=1
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP 2500c Plus Printer
+model2=HP 2500c Printer
+model3=HP 2500cm Printer
+model4=HP 2500cse Printer
+model5=HP 2500cxi Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=2
+r0-agent1-sku=10 (C4844A)
+r0-agent1-type=1
+r0-agent2-kind=2
+r0-agent2-sku=10 (C4841A)
+r0-agent2-type=4
+r0-agent3-kind=2
+r0-agent3-sku=10 (C4843A)
+r0-agent3-type=5
+r0-agent4-kind=2
+r0-agent4-sku=10 (C4842A)
+r0-agent4-type=6
+r0-agent5-kind=1
+r0-agent5-sku=10 (C4800A)
+r0-agent5-type=1
+r0-agent6-kind=1
+r0-agent6-sku=10 (C4801A)
+r0-agent6-type=4
+r0-agent7-kind=1
+r0-agent7-sku=10 (C4802A)
+r0-agent7-type=5
+r0-agent8-kind=1
+r0-agent8-sku=10 (C4803A)
+r0-agent8-type=6
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=352d
+support-type=2
+support-ver=0.9.5
+tech-class=DJ9xx
+tech-subclass=LargeFormatSuperB,NoPhotoMode
+tech-type=2
+usb-pid=1e04
+usb-vid=3f0
+wifi-config=0
+
+[hp_designjet_2500cp]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=0
+io-mode=0
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP Designjet 2500cp Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=38cb
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_color_laserjet_2500]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=HP_Color_LaserJet_1500.png
+io-mfp-mode=1
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Color LaserJet 2500 Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=00 (C9700A)
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=01 (C9701A)
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=03 (C9703A)
+r0-agent3-type=5
+r0-agent4-kind=4
+r0-agent4-sku=02 (C9702A)
+r0-agent4-type=6
+r0-agent5-kind=5
+r0-agent5-sku=04 (C9704A)
+r0-agent5-type=62
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=35bc
+support-type=2
+support-ver=0.9.5
+tech-class=LJColor,Postscript
+tech-subclass=Normal
+tech-type=4
+usb-pid=717
+usb-vid=3f0
+wifi-config=0
+
+[apollo_2500]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_printer.png
+io-mfp-mode=6
+io-mode=0
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=Apollo 2500 Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=0
+support-type=1
+support-ver=0.9.5
+tech-class=AP2560
+tech-subclass=Apollo2500
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_color_laserjet_2500_series]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=HP_Color_LaserJet_1500.png
+io-mfp-mode=1
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Color LaserJet 2500L Printer
+model2=HP Color LaserJet 2500Lse Printer
+model3=HP Color LaserJet 2500n Printer
+model4=HP Color LaserJet 2500tn Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=00 (C9700A)
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=01 (C9701A)
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=03 (C9703A)
+r0-agent3-type=5
+r0-agent4-kind=4
+r0-agent4-sku=02 (C9702A)
+r0-agent4-type=6
+r0-agent5-kind=5
+r0-agent5-sku=04 (C9704A)
+r0-agent5-type=62
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=35bc
+support-type=2
+support-ver=0.9.5
+tech-class=LJColor
+tech-subclass=Normal
+tech-type=4
+usb-pid=717
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_d2500_series]
+align-type=10
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=Deskjet_5700.png
+io-mfp-mode=3
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet D2530 Printer
+model2=HP Deskjet D2545 Printer
+model3=HP Deskjet D2560 Printer
+model4=HP Deskjet D2563 Printer
+model5=HP Deskjet D2566 Printer
+model6=HP Deskjet D2568 Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=60/60XL/60b
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=60/60XL
+r0-agent2-type=2
+r10-agent1-kind=3
+r10-agent1-sku=818/818XL/818b
+r10-agent1-type=1
+r10-agent2-kind=3
+r10-agent2-sku=818/818XL
+r10-agent2-type=2
+r2-agent1-kind=3
+r2-agent1-sku=60/60XL/60b
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=60/60XL
+r2-agent2-type=2
+r4-agent1-kind=3
+r4-agent1-sku=300/300XL/300b
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=300/300XL
+r4-agent2-type=2
+r8-agent1-kind=3
+r8-agent1-sku=121/121XL/121b
+r8-agent1-type=1
+r8-agent2-kind=3
+r8-agent2-sku=121/121XL
+r8-agent2-type=2
+scan-src=1
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.8.5
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=2504
+usb-vid=3f0
+wifi-config=0
+
+[psc_2500_series]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=1
+fw-download=False
+icon=Photosmart_2600_series.png
+io-mfp-mode=6
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP PSC 2500 Photosmart All-in-One Printer
+model2=HP PSC 2510 Photosmart All-in-One Printer
+model3=HP PSC 2510xi Photosmart All-in-One Printer
+model4=HP PSC 2550 Photosmart All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=56 (C6656AN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=57 (C6657AN)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=58 (C6658AN)
+r0-agent3-type=3
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=3711
+usb-vid=3f0
+wifi-config=0
+
+[hp_color_laserjet_2550]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_color_LaserJet_2550.png
+io-mfp-mode=4
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Color LaserJet 2550 Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=60 (Q3960A)
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=61/71 (Q3961/71A)
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=62/72 (Q3962/72A)
+r0-agent3-type=6
+r0-agent4-kind=4
+r0-agent4-sku=63/73 (Q3963/73A)
+r0-agent4-type=5
+r0-agent5-kind=7
+r0-agent5-sku=64 (Q3964A)
+r0-agent5-type=62
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=0
+support-type=2
+support-ver=0.9.5
+tech-class=Postscript
+tech-subclass=Normal
+tech-type=4
+usb-pid=1c17
+usb-vid=3f0
+wifi-config=0
+
+[hp_color_laserjet_2550_series]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_color_LaserJet_2550.png
+io-mfp-mode=4
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Color LaserJet 2550L Printer
+model2=HP Color LaserJet 2550Ln Printer
+model3=HP Color LaserJet 2550n Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=60 (Q3960A)
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=61/71 (Q3961/71A)
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=62/72 (Q3962/72A)
+r0-agent3-type=6
+r0-agent4-kind=4
+r0-agent4-sku=63/73 (Q3963/73A)
+r0-agent4-type=5
+r0-agent5-kind=7
+r0-agent5-sku=64 (Q3964A)
+r0-agent5-type=62
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=3898
+support-type=2
+support-ver=0.9.5
+tech-class=Postscript
+tech-subclass=Normal
+tech-type=4
+usb-pid=1c17
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_2570_series]
+align-type=1
+clean-type=1
+color-cal-type=3
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=psc_2300_series.png
+io-mfp-mode=3
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart 2570 All-in-One Printer
+model2=HP Photosmart 2571 All-in-One Printer
+model3=HP Photosmart 2573 All-in-One Printer
+model4=HP Photosmart 2574 All-in-One Printer
+model5=HP Photosmart 2575 All-in-One Printer
+model6=HP Photosmart 2575xi All-in-One Printer
+model7=HP Photosmart 2575v All-in-One Printer
+model8=HP Photosmart 2575a All-in-One Printer
+model9=HP Photosmart 2578 All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=94 (C8765WN)/96 (C8767WN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=95 (C8766WN)/97 (C9363WN)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=99 (C9369WN)
+r0-agent3-type=3
+r0-agent4-kind=3
+r0-agent4-sku=100 (C9368AN)
+r0-agent4-type=10
+r1-agent1-kind=3
+r1-agent1-sku=94 (C8765WN)/96 (C8767WN)
+r1-agent1-type=1
+r1-agent2-kind=3
+r1-agent2-sku=95 (C8766WN)/97 (C9363WN)
+r1-agent2-type=2
+r1-agent3-kind=3
+r1-agent3-sku=99 (C9369WN)
+r1-agent3-type=3
+r1-agent4-kind=3
+r1-agent4-sku=100 (C9368AN)
+r1-agent4-type=10
+r2-agent1-kind=3
+r2-agent1-sku=94 (C8765WN)/96 (C8767WN)
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=95 (C8766WN)/97 (C9363WN)
+r2-agent2-type=2
+r2-agent3-kind=3
+r2-agent3-sku=99 (C9369WN)
+r2-agent3-type=3
+r2-agent4-kind=3
+r2-agent4-sku=100 (C9368AN)
+r2-agent4-type=10
+r3-agent1-kind=3
+r3-agent1-sku=94 (C8765WN)/96 (C8767WN)
+r3-agent1-type=1
+r3-agent2-kind=3
+r3-agent2-sku=95 (C8766WN)/97 (C9363WN)
+r3-agent2-type=2
+r3-agent3-kind=3
+r3-agent3-sku=99 (C9369WN)
+r3-agent3-type=3
+r3-agent4-kind=3
+r3-agent4-sku=100 (C9368AN)
+r3-agent4-type=10
+r4-agent1-kind=3
+r4-agent1-sku=339/338
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=344/343
+r4-agent2-type=2
+r4-agent3-kind=3
+r4-agent3-sku=348
+r4-agent3-type=3
+r4-agent4-kind=3
+r4-agent4-sku=100 (C9368AN)
+r4-agent4-type=10
+r5-agent1-kind=3
+r5-agent1-sku=130/131
+r5-agent1-type=1
+r5-agent2-kind=3
+r5-agent2-sku=134/135
+r5-agent2-type=2
+r5-agent3-kind=3
+r5-agent3-sku=138
+r5-agent3-type=3
+r5-agent4-kind=3
+r5-agent4-sku=100 (C9368AN)
+r5-agent4-type=10
+r6-agent1-kind=3
+r6-agent1-sku=130/131
+r6-agent1-type=1
+r6-agent2-kind=3
+r6-agent2-sku=134/135
+r6-agent2-type=2
+r6-agent3-kind=3
+r6-agent3-sku=138
+r6-agent3-type=3
+r6-agent4-kind=3
+r6-agent4-sku=100 (C9368AN)
+r6-agent4-type=10
+r7-agent1-kind=3
+r7-agent1-sku=853/852
+r7-agent1-type=1
+r7-agent2-kind=3
+r7-agent2-sku=857/855
+r7-agent2-type=2
+r7-agent3-kind=3
+r7-agent3-sku=858
+r7-agent3-type=3
+r7-agent4-kind=3
+r7-agent4-sku=100 (C9368AN)
+r7-agent4-type=10
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=4e11
+usb-vid=3f0
+wifi-config=0
+
+[apollo_2600]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_printer.png
+io-mfp-mode=6
+io-mode=0
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=Apollo 2600 Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=0
+support-type=1
+support-ver=0.9.5
+tech-class=AP2560
+tech-subclass=Apollo2500
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_color_laserjet_2600n]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=hp_color_LaserJet_2550.png
+io-mfp-mode=6
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Color LaserJet 2600n Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=1
+plugin-reason=1
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=3cef
+support-type=2
+support-ver=3.9.2
+tech-class=LJZjsColor
+tech-subclass=Normal
+tech-type=4
+usb-pid=2e17
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_2600_series]
+align-type=1
+clean-type=1
+color-cal-type=3
+copy-type=0
+embedded-server-type=1
+fax-type=1
+fw-download=False
+icon=Photosmart_2600_series.png
+io-mfp-mode=6
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart 2605 All-in-One Printer
+model2=HP Photosmart 2608 All-in-One Printer
+model3=HP Photosmart 2610v All-in-One Printer
+model4=HP Photosmart 2610xi All-in-One Printer
+model5=HP Photosmart 2610 All-in-One Printer
+model6=HP Photosmart 2613 All-in-One Printer
+model7=HP Photosmart 2615 All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=94 (C8765WN)/96 (C8767WN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=95 (C8766WN)/97 (C9363WN)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=99 (C9369WN)
+r0-agent3-type=3
+r0-agent4-kind=3
+r0-agent4-sku=100 (C9368AN)
+r0-agent4-type=10
+r1-agent1-kind=3
+r1-agent1-sku=94 (C8765WN)/96 (C8767WN)
+r1-agent1-type=1
+r1-agent2-kind=3
+r1-agent2-sku=95 (C8766WN)/97 (C9363WN)
+r1-agent2-type=2
+r1-agent3-kind=3
+r1-agent3-sku=99 (C9369WN)
+r1-agent3-type=3
+r1-agent4-kind=3
+r1-agent4-sku=100 (C9368AN)
+r1-agent4-type=10
+r2-agent1-kind=3
+r2-agent1-sku=94 (C8765WN)/96 (C8767WN)
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=95 (C8766WN)/97 (C9363WN)
+r2-agent2-type=2
+r2-agent3-kind=3
+r2-agent3-sku=99 (C9369WN)
+r2-agent3-type=3
+r2-agent4-kind=3
+r2-agent4-sku=100 (C9368AN)
+r2-agent4-type=10
+r3-agent1-kind=3
+r3-agent1-sku=94 (C8765WN)/96 (C8767WN)
+r3-agent1-type=1
+r3-agent2-kind=3
+r3-agent2-sku=95 (C8766WN)/97 (C9363WN)
+r3-agent2-type=2
+r3-agent3-kind=3
+r3-agent3-sku=99 (C9369WN)
+r3-agent3-type=3
+r3-agent4-kind=3
+r3-agent4-sku=100 (C9368AN)
+r3-agent4-type=10
+r4-agent1-kind=3
+r4-agent1-sku=339/338
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=344/343
+r4-agent2-type=2
+r4-agent3-kind=3
+r4-agent3-sku=348
+r4-agent3-type=3
+r4-agent4-kind=3
+r4-agent4-sku=100 (C9368AN)
+r4-agent4-type=10
+r5-agent1-kind=3
+r5-agent1-sku=130/131
+r5-agent1-type=1
+r5-agent2-kind=3
+r5-agent2-sku=134/135
+r5-agent2-type=2
+r5-agent3-kind=3
+r5-agent3-sku=138
+r5-agent3-type=3
+r5-agent4-kind=3
+r5-agent4-sku=100 (C9368AN)
+r5-agent4-type=10
+r6-agent1-kind=3
+r6-agent1-sku=130/131
+r6-agent1-type=1
+r6-agent2-kind=3
+r6-agent2-sku=134/135
+r6-agent2-type=2
+r6-agent3-kind=3
+r6-agent3-sku=138
+r6-agent3-type=3
+r6-agent4-kind=3
+r6-agent4-sku=100 (C9368AN)
+r6-agent4-type=10
+r7-agent1-kind=3
+r7-agent1-sku=853/852
+r7-agent1-type=1
+r7-agent2-kind=3
+r7-agent2-sku=857/855
+r7-agent2-type=2
+r7-agent3-kind=3
+r7-agent3-sku=858
+r7-agent3-type=3
+r7-agent4-kind=3
+r7-agent4-sku=100 (C9368AN)
+r7-agent4-type=10
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=4511
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_d2600_series]
+align-type=11
+clean-type=2
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=deskjet_3600.png
+io-mfp-mode=3
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet D2660 Printer
+model2=HP Deskjet D2645 Printer
+model3=HP Deskjet D2663 Printer
+model4=HP Deskjet D2666 Printer
+model5=HP Deskjet D2668 Printer
+model6=HP Deskjet D2680 Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=60/60XL
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=60/60XL
+r0-agent2-type=2
+r10-agent1-kind=3
+r10-agent1-sku=818/818XL
+r10-agent1-type=1
+r10-agent2-kind=3
+r10-agent2-sku=818/818XL
+r10-agent2-type=2
+r2-agent1-kind=3
+r2-agent1-sku=60/60XL
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=60/60XL
+r2-agent2-type=2
+r4-agent1-kind=3
+r4-agent1-sku=300/300XL
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=300/300XL
+r4-agent2-type=2
+r7-agent1-sku=816 (C8816A/B/G)
+r8-agent1-kind=3
+r8-agent1-sku=121/121XL
+r8-agent1-type=1
+r8-agent2-kind=3
+r8-agent2-sku=121/121XL
+r8-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=3
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.9.6
+tech-class=ViperPlusTrim
+tech-subclass=Normal
+tech-type=2
+usb-pid=8011
+usb-vid=3f0
+wifi-config=0
+
+[hp_business_inkjet_2600]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_business_inkjet_2600.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Business Inkjet 2600 Printer
+model2=HP Business Inkjet 2600dn Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=2
+r0-agent1-sku=10 (C4844A)
+r0-agent1-type=1
+r0-agent2-kind=2
+r0-agent2-sku=11 (C4836AN)
+r0-agent2-type=4
+r0-agent3-kind=2
+r0-agent3-sku=11 (C4837AN)
+r0-agent3-type=5
+r0-agent4-kind=2
+r0-agent4-sku=11 (C4838AN)
+r0-agent4-type=6
+r0-agent5-kind=1
+r0-agent5-sku=11 (C4810A)
+r0-agent5-type=1
+r0-agent6-kind=1
+r0-agent6-sku=11 (C4811A)
+r0-agent6-type=4
+r0-agent7-kind=1
+r0-agent7-sku=11 (C4812A)
+r0-agent7-type=5
+r0-agent8-kind=1
+r0-agent8-sku=11 (C4813A)
+r0-agent8-type=6
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=396b
+support-type=2
+support-ver=0.9.5
+tech-class=LJColor,Postscript
+tech-subclass=LargeFormatSuperB
+tech-type=2
+usb-pid=412
+usb-vid=3f0
+wifi-config=0
+
+[hp_color_laserjet_2605]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_color_LaserJet_2550.png
+io-mfp-mode=4
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Color LaserJet 2605 Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=60 (Q6000A)
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=61/71 (Q6001A)
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=62/72 (Q6002A)
+r0-agent3-type=6
+r0-agent4-kind=4
+r0-agent4-sku=63/73 (Q6003A)
+r0-agent4-type=5
+r0-agent5-kind=7
+r0-agent5-sku=64 (Q3964A)
+r0-agent5-type=62
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=6
+support-released=True
+support-subtype=3c73
+support-type=2
+support-ver=0.9.11
+tech-class=Postscript
+tech-subclass=Normal
+tech-type=4
+usb-pid=2f17
+usb-vid=3f0
+wifi-config=0
+
+[hp_color_laserjet_2605dn]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_color_LaserJet_2550.png
+io-mfp-mode=4
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Color LaserJet 2605dn Printer
+model2=HP Color LaserJet 2605dn xi Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=60 (Q6000A)
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=61/71 (Q6001A)
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=62/72 (Q6002A)
+r0-agent3-type=6
+r0-agent4-kind=4
+r0-agent4-sku=63/73 (Q6003A)
+r0-agent4-type=5
+r0-agent5-kind=7
+r0-agent5-sku=64 (Q3964A)
+r0-agent5-type=62
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=6
+support-released=True
+support-subtype=3cef
+support-type=2
+support-ver=0.9.11
+tech-class=Postscript
+tech-subclass=Normal
+tech-type=4
+usb-pid=3117
+usb-vid=3f0
+wifi-config=0
+
+[hp_color_laserjet_2605dtn]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_color_LaserJet_2550.png
+io-mfp-mode=4
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Color LaserJet 2605dtn Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=60 (Q6000A)
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=61/71 (Q6001A)
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=62/72 (Q6002A)
+r0-agent3-type=6
+r0-agent4-kind=4
+r0-agent4-sku=63/73 (Q6003A)
+r0-agent4-type=5
+r0-agent5-kind=7
+r0-agent5-sku=64 (Q3964A)
+r0-agent5-type=62
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=6
+support-released=True
+support-subtype=3c73
+support-type=2
+support-ver=0.9.11
+tech-class=Postscript
+tech-subclass=Normal
+tech-type=4
+usb-pid=3617
+usb-vid=3f0
+wifi-config=0
+
+[apollo_2650]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_printer.png
+io-mfp-mode=6
+io-mode=0
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=Apollo 2650 Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=0
+support-type=1
+support-ver=0.9.5
+tech-class=AP2560
+tech-subclass=Apollo2500
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_2700_series]
+align-type=1
+clean-type=1
+color-cal-type=3
+copy-type=0
+embedded-server-type=1
+fax-type=1
+fw-download=False
+icon=Photosmart_2700_series.png
+io-mfp-mode=6
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart 2710 All-in-One Printer
+model2=HP Photosmart 2710xi All-in-One Printer
+model3=HP Photosmart 2713 All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=94 (C8765WN) /96 (C8767WN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=95 (C8766WN)/97 (C9363WN)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=99 (C9369WN)
+r0-agent3-type=3
+r0-agent4-kind=3
+r0-agent4-sku=100 (C9368AN)
+r0-agent4-type=10
+r1-agent1-kind=3
+r1-agent1-sku=94 (C8765WN)/96 (C8767WN)
+r1-agent1-type=1
+r1-agent2-kind=3
+r1-agent2-sku=95 (C8766WN)/97 (C9363WN)
+r1-agent2-type=2
+r1-agent3-kind=3
+r1-agent3-sku=99 (C9369WN)
+r1-agent3-type=3
+r1-agent4-kind=3
+r1-agent4-sku=100 (C9368AN)
+r1-agent4-type=10
+r2-agent1-kind=3
+r2-agent1-sku=94 (C8765WN)/96 (C8767WN)
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=95 (C8766WN)/97 (C9363WN)
+r2-agent2-type=2
+r2-agent3-kind=3
+r2-agent3-sku=99 (C9369WN)
+r2-agent3-type=3
+r2-agent4-kind=3
+r2-agent4-sku=100 (C9368AN)
+r2-agent4-type=10
+r3-agent1-kind=3
+r3-agent1-sku=94 (C8765WN)/96 (C8767WN)
+r3-agent1-type=1
+r3-agent2-kind=3
+r3-agent2-sku=95 (C8766WN)/97 (C9363WN)
+r3-agent2-type=2
+r3-agent3-kind=3
+r3-agent3-sku=99 (C9369WN)
+r3-agent3-type=3
+r3-agent4-kind=3
+r3-agent4-sku=100 (C9368AN)
+r3-agent4-type=10
+r4-agent1-kind=3
+r4-agent1-sku=339/338
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=344/343
+r4-agent2-type=2
+r4-agent3-kind=3
+r4-agent3-sku=348
+r4-agent3-type=3
+r4-agent4-kind=3
+r4-agent4-sku=100 (C9368AN)
+r4-agent4-type=10
+r5-agent1-kind=3
+r5-agent1-sku=130/131
+r5-agent1-type=1
+r5-agent2-kind=3
+r5-agent2-sku=134/135
+r5-agent2-type=2
+r5-agent3-kind=3
+r5-agent3-sku=138
+r5-agent3-type=3
+r5-agent4-kind=3
+r5-agent4-sku=100 (C9368AN)
+r5-agent4-type=10
+r6-agent1-kind=3
+r6-agent1-sku=130/131
+r6-agent1-type=1
+r6-agent2-kind=3
+r6-agent2-sku=134/135
+r6-agent2-type=2
+r6-agent3-kind=3
+r6-agent3-sku=138
+r6-agent3-type=3
+r6-agent4-kind=3
+r6-agent4-sku=100 (C9368AN)
+r6-agent4-type=10
+r7-agent1-kind=3
+r7-agent1-sku=853/852
+r7-agent1-type=1
+r7-agent2-kind=3
+r7-agent2-sku=857/855
+r7-agent2-type=2
+r7-agent3-kind=3
+r7-agent3-sku=858
+r7-agent3-type=3
+r7-agent4-kind=3
+r7-agent4-sku=100 (C9368AN)
+r7-agent4-type=10
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=4611
+usb-vid=3f0
+wifi-config=0
+
+[hp_color_laserjet_2700n]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_color_LaserJet_2550.png
+io-mfp-mode=4
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Color LaserJet 2700n Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=60 (Q3960A)
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=61/71 (Q3961/71A)
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=62/72 (Q3962/72A)
+r0-agent3-type=6
+r0-agent4-kind=4
+r0-agent4-sku=63/73 (Q3963/73A)
+r0-agent4-type=5
+r0-agent5-kind=7
+r0-agent5-sku=64 (Q3964A)
+r0-agent5-type=62
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=6
+support-released=True
+support-subtype=3c87
+support-type=2
+support-ver=1.6.10
+tech-class=Postscript
+tech-subclass=Normal
+tech-type=4
+usb-pid=3c17
+usb-vid=3f0
+wifi-config=0
+
+[hp_color_laserjet_2700]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_color_LaserJet_2550.png
+io-mfp-mode=4
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Color LaserJet 2700 Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=60 (Q3960A)
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=61/71 (Q3961/71A)
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=62/72 (Q3962/72A)
+r0-agent3-type=6
+r0-agent4-kind=4
+r0-agent4-sku=63/73 (Q3963/73A)
+r0-agent4-type=5
+r0-agent5-kind=7
+r0-agent5-sku=64 (Q3964A)
+r0-agent5-type=62
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=6
+support-released=True
+support-subtype=3c87
+support-type=2
+support-ver=1.6.10
+tech-class=Postscript
+tech-subclass=Normal
+tech-type=4
+usb-pid=3717
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_m2727_mfp]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=4
+fw-download=False
+icon=hp_laserjet_m2727_mfp.png
+io-mfp-mode=1
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet M2727 Multifunction Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=1
+plugin-reason=64
+power-settings=0
+ppd-name=laserjet_m2727_mfp_series
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=Q7573
+r0-agent1-type=1
+scan-src=1
+scan-type=5
+status-battery-check=0
+status-dynamic-counters=0
+status-type=6
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.8.10
+tech-class=LJMono,Postscript
+tech-subclass=Normal
+tech-type=3
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_m2727nfs_mfp]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=4
+fw-download=False
+icon=hp_laserjet_m2727_mfp.png
+io-mfp-mode=1
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet M2727nfs Multifunction Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=1
+plugin-reason=64
+power-settings=0
+ppd-name=laserjet_m2727_mfp_series
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=Q7573
+r0-agent1-type=1
+scan-src=1
+scan-type=5
+status-battery-check=0
+status-dynamic-counters=0
+status-type=6
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.8.10
+tech-class=Postscript
+tech-subclass=Normal
+tech-type=3
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_m2727nf_mfp]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=4
+fw-download=False
+icon=hp_laserjet_m2727_mfp.png
+io-mfp-mode=1
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet M2727nf Multifunction Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=1
+plugin-reason=64
+power-settings=0
+ppd-name=laserjet_m2727_mfp_series
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=Q7573
+r0-agent1-type=1
+scan-src=1
+scan-type=5
+status-battery-check=0
+status-dynamic-counters=0
+status-type=6
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.8.10
+tech-class=Postscript
+tech-subclass=Normal
+tech-type=3
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_designjet_2800cp]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=0
+io-mode=0
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP Designjet 2800cp Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=38cb
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_color_laserjet_2800]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=1
+embedded-server-type=1
+fax-type=1
+fw-download=False
+icon=HP_Color_LaserJet_2840.png
+io-mfp-mode=4
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Color LaserJet 2800 All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=2
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=60 (Q3960A)
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=61/71 (Q3961/71A)
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=62/72 (Q3962/72A)
+r0-agent3-type=6
+r0-agent4-kind=4
+r0-agent4-sku=63/73 (Q3963/73A)
+r0-agent4-type=5
+r0-agent5-kind=7
+r0-agent5-sku=64 (Q3964A)
+r0-agent5-type=62
+scan-src=1
+scan-type=2
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=3ee5
+support-type=2
+support-ver=0.9.5
+tech-class=Postscript
+tech-subclass=Normal
+tech-type=4
+usb-pid=2617
+usb-vid=3f0
+wifi-config=0
+
+[hp_business_inkjet_2800]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_business_inkjet_2600.png
+io-mfp-mode=6
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Business Inkjet 2800 Printer
+model2=HP Business Inkjet 2800dt Printer
+model3=HP Business Inkjet 2800dtn Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=1
+r0-agent1-sku=11 (C4810A)
+r0-agent1-type=1
+r0-agent2-kind=1
+r0-agent2-sku=11 (C4811A)
+r0-agent2-type=4
+r0-agent3-kind=1
+r0-agent3-sku=11 (C4812A)
+r0-agent3-type=5
+r0-agent4-kind=1
+r0-agent4-sku=11 (C4813A)
+r0-agent4-type=6
+r0-agent5-kind=2
+r0-agent5-sku=10 (C4844A)
+r0-agent5-type=1
+r0-agent6-kind=2
+r0-agent6-sku=11 (C4836AN)
+r0-agent6-type=4
+r0-agent7-kind=2
+r0-agent7-sku=11 (C4837AN)
+r0-agent7-type=5
+r0-agent8-kind=2
+r0-agent8-sku=11 (C4838AN)
+r0-agent8-type=6
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=LJColor,Postscript
+tech-subclass=LargeFormatSuperB
+tech-type=2
+usb-pid=1112
+usb-vid=3f0
+wifi-config=0
+
+[hp_color_laserjet_2820]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=1
+embedded-server-type=1
+fax-type=1
+fw-download=False
+icon=HP_Color_LaserJet_2840.png
+io-mfp-mode=4
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Color LaserJet 2820 All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=2
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=60 (Q3960A)
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=61/71 (Q3961/71A)
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=62/72 (Q3962/72A)
+r0-agent3-type=6
+r0-agent4-kind=4
+r0-agent4-sku=63/73 (Q3963/73A)
+r0-agent4-type=5
+r0-agent5-kind=7
+r0-agent5-sku=64 (Q3964A)
+r0-agent5-type=62
+scan-src=1
+scan-type=2
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=3cf0
+support-type=2
+support-ver=0.9.5
+tech-class=Postscript
+tech-subclass=Normal
+tech-type=4
+usb-pid=2617
+usb-vid=3f0
+wifi-config=0
+
+[hp_color_laserjet_2830]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=1
+embedded-server-type=1
+fax-type=1
+fw-download=False
+icon=HP_Color_LaserJet_2840.png
+io-mfp-mode=4
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Color LaserJet 2830 All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=2
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=60 (Q3960A)
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=61/71 (Q3961/71A)
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=62/72 (Q3962/72A)
+r0-agent3-type=6
+r0-agent4-kind=4
+r0-agent4-sku=63/73 (Q3963/73A)
+r0-agent4-type=5
+r0-agent5-kind=7
+r0-agent5-sku=64 (Q3964A)
+r0-agent5-type=62
+scan-src=1
+scan-type=2
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=3ee5
+support-type=2
+support-ver=0.9.5
+tech-class=Postscript
+tech-subclass=Normal
+tech-type=4
+usb-pid=2617
+usb-vid=3f0
+wifi-config=0
+
+[hp_color_laserjet_2840]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=1
+embedded-server-type=1
+fax-type=1
+fw-download=False
+icon=HP_Color_LaserJet_2840.png
+io-mfp-mode=4
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Color LaserJet 2840 All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=2
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=60 (Q3960A)
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=61/71 (Q3961/71A)
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=62/72 (Q3962/72A)
+r0-agent3-type=6
+r0-agent4-kind=4
+r0-agent4-sku=63/73 (Q3963/73A)
+r0-agent4-type=5
+r0-agent5-kind=7
+r0-agent5-sku=64 (Q3964A)
+r0-agent5-type=62
+scan-src=1
+scan-type=2
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=3cf0
+support-type=2
+support-ver=0.9.5
+tech-class=Postscript
+tech-subclass=Normal
+tech-type=4
+usb-pid=2617
+usb-vid=3f0
+wifi-config=0
+
+[hp_business_inkjet_3000]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_business_inkjet_3000.png
+io-mfp-mode=6
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Business Inkjet 3000 Printer
+model2=HP Business Inkjet 3000dtn Printer
+model3=HP Business Inkjet 3000n Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=2
+r0-agent1-sku=10 (C4844A)
+r0-agent1-type=1
+r0-agent2-kind=2
+r0-agent2-sku=12 (C4804A)
+r0-agent2-type=4
+r0-agent3-kind=2
+r0-agent3-sku=12 (C4805A)
+r0-agent3-type=5
+r0-agent4-kind=2
+r0-agent4-sku=12 (C4806A)
+r0-agent4-type=6
+r0-agent5-kind=1
+r0-agent5-sku=12 (C5023A
+r0-agent5-type=1
+r0-agent6-kind=1
+r0-agent6-sku=12 (C5024A)
+r0-agent6-type=4
+r0-agent7-kind=1
+r0-agent7-sku=12 (C5025A)
+r0-agent7-type=5
+r0-agent8-kind=1
+r0-agent8-sku=12 (C5026A)
+r0-agent8-type=6
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=3989
+support-type=2
+support-ver=0.9.5
+tech-class=LJColor,Postscript
+tech-subclass=LargeFormatSuperB
+tech-type=2
+usb-pid=612
+usb-vid=3f0
+wifi-config=0
+
+[hp_color_laserjet_3000]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_color_LaserJet_4600.png
+io-mfp-mode=3
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Color LaserJet 3000 Printer
+model2=HP Color LaserJet 3000n Printer
+model3=HP Color LaserJet 3000dn Printer
+model4=HP Color LaserJet 3000dtn Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=Q6470A
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=Q7581A
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=Q7583A
+r0-agent3-type=5
+r0-agent4-kind=4
+r0-agent4-sku=Q7582A
+r0-agent4-type=6
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=3fa9
+support-type=2
+support-ver=0.9.7
+tech-class=LJColor,Postscript
+tech-subclass=Normal
+tech-type=4
+usb-pid=6717
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_3000_j310_series]
+align-type=16
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=hp_deskjet_f4200.png
+io-mfp-mode=3
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 3000 j310 series
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=61/61XL/61b
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=61/61XL
+r0-agent2-type=2
+r10-agent1-kind=3
+r10-agent1-sku=802/802XL/802b
+r10-agent1-type=1
+r10-agent2-kind=3
+r10-agent2-sku=802/802XL
+r10-agent2-type=2
+r18-agent2-kind=3
+r18-agent2-sku=93/95
+r18-agent2-type=2
+r18-agent3-kind=3
+r18-agent3-sku=99
+r18-agent3-type=3
+r2-agent1-kind=3
+r2-agent1-sku=61/61XL/61b
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=61/61XL
+r2-agent2-type=2
+r4-agent1-kind=3
+r4-agent1-sku=301/301XL/301b
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=301/301XL
+r4-agent2-type=2
+r8-agent1-kind=3
+r8-agent1-sku=122/122XL/122b
+r8-agent1-type=1
+r8-agent2-kind=3
+r8-agent2-sku=122/122XL
+r8-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.10.9
+tech-class=Pyramid
+tech-subclass=NoAutoDuplex,NoCDDVD
+tech-type=2
+usb-pid=9511
+usb-vid=3f0
+wifi-config=1
+
+[hp_designjet_3000cp]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=0
+io-mode=0
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP Designjet 3000cp Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=38cb
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_p3004]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=laserjet_2410.png
+io-mfp-mode=3
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet P3004 Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=Q7551A
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=3b90
+support-type=2
+support-ver=1.6.10
+tech-class=LJMono,Postscript
+tech-subclass=Normal
+tech-type=3
+usb-pid=7617
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_p3005]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=laserjet_2410.png
+io-mfp-mode=3
+io-mode=1
+io-support=6
+job-storage=1
+linefeed-cal-type=0
+model1=HP LaserJet P3005 Printer
+model2=HP LaserJet P3005d Printer
+model3=HP LaserJet P3005dn Printer
+model4=HP LaserJet P3005n Printer
+model5=HP LaserJet P3005x Printer
+model6=HP LaserJet P3005dtn Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=Q7551A
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=4033
+support-type=2
+support-ver=1.6.10
+tech-class=LJMono,Postscript
+tech-subclass=Normal
+tech-type=3
+usb-pid=7317
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_p3010_series]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=laserjet_2410.png
+io-mfp-mode=3
+io-mode=1
+io-support=6
+job-storage=1
+linefeed-cal-type=0
+model1=HP LaserJet P3015 Printer
+model2=HP LaserJet P3011 Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CE255A
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=1
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.9.8
+tech-class=LJMono,Postscript
+tech-subclass=Normal
+tech-type=3
+usb-pid=8d17
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_3015]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=1
+embedded-server-type=1
+fax-type=1
+fw-download=False
+icon=hp_LaserJet_3015.png
+io-mfp-mode=3
+io-mode=1
+io-support=3
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 3015 All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=Q2612A
+r0-agent1-type=1
+scan-src=2
+scan-type=2
+status-battery-check=0
+status-dynamic-counters=0
+status-type=1
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=LJMono,Postscript
+tech-subclass=Normal
+tech-type=3
+usb-pid=1617
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_3020]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=1
+embedded-server-type=1
+fax-type=1
+fw-download=False
+icon=hp_LaserJet_3020.png
+io-mfp-mode=3
+io-mode=1
+io-support=3
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 3020 All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=Q2612A
+r0-agent1-type=1
+scan-src=1
+scan-type=2
+status-battery-check=0
+status-dynamic-counters=0
+status-type=1
+support-released=True
+support-subtype=383b
+support-type=2
+support-ver=0.9.5
+tech-class=LJMono,Postscript
+tech-subclass=Normal
+tech-type=3
+usb-pid=1617
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_m3027_mfp]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_LaserJet_4345_mfp.png
+io-mfp-mode=3
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet M3027 Multifunction Printer
+model2=HP LaserJet M3027x Multifunction Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=Q7551A/X
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=1.6.12
+tech-class=LJMono,Postscript
+tech-subclass=Normal
+tech-type=3
+usb-pid=7a17
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_3030]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=1
+embedded-server-type=1
+fax-type=1
+fw-download=False
+icon=hp_LaserJet_3020.png
+io-mfp-mode=3
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 3030 All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=Q2612A
+r0-agent1-type=1
+scan-src=1
+scan-type=2
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=3af6
+support-type=2
+support-ver=0.9.5
+tech-class=LJMono,Postscript
+tech-subclass=Normal
+tech-type=3
+usb-pid=1617
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_m3035_mfp]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_LaserJet_4345_mfp.png
+io-mfp-mode=4
+io-mode=1
+io-support=6
+job-storage=1
+linefeed-cal-type=0
+model1=HP LaserJet M3035 Multifunction Printer
+model2=HP LaserJet M3035xs Multifunction Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=Q7551A
+r0-agent1-type=1
+r0-agent2-kind=5
+r0-agent2-sku=Q5421A/Q5422A
+r0-agent2-type=62
+r0-agent3-kind=6
+r0-agent3-sku=Q5779A
+r0-agent3-type=62
+scan-src=0
+scan-type=-2
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=1.6.10
+tech-class=LJMono,Postscript
+tech-subclass=LargeFormatA3
+tech-type=3
+usb-pid=7517
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_3050_j610_series]
+align-type=16
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=psc_2300_series.png
+io-mfp-mode=1
+io-mode=1
+io-support=10
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 3050 J610 series
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=61/61XL/61b
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=61/61XL
+r0-agent2-type=2
+r10-agent1-kind=3
+r10-agent1-sku=802/802XL/802b
+r10-agent1-type=1
+r10-agent2-kind=3
+r10-agent2-sku=802/802XL
+r10-agent2-type=2
+r18-agent2-kind=3
+r18-agent2-sku=93/95
+r18-agent2-type=2
+r18-agent3-kind=3
+r18-agent3-sku=99
+r18-agent3-type=3
+r2-agent1-kind=3
+r2-agent1-sku=61/61XL/61b
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=61/61XL
+r2-agent2-type=2
+r4-agent1-kind=3
+r4-agent1-sku=301/301XL/301b
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=301/301XL
+r4-agent2-type=2
+r8-agent1-kind=3
+r8-agent1-sku=122/122XL/122b
+r8-agent1-type=1
+r8-agent2-kind=3
+r8-agent2-sku=122/122XL
+r8-agent2-type=2
+scan-src=1
+scan-type=7
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=39f2
+support-type=2
+support-ver=3.10.9
+tech-class=Pyramid
+tech-subclass=NoAutoDuplex,NoCDDVD
+tech-type=2
+usb-pid=9311
+usb-vid=3f0
+wifi-config=1
+
+[hp_laserjet_3050]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=1
+embedded-server-type=1
+fax-type=1
+fw-download=False
+icon=hp_laserjet_3050.png
+io-mfp-mode=4
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 3050 All-in-One Printer
+model2=HP LaserJet 3050z All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=C7115A/C7115X
+r0-agent1-type=1
+scan-src=2
+scan-type=2
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=3fba
+support-type=2
+support-ver=0.9.8
+tech-class=LJMono,Postscript
+tech-subclass=Normal
+tech-type=3
+usb-pid=3217
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_3050a_j611_series]
+align-type=0
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=psc_2300_series.png
+io-mfp-mode=1
+io-mode=1
+io-support=10
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 3050A J611 series
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=61/61XL/61b
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=61/61XL
+r0-agent2-type=2
+r10-agent1-kind=3
+r10-agent1-sku=802/802XL/802b
+r10-agent1-type=1
+r10-agent2-kind=3
+r10-agent2-sku=802/802XL
+r10-agent2-type=2
+r18-agent2-kind=3
+r18-agent2-sku=93/95
+r18-agent2-type=2
+r18-agent3-kind=3
+r18-agent3-sku=99
+r18-agent3-type=3
+r2-agent1-kind=3
+r2-agent1-sku=61/61XL/61b
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=61/61XL
+r2-agent2-type=2
+r4-agent1-kind=3
+r4-agent1-sku=301/301XL/301b
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=301/301XL
+r4-agent2-type=2
+r8-agent1-kind=3
+r8-agent1-sku=122/122XL/122b
+r8-agent1-type=1
+r8-agent2-kind=3
+r8-agent2-sku=122/122XL
+r8-agent2-type=2
+scan-src=1
+scan-type=7
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.11.7
+tech-class=Pyramid
+tech-subclass=NoAutoDuplex,NoCDDVD
+tech-type=2
+usb-pid=a011
+usb-vid=3f0
+wifi-config=-1
+
+[hp_laserjet_3052]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=1
+embedded-server-type=1
+fax-type=1
+fw-download=False
+icon=hp_LaserJet_3015.png
+io-mfp-mode=4
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 3052 All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=Q2612A
+r0-agent1-type=1
+scan-src=2
+scan-type=2
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=3c64
+support-type=2
+support-ver=0.9.8
+tech-class=LJMono,Postscript
+tech-subclass=Normal
+tech-type=3
+usb-pid=3317
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_3055]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=1
+embedded-server-type=1
+fax-type=1
+fw-download=False
+icon=hp_LaserJet_3020.png
+io-mfp-mode=4
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 3055 All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=C7115A/C7115X
+r0-agent1-type=1
+scan-src=1
+scan-type=2
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=40ac
+support-type=2
+support-ver=0.9.8
+tech-class=LJMono
+tech-subclass=Normal
+tech-type=3
+usb-pid=3417
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_3070_b611_series]
+align-type=0
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=psc_2300_series.png
+io-mfp-mode=3
+io-mode=3
+io-support=10
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 3070 B611 series
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=2
+r0-agent1-sku=564/564XL
+r0-agent1-type=1
+r0-agent2-kind=2
+r0-agent2-sku=564/564XL
+r0-agent2-type=4
+r0-agent3-kind=2
+r0-agent3-sku=564/564XL
+r0-agent3-type=5
+r0-agent4-kind=2
+r0-agent4-sku=564/564XL
+r0-agent4-type=6
+r1-agent1-kind=2
+r1-agent1-sku=364/364XL
+r1-agent1-type=1
+r1-agent2-kind=2
+r1-agent2-sku=364/364XL
+r1-agent2-type=4
+r1-agent3-kind=2
+r1-agent3-sku=364/364XL
+r1-agent3-type=5
+r1-agent4-kind=2
+r1-agent4-sku=364/364XL
+r1-agent4-type=6
+r2-agent1-kind=2
+r2-agent1-sku=178/178XL
+r2-agent1-type=1
+r2-agent2-kind=2
+r2-agent2-sku=178/178XL
+r2-agent2-type=4
+r2-agent3-kind=2
+r2-agent3-sku=178/178XL
+r2-agent3-type=5
+r2-agent4-kind=2
+r2-agent4-sku=178/178XL
+r2-agent4-type=6
+r3-agent1-kind=2
+r3-agent1-sku=862/862XL
+r3-agent1-type=1
+r3-agent2-kind=2
+r3-agent2-sku=862/862XL
+r3-agent2-type=4
+r3-agent3-kind=2
+r3-agent3-sku=862/862XL
+r3-agent3-type=5
+r3-agent4-kind=2
+r3-agent4-sku=862/862XL
+r3-agent4-type=6
+scan-src=1
+scan-type=7
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.11.10
+tech-class=Copperhead
+tech-subclass=Normal
+tech-type=2
+usb-pid=a211
+usb-vid=3f0
+wifi-config=0
+
+[hp_designjet_z3100]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=0
+io-mode=0
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP Designjet Z3100 24-in Photo Printer
+model2=HP Designjet Z3100 44-in Photo Printer
+model3=HP Designjet Z3100ps 24-in Photo Printer
+model4=HP Designjet Z3100ps 44-in Photo Printer
+model5=HP Designjet Z3100 24-in GP Photo Printer/Advanced Profiling Solution Bundle
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=219b2b
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_3100]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=1
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=HP_LaserJet_3200M.png
+io-mfp-mode=6
+io-mode=1
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 3100 All-in-One Printer
+model2=HP LaserJet 3100se All-in-One Printer
+model3=HP LaserJet 3100xi All-in-One Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=2
+scan-type=2
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=336f
+support-type=2
+support-ver=0.9.5
+tech-class=LJMono
+tech-subclass=Normal
+tech-type=3
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_c3100_series]
+align-type=1
+clean-type=1
+color-cal-type=3
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=Photosmart_C3100.png
+io-mfp-mode=3
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart C3110 All-in-One Printer
+model10=HP Photosmart C3183 All-in-One Printer
+model11=HP Photosmart C3188 All-in-One Printer
+model12=HP Photosmart C3190 All-in-One Printer
+model13=HP Photosmart C3193 All-in-One Printer
+model14=HP Photosmart C3194 All-in-One Printer
+model2=HP Photosmart C3125 All-in-One Printer
+model3=HP Photosmart C3135 All-in-One Printer
+model4=HP Photosmart C3140 All-in-One Printer
+model5=HP Photosmart C3150 All-in-One Printer
+model6=HP Photosmart C3170 All-in-One Printer
+model7=HP Photosmart C3173 All-in-One Printer
+model8=HP Photosmart C3175 All-in-One Printer
+model9=HP Photosmart C3180 All-in-One Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=2
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=92
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=93
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=99
+r0-agent3-type=3
+r10-agent1-kind=3
+r10-agent1-sku=850
+r10-agent1-type=1
+r10-agent2-kind=3
+r10-agent2-sku=854/855
+r10-agent2-type=2
+r10-agent3-kind=3
+r10-agent3-sku=858
+r10-agent3-type=3
+r18-agent1-kind=3
+r18-agent1-sku=92
+r18-agent1-type=1
+r18-agent2-kind=3
+r18-agent2-sku=93/95
+r18-agent2-type=2
+r18-agent3-kind=3
+r18-agent3-sku=99
+r18-agent3-type=3
+r2-agent1-kind=3
+r2-agent1-sku=92
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=93
+r2-agent2-type=2
+r2-agent3-kind=3
+r2-agent3-sku=99
+r2-agent3-type=3
+r4-agent1-kind=3
+r4-agent1-sku=336/338
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=342/343
+r4-agent2-type=2
+r4-agent3-kind=3
+r4-agent3-sku=348
+r4-agent3-type=3
+r8-agent1-kind=3
+r8-agent1-sku=132/131
+r8-agent1-type=1
+r8-agent2-kind=3
+r8-agent2-sku=136/135
+r8-agent2-type=2
+r8-agent3-kind=3
+r8-agent3-sku=138
+r8-agent3-type=3
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=1.6.6
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=5611
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_3100_series]
+align-type=1
+clean-type=1
+color-cal-type=4
+copy-type=3
+embedded-server-type=0
+fax-type=1
+fw-download=False
+icon=Photosmart_3300_series.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart 3108 All-in-One Printer
+model2=HP Photosmart 3110 All-in-One Printer
+model3=HP Photosmart 3110v All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=2
+r0-agent1-sku=02 (C9338W)
+r0-agent1-type=1
+r0-agent2-kind=2
+r0-agent2-sku=02 (C9339W)
+r0-agent2-type=4
+r0-agent3-kind=2
+r0-agent3-sku=02 (C9340W)
+r0-agent3-type=5
+r0-agent4-kind=2
+r0-agent4-sku=02 (C9341W)
+r0-agent4-type=6
+r0-agent5-kind=2
+r0-agent5-sku=02 (C8774W)
+r0-agent5-type=7
+r0-agent6-kind=2
+r0-agent6-sku=02 (C8775W)
+r0-agent6-type=8
+r1-agent1-kind=2
+r1-agent1-sku=02 (C9338W)
+r1-agent1-type=1
+r1-agent2-kind=2
+r1-agent2-sku=02 (C9339W)
+r1-agent2-type=4
+r1-agent3-kind=2
+r1-agent3-sku=02 (C9340W)
+r1-agent3-type=5
+r1-agent4-kind=2
+r1-agent4-sku=02 (C9341W)
+r1-agent4-type=6
+r1-agent5-kind=2
+r1-agent5-sku=02 (C8774W)
+r1-agent5-type=7
+r1-agent6-kind=2
+r1-agent6-sku=02 (C8775W)
+r1-agent6-type=8
+r2-agent1-kind=2
+r2-agent1-sku=02 (C9338W)
+r2-agent1-type=1
+r2-agent2-kind=2
+r2-agent2-sku=02 (C9339W)
+r2-agent2-type=4
+r2-agent3-kind=2
+r2-agent3-sku=02 (C9340W)
+r2-agent3-type=5
+r2-agent4-kind=2
+r2-agent4-sku=02 (C9341W)
+r2-agent4-type=6
+r2-agent5-kind=2
+r2-agent5-sku=02 (C8774W)
+r2-agent5-type=7
+r2-agent6-kind=2
+r2-agent6-sku=02 (C8775W)
+r2-agent6-type=8
+r3-agent1-kind=2
+r3-agent1-sku=02 (C9338W)
+r3-agent1-type=1
+r3-agent2-kind=2
+r3-agent2-sku=02 (C9339W)
+r3-agent2-type=4
+r3-agent3-kind=2
+r3-agent3-sku=02 (C9340W)
+r3-agent3-type=5
+r3-agent4-kind=2
+r3-agent4-sku=02 (C9341W)
+r3-agent4-type=6
+r3-agent5-kind=2
+r3-agent5-sku=02 (C8774W)
+r3-agent5-type=7
+r3-agent6-kind=2
+r3-agent6-sku=02 (C8775W)
+r3-agent6-type=8
+r4-agent1-kind=2
+r4-agent1-sku=363 (C9338E)
+r4-agent1-type=1
+r4-agent2-kind=2
+r4-agent2-sku=363 (C9339E)
+r4-agent2-type=4
+r4-agent3-kind=2
+r4-agent3-sku=363 (C9340E)
+r4-agent3-type=5
+r4-agent4-kind=2
+r4-agent4-sku=363 (C9341E)
+r4-agent4-type=6
+r4-agent5-kind=2
+r4-agent5-sku=363 (C8774E)
+r4-agent5-type=7
+r4-agent6-kind=2
+r4-agent6-sku=363 (C8775E)
+r4-agent6-type=8
+r5-agent1-kind=2
+r5-agent1-sku=177 (C9338H)
+r5-agent1-type=1
+r5-agent2-kind=2
+r5-agent2-sku=177 (C9339H)
+r5-agent2-type=4
+r5-agent3-kind=2
+r5-agent3-sku=177 (C9340H)
+r5-agent3-type=5
+r5-agent4-kind=2
+r5-agent4-sku=177 (C9341H)
+r5-agent4-type=6
+r5-agent5-kind=2
+r5-agent5-sku=177 (C8774H)
+r5-agent5-type=7
+r5-agent6-kind=2
+r5-agent6-sku=177 (C8775H)
+r5-agent6-type=8
+r6-agent1-kind=2
+r6-agent1-sku=177 (C9338H)
+r6-agent1-type=1
+r6-agent2-kind=2
+r6-agent2-sku=177 (C9339H)
+r6-agent2-type=4
+r6-agent3-kind=2
+r6-agent3-sku=177 (C9340H)
+r6-agent3-type=5
+r6-agent4-kind=2
+r6-agent4-sku=177 (C9341H)
+r6-agent4-type=6
+r6-agent5-kind=2
+r6-agent5-sku=177 (C8774H)
+r6-agent5-type=7
+r6-agent6-kind=2
+r6-agent6-sku=177 (C8775H)
+r6-agent6-type=8
+r7-agent1-kind=2
+r7-agent1-sku=801 (C9338Z)
+r7-agent1-type=1
+r7-agent2-kind=2
+r7-agent2-sku=801 (C9339Z)
+r7-agent2-type=4
+r7-agent3-kind=2
+r7-agent3-sku=801 (C9340Z)
+r7-agent3-type=5
+r7-agent4-kind=2
+r7-agent4-sku=801 (C9341Z)
+r7-agent4-type=6
+r7-agent5-kind=2
+r7-agent5-sku=801 (C8774Z)
+r7-agent5-type=7
+r7-agent6-kind=2
+r7-agent6-sku=801 (C8775Z)
+r7-agent6-type=8
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=2
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=5011
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_3150]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=1
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=HP_LaserJet_3200M.png
+io-mfp-mode=6
+io-mode=1
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 3150xi All-in-One Printer
+model2=HP LaserJet 3150se All-in-One Printer
+model3=HP LaserJet 3150 All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=2
+scan-type=2
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=3320
+support-type=2
+support-ver=0.9.5
+tech-class=LJMono
+tech-subclass=Normal
+tech-type=3
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_designjet_z3200]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=0
+io-mode=0
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP Designjet Z3200 24-in Photo Printer
+model2=HP Designjet Z3200 44-in Photo Printer
+model3=HP Designjet Z3200ps 44-in Photo Printer
+model4=HP Designjet Z3200ps 24-in Photo Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=219b2b
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_3200m]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=1
+embedded-server-type=1
+fax-type=1
+fw-download=False
+icon=HP_LaserJet_3200M.png
+io-mfp-mode=3
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 3200m All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+ppd-name=laserjet_3200m
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=C4092A
+r0-agent1-type=1
+scan-src=2
+scan-type=2
+status-battery-check=0
+status-dynamic-counters=0
+status-type=9
+support-released=True
+support-subtype=3656
+support-type=2
+support-ver=0.9.5
+tech-class=LJMono,Postscript
+tech-subclass=Normal
+tech-type=3
+usb-pid=117
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_3200_series]
+align-type=1
+clean-type=1
+color-cal-type=4
+copy-type=3
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=Photosmart_3300_series.png
+io-mfp-mode=6
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart 3207 All-in-One Printer
+model2=HP Photosmart 3210 All-in-One Printer
+model3=HP Photosmart 3210xi All-in-One Printer
+model4=HP Photosmart 3210v All-in-One Printer
+model5=HP Photosmart 3210a All-in-One Printer
+model6=HP Photosmart 3213 All-in-One Printer
+model7=HP Photosmart 3214 All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=2
+r0-agent1-sku=02 (C9338W)
+r0-agent1-type=1
+r0-agent2-kind=2
+r0-agent2-sku=02 (C9339W)
+r0-agent2-type=4
+r0-agent3-kind=2
+r0-agent3-sku=02 (C9340W)
+r0-agent3-type=5
+r0-agent4-kind=2
+r0-agent4-sku=02 (C9341W)
+r0-agent4-type=6
+r0-agent5-kind=2
+r0-agent5-sku=02 (C8774W)
+r0-agent5-type=7
+r0-agent6-kind=2
+r0-agent6-sku=02 (C8775W)
+r0-agent6-type=8
+r1-agent1-kind=2
+r1-agent1-sku=02 (C9338W)
+r1-agent1-type=1
+r1-agent2-kind=2
+r1-agent2-sku=02 (C9339W)
+r1-agent2-type=4
+r1-agent3-kind=2
+r1-agent3-sku=02 (C9340W)
+r1-agent3-type=5
+r1-agent4-kind=2
+r1-agent4-sku=02 (C9341W)
+r1-agent4-type=6
+r1-agent5-kind=2
+r1-agent5-sku=02 (C8774W)
+r1-agent5-type=7
+r1-agent6-kind=2
+r1-agent6-sku=02 (C8775W)
+r1-agent6-type=8
+r2-agent1-kind=2
+r2-agent1-sku=02 (C9338W)
+r2-agent1-type=1
+r2-agent2-kind=2
+r2-agent2-sku=02 (C9339W)
+r2-agent2-type=4
+r2-agent3-kind=2
+r2-agent3-sku=02 (C9340W)
+r2-agent3-type=5
+r2-agent4-kind=2
+r2-agent4-sku=02 (C9341W)
+r2-agent4-type=6
+r2-agent5-kind=2
+r2-agent5-sku=02 (C8774W)
+r2-agent5-type=7
+r2-agent6-kind=2
+r2-agent6-sku=02 (C8775W)
+r2-agent6-type=8
+r3-agent1-kind=2
+r3-agent1-sku=02 (C9338W)
+r3-agent1-type=1
+r3-agent2-kind=2
+r3-agent2-sku=02 (C9339W)
+r3-agent2-type=4
+r3-agent3-kind=2
+r3-agent3-sku=02 (C9340W)
+r3-agent3-type=5
+r3-agent4-kind=2
+r3-agent4-sku=02 (C9341W)
+r3-agent4-type=6
+r3-agent5-kind=2
+r3-agent5-sku=02 (C8774W)
+r3-agent5-type=7
+r3-agent6-kind=2
+r3-agent6-sku=02 (C8775W)
+r3-agent6-type=8
+r4-agent1-kind=2
+r4-agent1-sku=363 (C9338E)
+r4-agent1-type=1
+r4-agent2-kind=2
+r4-agent2-sku=363 (C9339E)
+r4-agent2-type=4
+r4-agent3-kind=2
+r4-agent3-sku=363 (C9340E)
+r4-agent3-type=5
+r4-agent4-kind=2
+r4-agent4-sku=363 (C9341E)
+r4-agent4-type=6
+r4-agent5-kind=2
+r4-agent5-sku=363 (C8774E)
+r4-agent5-type=7
+r4-agent6-kind=2
+r4-agent6-sku=363 (C8775E)
+r4-agent6-type=8
+r5-agent1-kind=2
+r5-agent1-sku=177 (C9338H)
+r5-agent1-type=1
+r5-agent2-kind=2
+r5-agent2-sku=177 (C9339H)
+r5-agent2-type=4
+r5-agent3-kind=2
+r5-agent3-sku=177 (C9340H)
+r5-agent3-type=5
+r5-agent4-kind=2
+r5-agent4-sku=177 (C9341H)
+r5-agent4-type=6
+r5-agent5-kind=2
+r5-agent5-sku=177 (C8774H)
+r5-agent5-type=7
+r5-agent6-kind=2
+r5-agent6-sku=177 (C8775H)
+r5-agent6-type=8
+r6-agent1-kind=2
+r6-agent1-sku=177 (C9338H)
+r6-agent1-type=1
+r6-agent2-kind=2
+r6-agent2-sku=177 (C9339H)
+r6-agent2-type=4
+r6-agent3-kind=2
+r6-agent3-sku=177 (C9340H)
+r6-agent3-type=5
+r6-agent4-kind=2
+r6-agent4-sku=177 (C9341H)
+r6-agent4-type=6
+r6-agent5-kind=2
+r6-agent5-sku=177 (C8774H)
+r6-agent5-type=7
+r6-agent6-kind=2
+r6-agent6-sku=177 (C8775H)
+r6-agent6-type=8
+r7-agent1-kind=2
+r7-agent1-sku=801 (C9338Z)
+r7-agent1-type=1
+r7-agent2-kind=2
+r7-agent2-sku=801 (C9339Z)
+r7-agent2-type=4
+r7-agent3-kind=2
+r7-agent3-sku=801 (C9340Z)
+r7-agent3-type=5
+r7-agent4-kind=2
+r7-agent4-sku=801 (C9341Z)
+r7-agent4-type=6
+r7-agent5-kind=2
+r7-agent5-sku=801 (C8774Z)
+r7-agent5-type=7
+r7-agent6-kind=2
+r7-agent6-sku=801 (C8775Z)
+r7-agent6-type=8
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=2
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=5111
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_3200se]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=1
+embedded-server-type=1
+fax-type=1
+fw-download=False
+icon=HP_LaserJet_3200M.png
+io-mfp-mode=3
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 3200 All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=C4092A
+r0-agent1-type=1
+scan-src=2
+scan-type=2
+status-battery-check=0
+status-dynamic-counters=0
+status-type=9
+support-released=True
+support-subtype=3656
+support-type=2
+support-ver=0.9.5
+tech-class=LJMono
+tech-subclass=Normal
+tech-type=3
+usb-pid=117
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_3200]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=1
+embedded-server-type=1
+fax-type=1
+fw-download=False
+icon=HP_LaserJet_3200M.png
+io-mfp-mode=3
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 3200 All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=C4092A
+r0-agent1-type=1
+scan-src=2
+scan-type=2
+status-battery-check=0
+status-dynamic-counters=0
+status-type=9
+support-released=True
+support-subtype=3656
+support-type=2
+support-ver=0.9.5
+tech-class=LJMono
+tech-subclass=Normal
+tech-type=3
+usb-pid=117
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_3300_3310_3320]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=1
+embedded-server-type=1
+fax-type=1
+fw-download=False
+icon=HP_LaserJet_3300_3310_3320.png
+io-mfp-mode=3
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 3300 Multifunction Printer
+model2=HP LaserJet 3310 Digital Printer Copier
+model3=HP LaserJet 3320n Multifunction Printer
+model4=HP LaserJet 3320 Multifunction Printer
+model5=HP LaserJet 3330 Multifunction Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=C7115A/C7115X
+r0-agent1-type=1
+scan-src=1
+scan-type=2
+status-battery-check=0
+status-dynamic-counters=0
+status-type=9
+support-released=True
+support-subtype=3656
+support-type=2
+support-ver=0.9.5
+tech-class=LJMono,Postscript
+tech-subclass=Normal
+tech-type=3
+usb-pid=817
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_3300_series]
+align-type=1
+clean-type=1
+color-cal-type=4
+copy-type=3
+embedded-server-type=1
+fax-type=1
+fw-download=False
+icon=Photosmart_3300_series.png
+io-mfp-mode=6
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart 3308 All-in-One Printer
+model2=HP Photosmart 3310 All-in-One Printer
+model3=HP Photosmart 3310xi All-in-One Printer
+model4=HP Photosmart 3313 All-in-One Printer
+model5=HP Photosmart 3314 All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=2
+r0-agent1-sku=02 (C9338W)
+r0-agent1-type=1
+r0-agent2-kind=2
+r0-agent2-sku=02 (C9339W)
+r0-agent2-type=4
+r0-agent3-kind=2
+r0-agent3-sku=02 (C9340W)
+r0-agent3-type=5
+r0-agent4-kind=2
+r0-agent4-sku=02 (C9341W)
+r0-agent4-type=6
+r0-agent5-kind=2
+r0-agent5-sku=02 (C8774W)
+r0-agent5-type=7
+r0-agent6-kind=2
+r0-agent6-sku=02 (C8775W)
+r0-agent6-type=8
+r1-agent1-kind=2
+r1-agent1-sku=02 (C9338W)
+r1-agent1-type=1
+r1-agent2-kind=2
+r1-agent2-sku=02 (C9339W)
+r1-agent2-type=4
+r1-agent3-kind=2
+r1-agent3-sku=02 (C9340W)
+r1-agent3-type=5
+r1-agent4-kind=2
+r1-agent4-sku=02 (C9341W)
+r1-agent4-type=6
+r1-agent5-kind=2
+r1-agent5-sku=02 (C8774W)
+r1-agent5-type=7
+r1-agent6-kind=2
+r1-agent6-sku=02 (C8775W)
+r1-agent6-type=8
+r2-agent1-kind=2
+r2-agent1-sku=02 (C9338W)
+r2-agent1-type=1
+r2-agent2-kind=2
+r2-agent2-sku=02 (C9339W)
+r2-agent2-type=4
+r2-agent3-kind=2
+r2-agent3-sku=02 (C9340W)
+r2-agent3-type=5
+r2-agent4-kind=2
+r2-agent4-sku=02 (C9341W)
+r2-agent4-type=6
+r2-agent5-kind=2
+r2-agent5-sku=02 (C8774W)
+r2-agent5-type=7
+r2-agent6-kind=2
+r2-agent6-sku=02 (C8775W)
+r2-agent6-type=8
+r3-agent1-kind=2
+r3-agent1-sku=02 (C9338W)
+r3-agent1-type=1
+r3-agent2-kind=2
+r3-agent2-sku=02 (C9339W)
+r3-agent2-type=4
+r3-agent3-kind=2
+r3-agent3-sku=02 (C9340W)
+r3-agent3-type=5
+r3-agent4-kind=2
+r3-agent4-sku=02 (C9341W)
+r3-agent4-type=6
+r3-agent5-kind=2
+r3-agent5-sku=02 (C8774W)
+r3-agent5-type=7
+r3-agent6-kind=2
+r3-agent6-sku=02 (C8775W)
+r3-agent6-type=8
+r4-agent1-kind=2
+r4-agent1-sku=363 (C9338E)
+r4-agent1-type=1
+r4-agent2-kind=2
+r4-agent2-sku=363 (C9339E)
+r4-agent2-type=4
+r4-agent3-kind=2
+r4-agent3-sku=363 (C9340E)
+r4-agent3-type=5
+r4-agent4-kind=2
+r4-agent4-sku=363 (C9341E)
+r4-agent4-type=6
+r4-agent5-kind=2
+r4-agent5-sku=363 (C8774E)
+r4-agent5-type=7
+r4-agent6-kind=2
+r4-agent6-sku=363 (C8775E)
+r4-agent6-type=8
+r5-agent1-kind=2
+r5-agent1-sku=177 (C9338H)
+r5-agent1-type=1
+r5-agent2-kind=2
+r5-agent2-sku=177 (C9339H)
+r5-agent2-type=4
+r5-agent3-kind=2
+r5-agent3-sku=177 (C9340H)
+r5-agent3-type=5
+r5-agent4-kind=2
+r5-agent4-sku=177 (C9341H)
+r5-agent4-type=6
+r5-agent5-kind=2
+r5-agent5-sku=177 (C8774H)
+r5-agent5-type=7
+r5-agent6-kind=2
+r5-agent6-sku=177 (C8775H)
+r5-agent6-type=8
+r6-agent1-kind=2
+r6-agent1-sku=177 (C9338H)
+r6-agent1-type=1
+r6-agent2-kind=2
+r6-agent2-sku=177 (C9339H)
+r6-agent2-type=4
+r6-agent3-kind=2
+r6-agent3-sku=177 (C9340H)
+r6-agent3-type=5
+r6-agent4-kind=2
+r6-agent4-sku=177 (C9341H)
+r6-agent4-type=6
+r6-agent5-kind=2
+r6-agent5-sku=177 (C8774H)
+r6-agent5-type=7
+r6-agent6-kind=2
+r6-agent6-sku=177 (C8775H)
+r6-agent6-type=8
+r7-agent1-kind=2
+r7-agent1-sku=801 (C9338Z)
+r7-agent1-type=1
+r7-agent2-kind=2
+r7-agent2-sku=801 (C9339Z)
+r7-agent2-type=4
+r7-agent3-kind=2
+r7-agent3-sku=801 (C9340Z)
+r7-agent3-type=5
+r7-agent4-kind=2
+r7-agent4-sku=801 (C9341Z)
+r7-agent4-type=6
+r7-agent5-kind=2
+r7-agent5-sku=801 (C8774Z)
+r7-agent5-type=7
+r7-agent6-kind=2
+r7-agent6-sku=801 (C8775Z)
+r7-agent6-type=8
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=2
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=5211
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_3320]
+align-type=4
+clean-type=2
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=deskjet_3320.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 3320v Color Inkjet Printer
+model2=HP Deskjet 3320 Color Inkjet Printer
+model3=HP Deskjet 3322 Color Inkjet Printer
+model4=HP Deskjet 3323 Color Inkjet Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=27 (C8727A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=28 (C8728A)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJ3320
+tech-subclass=Normal
+tech-type=2
+usb-pid=7004
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_3325]
+align-type=4
+clean-type=2
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=deskjet_3325.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 3325 Printer/Scanjet 3530c
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=27 (C8727A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=28 (C8728A)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=357e
+support-type=2
+support-ver=0.9.5
+tech-class=DJ3320
+tech-subclass=Normal
+tech-type=2
+usb-pid=7004
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_3330]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=1
+embedded-server-type=1
+fax-type=1
+fw-download=False
+icon=HP_LaserJet_3300_3310_3320.png
+io-mfp-mode=3
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 3330 Multifunction Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=C7115A/C7115X
+r0-agent1-type=1
+scan-src=1
+scan-type=2
+status-battery-check=0
+status-dynamic-counters=0
+status-type=9
+support-released=True
+support-subtype=0
+support-type=2
+support-ver=0.9.5
+tech-class=LJMono
+tech-subclass=Normal
+tech-type=3
+usb-pid=917
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_3380]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=1
+embedded-server-type=1
+fax-type=1
+fw-download=False
+icon=HP_LaserJet_3300_3310_3320.png
+io-mfp-mode=3
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 3380 All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=C7115A/C7115X
+r0-agent1-type=1
+scan-src=1
+scan-type=2
+status-battery-check=0
+status-dynamic-counters=0
+status-type=9
+support-released=True
+support-subtype=39e5
+support-type=2
+support-ver=0.9.5
+tech-class=LJMono,Postscript
+tech-subclass=Normal
+tech-type=3
+usb-pid=1917
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_3390]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=1
+embedded-server-type=1
+fax-type=1
+fw-download=False
+icon=hp_LaserJet_3020.png
+io-mfp-mode=4
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 3390 All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=C7115A/C7115X
+r0-agent1-type=1
+scan-src=1
+scan-type=2
+status-battery-check=0
+status-dynamic-counters=0
+status-type=9
+support-released=True
+support-subtype=40ac
+support-type=2
+support-ver=0.9.8
+tech-class=LJMono,Postscript
+tech-subclass=Normal
+tech-type=3
+usb-pid=3517
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_3392]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=1
+embedded-server-type=1
+fax-type=1
+fw-download=False
+icon=hp_LaserJet_3020.png
+io-mfp-mode=4
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 3392 All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=C7115A/C7115X
+r0-agent1-type=1
+scan-src=1
+scan-type=2
+status-battery-check=0
+status-dynamic-counters=0
+status-type=9
+support-released=True
+support-subtype=3c64
+support-type=2
+support-ver=0.9.8
+tech-class=LJMono
+tech-subclass=Normal
+tech-type=3
+usb-pid=3517
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_3420]
+align-type=4
+clean-type=2
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=deskjet_3325.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 3420 Color Inkjet Printer
+model2=HP Deskjet 3420v Color Inkjet Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=27 (C8727A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=28 (C8728A)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJ3320
+tech-subclass=CoverMedia
+tech-type=2
+usb-pid=7104
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_3425]
+align-type=4
+clean-type=2
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=deskjet_3425.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 3425 Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=27 (C8727A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=28 (C8728A)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=3825
+support-type=2
+support-ver=0.9.5
+tech-class=DJ3320
+tech-subclass=CoverMedia
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_3450]
+align-type=4
+clean-type=2
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=deskjet_3325.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 3450 Color Inkjet Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=27 (C8727A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=28 (C8728A)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJ3320
+tech-subclass=CoverMedia
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_designjet_3500cp]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=0
+io-mode=0
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP Designjet 3500cp Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=38cb
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_color_laserjet_3500n]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_color_LaserJet_3700.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Color LaserJet 3500n Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=2
+plugin-reason=6
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=70 (Q2670A)
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=71 (Q2671A)
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=73 (Q2673A)
+r0-agent3-type=5
+r0-agent4-kind=4
+r0-agent4-sku=72 (Q2672A)
+r0-agent4-type=6
+r0-agent5-kind=5
+r0-agent5-sku=55 (Q3655A)
+r0-agent5-type=62
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=3af7
+support-type=2
+support-ver=2.7.10
+tech-class=LJJetReady
+tech-subclass=Normal
+tech-type=4
+usb-pid=1517
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_3500]
+align-type=5
+clean-type=2
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=deskjet_3500.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 3500 Color Inkjet Printer
+model2=HP Deskjet 3520w Color Inkjet Printer
+model3=HP Deskjet 3520 Color Inkjet Printer
+model4=HP Deskjet 3520v Color Inkjet Printer
+model5=HP Deskjet 3535 Color Inkjet Printer
+model6=HP Deskjet 3538 Color Inkjet Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=27 (C8727A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=28 (C8728A)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJ3320
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[officejet_j3500_series]
+align-type=6
+clean-type=2
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=1
+fw-download=False
+icon=officejet_j3600_series.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet J3508 All-in-One Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=21
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=22
+r0-agent2-type=2
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.7.9
+tech-class=DJ3600
+tech-subclass=Normal
+tech-type=2
+usb-pid=3112
+usb-vid=3f0
+wifi-config=0
+
+[hp_color_laserjet_3500]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_color_LaserJet_3700.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Color LaserJet 3500 Printer
+model2=HP Color LaserJet 3500dn Printer
+model3=HP Color LaserJet 3500dtn Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=2
+plugin-reason=6
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=70 (Q2670A)
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=71 (Q2671A)
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=73 (Q2673A)
+r0-agent3-type=5
+r0-agent4-kind=4
+r0-agent4-sku=72 (Q2672A)
+r0-agent4-type=6
+r0-agent5-kind=5
+r0-agent5-sku=55 (Q3655A)
+r0-agent5-type=62
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=40ac
+support-type=2
+support-ver=2.7.10
+tech-class=LJJetReady
+tech-subclass=Normal
+tech-type=4
+usb-pid=1517
+usb-vid=3f0
+wifi-config=0
+
+[hp_color_laserjet_cp3505]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_color_laserjet_cp3505.png
+io-mfp-mode=3
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Color LaserJet CP3505n Printer
+model2=HP Color LaserJet CP3505dn Printer
+model3=HP Color LaserJet CP3505x Printer
+model4=HP Color LaserJet CP3505 Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CB400A
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=CB401A
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=CB403A
+r0-agent3-type=5
+r0-agent4-kind=4
+r0-agent4-sku=CB402A
+r0-agent4-type=6
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.7.6
+tech-class=LJColor,Postscript
+tech-subclass=Normal
+tech-type=4
+usb-pid=7817
+usb-vid=3f0
+wifi-config=0
+
+[hp_color_laserjet_cp3525]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_color_laserjet_cp3525.png
+io-mfp-mode=3
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Color LaserJet CP3525 Printer
+model2=HP Color LaserJet CP3525n Printer
+model3=HP Color LaserJet CP3525dn Printer
+model4=HP Color LaserJet CP3525x Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CB400A
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=CB401A
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=CB403A
+r0-agent3-type=5
+r0-agent4-kind=4
+r0-agent4-sku=CB402A
+r0-agent4-type=6
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.8.10
+tech-class=LJColor,Postscript
+tech-subclass=Normal
+tech-type=4
+usb-pid=8517
+usb-vid=3f0
+wifi-config=0
+
+[hp_color_laserjet_cm3530_mfp]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_color_laserjet_cm1312_mfp.png
+io-mfp-mode=3
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Color LaserJet CM3530 Multifunction Printer
+model2=HP Color LaserJet CM3530fs Multifunction Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CC530A
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=CC531A
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=CC533A
+r0-agent3-type=5
+r0-agent4-kind=4
+r0-agent4-sku=CC532A
+r0-agent4-type=6
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.8.10
+tech-class=LJColor,Postscript
+tech-subclass=Normal
+tech-type=4
+usb-pid=8a17
+usb-vid=3f0
+wifi-config=0
+
+[hp_color_laserjet_3550]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_color_LaserJet_3700.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Color LaserJet 3550 Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=2
+plugin-reason=6
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=70 (Q2670A)
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=71 (Q2671A)
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=72 (Q2672A)
+r0-agent3-type=6
+r0-agent4-kind=4
+r0-agent4-sku=73 (Q2673A)
+r0-agent4-type=5
+r0-agent5-kind=5
+r0-agent5-sku=55 (Q3655A)
+r0-agent5-type=62
+r0-agent6-kind=8
+r0-agent6-sku=58 (Q3658A)
+r0-agent6-type=62
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=40ac
+support-type=2
+support-ver=2.7.10
+tech-class=LJJetReady
+tech-subclass=Normal
+tech-type=4
+usb-pid=6117
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_3550]
+align-type=5
+clean-type=2
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=deskjet_3500.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 3550 Color Inkjet Printer
+model2=HP Deskjet 3550v Color Inkjet Printer
+model3=HP Deskjet 3550w Color Inkjet Printer
+model4=HP Deskjet 3558 Color Inkjet Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=27 (C8727A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=28 (C8728A)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJ3320
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_color_laserjet_3550n]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_color_LaserJet_3700.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Color LaserJet 3550n Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=2
+plugin-reason=6
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=70 (Q2670A)
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=71 (Q2671A)
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=72 (Q2672A)
+r0-agent3-type=6
+r0-agent4-kind=4
+r0-agent4-sku=73 (Q2673A)
+r0-agent4-type=5
+r0-agent5-kind=5
+r0-agent5-sku=55 (Q3655A)
+r0-agent5-type=62
+r0-agent6-kind=8
+r0-agent6-sku=58 (Q3658A)
+r0-agent6-type=62
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=3af7
+support-type=2
+support-ver=2.7.10
+tech-class=LJJetReady
+tech-subclass=Normal
+tech-type=4
+usb-pid=6117
+usb-vid=3f0
+wifi-config=0
+
+[hp_color_laserjet_3600]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_color_LaserJet_3700.png
+io-mfp-mode=6
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Color LaserJet 3600 Printer
+model2=HP Color LaserJet 3600n Printer
+model3=HP Color LaserJet 3600dn Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=2
+plugin-reason=6
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=Q6470A
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=Q6471A
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=Q6473A
+r0-agent3-type=5
+r0-agent4-kind=4
+r0-agent4-sku=Q6472A
+r0-agent4-type=6
+r0-agent5-kind=5
+r0-agent5-sku=Q5421A
+r0-agent5-type=62
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.7.10
+tech-class=LJJetReady
+tech-subclass=Normal
+tech-type=4
+usb-pid=6917
+usb-vid=3f0
+wifi-config=0
+
+[officejet_j3600_series]
+align-type=6
+clean-type=2
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=1
+fw-download=False
+icon=officejet_j3600_series.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet J3608 All-in-One Printer
+model2=HP Officejet J3625 All-in-One Printer
+model3=HP Officejet J3635 All-in-One Printer
+model4=HP Officejet J3640 All-in-One Printer
+model5=HP Officejet J3650 All-in-One Printer
+model6=HP Officejet J3680 All-in-One Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=21
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=22
+r0-agent2-type=2
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.7.9
+tech-class=DJ3600
+tech-subclass=Normal
+tech-type=2
+usb-pid=3112
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_3600]
+align-type=5
+clean-type=2
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=deskjet_3600.png
+io-mfp-mode=6
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 3600 Color Inkjet Printer
+model2=HP Deskjet 3620 Color Inkjet Printer
+model3=HP Deskjet 3645 Color Inkjet Printer
+model4=HP Deskjet 3647 Color Inkjet Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=27 (C8727A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=28 (C8728A)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=58 (C6658A)
+r0-agent3-type=3
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=3b04
+support-type=2
+support-ver=0.9.5
+tech-class=DJ3600
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_3650]
+align-type=5
+clean-type=2
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=deskjet_3600.png
+io-mfp-mode=6
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 3620 Color Inkjet Printer
+model2=HP Deskjet 3645 Color Inkjet Printer
+model3=HP Deskjet 3647 Color Inkjet Printer
+model4=HP Deskjet 3650 Color Inkjet Printer
+model5=HP Deskjet 3651 Color Inkjet Printer
+model6=HP Deskjet 3652 Color Inkjet Printer
+model7=HP Deskjet 3653 Color Inkjet Printer
+model8=HP Deskjet 3658 Color Inkjet Printer
+model9=HP Deskjet 3668 Color Inkjet Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=27 (C8727A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=28 (C8728A)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=58 (C6658A)
+r0-agent3-type=3
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJ3600
+tech-subclass=Normal
+tech-type=2
+usb-pid=7204
+usb-vid=3f0
+wifi-config=0
+
+[hp_color_laserjet_3700]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_color_LaserJet_3700.png
+io-mfp-mode=6
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Color LaserJet 3700 Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=70 (Q2670A)
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=81 (Q2681A)
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=82 (Q2682A)
+r0-agent3-type=6
+r0-agent4-kind=4
+r0-agent4-sku=83 (Q2683A)
+r0-agent4-type=5
+r0-agent5-kind=5
+r0-agent5-sku=55 (Q3655A)
+r0-agent5-type=62
+r0-agent6-kind=8
+r0-agent6-sku=58 (Q3658A)
+r0-agent6-type=62
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=3af7
+support-type=2
+support-ver=0.9.5
+tech-class=LJColor,Postscript
+tech-subclass=Normal
+tech-type=4
+usb-pid=a17
+usb-vid=3f0
+wifi-config=0
+
+[hp_color_laserjet_3700n]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_color_LaserJet_3700.png
+io-mfp-mode=6
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Color LaserJet 3700n Printer
+model2=HP Color LaserJet 3700dtn Printer
+model3=HP Color LaserJet 3700dn Printer
+model4=HP Color LaserJet 3700d Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=70 (Q2670A)
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=81 (Q2681A)
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=82 (Q2682A)
+r0-agent3-type=6
+r0-agent4-kind=4
+r0-agent4-sku=83 (Q2683A)
+r0-agent4-type=5
+r0-agent5-kind=5
+r0-agent5-sku=55 (Q3655A)
+r0-agent5-type=62
+r0-agent6-kind=8
+r0-agent6-sku=58 (Q3658A)
+r0-agent6-type=62
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=3af7
+support-type=2
+support-ver=0.9.5
+tech-class=LJColor
+tech-subclass=Normal
+tech-type=4
+usb-pid=a17
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_3740]
+align-type=5
+clean-type=2
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=Deskjet_3740.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 3740 Color Inkjet Printer
+model2=HP Deskjet 3743 Color Inkjet Printer
+model3=HP Deskjet 3744 Color Inkjet Printer
+model4=HP Deskjet 3745 Color Inkjet Printer
+model5=HP Deskjet 3745v Color Inkjet Printer
+model6=HP Deskjet 3747 Color Inkjet Printer
+model7=HP Deskjet 3748 Color Inkjet Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=27 (C8727A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=28 (C8728A)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJ3320
+tech-subclass=Normal
+tech-type=2
+usb-pid=7404
+usb-vid=3f0
+wifi-config=0
+
+[hp_designjet_3800cp]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=0
+io-mode=0
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP Designjet 3800cp Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=38cb
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_color_laserjet_3800]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_color_LaserJet_4600.png
+io-mfp-mode=3
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Color LaserJet 3800 Printer
+model2=HP Color LaserJet 3800n Printer
+model3=HP Color LaserJet 3800dn Printer
+model4=HP Color LaserJet 3800dtn Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=Q6470A
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=Q7581A
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=Q7583A
+r0-agent3-type=5
+r0-agent4-kind=4
+r0-agent4-sku=Q7582A
+r0-agent4-type=6
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=3f10
+support-type=2
+support-ver=0.9.7
+tech-class=LJColor,Postscript
+tech-subclass=Normal
+tech-type=4
+usb-pid=6817
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_3810]
+align-type=3
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=DESKJET_3820.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 3810 Color Inkjet Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=15 (C6615DN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=78 (C6578DN)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=357e
+support-type=2
+support-ver=0.9.5
+tech-class=DJ9xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=1b04
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_3816]
+align-type=3
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=DESKJET_3820.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 3816 Color Inkjet Printer
+model2=HP Deskjet 3818 Color Inkjet Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=15 (C6615DN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=78 (C6578DN)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=357e
+support-type=2
+support-ver=0.9.5
+tech-class=DJ9xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=1a04
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_3819]
+align-type=3
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=DESKJET_3820.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 3819 Color Inkjet Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=15 (C6615DN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=78 (C6578DN)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=0
+support-type=2
+support-ver=0.9.5
+tech-class=DJ9xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=1c04
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_3820]
+align-type=3
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=DESKJET_3820.png
+io-mfp-mode=7
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 3820 Color Inkjet Printer
+model2=HP Deskjet 3820v Color Inkjet Printer
+model3=HP Deskjet 3820w Color Inkjet Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=15 (C6615DN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=78 (C6578DN)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJ9xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=1904
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_3822]
+align-type=3
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=DESKJET_3820.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 3822 Color Inkjet Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=15 (C6615DN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=78 (C6578DN)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=357e
+support-type=2
+support-ver=0.9.5
+tech-class=DJ9xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=1904
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_3840]
+align-type=5
+clean-type=2
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=deskjet_3840.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 3843 Color Inkjet Printer
+model2=HP Deskjet 3844 Color Inkjet Printer
+model3=HP Deskjet 3845xi Color Inkjet Printer
+model4=HP Deskjet 3845 Color Inkjet Printer
+model5=HP Deskjet 3847 Color Inkjet Printer
+model6=HP Deskjet 3848 Color Inkjet Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=27 (C8727A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=28 (C8728A)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=58 (C6658A)
+r0-agent3-type=3
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJ3600
+tech-subclass=Normal
+tech-type=2
+usb-pid=7504
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_3870]
+align-type=3
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=DESKJET_3820.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 3870 Color Inkjet Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=15 (C6615DN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=78 (C6578DN)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=0
+support-type=2
+support-ver=0.9.5
+tech-class=DJ9xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_3900]
+align-type=5
+clean-type=2
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=Deskjet_3740.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 3900 Color Inkjet Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=21 (C9351A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=22 (C9352A)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=0
+support-type=2
+support-ver=0.9.5
+tech-class=DJ3320
+tech-subclass=Normal
+tech-type=2
+usb-pid=7604
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_3910]
+align-type=5
+clean-type=2
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=deskjet_3840.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 3910 Color Inkjet Printer
+model2=HP Deskjet 3915 Color Inkjet Printer
+model3=HP Deskjet 3918 Color Inkjet Printer
+model4=HP Deskjet 3930v Color Inkjet Printer
+model5=HP Deskjet 3930 Color Inkjet Printer
+model6=HP Deskjet 3938 Color Inkjet Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=27 (C8727A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=28 (C8728A)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=58 (C6658A)
+r0-agent3-type=3
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJ3320
+tech-subclass=Normal
+tech-type=2
+usb-pid=7604
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_3920]
+align-type=5
+clean-type=2
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=Deskjet_3740.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 3920 Color Inkjet Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=21 (C9351A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=22 (C9352A)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJ3320
+tech-subclass=Normal
+tech-type=2
+usb-pid=7604
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_3940]
+align-type=5
+clean-type=2
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=Deskjet_3740.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 3940 Color Inkjet Printer
+model2=HP Deskjet 3940v Color Inkjet Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=21 (C9351A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=22 (C9352A)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJ3320
+tech-subclass=Normal
+tech-type=2
+usb-pid=7604
+usb-vid=3f0
+wifi-config=0
+
+[hp_designjet_4000ps]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=1
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Designjet 4000ps
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.11.3
+tech-class=Postscript
+tech-subclass=Normal
+tech-type=2
+usb-pid=714
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_4000_series]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=HP_LaserJet_4000.png
+io-mfp-mode=6
+io-mode=1
+io-support=1
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 4000 Printer
+model2=HP LaserJet 4000n Printer
+model3=HP LaserJet 4000se Printer
+model4=HP LaserJet 4000t Printer
+model5=HP LaserJet 4000tn Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=C4127A/C4127X
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=9
+support-released=True
+support-subtype=3267
+support-type=2
+support-ver=0.9.5
+tech-class=LJMono,Postscript
+tech-subclass=Normal
+tech-type=3
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_designjet_4000ps_(q1274a)]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=1
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Designjet 4000ps
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.11.3
+tech-class=Postscript
+tech-subclass=Normal
+tech-type=2
+usb-pid=714
+usb-vid=3f0
+wifi-config=0
+
+[officejet_4000_k210]
+align-type=14
+clean-type=2
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=deskjet_3600.png
+io-mfp-mode=3
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet 4000 K210 Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=703
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=703
+r0-agent2-type=2
+r10-agent1-kind=3
+r10-agent1-sku=703
+r10-agent1-type=1
+r10-agent2-kind=3
+r10-agent2-sku=703
+r10-agent2-type=2
+r2-agent1-kind=3
+r2-agent1-sku=703
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=703
+r2-agent2-type=2
+r4-agent1-kind=3
+r4-agent1-sku=703
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=703
+r4-agent2-type=2
+r7-agent1-sku=816 (C8816A/B/G)
+r8-agent1-kind=3
+r8-agent1-sku=703
+r8-agent1-type=1
+r8-agent2-kind=3
+r8-agent2-sku=703
+r8-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=3
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.10.4
+tech-class=ViperPlusTrim
+tech-subclass=Normal
+tech-type=2
+usb-pid=9c11
+usb-vid=3f0
+wifi-config=0
+
+[hp_designjet_4000]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=0
+io-mode=0
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP Designjet 4000 Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=4014
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_color_laserjet_cp4005]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_color_laserjet_cp4005.png
+io-mfp-mode=3
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Color LaserJet CP4005n Printer
+model2=HP Color LaserJet CP4005dn Printer
+model3=HP Color LaserJet CP4005 Series Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CB400A
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=CB401A
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=CB403A
+r0-agent3-type=5
+r0-agent4-kind=4
+r0-agent4-sku=CB402A
+r0-agent4-type=6
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=4144
+support-type=2
+support-ver=1.6.12
+tech-class=LJColor,Postscript
+tech-subclass=Normal
+tech-type=4
+usb-pid=7b17
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_p4014n]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=laserjet_2410.png
+io-mfp-mode=3
+io-mode=1
+io-support=6
+job-storage=1
+linefeed-cal-type=0
+model1=HP LaserJet P4014n Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+ppd-name=laserjet_p4010_series
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=Q7551A
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.8.5
+tech-class=LJMono
+tech-subclass=Normal
+tech-type=3
+usb-pid=7317
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_p4014dn]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=laserjet_2410.png
+io-mfp-mode=3
+io-mode=1
+io-support=6
+job-storage=1
+linefeed-cal-type=0
+model1=HP LaserJet P4014dn Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+ppd-name=laserjet_p4010_series
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=Q7551A
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.8.5
+tech-class=LJMono
+tech-subclass=Normal
+tech-type=3
+usb-pid=7317
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_p4014]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=laserjet_2410.png
+io-mfp-mode=3
+io-mode=1
+io-support=6
+job-storage=1
+linefeed-cal-type=0
+model1=HP LaserJet P4014 Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+ppd-name=laserjet_p4010_series
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=Q7551A
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.8.5
+tech-class=LJMono
+tech-subclass=Normal
+tech-type=3
+usb-pid=7317
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_p4015tn]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=laserjet_2410.png
+io-mfp-mode=3
+io-mode=1
+io-support=6
+job-storage=1
+linefeed-cal-type=0
+model1=HP LaserJet P4015tn Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+ppd-name=laserjet_p4010_series
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=Q7551A
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.8.5
+tech-class=LJMono
+tech-subclass=Normal
+tech-type=3
+usb-pid=7317
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_p4015]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=laserjet_2410.png
+io-mfp-mode=3
+io-mode=1
+io-support=6
+job-storage=1
+linefeed-cal-type=0
+model1=HP LaserJet P4015 Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+ppd-name=laserjet_p4010_series
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=Q7551A
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.8.5
+tech-class=LJMono
+tech-subclass=Normal
+tech-type=3
+usb-pid=7317
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_p4015x]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=laserjet_2410.png
+io-mfp-mode=3
+io-mode=1
+io-support=6
+job-storage=1
+linefeed-cal-type=0
+model1=HP LaserJet P4015x Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+ppd-name=laserjet_p4010_series
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=Q7551A
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.8.5
+tech-class=LJMono
+tech-subclass=Normal
+tech-type=3
+usb-pid=7317
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_p4015n]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=laserjet_2410.png
+io-mfp-mode=3
+io-mode=1
+io-support=6
+job-storage=1
+linefeed-cal-type=0
+model1=HP LaserJet P4015n Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+ppd-name=laserjet_p4010_series
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=Q7551A
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.8.5
+tech-class=LJMono
+tech-subclass=Normal
+tech-type=3
+usb-pid=7317
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_p4015dn]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=laserjet_2410.png
+io-mfp-mode=3
+io-mode=1
+io-support=6
+job-storage=1
+linefeed-cal-type=0
+model1=HP LaserJet P4015dn Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+ppd-name=laserjet_p4010_series
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=Q7551A
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.8.5
+tech-class=LJMono
+tech-subclass=Normal
+tech-type=3
+usb-pid=7317
+usb-vid=3f0
+wifi-config=0
+
+[hp_designjet_4020]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=0
+io-mode=0
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP Designjet 4020 42-in Printer
+model2=HP Designjet 4020ps 42-in Printer
+model3=HP Designjet 4520 HD Multifunction Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=219b2b
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_designjet_4020ps]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=1
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Designjet 4020ps
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.9.4
+tech-class=Postscript
+tech-subclass=Normal
+tech-type=2
+usb-pid=714
+usb-vid=3f0
+wifi-config=0
+
+[hp_color_laserjet_cp4020_series]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_color_laserjet_cp3525.png
+io-mfp-mode=3
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Color LaserJet CP4020 Series Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=4
+r0-agent1-sku=CE260A
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=CE261A
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=CE262A
+r0-agent3-type=5
+r0-agent4-kind=4
+r0-agent4-sku=CE263A
+r0-agent4-type=6
+r1-agent1-kind=4
+r1-agent1-sku=CE260X
+r1-agent1-type=1
+r1-agent2-kind=4
+r1-agent2-sku=CE261A
+r1-agent2-type=4
+r1-agent3-kind=4
+r1-agent3-sku=CE262A
+r1-agent3-type=5
+r1-agent4-kind=4
+r1-agent4-sku=CE263A
+r1-agent4-type=6
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.9.12
+tech-class=LJColor,Postscript
+tech-subclass=Normal
+tech-type=4
+usb-pid=8817
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_4050_series]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=HP_LaserJet_4000.png
+io-mfp-mode=3
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 4050 Printer
+model2=HP LaserJet 4050n Printer
+model3=HP LaserJet 4050se Printer
+model4=HP LaserJet 4050t Printer
+model5=HP LaserJet 4050tn Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=C4127A/C4127X
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=9
+support-released=True
+support-subtype=35f9
+support-type=2
+support-ver=0.9.5
+tech-class=LJMono,Postscript
+tech-subclass=Normal
+tech-type=3
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_4100_mfp]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=1
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=HP_LaserJet_4100_MFP.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=1
+linefeed-cal-type=0
+model1=HP LaserJet 4100 Multifunction Printer
+model2=HP LaserJet 4101 Multifunction Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=C8061A/C8061X
+r0-agent1-type=1
+scan-src=1
+scan-type=-2
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=3b71
+support-type=2
+support-ver=0.9.5
+tech-class=LJMono,Postscript
+tech-subclass=Normal
+tech-type=3
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_4100_series]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=HP_LaserJet_4000.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 410dtn Printer
+model2=HP LaserJet 4100tn Printer
+model3=HP LaserJet 4100n Printer
+model4=HP LaserJet 4100 Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=C8061A/C8061X
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=LJMono,Postscript
+tech-subclass=Normal
+tech-type=3
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_c4100_series]
+align-type=1
+clean-type=1
+color-cal-type=3
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=Photosmart_C4100.png
+io-mfp-mode=3
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart C4110 All-in-One Printer
+model10=HP Photosmart C4190 All-in-One Printer
+model11=HP Photosmart C4193 All-in-One Printer
+model12=HP Photosmart C4194 All-in-One Printer
+model2=HP Photosmart C4140 All-in-One Printer
+model3=HP Photosmart C4150 All-in-One Printer
+model4=HP Photosmart C4170 All-in-One Printer
+model5=HP Photosmart C4173 All-in-One Printer
+model6=HP Photosmart C4175 All-in-One Printer
+model7=HP Photosmart C4180 All-in-One Printer
+model8=HP Photosmart C4183 All-in-One Printer
+model9=HP Photosmart C4188 All-in-One Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=2
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=98
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=93/95
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=99
+r0-agent3-type=3
+r0-agent4-kind=3
+r0-agent4-sku=100
+r0-agent4-type=10
+r10-agent1-kind=3
+r10-agent1-sku=851
+r10-agent1-type=1
+r10-agent2-kind=3
+r10-agent2-sku=854/855
+r10-agent2-type=2
+r10-agent3-kind=3
+r10-agent3-sku=858
+r10-agent3-type=3
+r10-agent4-kind=3
+r10-agent4-sku=100
+r10-agent4-type=10
+r2-agent1-kind=3
+r2-agent1-sku=98
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=93/95
+r2-agent2-type=2
+r2-agent3-kind=3
+r2-agent3-sku=99
+r2-agent3-type=3
+r2-agent4-kind=3
+r2-agent4-sku=100
+r2-agent4-type=10
+r4-agent1-kind=3
+r4-agent1-sku=337
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=342/343
+r4-agent2-type=2
+r4-agent3-kind=3
+r4-agent3-sku=348
+r4-agent3-type=3
+r4-agent4-kind=3
+r4-agent4-sku=100
+r4-agent4-type=10
+r8-agent1-kind=3
+r8-agent1-sku=129
+r8-agent1-type=1
+r8-agent2-kind=3
+r8-agent2-sku=136/135
+r8-agent2-type=2
+r8-agent3-kind=3
+r8-agent3-sku=138
+r8-agent3-type=3
+r8-agent4-kind=3
+r8-agent4-sku=100
+r8-agent4-type=10
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=1.6.6
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=5711
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_d4100_series]
+align-type=11
+clean-type=2
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=Deskjet_5400_series.png
+io-mfp-mode=3
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet D4145 Printer
+model2=HP Deskjet D4145 Printer
+model3=HP Deskjet D4155 Printer
+model4=HP Deskjet D4155 Printer
+model5=HP Deskjet D4160 Printer
+model6=HP Deskjet D4163 Printer
+model7=HP Deskjet D4168 Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=92/98
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=93/95
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=99
+r0-agent3-type=3
+r10-agent1-kind=3
+r10-agent1-sku=850/851
+r10-agent1-type=1
+r10-agent2-kind=3
+r10-agent2-sku=854/855
+r10-agent2-type=2
+r10-agent3-kind=3
+r10-agent3-sku=858
+r10-agent3-type=3
+r2-agent1-kind=3
+r2-agent1-sku=92/98
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=93/95
+r2-agent2-type=2
+r2-agent3-kind=3
+r2-agent3-sku=99
+r2-agent3-type=3
+r4-agent1-kind=3
+r4-agent1-sku=336/337
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=342/343
+r4-agent2-type=2
+r4-agent3-kind=3
+r4-agent3-sku=348
+r4-agent3-type=3
+r8-agent1-kind=3
+r8-agent1-sku=132/129
+r8-agent1-type=1
+r8-agent2-kind=3
+r8-agent2-sku=136/135
+r8-agent2-type=2
+r8-agent3-kind=3
+r8-agent3-sku=138
+r8-agent3-type=3
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=3
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=1.6.6
+tech-class=DJ4100
+tech-subclass=Normal
+tech-type=2
+usb-pid=7704
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_f4100_series]
+align-type=5
+clean-type=2
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=psc_1100_series.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet F4135 All-in-One Printer
+model10=HP Deskjet F4190 All-in-One Printer
+model11=HP Deskjet F4194 All-in-One Printer
+model2=HP Deskjet F4140 All-in-One Printer
+model3=HP Deskjet F4150 All-in-One Printer
+model4=HP Deskjet F4172 All-in-One Printer
+model5=HP Deskjet F4172 All-in-One Printer
+model6=HP Deskjet F4175 All-in-One Printer
+model7=HP Deskjet F4180 All-in-One Printer
+model8=HP Deskjet F4185 All-in-One Printer
+model9=HP Deskjet F4188 All-in-One Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=21(C9153A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=22(C9352A)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=58 (C6658x)
+r0-agent3-type=3
+r1-agent1-kind=3
+r1-agent1-sku=21(C9351A)
+r1-agent1-type=1
+r1-agent2-kind=3
+r1-agent2-sku=22(C9352A)
+r1-agent2-type=2
+r1-agent3-kind=3
+r1-agent3-sku=58 (C6658x)
+r1-agent3-type=3
+r2-agent1-kind=3
+r2-agent1-sku=21 (C9351A)
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=22 (C9352A)
+r2-agent2-type=2
+r2-agent3-kind=3
+r2-agent3-sku=58 (C6658x)
+r2-agent3-type=3
+r3-agent1-kind=3
+r3-agent1-sku=21 (C9351A)
+r3-agent1-type=1
+r3-agent2-kind=3
+r3-agent2-sku=22 (C9352A)
+r3-agent2-type=2
+r3-agent3-kind=3
+r3-agent3-sku=58 (C6658x)
+r3-agent3-type=3
+r4-agent1-kind=3
+r4-agent1-sku=21 (C9351A)
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=22 (C9352A)
+r4-agent2-type=2
+r4-agent3-kind=3
+r4-agent3-sku=58 (C6658x)
+r4-agent3-type=3
+r5-agent1-kind=3
+r5-agent1-sku=21 (C9351A)
+r5-agent1-type=1
+r5-agent2-kind=3
+r5-agent2-sku=22 (C9352A)
+r5-agent2-type=2
+r5-agent3-kind=3
+r5-agent3-sku=58 (C6658x)
+r5-agent3-type=3
+r6-agent1-kind=3
+r6-agent1-sku=21 (C9351A)
+r6-agent1-type=1
+r6-agent2-kind=3
+r6-agent2-sku=22 (C9352A)
+r6-agent2-type=2
+r6-agent3-kind=3
+r6-agent3-sku=58 (C6658x)
+r6-agent3-type=3
+r7-agent1-kind=3
+r7-agent1-sku=816 (C8816A/B/G)
+r7-agent1-type=1
+r7-agent2-kind=3
+r7-agent2-sku=817 (C8817A/C8817G)
+r7-agent2-type=2
+r7-agent3-kind=3
+r7-agent3-sku=58 (C6658x)
+r7-agent3-type=3
+r816-agent1-kind=3
+r816-agent1-sku=
+r816-agent1-type=1
+r816-agent2-kind=3
+r816-agent2-sku=
+r816-agent2-type=2
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=1.7.4
+tech-class=DJ3600
+tech-subclass=Normal
+tech-type=2
+usb-pid=7e04
+usb-vid=3f0
+wifi-config=0
+
+[officejet_4100_series]
+align-type=6
+clean-type=2
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=1
+fw-download=False
+icon=officejet_4200_series.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP OfficeJet 4100 Series All-in-One Printer
+model2=HP Officejet 4110xi All-in-One Printer
+model3=HP Officejet 4110 All-in-One Printer
+model4=HP Officejet 4110v All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=56 (C6656AN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=57 (C6657AN)/28 (C8728AN)
+r0-agent2-type=2
+scan-src=2
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=3561
+support-type=2
+support-ver=0.9.5
+tech-class=DJ3320
+tech-subclass=Normal
+tech-type=2
+usb-pid=3111
+usb-vid=3f0
+wifi-config=0
+
+[officejet_4105]
+align-type=6
+clean-type=2
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=1
+fw-download=False
+icon=officejet_4200_series.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet 4105 All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=56 (C6656AN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=57 (C6657AN)/28 (C8728AN)
+r0-agent2-type=2
+scan-src=2
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=359e
+support-type=2
+support-ver=2.7.11
+tech-class=DJ3320
+tech-subclass=Normal
+tech-type=2
+usb-pid=3111
+usb-vid=3f0
+wifi-config=0
+
+[officejet_4115_series]
+align-type=6
+clean-type=2
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=1
+fw-download=False
+icon=officejet_4200_series.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet 4115 All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=56 (C6656AN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=57 (C6657AN)/28 (C8728AN)
+r0-agent2-type=2
+scan-src=2
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=0
+support-type=2
+support-ver=0.9.5
+tech-class=DJ3320
+tech-subclass=Normal
+tech-type=2
+usb-pid=3111
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_4150_series]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=HP_LaserJet_4000.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 4150 Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=C8061A/C8061X
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=0
+support-type=2
+support-ver=0.9.5
+tech-class=LJMono
+tech-subclass=Normal
+tech-type=3
+usb-pid=6017
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_4200]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=default_laserjet.png
+io-mfp-mode=6
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 4200 Printer
+model2=HP LaserJet 4200L Printer
+model3=HP LaserJet 4200Ln Printer
+model4=HP LaserJet 4200Lvn Printer
+model5=HP LaserJet 4200dtn Printer
+model6=HP LaserJet 4200dtns Printer
+model7=HP LaserJet 4200dtnsL Printer
+model8=HP LaserJet 4200n Printer
+model9=HP LaserJet 4200tn Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=Q1338A
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=9
+support-released=True
+support-subtype=39b4
+support-type=2
+support-ver=0.9.5
+tech-class=LJMono,Postscript
+tech-subclass=Normal
+tech-type=3
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_f4200_series]
+align-type=13
+clean-type=1
+color-cal-type=3
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=hp_deskjet_f4200.png
+io-mfp-mode=3
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet F4224 All-in-One Printer
+model10=HP Deskjet F4275 All-in-One Printer
+model11=HP Deskjet F4275 All-in-One Printer
+model12=HP Deskjet F4280 All-in-One Printer
+model13=HP Deskjet F4283 All-in-One Printer
+model14=HP Deskjet F4288 All-in-One Printer
+model15=HP Deskjet F4292 All-in-One Printer
+model16=HP Deskjet F4293 All-in-One Printer
+model17=HP Deskjet F4294 All-in-One Printer
+model2=HP Deskjet F4230 All-in-One Printer
+model3=HP Deskjet F4235 All-in-One Printer
+model4=HP Deskjet F4238 All-in-One Printer
+model5=HP Deskjet F4240 All-in-One Printer
+model6=HP Deskjet F4250 All-in-One Printer
+model7=HP Deskjet F4272 All-in-One Printer
+model8=HP Deskjet F4273 All-in-One Printer
+model9=HP Deskjet F4274 All-in-One Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=60/60XL/60b
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=60/60XL
+r0-agent2-type=2
+r10-agent1-kind=3
+r10-agent1-sku=818/818XL/818b
+r10-agent1-type=1
+r10-agent2-kind=3
+r10-agent2-sku=818/818XL
+r10-agent2-type=2
+r18-agent1-kind=3
+r18-agent1-sku=92/98
+r18-agent1-type=1
+r18-agent2-kind=3
+r18-agent2-sku=93/95
+r18-agent2-type=2
+r18-agent3-kind=3
+r18-agent3-sku=99
+r18-agent3-type=3
+r2-agent1-kind=3
+r2-agent1-sku=60/60XL/60b
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=60/60XL
+r2-agent2-type=2
+r4-agent1-kind=3
+r4-agent1-sku=300/300XL/300b
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=300/300XL
+r4-agent2-type=2
+r8-agent1-kind=3
+r8-agent1-sku=121/121XL/121b
+r8-agent1-type=1
+r8-agent2-kind=3
+r8-agent2-sku=121/121XL
+r8-agent2-type=2
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.8.5
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=2504
+usb-vid=3f0
+wifi-config=0
+
+[officejet_4200_series]
+align-type=5
+clean-type=2
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=1
+fw-download=False
+icon=officejet_4200_series.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet 4200 All-in-One Printer
+model2=HP Officejet 4211 All-in-One Printer
+model3=HP Officejet 4212 All-in-One Printer
+model4=HP Officejet 4215 All-in-One Printer
+model5=HP Officejet 4215xi All-in-One Printer
+model6=HP Officejet 4215v All-in-One Printer
+model7=HP Officejet 4219 All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=58 (C6658AN)
+r0-agent1-type=3
+r0-agent2-kind=3
+r0-agent2-sku=28 (C8728AN)/57 (C6657AN)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=56 (C6656AN)
+r0-agent3-type=1
+scan-src=2
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJ3600
+tech-subclass=Normal
+tech-type=2
+usb-pid=3d11
+usb-vid=3f0
+wifi-config=0
+
+[hp_designjet_scanner_4200]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=0
+io-mode=0
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP Designjet Scanner 4200
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=3b52
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_c4200_series]
+align-type=1
+clean-type=1
+color-cal-type=3
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=Photosmart_C4100.png
+io-mfp-mode=3
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart C4205 All-in-One Printer
+model10=HP Photosmart C4280 All-in-One Printer
+model11=HP Photosmart C4283 All-in-One Printer
+model12=HP Photosmart C4285 All-in-One Printer
+model13=HP Photosmart C4288 All-in-One Printer
+model14=HP Photosmart C4293 All-in-One Printer
+model15=HP Photosmart C4294 All-in-One Printer
+model2=HP Photosmart C4210 All-in-One Printer
+model3=HP Photosmart C4235 All-in-One Printer
+model4=HP Photosmart C4240 All-in-One Printer
+model5=HP Photosmart C4250 All-in-One Printer
+model6=HP Photosmart C4270 All-in-One Printer
+model7=HP Photosmart C4272 All-in-One Printer
+model8=HP Photosmart C4273 All-in-One Printer
+model9=HP Photosmart C4275 All-in-One Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=2
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=74/74XL
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=75/75XL
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=99
+r0-agent3-type=3
+r10-agent1-kind=3
+r10-agent1-sku=860/860XL
+r10-agent1-type=1
+r10-agent2-kind=3
+r10-agent2-sku=861/861XL
+r10-agent2-type=2
+r10-agent3-kind=3
+r10-agent3-sku=858
+r10-agent3-type=3
+r18-agent1-kind=3
+r18-agent1-sku=92/98
+r18-agent1-type=1
+r18-agent2-kind=3
+r18-agent2-sku=93/95
+r18-agent2-type=2
+r18-agent3-kind=3
+r18-agent3-sku=99
+r18-agent3-type=3
+r2-agent1-kind=3
+r2-agent1-sku=74/74XL
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=75/75XL
+r2-agent2-type=2
+r2-agent3-kind=3
+r2-agent3-sku=99
+r2-agent3-type=3
+r4-agent1-kind=3
+r4-agent1-sku=350/350XL
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=351/351XL
+r4-agent2-type=2
+r4-agent3-kind=3
+r4-agent3-sku=348
+r4-agent3-type=3
+r8-agent1-kind=3
+r8-agent1-sku=140/140XL
+r8-agent1-type=1
+r8-agent2-kind=3
+r8-agent2-sku=141/141XL
+r8-agent2-type=2
+r8-agent3-kind=3
+r8-agent3-sku=138
+r8-agent3-type=3
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.7.6
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=5c11
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_d4200_series]
+align-type=11
+clean-type=2
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=deskjet_3600.png
+io-mfp-mode=3
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet D4245 Printer
+model2=HP Deskjet D4260 Printer
+model3=HP Deskjet D4266 Printer
+model4=HP Deskjet D4268 Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=74/74XL
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=75/75XL
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=99
+r0-agent3-type=3
+r10-agent1-kind=3
+r10-agent1-sku=860/860XL
+r10-agent1-type=1
+r10-agent2-kind=3
+r10-agent2-sku=861/861XL
+r10-agent2-type=2
+r10-agent3-kind=3
+r10-agent3-sku=858
+r10-agent3-type=3
+r2-agent1-kind=3
+r2-agent1-sku=74/74XL
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=75/75XL
+r2-agent2-type=2
+r2-agent3-kind=3
+r2-agent3-sku=99
+r2-agent3-type=3
+r4-agent1-kind=3
+r4-agent1-sku=350/350XL
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=351/351XL
+r4-agent2-type=2
+r4-agent3-kind=3
+r4-agent3-sku=348
+r4-agent3-type=3
+r7-agent1-sku=816 (C8816A/B/G)
+r8-agent1-kind=3
+r8-agent1-sku=140/140XL
+r8-agent1-type=1
+r8-agent2-kind=3
+r8-agent2-sku=141/141XL
+r8-agent2-type=2
+r8-agent3-kind=3
+r8-agent3-sku=138
+r8-agent3-type=3
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=3
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=1.7.4
+tech-class=DJ4100
+tech-subclass=Normal
+tech-type=2
+usb-pid=7b04
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_f4210_series]
+align-type=6
+clean-type=1
+color-cal-type=3
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=hp_deskjet_f4200.png
+io-mfp-mode=3
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet F4210 All-in-One Printer
+model2=HP Deskjet F4280 All-in-One
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=60/60XL/60b
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=60/60XL
+r0-agent2-type=2
+r10-agent1-kind=3
+r10-agent1-sku=818/818XL/818b
+r10-agent1-type=1
+r10-agent2-kind=3
+r10-agent2-sku=818/818XL
+r10-agent2-type=2
+r18-agent1-kind=3
+r18-agent1-sku=92/98
+r18-agent1-type=1
+r18-agent2-kind=3
+r18-agent2-sku=93/95
+r18-agent2-type=2
+r18-agent3-kind=3
+r18-agent3-sku=99
+r18-agent3-type=3
+r2-agent1-kind=3
+r2-agent1-sku=60/60XL/60b
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=60/60XL
+r2-agent2-type=2
+r4-agent1-kind=3
+r4-agent1-sku=300/300XL/300b
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=300/300XL
+r4-agent2-type=2
+r8-agent1-kind=3
+r8-agent1-sku=121/121XL/121b
+r8-agent1-type=1
+r8-agent2-kind=3
+r8-agent2-sku=121/121XL
+r8-agent2-type=2
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.8.10
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=2504
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_f4213_series]
+align-type=6
+clean-type=1
+color-cal-type=3
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=hp_deskjet_f4200.png
+io-mfp-mode=3
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet F4213 All-in-One Printer
+model2=HP Deskjet F4280 All-in-One
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=60/60XL/60b
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=60/60XL
+r0-agent2-type=2
+r10-agent1-kind=3
+r10-agent1-sku=818/818XL/818b
+r10-agent1-type=1
+r10-agent2-kind=3
+r10-agent2-sku=818/818XL
+r10-agent2-type=2
+r18-agent1-kind=3
+r18-agent1-sku=92/98
+r18-agent1-type=1
+r18-agent2-kind=3
+r18-agent2-sku=93/95
+r18-agent2-type=2
+r18-agent3-kind=3
+r18-agent3-sku=99
+r18-agent3-type=3
+r2-agent1-kind=3
+r2-agent1-sku=60/60XL/60b
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=60/60XL
+r2-agent2-type=2
+r4-agent1-kind=3
+r4-agent1-sku=300/300XL/300b
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=300/300XL
+r4-agent2-type=2
+r8-agent1-kind=3
+r8-agent1-sku=121/121XL/121b
+r8-agent1-type=1
+r8-agent2-kind=3
+r8-agent2-sku=121/121XL
+r8-agent2-type=2
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.8.10
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=2504
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_4240]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=default_laserjet.png
+io-mfp-mode=4
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 4240n Printer
+model2=HP LaserJet 4240 Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=Q5942A/Q5942X
+r0-agent1-type=1
+r0-agent2-kind=5
+r0-agent2-sku=Q5421A/Q5422A
+r0-agent2-type=62
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=3f20
+support-type=2
+support-ver=0.9.5
+tech-class=LJMono,Postscript
+tech-subclass=Normal
+tech-type=3
+usb-pid=6a17
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_4250]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=default_laserjet.png
+io-mfp-mode=4
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 4250 Printer
+model2=HP LaserJet 4250dtn Printer
+model3=HP LaserJet 4250dtnsl Printer
+model4=HP LaserJet 4250n Printer
+model5=HP LaserJet 4250tn Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=Q5942A/Q5942X
+r0-agent1-type=1
+r0-agent2-kind=5
+r0-agent2-sku=Q5421A/Q5422A
+r0-agent2-type=62
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=9
+support-released=True
+support-subtype=40ac
+support-type=2
+support-ver=0.9.5
+tech-class=LJMono,Postscript
+tech-subclass=Normal
+tech-type=3
+usb-pid=2417
+usb-vid=3f0
+wifi-config=0
+
+[officejet_4255]
+align-type=5
+clean-type=2
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=1
+fw-download=False
+icon=officejet_4200_series.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet 4251 All-in-One Printer
+model2=HP Officejet 4252 All-in-One Printer
+model3=HP Officejet 4255 All-in-One Printer
+model4=HP Officejet 4256 All-in-One Printer
+model5=HP Officejet 4259 All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=58 (C6658AN)
+r0-agent1-type=3
+r0-agent2-kind=3
+r0-agent2-sku=28 (C8728AN)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=56 (C6656AN)
+r0-agent3-type=1
+scan-src=2
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJ3600
+tech-subclass=Normal
+tech-type=2
+usb-pid=3d11
+usb-vid=3f0
+wifi-config=0
+
+[officejet_4300_series]
+align-type=13
+clean-type=2
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=1
+fw-download=False
+icon=officejet_4200_series.png
+io-mfp-mode=3
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet 4308 All-in-One Printer
+model10=HP Officejet 4338 All-in-One Printer
+model11=HP Officejet 4352 All-in-One Printer
+model12=HP Officejet 4353 All-in-One Printer
+model13=HP Officejet 4355 All-in-One Printer
+model14=HP Officejet 4357 All-in-One Printer
+model15=HP Officejet 4359 All-in-One Printer
+model2=HP Officejet 4311 All-in-One Printer
+model3=HP Officejet 4312 All-in-One Printer
+model4=HP Officejet 4314 All-in-One Printer
+model5=HP Officejet 4315 All-in-One Printer
+model6=HP Officejet 4315v All-in-One Printer
+model7=HP Officejet 4315xi All-in-One Printer
+model8=HP Officejet 4317 All-in-One Printer
+model9=HP Officejet 4319 All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=21/27
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=22
+r0-agent2-type=2
+r1-agent1-kind=3
+r1-agent1-sku=21/27
+r1-agent1-type=1
+r1-agent2-kind=3
+r1-agent2-sku=22
+r1-agent2-type=2
+r7-agent1-kind=3
+r7-agent1-sku=816
+r7-agent1-type=1
+r7-agent2-kind=3
+r7-agent2-sku=817
+r7-agent2-type=2
+scan-src=2
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=3
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.11
+tech-class=DJ3320
+tech-subclass=Normal
+tech-type=2
+usb-pid=5411
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_4300]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=default_laserjet.png
+io-mfp-mode=6
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 4300 Printer
+model2=HP LaserJet 4300dtn Printer
+model3=HP LaserJet 4300dtns Printer
+model4=HP LaserJet 4300dtnsL Printer
+model5=HP LaserJet 4300n Printer
+model6=HP LaserJet 4300tn Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=Q1339A
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=9
+support-released=True
+support-subtype=39b4
+support-type=2
+support-ver=0.9.5
+tech-class=LJMono,Postscript
+tech-subclass=Normal
+tech-type=3
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_d4300_series]
+align-type=11
+clean-type=2
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=deskjet_3600.png
+io-mfp-mode=3
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet D4360 Printer
+model2=HP Deskjet D4363 Printer
+model3=HP Deskjet D4368 Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=74/74XL
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=75/75XL
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=99
+r0-agent3-type=3
+r10-agent1-kind=3
+r10-agent1-sku=860/860XL
+r10-agent1-type=1
+r10-agent2-kind=3
+r10-agent2-sku=861/861XL
+r10-agent2-type=2
+r10-agent3-kind=3
+r10-agent3-sku=858
+r10-agent3-type=3
+r2-agent1-kind=3
+r2-agent1-sku=74/74XL
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=75/75XL
+r2-agent2-type=2
+r2-agent3-kind=3
+r2-agent3-sku=99
+r2-agent3-type=3
+r4-agent1-kind=3
+r4-agent1-sku=350/350XL
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=351/351XL
+r4-agent2-type=2
+r4-agent3-kind=3
+r4-agent3-sku=348
+r4-agent3-type=3
+r7-agent1-sku=816 (C8816A/B/G)
+r8-agent1-kind=3
+r8-agent1-sku=140/140XL
+r8-agent1-type=1
+r8-agent2-kind=3
+r8-agent2-sku=141/141XL
+r8-agent2-type=2
+r8-agent3-kind=3
+r8-agent3-sku=138
+r8-agent3-type=3
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=3
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.8.6
+tech-class=DJ4100
+tech-subclass=Normal
+tech-type=2
+usb-pid=1f04
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_c4340_series]
+align-type=13
+clean-type=1
+color-cal-type=3
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=Photosmart_C4100.png
+io-mfp-mode=3
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart C4340 All-in-One Printer
+model2=HP Photosmart C4342 All-in-One Printer
+model3=HP Photosmart C4343 All-in-One Printer
+model4=HP Photosmart C4344 All-in-One Printer
+model5=HP Photosmart C4345 All-in-One Printer
+model6=HP Photosmart C4348 All-in-One Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=2
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=74/74XL
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=75/75XL
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=99
+r0-agent3-type=3
+r10-agent1-kind=3
+r10-agent1-sku=860/860XL
+r10-agent1-type=1
+r10-agent2-kind=3
+r10-agent2-sku=861/861XL
+r10-agent2-type=2
+r10-agent3-kind=3
+r10-agent3-sku=858
+r10-agent3-type=3
+r18-agent1-kind=3
+r18-agent1-sku=92/98
+r18-agent1-type=1
+r18-agent2-kind=3
+r18-agent2-sku=93/95
+r18-agent2-type=2
+r18-agent3-kind=3
+r18-agent3-sku=99
+r18-agent3-type=3
+r2-agent1-kind=3
+r2-agent1-sku=74/74XL
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=75/75XL
+r2-agent2-type=2
+r2-agent3-kind=3
+r2-agent3-sku=99
+r2-agent3-type=3
+r4-agent1-kind=3
+r4-agent1-sku=350/350XL
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=351/351XL
+r4-agent2-type=2
+r4-agent3-kind=3
+r4-agent3-sku=348
+r4-agent3-type=3
+r8-agent1-kind=3
+r8-agent1-sku=140/140XL
+r8-agent1-type=1
+r8-agent2-kind=3
+r8-agent2-sku=141/141XL
+r8-agent2-type=2
+r8-agent3-kind=3
+r8-agent3-sku=138
+r8-agent3-type=3
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.8.4
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=6711
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_4345_mfp]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_LaserJet_4345_mfp.png
+io-mfp-mode=4
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 4345 Multifunction Printer
+model2=HP LaserJet 4345x Multifunction Printer
+model3=HP LaserJet 4345xs Multifunction Printer
+model4=HP LaserJet 4345xm Multifunction Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=Q5945A
+r0-agent1-type=1
+r0-agent2-kind=5
+r0-agent2-sku=Q5421A/Q5422A
+r0-agent2-type=62
+r0-agent3-kind=6
+r0-agent3-sku=Q5779A
+r0-agent3-type=62
+scan-src=0
+scan-type=-2
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=3f7b
+support-type=2
+support-ver=0.9.5
+tech-class=LJMono,Postscript
+tech-subclass=Normal
+tech-type=3
+usb-pid=7417
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_m4345_mfp]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_LaserJet_4345_mfp.png
+io-mfp-mode=4
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet M4345 Multifunction Printer
+model2=HP LaserJet M4345x Multifunction Printer
+model3=HP LaserJet M4345xs Multifunction Printer
+model4=HP LaserJet M4345xm Multifunction Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=Q5945A
+r0-agent1-type=1
+r0-agent2-kind=5
+r0-agent2-sku=Q5421A/Q5422A
+r0-agent2-type=62
+r0-agent3-kind=6
+r0-agent3-sku=Q5779A
+r0-agent3-type=62
+scan-src=0
+scan-type=-2
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=1.6.10
+tech-class=LJMono,Postscript
+tech-subclass=Normal
+tech-type=3
+usb-pid=7417
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_m4349_mfp]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_LaserJet_4345_mfp.png
+io-mfp-mode=4
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet M4349 MFP
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CE267C
+r0-agent1-type=1
+r0-agent2-kind=5
+r0-agent2-sku=Q5421A/Q5422A
+r0-agent2-type=62
+r0-agent3-kind=6
+r0-agent3-sku=Q5779A
+r0-agent3-type=62
+scan-src=0
+scan-type=-2
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.9.6
+tech-class=LJMono,Postscript
+tech-subclass=Normal
+tech-type=3
+usb-pid=9717
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_4350]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=default_laserjet.png
+io-mfp-mode=4
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 4350 Printer
+model2=HP LaserJet 4350dtn Printer
+model3=HP LaserJet 4350dtnsl Printer
+model4=HP LaserJet 4350n Printer
+model5=HP LaserJet 4350tn Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=Q5942A/Q5942X
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=9
+support-released=True
+support-subtype=3f30
+support-type=2
+support-ver=0.9.5
+tech-class=LJMono,Postscript
+tech-subclass=Normal
+tech-type=3
+usb-pid=2317
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_c4380_series]
+align-type=1
+clean-type=1
+color-cal-type=3
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=Photosmart_C4100.png
+io-mfp-mode=3
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart C4380 All-in-One Printer
+model2=HP Photosmart C4383 All-in-One Printer
+model3=HP Photosmart C4384 All-in-One Printer
+model4=HP Photosmart C4385 All-in-One Printer
+model5=HP Photosmart C4388 All-in-One Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=2
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=74/74XL
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=75/75XL
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=99
+r0-agent3-type=3
+r10-agent1-kind=3
+r10-agent1-sku=860/860XL
+r10-agent1-type=1
+r10-agent2-kind=3
+r10-agent2-sku=861/861XL
+r10-agent2-type=2
+r10-agent3-kind=3
+r10-agent3-sku=858
+r10-agent3-type=3
+r18-agent1-kind=3
+r18-agent1-sku=92/98
+r18-agent1-type=1
+r18-agent2-kind=3
+r18-agent2-sku=93/95
+r18-agent2-type=2
+r18-agent3-kind=3
+r18-agent3-sku=99
+r18-agent3-type=3
+r2-agent1-kind=3
+r2-agent1-sku=74/74XL
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=75/75XL
+r2-agent2-type=2
+r2-agent3-kind=3
+r2-agent3-sku=99
+r2-agent3-type=3
+r4-agent1-kind=3
+r4-agent1-sku=350/350XL
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=351/351XL
+r4-agent2-type=2
+r4-agent3-kind=3
+r4-agent3-sku=348
+r4-agent3-type=3
+r8-agent1-kind=3
+r8-agent1-sku=140/140XL
+r8-agent1-type=1
+r8-agent2-kind=3
+r8-agent2-sku=141/141XL
+r8-agent2-type=2
+r8-agent3-kind=3
+r8-agent3-sku=138
+r8-agent3-type=3
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.7.10
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=6611
+usb-vid=3f0
+wifi-config=1
+
+[photosmart_c4400_series]
+align-type=1
+clean-type=1
+color-cal-type=3
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=Photosmart_C4100.png
+io-mfp-mode=3
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart C4410 All-in-One Printer
+model10=HP Photosmart C4483 All-in-One Printer
+model11=HP Photosmart C4485 All-in-One Printer
+model12=HP Photosmart C4486 All-in-One Printer
+model13=HP Photosmart C4488 All-in-One Printer
+model14=HP Photosmart C4490 All-in-One Printer
+model15=HP Photosmart C4493 All-in-One Printer
+model16=HP Photosmart C4494 All-in-One Printer
+model2=HP Photosmart C4424 All-in-One Printer
+model3=HP Photosmart C4435 All-in-One Printer
+model4=HP Photosmart C4440 All-in-One Printer
+model5=HP Photosmart C4450 All-in-One Printer
+model6=HP Photosmart C4470 All-in-One Printer
+model7=HP Photosmart C4472 All-in-One Printer
+model8=HP Photosmart C4473 All-in-One Printer
+model9=HP Photosmart C4480 All-in-One Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=2
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=74/74XL
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=75/75XL
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=99
+r0-agent3-type=3
+r10-agent1-kind=3
+r10-agent1-sku=860/860XL
+r10-agent1-type=1
+r10-agent2-kind=3
+r10-agent2-sku=861/861XL
+r10-agent2-type=2
+r10-agent3-kind=3
+r10-agent3-sku=858
+r10-agent3-type=3
+r18-agent1-kind=3
+r18-agent1-sku=92/98
+r18-agent1-type=1
+r18-agent2-kind=3
+r18-agent2-sku=93/95
+r18-agent2-type=2
+r18-agent3-kind=3
+r18-agent3-sku=99
+r18-agent3-type=3
+r2-agent1-kind=3
+r2-agent1-sku=74/74XL
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=75/75XL
+r2-agent2-type=2
+r2-agent3-kind=3
+r2-agent3-sku=99
+r2-agent3-type=3
+r4-agent1-kind=3
+r4-agent1-sku=350/350XL
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=351/351XL
+r4-agent2-type=2
+r4-agent3-kind=3
+r4-agent3-sku=348
+r4-agent3-type=3
+r8-agent1-kind=3
+r8-agent1-sku=140/140XL
+r8-agent1-type=1
+r8-agent2-kind=3
+r8-agent2-sku=141/141XL
+r8-agent2-type=2
+r8-agent3-kind=3
+r8-agent3-sku=138
+r8-agent3-type=3
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.8.5
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=6c11
+usb-vid=3f0
+wifi-config=0
+
+[officejet_4400_k410]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=hp_deskjet_f4200.png
+io-mfp-mode=3
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet 4400 K410 All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=703
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=703
+r0-agent2-type=2
+r10-agent1-kind=3
+r10-agent1-sku=703
+r10-agent1-type=1
+r10-agent2-kind=3
+r10-agent2-sku=703
+r10-agent2-type=2
+r18-agent2-kind=3
+r18-agent2-sku=93/95
+r18-agent2-type=2
+r18-agent3-kind=3
+r18-agent3-sku=99
+r18-agent3-type=3
+r2-agent1-kind=3
+r2-agent1-sku=703
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=703
+r2-agent2-type=2
+r4-agent1-kind=3
+r4-agent1-sku=703
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=703
+r4-agent2-type=2
+r8-agent1-kind=3
+r8-agent1-sku=703
+r8-agent1-type=1
+r8-agent2-kind=3
+r8-agent2-sku=703
+r8-agent2-type=2
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.10.4
+tech-class=ViperPlusVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=9d11
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_f4400_series]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=hp_deskjet_f4200.png
+io-mfp-mode=3
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet F4440 All-in-One Printer
+model10=HP Deskjet F4492 All-in-One Printer
+model2=HP Deskjet F4435 All-in-One Printer
+model3=HP Deskjet F4450 All-in-One Printer
+model4=HP Deskjet F4470 All-in-One Printer
+model5=HP Deskjet F4472 All-in-One Printer
+model6=HP Deskjet F4473 All-in-One Printer
+model7=HP Deskjet F4480 All-in-One Printer
+model8=HP Deskjet F4483 All-in-One Printer
+model9=HP Deskjet F4488 All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=60/60XL/60b
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=60/60XL
+r0-agent2-type=2
+r10-agent1-kind=3
+r10-agent1-sku=818/818XL/818b
+r10-agent1-type=1
+r10-agent2-kind=3
+r10-agent2-sku=818/818XL
+r10-agent2-type=2
+r18-agent2-kind=3
+r18-agent2-sku=93/95
+r18-agent2-type=2
+r18-agent3-kind=3
+r18-agent3-sku=99
+r18-agent3-type=3
+r2-agent1-kind=3
+r2-agent1-sku=60/60XL/60b
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=60/60XL
+r2-agent2-type=2
+r4-agent1-kind=3
+r4-agent1-sku=300/300XL/300b
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=300/300XL
+r4-agent2-type=2
+r8-agent1-kind=3
+r8-agent1-sku=121/121XL/121b
+r8-agent1-type=1
+r8-agent2-kind=3
+r8-agent2-sku=121/121XL
+r8-agent2-type=2
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.9.6
+tech-class=ViperPlusVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=7711
+usb-vid=3f0
+wifi-config=0
+
+[officejet_4500_g510a-f]
+align-type=13
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=1
+fw-download=False
+icon=officejet_j5500_series.png
+io-mfp-mode=3
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet 4500 Desktop All-in-One Printer - G510a
+model2=HP Officejet 4500 All-in-One Desktop Printer - G510b
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=901/901XL
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=901
+r0-agent2-type=2
+r10-agent1-kind=3
+r10-agent1-sku=818/818XL/818b
+r10-agent1-type=1
+r10-agent2-kind=3
+r10-agent2-sku=818/818XL
+r10-agent2-type=2
+r2-agent1-kind=3
+r2-agent1-sku=60/60XL/60b
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=60/60XL
+r2-agent2-type=2
+r4-agent1-kind=3
+r4-agent1-sku=300/300XL/300b
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=300/300XL
+r4-agent2-type=2
+r8-agent1-kind=3
+r8-agent1-sku=121/121XL/121b
+r8-agent1-type=1
+r8-agent2-kind=3
+r8-agent2-sku=121/121XL
+r8-agent2-type=2
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.10.2
+tech-class=ViperPlusVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=4712
+usb-vid=3f0
+wifi-config=0
+
+[hp_designjet_4500]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=0
+io-mode=0
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP Designjet 4500 Printer
+model2=HP Designjet 4500ps Printer
+model3=HP Designjet 4500 Multi-Function Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=4014
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_f4500_series]
+align-type=13
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=hp_deskjet_f4200.png
+io-mfp-mode=3
+io-mode=1
+io-support=10
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet F4500 All-in-One Printer Series
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=60/60XL/60b
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=60/60XL
+r0-agent2-type=2
+r10-agent1-kind=3
+r10-agent1-sku=818/818XL/818b
+r10-agent1-type=1
+r10-agent2-kind=3
+r10-agent2-sku=818/818XL
+r10-agent2-type=2
+r18-agent2-kind=3
+r18-agent2-sku=93/95
+r18-agent2-type=2
+r18-agent3-kind=3
+r18-agent3-sku=99
+r18-agent3-type=3
+r2-agent1-kind=3
+r2-agent1-sku=60/60XL/60b
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=60/60XL
+r2-agent2-type=2
+r4-agent1-kind=3
+r4-agent1-sku=300/300XL/300b
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=300/300XL
+r4-agent2-type=2
+r8-agent1-kind=3
+r8-agent1-sku=121/121XL/121b
+r8-agent1-type=1
+r8-agent2-kind=3
+r8-agent2-sku=121/121XL
+r8-agent2-type=2
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.9.10
+tech-class=ViperPlusVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=8c11
+usb-vid=3f0
+wifi-config=1
+
+[officejet_4500_k710]
+align-type=13
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=1
+fw-download=False
+icon=officejet_j5500_series.png
+io-mfp-mode=3
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet 4500 All-in-One Printer - K710
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=901/901XL
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=901
+r0-agent2-type=2
+r10-agent1-kind=3
+r10-agent1-sku=818/818XL/818b
+r10-agent1-type=1
+r10-agent2-kind=3
+r10-agent2-sku=818/818XL
+r10-agent2-type=2
+r2-agent1-kind=3
+r2-agent1-sku=60/60XL/60b
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=60/60XL
+r2-agent2-type=2
+r4-agent1-kind=3
+r4-agent1-sku=300/300XL/300b
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=300/300XL
+r4-agent2-type=2
+r8-agent1-kind=3
+r8-agent1-sku=121/121XL/121b
+r8-agent1-type=1
+r8-agent2-kind=3
+r8-agent2-sku=121/121XL
+r8-agent2-type=2
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.10.6
+tech-class=ViperPlusVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=5712
+usb-vid=3f0
+wifi-config=0
+
+[hp_color_laserjet_4500]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=HP_Color_LaserJet_4500.png
+io-mfp-mode=6
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Color LaserJet 4500 Printer
+model2=HP Color LaserJet 4500dn Printer
+model3=HP Color LaserJet 4500n Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=91 (C4191A)
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=92 (C4192A)
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=93 (C4193A)
+r0-agent3-type=5
+r0-agent4-kind=4
+r0-agent4-sku=94 (C4194A)
+r0-agent4-type=6
+r0-agent5-kind=7
+r0-agent5-sku=95 (C4195A)
+r0-agent5-type=62
+r0-agent6-kind=8
+r0-agent6-sku=96 (C4196A)
+r0-agent6-type=62
+r0-agent7-kind=5
+r0-agent7-sku=97 (C4197A)
+r0-agent7-type=62
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=352d
+support-type=2
+support-ver=0.9.5
+tech-class=LJColor,Postscript
+tech-subclass=Normal
+tech-type=4
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_designjet_4500ps]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=1
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Designjet 4500ps
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.10.9
+tech-class=Postscript
+tech-subclass=Normal
+tech-type=2
+usb-pid=714
+usb-vid=3f0
+wifi-config=0
+
+[officejet_j4500_series]
+align-type=13
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=1
+fw-download=False
+icon=officejet_j5500_series.png
+io-mfp-mode=3
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet J4524 All-in-One Printer
+model2=HP Officejet J4525 All-in-One Printer
+model3=HP Officejet J4535 All-in-One Printer
+model4=HP Officejet J4540 All-in-One Printer
+model5=HP Officejet J4550 All-in-One Printer
+model6=HP Officejet J4560 All-in-One Printer
+model7=HP Officejet J4580 All-in-One Printer
+model8=HP Officejet J4580c All-in-One Printer
+model9=HP Officejet J4585 All-in-One Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=901/901XL
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=901
+r0-agent2-type=2
+r10-agent1-kind=3
+r10-agent1-sku=818/818XL/818b
+r10-agent1-type=1
+r10-agent2-kind=3
+r10-agent2-sku=818/818XL
+r10-agent2-type=2
+r2-agent1-kind=3
+r2-agent1-sku=60/60XL/60b
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=60/60XL
+r2-agent2-type=2
+r4-agent1-kind=3
+r4-agent1-sku=300/300XL/300b
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=300/300XL
+r4-agent2-type=2
+r8-agent1-kind=3
+r8-agent1-sku=121/121XL/121b
+r8-agent1-type=1
+r8-agent2-kind=3
+r8-agent2-sku=121/121XL
+r8-agent2-type=2
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.8.6
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=2a12
+usb-vid=3f0
+wifi-config=0
+
+[officejet_4500_g510g-m]
+align-type=13
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=1
+fw-download=False
+icon=officejet_j5500_series.png
+io-mfp-mode=3
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet 4500 All-in-One Printer - G510g
+model2=HP Officejet 4500 All-in-One Printer - G510h
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=901/901XL
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=901
+r0-agent2-type=2
+r10-agent1-kind=3
+r10-agent1-sku=818/818XL/818b
+r10-agent1-type=1
+r10-agent2-kind=3
+r10-agent2-sku=818/818XL
+r10-agent2-type=2
+r2-agent1-kind=3
+r2-agent1-sku=60/60XL/60b
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=60/60XL
+r2-agent2-type=2
+r4-agent1-kind=3
+r4-agent1-sku=300/300XL/300b
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=300/300XL
+r4-agent2-type=2
+r8-agent1-kind=3
+r8-agent1-sku=121/121XL/121b
+r8-agent1-type=1
+r8-agent2-kind=3
+r8-agent2-sku=121/121XL
+r8-agent2-type=2
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.10.2
+tech-class=ViperPlusVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=4712
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_c4500_series]
+align-type=13
+clean-type=1
+color-cal-type=3
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=Photosmart_C4100.png
+io-mfp-mode=3
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart C4540 All-in-One Printer
+model10=HP Photosmart C4588 All-in-One Printer
+model11=HP Photosmart C4593 All-in-One Printer
+model12=HP Photosmart C4599 All-in-One Printer
+model2=HP Photosmart C4550 All-in-One Printer
+model3=HP Photosmart C4570 All-in-One Printer
+model4=HP Photosmart C4572 All-in-One Printer
+model5=HP Photosmart C4573 All-in-One Printer
+model6=HP Photosmart C4575 All-in-One Printer
+model7=HP Photosmart C4580 All-in-One Printer
+model8=HP Photosmart C4583 All-in-One Printer
+model9=HP Photosmart C4585 All-in-One Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=2
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=74/74XL
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=75/75XL
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=99
+r0-agent3-type=3
+r10-agent1-kind=3
+r10-agent1-sku=860/860XL
+r10-agent1-type=1
+r10-agent2-kind=3
+r10-agent2-sku=861/861XL
+r10-agent2-type=2
+r10-agent3-kind=3
+r10-agent3-sku=858
+r10-agent3-type=3
+r18-agent1-kind=3
+r18-agent1-sku=92/98
+r18-agent1-type=1
+r18-agent2-kind=3
+r18-agent2-sku=93/95
+r18-agent2-type=2
+r18-agent3-kind=3
+r18-agent3-sku=99
+r18-agent3-type=3
+r2-agent1-kind=3
+r2-agent1-sku=74/74XL
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=75/75XL
+r2-agent2-type=2
+r2-agent3-kind=3
+r2-agent3-sku=99
+r2-agent3-type=3
+r4-agent1-kind=3
+r4-agent1-sku=350/350XL
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=351/351XL
+r4-agent2-type=2
+r4-agent3-kind=3
+r4-agent3-sku=348
+r4-agent3-type=3
+r8-agent1-kind=3
+r8-agent1-sku=140/140XL
+r8-agent1-type=1
+r8-agent2-kind=3
+r8-agent2-sku=141/141XL
+r8-agent2-type=2
+r8-agent3-kind=3
+r8-agent3-sku=138
+r8-agent3-type=3
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.8.10
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=6b11
+usb-vid=3f0
+wifi-config=1
+
+[hp_designjet_4500mfp]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=-1
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=1
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Designjet 4500mfp
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=-2
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.10.9
+tech-class=Postscript
+tech-subclass=Normal
+tech-type=2
+usb-pid=714
+usb-vid=3f0
+wifi-config=0
+
+[officejet_4500_g510n-z]
+align-type=13
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=1
+fw-download=False
+icon=officejet_j5500_series.png
+io-mfp-mode=3
+io-mode=1
+io-support=10
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet 4500 G510n-z All-in-One Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=901/901XL
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=901
+r0-agent2-type=2
+r10-agent1-kind=3
+r10-agent1-sku=818/818XL/818b
+r10-agent1-type=1
+r10-agent2-kind=3
+r10-agent2-sku=818/818XL
+r10-agent2-type=2
+r2-agent1-kind=3
+r2-agent1-sku=60/60XL/60b
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=60/60XL
+r2-agent2-type=2
+r4-agent1-kind=3
+r4-agent1-sku=300/300XL/300b
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=300/300XL
+r4-agent2-type=2
+r8-agent1-kind=3
+r8-agent1-sku=121/121XL/121b
+r8-agent1-type=1
+r8-agent2-kind=3
+r8-agent2-sku=121/121XL
+r8-agent2-type=2
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=3b72
+support-type=2
+support-ver=3.10.6
+tech-class=ViperPlusVIP
+tech-subclass=Trim
+tech-type=2
+usb-pid=2e12
+usb-vid=3f0
+wifi-config=1
+
+[hp_laserjet_p4515tn]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=laserjet_2410.png
+io-mfp-mode=3
+io-mode=1
+io-support=6
+job-storage=1
+linefeed-cal-type=0
+model1=HP LaserJet P4515tn Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+ppd-name=laserjet_p4010_series
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=Q7551A
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.8.5
+tech-class=LJMono
+tech-subclass=Normal
+tech-type=3
+usb-pid=7317
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_p4515n]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=laserjet_2410.png
+io-mfp-mode=3
+io-mode=1
+io-support=6
+job-storage=1
+linefeed-cal-type=0
+model1=HP LaserJet P4515n Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+ppd-name=laserjet_p4010_series
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=Q7551A
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.8.5
+tech-class=LJMono
+tech-subclass=Normal
+tech-type=3
+usb-pid=7317
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_p4515xm]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=laserjet_2410.png
+io-mfp-mode=3
+io-mode=1
+io-support=6
+job-storage=1
+linefeed-cal-type=0
+model1=HP LaserJet P4515xm Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+ppd-name=laserjet_p4010_series
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=Q7551A
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.8.5
+tech-class=LJMono
+tech-subclass=Normal
+tech-type=3
+usb-pid=7317
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_p4515]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=laserjet_2410.png
+io-mfp-mode=3
+io-mode=1
+io-support=6
+job-storage=1
+linefeed-cal-type=0
+model1=HP LaserJet P4515 Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+ppd-name=laserjet_p4010_series
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=Q7551A
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=3a05
+support-type=2
+support-ver=2.8.5
+tech-class=LJMono
+tech-subclass=Normal
+tech-type=3
+usb-pid=7317
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_p4515x]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=laserjet_2410.png
+io-mfp-mode=3
+io-mode=1
+io-support=6
+job-storage=1
+linefeed-cal-type=0
+model1=HP LaserJet P4515x Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+ppd-name=laserjet_p4010_series
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=Q7551A
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.8.5
+tech-class=LJMono
+tech-subclass=Normal
+tech-type=3
+usb-pid=7317
+usb-vid=3f0
+wifi-config=0
+
+[hp_color_laserjet_cp4520_series]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_color_laserjet_cp3525.png
+io-mfp-mode=3
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Color LaserJet CP4520 Series Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=4
+r0-agent1-sku=CE260A
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=CE261A
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=CE262A
+r0-agent3-type=5
+r0-agent4-kind=4
+r0-agent4-sku=CE263A
+r0-agent4-type=6
+r1-agent1-kind=4
+r1-agent1-sku=CE260X
+r1-agent1-type=1
+r1-agent2-kind=4
+r1-agent2-sku=CE261A
+r1-agent2-type=4
+r1-agent3-kind=4
+r1-agent3-sku=CE262A
+r1-agent3-type=5
+r1-agent4-kind=4
+r1-agent4-sku=CE263A
+r1-agent4-type=6
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.9.12
+tech-class=LJColor,Postscript
+tech-subclass=Normal
+tech-type=4
+usb-pid=8817
+usb-vid=3f0
+wifi-config=0
+
+[hp_designjet_4520ps]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=1
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Designjet 4520ps
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.9.4
+tech-class=Postscript
+tech-subclass=Normal
+tech-type=2
+usb-pid=714
+usb-vid=3f0
+wifi-config=0
+
+[hp_designjet_4520mfp]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=-1
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=1
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Designjet 4520mfp
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=-2
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.9.4
+tech-class=Postscript
+tech-subclass=Normal
+tech-type=2
+usb-pid=714
+usb-vid=3f0
+wifi-config=0
+
+[hp_designjet_4520]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=0
+io-mode=0
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP Designjet 4520 42-in Printer
+model2=HP Designjet 4520ps 42-in Printer
+model3=HP Designjet 4520 Scanner
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=219b2b
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_color_laserjet_cm4540_mfp]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=-1
+fw-download=False
+icon=HP_LaserJet_9000_MFP.png
+io-mfp-mode=3
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Color LaserJet CM4540 Multifunction Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CE260A / CE264X
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=CF031A
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=CF032A
+r0-agent3-type=6
+r0-agent4-kind=4
+r0-agent4-sku=CF033A
+r0-agent4-type=5
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.11.1
+tech-class=LJColor,Postscript
+tech-subclass=Normal
+tech-type=4
+usb-pid=9917
+usb-vid=3f0
+wifi-config=0
+
+[hp_color_laserjet_4550]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=HP_Color_LaserJet_4500.png
+io-mfp-mode=6
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Color LaserJet 4550 Printer
+model2=HP Color LaserJet 4550n Printer
+model3=HP Color LaserJet 4550dn Printer
+model4=HP Color LaserJet 4550hdn Printer
+model5=HP Color LaserJet 4550n Plus Printer
+model6=HP Color LaserJet 4550hdn Plus Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=91 (C4191A)
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=92 (C4192A)
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=93 (C4193A)
+r0-agent3-type=5
+r0-agent4-kind=4
+r0-agent4-sku=94 (C4194A)
+r0-agent4-type=6
+r0-agent5-kind=7
+r0-agent5-sku=95 (C4195A)
+r0-agent5-type=62
+r0-agent6-kind=8
+r0-agent6-sku=96 (C4196A)
+r0-agent6-type=62
+r0-agent7-kind=5
+r0-agent7-sku=97 (C4197A)
+r0-agent7-type=62
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=3a41
+support-type=2
+support-ver=0.9.5
+tech-class=LJColor,Postscript
+tech-subclass=Normal
+tech-type=4
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_m4555_mfp]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=-1
+fw-download=False
+icon=hp_LaserJet_4345_mfp.png
+io-mfp-mode=3
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet M4555 MFP
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CE390A
+r0-agent1-type=1
+scan-src=0
+scan-type=-2
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.11.5
+tech-class=Postscript
+tech-subclass=Normal
+tech-type=3
+usb-pid=9c17
+usb-vid=3f0
+wifi-config=0
+
+[hp_color_laserjet_4600_series]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_color_LaserJet_4600.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Color LaserJet 4600 Printer
+model2=HP Color LaserJet 4600dn Printer
+model3=HP Color LaserJet 4600dtn Printer
+model4=HP Color LaserJet 4600hdn Printer
+model5=HP Color LaserJet 4600n Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=20 (C9720A)
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=21 (C9721A)
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=23 (C9723A)
+r0-agent3-type=5
+r0-agent4-kind=4
+r0-agent4-sku=22 (C9722A)
+r0-agent4-type=6
+r0-agent5-kind=5
+r0-agent5-sku=25 (C9725A)
+r0-agent5-type=62
+r0-agent6-kind=8
+r0-agent6-sku=24 (C9724A)
+r0-agent6-type=62
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=38bf
+support-type=2
+support-ver=0.9.5
+tech-class=LJColor
+tech-subclass=Normal
+tech-type=4
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_c4600_series]
+align-type=13
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=Photosmart_C4100.png
+io-mfp-mode=3
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart C4640 All-in-One Printer
+model10=HP Photosmart C4688 All-in-One Printer
+model2=HP Photosmart C4650 All-in-One Printer
+model3=HP Photosmart C4680 All-in-One Printer
+model4=HP Photosmart C4610 All-in-One Printer
+model5=HP Photosmart C4635 All-in-One Printer
+model6=HP Photosmart C4670 All-in-One Printer
+model7=HP Photosmart C4673 All-in-One Printer
+model8=HP Photosmart C4680 All-in-One Printer
+model9=HP Photosmart C4683 All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=2
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=60/60XL
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=60/60XL
+r0-agent2-type=2
+r10-agent1-kind=3
+r10-agent1-sku=818/818XL
+r10-agent1-type=1
+r10-agent2-kind=3
+r10-agent2-sku=818/818XL
+r10-agent2-type=2
+r18-agent2-kind=3
+r18-agent2-sku=93/95
+r18-agent2-type=2
+r18-agent3-kind=3
+r18-agent3-sku=99
+r18-agent3-type=3
+r2-agent1-kind=3
+r2-agent1-sku=60/60XL
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=60/60XL
+r2-agent2-type=2
+r4-agent1-kind=3
+r4-agent1-sku=300/300XL
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=300/300XL
+r4-agent2-type=2
+r8-agent1-kind=3
+r8-agent1-sku=121/121XL
+r8-agent1-type=1
+r8-agent2-kind=3
+r8-agent2-sku=121/121XL
+r8-agent2-type=2
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.9.6
+tech-class=ViperPlusVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=7411
+usb-vid=3f0
+wifi-config=0
+
+[hp_color_laserjet_4600]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_color_LaserJet_4600.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Color LaserJet 4600 Series Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=20 (C9720A)
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=21 (C9721A)
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=23 (C9723A)
+r0-agent3-type=5
+r0-agent4-kind=4
+r0-agent4-sku=22 (C9722A)
+r0-agent4-type=6
+r0-agent5-kind=5
+r0-agent5-sku=25 (C9725A)
+r0-agent5-type=62
+r0-agent6-kind=8
+r0-agent6-sku=24 (C9724A)
+r0-agent6-type=62
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=38b6
+support-type=2
+support-ver=0.9.5
+tech-class=LJColor,Postscript
+tech-subclass=Normal
+tech-type=4
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_color_laserjet_4610]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_color_LaserJet_4600.png
+io-mfp-mode=6
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Color LaserJet 4610n Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=20 (C9720A)
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=21 (C9721A)
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=23 (C9723A)
+r0-agent3-type=5
+r0-agent4-kind=4
+r0-agent4-sku=22 (C9722A)
+r0-agent4-type=6
+r0-agent5-kind=5
+r0-agent5-sku=25 (C9725A)
+r0-agent5-type=62
+r0-agent6-kind=8
+r0-agent6-sku=24 (C9724A)
+r0-agent6-type=62
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=3b34
+support-type=2
+support-ver=0.9.5
+tech-class=LJColor,Postscript
+tech-subclass=Normal
+tech-type=4
+usb-pid=6c17
+usb-vid=3f0
+wifi-config=0
+
+[hp_color_laserjet_4650]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_color_LaserJet_4600.png
+io-mfp-mode=6
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Color LaserJet 4650 Printer
+model2=HP Color LaserJet 4650n Printer
+model3=HP Color LaserJet 4650dn Printer
+model4=HP Color LaserJet 4650dtn Printer
+model5=HP Color LaserJet 4650hdn Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=20 (C9720A)
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=21 (C9721A)
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=23 (C9723A)
+r0-agent3-type=5
+r0-agent4-kind=4
+r0-agent4-sku=22 (C9722A)
+r0-agent4-type=6
+r0-agent5-kind=5
+r0-agent5-sku=25 (C9725A)
+r0-agent5-type=62
+r0-agent6-kind=8
+r0-agent6-sku=24 (C9724A)
+r0-agent6-type=62
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=3b34
+support-type=2
+support-ver=0.9.5
+tech-class=LJColor,Postscript
+tech-subclass=Normal
+tech-type=4
+usb-pid=1a17
+usb-vid=3f0
+wifi-config=0
+
+[officejet_j4660_series]
+align-type=13
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=1
+fw-download=False
+icon=officejet_j5500_series.png
+io-mfp-mode=3
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet F4280 All-in-One
+model2=HP Officejet J4660 All-in-One Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=901/901XL
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=901
+r0-agent2-type=2
+r10-agent1-kind=3
+r10-agent1-sku=818/818XL/818b
+r10-agent1-type=1
+r10-agent2-kind=3
+r10-agent2-sku=818/818XL
+r10-agent2-type=2
+r2-agent1-kind=3
+r2-agent1-sku=60/60XL/60b
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=60/60XL
+r2-agent2-type=2
+r4-agent1-kind=3
+r4-agent1-sku=300/300XL/300b
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=300/300XL
+r4-agent2-type=2
+r8-agent1-kind=3
+r8-agent1-sku=121/121XL/121b
+r8-agent1-type=1
+r8-agent2-kind=3
+r8-agent2-sku=121/121XL
+r8-agent2-type=2
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.8.10
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=2b12
+usb-vid=3f0
+wifi-config=1
+
+[officejet_j4680_series]
+align-type=13
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=1
+fw-download=False
+icon=officejet_j5500_series.png
+io-mfp-mode=3
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet F4280 All-in-One
+model2=HP Officejet J4680c All-in-One Printer
+model3=HP Officejet J4680 All-in-One Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=901/901XL
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=901
+r0-agent2-type=2
+r10-agent1-kind=3
+r10-agent1-sku=818/818XL/818b
+r10-agent1-type=1
+r10-agent2-kind=3
+r10-agent2-sku=818/818XL
+r10-agent2-type=2
+r2-agent1-kind=3
+r2-agent1-sku=60/60XL/60b
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=60/60XL
+r2-agent2-type=2
+r4-agent1-kind=3
+r4-agent1-sku=300/300XL/300b
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=300/300XL
+r4-agent2-type=2
+r8-agent1-kind=3
+r8-agent1-sku=121/121XL/121b
+r8-agent1-type=1
+r8-agent2-kind=3
+r8-agent2-sku=121/121XL
+r8-agent2-type=2
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.8.10
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=2c12
+usb-vid=3f0
+wifi-config=1
+
+[photosmart_c4700_series]
+align-type=13
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=Photosmart_C4100.png
+io-mfp-mode=3
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart C4740 All-in-One Printer
+model10=HP Photosmart C4799 All-in-One Printer
+model2=HP Photosmart C4750 All-in-One Printer
+model3=HP Photosmart C4780 All-in-One Printer
+model4=HP Photosmart C4783 All-in-One Printer
+model5=HP Photosmart C4785 All-in-One Printer
+model6=HP Photosmart C4788 All-in-One Printer
+model7=HP Photosmart C4793 All-in-One Printer
+model8=HP Photosmart C4795 All-in-One Printer
+model9=HP Photosmart C4798 All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=2
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=60/60XL
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=60/60XL
+r0-agent2-type=2
+r10-agent1-kind=3
+r10-agent1-sku=818/818XL
+r10-agent1-type=1
+r10-agent2-kind=3
+r10-agent2-sku=818/818XL
+r10-agent2-type=2
+r18-agent2-kind=3
+r18-agent2-sku=93/95
+r18-agent2-type=2
+r18-agent3-kind=3
+r18-agent3-sku=99
+r18-agent3-type=3
+r2-agent1-kind=3
+r2-agent1-sku=60/60XL
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=60/60XL
+r2-agent2-type=2
+r4-agent1-kind=3
+r4-agent1-sku=300/300XL
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=300/300XL
+r4-agent2-type=2
+r8-agent1-kind=3
+r8-agent1-sku=121/121XL
+r8-agent1-type=1
+r8-agent2-kind=3
+r8-agent2-sku=121/121XL
+r8-agent2-type=2
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.9.8
+tech-class=ViperPlusVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=7511
+usb-vid=3f0
+wifi-config=1
+
+[hp_color_laserjet_4700]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=HP_Color_LaserJet_4500.png
+io-mfp-mode=4
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Color LaserJet 4700 Printer
+model2=HP Color LaserJet 4700dn Printer
+model3=HP Color LaserJet 4700dtn Printer
+model4=HP Color LaserJet 4700n Printer
+model5=HP Color LaserJet 4700ph+ Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=Q6460A
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=Q6461A
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=Q6463A
+r0-agent3-type=5
+r0-agent4-kind=4
+r0-agent4-sku=Q6462A
+r0-agent4-type=6
+r0-agent5-kind=7
+r0-agent5-sku=Q5997A
+r0-agent5-type=62
+r0-agent6-kind=8
+r0-agent6-sku=Q7504A
+r0-agent6-type=62
+r0-agent7-kind=5
+r0-agent7-sku=Q7502A/Q7503A
+r0-agent7-type=62
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=4144
+support-type=2
+support-ver=0.9.5
+tech-class=LJColor,Postscript
+tech-subclass=Normal
+tech-type=4
+usb-pid=6217
+usb-vid=3f0
+wifi-config=0
+
+[hp_color_laserjet_cm4730_mfp]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=HP_Color_LaserJet_4730mfp.png
+io-mfp-mode=3
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Color LaserJet CM4730 Multifunction Printer
+model2=HP Color LaserJet CM4730f Multifunction Printer
+model3=HP Color LaserJet CM4730fm Multifunction Printer
+model4=HP Color LaserJet CM4730fsk Multifunction Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=Q6460A
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=Q6461A
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=Q6463A
+r0-agent3-type=5
+r0-agent4-kind=4
+r0-agent4-sku=Q6462A
+r0-agent4-type=6
+scan-src=0
+scan-type=-2
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.7.6
+tech-class=LJColor,Postscript
+tech-subclass=Normal
+tech-type=4
+usb-pid=7d17
+usb-vid=3f0
+wifi-config=0
+
+[hp_color_laserjet_4730mfp]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=HP_Color_LaserJet_4730mfp.png
+io-mfp-mode=4
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Color LaserJet 4730xs Multifunction Printer
+model2=HP Color LaserJet 4730xm Multifunction Printer
+model3=HP Color LaserJet 4730x Multifunction Printer
+model4=HP Color LaserJet 4730 Multifunction Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=Q6460A
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=Q6461A
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=Q6463A
+r0-agent3-type=5
+r0-agent4-kind=4
+r0-agent4-sku=Q6462A
+r0-agent4-type=6
+r0-agent5-kind=7
+r0-agent5-sku=Q5997A
+r0-agent5-type=62
+r0-agent6-kind=8
+r0-agent6-sku=Q7504A
+r0-agent6-type=62
+r0-agent7-kind=5
+r0-agent7-sku=Q7502A/Q7503A
+r0-agent7-type=62
+scan-src=0
+scan-type=-2
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=3dd2
+support-type=2
+support-ver=0.9.5
+tech-class=LJColor,Postscript
+tech-subclass=Normal
+tech-type=4
+usb-pid=6317
+usb-vid=3f0
+wifi-config=0
+
+[hp_designjet_5000]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=0
+io-mode=0
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP Designjet 5000 Printer
+model2=HP Designjet 5000ps Printer
+model3=HP Designjet 5000 UV Printer
+model4=HP Designjet 5000ps UV Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=384d
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_5000_series]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_LaserJet_5000.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 5000 Series Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=C4129X
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=9
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=LJMono,Postscript
+tech-subclass=Normal
+tech-type=3
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_5000]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_LaserJet_5000.png
+io-mfp-mode=6
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 5000 Printer
+model2=HP LaserJet 5000Le Printer
+model3=HP LaserJet 5000dn Printer
+model4=HP LaserJet 5000gn Printer
+model5=HP LaserJet 5000n Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=C4129X
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=9
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=LJMono
+tech-subclass=LargeFormatA3
+tech-type=3
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_m5025_mfp]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_LaserJet_4345_mfp.png
+io-mfp-mode=3
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet M5025 Multifunction Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=Q7570A
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=1.6.12
+tech-class=LJMono,Postscript
+tech-subclass=LargeFormatA3
+tech-type=4
+usb-pid=7917
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_m5035_mfp]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_LaserJet_4345_mfp.png
+io-mfp-mode=3
+io-mode=1
+io-support=6
+job-storage=1
+linefeed-cal-type=0
+model1=HP LaserJet M5035 Multifunction Printer
+model2=HP LaserJet M5035x Multifunction Printer
+model3=HP LaserJet M5035xs Multifunction Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=Q7570A
+r0-agent1-type=1
+scan-src=0
+scan-type=-2
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=1.6.10
+tech-class=LJMono,Postscript
+tech-subclass=LargeFormatA3
+tech-type=4
+usb-pid=7217
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_m5039_mfp]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_LaserJet_4345_mfp.png
+io-mfp-mode=3
+io-mode=1
+io-support=6
+job-storage=1
+linefeed-cal-type=0
+model1=HP LaserJet M5039 Multifunction Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=Q7570A
+r0-agent1-type=1
+scan-src=0
+scan-type=-2
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.10.4
+tech-class=LJMono,Postscript
+tech-subclass=LargeFormatA3
+tech-type=4
+usb-pid=a117
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_d5060_series]
+align-type=10
+clean-type=1
+color-cal-type=3
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=Photosmart_D5060.png
+io-mfp-mode=3
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart D5060 Printer
+model2=HP Photosmart D5063 Printer
+model3=HP Photosmart D5065 Printer
+model4=HP Photosmart D5069 Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=2
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=92 (C9361WN)/94 (C8765WN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=93 (C9362WN)/95 (C8766WN)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=99 (C9369WN)
+r0-agent3-type=3
+r0-agent4-kind=3
+r0-agent4-sku=100 (C9368AN)
+r0-agent4-type=10
+r1-agent1-kind=3
+r1-agent1-sku=92 (C9361WN)/94 (C8765WN)
+r1-agent1-type=1
+r1-agent2-kind=3
+r1-agent2-sku=93 (C9362WN)/95 (C8766WN)
+r1-agent2-type=2
+r1-agent3-kind=3
+r1-agent3-sku=99 (C9369WN)
+r1-agent3-type=3
+r1-agent4-kind=3
+r1-agent4-sku=100 (C9368AN)
+r1-agent4-type=10
+r2-agent1-kind=3
+r2-agent1-sku=92 (C9361WN)/94 (C8765WN)
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=93 (C9362WN)/95 (C8766WN)
+r2-agent2-type=2
+r2-agent3-kind=3
+r2-agent3-sku=99 (C9369WN)
+r2-agent3-type=3
+r2-agent4-kind=3
+r2-agent4-sku=100 (C9368AN)
+r2-agent4-type=10
+r3-agent1-kind=3
+r3-agent1-sku=92 (C9361WN)/94 (C8765WN)
+r3-agent1-type=1
+r3-agent2-kind=3
+r3-agent2-sku=93 (C9362WN)/95 (C8766WN)
+r3-agent2-type=2
+r3-agent3-kind=3
+r3-agent3-sku=99 (C9369WN)
+r3-agent3-type=3
+r3-agent4-kind=3
+r3-agent4-sku=100 (C9368AN)
+r3-agent4-type=10
+r4-agent1-kind=3
+r4-agent1-sku=337 (C9361EN)/338 (C8765EN)
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=342 (C9362EN)/343 (C8766EN)
+r4-agent2-type=2
+r4-agent3-kind=3
+r4-agent3-sku=348 (C9369EN)
+r4-agent3-type=3
+r4-agent4-kind=3
+r4-agent4-sku=100 (C9368AN)
+r4-agent4-type=10
+r5-agent1-kind=3
+r5-agent1-sku=132 (C9361HN)/131 (C8765HN)
+r5-agent1-type=1
+r5-agent2-kind=3
+r5-agent2-sku=136 (C9362HN)/135 (C8766HN)
+r5-agent2-type=2
+r5-agent3-kind=3
+r5-agent3-sku=138 (C9369HN)
+r5-agent3-type=3
+r5-agent4-kind=3
+r5-agent4-sku=100 (C9368AN)
+r5-agent4-type=10
+r6-agent1-kind=3
+r6-agent1-sku=132 (C9361HN)/131 (C8765HN)
+r6-agent1-type=1
+r6-agent2-kind=3
+r6-agent2-sku=136 (C9362HN)/135 (C8766HN)
+r6-agent2-type=2
+r6-agent3-kind=3
+r6-agent3-sku=138 (C9369HN)
+r6-agent3-type=3
+r6-agent4-kind=3
+r6-agent4-sku=100 (C9368AN)
+r6-agent4-type=10
+r7-agent1-kind=3
+r7-agent1-sku=850 (C9361ZN)/852 (C8765ZN)
+r7-agent1-type=1
+r7-agent2-kind=3
+r7-agent2-sku=854 (C9362ZN)/855 (C8766ZN)
+r7-agent2-type=2
+r7-agent3-kind=3
+r7-agent3-sku=858 (C9369ZN)
+r7-agent3-type=3
+r7-agent4-kind=3
+r7-agent4-sku=100 (C9368AN)
+r7-agent4-type=10
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=1.6.9
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=c802
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_c5100_series]
+align-type=1
+clean-type=1
+color-cal-type=4
+copy-type=3
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=Photosmart_C5100.png
+io-mfp-mode=3
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart C5140 All-in-One Printer
+model10=HP Photosmart C5194 All-in-One Printer
+model2=HP Photosmart C5150 All-in-One Printer
+model3=HP Photosmart C5170 All-in-One Printer
+model4=HP Photosmart C5173 All-in-One Printer
+model5=HP Photosmart C5175 All-in-One Printer
+model6=HP Photosmart C5180 All-in-One Printer
+model7=HP Photosmart C5183 All-in-One Printer
+model8=HP Photosmart C5185 All-in-One Printer
+model9=HP Photosmart C5188 All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=2
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=2
+r0-agent1-sku=2
+r0-agent1-type=1
+r0-agent2-kind=2
+r0-agent2-sku=2
+r0-agent2-type=4
+r0-agent3-kind=2
+r0-agent3-sku=2
+r0-agent3-type=5
+r0-agent4-kind=2
+r0-agent4-sku=2
+r0-agent4-type=6
+r0-agent5-kind=2
+r0-agent5-sku=2
+r0-agent5-type=7
+r0-agent6-kind=2
+r0-agent6-sku=2
+r0-agent6-type=8
+r1-agent1-kind=2
+r1-agent1-sku=2
+r1-agent1-type=1
+r1-agent2-kind=2
+r1-agent2-sku=2
+r1-agent2-type=4
+r1-agent3-kind=2
+r1-agent3-sku=2
+r1-agent3-type=5
+r1-agent4-kind=2
+r1-agent4-sku=2
+r1-agent4-type=6
+r1-agent5-kind=2
+r1-agent5-sku=2
+r1-agent5-type=7
+r1-agent6-kind=2
+r1-agent6-sku=2
+r1-agent6-type=8
+r2-agent1-kind=2
+r2-agent1-sku=363
+r2-agent1-type=1
+r2-agent2-kind=2
+r2-agent2-sku=363
+r2-agent2-type=4
+r2-agent3-kind=2
+r2-agent3-sku=363
+r2-agent3-type=5
+r2-agent4-kind=2
+r2-agent4-sku=363
+r2-agent4-type=6
+r2-agent5-kind=2
+r2-agent5-sku=363
+r2-agent5-type=7
+r2-agent6-kind=2
+r2-agent6-sku=363
+r2-agent6-type=8
+r4-agent1-kind=2
+r4-agent1-sku=177
+r4-agent1-type=1
+r4-agent2-kind=2
+r4-agent2-sku=177
+r4-agent2-type=4
+r4-agent3-kind=2
+r4-agent3-sku=177
+r4-agent3-type=5
+r4-agent4-kind=2
+r4-agent4-sku=177
+r4-agent4-type=6
+r4-agent5-kind=2
+r4-agent5-sku=177
+r4-agent5-type=7
+r4-agent6-kind=2
+r4-agent6-sku=177
+r4-agent6-type=8
+r8-agent1-kind=2
+r8-agent1-sku=801
+r8-agent1-type=1
+r8-agent2-kind=2
+r8-agent2-sku=801
+r8-agent2-type=4
+r8-agent3-kind=2
+r8-agent3-sku=801
+r8-agent3-type=5
+r8-agent4-kind=2
+r8-agent4-sku=801
+r8-agent4-type=6
+r8-agent5-kind=2
+r8-agent5-sku=801
+r8-agent5-type=7
+r8-agent6-kind=2
+r8-agent6-sku=801
+r8-agent6-type=8
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=1.6.9
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=5811
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_5100_series]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_LaserJet_5000.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 5100 Printer
+model2=HP LaserJet 5100Le Printer
+model3=HP LaserJet 5100dtn Printer
+model4=HP LaserJet 5100se Printer
+model5=HP LaserJet 5100tn Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=C4129X
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=9
+support-released=True
+support-subtype=3b52
+support-type=2
+support-ver=0.9.5
+tech-class=LJMono,Postscript
+tech-subclass=LargeFormatA3
+tech-type=3
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_5100]
+align-type=1
+clean-type=1
+color-cal-type=3
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=deskjet_5100.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 5100 Color Inkjet Printer
+model2=HP Deskjet 5145 Color Inkjet Printer
+model3=HP Deskjet 5150v Color Inkjet Printer
+model4=HP Deskjet 5150w Color Inkjet Printer
+model5=HP Deskjet 5150 Color Inkjet Printer
+model6=HP Deskjet 5151 Color Inkjet Printer
+model7=HP Deskjet 5160 Color Inkjet Printer
+model8=HP Deskjet 5168 Color Inkjet Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=56 (C6656A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=57 (C6657A)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=58 (C6658A)
+r0-agent3-type=3
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_d5100_series]
+align-type=1
+clean-type=1
+color-cal-type=3
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=Photosmart_D5100.png
+io-mfp-mode=3
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart D5145 Printer
+model2=HP Photosmart D5155 Printer
+model3=HP Photosmart D5156 Printer
+model4=HP Photosmart D5160 Printer
+model5=HP Photosmart D5163 Printer
+model6=HP Photosmart D5168 Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=2
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=92/96/98
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=93/95/97
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=99
+r0-agent3-type=3
+r0-agent4-kind=3
+r0-agent4-sku=100
+r0-agent4-type=10
+r10-agent1-kind=3
+r10-agent1-sku=850/851/853
+r10-agent1-type=1
+r10-agent2-kind=3
+r10-agent2-sku=854/855/857
+r10-agent2-type=2
+r10-agent3-kind=3
+r10-agent3-sku=858
+r10-agent3-type=3
+r10-agent4-kind=3
+r10-agent4-sku=100
+r10-agent4-type=10
+r2-agent1-kind=3
+r2-agent1-sku=92/96/98
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=93/95/97
+r2-agent2-type=2
+r2-agent3-kind=3
+r2-agent3-sku=99
+r2-agent3-type=3
+r2-agent4-kind=3
+r2-agent4-sku=100
+r2-agent4-type=10
+r4-agent1-kind=3
+r4-agent1-sku=337/336/339
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=342/343/344
+r4-agent2-type=2
+r4-agent3-kind=3
+r4-agent3-sku=348
+r4-agent3-type=3
+r4-agent4-kind=3
+r4-agent4-sku=100
+r4-agent4-type=10
+r8-agent1-kind=3
+r8-agent1-sku=132/130/129
+r8-agent1-type=1
+r8-agent2-kind=3
+r8-agent2-sku=136/135/134
+r8-agent2-type=2
+r8-agent3-kind=3
+r8-agent3-sku=138
+r8-agent3-type=3
+r8-agent4-kind=3
+r8-agent4-sku=100
+r8-agent4-type=10
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=1.6.9
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=c402
+usb-vid=3f0
+wifi-config=0
+
+[hp_designjet_5100]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=0
+io-mode=0
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP Designjet 5100 Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=219b2b
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[officejet_5100_series]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=1
+fw-download=False
+icon=officejet_k80.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet 5100 All-in-One Printer
+model2=HP Officejet 5105 All-in-One Printer
+model3=HP Officejet 5110v All-in-One Printer
+model4=HP Officejet 5110xi All-in-One Printer
+model5=HP Officejet 5110 All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=15 (C6615DN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=78 (C6578DN / C6578AN)
+r0-agent2-type=2
+scan-src=2
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=3752
+support-type=2
+support-ver=0.9.5
+tech-class=DJ9xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=2411
+usb-vid=3f0
+wifi-config=0
+
+[officejet_5105]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=1
+fw-download=False
+icon=OfficeJet_5105.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet 5105 All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=15 (C6615DN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=78 (C6578DN/C6578AN)
+r0-agent2-type=2
+scan-src=2
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=0
+support-type=2
+support-ver=0.9.5
+tech-class=DJ9xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=2411
+usb-vid=3f0
+wifi-config=0
+
+[officejet_5110v]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=OfficeJet_5105.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet 5110v All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=15 (C6615DN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=78 (C6578DN/C6578AN)
+r0-agent2-type=2
+scan-src=2
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=359e
+support-type=2
+support-ver=0.9.5
+tech-class=DJ9xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=2411
+usb-vid=3f0
+wifi-config=0
+
+[officejet_5110]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=OfficeJet_5105.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet 5110 All-in-One Printer
+model2=HP Officejet 5110xi All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=15 (C6615DN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=78 (C6578DN/C6578AN)
+r0-agent2-type=2
+scan-src=2
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=3752
+support-type=2
+support-ver=0.9.5
+tech-class=DJ9xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=2411
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_c5200_series]
+align-type=1
+clean-type=1
+color-cal-type=3
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=Photosmart_C5100.png
+io-mfp-mode=3
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart C5240 All-in-One Printer
+model10=HP Photosmart C5293 All-in-One Printer
+model2=HP Photosmart C5250 All-in-One Printer
+model3=HP Photosmart C5270 All-in-One Printer
+model4=HP Photosmart C5273 All-in-One Printer
+model5=HP Photosmart C5275 All-in-One Printer
+model6=HP Photosmart C5280 All-in-One Printer
+model7=HP Photosmart C5283 All-in-One Printer
+model8=HP Photosmart C5288 All-in-One Printer
+model9=HP Photosmart C5290 All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=2
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=75
+r0-agent1-type=2
+r0-agent2-kind=3
+r0-agent2-sku=74
+r0-agent2-type=1
+r0-agent3-kind=3
+r0-agent3-sku=99
+r0-agent3-type=3
+r10-agent1-kind=3
+r10-agent1-sku=861
+r10-agent1-type=2
+r10-agent2-kind=3
+r10-agent2-sku=860
+r10-agent2-type=1
+r10-agent3-kind=3
+r10-agent3-sku=858
+r10-agent3-type=3
+r2-agent1-kind=3
+r2-agent1-sku=75
+r2-agent1-type=2
+r2-agent2-kind=3
+r2-agent2-sku=74
+r2-agent2-type=1
+r2-agent3-kind=3
+r2-agent3-sku=99
+r2-agent3-type=3
+r4-agent1-kind=3
+r4-agent1-sku=351
+r4-agent1-type=2
+r4-agent2-kind=3
+r4-agent2-sku=350
+r4-agent2-type=1
+r4-agent3-kind=3
+r4-agent3-sku=348
+r4-agent3-type=3
+r8-agent1-kind=3
+r8-agent1-sku=141
+r8-agent1-type=2
+r8-agent2-kind=3
+r8-agent2-sku=140
+r8-agent2-type=1
+r8-agent3-kind=3
+r8-agent3-sku=138
+r8-agent3-type=3
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.7.6
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=5d11
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_5200]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_LaserJet_5000.png
+io-mfp-mode=3
+io-mode=1
+io-support=7
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 5200 Printer
+model2=HP LaserJet 5200n Printer
+model3=HP LaserJet 5200tn Printer
+model4=HP LaserJet 5200dtn Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=C7115A/C7115X
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=9
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.11
+tech-class=LJMono,Postscript
+tech-subclass=LargeFormatA3
+tech-type=3
+usb-pid=6417
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_5200l]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=hp_LaserJet_5000.png
+io-mfp-mode=3
+io-mode=1
+io-support=7
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 5200L Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=C7115A/C7115X
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=9
+support-released=True
+support-subtype=3ad9
+support-type=2
+support-ver=0.9.11
+tech-class=LJMono,Postscript
+tech-subclass=LargeFormatA3
+tech-type=3
+usb-pid=6617
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_5200lx]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=hp_LaserJet_5000.png
+io-mfp-mode=3
+io-mode=1
+io-support=7
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 5200LX Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=C7115A/C7115X
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=9
+support-released=True
+support-subtype=3a05
+support-type=2
+support-ver=2.8.1
+tech-class=LJMono
+tech-subclass=Normal
+tech-type=3
+usb-pid=8917
+usb-vid=3f0
+wifi-config=0
+
+[hp_color_laserjet_cp5225]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_color_laserjet_cp3525.png
+io-mfp-mode=1
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Color LaserJet CP5225
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CE740A
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=CE741A
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=CD743A
+r0-agent3-type=5
+r0-agent4-kind=4
+r0-agent4-sku=CE742A
+r0-agent4-type=6
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=6
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.9.12
+tech-class=LJColor,Postscript
+tech-subclass=Normal
+tech-type=4
+usb-pid=5117
+usb-vid=3f0
+wifi-config=0
+
+[hp_color_laserjet_cp5225n]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_color_laserjet_cp3525.png
+io-mfp-mode=1
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Color LaserJet CP5225n
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CE740A
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=CE741A
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=CD743A
+r0-agent3-type=5
+r0-agent4-kind=4
+r0-agent4-sku=CE742A
+r0-agent4-type=6
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=6
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.9.12
+tech-class=LJColor,Postscript
+tech-subclass=Normal
+tech-type=4
+usb-pid=5117
+usb-vid=3f0
+wifi-config=0
+
+[hp_color_laserjet_cp5225dn]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_color_laserjet_cp3525.png
+io-mfp-mode=1
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Color LaserJet CP5225dn
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CE740A
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=CE741A
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=CD743A
+r0-agent3-type=5
+r0-agent4-kind=4
+r0-agent4-sku=CE742A
+r0-agent4-type=6
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=6
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.9.12
+tech-class=LJColor,Postscript
+tech-subclass=Normal
+tech-type=4
+usb-pid=5117
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_c5300_series]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=Photosmart_C5100.png
+io-mfp-mode=3
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart C5370 All-in-One Printer
+model2=HP Photosmart C5373 All-in-One Printer
+model3=HP Photosmart C5380 All-in-One Printer
+model4=HP Photosmart C5383 All-in-One Printer
+model5=HP Photosmart C5388 All-in-One Printer
+model6=HP Photosmart C5390 All-in-One Printer
+model7=HP Photosmart C5393 All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=2
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=2
+r0-agent1-sku=04/04XL
+r0-agent1-type=1
+r0-agent2-kind=2
+r0-agent2-sku=04/04XL
+r0-agent2-type=4
+r0-agent3-kind=2
+r0-agent3-sku=04/04XL
+r0-agent3-type=5
+r0-agent4-kind=2
+r0-agent4-sku=04/04XL
+r0-agent4-type=6
+r0-agent5-kind=2
+r0-agent5-sku=04/04XL
+r0-agent5-type=19
+r1-agent1-kind=2
+r1-agent1-sku=04/04XL
+r1-agent1-type=1
+r1-agent2-kind=2
+r1-agent2-sku=04/04XL
+r1-agent2-type=4
+r1-agent3-kind=2
+r1-agent3-sku=04/04XL
+r1-agent3-type=5
+r1-agent4-kind=2
+r1-agent4-sku=04/04XL
+r1-agent4-type=6
+r1-agent5-kind=2
+r1-agent5-sku=04/04XL
+r1-agent5-type=19
+r2-agent1-kind=2
+r2-agent1-sku=360/360XL
+r2-agent1-type=1
+r2-agent2-kind=2
+r2-agent2-sku=360/360XL
+r2-agent2-type=4
+r2-agent3-kind=2
+r2-agent3-sku=360/360XL
+r2-agent3-type=5
+r2-agent4-kind=2
+r2-agent4-sku=360/360XL
+r2-agent4-type=6
+r2-agent5-kind=2
+r2-agent5-sku=360/360XL
+r2-agent5-type=19
+r4-agent1-kind=2
+r4-agent1-sku=155/155XL
+r4-agent1-type=1
+r4-agent2-kind=2
+r4-agent2-sku=155/155XL
+r4-agent2-type=4
+r4-agent3-kind=2
+r4-agent3-sku=155/155XL
+r4-agent3-type=5
+r4-agent4-kind=2
+r4-agent4-sku=155/155XL
+r4-agent4-type=6
+r4-agent5-kind=2
+r4-agent5-sku=155/155XL
+r4-agent5-type=19
+r8-agent1-kind=2
+r8-agent1-sku=808/808XL
+r8-agent1-type=1
+r8-agent2-kind=2
+r8-agent2-sku=808/808XL
+r8-agent2-type=4
+r8-agent3-kind=2
+r8-agent3-sku=808/808XL
+r8-agent3-type=5
+r8-agent4-kind=2
+r8-agent4-sku=808/808XL
+r8-agent4-type=6
+r8-agent5-kind=2
+r8-agent5-sku=808/808XL
+r8-agent5-type=19
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=2
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.8.10
+tech-class=Python
+tech-subclass=NoCDDVD,NoAutoDuplex,NoMaxDPI
+tech-type=2
+usb-pid=7111
+usb-vid=3f0
+wifi-config=0
+
+[officejet_pro_k5300]
+align-type=1
+clean-type=1
+color-cal-type=5
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=officejet_k550.png
+io-mfp-mode=3
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=1
+model1=HP Officejet Pro K5300 Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=1
+r-type=0
+r0-agent1-kind=1
+r0-agent1-sku=88 (C9381)
+r0-agent1-type=14
+r0-agent2-kind=1
+r0-agent2-sku=88 (C9382)
+r0-agent2-type=15
+r0-agent3-kind=2
+r0-agent3-sku=18 (C4936A)
+r0-agent3-type=1
+r0-agent4-kind=2
+r0-agent4-sku=18 (C4939A)
+r0-agent4-type=6
+r0-agent5-kind=2
+r0-agent5-sku=18 (C4938A)
+r0-agent5-type=5
+r0-agent6-kind=2
+r0-agent6-sku=18 (C4937A)
+r0-agent6-type=4
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=1.7.2
+tech-class=DJGenericVIP
+tech-subclass=NoFullBleed
+tech-type=2
+usb-pid=1f12
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_d5300_series]
+align-type=1
+clean-type=1
+color-cal-type=3
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=Photosmart_C5100.png
+io-mfp-mode=3
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart D5345 Printer
+model2=HP Photosmart D5360 Printer
+model3=HP Photosmart D5363 Printer
+model4=HP Photosmart D5368 Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=2
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=75
+r0-agent1-type=2
+r0-agent2-kind=3
+r0-agent2-sku=74
+r0-agent2-type=1
+r0-agent3-kind=3
+r0-agent3-sku=99
+r0-agent3-type=3
+r10-agent1-kind=3
+r10-agent1-sku=861
+r10-agent1-type=2
+r10-agent2-kind=3
+r10-agent2-sku=860
+r10-agent2-type=1
+r10-agent3-kind=3
+r10-agent3-sku=858
+r10-agent3-type=3
+r2-agent1-kind=3
+r2-agent1-sku=75
+r2-agent1-type=2
+r2-agent2-kind=3
+r2-agent2-sku=74
+r2-agent2-type=1
+r2-agent3-kind=3
+r2-agent3-sku=99
+r2-agent3-type=3
+r4-agent1-kind=3
+r4-agent1-sku=351
+r4-agent1-type=2
+r4-agent2-kind=3
+r4-agent2-sku=350
+r4-agent2-type=1
+r4-agent3-kind=3
+r4-agent3-sku=348
+r4-agent3-type=3
+r8-agent1-kind=3
+r8-agent1-sku=141
+r8-agent1-type=2
+r8-agent2-kind=3
+r8-agent2-sku=140
+r8-agent2-type=1
+r8-agent3-kind=3
+r8-agent3-sku=138
+r8-agent3-type=3
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.7.9
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=6811
+usb-vid=3f0
+wifi-config=0
+
+[officejet_pro_k5400]
+align-type=1
+clean-type=1
+color-cal-type=5
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=officejet_k550.png
+io-mfp-mode=3
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=1
+model1=HP Officejet Pro K5400dn Printer
+model2=HP Officejet Pro K5400dtn Printer
+model3=HP Officejet Pro K5400n Printer
+model4=HP Officejet Pro K5400 Printer
+model5=HP Officejet Pro K5400z Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=1
+r-type=0
+r0-agent1-kind=1
+r0-agent1-sku=88 (C9381)
+r0-agent1-type=14
+r0-agent2-kind=1
+r0-agent2-sku=88 (C9382)
+r0-agent2-type=15
+r0-agent3-kind=2
+r0-agent3-sku=88 (C9396 ) / 88L (C9385)
+r0-agent3-type=1
+r0-agent4-kind=2
+r0-agent4-sku=88 (C9388) / 88L (C9393)
+r0-agent4-type=6
+r0-agent5-kind=2
+r0-agent5-sku=88 (C9387) / 88L (C9392)
+r0-agent5-type=5
+r0-agent6-kind=2
+r0-agent6-sku=88 (C9386) / 88L (C9391)
+r0-agent6-type=4
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=1.7.2
+tech-class=DJGenericVIP
+tech-subclass=NoFullBleed
+tech-type=2
+usb-pid=2012
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_d5400_series]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=Photosmart_D6160.png
+io-mfp-mode=3
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart D5460 Printer
+model2=HP Photosmart D5463 Printer
+model3=HP Photosmart D5468 Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=2
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=2
+r0-agent1-sku=04/04XL
+r0-agent1-type=1
+r0-agent2-kind=2
+r0-agent2-sku=04/04XL
+r0-agent2-type=4
+r0-agent3-kind=2
+r0-agent3-sku=04/04XL
+r0-agent3-type=5
+r0-agent4-kind=2
+r0-agent4-sku=04/04XL
+r0-agent4-type=6
+r0-agent5-kind=2
+r0-agent5-sku=04/04XL
+r0-agent5-type=19
+r1-agent1-kind=2
+r1-agent1-sku=04/04XL
+r1-agent1-type=1
+r1-agent2-kind=2
+r1-agent2-sku=04/04XL
+r1-agent2-type=4
+r1-agent3-kind=2
+r1-agent3-sku=04/04XL
+r1-agent3-type=5
+r1-agent4-kind=2
+r1-agent4-sku=04/04XL
+r1-agent4-type=6
+r1-agent5-kind=2
+r1-agent5-sku=04/04XL
+r1-agent5-type=19
+r2-agent1-kind=2
+r2-agent1-sku=360/360XL
+r2-agent1-type=1
+r2-agent2-kind=2
+r2-agent2-sku=360/360XL
+r2-agent2-type=4
+r2-agent3-kind=2
+r2-agent3-sku=360/360XL
+r2-agent3-type=5
+r2-agent4-kind=2
+r2-agent4-sku=360/360XL
+r2-agent4-type=6
+r2-agent5-kind=2
+r2-agent5-sku=360/360XL
+r2-agent5-type=19
+r4-agent1-kind=2
+r4-agent1-sku=155/155XL
+r4-agent1-type=1
+r4-agent2-kind=2
+r4-agent2-sku=155/155XL
+r4-agent2-type=4
+r4-agent3-kind=2
+r4-agent3-sku=155/155XL
+r4-agent3-type=5
+r4-agent4-kind=2
+r4-agent4-sku=155/155XL
+r4-agent4-type=6
+r4-agent5-kind=2
+r4-agent5-sku=155/155XL
+r4-agent5-type=19
+r8-agent1-kind=2
+r8-agent1-sku=808/808XL
+r8-agent1-type=1
+r8-agent2-kind=2
+r8-agent2-sku=808/808XL
+r8-agent2-type=4
+r8-agent3-kind=2
+r8-agent3-sku=808/808XL
+r8-agent3-type=5
+r8-agent4-kind=2
+r8-agent4-sku=808/808XL
+r8-agent4-type=6
+r8-agent5-kind=2
+r8-agent5-sku=808/808XL
+r8-agent5-type=16
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=2
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.8.6
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=6d11
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_5400_series]
+align-type=10
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=Deskjet_5400_series.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 5420v Photo Printer
+model2=HP Deskjet 5432 Photo Printer
+model3=HP Deskjet 5438 Photo Printer
+model4=HP Deskjet 5440v Photo Printer
+model5=HP Deskjet 5440 Photo Printer
+model6=HP Deskjet 5440xi Photo Printer
+model7=HP Deskjet 5442 Photo Printer
+model8=HP Deskjet 5443 Photo Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=92 (C9361WN)/94 (C8765WN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=93 (C9362WN)/95 (C8766WN)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=99 (C9369WN)
+r0-agent3-type=3
+r0-agent4-kind=3
+r0-agent4-sku=100 (C9368AN)
+r0-agent4-type=10
+r1-agent1-kind=3
+r1-agent1-sku=92 (C9361WN)/94 (C8765WN)
+r1-agent1-type=1
+r1-agent2-kind=3
+r1-agent2-sku=93 (C9362WN)/95 (C8766WN)
+r1-agent2-type=2
+r1-agent3-kind=3
+r1-agent3-sku=99 (C9369WN)
+r1-agent3-type=3
+r1-agent4-kind=3
+r1-agent4-sku=100 (C9368AN)
+r1-agent4-type=10
+r2-agent1-kind=3
+r2-agent1-sku=92 (C9361WN)/94 (C8765WN)
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=93 (C9362WN)/95 (C8766WN)
+r2-agent2-type=2
+r2-agent3-kind=3
+r2-agent3-sku=99 (C9369WN)
+r2-agent3-type=3
+r2-agent4-kind=3
+r2-agent4-sku=100 (C9368AN)
+r2-agent4-type=10
+r3-agent1-kind=3
+r3-agent1-sku=92 (C9361WN)/94 (C8765WN)
+r3-agent1-type=1
+r3-agent2-kind=3
+r3-agent2-sku=93 (C9362WN)/95 (C8766WN)
+r3-agent2-type=2
+r3-agent3-kind=3
+r3-agent3-sku=99 (C9369WN)
+r3-agent3-type=3
+r3-agent4-kind=3
+r3-agent4-sku=100 (C9368AN)
+r3-agent4-type=10
+r4-agent1-kind=3
+r4-agent1-sku=337 (C9361EN)/338 (C8765EN)
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=342 (C9362EN)/343 (C8766EN)
+r4-agent2-type=2
+r4-agent3-kind=3
+r4-agent3-sku=348 (C9369EN)
+r4-agent3-type=3
+r4-agent4-kind=3
+r4-agent4-sku=100 (C9368AN)
+r4-agent4-type=10
+r5-agent1-kind=3
+r5-agent1-sku=132 (C9361HN)/131 (C8765HN)
+r5-agent1-type=1
+r5-agent2-kind=3
+r5-agent2-sku=136 (C9362HN)/135 (C8766HN)
+r5-agent2-type=2
+r5-agent3-kind=3
+r5-agent3-sku=138 (C9369HN)
+r5-agent3-type=3
+r5-agent4-kind=3
+r5-agent4-sku=100 (C9368AN)
+r5-agent4-type=10
+r6-agent1-kind=3
+r6-agent1-sku=132 (C9361HN)/131 (C8765HN)
+r6-agent1-type=1
+r6-agent2-kind=3
+r6-agent2-sku=136 (C9362HN)/135 (C8766HN)
+r6-agent2-type=2
+r6-agent3-kind=3
+r6-agent3-sku=138 (C9369HN)
+r6-agent3-type=3
+r6-agent4-kind=3
+r6-agent4-sku=100 (C9368AN)
+r6-agent4-type=10
+r7-agent1-kind=3
+r7-agent1-sku=850 (C9361ZN)/852 (C8765ZN)
+r7-agent1-type=1
+r7-agent2-kind=3
+r7-agent2-sku=854 (C9362ZN)/855 (C8766ZN)
+r7-agent2-type=2
+r7-agent3-kind=3
+r7-agent3-sku=858 (C9369ZN)
+r7-agent3-type=3
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=8604
+usb-vid=3f0
+wifi-config=0
+
+[officejet_5500_series]
+align-type=6
+clean-type=2
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=1
+fw-download=False
+icon=officejet_5500_series.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet 5505 All-in-One Printer
+model2=HP Officejet 5508 All-in-One Printer
+model3=HP Officejet 5510v All-in-One Printer
+model4=HP Officejet 5510 All-in-One Printer
+model5=HP Officejet 5510xi All-in-One Printer
+model6=HP Officejet 5515 All-in-One Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=56 (C6656A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=57 (C6657A)
+r0-agent2-type=2
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJ3600
+tech-subclass=Normal
+tech-type=2
+usb-pid=3a11
+usb-vid=3f0
+wifi-config=0
+
+[officejet_j5500_series]
+align-type=6
+clean-type=2
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=1
+fw-download=False
+icon=officejet_j5500_series.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet J5505 All-in-One Printer
+model2=HP Officejet J5508 All-in-One Printer
+model3=HP Officejet J5510xi All-in-One Printer
+model4=HP Officejet J5510 All-in-One Printer
+model5=HP Officejet J5510v All-in-One Printer
+model6=HP Officejet J5515 All-in-One Printer
+model7=HP Officejet J5520 All-in-One Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=21
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=22
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=58
+r0-agent3-type=3
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=3bec
+support-type=2
+support-ver=2.7.9
+tech-class=DJ3600
+tech-subclass=Normal
+tech-type=2
+usb-pid=3012
+usb-vid=3f0
+wifi-config=0
+
+[hp_color_laserjet_5500]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=LASERJET_5500.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Color LaserJet 5500 Printer
+model2=HP Color LaserJet 5500n Printer
+model3=HP Color LaserJet 5500dn Printer
+model4=HP Color LaserJet 5500dtn Printer
+model5=HP Color LaserJet 5500hdn Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=30 (C9730A)
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=31 (C9731A)
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=33 (C9733A)
+r0-agent3-type=5
+r0-agent4-kind=4
+r0-agent4-sku=32 (C9732A)
+r0-agent4-type=6
+r0-agent5-kind=5
+r0-agent5-sku=35 (C9735A)
+r0-agent5-type=62
+r0-agent6-kind=8
+r0-agent6-sku=34 (C9734A)
+r0-agent6-type=62
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=3912
+support-type=2
+support-ver=0.9.5
+tech-class=LJColor,Postscript
+tech-subclass=LargeFormatA3
+tech-type=4
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_designjet_5500]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=0
+io-mode=0
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP Designjet 5500 Printer (42 in)
+model2=HP Designjet 5500 Printer (60 in)
+model3=HP Designjet 5500UV Printer (42 in)
+model4=HP Designjet 5500UV Printer (60 in)
+model5=HP Designjet 5500UVPS Printer (42 in)
+model6=HP Designjet 5500UVPS Printer (60 in)
+model7=HP Designjet 5500PS Printer (42 in)
+model8=HP Designjet 5500PS Printer (60 in)
+model9=HP Designjet 5500mfp
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=219b2b
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_d5500_series]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=hp_deskjet_f4200.png
+io-mfp-mode=3
+io-mode=1
+io-support=10
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet D5545 Printer
+model2=HP Deskjet D5560 Printer
+model3=HP Deskjet D5563 Printer
+model4=HP Deskjet D5568 Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=60/60XL/60b
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=60/60XL
+r0-agent2-type=2
+r10-agent1-kind=3
+r10-agent1-sku=818/818XL/818b
+r10-agent1-type=1
+r10-agent2-kind=3
+r10-agent2-sku=818/818XL
+r10-agent2-type=2
+r18-agent2-kind=3
+r18-agent2-sku=93/95
+r18-agent2-type=2
+r18-agent3-kind=3
+r18-agent3-sku=99
+r18-agent3-type=3
+r2-agent1-kind=3
+r2-agent1-sku=60/60XL/60b
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=60/60XL
+r2-agent2-type=2
+r4-agent1-kind=3
+r4-agent1-sku=300/300XL/300b
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=300/300XL
+r4-agent2-type=2
+r8-agent1-kind=3
+r8-agent1-sku=121/121XL/121b
+r8-agent1-type=1
+r8-agent2-kind=3
+r8-agent2-sku=121/121XL
+r8-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.9.8
+tech-class=ViperPlusVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=8211
+usb-vid=3f0
+wifi-config=1
+
+[photosmart_c5500_series]
+align-type=1
+clean-type=1
+color-cal-type=3
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=Photosmart_C5100.png
+io-mfp-mode=3
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart C5540 All-in-One Printer
+model2=HP Photosmart C5550 All-in-One Printer
+model3=HP Photosmart C5570 All-in-One Printer
+model4=HP Photosmart C5580 All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=2
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=75
+r0-agent1-type=2
+r0-agent2-kind=3
+r0-agent2-sku=74
+r0-agent2-type=1
+r0-agent3-kind=3
+r0-agent3-sku=99
+r0-agent3-type=3
+r10-agent1-kind=3
+r10-agent1-sku=861
+r10-agent1-type=2
+r10-agent2-kind=3
+r10-agent2-sku=860
+r10-agent2-type=1
+r10-agent3-kind=3
+r10-agent3-sku=858
+r10-agent3-type=3
+r2-agent1-kind=3
+r2-agent1-sku=75
+r2-agent1-type=2
+r2-agent2-kind=3
+r2-agent2-sku=74
+r2-agent2-type=1
+r2-agent3-kind=3
+r2-agent3-sku=99
+r2-agent3-type=3
+r4-agent1-kind=3
+r4-agent1-sku=351
+r4-agent1-type=2
+r4-agent2-kind=3
+r4-agent2-sku=350
+r4-agent2-type=1
+r4-agent3-kind=3
+r4-agent3-sku=348
+r4-agent3-type=3
+r8-agent1-kind=3
+r8-agent1-sku=141
+r8-agent1-type=2
+r8-agent2-kind=3
+r8-agent2-sku=140
+r8-agent2-type=1
+r8-agent3-kind=3
+r8-agent3-sku=138
+r8-agent3-type=3
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.8.7
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=7211
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_5510d_series]
+align-type=0
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=psc_2300_series.png
+io-mfp-mode=3
+io-mode=3
+io-support=10
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart 5510d e-All-in-One
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=2
+r0-agent1-sku=564/564XL
+r0-agent1-type=1
+r0-agent2-kind=2
+r0-agent2-sku=564/564XL
+r0-agent2-type=4
+r0-agent3-kind=2
+r0-agent3-sku=564/564XL
+r0-agent3-type=5
+r0-agent4-kind=2
+r0-agent4-sku=564/564XL
+r0-agent4-type=6
+r1-agent1-kind=2
+r1-agent1-sku=364/364XL
+r1-agent1-type=1
+r1-agent2-kind=2
+r1-agent2-sku=364/364XL
+r1-agent2-type=4
+r1-agent3-kind=2
+r1-agent3-sku=364/364XL
+r1-agent3-type=5
+r1-agent4-kind=2
+r1-agent4-sku=364/364XL
+r1-agent4-type=6
+r2-agent1-kind=2
+r2-agent1-sku=178/178XL
+r2-agent1-type=1
+r2-agent2-kind=2
+r2-agent2-sku=178/178XL
+r2-agent2-type=4
+r2-agent3-kind=2
+r2-agent3-sku=178/178XL
+r2-agent3-type=5
+r2-agent4-kind=2
+r2-agent4-sku=178/178XL
+r2-agent4-type=6
+r3-agent1-kind=2
+r3-agent1-sku=862/862XL
+r3-agent1-type=1
+r3-agent2-kind=2
+r3-agent2-sku=862/862XL
+r3-agent2-type=4
+r3-agent3-kind=2
+r3-agent3-sku=862/862XL
+r3-agent3-type=5
+r3-agent4-kind=2
+r3-agent4-sku=862/862XL
+r3-agent4-type=6
+scan-src=1
+scan-type=7
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.11.12
+tech-class=Copperhead
+tech-subclass=AutoDuplex
+tech-type=2
+usb-pid=b411
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_5510_series]
+align-type=0
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=psc_2300_series.png
+io-mfp-mode=3
+io-mode=3
+io-support=10
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart 5510 e-All-in-One
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=2
+r0-agent1-sku=564/564XL
+r0-agent1-type=1
+r0-agent2-kind=2
+r0-agent2-sku=564/564XL
+r0-agent2-type=4
+r0-agent3-kind=2
+r0-agent3-sku=564/564XL
+r0-agent3-type=5
+r0-agent4-kind=2
+r0-agent4-sku=564/564XL
+r0-agent4-type=6
+r1-agent1-kind=2
+r1-agent1-sku=364/364XL
+r1-agent1-type=1
+r1-agent2-kind=2
+r1-agent2-sku=364/364XL
+r1-agent2-type=4
+r1-agent3-kind=2
+r1-agent3-sku=364/364XL
+r1-agent3-type=5
+r1-agent4-kind=2
+r1-agent4-sku=364/364XL
+r1-agent4-type=6
+r2-agent1-kind=2
+r2-agent1-sku=178/178XL
+r2-agent1-type=1
+r2-agent2-kind=2
+r2-agent2-sku=178/178XL
+r2-agent2-type=4
+r2-agent3-kind=2
+r2-agent3-sku=178/178XL
+r2-agent3-type=5
+r2-agent4-kind=2
+r2-agent4-sku=178/178XL
+r2-agent4-type=6
+r3-agent1-kind=2
+r3-agent1-sku=862/862XL
+r3-agent1-type=1
+r3-agent2-kind=2
+r3-agent2-sku=862/862XL
+r3-agent2-type=4
+r3-agent3-kind=2
+r3-agent3-sku=862/862XL
+r3-agent3-type=5
+r3-agent4-kind=2
+r3-agent4-sku=862/862XL
+r3-agent4-type=6
+scan-src=1
+scan-type=7
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.11.10
+tech-class=Copperhead
+tech-subclass=Normal
+tech-type=2
+usb-pid=a111
+usb-vid=3f0
+wifi-config=0
+
+[hp_color_laserjet_cp5520_series]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=default_printer.png
+io-mfp-mode=3
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Color LaserJet CP5520 Series Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CE270A
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=CE271A
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=CE273A
+r0-agent3-type=5
+r0-agent4-kind=4
+r0-agent4-sku=CE272A
+r0-agent4-type=6
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.11.1
+tech-class=LJColor,Postscript
+tech-subclass=Normal
+tech-type=4
+usb-pid=9b17
+usb-vid=3f0
+wifi-config=0
+
+[hp_color_laserjet_5550]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=LASERJET_5500.png
+io-mfp-mode=6
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Color LaserJet 5550n Printer
+model2=HP Color LaserJet 5550 Printer
+model3=HP Color LaserJet 5550dn Printer
+model4=HP Color LaserJet 5550dtn Printer
+model5=HP Color LaserJet 5550hdn Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=30 (C9730A)
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=31 (C9731A)
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=33 (C9733A)
+r0-agent3-type=5
+r0-agent4-kind=4
+r0-agent4-sku=32 (C9732A)
+r0-agent4-type=6
+r0-agent5-kind=5
+r0-agent5-sku=35 (C9735A)
+r0-agent5-type=62
+r0-agent6-kind=8
+r0-agent6-sku=34 (C9734A)
+r0-agent6-type=62
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=LJColor,Postscript
+tech-subclass=LargeFormatA3
+tech-type=4
+usb-pid=1f17
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_5550]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=deskjet_5550.png
+io-mfp-mode=6
+io-mode=1
+io-support=3
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 5550 Color Inkjet Printer
+model2=HP Deskjet 5550w Color Inkjet Printer
+model3=HP Deskjet 5550v Color Inkjet Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=56 (C6656A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=57 (C6657A)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=58 (C6658A)
+r0-agent3-type=3
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJ55xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=6004
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_5551]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=deskjet_5550.png
+io-mfp-mode=6
+io-mode=1
+io-support=3
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 5551 Color Inkjet Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=56 (C6656A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=57 (C6657A)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=58 (C6658A)
+r0-agent3-type=3
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJ55xx
+tech-subclass=Normal
+tech-type=2
+usb-pid=6004
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_5552]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=deskjet_5552.png
+io-mfp-mode=6
+io-mode=1
+io-support=3
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 5552 Color Inkjet Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=56 (C6656A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=57 (C6657A)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=58 (C6658A)
+r0-agent3-type=3
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=357e
+support-type=2
+support-ver=0.9.5
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=6004
+usb-vid=3f0
+wifi-config=0
+
+[officejet_5600_series]
+align-type=6
+clean-type=2
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=1
+fw-download=False
+icon=officejet_5600.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet 5600 Series All-in-One Printer
+model10=HP Officejet 5679 All-in-One Printer
+model11=HP Officejet 5680 All-in-One Printer
+model2=HP Officejet 5605 All-in-One Printer
+model3=HP Officejet 5607 All-in-One Printer
+model4=HP Officejet 5608 All-in-One Printer
+model5=HP Officejet 5609 All-in-One Printer
+model6=HP Officejet 5610 All-in-One Printer
+model7=HP Officejet 5610xi All-in-One Printer
+model8=HP Officejet 5610v All-in-One Printer
+model9=HP Officejet 5615 All-in-One Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=56 (C6656A) /27 (C8727A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=22 (C9352A)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=58 (C6658A)
+r0-agent3-type=3
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJ3600
+tech-subclass=Normal
+tech-type=2
+usb-pid=4f11
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_5600]
+align-type=1
+clean-type=1
+color-cal-type=3
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=deskjet_5600.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 5600 Color Inkjet Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=56 (C6656A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=57 (C6657A)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=58 (C6658A)
+r0-agent3-type=3
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=0
+support-type=2
+support-ver=0.9.5
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_5650]
+align-type=1
+clean-type=1
+color-cal-type=3
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=deskjet_5600.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 5650 Color Inkjet Printer
+model2=HP Deskjet 5650w Color Inkjet Printer
+model3=HP Deskjet 5650v Color Inkjet Printer
+model4=HP Deskjet 5655 Color Inkjet Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=56 (C6656A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=57 (C6657A)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=58 (C6658A)
+r0-agent3-type=3
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=3d4d
+support-type=2
+support-ver=0.9.5
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=6104
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_5652]
+align-type=1
+clean-type=1
+color-cal-type=3
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=deskjet_5600.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 5652 Color Inkjet Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=56 (C6656A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=57 (C6657A)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=58 (C6658A)
+r0-agent3-type=3
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_5700]
+align-type=1
+clean-type=1
+color-cal-type=3
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=Deskjet_5700.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 5700 Color Inkjet Printer
+model2=HP Deskjet 5740 Color Inkjet Printer
+model3=HP Deskjet 5740xi Color Inkjet Printer
+model4=HP Deskjet 5743 Color Inkjet Printer
+model5=HP Deskjet 5745 Color Inkjet Printer
+model6=HP Deskjet 5748 Color Inkjet Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=94 (C8765WN)/96 (C8767WN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=95 (C8766WN)/97 (C9363WN)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=99 (C9369WN)
+r0-agent3-type=3
+r1-agent1-kind=3
+r1-agent1-sku=96 (C8767WN)/94 (C8765WN)
+r1-agent1-type=1
+r1-agent2-kind=3
+r1-agent2-sku=97 (C9363WN)/95 (C8766WN)
+r1-agent2-type=2
+r1-agent3-kind=3
+r1-agent3-sku=99 (C9369WN)
+r1-agent3-type=3
+r2-agent1-kind=3
+r2-agent1-sku=94 (C8765WN)/96 (C8767WN)
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=95 (C8766WN)/97 (C9363WN)
+r2-agent2-type=2
+r2-agent3-kind=3
+r2-agent3-sku=99 (C9369WN)
+r2-agent3-type=3
+r3-agent1-kind=3
+r3-agent1-sku=94 (C8765WN)/96 (C8767WN)
+r3-agent1-type=1
+r3-agent2-kind=3
+r3-agent2-sku=95 (C8766WN)/97 (C9363WN)
+r3-agent2-type=2
+r3-agent3-kind=3
+r3-agent3-sku=99 (C9369WN)
+r3-agent3-type=3
+r4-agent1-kind=3
+r4-agent1-sku=339 (C8767EN)/338 (C8765EN)
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=344 (C9363EN)/343 (C8766EN)
+r4-agent2-type=2
+r4-agent3-kind=3
+r4-agent3-sku=348 (C9369EN)
+r4-agent3-type=3
+r5-agent1-kind=3
+r5-agent1-sku=130 (C8767HN)/131 (C8766HN)
+r5-agent1-type=1
+r5-agent2-kind=3
+r5-agent2-sku=134 (C8766HN)/135 (C9363HN)
+r5-agent2-type=2
+r5-agent3-kind=3
+r5-agent3-sku=138 (C9369HN)
+r5-agent3-type=3
+r6-agent1-kind=3
+r6-agent1-sku=130 (C8767HN)/131 (C8766HN)
+r6-agent1-type=1
+r6-agent2-kind=3
+r6-agent2-sku=134 (C8766HN)/135 (C9363HN)
+r6-agent2-type=2
+r6-agent3-kind=3
+r6-agent3-sku=138 (C9369HN)
+r6-agent3-type=3
+r7-agent1-kind=3
+r7-agent1-sku=853 (C8767ZN)/852 (C8765ZN)
+r7-agent1-type=1
+r7-agent2-kind=3
+r7-agent2-sku=857 (C9363ZN)/855 (C8766ZN)
+r7-agent2-type=2
+r7-agent3-kind=3
+r7-agent3-sku=858 (C9369ZN)
+r7-agent3-type=3
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=8104
+usb-vid=3f0
+wifi-config=0
+
+[officejet_j5700_series]
+align-type=1
+clean-type=1
+color-cal-type=3
+copy-type=0
+embedded-server-type=1
+fax-type=1
+fw-download=False
+icon=officejet_5600.png
+io-mfp-mode=3
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet J5725 All-in-One Printer
+model10=HP Officejet J5785 All-in-One Printer
+model11=HP Officejet J5788 All-in-One Printer
+model12=HP Officejet J5790 All-in-One Printer
+model2=HP Officejet J5725 All-in-One Printer
+model3=HP Officejet J5730 All-in-One Printer
+model4=HP Officejet J5735 All-in-One Printer
+model5=HP Officejet J5738 All-in-One Printer
+model6=HP Officejet J5740 All-in-One Printer
+model7=HP Officejet J5750 All-in-One Printer
+model8=HP Officejet J5780 All-in-One Printer
+model9=HP Officejet J5783 All-in-One Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=74/74XL
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=75/75XL
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=99
+r0-agent3-type=3
+r10-agent1-kind=3
+r10-agent1-sku=860/860XL
+r10-agent1-type=1
+r10-agent2-kind=3
+r10-agent2-sku=861/861XL
+r10-agent2-type=2
+r10-agent3-kind=3
+r10-agent3-sku=858
+r10-agent3-type=3
+r2-agent1-kind=3
+r2-agent1-sku=74/74XL
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=75/75/XL
+r2-agent2-type=2
+r2-agent3-kind=3
+r2-agent3-sku=99
+r2-agent3-type=3
+r4-agent1-kind=3
+r4-agent1-sku=350/350XL
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=351/351XL
+r4-agent2-type=2
+r4-agent3-kind=3
+r4-agent3-sku=348
+r4-agent3-type=3
+r8-agent1-kind=3
+r8-agent1-sku=140/140XL
+r8-agent1-type=1
+r8-agent2-kind=3
+r8-agent2-sku=141/141XL
+r8-agent2-type=2
+r8-agent3-kind=3
+r8-agent3-sku=138
+r8-agent3-type=3
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=1.7.2
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=5b11
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_5800]
+align-type=1
+clean-type=1
+color-cal-type=3
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=deskjet_5600.png
+io-mfp-mode=6
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 5800 Color Inkjet Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=56 (C6656A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=57 (C6657A)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=58 (C6658A)
+r0-agent3-type=3
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=0
+support-type=2
+support-ver=0.9.5
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=a004
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_5850]
+align-type=1
+clean-type=1
+color-cal-type=3
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=deskjet_5600.png
+io-mfp-mode=6
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 5850 Color Inkjet Printer
+model2=HP Deskjet 5850w Color Inkjet Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=56 (C6656A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=57 (C6657A)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=58 (C6658A)
+r0-agent3-type=3
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=3b04
+support-type=2
+support-ver=0.9.5
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=a004
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_5900_series]
+align-type=1
+clean-type=1
+color-cal-type=3
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=Deskjet_5900_series.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 5938 Photo Printer
+model2=HP Deskjet 5940 Photo Printer
+model3=HP Deskjet 5940xi Photo Printer
+model4=HP Deskjet 5943 Photo Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=98 (C9364WN)/96 (C8767WN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=95 (C8766WN)/97 (C9363WN)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=99 (C9369WN)
+r0-agent3-type=3
+r0-agent4-kind=3
+r0-agent4-sku=100 (C9368AN)
+r0-agent4-type=10
+r1-agent1-kind=3
+r1-agent1-sku=98 (C9364WN)/96 (C8767WN)
+r1-agent1-type=1
+r1-agent2-kind=3
+r1-agent2-sku=95 (C8766WN)/97 (C9363WN)
+r1-agent2-type=2
+r1-agent3-kind=3
+r1-agent3-sku=99 (C9369WN)
+r1-agent3-type=3
+r1-agent4-kind=3
+r1-agent4-sku=100 (C9368AN)
+r1-agent4-type=10
+r2-agent1-kind=3
+r2-agent1-sku=98 (C9364WN)/96 (C8767WN)
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=95 (C8766WN)/97 (C9363WN)
+r2-agent2-type=2
+r2-agent3-kind=3
+r2-agent3-sku=99 (C9369WN)
+r2-agent3-type=3
+r2-agent4-kind=3
+r2-agent4-sku=100 (C9368AN)
+r2-agent4-type=10
+r3-agent1-kind=3
+r3-agent1-sku=98 (C9364WN)/96 (C8767WN)
+r3-agent1-type=1
+r3-agent2-kind=3
+r3-agent2-sku=95 (C8766WN)/97 (C9363WN)
+r3-agent2-type=2
+r3-agent3-kind=3
+r3-agent3-sku=99 (C9369WN)
+r3-agent3-type=3
+r3-agent4-kind=3
+r3-agent4-sku=100 (C9368AN)
+r3-agent4-type=10
+r4-agent1-kind=3
+r4-agent1-sku=337 (C9364EN)/338 (C8765EN)
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=344 (C9363EN)/343 (C8766EN)
+r4-agent2-type=2
+r4-agent3-kind=3
+r4-agent3-sku=348 (C9369EN)
+r4-agent3-type=3
+r4-agent4-kind=3
+r4-agent4-sku=100 (C9368AN)
+r4-agent4-type=10
+r5-agent1-kind=3
+r5-agent1-sku=129 (C9364HN)/131 (C8765HN)
+r5-agent1-type=1
+r5-agent2-kind=3
+r5-agent2-sku=134 (C8766HN)/135 (C9363HN)
+r5-agent2-type=2
+r5-agent3-kind=3
+r5-agent3-sku=138 (C9369HN)
+r5-agent3-type=3
+r5-agent4-kind=3
+r5-agent4-sku=100 (C9368AN)
+r5-agent4-type=10
+r6-agent1-kind=3
+r6-agent1-sku=129 (C9364HN)/131 (C8765HN)
+r6-agent1-type=1
+r6-agent2-kind=3
+r6-agent2-sku=134 (C8766HN)/135 (C9363HN)
+r6-agent2-type=2
+r6-agent3-kind=3
+r6-agent3-sku=138 (C9369HN)
+r6-agent3-type=3
+r6-agent4-kind=3
+r6-agent4-sku=100 (C9368AN)
+r6-agent4-type=10
+r7-agent1-kind=3
+r7-agent1-sku=851 (C9364ZN)/852 (C8765ZN)
+r7-agent1-type=1
+r7-agent2-kind=3
+r7-agent2-sku=857 (C9363ZN)/855 (C8766ZN)
+r7-agent2-type=2
+r7-agent3-kind=3
+r7-agent3-sku=858 (C9369ZN)
+r7-agent3-type=3
+r7-agent4-kind=3
+r7-agent4-sku=100 (C9368AN)
+r7-agent4-type=10
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=8704
+usb-vid=3f0
+wifi-config=0
+
+[officejet_6000_e609n]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=officejet_k550.png
+io-mfp-mode=3
+io-mode=1
+io-support=14
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet 6000 Wireless Printer - E609n
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=2
+r0-agent1-sku=04/04XL
+r0-agent1-type=1
+r0-agent2-kind=2
+r0-agent2-sku=04/04XL
+r0-agent2-type=4
+r0-agent3-kind=2
+r0-agent3-sku=04/04XL
+r0-agent3-type=5
+r0-agent4-kind=2
+r0-agent4-sku=04/04XL
+r0-agent4-type=6
+r0-agent5-kind=2
+r0-agent5-sku=04/04XL
+r0-agent5-type=16
+r1-agent1-kind=2
+r1-agent1-sku=04/04XL
+r1-agent1-type=1
+r1-agent2-kind=2
+r1-agent2-sku=04/04XL
+r1-agent2-type=4
+r1-agent3-kind=2
+r1-agent3-sku=04/04XL
+r1-agent3-type=5
+r1-agent4-kind=2
+r1-agent4-sku=04/04XL
+r1-agent4-type=6
+r1-agent5-kind=2
+r1-agent5-sku=04/04XL
+r1-agent5-type=16
+r2-agent1-kind=2
+r2-agent1-sku=360/360XL
+r2-agent1-type=1
+r2-agent2-kind=2
+r2-agent2-sku=360/360XL
+r2-agent2-type=4
+r2-agent3-kind=2
+r2-agent3-sku=360/360XL
+r2-agent3-type=5
+r2-agent4-kind=2
+r2-agent4-sku=360/360XL
+r2-agent4-type=6
+r2-agent5-kind=2
+r2-agent5-sku=360/360XL
+r2-agent5-type=16
+r4-agent1-kind=2
+r4-agent1-sku=155/155XL
+r4-agent1-type=1
+r4-agent2-kind=2
+r4-agent2-sku=155/155XL
+r4-agent2-type=4
+r4-agent3-kind=2
+r4-agent3-sku=155/155XL
+r4-agent3-type=5
+r4-agent4-kind=2
+r4-agent4-sku=155/155XL
+r4-agent4-type=6
+r4-agent5-kind=2
+r4-agent5-sku=155/155XL
+r4-agent5-type=16
+r8-agent1-kind=2
+r8-agent1-sku=808/808XL
+r8-agent1-type=1
+r8-agent2-kind=2
+r8-agent2-sku=808/808XL
+r8-agent2-type=4
+r8-agent3-kind=2
+r8-agent3-sku=808/808XL
+r8-agent3-type=5
+r8-agent4-kind=2
+r8-agent4-sku=808/808XL
+r8-agent4-type=6
+r8-agent5-kind=2
+r8-agent5-sku=808/808XL
+r8-agent5-type=16
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=2
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.9.6
+tech-class=Python
+tech-subclass=NoCDDVD
+tech-type=2
+usb-pid=4312
+usb-vid=3f0
+wifi-config=1
+
+[officejet_6000_e609a]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=officejet_k550.png
+io-mfp-mode=3
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet 6000 Printer - E609a
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=2
+r0-agent1-sku=04/04XL
+r0-agent1-type=1
+r0-agent2-kind=2
+r0-agent2-sku=04/04XL
+r0-agent2-type=4
+r0-agent3-kind=2
+r0-agent3-sku=04/04XL
+r0-agent3-type=5
+r0-agent4-kind=2
+r0-agent4-sku=04/04XL
+r0-agent4-type=6
+r0-agent5-kind=2
+r0-agent5-sku=04/04XL
+r0-agent5-type=16
+r1-agent1-kind=2
+r1-agent1-sku=04/04XL
+r1-agent1-type=1
+r1-agent2-kind=2
+r1-agent2-sku=04/04XL
+r1-agent2-type=4
+r1-agent3-kind=2
+r1-agent3-sku=04/04XL
+r1-agent3-type=5
+r1-agent4-kind=2
+r1-agent4-sku=04/04XL
+r1-agent4-type=6
+r1-agent5-kind=2
+r1-agent5-sku=04/04XL
+r1-agent5-type=16
+r2-agent1-kind=2
+r2-agent1-sku=360/360XL
+r2-agent1-type=1
+r2-agent2-kind=2
+r2-agent2-sku=360/360XL
+r2-agent2-type=4
+r2-agent3-kind=2
+r2-agent3-sku=360/360XL
+r2-agent3-type=5
+r2-agent4-kind=2
+r2-agent4-sku=360/360XL
+r2-agent4-type=6
+r2-agent5-kind=2
+r2-agent5-sku=360/360XL
+r2-agent5-type=16
+r4-agent1-kind=2
+r4-agent1-sku=155/155XL
+r4-agent1-type=1
+r4-agent2-kind=2
+r4-agent2-sku=155/155XL
+r4-agent2-type=4
+r4-agent3-kind=2
+r4-agent3-sku=155/155XL
+r4-agent3-type=5
+r4-agent4-kind=2
+r4-agent4-sku=155/155XL
+r4-agent4-type=6
+r4-agent5-kind=2
+r4-agent5-sku=155/155XL
+r4-agent5-type=16
+r8-agent1-kind=2
+r8-agent1-sku=808/808XL
+r8-agent1-type=1
+r8-agent2-kind=2
+r8-agent2-sku=808/808XL
+r8-agent2-type=4
+r8-agent3-kind=2
+r8-agent3-sku=808/808XL
+r8-agent3-type=5
+r8-agent4-kind=2
+r8-agent4-sku=808/808XL
+r8-agent4-type=6
+r8-agent5-kind=2
+r8-agent5-sku=808/808XL
+r8-agent5-type=16
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=2
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.9.6
+tech-class=Python
+tech-subclass=NoAutoDuplex,NoCDDVD
+tech-type=2
+usb-pid=4212
+usb-vid=3f0
+wifi-config=0
+
+[hp_color_laserjet_cp6015]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_color_laserjet_cp6015.png
+io-mfp-mode=3
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Color LaserJet CP6015dn Printer
+model2=HP Color LaserJet CP6015x Printer
+model3=HP Color LaserJet CP6015xh Printer
+model4=HP Color LaserJet CP6015de Printer
+model5=HP Color LaserJet CP6015n Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CB380A
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=CB381A
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=CB383A
+r0-agent3-type=5
+r0-agent4-kind=4
+r0-agent4-sku=CB382A
+r0-agent4-type=6
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.8.5
+tech-class=LJColor,Postscript
+tech-subclass=LargeFormatA3
+tech-type=4
+usb-pid=6f17
+usb-vid=3f0
+wifi-config=0
+
+[hp_color_laserjet_cm6030_mfp]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=HP_Color_LaserJet_4730mfp.png
+io-mfp-mode=3
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Color LaserJet CM6030 Multifunction Printer
+model2=HP Color LaserJet CM6030f Multifunction Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CB390A
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=CB381A
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=CB383A
+r0-agent3-type=5
+r0-agent4-kind=4
+r0-agent4-sku=CB382A
+r0-agent4-type=6
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.8.6
+tech-class=LJColor,Postscript
+tech-subclass=LargeFormatA3
+tech-type=4
+usb-pid=7c17
+usb-vid=3f0
+wifi-config=0
+
+[hp_color_laserjet_cm6040_mfp]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=HP_Color_LaserJet_4730mfp.png
+io-mfp-mode=3
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Color LaserJet CM6040 Multifunction Printer
+model2=HP Color LaserJet CM6040f Multifunction Printer
+model3=HP Color LaserJet CM6049f Multifunction Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CB390A
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=CB381A
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=CB383A
+r0-agent3-type=5
+r0-agent4-kind=4
+r0-agent4-sku=CB382A
+r0-agent4-type=6
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.8.5
+tech-class=LJColor
+tech-subclass=LargeFormatA3
+tech-type=4
+usb-pid=7c17
+usb-vid=3f0
+wifi-config=0
+
+[hp_color_laserjet_cm6049_mfp]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=HP_Color_LaserJet_4730mfp.png
+io-mfp-mode=3
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Color LaserJet CM6049 MFP
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CE830C
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=CE301C
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=CE303C
+r0-agent3-type=5
+r0-agent4-kind=4
+r0-agent4-sku=CE302C
+r0-agent4-type=6
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=3b72
+support-type=2
+support-ver=3.9.6
+tech-class=LJColor
+tech-subclass=LargeFormatA3
+tech-type=4
+usb-pid=9517
+usb-vid=3f0
+wifi-config=0
+
+[hp_designjet_z6100ps_60in_photo]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=1
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Designjet z6100ps 60in photo
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.11.3
+tech-class=Postscript
+tech-subclass=Normal
+tech-type=2
+usb-pid=b14
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_c6100_series]
+align-type=1
+clean-type=1
+color-cal-type=4
+copy-type=0
+embedded-server-type=1
+fax-type=1
+fw-download=False
+icon=Photosmart_C6100.png
+io-mfp-mode=3
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart C6150 All-in-One Printer
+model2=HP Photosmart C6154 All-in-One Printer
+model3=HP Photosmart C6170 All-in-One Printer
+model4=HP Photosmart C6175 All-in-One Printer
+model5=HP Photosmart C6180 All-in-One Printer
+model6=HP Photosmart C6183 All-in-One Printer
+model7=HP Photosmart C6185 All-in-One Printer
+model8=HP Photosmart C6188 All-in-One Printer
+model9=HP Photosmart C6190 All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=2
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=2
+r0-agent1-sku=2
+r0-agent1-type=1
+r0-agent2-kind=2
+r0-agent2-sku=2
+r0-agent2-type=4
+r0-agent3-kind=2
+r0-agent3-sku=2
+r0-agent3-type=5
+r0-agent4-kind=2
+r0-agent4-sku=2
+r0-agent4-type=6
+r0-agent5-kind=2
+r0-agent5-sku=2
+r0-agent5-type=7
+r0-agent6-kind=2
+r0-agent6-sku=2
+r0-agent6-type=8
+r0-agent7-kind=1
+r0-agent7-type=12
+r1-agent1-kind=2
+r1-agent1-sku=2
+r1-agent1-type=1
+r1-agent2-kind=2
+r1-agent2-sku=2
+r1-agent2-type=4
+r1-agent3-kind=2
+r1-agent3-sku=2
+r1-agent3-type=5
+r1-agent4-kind=2
+r1-agent4-sku=2
+r1-agent4-type=6
+r1-agent5-kind=2
+r1-agent5-sku=2
+r1-agent5-type=7
+r1-agent6-kind=2
+r1-agent6-sku=2
+r1-agent6-type=8
+r1-agent7-kind=1
+r1-agent7-type=12
+r2-agent1-kind=2
+r2-agent1-sku=363
+r2-agent1-type=1
+r2-agent2-kind=2
+r2-agent2-sku=363
+r2-agent2-type=4
+r2-agent3-kind=2
+r2-agent3-sku=363
+r2-agent3-type=5
+r2-agent4-kind=2
+r2-agent4-sku=363
+r2-agent4-type=6
+r2-agent5-kind=2
+r2-agent5-sku=363
+r2-agent5-type=7
+r2-agent6-kind=2
+r2-agent6-sku=363
+r2-agent6-type=8
+r4-agent1-kind=2
+r4-agent1-sku=177
+r4-agent1-type=1
+r4-agent2-kind=2
+r4-agent2-sku=177
+r4-agent2-type=4
+r4-agent3-kind=2
+r4-agent3-sku=177
+r4-agent3-type=5
+r4-agent4-kind=2
+r4-agent4-sku=177
+r4-agent4-type=6
+r4-agent5-kind=2
+r4-agent5-sku=177
+r4-agent5-type=7
+r4-agent6-kind=2
+r4-agent6-sku=177
+r4-agent6-type=8
+r8-agent1-kind=2
+r8-agent1-sku=801
+r8-agent1-type=1
+r8-agent2-kind=2
+r8-agent2-sku=801
+r8-agent2-type=4
+r8-agent3-kind=2
+r8-agent3-sku=801
+r8-agent3-type=5
+r8-agent4-kind=2
+r8-agent4-sku=801
+r8-agent4-type=6
+r8-agent5-kind=2
+r8-agent5-sku=801
+r8-agent5-type=7
+r8-agent6-kind=2
+r8-agent6-sku=801
+r8-agent6-type=8
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=1.6.9
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=5911
+usb-vid=3f0
+wifi-config=0
+
+[officejet_6100]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=officejet_k550.png
+io-mfp-mode=3
+io-mode=1
+io-support=14
+job-storage=0
+linefeed-cal-type=0
+model1=HP OfficeJet 6100 ePrinter H611a
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=2
+r0-agent1-sku=932/932XL
+r0-agent1-type=1
+r0-agent2-kind=2
+r0-agent2-sku=933/933XL
+r0-agent2-type=4
+r0-agent3-kind=2
+r0-agent3-sku=933/933XL
+r0-agent3-type=5
+r0-agent4-kind=2
+r0-agent4-sku=933/933XL
+r0-agent4-type=6
+r1-agent2-kind=2
+r1-agent2-sku=04/04XL
+r1-agent2-type=4
+r1-agent3-kind=2
+r1-agent3-sku=04/04XL
+r1-agent3-type=5
+r1-agent4-kind=2
+r1-agent4-sku=04/04XL
+r1-agent4-type=6
+r1-agent5-kind=2
+r1-agent5-sku=04/04XL
+r1-agent5-type=16
+r2-agent2-kind=2
+r2-agent2-sku=360/360XL
+r2-agent2-type=4
+r2-agent3-kind=2
+r2-agent3-sku=360/360XL
+r2-agent3-type=5
+r2-agent4-kind=2
+r2-agent4-sku=360/360XL
+r2-agent4-type=6
+r2-agent5-kind=2
+r2-agent5-sku=360/360XL
+r2-agent5-type=16
+r4-agent2-kind=2
+r4-agent2-sku=155/155XL
+r4-agent2-type=4
+r4-agent3-kind=2
+r4-agent3-sku=155/155XL
+r4-agent3-type=5
+r4-agent4-kind=2
+r4-agent4-sku=155/155XL
+r4-agent4-type=6
+r4-agent5-kind=2
+r4-agent5-sku=155/155XL
+r4-agent5-type=16
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=2
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.12.4
+tech-class=Saipan
+tech-subclass=Normal
+tech-type=2
+usb-pid=5e12
+usb-vid=3f0
+wifi-config=3
+
+[hp_designjet_z6100ps_42in_photo]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=1
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Designjet z6100ps 42in Photo
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.11.3
+tech-class=Postscript
+tech-subclass=Normal
+tech-type=2
+usb-pid=b14
+usb-vid=3f0
+wifi-config=0
+
+[hp_designjet_z6100]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=0
+io-mode=0
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP Designjet Z6100 42-in Photo Printer
+model2=HP Designjet Z6100 60-in Photo Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=219b2b
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_d6100_series]
+align-type=1
+clean-type=1
+color-cal-type=4
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=Photosmart_D6160.png
+io-mfp-mode=3
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart D6160 Printer
+model2=HP Photosmart D6163 Printer
+model3=HP Photosmart D6168 Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=2
+r0-agent1-sku=02 (C9338W)
+r0-agent1-type=1
+r0-agent2-kind=2
+r0-agent2-sku=02 (C9339W)
+r0-agent2-type=4
+r0-agent3-kind=2
+r0-agent3-sku=02 (C9340W)
+r0-agent3-type=5
+r0-agent4-kind=2
+r0-agent4-sku=02 (C9341W)
+r0-agent4-type=6
+r0-agent5-kind=2
+r0-agent5-sku=02 (C8774W)
+r0-agent5-type=7
+r0-agent6-kind=2
+r0-agent6-sku=02 (C8775W)
+r0-agent6-type=8
+r1-agent1-kind=2
+r1-agent1-sku=02 (C9338W)
+r1-agent1-type=1
+r1-agent2-kind=2
+r1-agent2-sku=02 (C9339W)
+r1-agent2-type=4
+r1-agent3-kind=2
+r1-agent3-sku=02 (C9340W)
+r1-agent3-type=5
+r1-agent4-kind=2
+r1-agent4-sku=02 (C9341W)
+r1-agent4-type=6
+r1-agent5-kind=2
+r1-agent5-sku=02 (C8774W)
+r1-agent5-type=7
+r1-agent6-kind=2
+r1-agent6-sku=02 (C8775W)
+r1-agent6-type=8
+r2-agent1-kind=2
+r2-agent1-sku=363 (C9338E)
+r2-agent1-type=1
+r2-agent2-kind=2
+r2-agent2-sku=363 (C9339E)
+r2-agent2-type=4
+r2-agent3-kind=2
+r2-agent3-sku=363 (C9340E)
+r2-agent3-type=5
+r2-agent4-kind=2
+r2-agent4-sku=363 (C9341E)
+r2-agent4-type=6
+r2-agent5-kind=2
+r2-agent5-sku=363 (C8774E)
+r2-agent5-type=7
+r2-agent6-kind=2
+r2-agent6-sku=363 (C8775E)
+r2-agent6-type=8
+r4-agent1-kind=2
+r4-agent1-sku=177 (C9338H)
+r4-agent1-type=1
+r4-agent2-kind=2
+r4-agent2-sku=177 (C9339H)
+r4-agent2-type=4
+r4-agent3-kind=2
+r4-agent3-sku=177 (C9340H)
+r4-agent3-type=5
+r4-agent4-kind=2
+r4-agent4-sku=177 (C9341H)
+r4-agent4-type=6
+r4-agent5-kind=2
+r4-agent5-sku=177 (C8774H)
+r4-agent5-type=7
+r4-agent6-kind=2
+r4-agent6-sku=177 (C8775H)
+r4-agent6-type=8
+r8-agent1-kind=2
+r8-agent1-sku=801 (C9338Z)
+r8-agent1-type=1
+r8-agent2-kind=2
+r8-agent2-sku=801 (C9339Z)
+r8-agent2-type=4
+r8-agent3-kind=2
+r8-agent3-sku=801 (C9340Z)
+r8-agent3-type=5
+r8-agent4-kind=2
+r8-agent4-sku=801 (C9341Z)
+r8-agent4-type=6
+r8-agent5-kind=2
+r8-agent5-sku=801 (C8774Z)
+r8-agent5-type=7
+r8-agent6-kind=2
+r8-agent6-sku=801 (C8775Z)
+r8-agent6-type=8
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=2
+status-type=2
+support-released=True
+support-subtype=3b04
+support-type=2
+support-ver=1.6.7
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=c502
+usb-vid=3f0
+wifi-config=0
+
+[officejet_6100_series]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=1
+fw-download=False
+icon=OfficeJet_6100_Series.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet 6105 All-in-One Printer
+model2=HP Officejet 6110xi All-in-One Printer
+model3=HP Officejet 6110v All-in-One Printer
+model4=HP Officejet 6110 All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=56 (C6656AN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=57 (C6657AN)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=58 (C6658AN)
+r0-agent3-type=3
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=2d11
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_6120]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=deskjet_6120.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 6120 Color Inkjet Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=45 (51645A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=78 (C6578AN / C6578DN)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=0
+support-type=2
+support-ver=0.9.5
+tech-class=DJ9xxVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=3404
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_6122]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=deskjet_6120.png
+io-mfp-mode=6
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 6122 Color Inkjet Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=45 (51645A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=78 (C6578AN / C6578DN)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJ9xxVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=3404
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_6127]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=deskjet_6120.png
+io-mfp-mode=6
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 6127 Color Inkjet Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=45 (51645A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=78 (C6578AN / C6578DN)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJ9xxVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=3404
+usb-vid=3f0
+wifi-config=0
+
+[officejet_6150_series]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=1
+fw-download=False
+icon=default_officejet.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet 6150 All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=56 (C6656AN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=57 (C6657AN)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=58 (C6658AN)
+r0-agent3-type=3
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=37f1
+support-type=2
+support-ver=0.9.5
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=2d11
+usb-vid=3f0
+wifi-config=0
+
+[officejet_6200_series]
+align-type=1
+clean-type=1
+color-cal-type=3
+copy-type=0
+embedded-server-type=0
+fax-type=1
+fw-download=False
+icon=Officejet_6200_series.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet 6200 All-in-One Printer
+model2=HP Officejet 6203 All-in-One Printer
+model3=HP Officejet 6205 All-in-One Printer
+model4=HP Officejet 6208 All-in-One Printer
+model5=HP Officejet 6210xi All-in-One Printer
+model6=HP Officejet 6210v All-in-One Printer
+model7=HP Officejet 6210 All-in-One Printer
+model8=HP Officejet 6213 All-in-One Printer
+model9=HP Officejet 6215 All-in-One Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=94 (C8765WN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=95 (C8766WN)/97 (C9363WN)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=99 (C9369WN)
+r0-agent3-type=3
+r1-agent1-kind=3
+r1-agent1-sku=96/94
+r1-agent1-type=1
+r1-agent2-kind=3
+r1-agent2-sku=97/95
+r1-agent2-type=2
+r1-agent3-kind=3
+r1-agent3-sku=99
+r1-agent3-type=3
+r2-agent1-kind=3
+r2-agent1-sku=96/94
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=97/95
+r2-agent2-type=2
+r2-agent3-kind=3
+r2-agent3-sku=99
+r2-agent3-type=3
+r3-agent1-kind=3
+r3-agent1-sku=96/94
+r3-agent1-type=1
+r3-agent2-kind=3
+r3-agent2-sku=97/95
+r3-agent2-type=2
+r3-agent3-kind=3
+r3-agent3-sku=99
+r3-agent3-type=3
+r4-agent1-kind=3
+r4-agent1-sku=339/338
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=344/343
+r4-agent2-type=2
+r4-agent3-kind=3
+r4-agent3-sku=348
+r4-agent3-type=3
+r5-agent1-kind=3
+r5-agent1-sku=130/131
+r5-agent1-type=1
+r5-agent2-kind=3
+r5-agent2-sku=134/135
+r5-agent2-type=2
+r5-agent3-kind=3
+r5-agent3-sku=138
+r5-agent3-type=3
+r6-agent1-kind=3
+r6-agent1-sku=130/131
+r6-agent1-type=1
+r6-agent2-kind=3
+r6-agent2-sku=134/135
+r6-agent2-type=2
+r6-agent3-kind=3
+r6-agent3-sku=138
+r6-agent3-type=3
+r7-agent1-kind=3
+r7-agent1-sku=853/852
+r7-agent1-type=1
+r7-agent2-kind=3
+r7-agent2-sku=857/855
+r7-agent2-type=2
+r7-agent3-kind=3
+r7-agent3-sku=858
+r7-agent3-type=3
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=4b11
+usb-vid=3f0
+wifi-config=0
+
+[hp_designjet_z6200ps_42in_photo]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=1
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Designjet z6200PS 42in Photo
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.11.3
+tech-class=Postscript
+tech-subclass=Normal
+tech-type=2
+usb-pid=1014
+usb-vid=3f0
+wifi-config=0
+
+[hp_designjet_z6200ps_60in_photo]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=1
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Designjet z6200PS 60in Photo
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.11.3
+tech-class=Postscript
+tech-subclass=Normal
+tech-type=2
+usb-pid=1014
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_c6200_series]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=Photosmart_C6100.png
+io-mfp-mode=3
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart C6240 All-in-One Printer
+model10=HP Photosmart C6283 All-in-One Printer
+model11=HP Photosmart C6285 All-in-One Printer
+model12=HP Photosmart C6286 All-in-One Printer
+model13=HP Photosmart C6288 All-in-One Printer
+model2=HP Photosmart C6245 All-in-One Printer
+model3=HP Photosmart C6250 All-in-One Printer
+model4=HP Photosmart C6260 All-in-One Printer
+model5=HP Photosmart C6263 All-in-One Printer
+model6=HP Photosmart C6268 All-in-One Printer
+model7=HP Photosmart C6270 All-in-One Printer
+model8=HP Photosmart C6275 All-in-One Printer
+model9=HP Photosmart C6280 All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=2
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=2
+r0-agent1-sku=2
+r0-agent1-type=1
+r0-agent2-kind=2
+r0-agent2-sku=2
+r0-agent2-type=4
+r0-agent3-kind=2
+r0-agent3-sku=2
+r0-agent3-type=5
+r0-agent4-kind=2
+r0-agent4-sku=2
+r0-agent4-type=6
+r0-agent5-kind=2
+r0-agent5-sku=2
+r0-agent5-type=7
+r0-agent6-kind=2
+r0-agent6-sku=2
+r0-agent6-type=8
+r0-agent7-kind=1
+r0-agent7-type=12
+r1-agent1-kind=2
+r1-agent1-sku=2
+r1-agent1-type=1
+r1-agent2-kind=2
+r1-agent2-sku=2
+r1-agent2-type=4
+r1-agent3-kind=2
+r1-agent3-sku=2
+r1-agent3-type=5
+r1-agent4-kind=2
+r1-agent4-sku=2
+r1-agent4-type=6
+r1-agent5-kind=2
+r1-agent5-sku=2
+r1-agent5-type=7
+r1-agent6-kind=2
+r1-agent6-sku=2
+r1-agent6-type=8
+r1-agent7-kind=1
+r1-agent7-type=12
+r2-agent1-kind=2
+r2-agent1-sku=363
+r2-agent1-type=1
+r2-agent2-kind=2
+r2-agent2-sku=363
+r2-agent2-type=4
+r2-agent3-kind=2
+r2-agent3-sku=363
+r2-agent3-type=5
+r2-agent4-kind=2
+r2-agent4-sku=363
+r2-agent4-type=6
+r2-agent5-kind=2
+r2-agent5-sku=363
+r2-agent5-type=7
+r2-agent6-kind=2
+r2-agent6-sku=363
+r2-agent6-type=8
+r4-agent1-kind=2
+r4-agent1-sku=177
+r4-agent1-type=1
+r4-agent2-kind=2
+r4-agent2-sku=177
+r4-agent2-type=4
+r4-agent3-kind=2
+r4-agent3-sku=177
+r4-agent3-type=5
+r4-agent4-kind=2
+r4-agent4-sku=177
+r4-agent4-type=6
+r4-agent5-kind=2
+r4-agent5-sku=177
+r4-agent5-type=7
+r4-agent6-kind=2
+r4-agent6-sku=177
+r4-agent6-type=8
+r8-agent1-kind=2
+r8-agent1-sku=801
+r8-agent1-type=1
+r8-agent2-kind=2
+r8-agent2-sku=801
+r8-agent2-type=4
+r8-agent3-kind=2
+r8-agent3-sku=801
+r8-agent3-type=5
+r8-agent4-kind=2
+r8-agent4-sku=801
+r8-agent4-type=6
+r8-agent5-kind=2
+r8-agent5-sku=801
+r8-agent5-type=7
+r8-agent6-kind=2
+r8-agent6-sku=801
+r8-agent6-type=8
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.7.9
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=6a11
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_c6300_series]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=Photosmart_C6100.png
+io-mfp-mode=3
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart C6324 All-in-One Printer
+model2=HP Photosmart C6340 All-in-One Printer
+model3=HP Photosmart C6350 All-in-One Printer
+model4=HP Photosmart C6375 All-in-One Printer
+model5=HP Photosmart C6380 All-in-One Printer
+model6=HP Photosmart C6383 All-in-One Printer
+model7=HP Photosmart C6388 All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=2
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=2
+r0-agent1-sku=04/04XL
+r0-agent1-type=1
+r0-agent2-kind=2
+r0-agent2-sku=04/04XL
+r0-agent2-type=4
+r0-agent3-kind=2
+r0-agent3-sku=04/04XL
+r0-agent3-type=5
+r0-agent4-kind=2
+r0-agent4-sku=04/04XL
+r0-agent4-type=6
+r0-agent5-kind=2
+r0-agent5-sku=04/04XL
+r0-agent5-type=19
+r1-agent1-kind=2
+r1-agent1-sku=04/04XL
+r1-agent1-type=1
+r1-agent2-kind=2
+r1-agent2-sku=04/04XL
+r1-agent2-type=4
+r1-agent3-kind=2
+r1-agent3-sku=04/04XL
+r1-agent3-type=5
+r1-agent4-kind=2
+r1-agent4-sku=04/04XL
+r1-agent4-type=6
+r1-agent5-kind=2
+r1-agent5-sku=04/04XL
+r1-agent5-type=19
+r2-agent1-kind=2
+r2-agent1-sku=360/360XL
+r2-agent1-type=1
+r2-agent2-kind=2
+r2-agent2-sku=360/360XL
+r2-agent2-type=4
+r2-agent3-kind=2
+r2-agent3-sku=360/360XL
+r2-agent3-type=5
+r2-agent4-kind=2
+r2-agent4-sku=360/360XL
+r2-agent4-type=6
+r2-agent5-kind=2
+r2-agent5-sku=360/360XL
+r2-agent5-type=19
+r4-agent1-kind=2
+r4-agent1-sku=155/155XL
+r4-agent1-type=1
+r4-agent2-kind=2
+r4-agent2-sku=155/155XL
+r4-agent2-type=4
+r4-agent3-kind=2
+r4-agent3-sku=155/155XL
+r4-agent3-type=5
+r4-agent4-kind=2
+r4-agent4-sku=155/155XL
+r4-agent4-type=6
+r4-agent5-kind=2
+r4-agent5-sku=155/155XL
+r4-agent5-type=19
+r8-agent1-kind=2
+r8-agent1-sku=808/808XL
+r8-agent1-type=1
+r8-agent2-kind=2
+r8-agent2-sku=808/808XL
+r8-agent2-type=4
+r8-agent3-kind=2
+r8-agent3-sku=808/808XL
+r8-agent3-type=5
+r8-agent4-kind=2
+r8-agent4-sku=808/808XL
+r8-agent4-type=6
+r8-agent5-kind=2
+r8-agent5-sku=808/808XL
+r8-agent5-type=16
+scan-src=2
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=2
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.8.10
+tech-class=Python
+tech-subclass=NoAutoDuplex,NoCDDVD,NoMaxDPI
+tech-type=2
+usb-pid=7011
+usb-vid=3f0
+wifi-config=0
+
+[officejet_6300_series]
+align-type=1
+clean-type=1
+color-cal-type=3
+copy-type=0
+embedded-server-type=1
+fax-type=1
+fw-download=False
+icon=Officejet_6200_series.png
+io-mfp-mode=3
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet 6301 All-in-One Printer
+model10=HP Officejet 6315 All-in-One Printer
+model11=HP Officejet 6318 All-in-One Printer
+model2=HP Officejet 6304 All-in-One Printer
+model3=HP Officejet 6305 All-in-One Printer
+model4=HP Officejet 6307 All-in-One Printer
+model5=HP Officejet 6308 All-in-One Printer
+model6=HP Officejet 6310 All-in-One Printer
+model7=HP Officejet 6310xi All-in-One Printer
+model8=HP Officejet 6310v All-in-One Printer
+model9=HP Officejet 6313 All-in-One Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=92/98
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=95
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=99
+r0-agent3-type=3
+r0-agent4-kind=3
+r0-agent4-sku=100
+r0-agent4-type=10
+r10-agent1-kind=3
+r10-agent1-sku=850/851
+r10-agent1-type=1
+r10-agent2-kind=3
+r10-agent2-sku=854/855
+r10-agent2-type=2
+r10-agent3-kind=3
+r10-agent3-sku=858
+r10-agent3-type=3
+r10-agent4-kind=3
+r10-agent4-sku=100
+r10-agent4-type=10
+r12-agent1-kind=3
+r12-agent1-sku=129/132
+r12-agent1-type=1
+r12-agent2-kind=3
+r12-agent2-sku=135/136
+r12-agent2-type=2
+r12-agent3-kind=3
+r12-agent3-sku=138
+r12-agent3-type=3
+r12-agent4-kind=3
+r12-agent4-sku=100
+r12-agent4-type=10
+r2-agent1-kind=3
+r2-agent1-sku=92/98
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=95
+r2-agent2-type=2
+r2-agent3-kind=3
+r2-agent3-sku=99
+r2-agent3-type=3
+r2-agent4-kind=3
+r2-agent4-sku=100
+r2-agent4-type=10
+r4-agent1-kind=3
+r4-agent1-sku=336/337/339
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=342/343
+r4-agent2-type=2
+r4-agent3-kind=3
+r4-agent3-sku=348
+r4-agent3-type=3
+r4-agent4-kind=3
+r4-agent4-sku=100
+r4-agent4-type=10
+r6-agent1-kind=3
+r6-agent1-sku=92/98
+r6-agent1-type=1
+r6-agent2-kind=3
+r6-agent2-sku=93/95
+r6-agent2-type=2
+r6-agent3-kind=3
+r6-agent3-sku=99
+r6-agent3-type=3
+r6-agent4-kind=3
+r6-agent4-sku=100
+r6-agent4-type=10
+r8-agent1-kind=3
+r8-agent1-sku=129/130/132
+r8-agent1-type=1
+r8-agent2-kind=3
+r8-agent2-sku=135/136
+r8-agent2-type=2
+r8-agent3-kind=3
+r8-agent3-sku=138
+r8-agent3-type=3
+r8-agent4-kind=3
+r8-agent4-sku=100
+r8-agent4-type=10
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.11
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=5311
+usb-vid=3f0
+wifi-config=0
+
+[officejet_j6400_series]
+align-type=1
+clean-type=1
+color-cal-type=3
+copy-type=0
+embedded-server-type=0
+fax-type=1
+fw-download=False
+icon=Photosmart_C5100.png
+io-mfp-mode=3
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet J6405 All-in-One Printer
+model2=HP Officejet J6410 All-in-One Printer
+model3=HP Officejet J6413 All-in-One Printer
+model4=HP Officejet J6415 All-in-One Printer
+model5=HP Officejet J6424 All-in-One Printer
+model6=HP Officejet J6450 All-in-One Printer
+model7=HP Officejet J6480 All-in-One Printer
+model8=HP Officejet J6488 All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=2
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=75
+r0-agent1-type=2
+r0-agent2-kind=3
+r0-agent2-sku=74
+r0-agent2-type=1
+r0-agent3-kind=3
+r0-agent3-sku=99
+r0-agent3-type=3
+r10-agent1-kind=3
+r10-agent1-sku=861
+r10-agent1-type=2
+r10-agent2-kind=3
+r10-agent2-sku=860
+r10-agent2-type=1
+r10-agent3-kind=3
+r10-agent3-sku=858
+r10-agent3-type=3
+r2-agent1-kind=3
+r2-agent1-sku=75
+r2-agent1-type=2
+r2-agent2-kind=3
+r2-agent2-sku=74
+r2-agent2-type=1
+r2-agent3-kind=3
+r2-agent3-sku=99
+r2-agent3-type=3
+r4-agent1-kind=3
+r4-agent1-sku=351
+r4-agent1-type=2
+r4-agent2-kind=3
+r4-agent2-sku=350
+r4-agent2-type=1
+r4-agent3-kind=3
+r4-agent3-sku=348
+r4-agent3-type=3
+r8-agent1-kind=3
+r8-agent1-sku=141
+r8-agent1-type=2
+r8-agent2-kind=3
+r8-agent2-sku=140
+r8-agent2-type=1
+r8-agent3-kind=3
+r8-agent3-sku=138
+r8-agent3-type=3
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.8.4
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=3312
+usb-vid=3f0
+wifi-config=0
+
+[officejet_6500_e709a]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=3
+embedded-server-type=1
+fax-type=1
+fw-download=False
+icon=officejet_j5500_series.png
+io-mfp-mode=3
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet 6500 All-in-One Printer - E709a
+model2=HP Officejet 6500 All-in-One Printer - E709c
+monitor-type=0
+panel-check-type=1
+pcard-type=2
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=2
+r0-agent1-sku=04/04XL
+r0-agent1-type=1
+r0-agent2-kind=2
+r0-agent2-sku=04/04XL
+r0-agent2-type=4
+r0-agent3-kind=2
+r0-agent3-sku=04/04XL
+r0-agent3-type=5
+r0-agent4-kind=2
+r0-agent4-sku=04/04XL
+r0-agent4-type=6
+r0-agent5-kind=2
+r0-agent5-sku=04/04XL
+r0-agent5-type=16
+r1-agent1-kind=2
+r1-agent1-sku=04/04XL
+r1-agent1-type=1
+r1-agent2-kind=2
+r1-agent2-sku=04/04XL
+r1-agent2-type=4
+r1-agent3-kind=2
+r1-agent3-sku=04/04XL
+r1-agent3-type=5
+r1-agent4-kind=2
+r1-agent4-sku=04/04XL
+r1-agent4-type=6
+r1-agent5-kind=2
+r1-agent5-sku=04/04XL
+r1-agent5-type=16
+r2-agent1-kind=2
+r2-agent1-sku=360/360XL
+r2-agent1-type=1
+r2-agent2-kind=2
+r2-agent2-sku=360/360XL
+r2-agent2-type=4
+r2-agent3-kind=2
+r2-agent3-sku=360/360XL
+r2-agent3-type=5
+r2-agent4-kind=2
+r2-agent4-sku=360/360XL
+r2-agent4-type=6
+r2-agent5-kind=2
+r2-agent5-sku=360/360XL
+r2-agent5-type=16
+r4-agent1-kind=2
+r4-agent1-sku=155/155XL
+r4-agent1-type=1
+r4-agent2-kind=2
+r4-agent2-sku=155/155XL
+r4-agent2-type=4
+r4-agent3-kind=2
+r4-agent3-sku=155/155XL
+r4-agent3-type=5
+r4-agent4-kind=2
+r4-agent4-sku=155/155XL
+r4-agent4-type=6
+r4-agent5-kind=2
+r4-agent5-sku=155/155XL
+r4-agent5-type=16
+r8-agent1-kind=2
+r8-agent1-sku=808/808XL
+r8-agent1-type=1
+r8-agent2-kind=2
+r8-agent2-sku=808/808XL
+r8-agent2-type=4
+r8-agent3-kind=2
+r8-agent3-sku=808/808XL
+r8-agent3-type=5
+r8-agent4-kind=2
+r8-agent4-sku=808/808XL
+r8-agent4-type=6
+r8-agent5-kind=2
+r8-agent5-sku=808/808XL
+r8-agent5-type=16
+scan-src=3
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=2
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.9.4
+tech-class=Python
+tech-subclass=NoCDDVD,NoAutoDuplex
+tech-type=2
+usb-pid=4412
+usb-vid=3f0
+wifi-config=0
+
+[officejet_6500_e710n-z]
+align-type=1
+clean-type=3
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=6
+fw-download=False
+icon=officejet_k550.png
+io-mfp-mode=1
+io-mode=1
+io-support=14
+job-storage=0
+linefeed-cal-type=0
+model1=Oficejet 6500 E710n-z
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=2
+r0-agent1-sku=04/04XL
+r0-agent1-type=1
+r0-agent2-kind=2
+r0-agent2-sku=04/04XL
+r0-agent2-type=4
+r0-agent3-kind=2
+r0-agent3-sku=04/04XL
+r0-agent3-type=5
+r0-agent4-kind=2
+r0-agent4-sku=04/04XL
+r0-agent4-type=6
+r0-agent5-kind=2
+r0-agent5-sku=04/04XL
+r0-agent5-type=16
+r1-agent1-kind=2
+r1-agent1-sku=04/04XL
+r1-agent1-type=1
+r1-agent2-kind=2
+r1-agent2-sku=04/04XL
+r1-agent2-type=4
+r1-agent3-kind=2
+r1-agent3-sku=04/04XL
+r1-agent3-type=5
+r1-agent4-kind=2
+r1-agent4-sku=04/04XL
+r1-agent4-type=6
+r1-agent5-kind=2
+r1-agent5-sku=04/04XL
+r1-agent5-type=16
+r2-agent1-kind=2
+r2-agent1-sku=360/360XL
+r2-agent1-type=1
+r2-agent2-kind=2
+r2-agent2-sku=360/360XL
+r2-agent2-type=4
+r2-agent3-kind=2
+r2-agent3-sku=360/360XL
+r2-agent3-type=5
+r2-agent4-kind=2
+r2-agent4-sku=360/360XL
+r2-agent4-type=6
+r2-agent5-kind=2
+r2-agent5-sku=360/360XL
+r2-agent5-type=16
+r4-agent1-kind=2
+r4-agent1-sku=155/155XL
+r4-agent1-type=1
+r4-agent2-kind=2
+r4-agent2-sku=155/155XL
+r4-agent2-type=4
+r4-agent3-kind=2
+r4-agent3-sku=155/155XL
+r4-agent3-type=5
+r4-agent4-kind=2
+r4-agent4-sku=155/155XL
+r4-agent4-type=6
+r4-agent5-kind=2
+r4-agent5-sku=155/155XL
+r4-agent5-type=16
+r8-agent1-kind=2
+r8-agent1-sku=808/808XL
+r8-agent1-type=1
+r8-agent2-kind=2
+r8-agent2-sku=808/808XL
+r8-agent2-type=4
+r8-agent3-kind=2
+r8-agent3-sku=808/808XL
+r8-agent3-type=5
+r8-agent4-kind=2
+r8-agent4-sku=808/808XL
+r8-agent4-type=6
+r8-agent5-kind=2
+r8-agent5-sku=808/808XL
+r8-agent5-type=16
+scan-src=0
+scan-type=7
+status-battery-check=0
+status-dynamic-counters=2
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.10.9
+tech-class=Python10
+tech-subclass=NoAutoTray
+tech-type=2
+usb-pid=5412
+usb-vid=3f0
+wifi-config=3
+
+[officejet_6500_e710a-f]
+align-type=15
+clean-type=3
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=6
+fw-download=False
+icon=officejet_k550.png
+io-mfp-mode=1
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=Officejet 6500 E710
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=2
+r0-agent1-sku=04/04XL
+r0-agent1-type=1
+r0-agent2-kind=2
+r0-agent2-sku=04/04XL
+r0-agent2-type=4
+r0-agent3-kind=2
+r0-agent3-sku=04/04XL
+r0-agent3-type=5
+r0-agent4-kind=2
+r0-agent4-sku=04/04XL
+r0-agent4-type=6
+r0-agent5-kind=2
+r0-agent5-sku=04/04XL
+r0-agent5-type=16
+r1-agent1-kind=2
+r1-agent1-sku=04/04XL
+r1-agent1-type=1
+r1-agent2-kind=2
+r1-agent2-sku=04/04XL
+r1-agent2-type=4
+r1-agent3-kind=2
+r1-agent3-sku=04/04XL
+r1-agent3-type=5
+r1-agent4-kind=2
+r1-agent4-sku=04/04XL
+r1-agent4-type=6
+r1-agent5-kind=2
+r1-agent5-sku=04/04XL
+r1-agent5-type=16
+r2-agent1-kind=2
+r2-agent1-sku=360/360XL
+r2-agent1-type=1
+r2-agent2-kind=2
+r2-agent2-sku=360/360XL
+r2-agent2-type=4
+r2-agent3-kind=2
+r2-agent3-sku=360/360XL
+r2-agent3-type=5
+r2-agent4-kind=2
+r2-agent4-sku=360/360XL
+r2-agent4-type=6
+r2-agent5-kind=2
+r2-agent5-sku=360/360XL
+r2-agent5-type=16
+r4-agent1-kind=2
+r4-agent1-sku=155/155XL
+r4-agent1-type=1
+r4-agent2-kind=2
+r4-agent2-sku=155/155XL
+r4-agent2-type=4
+r4-agent3-kind=2
+r4-agent3-sku=155/155XL
+r4-agent3-type=5
+r4-agent4-kind=2
+r4-agent4-sku=155/155XL
+r4-agent4-type=6
+r4-agent5-kind=2
+r4-agent5-sku=155/155XL
+r4-agent5-type=16
+r8-agent1-kind=2
+r8-agent1-sku=808/808XL
+r8-agent1-type=1
+r8-agent2-kind=2
+r8-agent2-sku=808/808XL
+r8-agent2-type=4
+r8-agent3-kind=2
+r8-agent3-sku=808/808XL
+r8-agent3-type=5
+r8-agent4-kind=2
+r8-agent4-sku=808/808XL
+r8-agent4-type=6
+r8-agent5-kind=2
+r8-agent5-sku=808/808XL
+r8-agent5-type=16
+scan-src=3
+scan-type=7
+status-battery-check=0
+status-dynamic-counters=2
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.11.1
+tech-class=Python
+tech-subclass=NoCDDVD,NoAutoDuplex
+tech-type=2
+usb-pid=5512
+usb-vid=3f0
+wifi-config=0
+
+[officejet_6500_e709n]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=3
+embedded-server-type=1
+fax-type=1
+fw-download=False
+icon=officejet_j5500_series.png
+io-mfp-mode=3
+io-mode=1
+io-support=14
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet 6500 Wireless All-in-One Printer - E709n
+model2=HP Officejet 6500 Wireless All-in-One Printer - E709q
+monitor-type=0
+panel-check-type=1
+pcard-type=2
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=2
+r0-agent1-sku=04/04XL
+r0-agent1-type=1
+r0-agent2-kind=2
+r0-agent2-sku=04/04XL
+r0-agent2-type=4
+r0-agent3-kind=2
+r0-agent3-sku=04/04XL
+r0-agent3-type=5
+r0-agent4-kind=2
+r0-agent4-sku=04/04XL
+r0-agent4-type=6
+r0-agent5-kind=2
+r0-agent5-sku=04/04XL
+r0-agent5-type=16
+r1-agent1-kind=2
+r1-agent1-sku=04/04XL
+r1-agent1-type=1
+r1-agent2-kind=2
+r1-agent2-sku=04/04XL
+r1-agent2-type=4
+r1-agent3-kind=2
+r1-agent3-sku=04/04XL
+r1-agent3-type=5
+r1-agent4-kind=2
+r1-agent4-sku=04/04XL
+r1-agent4-type=6
+r1-agent5-kind=2
+r1-agent5-sku=04/04XL
+r1-agent5-type=16
+r2-agent1-kind=2
+r2-agent1-sku=360/360XL
+r2-agent1-type=1
+r2-agent2-kind=2
+r2-agent2-sku=360/360XL
+r2-agent2-type=4
+r2-agent3-kind=2
+r2-agent3-sku=360/360XL
+r2-agent3-type=5
+r2-agent4-kind=2
+r2-agent4-sku=360/360XL
+r2-agent4-type=6
+r2-agent5-kind=2
+r2-agent5-sku=360/360XL
+r2-agent5-type=16
+r4-agent1-kind=2
+r4-agent1-sku=155/155XL
+r4-agent1-type=1
+r4-agent2-kind=2
+r4-agent2-sku=155/155XL
+r4-agent2-type=4
+r4-agent3-kind=2
+r4-agent3-sku=155/155XL
+r4-agent3-type=5
+r4-agent4-kind=2
+r4-agent4-sku=155/155XL
+r4-agent4-type=6
+r4-agent5-kind=2
+r4-agent5-sku=155/155XL
+r4-agent5-type=16
+r8-agent1-kind=2
+r8-agent1-sku=808/808XL
+r8-agent1-type=1
+r8-agent2-kind=2
+r8-agent2-sku=808/808XL
+r8-agent2-type=4
+r8-agent3-kind=2
+r8-agent3-sku=808/808XL
+r8-agent3-type=5
+r8-agent4-kind=2
+r8-agent4-sku=808/808XL
+r8-agent4-type=6
+r8-agent5-kind=2
+r8-agent5-sku=808/808XL
+r8-agent5-type=16
+scan-src=3
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=2
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.9.4
+tech-class=Python
+tech-subclass=NoCDDVD
+tech-type=2
+usb-pid=4512
+usb-vid=3f0
+wifi-config=1
+
+[deskjet_6500]
+align-type=1
+clean-type=1
+color-cal-type=3
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=Deskjet_6500.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 6500 Color Inkjet Printer
+model10=HP Deskjet 6548 Color Inkjet Printer
+model2=HP Deskjet 6520 Color Inkjet Printer
+model3=HP Deskjet 6520xi Color Inkjet Printer
+model4=HP Deskjet 6540d Color Inkjet Printer
+model5=HP Deskjet 6540 Color Inkjet Printer
+model6=HP Deskjet 6540xi Color Inkjet Printer
+model7=HP Deskjet 6540dt Color Inkjet Printer
+model8=HP Deskjet 6543 Color Inkjet Printer
+model9=HP Deskjet 6543d Color Inkjet Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=94 (C8765WN)/96 (C8767WN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=95 (C8766WN)/97 (C9363WN)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=99 (C9369WN)
+r0-agent3-type=3
+r0-agent4-kind=3
+r0-agent4-sku=100 (C9368AN)
+r0-agent4-type=10
+r1-agent1-kind=3
+r1-agent1-sku=94 (C8765WN)/96 (C8767WN)
+r1-agent1-type=1
+r1-agent2-kind=3
+r1-agent2-sku=95 (C8766WN)/97 (C9363WN)
+r1-agent2-type=2
+r1-agent3-kind=3
+r1-agent3-sku=99 (C9369WN)
+r1-agent3-type=3
+r1-agent4-kind=3
+r1-agent4-sku=100 (C9368AN)
+r1-agent4-type=10
+r2-agent1-kind=3
+r2-agent1-sku=94 (C8765WN)/96 (C8767WN)
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=95 (C8766WN)/97 (C9363WN)
+r2-agent2-type=2
+r2-agent3-kind=3
+r2-agent3-sku=99 (C9369WN)
+r2-agent3-type=3
+r2-agent4-kind=3
+r2-agent4-sku=100 (C9368AN)
+r2-agent4-type=10
+r3-agent1-kind=3
+r3-agent1-sku=94 (C8765WN)/96 (C8767WN)
+r3-agent1-type=1
+r3-agent2-kind=3
+r3-agent2-sku=95 (C8766WN)/97 (C9363WN)
+r3-agent2-type=2
+r3-agent3-kind=3
+r3-agent3-sku=99 (C9369WN)
+r3-agent3-type=3
+r3-agent4-kind=3
+r3-agent4-sku=100 (C9368AN)
+r3-agent4-type=10
+r4-agent1-kind=3
+r4-agent1-sku=339 (C8767EN)/338 (C8765EN)
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=344 (C9363EN)/343 (C8766EN)
+r4-agent2-type=2
+r4-agent3-kind=3
+r4-agent3-sku=348 (C9369EN)
+r4-agent3-type=3
+r4-agent4-kind=3
+r4-agent4-sku=100 (C9368AN)
+r4-agent4-type=10
+r5-agent1-kind=3
+r5-agent1-sku=130 (C8765HN)/131 (C8765HN)
+r5-agent1-type=1
+r5-agent2-kind=3
+r5-agent2-sku=134 (C8766HN)/135 (C9363HN)
+r5-agent2-type=2
+r5-agent3-kind=3
+r5-agent3-sku=138 (C9369HN)
+r5-agent3-type=3
+r5-agent4-kind=3
+r5-agent4-sku=100 (C9368AN)
+r5-agent4-type=10
+r6-agent1-kind=3
+r6-agent1-sku=130 (C8765HN)/131 (C8765HN)
+r6-agent1-type=1
+r6-agent2-kind=3
+r6-agent2-sku=134 (C8766HN)/135 (C9363HN)
+r6-agent2-type=2
+r6-agent3-kind=3
+r6-agent3-sku=138 (C9369HN)
+r6-agent3-type=3
+r6-agent4-kind=3
+r6-agent4-sku=100 (C9368AN)
+r6-agent4-type=10
+r7-agent1-kind=3
+r7-agent1-sku=853 (C8765ZN)/852 (C8765ZN)
+r7-agent1-type=1
+r7-agent2-kind=3
+r7-agent2-sku=857 (C9363ZN)/855 (C8766ZN)
+r7-agent2-type=2
+r7-agent3-kind=3
+r7-agent3-sku=858 (C9369ZN)
+r7-agent3-type=3
+r7-agent4-kind=3
+r7-agent4-sku=100 (C9368AN)
+r7-agent4-type=10
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=8204
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_6510_series]
+align-type=0
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=psc_2300_series.png
+io-mfp-mode=3
+io-mode=3
+io-support=10
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart 6510 e-All-in-one
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=2
+r0-agent1-sku=564/564XL
+r0-agent1-type=1
+r0-agent2-kind=2
+r0-agent2-sku=564/564XL
+r0-agent2-type=4
+r0-agent3-kind=2
+r0-agent3-sku=564/564XL
+r0-agent3-type=5
+r0-agent4-kind=2
+r0-agent4-sku=564/564XL
+r0-agent4-type=6
+r1-agent1-kind=2
+r1-agent1-sku=364/364XL
+r1-agent1-type=1
+r1-agent2-kind=2
+r1-agent2-sku=364/364XL
+r1-agent2-type=4
+r1-agent3-kind=2
+r1-agent3-sku=364/364XL
+r1-agent3-type=5
+r1-agent4-kind=2
+r1-agent4-sku=364/364XL
+r1-agent4-type=6
+r2-agent1-kind=2
+r2-agent1-sku=178/178XL
+r2-agent1-type=1
+r2-agent2-kind=2
+r2-agent2-sku=178/178XL
+r2-agent2-type=4
+r2-agent3-kind=2
+r2-agent3-sku=178/178XL
+r2-agent3-type=5
+r2-agent4-kind=2
+r2-agent4-sku=178/178XL
+r2-agent4-type=6
+r3-agent1-kind=2
+r3-agent1-sku=862/862XL
+r3-agent1-type=1
+r3-agent2-kind=2
+r3-agent2-sku=862/862XL
+r3-agent2-type=4
+r3-agent3-kind=2
+r3-agent3-sku=862/862XL
+r3-agent3-type=5
+r3-agent4-kind=2
+r3-agent4-sku=862/862XL
+r3-agent4-type=6
+scan-src=1
+scan-type=7
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.11.10
+tech-class=Copperhead
+tech-subclass=AutoDuplex
+tech-type=2
+usb-pid=a511
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_6600]
+align-type=1
+clean-type=1
+color-cal-type=3
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=Deskjet_6500.png
+io-mfp-mode=6
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 6600 Series Color Inkjet Printer
+model2=HP Deskjet 6620 Color Inkjet Printer
+model3=HP Deskjet 6620xi Color Inkjet Printer
+model4=HP Deskjet 6623 Color Inkjet Printer
+model5=HP Deskjet 6628 Color Inkjet Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=94 (C8765WN)/96 (C8767WN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=95 (C8766WN)/97 (C9363WN)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=99 (C9369WN)
+r0-agent3-type=3
+r0-agent4-kind=3
+r0-agent4-sku=100 (C9368AN)
+r0-agent4-type=10
+r1-agent1-kind=3
+r1-agent1-sku=94 (C8765WN)/96 (C8767WN)
+r1-agent1-type=1
+r1-agent2-kind=3
+r1-agent2-sku=95 (C8766WN)/97 (C9363WN)
+r1-agent2-type=2
+r1-agent3-kind=3
+r1-agent3-sku=99 (C9369WN)
+r1-agent3-type=3
+r1-agent4-kind=3
+r1-agent4-sku=100 (C9368AN)
+r1-agent4-type=10
+r2-agent1-kind=3
+r2-agent1-sku=94 (C8765WN)/96 (C8767WN)
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=95 (C8766WN)/97 (C9363WN)
+r2-agent2-type=2
+r2-agent3-kind=3
+r2-agent3-sku=99 (C9369WN)
+r2-agent3-type=3
+r2-agent4-kind=3
+r2-agent4-sku=100 (C9368AN)
+r2-agent4-type=10
+r3-agent1-kind=3
+r3-agent1-sku=94 (C8765WN)/96 (C8767WN)
+r3-agent1-type=1
+r3-agent2-kind=3
+r3-agent2-sku=95 (C8766WN)/97 (C9363WN)
+r3-agent2-type=2
+r3-agent3-kind=3
+r3-agent3-sku=99 (C9369WN)
+r3-agent3-type=3
+r3-agent4-kind=3
+r3-agent4-sku=100 (C9368AN)
+r3-agent4-type=10
+r4-agent1-kind=3
+r4-agent1-sku=339 (C8767EN)/338 (C8765EN)
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=344 (C9363EN)/343 (C8766EN)
+r4-agent2-type=2
+r4-agent3-kind=3
+r4-agent3-sku=348 (C9369EN)
+r4-agent3-type=3
+r4-agent4-kind=3
+r4-agent4-sku=100 (C9368AN)
+r4-agent4-type=10
+r5-agent1-kind=3
+r5-agent1-sku=130 (C8765HN)/131 (C8765HN)
+r5-agent1-type=1
+r5-agent2-kind=3
+r5-agent2-sku=134 (C8766HN)/135 (C9363HN)
+r5-agent2-type=2
+r5-agent3-kind=3
+r5-agent3-sku=138 (C9369HN)
+r5-agent3-type=3
+r5-agent4-kind=3
+r5-agent4-sku=100 (C9368AN)
+r5-agent4-type=10
+r6-agent1-kind=3
+r6-agent1-sku=130 (C8765HN)/131 (C8765HN)
+r6-agent1-type=1
+r6-agent2-kind=3
+r6-agent2-sku=134 (C8766HN)/135 (C9363HN)
+r6-agent2-type=2
+r6-agent3-kind=3
+r6-agent3-sku=138 (C9369HN)
+r6-agent3-type=3
+r6-agent4-kind=3
+r6-agent4-sku=100 (C9368AN)
+r6-agent4-type=10
+r7-agent1-kind=3
+r7-agent1-sku=853 (C8765ZN)/852 (C8765ZN)
+r7-agent1-type=1
+r7-agent2-kind=3
+r7-agent2-sku=857 (C9363ZN)/855 (C8766ZN)
+r7-agent2-type=2
+r7-agent3-kind=3
+r7-agent3-sku=858 (C9369ZN)
+r7-agent3-type=3
+r7-agent4-kind=3
+r7-agent4-sku=100 (C9368AN)
+r7-agent4-type=10
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=8504
+usb-vid=3f0
+wifi-config=0
+
+[officejet_6600]
+align-type=17
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=6
+fw-download=False
+icon=officejet_5600.png
+io-mfp-mode=1
+io-mode=1
+io-support=10
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet 6600 e-All-in-One Printer - H711a
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=2
+r0-agent1-sku=932/932XL
+r0-agent1-type=1
+r0-agent2-kind=2
+r0-agent2-sku=933/933XL
+r0-agent2-type=4
+r0-agent3-kind=2
+r0-agent3-sku=933/933XL
+r0-agent3-type=5
+r0-agent4-kind=2
+r0-agent4-sku=933/933XL
+r0-agent4-type=6
+scan-src=3
+scan-type=7
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.12.4
+tech-class=Saipan
+tech-subclass=Normal
+tech-type=2
+usb-pid=5d12
+usb-vid=3f0
+wifi-config=3
+
+[officejet_6700]
+align-type=17
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=6
+fw-download=False
+icon=officejet_5600.png
+io-mfp-mode=1
+io-mode=1
+io-support=14
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet 6700 e-All-in-One Printer - H711n
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=2
+r0-agent1-sku=932/932XL
+r0-agent1-type=1
+r0-agent2-kind=2
+r0-agent2-sku=933/933XL
+r0-agent2-type=4
+r0-agent3-kind=2
+r0-agent3-sku=933/933XL
+r0-agent3-type=5
+r0-agent4-kind=2
+r0-agent4-sku=933/933XL
+r0-agent4-type=6
+scan-src=3
+scan-type=7
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.12.4
+tech-class=Saipan
+tech-subclass=AutoDuplex
+tech-type=2
+usb-pid=5c12
+usb-vid=3f0
+wifi-config=3
+
+[deskjet_6800]
+align-type=1
+clean-type=1
+color-cal-type=3
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=Deskjet_6800.png
+io-mfp-mode=6
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 6800 Color Inkjet Printer
+model2=HP Deskjet 6830v Color Inkjet Printer
+model3=HP Deskjet 6840xi Color Inkjet Printer
+model4=HP Deskjet 6840dt Color Inkjet Printer
+model5=HP Deskjet 6840 Color Inkjet Printer
+model6=HP Deskjet 6843 Color Inkjet Printer
+model7=HP Deskjet 6848 Color Inkjet Printer
+model8=HP Deskjet 6850 Color Inkjet Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=94 (C8765WN)/96 (C8767WN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=95 (C8766WN)/97 (C9363WN)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=99 (C9369WN)
+r0-agent3-type=3
+r0-agent4-kind=3
+r0-agent4-sku=100 (C9368AN)
+r0-agent4-type=10
+r1-agent1-kind=3
+r1-agent1-sku=94 (C8765WN)/96 (C8767WN)
+r1-agent1-type=1
+r1-agent2-kind=3
+r1-agent2-sku=95 (C8766WN)/97 (C9363WN)
+r1-agent2-type=2
+r1-agent3-kind=3
+r1-agent3-sku=99 (C9369WN)
+r1-agent3-type=3
+r1-agent4-kind=3
+r1-agent4-sku=100 (C9368AN)
+r1-agent4-type=10
+r2-agent1-kind=3
+r2-agent1-sku=94 (C8765WN)/96 (C8767WN)
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=95 (C8766WN)/97 (C9363WN)
+r2-agent2-type=2
+r2-agent3-kind=3
+r2-agent3-sku=99 (C9369WN)
+r2-agent3-type=3
+r2-agent4-kind=3
+r2-agent4-sku=100 (C9368AN)
+r2-agent4-type=10
+r3-agent1-kind=3
+r3-agent1-sku=94 (C8765WN)/96 (C8767WN)
+r3-agent1-type=1
+r3-agent2-kind=3
+r3-agent2-sku=95 (C8766WN)/97 (C9363WN)
+r3-agent2-type=2
+r3-agent3-kind=3
+r3-agent3-sku=99 (C9369WN)
+r3-agent3-type=3
+r3-agent4-kind=3
+r3-agent4-sku=100 (C9368AN)
+r3-agent4-type=10
+r4-agent1-kind=3
+r4-agent1-sku=339 (C8767EN)/338 (C8765EN)
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=344 (C9363EN)/343 (C8766EN)
+r4-agent2-type=2
+r4-agent3-kind=3
+r4-agent3-sku=348 (C9369EN)
+r4-agent3-type=3
+r4-agent4-kind=3
+r4-agent4-sku=100 (C9368AN)
+r4-agent4-type=10
+r5-agent1-kind=3
+r5-agent1-sku=130 (C8765HN)/131 (C8765HN)
+r5-agent1-type=1
+r5-agent2-kind=3
+r5-agent2-sku=134 (C8766HN)/135 (C9363HN)
+r5-agent2-type=2
+r5-agent3-kind=3
+r5-agent3-sku=138 (C9369HN)
+r5-agent3-type=3
+r5-agent4-kind=3
+r5-agent4-sku=100 (C9368AN)
+r5-agent4-type=10
+r6-agent1-kind=3
+r6-agent1-sku=130 (C8765HN)/131 (C8765HN)
+r6-agent1-type=1
+r6-agent2-kind=3
+r6-agent2-sku=134 (C8766HN)/135 (C9363HN)
+r6-agent2-type=2
+r6-agent3-kind=3
+r6-agent3-sku=138 (C9369HN)
+r6-agent3-type=3
+r6-agent4-kind=3
+r6-agent4-sku=100 (C9368AN)
+r6-agent4-type=10
+r7-agent1-kind=3
+r7-agent1-sku=853 (C8765ZN)/852 (C8765ZN)
+r7-agent1-type=1
+r7-agent2-kind=3
+r7-agent2-sku=857 (C9363ZN)/855 (C8766ZN)
+r7-agent2-type=2
+r7-agent3-kind=3
+r7-agent3-sku=858 (C9369ZN)
+r7-agent3-type=3
+r7-agent4-kind=3
+r7-agent4-sku=100 (C9368AN)
+r7-agent4-type=10
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=8404
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_6940_series]
+align-type=1
+clean-type=1
+color-cal-type=3
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=Deskjet_6500.png
+io-mfp-mode=6
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 6940 Printer
+model2=HP Deskjet 6940dt Printer
+model3=HP Deskjet 6943 Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=96 (C8767WN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=95 (C8766WN)/97 (C9363WN)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=99 (C9369WN)
+r0-agent3-type=3
+r0-agent4-kind=3
+r0-agent4-sku=100 (C9368AN)
+r0-agent4-type=10
+r1-agent1-kind=3
+r1-agent1-sku=96 (C8767WN)
+r1-agent1-type=1
+r1-agent2-kind=3
+r1-agent2-sku=95 (C8766WN)/97 (C9363WN)
+r1-agent2-type=2
+r1-agent3-kind=3
+r1-agent3-sku=99 (C9369WN)
+r1-agent3-type=3
+r1-agent4-kind=3
+r1-agent4-sku=100 (C9368AN)
+r1-agent4-type=10
+r2-agent1-kind=3
+r2-agent1-sku=96 (C8767WN)
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=95 (C8766WN)/97 (C9363WN)
+r2-agent2-type=2
+r2-agent3-kind=3
+r2-agent3-sku=99 (C9369WN)
+r2-agent3-type=3
+r2-agent4-kind=3
+r2-agent4-sku=100 (C9368AN)
+r2-agent4-type=10
+r3-agent1-kind=3
+r3-agent1-sku=96 (C8767WN)
+r3-agent1-type=1
+r3-agent2-kind=3
+r3-agent2-sku=95 (C8766WN)/97 (C9363WN)
+r3-agent2-type=2
+r3-agent3-kind=3
+r3-agent3-sku=99 (C9369WN)
+r3-agent3-type=3
+r3-agent4-kind=3
+r3-agent4-sku=100 (C9368AN)
+r3-agent4-type=10
+r4-agent1-kind=3
+r4-agent1-sku=339 (C8767EN)
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=344 (C9363EN)/343 (C8766EN)
+r4-agent2-type=2
+r4-agent3-kind=3
+r4-agent3-sku=348 (C9369EN)
+r4-agent3-type=3
+r4-agent4-kind=3
+r4-agent4-sku=100 (C9368AN)
+r4-agent4-type=10
+r5-agent1-kind=3
+r5-agent1-sku=130 (C8765HN)
+r5-agent1-type=1
+r5-agent2-kind=3
+r5-agent2-sku=134 (C8766HN)/135 (C9363HN)
+r5-agent2-type=2
+r5-agent3-kind=3
+r5-agent3-sku=138 (C9369HN)
+r5-agent3-type=3
+r5-agent4-kind=3
+r5-agent4-sku=100 (C9368AN)
+r5-agent4-type=10
+r6-agent1-kind=3
+r6-agent1-sku=130 (C8765HN)
+r6-agent1-type=1
+r6-agent2-kind=3
+r6-agent2-sku=134 (C8766HN)/135 (C9363HN)
+r6-agent2-type=2
+r6-agent3-kind=3
+r6-agent3-sku=138 (C9369HN)
+r6-agent3-type=3
+r6-agent4-kind=3
+r6-agent4-sku=100 (C9368AN)
+r6-agent4-type=10
+r7-agent1-kind=3
+r7-agent1-sku=853 (C8765ZN)
+r7-agent1-type=1
+r7-agent2-kind=3
+r7-agent2-sku=857 (C9363ZN)/855 (C8766ZN)
+r7-agent2-type=2
+r7-agent3-kind=3
+r7-agent3-sku=858 (C9369ZN)
+r7-agent3-type=3
+r7-agent4-kind=3
+r7-agent4-sku=100 (C9368AN)
+r7-agent4-type=10
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.8
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=8904
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_6980_series]
+align-type=1
+clean-type=1
+color-cal-type=3
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=deskjet_6980.png
+io-mfp-mode=6
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 6980xi Printer
+model2=HP Deskjet 6980 Printer
+model3=HP Deskjet 6980dt Printer
+model4=HP Deskjet 6983 Printer
+model5=HP Deskjet 6988dt Printer
+model6=HP Deskjet 6988xi Printer
+model7=HP Deskjet 6988 Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=96 (C8767WN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=95 (C8766WN)/97 (C9363WN)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=99 (C9369WN)
+r0-agent3-type=3
+r0-agent4-kind=3
+r0-agent4-sku=100 (C9368AN)
+r0-agent4-type=10
+r1-agent1-kind=3
+r1-agent1-sku=96 (C8767WN)
+r1-agent1-type=1
+r1-agent2-kind=3
+r1-agent2-sku=95 (C8766WN)/97 (C9363WN)
+r1-agent2-type=2
+r1-agent3-kind=3
+r1-agent3-sku=99 (C9369WN)
+r1-agent3-type=3
+r1-agent4-kind=3
+r1-agent4-sku=100 (C9368AN)
+r1-agent4-type=10
+r2-agent1-kind=3
+r2-agent1-sku=96 (C8767WN)
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=95 (C8766WN)/97 (C9363WN)
+r2-agent2-type=2
+r2-agent3-kind=3
+r2-agent3-sku=99 (C9369WN)
+r2-agent3-type=3
+r2-agent4-kind=3
+r2-agent4-sku=100 (C9368AN)
+r2-agent4-type=10
+r3-agent1-kind=3
+r3-agent1-sku=96 (C8767WN)
+r3-agent1-type=1
+r3-agent2-kind=3
+r3-agent2-sku=95 (C8766WN)/97 (C9363WN)
+r3-agent2-type=2
+r3-agent3-kind=3
+r3-agent3-sku=99 (C9369WN)
+r3-agent3-type=3
+r3-agent4-kind=3
+r3-agent4-sku=100 (C9368AN)
+r3-agent4-type=10
+r4-agent1-kind=3
+r4-agent1-sku=339 (C8767EN)
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=344 (C9363EN)/343 (C8766EN)
+r4-agent2-type=2
+r4-agent3-kind=3
+r4-agent3-sku=348 (C9369EN)
+r4-agent3-type=3
+r4-agent4-kind=3
+r4-agent4-sku=100 (C9368AN)
+r4-agent4-type=10
+r5-agent1-kind=3
+r5-agent1-sku=130 (C8765HN)
+r5-agent1-type=1
+r5-agent2-kind=3
+r5-agent2-sku=134 (C8766HN)/135 (C9363HN)
+r5-agent2-type=2
+r5-agent3-kind=3
+r5-agent3-sku=138 (C9369HN)
+r5-agent3-type=3
+r5-agent4-kind=3
+r5-agent4-sku=100 (C9368AN)
+r5-agent4-type=10
+r6-agent1-kind=3
+r6-agent1-sku=130 (C8765HN)
+r6-agent1-type=1
+r6-agent2-kind=3
+r6-agent2-sku=134 (C8766HN)/135 (C9363HN)
+r6-agent2-type=2
+r6-agent3-kind=3
+r6-agent3-sku=138 (C9369HN)
+r6-agent3-type=3
+r6-agent4-kind=3
+r6-agent4-sku=100 (C9368AN)
+r6-agent4-type=10
+r7-agent1-kind=3
+r7-agent1-sku=853 (C8765ZN)
+r7-agent1-type=1
+r7-agent2-kind=3
+r7-agent2-sku=857 (C9363ZN)/855 (C8766ZN)
+r7-agent2-type=2
+r7-agent3-kind=3
+r7-agent3-sku=858 (C9369ZN)
+r7-agent3-type=3
+r7-agent4-kind=3
+r7-agent4-sku=100 (C9368AN)
+r7-agent4-type=10
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.8
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=8804
+usb-vid=3f0
+wifi-config=0
+
+[officejet_7000_e809a_series]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_photosmart_b8500_series.png
+io-mfp-mode=3
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet 7000 Wide Format Printer -- E809a
+monitor-type=0
+panel-check-type=0
+pcard-type=2
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=2
+r0-agent1-sku=04/04XL
+r0-agent1-type=1
+r0-agent2-kind=2
+r0-agent2-sku=04/04XL
+r0-agent2-type=4
+r0-agent3-kind=2
+r0-agent3-sku=04/04XL
+r0-agent3-type=5
+r0-agent4-kind=2
+r0-agent4-sku=04/04XL
+r0-agent4-type=6
+r0-agent5-kind=2
+r0-agent5-sku=04/04XL
+r0-agent5-type=16
+r10-agent1-kind=2
+r10-agent1-sku=808/808XL
+r10-agent1-type=1
+r10-agent2-kind=2
+r10-agent2-sku=808/808XL
+r10-agent2-type=4
+r10-agent3-kind=2
+r10-agent3-sku=808/808XL
+r10-agent3-type=5
+r10-agent4-kind=2
+r10-agent4-sku=808/808XL
+r10-agent4-type=6
+r10-agent5-kind=2
+r10-agent5-sku=808/808XL
+r10-agent5-type=16
+r2-agent1-kind=2
+r2-agent1-sku=04/04XL
+r2-agent1-type=1
+r2-agent2-kind=2
+r2-agent2-sku=04/04XL
+r2-agent2-type=4
+r2-agent3-kind=2
+r2-agent3-sku=04/04XL
+r2-agent3-type=5
+r2-agent4-kind=2
+r2-agent4-sku=04/04XL
+r2-agent4-type=6
+r2-agent5-kind=2
+r2-agent5-sku=04/04XL
+r2-agent5-type=16
+r4-agent1-kind=2
+r4-agent1-sku=360/360XL
+r4-agent1-type=1
+r4-agent2-kind=2
+r4-agent2-sku=360/360XL
+r4-agent2-type=4
+r4-agent3-kind=2
+r4-agent3-sku=360/360XL
+r4-agent3-type=5
+r4-agent4-kind=2
+r4-agent4-sku=360/360XL
+r4-agent4-type=6
+r4-agent5-kind=2
+r4-agent5-sku=360/360XL
+r4-agent5-type=16
+r8-agent1-kind=2
+r8-agent1-sku=155/155XL
+r8-agent1-type=1
+r8-agent2-kind=2
+r8-agent2-sku=155/155XL
+r8-agent2-type=4
+r8-agent3-kind=2
+r8-agent3-sku=155/155XL
+r8-agent3-type=5
+r8-agent4-kind=2
+r8-agent4-sku=155/155XL
+r8-agent4-type=6
+r8-agent5-kind=2
+r8-agent5-sku=155/155XL
+r8-agent5-type=16
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.9.8
+tech-class=OJ7000
+tech-subclass=LargeFormatA3
+tech-type=2
+usb-pid=4612
+usb-vid=3f0
+wifi-config=0
+
+[officejet_7000_e809a]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_photosmart_b8500_series.png
+io-mfp-mode=3
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet 7000 Wide Format Printer -- E809a
+monitor-type=0
+panel-check-type=0
+pcard-type=2
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=2
+r0-agent1-sku=04/04XL
+r0-agent1-type=1
+r0-agent2-kind=2
+r0-agent2-sku=04/04XL
+r0-agent2-type=4
+r0-agent3-kind=2
+r0-agent3-sku=04/04XL
+r0-agent3-type=5
+r0-agent4-kind=2
+r0-agent4-sku=04/04XL
+r0-agent4-type=6
+r0-agent5-kind=2
+r0-agent5-sku=04/04XL
+r0-agent5-type=16
+r10-agent1-kind=2
+r10-agent1-sku=808/808XL
+r10-agent1-type=1
+r10-agent2-kind=2
+r10-agent2-sku=808/808XL
+r10-agent2-type=4
+r10-agent3-kind=2
+r10-agent3-sku=808/808XL
+r10-agent3-type=5
+r10-agent4-kind=2
+r10-agent4-sku=808/808XL
+r10-agent4-type=6
+r10-agent5-kind=2
+r10-agent5-sku=808/808XL
+r10-agent5-type=16
+r2-agent1-kind=2
+r2-agent1-sku=04/04XL
+r2-agent1-type=1
+r2-agent2-kind=2
+r2-agent2-sku=04/04XL
+r2-agent2-type=4
+r2-agent3-kind=2
+r2-agent3-sku=04/04XL
+r2-agent3-type=5
+r2-agent4-kind=2
+r2-agent4-sku=04/04XL
+r2-agent4-type=6
+r2-agent5-kind=2
+r2-agent5-sku=04/04XL
+r2-agent5-type=16
+r4-agent1-kind=2
+r4-agent1-sku=360/360XL
+r4-agent1-type=1
+r4-agent2-kind=2
+r4-agent2-sku=360/360XL
+r4-agent2-type=4
+r4-agent3-kind=2
+r4-agent3-sku=360/360XL
+r4-agent3-type=5
+r4-agent4-kind=2
+r4-agent4-sku=360/360XL
+r4-agent4-type=6
+r4-agent5-kind=2
+r4-agent5-sku=360/360XL
+r4-agent5-type=16
+r8-agent1-kind=2
+r8-agent1-sku=155/155XL
+r8-agent1-type=1
+r8-agent2-kind=2
+r8-agent2-sku=155/155XL
+r8-agent2-type=4
+r8-agent3-kind=2
+r8-agent3-sku=155/155XL
+r8-agent3-type=5
+r8-agent4-kind=2
+r8-agent4-sku=155/155XL
+r8-agent4-type=6
+r8-agent5-kind=2
+r8-agent5-sku=155/155XL
+r8-agent5-type=16
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.9.8
+tech-class=OJ7000
+tech-subclass=LargeFormatA3
+tech-type=2
+usb-pid=4612
+usb-vid=3f0
+wifi-config=0
+
+[officejet_7100_series]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=1
+fw-download=False
+icon=default_officejet.png
+io-mfp-mode=6
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet 7100 All-in-One Printer
+model2=HP Officejet 7110 All-in-One Printer
+model3=HP Officejet 7110xi All-in-One Printer
+model4=HP Officejet 7115 All-in-One Printer
+model5=HP Officejet 7130 All-in-One Printer
+model6=HP Officejet 7130xi All-in-One Printer
+model7=HP Officejet 7135xi All-in-One Printer
+model8=HP Officejet 7140xi All-in-One Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=2
+r0-agent1-sku=14d (C5011DN)
+r0-agent1-type=1
+r0-agent2-kind=2
+r0-agent2-sku=14d (C5010DN)
+r0-agent2-type=2
+r0-agent3-kind=1
+r0-agent3-sku=14 (C4920A)
+r0-agent3-type=1
+r0-agent4-kind=1
+r0-agent4-sku=14 (C4921A)
+r0-agent4-type=4
+r0-agent5-kind=1
+r0-agent5-sku=14 (C4922A)
+r0-agent5-type=5
+r0-agent6-kind=1
+r0-agent6-sku=14 (C4923A)
+r0-agent6-type=6
+scan-src=3
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=3752
+support-type=2
+support-ver=0.9.5
+tech-class=DJ9xxVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=2611
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_c7100_series]
+align-type=1
+clean-type=1
+color-cal-type=4
+copy-type=3
+embedded-server-type=1
+fax-type=1
+fw-download=False
+icon=Photosmart_3300_series.png
+io-mfp-mode=3
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart C7150 All-in-One Printer
+model2=HP Photosmart C7154 All-in-One Printer
+model3=HP Photosmart C7170 All-in-One Printer
+model4=HP Photosmart C7180 All-in-One Printer
+model5=HP Photosmart C7183 All-in-One Printer
+model6=HP Photosmart C7185 All-in-One Printer
+model7=HP Photosmart C7188 All-in-One Printer
+model8=HP Photosmart C7190 All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=2
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=2
+r0-agent1-sku=2
+r0-agent1-type=1
+r0-agent2-kind=2
+r0-agent2-sku=2
+r0-agent2-type=4
+r0-agent3-kind=2
+r0-agent3-sku=2
+r0-agent3-type=5
+r0-agent4-kind=2
+r0-agent4-sku=2
+r0-agent4-type=6
+r0-agent5-kind=2
+r0-agent5-sku=2
+r0-agent5-type=7
+r0-agent6-kind=2
+r0-agent6-sku=2
+r0-agent6-type=8
+r1-agent1-kind=2
+r1-agent1-sku=2
+r1-agent1-type=1
+r1-agent2-kind=2
+r1-agent2-sku=2
+r1-agent2-type=4
+r1-agent3-kind=2
+r1-agent3-sku=2
+r1-agent3-type=5
+r1-agent4-kind=2
+r1-agent4-sku=2
+r1-agent4-type=6
+r1-agent5-kind=2
+r1-agent5-sku=2
+r1-agent5-type=7
+r1-agent6-kind=2
+r1-agent6-sku=2
+r1-agent6-type=8
+r2-agent1-kind=2
+r2-agent1-sku=363
+r2-agent1-type=1
+r2-agent2-kind=2
+r2-agent2-sku=363
+r2-agent2-type=4
+r2-agent3-kind=2
+r2-agent3-sku=363
+r2-agent3-type=5
+r2-agent4-kind=2
+r2-agent4-sku=363
+r2-agent4-type=6
+r2-agent5-kind=2
+r2-agent5-sku=363
+r2-agent5-type=7
+r2-agent6-kind=2
+r2-agent6-sku=363
+r2-agent6-type=8
+r4-agent1-kind=2
+r4-agent1-sku=177
+r4-agent1-type=1
+r4-agent2-kind=2
+r4-agent2-sku=177
+r4-agent2-type=4
+r4-agent3-kind=2
+r4-agent3-sku=177
+r4-agent3-type=5
+r4-agent4-kind=2
+r4-agent4-sku=177
+r4-agent4-type=6
+r4-agent5-kind=2
+r4-agent5-sku=177
+r4-agent5-type=7
+r4-agent6-kind=2
+r4-agent6-sku=177
+r4-agent6-type=8
+r8-agent1-kind=2
+r8-agent1-sku=801
+r8-agent1-type=1
+r8-agent2-kind=2
+r8-agent2-sku=801
+r8-agent2-type=4
+r8-agent3-kind=2
+r8-agent3-sku=801
+r8-agent3-type=5
+r8-agent4-kind=2
+r8-agent4-sku=801
+r8-agent4-type=6
+r8-agent5-kind=2
+r8-agent5-sku=801
+r8-agent5-type=7
+r8-agent6-kind=2
+r8-agent6-sku=801
+r8-agent6-type=8
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=1.6.9
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=5a11
+usb-vid=3f0
+wifi-config=0
+
+[hp_designjet_t7100ps]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=1
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Designjet t7100PS
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.11.3
+tech-class=Postscript
+tech-subclass=Normal
+tech-type=2
+usb-pid=1014
+usb-vid=3f0
+wifi-config=0
+
+[hp_designjet_t7100ps_monochrome]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=1
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Designjet t7100 Monochrome
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.11.3
+tech-class=Postscript
+tech-subclass=Normal
+tech-type=1
+usb-pid=1014
+usb-vid=3f0
+wifi-config=0
+
+[officejet_k7100]
+align-type=1
+clean-type=1
+color-cal-type=3
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=DESKJET_9600.png
+io-mfp-mode=6
+io-mode=1
+io-support=3
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet K7100 Printer
+model2=HP Officejet K7103 Printer
+model3=HP Officejet K7108 Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=94 (C8765WN)/96 (C8767WN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=95 (C8766WN)/97 (C9363WN)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=99 (C9369WN)
+r0-agent3-type=3
+r0-agent4-kind=3
+r0-agent4-sku=100 (C9368AN)
+r0-agent4-type=10
+r1-agent1-kind=3
+r1-agent1-sku=94 (C8765WN)/96 (C8767WN)
+r1-agent1-type=1
+r1-agent2-kind=3
+r1-agent2-sku=95 (C8766WN)/97 (C9363WN)
+r1-agent2-type=2
+r1-agent3-kind=3
+r1-agent3-sku=99 (C9369WN)
+r1-agent3-type=3
+r1-agent4-kind=3
+r1-agent4-sku=100 (C9368AN)
+r1-agent4-type=10
+r2-agent1-kind=3
+r2-agent1-sku=94 (C8765WN)/96 (C8767WN)
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=95 (C8766WN)/97 (C9363WN)
+r2-agent2-type=2
+r2-agent3-kind=3
+r2-agent3-sku=99 (C9369WN)
+r2-agent3-type=3
+r2-agent4-kind=3
+r2-agent4-sku=100 (C9368AN)
+r2-agent4-type=10
+r3-agent1-kind=3
+r3-agent1-sku=94 (C8765WN)/96 (C8767WN)
+r3-agent1-type=1
+r3-agent2-kind=3
+r3-agent2-sku=95 (C8766WN)/97 (C9363WN)
+r3-agent2-type=2
+r3-agent3-kind=3
+r3-agent3-sku=99 (C9369WN)
+r3-agent3-type=3
+r3-agent4-kind=3
+r3-agent4-sku=100 (C9368AN)
+r3-agent4-type=10
+r4-agent1-kind=3
+r4-agent1-sku=339 (C8767EN)/338 (C8765EN)
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=344 (C9363EN)/343 (C8766EN)
+r4-agent2-type=2
+r4-agent3-kind=3
+r4-agent3-sku=348 (C9369EN)
+r4-agent3-type=3
+r4-agent4-kind=3
+r4-agent4-sku=100 (C9368AN)
+r4-agent4-type=10
+r5-agent1-kind=3
+r5-agent1-sku=130 (C8765HN)/131 (C8765HN)
+r5-agent1-type=1
+r5-agent2-kind=3
+r5-agent2-sku=134 (C8766HN)/135 (C9363HN)
+r5-agent2-type=2
+r5-agent3-kind=3
+r5-agent3-sku=138 (C9369HN)
+r5-agent3-type=3
+r5-agent4-kind=3
+r5-agent4-sku=100 (C9368AN)
+r5-agent4-type=10
+r6-agent1-kind=3
+r6-agent1-sku=130 (C8765HN)/131 (C8765HN)
+r6-agent1-type=1
+r6-agent2-kind=3
+r6-agent2-sku=134 (C8766HN)/135 (C9363HN)
+r6-agent2-type=2
+r6-agent3-kind=3
+r6-agent3-sku=138 (C9369HN)
+r6-agent3-type=3
+r6-agent4-kind=3
+r6-agent4-sku=100 (C9368AN)
+r6-agent4-type=10
+r7-agent1-kind=3
+r7-agent1-sku=853 (C8765ZN)/852 (C8765ZN)
+r7-agent1-type=1
+r7-agent2-kind=3
+r7-agent2-sku=857 (C9363ZN)/855 (C8766ZN)
+r7-agent2-type=2
+r7-agent3-kind=3
+r7-agent3-sku=858 (C9369ZN)
+r7-agent3-type=3
+r7-agent4-kind=3
+r7-agent4-sku=100 (C9368AN)
+r7-agent4-type=10
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.7.9
+tech-class=DJGenericVIP
+tech-subclass=LargeFormatSuperB
+tech-type=2
+usb-pid=2612
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_d7100_series]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=Photosmart_D7100.png
+io-mfp-mode=3
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart D7145 Printer
+model2=HP Photosmart D7155 Printer
+model3=HP Photosmart D7160 Printer
+model4=HP Photosmart D7163 Printer
+model5=HP Photosmart D7168 Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=2
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=2
+r0-agent1-sku=02 (C9338W)
+r0-agent1-type=1
+r0-agent2-kind=2
+r0-agent2-sku=02 (C9339W)
+r0-agent2-type=4
+r0-agent3-kind=2
+r0-agent3-sku=02 (C9340W)
+r0-agent3-type=5
+r0-agent4-kind=2
+r0-agent4-sku=02 (C9341W)
+r0-agent4-type=6
+r0-agent5-kind=2
+r0-agent5-sku=02 (C8774W)
+r0-agent5-type=7
+r0-agent6-kind=2
+r0-agent6-sku=02 (C8775W)
+r0-agent6-type=8
+r1-agent1-kind=2
+r1-agent1-sku=02 (C9338W)
+r1-agent1-type=1
+r1-agent2-kind=2
+r1-agent2-sku=02 (C9339W)
+r1-agent2-type=4
+r1-agent3-kind=2
+r1-agent3-sku=02 (C9340W)
+r1-agent3-type=5
+r1-agent4-kind=2
+r1-agent4-sku=02 (C9341W)
+r1-agent4-type=6
+r1-agent5-kind=2
+r1-agent5-sku=02 (C8774W)
+r1-agent5-type=7
+r1-agent6-kind=2
+r1-agent6-sku=02 (C8775W)
+r1-agent6-type=8
+r2-agent1-kind=2
+r2-agent1-sku=363 (C9338E)
+r2-agent1-type=1
+r2-agent2-kind=2
+r2-agent2-sku=363 (C9339E)
+r2-agent2-type=4
+r2-agent3-kind=2
+r2-agent3-sku=363 (C9340E)
+r2-agent3-type=5
+r2-agent4-kind=2
+r2-agent4-sku=363 (C9341E)
+r2-agent4-type=6
+r2-agent5-kind=2
+r2-agent5-sku=363 (C8774E)
+r2-agent5-type=7
+r2-agent6-kind=2
+r2-agent6-sku=363 (C8775E)
+r2-agent6-type=8
+r4-agent1-kind=2
+r4-agent1-sku=177 (C9338H)
+r4-agent1-type=1
+r4-agent2-kind=2
+r4-agent2-sku=177 (C9339H)
+r4-agent2-type=4
+r4-agent3-kind=2
+r4-agent3-sku=177 (C9340H)
+r4-agent3-type=5
+r4-agent4-kind=2
+r4-agent4-sku=177 (C9341H)
+r4-agent4-type=6
+r4-agent5-kind=2
+r4-agent5-sku=177 (C8774H)
+r4-agent5-type=7
+r4-agent6-kind=2
+r4-agent6-sku=177 (C8775H)
+r4-agent6-type=8
+r8-agent1-kind=2
+r8-agent1-sku=801 (C9338Z)
+r8-agent1-type=1
+r8-agent2-kind=2
+r8-agent2-sku=801 (C9339Z)
+r8-agent2-type=4
+r8-agent3-kind=2
+r8-agent3-sku=801 (C9340Z)
+r8-agent3-type=5
+r8-agent4-kind=2
+r8-agent4-sku=801 (C9341Z)
+r8-agent4-type=6
+r8-agent5-kind=2
+r8-agent5-sku=801 (C8774Z)
+r8-agent5-type=7
+r8-agent6-kind=2
+r8-agent6-sku=801 (C8775Z)
+r8-agent6-type=8
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=2
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=1.6.8
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=c602
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_7150]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=photosmart_7150.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart 7150 Printer
+model2=HP Photosmart 7150v Printer
+model3=HP Photosmart 7150w Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=56 (C6656A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=57 (C6657A)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=58 (C6658A)
+r0-agent3-type=3
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=3636
+support-type=2
+support-ver=0.9.5
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=3a02
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_7150~]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=photosmart_7150.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=Photosmart 7150 Series Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=56 (C6656A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=57 (C6657A)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=58 (C6658A)
+r0-agent3-type=3
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=3498
+support-type=2
+support-ver=0.9.5
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=3a02
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_d7200_series]
+align-type=1
+clean-type=1
+color-cal-type=4
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=Photosmart_D7100.png
+io-mfp-mode=3
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart D7245 Printer
+model2=HP Photosmart D7255 Printer
+model3=HP Photosmart D7260 Printer
+model4=HP Photosmart D7263 Printer
+model5=HP Photosmart D7268 Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=2
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=2
+r0-agent1-sku=02 (C9338W)
+r0-agent1-type=1
+r0-agent2-kind=2
+r0-agent2-sku=02 (C9339W)
+r0-agent2-type=4
+r0-agent3-kind=2
+r0-agent3-sku=02 (C9340W)
+r0-agent3-type=5
+r0-agent4-kind=2
+r0-agent4-sku=02 (C9341W)
+r0-agent4-type=6
+r0-agent5-kind=2
+r0-agent5-sku=02 (C8774W)
+r0-agent5-type=7
+r0-agent6-kind=2
+r0-agent6-sku=02 (C8775W)
+r0-agent6-type=8
+r1-agent1-kind=2
+r1-agent1-sku=02 (C9338W)
+r1-agent1-type=1
+r1-agent2-kind=2
+r1-agent2-sku=02 (C9339W)
+r1-agent2-type=4
+r1-agent3-kind=2
+r1-agent3-sku=02 (C9340W)
+r1-agent3-type=5
+r1-agent4-kind=2
+r1-agent4-sku=02 (C9341W)
+r1-agent4-type=6
+r1-agent5-kind=2
+r1-agent5-sku=02 (C8774W)
+r1-agent5-type=7
+r1-agent6-kind=2
+r1-agent6-sku=02 (C8775W)
+r1-agent6-type=8
+r2-agent1-kind=2
+r2-agent1-sku=363 (C9338E)
+r2-agent1-type=1
+r2-agent2-kind=2
+r2-agent2-sku=363 (C9339E)
+r2-agent2-type=4
+r2-agent3-kind=2
+r2-agent3-sku=363 (C9340E)
+r2-agent3-type=5
+r2-agent4-kind=2
+r2-agent4-sku=363 (C9341E)
+r2-agent4-type=6
+r2-agent5-kind=2
+r2-agent5-sku=363 (C8774E)
+r2-agent5-type=7
+r2-agent6-kind=2
+r2-agent6-sku=363 (C8775E)
+r2-agent6-type=8
+r4-agent1-kind=2
+r4-agent1-sku=177 (C9338H)
+r4-agent1-type=1
+r4-agent2-kind=2
+r4-agent2-sku=177 (C9339H)
+r4-agent2-type=4
+r4-agent3-kind=2
+r4-agent3-sku=177 (C9340H)
+r4-agent3-type=5
+r4-agent4-kind=2
+r4-agent4-sku=177 (C9341H)
+r4-agent4-type=6
+r4-agent5-kind=2
+r4-agent5-sku=177 (C8774H)
+r4-agent5-type=7
+r4-agent6-kind=2
+r4-agent6-sku=177 (C8775H)
+r4-agent6-type=8
+r8-agent1-kind=2
+r8-agent1-sku=801 (C9338Z)
+r8-agent1-type=1
+r8-agent2-kind=2
+r8-agent2-sku=801 (C9339Z)
+r8-agent2-type=4
+r8-agent3-kind=2
+r8-agent3-sku=801 (C9340Z)
+r8-agent3-type=5
+r8-agent4-kind=2
+r8-agent4-sku=801 (C9341Z)
+r8-agent4-type=6
+r8-agent5-kind=2
+r8-agent5-sku=801 (C8774Z)
+r8-agent5-type=7
+r8-agent6-kind=2
+r8-agent6-sku=801 (C8775Z)
+r8-agent6-type=8
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=2
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.7.9
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=6911
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_7200_series~]
+align-type=7
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=Photosmart_7400_series.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart 7260w Photo Printer
+model2=HP Photosmart 7260 Photo Printer
+model3=HP Photosmart 7260v Photo Printer
+model4=HP Photosmart 7268 Photo Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=56 (C6656A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=57 (C6657A)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=58 (C6658A)
+r0-agent3-type=3
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=385a
+support-type=2
+support-ver=0.9.5
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=b002
+usb-vid=3f0
+wifi-config=0
+
+[officejet_7200_series]
+align-type=1
+clean-type=1
+color-cal-type=3
+copy-type=0
+embedded-server-type=1
+fax-type=1
+fw-download=False
+icon=Officejet_6150_Series.png
+io-mfp-mode=3
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet 7205 All-in-One Printer
+model2=HP Officejet 7208 All-in-One Printer
+model3=HP Officejet 7210v All-in-One Printer
+model4=HP Officejet 7210xi All-in-One Printer
+model5=HP Officejet 7210 All-in-One Printer
+model6=HP Officejet 7213 All-in-One Printer
+model7=HP Officejet 7215 All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=94 (C8765WN)/96 (C8767WN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=95 (C8766WN)/97 (C9363WN)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=99 (C9369WN)
+r0-agent3-type=3
+r0-agent4-kind=3
+r0-agent4-sku=100 (C9368AN)
+r0-agent4-type=10
+r1-agent1-kind=3
+r1-agent1-sku=94 (C8765WN)/96 (C8767WN)
+r1-agent1-type=1
+r1-agent2-kind=3
+r1-agent2-sku=95 (C8766WN)/97 (C9363WN)
+r1-agent2-type=2
+r1-agent3-kind=3
+r1-agent3-sku=99 (C9369WN)
+r1-agent3-type=3
+r1-agent4-kind=3
+r1-agent4-sku=100 (C9368AN)
+r1-agent4-type=10
+r2-agent1-kind=3
+r2-agent1-sku=94 (C8765WN)/96 (C8767WN)
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=95 (C8766WN)/97 (C9363WN)
+r2-agent2-type=2
+r2-agent3-kind=3
+r2-agent3-sku=99 (C9369WN)
+r2-agent3-type=3
+r2-agent4-kind=3
+r2-agent4-sku=100 (C9368AN)
+r2-agent4-type=10
+r3-agent1-kind=3
+r3-agent1-sku=94 (C8765WN)/96 (C8767WN)
+r3-agent1-type=1
+r3-agent2-kind=3
+r3-agent2-sku=95 (C8766WN)/97 (C9363WN)
+r3-agent2-type=2
+r3-agent3-kind=3
+r3-agent3-sku=99 (C9369WN)
+r3-agent3-type=3
+r3-agent4-kind=3
+r3-agent4-sku=100 (C9368AN)
+r3-agent4-type=10
+r4-agent1-kind=3
+r4-agent1-sku=339/338
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=344/343
+r4-agent2-type=2
+r4-agent3-kind=3
+r4-agent3-sku=348
+r4-agent3-type=3
+r4-agent4-kind=3
+r4-agent4-sku=100 (C9368AN)
+r4-agent4-type=10
+r5-agent1-kind=3
+r5-agent1-sku=130/131
+r5-agent1-type=1
+r5-agent2-kind=3
+r5-agent2-sku=134/135
+r5-agent2-type=2
+r5-agent3-kind=3
+r5-agent3-sku=138
+r5-agent3-type=3
+r5-agent4-kind=3
+r5-agent4-sku=100 (C9368AN)
+r5-agent4-type=10
+r6-agent1-kind=3
+r6-agent1-sku=130/131
+r6-agent1-type=1
+r6-agent2-kind=3
+r6-agent2-sku=134/135
+r6-agent2-type=2
+r6-agent3-kind=3
+r6-agent3-sku=138
+r6-agent3-type=3
+r6-agent4-kind=3
+r6-agent4-sku=100 (C9368AN)
+r6-agent4-type=10
+r7-agent1-kind=3
+r7-agent1-sku=853/852
+r7-agent1-type=1
+r7-agent2-kind=3
+r7-agent2-sku=857/855
+r7-agent2-type=2
+r7-agent3-kind=3
+r7-agent3-sku=858
+r7-agent3-type=3
+r7-agent4-kind=3
+r7-agent4-sku=100 (C9368AN)
+r7-agent4-type=10
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=4111
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_c7200_series]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=3
+embedded-server-type=1
+fax-type=1
+fw-download=False
+icon=Photosmart_3300_series.png
+io-mfp-mode=3
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart C7250 All-in-One Printer
+model2=HP Photosmart C7275 All-in-One Printer
+model3=HP Photosmart C7280 All-in-One Printer
+model4=HP Photosmart C7283 All-in-One Printer
+model5=HP Photosmart C7288 All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=2
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=2
+r0-agent1-sku=2
+r0-agent1-type=1
+r0-agent2-kind=2
+r0-agent2-sku=2
+r0-agent2-type=4
+r0-agent3-kind=2
+r0-agent3-sku=2
+r0-agent3-type=5
+r0-agent4-kind=2
+r0-agent4-sku=2
+r0-agent4-type=6
+r0-agent5-kind=2
+r0-agent5-sku=2
+r0-agent5-type=7
+r0-agent6-kind=2
+r0-agent6-sku=2
+r0-agent6-type=8
+r1-agent1-kind=2
+r1-agent1-sku=2
+r1-agent1-type=1
+r1-agent2-kind=2
+r1-agent2-sku=2
+r1-agent2-type=4
+r1-agent3-kind=2
+r1-agent3-sku=2
+r1-agent3-type=5
+r1-agent4-kind=2
+r1-agent4-sku=2
+r1-agent4-type=6
+r1-agent5-kind=2
+r1-agent5-sku=2
+r1-agent5-type=7
+r1-agent6-kind=2
+r1-agent6-sku=2
+r1-agent6-type=8
+r2-agent1-kind=2
+r2-agent1-sku=363
+r2-agent1-type=1
+r2-agent2-kind=2
+r2-agent2-sku=363
+r2-agent2-type=4
+r2-agent3-kind=2
+r2-agent3-sku=363
+r2-agent3-type=5
+r2-agent4-kind=2
+r2-agent4-sku=363
+r2-agent4-type=6
+r2-agent5-kind=2
+r2-agent5-sku=363
+r2-agent5-type=7
+r2-agent6-kind=2
+r2-agent6-sku=363
+r2-agent6-type=8
+r4-agent1-kind=2
+r4-agent1-sku=177
+r4-agent1-type=1
+r4-agent2-kind=2
+r4-agent2-sku=177
+r4-agent2-type=4
+r4-agent3-kind=2
+r4-agent3-sku=177
+r4-agent3-type=5
+r4-agent4-kind=2
+r4-agent4-sku=177
+r4-agent4-type=6
+r4-agent5-kind=2
+r4-agent5-sku=177
+r4-agent5-type=7
+r4-agent6-kind=2
+r4-agent6-sku=177
+r4-agent6-type=8
+r8-agent1-kind=2
+r8-agent1-sku=801
+r8-agent1-type=1
+r8-agent2-kind=2
+r8-agent2-sku=801
+r8-agent2-type=4
+r8-agent3-kind=2
+r8-agent3-sku=801
+r8-agent3-type=5
+r8-agent4-kind=2
+r8-agent4-sku=801
+r8-agent4-type=6
+r8-agent5-kind=2
+r8-agent5-sku=801
+r8-agent5-type=7
+r8-agent6-kind=2
+r8-agent6-sku=801
+r8-agent6-type=8
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.7.9
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=6511
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_7200_series]
+align-type=7
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=Photosmart_7400_series.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart 7260 Photo Printer
+model2=HP Photosmart 7260v Photo Printer
+model3=HP Photosmart 7260w Photo Printer
+model4=HP Photosmart 7268 Photo Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=56 (C6656A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=57 (C6657A)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=58 (C6658A)
+r0-agent3-type=3
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=385a
+support-type=2
+support-ver=0.9.5
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=b002
+usb-vid=3f0
+wifi-config=0
+
+[hp_7220]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=0
+io-mode=0
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP 7220 Graphics Plotter
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=236d
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_7221]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=0
+io-mode=0
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP 7221 Graphics Plotter
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=236d
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[officejet_7300_series]
+align-type=1
+clean-type=1
+color-cal-type=3
+copy-type=0
+embedded-server-type=1
+fax-type=1
+fw-download=False
+icon=Officejet_6150_Series.png
+io-mfp-mode=3
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet 7310 All-in-One Printer
+model2=HP Officejet 7310xi All-in-One Printer
+model3=HP Officejet 7313 All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=94 (C8765WN)/96 (C8767WN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=95 (C8766WN)/97 (C9363WN)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=99 (C9369WN)
+r0-agent3-type=3
+r0-agent4-kind=3
+r0-agent4-sku=100 (C9368AN)
+r0-agent4-type=10
+r1-agent1-kind=3
+r1-agent1-sku=94 (C8765WN)/96 (C8767WN)
+r1-agent1-type=1
+r1-agent2-kind=3
+r1-agent2-sku=95 (C8766WN)/97 (C9363WN)
+r1-agent2-type=2
+r1-agent3-kind=3
+r1-agent3-sku=99 (C9369WN)
+r1-agent3-type=3
+r1-agent4-kind=3
+r1-agent4-sku=100 (C9368AN)
+r1-agent4-type=10
+r2-agent1-kind=3
+r2-agent1-sku=94 (C8765WN)/96 (C8767WN)
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=95 (C8766WN)/97 (C9363WN)
+r2-agent2-type=2
+r2-agent3-kind=3
+r2-agent3-sku=99 (C9369WN)
+r2-agent3-type=3
+r2-agent4-kind=3
+r2-agent4-sku=100 (C9368AN)
+r2-agent4-type=10
+r3-agent1-kind=3
+r3-agent1-sku=94 (C8765WN)/96 (C8767WN)
+r3-agent1-type=1
+r3-agent2-kind=3
+r3-agent2-sku=95 (C8766WN)/97 (C9363WN)
+r3-agent2-type=2
+r3-agent3-kind=3
+r3-agent3-sku=99 (C9369WN)
+r3-agent3-type=3
+r3-agent4-kind=3
+r3-agent4-sku=100 (C9368AN)
+r3-agent4-type=10
+r4-agent1-kind=3
+r4-agent1-sku=339/338
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=344/343
+r4-agent2-type=2
+r4-agent3-kind=3
+r4-agent3-sku=348
+r4-agent3-type=3
+r4-agent4-kind=3
+r4-agent4-sku=100 (C9368AN)
+r4-agent4-type=10
+r5-agent1-kind=3
+r5-agent1-sku=130/131
+r5-agent1-type=1
+r5-agent2-kind=3
+r5-agent2-sku=134/135
+r5-agent2-type=2
+r5-agent3-kind=3
+r5-agent3-sku=138
+r5-agent3-type=3
+r5-agent4-kind=3
+r5-agent4-sku=100 (C9368AN)
+r5-agent4-type=10
+r6-agent1-kind=3
+r6-agent1-sku=130/131
+r6-agent1-type=1
+r6-agent2-kind=3
+r6-agent2-sku=134/135
+r6-agent2-type=2
+r6-agent3-kind=3
+r6-agent3-sku=138
+r6-agent3-type=3
+r6-agent4-kind=3
+r6-agent4-sku=100 (C9368AN)
+r6-agent4-type=10
+r7-agent1-kind=3
+r7-agent1-sku=853/852
+r7-agent1-type=1
+r7-agent2-kind=3
+r7-agent2-sku=857/855
+r7-agent2-type=2
+r7-agent3-kind=3
+r7-agent3-sku=858
+r7-agent3-type=3
+r7-agent4-kind=3
+r7-agent4-sku=100 (C9368AN)
+r7-agent4-type=10
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=4211
+usb-vid=3f0
+wifi-config=0
+
+[officejet_pro_l7300]
+align-type=12
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=1
+fw-download=False
+icon=officejet_k550.png
+io-mfp-mode=3
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=2
+model1=HP Officejet Pro L7300 Series All-in-One Printer
+model2=HP Officejet Pro L7380 All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=2
+r-type=0
+r0-agent1-kind=1
+r0-agent1-sku=88 (C9381)
+r0-agent1-type=14
+r0-agent2-kind=1
+r0-agent2-sku=88 (C9382)
+r0-agent2-type=15
+r0-agent3-kind=2
+r0-agent3-sku=88 (C9396 ) / 88L (C9385)
+r0-agent3-type=1
+r0-agent4-kind=2
+r0-agent4-sku=88 (C9388) / 88L (C9393)
+r0-agent4-type=6
+r0-agent5-kind=2
+r0-agent5-sku=88 (C9387) / 88L (C9392)
+r0-agent5-type=5
+r0-agent6-kind=2
+r0-agent6-sku=88 (C9386) / 88L (C9391)
+r0-agent6-type=4
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=3b90
+support-type=2
+support-ver=1.7.2
+tech-class=OJProKx50
+tech-subclass=NoFullBleed
+tech-type=2
+usb-pid=2512
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_d7300_series]
+align-type=1
+clean-type=1
+color-cal-type=4
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=Photosmart_D7300.png
+io-mfp-mode=3
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart D7345 Printer
+model2=HP Photosmart D7355 Printer
+model3=HP Photosmart D7360 Printer
+model4=HP Photosmart D7363 Printer
+model5=HP Photosmart D7368 Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=2
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=2
+r0-agent1-sku=02 (C9338W)
+r0-agent1-type=1
+r0-agent2-kind=2
+r0-agent2-sku=02 (C9339W)
+r0-agent2-type=4
+r0-agent3-kind=2
+r0-agent3-sku=02 (C9340W)
+r0-agent3-type=5
+r0-agent4-kind=2
+r0-agent4-sku=02 (C9341W)
+r0-agent4-type=6
+r0-agent5-kind=2
+r0-agent5-sku=02 (C8774W)
+r0-agent5-type=7
+r0-agent6-kind=2
+r0-agent6-sku=02 (C8775W)
+r0-agent6-type=8
+r1-agent1-kind=2
+r1-agent1-sku=02 (C9338W)
+r1-agent1-type=1
+r1-agent2-kind=2
+r1-agent2-sku=02 (C9339W)
+r1-agent2-type=4
+r1-agent3-kind=2
+r1-agent3-sku=02 (C9340W)
+r1-agent3-type=5
+r1-agent4-kind=2
+r1-agent4-sku=02 (C9341W)
+r1-agent4-type=6
+r1-agent5-kind=2
+r1-agent5-sku=02 (C8774W)
+r1-agent5-type=7
+r1-agent6-kind=2
+r1-agent6-sku=02 (C8775W)
+r1-agent6-type=8
+r2-agent1-kind=2
+r2-agent1-sku=363 (C9338E)
+r2-agent1-type=1
+r2-agent2-kind=2
+r2-agent2-sku=363 (C9339E)
+r2-agent2-type=4
+r2-agent3-kind=2
+r2-agent3-sku=363 (C9340E)
+r2-agent3-type=5
+r2-agent4-kind=2
+r2-agent4-sku=363 (C9341E)
+r2-agent4-type=6
+r2-agent5-kind=2
+r2-agent5-sku=363 (C8774E)
+r2-agent5-type=7
+r2-agent6-kind=2
+r2-agent6-sku=363 (C8775E)
+r2-agent6-type=8
+r4-agent1-kind=2
+r4-agent1-sku=177 (C9338H)
+r4-agent1-type=1
+r4-agent2-kind=2
+r4-agent2-sku=177 (C9339H)
+r4-agent2-type=4
+r4-agent3-kind=2
+r4-agent3-sku=177 (C9340H)
+r4-agent3-type=5
+r4-agent4-kind=2
+r4-agent4-sku=177 (C9341H)
+r4-agent4-type=6
+r4-agent5-kind=2
+r4-agent5-sku=177 (C8774H)
+r4-agent5-type=7
+r4-agent6-kind=2
+r4-agent6-sku=177 (C8775H)
+r4-agent6-type=8
+r8-agent1-kind=2
+r8-agent1-sku=801 (C9338Z)
+r8-agent1-type=1
+r8-agent2-kind=2
+r8-agent2-sku=801 (C9339Z)
+r8-agent2-type=4
+r8-agent3-kind=2
+r8-agent3-sku=801 (C9340Z)
+r8-agent3-type=5
+r8-agent4-kind=2
+r8-agent4-sku=801 (C9341Z)
+r8-agent4-type=6
+r8-agent5-kind=2
+r8-agent5-sku=801 (C8774Z)
+r8-agent5-type=7
+r8-agent6-kind=2
+r8-agent6-sku=801 (C8775Z)
+r8-agent6-type=8
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=2
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=1.6.6
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=c702
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_7345]
+align-type=1
+clean-type=1
+color-cal-type=3
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=photosmart_7150.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart 7345 Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=56 (C6656A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=57 (C6657A)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=58 (C6658A)
+r0-agent3-type=3
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=2002
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_7350]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=photosmart_7150.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart 7350 Printer
+model2=HP Photosmart 7350v Printer
+model3=HP Photosmart 7350w Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=56 (C6656A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=57 (C6657A)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=58 (C6658A)
+r0-agent3-type=3
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=3911
+support-type=2
+support-ver=0.9.5
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=3c02
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_7350~]
+align-type=1
+clean-type=1
+color-cal-type=3
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=photosmart_7150.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=Photosmart 7350 Series Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=56 (C6656A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=57 (C6657A)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=58 (C6658A)
+r0-agent3-type=3
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=3911
+support-type=2
+support-ver=0.9.5
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=3c02
+usb-vid=3f0
+wifi-config=0
+
+[officejet_7400_series]
+align-type=1
+clean-type=1
+color-cal-type=3
+copy-type=0
+embedded-server-type=1
+fax-type=1
+fw-download=False
+icon=default_officejet.png
+io-mfp-mode=3
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet 7408 All-in-One Printer
+model2=HP Officejet 7410 All-in-One Printer
+model3=HP Officejet 7410xi All-in-One Printer
+model4=HP Officejet 7413 All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=94 (C8765WN)/96 (C8767WN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=95 (C8766WN)/97 (C9363WN)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=99 (C9369WN)
+r0-agent3-type=3
+r0-agent4-kind=3
+r0-agent4-sku=100 (C9368AN)
+r0-agent4-type=10
+r1-agent1-kind=3
+r1-agent1-sku=94 (C8765WN)/96 (C8767WN)
+r1-agent1-type=1
+r1-agent2-kind=3
+r1-agent2-sku=95 (C8766WN)/97 (C9363WN)
+r1-agent2-type=2
+r1-agent3-kind=3
+r1-agent3-sku=99 (C9369WN)
+r1-agent3-type=3
+r1-agent4-kind=3
+r1-agent4-sku=100 (C9368AN)
+r1-agent4-type=10
+r2-agent1-kind=3
+r2-agent1-sku=94 (C8765WN)/96 (C8767WN)
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=95 (C8766WN)/97 (C9363WN)
+r2-agent2-type=2
+r2-agent3-kind=3
+r2-agent3-sku=99 (C9369WN)
+r2-agent3-type=3
+r2-agent4-kind=3
+r2-agent4-sku=100 (C9368AN)
+r2-agent4-type=10
+r3-agent1-kind=3
+r3-agent1-sku=94 (C8765WN)/96 (C8767WN)
+r3-agent1-type=1
+r3-agent2-kind=3
+r3-agent2-sku=95 (C8766WN)/97 (C9363WN)
+r3-agent2-type=2
+r3-agent3-kind=3
+r3-agent3-sku=99 (C9369WN)
+r3-agent3-type=3
+r3-agent4-kind=3
+r3-agent4-sku=100 (C9368AN)
+r3-agent4-type=10
+r4-agent1-kind=3
+r4-agent1-sku=339/338
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=344/343
+r4-agent2-type=2
+r4-agent3-kind=3
+r4-agent3-sku=348
+r4-agent3-type=3
+r4-agent4-kind=3
+r4-agent4-sku=100 (C9368AN)
+r4-agent4-type=10
+r5-agent1-kind=3
+r5-agent1-sku=130/131
+r5-agent1-type=1
+r5-agent2-kind=3
+r5-agent2-sku=134/135
+r5-agent2-type=2
+r5-agent3-kind=3
+r5-agent3-sku=138
+r5-agent3-type=3
+r5-agent4-kind=3
+r5-agent4-sku=100 (C9368AN)
+r5-agent4-type=10
+r6-agent1-kind=3
+r6-agent1-sku=130/131
+r6-agent1-type=1
+r6-agent2-kind=3
+r6-agent2-sku=134/135
+r6-agent2-type=2
+r6-agent3-kind=3
+r6-agent3-sku=138
+r6-agent3-type=3
+r6-agent4-kind=3
+r6-agent4-sku=100 (C9368AN)
+r6-agent4-type=10
+r7-agent1-kind=3
+r7-agent1-sku=853/852
+r7-agent1-type=1
+r7-agent2-kind=3
+r7-agent2-sku=857/855
+r7-agent2-type=2
+r7-agent3-kind=3
+r7-agent3-sku=858
+r7-agent3-type=3
+r7-agent4-kind=3
+r7-agent4-sku=100 (C9368AN)
+r7-agent4-type=10
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=4311
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_7400_series]
+align-type=7
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=Photosmart_7400_series.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart 7450 Photo Printer
+model2=HP Photosmart 7450v Photo Printer
+model3=HP Photosmart 7450xi Photo Printer
+model4=HP Photosmart 7458 Photo Printer
+model5=HP Photosmart 7459 Photo Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=2
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=56 (C6656A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=57 (C6657A)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=58 (C6658A)
+r0-agent3-type=3
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=b802
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_d7400_series]
+align-type=1
+clean-type=1
+color-cal-type=4
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=Photosmart_D7300.png
+io-mfp-mode=3
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart D7460 Printer
+model2=HP Photosmart D7463 Printer
+model3=HP Photosmart D7468 Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=2
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=2
+r0-agent1-sku=02 (C9338W)
+r0-agent1-type=1
+r0-agent2-kind=2
+r0-agent2-sku=02 (C9339W)
+r0-agent2-type=4
+r0-agent3-kind=2
+r0-agent3-sku=02 (C9340W)
+r0-agent3-type=5
+r0-agent4-kind=2
+r0-agent4-sku=02 (C9341W)
+r0-agent4-type=6
+r0-agent5-kind=2
+r0-agent5-sku=02 (C8774W)
+r0-agent5-type=7
+r0-agent6-kind=2
+r0-agent6-sku=02 (C8775W)
+r0-agent6-type=8
+r1-agent1-kind=2
+r1-agent1-sku=02 (C9338W)
+r1-agent1-type=1
+r1-agent2-kind=2
+r1-agent2-sku=02 (C9339W)
+r1-agent2-type=4
+r1-agent3-kind=2
+r1-agent3-sku=02 (C9340W)
+r1-agent3-type=5
+r1-agent4-kind=2
+r1-agent4-sku=02 (C9341W)
+r1-agent4-type=6
+r1-agent5-kind=2
+r1-agent5-sku=02 (C8774W)
+r1-agent5-type=7
+r1-agent6-kind=2
+r1-agent6-sku=02 (C8775W)
+r1-agent6-type=8
+r2-agent1-kind=2
+r2-agent1-sku=363 (C9338E)
+r2-agent1-type=1
+r2-agent2-kind=2
+r2-agent2-sku=363 (C9339E)
+r2-agent2-type=4
+r2-agent3-kind=2
+r2-agent3-sku=363 (C9340E)
+r2-agent3-type=5
+r2-agent4-kind=2
+r2-agent4-sku=363 (C9341E)
+r2-agent4-type=6
+r2-agent5-kind=2
+r2-agent5-sku=363 (C8774E)
+r2-agent5-type=7
+r2-agent6-kind=2
+r2-agent6-sku=363 (C8775E)
+r2-agent6-type=8
+r4-agent1-kind=2
+r4-agent1-sku=177 (C9338H)
+r4-agent1-type=1
+r4-agent2-kind=2
+r4-agent2-sku=177 (C9339H)
+r4-agent2-type=4
+r4-agent3-kind=2
+r4-agent3-sku=177 (C9340H)
+r4-agent3-type=5
+r4-agent4-kind=2
+r4-agent4-sku=177 (C9341H)
+r4-agent4-type=6
+r4-agent5-kind=2
+r4-agent5-sku=177 (C8774H)
+r4-agent5-type=7
+r4-agent6-kind=2
+r4-agent6-sku=177 (C8775H)
+r4-agent6-type=8
+r8-agent1-kind=2
+r8-agent1-sku=801 (C9338Z)
+r8-agent1-type=1
+r8-agent2-kind=2
+r8-agent2-sku=801 (C9339Z)
+r8-agent2-type=4
+r8-agent3-kind=2
+r8-agent3-sku=801 (C9340Z)
+r8-agent3-type=5
+r8-agent4-kind=2
+r8-agent4-sku=801 (C9341Z)
+r8-agent4-type=6
+r8-agent5-kind=2
+r8-agent5-sku=801 (C8774Z)
+r8-agent5-type=7
+r8-agent6-kind=2
+r8-agent6-sku=801 (C8775Z)
+r8-agent6-type=8
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=2
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.7.9
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=5e11
+usb-vid=3f0
+wifi-config=0
+
+[officejet_pro_l7400]
+align-type=12
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=officejet_k550.png
+io-mfp-mode=3
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=2
+model1=HP Officejet Pro L7480 All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=2
+r-type=0
+r0-agent1-kind=1
+r0-agent1-sku=88 (C9381)
+r0-agent1-type=14
+r0-agent2-kind=1
+r0-agent2-sku=88 (C9382)
+r0-agent2-type=15
+r0-agent3-kind=2
+r0-agent3-sku=88 (C9396 ) / 88L (C9385)
+r0-agent3-type=1
+r0-agent4-kind=2
+r0-agent4-sku=88 (C9388) / 88L (C9393)
+r0-agent4-type=6
+r0-agent5-kind=2
+r0-agent5-sku=88 (C9387) / 88L (C9392)
+r0-agent5-type=5
+r0-agent6-kind=2
+r0-agent6-sku=88 (C9386) / 88L (C9391)
+r0-agent6-type=4
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.8.4
+tech-class=OJProKx50
+tech-subclass=NoFullBleed
+tech-type=2
+usb-pid=3412
+usb-vid=3f0
+wifi-config=0
+
+[hp_7475a]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=0
+io-mode=0
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP 7475A Plotter
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=2da8
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[officejet_pro_l7500]
+align-type=12
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=1
+fw-download=False
+icon=officejet_k550.png
+io-mfp-mode=3
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=2
+model1=HP Officejet Pro L7500 Series All-in-One Printer
+model2=HP Officejet Pro L7550 All-in-One Printer
+model3=HP Officejet Pro L7555 All-in-One Printer
+model4=HP Officejet Pro L7580 All-in-One Printer
+model5=HP Officejet Pro L7590 All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=2
+r-type=0
+r0-agent1-kind=1
+r0-agent1-sku=88 (C9381)
+r0-agent1-type=14
+r0-agent2-kind=1
+r0-agent2-sku=88 (C9382)
+r0-agent2-type=15
+r0-agent3-kind=2
+r0-agent3-sku=88 (C9396 ) / 88L (C9385)
+r0-agent3-type=1
+r0-agent4-kind=2
+r0-agent4-sku=88 (C9388) / 88L (C9393)
+r0-agent4-type=6
+r0-agent5-kind=2
+r0-agent5-sku=88 (C9387) / 88L (C9392)
+r0-agent5-type=5
+r0-agent6-kind=2
+r0-agent6-sku=88 (C9386) / 88L (C9391)
+r0-agent6-type=4
+scan-src=1
+scan-type=6
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=1.7.2
+tech-class=OJProKx50
+tech-subclass=NoFullBleed
+tech-type=2
+usb-pid=2112
+usb-vid=3f0
+wifi-config=0
+
+[officejet_7500_e910]
+align-type=15
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=6
+fw-download=False
+icon=officejet_k550.png
+io-mfp-mode=1
+io-mode=1
+io-support=14
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet 7500 E910
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=2
+r0-agent1-sku=564/564XL
+r0-agent1-type=1
+r0-agent2-kind=2
+r0-agent2-sku=564/564XL
+r0-agent2-type=4
+r0-agent3-kind=2
+r0-agent3-sku=564/564XL
+r0-agent3-type=5
+r0-agent4-kind=2
+r0-agent4-sku=564/564XL
+r0-agent4-type=6
+r1-agent1-kind=2
+r1-agent1-sku=564/564XL
+r1-agent1-type=1
+r1-agent2-kind=2
+r1-agent2-sku=564/564XL
+r1-agent2-type=4
+r1-agent3-kind=2
+r1-agent3-sku=564/564XL
+r1-agent3-type=5
+r1-agent4-kind=2
+r1-agent4-sku=564/564XL
+r1-agent4-type=6
+r2-agent1-kind=2
+r2-agent1-sku=364/364XL
+r2-agent1-type=1
+r2-agent2-kind=2
+r2-agent2-sku=364/364XL
+r2-agent2-type=4
+r2-agent3-kind=2
+r2-agent3-sku=364/364XL
+r2-agent3-type=5
+r2-agent4-kind=2
+r2-agent4-sku=364/364XL
+r2-agent4-type=6
+r4-agent1-kind=2
+r4-agent1-sku=178/178XL
+r4-agent1-type=1
+r4-agent2-kind=2
+r4-agent2-sku=178/178XL
+r4-agent2-type=4
+r4-agent3-kind=2
+r4-agent3-sku=178/178XL
+r4-agent3-type=5
+r4-agent4-kind=2
+r4-agent4-sku=178/178XL
+r4-agent4-type=6
+r8-agent1-kind=2
+r8-agent1-sku=862/862XL
+r8-agent1-type=1
+r8-agent2-kind=2
+r8-agent2-sku=862/862XL
+r8-agent2-type=4
+r8-agent3-kind=2
+r8-agent3-sku=862/862XL
+r8-agent3-type=5
+r8-agent4-kind=2
+r8-agent4-sku=862/862XL
+r8-agent4-type=6
+scan-src=3
+scan-type=7
+status-battery-check=0
+status-dynamic-counters=1
+status-type=10
+support-released=True
+support-subtype=39a5
+support-type=2
+support-ver=3.10.9
+tech-class=OJ7000
+tech-subclass=LargeFormatA3,SmallMargins
+tech-type=2
+usb-pid=4812
+usb-vid=3f0
+wifi-config=3
+
+[photosmart_d7500_series]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=Photosmart_D7300.png
+io-mfp-mode=3
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart D7560 Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=2
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=2
+r0-agent1-sku=04/04XL
+r0-agent1-type=1
+r0-agent2-kind=2
+r0-agent2-sku=04/04XL
+r0-agent2-type=4
+r0-agent3-kind=2
+r0-agent3-sku=04/04XL
+r0-agent3-type=5
+r0-agent4-kind=2
+r0-agent4-sku=04/04XL
+r0-agent4-type=6
+r0-agent5-kind=2
+r0-agent5-sku=04/04XL
+r0-agent5-type=16
+r1-agent1-kind=2
+r1-agent1-sku=04/04XL
+r1-agent1-type=1
+r1-agent2-kind=2
+r1-agent2-sku=04/04XL
+r1-agent2-type=4
+r1-agent3-kind=2
+r1-agent3-sku=04/04XL
+r1-agent3-type=5
+r1-agent4-kind=2
+r1-agent4-sku=04/04XL
+r1-agent4-type=6
+r1-agent5-kind=2
+r1-agent5-sku=04/04XL
+r1-agent5-type=16
+r2-agent1-kind=2
+r2-agent1-sku=360/360XL
+r2-agent1-type=1
+r2-agent2-kind=2
+r2-agent2-sku=360/360XL
+r2-agent2-type=4
+r2-agent3-kind=2
+r2-agent3-sku=360/360XL
+r2-agent3-type=5
+r2-agent4-kind=2
+r2-agent4-sku=360/360XL
+r2-agent4-type=6
+r2-agent5-kind=2
+r2-agent5-sku=360/360XL
+r2-agent5-type=16
+r4-agent1-kind=2
+r4-agent1-sku=155/155XL
+r4-agent1-type=1
+r4-agent2-kind=2
+r4-agent2-sku=155/155XL
+r4-agent2-type=4
+r4-agent3-kind=2
+r4-agent3-sku=155/155XL
+r4-agent3-type=5
+r4-agent4-kind=2
+r4-agent4-sku=155/155XL
+r4-agent4-type=6
+r4-agent5-kind=2
+r4-agent5-sku=155/155XL
+r4-agent5-type=16
+r8-agent1-kind=2
+r8-agent1-sku=808/808XL
+r8-agent1-type=1
+r8-agent2-kind=2
+r8-agent2-sku=808/808XL
+r8-agent2-type=4
+r8-agent3-kind=2
+r8-agent3-sku=808/808XL
+r8-agent3-type=5
+r8-agent4-kind=2
+r8-agent4-sku=808/808XL
+r8-agent4-type=6
+r8-agent5-kind=2
+r8-agent5-sku=808/808XL
+r8-agent5-type=16
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=2
+status-type=2
+support-released=True
+support-subtype=3da3
+support-type=2
+support-ver=2.8.10
+tech-class=Python
+tech-subclass=NoAutoDuplex,NoCDDVD,NoMaxDPI
+tech-type=2
+usb-pid=6f11
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_7510_series]
+align-type=0
+clean-type=3
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=Photosmart_C6100.png
+io-mfp-mode=1
+io-mode=1
+io-support=10
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart 7510 e-All-in-One
+monitor-type=0
+panel-check-type=1
+pcard-type=2
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=2
+r0-agent1-sku=564/564XL
+r0-agent1-type=1
+r0-agent2-kind=2
+r0-agent2-sku=564/564XL
+r0-agent2-type=4
+r0-agent3-kind=2
+r0-agent3-sku=564/564XL
+r0-agent3-type=5
+r0-agent4-kind=2
+r0-agent4-sku=564/564XL
+r0-agent4-type=6
+r0-agent5-kind=2
+r0-agent5-sku=564/564XL
+r0-agent5-type=19
+r1-agent1-kind=2
+r1-agent1-sku=564/564XL
+r1-agent1-type=1
+r1-agent2-kind=2
+r1-agent2-sku=564/564XL
+r1-agent2-type=4
+r1-agent3-kind=2
+r1-agent3-sku=564/564XL
+r1-agent3-type=5
+r1-agent4-kind=2
+r1-agent4-sku=564/564XL
+r1-agent4-type=6
+r1-agent5-kind=2
+r1-agent5-sku=564/564XL
+r1-agent5-type=19
+r2-agent1-kind=2
+r2-agent1-sku=364/364XL
+r2-agent1-type=1
+r2-agent2-kind=2
+r2-agent2-sku=364/364XL
+r2-agent2-type=4
+r2-agent3-kind=2
+r2-agent3-sku=364/364XL
+r2-agent3-type=5
+r2-agent4-kind=2
+r2-agent4-sku=364/364XL
+r2-agent4-type=6
+r2-agent5-kind=2
+r2-agent5-sku=364/364XL
+r2-agent5-type=19
+r4-agent1-kind=2
+r4-agent1-sku=178/178XL
+r4-agent1-type=1
+r4-agent2-kind=2
+r4-agent2-sku=178/178XL
+r4-agent2-type=4
+r4-agent3-kind=2
+r4-agent3-sku=178/178XL
+r4-agent3-type=5
+r4-agent4-kind=2
+r4-agent4-sku=178/178XL
+r4-agent4-type=6
+r4-agent5-kind=2
+r4-agent5-sku=178/178XL
+r4-agent5-type=19
+r8-agent1-kind=2
+r8-agent1-sku=862/862XL
+r8-agent1-type=1
+r8-agent2-kind=2
+r8-agent2-sku=862/862XL
+r8-agent2-type=4
+r8-agent3-kind=2
+r8-agent3-sku=862/862XL
+r8-agent3-type=5
+r8-agent4-kind=2
+r8-agent4-sku=862/862XL
+r8-agent4-type=6
+r8-agent5-kind=2
+r8-agent5-sku=862/862XL
+r8-agent5-type=19
+scan-src=3
+scan-type=7
+status-battery-check=0
+status-dynamic-counters=2
+status-type=1
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.11.10
+tech-class=Python11
+tech-subclass=Normal
+tech-type=2
+usb-pid=a611
+usb-vid=3f0
+wifi-config=0
+
+[hp_7550]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=0
+io-mode=0
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP 7550A Plus Plotter
+model2=HP 7550B Plus Plotter
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=2dc7
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_7550]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=photosmart_7150.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart 7550 Printer
+model2=HP Photosmart 7550v Printer
+model3=HP Photosmart 7550w Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=56 (C6656A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=57 (C6657A)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=58 (C6658A)
+r0-agent3-type=3
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=3e02
+usb-vid=3f0
+wifi-config=0
+
+[hp_7580]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=0
+io-mode=0
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP 7580A Drafting Plotter
+model2=HP 7580B Drafting Plotter
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=2796
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_7585]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=0
+io-mode=0
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP 7585A Drafting Plotter
+model2=HP 7585B Drafting Plotter
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=2796
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_7586b]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=0
+io-mode=0
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP 7586B Drafting Plotter
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=2796
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[officejet_pro_l7600]
+align-type=12
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=1
+fw-download=False
+icon=officejet_k550.png
+io-mfp-mode=3
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=2
+model1=HP Officejet Pro L7600 Series All-in-One Printer
+model2=HP Officejet Pro L7650 All-in-One Printer
+model3=HP Officejet Pro L7680 All-in-One Printer
+model4=HP Officejet Pro L7681 All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=2
+r-type=0
+r0-agent1-kind=1
+r0-agent1-sku=88 (C9381)
+r0-agent1-type=14
+r0-agent2-kind=1
+r0-agent2-sku=88 (C9382)
+r0-agent2-type=15
+r0-agent3-kind=2
+r0-agent3-sku=88 (C9396 ) / 88L (C9385)
+r0-agent3-type=1
+r0-agent4-kind=2
+r0-agent4-sku=88 (C9388) / 88L (C9393)
+r0-agent4-type=6
+r0-agent5-kind=2
+r0-agent5-sku=88 (C9387) / 88L (C9392)
+r0-agent5-type=5
+r0-agent6-kind=2
+r0-agent6-sku=88 (C9386) / 88L (C9391)
+r0-agent6-type=4
+scan-src=1
+scan-type=6
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=1.7.2
+tech-class=OJProKx50
+tech-subclass=NoFullBleed
+tech-type=2
+usb-pid=2212
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_7600_series]
+align-type=1
+clean-type=1
+color-cal-type=3
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_photosmart.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart 7655 Photo Printer
+model2=HP Photosmart 7660 Photo Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=56 (C6656A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=57 (C6657A)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=58 (C6658A)
+r0-agent3-type=3
+r0-agent4-kind=3
+r0-agent4-sku=59 (C9359A)
+r0-agent4-type=10
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=b202
+usb-vid=3f0
+wifi-config=0
+
+[officejet_pro_l7700]
+align-type=12
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=1
+fw-download=False
+icon=Officejet_9100_series.png
+io-mfp-mode=3
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=2
+model1=HP Officejet Pro L7700 Series All-in-One Printer
+model2=HP Officejet Pro L7710 All-in-One Printer
+model3=HP Officejet Pro L7750 All-in-One Printer
+model4=HP Officejet Pro L7780 All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=2
+r-type=0
+r0-agent1-kind=1
+r0-agent1-sku=88 (C9381)
+r0-agent1-type=14
+r0-agent2-kind=1
+r0-agent2-sku=88 (C9382)
+r0-agent2-type=15
+r0-agent3-kind=2
+r0-agent3-sku=88 (C9396 ) / 88L (C9385)
+r0-agent3-type=1
+r0-agent4-kind=2
+r0-agent4-sku=88 (C9388) / 88L (C9393)
+r0-agent4-type=6
+r0-agent5-kind=2
+r0-agent5-sku=88 (C9387) / 88L (C9392)
+r0-agent5-type=5
+r0-agent6-kind=2
+r0-agent6-sku=88 (C9386) / 88L (C9391)
+r0-agent6-type=4
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=1.7.2
+tech-class=OJProKx50
+tech-subclass=NoFullBleed
+tech-type=2
+usb-pid=2312
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_7700_series]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_photosmart.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart 7755 Photo Printer
+model2=HP Photosmart 7760od Photo Printer
+model3=HP Photosmart 7760 Photo Printer
+model4=HP Photosmart 7760v Photo Printer
+model5=HP Photosmart 7760w Photo Printer
+model6=HP Photosmart 7762w Photo Printer
+model7=HP Photosmart 7762w Photo Printer
+model8=HP Photosmart 7762 Photo Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=56 (C6656A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=57 (C6657A)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=58 (C6658A)
+r0-agent3-type=3
+r0-agent4-kind=3
+r0-agent4-sku=59 (C9359A)
+r0-agent4-type=10
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=b402
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_7800_series]
+align-type=10
+clean-type=1
+color-cal-type=3
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=Photosmart_7400_series.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart 7830 Printer
+model2=HP Photosmart 7838 Printer
+model3=HP Photosmart 7850 Printer
+model4=HP Photosmart 7850v Printer
+model5=HP Photosmart 7850vxi Printer
+model6=HP Photosmart 7853 Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=92 (C9361WN)/94 (C8765WN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=93 (C9362WN)/95 (C8766WN)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=99 (C9369WN)
+r0-agent3-type=3
+r0-agent4-kind=3
+r0-agent4-sku=100 (C9368AN)
+r0-agent4-type=10
+r1-agent1-kind=3
+r1-agent1-sku=92 (C9361WN)/94 (C8765WN)
+r1-agent1-type=1
+r1-agent2-kind=3
+r1-agent2-sku=93 (C9362WN)/95 (C8766WN)
+r1-agent2-type=2
+r1-agent3-kind=3
+r1-agent3-sku=99 (C9369WN)
+r1-agent3-type=3
+r1-agent4-kind=3
+r1-agent4-sku=100 (C9368AN)
+r1-agent4-type=10
+r2-agent1-kind=3
+r2-agent1-sku=92 (C9361WN)/94 (C8765WN)
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=93 (C9362WN)/95 (C8766WN)
+r2-agent2-type=2
+r2-agent3-kind=3
+r2-agent3-sku=99 (C9369WN)
+r2-agent3-type=3
+r2-agent4-kind=3
+r2-agent4-sku=100 (C9368AN)
+r2-agent4-type=10
+r3-agent1-kind=3
+r3-agent1-sku=92 (C9361WN)/94 (C8765WN)
+r3-agent1-type=1
+r3-agent2-kind=3
+r3-agent2-sku=93 (C9362WN)/95 (C8766WN)
+r3-agent2-type=2
+r3-agent3-kind=3
+r3-agent3-sku=99 (C9369WN)
+r3-agent3-type=3
+r3-agent4-kind=3
+r3-agent4-sku=100 (C9368AN)
+r3-agent4-type=10
+r4-agent1-kind=3
+r4-agent1-sku=337 (C9361EN)/338 (C8765EN)
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=342 (C9362EN)/343 (C8766EN)
+r4-agent2-type=2
+r4-agent3-kind=3
+r4-agent3-sku=348 (C9369EN)
+r4-agent3-type=3
+r4-agent4-kind=3
+r4-agent4-sku=100 (C9368AN)
+r4-agent4-type=10
+r5-agent1-kind=3
+r5-agent1-sku=132 (C9361HN)/131 (C8765HN)
+r5-agent1-type=1
+r5-agent2-kind=3
+r5-agent2-sku=136 (C9362HN)/135 (C8766HN)
+r5-agent2-type=2
+r5-agent3-kind=3
+r5-agent3-sku=138 (C9369HN)
+r5-agent3-type=3
+r5-agent4-kind=3
+r5-agent4-sku=100 (C9368AN)
+r5-agent4-type=10
+r6-agent1-kind=3
+r6-agent1-sku=132 (C9361HN)/131 (C8765HN)
+r6-agent1-type=1
+r6-agent2-kind=3
+r6-agent2-sku=136 (C9362HN)/135 (C8766HN)
+r6-agent2-type=2
+r6-agent3-kind=3
+r6-agent3-sku=138 (C9369HN)
+r6-agent3-type=3
+r6-agent4-kind=3
+r6-agent4-sku=100 (C9368AN)
+r6-agent4-type=10
+r7-agent1-kind=3
+r7-agent1-sku=850 (C9361ZN)/852 (C8765ZN)
+r7-agent1-type=1
+r7-agent2-kind=3
+r7-agent2-sku=854 (C9362ZN)/855 (C8766ZN)
+r7-agent2-type=2
+r7-agent3-kind=3
+r7-agent3-sku=858 (C9369ZN)
+r7-agent3-type=3
+r7-agent4-kind=3
+r7-agent4-sku=100 (C9368AN)
+r7-agent4-type=10
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=c002
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_7900_series]
+align-type=1
+clean-type=1
+color-cal-type=3
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=photosmart_7900_series.png
+io-mfp-mode=6
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart 7960 Photo Printer
+model2=HP Photosmart 7960v Photo Printer
+model3=HP Photosmart 7960w Photo Printer
+model4=HP Photosmart 7960gp Photo Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=56 (C6656A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=57 (C6657A)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=58 (C6658A)
+r0-agent3-type=3
+r0-agent4-kind=3
+r0-agent4-sku=59 (C9359A)
+r0-agent4-type=10
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=3b04
+support-type=2
+support-ver=0.9.5
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=b602
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_8000_series]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_LaserJet_8000.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 8000 Series Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=C3909A/C3909X
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=9
+support-released=True
+support-subtype=33f4
+support-type=2
+support-ver=0.9.5
+tech-class=LJMono,Postscript
+tech-subclass=Normal
+tech-type=3
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[officejet_pro_8000_enterprise_a811a]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=officejet_k550.png
+io-mfp-mode=3
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet Pro 8000 Enterprise A811a
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=2
+r0-agent1-sku=C4906A/C4902A
+r0-agent1-type=1
+r0-agent2-kind=2
+r0-agent2-sku=C4909A
+r0-agent2-type=6
+r0-agent3-kind=2
+r0-agent3-sku=C4908A
+r0-agent3-type=5
+r0-agent4-kind=2
+r0-agent4-sku=C4907A
+r0-agent4-type=4
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=10
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.11.3
+tech-class=Postscript
+tech-subclass=Normal
+tech-type=2
+usb-pid=5612
+usb-vid=3f0
+wifi-config=0
+
+[officejet_pro_8000_a809]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=officejet_k550.png
+io-mfp-mode=3
+io-mode=1
+io-support=14
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet Pro 8000 Printer - A809a
+model2=HP Officejet Pro 8000 Wireless Printer - A809n
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=2
+r0-agent1-sku=940 / 940XL
+r0-agent1-type=1
+r0-agent2-kind=2
+r0-agent2-sku=940
+r0-agent2-type=6
+r0-agent3-kind=2
+r0-agent3-sku=940
+r0-agent3-type=5
+r0-agent4-kind=2
+r0-agent4-sku=940
+r0-agent4-type=4
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.9.2
+tech-class=Corbett
+tech-subclass=Normal
+tech-type=2
+usb-pid=3612
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_8000]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_LaserJet_8000.png
+io-mfp-mode=6
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 8000 Printer
+model2=HP LaserJet 8000dn Printer
+model3=HP LaserJet 8000n Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=C3909A/C3909X
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=9
+support-released=True
+support-subtype=33f4
+support-type=2
+support-ver=0.9.5
+tech-class=LJMono
+tech-subclass=LargeFormatA3
+tech-type=3
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_8000_series]
+align-type=1
+clean-type=1
+color-cal-type=3
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=Photosmart_8050.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart 8030 Printer
+model2=HP Photosmart 8038 Printer
+model3=HP Photosmart 8049 Printer
+model4=HP Photosmart 8050xi Printer
+model5=HP Photosmart 8050 Printer
+model6=HP Photosmart 8050v Printer
+model7=HP Photosmart 8053 Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=98 (C9364WN)/96 (C8767WN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=95 (C8766WN)/97 (C9363WN)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=99 (C9369WN)
+r0-agent3-type=3
+r0-agent4-kind=3
+r0-agent4-sku=100 (C9368AN)
+r0-agent4-type=10
+r1-agent1-kind=3
+r1-agent1-sku=98 (C9364WN)/96 (C8767WN)
+r1-agent1-type=1
+r1-agent2-kind=3
+r1-agent2-sku=95 (C8766WN)/97 (C9363WN)
+r1-agent2-type=2
+r1-agent3-kind=3
+r1-agent3-sku=99 (C9369WN)
+r1-agent3-type=3
+r1-agent4-kind=3
+r1-agent4-sku=100 (C9368AN)
+r1-agent4-type=10
+r2-agent1-kind=3
+r2-agent1-sku=98 (C9364WN)/96 (C8767WN)
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=95 (C8766WN)/97 (C9363WN)
+r2-agent2-type=2
+r2-agent3-kind=3
+r2-agent3-sku=99 (C9369WN)
+r2-agent3-type=3
+r2-agent4-kind=3
+r2-agent4-sku=100 (C9368AN)
+r2-agent4-type=10
+r3-agent1-kind=3
+r3-agent1-sku=98 (C9364WN)/96 (C8767WN)
+r3-agent1-type=1
+r3-agent2-kind=3
+r3-agent2-sku=95 (C8766WN)/97 (C9363WN)
+r3-agent2-type=2
+r3-agent3-kind=3
+r3-agent3-sku=99 (C9369WN)
+r3-agent3-type=3
+r3-agent4-kind=3
+r3-agent4-sku=100 (C9368AN)
+r3-agent4-type=10
+r4-agent1-kind=3
+r4-agent1-sku=337 (C9364EN)/338 (C8765EN)
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=344 (C9363EN)/343 (C8766EN)
+r4-agent2-type=2
+r4-agent3-kind=3
+r4-agent3-sku=348 (C9369EN)
+r4-agent3-type=3
+r4-agent4-kind=3
+r4-agent4-sku=100 (C9368AN)
+r4-agent4-type=10
+r5-agent1-kind=3
+r5-agent1-sku=129 (C9364HN)/131 (C8765HN)
+r5-agent1-type=1
+r5-agent2-kind=3
+r5-agent2-sku=134 (C8766HN)/135 (C9363HN)
+r5-agent2-type=2
+r5-agent3-kind=3
+r5-agent3-sku=138 (C9369HN)
+r5-agent3-type=3
+r5-agent4-kind=3
+r5-agent4-sku=100 (C9368AN)
+r5-agent4-type=10
+r6-agent1-kind=3
+r6-agent1-sku=129 (C9364HN)/131 (C8765HN)
+r6-agent1-type=1
+r6-agent2-kind=3
+r6-agent2-sku=134 (C8766HN)/135 (C9363HN)
+r6-agent2-type=2
+r6-agent3-kind=3
+r6-agent3-sku=138 (C9369HN)
+r6-agent3-type=3
+r6-agent4-kind=3
+r6-agent4-sku=100 (C9368AN)
+r6-agent4-type=10
+r7-agent1-kind=3
+r7-agent1-sku=851 (C9364ZN)/852 (C8765ZN)
+r7-agent1-type=1
+r7-agent2-kind=3
+r7-agent2-sku=857 (C9363ZN)/855 (C8766ZN)
+r7-agent2-type=2
+r7-agent3-kind=3
+r7-agent3-sku=858 (C9369ZN)
+r7-agent3-type=3
+r7-agent4-kind=3
+r7-agent4-sku=100 (C9368AN)
+r7-agent4-type=10
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=c102
+usb-vid=3f0
+wifi-config=0
+
+[hp_cm8050_mfp_with_edgeline]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=HP_Color_LaserJet_4730mfp.png
+io-mfp-mode=3
+io-mode=3
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP CM8050 Color Multifunction Printer with Edgeline Technology
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=-2
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=1.7.4
+tech-class=Postscript
+tech-subclass=Normal
+tech-type=5
+usb-pid=7717
+usb-vid=3f0
+wifi-config=0
+
+[hp_cm8060_mfp_with_edgeline]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=HP_Color_LaserJet_4730mfp.png
+io-mfp-mode=3
+io-mode=3
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP CM8060 Color Multifunction Printer with Edgeline Technology
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=-2
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=1.7.4
+tech-class=Postscript
+tech-subclass=Normal
+tech-type=5
+usb-pid=7117
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_8100_mfp]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=HP_LaserJet_8100_Series.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 8100 Multifunction Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=C4128X
+r0-agent1-type=1
+scan-src=0
+scan-type=-2
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=LJMono
+tech-subclass=Normal
+tech-type=3
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[officejet_pro_8100]
+align-type=15
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=officejet_k550.png
+io-mfp-mode=1
+io-mode=1
+io-support=14
+job-storage=0
+linefeed-cal-type=0
+model1=HP OfficeJet Pro 8100 ePrinter-N811a
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=2
+r0-agent1-sku=950
+r0-agent1-type=1
+r0-agent2-kind=2
+r0-agent2-sku=951
+r0-agent2-type=4
+r0-agent3-kind=2
+r0-agent3-sku=951
+r0-agent3-type=5
+r0-agent4-kind=2
+r0-agent4-sku=951
+r0-agent4-type=6
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.11.10
+tech-class=Ampere
+tech-subclass=Normal
+tech-type=2
+usb-pid=5b12
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_c8100_series]
+align-type=1
+clean-type=1
+color-cal-type=4
+copy-type=3
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=Photosmart_3300_series.png
+io-mfp-mode=3
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart C8150 All-in-One Printer
+model2=HP Photosmart C8180 All-in-One Printer
+model3=HP Photosmart C8183 All-in-One Printer
+model4=HP Photosmart C8188 All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=2
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=2
+r0-agent1-sku=2
+r0-agent1-type=1
+r0-agent2-kind=2
+r0-agent2-sku=2
+r0-agent2-type=4
+r0-agent3-kind=2
+r0-agent3-sku=2
+r0-agent3-type=5
+r0-agent4-kind=2
+r0-agent4-sku=2
+r0-agent4-type=6
+r0-agent5-kind=2
+r0-agent5-sku=2
+r0-agent5-type=7
+r0-agent6-kind=2
+r0-agent6-sku=2
+r0-agent6-type=8
+r1-agent1-kind=2
+r1-agent1-sku=2
+r1-agent1-type=1
+r1-agent2-kind=2
+r1-agent2-sku=2
+r1-agent2-type=4
+r1-agent3-kind=2
+r1-agent3-sku=2
+r1-agent3-type=5
+r1-agent4-kind=2
+r1-agent4-sku=2
+r1-agent4-type=6
+r1-agent5-kind=2
+r1-agent5-sku=2
+r1-agent5-type=7
+r1-agent6-kind=2
+r1-agent6-sku=2
+r1-agent6-type=8
+r2-agent1-kind=2
+r2-agent1-sku=363
+r2-agent1-type=1
+r2-agent2-kind=2
+r2-agent2-sku=363
+r2-agent2-type=4
+r2-agent3-kind=2
+r2-agent3-sku=363
+r2-agent3-type=5
+r2-agent4-kind=2
+r2-agent4-sku=363
+r2-agent4-type=6
+r2-agent5-kind=2
+r2-agent5-sku=363
+r2-agent5-type=7
+r2-agent6-kind=2
+r2-agent6-sku=363
+r2-agent6-type=8
+r4-agent1-kind=2
+r4-agent1-sku=177
+r4-agent1-type=1
+r4-agent2-kind=2
+r4-agent2-sku=177
+r4-agent2-type=4
+r4-agent3-kind=2
+r4-agent3-sku=177
+r4-agent3-type=5
+r4-agent4-kind=2
+r4-agent4-sku=177
+r4-agent4-type=6
+r4-agent5-kind=2
+r4-agent5-sku=177
+r4-agent5-type=7
+r4-agent6-kind=2
+r4-agent6-sku=177
+r4-agent6-type=8
+r8-agent1-kind=2
+r8-agent1-sku=801
+r8-agent1-type=1
+r8-agent2-kind=2
+r8-agent2-sku=801
+r8-agent2-type=4
+r8-agent3-kind=2
+r8-agent3-sku=801
+r8-agent3-type=5
+r8-agent4-kind=2
+r8-agent4-sku=801
+r8-agent4-type=6
+r8-agent5-kind=2
+r8-agent5-sku=801
+r8-agent5-type=7
+r8-agent6-kind=2
+r8-agent6-sku=801
+r8-agent6-type=8
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.7.9
+tech-class=DJGenericVIP
+tech-subclass=NoEvenDuplex
+tech-type=2
+usb-pid=6411
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_8100_series]
+align-type=1
+clean-type=1
+color-cal-type=3
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=Photosmart_8100_series.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart 8150 Photo Printer
+model2=HP Photosmart 8150v Photo Printer
+model3=HP Photosmart 8150xi Photo Printer
+model4=HP Photosmart 8153 Photo Printer
+model5=HP Photosmart 8158 Photo Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=94 (C8765WN)/96 (C8767WN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=95 (C8766WN)/97 (C9363WN)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=99 (C9369WN)
+r0-agent3-type=3
+r0-agent4-kind=3
+r0-agent4-sku=100 (C9368AN)
+r0-agent4-type=10
+r1-agent1-kind=3
+r1-agent1-sku=94 (C8765WN)/96 (C8767WN)
+r1-agent1-type=1
+r1-agent2-kind=3
+r1-agent2-sku=95 (C8766WN)/97 (C9363WN)
+r1-agent2-type=2
+r1-agent3-kind=3
+r1-agent3-sku=99 (C9369WN)
+r1-agent3-type=3
+r1-agent4-kind=3
+r1-agent4-sku=100 (C9368AN)
+r1-agent4-type=10
+r2-agent1-kind=3
+r2-agent1-sku=94 (C8765WN)/96 (C8767WN)
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=95 (C8766WN)/97 (C9363WN)
+r2-agent2-type=2
+r2-agent3-kind=3
+r2-agent3-sku=99 (C9369WN)
+r2-agent3-type=3
+r2-agent4-kind=3
+r2-agent4-sku=100 (C9368AN)
+r2-agent4-type=10
+r3-agent1-kind=3
+r3-agent1-sku=94 (C8765WN)/96 (C8767WN)
+r3-agent1-type=1
+r3-agent2-kind=3
+r3-agent2-sku=95 (C8766WN)/97 (C9363WN)
+r3-agent2-type=2
+r3-agent3-kind=3
+r3-agent3-sku=99 (C9369WN)
+r3-agent3-type=3
+r3-agent4-kind=3
+r3-agent4-sku=100 (C9368AN)
+r3-agent4-type=10
+r4-agent1-kind=3
+r4-agent1-sku=339 (C8767EN)/338 (C8765EN)
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=344 (C9363EN)/343 (C8766EN)
+r4-agent2-type=2
+r4-agent3-kind=3
+r4-agent3-sku=348 (C9369EN)
+r4-agent3-type=3
+r4-agent4-kind=3
+r4-agent4-sku=100 (C9368AN)
+r4-agent4-type=10
+r5-agent1-kind=3
+r5-agent1-sku=130 (C8765HN)/131 (C8765HN)
+r5-agent1-type=1
+r5-agent2-kind=3
+r5-agent2-sku=134 (C8766HN)/135 (C9363HN)
+r5-agent2-type=2
+r5-agent3-kind=3
+r5-agent3-sku=138 (C9369HN)
+r5-agent3-type=3
+r5-agent4-kind=3
+r5-agent4-sku=100 (C9368AN)
+r5-agent4-type=10
+r6-agent1-kind=3
+r6-agent1-sku=130 (C8765HN)/131 (C8765HN)
+r6-agent1-type=1
+r6-agent2-kind=3
+r6-agent2-sku=134 (C8766HN)/135 (C9363HN)
+r6-agent2-type=2
+r6-agent3-kind=3
+r6-agent3-sku=138 (C9369HN)
+r6-agent3-type=3
+r6-agent4-kind=3
+r6-agent4-sku=100 (C9368AN)
+r6-agent4-type=10
+r7-agent1-kind=3
+r7-agent1-sku=853 (C8765ZN)/852 (C8765ZN)
+r7-agent1-type=1
+r7-agent2-kind=3
+r7-agent2-sku=857 (C9363ZN)/855 (C8766ZN)
+r7-agent2-type=2
+r7-agent3-kind=3
+r7-agent3-sku=858 (C9369ZN)
+r7-agent3-type=3
+r7-agent4-kind=3
+r7-agent4-sku=100 (C9368AN)
+r7-agent4-type=10
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=ba02
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_8100_series]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=HP_LaserJet_8100_Series.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 8100 Printer
+model2=HP LaserJet 8100dn Printer
+model3=HP LaserJet 8100n Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=C4128X
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=9
+support-released=True
+support-subtype=3636
+support-type=2
+support-ver=0.9.5
+tech-class=LJMono,Postscript
+tech-subclass=LargeFormatA3
+tech-type=3
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_8150_series]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=HP_LaserJet_8100_Series.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 8150 Printer
+model2=HP LaserJet 8150n Printer
+model3=HP LaserJet 8150hn Printer
+model4=HP LaserJet 8150dn Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=C4128X
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=9
+support-released=True
+support-subtype=3b71
+support-type=2
+support-ver=0.9.5
+tech-class=LJMono,Postscript
+tech-subclass=LargeFormatA3
+tech-type=3
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_8150_mfp]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=HP_LaserJet_8100_Series.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 8150 Multifunction Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=C4128X
+r0-agent1-type=1
+scan-src=0
+scan-type=-2
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=381c
+support-type=2
+support-ver=0.9.5
+tech-class=LJMono
+tech-subclass=Normal
+tech-type=3
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_8200_series]
+align-type=1
+clean-type=1
+color-cal-type=4
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=Photosmart_8250.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart 8230 Printer
+model2=HP Photosmart 8238 Printer
+model3=HP Photosmart 8250 Printer
+model4=HP Photosmart 8250xi Printer
+model5=HP Photosmart 8250v Printer
+model6=HP Photosmart 8253 Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=2
+r0-agent1-sku=02 (C9338W)
+r0-agent1-type=1
+r0-agent2-kind=2
+r0-agent2-sku=02 (C9339W)
+r0-agent2-type=4
+r0-agent3-kind=2
+r0-agent3-sku=02 (C9340W)
+r0-agent3-type=5
+r0-agent4-kind=2
+r0-agent4-sku=02 (C9341W)
+r0-agent4-type=6
+r0-agent5-kind=2
+r0-agent5-sku=02 (C8774W)
+r0-agent5-type=7
+r0-agent6-kind=2
+r0-agent6-sku=02 (C8775W)
+r0-agent6-type=8
+r1-agent1-kind=2
+r1-agent1-sku=02 (C9338W)
+r1-agent1-type=1
+r1-agent2-kind=2
+r1-agent2-sku=02 (C9339W)
+r1-agent2-type=4
+r1-agent3-kind=2
+r1-agent3-sku=02 (C9340W)
+r1-agent3-type=5
+r1-agent4-kind=2
+r1-agent4-sku=02 (C9341W)
+r1-agent4-type=6
+r1-agent5-kind=2
+r1-agent5-sku=02 (C8774W)
+r1-agent5-type=7
+r1-agent6-kind=2
+r1-agent6-sku=02 (C8775W)
+r1-agent6-type=8
+r2-agent1-kind=2
+r2-agent1-sku=02 (C9338W)
+r2-agent1-type=1
+r2-agent2-kind=2
+r2-agent2-sku=02 (C9339W)
+r2-agent2-type=4
+r2-agent3-kind=2
+r2-agent3-sku=02 (C9340W)
+r2-agent3-type=5
+r2-agent4-kind=2
+r2-agent4-sku=02 (C9341W)
+r2-agent4-type=6
+r2-agent5-kind=2
+r2-agent5-sku=02 (C8774W)
+r2-agent5-type=7
+r2-agent6-kind=2
+r2-agent6-sku=02 (C8775W)
+r2-agent6-type=8
+r3-agent1-kind=2
+r3-agent1-sku=02 (C9338W)
+r3-agent1-type=1
+r3-agent2-kind=2
+r3-agent2-sku=02 (C9339W)
+r3-agent2-type=4
+r3-agent3-kind=2
+r3-agent3-sku=02 (C9340W)
+r3-agent3-type=5
+r3-agent4-kind=2
+r3-agent4-sku=02 (C9341W)
+r3-agent4-type=6
+r3-agent5-kind=2
+r3-agent5-sku=02 (C8774W)
+r3-agent5-type=7
+r3-agent6-kind=2
+r3-agent6-sku=02 (C8775W)
+r3-agent6-type=8
+r4-agent1-kind=2
+r4-agent1-sku=363 (C9338E)
+r4-agent1-type=1
+r4-agent2-kind=2
+r4-agent2-sku=363 (C9339E)
+r4-agent2-type=4
+r4-agent3-kind=2
+r4-agent3-sku=363 (C9340E)
+r4-agent3-type=5
+r4-agent4-kind=2
+r4-agent4-sku=363 (C9341E)
+r4-agent4-type=6
+r4-agent5-kind=2
+r4-agent5-sku=363 (C8774E)
+r4-agent5-type=7
+r4-agent6-kind=2
+r4-agent6-sku=363 (C8775E)
+r4-agent6-type=8
+r5-agent1-kind=2
+r5-agent1-sku=177 (C9338H)
+r5-agent1-type=1
+r5-agent2-kind=2
+r5-agent2-sku=177 (C9339H)
+r5-agent2-type=4
+r5-agent3-kind=2
+r5-agent3-sku=177 (C9340H)
+r5-agent3-type=5
+r5-agent4-kind=2
+r5-agent4-sku=177 (C9341H)
+r5-agent4-type=6
+r5-agent5-kind=2
+r5-agent5-sku=177 (C8774H)
+r5-agent5-type=7
+r5-agent6-kind=2
+r5-agent6-sku=177 (C8775H)
+r5-agent6-type=8
+r6-agent1-kind=2
+r6-agent1-sku=177 (C9338H)
+r6-agent1-type=1
+r6-agent2-kind=2
+r6-agent2-sku=177 (C9339H)
+r6-agent2-type=4
+r6-agent3-kind=2
+r6-agent3-sku=177 (C9340H)
+r6-agent3-type=5
+r6-agent4-kind=2
+r6-agent4-sku=177 (C9341H)
+r6-agent4-type=6
+r6-agent5-kind=2
+r6-agent5-sku=177 (C8774H)
+r6-agent5-type=7
+r6-agent6-kind=2
+r6-agent6-sku=177 (C8775H)
+r6-agent6-type=8
+r7-agent1-kind=2
+r7-agent1-sku=801 (C9338Z)
+r7-agent1-type=1
+r7-agent2-kind=2
+r7-agent2-sku=801 (C9339Z)
+r7-agent2-type=4
+r7-agent3-kind=2
+r7-agent3-sku=801 (C9340Z)
+r7-agent3-type=5
+r7-agent4-kind=2
+r7-agent4-sku=801 (C9341Z)
+r7-agent4-type=6
+r7-agent5-kind=2
+r7-agent5-sku=801 (C8774Z)
+r7-agent5-type=7
+r7-agent6-kind=2
+r7-agent6-sku=801 (C8775Z)
+r7-agent6-type=8
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=2
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=c202
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_pro_b8300_series]
+align-type=1
+clean-type=1
+color-cal-type=3
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=Photosmart_Pro_B8300.png
+io-mfp-mode=3
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart Pro B8330 Printer
+model2=HP Photosmart Pro B8338 Printer
+model3=HP Photosmart Pro B8350 Printer
+model4=HP Photosmart Pro B8353 Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=94/96
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=95/97
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=99
+r0-agent3-type=3
+r0-agent4-kind=3
+r0-agent4-sku=100/102
+r0-agent4-type=10
+r10-agent1-kind=3
+r10-agent1-sku=852/853
+r10-agent1-type=1
+r10-agent2-kind=3
+r10-agent2-sku=855/857
+r10-agent2-type=2
+r10-agent3-kind=3
+r10-agent3-sku=858
+r10-agent3-type=3
+r10-agent4-kind=3
+r10-agent4-sku=100/102
+r10-agent4-type=10
+r2-agent1-kind=3
+r2-agent1-sku=94/96
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=95/97
+r2-agent2-type=2
+r2-agent3-kind=3
+r2-agent3-sku=99
+r2-agent3-type=3
+r2-agent4-kind=3
+r2-agent4-sku=100/102
+r2-agent4-type=10
+r4-agent1-kind=3
+r4-agent1-sku=338/339
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=343/344
+r4-agent2-type=2
+r4-agent3-kind=3
+r4-agent3-sku=348
+r4-agent3-type=3
+r4-agent4-kind=3
+r4-agent4-sku=100/102
+r4-agent4-type=10
+r8-agent1-kind=3
+r8-agent1-sku=130/131
+r8-agent1-type=1
+r8-agent2-kind=3
+r8-agent2-sku=135/134
+r8-agent2-type=2
+r8-agent3-kind=3
+r8-agent3-sku=138
+r8-agent3-type=3
+r8-agent4-kind=3
+r8-agent4-sku=100/102
+r8-agent4-type=10
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=1.6.9
+tech-class=Python
+tech-subclass=LargeFormatA3,NoAutoDuplex
+tech-type=2
+usb-pid=be02
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_8400_series]
+align-type=1
+clean-type=1
+color-cal-type=3
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=Photosmart_8400_series.png
+io-mfp-mode=6
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart 8450gp Photo Printer
+model2=HP Photosmart 8450v Photo Printer
+model3=HP Photosmart 8450 Photo Printer
+model4=HP Photosmart 8450xi Photo Printer
+model5=HP Photosmart 8453 Photo Printer
+model6=HP Photosmart 8458 Photo Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=94 (C8765WN)/96 (C8767WN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=95 (C8766WN)/97 (C9363WN)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=99 (C9369WN)
+r0-agent3-type=3
+r0-agent4-kind=3
+r0-agent4-sku=100 (C9368AN)
+r0-agent4-type=10
+r1-agent1-kind=3
+r1-agent1-sku=94 (C8765WN)/96 (C8767WN)
+r1-agent1-type=1
+r1-agent2-kind=3
+r1-agent2-sku=95 (C8766WN)/97 (C9363WN)
+r1-agent2-type=2
+r1-agent3-kind=3
+r1-agent3-sku=99 (C9369WN)
+r1-agent3-type=3
+r1-agent4-kind=3
+r1-agent4-sku=100 (C9368AN)
+r1-agent4-type=10
+r2-agent1-kind=3
+r2-agent1-sku=94 (C8765WN)/96 (C8767WN)
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=95 (C8766WN)/97 (C9363WN)
+r2-agent2-type=2
+r2-agent3-kind=3
+r2-agent3-sku=99 (C9369WN)
+r2-agent3-type=3
+r2-agent4-kind=3
+r2-agent4-sku=100 (C9368AN)
+r2-agent4-type=10
+r3-agent1-kind=3
+r3-agent1-sku=94 (C8765WN)/96 (C8767WN)
+r3-agent1-type=1
+r3-agent2-kind=3
+r3-agent2-sku=95 (C8766WN)/97 (C9363WN)
+r3-agent2-type=2
+r3-agent3-kind=3
+r3-agent3-sku=99 (C9369WN)
+r3-agent3-type=3
+r3-agent4-kind=3
+r3-agent4-sku=100 (C9368AN)
+r3-agent4-type=10
+r4-agent1-kind=3
+r4-agent1-sku=339 (C8767EN)/338 (C8765EN)
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=344 (C9363EN)/343 (C8766EN)
+r4-agent2-type=2
+r4-agent3-kind=3
+r4-agent3-sku=348 (C9369EN)
+r4-agent3-type=3
+r4-agent4-kind=3
+r4-agent4-sku=100 (C9368AN)
+r4-agent4-type=10
+r5-agent1-kind=3
+r5-agent1-sku=130 (C8765HN)/131 (C8765HN)
+r5-agent1-type=1
+r5-agent2-kind=3
+r5-agent2-sku=134 (C8766HN)/135 (C9363HN)
+r5-agent2-type=2
+r5-agent3-kind=3
+r5-agent3-sku=138 (C9369HN)
+r5-agent3-type=3
+r5-agent4-kind=3
+r5-agent4-sku=100 (C9368AN)
+r5-agent4-type=10
+r6-agent1-kind=3
+r6-agent1-sku=130 (C8765HN)/131 (C8765HN)
+r6-agent1-type=1
+r6-agent2-kind=3
+r6-agent2-sku=134 (C8766HN)/135 (C9363HN)
+r6-agent2-type=2
+r6-agent3-kind=3
+r6-agent3-sku=138 (C9369HN)
+r6-agent3-type=3
+r6-agent4-kind=3
+r6-agent4-sku=100 (C9368AN)
+r6-agent4-type=10
+r7-agent1-kind=3
+r7-agent1-sku=853 (C8765ZN)/852 (C8765ZN)
+r7-agent1-type=1
+r7-agent2-kind=3
+r7-agent2-sku=857 (C9363ZN)/855 (C8766ZN)
+r7-agent2-type=2
+r7-agent3-kind=3
+r7-agent3-sku=858 (C9369ZN)
+r7-agent3-type=3
+r7-agent4-kind=3
+r7-agent4-sku=100 (C9368AN)
+r7-agent4-type=10
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJGenericVIP
+tech-subclass=Normal
+tech-type=2
+usb-pid=bb02
+usb-vid=3f0
+wifi-config=0
+
+[officejet_pro_8500_a909g]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=1
+fw-download=False
+icon=officejet_k550.png
+io-mfp-mode=3
+io-mode=1
+io-support=14
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet Pro 8500 Wireless All-in-One Printer - A909g
+monitor-type=0
+panel-check-type=1
+pcard-type=2
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=2
+r0-agent1-sku=940 / 940XL
+r0-agent1-type=1
+r0-agent2-kind=2
+r0-agent2-sku=940
+r0-agent2-type=6
+r0-agent3-kind=2
+r0-agent3-sku=940
+r0-agent3-type=5
+r0-agent4-kind=2
+r0-agent4-sku=940
+r0-agent4-type=4
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.9.2
+tech-class=Corbett
+tech-subclass=Normal
+tech-type=2
+usb-pid=3912
+usb-vid=3f0
+wifi-config=0
+
+[officejet_pro_8500_a909a]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=1
+fw-download=False
+icon=officejet_k550.png
+io-mfp-mode=3
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet Pro 8500 All-in-One Printer - A909a
+monitor-type=0
+panel-check-type=1
+pcard-type=2
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=2
+r0-agent1-sku=940 / 940XL
+r0-agent1-type=1
+r0-agent2-kind=2
+r0-agent2-sku=940
+r0-agent2-type=6
+r0-agent3-kind=2
+r0-agent3-sku=940
+r0-agent3-type=5
+r0-agent4-kind=2
+r0-agent4-sku=940
+r0-agent4-type=4
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.9.2
+tech-class=Corbett
+tech-subclass=Normal
+tech-type=2
+usb-pid=3812
+usb-vid=3f0
+wifi-config=0
+
+[officejet_pro_8500_a909n]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=1
+fw-download=False
+icon=officejet_k550.png
+io-mfp-mode=3
+io-mode=1
+io-support=14
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet Pro 8500 Premier All-in-One Printer - A909n
+monitor-type=0
+panel-check-type=1
+pcard-type=2
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=2
+r0-agent1-sku=940 / 940XL
+r0-agent1-type=1
+r0-agent2-kind=2
+r0-agent2-sku=940
+r0-agent2-type=6
+r0-agent3-kind=2
+r0-agent3-sku=940
+r0-agent3-type=5
+r0-agent4-kind=2
+r0-agent4-sku=940
+r0-agent4-type=4
+scan-src=1
+scan-type=6
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.9.2
+tech-class=Corbett
+tech-subclass=Normal
+tech-type=2
+usb-pid=4012
+usb-vid=3f0
+wifi-config=0
+
+[hp_color_laserjet_8500]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=HP_Color_LaserJet_8550.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Color LaserJet 8500 Printer
+model2=HP Color LaserJet 8500n Printer
+model3=HP Color LaserJet 8500dn Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=49 (C4149A)
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=50 (C4150A)
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=51 (C4151A)
+r0-agent3-type=5
+r0-agent4-kind=4
+r0-agent4-sku=52 (C4152A)
+r0-agent4-type=6
+r0-agent5-kind=7
+r0-agent5-sku=53 (C4153A)
+r0-agent5-type=62
+r0-agent6-kind=8
+r0-agent6-sku=54 (C4154A)
+r0-agent6-type=62
+r0-agent7-kind=5
+r0-agent7-sku=55 (C4155A)
+r0-agent7-type=62
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=32e3
+support-type=2
+support-ver=0.9.5
+tech-class=LJColor,Postscript
+tech-subclass=LargeFormatA3
+tech-type=4
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_b8500_series]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=hp_photosmart_b8500_series.png
+io-mfp-mode=3
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart B8550 Photo Printer
+model2=HP Photosmart B8553 Photo Printer
+model3=HP Photosmart B8558 Photo Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=2
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=2
+r0-agent1-sku=564/564XL
+r0-agent1-type=1
+r0-agent2-kind=2
+r0-agent2-sku=564/564XL
+r0-agent2-type=4
+r0-agent3-kind=2
+r0-agent3-sku=564/564XL
+r0-agent3-type=5
+r0-agent4-kind=2
+r0-agent4-sku=564/564XL
+r0-agent4-type=6
+r0-agent5-kind=2
+r0-agent5-sku=564/564XL
+r0-agent5-type=16
+r10-agent1-kind=2
+r10-agent1-sku=862/862XL
+r10-agent1-type=1
+r10-agent2-kind=2
+r10-agent2-sku=862/862XL
+r10-agent2-type=4
+r10-agent3-kind=2
+r10-agent3-sku=862/862XL
+r10-agent3-type=5
+r10-agent4-kind=2
+r10-agent4-sku=862/862XL
+r10-agent4-type=6
+r10-agent5-kind=2
+r10-agent5-sku=862/862XL
+r10-agent5-type=16
+r2-agent1-kind=2
+r2-agent1-sku=564/564XL
+r2-agent1-type=1
+r2-agent2-kind=2
+r2-agent2-sku=564/564XL
+r2-agent2-type=4
+r2-agent3-kind=2
+r2-agent3-sku=564/564XL
+r2-agent3-type=5
+r2-agent4-kind=2
+r2-agent4-sku=564/564XL
+r2-agent4-type=6
+r2-agent5-kind=2
+r2-agent5-sku=564/564XL
+r2-agent5-type=16
+r4-agent1-kind=2
+r4-agent1-sku=364/364XL
+r4-agent1-type=1
+r4-agent2-kind=2
+r4-agent2-sku=364/364XL
+r4-agent2-type=4
+r4-agent3-kind=2
+r4-agent3-sku=364/364XL
+r4-agent3-type=5
+r4-agent4-kind=2
+r4-agent4-sku=364/534XL
+r4-agent4-type=6
+r4-agent5-kind=2
+r4-agent5-sku=364/364XL
+r4-agent5-type=16
+r8-agent1-kind=2
+r8-agent1-sku=178/178XL
+r8-agent1-type=1
+r8-agent2-kind=2
+r8-agent2-sku=178/178XL
+r8-agent2-type=4
+r8-agent3-kind=2
+r8-agent3-sku=178/178XL
+r8-agent3-type=5
+r8-agent4-kind=2
+r8-agent4-sku=178/178XL
+r8-agent4-type=6
+r8-agent5-kind=2
+r8-agent5-sku=178/178XL
+r8-agent5-type=16
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.8.10
+tech-class=Python
+tech-subclass=LargeFormatA3,NoAutoDuplex
+tech-type=2
+usb-pid=d102
+usb-vid=3f0
+wifi-config=0
+
+[officejet_pro_8500_a910]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=6
+fw-download=False
+icon=officejet_k550.png
+io-mfp-mode=1
+io-mode=1
+io-support=14
+job-storage=0
+linefeed-cal-type=0
+model1=HP OfficeJet Pro 8500A Plus e-AiO Printer - A910g
+model2=HP OfficeJet Pro 8500A Premium e-AiO Printer - A910n
+model3=HP OfficeJet Pro 8500A e-AiO Printer - A910a
+monitor-type=0
+panel-check-type=1
+pcard-type=2
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=2
+r0-agent1-sku=940 / 940XL
+r0-agent1-type=1
+r0-agent2-kind=2
+r0-agent2-sku=940
+r0-agent2-type=6
+r0-agent3-kind=2
+r0-agent3-sku=940
+r0-agent3-type=5
+r0-agent4-kind=2
+r0-agent4-sku=940
+r0-agent4-type=4
+scan-src=3
+scan-type=7
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.10.9
+tech-class=Corbett
+tech-subclass=Normal
+tech-type=2
+usb-pid=5312
+usb-vid=3f0
+wifi-config=3
+
+[hp_color_laserjet_8550]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=HP_Color_LaserJet_8550.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Color LaserJet 8550dn Printer
+model2=HP Color LaserJet 8550gn Printer
+model3=HP Color LaserJet 8550mn Printer
+model4=HP Color LaserJet 8550 Multifunction Printer
+model5=HP Color LaserJet 8550mfp-dlvry/unpkging
+model6=HP Color LaserJet 8550 Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=49 (C4149A)
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=50 (C4150A)
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=51 (C4151A)
+r0-agent3-type=5
+r0-agent4-kind=4
+r0-agent4-sku=52 (C4152A)
+r0-agent4-type=6
+r0-agent5-kind=7
+r0-agent5-sku=53 (C4153A)
+r0-agent5-type=62
+r0-agent6-kind=8
+r0-agent6-sku=54 (C4154A)
+r0-agent6-type=62
+r0-agent7-kind=5
+r0-agent7-sku=55 (C4155A)
+r0-agent7-type=62
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=LJColor,Postscript
+tech-subclass=LargeFormatA3
+tech-type=4
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[officejet_pro_k8600]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=officejet_k550.png
+io-mfp-mode=3
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=2
+model1=Officejet Pro K8600 Color Printer
+model2=Officejet Pro K8600dn Color Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=2
+r-type=0
+r0-agent1-kind=1
+r0-agent1-sku=88 (C9381)
+r0-agent1-type=14
+r0-agent2-kind=1
+r0-agent2-sku=88 (C9382)
+r0-agent2-type=15
+r0-agent3-kind=2
+r0-agent3-sku=88 (C9396 ) / 88L (C9385)
+r0-agent3-type=1
+r0-agent4-kind=2
+r0-agent4-sku=88 (C9388) / 88L (C9393)
+r0-agent4-type=6
+r0-agent5-kind=2
+r0-agent5-sku=88 (C9387) / 88L (C9392)
+r0-agent5-type=5
+r0-agent6-kind=2
+r0-agent6-sku=88 (C9386) / 88L (C9391)
+r0-agent6-type=4
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.7.10
+tech-class=DJGenericVIP
+tech-subclass=LargeFormatSuperB,NoFullBleed
+tech-type=2
+usb-pid=2712
+usb-vid=3f0
+wifi-config=0
+
+[officejet_pro_8600]
+align-type=0
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=6
+fw-download=False
+icon=officejet_k550.png
+io-mfp-mode=1
+io-mode=1
+io-support=14
+job-storage=0
+linefeed-cal-type=0
+model1=HP OfficeJet Pro 8600 e-AiO N911a
+model2=HP OfficeJet Pro 8600 Plus e-AiO N911g
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=2
+r0-agent1-sku=950
+r0-agent1-type=1
+r0-agent2-kind=2
+r0-agent2-sku=951
+r0-agent2-type=4
+r0-agent3-kind=2
+r0-agent3-sku=951
+r0-agent3-type=5
+r0-agent4-kind=2
+r0-agent4-sku=951
+r0-agent4-type=6
+r0-agent5-kind=2
+scan-src=3
+scan-type=7
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.11.10
+tech-class=Ampere
+tech-subclass=Normal
+tech-type=2
+usb-pid=5912
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_8700_series]
+align-type=1
+clean-type=1
+color-cal-type=3
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=Photosmart_8750_series.png
+io-mfp-mode=6
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart 8750 Professional Photo Printer
+model2=HP Photosmart 8750xi Professional Photo Printer
+model3=HP Photosmart 8750gp Professional Photo Printer
+model4=HP Photosmart 8753 Professional Photo Printer
+model5=HP Photosmart 8758 Professional Photo Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=94 (C8765WN)/96 (C8767WN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=95 (C8766WN)/97 (C9363WN)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=99 (C9369WN)
+r0-agent3-type=3
+r0-agent4-kind=3
+r0-agent4-sku=102
+r0-agent4-type=10
+r0-agent5-kind=3
+r0-agent5-sku=101
+r0-agent5-type=11
+r1-agent1-kind=3
+r1-agent1-sku=94 (C8765WN)/96 (C8767WN)
+r1-agent1-type=1
+r1-agent2-kind=3
+r1-agent2-sku=95 (C8766WN)/97 (C9363WN)
+r1-agent2-type=2
+r1-agent3-kind=3
+r1-agent3-sku=99 (C9369WN)
+r1-agent3-type=3
+r1-agent4-kind=3
+r1-agent4-sku=102
+r1-agent4-type=10
+r1-agent5-kind=3
+r1-agent5-sku=101
+r1-agent5-type=11
+r2-agent1-kind=3
+r2-agent1-sku=94 (C8765WN)/96 (C8767WN)
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=95 (C8766WN)/97 (C9363WN)
+r2-agent2-type=2
+r2-agent3-kind=3
+r2-agent3-sku=99 (C9369WN)
+r2-agent3-type=3
+r2-agent4-kind=3
+r2-agent4-sku=102
+r2-agent4-type=10
+r2-agent5-kind=3
+r2-agent5-sku=101
+r2-agent5-type=11
+r3-agent1-kind=3
+r3-agent1-sku=94 (C8765WN)/96 (C8767WN)
+r3-agent1-type=1
+r3-agent2-kind=3
+r3-agent2-sku=95 (C8766WN)/97 (C9363WN)
+r3-agent2-type=2
+r3-agent3-kind=3
+r3-agent3-sku=99 (C9369WN)
+r3-agent3-type=3
+r3-agent4-kind=3
+r3-agent4-sku=102
+r3-agent4-type=10
+r3-agent5-kind=3
+r3-agent5-sku=101
+r3-agent5-type=11
+r4-agent1-kind=3
+r4-agent1-sku=339 (C8767EN)/338 (C8765EN)
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=344 (C9363EN)/343 (C8766EN)
+r4-agent2-type=2
+r4-agent3-kind=3
+r4-agent3-sku=348 (C9369EN)
+r4-agent3-type=3
+r4-agent4-kind=3
+r4-agent4-sku=102
+r4-agent4-type=10
+r4-agent5-kind=3
+r4-agent5-sku=101
+r4-agent5-type=11
+r5-agent1-kind=3
+r5-agent1-sku=130 (C8765HN)/131 (C8765HN)
+r5-agent1-type=1
+r5-agent2-kind=3
+r5-agent2-sku=134 (C8766HN)/135 (C9363HN)
+r5-agent2-type=2
+r5-agent3-kind=3
+r5-agent3-sku=138 (C9369HN)
+r5-agent3-type=3
+r5-agent4-kind=3
+r5-agent4-sku=102
+r5-agent4-type=10
+r5-agent5-kind=3
+r5-agent5-sku=101
+r5-agent5-type=11
+r6-agent1-kind=3
+r6-agent1-sku=130 (C8765HN)/131 (C8765HN)
+r6-agent1-type=1
+r6-agent2-kind=3
+r6-agent2-sku=134 (C8766HN)/135 (C9363HN)
+r6-agent2-type=2
+r6-agent3-kind=3
+r6-agent3-sku=138 (C9369HN)
+r6-agent3-type=3
+r6-agent4-kind=3
+r6-agent4-sku=102
+r6-agent4-type=10
+r6-agent5-kind=3
+r6-agent5-sku=101
+r6-agent5-type=11
+r7-agent1-kind=3
+r7-agent1-sku=853 (C8765ZN)/852 (C8765ZN)
+r7-agent1-type=1
+r7-agent2-kind=3
+r7-agent2-sku=857 (C9363ZN)/855 (C8766ZN)
+r7-agent2-type=2
+r7-agent3-kind=3
+r7-agent3-sku=858 (C9369ZN)
+r7-agent3-type=3
+r7-agent4-kind=3
+r7-agent4-sku=102
+r7-agent4-type=10
+r7-agent5-kind=3
+r7-agent5-sku=101
+r7-agent5-type=11
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJGenericVIP
+tech-subclass=LargeFormatSuperB,NoAutoTray
+tech-type=2
+usb-pid=bc02
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_pro_b8800_series]
+align-type=1
+clean-type=1
+color-cal-type=7
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=Photosmart_Pro_B9180.png
+io-mfp-mode=4
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart Pro B8850 Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=1
+r0-agent1-sku=HP 70 (C9407A)
+r0-agent1-type=16
+r0-agent10-kind=2
+r0-agent10-sku=HP 38 (C9417A)
+r0-agent10-type=6
+r0-agent11-kind=2
+r0-agent11-sku=HP 38 (C9418A)
+r0-agent11-type=7
+r0-agent12-kind=2
+r0-agent12-sku=HP 38 (C9419A)
+r0-agent12-type=8
+r0-agent2-kind=1
+r0-agent2-sku=HP 70 (C9406A)
+r0-agent2-type=14
+r0-agent3-kind=1
+r0-agent3-sku=HP 70 (C9405A)
+r0-agent3-type=13
+r0-agent4-kind=1
+r0-agent4-sku=HP 70 (C9404A)
+r0-agent4-type=15
+r0-agent5-kind=2
+r0-agent5-sku=HP 38 (C9412A)
+r0-agent5-type=39
+r0-agent6-kind=2
+r0-agent6-sku=HP 38 (C9413A)
+r0-agent6-type=19
+r0-agent7-kind=2
+r0-agent7-sku=HP 38 (C9414A)
+r0-agent7-type=17
+r0-agent8-kind=2
+r0-agent8-sku=HP 38 (C9415A)
+r0-agent8-type=4
+r0-agent9-kind=2
+r0-agent9-sku=HP 38 (C9416A)
+r0-agent9-type=5
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.8.4
+tech-class=Python
+tech-subclass=LargeFormatA3,NoAutoDuplex,Advanced
+tech-type=2
+usb-pid=d002
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_9000_series]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=HP_LaserJet_9000_MFP.png
+io-mfp-mode=6
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 9000 Printer
+model2=HP LaserJet 9000n Printer
+model3=HP LaserJet 9000dn Printer
+model4=HP LaserJet 9000hns Printer
+model5=HP LaserJet 9000hnf Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=C8543X
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=9
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=LJMono,Postscript
+tech-subclass=LargeFormatA3
+tech-type=3
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_9000_mfp]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=HP_LaserJet_9000_MFP.png
+io-mfp-mode=6
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 9000 Multifunction Printer
+model2=HP LaserJet 9000L Multifunction Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=C8543X
+r0-agent1-type=1
+scan-src=0
+scan-type=-2
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=3b33
+support-type=2
+support-ver=0.9.5
+tech-class=LJMono,Postscript
+tech-subclass=LargeFormatA3
+tech-type=3
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_9040_mfp]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=1
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=HP_LaserJet_9000_MFP.png
+io-mfp-mode=6
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 9040n Printer
+model2=HP LaserJet 9040dn Printer
+model3=HP LaserJet 9040 Multifunction Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=C8543X
+r0-agent1-type=1
+scan-src=0
+scan-type=-2
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=LJMono,Postscript
+tech-subclass=LargeFormatA3
+tech-type=3
+usb-pid=8417
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_9040]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=HP_LaserJet_9000_MFP.png
+io-mfp-mode=6
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 9040 Printer
+model2=HP LaserJet 9040n Printer
+model3=HP LaserJet 9040dn Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=C8543X
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=LJMono,Postscript
+tech-subclass=LargeFormatA3
+tech-type=3
+usb-pid=2017
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_m9040_mfp]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=HP_LaserJet_9000_MFP.png
+io-mfp-mode=6
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet M9040 Multifunction Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=C8543X
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.8.5
+tech-class=LJMono,Postscript
+tech-subclass=Normal
+tech-type=3
+usb-pid=8417
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_9050]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=HP_LaserJet_9000_MFP.png
+io-mfp-mode=6
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 9050 Printer
+model2=HP LaserJet 9050n Printer
+model3=HP LaserJet 9050dn Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=C8543X
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=9
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=LJMono,Postscript
+tech-subclass=LargeFormatA3
+tech-type=3
+usb-pid=2017
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_9050_mfp]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=1
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=HP_LaserJet_9000_MFP.png
+io-mfp-mode=6
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 9050 Multifunction Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=C8543X
+r0-agent1-type=1
+scan-src=0
+scan-type=-2
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=3fca
+support-type=2
+support-ver=0.9.5
+tech-class=LJMono,Postscript
+tech-subclass=LargeFormatA3
+tech-type=3
+usb-pid=2117
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_m9050_mfp]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=HP_LaserJet_9000_MFP.png
+io-mfp-mode=6
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet M9050 Multifunction Printer
+model2=HP LaserJet M9059 Multifunction Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=C8543X
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=2.8.5
+tech-class=LJMono,Postscript
+tech-subclass=Normal
+tech-type=3
+usb-pid=8317
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_9055mfp]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=1
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=HP_LaserJet_9000_MFP.png
+io-mfp-mode=6
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 9055 Multifunction Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=C8543X
+r0-agent1-type=1
+scan-src=0
+scan-type=-2
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=3ad8
+support-type=2
+support-ver=0.9.5
+tech-class=LJMono,Postscript
+tech-subclass=LargeFormatA3
+tech-type=3
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_m9059_mfp]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=HP_LaserJet_9000_MFP.png
+io-mfp-mode=6
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet M9059 MFP
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=CE266C
+r0-agent1-type=1
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=3.9.6
+tech-class=LJMono,Postscript
+tech-subclass=Normal
+tech-type=3
+usb-pid=9617
+usb-vid=3f0
+wifi-config=0
+
+[hp_laserjet_9065mfp]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=1
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=HP_LaserJet_9000_MFP.png
+io-mfp-mode=6
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP LaserJet 9065 Multifunction Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=C8543X
+r0-agent1-type=1
+scan-src=0
+scan-type=-2
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=3ad8
+support-type=2
+support-ver=0.9.5
+tech-class=LJMono,Postscript
+tech-subclass=LargeFormatA3
+tech-type=3
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[officejet_9100_series]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=Officejet_9100_series.png
+io-mfp-mode=6
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Officejet 9110 All-in-One Printer
+model2=HP Officejet 9120 All-in-One Printer
+model3=HP Officejet 9130 All-in-One Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=1
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=1
+r0-agent1-sku=11 (C4810A)
+r0-agent1-type=1
+r0-agent2-kind=1
+r0-agent2-sku=11 (C4811A)
+r0-agent2-type=4
+r0-agent3-kind=1
+r0-agent3-sku=11 (C4812A)
+r0-agent3-type=5
+r0-agent4-kind=1
+r0-agent4-sku=11 (C4813A)
+r0-agent4-type=6
+r0-agent5-kind=2
+r0-agent5-sku=10 (C4844A)
+r0-agent5-type=1
+r0-agent6-kind=2
+r0-agent6-sku=11 (C4836AN)
+r0-agent6-type=4
+r0-agent7-kind=2
+r0-agent7-sku=11 (C4837AN)
+r0-agent7-type=5
+r0-agent8-kind=2
+r0-agent8-sku=11 (C4838AN)
+r0-agent8-type=6
+scan-src=1
+scan-type=1
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=3e17
+support-type=2
+support-ver=0.9.5
+tech-class=LJColor,Postscript
+tech-subclass=Normal
+tech-type=2
+usb-pid=d12
+usb-vid=3f0
+wifi-config=0
+
+[photosmart_pro_b9100_series]
+align-type=1
+clean-type=1
+color-cal-type=3
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=Photosmart_Pro_B9180.png
+io-mfp-mode=4
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Photosmart Pro B9180gp Photo Printer
+model2=HP Photosmart Pro B9180 Photo Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=1
+r0-agent1-sku=C9407A
+r0-agent1-type=16
+r0-agent10-kind=2
+r0-agent10-sku=C9417A
+r0-agent10-type=6
+r0-agent11-kind=2
+r0-agent11-sku=C9418A
+r0-agent11-type=7
+r0-agent12-kind=2
+r0-agent12-sku=C9419A
+r0-agent12-type=8
+r0-agent2-kind=1
+r0-agent2-sku=C9406A
+r0-agent2-type=14
+r0-agent3-kind=1
+r0-agent3-sku=C9405A
+r0-agent3-type=13
+r0-agent4-kind=1
+r0-agent4-sku=C9404A
+r0-agent4-type=15
+r0-agent5-kind=2
+r0-agent5-sku=C9412A
+r0-agent5-type=1
+r0-agent6-kind=2
+r0-agent6-sku=C9413A
+r0-agent6-type=19
+r0-agent7-kind=2
+r0-agent7-sku=C9414A
+r0-agent7-type=17
+r0-agent8-kind=2
+r0-agent8-sku=C9415A
+r0-agent8-type=4
+r0-agent9-kind=2
+r0-agent9-sku=C9416A
+r0-agent9-type=5
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=bd02
+usb-vid=3f0
+wifi-config=0
+
+[hp_deskjet_9300]
+align-type=1
+clean-type=1
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=hp_deskjet_9300.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 9300 Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=45 (51645A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=78 (C6578AN / C6578DN)
+r0-agent2-type=2
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=37e7
+support-type=2
+support-ver=0.9.5
+tech-class=DJ9xx
+tech-subclass=LargeFormatSuperB
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+[hp_color_laserjet_9500]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_color_LaserJet_9500.png
+io-mfp-mode=6
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Color LaserJet 9500n Printer
+model2=HP Color LaserJet 9500hdn Printer
+model3=HP Color LaserJet 9500gp Printer
+model4=HP Color LaserJet 9500 Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=50 (C8550A)
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=51 (C8551A)
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=53 (C8553A)
+r0-agent3-type=5
+r0-agent4-kind=4
+r0-agent4-sku=52 (C8552A)
+r0-agent4-type=6
+r0-agent5-kind=7
+r0-agent5-sku=60 (C8560A)
+r0-agent5-type=1
+r0-agent6-kind=7
+r0-agent6-sku=61 (C8561A)
+r0-agent6-type=4
+r0-agent7-kind=7
+r0-agent7-sku=63 (C8563A)
+r0-agent7-type=5
+r0-agent8-kind=7
+r0-agent8-sku=62 (C8562A)
+r0-agent8-type=6
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=40ac
+support-type=2
+support-ver=0.9.5
+tech-class=LJColor,Postscript
+tech-subclass=LargeFormatA3
+tech-type=4
+usb-pid=2217
+usb-vid=3f0
+wifi-config=0
+
+[hp_color_laserjet_9500_mfp]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=1
+fax-type=0
+fw-download=False
+icon=hp_color_LaserJet_9500.png
+io-mfp-mode=6
+io-mode=1
+io-support=6
+job-storage=0
+linefeed-cal-type=0
+model1=HP Color LaserJet 9500 Multifunction Printer
+monitor-type=0
+panel-check-type=1
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=4
+r0-agent1-sku=50 (C8550A)
+r0-agent1-type=1
+r0-agent2-kind=4
+r0-agent2-sku=51 (C8551A)
+r0-agent2-type=4
+r0-agent3-kind=4
+r0-agent3-sku=53 (C8553A)
+r0-agent3-type=5
+r0-agent4-kind=4
+r0-agent4-sku=52 (C8552A)
+r0-agent4-type=6
+r0-agent5-kind=7
+r0-agent5-sku=60 (C8560A)
+r0-agent5-type=1
+r0-agent6-kind=7
+r0-agent6-sku=61 (C8561A)
+r0-agent6-type=4
+r0-agent7-kind=7
+r0-agent7-sku=63 (C8563A)
+r0-agent7-type=5
+r0-agent8-kind=7
+r0-agent8-sku=62 (C8562A)
+r0-agent8-type=6
+scan-src=0
+scan-type=-2
+status-battery-check=0
+status-dynamic-counters=0
+status-type=3
+support-released=True
+support-subtype=3e0f
+support-type=2
+support-ver=0.9.5
+tech-class=LJColor,Postscript
+tech-subclass=LargeFormatA3
+tech-type=4
+usb-pid=2217
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_9600]
+align-type=1
+clean-type=1
+color-cal-type=3
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=DESKJET_9600.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 9650 Printer
+model2=HP Deskjet 9670 Printer
+model3=HP Deskjet 9680 Printer
+model4=HP Deskjet 9680gp Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+r0-agent1-kind=3
+r0-agent1-sku=56 (C6656A)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=57 (C6657A)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=58 (C6658A)
+r0-agent3-type=3
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=2
+support-released=True
+support-subtype=219b2b
+support-type=2
+support-ver=0.9.5
+tech-class=DJGenericVIP
+tech-subclass=LargeFormatSuperB
+tech-type=2
+usb-pid=b12
+usb-vid=3f0
+wifi-config=0
+
+[deskjet_9800]
+align-type=1
+clean-type=1
+color-cal-type=3
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=DESKJET_9600.png
+io-mfp-mode=6
+io-mode=1
+io-support=2
+job-storage=0
+linefeed-cal-type=0
+model1=HP Deskjet 9800 Printer
+model2=HP Deskjet 9800d Printer
+model3=HP Deskjet 9803 Printer
+model4=HP Deskjet 9803d Printer
+model5=HP Deskjet 9808 Printer
+model6=HP Deskjet 9808d Printer
+model7=HP Deskjet 9860 Printer
+model8=HP Deskjet 9868 Printer
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=1
+r0-agent1-kind=3
+r0-agent1-sku=94 (C8765WN)/96 (C8767WN)
+r0-agent1-type=1
+r0-agent2-kind=3
+r0-agent2-sku=95 (C8766WN)/97 (C9363WN)
+r0-agent2-type=2
+r0-agent3-kind=3
+r0-agent3-sku=99 (C9369WN)
+r0-agent3-type=3
+r0-agent4-kind=3
+r0-agent4-sku=100 (C9368AN)
+r0-agent4-type=10
+r1-agent1-kind=3
+r1-agent1-sku=94 (C8765WN)/96 (C8767WN)
+r1-agent1-type=1
+r1-agent2-kind=3
+r1-agent2-sku=95 (C8766WN)/97 (C9363WN)
+r1-agent2-type=2
+r1-agent3-kind=3
+r1-agent3-sku=99 (C9369WN)
+r1-agent3-type=3
+r1-agent4-kind=3
+r1-agent4-sku=100 (C9368AN)
+r1-agent4-type=10
+r2-agent1-kind=3
+r2-agent1-sku=94 (C8765WN)/96 (C8767WN)
+r2-agent1-type=1
+r2-agent2-kind=3
+r2-agent2-sku=95 (C8766WN)/97 (C9363WN)
+r2-agent2-type=2
+r2-agent3-kind=3
+r2-agent3-sku=99 (C9369WN)
+r2-agent3-type=3
+r2-agent4-kind=3
+r2-agent4-sku=100 (C9368AN)
+r2-agent4-type=10
+r3-agent1-kind=3
+r3-agent1-sku=94 (C8765WN)/96 (C8767WN)
+r3-agent1-type=1
+r3-agent2-kind=3
+r3-agent2-sku=95 (C8766WN)/97 (C9363WN)
+r3-agent2-type=2
+r3-agent3-kind=3
+r3-agent3-sku=99 (C9369WN)
+r3-agent3-type=3
+r3-agent4-kind=3
+r3-agent4-sku=100 (C9368AN)
+r3-agent4-type=10
+r4-agent1-kind=3
+r4-agent1-sku=339 (C8767EN)/338 (C8765EN)
+r4-agent1-type=1
+r4-agent2-kind=3
+r4-agent2-sku=344 (C9363EN)/343 (C8766EN)
+r4-agent2-type=2
+r4-agent3-kind=3
+r4-agent3-sku=348 (C9369EN)
+r4-agent3-type=3
+r4-agent4-kind=3
+r4-agent4-sku=100 (C9368AN)
+r4-agent4-type=10
+r5-agent1-kind=3
+r5-agent1-sku=130 (C8765HN)/131 (C8765HN)
+r5-agent1-type=1
+r5-agent2-kind=3
+r5-agent2-sku=134 (C8766HN)/135 (C9363HN)
+r5-agent2-type=2
+r5-agent3-kind=3
+r5-agent3-sku=138 (C9369HN)
+r5-agent3-type=3
+r5-agent4-kind=3
+r5-agent4-sku=100 (C9368AN)
+r5-agent4-type=10
+r6-agent1-kind=3
+r6-agent1-sku=130 (C8765HN)/131 (C8765HN)
+r6-agent1-type=1
+r6-agent2-kind=3
+r6-agent2-sku=134 (C8766HN)/135 (C9363HN)
+r6-agent2-type=2
+r6-agent3-kind=3
+r6-agent3-sku=138 (C9369HN)
+r6-agent3-type=3
+r6-agent4-kind=3
+r6-agent4-sku=100 (C9368AN)
+r6-agent4-type=10
+r7-agent1-kind=3
+r7-agent1-sku=853 (C8765ZN)/852 (C8765ZN)
+r7-agent1-type=1
+r7-agent2-kind=3
+r7-agent2-sku=857 (C9363ZN)/855 (C8766ZN)
+r7-agent2-type=2
+r7-agent3-kind=3
+r7-agent3-sku=858 (C9369ZN)
+r7-agent3-type=3
+r7-agent4-kind=3
+r7-agent4-sku=100 (C9368AN)
+r7-agent4-type=10
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=1
+status-type=2
+support-released=True
+support-subtype=3a9d
+support-type=2
+support-ver=0.9.5
+tech-class=DJGenericVIP
+tech-subclass=LargeFormatSuperB
+tech-type=2
+usb-pid=1212
+usb-vid=3f0
+wifi-config=0
+
+[hp_9872]
+align-type=0
+clean-type=0
+color-cal-type=0
+copy-type=0
+embedded-server-type=0
+fax-type=0
+fw-download=False
+icon=default_designjet.png
+io-mfp-mode=0
+io-mode=0
+io-support=0
+job-storage=0
+linefeed-cal-type=0
+model1=HP 9872 Graphics Plotter
+monitor-type=0
+panel-check-type=0
+pcard-type=0
+plugin=0
+plugin-reason=0
+power-settings=0
+pq-diag-type=0
+r-type=0
+scan-src=0
+scan-type=0
+status-battery-check=0
+status-dynamic-counters=0
+status-type=0
+support-released=True
+support-subtype=236d
+support-type=0
+support-ver=0.0.0
+tech-class=Undefined
+tech-subclass=Normal
+tech-type=2
+usb-pid=0
+usb-vid=3f0
+wifi-config=0
+
+
+# align-type
+# ----------
+# Align cartridges type
+# (TYPE_INT)
+# -1 : Not supported (device has alignment, but it is not supported by HPLIP)
+# 0 : None (device has no alignment)
+# 1 : Auto
+# 2 : 8xx
+# 3 : 9xx (w/edge align)
+# 4 : LIDIL 0.3.8
+# 5 : LIDIL 0.4.3
+# 6 : LIDIL AiO
+# 7 : LIDL VIP
+# 8 : DJ450
+# 9 : 9xx (w/o edge align)
+# 10 : Longbow
+# 11 : LIDIL 0.5.4
+# 12 : Carrier
+# 13 : Auto AiO
+# 14 : LIDIL DJ D1600
+# 15 : Low End Data Model (automatic and semiautomatic)
+# 16 : Low End Data Model (manual)
+# 17 : Low End Data Model via ff/cc/o channel
+#
+#
+# clean-type
+# ----------
+# Clean cartridges type
+# (TYPE_INT)
+# -1 : Not supported (device has clean, but it is not supported by HPLIP)
+# 0 : None (device has no clean)
+# 1 : PCL (w/o printout, standard)
+# 2 : LIDIL
+# 3 : PCL (w/printout, non-standard)
+#
+#
+# color-cal-type
+# --------------
+# Color calibration type
+# (TYPE_INT)
+# -1 : Not supported (device has color calibration, but it is not supported by HPLIP)
+# 0 : None (device has no color calibration)
+# 1 : DJ450
+# 2 : Crick (81 patches)
+# 3 : Tornado (2 bars of 21 patches)
+# 4 : Tahoe/PS 33xx
+# 5 : OJ Pro K550
+# 6 : OJ Pro L7xxx (auto)
+# 7 : PS Pro B8800 (clc)
+#
+#
+# copy-type
+# ---------
+# PC initiated copy protocol
+# (TYPE_INT)
+# -1 : Not supported (device has copy but it is not supported by HPLIP)
+# 0 : None (device has no copier)
+# 1 : Device (LaserJet/PML)
+# 2 : Scan-to-print (not used)
+# 3 : Device (Inkjet)
+#
+#
+# embedded-server-type
+# --------------------
+# Embedded web server type
+# (TYPE_INT)
+# -1 : Not supported by HPLIP
+# 0 : Disabled/Not present
+# 1 : Enabled/Present
+#
+#
+# fax-type
+# --------
+# PC send fax protocol
+# (TYPE_INT)
+# -1 : Not supported (device has fax but it is not supported by HPLIP)
+# 0 : None (device has no fax)
+# 1 : B&W PML/MFPDTF (early channel open (for NEW models)
+# 2 : B&W PML/MFPDTF (late channel open) (do NOT use for new models)
+# 3 : OZ or Color Fax (Do not use)
+# 4 : B&W SOAP
+# 5 : B&W MARVELL
+# 6 : B&W LEDM
+# 7 : B&W LEDMSOAP
+#
+#
+# fw-download
+# -----------
+# Device requires firmware download
+# (TYPE_BOOL)
+#
+#
+# icon
+# ----
+# (TYPE_STR)
+#
+#
+# io-mfp-mode
+# -----------
+# MFP I/O mode
+# (TYPE_INT)
+# 0 : Uni-di
+# 1 : Raw
+# 2 : (deprecated, no do use)
+# 3 : 1284.4
+# 4 : 1284.4 (Phoenix)
+# 5 : 1284.4 (bridge)
+# 6 : MLC (gusher)
+# 7 : MLC (miser)
+#
+#
+# io-mode
+# -------
+# Print-only I/O mode
+# (TYPE_INT)
+# 0 : Uni-di
+# 1 : Raw
+# 2 : (deprecated, no do use)
+# 3 : 1284.4
+# 4 : 1284.4 (Phoenix)
+# 5 : 1284.4 (bridge)
+# 6 : MLC (gusher)
+# 7 : MLC (miser)
+#
+#
+# io-support
+# ----------
+# Supported I/O types
+# (TYPE_BITFIELD)
+# 0x1 : Parallel
+# 0x2 : USB
+# 0x4 : Ethernet (built-in)
+# 0x8 : Wireless
+# 0x10 : Bluetooth
+#
+#
+# job-storage
+# -----------
+# Secure printing/job storage
+# (TYPE_INT)
+# 0 : Disable
+# 1 : Enable
+#
+#
+# linefeed-cal-type
+# -----------------
+# Linefeed calibration
+# (TYPE_INT)
+# -1 : Not supported (device has linefeed calibration, but it is not supported by HPLIP)
+# 0 : None (device has no linefeed calibration)
+# 1 : OJ Pro K550
+# 2 : OJ Pro L7xxx
+#
+#
+# monitor-type
+# ------------
+# Front panel key monitor
+# (TYPE_INT)
+# -1 : Not supported (device has monitorable keys, but it is not supported by HPLIP)
+# 0 : None (device does not have monitorable keys)
+# 1 : (Do not use/Currently unsupported)
+#
+#
+# panel-check-type
+# ----------------
+# Front panel LCD monitor
+# (TYPE_INT)
+# 0 : Disable
+# 1 : Enable
+#
+#
+# pcard-type
+# ----------
+# Photocard protocol
+# (TYPE_INT)
+# 0 : None (device has no photocard)
+# 1 : MLC (disk I/O)
+# 2 : USB mass storage (only supported type on new models)
+#
+#
+# plugin
+# ------
+# Plugin requirement
+# (TYPE_INT)
+# 0 : None
+# 1 : Required
+# 2 : Optional
+#
+#
+# plugin-reason
+# -------------
+# Plugin reasons
+# (TYPE_BITFIELD)
+# 0x0 : None or n/a
+# 0x1 : Printing support
+# 0x2 : Printing speed
+# 0x4 : Printing IQ
+# 0x8 : Printing features
+# 0x10 : (reserved)
+# 0x20 : (reserved)
+# 0x40 : Scanning support
+# 0x80 : Scanning speed
+# 0x100 : Scanning IQ
+# 0x200 : (reserved)
+# 0x400 : (reserved)
+# 0x800 : PC send fax support
+# 0x1000 : PC send fax features
+# 0x2000 : (reserved)
+# 0x4000 : I/O support
+# 0x8000 : UI features
+# 0x10000 : Other features
+# 0x20000 : (reserved)
+# 0x40000 : (reserved)
+#
+#
+# power-settings
+# --------------
+# Auto power shutoff for mobile printers
+# (TYPE_INT)
+# 0 : Disable
+# 1 : EPML
+# 2 : PML
+#
+#
+# pq-diag-type
+# ------------
+# PQ diag protocol
+# (TYPE_INT)
+# -1 : Not supported (device has PQ diag, but it is not supported by HPLIP)
+# 0 : None (device does not have PQ diag)
+# 1 : OJ Pro K550
+# 2 : OJ Pro L7xxx
+#
+#
+# scan-src
+# --------
+# Scan paper path
+# (TYPE_INT)
+# 0 : None or n/a
+# 1 : Flatbed
+# 2 : Adf
+# 4 : Camera
+#
+#
+# scan-type
+# ---------
+# Scan protocol
+# (TYPE_INT)
+# -2 : Digital sender (no HPLIP host support)
+# -1 : Not supported (device has scanner but it is not supported by HPLIP)
+# 0 : None (device has no scanner)
+# 1 : SCL
+# 2 : PML
+# 3 : SOAP1
+# 4 : Marvell
+# 5 : SOAP2
+# 6 : Duplex SCL
+# 7 : LEDM
+# 8 : Marvell2
+#
+#
+# status-battery-check
+# --------------------
+# Battery status check
+# (TYPE_INT)
+# 0 : None (do not check battery status)
+# 1 : Use dynamic counters (Deskjet 450/460)
+# 2 : Use PML (Officejet h470)
+#
+#
+# status-dynamic-counters
+# -----------------------
+# Dynamic counters protocol
+# (TYPE_INT)
+# 0 : None (no dynamic counter support)
+# 1 : PCL/PML (embedded PML)
+# 2 : PML/SNMP
+# 3 : LIDIL 0.5.4
+#
+#
+# status-type
+# -----------
+# Status protocol
+# (TYPE_INT)
+# 0 : None (do not collect status)
+# 1 : Device ID (VSTATUS)
+# 2 : Device ID (S: field)
+# 3 : LaserJet PML
+# 4 : (deprecated, do not use)
+# 5 : (deprecated, do not use)
+# 6 : LaserJet XML
+# 7 : (deprecated, do not use)
+# 8 : PJL only over print channel
+# 9 : PML + PJL over print channel
+# 10 : Low End Data Model
+# 11 : Low End Data Model via FF/CC/0 channel
+#
+#
+# support-released
+# ----------------
+# Released or unreleased
+# (TYPE_BOOL)
+# 0 : Unreleased
+# 1 : Released
+#
+#
+# support-subtype
+# ---------------
+# Support sub-type (hex value, no 0x)
+# (TYPE_HEX)
+#
+#
+# support-type
+# ------------
+# Supported/not supported
+# (TYPE_INT)
+# 0 : Not supported by HPLIP
+# 1 : Supported only by HPIJS
+# 2 : Supported by HPLIP
+#
+#
+# support-ver
+# -----------
+# Minimum HPLIP version for support
+# (TYPE_STR)
+#
+#
+# tech-class
+# ----------
+# APDK device class(es)
+# (TYPE_LIST)
+# AP21xx
+# AP2560
+# AP2xxx
+# Ampere
+# Copperhead
+# Corbett
+# DJ3320
+# DJ350
+# DJ3600
+# DJ4100
+# DJ540
+# DJ55xx
+# DJ600
+# DJ630
+# DJ6xx
+# DJ6xxPhoto
+# DJ850
+# DJ890
+# DJ8x5
+# DJ8xx
+# DJ9xx
+# DJ9xxVIP
+# DJGenericVIP
+# LJColor
+# LJFastRaster
+# LJJetReady
+# LJMono
+# LJP1XXX
+# LJZjsColor
+# LJZjsMono
+# LJm1005
+# Mimas
+# OJ7000
+# OJProKx50
+# PSP100
+# PSP470
+# Postscript
+# Pyramid
+# Python
+# Python10
+# Python11
+# QuickConnect
+# Saipan
+# Stabler
+# StingrayOJ
+# Undefined
+# Unsupported
+# ViperMinusTrim
+# ViperMinusVIP
+# ViperPlusTrim
+# ViperPlusVIP
+#
+#
+# tech-subclass
+# -------------
+# HPLIP device sub-class(es)
+# (TYPE_LIST)
+# 300dpiOnly
+# 4800x1200dpi
+# 4x6FullBleed
+# Advanced
+# Apollo2000
+# Apollo2200
+# Apollo2500
+# AutoDuplex
+# CoverMedia
+# Duplex
+# FullBleed
+# GrayscaleOnly
+# LargeFormatA3
+# LargeFormatSuperB
+# No1200dpiNoSensor
+# NoAutoDuplex
+# NoAutoTray
+# NoCDDVD
+# NoEvenDuplex
+# NoFullBleed
+# NoMaxDPI
+# NoMaxDPI
+# NoPhotoBestHiresModes
+# NoPhotoMode
+# Normal
+# SmallMargins
+# Trim
+#
+#
+# tech-type
+# ---------
+# Writing system technology
+# (TYPE_INT)
+# 0 : Not specified
+# 1 : Mono inkjet
+# 2 : Color inkjet
+# 3 : Mono laser
+# 4 : Color laser
+# 5 : Color Edgeline
+#
+#
+# usb-pid
+# -------
+# USB product ID (4 digit hex value, no 0x)
+# (TYPE_HEX)
+#
+#
+# usb-vid
+# -------
+# USB vendor ID (4 digit hex value, no 0x)
+# (TYPE_HEX)
+#
+#
+# wifi-config
+# -----------
+# Wifi Configuration
+# (TYPE_INT)
+# -1 : Not supported (device has wifi but configuration is not supported by HPLIP)
+# 0 : None (device has no wifi)
+# 1 : USB configuration of wireless (XML/Inkjet)
+# 2 : Default
+# 3 : LEDM
+#
+#
diff --git a/data/pcl/align1_8xx.pcl.gz b/data/pcl/align1_8xx.pcl.gz
new file mode 100755
index 0000000..6924690
--- /dev/null
+++ b/data/pcl/align1_8xx.pcl.gz
Binary files differ
diff --git a/data/pcl/align1_9xx.pcl.gz b/data/pcl/align1_9xx.pcl.gz
new file mode 100755
index 0000000..27bb9de
--- /dev/null
+++ b/data/pcl/align1_9xx.pcl.gz
Binary files differ
diff --git a/data/pcl/align2_8xx.pcl.gz b/data/pcl/align2_8xx.pcl.gz
new file mode 100755
index 0000000..373fa76
--- /dev/null
+++ b/data/pcl/align2_8xx.pcl.gz
Binary files differ
diff --git a/data/pcl/align2_9xx.pcl.gz b/data/pcl/align2_9xx.pcl.gz
new file mode 100755
index 0000000..a81236b
--- /dev/null
+++ b/data/pcl/align2_9xx.pcl.gz
Binary files differ
diff --git a/data/pcl/align3_8xx.pcl.gz b/data/pcl/align3_8xx.pcl.gz
new file mode 100644
index 0000000..56b8a0d
--- /dev/null
+++ b/data/pcl/align3_8xx.pcl.gz
Binary files differ
diff --git a/data/pcl/align3_9xx.pcl.gz b/data/pcl/align3_9xx.pcl.gz
new file mode 100755
index 0000000..7e4ed47
--- /dev/null
+++ b/data/pcl/align3_9xx.pcl.gz
Binary files differ
diff --git a/data/pcl/align4_450.pcl.gz b/data/pcl/align4_450.pcl.gz
new file mode 100755
index 0000000..f4c2b4e
--- /dev/null
+++ b/data/pcl/align4_450.pcl.gz
Binary files differ
diff --git a/data/pcl/align4_8xx.pcl.gz b/data/pcl/align4_8xx.pcl.gz
new file mode 100644
index 0000000..78a1a2f
--- /dev/null
+++ b/data/pcl/align4_8xx.pcl.gz
Binary files differ
diff --git a/data/pcl/align5_8xx.pcl.gz b/data/pcl/align5_8xx.pcl.gz
new file mode 100644
index 0000000..d2339a0
--- /dev/null
+++ b/data/pcl/align5_8xx.pcl.gz
Binary files differ
diff --git a/data/pcl/align6_450.pcl.gz b/data/pcl/align6_450.pcl.gz
new file mode 100755
index 0000000..1c32c19
--- /dev/null
+++ b/data/pcl/align6_450.pcl.gz
Binary files differ
diff --git a/data/pcl/colorcal1_450.pcl.gz b/data/pcl/colorcal1_450.pcl.gz
new file mode 100755
index 0000000..3261968
--- /dev/null
+++ b/data/pcl/colorcal1_450.pcl.gz
Binary files differ
diff --git a/data/pcl/colorcal2_450.pcl.gz b/data/pcl/colorcal2_450.pcl.gz
new file mode 100755
index 0000000..ef44f14
--- /dev/null
+++ b/data/pcl/colorcal2_450.pcl.gz
Binary files differ
diff --git a/data/pcl/crbcal.pcl.gz b/data/pcl/crbcal.pcl.gz
new file mode 100755
index 0000000..89b4933
--- /dev/null
+++ b/data/pcl/crbcal.pcl.gz
Binary files differ
diff --git a/data/pcl/crcaldone.pcl.gz b/data/pcl/crcaldone.pcl.gz
new file mode 100755
index 0000000..5e8b025
--- /dev/null
+++ b/data/pcl/crcaldone.pcl.gz
Binary files differ
diff --git a/data/pcl/crcbcal.pcl.gz b/data/pcl/crcbcal.pcl.gz
new file mode 100755
index 0000000..f7677a2
--- /dev/null
+++ b/data/pcl/crcbcal.pcl.gz
Binary files differ
diff --git a/data/pcl/crccal.pcl.gz b/data/pcl/crccal.pcl.gz
new file mode 100755
index 0000000..20458ca
--- /dev/null
+++ b/data/pcl/crccal.pcl.gz
Binary files differ
diff --git a/data/pcl/crcpcal.pcl.gz b/data/pcl/crcpcal.pcl.gz
new file mode 100755
index 0000000..6ca56fb
--- /dev/null
+++ b/data/pcl/crcpcal.pcl.gz
Binary files differ
diff --git a/data/pcl/crpcal.pcl.gz b/data/pcl/crpcal.pcl.gz
new file mode 100755
index 0000000..fc555b9
--- /dev/null
+++ b/data/pcl/crpcal.pcl.gz
Binary files differ
diff --git a/data/policykit/com.hp.hplip.conf b/data/policykit/com.hp.hplip.conf
new file mode 100644
index 0000000..cf88a07
--- /dev/null
+++ b/data/policykit/com.hp.hplip.conf
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?> <!-- -*- XML -*- -->
+
+<!DOCTYPE busconfig PUBLIC
+ "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
+ "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
+<busconfig>
+
+ <!-- Only root can own the service -->
+ <policy user="root">
+ <allow own="com.hp.hplip"/>
+ <allow send_destination="com.hp.hplip"/>
+ <allow send_interface="com.hp.hplip"/>
+ </policy>
+
+ <policy at_console="true">
+ <deny own="com.hp.hplip"/>
+ <allow send_destination="com.hp.hplip"/>
+ <allow send_interface="com.hp.hplip"/>
+ </policy>
+
+ <policy context="default">
+ <deny own="com.hp.hplip"/>
+ <allow send_destination="com.hp.hplip"/>
+ <allow send_interface="com.hp.hplip"/>
+ </policy>
+
+</busconfig>
diff --git a/data/policykit/com.hp.hplip.policy b/data/policykit/com.hp.hplip.policy
new file mode 100644
index 0000000..5a42271
--- /dev/null
+++ b/data/policykit/com.hp.hplip.policy
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE policyconfig PUBLIC
+ "-//freedesktop//DTD PolicyKit Policy Configuration 1.0//EN"
+ "http://www.freedesktop.org/standards/PolicyKit/1.0/policyconfig.dtd">
+<policyconfig>
+
+ <vendor>Hewlett-Packard Development Company</vendor>
+ <vendor_url>http://hplip.net/</vendor_url>
+
+ <action id="com.hp.hplip.installplugin">
+ <description>Install a plug-in into a Hewlett-Packard printer</description>
+ <message>System policy prevents installation of a printer plug-in</message>
+ <defaults>
+ <allow_any>no</allow_any>
+ <allow_inactive>no</allow_inactive>
+ <allow_active>auth_admin</allow_active>
+ </defaults>
+ </action>
+
+</policyconfig>
diff --git a/data/policykit/com.hp.hplip.service b/data/policykit/com.hp.hplip.service
new file mode 100644
index 0000000..edc3680
--- /dev/null
+++ b/data/policykit/com.hp.hplip.service
@@ -0,0 +1,4 @@
+[D-BUS Service]
+Name=com.hp.hplip
+Exec=/usr/bin/hp-pkservice
+User=root
diff --git a/data/policykit/com.hp.hplip.service.in b/data/policykit/com.hp.hplip.service.in
new file mode 100644
index 0000000..8f7e243
--- /dev/null
+++ b/data/policykit/com.hp.hplip.service.in
@@ -0,0 +1,4 @@
+[D-BUS Service]
+Name=com.hp.hplip
+Exec=@prefix@/bin/hp-pkservice
+User=root
diff --git a/data/ps/clean_page.pdf.gz b/data/ps/clean_page.pdf.gz
new file mode 100644
index 0000000..0c0b6c4
--- /dev/null
+++ b/data/ps/clean_page.pdf.gz
Binary files differ
diff --git a/data/ps/testpage.ps.gz b/data/ps/testpage.ps.gz
new file mode 100644
index 0000000..df731d3
--- /dev/null
+++ b/data/ps/testpage.ps.gz
Binary files differ
diff --git a/data/rules/20-hplip-devices.fdi b/data/rules/20-hplip-devices.fdi
new file mode 100644
index 0000000..6c41848
--- /dev/null
+++ b/data/rules/20-hplip-devices.fdi
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<deviceinfo version="0.2">
+ <device>
+
+<!-- Check for AiO products (0x03f0xx11). -->
+ <match key="info.subsystem" string="usb">
+ <match key="usb.vendor_id" int="0x03f0">
+ <match key="usb.product_id" int_outof="0x0011;0x0111;0x0211;0x0311;0x0411;0x0511;0x0611;0x0711;0x0811;0x0911;0x0a11;0x0b11;0x0c11;0x0d11;0x0e11;0x0f11;0x1011;0x1111;0x1211;0x1311;0x1411;0x1511;0x1611;0x1711;0x1811;0x1911;0x1a11;0x1b11;0x1c11;0x1d11;0x1e11;0x1f11;0x2011;0x2111;0x2211;0x2311;0x2411;0x2511;0x2611;0x2711;0x2811;0x2911;0x2a11;0x2b11;0x2c11;0x2d11;0x2e11;0x2f11;0x3011;0x3111;0x3211;0x3311;0x3411;0x3511;0x3611;0x3711;0x3811;0x3911;0x3a11;0x3b11;0x3c11;0x3d11;0x3e11;0x3f11;0x4011;0x4111;0x4211;0x4311;0x4411;0x4511;0x4611;0x4711;0x4811;0x4911;0x4a11;0x4b11;0x4c11;0x4d11;0x4e11;0x4f11;0x5011;0x5111;0x5211;0x5311;0x5411;0x5511;0x5611;0x5711;0x5811;0x5911;0x5a11;0x5b11;0x5c11;0x5d11;0x5e11;0x5f11;0x6011;0x6111;0x6211;0x6311;0x6411;0x6511;0x6611;0x6711;0x6811;0x6911;0x6a11;0x6b11;0x6c11;0x6d11;0x6e11;0x6f11;0x7011;0x7111;0x7211;0x7311;0x7411;0x7511;0x7611;0x7711;0x7811;0x7911;0x7a11;0x7b11;0x7c11;0x7d11;0x7e11;0x7f11;0x8011;0x8111;0x8211;0x8311;0x8411;0x8511;0x8611;0x8711;0x8811;0x8911;0x8a11;0x8b11;0x8c11;0x8d11;0x8e11;0x8f11;0x9011;0x9111;0x9211;0x9311;0x9411;0x9511;0x9611;0x9711;0x9811;0x9911;0x9a11;0x9b11;0x9c11;0x9d11;0x9e11;0x9f11;0xa011;0xa111;0xa211;0xa311;0xa411;0xa511;0xa611;0xa711;0xa811;0xa911;0xaa11;0xab11;0xac11;0xad11;0xae11;0xaf11;0xb011;0xb111;0xb211;0xb311;0xb411;0xb511;0xb611;0xb711;0xb811;0xb911;0xba11;0xbb11;0xbc11;0xbd11;0xbe11;0xbf11;0xc011;0xc111;0xc211;0xc311;0xc411;0xc511;0xc611;0xc711;0xc811;0xc911;0xca11;0xcb11;0xcc11;0xcd11;0xce11;0xcf11;0xd011;0xd111;0xd211;0xd311;0xd411;0xd511;0xd611;0xd711;0xd811;0xd911;0xda11;0xdb11;0xdc11;0xdd11;0xde11;0xdf11;0xe011;0xe111;0xe211;0xe311;0xe411;0xe511;0xe611;0xe711;0xe811;0xe911;0xea11;0xeb11;0xec11;0xed11;0xee11;0xef11;0xf011;0xf111;0xf211;0xf311;0xf411;0xf511;0xf611;0xf711;0xf811;0xf911;0xfa11;0xfb11;0xfc11;0xfd11;0xfe11;0xff11">
+ <append key="info.capabilities" type="strlist">scanner</append>
+ </match>
+ </match>
+ </match>
+
+<!-- Check for Photosmart products without wildcard since cameras and scanners also used (0x03f0xx02). -->
+<!-- The xx02 pid has been retired so this explicit list should not change. -->
+ <match key="info.subsystem" string="usb">
+ <match key="usb.vendor_id" int="0x03f0">
+ <match key="usb.product_id" int_outof="0xc302;0x3802;0x3402;0x3202;0x03f0;0x3302;0x3902;0x3602;0x1002;0x3502;0x1102;0x1202;0x1602;0x1302;0x1702;0x1502;0x1802;0x3a02;0x3b02;0xb002;0x2002;0x3c02;0xb802;0x3e02;0xb202;0xb402;0xc002;0xb602;0xc102;0xba02;0xc202;0xbb02;0xbc02;0x1d02;0x1e02;0x1902;0x1f02;0x1a02;0x2602;0x2b02;0x1b02;0x2702;0x2c02;0x1c02;0x2902;0xc802;0xc402;0xc502;0xc602;0xc702;0xbe02;0xd002;0xbd02;0xd102;0x7902">
+ <append key="info.capabilities" type="strlist">scanner</append>
+ </match>
+ </match>
+ </match>
+
+<!-- Check for Business Inkjet products (0x03f0xx12). -->
+ <match key="info.subsystem" string="usb">
+ <match key="usb.vendor_id" int="0x03f0">
+ <match key="usb.product_id" int_outof="0x0012;0x0112;0x0212;0x0312;0x0412;0x0512;0x0612;0x0712;0x0812;0x0912;0x0a12;0x0b12;0x0c12;0x0d12;0x0e12;0x0f12;0x1012;0x1112;0x1212;0x1312;0x1412;0x1512;0x1612;0x1712;0x1812;0x1912;0x1a12;0x1b12;0x1c12;0x1d12;0x1e12;0x1f12;0x2012;0x2112;0x2212;0x2312;0x2412;0x2512;0x2612;0x2712;0x2812;0x2912;0x2a12;0x2b12;0x2c12;0x2d12;0x2e12;0x2f12;0x3012;0x3112;0x3212;0x3312;0x3412;0x3512;0x3612;0x3712;0x3812;0x3912;0x3a12;0x3b12;0x3c12;0x3d12;0x3e12;0x3f12;0x4012;0x4112;0x4212;0x4312;0x4412;0x4512;0x4612;0x4712;0x4812;0x4912;0x4a12;0x4b12;0x4c12;0x4d12;0x4e12;0x4f12;0x5012;0x5112;0x5212;0x5312;0x5412;0x5512;0x5612;0x5712;0x5812;0x5912;0x5a12;0x5b12;0x5c12;0x5d12;0x5e12;0x5f12;0x6012;0x6112;0x6212;0x6312;0x6412;0x6512;0x6612;0x6712;0x6812;0x6912;0x6a12;0x6b12;0x6c12;0x6d12;0x6e12;0x6f12;0x7012;0x7112;0x7212;0x7312;0x7412;0x7512;0x7612;0x7712;0x7812;0x7912;0x7a12;0x7b12;0x7c12;0x7d12;0x7e12;0x7f12;0x8012;0x8112;0x8212;0x8312;0x8412;0x8512;0x8612;0x8712;0x8812;0x8912;0x8a12;0x8b12;0x8c12;0x8d12;0x8e12;0x8f12;0x9012;0x9112;0x9212;0x9312;0x9412;0x9512;0x9612;0x9712;0x9812;0x9912;0x9a12;0x9b12;0x9c12;0x9d12;0x9e12;0x9f12;0xa012;0xa112;0xa212;0xa312;0xa412;0xa512;0xa612;0xa712;0xa812;0xa912;0xaa12;0xab12;0xac12;0xad12;0xae12;0xaf12;0xb012;0xb112;0xb212;0xb312;0xb412;0xb512;0xb612;0xb712;0xb812;0xb912;0xba12;0xbb12;0xbc12;0xbd12;0xbe12;0xbf12;0xc012;0xc112;0xc212;0xc312;0xc412;0xc512;0xc612;0xc712;0xc812;0xc912;0xca12;0xcb12;0xcc12;0xcd12;0xce12;0xcf12;0xd012;0xd112;0xd212;0xd312;0xd412;0xd512;0xd612;0xd712;0xd812;0xd912;0xda12;0xdb12;0xdc12;0xdd12;0xde12;0xdf12;0xe012;0xe112;0xe212;0xe312;0xe412;0xe512;0xe612;0xe712;0xe812;0xe912;0xea12;0xeb12;0xec12;0xed12;0xee12;0xef12;0xf012;0xf112;0xf212;0xf312;0xf412;0xf512;0xf612;0xf712;0xf812;0xf912;0xfa12;0xfb12;0xfc12;0xfd12;0xfe12;0xff12">
+ <append key="info.capabilities" type="strlist">scanner</append>
+ </match>
+ </match>
+ </match>
+
+<!-- Check for Deskjet products (0x03f0xx04). -->
+ <match key="info.subsystem" string="usb">
+ <match key="usb.vendor_id" int="0x03f0">
+ <match key="usb.product_id" int_outof="0x0004;0x0104;0x0204;0x0304;0x0404;0x0504;0x0604;0x0704;0x0804;0x0904;0x0a04;0x0b04;0x0c04;0x0d04;0x0e04;0x0f04;0x1004;0x1104;0x1204;0x1304;0x1404;0x1504;0x1604;0x1704;0x1804;0x1904;0x1a04;0x1b04;0x1c04;0x1d04;0x1e04;0x1f04;0x2004;0x2104;0x2204;0x2304;0x2404;0x2504;0x2604;0x2704;0x2804;0x2904;0x2a04;0x2b04;0x2c04;0x2d04;0x2e04;0x2f04;0x3004;0x3104;0x3204;0x3304;0x3404;0x3504;0x3604;0x3704;0x3804;0x3904;0x3a04;0x3b04;0x3c04;0x3d04;0x3e04;0x3f04;0x4004;0x4104;0x4204;0x4304;0x4404;0x4504;0x4604;0x4704;0x4804;0x4904;0x4a04;0x4b04;0x4c04;0x4d04;0x4e04;0x4f04;0x5004;0x5104;0x5204;0x5304;0x5404;0x5504;0x5604;0x5704;0x5804;0x5904;0x5a04;0x5b04;0x5c04;0x5d04;0x5e04;0x5f04;0x6004;0x6104;0x6204;0x6304;0x6404;0x6504;0x6604;0x6704;0x6804;0x6904;0x6a04;0x6b04;0x6c04;0x6d04;0x6e04;0x6f04;0x7004;0x7104;0x7204;0x7304;0x7404;0x7504;0x7604;0x7704;0x7804;0x7904;0x7a04;0x7b04;0x7c04;0x7d04;0x7e04;0x7f04;0x8004;0x8104;0x8204;0x8304;0x8404;0x8504;0x8604;0x8704;0x8804;0x8904;0x8a04;0x8b04;0x8c04;0x8d04;0x8e04;0x8f04;0x9004;0x9104;0x9204;0x9304;0x9404;0x9504;0x9604;0x9704;0x9804;0x9904;0x9a04;0x9b04;0x9c04;0x9d04;0x9e04;0x9f04;0xa004;0xa104;0xa204;0xa304;0xa404;0xa504;0xa604;0xa704;0xa804;0xa904;0xaa04;0xab04;0xac04;0xad04;0xae04;0xaf04;0xb004;0xb104;0xb204;0xb304;0xb404;0xb504;0xb604;0xb704;0xb804;0xb904;0xba04;0xbb04;0xbc04;0xbd04;0xbe04;0xbf04;0xc004;0xc104;0xc204;0xc304;0xc404;0xc504;0xc604;0xc704;0xc804;0xc904;0xca04;0xcb04;0xcc04;0xcd04;0xce04;0xcf04;0xd004;0xd104;0xd204;0xd304;0xd404;0xd504;0xd604;0xd704;0xd804;0xd904;0xda04;0xdb04;0xdc04;0xdd04;0xde04;0xdf04;0xe004;0xe104;0xe204;0xe304;0xe404;0xe504;0xe604;0xe704;0xe804;0xe904;0xea04;0xeb04;0xec04;0xed04;0xee04;0xef04;0xf004;0xf104;0xf204;0xf304;0xf404;0xf504;0xf604;0xf704;0xf804;0xf904;0xfa04;0xfb04;0xfc04;0xfd04;0xfe04;0xff04">
+ <append key="info.capabilities" type="strlist">scanner</append>
+ </match>
+ </match>
+ </match>
+
+<!-- Check for LaserJet products (0x03f0xx17). -->
+ <match key="info.subsystem" string="usb">
+ <match key="usb.vendor_id" int="0x03f0">
+ <match key="usb.product_id" int_outof="0x0017;0x0117;0x0217;0x0317;0x0417;0x0517;0x0617;0x0717;0x0817;0x0917;0x0a17;0x0b17;0x0c17;0x0d17;0x0e17;0x0f17;0x1017;0x1117;0x1217;0x1317;0x1417;0x1517;0x1617;0x1717;0x1817;0x1917;0x1a17;0x1b17;0x1c17;0x1d17;0x1e17;0x1f17;0x2017;0x2117;0x2217;0x2317;0x2417;0x2517;0x2617;0x2717;0x2817;0x2917;0x2a17;0x2b17;0x2c17;0x2d17;0x2e17;0x2f17;0x3017;0x3117;0x3217;0x3317;0x3417;0x3517;0x3617;0x3717;0x3817;0x3917;0x3a17;0x3b17;0x3c17;0x3d17;0x3e17;0x3f17;0x4017;0x4117;0x4217;0x4317;0x4417;0x4517;0x4617;0x4717;0x4817;0x4917;0x4a17;0x4b17;0x4c17;0x4d17;0x4e17;0x4f17;0x5017;0x5117;0x5217;0x5317;0x5417;0x5517;0x5617;0x5717;0x5817;0x5917;0x5a17;0x5b17;0x5c17;0x5d17;0x5e17;0x5f17;0x6017;0x6117;0x6217;0x6317;0x6417;0x6517;0x6617;0x6717;0x6817;0x6917;0x6a17;0x6b17;0x6c17;0x6d17;0x6e17;0x6f17;0x7017;0x7117;0x7217;0x7317;0x7417;0x7517;0x7617;0x7717;0x7817;0x7917;0x7a17;0x7b17;0x7c17;0x7d17;0x7e17;0x7f17;0x8017;0x8117;0x8217;0x8317;0x8417;0x8517;0x8617;0x8717;0x8817;0x8917;0x8a17;0x8b17;0x8c17;0x8d17;0x8e17;0x8f17;0x9017;0x9117;0x9217;0x9317;0x9417;0x9517;0x9617;0x9717;0x9817;0x9917;0x9a17;0x9b17;0x9c17;0x9d17;0x9e17;0x9f17;0xa017;0xa117;0xa217;0xa317;0xa417;0xa517;0xa617;0xa717;0xa817;0xa917;0xaa17;0xab17;0xac17;0xad17;0xae17;0xaf17;0xb017;0xb117;0xb217;0xb317;0xb417;0xb517;0xb617;0xb717;0xb817;0xb917;0xba17;0xbb17;0xbc17;0xbd17;0xbe17;0xbf17;0xc017;0xc117;0xc217;0xc317;0xc417;0xc517;0xc617;0xc717;0xc817;0xc917;0xca17;0xcb17;0xcc17;0xcd17;0xce17;0xcf17;0xd017;0xd117;0xd217;0xd317;0xd417;0xd517;0xd617;0xd717;0xd817;0xd917;0xda17;0xdb17;0xdc17;0xdd17;0xde17;0xdf17;0xe017;0xe117;0xe217;0xe317;0xe417;0xe517;0xe617;0xe717;0xe817;0xe917;0xea17;0xeb17;0xec17;0xed17;0xee17;0xef17;0xf017;0xf117;0xf217;0xf317;0xf417;0xf517;0xf617;0xf717;0xf817;0xf917;0xfa17;0xfb17;0xfc17;0xfd17;0xfe17;0xff17;0x042a;0x052a">
+ <append key="info.capabilities" type="strlist">scanner</append>
+ </match>
+ </match>
+ </match>
+
+<!-- Check for LaserJet products (0x03f0xx2a). -->
+ <match key="info.subsystem" string="usb">
+ <match key="usb.vendor_id" int="0x03f0">
+ <match key="usb.product_id" int_outof="0x002a;0x012a;0x022a;0x032a;0x042a;0x052a;0x062a;0x072a;0x082a;0x092a;0x0a2a;0x0b2a;0x0c2a;0x0d2a;0x0e2a;0x0f2a;0x102a;0x112a;0x122a;0x132a;0x142a;0x152a;0x162a;0x172a;0x182a;0x192a;0x1a2a;0x1b2a;0x1c2a;0x1d2a;0x1e2a;0x1f2a;0x202a;0x212a;0x222a;0x232a;0x242a;0x252a;0x262a;0x272a;0x282a;0x292a;0x2a2a;0x2b2a;0x2c2a;0x2d2a;0x2e2a;0x2f2a;0x302a;0x312a;0x322a;0x332a;0x342a;0x352a;0x362a;0x372a;0x382a;0x392a;0x3a2a;0x3b2a;0x3c2a;0x3d2a;0x3e2a;0x3f2a;0x402a;0x412a;0x422a;0x432a;0x442a;0x452a;0x462a;0x472a;0x482a;0x492a;0x4a2a;0x4b2a;0x4c2a;0x4d2a;0x4e2a;0x4f2a;0x502a;0x512a;0x522a;0x532a;0x542a;0x552a;0x562a;0x572a;0x582a;0x592a;0x5a2a;0x5b2a;0x5c2a;0x5d2a;0x5e2a;0x5f2a;0x602a;0x612a;0x622a;0x632a;0x642a;0x652a;0x662a;0x672a;0x682a;0x692a;0x6a2a;0x6b2a;0x6c2a;0x6d2a;0x6e2a;0x6f2a;0x702a;0x712a;0x722a;0x732a;0x742a;0x752a;0x762a;0x772a;0x782a;0x792a;0x7a2a;0x7b2a;0x7c2a;0x7d2a;0x7e2a;0x7f2a;0x802a;0x812a;0x822a;0x832a;0x842a;0x852a;0x862a;0x872a;0x882a;0x892a;0x8a2a;0x8b2a;0x8c2a;0x8d2a;0x8e2a;0x8f2a;0x902a;0x912a;0x922a;0x932a;0x942a;0x952a;0x962a;0x972a;0x982a;0x992a;0x9a2a;0x9b2a;0x9c2a;0x9d2a;0x9e2a;0x9f2a;0xa02a;0xa12a;0xa22a;0xa32a;0xa42a;0xa52a;0xa62a;0xa72a;0xa82a;0xa92a;0xaa2a;0xab2a;0xac2a;0xad2a;0xae2a;0xaf2a;0xb02a;0xb12a;0xb22a;0xb32a;0xb42a;0xb52a;0xb62a;0xb72a;0xb82a;0xb92a;0xba2a;0xbb2a;0xbc2a;0xbd2a;0xbe2a;0xbf2a;0xc02a;0xc12a;0xc22a;0xc32a;0xc42a;0xc52a;0xc62a;0xc72a;0xc82a;0xc92a;0xca2a;0xcb2a;0xcc2a;0xcd2a;0xce2a;0xcf2a;0xd02a;0xd12a;0xd22a;0xd32a;0xd42a;0xd52a;0xd62a;0xd72a;0xd82a;0xd92a;0xda2a;0xdb2a;0xdc2a;0xdd2a;0xde2a;0xdf2a;0xe02a;0xe12a;0xe22a;0xe32a;0xe42a;0xe52a;0xe62a;0xe72a;0xe82a;0xe92a;0xea2a;0xeb2a;0xec2a;0xed2a;0xee2a;0xef2a;0xf02a;0xf12a;0xf22a;0xf32a;0xf42a;0xf52a;0xf62a;0xf72a;0xf82a;0xf92a;0xfa2a;0xfb2a;0xfc2a;0xfd2a;0xfe2a;0xff2a;0x042a;0x052a">
+ <append key="info.capabilities" type="strlist">scanner</append>
+ </match>
+ </match>
+ </match>
+
+<!-- TODO identify devices that require a proprietary plugin and set info.capabilities? -->
+
+<!-- TODO identify devices that have optional proprietary plugin and set info.capabilities? -->
+
+ </device>
+</deviceinfo>
diff --git a/data/rules/40-hplip.rules b/data/rules/40-hplip.rules
new file mode 100644
index 0000000..d2dd3ee
--- /dev/null
+++ b/data/rules/40-hplip.rules
@@ -0,0 +1,138 @@
+# HPLIP udev rules file for HP printer and all-in-one products.
+#
+# The 40-hplip.rules file replaces the 55-hpmud.rules on newer distros with udev ACL support.
+# For older distros that use HAL ACL support use the 55-hpmud.rules.
+#
+
+ACTION!="add", GOTO="hpmud_rules_end"
+SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", GOTO="pid_test"
+SUBSYSTEM!="usb_device", GOTO="hpmud_rules_end"
+
+LABEL="pid_test"
+
+# Check for AiO products (0x03f0xx11).
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="??11", GROUP="lp", ENV{ID_HPLIP}="1"
+
+# Check for Photosmart products without wildcard since cameras and scanners also used (0x03f0xx02).
+# The xx02 pid has been retired so this explicit list should not change.
+# photosmart_d2300_series
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="c302", GROUP="lp", ENV{ID_HPLIP}="1"
+# photosmart_100
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="3802", GROUP="lp", ENV{ID_HPLIP}="1"
+# photosmart_1115
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="3402", GROUP="lp", ENV{ID_HPLIP}="1"
+# photosmart_1215
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="3202", GROUP="lp", ENV{ID_HPLIP}="1"
+# photosmart_1218
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="3302", GROUP="lp", ENV{ID_HPLIP}="1"
+# photosmart_130
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="3902", GROUP="lp", ENV{ID_HPLIP}="1"
+# photosmart_1315
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="3602", GROUP="lp", ENV{ID_HPLIP}="1"
+# photosmart_140_series
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="1002", GROUP="lp", ENV{ID_HPLIP}="1"
+# photosmart_230
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="3502", GROUP="lp", ENV{ID_HPLIP}="1"
+# photosmart_240_series
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="1102", GROUP="lp", ENV{ID_HPLIP}="1"
+# photosmart_320_series
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="1202", GROUP="lp", ENV{ID_HPLIP}="1"
+# photosmart_330_series
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="1602", GROUP="lp", ENV{ID_HPLIP}="1"
+# photosmart_370_series
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="1302", GROUP="lp", ENV{ID_HPLIP}="1"
+# photosmart_380_series
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="1702", GROUP="lp", ENV{ID_HPLIP}="1"
+# photosmart_420_series
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="1502", GROUP="lp", ENV{ID_HPLIP}="1"
+# photosmart_470_series
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="1802", GROUP="lp", ENV{ID_HPLIP}="1"
+# photosmart_7150
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="3a02", GROUP="lp", ENV{ID_HPLIP}="1"
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="3b02", GROUP="lp", ENV{ID_HPLIP}="1"
+# photosmart_7200_series
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="b002", GROUP="lp", ENV{ID_HPLIP}="1"
+# photosmart_7345
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="2002", GROUP="lp", ENV{ID_HPLIP}="1"
+# photosmart_7350
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="3c02", GROUP="lp", ENV{ID_HPLIP}="1"
+# photosmart_7400_series
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="b802", GROUP="lp", ENV{ID_HPLIP}="1"
+# photosmart_7550
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="3e02", GROUP="lp", ENV{ID_HPLIP}="1"
+# photosmart_7600_series
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="b202", GROUP="lp", ENV{ID_HPLIP}="1"
+# photosmart_7700_series
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="b402", GROUP="lp", ENV{ID_HPLIP}="1"
+# photosmart_7800_series
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="c002", GROUP="lp", ENV{ID_HPLIP}="1"
+# photosmart_7900_series
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="b602", GROUP="lp", ENV{ID_HPLIP}="1"
+# photosmart_8000_series
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="c102", GROUP="lp", ENV{ID_HPLIP}="1"
+# photosmart_8100_series
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="ba02", GROUP="lp", ENV{ID_HPLIP}="1"
+# photosmart_8200_series
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="c202", GROUP="lp", ENV{ID_HPLIP}="1"
+# photosmart_8400_series
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="bb02", GROUP="lp", ENV{ID_HPLIP}="1"
+# photosmart_8700_series
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="bc02", GROUP="lp", ENV{ID_HPLIP}="1"
+# photosmart_a310_series
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="1d02", GROUP="lp", ENV{ID_HPLIP}="1"
+# photosmart_a320_series
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="1e02", GROUP="lp", ENV{ID_HPLIP}="1"
+# photosmart_a430_series
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="1902", GROUP="lp", ENV{ID_HPLIP}="1"
+# photosmart_a440_series
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="1f02", GROUP="lp", ENV{ID_HPLIP}="1"
+# photosmart_a510_series
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="1a02", GROUP="lp", ENV{ID_HPLIP}="1"
+# photosmart_a520_series
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="2602", GROUP="lp", ENV{ID_HPLIP}="1"
+# photosmart_a530_series
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="2b02", GROUP="lp", ENV{ID_HPLIP}="1"
+# photosmart_a610_series
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="1b02", GROUP="lp", ENV{ID_HPLIP}="1"
+# photosmart_a620_series
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="2702", GROUP="lp", ENV{ID_HPLIP}="1"
+# photosmart_a630_series
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="2c02", GROUP="lp", ENV{ID_HPLIP}="1"
+# photosmart_a710_series
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="1c02", GROUP="lp", ENV{ID_HPLIP}="1"
+# photosmart_a820_series
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="2902", GROUP="lp", ENV{ID_HPLIP}="1"
+# photosmart_d5060_series
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="c802", GROUP="lp", ENV{ID_HPLIP}="1"
+# photosmart_d5100_series
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="c402", GROUP="lp", ENV{ID_HPLIP}="1"
+# photosmart_d6100_series
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="c502", GROUP="lp", ENV{ID_HPLIP}="1"
+# photosmart_d7100_series
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="c602", GROUP="lp", ENV{ID_HPLIP}="1"
+# photosmart_d7300_series
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="c702", GROUP="lp", ENV{ID_HPLIP}="1"
+# photosmart_pro_b8300_series
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="be02", GROUP="lp", ENV{ID_HPLIP}="1"
+# photosmart_b8800_series
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="d002", GROUP="lp", ENV{ID_HPLIP}="1"
+# photosmart_pro_b9100_series
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="bd02", GROUP="lp", ENV{ID_HPLIP}="1"
+# Photosmart_B8500_series
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="d102", GROUP="lp", ENV{ID_HPLIP}="1"
+# Photosmart_A640_series
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="7902", GROUP="lp", ENV{ID_HPLIP}="1"
+
+# Check for Business Inkjet products (0x03f0xx12).
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="??12", GROUP="lp", ENV{ID_HPLIP}="1"
+# Check for Deskjet products (0x03f0xx04).
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="??04", GROUP="lp", ENV{ID_HPLIP}="1"
+# Check for LaserJet products (0x03f0xx17).
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="??17", GROUP="lp", ENV{ID_HPLIP}="1"
+# Check for LaserJet products (0x03f0xx2a).
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="??2a", GROUP="lp", ENV{ID_HPLIP}="1"
+# Check for DesignJet product (0x03f0xx14).
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="??14", GROUP="lp", ENV{ID_HPLIP}="1"
+
+LABEL="hpmud_rules_end"
+
diff --git a/data/rules/55-hpmud.rules b/data/rules/55-hpmud.rules
new file mode 100644
index 0000000..ec4b123
--- /dev/null
+++ b/data/rules/55-hpmud.rules
@@ -0,0 +1,153 @@
+# HPLIP udev rules file for HP printer and all-in-one products.
+#
+# Notes for downstream implementers.
+#
+# 1. The 55-hpmud.rules name was chosen in order to run after the default udev rule /etc/udev/rules.d/50-udev.rules. See
+# "Writing udev rules" Ver 0.74, Daniel Drake. Although it seems 50-udev.rules is no longer used I continue to reuse "55-"
+# name for backward compatibility with older distros. 2/11/2009, D Suffield
+#
+# 2. It seems SFSFS has been replaced or depreciated by ATTR/ATTRS, but I continue to use SFSFS in order to be compatible with
+# older distros. SFSFS was defined in "Writing udev rules" Ver 0.72, Daniel Drake. 2/11/2009, D Suffield
+#
+# 3. This rules file is an attempt at being compatable with all distros. Feel free to make your own changes and if you feel your
+# changes are not distro specific please send your patch to us. 2/11/2009, D Suffield
+#
+
+ACTION!="add", GOTO="hpmud_rules_end"
+SUBSYSTEM=="ppdev", OWNER="root", GROUP="lp", MODE="0660"
+SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", GOTO="hplip_pid_test"
+SUBSYSTEM!="usb_device", GOTO="hpmud_rules_end"
+
+LABEL="hplip_pid_test"
+
+# Check for AiO products (0x03f0xx11).
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="??11", OWNER="root", GROUP="lp", MODE="660"
+
+# Check for Photosmart products without wildcard since cameras and scanners also used (0x03f0xx02).
+# The xx02 pid has been retired so this explicit list should not change.
+# photosmart_d2300_series
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="c302", OWNER="root", GROUP="lp", MODE="660"
+# photosmart_100
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="3802", OWNER="root", GROUP="lp", MODE="660"
+# photosmart_1115
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="3402", OWNER="root", GROUP="lp", MODE="660"
+# photosmart_1215
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="3202", OWNER="root", GROUP="lp", MODE="660"
+# photosmart_1218
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="3302", OWNER="root", GROUP="lp", MODE="660"
+# photosmart_130
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="3902", OWNER="root", GROUP="lp", MODE="660"
+# photosmart_1315
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="3602", OWNER="root", GROUP="lp", MODE="660"
+# photosmart_140_series
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="1002", OWNER="root", GROUP="lp", MODE="660"
+# photosmart_230
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="3502", OWNER="root", GROUP="lp", MODE="660"
+# photosmart_240_series
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="1102", OWNER="root", GROUP="lp", MODE="660"
+# photosmart_320_series
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="1202", OWNER="root", GROUP="lp", MODE="660"
+# photosmart_330_series
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="1602", OWNER="root", GROUP="lp", MODE="660"
+# photosmart_370_series
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="1302", OWNER="root", GROUP="lp", MODE="660"
+# photosmart_380_series
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="1702", OWNER="root", GROUP="lp", MODE="660"
+# photosmart_420_series
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="1502", OWNER="root", GROUP="lp", MODE="660"
+# photosmart_470_series
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="1802", OWNER="root", GROUP="lp", MODE="660"
+# photosmart_7150
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="3a02", OWNER="root", GROUP="lp", MODE="660"
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="3b02", OWNER="root", GROUP="lp", MODE="660"
+# photosmart_7200_series
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="b002", OWNER="root", GROUP="lp", MODE="660"
+# photosmart_7345
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="2002", OWNER="root", GROUP="lp", MODE="660"
+# photosmart_7350
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="3c02", OWNER="root", GROUP="lp", MODE="660"
+# photosmart_7400_series
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="b802", OWNER="root", GROUP="lp", MODE="660"
+# photosmart_7550
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="3e02", OWNER="root", GROUP="lp", MODE="660"
+# photosmart_7600_series
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="b202", OWNER="root", GROUP="lp", MODE="660"
+# photosmart_7700_series
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="b402", OWNER="root", GROUP="lp", MODE="660"
+# photosmart_7800_series
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="c002", OWNER="root", GROUP="lp", MODE="660"
+# photosmart_7900_series
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="b602", OWNER="root", GROUP="lp", MODE="660"
+# photosmart_8000_series
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="c102", OWNER="root", GROUP="lp", MODE="660"
+# photosmart_8100_series
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="ba02", OWNER="root", GROUP="lp", MODE="660"
+# photosmart_8200_series
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="c202", OWNER="root", GROUP="lp", MODE="660"
+# photosmart_8400_series
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="bb02", OWNER="root", GROUP="lp", MODE="660"
+# photosmart_8700_series
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="bc02", OWNER="root", GROUP="lp", MODE="660"
+# photosmart_a310_series
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="1d02", OWNER="root", GROUP="lp", MODE="660"
+# photosmart_a320_series
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="1e02", OWNER="root", GROUP="lp", MODE="660"
+# photosmart_a430_series
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="1902", OWNER="root", GROUP="lp", MODE="660"
+# photosmart_a440_series
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="1f02", OWNER="root", GROUP="lp", MODE="660"
+# photosmart_a510_series
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="1a02", OWNER="root", GROUP="lp", MODE="660"
+# photosmart_a520_series
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="2602", OWNER="root", GROUP="lp", MODE="660"
+# photosmart_a530_series
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="2b02", OWNER="root", GROUP="lp", MODE="660"
+# photosmart_a610_series
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="1b02", OWNER="root", GROUP="lp", MODE="660"
+# photosmart_a620_series
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="2702", OWNER="root", GROUP="lp", MODE="660"
+# photosmart_a630_series
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="2c02", OWNER="root", GROUP="lp", MODE="660"
+# photosmart_a710_series
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="1c02", OWNER="root", GROUP="lp", MODE="660"
+# photosmart_a820_series
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="2902", OWNER="root", GROUP="lp", MODE="660"
+# photosmart_d5060_series
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="c802", OWNER="root", GROUP="lp", MODE="660"
+# photosmart_d5100_series
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="c402", OWNER="root", GROUP="lp", MODE="660"
+# photosmart_d6100_series
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="c502", OWNER="root", GROUP="lp", MODE="660"
+# photosmart_d7100_series
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="c602", OWNER="root", GROUP="lp", MODE="660"
+# photosmart_d7300_series
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="c702", OWNER="root", GROUP="lp", MODE="660"
+# photosmart_pro_b8300_series
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="be02", OWNER="root", GROUP="lp", MODE="660"
+# photosmart_b8800_series
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="d002", OWNER="root", GROUP="lp", MODE="660"
+# photosmart_pro_b9100_series
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="bd02", OWNER="root", GROUP="lp", MODE="660"
+# Photosmart_B8500_series
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="d102", OWNER="root", GROUP="lp", MODE="660"
+# Photosmart_A640_series
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="7902", OWNER="root", GROUP="lp", MODE="660"
+
+# Check for Business Inkjet products (0x03f0xx12).
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="??12", OWNER="root", GROUP="lp", MODE="660"
+# Check for Deskjet products (0x03f0xx04).
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="??04", OWNER="root", GROUP="lp", MODE="660"
+# Check for LaserJet products (0x03f0xx17).
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="??17", OWNER="root", GROUP="lp", MODE="660"
+# Check for LaserJet products (0x03f0xx2a).
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="??2a", OWNER="root", GROUP="lp", MODE="660"
+# Check for DesignJet product (0x03f0xx14).
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="??14", OWNER="root", GROUP="lp", MODE="660"
+
+# Removed the following rule because FHS states that /etc should be reserved for static files only. This
+# functionality should be done in a deb/rpm post install script. 2/11/2009, D Suffield
+#
+# If sane-bankends is installed add hpaio backend support to dll.conf if needed.
+# ENV{sane_hpaio}=="yes", RUN+="/bin/sh -c 'grep -q ^#hpaio /etc/sane.d/dll.conf;if [ $$? -eq 0 ];then sed -i -e s/^#hpaio/hpaio/ /etc/sane.d/dll.conf;else grep -q ^hpaio /etc/sane.d/dll.conf;if [ $$? -ne 0 ];then echo hpaio >>/etc/sane.d/dll.conf;fi;fi'"
+
+LABEL="hpmud_rules_end"
diff --git a/data/rules/56-hpmud_add_printer.rules b/data/rules/56-hpmud_add_printer.rules
new file mode 100644
index 0000000..6ebc840
--- /dev/null
+++ b/data/rules/56-hpmud_add_printer.rules
@@ -0,0 +1,11 @@
+# Load hp firmware for this printer.
+
+ACTION!="add", GOTO="hpmud_rules_end"
+
+#Check and add printer for Suse 10.3 distro
+SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="????", PROGRAM="/bin/sh -c 'logger -p user.info loading HP Device $env{BUSNUM} $env{DEVNUM}'", RUN+="/bin/sh -c '/usr/bin/hp-config_usb_printer $env{BUSNUM}:$env{DEVNUM} &'"
+
+#Check and add printer
+SUBSYSTEM=="usb_device", ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="????", PROGRAM="/bin/sh -c 'X=%k; X=$${X#usbdev}; B=$${X%%%%.*}; D=$${X#*.}; logger -p user.info loading HP Device $$B $$D; printf %%03i:%%03i $$B $$D'", RUN+="/bin/sh -c '/usr/bin/hp-config_usb_printer %c &'"
+
+LABEL="hpmud_rules_end"
diff --git a/data/rules/56-hpmud_support.rules b/data/rules/56-hpmud_support.rules
new file mode 100644
index 0000000..1487a12
--- /dev/null
+++ b/data/rules/56-hpmud_support.rules
@@ -0,0 +1,15 @@
+# HPLIP udev rules file. Notify console user if plugin support is required for this device.
+
+ACTION!="add", GOTO="hpmud_rules_end"
+SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", GOTO="pid_test"
+SUBSYSTEM!="usb_device", GOTO="hpmud_rules_end"
+
+LABEL="pid_test"
+
+# Check for LaserJet products (0x03f0xx17).
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="??17", ENV{hp_model}="$attrs{product}", ENV{hp_test}="yes"
+# Check for LaserJet products (0x03f0xx2a).
+ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="??2a", ENV{hp_model}="$attrs{product}", ENV{hp_test}="yes"
+ENV{hp_test}=="yes", RUN+="/bin/sh -c '/usr/bin/hp-mkuri -c &'"
+
+LABEL="hpmud_rules_end"
diff --git a/data/rules/86-hpmud_plugin.rules b/data/rules/86-hpmud_plugin.rules
new file mode 100755
index 0000000..97d037b
--- /dev/null
+++ b/data/rules/86-hpmud_plugin.rules
@@ -0,0 +1,9 @@
+# Load hp firmware for this printer.
+
+ACTION!="add", GOTO="hpmud_rules_end"
+
+# hp_Marvel_Device (These printer requires the plugin files. installling when device is detected)
+SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="??17", PROGRAM="/bin/sh -c 'logger -p user.info loading hp_printer_device $env{BUSNUM} $env{DEVNUM}'", RUN+="/bin/sh -c '/usr/bin/hp-check-plugin -m &'"
+SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="??2a", PROGRAM="/bin/sh -c 'logger -p user.info loading hp_printer_device $env{BUSNUM} $env{DEVNUM}'", RUN+="/bin/sh -c '/usr/bin/hp-check-plugin -m &'"
+
+LABEL="hpmud_rules_end"
diff --git a/debian/changelog b/debian/changelog
new file mode 100644
index 0000000..bd30932
--- /dev/null
+++ b/debian/changelog
@@ -0,0 +1,5085 @@
+hplip (3.12.4-12slp2) unstable; urgency=low
+
+ * Fixed not to build deprecated PPD API
+ * Git: slp/pkgs/h/hplip
+ * Tag: hplip_3.12.4-12slp2
+
+ -- GangHeok Kim <gangheok.kim@samsung.com> Thu, 13 Dec 2012 15:11:51 +0900
+
+hplip (3.12.4-11slp2) unstable; urgency=low
+
+ * Changed libjpeg-devel to libjpeg-turbo-devel
+ * Git: slp/pkgs/h/hplip
+ * Tag: hplip_3.12.4-11slp2
+
+ -- GangHeok Kim <gangheok.kim@samsung.com> Wed, 31 Oct 2012 19:45:52 +0900
+
+hplip (3.12.4-10slp2) unstable; urgency=low
+
+ * Fixed PLM issue(P121025-5717) that image is printed in wrong position
+ * Git: slp/pkgs/h/hplip
+ * Tag: hplip_3.12.4-10slp2
+
+ -- GangHeok Kim <gangeheok.kim@samsung.com> Tue, 30 Oct 2012 16:18:13 +0900
+
+hplip (3.12.4-9slp2) unstable; urgency=low
+
+ * Added license file
+ * Git: slp/pkgs/h/hplip
+ * Tag: hplip_3.12.4-9slp2
+
+ -- GangHeok Kim <gangheok.kim@samsung.com> Thu, 11 Oct 2012 18:53:56 +0900
+
+hplip (3.12.4-8slp2) unstable; urgency=low
+
+ * Added smack manifest file
+ * Git: slp/pkgs/h/hplip
+ * Tag: hplip_3.12.4-8slp2
+
+ -- GangHeok Kim <gangheok.kim@samsung.com> Fri, 21 Sep 2012 14:08:52 +0900
+
+hplip (3.12.4-7slp2) unstable; urgency=low
+
+ * Added tizen patch to fix and maintain hplip
+ * Git: slp/pkgs/h/hplip
+ * Tag: hplip_3.12.4-7slp2
+
+ -- GangHeok Kim <gangheok.kim@samsung.com> Tue, 18 Sep 2012 13:43:55 +0900
+
+hplip (3.12.4-6slp2) unstable; urgency=low
+
+ * Fixed not to use dbus in hpcups
+ * Git: slp/pkgs/h/hplip
+ * Tag: hplip_3.12.4-6slp2
+
+ -- GangHeok Kim <gangheok.kim@samsung.com> Fri, 14 Sep 2012 21:45:12 +0900
+
+hplip (3.12.4-5slp2) unstable; urgency=low
+
+ * Added SR note including SEL Verification
+ * Git: slp/pkgs/h/hplip
+ * Tag: hplip_3.12.4-5slp2
+
+ -- GangHeok Kim <gangheok.kim@samsung.com> Fri, 14 Sep 2012 11:18:26 +0900
+
+hplip (3.12.4-4slp2) unstable; urgency=low
+
+ * Upgrade to 3.12.4-4 from 3.11.7 to fix Jira defect(S1-6657)
+ * Git: slp/pkgs/h/hplip
+ * Tag: hplip_3.12.4-4slp2
+
+ -- GangHeok Kim <gangheok.kim@samsung.com> Thu, 13 Sep 2012 22:54:14 +0900
+
+hplip (3.11.7-9slp2) unstable; urgency=low
+
+ * Fixed hplip build error caused by desktop-file-util no-existence
+ * Git: slp/pkgs/h/hplip
+ * Tag: hplip_3.11.7-9slp2
+
+ -- GangHeok Kim <gangheok.kim@samsung.com> Thu, 16 Aug 2012 18:00:24 +0900
+
+hplip (3.11.7-8slp2) unstable; urgency=low
+
+ * Fixed hplip build error because libusb symbol was changed
+ * Git: slp/pkgs/h/hplip
+ * Tag: hplip_3.11.7-8slp2
+
+ -- GangHeok Kim <gangheok.kim@samsung.com> Sat, 28 Jul 2012 09:13:21 +0900
+
+hplip (3.11.7-7slp2) unstable; urgency=low
+
+ * Update version for submitting to SLP:Main as correct SR note
+ * Git: slp/pkgs/h/hplip
+ * Tag: hplip_3.11.7-7slp2
+
+ -- GangHeok Kim <gangheok.kim@samsung.com> Fri, 27 Jul 2012 13:30:13 +0900
+
+hplip (3.11.7-6slp2) unstable; urgency=low
+
+ * Changed hpcups filter to ignore SIGPIPE
+ * Git: slp/pkgs/h/hplip
+ * Tag: hplip_3.11.7-6slp2
+
+ -- GangHeok Kim <gangheok.kim@samsung.com> Thu, 26 Jul 2012 22:58:29 +0900
+
+hplip (3.11.7-5slp2) unstable; urgency=low
+
+ * Updated manifest for maintaining and disabled manifest
+ * Git: slp/pkgs/h/hplip
+ * Tag: hplip_3.11.7-5slp2
+
+ -- GangHeok Kim <gangheok.kim@samsung.com> Tue, 26 Jun 2012 20:37:54 +0900
+
+hplip (3.11.7-4slp2) unstable; urgency=low
+
+ * Fixed hplip postinst error
+ * Git: slp/pkgs/h/hplip
+ * Tag: hplip_3.11.7-4slp2
+
+ -- GangHeok Kim <gangheok.kim@samsung.com> Mon, 04 Jun 2012 09:02:59 +0900
+
+hplip (3.11.7-3slp2) unstable; urgency=low
+
+ * Fixed spec file for obs packaging
+ * Git: slp/pkgs/h/hplip
+ * Tag: hplip_3.11.7-3slp2
+
+ -- GangHeok Kim <gangheok.kim@samsung.com> Tue, 29 May 2012 19:34:32 +0900
+
+hplip (3.11.7-2slp2) unstable; urgency=low
+
+ * Modified debian and spec for sbs/obs packaging
+ * Git: slp/pkgs/h/hplip
+ * Tag: hplip_3.11.7-2slp2
+
+ -- GangHeok Kim <gangheok.kim@samsung.com> Tue, 08 May 2012 10:33:41 +0900
+
+hplip (3.11.7-1slp2) unstable; urgency=low
+
+ * initial commit
+ * Git: slp/pkgs/h/hplip
+ * Tag: hplip_3.11.7-1slp2
+
+ -- GangHeok Kim <gangheok.kim@samsung.com> Mon, 07 May 2012 16:54:27 +0900
+
+hplip (3.11.7-1ubuntu3.1) oneiric-proposed; urgency=low
+
+ * debian/patches/hpcups-top-margins-not-respected.dpatch: Reverted upstream
+ change which caused a regression in handling the upper margin by monochrome
+ laser printers in hpcups (LP: #890684, Red Hat bug #738089).
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Thu, 1 Dec 2011 12:26:00 +0100
+
+hplip (3.11.7-1ubuntu3) oneiric; urgency=low
+
+ * debian/patches/hp-systray-make-menu-title-visible-in-sni-qt-indicator.dpatch:
+ Simplified the construction of the title line of the hp-systray applet
+ menu, so that the applet-to-indicator converter sni-qt also imports this
+ title line (at least the text of it). Thanks to Aurelien Gateau for this
+ patch.
+ * debian/patches/hp-systray-make-menu-appear-in-sni-qt-indicator-with-kde.dpatch:
+ Make the menu of the hp-systray applet appearing when the applet is
+ converted to an indicator applet by sni-qt and put into the notification
+ area of KDE (LP: #857929).
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Tue, 27 Sep 2011 17:13:00 +0200
+
+hplip (3.11.7-1ubuntu2) oneiric; urgency=low
+
+ * debian/patches/hpfax-bug-function-used-before-importing-log.dpatch:
+ The hpfax CUPS backend uses its function bug() (which in turn uses log())
+ before log() gets imported (with base.g). Made use of log() in bug()
+ optional (LP: #560849).
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Fri, 23 Sep 2011 11:05:00 +0200
+
+hplip (3.11.7-1ubuntu1) oneiric; urgency=low
+
+ * debian/patches/mdns-py-typo.dpatch: Fixed typo in code (LP: #757899).
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Thu, 22 Sep 2011 08:47:00 +0200
+
+hplip (3.11.7-1) unstable; urgency=low
+
+ * New Upstream Release
+ * Fixes "please replace deprecated python-support with dh_python2"
+ 3.11.7-0ubuntu2 by Steve (Closes: #637268)
+
+ -- Mark Purcell <msp@debian.org> Sat, 03 Sep 2011 09:06:36 +1000
+
+hplip (3.11.7-0ubuntu5) oneiric; urgency=low
+
+ * debian/patches/mdns-py-network-printer-search-key-error.dpatch:
+ In some cases a search of network printers with the hp-setup utility
+ crashed with a key error (LP: #519430).
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Thu, 1 Sep 2011 00:42:00 +0200
+
+hplip (3.11.7-0ubuntu4) oneiric; urgency=low
+
+ * debian/control, debian/rules: Use new debhelper dh_pyppd to compress the
+ PPD files.
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Sun, 21 Aug 2011 23:59:00 +0200
+
+hplip (3.11.7-0ubuntu3) oneiric; urgency=low
+
+ * debian/hpijs.ppd-updater, debian/hplip-cups.ppd-updater,
+ debian/hplip.ppd-updater, debian/hpijs-ppds.ppd-updater: Added data files
+ to trigger the update of the PPD files of existing print queues by CUPS
+ and to tell CUPS which PPD files to use for the update and how to match
+ them with the PPDs of the existing queues.
+ * debian/hplip.postinst: Removed the repeated code for updating the PPD
+ files of existing print queues. This code is now centralized in the
+ cups package, as a trigger.
+ * debian/hpijs.postinst, debian/hplip-cups.postinst,
+ debian/hpijs-ppds.postinst: Removed the post-install scripts which only
+ contain the code for updating the PPDs of existing print queues.
+ * debian/hpijs.install, debian/hplip-cups.install, debian/hplip.install,
+ debian/hpijs-ppds.install, debian/rules: Install the *.ppd-updater
+ file of each printer driver/PPD package in the /usr/share/cups/ppd-updaters
+ directory.
+ * debian/control: Removed the dependency on cups-client from the printer
+ driver/PPD packages, as we do not call the command line utilities of CUPS
+ in the post-install scripts any more. Also removed the dependency on CUPS
+ from the hpijs and hpijs-ppds packages.
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Wed, 17 Aug 2011 10:26:00 +0200
+
+hplip (3.11.7-0ubuntu2) oneiric; urgency=low
+
+ * debian/patches/cups-1.5.0-compatibility.dpatch: directly include
+ cups/ppd.h, for compatibility with cups 1.5.0.
+ * switch from the deprecated python-support to dh_python2.
+
+ -- Steve Langasek <steve.langasek@ubuntu.com> Wed, 10 Aug 2011 00:39:24 +0000
+
+hplip (3.11.7-0ubuntu1) oneiric; urgency=low
+
+ * New upstream release
+ o Fixed missing leading "/" in /bin/sh call in 56-hpmud_support.rules
+ (LP: #795759).
+ o Added support for: HP DeskJet 3050A J611 series, LaserJet 100 Color
+ MFP M175, LaserJet Professional M1216nfh MFP, M1219nf MFP.
+ o Bug fixes.
+ * debian/patches/udev-rules-use-attrs-not-sysfs-and-hp-mkuri-call-fix.dpatch:
+ Regenerated.
+ * debian/patches/hplip-syslog-fix-debug-messages-to-error.dpatch: Debug
+ messages were reported as errors and so cluttered the syslog (LP: #816763).
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Thu, 28 Jul 2011 09:57:00 +0200
+
+hplip (3.11.5-2ubuntu1) oneiric; urgency=low
+
+ * debian/rules: Added "-dNOINTERPOLATE" to all Ghostscript command lines
+ defined in the HPLIP package: PPD generator hpijs.drv for HPIJS,
+ ready-made PPDs for HPIJS (hpijs-ppds package), Fax PPDs, pstotiff
+ CUPS filter. This makes the page rendering by Ghostscript significantly
+ faster.
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Sun, 24 Jul 2011 20:50:00 +0200
+
+hplip (3.11.5-2) unstable; urgency=low
+
+ [ Till Kamppeter ]
+ * debian/control: Build-Depend on libjpeg-dev instead of libjpeg62-dev,
+ so that the package also builds with libjpeg8 (Closes: #634030).
+
+ [ Mark Purcell ]
+ * Ack NMU - Thanks Luk
+ - Fix "diff for NMU version 3.11.5-1.1" (Closes: #631008)
+
+ -- Mark Purcell <msp@debian.org> Sat, 16 Jul 2011 20:24:28 +1000
+
+hplip (3.11.5-1.1) unstable; urgency=low
+
+ * Non-maintainer upload.
+ * Don't ship .la files (Closes: #621591).
+ * Add missing '/' in bin/sh calls (Closes: #630648, #600673).
+
+ -- Luk Claes <luk@debian.org> Sun, 19 Jun 2011 19:04:01 +0200
+
+hplip (3.11.5-1ubuntu1) oneiric; urgency=low
+
+ * debian/patches/udev-rules-use-attrs-not-sysfs-and-hp-mkuri-call-fix.dpatch:
+ Added the missing '/' in the "bin/sh" calles, to assure that they work in
+ all situations.
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Fri, 10 Jun 2011 21:00:00 +0200
+
+hplip (3.11.5-1) unstable; urgency=low
+
+ * New Upstream Release
+ * Updated Homepage:
+
+ -- Mark Purcell <msp@debian.org> Fri, 27 May 2011 21:16:17 +1000
+
+hplip (3.11.5-0ubuntu1) oneiric; urgency=low
+
+ * New upstream release
+ o Added LEDM ADF Scan support
+ o Added LEDM Wireless support
+ o "/cupsInteger0 <PCL page size number>" is added to the PageSize option
+ of the hpcups driver, not only in PageRegion (Upstream fix for Debian
+ bug #518227, LP: #405116, Red Hat bug #518756).
+ o Fixed HP Laserjet 1020 printing negative images and photos (LP: #754383).
+ o ADF now recognised on HP Officejet Pro 8500 A910a (LP: #776509).
+ o Added new option "Installed Cartridges" to enable users to select
+ correct installed cartridges for printing (Partial upstream fix for
+ LP: #235399, currently only applied to the hpcups driver, for the hpijs
+ driver we continue with the Debian/Ubuntu patch).
+ o Margin issues fixed on HP OfficeJet 7500 E910, 6500 e710n-z, LaserJet
+ m1319f MFP
+ o Removed scan icon in toolbox for HP Color LaserJet CM4540 MFP (scanner
+ is network-only).
+ o Fixed "Download Firmware" link in Action tab with HP LaserJet P1566.
+ o Redundant PostScript PPDs are removed.
+ o Added support for: HP Designjet T790ps 24in/44in, T1300 Postscript,
+ LaserJet M4555 MFP, LaserJet Professional m1214nfh MFP
+ * debian/patches/add-lidil-two-cartridge-modes.dpatch: Adapted to the partial
+ upstream fix.
+ * debian/patches/workaround-sf-server-bug-for-plugin-index-download.dpatch:
+ Removed, fixed upstream.
+ * debian/rules: Removed modification of the PPD generator for hpcups, as
+ the missing "/cupsInteger0 <PCL page size number>" in the PostScript code
+ of the PageSize option is fixed upstream.
+ * debian/patches/large-sizes-borderless-on-photosmart-pro-b-series.dpatch:
+ The HP PhotoSmart Pro B 8xxx printers are capable of borderless printing
+ on all paper sizes including the large formats. The HPLIP-supplied PPD
+ allowed borderless only up to Legal size (LP: #787580).
+ * debian/patches/more-user-friendly-choice-names-for-installed-cartridges.dpatch:
+ Make the menu entry strings for the "Installed Cartridges" option (on LIDIL
+ printers) more user-friendly.
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Thu, 26 May 2011 13:33:18 +0200
+
+hplip (3.11.1-3) unstable; urgency=low
+
+ [ Till Kamppeter ]
+ * debian/rules: Modified PPD generator for hpcups so that the PostScript
+ code for the "PageSize" option also sets the PCL paper size
+ ("/cupsInteger0 XX") and not only PageRegion (Closes: #518227,
+ LP: #405116, Red Hat bug #518756).
+
+ [ Mark Purcell ]
+ * Make BinNMU safe
+ * hplip Depends: libsane-hpaio (= ${hplip:binary:Version})
+ - Fixes "depends on libsane-hpaio 3.11.1-2 instead of 3.11.1-2+b1"
+ (Closes: #622598)
+ * hplip-gui Depends: hplip (>= ${hplip:source:Version})
+ - Fixes "binNMU is not installable" (Closes: #622602)
+ * hplip-ppds Depends: hpijs (>= ${hpijs:source:Version})
+ - Fixes "Uninstallable due to not binNMU safe" (Closes: #622596)
+
+ -- Mark Purcell <msp@debian.org> Sat, 16 Apr 2011 08:46:43 +1000
+
+hplip (3.11.1-2ubuntu2) natty; urgency=low
+
+ * debian/patches/workaround-sf-server-bug-for-plugin-index-download.dpatch:
+ In order to download the proprietary plug-in (firmware files, driver
+ add-ons), the "hp-plugin" utility downloads an index file from SourceForge.
+ Due to software changes at SourceForge which introduced a bug, Python's
+ urllib is not able any more to download this file, making the plug-in
+ download via "hp-plugin" impossible. HP has quickly released HPLIP 3.11.3a
+ which works around the problem by using the command line utility "wget".
+ This patch is a backport of the workaround (LP: #740140).
+
+ * debian/control: Let hplip depend on wget. wget is needed for the plugin
+ download now.
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Fri, 25 Mar 2011 17:08:18 +0100
+
+hplip (3.11.1-2ubuntu1) natty; urgency=low
+
+ * debian/rules: Modified PPD generator for hpcups so that the PostScript
+ code for the "PageSize" option also sets the PCL paper size
+ ("/cupsInteger0 XX") and not only PageRegion (Closes: #518227,
+ LP: #405116, Red Hat bug #518756).
+ * debian/control, debian/rules, debian/local/pyppd: Use external pyppd
+ package for the compression of the PostScript PPDs.
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Thu, 10 Mar 2011 12:41:18 +0100
+
+hplip (3.11.1-2) unstable; urgency=low
+
+ * Upload to unstable
+ - Fixes "[hplip] New upstream version" (Closes: #613295)
+ * Drop obsolete 00patch-opts "patch: invalid option -- 'U'" (Closes: #612646)
+ * kdeprint no longer Depends: (Closes: #608947)
+ * "ppd" included in description" (Closes: #608836)
+ * Fixes "sane" lowercase in extended description" (Closes: #591919)
+
+ -- Mark Purcell <msp@debian.org> Sun, 20 Feb 2011 21:20:06 +1100
+
+hplip (3.11.1-1) experimental; urgency=low
+
+ * New Upstream Release
+ - Fixes "CVE-2010-4267: Buffer overflow" (Closes: #610960)
+ * SECURITY UPDATE: denial of service and possible arbitrary code
+ execution via long SNMP response
+
+ -- Mark Purcell <msp@debian.org> Thu, 27 Jan 2011 00:26:43 +1100
+
+hplip (3.11.1-0ubuntu2) natty; urgency=low
+
+ * SECURITY UPDATE: denial of service and possible arbitrary code
+ execution via long SNMP response
+ - debian/patches/CVE-2010-4267.dpatch: validate dLen in io/hpmud/pml.c.
+ - CVE-2010-4267
+
+ -- Marc Deslauriers <marc.deslauriers@ubuntu.com> Mon, 24 Jan 2011 13:20:33 -0500
+
+hplip (3.11.1-0ubuntu1) natty; urgency=low
+
+ * New upstream release
+ o New encapsulation format for LJZJStream class
+ o Alignment of cartridges over LEDM (auto, semi-automatic and manual)
+ o LEDM dynamic scan resolution
+ o New fax protocol (Low End Data Model, LEDM) support
+ o ADF scan support for HP LaserJet Pro M1212nf, M1213nf, and M1217nfw MFP
+ devices
+ o Color scan support for HP LaserJet Pro M1132, M1136, M1212nf, M1213nf,
+ and M1217nfw MFP devices
+ o Added support for: HP LaserJet Pro CP1020, M1213nf MFP, CM1410,
+ LaserJet M1536dnf MFP, M1537dnf MFP, M1538dnf MFP, M1539dnf MFP.
+ Color LaserJet CM4540 MFP, CP5520, Photosmart Ink Adv K510,
+ Deskjet Ink Adv 2010 K010, 2060 K110, Officejet 6500 E710a-f
+ * debian/patches/scan-on-dj-1050-2050.dpatch: Removed, fixed upstream.
+ * debian/patches/85_rebuild_python_ui.dpatch,
+ debian/patches/87_move_documentation.dpatch: Regenerated.
+ * debian/control: Removed stand-alone print dialog applications from the
+ Suggests: of the hplip package. These applications are obsolete, as
+ modern desktop applications already have a CUPS-based printing dialog.
+ Added system-config-printer instead (Closes: #608947).
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Sun, 23 Jan 2010 23:34:18 +0100
+
+hplip (3.10.9-1) experimental; urgency=low
+
+ * New Upstream Release
+
+ -- Mark Purcell <msp@debian.org> Thu, 23 Dec 2010 11:04:31 +1100
+
+hplip (3.10.9-0ubuntu7) natty; urgency=low
+
+ * debian/patches/scan-on-dj-1050-2050.dpatch: Corrected model properties
+ to make scanning on DeskJet 1050 and 2050 actually working (LP: #652963)
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Sat, 11 Dec 2010 14:10:18 +0100
+
+hplip (3.10.9-0ubuntu6) natty; urgency=low
+
+ * debian/rules: Do not ship *.pyc files with the package.
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Fri, 10 Dec 2010 11:10:18 +0100
+
+hplip (3.10.9-0ubuntu5) natty; urgency=low
+
+ * debian/control: Remove hard-coded python-version dependencies (LP: #688002)
+
+ -- Stefano Rivera <stefanor@ubuntu.com> Fri, 10 Dec 2010 10:27:59 +0200
+
+hplip (3.10.9-0ubuntu4) natty; urgency=low
+
+ * debian/control: Modify Depends: and XS-Python-Versions: to build with,
+ and depend on python 2.7 (LP: #688002).
+
+ -- Bilal Akhtar <bilalakhtar@ubuntu.com> Fri, 10 Dec 2010 11:06:14 +0300
+
+hplip (3.10.9-0ubuntu3) natty; urgency=low
+
+ * Rebuild for python2.7 as the default python version.
+
+ -- Matthias Klose <doko@ubuntu.com> Thu, 09 Dec 2010 16:41:27 +0100
+
+hplip (3.10.9-0ubuntu2) natty; urgency=low
+
+ * debian/patches/add_missing_newline_for_error_log.dpatch: Added a missing
+ newline at the end of the "PAGE:" message for the CUPS error_log.
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Tue, 7 Dec 2010 10:59:18 +0100
+
+hplip (3.10.9-0ubuntu1) natty; urgency=low
+
+ * New upstream release
+ o New protocol LEDM support for scanning (Low End Data Model).
+ o Added support for: HP Designjet 4500ps, 4500mfp, T1100ps 24/44in,
+ T1120ps 24/44in, T770ps 24in, Deskjet 1000 J110, 2000 J210, 3000
+ J310, 3050 J610, Envy 100 D410, Officejet 6500 E710n-z, 7500 E910,
+ pro 8500 A910, Photosmart eStn C510, Plus B210, Prem C310, Prem
+ C410.
+ * debian/patches/85_rebuild_python_ui.dpatch: Regenerated.
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Tue, 7 Dec 2010 09:55:18 +0100
+
+hplip (3.10.6-1.1) unstable; urgency=low
+
+ * Non-maintainer upload.
+ * Try libhpmud.so.0 when libhpmud.so is not found.
+ Closes: #600670
+
+ -- Evgeni Golov <evgeni@debian.org> Wed, 20 Oct 2010 17:57:23 +0200
+
+hplip (3.10.6-1ubuntu11) natty; urgency=low
+
+ * debian/local/make-duplex-page-sizes-default.sh, debian/rules: Renamed
+ paper sizes so that the duplex paper sizes (the ones with the tightest
+ unprintable margins) get the standard ones and the former standard sizes
+ get optional "Small Margins" sizes. This makes it possible to print
+ duplex from current desktop applications like OpenOffice.org or GNOME
+ applications (LP: #487695).
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Wed, 10 Nov 2010 10:50:03 +0100
+
+hplip (3.10.6-1ubuntu10) maverick; urgency=low
+
+ * debian/local/pyppd/pyppd/: Updated to pyppd 0.4.9, to suppress runtime
+ error tracebacks by putting a "try: ... except ...: pass" construct around
+ the main function call. This avoids Apport pop-ups when the execution of the
+ self-extracting compressed PPD file archives gets stopped by the calling
+ process (LP: #618017).
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Wed, 22 Sep 2010 13:23:03 +0200
+
+hplip (3.10.6-1ubuntu9) maverick; urgency=low
+
+ * debian/local/pyppd/pyppd/ppd.py, debian/local/pyppd/pyppd/pyppd-ppdfile.in:
+ Let the compressed PPD archives not contain duplicate PPD URIs, even if the
+ lines reference the same PPD. Most printer setup tools cannot cope with
+ duplicate PPD URIs.
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Wed, 16 Sep 2010 00:28:03 +0200
+
+hplip (3.10.6-1ubuntu8) maverick; urgency=low
+
+ * debian/patches/add-lidil-two-cartridge-modes.dpatch: For the Lidil printers
+ enable two-cartridge modes (black and color cartridge) in the hpcups driver
+ and assign the choices of the "Printout Mode" option to two-cartridge
+ moddes in the hpijs driver (LP: #235399).
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Tue, 14 Sep 2010 16:15:00 +0200
+
+hplip (3.10.6-1ubuntu7) maverick; urgency=low
+
+ * debian/control: libsane-hpaio actually works without hplip, it only needs
+ a few selected files from hplip. What was still missing was
+ /etc/hp/hplip.conf. So moved over /etc/hp/hplip.conf to libsane-hpaio,
+ made libsane-hpaio only recommending hplip and hplip depending on
+ libsane-hpaio again, as hplip also does not work without /etc/hp/hplip.conf.
+ This configuration allows minumum setups for HP MF device support without
+ hplip, only using one of hpijs and hpcups for the printer and libsane-hpaio
+ for the scanner (Closes: #596467).
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Mon, 13 Sep 2010 09:09:00 +0200
+
+hplip (3.10.6-1ubuntu6) maverick; urgency=low
+
+ * debian/control: Made libsane-hpaio depend on hplip and not vice versa
+ (Closes: #596467). Let hplip recommend libsane-hpaio to not break Ubuntu
+ standard installation.
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Sun, 12 Sep 2010 12:00:00 +0200
+
+hplip (3.10.6-1ubuntu5) maverick; urgency=low
+
+ * debian/rules: Let PPD files of hpijs-ppds use "foomatic-rip" as CUPS
+ filter and not "foomatic-rip-hplip". This avoids an ugly link and
+ problems when uninstalling hpijs-ppds.
+ * debian/hpijs-ppds.links: Remove the ugly "foomatic-rip-hplip" link from
+ hpijs-ppds.
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Sun, 15 Aug 2010 00:56:03 +0200
+
+hplip (3.10.6-1ubuntu4) maverick; urgency=low
+
+ * debian/control: Make user aware of that the tools in hplip-gui are Qt-based
+ (LP: #570842).
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Sat, 14 Aug 2010 10:57:03 +0200
+
+hplip (3.10.6-1ubuntu3) maverick; urgency=low
+
+ * debian/rules: Running PPD compressor inplace did not work on the build
+ servers due to the .diff.gz not able to convey the empty file
+ pyppd/__init__.py. Re-added the file via "touch pyppd/__init__.py".
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Wed, 11 Aug 2010 17:37:03 +0200
+
+hplip (3.10.6-1ubuntu2) maverick; urgency=low
+
+ * debian/control: Added build and runtime dependencies for the PPD archiving
+ and extracting.
+ * debian/rules: Let build process error out if PPD archiving errors out.
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Wed, 11 Aug 2010 11:31:03 +0200
+
+hplip (3.10.6-1ubuntu1) maverick; urgency=low
+
+ * debian/local/pyppd/, debian/rules: Compressed all the physical PPD files
+ for the PostScript printers of the hplip-data package into an archiv file
+ reducing the disk space occupation by a factor of 10, freeing several tens
+ of megabytes on the Ubuntu Desktop CDs (or on any live CD based on Debian
+ or a derivative distribution). The archives are self-extracting and located
+ in /usr/lib/cups/driver/, so that CUPS automatically extracts the PPD
+ files. Thank you very much to Vitor Baptista who developed this great PPD
+ compressor in the Google Summer of Code 2010 (LP: #493282).
+ * debian/hplip.postinst: Updated auto updater for the PPDs of the already
+ existing print queues to work with the new PPD archive.
+ * debian/control: Changed versioned conflict of hpijs-ppds with
+ foomatic-filters-ppds. Now it conflicts for versions bigger than
+ 20000101 (real foomatic-filters-ppds packages) and not with
+ foomatic-filters-ppds with a small version number (transitional packages).
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Tue, 10 Aug 2010 23:16:18 +0200
+
+hplip (3.10.6-1) unstable; urgency=low
+
+ * New Upstream Release
+ * NEW package libsane-hplip - headless scanner libs
+ * udev/rules.d/40-hplip.rules -> libhpmud0 - headless printing
+ * fixup debian/shlibs -> shlibs.libhpmud0
+
+ -- Mark Purcell <msp@debian.org> Sat, 24 Jul 2010 13:50:37 +1000
+
+hplip (3.10.6-0ubuntu1) maverick; urgency=low
+
+ * New upstream release
+ o New protocol LEDM support for device status over Network and USB.
+ o Do not use cups-config in hp-check (real fix for LP: #530327).
+ o Added support for: HP Photosmart All-in-one Printer - b010,
+ Photosmart Wireless All-in-one Printer - b110, Deskjet 1050 j410
+ All-in-one Printer, LaserJet Professional m1136 Multifunction
+ Printer, Deskjet 2050 j510 All-in-one Printer, Officejet 4500
+ All-in-one Printer - k710, Officejet 4500 g510n-z All-in-one Printer
+ * debian/patches/hpcheck-cupsconfig-warn.dpatch: Removed, fixed upstream.
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Fri, 23 Jul 2010 16:15:18 +0200
+
+hplip (3.10.5-4ubuntu1) maverick; urgency=low
+
+ [ Till Kamppeter ]
+ * debian/patches/black-stripes-on-pcl5c-printouts.dpatch: The PCL 5c
+ driver (Color LaserJet) printed blank raster lines in black (LP: #561264).
+
+ [ Mark Purcell ]
+ * Split libsane-hplip - headless scanner libs
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Sun, 18 Jul 2010 12:15:18 +0200
+
+hplip (3.10.5-4) unstable; urgency=high
+
+ * Force Depends: python (>> 2.6), python (<< 2.7) (Closes: #587737)
+ - Urgency high for RC bug
+ * Ack python transition NMUs - Thanks Bernd
+
+ -- Mark Purcell <msp@debian.org> Sat, 03 Jul 2010 13:09:53 +1000
+
+hplip (3.10.5-3ubuntu3) maverick; urgency=low
+
+ * debian/control: Added alternative scanning frontends to the Recommends:
+ of hplip-gui, to avoid installing a scanning frontend if there is already
+ one and also to avoid installing GTK in KDE/Qt-only systems.
+ * debian/control: Added python-notify to the Recommends: of hplip-gui.
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Thu, 1 Jul 2010 09:47:18 +0200
+
+hplip (3.10.5-3ubuntu2) maverick; urgency=low
+
+ * debian/control: Drop python-notify to suggests, it's pulling half of
+ the desktop into server images.
+
+ -- Martin Pitt <martin.pitt@ubuntu.com> Thu, 01 Jul 2010 08:38:35 +0200
+
+hplip (3.10.5-3ubuntu1) maverick; urgency=low
+
+ * debian/copyright: Updated.
+ * debian/control: Removed hpijs from Recommends: of hplip, as we already
+ require hplip-cups via Depends:, hpijs is not needed any more for using
+ HPLIP with all supported HP printers.
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Wed, 30 Jun 2010 13:31:18 +0200
+
+hplip (3.10.5-3.2) unstable; urgency=low
+
+ * Non-maintainer upload.
+ * Remove unnecessary module path option for dh_pysupport.
+ * Call dh_installdeb after dh_pysupport. This really
+ closes: #585627
+
+ -- Bernd Zeimetz <bzed@debian.org> Tue, 22 Jun 2010 21:37:37 +0200
+
+hplip (3.10.5-3.1) unstable; urgency=high
+
+ * Non-maintainer upload.
+ * Remove the need of Python as pre-dependency of hplip.
+ * Call dh_pysupport for arch:any packages (Closes: #585627)
+ * Use /usr/share/python/python.mk:
+ Instead of hard-coding PYTHONPATH, use the proper path depending on the
+ default Python version.
+
+ -- Bernd Zeimetz <bzed@debian.org> Sun, 20 Jun 2010 22:10:09 +0200
+
+hplip (3.10.5-3) unstable; urgency=high
+
+ * Switch Depends: hplip:source:Version (Closes: #586385) fixes binNMU
+ - Urgency high for RC bug
+
+ -- Mark Purcell <msp@debian.org> Sat, 19 Jun 2010 11:30:26 +1000
+
+hplip (3.10.5-2) unstable; urgency=low
+
+ * Add Depends: python-notify
+ * hplip-gui Add ${python:Depends}
+ * Add +XS-Python-Version: >= 2.5 (Closes: #585627)
+ * Add debhelper-but-no-misc-depends
+ * Update Standards-Version: 3.8.4 - no changes necessary
+ * *.lintian possible-gpl-code-linked-with-openssl
+ - it uses none of its symbols
+ * Drop obsolete hpijs[-ppds].NEWS - debian-news-entry-has-unknown-version
+ * hplip.manpages: drop hp-hpdio.1 - empty-manual-page
+ * Move more GUI components to hplip-gui
+ - Replaces: hplip (<= 3.10.5-1ubuntu1)
+ - hp-fab: -> hplip-gui.install -> hplip-gui.manpages
+ - hp-toolbox.1 -> hplip-gui.manpages
+ - usr/share/pixmaps -> hplip-gui.install
+ - mv hplip.menu -> hplip-gui.menu - menu-command-not-in-package
+ - Fixes "Icons in notifications missing" (Closes: #581785)
+ * CUPS/gs segfaults addressed (Closes: #503468)
+ * hplip Depends: Switch to hpcups as default driver (Closes: #579170)
+
+ -- Mark Purcell <msp@debian.org> Mon, 14 Jun 2010 19:32:20 +1000
+
+hplip (3.10.5-1ubuntu1) maverick; urgency=low
+
+ * Uploaded new upstream version also to Ubuntu.
+ * debian/hplip-cups.postinst, debian/hpijs.postinst: Switch to hpcups as
+ default driver (migrate HPIJS queues to hpcups). The problem of Ghostscript
+ segfaulting when generating CUPS raster data is solved and the hpcups
+ driver needs also more testing.
+ * debian/control: Added conflict definition to the hplip package for smooth
+ updating after moving /usr/bin/hp-chjeck back to hplip.
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Thu, 3 Jun 2010 15:36:18 +0200
+
+hplip (3.10.5-1) unstable; urgency=low
+
+ * New upstream release
+ * Move hp-check back to hplip package - missing cups-config -> warning
+ * Added +hpcheck-cupsconfig-warn.dpatch
+ * Refresh udev-rules-use-attrs-not-sysfs-and-hp-mkuri-call-fix.dpatch
+ * Remove hp-systray-segfault-on-quit.dpatch - included upstream
+
+ -- Mark Purcell <msp@debian.org> Fri, 21 May 2010 18:51:43 +1000
+
+hplip (3.10.2-3) unstable; urgency=low
+
+ * Fix "[hpijs-ppds] missing A3 media size for HP Color Inkjet cp1700"
+ Till reworked c1700 dpatch (Closes: #503621)
+
+ -- Mark Purcell <msp@debian.org> Tue, 13 Apr 2010 06:45:34 +1000
+
+hplip (3.10.2-2ubuntu2) lucid; urgency=low
+
+ * debian/hplip-dbg.install, debian/hplip.install, debian/control: Moved
+ hp-check into hplip-dbg, as it is a debugging tool. Added dependency
+ on libcups2-dev to hplip-dbg, as hp-check needs cups-config
+ (LP: #530327).
+ * debian/hplip-cups.postinst, debian/hpijs.postinst,
+ debian/hpijs-ppds.postinst: Updated also PPDs with version numbers like
+ 3.10.2rc1.9.
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Mon, 12 Apr 2010 10:55:18 +0200
+
+hplip (3.10.2-2ubuntu1) lucid; urgency=low
+
+ * debian/control: As we use HPIJS as default printer driver flavor again,
+ let the "hplip" package recommend the "hpijs" package and not the
+ "hplip-cups" package.
+ * debian/patches/remove-duplicate-entry-for-cp1700-in-drv-files.dpatch,
+ debian/non-shipped-files.txt: Removed duplicate entry for the HP Color
+ Inkjet Printer 1700, the wrong entry missed also the large (A3,
+ SuperB, ...) paper sizes (LP: #290559).
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Sun, 11 Apr 2010 09:55:18 +0200
+
+hplip (3.10.2-2) unstable; urgency=low
+
+ * Fix "can't add printer (Printer queue setup failed)" added debian/hplip.NEWS
+ - CUPS requires user to be a member of lpadmin group. (Closes: #566692)
+ * Patch hp-check to check for group membership of lp & lpadmin
+ - Fixes "start/stop button should fail with permission error dialog if
+ not member of lpadmin" (Closes: #572247)
+ * Add Recommends: avahi-daemon "HP Color Laserjet CM1312nfi" (Closes: #564520)
+ * Fix "[hplip-cups] Page background is printed black" switch back to HPIJS as
+ default driver (migrate hpcups queues to HPIJS) (Closes: #568377)
+ * Fix "hpijs_readme.html mentioned in man page does not exist"
+ - Removed reference (Closes: #561125)
+
+ -- Mark Purcell <msp@debian.org> Sun, 11 Apr 2010 14:26:01 +1000
+
+hplip (3.10.2-1ubuntu5) lucid; urgency=low
+
+ [ Till Kamppeter ]
+ * debian/patches/make-commafy-correctly-work-with-python-2.dpatch:
+ Installation of the proprietary plug-in did not work with some locales
+ (LP: #525901).
+ * debian/hplip-cups.postinst, debian/hpijs.postinst: Switch back to HPIJS as
+ default driver (migrate hpcups queues to HPIJS) as there are new problems
+ with hpcups (LP: #553573, LP: #539708, LP: #538031, LP: #405116).
+
+ [ Mark Purcell ]
+ * Fix "can't add printer (Printer queue setup failed)" added debian/hplip.NEWS
+ - CUPS requires user to be a member of lpadmin group. (Closes: #566692)
+ * Add Recommends: avahi-daemon "HP Color Laserjet CM1312nfi" (Closes: #564520)
+ * Add bug/presubj to hplip-cups, hplip-gui & hpijs
+ * Add hplip-cups.NEWS
+ * bug/script provide status message before hp-check
+ * Patch hp-check to check for group membership of lp & lpadmin
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Fri, 9 Apr 2010 21:26:18 +0200
+
+hplip (3.10.2-1ubuntu4) lucid; urgency=low
+
+ * debian/patches/hp-systray-segfault-on-quit.dpatch: Fixed a hp-systray to
+ not segfaulting when quitting the program (LP: #546816).
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Thu, 25 Mar 2010 13:51:18 +0100
+
+hplip (3.10.2-1ubuntu3) lucid; urgency=low
+
+ * debian/patches/simple-scan-as-default.dpatch: Make simple-scan the default
+ scanning frontend (LP: #539015).
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Wed, 24 Mar 2010 09:13:18 +0100
+
+hplip (3.10.2-1ubuntu2) lucid; urgency=low
+
+ * debian/control: Added lsb-release to the build dependencies, as we use
+ lsb_release to determine whether we build on Ubuntu, to do Ubuntu-specific
+ steps.
+ * debian/rules, debian/hplip.install: Install hp-plugin-ubuntu directly
+ into debian/hplip/, as we cannot use debian/hplip.install for this Ubuntu-
+ specific file.
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Tue, 23 Mar 2010 13:11:18 +0100
+
+hplip (3.10.2-1ubuntu1) lucid; urgency=low
+
+ * debian/hplip.install: let /usr/bin/hp-plugin-ubuntu get installed.
+ * debian/patches/hp-mkuri-take-into-account-already-installed-plugin-also-for-exit-value.dpatch:
+ The hp-mkuri utility did not take into account whether the proprietary
+ plugin is already installed when returning its exit value.
+ * debian/patches/ubuntu-hp-mkuri-send-dbus-signal-to-update-notifier.dpatch,
+ debian/patches/ubuntu-hp-mkuri-notification-text.dpatch: Replaced the
+ Ubuntu-specific patch for hp-mkuri, as we do not need to send a D-Bus
+ message any more.
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Tue, 16 Mar 2010 18:33:18 +0100
+
+hplip (3.10.2-1) unstable; urgency=low
+
+ * New Upstream Release
+ * debian/patches/udev-rules-use-attrs-not-sysfs.dpatch
+ - Fixes "/lib/udev/rules.d/56-hpmud_support.rules: udev warnings:
+ SYSFS{}= will be removed in a future udev version..." (Closes: #559289)
+
+ -- Mark Purcell <msp@debian.org> Tue, 02 Mar 2010 13:32:59 +1100
+
+hplip (3.10.2-0ubuntu1) lucid; urgency=low
+
+ * New upstream release
+ o Final 3.10.2 release
+ o Removed device IDs from the PostScript PPDs again
+ o Support for *.types and *.convs files in /usr/share/cups/mime/
+ * debian/hplip.install: "make install" puts *.types and *.convs files into
+ /usr/share/cups/mime/ now.
+ * debian/hpijs.postinst: Corrected regexps for the PPD NickName so that this
+ package does not migrate existing hpcups-based fax queues to HPIJS.
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Fri, 26 Feb 2010 14:33:18 +0100
+
+hplip (3.10.2~rc1-0ubuntu3) lucid; urgency=low
+
+ * debian/hplip.preinst: when removing old udev rules, handle files that
+ are marked as obsolete when checking md5sums.
+
+ -- Kees Cook <kees@ubuntu.com> Tue, 16 Feb 2010 16:14:50 -0800
+
+hplip (3.10.2~rc1-0ubuntu2) lucid; urgency=low
+
+ * debian/rules: Copy all fax PPDs, there are "Fax3" PPDs now and there will
+ come more in the future.
+ * debian/hplip.install: Install also the new pstotiff filter (for fax) and
+ the corresponding *.types and *.convs files.
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Fri, 12 Feb 2010 19:35:18 +0100
+
+hplip (3.10.2~rc1-0ubuntu1) lucid; urgency=low
+
+ * New upstream pre-release
+ o The hpcups driver information file (hpcups.drv) is updated for the
+ devices listed below to align with the product specifications.
+ Capabilities like print modes, paper sizes, trays, mechanical offsets,
+ margins, overspray and UIConstraints are consistent with the product
+ specifications. Affected printers: HP Photosmart Premium Fax All-in-One
+ C309a, C309c, Photosmart Premium All-in-One C309g, C309h, Photosmart
+ C53xx, C63xx, D7560, B85xx, Officejet 6000 Printer E609n, E609a,
+ Officejet 6500 All-in-One Printer E709a, E709c, E709n, E709q.
+ o Added support for: HP Officejet 4500 All-in-one Printer g510a, g510b,
+ g510g, g510h
+ o Added fax support for HP LaserJet m1319f
+ o Added 1284DeviceID for duplicate PostScript PPD's
+ * debian/patches/85_rebuild_python_ui.dpatch: Regenerated for new upstream
+ version.
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Fri, 12 Feb 2010 17:33:18 +0100
+
+hplip (3.9.12-2ubuntu4) lucid; urgency=low
+
+ * debian/patches/udev-rules-use-attrs-not-sysfs.dpatch,
+ debian/patches/udev-rules-use-attrs-not-sysfs-and-hp-mkuri-call-fix.dpatch:
+ 56-hpmud_support.rules id not call "hp-mkuri" any more with curent udev.
+ Added fix to the existing patch for 56-hpmud_support.rules and renamed
+ the patch.
+ * debian/local/scripts/hp-plugin-ubuntu, debian/rules: Added script for
+ downloading and installing HP's proprietary plugin on Ubuntu systems,
+ taking into account that many systems do not have python-qt installed
+ and some do not have X. This script is supposed to get called by
+ update-notifier when triggered by udev on a connection of a printer
+ which needs the plugin. This script will only be installed when the package
+ gets built on Ubuntu.
+ * debian/patches/ubuntu-hp-mkuri-send-dbus-signal-to-update-notifier.dpatch:
+ Let hp-mkuri not simply generate a notification message when HP's
+ proprietary plugin is needed for the newly connected printer but also
+ send a D-Bus message to update-notifier to execute the installation
+ of the plugin.
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Thu, 11 Feb 2009 00:06:18 +0100
+
+hplip (3.9.12-2ubuntu3) lucid; urgency=low
+
+ * debian/patches/udev-rules-use-attrs-not-sysfs.dpatch: Convert
+ remaining $sysfs string, too
+
+ -- Daniel T Chen <crimsun@ubuntu.com> Mon, 04 Jan 2010 21:05:46 -0500
+
+hplip (3.9.12-2ubuntu2) lucid; urgency=low
+
+ * debian/patches/udev-rules-use-attrs-not-sysfs.dpatch: Don't use
+ deprecated syntax (LP: #491346)
+
+ -- Daniel T Chen <crimsun@ubuntu.com> Fri, 01 Jan 2010 16:23:37 -0500
+
+hplip (3.9.12-2ubuntu1) lucid; urgency=low
+
+ * Merged changes from Debian.
+ * debian/control: hpcups (package hplip-cups) works without the hplip package
+ as well (even 4-edge borderless on arbitrary paper sizes on HP inkjets),
+ moved the dependency on hplip to Suggests.
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Tue, 29 Dec 2009 10:21:18 +0100
+
+hplip (3.9.12-2) unstable; urgency=low
+
+ * NEW package libhpmud0 - splits hard dependency between hpijs & hplip
+ - Fix "hpijs linked against libhpmud.so.0 in hplip package - brings
+ large (14Mb) depends" (Closes: #454117)
+ - Fix "automatically got a systray app which I don't need" (Closes: #484801)
+ - Fix "depends (via hplip) on cups, to no purpose" (Closes: #561134)
+ * Soften bug/presubj. Fixes "requiring authentication" (Closes: #494420)
+ * dh_desktop-is-deprecated - removed
+ * dh_python obsolete as dh_pysupport exists
+ * Add debian/README.source - fixes patch-system-but-no-source-readme
+ - Upgrade to Standards-Version: 3.8.3
+
+ -- Mark Purcell <msp@debian.org> Mon, 28 Dec 2009 16:36:32 +1100
+
+hplip (3.9.12-1) unstable; urgency=low
+
+ * New upstream release
+ * remove unrecognized options: --enable-debug, --disable-foomatic-xml-install
+ * prnt/hpijs/dj9xxvip.cpp fixed upstream for DVD/CD
+ - obsoletes debian/patches/set-media-type.dpatch
+
+ -- Mark Purcell <msp@debian.org> Sun, 27 Dec 2009 22:22:16 +1100
+
+hplip (3.9.10-4) unstable; urgency=low
+
+ * KBSD patch from KiBi (Closes: #560796)
+
+ -- Mark Purcell <msp@debian.org> Mon, 14 Dec 2009 20:08:44 +1100
+
+hplip (3.9.10-3ubuntu4) lucid; urgency=low
+
+ * debian/control: Add "fdupes" to the build dependencies. The utility is
+ needed for the previous upload to work.
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Wed, 10 Dec 2009 09:55:18 +0100
+
+hplip (3.9.10-3ubuntu3) lucid; urgency=low
+
+ * debian/rules: Remove identical PPD files, they only waste space and
+ cause duplicate entries in printer setup tools (LP: #493282).
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Wed, 09 Dec 2009 16:45:18 +0100
+
+hplip (3.9.10-3ubuntu2) lucid; urgency=low
+
+ * Update PYTHONPATH for both Debian & Ubuntu configs
+
+ -- Mark Purcell <msp@debian.org> Tue, 08 Dec 2009 07:57:13 +1100
+
+hplip (3.9.10-3ubuntu1) lucid; urgency=low
+
+ * Merged man page build fix into Ubuntu.
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Sun, 06 Dec 2009 15:18:18 +0100
+
+hplip (3.9.10-3) unstable; urgency=low
+
+ * Set local PYTHONPATH & LD_LIBRARY_PATH during man page build
+ - "hplip_3.9.10-2: FTBFS: missing man page" (Closes: #558489)
+
+ -- Mark Purcell <msp@debian.org> Sun, 06 Dec 2009 19:28:34 +1100
+
+hplip (3.9.10-2ubuntu1) lucid; urgency=low
+
+ * debian/patches/hplip-systray-longer-timeout-for-system-tray-start.dpatch:
+ Let hp-systray wait for the system tray appearing on the user's desktop
+ panel up to three minutes before giving up. This should finally stop
+ hp-systray to give up even on the slowest systems (Closes: #517365,
+ LP: 335662).
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Sun, 29 Nov 2009 21:44:18 +0100
+
+hplip (3.9.10-2) unstable; urgency=low
+
+ * "New upstream version 3.9.10 available" (Closes: #554714)
+ * Fix "hp-toolbox crash with "ImportError: No module named qt""
+ - relevant utils to hplip-gui (Closes: #525556,#525786,#520789,#484043)
+ * hpli-gui - Depends: hplip (= ${hplip:binary:Version})
+ - Replaces: hplip (<= 3.9.8-1) (Closes: #557524)
+ * Versioned Suggests: Recommends: have no effect - removed
+ * Match depends to exact binary version (= ${hplip:binary:Version})
+ * Update hplip.preinst to remove obsolete udev rules (Closes: #556431,#552376)
+ * hplip now recommends hplip-cups (Closes: #494421)
+ * Depends: python-pexpect (Does not fix bug 555361)
+ - TODO remove embedded code
+ * hplip.NEWS truncated to only include relevant messages (Closes: #432454)
+ * Added "[hplip-gui] dependency on ktsuss" (Closes: #523315)
+ * hplip-data: s/Recommends:/Suggests:/ hplip (Closes: #387093)
+ * Move hplip-gui manages to package {Replaces: hplip (<= 3.9.10-1)}
+
+ -- Mark Purcell <msp@debian.org> Sun, 29 Nov 2009 17:44:27 +1100
+
+hplip (3.9.10-1) unstable; urgency=low
+
+ * New Upstream Release
+ - sync with ubuntu
+
+ -- Mark Purcell <msp@debian.org> Sun, 22 Nov 2009 11:05:35 +1100
+
+hplip (3.9.10-0ubuntu2) lucid; urgency=low
+
+ * debian/control: Let the "hplip" package recommend "hplip-cups¨ again
+ instead of "hpijs".
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Tue, 10 Nov 2009 14:14:18 +0100
+
+hplip (3.9.10-0ubuntu1) lucid; urgency=low
+
+ * New upstream release
+ o hpcups driver rewritten: Simpler code, no bi-directional access needed
+ any more, especially not for 4-edge borderless printing, therefore
+ faster, print modes, paper sizes, mechanical offsets, and margins are
+ controlled by the PPD now, so easier debugging in cooperation with the
+ user.
+ o Added support for: HP Photosmart All-in-one Printer b109 Series,
+ including Wireless, HP Photosmart Premium All-in-one Printer c309
+ Series, including Fax, HP Photosmart a640 Printer Series, HP Deskjet
+ f24xx All-in-one Printer Series, HP Deskjet f4500 All-in-one Printer
+ Series
+ * debian/patches/hp_photosmart_pro_b9100_support.dpatch,
+ debian/patches/85_rebuild_python_ui.dpatch: Regenerated for new upstream
+ version, especially let 85_rebuild_python_ui.dpatch make "pyuic4" being
+ used.
+ * debian/patches/hplip-polkit-1-migration.dpatch,
+ debian/patches/hpcups-drv-page-sizes-order.dpatch: Removed, fixed upstream.
+ * debian/control: Replaced old Qt3-based build dependency on "pyqt-tools"
+ by the new Qt4-based "pyqt4-dev-tools".
+ * debian/control: Made "hplip-gui" requiring "hplip-cups" as hp-setup can
+ only create fax queues with the hpcups driver (LP: #459275).
+ * debian/hplip-cups.postinst, debian/hpijs.postinst: Let queues using
+ the HPIJS driver be automatically migrated to using the hpcups driver as
+ the regressions of hpcups should be fixed now.
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Tue, 10 Nov 2009 10:29:18 +0100
+
+hplip (3.9.8-1ubuntu2) karmic; urgency=low
+
+ * debian/patches/set-media-type.dpatch: Fix media type selection for CD/DVD
+ printing with the HPIJS driver, as we still use HPIJS by default. Fixes
+ LP: #380858 for the HPIJS driver.
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Fri, 9 Oct 2009 18:39:38 +0200
+
+hplip (3.9.8-1ubuntu1) karmic; urgency=low
+
+ [ Till Kamppeter ]
+ * merged in Debian fixes.
+
+ [ Mark Purcell ]
+ * hplip.NEWS truncated to only include relevant messages (Closes: #432454)
+ * Modify hplip-dbg Section: debug
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Sun, 4 Oct 2009 14:00:38 +0200
+
+hplip (3.9.8-1) unstable; urgency=low
+
+ * New Upstream Release
+ - sync with ubuntu
+ * Fix "Please port to PolicyKit 1" (Closes: #549499)
+ - ubuntu patch to support policykit1
+ * Fix "Missing /usr/lib/libhpmud.so symlink" (Closes: #548379)
+ - libsane-hpaio.so.1 now links correctly at build time
+
+ -- Mark Purcell <msp@debian.org> Sun, 04 Oct 2009 09:29:02 +1100
+
+hplip (3.9.8-0ubuntu7) karmic; urgency=low
+
+ * debian/hplip-cups.postinst, debian/hpijs.postinst: Let the hpijs package
+ migrate queues for the hpcups driver (hplip-cups package) to the HPIJS
+ driver when updating PPDs of existing queues. The hplip-cups package
+ does not migrate HPIJS queues any more now. We prefer HPIJS for now as
+ hpcups has still problems, especially shifted prints on the back side
+ of the sheet (LP: #426826), page size confusion with duplex printing
+ (LP: #428588) and borderless printing.
+ * debian/patches/kde4-kdesudo-support.dpatch: Try also
+ /usr/lib/kde4/libexec/kdesu as sudo GUI (LP: #281880).
+ * debian/hplip.install, debian/hplip-gui.install: Moved all hp-* utilities
+ which do not work in text mode from hplip to hplip-gui (LP: #430539).
+ * debian/control: Let hplip recommend hpijs instead of hplip-cups, as this
+ is our preferred driver for now. Add to hplip-gui's dependencies
+ kdebase-runtime as one of the alternatives to provide a sudo GUI utility
+ (LP: #281880). Added versioned depends and conflicts on hplip to hp-gui,
+ due to the moving of the GUI-only utilities to hplip-gui.
+ * debian/patches/hp-setup-prompt-for-custom-PPD.dpatch: hp-setup did not
+ prompt for a custom PPD if the description field of the default PPD is
+ empty (LP: #432808).
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Thu, 3 Sep 2009 19:22:38 +0200
+
+hplip (3.9.8-0ubuntu6) karmic; urgency=low
+
+ * debian/hpijs-ppds.postinst, debian/hplip-cups.postinst,
+ debian/hplip.postinst, debian/hpijs.postinst: Fixed "lpstat -r" check
+ for the auto update of PPDs of existing queues. "lpstat -r" exits always
+ with status 0, we must check the actual output. Call lpstat, lpadmin, and
+ cupsctl with "-h /var/run/cups/cups.sock" to avoid querying remote
+ servers set up in /etc/cups/client.conf, and asking for passwords.
+ Thanks to Martin-Éric Racine for tracking this down and the solution!
+ See Debian bug #543468. Use signal names instead of numbers for trap.
+ Quiesces a lintian bashism warning.
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Thu, 3 Sep 2009 19:22:38 +0200
+
+hplip (3.9.8-0ubuntu5) karmic; urgency=low
+
+ * debian/control: Let HPLIP build-depend and depend on policykit-1.
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Thu, 3 Sep 2009 19:22:38 +0200
+
+hplip (3.9.8-0ubuntu4) karmic; urgency=low
+
+ * debian/patches/hplip-polkit-1-migration.dpatch: Upstream patch to make
+ HPLIP supporting Policy Kit 1.0 (LP: #419834).
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Wed, 2 Sep 2009 17:13:38 +0200
+
+hplip (3.9.8-0ubuntu3) karmic; urgency=low
+
+ * debian/control: Added to all "cupsddk" dependencies an alternative
+ depenmndency on CUPS 1.4.0 or newer, as CUPS DDK is now part of CUPS.
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Wed, 26 Aug 2009 11:38:38 +0200
+
+hplip (3.9.8-0ubuntu2) karmic; urgency=low
+
+ * debian/patches/hpcups-drv-page-sizes-order.dpatch: Upstream patch to improve
+ the order of the page sizes in the user interface menus. Now the margin
+ variants of the same size (for duplex and full bleed) stand together.
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Wed, 12 Aug 2009 12:47:38 +0200
+
+hplip (3.9.8-0ubuntu1) karmic; urgency=low
+
+ * New upstream release
+ o mDNS/Bonjour support
+ o Support for udev variable ID_HPLIP (ACL setting via udev rule
+ 70-acl.rules)
+ o Added support for: HP Deskjet d1620, d1630, d1650, d1658, d1660, d1663,
+ d5545, d5560, d5563, d5568, Ink Advantage k109a, k209a, PhotoSmart
+ c4740, c4750, c4780, c4783, c4785, c4788, c4793, c4795, c4798, c4799,
+ Photosmart Plus All-in-one b209a, b209b, b209c, Officejet 7000 Wide
+ Format Printer e809a, HP LaserJet p3011, p3015
+ * debian/rules: Added "--enable-udev-acl-rules" to "./configure" command line
+ * debian/hplip.install: Let 40-hplip.rules get installed in /lib/udev/rules.d,
+ removed HAL .fdi file.
+ * debian/hplip.udev: Removed, adopted upstream.
+ * debian/patches/plugin-execution-fix.dpatch,
+ debian/patches/hplip-device-id-report-fix.dpatch,
+ debian/patches/hpinfo-query-without-cups-queue.dpatch: Removed, fixed
+ upstream.
+ * debian/rules: Removed the corrections on the Fax PPDs, they are fixed
+ upstream now.
+ * debian/hplip-cups.postinst, debian/hpijs.postinst,
+ debian/hpijs-ppds.postinst: Let updates of the PPDs of existing queues
+ also work with HPLIP versions where there is more than one letter appended
+ to the version number.
+ * debian/hplip-cups.postinst: Made automatic migration of Fax queues to
+ hpcups working.
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Thu, 6 Aug 2009 18:55:38 +0200
+
+hplip (3.9.6b-1ubuntu4) karmic; urgency=low
+
+ * debian/patches/plugin-execution-fix.dpatch: Added "--nox11" options to the
+ command lines for running the installer for the proprietary plugin as
+ otherwise hp-plugin does not succeed to run the installer when it is run
+ out of another program.
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Sun, 26 Jul 2009 01:24:49 +0200
+
+hplip (3.9.6b-1ubuntu3) karmic; urgency=low
+
+ * debian/patches/hplip-device-id-report-fix.dpatch: Fixed unreliable
+ libusb-based device ID poll by using HPLIP's own device ID poll.
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Thu, 23 Jul 2009 20:56:49 +0200
+
+hplip (3.9.6b-1ubuntu2) karmic; urgency=low
+
+ * debian/patches/hplip-device-id-report-fix.dpatch: Fixed segfault when
+ usblp kernel module was not loaded.
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Thu, 23 Jul 2009 16:00:49 +0200
+
+hplip (3.9.6b-1ubuntu1) karmic; urgency=low
+
+ * debian/patches/hplip-device-id-report-fix.dpatch: Patch from Tim Waugh
+ to let the "hp" CUPS backend report the real device IDs of USB printers.
+ This is a preparation for the udev-based Plug'n'Print in
+ system-config-printer.
+ * debian/control: Added build dependency on libudev-dev, needed for the
+ device ID patch.
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Thu, 23 Jul 2009 02:15:49 +0200
+
+hplip (3.9.6b-1) unstable; urgency=low
+
+ * New upstream release
+
+ -- Mark Purcell <msp@debian.org> Wed, 15 Jul 2009 21:43:30 +1000
+
+hplip (3.9.6b-0ubuntu1) karmic; urgency=low
+
+ * New upstream bug fix release
+ o CD/DVD Tray use (LP: #380858) is fixed upstream now.
+ o Fixes on unprintable margins and option constraints.
+ o Minor fixes.
+ * debian/patches/set-media-type-and-input-tray-for-cd-dvd.dpatch: Removed,
+ fixed upstream.
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Mon, 13 Jul 2009 17:15:49 +0200
+
+hplip (3.9.6-0ubuntu3) karmic; urgency=low
+
+ * debian/patches/set-media-type-and-input-tray-for-cd-dvd.dpatch: Let
+ the media type CD/DVD and the CD tray automatically get selected if the
+ user chooses a CD/DVD size as paper size (LP: #380858).
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Mon, 22 Jun 2009 18:32:49 +0200
+
+hplip (3.9.6-0ubuntu2) karmic; urgency=low
+
+ * debian/hplip.udev: Added 'ENV{ID_HPLIP}="1"' to all device rules, so that
+ the /lib/udev//rules.d/70-acl.rules can react to the HPLIP-supported devices
+ to open them up for accessing the non-printing functions by normal users.
+
+ * debian/hplip.install: Do not install an UDEV rules file in /etc, as we
+ can put package-supplied rules into /lib.
+
+ * debian/local/scripts/create_hal_global_fdi_from_hpmud_rules.sh: Updated
+ HAL rules to use "usb_device" instead of "usb".
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Fri, 19 Jun 2009 14:56:49 +0200
+
+hplip (3.9.6-0ubuntu1) karmic; urgency=low
+
+ * New upstream release
+ o The new native CUPS driver (HPCUPS) is now the default printer driver.
+ We now have PPDs with exact printable regions for normal, borderless
+ and duplex paper sizes.
+ o A new utility 'hp-wificonfig' allows to configure select wifi-capable
+ printers on a wireless network.
+ o Added support for: HP Deskjet d2660, d2645, d2663, d2666, d2668, d2680,
+ f4440, f4435, f4450, f4470, f4472, f4473, f4480, f4483, f4488, f4492,
+ LaserJet p3011, p3015, m4349 MFP, m9059 MFP, Photosmart c4640, c4650,
+ c4680, c4610, c4635, c4670, c4673, c4680, c4683, c4688, Color LaserJet
+ cp5225, cp5225n, cp5225dn, cm6049 MFP, Officejet 6000, 6000 Wireless.
+ * debian/rules: Updated ./configure options
+ * debian/rules: Create empty files NEWS, README, AUTHORS, and ChangeLog
+ before building and remove them on cleaning. They are needed by autoreconf.
+ * debian/rules: Updated installation of Fax PPDs, for both the CUPS
+ Raster driver and HPIJS.
+ * debian/rules: Removed PPD manipulation code which did not work any more
+ for longer time. Removed also some code which was commented out.
+ * debian/rules, debian/hpijs-ppds.install, debian/hplip.install: Moved
+ PPDs into /usr/share/ppd/hplip, moved PostScript PPDs into the hplip
+ package.
+ * debian/hplip-cups.install: Updated to the files which are actually present
+ in this version.
+ * debian/control: Updated to make hplip-cups instead of hpijs being the
+ preferred printer driver.
+ * debian/control: Added cups-client dependency to hplip package, to assure
+ that the auto-update of the PPDs of existing print queues works.
+ * debian/hplip.postinst, debian/hplip-cups.postinst, debian/hpijs.postinst,
+ debian/hpijs-ppds.postinst: Updated auto-update facility for the PPD
+ files of existing print queues.
+ * debian/hplip-cups.postinst: Modified regexps for PPD auto-update so that
+ HPIJS queues get migrated to hpcups queues.
+ * debian/hpijs-ppds.links: Static PPDs use foomatic-rip-hplip as filter name,
+ added link to make them work anyway.
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Thu, 18 Jun 2009 20:59:49 +0200
+
+hplip (3.9.4b-1ubuntu4) karmic; urgency=low
+
+ * debian/control: Added ghostscript-cups dependency. (LP: #385606)
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Thu, 11 Jun 2009 22:03:49 +0200
+
+hplip (3.9.4b-1ubuntu3) karmic; urgency=low
+
+ * debian/control: Moved dependencies of hpijs, hpijs-ppds, and hplip-cups
+ on cups, cups-client back to Depends:, for post-install this is
+ sufficient.
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Tue, 2 Jun 2009 09:16:49 +0200
+
+hplip (3.9.4b-1ubuntu2) karmic; urgency=low
+
+ * debian/control: Moved dependencies of hpijs, hpijs-ppds, and hplip-cups
+ on cups, cups-client, and perl-base to Pre-Depends:, as only this way it
+ is assured that these packages are configured (especially CUPS daemon
+ running) before this package gets configured (update of the PPDs of
+ existing queues).
+
+ * debian/hpijs.postinst: Made update of the PPD files of already existing
+ CUPS queues also working with the crippled NickNames of the PPDs of HPLIP
+ 3.9.2.
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Mon, 1 Jun 2009 21:29:49 +0200
+
+hplip (3.9.4b-1ubuntu1) karmic; urgency=low
+
+ * debian/patches/kde4-kdesudo-support.dpatch: Fixed typo (LP: #380311).
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Tue, 26 May 2009 01:14:49 +0200
+
+hplip (3.9.4b-1) unstable; urgency=low
+
+ * New Upstream Release
+
+ -- Mark Purcell <msp@debian.org> Wed, 20 May 2009 21:13:15 +1000
+
+hplip (3.9.4b-0ubuntu1) karmic; urgency=low
+
+ * New upstream release
+ o Added PolicyKit support - command line tools like hp-setup, hp-plugin,
+ etc. are now run as a regular user, not root/superuser
+ o Added GPG digital signature support to the the HPLIP plug-in. This
+ feature validates that the plug-in is not corrupted and is authentic
+ prior to installation.
+ o Added CUPS Raster Driver (for testing only).
+ o Added support for HP LaserJet p1009, Designjet 4020ps, 4520ps,
+ 4520mfp (except fax), HP Officejet 6500.
+ o Bug fixes.
+ * debian/rules: "./configure" options for new CUPS Raster driver.
+ * debian/rules, debian/control, debian/hplip-cups.install,
+ debian/hplip-cups.postinst, debian/hplip.install: Add binary package
+ "hplip-cups" for the new CUPS Raster driver.
+ * debian/rules, debian/control: Activate PolicyKit support.
+ * debian/control: Added "cups" to Depends: of all binary packages
+ containing or generating PPD files, as a running CUPS daemon is needed
+ for the automatic update of existing print queues.
+ * hplip.install: Added new files.
+ * debian/patches/nicknames-device-ids.dpatch,
+ debian/patches/hpdio_settings_dialog.dpatch: Removed, applied upstream.
+ * debian/patches/delayed-hp-systray-start.dpatch,
+ debian/patches/kde4-kdesudo-support.dpatch: Regenerated.
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Fri, 15 May 2009 22:12:49 +0200
+
+hplip (3.9.2-3ubuntu4) jaunty; urgency=low
+
+ * debian/patches/nicknames-device-ids.dpatch: Added patch from upstream
+ for not shortening the *NickName: entries in the PPDs and not to replace
+ " " by "_" in the device IDs in the PPDs (Upstream bugs: LP: #349539,
+ LP: #349547).
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Mon, 30 Mar 2009 00:56:49 -0700
+
+hplip (3.9.2-3ubuntu3) jaunty; urgency=low
+
+ * Rebuild of unchanged source package. The Python installed on the Ubuntu
+ build server for i386 was broken and produced a broken cupsext.so file
+ (LP: #349781, LP: #349467).
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Mon, 30 Mar 2009 11:24:49 +0200
+
+hplip (3.9.2-3ubuntu2) jaunty; urgency=low
+
+ * debian/hpijs.postinst, debian/hpijs-ppds.postinst: Silenced non-fatal
+ error messages when post-install script updates PPDs and there are PPDs
+ not belonging to a CUPS queue in /etc/cups/ppd/ (LP: #345866).
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Thu, 26 Mar 2009 15:28:49 +0100
+
+hplip (3.9.2-3ubuntu1) jaunty; urgency=low
+
+ * debian/local/apport-hook.py, debian/rules, debian/hplip-data.install:
+ Added apport hook (LP: #338442).
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Thu, 19 Mar 2009 16:44:49 +0100
+
+hplip (3.9.2-3) unstable; urgency=low
+
+ * Do not remove .pyc/.pyo on upgrades
+
+ -- Mark Purcell <msp@debian.org> Tue, 17 Mar 2009 20:24:47 +1100
+
+hplip (3.9.2-2) unstable; urgency=low
+
+ * Use Christopher Martin's debian/hplip.udev - group lp
+ - hplip.NEWS advises users to use group lp
+ - group scanner is depreciated to match upstream
+ - (Closes: #517297) "hplip udev rules never match"
+ * hpdio_settings_dialog.dpatch also fixes:
+ - (Closes: #503723) hplip: python /usr/bin/hp-systray at 100% CPU
+ - Fixes "[hplip] hp-systray at 100% CPU" (Closes: #519696)
+
+ -- Mark Purcell <msp@debian.org> Sun, 15 Mar 2009 10:52:32 +1100
+
+hplip (3.9.2-1ubuntu3) jaunty; urgency=low
+
+ * Also add missing ${python:Depends} to hplip-data.
+
+ -- Steve Langasek <steve.langasek@ubuntu.com> Mon, 16 Mar 2009 13:30:57 +0000
+
+hplip (3.9.2-1ubuntu2) jaunty; urgency=low
+
+ * The python scripts are in hplip-data - call dh_pysupport -i, not
+ dh_pysupport -a, so we don't end up shipping .pyc files in the
+ package!
+
+ -- Steve Langasek <steve.langasek@ubuntu.com> Mon, 16 Mar 2009 12:50:52 +0000
+
+hplip (3.9.2-1ubuntu1)) jaunty; urgency=low
+
+ [ Till Kamppeter ]
+ * debian/patches/hpdio_settings_dialog.dpatch: Bug fix patch from upstream,
+ fixes busy loop when switching to another user and crash of settings
+ dialog (see LP: #335116).
+
+ [ Mark Purcell ]
+ * debian/control: Standards version 3.8.0.
+
+ -- Mark Purcell <msp@debian.org> Sun, 15 Mar 2009 08:26:16 +1100
+
+hplip (3.9.2-1) unstable; urgency=low
+
+ [ Till Kamppeter ]
+ * New upstream release
+ o Fully Qt4-based
+ o Added printing support for HP Color LasetJets 1600, 2600, and CP1215
+ o Added support for HP OfficeJet Pro 8xxx series
+ o Tons of bug fixes
+ * debian/control, debian/rules: Qt3 is not needed any more
+ * debian/control: hp-toolbox (package hplip-gui) needs python-qt4-dbus now.
+ * debian/patches/pdf_printing_support.dpatch: Removed, applied upstream.
+ * debian/patches/systray-applet-with-qt4.dpatch: Removed, not needed any
+ more in Qt4-only environment.
+ * debian/patches/delayed-hp-systray-start.dpatch: Delay start of HPLIP
+ system tray applet, as it sometimes got started before the system tray was
+ available.
+ * debian/patches/kde4-kdesudo-support.dpatch,
+ debian/patches/hp_photosmart_pro_b9100_support.dpatch,
+ debian/patches/hpinfo-query-without-cups-queue.dpatch,
+ debian/patches/85_rebuild_python_ui.dpatch: Regenerated.
+
+ -- Mark Purcell <msp@debian.org> Mon, 09 Mar 2009 12:52:14 +1100
+
+hplip (2.8.12-3ubuntu2) jaunty; urgency=low
+
+ * Rebuild with python (>= 2.6).
+
+ -- Matthias Klose <doko@ubuntu.com> Tue, 24 Feb 2009 23:35:05 +0100
+
+hplip (2.8.12-3ubuntu1) jaunty; urgency=low
+
+ [ Till Kamppeter ]
+ * debian/patches/hpinfo-query-without-cups-queue.dpatch: Allow hp-info to
+ query URIs for which there is no CUPS queue (LP: #329220).
+
+ [ Mark Purcell ]
+ * debian/patches/hp-check_debian.dpatch: Fixed hp-check for the SANE driver
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Wed, 18 Feb 2009 11:35:45 +0100
+
+hplip (2.8.12-3) unstable; urgency=low
+
+ * Fix "Breaks: udev (<< 136-1) which is only in Ubuntu; uninstallable
+ on Debian" removed from debian/control (Closes: #515750)
+
+ -- Mark Purcell <msp@debian.org> Wed, 18 Feb 2009 07:34:36 +1100
+
+hplip (2.8.12-2) unstable; urgency=low
+
+ * Add Recommends for sane-utils/ xsane
+ * Conflicts: hpoj (Closes: #508008)
+ * debian/rules add get-orig-source target
+ - Available if gnome-pkg-tools is installed
+ * Fix hp-check to work recognise Debian install
+ - Fix "hp-check complains about missing SIP even when sip4 installed"
+ (Closes: #483843)
+ - Fix "suggests installation of already installed sane" (Closes: #494419)
+ - Fix "hp-check complains for lacking hpaio support in sane but
+ package configures it ok" (Closes: #494430)
+ - Fix "Debian/ Ubuntu place hpaio in /etc/sane.d/dll.d/hplip, so lets
+ check there too" (Closes: #512596)
+ * Fix "dplip: please change default icon to
+ /usr/share/pixmaps/HPmenu.xpm" patch from Fabian (Closes: #415048)
+
+ -- Mark Purcell <msp@debian.org> Mon, 16 Feb 2009 23:47:44 +1100
+
+hplip (2.8.12-1ubuntu5) jaunty; urgency=low
+
+ * debian/rules: Returned UDEV rules priority to 40.
+ * debian/hplip.udev, debian/rules: Ship our own UDEV rules again, the
+ upstream ones have many problems (LP: #319660, LP: #319661, LP: #319662,
+ LP: #319665).
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Wed, 21 Jan 2009 15:20:45 +0100
+
+hplip (2.8.12-1ubuntu4) jaunty; urgency=low
+
+ * debian/hplip.udev, debian/rules: Do not ship our own UDEV rules but use
+ the upstream ones. Use also the upsttream priority (55) for these rules.
+ * debian/hpdio.py, debian/rules: Removed, the file is provided upstream
+ now.
+ * debian/patches/hp-levels-without-tty.dpatch: Removed, problem fixed
+ upstream (Upstream bug LP: #299479).
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Wed, 21 Jan 2009 15:20:45 +0100
+
+hplip (2.8.12-1ubuntu3) jaunty; urgency=low
+
+ * Restore udev rules that assign the lp group to /dev/bus/usb devices
+ for certain printers. LP: #318262.
+
+ -- Scott James Remnant <scott@ubuntu.com> Wed, 21 Jan 2009 12:59:43 +0000
+
+hplip (2.8.12-1ubuntu2) jaunty; urgency=low
+
+ * debian/rules, debian/hplip.install, debian/hplip.links: Automatization
+ of file selection for generating symlinks to the executables and
+ generating the man pages. This avoids that new tools and man pages get
+ forgotten.
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Sat, 10 Jan 2009 17:00:45 +0100
+
+hplip (2.8.12-1ubuntu1) jaunty; urgency=low
+
+ * Merge from Debian
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Fri, 9 Jan 2009 14:14:45 +0100
+
+hplip (2.8.12-1) experimental; urgency=low
+
+ * New upstream release
+ * Distribution experimental while we await lenny
+ * del debian/patches included upstream;
+ - manpage-whatis.dpatch, hpssd-correct-hp-sendfax-call.dpatch,
+ 61_noqt_message.dpatch, qt4-systray-with-qt3-utilities.dpatch
+
+ -- Mark Purcell <msp@debian.org> Sat, 03 Jan 2009 13:43:19 +1100
+
+hplip (2.8.10-2) experimental; urgency=low
+
+ * Sync with Ubuntu
+
+ -- Mark Purcell <msp@debian.org> Sun, 07 Dec 2008 14:12:31 +1100
+
+hplip (2.8.10-1ubuntu3) jaunty; urgency=low
+
+ * Add Breaks to ensure the right version of udev gets used.
+
+ -- Scott James Remnant <scott@ubuntu.com> Fri, 09 Jan 2009 11:51:57 +0000
+
+hplip (2.8.10-1ubuntu2) jaunty; urgency=low
+
+ * debian/rules: Don't install udev rules anymore; all these do is try and
+ put things in the scanner group which has been removed upstream (for
+ precisely this reason - printers aren't scanners!)
+ * debian/hplip.preinst: Remove udev rules on upgrade
+
+ -- Scott James Remnant <scott@ubuntu.com> Wed, 07 Jan 2009 14:27:59 +0000
+
+hplip (2.8.10-1ubuntu1) jaunty; urgency=low
+
+ * debian/hpijs.postinst, debian/hpijs-ppds.postinst: Do not try to update
+ the PPDs of existing print queues if CUPS is not installed or not running
+ (LP: #302532).
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Wed, 26 Nov 2008 22:26:45 +0100
+
+hplip (2.8.10-1) experimental; urgency=low
+
+ * Fix "New upstream version 2.8.9" sync with Ubuntu
+ (Closes: #501275)
+ * Distribution experimental while we await lenny
+
+ -- Mark Purcell <msp@debian.org> Sun, 23 Nov 2008 11:08:26 +1100
+
+hplip (2.8.10-0ubuntu4) jaunty; urgency=low
+
+ * debian/control: Really fix the updating conflict of hplip and hplip-gui
+ due to the move of /usr/share/pixmaps/HPmenu.xpm in HPLIP 2.8.6.b-2
+ (Closes: #502055, LP: #299542).
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Thu, 20 Nov 2008 12:30:02 +0100
+
+hplip (2.8.10-0ubuntu3) jaunty; urgency=low
+
+ * debian/hpijs.postinst, debian/hpijs-ppds.postinst: Make maintainer scripts
+ silent if there are no PPDs of existing print queues (LP: #299889).
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Wed, 19 Nov 2008 15:51:02 +0100
+
+hplip (2.8.10-0ubuntu2) jaunty; urgency=low
+
+ * debian/rules: Set Python module path for calls of HPLIP components
+ during package build.
+ * debian/patches/hp-levels-without-tty.dpatch: Make hp-levels working
+ also without access to a TTY, for example to generate the man page with
+ "--help-man" during package build.
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Tue, 18 Nov 2008 12:09:02 +0100
+
+hplip (2.8.10-0ubuntu1) jaunty; urgency=low
+
+ * New upstream release
+ - Closes: #501275, LP: #296399
+ * debian/hpijs.postinst, debian/hpijs-ppds.postinst: Let the PPD files of the
+ existing print queues get automatically updated after each installation of
+ this package.
+ * Refresh 85_rebuild_python_ui.dpatch,
+ hp_photosmart_pro_b9100_support.dpatch, systray-applet-with-qt4.dpatch
+ * bugs-in-generated-ppds.dpatch: Removed, applied upstream.
+ * text-only-without-systray-applet-traceback.dpatch: Removed, problem solved
+ upstream.
+ * Add manpages at build using --help-man option
+ * Add hp_photosmart_pro_b9100_support.dpatch description
+ * Add manpage-whatis.dpatch
+ * debian/rules: The fax PPDs are gzipped in the source tree now, unzip
+ them before patching
+ * debian/hpdio.py, debian/rules: Added file which was missing in the source
+ tarball, closes LP: #299011
+ * qt4-systray-with-qt3-utilities.dpatch: Suppress warning that Qt4 support
+ is not completed and let systray applet not force the hp-toolbox into Qt4
+ mode (LP: #299011).
+ * debian/rules: Let package build with both Qt3 and Qt4 support, let Qt3
+ be used by default ("ui-toolkit=qt3" in /etc/hp/hplip.conf), closes
+ LP: #299011
+ * hpssd-correct-hp-sendfax-call.dpatch: Correct call of hp-sendfax,
+ specifying the print queue needs "--printer" now and not "--fax".
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Mon, 17 Nov 2008 11:25:02 +0100
+
+hplip (2.8.7-1) experimental; urgency=low
+
+ * Distribution experimental while lenny is unreleased
+ - hplip/2.8.6.b is target for lenny
+ * Merge my branches/lenny changes r184:212 into trunk
+ * Update dpatch descriptions DP:
+ * unused-override debian/{hpijs,hplip-data}.lintian
+
+ -- Mark Purcell <msp@debian.org> Thu, 16 Oct 2008 00:18:25 +1100
+
+hplip (2.8.6.b-4) unstable; urgency=low
+
+ * Fix "hp-scan: Aborts with a traceback when trying to scan."
+ - Apply missing patches from -3 upload (Closes: #490640)
+
+ -- Mark Purcell <msp@debian.org> Thu, 15 Jan 2009 23:56:59 +1100
+
+hplip (2.8.6.b-3) unstable; urgency=low
+
+ * hplip Replaces hplip-gui (<< 2.8.6.b-2)
+ - File conflict with hplip-gui (Closes: #502055)
+ * Apply patch (faulty scanext.so) from dwelsh
+ - hp-scan: Aborts with a traceback when trying to scan.
+ hplip-2.8.6-hp_scan_link.dpatch (Closes: #490640)
+ * Sync Ubuntu patches & changes:
+ debian/patches/pdf_printing_support.dpatch
+ debian/patches/pjl-duplex-binding.dpatch
+ debian/patches/kde4-kdesudo-support.dpatch
+ debian/patches/bugs-in-generated-ppds.dpatch
+ - Exclude /usr/share/hplip/install.py
+ - hplip-gui requires one of "gksu", "kdesu", and "kdesudo"
+ - debian/rules: Add *cupsFilter lines for PDF input
+ * unused-override debian/{hpijs,hplip-data}.lintian
+
+ -- Mark Purcell <msp@debian.org> Wed, 15 Oct 2008 23:44:41 +1100
+
+hplip (2.8.6.b-2) unstable; urgency=low
+
+ * Lintian cleanup:
+ * hpijs-ppds Depends: hpijs - lintian:stronger-dependency-implies-weaker
+ * Update 14_charsign_fixes.dpatch
+ - lintian:dpatch-missing-description
+ * hplip.NEWS & hpijs-ppds.NEWS - lintian:syntax-error-in-debian-news-file
+ * hplip-data Depends: python - perhaps should be called hplip-common?
+ - lintian:python-script-but-no-python-dep
+ * -x colorcal4form_base.ui distros.dat executable-not-elf-or-script
+ * Ship small .xpm with hplip not -gui package
+ - lintian:menu-icon-missing
+ * hplip.lintian libhpip0 & libhpmud0 - not shared libs internal only
+ - lintian:package-name-doesnt-match-sonames
+ * Update debian/hplip-doc.doc-base
+ - lintian:doc-base-abstract-might-contain-extra-leading-whitespaces
+ * hplip-doc.doc-base Section: System/Administration
+ - lintian:doc-base-unknown-section
+ * Cleanup hplip.lintian - linitan:unused-override
+ * Cleanup *.desktop - lintian:desktop-entry-contains-encoding-key
+ * Fixup hplip/presubj lintian:executable-not-elf-or-script
+ * Add URL to hp-makeuri-uri-only-output.dpatch Description ##DP
+
+ * Other issues:
+ * Enable GNU/kFreeBSD builds - thanks Petr Salinger
+ - FTBFS on GNU/kFreeBSD (fixup of debian/rules needed) (Closes:
+ #497625)
+ * Fixup hpojs-ppds.postinst s/cupsys/cups/ - thanks Michael Wagner
+ - postinst invokes cupsys instead of cups (Closes: #498156)
+ * Really apply hp-makeuri-uri-only-output.dpatch - thanks Avi Rozen
+ - hp-makeuri -c does not print cups uri (Closes: #500183)
+
+ -- Mark Purcell <msp@debian.org> Sun, 12 Oct 2008 22:45:42 +1100
+
+hplip (2.8.7-0ubuntu6) intrepid; urgency=low
+
+ * debian/patches/kde4-kdesudo-support.dpatch: KDE 4 does not use "kdesu"
+ any more for running applications as root. It uses "kdesudo" now. Added
+ support for this change (LP: #281880).
+
+ * debian/control: hplip-gui requires now one of the three packages which
+ provide the tools "gksu", "kdesu", and "kdesudo" (LP: #281880). Unneeded
+ suggest for these packages in the hplip package removed.
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Mon, 13 Oct 2008 11:48:02 +0200
+
+hplip (2.8.7-0ubuntu5) intrepid; urgency=low
+
+ * debian/patches/text-only-without-systray-applet-traceback.dpatch: Suppressed
+ another error message which appears when working without python-qt[34]
+ packages installed.
+ * debian/non-shipped-files.txt: Exclude /usr/share/hplip/install.py from
+ installation. In a from-package-installed HPLIP it does not make sense,
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Thu, 9 Oct 2008 9:37:02 +0200
+
+hplip (2.8.7-0ubuntu4) intrepid; urgency=low
+
+ * debian/patches/text-only-without-systray-applet-traceback.dpatch: Let
+ hp-systray fail silently, without traceback if we are on a standard desktop
+ installation without python-qt3 and hplip-gui (LP: #277005).
+ * debian/patches/systray-applet-with-qt4.dpatch: Start hp-systray (system
+ tray applet) with the "--qt4" option. Without the option it does not
+ integrate in the tray but floats around on the desktop.
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Wed, 8 Oct 2008 23:37:02 +0200
+
+hplip (2.8.7-0ubuntu3) intrepid; urgency=low
+
+ * debian/patches/bugs-in-generated-ppds.dpatch: Fixed several bugs in the
+ CUPS-DDK-generated PPD files: No A3 paper size for many inkjets (LP:
+ #258881), incorrect PPD entries for custom page size (LP: #264727), no
+ resolution hints for applications in the PPD file (LP: #267669).
+ * debian/patches/pjl-duplex-binding.dpatch: Fixed short-edge duplex for
+ non-PostScript laser printers (LP: #244295),
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Tue, 23 Sep 2008 13:20:02 +0200
+
+hplip (2.8.7-0ubuntu2) intrepid; urgency=low
+
+ * debian/patches/pdf_printing_support.dpatch: Let an additional
+ "*cupsFilter" line for PDF as input format be added to the PPD files,
+ to enable PDF-based printing.
+ * debian/rules: Add *cupsFilter lines for PDF input to all the ready-made
+ PPD files.
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Wed, 13 Aug 2008 12:40:02 +0200
+
+hplip (2.8.7-0ubuntu1) intrepid; urgency=low
+
+ * New upstream release
+ o HPLIP 2.8.7: Support for new printers and bug fixes.
+ o New models supported: HP DeskJet f735 AIO, d730, PhotoSmart
+ a532, a536, a538, c5500 AIO.
+ * debian/patches/hp-makeuri-uri-only-output.dpatch: Removed, applied
+ upstream.
+ * debian/patches/hp_photosmart_pro_b9100_support.dpatch: Regenerated.
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Sun, 10 Aug 2008 14:00:02 +0200
+
+hplip (2.8.6.b-1) unstable; urgency=low
+
+ [ Till Kamppeter ]
+ * New upstream release
+ o HPLIP 2.8.6b, used 2.8.6.b as upstream version number so that this
+ is considered newer than 2.8.6 and older than 2.8.7 for all binary
+ packages.
+ o Removal of prematurely introduced code (exact problems
+ caused by that were not specified by HPLIP developers at HP).
+ * debian/patches/hp-makeuri-uri-only-output.dpatch: Fix URI-only output
+ of hp-makeuri. This is required for system-config-printer to assign
+ HPLIP CUPS backends to print queues (Fixes LP: #245199).
+ * debian/rules, debian/hpijs.version, debian/autogen.sh: Drop extra version
+ number from HPIJS, now HPIJS and HPLIP have always the same version
+ number.
+
+ [ Mark Purcell ]
+ * Upstream version 2.8.6 not to be distributed (use 2.8.6b or 2.8.7
+ instead) (Closes: #494659)
+ - Discussed on debian-release
+ * spurious version numbering for hpijs packages (Closes: #452574)
+
+ -- Mark Purcell <msp@debian.org> Mon, 01 Sep 2008 19:59:40 +1000
+
+hplip (2.8.6.b-0ubuntu1) intrepid; urgency=low
+
+ * New upstream release
+ o HPLIP 2.8.6b, used 2.8.6.b as upstream version number so that this
+ is considered newer than 2.8.6 and older than 2.8.7 for all binary
+ packages.
+ o Removal of prematurely introduced code (exact problems
+ caused by that were not specifiedb HPLIP developers at HP).
+ * debian/control: Put hplip-gui into Suggests: (Ubuntu requirement
+ for GNOME/GTK-based desktop live CDs).
+ * debian/patches/hp-makeuri-uri-only-output.dpatch: Fix URI-only output
+ of hp-makeuri. This is required for system-config-printer to assign
+ HPLIP CUPS backends to print queues (Fixes LP: #245199).
+ * debian/rules, debian/hpijs.version, debian/autogen.sh: Drop extra version
+ number from HPIJS, now HPIJS and HPLIP have always the same version
+ number.
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Thu, 24 Jul 2008 11:00:02 +0200
+
+hplip (2.8.6-2) unstable; urgency=low
+
+ * Suggests: kdebase-bin (<< 4:4.4.0-1)
+ - unversioned dependency on kdebase-bin (Closes: #460482)
+ * hplip-gui Depends: dbus-x11
+ - hp-toolbox: Unable to connect to dbus session bus (Closes: #489677)
+ * Replace [Build-Depends:,Depends:] s/cupsys/cups/
+ - hplip depends on defunct cupsys (Closes: #487726)
+ * Do not set MODE in 55-hpmud.rules
+ * Re-promote hplip-gui to Recommends: See LP:248656
+ * Demote openprinting-ppds to Suggests:
+ * udev 024-hpmud.rules to set before 025-libgphoto2.rules
+ - workaround hpmud clashes with wildcards See LP:248093
+ * Install udev-dummy.rules to smooth upgrade from obsolete conffiles:
+ 45-hplip.rules & 55-hpmud.rules
+ * Update hplip.NEWS to document the need to be a member of group 'scanner'
+ on Debian (Closes: #479118)
+
+ -- Mark Purcell <msp@debian.org> Tue, 15 Jul 2008 20:44:25 +1000
+
+hplip (2.8.6-1ubuntu3) intrepid; urgency=low
+
+ * Drop hplip -> hpijs-ppds Recommends altogether. Till says: "hpijs-ppds
+ is not needed. It is a bunch of ready-made PPDs which are for us
+ generated by the hpijs.drv file coming with the HPIJS package and CUPS
+ DDK."
+
+ -- Colin Watson <cjwatson@ubuntu.com> Fri, 04 Jul 2008 17:20:56 +0100
+
+hplip (2.8.6-1ubuntu2) intrepid; urgency=low
+
+ * Drop hplip-gui to Suggests. It uses Qt so isn't appropriate in the
+ Ubuntu desktop, and we have system-config-printer anyway.
+
+ -- Colin Watson <cjwatson@ubuntu.com> Fri, 04 Jul 2008 17:09:34 +0100
+
+hplip (2.8.6-1ubuntu1) intrepid; urgency=low
+
+ * Merge with Debian unstable. No remaining Ubuntu changes.
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Mon, 23 Jun 2008 16:37:02 +0200
+
+hplip (2.8.6-1) unstable; urgency=low
+
+ * New upstream release
+ * /usr/share/bug: run hp-check & refer inital reports to upstream LP
+ * Refresh: debian/patches/87_move_documentation.dpatch
+ - hp_photosmart_pro_b9100_support.dpatch
+ * Fixed upstream: systray_applet_really_in_tray.dpatch
+ * Remove obsolete Depends: for gs and friends
+
+ -- Mark Purcell <msp@debian.org> Sun, 22 Jun 2008 18:50:45 +1000
+
+hplip (2.8.5-2ubuntu1) intrepid; urgency=low
+
+ [ Till Kamppeter ]
+ * Sync new upstream release from Debian.
+ WARNING: There were major changes applied to the hp-toolbox which
+ introduced new bugs. Please test the toolbox and report any problem
+ as soon as possible to the upstream bug tracker
+ http://launchpad.net/hplip/ to get the problems fixed in the next
+ upstream release (there will be one or two before Intrepid Feature
+ Freeze).
+ * debian/rules, debian/hplip.install: Install the hplipjs CUPS filter
+ for PostScript printers.
+
+ [ Mark Purcell ]
+ * Stop hplip.post{rm,inst} playing with scanner group - libsane does
+ and do not delete hplip user on purge:
+ - postrm attempts to remove group scanner unconditionally (Closes:
+ #476126)
+ - unconditional use of deluser in postrm (Closes: #454084)
+ * Build-Depends: python-qt3, python-qt4
+ - HPLIP is still essentially a Qt3 application (Closes: #482095)
+ * lintian fixes:
+ - debian-rules-ignores-make-clean-error
+ - stronger-dependency-implies-weaker hplip recommends -> suggests
+ - dpatch-missing-description 61_noqt_message.dpatch
+ - dpatch-missing-description 85_rebuild_python_ui.dpatch
+ - dpatch-missing-description 87_move_documentation.dpatch
+ - dpatch-missing-description systray_applet_really_in_tray.dpatch
+ - dpatch-missing-description hp_photosmart_pro_b9100_support.dpatch
+ - dpatch-missing-description systray_applet_really_in_tray.dpatch
+ - syntax-error-in-debian-news-file
+ - NEWS not displayed (Closes: #479118)
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Mon, 9 Jun 2008 10:37:02 +0200
+
+hplip (2.8.5-1) unstable; urgency=low
+
+ * New upstream release
+ * Various lintian cleanups
+ * Fixup debian/patches/87_move_documentation.dpatch
+ * Remove: hp-sendfax_crash_on_cancel.dpatch - included upstream
+ * Add Depends: python-qt3, python-qt4 - shouldn't be necessary ;-(
+ - broken systray icon (Closes: #482095)
+ * Remove obsolete hplip.README.Debian
+ - README.Debian.gz is not accurate (Closes: #454086)
+ - Scanners don't work because hplip service is no more available.
+ (Closes: #482690)
+
+ -- Mark Purcell <msp@debian.org> Fri, 30 May 2008 19:01:07 +1000
+
+hplip (2.8.4-1) unstable; urgency=low
+
+ * Sync Debian with Ubuntu
+ - new upstream version 2.8.4 (Closes: #462163)
+
+ -- Mark Purcell <msp@debian.org> Tue, 13 May 2008 20:30:37 +1000
+
+hplip (2.8.4-0ubuntu1) intrepid; urgency=low
+
+ * New upstream release
+ o Closes: #462163
+ o dbus communication support. All interprocess communication now occurs
+ using the dbus message bus. python-dbus version 0.80 or greater is
+ required.
+ o Elimination of all persistent startup daemons. hpssd has been
+ replaced with hp-systray that loads as a user startup item in the
+ system tray in each user's desktop environment. When no HPLIP
+ tools are running (e.g., hp-toolbox), and the user closes or
+ disables hp-systray, there will be no HPLIP processes running
+ whatsoever. Consequently, there is no longer an /etc/init.d/hplip
+ startup script, and no processes need be run at system startup
+ time.
+ o PC send fax requires dbus support and a running hp-systray to
+ operate. Only Linux distributions that have python-dbus 0.80 or
+ greater support PC send fax as of this release.
+ o Added support for the following new printers: HP LaserJet M1120 MFP,
+ M1120n MFP, OfficeJet J6400, Photosmart C4340, Photosmart Pro B8800.
+ * debian/hplip.links: Added /usr/bin/hp-systray link.
+ * debian/hplip-gui.install: Added /etc/xdg/autostart/hplip-systray.desktop.
+ * debian/patches/systray_applet_really_in_tray.dpatch: The systray applet
+ needs to be started in QT4 mode so that it really gets into the tray.
+ * debian/patches/hp_photosmart_pro_b9100_support.dpatch: Corrections
+ on the models.dat entry for the HP PhotoSmart Pro B9100, especially
+ for the correct color calibration mode.
+ * debian/patches/hp-sendfax_crash_on_cancel.dpatch: hp-sendfax crashed
+ when a fax job fails or gets canceled via the cancel button on the
+ printer.
+ * debian/patches/90_pseudo_id_fax_2.dpatch,
+ debian/patches/91_dj895_powerup.dpatch,
+ debian/patches/hp_clj_3600_best_color_mode.dpatch,
+ debian/patches/hp_oj_h470_alignment.dpatch,
+ debian/patches/hp-setup_crash.dpatch: Removed, merged upstream.
+ * debian/patches/85_rebuild_python_ui.dpatch: Regenerated.
+ * debian/control: Added dependency on python-dbus 0.80 or newer and on
+ libdbus-1-dev.
+ * debian/control: Switched dependencies from python-qt3 to
+ python-qt4.
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Fri, 2 May 2008 10:37:02 +0200
+
+hplip (2.8.2-1) unstable; urgency=low
+
+ * Sync Debian release with Ubuntu
+ - Non-root users need to be in group scanner! (Closes: #454339)
+ - Uses update-rc.d remove while init script exists; upgrade fails
+ (Closes: #456378)
+ - should use plugdev rather than scanner group (Closes: #452454)
+ - sane-utils: Scanner only accessible under root (Closes: #462563)
+ - cupsys: HPLIP drivers listed twice (Closes: #463786)
+ - hpijs-ppds' symlink in /usr/share/cups/model causes dups (Closes:
+ #452455)
+ - hp-setup fails to find PPD file (Closes: #457771)
+
+ -- Mark Purcell <msp@debian.org> Mon, 21 Apr 2008 19:58:16 +1000
+
+hplip (2.8.2-0ubuntu8) hardy; urgency=low
+
+ * debian/local/scripts/create_hal_global_fdi_from_hpmud_rules.sh: Corrected
+ fdi script so that it actually works (LP: #195782).
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Tue, 15 Apr 2008 13:28:52 +0200
+
+hplip (2.8.2-0ubuntu7) hardy; urgency=low
+
+ * debian/control: Let hplip-gui depend on python-reportlab instead
+ of hplip recommending it. python-reportlab is used by the GUI of
+ hp-sendfax to add cover pages. In command line mode of hp-sendfax
+ cover pages are not supported (LP: #211249).
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Fri, 4 Apr 2008 13:28:52 +0200
+
+hplip (2.8.2-0ubuntu6) hardy; urgency=low
+
+ * debian/control: Let hpijs depend on foomatic-filters (LP: #187403).
+ * debian/control, debian/hplip.links: Added missing links to utilities
+ hp-check and hp-scan. Added dependency on python-imaging for hp-scan.
+ * debian/rules: Corrected filter name from "foomatic-rip-hplip" to
+ "foomatic-rip" (LP: #211382).
+ * debian/hplip.preinst: Remove obsolete /etc/default/hplip file before
+ installation of the hplip binary package (LP: #211377).
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Thu, 3 Apr 2008 22:28:52 +0200
+
+hplip (2.8.2-0ubuntu5) hardy; urgency=low
+
+ * debian/local/scripts/create_hal_global_fdi_from_hpmud_rules.sh,
+ debian/rules, debian/hplip.install: Generate fdi script to make
+ HP devices accessible for the desktop user currently logged in
+ (LP: #195782).
+ * debian/patches/hp_oj_h470_alignment.dpatch: Fixed head alignment for
+ HP OfficeJet H470 (LP: #204157).
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Tue, 1 Apr 2008 15:28:52 +0200
+
+hplip (2.8.2-0ubuntu4) hardy; urgency=low
+
+ * debian/hpijs-ppds.links: Removed. The link into /usr/share/cups/model
+ leads to duplicate listing of the PPDs by CUPS 1.3.x.
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Sun, 23 Mar 2008 23:08:52 +0100
+
+hplip (2.8.2-0ubuntu3) hardy; urgency=low
+
+ * debian/patches/hp-setup_crash.dpatch: Fix crash of hp-setup (LP: #181242)
+ * debian/patches/hp_clj_3600_best_color_mode.dpatch: Fix "Best" color mode of
+ the HP LaserJet 35xx/36xx (LP: #200147).
+ * debian/patches/91_dj895_powerup.dpatch: Fix problem that HP DeskJet 895C
+ (and similar printers) did not get woken up from power saving mode when a
+ job was sent (LP: #155965).
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Thu, 13 Mar 2008 12:08:52 +0100
+
+hplip (2.8.2-0ubuntu2) hardy; urgency=low
+
+ [ Till Kamppeter ]
+ * debian/rules: Install the new fax PPD file for color fax devices
+ (currently only HP LaserJet M2727 series, Ubuntu LP: #59409).
+ * debian/hplip.postinst: Fix PPD paths in /etc/hp/hplip.conf, so that
+ hp-setup finds the fax PPDs (Ubuntu LP: #59409).
+ * debian/hplip.postinst: Removed code to correct permissions of .hplip
+ personal config in user's home directories (Ubuntu LP: #191299).
+
+ [ Mark Purcell ]
+ * Added NEWS/ README entry about the need to use 'scanner' group
+ - Non-root users need to be in group scanner! (Closes: #454339)
+ - should use plugdev rather than scanner group (Closes: #452454)
+ - sane-utils: Scanner only accessible under root (Closes: #462563)
+ * Force (-f) removal of init.d scripts
+ - Uses update-rc.d remove while init script exists; upgrade fails
+ (Closes: #456378)
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Tue, 26 Feb 2008 10:08:52 +0100
+
+hplip (2.8.2-0ubuntu1) hardy; urgency=low
+
+ * New upstream release
+ o PPDs generated on-the-fly by the CUPS DDK
+ o Corrected IPP printer state messages
+ o Fixed segmentation faults in HPIJS (Upstream bug LP: #182658)
+ o Many bug fixes
+ o Battery monitoring for OfficeJet H470, fax for LaserJet M2727
+ o New models supported: HP LaserJet P1005, P1006, P1505, P1505n,
+ Officejet H470, LaserJet P2014
+ * debian/control: Added build dependency on CUPS DDK, standards version
+ 3.7.3, let also HPIJS depend on CUPS DDK.
+ * debian/hpijs.install: Added PPD generator data file
+ /usr/share/cups/drv/hpijs.drv
+ * debian/patches/89_hplip-alloc.dpatch: Removed, fixed upstream
+ * debian/rules: Removed Foomatic-XML-related stuff, use configure options
+ to let PPDs get generated on-the-fly by the CUPS DDK, do not modify the
+ fax PPD.
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Tue, 12 Feb 2008 11:02:42 +0100
+
+hplip (2.7.12-0ubuntu2) hardy; urgency=low
+
+ * debian/patches/89_hplip-alloc.dpatch: The hpijs compression
+ module did not allocate enough memory (Upstream bug LP: #182658).
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Mon, 28 Jan 2008 11:34:49 +0000
+
+hplip (2.7.12-0ubuntu1) hardy; urgency=low
+
+ * Now upstream release
+ o PJL support for HP LaserJets for in-band status check
+ o New print modes for LJJetReady device class (HP Color LaserJet
+ 3600/3500/3550).
+ o Improvement of plug-in download by hp-setup.
+ o Bug fixes, especially for fax.
+ o New models supported: HP LaserJet M2727 MFP (printing only, no
+ scanning or fax), HP LaserJet M1005 MFP (printing only, no scanning),
+ HP LaserJet 1000/1005, HP Color LaserJet 3600/3500/3550, HP LaserJet
+ 9040.
+ * debian/rules, debian/45-hplip.rules, debian/check_mfp_printer: Removed
+ /etc/udev/rules.d/45-hplip.rules and check_mfp_printer, HP provides a
+ solution from upstream now.
+ * debian/55-hpmud.rules: Updated for compatibility with kernel 2.6.24 and
+ newer (Ubuntu bug LP: #181242).
+ * debian/patches/87_move_documentation.dpatch: Updated patch for new HPLIP
+ version.
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Sat, 12 Jan 2008 14:34:49 +0000
+
+hplip (2.7.10-5ubuntu1) hardy; urgency=low
+
+ * Merge with Debian unstable. No remaining Ubuntu changes.
+ * debian/rules: Added "--with-hpppddir=\$${prefix}/share/ppd/hpijs/HP" to
+ "./configure" call so that "hp-setup" will find the fax PPD (Ubuntu bug
+ LP: #59409).
+ * debian/rules: Removed "--dpkg-shlibdeps-params=--ignore-missing-info"
+ from dh_shlibdeps. Does not build under Ubuntu.
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Thu, 6 Dec 2007 16:34:49 +0000
+
+hplip (2.7.10-5) unstable; urgency=low
+
+ * Check for old init scripts [ -x /etc/init.d/hplip ] and manually
+ remove them before we call update-rc.d
+ - preinst fails: update-rc.d: /etc/init.d/hplip exists (Closes: #453902)
+
+ -- Mark Purcell <msp@debian.org> Sun, 02 Dec 2007 23:07:48 +0100
+
+hplip (2.7.10-4) unstable; urgency=low
+
+ * Extremadura release ;-)
+
+ * Provide debian/shlibs lintian: shlib-missing-in-control-file
+ - FTBFS on amd64/sid (Closes: #453361)
+ * Rewrite hplip.preinst to not call killall
+ - predepend on psmisc (?) (Closes: #452408)
+ * Switch hplip.{pre,post}inst to use update-rc.d & invoke-rc.d
+ - maintainer-script-calls-init-script-directly (Closes: #452244)
+ * Cleanup hplip.menu
+ - please change default icon to /usr/share/pixmaps/HPmenu.xpm
+ (Closes: #415048)
+ * Remove Depends: sysv-rc
+
+ -- Mark Purcell <msp@debian.org> Sat, 01 Dec 2007 01:36:25 +0100
+
+hplip (2.7.10-3) unstable; urgency=low
+
+ * Update debian/watch - thks Chris Lamb
+ - debian/watch file incorrect (Closes: #415926)
+ - debian/watch fails to report upstream&#39;s version (Closes:
+ #449610)
+ * debian/rules dh_shlibdeps --dpkg-shlibdeps-params=--ignore-missing-info
+
+ -- Mark Purcell <msp@debian.org> Thu, 22 Nov 2007 08:00:37 +0000
+
+hplip (2.7.10-2) unstable; urgency=low
+
+ * Unstable upload
+ * debian/control
+ - Homepage: http://hplip.sourceforge.net/
+ - Vcs-Svn: svn://svn.debian.org/pkg-hpijs/hplip/trunk/
+ - Vcs-Browser: http://svn.debian.org/wsvn/pkg-hpijs/hplip/?op=log
+
+ -- Mark Purcell <msp@debian.org> Wed, 21 Nov 2007 06:19:34 +0000
+
+hplip (2.7.10-1) experimental; urgency=low
+
+ * Shadow ubuntu release into debian experimental
+ - new upstream release (Closes: #413225)
+ * TODO inport into CVS/ SVN
+
+ -- Mark Purcell <msp@debian.org> Mon, 29 Oct 2007 22:14:02 +0000
+
+hplip (2.7.10-0ubuntu1) hardy; urgency=low
+
+ * New upstream release
+ o hp-setup capable of loading non-free driver extensions from the
+ internet (usually from OpenPrinting)
+ o hp-sendfax problem of not being able add files fixed upstream
+ (LP: #153152)
+ o New models supported: HP Officejet Pro K8600, Photosmart C4380 Series,
+ LaserJet 1018, 1020, 1022, 1022n, 1022nw, Deskjet 550C
+ * No modification of the upstream source tarball needed any more.
+ * debian/patches/70_no_fail_on_bad_locales.dpatch: Removed, does not apply
+ to current upstream source code any more.
+ * debian/patches/90_subprocess_replacement.dpatch: Removed, fixed upstream.
+ * debian/control: Let hpijs depend on hplip (LP: #149511).
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Sat, 27 Oct 2007 14:34:49 +0100
+
+hplip (2.7.7.dfsg.1-0ubuntu5) gutsy; urgency=low
+
+ * SECURITY UPDATE: arbitrary command execution via network
+ * Add debian/patches/90_subprocess_replacement: use subprocess instead.
+ * References
+ https://launchpad.net/bugs/149121
+ CVE-2007-5208
+
+ -- Kees Cook <kees@ubuntu.com> Thu, 11 Oct 2007 10:25:17 -0700
+
+hplip (2.7.7.dfsg.1-0ubuntu4) gutsy; urgency=low
+
+ * debian/55-hpmud.rules: Changed UDEV rules to set owner "lp",
+ group "scanner", and permissions 0660 for the /dev/... files, so
+ that non-privileged users (not in "lp" group, but in "scanner"
+ group) can also access the HP printers. Simply using 0666
+ permissions is a security problem (LP: #147369).
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Thu, 4 Oct 2007 21:05:57 +0100
+
+hplip (2.7.7.dfsg.1-0ubuntu3) gutsy; urgency=low
+
+ * debian/rules, debian/55-hpmud.rules:
+ Updated UDEV rules for HPLIP to the ones of HPLIP 2.7.9. The current
+ rules do not work any more (LP: #147369)
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Wed, 3 Oct 2007 16:05:57 +0100
+
+hplip (2.7.7.dfsg.1-0ubuntu2) gutsy; urgency=low
+
+ * debian/control, debian/hplip.install, debian/hplip-gui.install,
+ debian/rules:
+ Moved menu entries for the GUI utilities into the new hplip-gui package.
+ This package requires python-qt3 and so the menu entries can never appear
+ if python-qt3 is not installed. Let the main package (hplip) recommend
+ hplip-gui instead of python-qt3 now. Fixes: LP: #67892, LP: #86893,
+ LP: #134480, LP: #137168
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Wed, 5 Sep 2007 10:05:57 +0100
+
+hplip (2.7.7.dfsg.1-0ubuntu1) gutsy; urgency=low
+
+ * Modified upstream source tarball: Firmware files for HP LaserJet 1018
+ and 1020 removed on HP's request
+ * debian/control, debian/rules, debian/hplip-data.install,
+ debian/hplip-firmware.install: Removed hplip-firmware binary package.
+ * debian/README.Source: Updated packaging documentation
+ * debian/hpijs.README.Debian, debian/hpijs.NEWS, debian/hpijs-ppds.NEWS,
+ debian/hpijs.1, debian/control: linuxprinting.org -> openprinting.org
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Wed, 22 Aug 2007 20:41:57 +0100
+
+hplip (2.7.7-0ubuntu4) gutsy; urgency=low
+
+ * debian/hplip.install: Added missing line "usr/lib/lib*.so.*" (LP: #132670,
+ LP: #132781)
+ * debian/hplip.preinst: Remove init scripts of former 1.x HPLIP versions
+ * debian/hplip.default: Removed, as we do not have permanently running
+ daemons any more.
+ * debian/hplip.rtupdate, debian/rules, debian/hplip.install: Removed update
+ helper, as we do not have permanently running daemons any more.
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Fri, 17 Aug 2007 15:40:55 +0100
+
+hplip (2.7.7-0ubuntu3) gutsy; urgency=low
+
+ * debian/control: Added "automake" and "libtool" to "Build-Depends"
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Mon, 13 Aug 2007 15:40:55 +0100
+
+hplip (2.7.7-0ubuntu2) gutsy; urgency=low
+
+ * debian/control: Added "autoconf" to "Build-Depends"
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Mon, 13 Aug 2007 09:40:55 +0100
+
+hplip (2.7.7-0ubuntu1) gutsy; urgency=low
+
+ * New upstream release
+ * Closes: LP: #103871, LP: #109871
+ * HPLIP 2.7.7
+ + Fixed issues with ppd_install and ppd_dir in the installer
+ + Device-id and device-status queries can now be made on more than
+ just the 7/1/2 interface.
+ + Added pre_install_cmd to installer to fix cups issue in PCLinuxOS
+ and Mandriva
+ + Added darwin build support to makefile.
+ + Removed the localOnly conditional in the sane hpaio backend. This
+ was needed for saned usage.
+ + Fixed defect (Print Settings for fax device is incorrect after
+ switching to other tabs.)
+ + Fixed defect (The default unload directory path is invalid if user
+ is root.)
+ + Fixed defect (Wrong release dates for Fedora distros are displayed
+ in terminal.)
+ + Added Mandriva 2007.1 to distros.dat
+ + Added Ubuntu 7.10 to distros.dat
+ + Fixed defect (Entering hp-setup -bnet command in terminal, some
+ error information occurs when network is unreachable.)
+ + Fixed defect (hp-testpage produces traceback)
+ + Added some additional error checking to type 3 status (LaserJets)
+ + Re-designed hp-fab database backend (no longer uses KirbyBase,
+ instead uses pickle)
+ + Converted hp-fab and hp-sendfax to handle non-ascii characters (Unicode)
+ + Added a distros.dat flag to handle usermod command with/without -a
+ + Added a temporary printer destination codepath for hp-scan
+ + Enhanced hp-setup launch code for the text installer
+ + Lots of code cleanup in the logging facility
+ + Fixed the constraints system in hp-scan (can use list based and
+ tuple based constraints)
+ + Removed '-a' from usermod command in installer
+ + Converted code to use unicode when dealing with UI strings and
+ user originated strings
+ + Explicitly convert to utf-8 for file logging output
+ + Added compile flag conditional compilation in hpmudext.c for parallel
+ and network support
+ + Fixed the run command in core_install so that exceptions wouldn't
+ pass silently
+ + Enhanced get_distro() in core_install so that it handles lsb_release
+ output better
+ + Fixed disable-pp-build and disable-net-build in hpmud.
+ + Added localization files to tarball.
+ + Various small bug fixes (esp. in the installer)
+ * HPIJS 2.7.7
+ + Added support for the following new printer(s).
+ * HP PhotoSmart A620 Series (PSP470)
+ * HP PhotoSmart A820 Series (PSP470)
+ * HP PhotoSmart A520 Series (DJGenericVIP)
+ * HPLIP 2.7.6
+ + Major version number change denotes new functionality.
+ * No more Start-up daemons
+ * New Direct Device I/O (hpmud)
+ * Controllable Permissions
+ * Single 'Make' File
+ * Support for Dynamic PPD file generation
+ * New hp-scan command
+ + Replaced hpiod with the new HP Multi-Point Transport Driver (hpmud).
+ Hpmud is a shared library instead of a daemon.
+ + Hpssd is started automatically when needed by HPLIP.
+ + Removed HPIJS makefile. There is now only one makefile for HPLIP.
+ + Added the following new HPLIP configure options.
+ --enable-doc-build enable documentation build (default=yes)
+ --enable-hpijs-only-build enable hpijs only build (default=no)
+ --enable-foomatic-ppd-install enable foomatic ppd install, uses
+ hpppddir default=no
+ --enable-foomatic-xml-install enable foomatic xml install, uses
+ foomaticdir default=yes
+ --with-cupsbackenddir=DIR set cups backend install directory,
+ default=/usr/lib/cups/backend
+ --with-icondir=DIR set icon install directory,
+ default=/usr/share/applications
+ --with-hpppddir=DIR set hp ppd install directory,
+ default=datadir/ppd/HP
+ --with-docdir=DIR set hplip documentation directory,
+ default=datadir/doc
+ --with-foomaticdir=DIR set foomatic db install directory,
+ default=datadir/foomatic
+ + Old HPIJS configure options --foomatic-install and --cups-install
+ have been removed.
+ + Changed the libsane-hpaio install directory from $(libdir) to
+ $(libdir)/sane.
+ + Fixed installer utilities (permission, trigger, etc) so they can be
+ run manully from tarball root directory
+ + Fixed defect (Some error occurs in terminal and the outputting file
+ is empty when perform a scan job with the option "-mgray".)
+ + Added large file size warning to hp-scan
+ + Added -x/--compression to hp-scan
+ + Added 1200, 2400, and 4800 dpi support to hp-scan
+ + Fixed defect (Traceback - SUSE 10.1 - Changing Tabs To Print Settings)
+ + Fixed defect (Using hp-clean on cmd line fails to clean)
+ + Changed fax check so that low paper or low supplies don't prevent
+ faxing [user reported]
+ + Toolbox will display local docs if doc-build=yes or sf.net docs if
+ doc-build=no
+ + Added hp-unload file removal option
+ + Changed hp-unload progress to a sep. dialog
+ + Fixed an issue with hp-check with 'lp' group test
+ + Added libtool and libgphoto2-devel packages for the libtool
+ dependency for SUSE 10.2
+ + Fixed defect (The files can not be rendered when perform a fax job in
+ terminal on Mepis6.0 OS.)
+ + Added new functionality into the web installer from the text
+ installer a) New data functions b) pre- and post- build actions ('lp'
+ group, udev trigger, etc) c) Some defensive code enhancements
+ + Fixed defect (The scan job is failed if --printer is specified when
+ use "hp-scan" command in non-interactive mode.)
+ + Fixed defect (Mepis and Debian unsubscriptable object on Toolbox launch)
+ + Fixed an issue with stopping the hpssd process in the installer
+ + Added PIL as an optional dependency to the installer
+ + Fixed a couple of text installer issues that were casuing a traceback
+ + Fixed libtool detection
+ + Fixed defect ( Toolbox Looses Communication with Printers after
+ Functions->Unload Photo Card)
+ + Fixed defect (Fax Address Book - fab.db - unable to open or read file)
+ + Added --size=<page size name> parameter to hp-scan
+ + Added ppd_dir data to debian, mepis, suse in distros.py
+ + Fixed 2.7.x jetdirect scanimage issue reported by Suse.
+ + Fixed defect (The installation is failed if packages are missing when
+ install with command "./hplip-install" on Mandriva2007 32bit OS.)
+ + Fixed defect (The Installer process can not setup printer after
+ finishing installation on Ubuntu 7.04 OS.)
+ + Added the symlink fix Dapper to the text installer
+ + Fixed an issue with the hppsd process shutdown
+ + Added libtool dependency to installer
+ + Made all configure time python checks conditional on hpijs-only-build
+ as requested by Suse.
+ + Added USB devnode permission checks to hp-check
+ + Enhanced USB I/O checks in hp-check
+ + Added udev .rules file modification module, installer/permissions.py
+ (called by the installer)
+ + Fixed defect (The Installer process can not setup printer after
+ finishing installation on Ubuntu 7.04 OS.)
+ + Added 'ppd_dir' to text installer
+ + Added "add user to lp group" to text installer
+ + Added hpssd shutdown to text installer
+ + Fixed a problem with the configure flags in the installer
+ + Added a root user check to the text installer
+ + Cleaned up the text formatting in the installer
+ + Added some distro data convenience functions in the installer
+ + Added a check for adept-updater on Ubuntu
+ + Fixed the HPLIP detection function
+ + Changed the launching of hp-setup so that the entered su/sudo
+ password is used
+ + Changed the CUPS restart so that it only occurs with CUPS 1.1.x
+ + Added the logoff required step in the installer
+ + Added configure option --with-docdir as requested by Suse.
+ + Added CUPS version check to hp-check (requires cups-config)
+ + Added '-p' param to hp-check (pre-check, use before install. Run
+ hp-check w/o -p after install.)
+ + Added USB I/O checks to hp-check
+ + Fixed defect (The Unload Photo Card function is invalid) [fixed
+ error in hpmudext read channel API]
+ + Fixed defect (An error occurs in terminal when manually find a network
+ printer with a numerical type hostname.)
+ + Fixed defect (some error message displays in terminal when enter
+ "hp-print" command if no device is installed.)
+ + Fixed defect (Print command is failed when perform a print job if
+ printers have characters "&", "*", "(", ")", "|", "<", ">", ","
+ or "." in their names.)
+ + Fixed defect which was an issue with displaying non-readable
+ characters in the progress screens.
+ + Fixed defect (An error occurs when execute "hp-align -bnet" command
+ in terminal.)
+ + Added CUPS 1.1 detection and setting of configure flags and paths
+ + Fixed the enable_ppd flag and made it dependent on CUPS 1.1 detection
+ + Fixed a problem in the text installer that caused it to exit if no
+ dependencies were installed
+ + Added a trigger utility so that USB devices will be detected after
+ the .rules files updates occur without replugging (added only to text
+ installer for now)
+ + Fixed defect which was an issue in canceling the installation process
+ in the progress screens.
+ + Fixed defect (Bad usability is brought if the Auto Refresh function is
+ enabled.)
+ + Fixed defect (The auto refresh can be enabled by click the OK button
+ on Settings window.)
+ + Fixed defect which was an issue in the script that runs the install
+ options of the GUI installer.
+ + Changed location of all user files to ~/.hplip/ directory (fax files,
+ hplip.conf, and fab data file)
+ + Added sane-devel to installer dependencies
+ + Made the ppd_install flag be per distro and version rather than just
+ for distro due to Fedora 5/6
+ + Removed LSB dependency info from each distro dataset
+ + Fixed defect (The send fax job can not performed successfully over
+ network)
+ + Added printer list to toolbox status bar [partially fixes user request]
+ (defect)
+ + Fixed defect (Some error messages displayed in terminal when executing
+ hp-sendfax command in terminal.)
+ + Fixed defect (The hp-setup is invalid if disable GUI option during
+ install the build.)
+ + Added bootstrap --ppd to build.py and dist.py
+ + Fixed defect (The check job can not be finished completely before
+ install the build.)
+ + Added udev 55-hpmud.rules to "make install". Users will have to be a
+ member of the "lp" group in order to have access USB/Parallel devices.
+ + Fixed hp-makeuri and underlying API
+ + Fixed defect (Toolbox cannot be launched if the build
+ hplip-2.7.5.6-shadow is installed with PC Send Fax option disabled
+ via GUI Installer.)
+ + Added libsane check at configure time.
+ + Fixed models.dat and models dat editor tool for hpmud support
+ + Added HPLIP_BUILD to dat editor tool
+ + Fixed defect (adding unsupported file type to fax causes traceback)
+ + Improved build time support for missing Python extensions
+ + Added MakeURI APIs to hpmudext
+ + Removed hpiod and hplip start/stop script.
+ + Fixed defect (An error occurs in terminal when perform a copy job with
+ Best Copy Quality in GUI mode.)
+ + Fixed defect ([Photosmart 7550] no photo cart, clicking color cal
+ causes traceback)
+ + Fixed defect (hpssd.py crashed with IOError in __init__() [Launchpad
+ bug #103871])
+ + Fixed defect (toolbox crashed with AttributeError in
+ printButton_clicked() [Luanchpad bug #109871])
+ + Preliminary version of hp-scan checked in (ver. 0.1 -lots of missing
+ features)
+ + Changed to hpssd auto start functionality to use port detection rather
+ than .pid/.port files. Hpssd no longer supports dynamic port
+ assignments. Its is recommended that only the IANA port as specified
+ in hplip.conf be used (port 2207). Hpssd does not create any .pid or
+ .port files in /var/run or /tmp.
+ + Added a missing file 'warnings.tmpl' to the Makefile.am.
+ + Fixed defect (toolbox crashed with IndexError in UpdatePrinterCombos()
+ [launchpad])
+ + Flated the postscript ppd directory foomatic-db/db/source/PPD/HP/.
+ + Fixed defect (Some error messages displayed in terminal when executing
+ hp-sendfax command in terminal.)
+ + Changed build and dist scripts so that they work with new unified
+ makefile and ppd/xml changes
+ + Changed text (CLI) installer to work with new unified makefile and
+ ppd/xml changes
+ + Fixed defect (No prompt pops up if execute hp-unload in terminal when
+ add the device Deskjet d1460 to PC which does not support Photo Unload
+ function.)
+ + Fixed defect (The prompt dialog does not pop up when adding a
+ unsupported file type to the printer from toolbox.)
+ + Fixed defect (A spelling mistake is found in Functions tab of Configure
+ window.)
+ + Fixed defect (Some controls are not fully displayed on Print Control
+ table of toolbox.)
+ + Added HP specific foomatic database to tar ball. This will allow
+ foomatic db installs or PPD installs.
+ + Removed code for screen that shows the optional path installation
+ (defect).
+ + Merged new hpssd autostart code
+ * HPIJS 2.7.6
+ + Removed ESC*p command from DJGenericVIP class for each raster send to
+ fix PhotoSmart C4200 assert
+ + Added support for the following new printer(s).
+ * HP Photosmart C4200 series (DJGenericVIP)
+ * HP Photosmart A320 series (DJGenericVIP)
+ * HP Photosmart A440 series (DJGenericVIP)
+ * HP Color LaserJet CM4730 MFP (LJColor)
+ * HP Color LaserJet CP3505 (LJColor)
+ * LaserJet P2010 (LJMono)
+ * HP Photosmart C5200 series (DJGenericVIP)
+ * HP 910 (DJ3320)
+ * HP 915 (DJ3600)
+ * HPLIP 1.7.4
+ + Fixed defect (The tip of menu "Contents..." is incorrect.) [added F1
+ accelerator]
+ + Fixed defect (The corresponding operation could not work while
+ executing hp-sendfax with "--non-interactive", "--faxnum",
+ "--recipient", "--group", "--logging" parameters in terminal.)
+ + Fixed an issue with adding recipients in fax UI
+ + Fixed defect (The array of the Comments/Notes can not be consistent
+ with that in fax coverpage.) [check "Preformatted" in coverpage dialog
+ to preserve formatting]
+ + Fixed defect (hp-makecopies --quality parameter is invalid.)
+ + Fixed defect (The printer information still displays on Toolbox when
+ refresh the device status after delete the Device.)
+ + Fixed a problem reading USB IEEE 1284 device-id on the Photosmart A420
+ based products in hpiod.
+ + Toolbox internal/built-in makecopies utility
+ + Reworked the user settings code in the toolbox
+ + Added PYTHONINCLUDEDIR configure option.
+ + Removed hplip install code from "make install". Hplip install code is
+ part of the tarball only.
+ + Fixed defect (Fax Address with blank nickname and blank fax number can
+ be added to the Fax Address Book.)
+ + Fixed defect (Some improper messages display in terminal when add a
+ device via Network to a PC that is disconnecting with Network.)
+ + Fixed defect (The word "from" is missing in "Unload Photo Card"
+ section on Functions tab on Toolbox.)
+ + Added icons to action buttons in the toolbox
+ + Fixed defect (The rendering files process hangs up when perform a fax
+ job)
+ + Fixed defect (Some unexpected message displayed in terminal when
+ sending a fax job to a group)
+ + Removed setup.py calls from Makefile.am. Automake now installs python
+ extensions.
+ + Toolbox internal/built-in unload photo card utility
+ + Fixed an issue with align type 10 (and 11) that caused the wrong
+ alignment values to be sent from the GUI alignment tool (hp-align was
+ OK) [reported by user]
+ + Fixed the issue with .hplip.conf owner of root when hp-setup is run
+ 1st [patch to Till]
+ + Added some extra exception handling around device opens in
+ scrolltoolview
+ + Fixed defect (No any hint information to show the printer is stopped
+ when enter hp-print command in terminal to launch a print job.)
+ + Fixed defect (Toolbox can not display the print queue if switch to
+ other tab and then go back to the print tab.)
+ + Fixed defect (Another print job can not be sent to print queue
+ successfully during printing.)
+ + Fixed defect (Some unexpected information displays in terminal when
+ perform a color carlibration job on Photosmart 2575 in GUI mode.)
+ + Added order column and move up/down to hp-print
+ + Toolbox internal/built-in send PC fax utility
+ * HPIJS 2.7.4
+ + Fixed a custom paper size bug that caused unintended scaling in
+ certain cases in services.cpp
+ + Added supply level low warning message in hpijs.cpp as suggested by
+ Tim Waugh
+ + Added support for the following new printer(s):
+ * DeskJet D1400 Series (DJ3320)
+ * DeskJet D2400 Series (DJ3600)
+ * DeskJet D4200 Series (DJ4100)
+ * DeskJet F2100 Series (DJ3320)
+ * DeskJet F4100 Series (DJ3600)
+ * CM8050MFP with Edgeline (PS)
+ * CM8060MFP with Edgeline (PS)
+ * Simplified the packaging making every change done by dpatches and not
+ directly in the source code.
+ o Dropped source code cosmetics in configure.in and Makefile.am
+ o Dropped moving .py files into /usr/lib. These files and also the
+ .pyc files generated from them are distribution-independent.
+ o 85_rebuild_python_ui.dpatch: Moved changes for compiling .ui files
+ to .py files into a dpatch
+ o 87_move_documentation.dpatch: Moved changes for moving the
+ documentation into a dpatch
+ o debian/rules: Set documentation directory by the "./configure"
+ command line.
+ * Removed patches 80_laserjet1100_fix.dpatch,
+ 82_scrolltool_py_deskjet_d4100_claen_device_not_found.dpatch,
+ 84_align10form_py_deskjet_5440_head_align.dpatch, merged upstream.
+ * 70_no_fail_on_bad_locales.dpatch: Rediff.
+ * debian/rules: Updated command line options for ./configure, make
+ debian/autogen.sh being called when Makefile.am and/or configure.in
+ were patched.
+ * debian/rules, debian/hplip-data.links: Do not put .py and .pyc files
+ into /usr/lib/hplip any more. There are REALLY plattform-independent.
+ * debian/control, debian/rules, debian/hplip-data.install,
+ debian/hplip-firmware.install: Created new package for the firmware files
+ for the HP LaserJet 1018 and 1020.
+ * debian/hplip.preinst: Shut down the daemons of the old 1.x.x generation
+ HPLIP and kill hpiod if the shut down did not work.
+ * debian/*.desktop: Show the icons in the menus of Ubuntu/Xubuntu/Edubuntu,
+ as we get a decent error dialog if PyQt is not installed.
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Thu, 9 Aug 2007 18:30:55 +0100
+
+hplip (1.7.3-0ubuntu4) gutsy; urgency=low
+
+ * Restore Scott's change from 0.9.11-2ubuntu3 in Edgy, apparently lost
+ along the way:
+ - Remove stop links from rc0 and rc6.
+
+ -- Colin Watson <cjwatson@ubuntu.com> Wed, 25 Jul 2007 09:03:13 +0100
+
+hplip (1.7.3-0ubuntu3) gutsy; urgency=low
+
+ * debian/control: Remove version numbers from libsnmp-dev build
+ dependency, so that package builds with arbitrary versions of
+ libsnmp.
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Thu, 31 May 2007 15:30:55 +0100
+
+hplip (1.7.3-0ubuntu2) gutsy; urgency=low
+
+ * debian/control: Make the dependencies of the "hpijs" package also be
+ satisfied by "ghostscript" instead of only "gs-...", due to "gs-gpl"
+ having been renamed to "ghostscript" after the ESP/GPL Ghostscript
+ merger.
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Thu, 24 May 2007 11:30:55 +0100
+
+hplip (1.7.3-0ubuntu1) feisty; urgency=low
+
+ * New upstream release (closes: LP#82546, LP#83936, LP#85805, LP#87695,
+ LP#92237, LP#94013, LP#94015, LP#94823, LP#95489)
+ * HPLIP 1.7.3
+ + Added the <nopjl /> tag to hpijs-generator.in. This will remove
+ the extra foomatic PJL options from most HP LaserJet PPD
+ files. The extra foomatic PJL options caused some HPIJS PCL data
+ issues. This fixes a "PCL XL error" on LJ1010/1012 that can
+ occur on different PCs (closes: LP#92237).
+ + Fixed defect (An error occurs when send a fax coverpage with "&"
+ or "<" character in Regarding or Optional Message field.)
+ + Removed banner pages from fax print settings
+ + Altered hpfax: device discovery output to match hp: scheme (CUPS
+ 1.2 only)
+ + Removed the wait cursor during the password entry screen
+ [reported by Johannes]
+ + Added error messages and suppressed content in toolbox when
+ device is not found or unsupported
+ + A new configure option was added --enable-cups11-build, this
+ option controls the hp/hpfax device discovery message when no
+ devices are found. If needed, this option provides backward
+ compatibility with CUPS 1.1.x applications.
+ With --enable-cups11-build set the "no_device_found" message is
+ displayed during device discovery by the "hp" backend.
+ With --disable-cups11-build (default) set the backend prints a
+ scheme based on the following conditions.
+ Condition 1 - no daemons
+ output nothing stdout return exit 1
+ Condition 2 - daemons running, no HP devices, output scheme
+ direct hp "Unknown" "HP Printer (HPLIP)" return exit 0
+ Condition 3 - daemons running, HP printer found, output URI
+ direct hp:/... "hp model" "HP model HPLIP" "deviceid"
+ return exit 0
+ (closes: LP#87695)
+ + Changed the way that hp-setup was being launched from the
+ toolbox, it was hanging on Edgy
+ + Added Tools > Printer Information
+ + Added a check for 'lpr' for Debian installation (to force
+ install of cupsys-bsd)
+ + Moved the password prompt in the text/CLI installer past the
+ distro confirm/select prompts to handle a problem with Mepis
+ + Made a change to determine if networking is working during
+ installation.
+ + Added a private copy of sanei_init_debug to libsane-hpaio. This
+ will remove the libsane.so dependency which was a problem for
+ WINE.
+ + Fixed defect (PPD file "foomatic:HP-PSC_2400-hpijs.ppd" can not
+ be found when set up PSC 2400 in interactive mode, closes
+ LP#95489)
+ + Fixed a page update defect in the toolbox (when switching
+ devices, update page correctly)
+ + Re-wrote hpaioAdvanceDocument function in libsane-hpaio. This
+ change only effects SCL scanners with an ADF (ie: inkjet
+ all-in-ones). This fixes a double-feed ADF issue which occurred
+ when scanning a single page.
+ + Fixed defect (An unexpected error occurs when perform color
+ calibration job in GUI mode on photosmart c7180.)
+ + Some toolbox UI improvements
+ + Converted hp-print to new UI
+ + Fixed some defects in scrollprintview and devmgr
+ + Added network detection to text/CLI installer
+ + Toolbox internal/built-in print utility
+ + Added password entry and validation to text/CLI installer
+ + Fixed an issue when the ~/.hplip.conf file is not present on 1st
+ run, the hp-setup run as root owns the file and doesn't allow the
+ regular user to write to it.
+ + Fixed defect (hp-setup -i can not setup a printer Photosmart
+ c3100 which has multiple possible PPD files.)
+ + Some visual updates to the toolbox
+ + Fixed defect (DJ 4x0 power/battery settings not staying set)
+ + Added a confirmation dialog to device remove in the toolbox
+ + Linked quality and printoutmode in print settings
+ + Switched [x] Enable style controls to (*) On ( ) Off style in
+ print settings
+ + Supply icons auto generate (removed supply PNG icons from
+ data/images)
+ + Fixed an issue with r_values in supplies processing
+ + Added type 12 head support for PS33xx, PSC61xx, etc.
+ + Fixed defect (The Print Settings of Fax device are invalid)
+ + Fixed issue where L7xxx color cal wasn't showing the load paper UI
+ + Fixed defect (The command "hp-setup -i" can not work normally)
+ + Fixed defect (The setup process will hang up when modify the fax
+ name to a name which contains more than 104 characters on setup
+ UI.)
+ + Changed magic.py to better handle text/plain vs. data detection
+ + Added last used working directory support to hp-sendfax,
+ hp-print, and hp-unload
+ * HPLIP 1.7.2 (Not published as Ubuntu or Debian package)
+ + Fixed defect (The fax file is printed out by the sender when use
+ printer name with "-p" parameter to perform a fax job.)
+ + Added CUPS fax queues to Print Settings and Print Control tabs
+ + Added PQ Diag type 2, align type 12, color cal type 6, and LF
+ cal type 2 for Officejet Pro L7xxx
+ + Added agent types 20 and 21 for Officejet Pro L7xxx
+ + Fixed defect (There is no response when click "About" in the
+ "Help" menu in the toolbox window.)
+ + Fixed defect (Function Commands configuration was disabled)
+ + Fixed an issue where the ending banner page combo box would not
+ show the proper setting if it were not 'none'
+ + Fixed defect (An error occurs when select other ppd files from
+ toolbox to setup)
+ + Fixed defect (The command "hp-setup -i" can not work normally)
+ + Fixed defect (The output of "-t" parameter is not the same as
+ "--prettyprint" parameter when send a fax job using pretty
+ printing for text files.)
+ + Fixed defect (An error occurs when enter "#" in Fax Name field
+ on "Enter Printer Information" window during setting up a
+ printer.)
+ + Fixed defect (Print outcomes are not full when set the "Page
+ Orientation" as "Landscape" on "Print Settings" table.) [added
+ "Fit to page" option in image printing section of Print Settings
+ tab.]
+ + Moved installer/images/xxx files from SCRIPT to DATA install in
+ Makefile.am.
+ + Fixed non-functioning printer control in hp-toolbox
+ + Fixed an issue with the settings dialog not working [reported by
+ Johannes]
+ + Additional fixes to get PPD file handling working on Edgy and
+ Feisty for CUPS 1.2.
+ + Fixes for CUPS 1.2 and auto-generated PPD files for Feisty Fawn
+ [reported by Till] (closes: LP#95489)
+ + Fixed potential subscript array overflow in pcard/fat.c
+ (reported by Suse).
+ + Fixed an issue reported by Till with the device string returned
+ by hpfax:
+ + Fixed an issue in in the NoDeviceForm (missing __tr() method)
+ + Fixed defect (Ubuntu Fiesty Herd 3 - ppd file w/hp-setup
+ problem) [implemented change to PPD file enumeration for CUPS 1.2
+ as suggested by Till] (closes: LP#95489)
+ + Added banner pages to print settings (job-sheets)
+ + Fixed problem with watermark angle text in print settings (utf-8
+ decoding)
+ + Added libusb-devel check to configure.in.
+ + Added image printing settings to toolbox print settings
+ + Added print adjustment settings to toolbox print settings
+ + Enhanced the default button behavior in toolbox print settings
+ + Removed sticky print settings from hp-print
+ + hp_laserjet_p2015_series: Changed embedded-server-type from '0'
+ to '1'
+ + hp_laserjet_p2015_series: Changed panel-check-type from '0' to '1'
+ + Fixed a traceback in hpfax: if HPLIP is not running during
+ device detection (closes: LP#83936)
+ + Added print job icons to indicate print job status
+ + Updated some status icons
+ + Fixed defect (An unexpected error occurs when enter hp-makecopies
+ -d<device-uri> -m1 -n in terminal)
+ + Fixed defect ("See Also:hp-colorcal" should not occur in the
+ explanation for the hp-colorcal command on hplip website.)
+ + Fixed defect (Refresh All button can not work on build
+ hplip-1.7.1 public release.)
+ + Fixed an issue in hpssd that caused history items in the ring
+ buffer to slotted incorrectly
+ + Added duplexer detection to the "sides" setting in the toolbox
+ Print Settings (no "sides" selection if duplexer == 0)
+ + Added new, more useful icons to the status list in the toolbox
+ + Major toolbox (Device Manager) upgrade/redesign
+ + Added printer settings tab (sets printer options in
+ ~/.cups/lpoptions)
+ + Removed panel tab (merged panel with status tab)
+ + Redo of functions tab (new layout)
+ + Redo of status tab (new icons, layout, inclusion of front panel
+ display)
+ + Front panel display will show device panel if available,
+ otherwise most recent status text
+ + Redo of supplies tab (new layout)
+ + Redo of print jobs tab (now called printer control) (print
+ control widget, new layout, etc)
+ + hpssd will not store multiple history items with the same error
+ code (last one gets replaced)
+ + About box upgraded
+ + cupsext extended in functionality (ppd, options, etc)
+ + Removed trailing white space in IEEE 1284 model name. This will
+ fix URIs that have a trailing "_" character in the model
+ name. This issue crept back into the hpiod code after the libusb
+ update (closes: LP#85805).
+ + Fixed an issue in hp-check that caused a traceback if
+ '/etc/sane.d/dll.conf' is missing
+ + Added some more bug messages to hpaio.
+ + Fixed a traceback in hp-levels reported on the mailing list (defect)
+ + Set the device list column width in the toolbox splitter to be
+ more narrow by default
+ + Added the toolbox software version to the Device Manager about dialog
+ * HPIJS 2.7.2
+ + Fixed media type for maxdpi printmode for vip printers and its
+ derivatives
+ + Fixed the cause of carriage stall error in C41xx printers
+ + Added support for the following new printer(s).
+ * Officejet Pro L7300 series (OJProKx50)
+ * Officejet Pro L7500 series (OJProKx50)
+ * Officejet Pro L7600 series (OJProKx50)
+ * Officejet Pro L7700 series (OJProKx50)
+ * HP Officejet Pro K5300 series (OJProKx50)
+ * HP Officejet Pro K5400 series (OJProKx50)
+ * HP Officejet J5700 series (DJGenericVIP)
+ OJProKx50 is derived from DJGenericVIP.
+ * 80_laserjet1100_fix.dpatch: Fixed problem of accessing an HP LaserJet 1100
+ on the parallel port (reported in LP#98520).
+ * 82_scrolltool_py_deskjet_d4100_claen_device_not_found.dpatch: Fixed problem
+ of Python traceback when DeskJet 4100 not accessible (e. g. turned off),
+ reported in LP#98520 by Aaron Albright.
+ * 84_align10form_py_deskjet_5440_head_align.dpatch: Fixed problem of head
+ alignment GUI not working for DeskJet 5440 (closes: LP#98920).
+ * Removed patches 00_01_hplevels_fix.dpatch,
+ 80_hpijs_deskjet_d41xx_hangs.dpatch,
+ 85_hpfax_crash_when_hpssd_not_running.dpatch,
+ 90_hpfax_bad_lpinfo_-v_output.dpatch, merged upstream.
+ * Remade patch 14_charsign_fixes.dpatch, most of it was merged upstream.
+ * 61_noqt_message.dpatch: Improved error message which appears when
+ HPLIP utilities are called from the menu but PyQt is not installed
+ (closes: LP#86893)..
+ * Modified the debian/*.desktop files so that the environment variable
+ "STARTED_FROM_MENU=1" is set to make the utilities showing the
+ GTK-based error message window when called from the menu and PyQt is
+ not installed (closes: LP#86893).
+ * Added "NoDisplay=true" to the debian/*.desktop files so that the menu
+ entries for the HPLIP tools are hidden by default (closes: LP#67892).
+ * Fixed the pelling of the icon file names in the debian/*.desktop files
+ (closes: LP#88290).
+ * Removed debian/hp-toolbox.desktop, it was a duplicate menu entry for the
+ HP Toolbox.
+ * debian/hplip.postinst: Added clean-up for the ownerships of the user's
+ .hplip.conf files. hp-setup of HPLIP 1.7.1 (and perhaps some older
+ versions) created it with root ownerships and this made hp-toolbox not
+ starting (closes: LP#99326).
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Tue, 3 Apr 2007 16:40:55 +0100
+
+hplip (1.7.1-1ubuntu2) feisty; urgency=low
+
+ * 80_hpijs_deskjet_d41xx_hangs.dpatch: Applied offical patch from HP
+ (1.7.1-1), fixes DeskJet D41xx hanging on second job.
+ * 85_hpfax_crash_when_hpssd_not_running.dpatch: Fixes hpfax CUPS backend
+ crash when HPLIP daemons are not running (closes: LP#83936).
+ * 90_hpfax_bad_lpinfo_-v_output.dpatch: Fixes hpfax CUPS backend returning
+ an "hp:/..." URI instead of an "hpfax:/..." URI to CUPS.
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Wed, 14 Feb 2007 12:58:47 +0000
+
+hplip (1.7.1-1ubuntu1) feisty; urgency=low
+
+ * Merge from debian CVS (closes: LP#60242, LP#66830,
+ LP#74809, LP#77307), remaining changes:
+ - Add hplip to scanner group.
+ - Additional patches 70_no_fail_on_bad_locales, 80_no-compiler.h.
+ - Shuffling of hplip's recommendations/suggestions.
+ - Remove hplip's shutdown and reboot links.
+ - Splitting of desktop files, menu entries hidden by default.
+ - udev rules for MFP devices.
+ - Don't compress single files to make the package smaller.
+ * debian/hplip.postrm: Suppress error on uninstalling HPLIP when "scanner"
+ is not empty.
+ * 61_noqt_message.dpatch: Removed, functionality implemented upstream.
+ * 70_no_fail_on_bad_locales.dpatch: Rediff.
+ * debian/control: Added missing "libsane-dev" to Build-Depends.
+ * debian/hplip.install: Removed usr/lib/libsane*.so.*, not needed any more.
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Mon, 29 Jan 2007 12:58:47 +0000
+
+hplip (1.7.1-1) unstable; urgency=low
+
+ * New Upstream source
+ * HPLIP 1.7.1:
+ + Fixed uninitilized pointer in hplip_api library.
+ + Got some newer inkjet all-in-ones working with hp-makecopies:
+ + photosmart_c5100_series: Changed copy-type from '0' to '3'
+ + photosmart_c6100_series: Changed copy-type from '0' to '3'
+ + photosmart_c7100_series: Changed copy-type from '0' to '3'
+ + photosmart_3100_series: Changed copy-type from '0' to '3'
+ + photosmart_3200_series: Changed copy-type from '0' to '3'
+ + photosmart_3300_series: Changed copy-type from '0' to '3'
+ + Added a "last used device URI" feature to all utilities/UIs
+ + Added a device refresh after the job cancel function in the toolbox
+ + Fixed defect (hp-setup -u no devices <b>, <p>, etc. characters in
+ error log)
+ + Fixed sane_start: "Document feeder out of documents" problem with
+ LJ3300 MFP which have no ADF.
+ + Fixed defect (Test email text update)
+ + Improved progress dialog behaviour and messaging in hp-sendfax
+ + Fixed defect (The counter of selected picture in status bar does
+ not work if selecting picture by drag action.)
+ + Fixed defect (The "Show Thumbnail" item still appears after
+ executing "Show Thumbnails" operation if the picture does not support
+ "show thumbnail" function.)
+ + Implemented enhancement (Have front panel tab appear when supported
+ by printer)
+ + Fixed defect (The fax job can not be done while executing
+ 'hp-sendfax -n' in terminal on Fedora Core 6 32bit OS.)
+ + photosmart_c7100_series: Changed pcard-type from '2' to '1'
+ + Added feature (Fax Address Book also should be added on the Tools &
+ Settings tab in toolbox for usability.)
+ + Fixed defect (The printer still appears in the device list while
+ deleting the printer from CUPS.)
+ + Added feature: Toolbox device list auto refreshes after device is
+ added using hp-setup from toolbox
+ + Fixed an issue with ChoosePrinterDlg2
+ + Re-wired "Configure Print Settings" in the toolbox to go directly
+ to the correct settings page for the printer
+ + Fixed an issue with toolbox auto refresh settings save in
+ ~/.hplip.conf
+ + Fixed defect (New Fax Address can not be listed in Individual(s)
+ and Group(s) fields of Recipients tab on Debian 3.1 32bit OS.)
+ + Fixed defect (The address can not be added to a group through edit
+ function in Fax Address Book.)
+ + Fixed defect (Help button is ineffective after clicking Align
+ Cartridges in Toolbox on Debian3.1 32bit OS.)
+ + Added some error checking to struct.unpack() in SLP packet decoding
+ + Fixed defect (An error occurs when enter "%" in "Print Name" of
+ "Enter Printer Information" window during setting up a device.)
+ + Fixed defect (The unloaded file still be showed in "Unload Files
+ from Photo Card" dialog box after unload it with "Remove selected
+ files" option in GUI mode.)
+ + Fixed defect ('.bmp' type file can not be directly added to a fax
+ job though this file type is listed in the Direct Allowable Types
+ list. )
+ + Fixed problem with adding XPM files to hp-sendfax
+ + Removed extraneous MIME types from hp-sendfax allowable types
+ + Changed auto refresh update range to 5-60 sec.
+ + Merged PyQt polling fix (should fix faxing on systems with PyQt
+ 3.16 or 3.17)
+ + Added page range validation to hp-print (disallows ranges like "-2"
+ and "2-")
+ + Fixed defect 1291 (The plain-text type file which begins with
+ character "/*" can not be added rendered by the fax driver.) [Pretty
+ printing checkbox added to hp-print and hp-sendfax. Off by default.]
+ * HPIJS 2.7.1:
+ + Moved PSC 21XX from DJ9xxVIP to DJGenericVIP - these printers can
+ do fullbleed printing on 4x6 media
+ + Added a new printmode, photonormal for DJ9xxVIP to enable printers
+ without media sensors to print to photo media
+ * dpatch 00_01_upstream-fix-libusb-bigendian: removed, it is in 1.6.12
+ * dpatch 00_02_upstream-fix-pragma-pack: removed, it is in 1.6.12
+ * dpatch 10_shebang_fixes.dpatch: rediff
+ * dpatch 14_charsign_fixes: rediff
+ * dpatch 00_01_hplevels_fix (new): fixes showstopper bug in hp-levels
+ * debian/hplip.links: add link for hp-firmware
+ * debian/rules: use dh_clean without -k on install-stamp target, without
+ it we corrupt the changes file for the next build unless the clean
+ target was being invoked (as clean already had a dh_clean call)
+ * debian/control: suggest kdebase-bin (for kdesu) or gksu, as hp-toolbox
+ can use them
+
+ -- Henrique de Moraes Holschuh <hmh@debian.org> Sun, 28 Jan 2007 15:59:50 -0200
+
+hplip (1.6.12-1) UNRELEASED; urgency=low
+
+ * New Upstream source
+ * HPLIP 1.6.12:
+ + Incorporated the following upstream change requests
+ from Red Hat:
+ 1. Removed IANA comment from hplip.conf.
+ 2. Added libm library check to configure.in.
+ 3. Added some IPP "STATE:" messages for CUPS 1.2 in the "hp"
+ backend.
+ + Applied 'hplip-loop' patch from Tim Waugh [changes hpssd.py async
+ loop timeout from 0.5 to 5.0 sec].
+ + Fixed defect (The fax setup failed when executing hp-setup with
+ serial number USB ID parameter in terminal in Fedora Core6 32bit
+ OS.)
+ + Fixed defect ([hp-setup] device i/o error no way to cancel or go
+ back.)
+ + Fixed defect (The edit function can not be executed when changing
+ fax number only in Fax Address Book.)
+ + Fixed defect (The fax number and fax name was exchanged on the
+ "Finished Adding printer" page.)
+ + Fixed defect (Parameter "-bcups" of hp-probe command is disabled.)
+ + Fixed a potential batch scanning memory leak in libsane-hpaio with
+ scanimage version 1.0.18 or higher.
+ + Fixed defect (A blank screen is displayed while executing
+ "hp-check -lerror" in the terminal.)
+ + Fixed defect (The queue message of processing page is displayed
+ twice when executing a fax job with multi-pages in terminal in
+ Fedora core6.)
+ + Fixed a traceback in hp-check caused when non-HPLIP backends are
+ encountered in CUPS. [reported by user on mailing list]
+ + Fixed defect (The duplicate Nickname can be added to the Fax
+ Addresses by editing function.)
+ + photosmart_c6100_series: Changed copy-type from '3' to '0' [Note:
+ Make copies is temp. disabled for all inkjet AiOs]
+ + Replaced "pragma pack(1)" with "__attribute__ ((packed))" in all
+ C/C++ structures. This was needed for the ARM gcc compiler.
+ + Removed the libusb little-endian conversion in hpiod. This
+ conversion was not needed for big-endian systems because the usbfs
+ takes care of the big-endian to little-endian conversion.
+ + Added SANE_DEBUG_HPAIO support to libsane-hpaio
+ + Finished enhancement (Add mDNS/Bonjour/Rendezvous support to
+ hp-probe).
+ + Marked SANE_I18N text strings for localization in libsane-hpaio.
+ + Added checks to make sure conf files exist and have no errors.
+ + Reorganized include files in libsane-hpaio.
+ + Enhancement: HPSSD performance/code cleanup modifications (several
+ functions moved from hpssd to client code).
+ + Fax files are stored in temp files by hpssd rather than in memory.
+ + Fixed a problem with lineart scanning using MMR compression on
+ Laserjets.
+ + Workaround added for (Launch of hp-setup from hp-toolbox leads to
+ error [reported by Johannes]) [Added error dialog if gksu or kdesu
+ not found]
+ + Added the ability to quit in additional places for the color
+ alignment command-line tool and cleaned up some wording with-in the
+ command-line tool.
+ + Fixed defect (Allow [SERIAL NO.|USB bus:device|IP| DEVNODE] to be
+ used with -u)
+ + Fixed defect (The "remove of all files" - radio button is always
+ grayed-out in the hp-unload interface, so have removed it for now).
+ This was fixed by removing the radio button since we will not
+ support this functionality at this time.
+ + Applied the Ubuntu provided 61_noqt_message.dpatch with changes
+ [supplied by Matthias Klose with Ubuntu]
+ + Added missing time import in setupform.py.
+ + Fixed a problem with event forwarding in hpssd.
+ + Fixed a problem with device status refresh in hp-sendfax (hpssd
+ bug)
+ + Moved hplip_api code to separate "api" directory.
+ + Added hplip_api support for reading the new models.dat files. The
+ new models.dat file replaces the .xml files. For third-party
+ applications, the preferred way to read the models.dat file is to
+ use the hplip_api. The hplip_api can be used to get model attributes
+ without running the HPLIP daemons. See hplip_api.h for reference.
+ + Fixed defect (These Examples in usage of hp-setup that would work
+ in non-interactive mode should specify -i parameter.)
+ + Fixed defect (hp-print UI not usable on 800x600 screen w/GNOME)
+ * HPIJS 2.6.12:
+ + Made hplip_api calls in hpijs conditional at compile time. The
+ hpijs configure flag "hplip-build" will determine if hplip_api calls
+ are used.
+ + Added support for the following new printer(s).
+ + Color LaserJet CP4005 (LJColor/PS)
+ + LaserJet M5025 MFP (LJMono/PS)
+ + LaserJet M3027 MFP (LJMono/PS)
+ * This upstream version was never built or released by Debian
+
+ -- Henrique de Moraes Holschuh <hmh@debian.org> Thu, 25 Jan 2007 23:53:53 -0200
+
+hplip (1.6.10-3ubuntu3) feisty; urgency=low
+
+ * Fixed hplip.desktop and added hplip-kubuntu.desktop.
+ Kubuntu doesn't have any application categorised in "Settings"
+ so that results a crappy Kmenu. The hplip.desktop file will not
+ show in KDE, and the kubuntu one, only shows in KDE, in
+ "System" section.
+
+ -- Anthony Mercatante <tonio@ubuntu.com> Sat, 20 Jan 2007 03:28:47 +0100
+
+hplip (1.6.10-3ubuntu2) feisty; urgency=low
+
+ * Rebuild for python2.5 as the default python version.
+
+ -- Matthias Klose <doko@ubuntu.com> Fri, 12 Jan 2007 13:17:54 +0000
+
+hplip (1.6.10-3ubuntu1) feisty; urgency=low
+
+ * Merge from debian unstable, remaining changes:
+ - Add hplip to scanner group.
+ - Additional patches 70_no_fail_on_bad_locales, 80_no-compiler.h.
+ - Shuffling of hplip's recommendations/suggestions.
+ - Remove hplip's shutdown and reboot links.
+ - Splitting of desktop files, menu entries hidden by default.
+ - udev rules for MFP devices.
+ - Don't compress single files to make the package smaller.
+ - "NoQt message" patch.
+ - Added lines
+ usr/lib/libsane*.so.*
+ usr/lib/sane/libsane*.so.*
+ to debian/hplip.install to assure that scanning works.
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Tue, 19 Dec 2006 20:28:47 +0100
+
+hplip (1.6.10-3) unstable; urgency=high
+
+ * dpatch 00_01_upstream-fix-libusb-bigendian (new): Do not hto* libusb
+ stuff, it does so by itself (at least on the non-ancient versions),
+ backport from upstream 1.6.12-rc3 (closes: #401530)
+ * dpatch 00_02_upstream-fix-pragma-pack (new): Do not use pragma pack, use
+ attribute packed instead, backport from upstream 1.6.12-rc3
+
+ -- Henrique de Moraes Holschuh <hmh@debian.org> Mon, 18 Dec 2006 10:27:31 -0200
+
+hplip (1.6.10-2ubuntu2) feisty; urgency=low
+
+ * Added again missing libsane-hpaio.so.1.0.0 library. It seems that
+ Debian is not taking care of the missing scanner driver. Fixes
+ LP#65908 again.
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Mon, 11 Dec 2006 10:28:47 +0100
+
+hplip (1.6.10-2ubuntu1) feisty; urgency=low
+
+ * Synchronize with Debian CVS; remaining changes:
+ - Add hplip to scanner group.
+ - Additional patches 70_no_fail_on_bad_locales, 80_no-compiler.h.
+ - Shuffling of hplip's recommendations/suggestions.
+ - Remove hplip's shutdown and reboot links.
+ - Splitting of desktop files, menu entries hidden by default.
+ - udev rules for MFP devices.
+ - Don't compress single files to make the package smaller.
+ - "NoQt message" patch.
+ * Remove obsolete patches: debian/patches/80_no-compiler.h.dpatch.
+
+ -- Matthias Klose <doko@ubuntu.com> Mon, 4 Dec 2006 16:24:01 +0100
+
+hplip (1.6.10-2) unstable; urgency=low
+
+ * debian/control: hpijs: Add versioned replaces on hpijs-ppds, hplip-ppds
+ for Fax PPD file move into hpijs package, that happened on 1.6.10-1
+ (closes: #395862, #395847)
+ * debian/control: build-depend on patch >= 2.5.9-3bpo1 due to our use
+ of the Debian-specific -U flag for dpatch, introduced by
+ 2.5.9-4/2.5.9-3pbo1; build-depend on findutils >= 4.2.25 due to our use
+ of xargs -d. Thanks to Sylvain Beucler <beuc@beuc.net> for noticing and
+ reporting these problems
+
+ -- Henrique de Moraes Holschuh <hmh@debian.org> Sat, 28 Oct 2006 09:14:09 -0300
+
+hplip (1.6.10-1) unstable; urgency=medium
+
+ * New upstream source (closes: #393940, #395165)
+ * HPLIP 1.6.10:
+ + Fixed defect: hp-print and hp-sendfax: an error occurs while
+ executing hp-print with invalid device URI or the printer name
+ in CLI
+ + Removed batch scanning sane_cancel dependency. This fixes a
+ problem with scanimage version 1.0.18 or higher
+ (closes: #382648, #382652)
+ + Fixed defect: GUI Install - hp-setup - Does Not Finish
+ + Added icons to toolbox function page buttons
+ + Added make copies support for some inkjet AiO devices
+ + Added hp-timedate utility
+ + Simplified some text in hp-setup -u
+ + Fixed defect: the Timeout value for searching printer shouldn't
+ be able to set as value larger than 45 secs in HP Device Manager
+ + Made GUI mode the default for hp-setup
+ + Fixed defect: error occurs while manually finding the network
+ printers in HP Device Manager
+ + Made the "Find" button on the Manual Find dialog the default
+ button
+ + Added "Setup New Device..." in Toolbox
+ + Added "Remove Device..." in Toolbox
+ + Reworked "No Devices Found" dialog
+ + Fixed defect: Multi PPD files were found while installing the
+ Photosmart D5160 through hp-setup
+ + Fixed defect: hp-setup -u default window size needs to be a tad
+ larger
+ + Fixed defect: hp-setup -u par device detection problem
+ + Fixed defect: the "Location" and "Description" for Fax Information
+ also should be available while setup the device over hp-setup in
+ GUI mode
+ + Added additional fax name and printer name checking
+ + Fixed defect: hp-setup -u manually find usb device not manually
+ working
+ + Fixed defect: hp-setup -u Location/Desscription text field limits
+ + Fixed defect: hp-setup -u help button does not function
+ * HPIJS 2.6.10:
+ + Added support for the following new printer(s)
+ + LaserJet P2015 series (LJMono/PS)
+ + LaserJet M3035 MFP (LJMono/PS)
+ + LaserJet M5035 MFP (LJMono/PS)
+ + LaserJet M4345 mfp (LJMono/PS)
+ + LaserJet P3005 (LJMono/PS)
+ + LaserJet P3004 (LJMono/PS)
+ + Color LaserJet 2700 (PS)
+ + Color LaserJet CM1015 (PS) (no scanning yet)
+ + Color LaserJet CM1017 (PS) (no scanning yet)
+ * dpatches 50_ui-supportform-cleanups, 55_ui-supportform-debian (remove):
+ these patches were already disabled, and we are not going to enable them
+ back anytime soon anyway
+ * hplip.links: ship link for hp-timedate
+ * Makefile.am: fix borked install-exec-hook that broke libsane-hpaio
+ install (borkage added by upstream on 1.6.9), thanks to Matthias Klose
+ for forwading the bug report from Ubuntu
+ * debian/rules: correct paths to platform.h and auto-include.h, thanks
+ to Matthias Klose from Ubuntu
+ * debian/rules, debian/control: do the proper thing for binNMU safety,
+ and also simplify the various package relationships as much as we can:
+ hpijs-ppds: now depend on hpijs (versioned >=). hpijs: remove conflicts
+ with non-compatible ppd packages, and version suggests on hpijs-ppds
+ strictly. hplip-dbg: depend strictly on the version of hplip and hpijs
+ the debug symbols came from. hplip: suggest hpijs and hpijs-ppds with
+ >= version. This does allow the user to do stupid things if he really
+ wants, but given the ammount of arch any/all mixes in this set of
+ packages, attempting to get it perfect only causes headaches while
+ upgrading (and it is also nearly impossible)
+ * hplip.init: tell user to reinstall hplip if the statoverrides are
+ missing (closes: #393271)
+
+ -- Henrique de Moraes Holschuh <hmh@debian.org> Thu, 26 Oct 2006 13:22:56 -0300
+
+hplip (1.6.9-1) UNRELEASED; urgency=low
+
+ * New upstream source
+ * HPLIP 1.6.9:
+ + Fixed defect: Printer supplies listed in "random" order
+ + Fixed defect: Don't report hpfax:/no_devices_found in CUPS 1.2
+ + Fixed network printer detection (SLP)
+ + Added hp-probe back
+ + Fixed defect: The HP Fax URI could not be showed if executing
+ hp-makeuri with parameter "--fax" in the terminal
+ + Fixed defect: The "Add to List" button for Coverpage would be
+ grayed out after sent a fax job including Coverpage
+ + Fixed defect: An unexpected error occurred when add a FAB entry
+ using the space as the fist character of the entry name
+ + Made some misc. input validation improvements to hp-fab -i
+ + Changed print code so that it can use lpr or lp depending on
+ what is installed (lpr=default)
+ + Fixed defect: hp-unload only works with ASCII char's
+ + Fixed defect: hp-unload gives incorrect permissions bits.
+ hp-unload will save files with permissions of 0600.
+ + Fixed a laserjet scanning problem in hpiod
+ + Changed the 1284.4/MLC setup command for CLJ2840/LJ3050/LJ3055
+ + Cleaned up PML errors occuring on DJ 4xx when doing dynamic
+ counters
+ + Fixed status-dynamic-counters value for DJ 460
+ + Fixed defect: Toolbox cannot be launched successfully after setup
+ + Added code to cleanup spinner from text UIs
+ + Fixed defect: The fax job could not be sent while sending fax in
+ non-interactive mode
+ + Fixed defect: The value of Notes for an FAB entry cannot be
+ displayed correctly while the entry was added completely in
+ interactive mode
+ + Fixed defect: An error occurs while executing hp-sendfax in
+ non-interactive mode with the device disconnected
+ + Fixed defect: The .g3 file could not be added to the Items List
+ and could not be sent
+ + Fixed defect: The fax job could not be sent in non-interactive mode
+ + Added scan-style and fit-to-page fix to hp-makecopies
+ + Added scaling=100 to hp-sendfax.
+ + Moved Qt import in hp-toolbox and hp-print to after command line
+ processing
+ * HPIJS 2.6.9:
+ + Added support CD/DVD label printing (ie: PS D5100)
+ + Added support for the following new printer(s)
+ + PhotoSmart A310 series (DJGenericVIP)
+ + PhotoSmart C5100 series (DJGenericVIP)
+ + PhotoSmart C6100 series (DJGenericVIP)
+ + PhotoSmart C7100 series (DJGenericVIP)
+ + PhotoSmart D5100 series (DJGenericVIP)
+ + PhotoSmart D5060 series (DJGenericVIP)
+ + PhotoSmart Pro B8300 series (DJGenericVIP)
+ * debian/control: change -dbg package to priority extra, and place
+ hplip-ppds on section utils (to match ftp-master override file)
+ * Disable new libhpprop dynamic loading in hpijs ljjetready driver,
+ until we know for sure what it is and the code is fixed not to break
+ strict aliasing rules (and to use libtool)
+ * Fix some real and some cosmetic issues with the new Makefile.am and
+ configure.in files from upstream
+ * hplip.links: add hp-probe
+ * control: recommend both hpijs and linuxprinting.org PPD packages,
+ not just one or the other for package hplip
+ * hpijs: ship fax PPD in the hpijs binary package, and not in the
+ catch-all hpijs-ppds package. The reason for this is that many printers
+ need hpijs only for the fax functionality
+ * hplip.README.Debian: mention faxing, hpijs and python-reportlab for
+ covers
+
+ -- Henrique de Moraes Holschuh <hmh@debian.org> Mon, 2 Oct 2006 16:25:00 -0300
+
+hplip (1.6.9-0ubuntu2) edgy; urgency=low
+
+ * Add missing libsane-hpaio.so.1.0.0 library. Ubuntu #65908.
+
+ -- Matthias Klose <doko@ubuntu.com> Fri, 13 Oct 2006 15:28:47 +0000
+
+hplip (1.6.9-0ubuntu1) edgy; urgency=low
+
+ * Synchronize with Debian CVS; remaining changes:
+ - Add hplip to scanner group.
+ - Additional patches 70_no_fail_on_bad_locales, 80_no-compiler.h.
+ - Shuffling of hplip's recommendations/suggestions.
+ - Remove hplip's shutdown and reboot links.
+ - Splitting of desktop files, menu entries hidden by default.
+ - udev rules for MFP devices.
+ - Don't compress single files to make the package smaller.
+ * Restore and update the "NoQt message" patch, introduced in
+ 0.9.7-4ubuntu1, dropped later.
+
+ -- Matthias Klose <doko@ubuntu.com> Wed, 11 Oct 2006 14:00:11 +0200
+
+hplip (1.6.9-1) unreleased; urgency=low
+
+ * New upstream source
+ * HPLIP 1.6.9:
+ + Fixed defect: Printer supplies listed in "random" order
+ + Fixed defect: Don't report hpfax:/no_devices_found in CUPS 1.2
+ + Fixed network printer detection (SLP)
+ + Added hp-probe back
+ + Fixed defect: The HP Fax URI could not be showed if executing
+ hp-makeuri with parameter "--fax" in the terminal
+ + Fixed defect: The "Add to List" button for Coverpage would be
+ grayed out after sent a fax job including Coverpage
+ + Fixed defect: An unexpected error occurred when add a FAB entry
+ using the space as the fist character of the entry name
+ + Made some misc. input validation improvements to hp-fab -i
+ + Changed print code so that it can use lpr or lp depending on
+ what is installed (lpr=default)
+ + Fixed defect: hp-unload only works with ASCII char's
+ + Fixed defect: hp-unload gives incorrect permissions bits.
+ hp-unload will save files with permissions of 0600.
+ + Fixed a laserjet scanning problem in hpiod
+ + Changed the 1284.4/MLC setup command for CLJ2840/LJ3050/LJ3055
+ + Cleaned up PML errors occuring on DJ 4xx when doing dynamic
+ counters
+ + Fixed status-dynamic-counters value for DJ 460
+ + Fixed defect: Toolbox cannot be launched successfully after setup
+ + Added code to cleanup spinner from text UIs
+ + Fixed defect: The fax job could not be sent while sending fax in
+ non-interactive mode
+ + Fixed defect: The value of Notes for an FAB entry cannot be
+ displayed correctly while the entry was added completely in
+ interactive mode
+ + Fixed defect: An error occurs while executing hp-sendfax in
+ non-interactive mode with the device disconnected
+ + Fixed defect: The .g3 file could not be added to the Items List
+ and could not be sent
+ + Fixed defect: The fax job could not be sent in non-interactive mode
+ + Added scan-style and fit-to-page fix to hp-makecopies
+ + Added scaling=100 to hp-sendfax.
+ + Moved Qt import in hp-toolbox and hp-print to after command line
+ processing
+ * HPIJS 2.6.9:
+ + Added support CD/DVD label printing (ie: PS D5100)
+ + Added support for the following new printer(s)
+ + PhotoSmart A310 series (DJGenericVIP)
+ + PhotoSmart C5100 series (DJGenericVIP)
+ + PhotoSmart C6100 series (DJGenericVIP)
+ + PhotoSmart C7100 series (DJGenericVIP)
+ + PhotoSmart D5100 series (DJGenericVIP)
+ + PhotoSmart D5060 series (DJGenericVIP)
+ + PhotoSmart Pro B8300 series (DJGenericVIP)
+ * debian/control: change -dbg package to priority extra, and place
+ hplip-ppds on section utils (to match ftp-master override file)
+ * Disable new libhpprop dynamic loading in hpijs ljjetready driver,
+ until we know for sure what it is and the code is fixed not to break
+ strict aliasing rules (and to use libtool)
+ * Fix some real and some cosmetic issues with the new Makefile.am and
+ configure.in files from upstream
+ * hplip.links: add hp-probe
+ * control: recommend both hpijs and linuxprinting.org PPD packages,
+ not just one or the other for package hplip
+ * hpijs: ship fax PPD in the hpijs binary package, and not in the
+ catch-all hpijs-ppds package. The reason for this is that many printers
+ need hpijs only for the fax functionality
+ * hplip.README.Debian: mention faxing, hpijs and python-reportlab for
+ covers
+
+ -- Henrique de Moraes Holschuh <hmh@debian.org> Mon, 2 Oct 2006 16:25:00 -0300
+
+hplip (1.6.7-2ubuntu2) edgy; urgency=low
+
+ * revert the Breaks usage and turn it into a Conflict to avoid
+ having to backport apt/dpkg/python-apt for the upgrade
+ (see bug: #54234 for the rational)
+
+ -- Michael Vogt <michael.vogt@ubuntu.com> Tue, 26 Sep 2006 20:19:21 +0200
+
+hplip (1.6.7-2ubuntu1) edgy; urgency=low
+
+ * Merge from debian unstable.
+ * Removed patches 50_ui-supportform-cleanups.dpatch and
+ 55_ui-supportform-debian.dpatch, there is no support window in the HP
+ toolbox any more.
+ * HPLIP (file io/hpiod/usbext.h) includes linux/compiler.h which is not
+ part of Ubuntu Linux and not needed. Removed the include with patch
+ 80_no-compiler.h.dpatch.
+ * debian/control: Let the "Conflicts:" of hpijs-ppds be only a "Breaks:"
+ to facilitate an update from the previous version when both hpijs and
+ hpijs-ppds are installed.
+
+ -- Till Kamppeter <till.kamppeter@gmail.com> Fri, 15 Sep 2006 18:00:07 +0200
+
+hplip (1.6.7-2) unstable; urgency=low
+
+ * Transition to python 2.4, just rebuild (closes: #380845)
+ * Add python post-rtupdate handler to restart hplip, just in case
+
+ -- Henrique de Moraes Holschuh <hmh@debian.org> Tue, 15 Aug 2006 00:35:27 -0300
+
+hplip (1.6.7-1) unstable; urgency=low
+
+ * The "I could easily start hating python because of them" release
+ * New upstream source (closes: #378401, #377265)
+ * HPLIP 1.6.7:
+ + Changed from dynamic IP ports to static IANA IP ports for hpiod
+ (2208) and hpssd (2207)
+ + Fixed defect: the valid letter and number for gray plot could not be
+ entered while executing hp-colorcal in terminal
+ + Fixed defect: the fax job could not be sent in non-interactive mode
+ + Move test page to last function with hp-setup
+ + Fixed defect: hp-setup would not select correct ppd file for some
+ models
+ + Removed Uni-di check code from device.Device.__openChannel()
+ + Fixed a problem that caused the fax wrong configuration error to
+ appear in error
+ + Fixed defect: the interactive and GUI mode for hp-fab can be entered
+ while executing hp-fab with parameter -i and -u
+ + Fixed defect with DeskJet 5540: traceback during align click from
+ toolbox
+ + Added non-interactive mode (-n) to hp-sendfax
+ + Added interactive mode (-i) to hp-fab.
+ + Fixed defect: the reduction was set to 25% automatically while
+ setting the Reduction/enlargement override 25-400%.)
+ + Added hp-makecopies
+ + Fixed defect: CUPS 1.2 does not auto-associate the PPD file to the
+ fax URI
+ * HPIJS 1.6.7:
+ + Added support for the following new printers:
+ + Photosmart D6100 series (DJGenericVIP)
+ + Photosmart D7100 series (DJGenericVIP)
+ * dpatch 00_01_upstream-1.6.6-1.dpatch (remove): applied upstream
+ * dpatch 20_fix_warnings (remove): accepted upstream
+ * dpatch 60_lp_instead_of_lpr (remove): accepted upstream
+ * Python policy changes (closes: #380845):
+ + Build-depend on debhelper (>= 5.0.37.2), python-support (>= 0.3)
+ + Add debian/pycompat with a content of "2"
+ + Call dh_pysupport in debian/rules, and move dh_installinit after
+ it for postinst scriptlet sanity
+ * hplip.init: Make sure to set permission of hpssd files in case the user
+ changed the suid/sgid information (closes: #372537)
+ * debian/control: remove redundant python build-dependency, as we have
+ python-dev already
+ * hplip.links: remove link for hp-photo, as that utility does not exist
+ anymore; add new hp-makecopies utility
+ * Makefile.am: ship copier/ stuff in libexecdir
+ * debian/rules: make sure we point to the hplip-doc package in hplip.conf
+
+ -- Henrique de Moraes Holschuh <hmh@debian.org> Wed, 9 Aug 2006 14:26:00 -0300
+
+hplip (1.6.6-1) UNRELEASED; urgency=low
+
+ * The "it is just a number, after all... or is it?" non-release
+ * New upstream source
+ + HPLIP has reached maturity, with an 1.x release
+ + Switch versioning scheme for hplip and hpijs
+ + CUPS 1.2 compatibility
+ * HPLIP 1.6.6 (patchlevel 1):
+ + Fixed broken links in HTML documentation
+ + Added DOT4Init retry in hpiod. This fixed a intermittent scanning
+ problem with the HP PSC 3100
+ + Changed libsane-hpaio to display any received scan data after I/O
+ timeout instead of aborting
+ + Fixed the File Types that can be directly added to the fax job could
+ not be displayed accurately on Send Fax dialog
+ + Added 30sec retry and timeout to hpfax
+ + Added CUPS 1.2 compatible output to hpfax
+ + Removed DeviceOpen from hp backend. This fixes two problems 1) usblp
+ will no longer be removed for device discovery 2) device discovery
+ will no longer cause Inkjets to power-up (closes: #369286)
+ + Changed hp backend device discovery verbage in order to work better
+ with CUPS 1.2
+ + Fixed status-types for 2006-09 devices (5 --> 2)
+ + Fixed panel display for older OfficeJets that have VSTATUS
+ + Fixed "no printers installed, run toolbox, install printer, toolbox
+ produces error" bug
+ + Updated hpfax to "No devices found" text and behavior
+ + Removed extraneous syslog message during parallel port ProbeDevice
+ + Rewrite of toolbox refresh code. Should fix long running issue
+ + Fixed HP-Toolbox no activity after an hour causes toolbox to
+ disconnect from all printers
+ + Fixed the Job ID for fax job should be displayed in Status tab of
+ toolbox while starting fax send
+ + Modified XML schema (and all XML files to comply with it) -
+ status-type broken out into status-type, status-battery-check, and
+ status-dynamic-counters
+ + Made hplip_GetID more bullet proof in hplip_api.c
+ + Fixed invalid memory free in libsane-hpaio. Only occurred in the
+ sane_hpaio_open abort path
+ + Changed 1284.4/MLC credit reply timeout from 2 to 4 seconds in
+ hpiod. This fixed a problem with 1200dpi uncompressed scanning (ie:
+ PhotoSmart 2575)
+ + Removed support dialog (should have been removed in 0.9.11, was
+ missed)
+ + Changed Tools and Support pane to include "View Documentation"
+ rather than "View Support" - opens online docs in browser like
+ Help | Contents...
+ + Added sane hpaio.desc file to documentation
+ * HPIJS 2.6.6:
+ + Fixed an auto duplex problem in HPIJS
+ + Fixed gcc 4.1 compiler issues with HPIJS glue code
+ + Added support for the following new printers:
+ + Deskjet D4100 series (DJ4100)
+ + Deskjet D2300 series (DJ3600)
+ + Deskjet D1360 series (DJ3320)
+ + Photosmart A430 series (DJGenericVIP)
+ + Photosmart A510 series (DJGenericVIP)
+ + Photosmart A710 series (PSP470)
+ + Photosmart A610 series (PSP470)
+ + Photosmart C4100 series (DJGenericVIP)
+ + Photosmart C3100 series (DJGenericVIP)
+ + Photosmart D7300 series (DJGenericVIP)
+ + Updated the Ghostscript KRGB patch: Revisited the KRGB buffer
+ overflow issue with out-of-band data in fill_rectangle and
+ copy_mono. Changed the fill_rectangle and copy_mono to an inner
+ loop buffer check instead of a outer loop x/y extent check.
+ As requested by Ralph Giles, added K 1-bit (KRGB) and 8-bit (KxRGB)
+ support for KRGB, but only 1-bit is implemented for now
+ * hpijs-ppds: depend on foomatic-filters as the PPDs require foomatic-rip
+ to work. Version dependency to a new enough foomatic-rip (available in
+ stable as well, so this is not strictly needed, but still...)
+ (closes: #369833)
+ * hpijs: drop suggestion on foomatic-filters, hpijs doesn't use it for
+ anything anyway, and the PPDs (who do) now depend on it
+ * hplip: recommend one of hpijs-ppds or linuxprinting.org-ppds instead of
+ suggesting both. HPLIP really needs a PPD to do anything useful
+ * Improve description of the hplip-dbg package a little
+ * debian/watch: remove outdated URIs, update to version 3
+ * dpatch 00_01_upstream-0.9.11-2 (remove): applied upstream
+ * dpatch 00_01_upstream-1.6.6-1 (new): upstream HPLIP 1.6.6-1
+ * dpatch 40_quiet-hpiod (remove): accepted upstream
+ * dpatch 60_lp_instead_of_lpr: rediff
+ * dpatches 50_ui-supportform-cleanups, 55_ui-supportform-debian (disable):
+ upstream removed the supportform, but we may want to add those panes
+ somewhere else so just disable the patches for now
+ * dpatch 20_fix_warnings (new): fix broken code in hpijs that caused
+ warnings
+ * Remove old KRGB 1.2 patches
+
+ -- Henrique de Moraes Holschuh <hmh@debian.org> Fri, 16 Jun 2006 18:44:55 -0300
+
+hplip (0.9.11-2ubuntu7) edgy; urgency=low
+
+ * 70_no_fail_on_bad_locales:
+ - don't fail if the locales can't be set (this breaks upgrades)
+ * Pre-Depend on python (>= 2.4.3-5). We need a working pyversions
+ otherwise invoke-rc.d will fail to start hpssd in the postinst
+
+ -- Michael Vogt <michael.vogt@ubuntu.com> Mon, 4 Sep 2006 06:37:25 +0200
+
+hplip (0.9.11-2ubuntu6) edgy; urgency=low
+
+ * debian/rules:
+ - applied another debian patch to fix upgrade problem (dapper->edgy)
+
+ -- Michael Vogt <michael.vogt@ubuntu.com> Fri, 1 Sep 2006 21:41:33 +0200
+
+hplip (0.9.11-2ubuntu5) edgy; urgency=low
+
+ * debian/rules:
+ - fix the ordering of the rules, this unbreaks the upgrade from
+ dapper to edgy (lp: #46595)
+
+ -- Michael Vogt <michael.vogt@ubuntu.com> Wed, 30 Aug 2006 12:23:21 +0200
+
+hplip (0.9.11-2ubuntu4) edgy; urgency=low
+
+ * Add forgotten versioned-dependency on sysv-rc to get new update-rc.d
+ behaviour. Go me.
+
+ -- Scott James Remnant <scott@ubuntu.com> Fri, 21 Jul 2006 01:29:01 +0100
+
+hplip (0.9.11-2ubuntu3) edgy; urgency=low
+
+ * Remove stop links from rc0 and rc6
+ * Fix bogus build-depend line that doko introduced.
+
+ -- Scott James Remnant <scott@ubuntu.com> Fri, 21 Jul 2006 00:35:52 +0100
+
+hplip (0.9.11-2ubuntu2) edgy; urgency=low
+
+ * Convert to updated Python policy.
+ * Run hpiod as root.
+
+ -- Matthias Klose <doko@ubuntu.com> Thu, 6 Jul 2006 13:39:45 +0000
+
+hplip (0.9.11-2ubuntu1) edgy; urgency=low
+
+ * Resynchronize with Debian unstable.
+
+ -- Matthias Klose <doko@ubuntu.com> Thu, 6 Jul 2006 15:20:00 +0200
+
+hplip (0.9.11-2) unstable; urgency=low
+
+ * dpatch 00_01_upstream-0.9.11-2 (new): HPLIP 0.9.11-2
+ + Fixed an intermittent auto duplex problem with HPIJS
+ (closes: #360017)
+ + Add some missing PSC 950 model entries in models.xml
+ + Fixed some NDEBUG compiler issues (Debian)
+ + Fixed some gcc 4.1 compiler issues (Debian)
+ * dpatch 20_fix-asserts (remove): accepted upstream
+ * dpatch 30_gcc4.1-fixes (remove): accepted upstream
+ * dpatch 50_doc-location (remove): superseeded by dpatch
+ 50_ui-supportform-cleanups
+ * dpatch 50_ui-supportform-cleanups (new): Remove useless README pane
+ in hp-toolbox support form, fix the URIs to have ending slashes, and
+ some other cosmetic fixes
+ * dpatch 55_ui-supportform-debian (new): Add Debian pane to hp-toolbox
+ support form
+
+ -- Henrique de Moraes Holschuh <hmh@debian.org> Fri, 12 May 2006 23:40:38 -0300
+
+hplip (0.9.11-1) unstable; urgency=low
+
+ * The "Eating hedgehogs ain't smart" release
+ * New upstream version:
+ * HPLIP 0.9.11:
+ + Changed hp-sendfax behavior: Now hp-sendfax must be run before
+ print jobs can be printed to a fax queue
+ + Completely revamped the email alert system (now uses sendmail
+ rather than a SMTP server)
+ + Changed hpssd so that it will not send an email if the same device
+ has the same error code multiple times in a row
+ + Changes auto device refresh interval units from seconds to minutes
+ in the hp-toolbox
+ + Added a device auto refresh type (all or 1) to settings dialog in
+ the hp-toolbox
+ + Replaced hplip_readme.html with web documents available at
+ hplip.sf.net
+ + Moved the DeviceClose in the hp-toolbox testpage routine to before
+ the lpr to fix an issue with contention with the "hp" backend
+ + Fixed a defect in hp-fab that didn't allow previously added
+ entries to be modified
+ + Added better error checking to hp-sendfax to detect HPLIP daemons
+ not running
+ + Fixed LJ2840 network port for faxing in hpiod
+ + Turned status off for all Business Inkjets 2200-2600
+ + Moved fax address book file from ~/.hplip.fab to ~/hpfax/fab.db
+ + Changed hp-fab so that duplicate entries cannot be created
+ + Fixed endianness issue that hosed the HP Color LaserJet 3500 on
+ PPC (closes: #317683)
+ * HPIJS 2.1.10:
+ + Moved PSC 21xx from DJGenericVIP to DJ9xxVIP device class
+ (this requires all PSC 21xx users to update their PPDs)
+ + Forced hpijs and hppgsz to always build with -DNDEBUG
+ + Merged hpijs_readme.html into hplip documentation
+ + Added support for the following new printers:
+ + LaserJet 5200 (LJMono/PS)
+ + LaserJet 5200L (LJMono/PS)
+ + Color LaserJet 2605 (PS)
+ + Officejet 6300 series (DJGenericVIP)
+ + Officejet 4300 series (DJ3320)
+ * dpatch 00_01_upstream-0.9.10-2 (remove): applied upstream
+ * dpatch 00_01_upstream-0.9.11-1 (new): preliminary upstream patch:
+ + Fix regression where the PSC 950xi stops being detected
+ (reported by Till Kamppeter)
+ * dpatch 14_charsign_fixes: remove hunk applied upstream, rediff
+ * dpatch 60_lp_instead_of_lpr: update for new upstream code
+ * dpatch 20_fix-asserts (new): fix bugs that show up on NDEBUG builds
+ * dpatch 30_gcc4.1-fixes (new): fix strict aliasing bugs for gcc 4.1
+ * Ship the new HPLIP/HPIJS documentation in a new arch-all package,
+ hplip-doc. The hplip and hpijs packages now have just Debian
+ documentation, and point to the hplip-doc package (or to the
+ online URI for that documentation) for the full user manual
+ * Add a users-guide.txt file to hplip and hpijs documentantion,
+ to point users to the hplip-doc package and to the online manual
+ * Bump standards version to 3.7.2 (no changes required)
+ * Drop support for initscript systems without invoke-rc.d, as
+ invoke-rc.d is now required per policy. This also shuts lintian
+ up, which is always a nice bonus
+ * hpijs.NEWS, hplip.NEWS: update for the new release
+ * hpijs.README.Debian: minor cleanup, and point users to hpijs-ppds
+ * hplip.README.Debian: minor updates and cleanup
+ * debian/control: Make hplip automatically recommend the newest
+ hpijs upstream version, instead of a manually set one I am not
+ always really sure about
+ * debian/rules: Provide hpijs:Source-Version as well for the control
+ file
+ * Add new hplip-dbg package with full symbolic debugging information for
+ all binaries and libraries generated by this source package
+ (closes: #366766)
+ * debian/control: place hpijs and hpijs-ppds on section text (as per the
+ override file for hpijs, and other -ppds packages)
+ * Ship doc/release_notes.html as the upstream changelog, as the old
+ text changelog is not being updated anymore by upstream
+
+ -- Henrique de Moraes Holschuh <hmh@debian.org> Thu, 11 May 2006 12:56:38 -0300
+
+hplip (0.9.10-1) unstable; urgency=low
+
+ * New upstream version
+ * HPLIP 0.9.10 (patchlevel 2):
+ + Made the "hp" backend more product specific, now HP USB keyboards
+ won't be misdetected as printers....
+ + Fixed jetdirect write timeout in hpiod
+ + Added deviceID to output of "hp" backend for CUPS 1.2
+ + Fixed a problem where no fax send dialog pops up when sending
+ a fax job from OpenOffice Writer and the fax job can not be sent
+ correctly
+ + Fixed a hp-setup crash which can occur during fax setup testpage
+ printing
+ + Modified the hp-toolbox and hp-print so that they will work with
+ unsupported printer models without crashing
+ + Hp-setup now allows the user to manually enter a PPD file path
+ + The "NickName" from each located PPD file is displayed to the user
+ so that the "(recommended)" text will be shown.
+ + Fixed an error which occurs while executing hp-sendfax with
+ b parameter.
+ + Fixed a hp-toolbox problem displaying cartridge information for
+ Photosmart 8700 when device is connected via network
+ * dpatch 00_01_upstream-0.9.10-2 (new): upstream patchlevel 2
+ + Drop useless (and broken) model test comparison (closes: #360385)
+ + Fix local DoS when usb communications get stuck
+ * dpatch 14_charsign_fixes: add new hunks to fix more sign problems
+ * Replace all instances of the old upstream hopepage (hpinkjet.sf.net)
+ with the new one (hplip.sf.net)
+ * Point users to the new upstream mailinglists
+ * Add watch entries for the renamed sourceforge project
+
+ -- Henrique de Moraes Holschuh <hmh@debian.org> Mon, 24 Apr 2006 12:57:59 -0300
+
+hplip (0.9.9-2) unstable; urgency=low
+
+ * configure.in, Makefile.am, debian/rules, prnt/hpijs/configure.in:
+ fix /etc/hp/hplip.conf ppd dir setting, thus unbreaking hp-setup
+ and remove useless cruft re. PPD dir setup while at it (closes: #358719)
+
+ -- Henrique de Moraes Holschuh <hmh@debian.org> Fri, 24 Mar 2006 21:22:17 -0300
+
+hplip (0.9.9-1) unstable; urgency=low
+
+ * New upstream version
+ * HPIJS 2.1.9:
+ + Fixed an array index underflow in ljfastraster.cpp
+ + Save paper width and height in UXServices object after a call to
+ SetPaperSize
+ + When fullbleed printing is requested, if printer supports it,
+ return actual paper dimensions for PrintableArea
+ + Added support for the following new printer(s):
+ + HP DeskJet F300 Series All-in-one (DJ3600)
+ * HPLIP 0.9.9:
+ + HPLIP now uses libusb for all USB I/O. Libusb replaces kernel
+ modules printer and usblp, and opens an entirely new can of worms
+ + Removed support for USB URIs based on device files. This means all
+ printers now use USB URIs based on "hp:/hp_model?serial=xxxxxxxx"
+ instead of "hp:/hp_model?device=/dev/usb/lpx". Old CUPS queues must
+ be updated to the new device location
+ + Added full USB 1284.4 support for the Color LaserJet 2840, and for
+ LaserJets 3050, 3060, 1010, 1012, 1015 and 2500
+ + Updated HP-Fax-hplip.ppd to be in conformance with CUPS 1.2
+ + Updated most LaserJet PPDs for CUPS 1.2
+ + Changed the GetSnmp timeout from 5 to 2 seconds in hpiod
+ + Fixed incorrect supplies information for Color Laserjet 2840
+ displayed in hp-toolbox
+ + Fixed problem where title input was of no use while adding a file to
+ item list in send fax dialog
+ + Add models.xml parallel port flag for Deskjet 5550
+ + Moved hp-sendfax temp .g3 files to ~/hpfax/hpfax-*.g3. Before,
+ they would clutter the user's home directory
+ + Files added to hp-sendfax interface are now rendered into g3 format
+ as they are added to the batch
+ + Removed temporary file creation from hpfax: (temp files now created
+ only by hp-sendfax using mkstemp)
+ + Added total page counting feature to hp-sendfax
+ + Added a BSD license to magic.py
+ * debian/control: build-depend on libusb >= 0.1.8
+ * dpatch 00_01_upstream-0.9.8-4: remove (applied upstream)
+ * dpatch 60_lp_instead_of_lpr: rediff to remove skips
+ * dpatch 40_quiet-hpiod: rediff to remove skips
+ * dpatch 01_rss: rediff to reorder file hunks
+ * dpatch 30_no-ping: remove, upstream removed icmp functionality
+ * dpatch 70_sane_ppd_directory_handling: remove (applied upstream)
+ * dpatch 45_quiet_hpijs-fax: remove (applied upstream)
+ * dpatch 35_no-fax-setuid: remove, upstream now does seteuid()/setegid()
+ only if sendfax is being run as root
+ * dpatch 10_shebang_fixes (new): new dump place for #!<interpretor> fixing
+ * hplip.menu: s/hp-fax/hp-sendfax/
+ * debian/control, debian/compat: switch to debhelper mode V5
+ * debian/control, debian/rules: provide and use hpijs:Upstream-Version,
+ rename Upstream-Version to hplip:Upstream-Version
+ * Rename hplip-ppds package to hpijs-ppds, update all documentation to
+ point to hpijs-ppds and linuxprinting.org-ppds and add a hpijs.NEWS
+ entry about the package rename as well
+ * debian/control: conflict hpijs with hplip-ppds versioned to source
+ version, as a dirty trick to not clash with hpijs-ppds providing
+ hplip-ppds
+ * debian/rules, debian/hpijs-ppds.install, debian/hpijs-ppds.links,
+ debian/hpijs-ppds.NEWS:
+ Don't ship non-hpijs PPDs anymore, linuxprinting.org-ppds takes care
+ of the pure postscript PPDs now
+ * debian/rules: version hpijs-ppds the same way we version hpijs
+ * debian/control: suggest hpijs-ppds and linuxprinting.org-ppds for hplip
+ instead of recommending the old hplip-ppds package. Recommend hpijs
+ with fax support for hplip. Remove conflict on foomatic-db-hpijs and
+ foomatic-filters-ppds from hplip. Conflict hpijs-ppds with
+ foomatic-filters-ppds before 20060113-1 when the PPD duplication was
+ removed from foomatic-filters-ppds
+ * debian/control: rework package descriptions a little
+ * debian/rules: ship all PPD files compressed
+ * debian/rules: separate arch-dep and arch-indep install, to avoid wasting
+ a great deal of time on slower archs gziping PPDs
+ * hplip initscript: Run hpiod as root because of libusb
+ * debian/copyright: update dates
+
+ -- Henrique de Moraes Holschuh <hmh@debian.org> Sun, 19 Mar 2006 23:32:57 -0300
+
+hplip (0.9.8-1) unstable; urgency=low
+
+ * This release was not uploaded to Debian
+ * New upstream version
+ * HPIJS 2.1.8 (patchlevel 4):
+ + Moved OfficeJet 6100 and 6150 to DJ55xx.h; margins on these devices
+ are same as those on DJ5550
+ + Added support for the following new printers:
+ + HP LaserJet 3050 (LJMono/PS)
+ + HP LaserJet 3060/3062 (LJMono/PS)
+ + HP LaserJet 3390/3392 (LJMono/PS)
+ + HP Deskjet 6980 series (DJGenericVIP)
+ + HP Deskjet 6940 series (DJGenericVIP)
+ + Updated KRGB patches to version 1.2:
+ + Fixed krgb buffer overflow issue with out-of-band data in
+ fill_rectangle and copy_mono. This buffer overflow condition
+ occurred with fullbleed print jobs that had k-band images
+ + Added Dan Coby's (artifex) fix for gsijs_read_string_malloc
+ gs_free *str memory leak.
+ * HPLIP 0.9.8 (patchlevel 4):
+ + Added send fax support (still quite rough)
+ + Added HP Setup utility
+ + Fixed deviceid zero termination issue in hplip_api.c
+ + Enhanced the status history table in hp-info
+ + Changed device list in toolbox to use small icons for status overlay
+ + Modified models.xml file to add pen info back to OJ5500 and disable
+ front panel
+ + Removed probe.py from distribution
+ + Added Fax URI generation to hp-makeuri
+ + Fixed hp-makeuri so that it would not report URIs for non-existent
+ functions
+ + Fixed hp-makeuri quiet modes that they are actually quiet
+ + Added a new chooser dialog that presents a list of CUPS queues
+ rather than device URIs (hp-sendfax, hp-print)
+ + Fixed a hpiod problem with the PS 2570 series. This will fix the
+ scanning blue-screen error with USB High Speed
+ * dpatch 00_01_upstream-0.9.8-4 (new): 0.9.8 patchlevel 4
+ * hplip package: recommend python-reportlab for fax cover page support
+ * Instead of modifying the PPD manufacturer tag from HP to HP (HPLIP),
+ now append HPLIP and the upstream version to the nickname
+ (closes: #347264)
+ * Ship hpijs PPDs in /usr/share/ppd/hpijs/<PPD Manufacturer> as per
+ the Debian PPD file structure specification. Ship the pure postscript
+ PPDs in /usr/share/ppd/hplip-postscript, for now
+ * Normalise case and start all HP PPD file names with "HP-"
+ * debian/control: Remove foomatic-db-hpijs from suggests and
+ recommends, as it will go away
+ * Update READMEs and NEWS files for the above PPD changes, add NEWS
+ file for hplip-ppds while at it
+ * Update hplip's README for hp-setup
+ * Mention that the RSS patch is stale in hpijs' README
+ * Removed patch already applied upstream: 00_01_upstream_0.9.7-2
+ * dpatches 30_no-ping, 50_doc-location, 60_lp_instead_of_lpr: rediff
+ * Let configure detect all standard paths for CUPS, except for the
+ PPD path
+ * Prune non-shipped-files.txt, and change debian/rules to tell us
+ which files were removed instead of doing it silently
+ * dpatch 70_sane_ppd_directory_handling (new): modify hplip to
+ look for PPD files under /usr/share/ppd/hplip, instead of
+ searching the entire CUPS PPD tree (used by hp-setup)
+ * Add menu entries for hp-print, hp-sendfax and hp-fab
+ * Add HPmenu.xpm icon
+ * dpatch 35_no-fax-setuid (new): change hpssd fax queue function
+ not to setuid(), as we don't run as root. This limits sending
+ faxes somehow, but the impact is not clear to me yet. Bug reports
+ welcome
+ * dpatch 45_quiet_hpijs-fax (new): remove noisy hpijs debug output in
+ the fax driver
+ * debian/control: rework package descriptions, mention fax support
+ * Ship KRGB patches cleaned up and tailored for Debian's gs versions
+ * Update debian/copyright for new directories, mention license of KRGB
+ patches (MIT)
+
+ -- Henrique de Moraes Holschuh <hmh@debian.org> Mon, 6 Mar 2006 16:43:08 -0300
+
+hplip (0.9.7-4ubuntu1) dapper; urgency=low
+
+ * Synchronize with Debian unstable.
+ * Keep the .desktop file, add "NoDisplay=true".
+ * Keep qt build dependencies, now in main.
+ * hplip-data now provides hpijs-data (introduced in 0.9.8).
+ * Try to open a message dialog for the "No Qt" message. Malone: #26413.
+ * Install ppd files into a manufacturer specific directory.
+ * Set the manufacturer name to "HP".
+ * Start hplip before cupsys. Malone: #3841, #26570.
+ * Put toolbox icon in category system, not application. Malone: #25627.
+
+ -- Matthias Klose <doko@ubuntu.com> Tue, 11 Apr 2006 10:27:47 +0000
+
+hplip (0.9.7-4) unstable; urgency=low
+
+ * New upstream 0.9.7-2 patch: fixes for the following problems:
+ + Photosmart 2570 series blue screen scanning error
+ + GetDeviceStatus overwrite in hpiod (from RedHat)
+ + SuperB margin issue with OJ K550, OJ K850 and DJ9800
+ + _GNU_SOURCE define in hpaio.h. (from RedHat)
+ * Remove versioning of python-qt3 and pyqt-utils build-dependencies to
+ make backports easier. Current versions in stable, testing and sid
+ are safe AFAIK
+ * Build-depend on libsnmp9-dev|libsnmp5-dev, to ease sarge backports
+
+ -- Henrique de Moraes Holschuh <hmh@debian.org> Wed, 7 Dec 2005 14:05:12 -0200
+
+hplip (0.9.7-3) unstable; urgency=low
+
+ * Switch from two versioned conflicts to two versioned depends/recommends
+ to encode the relationship between hplip and hplip-data. This is
+ easier on apt, since conflicts preclude unpack, while depends preclude
+ configure
+ * Fix non-removal of rem_str on 60_lp_instead_of_lpr (closes: #341445)
+
+ -- Henrique de Moraes Holschuh <hmh@debian.org> Wed, 30 Nov 2005 15:04:33 -0200
+
+hplip (0.9.7-2) unstable; urgency=low
+
+ * Brown paperbag release
+ * Actually add 60_lp_instead_of_lpr to list of active dpatches.
+ This closes: #336407 for real
+
+ -- Henrique de Moraes Holschuh <hmh@debian.org> Fri, 25 Nov 2005 00:24:58 -0200
+
+hplip (0.9.7-1) unstable; urgency=low
+
+ * New upstream version
+ * HPIJS 2.1.7:
+ + Fixed OJ K550 typo in HPIJS
+ + Added photo tray support to DJGenericVIP device class. This effects
+ all DJGenericVIP PPD files
+ + Added support for the following new printers:
+ + HP Color LaserJet 3000 (LJColor/PS)
+ + HP Color LaserJet 3600 (LJJetReady)
+ + HP Color LaserJet 3800 (LJColor/PS)
+ * HPLIP 0.9.7:
+ + Added 1284.4 support to hpiod. Previous support was MLC only
+ + Changed hp-toolbox startup behavior to increase performance
+ + Added checks in messaging code to prevent invalid messages from
+ crashing hpssd
+ + Added hp-toolbox PML cleanup code to LJ status code
+ + Fixed clj28xx scanning issue. Mfpdtf buffer was too small
+ libsane-hpaio. This fixes a problem introduced in 0.9.5
+ + Modified hp-makeuri to allow hostnames for network addresses
+ + Added support for "alternate n-up" for PS documents to hp-print
+ + Fixed an issue where the website link for support information is
+ wrong in "HP" tab of "Support Information" dialog
+ + Fixed an issue setting the scan token in libsane-hpaio
+ + Fixed an issue where an error occurs while executing the command
+ "hp-check -lnone" in terminal
+ + Fixed an issue where an exception is caught but the program does not
+ show a correct prompt when running the command "hp-align" with parameter
+ -p
+ + Fixed System::GetSnmp sigfault in hpiod. This will fix network
+ scanning/hp-toolbox issues in previous HPLIP releases
+ + Fixed an issue where an error occurs while executing hp-photo after
+ the usb cable was disconnected
+ * Use far less tight versioning that works with the new rules for binNMUs,
+ and break a dependency loop while at it (closes: #339909)
+ * Add versioned dependency on coreutils 5.1+ (closes: #337375)
+ * New dpatch 60_lp_instead_of_lpr:
+ Use "lp" instead of "lpr" to submit jobs (closes: #336407)
+ * Ship copyright and changelogs along with hplip-data too, as it is not
+ depending on hplip anymore and the /usr/share/doc/hplip-data symlink has
+ to go away
+
+ -- Henrique de Moraes Holschuh <hmh@debian.org> Thu, 24 Nov 2005 16:20:29 -0200
+
+hplip (0.9.6-1ubuntu8) dapper; urgency=low
+
+ * Fix symlink in /usr/share/cups/model.
+
+ -- Matthias Klose <doko@ubuntu.com> Fri, 14 Apr 2006 08:06:24 +0000
+
+hplip (0.9.6-1ubuntu7) dapper; urgency=low
+
+ * Keep the .desktop file, add "NoDisplay=true".
+ * Keep qt build dependencies, now in main.
+ * hplip-data now provides hpijs-data (introduced in 0.9.8).
+ * Try to open a message dialog for the "No Qt" message. Malone: #26413.
+ * Install ppd files into a manufacturer specific directory.
+ * Set the manufacturer name to "HP".
+ * Start hplip before cupsys. Malone: #3841, #26570.
+ * Put toolbox icon in category system, not application. Malone: #25627.
+
+ -- Matthias Klose <doko@ubuntu.com> Tue, 11 Apr 2006 10:27:47 +0000
+
+hplip (0.9.6-1ubuntu6) dapper; urgency=low
+
+ * Updated patch name and listed it from 00list so it's used
+
+ -- Sebastien Bacher <seb128@canonical.com> Wed, 15 Feb 2006 23:53:10 +0100
+
+hplip (0.9.6-1ubuntu5) dapper; urgency=low
+
+ * Patch to support the newer-style /dev/usblp%d device names we've
+ been using in dapper for USB printers.
+
+ -- Scott James Remnant <scott@ubuntu.com> Wed, 15 Feb 2006 18:18:14 +0000
+
+hplip (0.9.6-1ubuntu4) dapper; urgency=low
+
+ * Rebuild with libsnmp9-dev.
+
+ -- Fabio M. Di Nitto <fabbione@ubuntu.com> Thu, 01 Dec 2005 08:13:47 +0100
+
+hplip (0.9.6-1ubuntu3) dapper; urgency=low
+
+ * Really disable .desktop file by removing it from debian/
+ * Really make hp-toolbox and hp-unload give helpful error
+ messages. (Malone #4659)
+
+ -- Tollef Fog Heen <tfheen@ubuntu.com> Mon, 21 Nov 2005 09:24:32 +0100
+
+hplip (0.9.6-1ubuntu2) dapper; urgency=low
+
+ * Demote python-qt3 to Suggests (so we don't end up with python-qt3 in
+ desktop)
+ * Don't ship .desktop file.
+ * Make hp-toolbox and hp-unload give helpful error messages if
+ python-qt3 isn't installed.
+
+ -- Tollef Fog Heen <tfheen@ubuntu.com> Thu, 17 Nov 2005 10:36:22 +0100
+
+hplip (0.9.6-1ubuntu1) dapper; urgency=low
+
+ * Resynchronise with Debian
+ - Remove 90_bigendian-fix.dpatch, since it's already upstream
+ - Remove 88_configure.in.dpatch and 89_configure.dpatch and pass icon
+ path in debian/rules instead.
+ - Still use libsnmp5-dev.
+ - Switch to newer-style LSB init script functions (which are in the
+ Debian package, thanks hmh)
+ - Forward-port "have hplip installed, but please don't start it"
+ patch.
+
+ -- Tollef Fog Heen <tfheen@ubuntu.com> Tue, 15 Nov 2005 11:30:10 +0100
+
+hplip (0.9.6-1) unstable; urgency=low
+
+ * New upstream version
+ * HPIJS 2.1.6:
+ + Moved DJ450 from DJGenericVIP class to DJ9xxVIP class, because
+ mandatory margins are 0.25 inch on left and right sides and it does
+ not support fullbleed on any papersize
+ + Added a new printer family, DJ55xx to take care of margin issues for
+ DJ55xx printers
+ + Fixed a bug in sending custom paper size to JetReady and FastRaster
+ printers
+ + Fixed a bug in LJFastRaster when last band was less than 128 height,
+ it was incorrectly positioned.
+ + Fixed margin adjustment code to allow fullbleed or .125 inch margins
+ for those printers that support it in autoduplex mode
+ + Added support for the following new printers:
+ + HP Color LaserJet 4730 MFP (LJColor/PS)
+ + HP Deskjet 460 (DJGenericVIP)
+ + HP Officejet Pro K550, K850 (DJGenericVIP)
+ * HPLIP 0.9.6:
+ + In hp-toolbox (Device Manager) made a small LaserJet status change
+ that makes the CLJ 2550 work correctly
+ + Fixed a bug with the PSC3310 with low photo supplies (caused a
+ toolbox exception)
+ + Fixed a problem that made an offline CLJ2500 crash hpssd
+ + The hp-toolbox no longer uses a "listen" server socket. All
+ communication is done over the same client socket to hpssd
+ + Added new hp-toolbox UI for supplies and maintenance tools
+ + Made numerous changes to hp-toolbox
+ + Set CLJ 25xx devices to uni-di mode in models.xml
+ * Henrique de Moraes Holschuh:
+ * Remove patches already applied upstream:
+ 00_upstream-0.9.5-3, 11_fix-misc-gcc-warnings, 13_intsign-fixes,
+ 15_64bit_fixes, 20_fix_unitialized_var_bugs, 50_hp-clean_fix,
+ 99_ubuntu_hplip-deroot
+ * Remove some hunks already applied upstream:
+ 14_charsign_fixes
+ * Add a NEWS file for hpijs, warning users of PPDs that are documented
+ by upstream to have been changed significantly
+ * Fix hpijs autobuild system to actually work re. libhpip, by adding
+ some automake magic and libtool support
+ * Merge hplip-base and hplip packages. Current upstream code makes it
+ a losing battle to try to keep the two separate
+ * Don't bother explaining about alternate PPD sources in basic docs like
+ README.Debian. Don't suggest them in control file, either. This is
+ needed because HPLIP PPDs often change in non-forward or non-backwards
+ compatible ways
+ * Remove stray scan/__init__.py file
+ * New patch 30_noping: Do not attempt to send icmp packets in hpssd, as
+ it will not work since it doesn't run as root anymore. Thanks to
+ tatu.mannisto@iki.fi for the report (closes: #333850)
+ * New patch 40_quiet-hpiod: Shut hpiod up while trying to autodetect
+ parallel port printers, it was being waay too annoying in syslog
+ * New patch 50_doc-location: Add final / to URIs and point the readme
+ to the /usr/share/doc location inside hp-toolbox. If the local admin
+ doesn't like documentation and removes /usr/share/doc/hplip, this
+ doesn't break anything... you just get no documentation, which was
+ kind the point the admin was trying to make, I suppose ;-)
+
+ -- Henrique de Moraes Holschuh <hmh@debian.org> Mon, 24 Oct 2005 13:08:43 -0200
+
+hplip (0.9.5-4) unstable; urgency=low
+
+ * Henrique de Moraes Holschuh:
+ * Add more hunks to 14_charsign_fixes, probably non-critical fixes
+ * Clean up and revamp configure.in/Makefile.am so that it is less buggy
+ re. some 'assumptions' made upstream (closes: #329782)
+ * Version pyqt build-dependendices to make sure no autobuilder will
+ screw us over the C++/gcc transition, these can be removed in the
+ not-so-distant future
+ * Fix minor typo in a package description
+ * Move hp-print from hplip-base to hplip, as it has a GUI now, thanks
+ to HPLIP upstream for the bug report
+ * Move /usr/lib/hplip/plugins from hplip-base to hplip package, as it
+ is an ui/ component
+
+ -- Henrique de Moraes Holschuh <hmh@debian.org> Wed, 5 Oct 2005 00:14:33 -0300
+
+hplip (0.9.5-3) unstable; urgency=low
+
+ * Henrique de Moraes Holschuh:
+ * Added upstream patch 0.9.5-3
+ + Fix scanning on little-endian hosts
+ * Dropped 40_testmail_fix, not only it was already present upstream,
+ but I failed to notice patch screwing up royally when I rediffed it
+ for 0.9.5-1. Thanks to HPLIP upstream for the heads'up(!)
+
+ -- Henrique de Moraes Holschuh <hmh@debian.org> Wed, 21 Sep 2005 00:06:21 -0300
+
+hplip (0.9.5-2ubuntu2) breezy; urgency=low
+
+ * Fix big-endian architecture FTBFS.
+ - adds 90_bigendian-fix.dpatch
+ * Fix configure.in breakage when picking default desktop directory.
+ - adds 88_configure.in.dpatch, 89_configure.dpatch
+
+ -- LaMont Jones <lamont@ubuntu.com> Thu, 22 Sep 2005 12:08:22 +0000
+
+hplip (0.9.5-2ubuntu1) breezy; urgency=low
+
+ * New upstream version, exception from upstream version freeze.
+ * Synchronize with unstable.
+ - Build against libsnmp5-dev.
+ - Use older lsb init functions found in breezy.
+
+ -- Matthias Klose <doko@ubuntu.com> Tue, 20 Sep 2005 18:03:11 +0200
+
+hplip (0.9.5-2) unstable; urgency=low
+
+ * Henrique de Moraes Holschuh:
+ * Added upstream patch 0.9.5-2
+ + Fix scanning on Laserjets
+ + Fix scanning on parallel-port only Inkjets
+
+ -- Henrique de Moraes Holschuh <hmh@debian.org> Tue, 20 Sep 2005 01:01:05 -0300
+
+hplip (0.9.5-1) unstable; urgency=low
+
+ * New upstream version
+ * HPIJS 2.1.5:
+ + Fixed a 4-sided full bleed printing issue in HPIJS
+ + Added support for the following new printers:
+ HP Photosmart 420 (PSP100)
+ HP Photosmart 470 (PSP100)
+ HP Photosmart 2570 (DJGenericVIP)
+ HP PSC 1400 (DJ3600)
+ HP Officejet 5600 (DJ3600)
+ HP Photosmart 3100 (DJGenericVIP)
+ HP Photosmart 3200 (DJGenericVIP)
+ HP Photosmart 3300 (DJGenericVIP)
+ HP Photosmart 8000 (DJGenericVIP)
+ HP Photosmart 7800 (DJGenericVIP)
+ HP Deskjet 5940 (DJGenericVIP)
+ HP Deskjet 5440 (DJGenericVIP)
+ HP Color laserJet 4700 (LJColor/PS)
+ * HPLIP 0.9.5:
+ + Added parallel port support for printing and scanning. See
+ Product Support table for supported devices and features
+ + Changed the PS8700 PPD inputslot from "default" to "upper"
+ + Fixed miser mode MLC credit problem in hpiod
+ + Fixed MLC credit problem with short timeouts
+ + Fixed many known hp-toolbox issues
+ + Fixed case where hp-toolbox crashed if models.xml entry was missing
+ + Fixed hp-colorcal incorrect parameter passing to maint routines
+ + Fixed a bug in hpssd.py that caused hal:\\ devices to crash hpssd
+ + Fixed supplies status for CLJ28xx
+ + Fixed powersettings for DJ4x0
+ + Fixed LJ1022 status problem
+ * Henrique de Moraes Holschuh:
+ * Dpatch maintenance:
+ + Remove 20_useless_assignment_fix: fixed properly upstream
+ + Update 11_fix-misc-gcc-warnings, 14_charsign_fixes,
+ 50_hp-clean_fix: some hunks fixed upstream, some new hunks added
+ + Rediff 13_intsign-fixes, 40_testmail_fix
+ + New 20_fix_unitialized_var_bugs: fix some real bugs caused by
+ broken code with unitialized variables
+ + Switch all dpatches to /usr/share/dpatch/dpatch-run
+ * Add hp-levels symlink for new utility, that shows agent levels
+ using ASCII-art bar graphs
+
+ -- Henrique de Moraes Holschuh <hmh@debian.org> Mon, 19 Sep 2005 11:44:52 -0300
+
+hplip (0.9.4-4) unstable; urgency=low
+
+ * Henrique de Moraes Holschuh:
+ * Rebuild for C++ transition
+ * Mention usblp on README.Debian (closes: #326684)
+ * Fix invocation of dh_python for all binary packages other than hplip
+ * Do not remove pyc/pyo python compiled files from package hplip-base
+ when package hplip is removed
+ * Switch initscript to LSB-like reporting, and remove old HPGUId cruft
+ while at it
+ * hplip-base: add dependency on lsb-base due to initscript changes
+
+ -- Henrique de Moraes Holschuh <hmh@debian.org> Thu, 8 Sep 2005 12:47:58 -0300
+
+hplip (0.9.4-3ubuntu4) breezy; urgency=low
+
+ * One hplip B-D has changed under our feet breaking configure in a quite
+ impressive useless (for Ubuntu and Debian) point:
+ + Fix configure and configure.in to cope with this change.
+ + Fix FTBFS.
+
+ -- Fabio M. Di Nitto <fabbione@ubuntu.com> Mon, 19 Sep 2005 13:58:12 +0200
+
+hplip (0.9.4-3ubuntu3) breezy; urgency=low
+
+ * No GUIs here, correct LSB status messages
+
+ -- Matt Zimmerman <mdz@ubuntu.com> Wed, 14 Sep 2005 11:57:15 -0700
+
+hplip (0.9.4-3ubuntu2) breezy; urgency=low
+
+ * Add /etc/default/hplip to define a variable RUN_HPLIP, so
+ users can explicitely disable the start of hplip without
+ removing Ubuntu meta packages. Addresses Ubuntu 14054.
+
+ -- Matthias Klose <doko@ubuntu.com> Tue, 13 Sep 2005 22:35:16 +0200
+
+hplip (0.9.4-3ubuntu1) breezy; urgency=low
+
+ * Synchronize with unstable.
+ * Unconditionally run as user hplip (Ubuntu 14061).
+ * Use LSB init-functions (Ubuntu 14339).
+
+ -- Matthias Klose <doko@ubuntu.com> Fri, 2 Sep 2005 14:20:24 +0200
+
+hplip (0.9.4-3) unstable; urgency=low
+
+ * Henrique de Moraes Holschuh:
+ * New cleanup patches: 14_charsign_fixes, 20_useless_assignment_fix
+ * New dpatch: 15_64bit_fixes
+ * New hunks to dpatch: 11_fix-misc-gcc-warnings.dpatch
+
+ -- Henrique de Moraes Holschuh <hmh@debian.org> Sat, 6 Aug 2005 02:10:24 -0300
+
+hplip (0.9.4-2) unstable; urgency=low
+
+ * Matthias Klose <doko@ubuntu.com>:
+ * hplip-base should also replace files in hplip-data (<< 0.9.3)
+ * Run HPLIP daemons as non-root user (optional, default as run as root)
+ (closes: #320936)
+ * Henrique de Moraes Holschuh:
+ * Modify Matthias' postinst to create the hplip user in a safer way
+ * Depend on the correct adduser version for the above (just in case some
+ dweeb tries to backport this to ancient Debian)
+ * Add hplip-base.post{inst,rm} and initscript machinery for the hplip
+ user, supporting ephemeral /var/run and dpkg-statoverride the way I
+ like it
+ * Make run-hplip-as-non-root *non*-optional, it is safer and there is
+ nothing in hpiod or hpssd that requires root priviledges to work in a
+ Debian system
+ * Add NEWS.Debian item about running as non-root
+
+ -- Henrique de Moraes Holschuh <hmh@debian.org> Tue, 2 Aug 2005 23:36:19 -0300
+
+hplip (0.9.4-1ubuntu1) breezy; urgency=low
+
+ * Synchronize with Debian.
+ - Just keep dropping the pyqt-tools build dependency, and don't
+ remove the generated .py files from the source.
+ * debian/hplip-base.postinst:
+ - Create system user "hplip" (with primary group lp).
+ * debian/hplip-base.postrm:
+ - Remove system user "hplip" on purge.
+ * debian/hplip-base.init:
+ - Start daemons as as user:group hplip:lp.
+ - Create /var/run/hplip, if directory doesn't exist.
+ * debian/hplip-base.default:
+ - Default to run as user hplip.
+ - Add comment not to use port numbers below 1024 if not running as root.
+ * debian/control:
+ - hplip-base replaces hplib-data (<< 0.9.3).
+ * debian/patches/60_derootify.dpatch:
+ - New patch, don't run as root.
+
+ -- Matthias Klose <doko@ubuntu.com> Thu, 28 Jul 2005 21:23:58 +0200
+
+hplip (0.9.4-1) unstable; urgency=low
+
+ * New upstream version
+ * HPIJS 2.1.4:
+ + In order to accommodate 4-sided full bleed, PS320/330/370/380 were
+ moved to the DJGenericVIP device class
+ + Added hplip_api convenience library
+ + Fixed a problem where bi-di was not turned off correctly in hpijs.
+ This caused extra deviceid queries
+ + Fixed postscript PPD file case sensitivity issue. This issue caused
+ a problem with kprinter
+ + Added PPD files for the following new printers: HP Color LaserJet
+ 2800, HP Photosmart 8200, HP Photosmart 330, HP Photosmart 380,
+ Deskjet 1280, Deskjet 3040, Deskjet 3920
+ * HPLIP 0.9.4:
+ + Added uni-di device support to "hp" backend
+ + Added hplip_api convenience library. Converted HPLIP clients (hp,
+ libsane-hpaio, hpijs, ptest) to hplip_api
+ + Added device ID mode to hp-info utility (Tim Waugh of Red Hat
+ request)
+ + Added new DeviceOpen() parameters to accommodate different backend
+ types
+ + Changed and added new "io" support tags to models.xml
+ + Added LJ1022 to models.xml file
+ + Desensitized model names generated by hpiod. This will eliminate
+ leading, trailing and double spaces in the model name
+ + Made change to the models.xml file for Photosmart 120 and 240 series
+ which had pen 57 mislabeled as black
+ + Added LJ 8000, LJ 1160 series entries to models.xml
+ + Removed LJ 3100 from models.xml. There are no plans to support this
+ printer
+ + Fixed a scanimage problem with OJ D135 and OJ 7110
+ + Fixed "Invalid color calibration type" error in hp-colorcal
+ + Fixed "Unknown internal error" when executing command "hp-probe
+ -bnet"
+ + Fixed a intermittent SNMP problem reading signed integers in hpiod.
+ This will fix some network scanning issues.
+ + Enhanced hp-info and hp-makeuri as per Red Hat and Suse request
+ + Changed SLP detection to detect more devices based on forum
+ feedback
+ + Added limited support for HP Color LaserJet 2800, is limited to:
+ only postscript printing is supported; Photo Card access is not
+ available via hp-photo, but it is available via USB mass storage;
+ Network scanning is supported, but USB scanning is not;
+ Hp-toolbox status is not complete
+ * Henrique de Moraes Holschuh:
+ * Removed patches already upstream: 00_upstream_0.9.3-1,
+ 10_missing-prototypes
+ * Merged LTLIBRARY instances in top Makefile.am
+ * Fixed some minor typos in README.Debian, thanks to Santiago Vila
+ * Bump standards version to 3.6.2, no changes
+ * Makefile.am: declare colorcal4form_base.ui, printerform_base.ui as
+ noinst_DATA
+
+ -- Henrique de Moraes Holschuh <hmh@debian.org> Sun, 24 Jul 2005 09:37:29 -0300
+
+hplip (0.9.3-3) unstable; urgency=high
+
+ * New upstream patch 0.9.3-1 to hpijs:
+ + Fixed a bi-di problem with all LIDIL printers (DJ3320, DJ3600)
+ + Fixed a 64-bit problem with LJJetReady printers
+ + Fixed a KRGB issue in the VIP path in HPIJS. This fixes a problem
+ where black text would drop some pixels with VIP printers (DJ9xxVIP,
+ DJGenericVIP) (closes: #314442)
+ * Henrique de Moraes Holschuh:
+ * Minor updates to README.Debian on the various packages
+ * Rework package descriptions a bit in control file
+ * Stop confliting with HPOJ. We are fine with it as long as the same
+ device is NOT being used by HPOJ and HPIJS
+ * Remove hplip-base dependency from hplip-ppds. Instead, suggest
+ hpijs and hplip-base in hplip-ppds, and ship changelog instead of symlink
+ * Remove some stray -Nhplip crap from arch-dep section of rules files
+ * Remove 12_fix-gcc4-errors.dpatch, accepted upstream (patch 0.9.3-1)
+ * debian/rules: avoid useless /usr/bin/find warnings about
+ maxdepth/mindepth
+
+ -- Henrique de Moraes Holschuh <hmh@debian.org> Wed, 29 Jun 2005 00:48:18 -0300
+
+hplip (0.9.3-2) unstable; urgency=low
+
+ * Henrique de Moraes Holschuh:
+ * New binary-all package: hplip-ppds, with the PPDs shipped by HPLIP
+ upstream. Other than due to bug-fixes, these are usually a better
+ match for the current hpijs/hplip capabilities than those from
+ foomatic-filters-ppds or foomatic-db-hpijs
+ * Change the Manufacturer string on all PPDs to "HP (HPLIP)", to set
+ them apart from PPDs of other sources
+ * Update README.Debian with information about the HPLIP PPDs
+ * Recommend hplip-ppds (closes: #311470, #311474)
+ * New patch: 12_fix-gcc4-errors (closes: #310435)
+
+ -- Henrique de Moraes Holschuh <hmh@debian.org> Sat, 4 Jun 2005 09:28:18 -0300
+
+hplip (0.9.3-1) unstable; urgency=low
+
+ * New upstream version
+ * HPIJS 2.1.3:
+ + Increased the printable region for DJGenericVIP. This resolves a
+ left margin issue
+ + Fixed a problem printing more than one page with LJ 1010/1012
+ + Modified hpijs to ignore bi-di errors so the "hp" backend can
+ handle them. This fixed a problem where hpijs would hang
+ forever
+ * HPLIP 0.9.3:
+ + Modified models.xml Deskjet_1220C panel_check_type to be 0
+ + Fix the Test Email Alert
+ + Added MlcInit retry to hpiod
+ + Changed hplip_readme.html "Photo" support to yes for
+ OJ7200/7300/7400
+ + Fixed intermittent device hang problem with LJ 1010/1012/1015
+ in hp.c
+ + Added OfficeJet V40 to models.xml
+ + Fixed models.xml so that LJ 1010, 1012, 1015, and 1022 all print
+ using "raw" io
+ + Fixed "hp-probe -s*" error
+ + Fixed error while clicking the"Access Photo Cards" without any
+ photo card
+ + Fixed error while running hp-testpage command to print
+ after disconnecting the USB cable
+ + Added LJ 1010 and 1012 to models.xml, and made sure the OJ K80xi
+ has both a single spaces and a double spaced entry
+ + Fixed error which occurs after launching the toolbox in the terminal
+ + In models.xml cloned HP LaserJet 4050 Series to the same thing with a
+ trailing underscore
+ * Henrique de Moraes Holschuh:
+ * Swap maintainer and uploader fields for now, since I am spending
+ far more time in HPLIP than Torsten. Should that change, he will
+ switch the fields back as they were
+ * Tell libtool that the sane plugin is a plugin with -module
+ * Split hplip into GUI and non-GUI packages, as suggested by
+ Matthias Klose <doko@ubuntu.com> (closes: #307790)
+ + Change /usr/share/doc/hplip to a symlink (requires hplip.preinst
+ and hplip.postinst glue to support error unwind and downgrades)
+ + Change hplip package to arch all, as all C source and binary
+ modules belong in hplip-base
+ + hplip-base.preinst (new), hplip-base.postrm (new), hplip.postrm:
+ Remove any .pyc and .pyo files scattered around /usr/lib/hplip
+ * Fix configure.in, Makefile.am to accept and use a PYTHON variable
+ to select the python version to run properly, and really use whatever
+ python that variable points to, and no other (closes: #307788)
+ * Rework configure.in and Makefile.am a bit, in a moment of utter
+ boredom
+ * Change autogen.sh and debian/rules to get the hpijs versioning
+ through autoconf --trace at autotools-run time, and document the
+ debian/hpijs.version file in debian/README.Source
+ * Remove unneeded #! lines from python modules before packaging the
+ debs, to make lintian happier
+ * Control new files showing up upstream, by using a static list of
+ non-shipped files and passing --fail-missing to dh_install
+ * Remove debian/executable.files and debian/deletable.files support,
+ as this package does not require it
+ * hplip-base: recommend cupsys-client, as some of the utilities
+ run "lp -d..." and friends (closes: #308960)
+ * Rediff 01_rss.dpatch, 10_missing-prototypes.dpatch,
+ 11_fix-misc-gcc-warnings.dpatch, 13_intsign-fixes.dpatch,
+ 40_testmail_fix.dpatch, 50_hp-clean_fix.dpatch to remove some hunks
+ accepted upstream and remove any fuzziness and line numbering skews
+ * Remove patch 30_bind_to_INADDR_LOOPBACK, completely accepted
+ upstream
+
+ -- Henrique de Moraes Holschuh <hmh@debian.org> Wed, 25 May 2005 00:31:22 -0300
+
+hplip (0.9.2-2ubuntu3) breezy; urgency=low
+
+ * Fix FTBFS using GCC 4.0.
+
+ -- Matthias Klose <doko@ubuntu.com> Mon, 23 May 2005 15:01:45 +0000
+
+hplip (0.9.2-2ubuntu2) breezy; urgency=low
+
+ * Rebuild for new C++ ABI
+
+ -- Matthias Klose <doko@ubuntu.com> Wed, 18 May 2005 15:42:15 +0000
+
+hplip (0.9.2-2ubuntu1) breezy; urgency=low
+
+ * Resynchronise with Debian. Ubuntu 10583.
+ * Fix location of document registered with doc-base. Ubuntu 10490.
+
+ -- Matthias Klose <doko@ubuntu.com> Tue, 10 May 2005 14:57:10 +0200
+
+hplip (0.9.2-2) unstable; urgency=low
+
+ * Henrique de Moraes Holschuh:
+ * Added new patch: 50_hp-clean_fix, fix hp-clean bad wipeAndSpitType1()
+ invocation
+
+ -- Henrique de Moraes Holschuh <hmh@debian.org> Tue, 26 Apr 2005 02:04:27 -0300
+
+hplip (0.9.2-1ubuntu1) breezy; urgency=low
+
+ * Detect python default version.
+ * Split out all non GUI stuff into hplip-base, keep only the GUI
+ in hplip. Avoids installation of QT.
+ * Remove build dependencies on pyqt-tools and python-qt3. Nothing
+ needed for the build process. Keep the pregenerated .py files.
+
+ -- Matthias Klose <doko@ubuntu.com> Thu, 5 May 2005 14:16:04 +0200
+
+hplip (0.9.2-1) unstable; urgency=medium
+
+ * New upstream version
+ * HPIJS 2.1.2:
+ + Added new print mode "FastDraft Grayscale" to DJGenericVIP
+ + Put limit (max=5) on syslog messages when output device write()
+ fails (closes: #210449)
+ + Removed specified gcc options in hpijs configure.in
+ + Fixed a 64-bit compile issue in ljjetready.cpp (closes: #302828)
+ * HPLIP 0.9.2:
+ + Fixed "Invalid color calibration type" error occurs when executing
+ command "colorcal" in terminal
+ + Fixed number of arguments error in hp-align
+ + Made UI architectural change (removed hpguid.py, removed popup feature,
+ etc)
+ + Fixed a scanning issue with Laserjet flatbed scanners (PML scanners).
+ Scan would fail at end of scan
+ + Removed images.tgz after install
+ + Fixed a problem when all function buttons are grayed out when toolbox is
+ launched at the first time.
+ + Fixed DJ450 battery check issue
+ * Henrique de Moraes Holschuh:
+ * Updated dpatch 11_fix-misc-gcc-warnings with many new hunks
+ * Added 40_testmail_fix, to get hpssd and Test Email functionality to
+ actually work (it was completely useless and hopelessly broken)
+ (closes: #291346)
+ * Updated README.Debian files for HPIJS and HPLIP
+
+ -- Henrique de Moraes Holschuh <hmh@debian.org> Wed, 20 Apr 2005 10:05:59 -0300
+
+hplip (0.9.1-2) unstable; urgency=low
+
+ * Henrique de Moraes Holschuh:
+ * New dpatch (30_bind_to_INADDR_LOOPBACK):
+ Bind to INADDR_LOOPBACK instead of to INADDR_ANY for now, as
+ HPLIP is constrained to working bound to localhost currently
+ (closes: #304068)
+
+ -- Henrique de Moraes Holschuh <hmh@debian.org> Wed, 13 Apr 2005 08:14:25 -0300
+
+hplip (0.9.1-1) unstable; urgency=low
+
+ * New upstream version:
+ * HPIJS 2.1.1:
+ + Fixed hpijs bi-di assert issue with business inkjet 1100
+ + Added PPD files for the following printers: HP LaserJet 4240,
+ HP LaserJet 9040, HP color LaserJet 4610, HP LaserJet 1022,
+ HP Business Inkjet 1000
+ * HPLIP 0.9.1:
+ + Added a "front panel" enable/disable flag to models.xml. Some printers
+ were disabled (ie: deskjets)
+ + Ink level and status displays have been fixed for CP1160/1700, OJ7100
+ series and OJ D series
+ + Added battery level check for mobile deskjets (DJ 450, etc)
+ + Fixed issue that could cause DJ 450 to lock-up during panel check
+ (miser mode)
+ + Fixed extraneous hpiod error. Corrected pml iod in scl path that was
+ in libsane-hpaio
+ + Added PSC 750xi, OJ 5110 to models.xml file
+ + Added device manager *.ui files to package
+ * Henrique de Moraes Holschuh:
+ * Rebuild 11_fix-misc-gcc-warnings, most of it accepted upstream,
+ but we have also new hunks as well
+ * Remove 12_portability-fixes, accepted upstream
+ * Remove 14_fix-fat-prototypes, accepted upstream
+ * Remove 20_jddirect-bug-from-hell, fixed upstream
+ * Remove 30_fix-missing-retcode, accepted upstream
+ * Avoid shipping check.py, since it is useless for Debian systems
+ * Change both upstream and Debian build system to take advantage
+ of the .ui files and rebuild the .py files that are generated
+ from them using pyuic
+ * Build-depend on pyqt-tools for pyuic
+
+ -- Henrique de Moraes Holschuh <hmh@debian.org> Sat, 2 Apr 2005 10:58:28 -0300
+
+hplip (0.9-1) unstable; urgency=low
+
+ * New upstream version (closes: #302230):
+ * HPIJS 2.1:
+ + Added two new device classes - LJFastRaster and LJJetReady
+ + Fixed input tray issue with Business Inkjet 1100/1200
+ + Changed default quality setting from 300 to 600 dpi for DJ9xxVIP
+ + Replaced gdevijs-krgb-1.0.patch with gdevijs-krgb-1.1.patch
+ This patch fixes as segfault issue with 1-bit color space IJS drivers
+ (ie: epsonepl)
+ + Fixed a issue with DJ3600 photo pen printing
+ + Support additional printers: LaserJet 1010/1012/1015, Color LaserJet
+ 3500/3550, HP Photosmart 8750, HP Deskjet 6600, HP Deskjet 9800 Series
+ * HPLIP 0.9:
+ + Added network scanning support
+ + Added full status and supply information for most LaserJets
+ + Added hp-makeuri command for generating "hp" URIs from an IP address
+ or device node
+ + Fixed some network issues with hp-probe
+ + Fixed a problem with multiple files using the same name in photo card
+ + Fixed a bug in the cancel job code in hp-toolbox
+ + Fixed some dialog cancel defects in clean and align
+ + Reversed order of status history in hp-toolbox
+ + Added photo card access status
+ + Added hp-toolbox right click menu
+ + Hpssd no longer scans devices at startup, devices are scanned when
+ hp-toolbox is first started
+ + Removed power-up from the probe command in hpiod. This means that
+ when CUPS queries the "hp" backend for devices, the printer will not
+ power-up (closes: #291321)
+ + Added non-zero exit codes to hp-toolbox
+ + Added changes to display EXIF data in photo card
+ + Added channel cleanup code to hpiod. This will fix some issues when
+ canceling print jobs from the host
+ + Added a non-scrolling "front panel display" feature to hp-toolbox
+ + Added Color Calibration for various printer platforms
+ + Do not keep restarting/reopening hp-toolbox at every status change
+ (closes: #292672)
+ * Henrique de Moraes Holschuh:
+ * Build-depend on libjpeg62-dev for hpijs 2.1
+ * Version build-dependency on libsnmp5-dev (>> 5.1.2-6), to avoid
+ #302195 which completely hoses the hplip build
+ * Remove 30_xpp_support.dpatch, applied upstream
+ * New patches:
+ + 10_missing-prototypes: Add missing prototypes
+ + 11_fix-misc-gcc-warnings: Fix bad C code that causes
+ warnings and strict aliasing rules problems (closes: #297587)
+ + 12_portability-fixes: Remove braindamage that causes
+ portability problems and warnings
+ + 13_intsign-fixes.dpatch: Fix signed/unsigned comparison issues
+ + 14_fix-fat-prototypes: Fix prototypes missing a (void) so that gcc
+ shuts up
+ + 20_jddirect-bug-from-hell: Fix complete breakage in
+ JetDirectDevice::NewChannel (undefined value assigned to channel
+ mode)
+ + 30_fix-missing-retcode: Add missing assignment of retcode
+ * Add hplip.desktop freedesktop.org file, thanks to Christopher Martin
+ (closes: #302248)
+ * Rename all hplip_* links in /usr/bin to hp-* to follow upstream
+ * Ship new SANE backend dll.d configuration, and conflict with libsane
+ (<< 1.0.15-7) (closes: #296317)
+ * Torsten Landschoff:
+ + debian/control: Fix typos in description
+ - of hpijs: a IJS driver -> an IJS driver (closes: #299987)
+ - of hplip: a X11 session -> an X11 session (closes: #299991)
+
+ -- Henrique de Moraes Holschuh <hmh@debian.org> Fri, 1 Apr 2005 09:38:12 -0300
+
+hplip (0.8.8-1) unstable; urgency=low
+
+ * UNRELEASED: This release was never uploaded to unstable due to serious
+ issues with many devices
+
+ * New upstream version:
+ * Added low ink infrastructure to device manager
+ * Made fixes to cleaning procedure
+ * Offline devices will now show supplies list with "Unknown" levels (was
+ blank before)
+ * Fixed the display for black cartridge number 15 on the Supplies Tab
+ * Added tech-type to models.xml
+ * Fixed Laserjet 1220 model.xml entry
+ * Fixed an issue with the Alert email service (does NOT fix #291346)
+ * Henrique de Moraes Holschuh:
+ * Removed patches accepted upstream:
+ 20_hpiod_pidfile.dpatch, 40_gcc4_buildfixes.dpatch,
+ 50_securityfix_umask.dpatch,
+ 51_securityfix_detect_unsafe_conf_file.dpatch
+ * Remove patches that don't make sense anymore
+ 10_toplevel_makefile.dpatch
+ * Rediff 30_xpp_support so that it applies cleanly
+
+ -- Henrique de Moraes Holschuh <hmh@debian.org> Sun, 13 Feb 2005 21:04:27 -0200
+
+hplip (0.8.7-4) unstable; urgency=low
+
+ * Henrique de Moraes Holschuh:
+ * HPLIP:
+ * Remove stray tab on 50_securityfix_umask.dpatch. Reupload in
+ case python decides to croak on us because of it
+ * Remove unneeded (but harmless) patch 21_base_pidfile_support.dpatch
+
+ -- Henrique de Moraes Holschuh <hmh@debian.org> Tue, 1 Feb 2005 12:46:56 -0200
+
+hplip (0.8.7-3) unstable; urgency=low
+
+ * Henrique de Moraes Holschuh:
+ * HPLIP:
+ * SECURITY FIX: create .hplip.conf on user directory mode 600 (was 666)
+ The HPLIP suite was failing to set the process umask to sane values,
+ hpssd.py and hpguid.py were affected. Also, modify HPLIP so that it
+ warns the user of the broken permissions, ignores such a file, and
+ fixes the permissions on the next time the config file is written to.
+ Thanks to Erwan David <erwan@rail.eu.org> for reporting this bug
+ (closes: #293117)
+ * Really fix debian/rules to unpatch only after cleaning the tree
+
+ -- Henrique de Moraes Holschuh <hmh@debian.org> Tue, 1 Feb 2005 11:03:22 -0200
+
+hplip (0.8.7-2) unstable; urgency=low
+
+ * Henrique de Moraes Holschuh:
+ * Updated copyright file with all the relevant information for HPLIP
+ * Move dh_python calls to before dh_installdeb (closes: #291746)
+
+ -- Henrique de Moraes Holschuh <hmh@debian.org> Sat, 22 Jan 2005 23:24:22 -0200
+
+hplip (0.8.7-1) unstable; urgency=low
+
+ * New upstream source
+ + Fixed a issue with the max setting for input trays in APDK (HPIJS 2.0.1)
+ + Added OfficeJet K series support
+ + Changed scanning default compression from none to jpeg. This speeds up
+ device I/O significantly during scans
+ + Cleaned up cancel button functionality in device manager.
+ + Added r value caching to hpssd to increase responsiveness of some
+ printers when doing dynamic counters
+ + Fixed a defect in strings.py (wrong string for not installed cart)
+ + Added DeviceIDs to the models.xml file
+ + Added PPD files for the following new printers: LaserJet 4345 MFP,
+ LaserJet 3015/3020/3030
+ + Fixed some devices which were wrongly set to MLC mode instead of RAW
+ * Henrique de Moraes Holschuh:
+ * Better dpatch support on debian/rules: use clean-patched target
+ instead of reinvoking make
+ * Patches 22_hpssd_pidfile and 50_bigendian merged upstream
+ * Rediff all dpatches and switch to -p1, so that using dpatch-edit-patch
+ is much easier
+ * HPLIP:
+ * Try to stop all instances of hpguid.py on initscript stop. We need
+ to revisit this later when hpguid and hpssd get more intelligent
+ hpguid pidfile/termination handling
+
+ -- Henrique de Moraes Holschuh <hmh@debian.org> Fri, 21 Jan 2005 12:39:24 -0200
+
+hplip (0.8.4-5) unstable; urgency=low
+
+ * Henrique de Moraes Holschuh:
+ * HPIJS:
+ * s/cartridge/pen/ everywhere in the Debian stuff, since that's how HP
+ calls the printing head + ink cartridge combo
+ * HPLIP:
+ * Add dependency on python-qt3 (closes: #291202)
+
+ -- Henrique de Moraes Holschuh <hmh@debian.org> Thu, 20 Jan 2005 04:54:42 -0200
+
+hplip (0.8.4-4) unstable; urgency=low
+
+ * Henrique de Moraes Holschuh:
+ * HPLIP:
+ * Fix FTBFS on big-endian archs: add 50_bigendian.dpatch, to fix typo
+ in pcard/vfat.h
+ * Add lintian overrides for "description-synopsis-starts-with-a-capital-
+ letter", since HP *is* always written in uppercase
+
+ -- Henrique de Moraes Holschuh <hmh@debian.org> Tue, 18 Jan 2005 23:50:03 -0200
+
+hplip (0.8.4-3) unstable; urgency=low
+
+ * Henrique de Moraes Holschuh:
+ * HPLIP:
+ * Add python to build-depends, fix FTBFS on all arches
+ * Switch all python2.3-* build-depends to python-* build-depends
+
+ -- Henrique de Moraes Holschuh <hmh@debian.org> Tue, 18 Jan 2005 12:38:40 -0200
+
+hplip (0.8.4-2) unstable; urgency=low
+
+ * Henrique de Moraes Holschuh:
+ * HPIJS:
+ * Apply patch by Andreas Jochens <aj@andaco.de> to fix FTBFS
+ problems with gcc 4.0 on AMD64 (#286353)
+ * Improve suggests: for foomatic and hplip integration
+ * HPLIP:
+ * Conflict with all non-bidir-enabled hpijs and foomatic versions
+ * Add a quick-install guide to README.Debian
+ * Be silent about CUPS reloads, to avoid startling users during
+ system shutdown
+ * Upload to Debian unstable. Do note that 64-bit archs are still an
+ unknown (feedback welcome)
+
+ -- Henrique de Moraes Holschuh <hmh@debian.org> Tue, 18 Jan 2005 00:54:44 -0200
+
+hplip (0.8.4-1) experimental; urgency=low
+
+ * Initial packaging of HPLIP (closes: #285026)
+ * Source for HPIJS is now provided by the HPLIP source package
+ * Version of the hpijs package will now be:
+ <hpijs upstream version>+<hplip package version>
+
+ * Henrique de Moraes Holschuh:
+ * HPIJS:
+ * New upstream source, supports HPLIP bi-directional channels, and
+ DJGenericVIP four-sided full bleed printing. Now support printers
+ that require bi-directional channels to work.
+ * Update Depends: to versions of the gs packages with KRBG support
+ * Ship KRGB patch in usr/share/doc
+ * HPLIP:
+ * Added pidfile locking to hpiod, hpssd [merged upstream in 0.8.4]
+ * Fixed upstream autotools build system something fierce
+ * Build libhpip as a convenience library (and don't package it)
+ * Add hplip_* links to the user binaries on /usr/bin
+ * Add a hpssd link on /usr/sbin and use that on initscript
+ * Support xpp as a default "print" GUI interface
+
+ * This is not complete yet. This package has not been validated to
+ work on 64-bit archs (help is welcome) upstream. We have absolutely
+ no idea if the MFP utilities (photo-card reading, SANE scanning) work
+ at all (help is also welcome).
+ * Do not install this if you are not ready to help track down the bugs
+
+ -- Henrique de Moraes Holschuh <hmh@debian.org> Sat, 18 Dec 2004 12:25:49 -0200
+
+hpijs (1.7.1-1) unstable; urgency=high
+
+ * Henrique de Moraes Holschuh:
+ * New upstream source (1.7.1)
+ + Support a few more printers (PPD changes only)
+ + No upstream changes to any binary packages
+ * Urgency high, since this is only an upstream-sync upload with
+ no noteworthy changes
+ * debian/watch: add primary watch line using prdownloads.sf.net,
+ since the ftp servers for sf.net are not realiable at all
+
+ -- Henrique de Moraes Holschuh <hmh@debian.org> Mon, 15 Nov 2004 11:47:48 -0200
+
+hpijs (1.7-1) unstable; urgency=medium
+
+ * Henrique de Moraes Holschuh:
+ * New upstream source (1.7)
+ + Support a few more printers (code changes, not only PPD changes)
+ * Add watch file for uscan/DEHS
+ * Remove patch 03_fixsegfaults, now applied upstream
+ * Remove disabled patch 02_destdir, applied upstream a long time ago
+
+ -- Henrique de Moraes Holschuh <hmh@debian.org> Sun, 17 Oct 2004 12:41:21 -0300
+
+hpijs (1.6.2-1) unstable; urgency=medium
+
+ * Henrique de Moraes Holschuh:
+ * New upstream version (no changes to binaries, since we do not ship the
+ PPD files from this source package).
+ * Update autogen.sh for automake 1.9, rerun autotools
+ * Remove all autogenerated files from CVS tree (use debian/autogen.sh to
+ recreate the files, debian/rules should do this automatically on
+ cvs-buildpackage)
+ * Suggests foomatic-db-hpijs (closes: #270566)
+ * Urgency medium to get sooner into testing
+
+ -- Henrique de Moraes Holschuh <hmh@debian.org> Sat, 18 Sep 2004 10:28:09 -0300
+
+hpijs (1.6.1-1) unstable; urgency=low
+
+ * Henrique de Moraes Holschuh:
+ * New upstream version (no changes to binary packages,
+ since we do not ship the PPD files from this source package).
+ * Move autogen.sh to debian/ for tidyness
+ * Not uploaded
+
+ -- Henrique de Moraes Holschuh <hmh@debian.org> Fri, 9 Jul 2004 14:18:41 -0300
+
+hpijs (1.6-3) unstable; urgency=low
+
+ * Mention hpoj on README.Debian and package description.
+
+ -- Henrique de Moraes Holschuh <hmh@debian.org> Fri, 9 Jul 2004 13:41:00 -0300
+
+hpijs (1.6-2) unstable; urgency=low
+
+ * Add comment about rss patch to package description (closes: #209127)
+ * Fix hpijs segfaults (probably non-exploitable) when given bad parameters,
+ or when something bad happens at startup time. HPIJS really needs an
+ audit, since the code is doing NULL pointer derreferences that easily
+ (closes: #169587)
+ * Minor manpage tweaks, mention option -h
+
+ -- Henrique de Moraes Holschuh <hmh@debian.org> Mon, 14 Jun 2004 19:35:45 -0300
+
+hpijs (1.6-1) unstable; urgency=low
+
+ * Henrique de Moraes Holschuh <hmh@debian.org>:
+ * New upstream source:
+ + Added support for: HP business inkjet 2300, HP officejet 9100,
+ HP officejet 4200, HP psc 1310
+ + Added envelope support, needed for center-feed envelope
+ trays (ie: laserjets): Envelopes #10, A2, C6, DL, Japanese #3,
+ Japanese #4
+ + Added KRGB colorspace support (patch to ghostscript required to
+ enable)
+ * Update dependencies to use gs-gpl, add gs-afpl as lowest priority
+ * Update standards version to 3.6.1
+ * Add copyright notice for the Debian packaging to debian/copyright
+ * Use debhelper compatibility mode V4
+ * Switch to packaged dpatch
+ * Remove auto-generated files auto-include.h and platform.h in clean
+ target
+ * Autotools-dev support, using links
+ * Enable AM_MAINTAINER_MODE
+ * Set things up so that we regen the entire autotools toolchain (by
+ calling autogen.sh) on cvs-checkout. Add an autogen.sh, since
+ upstream lacks one
+ * Modify configure.in so that our CXXFLAGS and CFLAGS are respected
+ * Add a simple manpage for the hpijs binary with pointers to the real
+ docs, since hpijs is NEVER called directly
+
+ -- Henrique de Moraes Holschuh <hmh@debian.org> Mon, 17 May 2004 21:35:32 -0300
+
+hpijs (1.5-1) unstable; urgency=low
+
+ * New upstream release (closes: #218074).
+
+ -- Torsten Landschoff <torsten@debian.org> Wed, 29 Oct 2003 08:53:05 +0100
+
+hpijs (1.4.1-1) unstable; urgency=low
+
+ * New upstream release (closes: #198606).
+ * Apply new black-ink-only patch from
+ http://www.linuxprinting.org/download/printing/hpijs/
+ using dpatch (closes: #198657).
+ * debian/control: Add Henrique de Moraes Holschuh to the Uploaders field
+ (thanks for your help, Henrique).
+ * debian/rules: Disable foomatic and cups install for now. Not sure how
+ to deal with that correctly.
+
+ -- Torsten Landschoff <torsten@debian.org> Sun, 17 Aug 2003 01:43:11 +0200
+
+hpijs (1.3.1-1.1) unstable; urgency=low
+
+ * NMU
+ * Copy in config.guess and config.sub from autotools-dev (20020320.1).
+ Closes: #190959
+
+ -- LaMont Jones <lamont@debian.org> Mon, 12 May 2003 11:00:13 -0600
+
+hpijs (1.3.1-1) unstable; urgency=low
+
+ * New upstream release (closes: #188858).
+
+ -- Torsten Landschoff <torsten@debian.org> Sun, 13 Apr 2003 19:26:32 +0200
+
+hpijs (1.3-1) unstable; urgency=low
+
+ * New upstream release.
+ * Disable the -rss patch as it no longer applies to this version of
+ hpijs and some of the changes have been folded upstream.
+
+ -- Torsten Landschoff <torsten@debian.org> Sat, 2 Nov 2002 09:50:10 +0100
+
+hpijs (1.2.2-1) unstable; urgency=low
+
+ * Co-Maintainer upload
+ * New upstream version (Closes: #163094)
+ * Added -rss patch (via dpatch)
+ * debian/control: fix dependancy line (Closes: #153514, #159716)
+ * debian/control: Updated Standards-Version
+ * debian/copyright: Added note about the -rss patch
+
+ -- Martin Loschwitz <madkiss@madkiss.org> Sun, 13 Oct 2002 22:36:00 +0200
+
+hpijs (1.2-1) unstable; urgency=low
+
+ * New upstream release (closes: #147065).
+
+ -- Torsten Landschoff <torsten@debian.org> Thu, 18 Jul 2002 11:49:36 +0200
+
+hpijs (1.0.4-2) unstable; urgency=low
+
+ * Ship the hpijs_readme.html with the package (closes: #143492).
+ For some reason the upstream Makefile does not install it anymore,
+ it is now listed in debian/docs.
+
+ -- Torsten Landschoff <torsten@debian.org> Thu, 18 Apr 2002 21:25:06 +0200
+
+hpijs (1.0.4-1) unstable; urgency=low
+
+ * New upstream release (closes: #135271).
+ * No longer puts documentation files in /usr/share/doc/hpijs-$ver
+ (closes: #131588).
+
+ -- Torsten Landschoff <torsten@debian.org> Mon, 25 Mar 2002 23:18:32 +0100
+
+hpijs (1.0.2-1) unstable; urgency=low
+
+ * New upstream release.
+ * debian/control: As HP has updated the license of this software
+ it can now go into main. Woohoo! :-) Changed the section accordingly.
+ * debian/copyright: Update to the new license.
+
+ -- Torsten Landschoff <torsten@debian.org> Sat, 19 Jan 2002 02:08:24 +0100
+
+hpijs (1.0-3) unstable; urgency=low
+
+ * debian/copyright: Include the more restrictive license. Seems like
+ hpijs.cpp was already changed to be DFSG compatible. Kudos to
+ James Troup for pointing this out.
+
+ -- Torsten Landschoff <torsten@debian.org> Tue, 15 Jan 2002 21:40:00 +0100
+
+hpijs (1.0-2) unstable; urgency=low
+
+ * ijs_server.c (ijs_server_init): Fix off by one bug which clobbered the
+ stack making the binary unusable when compiled with optimization.
+ * debian/rules.c (configure): Add support for --enable-debug using the
+ DEB_BUILD_OPTIONS interface as suggested in debian-policy.
+
+ -- Torsten Landschoff <torsten@debian.org> Mon, 14 Jan 2002 03:09:00 +0100
+
+hpijs (1.0-1) unstable; urgency=low
+
+ * Initial release.
+
+ -- Torsten Landschoff <torsten@debian.org> Sat, 12 Jan 2002 03:40:10 +0100
+
diff --git a/depcomp b/depcomp
new file mode 100755
index 0000000..df8eea7
--- /dev/null
+++ b/depcomp
@@ -0,0 +1,630 @@
+#! /bin/sh
+# depcomp - compile a program generating dependencies as side-effects
+
+scriptversion=2009-04-28.21; # UTC
+
+# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009 Free
+# Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
+
+case $1 in
+ '')
+ echo "$0: No command. Try \`$0 --help' for more information." 1>&2
+ exit 1;
+ ;;
+ -h | --h*)
+ cat <<\EOF
+Usage: depcomp [--help] [--version] PROGRAM [ARGS]
+
+Run PROGRAMS ARGS to compile a file, generating dependencies
+as side-effects.
+
+Environment variables:
+ depmode Dependency tracking mode.
+ source Source file read by `PROGRAMS ARGS'.
+ object Object file output by `PROGRAMS ARGS'.
+ DEPDIR directory where to store dependencies.
+ depfile Dependency file to output.
+ tmpdepfile Temporary file to use when outputing dependencies.
+ libtool Whether libtool is used (yes/no).
+
+Report bugs to <bug-automake@gnu.org>.
+EOF
+ exit $?
+ ;;
+ -v | --v*)
+ echo "depcomp $scriptversion"
+ exit $?
+ ;;
+esac
+
+if test -z "$depmode" || test -z "$source" || test -z "$object"; then
+ echo "depcomp: Variables source, object and depmode must be set" 1>&2
+ exit 1
+fi
+
+# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
+depfile=${depfile-`echo "$object" |
+ sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
+tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
+
+rm -f "$tmpdepfile"
+
+# Some modes work just like other modes, but use different flags. We
+# parameterize here, but still list the modes in the big case below,
+# to make depend.m4 easier to write. Note that we *cannot* use a case
+# here, because this file can only contain one case statement.
+if test "$depmode" = hp; then
+ # HP compiler uses -M and no extra arg.
+ gccflag=-M
+ depmode=gcc
+fi
+
+if test "$depmode" = dashXmstdout; then
+ # This is just like dashmstdout with a different argument.
+ dashmflag=-xM
+ depmode=dashmstdout
+fi
+
+cygpath_u="cygpath -u -f -"
+if test "$depmode" = msvcmsys; then
+ # This is just like msvisualcpp but w/o cygpath translation.
+ # Just convert the backslash-escaped backslashes to single forward
+ # slashes to satisfy depend.m4
+ cygpath_u="sed s,\\\\\\\\,/,g"
+ depmode=msvisualcpp
+fi
+
+case "$depmode" in
+gcc3)
+## gcc 3 implements dependency tracking that does exactly what
+## we want. Yay! Note: for some reason libtool 1.4 doesn't like
+## it if -MD -MP comes after the -MF stuff. Hmm.
+## Unfortunately, FreeBSD c89 acceptance of flags depends upon
+## the command line argument order; so add the flags where they
+## appear in depend2.am. Note that the slowdown incurred here
+## affects only configure: in makefiles, %FASTDEP% shortcuts this.
+ for arg
+ do
+ case $arg in
+ -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
+ *) set fnord "$@" "$arg" ;;
+ esac
+ shift # fnord
+ shift # $arg
+ done
+ "$@"
+ stat=$?
+ if test $stat -eq 0; then :
+ else
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ mv "$tmpdepfile" "$depfile"
+ ;;
+
+gcc)
+## There are various ways to get dependency output from gcc. Here's
+## why we pick this rather obscure method:
+## - Don't want to use -MD because we'd like the dependencies to end
+## up in a subdir. Having to rename by hand is ugly.
+## (We might end up doing this anyway to support other compilers.)
+## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
+## -MM, not -M (despite what the docs say).
+## - Using -M directly means running the compiler twice (even worse
+## than renaming).
+ if test -z "$gccflag"; then
+ gccflag=-MD,
+ fi
+ "$@" -Wp,"$gccflag$tmpdepfile"
+ stat=$?
+ if test $stat -eq 0; then :
+ else
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ rm -f "$depfile"
+ echo "$object : \\" > "$depfile"
+ alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
+## The second -e expression handles DOS-style file names with drive letters.
+ sed -e 's/^[^:]*: / /' \
+ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
+## This next piece of magic avoids the `deleted header file' problem.
+## The problem is that when a header file which appears in a .P file
+## is deleted, the dependency causes make to die (because there is
+## typically no way to rebuild the header). We avoid this by adding
+## dummy dependencies for each header file. Too bad gcc doesn't do
+## this for us directly.
+ tr ' ' '
+' < "$tmpdepfile" |
+## Some versions of gcc put a space before the `:'. On the theory
+## that the space means something, we add a space to the output as
+## well.
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly. Breaking it into two sed invocations is a workaround.
+ sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+hp)
+ # This case exists only to let depend.m4 do its work. It works by
+ # looking at the text of this script. This case will never be run,
+ # since it is checked for above.
+ exit 1
+ ;;
+
+sgi)
+ if test "$libtool" = yes; then
+ "$@" "-Wp,-MDupdate,$tmpdepfile"
+ else
+ "$@" -MDupdate "$tmpdepfile"
+ fi
+ stat=$?
+ if test $stat -eq 0; then :
+ else
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ rm -f "$depfile"
+
+ if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files
+ echo "$object : \\" > "$depfile"
+
+ # Clip off the initial element (the dependent). Don't try to be
+ # clever and replace this with sed code, as IRIX sed won't handle
+ # lines with more than a fixed number of characters (4096 in
+ # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines;
+ # the IRIX cc adds comments like `#:fec' to the end of the
+ # dependency line.
+ tr ' ' '
+' < "$tmpdepfile" \
+ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \
+ tr '
+' ' ' >> "$depfile"
+ echo >> "$depfile"
+
+ # The second pass generates a dummy entry for each header file.
+ tr ' ' '
+' < "$tmpdepfile" \
+ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
+ >> "$depfile"
+ else
+ # The sourcefile does not contain any dependencies, so just
+ # store a dummy comment line, to avoid errors with the Makefile
+ # "include basename.Plo" scheme.
+ echo "#dummy" > "$depfile"
+ fi
+ rm -f "$tmpdepfile"
+ ;;
+
+aix)
+ # The C for AIX Compiler uses -M and outputs the dependencies
+ # in a .u file. In older versions, this file always lives in the
+ # current directory. Also, the AIX compiler puts `$object:' at the
+ # start of each line; $object doesn't have directory information.
+ # Version 6 uses the directory in both cases.
+ dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
+ test "x$dir" = "x$object" && dir=
+ base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
+ if test "$libtool" = yes; then
+ tmpdepfile1=$dir$base.u
+ tmpdepfile2=$base.u
+ tmpdepfile3=$dir.libs/$base.u
+ "$@" -Wc,-M
+ else
+ tmpdepfile1=$dir$base.u
+ tmpdepfile2=$dir$base.u
+ tmpdepfile3=$dir$base.u
+ "$@" -M
+ fi
+ stat=$?
+
+ if test $stat -eq 0; then :
+ else
+ rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+ exit $stat
+ fi
+
+ for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+ do
+ test -f "$tmpdepfile" && break
+ done
+ if test -f "$tmpdepfile"; then
+ # Each line is of the form `foo.o: dependent.h'.
+ # Do two passes, one to just change these to
+ # `$object: dependent.h' and one to simply `dependent.h:'.
+ sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
+ # That's a tab and a space in the [].
+ sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
+ else
+ # The sourcefile does not contain any dependencies, so just
+ # store a dummy comment line, to avoid errors with the Makefile
+ # "include basename.Plo" scheme.
+ echo "#dummy" > "$depfile"
+ fi
+ rm -f "$tmpdepfile"
+ ;;
+
+icc)
+ # Intel's C compiler understands `-MD -MF file'. However on
+ # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c
+ # ICC 7.0 will fill foo.d with something like
+ # foo.o: sub/foo.c
+ # foo.o: sub/foo.h
+ # which is wrong. We want:
+ # sub/foo.o: sub/foo.c
+ # sub/foo.o: sub/foo.h
+ # sub/foo.c:
+ # sub/foo.h:
+ # ICC 7.1 will output
+ # foo.o: sub/foo.c sub/foo.h
+ # and will wrap long lines using \ :
+ # foo.o: sub/foo.c ... \
+ # sub/foo.h ... \
+ # ...
+
+ "$@" -MD -MF "$tmpdepfile"
+ stat=$?
+ if test $stat -eq 0; then :
+ else
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ rm -f "$depfile"
+ # Each line is of the form `foo.o: dependent.h',
+ # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
+ # Do two passes, one to just change these to
+ # `$object: dependent.h' and one to simply `dependent.h:'.
+ sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
+ # Some versions of the HPUX 10.20 sed can't process this invocation
+ # correctly. Breaking it into two sed invocations is a workaround.
+ sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" |
+ sed -e 's/$/ :/' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+hp2)
+ # The "hp" stanza above does not work with aCC (C++) and HP's ia64
+ # compilers, which have integrated preprocessors. The correct option
+ # to use with these is +Maked; it writes dependencies to a file named
+ # 'foo.d', which lands next to the object file, wherever that
+ # happens to be.
+ # Much of this is similar to the tru64 case; see comments there.
+ dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
+ test "x$dir" = "x$object" && dir=
+ base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
+ if test "$libtool" = yes; then
+ tmpdepfile1=$dir$base.d
+ tmpdepfile2=$dir.libs/$base.d
+ "$@" -Wc,+Maked
+ else
+ tmpdepfile1=$dir$base.d
+ tmpdepfile2=$dir$base.d
+ "$@" +Maked
+ fi
+ stat=$?
+ if test $stat -eq 0; then :
+ else
+ rm -f "$tmpdepfile1" "$tmpdepfile2"
+ exit $stat
+ fi
+
+ for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
+ do
+ test -f "$tmpdepfile" && break
+ done
+ if test -f "$tmpdepfile"; then
+ sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile"
+ # Add `dependent.h:' lines.
+ sed -ne '2,${
+ s/^ *//
+ s/ \\*$//
+ s/$/:/
+ p
+ }' "$tmpdepfile" >> "$depfile"
+ else
+ echo "#dummy" > "$depfile"
+ fi
+ rm -f "$tmpdepfile" "$tmpdepfile2"
+ ;;
+
+tru64)
+ # The Tru64 compiler uses -MD to generate dependencies as a side
+ # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'.
+ # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
+ # dependencies in `foo.d' instead, so we check for that too.
+ # Subdirectories are respected.
+ dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
+ test "x$dir" = "x$object" && dir=
+ base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
+
+ if test "$libtool" = yes; then
+ # With Tru64 cc, shared objects can also be used to make a
+ # static library. This mechanism is used in libtool 1.4 series to
+ # handle both shared and static libraries in a single compilation.
+ # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d.
+ #
+ # With libtool 1.5 this exception was removed, and libtool now
+ # generates 2 separate objects for the 2 libraries. These two
+ # compilations output dependencies in $dir.libs/$base.o.d and
+ # in $dir$base.o.d. We have to check for both files, because
+ # one of the two compilations can be disabled. We should prefer
+ # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
+ # automatically cleaned when .libs/ is deleted, while ignoring
+ # the former would cause a distcleancheck panic.
+ tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4
+ tmpdepfile2=$dir$base.o.d # libtool 1.5
+ tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5
+ tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504
+ "$@" -Wc,-MD
+ else
+ tmpdepfile1=$dir$base.o.d
+ tmpdepfile2=$dir$base.d
+ tmpdepfile3=$dir$base.d
+ tmpdepfile4=$dir$base.d
+ "$@" -MD
+ fi
+
+ stat=$?
+ if test $stat -eq 0; then :
+ else
+ rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
+ exit $stat
+ fi
+
+ for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
+ do
+ test -f "$tmpdepfile" && break
+ done
+ if test -f "$tmpdepfile"; then
+ sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
+ # That's a tab and a space in the [].
+ sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
+ else
+ echo "#dummy" > "$depfile"
+ fi
+ rm -f "$tmpdepfile"
+ ;;
+
+#nosideeffect)
+ # This comment above is used by automake to tell side-effect
+ # dependency tracking mechanisms from slower ones.
+
+dashmstdout)
+ # Important note: in order to support this mode, a compiler *must*
+ # always write the preprocessed file to stdout, regardless of -o.
+ "$@" || exit $?
+
+ # Remove the call to Libtool.
+ if test "$libtool" = yes; then
+ while test "X$1" != 'X--mode=compile'; do
+ shift
+ done
+ shift
+ fi
+
+ # Remove `-o $object'.
+ IFS=" "
+ for arg
+ do
+ case $arg in
+ -o)
+ shift
+ ;;
+ $object)
+ shift
+ ;;
+ *)
+ set fnord "$@" "$arg"
+ shift # fnord
+ shift # $arg
+ ;;
+ esac
+ done
+
+ test -z "$dashmflag" && dashmflag=-M
+ # Require at least two characters before searching for `:'
+ # in the target name. This is to cope with DOS-style filenames:
+ # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise.
+ "$@" $dashmflag |
+ sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile"
+ rm -f "$depfile"
+ cat < "$tmpdepfile" > "$depfile"
+ tr ' ' '
+' < "$tmpdepfile" | \
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly. Breaking it into two sed invocations is a workaround.
+ sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+dashXmstdout)
+ # This case only exists to satisfy depend.m4. It is never actually
+ # run, as this mode is specially recognized in the preamble.
+ exit 1
+ ;;
+
+makedepend)
+ "$@" || exit $?
+ # Remove any Libtool call
+ if test "$libtool" = yes; then
+ while test "X$1" != 'X--mode=compile'; do
+ shift
+ done
+ shift
+ fi
+ # X makedepend
+ shift
+ cleared=no eat=no
+ for arg
+ do
+ case $cleared in
+ no)
+ set ""; shift
+ cleared=yes ;;
+ esac
+ if test $eat = yes; then
+ eat=no
+ continue
+ fi
+ case "$arg" in
+ -D*|-I*)
+ set fnord "$@" "$arg"; shift ;;
+ # Strip any option that makedepend may not understand. Remove
+ # the object too, otherwise makedepend will parse it as a source file.
+ -arch)
+ eat=yes ;;
+ -*|$object)
+ ;;
+ *)
+ set fnord "$@" "$arg"; shift ;;
+ esac
+ done
+ obj_suffix=`echo "$object" | sed 's/^.*\././'`
+ touch "$tmpdepfile"
+ ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
+ rm -f "$depfile"
+ cat < "$tmpdepfile" > "$depfile"
+ sed '1,2d' "$tmpdepfile" | tr ' ' '
+' | \
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly. Breaking it into two sed invocations is a workaround.
+ sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+ rm -f "$tmpdepfile" "$tmpdepfile".bak
+ ;;
+
+cpp)
+ # Important note: in order to support this mode, a compiler *must*
+ # always write the preprocessed file to stdout.
+ "$@" || exit $?
+
+ # Remove the call to Libtool.
+ if test "$libtool" = yes; then
+ while test "X$1" != 'X--mode=compile'; do
+ shift
+ done
+ shift
+ fi
+
+ # Remove `-o $object'.
+ IFS=" "
+ for arg
+ do
+ case $arg in
+ -o)
+ shift
+ ;;
+ $object)
+ shift
+ ;;
+ *)
+ set fnord "$@" "$arg"
+ shift # fnord
+ shift # $arg
+ ;;
+ esac
+ done
+
+ "$@" -E |
+ sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
+ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' |
+ sed '$ s: \\$::' > "$tmpdepfile"
+ rm -f "$depfile"
+ echo "$object : \\" > "$depfile"
+ cat < "$tmpdepfile" >> "$depfile"
+ sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+msvisualcpp)
+ # Important note: in order to support this mode, a compiler *must*
+ # always write the preprocessed file to stdout.
+ "$@" || exit $?
+
+ # Remove the call to Libtool.
+ if test "$libtool" = yes; then
+ while test "X$1" != 'X--mode=compile'; do
+ shift
+ done
+ shift
+ fi
+
+ IFS=" "
+ for arg
+ do
+ case "$arg" in
+ -o)
+ shift
+ ;;
+ $object)
+ shift
+ ;;
+ "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
+ set fnord "$@"
+ shift
+ shift
+ ;;
+ *)
+ set fnord "$@" "$arg"
+ shift
+ shift
+ ;;
+ esac
+ done
+ "$@" -E 2>/dev/null |
+ sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
+ rm -f "$depfile"
+ echo "$object : \\" > "$depfile"
+ sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile"
+ echo " " >> "$depfile"
+ sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+msvcmsys)
+ # This case exists only to let depend.m4 do its work. It works by
+ # looking at the text of this script. This case will never be run,
+ # since it is checked for above.
+ exit 1
+ ;;
+
+none)
+ exec "$@"
+ ;;
+
+*)
+ echo "Unknown depmode $depmode" 1>&2
+ exit 1
+ ;;
+esac
+
+exit 0
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/devicesettings.py b/devicesettings.py
new file mode 100755
index 0000000..8f57a74
--- /dev/null
+++ b/devicesettings.py
@@ -0,0 +1,86 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2008 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+__version__ = '0.1'
+__title__ = 'Device Setup Utility'
+__mod__ = 'hp-devicesettings'
+__doc__ = "Device settings utility for HPLIP supported printers. (Note: Not all printers require the use of this utility)."
+
+#Std Lib
+import sys
+import re
+import getopt
+import time
+import operator
+import os
+
+# Local
+from base.g import *
+from base import device, utils, maint, tui, module
+from prnt import cups
+
+
+try:
+ mod = module.Module(__mod__, __title__, __version__, __doc__, None,
+ (GUI_MODE,), (UI_TOOLKIT_QT4,))
+
+ mod.setUsage(module.USAGE_FLAG_DEVICE_ARGS,
+ see_also_list=['hp-toolbox'])
+
+
+ opts, device_uri, printer_name, mode, ui_toolkit, lang = \
+ mod.parseStdOpts()
+
+ device_uri = mod.getDeviceUri(device_uri, printer_name,
+ filter={'power-settings': (operator.gt, 0)})
+
+ if not utils.canEnterGUIMode4():
+ log.error("%s -u/--gui requires Qt4 GUI support. Exiting." % __mod__)
+ sys.exit(1)
+
+ try:
+ from PyQt4.QtGui import QApplication
+ from ui4.devicesetupdialog import DeviceSetupDialog
+ except ImportError:
+ log.error("Unable to load Qt4 support. Is it installed?")
+ sys.exit(1)
+
+ #try:
+ if 1:
+ app = QApplication(sys.argv)
+
+ dlg = DeviceSetupDialog(None, device_uri)
+ dlg.show()
+ try:
+ log.debug("Starting GUI loop...")
+ app.exec_()
+ except KeyboardInterrupt:
+ sys.exit(0)
+
+
+
+except KeyboardInterrupt:
+ log.error("User exit")
+
+log.info("")
+log.info("Done.")
+
diff --git a/diagnose_plugin.py b/diagnose_plugin.py
new file mode 100755
index 0000000..b78cefd
--- /dev/null
+++ b/diagnose_plugin.py
@@ -0,0 +1,104 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2011 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Amarnath Chitumalla, Suma Byrappa
+#
+
+__version__ = '1.0'
+__mod__ = 'hp-diagnose_plugin'
+__title__ = 'Plugin Download and Install Utility'
+__doc__ = ""
+
+# Std Lib
+import sys
+import getopt
+import time
+import os.path
+import re
+import os
+
+# Local
+from base.g import *
+from base import utils, module
+
+USAGE = [ (__doc__, "", "name", True),
+ ("Usage: %s [OPTIONS]" % __mod__, "", "summary", True),
+ utils.USAGE_OPTIONS,
+ utils.USAGE_LOGGING1, utils.USAGE_LOGGING2, utils.USAGE_LOGGING3,
+ utils.USAGE_HELP,
+ utils.USAGE_SPACE,
+ utils.USAGE_SEEALSO,
+ ("hp-plugin", "", "seealso", False),
+ ("hp-setup", "", "seealso", False),
+ ("hp-firmware", "", "seealso", False),
+ ]
+
+
+mod = module.Module(__mod__, __title__, __version__, __doc__, USAGE,
+ (INTERACTIVE_MODE, GUI_MODE),
+ (UI_TOOLKIT_QT3, UI_TOOLKIT_QT4), True)
+
+opts, device_uri, printer_name, mode, ui_toolkit, loc = \
+ mod.parseStdOpts( handle_device_printer=False)
+
+plugin_path = None
+install_mode = PLUGIN_REQUIRED
+plugin_reason = PLUGIN_REASON_NONE
+
+if mode == GUI_MODE:
+ if ui_toolkit == 'qt3':
+ log.error("Unable to load Qt3. Please use Qt4")
+
+ else: #qt4
+ if not utils.canEnterGUIMode4():
+ log.error("%s requires GUI support . Is Qt4 installed?" % __mod__)
+ sys.exit(1)
+
+ try:
+ from PyQt4.QtGui import QApplication, QMessageBox
+ from ui4.plugindiagnose import PluginDiagnose
+ from installer import core_install
+ except ImportError:
+ log.error("Unable to load Qt4 support. Is it installed?")
+ sys.exit(1)
+
+ app = QApplication(sys.argv)
+ core = core_install.CoreInstall()
+ plugin_sts = core.check_for_plugin()
+ if plugin_sts == PLUGIN_INSTALLED:
+ log.info("Device Plugin is already installed")
+ sys.exit(0)
+ elif plugin_sts == PLUGIN_VERSION_MISMATCH:
+ dialog = PluginDiagnose(None, install_mode, plugin_reason, True)
+ else:
+ dialog = PluginDiagnose(None, install_mode, plugin_reason)
+
+ dialog.show()
+ try:
+ log.debug("Starting GUI loop...")
+ app.exec_()
+ except KeyboardInterrupt:
+ log.error("User exit")
+ sys.exit(0)
+else: #Interaction mode
+ log.error("Only Qt4 GUI mode is supported \n")
+ usage()
+
+log.info("")
+log.info("Done.")
diff --git a/diagnose_queues.py b/diagnose_queues.py
new file mode 100755
index 0000000..9b965fc
--- /dev/null
+++ b/diagnose_queues.py
@@ -0,0 +1,440 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2011-2014 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Amarnath Chitumalla
+#
+
+__version__ = '1.0'
+__title__ = 'AutoConfig Utility to check queues configuration'
+__mod__ = 'hp-daignose-queues'
+__doc__ = """Auto config utility for HPLIP supported multifunction Devices to diagnose queues configuration."""
+
+# Std Lib
+import sys
+import os
+import getopt
+import commands
+import re
+
+# Local
+from base.g import *
+from base import utils, tui, models
+from prnt import cups
+from installer import core_install
+
+# ppd type
+HPCUPS = 1
+HPIJS = 2
+HPPS = 3
+HPOTHER = 4
+
+DEVICE_URI_PATTERN = re.compile(r"""(.*):/(.*?)/(\S*?)\?(?:serial=(\S*)|device=(\S*)|ip=(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}[^&]*)|zc=(\S+))(?:&port=(\d))?""", re.I)
+NICKNAME_PATTERN = re.compile(r'''\*NickName:\s*\"(.*)"''', re.MULTILINE)
+NET_PATTERN = re.compile(r"""(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})""")
+NET_ZC_PATTERN = re.compile(r'''zc=(.*)''',re.IGNORECASE)
+NET_OTHER_PATTERN = re.compile(r'''(.*)://(.*)''',re.IGNORECASE)
+USB_PATTERN = re.compile(r'''serial=(.*)''',re.IGNORECASE)
+LPSTAT_PATTERN = re.compile(r"""(\S*): (.*)""", re.IGNORECASE)
+#BACK_END_PATTERN = re.compile(r'''(.*):(.*)''',re.IGNORECASE)
+
+##### METHODS #####
+
+def usage(typ='text'):
+ if typ == 'text':
+ utils.log_title(__title__, __version__)
+ utils.format_text(USAGE, typ, __title__, __mod__, __version__)
+ sys.exit(0)
+
+
+# Checks 'lp' group is added o not
+def check_user_groups():
+ result = False
+ sts,output = utils.run('groups')
+ if sts != 0:
+ log.error("Failed to get groups")
+ else:
+ output = output.rstrip('\r\n')
+ log.debug("groups =%s "%output)
+ grp_list= output.split(' ')
+ cnt = 0
+ while cnt < len(grp_list) :
+ if grp_list[cnt] == 'lp':
+ result = True
+ break
+ cnt += 1
+
+ return result
+
+# This function adds the groups ('lp') to user
+def add_group(core):
+ result = False
+ add_user_to_group = core.get_distro_ver_data('add_user_to_group', '')
+ if add_user_to_group:
+ usermod = os.path.join(utils.which("usermod"), "usermod") + " %s %s" % (add_user_to_group, prop.username)
+ else:
+ usermod = os.path.join(utils.which("usermod"), "usermod") + " %s %s" % ("-Glp", prop.username)
+
+ su_sudo = utils.su_sudo()
+ password_f = None
+ if su_sudo is "su":
+ name,version,is_su = utils.os_release()
+ log.debug("name = %s version = %s is_su = %s" %(name,version,is_su))
+ if ( name == 'Fedora' and version >= '14' and is_su == True):
+ #using su opening GUI apps fail in Fedora 14.
+ #To run GUI apps as root, you need a root login shell (su -) in Fedora 14
+ su_sudo = 'su - -c "%s"'
+ else:
+ su_sudo = 'su -c "%s"'
+
+ password_f = "get_password_ui"
+# password_f = utils.get_password
+ cmd =su_sudo % usermod
+ log.info("cmd = %s" %cmd)
+# sts, output = utils.run(cmd, True, password_f, -1,True,cmd)
+ sts, output = utils.run(cmd, True, password_f, 1, True, "Please enter root/superuser password to add 'lp' group")
+ if sts == 0:
+ result = True
+
+ return result
+
+
+# This parse the given Device URI. and provides the details.
+def parseDeviceURI(device_uri):
+ m = DEVICE_URI_PATTERN.match(device_uri)
+ if m is None:
+ raise Error(ERROR_INVALID_DEVICE_URI)
+
+ back_end = m.group(1).lower() or ''
+ is_hp = (back_end in ('hp', 'hpfax', 'hpaio'))
+ bus = m.group(2).lower() or ''
+
+ if bus not in ('usb', 'net', 'bt', 'fw', 'par'):
+ raise Error(ERROR_INVALID_DEVICE_URI)
+
+ model =m.group(3) or ''
+ serial = m.group(4) or ''
+ dev_file = m.group(5) or ''
+ host = m.group(6) or ''
+ zc = ''
+ if not host:
+ zc = host = m.group(7) or ''
+ port = m.group(8) or 1
+
+ if bus == 'net':
+ try:
+ port = int(port)
+ except (ValueError, TypeError):
+ port = 1
+
+ if port == 0:
+ port = 1
+
+# log.warning("++++: back_end '%s' is_hp '%s' bus '%s' model '%s' serial '%s' dev_file '%s' host '%s' zc '%s' port '%s' " %
+# ( back_end, is_hp, bus, model, serial, dev_file, host, zc, port))
+
+ return back_end, is_hp, bus, model, serial, dev_file, host, zc, port
+
+
+####### Device class ########
+class DetectedDevice:
+ def __init__(self, Printer_Name,Device_URI,Device_Type, ppdType, PPDFileError = False, IsEnabled=True ):
+ self.PrinterName =Printer_Name
+ self.DeviceURI = Device_URI
+ self.DeviceType = Device_Type
+ self.PPDFileType = ppdType
+ self.PPDFileError = PPDFileError
+ self.IsEnabled = IsEnabled
+
+
+
+
+#########Main##########
+USAGE = [(__doc__, "", "name", True),
+ ("Usage: %s [OPTIONS]" % __mod__, "", "summary", True),
+ utils.USAGE_OPTIONS,
+ utils.USAGE_LOGGING1, utils.USAGE_LOGGING2, utils.USAGE_LOGGING3,
+ utils.USAGE_HELP,
+ ]
+
+try:
+ log.set_module(__mod__)
+
+ try:
+ opts, args = getopt.getopt(sys.argv[1:], 'hl:gsr', ['help', 'help-rest', 'help-man', 'help-desc', 'logging='])
+
+ except getopt.GetoptError, e:
+ log.error(e.msg)
+ usage()
+ sys.exit(1)
+
+ if os.getenv("HPLIP_DEBUG"):
+ log.set_level('debug')
+
+ log_level = 'info'
+ Show_result=False
+ quiet_mode = False
+ for o, a in opts:
+ if o in ('-h', '--help'):
+ usage()
+
+ elif o == '--help-rest':
+ usage('rest')
+
+ elif o == '--help-man':
+ usage('man')
+
+ elif o == '--help-desc':
+ print __doc__,
+ sys.exit(0)
+
+ elif o in ('-l', '--logging'):
+ log_level = a.lower().strip()
+
+ elif o == '-g':
+ log_level = 'debug'
+
+ elif o == '-r':
+ Show_result = True
+
+ elif o == '-s':
+ quiet_mode = True
+
+ if not log.set_level(log_level):
+ usage()
+ if not quiet_mode:
+ utils.log_title(__title__, __version__)
+
+ log_file = os.path.normpath('/var/loh/hp/hplip_queues.log')
+ log.debug(log.bold("Saving output in log file: %s" % log_file))
+ if os.path.exists(log_file):
+ os.remove(log_file)
+ log.set_logfile(log_file)
+ log.set_where(log.LOG_TO_CONSOLE_AND_FILE)
+
+ try:
+ from base import device, pml
+ # This can fail due to hpmudext not being present
+ except ImportError:
+ log.error("Device library is not avail.")
+ sys.exit(1)
+
+ # Only Qt4 is supported.
+ try:
+ from PyQt4.QtGui import QApplication, QMessageBox
+ from ui4.queuesconf import QueuesDiagnose
+ except ImportError:
+ log.error("Unable to load Qt4 support. Is it installed?")
+ sys.exit(1)
+
+ app = QApplication(sys.argv)
+ Error_Found = False
+ if check_user_groups() is False:
+ dialog = QueuesDiagnose(None, "","",QUEUES_MSG_SENDING)
+ core = core_install.CoreInstall()
+ core.init()
+ if add_group(core) is False:
+ Error_Found = True
+ #log.error("Failed to add lp group to user[%s]. Manually add 'lp' group to usergroups"%prop.username)
+ dialog.showMessage("User must be part of 'lp' group.\nManually add 'lp' group to '%s' user. " %prop.username)
+ else:
+ dialog.showSuccessMessage("Groups added successfully and reboot is required. Please reboot system to take effect.")
+
+
+ is_hpcups_installed = to_bool(sys_conf.get('configure', 'hpcups-install', '0'))
+ is_hpijs_installed = to_bool(sys_conf.get('configure', 'hpijs-install', '0'))
+# tui.header("INSTALLED CUPS PRINTER QUEUES")
+
+
+ status, output = utils.run('lpstat -v')
+
+ cups_printers = []
+ for p in output.splitlines():
+ try:
+ match = LPSTAT_PATTERN.search(p)
+ printer_name = match.group(1)
+ device_uri = match.group(2)
+ cups_printers.append((printer_name, device_uri))
+ except AttributeError:
+ pass
+
+ log.debug(cups_printers)
+ log.debug("HPCups installation=%d HPIJS installation =%d" %(is_hpcups_installed, is_hpijs_installed))
+ if cups_printers:
+ mapofDevices={}
+
+ for p in cups_printers:
+ printer_name, device_uri = p
+
+ if device_uri.startswith("cups-pdf:/"):
+ continue
+
+ log.debug(log.bold(printer_name))
+ log.debug(log.bold('-'*len(printer_name)))
+
+ try:
+ back_end, is_hp, bus, model, serial, dev_file, host, zc, port = parseDeviceURI(device_uri)
+ except Error:
+ back_end, is_hp, bus, model, serial, dev_file, host, zc, port = '', False, '', '', '', '', '', '', 1
+ if 'HP' in device_uri:
+ is_hp = True
+
+ log.debug("Device URI: %s" % device_uri)
+ ppd_file = os.path.join('/etc/cups/ppd', printer_name + '.ppd')
+ if os.path.exists(ppd_file):
+ log.debug("PPD: %s" % ppd_file)
+
+ fileptr = file(ppd_file, 'r').read(4096)
+ try:
+ desc = NICKNAME_PATTERN.search(fileptr).group(1)
+ except AttributeError:
+ desc = ''
+
+ log.debug("PPD Description: %s" % desc)
+ status, output = utils.run('lpstat -p%s' % printer_name)
+ log.debug("Printer status: %s" % output.replace("\n", ""))
+
+ #### checking for USb devices ####
+ if USB_PATTERN.search(device_uri):
+ Key =USB_PATTERN.search(device_uri).group(1)
+ #### checking for network devices ####
+ elif NET_PATTERN.search(device_uri):
+ Key = NET_PATTERN.search(device_uri).group(1)
+ elif NET_ZC_PATTERN.search(device_uri):
+ Key = NET_ZC_PATTERN.search(device_uri).group(1)
+ elif NET_OTHER_PATTERN.search(device_uri):
+ part_1 = NET_OTHER_PATTERN.search(device_uri).group(1)
+ part_2 = NET_OTHER_PATTERN.search(device_uri).group(2)
+ if 'HP' in part_2:
+ Key = part_2
+ else:
+ log.info("unknown protocol device_uri=%s" %device_uri)
+ Key=None
+ else:
+ log.info("unknown protocol device_uri=%s" %device_uri)
+ Key=None
+
+ if Key is not None:
+ Is_Print_Q_Enabled= True
+ if output.find('Paused') != -1:
+ Is_Print_Q_Enabled= False
+ Key=Key+"_"+back_end
+ log.debug("Key'%s': deviceType '%s' is_hp '%s' bus '%s' model '%s' serial '%s' dev_file '%s' host '%s' zc '%s' port '%s' Enabled'%d'"\
+ %( Key,back_end, is_hp, bus, model, serial, dev_file, host, zc, port,Is_Print_Q_Enabled))
+
+ PPDFileError = False
+ if back_end == 'hpfax' and not 'HP Fax' in desc:
+ log.error("Incorrect PPD file for fax queue '%s'. Fax queue must use 'HP-Fax-hplip.ppd'." % printer_name)
+ PPDFileError = True
+ elif back_end == 'hp' and 'HP Fax' in desc:
+ log.error("Incorrect PPD file for print queue '%s'. Print queue must not use 'HP-Fax-hplip.ppd'." % printer_name)
+ PPDFileError = True
+ elif back_end not in ('hp', 'hpfax'):
+ log.warn("Device %s is not HPLIP installed. Device must use the hp: or hpfax: to function in HPLIP."% printer_name)
+
+ ppd_fileType = None
+ if 'hpcups' in desc:
+ ppd_fileType = HPCUPS
+ if not is_hpcups_installed:
+ PPDFileError = True
+ elif 'hpijs' in desc:
+ ppd_fileType = HPIJS
+ if not is_hpijs_installed:
+ PPDFileError = True
+ elif 'Postscript' in desc:
+ ppd_fileType =HPPS
+ elif is_hp:
+ ppd_fileType =HPOTHER
+ PPDFileError = True
+
+ if ppd_fileType != None:
+ device1 =DetectedDevice(printer_name, device_uri,back_end, ppd_fileType,PPDFileError, Is_Print_Q_Enabled)
+ if Key in mapofDevices:
+ mapofDevices[Key].append(device1)
+ else:
+ deviceList=[device1]
+ mapofDevices[Key]=deviceList
+ else:
+ log.warn("%s is not HP Device." %(printer_name))
+
+ for key,val in mapofDevices.items():
+ if len(val) >1:
+ log.debug("")
+ log.warn('%d queues of same device %s is configured. Remove unwanted queues.' %(len(val),val[0].PrinterName))
+ if Show_result:
+ Error_Found = True
+ dialog = QueuesDiagnose(None, "","",QUEUES_MSG_SENDING)
+ dialog.showMessage("%d queues of same device %s is configured.\nRemove unwanted queues."%(len(val),val[0].PrinterName))
+
+ for que in val:
+ Error_msg =None
+ if 'hp' in que.DeviceType or 'hpfax' in que.DeviceType:
+ if que.PPDFileError == False:
+ log.debug("'%s' is configured correctly." %(que.PrinterName))
+ else:
+ log.error("PPD file for '%s' is not correct. Need to choose correct PPD file." %(que.PrinterName))
+ Error_msg = QUEUES_INCORRECT_PPD
+ else:
+ log.error("'%s' is not configured using HPLIP. Need to remove and re-cofigure from hp-setup." %(que.PrinterName))
+ Error_msg =QUEUES_CONFIG_ERROR
+
+ if Error_msg ==None and que.IsEnabled == False:
+ Error_msg = QUEUES_PAUSED
+
+ if Error_msg != None:
+ Error_Found = True
+ dialog = QueuesDiagnose(None, que.PrinterName,que.DeviceURI,Error_msg)
+ dialog.show()
+ log.debug("Starting GUI loop...")
+ app.exec_()
+ else:
+ Error_msg =None
+ log.debug("")
+ log.debug("Single print queue is configured for '%s'. " %val[0].PrinterName)
+ if 'hp' in val[0].DeviceType or 'hpfax' in val[0].DeviceType:
+ if val[0].PPDFileError == False:
+ log.debug("'%s' is configured correctly." %(val[0].PrinterName))
+ else:
+ log.error("PPD file for '%s' is not correct. Need to choose correct PPD file." %(val[0].PrinterName))
+ Error_msg = QUEUES_INCORRECT_PPD
+ else:
+ log.error("'%s' is not configured using HPLIP. Need to remove and re-configure using hp-setup." %(val[0].PrinterName))
+ Error_msg = QUEUES_CONFIG_ERROR
+
+ if Error_msg ==None and val[0].IsEnabled == False:
+ Error_msg = QUEUES_PAUSED
+
+ if Error_msg != None:
+ Error_Found = True
+ name = val[0].PrinterName
+ dialog = QueuesDiagnose(None, name, val[0].DeviceURI, Error_msg)
+ dialog.show()
+ log.debug("Starting GUI loop...")
+ app.exec_()
+ else:
+ log.debug("No queues found.")
+
+ if Show_result and (Error_Found is False):
+ dialog = QueuesDiagnose(None, "","",QUEUES_MSG_SENDING)
+ dialog.showSuccessMessage("Queue(s) configured correctly using HPLIP.")
+
+
+except KeyboardInterrupt:
+ log.error("User exit")
+
+log.debug("Done.")
diff --git a/doc/commandline.html b/doc/commandline.html
new file mode 100644
index 0000000..6404a5c
--- /dev/null
+++ b/doc/commandline.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head>
+<link rel="stylesheet" type="text/css" href="styles/css.css">
+<link rel="shortcut icon" href="images/favicon.ico" type="image/x-icon">
+<meta content="text/html; charset=ISO-8859-1" http-equiv="content-type">
+<title>HPLIP HELP</title></head>
+<body>
+<div id="container">
+<div id="header">
+
+<hr class="hide">
+<div id="mBody">
+<center><h2 class="showhide_heading" id="mainmenu">HP Linux Imaging and Printing (HPLIP) Help</h2>
+<a href="index.html"><li>Main Menu</li></a></center><br>
+<p>
+</p>
+
+<h3 class="showhide_heading" id="Startup">Using command line tools</h3>
+<br>HPLIP includes many command line tools. &nbsp;Most of these
+features are available from the hp-toolbox. &nbsp;However you can run
+the commands separately or at the command line with many different
+variables and options.<br><p>If you run the command with&nbsp;-h you will get help on using the application.</p><p><span style="font-style: italic;">hp-align</span> - performs the align cartridges function (certain printers only)</p><p><span style="font-style: italic;">hp-check</span> - checks the system for the current status of HPLIP<br></p><span style="font-style: italic;">hp-clean</span> - performs the clean cartridges function. (certain printers only)<br><br style="font-style: italic;"><span style="font-style: italic;">hp-colorcal</span> - perform the color cartridge function. (certain printers only)<br><br><span style="font-style: italic;">hp-fab</span> - opens the fax address book<br><br style="font-style: italic;"><span style="font-style: italic;">hp-firmware</span> - downloads the firmware to the printer (if supported)<br><br style="font-style: italic;"><span style="font-style: italic;">hp-info</span> - display printer information and status<br><br><span style="font-style: italic;">hp-levels</span> - displays the current ink cartridge level<br><br><span style="font-style: italic;">hp-makecopies</span> - starts the make copies application (certain printers only)<br><br><span style="font-style: italic;">hp-makeuri</span> - creates device URI's for use with cups<br><br><span style="font-style: italic;">hp-print</span> - starts the hplip print application<br><br><span style="font-style: italic;">hp-probe</span> - discovers attached usb, parallel, and network printers<br><br style="font-style: italic;"><span style="font-style: italic;">hp-scan</span> - starts the hplip scan utility (interactive only no GUI)<br><br><span style="font-style: italic;">hp-sendfax</span> - starts the send fax application (certain printers only)<br><br><span style="font-style: italic;">hp-setup</span> - used to configure and install a printer or another printer queue<br><br><span style="font-style: italic;">hp-systray</span> - starts the hplip systray tool, this is started automatically when hp-toolbox is run<br><br style="font-style: italic;"><span style="font-style: italic;">hp-testpage</span> - sends a test page to the printer<br><br><span style="font-style: italic;">hp-timedate </span>- sets the time and date on the printer (certain printers only)<br><br><span style="font-style: italic;">hp-toolbox</span> - starts the hp device manager application used to access most of the hplip tools<br><br><span style="font-style: italic;">hp-unload</span> - used to access the printer photo cards, not all printers are supported (certain printers only)<br><br></div>
+
+<div id="footer">
+<p class="copyright"></p><center>
+ <a href="http://welcome.hp.com/country/us/en/privacy.html">Privacy Statement</a> | <a href="http://hplip.sourceforge.net/legal.html">Legal Notices</a> | &#169; 2008 Hewlett-Packard Development Company, L.P. <br></center>
+<p></p>
+</div>
+</div>
+</div></body></html> \ No newline at end of file
diff --git a/doc/copying.html b/doc/copying.html
new file mode 100644
index 0000000..1efdb4a
--- /dev/null
+++ b/doc/copying.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head>
+<link rel="stylesheet" type="text/css" href="styles/css.css">
+<link rel="shortcut icon" href="images/favicon.ico" type="image/x-icon">
+<meta content="text/html; charset=ISO-8859-1" http-equiv="content-type">
+<title>HPLIP HELP</title></head>
+
+<body>
+<div id="container">
+<div id="header">
+
+<hr class="hide">
+<div id="mBody">
+<center><h2 class="showhide_heading" id="mainmenu">HP Linux Imaging and Printing (HPLIP) Help</h2>
+<a href="index.html"><li>Main Menu</li></a></center><br>
+<p>
+</p>
+
+<h3 class="showhide_heading" id="Startup">Copying (hp-makecopies)</h3><br>If
+your device supports making copies you can use the hp-makecopies
+application to make copies. &nbsp;This feature is accessed either by
+running hp-toolbox, click the Actions tab and then click make copies,
+or by running hp-makecopies from the command line. &nbsp;Not all
+printing devices support this feature.<br><br><div style="text-align: center;">
+
+</div></div>
+
+<div id="footer">
+<p class="copyright"></p><center>
+ <a href="http://welcome.hp.com/country/us/en/privacy.html">Privacy Statement</a> | <a href="http://hplip.sourceforge.net/legal.html">Legal Notices</a> | &#169; 2008 Hewlett-Packard Development Company, L.P. <br></center>
+<p></p>
+</div>
+</div>
+</div></body></html> \ No newline at end of file
diff --git a/doc/devicemanager.html b/doc/devicemanager.html
new file mode 100644
index 0000000..4c5937a
--- /dev/null
+++ b/doc/devicemanager.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head>
+<link rel="stylesheet" type="text/css" href="styles/css.css">
+<link rel="shortcut icon" href="images/favicon.ico" type="image/x-icon">
+<meta content="text/html; charset=ISO-8859-1" http-equiv="content-type">
+<title>HPLIP HELP</title></head>
+<body>
+<div id="container">
+<div id="header">
+
+<hr class="hide">
+<div id="mBody">
+<center><h2 class="showhide_heading" id="mainmenu">HP Linux Imaging and Printing (HPLIP) Help</h2>
+<a href="index.html"><li>Main Menu</li></a></center><br>
+<p>
+</p>
+
+<h3 class="showhide_heading" id="Startup">Using HP Device Manager (hp-toolbox)</h3>The
+HP Device Manager provides access to user-adjustable product settings
+and administrative tools such as ink/toner level and other features.<br><br>The
+example screenshots that follow are for a specific HP Photosmart
+product. &nbsp;Obviously, the functions and tools available within the
+Actions Tab, will vary from product to product depending on product
+features and functions available.<br><br>This is the Actions Tab. &nbsp;From here you can select the various functions and tools for your printer.<br><p style="text-align: center;"><img style="width: 591px; height: 401px;" alt="Toolbox Actions" src="images/toolbox_actions.png"></p><br>This is the Actions Tab for the configured Fax Queue.<br><p style="text-align: center;"><img style="width: 591px; height: 401px;" alt="Toolbox Fax" src="images/toolbox_fax.png"></p><br>Here is the Status Tab. From here you can see the status of the printer and any previous print job status.<br><p style="text-align: center;"><img style="width: 591px; height: 401px;" alt="Status" src="images/toolbox_status.png"></p><br>Here
+is the Supplies Tab. &nbsp;From here you can see the current ink or toner level
+of your printer. &nbsp;Not all printer models are supported.<br><p style="text-align: center;"><img style="width: 591px; height: 401px;" alt="Supplies" src="images/toolbox_supplies.png"></p><br><br>This
+is the Print Settings Tab. &nbsp;From here you can control printers
+settings such as quality level, page orientation, media size, etc.<br><p style="text-align: center;"><img style="width: 591px; height: 401px;" alt="Print Settings" src="images/toolbox_print_settings.png"></p><br>Here is the Print Control Tab. From here you can stop the printer, reject jobs, etc.<br><p style="text-align: center;"><img style="width: 591px; height: 401px;" alt="Toolbox Print Control" src="images/toolbox_print_control.png"></p></div>
+
+<div id="footer">
+<p class="copyright"></p><center>
+ <a href="http://welcome.hp.com/country/us/en/privacy.html">Privacy Statement</a> | <a href="http://hplip.sourceforge.net/legal.html">Legal Notices</a> | &#169; 2008 Hewlett-Packard Development Company, L.P. <br></center>
+<p></p>
+</div>
+</div>
+</div></body></html> \ No newline at end of file
diff --git a/doc/faxtrouble.html b/doc/faxtrouble.html
new file mode 100644
index 0000000..d30d3b4
--- /dev/null
+++ b/doc/faxtrouble.html
@@ -0,0 +1,66 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<link rel="stylesheet" type="text/css" href="styles/css.css">
+<link rel="shortcut icon" href="images/favicon.ico" type="image/x-icon" />
+<meta content="text/html; charset=ISO-8859-1" http-equiv="content-type">
+<title>HPLIP HELP</title>
+</head>
+<body>
+<div id="container">
+<div id="header">
+
+<hr class="hide">
+<div id="mBody">
+<center><h2 class="showhide_heading" id="mainmenu">HP Linux Imaging and Printing (HPLIP) Help</h2>
+<a href="index.html"><li>Main Menu</li></a></center><br />
+<p>
+</p>
+
+<h3 class="showhide_heading" id="Startup">Fax troubleshooting</h3>
+<p>When you open Firefox, by default your is displayed. Your home page might be a commonly-visited web site, a search engine, or perhaps your email account, but the choice is up to you. You can change your home page or choose to display a different page or set of pages on startup in this section.
+</p>
+<p><i>When Firefox starts</i><br>
+By default, when Firefox starts it opens your home page (listed in the textbox immediately below), which corresponds to the <i>Show my
+home page</i> option. Alternately, you can choose to display a blank page on startup (perhaps to eliminate the time required to load that page from the Internet) by selecting the <i>Show a blank page</i> option.
+</p>
+<p><i>Home Page</i><br>
+If you've set Firefox to show your home page when you start Firefox, you specify your home page by typing it here. You can also click any of the buttons below the textbox to choose a special home page:
+</p>
+
+<h3 class="showhide_heading" id="Downloads">Downloads</h3>
+<p>This section contains options preferences determining how Firefox downloads files</p>
+<p><i>Show the Downloads window when downloading a file</i><br>
+With this preference selected, Firefox will open the when you start downloading a file.
+</p>
+<p><i>Close it when all downloads are finished</i><br>
+Select this to have Firefox close the Downloads window when all downloads currentlyin progress finish.
+</p>
+<p><i>Save files to</i><br>
+By default downloaded files are automatically saved to the Desktop,eliminating the hassle of specifying a download location for every file you download. You can choose a different folder by clicking the button.
+</p>
+<p><i>Always ask me where to save files</i><br>
+With this optionpreference selected, Firefox will ask you where you would like to save every downloaded file (instead of using the default location specified above).
+</p>
+
+<h3 class="showhide_heading" id="System_Defaults">System Defaults</h3>
+<p><i>Always check to see if Firefox is the default browser
+on startup</i><br>
+Select this option if you want Firefox to check whether it is the default browser at startup. This will ensure Firefox is used whenever an application tries to display a web page. You can also click the Check Nowbutton to do a check right now.
+</p>
+
+<h3 class="showhide_heading" id="Add_ons">Add-ons</h3>
+<p><i>Manage Add-ons</i><br>
+To install or uninstall, update or configure add-ons, click theManage Add-ons button to open the Add-ons manager. This is also accessible from Tools &gt; Add-ons.&nbsp;
+</p>
+
+</div>
+
+<div id="footer">
+<p class="copyright"><center>
+ <a href="http://welcome.hp.com/country/us/en/privacy.html">Privacy Statement</a> | <a href="http://hplip.sourceforge.net/legal.html">Legal Notices</a> | &#169; 2008 Hewlett-Packard Development Company, L.P. <br /></center>
+</p>
+</div>
+</div>
+</body>
+</html> \ No newline at end of file
diff --git a/doc/gettinghelp.html b/doc/gettinghelp.html
new file mode 100644
index 0000000..005fe8b
--- /dev/null
+++ b/doc/gettinghelp.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head>
+<link rel="stylesheet" type="text/css" href="styles/css.css">
+<link rel="shortcut icon" href="images/favicon.ico" type="image/x-icon">
+<meta content="text/html; charset=ISO-8859-1" http-equiv="content-type">
+<title>HPLIP HELP</title></head>
+
+<body>
+<div id="container">
+<div id="header">
+
+<hr class="hide">
+<div id="mBody">
+<center><h2 class="showhide_heading" id="mainmenu">HP Linux Imaging and Printing (HPLIP) Help</h2>
+<a href="index.html"><li>Main Menu</li></a></center><br>
+<p>
+</p>
+
+<h3 class="showhide_heading" id="Startup">Getting help</h3>The HPLIP team provides forum-based support to users on the <a href="https://launchpad.net/" target="_blank">launchpad.net</a> website (site run by <a href="http://canonical.com/" target="_blank">Canonical Ltd</a>).<br><br>To <span style="font-weight: bold;">search for answers</span> among previously asked questions, please use this link:<br><a href="https://answers.launchpad.net/hplip/" target="_blank">https://answers.launchpad.net/hplip/</a>&nbsp;<br><br>To<span style="font-weight: bold;"> ask a question</span>, get help with installation or usage of HPLIP, please use this link (Launchpad.net registration is required):<br><a href="https://answers.launchpad.net/hplip/+addquestion/+login" target="_blank">https://answers.launchpad.net/hplip/+addquestion/+login</a><br><br>To <span style="font-weight: bold;">report a confirmed bug</span> (defect), please use this link (Launchpad.net registration is required):<br><a href="https://bugs.launchpad.net/hplip/+filebug/+login" target="_blank">https://bugs.launchpad.net/hplip/+filebug/+login</a><br><span style="font-style: italic;">Note: Please do not report a bug (defect) if you are unsure whether or not your issue really is a bug. Please use </span><a style="font-style: italic;" href="https://answers.launchpad.net/hplip/+addquestion/+login" target="_blank">ask a question</a><span style="font-style: italic;"> instead.</span><br style="font-style: italic;"><br>HPLIP also maintains a website on <a href="http://sourceforge.net/" target="_blank">sourceforge.net</a> (site run by <a href="http://web.sourceforge.com/" target="_blank">Sourceforge, Inc.</a>) that contains HPLIP <span style="font-weight: bold;">downloads, installation help, and other resources</span>:<br><a href="http://hplip.sourceforge.net/" target="_blank">http://hplip.sourceforge.net/</a><br></div><div id="footer"><center>
+ <a href="http://welcome.hp.com/country/us/en/privacy.html">Privacy Statement</a> | <a href="http://hplip.sourceforge.net/legal.html">Legal Notices</a> | &#169; 2008 Hewlett-Packard Development Company, L.P. <br></center>
+<p></p>
+</div>
+</div>
+</div></body></html> \ No newline at end of file
diff --git a/doc/hpscan.html b/doc/hpscan.html
new file mode 100644
index 0000000..d32f34c
--- /dev/null
+++ b/doc/hpscan.html
@@ -0,0 +1,264 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head>
+<link rel="stylesheet" type="text/css" href="styles/css.css">
+<link rel="shortcut icon" href="images/favicon.ico" type="image/x-icon">
+<meta content="text/html; charset=ISO-8859-1" http-equiv="content-type">
+<title>HPLIP HELP</title></head>
+<body>
+<div id="container">
+<div id="header">
+
+<hr class="hide">
+<div id="mBody">
+<center><h2 class="showhide_heading" id="mainmenu">HP Linux Imaging and Printing (HPLIP) Help</h2>
+<a href="index.html"><li>Main Menu</li></a></center><br>
+<p>
+</p>
+
+<h3 class="showhide_heading" id="Startup">Scanning with HP Device Manager Scan (hp-scan)</h3><br>hp-scan is a new feature with hplip that uses sane for scanning.
+&nbsp;hp-scan is currently only implemented with a command line
+interface. &nbsp;a GUI interface will be added in the future.<br><br>SANE-based scan utility for HPLIP.<br><br>Usage: hp-scan [SANE-DEVICE-URI] [MODE] [-n OPTIONS] [OPTIONS]<br><br>[SANE-DEVICE-URI]<br>&nbsp;
+SANE device
+URI:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+-d&lt;sane_device_uri&gt; or
+--device=&lt;sane_device_uri&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+URI format:
+hpaio:/&lt;bus&gt;/&lt;model&gt;?&lt;identification&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<br><br>[MODE]<br>&nbsp; Enter graphical UI
+mode:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+-u or --gui
+(Default)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<br>&nbsp; Run in non-interactive
+mode:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+-n or
+--non-interactive&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<br><br>[-n OPTIONS] (General) (Not applicable to GUI mode)<br>&nbsp;
+Scan
+destinations:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+-s&lt;dest_list&gt; or
+--dest=&lt;dest_list&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+where &lt;dest_list&gt; is a comma separated list containing one or
+more of:
+'file'*,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+'viewer', 'editor', 'pdf', 'fax', or 'print'. Use only commas between
+values, no
+spaces.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<br>&nbsp; Scan
+mode:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+-m&lt;mode&gt; or --mode=&lt;mode&gt;. Where &lt;mode&gt; is 'color'*,
+'gray' or
+'lineart'.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<br>&nbsp; Scanning
+resolution:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+-r&lt;resolution_in_dpi&gt; or --res=&lt;resolution_in_dpi&gt; or
+--resolution=&lt;resolution_in_dpi&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+where &lt;resolution_in_dpi&gt; is 75, 150, 300, 600, 1200, 2400, 4800
+(300 is
+default).&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<br>&nbsp; Image
+resize:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+--resize=&lt;scale_in_%&gt; (min=1%, max=400%,
+default=100%)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<br>&nbsp; Image
+contrast:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+--contrast=&lt;contrast&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<br>&nbsp; ADF mode
+(EXPERIMENTAL):&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+--adf (Note, only PDF output is supported when using the
+ADF)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<br><br>[-n OPTIONS] (Scan area) (Not applicable to GUI mode)<br>&nbsp;
+Specify the units for
+area/box&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+-t&lt;units&gt; or
+--units=&lt;units&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<br>&nbsp;
+measurements:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+where &lt;units&gt; is 'mm'*, 'cm', 'in', 'px', or 'pt' ('mm' is
+default).&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<br>&nbsp; Scan
+area:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+-a&lt;tlx&gt;,&lt;tly&gt;,&lt;brx&gt;,&lt;bry&gt; or
+--area=&lt;tlx&gt;,&lt;tly&gt;,&lt;brx&gt;,&lt;bry&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+Coordinates are relative to the upper left corner of the scan
+area.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+Units for tlx, tly, brx, and bry are specified by -t/--units (default
+is
+'mm').&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+Use only commas between values, no
+spaces.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<br>&nbsp; Scan
+box:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+--box=&lt;tlx&gt;,&lt;tly&gt;,&lt;width&gt;,&lt;height&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+tlx and tly coordinates are relative to the upper left corner of the
+scan
+area.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+Units for tlx, tly, width, and height are specified by -t/--units
+(default is
+'mm').&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+Use only commas between values, no
+spaces.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<br>&nbsp; Top left x of the scan
+area:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+--tlx=&lt;tlx&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+Coordinates are relative to the upper left corner of the scan
+area.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+Units are specified by -t/--units (default is
+'mm').&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<br>&nbsp; Top left y of the scan
+area:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+--tly=&lt;tly&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+Coordinates are relative to the upper left corner of the scan
+area.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+Units are specified by -t/--units (default is
+'mm').&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<br>&nbsp; Bottom right x of the scan
+area:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+--brx=&lt;brx&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+Coordinates are relative to the upper left corner of the scan
+area.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+Units are specified by -t/--units (default is
+'mm').&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<br>&nbsp; Bottom right y of the scan
+area:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+--bry=&lt;bry&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+Coordinates are relative to the upper left corner of the scan
+area.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+Units are specified by -t/--units (default is
+'mm').&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<br>&nbsp; Specify the scan area based on a
+paper&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --size=&lt;paper size
+name&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<br>&nbsp;
+size:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+where &lt;paper size name&gt; is one of: 5x7, photo, a2_env, b4, b5,
+3x5, 4x6, higaki, flsa, c6_env, legal,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+no_10_env, exec, a3, a5, a4, letter, a6, super_b, oufufu-hagaki,
+dl_env, japan_env_4, japan_env_3&nbsp;&nbsp;&nbsp; <br><br>[-n OPTIONS] ('file' dest) (Not applicable to GUI mode)<br>&nbsp;
+Filename for 'file'
+destination:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+-o&lt;file&gt; or -f&lt;file&gt; or --file=&lt;file&gt; or
+--output=&lt;file&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<br><br>[-n OPTIONS] ('pdf' dest) (Not applicable to GUI mode)<br>&nbsp;
+PDF viewer
+application:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+--pdf=&lt;pdf_viewer&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<br><br>[-n OPTIONS] ('viewer' dest) (Not applicable to GUI mode)<br>&nbsp;
+Image viewer
+application:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+-v&lt;viewer&gt; or
+--viewer=&lt;viewer&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<br><br>[-n OPTIONS] ('editor' dest) (Not applicable to GUI mode)<br>&nbsp;
+Image editor
+application:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+-e&lt;editor&gt; or
+--editor=&lt;editor&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<br><br>[-n OPTIONS] ('email' dest) (Not applicable to GUI mode)<br>&nbsp;
+From: address for 'email'
+dest:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+--email-from=&lt;email_from_address&gt; (required for 'email'
+dest.)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<br>&nbsp; To: address for 'email'
+dest:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+--email-to=&lt;email__to_address&gt; (required for 'email'
+dest.)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<br>&nbsp; Email subject for 'email'
+dest:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+--email-subject="&lt;subject&gt;"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+Use double quotes (") around the subject if it contains space
+characters.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<br>&nbsp; Note or message for the 'email'
+dest:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --email-msg="&lt;msg&gt;" or
+--email-note="&lt;note&gt;"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+Use double quotes (") around the note/message if it contains space
+characters.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<br><br>[-n OPTIONS] ('fax' dest) (Not applicable to GUI mode)<br>&nbsp;
+Fax
+queue/printer:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+--fax=&lt;fax_printer_name&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<br><br>[-n OPTIONS] ('printer' dest) (Not applicable to GUI mode)<br>&nbsp;
+Printer
+queue/printer:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+--printer=&lt;printer_name&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<br><br>[-n OPTIONS] (advanced) (Not applicable to GUI mode)<br>&nbsp;
+Set the scanner compression
+mode:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+-x&lt;mode&gt; or --compression=&lt;mode&gt;, &lt;mode&gt;='raw',
+'none' or 'jpeg' ('jpeg' is default) ('raw'
+and&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+'none' are
+equivalent)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<br><br>[OPTIONS]<br>&nbsp; Set the logging
+level:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+-l&lt;level&gt; or
+--logging=&lt;level&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+&lt;level&gt;: none, info*, error, warn, debug
+(*default)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<br>&nbsp; Run in debug
+mode:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+-g (same as option:
+-ldebug)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<br>&nbsp; This help
+information:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+-h or
+--help&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<br><br>Notes:<br>1. If no dest is provided, the 'file' dest will be automatically invoked.<br>2. If applications for viewer, editor, or pdf viewer are not provided, reasonable defaults will be used.<br>3. If --printer is not specified, the CUPS default will be used if available.<br>4. If an output file is not specified with the 'file' dest, a reasonable default will be used.<br>5. Some options may not be valid on some scanning devices.<br>6.
+The following features are not yet implemented: GUI mode, batch
+scanning, film/negative scanning, contrast adjustment, brightness
+adjustment, autocrop, resize to axb, resize to xKB, <br><br>Examples:<br>&nbsp;
+Quickly (low-res) scan entire page
+in&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $ hp-scan -n
+-r75&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<br>&nbsp; color to
+file:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<br>&nbsp; Scan upper left 1in corner and send
+as&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $ hp-scan -n --box=0,0,1,1 -tin
+-semail --email-from=foo@bar.org
+--email-to=bar@foo.org&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<br>&nbsp;
+email:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+--email-note="Test scan" --email-subject="Test scan
+email"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<br>&nbsp; Scan entire page in 300dpi grayscale and&nbsp;&nbsp;&nbsp;
+$
+hp-scan -n -seditor
+-mgray&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<br>&nbsp; then
+edit:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<br>&nbsp; Launch the hp-scan
+GUI:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+$
+hp-scan&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<br>&nbsp; Scan into The
+GIMP:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+$ hp-scan -n --editor=gimp&nbsp;&nbsp; <span style="font-weight: bold;"><br><br></span></div>
+
+<div id="footer">
+<p class="copyright"></p><center>
+ <a href="http://welcome.hp.com/country/us/en/privacy.html">Privacy Statement</a> | <a href="http://hplip.sourceforge.net/legal.html">Legal Notices</a> | &#169; 2008 Hewlett-Packard Development Company, L.P. <br></center>
+<p></p>
+</div>
+</div>
+</div></body></html> \ No newline at end of file
diff --git a/doc/images/favicon.ico b/doc/images/favicon.ico
new file mode 100644
index 0000000..74d5e05
--- /dev/null
+++ b/doc/images/favicon.ico
Binary files differ
diff --git a/doc/images/print.png b/doc/images/print.png
new file mode 100644
index 0000000..0d54b40
--- /dev/null
+++ b/doc/images/print.png
Binary files differ
diff --git a/doc/images/toolbox_actions.png b/doc/images/toolbox_actions.png
new file mode 100644
index 0000000..8563ab1
--- /dev/null
+++ b/doc/images/toolbox_actions.png
Binary files differ
diff --git a/doc/images/toolbox_fax.png b/doc/images/toolbox_fax.png
new file mode 100644
index 0000000..dbde2a1
--- /dev/null
+++ b/doc/images/toolbox_fax.png
Binary files differ
diff --git a/doc/images/toolbox_print_control.png b/doc/images/toolbox_print_control.png
new file mode 100644
index 0000000..fa37599
--- /dev/null
+++ b/doc/images/toolbox_print_control.png
Binary files differ
diff --git a/doc/images/toolbox_print_settings.png b/doc/images/toolbox_print_settings.png
new file mode 100644
index 0000000..6913358
--- /dev/null
+++ b/doc/images/toolbox_print_settings.png
Binary files differ
diff --git a/doc/images/toolbox_status.png b/doc/images/toolbox_status.png
new file mode 100644
index 0000000..50a222e
--- /dev/null
+++ b/doc/images/toolbox_status.png
Binary files differ
diff --git a/doc/images/toolbox_supplies.png b/doc/images/toolbox_supplies.png
new file mode 100644
index 0000000..e3492d2
--- /dev/null
+++ b/doc/images/toolbox_supplies.png
Binary files differ
diff --git a/doc/images/xsane.png b/doc/images/xsane.png
new file mode 100644
index 0000000..e18378d
--- /dev/null
+++ b/doc/images/xsane.png
Binary files differ
diff --git a/doc/index.html b/doc/index.html
new file mode 100644
index 0000000..8c7ec03
--- /dev/null
+++ b/doc/index.html
@@ -0,0 +1,46 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head>
+<link rel="stylesheet" type="text/css" href="styles/css.css">
+<link rel="shortcut icon" href="images/favicon.ico" type="image/x-icon">
+<meta content="text/html; charset=ISO-8859-1" http-equiv="content-type">
+<title>HPLIP HELP</title></head>
+
+<body>
+<div id="container">
+<div id="header">
+<div>
+</div>
+<hr class="hide">
+<div id="mBody">
+<center><h2 class="showhide_heading" id="mainmenu">HP Linux Imaging and Printing (HPLIP) Help</h2></center>
+<br>
+<ul>
+<a href="setup.html"><li>Setting up a new printer with HP Device Manager Setup Wizard (hp-setup)</li></a><br><br>
+<a href="troubleshooting.html"><li>Troubleshooting setup, functional problems (print, scan, fax) and I/O Problems</li></a><br><br>
+<a href="devicemanager.html"><li>Using&nbsp;HP Device Manager (hp-toolbox)</li></a><br><br>
+<a href="printing.html"><li>Printing</li></a><br><br>
+<a href="print.html"><li>Printing with HP Device Manager Print (hp-print)</li></a><br><br>
+<a href="printoptions.html"><li>Setting printing options (hp-toolbox)</li></a><br><br>
+<a href="printtroubleshooting.html"></a>
+<a href="scanning.html"><li>Scanning (xsane)</li></a><br><br>
+<a href="hpscan.html"><li>Scanning with HP Device Manager Scan (hp-scan)</li></a><br><br>
+<a href="scantrouble.html"></a>
+<a href="sendfax.html"><li>PC Send Fax (hp-sendfax)</li></a><br><br>
+<a href="faxtrouble.html"></a>
+<a href="copying.html"><li>Copying (hp-makecopies)</li></a><br><br>
+<a href="mainttask.html"><li>Maintenance tasks (hp-toolbox)</li></a><br><br>
+<a href="commandline.html"><li>Using command line tools</li></a><br><br>
+<a href="plugins.html"><li>About plugins</li></a><br><br>
+<a href="systray.html"><li>About HP Status Service "system tray" icon (hp-systray)</li></a><br><br>
+<a href="uninstalling.html"><li>Uninstalling HPLIP</li></a><br><br>
+<a href="upgrading.html"><li>Upgrading HPLIP</li></a><br><br>
+<a href="gettinghelp.html"><li>Getting help</li></a><br><br>
+<a href="http://www.hplip.net"><li>HPLIP Website</li></a><br></ul><hr class="hide">
+</div>
+<div id="footer">
+<p class="copyright"></p><center>
+ <a href="http://welcome.hp.com/country/us/en/privacy.html">Privacy Statement</a> | <a href="http://hplip.sourceforge.net/legal.html">Legal Notices</a> | &#169; 2008 Hewlett-Packard Development Company, L.P. <br></center>
+<p></p>
+</div>
+</div>
+</div></body></html> \ No newline at end of file
diff --git a/doc/mainttask.html b/doc/mainttask.html
new file mode 100644
index 0000000..d808850
--- /dev/null
+++ b/doc/mainttask.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head>
+<link rel="stylesheet" type="text/css" href="styles/css.css">
+<link rel="shortcut icon" href="images/favicon.ico" type="image/x-icon">
+<meta content="text/html; charset=ISO-8859-1" http-equiv="content-type">
+<title>HPLIP HELP</title></head>
+
+<body>
+<div id="container">
+<div id="header">
+
+<hr class="hide">
+<div id="mBody">
+<center><h2 class="showhide_heading" id="mainmenu">HP Linux Imaging and Printing (HPLIP) Help</h2>
+<a href="index.html"><li>Main Menu</li></a></center><br>
+<p>
+</p>
+
+<h3 class="showhide_heading" id="Startup">Maintenance tasks (hp-toolbox)</h3><br>To
+perform printer maintenance run hp-toolbox then click the Actions tab.
+From here you can perform the various maintenance functions including;
+Align Cartridges, Clean Cartridges, Color Calibration.<br><br>Not all printers support all functions.<br><br><div style="text-align: center;"><span style="font-weight: bold;"><img style="width: 591px; height: 401px;" alt="Toolbox Actions" src="images/toolbox_actions.png"></span><br><span style="font-weight: bold;"></span></div><span style="font-weight: bold;"><br></span></div>
+
+<div id="footer">
+<p class="copyright"></p><center>
+ <a href="http://welcome.hp.com/country/us/en/privacy.html">Privacy Statement</a> | <a href="http://hplip.sourceforge.net/legal.html">Legal Notices</a> | &#169; 2008 Hewlett-Packard Development Company, L.P. <br></center>
+<p></p>
+</div>
+</div>
+</div></body></html> \ No newline at end of file
diff --git a/doc/plugins.html b/doc/plugins.html
new file mode 100644
index 0000000..ea315b9
--- /dev/null
+++ b/doc/plugins.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head>
+<link rel="stylesheet" type="text/css" href="styles/css.css">
+<link rel="shortcut icon" href="images/favicon.ico" type="image/x-icon">
+<meta content="text/html; charset=ISO-8859-1" http-equiv="content-type">
+<title>HPLIP HELP</title></head>
+
+<body>
+<div id="container">
+<div id="header">
+
+<hr class="hide">
+<div id="mBody">
+<center><h2 class="showhide_heading" id="mainmenu">HP Linux Imaging and Printing (HPLIP) Help</h2>
+<a href="index.html"><li>Main Menu</li></a></center><br>
+<p>
+</p>
+
+<h3 class="showhide_heading" id="Startup">About plugins</h3><br>This to be added at a future date.<br><br></div>
+
+<div id="footer">
+<p class="copyright"></p><center>
+ <a href="http://welcome.hp.com/country/us/en/privacy.html">Privacy Statement</a> | <a href="http://hplip.sourceforge.net/legal.html">Legal Notices</a> | &#169; 2008 Hewlett-Packard Development Company, L.P. <br></center>
+<p></p>
+</div>
+</div>
+</div></body></html> \ No newline at end of file
diff --git a/doc/print.html b/doc/print.html
new file mode 100644
index 0000000..85f619f
--- /dev/null
+++ b/doc/print.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head>
+<link rel="stylesheet" type="text/css" href="styles/css.css">
+<link rel="shortcut icon" href="images/favicon.ico" type="image/x-icon">
+<meta content="text/html; charset=ISO-8859-1" http-equiv="content-type">
+<title>HPLIP HELP</title></head>
+<body>
+<div id="container">
+<div id="header">
+
+<hr class="hide">
+<div id="mBody">
+<center><h2 class="showhide_heading" id="mainmenu">HP Linux Imaging and Printing (HPLIP) Help</h2>
+<a href="index.html"><li>Main Menu</li></a></center><br>
+<p>
+</p>
+
+<h3 class="showhide_heading" id="Startup">Printing with HP Device Manager Print (hp-print)</h3>
+<p>To print using HPLIP you can click the "Actions" Tab in hp-toolbox
+or run hp-print. &nbsp;Then the hp-print utility will run and will
+appear as shown below:</p><div style="text-align: center;"><span style="font-style: italic;"><img style="width: 458px; height: 382px;" alt="Print" src="images/print.png"></span><br><span style="font-style: italic;"></span></div><span style="font-style: italic;"><br></span>From
+the Device Manager - Print Screen, you can see the file types that are
+supported as well as selecting which files to print, number of copies
+and so forth.<br><span style="font-style: italic;"><br></span></div>
+
+<div id="footer">
+<p class="copyright"></p><center>
+ <a href="http://welcome.hp.com/country/us/en/privacy.html">Privacy Statement</a> | <a href="http://hplip.sourceforge.net/legal.html">Legal Notices</a> | &#169; 2008 Hewlett-Packard Development Company, L.P. <br></center>
+<p></p>
+</div>
+</div>
+</div></body></html> \ No newline at end of file
diff --git a/doc/printing.html b/doc/printing.html
new file mode 100644
index 0000000..2216cc3
--- /dev/null
+++ b/doc/printing.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head>
+<link rel="stylesheet" type="text/css" href="styles/css.css">
+<link rel="shortcut icon" href="images/favicon.ico" type="image/x-icon">
+<meta content="text/html; charset=ISO-8859-1" http-equiv="content-type">
+<title>HPLIP HELP</title></head>
+<body>
+<div id="container">
+<div id="header">
+
+<hr class="hide">
+<div id="mBody">
+<center><h2 class="showhide_heading" id="mainmenu">HP Linux Imaging and Printing (HPLIP) Help</h2>
+<a href="index.html"><li>Main Menu</li></a></center><br>
+<p>
+</p>
+
+<h3 class="showhide_heading" id="Startup">Printing</h3>Once HPLIP is
+installed you can print either using hp-print, hp-toolbox or via the application of your choice through it's printing menu(s).
+
+</div>
+
+<div id="footer">
+<p class="copyright"></p><center>
+ <a href="http://welcome.hp.com/country/us/en/privacy.html">Privacy Statement</a> | <a href="http://hplip.sourceforge.net/legal.html">Legal Notices</a> | &#169; 2008 Hewlett-Packard Development Company, L.P. <br></center>
+<p></p>
+</div>
+</div>
+</div></body></html> \ No newline at end of file
diff --git a/doc/printoptions.html b/doc/printoptions.html
new file mode 100644
index 0000000..a214157
--- /dev/null
+++ b/doc/printoptions.html
@@ -0,0 +1,40 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head>
+<link rel="stylesheet" type="text/css" href="styles/css.css">
+<link rel="shortcut icon" href="images/favicon.ico" type="image/x-icon">
+<meta content="text/html; charset=ISO-8859-1" http-equiv="content-type">
+<title>HPLIP HELP</title></head>
+<body>
+<div id="container">
+<div id="header">
+
+<hr class="hide">
+<div id="mBody">
+<center><h2 class="showhide_heading" id="mainmenu">HP Linux Imaging and Printing (HPLIP) Help</h2>
+<a href="index.html"><li>Main Menu</li></a></center><br>
+<p>
+</p>
+
+<h3 class="showhide_heading" id="Startup">Setting printing options</h3>
+<p>To change the printer's print settings run, hp-toolbox and then click
+on "Print Settings". &nbsp;From here you can modify many different
+print settings including; print quality, output order, media size,
+media source, duplex printing, and more.
+</p><div style="text-align: center;"><span style="font-style: italic;"><img style="width: 591px; height: 401px;" alt="Print Settings" src="images/toolbox_print_settings.png"></span><br></div><span style="font-weight: bold;"><br>Note: &nbsp;</span>It's
+recommended that if you plan on printing photos on 3x5 photo paper (for
+example) to create a second printer queue "photo tray" using hp-setup
+and name the
+queue photo tray and then configure the queue to print with the
+settings you require. Then you don't need to change the settings
+frequently and already have a print queue setup for your task.
+&nbsp;Setting up customized print queue's in this fashion is an
+effective way to manage printing of special media and other unique
+print settings.<br></div>
+
+<div id="footer">
+<p class="copyright"></p><center>
+ <a href="http://welcome.hp.com/country/us/en/privacy.html">Privacy Statement</a> | <a href="http://hplip.sourceforge.net/legal.html">Legal Notices</a> | &#169; 2008 Hewlett-Packard Development Company, L.P. <br></center>
+<p></p>
+</div>
+</div>
+</div></body></html> \ No newline at end of file
diff --git a/doc/printtroubleshooting.html b/doc/printtroubleshooting.html
new file mode 100644
index 0000000..db28aed
--- /dev/null
+++ b/doc/printtroubleshooting.html
@@ -0,0 +1,66 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<link rel="stylesheet" type="text/css" href="styles/css.css">
+<link rel="shortcut icon" href="images/favicon.ico" type="image/x-icon" />
+<meta content="text/html; charset=ISO-8859-1" http-equiv="content-type">
+<title>HPLIP HELP</title>
+</head>
+<body>
+<div id="container">
+<div id="header">
+
+<hr class="hide">
+<div id="mBody">
+<center><h2 class="showhide_heading" id="mainmenu">HP Linux Imaging and Printing (HPLIP) Help</h2>
+<a href="index.html"><li>Main Menu</li></a></center><br />
+<p>
+</p>
+
+<h3 class="showhide_heading" id="Startup">Print troubleshooting</h3>
+<p>When you open Firefox, by default your is displayed. Your home page might be a commonly-visited web site, a search engine, or perhaps your email account, but the choice is up to you. You can change your home page or choose to display a different page or set of pages on startup in this section.
+</p>
+<p><i>When Firefox starts</i><br>
+By default, when Firefox starts it opens your home page (listed in the textbox immediately below), which corresponds to the <i>Show my
+home page</i> option. Alternately, you can choose to display a blank page on startup (perhaps to eliminate the time required to load that page from the Internet) by selecting the <i>Show a blank page</i> option.
+</p>
+<p><i>Home Page</i><br>
+If you've set Firefox to show your home page when you start Firefox, you specify your home page by typing it here. You can also click any of the buttons below the textbox to choose a special home page:
+</p>
+
+<h3 class="showhide_heading" id="Downloads">Downloads</h3>
+<p>This section contains options preferences determining how Firefox downloads files</p>
+<p><i>Show the Downloads window when downloading a file</i><br>
+With this preference selected, Firefox will open the when you start downloading a file.
+</p>
+<p><i>Close it when all downloads are finished</i><br>
+Select this to have Firefox close the Downloads window when all downloads currentlyin progress finish.
+</p>
+<p><i>Save files to</i><br>
+By default downloaded files are automatically saved to the Desktop,eliminating the hassle of specifying a download location for every file you download. You can choose a different folder by clicking the button.
+</p>
+<p><i>Always ask me where to save files</i><br>
+With this optionpreference selected, Firefox will ask you where you would like to save every downloaded file (instead of using the default location specified above).
+</p>
+
+<h3 class="showhide_heading" id="System_Defaults">System Defaults</h3>
+<p><i>Always check to see if Firefox is the default browser
+on startup</i><br>
+Select this option if you want Firefox to check whether it is the default browser at startup. This will ensure Firefox is used whenever an application tries to display a web page. You can also click the Check Nowbutton to do a check right now.
+</p>
+
+<h3 class="showhide_heading" id="Add_ons">Add-ons</h3>
+<p><i>Manage Add-ons</i><br>
+To install or uninstall, update or configure add-ons, click theManage Add-ons button to open the Add-ons manager. This is also accessible from Tools &gt; Add-ons.&nbsp;
+</p>
+
+</div>
+
+<div id="footer">
+<p class="copyright"><center>
+ <a href="http://welcome.hp.com/country/us/en/privacy.html">Privacy Statement</a> | <a href="http://hplip.sourceforge.net/legal.html">Legal Notices</a> | &#169; 2008 Hewlett-Packard Development Company, L.P. <br /></center>
+</p>
+</div>
+</div>
+</body>
+</html> \ No newline at end of file
diff --git a/doc/scanning.html b/doc/scanning.html
new file mode 100644
index 0000000..e4ccf3b
--- /dev/null
+++ b/doc/scanning.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head>
+<link rel="stylesheet" type="text/css" href="styles/css.css">
+<link rel="shortcut icon" href="images/favicon.ico" type="image/x-icon">
+<meta content="text/html; charset=ISO-8859-1" http-equiv="content-type">
+<title>HPLIP HELP</title></head>
+
+<body>
+<div id="container">
+<div id="header">
+
+<hr class="hide">
+<div id="mBody">
+<center><h2 class="showhide_heading" id="mainmenu">HP Linux Imaging and Printing (HPLIP) Help</h2>
+<a href="index.html"><li>Main Menu</li></a></center><br>
+<p>
+</p>
+
+<h3 class="showhide_heading" id="Startup">Scanning</h3>Scan is provided by the use of the xsane (sane) application.<p style="text-align: center;"><i><img style="width: 486px; height: 480px;" alt="xsane" src="images/xsane.png"></i></p></div>
+
+<div id="footer">
+<p class="copyright"></p><center>
+ <a href="http://welcome.hp.com/country/us/en/privacy.html">Privacy Statement</a> | <a href="http://hplip.sourceforge.net/legal.html">Legal Notices</a> | &#169; 2008 Hewlett-Packard Development Company, L.P. <br></center>
+<p></p>
+</div>
+</div>
+</div></body></html> \ No newline at end of file
diff --git a/doc/scantrouble.html b/doc/scantrouble.html
new file mode 100644
index 0000000..72614f8
--- /dev/null
+++ b/doc/scantrouble.html
@@ -0,0 +1,66 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<link rel="stylesheet" type="text/css" href="styles/css.css">
+<link rel="shortcut icon" href="images/favicon.ico" type="image/x-icon" />
+<meta content="text/html; charset=ISO-8859-1" http-equiv="content-type">
+<title>HPLIP HELP</title>
+</head>
+<body>
+<div id="container">
+<div id="header">
+
+<hr class="hide">
+<div id="mBody">
+<center><h2 class="showhide_heading" id="mainmenu">HP Linux Imaging and Printing (HPLIP) Help</h2>
+<a href="index.html"><li>Main Menu</li></a></center><br />
+<p>
+</p>
+
+<h3 class="showhide_heading" id="Startup">Scan troubleshooting</h3>
+<p>When you open Firefox, by default your is displayed. Your home page might be a commonly-visited web site, a search engine, or perhaps your email account, but the choice is up to you. You can change your home page or choose to display a different page or set of pages on startup in this section.
+</p>
+<p><i>When Firefox starts</i><br>
+By default, when Firefox starts it opens your home page (listed in the textbox immediately below), which corresponds to the <i>Show my
+home page</i> option. Alternately, you can choose to display a blank page on startup (perhaps to eliminate the time required to load that page from the Internet) by selecting the <i>Show a blank page</i> option.
+</p>
+<p><i>Home Page</i><br>
+If you've set Firefox to show your home page when you start Firefox, you specify your home page by typing it here. You can also click any of the buttons below the textbox to choose a special home page:
+</p>
+
+<h3 class="showhide_heading" id="Downloads">Downloads</h3>
+<p>This section contains options preferences determining how Firefox downloads files</p>
+<p><i>Show the Downloads window when downloading a file</i><br>
+With this preference selected, Firefox will open the when you start downloading a file.
+</p>
+<p><i>Close it when all downloads are finished</i><br>
+Select this to have Firefox close the Downloads window when all downloads currentlyin progress finish.
+</p>
+<p><i>Save files to</i><br>
+By default downloaded files are automatically saved to the Desktop,eliminating the hassle of specifying a download location for every file you download. You can choose a different folder by clicking the button.
+</p>
+<p><i>Always ask me where to save files</i><br>
+With this optionpreference selected, Firefox will ask you where you would like to save every downloaded file (instead of using the default location specified above).
+</p>
+
+<h3 class="showhide_heading" id="System_Defaults">System Defaults</h3>
+<p><i>Always check to see if Firefox is the default browser
+on startup</i><br>
+Select this option if you want Firefox to check whether it is the default browser at startup. This will ensure Firefox is used whenever an application tries to display a web page. You can also click the Check Nowbutton to do a check right now.
+</p>
+
+<h3 class="showhide_heading" id="Add_ons">Add-ons</h3>
+<p><i>Manage Add-ons</i><br>
+To install or uninstall, update or configure add-ons, click theManage Add-ons button to open the Add-ons manager. This is also accessible from Tools &gt; Add-ons.&nbsp;
+</p>
+
+</div>
+
+<div id="footer">
+<p class="copyright"><center>
+ <a href="http://welcome.hp.com/country/us/en/privacy.html">Privacy Statement</a> | <a href="http://hplip.sourceforge.net/legal.html">Legal Notices</a> | &#169; 2008 Hewlett-Packard Development Company, L.P. <br /></center>
+</p>
+</div>
+</div>
+</body>
+</html> \ No newline at end of file
diff --git a/doc/sendfax.html b/doc/sendfax.html
new file mode 100644
index 0000000..db84808
--- /dev/null
+++ b/doc/sendfax.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head>
+<link rel="stylesheet" type="text/css" href="styles/css.css">
+<link rel="shortcut icon" href="images/favicon.ico" type="image/x-icon">
+<meta content="text/html; charset=ISO-8859-1" http-equiv="content-type">
+<title>HPLIP HELP</title></head>
+<body>
+<div id="container">
+<div id="header">
+
+<hr class="hide">
+<div id="mBody">
+<center><h2 class="showhide_heading" id="mainmenu">HP Linux Imaging and Printing (HPLIP) Help</h2>
+<a href="index.html"><li>Main Menu</li></a></center><br>
+<p>
+</p>
+
+<h3 class="showhide_heading" id="Startup">PC Send Fax (hp-sendfax)</h3><br>hp-sendfax
+is used to access the fax features of your supported device. &nbsp;To
+access hp-sendfax you can either run hp-toolbox, click the fax queue
+and then click send fax or run hp-sendfax from the command line.<br><br>Using hp-sendfax is rather straight forward. &nbsp;Add the file, add the phone number to "fax to", and then click send fax now.<br><br><div style="text-align: center;"><span style="font-weight: bold;"></span><br></div></div>
+
+<div id="footer">
+<p class="copyright"></p><center>
+ <a href="http://welcome.hp.com/country/us/en/privacy.html">Privacy Statement</a> | <a href="http://hplip.sourceforge.net/legal.html">Legal Notices</a> | &#169; 2008 Hewlett-Packard Development Company, L.P. <br></center>
+<p></p>
+</div>
+</div>
+</div></body></html> \ No newline at end of file
diff --git a/doc/setup.html b/doc/setup.html
new file mode 100644
index 0000000..a392dec
--- /dev/null
+++ b/doc/setup.html
@@ -0,0 +1,52 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head>
+<link rel="stylesheet" type="text/css" href="styles/css.css">
+<link rel="shortcut icon" href="images/favicon.ico" type="image/x-icon">
+<meta content="text/html; charset=ISO-8859-1" http-equiv="content-type">
+<title>HPLIP HELP</title></head>
+<body>
+<div id="container">
+<div id="header">
+
+<hr class="hide">
+<div id="mBody">
+<center><h2 class="showhide_heading" id="mainmenu">HP Linux Imaging and Printing (HPLIP) Help</h2>
+<a href="index.html"><li>Main Menu</li></a></center><br>
+<p>
+</p>
+
+<h3 class="showhide_heading">Setting up a new printer with HP Device Manager Setup Wizard (hp-setup)</h3>
+<p>
+Configuring your printer can be done several ways.</p><span style="font-weight: bold;">Configure using hp-toolbox</span><p><port><port><printer><printer><fax><fax><typelist><typelist><typelist><bus><bus><lang><lang><level><level><level></level></level></level></lang></lang></bus></bus></typelist></typelist></typelist></fax></fax></printer></printer></port></port>1. Open a terminal (command line) window.</p><p>2. Run:</p><p>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="font-style: italic;">hp-toolbox</span></p>3.
+&nbsp;If no printer has been configured, the "No Installed HP Devices
+Found" dialog will appear. &nbsp;Click "Setup Device..."<br><br>4.
+&nbsp;"Choose connection type" will be displayed. &nbsp;Here select the
+way you want to connect to the printer: &nbsp;USB, Network, or Parallel<br><br>5.
+&nbsp;Next, the dialog "Select from Discovered Devices" will display the
+detected printers. &nbsp;If you are configuring a network printer you may
+need to select "Find Manually..". &nbsp;<br><br>Note: &nbsp;If your
+printer is not displayed, verify that the printer is connected, powered
+on and not in an error state (i.e. low ink, out of paper, etc)<br><br>6.
+&nbsp;The "Select/Confirm PPD file" dialog is now presented. &nbsp;The file needs to match the model/class of your printer.<br><br>7. &nbsp;"Enter Printer Information' -- Here you can enter the Printer name, location and other information.<br><br>8.
+&nbsp;Finally, the "Finished Adding Printer" dialog is displayed.
+&nbsp;Verify the printer information and click "Finish" to complete the
+configuration of your printer.<br> <br><span style="font-weight: bold;">Configure using hp-setup<br><br></span>1. Open a terminal (command line) window.<p>2. Run:</p><p>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="font-style: italic;">hp-setup</span></p>3.
+&nbsp;The "Choose connection type" dialog will be displayed. &nbsp;Here, select the way you
+want to connect to the printer: &nbsp;USB, Network, or Parallel<br><br>4.
+&nbsp;Next, the dialog "Select from Discovered Devices" will display the
+detected printers. &nbsp;If you are configuring a network printer you may need
+to select "Find Manually..". &nbsp;<br><br style="font-weight: bold;"><span style="font-weight: bold;">Note:</span> &nbsp;If your printer is not
+displayed verify that the printer is connected, powered on and not in
+an error state (i.e. low ink, out of paper, etc)<br><br>5.
+&nbsp;The "Select/Confirm PPD file" dialog is now presented. &nbsp;The file needs to match the model/class of your printer.<br><br>6. &nbsp;"Enter Printer Information' -- Here you can enter the Printer name, location and other information.<br><br>7.
+&nbsp;Finally the "Finished Adding Printer" dialog is displayed. &nbsp;Verify the
+printer information and click "Finish" to complete the configuration of
+your printer.</div>
+
+<div id="footer">
+<p class="copyright"></p><center>
+ <a href="http://welcome.hp.com/country/us/en/privacy.html">Privacy Statement</a> | <a href="http://hplip.sourceforge.net/legal.html">Legal Notices</a> | &#169; 2008 Hewlett-Packard Development Company, L.P. <br></center>
+<p></p>
+</div>
+</div>
+</div></body></html> \ No newline at end of file
diff --git a/doc/styles/css.css b/doc/styles/css.css
new file mode 100644
index 0000000..f7b2171
--- /dev/null
+++ b/doc/styles/css.css
@@ -0,0 +1,130 @@
+ body {
+ min-width: 610px;
+ margin: 20px;
+ }
+
+ #container {
+ max-width: 70em;
+ margin: 0 auto;
+ }
+
+ #mBody {
+ clear: both;
+ padding: 0 0 1em 0;
+ }
+
+ #side {
+ float: left;
+ width: 23%;
+ margin-bottom: 1em;
+ }
+
+ #mainContent {
+ float: right;
+ width: 75%;
+ margin-bottom: 1em;
+ }
+ .nomenu #mainContent {
+ float: none;
+ width: 100%;
+ }
+ .bodyleft {
+ float: right !important;
+ width: 75% !important;
+ }
+ #mainContent.right {
+ float: left;
+ width: 62%;
+ }
+
+ #side.right {
+ float: right;
+ width: 35%;
+ }
+
+
+ #header { margin-bottom: 1em; }
+ #header ul {
+ margin: 0 0 1em 0;
+ padding: 0;
+ }
+
+ #header li {
+ display: inline;
+ padding: 0 20px 0 0;
+ margin: 0;
+ white-space: nowrap;
+ }
+
+ #footer {
+ clear: both;
+ margin-top: 1em;
+ }
+
+ #footer ul {
+ margin: 0 0 1em 0;
+ padding: 0;
+ }
+
+ #footer li {
+ display: inline;
+ padding: 0 20px 0 0;
+ margin: 0;
+ white-space: nowrap;
+ }
+
+ #footer p {
+ margin: 0.6em 0;
+ }
+
+ hr.hide {
+ display: none;
+ }
+
+ body {
+ background: #fff;
+ color: #000;
+ }
+
+
+ hr {
+ height: 1px;
+ background-color: #000;
+ color: #000;
+ margin: 2em 0;
+ }
+
+
+ body, td, th, input {
+ font-family: verdana, sans-serif;
+ font-size: x-small;
+ voice-family: "\"}\"";
+ voice-family: inherit;
+ font-size: small;
+ }
+
+ h1, h2, h3, h4, h5, h6 {
+ margin: 1em 0 0.2em 0;
+ border-bottom: 1px solid #ccc;
+ font-family: arial, verdana, sans-serif;
+ }
+ li h1, li h2, li h3, li h4, li h5, li h6 {
+ border: none;
+ }
+
+ #header h1 { border: 0; }
+
+ h1 { font-size: 160%; font-weight: normal; }
+ h2 { font-size: 150%; font-weight: normal; }
+ h3 { font-size: 120%; }
+ h4 { font-size: 100%; }
+ h5 { font-size: 90%; }
+ h6 { font-size: 90%; border: 0; }
+
+ :link { color: #039; }
+ :visited { color: #636; }
+ :link:hover, :visited:hover { color: #333; }
+ :link:active, :link:active { color: #000; }
+
+ p.crumbs :link { color: #999; }
+ p.crumbs :visited { color: #666; } \ No newline at end of file
diff --git a/doc/systray.html b/doc/systray.html
new file mode 100644
index 0000000..a238670
--- /dev/null
+++ b/doc/systray.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head>
+<link rel="stylesheet" type="text/css" href="styles/css.css">
+<link rel="shortcut icon" href="images/favicon.ico" type="image/x-icon">
+<meta content="text/html; charset=ISO-8859-1" http-equiv="content-type">
+<title>HPLIP HELP</title></head>
+<body>
+<div id="container">
+<div id="header">
+
+<hr class="hide">
+<div id="mBody">
+<center><h2 class="showhide_heading" id="mainmenu">HP Linux Imaging and Printing (HPLIP) Help</h2>
+<a href="index.html"><li>Main Menu</li></a></center><br>
+<p>
+</p>
+
+<h3 class="showhide_heading" id="Startup">About HP Status Service "system tray" icon</h3>
+<p>The HPLIP systray icon provides up to date status for the printer.
+&nbsp;You can see the systray below with an example of the status
+dialog. &nbsp;The systray starts automatically when hp-toolbox is ran.</p></div>
+
+<div id="footer">
+<p class="copyright"></p><center>
+ <a href="http://welcome.hp.com/country/us/en/privacy.html">Privacy Statement</a> | <a href="http://hplip.sourceforge.net/legal.html">Legal Notices</a> | &#169; 2008 Hewlett-Packard Development Company, L.P. <br></center>
+<p></p>
+</div>
+</div>
+</div></body></html> \ No newline at end of file
diff --git a/doc/troubleshooting.html b/doc/troubleshooting.html
new file mode 100644
index 0000000..df3384d
--- /dev/null
+++ b/doc/troubleshooting.html
@@ -0,0 +1,78 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head>
+<link rel="stylesheet" type="text/css" href="styles/css.css">
+<link rel="shortcut icon" href="images/favicon.ico" type="image/x-icon">
+<meta content="text/html; charset=ISO-8859-1" http-equiv="content-type">
+<title>HPLIP HELP</title></head>
+<body>
+<div id="container">
+<div id="header">
+
+<hr class="hide">
+<div id="mBody">
+<center><h2 class="showhide_heading" id="mainmenu">HP Linux Imaging and Printing (HPLIP) Help</h2>
+<a href="index.html"><li>Main Menu</li></a></center><br>
+<p>
+</p>
+
+<h3 class="showhide_heading" id="Startup">Troubleshooting setup and I/O issues</h3><br>Troubleshooting
+HPLIP involves several steps depending on the problem. &nbsp;Here we
+will describe several things to check.<br><br><h3 class="showhide_heading" id="Add_ons">First things to check</h3>
+Referencing on the product support page on the HPLIP website, verify that your printer is supported by HPLIP.<br><br>If
+you are&nbsp;using HPLIP from source or that came pre-packaged with
+your distro try using the HPLIP from source files available on the <a href="http://hplip.sf.net">HPLIP website</a>.<br><h3 class="showhide_heading" id="Downloads">Run "hp-check" utility</h3><br>hp-check displays the status the HPLIP install. &nbsp;<br><br>1. Open a terminal (command line) window.<br><br>2. &nbsp;Run:<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<span style="font-style: italic;"> hp-check -t<br><br></span>Read through the output of the hp-check and fix any problems reported--this will resolve a large portion of any problems.<br><br>An important section to review is:<br><br><span style="font-style: italic;">&nbsp;&nbsp;&nbsp; # Following values are determined at configure time and cannot be changed.</span><br style="font-style: italic;"><span style="font-style: italic;">&nbsp;&nbsp;&nbsp; [configure]</span><br style="font-style: italic;"><span style="font-style: italic;">&nbsp;&nbsp;&nbsp; network-build=yes</span><br style="font-style: italic;"><span style="font-style: italic;">&nbsp;&nbsp;&nbsp; pp-build=no</span><br style="font-style: italic;"><span style="font-style: italic;">&nbsp;&nbsp;&nbsp; gui-build=yes</span><br style="font-style: italic;"><span style="font-style: italic;">&nbsp;&nbsp;&nbsp; scanner-build=yes</span><br style="font-style: italic;"><span style="font-style: italic;">&nbsp;&nbsp;&nbsp; fax-build=yes</span><br style="font-style: italic;"><span style="font-style: italic;">&nbsp;&nbsp;&nbsp; dbus-build=yes</span><br style="font-style: italic;"><span style="font-style: italic;">&nbsp;&nbsp;&nbsp; cups11-build=no</span><br style="font-style: italic;"><span style="font-style: italic;">&nbsp;&nbsp;&nbsp; doc-build=yes</span><br style="font-style: italic;"><span style="font-style: italic;">&nbsp;&nbsp;&nbsp; shadow-build=no</span><br style="font-style: italic;"><span style="font-style: italic;">&nbsp;&nbsp;&nbsp; foomatic-drv-install=yes</span><br style="font-style: italic;"><span style="font-style: italic;">&nbsp;&nbsp;&nbsp; foomatic-ppd-install=no</span><br style="font-style: italic;"><span style="font-style: italic;">&nbsp;&nbsp;&nbsp; foomatic-rip-hplip-install=yes</span><br><br>This
+section describes what is currently enabled or disabled. &nbsp;For
+example if you are having a problem setting up your parallel printer
+check to be sure that pp-build=yes--if it does not you'll need to
+reinstall hplip and enable parallel support.<span style="font-style: italic;"><span style="font-style: italic;"><span style="font-style: italic;"><span style="font-style: italic;"></span></span></span><br></span><h3 class="showhide_heading" id="System_Defaults">I/O Problems (Printer is not detected)</h3>
+<p>If the printer is not being detected by hp-setup check the following items:</p><p style="font-style: italic;">Is the printer supported by HPLIP?</p><p style="font-style: italic;">Is the printer powered on?</p><p style="font-style: italic;">Is the printer connected correctly with the proper type of cable?</p><p style="font-style: italic;">Is the printer in an error state? (i.e. out of paper, out of ink, etc.)</p><p style="font-style: italic;">Is the cable (usb/parallel/ethernet) in good working condition?</p><p><span style="font-weight: bold;">USB</span></p><p>If you run "/usr/lib/cups/backend/hp" you should get output similar to the following:</p><span style="font-style: italic;">&nbsp;&nbsp;&nbsp;
+direct
+hp:/usb/HP_Color_LaserJet_CP1515n?serial=00XXXXXXXXXX "HP Color
+LaserJet CP1515n" "HP Color LaserJet CP1515n USB &nbsp;&nbsp;&nbsp;
+&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 00XXXXXXXXXX
+HPLIP"
+"MFG:HP;MDL:HP Color LaserJet CP1515n;CLS:PRINTER;DES:HP Color LaserJet
+CP1515n;SN:00XXXXXXXXXX;"</span><br style="font-style: italic;"><br>If you get instead, get output similiar to the following:<br><br>&nbsp;&nbsp;&nbsp; <span style="font-style: italic;">direct hp "Unknown" "HP Printer (HPLIP)"</span><br><br>Check all of the questions stated above.<br><br>Are you using any usb hubs? &nbsp;If so remove them and plug the printer directly into the system.<br><br>If you run lsusb -v, is the printer detected? &nbsp;If not, there may be a hardware or usb subsystem problem.<br><br><span style="font-weight: bold;">Network</span><br><br>Does
+the network have the correct snmp ports open? port 161 (udp and tcp),
+port 162 (udp and tcp) and port 9100 (udp and tcp) need to be open for
+HPLIP to function correctly.<br><br>Can you ping the printer?<br><br>If you run hp-makeuri &lt;printer.ip.address.here&gt; you should get an output similar to:<br><br style="font-style: italic;"><span style="font-style: italic;">&nbsp;&nbsp;&nbsp; CUPS URI: hp:/net/Photosmart_3300_series?ip=192.168.1.12</span><br style="font-style: italic;"><span style="font-style: italic;">&nbsp;&nbsp;&nbsp; SANE URI: hpaio:/net/Photosmart_3300_series?ip=192.168.1.12</span><br style="font-style: italic;"><span style="font-style: italic;">&nbsp;&nbsp;&nbsp; HP Fax URI: hpfax:/net/Photosmart_3300_series?ip=192.168.1.12</span><br><br>If you do not get a response after running "hp-makeuri", try running:<br><br style="font-style: italic;"><span style="font-style: italic;">&nbsp;&nbsp;&nbsp; snmpwalk -Os -c public -v 1 xxx.xxx.xxx.xxx 1.3.6.1.4.1.11.2.3.9.1.1.7.0 </span><br><br>Where xxx.xxx.xxx.xxx is the correct IP address of the printer.<br><br>The output should be similiar to the following:<br><br style="font-style: italic;"><span style="font-style: italic;">&nbsp;&nbsp;&nbsp;
+enterprises.11.2.3.9.1.1.7.0
+= STRING:
+"MFG:Hewlett-Packard;CMD:PJL,MLC,BIDI-ECP,PCL,POSTSCRIPT,PCLXL;MDL:hp
+LaserJet &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
+&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
+3380;CLS:PRINTER;DES:Hewlett-Packard LaserJet
+3380;MEM:23MB;COMMENT:RES=1200x1;" </span><br><br>If it does not there may be an snmp problem on your system and/or network.<br><br><span style="font-weight: bold;">Parallel<br><br></span>Was HPLIP installed with parallel support? &nbsp;Run hp-check -t and look in the for the following output:<br><br><span style="font-style: italic;">&nbsp;&nbsp;&nbsp; # Following values are determined at configure time and cannot be changed.<br>&nbsp;&nbsp;&nbsp; [configure]<br>&nbsp;&nbsp;&nbsp; network-build=yes<br>&nbsp;&nbsp;&nbsp; pp-build=no<br>&nbsp;&nbsp;&nbsp; gui-build=yes<br>&nbsp;&nbsp;&nbsp; scanner-build=yes<br>&nbsp;&nbsp;&nbsp; fax-build=yes<br>&nbsp;&nbsp;&nbsp; dbus-build=yes<br>&nbsp;&nbsp;&nbsp; cups11-build=no<br>&nbsp;&nbsp;&nbsp; doc-build=yes<br>&nbsp;&nbsp;&nbsp; shadow-build=no<br>&nbsp;&nbsp;&nbsp; foomatic-drv-install=yes<br>&nbsp;&nbsp;&nbsp; foomatic-ppd-install=no<br>&nbsp;&nbsp;&nbsp; foomatic-rip-hplip-install=yes<br>&nbsp;&nbsp;&nbsp; internal-tag=2.8.5.23<br></span><span style="font-style: italic;"></span><br>Find the section:<br><br><span style="font-style: italic;">&nbsp;&nbsp;&nbsp; pp-build=no<br><br><span style="font-style: italic;"></span></span>This should be "<span style="font-style: italic;">pp-build=yes</span>".<br><br>Is the ppdev module loaded?<br><br>Look for the output results from the hp-check -t for the following:<br><br><span style="font-style: italic;">&nbsp;&nbsp;&nbsp; Checking for dependency: ppdev - Parallel port support kernel module....</span><br style="font-style: italic;"><span style="font-style: italic;">&nbsp;&nbsp;&nbsp; OK, found.</span><br><span style="font-weight: bold;"><span style="font-weight: bold;"><br></span></span>If you are missing the ppdev module you can try running:<br><br>&nbsp;&nbsp;&nbsp; <span style="font-style: italic;">modprobe ppdev</span><br><br>Is your parallel port set to ECP mode in the BIOS?<br><br>If you run /usr/lib/cups/backend/hp do you should get an output similar to the following:<br><br><span style="font-style: italic;">&nbsp;&nbsp;&nbsp;
+direct
+hp:/par/HP_LaserJet?serial=00XXXXXXXXXX "HP
+LaserJet" "HP LaserJet&nbsp;PAR 00XXXXXXXXXX HPLIP"
+"MFG:HP;MDL:HP &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
+&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
+LaserJet&nbsp;;CLS:PRINTER;DES:HP&nbsp;LaserJet&nbsp;;SN:00XXXXXXXXXX;"</span><br><br>If the /usr/lib/cups/backend/hp does not detect the printer, HPLIP will not function.<h3 class="showhide_heading" id="Add_ons">Functionality Problems (print, scan, fax)</h3>
+<p style="font-weight: bold;">Print</p><p>Is the printer on-line and not in an error state?</p><p>If you run hp-check -t, are there any problems reported?</p><p>In the "hp-check -t", verify that the printer is configured:</p><p>Verify in the section DISCOVERED USB DEVICES that the printer is displayed.</p><p>Verify in the section INSTALLED CUPS PRINTER QUEUES that the printer queue is displayed.</p><p>Verify on the line PPD: that the ppd file matches the printer model.</p>Example:<br><br style="font-style: italic;"><span style="font-style: italic;">&nbsp;&nbsp;&nbsp; --------------------------</span><br style="font-style: italic;"><span style="font-style: italic;">&nbsp;&nbsp;&nbsp; | DISCOVERED USB DEVICES |</span><br style="font-style: italic;"><span style="font-style: italic;">&nbsp;&nbsp;&nbsp; --------------------------</span><br style="font-style: italic;"><br style="font-style: italic;"><span style="font-style: italic;">&nbsp;&nbsp;&nbsp; No devices found.</span><br style="font-style: italic;"><br style="font-style: italic;"><span style="font-style: italic;">&nbsp;&nbsp;&nbsp; ---------------------------------</span><br style="font-style: italic;"><span style="font-style: italic;">&nbsp;&nbsp;&nbsp; | INSTALLED CUPS PRINTER QUEUES |</span><br style="font-style: italic;"><span style="font-style: italic;">&nbsp;&nbsp;&nbsp; ---------------------------------</span><br style="font-style: italic;"><br style="font-style: italic;"><span style="font-style: italic;">&nbsp;&nbsp;&nbsp; Photosmart_3300</span><br style="font-style: italic;"><span style="font-style: italic;">&nbsp;&nbsp;&nbsp; ---------------</span><br style="font-style: italic;"><span style="font-style: italic;">&nbsp;&nbsp;&nbsp; Type: Printer</span><br style="font-style: italic;"><span style="font-style: italic;">&nbsp;&nbsp;&nbsp; Installed in HPLIP?: Yes, using the hp: CUPS backend.</span><br style="font-style: italic;"><span style="font-style: italic;">&nbsp;&nbsp;&nbsp; Device URI: hp:/net/Photosmart_3300_series?ip=15.252.39.136</span><br style="font-style: italic;"><span style="font-style: italic;">&nbsp;&nbsp;&nbsp; PPD: /etc/cups/ppd/Photosmart_3300.ppd</span><br style="font-style: italic;"><span style="font-style: italic;">&nbsp;&nbsp;&nbsp; PPD Description: HP PhotoSmart 3300 Foomatic/hpijs, hpijs 2.8.2.10 - HPLIP 2.8.2</span><br style="font-style: italic;"><span style="font-style: italic;">&nbsp;&nbsp;&nbsp; Printer status: printer Photosmart_3300 is idle.&nbsp; enabled since Tue 27 May 2008 01:58:02 PM PDT</span><br style="font-style: italic;"><span style="font-style: italic;">&nbsp;&nbsp;&nbsp; Communication status: Good</span><br><br>Are you able to print from any application?<br><br>View the syslog and try to print do you see any errors?<br><br>&nbsp;Run:<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<span style="font-style: italic;"> tail -f /var/log/messages</span><p>The
+possible errors presented in the "messages" log can be varied.
+&nbsp;You may need to reference your Linux distribution documentation
+for more information.</p><p>View the cups log and try to print do you see any errors?</p><p>To view the cups log:<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="font-style: italic;">Edit
+the file /etc/cups/cupsd.conf to change the loglevel to debug, then
+restart cups /etc/init.d/cups restart (or the command may be /etc/init.d/cupsys
+restart depending on your system configuration).</span></p><p style="font-weight: bold;">Scan</p>Is the printer on-line and not in an error state?<br><br>If you run&nbsp;hp-check -t are there any problems?<br><br>Within
+the "hp-check -t" output, verify that the sane is configured correctly
+in the SANE CONFIGURATION section. &nbsp;Here is an example of what you
+should see after running hp-check -t:<br><br><span style="font-style: italic;">&nbsp;&nbsp;&nbsp; 'hpaio' in '/etc/sane.d/dll.conf'...</span><br style="font-style: italic;"><span style="font-style: italic;">&nbsp;&nbsp;&nbsp; OK, found. SANE backend 'hpaio' is properly set up.</span><br style="font-style: italic;"><br style="font-style: italic;"><span style="font-style: italic;">&nbsp;&nbsp;&nbsp; Checking output of 'scanimage -L'...</span><br style="font-style: italic;"><span style="font-style: italic;">&nbsp;</span><br style="font-style: italic;"><span style="font-style: italic;">&nbsp;&nbsp;&nbsp; No scanners were identified. If you were expecting something different,</span><br style="font-style: italic;"><span style="font-style: italic;">&nbsp;&nbsp;&nbsp; check that the scanner is plugged in, turned on and detected by the</span><br style="font-style: italic;"><span style="font-style: italic;">&nbsp;&nbsp;&nbsp; sane-find-scanner tool (if appropriate). Please read the documentation</span><br style="font-style: italic;"><span style="font-style: italic;">&nbsp;&nbsp;&nbsp; which came with this software (README, FAQ, manpages).</span><br><br>If
+you do not see this or get an error, edit the dll.conf file and add
+hpaio. &nbsp;If the scanner is not detect using the scanimage be
+sure that the printer is supported and working correctly.<br><p style="font-weight: bold;">Fax&nbsp;</p>Is the printer powered on and not in an error state?<br><br>If you run hp-check -t are there any problems?<br><br>If
+you run hp-check -t is there a fax queue installed? &nbsp;You should
+see output similar to the following after running hp-check -t:<br><br><span style="font-style: italic;">&nbsp;&nbsp;&nbsp; Photosmart_3300_fax</span><br style="font-style: italic;"><span style="font-style: italic;">&nbsp;&nbsp;&nbsp; -------------------</span><br style="font-style: italic;"><span style="font-style: italic;">&nbsp;&nbsp;&nbsp; Type: Fax</span><br style="font-style: italic;"><span style="font-style: italic;">&nbsp;&nbsp;&nbsp; Installed in HPLIP?: Yes, using the hpfax: CUPS backend.</span><br style="font-style: italic;"><span style="font-style: italic;">&nbsp;&nbsp;&nbsp; Device URI: hpfax:/net/Photosmart_3300_series?ip=15.252.39.136</span><br style="font-style: italic;"><span style="font-style: italic;">&nbsp;&nbsp;&nbsp; PPD: /etc/cups/ppd/Photosmart_3300_fax.ppd</span><br style="font-style: italic;"><span style="font-style: italic;">&nbsp;&nbsp;&nbsp; PPD Description: HP Fax</span><br style="font-style: italic;"><span style="font-style: italic;">&nbsp;&nbsp;&nbsp; Printer status: printer Photosmart_3300_fax is idle.&nbsp; enabled since Thu 22 May 2008 01:32:01 PM PDT</span><br style="font-style: italic;"><span style="font-style: italic;">&nbsp;&nbsp;&nbsp; Communication status: Good</span><br><br>Is the phone line connected to the multifunction printer?<br><br>Can you fax a different document? (i.e. ensure that this is not a document-specific problem)<br><br>Is the receiving fax machine or device on-line and able to accept faxes?<br><h3 class="showhide_heading" id="Add_ons"><br></h3>
+<p>
+</p>
+
+</div>
+
+<div id="footer">
+<p class="copyright"></p><center>
+ <a href="http://welcome.hp.com/country/us/en/privacy.html">Privacy Statement</a> | <a href="http://hplip.sourceforge.net/legal.html">Legal Notices</a> | &#169; 2008 Hewlett-Packard Development Company, L.P. <br></center>
+<p></p>
+</div>
+</div>
+</div></body></html> \ No newline at end of file
diff --git a/doc/uninstalling.html b/doc/uninstalling.html
new file mode 100644
index 0000000..b1db13e
--- /dev/null
+++ b/doc/uninstalling.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head>
+<link rel="stylesheet" type="text/css" href="styles/css.css">
+<link rel="shortcut icon" href="images/favicon.ico" type="image/x-icon">
+<meta content="text/html; charset=ISO-8859-1" http-equiv="content-type">
+<title>HPLIP HELP</title></head>
+<body>
+<div id="container">
+<div id="header">
+
+<hr class="hide">
+<div id="mBody">
+<center><h2 class="showhide_heading" id="mainmenu">HP Linux Imaging and Printing (HPLIP) Help</h2>
+<a href="index.html"><li>Main Menu</li></a></center><br>
+<p>
+</p>
+
+<h3 class="showhide_heading" id="Startup">Uninstalling HPLIP</h3><br>To
+uninstall HPLIP you can run "make uninstall" from within the HPLIP
+source directory or you can run "rm -rf /usr/share/hplip" which will
+remove the HPLIP files.<br><br>The HPLIP source directory is created
+when HPLIP is initially installed. Usually in
+/home/user/Desktop/hplip-version where version is the hplip version.
+(2.8.5 for example)<br><br></div>
+
+<div id="footer">
+<p class="copyright"></p><center>
+ <a href="http://welcome.hp.com/country/us/en/privacy.html">Privacy Statement</a> | <a href="http://hplip.sourceforge.net/legal.html">Legal Notices</a> | &#169; 2008 Hewlett-Packard Development Company, L.P. <br></center>
+<p></p>
+</div>
+</div>
+</div></body></html> \ No newline at end of file
diff --git a/doc/upgrading.html b/doc/upgrading.html
new file mode 100644
index 0000000..48c02b6
--- /dev/null
+++ b/doc/upgrading.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head>
+<link rel="stylesheet" type="text/css" href="styles/css.css">
+<link rel="shortcut icon" href="images/favicon.ico" type="image/x-icon">
+<meta content="text/html; charset=ISO-8859-1" http-equiv="content-type">
+<title>HPLIP HELP</title></head>
+<body>
+<div id="container">
+<div id="header">
+
+<hr class="hide">
+<div id="mBody">
+<center><h2 class="showhide_heading" id="mainmenu">HP Linux Imaging and Printing (HPLIP) Help</h2>
+<a href="index.html"><li>Main Menu</li></a></center><br>
+<p>
+</p>
+
+<h3 class="showhide_heading" id="Startup">Upgrading HPLIP</h3><br>Upgrading
+HPLIP is done by first removing the current installed version of HPLIP
+installed and then installing the newer version of HPLIP.<br><br>Remove HPLIP by either running "make uninstall" in the HPLIP source directory or by running "rm -rf /usr/share/hplip".<br><br>If you have a preinstalled version of HPLIP you can uninstall it by using the package manager that your system uses.<br><br>Install
+the newer version of HPLIP by downloading and then running the
+automatic installer or by using the manual steps. More information on downloading and
+installing HPLIP is available on our <a href="http://hplip.sf.net">website</a>.<br></div>
+
+<div id="footer">
+<p class="copyright"></p><center>
+ <a href="http://welcome.hp.com/country/us/en/privacy.html">Privacy Statement</a> | <a href="http://hplip.sourceforge.net/legal.html">Legal Notices</a> | &#169; 2008 Hewlett-Packard Development Company, L.P. <br></center>
+<p></p>
+</div>
+</div>
+</div></body></html> \ No newline at end of file
diff --git a/fab.py b/fab.py
new file mode 100755
index 0000000..292eccc
--- /dev/null
+++ b/fab.py
@@ -0,0 +1,887 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2009 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+__version__ = '6.0'
+__title__ = "Fax Address Book"
+__mod__ = 'hp-fab'
+__doc__ = "A simple fax address book for HPLIP."
+
+# Std Lib
+import cmd
+import getopt
+import os
+
+# Local
+from base.g import *
+from base import utils, tui, module
+
+
+# Console class (from ASPN Python Cookbook)
+# Author: James Thiele
+# Date: 27 April 2004
+# Version: 1.0
+# Location: http://www.eskimo.com/~jet/python/examples/cmd/
+# Copyright (c) 2004, James Thiele
+class Console(cmd.Cmd):
+
+ def __init__(self):
+ cmd.Cmd.__init__(self)
+ self.intro = "Type 'help' for a list of commands. Type 'exit' or 'quit' to quit."
+ self.db = fax.FaxAddressBook() # database instance
+ self.prompt = log.bold("hp-fab > ")
+
+ # Command definitions
+ def do_hist(self, args):
+ """Print a list of commands that have been entered"""
+ print self._hist
+
+ def do_exit(self, args):
+ """Exits from the console"""
+ return -1
+
+ def do_quit(self, args):
+ """Exits from the console"""
+ return -1
+
+ # Command definitions to support Cmd object functionality
+ def do_EOF(self, args):
+ """Exit on system end of file character"""
+ return self.do_exit(args)
+
+ def do_help(self, args):
+ """Get help on commands
+ 'help' or '?' with no arguments prints a list of commands for which help is available
+ 'help <command>' or '? <command>' gives help on <command>
+ """
+ # The only reason to define this method is for the help text in the doc string
+ cmd.Cmd.do_help(self, args)
+
+ # Override methods in Cmd object
+ def preloop(self):
+ """Initialization before prompting user for commands.
+ Despite the claims in the Cmd documentaion, Cmd.preloop() is not a stub.
+ """
+ cmd.Cmd.preloop(self) # sets up command completion
+ self._hist = [] # No history yet
+ self._locals = {} # Initialize execution namespace for user
+ self._globals = {}
+
+ self.do_list('')
+
+ def postloop(self):
+ """Take care of any unfinished business.
+ Despite the claims in the Cmd documentaion, Cmd.postloop() is not a stub.
+ """
+ cmd.Cmd.postloop(self) # Clean up command completion
+ print "Exiting..."
+
+ def precmd(self, line):
+ """ This method is called after the line has been input but before
+ it has been interpreted. If you want to modifdy the input line
+ before execution (for example, variable substitution) do it here.
+ """
+ self._hist += [line.strip()]
+ return line
+
+ def postcmd(self, stop, line):
+ """If you want to stop the console, return something that evaluates to true.
+ If you want to do some post command processing, do it here.
+ """
+ return stop
+
+ def emptyline(self):
+ """Do nothing on empty input line"""
+ pass
+
+ def default(self, line):
+ log.error("Unrecognized command. Use 'help' to list commands.")
+
+ def get_nickname(self, args, fail_if_match=True, alt_text=False):
+ if not args:
+ while True:
+ if alt_text:
+ nickname = raw_input(log.bold("Enter the name to add to the group (<enter>=done*, c=cancel) ? ")).strip()
+ else:
+ nickname = raw_input(log.bold("Enter name (c=cancel) ? ")).strip()
+
+ if nickname.lower() == 'c':
+ print log.red("Canceled")
+ return ''
+
+ if not nickname:
+ if alt_text:
+ return ''
+ else:
+ log.error("Name must not be blank.")
+ continue
+
+
+ if fail_if_match:
+ if self.db.get(nickname) is not None:
+ log.error("Name already exists. Please choose a different name.")
+ continue
+
+ else:
+ if self.db.get(nickname) is None:
+ log.error("Name not found. Please enter a different name.")
+ continue
+
+ break
+
+ else:
+ nickname = args.strip()
+
+ if fail_if_match:
+ if self.db.get(nickname) is not None:
+ log.error("Name already exists. Please choose a different name.")
+ return ''
+
+ else:
+ if self.db.get(nickname) is None:
+ log.error("Name not found. Please enter a different name.")
+ return ''
+
+ return nickname
+
+
+ def get_groupname(self, args, fail_if_match=True, alt_text=False):
+ all_groups = self.db.get_all_groups()
+
+ if not args:
+ while True:
+ if alt_text:
+ groupname = raw_input(log.bold("Enter the group to join (<enter>=done*, c=cancel) ? ")).strip()
+ else:
+ groupname = raw_input(log.bold("Enter the group (c=cancel) ? ")).strip()
+
+
+ if groupname.lower() == 'c':
+ print log.red("Canceled")
+ return ''
+
+ if not groupname:
+ if alt_text:
+ return ''
+ else:
+ log.error("The group name must not be blank.")
+ continue
+
+ if groupname == 'All':
+ print "Cannot specify group 'All'. Please choose a different group."
+ return ''
+
+ if fail_if_match:
+ if groupname in all_groups:
+ log.error("Group already exists. Please choose a different group.")
+ continue
+
+ else:
+ if groupname not in all_groups:
+ log.error("Group not found. Please enter a different group.")
+ continue
+
+ break
+
+ else:
+ groupname = args.strip()
+
+ if fail_if_match:
+ if groupname in all_groups:
+ log.error("Group already exists. Please choose a different group.")
+ return ''
+
+ else:
+ if groupname not in all_groups:
+ log.error("Group not found. Please enter a different group.")
+ return ''
+
+ return groupname
+
+ def do_list(self, args):
+ """
+ List names and/or groups.
+ list [names|groups|all|]
+ dir [names|groups|all|]
+ """
+
+ if args:
+ scope = args.strip().split()[0]
+
+ if args.startswith('nam'):
+ self.do_names('')
+ return
+
+ elif args.startswith('gro'):
+ self.do_groups('')
+ return
+
+ self.do_names('')
+ self.do_groups('')
+
+ do_dir = do_list
+
+ def do_names(self, args):
+ """
+ List names.
+ names
+ """
+ all_entries = self.db.get_all_records()
+ log.debug(all_entries)
+
+ print log.bold("\nNames:\n")
+ if len(all_entries) > 0:
+
+ f = tui.Formatter()
+ f.header = ("Name", "Fax Number", "Notes", "Member of Group(s)")
+ for name, e in all_entries.items():
+ if not name.startswith('__'):
+ f.add((name, e['fax'], e['notes'], ', '.join(e['groups'])))
+
+ f.output()
+
+ else:
+ print "(None)"
+
+ print
+
+ def do_groups(self, args):
+ """
+ List groups.
+ groups
+ """
+ all_groups = self.db.get_all_groups()
+ log.debug(all_groups)
+
+ print log.bold("\nGroups:\n")
+ if len(all_groups):
+
+ f = tui.Formatter()
+ f.header = ("Group", "Members")
+ for group in all_groups:
+ f.add((group, ', '.join([x for x in self.db.group_members(group) if not x.startswith('__')])))
+ f.output()
+
+ else:
+ print "(None)"
+
+ print
+
+
+ def do_edit(self, args):
+ """
+ Edit an name.
+ edit [name]
+ modify [name]
+ """
+ nickname = self.get_nickname(args, fail_if_match=False)
+ if not nickname: return
+
+ e = self.db.get(nickname)
+ log.debug(e)
+
+ print log.bold("\nEdit/modify information for %s:\n" % nickname)
+
+# save_title = e['title']
+# title = raw_input(log.bold("Title (<enter>='%s', c=cancel) ? " % save_title)).strip()
+#
+# if title.lower() == 'c':
+# print log.red("Canceled")
+# return
+#
+# if not title:
+# title = save_title
+#
+# save_firstname = e['firstname']
+# firstname = raw_input(log.bold("First name (<enter>='%s', c=cancel) ? " % save_firstname)).strip()
+#
+# if firstname.lower() == 'c':
+# print log.red("Canceled")
+# return
+#
+# if not firstname:
+# firstname = save_firstname
+#
+# save_lastname = e['lastname']
+# lastname = raw_input(log.bold("Last name (<enter>='%s', c=cancel) ? " % save_lastname)).strip()
+#
+# if lastname.lower() == 'c':
+# print log.red("Canceled")
+# return
+#
+# if not lastname:
+# lastname = save_lastname
+
+ lastname = ''
+ firstname = ''
+ title = ''
+
+ save_faxnum = e['fax']
+ while True:
+ faxnum = raw_input(log.bold("Fax Number (<enter>='%s', c=cancel) ? " % save_faxnum)).strip()
+
+ if faxnum.lower() == 'c':
+ print log.red("Canceled")
+ return
+
+ if not faxnum and not save_faxnum:
+ log.error("Fax number must not be empty.")
+ continue
+
+ if not faxnum:
+ faxnum = save_faxnum
+
+ ok = True
+ for c in faxnum:
+ if c not in '0123456789-(+) *#':
+ log.error("Invalid characters in fax number. Fax number may only contain '0123456789-(+) '")
+ ok = False
+ break
+
+
+ if ok: break
+
+ save_notes = e['notes']
+ notes = raw_input(log.bold("Notes (<enter>='%s', c=cancel) ? " % save_notes)).strip()
+
+ if notes.lower() == 'c':
+ print log.red("Canceled")
+ return
+
+ if not notes:
+ notes = save_notes
+
+ if e['groups']:
+ print "\nLeave or Stay in a Group:\n"
+
+ new_groups = []
+ for g in e['groups']:
+ if g == 'All':
+ continue
+
+ ok, ans = tui.enter_yes_no("Stay in group %s " % g,
+ choice_prompt="(y=yes* (stay), n=no (leave), c=cancel) ? ")
+
+ if not ok:
+ print log.red("Canceled")
+ return
+
+ if ans:
+ new_groups.append(g)
+
+ print "\nJoin New Group(s):\n"
+
+ while True:
+ add_group = self.get_groupname('', fail_if_match=False, alt_text=True)
+
+ if add_group.lower() == 'c':
+ print log.red("Canceled")
+ return
+
+ if not add_group:
+ break
+
+ all_groups = self.db.get_all_groups()
+
+ if add_group not in all_groups:
+ log.warn("Group not found.")
+ ok, ans = tui.enter_yes_no("Is this a new group",
+ choice_prompt="(y=yes* (new), n=no, c=cancel) ? ")
+
+ if not ok:
+ print log.red("Canceled")
+ return
+
+ if not ans:
+ continue
+
+ if add_group in e['groups']:
+ log.error("Group already specified. Choose a different group name or press <enter> to continue.")
+ continue
+
+ new_groups.append(add_group)
+
+ self.db.set(nickname, title, firstname, lastname, faxnum, new_groups, notes)
+ self.do_show(nickname)
+
+ print
+
+ do_modify = do_edit
+
+
+ def do_editgrp(self, args):
+ """
+ Edit a group.
+ editgrp [group]
+ modifygrp [group]
+ """
+ group = self.get_groupname(args, fail_if_match=False)
+ if not group: return
+
+ old_entries = self.db.group_members(group)
+
+ new_entries = []
+
+ print "\nExisting Names in Group:\n"
+
+ for e in old_entries:
+ if not e.startswith('__'):
+ ok, ans = tui.enter_yes_no("Should '%s' stay in this group " % e,
+ choice_prompt="(y=yes* (stay), n=no (leave), c=cancel) ? ")
+ else:
+ continue
+
+ if not ok:
+ print log.red("Canceled")
+ return
+
+ if ans:
+ new_entries.append(e)
+
+ print "\nAdd New Names to Group:\n"
+
+ while True:
+ nickname = self.get_nickname('', fail_if_match=False, alt_text=True)
+
+ if nickname.lower() == 'c':
+ print log.red("Canceled")
+ return
+
+ if not nickname.lower():
+ break
+
+ new_entries.append(nickname)
+
+ self.db.update_groups(group, new_entries)
+
+ print
+
+ do_modifygrp = do_editgrp
+
+
+ def do_add(self, args):
+ """
+ Add an name.
+ add [name]
+ new [name]
+ """
+ nickname = self.get_nickname(args, fail_if_match=True)
+ if not nickname: return
+
+ print log.bold("\nEnter information for %s:\n" % nickname)
+
+# title = raw_input(log.bold("Title (c=cancel) ? ")).strip()
+#
+# if title.lower() == 'c':
+# print log.red("Canceled")
+# return
+#
+# firstname = raw_input(log.bold("First name (c=cancel) ? ")).strip()
+#
+# if firstname.lower() == 'c':
+# print log.red("Canceled")
+# return
+#
+# lastname = raw_input(log.bold("Last name (c=cancel) ? ")).strip()
+#
+# if lastname.lower() == 'c':
+# print log.red("Canceled")
+# return
+
+ title = ''
+ firstname = ''
+ lastname = ''
+
+ while True:
+ faxnum = raw_input(log.bold("Fax Number (c=cancel) ? ")).strip()
+
+ if faxnum.lower() == 'c':
+ print log.red("Canceled")
+ return
+
+ if not faxnum:
+ log.error("Fax number must not be empty.")
+ continue
+
+ ok = True
+ for c in faxnum:
+ if c not in '0123456789-(+) *#':
+ log.error("Invalid characters in fax number. Fax number may only contain '0123456789-(+) *#'")
+ ok = False
+ break
+
+
+ if ok: break
+
+ notes = raw_input(log.bold("Notes (c=cancel) ? ")).strip()
+
+ if notes.strip().lower() == 'c':
+ print log.red("Canceled")
+ return
+
+ groups = []
+ all_groups = self.db.get_all_groups()
+ while True:
+ add_group = raw_input(log.bold("Member of group (<enter>=done*, c=cancel) ? " )).strip()
+
+ if add_group.lower() == 'c':
+ print log.red("Canceled")
+ return
+
+ if not add_group:
+ break
+
+ if add_group == 'All':
+ print log.red("Cannot specify 'All'.")
+ continue
+
+ if add_group not in all_groups:
+ log.warn("Group not found.")
+
+ while True:
+ user_input = raw_input(log.bold("Is this a new group (y=yes*, n=no) ? ")).lower().strip()
+
+ if user_input not in ['', 'n', 'y']:
+ log.error("Please enter 'y', 'n' or press <enter> for 'yes'.")
+ continue
+
+ break
+
+ if user_input == 'n':
+ continue
+
+ if add_group in groups:
+ log.error("Group already specified. Choose a different group name or press <enter> to continue.")
+ continue
+
+ groups.append(add_group)
+
+ groups.append('All')
+
+ self.db.set(nickname, title, firstname, lastname, faxnum, groups, notes)
+ self.do_show(nickname)
+
+
+ do_new = do_add
+
+
+ def do_addgrp(self, args):
+ """
+ Add a group.
+ addgrp [group]
+ newgrp [group]
+ """
+ group = self.get_groupname(args, fail_if_match=True)
+ if not group: return
+
+ entries = []
+ while True:
+ nickname = self.get_nickname('', fail_if_match=False, alt_text=True)
+
+ if nickname.lower() == 'c':
+ print log.red("Canceled")
+ return
+
+ if not nickname.lower():
+ break
+
+ entries.append(nickname)
+
+ self.db.update_groups(group, entries)
+
+ print
+
+ do_newgrp = do_addgrp
+
+
+ def do_view(self, args):
+ """
+ View all name data.
+ view
+ """
+ all_entries = self.db.get_all_records()
+ log.debug(all_entries)
+
+ print log.bold("\nView all Data:\n")
+ if len(all_entries) > 0:
+
+ f = tui.Formatter()
+ f.header = ("Name", "Fax", "Notes", "Member of Group(s)")
+
+ for name, e in all_entries.items():
+ if not name.startswith('__'):
+ f.add((name, e['fax'], e['notes'], ', '.join(e['groups'])))
+
+ f.output()
+
+ print
+
+
+
+ def do_show(self, args):
+ """
+ Show a name (all details).
+ show [name]
+ details [name]
+ """
+ name = self.get_nickname(args, fail_if_match=False)
+ if not name: return
+
+ e = self.db.get(name)
+ if e:
+ f = tui.Formatter()
+ f.header = ("Key", "Value")
+ f.add(("Name:", name))
+ #f.add(("Title:", e['title']))
+ #f.add(("First Name:", e['firstname']))
+ #f.add(("Last Name:", e['lastname']))
+ f.add(("Fax Number:", e['fax']))
+ f.add(("Notes:", e['notes']))
+ f.add(("Member of Group(s):", ', '.join(e['groups'])))
+
+ f.output()
+
+ else:
+ log.error("Name not found. Use the 'names' command to view all names.")
+
+ print
+
+ do_details = do_show
+
+ def do_rm(self, args):
+ """
+ Remove a name.
+ rm [name]
+ del [name]
+ """
+ nickname = self.get_nickname(args, fail_if_match=False)
+ if not nickname: return
+
+ self.db.delete(nickname)
+
+ print
+
+ do_del = do_rm
+
+ def do_rmgrp(self, args):
+ """
+ Remove a group.
+ rmgrp [group]
+ delgrp [group]
+ """
+ group = self.get_groupname(args, fail_if_match=False)
+ if not group: return
+
+ self.db.delete_group(group)
+
+ print
+
+ do_delgrp = do_rmgrp
+
+
+ def do_about(self, args):
+ """About fab."""
+ utils.log_title(__title__, __version__)
+
+ def do_import(self, args):
+ """
+ Import LDIF
+ import <filename> [type]
+ [type] = vcf|ldif|auto
+ """
+ args = args.strip().split()
+
+ if not args:
+ log.error("You must specify a filename to import from.")
+ return
+
+ filename = args[0]
+
+ if len(args) > 1:
+ typ = args[1].lower()
+ else:
+ typ = 'auto'
+
+ if typ not in ('auto', 'ldif', 'vcf', 'vcard'):
+ log.error("Invalid type: %s" % typ)
+ return
+
+ if not os.path.exists(filename):
+ log.error("File %s not found." % filename)
+ return
+
+ if typ == 'auto':
+ ext = os.path.splitext(filename)[1].lower()
+ if ext == '.vcf':
+ typ = 'vcf'
+ elif ext == '.ldif':
+ typ = 'ldif'
+ else:
+ head = file(filename, 'r').read(1024).lower()
+ if 'begin:vcard' in head:
+ typ = 'vcf'
+ else:
+ typ = 'ldif'
+
+ if typ == 'ldif':
+ print "Importing from LDIF file %s..." % filename
+ ok, error_str = self.db.import_ldif(filename)
+
+ elif typ in ('vcard', 'vcf'):
+ print "Importing from VCF file %s..." % filename
+ ok, error_str = self.db.import_vcard(filename)
+
+ if not ok:
+ log.error(error_str)
+ else:
+ self.do_list('')
+
+ print
+
+
+
+
+mod = module.Module(__mod__, __title__, __version__, __doc__, None,
+ (GUI_MODE, INTERACTIVE_MODE),
+ (UI_TOOLKIT_QT3, UI_TOOLKIT_QT4))
+
+mod.setUsage(module.USAGE_FLAG_NONE)
+
+opts, device_uri, printer_name, mode, ui_toolkit, loc = \
+ mod.parseStdOpts(handle_device_printer=False)
+
+if ui_toolkit == 'qt3':
+ if not utils.canEnterGUIMode():
+ log.error("%s GUI mode requires GUI support (try running with --qt4). Entering interactive mode." % __mod__)
+ mode = INTERACTIVE_MODE
+else:
+ if not utils.canEnterGUIMode4():
+ log.error("%s GUI mode requires GUI support (try running with --qt3). Entering interactive mode." % __mod__)
+ mode = INTERACTIVE_MODE
+
+
+if mode == GUI_MODE:
+ if ui_toolkit == 'qt3':
+ log.set_module("hp-fab(qt3)")
+ try:
+ from qt import *
+ from ui.faxaddrbookform import FaxAddrBookForm
+ except ImportError:
+ log.error("Unable to load Qt3 support. Is it installed?")
+ sys.exit(1)
+
+ app = None
+ addrbook = None
+ # create the main application object
+ app = QApplication(sys.argv)
+
+ if loc is None:
+ loc = user_conf.get('ui', 'loc', 'system')
+ if loc.lower() == 'system':
+ loc = str(QTextCodec.locale())
+ log.debug("Using system locale: %s" % loc)
+
+ if loc.lower() != 'c':
+ e = 'utf8'
+ try:
+ l, x = loc.split('.')
+ loc = '.'.join([l, e])
+ except ValueError:
+ l = loc
+ loc = '.'.join([loc, e])
+
+ log.debug("Trying to load .qm file for %s locale." % loc)
+ trans = QTranslator(None)
+
+ qm_file = 'hplip_%s.qm' % l
+ log.debug("Name of .qm file: %s" % qm_file)
+ loaded = trans.load(qm_file, prop.localization_dir)
+
+ if loaded:
+ app.installTranslator(trans)
+ else:
+ loc = 'c'
+
+ if loc == 'c':
+ log.debug("Using default 'C' locale")
+ else:
+ log.debug("Using locale: %s" % loc)
+ QLocale.setDefault(QLocale(loc))
+ prop.locale = loc
+ try:
+ locale.setlocale(locale.LC_ALL, locale.normalize(loc))
+ except locale.Error:
+ pass
+
+ addrbook = FaxAddrBookForm()
+ addrbook.show()
+ app.setMainWidget(addrbook)
+
+ try:
+ log.debug("Starting GUI loop...")
+ app.exec_loop()
+ except KeyboardInterrupt:
+ pass
+
+ sys.exit(0)
+
+ else: # qt4
+ try:
+ from PyQt4.QtGui import QApplication
+ from ui4.fabwindow import FABWindow
+ except ImportError:
+ log.error("Unable to load Qt4 support. Is it installed?")
+ sys.exit(1)
+
+ log.set_module("hp-fab(qt4)")
+
+ if 1:
+ app = QApplication(sys.argv)
+
+ fab = FABWindow(None)
+ fab.show()
+
+ try:
+ log.debug("Starting GUI loop...")
+ app.exec_()
+ except KeyboardInterrupt:
+ sys.exit(0)
+
+
+
+else: # INTERACTIVE_MODE
+ try:
+ from fax import fax
+ except ImportError:
+ # This can fail on Python < 2.3 due to the datetime module
+ log.error("Fax address book disabled - Python 2.3+ required.")
+ sys.exit(1)
+
+ console = Console()
+
+ try:
+ console.cmdloop()
+ except KeyboardInterrupt:
+ log.error("User exit.")
+
+ log.info("")
+ log.info("Done.")
+
diff --git a/fax/__init__.py b/fax/__init__.py
new file mode 100644
index 0000000..97d3c89
--- /dev/null
+++ b/fax/__init__.py
@@ -0,0 +1,20 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2007 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
diff --git a/fax/backend/hpfax.py b/fax/backend/hpfax.py
new file mode 100755
index 0000000..039af44
--- /dev/null
+++ b/fax/backend/hpfax.py
@@ -0,0 +1,286 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2009 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+__version__ = '4.1'
+__title__ = 'CUPS Fax Backend (hpfax:)'
+__doc__ = "CUPS backend for PC send fax. Generally this backend is run by CUPS, not directly by a user. To send a fax as a user, run hp-sendfax or print to the device's CUPS fax queue."
+
+# StdLib
+import sys
+import getopt
+import ConfigParser
+import os.path, os
+import syslog
+import time
+import operator
+import tempfile
+
+
+CUPS_BACKEND_OK = 0 # Job completed successfully
+CUPS_BACKEND_FAILED = 1 # Job failed, use error-policy
+CUPS_BACKEND_AUTH_REQUIRED = 2 # Job failed, authentication required
+CUPS_BACKEND_HOLD = 3 # Job failed, hold job
+CUPS_BACKEND_STOP = 4 # Job failed, stop queue
+CUPS_BACKEND_CANCEL = 5 # Job failed, cancel job
+
+PIPE_BUF = 4096
+
+job_id = 0
+pid = os.getpid()
+config_file = '/etc/hp/hplip.conf'
+home_dir = ''
+
+
+def bug(msg):
+ syslog.syslog("hpfax[%d]: error: %s\n" % (pid, msg))
+ log.stderr("ERROR: %s\n" % msg)
+
+
+if os.path.exists(config_file):
+ config = ConfigParser.ConfigParser()
+ config.read(config_file)
+
+ try:
+ home_dir = config.get('dirs', 'home')
+ except:
+ bug("Error setting home directory: home= under [dirs] not found.")
+ sys.exit(1)
+else:
+ bug("Error setting home directory: /etc/hp/hplip.conf not found")
+ sys.exit(1)
+
+if not home_dir or not os.path.exists(home_dir):
+ bug("Error setting home directory: Home directory %s not found." % home_dir)
+ sys.exit(1)
+
+sys.path.insert(0, home_dir)
+os.chdir(home_dir)
+
+# HPLIP
+try:
+ from base.g import *
+ from base.codes import *
+ from base import device
+ from base import utils
+ from prnt import cups
+except ImportError, e:
+ bug("Error importing HPLIP modules: %s\n" % (pid, e))
+ sys.exit(1)
+
+def handle_sigpipe():
+ syslog.syslog("SIGPIPE!")
+
+
+USAGE = [(__doc__, "", "para", True),
+ ("Usage: hpfax [job_id] [username] [title] [copies] [options]", "", "summary", True),
+ utils.USAGE_OPTIONS,
+ utils.USAGE_LOGGING1, utils.USAGE_LOGGING2, utils.USAGE_LOGGING3,
+ utils.USAGE_HELP,
+ ]
+
+def usage(typ='text'):
+ if typ == 'text':
+ utils.log_title(__title__, __version__)
+
+ utils.format_text(USAGE, typ, title=__title__, crumb='hpfax:')
+ sys.exit(CUPS_BACKEND_OK)
+
+# Send dbus event to hpssd on dbus system bus
+def send_message(device_uri, printer_name, event_code, username, job_id, title, pipe_name=''):
+ args = [device_uri, printer_name, event_code, username, job_id, title, pipe_name]
+ msg = lowlevel.SignalMessage('/', 'com.hplip.StatusService', 'Event')
+ msg.append(signature='ssisiss', *args)
+
+ SystemBus().send_message(msg)
+
+
+try:
+ opts, args = getopt.getopt(sys.argv[1:], 'l:hg', ['level=', 'help', 'help-rest', 'help-man'])
+
+except getopt.GetoptError:
+ usage()
+
+for o, a in opts:
+
+ if o in ('-l', '--logging'):
+ log_level = a.lower().strip()
+ log.set_level(log_level)
+
+ elif o == '-g':
+ log.set_level('debug')
+
+ elif o in ('-h', '--help'):
+ usage()
+
+ elif o == '--help-rest':
+ usage('rest')
+
+ elif o == '--help-man':
+ usage('man')
+
+
+if len( args ) == 0:
+ cups11 = utils.to_bool(sys_conf.get('configure', 'cups11', '0'))
+
+ try:
+ probed_devices = device.probeDevices(['usb', 'par'], filter={'fax-type': (operator.gt, 0)})
+ except Error:
+ sys.exit(CUPS_BACKEND_FAILED)
+
+ good_devices = 0
+ for uri in probed_devices:
+ try:
+ back_end, is_hp, bus, model, serial, dev_file, host, zc, port = \
+ device.parseDeviceURI(uri)
+ except Error:
+ continue
+
+ mq = device.queryModelByModel(model)
+
+ if mq.get('fax-type', FAX_TYPE_NONE) in (FAX_TYPE_MARVELL,):
+ # HP Fax 3
+ if bus == 'usb':
+ print 'direct %s "HP Fax 3" "%s USB %s HP Fax HPLIP" "MFG:HP;MDL:Fax 3;DES:HP Fax 3;"' % \
+ (uri.replace("hp:", "hpfax:"), model.replace('_', ' '), serial)
+
+ else: # par
+ print 'direct %s "HP Fax 3" "%s LPT HP Fax HPLIP" "MFG:HP;MDL:Fax 3;DES:HP Fax 3;"' % \
+ (uri.replace("hp:", "hpfax:"), model.replace('_', ' '))
+
+ elif mq.get('fax-type', FAX_TYPE_NONE) in (FAX_TYPE_SOAP,) or mq.get('fax-type', FAX_TYPE_NONE) in (FAX_TYPE_LEDMSOAP,):
+ # HP Fax 2
+ if bus == 'usb':
+ print 'direct %s "HP Fax 2" "%s USB %s HP Fax HPLIP" "MFG:HP;MDL:Fax 2;DES:HP Fax 2;"' % \
+ (uri.replace("hp:", "hpfax:"), model.replace('_', ' '), serial)
+
+ else: # par
+ print 'direct %s "HP Fax 2" "%s LPT HP Fax HPLIP" "MFG:HP;MDL:Fax 2;DES:HP Fax 2;"' % \
+ (uri.replace("hp:", "hpfax:"), model.replace('_', ' '))
+ elif mq.get('fax-type', FAX_TYPE_NONE) in (FAX_TYPE_LEDM,):
+ # HP Fax 4
+ if bus == 'usb':
+ print 'direct %s "HP Fax 4" "%s USB %s HP Fax HPLIP" "MFG:HP;MDL:Fax 4;DES:HP Fax 4;"' % \
+ (uri.replace("hp:", "hpfax:"), model.replace('_', ' '), serial)
+
+ else: # par
+ print 'direct %s "HP Fax 4" "%s LPT HP Fax HPLIP" "MFG:HP;MDL:Fax 4;DES:HP Fax 4;"' % \
+ (uri.replace("hp:", "hpfax:"), model.replace('_', ' '))
+
+ else:
+ # HP Fax
+ if bus == 'usb':
+ print 'direct %s "HP Fax" "%s USB %s HP Fax HPLIP" "MFG:HP;MDL:Fax;DES:HP Fax;"' % \
+ (uri.replace("hp:", "hpfax:"), model.replace('_', ' '), serial)
+
+ else: # par
+ print 'direct %s "HP Fax" "%s LPT HP Fax HPLIP" "MFG:HP;MDL:Fax;DES:HP Fax;"' % \
+ (uri.replace("hp:", "hpfax:"), model.replace('_', ' '))
+
+ good_devices += 1
+
+ if good_devices == 0:
+ if cups11:
+ print 'direct hpfax:/no_device_found "HP Fax" "no_device_found" ""'
+ else:
+ print 'direct hpfax "Unknown" "HP Fax (HPLIP)" ""'
+
+ sys.exit(CUPS_BACKEND_OK)
+
+else:
+ try:
+ # dBus
+ import dbus
+ from dbus import SystemBus, lowlevel
+ except ImportError:
+ bug("HPLIP pc send fax requires dbus and python-dbus")
+ sys.exit(CUPS_BACKEND_FAILED)
+
+ import warnings
+ # Ignore: .../dbus/connection.py:242: DeprecationWarning: object.__init__() takes no parameters
+ # (occurring on Python 2.6/dBus 0.83/Ubuntu 9.04)
+ warnings.simplefilter("ignore", DeprecationWarning)
+
+ # CUPS provided environment
+ try:
+ device_uri = os.environ['DEVICE_URI']
+ printer_name = os.environ['PRINTER']
+ except KeyError:
+ bug("Improper environment: Must be run by CUPS.")
+ sys.exit(CUPS_BACKEND_FAILED)
+
+ log.debug(args)
+
+ try:
+ job_id, username, title, copies, options = args[0:5]
+ job_id = int(job_id)
+ except IndexError:
+ bug("Invalid command line: invalid arguments.")
+ sys.exit(CUPS_BACKEND_FAILED)
+
+ send_message(device_uri, printer_name, EVENT_START_FAX_PRINT_JOB, username, job_id, title)
+
+ try:
+ input_fd = file(args[5], 'r')
+ except IndexError:
+ input_fd = 0
+
+ # REVISIT:
+ tmp_dir = '/tmp'
+ pipe_name = os.path.join(tmp_dir, "hpfax-pipe-%d" % job_id)
+
+ # Create the named pipe. Make sure it exists before sending
+ # message to hppsd.
+ os.umask(0111)
+ try:
+ os.mkfifo(pipe_name)
+ except OSError:
+ os.unlink(pipe_name)
+ os.mkfifo(pipe_name)
+
+ # Send dbus event to hpssd
+ send_message(device_uri, printer_name, EVENT_FAX_RENDER_COMPLETE, username, job_id, title, pipe_name)
+
+ # REVISIT:
+ pipe = os.open(pipe_name, os.O_WRONLY)
+
+ bytes_read = 0
+ while True:
+ data = os.read(input_fd, PIPE_BUF)
+
+ if not data:
+ break
+
+ os.write(pipe, data)
+ #syslog.syslog("Writing %d to pipe..." % len(data))
+ bytes_read += len(data)
+
+ if not bytes_read:
+ bug("No data on input file descriptor.")
+ sys.exit(CUPS_BACKEND_FAILED)
+
+ os.close(input_fd)
+ os.close(pipe)
+ os.unlink(pipe_name)
+
+ send_message(device_uri, printer_name, EVENT_END_FAX_PRINT_JOB, username, job_id, title)
+
+ sys.exit(CUPS_BACKEND_OK)
diff --git a/fax/coverpages.py b/fax/coverpages.py
new file mode 100644
index 0000000..eb40ff7
--- /dev/null
+++ b/fax/coverpages.py
@@ -0,0 +1,588 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2009 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+import warnings
+warnings.simplefilter("ignore", DeprecationWarning)
+warnings.simplefilter("ignore", SyntaxWarning)
+from reportlab.platypus.paragraph import Paragraph
+from reportlab.platypus.flowables import Preformatted, Image, HRFlowable
+from reportlab.platypus.doctemplate import *
+#from reportlab.rl_config import TTFSearchPath
+from reportlab.platypus import SimpleDocTemplate, Spacer
+from reportlab.platypus.tables import Table, TableStyle
+from reportlab.lib.pagesizes import letter, legal, A4
+from reportlab.lib.units import inch
+from reportlab.lib.styles import ParagraphStyle, getSampleStyleSheet
+from reportlab.lib import colors
+#from reportlab.pdfbase import pdfmetrics
+#from reportlab.pdfbase.ttfonts import TTFont
+from time import localtime, strftime
+#import warnings
+warnings.simplefilter('default', DeprecationWarning)
+warnings.simplefilter("default", SyntaxWarning)
+
+if __name__ == "__main__":
+ import sys
+ sys.path.append("..")
+
+from base.g import *
+from base import utils
+
+PAGE_SIZE_LETTER = 'letter'
+PAGE_SIZE_LEGAL = 'legal'
+PAGE_SIZE_A4 = 'a4'
+
+
+def escape(s):
+ return s.replace("&", "&amp;").replace(">", "&gt;").replace("<", "&lt;")
+
+
+def createStandardCoverPage(page_size=PAGE_SIZE_LETTER,
+ total_pages=1,
+ recipient_name='',
+ recipient_phone='',
+ recipient_fax='',
+ sender_name='',
+ sender_phone='',
+ sender_fax='',
+ sender_email='',
+ regarding='',
+ message='',
+ preserve_formatting=False,
+ output=None):
+
+ s = getSampleStyleSheet()
+
+ story = []
+
+ #print prop.locale
+ #TTFSearchPath.append('/usr/share/fonts/truetype/arphic')
+ #pdfmetrics.registerFont(TTFont('UMing', 'uming.ttf'))
+
+ ps = ParagraphStyle(name="title",
+ parent=None,
+ fontName='helvetica-bold',
+ #fontName='STSong-Light',
+ #fontName = 'UMing',
+ fontSize=72,
+ )
+
+ story.append(Paragraph("FAX", ps))
+
+ story.append(Spacer(1, inch))
+
+ ps = ParagraphStyle(name='normal',
+ fontName='Times-Roman',
+ #fontName='STSong-Light',
+ #fontName='UMing',
+ fontSize=12)
+
+ recipient_name_label = Paragraph("To:", ps)
+ recipient_name_text = Paragraph(escape(recipient_name[:64]), ps)
+
+ recipient_fax_label = Paragraph("Fax:", ps)
+ recipient_fax_text = Paragraph(escape(recipient_fax[:64]), ps)
+
+ recipient_phone_label = Paragraph("Phone:", ps)
+ recipient_phone_text = Paragraph(escape(recipient_phone[:64]), ps)
+
+ sender_name_label = Paragraph("From:", ps)
+ sender_name_text = Paragraph(escape(sender_name[:64]), ps)
+
+ sender_phone_label = Paragraph("Phone:", ps)
+ sender_phone_text = Paragraph(escape(sender_phone[:64]), ps)
+
+ sender_email_label = Paragraph("Email:", ps)
+ sender_email_text = Paragraph(escape(sender_email[:64]), ps)
+
+ regarding_label = Paragraph("Regarding:", ps)
+ regarding_text = Paragraph(escape(regarding[:128]), ps)
+
+ date_time_label = Paragraph("Date:", ps)
+ date_time_text = Paragraph(strftime("%a, %d %b %Y %H:%M:%S (%Z)", localtime()), ps)
+
+ total_pages_label = Paragraph("Total Pages:", ps)
+ total_pages_text = Paragraph("%d" % total_pages, ps)
+
+ data = [[recipient_name_label, recipient_name_text, sender_name_label, sender_name_text],
+ [recipient_fax_label, recipient_fax_text, sender_phone_label, sender_phone_text],
+ [date_time_label, date_time_text, sender_email_label, sender_email_text],
+ [regarding_label, regarding_text, total_pages_label, total_pages_text]]
+
+ LIST_STYLE = TableStyle([#('LINEABOVE', (0,0), (-1,0), 2, colors.black),
+ #('LINEABOVE', (0,1), (-1,-1), 0.25, colors.black),
+ #('LINEBELOW', (0,-1), (-1,-1), 2, colors.black),
+ ('ALIGN', (1,1), (-1,-1), 'RIGHT'),
+ ('VALIGN', (0, 0), (-1, -1), 'TOP'),
+ ])
+
+ story.append(HRFlowable(width='100%', color='black'))
+
+ story.append(Table(data, style=LIST_STYLE))
+
+ if message:
+ MSG_STYLE = TableStyle([#('LINEABOVE', (0,0), (-1,0), 2, colors.black),
+ #('LINEABOVE', (0,1), (-1,-1), 0.25, colors.black),
+ #('LINEBELOW', (0,-1), (-1,-1), 2, colors.black),
+ ('ALIGN', (1,1), (-1,-1), 'RIGHT'),
+ ('VALIGN', (0, 0), (-1, -1), 'TOP'),
+ ('SPAN', (-2, 1), (-1, -1)),
+ ])
+
+ story.append(HRFlowable(width='100%', color='black'))
+ story.append(Spacer(1, 0.5*inch))
+
+ if preserve_formatting:
+ message = '\n'.join(message[:2048].splitlines()[:32])
+
+ data = [[Paragraph("Comments/Notes:", ps), ''],
+ [Preformatted(escape(message), ps), ''],]
+ else:
+ data = [[Paragraph("Comments/Notes:", ps), ''],
+ [Paragraph(escape(message[:2048]), ps), ''],]
+
+ story.append(HRFlowable(width='100%', color='black'))
+ story.append(Table(data, style=MSG_STYLE))
+ story.append(HRFlowable(width='100%', color='black'))
+
+ if page_size == PAGE_SIZE_LETTER:
+ pgsz = letter
+ elif page_size == PAGE_SIZE_LEGAL:
+ pgsz = legal
+ else:
+ pgsz = A4
+
+ if output is None:
+ f_fd, f = utils.make_temp_file()
+ else:
+ f = output
+
+ doc = SimpleDocTemplate(f, pagesize=pgsz)
+ doc.build(story)
+
+ return f
+
+
+def createConfidentialCoverPage(page_size=PAGE_SIZE_LETTER,
+ total_pages=1,
+ recipient_name='',
+ recipient_phone='',
+ recipient_fax='',
+ sender_name='',
+ sender_phone='',
+ sender_fax='',
+ sender_email='',
+ regarding='',
+ message='',
+ preserve_formatting=False,
+ output=None):
+
+ s = getSampleStyleSheet()
+
+ story = []
+
+ story.append(Image(os.path.join(prop.image_dir, 'other', 'confidential_title.png')))
+ story.append(Spacer(1, inch))
+ story.append(HRFlowable(width='100%', color='black'))
+
+ ps = ParagraphStyle(name='normal',
+ fontName='Times-Roman',
+ #fontName='STSong-Light',
+ #fontName='UMing',
+ fontSize=12)
+
+ recipient_name_label = Paragraph("To:", ps)
+ recipient_name_text = Paragraph(escape(recipient_name[:64]), ps)
+
+ recipient_fax_label = Paragraph("Fax:", ps)
+ recipient_fax_text = Paragraph(escape(recipient_fax[:64]), ps)
+
+ recipient_phone_label = Paragraph("Phone:", ps)
+ recipient_phone_text = Paragraph(escape(recipient_phone[:64]), ps)
+
+ sender_name_label = Paragraph("From:", ps)
+ sender_name_text = Paragraph(escape(sender_name[:64]), ps)
+
+ sender_phone_label = Paragraph("Phone:", ps)
+ sender_phone_text = Paragraph(escape(sender_phone[:64]), ps)
+
+ sender_email_label = Paragraph("Email:", ps)
+ sender_email_text = Paragraph(escape(sender_email[:64]), ps)
+
+ regarding_label = Paragraph("Regarding:", ps)
+ regarding_text = Paragraph(escape(regarding[:128]), ps)
+
+ date_time_label = Paragraph("Date:", ps)
+ date_time_text = Paragraph(strftime("%a, %d %b %Y %H:%M:%S (%Z)", localtime()), ps)
+
+ total_pages_label = Paragraph("Total Pages:", ps)
+ total_pages_text = Paragraph("%d" % total_pages, ps)
+
+ data = [[recipient_name_label, recipient_name_text],
+ [recipient_fax_label, recipient_fax_text],
+ ['', ''],
+ [sender_name_label, sender_name_text],
+ [sender_phone_label, sender_phone_text],
+ [sender_email_label, sender_email_text],
+ ['', ''],
+ [date_time_label, date_time_text],
+ [total_pages_label, total_pages_text],
+ [regarding_label, regarding_text],]
+
+ LIST_STYLE = TableStyle([#('LINEABOVE', (0,0), (-1,0), 2, colors.black),
+ #('LINEABOVE', (0,1), (-1,-1), 0.25, colors.black),
+ #('LINEBELOW', (0,-1), (-1,-1), 2, colors.black),
+ ('ALIGN', (1,1), (-1,-1), 'RIGHT'),
+ ('VALIGN', (0, 0), (-1, -1), 'TOP'),
+ ])
+
+
+ story.append(Table(data, style=LIST_STYLE))
+ story.append(HRFlowable(width='100%', color='black'))
+
+ if message:
+ MSG_STYLE = TableStyle([#('LINEABOVE', (0,0), (-1,0), 2, colors.black),
+ #('LINEABOVE', (0,1), (-1,-1), 0.25, colors.black),
+ #('LINEBELOW', (0,-1), (-1,-1), 2, colors.black),
+ ('ALIGN', (1,1), (-1,-1), 'RIGHT'),
+ ('VALIGN', (0, 0), (-1, -1), 'TOP'),
+ #('SPAN', (-2, 1), (-1, -1)),
+ ])
+
+ #story.append(HRFlowable(width='100%', color='black'))
+ story.append(Spacer(1, 0.5*inch))
+
+# if preserve_formatting:
+# message = '\n'.join(message[:2048].splitlines()[:32])
+#
+# data = [#[Paragraph("Comments/Notes:", ps), ''],
+# [Preformatted(escape(message), ps)],]
+# else:
+# data = [#[Paragraph("Comments/Notes:", ps), ''],
+# [Paragraph(escape(message[:2048]), ps), ''],]
+#
+# #story.append(HRFlowable(width='100%', color='black'))
+# #story.append(Table(data, style=MSG_STYLE))
+
+ if preserve_formatting:
+ message = '\n'.join(message[:2048].splitlines()[:32])
+ story.append(Preformatted(escape(message), ps))
+ else:
+ story.append(Paragraph(escape(message), ps))
+
+
+ if page_size == PAGE_SIZE_LETTER:
+ pgsz = letter
+ elif page_size == PAGE_SIZE_LEGAL:
+ pgsz = legal
+ else:
+ pgsz = A4
+
+ if output is None:
+ f_fd, f = utils.make_temp_file()
+ else:
+ f = output
+
+ doc = SimpleDocTemplate(f, pagesize=pgsz)
+ doc.build(story)
+
+ return f
+
+
+def createGenericCoverPage(page_size=PAGE_SIZE_LETTER,
+ total_pages=1,
+ recipient_name='',
+ recipient_phone='',
+ recipient_fax='',
+ sender_name='',
+ sender_phone='',
+ sender_fax='',
+ sender_email='',
+ regarding='',
+ message='',
+ preserve_formatting=False,
+ output=None):
+
+ s = getSampleStyleSheet()
+
+ story = []
+
+ i = Image(os.path.join(prop.image_dir, 'other', 'generic_title.png'), width=250, height=147)
+ i.hAlign = 'LEFT'
+ story.append(i)
+ #story.append(Spacer(1, inch))
+ story.append(HRFlowable(width='100%', color='black'))
+
+ ps = ParagraphStyle(name='normal',
+ fontName='Times-Roman',
+ #fontName='STSong-Light',
+ #fontName='UMing',
+ fontSize=12)
+
+ recipient_name_label = Paragraph("To:", ps)
+ recipient_name_text = Paragraph(escape(recipient_name[:64]), ps)
+
+ recipient_fax_label = Paragraph("Fax:", ps)
+ recipient_fax_text = Paragraph(escape(recipient_fax[:64]), ps)
+
+ recipient_phone_label = Paragraph("Phone:", ps)
+ recipient_phone_text = Paragraph(escape(recipient_phone[:64]), ps)
+
+ sender_name_label = Paragraph("From:", ps)
+ sender_name_text = Paragraph(escape(sender_name[:64]), ps)
+
+ sender_phone_label = Paragraph("Phone:", ps)
+ sender_phone_text = Paragraph(escape(sender_phone[:64]), ps)
+
+ sender_email_label = Paragraph("Email:", ps)
+ sender_email_text = Paragraph(escape(sender_email[:64]), ps)
+
+ regarding_label = Paragraph("Regarding:", ps)
+ regarding_text = Paragraph(escape(regarding[:128]), ps)
+
+ date_time_label = Paragraph("Date:", ps)
+ date_time_text = Paragraph(strftime("%a, %d %b %Y %H:%M:%S (%Z)", localtime()), ps)
+
+ total_pages_label = Paragraph("Total Pages:", ps)
+ total_pages_text = Paragraph("%d" % total_pages, ps)
+
+ data = [[recipient_name_label, recipient_name_text],
+ [recipient_fax_label, recipient_fax_text],
+ ['', ''],
+ [sender_name_label, sender_name_text],
+ [sender_phone_label, sender_phone_text],
+ [sender_email_label, sender_email_text],
+ ['', ''],
+ [date_time_label, date_time_text],
+ [total_pages_label, total_pages_text],
+ [regarding_label, regarding_text],]
+
+ LIST_STYLE = TableStyle([#('LINEABOVE', (0,0), (-1,0), 2, colors.black),
+ #('LINEABOVE', (0,1), (-1,-1), 0.25, colors.black),
+ #('LINEBELOW', (0,-1), (-1,-1), 2, colors.black),
+ ('ALIGN', (1,1), (-1,-1), 'RIGHT'),
+ ('VALIGN', (0, 0), (-1, -1), 'TOP'),
+ ])
+
+
+ story.append(Table(data, style=LIST_STYLE))
+ story.append(HRFlowable(width='100%', color='black'))
+
+ if message:
+ MSG_STYLE = TableStyle([#('LINEABOVE', (0,0), (-1,0), 2, colors.black),
+ #('LINEABOVE', (0,1), (-1,-1), 0.25, colors.black),
+ #('LINEBELOW', (0,-1), (-1,-1), 2, colors.black),
+ ('ALIGN', (1,1), (-1,-1), 'RIGHT'),
+ ('VALIGN', (0, 0), (-1, -1), 'TOP'),
+ #('SPAN', (-2, 1), (-1, -1)),
+ ])
+
+ #story.append(HRFlowable(width='100%', color='black'))
+ story.append(Spacer(1, 0.5*inch))
+
+# if preserve_formatting:
+# message = '\n'.join(message[:2048].splitlines()[:32])
+#
+# data = [#[Paragraph("Comments/Notes:", ps), ''],
+# [Preformatted(escape(message), ps)],]
+# else:
+# data = [#[Paragraph("Comments/Notes:", ps), ''],
+# [Paragraph(escape(message[:2048]), ps), ''],]
+#
+# #story.append(HRFlowable(width='100%', color='black'))
+# #story.append(Table(data, style=MSG_STYLE))
+
+ if preserve_formatting:
+ message = '\n'.join(message[:2048].splitlines()[:32])
+ story.append(Preformatted(escape(message), ps))
+ else:
+ story.append(Paragraph(escape(message), ps))
+
+ #
+
+ if page_size == PAGE_SIZE_LETTER:
+ pgsz = letter
+ elif page_size == PAGE_SIZE_LEGAL:
+ pgsz = legal
+ else:
+ pgsz = A4
+
+ if output is None:
+ f_fd, f = utils.make_temp_file()
+ else:
+ f = output
+
+ doc = SimpleDocTemplate(f, pagesize=pgsz)
+ doc.build(story)
+
+ return f
+
+
+def createUrgentCoverPage(page_size=PAGE_SIZE_LETTER,
+ total_pages=1,
+ recipient_name='',
+ recipient_phone='',
+ recipient_fax='',
+ sender_name='',
+ sender_phone='',
+ sender_fax='',
+ sender_email='',
+ regarding='',
+ message='',
+ preserve_formatting=False,
+ output=None):
+
+ s = getSampleStyleSheet()
+
+ story = []
+ i = Image(os.path.join(prop.image_dir, 'other', 'urgent_title.png'), width=424, height=92)
+ i.hAlign = 'LEFT'
+ story.append(i)
+ story.append(Spacer(1, inch))
+ story.append(HRFlowable(width='100%', color='black'))
+
+ ps = ParagraphStyle(name='normal',
+ fontName='Times-Roman',
+ #fontName='STSong-Light',
+ #fontName='UMing',
+ fontSize=12)
+
+ recipient_name_label = Paragraph("To:", ps)
+ recipient_name_text = Paragraph(escape(recipient_name[:64]), ps)
+
+ recipient_fax_label = Paragraph("Fax:", ps)
+ recipient_fax_text = Paragraph(escape(recipient_fax[:64]), ps)
+
+ recipient_phone_label = Paragraph("Phone:", ps)
+ recipient_phone_text = Paragraph(escape(recipient_phone[:64]), ps)
+
+ sender_name_label = Paragraph("From:", ps)
+ sender_name_text = Paragraph(escape(sender_name[:64]), ps)
+
+ sender_phone_label = Paragraph("Phone:", ps)
+ sender_phone_text = Paragraph(escape(sender_phone[:64]), ps)
+
+ sender_email_label = Paragraph("Email:", ps)
+ sender_email_text = Paragraph(escape(sender_email[:64]), ps)
+
+ regarding_label = Paragraph("Regarding:", ps)
+ regarding_text = Paragraph(escape(regarding[:128]), ps)
+
+ date_time_label = Paragraph("Date:", ps)
+ date_time_text = Paragraph(strftime("%a, %d %b %Y %H:%M:%S (%Z)", localtime()), ps)
+
+ total_pages_label = Paragraph("Total Pages:", ps)
+ total_pages_text = Paragraph("%d" % total_pages, ps)
+
+ data = [[recipient_name_label, recipient_name_text],
+ [recipient_fax_label, recipient_fax_text],
+ ['', ''],
+ [sender_name_label, sender_name_text],
+ [sender_phone_label, sender_phone_text],
+ [sender_email_label, sender_email_text],
+ ['', ''],
+ [date_time_label, date_time_text],
+ [total_pages_label, total_pages_text],
+ [regarding_label, regarding_text],]
+
+ LIST_STYLE = TableStyle([#('LINEABOVE', (0,0), (-1,0), 2, colors.black),
+ #('LINEABOVE', (0,1), (-1,-1), 0.25, colors.black),
+ #('LINEBELOW', (0,-1), (-1,-1), 2, colors.black),
+ ('ALIGN', (1,1), (-1,-1), 'RIGHT'),
+ ('VALIGN', (0, 0), (-1, -1), 'TOP'),
+ ])
+
+
+ story.append(Table(data, style=LIST_STYLE))
+ story.append(HRFlowable(width='100%', color='black'))
+
+ if message:
+ MSG_STYLE = TableStyle([#('LINEABOVE', (0,0), (-1,0), 2, colors.black),
+ #('LINEABOVE', (0,1), (-1,-1), 0.25, colors.black),
+ #('LINEBELOW', (0,-1), (-1,-1), 2, colors.black),
+ ('ALIGN', (1,1), (-1,-1), 'RIGHT'),
+ ('VALIGN', (0, 0), (-1, -1), 'TOP'),
+ #('SPAN', (-2, 1), (-1, -1)),
+ ])
+
+ #story.append(HRFlowable(width='100%', color='black'))
+ story.append(Spacer(1, 0.5*inch))
+
+# if preserve_formatting:
+# message = '\n'.join(message[:2048].splitlines()[:32])
+#
+# data = [#[Paragraph("Comments/Notes:", ps), ''],
+# [Preformatted(escape(message), ps)],]
+# else:
+# data = [#[Paragraph("Comments/Notes:", ps), ''],
+# [Paragraph(escape(message[:2048]), ps), ''],]
+#
+# #story.append(HRFlowable(width='100%', color='black'))
+# #story.append(Table(data, style=MSG_STYLE))
+
+ if preserve_formatting:
+ message = '\n'.join(message[:2048].splitlines()[:32])
+ story.append(Preformatted(escape(message), ps))
+ else:
+ story.append(Paragraph(escape(message), ps))
+
+
+ if page_size == PAGE_SIZE_LETTER:
+ pgsz = letter
+ elif page_size == PAGE_SIZE_LEGAL:
+ pgsz = legal
+ else:
+ pgsz = A4
+
+ if output is None:
+ f_fd, f = utils.make_temp_file()
+ else:
+ f = output
+
+ doc = SimpleDocTemplate(f, pagesize=pgsz)
+ doc.build(story)
+
+ return f
+
+
+# { "name" : (function, "thumbnail.png"), ... }
+COVERPAGES = { "basic": (createStandardCoverPage, 'standard_coverpage.png'),
+ "confidential": (createConfidentialCoverPage, 'confidential_coverpage.png'),
+ "generic": (createGenericCoverPage, "generic_coverpage.png"),
+ "urgent": (createUrgentCoverPage, "urgent_coverpage.png"),
+ }
+
+
+if __name__ == "__main__":
+ createUrgentCoverPage(page_size=PAGE_SIZE_LETTER,
+ total_pages=1,
+ recipient_name='Trex',
+ recipient_phone='+1 234-567-8912',
+ recipient_fax='+1 432 123 1234',
+ sender_name='Don',
+ sender_phone='+1 234 432 1234',
+ sender_fax='+1 567 876 5123 ',
+ sender_email='test@hplip.sf.net',
+ regarding='Some sorta stuff',
+ message="""Some HP printers require proprietary software technologies to allow full access to printer features and performance. These technologies cannot be open sourced. Because of this, HP uses a binary plug-in for these printers that work in conjunction with our Linux Open Source Printing Software to improve the printing experience for HP’s Linux Printing Customers. This binary plug-in requires the user to read and agree to a license agreement at the time of driver installation. There is a single plug-in file (for each HPLIP release) for all plug-in enabled devices.""",
+ preserve_formatting=False,
+ output="output.pdf")
+
+
diff --git a/fax/fax.py b/fax/fax.py
new file mode 100644
index 0000000..58a0e29
--- /dev/null
+++ b/fax/fax.py
@@ -0,0 +1,972 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2010 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+from __future__ import generators
+
+# Std Lib
+import sys
+import os
+import threading
+import cPickle
+import time
+from cStringIO import StringIO
+import struct
+
+# Local
+from base.g import *
+from base.codes import *
+from base.ldif import LDIFParser
+from base import device, utils, vcard
+from prnt import cups
+
+try:
+ import coverpages
+except ImportError:
+ pass
+
+try:
+ import dbus
+except ImportError:
+ log.error("dbus is required for PC send fax.")
+
+import warnings
+# Ignore: .../dbus/connection.py:242: DeprecationWarning: object.__init__() takes no parameters
+# (occurring on Python 2.6/dBus 0.83/Ubuntu 9.04)
+warnings.simplefilter("ignore", DeprecationWarning)
+
+
+# Update queue values (Send thread ==> UI)
+STATUS_IDLE = 0
+STATUS_PROCESSING_FILES = 1
+STATUS_SENDING_TO_RECIPIENT = 2
+STATUS_DIALING = 3
+STATUS_CONNECTING = 4
+STATUS_SENDING = 5
+STATUS_COMPLETED = 6
+STATUS_CREATING_COVER_PAGE = 7
+STATUS_ERROR = 8
+STATUS_BUSY = 9
+STATUS_CLEANUP = 10
+STATUS_ERROR_IN_CONNECTING = 11
+STATUS_ERROR_IN_TRANSMITTING = 12
+STATUS_ERROR_PROBLEM_IN_FAXLINE = 13
+STATUS_JOB_CANCEL = 14
+
+# Event queue values (UI ==> Send thread)
+EVENT_FAX_SEND_CANCELED = 1
+# Other values in queue are:
+#EVENT_FAX_RENDER_COMPLETE_BEGIN = 8010
+#EVENT_FAX_RENDER_COMPLETE_SENDDATA = 8011
+#EVENT_FAX_RENDER_COMPLETE_END = 8012
+
+# **************************************************************************** #
+# HPLIP G3 Fax File Format (big endian)
+#
+# #==============================================#
+# # File Header: Total 28 bytes #
+# #..............................................#
+# # Magic bytes: 8 bytes ("hplip_g3") #
+# # Format version: 8 bits (1) #
+# # Total pages in file(=p): 32 bits #
+# # Hort DPI: 16 bits (200 or 300) #
+# # Vert DPI: 16 bits (100, 200, or 300) #
+# # Page Size: 8 bits (0=Unk, 1=Letter, 2=A4, #
+# # 3=Legal) #
+# # Resolution: 8 bits (0=Unk, 1=Std, 2=Fine, #
+# # 3=300DPI) #
+# # Encoding: 8 bits (2=MH, 4=MMR, 7=JPEG) #
+# # Reserved1: 32 bits (0) #
+# # Reserved2: 32 bits (0) #
+# #----------------------------------------------#
+# # Page 1 Header: Total 24 bytes #
+# #..............................................#
+# # Page number: 32 bits (1 based) #
+# # Pixels per row: 32 bits #
+# # Rows this page: 32 bits #
+# # Image bytes this page(=x): 32 bits #
+# # Thumbnail bytes this page(=y): 32 bits #
+# # (thumbnail not present if y == 0) #
+# # (encoding?) #
+# # letter: 134 px wide x 173 px high #
+# # legal: 134 px wide x 221 px high #
+# # a4 : 134 px wide x 190 px high #
+# # Reserved3: 32 bits (0) #
+# #..............................................#
+# # Image data: x bytes #
+# #..............................................#
+# # Thumbnail data: y bytes (if present) #
+# #----------------------------------------------#
+# # Page 2 Header: Total 24 bytes #
+# #..............................................#
+# # Image Data #
+# #..............................................#
+# # Thumbnail data (if present) #
+# #----------------------------------------------#
+# # ... Pages 3 - (p-1) ... #
+# #----------------------------------------------#
+# # Page p Header: Total 24 bytes #
+# #..............................................#
+# # Image Data #
+# #..............................................#
+# # Thumbnail data (if present) #
+# #==============================================#
+#
+
+RESOLUTION_STD = 1
+RESOLUTION_FINE = 2
+RESOLUTION_300DPI = 3
+
+FILE_HEADER_SIZE = 28
+PAGE_HEADER_SIZE = 24
+# **************************************************************************** #
+
+##skip_dn = ["uid=foo,ou=People,dc=example,dc=com",
+## "uid=bar,ou=People,dc=example,dc=com", "dc=example,dc=com"]
+
+class FaxLDIFParser(LDIFParser):
+ def __init__(self, input, db):
+ LDIFParser.__init__(self, input)
+ self.db = db
+
+ def handle(self, dn, entry):
+ if dn:
+ try:
+ firstname = entry['givenName'][0]
+ except KeyError:
+ try:
+ firstname = entry['givenname'][0]
+ except KeyError:
+ firstname = ''
+
+ try:
+ lastname = entry['sn'][0]
+ except KeyError:
+ lastname = ''
+
+ try:
+ nickname = entry['cn'][0]
+ except KeyError:
+ nickname = firstname + ' ' + lastname
+
+ try:
+ fax = entry['facsimiletelephonenumber'][0] # fax
+ except KeyError:
+ try:
+ fax = entry['fax'][0]
+ except KeyError:
+ fax = ''
+
+ grps = []
+ try:
+ grps = entry['ou']
+ except KeyError:
+ pass
+
+ grps.append(u'All')
+ groups = [g for g in grps if g]
+
+ if nickname:
+ log.debug("Import: name=%s, fax=%s, group(s)=%s, notes=%s" % ( nickname, fax, ','.join(groups), dn))
+ self.db.set(nickname, title, firstname, lastname, fax, groups, dn)
+
+
+
+# **************************************************************************** #
+class FaxAddressBook(object): # Pickle based address book
+ def __init__(self):
+ self._data = {}
+ #
+ # { 'name' : {'name': u'',
+ # 'firstname' : u'', # NOT USED STARTING IN 2.8.9
+ # 'lastname': u', # NOT USED STARTING IN 2.8.9
+ # 'title' : u'', # NOT USED STARTING IN 2.8.9
+ # 'fax': u'',
+ # 'groups' : [u'', u'', ...],
+ # 'notes' : u'', } ...
+ # }
+ #
+ self.load()
+
+ def load(self):
+ self._fab = "/dev/null"
+ if prop.user_dir != None:
+ self._fab = os.path.join(prop.user_dir, "fab.pickle")
+ #old_fab = os.path.join(prop.user_dir, "fab.db")
+
+ # Load the existing pickle if present
+ if os.path.exists(self._fab):
+ pickle_file = open(self._fab, "r")
+ self._data = cPickle.load(pickle_file)
+ pickle_file.close()
+ else:
+ self.save() # save the empty file to create the file
+
+
+ def set(self, name, title, firstname, lastname, fax, groups, notes):
+ try:
+ grps = [unicode(s) for s in groups]
+ except UnicodeDecodeError:
+ grps = [unicode(s.decode('utf-8')) for s in groups]
+
+ self._data[unicode(name)] = {'name' : unicode(name),
+ 'title': unicode(title), # NOT USED STARTING IN 2.8.9
+ 'firstname': unicode(firstname), # NOT USED STARTING IN 2.8.9
+ 'lastname': unicode(lastname), # NOT USED STARTING IN 2.8.9
+ 'fax': unicode(fax),
+ 'notes': unicode(notes),
+ 'groups': grps}
+
+ self.save()
+
+ insert = set
+
+
+ def set_key_value(self, name, key, value):
+ self._data[unicode(name)][key] = value
+ self.save()
+
+
+ def get(self, name):
+ return self._data.get(name, None)
+
+ select = get
+
+ def rename(self, old_name, new_name):
+ try:
+ self._data[old_name]
+ except KeyError:
+ return
+ else:
+ try:
+ self._data[new_name]
+ except KeyError:
+ self._data[new_name] = self._data[old_name].copy()
+ self._data[new_name]['name'] = new_name
+ del self._data[old_name]
+ self.save()
+
+
+ def get_all_groups(self):
+ all_groups = []
+ for e, v in self._data.items():
+ for g in v['groups']:
+ if g not in all_groups:
+ all_groups.append(g)
+ return all_groups
+
+
+ def get_all_records(self):
+ return self._data
+
+
+ def get_all_names(self):
+ return self._data.keys()
+
+
+ def save(self):
+ try:
+ pickle_file = open(self._fab, "w")
+ cPickle.dump(self._data, pickle_file, cPickle.HIGHEST_PROTOCOL)
+ pickle_file.close()
+ except IOError:
+ log.error("I/O error saving fab file.")
+
+
+ def clear(self):
+ self._data = {}
+ self.save()
+
+
+ def delete(self, name):
+ if name in self._data:
+ del self._data[name]
+ self.save()
+ return True
+
+ return False
+
+
+ def last_modification_time(self):
+ try:
+ return os.stat(self._fab).st_mtime
+ except OSError:
+ return 0
+
+
+ def update_groups(self, group, members):
+ for e, v in self._data.items():
+ if v['name'] in members: # membership indicated
+ if not group in v['groups']:
+ v['groups'].append(unicode(group))
+ else:
+ if group in v['groups']:
+ v['groups'].remove(unicode(group))
+ self.save()
+
+
+ def delete_group(self, group):
+ for e, v in self._data.items():
+ if group in v['groups']:
+ v['groups'].remove(unicode(group))
+ self.save()
+
+
+ def group_members(self, group):
+ members = []
+ for e, v in self._data.items():
+ if group in v['groups']:
+ members.append(e)
+ return members
+
+
+ def add_to_group(self, group, members):
+ group_members = self.group_members(group)
+ new_group_members = []
+ for m in members:
+ if m not in group_members:
+ new_group_members.append(m)
+
+ self.update_groups(group, group_members + new_group_members)
+
+
+ def remove_from_group(self, group, remove_members):
+ group_members = self.group_members(group)
+ new_group_members = []
+ for m in group_members:
+ if m not in remove_members:
+ new_group_members.append(m)
+
+ self.update_groups(group, new_group_members)
+
+
+ def rename_group(self, old_group, new_group):
+ members = self.group_members(old_group)
+ self.update_groups(old_group, [])
+ self.update_groups(new_group, members)
+
+
+ def import_ldif(self, filename):
+ try:
+ data = open(filename, 'r').read()
+ log.debug_block(filename, data)
+ parser = FaxLDIFParser(open(filename, 'r'), self)
+ parser.parse()
+ self.save()
+ return True, ''
+ except ValueError, e:
+ return False, e.message
+
+
+ def import_vcard(self, filename):
+ data = file(filename, 'r').read()
+ log.debug_block(filename, data)
+
+ for card in vcard.VCards(vcard.VFile(vcard.opentextfile(filename))):
+ log.debug(card)
+
+ if card['name']:
+ fax = ''
+ for x in range(1, 9999):
+ if x == 1:
+ s = 'phone'
+ else:
+ s = 'phone%d' % x
+
+ try:
+ card[s]
+ except KeyError:
+ break
+ else:
+ if 'fax' in card[s]['type']:
+ fax = card[s]['number']
+ break
+
+ org = card.get('organisation', '')
+ if org:
+ org = [org]
+ else:
+ org = card.get('categories', '').split(';')
+ if not org:
+ org = []
+
+ org.append(u'All')
+ groups = [o for o in org if o]
+
+ name = card['name']
+ notes = card.get('notes', u'')
+ log.debug("Import: name=%s, fax=%s group(s)=%s notes=%s" % (name, fax, ','.join(groups), notes))
+ self.set(name, u'', u'', u'', fax, groups, notes)
+
+ return True, ''
+
+
+# **************************************************************************** #
+class FaxDevice(device.Device):
+
+ def __init__(self, device_uri=None, printer_name=None,
+ callback=None,
+ fax_type=FAX_TYPE_NONE,
+ disable_dbus=False):
+
+ device.Device.__init__(self, device_uri, printer_name,
+ None, callback, disable_dbus)
+
+ self.send_fax_thread = None
+ self.upload_log_thread = None
+ self.fax_type = fax_type
+
+ if not disable_dbus:
+ session_bus = dbus.SessionBus()
+ self.service = session_bus.get_object('com.hplip.StatusService', "/com/hplip/StatusService")
+ else:
+ self.service = None
+
+
+ def setPhoneNum(self, num):
+ raise AttributeError
+
+ def getPhoneNum(self):
+ raise AttributeError
+
+ phone_num = property(getPhoneNum, setPhoneNum)
+
+
+ def setStationName(self, name):
+ raise AttributeError
+
+ def getStationName(self):
+ raise AttributeError
+
+ station_name = property(getStationName, setStationName)
+
+ def setDateAndTime(self):
+ raise AttributeError
+
+ def uploadLog(self):
+ raise AttributeError
+
+ def isUploadLogActive(self):
+ raise AttributeError
+
+ def waitForUploadLogThread(self):
+ raise AttributeError
+
+ def sendFaxes(self, phone_num_list, fax_file_list, cover_message='', cover_re='',
+ cover_func=None, preserve_formatting=False, printer_name='',
+ update_queue=None, event_queue=None):
+
+ raise AttributeError
+
+ def isSendFaxActive(self):
+ if self.send_fax_thread is not None:
+ return self.send_fax_thread.isAlive()
+ else:
+ return False
+
+ def waitForSendFaxThread(self):
+ if self.send_fax_thread is not None and \
+ self.send_fax_thread.isAlive():
+
+ try:
+ self.send_fax_thread.join()
+ except KeyboardInterrupt:
+ pass
+
+
+# **************************************************************************** #
+
+
+def getFaxDevice(device_uri=None, printer_name=None,
+ callback=None,
+ fax_type=FAX_TYPE_NONE,
+ disable_dbus=False):
+
+ if fax_type == FAX_TYPE_NONE:
+ if device_uri is None and printer_name is not None:
+ printers = cups.getPrinters()
+
+ for p in printers:
+ if p.name.lower() == printer_name.lower():
+ device_uri = p.device_uri
+ break
+ else:
+ raise Error(ERROR_DEVICE_NOT_FOUND)
+
+ if device_uri is not None:
+ mq = device.queryModelByURI(device_uri)
+ fax_type = mq['fax-type']
+
+ log.debug("fax-type=%d" % fax_type)
+
+ if fax_type in (FAX_TYPE_BLACK_SEND_EARLY_OPEN, FAX_TYPE_BLACK_SEND_LATE_OPEN):
+ from pmlfax import PMLFaxDevice
+ return PMLFaxDevice(device_uri, printer_name, callback, fax_type, disable_dbus)
+
+ elif fax_type == FAX_TYPE_SOAP:
+ from soapfax import SOAPFaxDevice
+ return SOAPFaxDevice(device_uri, printer_name, callback, fax_type, disable_dbus)
+
+ elif fax_type == FAX_TYPE_LEDMSOAP:
+ from ledmsoapfax import LEDMSOAPFaxDevice
+ return LEDMSOAPFaxDevice(device_uri, printer_name, callback, fax_type, disable_dbus)
+
+ elif fax_type == FAX_TYPE_MARVELL:
+ from marvellfax import MarvellFaxDevice
+ return MarvellFaxDevice(device_uri, printer_name, callback, fax_type, disable_dbus)
+
+ elif fax_type == FAX_TYPE_LEDM:
+ from ledmfax import LEDMFaxDevice
+ return LEDMFaxDevice(device_uri, printer_name, callback, fax_type, disable_dbus)
+
+ else:
+ raise Error(ERROR_DEVICE_DOES_NOT_SUPPORT_OPERATION)
+
+# **************************************************************************** #
+
+
+
+
+# TODO: Define these in only 1 place!
+STATE_DONE = 0
+STATE_ABORTED = 10
+STATE_SUCCESS = 20
+STATE_BUSY = 25
+STATE_READ_SENDER_INFO = 30
+STATE_PRERENDER = 40
+STATE_COUNT_PAGES = 50
+STATE_NEXT_RECIPIENT = 60
+STATE_COVER_PAGE = 70
+STATE_SINGLE_FILE = 80
+STATE_MERGE_FILES = 90
+STATE_SINGLE_FILE = 100
+STATE_SEND_FAX = 110
+STATE_CLEANUP = 120
+STATE_ERROR = 130
+
+class FaxSendThread(threading.Thread):
+ def __init__(self, dev, service, phone_num_list, fax_file_list,
+ cover_message='', cover_re='', cover_func=None, preserve_formatting=False,
+ printer_name='', update_queue=None, event_queue=None):
+
+ threading.Thread.__init__(self)
+
+ self.dev = dev # device.Device
+ self.service = service # dbus proxy to status server object
+ self.phone_num_list = phone_num_list
+ self.fax_file_list = fax_file_list
+ self.update_queue = update_queue
+ self.event_queue = event_queue
+ self.cover_message = cover_message
+ self.cover_re = cover_re
+ self.cover_func = cover_func
+ self.current_printer = printer_name
+ self.stream = StringIO()
+ self.prev_update = ''
+ self.remove_temp_file = False
+ self.preserve_formatting = preserve_formatting
+ self.results = {} # {'file' : error_code,...}
+ self.cover_page_present = False
+ self.recipient_file_list = []
+ self.f = None # final file of fax data to send (pages merged)
+ self.job_hort_dpi = 0
+ self.job_hort_dpi = 0
+ self.job_vert_dpi = 0
+ self.job_page_size = 0
+ self.job_resolution = 0
+ self.job_encoding = 0
+
+
+ def pre_render(self, state):
+ # pre-render each page that needs rendering
+ # except for the cover page
+ self.cover_page_present = False
+ log.debug(self.fax_file_list)
+
+ for fax_file in self.fax_file_list: # (file, type, desc, title)
+ fax_file_name, fax_file_type, fax_file_desc, \
+ fax_file_title, fax_file_pages = fax_file
+
+ if fax_file_type == "application/hplip-fax-coverpage": # render later
+ self.cover_page_present = True
+ log.debug("Skipping coverpage")
+
+ #if fax_file_type == "application/hplip-fax": # already rendered
+ else:
+ self.rendered_file_list.append((fax_file_name, "application/hplip-fax",
+ "HP Fax", fax_file_title))
+
+ log.debug("Processing pre-rendered file: %s (%d pages)" %
+ (fax_file_name, fax_file_pages))
+
+ if self.check_for_cancel():
+ state = STATE_ABORTED
+
+ log.debug(self.rendered_file_list)
+
+ if self.check_for_cancel():
+ state = STATE_ABORTED
+
+ return state
+
+
+ def count_pages(self, state):
+ self.recipient_file_list = self.rendered_file_list[:]
+ log.debug("Counting total pages...")
+ self.job_total_pages = 0
+ log.debug(self.recipient_file_list)
+
+ i = 0
+ for fax_file in self.recipient_file_list: # (file, type, desc, title)
+ fax_file_name = fax_file[0]
+ log.debug("Processing file (counting pages): %s..." % fax_file_name)
+
+ #self.write_queue((STATUS_PROCESSING_FILES, self.job_total_pages, ''))
+
+ if os.path.exists(fax_file_name):
+ self.results[fax_file_name] = ERROR_SUCCESS
+ fax_file_fd = file(fax_file_name, 'r')
+ header = fax_file_fd.read(FILE_HEADER_SIZE)
+
+ magic, version, total_pages, hort_dpi, vert_dpi, page_size, \
+ resolution, encoding, reserved1, reserved2 = \
+ self.decode_fax_header(header)
+
+ if magic != 'hplip_g3':
+ log.error("Invalid file header. Bad magic.")
+ self.results[fax_file_name] = ERROR_FAX_INVALID_FAX_FILE
+ state = STATE_ERROR
+ continue
+
+ if not i:
+ self.job_hort_dpi, self.job_vert_dpi, self.job_page_size, \
+ self.job_resolution, self.job_encoding = \
+ hort_dpi, vert_dpi, page_size, resolution, encoding
+
+ i += 1
+ else:
+ if self.job_hort_dpi != hort_dpi or \
+ self.job_vert_dpi != vert_dpi or \
+ self.job_page_size != page_size or \
+ self.job_resolution != resolution or \
+ self.job_encoding != encoding:
+
+ log.error("Incompatible options for file: %s" % fax_file_name)
+ self.results[fax_file_name] = ERROR_FAX_INCOMPATIBLE_OPTIONS
+ state = STATE_ERROR
+
+
+ log.debug("Magic=%s Ver=%d Pages=%d hDPI=%d vDPI=%d Size=%d Res=%d Enc=%d" %
+ (magic, version, total_pages, hort_dpi,
+ vert_dpi, page_size, resolution, encoding))
+
+ self.job_total_pages += total_pages
+
+ fax_file_fd.close()
+
+ else:
+ log.error("Unable to find HP Fax file: %s" % fax_file_name)
+ self.results[fax_file_name] = ERROR_FAX_FILE_NOT_FOUND
+ state = STATE_ERROR
+ break
+
+ if self.check_for_cancel():
+ state = STATE_ABORTED
+ break
+
+
+ if self.cover_page_present:
+ self.job_total_pages += 1 # Cover pages are truncated to 1 page
+
+ log.debug("Total fax pages=%d" % self.job_total_pages)
+
+ return state
+
+ def decode_fax_header(self, header):
+ try:
+ return struct.unpack(">8sBIHHBBBII", header)
+ except struct.error:
+ return -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
+
+ def decode_page_header(self, header):
+ try:
+ return struct.unpack(">IIIIII", header)
+ except struct.error:
+ return -1, -1, -1, -1, -1, -1
+
+ def cover_page(self, recipient):
+ if self.job_total_pages > 1:
+ state = STATE_MERGE_FILES
+ else:
+ state = STATE_SINGLE_FILE
+
+ if self.cover_page_present:
+ log.debug("Creating cover page for recipient: %s" % recipient['name'])
+ fax_file, canceled = self.render_cover_page(recipient)
+
+ if canceled:
+ state = STATE_ABORTED
+ elif not fax_file:
+ state = STATE_ERROR # timeout
+ else:
+ self.recipient_file_list.insert(0, (fax_file, "application/hplip-fax",
+ "HP Fax", 'Cover Page'))
+
+ log.debug("Cover page G3 file: %s" % fax_file)
+
+ self.results[fax_file] = ERROR_SUCCESS
+
+ return state
+
+ def single_file(self, state):
+ state = STATE_SEND_FAX
+
+ log.debug("Processing single file...")
+ self.f = self.recipient_file_list[0][0]
+
+ try:
+ f_fd = file(self.f, 'r')
+ except IOError:
+ log.error("Unable to open fax file: %s" % self.f)
+ state = STATE_ERROR
+ else:
+ header = f_fd.read(FILE_HEADER_SIZE)
+
+ magic, version, total_pages, hort_dpi, vert_dpi, page_size, \
+ resolution, encoding, reserved1, reserved2 = self.decode_fax_header(header)
+
+ self.results[self.f] = ERROR_SUCCESS
+
+ if magic != 'hplip_g3':
+ log.error("Invalid file header. Bad magic.")
+ self.results[self.f] = ERROR_FAX_INVALID_FAX_FILE
+ state = STATE_ERROR
+
+ log.debug("Magic=%s Ver=%d Pages=%d hDPI=%d vDPI=%d Size=%d Res=%d Enc=%d" %
+ (magic, version, total_pages, hort_dpi, vert_dpi,
+ page_size, resolution, encoding))
+
+ f_fd.close()
+
+ return state
+
+
+ def merge_files(self, state):
+ log.debug("%s State: Merge multiple files" % ("*"*20))
+ log.debug(self.recipient_file_list)
+ log.debug("Merging g3 files...")
+ self.remove_temp_file = True
+
+ if self.job_total_pages:
+ f_fd, self.f = utils.make_temp_file()
+ log.debug("Temp file=%s" % self.f)
+
+ data = struct.pack(">8sBIHHBBBII", "hplip_g3", 1L, self.job_total_pages,
+ self.job_hort_dpi, self.job_vert_dpi, self.job_page_size,
+ self.job_resolution, self.job_encoding,
+ 0L, 0L)
+
+ os.write(f_fd, data)
+
+ job_page_num = 1
+
+ for fax_file in self.recipient_file_list:
+ fax_file_name = fax_file[0]
+ log.debug("Processing file: %s..." % fax_file_name)
+
+ if self.results[fax_file_name] == ERROR_SUCCESS:
+ fax_file_fd = file(fax_file_name, 'r')
+ header = fax_file_fd.read(FILE_HEADER_SIZE)
+
+ magic, version, total_pages, hort_dpi, vert_dpi, page_size, \
+ resolution, encoding, reserved1, reserved2 = self.decode_fax_header(header)
+
+ if magic != 'hplip_g3':
+ log.error("Invalid file header. Bad magic.")
+ state = STATE_ERROR
+ break
+
+ log.debug("Magic=%s Ver=%d Pages=%d hDPI=%d vDPI=%d Size=%d Res=%d Enc=%d" %
+ (magic, version, total_pages, hort_dpi, vert_dpi, page_size, resolution, encoding))
+
+ for p in range(total_pages):
+ header = fax_file_fd.read(PAGE_HEADER_SIZE)
+
+ page_num, ppr, rpp, bytes_to_read, thumbnail_bytes, reserved2 = \
+ self.decode_page_header(header)
+
+ if page_num == -1:
+ log.error("Page header error")
+ state - STATE_ERROR
+ break
+
+ header = struct.pack(">IIIIII", job_page_num, ppr, rpp, bytes_to_read, thumbnail_bytes, 0L)
+ os.write(f_fd, header)
+
+ self.write_queue((STATUS_PROCESSING_FILES, job_page_num, ''))
+
+ log.debug("Page=%d PPR=%d RPP=%d BPP=%d Thumb=%s" %
+ (page_num, ppr, rpp, bytes_to_read, thumbnail_bytes))
+
+ os.write(f_fd, fax_file_fd.read(bytes_to_read))
+ job_page_num += 1
+
+ fax_file_fd.close()
+
+ if self.check_for_cancel():
+ state = STATE_ABORTED
+ break
+
+ else:
+ log.error("Skipping file: %s" % fax_file_name)
+ continue
+
+ os.close(f_fd)
+ log.debug("Total pages=%d" % self.job_total_pages)
+
+ return state
+
+
+ def next_recipient_gen(self):
+ for a in self.phone_num_list:
+ yield a
+
+ def next_file_gen(self):
+ for a in self.recipient_file_list:
+ yield a
+
+
+ def render_file(self, path, title, mime_type, force_single_page=False):
+ all_pages = True
+ page_range = ''
+ page_set = 0
+ nup = 1
+
+ cups.resetOptions()
+
+ if mime_type in ["application/x-cshell",
+ "application/x-perl",
+ "application/x-python",
+ "application/x-shell",
+ "application/x-sh",
+ "text/plain",]:
+
+ cups.addOption('prettyprint')
+
+ if nup > 1:
+ cups.addOption('number-up=%d' % nup)
+
+ if force_single_page:
+ cups.addOption('page-ranges=1') # Force coverpage to 1 page
+
+ sent_job_id = cups.printFile(self.current_printer, path, title)
+ cups.resetOptions()
+
+ log.debug("Job ID=%d" % sent_job_id)
+ job_id = 0
+
+ time.sleep(1)
+
+ fax_file = ''
+ complete = False
+
+ end_time = time.time() + 300.0 # wait for 5 min. max
+ while time.time() < end_time:
+ log.debug("Waiting for fax...")
+
+ result = list(self.service.CheckForWaitingFax(self.dev.device_uri, prop.username, sent_job_id))
+
+ fax_file = str(result[7])
+ log.debug("Fax file=%s" % fax_file)
+
+ if fax_file:
+ break
+
+ if self.check_for_cancel():
+ log.error("Render canceled. Canceling job #%d..." % sent_job_id)
+ cups.cancelJob(sent_job_id)
+ return '', True
+
+ time.sleep(1)
+
+ else:
+ log.error("Timeout waiting for rendering. Canceling job #%d..." % sent_job_id)
+ cups.cancelJob(sent_job_id)
+ return '', False
+
+ return fax_file, False
+
+
+ def check_for_cancel(self):
+ canceled = False
+ while self.event_queue.qsize():
+ try:
+ event = self.event_queue.get(0)
+ if event[0] == EVENT_FAX_SEND_CANCELED:
+ canceled = True
+ log.debug("Cancel pressed!")
+ except Queue.Empty:
+ break
+
+ return canceled
+
+ def render_cover_page(self, a):
+ log.debug("Creating cover page...")
+
+ pdf = self.cover_func(page_size=coverpages.PAGE_SIZE_LETTER,
+ total_pages=self.job_total_pages,
+
+ recipient_name=a['name'],
+ recipient_phone='', # ???
+ recipient_fax=a['fax'],
+
+ sender_name=self.sender_name,
+ sender_phone=user_conf.get('fax', 'voice_phone'),
+ sender_fax=self.sender_fax,
+ sender_email=user_conf.get('fax', 'email_address'),
+
+ regarding=self.cover_re,
+ message=self.cover_message,
+ preserve_formatting=self.preserve_formatting)
+
+ log.debug("PDF File=%s" % pdf)
+ fax_file, canceled = self.render_file(pdf, 'Cover Page', "application/pdf",
+ force_single_page=True)
+
+ try:
+ os.remove(pdf)
+ except IOError:
+ pass
+
+ return fax_file, canceled
+
+
+ def write_queue(self, message):
+ if self.update_queue is not None and message != self.prev_update:
+ self.update_queue.put(message)
+ time.sleep(0)
+ self.prev_update = message
+
+
+ def run(self):
+ pass
+
+
+
diff --git a/fax/faxdevice.py b/fax/faxdevice.py
new file mode 100644
index 0000000..b832d35
--- /dev/null
+++ b/fax/faxdevice.py
@@ -0,0 +1,70 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2010 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+# Local
+from base.g import *
+from prnt import cups
+from base import device, codes
+from soapfax import SOAPFaxDevice
+from pmlfax import PMLFaxDevice
+from marvellfax import MarvellFaxDevice
+
+def FaxDevice(device_uri=None, printer_name=None,
+ callback=None,
+ fax_type=FAX_TYPE_NONE,
+ disable_dbus=False):
+
+ if fax_type == FAX_TYPE_NONE:
+ if device_uri is None and printer_name is not None:
+ printers = cups.getPrinters()
+
+ for p in printers:
+ if p.name.lower() == printer_name.lower():
+ device_uri = p.device_uri
+ break
+ else:
+ raise Error(ERROR_DEVICE_NOT_FOUND)
+
+ if device_uri is not None:
+ mq = device.queryModelByURI(device_uri)
+ fax_type = mq['fax-type']
+
+ log.debug("fax-type=%d" % fax_type)
+
+ if fax_type in (FAX_TYPE_BLACK_SEND_EARLY_OPEN, FAX_TYPE_BLACK_SEND_LATE_OPEN):
+ return PMLFaxDevice(device_uri, printer_name, callback, fax_type, disable_dbus)
+
+ elif fax_type == FAX_TYPE_SOAP:
+ return SOAPFaxDevice(device_uri, printer_name, callback, fax_type, disable_dbus)
+
+ elif fax_type == FAX_TYPE_LEDMSOAP:
+ return LEDMSOAPFaxDevice(device_uri, printer_name, callback, fax_type, disable_dbus)
+
+ elif fax_type == FAX_TYPE_MARVELL:
+ return MarvellFaxDevice(device_uri, printer_name, callback, fax_type, disable_dbus)
+
+ elif fax_type == FAX_TYPE_LEDM:
+ from ledmfax import LEDMFaxDevice
+ return LEDMFaxDevice(device_uri, printer_name, callback, fax_type, disable_dbus)
+
+
+ else:
+ raise Error(ERROR_DEVICE_DOES_NOT_SUPPORT_OPERATION)
diff --git a/fax/filters/pstotiff b/fax/filters/pstotiff
new file mode 100755
index 0000000..2b0571e
--- /dev/null
+++ b/fax/filters/pstotiff
@@ -0,0 +1,40 @@
+#!/usr/bin/env python
+
+import os
+import os.path
+import time
+import sys
+import tempfile
+
+READ_SIZE = 8192
+
+total_bytes_read = 0
+temp_in_file = "-"
+
+if (len(sys.argv) > 6):
+ temp_in_file = sys.argv[6]
+
+temp_out_handle, temp_out_fname = tempfile.mkstemp()
+
+font = "-I/usr/share/cups/fonts"
+device = "-sDEVICE=tiffg4 -dMaxStripSize=0 -r204x196 -dNOPAUSE -dBATCH -dSAFER -dPARANOIDSAFER -dSHORTERRORS -dWRITESYSTEMDICT -dGHOSTSCRIPT -sstdout=%stderr -sOutputFile=" + temp_out_fname + " " + temp_in_file
+
+gs_command = "/usr/bin/gs" + " " + font + " " + device
+
+exit_code = os.system(gs_command)
+
+file_len = os.stat(temp_out_fname).st_size
+if (file_len < READ_SIZE):
+ READ_SIZE = file_len
+
+os.close(temp_out_handle)
+
+out_handle = open(temp_out_fname, mode='rb')
+while (total_bytes_read < file_len):
+ data = out_handle.read(READ_SIZE)
+ sys.stdout.write(data)
+ total_bytes_read += READ_SIZE
+out_handle.close()
+
+os.remove(temp_out_fname)
+sys.exit(0)
diff --git a/fax/filters/pstotiff.convs b/fax/filters/pstotiff.convs
new file mode 100644
index 0000000..83a265c
--- /dev/null
+++ b/fax/filters/pstotiff.convs
@@ -0,0 +1,27 @@
+# Copyright 2010 by HP.
+#
+########################################################################
+#
+# Format of Lines:
+#
+# source/type destination/type cost filter
+#
+# General Notes:
+#
+# The "cost" field is used to find the least costly filters to run
+# when converting a job file to a printable format.
+#
+# All filters *must* accept the standard command-line arguments
+# (job-id, user, title, copies, options, [filename or stdin]) to
+# work with CUPS.
+#
+
+########################################################################
+#
+# TIFF filters...
+#
+
+application/postscript image/tiff 80 pstotiff
+application/pdf image/tiff 80 pstotiff
+application/vnd.cups-pdf image/tiff 80 pstotiff
+application/vnd.cups-postscript image/tiff 80 pstotiff
diff --git a/fax/filters/pstotiff.types b/fax/filters/pstotiff.types
new file mode 100644
index 0000000..6e2f5be
--- /dev/null
+++ b/fax/filters/pstotiff.types
@@ -0,0 +1,53 @@
+# Copyright 2010-2011 by HP.
+#
+########################################################################
+#
+# Format of Lines:
+#
+# super/type rules
+#
+# "rules" can be any combination of:
+#
+# ( expr ) Parenthesis for expression grouping
+# + Logical AND
+# , or whitespace Logical OR
+# ! Logical NOT
+# match("pattern") Pattern match on filename
+# extension Pattern match on "*.extension"
+# ascii(offset,length) True if bytes are valid printable ASCII
+# (CR, NL, TAB, BS, 32-126)
+# printable(offset,length) True if bytes are printable 8-bit chars
+# (CR, NL, TAB, BS, 32-126, 128-254)
+# string(offset,"string") True if bytes are identical to string
+# istring(offset,"string") True if bytes are identical to
+# case-insensitive string
+# char(offset,value) True if byte is identical
+# short(offset,value) True if 16-bit integer is identical
+# int(offset,value) True if 32-bit integer is identical
+# locale("string") True if current locale matches string
+# contains(offset,range,"string") True if the range contains the string
+#
+# General Notes:
+#
+# MIME type names are case-insensitive. Internally they are converted
+# to lowercase. Multiple occurrences of a type will cause the provided
+# rules to be appended to the existing definition. Type names are sorted
+# in ascending order, so if two types use the same rules to resolve a type
+# (e.g. doc extension for two types), the returned type will be the first
+# type in the sorted list.
+#
+# The "printable" rule differs from the "ascii" rule in that it also
+# accepts 8-bit characters in the range 128-255.
+#
+# String constants must be surrounded by "" if they contain whitespace.
+# To insert binary data into a string, use the <hex> notation.
+#
+
+########################################################################
+#
+# Application-generated files...
+#
+
+#application/vnd.hplip-tiff tiff tif string(0,MM<002A>) string(0,II<2A00>)
+image/tiff tiff tif string(0,MM<002A>) string(0,II<2A00>)
+
diff --git a/fax/ledmfax.py b/fax/ledmfax.py
new file mode 100644
index 0000000..7a79d6e
--- /dev/null
+++ b/fax/ledmfax.py
@@ -0,0 +1,691 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2007 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: k,shunmugaraj
+# Date Created: 10/10/2010
+
+from __future__ import division
+
+# Std Lib
+import sys
+import os
+import time
+import cStringIO
+import urllib # TODO: Replace with urllib2 (urllib is deprecated in Python 3.0)
+import re
+import threading
+import struct
+import time
+import xml.parsers.expat as expat
+from stat import *
+# Local
+from base.g import *
+from base.codes import *
+from base import device, utils, codes, dime, status
+from fax import *
+
+
+# **************************************************************************** #
+
+http_result_pat = re.compile("""HTTP/\d.\d\s(\d+)""", re.I)
+
+HTTP_OK = 200
+HTTP_ACCEPTED = 202
+HTTP_CREATED = 201
+HTTP_ERROR = 500
+
+PIXELS_PER_LINE = 1728
+
+# **************************************************************************** #
+setPhoneNumXML = """<?xml version=\"1.0\" encoding=\"UTF-8\"?><!--Sample XML file generated by XMLSPY v5 rel. 4 U (http://www.xmlspy.com)--><faxcfgdyn:FaxConfigDyn xmlns:faxcfgdyn=\"http://www.hp.com/schemas/imaging/con/ledm/faxconfigdyn/2009/03/03\" xmlns:dd=\"http://www.hp.com/schemas/imaging/con/dictionaries/1.0/\" xmlns:fax=\"http://www.hp.com/schemas/imaging/con/fax/2008/06/13\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://www.hp.com/schemas/imaging/con/ledm/faxconfigdyn/2009/03/03 ../schemas/FaxConfigDyn.xsd\"><faxcfgdyn:SystemSettings><dd:PhoneNumber>%s</dd:PhoneNumber></faxcfgdyn:SystemSettings></faxcfgdyn:FaxConfigDyn>"""
+
+setStationNameXML = """<?xml version=\"1.0\" encoding=\"UTF-8\"?><!--Sample XML file generated by XMLSPY v5 rel. 4 U (http://www.xmlspy.com)--><faxcfgdyn:FaxConfigDyn xmlns:faxcfgdyn=\"http://www.hp.com/schemas/imaging/con/ledm/faxconfigdyn/2009/03/03\" xmlns:dd=\"http://www.hp.com/schemas/imaging/con/dictionaries/1.0/\" xmlns:fax=\"http://www.hp.com/schemas/imaging/con/fax/2008/06/13\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://www.hp.com/schemas/imaging/con/ledm/faxconfigdyn/2009/03/03 ../schemas/FaxConfigDyn.xsd\"><faxcfgdyn:SystemSettings><dd:CompanyName>%s</dd:CompanyName></faxcfgdyn:SystemSettings></faxcfgdyn:FaxConfigDyn>"""
+
+createJobXML = """<?xml version=\"1.0\" encoding=\"UTF-8\"?><!--THIS DATA SUBJECT TO DISCLAIMER(S)INCLUDED WITH THE PRODUCT OF ORIGIN.--><fpsdyn:FaxPCSendDyn xmlns:fpsdyn=\"http://www.hp.com/schemas/imaging/con/ledm/printtofaxdyn/2008/11/24\" xmlns:dd=\"http://www.hp.com/schemas/imaging/con/dictionaries/1.0/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://www.hp.com/schemas/imaging/con/ledm/printtofaxdyn/2008/11/24 ../schemas/FaxPCSendDyn.xsd\"><dd:Version><dd:Revision>1.0</dd:Revision></dd:Version><fpsdyn:FaxPCSendConfig><fpsdyn:FaxTxPhoneNumber>%s</fpsdyn:FaxTxPhoneNumber><fpsdyn:NumPages>%d</fpsdyn:NumPages><fpsdyn:TTI_Control>TTI_Off</fpsdyn:TTI_Control></fpsdyn:FaxPCSendConfig></fpsdyn:FaxPCSendDyn>"""
+
+pageConfigXML = """<?xml version=\"1.0\" encoding=\"UTF-8\" ?><!-- THIS DATA SUBJECT TO DISCLAIMER(S)INCLUDED WITH THE PRODUCT OF ORIGIN.--><fpsdyn:FaxPCSendDyn xmlns:fpsdyn=\"http://www.hp.com/schemas/imaging/con/ledm/printtofaxdyn/2008/11/24\" xmlns:dd=\"http://www.hp.com/schemas/imaging/con/dictionaries/1.0/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://www.hp.com/schemas/imaging/con/ledm/printtofaxdyn/2008/11/24 ../schemas/FaxPCSendDyn.xsd\"><dd:Version><dd:Revision>1.0</dd:Revision></dd:Version><fpsdyn:PageConfig><fpsdyn:PageNum>%d</fpsdyn:PageNum><fpsdyn:Width>1728</fpsdyn:Width><fpsdyn:Height>2200</fpsdyn:Height><fpsdyn:ImageType>BW</fpsdyn:ImageType><fpsdyn:Compression>mh</fpsdyn:Compression><fpsdyn:HorizontalDPI>%d</fpsdyn:HorizontalDPI><fpsdyn:VerticalDPI>%d</fpsdyn:VerticalDPI></fpsdyn:PageConfig></fpsdyn:FaxPCSendDyn>"""
+
+cancelJobXML = """<?xml version=\"1.0\" encoding=\"UTF-8\"?><!-- THIS DATA SUBJECT TO DISCLAIMER(S) INCLUDED WITH THE PRODUCT OF ORIGIN.--><j:Job xmlns:j=\"http://www.hp.com/schemas/imaging/con/ledm/jobs/2009/04/30\" xmlns:dd=\"http://www.hp.com/schemas/imaging/con/dictionaries/1.0/\" xmlns:fax=\"http://www.hp.com/schemas/imaging/con/fax/2008/06/13\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://www.hp.com/schemas/imaging/con/ledm/jobs/2009/04/30 ../schemas/Jobs.xsd\"><j:JobUrl>%s</j:JobUrl><j:JobState>Canceled</j:JobState></j:Job>"""
+
+# **************************************************************************** #
+class LEDMFaxDevice(FaxDevice):
+
+ def __init__(self, device_uri=None, printer_name=None,
+ callback=None,
+ fax_type=FAX_TYPE_NONE,
+ disable_dbus=False):
+
+ FaxDevice.__init__(self, device_uri,
+ printer_name,
+ callback, fax_type,
+ disable_dbus)
+
+ self.send_fax_thread = None
+ self.upload_log_thread = None
+
+ if self.bus == 'net':
+ self.http_host = self.host
+ else:
+ self.http_host = 'localhost'
+
+
+ def put(self, url, post):
+ data = """PUT %s HTTP/1.1\r
+Connection: Keep-alive\r
+User-agent: hplip/2.0\r
+Host: %s\r
+Content-length: %d\r
+\r
+%s""" % (url, self.http_host, len(post), post)
+ log.log_data(data)
+ self.writeLEDM(data)
+ response = cStringIO.StringIO()
+
+ while self.readLEDM(512, response, timeout=5):
+ pass
+
+ response = response.getvalue()
+ log.log_data(response)
+ self.closeLEDM()
+
+ match = http_result_pat.match(response)
+ if match is None: return HTTP_OK
+ try:
+ code = int(match.group(1))
+ except (ValueError, TypeError):
+ code = HTTP_ERROR
+
+ return code == HTTP_OK
+
+
+ def setPhoneNum(self, num):
+ xml = setPhoneNumXML %(num)
+ log.debug("SetPhoneNum:xml Value:%s" %xml)
+ return self.put("/DevMgmt/FaxConfigDyn.xml", xml)
+
+
+ def getPhoneNum(self):
+ return self.readAttributeFromXml("/DevMgmt/FaxConfigDyn.xml",'faxcfgdyn:faxconfigdyn-faxcfgdyn:systemsettings-dd:phonenumber')
+
+ phone_num = property(getPhoneNum, setPhoneNum)
+
+
+ def setStationName(self, name):
+ xml = setStationNameXML %(name)
+ return self.put("/DevMgmt/FaxConfigDyn.xml", xml)
+
+
+ def getStationName(self):
+ return self.readAttributeFromXml("/DevMgmt/FaxConfigDyn.xml",'faxcfgdyn:faxconfigdyn-faxcfgdyn:systemsettings-dd:companyname')
+
+ station_name = property(getStationName, setStationName)
+
+ def sendFaxes(self, phone_num_list, fax_file_list, cover_message='', cover_re='',
+ cover_func=None, preserve_formatting=False, printer_name='',
+ update_queue=None, event_queue=None):
+
+ if not self.isSendFaxActive():
+
+ self.send_fax_thread = LEDMFaxSendThread(self, self.service, phone_num_list, fax_file_list,
+ cover_message, cover_re, cover_func,
+ preserve_formatting,
+ printer_name, update_queue,
+ event_queue)
+
+ self.send_fax_thread.start()
+ return True
+ else:
+ return False
+
+
+# **************************************************************************** #
+class LEDMFaxSendThread(FaxSendThread):
+ def __init__(self, dev, service, phone_num_list, fax_file_list,
+ cover_message='', cover_re='', cover_func=None, preserve_formatting=False,
+ printer_name='', update_queue=None, event_queue=None):
+
+ FaxSendThread.__init__(self, dev, service, phone_num_list, fax_file_list,
+ cover_message, cover_re, cover_func, preserve_formatting,
+ printer_name, update_queue, event_queue)
+
+ if dev.bus == 'net':
+ self.http_host = "%s:8080" % self.dev.host
+ else:
+ self.http_host = 'localhost:8080'
+
+
+ def run(self):
+
+ STATE_DONE = 0
+ STATE_ABORTED = 10
+ STATE_SUCCESS = 20
+ STATE_BUSY = 25
+ STATE_READ_SENDER_INFO = 30
+ STATE_PRERENDER = 40
+ STATE_COUNT_PAGES = 50
+ STATE_NEXT_RECIPIENT = 60
+ STATE_COVER_PAGE = 70
+ STATE_SINGLE_FILE = 80
+ STATE_MERGE_FILES = 90
+ STATE_SINGLE_FILE = 100
+ STATE_SEND_FAX = 110
+ STATE_CLEANUP = 120
+ STATE_ERROR = 130
+
+ next_recipient = self.next_recipient_gen()
+
+ state = STATE_READ_SENDER_INFO
+ error_state = STATUS_ERROR
+ self.rendered_file_list = []
+
+ while state != STATE_DONE: # --------------------------------- Fax state machine
+ if self.check_for_cancel():
+ state = STATE_ABORTED
+
+ log.debug("STATE=(%d, 0, 0)" % state)
+
+ if state == STATE_ABORTED: # ----------------------------- Aborted (10, 0, 0)
+ log.error("Aborted by user.")
+ self.write_queue((STATUS_IDLE, 0, ''))
+ state = STATE_CLEANUP
+
+
+ elif state == STATE_SUCCESS: # --------------------------- Success (20, 0, 0)
+ log.debug("Success.")
+ self.write_queue((STATUS_COMPLETED, 0, ''))
+ state = STATE_CLEANUP
+
+
+ elif state == STATE_ERROR: # ----------------------------- Error (130, 0, 0)
+ log.error("Error, aborting.")
+ self.write_queue((error_state, 0, ''))
+ state = STATE_CLEANUP
+
+
+ elif state == STATE_BUSY: # ------------------------------ Busy (25, 0, 0)
+ log.error("Device busy, aborting.")
+ self.write_queue((STATUS_BUSY, 0, ''))
+ state = STATE_CLEANUP
+
+
+ elif state == STATE_READ_SENDER_INFO: # ------------------ Get sender info (30, 0, 0)
+ log.debug("%s State: Get sender info" % ("*"*20))
+ state = STATE_PRERENDER
+ try:
+ try:
+ self.dev.open()
+ except Error, e:
+ log.error("Unable to open device (%s)." % e.msg)
+ state = STATE_ERROR
+ else:
+ try:
+ self.sender_name = self.dev.station_name
+ log.debug("Sender name=%s" % self.sender_name)
+ self.sender_fax = self.dev.phone_num
+ log.debug("Sender fax=%s" % self.sender_fax)
+ except Error:
+ log.error("LEDM GET failed!")
+ state = STATE_ERROR
+
+ finally:
+ self.dev.close()
+
+
+ elif state == STATE_PRERENDER: # --------------------------------- Pre-render non-G4 files (40, 0, 0)
+ log.debug("%s State: Pre-render non-G4 files" % ("*"*20))
+ state = self.pre_render(STATE_COUNT_PAGES)
+
+ elif state == STATE_COUNT_PAGES: # -------------------------------- Get total page count (50, 0, 0)
+ log.debug("%s State: Get total page count" % ("*"*20))
+ state = self.count_pages(STATE_NEXT_RECIPIENT)
+
+ elif state == STATE_NEXT_RECIPIENT: # ----------------------------- Loop for multiple recipients (60, 0, 0)
+ log.debug("%s State: Next recipient" % ("*"*20))
+ state = STATE_COVER_PAGE
+
+ try:
+ recipient = next_recipient.next()
+ log.debug("Processing for recipient %s" % recipient['name'])
+ self.write_queue((STATUS_SENDING_TO_RECIPIENT, 0, recipient['name']))
+ except StopIteration:
+ state = STATE_SUCCESS
+ log.debug("Last recipient.")
+ continue
+
+ recipient_file_list = self.rendered_file_list[:]
+
+
+ elif state == STATE_COVER_PAGE: # ---------------------------------- Create cover page (70, 0, 0)
+ log.debug("%s State: Render cover page" % ("*"*20))
+ state = self.cover_page(recipient)
+
+
+ elif state == STATE_SINGLE_FILE: # --------------------------------- Special case for single file (no merge) (80, 0, 0)
+ log.debug("%s State: Handle single file" % ("*"*20))
+ state = self.single_file(STATE_SEND_FAX)
+
+ elif state == STATE_MERGE_FILES: # --------------------------------- Merge multiple G4 files (90, 0, 0)
+ log.debug("%s State: Merge multiple files" % ("*"*20))
+ state = self.merge_files(STATE_SEND_FAX)
+
+ elif state == STATE_SEND_FAX: # ------------------------------------ Send fax state machine (110, 0, 0)
+ log.debug("%s State: Send fax" % ("*"*20))
+ state = STATE_NEXT_RECIPIENT
+
+ FAX_SEND_STATE_DONE = 0
+ FAX_SEND_STATE_ABORT = 10
+ FAX_SEND_STATE_ERROR = 20
+ FAX_SEND_STATE_BUSY = 25
+ FAX_SEND_STATE_SUCCESS = 30
+ FAX_SEND_STATE_DEVICE_OPEN = 40
+ FAX_SEND_STATE_BEGINJOB = 50
+ FAX_SEND_STATE_DOWNLOADPAGES = 60
+ FAX_SEND_STATE_ENDJOB = 70
+ FAX_SEND_STATE_CANCELJOB = 80
+ FAX_SEND_STATE_CLOSE_SESSION = 170
+
+ monitor_state = False
+ fax_send_state = FAX_SEND_STATE_DEVICE_OPEN
+
+ while fax_send_state != FAX_SEND_STATE_DONE:
+
+ if self.check_for_cancel():
+ log.error("Fax send aborted.")
+ fax_send_state = FAX_SEND_STATE_ABORT
+
+ if monitor_state:
+ fax_state = self.getFaxDownloadState()
+ if not fax_state in (pml.UPDN_STATE_XFERACTIVE, pml.UPDN_STATE_XFERDONE):
+ log.error("D/L error state=%d" % fax_state)
+ fax_send_state = FAX_SEND_STATE_ERROR
+ state = STATE_ERROR
+
+ log.debug("STATE=(%d, %d, 0)" % (STATE_SEND_FAX, fax_send_state))
+
+ if fax_send_state == FAX_SEND_STATE_ABORT: # ----------------- Abort (110, 10, 0)
+ monitor_state = False
+ fax_send_state = FAX_SEND_STATE_CANCELJOB
+ state = STATE_ABORTED
+
+ elif fax_send_state == FAX_SEND_STATE_ERROR: # --------------- Error (110, 20, 0)
+ log.error("Fax send error.")
+ monitor_state = False
+ fax_send_state = FAX_SEND_STATE_CLOSE_SESSION
+ state = STATE_ERROR
+
+ elif fax_send_state == FAX_SEND_STATE_BUSY: # ---------------- Busy (110, 25, 0)
+ log.error("Fax device busy.")
+ monitor_state = False
+ fax_send_state = FAX_SEND_STATE_CLOSE_SESSION
+ state = STATE_BUSY
+
+ elif fax_send_state == FAX_SEND_STATE_SUCCESS: # ------------- Success (110, 30, 0)
+ log.debug("Fax send success.")
+ monitor_state = False
+ fax_send_state = FAX_SEND_STATE_CLOSE_SESSION
+ state = STATE_NEXT_RECIPIENT
+
+ elif fax_send_state == FAX_SEND_STATE_DEVICE_OPEN: # --------- Device open (110, 40, 0)
+ log.debug("%s State: Open device" % ("*"*20))
+ fax_send_state = FAX_SEND_STATE_BEGINJOB
+ try:
+ self.dev.open()
+ except Error, e:
+ log.error("Unable to open device (%s)." % e.msg)
+ fax_send_state = FAX_SEND_STATE_ERROR
+ else:
+ if self.dev.device_state == DEVICE_STATE_NOT_FOUND:
+ fax_send_state = FAX_SEND_STATE_ERROR
+
+ elif fax_send_state == FAX_SEND_STATE_BEGINJOB: # -------------- BeginJob (110, 50, 0)
+ log.debug("%s State: BeginJob" % ("*"*20))
+ try:
+ ff = file(self.f, 'r')
+ except IOError:
+ log.error("Unable to read fax file.")
+ fax_send_state = FAX_SEND_STATE_ERROR
+ continue
+
+ try:
+ header = ff.read(FILE_HEADER_SIZE)
+ except IOError:
+ log.error("Unable to read fax file.")
+ fax_send_state = FAX_SEND_STATE_ERROR
+ continue
+
+ magic, version, total_pages, hort_dpi, vert_dpi, page_size, \
+ resolution, encoding, reserved1, reserved2 = self.decode_fax_header(header)
+
+ if magic != 'hplip_g3':
+ log.error("Invalid file header. Bad magic.")
+ fax_send_state = FAX_SEND_STATE_ERROR
+ else:
+ log.debug("Magic=%s Ver=%d Pages=%d hDPI=%d vDPI=%d Size=%d Res=%d Enc=%d" %
+ (magic, version, total_pages, hort_dpi, vert_dpi, page_size,
+ resolution, encoding))
+
+ faxnum = recipient['fax'].encode('ascii')
+
+ createJob = createJobXML %(faxnum, total_pages)
+ data = self.format_http_post("/FaxPCSend/Job",len(createJob),createJob)
+ log.log_data(data)
+
+ self.dev.openLEDM()
+ self.dev.writeLEDM(data)
+ response = cStringIO.StringIO()
+ try:
+ while self.dev.readLEDM(512, response, timeout=5):
+ pass
+ except Error:
+ fax_send_state = FAX_SEND_STATE_ERROR
+ self.dev.closeLEDM()
+ break
+ self.dev.closeLEDM()
+
+ response = response.getvalue()
+ log.log_data(response)
+ if self.get_error_code(response) == HTTP_CREATED:
+ fax_send_state = FAX_SEND_STATE_DOWNLOADPAGES
+ else:
+ fax_send_state = FAX_SEND_STATE_ERROR
+ log.error("Create Job request failed")
+ break
+
+ responsestr = str(response)
+ pos = responsestr.find("/Jobs/JobList/",0,len(responsestr))
+ pos1 = responsestr.find("Content-Length",0,len(responsestr))
+ jobListURI = responsestr[pos:pos1].strip()
+ log.debug("jobListURI = [%s]" %(jobListURI))
+
+ elif fax_send_state == FAX_SEND_STATE_DOWNLOADPAGES: # -------------- DownloadPages (110, 60, 0)
+ log.debug("%s State: DownloadPages" % ("*"*20))
+ page = StringIO()
+ log.debug("Total Number of pages are:%d" %total_pages)
+ for p in range(total_pages):
+
+ if self.check_for_cancel():
+ fax_send_state = FAX_SEND_STATE_ABORT
+
+ if fax_send_state == FAX_SEND_STATE_ABORT:
+ break
+
+ try:
+ header = ff.read(PAGE_HEADER_SIZE)
+ except IOError:
+ log.error("Unable to read fax file.")
+ fax_send_state = FAX_SEND_STATE_ERROR
+ continue
+
+ page_num, ppr, rpp, bytes_to_read, thumbnail_bytes, reserved2 = \
+ self.decode_page_header(header)
+
+ log.debug("Page=%d PPR=%d RPP=%d BPP=%d Thumb=%d" %
+ (page_num, ppr, rpp, bytes_to_read, thumbnail_bytes))
+
+ if ppr != PIXELS_PER_LINE:
+ log.error("Pixels per line (width) must be %d!" % PIXELS_PER_LINE)
+
+ page.write(ff.read(bytes_to_read))
+ thumbnail = ff.read(thumbnail_bytes) # thrown away for now (should be 0 read)
+ page.seek(0)
+
+ try:
+ data = page.read(bytes_to_read)
+ except IOError:
+ log.error("Unable to read fax file.")
+ fax_send_state = FAX_SEND_STATE_ERROR
+ break
+
+ if data == '':
+ log.error("No data!")
+ fax_send_state = FAX_SEND_STATE_ERROR
+ break
+
+ pageConfigURI = self.dev.readAttributeFromXml(jobListURI,"j:job-faxpcsendstatus-resourceuri")
+ log.debug("pageConfigURI:[%s]" %pageConfigURI)
+
+ pageConfig = pageConfigXML %(page_num,hort_dpi,vert_dpi)
+ xmldata = self.format_http_post(pageConfigURI,len(pageConfig),pageConfig)
+ log.log_data(xmldata)
+
+ self.dev.openLEDM()
+ try:
+ self.dev.writeLEDM(xmldata)
+ except Error:
+ fax_send_state = FAX_SEND_STATE_ERROR
+ self.dev.closeLEDM()
+ break
+
+ response = cStringIO.StringIO()
+ try:
+ while self.dev.readLEDM(512, response, timeout=5):
+ pass
+ except Error:
+ fax_send_state = FAX_SEND_STATE_ERROR
+ self.dev.closeLEDM()
+ break
+
+ self.dev.closeLEDM()
+ response = (response.getvalue())
+ log.log_data(response)
+ if self.get_error_code(response) != HTTP_ACCEPTED:
+ fax_send_state = FAX_SEND_STATE_ERROR
+ log.error("Page config data is not accepted by the device")
+ break
+
+ pageImageURI = self.dev.readAttributeFromXml(jobListURI,"j:job-faxpcsendstatus-resourceuri")
+ while(True):
+ if self.check_for_cancel():
+ fax_send_state = FAX_SEND_STATE_ABORT
+ break
+
+ Status, Fax_State = self.checkForError(jobListURI)
+ if Status == FAX_SEND_STATE_ERROR and (Fax_State == STATUS_ERROR_IN_TRANSMITTING or
+ Fax_State == STATUS_ERROR_IN_CONNECTING or Fax_State == STATUS_ERROR_PROBLEM_IN_FAXLINE or
+ Fax_State == STATUS_JOB_CANCEL):
+ log.debug("setting state to FAX_SEND_STATE_ERROR")
+ fax_send_state = FAX_SEND_STATE_ERROR
+ error_state = Fax_State
+ break
+ elif Status == FAX_SEND_STATE_SUCCESS:
+ break
+
+ if fax_send_state == FAX_SEND_STATE_ABORT or fax_send_state == FAX_SEND_STATE_ERROR:
+ break
+
+
+ xmldata = self.format_http_post(pageImageURI,len(data),"","application/octet-stream")
+ log.debug("Sending Page Image XML Data [%s] to the device" %str(xmldata))
+ self.dev.openLEDM()
+ self.dev.writeLEDM(xmldata)
+ log.debug("Sending Raw Data to printer............")
+ try:
+ self.dev.writeLEDM(data)
+ except Error:
+ fax_send_state = FAX_SEND_STATE_ERROR
+ self.dev.closeLEDM()
+ break
+
+ response = cStringIO.StringIO()
+ try:
+ while self.dev.readLEDM(512, response, timeout=10):
+ pass
+ except Error:
+ fax_send_state = FAX_SEND_STATE_ERROR
+ self.dev.closeLEDM()
+ break
+
+ self.dev.closeLEDM()
+ response = response.getvalue()
+ log.log_data(response)
+
+ if self.get_error_code(response) != HTTP_ACCEPTED:
+ log.error("Image Data is not accepted by the device")
+ fax_send_state = FAX_SEND_STATE_ERROR
+ break
+
+ page.truncate(0)
+ page.seek(0)
+
+ else:
+ fax_send_state = FAX_SEND_STATE_ENDJOB
+
+
+ elif fax_send_state == FAX_SEND_STATE_ENDJOB: # -------------- EndJob (110, 70, 0)
+ fax_send_state = FAX_SEND_STATE_SUCCESS
+
+
+ elif fax_send_state == FAX_SEND_STATE_CANCELJOB: # -------------- CancelJob (110, 80, 0)
+ log.debug("%s State: CancelJob" % ("*"*20))
+
+ xmldata = cancelJobXML %(jobListURI)
+ data = self.format_http_put(jobListURI,len(xmldata),xmldata)
+ log.log_data(data)
+
+ self.dev.openLEDM()
+ self.dev.writeLEDM(data)
+
+ response = cStringIO.StringIO()
+ try:
+ while self.dev.readLEDM(512, response, timeout=10):
+ pass
+ except Error:
+ fax_send_state = FAX_SEND_STATE_ERROR
+ self.dev.closeLEDM()
+ break
+ self.dev.closeLEDM()
+ response = response.getvalue()
+ log.log_data(response)
+
+ if self.get_error_code(response) == HTTP_OK:
+ fax_send_state = FAX_SEND_STATE_CLOSE_SESSION
+ else:
+ fax_send_state = FAX_SEND_STATE_ERROR
+ log.error("Job Cancel Request Failed")
+
+
+ elif fax_send_state == FAX_SEND_STATE_CLOSE_SESSION: # -------------- Close session (110, 170, 0)
+ log.debug("%s State: Close session" % ("*"*20))
+ log.debug("Closing session...")
+
+ try:
+ ff.close()
+ except NameError:
+ pass
+
+ #time.sleep(1)
+
+ self.dev.closeLEDM()
+ self.dev.close()
+
+ fax_send_state = FAX_SEND_STATE_DONE # Exit inner state machine
+
+
+ elif state == STATE_CLEANUP: # --------------------------------- Cleanup (120, 0, 0)
+ log.debug("%s State: Cleanup" % ("*"*20))
+
+ if self.remove_temp_file:
+ log.debug("Removing merged file: %s" % self.f)
+ try:
+ os.remove(self.f)
+ log.debug("Removed")
+ except OSError:
+ log.debug("Not found")
+
+ state = STATE_DONE # Exit outer state machine
+
+
+ def get_error_code(self, ret):
+ if not ret: return HTTP_ERROR
+
+ match = http_result_pat.match(ret)
+ if match is None: return HTTP_OK
+ try:
+ code = int(match.group(1))
+ except (ValueError, TypeError):
+ code = HTTP_ERROR
+ return code
+
+ def checkForError(self,uri):
+ stream = cStringIO.StringIO()
+ data = self.dev.FetchLEDMUrl(uri)
+ if not data:
+ log.error("Unable To read the XML data from device")
+ return ""
+
+ xmlDict = utils.XMLToDictParser().parseXML(data)
+ log.debug("Read Attribute:%s and it is value:%s" %(uri,data))
+
+ FAX_SEND_STATE_ERROR = 20
+ FAX_SEND_STATE_SUCCESS = 30
+ state = FAX_SEND_STATE_ERROR
+ Fax_send_state = STATUS_ERROR
+
+ if cmp(str(xmlDict['j:job-faxpcsendstatus-faxtxmachinestatus']),"Transmitting")==0 \
+ and cmp(str(xmlDict['j:job-faxpcsendstatus-faxtxerrorstatus']),"CommunicationError")== 0:
+ state = FAX_SEND_STATE_ERROR
+ Fax_send_state = STATUS_ERROR_IN_TRANSMITTING
+ elif(cmp(str(xmlDict['j:job-faxpcsendstatus-faxtxmachinestatus']),"Connecting")==0 \
+ and cmp(str(xmlDict['j:job-faxpcsendstatus-faxtxerrorstatus']),"NoAnswer")== 0):
+ state = FAX_SEND_STATE_ERROR
+ Fax_send_state = STATUS_ERROR_IN_CONNECTING
+ elif(cmp(str(xmlDict['j:job-faxpcsendstatus-faxtxerrorstatus']),"PcDisconnect")==0 \
+ and cmp(str(xmlDict['j:job-faxpcsendstatus-pagestatus-state']),"Error")== 0):
+ state = FAX_SEND_STATE_ERROR
+ Fax_send_state = STATUS_ERROR_PROBLEM_IN_FAXLINE
+ elif(cmp(str(xmlDict['j:job-faxpcsendstatus-faxtxerrorstatus']),"Stop")==0 \
+ and cmp(str(xmlDict['j:job-faxpcsendstatus-pagestatus-state']),"Error")== 0):
+ state = FAX_SEND_STATE_ERROR
+ Fax_send_state = STATUS_JOB_CANCEL
+ elif(cmp(str(xmlDict['j:job-faxpcsendstatus-faxtxmachinestatus']),"Transmitting")== 0):
+ state = FAX_SEND_STATE_SUCCESS
+ Fax_send_state = FAX_SEND_STATE_SUCCESS
+ return state,Fax_send_state
+
+ def format_http_post(self, requst, ledmlen, xmldata, content_type="text/xml; charset=utf-8"):
+ host = self.http_host
+
+ return utils.cat(
+"""POST $requst HTTP/1.1\r
+Host: $host\r
+User-Agent: hplip/2.0\r
+Content-Type: $content_type\r
+Content-Length: $ledmlen\r
+Connection: Keep-alive\r
+SOAPAction: ""\r
+\r
+$xmldata""")
+
+ def format_http_put(self, requst, ledmlen, xmldata, content_type="text/xml; charset=utf-8"):
+ host = self.http_host
+ return utils.cat(
+"""PUT $requst HTTP/1.1\r
+Host: $host\r
+User-Agent: hplip/2.0\r
+Content-Type: $content_type\r
+Content-Length: $ledmlen\r
+\r
+$xmldata""")
+
+
+
+
+
+
+
+
diff --git a/fax/ledmsoapfax.py b/fax/ledmsoapfax.py
new file mode 100644
index 0000000..b58f0c1
--- /dev/null
+++ b/fax/ledmsoapfax.py
@@ -0,0 +1,106 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2007 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+from __future__ import division
+
+# Std Lib
+import sys
+import os
+import time
+import cStringIO
+import urllib # TODO: Replace with urllib2 (urllib is deprecated in Python 3.0)
+import re
+
+# Local
+from base.g import *
+from base.codes import *
+from base import device, utils, codes, dime
+from fax import *
+from ledmfax import *
+from soapfax import SOAPFaxSendThread
+from soapfax import SOAPFaxDevice
+
+
+# **************************************************************************** #
+class LEDMSOAPFaxDevice(SOAPFaxDevice):
+
+
+ def __init__(self, device_uri=None, printer_name=None,
+ callback=None,
+ fax_type=FAX_TYPE_NONE,
+ disable_dbus=False):
+
+ SOAPFaxDevice.__init__(self, device_uri,
+ printer_name,
+ callback, fax_type,
+ disable_dbus)
+
+ #LEDM Specific functions
+ def put(self, url, post):
+ data = """PUT %s HTTP/1.1\r
+Connection: Keep-alive\r
+User-agent: hplip/2.0\r
+Host: %s\r
+Content-length: %d\r
+\r
+%s""" % (url, self.http_host, len(post), post)
+ log.log_data(data)
+ self.writeEWS_LEDM(data)
+ response = cStringIO.StringIO()
+
+ while self.readEWS_LEDM(4096, response, timeout=5):
+ pass
+
+ response = response.getvalue()
+ log.log_data(response)
+ self.closeEWS_LEDM()
+
+ match = http_result_pat.match(response)
+ if match is None: return HTTP_OK
+ try:
+ code = int(match.group(1))
+ except (ValueError, TypeError):
+ code = HTTP_ERROR
+
+ return code == HTTP_OK
+
+
+ def setPhoneNum(self, num):
+ xml = setPhoneNumXML %(num)
+ log.debug("SetPhoneNum:xml Value:%s" %xml)
+ return self.put("/DevMgmt/FaxConfigDyn.xml", xml)
+
+
+ def getPhoneNum(self):
+ return self.readAttributeFromXml_EWS("/DevMgmt/FaxConfigDyn.xml",'faxcfgdyn:faxconfigdyn-faxcfgdyn:systemsettings-dd:phonenumber')
+
+ phone_num = property(getPhoneNum, setPhoneNum)
+
+
+ def setStationName(self, name):
+ xml = setStationNameXML %(name)
+ return self.put("/DevMgmt/FaxConfigDyn.xml", xml)
+
+
+ def getStationName(self):
+ return self.readAttributeFromXml_EWS("/DevMgmt/FaxConfigDyn.xml",'faxcfgdyn:faxconfigdyn-faxcfgdyn:systemsettings-dd:companyname')
+
+ station_name = property(getStationName, setStationName)
diff --git a/fax/marvellfax.py b/fax/marvellfax.py
new file mode 100644
index 0000000..4d5ced3
--- /dev/null
+++ b/fax/marvellfax.py
@@ -0,0 +1,872 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2010 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Suma Byrappa
+#
+
+# Std Lib
+import sys
+import os
+import os.path
+import struct
+import time
+import threading
+import cStringIO
+
+from stat import *
+
+# Local
+from base.g import *
+from base.codes import *
+from base import device, utils, pml, codes
+from prnt import cups
+from fax import *
+import hpmudext
+
+try:
+ from ctypes import cdll
+ from ctypes import *
+ import ctypes.util as cu
+except ImportError:
+ log.error("Marvell fax support requires python-ctypes module. Exiting!")
+ sys.exit(1)
+
+
+# **************************************************************************** #
+# Marvell Message Types
+START_FAX_JOB = 0
+END_FAX_JOB = 1
+SEND_FAX_JOB = 2
+GET_FAX_LOG_ENTRY = 5
+GET_FAX_SETTINGS = 9
+SET_FAX_SETTINGS = 10
+CLEAR_FAX_STATUS = 11
+REQUEST_FAX_STATUS = 12
+FAX_DATA_BLOCK = 13
+
+SUCCESS = 0
+FAILURE = 1
+
+FAX_DATA_BLOCK_SIZE = 4096
+
+# Fax data variant header TTI header control
+TTI_NONE = 0
+TTI_PREPENDED_TO_IMAGE = 1
+TTI_OVERLAYED_ON_IMAGE = 2
+
+# **************************************************************************** #
+class MarvellFaxDevice(FaxDevice):
+
+ def __init__(self, device_uri=None, printer_name=None,
+ callback=None,
+ fax_type=FAX_TYPE_NONE,
+ disable_dbus=False):
+
+ FaxDevice.__init__(self, device_uri,
+ printer_name,
+ callback, fax_type,
+ disable_dbus)
+
+ self.send_fax_thread = None
+ self.upload_log_thread = None
+
+ try:
+ sendfax_path = utils.which('hp-sendfax')
+ sendfax_a_path = os.readlink(sendfax_path+"/hp-sendfax")
+ if not os.path.isabs(sendfax_a_path):
+ sendfax_f_path = os.path.join(sendfax_path, sendfax_a_path)
+ else:
+ sendfax_f_path = sendfax_a_path
+
+ sendfax_abs_path = os.path.realpath(sendfax_f_path)
+ (head, tail) = os.path.split(sendfax_abs_path)
+
+ lib_name = head+"/fax/plugins/fax_marvell.so"
+ log.debug("Load the library %s\n" % lib_name)
+ if not os.path.exists(lib_name):
+ log.error("Loading %s failed. Try after installing plugin libraries\n" %lib_name);
+ log.info("Run \"hp-plugin\" to installa plugin libraries if you are not automatically prompted\n")
+ job_id =0;
+ self.service.SendEvent(device_uri, printer_name, EVENT_FAX_FAILED_MISSING_PLUGIN, os.getenv('USER'), job_id, "Plugin is not installed")
+ sys.exit(1)
+ else:
+ self.libfax_marvell = cdll.LoadLibrary(lib_name)
+ except Error, e:
+ log.error("Loading fax_marvell failed (%s)\n" % e.msg);
+ sys.exit(1)
+
+
+ # Creates a message packet for message type given in argument, and sends it to device
+ #
+ # 1. Gets the message packet using fax_marvell.so
+ # 2. Writes the packets to device
+ # 3. Returns the result of send operation
+ def send_packet_for_message(self, msg_type, param1=0, param2=0, status=0, data_len=0):
+ int_array_8 = c_int * 8
+ i_buf = int_array_8(0, 0, 0, 0, 0, 0, 0, 0)
+
+ result = self.libfax_marvell.create_packet(msg_type, param1, param2, status, data_len, byref(i_buf))
+ buf = buffer(i_buf)
+ log.log_data(buf, 32)
+ self.writeMarvellFax(buf)
+# self.closeMarvellFax()
+
+ return result
+
+
+ # Reads response message packet from the device for message type given in argument.
+ # Reads the response from device, and sends the data read to the caller of this method
+ # No Marvell specific code or info
+ def read_response_for_message(self, msg_type):
+ ret_buf = cStringIO.StringIO()
+ while self.readMarvellFax(32, ret_buf, timeout=10):
+ pass
+
+ ret_buf = ret_buf.getvalue()
+ #self.closeMarvellFax()
+
+ log.debug("response_for_message (%d): response packet is\n" % msg_type)
+ log.log_data(ret_buf, 32)
+
+ return ret_buf
+
+
+ def setPhoneNum(self, num):
+ log.debug("************************* setPhoneNum (%s) START **************************" % num)
+
+ set_buf = cStringIO.StringIO()
+
+ int_array = c_int * 8
+ i_buf = int_array(0, 0, 0, 0, 0, 0, 0, 0)
+
+ char_array = c_char * 308
+ c_buf = char_array()
+
+ date_array = c_char * 15
+ date_buf = date_array()
+ t = time.localtime()
+ date_buf = "%4d%02d%02d%02d%02d%02d" % (t[0], t[1], t[2], t[3], t[4], t[5])
+ log.debug("Date and Time string is ==>")
+ log.debug(date_buf)
+
+ result = self.libfax_marvell.create_packet(SET_FAX_SETTINGS, 0, 0, 0, 0, byref(i_buf))
+ result = self.libfax_marvell.create_fax_settings_packet(self.station_name, str(num), date_buf, byref(c_buf))
+
+ msg_buf = buffer(i_buf)
+ msg_c_buf = buffer(c_buf)
+
+ for i in range(0, 32):
+ set_buf.write(msg_buf[i])
+ for i in range(0, 308):
+ set_buf.write(msg_c_buf[i])
+
+ set_buf = set_buf.getvalue()
+ log.debug("setPhoneNum: send SET_FAX_SETTINGS message and data ===> ")
+ log.log_data(set_buf, 340)
+
+ self.writeMarvellFax(set_buf)
+ ret_buf = cStringIO.StringIO()
+ while self.readMarvellFax(32, ret_buf, timeout=10):
+ pass
+ ret_buf = ret_buf.getvalue()
+ self.closeMarvellFax()
+
+ response = self.libfax_marvell.extract_response(ret_buf)
+ log.debug("setPhoneNum: response is %d" % response)
+
+ log.debug("************************* setPhoneNum END **************************")
+ return response
+
+
+ def getPhoneNum(self):
+ int_array_8 = c_int * 8
+ i_buf = int_array_8(0, 0, 0, 0, 0, 0, 0, 0)
+ ph_buf = int_array_8(0, 0, 0, 0, 0, 0, 0, 0)
+
+ log.debug("******************** getPhoneNum START **********************")
+
+ result = self.libfax_marvell.create_packet(GET_FAX_SETTINGS, 0, 0, 0, 0, byref(i_buf))
+
+ buf = buffer(i_buf)
+ self.writeMarvellFax(buf)
+ #self.closeMarvellFax()
+ ret_buf = cStringIO.StringIO()
+ while self.readMarvellFax(512, ret_buf, timeout=10):
+ pass
+ ret_buf = ret_buf.getvalue()
+ self.closeMarvellFax()
+
+ response = self.libfax_marvell.extract_response(ret_buf)
+ log.debug("create_packet: response is %d" % response)
+
+ response = self.libfax_marvell.extract_phone_number(ret_buf, ph_buf)
+ ph_num_buf = cStringIO.StringIO()
+ for i in range(0, 7):
+ if ph_buf[i]:
+ ph_num_buf.write(str(ph_buf[i]))
+
+ ph_num_buf = ph_num_buf.getvalue()
+ log.debug("getPhoneNum: ph_num_buf=%s " % (ph_num_buf))
+
+ log.debug("******************** getPhoneNum END **********************")
+ return ph_num_buf
+
+
+ # Note down the fax (phone) number
+ phone_num = property(getPhoneNum, setPhoneNum)
+
+
+ # Set the station name in the device's settings
+ #
+ def setStationName(self, name):
+ log.debug("************************* setStationName(%s) START **************************" % name)
+
+ int_array = c_int * 8
+ i_buf = int_array(0, 0, 0, 0, 0, 0, 0, 0)
+ set_buf = cStringIO.StringIO()
+
+ char_array = c_char * 308
+ c_buf = char_array()
+
+ date_array = c_char * 15
+ date_buf = date_array()
+ t = time.localtime()
+ date_buf = "%4d%02d%02d%02d%02d%02d" % (t[0], t[1], t[2], t[3], t[4], t[5])
+ log.debug("Date and Time string is ==>")
+ log.debug(date_buf)
+
+ result = self.libfax_marvell.create_packet(SET_FAX_SETTINGS, 0, 0, 0, 0, byref(i_buf))
+ result = self.libfax_marvell.create_fax_settings_packet(str(name), self.phone_num, date_buf, byref(c_buf))
+
+ msg_buf = buffer(i_buf)
+ msg_c_buf = buffer(c_buf)
+
+ for i in range(0, 32):
+ set_buf.write(msg_buf[i])
+ for i in range(0, 308):
+ set_buf.write(msg_c_buf[i])
+ set_buf = set_buf.getvalue()
+ log.debug("setStationName: SET_FAX_SETTINGS message and data ===> ")
+ log.log_data(set_buf, 340)
+
+ self.writeMarvellFax(set_buf)
+ ret_buf = cStringIO.StringIO()
+ while self.readMarvellFax(32, ret_buf, timeout=10):
+ pass
+ ret_buf = ret_buf.getvalue()
+ self.closeMarvellFax()
+
+ response = self.libfax_marvell.extract_response(ret_buf)
+ log.debug("setStationName: response is %d" % response)
+
+ log.debug("************************* setStationName END **************************")
+ return response
+
+
+ def getStationName(self):
+ int_array = c_int * 8
+ i_buf = int_array(0, 0, 0, 0, 0, 0, 0, 0)
+ st_buf = create_string_buffer(128)
+
+ log.debug("************************* getStationName START **************************")
+
+ result = self.libfax_marvell.create_packet(GET_FAX_SETTINGS, 0, 0, 0, 0, byref(i_buf))
+
+ buf = buffer(i_buf)
+ self.writeMarvellFax(buf)
+ #self.closeMarvellFax()
+
+ ret_buf = cStringIO.StringIO()
+ while self.readMarvellFax(512, ret_buf, timeout=10):
+ pass
+
+ ret_buf = ret_buf.getvalue()
+ self.closeMarvellFax()
+
+ response = self.libfax_marvell.extract_response(ret_buf)
+ log.debug("getStationName: response is %d" % response)
+
+ result = self.libfax_marvell.extract_station_name(ret_buf, st_buf)
+ log.debug("getStationName: station_name=%s ; result is %d" % (st_buf.value, result))
+
+ log.debug("************************* getStationName END **************************")
+ return st_buf.value
+
+
+ # Note down the station-name
+ station_name = property(getStationName, setStationName)
+
+
+ # Set date and time in the device's settings
+ #
+ # 1. Gets the message packet and fax_settings packet using fax_marvell.so
+ # 2. Writes the packets to the device; Reads response from the device
+ # 3. Extracts the status from the device's response
+ def setDateAndTime(self):
+ int_array = c_int * 8
+ i_buf = int_array(0, 0, 0, 0, 0, 0, 0, 0)
+
+ log.debug("************************* setDateAndTime START **************************")
+
+ c_buf = create_string_buffer(308)
+ set_buf = cStringIO.StringIO()
+ ret_buf = cStringIO.StringIO()
+ date_array = c_char * 15
+ date_buf = date_array()
+
+ t = time.localtime()
+
+ date_buf = "%4d%02d%02d%02d%02d%02d" % (t[0], t[1], t[2], t[3], t[4], t[5])
+ log.debug("Date and Time string is ==>")
+ log.debug(date_buf)
+
+ result = self.libfax_marvell.create_packet(SET_FAX_SETTINGS, 0, 0, 0, 0, byref(i_buf))
+ result = create_marvell_faxsettings_pkt(self.phone_num, self.station_name, date_buf, c_buf)
+
+ msg_buf = buffer(i_buf)
+ for i in range(0, 31):
+ set_buf.write(msg_buf[i])
+
+ set_buf.write(c_buf.raw)
+ set_buf = set_buf.getvalue()
+ self.dev.writeMarvellFax(set_buf)
+ while self.dev.readMarvellFax(32, ret_buf, timeout=5):
+ pass
+ ret_buf = ret_buf.getvalue()
+ self.closeMarvellFax()
+
+ response = self.libfax_marvell.extract_response(ret_buf)
+ log.debug("setDateAndTime: response is %d" % response)
+
+ return response
+
+
+ # Get the state of the device
+ #
+ # 1. Gets the message packet using fax_marvell.so
+ # 2. Writes the packet to the device; Reads response from the device
+ # 3. Extracts the response status and device status from the device's response
+ def getFaxDeviceState(self):
+ log.debug("************************* getFaxDeviceState: START **************************")
+
+ int_array = c_int * 8
+ i_buf = int_array(0, 0, 0, 0, 0, 0, 0, 0)
+ param1 = c_int(0)
+
+ result = self.libfax_marvell.create_packet(REQUEST_FAX_STATUS, 0, 0, 0, 0, byref(i_buf))
+ buf = buffer(i_buf)
+ self.writeMarvellFax(buf)
+
+ ret_buf = cStringIO.StringIO()
+ while self.readMarvellFax(32, ret_buf, timeout=5):
+ pass
+ ret_buf = ret_buf.getvalue()
+ self.closeMarvellFax()
+
+ response = self.libfax_marvell.extract_response(ret_buf)
+ log.debug("getFaxDeviceState: response is %d" % response)
+
+ return response
+
+
+ # Creates a thread which does actual Fax submission the state of the device
+ #
+ def sendFaxes(self, phone_num_list, fax_file_list, cover_message='', cover_re='',
+ cover_func=None, preserve_formatting=False, printer_name='',
+ update_queue=None, event_queue=None):
+
+ if not self.isSendFaxActive():
+
+ self.send_fax_thread = MarvellFaxSendThread(self, self.service, phone_num_list, fax_file_list,
+ cover_message, cover_re, cover_func,
+ preserve_formatting,
+ printer_name, update_queue,
+ event_queue)
+
+ self.send_fax_thread.start()
+ return True
+ else:
+ return False
+
+
+
+# **************************************************************************** #
+# Does the actual Fax transmission
+# **************************************************************************** #
+class MarvellFaxSendThread(FaxSendThread):
+ def __init__(self, dev, service, phone_num_list, fax_file_list,
+ cover_message='', cover_re='', cover_func=None, preserve_formatting=False,
+ printer_name='', update_queue=None, event_queue=None):
+
+ FaxSendThread.__init__(self, dev, service, phone_num_list, fax_file_list,
+ cover_message, cover_re, cover_func, preserve_formatting,
+ printer_name, update_queue, event_queue)
+
+
+ def run(self):
+
+ STATE_DONE = 0
+ STATE_ABORTED = 10
+ STATE_SUCCESS = 20
+ STATE_BUSY = 25
+ STATE_READ_SENDER_INFO = 30
+ STATE_PRERENDER = 40
+ STATE_COUNT_PAGES = 50
+ STATE_NEXT_RECIPIENT = 60
+ STATE_COVER_PAGE = 70
+ STATE_SINGLE_FILE = 80
+ STATE_MERGE_FILES = 90
+ STATE_SINGLE_FILE = 100
+ STATE_SEND_FAX = 110
+ STATE_CLEANUP = 120
+ STATE_ERROR = 130
+
+ next_recipient = self.next_recipient_gen()
+
+ rec_name = None
+ rec_num = None
+
+ state = STATE_READ_SENDER_INFO
+ self.rendered_file_list = []
+
+ while state != STATE_DONE: # --------------------------------- Fax state machine
+ if self.check_for_cancel():
+ log.debug("***** Job is Cancelled.")
+ state = STATE_ABORTED
+
+ log.debug("*************** STATE=(%d, 0, 0)" % state)
+
+ if state == STATE_ABORTED: # --------------------------------- Aborted
+ log.error("Aborted by user.")
+ self.write_queue((STATUS_IDLE, 0, ''))
+ state = STATE_CLEANUP
+
+
+ elif state == STATE_SUCCESS: # --------------------------------- Success
+ log.debug("Success.")
+ self.write_queue((STATUS_COMPLETED, 0, ''))
+ state = STATE_CLEANUP
+
+
+ elif state == STATE_ERROR: # --------------------------------- Error
+ log.error("Error, aborting.")
+ self.write_queue((STATUS_ERROR, 0, ''))
+ state = STATE_CLEANUP
+
+
+ elif state == STATE_BUSY: # --------------------------------- Busy
+ log.error("Device busy, aborting.")
+ self.write_queue((STATUS_BUSY, 0, ''))
+ state = STATE_CLEANUP
+
+
+ elif state == STATE_READ_SENDER_INFO: # --------------------------------- Get sender info
+ log.debug("%s State: Get sender info" % ("*"*20))
+ state = STATE_PRERENDER
+ try:
+ try:
+ self.dev.open()
+ except Error, e:
+ log.error("Unable to open device (%s)." % e.msg)
+ state = STATE_ERROR
+ else:
+ try:
+ self.sender_name = self.dev.station_name
+ self.sender_fax = self.dev.phone_num
+ except Error:
+ log.error("Getting station-name and phone_num failed!")
+ state = STATE_ERROR
+
+ finally:
+ self.dev.close()
+
+
+ elif state == STATE_PRERENDER: # --------------------------------- Pre-render non-G3 files
+ log.debug("%s State: Pre-render non-G3 files" % ("*"*20))
+ state = self.pre_render(STATE_COUNT_PAGES)
+
+
+ elif state == STATE_COUNT_PAGES: # --------------------------------- Get total page count
+ log.debug("%s State: Get total page count" % ("*"*20))
+ state = self.count_pages(STATE_NEXT_RECIPIENT)
+
+
+ elif state == STATE_NEXT_RECIPIENT: # --------------------------------- Loop for multiple recipients
+ log.debug("%s State: Next recipient" % ("*"*20))
+ state = STATE_COVER_PAGE
+
+ try:
+ recipient = next_recipient.next()
+
+ self.write_queue((STATUS_SENDING_TO_RECIPIENT, 0, recipient['name']))
+
+ rec_name = recipient['name']
+ rec_num = recipient['fax'].encode('ascii')
+ log.debug("recipient is %s num is %s" % (rec_name, rec_num))
+
+ except StopIteration:
+ state = STATE_SUCCESS
+ log.debug("Last recipient.")
+ continue
+
+ self.recipient_file_list = self.rendered_file_list[:]
+
+
+ elif state == STATE_COVER_PAGE: # --------------------------------- Create cover page
+ log.debug("%s State: Render cover page" % ("*"*20))
+ state = self.cover_page(recipient)
+
+
+ elif state == STATE_SINGLE_FILE: # --------------------------------- Special case for single file (no merge)
+ log.debug("%s State: Handle single file" % ("*"*20))
+ state = self.single_file(STATE_SEND_FAX)
+
+ elif state == STATE_MERGE_FILES: # --------------------------------- Merge multiple G3 files
+ log.debug("%s State: Merge multiple files" % ("*"*20))
+ log.debug("Not merging the files for Marvell support")
+ state = STATE_SEND_FAX
+
+ elif state == STATE_SEND_FAX: # --------------------------------- Send fax state machine
+ log.debug("%s State: Send fax" % ("*"*20))
+ state = STATE_NEXT_RECIPIENT
+
+ next_file = self.next_file_gen()
+
+ FAX_SEND_STATE_DONE = 0
+ FAX_SEND_STATE_SUCCESS = 10
+ FAX_SEND_STATE_ABORT = 21
+ FAX_SEND_STATE_ERROR = 22
+ FAX_SEND_STATE_BUSY = 25
+ FAX_SEND_STATE_DEVICE_OPEN = 30
+ FAX_SEND_STATE_NEXT_FILE = 35
+ FAX_SEND_STATE_CHECK_IDLE = 40
+ FAX_SEND_STATE_START_JOB_REQUEST = 50
+ FAX_SEND_STATE_SEND_JOB_REQUEST = 60
+ FAX_SEND_STATE_SET_PARAMS = 70
+ FAX_SEND_STATE_SEND_FAX_HEADER = 80
+ FAX_SEND_STATE_SEND_FILE_DATA = 90
+ FAX_SEND_STATE_END_FILE_DATA = 100
+ FAX_SEND_STATE_END_JOB_REQUEST = 110
+ FAX_SEND_STATE_GET_LOG_INFORMATION = 120
+
+ monitor_state = False
+ current_state = SUCCESS
+ fax_send_state = FAX_SEND_STATE_DEVICE_OPEN
+
+ while fax_send_state != FAX_SEND_STATE_DONE:
+
+ if self.check_for_cancel():
+ log.error("Fax send aborted.")
+ fax_send_state = FAX_SEND_STATE_ABORT
+
+ if monitor_state:
+ fax_state = self.getFaxDeviceState()
+ if fax_state != SUCCESS:
+ log.error("Device is in error state=%d" % fax_state)
+ fax_send_state = FAX_SEND_STATE_ERROR
+ state = STATE_ERROR
+
+
+ log.debug("********* FAX_SEND_STATE=(%d, %d, %d)" % (STATE_SEND_FAX, fax_send_state, current_state))
+
+ if fax_send_state == FAX_SEND_STATE_ABORT: # -------------- Abort
+ monitor_state = False
+ fax_send_state = FAX_SEND_STATE_END_JOB_REQUEST
+ state = STATE_ABORTED
+
+ elif fax_send_state == FAX_SEND_STATE_ERROR: # -------------- Error
+ log.error("Fax send error.")
+ monitor_state = False
+
+ fax_send_state = FAX_SEND_STATE_END_JOB_REQUEST
+ state = STATE_ERROR
+
+ elif fax_send_state == FAX_SEND_STATE_BUSY: # -------------- Busy
+ log.error("Fax device busy.")
+ monitor_state = False
+ fax_send_state = FAX_SEND_STATE_END_JOB_REQUEST
+ state = STATE_BUSY
+
+ elif fax_send_state == FAX_SEND_STATE_SUCCESS: # -------------- Success
+ log.debug("Fax send success.")
+ monitor_state = False
+ fax_send_state = FAX_SEND_STATE_END_JOB_REQUEST
+ state = STATE_NEXT_RECIPIENT
+
+ elif fax_send_state == FAX_SEND_STATE_DEVICE_OPEN: # -------------- Device open
+ log.debug("%s State: Open device" % ("*"*20))
+ fax_send_state = FAX_SEND_STATE_NEXT_FILE
+ try:
+ self.dev.open()
+ except Error, e:
+ log.error("Unable to open device (%s)." % e.msg)
+ fax_send_state = FAX_SEND_STATE_ERROR
+ else:
+ if self.dev.device_state == DEVICE_STATE_NOT_FOUND:
+ fax_send_state = FAX_SEND_STATE_ERROR
+
+
+ elif fax_send_state == FAX_SEND_STATE_NEXT_FILE: # -------------- Device open
+ log.debug("%s State: Open device" % ("*"*20))
+ fax_send_state = FAX_SEND_STATE_CHECK_IDLE
+ try:
+ fax_file = next_file.next()
+ self.f = fax_file[0]
+ log.debug("***** file name is : %s..." % self.f)
+ except StopIteration:
+ log.debug("file(s) are sent to the device" )
+ fax_send_state = FAX_SEND_STATE_DONE
+
+
+ elif fax_send_state == FAX_SEND_STATE_CHECK_IDLE: # -------------- Check for initial idle
+ log.debug("%s State: Check idle" % ("*"*20))
+ fax_send_state = FAX_SEND_STATE_START_JOB_REQUEST
+
+ try:
+ ff = file(self.f, 'r')
+ except IOError:
+ log.error("Unable to read fax file.")
+ fax_send_state = FAX_SEND_STATE_ERROR
+ continue
+
+ try:
+ header = ff.read(FILE_HEADER_SIZE)
+ except IOError:
+ log.error("Unable to read fax file.")
+ fax_send_state = FAX_SEND_STATE_ERROR
+ continue
+
+ magic, version, total_pages, hort_dpi, vert_dpi, page_size, \
+ resolution, encoding, reserved1, reserved2 = self.decode_fax_header(header)
+
+ if magic != 'hplip_g3':
+ log.error("Invalid file header. Bad magic.")
+ fax_send_state = FAX_SEND_STATE_ERROR
+ else:
+ log.debug("Magic=%s Version=%d Total Pages=%d hDPI=%d vDPI=%d Size=%d Resolution=%d Encoding=%d"
+ % (magic, version, total_pages, hort_dpi, vert_dpi, page_size, resolution, encoding))
+
+ dev_state = self.dev.getFaxDeviceState()
+
+ if (dev_state == 0):
+ log.debug("State: device status is zero ")
+ else:
+ log.debug("State: device status is non-zero ")
+ fax_send_state = FAX_SEND_STATE_BUSY
+
+
+ elif fax_send_state == FAX_SEND_STATE_START_JOB_REQUEST: # -------------- Request fax start
+ log.debug("%s State: Request start" % ("*"*20))
+ fax_send_state = FAX_SEND_STATE_SEND_JOB_REQUEST
+
+ file_len = os.stat(self.f)[ST_SIZE]
+ tx_data_len = file_len - FILE_HEADER_SIZE - (PAGE_HEADER_SIZE*total_pages)
+ log.debug("#### file_len = %d" % file_len)
+ log.debug("#### tx_data_len = %d" % tx_data_len)
+ ret_value = self.dev.send_packet_for_message(START_FAX_JOB, tx_data_len, 0, 0, 0)
+ if ret_value:
+ log.debug("Sending start fax request failed with %d" % ret_value)
+ fax_send_state = FAX_SEND_STATE_ERROR
+ else:
+ log.debug("Successfully sent start fax request")
+ ret_buf = self.dev.read_response_for_message(START_FAX_JOB)
+ dev_response = self.dev.libfax_marvell.extract_response(ret_buf)
+ if dev_response:
+ log.debug("start-fax request failed with %d" % dev_response)
+ fax_send_state = FAX_SEND_STATE_ERROR
+ else:
+ log.debug("start-fax request is successful")
+
+ elif fax_send_state == FAX_SEND_STATE_SEND_JOB_REQUEST: # -------------- Set data request
+ log.debug("%s State: Send data request" % ("*"*20))
+ fax_send_state = FAX_SEND_STATE_SET_PARAMS
+
+ ret_value = self.dev.send_packet_for_message(SEND_FAX_JOB)
+ if ret_value:
+ log.debug("Sending send-data request failed with %d" % ret_value)
+ fax_send_state = FAX_SEND_STATE_ERROR
+ else:
+ log.debug("Successfully sent send-fax request")
+
+
+ elif fax_send_state == FAX_SEND_STATE_SET_PARAMS: # -------------- Set fax send params
+ log.debug("%s State: Set params" % ("*"*20))
+ fax_send_state = FAX_SEND_STATE_SEND_FAX_HEADER
+
+ c_buf = create_string_buffer(68)
+ set_buf = cStringIO.StringIO()
+
+ no_data = None
+ ret_val = self.dev.libfax_marvell.create_job_settings_packet(no_data, rec_num, c_buf)
+ set_buf.write(c_buf.raw)
+ set_buf = set_buf.getvalue()
+
+ self.dev.writeMarvellFax(set_buf)
+ #self.dev.closeMarvellFax()
+
+
+ elif fax_send_state == FAX_SEND_STATE_SEND_FAX_HEADER: # -------------- Fax header
+ # Taken care by the device
+ fax_send_state = FAX_SEND_STATE_SEND_FILE_DATA
+
+ elif fax_send_state == FAX_SEND_STATE_SEND_FILE_DATA: # --------------------------------- Send fax pages state machine
+ log.debug("%s State: Send pages" % ("*"*20))
+ fax_send_state = FAX_SEND_STATE_END_FILE_DATA
+ current_state = SUCCESS
+ page = StringIO()
+
+ file_len = os.stat(self.f)[ST_SIZE]
+ bytes_to_read = file_len - FILE_HEADER_SIZE - (PAGE_HEADER_SIZE*total_pages)
+
+ for p in range(total_pages):
+
+ if self.check_for_cancel():
+ current_state = FAILURE
+
+ if current_state == FAILURE:
+ break
+
+ try:
+ header = ff.read(PAGE_HEADER_SIZE)
+ except IOError:
+ log.error("Unable to read fax file.")
+ current_state = FAILURE
+ continue
+
+ page_num, ppr, rpp, b_to_read, thumbnail_bytes, reserved2 = \
+ self.decode_page_header(header)
+
+ log.debug("Page=%d PPR=%d RPP=%d BPP=%d Thumb=%d" %
+ (page_num, ppr, rpp, b_to_read, thumbnail_bytes))
+
+ page.write(ff.read(b_to_read))
+ thumbnail = ff.read(thumbnail_bytes) # thrown away for now (should be 0 read)
+ page.seek(0)
+ bytes_to_write = b_to_read
+ total_read = 0
+ while (bytes_to_write > 0):
+ try:
+ data = page.read(FAX_DATA_BLOCK_SIZE)
+ except IOError:
+ log.error("Unable to read fax file.")
+ current_state = FAILURE
+ continue
+
+ if data == '':
+ log.error("No data!")
+ current_state = FAILURE
+ break
+
+ if self.check_for_cancel():
+ current_state = FAILURE
+ log.error("Job is cancelled. Aborting...")
+ break
+
+ total_read += FAX_DATA_BLOCK_SIZE
+
+ try:
+ ret_value = self.dev.send_packet_for_message(FAX_DATA_BLOCK, 0, 0, 0, len(data))
+ if ret_value:
+ log.debug("Sending fax-data-block request failed with %d" % ret_value)
+ current_state = FAILURE
+ else:
+ log.debug("Successfully sent fax-data-block request")
+
+ self.dev.writeMarvellFax(data)
+ #self.dev.closeMarvellFax()
+ except Error:
+ log.error("Channel write error.")
+ current_state = FAILURE
+ break
+
+ bytes_to_write = bytes_to_write - FAX_DATA_BLOCK_SIZE
+
+ page.truncate(0)
+ page.seek(0)
+
+
+ elif fax_send_state == FAX_SEND_STATE_END_FILE_DATA: # -------------- end-of-data
+ log.debug("%s State: Send end-of-file-data request" % ("*"*20))
+ fax_send_state = FAX_SEND_STATE_END_JOB_REQUEST
+
+ ret_value = self.dev.send_packet_for_message(FAX_DATA_BLOCK, 0, 0, current_state, 0)
+ if ret_value:
+ log.debug("Sending fax-data-block packet failed with %d" % ret_value)
+ current_state = FAILURE
+ else:
+ log.debug("Successfully sent fax-data-block request")
+ ret_buf = self.dev.read_response_for_message(SEND_FAX_JOB)
+ dev_response = self.dev.libfax_marvell.extract_response(ret_buf)
+ if dev_response:
+ log.debug("send-fax request failed with %d" % dev_response)
+ current_state = FAILURE
+ else:
+ log.debug("send-fax request is successful")
+
+ if current_state:
+ log.debug("Exiting...")
+ sys.exit(1)
+
+
+ elif fax_send_state == FAX_SEND_STATE_END_JOB_REQUEST: # -------------- Wait for complete
+ log.debug("%s State: End the job" % ("*"*20))
+ fax_send_state = FAX_SEND_STATE_NEXT_FILE
+
+ ret_value = self.dev.send_packet_for_message(END_FAX_JOB, 0, 0, current_state, 0)
+ if ret_value:
+ log.debug("Sending end-fax-job packet failed with %d" % ret_value)
+ current_state = FAILURE
+ else:
+ log.debug("Successfully sent end-fax-job request")
+ ret_buf = self.dev.read_response_for_message(END_FAX_JOB)
+ dev_response = self.dev.libfax_marvell.extract_response(ret_buf)
+ if dev_response:
+ log.debug("end-fax-job request failed with %d" % dev_response)
+ current_state = FAILURE
+ else:
+ log.debug("end-fax-job request is successful")
+
+ if current_state != SUCCESS:
+ # There was an error during transmission...
+ log.error("An error occurred! setting fax_send_state to DONE")
+ fax_send_state = FAX_SEND_STATE_DONE
+
+ try:
+ ff.close()
+ except NameError:
+ pass
+
+ time.sleep(1)
+
+ self.dev.close()
+
+
+ elif state == STATE_CLEANUP: # --------------------------------- Cleanup
+ log.debug("%s State: Cleanup" % ("*"*20))
+
+ if self.remove_temp_file:
+ log.debug("Removing merged file: %s" % self.f)
+ try:
+ os.remove(self.f)
+ log.debug("Removed")
+ except OSError:
+ log.debug("Not found")
+
+ state = STATE_DONE
+
+
diff --git a/fax/pmlfax.py b/fax/pmlfax.py
new file mode 100644
index 0000000..45a55f2
--- /dev/null
+++ b/fax/pmlfax.py
@@ -0,0 +1,1026 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2007 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+# Std Lib
+import sys
+import os
+import os.path
+import struct
+import time
+import threading
+
+# Local
+from base.g import *
+from base.codes import *
+from base import device, utils, pml, codes
+from prnt import cups
+from fax import *
+
+
+# **************************************************************************** #
+
+# Page flags
+PAGE_FLAG_NONE = 0x00
+PAGE_FLAG_NEW_PAGE = 0x01
+PAGE_FLAG_END_PAGE = 0x02
+PAGE_FLAG_NEW_DOC = 0x04
+PAGE_FLAG_END_DOC = 0x08
+PAGE_FLAG_END_STREAM = 0x10
+
+MAJOR_VER = 2
+MINOR_VER = 0
+
+MFPDTF_RASTER_BITMAP = 0 # Not used
+MFPDTF_RASTER_GRAYMAP = 1 # Not used
+MFPDTF_RASTER_MH = 2 # OfficeJets B&W Fax
+MFPDTF_RASTER_MR = 3 # Not used
+MFPDTF_RASTER_MMR = 4 # LaserJets B&W Fax
+MFPDTF_RASTER_RGB = 5 # Not used
+MFPDTF_RASTER_YCC411 = 6 # Not used
+MFPDTF_RASTER_JPEG = 7 # Color Fax
+MFPDTF_RASTER_PCL = 8 # Not used
+MFPDTF_RASTER_NOT = 9 # Not used
+
+# Data types for FH
+DT_UNKNOWN = 0
+DT_FAX_IMAGES = 1
+DT_SCANNED_IMAGES= 2
+DT_DIAL_STRINGS = 3
+DT_DEMO_PAGES = 4
+DT_SPEED_DIALS = 5
+DT_FAX_LOGS = 6
+DT_CFG_PARMS = 7
+DT_LANG_STRS = 8
+DT_JUNK_FAX_CSIDS= 9
+DT_REPORT_STRS = 10
+DT_FONTS = 11
+DT_TTI_BITMAP = 12
+DT_COUNTERS = 13
+DT_DEF_PARMS = 14
+DT_SCAN_OPTIONS = 15
+DT_FW_JOB_TABLE = 17
+
+# Raster data record types
+RT_START_PAGE = 0
+RT_RASTER = 1
+RT_END_PAGE = 2
+
+# FH
+FIXED_HEADER_SIZE = 8
+
+# Variants
+IMAGE_VARIANT_HEADER_SIZE = 10
+DIAL_STRINGS_VARIANT_HEADER_SIZE = 6
+FAX_IMAGE_VARIANT_HEADER_SIZE = 74
+
+# Data records
+SOP_RECORD_SIZE = 36
+RASTER_RECORD_SIZE = 4
+EOP_RECORD_SIZE = 12
+DIAL_STRING_RECORD_SIZE = 51
+
+# Page flags
+PAGE_FLAG_NEW_PAGE = 0x01
+PAGE_FLAG_END_PAGE = 0x02
+PAGE_FLAG_NEW_DOC = 0x04
+PAGE_FLAG_END_DOC = 0x08
+PAGE_FLAG_END_STREAM = 0x10
+
+# Fax data variant header data source
+SRC_UNKNOWN = 0
+SRC_HOST = 2
+SRC_SCANNER = 5
+SRC_HOST_THEN_SCANNER = 6
+SRC_SCANNER_THEN_HOST = 7
+
+# Fax data variant header TTI header control
+TTI_NONE = 0
+TTI_PREPENDED_TO_IMAGE = 1
+TTI_OVERLAYED_ON_IMAGE = 2
+
+RASTER_DATA_SIZE = 504
+
+
+
+# **************************************************************************** #
+class PMLFaxDevice(FaxDevice):
+
+ def __init__(self, device_uri=None, printer_name=None,
+ callback=None,
+ fax_type=FAX_TYPE_NONE,
+ disable_dbus=False):
+
+ FaxDevice.__init__(self, device_uri,
+ printer_name,
+ callback, fax_type,
+ disable_dbus)
+
+ self.send_fax_thread = None
+ self.upload_log_thread = None
+
+
+ def setPhoneNum(self, num):
+ return self.setPML(pml.OID_FAX_LOCAL_PHONE_NUM, str(num))
+
+ def getPhoneNum(self):
+ return utils.printable(str(self.getPML(pml.OID_FAX_LOCAL_PHONE_NUM)[1]))
+
+ phone_num = property(getPhoneNum, setPhoneNum, doc="OID_FAX_LOCAL_PHONE_NUM")
+
+
+ def setStationName(self, name):
+ return self.setPML(pml.OID_FAX_STATION_NAME, str(name))
+
+ def getStationName(self):
+ return utils.printable(str(self.getPML(pml.OID_FAX_STATION_NAME)[1]))
+
+ station_name = property(getStationName, setStationName, doc="OID_FAX_STATION_NAME")
+
+ def setDateAndTime(self):
+ t = time.localtime()
+ p = struct.pack("BBBBBBB", t[0]-2000, t[1], t[2], t[6]+1, t[3], t[4], t[5])
+ log.debug(repr(p))
+ return self.setPML(pml.OID_DATE_AND_TIME, p)
+
+ def uploadLog(self):
+ if not self.isUloadLogActive():
+ self.upload_log_thread = UploadLogThread(self)
+ self.upload_log_thread.start()
+ return True
+ else:
+ return False
+
+ def isUploadLogActive(self):
+ if self.upload_log_thread is not None:
+ return self.upload_log_thread.isAlive()
+ else:
+ return False
+
+ def waitForUploadLogThread(self):
+ if self.upload_log_thread is not None and \
+ self.upload_log_thread.isAlive():
+
+ self.upload_log_thread.join()
+
+ def sendFaxes(self, phone_num_list, fax_file_list, cover_message='', cover_re='',
+ cover_func=None, preserve_formatting=False, printer_name='',
+ update_queue=None, event_queue=None):
+
+ if not self.isSendFaxActive():
+
+ self.send_fax_thread = PMLFaxSendThread(self, self.service, phone_num_list, fax_file_list,
+ cover_message, cover_re, cover_func,
+ preserve_formatting,
+ printer_name, update_queue,
+ event_queue)
+
+ self.send_fax_thread.start()
+ return True
+ else:
+ return False
+
+
+
+# **************************************************************************** #
+class PMLUploadLogThread(threading.Thread):
+ def __init__(self, dev):
+ threading.Thread.__init__(self)
+ self.dev = dev
+
+
+ def run(self):
+ STATE_DONE = 0
+ STATE_ABORT = 10
+ STATE_SUCCESS = 20
+ STATE_BUSY = 25
+ STATE_DEVICE_OPEN = 28
+ STATE_CHECK_IDLE = 30
+ STATE_REQUEST_START = 40
+ STATE_WAIT_FOR_ACTIVE = 50
+ STATE_UPLOAD_DATA = 60
+ STATE_DEVICE_CLOSE = 70
+
+ state = STATE_CHECK_IDLE
+
+ while state != STATE_DONE: # --------------------------------- Log upload state machine
+ if state == STATE_ABORT:
+ pass
+ elif state == STATE_SUCCESS:
+ pass
+ elif state == STATE_BUSY:
+ pass
+
+ elif state == STATE_DEVICE_OPEN: # --------------------------------- Open device (28)
+ state = STATE_REQUEST_START
+ try:
+ self.dev.open()
+ except Error, e:
+ log.error("Unable to open device (%s)." % e.msg)
+ state = STATE_ERROR
+ else:
+ try:
+ dev.setPML(pml.OID_UPLOAD_TIMEOUT, pml.DEFAULT_UPLOAD_TIMEOUT)
+ except Error:
+ state = STATE_ERROR
+
+ elif state == STATE_CHECK_IDLE: # --------------------------------- Check idle (30)
+ state = STATE_REQUEST_START
+ ul_state = self.getCfgUploadState()
+
+ if ul_state != pml.UPDN_STATE_IDLE:
+ state = STATE_BUSY
+
+
+ elif state == STATE_REQUEST_START: # --------------------------------- Request start (40)
+ state = STATE_WAIT_FOR_ACTIVE
+ self.dev.setPML(pml.OID_FAX_CFG_UPLOAD_DATA_TYPE, pml.FAX_CFG_UPLOAD_DATA_TYPE_FAXLOGS)
+ self.dev.setPML(pml.OID_DEVICE_CFG_UPLOAD, pml.UPDN_STATE_REQSTART)
+
+ elif state == STATE_WAIT_FOR_ACTIVE: # --------------------------------- Wait for active state (50)
+ state = STATE_UPLOAD_DATA
+
+ tries = 0
+ while True:
+ tries += 1
+ ul_state = self.getCfgUploadState()
+
+ if ul_state == pml.UPDN_STATE_XFERACTIVE:
+ break
+
+ if ul_state in (pml.UPDN_STATE_ERRORABORT, pml.UPDN_STATE_XFERDONE):
+ log.error("Cfg upload aborted!")
+ state = STATE_ERROR
+ break
+
+ if tries > 10:
+ state = STATE_ERROR
+ log.error("Unable to get into active state!")
+ break
+
+ time.sleep(0.5)
+
+ elif state == STATE_UPLOAD_DATA: # --------------------------------- Upload log data (60)
+ pass
+
+ elif state == STATE_DEVICE_CLOSE: # --------------------------------- Close device (70)
+ self.dev.close()
+
+
+
+# **************************************************************************** #
+class PMLFaxSendThread(FaxSendThread):
+ def __init__(self, dev, service, phone_num_list, fax_file_list,
+ cover_message='', cover_re='', cover_func=None, preserve_formatting=False,
+ printer_name='', update_queue=None, event_queue=None):
+
+ FaxSendThread.__init__(self, dev, service, phone_num_list, fax_file_list,
+ cover_message, cover_re, cover_func, preserve_formatting,
+ printer_name, update_queue, event_queue)
+
+
+ def run(self):
+ #results = {} # {'file' : error_code,...}
+
+ STATE_DONE = 0
+ STATE_ABORTED = 10
+ STATE_SUCCESS = 20
+ STATE_BUSY = 25
+ STATE_READ_SENDER_INFO = 30
+ STATE_PRERENDER = 40
+ STATE_COUNT_PAGES = 50
+ STATE_NEXT_RECIPIENT = 60
+ STATE_COVER_PAGE = 70
+ STATE_SINGLE_FILE = 80
+ STATE_MERGE_FILES = 90
+ STATE_SINGLE_FILE = 100
+ STATE_SEND_FAX = 110
+ STATE_CLEANUP = 120
+ STATE_ERROR = 130
+
+ next_recipient = self.next_recipient_gen()
+
+ state = STATE_READ_SENDER_INFO
+ self.rendered_file_list = []
+
+ while state != STATE_DONE: # --------------------------------- Fax state machine
+ if self.check_for_cancel():
+ state = STATE_ABORTED
+
+ log.debug("STATE=(%d, 0, 0)" % state)
+
+ if state == STATE_ABORTED: # --------------------------------- Aborted (10, 0, 0)
+ log.error("Aborted by user.")
+ self.write_queue((STATUS_IDLE, 0, ''))
+ state = STATE_CLEANUP
+
+
+ elif state == STATE_SUCCESS: # --------------------------------- Success (20, 0, 0)
+ log.debug("Success.")
+ self.write_queue((STATUS_COMPLETED, 0, ''))
+ state = STATE_CLEANUP
+
+
+ elif state == STATE_ERROR: # --------------------------------- Error (130, 0, 0)
+ log.error("Error, aborting.")
+ self.write_queue((STATUS_ERROR, 0, ''))
+ state = STATE_CLEANUP
+
+
+ elif state == STATE_BUSY: # --------------------------------- Busy (25, 0, 0)
+ log.error("Device busy, aborting.")
+ self.write_queue((STATUS_BUSY, 0, ''))
+ state = STATE_CLEANUP
+
+
+ elif state == STATE_READ_SENDER_INFO: # --------------------------------- Get sender info (30, 0, 0)
+ log.debug("%s State: Get sender info" % ("*"*20))
+ state = STATE_PRERENDER
+ try:
+ try:
+ self.dev.open()
+ except Error, e:
+ log.error("Unable to open device (%s)." % e.msg)
+ state = STATE_ERROR
+ else:
+ try:
+ self.sender_name = self.dev.station_name
+ log.debug("Sender name=%s" % self.sender_name)
+ self.sender_fax = self.dev.phone_num
+ log.debug("Sender fax=%s" % self.sender_fax)
+ except Error:
+ log.error("PML get failed!")
+ state = STATE_ERROR
+
+ finally:
+ self.dev.close()
+
+
+ elif state == STATE_PRERENDER: # --------------------------------- Pre-render non-G3 files (40, 0, 0)
+ log.debug("%s State: Pre-render non-G3 files" % ("*"*20))
+ state = self.pre_render(STATE_COUNT_PAGES)
+
+
+ elif state == STATE_COUNT_PAGES: # --------------------------------- Get total page count (50, 0, 0)
+ log.debug("%s State: Get total page count" % ("*"*20))
+ state = self.count_pages(STATE_NEXT_RECIPIENT)
+
+
+ elif state == STATE_NEXT_RECIPIENT: # --------------------------------- Loop for multiple recipients (60, 0, 0)
+ log.debug("%s State: Next recipient" % ("*"*20))
+ state = STATE_COVER_PAGE
+
+ try:
+ recipient = next_recipient.next()
+ #print recipient
+ log.debug("Processing for recipient %s" % recipient['name'])
+
+ self.write_queue((STATUS_SENDING_TO_RECIPIENT, 0, recipient['name']))
+
+ except StopIteration:
+ state = STATE_SUCCESS
+ log.debug("Last recipient.")
+ continue
+
+ self.recipient_file_list = self.rendered_file_list[:]
+
+
+ elif state == STATE_COVER_PAGE: # --------------------------------- Create cover page (70, 0, 0)
+ log.debug("%s State: Render cover page" % ("*"*20))
+ state = self.cover_page(recipient)
+
+
+ elif state == STATE_SINGLE_FILE: # --------------------------------- Special case for single file (no merge) (80, 0, 0)
+ log.debug("%s State: Handle single file" % ("*"*20))
+ state = self.single_file(STATE_SEND_FAX)
+
+ elif state == STATE_MERGE_FILES: # --------------------------------- Merge multiple G3 files (90, 0, 0)
+ log.debug("%s State: Merge multiple files" % ("*"*20))
+ state = self.merge_files(STATE_SEND_FAX)
+
+ elif state == STATE_SEND_FAX: # --------------------------------- Send fax state machine (110, 0, 0)
+ log.debug("%s State: Send fax" % ("*"*20))
+ state = STATE_NEXT_RECIPIENT
+
+ FAX_SEND_STATE_DONE = 0
+ FAX_SEND_STATE_ABORT = 10
+ FAX_SEND_STATE_ERROR = 20
+ FAX_SEND_STATE_BUSY = 25
+ FAX_SEND_STATE_SUCCESS = 30
+ FAX_SEND_STATE_DEVICE_OPEN = 40
+ FAX_SEND_STATE_SET_TOKEN = 50
+ FAX_SEND_STATE_EARLY_OPEN = 60
+ FAX_SEND_STATE_SET_PARAMS = 70
+ FAX_SEND_STATE_CHECK_IDLE = 80
+ FAX_SEND_STATE_START_REQUEST = 90
+ FAX_SEND_STATE_LATE_OPEN = 100
+ FAX_SEND_STATE_SEND_DIAL_STRINGS = 110
+ FAX_SEND_STATE_SEND_FAX_HEADER = 120
+ FAX_SEND_STATE_SEND_PAGES = 130
+ FAX_SEND_STATE_SEND_END_OF_STREAM = 140
+ FAX_SEND_STATE_WAIT_FOR_COMPLETE = 150
+ FAX_SEND_STATE_RESET_TOKEN = 160
+ FAX_SEND_STATE_CLOSE_SESSION = 170
+
+ monitor_state = False
+ error_state = pml.DN_ERROR_NONE
+ fax_send_state = FAX_SEND_STATE_DEVICE_OPEN
+
+ while fax_send_state != FAX_SEND_STATE_DONE:
+
+ if self.check_for_cancel():
+ log.error("Fax send aborted.")
+ fax_send_state = FAX_SEND_STATE_ABORT
+
+ if monitor_state:
+ fax_state = self.getFaxDownloadState()
+ if not fax_state in (pml.UPDN_STATE_XFERACTIVE, pml.UPDN_STATE_XFERDONE):
+ log.error("D/L error state=%d" % fax_state)
+ fax_send_state = FAX_SEND_STATE_ERROR
+ state = STATE_ERROR
+
+ log.debug("STATE=(%d, %d, 0)" % (STATE_SEND_FAX, fax_send_state))
+
+ if fax_send_state == FAX_SEND_STATE_ABORT: # -------------- Abort (110, 10, 0)
+ # TODO: Set D/L state to ???
+ monitor_state = False
+ fax_send_state = FAX_SEND_STATE_RESET_TOKEN
+ state = STATE_ABORTED
+
+ elif fax_send_state == FAX_SEND_STATE_ERROR: # -------------- Error (110, 20, 0)
+ log.error("Fax send error.")
+ error_state = self.getFaxDownloadError()
+ log.debug("Error State=%d (%s)" % (error_state, pml.DN_ERROR_STR.get(error_state, "Unknown")))
+ monitor_state = False
+
+ fax_send_state = FAX_SEND_STATE_RESET_TOKEN
+ state = STATE_ERROR
+
+ elif fax_send_state == FAX_SEND_STATE_BUSY: # -------------- Busy (110, 25, 0)
+ log.error("Fax device busy.")
+ monitor_state = False
+ fax_send_state = FAX_SEND_STATE_RESET_TOKEN
+ state = STATE_BUSY
+
+ elif fax_send_state == FAX_SEND_STATE_SUCCESS: # -------------- Success (110, 30, 0)
+ log.debug("Fax send success.")
+ monitor_state = False
+ fax_send_state = FAX_SEND_STATE_RESET_TOKEN
+ state = STATE_NEXT_RECIPIENT
+
+ elif fax_send_state == FAX_SEND_STATE_DEVICE_OPEN: # -------------- Device open (110, 40, 0)
+ log.debug("%s State: Open device" % ("*"*20))
+ fax_send_state = FAX_SEND_STATE_SET_TOKEN
+ try:
+ self.dev.open()
+ except Error, e:
+ log.error("Unable to open device (%s)." % e.msg)
+ fax_send_state = FAX_SEND_STATE_ERROR
+ else:
+ if self.dev.device_state == DEVICE_STATE_NOT_FOUND:
+ fax_send_state = FAX_SEND_STATE_ERROR
+
+ elif fax_send_state == FAX_SEND_STATE_SET_TOKEN: # -------------- Acquire fax token (110, 50, 0)
+ log.debug("%s State: Acquire fax token" % ("*"*20))
+ try:
+ result_code, token = self.dev.getPML(pml.OID_FAX_TOKEN)
+ except Error:
+ log.debug("Unable to acquire fax token (1).")
+ fax_send_state = FAX_SEND_STATE_EARLY_OPEN
+ else:
+ if result_code > pml.ERROR_MAX_OK:
+ fax_send_state = FAX_SEND_STATE_EARLY_OPEN
+ log.debug("Skipping token acquisition.")
+ else:
+ token = time.strftime("%d%m%Y%H:%M:%S", time.gmtime())
+ log.debug("Setting token: %s" % token)
+ try:
+ self.dev.setPML(pml.OID_FAX_TOKEN, token)
+ except Error:
+ log.error("Unable to acquire fax token (2).")
+ fax_send_state = FAX_SEND_STATE_ERROR
+ else:
+ result_code, check_token = self.dev.getPML(pml.OID_FAX_TOKEN)
+
+ if check_token == token:
+ fax_send_state = FAX_SEND_STATE_EARLY_OPEN
+ else:
+ log.error("Unable to acquire fax token (3).")
+ fax_send_state = FAX_SEND_STATE_ERROR
+
+
+ elif fax_send_state == FAX_SEND_STATE_EARLY_OPEN: # -------------- Early open (newer models) (110, 60, 0)
+ log.debug("%s State: Early open" % ("*"*20))
+ fax_send_state = FAX_SEND_STATE_CHECK_IDLE
+
+ if self.dev.fax_type == FAX_TYPE_BLACK_SEND_EARLY_OPEN: # newer
+ log.debug("Opening fax channel.")
+ try:
+ self.dev.openFax()
+ except Error, e:
+ log.error("Unable to open channel (%s)." % e.msg)
+ fax_send_state = FAX_SEND_STATE_ERROR
+ else:
+ log.debug("Skipped.")
+
+
+ elif fax_send_state == FAX_SEND_STATE_CHECK_IDLE: # -------------- Check for initial idle (110, 80, 0)
+ log.debug("%s State: Check idle" % ("*"*20))
+ fax_send_state = FAX_SEND_STATE_START_REQUEST
+
+ dl_state = self.getFaxDownloadState()
+ tx_status = self.getFaxJobTxStatus()
+ rx_status = self.getFaxJobRxStatus()
+
+ if ((dl_state == pml.UPDN_STATE_IDLE or \
+ dl_state == pml.UPDN_STATE_ERRORABORT or \
+ dl_state == pml.UPDN_STATE_XFERDONE) and \
+ (tx_status == pml.FAXJOB_TX_STATUS_IDLE or tx_status == pml.FAXJOB_TX_STATUS_DONE) and \
+ (rx_status == pml.FAXJOB_RX_STATUS_IDLE or rx_status == pml.FAXJOB_RX_STATUS_DONE)):
+
+ # xwas if state == pml.UPDN_STATE_IDLE:
+ if dl_state == pml.UPDN_STATE_IDLE:
+ log.debug("Starting in idle state")
+ else:
+ log.debug("Resetting to idle...")
+ self.dev.setPML(pml.OID_FAX_DOWNLOAD, pml.UPDN_STATE_IDLE)
+ time.sleep(0.5)
+ else:
+ fax_send_state = FAX_SEND_STATE_BUSY
+
+ elif fax_send_state == FAX_SEND_STATE_START_REQUEST: # -------------- Request fax start (110, 90, 0)
+ log.debug("%s State: Request start" % ("*"*20))
+ fax_send_state = FAX_SEND_STATE_SET_PARAMS
+
+ dl_state = self.getFaxDownloadState()
+
+ if dl_state == pml.UPDN_STATE_IDLE:
+ log.debug("Try: 0")
+ log.debug("Setting to up/down state request start...")
+ self.dev.setPML(pml.OID_FAX_DOWNLOAD, pml.UPDN_STATE_REQSTART)
+ time.sleep(1)
+
+ log.debug("Waiting for active state...")
+ i = 1
+
+ while i < 10:
+ log.debug("Try: %d" % i)
+ try:
+ dl_state = self.getFaxDownloadState()
+ except Error:
+ log.error("PML/SNMP error")
+ fax_send_state = FAX_SEND_STATE_ERROR
+ break
+
+ if dl_state == pml.UPDN_STATE_XFERACTIVE:
+ break
+
+ time.sleep(1)
+ log.debug("Setting to up/down state request start...")
+ self.dev.setPML(pml.OID_FAX_DOWNLOAD, pml.UPDN_STATE_REQSTART)
+
+ i += 1
+
+ else:
+ log.error("Could not get into active state!")
+ fax_send_state = FAX_SEND_STATE_BUSY
+
+ monitor_state = True
+
+ else:
+ log.error("Could not get into idle state!")
+ fax_send_state = FAX_SEND_STATE_BUSY
+
+
+ elif fax_send_state == FAX_SEND_STATE_SET_PARAMS: # -------------- Set fax send params (110, 70, 0)
+ log.debug("%s State: Set params" % ("*"*20))
+ fax_send_state = FAX_SEND_STATE_LATE_OPEN
+
+ try:
+ self.dev.setPML(pml.OID_DEV_DOWNLOAD_TIMEOUT, pml.DEFAULT_DOWNLOAD_TIMEOUT)
+ self.dev.setPML(pml.OID_FAXJOB_TX_TYPE, pml.FAXJOB_TX_TYPE_HOST_ONLY)
+ log.debug("Setting date and time on device.")
+ self.dev.setDateAndTime()
+ except Error, e:
+ log.error("PML/SNMP error (%s)" % e.msg)
+ fax_send_state = FAX_SEND_STATE_ERROR
+
+
+ elif fax_send_state == FAX_SEND_STATE_LATE_OPEN: # -------------- Late open (older models) (110, 100, 0)
+ log.debug("%s State: Late open" % ("*"*20))
+ fax_send_state = FAX_SEND_STATE_SEND_DIAL_STRINGS
+
+ if self.dev.fax_type == FAX_TYPE_BLACK_SEND_LATE_OPEN: # older
+ log.debug("Opening fax channel.")
+ try:
+ self.dev.openFax()
+ except Error:
+ log.error("Unable to open channel.")
+ fax_send_state = FAX_SEND_STATE_ERROR
+ else:
+ log.debug("Skipped.")
+
+
+ elif fax_send_state == FAX_SEND_STATE_SEND_DIAL_STRINGS: # -------------- Dial strings (110, 110, 0)
+ log.debug("%s State: Send dial strings" % ("*"*20))
+ fax_send_state = FAX_SEND_STATE_SEND_FAX_HEADER
+
+ log.debug("Dialing: %s" % recipient['fax'])
+
+ log.debug("Sending dial strings...")
+ self.create_mfpdtf_fixed_header(DT_DIAL_STRINGS, True,
+ PAGE_FLAG_NEW_DOC | PAGE_FLAG_END_DOC | PAGE_FLAG_END_STREAM) # 0x1c on Windows, we were sending 0x0c
+ #print recipient
+ dial_strings = recipient['fax'].encode('ascii')
+ log.debug(repr(dial_strings))
+ self.create_mfpdtf_dial_strings(dial_strings)
+
+ try:
+ self.write_stream()
+ except Error:
+ log.error("Channel write error.")
+ fax_send_state = FAX_SEND_STATE_ERROR
+
+
+ elif fax_send_state == FAX_SEND_STATE_SEND_FAX_HEADER: # -------------- Fax header (110, 120, 0)
+ log.debug("%s State: Send fax header" % ("*"*20))
+ fax_send_state = FAX_SEND_STATE_SEND_PAGES
+
+ try:
+ ff = file(self.f, 'r')
+ except IOError:
+ log.error("Unable to read fax file.")
+ fax_send_state = FAX_SEND_STATE_ERROR
+ continue
+
+ try:
+ header = ff.read(FILE_HEADER_SIZE)
+ except IOError:
+ log.error("Unable to read fax file.")
+ fax_send_state = FAX_SEND_STATE_ERROR
+ continue
+
+ magic, version, total_pages, hort_dpi, vert_dpi, page_size, \
+ resolution, encoding, reserved1, reserved2 = self.decode_fax_header(header)
+
+ if magic != 'hplip_g3':
+ log.error("Invalid file header. Bad magic.")
+ fax_send_state = FAX_SEND_STATE_ERROR
+ else:
+ log.debug("Magic=%s Ver=%d Pages=%d hDPI=%d vDPI=%d Size=%d Res=%d Enc=%d" %
+ (magic, version, total_pages, hort_dpi, vert_dpi, page_size, resolution, encoding))
+
+ log.debug("Sending fax header...")
+ self.create_mfpdtf_fixed_header(DT_FAX_IMAGES, True, PAGE_FLAG_NEW_DOC)
+ self.create_mfpdtf_fax_header(total_pages)
+
+ try:
+ self.write_stream()
+ except Error:
+ log.error("Unable to write to channel.")
+ fax_send_state = FAX_SEND_STATE_ERROR
+
+
+ elif fax_send_state == FAX_SEND_STATE_SEND_PAGES: # --------------------------------- Send fax pages state machine (110, 130, 0)
+ log.debug("%s State: Send pages" % ("*"*20))
+ fax_send_state = FAX_SEND_STATE_SEND_END_OF_STREAM
+ page = StringIO()
+
+ for p in range(total_pages):
+
+ if self.check_for_cancel():
+ fax_send_state = FAX_SEND_STATE_ABORT
+
+ if fax_send_state == FAX_SEND_STATE_ABORT:
+ break
+
+ try:
+ header = ff.read(PAGE_HEADER_SIZE)
+ except IOError:
+ log.error("Unable to read fax file.")
+ fax_send_state = FAX_SEND_STATE_ERROR
+ continue
+
+ page_num, ppr, rpp, bytes_to_read, thumbnail_bytes, reserved2 = \
+ self.decode_page_header(header)
+
+ log.debug("Page=%d PPR=%d RPP=%d BPP=%d Thumb=%d" %
+ (page_num, ppr, rpp, bytes_to_read, thumbnail_bytes))
+
+ page.write(ff.read(bytes_to_read))
+ thumbnail = ff.read(thumbnail_bytes) # thrown away for now (should be 0 read)
+ page.seek(0)
+
+ self.create_mfpdtf_fixed_header(DT_FAX_IMAGES, page_flags=PAGE_FLAG_NEW_PAGE)
+ self.create_sop_record(page_num, hort_dpi, vert_dpi, ppr, rpp, encoding)
+
+ try:
+ data = page.read(RASTER_DATA_SIZE)
+ except IOError:
+ log.error("Unable to read fax file.")
+ fax_send_state = FAX_SEND_STATE_ERROR
+ continue
+
+ if data == '':
+ log.error("No data!")
+ fax_send_state = FAX_SEND_STATE_ERROR
+ continue
+
+ self.create_raster_data_record(data)
+ total_read = RASTER_DATA_SIZE
+
+ while True:
+ data = page.read(RASTER_DATA_SIZE)
+ total_read += RASTER_DATA_SIZE
+
+ dl_state = self.getFaxDownloadState()
+ if dl_state == pml.UPDN_STATE_ERRORABORT:
+ fax_send_state = FAX_SEND_STATE_ERROR
+ break
+
+ if self.check_for_cancel():
+ fax_send_state = FAX_SEND_STATE_ABORT
+ break
+
+ if data == '':
+ self.create_eop_record(rpp)
+
+ try:
+ self.write_stream()
+ except Error:
+ log.error("Channel write error.")
+ fax_send_state = FAX_SEND_STATE_ERROR
+ break
+
+ else:
+ try:
+ self.write_stream()
+ except Error:
+ log.error("Channel write error.")
+ fax_send_state = FAX_SEND_STATE_ERROR
+ break
+
+ status = self.getFaxJobTxStatus()
+ while status == pml.FAXJOB_TX_STATUS_DIALING:
+ self.write_queue((STATUS_DIALING, 0, recipient['fax']))
+ time.sleep(1.0)
+
+ if self.check_for_cancel():
+ fax_send_state = FAX_SEND_STATE_ABORT
+ break
+
+ dl_state = self.getFaxDownloadState()
+ if dl_state == pml.UPDN_STATE_ERRORABORT:
+ fax_send_state = FAX_SEND_STATE_ERROR
+ break
+
+ status = self.getFaxJobTxStatus()
+
+ if fax_send_state not in (FAX_SEND_STATE_ABORT, FAX_SEND_STATE_ERROR):
+
+ while status == pml.FAXJOB_TX_STATUS_CONNECTING:
+ self.write_queue((STATUS_CONNECTING, 0, recipient['fax']))
+ time.sleep(1.0)
+
+ if self.check_for_cancel():
+ fax_send_state = FAX_SEND_STATE_ABORT
+ break
+
+ dl_state = self.getFaxDownloadState()
+ if dl_state == pml.UPDN_STATE_ERRORABORT:
+ fax_send_state = FAX_SEND_STATE_ERROR
+ break
+
+ status = self.getFaxJobTxStatus()
+
+ if status == pml.FAXJOB_TX_STATUS_TRANSMITTING:
+ self.write_queue((STATUS_SENDING, page_num, recipient['fax']))
+
+ self.create_mfpdtf_fixed_header(DT_FAX_IMAGES, page_flags=0)
+ self.create_raster_data_record(data)
+
+ if fax_send_state in (FAX_SEND_STATE_ABORT, FAX_SEND_STATE_ERROR):
+ break
+
+ page.truncate(0)
+ page.seek(0)
+
+
+ elif fax_send_state == FAX_SEND_STATE_SEND_END_OF_STREAM: # -------------- EOS (110, 140, 0)
+ log.debug("%s State: Send EOS" % ("*"*20))
+ fax_send_state = FAX_SEND_STATE_WAIT_FOR_COMPLETE
+ log.debug("End of stream...")
+ self.create_mfpdtf_fixed_header(DT_FAX_IMAGES, False, PAGE_FLAG_END_STREAM)
+
+ try:
+ self.write_stream()
+ except Error:
+ log.error("Channel write error.")
+ fax_send_state = FAX_SEND_STATE_ERROR
+
+ monitor_state = False
+
+
+ elif fax_send_state == FAX_SEND_STATE_WAIT_FOR_COMPLETE: # -------------- Wait for complete (110, 150, 0)
+ log.debug("%s State: Wait for completion" % ("*"*20))
+
+ fax_send_state = FAX_SEND_STATE_WAIT_FOR_COMPLETE
+
+ time.sleep(1.0)
+ status = self.getFaxJobTxStatus()
+
+ if status == pml.FAXJOB_TX_STATUS_DIALING:
+ self.write_queue((STATUS_DIALING, 0, recipient['fax']))
+ log.debug("Dialing ...")
+
+ elif status == pml.FAXJOB_TX_STATUS_TRANSMITTING:
+ self.write_queue((STATUS_SENDING, page_num, recipient['fax']))
+ log.debug("Transmitting ...")
+
+ elif status in (pml.FAXJOB_TX_STATUS_DONE, pml.FAXJOB_RX_STATUS_IDLE):
+ fax_send_state = FAX_SEND_STATE_RESET_TOKEN
+ state = STATE_NEXT_RECIPIENT
+ log.debug("Transmitting done or idle ...")
+
+ else:
+ self.write_queue((STATUS_SENDING, page_num, recipient['fax']))
+ log.debug("Pending ...")
+
+
+ elif fax_send_state == FAX_SEND_STATE_RESET_TOKEN: # -------------- Release fax token (110, 160, 0)
+ log.debug("%s State: Release fax token" % ("*"*20))
+ self.write_queue((STATUS_CLEANUP, 0, ''))
+
+ try:
+ self.dev.setPML(pml.OID_FAX_TOKEN, '\x00'*16)
+ except Error:
+ log.error("Unable to release fax token.")
+
+ fax_send_state = FAX_SEND_STATE_CLOSE_SESSION
+
+
+ elif fax_send_state == FAX_SEND_STATE_CLOSE_SESSION: # -------------- Close session (110, 170, 0)
+ log.debug("%s State: Close session" % ("*"*20))
+ fax_send_state = FAX_SEND_STATE_DONE
+ log.debug("Closing session...")
+
+ try:
+ mm.close()
+ except NameError:
+ pass
+
+ try:
+ ff.close()
+ except NameError:
+ pass
+
+ if self.dev.fax_type == FAX_TYPE_BLACK_SEND_LATE_OPEN:
+ log.debug("Closing fax channel.")
+ self.dev.closeFax()
+
+ self.dev.setPML(pml.OID_FAX_DOWNLOAD, pml.UPDN_STATE_IDLE)
+
+ time.sleep(1)
+
+ if self.dev.fax_type == FAX_TYPE_BLACK_SEND_EARLY_OPEN:
+ log.debug("Closing fax channel.")
+ self.dev.closeFax()
+
+ self.dev.close()
+
+
+ elif state == STATE_CLEANUP: # --------------------------------- Cleanup (120, 0, 0)
+ log.debug("%s State: Cleanup" % ("*"*20))
+
+ if self.remove_temp_file:
+ log.debug("Removing merged file: %s" % self.f)
+ try:
+ os.remove(self.f)
+ log.debug("Removed")
+ except OSError:
+ log.debug("Not found")
+
+ state = STATE_DONE
+
+
+
+# --------------------------------- Support functions
+
+
+ def getFaxDownloadState(self):
+ result_code, state = self.dev.getPML(pml.OID_FAX_DOWNLOAD)
+ if state:
+ log.debug("D/L State=%d (%s)" % (state, pml.UPDN_STATE_STR.get(state, 'Unknown')))
+ return state
+ else:
+ return pml.UPDN_STATE_ERRORABORT
+
+ def getFaxDownloadError(self):
+ result_code, state = self.dev.getPML(pml.OID_FAX_DOWNLOAD_ERROR)
+ if state:
+ return state
+ else:
+ return pml.DN_ERROR_UNKNOWN
+
+ def getFaxJobTxStatus(self):
+ result_code, status = self.dev.getPML(pml.OID_FAXJOB_TX_STATUS)
+ if status:
+ log.debug("Tx Status=%d (%s)" % (status, pml.FAXJOB_TX_STATUS_STR.get(status, 'Unknown')))
+ return status
+ else:
+ return pml.FAXJOB_TX_STATUS_IDLE
+
+ def getFaxJobRxStatus(self):
+ result_code, status = self.dev.getPML(pml.OID_FAXJOB_RX_STATUS)
+ if status:
+ log.debug("Rx Status=%d (%s)" % (status, pml.FAXJOB_RX_STATUS_STR.get(status, 'Unknown')))
+ return status
+ else:
+ return pml.FAXJOB_RX_STATUS_IDLE
+
+ def getCfgUploadState(self):
+ result_code, state = self.dev.getPML(pml.OID_DEVICE_CFG_UPLOAD)
+ if state:
+ log.debug("Cfg Upload State = %d (%s)" % (state, pml.UPDN_STATE_STR.get(state, 'Unknown')))
+ return state
+ else:
+ return pml.UPDN_STATE_ERRORABORT
+
+ def create_mfpdtf_fixed_header(self, data_type, send_variant=False, page_flags=0):
+ header_len = FIXED_HEADER_SIZE
+
+ if send_variant:
+ if data_type == DT_DIAL_STRINGS:
+ header_len += DIAL_STRINGS_VARIANT_HEADER_SIZE
+
+ elif data_type == DT_FAX_IMAGES:
+ header_len += FAX_IMAGE_VARIANT_HEADER_SIZE
+
+ self.stream.write(struct.pack("<IHBB",
+ 0, header_len, data_type, page_flags))
+
+
+ def create_mfpdtf_dial_strings(self, number):
+ p = struct.pack("<BBHH51s",
+ MAJOR_VER, MINOR_VER,
+ 1, 51, number[:51])
+ log.debug(repr(p))
+ self.stream.write(p)
+
+
+ def adjust_fixed_header_block_size(self):
+ size = self.stream.tell()
+ self.stream.seek(0)
+ self.stream.write(struct.pack("<I", size))
+
+
+ def create_sop_record(self, page_num, hort_dpi, vert_dpi, ppr, rpp, encoding, bpp=1):
+ self.stream.write(struct.pack("<BBHHHIHHHHHHIHHHH",
+ RT_START_PAGE, encoding, page_num,
+ ppr, bpp,
+ rpp, 0x00, hort_dpi, 0x00, vert_dpi,
+ ppr, bpp,
+ rpp, 0x00, hort_dpi, 0x00, vert_dpi))
+
+
+ def create_eop_record(self, rpp):
+ self.stream.write(struct.pack("<BBBBII",
+ RT_END_PAGE, 0, 0, 0,
+ rpp, 0,))
+
+
+ def create_raster_data_record(self, data):
+ assert len(data) <= RASTER_DATA_SIZE
+ self.stream.write(struct.pack("<BBH",
+ RT_RASTER, 0, len(data),))
+ self.stream.write(data)
+
+
+ def create_mfpdtf_fax_header(self, total_pages):
+ self.stream.write(struct.pack("<BBBHBI20s20s20sI",
+ MAJOR_VER, MINOR_VER, SRC_HOST, total_pages,
+ TTI_PREPENDED_TO_IMAGE, 0, '', '', '', 0))
+
+
+ def write_stream(self):
+ self.adjust_fixed_header_block_size()
+ self.dev.writeFax(self.stream.getvalue())
+ self.stream.truncate(0)
+ self.stream.seek(0)
diff --git a/fax/ppd/HP-Fax-hpcups.ppd.gz b/fax/ppd/HP-Fax-hpcups.ppd.gz
new file mode 100644
index 0000000..bafd439
--- /dev/null
+++ b/fax/ppd/HP-Fax-hpcups.ppd.gz
Binary files differ
diff --git a/fax/ppd/HP-Fax-hpijs.ppd.gz b/fax/ppd/HP-Fax-hpijs.ppd.gz
new file mode 100644
index 0000000..612bcaf
--- /dev/null
+++ b/fax/ppd/HP-Fax-hpijs.ppd.gz
Binary files differ
diff --git a/fax/ppd/HP-Fax2-hpcups.ppd.gz b/fax/ppd/HP-Fax2-hpcups.ppd.gz
new file mode 100644
index 0000000..ffc35f3
--- /dev/null
+++ b/fax/ppd/HP-Fax2-hpcups.ppd.gz
Binary files differ
diff --git a/fax/ppd/HP-Fax2-hpijs.ppd.gz b/fax/ppd/HP-Fax2-hpijs.ppd.gz
new file mode 100644
index 0000000..b228073
--- /dev/null
+++ b/fax/ppd/HP-Fax2-hpijs.ppd.gz
Binary files differ
diff --git a/fax/ppd/HP-Fax3-hpcups.ppd.gz b/fax/ppd/HP-Fax3-hpcups.ppd.gz
new file mode 100644
index 0000000..4e289b3
--- /dev/null
+++ b/fax/ppd/HP-Fax3-hpcups.ppd.gz
Binary files differ
diff --git a/fax/ppd/HP-Fax3-hpijs.ppd.gz b/fax/ppd/HP-Fax3-hpijs.ppd.gz
new file mode 100644
index 0000000..cb6116c
--- /dev/null
+++ b/fax/ppd/HP-Fax3-hpijs.ppd.gz
Binary files differ
diff --git a/fax/ppd/HP-Fax4-hpcups.ppd.gz b/fax/ppd/HP-Fax4-hpcups.ppd.gz
new file mode 100644
index 0000000..40a6f5b
--- /dev/null
+++ b/fax/ppd/HP-Fax4-hpcups.ppd.gz
Binary files differ
diff --git a/fax/ppd/HP-Fax4-hpijs.ppd.gz b/fax/ppd/HP-Fax4-hpijs.ppd.gz
new file mode 100644
index 0000000..2fee3b0
--- /dev/null
+++ b/fax/ppd/HP-Fax4-hpijs.ppd.gz
Binary files differ
diff --git a/fax/soapfax.py b/fax/soapfax.py
new file mode 100644
index 0000000..01af1cc
--- /dev/null
+++ b/fax/soapfax.py
@@ -0,0 +1,719 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2007 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+from __future__ import division
+
+# Std Lib
+import sys
+import os
+import time
+import cStringIO
+import urllib # TODO: Replace with urllib2 (urllib is deprecated in Python 3.0)
+import re
+
+# Local
+from base.g import *
+from base.codes import *
+from base import device, utils, codes, dime
+from fax import *
+
+#import xml.parsers.expat as expat
+
+
+# **************************************************************************** #
+
+http_result_pat = re.compile("""HTTP/\d.\d\s(\d+)""", re.I)
+
+
+TIME_FORMAT_AM_PM = 1
+TIME_FORMAT_24HR = 2
+
+DATE_FORMAT_MM_DD_YYYY = 1
+DATE_FORMAT_DD_MM_YYYY = 2
+DATE_FORMAT_YYYY_MM_DD = 3
+
+AM = 1
+PM = 0
+
+HTTP_OK = 200
+HTTP_ERROR = 500
+
+PIXELS_PER_LINE = 2528
+
+
+# **************************************************************************** #
+class SOAPFaxDevice(FaxDevice):
+
+ def __init__(self, device_uri=None, printer_name=None,
+ callback=None,
+ fax_type=FAX_TYPE_NONE,
+ disable_dbus=False):
+
+ FaxDevice.__init__(self, device_uri,
+ printer_name,
+ callback, fax_type,
+ disable_dbus)
+
+ self.send_fax_thread = None
+ self.upload_log_thread = None
+
+ if self.bus == 'net':
+ self.http_host = self.host
+ else:
+ self.http_host = 'localhost'
+
+
+ def post(self, url, post):
+ s = []
+ for k, v in post.items():
+ s.append("%s=%s" % (k, urllib.quote(str(v))))
+
+ s = '&'.join(s)
+
+ log.debug(s)
+
+ data = """POST %s HTTP/1.1
+Connection: Keep-alive
+User-agent: hplip/2.0
+Host: %s
+Content-length: %d
+Cache-control: No-cache
+
+%s""" % (url, self.http_host, len(s), s)
+
+ log.log_data(data)
+ self.writeEWS(data)
+ ret = cStringIO.StringIO()
+
+ while self.readEWS(4096, ret, timeout=5):
+ pass
+
+ ret = ret.getvalue()
+
+ log.log_data(ret)
+
+ self.closeEWS()
+
+ match = http_result_pat.match(ret)
+
+ try:
+ code = int(match.group(1))
+ except (ValueError, TypeError):
+ code = HTTP_ERROR
+
+ return code == HTTP_OK
+
+
+ def setPhoneNum(self, num):
+ return self.post("/hp/device/set_config.html", {"FaxNumber": str(num)})
+
+
+ def getPhoneNum(self):
+ stream = cStringIO.StringIO()
+ self.getEWSUrl("/hp/device/settings_fax_setup_wizard.xml", stream)
+ fax_setup = utils.XMLToDictParser().parseXML(stream.getvalue())
+ return fax_setup['faxsetupwizard-faxvoicenumber-faxnumber']
+
+ phone_num = property(getPhoneNum, setPhoneNum)
+
+
+ def setStationName(self, name):
+ return self.post("/hp/device/set_config.html", {"FaxCompanyName": str(name)})
+
+
+ def getStationName(self):
+ stream = cStringIO.StringIO()
+ self.getEWSUrl("/hp/device/settings_fax_setup_wizard.xml", stream)
+ fax_setup = utils.XMLToDictParser().parseXML(stream.getvalue())
+ return fax_setup['faxsetupwizard-userinformation-faxcompanyname']
+
+ station_name = property(getStationName, setStationName)
+
+
+ def setDateAndTime(self):
+ stream = cStringIO.StringIO()
+ self.getEWSUrl("/hp/device/settings_fax_setup_wizard.xml", stream)
+ fax_setup = utils.XMLToDictParser().parseXML(stream.getvalue())
+ timeformat = fax_setup['faxsetupwizard-time-timeformat']
+
+ try:
+ timeformat = int(timeformat)
+ except (ValueError, TypeError):
+ timeformat = TIME_FORMAT_AM_PM
+
+ log.debug("timeformat: %d" % timeformat)
+
+ dateformat = fax_setup['faxsetupwizard-date-dateformat']
+
+ try:
+ dateformat = int(dateformat)
+ except (ValueError, TypeError):
+ dateformat = DATE_FORMAT_DD_MM_YYYY
+
+ log.debug("dateformat: %d" % dateformat)
+
+ t = time.localtime()
+ hr = t[3]
+
+ am_pm = PM
+ if t[3] < 12:
+ am_pm = AM
+
+ if timeformat == TIME_FORMAT_AM_PM and hr > 12:
+ hr -= 12
+
+ post = {"DateFormat" : dateformat,
+ "Year" : t[0],
+ "Month" : t[1],
+ "Day" : t[2],
+ "TimeFormat" : timeformat,
+ "Hour" : hr,
+ "Minute" : t[4]}
+
+ if timeformat == TIME_FORMAT_AM_PM:
+ post['AM'] = am_pm
+
+ return self.post("/hp/device/set_config.html", post)
+
+
+ def sendFaxes(self, phone_num_list, fax_file_list, cover_message='', cover_re='',
+ cover_func=None, preserve_formatting=False, printer_name='',
+ update_queue=None, event_queue=None):
+
+ if not self.isSendFaxActive():
+
+ self.send_fax_thread = SOAPFaxSendThread(self, self.service, phone_num_list, fax_file_list,
+ cover_message, cover_re, cover_func,
+ preserve_formatting,
+ printer_name, update_queue,
+ event_queue)
+
+ self.send_fax_thread.start()
+ return True
+ else:
+ return False
+
+
+# **************************************************************************** #
+class SOAPFaxSendThread(FaxSendThread):
+ def __init__(self, dev, service, phone_num_list, fax_file_list,
+ cover_message='', cover_re='', cover_func=None, preserve_formatting=False,
+ printer_name='', update_queue=None, event_queue=None):
+
+ FaxSendThread.__init__(self, dev, service, phone_num_list, fax_file_list,
+ cover_message, cover_re, cover_func, preserve_formatting,
+ printer_name, update_queue, event_queue)
+
+ self.job_id = utils.gen_random_uuid()
+ log.debug("JobId: %s" % self.job_id)
+
+ if dev.bus == 'net':
+ self.http_host = "%s:8295" % self.dev.host
+ else:
+ self.http_host = 'localhost:8295'
+
+ #self.http_host = 'localhost'
+
+
+ def run(self):
+ #results = {} # {'file' : error_code,...}
+
+ STATE_DONE = 0
+ STATE_ABORTED = 10
+ STATE_SUCCESS = 20
+ STATE_BUSY = 25
+ STATE_READ_SENDER_INFO = 30
+ STATE_PRERENDER = 40
+ STATE_COUNT_PAGES = 50
+ STATE_NEXT_RECIPIENT = 60
+ STATE_COVER_PAGE = 70
+ STATE_SINGLE_FILE = 80
+ STATE_MERGE_FILES = 90
+ STATE_SINGLE_FILE = 100
+ STATE_SEND_FAX = 110
+ STATE_CLEANUP = 120
+ STATE_ERROR = 130
+
+ next_recipient = self.next_recipient_gen()
+
+ state = STATE_READ_SENDER_INFO
+ self.rendered_file_list = []
+
+ while state != STATE_DONE: # --------------------------------- Fax state machine
+ if self.check_for_cancel():
+ state = STATE_ABORTED
+
+ log.debug("STATE=(%d, 0, 0)" % state)
+
+ if state == STATE_ABORTED: # --------------------------------- Aborted (10, 0, 0)
+ log.error("Aborted by user.")
+ self.write_queue((STATUS_IDLE, 0, ''))
+ state = STATE_CLEANUP
+
+
+ elif state == STATE_SUCCESS: # --------------------------------- Success (20, 0, 0)
+ log.debug("Success.")
+ self.write_queue((STATUS_COMPLETED, 0, ''))
+ state = STATE_CLEANUP
+
+
+ elif state == STATE_ERROR: # --------------------------------- Error (130, 0, 0)
+ log.error("Error, aborting.")
+ self.write_queue((STATUS_ERROR, 0, ''))
+ state = STATE_CLEANUP
+
+
+ elif state == STATE_BUSY: # --------------------------------- Busy (25, 0, 0)
+ log.error("Device busy, aborting.")
+ self.write_queue((STATUS_BUSY, 0, ''))
+ state = STATE_CLEANUP
+
+
+ elif state == STATE_READ_SENDER_INFO: # --------------------------------- Get sender info (30, 0, 0)
+ log.debug("%s State: Get sender info" % ("*"*20))
+ state = STATE_PRERENDER
+ try:
+ try:
+ self.dev.open()
+ except Error, e:
+ log.error("Unable to open device (%s)." % e.msg)
+ state = STATE_ERROR
+ else:
+ try:
+ self.sender_name = self.dev.station_name
+ log.debug("Sender name=%s" % self.sender_name)
+ self.sender_fax = self.dev.phone_num
+ log.debug("Sender fax=%s" % self.sender_fax)
+ except Error:
+ log.error("HTTP GET failed!")
+ state = STATE_ERROR
+
+ finally:
+ self.dev.close()
+
+
+ elif state == STATE_PRERENDER: # --------------------------------- Pre-render non-G4 files (40, 0, 0)
+ log.debug("%s State: Pre-render non-G4 files" % ("*"*20))
+ state = self.pre_render(STATE_COUNT_PAGES)
+
+ elif state == STATE_COUNT_PAGES: # --------------------------------- Get total page count (50, 0, 0)
+ log.debug("%s State: Get total page count" % ("*"*20))
+ state = self.count_pages(STATE_NEXT_RECIPIENT)
+
+ elif state == STATE_NEXT_RECIPIENT: # --------------------------------- Loop for multiple recipients (60, 0, 0)
+ log.debug("%s State: Next recipient" % ("*"*20))
+ state = STATE_COVER_PAGE
+
+ try:
+ recipient = next_recipient.next()
+ log.debug("Processing for recipient %s" % recipient['name'])
+ self.write_queue((STATUS_SENDING_TO_RECIPIENT, 0, recipient['name']))
+ except StopIteration:
+ state = STATE_SUCCESS
+ log.debug("Last recipient.")
+ continue
+
+ recipient_file_list = self.rendered_file_list[:]
+
+
+ elif state == STATE_COVER_PAGE: # --------------------------------- Create cover page (70, 0, 0)
+ log.debug("%s State: Render cover page" % ("*"*20))
+ state = self.cover_page(recipient)
+
+
+ elif state == STATE_SINGLE_FILE: # --------------------------------- Special case for single file (no merge) (80, 0, 0)
+ log.debug("%s State: Handle single file" % ("*"*20))
+ state = self.single_file(STATE_SEND_FAX)
+
+ elif state == STATE_MERGE_FILES: # --------------------------------- Merge multiple G4 files (90, 0, 0)
+ log.debug("%s State: Merge multiple files" % ("*"*20))
+ state = self.merge_files(STATE_SEND_FAX)
+
+ elif state == STATE_SEND_FAX: # --------------------------------- Send fax state machine (110, 0, 0)
+ log.debug("%s State: Send fax" % ("*"*20))
+ state = STATE_NEXT_RECIPIENT
+
+ FAX_SEND_STATE_DONE = 0
+ FAX_SEND_STATE_ABORT = 10
+ FAX_SEND_STATE_ERROR = 20
+ FAX_SEND_STATE_BUSY = 25
+ FAX_SEND_STATE_SUCCESS = 30
+ FAX_SEND_STATE_DEVICE_OPEN = 40
+ FAX_SEND_STATE_BEGINJOB = 50
+ FAX_SEND_STATE_DOWNLOADPAGES = 60
+ FAX_SEND_STATE_ENDJOB = 70
+ FAX_SEND_STATE_CANCELJOB = 80
+ FAX_SEND_STATE_CLOSE_SESSION = 170
+
+ monitor_state = False
+ fax_send_state = FAX_SEND_STATE_DEVICE_OPEN
+
+ while fax_send_state != FAX_SEND_STATE_DONE:
+
+ if self.check_for_cancel():
+ log.error("Fax send aborted.")
+ fax_send_state = FAX_SEND_STATE_ABORT
+
+ if monitor_state:
+ fax_state = self.getFaxDownloadState()
+ if not fax_state in (pml.UPDN_STATE_XFERACTIVE, pml.UPDN_STATE_XFERDONE):
+ log.error("D/L error state=%d" % fax_state)
+ fax_send_state = FAX_SEND_STATE_ERROR
+ state = STATE_ERROR
+
+ log.debug("STATE=(%d, %d, 0)" % (STATE_SEND_FAX, fax_send_state))
+
+ if fax_send_state == FAX_SEND_STATE_ABORT: # -------------- Abort (110, 10, 0)
+ monitor_state = False
+ fax_send_state = FAX_SEND_STATE_CANCELJOB
+ state = STATE_ABORTED
+
+ elif fax_send_state == FAX_SEND_STATE_ERROR: # -------------- Error (110, 20, 0)
+ log.error("Fax send error.")
+ monitor_state = False
+ fax_send_state = FAX_SEND_STATE_CLOSE_SESSION
+ state = STATE_ERROR
+
+ elif fax_send_state == FAX_SEND_STATE_BUSY: # -------------- Busy (110, 25, 0)
+ log.error("Fax device busy.")
+ monitor_state = False
+ fax_send_state = FAX_SEND_STATE_CLOSE_SESSION
+ state = STATE_BUSY
+
+ elif fax_send_state == FAX_SEND_STATE_SUCCESS: # -------------- Success (110, 30, 0)
+ log.debug("Fax send success.")
+ monitor_state = False
+ fax_send_state = FAX_SEND_STATE_CLOSE_SESSION
+ state = STATE_NEXT_RECIPIENT
+
+ elif fax_send_state == FAX_SEND_STATE_DEVICE_OPEN: # -------------- Device open (110, 40, 0)
+ log.debug("%s State: Open device" % ("*"*20))
+ fax_send_state = FAX_SEND_STATE_BEGINJOB
+ try:
+ self.dev.open()
+ except Error, e:
+ log.error("Unable to open device (%s)." % e.msg)
+ fax_send_state = FAX_SEND_STATE_ERROR
+ else:
+ if self.dev.device_state == DEVICE_STATE_NOT_FOUND:
+ fax_send_state = FAX_SEND_STATE_ERROR
+
+ elif fax_send_state == FAX_SEND_STATE_BEGINJOB: # -------------- BeginJob (110, 50, 0)
+ log.debug("%s State: BeginJob" % ("*"*20))
+
+ try:
+ ff = file(self.f, 'r')
+ except IOError:
+ log.error("Unable to read fax file.")
+ fax_send_state = FAX_SEND_STATE_ERROR
+ continue
+
+ try:
+ header = ff.read(FILE_HEADER_SIZE)
+ except IOError:
+ log.error("Unable to read fax file.")
+ fax_send_state = FAX_SEND_STATE_ERROR
+ continue
+
+ magic, version, total_pages, hort_dpi, vert_dpi, page_size, \
+ resolution, encoding, reserved1, reserved2 = self.decode_fax_header(header)
+
+ if magic != 'hplip_g3':
+ log.error("Invalid file header. Bad magic.")
+ fax_send_state = FAX_SEND_STATE_ERROR
+ else:
+ log.debug("Magic=%s Ver=%d Pages=%d hDPI=%d vDPI=%d Size=%d Res=%d Enc=%d" %
+ (magic, version, total_pages, hort_dpi, vert_dpi, page_size,
+ resolution, encoding))
+
+ job_id = self.job_id
+ delay = 0
+ faxnum = recipient['fax'].encode('ascii')
+ speeddial = 0
+
+ if resolution == RESOLUTION_STD:
+ res = "STANDARD"
+ elif resolution == RESOLUTION_FINE:
+ res = "FINE"
+ elif resolution == RESOLUTION_300DPI:
+ res = "SUPERFINE"
+
+ soap = utils.cat(
+"""<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Body><Fax:BeginJob xmlns:Fax="urn:Fax"><ticket xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Fax:Ticket"><jobId xmlns:xsd="http://www.w3.org/2001/XMLSchema" xsi:type="xsd:string">$job_id</jobId><resolution xsi:type="Fax:Resolution">$res</resolution><delay xmlns:xsd="http://www.w3.org/2001/XMLSchema" xsi:type="xsd:positiveInteger">$delay</delay><phoneNumber xmlns:xsd="http://www.w3.org/2001/XMLSchema" xsi:type="xsd:string">$faxnum</phoneNumber><speedDial xmlns:xsd="http://www.w3.org/2001/XMLSchema" xsi:type="xsd:positiveInteger">$speeddial</speedDial></ticket></Fax:BeginJob></SOAP-ENV:Body></SOAP-ENV:Envelope>""")
+
+ data = self.format_http(soap)
+ log.log_data(data)
+
+ if log.is_debug():
+ file('beginjob.log', 'w').write(data)
+
+ self.dev.openSoapFax()
+ self.dev.writeSoapFax(data)
+ ret = cStringIO.StringIO()
+
+ while self.dev.readSoapFax(8192, ret, timeout=5):
+ pass
+
+ ret = ret.getvalue()
+
+ if log.is_debug():
+ file('beginjob_ret.log', 'w').write(ret)
+
+ log.log_data(ret)
+ self.dev.closeSoapFax()
+
+ if self.get_error_code(ret) == HTTP_OK:
+ fax_send_state = FAX_SEND_STATE_DOWNLOADPAGES
+ else:
+ fax_send_state = FAX_SEND_STATE_ERROR
+
+
+ elif fax_send_state == FAX_SEND_STATE_DOWNLOADPAGES: # -------------- DownloadPages (110, 60, 0)
+ log.debug("%s State: DownloadPages" % ("*"*20))
+ page = StringIO()
+ for p in range(total_pages):
+
+ if self.check_for_cancel():
+ fax_send_state = FAX_SEND_STATE_ABORT
+
+ if fax_send_state == FAX_SEND_STATE_ABORT:
+ break
+
+ try:
+ header = ff.read(PAGE_HEADER_SIZE)
+ except IOError:
+ log.error("Unable to read fax file.")
+ fax_send_state = FAX_SEND_STATE_ERROR
+ continue
+
+ page_num, ppr, rpp, bytes_to_read, thumbnail_bytes, reserved2 = \
+ self.decode_page_header(header)
+
+ log.debug("Page=%d PPR=%d RPP=%d BPP=%d Thumb=%d" %
+ (page_num, ppr, rpp, bytes_to_read, thumbnail_bytes))
+
+ if ppr != PIXELS_PER_LINE:
+ log.error("Pixels per line (width) must be %d!" % PIXELS_PER_LINE)
+
+ page.write(ff.read(bytes_to_read))
+ thumbnail = ff.read(thumbnail_bytes) # thrown away for now (should be 0 read)
+ page.seek(0)
+
+ try:
+ data = page.read(bytes_to_read)
+ except IOError:
+ log.error("Unable to read fax file.")
+ fax_send_state = FAX_SEND_STATE_ERROR
+ break
+
+ if data == '':
+ log.error("No data!")
+ fax_send_state = FAX_SEND_STATE_ERROR
+ break
+
+ height = rpp
+ job_id = self.job_id
+
+ soap = utils.cat(
+"""<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Header><jobId xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xsd:string" SOAP-ENV:mustUnderstand="1">$job_id</jobId></SOAP-ENV:Header><SOAP-ENV:Body><Fax:DownloadPage xmlns:Fax="urn:Fax"><height xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xsd:positiveInteger">$height</height></Fax:DownloadPage></SOAP-ENV:Body></SOAP-ENV:Envelope>""")
+
+ m = dime.Message()
+ m.add_record(dime.Record("cid:id0", "http://schemas.xmlsoap.org/soap/envelope/",
+ dime.TYPE_T_URI, soap))
+
+ m.add_record(dime.Record("", "image/g4fax", dime.TYPE_T_MIME, data))
+
+ output = cStringIO.StringIO()
+ m.generate(output)
+ data = self.format_http(output.getvalue(), content_type="application/dime")
+ log.log_data(data)
+ if log.is_debug():
+ file('downloadpages%d.log' % p, 'w').write(data)
+
+ try:
+ self.dev.writeSoapFax(data)
+ except Error:
+ fax_send_state = FAX_SEND_STATE_ERROR
+
+ ret = cStringIO.StringIO()
+
+ try:
+ while self.dev.readSoapFax(8192, ret, timeout=5):
+ pass
+ except Error:
+ fax_send_state = FAX_SEND_STATE_ERROR
+
+ ret = ret.getvalue()
+
+ if log.is_debug():
+ file('downloadpages%d_ret.log' % p, 'w').write(ret)
+
+ log.log_data(ret)
+ self.dev.closeSoapFax()
+
+ if self.get_error_code(ret) != HTTP_OK:
+ fax_send_state = FAX_SEND_STATE_ERROR
+ break
+
+ page.truncate(0)
+ page.seek(0)
+
+ else:
+ fax_send_state = FAX_SEND_STATE_ENDJOB
+
+
+ elif fax_send_state == FAX_SEND_STATE_ENDJOB: # -------------- EndJob (110, 70, 0)
+ log.debug("%s State: EndJob" % ("*"*20))
+
+ job_id = self.job_id
+
+ soap = utils.cat(
+"""<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Header><jobId xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xsd:string" SOAP-ENV:mustUnderstand="1">$job_id</jobId></SOAP-ENV:Header><SOAP-ENV:Body><Fax:EndJob xmlns:Fax="urn:Fax"><jobId xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xsd:string">$job_id</jobId></Fax:EndJob></SOAP-ENV:Body></SOAP-ENV:Envelope>""")
+
+ data = self.format_http(soap)
+
+ log.log_data(data)
+
+ if log.is_debug():
+ file('endjob.log', 'w').write(data)
+
+ self.dev.writeSoapFax(data)
+ ret = cStringIO.StringIO()
+
+ while self.dev.readSoapFax(8192, ret, timeout=5):
+ pass
+
+ ret = ret.getvalue()
+
+ if log.is_debug():
+ file('endjob_ret.log', 'w').write(ret)
+
+ log.log_data(ret)
+ self.dev.closeSoapFax()
+
+ if self.get_error_code(ret) == HTTP_OK:
+ fax_send_state = FAX_SEND_STATE_SUCCESS
+ else:
+ fax_send_state = FAX_SEND_STATE_ERROR
+
+ elif fax_send_state == FAX_SEND_STATE_CANCELJOB: # -------------- CancelJob (110, 80, 0)
+ log.debug("%s State: CancelJob" % ("*"*20))
+
+ job_id = self.job_id
+
+ soap = utils.cat(
+"""<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Header><jobId xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xsd:string" SOAP-ENV:mustUnderstand="1">$job_id</jobId></SOAP-ENV:Header><SOAP-ENV:Body><Fax:CancelJob xmlns:Fax="urn:Fax"><jobId xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xsd:string">$job_id</jobId></Fax:CancelJob></SOAP-ENV:Body></SOAP-ENV:Envelope>""")
+
+ data = self.format_http(soap)
+
+ log.log_data(data)
+
+ if log.is_debug():
+ file('canceljob.log', 'w').write(data)
+
+ self.dev.writeSoapFax(data)
+ ret = cStringIO.StringIO()
+
+ while self.dev.readSoapFax(8192, ret, timeout=5):
+ pass
+
+ ret = ret.getvalue()
+
+ if log.is_debug():
+ file('canceljob_ret.log', 'w').write(ret)
+
+ log.log_data(ret)
+ self.dev.closeSoapFax()
+
+ if self.get_error_code(ret) == HTTP_OK:
+ fax_send_state = FAX_SEND_STATE_CLOSE_SESSION
+ else:
+ fax_send_state = FAX_SEND_STATE_ERROR
+
+
+ elif fax_send_state == FAX_SEND_STATE_CLOSE_SESSION: # -------------- Close session (110, 170, 0)
+ log.debug("%s State: Close session" % ("*"*20))
+ log.debug("Closing session...")
+
+ try:
+ mm.close()
+ except NameError:
+ pass
+
+ try:
+ ff.close()
+ except NameError:
+ pass
+
+ time.sleep(1)
+
+ self.dev.closeSoapFax()
+ self.dev.close()
+
+ fax_send_state = FAX_SEND_STATE_DONE # Exit inner state machine
+
+
+ elif state == STATE_CLEANUP: # --------------------------------- Cleanup (120, 0, 0)
+ log.debug("%s State: Cleanup" % ("*"*20))
+
+ if self.remove_temp_file:
+ log.debug("Removing merged file: %s" % self.f)
+ try:
+ os.remove(self.f)
+ log.debug("Removed")
+ except OSError:
+ log.debug("Not found")
+
+ state = STATE_DONE # Exit outer state machine
+
+
+ def get_error_code(self, ret):
+ if not ret: return HTTP_ERROR
+
+ match = http_result_pat.match(ret)
+
+ if match is None: return HTTP_OK
+ try:
+ code = int(match.group(1))
+ except (ValueError, TypeError):
+ code = HTTP_ERROR
+
+ return code
+
+
+ def format_http(self, soap, content_type="text/xml; charset=utf-8"):
+ host = self.http_host
+ soap_len = len(soap)
+
+ return utils.cat(
+"""POST / HTTP/1.1\r
+Host: $host\r
+User-Agent: hplip/2.0\r
+Content-Type: $content_type\r
+Content-Length: $soap_len\r
+Connection: close\r
+SOAPAction: ""\r
+\r
+$soap""")
+
+
+
+
diff --git a/faxsetup.py b/faxsetup.py
new file mode 100755
index 0000000..b28290c
--- /dev/null
+++ b/faxsetup.py
@@ -0,0 +1,82 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2008 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+__version__ = '0.1'
+__title__ = 'Fax Device Setup Utility'
+__mod__ = 'hp-faxsetup'
+__doc__ = "Fax device setup utility for HPLIP supported printers."
+
+#Std Lib
+import sys
+import re
+import getopt
+import time
+import operator
+import os
+
+# Local
+from base.g import *
+from base import device, utils, maint, tui, module
+from prnt import cups
+
+
+
+try:
+ mod = module.Module(__mod__, __title__, __version__, __doc__, None,
+ (GUI_MODE,), (UI_TOOLKIT_QT4,))
+
+ mod.setUsage(module.USAGE_FLAG_DEVICE_ARGS,
+ see_also_list=['hp-sendfax', 'hp-fab'])
+
+ opts, device_uri, printer_name, mode, ui_toolkit, lang = \
+ mod.parseStdOpts()
+
+ device_uri = mod.getDeviceUri(device_uri, printer_name,
+ filter={'fax-type': (operator.gt, 0)})
+
+ if not utils.canEnterGUIMode4():
+ log.error("%s requires Qt4 GUI support. Exiting." % __mod__)
+ sys.exit(1)
+
+ try:
+ from PyQt4.QtGui import QApplication
+ from ui4.faxsetupdialog import FaxSetupDialog
+ except ImportError:
+ log.error("Unable to load Qt4 support. Is it installed?")
+ sys.exit(1)
+
+ app = QApplication(sys.argv)
+
+ dlg = FaxSetupDialog(None, device_uri)
+ dlg.show()
+ try:
+ log.debug("Starting GUI loop...")
+ app.exec_()
+ except KeyboardInterrupt:
+ sys.exit(0)
+
+except KeyboardInterrupt:
+ log.error("User exit")
+
+log.info("")
+log.info("Done.")
+
diff --git a/firmware.py b/firmware.py
new file mode 100755
index 0000000..2ce5fa0
--- /dev/null
+++ b/firmware.py
@@ -0,0 +1,195 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2009 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch, Sarbeswar Meher
+#
+
+__version__ = '2.4'
+__title__ = 'Firmware Download Utility'
+__mod__ = 'hp-firmware'
+__doc__ = "Download firmware to a device that requires downloaded firmware to function. (Note: Most printers do not require the use of this utility)."
+
+# Std Lib
+import sys
+import getopt
+import gzip
+import operator
+import time
+import os
+
+# Local
+from base.g import *
+from base import device, status, utils, tui, module
+from prnt import cups
+
+
+try:
+ mod = module.Module(__mod__, __title__, __version__, __doc__, None,
+ (INTERACTIVE_MODE, GUI_MODE, NON_INTERACTIVE_MODE),
+ (UI_TOOLKIT_QT4, UI_TOOLKIT_QT3), True, True)
+
+ mod.setUsage(module.USAGE_FLAG_DEVICE_ARGS,
+ extra_options=[
+ ("Use USB IDs to specify printer:", "-s bbb:ddd, where bbb is the USB bus ID and ddd is the USB device ID. The ':' and all leading zeroes must be present.", "option", False),
+ ("Seconds to delay before download:", "-y<secs> or --delay=<secs> (float value, e.g. 0.5)", "option", False)],
+ see_also_list=['hp-plugin', 'hp-toolbox'])
+
+ opts, device_uri, printer_name, mode, ui_toolkit, lang = \
+ mod.parseStdOpts('y:s:', ['delay='])
+
+ device_uri = None
+ printer_name = None
+ usb_bus_node = None
+ usb_bus_id = None
+ usb_device_id = None
+ silent = False
+ delay = 0.0
+
+ for o, a in opts:
+ if o == '-s':
+ silent = True
+ try:
+ usb_bus_id, usb_device_id = a.split(":", 1)
+ log.debug("USB bus ID: %s" % usb_bus_id)
+ log.debug("USB device ID: %s" % usb_device_id)
+ except ValueError:
+ log.error("Invalid USB IDs: %s" % a)
+ sys.exit(1)
+
+ if len(usb_bus_id) != 3 or len(usb_device_id) != 3:
+ log.error("Invalid USB IDs '%s'. Must be the format: bbb.ddd" % a)
+ sys.exit(1)
+
+ usb_bus_node = a
+ mode = NON_INTERACTIVE_MODE
+
+ elif o in ('-y', '--delay'):
+ try:
+ delay = float(a)
+ except ValueError:
+ log.error("Invalid delay value. Must be numeric (float) value. Setting delay to 0.0")
+ delay = 0.0
+
+ mode = NON_INTERACTIVE_MODE
+
+
+ if ui_toolkit == 'qt4':
+ if not utils.canEnterGUIMode4():
+ log.error("%s -u/--gui requires Qt4 GUI support. Entering interactive mode." % __mod__)
+ mode = INTERACTIVE_MODE
+
+ elif ui_toolkit == 'qt3':
+ if not utils.canEnterGUIMode():
+ log.error("%s -u/--gui requires Qt3 GUI support. Entering interactive mode." % __mod__)
+ mode = INTERACTIVE_MODE
+
+ if mode in (GUI_MODE, INTERACTIVE_MODE):
+ mod.quiet = False
+
+ if mode == GUI_MODE:
+ if ui_toolkit == 'qt4':
+ try:
+ from PyQt4.QtGui import QApplication
+ from ui4.firmwaredialog import FirmwareDialog
+ except ImportError:
+ log.error("Unable to load Qt4 support. Is it installed?")
+ sys.exit(1)
+
+ if ui_toolkit == 'qt3':
+ try:
+ from qt import *
+ from ui.firmwaredialog import FirmwareDialog
+ except ImportError:
+ log.error("Unable to load Qt3 support. Is it installed?")
+ sys.exit(1)
+
+
+ mod.showTitle()
+
+ device_uri = mod.getDeviceUri(device_uri, printer_name,
+ filter={'fw-download': (operator.gt, 0)})
+
+ if 1:
+ app = QApplication(sys.argv)
+
+ dialog = FirmwareDialog(None, device_uri)
+ dialog.show()
+ try:
+ log.debug("Starting GUI loop...")
+ if ui_toolkit == 'qt4':
+ app.exec_()
+ elif ui_toolkit == 'qt3':
+ dialog.exec_loop()
+ except KeyboardInterrupt:
+ sys.exit(0)
+
+ sys.exit(0)
+
+ mod.showTitle()
+
+ if usb_bus_node is not None:
+ log.debug("USB bus node: %s" % usb_bus_node)
+ device_uri, sane_uri, fax_uri = device.makeURI(usb_bus_node, 1)
+
+ if not device_uri:
+ log.error("Invalid USB Device ID or USB bus ID. No device found.")
+ sys.exit(1)
+
+ else:
+ device_uri = mod.getDeviceUri(device_uri, printer_name,
+ filter={'fw-download': (operator.gt, 0)})
+
+ try:
+ d = device.Device(device_uri, printer_name)
+ except Error:
+ log.error("Error opening device. Exiting.")
+ sys.exit(1)
+
+ try:
+ if delay:
+ time.sleep(delay)
+
+ try:
+ d.open()
+ d.queryModel()
+ except Error, e:
+ log.error("Error opening device (%s). Exiting." % e.msg)
+ sys.exit(1)
+
+ fw_download = d.mq.get('fw-download', 0)
+
+ if fw_download:
+ if d.downloadFirmware(usb_bus_id, usb_device_id):
+ if not silent:
+ log.info("Done.")
+ sys.exit(0)
+
+ else:
+ log.error("Firmware download failed.")
+ sys.exit(1)
+
+ else:
+ log.error("Device %s does not support or require firmware download." % device_uri)
+ sys.exit(1)
+
+ finally:
+ d.close()
+
+except KeyboardInterrupt:
+ log.error("User exit")
diff --git a/foomatic_drv.inc b/foomatic_drv.inc
new file mode 100644
index 0000000..422344d
--- /dev/null
+++ b/foomatic_drv.inc
@@ -0,0 +1,880 @@
+foomatic_ppd_printers = \
+ ppd/hpijs/hp-deskjet_690-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cp4520_series-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_825c-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_7000_e809a_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_7345-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_a520_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_f2200_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_1320nw-hpijs.ppd.gz \
+ ppd/hpijs/hp-business_inkjet_2280-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cp2025-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_2500_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_a320_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_2500-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-photosmart_7510_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_8550-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_2100_series-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_630c-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_pro_k550-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_f735-hpijs.ppd.gz \
+ ppd/hpijs/hp-psc_920-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_series_600-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_5105-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_240_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_5400_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_4si-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-photosmart_plus_b210_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_9000_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-photosmart_a310_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_3700-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_5652-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_3700n-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_3320-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cp2025n-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-officejet_j5700_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_j3600_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_m3027_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_p1009-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_1160_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p1007-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_4550-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-officejet_7000_e809a-hpijs.ppd.gz \
+ ppd/hpijs/hp-psc_1500_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_500-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_f4100_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_a630_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_pro_8500_a910-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_b010_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_690c-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_professional_p1606dn-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_5600_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_4105-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_8100_series-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_4730mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-photosmart_3100_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_m1120n_mfp-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_pro_k5300-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_b109a_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_520-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_5200-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_5551-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_4v-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_935c-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_professional_p1102w-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_3650-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_cp_1025nw-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_3500-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_r60-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_inkjet_cp1700-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p4015tn-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_series_320-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cp4020_series-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_5100_series-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_ink_advant_k109a-z-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_1200-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_895c-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_professional_p1106-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_v30-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_4100_series-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-officejet_series_350-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_9300-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_c6300_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cm6030_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_3819-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_948c-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_697-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_d_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_d730-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_330_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_7400_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p2015x_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_3000_j310_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_d2300_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-business_inkjet_2230-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_2300_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_5p-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_8000_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p4515tn-hpijs.ppd.gz \
+ ppd/hpijs/hp-business_inkjet_2800-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-photosmart_2700_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p4515-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_4200_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_j3500_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_series_725-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_pro_b8800_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-psc_950vr-hpijs.ppd.gz \
+ ppd/hpijs/hp-psc_2150_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_m4345_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_505j-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_c4200_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_3380-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-officejet_pro_l7700-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_4200-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-officejet_series_310-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cm2320nf_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_f4500_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_8150_mfp-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_7550-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_2200-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-officejet_5110v-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_640c-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_3740-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_c5100_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_f2400_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_812c-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_9050-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-photosmart_5510_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p4014dn-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_d7200_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_r45-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_professional_m1217nfw_mfp-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_1600cm-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p2035-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_p2055dn-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_4650-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cp3525-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_cm1418fnw-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_cm1412fn-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_p4015n-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_g55xi-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_9000_series-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-psc_1600_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_5552-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_pro_8500_a909n-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cm1312nfi_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-officejet_g85xi-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_c4100_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-915-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_3200se-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_9040_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_9040-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_9800-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_3810-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_1200c-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_3500-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_c6200_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_professional_p1566-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p4014n-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_3870-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p2035n-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-officejet_pro_8600-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_pro_1150c-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_7150-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_4500-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-officejet_j4500_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_7500_e910-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p4015x-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_882c-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_933c-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_950c-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_f4210_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-dj450-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_a430_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_3055-hpijs.ppd.gz \
+ ppd/hpijs/hp-business_inkjet_2600-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_p1505n-hpijs-zxs.ppd.gz \
+ ppd/hpijs/hp-photosmart_c7200_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_1022n-hpijs-zjs.ppd.gz \
+ ppd/hpijs/hp-photosmart_470_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_1300-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_841c-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_3050_j610_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_6100-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_c3100_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_843c-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_c5200_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_m1120_mfp-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_1150-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_m5025_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_5si_mopier-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_510-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_series_520-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_5-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_3420-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_890c-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_3550-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cp1515n-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-officejet_4500_g510g-m-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p2015dn_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_2000_j210_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_1600-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_f4200_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_842c-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_3550-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_830c-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_1120-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_k60-hpijs.ppd.gz \
+ ppd/hpijs/hp-psc_1400_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_4050_series-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_6l-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_610cl-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_a610_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_3330-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_845c-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_m1005-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_6800-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_380_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_pro_l7400-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p1005-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_7800_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_4ml-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_series_300-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_cm1415fnw-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_5550-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_professional_p_1102w-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_4600-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_3300_3310_3320-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_4_plus-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_d1300_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-psc_2300_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_a710_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_1220-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_p2014-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_m9059_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_5200l-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_957c-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_6940_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_940c-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_5500_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_r80xi-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_1000_j110_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_cp_1025-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_995c-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_d4300_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_d110_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_ink_adv_2060_k110-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_692-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_pro_k8600-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_1215-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_6120-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_7600_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_c4500_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-psc_2350_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_3425-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p4014-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p2055-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_4240-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-printer_scanner_copier_300-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_d4100_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_400l-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_682-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_5100-hpijs.ppd.gz \
+ ppd/hpijs/hp-psc_780xi-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_series_330-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_m5039_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-envy_100_d410_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_815c-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cm4540_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_1300n-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-business_inkjet_2250-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-photosmart_ink_adv_k510-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_612c-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_m5035_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_1300xi-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_1200n-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_g85-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_p1100-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_1005_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_3392-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_1010-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_m4349_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_3822-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_r40-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_3800-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-photosmart_c4340_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_1320_series-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_990c-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_5000-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_5600-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_professional_m1214nfh_mfp-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cp5225n-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-photosmart_5510d_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_8100_mfp-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_4mp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_540-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_d7400_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_series_710-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_3030-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-officejet_r65-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_cp1025nw-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_5700-hpijs.ppd.gz \
+ ppd/hpijs/hp-psc_500-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_b110_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-psc_720-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_550c-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_1315-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cp2025dn-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-photosmart_7700_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_cm1411fn-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cp6015-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_670tv-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_930c-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_6500_e709a-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_2600n-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_6500_e710a-f-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p4015dn-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_3920-hpijs.ppd.gz \
+ ppd/hpijs/hp-business_inkjet_1100-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_6mp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_9500-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_1020-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_694-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_3910-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_1022-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-officejet-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_f2100_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_6700-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_3020-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_p2035-hpijs-zjs.ppd.gz \
+ ppd/hpijs/hp-officejet_4500_g510n-z-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_plus_b209a-m-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_g55-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_8700_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_5m-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_d2600_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_c8100_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_k80xi-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p1006-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_1000-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_series_580-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p1505-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_premium_c309g-m-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_p1000-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_7200_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_b8500_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_9050_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-officejet_series_570-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_460-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_7900_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_c5500_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-2000c-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_c4380_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_3200-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_cm1415fn-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_3000-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_d1500_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_8400_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_m9040_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_3015-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-psc_1310_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_7350-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_3940-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_prem_c310_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_6122-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_695-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_100_mobile_l411-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_816c-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_d1400_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_4610-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cm6040_mfp-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p4015-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_1022n-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-officejet_7300_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_2100-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_cm1416fnw-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-officejet_r80-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_4700-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-officejet_4100_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_m2727_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-photosmart_d7300_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_810c-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_4000_series-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_p2055d-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-photosmart_wireless_b109n-z-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_pro_l7600-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_ink_advant_k209a-z-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_5mp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_3100-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_9055mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cp1217-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_h470-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_975c-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p2014n-hpijs-zxs.ppd.gz \
+ ppd/hpijs/hp-officejet_5100_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_6980_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_professional_p1102-hpijs.ppd.gz \
+ ppd/hpijs/hp-business_inkjet_2200-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p4515x-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_pro_k5400-hpijs.ppd.gz \
+ ppd/hpijs/hp-psc_950xi-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_j5500_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-psc_1300_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_632c-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_d5100_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_932c-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_230-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_140_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_cm1417fnw-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-psc_1358_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_k60xi-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_4l-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_6127-hpijs.ppd.gz \
+ ppd/hpijs/hp-psc_750-hpijs.ppd.gz \
+ ppd/hpijs/hp-psc_1100_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_600-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p3005-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-officejet_series_700-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_6500-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cm4730_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_9065mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_4100_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-officejet_6000_e609n-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_8150_series-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_3500n-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_8200_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_professional_m1213nf_mfp-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_8000-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cm3530_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-photosmart_a510_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_pro_8000_a809-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_6510_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_3840-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_f300_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p2015n_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_b109a-m-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_2200_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_pro_8100-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_5200lx-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_6500_e710n-z-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_7100_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_2600_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_professional_m1212nf_mfp-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_5800-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_1022-hpijs-zjs.ppd.gz \
+ ppd/hpijs/hp-officejet_4400_k410-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cp3505-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_p2015_series-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_670c-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_670-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_2050_j510_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_4000_k210-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_6500_e709n-hpijs.ppd.gz \
+ ppd/hpijs/hp-psc_2100_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_c6100_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_656c-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_934c-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_k80-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_1100xi-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_610c-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_4500_g510a-f-hpijs.ppd.gz \
+ ppd/hpijs/hp-psc_2170_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cp4005-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_3900-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cp5225-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-business_inkjet_2300-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_4250-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-officejet_k7100-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_2430-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_955c-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_850c-hpijs.ppd.gz \
+ ppd/hpijs/hp-psc_2200_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_1018-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_pro_1170c_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-2500c-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_pro_b8300_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_6p-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_series_590-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_3200_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-mopier_320-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-psc_780-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_2410-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-officejet_j4660_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_3600-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_5110-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_v40-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_c4700_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_1218-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_m1538dnf_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_3600-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_c4400_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_1320n-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_1022nw-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_professional_m1132_mfp-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_5900_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_400-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_832c-hpijs.ppd.gz \
+ ppd/hpijs/hp-psc_760-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_3450-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_d5060_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_8000_series-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-psc_2210_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p4515n-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_500c-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_ink_adv_2010_k010-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_j4680_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_9600-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_952c-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_100-hpijs.ppd.gz \
+ ppd/hpijs/hp-psc_1510_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_4300_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_1022nw-hpijs-zjs.ppd.gz \
+ ppd/hpijs/hp-officejet_6150_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_v45-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p1505n-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-officejet_pro_k850-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_6200_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_1220c-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_3052-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cm1312_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-photosmart_c4600_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-business_inkjet_3000-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_959c-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_pro_l7300-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_professional_m1216nfh_mfp-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_d7100_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_8500-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-photosmart_7200_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_estn_c510_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_d7500_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_6100_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_d6100_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_4350-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-910-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_6300_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_420_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_a820_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_3150-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_4150_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_professional_m1219nf_mfp-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p2014-hpijs-zxs.ppd.gz \
+ ppd/hpijs/hp-psc_1000_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_7400_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_5l-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_8100_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_970c-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_r40xi-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_680-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_cp1025-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_professional_m1136_mfp-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_series_610-hpijs.ppd.gz \
+ ppd/hpijs/hp-dj350-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_m1319f_mfp-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p2035n-hpijs-zjs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cm2320n_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-photosmart_d5400_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_3050a_j611_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cp2025x-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_d1600_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p2055x-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_3816-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_prem_c410_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_c309a_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_3050-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_5650-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_1050_j410_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_672c-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_370_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_320_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_1015-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_m1522nf_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-officejet_t_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_5500-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_1280-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_4115_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_3200m-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-photosmart_2570_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-psc_2400_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_m1539dnf_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_1220se-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cp5225dn-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_f4213_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cm6049_mfp-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_m1536dnf_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-officejet_6000_e609a-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_660-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_c7100_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_916c-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_1012-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_1100a-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_d4200_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_9100_series-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_professional_p1108-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p3004-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_cm1413fn-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-officejet_g95-hpijs.ppd.gz \
+ ppd/hpijs/hp-psc_1200_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_5000_series-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_1100-hpijs.ppd.gz \
+ ppd/hpijs/hp-business_inkjet_1200-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_3550n-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_4500_k710-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_c5300_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p2015d_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_130-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_9500_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cp1518ni-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_5550-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-mopier_240-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_p3010_series-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_693-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_series_630-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_648c-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_pro_8500_a909a-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cp1514n-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-psc_950-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_f4400_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_920c-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_prem-web_c309n-s-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_d2400_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_5si-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cp1215-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_series_720-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_v40xi-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_d2500_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_3070_b611_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_pro_8500_a909g-hpijs.ppd.gz \
+ ppd/hpijs/hp-cp1160-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_3820-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_6600-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cp5520_series-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-officejet_lx-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_2300-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-business_inkjet_1000-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_1160-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_a620_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_3300_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_980c-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_870c-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p1008-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_inkjet_printer_cp1700-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_855c-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_880c-hpijs.ppd.gz \
+ ppd/hpijs/hp-psc_2500_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_3390-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_p4515xm-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_6600-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_2420-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_1600cn-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_1115-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_p2014n-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_1320-hpijs.ppd.gz \
+ ppd/hpijs/hp-psc_750xi-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_1320tn-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_1100-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_840c-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_5850-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_960c-hpijs.ppd.gz \
+ ppd/hpijs/hp-laserjet_4345_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_m1537dnf_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-officejet_4255-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_d5300_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_j6400_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_1600c-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_4600_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-psc_900_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cm2320_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_m3035_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_4300-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-deskjet_d5500_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_1125-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_a640_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-envy_110_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-officejet_pro_l7500-hpijs.ppd.gz \
+ ppd/hpijs/hp-color_laserjet_cm2320fxi_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-laserjet_m9050_mfp-hpijs-pcl3.ppd.gz \
+ ppd/hpijs/hp-photosmart_a530_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-photosmart_a440_series-hpijs.ppd.gz \
+ ppd/hpijs/hp-deskjet_3325-hpijs.ppd.gz
+
+foomatic_ps_printers = \
+ prnt/ps/hp-laserjet_4250-ps.ppd.gz \
+ prnt/ps/hp-laserjet_p3005-ps.ppd.gz \
+ prnt/ps/hp-officejet_pro_8000_enterprise_a811a-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_3700n-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_4610-ps.ppd.gz \
+ prnt/ps/hp-designjet_4020ps-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_4550-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cp5225-ps.ppd.gz \
+ prnt/ps/hp-laserjet_3015-ps.ppd.gz \
+ prnt/ps/hp-designjet_t1100ps_24in-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cm2320n_mfp-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cp3525-ps.ppd.gz \
+ prnt/ps/hp-laserjet_9055mfp-ps.ppd.gz \
+ prnt/ps/hp-business_inkjet_2250-ps.ppd.gz \
+ prnt/ps/hp-laserjet_m3035_mfp-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cm6040_mfp-ps.ppd.gz \
+ prnt/ps/hp-designjet_4000ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_2605dn-ps.ppd.gz \
+ prnt/ps/hp-laserjet_600_m601_m602_m603-ps.ppd.gz \
+ prnt/ps/hp-laserjet_m3027_mfp-ps.ppd.gz \
+ prnt/ps/hp-laserjet_5000_series-ps.ppd.gz \
+ prnt/ps/hp-laserjet_m4555_mfp-ps.ppd.gz \
+ prnt/ps/hp-laserjet_cp1520_series-ps.ppd.gz \
+ prnt/ps/hp-laserjet_8000-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cm6030_mfp-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cp2025n-ps.ppd.gz \
+ prnt/ps/hp-designjet_t1300_postscript-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_2605-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_4650-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cp5225n-ps.ppd.gz \
+ prnt/ps/hp-laserjet_cm1410_series-ps.ppd.gz \
+ prnt/ps/hp-laserjet_1320_series-ps.ppd.gz \
+ prnt/ps/hp-laserjet_4300-ps.ppd.gz \
+ prnt/ps/hp-laserjet_9065mfp-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cp4020_series-ps.ppd.gz \
+ prnt/ps/hp-designjet_t790ps_24in-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_4700-ps.ppd.gz \
+ prnt/ps/hp-laserjet_5200lx-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_2800-ps.ppd.gz \
+ prnt/ps/hp-laserjet_2200-ps.ppd.gz \
+ prnt/ps/hp-designjet_z6200_42in_photo-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cp2025x-ps.ppd.gz \
+ prnt/ps/hp-designjet_t770_postscript-ps.ppd.gz \
+ prnt/ps/hp-laserjet_2430-ps.ppd.gz \
+ prnt/ps/hp-laserjet_9040-ps.ppd.gz \
+ prnt/ps/hp-designjet_t790ps_44in-ps.ppd.gz \
+ prnt/ps/hp-laserjet_1300-ps.ppd.gz \
+ prnt/ps/hp-laserjet_5200-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cm2320nf_mfp-ps.ppd.gz \
+ prnt/ps/hp-laserjet_m1522n_mfp-ps.ppd.gz \
+ prnt/ps/hp-designjet_4520ps-ps.ppd.gz \
+ prnt/ps/hp-designjet_t7100ps_monochrome-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cp1514n-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_2500-ps.ppd.gz \
+ prnt/ps/hp-designjet_t1120ps_24in-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cm2320fxi_mfp-ps.ppd.gz \
+ prnt/ps/hp-laserjet_m9050_mfp-ps.ppd.gz \
+ prnt/ps/hp-laserjet_4200-ps.ppd.gz \
+ prnt/ps/hp-laserjet_9040_mfp-ps.ppd.gz \
+ prnt/ps/hp-designjet_t1100ps_44in-ps.ppd.gz \
+ prnt/ps/hp-laserjet_4100_mfp-ps.ppd.gz \
+ prnt/ps/hp-laserjet_4_plus-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cp4005-ps.ppd.gz \
+ prnt/ps/hp-laserjet_9000_series-ps.ppd.gz \
+ prnt/ps/hp-mopier_320-ps.ppd.gz \
+ prnt/ps/hp-business_inkjet_2280-ps.ppd.gz \
+ prnt/ps/hp-laserjet_4-ps.ppd.gz \
+ prnt/ps/hp-laserjet_500_color_m551-ps.ppd.gz \
+ prnt/ps/hp-laserjet_4240-ps.ppd.gz \
+ prnt/ps/hp-laserjet_3300_3310_3320-ps.ppd.gz \
+ prnt/ps/hp-business_inkjet_3000-ps.ppd.gz \
+ prnt/ps/hp-laserjet_1220se-ps.ppd.gz \
+ prnt/ps/hp-designjet_4500ps.ppd.gz \
+ prnt/ps/hp-laserjet_1200n-ps.ppd.gz \
+ prnt/ps/hp-laserjet_5100_series-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cm4540_mfp-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_5m-ps.ppd.gz \
+ prnt/ps/hp-laserjet_m1530_mfp_series-ps.ppd.gz \
+ prnt/ps/hp-laserjet_4100_series-ps.ppd.gz \
+ prnt/ps/hp-cm8050_mfp_with_edgeline-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_3800-ps.ppd.gz \
+ prnt/ps/hp-laserjet_1320tn-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cp1515n-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_2840-ps.ppd.gz \
+ prnt/ps/hp-laserjet_4345_mfp-ps.ppd.gz \
+ prnt/ps/hp-laserjet_4si-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cp6015-ps.ppd.gz \
+ prnt/ps/hp-laserjet_4mp-ps.ppd.gz \
+ prnt/ps/hp-laserjet_2300_series-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_8500-ps.ppd.gz \
+ prnt/ps/hp-laserjet_8100_series-ps.ppd.gz \
+ prnt/ps/hp-laserjet_1320-ps.ppd.gz \
+ prnt/ps/hp-designjet_4500mfp.ppd.gz \
+ prnt/ps/hp-laserjet_6mp-ps.ppd.gz \
+ prnt/ps/hp-cm8060_mfp_with_edgeline-ps.ppd.gz \
+ prnt/ps/hp-laserjet_5200l-ps.ppd.gz \
+ prnt/ps/hp-laserjet_3052-ps.ppd.gz \
+ prnt/ps/hp-laserjet_100_color_mfp_m175-ps.ppd.gz \
+ prnt/ps/hp-laserjet_m1522nf_mfp-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cm1015-ps.ppd.gz \
+ prnt/ps/hp-laserjet_p2055_series-ps.ppd.gz \
+ prnt/ps/hp-laserjet_200_colormfp_m275-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_8550-ps.ppd.gz \
+ prnt/ps/hp-laserjet_1220-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_2700n-ps.ppd.gz \
+ prnt/ps/hp-laserjet_1300xi-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cp5520_series-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_2605dtn-ps.ppd.gz \
+ prnt/ps/hp-designjet_z6100ps_60in_photo-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_3000-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cm1312_mfp-ps.ppd.gz \
+ prnt/ps/hp-laserjet_2420-ps.ppd.gz \
+ prnt/ps/hp-laserjet_5mp-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_2550_series-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_9500-ps.ppd.gz \
+ prnt/ps/hp-laserjet_8150_mfp-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cp5225dn-ps.ppd.gz \
+ prnt/ps/hp-laserjet_m5035_mfp-ps.ppd.gz \
+ prnt/ps/hp-laserjet_2200_series-ps.ppd.gz \
+ prnt/ps/hp-laserjet_m1522_mfp-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cp3505-ps.ppd.gz \
+ prnt/ps/hp-business_inkjet_2800-ps.ppd.gz \
+ prnt/ps/hp-laserjet_4350-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet-ps.ppd.gz \
+ prnt/ps/hp-laserjet_m5025_mfp-ps.ppd.gz \
+ prnt/ps/hp-laserjet_2100-ps.ppd.gz \
+ prnt/ps/hp-laserjet_p3010_series-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_4500-ps.ppd.gz \
+ prnt/ps/hp-laserjet_3050-ps.ppd.gz \
+ prnt/ps/hp-laserjet_3200m-ps.ppd.gz \
+ prnt/ps/hp-laserjet_1300n-ps.ppd.gz \
+ prnt/ps/hp-laserjet_3380-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_2830-ps.ppd.gz \
+ prnt/ps/hp-laserjet_9050-ps.ppd.gz \
+ prnt/ps/hp-laserjet_5si_mopier-ps.ppd.gz \
+ prnt/ps/hp-lj_300_400_color_mfp_m375_m475-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_4600_series-ps.ppd.gz \
+ prnt/ps/hp-designjet_t7100ps-ps.ppd.gz \
+ prnt/ps/hp-designjet_t770ps_24in-ps.ppd.gz \
+ prnt/ps/hp-designjet_z6100ps_42in_photo-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cm4730_mfp-ps.ppd.gz \
+ prnt/ps/hp-laserjet_3030-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_9500_mfp-ps.ppd.gz \
+ prnt/ps/hp-laserjet_m4345_mfp-ps.ppd.gz \
+ prnt/ps/hp-laserjet_p3004-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_4730mfp-ps.ppd.gz \
+ prnt/ps/hp-laserjet_m4349_mfp-ps.ppd.gz \
+ prnt/ps/hp-laserjet_5p-ps.ppd.gz \
+ prnt/ps/hp-designjet_t2300_postscript-ps.ppd.gz \
+ prnt/ps/hp-laserjet_m9059_mfp-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_3700-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cp2025dn-ps.ppd.gz \
+ prnt/ps/hp-laserjet_5000-ps.ppd.gz \
+ prnt/ps/hp-laserjet_p4010_series-ps.ppd.gz \
+ prnt/ps/hp-laserjet_1320n-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cm6049_mfp-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_2700-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cp4520_series-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_5500-ps.ppd.gz \
+ prnt/ps/hp-laserjet_m2727_mfp_series-ps.ppd.gz \
+ prnt/ps/hp-laserjet_2300-ps.ppd.gz \
+ prnt/ps/hp-laserjet_3390-ps.ppd.gz \
+ prnt/ps/hp-business_inkjet_2600-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cm1312nfi_mfp-ps.ppd.gz \
+ prnt/ps/hp-laserjet_3020-ps.ppd.gz \
+ prnt/ps/hp-laserjet_1320nw-ps.ppd.gz \
+ prnt/ps/hp-laserjet_4050_series-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_5550-ps.ppd.gz \
+ prnt/ps/hp-laserjet_p2015_series-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cm1017-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_2820-ps.ppd.gz \
+ prnt/ps/hp-laserjet_4v-ps.ppd.gz \
+ prnt/ps/hp-laserjet_2100_series-ps.ppd.gz \
+ prnt/ps/hp-laserjet_9050_mfp-ps.ppd.gz \
+ prnt/ps/hp-business_inkjet_2300-ps.ppd.gz \
+ prnt/ps/hp-designjet_z6200_60in_photo-ps.ppd.gz \
+ prnt/ps/hp-laserjet_5si-ps.ppd.gz \
+ prnt/ps/hp-designjet_4520mfp-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cp1518ni-ps.ppd.gz \
+ prnt/ps/hp-laserjet_2410-ps.ppd.gz \
+ prnt/ps/hp-designjet_t1120ps_44in-ps.ppd.gz \
+ prnt/ps/hp-mopier_240-ps.ppd.gz \
+ prnt/ps/hp-laserjet_6p-ps.ppd.gz \
+ prnt/ps/hp-laserjet_1200-ps.ppd.gz \
+ prnt/ps/hp-designjet_t1200_postscript-ps.ppd.gz \
+ prnt/ps/hp-laserjet_4ml-ps.ppd.gz \
+ prnt/ps/hp-laserjet_m9040_mfp-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_4600-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cp2025-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cm3530_mfp-ps.ppd.gz \
+ prnt/ps/hp-laserjet_8100_mfp-ps.ppd.gz \
+ prnt/ps/hp-laserjet_8000_series-ps.ppd.gz \
+ prnt/ps/hp-laserjet_4000_series-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_2500_series-ps.ppd.gz \
+ prnt/ps/hp-color_laserjet_cm2320_mfp-ps.ppd.gz \
+ prnt/ps/hp-lj_300_400_color_m351_m451-ps.ppd.gz \
+ prnt/ps/hp-laserjet_9000_mfp-ps.ppd.gz
+
+foomatic_drv = prnt/drv/hpijs.drv
+
diff --git a/hpdio.py b/hpdio.py
new file mode 100755
index 0000000..28e7607
--- /dev/null
+++ b/hpdio.py
@@ -0,0 +1,205 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2008 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+__version__ = '0.1'
+__title__ = "Services and Status System Tray Device I/O Child Process"
+__mod__ = 'hpdio'
+__doc__ = "Provides device I/O process isolation for system tray application."
+
+
+# StdLib
+import sys
+import struct
+import os
+import time
+import Queue
+import select
+from cPickle import dumps, HIGHEST_PROTOCOL
+
+# Local
+from base.g import *
+from base.codes import *
+from base import utils, device, status, models
+
+# dBus
+try:
+ from dbus import lowlevel, SessionBus
+except ImportError:
+ log.error("dbus failed to load (python-dbus ver. 0.80+ required). Exiting...")
+ sys.exit(1)
+
+# Globals
+PIPE_BUF = 4096
+session_bus = None
+r2, w3 = None, None
+devices = {} # { 'device_uri' : device.Device(), ... }
+
+
+def send_message(device_uri, event_code, bytes_written=0):
+ args = [device_uri, '', event_code, prop.username, 0, '', '', bytes_written]
+ msg = lowlevel.SignalMessage('/', 'com.hplip.StatusService', 'Event')
+ msg.append(signature='ssisissi', *args)
+ SessionBus().send_message(msg)
+
+
+def run(read_pipe2=None, # pipe from hpssd
+ write_pipe3=None): # pipe to hpssd
+
+ global r2, w3
+ tmp_dir = '/tmp'
+ os.umask(0111)
+
+ try:
+ log.set_module("hp-systray(hpdio)")
+ log.debug("PID=%d" % os.getpid())
+
+ r2, w3 = read_pipe2, write_pipe3
+
+ fmt = "80s80sI32sI80sf" # TODO: Move to Event class
+ fmt_size = struct.calcsize(fmt)
+
+ response = {}
+ dev = None
+ m = ''
+ while True:
+ try:
+ r, w, e = select.select([r2], [], [r2], 1.0)
+ except KeyboardInterrupt:
+ break
+ except select.error, e:
+ if e[0] == errno.EINTR:
+ continue
+ else:
+ break
+
+ if not r: continue
+ if e: break
+
+ m = ''.join([m, os.read(r2, fmt_size)])
+
+ if not m:
+ break
+
+ while len(m) >= fmt_size:
+ response.clear()
+ event = device.Event(*struct.unpack(fmt, m[:fmt_size]))
+ m = m[fmt_size:]
+
+ action = event.event_code
+ device_uri = event.device_uri
+
+ log.debug("Handling event...")
+ event.debug()
+
+ send_message(device_uri, EVENT_DEVICE_UPDATE_ACTIVE)
+
+ if action in (EVENT_DEVICE_UPDATE_REQUESTED, EVENT_POLLING_REQUEST):
+ #try:
+ if 1:
+ #log.debug("%s starting for %s" % (ACTION_NAMES[action], device_uri))
+
+ try:
+ dev = devices[device_uri]
+ except KeyError:
+ dev = devices[device_uri] = device.Device(device_uri, disable_dbus=True)
+
+ try:
+ #print "Device.open()"
+ dev.open()
+ except Error, e:
+ log.error(e.msg)
+ response = {'error-state': ERROR_STATE_ERROR,
+ 'device-state': DEVICE_STATE_NOT_FOUND,
+ 'status-code' : EVENT_ERROR_DEVICE_IO_ERROR}
+
+ if dev.device_state == DEVICE_STATE_NOT_FOUND:
+ dev.error_state = ERROR_STATE_ERROR
+ else:
+ if action == EVENT_DEVICE_UPDATE_REQUESTED:
+ try:
+ #print "Device.queryDevice()"
+ dev.queryDevice()
+
+ except Error, e:
+ log.error("Query device error (%s)." % e.msg)
+ dev.error_state = ERROR_STATE_ERROR
+ dev.status_code = EVENT_ERROR_DEVICE_IO_ERROR
+
+ response = dev.dq
+ #print response
+
+ log.debug("Device state = %d" % dev.device_state)
+ log.debug("Status code = %d" % dev.status_code)
+ log.debug("Error state = %d" % dev.error_state)
+
+ else: # EVENT_POLLING_REQUEST
+ try:
+ dev.pollDevice()
+
+ except Error, e:
+ log.error("Poll device error (%s)." % e.msg)
+ dev.error_state = ERROR_STATE_ERROR
+
+ else:
+ response = {'test' : 1}
+
+ #finally:
+ if 1:
+ if dev is not None:
+ dev.close()
+
+ #thread_activity_lock.release()
+
+ elif action == EVENT_USER_CONFIGURATION_CHANGED:
+ pass
+
+ elif action == EVENT_SYSTEMTRAY_EXIT:
+ log.debug("Exiting")
+ sys.exit(1)
+
+ send_message(device_uri, EVENT_DEVICE_UPDATE_INACTIVE)
+
+ if action == EVENT_DEVICE_UPDATE_REQUESTED:
+ #print response
+ data = dumps(response, HIGHEST_PROTOCOL)
+
+ log.debug("Sending data through pipe to hpssd...")
+ total_written = 0
+ while True:
+ total_written += os.write(w3, data[:PIPE_BUF])
+ data = data[PIPE_BUF:]
+ if not data:
+ break
+
+ log.debug("Wrote %d bytes" % total_written)
+
+ send_message(device_uri, EVENT_DEVICE_UPDATE_REPLY, total_written)
+
+ elif action == EVENT_POLLING_REQUEST:
+ # TODO: Translate into event: scan requested, copy requested, etc.. send as event
+ #try:
+ # os.write
+ pass
+
+
+ except KeyboardInterrupt:
+ log.debug("Ctrl-C: Exiting...")
diff --git a/hplip-install b/hplip-install
new file mode 100755
index 0000000..9bc584b
--- /dev/null
+++ b/hplip-install
@@ -0,0 +1,7 @@
+#!/bin/bash
+python ./install.py -i $*
+
+
+
+
+
diff --git a/hplip-systray.desktop.in b/hplip-systray.desktop.in
new file mode 100644
index 0000000..0dca2ec
--- /dev/null
+++ b/hplip-systray.desktop.in
@@ -0,0 +1,12 @@
+[Desktop Entry]
+Version=0.6
+Type=Application
+Name=HP System Tray Service
+GenericName=Printer Status Applet
+Comment=HP System Tray Service
+Exec=hp-systray
+Icon=@abs_datadir@/hplip/data/images/128x128/hp_logo.png
+Terminal=false
+Categories=Application;Utility;
+X-KDE-StartupNotify=false
+StartupNotify=false
diff --git a/hplip.conf.in b/hplip.conf.in
new file mode 100644
index 0000000..37ef363
--- /dev/null
+++ b/hplip.conf.in
@@ -0,0 +1,45 @@
+# @configure_input@
+
+[hplip]
+version=@VERSION@
+
+[dirs]
+home=@abs_datadir@/hplip
+run=/var/run
+ppd=@abs_hpppddir@
+ppdbase=@abs_ppddir@
+doc=@abs_docdir@
+icon=@icondir@
+cupsbackend=@cupsbackenddir@
+cupsfilter=@cupsfilterdir@
+drv=@abs_drvdir@
+
+# Following values are determined at configure time and cannot be changed.
+[configure]
+network-build=@network_build@
+pp-build=@pp_build@
+gui-build=@gui_build@
+scanner-build=@scan_build@
+fax-build=@fax_build@
+dbus-build=@dbus_build@
+cups11-build=@cups11_build@
+doc-build=@doc_build@
+shadow-build=@shadow_build@
+hpijs-install=@hpijs_install@
+foomatic-drv-install=@foomatic_drv_install@
+foomatic-ppd-install=@foomatic_ppd_install@
+foomatic-rip-hplip-install=@foomatic_rip_hplip_install@
+hpcups-install=@hpcups_install@
+cups-drv-install=@cups_drv_install@
+cups-ppd-install=@cups_ppd_install@
+internal-tag=@PACKAGE_BUGREPORT@
+restricted-build=no
+ui-toolkit=@ui_toolkit@
+qt3=@qt3@
+qt4=@qt4@
+policy-kit=@policykit@
+hpijs-only-build=@hpijs_only_build@
+lite-build=@lite_build@
+udev-acl-rules=@udev_acl_rules@
+hpcups-only-build=@hpcups_only_build@
+hpijs-only-build=@hpijs_only_build@ \ No newline at end of file
diff --git a/hplip.desktop.in b/hplip.desktop.in
new file mode 100644
index 0000000..5a57f5b
--- /dev/null
+++ b/hplip.desktop.in
@@ -0,0 +1,12 @@
+[Desktop Entry]
+Encoding=UTF-8
+Type=Application
+Name=HP Device Manager
+GenericName=Printer Management Application
+Comment=View device status, ink levels and perform maintenance.
+Exec=hp-toolbox
+Icon=@abs_datadir@/hplip/data/images/128x128/hp_logo.png
+Terminal=false
+Categories=Application;Utility;
+X-KDE-StartupNotify=false
+StartupNotify=false
diff --git a/hplip.list.in b/hplip.list.in
new file mode 100644
index 0000000..d56a115
--- /dev/null
+++ b/hplip.list.in
@@ -0,0 +1,491 @@
+# @configure_input@
+#
+# ESP Package Manager (EPM) "list" file.
+#
+# (c) 2008-2009 Copyright Hewlett-Packard Development Company, LP
+#
+# Use this configuration for new distributions that support CUPSDDK 1.2.3 or higher.
+# ./configure --prefix=/usr
+#
+# Use this configuration for old distributions that do *not* support CUPSDDK 1.2.3 or higher.
+# ./configure --prefix=/usr --disable-foomatic-drv-install --enable-foomatic-ppd-install --enable-foomatic-rip-hplip-install
+#
+# By default the hplipfull package is built (print, scan, fax, hp-toolbox, hp-setup).
+#
+# Use this configuration to make the hpliplite package (print, scan).
+# ./configure --prefix=/usr --enable-lite-build
+#
+# Use this command to build the hplip package.
+# make rpm | deb
+#
+# 5/5/09 DES, Added configure time "#" lines since EPM does not handle nested conditionals.
+#
+
+%product HPLIP
+%copyright (c) 2004-2009 Copyright Hewlett-Packard Development Company, LP
+%vendor Hewlett-Packard
+%if PLUGIN
+%license prnt/plugins/license.txt
+%else
+%license COPYING
+%endif
+%readme doc/index.html
+%version @VERSION@
+%description The Hewlett-Packard Linux Imaging and Printing (HPLIP) system
+%description provides a unified single and multi-function connectivity
+%description driver solution. HPLIPLITE provides support for print and scan only.
+%description HPLIPFULL provides support for print, scan, fax and toolbox.
+
+%format rpm deb portable
+
+$prefix=@prefix@
+$exec_prefix=@exec_prefix@
+$bindir=@bindir@
+$datarootdir=@datarootdir@
+$datadir=@datadir@
+$libdir=@libdir@
+$srcdir=@srcdir@
+$pyexecdir=@pyexecdir@
+$icondir=@icondir@
+$systraydir=@systraydir@
+$docdir=@hpdocdir@
+$version=@VERSION@
+$internal_tag=@PACKAGE_BUGREPORT@
+
+$home=@abs_datadir@/hplip
+$ppd=@abs_ppddir@
+$cupsbackend=@cupsbackenddir@
+$cupsfilter=@cupsfilterdir@
+$drv=@abs_drvdir@
+$hpaio-version=libsane-hpaio.so.1.0.0
+$foomatic-rip-install=@epm_foomatic_rip_hplip_install@
+$foomatic-ppd-install=@epm_foomatic_ppd_install@
+$cups-ppd-install=@epm_cups_ppd_install@
+$hpijs-install=@epm_hpijs_install@
+$hpcups-install=@epm_hpcups_install@
+$foomatic-drv-install=@epm_foomatic_drv_install@
+$cups-drv-install=@epm_cups_drv_install@
+$machine=@platform@
+
+$print_only_exclude=@epm_print_only_exclude@
+
+%system linux
+%postinstall ldconfig
+%system all
+
+%if hpijs-install
+@epm_full@f 0755 root root $bindir/hpijs .libs/hpijs
+@epm_lite@f 0755 root root $bindir/hpijs .libs/hpijs
+@epm_hpijs_only@f 0755 root root $bindir/hpijs hpijs
+%endif
+%if hpcups-install
+f 0755 root root $cupsfilter/hpcups hpcups
+f 0755 root root $cupsfilter/hpps hpps
+%endif
+f 0644 root root /etc/hp/hplip.conf hplip.conf
+f 0644 root root /etc/cups/pstotiff.convs fax/filters/pstotiff.convs
+f 0644 root root /etc/cups/pstotiff.types fax/filters/pstotiff.types
+f 0755 root root $cupsfilter/pstotiff fax/filters/pstotiff
+f 0755 root root $cupsfilter/hpcupsfax .libs/hpcupsfax
+%if foomatic-drv-install
+f 0644 root root $drv/hpijs.drv prnt/drv/hpijs.drv
+%endif
+%if foomatic-rip-install
+f 0755 root root $cupsfilter/foomatic-rip-hplip prnt/hpijs/foomatic-rip-hplip
+%endif
+%if foomatic-ppd-install
+f 0644 root root $ppd/HP ppd/hpijs/*.ppd.gz
+%endif
+%if cups-drv-install
+f 0644 root root $drv/hpcups.drv prnt/drv/hpcups.drv
+%endif
+%if cups-ppd-install
+f 0644 root root $ppd/HP ppd/hpcups/*.ppd.gz
+%endif
+f 0644 root root $ppd/HP prnt/ps/*.ppd.gz
+
+%system darwin
+@epm_print_only_exclude@f 0755 root root $libdir/libhpmud.0.0.6.dylib .libs/libhpmud.0.0.6.dylib
+@epm_print_only_exclude@l 0755 root root $libdir/libhpmud.dylib libhpmud.0.0.6.dylib
+@epm_print_only_exclude@f 0755 root root $libdir/libhpip.0.0.1.dylib .libs/libhpip.0.0.1.dylib
+@epm_print_only_exclude@l 0755 root root $libdir/libhpip.dylib libhpip.0.0.1.dylib
+%system !darwin
+@epm_print_only_exclude@f 0755 root root $libdir/libhpmud.so.0.0.6 .libs/libhpmud.so.0.0.6
+@epm_print_only_exclude@l 0755 root root $libdir/libhpmud.so libhpmud.so.0.0.6
+@epm_print_only_exclude@f 0755 root root $libdir/libhpip.so.0.0.1 .libs/libhpip.so.0.0.1
+@epm_print_only_exclude@l 0755 root root $libdir/libhpip.so libhpip.so.0.0.1
+# Ugly fix for inconsistent libcrypto soname
+#l 0755 root root $libdir/libcrypto.so.6 libcrypto.so.0.9.8
+%system all
+
+# scan
+%if !print_only_exclude
+@epm_scan@%system darwin
+@epm_scan@f 0755 root root $libdir/sane/${hpaio-version}.dylib .libs/${hpaio-version}.dylib
+@epm_scan@l 0755 root root $libdir/sane/libsane-hpaio.dylib ${hpaio-version}.dylib
+@epm_scan@%system !darwin
+@epm_scan@f 0755 root root $libdir/sane/${hpaio-version} .libs/${hpaio-version}
+@epm_scan@l 0755 root root $libdir/sane/libsane-hpaio.so ${hpaio-version}
+@epm_scan@l 0755 root root $libdir/sane/libsane-hpaio.so.1 ${hpaio-version}
+@epm_scan@%system all
+@epm_scan@%postinstall <<EOF
+@epm_scan@if [ -f /etc/sane.d/dll.conf ]; then
+@epm_scan@ grep -q ^#hpaio /etc/sane.d/dll.conf
+@epm_scan@ if [ $$? -eq 0 ]; then
+@epm_scan@ sed -i -e s/^#hpaio/hpaio/ /etc/sane.d/dll.conf
+@epm_scan@ else
+@epm_scan@ grep -q ^hpaio /etc/sane.d/dll.conf
+@epm_scan@ if [ $$? -ne 0 ]; then
+@epm_scan@ echo hpaio >>/etc/sane.d/dll.conf
+@epm_scan@ fi
+@epm_scan@ fi
+@epm_scan@fi
+@epm_scan@EOF
+%endif
+
+# full
+@epm_full@%system darwin
+@epm_full@f 0755 root root $pyexecdir/hpmudext.dylib .libs/hpmudext.dylib
+@epm_full@f 0755 root root $pyexecdir/pcardext.dylib .libs/pcardext.dylib
+@epm_scan@@epm_full@f 0755 root root $pyexecdir/scanext.dylib .libs/scanext.dylib
+@epm_full@%system !darwin
+@epm_full@f 0755 root root $pyexecdir/hpmudext.so .libs/hpmudext.so
+@epm_full@f 0755 root root $pyexecdir/pcardext.so .libs/pcardext.so
+@epm_scan@@epm_full@f 0755 root root $pyexecdir/scanext.so .libs/scanext.so
+@epm_full@%system all
+@epm_full@f 644 root root $icondir/hplip.desktop hplip.desktop
+@epm_full@f 644 root root $systraydir/hplip-systray.desktop hplip-systray.desktop
+@epm_full@f 0700 root root $cupsbackend/hpfax fax/backend/hpfax.py
+@epm_full@f 644 root root $ppd/HP fax/ppd/*.ppd.gz
+# /usr/share/hplip files
+@epm_full@f 755 root root $home/levels.py levels.py
+@epm_full@f 755 root root $home/toolbox.py toolbox.py
+@epm_full@f 755 root root $home/probe.py probe.py
+@epm_full@f 755 root root $home/faxsetup.py faxsetup.py
+@epm_full@f 755 root root $home/hpdio.py hpdio.py
+@epm_full@f 755 root root $home/linefeedcal.py linefeedcal.py
+@epm_full@f 755 root root $home/pqdiag.py pqdiag.py
+@epm_full@f 755 root root $home/printsettings.py printsettings.py
+@epm_full@f 755 root root $home/query.py query.py
+@epm_full@f 755 root root $home/__init__.py __init__.py
+@epm_full@d 775 root root $home/fax -
+@epm_full@f 644 root root $home/fax/__init__.py fax/__init__.py
+@epm_full@f 644 root root $home/fax/pmlfax.py fax/pmlfax.py
+@epm_full@f 644 root root $home/fax/soapfax.py fax/soapfax.py
+@epm_full@f 644 root root $home/fax/marvellfax.py fax/marvellfax.py
+@epm_full@f 644 root root $home/fax/coverpages.py fax/coverpages.py
+@epm_full@f 644 root root $home/fax/fax.py fax/fax.py
+@epm_full@f 644 root root $home/fax/faxdevice.py fax/faxdevice.py
+@epm_full@f 644 root root $home/fax/ledmfax.py fax/ledmfax.py
+@epm_full@f 644 root root $home/fax/ledmsoapfax.py fax/ledmsoapfax.py
+@epm_full@f 755 root root $home/fab.py fab.py
+@epm_full@f 755 root root $home/pkservice.py pkservice.py
+@epm_full@f 755 root root $home/hpssd.py hpssd.py
+@epm_full@d 775 root root $home/base -
+@epm_full@f 644 root root $home/base base/*.py
+@epm_full@f 644 root root $home/hpaio.desc scan/sane/hpaio.desc
+@epm_full@f 755 root root $home/align.py align.py
+@epm_full@f 755 root root $home/timedate.py timedate.py
+@epm_full@d 775 root root $home/copier -
+@epm_full@f 644 root root $home/copier/__init__.py copier/__init__.py
+@epm_full@f 644 root root $home/copier/copier.py copier/copier.py
+@epm_full@f 755 root root $home/makecopies.py makecopies.py
+@epm_full@f 755 root root $home/unload.py unload.py
+@epm_full@f 755 root root $home/scan.py scan.py
+@epm_full@f 755 root root $home/sendfax.py sendfax.py
+@epm_full@d 775 root root $home/data -
+@epm_full@d 775 root root $home/data/pcl -
+@epm_full@f 644 root root $home/data/pcl data/pcl/*.pcl.gz
+@epm_full@d 775 root root $home/data/ldl -
+@epm_full@f 644 root root $home/data/ldl data/ldl/*.ldl.gz
+@epm_full@d 775 root root $home/data/models -
+@epm_full@f 644 root root $home/data/models/models.dat data/models/models.dat
+@epm_full@d 775 root root $home/data/localization -
+@epm_full@f 644 root root $home/data/localization data/localization/*.qm
+@epm_full@d 775 root root $home/data/images -
+@epm_full@d 775 root root $home/data/images/other -
+@epm_full@f 644 root root $home/data/images/other data/images/other/*
+@epm_full@d 775 root root $home/data/images/16x16 -
+@epm_full@f 644 root root $home/data/images/16x16 data/images/16x16/*
+@epm_full@d 775 root root $home/data/images/24x24 -
+@epm_full@f 644 root root $home/data/images/24x24 data/images/24x24/*
+@epm_full@d 775 root root $home/data/images/devices -
+@epm_full@f 644 root root $home/data/images/devices data/images/devices/*
+@epm_full@d 775 root root $home/data/images/32x32 -
+@epm_full@f 644 root root $home/data/images/32x32 data/images/32x32/*
+@epm_full@d 775 root root $home/data/images/128x128 -
+@epm_full@f 644 root root $home/data/images/128x128 data/images/128x128/*
+@epm_full@d 775 root root $home/data/images/64x64 -
+@epm_full@f 644 root root $home/data/images/64x64 data/images/64x64/*
+@epm_full@d 775 root root $home/data/images/256x256 -
+@epm_full@f 644 root root $home/data/images/256x256 data/images/256x256/*
+@epm_full@d 775 root root $home/data/ps -
+@epm_full@f 644 root root $home/data/ps/clean_page.pdf.gz data/ps/clean_page.pdf.gz
+@epm_full@f 644 root root $home/data/ps/testpage.ps.gz data/ps/testpage.ps.gz
+@epm_full@f 755 root root $home/testpage.py testpage.py
+@epm_full@f 755 root root $home/systray.py systray.py
+@epm_full@f 755 root root $home/setup.py setup.py
+@epm_full@f 755 root root $home/makeuri.py makeuri.py
+@epm_full@d 775 root root $home/scan -
+@epm_full@f 644 root root $home/scan/__init__.py scan/__init__.py
+@epm_full@f 644 root root $home/scan/sane.py scan/sane.py
+@epm_full@f 755 root root $home/plugin.py plugin.py
+@epm_full@f 755 root root $home/check-plugin.py check-plugin.py
+@epm_full@f 755 root root $home/diagnose_plugin.py diagnose_plugin.py
+@epm_full@f 755 root root $home/print.py print.py
+@epm_full@f 755 root root $home/firmware.py firmware.py
+@epm_full@d 775 root root $home/plugins -
+@epm_full@f 644 root root $home/plugins/powersettings2.py plugins/powersettings2.py
+@epm_full@f 644 root root $home/plugins/__init__.py plugins/__init__.py
+@epm_full@f 644 root root $home/plugins/powersettingsdialog_base.py plugins/powersettingsdialog_base.py
+@epm_full@f 644 root root $home/plugins/Officejet_H470.py plugins/Officejet_H470.py
+@epm_full@f 644 root root $home/plugins/powersettingsdialog.py plugins/powersettingsdialog.py
+@epm_full@f 644 root root $home/plugins/Deskjet_460.py plugins/Deskjet_460.py
+@epm_full@f 644 root root $home/plugins/dj450.py plugins/dj450.py
+@epm_full@f 644 root root $home/plugins/powersettings.py plugins/powersettings.py
+@epm_full@d 775 root root $home/installer -
+@epm_full@f 644 root root $home/installer/distros.dat installer/distros.dat
+@epm_full@f 644 root root $home/installer/__init__.py installer/__init__.py
+@epm_full@f 644 root root $home/installer/dcheck.py installer/dcheck.py
+@epm_full@f 644 root root $home/installer/core_install.py installer/core_install.py
+@epm_full@f 755 root root $home/uninstall.py uninstall.py
+@epm_full@f 755 root root $home/upgrade.py upgrade.py
+@epm_full@f 755 root root $home/colorcal.py colorcal.py
+@epm_full@d 775 root root $home/prnt -
+@epm_full@f 644 root root $home/prnt/pcl.py prnt/pcl.py
+@epm_full@f 644 root root $home/prnt/__init__.py prnt/__init__.py
+@epm_full@f 644 root root $home/prnt/ldl.py prnt/ldl.py
+@epm_full@f 644 root root $home/prnt/colorcal.py prnt/colorcal.py
+@epm_full@f 755 root root $home/clean.py clean.py
+@epm_full@f 755 root root $home/check.py check.py
+@epm_full@d 775 root root $home/pcard -
+@epm_full@f 644 root root $home/pcard/__init__.py pcard/__init__.py
+@epm_full@f 644 root root $home/pcard/photocard.py pcard/photocard.py
+@epm_full@f 755 root root $home/info.py info.py
+@epm_full@f 755 root root $home/wificonfig.py wificonfig.py
+@epm_full@f 755 root root $home/devicesettings.py devicesettings.py
+@epm_full@f 755 root root $home/config_usb_printer.py config_usb_printer.py
+@epm_full@f 755 root root $home/diagnose_queues.py diagnose_queues.py
+
+# docs
+@epm_full@f 644 root root $docdir doc/*
+@epm_full@d 775 root root $docdir/images -
+@epm_full@f 644 root root $docdir/images doc/images/*
+@epm_full@d 775 root root $docdir/styles -
+@epm_full@f 644 root root $docdir/styles doc/styles/*
+# python commands
+@epm_full@l 755 root root $bindir/hp-toolbox ../share/hplip/toolbox.py
+@epm_full@l 755 root root $bindir/hp-colorcal ../share/hplip/colorcal.py
+@epm_full@l 755 root root $bindir/hp-sendfax ../share/hplip/sendfax.py
+@epm_full@l 755 root root $bindir/hp-clean ../share/hplip/clean.py
+@epm_full@l 755 root root $bindir/hp-testpage ../share/hplip/testpage.py
+@epm_full@l 755 root root $bindir/hp-systray ../share/hplip/systray.py
+@epm_full@l 755 root root $bindir/hp-firmware ../share/hplip/firmware.py
+@epm_full@l 755 root root $bindir/hp-makeuri ../share/hplip/makeuri.py
+@epm_full@l 755 root root $bindir/hp-fab ../share/hplip/fab.py
+@epm_full@l 755 root root $bindir/hp-pkservice ../share/hplip/pkservice.py
+@epm_full@l 755 root root $bindir/hp-align ../share/hplip/align.py
+@epm_full@l 755 root root $bindir/hp-print ../share/hplip/print.py
+@epm_full@l 755 root root $bindir/hp-setup ../share/hplip/setup.py
+@epm_full@l 755 root root $bindir/hp-levels ../share/hplip/levels.py
+@epm_full@l 755 root root $bindir/hp-unload ../share/hplip/unload.py
+@epm_full@l 755 root root $bindir/hp-probe ../share/hplip/probe.py
+@epm_full@l 755 root root $bindir/hp-timedate ../share/hplip/timedate.py
+@epm_full@l 755 root root $bindir/hp-plugin ../share/hplip/plugin.py
+@epm_full@l 755 root root $bindir/hp-check-plugin ../share/hplip/check-plugin.py
+@epm_full@l 755 root root $bindir/hp-diagnose_plugin ../share/hplip/diagnose_plugin.py
+@epm_full@l 755 root root $bindir/hp-check ../share/hplip/check.py
+@epm_full@l 755 root root $bindir/hp-info ../share/hplip/info.py
+@epm_full@l 755 root root $bindir/hp-makecopies ../share/hplip/makecopies.py
+@epm_full@l 755 root root $bindir/hp-scan ../share/hplip/scan.py
+@epm_full@l 755 root root $bindir/hp-faxsetup ../share/hplip/faxsetup.py
+@epm_full@l 755 root root $bindir/hp-linefeedcal ../share/hplip/linefeedcal.py
+@epm_full@l 755 root root $bindir/hp-printsettings ../share/hplip/printsettings.py
+@epm_full@l 755 root root $bindir/hp-query ../share/hplip/query.py
+@epm_full@l 755 root root $bindir/hp-wificonfig ../share/hplip/wificonfig.py
+@epm_full@l 755 root root $bindir/hp-devicesettings ../share/hplip/devicesettings.py
+@epm_full@l 755 root root $bindir/hp-uninstall ../share/hplip/uninstall.py
+@epm_full@l 755 root root $bindir/hp-upgrade ../share/hplip/upgrade.py
+@epm_full@l 755 root root $bindir/hp-config_usb_printer ../share/hplip/config_usb_printer.py
+@epm_full@l 755 root root $bindir/hp-diagnose_queues ../share/hplip/diagnose_queues.py
+
+# qt4
+@epm_full@@epm_qt4@d 775 root root $home/ui4 -
+@epm_full@@epm_qt4@f 644 root root $home/ui4 ui4/*.py
+
+# qt3
+@epm_full@@epm_qt3@d 775 root root $home/ui -
+@epm_full@@epm_qt3@f 644 root root $home/ui ui/*.py
+
+%if !SUSE9
+@epm_print_only_exclude@f 0700 root root $cupsbackend/hp .libs/hp
+@epm_print_only_exclude@f 0755 root root $bindir/hp-mkuri .libs/hp-mkuri
+%endif
+
+# Use LINPUS8 for Acer Aspire One
+%if LINPUS8 RHEL5
+@epm_print_only_exclude@f 0644 root root /etc/udev/rules.d/55-hpmud_pam.rules data/rules/55-hpmud_pam.rules
+%endif
+
+%if RHEL3
+f 0755 root root /etc/hotplug/usb/hpmud data/rules/hpmud
+l 0644 root root /usr/share/cups/model/foomatic-ppds $ppd/HP
+@epm_print_only_exclude@%postinstall <<EOF
+@epm_print_only_exclude@if [ -f /etc/hotplug/usb.usermap ]; then
+@epm_print_only_exclude@ grep -q ^hpmud /etc/hotplug/usb.usermap
+@epm_print_only_exclude@ if [ $$? -ne 0 ]; then
+@epm_print_only_exclude@ echo "hpmud 0x0001 0x03f0 0x0000 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000" >>/etc/hotplug/usb.usermap
+@epm_print_only_exclude@ fi
+@epm_print_only_exclude@fi
+@epm_print_only_exclude@EOF
+%endif
+
+%system !darwin
+%if !LINPUS8 !RHEL3 !UBUNTU804 !SUSE9 !RHEL5
+@epm_print_only_exclude@f 0644 root root /etc/udev/rules.d/55-hpmud.rules data/rules/55-hpmud.rules
+@epm_print_only_exclude@f 0644 root root /usr/share/hal/fdi/preprobe/10osvendor/20-hplip-devices.fdi data/rules/20-hplip-devices.fdi
+%endif
+%system all
+
+%if LINPUS8
+%requires PyQt
+%requires cupsddk-drivers
+%requires cupsddk-devel
+%provides hpijs $version
+%endif
+
+%if FEDORA9 RHEL5
+@epm_full@%requires PyQt
+@epm_full@%provides hpijs $version
+%endif
+
+%if FEDORA9
+@epm_lite@%provides hpijs $version
+%endif
+
+%if SUSE9
+l 0644 root root /usr/share/cups/model/foomatic-ppds $ppd/HP
+%postinstall <<EOF
+rm -f /usr/share/cups/model/HP/*.hpijs.ppd.gz
+rm -f /usr/share/cups/model/HP/*.Postscript.ppd.gz
+EOF
+%endif
+
+%if UBUNTU804
+@epm_full@%requires python-qt4
+@epm_full@%requires python-qt4-dbus
+@epm_full@%replaces foomatic-db-hpijs
+@epm_full@%replaces hpijs
+@epm_full@%replaces hplip
+@epm_full@%replaces hplip-data
+@epm_full@f 0644 root root /usr/share/hal/fdi/preprobe/10osvendor/20-hplip-devices.fdi data/rules/20-hplip-devices.fdi
+@epm_full@%postinstall <<EOF
+@epm_full@install -m 644 data/rules/55-hpmud.rules /etc/udev/rules.d
+@epm_full@EOF
+%endif
+
+%if UBUNTU804
+@epm_lite@%replaces foomatic-db-hpijs
+@epm_lite@%replaces hpijs
+@epm_lite@%replaces hplip
+@epm_lite@%replaces hplip-data
+@epm_lite@f 0644 root root /usr/share/hal/fdi/preprobe/10osvendor/20-hplip-devices.fdi data/rules/20-hplip-devices.fdi
+@epm_lite@%postinstall <<EOF
+@epm_lite@install -m 644 data/rules/55-hpmud.rules /etc/udev/rules.d
+@epm_lite@EOF
+%endif
+
+%if DEBIAN5
+@epm_full@%requires python-qt4
+@epm_full@%requires python-qt4-dbus
+@epm_full@%requires libc6
+@epm_full@%requires libcups2
+@epm_full@%requires cups-ddk
+@epm_full@%requires libdbus-1-3
+@epm_full@%requires libsane
+@epm_full@%requires libsnmp15
+@epm_full@%requires libusb-0.1-4
+@epm_full@%requires libgcc1
+@epm_full@%requires libjpeg62
+@epm_full@%requires libstdc++6
+@epm_full@%replaces foomatic-db-hpijs
+@epm_full@%replaces hpijs
+@epm_full@%replaces hplip
+@epm_full@%replaces hplip-data
+@epm_full@%replaces hplip-gui
+@epm_full@%postinstall <<EOF
+@epm_full@sed -i -e s/GROUP=\"lp\"/GROUP=\"scanner\"/ /etc/udev/rules.d/55-hpmud.rules
+@epm_full@EOF
+%endif
+
+%if DEBIAN5
+@epm_lite@%requires libc6
+@epm_lite@%requires libcups2
+@epm_lite@%requires cups-ddk
+@epm_lite@%requires libdbus-1-3
+@epm_lite@%requires libsane
+@epm_lite@%requires libsnmp15
+@epm_lite@%requires libusb-0.1-4
+@epm_lite@%requires libgcc1
+@epm_lite@%requires libjpeg62
+@epm_lite@%requires libstdc++6
+@epm_lite@%replaces foomatic-db-hpijs
+@epm_lite@%replaces hpijs
+@epm_lite@%replaces hplip
+@epm_lite@%replaces hplip-data
+@epm_lite@%postinstall <<EOF
+@epm_lite@sed -i -e s/GROUP=\"lp\"/GROUP=\"scanner\"/ /etc/udev/rules.d/55-hpmud.rules
+@epm_lite@EOF
+%endif
+
+%if PLUGIN
+f 0644 root root $docdir/license.txt prnt/plugins/license.txt
+f 0644 root root $docdir/COPYING prnt/plugins/license.txt
+f 0644 root root $docdir/copyright prnt/plugins/copyright
+d 0755 root root /var/lib/hp/ -
+f 0644 root root $home/data/firmware data/firmware/*.fw.gz
+d 0775 root root $home/data/plugin -
+d 0775 root lp /var/log/hp -
+
+#scan
+
+@epm_print_only_exclude@f 0644 root root $home/data/models/models.dat data/models/models.dat
+
+%system !darwin
+@epm_print_only_exclude@f 0644 root root /etc/udev/rules.d data/rules/86-hpmud*.rules
+@epm_print_only_exclude@f 0644 root root /etc/udev/rules.d data/rules/56-hpmud_add_printer.rules
+f 0755 root root $home/prnt/plugins/lj-${machine}.so prnt/plugins/lj-${machine}.so
+l 0755 root root $home/prnt/plugins/lj.so lj-${machine}.so
+@epm_print_only_exclude@d 0775 root root $home/scan/plugins -
+@epm_print_only_exclude@f 0755 root root $home/scan/plugins/bb_marvell-${machine}.so scan/sane/bb_marvell-${machine}.so
+@epm_print_only_exclude@l 0755 root root $home/scan/plugins/bb_marvell.so bb_marvell-${machine}.so
+@epm_print_only_exclude@f 0755 root root $home/scan/plugins/bb_soapht-${machine}.so scan/sane/bb_soapht-${machine}.so
+@epm_print_only_exclude@l 0755 root root $home/scan/plugins/bb_soapht.so bb_soapht-${machine}.so
+@epm_print_only_exclude@f 0755 root root $home/scan/plugins/bb_soap-${machine}.so scan/sane/bb_soap-${machine}.so
+@epm_print_only_exclude@l 0755 root root $home/scan/plugins/bb_soap.so bb_soap-${machine}.so
+@epm_print_only_exclude@f 0755 root root $home/fax/plugins/fax_marvell-${machine}.so fax/plugins/fax_marvell-${machine}.so
+@epm_print_only_exclude@l 0755 root root $home/fax/plugins/fax_marvell.so fax_marvell-${machine}.so
+
+
+%system all
+%postinstall <<EOF
+ver=`echo $version | sed 's/\([0-9]*.[0-9]*.[0-9]*\).*/\1/'`
+touch $home/data/plugin/hplip-$${ver}-plugin.run
+EOF
+%postremove <<EOF
+ver=`echo $version | sed 's/\([0-9]*.[0-9]*.[0-9]*\).*/\1/'`
+rm -f $home/data/plugin/hplip-$${ver}-plugin.run
+EOF
+%else
+f 0644 root root $docdir/COPYING COPYING
+f 0644 root root $docdir/copyright copyright
+d 0755 root root /var/lib/hp/ -
+d 0775 root lp /var/log/hp -
+%system !darwin
+@epm_print_only_exclude@f 0644 root root /etc/udev/rules.d/56-hpmud_support.rules data/rules/56-hpmud_support.rules
+@epm_print_only_exclude@f 0644 root root /etc/udev/rules.d/86-hpmud_plugin.rules data/rules/86-hpmud_plugin.rules
+@epm_print_only_exclude@f 0644 root root /etc/udev/rules.d/56-hpmud_add_printer.rules data/rules/56-hpmud_add_printer.rules
+
+%system all
+%endif
+#end PLUGIN
diff --git a/hplip.manifest b/hplip.manifest
new file mode 100644
index 0000000..f3ff7db
--- /dev/null
+++ b/hplip.manifest
@@ -0,0 +1,5 @@
+<manifest>
+ <request>
+ <domain name="cups"/>
+ </request>
+</manifest>
diff --git a/hpssd.py b/hpssd.py
new file mode 100755
index 0000000..0e5a005
--- /dev/null
+++ b/hpssd.py
@@ -0,0 +1,607 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2009 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+__version__ = '12.0'
+__title__ = "Services and Status System Tray dBus Child/Parent Process"
+__mod__ = 'hpssd'
+__doc__ = "Provides persistent data and event services to HPLIP client applications. Required to be running for PC send fax, optional in all other cases."
+
+
+# StdLib
+import sys
+import struct
+import os
+import time
+import getopt
+import select
+import signal
+import tempfile
+#import threading
+#import Queue
+from cPickle import loads, HIGHEST_PROTOCOL
+
+# Local
+from base.g import *
+from base.codes import *
+from base import utils, device, status, models, module
+from installer import core_install
+
+# dBus
+try:
+ from dbus import lowlevel, SystemBus, SessionBus
+ import dbus.service
+ from dbus.mainloop.glib import DBusGMainLoop
+ from gobject import MainLoop, timeout_add, threads_init, io_add_watch, IO_IN
+ dbus_loaded = True
+except ImportError:
+ log.error("dbus failed to load (python-dbus ver. 0.80+ required). Exiting...")
+ dbus_loaded = False
+ sys.exit(1)
+
+import warnings
+# Ignore: .../dbus/connection.py:242: DeprecationWarning: object.__init__() takes no parameters
+# (occurring on Python 2.6/dBus 0.83/Ubuntu 9.04)
+warnings.simplefilter("ignore", DeprecationWarning)
+
+
+# Globals
+PIPE_BUF = 4096
+dbus_loop, main_loop = None, None
+system_bus = None
+session_bus = None
+w1, w2, r3 = None, None, None
+devices = {} # { 'device_uri' : DeviceCache, ... }
+
+
+# ***********************************************************************************
+#
+# DEVICE CACHE
+#
+# ***********************************************************************************
+
+class DeviceCache(object):
+ def __init__(self, model=''):
+ self.history = utils.RingBuffer(prop.history_size) # circular buffer of device.Event
+ self.model = models.normalizeModelName(model)
+ self.cache = {} # variable name : value
+ self.faxes = {} # (username, jobid): FaxEvent
+ self.dq = {} # last device query results
+ #self.backoff = False
+ self.backoff_counter = 0 # polling backoff: 0 = none, x = backed off by x intervals
+ self.backoff_countdown = 0
+ self.polling = False # indicates whether its in the device polling list
+
+
+# dbus interface on session bus
+class StatusService(dbus.service.Object):
+ def __init__(self, name, object_path):
+ dbus.service.Object.__init__(self, name, object_path)
+
+
+ @dbus.service.method('com.hplip.StatusService', in_signature='s', out_signature='sa(ssisisd)')
+ def GetHistory(self, device_uri):
+ log.debug("GetHistory('%s')" % device_uri)
+ send_systray_blip()
+ try:
+ devices[device_uri]
+ except KeyError:
+ #log.warn("Unknown device URI: %s" % device_uri)
+ return (device_uri, [])
+ else:
+ h = devices[device_uri].history.get()
+ log.debug("%d events in history:" % len(h))
+ [x.debug() for x in h]
+ return (device_uri, [x.as_tuple() for x in h])
+
+
+ @dbus.service.method('com.hplip.StatusService', in_signature='s', out_signature='sa{ss}')
+ def GetStatus(self, device_uri):
+ log.debug("GetStatus('%s')" % device_uri)
+ send_systray_blip()
+ try:
+ devices[device_uri]
+ except KeyError:
+ #log.warn("Unknown device URI: %s" % device_uri)
+ return (device_uri, {})
+ else:
+ t = {}
+ dq = devices[device_uri].dq
+ [t.setdefault(x, str(dq[x])) for x in dq.keys()]
+ log.debug(t)
+ return (device_uri, t)
+
+
+ @dbus.service.method('com.hplip.StatusService', in_signature='ssi', out_signature='i')
+ def SetCachedIntValue(self, device_uri, key, value):
+ log.debug("SetCachedIntValue('%s', '%s', %d)" % (device_uri, key, value))
+ if check_device(device_uri) == ERROR_SUCCESS:
+ devices[device_uri].cache[key] = value
+ return value
+
+ return -1
+
+
+ @dbus.service.method('com.hplip.StatusService', in_signature='ss', out_signature='i')
+ def GetCachedIntValue(self, device_uri, key):
+ try:
+ ret = devices[device_uri].cache[key]
+ except KeyError:
+ ret = -1
+
+ log.debug("GetCachedIntValue('%s', '%s') --> %d" % (device_uri, key, ret))
+ return ret
+
+
+ @dbus.service.method('com.hplip.StatusService', in_signature='sss', out_signature='s')
+ def SetCachedStrValue(self, device_uri, key, value):
+ log.debug("SetCachedStrValue('%s', '%s', '%s')" % (device_uri, key, value))
+ if check_device(device_uri) == ERROR_SUCCESS:
+ devices[device_uri].cache[key] = value
+ return value
+
+ return ''
+
+
+ @dbus.service.method('com.hplip.StatusService', in_signature='ss', out_signature='s')
+ def GetCachedStrValue(self, device_uri, key):
+ try:
+ ret = devices[device_uri].cache[key]
+ except KeyError:
+ ret = ''
+
+ log.debug("GetCachedStrValue('%s', '%s') --> %s" % (device_uri, key, ret))
+ return ret
+
+
+ # Pass a non-zero job_id to retrieve a specific fax
+ # Pass zero for job_id to retrieve any avail. fax
+ @dbus.service.method('com.hplip.StatusService', in_signature='ssi', out_signature='ssisisds')
+ def CheckForWaitingFax(self, device_uri, username, job_id=0):
+ log.debug("CheckForWaitingFax('%s', '%s', %d)" % (device_uri, username, job_id))
+ send_systray_blip()
+ r = (device_uri, '', 0, username, job_id, '', 0.0, '')
+ check_device(device_uri)
+ show_waiting_faxes(device_uri)
+
+ if job_id: # check for specific job_id
+ try:
+ devices[device_uri].faxes[(username, job_id)]
+ except KeyError:
+ return r
+ else:
+ return self.check_for_waiting_fax_return(device_uri, username, job_id)
+
+ else: # return any matching one from cache. call mult. times to get all.
+ for u, j in devices[device_uri].faxes.keys():
+ if u == username:
+ return self.check_for_waiting_fax_return(device_uri, u, j)
+
+ return r
+
+
+ # if CheckForWaitingFax returns a fax job, that job is removed from the cache
+ def check_for_waiting_fax_return(self, d, u, j):
+ log.debug("Fax (username=%s, jobid=%d) removed from faxes and returned to caller." % (u, j))
+ r = devices[d].faxes[(u, j)].as_tuple()
+ del devices[d].faxes[(u, j)]
+ show_waiting_faxes(d)
+ return r
+
+
+ # Alternate way to "send" an event rather than using a signal message
+ @dbus.service.method('com.hplip.StatusService', in_signature='ssisis', out_signature='')
+ def SendEvent(self, device_uri, printer_name, event_code, username, job_id, title):
+ event = device.Event(device_uri, printer_name, event_code, username, job_id, title)
+ handle_event(event)
+
+
+
+def check_device(device_uri):
+ try:
+ devices[device_uri]
+ except KeyError:
+ log.debug("New device: %s" % device_uri)
+ try:
+ back_end, is_hp, bus, model, serial, dev_file, host, zc, port = \
+ device.parseDeviceURI(device_uri)
+ except Error:
+ log.debug("Invalid device URI: %s" % device_uri)
+ return ERROR_INVALID_DEVICE_URI
+
+ devices[device_uri] = DeviceCache(model)
+
+ return ERROR_SUCCESS
+
+
+def create_history(event):
+ history = devices[event.device_uri].history.get()
+
+ if history and history[-1].event_code == event.event_code:
+ log.debug("Duplicate event. Replacing previous event.")
+ devices[event.device_uri].history.replace(event)
+ return True
+ else:
+ devices[event.device_uri].history.append(event)
+ return False
+
+
+
+def handle_fax_event(event, pipe_name):
+ if event.event_code == EVENT_FAX_RENDER_COMPLETE and \
+ event.username == prop.username:
+
+ fax_file_fd, fax_file_name = tempfile.mkstemp(prefix="hpfax-")
+ pipe = os.open(pipe_name, os.O_RDONLY)
+ bytes_read = 0
+ while True:
+ data = os.read(pipe, PIPE_BUF)
+ if not data:
+ break
+
+ os.write(fax_file_fd, data)
+ bytes_read += len(data)
+
+ log.debug("Saved %d bytes to file %s" % (bytes_read, fax_file_name))
+
+ os.close(pipe)
+ os.close(fax_file_fd)
+
+ devices[event.device_uri].faxes[(event.username, event.job_id)] = \
+ device.FaxEvent(fax_file_name, event)
+
+ show_waiting_faxes(event.device_uri)
+
+ try:
+ os.waitpid(-1, os.WNOHANG)
+ except OSError:
+ pass
+
+ # See if hp-sendfax is already running for this queue
+ ok, lock_file = utils.lock_app('hp-sendfax-%s' % event.printer_name, True)
+
+ if ok:
+ # able to lock, not running...
+ utils.unlock(lock_file)
+
+ path = utils.which('hp-sendfax')
+ if path:
+ path = os.path.join(path, 'hp-sendfax')
+ else:
+ log.error("Unable to find hp-sendfax on PATH.")
+ return
+
+ log.debug("Running hp-sendfax: %s --printer=%s" % (path, event.printer_name))
+ os.spawnlp(os.P_NOWAIT, path, 'hp-sendfax',
+ '--printer=%s' % event.printer_name)
+
+ else:
+ # cannot lock file - hp-sendfax is running
+ # no need to do anything... hp-sendfax is polling
+ log.debug("hp-sendfax is running. Waiting for CheckForWaitingFax() call.")
+
+ else:
+ log.warn("Not handled!")
+ pass
+
+
+def show_waiting_faxes(d):
+ f = devices[d].faxes
+
+ if not len(f):
+ log.debug("No faxes waiting for %s" % d)
+ else:
+ if len(f) == 1:
+ log.debug("1 fax waiting for %s:" % d)
+ else:
+ log.debug("%d faxes waiting for %s:" % (len(f), d))
+
+ [f[x].debug() for x in f]
+
+
+# Qt4 only
+def handle_hpdio_event(event, bytes_written):
+ log.debug("Reading %d bytes from hpdio pipe..." % bytes_written)
+ total_read, data = 0, ''
+
+ while True:
+ r, w, e = select.select([r3], [], [r3], 0.0)
+ if not r: break
+
+ x = os.read(r3, PIPE_BUF)
+ if not x: break
+
+ data = ''.join([data, x])
+ total_read += len(x)
+
+ if total_read == bytes_written: break
+
+ log.debug("Read %d bytes" % total_read)
+
+ if total_read == bytes_written:
+ dq = loads(data)
+
+ if check_device(event.device_uri) == ERROR_SUCCESS:
+ devices[event.device_uri].dq = dq.copy()
+
+ handle_event(device.Event(event.device_uri, '',
+ dq.get('status-code', STATUS_PRINTER_IDLE), prop.username, 0, ''))
+
+ send_toolbox_event(event, EVENT_DEVICE_UPDATE_REPLY)
+
+def handle_plugin_install():
+
+ child_process=os.fork()
+ if child_process== 0: # child process
+ lockObj = utils.Sync_Lock("/tmp/pluginInstall.tmp")
+ lockObj.acquire()
+ child_pid=os.getpid()
+ core = core_install.CoreInstall()
+ core.set_plugin_version()
+ if core.check_for_plugin() != PLUGIN_INSTALLED:
+ sts,out = utils.run('hp-diagnose_plugin',True, None, 1, False)
+ if sts != 0:
+ log.error("Failed to load hp-diagnose_plugin")
+ #TBD FailureUI needs to add
+ else:
+ log.debug("Device Plug-in was already installed. Not Invoking Plug-in installation wizard")
+
+ lockObj.release()
+ os.kill(child_pid,signal.SIGKILL)
+ else: #parent process
+ log.debug("Started Plug-in installation wizard")
+
+
+def handle_printer_diagnose():
+ path = utils.which('hp-diagnose_queues')
+ if path:
+ path = os.path.join(path, 'hp-diagnose_queues')
+ else:
+ log.error("Unable to find hp-diagnose_queues on PATH.")
+ return
+
+ log.debug("Running hp-diagnose_queues: %s" % (path))
+ os.spawnlp(os.P_NOWAIT, path, 'hp-diagnose_queues','-s')
+
+
+def handle_event(event, more_args=None):
+ #global polling_blocked
+ #global request_queue
+
+ # checking if any zombie child process exists. then cleaning same.
+ try:
+ os.waitpid(0, os.WNOHANG)
+ except OSError:
+ pass
+
+ log.debug("Handling event...")
+
+ if more_args is None:
+ more_args = []
+
+ event.debug()
+
+ if event.event_code == EVENT_AUTO_CONFIGURE:
+ handle_plugin_install()
+ return
+
+ if event.event_code == EVENT_DIAGNOSE_PRINTQUEUE:
+ handle_printer_diagnose()
+ return
+
+ if event.device_uri and check_device(event.device_uri) != ERROR_SUCCESS:
+ return
+
+ # If event-code > 10001, its a PJL error code, so convert it
+ if event.event_code > EVENT_MAX_EVENT:
+ event.event_code = status.MapPJLErrorCode(event.event_code)
+
+ # regular user/device status event
+ if event.event_code < EVENT_MIN_USER_EVENT:
+ pass
+
+ elif EVENT_MIN_USER_EVENT <= event.event_code <= EVENT_MAX_USER_EVENT:
+
+ if event.device_uri:
+ #event.device_uri = event.device_uri.replace('hpfax:', 'hp:')
+ dup_event = create_history(event)
+
+ if event.event_code in (EVENT_DEVICE_STOP_POLLING,
+ EVENT_START_MAINT_JOB,
+ EVENT_START_COPY_JOB,
+ EVENT_START_FAX_JOB,
+ EVENT_START_PRINT_JOB):
+ pass # stop polling (increment counter)
+
+ elif event.event_code in (EVENT_DEVICE_START_POLLING, # should this event force counter to 0?
+ EVENT_END_MAINT_JOB,
+ EVENT_END_COPY_JOB,
+ EVENT_END_FAX_JOB,
+ EVENT_END_PRINT_JOB,
+ EVENT_PRINT_FAILED_MISSING_PLUGIN,
+ EVENT_SCANNER_FAIL,
+ EVENT_END_SCAN_JOB,
+ EVENT_SCAN_FAILED_MISSING_PLUGIN,
+ EVENT_FAX_JOB_FAIL,
+ EVENT_FAX_JOB_CANCELED,
+ EVENT_FAX_FAILED_MISSING_PLUGIN,
+ EVENT_COPY_JOB_FAIL,
+ EVENT_COPY_JOB_CANCELED):
+ pass # start polling if counter <= 0
+ # TODO: Do tools send END event if canceled or failed? Should they?
+ # TODO: What to do if counter doesn't hit 0 after a period? Timeout?
+ # TODO: Also, need to deal with the backoff setting (or it completely sep?)
+
+ # Send to system tray icon if available
+ if not dup_event: # and event.event_code != STATUS_PRINTER_IDLE:
+ send_event_to_systray_ui(event)
+
+ # send EVENT_HISTORY_UPDATE signal to hp-toolbox
+ send_toolbox_event(event, EVENT_HISTORY_UPDATE)
+
+ if event.event_code in (EVENT_PRINT_FAILED_MISSING_PLUGIN, EVENT_SCAN_FAILED_MISSING_PLUGIN,EVENT_FAX_FAILED_MISSING_PLUGIN):
+ handle_plugin_install()
+
+ # Handle fax signals
+ elif EVENT_FAX_MIN <= event.event_code <= EVENT_FAX_MAX and more_args:
+ log.debug("Fax event")
+ pipe_name = str(more_args[0])
+ handle_fax_event(event, pipe_name)
+
+ elif event.event_code == EVENT_USER_CONFIGURATION_CHANGED:
+ # Sent if polling, hiding, etc. configuration has changed
+ # send_event_to_hpdio(event)
+ send_event_to_systray_ui(event)
+
+ elif event.event_code == EVENT_SYS_CONFIGURATION_CHANGED: # Not implemented
+ #send_event_to_hpdio(event)
+ send_event_to_systray_ui(event)
+
+ # Qt4 only
+ elif event.event_code in (EVENT_DEVICE_UPDATE_REQUESTED,):
+ #EVENT_DEVICE_START_POLLING, # ? Who handles polling? hpssd? probably...
+ #EVENT_DEVICE_STOP_POLLING): # ?
+ send_event_to_hpdio(event)
+
+ # Qt4 only
+ elif event.event_code in (EVENT_DEVICE_UPDATE_ACTIVE,
+ EVENT_DEVICE_UPDATE_INACTIVE):
+ send_event_to_systray_ui(event)
+
+ # Qt4 only
+ elif event.event_code == EVENT_DEVICE_UPDATE_REPLY:
+ bytes_written = int(more_args[1])
+ handle_hpdio_event(event, bytes_written)
+
+ # Qt4 only
+ elif event.event_code == EVENT_SYSTEMTRAY_EXIT:
+ send_event_to_hpdio(event)
+ send_toolbox_event(event)
+ send_event_to_systray_ui(event)
+ log.debug("Exiting")
+ main_loop.quit()
+
+ elif event.event_code in (EVENT_DEVICE_START_POLLING,
+ EVENT_DEVICE_STOP_POLLING):
+ pass
+
+ else:
+ log.error("Unhandled event: %d" % event.event_code)
+
+
+
+def send_systray_blip():
+ send_event_to_systray_ui(device.Event('', '', EVENT_DEVICE_UPDATE_BLIP))
+
+
+def send_event_to_systray_ui(event, event_code=None):
+ e = event.copy()
+
+ if event_code is not None:
+ e.event_code = event_code
+
+ e.send_via_pipe(w1, 'systemtray')
+
+
+def send_event_to_hpdio(event):
+ event.send_via_pipe(w2, 'hpdio')
+
+
+def send_toolbox_event(event, event_code=None):
+ global session_bus
+
+ e = event.copy()
+
+ if event_code is not None:
+ e.event_code = event_code
+
+ e.send_via_dbus(session_bus, 'com.hplip.Toolbox')
+
+
+
+def handle_signal(typ, *args, **kwds):
+ if kwds['interface'] == 'com.hplip.StatusService' and \
+ kwds['member'] == 'Event':
+
+ event = device.Event(*args[:6])
+ return handle_event(event, args[6:])
+
+
+def handle_system_signal(*args, **kwds):
+ return handle_signal('system', *args, **kwds)
+
+
+def handle_session_signal(*args, **kwds):
+ return handle_signal('session', *args, **kwds)
+
+
+
+def run(write_pipe1=None, # write pipe to systemtray
+ write_pipe2=None, # write pipe to hpdio
+ read_pipe3=None): # read pipe from hpdio
+
+ global dbus_loop, main_loop
+ global system_bus, session_bus
+ global w1, w2, r3
+
+ log.set_module("hp-systray(hpssd)")
+ log.debug("PID=%d" % os.getpid())
+ w1, w2, r3 = write_pipe1, write_pipe2, read_pipe3
+
+ dbus_loop = DBusGMainLoop(set_as_default=True)
+ main_loop = MainLoop()
+
+ try:
+ system_bus = SystemBus(mainloop=dbus_loop)
+ except dbus.exceptions.DBusException, e:
+ log.error("Unable to connect to dbus system bus. Exiting.")
+ sys.exit(1)
+
+ try:
+ session_bus = dbus.SessionBus()
+ except dbus.exceptions.DBusException, e:
+ if os.getuid() != 0:
+ log.error("Unable to connect to dbus session bus. Exiting.")
+ sys.exit(1)
+ else:
+ log.error("Unable to connect to dbus session bus (running as root?)")
+ sys.exit(1)
+
+ # Receive events from the system bus
+ system_bus.add_signal_receiver(handle_system_signal, sender_keyword='sender',
+ destination_keyword='dest', interface_keyword='interface',
+ member_keyword='member', path_keyword='path')
+
+ # Receive events from the session bus
+ session_bus.add_signal_receiver(handle_session_signal, sender_keyword='sender',
+ destination_keyword='dest', interface_keyword='interface',
+ member_keyword='member', path_keyword='path')
+
+ # Export an object on the session bus
+ session_name = dbus.service.BusName("com.hplip.StatusService", session_bus)
+ status_service = StatusService(session_name, "/com/hplip/StatusService")
+
+ log.debug("Entering main dbus loop...")
+ try:
+ main_loop.run()
+ except KeyboardInterrupt:
+ log.debug("Ctrl-C: Exiting...")
+
diff --git a/info.py b/info.py
new file mode 100755
index 0000000..cda5860
--- /dev/null
+++ b/info.py
@@ -0,0 +1,186 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2009 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+__version__ = '5.2'
+__title__ = 'Device Information Utility'
+__mod__ = 'hp-info'
+__doc__ = "Query a printer for static model information, dynamic status information, and CUPS printer queue settings."
+
+# Std Lib
+import sys
+import getopt
+import time
+import os
+
+# Local
+from base.g import *
+from base import device, status, utils, tui, module
+from prnt import cups
+
+try:
+ restrict = True
+
+ devid_mode = '--id' in sys.argv # hack
+ if devid_mode:
+ log.set_level("none")
+ restrict = False
+
+ mod = module.Module(__mod__, __title__, __version__, __doc__, None,
+ (INTERACTIVE_MODE, GUI_MODE), (UI_TOOLKIT_QT4,),
+ False, devid_mode)
+
+ mod.setUsage(module.USAGE_FLAG_DEVICE_ARGS,
+ extra_options=[("Device ID mode:", "--id (prints device ID only and exits.) (interactive (-i) mode only.)", "option", False),
+ ("Allow device URIs of uninstalled printers:", "-x (interactive (-i) mode only.)", "option", False)
+ ],
+ see_also_list=['hp-toolbox'])
+
+ opts, device_uri, printer_name, mode, ui_toolkit, lang = \
+ mod.parseStdOpts('x', ['id'])
+
+
+
+ for o, a in opts:
+ if o == '-x':
+ restrict = False
+
+ if devid_mode:
+ mode = NON_INTERACTIVE_MODE
+
+ if mode == GUI_MODE:
+ if not utils.canEnterGUIMode4():
+ log.error("%s -u/--gui requires Qt4 GUI support. Entering interactive mode." % __mod__)
+ mode = INTERACTIVE_MODE
+
+ if mode == GUI_MODE:
+ restrict = True
+
+ device_uri = mod.getDeviceUri(device_uri, printer_name, restrict_to_installed_devices=restrict)
+
+ if mode in (INTERACTIVE_MODE, NON_INTERACTIVE_MODE):
+ try:
+ d = device.Device(device_uri, printer_name)
+ except Error:
+ log.error("Unexpected error. Exiting.")
+ sys.exit(1)
+
+ if not devid_mode:
+ log.info("")
+ log.info(log.bold(d.device_uri))
+ log.info("")
+
+ try:
+ try:
+ d.open()
+ d.queryDevice()
+ except Error, e:
+ log.error("Error opening device (%s)." % e.msg)
+ #sys.exit(1)
+
+ if not devid_mode:
+ formatter = utils.TextFormatter(
+ (
+ {'width': 28, 'margin' : 2},
+ {'width': 58, 'margin' : 2},
+ )
+ )
+
+ if devid_mode:
+ try:
+ if d.dq['deviceid']:
+ print(d.dq['deviceid'])
+ sys.exit(0)
+ except KeyError:
+ log.error("Device ID not available.")
+ else:
+ dq_keys = d.dq.keys()
+ dq_keys.sort()
+
+ log.info(log.bold("Device Parameters (dynamic data):"))
+ log.info(log.bold(formatter.compose(("Parameter", "Value(s)"))))
+ log.info(formatter.compose(('-'*28, '-'*58)))
+
+ for key in dq_keys:
+ log.info(formatter.compose((key, str(d.dq[key]))))
+
+ log.info(log.bold("\nModel Parameters (static data):"))
+ log.info(log.bold(formatter.compose(("Parameter", "Value(s)"))))
+ log.info(formatter.compose(('-'*28, '-'*58)))
+
+ mq_keys = d.mq.keys()
+ mq_keys.sort()
+
+ for key in mq_keys:
+ log.info(formatter.compose((key, str(d.mq[key]))))
+
+ if d.dbus_avail:
+ formatter = utils.TextFormatter(
+ (
+ {'width': 20, 'margin' : 2}, # date/time
+ {'width': 5, 'margin' : 2}, # code
+ {'width': 40, 'margin' : 2}, # desc
+ {'width': 8, 'margin' : 2}, # user
+ {'width': 8, 'margin' : 2}, # job id
+ )
+ )
+
+ log.info(log.bold("\nStatus History (most recent first):"))
+ log.info(log.bold(formatter.compose(("Date/Time", "Code", "Status Description", "User", "Job ID"))))
+ log.info(formatter.compose(('-'*20, '-'*5, '-'*40, '-'*8, '-'*8)))
+
+ hq = d.queryHistory()
+
+ for h in hq:
+ desc = device.queryString(h.event_code)
+ log.info(formatter.compose((time.strftime("%x %H:%M:%S", time.localtime(h.timedate)),
+ str(h.event_code), desc, h.username, str(h.job_id))))
+
+ log.info("")
+ finally:
+ d.close()
+
+ else: # GUI mode
+ try:
+ from PyQt4.QtGui import QApplication
+ from ui4.infodialog import InfoDialog
+ except ImportError:
+ log.error("Unable to load Qt4 support. Is it installed?")
+ sys.exit(1)
+
+ if 1:
+ app = QApplication(sys.argv)
+
+ dlg = InfoDialog(None, device_uri)
+ dlg.show()
+ try:
+ log.debug("Starting GUI loop...")
+ app.exec_()
+ except KeyboardInterrupt:
+ sys.exit(0)
+
+
+except KeyboardInterrupt:
+ log.error("User exit")
+
+log.info("")
+log.info("Done.")
+
diff --git a/init-iptables-firewall b/init-iptables-firewall
new file mode 100644
index 0000000..a7f246d
--- /dev/null
+++ b/init-iptables-firewall
@@ -0,0 +1,17 @@
+#! /bin/bash
+
+conffile="/etc/sysconfig/iptables"
+
+iptables -L | egrep -q '427|svrloc'
+if [ $? -ne 0 ]; then
+ iptables -I INPUT 4 -p udp --sport 427 -j ACCEPT
+ iptables-save >$conffile
+fi
+
+iptables -L | egrep -q '5353|mdns'
+if [ $? -ne 0 ]; then
+ iptables -I INPUT 4 -p udp --sport 5353 -j ACCEPT
+ iptables-save >$conffile
+fi
+
+exit 0
diff --git a/init-suse-firewall b/init-suse-firewall
new file mode 100755
index 0000000..3615e98
--- /dev/null
+++ b/init-suse-firewall
@@ -0,0 +1,18 @@
+#! /bin/bash
+
+conffile="/etc/sysconfig/SuSEfirewall2"
+
+grep ^FW_SERVICES_ACCEPT_EXT $conffile | grep -q "0/0,udp,,5353"
+if [ $? -ne 0 ]; then
+ sed -i 's/^FW_SERVICES_ACCEPT_EXT="\(.*\)"/FW_SERVICES_ACCEPT_EXT="0\/0,udp,,5353 \1"/' $conffile
+fi
+
+grep ^FW_SERVICES_ACCEPT_EXT $conffile | grep -q "0/0,udp,,427"
+if [ $? -ne 0 ]; then
+ sed -i 's/^FW_SERVICES_ACCEPT_EXT="\(.*\)"/FW_SERVICES_ACCEPT_EXT="0\/0,udp,,427 \1"/' $conffile
+fi
+
+sh /etc/init.d/SuSEfirewall2_init restart
+sh /etc/init.d/SuSEfirewall2_setup restart
+
+exit 0
diff --git a/install-sh b/install-sh
new file mode 100755
index 0000000..6781b98
--- /dev/null
+++ b/install-sh
@@ -0,0 +1,520 @@
+#!/bin/sh
+# install - install a program, script, or datafile
+
+scriptversion=2009-04-28.21; # UTC
+
+# This originates from X11R5 (mit/util/scripts/install.sh), which was
+# later released in X11R6 (xc/config/util/install.sh) with the
+# following copyright and license.
+#
+# Copyright (C) 1994 X Consortium
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to
+# deal in the Software without restriction, including without limitation the
+# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+# sell copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
+# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+# Except as contained in this notice, the name of the X Consortium shall not
+# be used in advertising or otherwise to promote the sale, use or other deal-
+# ings in this Software without prior written authorization from the X Consor-
+# tium.
+#
+#
+# FSF changes to this file are in the public domain.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# `make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch.
+
+nl='
+'
+IFS=" "" $nl"
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit=${DOITPROG-}
+if test -z "$doit"; then
+ doit_exec=exec
+else
+ doit_exec=$doit
+fi
+
+# Put in absolute file names if you don't have them in your path;
+# or use environment vars.
+
+chgrpprog=${CHGRPPROG-chgrp}
+chmodprog=${CHMODPROG-chmod}
+chownprog=${CHOWNPROG-chown}
+cmpprog=${CMPPROG-cmp}
+cpprog=${CPPROG-cp}
+mkdirprog=${MKDIRPROG-mkdir}
+mvprog=${MVPROG-mv}
+rmprog=${RMPROG-rm}
+stripprog=${STRIPPROG-strip}
+
+posix_glob='?'
+initialize_posix_glob='
+ test "$posix_glob" != "?" || {
+ if (set -f) 2>/dev/null; then
+ posix_glob=
+ else
+ posix_glob=:
+ fi
+ }
+'
+
+posix_mkdir=
+
+# Desired mode of installed file.
+mode=0755
+
+chgrpcmd=
+chmodcmd=$chmodprog
+chowncmd=
+mvcmd=$mvprog
+rmcmd="$rmprog -f"
+stripcmd=
+
+src=
+dst=
+dir_arg=
+dst_arg=
+
+copy_on_change=false
+no_target_directory=
+
+usage="\
+Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
+ or: $0 [OPTION]... SRCFILES... DIRECTORY
+ or: $0 [OPTION]... -t DIRECTORY SRCFILES...
+ or: $0 [OPTION]... -d DIRECTORIES...
+
+In the 1st form, copy SRCFILE to DSTFILE.
+In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
+In the 4th, create DIRECTORIES.
+
+Options:
+ --help display this help and exit.
+ --version display version info and exit.
+
+ -c (ignored)
+ -C install only if different (preserve the last data modification time)
+ -d create directories instead of installing files.
+ -g GROUP $chgrpprog installed files to GROUP.
+ -m MODE $chmodprog installed files to MODE.
+ -o USER $chownprog installed files to USER.
+ -s $stripprog installed files.
+ -t DIRECTORY install into DIRECTORY.
+ -T report an error if DSTFILE is a directory.
+
+Environment variables override the default commands:
+ CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
+ RMPROG STRIPPROG
+"
+
+while test $# -ne 0; do
+ case $1 in
+ -c) ;;
+
+ -C) copy_on_change=true;;
+
+ -d) dir_arg=true;;
+
+ -g) chgrpcmd="$chgrpprog $2"
+ shift;;
+
+ --help) echo "$usage"; exit $?;;
+
+ -m) mode=$2
+ case $mode in
+ *' '* | *' '* | *'
+'* | *'*'* | *'?'* | *'['*)
+ echo "$0: invalid mode: $mode" >&2
+ exit 1;;
+ esac
+ shift;;
+
+ -o) chowncmd="$chownprog $2"
+ shift;;
+
+ -s) stripcmd=$stripprog;;
+
+ -t) dst_arg=$2
+ shift;;
+
+ -T) no_target_directory=true;;
+
+ --version) echo "$0 $scriptversion"; exit $?;;
+
+ --) shift
+ break;;
+
+ -*) echo "$0: invalid option: $1" >&2
+ exit 1;;
+
+ *) break;;
+ esac
+ shift
+done
+
+if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
+ # When -d is used, all remaining arguments are directories to create.
+ # When -t is used, the destination is already specified.
+ # Otherwise, the last argument is the destination. Remove it from $@.
+ for arg
+ do
+ if test -n "$dst_arg"; then
+ # $@ is not empty: it contains at least $arg.
+ set fnord "$@" "$dst_arg"
+ shift # fnord
+ fi
+ shift # arg
+ dst_arg=$arg
+ done
+fi
+
+if test $# -eq 0; then
+ if test -z "$dir_arg"; then
+ echo "$0: no input file specified." >&2
+ exit 1
+ fi
+ # It's OK to call `install-sh -d' without argument.
+ # This can happen when creating conditional directories.
+ exit 0
+fi
+
+if test -z "$dir_arg"; then
+ trap '(exit $?); exit' 1 2 13 15
+
+ # Set umask so as not to create temps with too-generous modes.
+ # However, 'strip' requires both read and write access to temps.
+ case $mode in
+ # Optimize common cases.
+ *644) cp_umask=133;;
+ *755) cp_umask=22;;
+
+ *[0-7])
+ if test -z "$stripcmd"; then
+ u_plus_rw=
+ else
+ u_plus_rw='% 200'
+ fi
+ cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
+ *)
+ if test -z "$stripcmd"; then
+ u_plus_rw=
+ else
+ u_plus_rw=,u+rw
+ fi
+ cp_umask=$mode$u_plus_rw;;
+ esac
+fi
+
+for src
+do
+ # Protect names starting with `-'.
+ case $src in
+ -*) src=./$src;;
+ esac
+
+ if test -n "$dir_arg"; then
+ dst=$src
+ dstdir=$dst
+ test -d "$dstdir"
+ dstdir_status=$?
+ else
+
+ # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
+ # might cause directories to be created, which would be especially bad
+ # if $src (and thus $dsttmp) contains '*'.
+ if test ! -f "$src" && test ! -d "$src"; then
+ echo "$0: $src does not exist." >&2
+ exit 1
+ fi
+
+ if test -z "$dst_arg"; then
+ echo "$0: no destination specified." >&2
+ exit 1
+ fi
+
+ dst=$dst_arg
+ # Protect names starting with `-'.
+ case $dst in
+ -*) dst=./$dst;;
+ esac
+
+ # If destination is a directory, append the input filename; won't work
+ # if double slashes aren't ignored.
+ if test -d "$dst"; then
+ if test -n "$no_target_directory"; then
+ echo "$0: $dst_arg: Is a directory" >&2
+ exit 1
+ fi
+ dstdir=$dst
+ dst=$dstdir/`basename "$src"`
+ dstdir_status=0
+ else
+ # Prefer dirname, but fall back on a substitute if dirname fails.
+ dstdir=`
+ (dirname "$dst") 2>/dev/null ||
+ expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$dst" : 'X\(//\)[^/]' \| \
+ X"$dst" : 'X\(//\)$' \| \
+ X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
+ echo X"$dst" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'
+ `
+
+ test -d "$dstdir"
+ dstdir_status=$?
+ fi
+ fi
+
+ obsolete_mkdir_used=false
+
+ if test $dstdir_status != 0; then
+ case $posix_mkdir in
+ '')
+ # Create intermediate dirs using mode 755 as modified by the umask.
+ # This is like FreeBSD 'install' as of 1997-10-28.
+ umask=`umask`
+ case $stripcmd.$umask in
+ # Optimize common cases.
+ *[2367][2367]) mkdir_umask=$umask;;
+ .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
+
+ *[0-7])
+ mkdir_umask=`expr $umask + 22 \
+ - $umask % 100 % 40 + $umask % 20 \
+ - $umask % 10 % 4 + $umask % 2
+ `;;
+ *) mkdir_umask=$umask,go-w;;
+ esac
+
+ # With -d, create the new directory with the user-specified mode.
+ # Otherwise, rely on $mkdir_umask.
+ if test -n "$dir_arg"; then
+ mkdir_mode=-m$mode
+ else
+ mkdir_mode=
+ fi
+
+ posix_mkdir=false
+ case $umask in
+ *[123567][0-7][0-7])
+ # POSIX mkdir -p sets u+wx bits regardless of umask, which
+ # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
+ ;;
+ *)
+ tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
+ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
+
+ if (umask $mkdir_umask &&
+ exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
+ then
+ if test -z "$dir_arg" || {
+ # Check for POSIX incompatibilities with -m.
+ # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
+ # other-writeable bit of parent directory when it shouldn't.
+ # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
+ ls_ld_tmpdir=`ls -ld "$tmpdir"`
+ case $ls_ld_tmpdir in
+ d????-?r-*) different_mode=700;;
+ d????-?--*) different_mode=755;;
+ *) false;;
+ esac &&
+ $mkdirprog -m$different_mode -p -- "$tmpdir" && {
+ ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
+ test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
+ }
+ }
+ then posix_mkdir=:
+ fi
+ rmdir "$tmpdir/d" "$tmpdir"
+ else
+ # Remove any dirs left behind by ancient mkdir implementations.
+ rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
+ fi
+ trap '' 0;;
+ esac;;
+ esac
+
+ if
+ $posix_mkdir && (
+ umask $mkdir_umask &&
+ $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
+ )
+ then :
+ else
+
+ # The umask is ridiculous, or mkdir does not conform to POSIX,
+ # or it failed possibly due to a race condition. Create the
+ # directory the slow way, step by step, checking for races as we go.
+
+ case $dstdir in
+ /*) prefix='/';;
+ -*) prefix='./';;
+ *) prefix='';;
+ esac
+
+ eval "$initialize_posix_glob"
+
+ oIFS=$IFS
+ IFS=/
+ $posix_glob set -f
+ set fnord $dstdir
+ shift
+ $posix_glob set +f
+ IFS=$oIFS
+
+ prefixes=
+
+ for d
+ do
+ test -z "$d" && continue
+
+ prefix=$prefix$d
+ if test -d "$prefix"; then
+ prefixes=
+ else
+ if $posix_mkdir; then
+ (umask=$mkdir_umask &&
+ $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
+ # Don't fail if two instances are running concurrently.
+ test -d "$prefix" || exit 1
+ else
+ case $prefix in
+ *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
+ *) qprefix=$prefix;;
+ esac
+ prefixes="$prefixes '$qprefix'"
+ fi
+ fi
+ prefix=$prefix/
+ done
+
+ if test -n "$prefixes"; then
+ # Don't fail if two instances are running concurrently.
+ (umask $mkdir_umask &&
+ eval "\$doit_exec \$mkdirprog $prefixes") ||
+ test -d "$dstdir" || exit 1
+ obsolete_mkdir_used=true
+ fi
+ fi
+ fi
+
+ if test -n "$dir_arg"; then
+ { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
+ { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
+ { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
+ test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
+ else
+
+ # Make a couple of temp file names in the proper directory.
+ dsttmp=$dstdir/_inst.$$_
+ rmtmp=$dstdir/_rm.$$_
+
+ # Trap to clean up those temp files at exit.
+ trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
+
+ # Copy the file name to the temp name.
+ (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
+
+ # and set any options; do chmod last to preserve setuid bits.
+ #
+ # If any of these fail, we abort the whole thing. If we want to
+ # ignore errors from any of these, just make sure not to ignore
+ # errors from the above "$doit $cpprog $src $dsttmp" command.
+ #
+ { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
+ { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
+ { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
+ { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
+
+ # If -C, don't bother to copy if it wouldn't change the file.
+ if $copy_on_change &&
+ old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` &&
+ new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` &&
+
+ eval "$initialize_posix_glob" &&
+ $posix_glob set -f &&
+ set X $old && old=:$2:$4:$5:$6 &&
+ set X $new && new=:$2:$4:$5:$6 &&
+ $posix_glob set +f &&
+
+ test "$old" = "$new" &&
+ $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
+ then
+ rm -f "$dsttmp"
+ else
+ # Rename the file to the real destination.
+ $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
+
+ # The rename failed, perhaps because mv can't rename something else
+ # to itself, or perhaps because mv is so ancient that it does not
+ # support -f.
+ {
+ # Now remove or move aside any old file at destination location.
+ # We try this two ways since rm can't unlink itself on some
+ # systems and the destination file might be busy for other
+ # reasons. In this case, the final cleanup might fail but the new
+ # file should still install successfully.
+ {
+ test ! -f "$dst" ||
+ $doit $rmcmd -f "$dst" 2>/dev/null ||
+ { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
+ { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
+ } ||
+ { echo "$0: cannot unlink or rename $dst" >&2
+ (exit 1); exit 1
+ }
+ } &&
+
+ # Now rename the file to the real destination.
+ $doit $mvcmd "$dsttmp" "$dst"
+ }
+ fi || exit 1
+
+ trap '' 0
+ fi
+done
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/install.py b/install.py
new file mode 100755
index 0000000..9ccdd27
--- /dev/null
+++ b/install.py
@@ -0,0 +1,243 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2009 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+__version__ = '5.1'
+__title__ = 'HPLIP Installer'
+__mod__ = 'hplip-install'
+__doc__ = "Installer for HPLIP tarball (called automatically after invoking the .run file)."
+
+
+# Std Lib
+import getopt
+import os
+import os.path
+import sys
+import time
+import re
+
+# Local
+from base.g import *
+from base import utils
+
+
+USAGE = [(__doc__, "", "name", True),
+ ("Usage: sh %s [OPTIONS]" % __mod__, "", "summary", True),
+ utils.USAGE_SPACE,
+ utils.USAGE_SPACE,
+ utils.USAGE_OPTIONS,
+ ("Automatic mode (chooses the most common options):", "-a or --auto", "option", False),
+ ("Dependency package installation retries:", "-r <retries> or --retries=<retries> (default is 3)", "option", False),
+ ("Assume network connection present:", "-n or --network", "option", False),
+ utils.USAGE_LOGGING1, utils.USAGE_LOGGING2, utils.USAGE_LOGGING3,
+ utils.USAGE_HELP,
+ utils.USAGE_SPACE,
+ utils.USAGE_SPACE,
+ ("[OPTIONS] (FOR TESTING ONLY/ADVANCED)", "", "header", False),
+ ("Force install of all dependencies:", "-x", "option", False),
+ ("Force unknown distro mode:", "-d", "option", False),
+ ("Force installation of Qt4 support:", "--qt4 (same as --enable=qt4)", "option", False),
+ ("Force disable Qt4 support:", "--no-qt4 (same as --disable=qt4", "option", False),
+ #("Force installation of Qt3 support:", "--qt3 (same as --enable=qt3)", "option", False),
+ #("Force disable Qt3 support:", "--no-qt3 (same as --disable=qt3", "option", False),
+ ("Force installation of PolicyKit support:", "--policykit (same as --enable=policykit)", "option", False),
+ ("Force disable PolicyKit support:", "--no-policykit (same as --disable=policykit)", "option", False),
+ ("Force configure enable/disable flag:", "--enable=<flag> or --disable=<flag>, where <flag> is 'fax-build', 'qt4', 'pp-build', etc. See ./configure --help for more info.", "option", False),
+ ]
+
+def usage(typ='text'):
+ if typ == 'text':
+ utils.log_title(__title__, __version__)
+
+ utils.format_text(USAGE, typ, __title__, __mod__, __version__)
+ sys.exit(0)
+
+
+log.set_module(__mod__)
+
+log.debug("euid = %d" % os.geteuid())
+mode = INTERACTIVE_MODE
+auto = False
+test_depends = False
+test_unknown = False
+language = None
+assume_network = False
+max_retries = 3
+restricted_override = False
+enable = []
+disable = []
+
+if((re.search(' ',os.getcwd()))!= None):
+ log.info("Current hplip source directory path has space character in it. Please update path by removing space characters. Example: Change %s.run to %s.run" % (os.getcwd(),(os.getcwd()).replace(' ','')))
+ os.system("rm -r ../%s"%(os.getcwd()).rsplit('/').pop())
+ sys.exit(0)
+
+try:
+ opts, args = getopt.getopt(sys.argv[1:], 'hl:giatxdq:nr:b',
+ ['help', 'help-rest', 'help-man', 'help-desc', 'gui', 'lang=',
+ 'logging=', 'interactive', 'auto', 'text', 'qt4',
+ 'network', 'retries=', 'enable=', 'disable=',
+ 'no-qt4', 'policykit', 'no-policykit', 'debug'])
+
+except getopt.GetoptError, e:
+ log.error(e.msg)
+ usage()
+ sys.exit(1)
+
+if os.getenv("HPLIP_DEBUG"):
+ log.set_level('debug')
+
+for o, a in opts:
+ if o in ('-h', '--help'):
+ usage()
+
+ elif o == '--help-rest':
+ usage('rest')
+
+ elif o == '--help-man':
+ usage('man')
+
+ elif o in ('-q', '--lang'):
+ language = a.lower()
+
+ elif o == '--help-desc':
+ print __doc__,
+ sys.exit(0)
+
+ elif o in ('-l', '--logging'):
+ log_level = a.lower().strip()
+ if not log.set_level(log_level):
+ usage()
+
+ elif o in ('-g', '--debug'):
+ log.set_level('debug')
+
+ elif o in ('-i', '--interactive', '--text', '-t'):
+ mode = INTERACTIVE_MODE
+
+ elif o in ('-a', '--auto'):
+ auto = True
+
+ elif o == '-x':
+ log.warn("Install all depends (-x) is for TESTING ONLY")
+ test_depends = True
+
+ elif o == '-d':
+ log.warn("Unknown distro (-d) is for TESTING ONLY")
+ test_unknown = True
+
+ elif o in ('-n', '--network'):
+ assume_network = True
+
+ elif o in ('-r', '--retries'):
+ try:
+ max_retries = int(a)
+ except ValueError:
+ log.error("Invalid value for retries. Set to default of 3.")
+ max_retries = 3
+
+ elif o == '-b':
+ restricted_override = True
+
+ elif o == '--qt4':
+ if 'qt4' not in enable and 'qt4' not in disable:
+ enable.append('qt4')
+ else:
+ log.error("Duplicate configuration flag: %s" % a)
+ sys.exit(1)
+
+ elif o == '--no-qt4':
+ if 'qt4' not in disable and 'qt4' not in enable:
+ disable.append('qt4')
+ else:
+ log.error("Duplicate configuration flag: %s" % a)
+ sys.exit(1)
+
+ elif o == '--policykit':
+ if 'policykit' not in enable and 'policykit' not in disable:
+ enable.append('policykit')
+ else:
+ log.error("Duplicate configuration flag: %s" % a)
+ sys.exit(1)
+
+ elif o == '--no-policykit':
+ if 'policykit' not in disable and 'policykit' not in enable:
+ disable.append('policykit')
+ else:
+ log.error("Duplicate configuration flag: %s" % a)
+ sys.exit(1)
+
+ elif o == '--enable':
+ if a not in enable and a not in disable:
+ enable.append(a)
+ else:
+ log.error("Duplicate configuration flag: %s" % a)
+ sys.exit(1)
+
+ elif o == '--disable':
+ if a not in enable and a not in disable:
+ disable.append(a)
+ else:
+ log.error("Duplicate configuration flag: %s" % a)
+ sys.exit(1)
+
+
+
+if os.getuid() == 0:
+ log.warn("hplip-install should not be run as root.")
+
+log_file = os.path.normpath('./hplip-install_%s.log' % time.strftime("%a-%d-%b-%Y_%H:%M:%S"))
+
+if os.path.exists(log_file):
+ os.remove(log_file)
+
+log.set_logfile(log_file)
+log.set_where(log.LOG_TO_CONSOLE_AND_FILE)
+
+log.debug("Log file=%s" % log_file)
+
+ac_init_pat = re.compile(r"""AC_INIT\(\[(.*?)\], *\[(.*?)\], *\[(.*?)\], *\[(.*?)\] *\)""", re.IGNORECASE)
+try:
+ config_in = open('./configure.in', 'r')
+except IOError:
+ prop.version = 'x.x.x'
+else:
+ for c in config_in:
+ if c.startswith("AC_INIT"):
+ match_obj = ac_init_pat.search(c)
+ prop.version = match_obj.group(2)
+ break
+
+ config_in.close()
+
+utils.log_title(__title__, __version__, True)
+
+log.info("Installer log saved in: %s" % log.bold(log_file))
+log.info("")
+
+
+try:
+ from installer import text_install
+ log.debug("Starting text installer...")
+ text_install.start(language, auto, test_depends, test_unknown, assume_network, max_retries, enable, disable)
+except KeyboardInterrupt:
+ log.error("User exit")
+
diff --git a/installer/__init__.py b/installer/__init__.py
new file mode 100644
index 0000000..ffdcaff
--- /dev/null
+++ b/installer/__init__.py
@@ -0,0 +1,19 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2007 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+
diff --git a/installer/core_install.py b/installer/core_install.py
new file mode 100644
index 0000000..7f15781
--- /dev/null
+++ b/installer/core_install.py
@@ -0,0 +1,2387 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2009 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+# Std Lib
+import sys
+import os
+import os.path
+import re
+import time
+import cStringIO
+import grp
+import pwd
+import tarfile
+import stat
+
+try:
+ import hashlib # new in 2.5
+
+ def get_checksum(s):
+ return hashlib.sha1(s).hexdigest()
+
+except ImportError:
+ import sha # deprecated in 2.6/3.0
+
+ def get_checksum(s):
+ return sha.new(s).hexdigest()
+
+
+import urllib # TODO: Replace with urllib2 (urllib is deprecated in Python 3.0)
+
+
+# Local
+from base.g import *
+from base.codes import *
+from base import utils, pexpect,tui
+from dcheck import *
+
+
+
+DISTRO_UNKNOWN = 0
+DISTRO_VER_UNKNOWN = '0.0'
+
+MODE_INSTALLER = 0 # hplip-install/hp-setup
+MODE_CHECK = 1 # hp-check
+MODE_CREATE_DOCS = 2 # create_docs
+
+TYPE_STRING = 1
+TYPE_LIST = 2
+TYPE_BOOL = 3
+TYPE_INT = 4
+
+DEPENDENCY_RUN_TIME = 1
+DEPENDENCY_COMPILE_TIME = 2
+DEPENDENCY_RUN_AND_COMPILE_TIME = 3
+
+# Plug-in download errors
+PLUGIN_INSTALL_ERROR_NONE = 0
+PLUGIN_INSTALL_ERROR_PLUGIN_FILE_NOT_FOUND = 1
+PLUGIN_INSTALL_ERROR_DIGITAL_SIG_NOT_FOUND = 2
+PLUGIN_INSTALL_ERROR_DIGITAL_SIG_BAD = 3
+PLUGIN_INSTALL_ERROR_PLUGIN_FILE_CHECKSUM_ERROR = 4
+PLUGIN_INSTALL_ERROR_NO_NETWORK = 5
+PLUGIN_INSTALL_ERROR_DIRECTORY_ERROR = 6
+PLUGIN_INSTALL_ERROR_UNABLE_TO_RECV_KEYS = 7
+
+
+#Plugin installation status values
+PLUGIN_STATUS_PARTIAL_FILES_PRESENT = -1
+PLUGIN_STATUS_FILES_NOT_PRESENT = 0
+PLUGIN_STATUS_FILES_PRESENT = 1
+
+
+PING_TARGET = "www.google.com"
+HTTP_GET_TARGET = "http://www.google.com"
+PLUGIN_FALLBACK_LOCATION = 'http://hplipopensource.com/hplip-web/plugin/'
+
+EXPECT_WORD_LIST = [
+ pexpect.EOF, # 0
+ pexpect.TIMEOUT, # 1
+ "Continue?", # 2 (for zypper)
+ "passwor[dt]", # en/de/it/ru
+ "kennwort", # de?
+ "password for", # en
+ "mot de passe", # fr
+ "contraseña", # es
+ "palavra passe", # pt
+ "å£ä»¤", # zh
+ "wachtwoord", # nl
+ "heslo", # czech
+]
+
+# Mapping from patterns to probability contribution of pattern
+# Example code from David Mertz' Text Processing in Python.
+# Released in the Public Domain.
+err_pats = {r'(?is)<TITLE>.*?(404|403).*?ERROR.*?</TITLE>': 0.95,
+ r'(?is)<TITLE>.*?ERROR.*?(404|403).*?</TITLE>': 0.95,
+ r'(?is)<TITLE>ERROR</TITLE>': 0.30,
+ r'(?is)<TITLE>.*?ERROR.*?</TITLE>': 0.10,
+ r'(?is)<META .*?(404|403).*?ERROR.*?>': 0.80,
+ r'(?is)<META .*?ERROR.*?(404|403).*?>': 0.80,
+ r'(?is)<TITLE>.*?File Not Found.*?</TITLE>': 0.80,
+ r'(?is)<TITLE>.*?Not Found.*?</TITLE>': 0.40,
+ r'(?is)<BODY.*(404|403).*</BODY>': 0.10,
+ r'(?is)<H1>.*?(404|403).*?</H1>': 0.15,
+ r'(?is)<BODY.*not found.*</BODY>': 0.10,
+ r'(?is)<H1>.*?not found.*?</H1>': 0.15,
+ r'(?is)<BODY.*the requested URL.*</BODY>': 0.10,
+ r'(?is)<BODY.*the page you requested.*</BODY>': 0.10,
+ r'(?is)<BODY.*page.{1,50}unavailable.*</BODY>': 0.10,
+ r'(?is)<BODY.*request.{1,50}unavailable.*</BODY>': 0.10,
+ r'(?i)does not exist': 0.10,
+ }
+
+
+
+# Note:- If new utility is added, add same utility here to uninstall properly.
+
+BINS_LIST=['hpijs','hp-align','hp-colorcal','hp-faxsetup','hp-linefeedcal','hp-pkservice','hp-printsettings','hp-sendfax','hp-timedate','hp-check','hp-devicesettings','hp-firmware','hp-makecopies','hp-plugin','hp-probe','hp-setup','hp-toolbox','hp-check-plugin','hp-diagnose_plugin','hp-info','hp-makeuri','hp-pqdiag','hp-query','hp-systray','hp-unload','hp-clean','hp-fab','hp-levels','hp-mkuri','hp-print','hp-scan','hp-testpage','hp-wificonfig', 'hp-upgrade','hplip-info','hp-check-upgrade','hp-config_usb_printer','hp-diagnose_queues']
+
+LIBS_LIST=['libhpmud.*','libhpip.*','sane/libsane-hpaio.*','cups/backend/hp','cups/backend/hpfax', 'cups/filter/hpcac', 'cups/filter/pstotiff','cups/filter/hpcups', 'cups/filter/hpcupsfax', 'cups/filter/hplipjs','cups/filter/hpps']
+
+FILES_LIST=['/usr/share/ppd/HP/*','/etc/udev/rules.d/56-hpmud_support.rules', '/etc/udev/rules.d/40-hplip.rules', '/etc/udev/rules.d/56-hpmud_support.rules', '/etc/udev/rules.d/55-hpmud.rules', '/etc/udev/rules.d/86-hpmud-hp_*', '/etc/udev/rules.d/86-hpmud_plugin.rules', '/usr/share/cups/drv/hp/*','/usr/local/share/ppd/HP/*','/usr/local/share/cups/drv/hp/*' ,'/usr/share/applications/hplip.desktop', '/etc/xdg/autostart/hplip-systray.desktop', '/etc/hp/hplip.conf', '/usr/share/doc/hplip-*']
+
+HPLIP_LIST=['*.py','*.pyc', 'base', 'copier','data','installer','pcard','ui4','ui','fax/*.py','fax/*.pyc','fax/pstotiff.convs','fax/pstotiff.types','fax/pstotiff','prnt/*.py', 'prnt/*.pyc', 'scan/*.py','scan/*.pyc']
+
+PLUGIN_LIST=['fax/plugins/','prnt/pluginmode = INTERACTIVE_MODEs/','scan/plugins/']
+PLUGIN_STATE =['/var/lib/hp/hplip.state']
+RMDIR="rm -rf"
+RM="rm -f"
+
+# end
+
+
+EXPECT_LIST = []
+for s in EXPECT_WORD_LIST:
+ try:
+ p = re.compile(s, re.I)
+ except TypeError:
+ EXPECT_LIST.append(s)
+ else:
+ EXPECT_LIST.append(p)
+
+OK_PROCESS_LIST = ['adept-notifier',
+ 'adept_notifier',
+ 'yum-updatesd',
+ ]
+
+CONFIGURE_ERRORS = { 1 : "General/unknown error",
+ 2 : "libusb not found",
+ 3 : "cups-devel not found",
+ 4 : "libnetsnmp not found",
+ 5 : "netsnmp-devel not found",
+ 6 : "python-devel not found",
+ 7 : "pthread-devel not found",
+ 8 : "ppdev-devel not found",
+ 9 : "libcups not found",
+ 10 : "libm not found",
+ 11 : "libusb-devel not found",
+ 12 : "sane-backends-devel not found",
+ 13 : "libdbus not found",
+ 14 : "dbus-devel not found",
+ 15 : "fax requires dbus support",
+ 102 : "libjpeg not found",
+ 103 : "jpeg-devel not found",
+ 104 : "libdi not found",
+ }
+
+
+try:
+ from functools import update_wrapper
+except ImportError: # using Python version < 2.5
+ def trace(f):
+ def newf(*args, **kw):
+ log.debug("TRACE: func=%s(), args=%s, kwargs=%s" % (f.__name__, args, kw))
+ return f(*args, **kw)
+ newf.__name__ = f.__name__
+ newf.__dict__.update(f.__dict__)
+ newf.__doc__ = f.__doc__
+ newf.__module__ = f.__module__
+ return newf
+else: # using Python 2.5+
+ def trace(f):
+ def newf(*args, **kw):
+ log.debug("TRACE: func=%s(), args=%s, kwargs=%s" % (f.__name__, args, kw))
+ return f(*args, **kw)
+ return update_wrapper(newf, f)
+
+
+
+class CoreInstall(object):
+ def __init__(self, mode=MODE_INSTALLER, ui_mode=INTERACTIVE_MODE, ui_toolkit='qt4'):
+ os.umask(0022)
+ self.mode = mode
+ self.ui_mode = ui_mode
+ self.password = ''
+ self.version_description, self.version_public, self.version_internal = '', '', ''
+ self.bitness = 32
+ self.endian = utils.LITTLE_ENDIAN
+ self.distro, self.distro_name, self.distro_version = DISTRO_UNKNOWN, '', DISTRO_VER_UNKNOWN
+ self.distro_version_supported = False
+ self.install_location = '/usr'
+ self.hplip_present = False
+ self.have_dependencies = {}
+ self.native_cups = True
+ self.ppd_dir = None
+ self.drv_dir = None
+ self.distros = {}
+ self.network_connected = False
+ self.ui_toolkit = ui_toolkit
+ self.enable = None
+ self.disable = None
+ self.plugin_path = "/tmp"
+ self.plugin_version = '0.0.0'
+ self.plugin_name = ''
+ self.reload_dbus = False
+
+
+ self.FIELD_TYPES = {
+ 'distros' : TYPE_LIST,
+ 'index' : TYPE_INT,
+ 'versions' : TYPE_LIST,
+ 'display_name' : TYPE_STRING,
+ 'alt_names': TYPE_LIST,
+ 'display': TYPE_BOOL,
+ 'notes': TYPE_STRING,
+ 'package_mgrs': TYPE_LIST,
+ 'package_mgr_cmd':TYPE_STRING,
+ 'pre_install_cmd': TYPE_LIST,
+ 'pre_depend_cmd': TYPE_LIST,
+ 'post_depend_cmd': TYPE_LIST,
+ 'hpoj_remove_cmd': TYPE_STRING,
+ 'hplip_remove_cmd': TYPE_STRING,
+ 'su_sudo': TYPE_STRING,
+ 'ppd_install': TYPE_STRING,
+ 'udev_mode_fix': TYPE_BOOL,
+ 'ppd_dir': TYPE_STRING,
+ 'drv_dir' : TYPE_STRING,
+ 'fix_ppd_symlink': TYPE_BOOL,
+ 'code_name': TYPE_STRING,
+ 'supported': TYPE_BOOL, # Supported by installer
+ 'release_date': TYPE_STRING,
+ 'packages': TYPE_LIST,
+ 'commands': TYPE_LIST,
+ 'same_as_version' : TYPE_STRING,
+ 'scan_supported' : TYPE_BOOL,
+ 'fax_supported' : TYPE_BOOL,
+ 'pcard_supported' : TYPE_BOOL,
+ 'network_supported' : TYPE_BOOL,
+ 'parallel_supported' : TYPE_BOOL,
+ 'usb_supported' : TYPE_BOOL,
+ 'packaged_version': TYPE_STRING, # Version of HPLIP pre-packaged in distro
+ 'cups_path_with_bitness' : TYPE_BOOL,
+ 'ui_toolkit' : TYPE_STRING, # qt3 or qt4 [or gtk] or none
+ 'policykit' : TYPE_BOOL,
+ 'native_cups' : TYPE_BOOL,
+ 'package_available' : TYPE_BOOL,
+ 'package_arch' : TYPE_LIST,
+ 'add_user_to_group': TYPE_STRING,
+ 'open_mdns_port' : TYPE_LIST, # command to use to open mdns multicast port 5353
+ 'acl_rules' : TYPE_BOOL, # Use ACL uDEV rules (Ubuntu 9.10+)
+ 'libdir_path' : TYPE_STRING,
+ }
+
+ # components
+ # 'name': ('description', [<option list>])
+ self.components = {
+ 'hplip': ("HP Linux Imaging and Printing System", ['base', 'network', 'gui_qt4',
+ 'fax', 'scan', 'docs']),
+ }
+
+ self.selected_component = 'hplip'
+
+ # options
+ # name: (<required>, "<display_name>", [<dependency list>]), ...
+ self.options = {
+ 'base': (True, 'Required HPLIP base components (including hpcups)', []), # HPLIP
+ 'network' : (False, 'Network/JetDirect I/O', []),
+ 'gui_qt4' : (False, 'Graphical User Interfaces (Qt4)', []),
+ 'fax' : (False, 'PC Send Fax support', []),
+ 'scan': (False, 'Scanning support', []),
+ 'docs': (False, 'HPLIP documentation (HTML)', []),
+ 'policykit': (False, 'Administrative policy framework', []),
+ }
+
+
+ # holds whether the user has selected (turned on each option)
+ # initial values are defaults (for GUI only)
+ self.selected_options = {
+ 'base': True,
+ 'network': True,
+ 'gui_qt4': True,
+ 'fax': True,
+ 'scan': True,
+ 'docs': True,
+ 'policykit': False,
+ 'native_cups': False,
+ }
+
+ # dependencies
+ # 'name': (<required for option>, [<option list>], <display_name>, <check_func>, <runtime/compiletime>), ...
+ # Note: any change to the list of dependencies must be reflected in base/distros.py
+ self.dependencies = {
+ # Required base packages
+ 'libjpeg': (True, ['base'], "libjpeg - JPEG library", self.check_libjpeg, DEPENDENCY_RUN_AND_COMPILE_TIME),
+ 'libtool': (True, ['base'], "libtool - Library building support services", self.check_libtool, DEPENDENCY_COMPILE_TIME),
+ 'cups' : (True, ['base'], 'CUPS - Common Unix Printing System', self.check_cups, DEPENDENCY_RUN_TIME),
+ 'cups-devel': (True, ['base'], 'CUPS devel- Common Unix Printing System development files', self.check_cups_devel, DEPENDENCY_COMPILE_TIME),
+ 'cups-image': (True, ['base'], "CUPS image - CUPS image development files", self.check_cups_image, DEPENDENCY_COMPILE_TIME),
+ 'gcc' : (True, ['base'], 'gcc - GNU Project C and C++ Compiler', self.check_gcc, DEPENDENCY_COMPILE_TIME),
+ 'make' : (True, ['base'], "make - GNU make utility to maintain groups of programs", self.check_make, DEPENDENCY_COMPILE_TIME),
+ 'python-devel' : (True, ['base'], "Python devel - Python development files", self.check_python_devel, DEPENDENCY_COMPILE_TIME),
+ 'libpthread' : (True, ['base'], "libpthread - POSIX threads library", self.check_libpthread, DEPENDENCY_RUN_AND_COMPILE_TIME),
+ 'python2x': (True, ['base'], "Python 2.2 or greater - Python programming language", self.check_python2x, DEPENDENCY_RUN_AND_COMPILE_TIME),
+ 'python-xml' : (True, ['base'], "Python XML libraries", self.check_python_xml, DEPENDENCY_RUN_TIME),
+ 'gs': (True, ['base'], "GhostScript - PostScript and PDF language interpreter and previewer", self.check_gs, DEPENDENCY_RUN_TIME),
+ 'libusb': (True, ['base'], "libusb - USB library", self.check_libusb, DEPENDENCY_RUN_AND_COMPILE_TIME),
+
+ # Optional base packages
+ 'cups-ddk': (False, ['base'], "CUPS DDK - CUPS driver development kit", self.check_cupsddk, DEPENDENCY_RUN_TIME), # req. for .drv PPD installs
+
+
+ # Required scan packages
+ 'sane': (True, ['scan'], "SANE - Scanning library", self.check_sane, DEPENDENCY_RUN_TIME),
+ 'sane-devel' : (True, ['scan'], "SANE - Scanning library development files", self.check_sane_devel, DEPENDENCY_COMPILE_TIME),
+
+ # Optional scan packages
+ 'xsane': (False, ['scan'], "xsane - Graphical scanner frontend for SANE", self.check_xsane, DEPENDENCY_RUN_TIME),
+ 'scanimage': (False, ['scan'], "scanimage - Shell scanning program", self.check_scanimage, DEPENDENCY_RUN_TIME),
+ 'pil': (False, ['scan'], "PIL - Python Imaging Library (required for commandline scanning with hp-scan)", self.check_pil, DEPENDENCY_RUN_TIME),
+
+ # Required fax packages
+ 'python23': (True, ['fax'], "Python 2.3 or greater - Required for fax functionality", self.check_python23, DEPENDENCY_RUN_TIME),
+ 'dbus': (True, ['fax'], "DBus - Message bus system", self.check_dbus, DEPENDENCY_RUN_AND_COMPILE_TIME),
+ 'python-dbus': (True, ['fax'], "Python DBus - Python bindings for DBus", self.check_python_dbus, DEPENDENCY_RUN_TIME),
+
+ # Optional fax packages
+ 'reportlab': (False, ['fax'], "Reportlab - PDF library for Python", self.check_reportlab, DEPENDENCY_RUN_TIME),
+
+ # Required and optional qt4 GUI packages
+ 'pyqt4': (True, ['gui_qt4'], "PyQt 4- Qt interface for Python (for Qt version 4.x)", self.check_pyqt4, DEPENDENCY_RUN_TIME), # PyQt 4.x )
+ 'pyqt4-dbus' : (True, ['gui_qt4'], "PyQt 4 DBus - DBus Support for PyQt4", self.check_pyqt4_dbus, DEPENDENCY_RUN_TIME),
+ 'policykit': (False, ['gui_qt4'], "PolicyKit - Administrative policy framework", self.check_policykit, DEPENDENCY_RUN_TIME), # optional for non-sudo behavior of plugins (only optional for Qt4 option)
+ 'python-notify' : (False, ['gui_qt4'], "Python libnotify - Python bindings for the libnotify Desktop notifications", self.check_pynotify, DEPENDENCY_RUN_TIME), # Optional for libnotify style popups from hp-systray
+
+ # Required network I/O packages
+ 'libnetsnmp-devel': (True, ['network'], "libnetsnmp-devel - SNMP networking library development files", self.check_libnetsnmp, DEPENDENCY_RUN_AND_COMPILE_TIME),
+ 'libcrypto': (True, ['network'], "libcrypto - OpenSSL cryptographic library", self.check_libcrypto, DEPENDENCY_RUN_AND_COMPILE_TIME),
+ }
+
+ for opt in self.options:
+ update_spinner()
+ for d in self.dependencies:
+ if opt in self.dependencies[d][1]:
+ self.options[opt][2].append(d)
+
+ self.load_distros()
+
+ self.distros_index = {}
+ for d in self.distros:
+ self.distros_index[self.distros[d]['index']] = d
+
+
+ def init(self, callback=None):
+ if callback is not None:
+ callback("Init...\n")
+
+ update_spinner()
+
+ # Package manager names
+ self.package_mgrs = []
+ for d in self.distros:
+ update_spinner()
+
+ for a in self.distros[d].get('package_mgrs', []):
+ if a and a not in self.package_mgrs:
+ self.package_mgrs.append(a)
+
+ self.version_description, self.version_public, self.version_internal = self.get_hplip_version()
+ log.debug("HPLIP Description=%s Public version=%s Internal version = %s" %
+ (self.version_description, self.version_public, self.version_internal))
+
+ # have_dependencies
+ # is each dependency satisfied?
+ # start with each one 'No'
+ for d in self.dependencies:
+ update_spinner()
+ self.have_dependencies[d] = False
+
+ self.get_distro()
+ self.distro_changed()
+
+ if callback is not None:
+ callback("Distro: %s\n" % self.distro)
+
+ self.check_dependencies(callback)
+
+ for d in self.dependencies:
+ update_spinner()
+
+ log.debug("have %s = %s" % (d, self.have_dependencies[d]))
+
+ if callback is not None:
+ callback("Result: %s = %s\n" % (d, self.have_dependencies[d]))
+
+ pid, cmdline = self.check_pkg_mgr()
+ if pid:
+ log.debug("Running package manager: %s (%d)" % (cmdline, pid) )
+
+ self.bitness = utils.getBitness()
+ log.debug("Bitness = %d" % self.bitness)
+
+ update_spinner()
+
+ self.endian = utils.getEndian()
+ log.debug("Endian = %d" % self.endian)
+
+ update_spinner()
+
+ self.distro_name = self.distros_index[self.distro]
+ self.distro_version_supported = self.get_distro_ver_data('supported', False)
+
+ log.debug("Distro = %s Distro Name = %s Display Name= %s Version = %s Supported = %s" %
+ (self.distro, self.distro_name, self.distros[self.distro_name]['display_name'],
+ self.distro_version, self.distro_version_supported))
+
+ update_spinner()
+
+ self.hplip_present = self.check_hplip()
+ log.debug("HPLIP (prev install) = %s" % self.hplip_present)
+
+ status, output = self.run('cups-config --version')
+ self.cups_ver = output.strip()
+ log.debug("CUPS version = %s" % self.cups_ver)
+
+ if self.distro_name == "ubuntu":
+ self.reload_dbus = True
+
+ log.debug("DBUS configuration reload possible? %s" % self.reload_dbus)
+
+ status, self.sys_uname_info = self.run('uname -a')
+ self.sys_uname_info = self.sys_uname_info.replace('\n', '')
+ log.debug(self.sys_uname_info)
+
+ # Record the installation time/date and version.
+ # Also has the effect of making the .hplip.conf file user r/w
+ # on the 1st run so that running hp-setup as root doesn't lock
+ # the user out of owning the file
+ user_conf.set('installation', 'date_time', time.strftime("%x %H:%M:%S", time.localtime()))
+ user_conf.set('installation', 'version', self.version_public)
+
+ if callback is not None:
+ callback("Done")
+
+
+ def init_for_docs(self, distro_name, version, bitness=32):
+ self.distro_name = distro_name
+ self.distro_version = version
+
+ try:
+ self.distro = self.distros[distro_name]['index']
+ except KeyError:
+ log.error("Invalid distro name: %s" % distro_name)
+ sys.exit(1)
+
+ self.bitness = bitness
+
+ for d in self.dependencies:
+ self.have_dependencies[d] = True
+
+ self.enable_ppds = self.get_distro_ver_data('ppd_install', 'ppd') == 'ppd'
+ self.ppd_dir = self.get_distro_ver_data('ppd_dir')
+ self.drv_dir = self.get_distro_ver_data('drv_dir')
+
+ self.distro_version_supported = True # for manual installs
+
+
+ def check_dependencies(self, callback=None):
+ update_ld_output()
+
+ for d in self.dependencies:
+ update_spinner()
+
+ log.debug("Checking for dependency '%s'...\n" % d)
+
+ if callback is not None:
+ callback("Checking: %s\n" % d)
+
+ self.have_dependencies[d] = self.dependencies[d][3]()
+ log.debug("have %s = %s" % (d, self.have_dependencies[d]))
+
+ cleanup_spinner()
+
+
+ def password_func(self):
+ if self.password:
+ return self.password
+ elif self.ui_mode == INTERACTIVE_MODE:
+ import getpass
+ return getpass.getpass("Enter password: ")
+ else:
+ return ''
+
+
+ def run(self, cmd, callback=None, timeout=300): # ==> status, output
+ if cmd is None:
+ return 1, ''
+ output = cStringIO.StringIO()
+ ok, ret = False, ''
+ # Hack! TODO: Fix!
+ check_timeout = not (cmd.startswith('xterm') or cmd.startswith('gnome-terminal'))
+
+ try:
+ child = pexpect.spawn(cmd, timeout=1)
+ except pexpect.ExceptionPexpect:
+ return 1, ''
+
+ try:
+ try:
+ start = time.time()
+
+ while True:
+ update_spinner()
+
+ i = child.expect_list(EXPECT_LIST)
+
+ cb = child.before
+ if cb:
+ # output
+ start = time.time()
+ log.log_to_file(cb)
+ log.debug(cb)
+ output.write(cb)
+
+ if callback is not None:
+ if callback(cb): # cancel
+ break
+
+ elif check_timeout:
+ # no output
+ span = int(time.time()-start)
+
+ if span:
+ if span % 5 == 0:
+ log.debug("No output seen in %d secs" % span)
+
+ if span > timeout:
+ log.error("No output seen in over %d sec... (Is the CD-ROM/DVD source repository enabled? It shouldn't be!)" % timeout)
+ child.close()
+ child.terminate(force=True)
+ break
+
+ if i == 0: # EOF
+ ok, ret = True, output.getvalue()
+ break
+
+ elif i == 1: # TIMEOUT
+ continue
+
+ elif i == 2: # zypper "Continue?"
+ child.sendline("YES")
+
+ else: # password
+ child.sendline(self.password)
+
+ except (Exception, pexpect.ExceptionPexpect):
+ log.exception()
+
+ finally:
+ cleanup_spinner()
+
+ try:
+ child.close()
+ except OSError:
+ pass
+
+ if ok:
+ return child.exitstatus, ret
+ else:
+ return 1, ''
+
+
+ def get_distro(self):
+ log.debug("Determining distro...")
+ self.distro, self.distro_version = DISTRO_UNKNOWN, '0.0'
+
+ found = False
+
+ lsb_release = utils.which("lsb_release")
+
+ if lsb_release:
+ log.debug("Using 'lsb_release -is/-rs'")
+ cmd = os.path.join(lsb_release, "lsb_release")
+ status, name = self.run(cmd + ' -is')
+ name = name.lower().strip()
+ log.debug("Distro name=%s" % name)
+
+ if not status and name:
+ status, ver = self.run(cmd + ' -rs')
+ ver = ver.lower().strip()
+ log.debug("Distro version=%s" % ver)
+
+ if not status and ver:
+ for d in self.distros:
+ if name.find(d) > -1:
+ self.distro = self.distros[d]['index']
+ found = True
+ self.distro_version = ver
+ break
+
+ if not found:
+ try:
+ name = file('/etc/issue', 'r').read().lower().strip()
+ except IOError:
+ # Some O/Ss don't have /etc/issue (Mac)
+ self.distro, self.distro_version = DISTRO_UNKNOWN, '0.0'
+ else:
+ for d in self.distros:
+ if name.find(d) > -1:
+ self.distro = self.distros[d]['index']
+ found = True
+ else:
+ for x in self.distros[d].get('alt_names', ''):
+ if x and name.find(x) > -1:
+ self.distro = self.distros[d]['index']
+ found = True
+ break
+
+ if found:
+ break
+
+ if found:
+ for n in name.split():
+ m= n
+ if '.' in n:
+ m = '.'.join(n.split('.')[:2])
+
+ try:
+ float(m)
+ except ValueError:
+ try:
+ int(m)
+ except ValueError:
+ self.distro_version = '0.0'
+ else:
+ self.distro_version = m
+ break
+ else:
+ self.distro_version = m
+ break
+
+ log.debug("/etc/issue: %s %s" % (name, self.distro_version))
+
+ log.debug("distro=%d, distro_version=%s" % (self.distro, self.distro_version))
+
+
+ def distro_changed(self):
+ ppd_install = self.get_distro_ver_data('ppd_install', 'ppd')
+
+ if ppd_install not in ('ppd', 'drv'):
+ log.warning("Invalid ppd_install value: %s" % ppd_install)
+
+ self.enable_ppds = (ppd_install == 'ppd')
+
+ log.debug("Enable PPD install: %s (False=drv)" % self.enable_ppds)
+
+ self.ppd_dir = self.get_distro_ver_data('ppd_dir')
+
+ self.drv_dir = self.get_distro_ver_data('drv_dir')
+ if not self.enable_ppds and not self.drv_dir:
+ log.warning("Invalid drv_dir value: %s" % self.drv_dir)
+
+ self.distro_version_supported = self.get_distro_ver_data('supported', False)
+ self.selected_options['fax'] = self.get_distro_ver_data('fax_supported', True)
+ self.selected_options['network'] = self.get_distro_ver_data('network_supported', True)
+ self.selected_options['scan'] = self.get_distro_ver_data('scan_supported', True)
+ self.selected_options['policykit'] = self.get_distro_ver_data('policykit', False)
+ self.native_cups = self.get_distro_ver_data('native_cups', False)
+
+ # Adjust required flag based on the distro ver ui_toolkit value
+ ui_toolkit = self.get_distro_ver_data('ui_toolkit', 'qt4').lower()
+
+ if ui_toolkit == 'qt4':
+ log.debug("Default UI toolkit: Qt4")
+ self.ui_toolkit = 'qt4'
+ self.selected_options['gui_qt4'] = True
+
+ # todo: gtk
+ else:
+ self.selected_options['gui_qt4'] = False
+
+ # Override with --qt4 command args
+ if self.enable is not None:
+ if 'qt4' in self.enable:
+ log.debug("User selected UI toolkit: Qt4")
+ self.ui_toolkit = 'qt4'
+ self.selected_options['gui_qt4'] = True
+
+ if self.disable is not None:
+ if 'qt4' in self.disable:
+ log.debug("User deselected UI toolkit: Qt4")
+ self.selected_options['gui_qt4'] = False
+
+
+ def __fixup_data(self, key, data):
+ field_type = self.FIELD_TYPES.get(key, TYPE_STRING)
+ #log.debug("%s (%s) %d" % (key, data, field_type))
+
+ if field_type == TYPE_BOOL:
+ return utils.to_bool(data)
+
+ elif field_type == TYPE_STRING:
+ if type('') == type(data):
+ return data.strip()
+ else:
+ return data
+
+ elif field_type == TYPE_INT:
+ try:
+ return int(data)
+ except ValueError:
+ return 0
+
+ elif field_type == TYPE_LIST:
+ return [x for x in data.split(',') if x]
+
+
+ def load_distros(self):
+ if self.mode == MODE_INSTALLER:
+ distros_dat_file = os.path.join('installer', 'distros.dat')
+
+ elif self.mode == MODE_CREATE_DOCS:
+ distros_dat_file = os.path.join('..', '..', 'installer', 'distros.dat')
+
+ else: # MODE_CHECK
+ distros_dat_file = os.path.join(prop.home_dir, 'installer', 'distros.dat')
+
+ if not os.path.exists(distros_dat_file):
+ log.debug("DAT file not found at %s. Using local relative path..." % distros_dat_file)
+ distros_dat_file = os.path.join('installer', 'distros.dat')
+
+ distros_dat = ConfigBase(distros_dat_file)
+ distros_list = self.__fixup_data('distros', distros_dat.get('distros', 'distros'))
+ log.debug(distros_list)
+
+ for distro in distros_list:
+ update_spinner()
+ d = {}
+
+ if not distros_dat.has_section(distro):
+ log.debug("Missing distro section in distros.dat: [%s]" % distro)
+ continue
+
+ for key in distros_dat.keys(distro):
+ d[key] = self.__fixup_data(key, distros_dat.get(distro, key))
+
+ self.distros[distro] = d
+ versions = self.__fixup_data("versions", distros_dat.get(distro, 'versions'))
+ self.distros[distro]['versions'] = {}
+
+ for ver in versions:
+ same_as_version, supported = False, True
+ v = {}
+ ver_section = "%s:%s" % (distro, ver)
+
+ if not distros_dat.has_section(ver_section):
+ log.error("Missing version section in distros.dat: [%s:%s]" % (distro, ver))
+ continue
+
+ if 'same_as_version' in distros_dat.keys(ver_section):
+ same_as_version = True
+
+ supported = self.__fixup_data('supported', distros_dat.get(ver_section, 'supported'))
+
+ for key in distros_dat.keys(ver_section):
+ v[key] = self.__fixup_data(key, distros_dat.get(ver_section, key))
+
+ self.distros[distro]['versions'][ver] = v
+ self.distros[distro]['versions'][ver]['dependency_cmds'] = {}
+
+ if same_as_version: # or not supported:
+ continue
+
+ for dep in self.dependencies:
+ dd = {}
+ dep_section = "%s:%s:%s" % (distro, ver, dep)
+
+ if not distros_dat.has_section(dep_section) and not same_as_version:
+ log.debug("Missing dependency section in distros.dat: [%s:%s:%s]" % (distro, ver, dep))
+ continue
+
+ #if same_as_version:
+ # continue
+
+ for key in distros_dat.keys(dep_section):
+ dd[key] = self.__fixup_data(key, distros_dat.get(dep_section, key))
+
+ self.distros[distro]['versions'][ver]['dependency_cmds'][dep] = dd
+
+ versions = self.distros[distro]['versions']
+ for ver in versions:
+ ver_section = "%s:%s" % (distro, ver)
+
+ if 'same_as_version' in distros_dat.keys(ver_section):
+ v = self.__fixup_data("same_as_version", distros_dat.get(ver_section, 'same_as_version'))
+ log.debug("Setting %s:%s to %s:%s" % (distro, ver, distro, v))
+
+ try:
+ vv = self.distros[distro]['versions'][v].copy()
+ vv['same_as_version'] = v
+ self.distros[distro]['versions'][ver] = vv
+ except KeyError:
+ log.debug("Missing 'same_as_version=' version in distros.dat for section [%s:%s]." % (distro, v))
+ continue
+
+ #import pprint
+ #pprint.pprint(self.distros)
+
+ def pre_install(self):
+ pass
+
+
+ def pre_depend(self):
+ pass
+
+
+ def check_python2x(self):
+ py_ver = sys.version_info
+ py_major_ver, py_minor_ver = py_ver[:2]
+ log.debug("Python ver=%d.%d" % (py_major_ver, py_minor_ver))
+ return py_major_ver >= 2
+
+
+ def check_gcc(self):
+ return check_tool('gcc --version', 0) and check_tool('g++ --version', 0)
+
+
+ def check_make(self):
+ return check_tool('make --version', 3.0)
+
+
+ def check_libusb(self):
+ if not check_lib('libusb'):
+ return False
+
+ return len(locate_file_contains("usb.h", '/usr/include', 'usb_init(void)'))
+
+
+ def check_libjpeg(self):
+ return check_lib("libjpeg") and check_file("jpeglib.h")
+
+
+ def check_libcrypto(self):
+ return check_lib("libcrypto") and check_file("crypto.h")
+
+
+ def check_libpthread(self):
+ return check_lib("libpthread") and check_file("pthread.h")
+
+
+ def check_libnetsnmp(self):
+ return check_lib("libnetsnmp") and check_file("net-snmp-config.h")
+
+
+ def check_reportlab(self):
+ try:
+ log.debug("Trying to import 'reportlab'...")
+ import reportlab
+
+ ver = reportlab.Version
+ try:
+ ver_f = float(ver)
+ except ValueError:
+ log.debug("Can't determine version.")
+ return False
+ else:
+ log.debug("Version: %.1f" % ver_f)
+ if ver_f >= 2.0:
+ log.debug("Success.")
+ return True
+ else:
+ return False
+
+ except ImportError:
+ log.debug("Failed.")
+ return False
+
+
+ def check_python23(self):
+ py_ver = sys.version_info
+ py_major_ver, py_minor_ver = py_ver[:2]
+ log.debug("Python ver=%d.%d" % (py_major_ver, py_minor_ver))
+ return py_major_ver >= 2 and py_minor_ver >= 3
+
+
+ def check_python_xml(self):
+ try:
+ import xml.parsers.expat
+ except ImportError:
+ return False
+ else:
+ return True
+
+
+ def check_sane(self):
+ return check_lib('libsane')
+
+
+ def check_sane_devel(self):
+ return len(locate_file_contains("sane.h", '/usr/include', 'extern SANE_Status sane_init'))
+
+
+ def check_xsane(self):
+ if os.getenv('DISPLAY'):
+ return check_tool('xsane --version', 0.9) # will fail if X not running...
+ else:
+ return bool(utils.which("xsane")) # ...so just see if it installed somewhere
+
+
+ def check_scanimage(self):
+ return check_tool('scanimage --version', 1.0)
+
+
+ def check_gs(self):
+ return check_tool('gs -v', 7.05)
+
+
+ def check_pyqt4(self):
+ if self.ui_toolkit == 'qt4':
+ try:
+ import PyQt4
+ except ImportError:
+ return False
+ else:
+ return True
+
+ else:
+ return False
+
+
+ def check_pyqt4_dbus(self):
+ if self.ui_toolkit == 'qt4':
+ try:
+ from dbus.mainloop.qt import DBusQtMainLoop
+ except ImportError:
+ return False
+ else:
+ return True
+ else:
+ return False
+
+
+ def check_python_devel(self):
+ return check_file('Python.h')
+
+
+ def check_pynotify(self):
+ try:
+ import pynotify
+ except ImportError:
+ return False
+
+ return True
+
+
+ def check_python_dbus(self):
+ log.debug("Checking for python-dbus (>= 0.80)...")
+ try:
+ import dbus
+ try:
+ ver = dbus.version
+ log.debug("Version: %s" % '.'.join([str(x) for x in dbus.version]))
+ return ver >= (0,80,0)
+
+ except AttributeError:
+ try:
+ ver = dbus.__version__
+ log.debug("Version: %s" % dbus.__version__)
+ log.debug("HPLIP requires dbus version > 0.80.")
+ return False
+
+ except AttributeError:
+ log.debug("Unknown version. HPLIP requires dbus version > 0.80.")
+ return False
+
+ except ImportError:
+ return False
+
+
+ def check_python_ctypes(self):
+ try:
+ import ctypes
+ return True
+ except ImportError:
+ return False
+
+
+ def check_dbus(self):
+ log.debug("Checking for dbus running and header files present (dbus-devel)...")
+ return check_ps(['dbus-daemon']) and \
+ len(locate_file_contains("dbus-message.h", '/usr/include', 'dbus_message_new_signal'))
+
+
+ def check_cups_devel(self):
+ return check_file('cups.h') and bool(utils.which('lpr'))
+
+
+ def check_cups(self):
+ status, output = self.run('lpstat -r')
+ if status > 0:
+ log.debug("CUPS is not running.")
+ return False
+ else:
+ log.debug("CUPS is running.")
+ return True
+
+
+ def check_cups_image(self):
+ return check_file("raster.h", "/usr/include/cups")
+
+
+ def check_hplip(self):
+ log.debug("Checking for HPLIP...")
+ return locate_files('hplip.conf', '/etc/hp')
+
+
+ def check_hpssd(self):
+ log.debug("Checking for hpssd...")
+ return check_ps(['hpssd'])
+
+
+ def check_libtool(self):
+ log.debug("Checking for libtool...")
+ return check_tool('libtool --version')
+
+
+ def check_pil(self):
+ log.debug("Checking for PIL...")
+ try:
+ import Image
+ return True
+ except ImportError:
+ return False
+
+
+ def check_cupsddk(self):
+ log.debug("Checking for cups-ddk...")
+ # TODO: Compute these paths some way or another...
+ #return check_tool("/usr/lib/cups/driver/drv list") and os.path.exists("/usr/share/cupsddk/include/media.defs")
+ return (check_file('drv', "/usr/lib/cups/driver") or check_file('drv', "/usr/lib64/cups/driver")) and \
+ check_file('media.defs', "/usr/share/cupsddk/include")
+
+
+ def check_policykit(self):
+ log.debug("Checking for PolicyKit...")
+ return (check_file('PolicyKit.conf', "/etc/PolicyKit") and check_file('org.gnome.PolicyKit.AuthorizationManager.service', "/usr/share/dbus-1/services")) or (check_file('50-localauthority.conf', "/etc/polkit-1/localauthority.conf.d") and check_file('org.freedesktop.PolicyKit1.service', "/usr/share/dbus-1/system-services"))
+
+ def check_pkg_mgr(self):
+ """
+ Check if any pkg mgr processes are running
+ """
+ log.debug("Searching for '%s' in running processes..." % self.package_mgrs)
+
+ processes = get_process_list()
+
+ for pid, cmdline in processes:
+ for p in self.package_mgrs:
+ if p in cmdline:
+ for k in OK_PROCESS_LIST:
+ #print k, cmdline
+ if k in cmdline:
+ break
+
+ else:
+ log.debug("Found: %s (%d)" % (cmdline, pid))
+ return (pid, cmdline)
+
+ log.debug("Not found")
+ return (0, '')
+
+
+ def get_hplip_version(self):
+ self.version_description, self.version_public, self.version_internal = '', '', ''
+
+ if self.mode == MODE_INSTALLER:
+ ac_init_pat = re.compile(r"""AC_INIT\(\[(.*?)\], *\[(.*?)\], *\[(.*?)\], *\[(.*?)\] *\)""", re.IGNORECASE)
+
+ try:
+ config_in = open('./configure.in', 'r')
+ except IOError:
+ self.version_description, self.version_public, self.version_internal = \
+ '', sys_conf.get('configure', 'internal-tag', '0.0.0'), prop.installed_version
+ else:
+ for c in config_in:
+ if c.startswith("AC_INIT"):
+ match_obj = ac_init_pat.search(c)
+ self.version_description = match_obj.group(1)
+ self.version_public = match_obj.group(2)
+ self.version_internal = match_obj.group(3)
+ name = match_obj.group(4)
+ break
+
+ config_in.close()
+
+ if name != 'hplip':
+ log.error("Invalid archive!")
+
+
+ else: # MODE_CHECK
+ try:
+ self.version_description, self.version_public, self.version_internal = \
+ '', sys_conf.get('configure', 'internal-tag', '0.0.0'), prop.installed_version
+ except KeyError:
+ self.version_description, self.version_public, self.version_internal = '', '', ''
+
+ return self.version_description, self.version_public, self.version_internal
+
+
+ def configure(self):
+ configure_cmd = './configure'
+ configuration = {}
+ dbus_avail = self.have_dependencies['dbus'] and self.have_dependencies['python-dbus']
+ configuration['network-build'] = self.selected_options['network']
+ configuration['fax-build'] = self.selected_options['fax'] and dbus_avail
+ configuration['dbus-build'] = dbus_avail
+ configuration['qt4'] = self.selected_options['gui_qt4']
+ configuration['scan-build'] = self.selected_options['scan']
+ configuration['doc-build'] = self.selected_options['docs']
+ configuration['policykit'] = self.selected_options['policykit']
+
+ # Setup printer driver configure flags based on distro data...
+ if self.native_cups: # hpcups
+ configuration['hpcups-install'] = True
+ configuration['hpijs-install'] = False
+ configuration['foomatic-ppd-install'] = False
+ configuration['foomatic-drv-install'] = False
+
+ if self.enable_ppds:
+ configuration['cups-ppd-install'] = True
+ configuration['cups-drv-install'] = False
+ else:
+ configuration['cups-ppd-install'] = False
+ configuration['cups-drv-install'] = True
+
+ else: # HPIJS/foomatic
+ configuration['hpcups-install'] = False
+ configuration['hpijs-install'] = True
+ configuration['cups-ppd-install'] = False
+ configuration['cups-drv-install'] = False
+
+ if self.enable_ppds:
+ configuration['foomatic-ppd-install'] = True
+ configuration['foomatic-drv-install'] = False
+ else:
+ configuration['foomatic-ppd-install'] = False
+ configuration['foomatic-drv-install'] = True
+
+
+ # ... and then override and adjust for consistency with passed in parameters
+ if self.enable is not None:
+ for c in self.enable:
+ if c == 'hpcups-install':
+ configuration['hpijs-install'] = False
+ configuration['foomatic-ppd-install'] = False
+ configuration['foomatic-drv-install'] = False
+ elif c == 'hpijs-install':
+ configuration['hpcups-install'] = False
+ configuration['cups-ppd-install'] = False
+ configuration['cups-drv-install'] = False
+ elif c == 'foomatic-ppd-install':
+ configuration['foomatic-drv-install'] = False
+ elif c == 'foomatic-drv-install':
+ configuration['foomatic-ppd-install'] = False
+ elif c == 'cups-ppd-install':
+ configuration['cups-drv-install'] = False
+ elif c == 'cups-drv-install':
+ configuration['cups-ppd-install'] = False
+
+ if self.disable is not None:
+ for c in self.disable:
+ if c == 'hpcups-install':
+ configuration['hpijs-install'] = True
+ configuration['cups-ppd-install'] = False
+ configuration['cups-drv-install'] = False
+ elif c == 'hpijs-install':
+ configuration['hpcups-install'] = True
+ configuration['foomatic-ppd-install'] = False
+ configuration['foomatic-drv-install'] = False
+ elif c == 'foomatic-ppd-install':
+ configuration['foomatic-drv-install'] = True
+ elif c == 'foomatic-drv-install':
+ configuration['foomatic-ppd-install'] = True
+ elif c == 'cups-ppd-install':
+ configuration['cups-drv-install'] = True
+ elif c == 'cups-drv-install':
+ configuration['cups-ppd-install'] = True
+
+ if self.ppd_dir is not None:
+ configure_cmd += ' --with-hpppddir=%s' % self.ppd_dir
+
+ libdir_path = self.get_distro_ver_data('libdir_path',False)
+ if libdir_path and self.bitness == 64:
+ configure_cmd += ' --libdir=%s' % (libdir_path)
+ elif self.bitness == 64:
+ configure_cmd += ' --libdir=/usr/lib64'
+
+ configure_cmd += ' --prefix=%s' % self.install_location
+
+ if self.get_distro_ver_data('cups_path_with_bitness', False) and self.bitness == 64:
+ configure_cmd += ' --with-cupsbackenddir=/usr/lib64/cups/backend --with-cupsfilterdir=/usr/lib64/cups/filter'
+
+ if self.get_distro_ver_data('acl_rules', False):
+ configure_cmd += ' --enable-udev-acl-rules'
+
+ if self.enable is not None:
+ for c in self.enable:
+ configuration[c] = True
+
+ if self.disable is not None:
+ for c in self.disable:
+ configuration[c] = False
+
+ for c in configuration:
+ if configuration[c]:
+ configure_cmd += ' --enable-%s' % c
+ else:
+ configure_cmd += ' --disable-%s' % c
+
+ return configure_cmd
+
+ def configure_html(self):
+ configure_cmd = './configure'
+ configure_cmd += ' --prefix=/usr'
+ configure_cmd += ' --with-hpppddir=%s' % self.ppd_dir
+
+ if self.bitness == 64:
+ configure_cmd += ' --libdir=/usr/lib64'
+
+ self.ui_toolkit = self.get_distro_ver_data('ui_toolkit')
+ if self.ui_toolkit is not None and self.ui_toolkit == 'qt3':
+ configure_cmd += ' --enable-qt3 --disable-qt4'
+ else:
+ configure_cmd += ' --enable-qt4'
+
+ self.native_cups = self.get_distro_ver_data('native_cups')
+ if self.native_cups is not None and self.native_cups == 1:
+ configure_cmd += ' --enable-hpcups-install --enable-cups-drv-install --enable-cups-ppd-install --disable-hpijs-install --disable-foomatic-drv-install --disable-foomatic-ppd-install --disable-foomatic-rip-hplip-install'
+ else:
+ configure_cmd += ' --disable-hpcups-install --disable-cups-drv-install --disable-cups-ppd-install --enable-hpijs-install --enable-foomatic-drv-install --enable-foomatic-ppd-install --enable-foomatic-rip-hplip-install'
+
+ self.fax_supported = self.get_distro_ver_data('fax_supported')
+ if self.fax_supported is None:
+ configure_cmd += ' --disable-fax-build --disable-dbus-build'
+ else:
+ configure_cmd += ' --enable-fax-build --enable-dbus-build'
+
+ self.network_supported = self.get_distro_ver_data('network_supported')
+ if self.network_supported is None:
+ configure_cmd += ' --disable-network-build'
+ else:
+ configure_cmd += ' --enable-network-build'
+
+ self.scan_supported = self.get_distro_ver_data('scan_supported')
+ if self.scan_supported is None:
+ configure_cmd += ' --disable-scan-build'
+ else:
+ configure_cmd += ' --enable-scan-build'
+
+ self.policykit = self.get_distro_ver_data('policykit')
+ if self.policykit is not None and self.policykit == 1:
+ configure_cmd += ' --enable-policykit'
+ else:
+ configure_cmd += ' --disable-policykit'
+
+ return configure_cmd
+
+ def configure_qt4(self):
+ configure_cmd = './configure'
+ configure_cmd += ' --prefix=/usr'
+ configure_cmd += ' --with-hpppddir=%s' % self.ppd_dir
+
+ if self.bitness == 64:
+ configure_cmd += ' --libdir=/usr/lib64'
+
+ self.ui_toolkit = self.get_distro_ver_data('ui_toolkit')
+ if self.ui_toolkit is not None and self.ui_toolkit == 'qt3':
+ configure_cmd += ' --enable-qt3 --disable-qt4'
+ else:
+ configure_cmd += ' --enable-qt4'
+
+ self.native_cups = self.get_distro_ver_data('native_cups')
+ self.ppd_install = self.get_distro_ver_data('ppd_install')
+ if self.native_cups is not None and self.native_cups == 1:
+ configure_cmd += ' --enable-hpcups-install'
+ if self.ppd_install == 'drv':
+ configure_cmd += ' --enable-cups-drv-install --disable-cups-ppd-install'
+ else:
+ configure_cmd += ' --enable-cups-ppd-install --disable-cups-drv-install'
+ configure_cmd += ' --disable-hpijs-install --disable-foomatic-drv-install --disable-foomatic-ppd-install --disable-foomatic-rip-hplip-install'
+ else:
+ configure_cmd += ' --enable-hpijs-install'
+ if self.ppd_install == 'drv':
+ configure_cmd += ' --enable-foomatic-drv-install --disable-foomatic-ppd-install'
+ else:
+ configure_cmd += ' --enable-foomatic-ppd-install --disable-foomatic-drv-install'
+ configure_cmd += ' --enable-foomatic-rip-hplip-install --disable-hpcups-install --disable-cups-drv-install --disable-cups-ppd-install'
+
+ self.fax_supported = self.get_distro_ver_data('fax_supported')
+ if self.fax_supported is None:
+ configure_cmd += ' --disable-fax-build --disable-dbus-build'
+ else:
+ configure_cmd += ' --enable-fax-build --enable-dbus-build'
+
+ self.network_supported = self.get_distro_ver_data('network_supported')
+ if self.network_supported is None:
+ configure_cmd += ' --disable-network-build'
+ else:
+ configure_cmd += ' --enable-network-build'
+
+ self.scan_supported = self.get_distro_ver_data('scan_supported')
+ if self.scan_supported is None:
+ configure_cmd += ' --disable-scan-build'
+ else:
+ configure_cmd += ' --enable-scan-build'
+
+ self.policykit = self.get_distro_ver_data('policykit')
+ if self.policykit is not None and self.policykit == 1:
+ configure_cmd += ' --enable-policykit'
+ else:
+ configure_cmd += ' --disable-policykit'
+
+ return configure_cmd
+
+
+ def restart_cups(self):
+ if os.path.exists('/etc/init.d/cups'):
+ cmd = self.su_sudo() % '/etc/init.d/cups restart'
+
+ elif os.path.exists('/etc/init.d/cupsys'):
+ cmd = self.su_sudo() % '/etc/init.d/cupsys restart'
+
+ else:
+ cmd = self.su_sudo() % 'killall -HUP cupsd'
+
+ self.run(cmd)
+
+
+ def stop_hplip(self):
+ return self.su_sudo() % "/etc/init.d/hplip stop"
+
+
+ def su_sudo(self):
+ if os.geteuid() == 0:
+ return '%s'
+ else:
+ try:
+ cmd = self.distros[self.distro_name]['su_sudo']
+ except KeyError:
+ cmd = 'su'
+
+ if cmd == 'su':
+ return 'su -c "%s"'
+ else:
+ return 'sudo %s'
+
+ def su_sudo_str(self):
+ return self.get_distro_data('su_sudo', 'su')
+
+
+ def build_cmds(self):
+ return [self.configure(),
+ 'make clean',
+ 'make',
+ self.su_sudo() % 'make install']
+
+
+ def get_distro_ver_data(self, key, default=None):
+ try:
+ return self.distros[self.distro_name]['versions'][self.distro_version].get(key, None) or \
+ self.distros[self.distro_name].get(key, None) or default
+ except KeyError:
+ return default
+
+ return value
+
+
+ def get_distro_data(self, key, default=None):
+ try:
+ return self.distros[self.distro_name].get(key, None) or default
+ except KeyError:
+ return default
+
+
+ def get_ver_data(self, key, default=None):
+ try:
+ return self.distros[self.distro_name]['versions'][self.distro_version].get(key, None) or default
+ except KeyError:
+ return default
+
+ return value
+
+
+ def get_dependency_data(self, dependency):
+ dependency_cmds = self.get_ver_data("dependency_cmds", {})
+ dependency_data = dependency_cmds.get(dependency, {})
+ packages = dependency_data.get('packages', [])
+ commands = dependency_data.get('commands', [])
+ return packages, commands
+
+
+ def get_dependency_commands(self):
+ dd = self.dependencies.keys()
+ dd.sort()
+ commands_to_run = []
+ packages_to_install = []
+ overall_commands_to_run = []
+ for d in dd:
+ include = False
+ for opt in self.dependencies[d][1]:
+ if self.selected_options[opt]:
+ include = True
+ if include:
+ pkgs, cmds = self.get_dependency_data(d)
+
+ if pkgs:
+ for p in pkgs:
+ if not p in packages_to_install:
+ packages_to_install.append(p)
+
+ if cmds:
+ commands_to_run.extend(cmds)
+
+ package_mgr_cmd = self.get_distro_data('package_mgr_cmd')
+
+ overall_commands_to_run.extend(commands_to_run)
+
+ if package_mgr_cmd:
+ packages_to_install = ' '.join(packages_to_install)
+ overall_commands_to_run.append(utils.cat(package_mgr_cmd))
+
+ if not overall_commands_to_run:
+ log.error("No cmds/pkgs")
+
+ return overall_commands_to_run
+
+
+ def distro_known(self):
+ return self.distro != DISTRO_UNKNOWN and self.distro_version != DISTRO_VER_UNKNOWN
+
+
+ def distro_supported(self):
+ if self.mode == MODE_INSTALLER:
+ return self.distro != DISTRO_UNKNOWN and self.distro_version != DISTRO_VER_UNKNOWN and self.get_ver_data('supported', False)
+ else:
+ return True # For docs (manual install)
+
+
+ def sort_vers(self, x, y):
+ try:
+ return cmp(float(x), float(y))
+ except ValueError:
+ return cmp(x, y)
+
+
+ def running_as_root(self):
+ return os.geteuid() == 0
+
+
+ def show_release_notes_in_browser(self):
+ url = "file://%s" % os.path.join(os.getcwd(), 'doc', 'release_notes.html')
+ log.debug(url)
+ status, output = self.run("xhost +")
+ utils.openURL(url)
+
+
+ def count_num_required_missing_dependencies(self):
+ num_req_missing = 0
+ for d, desc, opt in self.missing_required_dependencies():
+ num_req_missing += 1
+ return num_req_missing
+
+
+ def count_num_optional_missing_dependencies(self):
+ num_opt_missing = 0
+ for d, desc, req, opt in self.missing_optional_dependencies():
+ num_opt_missing += 1
+ return num_opt_missing
+
+
+ def missing_required_dependencies(self): # missing req. deps in req. options
+ for opt in self.components[self.selected_component][1]:
+ if self.options[opt][0]: # required options
+ for d in self.options[opt][2]: # dependencies for option
+ if self.dependencies[d][0]: # required option
+ if not self.have_dependencies[d]: # missing
+ log.debug("Missing required dependency: %s" % d)
+ yield d, self.dependencies[d][2], opt
+ # depend, desc, option
+
+ def missing_optional_dependencies(self):
+ # missing deps in opt. options
+ for opt in self.components[self.selected_component][1]:
+ if not self.options[opt][0]: # not required option
+ if self.selected_options[opt]: # only for options that are ON
+ for d in self.options[opt][2]: # dependencies
+ if not self.have_dependencies[d]: # missing dependency
+ log.debug("Missing optional dependency: %s" % d)
+ yield d, self.dependencies[d][2], self.dependencies[d][0], opt
+ # depend, desc, required_for_opt, opt
+
+ # opt. deps in req. options
+ for opt in self.components[self.selected_component][1]:
+ if self.options[opt][0]: # required options
+ for d in self.options[opt][2]: # dependencies for option
+ if d == 'cups-ddk':
+ status, output = self.run('cups-config --version')
+ import string
+ if status == 0 and (string.count(output, '.') == 1 or string.count(output, '.') == 2):
+ if string.count(output, '.') == 1:
+ major, minor = string.split(output, '.', 2)
+ if string.count(output, '.') == 2:
+ major, minor, release = string.split(output, '.', 3)
+ if len(minor) > 1 and minor[1] >= '0' and minor[1] <= '9':
+ minor = ((ord(minor[0]) - ord('0')) * 10) + (ord(minor[1]) - ord('0'))
+ else:
+ minor = ord(minor[0]) - ord('0')
+ if major > '1' or (major == '1' and minor >= 4):
+ continue
+ if not self.dependencies[d][0]: # optional dep
+ if not self.have_dependencies[d]: # missing
+ log.debug("Missing optional dependency: %s" % d)
+ yield d, self.dependencies[d][2], self.dependencies[d][0], opt
+ # depend, desc, option
+
+ def select_options(self, answer_callback):
+ num_opt_missing = 0
+ # not-required options
+ for opt in self.components[self.selected_component][1]:
+ if not self.options[opt][0]: # not required
+ default = 'y'
+
+ if not self.selected_options[opt]:
+ default = 'n'
+
+ self.selected_options[opt] = answer_callback(opt, self.options[opt][1], default)
+
+ if self.selected_options[opt]: # only for options that are ON
+ for d in self.options[opt][2]: # dependencies
+ if not self.have_dependencies[d]: # missing dependency
+ log.debug("Missing optional dependency: %s" % d)
+ num_opt_missing += 1
+
+ return num_opt_missing
+
+
+ def check_network_connection(self):
+ self.network_connected = False
+
+ wget = utils.which("wget")
+ if wget:
+ wget = os.path.join(wget, "wget")
+ cmd = "%s --timeout=60 --output-document=- %s" % (wget, HTTP_GET_TARGET)
+ log.debug(cmd)
+ status, output = self.run(cmd)
+ log.debug("wget returned: %d" % status)
+ self.network_connected = (status == 0)
+
+ else:
+ curl = utils.which("curl")
+ if curl:
+ curl = os.path.join(curl, "curl")
+ cmd = "%s --output - --connect-timeout 5 --max-time 10 %s" % (curl, HTTP_GET_TARGET)
+ log.debug(cmd)
+ status, output = self.run(cmd)
+ log.debug("curl returned: %d" % status)
+ self.network_connected = (status == 0)
+
+ else:
+ ping = utils.which("ping")
+
+ if ping:
+ ping = os.path.join(ping, "ping")
+ cmd = "%s -c1 -W1 -w10 %s" % (ping, PING_TARGET)
+ log.debug(cmd)
+ status, output = self.run(cmd)
+ log.debug("ping returned: %d" % status)
+ self.network_connected = (status == 0)
+
+ return self.network_connected
+
+
+ def run_pre_install(self, callback=None):
+ pre_cmd = self.get_distro_ver_data('pre_install_cmd')
+ log.debug(pre_cmd)
+ if pre_cmd:
+ x = 1
+ for cmd in pre_cmd:
+ status, output = self.run(cmd)
+
+ if status != 0:
+ log.warn("An error occurred running '%s'" % cmd)
+
+ if callback is not None:
+ callback(cmd, "Pre-install step %d" % x)
+
+ x += 1
+
+ return True
+
+ else:
+ return False
+
+
+ def run_pre_depend(self, callback=None):
+ pre_cmd = self.get_distro_ver_data('pre_depend_cmd')
+ log.debug(pre_cmd)
+ if pre_cmd:
+ x = 1
+ for cmd in pre_cmd:
+ status, output = self.run(cmd)
+
+ if status != 0:
+ log.warn("An error occurred running '%s'" % cmd)
+
+ if callback is not None:
+ callback(cmd, "Pre-depend step %d" % x)
+
+ x += 1
+
+
+ def run_post_depend(self, callback=None):
+ post_cmd = self.get_distro_ver_data('post_depend_cmd')
+ log.debug(post_cmd)
+ if post_cmd:
+ x = 1
+ for cmd in post_cmd:
+ status, output = self.run(cmd)
+
+ if status != 0:
+ log.warn("An error occurred running '%s'" % cmd)
+
+ if callback is not None:
+ callback(cmd, "Post-depend step %d" % x)
+
+ x += 1
+
+
+ def run_open_mdns_port(self, callback=None):
+ open_mdns_port_cmd = self.get_distro_ver_data('open_mdns_port')
+ log.debug(open_mdns_port_cmd)
+ if open_mdns_port_cmd:
+ x = 1
+ for cmd in open_mdns_port_cmd:
+ cmd = self.su_sudo() % cmd
+ status, output = self.run(cmd)
+
+ if status != 0:
+ log.warn("An error occurred running '%s'" % cmd)
+ log.warn(output)
+
+ if callback is not None:
+ callback(cmd, "Open mDNS/Bonjour step %d" % x)
+
+ x += 1
+
+
+ def pre_build(self):
+ cmds = []
+ if self.get_distro_ver_data('fix_ppd_symlink', False):
+ cmds.append(self.su_sudo() % 'python ./installer/fix_symlink.py')
+
+ return cmds
+
+
+ def run_pre_build(self, callback=None):
+ x = 1
+ for cmd in self.pre_build():
+ status, output = self.run(cmd)
+ if callback is not None:
+ callback(cmd, "Pre-build step %d" % x)
+
+ x += 1
+
+
+ def run_post_build(self, callback=None):
+ x = 1
+ for cmd in self.post_build():
+ status, output = self.run(cmd)
+ if callback is not None:
+ callback(cmd, "Post-build step %d" % x)
+
+ x += 1
+
+
+ def post_build(self):
+ cmds = []
+ # Reload DBUS configuration if distro supports it and PolicyKit
+ # support installed
+ if self.reload_dbus and self.selected_options['policykit']:
+ cmds.append(self.su_sudo() % "sh /etc/init.d/dbus reload")
+ log.debug("Will reload DBUS configuration for PolicyKit support")
+
+ # Kill any running hpssd.py instance from a previous install
+ if self.check_hpssd():
+ pid = get_ps_pid('hpssd')
+ if pid:
+ kill = os.path.join(utils.which("kill"), "kill") + " %d" % pid
+ cmds.append(self.su_sudo() % kill)
+
+ # Add user to group if needed
+ # add_user_to_group=<usermod params> [TYPE_STRING] (leave empty for none) [ex. "-a -G sys" or "-G lp"]
+ add_user_to_group = self.get_distro_ver_data('add_user_to_group', '')
+ if add_user_to_group:
+ usermod = os.path.join(utils.which("usermod"), "usermod") + " %s %s" % (add_user_to_group, prop.username)
+ cmds.append(self.su_sudo() % usermod)
+
+ return cmds
+
+
+ def logoff(self):
+ ok = False
+ pkill = utils.which('pkill')
+ if pkill:
+ cmd = "%s -KILL -u %s" % (os.path.join(pkill, "pkill"), prop.username)
+ cmd = self.su_sudo() % cmd
+ status, output = self.run(cmd)
+
+ ok = (status == 0)
+
+ return ok
+
+
+ def restart(self):
+ ok = False
+ shutdown = utils.which('shutdown')
+ if shutdown:
+ cmd = "%s -r now" % (os.path.join(shutdown, "shutdown"))
+ cmd = self.su_sudo() % cmd
+ status, output = self.run(cmd)
+
+ ok = (status == 0)
+
+ return ok
+
+
+ def run_hp_setup(self):
+ status = 0
+ hpsetup = utils.which("hp-setup")
+
+ if hpsetup:
+ cmd = 'hp-setup'
+ else:
+ cmd = './setup.py'
+
+ log.debug(cmd)
+ status, output = self.run(cmd)
+ return status == 0
+
+
+ def remove_hplip(self, callback=None):
+ failed = True
+ self.stop_pre_2x_hplip(callback)
+
+ hplip_remove_cmd = self.get_distro_data('hplip_remove_cmd')
+ if hplip_remove_cmd:
+ if callback is not None:
+ callback(hplip_remove_cmd, "Removing old HPLIP version")
+
+ status, output = self.run(hplip_remove_cmd)
+
+ if status == 0:
+ self.hplip_present = self.check_hplip()
+
+ if not self.hplip_present:
+ failed = False
+
+ return failed
+
+
+ def stop_pre_2x_hplip(self, callback=None):
+ hplip_init_script = '/etc/init.d/hplip stop'
+ if os.path.exists(hplip_init_script):
+ cmd = self.su_sudo() % hplip_init_script
+
+ if callback is not None:
+ callback(cmd, "Stopping old HPLIP version.")
+
+ status, output = self.run(cmd)
+
+
+
+ def check_password(self, password_entry_callback, callback=None):
+ self.clear_su_sudo_password()
+ x = 1
+ while True:
+ self.password = password_entry_callback()
+ cmd = self.su_sudo() % "true"
+
+ log.debug(cmd)
+
+ status, output = self.run(cmd)
+
+ log.debug(status)
+ log.debug(output)
+
+ if status == 0:
+ if callback is not None:
+ callback("", "Password accepted")
+ return True
+
+ if callback is not None:
+ if "not in the sudoers file" in output:
+ callback("", "%s is not in the sudoers file. Check privileges\n" %(os.getenv('USER')) )
+ return False
+ else:
+ callback("", "Password incorrect. %d attempt(s) left." % (3-x ))
+
+
+ x += 1
+
+ if x > 3:
+ return False
+
+
+ def clear_su_sudo_password(self):
+ if self.su_sudo_str() == 'sudo':
+ log.debug("Clearing password...")
+ self.run("sudo -K")
+
+
+
+ # PLUGIN HELPERS
+
+ def set_plugin_version(self):
+ self.plugin_version = prop.installed_version
+ log.debug("Plug-in version=%s" % self.plugin_version)
+ self.plugin_name = 'hplip-%s-plugin.run' % self.plugin_version
+ log.debug("Plug-in=%s" % self.plugin_name)
+
+
+ def get_plugin_conf_url(self):
+ url = "http://hplip.sf.net/plugin.conf"
+ home = sys_conf.get('dirs', 'home')
+
+ if os.path.exists('/etc/hp/plugin.conf'):
+ url = "file:///etc/hp/plugin.conf"
+
+ elif os.path.exists(os.path.join(home, 'plugin.conf')):
+ url = "file://" + os.path.join(home, 'plugin.conf')
+
+ log.debug("Plugin.conf url: %s" % url)
+ return url
+
+
+ def get_plugin_info(self, plugin_conf_url, callback):
+ ok, size, checksum, timestamp, url = False, 0, 0, 0.0, ''
+
+ if not self.create_plugin_dir():
+ log.error("Could not create plug-in directory.")
+ return '', 0, 0, 0, False
+
+ local_conf_fp, local_conf = utils.make_temp_file()
+
+ #if os.path.exists(local_conf):
+ #os.remove(local_conf)
+
+ try:
+ try:
+ #filename, headers = urllib.urlretrieve(plugin_conf_url, local_conf, callback)
+ wget = utils.which("wget")
+ if wget:
+ wget = os.path.join(wget, "wget")
+ status, output = self.run("%s --timeout=60 --output-document=%s %s --cache=off" %(wget, local_conf, plugin_conf_url))
+ if status:
+ log.error("Plugin download failed with error code = %d" %status)
+ return '', 0, 0, 0, False
+ else:
+ log.error("Please install wget package to download the plugin.")
+ return '', 0, 0, 0, False
+ except IOError, e:
+ log.error("I/O Error: %s" % e.strerror)
+ return '', 0, 0, 0, False
+
+ if not os.path.exists(local_conf):
+ log.error("plugin.conf not found.")
+ return '', 0, 0, 0, False
+
+ plugin_conf_p = ConfigParser.ConfigParser()
+
+ try:
+ plugin_conf_p.read(local_conf)
+ except (ConfigParser.MissingSectionHeaderError, ConfigParser.ParsingError):
+ log.error("Error parsing file - 404 error?")
+ return '', 0, 0, 0, False
+
+ try:
+ url = plugin_conf_p.get(self.plugin_version, 'url')
+ size = plugin_conf_p.getint(self.plugin_version, 'size')
+ checksum = plugin_conf_p.get(self.plugin_version, 'checksum')
+ timestamp = plugin_conf_p.getfloat(self.plugin_version, 'timestamp')
+ ok = True
+ except (KeyError, ConfigParser.NoSectionError):
+ log.error("Error reading plugin.conf: Missing section [%s]" % self.plugin_version)
+ return '', 0, 0, 0, False
+
+ finally:
+ os.close(local_conf_fp)
+ os.remove(local_conf)
+
+ return url, size, checksum, timestamp, ok
+
+
+ def create_plugin_dir(self):
+ if not os.path.exists(self.plugin_path):
+ try:
+ log.debug("Creating plugin directory: %s" % self.plugin_path)
+ os.umask(0)
+ os.makedirs(self.plugin_path, 0755)
+ return True
+ except (OSError, IOError), e:
+ log.error("Unable to create directory: %s" % e.strerror)
+ return False
+
+ return True
+
+
+ def isErrorPage(self, page):
+ """
+ Example code from David Mertz' Text Processing in Python.
+ Released in the Public Domain.
+ """
+ err_score = 0.0
+
+ for pat, prob in err_pats.items():
+ if err_score > 0.9: break
+ if re.search(pat, page):
+ err_score += prob
+
+ log.debug("File error page score: %f" % (err_score))
+
+ return err_score > 0.50
+
+
+ def download_plugin(self, url, size, checksum, timestamp, callback=None):
+ log.debug("Downloading %s plug-in file from '%s' to '%s'..." % (self.plugin_version, url, self.plugin_path))
+
+ if not self.create_plugin_dir():
+ return PLUGIN_INSTALL_ERROR_DIRECTORY_ERROR, self.plugin_path
+
+ plugin_file = os.path.join(self.plugin_path, self.plugin_name)
+
+
+ #Check whether plugin is accessible in Openprinting.org website otherwise dowload plugin from alternate location.
+ wget = utils.which("wget")
+ if wget:
+ wget = os.path.join(wget, "wget")
+ cmd = "%s --cache=off -P %s %s" % (wget,self.plugin_path,url)
+ log.debug(cmd)
+ status, output = self.run(cmd)
+ log.debug("wget returned: %d" % status)
+
+ try:
+ if (status != 0) and 'file://' not in url:
+ url = os.path.join(PLUGIN_FALLBACK_LOCATION, self.plugin_name)
+ log.info("Plugin is not accessible. Trying to download it from fallback location: [%s]" % url)
+ cmd = "%s --cache=off -P %s %s" % (wget,self.plugin_path,url)
+ log.debug(cmd)
+ status, output = self.run(cmd)
+ if 'file://' in url:
+ filename, headers = urllib.urlretrieve(url, plugin_file, callback)
+ except IOError, e:
+ log.error("Plug-in download failed: %s" % e.strerror)
+ return PLUGIN_INSTALL_ERROR_PLUGIN_FILE_NOT_FOUND, e.strerror
+
+ if self.isErrorPage(file(plugin_file, 'r').read(1024)):
+ log.debug(file(plugin_file, 'r').read(1024))
+ os.remove(plugin_file)
+ return PLUGIN_INSTALL_ERROR_PLUGIN_FILE_NOT_FOUND, -1
+
+ calc_checksum = get_checksum(file(plugin_file, 'r').read())
+ log.debug("D/L file checksum=%s" % calc_checksum)
+
+ # Try to download and check the GPG digital signature
+ digsig_url = url + '.asc'
+ digsig_file = plugin_file + '.asc'
+
+ log.debug("Downloading %s plug-in digital signature file from '%s' to '%s'..." % (self.plugin_version, digsig_url, digsig_file))
+
+ try:
+ if 'file://' in url:
+ filename, headers = urllib.urlretrieve(digsig_url, digsig_file, callback)
+ else:
+ cmd = "%s --cache=off -P %s %s" % (wget,self.plugin_path,digsig_url)
+ log.debug(cmd)
+ status, output = self.run(cmd)
+ except IOError, e:
+ log.error("Plug-in GPG file [%s] download failed: %s" % (digsig_url,e.strerror))
+ return PLUGIN_INSTALL_ERROR_DIGITAL_SIG_NOT_FOUND, e.strerror
+
+ if self.isErrorPage(file(digsig_file, 'r').read(1024)):
+ log.debug(file(digsig_file, 'r').read())
+ os.remove(digsig_file)
+ return PLUGIN_INSTALL_ERROR_DIGITAL_SIG_NOT_FOUND, -1
+
+ gpg = utils.which('gpg')
+ if gpg:
+ gpg = os.path.join(gpg, 'gpg')
+ cmd = '%s --no-permission-warning --keyserver pgp.mit.edu --recv-keys 0xA59047B9' % gpg
+ log.info("Receiving digital keys: %s" % cmd)
+ status, output = self.run(cmd)
+ log.debug(output)
+
+ if status != 0:
+ return PLUGIN_INSTALL_ERROR_UNABLE_TO_RECV_KEYS, status
+
+ cmd = '%s --no-permission-warning --verify %s %s' % (gpg, digsig_file, plugin_file)
+ log.debug("Verifying plugin with digital keys: %s" % cmd)
+ status, output = self.run(cmd)
+ log.debug(output)
+ log.debug("%s status: %d" % (gpg, status))
+
+ if status != 0:
+ return PLUGIN_INSTALL_ERROR_DIGITAL_SIG_BAD, status
+
+
+ return PLUGIN_INSTALL_ERROR_NONE, plugin_file
+
+#
+# return value:
+# '-1' --> PLUGIN_VERSION_MISMATCH -->version mismatch
+# '0' --> PLUGIN_NOT_INSTALLED --> not installed
+# '1' --> PLUGIN_INSTALLED
+
+ def check_for_plugin(self):
+ sys_state.read()
+ plugin_state = sys_state.get('plugin', 'installed', PLUGIN_NOT_INSTALLED)
+ if plugin_state != PLUGIN_NOT_INSTALLED and self.check_plugin_version() is False:
+ log.debug("Plug-in version mismatch. Need to install plugin again")
+ plugin_state = PLUGIN_VERSION_MISMATCH
+ elif plugin_state == PLUGIN_INSTALLED:
+ log.debug("Plugin is installed")
+ else:
+ log.debug("Plugin is not installed")
+
+ # cross checking so files present or not.
+ if plugin_state != PLUGIN_NOT_INSTALLED:
+ Scan_sts =self.check_scanner_plugin_files()
+ Fax_sts = self.check_fax_plugin_files()
+ Prnt_sts = self.check_printer_plugin_files()
+ if Scan_sts!= PLUGIN_STATUS_FILES_PRESENT or Fax_sts!= PLUGIN_STATUS_FILES_PRESENT or Prnt_sts != PLUGIN_STATUS_FILES_PRESENT:
+ log.debug("Plug-in files might be corrupted. Re-install plug-in")
+ plugin_state = PLUGIN_VERSION_MISMATCH
+
+ return plugin_state
+
+ def check_plugin_version(self):
+ sys_state.read()
+ plugin_installed_version = sys_state.get('plugin','version', '0.0.0')
+ hplip_version = sys_conf.get('hplip', 'version', '0.0.0')
+ if plugin_installed_version == hplip_version:
+ return True
+ else:
+ return False
+
+
+
+ def check_printer_plugin_files(self):
+ ret_val = None
+ home = sys_conf.get('dirs', 'home')
+ printer_so_dir= home+"/prnt/plugins/"
+ ret_val = self.check_so_exists(printer_so_dir, 'lj.so', "Printer",ret_val)
+ return ret_val
+
+
+ def check_scanner_plugin_files(self):
+ ret_val = None
+ home = sys_conf.get('dirs', 'home')
+ scan_so_files_list =['bb_marvell.so' , 'bb_soapht.so' , 'bb_soap.so']
+
+ cnt=0
+ scanner_so_dir= home+'/scan/plugins/'
+ while cnt < len(scan_so_files_list):
+ ret_val = self.check_so_exists(scanner_so_dir, scan_so_files_list[cnt], "Scanner",ret_val)
+ cnt += 1
+ return ret_val
+
+
+
+ def check_fax_plugin_files(self):
+ ret_val = None
+ home = sys_conf.get('dirs', 'home')
+ fax_so_dir= home+"/fax/plugins/"
+ ret_val = self.check_so_exists(fax_so_dir,'fax_marvell.so' ,"Fax",ret_val)
+ return ret_val
+
+
+ def check_so_exists(self, sym_link_dir, so_file, functionType, Pre_ret_val):
+ ret_val = Pre_ret_val
+ sym_link_file = sym_link_dir + so_file
+ if not os.path.exists(sym_link_file):
+ log.debug("Either %s file is not present or symbolic link is missing: %s" %(functionType, sym_link_file))
+ user_conf.set(functionType+'_plugins', so_file,'Not_Found')
+ if ret_val == None:
+ ret_val= PLUGIN_STATUS_FILES_NOT_PRESENT
+ elif ret_val == PLUGIN_STATUS_FILES_PRESENT:
+ ret_val = PLUGIN_STATUS_PARTIAL_FILES_PRESENT
+ else:
+ # capturing real file path
+ if os.path.islink(sym_link_file):
+ real_file = os.path.realpath(sym_link_file)
+ else:
+ real_file = sym_link_file
+
+ if not os.path.exists(real_file):
+ log.debug("%s Plugin file is missing: %s" % (functionType, real_file))
+ user_conf.set(functionType+'_plugins', so_file,'Not_Found')
+ if ret_val == None:
+ ret_val= PLUGIN_STATUS_FILES_NOT_PRESENT
+ elif ret_val == PLUGIN_STATUS_FILES_PRESENT:
+ ret_val = PLUGIN_STATUS_PARTIAL_FILES_PRESENT
+ elif (os.stat(sym_link_file).st_mode & 72) != 72:
+ user_conf.set(functionType+'_plugins', so_file,'Permissin_Error')
+ log.debug("%s Plugin file doesn't have user/group execute permission: %s" % (functionType,sym_link_file))
+ if ret_val == None:
+ ret_val= PLUGIN_STATUS_FILES_NOT_PRESENT
+ elif ret_val == PLUGIN_STATUS_FILES_PRESENT:
+ ret_val = PLUGIN_STATUS_PARTIAL_FILES_PRESENT
+ else:
+ user_conf.set(functionType+'_plugins', so_file,'Present')
+ if ret_val == None:
+ ret_val= PLUGIN_STATUS_FILES_PRESENT
+ elif ret_val == PLUGIN_STATUS_FILES_NOT_PRESENT:
+ ret_val = PLUGIN_STATUS_PARTIAL_FILES_PRESENT
+
+ log.debug("%s Plug-in file %s status: %d" % (functionType, sym_link_file, ret_val))
+ return ret_val
+
+
+
+ def run_plugin(self, mode=GUI_MODE, callback=None):
+ plugin_file = os.path.join(self.plugin_path, self.plugin_name)
+
+ if not os.path.exists(plugin_file):
+ return False
+
+ if mode == GUI_MODE:
+ return os.system("sh %s --nox11 -- -u" % plugin_file) == 0
+ else:
+ if os.system("sh %s --nox11 -- -i" % plugin_file) == 0:
+ return True
+ else:
+ log.error("Python gobject/dbus may be not installed")
+ return False
+
+
+ def delete_plugin(self):
+ plugin_file = os.path.join(self.plugin_path, self.plugin_name)
+ digsig_file = plugin_file + ".asc"
+
+ if os.path.exists(plugin_file):
+ os.unlink(plugin_file)
+ if os.path.exists(digsig_file):
+ os.unlink(digsig_file)
+
+
+ def is_auto_installer_support(self):
+ if not self.distro_name:
+ self.get_distro()
+ self.distro_name = self.distros_index[self.distro]
+
+ if self.distro_name and self.distro_name in ("ubuntu","debian","suse","fedora"):
+ log.debug("Auto installation is supported for Distro =%s version =%s "%(self.distro_name, self.distro_version))
+ return True
+ else:
+ log.debug("Auto installation is not supported for Distro =%s version =%s "%(self.distro_name, self.distro_version))
+ return False
+
+
+ def uninstall(self,mode = INTERACTIVE_MODE, callback=None):
+ checkSudo = False
+ if os.getuid() != 0:
+ checkSudo = True
+# log.error("To run 'hp-uninstall' utility, you must have root privileges.")
+# return False
+
+ home_dir= sys_conf.get("dirs","home","")
+ version= sys_conf.get("hplip","version","0.0.0")
+ if home_dir is "":
+ log.error("HPLIP is not installed.")
+ return False
+
+ if mode != NON_INTERACTIVE_MODE:
+ ok,choice = tui.enter_choice("\nAre you sure to uninstall HPLIP-%s (y=yes, n=no*)?:" %version,['y','n'],'n')
+ if not ok or choice == 'n':
+ return False
+
+ hplip_remove_cmd = self.get_distro_data('hplip_remove_cmd')
+ log.debug("hplip_remove_cmd =%s "%hplip_remove_cmd)
+ #read conf file to enter into installed dir
+ log.info("Starting uninstallation...")
+
+ plugin_state = sys_state.get('plugin', 'installed', PLUGIN_NOT_INSTALLED)
+
+ # check systray is running?
+ status,output = utils.Is_Process_Running('hp-systray')
+ if status is True:
+ if mode != NON_INTERACTIVE_MODE:
+ ok,choice = tui.enter_choice("\nSome HPLIP applications are running. Press 'y' to close and proceed or Press 'n' to quit uninstall (y=yes*, n=no):",['y','n'],'y')
+ if not ok or choice =='n':
+ log.info("Quiting HPLIP unininstallation. Close application(s) manually and run again.")
+ return False
+
+ try:
+ from dbus import SystemBus, lowlevel
+ except ImportError:
+ log.error("Unable to load DBus")
+ pass
+ else:
+ try:
+ args = ['', '', EVENT_SYSTEMTRAY_EXIT, prop.username, 0, '', '']
+ msg = lowlevel.SignalMessage('/', 'com.hplip.StatusService', 'Event')
+ msg.append(signature='ssisiss', *args)
+ log.debug("Sending close message to hp-systray ...")
+ SystemBus().send_message(msg)
+ time.sleep(0.5)
+ except:
+ log.error("Failed to send DBus message to hp-systray/hp-toolbox.")
+ pass
+
+
+ toolbox_status,output = utils.Is_Process_Running('hp-toolbox')
+ systray_status,output = utils.Is_Process_Running('hp-systray')
+ if toolbox_status is True or systray_status is True:
+ log.error("Failed to close HP-Toolbox/HP-Systray. Close manually and run hp-uninstall again.")
+ return False
+
+ if hplip_remove_cmd:
+ self.remove_hplip(callback)
+
+ #removing .hplip directory
+ cmd='find /home -name .hplip'
+ if checkSudo:
+ cmd= self.su_sudo() %cmd
+
+ status, output=self.run(cmd)
+ if output is not None:
+ for p in output.splitlines():
+ if p.find("find:") != -1:
+ continue
+
+ cmd= RMDIR + " " + p
+ if checkSudo:
+ cmd= self.su_sudo() %cmd
+ log.debug("Removing .hplip folder cmd = %s " %cmd)
+ status, output=self.run(cmd)
+ if 0 != status:
+ log.debug("Failed to remove directory=%s "%p)
+
+ #remove the binaries and libraries
+ pat=re.compile(r"""(.*)share\/hplip""")
+ base =pat.match(home_dir)
+ usrbin_dir=None
+ if base is not None:
+ usrbin_dir= base.group(1) + "bin/"
+ usrlib_dir= base.group(1) + "lib/"
+ cnt = 0
+ while cnt <len (BINS_LIST ):
+ cmd = RM + " " + usrbin_dir + BINS_LIST[cnt]
+ if checkSudo:
+ cmd= self.su_sudo() %cmd
+
+ log.debug("Removing binaries cmd = %s " %cmd)
+ status, output=self.run(cmd)
+ if 0 != status:
+ log.debug("Failed to remove '%s' binary." %(usrbin_dir + BINS_LIST[cnt]))
+ cnt += 1
+
+ cnt =0
+ while cnt <len (LIBS_LIST ):
+ cmd = RM + " " + usrlib_dir + LIBS_LIST[cnt]
+ if checkSudo:
+ cmd= self.su_sudo() %cmd
+
+ log.debug("Removing library cmd = %s " %cmd)
+ status, output=self.run(cmd)
+ if 0 != status:
+ log.debug("Failed to remove '%s' library." %(usrlib_dir + LIBS_LIST[cnt]))
+ cnt += 1
+
+
+ remove_plugins = False
+ if mode != NON_INTERACTIVE_MODE and plugin_state != PLUGIN_NOT_INSTALLED:
+ ok,choice = tui.enter_choice("\nDo you want to remove HP proprietary plug-ins (y=yes*, n=no)?:",['y','n'],'y')
+ if ok and choice =='y':
+ remove_plugins = True
+ else:
+ remove_plugins = True
+
+ # removing HPLIP installed directories/files
+ cnt =0
+ while cnt < len(HPLIP_LIST):
+ cmd=RMDIR + " " + home_dir+"/"+HPLIP_LIST[cnt]
+ if checkSudo:
+ cmd= self.su_sudo() %cmd
+
+ log.debug("Removing hplip directory/file cmd= %s " %cmd)
+ status, output=self.run(cmd)
+ if 0 != status:
+ log.debug("Failed to remove hplip directory/file=%s "% (home_dir+"/"+HPLIP_LIST[cnt]))
+ cnt +=1
+
+ # removing configuration files
+ cnt= 0
+ while cnt < len(FILES_LIST):
+ cmd = RMDIR + " " + FILES_LIST[cnt]
+ if checkSudo:
+ cmd= self.su_sudo() %cmd
+ log.debug("Removing conf files cmd= %s" %(cmd))
+ status, output=self.run(cmd)
+ if 0 != status:
+ log.debug("Failed to remove '%s' file" %FILES_LIST[cnt])
+ cnt += 1
+ # removing Plug-in files
+ if remove_plugins == True:
+ cnt =0
+ while cnt < len(PLUGIN_LIST):
+ cmd=RMDIR + " " + home_dir+"/"+PLUGIN_LIST[cnt]
+ if checkSudo:
+ cmd= self.su_sudo() %cmd
+
+ log.debug("Removing hplip Plug-in files cmd= %s " %cmd)
+ status, output=self.run(cmd)
+ if 0 != status:
+ log.debug("Failed to remove plug-in directory/file=%s "% (home_dir+"/"+PLUGIN_LIST[cnt]))
+ cnt += 1
+
+ cnt =0
+ while cnt < len(PLUGIN_STATE):
+ cmd=RMDIR + " "+PLUGIN_STATE[cnt]
+ if checkSudo:
+ cmd= self.su_sudo() %cmd
+
+ log.debug("Removing hplip Plug-in file cmd= %s " %cmd)
+ status, output=self.run(cmd)
+ if 0 != status:
+ log.debug("Failed to remove plug-in directory/file=%s "% (PLUGIN_STATE[cnt]))
+ cnt += 1
+
+ cmd =RMDIR+ " "+home_dir
+ if checkSudo:
+ cmd= self.su_sudo() %cmd
+
+ log.debug("Removing hplip directory/file cmd= %s " %cmd)
+ status, output=self.run(cmd)
+ if 0 != status:
+ log.debug("Failed to remove hplip directory=%s "% (home_dir))
+
+ # removing HPLIP uninstall link
+ if usrbin_dir is not None:
+ cmd=RMDIR + " " + usrbin_dir+"hp-uninstall"
+ if checkSudo:
+ cmd= self.su_sudo() %cmd
+
+ log.debug("Removing hplip binary cmd= %s " %cmd)
+ status, output=self.run(cmd)
+ if 0 != status:
+ log.debug("Failed to remove '%s' file" %(usrbin_dir+"hp-uninstall"))
+ log.info("HPLIP uninstallation is completed")
+ return True
+
diff --git a/installer/dcheck.py b/installer/dcheck.py
new file mode 100644
index 0000000..e973759
--- /dev/null
+++ b/installer/dcheck.py
@@ -0,0 +1,223 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2007 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+# Std Lib
+import os
+import os.path
+import re
+import sys
+
+# Local
+from base.g import *
+from base import utils
+
+
+ver_pat = re.compile("""(\d+.\d+)""", re.IGNORECASE)
+proc_pat = re.compile(r"""(\d+)""", re.I)
+
+ld_output = ''
+#ps_output = ''
+mod_output = ''
+
+
+
+def update_ld_output():
+ # For library checks
+ global ld_output
+ status, ld_output = utils.run('%s -p' % os.path.join(utils.which('ldconfig'), 'ldconfig'), log_output=False)
+
+ if status != 0:
+ log.debug("ldconfig failed.")
+
+def check_tool(cmd, min_ver=0.0):
+ log.debug("Checking: %s (min ver=%f)" % (cmd, min_ver))
+ status, output = utils.run(cmd)
+
+ if status != 0:
+ log.debug("Not found!")
+ return False
+ else:
+ if min_ver:
+ try:
+ line = output.splitlines()[0]
+ except IndexError:
+ line = ''
+ log.debug(line)
+ match_obj = ver_pat.search(line)
+ try:
+ ver = match_obj.group(1)
+ except AttributeError:
+ ver = ''
+
+ try:
+ v_f = float(ver)
+ except ValueError:
+ return False
+ else:
+ log.debug("Ver=%f Min ver=%f" % (v_f, min_ver))
+
+ if v_f < min_ver:
+ log.debug("Found, but newer version required.")
+
+ return v_f >= min_ver
+ else:
+ log.debug("Found.")
+ return True
+
+
+def check_lib(lib, min_ver=0):
+ log.debug("Checking for library '%s'..." % lib)
+
+ if ld_output.find(lib) >= 0:
+ log.debug("Found.")
+
+ #if min_ver:
+ # pass
+ #else:
+ return True
+ else:
+ log.debug("Not found.")
+ return False
+
+def check_file(f, dir="/usr/include"):
+ log.debug("Searching for file '%s' in '%s'..." % (f, dir))
+ for w in utils.walkFiles(dir, recurse=True, abs_paths=True, return_folders=False, pattern=f):
+ log.debug("File found at '%s'" % w)
+ return True
+
+ log.debug("File not found.")
+ return False
+
+
+def locate_files(f, dir):
+ log.debug("Searching for file(s) '%s' in '%s'..." % (f, dir))
+ found = []
+ for w in utils.walkFiles(dir, recurse=True, abs_paths=True, return_folders=False, pattern=f):
+ log.debug(w)
+ found.append(w)
+
+ if found:
+ log.debug("Found files: %s" % found)
+ else:
+ log.debug("No files not found.")
+
+ return found
+
+def locate_file_contains(f, dir, s):
+ """
+ Find a list of files located in a directory
+ that contain a specified sub-string.
+ """
+ log.debug("Searching for file(s) '%s' in '%s' that contain '%s'..." % (f, dir, s))
+ found = []
+ for w in utils.walkFiles(dir, recurse=True, abs_paths=True, return_folders=False, pattern=f):
+
+ if check_file_contains(w, s):
+ log.debug(w)
+ found.append(w)
+
+ if found:
+ log.debug("Found files: %s" % found)
+ else:
+ log.debug("No files not found.")
+
+ return found
+
+def check_file_contains(f, s):
+ log.debug("Checking file '%s' for contents '%s'..." % (f, s))
+ try:
+ if os.path.exists(f):
+ for a in file(f, 'r'):
+ update_spinner()
+
+ if s in a:
+ log.debug("'%s' found in file '%s'." % (s.replace('\n', ''), f))
+ return True
+
+ log.debug("Contents not found.")
+ return False
+
+ finally:
+ cleanup_spinner()
+
+
+def get_process_list():
+ processes = [] # (pid, cmdline), ...
+ for x in utils.walkFiles("/proc", False, True, True):
+ s = proc_pat.search(x)
+ if s is not None:
+ try:
+ cmdline = file(os.path.join(x, 'cmdline'), 'r').read().replace('\x00', '').replace('\n', '').strip()
+ except IOError:
+ cmdline = None
+
+ if cmdline:
+ processes.append((int(s.group(1)), cmdline))
+
+ return processes
+
+
+def check_ps(process_list):
+ log.debug("Searching any process(es) '%s' in running processes..." % process_list)
+ processes = get_process_list()
+
+ try:
+ for pid, cmdline in processes:
+ update_spinner()
+ for p in process_list:
+ if p in cmdline:
+ log.debug("'%s' found." % cmdline)
+ return True
+
+ log.debug("Not found")
+ return False
+
+ finally:
+ cleanup_spinner()
+
+
+def get_ps_pid(process):
+ log.debug("Searching for the PID for process '%s' in running processes..." % process)
+ processes = get_process_list()
+
+ try:
+ for pid, cmdline in processes:
+ update_spinner()
+ if process in cmdline:
+ log.debug("'%s' found." % cmdline)
+ return pid
+
+ log.debug("Not found")
+ return 0
+
+ finally:
+ cleanup_spinner()
+
+
+def check_lsmod(module):
+ global mod_output
+
+ if not mod_output:
+ lsmod = utils.which('lsmod')
+ status, mod_output = utils.run(os.path.join(lsmod, 'lsmod'), log_output=False)
+
+ return mod_output.find(module) >= 0
diff --git a/installer/distros.dat b/installer/distros.dat
new file mode 100644
index 0000000..a5cc3bc
--- /dev/null
+++ b/installer/distros.dat
@@ -0,0 +1,8963 @@
+# (c) Copyright 2003-2009 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# ****************************************
+#
+# [TYPE_BOOL] : T | F | 0 | 1 (not case sensitive)
+# [TYPE_INT] : integer value
+# [TYPE_LIST]: <string>,... (no spaces between values/commas)
+# [TYPE_STRING]: string value (commas are not significant)
+#
+# ****************************************
+# [distros]
+# distros=<list of distro names> [TYPE_LIST]
+#
+# [<distro name>]
+# index=<n> # Must be unique [TYPE_INT]
+# versions=<list of version names> [TYPE_LIST]
+# display_name=<human readable display name> [TYPE_STRING]
+# alt_names=<alternate names to search for in /etc/issue> [TYPE_LIST]
+# display=1|0 [TYPE_BOOL]
+# notes=<distro notes> [TYPE_STRING]
+# package_mgrs=<package managers to search for in ps> [TYPE_LIST]
+# package_mgr_cmd=<command to install packages, list replaced in $packages_to_install> [TYPE_STRING]
+# pre_install_cmd=<commands to run before installer checks dependencies (comma sep. list)> [TYPE_LIST]
+# pre_depend_cmd=<commands to run before packages are installed (comma sep. list)> [TYPE_LIST]
+# post_depend_cmd=<commands to run after packages are installed (comma sep. list)> [TYPE_LIST]
+# hplip_remove_cmd=<command to remove package version of hplip> [TYPE_LIST]
+# su_sudo=su|sudo [TYPE_STRING] # su is default
+# ppd_install=ppd|drv [TYPE_STRING] # ppd is default
+# udev_mode_fix=1|0 [TYPE_BOOL]
+# ppd_dir=<ppd dir> [TYPE_STRING] # Used for BOTH ppd and drv install types
+# drv_dir=<drv dir> [TYPE_STRING] # Used for only drv installs
+# fix_ppd_symlink=1|0 [TYPE_BOOL]
+# ui_toolkit=qt3|qt4|gtk|none [TYPE_STRING] # gtk not supported. qt3 not supported by installer.
+# policykit=1|0 [TYPE_BOOL]
+# native_cups=1|0 [TYPE_BOOL]
+# package_available=1|0 [TYPE_BOOL]
+# package_arch=<list of processor architectures> [TYPE_LIST]
+# add_user_to_group=<usermod params> [TYPE_STRING] (leave empty for none) [ex. "-a -G sys" or "-G lp"]
+# open_mdns_port=<command(s) to use to open the mdns multicast port 5353> [TYPE_LIST]
+# acl_rules=1|0 [TYPE_BOOL] # For Karmic+
+#
+# # Version data overrides distro data if present.
+# # <version name> must be present in [<distro name>] section's versions= list.
+# [<distro name>:<version name>]
+# code_name=<code name> [TYPE_STRING]
+# supported=1|0 [TYPE_BOOL]
+# release_date=<human readable date YYYY-MM-DD> [TYPE_STRING]
+# notes=<version notes> [TYPE_STRING]
+# ppd_install=ppd|drv [TYPE_STRING] # ppd is default
+# udev_mode_fix=1|0 [TYPE_BOOL]
+# ppd_dir=<ppd dir> [TYPE_STRING] # Used for BOTH ppd and drv install types
+# drv_dir=<drv dir> [TYPE_STRING] # Used for only drv installs
+# fix_ppd_symlink=1|0 [TYPE_BOOL]
+# scan_supported=1|0 [TYPE_BOOL]
+# fax_supported=1|0 [TYPE_BOOL]
+# pcard_supported=1|0 [TYPE_BOOL]
+# network_supported=1|0 [TYPE_BOOL]
+# parallel_supported=1|0 [TYPE_BOOL]
+# usb_supported=1|0 [TYPE_BOOL]
+# packaged_version=<hplip version major.year.month> [TYPE_STRING] (version of HPLIP pre-packaged in distro, e.g. "2.8.12")
+# cups_path_with_bitness=1|0 [TYPE_BOOL] (False is default)
+# ui_toolkit=qt3|qt4|gtk|none [TYPE_STRING]
+# foomatic_rip_hplip=1|0 [TYPE_BOOL] (False is default)
+# policykit=1|0 [TYPE_BOOL]
+# native_cups=1|0 [TYPE_BOOL]
+# package_available=1|0 [TYPE_BOOL]
+# package_arch=<list of processor architectures> [TYPE_LIST]
+# add_user_to_group=<usermod params> [TYPE_STRING] (leave empty for none) [ex. "-a -G sys" or "-G lp"]
+# open_mdns_port=<command(s) to use to open the mdns multicast port 5353> [TYPE_LIST]
+# acl_rules=1|0 [TYPE_BOOL] # For Karmic+
+# libdir_path=<lib directory path> [TYPE_STRING] # Used if libdir location is to be provided in 64 bit machines
+
+# # Only include these sections if supported==1 for this <distro name>:<version name>.
+# [<distro name>:<version name>:<dependency name>]
+# packages=<package list to satisfy dependency (comma sep. list)> [TYPE_LIST]
+# commands=<command list to satisfy dependency (comma sep. list)> [TYPE_LIST]
+#
+# ****************************************
+
+[distros]
+distros=unknown,mepis,debian,suse,mandriva,fedora,redhat,rhel,slackware,gentoo,redflag,ubuntu,xandros,freebsd,linspire,ark,pclinuxos,centos,igos,linuxmint,linpus,gos,boss,lfs
+
+# ****************************************
+
+[unknown]
+index=0
+display_name=Unknown
+versions=0
+display=0
+package_mgrs=
+su_sudo=
+drv_dir=
+
+[unknown:0]
+supported=0
+
+# ****************************************
+
+[suse]
+index=3
+versions=11.4,12.1
+display_name=SUSE Linux
+alt_names=
+display=1
+notes=
+package_mgrs=yast,yast2,opensuse-updater,zypper
+package_mgr_cmd=su -c "zypper --non-interactive --no-gpg-checks in --auto-agree-with-licenses $packages_to_install"
+pre_depend_cmd=
+post_depend_cmd=
+hplip_remove_cmd=su -c "zypper --non-interactive rm hplip"
+su_sudo=su
+ppd_install=ppd
+udev_mode_fix=1
+ppd_dir=/usr/share/cups/model/manufacturer-PPDs/hp
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+
+# ********************
+[suse:11.1]
+code_name=
+supported=1
+scan_supported=1
+fax_supported=1
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=2.8.7
+release_date=2008-06-19
+notes=Please be sure to disable the CD repositories in YaST and after installation you must log out and back in to become a member of the lp group to enable printing.
+ppd_install=drv
+udev_mode_fix=1
+ppd_dir=/usr/share/cups/model/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+cups_path_with_bitness=1
+ui_toolkit=qt4
+native_cups=1
+add_user_to_group=-Alp
+open_mdns_port=/bin/bash ./init-suse-firewall
+
+[suse:11.1:cups]
+packages=cups,cups-client
+
+[suse:11.1:cups-devel]
+packages=cups-devel,cupsddk
+
+[suse:11.1:gcc]
+packages=gcc-c++
+
+[suse:11.1:gs]
+packages=ghostscript-library
+
+[suse:11.1:libcrypto]
+packages=openssl
+
+[suse:11.1:libjpeg]
+packages=libjpeg-devel
+
+[suse:11.1:libnetsnmp-devel]
+packages=net-snmp-devel
+
+[suse:11.1:libpthread]
+packages=glibc
+
+[suse:11.1:libtool]
+packages=libtool,libgphoto2-devel
+
+[suse:11.1:libusb]
+packages=libusb-devel,libusb-1_0-0
+
+[suse:11.1:make]
+packages=make
+
+[suse:11.1:pil]
+packages=python-imaging
+
+[suse:11.1:ppdev]
+packages=
+commands=su -c "modprobe ppdev"
+
+[suse:11.1:pyqt]
+packages=python-qt
+
+[suse:11.1:pyqt4]
+packages=python-qt4
+
+[suse:11.1:pyqt4-dbus]
+packages=dbus-1-python-devel,dbus-1-python
+
+[suse:11.1:python-devel]
+packages=python-devel,python-xml
+
+[suse:11.1:python23]
+packages=python
+
+[suse:11.1:python2x]
+packages=python
+
+[suse:11.1:reportlab]
+packages=
+
+[suse:11.1:sane]
+packages=sane
+
+[suse:11.1:sane-devel]
+packages=sane-backends
+
+[suse:11.1:scanimage]
+packages=sane-backends
+
+[suse:11.1:xsane]
+packages=xsane,sane-frontends
+
+[suse:11.1:cups-ddk]
+packages=cupsddk
+
+[suse:11.1:python-dbus]
+packages=dbus-1-python
+
+[suse:11.1:dbus]
+packages=dbus-1-devel,python-gobject2
+
+[suse:11.1:python-ctypes]
+packages=python-ctypes
+
+[suse:11.1:python-xml]
+packages=python-xml
+
+[suse:11.1:cups-image]
+packages=cups-devel
+
+[suse:11.1:python-notify]
+packages=
+
+# ********************
+[suse:11.2]
+code_name=
+supported=1
+scan_supported=1
+fax_supported=1
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=3.9.8
+release_date=2009-11-12
+notes=Please be sure to disable the CD repositories in YaST and after installation you must log out and back in to become a member of the lp group to enable printing.
+ppd_install=drv
+udev_mode_fix=1
+ppd_dir=/usr/share/cups/model/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+cups_path_with_bitness=1
+ui_toolkit=qt4
+native_cups=1
+add_user_to_group=-Alp
+open_mdns_port=/bin/bash ./init-suse-firewall
+pre_depend_cmd=su -c "zypper refresh"
+
+[suse:11.2:cups]
+packages=cups,cups-client
+
+[suse:11.2:cups-devel]
+packages=cups-devel,cupsddk
+
+[suse:11.2:gcc]
+packages=gcc-c++
+
+[suse:11.2:gs]
+packages=ghostscript-library
+
+[suse:11.2:libcrypto]
+packages=openssl
+
+[suse:11.2:libjpeg]
+packages=libjpeg-devel
+
+[suse:11.2:libnetsnmp-devel]
+packages=net-snmp-devel
+
+[suse:11.2:libpthread]
+packages=glibc
+
+[suse:11.2:libtool]
+packages=libtool,libgphoto2-devel
+
+[suse:11.2:libusb]
+packages=libusb-1_0-devel,libusb-1_0-0
+
+[suse:11.2:make]
+packages=make
+
+[suse:11.2:pil]
+packages=python-imaging
+
+[suse:11.2:ppdev]
+packages=
+commands=su -c "modprobe ppdev"
+
+[suse:11.2:pyqt]
+packages=python-qt
+
+[suse:11.2:pyqt4]
+packages=python-qt4
+
+[suse:11.2:pyqt4-dbus]
+packages=dbus-1-python-devel,dbus-1-python
+
+[suse:11.2:python-devel]
+packages=python-devel,python-xml
+
+[suse:11.2:python23]
+packages=python
+
+[suse:11.2:python2x]
+packages=python
+
+[suse:11.2:reportlab]
+packages=
+
+[suse:11.2:sane]
+packages=sane
+
+[suse:11.2:sane-devel]
+packages=sane-backends
+
+[suse:11.2:scanimage]
+packages=sane-backends
+
+[suse:11.2:xsane]
+packages=xsane,sane-frontends
+
+[suse:11.2:cups-ddk]
+packages=cupsddk
+
+[suse:11.2:python-dbus]
+packages=dbus-1-python
+
+[suse:11.2:dbus]
+packages=dbus-1-devel,python-gobject2
+
+[suse:11.2:python-xml]
+packages=python-xml
+
+[suse:11.2:cups-image]
+packages=cups-devel
+
+[suse:11.2:python-notify]
+packages=python-notify
+
+# ********************
+[suse:11.3]
+code_name=Rousseau
+supported=1
+scan_supported=1
+fax_supported=1
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=3.10.2
+release_date=2010-15-7
+notes=Please be sure to disable the CD repositories in YaST and after installation you must log out and back in to become a member of the lp and sys group to enable printing.
+ppd_install=drv
+udev_mode_fix=1
+ppd_dir=/usr/share/cups/model/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+cups_path_with_bitness=0
+ui_toolkit=qt4
+native_cups=1
+add_user_to_group= -Gsys,lp
+open_mdns_port=/bin/bash ./init-suse-firewall
+pre_depend_cmd=su -c "zypper refresh"
+
+[suse:11.3:cups]
+packages=cups,cups-client
+
+[suse:11.3:cups-devel]
+packages=cups-devel,cupsddk
+
+[suse:11.3:gcc]
+packages=gcc-c++
+
+[suse:11.3:gs]
+packages=ghostscript-library
+
+[suse:11.3:libcrypto]
+packages=openssl
+
+[suse:11.3:libjpeg]
+packages=libjpeg-devel
+
+[suse:11.3:libnetsnmp-devel]
+packages=net-snmp-devel
+
+[suse:11.3:libpthread]
+packages=glibc
+
+[suse:11.3:libtool]
+packages=libtool,libgphoto2-devel
+
+[suse:11.3:libusb]
+packages=libusb-1_0-devel,libusb-1_0-0
+
+[suse:11.3:make]
+packages=make
+
+[suse:11.3:pil]
+packages=python-imaging
+
+[suse:11.3:ppdev]
+packages=
+commands=su -c "modprobe ppdev"
+
+[suse:11.3:pyqt]
+packages=python-qt
+
+[suse:11.3:pyqt4]
+packages=python-qt4
+
+[suse:11.3:pyqt4-dbus]
+packages=dbus-1-python-devel,dbus-1-python
+
+[suse:11.3:python-devel]
+packages=python-devel,python-xml
+
+[suse:11.3:python23]
+packages=python
+
+[suse:11.3:python2x]
+packages=python
+
+[suse:11.3:reportlab]
+packages=
+
+[suse:11.3:sane]
+packages=xsane
+
+[suse:11.3:sane-devel]
+packages=sane-backends
+
+[suse:11.3:scanimage]
+packages=sane-backends
+
+[suse:11.3:xsane]
+packages=xsane
+
+[suse:11.3:cups-ddk]
+packages=cupsddk
+
+[suse:11.3:python-dbus]
+packages=dbus-1-python
+
+[suse:11.3:dbus]
+packages=dbus-1-devel,python-gobject2
+
+[suse:11.3:python-xml]
+packages=python-xml
+
+[suse:11.3:cups-image]
+packages=cups-devel
+
+[suse:11.3:python-notify]
+packages=python-notify
+
+# ********************
+[suse:11.4]
+code_name=Celadon
+supported=1
+scan_supported=1
+fax_supported=1
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=3.11.3
+release_date=2011-10-03
+notes=Please be sure to disable the CD repositories in YaST and after installation you must log out and back in to become a member of the lp and sys group to enable printing.
+ppd_install=drv
+udev_mode_fix=1
+ppd_dir=/usr/share/cups/model/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+cups_path_with_bitness=0
+ui_toolkit=qt4
+native_cups=1
+add_user_to_group= -Gsys,lp
+open_mdns_port=/bin/bash ./init-suse-firewall
+pre_depend_cmd=su -c "zypper refresh"
+
+[suse:11.4:cups]
+packages=cups,cups-client
+
+[suse:11.4:cups-devel]
+packages=cups-devel,cupsddk
+
+[suse:11.4:gcc]
+packages=gcc-c++
+
+[suse:11.4:gs]
+packages=ghostscript-library
+
+[suse:11.4:libcrypto]
+packages=openssl
+
+[suse:11.4:libjpeg]
+packages=libjpeg-devel
+
+[suse:11.4:libnetsnmp-devel]
+packages=net-snmp-devel
+
+[suse:11.4:libpthread]
+packages=glibc
+
+[suse:11.4:libtool]
+packages=libtool,libgphoto2-devel
+
+[suse:11.4:libusb]
+packages=libusb-1_0-devel,libusb-1_0-0
+
+[suse:11.4:make]
+packages=make
+
+[suse:11.4:pil]
+packages=python-imaging
+
+[suse:11.4:ppdev]
+packages=
+commands=su -c "modprobe ppdev"
+
+[suse:11.4:pyqt]
+packages=python-qt
+
+[suse:11.4:pyqt4]
+packages=python-qt4
+
+[suse:11.4:pyqt4-dbus]
+packages=dbus-1-python-devel,dbus-1-python
+
+[suse:11.4:python-devel]
+packages=python-devel,python-xml
+
+[suse:11.4:python23]
+packages=python
+
+[suse:11.4:python2x]
+packages=python
+
+[suse:11.4:reportlab]
+packages=
+
+[suse:11.4:sane]
+packages=xsane
+
+[suse:11.4:sane-devel]
+packages=sane-backends-devel
+
+[suse:11.4:scanimage]
+packages=sane-backends
+
+[suse:11.4:xsane]
+packages=xsane
+
+[suse:11.4:cups-ddk]
+packages=cupsddk
+
+[suse:11.4:python-dbus]
+packages=dbus-1-python
+
+[suse:11.4:dbus]
+packages=dbus-1-devel,python-gobject2
+
+[suse:11.4:python-xml]
+packages=python-xml
+
+[suse:11.4:cups-image]
+packages=cups-devel
+
+[suse:11.4:python-notify]
+packages=python-notify
+
+# ********************
+[suse:12.1]
+code_name=
+supported=1
+scan_supported=1
+fax_supported=1
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=3.11.3
+release_date=2011-11-16
+notes=Please be sure to disable the CD repositories in YaST and after installation you must log out and back in to become a member of the lp and sys group to enable printing.
+ppd_install=drv
+udev_mode_fix=1
+ppd_dir=/usr/share/cups/model/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+cups_path_with_bitness=0
+ui_toolkit=qt4
+native_cups=1
+add_user_to_group= -Gsys,lp
+open_mdns_port=/bin/bash ./init-suse-firewall
+pre_depend_cmd=su -c "zypper refresh"
+same_as_version=11.4
+
+# ****************************************
+[redhat]
+index=6
+versions=8.0,9.0
+display_name=Red Hat
+alt_names=
+display=1
+notes=
+package_mgrs=yum,rpm,up2date
+package_mgr_cmd=rpm install $packages_to_install
+pre_depend_cmd=
+post_depend_cmd=
+hplip_remove_cmd=su -c 'rpm -ev hplipfull'
+su_sudo=su
+ppd_install=ppd
+udev_mode_fix=1
+ppd_dir=
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt3
+
+# ********************
+[redhat:8.0]
+code_name=Psyche
+supported=0
+scan_supported=1
+fax_supported=0
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=
+release_date=2002-9-1
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=none
+
+# ********************
+[redhat:9.0]
+code_name=Shrike
+supported=0
+scan_supported=1
+fax_supported=0
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=
+release_date=2003-3-1
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=none
+
+# ****************************************
+[turbolinux]
+index=10
+versions=any
+display_name=Turbolinux
+alt_names=
+display=0
+notes=
+package_mgrs=
+package_mgr_cmd=
+pre_depend_cmd=
+post_depend_cmd=
+hplip_remove_cmd=
+su_sudo=su
+ppd_install=ppd
+udev_mode_fix=1
+ppd_dir=
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt3
+
+# ********************
+[turbolinux:any]
+code_name=
+supported=0
+scan_supported=1
+fax_supported=1
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=
+release_date=
+notes=
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt3
+
+# ****************************************
+[redflag]
+index=11
+versions=any
+display_name=Red Flag Linux
+alt_names=
+display=0
+notes=
+package_mgrs=
+package_mgr_cmd=
+pre_depend_cmd=
+post_depend_cmd=
+hplip_remove_cmd=
+su_sudo=su
+ppd_install=ppd
+udev_mode_fix=1
+ppd_dir=
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt3
+
+# ********************
+[redflag:any]
+code_name=
+supported=0
+scan_supported=1
+fax_supported=0
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=
+release_date=
+notes=
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt3
+
+# ****************************************
+[ark]
+index=16
+versions=any
+display_name=Ark Linux
+alt_names=
+display=0
+notes=
+package_mgrs=
+package_mgr_cmd=
+pre_depend_cmd=
+post_depend_cmd=
+hplip_remove_cmd=
+su_sudo=su
+ppd_install=ppd
+udev_mode_fix=1
+ppd_dir=
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt3
+
+# ********************
+[ark:any]
+code_name=
+supported=0
+scan_supported=1
+fax_supported=0
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=
+release_date=
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt3
+
+# ****************************************
+[sunwah]
+index=20
+versions=any
+display_name=Sun Wah RAYS LX
+alt_names=
+display=0
+notes=
+package_mgrs=
+package_mgr_cmd=
+pre_depend_cmd=
+post_depend_cmd=
+hplip_remove_cmd=
+su_sudo=su
+ppd_install=ppd
+udev_mode_fix=1
+ppd_dir=
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt3
+
+# ********************
+[sunwah:any]
+code_name=
+supported=0
+scan_supported=1
+fax_supported=0
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=
+release_date=
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt3
+
+# ****************************************
+[fedora]
+index=5
+versions=15,16
+display_name=Fedora
+alt_names=Fedora Core
+display=1
+notes=SELinux must run in permissive mode or it must be disabled for HPLIP to function properly. Please run SELinux in permissive mode or disable it before continuing.
+package_mgrs=yum,rpm,up2date
+package_mgr_cmd=su -c "yum -y -d 10 -e 1 install $packages_to_install"
+pre_depend_cmd=su -c "yum clean all"
+post_depend_cmd=
+hplip_remove_cmd=su -c "yum -y -d 10 -e 1 remove hplip"
+su_sudo=su
+ppd_install=ppd
+udev_mode_fix=1
+ppd_dir=/usr/share/cups/model/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+
+# ********************
+[fedora:1.0]
+code_name=Yarrow
+supported=0
+scan_supported=1
+fax_supported=0
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=
+release_date=2003-11-5
+notes=
+ppd_install=ppd
+udev_mode_fix=1
+ppd_dir=
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt3
+
+# ********************
+[fedora:2.0]
+code_name=Tettnang
+supported=0
+scan_supported=1
+fax_supported=0
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=
+release_date=2004-5-18
+notes=
+ppd_install=ppd
+udev_mode_fix=1
+ppd_dir=
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt3
+
+# ********************
+[fedora:3.0]
+code_name=Heidelberg
+supported=0
+scan_supported=1
+fax_supported=0
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=
+release_date=2004-11-8
+notes=
+ppd_install=ppd
+udev_mode_fix=1
+ppd_dir=/usr/share/cups/model/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt3
+
+[fedora:3.0:cups]
+packages=cups
+
+[fedora:3.0:cups-devel]
+packages=cups-devel
+
+[fedora:3.0:gcc]
+packages=gcc-c++
+
+[fedora:3.0:gs]
+packages=ghostscript
+
+[fedora:3.0:libcrypto]
+packages=net-snmp-devel,openssl-devel
+
+[fedora:3.0:libjpeg]
+packages=libjpeg-devel
+
+[fedora:3.0:libnetsnmp-devel]
+packages=net-snmp-devel
+
+[fedora:3.0:libpthread]
+packages=glibc-headers
+
+[fedora:3.0:libtool]
+packages=libtool
+
+[fedora:3.0:libusb]
+packages=libusb-devel
+
+[fedora:3.0:make]
+packages=make
+
+[fedora:3.0:pil]
+packages=python-imaging
+
+[fedora:3.0:ppdev]
+packages=
+commands=su -c "/sbin/modprobe ppdev"
+
+[fedora:3.0:pyqt]
+packages=sip,PyQt
+
+[fedora:3.0:python-devel]
+packages=python-devel
+
+[fedora:3.0:pyqt4]
+packages=
+
+[fedora:3.0:pyqt4-dbus]
+packages=
+
+[fedora:3.0:python23]
+packages=python
+
+[fedora:3.0:python2x]
+packages=python
+
+[fedora:3.0:reportlab]
+packages=python-reportlab
+
+[fedora:3.0:sane]
+packages=sane-backends
+
+[fedora:3.0:sane-devel]
+packages=sane-devel
+
+[fedora:3.0:scanimage]
+packages=sane-frontends
+
+[fedora:3.0:xsane]
+packages=xsane
+
+[fedora:3.0:cups-ddk]
+packages=
+
+[fedora:3.0:python-dbus]
+# packages=dbus-python,dbus-devel,python-gobject
+
+[fedora:3.0:python-ctypes]
+# packages=python-ctypes
+
+[fedora:3.0:cups-image]
+packages=cups-devel
+
+# ********************
+[fedora:4.0]
+code_name=Stentz
+supported=0
+scan_supported=1
+fax_supported=0
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=0.9.7
+release_date=2005-6-13
+notes=
+ppd_install=ppd
+udev_mode_fix=1
+ppd_dir=/usr/share/cups/model/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt3
+
+[fedora:4.0:cups]
+packages=cups
+
+[fedora:4.0:cups-devel]
+packages=cups-devel
+
+[fedora:4.0:gcc]
+packages=gcc-c++
+
+[fedora:4.0:gs]
+packages=ghostscript
+
+[fedora:4.0:libcrypto]
+packages=net-snmp-devel,openssl-devel
+
+[fedora:4.0:libjpeg]
+packages=libjpeg-devel
+
+[fedora:4.0:libnetsnmp-devel]
+packages=net-snmp-devel
+
+[fedora:4.0:libpthread]
+packages=glibc-headers
+
+[fedora:4.0:libtool]
+packages=libtool
+
+[fedora:4.0:libusb]
+packages=libusb-devel
+
+[fedora:4.0:make]
+packages=make
+
+[fedora:4.0:pil]
+packages=python-imaging
+
+[fedora:4.0:ppdev]
+packages=
+commands=su -c "/sbin/modprobe ppdev"
+
+[fedora:4.0:pyqt]
+packages=PyQt
+
+[fedora:4.0:python-devel]
+packages=python-devel
+
+[fedora:4.0:pyqt4]
+packages=PyQt4
+
+[fedora:4.0:pyqt4-dbus]
+packages=dbus-python
+
+[fedora:4.0:python23]
+packages=python
+
+[fedora:4.0:python2x]
+packages=python
+
+[fedora:4.0:reportlab]
+packages=python-reportlab
+
+[fedora:4.0:sane]
+packages=sane-backends
+
+[fedora:4.0:sane-devel]
+packages=sane-devel
+
+[fedora:4.0:scanimage]
+packages=sane-frontends
+
+[fedora:4.0:xsane]
+packages=xsane
+
+[fedora:4.0:cups-ddk]
+packages=
+
+[fedora:4.0:python-dbus]
+# packages=dbus-python,dbus-devel,python-gobject
+
+[fedora:4.0:python-ctypes]
+# packages=python-ctypes
+
+[fedora:4.0:cups-image]
+packages=cups-devel
+
+# ********************
+[fedora:5]
+code_name=Bordeaux
+supported=0
+scan_supported=1
+fax_supported=0
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=0.9.11
+release_date=2006-3-20
+notes=
+ppd_install=ppd
+udev_mode_fix=1
+ppd_dir=/usr/share/cups/model/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt3
+
+[fedora:5:cups]
+packages=cups
+
+[fedora:5:cups-devel]
+packages=cups-devel
+
+[fedora:5:gcc]
+packages=gcc-c++
+
+[fedora:5:gs]
+packages=ghostscript
+
+[fedora:5:libcrypto]
+packages=net-snmp-devel,openssl-devel
+
+[fedora:5:libjpeg]
+packages=libjpeg-devel
+
+[fedora:5:libnetsnmp-devel]
+packages=net-snmp-devel
+
+[fedora:5:libpthread]
+packages=glibc-headers
+
+[fedora:5:libtool]
+packages=libtool
+
+[fedora:5:libusb]
+packages=libusb-devel
+
+[fedora:5:make]
+packages=make
+
+[fedora:5:pil]
+packages=python-imaging
+
+[fedora:5:ppdev]
+packages=
+commands=su -c "/sbin/modprobe ppdev"
+
+[fedora:5:pyqt]
+packages=PyQt
+
+[fedora:5:python-devel]
+packages=python-devel
+
+[fedora:5:pyqt4]
+packages=PyQt4
+
+[fedora:5.0:pyqt4-dbus]
+packages=dbus-python
+
+[fedora:5:python23]
+packages=python
+
+[fedora:5:python2x]
+packages=python
+
+[fedora:5:reportlab]
+packages=python-reportlab
+
+[fedora:5:sane]
+packages=sane-backends
+
+[fedora:5:sane-devel]
+packages=sane-devel
+
+[fedora:5:scanimage]
+packages=sane-frontends
+
+[fedora:5:xsane]
+packages=xsane
+
+[fedora:5:cups-ddk]
+# packages=cupsddk,cupsddk-drivers,cupsddk-devel
+
+[fedora:5:python-dbus]
+# packages=dbus-python,dbus-devel,python-gobject
+
+[fedora:5:python-ctypes]
+# packages=python-ctypes
+
+[fedora:5:cups-image]
+packages=cups-devel
+
+# ********************
+[fedora:5.0]
+same_as_version=5
+
+# ********************
+[fedora:5.92]
+code_name=RC3
+supported=0
+scan_supported=1
+fax_supported=0
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=0.9.11
+release_date=2006-10-24
+notes=
+ppd_install=ppd
+udev_mode_fix=1
+ppd_dir=/usr/share/cups/model/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt3
+
+[fedora:5.92:cups]
+packages=cups
+
+[fedora:5.92:cups-devel]
+packages=cups-devel
+
+[fedora:5.92:gcc]
+packages=gcc-c++
+
+[fedora:5.92:gs]
+packages=ghostscript
+
+[fedora:5.92:libcrypto]
+packages=net-snmp-devel,openssl-devel
+
+[fedora:5.92:libjpeg]
+packages=libjpeg-devel
+
+[fedora:5.92:libnetsnmp-devel]
+packages=net-snmp-devel
+
+[fedora:5.92:libpthread]
+packages=glibc-headers
+
+[fedora:5.92:libtool]
+packages=libtool
+
+[fedora:5.92:libusb]
+packages=libusb-devel
+
+[fedora:5.92:make]
+packages=make
+
+[fedora:5.92:pil]
+packages=python-imaging
+
+[fedora:5.92:ppdev]
+packages=
+commands=su -c "/sbin/modprobe ppdev"
+
+[fedora:5.92:pyqt]
+packages=PyQt
+
+[fedora:5.92:python-devel]
+packages=python-devel
+
+[fedora:5.92:pyqt4]
+packages=PyQt4
+
+[fedora:5.92:pyqt4-dbus]
+packages=dbus-python
+
+[fedora:5.92:python23]
+packages=python
+
+[fedora:5.92:python2x]
+packages=python
+
+[fedora:5.92:reportlab]
+packages=python-reportlab
+
+[fedora:5.92:sane]
+packages=sane-backends
+
+[fedora:5.92:sane-devel]
+packages=sane-devel
+
+[fedora:5.92:scanimage]
+packages=sane-frontends
+
+[fedora:5.92:xsane]
+packages=xsane
+
+[fedora:5.92:cups-ddk]
+packages=
+
+[fedora:5.92:python-dbus]
+# packages=dbus-python,dbus-devel,python-gobject
+
+[fedora:5.92:python-ctypes]
+# packages=python-ctypes
+
+[fedora:5.92:cups-image]
+packages=cups-devel
+
+# ********************
+[fedora:6]
+code_name=
+supported=0
+scan_supported=1
+fax_supported=0
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=1.7.2
+release_date=2006-10-24
+notes=
+ppd_install=drv
+udev_mode_fix=1
+ppd_dir=/usr/share/cups/model/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt3
+
+[fedora:6:cups]
+packages=cups
+
+[fedora:6:cups-devel]
+packages=cups-devel
+
+[fedora:6:gcc]
+packages=gcc-c++
+
+[fedora:6:gs]
+packages=ghostscript
+
+[fedora:6:libcrypto]
+packages=net-snmp-devel,openssl-devel
+
+[fedora:6:libjpeg]
+packages=libjpeg-devel
+
+[fedora:6:libnetsnmp-devel]
+packages=net-snmp-devel
+
+[fedora:6:libpthread]
+packages=glibc-headers
+
+[fedora:6:libtool]
+packages=libtool
+
+[fedora:6:libusb]
+packages=libusb-devel
+
+[fedora:6:make]
+packages=make
+
+[fedora:6:pil]
+packages=python-imaging
+
+[fedora:6:ppdev]
+packages=
+commands=su -c "/sbin/modprobe ppdev"
+
+[fedora:6:pyqt]
+packages=PyQt
+
+[fedora:6:python-devel]
+packages=python-devel
+
+[fedora:6:pyqt4]
+packages=PyQt4
+
+[fedora:6:pyqt4-dbus]
+packages=dbus-python
+
+[fedora:6:python23]
+packages=python
+
+[fedora:6:python2x]
+packages=python
+
+[fedora:6:reportlab]
+packages=python-reportlab
+
+[fedora:6:sane]
+packages=sane-backends
+
+[fedora:6:sane-devel]
+packages=sane-devel,sane-backends-devel
+
+[fedora:6:scanimage]
+packages=sane-frontends
+
+[fedora:6:xsane]
+packages=xsane
+
+[fedora:6:cups-ddk]
+packages=cupsddk,cupsddk-drivers,cupsddk-devel
+
+[fedora:6::python-dbus]
+# packages=dbus-python,dbus-devel,python-gobject
+
+[fedora:6:python-ctypes]
+# packages=python-ctypes
+
+[fedora:6:cups-image]
+packages=cups-devel
+
+# ********************
+[fedora:6.0]
+same_as_version= 6
+
+# ********************
+[fedora:7]
+code_name=
+supported=0
+scan_supported=1
+fax_supported=1
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=1.7.4a
+release_date=2007-5-31
+notes=
+ppd_install=drv
+udev_mode_fix=1
+ppd_dir=/usr/share/cups/model/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt3
+
+[fedora:7:cups]
+packages=cups
+
+[fedora:7:cups-devel]
+packages=cups-devel
+
+[fedora:7:gcc]
+packages=gcc-c++
+
+[fedora:7:gs]
+packages=ghostscript
+
+[fedora:7:libcrypto]
+packages=openssl-devel
+
+[fedora:7:libjpeg]
+packages=libjpeg-devel
+
+[fedora:7:libnetsnmp-devel]
+packages=net-snmp-devel
+
+[fedora:7:libpthread]
+packages=glibc-headers
+
+[fedora:7:libtool]
+packages=libtool
+
+[fedora:7:libusb]
+packages=libusb-devel
+
+[fedora:7:make]
+packages=make
+
+[fedora:7:pil]
+packages=python-imaging
+
+[fedora:7:ppdev]
+packages=
+commands=su -c "/sbin/modprobe ppdev"
+
+[fedora:7:pyqt]
+packages=PyQt
+
+[fedora:7:python-devel]
+packages=python-devel
+
+[fedora:7:pyqt4]
+packages=PyQt4,dbus-python
+
+[fedora:7:pyqt4-dbus]
+packages=dbus-python
+
+[fedora:7:python23]
+packages=python
+
+[fedora:7:python2x]
+packages=python
+
+[fedora:7:reportlab]
+packages=python-reportlab
+
+[fedora:7:sane]
+packages=sane-backends
+
+[fedora:7:sane-devel]
+packages=sane-backends-devel
+
+[fedora:7:scanimage]
+packages=sane-frontends
+
+[fedora:7:xsane]
+packages=xsane
+
+[fedora:7:cups-ddk]
+packages=cupsddk,cupsddk-drivers,cupsddk-devel
+
+[fedora:7:python-dbus]
+packages=dbus-python,python-gobject
+
+[fedora:7:dbus]
+packages=dbus-devel
+
+[fedora:7:python-ctypes]
+packages=python-ctypes
+
+[fedora:7:cups-image]
+packages=cups-devel
+
+# ********************
+[fedora:7.0]
+same_as_version= 7
+
+# ********************
+[fedora:8]
+code_name=
+supported=0
+scan_supported=1
+fax_supported=1
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=2.8.2
+release_date=2007-11-8
+notes=
+ppd_install=drv
+udev_mode_fix=1
+ppd_dir=/usr/share/cups/model/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt3
+native_cups=1
+
+[fedora:8:cups]
+packages=cups
+
+[fedora:8:cups-devel]
+packages=cups-devel
+
+[fedora:8:gcc]
+packages=gcc-c++
+
+[fedora:8:gs]
+packages=ghostscript
+
+[fedora:8:libcrypto]
+packages=openssl-devel
+
+[fedora:8:libjpeg]
+packages=libjpeg-devel
+
+[fedora:8:libnetsnmp-devel]
+packages=net-snmp-devel
+
+[fedora:8:libpthread]
+packages=glibc-headers
+
+[fedora:8:libtool]
+packages=libtool
+
+[fedora:8:libusb]
+packages=libusb-devel
+
+[fedora:8:make]
+packages=make
+
+[fedora:8:pil]
+packages=python-imaging
+
+[fedora:8:ppdev]
+packages=
+commands=su -c "/sbin/modprobe ppdev"
+
+[fedora:8:pyqt]
+packages=PyQt
+
+[fedora:8:python-devel]
+packages=python-devel
+
+[fedora:8:pyqt4]
+packages=PyQt
+
+[fedora:8:pyqt4-dbus]
+packages=dbus-python
+
+[fedora:8:python23]
+packages=python
+
+[fedora:8:python2x]
+packages=python
+
+[fedora:8:reportlab]
+packages=python-reportlab
+
+[fedora:8:sane]
+packages=sane-backends
+
+[fedora:8:sane-devel]
+packages=sane-backends-devel
+
+[fedora:8:scanimage]
+packages=sane-frontends
+
+[fedora:8:xsane]
+packages=xsane
+
+[fedora:8:cups-ddk]
+packages=cupsddk,cupsddk-drivers,cupsddk-devel
+
+[fedora:8:python-dbus]
+packages=dbus-python
+
+[fedora:8:dbus]
+packages=dbus-devel,pygobject2
+
+[fedora:8:python-ctypes]
+packages=python-ctypes
+
+[fedora:8:cups-image]
+packages=cups-devel
+
+# ********************
+[fedora:8.0]
+same_as_version= 8
+
+# ********************
+[fedora:9]
+code_name=sulphur
+supported=0
+scan_supported=1
+fax_supported=1
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=2.8.6
+release_date=2008-05-13
+notes=
+ppd_install=drv
+udev_mode_fix=1
+ppd_dir=/usr/share/cups/model/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt4
+native_cups=1
+
+[fedora:9:cups]
+packages=cups
+
+[fedora:9:cups-devel]
+packages=cups-devel
+
+[fedora:9:gcc]
+packages=gcc-c++
+
+[fedora:9:gs]
+packages=ghostscript
+
+[fedora:9:libcrypto]
+packages=openssl-devel
+
+[fedora:9:libjpeg]
+packages=libjpeg-devel
+
+[fedora:9:libnetsnmp-devel]
+packages=net-snmp-devel
+
+[fedora:9:libpthread]
+packages=glibc-headers
+
+[fedora:9:libtool]
+packages=libtool
+
+[fedora:9:libusb]
+packages=libusb-devel
+
+[fedora:9:make]
+packages=make
+
+[fedora:9:pil]
+packages=python-imaging
+
+[fedora:9:ppdev]
+packages=
+commands=su -c "/sbin/modprobe ppdev"
+
+[fedora:9:pyqt]
+packages=PyQt
+
+[fedora:9:python-devel]
+packages=python-devel
+
+[fedora:9:pyqt4]
+packages=PyQt4
+
+[fedora:9:pyqt4-dbus]
+packages=dbus-python
+
+[fedora:9:python23]
+packages=python
+
+[fedora:9:python2x]
+packages=python
+
+[fedora:9:reportlab]
+packages=python-reportlab
+
+[fedora:9:sane]
+packages=sane-backends
+
+[fedora:9:sane-devel]
+packages=sane-backends-devel
+
+[fedora:9:scanimage]
+packages=sane-frontends
+
+[fedora:9:xsane]
+packages=xsane
+
+[fedora:9:cups-ddk]
+packages=cupsddk,cupsddk-drivers,cupsddk-devel
+
+[fedora:9:python-dbus]
+packages=dbus-python,python-gobject
+
+[fedora:9:dbus]
+packages=dbus-devel
+
+[fedora:9:python-ctypes]
+packages=python-ctypes
+
+[fedora:9:cups-image]
+packages=cups-devel
+
+[fedora:9:python-notify]
+packages=notify-python
+
+# ********************
+[fedora:9.0]
+same_as_version= 9
+
+# ********************
+[fedora:10]
+code_name=sulphur
+supported=0
+scan_supported=1
+fax_supported=1
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=2.8.7
+release_date=2009-11-25
+notes=To complete the install in Fedora 10 you must quit the installer at the printer setup stage, log out, log back in, and run hp-setup.
+ppd_install=drv
+udev_mode_fix=1
+ppd_dir=/usr/share/cups/model/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt4
+native_cups=1
+add_user_to_group=-a -Gsys,lp
+open_mdns_port=/bin/bash ./init-iptables-firewall
+
+[fedora:10:cups]
+packages=cups
+
+[fedora:10:cups-devel]
+packages=cups-devel
+
+[fedora:10:gcc]
+packages=gcc-c++
+
+[fedora:10:gs]
+packages=ghostscript
+
+[fedora:10:libcrypto]
+packages=openssl-devel
+
+[fedora:10:libjpeg]
+packages=libjpeg-devel
+
+[fedora:10:libnetsnmp-devel]
+packages=net-snmp-devel
+
+[fedora:10:libpthread]
+packages=glibc-headers
+
+[fedora:10:libtool]
+packages=libtool
+
+[fedora:10:libusb]
+packages=libusb-devel
+
+[fedora:10:make]
+packages=make
+
+[fedora:10:pil]
+packages=python-imaging
+
+[fedora:10:ppdev]
+packages=
+commands=su -c "/sbin/modprobe ppdev"
+
+[fedora:10:pyqt]
+packages=PyQt
+
+[fedora:10:python-devel]
+packages=python-devel
+
+[fedora:10:pyqt4]
+packages=PyQt4
+
+[fedora:10:pyqt4-dbus]
+packages=dbus-python
+
+[fedora:10:python23]
+packages=python
+
+[fedora:10:python2x]
+packages=python
+
+[fedora:10:reportlab]
+packages=python-reportlab
+
+[fedora:10:sane]
+packages=sane-backends
+
+[fedora:10:sane-devel]
+packages=sane-backends-devel
+
+[fedora:10:scanimage]
+packages=sane-frontends
+
+[fedora:10:xsane]
+packages=xsane
+
+[fedora:10:cups-ddk]
+packages=cupsddk,cupsddk-drivers,cupsddk-devel
+
+[fedora:10:python-dbus]
+packages=dbus-python,python-gobject
+
+[fedora:10:dbus]
+packages=dbus-devel
+
+[fedora:10:python-ctypes]
+packages=python-ctypes
+
+[fedora:10:cups-image]
+packages=cups-devel
+
+[fedora:10:policykit]
+packages=PolicyKit,PolicyKit-gnome
+
+[fedora:10:python-notify]
+packages=notify-python
+
+# ********************
+[fedora:10.0]
+same_as_version= 10
+
+# ********************
+[fedora:11]
+code_name=
+supported=0
+scan_supported=1
+fax_supported=1
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=
+release_date=
+notes=To complete the install in Fedora 11 you must quit the installer at the printer setup stage, log out, log back in, and run hp-setup.
+ppd_install=drv
+udev_mode_fix=1
+ppd_dir=/usr/share/cups/model/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt4
+policykit=1
+native_cups=1
+add_user_to_group=-a -Gsys,lp
+open_mdns_port=/bin/bash ./init-iptables-firewall
+
+[fedora:11:cups]
+packages=cups
+
+[fedora:11:cups-devel]
+packages=cups-devel
+
+[fedora:11:gcc]
+packages=gcc-c++
+
+[fedora:11:gs]
+packages=ghostscript
+
+[fedora:11:libcrypto]
+packages=openssl-devel
+
+[fedora:11:libjpeg]
+packages=libjpeg-devel
+
+[fedora:11:libnetsnmp-devel]
+packages=net-snmp-devel
+
+[fedora:11:libpthread]
+packages=glibc-headers
+
+[fedora:11:libtool]
+packages=libtool
+
+[fedora:11:libusb]
+packages=libusb-devel
+
+[fedora:11:make]
+packages=make
+
+[fedora:11:pil]
+packages=python-imaging
+
+[fedora:11:ppdev]
+packages=
+commands=su -c "/sbin/modprobe ppdev"
+
+[fedora:11:pyqt]
+packages=PyQt
+
+[fedora:11:python-devel]
+packages=python-devel
+
+[fedora:11:pyqt4]
+packages=PyQt4
+
+[fedora:11:pyqt4-dbus]
+packages=dbus-python
+
+[fedora:11:python23]
+packages=python
+
+[fedora:11:python2x]
+packages=python
+
+[fedora:11:reportlab]
+packages=python-reportlab
+
+[fedora:11:sane]
+packages=sane-backends
+
+[fedora:11:sane-devel]
+packages=sane-backends-devel
+
+[fedora:11:scanimage]
+packages=sane-frontends
+
+[fedora:11:xsane]
+packages=xsane
+
+[fedora:11:cups-ddk]
+packages=cupsddk,cupsddk-drivers,cupsddk-devel
+
+[fedora:11:python-dbus]
+packages=dbus-python,python-gobject
+
+[fedora:11:dbus]
+packages=dbus-devel
+
+[fedora:11:python-ctypes]
+packages=python-ctypes
+
+[fedora:11:cups-image]
+packages=cups-devel
+
+[fedora:11:policykit]
+packages=PolicyKit,PolicyKit-gnome
+
+[fedora:11:python-notify]
+packages=notify-python
+
+# ********************
+[fedora:11.0]
+same_as_version= 11
+
+# ********************
+[fedora:13]
+code_name=
+supported=1
+scan_supported=1
+fax_supported=1
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=
+release_date=
+notes=To complete the install in Fedora 13 or 14 you must quit the installer at the printer setup stage, log out, log back in, and run hp-setup.
+ppd_install=drv
+udev_mode_fix=1
+ppd_dir=/usr/share/cups/model/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt4
+policykit=0
+native_cups=1
+add_user_to_group=-a -Gsys,lp
+open_mdns_port=/bin/bash ./init-iptables-firewall
+pre_depend_cmd=su -c "yum clean all"
+
+[fedora:13:cups]
+packages=cups
+
+[fedora:13:cups-devel]
+packages=cups-devel
+
+[fedora:13:gcc]
+packages=gcc-c++
+
+[fedora:13:gs]
+packages=ghostscript
+
+[fedora:13:libcrypto]
+packages=openssl-devel
+
+[fedora:13:libjpeg]
+packages=libjpeg-devel
+
+[fedora:13:libnetsnmp-devel]
+packages=net-snmp-devel
+
+[fedora:13:libpthread]
+packages=glibc-headers
+
+[fedora:13:libtool]
+packages=libtool
+
+[fedora:13:libusb]
+packages=libusb-devel
+
+[fedora:13:make]
+packages=make
+
+[fedora:13:pil]
+packages=python-imaging
+
+[fedora:13:ppdev]
+packages=
+commands=su -c "/sbin/modprobe ppdev"
+
+[fedora:13:pyqt]
+packages=PyQt
+
+[fedora:13:python-devel]
+packages=python-devel
+
+[fedora:13:pyqt4]
+packages=PyQt4
+
+[fedora:13:pyqt4-dbus]
+packages=dbus-python
+
+[fedora:13:python23]
+packages=python
+
+[fedora:13:python2x]
+packages=python
+
+[fedora:13:reportlab]
+packages=python-reportlab
+
+[fedora:13:sane]
+packages=sane-backends
+
+[fedora:13:sane-devel]
+packages=sane-backends-devel
+
+[fedora:13:scanimage]
+packages=sane-frontends
+
+[fedora:13:xsane]
+packages=xsane
+
+[fedora:13:python-dbus]
+packages=dbus-python,pygobject2
+
+[fedora:13:dbus]
+packages=dbus-devel
+
+[fedora:13:cups-image]
+packages=cups-devel
+
+[fedora:13:python-notify]
+packages=notify-python
+
+[fedora:13:policykit]
+packages=polkit,polkit-gnome
+
+# ********************
+[fedora:14]
+code_name=
+supported=1
+scan_supported=1
+fax_supported=1
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=
+release_date=
+notes=To complete the install in Fedora 13 or 14 you must quit the installer at the printer setup stage, log out, log back in, and run hp-setup.
+ppd_install=drv
+udev_mode_fix=1
+ppd_dir=/usr/share/cups/model/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt4
+policykit=0
+native_cups=1
+add_user_to_group=-a -Gsys,lp
+open_mdns_port=/bin/bash ./init-iptables-firewall
+pre_depend_cmd=su -c "yum clean all"
+
+[fedora:14:cups]
+packages=cups
+
+[fedora:14:cups-devel]
+packages=cups-devel
+
+[fedora:14:gcc]
+packages=gcc-c++
+
+[fedora:14:gs]
+packages=ghostscript
+
+[fedora:14:libcrypto]
+packages=openssl-devel
+
+[fedora:14:libjpeg]
+packages=libjpeg-devel
+
+[fedora:14:libnetsnmp-devel]
+packages=net-snmp-devel
+
+[fedora:14:libpthread]
+packages=glibc-headers
+
+[fedora:14:libtool]
+packages=libtool
+
+[fedora:14:libusb]
+packages=libusb-devel
+
+[fedora:14:make]
+packages=make
+
+[fedora:14:pil]
+packages=python-imaging
+
+[fedora:14:ppdev]
+packages=
+commands=su -c "/sbin/modprobe ppdev"
+
+[fedora:14:pyqt]
+packages=PyQt
+
+[fedora:14:python-devel]
+packages=python-devel
+
+[fedora:14:pyqt4]
+packages=PyQt4
+
+[fedora:14:pyqt4-dbus]
+packages=dbus-python
+
+[fedora:14:python23]
+packages=python
+
+[fedora:14:python2x]
+packages=python
+
+[fedora:14:reportlab]
+packages=python-reportlab
+
+[fedora:14:sane]
+packages=sane-backends
+
+[fedora:14:sane-devel]
+packages=sane-backends-devel
+
+[fedora:14:scanimage]
+packages=sane-frontends
+
+[fedora:14:xsane]
+packages=xsane
+
+[fedora:14:python-dbus]
+packages=dbus-python,pygobject2
+
+[fedora:14:dbus]
+packages=dbus-devel
+
+[fedora:14:cups-image]
+packages=cups-devel
+
+[fedora:14:python-notify]
+packages=notify-python
+
+[fedora:14:policykit]
+packages=polkit,polkit-gnome
+
+# ********************
+[fedora:15]
+code_name=Lovelock
+supported=1
+scan_supported=1
+fax_supported=1
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=3.11.3a
+release_date=24/05/2011
+notes=To complete the install in Fedora 15 you must quit the installer at the printer setup stage, log out, log back in, and run hp-setup.
+ppd_install=drv
+udev_mode_fix=1
+ppd_dir=/usr/share/cups/model/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt4
+policykit=0
+native_cups=1
+add_user_to_group=-a -Gsys,lp
+open_mdns_port=/bin/bash ./init-iptables-firewall
+pre_depend_cmd=su -c "yum clean all"
+
+[fedora:15:cups]
+packages=cups
+
+[fedora:15:cups-devel]
+packages=cups-devel
+
+[fedora:15:gcc]
+packages=gcc-c++
+
+[fedora:15:gs]
+packages=ghostscript
+
+[fedora:15:libcrypto]
+packages=openssl-devel
+
+[fedora:15:libjpeg]
+packages=libjpeg-devel
+
+[fedora:15:libnetsnmp-devel]
+packages=net-snmp-devel
+
+[fedora:15:libpthread]
+packages=glibc-headers
+
+[fedora:15:libtool]
+packages=libtool
+
+[fedora:15:libusb]
+packages=libusb-devel
+
+[fedora:15:make]
+packages=make
+
+[fedora:15:pil]
+packages=python-imaging
+
+[fedora:15:ppdev]
+packages=
+commands=su -c "/sbin/modprobe ppdev"
+
+[fedora:15:pyqt]
+packages=PyQt
+
+[fedora:15:python-devel]
+packages=python-devel
+
+[fedora:15:pyqt4]
+packages=PyQt4
+
+[fedora:15:pyqt4-dbus]
+packages=dbus-python
+
+[fedora:15:python23]
+packages=python
+
+[fedora:15:python2x]
+packages=python
+
+[fedora:15:reportlab]
+packages=python-reportlab
+
+[fedora:15:sane]
+packages=sane-backends
+
+[fedora:15:sane-devel]
+packages=sane-backends-devel
+
+[fedora:15:scanimage]
+packages=sane-frontends
+
+[fedora:15:xsane]
+packages=xsane
+
+[fedora:15:python-dbus]
+packages=dbus-python,pygobject2
+
+[fedora:15:dbus]
+packages=dbus-devel
+
+[fedora:15:cups-image]
+packages=cups-devel
+
+[fedora:15:python-notify]
+packages=notify-python
+
+[fedora:15:policykit]
+packages=polkit,polkit-gnome
+
+# ********************
+[fedora:16]
+code_name=Verne
+supported=1
+scan_supported=1
+fax_supported=1
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=3.11.3a
+release_date=24/05/2011
+notes=To complete the install in Fedora 15 you must quit the installer at the printer setup stage, log out, log back in, and run hp-setup.
+ppd_install=drv
+udev_mode_fix=1
+ppd_dir=/usr/share/cups/model/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt4
+policykit=0
+native_cups=1
+add_user_to_group=-a -Gsys,lp
+open_mdns_port=/bin/bash ./init-iptables-firewall
+pre_depend_cmd=su -c "yum clean all"
+same_as_version=15
+
+# ****************************************
+[linspire]
+index=15
+versions=5.0
+display_name=Linspire
+alt_names=
+display=0
+notes=The installer will uncomment out several Debian repositories to complete the installation. This may pull in packages that are incompatible with Linspire and may cause CNR to stop working.
+package_mgrs=apt-get
+package_mgr_cmd=su -c "apt-get install --yes $packages_to_install"
+pre_depend_cmd=su -c "cp -f /etc/apt/sources.list /etc/apt/sources.hplip,echo deb ftp://mirrors.kernel.org/debian/ sid main contrib non-free | sudo tee -a /etc/apt/sources.list,echo deb-src ftp://mirrors.kernel.org/debian/ sid main contrib non-free | sudo tee -a /etc/apt/sources.list,su -c "apt-get update"
+post_depend_cmd=
+hplip_remove_cmd=su -c "apt-get remove hplip hpijs"
+su_sudo=su
+ppd_install=ppd
+udev_mode_fix=1
+ppd_dir=/usr/share/cups/model/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+
+# ********************
+[linspire:5.0]
+code_name=Linspire
+supported=0
+scan_supported=1
+fax_supported=0
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=
+release_date=
+notes=
+ppd_install=ppd
+udev_mode_fix=1
+ppd_dir=/usr/share/cups/model/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt3
+
+# ****************************************
+[rhel]
+index=7
+versions=5.0,6.0
+display_name=Red Hat Enterprise Linux
+alt_names=red hat enterprise linux
+display=1
+notes=
+package_mgrs=yum,rpm,up2date
+package_mgr_cmd=rpm install $packages_to_install
+pre_depend_cmd=
+post_depend_cmd=
+hplip_remove_cmd=su -c 'rpm -ev hplipfull'
+su_sudo=su
+ppd_install=ppd
+udev_mode_fix=1
+ppd_dir=/usr/share/cups/model/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+
+# ********************
+[rhel:5.0]
+code_name=
+supported=0
+scan_supported=1
+fax_supported=0
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=1.6.7
+release_date=
+notes=
+ppd_install=
+udev_mode_fix=1
+ppd_dir=/usr/share/cups/model/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt3
+package_available=1
+package_arch=i386,x86_64
+
+# ********************
+[rhel:6.0]
+code_name=Santiago
+supported=0
+scan_supported=1
+fax_supported=0
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=1.6.7
+release_date=
+notes=
+ppd_install=
+udev_mode_fix=1
+ppd_dir=/usr/share/cups/model/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt4
+package_available=1
+package_arch=i686,x86_64
+
+# ****************************************
+[slackware]
+index=8
+versions=9.0,9.1,10.0,10.1,10.2,11,12,12.1
+display_name=Slackware Linux
+alt_names=
+display=0
+notes=
+package_mgrs=
+package_mgr_cmd=
+pre_depend_cmd=
+post_depend_cmd=
+hplip_remove_cmd=
+su_sudo=su
+ppd_install=ppd
+udev_mode_fix=1
+ppd_dir=/usr/share/ppd/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+
+# ********************
+[slackware:9.0]
+code_name=
+supported=0
+scan_supported=0
+fax_supported=0
+pcard_supported=0
+network_supported=0
+parallel_supported=0
+usb_supported=0
+packaged_version=
+release_date=2003-3-19
+notes=
+ppd_install=ppd
+udev_mode_fix=1
+ppd_dir=/usr/share/ppd/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=none
+
+# ********************
+[slackware:9.1]
+code_name=
+supported=0
+scan_supported=0
+fax_supported=0
+pcard_supported=0
+network_supported=0
+parallel_supported=0
+usb_supported=0
+packaged_version=
+release_date=2003-9-26
+notes=
+ppd_install=ppd
+udev_mode_fix=1
+ppd_dir=/usr/share/ppd/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=none
+
+# ********************
+[slackware:10.0]
+code_name=
+supported=0
+scan_supported=0
+fax_supported=0
+pcard_supported=0
+network_supported=0
+parallel_supported=0
+usb_supported=0
+packaged_version=
+release_date=2004-6-23
+notes=
+ppd_install=ppd
+udev_mode_fix=1
+ppd_dir=/usr/share/ppd/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=none
+
+# ********************
+[slackware:10.1]
+code_name=
+supported=0
+scan_supported=0
+fax_supported=0
+pcard_supported=0
+network_supported=0
+parallel_supported=0
+usb_supported=0
+packaged_version=
+release_date=2005-2-2
+notes=
+ppd_install=ppd
+udev_mode_fix=1
+ppd_dir=/usr/share/ppd/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=none
+
+# ********************
+[slackware:10.2]
+code_name=
+supported=0
+scan_supported=0
+fax_supported=0
+pcard_supported=0
+network_supported=0
+parallel_supported=0
+usb_supported=0
+packaged_version=
+release_date=2005-9-14
+notes=
+ppd_install=ppd
+udev_mode_fix=1
+ppd_dir=/usr/share/ppd/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=none
+
+# ********************
+[slackware:11]
+code_name=
+supported=0
+scan_supported=0
+fax_supported=0
+pcard_supported=0
+network_supported=0
+parallel_supported=0
+usb_supported=0
+packaged_version=1.6.9
+release_date=
+notes=
+ppd_install=ppd
+udev_mode_fix=1
+ppd_dir=/usr/share/ppd/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=none
+
+# ********************
+[slackware:12]
+code_name=
+supported=0
+scan_supported=0
+fax_supported=0
+pcard_supported=0
+network_supported=0
+parallel_supported=0
+usb_supported=0
+packaged_version=1.7.4a
+release_date=
+notes=
+ppd_install=ppd
+udev_mode_fix=1
+ppd_dir=/usr/share/ppd/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=none
+
+# ********************
+[slackware:12.1]
+code_name=
+supported=0
+scan_supported=0
+fax_supported=0
+pcard_supported=0
+network_supported=0
+parallel_supported=0
+usb_supported=0
+packaged_version=2.8.4
+release_date=
+notes=
+ppd_install=ppd
+udev_mode_fix=1
+ppd_dir=/usr/share/ppd/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=none
+
+# ****************************************
+[centos]
+index=23
+versions=any
+display_name=CentOS
+alt_names=
+display=0
+notes=
+package_mgrs=
+package_mgr_cmd=
+pre_depend_cmd=
+post_depend_cmd=
+hplip_remove_cmd=
+su_sudo=su
+ppd_install=ppd
+udev_mode_fix=1
+ppd_dir=/usr/share/ppd/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+
+# ********************
+[centos:any]
+code_name=
+supported=0
+scan_supported=1
+fax_supported=0
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=
+release_date=
+notes=
+ppd_install=ppd
+udev_mode_fix=1
+ppd_dir=/usr/share/cups/model/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt3
+
+[centos:any:cups]
+packages=cups
+
+[centos:any:cups-devel]
+packages=cups-devel
+
+[centos:any:gcc]
+packages=gcc-c++
+
+[centos:any:gs]
+packages=ghostscript
+
+[centos:any:libcrypto]
+packages=openssl-devel
+
+[centos:any:libjpeg]
+packages=libjpeg-devel
+
+[centos:any:libnetsnmp-devel]
+packages=net-snmp-devel
+
+[centos:any:libpthread]
+packages=glibc-headers
+
+[centos:any:libtool]
+packages=libtool
+
+[centos:any:libusb]
+packages=libusb-devel
+
+[centos:any:make]
+packages=make
+
+[centos:any:pil]
+packages=python-imaging,python-imaging-devel
+
+[centos:any:ppdev]
+packages=
+commands=su -c "modprobe ppdev",su -c cp -f /etc/modules /etc/modules.hplip,echo ppdev | su -c tee -a /etc/modules
+
+[centos:any:pyqt]
+packages=PyQt,PyQt-devel
+
+[centos:any:python-devel]
+packages=python-devel,PyXML
+
+[centos:any:pyqt4]
+packages=
+
+[centos:any:pyqt4-dbus]
+packages=pygobject2
+
+[centos:any:python23]
+packages=python
+
+[centos:any:python2x]
+packages=python
+
+[centos:any:reportlab]
+packages=
+
+[centos:any:sane]
+packages=sane-backends
+
+[centos:any:sane-devel]
+packages=sane-backends-devel
+
+[centos:any:scanimage]
+packages=sane-frontends
+
+[centos:any:xsane]
+packages=xsane
+
+[centos:any:cups-ddk]
+packages=
+
+[centos:any:python-dbus]
+packages=dbus-python,policycoreutils-gui
+
+[centos:any:python-ctypes]
+packages=
+
+[centos:any:python-notify]
+packages=notify-python
+
+# ****************************************
+[gentoo]
+index=9
+versions=any
+display_name=Gentoo Linux
+alt_names=
+display=0
+notes=
+package_mgrs=
+package_mgr_cmd=
+pre_depend_cmd=
+post_depend_cmd=
+hplip_remove_cmd=
+su_sudo=su
+ppd_install=ppd
+udev_mode_fix=1
+ppd_dir=
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+
+# ********************
+[gentoo:any]
+code_name=
+supported=0
+scan_supported=0
+fax_supported=0
+pcard_supported=0
+network_supported=0
+parallel_supported=0
+usb_supported=0
+packaged_version=
+release_date=
+notes=
+ppd_install=ppd
+udev_mode_fix=1
+ppd_dir=/usr/share/ppd/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=none
+
+# ****************************************
+[pclinuxos]
+index=17
+versions=2006.0,2006,2007.0,2007,2008.0,2008,2009,2009.0
+display_name=PCLinuxOS
+alt_names=
+display=1
+notes=Please enable all the available repositories before continuing or the install will fail.
+package_mgrs=apt-get,synaptic
+package_mgr_cmd=su -c "apt-get install --yes $packages_to_install"
+pre_install_cmd=su - -c "/etc/init.d/cups restart",su -c "touch /etc/security/console.perms.d/60-hplip.perms && echo '<usb>=/dev/usb/dabusb* /dev/usb/mdc800* /dev/usb/rio500 /dev/ttyUSB*' | tee /etc/security/console.perms.d/60-hplip.perms"
+pre_depend_cmd=su -c "apt-get update"
+post_depend_cmd=
+hplip_remove_cmd=su -c "apt-get remove --yes hplip hpijs"
+su_sudo=su
+ppd_install=ppd
+udev_mode_fix=1
+ppd_dir=/usr/share/ppd/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+
+# ********************
+[pclinuxos:2006.0]
+code_name=Texstar
+supported=0
+scan_supported=1
+fax_supported=0
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=
+release_date=
+notes=
+ppd_install=ppd
+udev_mode_fix=1
+ppd_dir=/usr/share/ppd/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt4
+
+[pclinuxos:2006.0:cups]
+packages=libcups2
+
+[pclinuxos:2006.0:cups-devel]
+packages=libcups2-devel
+
+[pclinuxos:2006.0:gcc]
+packages=gcc-c++
+
+[pclinuxos:2006.0:gs]
+packages=ghostscript
+
+[pclinuxos:2006.0:libcrypto]
+packages=openssl
+
+[pclinuxos:2006.0:libjpeg]
+packages=libjpeg62-devel
+
+[pclinuxos:2006.0:libnetsnmp-devel]
+packages=libnet-snmp5-devel
+
+[pclinuxos:2006.0:libpthread]
+packages=glibc
+
+[pclinuxos:2006.0:libtool]
+packages=libtool
+
+[pclinuxos:2006.0:libusb]
+packages=libusb-devel
+
+[pclinuxos:2006.0:make]
+packages=make
+
+[pclinuxos:2006.0:pil]
+packages=python-imaging
+
+[pclinuxos:2006.0:ppdev]
+packages=
+commands=su -c "modprobe ppdev",su -c cp -f /etc/modules /etc/modules.hplip,echo ppdev | su -c tee -a /etc/modules
+
+[pclinuxos:2006.0:pyqt]
+packages=pyqt
+
+[pclinuxos:2006.0:python-devel]
+packages=python-devel
+
+[pclinuxos:2006.0:pyqt4]
+packages=PyQt4
+
+[pclinuxos:2006.0:pyqt4-dbus]
+packages=dbus-python
+
+[pclinuxos:2006.0:python23]
+packages=python
+
+[pclinuxos:2006.0:python2x]
+packages=python
+
+[pclinuxos:2006.0:reportlab]
+packages=python-reportlab
+
+[pclinuxos:2006.0:sane]
+packages=sane-frontends
+
+[pclinuxos:2006.0:sane-devel]
+packages=sane-devel
+
+[pclinuxos:2006.0:scanimage]
+packages=sane-frontends
+
+[pclinuxos:2006.0:xsane]
+packages=xsane
+
+[pclinuxos:2006.0:cups-ddk]
+packages=
+
+[pclinuxos:2006.0:python-dbus]
+# packages=dbus-python,libdbus-1_3-devel,python-gobject
+
+[pclinuxos:2006.0:python-ctypes]
+# packages=python-ctypes
+
+[pclinuxos:2006.0:cups-image]
+packages=libcups2-devel
+
+# ********************
+[pclinuxos:2006]
+same_as_version=2006.0
+
+# ********************
+[pclinuxos:2007.0]
+code_name=
+supported=0
+scan_supported=1
+fax_supported=1
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=2.7.10
+release_date=
+notes=
+ppd_install=ppd
+udev_mode_fix=1
+ppd_dir=/usr/share/ppd/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt4
+
+[pclinuxos:2007.0:cups]
+packages=libcups2
+
+[pclinuxos:2007.0:cups-devel]
+packages=libcups2-devel
+
+[pclinuxos:2007.0:gcc]
+packages=gcc-c++
+
+[pclinuxos:2007.0:gs]
+packages=ghostscript
+
+[pclinuxos:2007.0:libcrypto]
+packages=openssl
+
+[pclinuxos:2007.0:libjpeg]
+packages=libjpeg62-devel
+
+[pclinuxos:2007.0:libnetsnmp-devel]
+packages=libnet-snmp10-devel
+
+[pclinuxos:2007.0:libpthread]
+packages=glibc
+
+[pclinuxos:2007.0:libtool]
+packages=libtool
+
+[pclinuxos:2007.0:libusb]
+packages=libusb-devel
+
+[pclinuxos:2007.0:make]
+packages=make
+
+[pclinuxos:2007.0:pil]
+packages=python-imaging
+
+[pclinuxos:2007.0:ppdev]
+packages=
+commands=su -c "modprobe ppdev",su -c cp -f /etc/modules /etc/modules.hplip,echo ppdev | su -c tee -a /etc/modules
+
+[pclinuxos:2007.0:pyqt]
+packages=pyqt
+
+[pclinuxos:2007.0:python-devel]
+packages=libpython2.4-devel
+
+[pclinuxos:2007.0:pyqt4]
+packages=PyQt4
+
+[pclinuxos:2007.0:pyqt4-dbus]
+packages=dbus-python
+
+[pclinuxos:2007.0:python23]
+packages=python
+
+[pclinuxos:2007.0:python2x]
+packages=python
+
+[pclinuxos:2007.0:reportlab]
+packages=python-reportlab
+
+[pclinuxos:2007.0:sane]
+packages=sane-frontends
+
+[pclinuxos:2007.0:sane-devel]
+packages=libsane1-devel
+
+[pclinuxos:2007.0:scanimage]
+packages=sane-frontends
+
+[pclinuxos:2007.0:xsane]
+packages=xsane
+
+[pclinuxos:2007.0:cups-ddk]
+# packages=cupsddk,cupsddk-drivers
+
+[pclinuxos:2007.0:python-dbus]
+packages=dbus-python,python-gobject
+
+[pclinuxos:2007.0:dbus]
+packages=libdbus-1_3-devel
+
+[pclinuxos:2007.0:python-ctypes]
+packages=python-ctypes
+
+[pclinuxos:2007.0:cups-image]
+packages=libcups2-devel
+
+# ********************
+[pclinuxos:2007]
+same_as_version=2007.0
+
+# ********************
+[pclinuxos:2008.0]
+code_name=
+supported=0
+scan_supported=1
+fax_supported=1
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=2.7.10
+release_date=
+notes=
+ppd_install=ppd
+udev_mode_fix=1
+ppd_dir=/usr/share/ppd/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt4
+
+[pclinuxos:2008.0:cups]
+packages=libcups2
+
+[pclinuxos:2008.0:cups-devel]
+packages=libcups2-devel
+
+[pclinuxos:2008.0:gcc]
+packages=gcc-c++
+
+[pclinuxos:2008.0:gs]
+packages=ghostscript
+
+[pclinuxos:2008.0:libcrypto]
+packages=openssl
+
+[pclinuxos:2008.0:libjpeg]
+packages=libjpeg62-devel
+
+[pclinuxos:2008.0:libnetsnmp-devel]
+packages=libnet-snmp10-devel
+
+[pclinuxos:2008.0:libpthread]
+packages=glibc
+
+[pclinuxos:2008.0:libtool]
+packages=libtool
+
+[pclinuxos:2008.0:libusb]
+packages=libusb-devel
+
+[pclinuxos:2008.0:make]
+packages=make
+
+[pclinuxos:2008.0:pil]
+packages=python-imaging
+
+[pclinuxos:2008.0:ppdev]
+packages=
+commands=su -c "modprobe ppdev",su -c cp -f /etc/modules /etc/modules.hplip,echo ppdev | su -c tee -a /etc/modules
+
+[pclinuxos:2008.0:pyqt]
+packages=pyqt
+
+[pclinuxos:2008.0:python-devel]
+packages=libpython2.4-devel
+
+[pclinuxos:2008.0:pyqt4]
+packages=PyQt4
+
+[pclinuxos:2008.0:pyqt4-dbus]
+packages=dbus-python
+
+[pclinuxos:2008.0:python23]
+packages=python
+
+[pclinuxos:2008.0:python2x]
+packages=python
+
+[pclinuxos:2008.0:reportlab]
+packages=python-reportlab
+
+[pclinuxos:2008.0:sane]
+packages=sane-frontends
+
+[pclinuxos:2008.0:sane-devel]
+packages=libsane1-devel
+
+[pclinuxos:2008.0:scanimage]
+packages=sane-frontends
+
+[pclinuxos:2008.0:xsane]
+packages=xsane
+
+[pclinuxos:2008.0:cups-ddk]
+# packages=cupsddk,cupsddk-drivers
+
+[pclinuxos:2008.0:python-dbus]
+packages=dbus-python,python-gobject
+
+[pclinuxos:2008.0:dbus]
+packages=libdbus-1_3-devel
+
+[pclinuxos:2008.0:python-ctypes]
+packages=python-ctypes
+
+[pclinuxos:2008.0:cups-image]
+packages=libcups2-devel
+
+# ********************
+[pclinuxos:2008]
+same_as_version=2008.0
+
+# ********************
+[pclinuxos:2009.0]
+code_name=
+supported=0
+scan_supported=1
+fax_supported=1
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=
+release_date=
+notes=
+ppd_install=ppd
+udev_mode_fix=1
+ppd_dir=/usr/share/ppd/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt4
+
+[pclinuxos:2009.0:cups]
+packages=libcups2
+
+[pclinuxos:2009.0:cups-devel]
+packages=libcups2-devel
+
+[pclinuxos:2009.0:gcc]
+packages=gcc-c++
+
+[pclinuxos:2009.0:gs]
+packages=ghostscript
+
+[pclinuxos:2009.0:libcrypto]
+packages=openssl
+
+[pclinuxos:2009.0:libjpeg]
+packages=libjpeg62-devel
+
+[pclinuxos:2009.0:libnetsnmp-devel]
+packages=libnet-snmp10-devel
+
+[pclinuxos:2009.0:libpthread]
+packages=glibc
+
+[pclinuxos:2009.0:libtool]
+packages=libtool
+
+[pclinuxos:2009.0:libusb]
+packages=libusb-devel
+
+[pclinuxos:2009.0:make]
+packages=make
+
+[pclinuxos:2009.0:pil]
+packages=python-imaging
+
+[pclinuxos:2009.0:ppdev]
+packages=
+commands=su -c "modprobe ppdev",su -c cp -f /etc/modules /etc/modules.hplip,echo ppdev | su -c tee -a /etc/modules
+
+[pclinuxos:2009.0:pyqt]
+packages=pyqt
+
+[pclinuxos:2009.0:python-devel]
+packages=libpython2.4-devel
+
+[pclinuxos:2009.0:pyqt4]
+packages=PyQt4
+
+[pclinuxos:2009.0:pyqt4-dbus]
+packages=dbus-python
+
+[pclinuxos:2009.0:python23]
+packages=python
+
+[pclinuxos:2009.0:python2x]
+packages=python
+
+[pclinuxos:2009.0:reportlab]
+packages=python-reportlab
+
+[pclinuxos:2009.0:sane]
+packages=sane-frontends
+
+[pclinuxos:2009.0:sane-devel]
+packages=libsane1-devel
+
+[pclinuxos:2009.0:scanimage]
+packages=sane-frontends
+
+[pclinuxos:2009.0:xsane]
+packages=xsane
+
+[pclinuxos:2009.0:cups-ddk]
+# packages=cupsddk,cupsddk-drivers
+
+[pclinuxos:2009.0:python-dbus]
+packages=dbus-python,python-gobject
+
+[pclinuxos:2009.0:dbus]
+packages=libdbus-1_3-devel
+
+[pclinuxos:2009.0:python-ctypes]
+packages=python-ctypes
+
+[pclinuxos:2009.0:cups-image]
+packages=libcups2-devel
+
+# ********************
+[pclinuxos:2009]
+same_as_version=2009.0
+
+# ********************
+[pclinuxos:2009.1]
+code_name=
+supported=0
+scan_supported=1
+fax_supported=1
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=
+release_date=
+notes=
+ppd_install=ppd
+udev_mode_fix=1
+ppd_dir=/usr/share/ppd/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt4
+
+[pclinuxos:2009.1:cups]
+packages=libcups2
+
+[pclinuxos:2009.1:cups-devel]
+packages=libcups2-devel
+
+[pclinuxos:2009.1:gcc]
+packages=gcc-c++
+
+[pclinuxos:2009.1:gs]
+packages=ghostscript
+
+[pclinuxos:2009.1:libcrypto]
+packages=openssl
+
+[pclinuxos:2009.1:libjpeg]
+packages=libjpeg62-devel
+
+[pclinuxos:2009.1:libnetsnmp-devel]
+packages=libnet-snmp10-devel
+
+[pclinuxos:2009.1:libpthread]
+packages=glibc
+
+[pclinuxos:2009.1:libtool]
+packages=libtool
+
+[pclinuxos:2009.1:libusb]
+packages=libusb-devel
+
+[pclinuxos:2009.1:make]
+packages=make
+
+[pclinuxos:2009.1:pil]
+packages=python-imaging
+
+[pclinuxos:2009.1:ppdev]
+packages=
+commands=su -c "modprobe ppdev",su -c cp -f /etc/modules /etc/modules.hplip,echo ppdev | su -c tee -a /etc/modules
+
+[pclinuxos:2009.1:pyqt]
+packages=pyqt
+
+[pclinuxos:2009.1:python-devel]
+packages=libpython2.4-devel
+
+[pclinuxos:2009.1:pyqt4]
+packages=PyQt4
+
+[pclinuxos:2009.1:pyqt4-dbus]
+packages=dbus-python
+
+[pclinuxos:2009.1:python23]
+packages=python
+
+[pclinuxos:2009.1:python2x]
+packages=python
+
+[pclinuxos:2009.1:reportlab]
+packages=python-reportlab
+
+[pclinuxos:2009.1:sane]
+packages=sane-frontends
+
+[pclinuxos:2009.1:sane-devel]
+packages=libsane1-devel
+
+[pclinuxos:2009.1:scanimage]
+packages=sane-frontends
+
+[pclinuxos:2009.1:xsane]
+packages=xsane
+
+[pclinuxos:2009.1:cups-ddk]
+# packages=cupsddk,cupsddk-drivers
+
+[pclinuxos:2009.1:python-dbus]
+packages=dbus-python,python-gobject
+
+[pclinuxos:2009.1:dbus]
+packages=libdbus-1_3-devel
+
+[pclinuxos:2009.1:python-ctypes]
+packages=python-ctypes
+
+[pclinuxos:2009.1:cups-image]
+packages=libcups2-devel
+
+# ****************************************
+[igos]
+index=32
+versions=1.0
+display_name=IGOS
+alt_names=IGOS
+display=1
+notes=SELinux must be disabled for HPLIP to function properly. Please disable SELinux before continuing.
+package_mgrs=yum,rpm,up2date
+package_mgr_cmd=su -c "yum -y -d 10 -e 1 install $packages_to_install"
+pre_depend_cmd=su -c "yum clean all"
+post_depend_cmd=
+hplip_remove_cmd=su -c "yum -y -d 10 -e 1 remove hplip hpijs"
+su_sudo=su
+ppd_install=ppd
+udev_mode_fix=1
+ppd_dir=
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+
+# ********************
+[igos:1.0]
+code_name=Nusantara
+supported=0
+scan_supported=1
+fax_supported=0
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=
+release_date=
+notes=
+ppd_install=ppd
+udev_mode_fix=1
+ppd_dir=/usr/share/ppd/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt3
+
+[igos:1.0:cups]
+packages=cups
+
+[igos:1.0:cups-devel]
+packages=cups-devel
+
+[igos:1.0:gcc]
+packages=gcc-c++
+
+[igos:1.0:gs]
+packages=ghostscript
+
+[igos:1.0:libcrypto]
+packages=net-snmp-devel
+
+[igos:1.0:libjpeg]
+packages=libjpeg-devel
+
+[igos:1.0:libnetsnmp-devel]
+packages=net-snmp-devel
+
+[igos:1.0:libpthread]
+packages=glibc-headers
+
+[igos:1.0:libtool]
+packages=libtool
+
+[igos:1.0:libusb]
+packages=libusb-devel
+
+[igos:1.0:make]
+packages=make
+
+[igos:1.0:pil]
+packages=python-imaging
+
+[igos:1.0:ppdev]
+packages=
+commands=su -c "/sbin/modprobe ppdev"
+
+[igos:1.0:pyqt]
+packages=PyQt
+
+[igos:1.0:python-devel]
+packages=python-devel
+
+[igos:1.0::pyqt4]
+packages=
+
+[igos:1.0:pyqt4-dbus]
+packages=
+
+[igos:1.0:python23]
+packages=python
+
+[igos:1.0:python2x]
+packages=python
+
+[igos:1.0:reportlab]
+packages=python-reportlab
+
+[igos:1.0:sane]
+packages=sane-backends
+
+[igos:1.0:sane-devel]
+packages=sane-devel
+
+[igos:1.0:scanimage]
+packages=sane-frontends
+
+[igos:1.0:xsane]
+packages=xsane
+
+[igos:1.0:cups-ddk]
+# packages=cupsddk,cupsddk-drivers
+
+[igos:1.0:python-dbus]
+# packages=dbus-python,python-gobject
+
+[igos:1.0:python-ctypes]
+# packages=python-ctypes
+
+[igos:1.0:cups-image]
+packages=
+
+# ****************************************
+[ubuntu]
+index=12
+versions=8.04,10.04,10.10,11.04,11.10,12.04
+display_name=Ubuntu
+alt_names=kubuntu,edubuntu,xubuntu
+display=1
+notes=
+package_mgrs=dpkg,apt-get,synaptic,update-manager,adept,aptitude,adept-updater
+package_mgr_cmd=sudo apt-get install --assume-yes $packages_to_install
+pre_depend_cmd=sudo dpkg --configure -a,sudo apt-get install --yes --force-yes -f,sudo apt-get update
+post_depend_cmd=
+hplip_remove_cmd=sudo apt-get remove --assume-yes hplip hpijs hplip-cups hplip-data libhpmud0 foomatic-db-hpijs
+su_sudo=sudo
+ppd_install=ppd
+udev_mode_fix=1
+ppd_dir=
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+
+# ********************
+[ubuntu:6.06]
+code_name=Dapper Duck
+supported=0
+scan_supported=1
+fax_supported=0
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=0.9.7
+release_date=2006-6-1
+notes=Enable the universe/multiverse repositories. Also be sure you are using the Ubuntu "Main" Repositories. See: https://help.ubuntu.com/community/Repositories/Ubuntu for more information. Disable the CD-ROM/DVD source if you do not have the Ubuntu installation media inserted in the drive.
+ppd_install=ppd
+udev_mode_fix=1
+ppd_dir=/usr/share/ppd/HP
+fix_ppd_symlink=1
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt4
+
+[ubuntu:6.06:cups]
+packages=libcups2
+
+[ubuntu:6.06:cups-devel]
+packages=libcups2-dev,cups-bsd,cups-client
+
+[ubuntu:6.06:gcc]
+packages=build-essential
+
+[ubuntu:6.06:gs]
+packages=gs-esp
+
+[ubuntu:6.06:libcrypto]
+packages=openssl
+
+[ubuntu:6.06:libjpeg]
+packages=libjpeg62-dev
+
+[ubuntu:6.06:libnetsnmp-devel]
+packages=libsnmp9-dev
+
+[ubuntu:6.06:libpthread]
+packages=build-essential
+
+[ubuntu:6.06:libtool]
+packages=libtool
+
+[ubuntu:6.06:libusb]
+packages=libusb-dev
+
+[ubuntu:6.06:make]
+packages=build-essential
+
+[ubuntu:6.06:pil]
+packages=python-imaging
+
+[ubuntu:6.06:ppdev]
+packages=
+commands=sudo modprobe ppdev,sudo cp -f /etc/modules /etc/modules.hplip,echo ppdev | sudo tee -a /etc/modules
+
+[ubuntu:6.06:pyqt]
+packages=python-qt3
+
+[ubuntu:6.06:python-devel]
+packages=python-dev
+
+[ubuntu:6.06:pyqt4]
+packages=python-qt4
+
+[ubuntu:6.06:pyqt4-dbus]
+packages=python-qt4-dbus
+
+[ubuntu:6.06:python23]
+packages=python
+
+[ubuntu:6.06:python2x]
+packages=python
+
+[ubuntu:6.06:reportlab]
+packages=python-reportlab
+
+[ubuntu:6.06:sane]
+packages=libsane
+
+[ubuntu:6.06:sane-devel]
+packages=libsane-dev
+
+[ubuntu:6.06:scanimage]
+packages=libsane
+
+[ubuntu:6.06:xsane]
+packages=xsane
+
+[ubuntu:6.06:cups-ddk]
+# packages=cups
+
+[ubuntu:6.06:python-dbus]
+# packages=python-gobject
+
+[ubuntu:6.06:python-ctypes]
+# packages=
+
+[ubuntu:6.06:cups-image]
+packages=libcupsys-dev,cupsys-bsd
+
+# ********************
+[ubuntu:8.04]
+code_name=Hardy Heron
+supported=1
+scan_supported=1
+fax_supported=1
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=2.8.2
+release_date=2008
+notes=Enable the universe/multiverse repositories. Also be sure you are using the Ubuntu "Main" Repositories. See: https://help.ubuntu.com/community/Repositories/Ubuntu for more information. Disable the CD-ROM/DVD source if you do not have the Ubuntu installation media inserted in the drive.
+ppd_install=ppd
+udev_mode_fix=1
+ppd_dir=/usr/share/ppd/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt4
+policykit=1
+native_cups=1
+
+[ubuntu:8.04:cups]
+packages=libcups2
+
+[ubuntu:8.04:cups-devel]
+packages=libcups2-dev,cups-bsd,cups-client
+
+[ubuntu:8.04:gcc]
+packages=build-essential
+
+[ubuntu:8.04:gs]
+packages=gs-esp
+
+[ubuntu:8.04:libcrypto]
+packages=openssl
+
+[ubuntu:8.04:libjpeg]
+packages=libjpeg62-dev
+
+[ubuntu:8.04:libnetsnmp-devel]
+packages=libsnmp-dev
+
+[ubuntu:8.04:libpthread]
+packages=build-essential
+
+[ubuntu:8.04:libtool]
+packages=libtool
+
+[ubuntu:8.04:libusb]
+packages=libusb-dev
+
+[ubuntu:8.04:make]
+packages=build-essential
+
+[ubuntu:8.04:pil]
+packages=python-imaging
+
+[ubuntu:8.04:ppdev]
+packages=
+commands=sudo modprobe ppdev,sudo cp -f /etc/modules /etc/modules.hplip,echo ppdev | sudo tee -a /etc/modules
+
+[ubuntu:8.04:pyqt]
+packages=python-qt3
+
+[ubuntu:8.04:python-devel]
+packages=python2.5-dev
+
+[ubuntu:8.04:pyqt4]
+packages=python-qt4
+
+[ubuntu:8.04:pyqt4-dbus]
+packages=python-qt4-dbus
+
+[ubuntu:8.04:python23]
+packages=python
+
+[ubuntu:8.04:python2x]
+packages=python
+
+[ubuntu:8.04:reportlab]
+packages=python-reportlab
+
+[ubuntu:8.04:sane]
+packages=libsane
+
+[ubuntu:8.04:sane-devel]
+packages=libsane-dev
+
+[ubuntu:8.04:scanimage]
+packages=sane-utils
+
+[ubuntu:8.04:xsane]
+packages=xsane
+
+[ubuntu:8.04:cups-ddk]
+packages=cups
+
+[ubuntu:8.04:python-dbus]
+packages=python-dbus,python-gobject
+
+[ubuntu:8.04:dbus]
+packages=libdbus-1-dev
+
+[ubuntu:8.04:python-ctypes]
+packages=python-ctypes
+
+[ubuntu:8.04:cups-image]
+packages=libcupsimage2-dev
+
+[ubuntu:8.04:policykit]
+packages=policykit,policykit-gnome
+
+[ubuntu:8.04:python-notify]
+packages=python-notify
+
+
+# ********************
+[ubuntu:8.04.1]
+code_name=Hardy Heron
+supported=1
+scan_supported=1
+fax_supported=1
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=2.8.2
+release_date=2008
+notes=Enable the universe/multiverse repositories. Also be sure you are using the Ubuntu "Main" Repositories. See: https://help.ubuntu.com/community/Repositories/Ubuntu for more information. Disable the CD-ROM/DVD source if you do not have the Ubuntu installation media inserted in the drive.
+ppd_install=ppd
+udev_mode_fix=1
+ppd_dir=/usr/share/ppd/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt4
+policykit=1
+native_cups=1
+
+[ubuntu:8.04.1:cups]
+packages=libcups2
+
+[ubuntu:8.04.1:cups-devel]
+packages=libcups2-dev,cups-bsd,cups-client
+
+[ubuntu:8.04.1:gcc]
+packages=build-essential
+
+[ubuntu:8.04.1:gs]
+packages=gs-esp
+
+[ubuntu:8.04.1:libcrypto]
+packages=openssl
+
+[ubuntu:8.04.1:libjpeg]
+packages=libjpeg62-dev
+
+[ubuntu:8.04.1:libnetsnmp-devel]
+packages=libsnmp-dev
+
+[ubuntu:8.04.1:libpthread]
+packages=build-essential
+
+[ubuntu:8.04.1:libtool]
+packages=libtool
+
+[ubuntu:8.04.1:libusb]
+packages=libusb-dev
+
+[ubuntu:8.04.1:make]
+packages=build-essential
+
+[ubuntu:8.04.1:pil]
+packages=python-imaging
+
+[ubuntu:8.04.1:ppdev]
+packages=
+commands=sudo modprobe ppdev,sudo cp -f /etc/modules /etc/modules.hplip,echo ppdev | sudo tee -a /etc/modules
+
+[ubuntu:8.04.1:pyqt]
+packages=python-qt3
+
+[ubuntu:8.04.1:pyqt4]
+packages=python-qt4
+
+[ubuntu:8.04.1:pyqt4-dbus]
+packages=python-qt4-dbus
+
+[ubuntu:8.04.1:python-devel]
+packages=python2.5-dev
+
+[ubuntu:8.04.1:python23]
+packages=python
+
+[ubuntu:8.04.1:python2x]
+packages=python
+
+[ubuntu:8.04.1:reportlab]
+packages=python-reportlab
+
+[ubuntu:8.04.1:sane]
+packages=libsane
+
+[ubuntu:8.04.1:sane-devel]
+packages=libsane-dev
+
+[ubuntu:8.04.1:scanimage]
+packages=sane-utils
+
+[ubuntu:8.04.1:xsane]
+packages=xsane
+
+[ubuntu:8.04.1:cups-ddk]
+packages=cups
+
+[ubuntu:8.04.1:python-dbus]
+packages=python-dbus,python-gobject
+
+[ubuntu:8.04.1:dbus]
+packages=libdbus-1-dev
+
+[ubuntu:8.04.1:python-ctypes]
+packages=python-ctypes
+
+[ubuntu:8.04.1:cups-image]
+packages=libcupsimage2-dev
+
+[ubuntu:8.04.1:policykit]
+packages=policykit,policykit-gnome
+
+[ubuntu:8.04.1:python-notify]
+packages=python-notify
+
+# ********************
+[ubuntu:8.04.2]
+code_name=Hardy Heron
+supported=1
+scan_supported=1
+fax_supported=1
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=2.8.2
+release_date=2009
+notes=Enable the universe/multiverse repositories. Also be sure you are using the Ubuntu "Main" Repositories. See: https://help.ubuntu.com/community/Repositories/Ubuntu for more information. Disable the CD-ROM/DVD source if you do not have the Ubuntu installation media inserted in the drive.
+ppd_install=ppd
+udev_mode_fix=1
+ppd_dir=/usr/share/ppd/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt4
+policykit=1
+native_cups=1
+
+[ubuntu:8.04.2:cups]
+packages=libcups2
+
+[ubuntu:8.04.2:cups-devel]
+packages=libcups2-dev,cups-bsd,cups-client
+
+[ubuntu:8.04.2:gcc]
+packages=build-essential
+
+[ubuntu:8.04.2:gs]
+packages=gs-esp
+
+[ubuntu:8.04.2:libcrypto]
+packages=openssl
+
+[ubuntu:8.04.2:libjpeg]
+packages=libjpeg62-dev
+
+[ubuntu:8.04.2:libnetsnmp-devel]
+packages=libsnmp-dev
+
+[ubuntu:8.04.2:libpthread]
+packages=build-essential
+
+[ubuntu:8.04.2:libtool]
+packages=libtool
+
+[ubuntu:8.04.2:libusb]
+packages=libusb-dev
+
+[ubuntu:8.04.2:make]
+packages=build-essential
+
+[ubuntu:8.04.2:pil]
+packages=python-imaging
+
+[ubuntu:8.04.2:ppdev]
+packages=
+commands=sudo modprobe ppdev,sudo cp -f /etc/modules /etc/modules.hplip,echo ppdev | sudo tee -a /etc/modules
+
+[ubuntu:8.04.2:pyqt]
+packages=python-qt3
+
+[ubuntu:8.04.2:pyqt4]
+packages=python-qt4
+
+[ubuntu:8.04.2:pyqt4-dbus]
+packages=python-qt4-dbus
+
+[ubuntu:8.04.2:python-devel]
+packages=python2.5-dev
+
+[ubuntu:8.04.2:python23]
+packages=python
+
+[ubuntu:8.04.2:python2x]
+packages=python
+
+[ubuntu:8.04.2:reportlab]
+packages=python-reportlab
+
+[ubuntu:8.04.2:sane]
+packages=libsane
+
+[ubuntu:8.04.2:sane-devel]
+packages=libsane-dev
+
+[ubuntu:8.04.2:scanimage]
+packages=sane-utils
+
+[ubuntu:8.04.2:xsane]
+packages=xsane
+
+[ubuntu:8.04.2:cups-ddk]
+packages=cups
+
+[ubuntu:8.04.2:python-dbus]
+packages=python-dbus,python-gobject
+
+[ubuntu:8.04.2:dbus]
+packages=libdbus-1-dev
+
+[ubuntu:8.04.2:python-ctypes]
+packages=python-ctypes
+
+[ubuntu:8.04.2:cups-image]
+packages=libcupsimage2-dev
+
+[ubuntu:8.04.2:policykit]
+packages=policykit,policykit-gnome
+
+[ubuntu:8.04.2:python-notify]
+packages=python-notify
+
+# ********************
+[ubuntu:8.10]
+code_name=Intrepid Ibex
+supported=0
+scan_supported=1
+fax_supported=1
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=2.8.7
+release_date=2008
+notes=Enable the universe/multiverse repositories. Also be sure you are using the Ubuntu "Main" Repositories. See: https://help.ubuntu.com/community/Repositories/Ubuntu for more information. Disable the CD-ROM/DVD source if you do not have the Ubuntu installation media inserted in the drive.
+ppd_install=drv
+udev_mode_fix=1
+ppd_dir=/usr/share/ppd/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt4
+policykit=1
+native_cups=0
+
+# ********************
+[ubuntu:9.10]
+code_name=Karmic
+supported=1
+scan_supported=1
+fax_supported=1
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=3.9.8
+release_date=2009
+notes=Enable the universe/multiverse repositories. Also be sure you are using the Ubuntu "Main" Repositories. See: https://help.ubuntu.com/community/Repositories/Ubuntu for more information. Disable the CD-ROM/DVD source if you do not have the Ubuntu installation media inserted in the drive. During the install process you will be added to the lp group, please quit the installer before the setup stage, log out, log back in, and run hp-setup to complete the install.
+ppd_install=drv
+udev_mode_fix=1
+ppd_dir=/usr/share/ppd/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt4
+policykit=1
+native_cups=1
+acl_rules=1
+add_user_to_group=-a -Glp,lpadmin
+
+[ubuntu:9.10:cups]
+packages=libcups2
+
+[ubuntu:9.10:cups-devel]
+packages=libcups2-dev,cups-bsd,cups-client
+
+[ubuntu:9.10:gcc]
+packages=build-essential
+
+[ubuntu:9.10:gs]
+packages=gs-esp
+
+[ubuntu:9.10:libcrypto]
+packages=openssl
+
+[ubuntu:9.10:libjpeg]
+packages=libjpeg62-dev
+
+[ubuntu:9.10:libnetsnmp-devel]
+packages=libsnmp-dev
+
+[ubuntu:9.10:libpthread]
+packages=build-essential
+
+[ubuntu:9.10:libtool]
+packages=libtool
+
+[ubuntu:9.10:libusb]
+packages=libusb-dev
+
+[ubuntu:9.10:make]
+packages=build-essential
+
+[ubuntu:9.10:pil]
+packages=python-imaging
+
+[ubuntu:9.10:ppdev]
+packages=
+commands=sudo modprobe ppdev,sudo cp -f /etc/modules /etc/modules.hplip,echo ppdev | sudo tee -a /etc/modules
+
+[ubuntu:9.10:pyqt]
+packages=python-qt3
+
+[ubuntu:9.10:python-devel]
+packages=python-dev
+
+[ubuntu:9.10:pyqt4]
+packages=python-qt4
+
+[ubuntu:9.10:pyqt4-dbus]
+packages=python-qt4-dbus
+
+[ubuntu:9.10:python23]
+packages=python
+
+[ubuntu:9.10:python2x]
+packages=python
+
+[ubuntu:9.10:reportlab]
+packages=python-reportlab
+
+[ubuntu:9.10:sane]
+packages=libsane
+
+[ubuntu:9.10:sane-devel]
+packages=libsane-dev
+
+[ubuntu:9.10:scanimage]
+packages=sane-utils
+
+[ubuntu:9.10:xsane]
+packages=xsane
+
+[ubuntu:9.10:cups-ddk]
+packages=cups
+
+[ubuntu:9.10:python-dbus]
+packages=python-dbus,python-gobject
+
+[ubuntu:9.10:dbus]
+packages=libdbus-1-dev
+
+[ubuntu:9.10:python-ctypes]
+packages=python-ctypes
+
+[ubuntu:9.10:cups-image]
+packages=libcupsimage2-dev
+
+[ubuntu:9.10:policykit]
+packages=policykit,policykit-gnome
+
+[ubuntu:9.10:python-notify]
+packages=python-notify
+
+# ********************
+[ubuntu:10.04]
+code_name=Lucid
+supported=1
+scan_supported=1
+fax_supported=1
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=3.10.2
+release_date=2010
+notes=Enable the universe/multiverse repositories. Also be sure you are using the Ubuntu "Main" Repositories. See: https://help.ubuntu.com/community/Repositories/Ubuntu for more information. Disable the CD-ROM/DVD source if you do not have the Ubuntu installation media inserted in the drive. During the install process you will be added to the lp group, please quit the installer before the setup stage, log out, log back in, and run hp-setup to complete the install.
+ppd_install=drv
+udev_mode_fix=1
+ppd_dir=/usr/share/ppd/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt4
+native_cups=1
+acl_rules=1
+add_user_to_group=-a -Glp,lpadmin
+
+[ubuntu:10.04:cups]
+packages=libcups2
+
+[ubuntu:10.04:cups-devel]
+packages=libcups2-dev,cups-bsd,cups-client
+
+[ubuntu:10.04:gcc]
+packages=build-essential
+
+[ubuntu:10.04:gs]
+packages=ghostscript
+
+[ubuntu:10.04:libcrypto]
+packages=openssl
+
+[ubuntu:10.04:libjpeg]
+packages=libjpeg62-dev
+
+[ubuntu:10.04:libnetsnmp-devel]
+packages=libsnmp-dev
+
+[ubuntu:10.04:libpthread]
+packages=build-essential
+
+[ubuntu:10.04:libtool]
+packages=libtool
+
+[ubuntu:10.04:libusb]
+packages=libusb-dev
+
+[ubuntu:10.04:make]
+packages=build-essential
+
+[ubuntu:10.04:pil]
+packages=python-imaging
+
+[ubuntu:10.04:ppdev]
+packages=
+commands=sudo modprobe ppdev,sudo cp -f /etc/modules /etc/modules.hplip,echo ppdev | sudo tee -a /etc/modules
+
+[ubuntu:10.04:pyqt]
+packages=python-qt4
+
+[ubuntu:10.04:python-devel]
+packages=python-dev
+
+[ubuntu:10.04:pyqt4]
+packages=python-qt4
+
+[ubuntu:10.04:pyqt4-dbus]
+packages=python-qt4-dbus
+
+#[ubuntu:10.04:python23]
+#packages=python
+
+[ubuntu:10.04:python2x]
+packages=python
+
+[ubuntu:10.04:reportlab]
+packages=python-reportlab
+
+[ubuntu:10.04:sane]
+packages=libsane
+
+[ubuntu:10.04:sane-devel]
+packages=libsane-dev
+
+[ubuntu:10.04:scanimage]
+packages=sane-utils
+
+[ubuntu:10.04:xsane]
+packages=xsane
+
+[ubuntu:10.04:python-dbus]
+packages=python-dbus,python-gobject
+
+[ubuntu:10.04:dbus]
+packages=libdbus-1-dev
+
+[ubuntu:10.04:cups-image]
+packages=libcupsimage2-dev
+
+[ubuntu:10.04:cups-ddk]
+packages=cups
+
+[ubuntu:10.04:policykit]
+packages=policykit-1,policykit-1-gnome
+
+[ubuntu:10.04:python-notify]
+packages=python-notify
+
+# ************************************
+[ubuntu:10.10]
+code_name=Maverick
+supported=1
+scan_supported=1
+fax_supported=1
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=3.10.11
+release_date=2010
+notes=Enable the universe/multiverse repositories. Also be sure you are using the Ubuntu "Main" Repositories. See: https://help.ubuntu.com/community/Repositories/Ubuntu for more information. Disable the CD-ROM/DVD source if you do not have the Ubuntu installation media inserted in the drive. During the install process you will be added to the lp and lpadmin group, please quit the installer before the setup stage, log out, log back in, and run hp-setup to complete the install.
+ppd_install=drv
+udev_mode_fix=1
+ppd_dir=/usr/share/ppd/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt4
+native_cups=1
+acl_rules=1
+add_user_to_group=-a -Glp,lpadmin
+
+[ubuntu:10.10:cups]
+packages=libcups2
+
+[ubuntu:10.10:cups-devel]
+packages=libcups2-dev,cups-bsd,cups-client
+
+[ubuntu:10.10:gcc]
+packages=build-essential
+
+[ubuntu:10.10:gs]
+packages=ghostscript
+
+[ubuntu:10.10:libcrypto]
+packages=openssl
+
+[ubuntu:10.10:libjpeg]
+packages=libjpeg62-dev
+
+[ubuntu:10.10:libnetsnmp-devel]
+packages=libsnmp-dev
+
+[ubuntu:10.10:libpthread]
+packages=build-essential
+
+[ubuntu:10.10:libtool]
+packages=libtool
+
+[ubuntu:10.10:libusb]
+packages=libusb-dev
+
+[ubuntu:10.10:make]
+packages=build-essential
+
+[ubuntu:10.10:pil]
+packages=python-imaging
+
+[ubuntu:10.10:ppdev]
+packages=
+commands=sudo modprobe ppdev,sudo cp -f /etc/modules /etc/modules.hplip,echo ppdev | sudo tee -a /etc/modules
+
+[ubuntu:10.10:pyqt]
+packages=python-qt4
+
+[ubuntu:10.10:python-devel]
+packages=python-dev
+
+[ubuntu:10.10:pyqt4]
+packages=python-qt4
+
+[ubuntu:10.10:pyqt4-dbus]
+packages=python-qt4-dbus
+
+#[ubuntu:10.10:python23]
+#packages=python
+
+[ubuntu:10.10:python2x]
+packages=python
+
+[ubuntu:10.10:reportlab]
+packages=python-reportlab
+
+[ubuntu:10.10:sane]
+packages=libsane
+
+[ubuntu:10.10:sane-devel]
+packages=libsane-dev
+
+[ubuntu:10.10:scanimage]
+packages=sane-utils
+
+[ubuntu:10.10:xsane]
+packages=xsane
+
+[ubuntu:10.10:python-dbus]
+packages=python-dbus,python-gobject
+
+[ubuntu:10.10:dbus]
+packages=libdbus-1-dev
+
+[ubuntu:10.10:cups-image]
+packages=libcupsimage2-dev
+
+[ubuntu:10.10:cups-ddk]
+packages=cups
+
+[ubuntu:10.10:policykit]
+packages=policykit-1,policykit-1-gnome
+
+[ubuntu:10.10:python-notify]
+packages=python-notify
+
+# ****************************************
+[ubuntu:11.04]
+code_name=natty
+supported=1
+scan_supported=1
+fax_supported=1
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=3.11.5
+release_date=28/04/2010
+notes=Enable the universe/multiverse repositories. Also be sure you are using the Ubuntu "Main" Repositories. See: https://help.ubuntu.com/community/Repositories/Ubuntu for more information. Disable the CD-ROM/DVD source if you do not have the Ubuntu installation media inserted in the drive. During the install process you will be added to the lp and lpadmin group, please quit the installer before the setup stage, log out, log back in, and run hp-setup to complete the install.
+ppd_install=drv
+udev_mode_fix=1
+ppd_dir=/usr/share/ppd/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt4
+native_cups=1
+acl_rules=1
+add_user_to_group=-a -Glp,lpadmin
+libdir_path=/usr/lib
+
+[ubuntu:11.04:cups]
+packages=libcups2
+
+[ubuntu:11.04:cups-devel]
+packages=libcups2-dev,cups-bsd,cups-client
+
+[ubuntu:11.04:gcc]
+packages=build-essential
+
+[ubuntu:11.04:gs]
+packages=ghostscript
+
+[ubuntu:11.04:libcrypto]
+packages=openssl
+
+[ubuntu:11.04:libjpeg]
+packages=libjpeg62-dev
+
+[ubuntu:11.04:libnetsnmp-devel]
+packages=libsnmp-dev
+
+[ubuntu:11.04:libpthread]
+packages=build-essential
+
+[ubuntu:11.04:libtool]
+packages=libtool
+
+[ubuntu:11.04:libusb]
+packages=libusb-dev
+
+[ubuntu:11.04:make]
+packages=build-essential
+
+[ubuntu:11.04:pil]
+packages=python-imaging
+
+[ubuntu:11.04:ppdev]
+packages=
+commands=sudo modprobe ppdev,sudo cp -f /etc/modules /etc/modules.hplip,echo ppdev | sudo tee -a /etc/modules
+
+[ubuntu:11.04:pyqt]
+packages=python-qt4
+
+[ubuntu:11.04:python-devel]
+packages=python-dev
+
+[ubuntu:11.04:pyqt4]
+packages=python-qt4
+
+[ubuntu:11.04:pyqt4-dbus]
+packages=python-qt4-dbus
+
+#[ubuntu:11.04:python23]
+#packages=python
+
+[ubuntu:11.04:python2x]
+packages=python
+
+[ubuntu:11.04:reportlab]
+packages=python-reportlab
+
+[ubuntu:11.04:sane]
+packages=libsane
+
+[ubuntu:11.04:sane-devel]
+packages=libsane-dev
+
+[ubuntu:11.04:scanimage]
+packages=sane-utils
+
+[ubuntu:11.04:xsane]
+packages=xsane
+
+[ubuntu:11.04:python-dbus]
+packages=python-dbus,python-gobject
+
+[ubuntu:11.04:dbus]
+packages=libdbus-1-dev
+
+[ubuntu:11.04:cups-image]
+packages=libcupsimage2-dev
+
+[ubuntu:11.04:cups-ddk]
+packages=cups
+
+[ubuntu:11.04:policykit]
+packages=policykit-1,policykit-1-gnome
+
+[ubuntu:11.04:python-notify]
+packages=python-notify
+
+# ********************
+[ubuntu:11.10]
+code_name=Oneiric
+supported=1
+scan_supported=1
+fax_supported=1
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=3.11.5
+release_date=13/10/2011
+notes=Enable the universe/multiverse repositories. Also be sure you are using the Ubuntu "Main" Repositories. See: https://help.ubuntu.com/community/Repositories/Ubuntu for more information. Disable the CD-ROM/DVD source if you do not have the Ubuntu installation media inserted in the drive. During the install process you will be added to the lp and lpadmin group, please quit the installer before the setup stage, log out, log back in, and run hp-setup to complete the install.
+ppd_install=drv
+udev_mode_fix=1
+ppd_dir=/usr/share/ppd/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt4
+native_cups=1
+acl_rules=1
+add_user_to_group=-a -Glp,lpadmin
+libdir_path=/usr/lib
+same_as_version=11.04
+
+# ********************
+[ubuntu:12.04]
+code_name=Precise
+supported=1
+scan_supported=1
+fax_supported=1
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=3.12.2
+release_date=28/04/2012
+notes=Enable the universe/multiverse repositories. Also be sure you are using the Ubuntu "Main" Repositories. See: https://help.ubuntu.com/community/Repositories/Ubuntu for more information. Disable the CD-ROM/DVD source if you do not have the Ubuntu installation media inserted in the drive. During the install process you will be added to the lp and lpadmin group, please quit the installer before the setup stage, log out, log back in, and run hp-setup to complete the install.
+ppd_install=drv
+udev_mode_fix=1
+ppd_dir=/usr/share/ppd/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt4
+native_cups=1
+acl_rules=1
+add_user_to_group=-a -Glp,lpadmin
+libdir_path=/usr/lib
+
+[ubuntu:12.04:cups]
+packages=libcups2
+
+[ubuntu:12.04:cups-devel]
+packages=libcups2-dev,cups-bsd,cups-client
+
+[ubuntu:12.04:gcc]
+packages=build-essential
+
+[ubuntu:12.04:gs]
+packages=ghostscript
+
+[ubuntu:12.04:libcrypto]
+packages=openssl
+
+[ubuntu:12.04:libjpeg]
+packages=libjpeg62-dev,libcupsimage2-dev
+
+[ubuntu:12.04:libnetsnmp-devel]
+packages=libsnmp-dev
+
+[ubuntu:12.04:libpthread]
+packages=build-essential
+
+[ubuntu:12.04:libtool]
+packages=libtool
+
+[ubuntu:12.04:libusb]
+packages=libusb-dev
+
+[ubuntu:12.04:make]
+packages=build-essential
+
+[ubuntu:12.04:pil]
+packages=python-imaging
+
+[ubuntu:12.04:ppdev]
+packages=
+commands=sudo modprobe ppdev,sudo cp -f /etc/modules /etc/modules.hplip,echo ppdev | sudo tee -a /etc/modules
+
+[ubuntu:12.04:pyqt]
+packages=python-qt4
+
+[ubuntu:12.04:python-devel]
+packages=python-dev
+
+[ubuntu:12.04:pyqt4]
+packages=python-qt4
+
+[ubuntu:12.04:pyqt4-dbus]
+packages=python-qt4-dbus
+
+#[ubuntu:12.04:python23]
+#packages=python
+
+[ubuntu:12.04:python2x]
+packages=python
+
+[ubuntu:12.04:reportlab]
+packages=python-reportlab
+
+[ubuntu:12.04:sane]
+packages=libsane
+
+[ubuntu:12.04:sane-devel]
+packages=libsane-dev
+
+[ubuntu:12.04:scanimage]
+packages=sane-utils
+
+[ubuntu:12.04:xsane]
+packages=xsane
+
+[ubuntu:12.04:python-dbus]
+packages=python-dbus,python-gobject
+
+[ubuntu:12.04:dbus]
+packages=libdbus-1-dev
+
+[ubuntu:12.04:cups-image]
+packages=libcupsimage2-dev
+
+[ubuntu:12.04:cups-ddk]
+packages=cups
+
+[ubuntu:12.04:policykit]
+packages=policykit-1,policykit-1-gnome
+
+[ubuntu:12.04:python-notify]
+packages=python-notify
+
+# ****************************************
+[debian]
+index=2
+versions=5.0,5.0.1,5.0.2,5.0.3,5.0.4,5.0.5,5.0.6,5.0.7,5.0.8,6.0,6.0.1,6.0.2,6.0.3,6.0.4
+display_name=Debian
+alt_names=
+display=1
+notes=
+package_mgrs=dpkg,apt-get,synaptic,update-manager,adept,aptitude
+package_mgr_cmd=su -c "apt-get install --force-yes -y $packages_to_install"
+pre_depend_cmd=su -c "dpkg --configure -a",su -c "apt-get install -f",su -c "apt-get update",su -c "apt-get install --yes cupsys-bsd"
+post_depend_cmd=
+hplip_remove_cmd=su -c "apt-get remove --yes hplip hpijs hplip-data"
+su_sudo=su
+ppd_install=ppd
+udev_mode_fix=1
+ppd_dir=/usr/share/ppd/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+
+# ********************
+[debian:2.2]
+code_name=Potato
+supported=0
+scan_supported=1
+fax_supported=0
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=
+release_date=2000-8-15
+notes=
+ppd_install=ppd
+udev_mode_fix=1
+ppd_dir=/usr/share/ppd/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt3
+
+[debian:2.2:cups]
+packages=cupsys,cupsys-client
+
+[debian:2.2:cups-devel]
+packages=libcupsys2-dev,cupsys-bsd
+
+[debian:2.2:gcc]
+packages=gcc,g++
+
+[debian:2.2:gs]
+packages=gs-esp
+
+[debian:2.2:libcrypto]
+packages=libsnmp5-dev
+
+[debian:2.2:libjpeg]
+packages=libjpeg62-dev
+
+[debian:2.2:libnetsnmp-devel]
+packages=libsnmp5-dev
+
+[debian:2.2:libpthread]
+packages=libc6
+
+[debian:2.2:libtool]
+packages=libtool
+
+[debian:2.2:libusb]
+packages=libusb-dev
+
+[debian:2.2:make]
+packages=make
+
+[debian:2.2:pil]
+packages=python-imaging
+
+[debian:2.2:ppdev]
+packages=
+commands=su -c "modprobe ppdev",su -c cp -f /etc/modules /etc/modules.hplip,echo ppdev | su -c tee -a /etc/modules
+
+[debian:2.2:pyqt]
+packages=python-qt3
+
+[debian:2.2:python-devel]
+packages=python-dev
+
+[debian:2.2:pyqt4]
+packages=
+
+[debian:2.2:pyqt4-dbus]
+packages=
+
+[debian:2.2:python23]
+packages=python
+
+[debian:2.2:python2x]
+packages=python
+
+[debian:2.2:reportlab]
+packages=python-reportlab
+
+[debian:2.2:sane]
+packages=sane
+
+[debian:2.2:sane-devel]
+packages=libsane-dev
+
+[debian:2.2:scanimage]
+packages=sane-utils
+
+[debian:2.2:xsane]
+packages=sane
+
+[debian:2.2:cups-ddk]
+packages=
+
+[debian:2.2:python-dbus]
+# packages=python-gobject
+
+[debian:2.2:python-ctypes]
+# packages=
+
+[debian:2.2:cups-image]
+packages=libcupsys-dev,cupsys-bsd
+
+# ********************
+[debian:3.0]
+code_name=Woody
+supported=0
+scan_supported=1
+fax_supported=0
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=
+release_date=2002-7-19
+notes=
+ppd_install=ppd
+udev_mode_fix=1
+ppd_dir=/usr/share/ppd/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt3
+
+[debian:3.0:cups]
+packages=cupsys,cupsys-client
+
+[debian:3.0:cups-devel]
+packages=libcupsys2-dev,cupsys-bsd
+
+[debian:3.0:gcc]
+packages=gcc,g++
+
+[debian:3.0:gs]
+packages=gs-esp
+
+[debian:3.0:libcrypto]
+packages=libsnmp5-dev
+
+[debian:3.0:libjpeg]
+packages=libjpeg62-dev
+
+[debian:3.0:libnetsnmp-devel]
+packages=libsnmp5-dev
+
+[debian:3.0:libpthread]
+packages=libc6
+
+[debian:3.0:libtool]
+packages=libtool
+
+[debian:3.0:libusb]
+packages=libusb-dev
+
+[debian:3.0:make]
+packages=make
+
+[debian:3.0:pil]
+packages=python-imaging
+
+[debian:3.0:ppdev]
+packages=
+commands=su -c "modprobe ppdev",su -c cp -f /etc/modules /etc/modules.hplip,echo ppdev | su -c tee -a /etc/modules
+
+[debian:3.0:pyqt]
+packages=python-qt3
+
+[debian:3.0:python-devel]
+packages=python-dev
+
+[debian:3.0:pyqt4]
+packages=
+
+[debian:3.0:pyqt4-dbus]
+packages=
+
+[debian:3.0:python23]
+packages=python
+
+[debian:3.0:python2x]
+packages=python
+
+[debian:3.0:reportlab]
+packages=python-reportlab
+
+[debian:3.0:sane]
+packages=sane,libsane-dev
+
+[debian:3.0:sane-devel]
+packages=libsane-dev
+
+[debian:3.0:scanimage]
+packages=sane-utils
+
+[debian:3.0:xsane]
+packages=sane
+
+[debian:3.0:cups-ddk]
+packages=
+
+[debian:3.0:python-dbus]
+# packages=python2.3-dbus,dbus-1-dev,python-gobject
+
+[debian:3.0:python-ctypes]
+# packages=python-ctypes
+
+[debian:3.0:cups-image]
+packages=libcupsys-dev,cupsys-bsd
+
+# ********************
+[debian:3.1]
+code_name=Sarge
+supported=0
+scan_supported=1
+fax_supported=0
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=0.9.2
+release_date=2005-6-6
+notes=
+ppd_install=ppd
+udev_mode_fix=1
+ppd_dir=/usr/share/ppd/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt4
+
+[debian:3.1:cups]
+packages=cupsys,cupsys-client
+
+[debian:3.1:cups-devel]
+packages=libcupsys2-dev,cupsys-bsd
+
+[debian:3.1:gcc]
+packages=gcc,g++
+
+[debian:3.1:gs]
+packages=gs-esp
+
+[debian:3.1:libcrypto]
+packages=libsnmp5-dev
+
+[debian:3.1:libjpeg]
+packages=libjpeg62-dev
+
+[debian:3.1:libnetsnmp-devel]
+packages=libsnmp5-dev
+
+[debian:3.1:libpthread]
+packages=libc6
+
+[debian:3.1:libtool]
+packages=libtool
+
+[debian:3.1:libusb]
+packages=libusb-dev
+
+[debian:3.1:make]
+packages=make
+
+[debian:3.1:pil]
+packages=python-imaging
+
+[debian:3.1:ppdev]
+packages=
+commands=su -c "modprobe ppdev",su -c cp -f /etc/modules /etc/modules.hplip,echo ppdev | su -c tee -a /etc/modules
+
+[debian:3.1:pyqt]
+packages=python-qt3
+
+[debian:3.1:python-devel]
+packages=python-dev
+
+[debian:3.1:pyqt4]
+packages=python-qt4
+
+[debian:3.1:pyqt4-dbus]
+packages=python-qt4-dbus
+
+[debian:3.1:python23]
+packages=python
+
+[debian:3.1:python2x]
+packages=python
+
+[debian:3.1:reportlab]
+packages=python-reportlab
+
+[debian:3.1:sane]
+packages=sane,libsane-dev
+
+[debian:3.1:sane-devel]
+packages=libsane-dev
+
+[debian:3.1:scanimage]
+packages=sane-utils
+
+[debian:3.1:xsane]
+packages=sane
+
+[debian:3.1:cups-ddk]
+# packages=cupsddk,cupsddk-drivers
+
+[debian:3.1:python-dbus]
+# packages=python2.3-dbus,dbus-1-dev,python-gobject
+
+[debian:3.1:python-ctypes]
+# packages=python-ctypes
+
+[debian:3.1:cups-image]
+packages=libcupsys-dev,cupsys-bsd
+
+# ********************
+[debian:4.0]
+code_name=Etch
+supported=0
+scan_supported=1
+fax_supported=1
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=1.6.10
+release_date=2007-4-8
+notes=Be sure to disable the CD-ROM repositories and also ensure that the main/security repositories are enabled.
+ppd_install=ppd
+udev_mode_fix=1
+ppd_dir=/usr/share/ppd/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt3
+native_cups=1
+
+[debian:4.0:cups]
+packages=cupsys,cupsys-client
+
+[debian:4.0:cups-devel]
+packages=libcupsys2-dev,cupsys-bsd
+
+[debian:4.0:cups-image]
+packages=libcupsimage2-dev
+
+[debian:4.0:gcc]
+packages=build-essential
+
+[debian:4.0:gs]
+packages=gs-esp
+
+[debian:4.0:libcrypto]
+packages=libssl-dev
+
+[debian:4.0:libjpeg]
+packages=libjpeg62-dev
+
+[debian:4.0:libnetsnmp-devel]
+packages=libsnmp9-dev
+
+[debian:4.0:libpthread]
+packages=libc6
+
+[debian:4.0:libtool]
+packages=libtool
+
+[debian:4.0:libusb]
+packages=libusb-dev
+
+[debian:4.0:make]
+packages=make
+
+[debian:4.0:pil]
+packages=python-imaging
+
+[debian:4.0:ppdev]
+packages=
+commands=su -c "modprobe ppdev",su -c cp -f /etc/modules /etc/modules.hplip,echo ppdev | su -c tee -a /etc/modules
+
+[debian:4.0:pyqt4]
+packages=python-qt3
+
+[debian:4.0:python-devel]
+packages=python-dev
+
+[debian:4.0:python2x]
+packages=python,python-ctypes
+
+[debian:4.0:reportlab]
+packages=python-reportlab
+
+[debian:4.0:sane]
+packages=sane
+
+[debian:4.0:sane-devel]
+packages=libsane-dev
+
+[debian:4.0:scanimage]
+packages=sane-utils
+
+[debian:4.0:xsane]
+packages=xsane
+
+[debian:4.0:python-dbus]
+packages=python-dbus,libdbus-1-dev
+
+[debian:4.0:python-notify]
+packages=python-notify
+
+# ************************************************
+[debian:4.0r0]
+same_as_version= 4.0
+
+[debian:4.0r1]
+same_as_version= 4.0
+
+# ********************
+[debian:5.0]
+code_name=Lenny
+supported=1
+scan_supported=1
+fax_supported=1
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=2.8.6
+release_date=
+notes=NOTE: Disable the CD Sources in your apt sources.list or the install will fail and hang.
+ppd_install=drv
+udev_mode_fix=1
+ppd_dir=/usr/share/ppd/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt4
+native_cups=1
+policykit=1
+add_user_to_group=-a -G lp,lpadmin
+
+[debian:5.0:cups]
+packages=cupsys,cupsys-client,libcupsys2-dev
+
+[debian:5.0:cups-devel]
+packages=libcupsys2-dev,cupsys-bsd
+
+[debian:5.0:gcc]
+packages=g++
+
+[debian:5.0:gs]
+packages=gs-esp
+
+[debian:5.0:libcrypto]
+packages=libssl-dev
+
+[debian:5.0:libjpeg]
+packages=libjpeg62-dev
+
+[debian:5.0:libnetsnmp-devel]
+packages=libsnmp-dev
+
+[debian:5.0:libpthread]
+packages=libc6
+
+[debian:5.0:libtool]
+packages=libtool
+
+[debian:5.0:libusb]
+packages=libusb-dev
+
+[debian:5.0:make]
+packages=make
+
+[debian:5.0:pil]
+packages=python-imaging
+
+[debian:5.0:ppdev]
+packages=
+commands=su -c "modprobe ppdev",su -c cp -f /etc/modules /etc/modules.hplip,echo ppdev | su -c tee -a /etc/modules
+
+[debian:5.0:pyqt]
+packages=python-qt3
+
+[debian:5.0:python-devel]
+packages=python-dev
+
+[debian:5.0:pyqt4]
+packages=python-qt4
+
+[debian:5.0:pyqt4-dbus]
+packages=python-qt4-dbus
+
+[debian:5.0:python23]
+packages=python
+
+[debian:5.0:python2x]
+packages=python
+
+[debian:5.0:reportlab]
+packages=python-reportlab
+
+[debian:5.0:sane]
+packages=sane
+
+[debian:5.0:sane-devel]
+packages=libsane-dev
+
+[debian:5.0:scanimage]
+packages=sane-utils
+
+[debian:5.0:xsane]
+packages=xsane
+
+[debian:5.0:cups-ddk]
+packages=
+
+[debian:5.0:python-dbus]
+packages=python-dbus,python-gobject
+
+[debian:5.0:dbus]
+packages=libdbus-1-dev
+
+[debian:5.0:python-ctypes]
+packages=python-ctypes
+
+[debian:5.0:cups-image]
+packages=libcupsimage2,libcupsimage2-dev
+
+[debian:5.0:policykit]
+packages=policykit,policykit-gnome
+
+[debian:5.0:python-notify]
+packages=python-notify
+
+[debian:5.0.1]
+same_as_version=5.0
+
+[debian:5.0.2]
+same_as_version=5.0
+
+[debian:5.0.3]
+same_as_version=5.0
+
+[debian:5.0.4]
+same_as_version=5.0
+
+[debian:5.0.5]
+same_as_version=5.0
+
+[debian:5.0.6]
+same_as_version=5.0
+
+[debian:5.0.7]
+same_as_version=5.0
+
+[debian:5.0.8]
+same_as_version=5.0
+
+# ********************
+[debian:stable]
+code_name=Etch
+supported=1
+scan_supported=1
+fax_supported=1
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=2.8.6
+release_date=2007-4-8
+notes=Be sure to disable the CD-ROM repositories and also ensure that the main/security repositories are enabled.
+ppd_install=ppd
+udev_mode_fix=1
+ppd_dir=/usr/share/ppd/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt4
+native_cups=1
+
+[debian:stable:cups]
+packages=cupsys,cupsys-client
+
+[debian:stable:cups-devel]
+packages=libcupsys2-dev,cupsys-bsd
+
+[debian:stable:gcc]
+packages=gcc,g++
+
+[debian:stable:gs]
+packages=gs-esp
+
+[debian:stable:libcrypto]
+packages=libssl-dev
+
+[debian:stable:libjpeg]
+packages=libjpeg-dev
+
+[debian:stable:libnetsnmp-devel]
+packages=libsnmp9-dev
+
+[debian:stable:libpthread]
+packages=libc6
+
+[debian:stable:libtool]
+packages=libtool
+
+[debian:stable:libusb]
+packages=libusb-dev
+
+[debian:stable:make]
+packages=make
+
+[debian:stable:pil]
+packages=python-imaging
+
+[debian:stable:ppdev]
+packages=
+commands=su -c "modprobe ppdev",su -c cp -f /etc/modules /etc/modules.hplip,echo ppdev | su -c tee -a /etc/modules
+
+[debian:stable:pyqt]
+packages=python-qt3
+
+[debian:stable:python-devel]
+packages=python-dev
+
+[debian:stable:pyqt4]
+packages=python-qt4
+
+[debian:stable:pyqt4-dbus]
+packages=python-qt4-dbus
+
+[debian:stable:python23]
+packages=python
+
+[debian:stable:python2x]
+packages=python
+
+[debian:stable:reportlab]
+packages=python-reportlab
+
+[debian:stable:sane]
+packages=sane
+
+[debian:stable:sane-devel]
+packages=libsane-dev
+
+[debian:stable:scanimage]
+packages=sane-utils
+
+[debian:stable:xsane]
+packages=xsane
+
+[debian:stable:cups-ddk]
+packages=
+
+[debian:stable:python-dbus]
+packages=python-dbus,python-gobject
+
+[debian:stable:dbus]
+packages=libdbus-1-dev
+
+[debian:stable:python-ctypes]
+packages=python-ctypes
+
+[debian:stable:cups-image]
+packages=libcupsys2-dev,cupsys-bsd
+
+[debian:stable:python-notify]
+packages=python-notify
+
+# ********************
+[debian:testing]
+code_name=sid
+supported=1
+scan_supported=1
+fax_supported=1
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=2.8.6
+release_date=
+notes=NOTE: Disable the CD Sources in your apt sources.list or the install will fail and hang. Also make sure all the lenny repositories are enabled or the install will fail.
+ppd_install=ppd
+udev_mode_fix=1
+ppd_dir=/usr/share/ppd/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt4
+native_cups=1
+
+[debian:testing:cups]
+packages=libcups2
+
+[debian:testing:cups-devel]
+packages=libcups2-dev,cups-bsd,cups-client
+
+[debian:testing:gcc]
+packages=g++
+
+[debian:testing:gs]
+packages=ghostscript,ghostscript-cups,ghostscript-x
+
+[debian:testing:libcrypto]
+packages=libssl-dev
+
+[debian:testing:libjpeg]
+packages=libjpeg62-dev
+
+[debian:testing:libnetsnmp-devel]
+packages=libsnmp-dev
+
+[debian:testing:libpthread]
+packages=libc6
+
+[debian:testing:libtool]
+packages=libtool
+
+[debian:testing:libusb]
+packages=libusb-dev
+
+[debian:testing:make]
+packages=make
+
+[debian:testing:pil]
+packages=python-imaging
+
+[debian:testing:ppdev]
+packages=
+commands=su -c "modprobe ppdev",su -c cp -f /etc/modules /etc/modules.hplip,echo ppdev | su -c tee -a /etc/modules
+
+[debian:testing:pyqt]
+packages=python-qt3
+
+[debian:testing:python-devel]
+packages=python-dev
+
+[debian:testing:pyqt4]
+packages=python-qt4
+
+[debian:testing:pyqt4-dbus]
+packages=python-qt4-dbus
+
+[debian:testing:python23]
+packages=python
+
+[debian:testing:python2x]
+packages=python
+
+[debian:testing:reportlab]
+packages=python-reportlab
+
+[debian:testing:sane]
+packages=libsane
+
+[debian:testing:sane-devel]
+packages=libsane-dev
+
+[debian:testing:scanimage]
+packages=sane-utils
+
+[debian:testing:xsane]
+packages=sane
+
+[debian:testing:cups-ddk]
+packages=
+
+[debian:testing:python-dbus]
+packages=python-dbus,python-gobject
+
+[debian:testing:dbus]
+packages=libdbus-1-dev
+
+[debian:testing:python-ctypes]
+packages=python-ctypes
+
+[debian:testing:cups-image]
+packages=libcupsimage2,libcupsimage2-dev
+
+[debian:testing:python-notify]
+packages=python-notify
+
+# ********************
+[debian:lenny/sid]
+code_name=sid
+supported=1
+scan_supported=1
+fax_supported=1
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=2.8.6
+release_date=
+notes=NOTE: Disable the CD Sources in your apt sources.list or the install will fail and hang. Also make sure all the lenny repositories are enabled or the install will fail.
+ppd_install=ppd
+udev_mode_fix=1
+ppd_dir=/usr/share/ppd/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt4
+native_cups=1
+
+[debian:lenny/sid:cups]
+packages=cupsys,cupsys-client
+
+[debian:lenny/sid:cups-devel]
+packages=libcupsys2-dev,cupsys-bsd
+
+[debian:lenny/sid:gcc]
+packages=g++
+
+[debian:lenny/sid:gs]
+packages=gs-esp
+
+[debian:lenny/sid:libcrypto]
+packages=libssl-dev
+
+[debian:lenny/sid:libjpeg]
+packages=libjpeg62-dev
+
+[debian:lenny/sid:libnetsnmp-devel]
+packages=libsnmp-dev
+
+[debian:lenny/sid:libpthread]
+packages=libc6
+
+[debian:lenny/sid:libtool]
+packages=libtool
+
+[debian:lenny/sid:libusb]
+packages=libusb-dev
+
+[debian:lenny/sid:make]
+packages=make
+
+[debian:lenny/sid:pil]
+packages=python-imaging
+
+[debian:lenny/sid:ppdev]
+packages=
+commands=su -c "modprobe ppdev",su -c cp -f /etc/modules /etc/modules.hplip,echo ppdev | su -c tee -a /etc/modules
+
+[debian:lenny/sid:pyqt]
+packages=python-qt3
+
+[debian:lenny/sid:python-devel]
+packages=python-dev
+
+[debian:lenny/sid:pyqt4]
+packages=python-qt4,python-qt4-dbus
+
+[debian:lenny/sid:pyqt4-dbus]
+packages=python-qt4-dbus
+
+[debian:lenny/sid:python23]
+packages=python
+
+[debian:lenny/sid:python2x]
+packages=python
+
+[debian:lenny/sid:reportlab]
+packages=python-reportlab
+
+[debian:lenny/sid:sane]
+packages=libsane
+
+[debian:lenny/sid:sane-devel]
+packages=libsane-dev
+
+[debian:lenny/sid:scanimage]
+packages=sane-utils
+
+[debian:lenny/sid:xsane]
+packages=sane
+
+[debian:lenny/sid:cups-ddk]
+packages=
+
+[debian:lenny/sid:python-dbus]
+packages=python-dbus,python-gobject
+
+[debian:lenny/sid:dbus]
+packages=libdbus-1-dev
+
+[debian:lenny/sid:python-ctypes]
+packages=python-ctypes
+
+[debian:lenny/sid:cups-image]
+packages=libcupsys2-dev,cupsys-bsd
+
+[debian:lenny/sid:python-notify]
+packages=python-notify
+
+# ********************
+[debian:lenny]
+code_name=sid
+supported=1
+scan_supported=1
+fax_supported=1
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=2.8.6
+release_date=
+notes=NOTE: Disable the CD Sources in your apt sources.list or the install will fail and hang. Also make sure all the lenny repositories are enabled or the install will fail.
+ppd_install=ppd
+udev_mode_fix=1
+ppd_dir=/usr/share/ppd/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt4
+native_cups=1
+
+[debian:lenny:cups]
+packages=cupsys,cupsys-client
+
+[debian:lenny:cups-devel]
+packages=libcupsys2-dev,cupsys-bsd
+
+[debian:lenny:gcc]
+packages=g++
+
+[debian:lenny:gs]
+packages=gs-esp
+
+[debian:lenny:libcrypto]
+packages=libssl-dev
+
+[debian:lenny:libjpeg]
+packages=libjpeg62-dev
+
+[debian:lenny:libnetsnmp-devel]
+packages=libsnmp-dev
+
+[debian:lenny:libpthread]
+packages=libc6
+
+[debian:lenny:libtool]
+packages=libtool
+
+[debian:lenny:libusb]
+packages=libusb-dev
+
+[debian:lenny:make]
+packages=make
+
+[debian:lenny:pil]
+packages=python-imaging
+
+[debian:lenny:ppdev]
+packages=
+commands=su -c "modprobe ppdev",su -c cp -f /etc/modules /etc/modules.hplip,echo ppdev | su -c tee -a /etc/modules
+
+[debian:lenny:pyqt]
+packages=python-qt3
+
+[debian:lenny:python-devel]
+packages=python-dev
+
+[debian:lenny:pyqt4]
+packages=python-qt4
+
+[debian:lenny:pyqt4-dbus]
+packages=python-qt4-dbus
+
+[debian:lenny:python23]
+packages=python
+
+[debian:lenny:python2x]
+packages=python
+
+[debian:lenny:reportlab]
+packages=python-reportlab
+
+[debian:lenny:sane]
+packages=libsane
+
+[debian:lenny:sane-devel]
+packages=libsane-dev
+
+[debian:lenny:scanimage]
+packages=sane-utils
+
+[debian:lenny:xsane]
+packages=sane
+
+[debian:lenny:cups-ddk]
+packages=
+
+[debian:lenny:python-dbus]
+packages=python-dbus,python-gobject
+
+[debian:lenny:dbus]
+packages=libdbus-1-dev
+
+[debian:lenny:python-ctypes]
+packages=python-ctypes
+
+[debian:lenny:cups-image]
+packages=libcupsys2-dev,cupsys-bsd
+
+[debian:lenny:python-notify]
+packages=python-notify
+
+# ********************
+[debian:6.0]
+code_name=Squeeze
+supported=1
+scan_supported=1
+fax_supported=1
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=2.8.6
+release_date=
+notes=NOTE: Disable the CD Sources in your apt sources.list or the install will fail and hang.
+ppd_install=drv
+udev_mode_fix=1
+ppd_dir=/usr/share/ppd/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt4
+native_cups=1
+policykit=0
+add_user_to_group=-a -G lp,lpadmin
+
+[debian:6.0:cups]
+packages=libcups2
+
+[debian:6.0:cups-devel]
+packages=libcups2-dev,cups-bsd,cups-client
+
+[debian:6.0:gcc]
+packages=g++
+
+[debian:6.0:gs]
+packages=gs-esp
+
+[debian:6.0:libcrypto]
+packages=libssl-dev
+
+[debian:6.0:libjpeg]
+packages=libjpeg62-dev
+
+[debian:6.0:libnetsnmp-devel]
+packages=libsnmp-dev
+
+[debian:6.0:libpthread]
+packages=libc6
+
+[debian:6.0:libtool]
+packages=libtool
+
+[debian:6.0:libusb]
+packages=libusb-dev
+
+[debian:6.0:make]
+packages=make
+
+[debian:6.0:pil]
+packages=python-imaging
+
+[debian:6.0:ppdev]
+packages=
+commands=su -c "modprobe ppdev",su -c cp -f /etc/modules /etc/modules.hplip,echo ppdev | su -c tee -a /etc/modules
+
+[debian:6.0:pyqt]
+packages=python-qt3
+
+[debian:6.0:python-devel]
+packages=python-dev
+
+[debian:6.0:pyqt4]
+packages=python-qt4
+
+[debian:6.0:pyqt4-dbus]
+packages=python-qt4-dbus
+
+[debian:6.0:python23]
+packages=python
+
+[debian:6.0:python2x]
+packages=python
+
+[debian:6.0:reportlab]
+packages=python-reportlab
+
+[debian:6.0:sane]
+packages=sane
+
+[debian:6.0:sane-devel]
+packages=libsane-dev
+
+[debian:6.0:scanimage]
+packages=sane-utils
+
+[debian:6.0:xsane]
+packages=xsane
+
+[debian:6.0:cups-ddk]
+packages=
+
+[debian:6.0:python-dbus]
+packages=python-dbus,python-gobject
+
+[debian:6.0:dbus]
+packages=libdbus-1-dev
+
+[debian:6.0:python-ctypes]
+packages=python-ctypes
+
+[debian:6.0:cups-image]
+packages=libcupsimage2,libcupsimage2-dev
+
+[debian:6.0:policykit]
+packages=policykit-1,policykit-1-gnome
+
+[debian:6.0:python-notify]
+packages=python-notify
+
+[debian:6.0.1]
+same_as_version=6.0
+
+[debian:6.0.2]
+same_as_version=6.0
+
+[debian:6.0.3]
+same_as_version=6.0
+
+[debian:6.0.4]
+same_as_version=6.0
+
+# ****************************************
+[xandros]
+index=13
+versions=any
+display_name=Xandros
+alt_names=
+display=0
+notes=
+package_mgrs=
+package_mgr_cmd=
+pre_depend_cmd=
+post_depend_cmd=
+hplip_remove_cmd=
+su_sudo=su
+ppd_install=ppd
+udev_mode_fix=1
+ppd_dir=/usr/share/ppd/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+
+# ********************
+[xandros:any]
+code_name=
+supported=0
+scan_supported=1
+fax_supported=0
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=
+release_date=
+notes=
+ppd_install=ppd
+udev_mode_fix=1
+ppd_dir=/usr/share/ppd/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt3
+
+# ****************************************
+[pcbsd]
+index=19
+versions=any
+display_name=PC-BSD
+alt_names=
+display=0
+notes=
+package_mgrs=
+package_mgr_cmd=
+pre_depend_cmd=
+post_depend_cmd=
+hplip_remove_cmd=
+su_sudo=su
+ppd_install=ppd
+udev_mode_fix=1
+ppd_dir=/usr/share/ppd/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+
+# ********************
+[pcbsd:any]
+code_name=
+supported=0
+scan_supported=1
+fax_supported=0
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=
+release_date=
+notes=
+ppd_install=ppd
+udev_mode_fix=1
+ppd_dir=/usr/share/ppd/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt3
+
+# ****************************************
+[miracle]
+index=21
+versions=any
+display_name=Miracle Linux
+alt_names=
+display=0
+notes=
+package_mgrs=
+package_mgr_cmd=
+pre_depend_cmd=
+post_depend_cmd=
+hplip_remove_cmd=
+su_sudo=su
+ppd_install=ppd
+udev_mode_fix=1
+ppd_dir=/usr/share/ppd/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+
+# ********************
+[miracle:any]
+code_name=
+supported=0
+scan_supported=1
+fax_supported=0
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=
+release_date=
+notes=
+ppd_install=ppd
+udev_mode_fix=1
+ppd_dir=/usr/share/ppd/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt3
+
+# ****************************************
+[asianux]
+index=18
+versions=any
+display_name=AsianUX
+alt_names=
+display=0
+notes=
+package_mgrs=
+package_mgr_cmd=
+pre_depend_cmd=
+post_depend_cmd=
+hplip_remove_cmd=
+su_sudo=su
+ppd_install=ppd
+udev_mode_fix=1
+ppd_dir=/usr/share/ppd/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+
+# ********************
+[asianux:any]
+code_name=
+supported=0
+scan_supported=1
+fax_supported=0
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=
+release_date=
+notes=
+ppd_install=ppd
+udev_mode_fix=1
+ppd_dir=/usr/share/ppd/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt3
+
+# ****************************************
+[freebsd]
+index=14
+versions=any
+display_name=FreeBSD
+alt_names=
+display=0
+notes=
+package_mgrs=
+package_mgr_cmd=
+pre_depend_cmd=
+post_depend_cmd=
+hplip_remove_cmd=
+su_sudo=su
+ppd_install=ppd
+udev_mode_fix=1
+ppd_dir=/usr/share/ppd/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+
+# ********************
+[freebsd:any]
+code_name=
+supported=0
+scan_supported=1
+fax_supported=0
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=
+release_date=
+notes=
+ppd_install=ppd
+udev_mode_fix=1
+ppd_dir=/usr/share/ppd/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt3
+
+# ****************************************
+[mepis]
+index=1
+versions=6.0,6.5,7.0,8.0
+display_name=Mepis
+alt_names=
+display=1
+notes=
+package_mgrs=dpkg,apt-get,synaptic,update-manager,adept,aptitude
+package_mgr_cmd=su -c "apt-get install --yes $packages_to_install"
+pre_depend_cmd=su -c "dpkg --configure -a",su -c "apt-get update"
+post_depend_cmd=
+hplip_remove_cmd=su -c "apt-get remove --yes hplip hpijs"
+su_sudo=su
+ppd_install=ppd
+udev_mode_fix=1
+ppd_dir=/usr/share/ppd/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+
+# ********************
+[mepis:6.0]
+code_name=
+supported=0
+scan_supported=1
+fax_supported=0
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=0.9.7
+release_date=2006-07-22
+notes=Before proceeding please enable the universe/multiverse repositories in Synaptic or Apt.
+udev_mode_fix=1
+fix_ppd_symlink=0
+ppd_install=ppd
+ppd_dir=/usr/share/ppd/HP
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt4
+
+[mepis:6.0:cups]
+packages=libcupsys2
+
+[mepis:6.0:cups-devel]
+packages=libcupsys2-dev
+
+[mepis:6.0:gcc]
+packages=build-essential
+
+[mepis:6.0:gs]
+packages=gs-esp
+
+[mepis:6.0:libcrypto]
+packages=openssl
+
+[mepis:6.0:libjpeg]
+packages=libjpeg62-dev
+
+[mepis:6.0:libnetsnmp-devel]
+packages=libsnmp9-dev
+
+[mepis:6.0:libpthread]
+packages=build-essential
+
+[mepis:6.0:libtool]
+packages=libtool
+
+[mepis:6.0:libusb]
+packages=libusb-dev
+
+[mepis:6.0:make]
+packages=build-essential
+
+[mepis:6.0:pil]
+packages=python-imaging
+
+[mepis:6.0:ppdev]
+packages=
+commands=su -c "modprobe ppdev",su -c cp -f /etc/modules /etc/modules.hplip,echo ppdev | su -c tee -a /etc/modules
+
+[mepis:6.0:pyqt]
+packages=python-qt3
+
+[mepis:6.0:python-devel]
+packages=python-dev
+
+[mepis:6.0:pyqt4]
+packages=python-qt4
+
+[mepis:6.0:pyqt4-dbus]
+packages=python-qt4-dbus
+
+[mepis:6.0:python23]
+packages=python
+
+[mepis:6.0:python2x]
+packages=python
+
+[mepis:6.0:reportlab]
+packages=python-reportlab
+
+[mepis:6.0:sane]
+packages=sane,libsane-dev
+
+[mepis:6.0:sane-devel]
+packages=libsane-dev
+
+[mepis:6.0:scanimage]
+packages=sane-utils
+
+[mepis:6.0:xsane]
+packages=xsane
+
+[mepis:6.0:cups-ddk]
+packages=
+
+[mepis:6.0:python-dbus]
+# packages=python2.4-dbus,libdbus-1-dev,python-gobject
+
+[mepis:6.0:python-ctypes]
+# packages=python-ctypes
+
+[mepis:6.0:cups-image]
+packages=libcupsys2-dev
+
+# ********************
+[mepis:6.5]
+code_name=
+supported=0
+scan_supported=1
+fax_supported=0
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=1.7.3
+release_date=2006-4-4
+notes=Before proceeding please enable the universe/multiverse repositories in Synaptic or Apt.
+udev_mode_fix=1
+fix_ppd_symlink=0
+ppd_install=ppd
+ppd_dir=/usr/share/ppd/HP
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt4
+
+[mepis:6.5:cups]
+packages=libcupsys2
+
+[mepis:6.5:cups-devel]
+packages=libcupsys2-dev
+
+[mepis:6.5:gcc]
+packages=build-essential
+
+[mepis:6.5:gs]
+packages=gs-esp
+
+[mepis:6.5:libcrypto]
+packages=openssl
+
+[mepis:6.5:libjpeg]
+packages=libjpeg62-dev
+
+[mepis:6.5:libnetsnmp-devel]
+packages=libsnmp9-dev
+
+[mepis:6.5:libpthread]
+packages=build-essential
+
+[mepis:6.5:libtool]
+packages=libtool
+
+[mepis:6.5:libusb]
+packages=libusb-dev
+
+[mepis:6.5:make]
+packages=build-essential
+
+[mepis:6.5:pil]
+packages=python-imaging
+
+[mepis:6.5:ppdev]
+packages=
+commands=su -c "modprobe ppdev",su -c cp -f /etc/modules /etc/modules.hplip,echo ppdev | su -c tee -a /etc/modules
+
+[mepis:6.5:pyqt]
+packages=python-qt3
+
+[mepis:6.5:python-devel]
+packages=python-dev
+
+[mepis:6.5:pyqt4]
+packages=python-qt4
+
+[mepis:6.5:pyqt4-dbus]
+packages=python-qt4-dbus
+
+[mepis:6.5:python23]
+packages=python
+
+[mepis:6.5:python2x]
+packages=python
+
+[mepis:6.5:reportlab]
+packages=python-reportlab
+
+[mepis:6.5:sane]
+packages=sane,libsane-dev
+
+[mepis:6.5:sane-devel]
+packages=libsane-dev
+
+[mepis:6.5:scanimage]
+packages=sane-utils
+
+[mepis:6.5:xsane]
+packages=xsane
+
+[mepis:6.5:cups-ddk]
+packages=
+
+[mepis:6.5:python-dbus]
+# packages=python2.4-dbus,libdbus-1-dev,python-gobject
+
+[mepis:6.5:python-ctypes]
+# packages=python-ctypes
+
+[mepis:6.5:cups-image]
+packages=libcupsys2-dev
+
+# ********************
+[mepis:7.0]
+code_name=
+supported=0
+scan_supported=1
+fax_supported=0
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=2.7.10
+release_date=
+notes=Before proceeding please enable the universe/multiverse repositories in Synaptic or Apt.
+udev_mode_fix=1
+fix_ppd_symlink=0
+ppd_install=ppd
+ppd_dir=/usr/share/ppd/HP
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt4
+
+[mepis:7.0:cups]
+packages=libcupsys2
+
+[mepis:7.0:cups-devel]
+packages=libcupsys2-dev
+
+[mepis:7.0:gcc]
+packages=build-essential
+
+[mepis:7.0:gs]
+packages=gs-esp
+
+[mepis:7.0:libcrypto]
+packages=openssl
+
+[mepis:7.0:libjpeg]
+packages=libjpeg62-dev
+
+[mepis:7.0:libnetsnmp-devel]
+packages=libsnmp9-dev
+
+[mepis:7.0:libpthread]
+packages=build-essential
+
+[mepis:7.0:libtool]
+packages=libtool
+
+[mepis:7.0:libusb]
+packages=libusb-dev
+
+[mepis:7.0:make]
+packages=build-essential
+
+[mepis:7.0:pil]
+packages=python-imaging
+
+[mepis:7.0:ppdev]
+packages=
+commands=su -c "modprobe ppdev",su -c cp -f /etc/modules /etc/modules.hplip,echo ppdev | su -c tee -a /etc/modules
+
+[mepis:7.0:pyqt]
+packages=python-qt3
+
+[mepis:7.0:python-devel]
+packages=python-dev
+
+[mepis:7.0:pyqt4]
+packages=python-qt4
+
+[mepis:7.0:pyqt4-dbus]
+packages=python-qt4-dbus
+
+[mepis:7.0:python23]
+packages=python
+
+[mepis:7.0:python2x]
+packages=python
+
+[mepis:7.0:reportlab]
+packages=python-reportlab
+
+[mepis:7.0:sane]
+packages=sane,libsane-dev
+
+[mepis:7.0:sane-devel]
+packages=libsane-dev
+
+[mepis:7.0:scanimage]
+packages=sane-utils
+
+[mepis:7.0:xsane]
+packages=xsane
+
+[mepis:7.0:cups-ddk]
+packages=
+
+[mepis:7.0:python-dbus]
+packages=python-dbus,libdbus-1-dev,python-gobject
+
+[mepis:7.0:python-ctypes]
+packages=python-ctypes
+
+[mepis:7.0:cups-image]
+packages=libcupsys2-dev
+
+# ********************
+[mepis:8.0]
+code_name=
+supported=0
+scan_supported=1
+fax_supported=0
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=
+release_date=
+notes=Before proceeding please enable the universe/multiverse repositories in Synaptic or Apt.
+udev_mode_fix=1
+fix_ppd_symlink=0
+ppd_install=ppd
+ppd_dir=/usr/share/ppd/HP
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt4
+
+[mepis:8.0:cups]
+packages=libcupsys2
+
+[mepis:8.0:cups-devel]
+packages=libcupsys2-dev
+
+[mepis:8.0:gcc]
+packages=build-essential
+
+[mepis:8.0:gs]
+packages=gs-esp
+
+[mepis:8.0:libcrypto]
+packages=openssl
+
+[mepis:8.0:libjpeg]
+packages=libjpeg62-dev
+
+[mepis:8.0:libnetsnmp-devel]
+packages=libsnmp9-dev
+
+[mepis:8.0:libpthread]
+packages=build-essential
+
+[mepis:8.0:libtool]
+packages=libtool
+
+[mepis:8.0:libusb]
+packages=libusb-dev
+
+[mepis:8.0:make]
+packages=build-essential
+
+[mepis:8.0:pil]
+packages=python-imaging
+
+[mepis:8.0:ppdev]
+packages=
+commands=su -c "modprobe ppdev",su -c cp -f /etc/modules /etc/modules.hplip,echo ppdev | su -c tee -a /etc/modules
+
+[mepis:8.0:pyqt]
+packages=python-qt3
+
+[mepis:8.0:python-devel]
+packages=python-dev
+
+[mepis:8.0:pyqt4]
+packages=python-qt4
+
+[mepis:8.0:pyqt4-dbus]
+packages=python-qt4-dbus
+
+[mepis:8.0:python23]
+packages=python
+
+[mepis:8.0:python2x]
+packages=python
+
+[mepis:8.0:reportlab]
+packages=python-reportlab
+
+[mepis:8.0:sane]
+packages=sane,libsane-dev
+
+[mepis:8.0:sane-devel]
+packages=libsane-dev
+
+[mepis:8.0:scanimage]
+packages=sane-utils
+
+[mepis:8.0:xsane]
+packages=xsane
+
+[mepis:8.0:cups-ddk]
+packages=
+
+[mepis:8.0:python-dbus]
+packages=python-dbus,libdbus-1-dev,python-gobject
+
+[mepis:8.0:python-ctypes]
+packages=python-ctypes
+
+[mepis:8.0:cups-image]
+packages=libcupsys2-dev
+
+# ****************************************
+[mandriva]
+index=4
+versions=2010.0,2011.0
+display_name=Mandriva Linux
+alt_names=Mandrakelinux,Mandrake Linux
+display=1
+notes=
+package_mgrs=urpmi
+package_mgr_cmd=su - -c "urpmi --allow-force --force --auto $packages_to_install"
+pre_install_cmd=su - -c "/etc/init.d/cups restart",su - -c "touch /etc/security/console.perms.d/60-hplip.perms && echo '<usb>=/dev/usb/dabusb* /dev/usb/mdc800* /dev/usb/rio500 /dev/ttyUSB*' | tee /etc/security/console.perms.d/60-hplip.perms"
+pre_depend_cmd=su - -c "rm /etc/hp/hplip.conf"
+post_depend_cmd=su - -c "/etc/init.d/cups restart", su - -c "chmod 700 /usr/lib/cups/backend/hp"
+hplip_remove_cmd=su - -c "urpme hplip task-printing-hp"
+su_sudo=su
+ppd_install=drv
+udev_mode_fix=1
+ppd_dir=/usr/share/cups/model/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+
+# ********************
+[mandriva:9.1]
+code_name=Bamboo
+supported=0
+scan_supported=1
+fax_supported=0
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=
+release_date=2003-3-25
+notes=Before proceeding, please add the "contrib", "main", and "updates" installation sources to your URPMI configuration. Open your browser and go to http://easyurpmi.zarb.org/ and follow the instructions provided and then proceed with the HPLIP install. Also you may wish to turn off the cdrom1-12 media sources to speed up the process.
+ppd_install=drv
+udev_mode_fix=1
+ppd_dir=/usr/share/cups/model/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt3
+
+# ********************
+[mandriva:9.2]
+code_name=Fivestar
+supported=0
+scan_supported=1
+fax_supported=0
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=
+release_date=2003-10-14
+notes=Before proceeding, please add the "contrib", "main", and "updates" installation sources to your URPMI configuration. Open your browser and go to http://easyurpmi.zarb.org/ and follow the instructions provided and then proceed with the HPLIP install. Also you may wish to turn off the cdrom1-12 media sources to speed up the process.
+ppd_install=drv
+udev_mode_fix=1
+ppd_dir=/usr/share/cups/model/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt3
+
+# ********************
+[mandriva:10.0]
+code_name=Community and official
+supported=0
+scan_supported=1
+fax_supported=0
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=0.9.1
+release_date=2004-3-4
+notes=Before proceeding, please add the "contrib", "main", and "updates" installation sources to your URPMI configuration./n Open your browser and go to http://easyurpmi.zarb.org/ and follow the instructions provided and then proceed with the HPLIP install. Also you may wish to turn off the cdrom1-12 media sources to speed up the process.
+ppd_install=drv
+udev_mode_fix=1
+ppd_dir=/usr/share/cups/model/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt3
+
+# ********************
+[mandriva:10.1]
+code_name=Official
+supported=0
+scan_supported=1
+fax_supported=0
+pcard_supported=1
+network_supported=0
+parallel_supported=1
+usb_supported=1
+packaged_version=0.9.1
+release_date=2004-9-16
+notes=Before proceeding, please add the "contrib", "main", and "updates" installation sources to your URPMI configuration./n Open your browser and go to http://easyurpmi.zarb.org/ and follow the instructions provided and then proceed with the HPLIP install. Also be sure to disable the cdrom1-12 media sources. *Important* After the install run: su -c "/usr/sbin/usermod -G lp <your.username> Then logout and log back in.
+ppd_install=ppd
+udev_mode_fix=1
+ppd_dir=/usr/share/cups/model/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt4
+
+[mandriva:10.1:cups]
+packages=cups
+
+[mandriva:10.1:cups-devel]
+packages=cups-devel
+
+[mandriva:10.1:gcc]
+packages=gcc-c++
+
+[mandriva:10.1:gs]
+packages=ghostscript
+
+[mandriva:10.1:libcrypto]
+packages=libcryptopp5,libcryptopp5-devel
+
+[mandriva:10.1:libjpeg]
+packages=libjpeg62-dev
+
+[mandriva:10.1:libnetsnmp-devel]
+packages=libsnmp0-devel
+
+[mandriva:10.1:libpthread]
+packages=glibc
+
+[mandriva:10.1:libtool]
+packages=libtool
+
+[mandriva:10.1:libusb]
+packages=libusb0.1_4-devel
+
+[mandriva:10.1:make]
+packages=make
+
+[mandriva:10.1:pil]
+packages=python-imaging
+
+[mandriva:10.1:ppdev]
+packages=
+commands=su -c "modprobe ppdev"
+
+[mandriva:10.1:pyqt]
+packages=PyQt
+
+[mandriva:10.1:python-devel]
+packages=python-devel
+
+[mandriva:10.1:pyqt4]
+packages=python-qt4
+
+[mandriva:10.1:pyqt4-dbus]
+packages=dbus-python
+
+[mandriva:10.1:python23]
+packages=python
+
+[mandriva:10.1:python2x]
+packages=python
+
+[mandriva:10.1:reportlab]
+packages=python-reportlab
+
+[mandriva:10.1:sane]
+packages=sane
+
+[mandriva:10.1:sane-devel]
+packages=libsane1-devel
+
+[mandriva:10.1:scanimage]
+packages=libsane1
+
+[mandriva:10.1:xsane]
+packages=xsane
+
+[mandriva:10.1:cups-ddk]
+# packages=cupsddk,cupsddk-drivers
+
+[mandriva:10.1:python-dbus]
+# packages=dbus-python,libdbus-1_0-devel,python-gobject
+
+[mandriva:10.1:python-ctypes]
+# packages=python-ctypes
+
+[mandriva:10.1:cups-image]
+packages=cups-devel
+
+# ********************
+[mandriva:10.2]
+code_name=Limited edition 2005
+supported=0
+scan_supported=1
+fax_supported=0
+pcard_supported=1
+network_supported=0
+parallel_supported=1
+usb_supported=1
+packaged_version=0.9.1
+release_date=2005-4-14
+notes=Before proceeding, please add the "contrib", "main", and "updates" installation sources to your URPMI configuration./n Open your browser and go to http://easyurpmi.zarb.org/ and follow the instructions provided and then proceed with the HPLIP install. Also be sure to disable the cdrom1-12 media sources.
+ppd_install=ppd
+udev_mode_fix=1
+ppd_dir=/usr/share/cups/model/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt4
+
+[mandriva:10.2:cups]
+packages=cups
+
+[mandriva:10.2:cups-devel]
+packages=cups-devel
+
+[mandriva:10.2:gcc]
+packages=gcc-c++
+
+[mandriva:10.2:gs]
+packages=ghostscript
+
+[mandriva:10.2:libcrypto]
+packages=libcryptopp5,libcryptopp5-devel
+
+[mandriva:10.2:libjpeg]
+packages=libjpeg62-dev
+
+[mandriva:10.2:libnetsnmp-devel]
+packages=libsnmp0-devel
+
+[mandriva:10.2:libpthread]
+packages=glibc
+
+[mandriva:10.2:libtool]
+packages=libtool
+
+[mandriva:10.2:libusb]
+packages=libusb0.1_4-devel
+
+[mandriva:10.2:make]
+packages=make
+
+[mandriva:10.2:pil]
+packages=python-imaging
+
+[mandriva:10.2:ppdev]
+packages=
+commands=su -c "modprobe ppdev"
+
+[mandriva:10.2:pyqt]
+packages=PyQt
+
+[mandriva:10.2:python-devel]
+packages=python-devel
+
+[mandriva:10.2:pyqt4]
+packages=python-qt4
+
+[mandriva:10.2:pyqt4-dbus]
+packages=dbus-python
+
+[mandriva:10.2:python23]
+packages=python
+
+[mandriva:10.2:python2x]
+packages=python
+
+[mandriva:10.2:reportlab]
+packages=python-reportlab
+
+[mandriva:10.2:sane]
+packages=sane
+
+[mandriva:10.2:sane-devel]
+packages=libsane1-devel
+
+[mandriva:10.2:scanimage]
+packages=libsane1
+
+[mandriva:10.2:xsane]
+packages=xsane
+
+[mandriva:10.2:cups-ddk]
+# packages=cupsddk,cupsddk-drivers
+
+[mandriva:10.2:python-dbus]
+# packages=dbus-python,libdbus-1_0-devel,python-gobject
+
+[mandriva:10.2:python-ctypes]
+# packages=python-ctypes
+
+[mandriva:10.2:cups-image]
+packages=cups-devel
+
+# ********************
+[mandriva:2006.0]
+code_name=2k6
+supported=0
+scan_supported=1
+fax_supported=0
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=0.9.8
+release_date=2005-4-14
+notes=Before proceeding, please add the "contrib", "main", and "updates" installation sources to your URPMI configuration./n Open your browser and go to http://easyurpmi.zarb.org/ and follow the instructions provided and then proceed with the HPLIP install. Also you may wish to turn off the cdrom1-12 media sources to speed up the process.
+ppd_install=drv
+udev_mode_fix=1
+ppd_dir=/usr/share/ppd/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt4
+
+[mandriva:2006.0:cups]
+packages=cups
+
+[mandriva:2006.0:cups-devel]
+packages=cups-devel
+
+[mandriva:2006.0:gcc]
+packages=gcc-c++
+
+[mandriva:2006.0:gs]
+packages=ghostscript
+
+[mandriva:2006.0:libcrypto]
+packages=libcryptopp5,libcryptopp5-devel
+
+[mandriva:2006.0:libjpeg]
+packages=libjpeg62-dev
+
+[mandriva:2006.0:libnetsnmp-devel]
+packages=libsnmp0-devel
+
+[mandriva:2006.0:libpthread]
+packages=glibc-i18ndata-2.3.5-5mdk.i586,glibc_lsb-2.3.4-2mdk.i586
+
+[mandriva:2006.0:libtool]
+packages=libtool
+
+[mandriva:2006.0:libusb]
+packages=libusb0.1_4-devel
+
+[mandriva:2006.0:make]
+packages=make
+
+[mandriva:2006.0:pil]
+packages=python-imaging
+
+[mandriva:2006.0:ppdev]
+packages=
+commands=su -c "modprobe ppdev"
+
+[mandriva:2006.0:pyqt]
+packages=PyQt
+
+[mandriva:2006.0:python-devel]
+packages=python-devel
+
+[mandriva:2006.0:pyqt4]
+packages=python-qt4
+
+[mandriva:2006.0:pyqt4-dbus]
+packages=dbus-python
+
+[mandriva:2006.0:python23]
+packages=python
+
+[mandriva:2006.0:python2x]
+packages=python
+
+[mandriva:2006.0:reportlab]
+packages=python-reportlab
+
+[mandriva:2006.0:sane]
+packages=sane
+
+[mandriva:2006.0:sane-devel]
+packages=libsane1-devel
+
+[mandriva:2006.0:scanimage]
+packages=sane-utils
+
+[mandriva:2006.0:xsane]
+packages=xsane
+
+[mandriva:2006.0:cups-ddk]
+packages=cupsddk,cupsddk-drivers
+
+[mandriva:2006.0:python-dbus]
+# packages=dbus-python,libdbus-1_0-devel,python-gobject
+
+[mandriva:2006.0:python-ctypes]
+# packages=python-ctypes
+
+[mandriva:2006.0:cups-image]
+packages=cups-devel
+
+# ********************
+[mandriva:2007.0]
+code_name=2k7
+supported=0
+scan_supported=1
+fax_supported=0
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=2.7.7
+release_date=2006-10-3
+notes=Before proceeding, please add the "contrib", "main", and "updates" installation sources to your URPMI configuration./n Open your browser and go to http://easyurpmi.zarb.org/ and follow the instructions provided and then proceed with the HPLIP install. Also you may wish to turn off the cdrom1-12 media sources to speed up the process.
+ppd_install=drv
+udev_mode_fix=1
+ppd_dir=/usr/share/ppd/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt4
+
+[mandriva:2007.0:cups]
+packages=cups
+
+[mandriva:2007.0:cups-devel]
+packages=libcups2-devel
+
+[mandriva:2007.0:gcc]
+packages=gcc-c++
+
+[mandriva:2007.0:gs]
+packages=ghostscript
+
+[mandriva:2007.0:libcrypto]
+packages=libcryptopp5,libcryptopp5-devel
+
+[mandriva:2007.0:libjpeg]
+packages=libjpeg62-dev
+
+[mandriva:2007.0:libnetsnmp-devel]
+packages=libsnmp0-devel
+
+[mandriva:2007.0:libpthread]
+packages=glibc
+
+[mandriva:2007.0:libtool]
+packages=libtool
+
+[mandriva:2007.0:libusb]
+packages=libusb0.1_4-devel
+
+[mandriva:2007.0:make]
+packages=make
+
+[mandriva:2007.0:pil]
+packages=python-imaging
+
+[mandriva:2007.0:ppdev]
+packages=
+commands=su -c "modprobe ppdev"
+
+[mandriva:2007.0:pyqt]
+packages=PyQt
+
+[mandriva:2007.0:python-devel]
+packages=libpython2.4-devel
+
+[mandriva:2007.0:pyqt4]
+packages=python-qt4
+
+[mandriva:2007.0:pyqt4-dbus]
+packages=dbus-python
+
+[mandriva:2007.0:python23]
+packages=python
+
+[mandriva:2007.0:python2x]
+packages=python
+
+[mandriva:2007.0:reportlab]
+packages=python-reportlab
+
+[mandriva:2007.0:sane]
+packages=sane
+
+[mandriva:2007.0:sane-devel]
+packages=libsane1-devel
+
+[mandriva:2007.0:scanimage]
+packages=sane-utils
+
+[mandriva:2007.0:xsane]
+packages=xsane
+
+[mandriva:2007.0:cups-ddk]
+packages=cupsddk,cupsddk-drivers
+
+[mandriva:2007.0:python-dbus]
+# packages=dbus-python,libdbus-1_3-devel,python-gobject
+
+[mandriva:2007.0:python-ctypes]
+# packages=python-ctypes
+
+[mandriva:2007.0:cups-image]
+packages=cups-devel
+
+# ********************
+[mandriva:2007.1]
+code_name=2k7
+supported=0
+scan_supported=1
+fax_supported=1
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=2.7.7
+release_date=2007-4-17
+notes=Before proceeding, please add the "contrib", "main", and "updates" installation sources to your URPMI configuration./n Open your browser and go to http://easyurpmi.zarb.org/ and follow the instructions provided and then proceed with the HPLIP install. Also you may wish to turn off the cdrom1-12 media sources to speed up the process.
+ppd_install=drv
+udev_mode_fix=1
+ppd_dir=/usr/share/ppd/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt4
+
+[mandriva:2007.1:cups]
+packages=cups
+
+[mandriva:2007.1:cups-devel]
+packages=cups-devel
+
+[mandriva:2007.1:gcc]
+packages=gcc-c++
+
+[mandriva:2007.1:gs]
+packages=ghostscript
+
+[mandriva:2007.1:libcrypto]
+packages=libcryptopp5,libcryptopp5-devel
+
+[mandriva:2007.1:libjpeg]
+packages=libjpeg62-dev
+
+[mandriva:2007.1:libnetsnmp-devel]
+packages=libsnmp0-devel
+
+[mandriva:2007.1:libpthread]
+packages=glibc-i18ndata-2.4-4mdk,glibc_lsb-2.3.6-1mdk
+
+[mandriva:2007.1:libtool]
+packages=libtool
+
+[mandriva:2007.1:libusb]
+packages=libusb0.1_4-devel
+
+[mandriva:2007.1:make]
+packages=make
+
+[mandriva:2007.1:pil]
+packages=python-imaging
+
+[mandriva:2007.1:ppdev]
+packages=
+commands=su -c "modprobe ppdev"
+
+[mandriva:2007.1:pyqt]
+packages=PyQt
+
+[mandriva:2007.1:python-devel]
+packages=python-devel
+
+[mandriva:2007.1:pyqt4]
+packages=python-qt4
+
+[mandriva:2007.1:pyqt4-dbus]
+packages=dbus-python
+
+[mandriva:2007.1:python23]
+packages=python
+
+[mandriva:2007.1:python2x]
+packages=python
+
+[mandriva:2007.1:reportlab]
+packages=python-reportlab
+
+[mandriva:2007.1:sane]
+packages=sane
+
+[mandriva:2007.1:sane-devel]
+packages=libsane1-devel
+
+[mandriva:2007.1:scanimage]
+packages=sane-utils
+
+[mandriva:2007.1:xsane]
+packages=xsane
+
+[mandriva:2007.1:cups-ddk]
+packages=cupsddk,cupsddk-drivers
+
+[mandriva:2007.1:python-dbus]
+packages=dbus-python,python-gobject
+
+[mandriva:2007.1:dbus]
+packages=libdbus-1_3-devel
+
+[mandriva:2007.1:python-ctypes]
+packages=python-ctypes
+
+[mandriva:2007.1:cups-image]
+packages=cups-devel
+
+# ********************
+[mandriva:2008.0]
+code_name=2k7
+supported=0
+scan_supported=1
+fax_supported=1
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=2.7.12
+release_date=2007-4-17
+notes=Before proceeding, please add the "contrib", "main", and "updates" installation sources to your URPMI configuration./n Open your browser and go to http://easyurpmi.zarb.org/ and follow the instructions provided and then proceed with the HPLIP install. Also you may wish to turn off the cdrom1-12 media sources to speed up the process.
+ppd_install=ppd
+udev_mode_fix=1
+ppd_dir=/usr/share/ppd/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt4
+foomatic_rip_hplip=1
+
+[mandriva:2008.0:cups]
+packages=cups
+
+[mandriva:2008.0:cups-devel]
+packages=cups-devel
+
+[mandriva:2008.0:gcc]
+packages=gcc-c++
+
+[mandriva:2008.0:gs]
+packages=ghostscript
+
+[mandriva:2008.0:libcrypto]
+packages=libcryptopp5,libcryptopp5-devel
+
+[mandriva:2008.0:libjpeg]
+packages=libjpeg62-dev
+
+[mandriva:2008.0:libnetsnmp-devel]
+packages=libsnmp0-devel
+
+[mandriva:2008.0:libpthread]
+packages=glibc-i18ndata,glibc_lsb
+
+[mandriva:2008.0:libtool]
+packages=libtool
+
+[mandriva:2008.0:libusb]
+packages=libusb0.1_4-devel
+
+[mandriva:2008.0:make]
+packages=make
+
+[mandriva:2008.0:pil]
+packages=python-imaging
+
+[mandriva:2008.0:ppdev]
+packages=
+commands=su -c "modprobe ppdev"
+
+[mandriva:2008.0:pyqt]
+packages=
+
+[mandriva:2008.0:python-devel]
+packages=python-devel
+
+[mandriva:2008.0:pyqt4]
+packages=python-qt4
+
+[mandriva:2008.0:pyqt4-dbus]
+packages=dbus-python
+
+[mandriva:2008.0:python23]
+packages=python
+
+[mandriva:2008.0:python2x]
+packages=python
+
+[mandriva:2008.0:reportlab]
+packages=python-reportlab
+
+[mandriva:2008.0:sane]
+packages=sane
+
+[mandriva:2008.0:sane-devel]
+packages=libsane1-devel
+
+[mandriva:2008.0:scanimage]
+packages=sane-frontends,sane-backends
+
+[mandriva:2008.0:xsane]
+packages=xsane
+
+[mandriva:2008.0:cups-ddk]
+packages=cupsddk,cupsddk-drivers
+
+[mandriva:2008.0:python-dbus]
+packages=python-dbus,python-gobject
+
+[mandriva:2008.0:dbus]
+packages=libdbus-1_3-devel
+
+#[mandriva:2008.0:python-ctypes]
+#packages=python-ctypes
+
+[mandriva:2008.0:cups-image]
+packages=cups-devel
+
+# ********************
+[mandriva:2008.1]
+code_name=
+supported=0
+scan_supported=1
+fax_supported=1
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=2.7.12
+release_date=2007-4-17
+notes=Before proceeding, please add the "contrib", "main", and "updates" installation sources to your URPMI configuration./n Open your browser and go to http://easyurpmi.zarb.org/ and follow the instructions provided and then proceed with the HPLIP install. Also you may wish to turn off the cdrom1-12 media sources to speed up the process.
+ppd_install=drv
+udev_mode_fix=1
+ppd_dir=/usr/share/ppd/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt4
+
+[mandriva:2008.1:cups]
+packages=cups
+
+[mandriva:2008.1:cups-devel]
+packages=cups-devel
+
+[mandriva:2008.1:gcc]
+packages=gcc-c++
+
+[mandriva:2008.1:gs]
+packages=ghostscript
+
+[mandriva:2008.1:libcrypto]
+packages=libcryptopp5,libcryptopp5-devel
+
+[mandriva:2008.1:libjpeg]
+packages=libjpeg62-dev
+
+[mandriva:2008.1:libnetsnmp-devel]
+packages=libsnmp0-devel
+
+[mandriva:2008.1:libpthread]
+packages=glibc-i18ndata,glibc_lsb
+
+[mandriva:2008.1:libtool]
+packages=libtool
+
+[mandriva:2008.1:libusb]
+packages=libusb0.1_4-devel
+
+[mandriva:2008.1:make]
+packages=make
+
+[mandriva:2008.1:pil]
+packages=python-imaging
+
+[mandriva:2008.1:ppdev]
+packages=
+commands=su -c "modprobe ppdev"
+
+#[mandriva:2008.1:pyqt]
+#packages=PyQt
+
+[mandriva:2008.1:python-devel]
+packages=python-devel
+
+[mandriva:2008.1:pyqt4]
+packages=python-qt4
+
+[mandriva:2008.1:pyqt4-dbus]
+packages=dbus-python
+
+[mandriva:2008.1:python23]
+packages=python
+
+[mandriva:2008.1:python2x]
+packages=python
+
+[mandriva:2008.1:reportlab]
+packages=python-reportlab
+
+[mandriva:2008.1:sane]
+packages=sane
+
+[mandriva:2008.1:sane-devel]
+packages=libsane1-devel
+
+[mandriva:2008.1:scanimage]
+packages=sane-frontends,sane-backends
+
+[mandriva:2008.1:xsane]
+packages=xsane
+
+[mandriva:2008.1:cups-ddk]
+packages=cupsddk,cupsddk-drivers
+
+[mandriva:2008.1:python-dbus]
+packages=python-dbus,python-gobject
+
+[mandriva:2008.1:dbus]
+packages=libdbus-1-devel
+
+#[mandriva:2008.1:python-ctypes]
+#packages=python-ctypes
+
+[mandriva:2008.1:cups-image]
+packages=cups-devel
+
+# ********************
+[mandriva:2009]
+code_name=
+supported=0
+scan_supported=1
+fax_supported=1
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=2.8.7
+release_date=2007-4-17
+notes=Before proceeding, please add the "contrib", "main", and "updates" installation sources to your URPMI configuration./n Open your browser and go to http://easyurpmi.zarb.org/ and follow the instructions provided and then proceed with the HPLIP install. Also you may wish to turn off the cdrom1-12 media sources to speed up the process.
+ppd_install=drv
+udev_mode_fix=1
+ppd_dir=/usr/share/ppd/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt4
+policykit=1
+
+[mandriva:2009:cups]
+packages=cups
+
+[mandriva:2009:cups-devel]
+packages=cups-devel
+
+[mandriva:2009:gcc]
+packages=gcc-c++
+
+[mandriva:2009:gs]
+packages=ghostscript
+
+[mandriva:2009:libcrypto]
+packages=libcryptopp5,libcryptopp5-devel
+
+[mandriva:2009:libjpeg]
+packages=libjpeg62-dev
+
+[mandriva:2009:libnetsnmp-devel]
+packages=libsnmp0-devel
+
+[mandriva:2009:libpthread]
+packages=glibc-i18ndata-2.4-4mdk,glibc_lsb-2.3.6-1mdk
+
+[mandriva:2009:libtool]
+packages=libtool
+
+[mandriva:2009:libusb]
+packages=libusb0.1_4-devel
+
+[mandriva:2009:make]
+packages=make
+
+[mandriva:2009:pil]
+packages=python-imaging
+
+[mandriva:2009:ppdev]
+packages=
+commands=su -c "modprobe ppdev"
+
+[mandriva:2009:pyqt]
+packages=PyQt
+
+[mandriva:2009:python-devel]
+packages=python-devel
+
+[mandriva:2009:pyqt4]
+packages=python-qt4
+
+[mandriva:2009:pyqt4-dbus]
+packages=dbus-python
+
+[mandriva:2009:python23]
+packages=python
+
+[mandriva:2009:python2x]
+packages=python
+
+[mandriva:2009:reportlab]
+packages=python-reportlab
+
+[mandriva:2009:sane]
+packages=sane
+
+[mandriva:2009:sane-devel]
+packages=libsane1-devel
+
+[mandriva:2009:scanimage]
+packages=sane-utils
+
+[mandriva:2009:xsane]
+packages=xsane
+
+[mandriva:2009:cups-ddk]
+packages=cupsddk,cupsddk-drivers
+
+[mandriva:2009:python-dbus]
+packages=python-dbus,python-gobject
+
+[mandriva:2009:dbus]
+packages=libdbus-1_3-devel,python-gobject
+
+[mandriva:2009:python-ctypes]
+packages=python-ctypes
+
+[mandriva:2009:cups-image]
+packages=cups-devel
+
+[mandriva:2009:policykit]
+packages=policykit,policykit-gnome
+
+# ********************
+[mandriva:2009.0]
+code_name=
+supported=0
+scan_supported=1
+fax_supported=1
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=2.8.7
+release_date=2007-4-17
+notes=Before proceeding, please add the "contrib", "main", and "updates" installation sources to your URPMI configuration./n Open your browser and go to http://easyurpmi.zarb.org/ and follow the instructions provided and then proceed with the HPLIP install. Also you may wish to turn off the cdrom1-12 media sources to speed up the process.
+ppd_install=drv
+udev_mode_fix=1
+ppd_dir=/usr/share/ppd/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt4
+policykit=1
+
+[mandriva:2009.0:cups]
+packages=cups
+
+[mandriva:2009.0:cups-devel]
+packages=cups-devel
+
+[mandriva:2009.0:gcc]
+packages=gcc-c++
+
+[mandriva:2009.0:gs]
+packages=ghostscript
+
+[mandriva:2009.0:libcrypto]
+packages=libcryptopp5,libcryptopp5-devel
+
+[mandriva:2009.0:libjpeg]
+packages=libjpeg62-dev
+
+[mandriva:2009.0:libnetsnmp-devel]
+packages=libsnmp0-devel
+
+[mandriva:2009.0:libpthread]
+packages=glibc-i18ndata-2.4-4mdk,glibc_lsb-2.3.6-1mdk
+
+[mandriva:2009.0:libtool]
+packages=libtool
+
+[mandriva:2009.0:libusb]
+packages=libusb0.1_4-devel
+
+[mandriva:2009.0:make]
+packages=make
+
+[mandriva:2009.0:pil]
+packages=python-imaging
+
+[mandriva:2009.0:ppdev]
+packages=
+commands=su -c "modprobe ppdev"
+
+[mandriva:2009.0:pyqt]
+packages=PyQt
+
+[mandriva:2009.0:python-devel]
+packages=python-devel
+
+[mandriva:2009.0:pyqt4]
+packages=python-qt4
+
+[mandriva:2009.0:pyqt4-dbus]
+packages=dbus-python
+
+[mandriva:2009.0:python23]
+packages=python
+
+[mandriva:2009.0:python2x]
+packages=python
+
+[mandriva:2009.0:reportlab]
+packages=python-reportlab
+
+[mandriva:2009.0:sane]
+packages=sane
+
+[mandriva:2009.0:sane-devel]
+packages=libsane1-devel
+
+[mandriva:2009.0:scanimage]
+packages=sane-utils
+
+[mandriva:2009.0:xsane]
+packages=xsane
+
+[mandriva:2009.0:cups-ddk]
+packages=cupsddk,cupsddk-drivers
+
+[mandriva:2009.0:python-dbus]
+packages=python-dbus,python-gobject
+
+[mandriva:2009.0:dbus]
+packages=libdbus-1-devel
+
+[mandriva:2009.0:python-ctypes]
+packages=python-ctypes
+
+[mandriva:2009.0:cups-image]
+packages=cups-devel
+
+[mandriva:2009.0:policykit]
+packages=policykit,policykit-gnome
+
+# ********************
+[mandriva:2010.0]
+code_name=
+supported=0
+scan_supported=1
+fax_supported=1
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=3.9.12
+release_date=2009-11-03
+notes=Before proceeding, please add the "contrib", "main", and "updates" installation sources to your URPMI configuration./n Open your browser and go to http://easyurpmi.zarb.org/ and follow the instructions provided and then proceed with the HPLIP install. Also you may wish to turn off the cdrom1-12 media sources to speed up the process.
+ppd_install=drv
+udev_mode_fix=1
+ppd_dir=/usr/share/ppd/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt4
+policykit=1
+
+[mandriva:2010.0:cups]
+packages=cups,cups-common
+
+[mandriva:2010.0:cups-devel]
+packages=libcups2-devel
+
+[mandriva:2010.0:gcc]
+packages=gcc-c++
+
+[mandriva:2010.0:gs]
+packages=ghostscript
+
+[mandriva:2010.0:libcrypto]
+packages=libopenssl0.9.8-devel
+
+[mandriva:2010.0:libjpeg]
+packages=libjpeg-devel
+
+[mandriva:2010.0:libnetsnmp-devel]
+packages=libnet-snmp-devel
+
+[mandriva:2010.0:libpthread]
+packages=glibc-i18ndata,glibc_lsb
+
+[mandriva:2010.0:libtool]
+packages=libtool,libgphoto-devel
+
+[mandriva:2010.0:libusb]
+packages=libusb1.0-devel
+
+[mandriva:2010.0:make]
+packages=make
+
+[mandriva:2010.0:pil]
+packages=python-imaging
+
+[mandriva:2010.0:ppdev]
+packages=
+commands=su -c "modprobe ppdev"
+
+[mandriva:2010.0:pyqt]
+packages=python-qt4
+
+[mandriva:2010.0:python-devel]
+packages=libpython2.6-devel
+
+[mandriva:2010.0:pyqt4]
+packages=python-qt4
+
+[mandriva:2010.0:pyqt4-dbus]
+packages=qt4-qtdbus
+
+[mandriva:2010.0:python23]
+packages=python
+
+[mandriva:2010.0:python2x]
+packages=python
+
+[mandriva:2010.0:reportlab]
+packages=python-reportlab
+
+[mandriva:2010.0:sane]
+packages=saned
+
+[mandriva:2010.0:sane-devel]
+packages=libsane1-devel,sane-backends
+
+[mandriva:2010.0:scanimage]
+packages=libsane1
+
+[mandriva:2010.0:xsane]
+packages=xsane,sane-frontends
+
+[mandriva:2010.0:cups-ddk]
+packages=cups
+
+[mandriva:2010.0:python-dbus]
+packages=python-dbus,python-gobject
+
+[mandriva:2010.0:dbus]
+packages=libdbus-1-devel,python-gobject
+
+[mandriva:2010.0:python-ctypes]
+packages=python
+
+[mandriva:2010.0:cups-image]
+packages=libcups2
+
+[mandriva:2010.0:policykit]
+packages=policykit,policykit-gnome
+
+# ********************
+[mandriva:2011.0]
+code_name=
+supported=0
+scan_supported=1
+fax_supported=1
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=3.9.12
+release_date=2009-11-03
+notes=Before proceeding, please add the "contrib", "main", and "updates" installation sources to your URPMI configuration./n Open your browser and go to http://easyurpmi.zarb.org/ and follow the instructions provided and then proceed with the HPLIP install. Also you may wish to turn off the cdrom1-12 media sources to speed up the process.
+ppd_install=drv
+udev_mode_fix=1
+ppd_dir=/usr/share/ppd/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt4
+policykit=1
+
+[mandriva:2011.0:cups]
+packages=cups,cups-common
+
+[mandriva:2011.0:cups-devel]
+packages=libcups2-devel
+
+[mandriva:2011.0:gcc]
+packages=gcc-c++
+
+[mandriva:2011.0:gs]
+packages=ghostscript
+
+[mandriva:2011.0:libcrypto]
+packages=libopenssl0.9.8-devel
+
+[mandriva:2011.0:libjpeg]
+packages=libjpeg-devel
+
+[mandriva:2011.0:libnetsnmp-devel]
+packages=libnet-snmp-devel
+
+[mandriva:2011.0:libpthread]
+packages=glibc-i18ndata,glibc_lsb
+
+[mandriva:2011.0:libtool]
+packages=libtool,libgphoto-devel
+
+[mandriva:2011.0:libusb]
+packages=libusb1.0-devel
+
+[mandriva:2011.0:make]
+packages=make
+
+[mandriva:2011.0:pil]
+packages=python-imaging
+
+[mandriva:2011.0:ppdev]
+packages=
+commands=su -c "modprobe ppdev"
+
+[mandriva:2011.0:pyqt]
+packages=python-qt4
+
+[mandriva:2011.0:python-devel]
+packages=libpython2.6-devel
+
+[mandriva:2011.0:pyqt4]
+packages=python-qt4
+
+[mandriva:2011.0:pyqt4-dbus]
+packages=qt4-qtdbus
+
+[mandriva:2011.0:python23]
+packages=python
+
+[mandriva:2011.0:python2x]
+packages=python
+
+[mandriva:2011.0:reportlab]
+packages=python-reportlab
+
+[mandriva:2011.0:sane]
+packages=saned
+
+[mandriva:2011.0:sane-devel]
+packages=libsane1-devel,sane-backends
+
+[mandriva:2011.0:scanimage]
+packages=libsane1
+
+[mandriva:2011.0:xsane]
+packages=xsane,sane-frontends
+
+[mandriva:2011.0:cups-ddk]
+packages=cups
+
+[mandriva:2011.0:python-dbus]
+packages=python-dbus,python-gobject
+
+[mandriva:2011.0:dbus]
+packages=libdbus-1-devel,python-gobject
+
+[mandriva:2011.0:python-ctypes]
+packages=python
+
+[mandriva:2011.0:cups-image]
+packages=libcups2
+
+[mandriva:2011.0:policykit]
+packages=policykit,policykit-gnome
+
+# ****************************************
+[linuxmint]
+index=22
+versions=10,11,12
+display_name=Linux Mint
+alt_names=mint, mint linux
+display=1
+notes=
+package_mgrs=dpkg,apt-get,synaptic,update-manager,adept,aptitude,adept-updater
+package_mgr_cmd=sudo aptitude install --assume-yes $packages_to_install
+pre_depend_cmd=sudo dpkg --configure -a,sudo apt-get install --yes --force-yes -f,sudo aptitude update
+post_depend_cmd=
+hplip_remove_cmd=sudo aptitude remove --assume-yes hplip hpijs
+su_sudo=sudo
+ppd_install=ppd
+udev_mode_fix=1
+ppd_dir=
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+
+# ********************
+[linuxmint:5]
+code_name=Elyssa
+supported=0
+scan_supported=1
+fax_supported=1
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=2.8.2
+release_date=2008
+notes=Enable the universe/multiverse repositories. Also be sure you are using the Ubuntu "Main" Repositories. See: https://help.ubuntu.com/community/Repositories/Ubuntu for more information. Disable the CD-ROM/DVD source if you do not have the Ubunbtu installation media inserted in the drive.
+ppd_install=drv
+udev_mode_fix=1
+ppd_dir=/usr/share/ppd/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt4
+
+[linuxmint:5:cups]
+packages=libcupsys2
+
+[linuxmint:5:cups-devel]
+packages=libcupsys2-dev,cupsys-bsd
+
+[linuxmint:5:gcc]
+packages=build-essential
+
+[linuxmint:5:gs]
+packages=gs-esp
+
+[linuxmint:5:libcrypto]
+packages=openssl
+
+[linuxmint:5:libjpeg]
+packages=libjpeg62-dev
+
+[linuxmint:5:libnetsnmp-devel]
+packages=libsnmp-dev
+
+[linuxmint:5:libpthread]
+packages=build-essential
+
+[linuxmint:5:libtool]
+packages=libtool
+
+[linuxmint:5:libusb]
+packages=libusb-dev
+
+[linuxmint:5:make]
+packages=build-essential
+
+[linuxmint:5:pil]
+packages=python-imaging
+
+[linuxmint:5:ppdev]
+packages=
+commands=sudo modprobe ppdev,sudo cp -f /etc/modules /etc/modules.hplip,echo ppdev | sudo tee -a /etc/modules
+
+[linuxmint:5:pyqt]
+packages=python-qt3
+
+[linuxmint:5:python-devel]
+packages=python2.5-dev
+
+[linuxmint:5:pyqt4]
+packages=python-qt4
+
+[linuxmint:5:pyqt4-dbus]
+packages=python-qt4-dbus
+
+[linuxmint:5:python23]
+packages=python
+
+[linuxmint:5:python2x]
+packages=python
+
+[linuxmint:5:reportlab]
+packages=python-reportlab
+
+[linuxmint:5:sane]
+packages=libsane
+
+[linuxmint:5:sane-devel]
+packages=libsane-dev
+
+[linuxmint:5:scanimage]
+packages=sane-utils
+
+[linuxmint:5:xsane]
+packages=xsane
+
+[linuxmint:5:cups-ddk]
+packages=cupsddk,cupsddk-drivers
+
+[linuxmint:5:python-dbus]
+packages=python-dbus,python-gobject
+
+[linuxmint:5:dbus]
+packages=libdbus-1-dev
+
+[linuxmint:5:python-ctypes]
+packages=python-ctypes
+
+[linuxmint:5:cups-image]
+packages=libcupsys2-dev,cupsys-bsd
+
+# ********************
+[linuxmint:6]
+code_name=
+supported=0
+scan_supported=1
+fax_supported=1
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=2.8.7
+release_date=2008
+notes=Enable the universe/multiverse repositories. Also be sure you are using the Ubuntu "Main" Repositories. See: https://help.ubuntu.com/community/Repositories/Ubuntu for more information. Disable the CD-ROM/DVD source if you do not have the Ubunbtu installation media inserted in the drive.
+ppd_install=drv
+udev_mode_fix=1
+ppd_dir=/usr/share/ppd/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt4
+
+[linuxmint:6:cups]
+packages=libcupsys2
+
+[linuxmint:6:cups-devel]
+packages=libcupsys2-dev,cupsys-bsd
+
+[linuxmint:6:gcc]
+packages=build-essential
+
+[linuxmint:6:gs]
+packages=gs-esp
+
+[linuxmint:6:libcrypto]
+packages=openssl
+
+[linuxmint:6:libjpeg]
+packages=libjpeg62-dev
+
+[linuxmint:6:libnetsnmp-devel]
+packages=libsnmp-dev
+
+[linuxmint:6:libpthread]
+packages=build-essential
+
+[linuxmint:6:libtool]
+packages=libtool
+
+[linuxmint:6:libusb]
+packages=libusb-dev
+
+[linuxmint:6:make]
+packages=build-essential
+
+[linuxmint:6:pil]
+packages=python-imaging
+
+[linuxmint:6:ppdev]
+packages=
+commands=sudo modprobe ppdev,sudo cp -f /etc/modules /etc/modules.hplip,echo ppdev | sudo tee -a /etc/modules
+
+[linuxmint:6:pyqt]
+packages=python-qt3
+
+[linuxmint:6:python-devel]
+packages=python2.5-dev
+
+[linuxmint:6:pyqt4]
+packages=python-qt4
+
+[linuxmint:6:pyqt4-dbus]
+packages=python-qt4-dbus
+
+[linuxmint:6:python23]
+packages=python
+
+[linuxmint:6:python2x]
+packages=python
+
+[linuxmint:6:reportlab]
+packages=python-reportlab
+
+[linuxmint:6:sane]
+packages=libsane
+
+[linuxmint:6:sane-devel]
+packages=libsane-dev
+
+[linuxmint:6:scanimage]
+packages=sane-utils
+
+[linuxmint:6:xsane]
+packages=xsane
+
+[linuxmint:6:cups-ddk]
+packages=cupsddk,cupsddk-drivers
+
+[linuxmint:6:python-dbus]
+packages=python-dbus,python-gobject
+
+[linuxmint:6:dbus]
+packages=libdbus-1-dev
+
+[linuxmint:6:python-ctypes]
+packages=python-ctypes
+
+[linuxmint:6:cups-image]
+packages=libcupsys2-dev,cupsys-bsd
+
+# ****************************************
+
+[linuxmint:7]
+code_name=Gloria
+supported=0
+scan_supported=1
+fax_supported=1
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=3.9.2
+release_date=2009
+notes=Enable the universe/multiverse repositories. Also be sure you are using the Ubuntu "Main" Repositories. See: https://help.ubuntu.com/community/Repositories/Ubuntu for more information. Disable the CD-ROM/DVD source if you do not have the Ubuntu installation media inserted in the drive.
+ppd_install=drv
+udev_mode_fix=1
+ppd_dir=/usr/share/ppd/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt4
+policykit=1
+native_cups=1
+
+[linuxmint:7:cups]
+packages=libcups2
+
+[linuxmint:7:cups-devel]
+packages=libcups2-dev,cupsys-bsd
+
+[linuxmint:7:gcc]
+packages=build-essential
+
+[linuxmint:7:gs]
+packages=gs-esp
+
+[linuxmint:7:libcrypto]
+packages=openssl
+
+[linuxmint:7:libjpeg]
+packages=libjpeg62-dev
+
+[linuxmint:7:libnetsnmp-devel]
+packages=libsnmp-dev
+
+[linuxmint:7:libpthread]
+packages=build-essential
+
+[linuxmint:7:libtool]
+packages=libtool
+
+[linuxmint:7:libusb]
+packages=libusb-dev
+
+[linuxmint:7:make]
+packages=build-essential
+
+[linuxmint:7:pil]
+packages=python-imaging
+
+[linuxmint:7:ppdev]
+packages=
+commands=sudo modprobe ppdev,sudo cp -f /etc/modules /etc/modules.hplip,echo ppdev | sudo tee -a /etc/modules
+
+[linuxmint:7:pyqt]
+packages=python
+
+[linuxmint:7:python-devel]
+packages=python-dev
+
+[linuxmint:7:pyqt4]
+packages=python-qt4
+
+[linuxmint:7:pyqt4-dbus]
+packages=python-qt4-dbus
+
+[linuxmint:7:python23]
+packages=python
+
+[linuxmint:7:python2x]
+packages=python
+
+[linuxmint:7:reportlab]
+packages=python-reportlab
+
+[linuxmint:7:sane]
+packages=libsane
+
+[linuxmint:7:sane-devel]
+packages=libsane-dev
+
+[linuxmint:7:scanimage]
+packages=sane-utils
+
+[linuxmint:7:xsane]
+packages=xsane
+
+[linuxmint:7:cups-ddk]
+packages=cupsddk,cupsddk-drivers
+
+[linuxmint:7:python-dbus]
+packages=python-dbus,python-gobject
+
+[linuxmint:7:dbus]
+packages=libdbus-1-dev
+
+[linuxmint:7:python-ctypes]
+packages=python-ctypes
+
+[linuxmint:7:cups-image]
+packages=libcupsimage2-dev
+
+[linuxmint:7:policykit]
+packages=policykit,policykit-gnome
+
+[linuxmint:7:python-notify]
+packages=python-notify
+
+# ********************
+
+[linuxmint:8]
+code_name=Helena
+supported=0
+scan_supported=1
+fax_supported=1
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=3.10.4
+release_date=2010
+notes=Enable the universe/multiverse repositories. Also be sure you are using the Ubuntu "Main" Repositories. See: https://help.ubuntu.com/community/Repositories/Ubuntu for more information. Disable the CD-ROM/DVD source if you do not have the Ubuntu installation media inserted in the drive. During the install process you will be added to the lp group, please quit the installer before the setup stage, log out, log back in, and run hp-setup to complete the install.
+ppd_install=drv
+udev_mode_fix=1
+ppd_dir=/usr/share/ppd/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt4
+native_cups=1
+acl_rules=1
+add_user_to_group=-a -Glp
+
+[linuxmint:8:cups]
+packages=libcups2
+
+[linuxmint:8:cups-devel]
+packages=libcups2-dev,cups-bsd,cups-client
+
+[linuxmint:8:gcc]
+packages=build-essential
+
+[linuxmint:8:gs]
+packages=ghostscript
+
+[linuxmint:8:libcrypto]
+packages=openssl
+
+[linuxmint:8:libjpeg]
+packages=libjpeg62-dev
+
+[linuxmint:8:libnetsnmp-devel]
+packages=libsnmp-dev
+
+[linuxmint:8:libpthread]
+packages=build-essential
+
+[linuxmint:8:libtool]
+packages=libtool
+
+[linuxmint:8:libusb]
+packages=libusb-dev
+
+[linuxmint:8:make]
+packages=build-essential
+
+[linuxmint:8:pil]
+packages=python-imaging
+
+[linuxmint:8:ppdev]
+packages=
+commands=sudo modprobe ppdev,sudo cp -f /etc/modules /etc/modules.hplip,echo ppdev | sudo tee -a /etc/modules
+
+[linuxmint:8:pyqt]
+packages=python-qt4
+
+[linuxmint:8:python-devel]
+packages=python-dev
+
+[linuxmint:8:pyqt4]
+packages=python-qt4
+
+[linuxmint:8:pyqt4-dbus]
+packages=python-qt4-dbus
+
+#[linuxmint:8:python23]
+#packages=python
+
+[linuxmint:8:python2x]
+packages=python
+
+[linuxmint:8:reportlab]
+packages=python-reportlab
+
+[linuxmint:8:sane]
+packages=libsane
+
+[linuxmint:8:sane-devel]
+packages=libsane-dev
+
+[linuxmint:8:scanimage]
+packages=sane-utils
+
+[linuxmint:8:xsane]
+packages=xsane
+
+[linuxmint:8:python-dbus]
+packages=python-dbus,python-gobject
+
+[linuxmint:8:dbus]
+packages=libdbus-1-dev
+
+[linuxmint:8:cups-image]
+packages=libcupsimage2-dev
+
+[linuxmint:8:cups-ddk]
+packages=cups
+
+[linuxmint:8:policykit]
+packages=policykit-1,policykit-1-gnome
+
+[linuxmint:8:python-notify]
+packages=python-notify
+
+# ********************
+
+[linuxmint:9]
+code_name=Isadora
+supported=0
+scan_supported=1
+fax_supported=1
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=3.10.4
+release_date=2010
+notes=Enable the universe/multiverse repositories. Also be sure you are using the Ubuntu "Main" Repositories. See: https://help.ubuntu.com/community/Repositories/Ubuntu for more information. Disable the CD-ROM/DVD source if you do not have the Ubuntu installation media inserted in the drive. During the install process you will be added to the lp group, please quit the installer before the setup stage, log out, log back in, and run hp-setup to complete the install.
+ppd_install=drv
+udev_mode_fix=1
+ppd_dir=/usr/share/ppd/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt4
+native_cups=1
+acl_rules=1
+add_user_to_group=-a -Glp
+same_as_version=8
+
+# ********************
+
+[linuxmint:10]
+code_name=Julia
+supported=1
+scan_supported=1
+fax_supported=1
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=3.10.4
+release_date=2010
+notes=Enable the universe/multiverse repositories. Also be sure you are using the Ubuntu "Main" Repositories. See: https://help.ubuntu.com/community/Repositories/Ubuntu for more information. Disable the CD-ROM/DVD source if you do not have the Ubuntu installation media inserted in the drive. During the install process you will be added to the lp group, please quit the installer before the setup stage, log out, log back in, and run hp-setup to complete the install.
+ppd_install=drv
+udev_mode_fix=1
+ppd_dir=/usr/share/ppd/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt4
+native_cups=1
+acl_rules=1
+add_user_to_group=-a -Glp
+same_as_version=8
+
+# ********************
+
+[linuxmint:11]
+code_name=Katya
+supported=1
+scan_supported=1
+fax_supported=1
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=3.10.4
+release_date=2010
+notes=Enable the universe/multiverse repositories. Also be sure you are using the Ubuntu "Main" Repositories. See: https://help.ubuntu.com/community/Repositories/Ubuntu for more information. Disable the CD-ROM/DVD source if you do not have the Ubuntu installation media inserted in the drive. During the install process you will be added to the lp group, please quit the installer before the setup stage, log out, log back in, and run hp-setup to complete the install.
+ppd_install=drv
+udev_mode_fix=1
+ppd_dir=/usr/share/ppd/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt4
+native_cups=1
+acl_rules=1
+add_user_to_group=-a -Glp
+same_as_version=8
+
+# ********************
+
+[linuxmint:12]
+code_name=Lisa
+supported=1
+scan_supported=1
+fax_supported=1
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=3.10.4
+release_date=2010
+notes=Enable the universe/multiverse repositories. Also be sure you are using the Ubuntu "Main" Repositories. See: https://help.ubuntu.com/community/Repositories/Ubuntu for more information. Disable the CD-ROM/DVD source if you do not have the Ubuntu installation media inserted in the drive. During the install process you will be added to the lp group, please quit the installer before the setup stage, log out, log back in, and run hp-setup to complete the install.
+ppd_install=drv
+udev_mode_fix=1
+ppd_dir=/usr/share/ppd/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt4
+native_cups=1
+acl_rules=1
+add_user_to_group=-a -Glp
+
+[linuxmint:12:cups]
+packages=libcups2
+
+[linuxmint:12:cups-devel]
+packages=libcups2-dev,cups-bsd,cups-client
+
+[linuxmint:12:gcc]
+packages=build-essential
+
+[linuxmint:12:gs]
+packages=ghostscript
+
+[linuxmint:12:libcrypto]
+packages=openssl
+
+[linuxmint:12:libjpeg]
+packages=libjpeg62-dev
+
+[linuxmint:12:libnetsnmp-devel]
+packages=libsnmp-dev
+
+[linuxmint:12:libpthread]
+packages=build-essential
+
+[linuxmint:12:libtool]
+packages=libtool
+
+[linuxmint:12:libusb]
+packages=libusb-dev
+
+[linuxmint:12:make]
+packages=build-essential
+
+[linuxmint:12:pil]
+packages=python-imaging
+
+[linuxmint:12:ppdev]
+packages=
+commands=sudo modprobe ppdev,sudo cp -f /etc/modules /etc/modules.hplip,echo ppdev | sudo tee -a /etc/modules
+
+[linuxmint:12:pyqt]
+packages=python-qt4
+
+[linuxmint:12:python-devel]
+packages=python-dev
+
+[linuxmint:12:pyqt4]
+packages=python-qt4
+
+[linuxmint:12:pyqt4-dbus]
+packages=python-qt4-dbus
+
+#[linuxmint:12:python23]
+#packages=python
+
+[linuxmint:12:python2x]
+packages=python
+
+[linuxmint:12:reportlab]
+packages=python-reportlab
+
+[linuxmint:12:sane]
+packages=libsane
+
+[linuxmint:12:sane-devel]
+packages=libsane-dev
+
+[linuxmint:12:scanimage]
+packages=sane-utils
+
+[linuxmint:12:xsane]
+packages=xsane
+
+[linuxmint:12:python-dbus]
+packages=python-dbus,python-gobject
+
+[linuxmint:12:dbus]
+packages=libdbus-1-dev
+
+[linuxmint:12:cups-image]
+packages=libcupsimage2-dev
+
+[linuxmint:12:cups-ddk]
+packages=cups
+
+[linuxmint:12:policykit]
+packages=policykit-1,policykit-1-gnome
+
+[linuxmint:12:python-notify]
+packages=python-notify
+
+# ****************************************
+
+[linpus]
+index=25
+versions=9.4,9.5
+display_name=Linpus Linux
+alt_names=Linpus, Linpus Lite, Linpus Linux
+display=1
+notes=
+package_mgrs=dpkg,apt-get,synaptic,update-manager,adept,aptitude,adept-updater,rpm
+package_mgr_cmd=sudo apt-get install --assume-yes $packages_to_install
+pre_depend_cmd=sudo apt-get install --yes --force-yes -f,sudo apt-get update
+post_depend_cmd=
+hplip_remove_cmd=sudo apt-get remove --assume-yes hplip hpijs
+su_sudo=sudo
+ppd_install=ppd
+udev_mode_fix=1
+ppd_dir=
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+
+# ********************
+[linpus:9.5]
+code_name=Linpus
+supported=0
+scan_supported=0
+fax_supported=0
+pcard_supported=0
+network_supported=0
+parallel_supported=0
+usb_supported=1
+packaged_version=
+release_date=
+notes=Add to the file /etc/apt/sources.list the following lines (each on a seperate line should start with the "rpm": rpm http://update.linpus.com/LinpusUpdate/ 9.5 main desktop rpm http://update.linpus.com/LinpusUpdate/ 9.5-Critical main desktop rpm http://update.linpus.com/LinpusUpdate/ 9.5-DevDr main desktop rpm http://update.linpus.com/LinpusUpdate/ 9.5-SoftApp main desktop
+ppd_install=drv
+udev_mode_fix=1
+ppd_dir=/usr/share/ppd/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=none
+package_available=0
+package_arch=i386
+
+[linpus:9.5:cups]
+packages=cups
+
+[linpus:9.5:cups-devel]
+packages=
+
+[linpus:9.5:gcc]
+packages=glibc
+
+[linpus:9.5:gs]
+packages=ghostscript
+
+[linpus:9.5:libcrypto]
+packages=openssl
+
+[linpus:9.5:libjpeg]
+packages=libjpeg
+
+[linpus:9.5:libnetsnmp-devel]
+packages=
+
+[linpus:9.5:libpthread]
+packages=glibc
+
+[linpus:9.5:libtool]
+packages=
+
+[linpus:9.5:libusb]
+packages=
+
+[linpus:9.5:make]
+packages=glibc
+
+[linpus:9.5:pil]
+packages=
+
+[linpus:9.5:ppdev]
+packages=
+commands=sudo modprobe ppdev,sudo cp -f /etc/modules /etc/modules.hplip,echo ppdev | sudo tee -a /etc/modules
+
+[linpus:9.5:pyqt]
+packages=
+
+[linpus:9.5:python-devel]
+packages=
+
+[linpus:9.5:pyqt4]
+packages=python-qt4,python-qt4-dbus
+
+[linpus:9.5:pyqt4-dbus]
+packages=python-qt4-dbus
+
+[linpus:9.5:python23]
+packages=python
+
+[linpus:9.5:python2x]
+packages=python
+
+[linpus:9.5:reportlab]
+packages=
+
+[linpus:9.5:sane]
+packages=
+
+[linpus:9.5:sane-devel]
+packages=
+
+[linpus:9.5:scanimage]
+packages=
+
+[linpus:9.5:xsane]
+packages=
+
+[linpus:9.5:cups-ddk]
+packages=
+
+[linpus:9.5:python-dbus]
+packages=dbus-python,python-gobject
+
+[linpus:9.5:dbus]
+packages=dbus
+
+[linpus:9.5:python-ctypes]
+packages=
+
+[linpus:9.5:cups-image]
+packages=
+
+# ********************
+[linpus:9.4]
+code_name=Linpus
+supported=0
+scan_supported=0
+fax_supported=0
+pcard_supported=0
+network_supported=0
+parallel_supported=0
+usb_supported=1
+packaged_version=
+release_date=
+notes=Add to the file /etc/apt/sources.list the following lines (each on a seperate line should start with the "rpm": rpm http://update.linpus.com/LinpusUpdate/ 9.4 main desktop rpm http://update.linpus.com/LinpusUpdate/ 9.4-Critical main desktop rpm http://update.linpus.com/LinpusUpdate/ 9.4-DevDr main desktop rpm http://update.linpus.com/LinpusUpdate/ 9.4-SoftApp main desktop
+ppd_install=drv
+udev_mode_fix=1
+ppd_dir=/usr/share/ppd/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=none
+package_available=0
+package_arch=i386
+
+[linpus:9.4:cups]
+packages=cups
+
+[linpus:9.4:cups-devel]
+packages=
+
+[linpus:9.4:gcc]
+packages=glibc
+
+[linpus:9.4:gs]
+packages=ghostscript
+
+[linpus:9.4:libcrypto]
+packages=openssl
+
+[linpus:9.4:libjpeg]
+packages=libjpeg
+
+[linpus:9.4:libnetsnmp-devel]
+packages=
+
+[linpus:9.4:libpthread]
+packages=glibc
+
+[linpus:9.4:libtool]
+packages=
+
+[linpus:9.4:libusb]
+packages=
+
+[linpus:9.4:make]
+packages=glibc
+
+[linpus:9.4:pil]
+packages=
+
+[linpus:9.4:ppdev]
+packages=
+commands=sudo modprobe ppdev,sudo cp -f /etc/modules /etc/modules.hplip,echo ppdev | sudo tee -a /etc/modules
+
+[linpus:9.4:pyqt]
+packages=
+
+[linpus:9.4:python-devel]
+packages=
+
+[linpus:9.4:pyqt4]
+packages=python-qt4
+
+[linpus:9.4:pyqt4-dbus]
+packages=python-qt4-dbus
+
+[linpus:9.4:python23]
+packages=python
+
+[linpus:9.4:python2x]
+packages=python
+
+[linpus:9.4:reportlab]
+packages=
+
+[linpus:9.4:sane]
+packages=
+
+[linpus:9.4:sane-devel]
+packages=
+
+[linpus:9.4:scanimage]
+packages=
+
+[linpus:9.4:xsane]
+packages=
+
+[linpus:9.4:cups-ddk]
+packages=
+
+[linpus:9.4:python-dbus]
+packages=dbus-python,python-gobject
+
+[linpus:9.4:dbus]
+packages=dbus
+
+[linpus:9.4:python-ctypes]
+packages=
+
+[linpus:9.4:cups-image]
+packages=
+
+# ****************************************
+[gos]
+index=24
+versions=8.04.1
+display_name=gOS
+alt_names=gos, gOS
+display=1
+notes=
+package_mgrs=dpkg,apt-get,synaptic,update-manager,adept,aptitude,adept-updater
+package_mgr_cmd=sudo aptitude install --assume-yes $packages_to_install
+pre_depend_cmd=sudo dpkg --configure -a,sudo apt-get install --yes --force-yes -f,sudo aptitude update
+post_depend_cmd=
+hplip_remove_cmd=sudo aptitude remove --assume-yes hplip hpijs
+su_sudo=sudo
+ppd_install=ppd
+udev_mode_fix=1
+ppd_dir=
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+
+# ********************
+[gos:8.04.1]
+code_name=Elyssa
+supported=0
+scan_supported=1
+fax_supported=1
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=2.8.2
+release_date=2008
+notes=Enable the universe/multiverse repositories. Also be sure you are using the Ubuntu "Main" Repositories. See: https://help.ubuntu.com/community/Repositories/Ubuntu for more information. Disable the CD-ROM/DVD source if you do not have the Ubunbtu installation media inserted in the drive.
+ppd_install=drv
+udev_mode_fix=1
+ppd_dir=/usr/share/ppd/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt4
+
+[gos:8.04.1:cups]
+packages=libcupsys2
+
+[gos:8.04.1:cups-devel]
+packages=libcupsys2-dev,cupsys-bsd
+
+[gos:8.04.1:gcc]
+packages=build-essential
+
+[gos:8.04.1:gs]
+packages=gs-esp
+
+[gos:8.04.1:libcrypto]
+packages=openssl
+
+[gos:8.04.1:libjpeg]
+packages=libjpeg62-dev
+
+[gos:8.04.1:libnetsnmp-devel]
+packages=libsnmp-dev
+
+[gos:8.04.1:libpthread]
+packages=build-essential
+
+[gos:8.04.1:libtool]
+packages=libtool
+
+[gos:8.04.1:libusb]
+packages=libusb-dev
+
+[gos:8.04.1:make]
+packages=build-essential
+
+[gos:8.04.1:pil]
+packages=python-imaging
+
+[gos:8.04.1:ppdev]
+packages=
+commands=sudo modprobe ppdev,sudo cp -f /etc/modules /etc/modules.hplip,echo ppdev | sudo tee -a /etc/modules
+
+[gos:8.04.1:pyqt]
+packages=python-qt3
+
+[gos:8.04.1:python-devel]
+packages=python2.5-dev
+
+[gos:8.04.1:pyqt4]
+packages=python-qt4
+
+[gos:8.04.1:pyqt4-dbus]
+packages=python-qt4-dbus
+
+[gos:8.04.1:python23]
+packages=python
+
+[gos:8.04.1:python2x]
+packages=python
+
+[gos:8.04.1:reportlab]
+packages=python-reportlab
+
+[gos:8.04.1:sane]
+packages=libsane
+
+[gos:8.04.1:sane-devel]
+packages=libsane-dev
+
+[gos:8.04.1:scanimage]
+packages=sane-utils
+
+[gos:8.04.1:xsane]
+packages=xsane
+
+[gos:8.04.1:cups-ddk]
+packages=cupsddk,cupsddk-drivers
+
+[gos:8.04.1:python-dbus]
+packages=python-dbus,python-gobject
+
+[gos:8.04.1:dbus]
+packages=libdbus-1-dev
+
+[gos:8.04.1:python-ctypes]
+packages=python-ctypes
+
+[gos:8.04.1:cups-image]
+packages=libcupsys2-dev,cupsys-bsd
+
+# ****************************************
+[boss]
+index=34
+versions=3.0
+display_name=Boss
+alt_names=
+display=1
+notes=
+package_mgrs=dpkg,apt-get,synaptic,update-manager,adept,aptitude
+package_mgr_cmd=su -c "apt-get install --force-yes -y $packages_to_install"
+pre_depend_cmd=su -c "dpkg --configure -a",su -c "apt-get install -f",su -c "apt-get update",gnome-terminal -x su -c "apt-get install --yes cupsys-bsd"
+post_depend_cmd=
+hplip_remove_cmd=su -c "apt-get remove --yes hplip hpijs"
+su_sudo=su
+ppd_install=ppd
+udev_mode_fix=1
+ppd_dir=/usr/share/ppd/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+
+[boss:3.0]
+code_name=tejas
+supported=0
+scan_supported=1
+fax_supported=0
+pcard_supported=1
+network_supported=1
+parallel_supported=1
+usb_supported=1
+packaged_version=3.9.2
+release_date=2008-09-04
+notes=Be sure to disable the CD-ROM repositories and also ensure that the main/security repositories are enabled.
+ppd_install=ppd
+udev_mode_fix=1
+ppd_dir=/usr/share/ppd/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt4
+foomatic_rip_hplip=1
+
+[boss:3.0:cups]
+packages=cupsys,cupsys-client
+
+[boss:3.0:cups-devel]
+packages=libcupsys2-dev,cupsys-bsd
+
+[boss:3.0:gcc]
+packages=gcc,g++
+
+[boss:3.0:gs]
+packages=gs-esp
+
+[boss:3.0:libcrypto]
+packages=libssl-dev
+
+[boss:3.0:libjpeg]
+packages=libjpeg-dev
+
+[boss:3.0:libnetsnmp-devel]
+packages=libsnmp9-dev
+
+[boss:3.0:libpthread]
+packages=libc6
+
+[boss:3.0:libtool]
+packages=libtool
+
+[boss:3.0:libusb]
+packages=libusb-dev
+
+[boss:3.0:make]
+packages=make
+
+[boss:3.0:pil]
+packages=python-imaging
+
+[boss:3.0:ppdev]
+packages=
+commands=su -c "modprobe ppdev",su -c cp -f /etc/modules /etc/modules.hplip,echo ppdev | su -c tee -a /etc/modules
+
+[boss:3.0:pyqt]
+packages=python-qt3
+
+[boss:3.0:python-devel]
+packages=python-dev
+
+[boss:3.0:pyqt4]
+packages=python-qt4
+
+[boss:3.0:pyqt4-dbus]
+packages=python-qt4-dbus
+
+[boss:3.0:python23]
+packages=python
+
+[boss:3.0:python2x]
+packages=python
+
+[boss:3.0:reportlab]
+packages=python-reportlab
+
+[boss:3.0:sane]
+packages=sane
+
+[boss:3.0:sane-devel]
+packages=libsane-dev
+
+[boss:3.0:scanimage]
+packages=sane-utils
+
+[boss:3.0:xsane]
+packages=xsane
+
+[boss:3.0:cups-ddk]
+packages=
+
+[boss:3.0:python-dbus]
+packages=python-dbus,libdbus-1-dev,python-gobject
+
+[boss:3.0:dbus]
+packages=libdbus-1-dev
+
+[boss:3.0:python-ctypes]
+packages=python-ctypes
+
+[boss:3.0:cups-image]
+packages=libcupsimage2-dev
+
+# ****************************************
+[lfs]
+index=50
+versions=6
+display_name=Linux From Scratch
+alt_names=
+display=1
+notes=
+package_mgrs=
+package_mgr_cmd=$packages_to_install
+pre_depend_cmd=
+post_depend_cmd=
+hplip_remove_cmd=
+su_sudo=su
+ppd_install=ppd
+udev_mode_fix=1
+ppd_dir=/usr/share/ppd/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+
+[lfs:6]
+code_name=LFS
+supported=0
+scan_supported=1
+fax_supported=1
+pcard_supported=1
+network_supported=1
+parallel_supported=0
+usb_supported=1
+packaged_version=
+release_date=
+notes=
+ppd_install=ppd
+udev_mode_fix=1
+ppd_dir=/usr/share/ppd/HP
+fix_ppd_symlink=0
+drv_dir=/usr/share/cups/drv/HP
+ui_toolkit=qt4
+foomatic_rip_hplip=1
+
+[lfs:6:cups]
+packages=cupsys,cupsys-client
+
+[lfs:6:cups-devel]
+packages=libcupsys2-dev,cupsys-bsd
+
+[lfs:6:gcc]
+packages=gcc,g++
+
+[lfs:6:gs]
+packages=gs-esp
+
+[lfs:6:libcrypto]
+packages=libssl-dev
+
+[lfs:6:libjpeg]
+packages=libjpeg-dev
+
+[lfs:6:libnetsnmp-devel]
+packages=libsnmp9-dev
+
+[lfs:6:libpthread]
+packages=libc6
+
+[lfs:6:libtool]
+packages=libtool
+
+[lfs:6:libusb]
+packages=libusb-dev
+
+[lfs:6:make]
+packages=make
+
+[lfs:6:pil]
+packages=python-imaging
+
+[lfs:6:ppdev]
+packages=
+commands=su -c "modprobe ppdev",su -c cp -f /etc/modules /etc/modules.hplip,echo ppdev | su -c tee -a /etc/modules
+
+[lfs:6:pyqt]
+packages=python-qt3
+
+[lfs:6:python-devel]
+packages=python-dev
+
+[lfs:6:pyqt4]
+packages=python-qt4
+
+[lfs:6:pyqt4-dbus]
+packages=python-qt4-dbus
+
+[lfs:6:python23]
+packages=python
+
+[lfs:6:python2x]
+packages=python
+
+[lfs:6:reportlab]
+packages=python-reportlab
+
+[lfs:6:sane]
+packages=sane
+
+[lfs:6:sane-devel]
+packages=libsane-dev
+
+[lfs:6:scanimage]
+packages=sane-utils
+
+[lfs:6:xsane]
+packages=xsane
+
+[lfs:6:cups-ddk]
+packages=cupsddk,cupsddk-drivers
+
+[lfs:6:python-dbus]
+packages=python-dbus,libdbus-1-dev,python-gobject
+
+[lfs:6:dbus]
+packages=libdbus-1-dev
+
+[lfs:6:python-ctypes]
+packages=python-ctypes
+
+[lfs:6:cups-image]
+packages=libcupsimage2-dev
+
+[lfs:6:policykit]
+packages=policykit
+
+[lfs:6:python-notify]
+packages=python-notify
diff --git a/installer/text_install.py b/installer/text_install.py
new file mode 100755
index 0000000..67d7ae8
--- /dev/null
+++ b/installer/text_install.py
@@ -0,0 +1,857 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2014 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch, Amarnath Chitumalla
+#
+
+# Std Lib
+import os
+import sys
+import getpass
+import signal
+
+# Local
+from base.g import *
+from base import utils, tui
+from core_install import *
+
+def start_systray():
+ tui.title("RE-STARTING HP_SYSTRAY")
+ path = utils.which('hp-systray')
+ if path:
+ path = os.path.join(path, 'hp-systray')
+ else:
+ path = os.path.join(prop.home_dir, 'systray.py')
+ if not os.path.exists(path):
+ log.warn("Unable to start hp-systray")
+
+ log.debug("Running hp-systray: %s --force-startup" % path)
+ os.spawnlp(os.P_NOWAIT, path, 'hp-systray', '--force-startup')
+ log.debug("Waiting for hp-systray to start...")
+ time.sleep(1)
+
+
+def progress_callback(cmd="", desc="Working..."):
+ if cmd:
+ log.info("%s (%s)" % (cmd, desc))
+ else:
+ log.info(desc)
+
+
+def password_entry():
+ return getpass.getpass(log.bold("Please enter the root/superuser password: "))
+
+def password_user_entry():
+ return getpass.getpass(log.bold("Please enter the user (%s)'s password: " % os.getenv('USER')))
+
+
+def option_question_callback(opt, desc, default='y'):
+ ok, ans = tui.enter_yes_no("Do you wish to enable '%s'" % desc, default)
+ if not ok: sys.exit(0)
+ return ans
+
+
+
+def start(language, auto=True, test_depends=False,
+ test_unknown=False, assume_network=False,
+ max_retries=3, enable=None, disable=None):
+ try:
+ core = CoreInstall(MODE_INSTALLER, INTERACTIVE_MODE)
+ current_version = prop.installed_version_int
+ log.debug("Currently installed version: 0x%06x" % current_version)
+ core.enable = enable
+ core.disable = disable
+
+ if core.running_as_root():
+ log.error("You are running the installer as root. It is highly recommended that you run the installer as")
+ log.error("a regular (non-root) user. Do you still wish to continue?")
+
+ ok, ans = tui.enter_yes_no(log.bold("Continue with installation"), 'n')
+ if not ans or not ok:
+ sys.exit(1)
+
+ if auto:
+ log.note("Running in automatic mode. The most common options will be selected.")
+
+ log.info("")
+ log.note("Defaults for each question are maked with a '*'. Press <enter> to accept the default.")
+ core.init()
+ if not core.distro_name in ("ubuntu","debian","suse","fedora"):
+ log.error("Auto installation is not supported for '%s' distro so all dependencies may not be installed. \nPlease install manually as mentioned in 'http://hplipopensource.com/hplip-web/install/manual/index.html' web-site"% core.distro_name)
+ ok, choice = tui.enter_choice("\nPress 'y' If you still want to continue auto installation. Press 'n' to quit auto instalation(y=yes, n=no*): ",['y','n'],'n')
+ if not ok or choice =='n':
+ log.info("Installation exit")
+ sys.exit()
+
+ if not auto:
+ tui.title("INSTALLATION MODE")
+ log.info("Automatic mode will install the full HPLIP solution with the most common options.")
+ log.info("Custom mode allows you to choose installation options to fit specific requirements.")
+
+ #if os.getenv('DISPLAY') and utils.find_browser() is not None:
+ if 0:
+ ok, choice = tui.enter_choice("\nPlease choose the installation mode (a=automatic*, c=custom, w=web installer, q=quit) : ",
+ ['a', 'c', 'w'], 'a')
+ else:
+ ok, choice = tui.enter_choice("\nPlease choose the installation mode (a=automatic*, c=custom, q=quit) : ",
+ ['a', 'c'], 'a')
+
+ if not ok: sys.exit(0)
+
+ if choice == 'a':
+ auto = True
+
+ elif choice == 'w':
+ import web_install
+ log.debug("Starting web browser installer...")
+ web_install.start(language)
+ return
+
+ log.info("\nInitializing. Please wait...")
+ prev_hplip_version= sys_conf.get("hplip","version","0.0.0")
+
+
+ if test_unknown:
+ core.distro_name = 'unknown'
+ core.distro = 0
+ core.distro_version = 0
+
+
+ #
+ # HPLIP INSTALLATION
+ #
+ core.selected_component = 'hplip'
+
+ #
+ # INTRODUCTION
+ #
+
+ tui.title("INTRODUCTION")
+
+ if core.selected_component == 'hplip':
+ log.info("This installer will install HPLIP version %s on your computer." % core.version_public)
+
+ log.info("Please close any running package management systems now (YaST, Adept, Synaptic, Up2date, etc).")
+
+
+ # For testing, mark all dependencies missing
+ if test_depends:
+ for d in core.have_dependencies:
+ core.have_dependencies[d] = False
+
+ num_req_missing = core.count_num_required_missing_dependencies()
+ num_opt_missing = core.count_num_optional_missing_dependencies()
+
+
+ #
+ # CONFIRM AND SELECT DISTRO NAME AND VERSION
+ #
+
+ tui.title("DISTRO/OS CONFIRMATION")
+
+
+ if core.distro_known():
+ log.info("Distro appears to be %s %s.\n" % (core.get_distro_data('display_name', '(unknown)'), core.distro_version))
+
+ log.debug("Distro = %s Distro Name = %s Display Name= %s Version = %s Supported = %s" % \
+ (core.distro, core.distro_name, core.distros[core.distro_name]['display_name'], \
+ core.distro_version, core.distro_version_supported))
+
+ distro_ok, ok = False, True
+ if core.distro_known():
+ ok, distro_ok = tui.enter_yes_no('Is "%s %s" your correct distro/OS and version'
+ % (core.get_distro_data('display_name', '(unknown)'), core.distro_version))
+
+ if not ok:
+ sys.exit(0)
+
+ core.distro_changed()
+
+ if not distro_ok:
+ tui.title("DISTRO/OS SELECTION")
+ core.distro, core.distro_version = DISTRO_UNKNOWN, DISTRO_VER_UNKNOWN
+
+ log.info(log.bold("\nChoose the name of the distro/OS that most closely matches your system:\n"))
+
+ max_name = 0
+ for d in core.distros_index:
+ dd = core.distros[core.distros_index[d]]
+ if dd['display']:
+ max_name = max(max_name, len(dd['display_name']))
+
+ formatter = utils.TextFormatter(
+ (
+ {'width': 4},
+ {'width': max_name, 'margin': 2},
+ )
+ )
+
+ log.info(formatter.compose(("Num.", "Distro/OS Name")))
+ log.info(formatter.compose(('-'*4, '-'*(max_name))))
+
+ d_temp = {}
+ x = 0
+ for d in core.distros_index:
+ dd = core.distros[core.distros_index[d]]
+
+ if dd['display']:
+ d_temp[x] = d
+ log.info(formatter.compose((str(x), dd['display_name'])))
+ x += 1
+
+ ok, y = tui.enter_range("\nEnter number 0...%d (q=quit) ?" % (x-1), 0, x-1)
+ if not ok: sys.exit(0)
+
+ core.distro = d_temp[y]
+ core.distro_name = core.distros_index[core.distro]
+ distro_display_name = core.distros[core.distro_name]['display_name']
+ log.debug("Distro = %s Distro Name = %s Display Name= %s" %
+ (core.distro, core.distro_name, distro_display_name))
+
+ if core.distro != DISTRO_UNKNOWN:
+ versions = core.distros[core.distro_name]['versions'].keys()
+ versions.sort(lambda x, y: core.sort_vers(x, y))
+
+ log.info(log.bold('\nChoose the version of "%s" that most closely matches your system:\n' % distro_display_name))
+
+ formatter = utils.TextFormatter(
+ (
+ {'width': 4},
+ {'width': 40, 'margin': 2},
+ )
+ )
+
+ log.info(formatter.compose(("Num.", "Distro/OS Version")))
+ log.info(formatter.compose(('-'*4, '-'*40)))
+
+ log.info(formatter.compose(("0", "Unknown or not listed")))
+
+ x = 1
+ for ver in versions:
+ ver_info = core.distros[core.distro_name]['versions'][ver]
+
+ if ver_info['code_name'] and ver_info['release_date']:
+ text = ver + ' ("' + ver_info['code_name'] + '", Released ' + ver_info['release_date'] + ')'
+
+ elif ver_info['code_name']:
+ text = ver + ' ("' + ver_info['code_name'] + '")'
+
+ elif ver_info['release_date']:
+ text = ver + ' (Released ' + ver_info['release_date'] + ')'
+
+ else:
+ text = ver
+
+ if not ver_info['supported']:
+ text += " [Unsupported]"
+
+ log.info(formatter.compose((str(x), text)))
+ x += 1
+
+ ok, core.distro_version_int = tui.enter_range("\nEnter number 0...%d (q=quit) ?" %
+ (x-1), 0, x-1)
+ if not ok: sys.exit(0)
+
+ if core.distro_version_int == 0:
+ core.distro_version = DISTRO_VER_UNKNOWN
+ core.distro_version_supported = False
+ else:
+ core.distro_version = versions[core.distro_version_int - 1]
+ core.distro_version_supported = core.get_ver_data('supported', False)
+
+ log.debug("Distro = %s Distro Name = %s Display Name= %s Version = %s Supported = %s" % \
+ (core.distro, core.distro_name, core.distros[core.distro_name]['display_name'], \
+ core.distro_version, core.distro_version_supported))
+
+ core.distro_changed()
+
+ log.info("\nDistro set to: %s %s" %
+ (core.get_distro_data('display_name', '(unknown)'), core.distro_version))
+
+
+ if core.distro == DISTRO_UNKNOWN or not core.distro_version_supported:
+ log.error("The distribution/OS that you are running is not supported. This installer\ncannot install an unsupported distribution. Please check your distribution/OS\nand re-run this installer or perform a manual installation.")
+ if num_req_missing:
+ log.error("The following REQUIRED dependencies are missing and need to be installed:")
+
+ for d, desc, opt in core.missing_required_dependencies():
+ log.error("Missing REQUIRED dependency: %s (%s)" % (d, desc))
+
+ for d, desc, req, opt in core.missing_optional_dependencies():
+ if req:
+ log.warning("Missing OPTIONAL dependency: %s (%s) [Required for option '%s']" % (d, desc, opt))
+ else:
+ log.warning("Missing OPTIONAL dependency: %s (%s) [Optional for option '%s']" % (d, desc, opt))
+
+ sys.exit(1)
+
+
+ #
+ # SELECT OPTIONS TO INSTALL
+ #
+
+ if not auto:
+ tui.title("SELECT HPLIP OPTIONS")
+ log.info("You can select which HPLIP options to enable. Some options require extra dependencies.")
+ log.info("")
+ num_opt_missing = core.select_options(option_question_callback)
+
+ else:
+ enable_par = False
+ core.selected_options['parallel'] = False
+
+ log.debug("Req missing=%d Opt missing=%d HPLIP=%s Component=%s" % \
+ (num_req_missing, num_opt_missing, core.hplip_present, core.selected_component))
+
+
+ #
+ # COLLECT SUPERUSER PASSWORD
+ #
+ if not core.running_as_root():
+ su_sudo = core.get_distro_data('su_sudo')
+ if su_sudo == "sudo":
+ tui.title("ENTER USER PASSWORD")
+ ok = core.check_password(password_user_entry, progress_callback)
+ else:
+ tui.title("ENTER ROOT/SUPERUSER PASSWORD")
+ ok = core.check_password(password_entry, progress_callback)
+
+ if not ok:
+ log.error("3 incorrect attempts. (or) Insufficient permissions(i.e. try with sudo user).\nExiting.")
+ sys.exit(1)
+
+
+ # INSTALLATION NOTES
+ #
+
+ if core.distro_supported():
+ distro_notes = core.get_distro_data('notes', '').strip()
+ ver_notes = core.get_ver_data('notes', '').strip()
+
+ if distro_notes or ver_notes:
+ tui.title("INSTALLATION NOTES")
+
+ if distro_notes:
+ log.info(distro_notes)
+
+ if ver_notes:
+ log.info(ver_notes)
+
+ log.info("")
+
+ if not tui.continue_prompt("Please read the installation notes."):
+ sys.exit(0)
+
+ #
+ # PRE-INSTALL COMMANDS
+ #
+ tui.title("RUNNING PRE-INSTALL COMMANDS")
+ if core.run_pre_install(progress_callback): # some cmds were run...
+ num_req_missing = core.count_num_required_missing_dependencies()
+ num_opt_missing = core.count_num_optional_missing_dependencies()
+ log.info("OK")
+
+ #
+ # REQUIRED DEPENDENCIES INSTALL
+ #
+
+ depends_to_install = []
+ if num_req_missing:
+ tui.title("INSTALL MISSING REQUIRED DEPENDENCIES")
+
+ log.warn("There are %d missing REQUIRED dependencies." % num_req_missing)
+ log.notice("Installation of dependencies requires an active internet connection.")
+
+ for depend, desc, option in core.missing_required_dependencies():
+ log.warning("Missing REQUIRED dependency: %s (%s)" % (depend, desc))
+
+ ok = False
+ packages, commands = core.get_dependency_data(depend)
+ log.debug("Packages: %s" % ','.join(packages))
+ log.debug("Commands: %s" % ','.join(commands))
+
+ if core.distro_version_supported and (packages or commands):
+ if auto:
+ answer = True
+ else:
+ ok, answer = tui.enter_yes_no("\nWould you like to have this installer install the missing dependency")
+ if not ok: sys.exit(0)
+
+ if answer:
+ ok = True
+ log.debug("Adding '%s' to list of dependencies to install." % depend)
+ depends_to_install.append(depend)
+
+ else:
+ log.warn("This installer cannot install '%s' for your distro/OS and/or version." % depend)
+
+ if not ok:
+ log.error("Installation cannot continue without this dependency. Please manually install this dependency and re-run this installer.")
+ sys.exit(0)
+
+ #
+ # OPTIONAL dependencies
+ #
+
+ if num_opt_missing:
+ tui.title("INSTALL MISSING OPTIONAL DEPENDENCIES")
+ log.warn("There are %d missing OPTIONAL dependencies." % num_opt_missing)
+
+ log.notice("Installation of dependencies requires an active internet connection.")
+
+ for depend, desc, required_for_opt, opt in core.missing_optional_dependencies():
+
+ if required_for_opt:
+ log.warning("Missing REQUIRED dependency for option '%s': %s (%s)" % (opt, depend, desc))
+
+ else:
+ log.warning("Missing OPTIONAL dependency for option '%s': %s (%s)" % (opt, depend, desc))
+
+ installed = False
+ packages, commands = core.get_dependency_data(depend)
+ log.debug("Packages: %s" % ','.join(packages))
+ log.debug("Commands: %s" % ','.join(commands))
+
+
+ if core.distro_version_supported and (packages or commands):
+ if auto:
+ answer = True
+ else:
+ ok, answer = tui.enter_yes_no("\nWould you like to have this installer install the missing dependency")
+ if not ok: sys.exit(0)
+
+ if answer:
+ log.debug("Adding '%s' to list of dependencies to install." % depend)
+ depends_to_install.append(depend)
+
+ else:
+ log.warning("Missing dependencies may effect the proper functioning of HPLIP. Please manually install this dependency after you exit this installer.")
+ log.warning("Note: Options that have REQUIRED dependencies that are missing will be turned off.")
+
+ if required_for_opt:
+ log.warn("Option '%s' has been turned off." % opt)
+ core.selected_options[opt] = False
+ else:
+ log.warn("This installer cannot install '%s' for your distro/OS and/or version." % depend)
+
+ if required_for_opt:
+ log.warn("Option '%s' has been turned off." % opt)
+ core.selected_options[opt] = False
+
+
+
+ log.debug("Dependencies to install: %s hplip_present:%s" % (depends_to_install, core.hplip_present))
+
+ if core.distro_version_supported and \
+ (depends_to_install or core.hplip_present) and \
+ core.selected_component == 'hplip':
+
+ #
+ # CHECK FOR RUNNING PACKAGE MANAGER
+ #
+
+ pid, cmdline = core.check_pkg_mgr()
+ while pid:
+ ok, user_input = tui.enter_choice("A package manager '%s' appears to be running. Please quit the package manager and press enter to continue (i=ignore, r=retry*, f=force, q=quit) :"
+ % cmdline, ['i', 'r', 'q', 'f'], 'r')
+
+ if not ok: sys.exit(0)
+
+ if user_input == 'i':
+ log.warn("Ignoring running package manager. Some package operations may fail.")
+ break
+
+ if user_input == 'f':
+ ok, ans = tui.enter_yes_no("\nForce quit of package manager '%s'" % cmdline, 'y')
+
+ if not ok: sys.exit(0)
+
+ if ans:
+ cmd = core.su_sudo() % ("kill %d" % pid)
+ status, output = core.run(cmd)
+
+ if status != 0:
+ log.error("Failed to kill process. You may need to manually quit the program.")
+
+ pid, cmdline = core.check_pkg_mgr()
+
+
+ #
+ # CHECK FOR ACTIVE NETWORK CONNECTION
+ #
+ if not assume_network:
+ tui.title("CHECKING FOR NETWORK CONNECTION")
+
+ if not core.check_network_connection():
+ log.error("The network appears to be unreachable. Installation may not resolve all dependencies without access to distribution repositories.")
+ ok, choice = tui.enter_choice("Do you want to continue installation without network?. Press 'y' for YES. Press 'n' for NO (y=yes*, n=no) : ",['y', 'n'], 'y')
+ if not ok or choice == 'n':
+ log.info("Please connect network and try again")
+ sys.exit(1)
+ else:
+ log.debug("Continuing installation without network")
+ else:
+ log.info("Network connection present.")
+
+ #
+ # PRE-DEPEND
+ #
+
+ tui.title("RUNNING PRE-PACKAGE COMMANDS")
+ core.run_pre_depend(progress_callback)
+ log.info("OK")
+
+ #
+ # INSTALL PACKAGES AND RUN COMMANDS
+ #
+
+ tui.title("DEPENDENCY AND CONFLICT RESOLUTION")
+
+ packages = []
+ commands_to_run = []
+ package_mgr_cmd = core.get_distro_data('package_mgr_cmd')
+
+ # HACK!
+ individual_pkgs = True
+ if package_mgr_cmd.startswith('xterm'):
+ individual_pkgs = False
+
+ if package_mgr_cmd:
+ log.debug("Preparing to install packages and run commands...")
+
+ for d in depends_to_install:
+ log.debug("*** Processing dependency: %s" % d)
+ pkgs, commands = core.get_dependency_data(d)
+
+ if pkgs:
+ log.debug("Package(s) '%s' will be installed to satisfy dependency '%s'." %
+ (','.join(pkgs), d))
+
+ packages.extend(pkgs)
+
+ if commands:
+ log.debug("Command(s) '%s' will be run to satisfy dependency '%s'." %
+ (','.join(commands), d))
+
+ commands_to_run.extend(commands)
+
+ else:
+ log.error("Invalid package manager")
+
+ log.debug("Packages: %s" % packages)
+ log.debug("Commands: %s" % commands_to_run)
+ log.debug("Install individual packages: %s" % individual_pkgs)
+
+ if package_mgr_cmd and packages:
+ if individual_pkgs:
+ for packages_to_install in packages:
+ retries = 0
+ while True:
+ cmd = utils.cat(package_mgr_cmd)
+ log.debug("Package manager command: %s" % cmd)
+
+ log.info("Running '%s'\nPlease wait, this may take several minutes..." % cmd)
+ status, output = core.run(cmd)
+
+ if status != 0:
+ retries += 1
+ if retries < (max_retries+1):
+ log.error("Command failed. Re-try #%d..." % retries)
+ continue
+
+ log.error("Package install command failed with error code %d" % status)
+ ok, ans = tui.enter_yes_no("Would you like to retry installing the missing package(s)")
+
+ if not ok:
+ sys.exit(0)
+
+ if ans:
+ continue
+ else:
+ log.warn("Some HPLIP functionality might not function due to missing package(s).")
+ break
+ else:
+ break
+
+ else:
+ packages_to_install = ' '.join(packages)
+ while True:
+ cmd = utils.cat(package_mgr_cmd)
+ log.debug("Package manager command: %s" % cmd)
+
+ log.info("Running '%s'\nPlease wait, this may take several minutes..." % cmd)
+ status, output = core.run(cmd)
+
+ if status != 0:
+ log.error("Package install command failed with error code %d" % status)
+ ok, ans = tui.enter_yes_no("Would you like to retry installing the missing package(s)")
+
+ if not ok:
+ sys.exit(0)
+
+ if ans:
+ continue
+ else:
+ log.warn("Some HPLIP functionality might not function due to missing package(s).")
+ break
+ else:
+ break
+
+ if commands_to_run:
+ for cmd in commands_to_run:
+ log.debug(cmd)
+ log.info("Running '%s'\nPlease wait, this may take several minutes..." % cmd)
+ status, output = core.run(cmd)
+
+ if status != 0:
+ log.error("Install command failed with error code %d" % status)
+ sys.exit(1)
+
+
+
+
+ #
+ # HPLIP REMOVE
+ #
+ if core.hplip_present and core.selected_component == 'hplip' and core.distro_version_supported:
+ path = utils.which('hp-uninstall')
+ ok, choice = tui.enter_choice("HPLIP-%s exists, this may conflict with the new one being installed.\nDo you want to ('i'= Remove and Install, 'o'= Overwrite*, 'q'= Quit)? :"%(prev_hplip_version),['i','o','q'],'o')
+ if not ok or choice=='q':
+ log.error("User Exit")
+ sys.exit(0)
+ elif choice == 'i':
+# log.info("Uninstalling existing HPLIP-%s"%prev_hplip_version)
+ sts =core.uninstall(NON_INTERACTIVE_MODE)
+
+ if sts is False:
+ log.warn("Failed to uninstall existing HPLIP-%s. This installation will overwrite on existing HPLIP" %prev_hplip_version)
+ else:
+ log.debug("HPLIP-%s is uninstalled successfully." %prev_hplip_version)
+
+ #
+ # POST-DEPEND
+ #
+ tui.title("RUNNING POST-PACKAGE COMMANDS")
+ core.run_post_depend(progress_callback)
+ log.info("OK")
+
+
+ #
+ # DEPENDENCIES RE-CHECK
+ #
+ tui.title("RE-CHECKING DEPENDENCIES")
+ core.check_dependencies()
+
+ num_req_missing = 0
+ for depend, desc, opt in core.missing_required_dependencies():
+ num_req_missing += 1
+ log.error("A required dependency '%s (%s)' is still missing." % (depend, desc))
+
+ if num_req_missing:
+ if num_req_missing > 1:
+ log.error("Installation cannot continue without these dependencies.")
+ else:
+ log.error("Installation cannot continue without this dependency.")
+
+ log.error("Please manually install this dependency and re-run this installer.")
+ sys.exit(1)
+
+ for depend, desc, required_for_opt, opt in core.missing_optional_dependencies():
+ if required_for_opt:
+ log.warn("An optional dependency '%s (%s)' is still missing." % (depend, desc))
+ log.warn("Option '%s' has been turned off." % opt)
+ core.selected_options[opt] = False
+ else:
+ log.warn("An optional dependency '%s (%s)' is still missing." % (depend, desc))
+ log.warn("Some features may not function as expected.")
+
+
+ if not num_opt_missing and not num_req_missing:
+ log.info("OK")
+
+ #
+ # INSTALL LOCATION
+ #
+
+ log.debug("Install location = %s" % core.install_location)
+
+
+ #
+ # BUILD AND INSTALL
+ #
+
+ if not auto:
+ tui.title("READY TO BUILD AND INSTALL")
+ if not tui.continue_prompt("Ready to perform build and install."):
+ sys.exit(0)
+
+ tui.title("PRE-BUILD COMMANDS")
+ core.run_pre_build(progress_callback)
+ log.info("OK")
+
+ tui.title("BUILD AND INSTALL")
+
+ os.umask(0022)
+ for cmd in core.build_cmds():
+ log.info("Running '%s'\nPlease wait, this may take several minutes..." % cmd)
+ status, output = core.run(cmd)
+
+ if status != 0:
+ if 'configure' in cmd:
+ log.error("Configure failed with error: %s" % CONFIGURE_ERRORS.get(status, CONFIGURE_ERRORS[1]))
+
+ else:
+ log.error("'%s' command failed with status code %d" % (cmd, status))
+
+ sys.exit(0)
+ else:
+ log.info("Command completed successfully.")
+
+ log.info("")
+
+ log.info("\nBuild complete.")
+
+ #
+ # POST BUILD
+ #
+
+ tui.title("POST-BUILD COMMANDS")
+ core.run_post_build(progress_callback)
+
+ #
+ # OPEN MDNS MULTICAST PORT
+ #
+ user_conf = UserConfig()
+
+ if core.selected_options['network']:
+ open_mdns_port = core.get_distro_ver_data('open_mdns_port')
+ if open_mdns_port:
+ tui.title("OPEN MDNS/BONJOUR FIREWALL PORT (MULTICAST PORT 5353)")
+
+ paragraph = "In order to setup your printer on the network using mDNS/Bonjour, it is required that your internet firewall allows connections on port 5353. If this port is blocked by the firewall, connection to network printers using mDNS/Bonjour will not be possible."
+
+ for p in tui.format_paragraph(paragraph):
+ log.info(p)
+ log.info("")
+
+ ok, ans = tui.enter_yes_no("Do you wish to open this port on your internet firewall")
+ if not ok: sys.exit(0)
+
+ if ans:
+ core.run_open_mdns_port()
+ else:
+ log.warn("Skipping firewall setup. If this port is blocked on your firewall when setting up network printers, use SLP discovery and device URIs with ?ip=x.x.x.x. When using hp-setup, choose 'SLP' discovery under 'Advanced'.")
+
+
+ #
+ # Try to close running hp-systray (3.9.2 or later)
+ #
+
+ if current_version >= 0x030902: # 3.9.2
+ try:
+ from dbus import SessionBus, lowlevel
+ except ImportError:
+ pass
+ else:
+ try:
+ args = ['', '', EVENT_SYSTEMTRAY_EXIT, prop.username, 0, '', '']
+ msg = lowlevel.SignalMessage('/', 'com.hplip.StatusService', 'Event')
+ msg.append(signature='ssisiss', *args)
+ tui.title("CLOSE HP_SYSTRAY")
+ log.info("Sending close message to hp-systray (if it is currently running)...")
+ SessionBus().send_message(msg)
+ time.sleep(0.5)
+ except:
+ pass
+
+ tui.title("HPLIP UPDATE NOTIFICATION")
+ ok, choice = tui.enter_choice("Do you want to check for HPLIP updates?. (y=yes*, n=no) : ",['y', 'n'], 'y')
+ if not ok or choice != 'y':
+ user_conf.set('upgrade', 'notify_upgrade', 'false')
+ else:
+ user_conf.set('upgrade', 'notify_upgrade', 'true')
+
+ user_conf.set('upgrade','last_upgraded_time',str(int(time.time())))
+ user_conf.set('upgrade','pending_upgrade_time','0')
+
+
+ if core.selected_component == 'hplip':
+ tui.title("RESTART OR RE-PLUG IS REQUIRED")
+ cmd = "hp-setup"
+ paragraph = """If you are installing a USB connected printer, and the printer was plugged in when you started this installer, you will need to either restart your PC or unplug and re-plug in your printer (USB cable only). If you choose to restart, run this command after restarting: %s (Note: If you are using a parallel connection, you will have to restart your PC. If you are using network/wireless, you can ignore and continue).""" % cmd
+
+ for p in tui.format_paragraph(paragraph):
+ log.info(p)
+ log.info("")
+
+ ok, choice = tui.enter_choice("Restart or re-plug in your printer (r=restart, p=re-plug in*, i=ignore/continue, q=quit) : ",
+ ['r', 'p', 'i'], 'p')
+
+ if not ok:
+ start_systray()
+ sys.exit(0)
+
+ if choice == 'r':
+ log.note("")
+ log.note("IMPORTANT! Make sure to save all work in all open applications before restarting!")
+
+ ok, ans = tui.enter_yes_no(log.bold("Restart now"), 'n')
+ if not ok:
+ start_systray()
+ sys.exit(0)
+ if ans:
+ ok = core.restart()
+ if not ok:
+ log.error("Restart failed. Please restart using the system menu.")
+
+ start_systray()
+ sys.exit(0)
+
+ elif choice == 'p': # 'p'
+ if not tui.continue_prompt("Please unplug and re-plugin your printer now. "):
+ start_systray()
+ sys.exit(0)
+
+
+ #
+ # SETUP PRINTER
+ #
+ if core.selected_component == 'hplip':
+ tui.title("PRINTER SETUP")
+
+ if auto:
+ install_printer = True
+ else:
+ ok, install_printer = tui.enter_yes_no("Would you like to setup a printer now")
+ if not ok:
+ start_systray()
+ sys.exit(0)
+
+ if install_printer:
+ log.info("Please make sure your printer is connected and powered on at this time.")
+ if not core.run_hp_setup():
+ log.error("hp-setup failed. Please run hp-setup manually.")
+
+ start_systray()
+ except KeyboardInterrupt:
+ log.info("")
+ log.error("Aborted.")
+
+ sys.exit(0)
+
diff --git a/io/hpmud/dot4.c b/io/hpmud/dot4.c
new file mode 100644
index 0000000..ba56e53
--- /dev/null
+++ b/io/hpmud/dot4.c
@@ -0,0 +1,750 @@
+/*****************************************************************************\
+
+ dot4.c - 1284.4 support multi-point tranport driver
+
+ (c) 2005-2007 Copyright Hewlett-Packard Development Company, LP
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+ of the Software, and to permit persons to whom the Software is furnished to do
+ so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+\*****************************************************************************/
+
+#include "hpmud.h"
+#include "hpmudi.h"
+
+/*
+ * This 1284.4 implementation does not support "Multiple Outstanding Transactions" which is optional.
+ */
+
+/* Write command reply back to peripheral. */
+static int Dot4ForwardReply(mud_channel *pc, int fd, unsigned char *buf, int size)
+{
+ mud_device *pd = &msp->device[pc->dindex];
+ int len=0;
+
+ if ((len = (pd->vf.write)(fd, buf, size, HPMUD_EXCEPTION_TIMEOUT)) != size)
+ {
+ BUG("unable to Dot4ForwarReply: %m\n");
+ }
+ return len;
+}
+
+/* Execute command from peripheral. */
+static int Dot4ExecReverseCmd(mud_channel *pc, int fd, unsigned char *buf)
+{
+ mud_device *pd = &msp->device[pc->dindex];
+ mud_channel *out_of_bound_channel;
+ DOT4Cmd *pCmd;
+ DOT4Reply *pReply;
+ DOT4Credit *pCredit;
+ DOT4CreditReply *pCreditReply;
+ DOT4CreditRequest *pCreditReq;
+ DOT4CreditRequestReply *pCreditReqReply;
+ DOT4Error *pError;
+ int len, size;
+ unsigned char socket;
+ static int cnt;
+
+ pCmd = (DOT4Cmd *)buf;
+
+ /* See if this packet is a command packet. */
+ if (!(pCmd->h.psid == 0 && pCmd->h.ssid == 0))
+ {
+ if (pCmd->h.psid == pCmd->h.ssid)
+ {
+ /* Got a valid data packet handle it. This can happen when channel_read timeouts and p2hcredit=1. */
+ out_of_bound_channel = &pd->channel[pCmd->h.psid];
+
+ if (out_of_bound_channel->ta.p2hcredit <= 0)
+ {
+ BUG("invalid data packet credit=%d\n", out_of_bound_channel->ta.p2hcredit);
+ return 0;
+ }
+
+ size = ntohs(pCmd->h.length) - sizeof(DOT4Header);
+ if (size > (HPMUD_BUFFER_SIZE - out_of_bound_channel->rcnt))
+ {
+ BUG("invalid data packet size=%d\n", size);
+ return 0;
+ }
+ memcpy(&out_of_bound_channel->rbuf[out_of_bound_channel->rcnt], buf+sizeof(MLCHeader), size);
+ out_of_bound_channel->rcnt += size;
+ if (pCmd->h.credit)
+ out_of_bound_channel->ta.h2pcredit += pCmd->h.credit; /* note, piggy back credit is 1 byte wide */
+ out_of_bound_channel->ta.p2hcredit--; /* one data packet was read, decrement credit count */
+ }
+ else
+ {
+ len = ntohs(pCmd->h.length);
+ BUG("unsolicited data packet: psid=%x, ssid=%x, length=%d, credit=%d, status=%x\n", pCmd->h.psid,
+ pCmd->h.ssid, len, pCmd->h.credit, pCmd->h.control);
+ DBG_DUMP(buf, len);
+ }
+ return 0;
+ }
+
+ /* Process any command. */
+ switch (pCmd->cmd)
+ {
+ case DOT4_CREDIT:
+ pCredit = (DOT4Credit *)buf;
+ out_of_bound_channel = &pd->channel[pCredit->psocket];
+ out_of_bound_channel->ta.h2pcredit += ntohs(pCredit->credit);
+ pCreditReply = (DOT4CreditReply *)buf;
+ pCreditReply->h.length = htons(sizeof(DOT4CreditReply));
+ pCreditReply->h.credit = 1; /* transaction credit for next command */
+ pCreditReply->h.control = 0;
+ pCreditReply->cmd |= 0x80;
+ pCreditReply->result = 0;
+ pCreditReply->psocket = out_of_bound_channel->sockid;
+ pCreditReply->ssocket = out_of_bound_channel->sockid;
+ Dot4ForwardReply(pc, fd, (unsigned char *)pCreditReply, sizeof(DOT4CreditReply));
+ break;
+ case DOT4_CREDIT_REQUEST:
+ pCreditReq = (DOT4CreditRequest *)buf;
+ if (cnt++ < 5)
+ BUG("unexpected DOT4CreditRequest: cmd=%x, hid=%x, pid=%x, maxcredit=%d\n", pCreditReq->cmd,
+ pCreditReq->psocket, pCreditReq->ssocket, ntohs(pCreditReq->maxcredit));
+ socket = pCreditReq->ssocket;
+ pCreditReqReply = (DOT4CreditRequestReply *)buf;
+ pCreditReqReply->h.length = htons(sizeof(DOT4CreditRequestReply));
+ pCreditReqReply->h.credit = 1; /* transaction credit for next command */
+ pCreditReqReply->h.control = 0;
+ pCreditReqReply->cmd |= 0x80;
+ pCreditReqReply->result = 0;
+ pCreditReqReply->psocket = socket;
+ pCreditReqReply->ssocket = socket;
+ pCreditReqReply->credit = 0;
+ Dot4ForwardReply(pc, fd, (unsigned char *)pCreditReqReply, sizeof(DOT4CreditRequestReply));
+ break;
+ case DOT4_ERROR:
+ pError = (DOT4Error *)buf;
+ BUG("unexpected DOT4Error: cmd=%x, psocket=%d, ssocket=%d, error=%x\n", pError->cmd, pError->psocket, pError->ssocket, pError->error);
+ return 1;
+ default:
+ pReply = (DOT4Reply *)buf;
+ BUG("unexpected command: cmd=%x, result=%x\n", pReply->cmd, pReply->result);
+ pReply->h.length = htons(sizeof(DOT4Reply));
+ pReply->h.credit = 1; /* transaction credit for next command */
+ pReply->h.control = 0;
+ pReply->cmd |= 0x80;
+ pReply->result = 1;
+ Dot4ForwardReply(pc, fd, (unsigned char *)pReply, sizeof(DOT4Reply));
+ break;
+ }
+ return 0;
+}
+
+/* Get command from peripheral and processes the reverse command. */
+int __attribute__ ((visibility ("hidden"))) Dot4ReverseCmd(mud_channel *pc, int fd)
+{
+ mud_device *pd = &msp->device[pc->dindex];
+ unsigned char buf[HPMUD_BUFFER_SIZE];
+ int stat=0, len, size;
+ unsigned int pklen;
+ unsigned char *pBuf;
+ DOT4Reply *pPk;
+
+ pPk = (DOT4Reply *)buf;
+
+ pBuf = buf;
+
+ /* Read packet header. */
+ size = sizeof(DOT4Header);
+ while (size > 0)
+ {
+ if ((len = (pd->vf.read)(fd, pBuf, size, HPMUD_EXCEPTION_TIMEOUT)) < 0)
+ {
+ BUG("unable to read Dot4ReverseCmd header: %m\n");
+ stat = 1;
+ goto bugout;
+ }
+ size-=len;
+ pBuf+=len;
+ }
+
+ /* Determine packet size. */
+ if ((pklen = ntohs(pPk->h.length)) > sizeof(buf))
+ {
+ BUG("invalid Dot4ReverseCmd packet size: size=%d\n", pklen);
+ stat = 1;
+ goto bugout;
+ }
+
+ /* Read packet data field. */
+ size = pklen - sizeof(DOT4Header);
+ while (size > 0)
+ {
+ if ((len = (pd->vf.read)(fd, pBuf, size, HPMUD_EXCEPTION_TIMEOUT)) < 0)
+ {
+ BUG("unable to read Dot4ReverseCmd data: %m exp=%zd act=%zd\n", pklen-sizeof(DOT4Header), pklen-sizeof(DOT4Header)-size);
+ stat = 1;
+ goto bugout;
+ }
+ size-=len;
+ pBuf+=len;
+ }
+
+ stat = Dot4ExecReverseCmd(pc, fd, buf);
+
+bugout:
+ return stat;
+}
+
+/*
+ * Get command reply from peripheral. Waits for reply then returns. Processes any reverse commands
+ * while waiting for a reply.
+ */
+static int Dot4ReverseReply(mud_channel *pc, int fd, unsigned char *buf, int bufsize)
+{
+ mud_device *pd = &msp->device[pc->dindex];
+ int stat=0, len, size, pklen;
+ unsigned char *pBuf;
+ DOT4Reply *pPk;
+
+ pPk = (DOT4Reply *)buf;
+
+ while (1)
+ {
+ pBuf = buf;
+
+ /* Read packet header. */
+ size = sizeof(DOT4Header);
+ while (size > 0)
+ {
+ if ((len = (pd->vf.read)(fd, pBuf, size, 4000000)) < 0) /* wait 4 seconds, 2 fails on PS2575 1200dpi uncompressed scanning */
+ {
+ BUG("unable to read Dot4ReverseReply header: %m bytesRead=%zd\n", sizeof(DOT4Header)-size);
+ stat = 2; /* short timeout */
+ goto bugout;
+ }
+ size-=len;
+ pBuf+=len;
+ }
+
+ /* Determine packet size. */
+ pklen = ntohs(pPk->h.length);
+ if (pklen <= 0 || pklen > bufsize)
+ {
+ BUG("invalid Dot4ReverseReply packet size: size=%d, buf=%d\n", pklen, bufsize);
+ stat = 1;
+ goto bugout;
+ }
+
+ /* Read packet data field. */
+ size = pklen - sizeof(DOT4Header);
+ while (size > 0)
+ {
+ if ((len = (pd->vf.read)(fd, pBuf, size, HPMUD_EXCEPTION_TIMEOUT)) < 0)
+ {
+ BUG("unable to read Dot4ReverseReply data: %m exp=%zd act=%zd\n", pklen-sizeof(DOT4Header), pklen-sizeof(DOT4Header)-size);
+ stat = 1;
+ goto bugout;
+ }
+ size-=len;
+ pBuf+=len;
+ }
+
+ /* Check for reply. */
+ if (pPk->cmd & 0x80)
+ break;
+
+ stat = Dot4ExecReverseCmd(pc, fd, buf);
+
+ if (stat != 0)
+ break;
+
+ } /* while (1) */
+
+bugout:
+ return stat;
+}
+
+int __attribute__ ((visibility ("hidden"))) Dot4Init(mud_channel *pc, int fd)
+{
+ mud_device *pd = &msp->device[pc->dindex];
+ unsigned char buf[HPMUD_BUFFER_SIZE];
+ int stat=0, len, n, cnt;
+ DOT4Init *pCmd;
+ DOT4InitReply *pReply;
+
+ memset(buf, 0, sizeof(DOT4Init));
+ pCmd = (DOT4Init *)buf;
+ n = sizeof(DOT4Init);
+ pCmd->h.length = htons(n);
+ pCmd->h.credit = 1; /* transaction credit for reply */
+ pCmd->cmd = DOT4_INIT;
+ pCmd->rev = 0x20;
+
+ if ((len = (pd->vf.write)(fd, pCmd, n, HPMUD_EXCEPTION_TIMEOUT)) != n)
+ {
+ BUG("unable to write DOT4Init: %m\n");
+ stat = 1;
+ goto bugout;
+ }
+
+ cnt=0;
+ while(1)
+ {
+ stat = Dot4ReverseReply(pc, fd, buf, sizeof(buf));
+ pReply = (DOT4InitReply *)buf;
+
+ if ((stat != 0) || (pReply->cmd != (0x80 | DOT4_INIT)) || (pReply->result != 0))
+ {
+ if (errno == EIO && cnt<1)
+ {
+ /* hack for usblp.c 2.6.5 */
+ BUG("invalid DOT4InitReply retrying...\n");
+ sleep(1);
+ cnt++;
+ continue;
+ }
+ if (stat == 2 && cnt<1)
+ {
+ /* hack for Fullhouse, Swami and Northstar */
+ BUG("invalid DOT4InitReply retrying command...\n");
+ memset(buf, 0, sizeof(DOT4Init));
+ n = sizeof(DOT4Init);
+ pCmd->h.length = htons(n);
+ pCmd->h.credit = 1; /* transaction credit for reply */
+ pCmd->cmd = DOT4_INIT;
+ pCmd->rev = 0x20;
+ (pd->vf.write)(fd, pCmd, n, HPMUD_EXCEPTION_TIMEOUT);
+ cnt++;
+ continue;
+ }
+ BUG("invalid DOT4InitReply: cmd=%x, result=%x\n, revision=%x\n", pReply->cmd, pReply->result, pReply->rev);
+ stat = 1;
+ goto bugout;
+ }
+ break;
+ }
+
+bugout:
+ return stat;
+}
+
+int __attribute__ ((visibility ("hidden"))) Dot4Exit(mud_channel *pc, int fd)
+{
+ mud_device *pd = &msp->device[pc->dindex];
+ unsigned char buf[HPMUD_BUFFER_SIZE];
+ int stat=0, len, n;
+ DOT4Exit *pCmd;
+ DOT4ExitReply *pReply;
+
+ memset(buf, 0, sizeof(DOT4Exit));
+ pCmd = (DOT4Exit *)buf;
+ n = sizeof(DOT4Exit);
+ pCmd->h.length = htons(n);
+ pCmd->h.credit = 1;
+ pCmd->cmd = DOT4_EXIT;
+
+ if ((len = (pd->vf.write)(fd, pCmd, n, HPMUD_EXCEPTION_TIMEOUT)) != n)
+ {
+ BUG("unable to write DOT4Exit: %m\n");
+ stat = 1;
+ goto bugout;
+ }
+
+ stat = Dot4ReverseReply(pc, fd, buf, sizeof(buf));
+ pReply = (DOT4ExitReply *)buf;
+
+ if ((stat != 0) || (pReply->cmd != (0x80 | DOT4_EXIT)) || (pReply->result != 0))
+ {
+ BUG("invalid DOT4ExitReply: cmd=%x, result=%x\n", pReply->cmd, pReply->result);
+ stat = 1;
+ goto bugout;
+ }
+
+bugout:
+ return stat;
+}
+
+int __attribute__ ((visibility ("hidden"))) Dot4GetSocket(mud_channel *pc, int fd)
+{
+ mud_device *pd = &msp->device[pc->dindex];
+ unsigned char buf[HPMUD_BUFFER_SIZE];
+ int stat=0, len, n;
+ DOT4GetSocket *pCmd;
+ DOT4GetSocketReply *pReply;
+
+ memset(buf, 0, sizeof(DOT4GetSocket));
+ pCmd = (DOT4GetSocket *)buf;
+ n = sizeof(DOT4GetSocket);
+ len = strlen(pc->sn);
+ memcpy(buf+sizeof(DOT4GetSocket), pc->sn, len);
+ n += len;
+ pCmd->h.length = htons(n);
+ pCmd->h.credit = 1;
+ pCmd->cmd = DOT4_GET_SOCKET;
+
+ if ((len = (pd->vf.write)(fd, pCmd, n, HPMUD_EXCEPTION_TIMEOUT)) != n)
+ {
+ BUG("unable to write DOT4GetSocket: %m\n");
+ stat = 1;
+ goto bugout;
+ }
+
+ stat = Dot4ReverseReply(pc, fd, buf, sizeof(buf));
+ pReply = (DOT4GetSocketReply *)buf;
+
+ if ((stat != 0) || (pReply->cmd != (0x80 | DOT4_GET_SOCKET)) || (pReply->result != 0))
+ {
+ BUG("invalid DOT4GetSocketReply: cmd=%x, result=%x\n", pReply->cmd, pReply->result);
+ stat = 1;
+ goto bugout;
+ }
+
+ pc->sockid = pReply->socket;
+
+ if (pc->sockid != pc->index)
+ BUG("invalid sockid match sockid=%d index=%d\n", pc->sockid, pc->index);
+
+bugout:
+ return stat;
+}
+
+/* Write data to peripheral. */
+int __attribute__ ((visibility ("hidden"))) Dot4ForwardData(mud_channel *pc, int fd, const void *buf, int size, int usec_timeout)
+{
+ mud_device *pd = &msp->device[pc->dindex];
+ int stat=0, len, n;
+ DOT4Header h;
+
+ memset(&h, 0, sizeof(h));
+ n = sizeof(DOT4Header) + size;
+ h.length = htons(n);
+ h.psid = pc->sockid;
+ h.ssid = pc->sockid;
+
+ if ((len = (pd->vf.write)(fd, &h, sizeof(DOT4Header), usec_timeout)) != sizeof(DOT4Header))
+ {
+ BUG("unable to write Dot4ForwardData header: %m\n");
+ stat = 1;
+ goto bugout;
+ }
+
+ if ((len = (pd->vf.write)(fd, buf, size, usec_timeout)) != size)
+ {
+ BUG("unable to write Dot4ForwardData: %m\n");
+ stat = 1;
+ goto bugout;
+ }
+
+bugout:
+ return stat;
+}
+
+/* Read data from peripheral. */
+int __attribute__ ((visibility ("hidden"))) Dot4ReverseData(mud_channel *pc, int fd, void *buf, int length, int usec_timeout)
+{
+ mud_device *pd = &msp->device[pc->dindex];
+ mud_channel *out_of_bound_channel;
+ int len, size, total;
+ DOT4Header *pPk;
+
+ pPk = (DOT4Header *)buf;
+
+ while (1)
+ {
+ total = 0;
+
+ /* Read packet header. */
+ size = sizeof(DOT4Header);
+ while (size > 0)
+ {
+ /* Use requested client timeout until we start reading. */
+ if (total == 0)
+ len = (pd->vf.read)(fd, buf+total, size, usec_timeout);
+ else
+ len = (pd->vf.read)(fd, buf+total, size, HPMUD_EXCEPTION_TIMEOUT);
+
+ if (len < 0)
+ {
+ /* Got a timeout, if exception timeout or timeout occured after read started thats an error. */
+ if (usec_timeout >= HPMUD_EXCEPTION_TIMEOUT || total > 0)
+ BUG("unable to read Dot4ReverseData header: %m %s\n", pd->uri);
+ goto bugout;
+ }
+ size-=len;
+ total+=len;
+ }
+
+ /* Determine data size. */
+ size = ntohs(pPk->length) - sizeof(DOT4Header);
+
+ if (size > length)
+ {
+ BUG("invalid Dot4ReverseData size: size=%d, buf=%d\n", size, length);
+ goto bugout;
+ }
+
+ /* Make sure data packet is for this channel. */
+ if (pPk->psid != pc->sockid && pPk->ssid != pc->sockid)
+ {
+ if (pPk->psid == 0 && pPk->ssid == 0)
+ {
+ /* Ok, got a command channel packet instead of a data packet, handle it... */
+ while (size > 0)
+ {
+ if ((len = (pd->vf.read)(fd, buf+total, size, HPMUD_EXCEPTION_TIMEOUT)) < 0)
+ {
+ BUG("unable to read Dot4ReverseData command: %m\n");
+ goto bugout;
+ }
+ size-=len;
+ total=len;
+ }
+ Dot4ExecReverseCmd(pc, fd, buf);
+ continue; /* try again for data packet */
+ }
+ else if (pPk->psid == pPk->ssid)
+ {
+ /* Got a valid data packet for another channel handle it. This can happen when ReadData timeouts and p2hcredit=1. */
+ out_of_bound_channel = &pd->channel[pPk->psid];
+ unsigned char *pBuf;
+
+ if (out_of_bound_channel->ta.p2hcredit <= 0)
+ {
+ BUG("invalid data packet credit=%d\n", out_of_bound_channel->ta.p2hcredit);
+ goto bugout;
+ }
+
+ if (size > (HPMUD_BUFFER_SIZE - out_of_bound_channel->rcnt))
+ {
+ BUG("invalid data packet size=%d\n", size);
+ goto bugout;
+ }
+
+ total = 0;
+ pBuf = &out_of_bound_channel->rbuf[out_of_bound_channel->rcnt];
+ while (size > 0)
+ {
+ if ((len = (pd->vf.read)(fd, pBuf+total, size, HPMUD_EXCEPTION_TIMEOUT)) < 0)
+ {
+ BUG("unable to read MlcReverseData: %m\n");
+ goto bugout;
+ }
+ size-=len;
+ total+=len;
+ }
+
+ out_of_bound_channel->rcnt += total;
+ if (pPk->credit)
+ out_of_bound_channel->ta.h2pcredit += pPk->credit; /* note, piggy back credit is 1 byte wide */
+ out_of_bound_channel->ta.p2hcredit--; /* one data packet was read, decrement credit count */
+ continue; /* try again for data packet */
+ }
+ else
+ {
+ DOT4Cmd *pCmd = (DOT4Cmd *)buf;
+ BUG("invalid Dot4ReverseData state: unexpected packet psid=%x, ssid=%x, cmd=%x\n", pPk->psid, pPk->ssid, pCmd->cmd);
+ goto bugout;
+ }
+ }
+
+ if (pPk->credit)
+ {
+ pc->ta.h2pcredit += pPk->credit; /* note, piggy back credit is 1 byte wide */
+ }
+
+ total = 0; /* eat packet header */
+
+ /* Read packet data field with exception_timeout. */
+ while (size > 0)
+ {
+ if ((len = (pd->vf.read)(fd, buf+total, size, HPMUD_EXCEPTION_TIMEOUT)) < 0)
+ {
+ BUG("unable to read Dot4ReverseData: %m\n");
+ goto bugout;
+ }
+ size-=len;
+ total+=len;
+ }
+ break; /* done reading data packet */
+ } /* while (1) */
+
+bugout:
+ return total;
+}
+
+int __attribute__ ((visibility ("hidden"))) Dot4OpenChannel(mud_channel *pc, int fd)
+{
+ mud_device *pd = &msp->device[pc->dindex];
+ unsigned char buf[HPMUD_BUFFER_SIZE];
+ int stat=0, len, n;
+ DOT4OpenChannel *pCmd;
+ DOT4OpenChannelReply *pReply;
+
+ memset(buf, 0, sizeof(DOT4OpenChannel));
+ pCmd = (DOT4OpenChannel *)buf;
+ n = sizeof(DOT4OpenChannel);
+ pCmd->h.length = htons(n);
+ pCmd->h.credit = 1;
+ pCmd->cmd = DOT4_OPEN_CHANNEL;
+ pCmd->psocket = pc->sockid;
+ pCmd->ssocket = pc->sockid;
+ pCmd->maxp2s = htons(HPMUD_BUFFER_SIZE); /* max primary to secondary packet size in bytes */
+ pCmd->maxs2p = htons(HPMUD_BUFFER_SIZE); /* max secondary to primary packet size in bytes */
+ pCmd->maxcredit = htons(0xffff); /* "unlimited credit" mode, give primary (sender) as much credit as possible */
+
+ if ((len = (pd->vf.write)(fd, pCmd, n, HPMUD_EXCEPTION_TIMEOUT)) != n)
+ {
+ BUG("unable to write Dot4OpenChannel: %m\n");
+ stat = 1;
+ goto bugout;
+ }
+
+ stat = Dot4ReverseReply(pc, fd, buf, sizeof(buf));
+ pReply = (DOT4OpenChannelReply *)buf;
+
+ if ((stat != 0) || (pReply->cmd != (0x80 | DOT4_OPEN_CHANNEL)) || (pReply->result != 0))
+ {
+ BUG("invalid Dot4OpenChannelReply: cmd=%x, result=%x\n", pReply->cmd, pReply->result);
+ stat = 1;
+ goto bugout;
+ }
+
+ pc->ta.h2psize = ntohs(pReply->maxp2s);
+ pc->ta.p2hsize = ntohs(pReply->maxs2p);
+ pc->ta.h2pcredit = ntohs(pReply->credit);
+
+bugout:
+ return stat;
+}
+
+int __attribute__ ((visibility ("hidden"))) Dot4CloseChannel(mud_channel *pc, int fd)
+{
+ mud_device *pd = &msp->device[pc->dindex];
+ unsigned char buf[HPMUD_BUFFER_SIZE];
+ int stat=0, len, n;
+ DOT4CloseChannel *pCmd;
+ DOT4CloseChannelReply *pReply;
+
+ memset(buf, 0, sizeof(DOT4CloseChannel));
+ pCmd = (DOT4CloseChannel *)buf;
+ n = sizeof(DOT4CloseChannel);
+ pCmd->h.length = htons(n);
+ pCmd->h.credit = 1;
+ pCmd->cmd = DOT4_CLOSE_CHANNEL;
+ pCmd->psocket = pc->sockid;
+ pCmd->ssocket = pc->sockid;
+
+ if ((len = (pd->vf.write)(fd, pCmd, n, HPMUD_EXCEPTION_TIMEOUT)) != n)
+ {
+ BUG("unable to write Dot4CloseChannel: %m\n");
+ stat = 1;
+ goto bugout;
+ }
+
+ stat = Dot4ReverseReply(pc, fd, buf, sizeof(buf));
+ pReply = (DOT4CloseChannelReply *)buf;
+
+ if ((stat != 0) || (pReply->cmd != (0x80 | DOT4_CLOSE_CHANNEL)) || (pReply->result != 0))
+ {
+ BUG("invalid Dot4CloseChannelReply: cmd=%x, result=%x\n", pReply->cmd, pReply->result);
+ stat = 1;
+ goto bugout;
+ }
+
+bugout:
+ return stat;
+}
+
+int __attribute__ ((visibility ("hidden"))) Dot4Credit(mud_channel *pc, int fd, unsigned short credit)
+{
+ mud_device *pd = &msp->device[pc->dindex];
+ unsigned char buf[HPMUD_BUFFER_SIZE];
+ int stat=0, len, n;
+ DOT4Credit *pCmd;
+ DOT4CreditReply *pReply;
+
+ memset(buf, 0, sizeof(DOT4Credit));
+ pCmd = (DOT4Credit *)buf;
+ n = sizeof(DOT4Credit);
+ pCmd->h.length = htons(n);
+ pCmd->h.credit = 1;
+ pCmd->cmd = DOT4_CREDIT;
+ pCmd->psocket = pc->sockid;
+ pCmd->ssocket = pc->sockid;
+ pCmd->credit = htons(credit); /* set peripheral to host credit */
+
+ if ((len = (pd->vf.write)(fd, pCmd, n, HPMUD_EXCEPTION_TIMEOUT)) != n)
+ {
+ BUG("unable to write Dot4Credit: %m\n");
+ stat = 1;
+ goto bugout;
+ }
+
+ stat = Dot4ReverseReply(pc, fd, buf, sizeof(buf));
+ pReply = (DOT4CreditReply *)buf;
+
+ if ((stat != 0) || (pReply->cmd != (0x80 | DOT4_CREDIT)) || (pReply->result != 0))
+ {
+ BUG("invalid Dot4CreditReply: cmd=%x, result=%x\n", pReply->cmd, pReply->result);
+ stat = 1;
+ goto bugout;
+ }
+
+ pc->ta.p2hcredit += credit;
+
+bugout:
+ return stat;
+}
+
+int __attribute__ ((visibility ("hidden"))) Dot4CreditRequest(mud_channel *pc, int fd, unsigned short credit)
+{
+ mud_device *pd = &msp->device[pc->dindex];
+ unsigned char buf[HPMUD_BUFFER_SIZE];
+ int stat=0, len, n;
+ DOT4CreditRequest *pCmd;
+ DOT4CreditRequestReply *pReply;
+
+ memset(buf, 0, sizeof(DOT4CreditRequest));
+ pCmd = (DOT4CreditRequest *)buf;
+ n = sizeof(DOT4CreditRequest);
+ pCmd->h.length = htons(n);
+ pCmd->h.credit = 1;
+ pCmd->cmd = DOT4_CREDIT_REQUEST;
+ pCmd->psocket = pc->sockid;
+ pCmd->ssocket = pc->sockid;
+ // pCmd->maxcredit = htons(credit); /* request host to peripheral credit */
+ pCmd->maxcredit = htons(0xffff); /* request host to peripheral credit */
+
+ if ((len = (pd->vf.write)(fd, pCmd, n, HPMUD_EXCEPTION_TIMEOUT)) != n)
+ {
+ BUG("unable to write Dot4CreditRequest: %m\n");
+ stat = 1;
+ goto bugout;
+ }
+
+ stat = Dot4ReverseReply(pc, fd, buf, sizeof(buf));
+ pReply = (DOT4CreditRequestReply *)buf;
+
+ if ((stat != 0) || (pReply->cmd != (0x80 | DOT4_CREDIT_REQUEST)) || (pReply->result != 0))
+ {
+ BUG("invalid Dot4CreditRequestReply: cmd=%x, result=%x\n", pReply->cmd, pReply->result);
+ stat = 1;
+ goto bugout;
+ }
+
+ pc->ta.h2pcredit += ntohs(pReply->credit);
+
+bugout:
+ return stat;
+}
+
diff --git a/io/hpmud/dot4.h b/io/hpmud/dot4.h
new file mode 100644
index 0000000..2623194
--- /dev/null
+++ b/io/hpmud/dot4.h
@@ -0,0 +1,187 @@
+/*****************************************************************************\
+
+ dot4.h - 1284.4 support for multi-point transport driver
+
+ (c) 2005-2007 Copyright Hewlett-Packard Development Company, LP
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+ of the Software, and to permit persons to whom the Software is furnished to do
+ so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+\*****************************************************************************/
+
+#ifndef _DOT4_H
+#define _DOT4_H
+
+enum DOT4_COMMAND
+{
+ DOT4_INIT = MLC_INIT,
+ DOT4_OPEN_CHANNEL = MLC_OPEN_CHANNEL,
+ DOT4_CLOSE_CHANNEL = MLC_CLOSE_CHANNEL,
+ DOT4_CREDIT = MLC_CREDIT,
+ DOT4_CREDIT_REQUEST = MLC_CREDIT_REQUEST,
+ DOT4_GET_SOCKET = 0x9,
+ DOT4_GET_SERVICE = 0xa,
+ DOT4_EXIT = MLC_EXIT,
+ DOT4_ERROR = MLC_ERROR
+};
+
+/*
+ * Note, following structures must be packed. The "pragma pack" statement is not recognized by all gcc compilers (ie: ARM based),
+ * so we use __attribute__((packed)) instead.
+ */
+
+typedef struct
+{
+ unsigned char psid; /* primary socket id (ie: host) */
+ unsigned char ssid; /* secondary socket id (ie: peripheral) */
+ unsigned short length; /* packet length (includes header) */
+ unsigned char credit; /* data packet credit, reserved if command */
+ unsigned char control; /* bit field: 0=normal */
+} __attribute__((packed)) DOT4Header;
+
+typedef struct
+{
+ DOT4Header h;
+ unsigned char cmd;
+ unsigned char rev;
+} __attribute__((packed)) DOT4Init;
+
+typedef struct
+{
+ DOT4Header h;
+ unsigned char cmd;
+ unsigned char result;
+ unsigned char rev;
+} __attribute__((packed)) DOT4InitReply;
+
+typedef struct
+{
+ DOT4Header h;
+ unsigned char cmd;
+} __attribute__((packed)) DOT4Exit;
+
+typedef struct
+{
+ DOT4Header h;
+ unsigned char cmd;
+ unsigned char result;
+} __attribute__((packed)) DOT4ExitReply;
+
+typedef struct
+{
+ DOT4Header h;
+ unsigned char cmd;
+ unsigned char psocket; /* primary socket id */
+ unsigned char ssocket; /* secondary socket id */
+ unsigned short maxp2s; /* max primary to secondary packet size in bytes */
+ unsigned short maxs2p; /* max secondary to primary packet size in bytes */
+ unsigned short maxcredit; /* max outstanding credit */
+} __attribute__((packed)) DOT4OpenChannel;
+
+typedef struct
+{
+ DOT4Header h;
+ unsigned char cmd;
+ unsigned char result;
+ unsigned char psocket;
+ unsigned char ssocket;
+ unsigned short maxp2s; /* max primary to secondary packet size in bytes */
+ unsigned short maxs2p; /* max secondary to primary packet size in bytes */
+ unsigned short maxcredit; /* max outstanding credit */
+ unsigned short credit;
+} __attribute__((packed)) DOT4OpenChannelReply;
+
+typedef struct
+{
+ DOT4Header h;
+ unsigned char cmd;
+ unsigned char psocket; /* primary socket id */
+ unsigned char ssocket; /* secondary socket id */
+} __attribute__((packed)) DOT4CloseChannel;
+
+typedef struct
+{
+ DOT4Header h;
+ unsigned char cmd;
+ unsigned char result;
+ unsigned char psocket; /* primary socket id */
+ unsigned char ssocket; /* secondary socket id */
+} __attribute__((packed)) DOT4CloseChannelReply;
+
+typedef struct
+{
+ DOT4Header h;
+ unsigned char cmd;
+ unsigned char result;
+ unsigned char socket;
+} __attribute__((packed)) DOT4GetSocketReply;
+
+typedef struct
+{
+ DOT4Header h;
+ unsigned char cmd;
+ unsigned char psocket;
+ unsigned char ssocket;
+ unsigned short credit; /* credit for sender */
+} __attribute__((packed)) DOT4Credit;
+
+typedef struct
+{
+ DOT4Header h;
+ unsigned char cmd;
+ unsigned char psocket;
+ unsigned char ssocket;
+ unsigned short maxcredit; /* maximum outstanding credit */
+} __attribute__((packed)) DOT4CreditRequest;
+
+typedef struct
+{
+ DOT4Header h;
+ unsigned char cmd;
+ unsigned char result;
+ unsigned char psocket;
+ unsigned char ssocket;
+ unsigned short credit; /* credit for sender */
+} __attribute__((packed)) DOT4CreditRequestReply;
+
+typedef struct
+{
+ DOT4Header h;
+ unsigned char cmd;
+ unsigned char psocket; /* primary socket id which contains the error */
+ unsigned char ssocket; /* secondary socket id which contains the error */
+ unsigned char error;
+} __attribute__((packed)) DOT4Error;
+
+typedef DOT4ExitReply DOT4Reply;
+typedef DOT4Exit DOT4Cmd;
+typedef DOT4CloseChannelReply DOT4CreditReply;
+typedef DOT4Exit DOT4GetSocket;
+
+int __attribute__ ((visibility ("hidden"))) Dot4ReverseCmd(struct _mud_channel *pc, int fd);
+int __attribute__ ((visibility ("hidden"))) Dot4Init(struct _mud_channel *pc, int fd);
+int __attribute__ ((visibility ("hidden"))) Dot4Exit(struct _mud_channel *pc, int fd);
+int __attribute__ ((visibility ("hidden"))) Dot4GetSocket(struct _mud_channel *pc, int fd);
+int __attribute__ ((visibility ("hidden"))) Dot4ForwardData(struct _mud_channel *pc, int fd, const void *buf, int size, int usec_timeout);
+int __attribute__ ((visibility ("hidden"))) Dot4ReverseData(struct _mud_channel *pc, int fd, void *buf, int length, int usec_timeout);
+int __attribute__ ((visibility ("hidden"))) Dot4OpenChannel(struct _mud_channel *pc, int fd);
+int __attribute__ ((visibility ("hidden"))) Dot4CloseChannel(struct _mud_channel *pc, int fd);
+int __attribute__ ((visibility ("hidden"))) Dot4Credit(struct _mud_channel *pc, int fd, unsigned short credit);
+int __attribute__ ((visibility ("hidden"))) Dot4CreditRequest(struct _mud_channel *pc, int fd, unsigned short credit);
+
+#endif // _DOT4_H
+
diff --git a/io/hpmud/hp-mkuri.c b/io/hpmud/hp-mkuri.c
new file mode 100644
index 0000000..7c32ff7
--- /dev/null
+++ b/io/hpmud/hp-mkuri.c
@@ -0,0 +1,543 @@
+/*****************************************************************************\
+
+ hp-mkuri.c - make uri with multi-point transport driver (HPMUD)
+
+ (c) 2008-2009 Copyright Hewlett-Packard Development Company, LP
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+ of the Software, and to permit persons to whom the Software is furnished to do
+ so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+\*****************************************************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <dirent.h>
+#include <signal.h>
+#include <ctype.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <syslog.h>
+#include <dlfcn.h>
+#include "hpmud.h"
+
+#define _STRINGIZE(x) #x
+#define STRINGIZE(x) _STRINGIZE(x)
+//#define BUG(args...) fprintf(stderr, __FILE__ " " STRINGIZE(__LINE__) ": " args)
+#define BUG(args...) syslog(LOG_ERR, __FILE__ " " STRINGIZE(__LINE__) ": " args)
+
+static int verbose;
+static char homedir[255] = "";
+
+static void usage()
+{
+ fprintf(stdout, "HPLIP Make URI %s\n", VERSION);
+ fprintf(stdout, "(c) 2008 Copyright Hewlett-Packard Development Company, LP\n");
+ fprintf(stdout, "usage: hp-mkuri -i ip [-p port]\n");
+ fprintf(stdout, "usage: hp-mkuri -z hostname\n");
+ fprintf(stdout, "usage: hp-mkuri -b busnum -d devnum\n");
+ fprintf(stdout, "usage: hp-mkuri -s serialnum\n");
+ fprintf(stdout, "usage: hp-mkuri -l /dev/parportx\n");
+ fprintf(stdout, "usage: hp-mkuri -m hostname [-p port]\n");
+ fprintf(stdout, "usage: hp-mkuri -o (probe)\n");
+ fprintf(stdout, "usage: hp-mkuri -c [-n (no notifier)] (check support)\n");
+ fprintf(stdout, "\nSupport matrix:\n");
+ fprintf(stdout, "+--------------+---------+-----+-----------------+-----------------+\n");
+ fprintf(stdout, "| return value | printer | fax | plugin_required | plugin_optional |\n");
+ fprintf(stdout, "+--------------+---------+-----+-----------------+-----------------+\n");
+ fprintf(stdout, "| 0 | yes | | | |\n");
+ fprintf(stdout, "+--------------+---------+-----+-----------------+-----------------+\n");
+ fprintf(stdout, "| 1 | * | * | * | * |\n");
+ fprintf(stdout, "+--------------+---------+-----+-----------------+-----------------+\n");
+ fprintf(stdout, "| 2 | yes | | yes | |\n");
+ fprintf(stdout, "+--------------+---------+-----+-----------------+-----------------+\n");
+ fprintf(stdout, "| 3 | yes | | | yes |\n");
+ fprintf(stdout, "+--------------+---------+-----+-----------------+-----------------+\n");
+ fprintf(stdout, "| 4 | yes | yes | | |\n");
+ fprintf(stdout, "+--------------+---------+-----+-----------------+-----------------+\n");
+ fprintf(stdout, "| 5 | yes | yes | yes | |\n");
+ fprintf(stdout, "+--------------+---------+-----+-----------------+-----------------+\n");
+ fprintf(stdout, "| 6 | yes | yes | | yes |\n");
+ fprintf(stdout, "+--------------+---------+-----+-----------------+-----------------+\n");
+ fprintf(stdout, " * no support or error\n");
+} /* usage */
+
+static int GetPair(char *buf, int buf_len, char *key, char *value, char **tail)
+{
+ int i=0, j;
+
+ key[0] = 0;
+ value[0] = 0;
+
+ if (buf[i] == '#')
+ {
+ for (; buf[i] != '\n' && i < buf_len; i++); /* eat comment line */
+ if (buf[i] == '\n')
+ i++; /* bump past '\n' */
+ }
+
+ j = 0;
+ while ((buf[i] != '=') && (i < buf_len) && (j < HPMUD_LINE_SIZE))
+ key[j++] = buf[i++];
+ for (j--; key[j] == ' ' && j > 0; j--); /* eat white space before = */
+ key[++j] = 0;
+
+ if (buf[i] == '=')
+ for (i++; buf[i] == ' ' && i < buf_len; i++); /* eat white space after = */
+
+ j = 0;
+ while ((buf[i] != '\n') && (i < buf_len) && (j < HPMUD_LINE_SIZE))
+ value[j++] = buf[i++];
+ for (j--; value[j] == ' ' && j > 0; j--); /* eat white space before \n */
+ value[++j] = 0;
+
+ if (buf[i] == '\n')
+ i++; /* bump past '\n' */
+
+ if (tail != NULL)
+ *tail = buf + i; /* tail points to next line */
+
+ return i;
+}
+
+static int ReadConfig()
+{
+ char key[HPMUD_LINE_SIZE];
+ char value[HPMUD_LINE_SIZE];
+ char rcbuf[255];
+ char section[32];
+ char *tail;
+ FILE *inFile = NULL;
+ int stat=1;
+
+ homedir[0] = 0;
+
+ if((inFile = fopen(CONFDIR "/hplip.conf", "r")) == NULL)
+ {
+ BUG("unable to open %s: %m\n", CONFDIR "/hplip.conf");
+ goto bugout;
+ }
+
+ section[0] = 0;
+
+ /* Read the config file */
+ while ((fgets(rcbuf, sizeof(rcbuf), inFile) != NULL))
+ {
+ if (rcbuf[0] == '[')
+ {
+ strncpy(section, rcbuf, sizeof(section)); /* found new section */
+ continue;
+ }
+
+ GetPair(rcbuf, strlen(rcbuf), key, value, &tail);
+
+ if ((strncasecmp(section, "[dirs]", 6) == 0) && (strcasecmp(key, "home") == 0))
+ {
+ strncpy(homedir, value, sizeof(homedir));
+ break; /* done */
+ }
+ }
+
+ stat = 0;
+
+bugout:
+ if (inFile != NULL)
+ fclose(inFile);
+
+ return stat;
+}
+
+static int generalize_model(const char *sz, char *buf, int bufSize)
+{
+ const char *pMd=sz;
+ int i, j, dd=0;
+
+ for (i=0; pMd[i] == ' ' && i < bufSize; i++); /* eat leading white space */
+
+ for (j=0; (pMd[i] != 0) && (pMd[i] != ';') && (j < bufSize); i++)
+ {
+ if (pMd[i]==' ' || pMd[i]=='/')
+ {
+ /* Remove double spaces. */
+ if (!dd)
+ {
+ buf[j++] = '_'; /* convert space to "_" */
+ dd=1;
+ }
+ }
+ else
+ {
+ buf[j++] = tolower(pMd[i]);
+ dd=0;
+ }
+ }
+
+ for (j--; buf[j] == '_' && j > 0; j--); /* eat trailing white space */
+
+ buf[++j] = 0;
+
+ return j; /* length does not include zero termination */
+}
+
+static int set_x_environment(void)
+{
+ DIR *dir=NULL;
+ FILE *file=NULL;
+ struct dirent *entry;
+ char path[32], line[256], cookie[128], *p;
+ int i, c, stat=1;
+
+ if ((dir = opendir("/proc"))==NULL)
+ {
+ BUG("unable to open /proc: %m\n");
+ goto bugout;
+ }
+
+ while ((entry = readdir(dir)) != NULL)
+ {
+ if (!isdigit(*entry->d_name))
+ continue;
+
+ /* Get command line for this PID. */
+ snprintf(path, sizeof(path), "/proc/%s/cmdline", entry->d_name);
+ if ((file = fopen(path, "r")) == NULL)
+ continue;
+ for (i=0; ((c = getc(file)) != EOF) && (i < (sizeof(line)-1)); i++)
+ {
+ if (c == 0)
+ c = ' ';
+ line[i] = c;
+ }
+ line[i]=0;
+ fclose(file);
+ if ((p = strstr(line, "-auth ")))
+ {
+ /* Found X server. */
+ for (p+=6; (*p == ' ') && (*p != 0); p++); /* eat any white space before cookie */
+ for (i=0; (*(p+i) != ' ') && (*(p+i) != 0) && i < (sizeof(cookie)-1); i++)
+ cookie[i] = *(p+i);
+ cookie[i]=0;
+ setenv("XAUTHORITY", cookie, 1);
+ setenv("DISPLAY", ":0.0", 1);
+ break;
+ }
+ } /* while ((entry = readdir(dir)) != NULL) */
+
+ stat = 0;
+
+bugout:
+ if (dir)
+ closedir(dir);
+ return(stat);
+} /* set_x_environment */
+
+static int notify(const char *summary, const char *message, int ms_timeout)
+{
+ void *handle=NULL, *n;
+ int stat=1;
+
+ typedef void (*notify_init_t)(char *);
+ typedef void *(*notify_notification_new_t)(const char *, const char *, const char *, void *);
+ typedef void (*notify_notification_set_timeout_t)(void *, int);
+ typedef void (*notify_notification_show_t)(void *, char *);
+
+ notify_init_t n_init;
+ notify_notification_new_t n_new;
+ notify_notification_set_timeout_t n_timeout;
+ notify_notification_show_t n_show;
+
+ set_x_environment();
+
+ /* Bypass glib build dependencies by loading libnotify manually. */
+
+ if ((handle = dlopen("libnotify.so.1", RTLD_LAZY)) == NULL)
+ {
+ BUG("failed to open libnotify: %m\n");
+ goto bugout;
+ }
+
+ if ((n_init = (notify_init_t)dlsym(handle, "notify_init")) == NULL)
+ {
+ BUG("failed to find notify_init: %m\n");
+ goto bugout;
+ }
+ n_init("Basics");
+
+ if ((n_new = (notify_notification_new_t)dlsym(handle, "notify_notification_new")) == NULL)
+ {
+ BUG("failed to find notify_notification_new: %m\n");
+ goto bugout;
+ }
+ n = n_new(summary, message, NULL, NULL);
+
+ if ((n_timeout = (notify_notification_set_timeout_t)dlsym(handle, "notify_notification_set_timeout")) == NULL)
+ {
+ BUG("failed to find notify_notification_set_timeout: %m\n");
+ goto bugout;
+ }
+ n_timeout(n, ms_timeout);
+
+ if ((n_show = (notify_notification_show_t)dlsym(handle, "notify_notification_show")) == NULL)
+ {
+ BUG("failed to find notify_notification_show: %m\n");
+ goto bugout;
+ }
+ n_show(n, NULL);
+
+ stat=0;
+
+bugout:
+ if (handle)
+ dlclose(handle);
+
+ return stat;
+} /* notify */
+
+static int check_support(int send_notify)
+{
+ struct stat sb;
+ char model[256];
+ int ret=1, plugin_installed=1;
+ const char *pm;
+ char m[256];
+ char datfile[256];
+ char value[32];
+ int support, plugin, fax;
+
+ /* Get hp model from environment variables. */
+ if ((pm = getenv("hp_model")))
+ {
+ strncpy(model, pm, sizeof(model));
+ }
+ else
+ {
+ fprintf(stderr, "error no hp_model environment variable set\n");
+ BUG("error no hp_model environment variable set\n");
+ goto bugout;
+ }
+
+ if (model[0]==0)
+ {
+ BUG("invalid parameter(s)\n");
+ usage();
+ goto bugout;
+ }
+
+ generalize_model(model, m, sizeof(m));
+ snprintf(model, sizeof(model), "[%s]", m);
+
+ if (ReadConfig())
+ goto bugout;
+
+ snprintf(datfile, sizeof(datfile), "%s/data/models/models.dat", homedir);
+
+ if (hpmud_get_key_value(datfile, model, "support-type", value, sizeof(value)) != HPMUD_R_OK)
+ goto bugout;
+ support = strtol(value, NULL, 10);
+ if (hpmud_get_key_value(datfile, model, "plugin", value, sizeof(value)) != HPMUD_R_OK)
+ goto bugout;
+ plugin = strtol(value, NULL, 10);
+ if (hpmud_get_key_value(datfile, model, "fax-type", value, sizeof(value)) != HPMUD_R_OK)
+ goto bugout;
+ fax = strtol(value, NULL, 10);
+
+ /* See if device is supported by hplip. */
+ if (support == HPMUD_SUPPORT_TYPE_NONE)
+ {
+ BUG("%s is not supported by HPLIP %s\n", pm, VERSION);
+ goto bugout;
+ }
+
+ if (stat("/etc/udev/rules.d/86-hpmud-hp_laserjet_1018.rules", &sb) == -1)
+ plugin_installed=0;
+
+ if (send_notify && !plugin_installed)
+ {
+ /* See if device requires a Plugin. */
+ switch (plugin)
+ {
+ case HPMUD_PLUGIN_TYPE_REQUIRED:
+ BUG("%s requires a proprietary plugin\n", pm);
+ notify(pm, "requires a proprietary plugin, run hp-setup", 30000);
+ break;
+ case HPMUD_PLUGIN_TYPE_OPTIONAL:
+ BUG("%s has a optional proprietary plugin\n", pm);
+ notify(pm, "has a optional proprietary plugin, run hp-setup", 30000);
+ break;
+ default:
+ break;
+ }
+ }
+
+ ret = 0;
+ if (plugin == HPMUD_PLUGIN_TYPE_REQUIRED)
+ ret = 2;
+ else if (plugin == HPMUD_PLUGIN_TYPE_OPTIONAL)
+ ret = 3;
+ if (fax > 0)
+ {
+ ret = 4;
+ if (plugin == HPMUD_PLUGIN_TYPE_REQUIRED)
+ ret = 5;
+ else if (plugin == HPMUD_PLUGIN_TYPE_OPTIONAL)
+ ret = 6;
+ }
+
+bugout:
+ return ret;
+} /* check_support */
+
+int main(int argc, char *argv[])
+{
+ char ip[HPMUD_LINE_SIZE]; /* internet address */
+ char bn[HPMUD_LINE_SIZE]; /* usb bus number */
+ char dn[HPMUD_LINE_SIZE]; /* usb device number */
+ char sn[HPMUD_LINE_SIZE]; /* usb serial number */
+ char pp[HPMUD_LINE_SIZE]; /* parallel port device */
+ char uri[HPMUD_LINE_SIZE];
+ char host[HPMUD_LINE_SIZE];
+ int i, port=1, ret=1, probe=0, support=0, send_notify=1;
+ enum HPMUD_RESULT stat;
+ char buf[HPMUD_LINE_SIZE*64];
+ int cnt, bytes_read;
+
+ ip[0] = bn[0] = dn[0] = pp[0] = uri[0] = sn[0] = host[0] = 0;
+ while ((i = getopt(argc, argv, "vhocni:p:b:d:l:s:z:")) != -1)
+ {
+ switch (i)
+ {
+ case 'i':
+ strncpy(ip, optarg, sizeof(ip));
+ break;
+ case 'z':
+ strncpy(host, optarg, sizeof(host));
+ break;
+ case 'p':
+ port = strtol(optarg, NULL, 10);
+ break;
+ case 'b':
+ strncpy(bn, optarg, sizeof(bn));
+ break;
+ case 'd':
+ strncpy(dn, optarg, sizeof(dn));
+ break;
+ case 'l':
+ strncpy(pp, optarg, sizeof(pp));
+ break;
+ case 's':
+ strncpy(sn, optarg, sizeof(sn));
+ break;
+ case 'o':
+ probe++;
+ break;
+ case 'c':
+ support++;
+ break;
+ case 'v':
+ verbose++;
+ break;
+ case 'n':
+ send_notify=0;
+ break;
+ case 'h':
+ usage();
+ exit(0);
+ case '?':
+ usage();
+ fprintf(stderr, "unknown argument: %s\n", argv[1]);
+ exit(-1);
+ default:
+ break;
+ }
+ }
+
+ if (ip[0]==0 && (!(bn[0] && dn[0])) && pp[0]==0 && probe==0 && sn[0]==0 && support==0 && host[0]==0)
+ {
+ fprintf(stderr, "invalid command parameter(s)\n");
+ usage();
+ goto bugout;
+ }
+
+ if (probe)
+ {
+ hpmud_probe_devices(HPMUD_BUS_ALL, buf, sizeof(buf), &cnt, &bytes_read);
+ if (bytes_read)
+ fprintf(stdout, "%s", buf);
+ }
+
+#ifdef HAVE_LIBNETSNMP
+ if (ip[0])
+ {
+ stat = hpmud_make_net_uri(ip, port, uri, sizeof(uri), &bytes_read);
+ if (stat == HPMUD_R_OK)
+ {
+ fprintf(stdout, "%s\n", uri);
+ fprintf(stdout, "hpaio%s\n", &uri[2]);
+ }
+ }
+ if (host[0])
+ {
+ stat = hpmud_make_mdns_uri(host, port, uri, sizeof(uri), &bytes_read);
+ if (stat == HPMUD_R_OK)
+ {
+ fprintf(stdout, "%s\n", uri);
+ fprintf(stdout, "hpaio%s\n", &uri[2]);
+ }
+ }
+#endif
+
+ if (bn[0] && dn[0])
+ {
+ stat = hpmud_make_usb_uri(bn, dn, uri, sizeof(uri), &bytes_read);
+ if (stat == HPMUD_R_OK)
+ {
+ fprintf(stdout, "%s\n", uri);
+ fprintf(stdout, "hpaio%s\n", &uri[2]);
+ }
+ }
+
+ if (sn[0])
+ {
+ stat = hpmud_make_usb_serial_uri(sn, uri, sizeof(uri), &bytes_read);
+ if (stat == HPMUD_R_OK)
+ {
+ fprintf(stdout, "%s\n", uri);
+ fprintf(stdout, "hpaio%s\n", &uri[2]);
+ }
+ }
+
+#ifdef HAVE_PPORT
+ if (pp[0])
+ {
+ stat = hpmud_make_par_uri(pp, uri, sizeof(uri), &bytes_read);
+ if (stat == HPMUD_R_OK)
+ {
+ fprintf(stdout, "%s\n", uri);
+ fprintf(stdout, "hpaio%s\n", &uri[2]);
+ }
+ }
+#endif
+
+ ret = 0;
+
+ if (support)
+ ret = check_support(send_notify);
+
+bugout:
+ exit(ret);
+} /* main */
diff --git a/io/hpmud/hpmud.c b/io/hpmud/hpmud.c
new file mode 100644
index 0000000..d24ebd2
--- /dev/null
+++ b/io/hpmud/hpmud.c
@@ -0,0 +1,699 @@
+/*****************************************************************************\
+
+ hpmud.cpp - multi-point transport driver
+
+ (c) 2004-2007 Copyright Hewlett-Packard Development Company, LP
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+ of the Software, and to permit persons to whom the Software is furnished to do
+ so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+ Author: Naga Samrat Chowdary Narla,
+ Contributor: Sarbeswar Meher
+\*****************************************************************************/
+
+#include "hpmud.h"
+#include "hpmudi.h"
+
+/* Client data. */
+mud_session ms __attribute__ ((visibility ("hidden"))); /* mud session, one per client */
+mud_session *msp __attribute__ ((visibility ("hidden"))) = &ms;
+
+/*
+ * sysdump() originally came from http://sws.dett.de/mini/hexdump-c , steffen@dett.de .
+ */
+void __attribute__ ((visibility ("hidden"))) sysdump(const void *data, int size)
+{
+ /* Dump size bytes of *data. Output looks like:
+ * [0000] 75 6E 6B 6E 6F 77 6E 20 30 FF 00 00 00 00 39 00 unknown 0.....9.
+ */
+
+ unsigned char *p = (unsigned char *)data;
+ unsigned char c;
+ int n;
+ char bytestr[4] = {0};
+ char addrstr[10] = {0};
+ char hexstr[16*3 + 5] = {0};
+ char charstr[16*1 + 5] = {0};
+ for(n=1;n<=size;n++) {
+ if (n%16 == 1) {
+ /* store address for this line */
+ snprintf(addrstr, sizeof(addrstr), "%.4d", (int)((p-(unsigned char *)data) & 0xffff));
+ }
+
+ c = *p;
+ if (isprint(c) == 0) {
+ c = '.';
+ }
+
+ /* store hex str (for left side) */
+ snprintf(bytestr, sizeof(bytestr), "%02X ", *p);
+ strncat(hexstr, bytestr, sizeof(hexstr)-strlen(hexstr)-1);
+
+ /* store char str (for right side) */
+ snprintf(bytestr, sizeof(bytestr), "%c", c);
+ strncat(charstr, bytestr, sizeof(charstr)-strlen(charstr)-1);
+
+ if(n%16 == 0) {
+ /* line completed */
+ DBG_SZ("[%4.4s] %-50.50s %s\n", addrstr, hexstr, charstr);
+ hexstr[0] = 0;
+ charstr[0] = 0;
+ }
+ p++; /* next byte */
+ }
+
+ if (strlen(hexstr) > 0) {
+ /* print rest of buffer if not empty */
+ DBG_SZ("[%4.4s] %-50.50s %s\n", addrstr, hexstr, charstr);
+ }
+}
+
+/* Given the IEEE 1284 device id string, determine if this is a HP product. */
+int __attribute__ ((visibility ("hidden"))) is_hp(const char *id)
+{
+ char *pMf;
+
+ if ((pMf = strstr(id, "MFG:")) != NULL)
+ pMf+=4;
+ else if ((pMf = strstr(id, "MANUFACTURER:")) != NULL)
+ pMf+=13;
+ else
+ return 0;
+
+ if ((strncasecmp(pMf, "HEWLETT-PACKARD", 15) == 0) ||
+ (strncasecmp(pMf, "APOLLO", 6) == 0) || (strncasecmp(pMf, "HP", 2) == 0))
+ {
+ return 1; /* found HP product */
+ }
+ return 0;
+}
+
+int __attribute__ ((visibility ("hidden"))) generalize_model(const char *sz, char *buf, int bufSize)
+{
+ const char *pMd=sz;
+ int i, j, dd=0;
+
+ for (i=0; pMd[i] == ' ' && i < bufSize; i++); /* eat leading white space */
+
+ for (j=0; (pMd[i] != 0) && (pMd[i] != ';') && (j < bufSize); i++)
+ {
+ if (pMd[i]==' ' || pMd[i]=='/')
+ {
+ /* Remove double spaces. */
+ if (!dd)
+ {
+ buf[j++] = '_'; /* convert space to "_" */
+ dd=1;
+ }
+ }
+ else
+ {
+ buf[j++] = pMd[i];
+ dd=0;
+ }
+ }
+
+ for (j--; buf[j] == '_' && j > 0; j--); /* eat trailing white space */
+
+ buf[++j] = 0;
+
+ return j; /* length does not include zero termination */
+}
+
+int __attribute__ ((visibility ("hidden"))) generalize_serial(const char *sz, char *buf, int bufSize)
+{
+ const char *pMd=sz;
+ int i, j;
+
+ for (i=0; pMd[i] == ' ' && i < bufSize; i++); /* eat leading white space */
+
+ for (j=0; (pMd[i] != 0) && (i < bufSize); i++)
+ {
+ buf[j++] = pMd[i];
+ }
+
+ for (i--; buf[i] == ' ' && i > 0; i--); /* eat trailing white space */
+
+ buf[++i] = 0;
+
+ return i; /* length does not include zero termination */
+}
+
+/* Parse serial number from uri string. */
+int __attribute__ ((visibility ("hidden"))) get_uri_serial(const char *uri, char *buf, int bufSize)
+{
+ char *p;
+ int i;
+
+ buf[0] = 0;
+
+ if ((p = strcasestr(uri, "serial=")) != NULL)
+ p+=7;
+ else
+ return 0;
+
+ for (i=0; (p[i] != 0) && (p[i] != '+') && (i < bufSize); i++)
+ buf[i] = p[i];
+
+ buf[i] = 0;
+
+ return i;
+}
+
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) service_to_channel(mud_device *pd, const char *sn, HPMUD_CHANNEL *index)
+{
+ enum HPMUD_RESULT stat;
+
+ *index=-1;
+
+ /* Check for valid service requests. */
+ if (strncasecmp(sn, "print", 5) == 0)
+ {
+ *index = HPMUD_PRINT_CHANNEL;
+ }
+ else if (strncasecmp(sn, "hp-ews-ledm", 11) == 0)
+ {
+ *index = HPMUD_EWS_LEDM_CHANNEL;
+ }
+ else if (strncasecmp(sn, "hp-ews", 6) == 0)
+ {
+ *index = HPMUD_EWS_CHANNEL;
+ }
+ else if (strncasecmp(sn, "hp-soap-scan", 12) == 0)
+ {
+ *index = HPMUD_SOAPSCAN_CHANNEL;
+ }
+ else if (strncasecmp(sn, "hp-soap-fax", 11) == 0)
+ {
+ *index = HPMUD_SOAPFAX_CHANNEL;
+ }
+ else if (strncasecmp(sn, "hp-marvell-scan", 15) == 0)
+ {
+ *index = HPMUD_MARVELL_SCAN_CHANNEL;
+ }
+ else if (strncasecmp(sn, "hp-marvell-fax", 14) == 0)
+ {
+ *index = HPMUD_MARVELL_FAX_CHANNEL;
+ }
+ else if (strncasecmp(sn, "hp-ledm-scan", 12) == 0)
+ {
+ *index = HPMUD_LEDM_SCAN_CHANNEL;
+ }
+ /* All the following services require MLC/1284.4. */
+ else if (pd->io_mode == HPMUD_RAW_MODE || pd->io_mode == HPMUD_UNI_MODE)
+ {
+ BUG("invalid channel_open state, current io_mode=raw/uni service=%s %s\n", sn, pd->uri);
+ stat = HPMUD_R_INVALID_STATE;
+ goto bugout;
+ }
+ else if (strncasecmp(sn, "hp-message", 10) == 0)
+ {
+ *index = HPMUD_PML_CHANNEL;
+ }
+ else if (strncasecmp(sn, "hp-scan", 7) == 0)
+ {
+ *index = HPMUD_SCAN_CHANNEL;
+ }
+ else if (strncasecmp(sn, "hp-fax-send", 11) == 0)
+ {
+ *index = HPMUD_FAX_SEND_CHANNEL;
+ }
+ else if (strncasecmp(sn, "hp-card-access", 14) == 0)
+ {
+ *index = HPMUD_MEMORY_CARD_CHANNEL;
+ }
+ else if (strncasecmp(sn, "hp-configuration-upload", 23) == 0)
+ {
+ *index = HPMUD_CONFIG_UPLOAD_CHANNEL;
+ }
+ else if (strncasecmp(sn, "hp-configuration-download", 25) == 0)
+ {
+ *index = HPMUD_CONFIG_DOWNLOAD_CHANNEL;
+ }
+ else if (strncasecmp(sn, "hp-devmgmt", 10) == 0)
+ {
+ *index = HPMUD_DEVMGMT_CHANNEL;
+ }
+ else if (strncasecmp(sn, "hp-wificonfig", 13) == 0)
+ {
+ *index = HPMUD_WIFI_CHANNEL;
+ }
+ else
+ {
+ BUG("invalid service=%s %s\n", sn, pd->uri);
+ stat = HPMUD_R_INVALID_SN;
+ goto bugout;
+ }
+
+ stat = HPMUD_R_OK;
+
+bugout:
+ return stat;
+}
+
+static int new_device(const char *uri, enum HPMUD_IO_MODE mode, int *result)
+{
+ int index=0; /* device[0] is unused */
+ int i=1;
+
+ if (uri[0] == 0)
+ return 0;
+
+ pthread_mutex_lock(&msp->mutex);
+
+ if (msp->device[i].index)
+ {
+ BUG("invalid device_open state\n"); /* device is already open for this client, one device per session */
+ *result = HPMUD_R_INVALID_STATE;
+ goto bugout;
+ }
+
+ index = i; /* currently only support one device per client or process */
+
+ /* Based on uri, set local session attributes. */
+ if (strcasestr(uri, ":/usb") != NULL)
+ {
+ msp->device[i].vf = musb_mud_device_vf;
+ }
+#ifdef HAVE_LIBNETSNMP
+ else if (strcasestr(uri, ":/net") != NULL)
+ {
+ msp->device[i].vf = jd_mud_device_vf;
+ }
+#endif
+#ifdef HAVE_PPORT
+ else if (strcasestr(uri, ":/par") != NULL)
+ {
+ msp->device[i].vf = pp_mud_device_vf;
+ }
+#endif
+ else
+ {
+ BUG("invalid uri %s\n", uri);
+ *result = HPMUD_R_INVALID_URI;
+ index = 0;
+ goto bugout;
+ }
+ msp->device[i].io_mode = mode;
+ msp->device[i].index = index;
+ msp->device[i].channel_cnt = 0;
+ msp->device[i].open_fd = -1;
+ strcpy(msp->device[i].uri, uri);
+
+bugout:
+ pthread_mutex_unlock(&msp->mutex);
+
+ return index; /* return device index */
+}
+
+static int del_device(HPMUD_DEVICE index)
+{
+ pthread_mutex_lock(&msp->mutex);
+
+ msp->device[index].index = 0;
+
+ pthread_mutex_unlock(&msp->mutex);
+
+ return 0;
+}
+
+/* Make sure client closed down the device. */
+int device_cleanup(mud_session *ps)
+{
+ int i, dd=1;
+
+ if(!ps->device[dd].index)
+ return 0; /* nothing to do */
+
+ BUG("device_cleanup: device uri=%s\n", ps->device[dd].uri);
+
+ for (i=0; i<HPMUD_CHANNEL_MAX; i++)
+ {
+ if (ps->device[dd].channel[i].client_cnt)
+ {
+ BUG("device_cleanup: close channel %d...\n", i);
+ hpmud_close_channel(dd, ps->device[dd].channel[i].index);
+ BUG("device_cleanup: done closing channel %d\n", i);
+ }
+ }
+
+ BUG("device_cleanup: close device dd=%d...\n", dd);
+ hpmud_close_device(dd);
+ BUG("device_cleanup: done closing device dd=%d\n", dd);
+
+ return 0;
+}
+
+static void __attribute__ ((constructor)) mud_init(void)
+{
+ DBG("[%d] hpmud_init()\n", getpid());
+}
+
+static void __attribute__ ((destructor)) mud_exit(void)
+{
+ DBG("[%d] hpmud_exit()\n", getpid());
+ device_cleanup(msp);
+}
+
+/*******************************************************************************************************************************
+ * Helper functions.
+ */
+
+/* Parse the model from the IEEE 1284 device id string and generalize the model name */
+int hpmud_get_model(const char *id, char *buf, int buf_size)
+{
+ char *pMd;
+
+ buf[0] = 0;
+
+ if ((pMd = strstr(id, "MDL:")) != NULL)
+ pMd+=4;
+ else if ((pMd = strstr(id, "MODEL:")) != NULL)
+ pMd+=6;
+ else
+ return 0;
+
+ return generalize_model(pMd, buf, buf_size);
+}
+
+/* Parse the model from the IEEE 1284 device id string. */
+int hpmud_get_raw_model(char *id, char *raw, int rawSize)
+{
+ char *pMd;
+ int i;
+
+ raw[0] = 0;
+
+ if ((pMd = strstr(id, "MDL:")) != NULL)
+ pMd+=4;
+ else if ((pMd = strstr(id, "MODEL:")) != NULL)
+ pMd+=6;
+ else
+ return 0;
+
+ for (i=0; (pMd[i] != ';') && (i < rawSize); i++)
+ raw[i] = pMd[i];
+ raw[i] = 0;
+
+ return i;
+}
+
+/* Parse device model from uri string. */
+int hpmud_get_uri_model(const char *uri, char *buf, int buf_size)
+{
+ char *p;
+ int i;
+
+ buf[0] = 0;
+
+ if ((p = strstr(uri, "/")) == NULL)
+ return 0;
+ if ((p = strstr(p+1, "/")) == NULL)
+ return 0;
+ p++;
+
+ for (i=0; (p[i] != '?') && (i < buf_size); i++)
+ buf[i] = p[i];
+
+ buf[i] = 0;
+
+ return i;
+}
+
+/* Parse the data link from a uri string. */
+int hpmud_get_uri_datalink(const char *uri, char *buf, int buf_size)
+{
+ char *p;
+ int i;
+ int zc=0;
+#ifdef HAVE_LIBNETSNMP
+ char ip[HPMUD_LINE_SIZE];
+#endif
+
+ buf[0] = 0;
+
+ if ((p = strcasestr(uri, "device=")) != NULL)
+ p+=7;
+ else if ((p = strcasestr(uri, "ip=")) != NULL)
+ p+=3;
+ else if ((p = strcasestr(uri, "zc=")) != NULL)
+ {
+ p+=3;
+ zc=1;
+ }
+ else
+ return 0;
+
+ if (zc)
+ {
+#ifdef HAVE_LIBNETSNMP
+ if (hpmud_mdns_lookup(p, HPMUD_MDNS_TIMEOUT, ip) != HPMUD_R_OK)
+ return 0;
+ for (i=0; (ip[i] != 0) && (i < buf_size); i++)
+ buf[i] = ip[i];
+#else
+ return 0;
+#endif
+ }
+ else {
+ for (i=0; (p[i] != 0) && (p[i] != '&') && (i < buf_size); i++)
+ buf[i] = p[i];
+ }
+
+ buf[i] = 0;
+
+ return i;
+}
+
+/***************************************************************************************************
+ * Core functions.
+ */
+
+enum HPMUD_RESULT hpmud_open_device(const char *uri, enum HPMUD_IO_MODE iomode, HPMUD_DEVICE *dd)
+{
+ HPMUD_DEVICE index=0;
+ enum HPMUD_RESULT stat = HPMUD_R_INVALID_URI;
+ int result;
+
+ DBG("[%d,%d,%d,%d,%d,%d] hpmud_device_open() uri=%s iomode=%d\n", getpid(), getppid(), getuid(), geteuid(), getgid(), getegid(), uri, iomode);
+
+ if ((index = new_device(uri, iomode, &result)) == 0)
+ {
+ stat = result;
+ goto bugout;
+ }
+ else
+ {
+ if ((stat = (msp->device[index].vf.open)(&msp->device[index])) != HPMUD_R_OK)
+ {
+ (msp->device[index].vf.close)(&msp->device[index]); /* Open failed perform device cleanup. */
+ del_device(index);
+ goto bugout;
+ }
+ }
+
+ *dd = index;
+ stat = HPMUD_R_OK;
+
+bugout:
+ return stat;
+}
+
+enum HPMUD_RESULT hpmud_close_device(HPMUD_DEVICE dd)
+{
+ enum HPMUD_RESULT stat;
+
+ DBG("[%d] hpmud_device_close() dd=%d\n", getpid(), dd);
+
+ if (dd <= 0 || dd > HPMUD_DEVICE_MAX || msp->device[dd].index != dd)
+ {
+ BUG("invalid device_close state\n");
+ stat = HPMUD_R_INVALID_STATE;
+ }
+ else
+ {
+ stat = (msp->device[dd].vf.close)(&msp->device[dd]);
+ del_device(dd);
+ }
+ return stat;
+}
+
+enum HPMUD_RESULT hpmud_get_device_id(HPMUD_DEVICE dd, char *buf, int size, int *bytes_read)
+{
+ enum HPMUD_RESULT stat = HPMUD_R_INVALID_STATE;
+
+ DBG("[%d] hpmud_get_device_id() dd=%d\n", getpid(), dd);
+
+ if (dd <= 0 || dd > HPMUD_DEVICE_MAX || msp->device[dd].index != dd)
+ {
+ BUG("invalid get_device_id state\n");
+ goto bugout;
+ }
+
+ stat = (msp->device[dd].vf.get_device_id)(&msp->device[dd], buf, size, bytes_read);
+
+bugout:
+ return stat;
+}
+
+enum HPMUD_RESULT hpmud_get_device_status(HPMUD_DEVICE dd, unsigned int *status)
+{
+ enum HPMUD_RESULT stat = HPMUD_R_INVALID_STATE;
+
+ DBG("[%d] hpmud_get_device_status() dd=%d\n", getpid(), dd);
+
+ if (dd <= 0 || dd > HPMUD_DEVICE_MAX || msp->device[dd].index != dd)
+ {
+ BUG("invalid get_device_status state\n");
+ goto bugout;
+ }
+
+ stat = (msp->device[dd].vf.get_device_status)(&msp->device[dd], status);
+
+bugout:
+ return stat;
+}
+
+enum HPMUD_RESULT hpmud_probe_devices(enum HPMUD_BUS_ID bus, char *buf, int buf_size, int *cnt, int *bytes_read)
+{
+ int len=0;
+
+ DBG("[%d] hpmud_probe_devices() bus=%d\n", getpid(), bus);
+
+ buf[0] = 0;
+ *cnt = 0;
+
+ if (bus == HPMUD_BUS_USB)
+ {
+ len = musb_probe_devices(buf, buf_size, cnt);
+ }
+#ifdef HAVE_PPORT
+ else if (bus == HPMUD_BUS_PARALLEL)
+ {
+ len = pp_probe_devices(buf, buf_size, cnt);
+ }
+#endif
+ else if (bus == HPMUD_BUS_ALL)
+ {
+ len = musb_probe_devices(buf, buf_size, cnt);
+#ifdef HAVE_PPORT
+ len += pp_probe_devices(buf+len, buf_size-len, cnt);
+#endif
+ }
+
+ *bytes_read = len;
+
+ return HPMUD_R_OK;
+}
+
+enum HPMUD_RESULT hpmud_open_channel(HPMUD_DEVICE dd, const char *channel_name, HPMUD_CHANNEL *cd)
+{
+ enum HPMUD_RESULT stat = HPMUD_R_INVALID_STATE;
+
+ DBG("[%d] hpmud_channel_open() dd=%d name=%s\n", getpid(), dd, channel_name);
+
+ if (dd <= 0 || dd > HPMUD_DEVICE_MAX || msp->device[dd].index != dd)
+ {
+ BUG("invalid channel_open state\n");
+ goto bugout;
+ }
+
+ stat = (msp->device[dd].vf.channel_open)(&msp->device[dd], channel_name, cd);
+
+bugout:
+ return stat;
+}
+
+enum HPMUD_RESULT hpmud_close_channel(HPMUD_DEVICE dd, HPMUD_CHANNEL cd)
+{
+ enum HPMUD_RESULT stat = HPMUD_R_INVALID_STATE;
+
+ DBG("[%d] hpmud_channel_close() dd=%d cd=%d\n", getpid(), dd, cd);
+
+ if (dd <= 0 || dd > HPMUD_DEVICE_MAX || msp->device[dd].index != dd ||
+ cd <=0 || cd > HPMUD_CHANNEL_MAX || msp->device[dd].channel[cd].client_cnt == 0)
+ {
+ BUG("invalid channel_close state\n");
+ goto bugout;
+ }
+
+ stat = (msp->device[dd].vf.channel_close)(&msp->device[dd], &msp->device[dd].channel[cd]);
+
+bugout:
+ return stat;
+}
+
+enum HPMUD_RESULT hpmud_write_channel(HPMUD_DEVICE dd, HPMUD_CHANNEL cd, const void *buf, int size, int sec_timeout, int *bytes_wrote)
+{
+ enum HPMUD_RESULT stat = HPMUD_R_INVALID_STATE;
+
+ DBG("[%d] hpmud_channel_write() dd=%d cd=%d buf=%p size=%d sectime=%d\n", getpid(), dd, cd, buf, size, sec_timeout);
+
+ if (dd <= 0 || dd > HPMUD_DEVICE_MAX || msp->device[dd].index != dd ||
+ cd <=0 || cd > HPMUD_CHANNEL_MAX || msp->device[dd].channel[cd].client_cnt == 0)
+ {
+ BUG("invalid channel_write state\n");
+ goto bugout;
+ }
+
+ stat = (msp->device[dd].vf.channel_write)(&msp->device[dd], &msp->device[dd].channel[cd], buf, size, sec_timeout, bytes_wrote);
+
+bugout:
+ return stat;
+}
+
+enum HPMUD_RESULT hpmud_read_channel(HPMUD_DEVICE dd, HPMUD_CHANNEL cd, void *buf, int size, int sec_timeout, int *bytes_read)
+{
+ enum HPMUD_RESULT stat = HPMUD_R_INVALID_STATE;
+ DBG("[%d] hpmud_channel_read() dd=%d cd=%d buf=%p size=%d sectime=%d\n", getpid(), dd, cd, buf, size, sec_timeout);
+
+ if (dd <= 0 || dd > HPMUD_DEVICE_MAX || msp->device[dd].index != dd ||
+ cd <=0 || cd > HPMUD_CHANNEL_MAX || msp->device[dd].channel[cd].client_cnt == 0)
+ {
+ BUG("invalid channel_read state\n");
+ goto bugout;
+ }
+
+ stat = (msp->device[dd].vf.channel_read)(&msp->device[dd], &msp->device[dd].channel[cd], buf, size, sec_timeout, bytes_read);
+
+bugout:
+ return stat;
+}
+
+enum HPMUD_RESULT hpmud_get_dstat(HPMUD_DEVICE dd, struct hpmud_dstat *ds)
+{
+ enum HPMUD_RESULT stat = HPMUD_R_INVALID_STATE;
+
+ DBG("[%d] hpmud_dstat() dd=%d ds=%p\n", getpid(), dd, ds);
+
+ if (dd <= 0 || dd > HPMUD_DEVICE_MAX)
+ {
+ BUG("invalid dstat state\n");
+ goto bugout;
+ }
+
+ strncpy(ds->uri, msp->device[dd].uri, sizeof(ds->uri));
+ ds->io_mode = msp->device[dd].io_mode;
+ ds->channel_cnt = msp->device[dd].channel_cnt;
+ ds->mlc_up = msp->device[dd].mlc_up;
+
+ stat = HPMUD_R_OK;
+
+bugout:
+ return stat;
+}
+
diff --git a/io/hpmud/hpmud.h b/io/hpmud/hpmud.h
new file mode 100644
index 0000000..3970d28
--- /dev/null
+++ b/io/hpmud/hpmud.h
@@ -0,0 +1,581 @@
+/*****************************************************************************\
+
+ hpmud.h - public definitions for multi-point transport driver
+
+ (c) 2004-2015 Copyright Hewlett-Packard Development Company, LP
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+ of the Software, and to permit persons to whom the Software is furnished to do
+ so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+ Author: Naga Samrat Chowdary Narla, Yashwant Sahu, Sarbeswar Meher
+\*****************************************************************************/
+
+#ifndef _HPMUD_H
+#define _HPMUD_H
+
+enum HPMUD_RESULT
+{
+ HPMUD_R_OK = 0,
+ HPMUD_R_INVALID_DEVICE = 2,
+ HPMUD_R_INVALID_DESCRIPTOR = 3,
+ HPMUD_R_INVALID_URI = 4,
+ HPMUD_R_INVALID_LENGTH = 8,
+ HPMUD_R_IO_ERROR = 12,
+ HPMUD_R_DEVICE_BUSY = 21,
+ HPMUD_R_INVALID_SN = 28,
+ HPMUD_R_INVALID_CHANNEL_ID = 30,
+ HPMUD_R_INVALID_STATE = 31,
+ HPMUD_R_INVALID_DEVICE_OPEN = 37,
+ HPMUD_R_INVALID_DEVICE_NODE = 38,
+ HPMUD_R_INVALID_IP = 45,
+ HPMUD_R_INVALID_IP_PORT = 46,
+ HPMUD_R_INVALID_TIMEOUT = 47,
+ HPMUD_R_DATFILE_ERROR = 48,
+ HPMUD_R_IO_TIMEOUT = 49,
+ HPMUD_R_INVALID_MDNS = 50,
+};
+
+enum HPMUD_IO_MODE
+{
+ HPMUD_UNI_MODE=0, /* uni-di */
+ HPMUD_RAW_MODE=1, /* bi-di */
+ HPMUD_DOT4_MODE=3,
+ HPMUD_DOT4_PHOENIX_MODE=4, /* (ie: clj2550, clj2840, lj3050, lj3055, clj4730mfp) */
+ HPMUD_DOT4_BRIDGE_MODE=5, /* (ie: clj2500) not USB compatable, use HPMUD_RAW_MODE, tested on F10 12/10/08 DES */
+ HPMUD_MLC_GUSHER_MODE=6, /* most new devices */
+ HPMUD_MLC_MISER_MODE=7, /* old stuff */
+};
+
+enum HPMUD_BUS_ID
+{
+ HPMUD_BUS_NA=0,
+ HPMUD_BUS_USB=1,
+ HPMUD_BUS_PARALLEL,
+ HPMUD_BUS_ALL
+};
+
+enum HPMUD_SCANTYPE
+{
+ HPMUD_SCANTYPE_NA = 0,
+ HPMUD_SCANTYPE_SCL = 1,
+ HPMUD_SCANTYPE_PML = 2,
+ HPMUD_SCANTYPE_SOAP = 3, /* Wookie (ie:ljcm1017) */
+ HPMUD_SCANTYPE_MARVELL = 4, /* (ie: ljm1005) */
+ HPMUD_SCANTYPE_SOAPHT = 5, /* HorseThief (ie: ljm1522) */
+ HPMUD_SCANTYPE_SCL_DUPLEX = 6,
+ HPMUD_SCANTYPE_LEDM = 7,
+ HPMUD_SCANTYPE_MARVELL2 = 8, /* (Tsunami lj 1212 and series) */
+};
+
+enum HPMUD_SCANSRC
+{
+ HPMUD_SCANSRC_NA = 0,
+ HPMUD_SCANSRC_FLATBED = 0x1,
+ HPMUD_SCANSRC_ADF= 0x2,
+ HPMUD_SCANSRC_CAMERA = 0x4,
+};
+
+enum HPMUD_STATUSTYPE
+{
+ HPMUD_STATUSTYPE_NA = 0,
+ HPMUD_STATUSTYPE_VSTATUS = 1, /* device-id vstatus */
+ HPMUD_STATUSTYPE_SFIELD = 2, /* device-id s-field */
+ HPMUD_STATUSTYPE_PML = 3, /* laserjet pml */
+ HPMUD_STATUSTYPE_EWS = 6, /* laserjet hp ews */
+ HPMUD_STATUSTYPE_PJL = 8, /* laserjet pjl */
+ HPMUD_STATUSTYPE_PJLPML = 9, /* laserjet pjl and pml */
+};
+
+enum HPMUD_SUPPORT_TYPE
+{
+ HPMUD_SUPPORT_TYPE_NONE = 0, /* not supported */
+ HPMUD_SUPPORT_TYPE_HPIJS = 1, /* supported by hpijs only */
+ HPMUD_SUPPORT_TYPE_HPLIP = 2, /* supported by hpijs and "hp" backend */
+};
+
+enum HPMUD_PLUGIN_TYPE
+{
+ HPMUD_PLUGIN_TYPE_NONE = 0,
+ HPMUD_PLUGIN_TYPE_REQUIRED = 1,
+ HPMUD_PLUGIN_TYPE_OPTIONAL = 2,
+};
+
+#define HPMUD_S_PRINT_CHANNEL "PRINT"
+#define HPMUD_S_PML_CHANNEL "HP-MESSAGE"
+#define HPMUD_S_SCAN_CHANNEL "HP-SCAN"
+#define HPMUD_S_FAX_SEND_CHANNEL "HP-FAX-SEND"
+#define HPMUD_S_CONFIG_UPLOAD_CHANNEL "HP-CONFIGURATION-UPLOAD"
+#define HPMUD_S_CONFIG_DOWNLOAD_CHANNEL "HP-CONFIGURATION-DOWNLOAD"
+#define HPMUD_S_MEMORY_CARD_CHANNEL "HP-CARD-ACCESS"
+#define HPMUD_S_EWS_CHANNEL "HP-EWS"
+#define HPMUD_S_EWS_LEDM_CHANNEL "HP-EWS-LEDM"
+#define HPMUD_S_SOAP_SCAN "HP-SOAP-SCAN"
+#define HPMUD_S_SOAP_FAX "HP-SOAP-FAX"
+#define HPMUD_S_DEVMGMT_CHANNEL "HP-DEVMGMT"
+#define HPMUD_S_MARVELL_SCAN_CHANNEL "HP-MARVELL-SCAN"
+#define HPMUD_S_MARVELL_FAX_CHANNEL "HP-MARVELL-FAX"
+#define HPMUD_S_LEDM_SCAN "HP-LEDM-SCAN"
+#define HPMUD_S_WIFI_CHANNEL "HP-WIFICONFIG"
+
+typedef int HPMUD_DEVICE; /* usb, parallel or jetdirect */
+#define HPMUD_DEVICE_MAX 2 /* zero is not used */
+
+typedef int HPMUD_CHANNEL;
+#define HPMUD_CHANNEL_MAX HPMUD_MAX_CHANNEL_ID
+
+#define HPMUD_LINE_SIZE 256 /* Length of a line. */
+#define HPMUD_BUFFER_SIZE 16384 /* General Read/Write buffer. */
+
+struct hpmud_dstat
+{
+ char uri[HPMUD_LINE_SIZE];
+ int client_cnt; /* number of clients that have this device opend */
+ enum HPMUD_IO_MODE io_mode;
+ int channel_cnt; /* number of open channels */
+ int mlc_up; /* 0 = MLC/1284.4 transport up, 1 = MLD/1284.4 transport down */
+};
+
+struct hpmud_model_attributes
+{
+ enum HPMUD_IO_MODE prt_mode; /* print only (io_mode) */
+ enum HPMUD_IO_MODE mfp_mode; /* pml | scan | fax (io_mode) */
+ enum HPMUD_SCANTYPE scantype; /* scan protocol i.e. SCL, PML, SOAP, MARVELL, LEDM */
+ enum HPMUD_STATUSTYPE statustype;
+ enum HPMUD_SUPPORT_TYPE support;
+ enum HPMUD_PLUGIN_TYPE plugin;
+ enum HPMUD_SUPPORT_TYPE reserved[5];
+ enum HPMUD_SCANSRC scansrc; /*Flatbed, ADF, Camera or combination of these*/
+};
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * hpmud_device_open - open specified device, call normally does not block
+ *
+ * inputs:
+ * uri - specifies device to open
+ * io_mode - see enum definition
+ *
+ * outputs:
+ * dd - device descriptor
+ * return value - see enum definition
+ */
+enum HPMUD_RESULT hpmud_open_device(const char *uri, enum HPMUD_IO_MODE io_mode, HPMUD_DEVICE *dd);
+
+/*
+ * hpmud_device_close - close specified device, call does not block
+ *
+ * inputs:
+ * dd - device descriptor
+ *
+ * outputs:
+ * return value - see enum definition
+ */
+enum HPMUD_RESULT hpmud_close_device(HPMUD_DEVICE dd);
+
+/*
+ * hpmud_get_device_id - read IEEE 1284 device ID string, call normally does not block
+ *
+ * If the device is busy, a cached copy may be returned.
+ *
+ * inputs:
+ * dd - device descriptor
+ * buf_size - maximum size of buf
+ *
+ * outputs:
+ * buf - zero terminated device ID string
+ * bytes_read - size of device ID string, does not include zero termination
+ * return value - see enum definition
+ */
+enum HPMUD_RESULT hpmud_get_device_id(HPMUD_DEVICE dd, char *buf, int buf_size, int *bytes_read);
+
+/*
+ * hpmud_get_device_status - read 8-bit device status, call normally does not block
+ *
+ * inputs:
+ * dd - device descriptor
+ *
+ * outputs:
+ * status - 3-bit status, supported by inkjets only
+ * return value - see enum definition
+ */
+enum HPMUD_RESULT hpmud_get_device_status(HPMUD_DEVICE dd, unsigned int *status);
+
+/*
+ * hpmud_probe_devices - probe local buses for HP supported devices, call normally does not block
+ *
+ * inputs:
+ * bus - see enum definiton
+ * buf_size - size of read buffer
+ *
+ * outputs:
+ * buf - zero terminated CUPS backend formatted data
+ * cnt - number of HP devices found
+ * bytes_read - number of bytes actually read
+ * return value - see enum definition
+ */
+enum HPMUD_RESULT hpmud_probe_devices(enum HPMUD_BUS_ID bus, char *buf, int buf_size, int *cnt, int *bytes_read);
+
+/*
+ * hpmud_channel_open - open specified channel, call will block
+ *
+ * Only EWS channel can be opened by more than one process.
+ *
+ * inputs:
+ * dd - device descriptor
+ * channel_name - requested service name
+ *
+ * outputs:
+ * cd - channel descriptor
+ * return value - see enum definition
+ */
+enum HPMUD_RESULT hpmud_open_channel(HPMUD_DEVICE dd, const char *channel_name, HPMUD_CHANNEL *cd);
+
+/*
+ * hpmud_channel_close - close specified channel, call will block
+ *
+ * inputs:
+ * dd - device descriptor
+ * cd - channel descriptor
+ *
+ * outputs:
+ * return value - see enum definition
+ */
+enum HPMUD_RESULT hpmud_close_channel(HPMUD_DEVICE dd, HPMUD_CHANNEL cd);
+
+/*
+ * hpmud_channel_write - write data to specified channel, call will block
+ *
+ * May return with partial bytes written (ie: bytes_wrote < size) with or with-out a timeout.
+ *
+ * inputs:
+ * dd - device descriptor
+ * cd - channel descriptor
+ * buf - data to write
+ * size - number of bytes to write
+ * timeout - in seconds
+ *
+ * outputs:
+ * bytes_wrote - number of bytes actually wrote
+ * return value - see enum definition
+ */
+enum HPMUD_RESULT hpmud_write_channel(HPMUD_DEVICE dd, HPMUD_CHANNEL cd, const void *buf, int size, int timeout, int *bytes_written);
+
+/*
+ * hpmud_channel_read - read data from specified channel, call will block
+ *
+ * May return with partial bytes read (ie: bytes_read < size) or zero if timeout occured.
+ *
+ * inputs:
+ * dd - device descriptor
+ * cd - channel descriptor
+ * size - number of bytes to read
+ * timeout - in seconds
+ *
+ * outputs:
+ * buf - read data buffer
+ * bytes_read - number of bytes actually read
+ * return value - see enum definition
+ */
+enum HPMUD_RESULT hpmud_read_channel(HPMUD_DEVICE dd, HPMUD_CHANNEL cd, void *buf, int size, int timeout, int *bytes_read);
+
+/*
+ * hpmud_dstat - get device information
+ *
+ * inputs:
+ * dd - device descriptor
+ *
+ * outputs:
+ * ds - see dstat definition
+ * return value - see enum definition
+ */
+enum HPMUD_RESULT hpmud_get_dstat(HPMUD_DEVICE dd, struct hpmud_dstat *ds);
+
+/*
+ * hpmud_set_pml - set pml object
+ *
+ * Set_pml is a high level interface to hpmud. This command calls the hpmud core interface.
+ * This command can be used with local or jetdirect connections. Jetdirect connection will
+ * use snmp.
+ *
+ * inputs:
+ * dd - device descriptor
+ * cc - channel descriptor
+ * snmp_oid - snmp encoded pml oid
+ * type - oid data type
+ * data - data payload
+ * data_size - number of bytes to write
+ *
+ * outputs:
+ * pml_result
+ * return value - see enum definition
+ */
+enum HPMUD_RESULT hpmud_set_pml(HPMUD_DEVICE device, HPMUD_CHANNEL channel, const char *snmp_oid, int type, void *data, int data_size, int *pml_result);
+
+/*
+ * hpmud_get_pml - get pml object
+ *
+ * Get_pml is a high level interface to hpmud. This command calls the hpmud core interface.
+ * This command can be used with local or jetdirect connections. Jetdirect connection will
+ * use snmp.
+ *
+ * inputs:
+ * dd - device descriptor
+ * cc - channel descriptor
+ * snmp_oid - snmp encoded pml oid
+ * data_size - data buffer size in bytes
+ *
+ * outputs:
+ * data - data payload
+ * type - pml data type
+ * pml_result
+ * return value - see enum definition
+ */
+enum HPMUD_RESULT hpmud_get_pml(HPMUD_DEVICE device, HPMUD_CHANNEL channel, const char *snmp_oid, void *buf, int buf_size, int *bytes_read, int *type, int *pml_result);
+
+/*
+ * hpmud_get_model - parse device model from the IEEE 1284 device id string.
+ *
+ * This function is a stateless hpmud helper function.
+ *
+ * inputs:
+ * id - IEEE 1284 device id string
+ * buf_size - size of buf in bytes
+ *
+ * outputs:
+ * buf - device model string (generalized)
+ * return value - length of string in bytes, does not include zero termination
+ */
+int hpmud_get_model(const char *id, char *buf, int buf_size);
+
+/*
+ * hpmud_get_raw_model - parse device model from the IEEE 1284 device id string.
+ *
+ * This function is a stateless hpmud helper function.
+ *
+ * inputs:
+ * id - IEEE 1284 device id string
+ * buf_size - size of buf in bytes
+ *
+ * outputs:
+ * buf - device model string (raw)
+ * return value - length of string in bytes, does not include zero termination
+ */
+int hpmud_get_raw_model(char *id, char *raw, int rawSize);
+
+/*
+ * hpmud_get_uri_model - parse device model from uri
+ *
+ * This function is a stateless hpmud helper function.
+ *
+ * inputs:
+ * uri
+ * buf_size - size of buf in bytes
+ *
+ * outputs:
+ * buf - device model string
+ * return value - length of string in bytes, does not include zero termination
+ */
+int hpmud_get_uri_model(const char *uri, char *buf, int buf_size);
+
+/*
+ * hpmud_get_uri_datalink - parse the data link from uri
+ *
+ * This function is a stateless hpmud helper function.
+ *
+ * inputs:
+ * uri
+ * buf_size - size of buf in bytes
+ *
+ * outputs:
+ * buf - device model string
+ * return value - length of string in bytes, does not include zero termination
+ */
+int hpmud_get_uri_datalink(const char *uri, char *buf, int buf_size);
+
+/*
+ * hpmud_get_model_attributes - get all model attributes for specified device
+ *
+ * Reads device model attributes from models.dat file. This function is a
+ * stateless hpmud helper function.
+ *
+ * inputs:
+ * uri - specifies device
+ * buf_size - size of buf in bytes
+ *
+ * outputs:
+ * buf - buffer for all model attributes, key/value pair, one per line
+ * bytes_read - number of bytes actually read
+ * return value - see enum definition
+ */
+enum HPMUD_RESULT hpmud_get_model_attributes(char *uri, char *attr, int attrSize, int *bytes_read);
+
+/*
+ * hpmud_model_query - get model attributes structure for specified device
+ *
+ * Reads device model attributes from models.dat file. This function is a
+ * stateless hpmud helper function.
+ *
+ * inputs:
+ * uri - specifies device
+ *
+ * outputs:
+ * ma - see structure definition
+ * return value - see enum definition
+ */
+enum HPMUD_RESULT hpmud_query_model(char *uri, struct hpmud_model_attributes *ma);
+
+/*
+ * hpmud_make_usb_uri - make a usb uri from bus:dev pair
+ *
+ * This function is a stateless hpmud helper function. The lsusb command can be used
+ * determine the bus:dev pair.
+ *
+ * inputs:
+ * busnum - specifies usbfs bus number
+ * devnum - specifies usbfs device number
+ * uri_size - size of uri buffer in bytes
+ *
+ * outputs:
+ * uri - zero terminated string
+ * bytes_read - size of uri
+ * return value - see enum definition
+ */
+enum HPMUD_RESULT hpmud_make_usb_uri(const char *busnum, const char *devnum, char *uri, int uri_size, int *bytes_read);
+
+/*
+ * hpmud_make_usb_serial_uri - make a usb uri from product serial number
+ *
+ * This function is a stateless hpmud helper function. The lsusb command can be used
+ * determine the product serial number.
+ *
+ * inputs:
+ * sn - specifies product serial number
+ * uri_size - size of uri buffer in bytes
+ *
+ * outputs:
+ * uri - zero terminated string
+ * bytes_read - size of uri
+ * return value - see enum definition
+ */
+enum HPMUD_RESULT hpmud_make_usb_serial_uri(const char *sn, char *uri, int uri_size, int *bytes_read);
+
+/*
+ * hpmud_make_net_uri - make a net uri from IP
+ *
+ * This function is a stateless hpmud helper function.
+ *
+ * inputs:
+ * ip - internet address
+ * port - 1-4
+ * uri_size - size of uri buffer in bytes
+ *
+ * outputs:
+ * uri - zero terminated string
+ * bytes_read - size of uri
+ * return value - see enum definition
+ */
+enum HPMUD_RESULT hpmud_make_net_uri(const char *ip, int port, char *uri, int uri_size, int *bytes_read);
+
+/*
+ * hpmud_make_par_uri - make a par uri from parallel port
+ *
+ * This function is a stateless hpmud helper function.
+ *
+ * inputs:
+ * dnode - device node
+ * uri_size - size of uri buffer in bytes
+ *
+ * outputs:
+ * uri - zero terminated string
+ * bytes_read - size of uri
+ * return value - see enum definition
+ */
+enum HPMUD_RESULT hpmud_make_par_uri(const char *dnode, char *uri, int uri_size, int *bytes_read);
+
+/*
+ * hpmud_get_conf - get key value from hplip.conf
+ *
+ * This function is a stateless hpmud helper function.
+ *
+ * inputs:
+ * section - zero terminated string (ie: "[dirs]")
+ * key - zero terminated string (ie: "home")
+ * value_size - size of value buffer in bytes
+ *
+ * outputs:
+ * value - zero terminated string
+ * return value - see enum definition
+ */
+enum HPMUD_RESULT hpmud_get_conf(const char *section, const char *key, char *value, int value_size);
+
+/*
+ * hpmud_get_key_value - get key value from specified file
+ *
+ * This function is a stateless hpmud helper function.
+ *
+ * inputs:
+ * file - zero terminated file path
+ * section - zero terminated string (ie: "[dirs]")
+ * key - zero terminated string (ie: "home")
+ * value_size - size of value buffer in bytes
+ *
+ * outputs:
+ * value - zero terminated string
+ * return value - see enum definition
+ */
+enum HPMUD_RESULT hpmud_get_key_value(const char *file, const char *section, const char *key, char *value, int value_size);
+
+/*
+ * hpmud_mdns_lookup - lookup IP for MDNS host name
+ *
+ * This function is a stateless hpmud helper function.
+ *
+ * inputs:
+ * host_name - zero terminated string (ie: "npi7c8a3e")
+ * sec_timeout - in seconds
+ *
+ * outputs:
+ * ip - zero terminated string
+ * return value - see enum definition
+ */
+enum HPMUD_RESULT hpmud_mdns_lookup(const char *host_name, int sec_timeout, char *ip);
+
+/*
+ * hpmud_make_mdns_uri - make a network uri from host name
+ *
+ * This function is a stateless hpmud helper function. Requires UDP port 5353 to be open.
+ *
+ * inputs:
+ * host - zero terminated string (ie: "npi7c8a3e")
+ * uri_size - size of uri buffer in bytes
+ *
+ * outputs:
+ * uri - zero terminated string
+ * bytes_read - size of uri
+ * return value - see enum definition
+ */
+enum HPMUD_RESULT hpmud_make_mdns_uri(const char *host, int port, char *uri, int uri_size, int *bytes_read);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // _HPMUD_H
+
diff --git a/io/hpmud/hpmudi.h b/io/hpmud/hpmudi.h
new file mode 100644
index 0000000..269cb06
--- /dev/null
+++ b/io/hpmud/hpmudi.h
@@ -0,0 +1,212 @@
+/*****************************************************************************\
+
+ hpmudi.h - internal definitions for multi-point transport driver
+
+ (c) 2004-2007 Copyright Hewlett-Packard Development Company, LP
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+ of the Software, and to permit persons to whom the Software is furnished to do
+ so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+ Author: Naga Samrat Chowdary Narla,
+\*****************************************************************************/
+
+#ifndef _HPMUDI_H
+#define _HPMUDI_H
+
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE
+#endif
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/mman.h>
+#include <sys/time.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <string.h>
+#include <stdio.h>
+#include <syslog.h>
+#include <time.h>
+#include <ctype.h>
+#include <pthread.h>
+#include <arpa/inet.h>
+#include "hpmud.h"
+#include "musb.h"
+#include "mlc.h"
+#include "dot4.h"
+#include "pml.h"
+#ifdef HAVE_LIBNETSNMP
+#include "jd.h"
+#endif
+#ifdef HAVE_PPORT
+#include "pp.h"
+#endif
+
+// Don DO NOT commit with HPMUD_DEBUG enabled :(
+//#define HPMUD_DEBUG
+
+#define _STRINGIZE(x) #x
+#define STRINGIZE(x) _STRINGIZE(x)
+
+#define BUG(args...) syslog(LOG_ERR, __FILE__ " " STRINGIZE(__LINE__) ": " args)
+//#define BUG(args...) fprintf(stderr, __FILE__ " " STRINGIZE(__LINE__) ": " args)
+
+#ifdef HPMUD_DEBUG
+ #define DBG(args...) syslog(LOG_INFO, __FILE__ " " STRINGIZE(__LINE__) ": " args)
+// #define DBG(args...) fprintf(stderr, __FILE__ " " STRINGIZE(__LINE__) ": " args)
+ #define DBG_DUMP(data, size) sysdump((data), (size))
+ #define DBG_SZ(args...) syslog(LOG_INFO, args)
+#else
+ #define DBG(args...)
+ #define DBG_DUMP(data, size)
+ #define DBG_SZ(args...)
+#endif
+
+#define HEX2INT(x, i) if (x >= '0' && x <= '9') i |= x - '0'; \
+ else if (x >= 'A' && x <= 'F') i |= 0xA + x - 'A'; \
+ else if (x >= 'a' && x <= 'f') i |= 0xA + x - 'a'
+
+/* offset_of returns the number of bytes that the fieldname MEMBER is offset from the beginning of the structure TYPE */
+#define offset_of(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
+
+#define HPMUD_EXCEPTION_TIMEOUT 45000000 /* microseconds */
+#define HPMUD_EXCEPTION_SEC_TIMEOUT 45 /* seconds */
+#define HPMUD_MDNS_TIMEOUT 10 /* seconds */
+
+#define NFAULT_BIT 0x08
+#define PERROR_BIT 0x20
+
+enum HPMUD_CHANNEL_ID
+{
+ HPMUD_PML_CHANNEL = 1,
+ HPMUD_PRINT_CHANNEL = 2,
+ HPMUD_SCAN_CHANNEL = 4,
+ HPMUD_FAX_SEND_CHANNEL = 7,
+ HPMUD_CONFIG_UPLOAD_CHANNEL = 0xe,
+ HPMUD_CONFIG_DOWNLOAD_CHANNEL = 0xf,
+ HPMUD_MEMORY_CARD_CHANNEL = 0x11,
+ HPMUD_EWS_CHANNEL = 0x12, /* Embeded Web Server interface ff/1/1, any unused socket id */
+ HPMUD_SOAPSCAN_CHANNEL = 0x13, /* Soap Scan interface ff/2/1, any unused socket id */
+ HPMUD_SOAPFAX_CHANNEL = 0x14, /* Soap Fax interface ff/3/1, any unused socket id */
+ HPMUD_MARVELL_SCAN_CHANNEL = 0x15, /* Marvell scan interface ff/ff/ff, any unused socket id */
+ HPMUD_MARVELL_FAX_CHANNEL = 0x16, /* Marvell fax interface ff/ff/ff, any unused socket id */
+ HPMUD_EWS_LEDM_CHANNEL = 0x17, /* Embeded Web Server interface ff/4/1, any unused socket id */
+ HPMUD_LEDM_SCAN_CHANNEL = 0x18, /* LEDM scan interface ff/cc/0, any unused socket id */
+ HPMUD_WIFI_CHANNEL = 0x2b, /* WIFI config */
+ HPMUD_DEVMGMT_CHANNEL = 0x2c, /* decimal 44 */
+ HPMUD_MAX_CHANNEL_ID
+};
+
+#define HPMUD_DEVICE_MAX 2 /* zero is not used */
+#define HPMUD_CHANNEL_MAX HPMUD_MAX_CHANNEL_ID
+
+/* MLC/1284.4 attributes. Note for MLC, attributes must remain persistant while transport is up. */
+typedef struct
+{
+ unsigned short h2pcredit; /* host to peripheral credit (dot4: primary socket id credit for sending) */
+ unsigned short p2hcredit; /* peripheral to host credit (dot4: secondary socket id credit for sending) */
+ unsigned short h2psize; /* host to peripheral packet size in bytes (dot4: primary max packet size for sending) */
+ unsigned short p2hsize; /* peripheral to host packet size in bytes (dot4: secondary max packet size for sending) */
+} transport_attributes;
+
+typedef struct _mud_channel_vf
+{
+ enum HPMUD_RESULT (*open)(struct _mud_channel *pc); /* transport specific open */
+ enum HPMUD_RESULT (*close)(struct _mud_channel *pc); /* transport specific close */
+ enum HPMUD_RESULT (*channel_write)(struct _mud_channel *pc, const void *buf, int size, int timeout, int *bytes_wrote); /* tranport specific write */
+ enum HPMUD_RESULT (*channel_read)(struct _mud_channel *pc, void *buf, int size, int timeout, int *bytes_read); /* transport specific read */
+} mud_channel_vf;
+
+typedef struct _mud_device_vf
+{
+ int (*write)(int fd, const void *buf, int size, int usec_timeout); /* low level device write */
+ int (*read)(int fd, void *buf, int size, int usec_timout); /* low level device read */
+ enum HPMUD_RESULT (*open)(struct _mud_device *pd); /* device specific open */
+ enum HPMUD_RESULT (*close)(struct _mud_device *pd); /* device specific close */
+ enum HPMUD_RESULT (*get_device_id)(struct _mud_device *pd, char *id, int size, int *bytes_read); /* IEEE 1284 device id string */
+ enum HPMUD_RESULT (*get_device_status)(struct _mud_device *pd, unsigned int *status); /* device 8-bit status */
+ enum HPMUD_RESULT (*channel_open)(struct _mud_device *pd, const char *channel_name, HPMUD_CHANNEL *cd); /* channel specific open */
+ enum HPMUD_RESULT (*channel_close)(struct _mud_device *pd, struct _mud_channel *pc); /* channel specific close */
+ enum HPMUD_RESULT (*channel_write)(struct _mud_device *pd, struct _mud_channel *pc, const void *buf, int size, int sec_timeout, int *bytes_wrote);
+ enum HPMUD_RESULT (*channel_read)(struct _mud_device *pd, struct _mud_channel *pc, void *buf, int size, int sec_timeout, int *bytes_read);
+} mud_device_vf;
+
+typedef struct _mud_channel
+{
+ char sn[HPMUD_LINE_SIZE]; /* service name */
+ unsigned char sockid; /* socket id */
+ int client_cnt; /* number of clients using this channel */
+ int index; /* channel[index] of this object */
+ int fd; /* file descriptor for this channel */
+ pid_t pid; /* process owner */
+ int dindex; /* device[dindex] parent device */
+
+ /* MLC/1284.4 specific variables. */
+ transport_attributes ta;
+ unsigned char rbuf[HPMUD_BUFFER_SIZE]; /* read packet buffer */
+ int rindex;
+ int rcnt;
+
+ /* JetDirect specific data. */
+ int socket;
+
+ mud_channel_vf vf;
+} mud_channel;
+
+typedef struct _mud_device
+{
+ char uri[HPMUD_LINE_SIZE];
+ char id[1024]; /* device id */
+ int index; /* device[index] of this object */
+ enum HPMUD_IO_MODE io_mode;
+ mud_channel channel[HPMUD_CHANNEL_MAX];
+ int channel_cnt; /* number of open channels */
+ int open_fd; /* file descriptor used by device_open */
+
+ /* MLC/1284.4 specific variables. */
+ int mlc_up; /* 0=transport down, 1=transport up */
+ int mlc_fd; /* file descriptor used by 1284.4/MLC transport */
+
+ /* JetDirect specific data. */
+ char ip[HPMUD_LINE_SIZE]; /* internet address */
+ int port;
+
+ mud_device_vf vf; /* virtual function table */
+ pthread_mutex_t mutex;
+} mud_device;
+
+typedef struct
+{
+ mud_device device[HPMUD_DEVICE_MAX];
+ pthread_mutex_t mutex;
+} mud_session;
+
+extern mud_session *msp __attribute__ ((visibility ("hidden")));
+
+void __attribute__ ((visibility ("hidden"))) sysdump(const void *data, int size);
+int __attribute__ ((visibility ("hidden"))) mm_device_lock(int fd, HPMUD_DEVICE index);
+int __attribute__ ((visibility ("hidden"))) mm_device_unlock(int fd, HPMUD_DEVICE index);
+int __attribute__ ((visibility ("hidden"))) mm_device_trylock(int fd, HPMUD_DEVICE index);
+int __attribute__ ((visibility ("hidden"))) is_hp(const char *id);
+int __attribute__ ((visibility ("hidden"))) generalize_model(const char *sz, char *buf, int bufSize);
+int __attribute__ ((visibility ("hidden"))) generalize_serial(const char *sz, char *buf, int bufSize);
+int __attribute__ ((visibility ("hidden"))) get_uri_model(const char *uri, char *buf, int bufSize);
+int __attribute__ ((visibility ("hidden"))) get_uri_serial(const char *uri, char *buf, int bufSize);
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) service_to_channel(mud_device *pd, const char *sn, HPMUD_CHANNEL *index);
+
+#endif // _HPMUDI_H
+
diff --git a/io/hpmud/jd.c b/io/hpmud/jd.c
new file mode 100644
index 0000000..1b7a382
--- /dev/null
+++ b/io/hpmud/jd.c
@@ -0,0 +1,906 @@
+/*****************************************************************************\
+
+ jd.c - JetDirect support for multi-point transport driver
+
+ (c) 2004-2007 Copyright Hewlett-Packard Development Company, LP
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+ of the Software, and to permit persons to whom the Software is furnished to do
+ so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ Client/Server generic message format (see messaging-protocol.doc):
+
+ Author: Naga Samrat Chowdary Narla, Sarbeswar Meher
+\*****************************************************************************/
+
+#ifdef HAVE_LIBNETSNMP
+
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE
+#endif
+
+#include <signal.h>
+#include "hpmud.h"
+#include "hpmudi.h"
+
+mud_device_vf __attribute__ ((visibility ("hidden"))) jd_mud_device_vf =
+{
+ .open = jd_open,
+ .close = jd_close,
+ .get_device_id = jd_get_device_id,
+ .get_device_status = jd_get_device_status,
+ .channel_open = jd_channel_open,
+ .channel_close = jd_channel_close,
+ .channel_write = jd_channel_write,
+ .channel_read = jd_channel_read
+};
+
+static mud_channel_vf jd_channel_vf =
+{
+ .open = jd_s_channel_open,
+ .close = jd_s_channel_close,
+ .channel_write = jd_s_channel_write,
+ .channel_read = jd_s_channel_read
+};
+
+static const int PrintPort[] = { 0, 9100, 9101, 9102 };
+static const int ScanPort0[] = { 0, 9290, 9291, 9292 };
+static const int GenericPort[] = { 0, 9220, 9221, 9222 };
+static const int ScanPort1[] = { 0, 8290, 0, 0 }; /* hack for CLJ28xx */
+static const int GenericPort1[] = { 0, 8292, 0, 0 }; /* hack for CLJ28xx (fax) */
+
+const char __attribute__ ((visibility ("hidden"))) *kStatusOID = "1.3.6.1.4.1.11.2.3.9.1.1.7.0"; /* device id snmp oid */
+
+static int ReadReply(mud_channel *pc)
+{
+ char buf[HPMUD_LINE_SIZE];
+ int len=0, num=0;
+ char *tail;
+ enum HPMUD_RESULT stat;
+
+ stat = jd_s_channel_read(pc, buf, sizeof(buf), 2, &len);
+ buf[len] = 0;
+
+ if (stat == HPMUD_R_OK)
+ num = strtol((char *)buf, &tail, 10);
+
+ return num;
+}
+
+static int device_id(const char *ip, int port, char *buffer, int size)
+{
+ int len=0, maxSize, result, dt, status;
+
+ maxSize = (size > 1024) ? 1024 : size; /* RH8 has a size limit for device id */
+
+ if ((len = GetSnmp(ip, port, (char *)kStatusOID, (unsigned char *)buffer, maxSize, &dt, &status, &result)) == 0)
+ BUG("unable to read device-id\n");
+
+ return len; /* length does not include zero termination */
+}
+
+/* Create channel object given the requested socket id and service name. */
+static int new_channel(mud_device *pd, int index, const char *sn)
+{
+ int stat=1;
+
+ /* Check for existing name service already open. */
+ if (pd->channel[index].client_cnt)
+ {
+#if 0
+ if (index == HPMUD_EWS_CHANNEL)
+ {
+ pd->channel[index].client_cnt++; /* allow multiple clients for separate USB interfaces only */
+ stat = 0;
+ DBG("reused %s channel=%d clientCnt=%d channelCnt=%d\n", sn, index, pd->channel[index].client_cnt, pd->channel_cnt);
+ }
+ else
+#endif
+ BUG("%s channel=%d is busy, used by [%d], clientCnt=%d channelCnt=%d\n", sn, index, pd->channel[index].pid, pd->channel[index].client_cnt, pd->channel_cnt);
+ goto bugout;
+ }
+
+ pd->channel[index].vf = jd_channel_vf;
+ pd->channel[index].index = index;
+ pd->channel[index].client_cnt = 1;
+ pd->channel[index].sockid = index;
+ pd->channel[index].pid = getpid();
+ pd->channel[index].dindex = pd->index;
+ pd->channel[index].fd = 0;
+ pd->channel[index].socket = -1;
+ strcpy(pd->channel[index].sn, sn);
+ pd->channel_cnt++;
+
+ stat = 0;
+ DBG("new %s channel=%d clientCnt=%d channelCnt=%d\n", sn, index, pd->channel[index].client_cnt, pd->channel_cnt);
+
+bugout:
+ return stat;
+}
+
+/* Remove channel object given the channel decriptor. */
+static int del_channel(mud_device *pd, mud_channel *pc)
+{
+ pc->client_cnt--;
+
+ if (pc->client_cnt <= 0)
+ {
+ pd->channel_cnt--;
+ }
+ DBG("removed %s channel=%d clientCnt=%d channelCnt=%d\n", pc->sn, pc->index, pc->client_cnt, pd->channel_cnt);
+ return 0;
+}
+
+/*********************************************************************************************************************************
+ * JetDirect mud_device functions.
+ */
+
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) jd_open(mud_device *pd)
+{
+ char uri_model[128];
+ char model[128];
+ char *p, *tail;
+ int len=0;
+ enum HPMUD_RESULT stat = HPMUD_R_IO_ERROR;
+
+ pthread_mutex_lock(&pd->mutex);
+
+ if (pd->id[0] == 0)
+ {
+ /* First client. */
+ hpmud_get_uri_datalink(pd->uri, pd->ip, sizeof(pd->ip));
+
+ if ((p = strcasestr(pd->uri, "port=")) != NULL)
+ pd->port = strtol(p+5, &tail, 10);
+ else
+ pd->port = 1;
+ if (pd->port > 3)
+ {
+ stat = HPMUD_R_INVALID_IP_PORT;
+ BUG("invalid ip port=%d\n", pd->port);
+ goto blackout;
+ }
+
+ len = device_id(pd->ip, pd->port, pd->id, sizeof(pd->id)); /* get new copy and cache it */
+ if (len == 0)
+ {
+ stat = HPMUD_R_IO_ERROR;
+ goto blackout;
+ }
+ }
+
+ /* Make sure uri model matches device id model. */
+ hpmud_get_uri_model(pd->uri, uri_model, sizeof(uri_model));
+ hpmud_get_model(pd->id, model, sizeof(model));
+ if (strcmp(uri_model, model) != 0)
+ {
+ stat = HPMUD_R_INVALID_URI; /* different device plugged in */
+ BUG("invalid uri model %s != %s\n", uri_model, model);
+ goto blackout;
+ }
+
+ stat = HPMUD_R_OK;
+
+blackout:
+ pthread_mutex_unlock(&pd->mutex);
+
+ return stat;
+}
+
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) jd_close(mud_device *pd)
+{
+ enum HPMUD_RESULT stat = HPMUD_R_OK;
+
+ pthread_mutex_lock(&pd->mutex);
+ pd->id[0] = 0;
+ pthread_mutex_unlock(&pd->mutex);
+
+ return stat;
+}
+
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) jd_get_device_id(mud_device *pd, char *buf, int size, int *len)
+{
+ enum HPMUD_RESULT stat = HPMUD_R_IO_ERROR;
+
+ *len=0;
+
+ pthread_mutex_lock(&pd->mutex);
+
+ *len = device_id(pd->ip, pd->port, pd->id, sizeof(pd->id)); /* get new copy and cache it */
+
+ if (*len)
+ {
+ memcpy(buf, pd->id, *len > size ? size : *len);
+ stat = HPMUD_R_OK;
+ }
+
+ pthread_mutex_unlock(&pd->mutex);
+ return stat;
+}
+
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) jd_get_device_status(mud_device *pd, unsigned int *status)
+{
+ *status = NFAULT_BIT; /* there is no 8-bit status, so fake it */
+ return HPMUD_R_OK;
+}
+
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) jd_channel_write(mud_device *pd, mud_channel *pc, const void *buf, int length, int sec_timeout, int *bytes_wrote)
+{
+ enum HPMUD_RESULT stat;
+
+ pthread_mutex_lock(&pd->mutex);
+ stat = (pc->vf.channel_write)(pc, buf, length, sec_timeout, bytes_wrote);
+ pthread_mutex_unlock(&pd->mutex);
+ return stat;
+}
+
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) jd_channel_read(mud_device *pd, mud_channel *pc, void *buf, int length, int sec_timeout, int *bytes_read)
+{
+ enum HPMUD_RESULT stat;
+
+ if (pd->io_mode == HPMUD_UNI_MODE)
+ {
+ stat = HPMUD_R_INVALID_STATE;
+ BUG("invalid channel_read io_mode=%d\n", pd->io_mode);
+ }
+
+ pthread_mutex_lock(&pd->mutex);
+ stat = (pc->vf.channel_read)(pc, buf, length, sec_timeout, bytes_read);
+ pthread_mutex_unlock(&pd->mutex);
+ return stat;
+}
+
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) jd_channel_open(mud_device *pd, const char *sn, HPMUD_CHANNEL *cd)
+{
+ int index;
+ enum HPMUD_RESULT stat;
+
+ /* Check for valid service requests. */
+ if ((stat = service_to_channel(pd, sn, &index)) != HPMUD_R_OK)
+ goto bugout;
+
+ pthread_mutex_lock(&pd->mutex);
+
+ if (new_channel(pd, index, sn))
+ {
+ stat = HPMUD_R_DEVICE_BUSY;
+ }
+ else
+ {
+ if ((stat = (pd->channel[index].vf.open)(&pd->channel[index])) != HPMUD_R_OK) /* call transport specific open */
+ del_channel(pd, &pd->channel[index]); /* open failed, cleanup */
+ else
+ *cd = index;
+ }
+
+ pthread_mutex_unlock(&pd->mutex);
+
+bugout:
+ return stat;
+}
+
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) jd_channel_close(mud_device *pd, mud_channel *pc)
+{
+ enum HPMUD_RESULT stat = HPMUD_R_OK;
+
+ pthread_mutex_lock(&pd->mutex);
+ stat = (pc->vf.close)(pc); /* call trasport specific close */
+ del_channel(pd, pc);
+ pthread_mutex_unlock(&pd->mutex);
+
+ return stat;
+}
+
+/*******************************************************************************************************************************
+ * JetDirect channel functions.
+ */
+
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) jd_s_channel_open(mud_channel *pc)
+{
+ mud_device *pd = &msp->device[pc->dindex];
+ struct sockaddr_in pin;
+ char buf[HPMUD_LINE_SIZE];
+ int r, len, port;
+ enum HPMUD_RESULT stat = HPMUD_R_IO_ERROR;
+
+ bzero(&pin, sizeof(pin));
+ pin.sin_family = AF_INET;
+ pin.sin_addr.s_addr = inet_addr(pd->ip);
+
+ switch (pc->index)
+ {
+ case HPMUD_PRINT_CHANNEL:
+ port = PrintPort[pd->port];
+ pin.sin_port = htons(port);
+ if ((pc->socket = socket(AF_INET, SOCK_STREAM, 0)) == -1)
+ {
+ BUG("unable to open print port %d: %m %s\n", port, pd->uri);
+ goto bugout;
+ }
+ if (connect(pc->socket, (struct sockaddr *)&pin, sizeof(pin)) == -1)
+ {
+ BUG("unable to connect to print port %d: %m %s\n", port, pd->uri);
+ goto bugout;
+ }
+ break;
+ case HPMUD_SCAN_CHANNEL:
+ if (pd->io_mode == HPMUD_DOT4_PHOENIX_MODE)
+ port = ScanPort1[pd->port];
+ else
+ port = ScanPort0[pd->port];
+ pin.sin_port = htons(port);
+
+ if ((pc->socket = socket(AF_INET, SOCK_STREAM, 0)) == -1)
+ {
+ BUG("unable to open scan port %d: %m %s\n", port, pd->uri);
+ goto bugout;
+ }
+ if (connect(pc->socket, (struct sockaddr *)&pin, sizeof(pin)) == -1)
+ {
+ BUG("unable to connect to scan err=%d port %d: %m %s\n", errno, port, pd->uri);
+ goto bugout;
+ }
+ if (pd->io_mode != HPMUD_DOT4_PHOENIX_MODE)
+ {
+ r = ReadReply(pc);
+ if (r != 0)
+ {
+ BUG("invalid scan response %d port %d %s\n", r, port, pd->uri);
+ goto bugout;
+ }
+ }
+ break;
+ case HPMUD_MEMORY_CARD_CHANNEL:
+ case HPMUD_FAX_SEND_CHANNEL:
+ case HPMUD_CONFIG_UPLOAD_CHANNEL:
+ case HPMUD_CONFIG_DOWNLOAD_CHANNEL:
+ if (pd->io_mode == HPMUD_DOT4_PHOENIX_MODE)
+ port = GenericPort1[pd->port];
+ else
+ port = GenericPort[pd->port];
+ pin.sin_port = htons(port);
+ if ((pc->socket = socket(AF_INET, SOCK_STREAM, 0)) == -1)
+ {
+ BUG("unable to open port %d: %m %s\n", port, pd->uri);
+ goto bugout;
+ }
+ if (connect(pc->socket, (struct sockaddr *)&pin, sizeof(pin)) == -1)
+ {
+ BUG("unable to connect to port %d: %m %s\n", port, pd->uri);
+ goto bugout;
+ }
+
+ if (pd->io_mode != HPMUD_DOT4_PHOENIX_MODE)
+ {
+ r = ReadReply(pc);
+ if (r != 220)
+ {
+ BUG("invalid response %d port %d %s\n", r, port, pd->uri);
+ goto bugout;
+ }
+ len = sprintf(buf, "open %d\n", pc->index);
+ send(pc->socket, buf, len, 0);
+ r = ReadReply(pc);
+ if (r != 200)
+ {
+ BUG("invalid response %d port %d %s\n", r, port, pd->uri);
+ goto bugout;
+ }
+ len = sprintf(buf, "data\n");
+ send(pc->socket, "data\n", len, 0);
+ r = ReadReply(pc);
+ if (r != 200)
+ {
+ BUG("invalid response %d port %d %s\n", r, port, pd->uri);
+ goto bugout;
+ }
+ }
+
+ break;
+ case HPMUD_EWS_CHANNEL:
+ port = 80;
+ pin.sin_port = htons(port);
+ if ((pc->socket = socket(AF_INET, SOCK_STREAM, 0)) == -1)
+ {
+ BUG("unable to open ews port %d: %m %s\n", port, pd->uri);
+ goto bugout;
+ }
+ if (connect(pc->socket, (struct sockaddr *)&pin, sizeof(pin)) == -1)
+ {
+ BUG("unable to connect to ews port %d: %m %s\n", port, pd->uri);
+ goto bugout;
+ }
+ break;
+ case HPMUD_SOAPSCAN_CHANNEL:
+ port = 8289;
+ pin.sin_port = htons(port);
+ if ((pc->socket = socket(AF_INET, SOCK_STREAM, 0)) == -1)
+ {
+ BUG("unable to open soap-scan port %d: %m %s\n", port, pd->uri);
+ goto bugout;
+ }
+ if (connect(pc->socket, (struct sockaddr *)&pin, sizeof(pin)) == -1)
+ {
+ BUG("unable to connect to soap-scan port %d: %m %s\n", port, pd->uri);
+ goto bugout;
+ }
+ break;
+ case HPMUD_SOAPFAX_CHANNEL:
+ port = 8295;
+ pin.sin_port = htons(port);
+ if ((pc->socket = socket(AF_INET, SOCK_STREAM, 0)) == -1)
+ {
+ BUG("unable to open soap-fax port %d: %m %s\n", port, pd->uri);
+ goto bugout;
+ }
+ if (connect(pc->socket, (struct sockaddr *)&pin, sizeof(pin)) == -1)
+ {
+ BUG("unable to connect to soap-fax port %d: %m %s\n", port, pd->uri);
+ goto bugout;
+ }
+ break;
+ case HPMUD_MARVELL_SCAN_CHANNEL:
+ port = 8290; /* same as ScanPort1[1] */
+ pin.sin_port = htons(port);
+ if ((pc->socket = socket(AF_INET, SOCK_STREAM, 0)) == -1)
+ {
+ BUG("unable to open marvell-scan port %d: %m %s\n", port, pd->uri);
+ goto bugout;
+ }
+ if (connect(pc->socket, (struct sockaddr *)&pin, sizeof(pin)) == -1)
+ {
+ BUG("unable to connect to marvell-scan port %d: %m %s\n", port, pd->uri);
+ goto bugout;
+ }
+ break;
+ case HPMUD_LEDM_SCAN_CHANNEL:
+ case HPMUD_EWS_LEDM_CHANNEL:
+ port = 8080;
+ pin.sin_port = htons(port);
+ if ((pc->socket = socket(AF_INET, SOCK_STREAM, 0)) == -1)
+ {
+ BUG("unable to open ledm-scan port %d: %m %s\n", port, pd->uri);
+ goto bugout;
+ }
+ if (connect(pc->socket, (struct sockaddr *)&pin, sizeof(pin)) == -1)
+ {
+ BUG("unable to connect to ledm-scan port %d: %m %s\n", port, pd->uri);
+ goto bugout;
+ }
+ break;
+ case HPMUD_MARVELL_FAX_CHANNEL:
+ port = 8285;
+ pin.sin_port = htons(port);
+ if ((pc->socket = socket(AF_INET, SOCK_STREAM, 0)) == -1)
+ {
+ BUG("unable to open marvell-fax port %d: %m %s\n", port, pd->uri);
+ goto bugout;
+ }
+ if (connect(pc->socket, (struct sockaddr *)&pin, sizeof(pin)) == -1)
+ {
+ BUG("unable to connect to marvell-fax port %d: %m %s\n", port, pd->uri);
+ goto bugout;
+ }
+ break;
+ case HPMUD_PML_CHANNEL:
+ /* Do nothing here, use GetPml/SetPml instead of ReadData/WriteData. */
+ break;
+ default:
+ BUG("unsupported service %d %s\n", pc->index, pd->uri);
+ stat = HPMUD_R_INVALID_SN;
+ goto bugout;
+ break;
+ }
+
+ stat = HPMUD_R_OK;
+
+bugout:
+ return stat;
+}
+
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) jd_s_channel_close(mud_channel *pc)
+{
+ if (pc->socket >= 0)
+ {
+ close(pc->socket);
+
+ /* Delay for back-to-back scanning using scanimage. Otherwise next channel_open(HPMUD_SCAN_CHANNEL) can fail. */
+ sleep(1);
+ }
+
+ pc->socket = -1;
+
+ return HPMUD_R_OK;
+}
+
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) jd_s_channel_write(mud_channel *pc, const void *buf, int length, int sec_timeout, int *bytes_wrote)
+{
+ mud_device *pd = &msp->device[pc->dindex];
+ int len, size, total=0;
+ struct timeval tmo;
+ fd_set master;
+ fd_set writefd;
+ int maxfd, ret;
+ enum HPMUD_RESULT stat = HPMUD_R_IO_ERROR;
+
+ *bytes_wrote=0;
+ size = length;
+
+ if (pc->socket<0)
+ {
+ stat = HPMUD_R_INVALID_STATE;
+ BUG("invalid data link socket=%d %s\n", pc->socket, pd->uri);
+ goto bugout;
+ }
+
+ FD_ZERO(&master);
+ FD_SET(pc->socket, &master);
+ maxfd = pc->socket;
+ size = length;
+
+ while (size > 0)
+ {
+ tmo.tv_sec = HPMUD_EXCEPTION_SEC_TIMEOUT; /* note linux select will modify tmo */
+ tmo.tv_usec = 0;
+ writefd = master;
+ if ((ret = select(maxfd+1, NULL, &writefd, NULL, &tmo)) == 0)
+ {
+ stat = HPMUD_R_IO_TIMEOUT;
+ BUG("timeout write_channel %s\n", pd->uri);
+ goto bugout; /* timeout */
+ }
+ len = send(pc->socket, buf+total, size, 0);
+ if (len < 0)
+ {
+ BUG("unable to write_channel: %m %s\n", pd->uri);
+ goto bugout;
+ }
+ size-=len;
+ total+=len;
+ *bytes_wrote+=len;
+ }
+
+ DBG("write socket=%d len=%d size=%d\n", pc->socket, len, length);
+ DBG_DUMP(buf, len < 32 ? len : 32);
+
+ stat = HPMUD_R_OK;
+
+bugout:
+ return stat;
+}
+
+/*
+ * Channel_read() tries to read "length" bytes from the peripheral. The returned read count may be zero
+ * (timeout, no data available), less than "length" or equal "length".
+ */
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) jd_s_channel_read(mud_channel *pc, void *buf, int length, int sec_timeout, int *bytes_read)
+{
+ mud_device *pd = &msp->device[pc->dindex];
+ int len=0;
+ struct timeval tmo;
+ fd_set master;
+ fd_set readfd;
+ int maxfd, ret;
+ enum HPMUD_RESULT stat = HPMUD_R_IO_ERROR;
+
+ *bytes_read = 0;
+
+ if (pc->socket<0)
+ {
+ stat = HPMUD_R_INVALID_STATE;
+ BUG("invalid data link socket=%d %s\n", pc->socket, pd->uri);
+ goto bugout;
+ }
+
+ FD_ZERO(&master);
+ FD_SET(pc->socket, &master);
+ maxfd = pc->socket;
+ tmo.tv_sec = sec_timeout;
+ tmo.tv_usec = 0;
+
+ readfd = master;
+ ret = select(maxfd+1, &readfd, NULL, NULL, &tmo);
+ if (ret < 0)
+ {
+ BUG("unable to read_channel: %m %s\n", pd->uri);
+ goto bugout;
+ }
+ if (ret == 0)
+ {
+ stat = HPMUD_R_IO_TIMEOUT;
+// if (sec_timeout >= HPMUD_EXCEPTION_SEC_TIMEOUT)
+ BUG("timeout read_channel sec=%d %s\n", sec_timeout, pd->uri);
+ goto bugout;
+ }
+ else
+ {
+ if ((len = recv(pc->socket, buf, length, 0)) < 0)
+ {
+ BUG("unable to read_channel: %m %s\n", pd->uri);
+ goto bugout;
+ }
+ }
+
+ DBG("read socket=%d len=%d size=%d\n", pc->socket, len, length);
+ DBG_DUMP(buf, len < 32 ? len : 32);
+
+ *bytes_read = len;
+ stat = HPMUD_R_OK;
+
+bugout:
+ return stat;
+}
+
+/* Convert "www.google.com" to "3www6google3com". */
+static int convert_name_to_dns(const char *name, int name_size, unsigned char *dns_name)
+{
+ int i, x=0;
+ unsigned char *p=dns_name;
+
+ for (i=0; i<name_size; i++)
+ {
+ if (name[i]=='.')
+ {
+ *p++ = i-x; /* length */
+ for (; x<i; x++)
+ *p++ = name[x];
+ x++;
+ }
+ }
+
+ if (i)
+ {
+ i--;
+ *p++ = i-x; /* length */
+ for (; x<i; x++)
+ *p++ = name[x];
+ x++;
+ }
+
+ dns_name[x++]=0;
+
+ return x; /* return length DOES include null termination */
+}
+
+/*
+ * Lookup IP for MDNS host name.
+ * MDNS host name example: "npi7c8a3e" (LaserJet p2055dn)
+ */
+enum HPMUD_RESULT hpmud_mdns_lookup(const char *host_name, int sec_timeout, char *ip)
+{
+ struct sockaddr_in send_addr;
+ struct sockaddr_in recv_addr;
+ struct sockaddr_in addr;
+ socklen_t addrlen;
+ struct timeval tmo;
+ fd_set master;
+ fd_set readfd;
+ int i, len, n, host_len, yes=1;
+ int maxfd, ret;
+ int udp_socket;
+ char recvbuffer[256], host[256];
+ unsigned char dnsquery[256]={0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0};
+ unsigned char tail[] = {0x0, 0x1, 0x0, 0x1};
+ unsigned char loop=0, ttl=255;
+ enum HPMUD_RESULT stat = HPMUD_R_IO_ERROR;
+
+ DBG("mdns lookup '%s'\n", host_name);
+
+ if ((udp_socket = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
+ {
+ BUG("unable to create udp socket: %m\n");
+ goto bugout;
+ }
+
+ /* Get rid of "address already in use" error message. */
+ if (setsockopt(udp_socket, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes)) == -1)
+ {
+ BUG("unable to setsockopt: %m\n");
+ goto bugout;
+ }
+
+ /* Bind the socket to port and IP equal to INADDR_ANY. */
+ bzero(&recv_addr, sizeof(recv_addr));
+ recv_addr.sin_family = AF_INET;
+ recv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
+ recv_addr.sin_port = htons(5353);
+ if (bind(udp_socket, (struct sockaddr *)&recv_addr, sizeof(recv_addr)) == -1)
+ {
+ BUG("unable to bind udp socket: %m\n");
+ goto bugout;
+ }
+
+ /* Set multicast loopback off. */
+ if (setsockopt(udp_socket, IPPROTO_IP, IP_MULTICAST_LOOP, &loop, sizeof(loop)) == -1)
+ {
+ BUG("unable to setsockopt: %m\n");
+ goto bugout;
+ }
+
+ /* Set ttl to 255. Required by mdns. */
+ if (setsockopt(udp_socket, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, sizeof(ttl)) == -1)
+ {
+ BUG("unable to setsockopt: %m\n");
+ goto bugout;
+ }
+
+ /* Convert host name to mdns host name. */
+ host_len = snprintf(host, sizeof(host), "%s.local", host_name) + 1;
+
+ /* Create dns message. (header + question) */
+ n = convert_name_to_dns(host, host_len, dnsquery+12);
+ memcpy(dnsquery+12+n, tail, sizeof(tail));
+ n = 12+n+sizeof(tail);
+
+ i=0;
+ while (1)
+ {
+
+ DBG("send socket=%d len=%d\n", udp_socket, n);
+ DBG_DUMP(dnsquery, n);
+
+ bzero(&send_addr, sizeof(send_addr));
+ send_addr.sin_family = AF_INET;
+ send_addr.sin_addr.s_addr = inet_addr("224.0.0.251");
+ send_addr.sin_port = htons(5353);
+ sendto(udp_socket, dnsquery, n, 0, (struct sockaddr *)&send_addr, sizeof(send_addr));
+
+ FD_ZERO(&master);
+ FD_SET(udp_socket, &master);
+ maxfd = udp_socket;
+ tmo.tv_sec = 0;
+ tmo.tv_usec = 500000;
+
+ readfd = master;
+ ret = select(maxfd+1, &readfd, NULL, NULL, &tmo);
+ if (ret < 0)
+ {
+ BUG("error mdns lookup %s: %m\n", host);
+ goto bugout;
+ }
+ if (ret == 0)
+ {
+ goto retry;
+ }
+ else
+ {
+ bzero(&addr, sizeof(addr));
+ addrlen = sizeof(addr);
+ if ((len = recvfrom(udp_socket, recvbuffer, sizeof(recvbuffer), 0, (struct sockaddr *)&addr, &addrlen)) < 0)
+ {
+ BUG("error mdns lookup %s: %m\n", host);
+ goto bugout;
+ }
+
+ /* Make sure reply is from specified host. */
+ if (strncasecmp((const char *)dnsquery+12, (const char *)recvbuffer+12, n)==0)
+ break;
+ BUG("error mdns lookup %s: bad hostname in reply from ip=%s port=%d\n", host, inet_ntoa(addr.sin_addr), ntohs(addr.sin_port));
+ }
+
+retry:
+ if (i++ >= 2 * sec_timeout)
+ {
+ BUG("error timeout mdns lookup %s\n", host);
+ goto bugout;
+ }
+
+ BUG("mdns lookup %s retry %d...\n", host, i);
+ }
+
+ strcpy(ip, inet_ntoa(addr.sin_addr));
+
+ DBG("recv socket=%d len=%d port=%d ip=%s\n", udp_socket, len, ntohs(addr.sin_port), ip);
+ DBG_DUMP(recvbuffer, len);
+
+ stat = HPMUD_R_OK;
+
+bugout:
+
+ if (udp_socket >= 0)
+ close(udp_socket);
+
+ return stat;
+}
+
+enum HPMUD_RESULT hpmud_make_net_uri(const char *ip, int port, char *uri, int uri_size, int *bytes_read)
+{
+ char id[1024];
+ char model[128];
+ enum HPMUD_RESULT stat;
+
+ DBG("[%d] hpmud_make_net_uri() ip=%s port=%d\n", getpid(), ip, port);
+
+ *bytes_read=0;
+
+ uri[0]=0;
+
+ if (ip[0]==0)
+ {
+ BUG("invalid ip %s\n", ip);
+ stat = HPMUD_R_INVALID_IP;
+ goto bugout;
+ }
+
+ if (device_id(ip, port, id, sizeof(id)) > 0 && is_hp(id))
+ {
+ hpmud_get_model(id, model, sizeof(model));
+ if (port == 1)
+ *bytes_read = snprintf(uri, uri_size, "hp:/net/%s?ip=%s", model, ip);
+ else
+ *bytes_read = snprintf(uri, uri_size, "hp:/net/%s?ip=%s&port=%d", model, ip, port);
+ }
+ else
+ {
+ BUG("invalid ip %s\n", ip);
+ stat = HPMUD_R_INVALID_IP;
+ goto bugout;
+ }
+
+ stat = HPMUD_R_OK;
+
+bugout:
+ return stat;
+}
+
+enum HPMUD_RESULT hpmud_make_mdns_uri(const char *host, int port, char *uri, int uri_size, int *bytes_read)
+{
+ char id[1024];
+ char model[128];
+ char ip[HPMUD_LINE_SIZE]; /* internet address */
+ enum HPMUD_RESULT stat;
+
+ DBG("[%d] hpmud_make_mdns_uri() host=%s port=%d\n", getpid(), host, port);
+
+ *bytes_read=0;
+
+ uri[0]=0;
+
+ if (host[0]==0)
+ {
+ BUG("invalid host %s\n", host);
+ stat = HPMUD_R_INVALID_MDNS;
+ goto bugout;
+ }
+
+ if (hpmud_mdns_lookup(host, HPMUD_MDNS_TIMEOUT, ip) != HPMUD_R_OK)
+ {
+ BUG("invalid host %s, check firewall UDP/5353 or try using IP\n", host);
+ stat = HPMUD_R_INVALID_MDNS;
+ goto bugout;
+ }
+
+ if (device_id(ip, port, id, sizeof(id)) > 0 && is_hp(id))
+ {
+ hpmud_get_model(id, model, sizeof(model));
+ if (port == 1)
+ *bytes_read = snprintf(uri, uri_size, "hp:/net/%s?zc=%s", model, host);
+ else
+ *bytes_read = snprintf(uri, uri_size, "hp:/net/%s?zc=%s&port=%d", model, host, port);
+ }
+ else
+ {
+ BUG("invalid host %s, or try using IP\n", host);
+ stat = HPMUD_R_INVALID_MDNS;
+ goto bugout;
+ }
+
+ stat = HPMUD_R_OK;
+
+bugout:
+ return stat;
+}
+
+#endif /* HAVE_LIBNETSNMP */
diff --git a/io/hpmud/jd.h b/io/hpmud/jd.h
new file mode 100644
index 0000000..f252fd8
--- /dev/null
+++ b/io/hpmud/jd.h
@@ -0,0 +1,56 @@
+/*****************************************************************************\
+
+ jd.h - JetDirect support for multi-point transport driver
+
+ (c) 2004-2007 Copyright Hewlett-Packard Development Company, LP
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+ of the Software, and to permit persons to whom the Software is furnished to do
+ so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+\*****************************************************************************/
+
+#ifndef _JD_H
+#define _JD_H
+
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include "hpmud.h"
+#include "hpmudi.h"
+
+struct _mud_device;
+struct _mud_channel;
+
+extern const char __attribute__ ((visibility ("hidden"))) *kStatusOID; /* device id snmp oid */
+
+extern struct _mud_device_vf __attribute__ ((visibility ("hidden"))) jd_mud_device_vf;
+
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) jd_open(struct _mud_device *pd);
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) jd_close(struct _mud_device *pd);
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) jd_get_device_id(struct _mud_device *pd, char *buf, int size, int *len);
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) jd_get_device_status(struct _mud_device *pd, unsigned int *status);
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) jd_channel_open(struct _mud_device *pd, const char *sn, HPMUD_CHANNEL *cd);
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) jd_channel_close(struct _mud_device *pd, struct _mud_channel *pc);
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) jd_channel_write(struct _mud_device *pd, struct _mud_channel *pc, const void *buf, int length, int timeout, int *bytes_wrote);
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) jd_channel_read(struct _mud_device *pd, struct _mud_channel *pc, void *buf, int length, int timeout, int *bytes_read);
+
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) jd_s_channel_open(struct _mud_channel *pc);
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) jd_s_channel_close(struct _mud_channel *pc);
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) jd_s_channel_write(struct _mud_channel *pc, const void *buf, int length, int timeout, int *bytes_wrote);
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) jd_s_channel_read(struct _mud_channel *pc, void *buf, int length, int timeout, int *bytes_wrote);
+
+#endif // _JD_H
+
diff --git a/io/hpmud/list.h b/io/hpmud/list.h
new file mode 100644
index 0000000..007e704
--- /dev/null
+++ b/io/hpmud/list.h
@@ -0,0 +1,131 @@
+#ifndef _LIST_H
+#define _LIST_H
+
+/*
+ * This linked list implementation is the same as linux kernel implementation.
+ * Refer to the linux kernel documentation for usage.
+ */
+
+struct list_head {
+ struct list_head *next, *prev;
+};
+
+#define INIT_LIST_HEAD(ptr) do { \
+ (ptr)->next = (ptr); (ptr)->prev = (ptr); \
+} while (0)
+
+/*
+ * Insert a new entry between two known consecutive entries.
+ *
+ * This is only for internal list manipulation where we know
+ * the prev/next entries already!
+ */
+static inline void __list_add(struct list_head * new_entry,
+ struct list_head * prev,
+ struct list_head * next)
+{
+ next->prev = new_entry;
+ new_entry->next = next;
+ new_entry->prev = prev;
+ prev->next = new_entry;
+}
+
+/**
+ * list_add - add a new entry
+ * @new: new entry to be added
+ * @head: list head to add it after
+ *
+ * Insert a new entry after the specified head.
+ * This is good for implementing stacks.
+ */
+static inline void list_add(struct list_head *new_entry, struct list_head *head)
+{
+ __list_add(new_entry, head, head->next);
+}
+
+/**
+ * list_add_tail - add a new entry
+ * @new: new entry to be added
+ * @head: list head to add it before
+ *
+ * Insert a new entry before the specified head.
+ * This is useful for implementing queues.
+ */
+static inline void list_add_tail(struct list_head *new_entry, struct list_head *head)
+{
+ __list_add(new_entry, head->prev, head);
+}
+
+/*
+ * Delete a list entry by making the prev/next entries
+ * point to each other.
+ *
+ * This is only for internal list manipulation where we know
+ * the prev/next entries already!
+ */
+static inline void __list_del(struct list_head * prev,
+ struct list_head * next)
+{
+ next->prev = prev;
+ prev->next = next;
+}
+
+/**
+ * list_del - deletes entry from list.
+ * @entry: the element to delete from the list.
+ * Note: list_empty on entry does not return true after this, the entry is in an undefined state.
+ */
+static inline void list_del(struct list_head *entry)
+{
+ __list_del(entry->prev, entry->next);
+ entry->next = entry->prev = 0;
+}
+
+/**
+ * list_del_init - deletes entry from list and reinitialize it.
+ * @entry: the element to delete from the list.
+ */
+static inline void list_del_init(struct list_head *entry)
+{
+ __list_del(entry->prev, entry->next);
+ INIT_LIST_HEAD(entry);
+}
+
+/**
+ * list_empty - tests whether a list is empty
+ * @head: the list to test.
+ */
+static inline int list_empty(struct list_head *head)
+{
+ return head->next == head;
+}
+
+/**
+ * list_entry - get the struct for this entry
+ * @ptr: the &struct list_head pointer.
+ * @type: the type of the struct this is embedded in.
+ * @member: the name of the list_struct within the struct.
+ */
+#define list_entry(ptr, type, member) \
+ ((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))
+
+/**
+ * list_for_each - iterate over a list
+ * @pos: the &struct list_head to use as a loop counter.
+ * @head: the head for your list.
+ */
+#define list_for_each(pos, head) \
+ for (pos = (head)->next; pos != (head); \
+ pos = pos->next)
+
+/**
+ * list_for_each_safe - iterate over a list safe against removal of list entry
+ * @pos: the &struct list_head to use as a loop counter.
+ * @n: another &struct list_head to use as temporary storage
+ * @head: the head for your list.
+ */
+#define list_for_each_safe(pos, n, head) \
+ for (pos = (head)->next, n = pos->next; pos != (head); \
+ pos = n, n = pos->next)
+
+#endif /* _LIST_H */
diff --git a/io/hpmud/mlc.c b/io/hpmud/mlc.c
new file mode 100644
index 0000000..e8b9784
--- /dev/null
+++ b/io/hpmud/mlc.c
@@ -0,0 +1,772 @@
+/*****************************************************************************\
+
+ mlc.c - MLC support for multi-point tranport driver
+
+ (c) 2004-2007 Copyright Hewlett-Packard Development Company, LP
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+ of the Software, and to permit persons to whom the Software is furnished to do
+ so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+\*****************************************************************************/
+
+#include "hpmud.h"
+#include "hpmudi.h"
+
+int __attribute__ ((visibility ("hidden"))) cut_buf(mud_channel *pc, char *buf, int size)
+{
+ int len;
+
+ if (pc->rcnt > size)
+ {
+ /* Return part of rbuf. */
+ len = size;
+ memcpy(buf, &pc->rbuf[pc->rindex], len);
+ pc->rindex += len;
+ pc->rcnt -= len;
+ }
+ else
+ {
+ /* Return all of rbuf. */
+ len = pc->rcnt;
+ memcpy(buf, &pc->rbuf[pc->rindex], len);
+ pc->rindex = pc->rcnt = 0;
+ }
+
+ return len;
+}
+
+/* Write command reply back to peripheral. */
+static int MlcForwardReply(mud_channel *pc, int fd, unsigned char *buf, int size)
+{
+ mud_device *pd = &msp->device[pc->dindex];
+ int len=0;
+
+ if ((len = (pd->vf.write)(fd, buf, size, HPMUD_EXCEPTION_TIMEOUT)) != size)
+ {
+ BUG("unable to MlcForwarReply: %m\n");
+ }
+ return len;
+}
+
+/* Execute command from peripheral. */
+static int MlcExecReverseCmd(mud_channel *pc, int fd, unsigned char *buf)
+{
+ mud_device *pd = &msp->device[pc->dindex];
+ mud_channel *out_of_bound_channel;
+ MLCCmd *pCmd;
+ MLCReply *pReply;
+ MLCCredit *pCredit;
+ MLCCreditReply *pCreditReply;
+ MLCCreditRequest *pCreditReq;
+ MLCCreditRequestReply *pCreditReqReply;
+ MLCError *pError;
+ int len, size;
+ static int cnt;
+
+ pCmd = (MLCCmd *)buf;
+
+ /* See if this packet is a command packet. */
+ if (!(pCmd->h.hsid == 0 && pCmd->h.psid == 0))
+ {
+ if (pCmd->h.hsid == pCmd->h.psid)
+ {
+ /* Got a valid data packet handle it. This can happen when channel_read timeouts and p2hcredit=1. */
+ out_of_bound_channel = &pd->channel[pCmd->h.hsid];
+
+ if (out_of_bound_channel->ta.p2hcredit <= 0)
+ {
+ BUG("invalid data packet credit=%d\n", out_of_bound_channel->ta.p2hcredit);
+ return 0;
+ }
+
+ size = ntohs(pCmd->h.length) - sizeof(MLCHeader);
+ if (size > (HPMUD_BUFFER_SIZE - out_of_bound_channel->rcnt))
+ {
+ BUG("invalid data packet size=%d\n", size);
+ return 0;
+ }
+ memcpy(&out_of_bound_channel->rbuf[out_of_bound_channel->rcnt], buf+sizeof(MLCHeader), size);
+ out_of_bound_channel->rcnt += size;
+ if (pCmd->h.credit)
+ out_of_bound_channel->ta.h2pcredit += pCmd->h.credit; /* note, piggy back credit is 1 byte wide */
+ out_of_bound_channel->ta.p2hcredit--; /* one data packet was read, decrement credit count */
+ }
+ else
+ {
+ len = ntohs(pCmd->h.length);
+ BUG("unsolicited data packet: hsid=%x, psid=%x, length=%d, credit=%d, status=%x\n", pCmd->h.hsid,
+ pCmd->h.psid, len, pCmd->h.credit, pCmd->h.status);
+ DBG_DUMP(buf, len);
+ }
+ return 0;
+ }
+
+ /* Process any command. */
+ switch (pCmd->cmd)
+ {
+ case MLC_CREDIT:
+ pCredit = (MLCCredit *)buf;
+ out_of_bound_channel = &pd->channel[pCredit->hsocket];
+ out_of_bound_channel->ta.h2pcredit += ntohs(pCredit->credit);
+ pCreditReply = (MLCCreditReply *)buf;
+ pCreditReply->h.length = htons(sizeof(MLCCreditReply));
+ pCreditReply->cmd |= 0x80;
+ pCreditReply->result = 0;
+ MlcForwardReply(pc, fd, (unsigned char *)pCreditReply, sizeof(MLCCreditReply));
+ break;
+ case MLC_CREDIT_REQUEST:
+ pCreditReq = (MLCCreditRequest *)buf;
+ if (cnt++ < 5)
+ BUG("unexpected MLCCreditRequest: cmd=%x, hid=%x, pid=%x, credit=%d\n", pCreditReq->cmd,
+ pCreditReq->hsocket, pCreditReq->psocket, ntohs(pCreditReq->credit));
+ pCreditReqReply = (MLCCreditRequestReply *)buf;
+ pCreditReqReply->h.length = htons(sizeof(MLCCreditRequestReply));
+ pCreditReqReply->cmd |= 0x80;
+ pCreditReqReply->result = 0;
+ pCreditReqReply->credit = 0;
+ MlcForwardReply(pc, fd, (unsigned char *)pCreditReqReply, sizeof(MLCCreditRequestReply));
+ break;
+ case MLC_ERROR:
+ pError = (MLCError *)buf;
+ BUG("unexpected MLCError: cmd=%x, result=%x\n", pError->cmd, pError->result);
+ return 1;
+ default:
+ pReply = (MLCReply *)buf;
+ BUG("unexpected command: cmd=%x, result=%x\n", pReply->cmd, pReply->result);
+ pReply->h.length = htons(sizeof(MLCReply));
+ pReply->cmd |= 0x80;
+ pReply->result = 1;
+ MlcForwardReply(pc, fd, (unsigned char *)pReply, sizeof(MLCReply));
+ break;
+ }
+ return 0;
+}
+
+/* Get command from peripheral and processes the reverse command. */
+int __attribute__ ((visibility ("hidden"))) MlcReverseCmd(mud_channel *pc, int fd)
+{
+ mud_device *pd = &msp->device[pc->dindex];
+ unsigned char buf[HPMUD_BUFFER_SIZE];
+ int stat=0, len, size;
+ unsigned int pklen;
+ unsigned char *pBuf;
+ MLCReply *pPk;
+
+ pPk = (MLCReply *)buf;
+
+ pBuf = buf;
+
+ /* Read packet header. */
+ size = sizeof(MLCHeader);
+ while (size > 0)
+ {
+ if ((len = (pd->vf.read)(fd, pBuf, size, HPMUD_EXCEPTION_TIMEOUT)) < 0)
+ {
+ BUG("unable to read MlcReverseCmd header: %m\n");
+ stat = 1;
+ goto bugout;
+ }
+ size-=len;
+ pBuf+=len;
+ }
+
+ /* Determine packet size. */
+ if ((pklen = ntohs(pPk->h.length)) > sizeof(buf))
+ {
+ BUG("invalid MlcReverseCmd packet size: size=%d\n", pklen);
+ stat = 1;
+ goto bugout;
+ }
+
+ /* Read packet data field. */
+ size = pklen - sizeof(MLCHeader);
+ while (size > 0)
+ {
+ if ((len = (pd->vf.read)(fd, pBuf, size, HPMUD_EXCEPTION_TIMEOUT)) < 0)
+ {
+ BUG("unable to read MlcReverseCmd data: %m\n");
+ stat = 1;
+ goto bugout;
+ }
+ size-=len;
+ pBuf+=len;
+ }
+
+ stat = MlcExecReverseCmd(pc, fd, buf);
+
+bugout:
+ return stat;
+}
+
+/*
+ * Get command reply from peripheral. Waits for reply then returns. Processes any reverse commands
+ * while waiting for a reply.
+ */
+static int MlcReverseReply(mud_channel *pc, int fd, unsigned char *buf, int bufsize)
+{
+ mud_device *pd = &msp->device[pc->dindex];
+ int stat=0, len, size, pklen;
+ unsigned char *pBuf;
+ MLCReply *pPk;
+
+ pPk = (MLCReply *)buf;
+
+ while (1)
+ {
+ pBuf = buf;
+
+ /* Read packet header. */
+ size = sizeof(MLCHeader);
+ while (size > 0)
+ {
+ if ((len = (pd->vf.read)(fd, pBuf, size, 4000000)) < 0) /* wait 4 seconds, same as dot4 */
+ {
+ BUG("unable to read MlcReverseReply header: %m bytesRead=%zd\n", sizeof(MLCHeader)-size);
+ stat = 2; /* short timeout */
+ goto bugout;
+ }
+ size-=len;
+ pBuf+=len;
+ }
+
+ /* Determine packet size. */
+ pklen = ntohs(pPk->h.length);
+ if (pklen < 0 || pklen > bufsize)
+ {
+ BUG("invalid MlcReverseReply packet size: size=%d, buf=%d\n", pklen, bufsize);
+ stat = 1;
+ goto bugout;
+ }
+
+ if (pklen == 0)
+ {
+ /* Got invalid MLC header from peripheral, try this "off-by-one" firmware hack (ie: OJ600). */
+ BUG("trying MlcReverseReply firmware hack\n");
+ memcpy(buf, &buf[1], sizeof(MLCHeader)-1);
+ pklen = ntohs(pPk->h.length);
+ if (pklen <= 0 || pklen > bufsize)
+ {
+ BUG("invalid MlcReverseReply packet size: size=%d, buf=%d\n", pklen, bufsize);
+ stat = 1;
+ goto bugout;
+ }
+ if ((len = (pd->vf.read)(fd, --pBuf, 1, 1000000)) < 0) /* wait 1 second */
+ {
+ BUG("unable to read MlcReverseReply header: %m\n");
+ stat = 1;
+ goto bugout;
+ }
+ pBuf++;
+ DBG_DUMP(buf, sizeof(MLCHeader));
+ }
+
+ /* Read packet data field. */
+ size = pklen - sizeof(MLCHeader);
+ while (size > 0)
+ {
+ if ((len = (pd->vf.read)(fd, pBuf, size, HPMUD_EXCEPTION_TIMEOUT)) < 0)
+ {
+ BUG("unable to read MlcReverseReply data: %m exp=%zd act=%zd\n", pklen-sizeof(MLCHeader), pklen-sizeof(MLCHeader)-size);
+ stat = 1;
+ goto bugout;
+ }
+ size-=len;
+ pBuf+=len;
+ }
+
+ /* Check for reply. */
+ if (pPk->cmd & 0x80)
+ break;
+
+ stat = MlcExecReverseCmd(pc, fd, buf);
+
+ if (stat != 0)
+ break;
+
+ } /* while (1) */
+
+bugout:
+ return stat;
+}
+
+int __attribute__ ((visibility ("hidden"))) MlcInit(mud_channel *pc, int fd)
+{
+ mud_device *pd = &msp->device[pc->dindex];
+ unsigned char buf[HPMUD_BUFFER_SIZE];
+ int stat=0, len, n, cnt;
+ MLCInit *pCmd;
+ MLCInitReply *pReply;
+
+ memset(buf, 0, sizeof(MLCInit));
+ pCmd = (MLCInit *)buf;
+ n = sizeof(MLCInit);
+ pCmd->h.length = htons(n);
+ pCmd->cmd = MLC_INIT;
+ pCmd->rev = 3;
+
+ if ((len = (pd->vf.write)(fd, pCmd, n, HPMUD_EXCEPTION_TIMEOUT)) != n)
+ {
+ BUG("unable to write MLCInit: %m\n");
+ stat = 1;
+ goto bugout;
+ }
+
+ cnt=0;
+ while(1)
+ {
+ stat = MlcReverseReply(pc, fd, buf, sizeof(buf));
+ pReply = (MLCInitReply *)buf;
+
+ if ((stat != 0) || (pReply->cmd != (0x80 | MLC_INIT)) || (pReply->result != 0))
+ {
+ if (errno == EIO && cnt<1)
+ {
+ /* hack for usblp.c 2.6.5 */
+ BUG("invalid MLCInitReply retrying...\n");
+ sleep(1);
+ cnt++;
+ continue;
+ }
+ if (stat == 2 && cnt<1)
+ {
+ /* hack for Tahoe */
+ BUG("invalid MLCInitReply retrying command...\n");
+ memset(buf, 0, sizeof(MLCInit));
+ n = sizeof(MLCInit);
+ pCmd->h.length = htons(n);
+ pCmd->cmd = MLC_INIT;
+ pCmd->rev = 3;
+ (pd->vf.write)(fd, pCmd, n, HPMUD_EXCEPTION_TIMEOUT);
+ cnt++;
+ continue;
+ }
+ BUG("invalid MLCInitReply: cmd=%x, result=%x\n, revision=%x\n", pReply->cmd, pReply->result, pReply->rev);
+ stat = 1;
+ goto bugout;
+ }
+ break;
+ }
+
+bugout:
+ return stat;
+}
+
+int __attribute__ ((visibility ("hidden"))) MlcExit(mud_channel *pc, int fd)
+{
+ mud_device *pd = &msp->device[pc->dindex];
+ unsigned char buf[HPMUD_BUFFER_SIZE];
+ int stat=0, len, n;
+ MLCExit *pCmd;
+ MLCExitReply *pReply;
+
+ memset(buf, 0, sizeof(MLCExit));
+ pCmd = (MLCExit *)buf;
+ n = sizeof(MLCExit);
+ pCmd->h.length = htons(n);
+ pCmd->cmd = MLC_EXIT;
+
+ if ((len = (pd->vf.write)(fd, pCmd, n, HPMUD_EXCEPTION_TIMEOUT)) != n)
+ {
+ BUG("unable to write MLCExit: %m\n");
+ stat = 1;
+ goto bugout;
+ }
+
+ stat = MlcReverseReply(pc, fd, buf, sizeof(buf));
+ pReply = (MLCExitReply *)buf;
+
+ if ((stat != 0) || (pReply->cmd != (0x80 | MLC_EXIT)) || (pReply->result != 0))
+ {
+ BUG("invalid MLCExitReply: cmd=%x, result=%x\n", pReply->cmd, pReply->result);
+ stat = 1;
+ goto bugout;
+ }
+
+bugout:
+ return stat;
+}
+
+int __attribute__ ((visibility ("hidden"))) MlcConfigSocket(mud_channel *pc, int fd)
+{
+ mud_device *pd = &msp->device[pc->dindex];
+ unsigned char buf[HPMUD_BUFFER_SIZE];
+ int stat=0, len, n;
+ MLCConfigSocket *pCmd;
+ MLCConfigSocketReply *pReply;
+
+ if (pc->ta.h2psize > 0)
+ return stat; /* already got host/peripheral packet sizes */
+
+ memset(buf, 0, sizeof(MLCConfigSocket));
+ pCmd = (MLCConfigSocket *)buf;
+ n = sizeof(MLCConfigSocket);
+ pCmd->h.length = htons(n);
+ pCmd->cmd = MLC_CONFIG_SOCKET;
+ pCmd->socket = pc->sockid;
+ pCmd->h2psize = htons(HPMUD_BUFFER_SIZE);
+ pCmd->p2hsize = htons(HPMUD_BUFFER_SIZE);
+ pCmd->status = 0; /* status level?? */
+
+ if ((len = (pd->vf.write)(fd, pCmd, n, HPMUD_EXCEPTION_TIMEOUT)) != n)
+ {
+ BUG("unable to write MLCConfigSocket: %m\n");
+ stat = 1;
+ goto bugout;
+ }
+
+ stat = MlcReverseReply(pc, fd, buf, sizeof(buf));
+ pReply = (MLCConfigSocketReply *)buf;
+
+ if ((stat != 0) || (pReply->cmd != (0x80 | MLC_CONFIG_SOCKET)) || (pReply->result != 0))
+ {
+ BUG("invalid MLCConfigSocketReply: cmd=%x, result=%x\n", pReply->cmd, pReply->result);
+ stat = 1;
+ goto bugout;
+ }
+
+ pc->ta.h2psize = ntohs(pReply->h2psize);
+ pc->ta.p2hsize = ntohs(pReply->p2hsize);
+
+bugout:
+ return stat;
+}
+
+/* Write data to peripheral. */
+int __attribute__ ((visibility ("hidden"))) MlcForwardData(mud_channel *pc, int fd, const void *buf, int size, int usec_timeout)
+{
+ mud_device *pd = &msp->device[pc->dindex];
+ int stat=0, len, n;
+ MLCHeader h;
+
+ memset(&h, 0, sizeof(h));
+ n = sizeof(MLCHeader) + size;
+ h.length = htons(n);
+ h.hsid = pc->sockid;
+ h.psid = pc->sockid;
+
+ if ((len = (pd->vf.write)(fd, &h, sizeof(MLCHeader), usec_timeout)) != sizeof(MLCHeader))
+ {
+ BUG("unable to write MlcForwardData header: %m\n");
+ stat = 1;
+ goto bugout;
+ }
+
+ if ((len = (pd->vf.write)(fd, buf, size, usec_timeout)) != size)
+ {
+ BUG("unable to write MlcForwardData: %m\n");
+ stat = 1;
+ goto bugout;
+ }
+
+bugout:
+ return stat;
+}
+
+/* Read data from peripheral. */
+int __attribute__ ((visibility ("hidden"))) MlcReverseData(mud_channel *pc, int fd, void *buf, int length, int usec_timeout)
+{
+ mud_device *pd = &msp->device[pc->dindex];
+ mud_channel *out_of_bound_channel;
+ int len, size, total;
+ MLCHeader *pPk;
+
+ pPk = (MLCHeader *)buf;
+
+ while (1)
+ {
+ total = 0;
+
+ /* Read packet header. */
+ size = sizeof(MLCHeader);
+ while (size > 0)
+ {
+ /* Use requested client timeout until we start reading. */
+ if (total == 0)
+ len = (pd->vf.read)(fd, buf+total, size, usec_timeout);
+ else
+ len = (pd->vf.read)(fd, buf+total, size, HPMUD_EXCEPTION_TIMEOUT);
+
+ if (len < 0)
+ {
+ /* Got a timeout, if exception timeout or timeout occured after read started thats an error. */
+ if (usec_timeout >= HPMUD_EXCEPTION_TIMEOUT || total > 0)
+ BUG("unable to read MlcReverseData header: %m %s\n", pd->uri);
+ goto bugout;
+ }
+ size-=len;
+ total+=len;
+ }
+
+ /* Determine data size. */
+ size = ntohs(pPk->length) - sizeof(MLCHeader);
+
+ if (size > length)
+ {
+ BUG("invalid MlcReverseData size: size=%d, buf=%d\n", size, length);
+ goto bugout;
+ }
+
+ /* Make sure data packet is for this channel. */
+ if (pPk->hsid != pc->sockid && pPk->psid != pc->sockid)
+ {
+ if (pPk->hsid == 0 && pPk->psid == 0)
+ {
+ /* Ok, got a command channel packet instead of a data packet, handle it... */
+ while (size > 0)
+ {
+ if ((len = (pd->vf.read)(fd, buf+total, size, HPMUD_EXCEPTION_TIMEOUT)) < 0)
+ {
+ BUG("unable to read MlcReverseData command: %m\n");
+ goto bugout;
+ }
+ size-=len;
+ total=len;
+ }
+ MlcExecReverseCmd(pc, fd, buf);
+ continue; /* try again for data packet */
+ }
+ else if (pPk->hsid == pPk->psid)
+ {
+ /* Got a valid data packet for another channel handle it. This can happen when ReadData timeouts and p2hcredit=1. */
+ out_of_bound_channel = &pd->channel[pPk->hsid];
+ unsigned char *pBuf;
+
+ if (out_of_bound_channel->ta.p2hcredit <= 0)
+ {
+ BUG("invalid data packet credit=%d\n", out_of_bound_channel->ta.p2hcredit);
+ goto bugout;
+ }
+
+ if (size > (HPMUD_BUFFER_SIZE - out_of_bound_channel->rcnt))
+ {
+ BUG("invalid data packet size=%d\n", size);
+ goto bugout;
+ }
+
+ total = 0;
+ pBuf = &out_of_bound_channel->rbuf[out_of_bound_channel->rcnt];
+ while (size > 0)
+ {
+ if ((len = (pd->vf.read)(fd, pBuf+total, size, HPMUD_EXCEPTION_TIMEOUT)) < 0)
+ {
+ BUG("unable to read MlcReverseData: %m\n");
+ goto bugout;
+ }
+ size-=len;
+ total+=len;
+ }
+
+ out_of_bound_channel->rcnt += total;
+ if (pPk->credit)
+ out_of_bound_channel->ta.h2pcredit += pPk->credit; /* note, piggy back credit is 1 byte wide */
+ out_of_bound_channel->ta.p2hcredit--; /* one data packet was read, decrement credit count */
+ continue; /* try again for data packet */
+ }
+ else
+ {
+ MLCCmd *pCmd = (MLCCmd *)buf;
+ BUG("invalid MlcReverseData state: exp hsid=%x, act hsid=%x, psid=%x, length=%d, credit=%d, status=%x, cmd=%x\n", pc->sockid,
+ pPk->hsid, pPk->psid, ntohs(pPk->length), pPk->credit, pPk->status, pCmd->cmd);
+ goto bugout;
+ }
+ }
+
+ if (pPk->credit)
+ {
+ pc->ta.h2pcredit += pPk->credit; /* note, piggy back credit is 1 byte wide */
+ }
+
+ total = 0; /* eat packet header */
+
+ /* Read packet data field with exception_timeout. */
+ while (size > 0)
+ {
+ if ((len = (pd->vf.read)(fd, buf+total, size, HPMUD_EXCEPTION_TIMEOUT)) < 0)
+ {
+ BUG("unable to read MlcReverseData: %m\n");
+ goto bugout;
+ }
+ size-=len;
+ total+=len;
+ }
+ break; /* done reading data packet */
+ } /* while (1) */
+
+bugout:
+ return total;
+}
+
+int __attribute__ ((visibility ("hidden"))) MlcOpenChannel(mud_channel *pc, int fd)
+{
+ mud_device *pd = &msp->device[pc->dindex];
+ unsigned char buf[HPMUD_BUFFER_SIZE];
+ int stat=0, len, n;
+ MLCOpenChannel *pCmd;
+ MLCOpenChannelReply *pReply;
+
+ memset(buf, 0, sizeof(MLCOpenChannel));
+ pCmd = (MLCOpenChannel *)buf;
+ n = sizeof(MLCOpenChannel);
+ pCmd->h.length = htons(n);
+ pCmd->cmd = MLC_OPEN_CHANNEL;
+ pCmd->hsocket = pc->sockid; /* assume static socket ids */
+ pCmd->psocket = pc->sockid;
+ pCmd->credit = htons(0); /* credit sender will accept from receiver (set by MlcDevice::ReadData) */
+ // SetH2PCredit(0); /* initialize sender to receiver credit */
+
+ if ((len = (pd->vf.write)(fd, pCmd, n, HPMUD_EXCEPTION_TIMEOUT)) != n)
+ {
+ BUG("unable to write MlcOpenChannel: %m\n");
+ stat = 1;
+ goto bugout;
+ }
+
+ stat = MlcReverseReply(pc, fd, buf, sizeof(buf));
+ pReply = (MLCOpenChannelReply *)buf;
+
+ if ((stat != 0) || (pReply->cmd != (0x80 | MLC_OPEN_CHANNEL)) || (pReply->result != 0))
+ {
+ BUG("invalid MlcOpenChannelReply: cmd=%x, result=%x\n", pReply->cmd, pReply->result);
+ stat = 1;
+ goto bugout;
+ }
+
+ pc->ta.h2pcredit = ntohs(pReply->credit);
+
+bugout:
+ return stat;
+}
+
+int __attribute__ ((visibility ("hidden"))) MlcCloseChannel(mud_channel *pc, int fd)
+{
+ mud_device *pd = &msp->device[pc->dindex];
+ unsigned char buf[HPMUD_BUFFER_SIZE];
+ int stat=0, len, n;
+ MLCCloseChannel *pCmd;
+ MLCCloseChannelReply *pReply;
+
+ memset(buf, 0, sizeof(MLCCloseChannel));
+ pCmd = (MLCCloseChannel *)buf;
+ n = sizeof(MLCCloseChannel);
+ pCmd->h.length = htons(n);
+ pCmd->cmd = MLC_CLOSE_CHANNEL;
+ pCmd->hsocket = pc->sockid; /* assume static socket ids */
+ pCmd->psocket = pc->sockid;
+
+ if ((len = (pd->vf.write)(fd, pCmd, n, HPMUD_EXCEPTION_TIMEOUT)) != n)
+ {
+ BUG("unable to write MlcCloseChannel: %m\n");
+ stat = 1;
+ goto bugout;
+ }
+
+ stat = MlcReverseReply(pc, fd, buf, sizeof(buf));
+ pReply = (MLCCloseChannelReply *)buf;
+
+ if ((stat != 0) || (pReply->cmd != (0x80 | MLC_CLOSE_CHANNEL)) || (pReply->result != 0))
+ {
+ BUG("invalid MlcCloseChannelReply: cmd=%x, result=%x\n", pReply->cmd, pReply->result);
+ stat = 1;
+ goto bugout;
+ }
+
+bugout:
+ return stat;
+}
+
+int __attribute__ ((visibility ("hidden"))) MlcCredit(mud_channel *pc, int fd, unsigned short credit)
+{
+ mud_device *pd = &msp->device[pc->dindex];
+ unsigned char buf[HPMUD_BUFFER_SIZE];
+ int stat=0, len, n;
+ MLCCredit *pCmd;
+ MLCCreditReply *pReply;
+
+ memset(buf, 0, sizeof(MLCCredit));
+ pCmd = (MLCCredit *)buf;
+ n = sizeof(MLCCredit);
+ pCmd->h.length = htons(n);
+ pCmd->cmd = MLC_CREDIT;
+ pCmd->hsocket = pc->sockid; /* assume static socket ids */
+ pCmd->psocket = pc->sockid;
+ pCmd->credit = htons(credit); /* set peripheral to host credit */
+
+ if ((len = (pd->vf.write)(fd, pCmd, n, HPMUD_EXCEPTION_TIMEOUT)) != n)
+ {
+ BUG("unable to write MlcCredit: %m\n");
+ stat = 1;
+ goto bugout;
+ }
+
+ stat = MlcReverseReply(pc, fd, buf, sizeof(buf));
+ pReply = (MLCCreditReply *)buf;
+
+ if ((stat != 0) || (pReply->cmd != (0x80 | MLC_CREDIT)) || (pReply->result != 0))
+ {
+ BUG("invalid MlcCreditReply: cmd=%x, result=%x\n", pReply->cmd, pReply->result);
+ stat = 1;
+ goto bugout;
+ }
+
+ pc->ta.p2hcredit += credit;
+
+bugout:
+ return stat;
+}
+
+int __attribute__ ((visibility ("hidden"))) MlcCreditRequest(mud_channel *pc, int fd, unsigned short credit)
+{
+ mud_device *pd = &msp->device[pc->dindex];
+ unsigned char buf[HPMUD_BUFFER_SIZE];
+ int stat=0, len, n;
+ MLCCreditRequest *pCmd;
+ MLCCreditRequestReply *pReply;
+
+ memset(buf, 0, sizeof(MLCCreditRequest));
+ pCmd = (MLCCreditRequest *)buf;
+ n = sizeof(MLCCreditRequest);
+ pCmd->h.length = htons(n);
+ pCmd->cmd = MLC_CREDIT_REQUEST;
+ pCmd->hsocket = pc->sockid; /* assume static socket ids */
+ pCmd->psocket = pc->sockid;
+ pCmd->credit = htons(credit); /* request host to peripheral credit */
+
+ if ((len = (pd->vf.write)(fd, pCmd, n, HPMUD_EXCEPTION_TIMEOUT)) != n)
+ {
+ BUG("unable to write MlcCreditRequest: %m\n");
+ stat = 1;
+ goto bugout;
+ }
+
+ stat = MlcReverseReply(pc, fd, buf, sizeof(buf));
+ pReply = (MLCCreditRequestReply *)buf;
+
+ if ((stat != 0) || (pReply->cmd != (0x80 | MLC_CREDIT_REQUEST)) || (pReply->result != 0))
+ {
+ BUG("invalid MlcCreditRequestReply: cmd=%x, result=%x\n", pReply->cmd, pReply->result);
+ stat = 1;
+ goto bugout;
+ }
+
+ pc->ta.h2pcredit += ntohs(pReply->credit);
+
+bugout:
+ return stat;
+}
+
+
+
diff --git a/io/hpmud/mlc.h b/io/hpmud/mlc.h
new file mode 100644
index 0000000..afc6b22
--- /dev/null
+++ b/io/hpmud/mlc.h
@@ -0,0 +1,150 @@
+/*****************************************************************************\
+
+ mlc.h - MLC support for multi-point transport driver
+
+ (c) 2004-2007 Copyright Hewlett-Packard Development Company, LP
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+ of the Software, and to permit persons to whom the Software is furnished to do
+ so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+\*****************************************************************************/
+
+#ifndef _MLC_H
+#define _MLC_H
+
+enum MLC_COMMAND
+{
+ MLC_INIT = 0,
+ MLC_OPEN_CHANNEL = 1,
+ MLC_CLOSE_CHANNEL = 2,
+ MLC_CREDIT = 3,
+ MLC_CREDIT_REQUEST = 4,
+ MLC_DEBIT = 5,
+ MLC_DEBIT_REQUEST = 6,
+ MLC_CONFIG_SOCKET = 7,
+ MLC_EXIT = 8,
+ MLC_ERROR = 0x7f
+};
+
+typedef struct
+{
+ unsigned char hsid; /* host socket id */
+ unsigned char psid; /* peripheral socket id */
+ unsigned short length; /* packet length (includes header) */
+ unsigned char credit; /* data packet credit, reserved if command */
+ unsigned char status; /* upper layer status */
+} __attribute__((packed)) MLCHeader;
+
+typedef struct
+{
+ MLCHeader h;
+ unsigned char cmd;
+ unsigned char rev;
+} __attribute__((packed)) MLCInit;
+
+typedef struct
+{
+ MLCHeader h;
+ unsigned char cmd;
+ unsigned char result;
+ unsigned char rev;
+} __attribute__((packed)) MLCInitReply;
+
+typedef struct
+{
+ MLCHeader h;
+ unsigned char cmd;
+} __attribute__((packed)) MLCExit;
+
+typedef struct
+{
+ MLCHeader h;
+ unsigned char cmd;
+ unsigned char result;
+} __attribute__((packed)) MLCExitReply;
+
+typedef struct
+{
+ MLCHeader h;
+ unsigned char cmd;
+ unsigned char socket; /* socket id */
+ unsigned short h2psize; /* host-to-peripheral packet size */
+ unsigned short p2hsize; /* peripheral-to-host packet size */
+ unsigned char status; /* status level */
+} __attribute__((packed)) MLCConfigSocket;
+
+typedef struct
+{
+ MLCHeader h;
+ unsigned char cmd;
+ unsigned char result;
+ unsigned short h2psize; /* host-to-peripheral packet size */
+ unsigned short p2hsize; /* peripheral-to-host packet size */
+ unsigned char status; /* status level */
+} __attribute__((packed)) MLCConfigSocketReply;
+
+typedef struct
+{
+ MLCHeader h;
+ unsigned char cmd;
+ unsigned char hsocket; /* host socket id */
+ unsigned char psocket; /* peripheral socket id */
+ unsigned short credit;
+} __attribute__((packed)) MLCOpenChannel;
+
+typedef struct
+{
+ MLCHeader h;
+ unsigned char cmd;
+ unsigned char result;
+ unsigned short credit;
+} __attribute__((packed)) MLCOpenChannelReply;
+
+typedef struct
+{
+ MLCHeader h;
+ unsigned char cmd;
+ unsigned char hsocket; /* host socket id */
+ unsigned char psocket; /* peripheral socket id */
+} __attribute__((packed)) MLCCloseChannel;
+
+typedef MLCExitReply MLCCloseChannelReply;
+typedef MLCExitReply MLCReply;
+typedef MLCExit MLCCmd;
+typedef MLCOpenChannel MLCCredit;
+typedef MLCExitReply MLCCreditReply;
+typedef MLCOpenChannel MLCCreditRequest;
+typedef MLCOpenChannelReply MLCCreditRequestReply;
+typedef MLCExitReply MLCError;
+
+struct _mud_device;
+struct _mud_channel;
+
+int __attribute__ ((visibility ("hidden"))) cut_buf(struct _mud_channel *pc, char *buf, int size);
+int __attribute__ ((visibility ("hidden"))) MlcInit(struct _mud_channel *pc, int fd);
+int __attribute__ ((visibility ("hidden"))) MlcExit(struct _mud_channel *pc, int fd);
+int __attribute__ ((visibility ("hidden"))) MlcConfigSocket(struct _mud_channel *pc, int fd);
+int __attribute__ ((visibility ("hidden"))) MlcForwardData(struct _mud_channel *pc, int fd, const void *buf, int size, int usec_timeout);
+int __attribute__ ((visibility ("hidden"))) MlcReverseData(struct _mud_channel *pc, int fd, void *buf, int length, int usec_timeout);
+int __attribute__ ((visibility ("hidden"))) MlcOpenChannel(struct _mud_channel *pc, int fd);
+int __attribute__ ((visibility ("hidden"))) MlcCloseChannel(struct _mud_channel *pc, int fd);
+int __attribute__ ((visibility ("hidden"))) MlcCredit(struct _mud_channel *pc, int fd, unsigned short credit);
+int __attribute__ ((visibility ("hidden"))) MlcCreditRequest(struct _mud_channel *pc, int fd, unsigned short credit);
+int __attribute__ ((visibility ("hidden"))) MlcReverseCmd(struct _mud_channel *pc, int fd);
+
+#endif // _MLC_H
+
diff --git a/io/hpmud/model.c b/io/hpmud/model.c
new file mode 100644
index 0000000..3678af5
--- /dev/null
+++ b/io/hpmud/model.c
@@ -0,0 +1,633 @@
+/*****************************************************************************\
+
+ model.c - model parser for hplip devices
+
+ (c) 2006-2007 Copyright Hewlett-Packard Development Company, LP
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+ of the Software, and to permit persons to whom the Software is furnished to do
+ so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+\*****************************************************************************/
+
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE
+#endif
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <string.h>
+#include <unistd.h>
+#include <stdarg.h>
+#include "list.h"
+#include "hpmud.h"
+#include "hpmudi.h"
+
+#define SECTION_SIZE 4096 /* Rough estimate of key/value section size in bytes. */
+
+typedef struct
+{
+ char *name;
+ char *incFile;
+ int valueSize; /* size of list in bytes */
+ char *value; /* list of key/value pairs */
+ struct list_head list;
+} LabelRecord;
+
+static LabelRecord head; /* list of labels from include files */
+static char homedir[255] = "";
+
+static int GetPair(char *buf, int buf_len, char *key, char *value, char **tail)
+{
+ int i=0, j;
+
+ key[0] = 0;
+ value[0] = 0;
+
+ if (buf[i] == '#')
+ {
+ for (; buf[i] != '\n' && i < buf_len; i++); /* eat comment line */
+ if (buf[i] == '\n')
+ i++; /* bump past '\n' */
+ }
+
+ j = 0;
+ while ((buf[i] != '=') && (i < buf_len) && (j < HPMUD_LINE_SIZE))
+ key[j++] = buf[i++];
+ for (j--; key[j] == ' ' && j > 0; j--); /* eat white space before = */
+ key[++j] = 0;
+
+ if (buf[i] == '=')
+ for (i++; buf[i] == ' ' && i < buf_len; i++); /* eat white space after = */
+
+ j = 0;
+ while ((buf[i] != '\n') && (i < buf_len) && (j < HPMUD_LINE_SIZE))
+ value[j++] = buf[i++];
+ for (j--; value[j] == ' ' && j > 0; j--); /* eat white space before \n */
+ value[++j] = 0;
+
+ if (buf[i] == '\n')
+ i++; /* bump past '\n' */
+
+ if (tail != NULL)
+ *tail = buf + i; /* tail points to next line */
+
+ return i;
+}
+
+static int ReadConfig()
+{
+ char key[HPMUD_LINE_SIZE];
+ char value[HPMUD_LINE_SIZE];
+ char rcbuf[255];
+ char section[32];
+ char *tail;
+ FILE *inFile = NULL;
+ int stat=1;
+
+ homedir[0] = 0;
+
+ if((inFile = fopen(CONFDIR "/hplip.conf", "r")) == NULL)
+ {
+ BUG("unable to open %s: %m\n", CONFDIR "/hplip.conf");
+ goto bugout;
+ }
+
+ section[0] = 0;
+
+ /* Read the config file */
+ while ((fgets(rcbuf, sizeof(rcbuf), inFile) != NULL))
+ {
+ if (rcbuf[0] == '[')
+ {
+ strncpy(section, rcbuf, sizeof(section)); /* found new section */
+ continue;
+ }
+
+ GetPair(rcbuf, strlen(rcbuf), key, value, &tail);
+
+ if ((strncasecmp(section, "[dirs]", 6) == 0) && (strcasecmp(key, "home") == 0))
+ {
+ strncpy(homedir, value, sizeof(homedir));
+ break; /* done */
+ }
+ }
+
+ stat = 0;
+
+bugout:
+ if (inFile != NULL)
+ fclose(inFile);
+
+ return stat;
+}
+
+/* Find last occurance of y in x. */
+static char *strrstr(const char *x, const char *y)
+{
+ char *prev=NULL, *next;
+
+ if (*y == '\0')
+ return strchr(x, '\0');
+
+ while ((next = strstr(x, y)) != NULL)
+ {
+ prev = next;
+ x = next + 1;
+ }
+ return prev;
+}
+
+static int CopyLabel(char *label, char *buf, int bufSize)
+{
+ struct list_head *p;
+ LabelRecord *pl;
+ int i=0, found=0;
+
+ /* Look for label. */
+ list_for_each(p, &head.list)
+ {
+ pl = list_entry(p, LabelRecord, list);
+ if (strcasecmp(pl->name, label) == 0)
+ {
+ found = 1; /* found label */
+ break;
+ }
+ }
+
+ if (!found)
+ {
+ BUG("error undefined label %s\n", label);
+ goto bugout;
+ }
+
+ if (pl->valueSize > bufSize)
+ {
+ BUG("error label %s size=%d buf=%d\n", label, pl->valueSize, bufSize);
+ goto bugout;
+ }
+
+ memcpy(buf, pl->value, pl->valueSize);
+ i=pl->valueSize;
+
+bugout:
+ return i;
+}
+
+static int ResolveAttributes(FILE *fp, char *attr, int attrSize)
+{
+ char label[128];
+ int i=0, j, ch;
+
+ /* Process each key/value line. */
+ ch = fgetc(fp);
+ while (ch != EOF)
+ {
+ if (ch == '[')
+ {
+ ungetc(ch, fp); /* found new section, done with current section */
+ break;
+ }
+
+ if (ch == '#' || ch == ' ')
+ {
+ while ((ch = fgetc(fp)) != '\n' && ch != EOF); /* skip line */
+ }
+ else if (ch == '\n')
+ {
+ /* skip blank line */
+ }
+ else if (ch == '%')
+ {
+ j=0;
+ while ((ch = fgetc(fp)) != '\n' && ch != EOF) /* get label */
+ {
+ if (j < sizeof(label)-1)
+ label[j++] = ch;
+ }
+ label[j-1] = 0;
+ i += CopyLabel(label, attr+i, attrSize-i);
+ }
+ else
+ {
+ if (i < attrSize-1)
+ attr[i++] = ch;
+ while ((ch = fgetc(fp)) != '\n' && ch != EOF) /* get key/value line */
+ {
+ if (i < attrSize-1)
+ attr[i++] = ch;
+ }
+ if (i < attrSize-1)
+ attr[i++] = '\n';
+ }
+
+ if (ch == '\n')
+ ch = fgetc(fp); /* bump to next line */
+ continue;
+ }
+
+ attr[i] = 0; /* terminate string */
+
+ return i;
+}
+static int RegisterLabel(FILE *fp, char *incFile, char *label)
+{
+ struct list_head *p;
+ LabelRecord *pl;
+ char buf[SECTION_SIZE];
+ int i=0, stat=1, ch;
+
+ /* Look for duplicate label. */
+ list_for_each(p, &head.list)
+ {
+ pl = list_entry(p, LabelRecord, list);
+ if (strcasecmp(pl->name, label) == 0)
+ {
+ BUG("error duplicate label %s\n", label);
+ goto bugout;
+ }
+ }
+
+ if ((pl = (LabelRecord *)malloc(sizeof(LabelRecord))) == NULL)
+ {
+ BUG("unable to creat label record: %m\n");
+ goto bugout;
+ }
+
+ pl->incFile = strdup(incFile);
+ pl->name = strdup(label);
+
+ /* Process each key/value line. */
+ ch = fgetc(fp);
+ while (ch != EOF)
+ {
+ if (ch == '[')
+ {
+ ungetc(ch, fp); /* found new section, done with label */
+ break;
+ }
+
+ if (ch == '#' || ch == ' ')
+ {
+ while ((ch = fgetc(fp)) != '\n' && ch != EOF); /* skip line */
+ }
+ else if (ch == '\n')
+ {
+ /* skip blank line */
+ }
+ else
+ {
+ if (i < SECTION_SIZE-1)
+ buf[i++] = ch;
+ while ((ch = fgetc(fp)) != '\n' && ch != EOF) /* get key/value line */
+ {
+ if (i < SECTION_SIZE-1)
+ buf[i++] = ch;
+ }
+ if (i < SECTION_SIZE-1)
+ buf[i++] = '\n';
+ }
+
+ if (ch == '\n')
+ ch = fgetc(fp); /* bump to next line */
+ continue;
+ }
+
+ buf[i] = 0; /* terminate string */
+
+ pl->value = strdup(buf);
+ pl->valueSize = i; /* size does not include zero termination */
+
+ list_add(&(pl->list), &(head.list));
+ stat = 0;
+
+bugout:
+
+ return stat;
+}
+
+static int UnRegisterLabel(LabelRecord *pl)
+{
+ if (pl->incFile)
+ free(pl->incFile);
+ if (pl->name)
+ free(pl->name);
+ if (pl->value)
+ free(pl->value);
+ list_del(&(pl->list));
+ free(pl);
+ return 0;
+}
+
+static int DelList()
+{
+ struct list_head *p, *n;
+ LabelRecord *pl;
+
+ /* Remove each label. */
+ list_for_each_safe(p, n, &head.list)
+ {
+ pl = list_entry(p, LabelRecord, list);
+ UnRegisterLabel(pl);
+ }
+ return 0;
+}
+
+/* Parse *.inc file. */
+static int ParseInc(char *incFile)
+{
+ FILE *fp=NULL;
+ struct list_head *p;
+ LabelRecord *pl;
+ char rcbuf[255];
+ char section[128];
+ int stat=1, n;
+
+ /* Look for duplicate include file. */
+ list_for_each(p, &head.list)
+ {
+ pl = list_entry(p, LabelRecord, list);
+ if (strcmp(pl->incFile, incFile) == 0)
+ {
+ BUG("error duplicate include file %s\n", incFile);
+ goto bugout;
+ }
+ }
+
+ if ((fp = fopen(incFile, "r")) == NULL)
+ {
+ BUG("open %s failed: %m\n", incFile);
+ goto bugout;
+ }
+
+ section[0] = 0;
+
+ /* Read the *.inc file, check each line for new label. */
+ while ((fgets(rcbuf, sizeof(rcbuf), fp) != NULL))
+ {
+ if (rcbuf[0] == '[')
+ {
+ strncpy(section, rcbuf+1, sizeof(section)); /* found new section */
+ n = strlen(section);
+ section[n-2]=0; /* remove ']' and CR */
+ RegisterLabel(fp, incFile, section);
+ }
+ }
+
+ stat = 0;
+
+bugout:
+ if (fp)
+ fclose(fp);
+ return stat;
+}
+
+/* Parse *.dat file. */
+static int ParseFile(char *datFile, char *model, char *attr, int attrSize, int *bytes_read)
+{
+ FILE *fp;
+ char rcbuf[255];
+ char section[128];
+ char file[128];
+ int found=0, n;
+
+ if ((fp = fopen(datFile, "r")) == NULL)
+ goto bugout;
+
+ section[0] = 0;
+
+ /* Read the *.dat file, check each line for model match. */
+ while ((fgets(rcbuf, sizeof(rcbuf), fp) != NULL))
+ {
+ if (rcbuf[0] == '[')
+ {
+ strncpy(section, rcbuf+1, sizeof(section)); /* found new section */
+ n = strlen(section);
+ section[n-2]=0; /* remove ']' and CR */
+ if (strcasecmp(model, section) == 0)
+ {
+ /* Found model match. */
+ *bytes_read = ResolveAttributes(fp, attr, attrSize);
+ found = 1;
+ break;
+ }
+ }
+ else if (strncmp(rcbuf, "%include", 8) == 0)
+ {
+ strncpy(file, datFile, sizeof(file)); /* get dirname from *.dat file */
+ n = strrstr(file, "/") - file + 1;
+ strncpy(file+n, rcbuf+9, sizeof(file)-n); /* concatenate include filename to dirname */
+ n = strlen(file);
+ file[n-1]=0; /* remove CR */
+ ParseInc(file);
+ }
+ }
+
+bugout:
+ if (fp)
+ fclose(fp);
+
+ return found;
+}
+
+/* Parse and convert all known key value pairs in buffer. Do sanity check on values. */
+static int parse_key_value_pair(char *buf, int len, struct hpmud_model_attributes *ma)
+{
+ char key[HPMUD_LINE_SIZE];
+ char value[HPMUD_LINE_SIZE];
+ char *tail, *tail2;
+ int i=0, ret=HPMUD_R_OK;
+
+ ma->prt_mode = HPMUD_RAW_MODE;
+ ma->mfp_mode = HPMUD_DOT4_MODE;
+ ma->scantype = 0;
+ ma->statustype = HPMUD_STATUSTYPE_SFIELD;
+ ma->support = HPMUD_SUPPORT_TYPE_NONE;
+
+ if (buf == NULL)
+ return HPMUD_R_OK; /* initialize ma */
+
+ tail = buf;
+
+ while (i < len)
+ {
+ i += GetPair(tail, len-i, key, value, &tail);
+
+ if (strcasecmp(key, "io-mode") == 0)
+ {
+ ma->prt_mode = strtol(value, &tail2, 10); /* uni | raw | mlc */
+ }
+ else if (strcasecmp(key, "io-mfp-mode") == 0)
+ {
+ ma->mfp_mode = strtol(value, &tail2, 10); /* mfc | dot4 */
+ }
+ else if(strcasecmp(key, "scan-type") == 0)
+ {
+ ma->scantype = strtol(value, &tail2, 10); /*SCL, PML, SOAP, MARVELL, LEDM*/
+ }
+ else if(strcasecmp(key, "scan-src") == 0)
+ {
+ ma->scansrc = strtol(value, &tail2, 10); /*Flatbed, ADF, Camera or combination of these*/
+ }
+ else if(strcasecmp(key, "status-type") == 0)
+ {
+ ma->statustype = strtol(value, &tail2, 10);
+ }
+ else if(strcasecmp(key, "support-type") == 0)
+ {
+ ma->support = strtol(value, &tail2, 10);
+ }
+ else if(strcasecmp(key, "plugin") == 0)
+ {
+ ma->plugin = strtol(value, &tail2, 10);
+ }
+ else
+ {
+ /* Unknown keys are ignored (R_AOK). */
+ }
+ } // end while (i < len)
+
+ return ret;
+}
+
+/* Request device model attributes for URI. Return all attributes. */
+enum HPMUD_RESULT hpmud_get_model_attributes(char *uri, char *attr, int attrSize, int *bytes_read)
+{
+ char sz[256];
+ char model[256];
+ int found;
+ enum HPMUD_RESULT stat = HPMUD_R_DATFILE_ERROR;
+
+ memset(attr, 0, attrSize);
+
+ INIT_LIST_HEAD(&head.list);
+
+ if (homedir[0] == 0)
+ ReadConfig();
+
+ hpmud_get_uri_model(uri, model, sizeof(model));
+
+ /* Search /data/models.dat file for specified model. */
+ snprintf(sz, sizeof(sz), "%s/data/models/models.dat", homedir);
+ found = ParseFile(sz, model, attr, attrSize, bytes_read); /* save any labels in *.inc files */
+
+ if (!found)
+ {
+ BUG("no %s attributes found in %s\n", model, sz);
+
+ DelList(); /* Unregister all labels. */
+
+ /* Search /data/models/unreleased/unreleased.dat file for specified model. */
+ snprintf(sz, sizeof(sz), "%s/data/models/unreleased/unreleased.dat", homedir);
+ found = ParseFile(sz, model, attr, attrSize, bytes_read); /* save any *.inc files */
+ }
+
+ if (!found)
+ {
+ BUG("no %s attributes found in %s\n", model, sz);
+ goto bugout;
+ }
+
+ stat = HPMUD_R_OK;
+
+bugout:
+ DelList(); /* Unregister all labels. */
+ return stat;
+}
+
+/* Request device model attributes for URI. Return filled in hpmud_model_attributes structure. */
+enum HPMUD_RESULT hpmud_query_model(char *uri, struct hpmud_model_attributes *ma)
+{
+ char buf[SECTION_SIZE];
+ int len;
+ enum HPMUD_RESULT stat = HPMUD_R_DATFILE_ERROR;
+
+ parse_key_value_pair(NULL, 0, ma); /* set ma defaults */
+
+ if (hpmud_get_model_attributes(uri, buf, sizeof(buf), &len) != 0)
+ goto bugout; /* model not found, return ma defaults */
+
+ parse_key_value_pair(buf, len, ma);
+
+ stat=HPMUD_R_OK;
+
+bugout:
+
+ return stat;
+}
+
+/* Get value for specified section and key from hplip.conf. */
+enum HPMUD_RESULT hpmud_get_conf(const char *section, const char *key, char *value, int value_size)
+{
+ return hpmud_get_key_value(CONFDIR "/hplip.conf", section, key, value, value_size);
+}
+
+/* Get value for specified section and key from specified file. */
+enum HPMUD_RESULT hpmud_get_key_value(const char *file, const char *section, const char *key, char *value, int value_size)
+{
+ char new_key[HPMUD_LINE_SIZE];
+ char new_value[HPMUD_LINE_SIZE];
+ char rcbuf[255];
+ char new_section[32];
+ char *tail;
+ FILE *inFile;
+ enum HPMUD_RESULT stat = HPMUD_R_DATFILE_ERROR;
+ int i,j;
+
+ if((inFile = fopen(file, "r")) == NULL)
+ {
+ BUG("unable to open %s: %m\n", file);
+ goto bugout;
+ }
+
+ new_section[0] = 0;
+
+ /* Read the config file */
+ while ((fgets(rcbuf, sizeof(rcbuf), inFile) != NULL))
+ {
+ if (rcbuf[0] == '[')
+ {
+ i = j = 0;
+ while ((rcbuf[i] != ']') && (j < (sizeof(new_section)-2)))
+ new_section[j++] = rcbuf[i++];
+ new_section[j++] = rcbuf[i++]; /* ']' */
+ new_section[j] = 0; /* zero terminate */
+ continue;
+ }
+
+ GetPair(rcbuf, strlen(rcbuf), new_key, new_value, &tail);
+
+ if ((strcasecmp(new_section, section) == 0) && (strcasecmp(new_key, key) == 0))
+ {
+ strncpy(value, new_value, value_size);
+ stat = HPMUD_R_OK;
+ break; /* done */
+ }
+ }
+
+ if (stat != HPMUD_R_OK)
+ BUG("unable to find %s %s in %s\n", section, key, file);
+
+bugout:
+ if (inFile != NULL)
+ fclose(inFile);
+
+ return stat;
+}
+
diff --git a/io/hpmud/musb.c b/io/hpmud/musb.c
new file mode 100644
index 0000000..1649297
--- /dev/null
+++ b/io/hpmud/musb.c
@@ -0,0 +1,2197 @@
+/*****************************************************************************\
+
+ musb.c - USB support for multi-point transport driver
+
+ (c) 2010 Copyright Hewlett-Packard Development Company, LP
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+ of the Software, and to permit persons to whom the Software is furnished to do
+ so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ Client/Server generic message format (see messaging-protocol.doc):
+
+ Author: Naga Samrat Chowdary Narla, Sarbeswar Meher
+\*****************************************************************************/
+
+#include "hpmud.h"
+#include "hpmudi.h"
+
+mud_device_vf __attribute__ ((visibility ("hidden"))) musb_mud_device_vf =
+{
+ .read = musb_read,
+ .write = musb_write,
+ .open = musb_open,
+ .close = musb_close,
+ .get_device_id = musb_get_device_id,
+ .get_device_status = musb_get_device_status,
+ .channel_open = musb_channel_open,
+ .channel_close = musb_channel_close,
+ .channel_write = musb_channel_write,
+ .channel_read = musb_channel_read
+};
+
+static mud_channel_vf musb_raw_channel_vf =
+{
+ .open = musb_raw_channel_open,
+ .close = musb_raw_channel_close,
+ .channel_write = musb_raw_channel_write,
+ .channel_read = musb_raw_channel_read
+};
+
+static mud_channel_vf musb_comp_channel_vf =
+{
+ .open = musb_comp_channel_open,
+ .close = musb_raw_channel_close,
+ .channel_write = musb_raw_channel_write,
+ .channel_read = musb_raw_channel_read
+};
+
+static mud_channel_vf musb_mlc_channel_vf =
+{
+ .open = musb_mlc_channel_open,
+ .close = musb_mlc_channel_close,
+ .channel_write = musb_mlc_channel_write,
+ .channel_read = musb_mlc_channel_read
+};
+
+static mud_channel_vf musb_dot4_channel_vf =
+{
+ .open = musb_dot4_channel_open,
+ .close = musb_dot4_channel_close,
+ .channel_write = musb_dot4_channel_write,
+ .channel_read = musb_dot4_channel_read
+};
+
+/*
+ * The folloing fd arrays must match "enum FD_ID" definition.
+ */
+
+static char *fd_name[MAX_FD] =
+{
+ "na",
+ "7/1/2",
+ "7/1/3",
+ "ff/1/1",
+ "ff/2/1",
+ "ff/3/1",
+ "ff/ff/ff",
+ "ff/d4/0",
+ "ff/4/1",
+ "ff/1/0",
+ "ff/cc/0",
+ "ff/2/10",
+};
+
+static int fd_class[MAX_FD] =
+{
+ 0,0x7,0x7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+};
+
+static int fd_subclass[MAX_FD] =
+{
+ 0,0x1,0x1,0x1,0x2,0x3,0xff,0xd4,0x4,0x1,0xcc,0x2,
+};
+
+static int fd_protocol[MAX_FD] =
+{
+ 0,0x2,0x3,0x1,0x1,0x1,0xff,0,0x1,0,0,0x10,
+};
+
+static const unsigned char venice_power_on[] = {0x1b, '%','P','u','i','f','p','.','p','o','w','e','r',' ','1',';',
+ 'u','d','w','.','q','u','i','t',';',0x1b,'%','-','1','2','3','4','5','X' };
+
+static struct usb_device *libusb_device; /* libusb device referenced by URI */
+//static int open_fd; /* 7/1/2 file descriptor, used by deviceid and status */
+static file_descriptor fd_table[MAX_FD]; /* usb file descriptors */
+
+/* This function is similar to usb_get_string_simple, but it handles zero returns. */
+static int get_string_descriptor(usb_dev_handle *dev, int index, char *buf, size_t buflen)
+{
+ char tbuf[255]; /* Some devices choke on size > 255 */
+ int ret, si, di, cnt=5;
+
+ while (cnt--)
+ {
+ ret = usb_control_msg(dev, USB_ENDPOINT_IN, USB_REQ_GET_DESCRIPTOR, (USB_DT_STRING << 8) + index,
+ 0x409, tbuf, sizeof(tbuf), LIBUSB_CONTROL_REQ_TIMEOUT);
+ if (ret==0)
+ {
+ /* This retry is necessary for lj1000 and lj1005. des 12/12/07 */
+ BUG("get_string_descriptor zero result, retrying...");
+ continue;
+ }
+ break;
+ }
+
+ if (ret < 0)
+ {
+ BUG("unable get_string_descriptor %d: %m\n", ret);
+ return ret;
+ }
+
+ if (tbuf[1] != USB_DT_STRING)
+ {
+ BUG("invalid get_string_descriptor tag act=%d exp=%d\n", tbuf[1], USB_DT_STRING);
+ return -EIO;
+ }
+
+ if (tbuf[0] > ret)
+ {
+ BUG("invalid get_string_descriptor size act=%d exp=%d\n", tbuf[0], ret);
+ return -EFBIG;
+ }
+
+ for (di = 0, si = 2; si < tbuf[0]; si += 2)
+ {
+ if (di >= (buflen - 1))
+ break;
+
+ if (tbuf[si + 1]) /* high byte */
+ buf[di++] = '0';
+ else
+ buf[di++] = tbuf[si];
+ }
+
+ buf[di] = 0;
+
+ return di;
+}
+
+/* Check for USB interface descriptor with specified class. */
+static int is_interface(struct usb_device *dev, int dclass)
+{
+ struct usb_interface_descriptor *pi;
+ int i, j, k;
+
+ for (i=0; i<dev->descriptor.bNumConfigurations; i++)
+ {
+ for (j=0; j<dev->config[i].bNumInterfaces; j++)
+ {
+ for (k=0; k<dev->config[i].interface[j].num_altsetting; k++)
+ {
+ pi = &dev->config[i].interface[j].altsetting[k];
+ if (pi->bInterfaceClass == dclass)
+ {
+ return 1; /* found interface */
+ }
+ }
+ }
+ }
+ return 0; /* no interface found */
+}
+
+/* Write HP vendor-specific ECP channel message. */
+static int write_ecp_channel(file_descriptor *pfd, int value)
+{
+ usb_dev_handle *hd;
+ int interface = pfd->interface;
+ int len, stat=1;
+ char byte;
+
+ if (pfd->hd == NULL)
+ {
+ BUG("invalid write_ecp_channel state\n");
+ goto bugout;
+ }
+
+ hd = pfd->hd;
+
+ len = usb_control_msg(hd,
+ USB_ENDPOINT_IN | USB_TYPE_VENDOR | USB_RECIP_INTERFACE, /* bmRequestType */
+ USB_REQ_GET_STATUS, /* bRequest */
+ value, /* wValue */
+ interface, /* wIndex */
+ &byte, 1, LIBUSB_CONTROL_REQ_TIMEOUT);
+
+ if (len != 1)
+ {
+ BUG("invalid write_ecp_channel: %m\n");
+ goto bugout;
+ }
+
+ stat = 0;
+
+bugout:
+ return stat;
+}
+
+/* Set Cypress USS-725 Bridge Chip to 1284.4 mode. */
+static int bridge_chip_up(file_descriptor *pfd)
+{
+ usb_dev_handle *hd;
+ int len, stat=1;
+ char buf[9];
+ char nullByte=0;
+
+ if (pfd->hd == NULL)
+ {
+ BUG("invalid bridge_chip_up state\n");
+ goto bugout;
+ }
+
+ hd = pfd->hd;
+
+ memset(buf, 0, sizeof(buf));
+
+ /* Read register values. */
+ len = usb_control_msg(hd,
+ USB_ENDPOINT_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, /* bmRequestType */
+ USB_REQ_SET_FEATURE, /* bRequest */
+ 0, /* wValue */
+ 0, /* wIndex */
+ buf, sizeof(buf), LIBUSB_CONTROL_REQ_TIMEOUT);
+ if (len < 0)
+ {
+ BUG("invalid write_bridge_up: %m\n");
+ goto bugout;
+ }
+
+ /* Check for auto ECP mode. */
+ if (buf[ECRR] != 0x43)
+ {
+ /* Place 725 chip in register mode. */
+ len = usb_control_msg(hd,
+ USB_ENDPOINT_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, /* bmRequestType */
+ 0x04, /* bRequest */
+ 0x0758, /* wValue */
+ 0, /* wIndex */
+ NULL, 0, LIBUSB_CONTROL_REQ_TIMEOUT);
+ /* Turn off RLE in auto ECP mode. */
+ len = usb_control_msg(hd,
+ USB_ENDPOINT_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, /* bmRequestType */
+ 0x04, /* bRequest */
+ 0x0a1d, /* wValue */
+ 0, /* wIndex */
+ NULL, 0, LIBUSB_CONTROL_REQ_TIMEOUT);
+ /* Place 725 chip in auto ECP mode. */
+ len = usb_control_msg(hd,
+ USB_ENDPOINT_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, /* bmRequestType */
+ 0x04, /* bRequest */
+ 0x0759, /* wValue */
+ 0, /* wIndex */
+ NULL, 0, LIBUSB_CONTROL_REQ_TIMEOUT);
+ /* Force negotiation. */
+ len = usb_control_msg(hd,
+ USB_ENDPOINT_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, /* bmRequestType */
+ 0x04, /* bRequest */
+ 0x0817, /* wValue */
+ 0, /* wIndex */
+ NULL, 0, LIBUSB_CONTROL_REQ_TIMEOUT);
+ /* Read register values. */
+ len = usb_control_msg(hd,
+ USB_ENDPOINT_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, /* bmRequestType */
+ USB_REQ_SET_FEATURE, /* bRequest */
+ 0, /* wValue */
+ 0, /* wIndex */
+ buf, sizeof(buf), LIBUSB_CONTROL_REQ_TIMEOUT);
+ if (buf[ECRR] != 0x43)
+ {
+ BUG("invalid auto ecp mode mode=%d\n", buf[ECRR]);
+ }
+ }
+
+ /* Reset to ECP channel 0. */
+ len = usb_control_msg(hd,
+ USB_ENDPOINT_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, /* bmRequestType */
+ 0x04, /* bRequest */
+ 0x05ce, /* wValue */
+ 0, /* wIndex */
+ NULL, 0, LIBUSB_CONTROL_REQ_TIMEOUT);
+ musb_write(pfd->fd, &nullByte, 1, HPMUD_EXCEPTION_TIMEOUT);
+
+ /* Switch to ECP channel 77. */
+ len = usb_control_msg(hd,
+ USB_ENDPOINT_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, /* bmRequestType */
+ 0x04, /* bRequest */
+ 0x05cd, /* wValue */
+ 0, /* wIndex */
+ NULL, 0, LIBUSB_CONTROL_REQ_TIMEOUT);
+
+ stat = 0;
+
+bugout:
+ return stat;
+}
+
+/* Set Cypress USS-725 Bridge Chip to compatibility mode. */
+static int bridge_chip_down(file_descriptor *pfd)
+{
+ usb_dev_handle *hd;
+ int len, stat=1;
+
+ if (pfd->hd == NULL)
+ {
+ BUG("invalid bridge_chip_down state\n");
+ goto bugout;
+ }
+
+ hd = pfd->hd;
+
+ len = usb_control_msg(hd,
+ USB_ENDPOINT_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, /* bmRequestType */
+ 0x04, /* bRequest */
+ 0x080f, /* wValue */
+ 0, /* wIndex */
+ NULL, 0, LIBUSB_CONTROL_REQ_TIMEOUT);
+ if (len < 0)
+ {
+ BUG("invalid write_bridge_up: %m\n");
+ goto bugout;
+ }
+
+ stat = 0;
+
+bugout:
+ return stat;
+}
+
+/* Write HP vendor-specific Setup command. */
+static int write_phoenix_setup(file_descriptor *pfd)
+{
+ usb_dev_handle *hd;
+ int len, stat=1;
+
+ if (pfd->hd == NULL)
+ {
+ BUG("invalid write_phoenix_setup state\n");
+ goto bugout;
+ }
+
+ hd = pfd->hd;
+
+ len = usb_control_msg(hd,
+ USB_ENDPOINT_OUT | USB_TYPE_CLASS | USB_RECIP_OTHER, /* bmRequestType */
+ 0x02, /* bRequest */
+ 0, /* wValue */
+ 0, /* wIndex */
+ NULL, 0, LIBUSB_CONTROL_REQ_TIMEOUT);
+
+ if (len < 0)
+ {
+ BUG("invalid write_phoenix_setup: %m\n");
+ goto bugout;
+ }
+
+ stat = 0;
+
+bugout:
+ return stat;
+}
+
+/* Detach any kernel module that may have claimed specified inteface. */
+static int detach(usb_dev_handle *hd, int interface)
+{
+ char driver[32];
+
+ driver[0] = 0;
+
+#ifdef LIBUSB_HAS_DETACH_KERNEL_DRIVER_NP
+ /* If any kernel module (ie:usblp) has claimed this interface, detach it. */
+ usb_get_driver_np(hd, interface, driver, sizeof(driver));
+ if ((driver[0] != 0) && (strcasecmp(driver, "usbfs") != 0))
+ {
+ DBG("removing %s driver interface=%d\n", driver, interface);
+ if (usb_detach_kernel_driver_np(hd, interface) < 0)
+ BUG("could not remove %s driver interface=%d: %m\n", driver, interface);
+ }
+#endif
+
+ return 0;
+}
+
+/* Get interface descriptor for specified xx/xx/xx protocol. */
+static int get_interface(struct usb_device *dev, enum FD_ID index, file_descriptor *pfd)
+{
+ struct usb_interface_descriptor *pi;
+ int i, j, k;
+
+ for (i=0; i<dev->descriptor.bNumConfigurations; i++)
+ {
+ if (dev->config == NULL)
+ goto bugout;
+
+ for (j=0; j<dev->config[i].bNumInterfaces; j++)
+ {
+ if (dev->config[i].interface == NULL)
+ goto bugout;
+
+ for (k=0; k<dev->config[i].interface[j].num_altsetting; k++)
+ {
+ if (dev->config[i].interface[j].altsetting == NULL)
+ goto bugout;
+
+ pi = &dev->config[i].interface[j].altsetting[k];
+ if (pi->bInterfaceClass == fd_class[index] && pi->bInterfaceSubClass == fd_subclass[index] && pi->bInterfaceProtocol == fd_protocol[index])
+ {
+ pfd->config=i; /* found interface */
+ pfd->interface=j;
+ pfd->alt_setting=k;
+ pfd->fd=index;
+ return 0;
+ }
+ }
+ }
+ }
+
+bugout:
+ return 1; /* no interface found */
+}
+
+/* Get out endpoint for specified interface descriptor. */
+static int get_out_ep(struct usb_device *dev, int config, int interface, int altset, int type)
+{
+ struct usb_interface_descriptor *pi;
+ int i;
+
+ if (dev->config == NULL || dev->config[config].interface == NULL || dev->config[config].interface[interface].altsetting == NULL)
+ goto bugout;
+
+ pi = &dev->config[config].interface[interface].altsetting[altset];
+ for (i=0; i<pi->bNumEndpoints; i++)
+ {
+ if (pi->endpoint == NULL)
+ goto bugout;
+ if (pi->endpoint[i].bmAttributes == type && !(pi->endpoint[i].bEndpointAddress & USB_ENDPOINT_DIR_MASK)) {
+ DBG("get_out_ep(type=%d): out=%d\n", type, pi->endpoint[i].bEndpointAddress);
+ return pi->endpoint[i].bEndpointAddress;
+ }
+ }
+
+bugout:
+ DBG("get_out_ep: ERROR! returning -1\n");
+ return -1; /* no endpoint found */
+}
+
+/* Get in endpoint for specified interface descriptor. */
+static int get_in_ep(struct usb_device *dev, int config, int interface, int altset, int type)
+{
+ struct usb_interface_descriptor *pi;
+ int i;
+
+ if (dev->config == NULL || dev->config[config].interface == NULL || dev->config[config].interface[interface].altsetting == NULL)
+ goto bugout;
+
+ pi = &dev->config[config].interface[interface].altsetting[altset];
+ for (i=0; i<pi->bNumEndpoints; i++)
+ {
+ if (pi->endpoint == NULL)
+ goto bugout;
+ if (pi->endpoint[i].bmAttributes == type && (pi->endpoint[i].bEndpointAddress & USB_ENDPOINT_DIR_MASK)) {
+ DBG("get_in_ep(type=%d): out=%d\n", type, pi->endpoint[i].bEndpointAddress);
+ return pi->endpoint[i].bEndpointAddress;
+ }
+ }
+
+bugout:
+ DBG("get_in_ep: ERROR! returning -1\n");
+ return -1; /* no endpoint found */
+}
+
+static int claim_interface(struct usb_device *dev, file_descriptor *pfd)
+{
+ int stat=1;
+
+ if (pfd->hd != NULL)
+ return 0; /* interface is already claimed */
+
+ if ((pfd->hd = usb_open(dev)) == NULL)
+ {
+ BUG("invalid usb_open: %m\n");
+ goto bugout;
+ }
+
+ detach(pfd->hd, pfd->interface);
+
+#if 0 /* hp devices only have one configuration, so far ... */
+ if (usb_set_configuration(FD[fd].pHD, dev->config[config].bConfigurationValue))
+ goto bugout;
+#endif
+
+ if (usb_claim_interface(pfd->hd, pfd->interface))
+ {
+ usb_close(pfd->hd);
+ pfd->hd = NULL;
+ DBG("invalid claim_interface %s: %m\n", fd_name[pfd->fd]);
+ goto bugout;
+ }
+
+ if (usb_set_altinterface(pfd->hd, pfd->alt_setting))
+ {
+ usb_release_interface(pfd->hd, pfd->interface);
+ usb_close(pfd->hd);
+ pfd->hd = NULL;
+ BUG("invalid set_altinterface %s altset=%d: %m\n", fd_name[pfd->fd], pfd->alt_setting);
+ goto bugout;
+ }
+
+ pfd->write_active=0;
+ pthread_mutex_init(&pfd->mutex, NULL);
+ pthread_cond_init(&pfd->write_done_cond, NULL);
+
+ DBG("claimed %s interface\n", fd_name[pfd->fd]);
+
+ stat=0;
+
+bugout:
+ return stat;
+}
+
+static int release_interface(file_descriptor *pfd)
+{
+ if (pfd->hd == NULL)
+ return 0;
+
+ if (pfd->write_active)
+ {
+ BUG("aborting outstanding %s write\n", fd_name[pfd->fd]);
+ pthread_cancel(pfd->tid); /* kill outstanding write */
+ pfd->write_active = 0;
+ }
+
+ usb_release_interface(pfd->hd, pfd->interface);
+ usb_close(pfd->hd);
+ pfd->hd = NULL;
+ pthread_mutex_destroy(&pfd->mutex);
+ pthread_cond_destroy(&pfd->write_done_cond);
+
+ DBG("released %s interface\n", fd_name[pfd->fd]);
+
+ return 0;
+}
+
+/* Claim any open interface which is valid for device_id and device status. */
+static int claim_id_interface(struct usb_device *dev)
+{
+ enum FD_ID i;
+
+ for (i=FD_7_1_2; i!=MAX_FD; i++)
+ {
+ if (get_interface(dev, i, &fd_table[i]) == 0)
+ {
+ if (claim_interface(libusb_device, &fd_table[i]))
+ continue; /* interface is busy, try next interface */
+ break; /* done */
+ }
+ }
+
+ return i;
+}
+
+/* See if this usb device and URI match. */
+static int is_uri(struct usb_device *dev, const char *uri)
+{
+ usb_dev_handle *hd=NULL;
+ char sz[128];
+ char uriModel[128];
+ char uriSerial[128];
+ char gen[128];
+ int r, stat=0;
+
+ if ((hd = usb_open(dev)) == NULL)
+ {
+ BUG("invalid usb_open: %m\n");
+ goto bugout;
+ }
+
+ if (dev->descriptor.idVendor != 0x3f0)
+ goto bugout;
+
+ if ((r=get_string_descriptor(hd, dev->descriptor.iProduct, sz, sizeof(sz))) < 0)
+ {
+ BUG("invalid product id string ret=%d\n", r);
+ goto bugout;
+ }
+
+ generalize_model(sz, gen, sizeof(gen));
+
+ hpmud_get_uri_model(uri, uriModel, sizeof(uriModel));
+ if (strcasecmp(uriModel, gen) != 0)
+ goto bugout;
+
+ if ((r=get_string_descriptor(hd, dev->descriptor.iSerialNumber, sz, sizeof(sz))) < 0)
+ {
+ BUG("invalid serial id string ret=%d\n", r);
+ goto bugout;
+ }
+
+ if (sz[0])
+ generalize_serial(sz, gen, sizeof(gen));
+ else
+ strcpy(gen, "0");
+
+ get_uri_serial(uri, uriSerial, sizeof(uriSerial));
+ if (strcmp(uriSerial, gen) != 0)
+ goto bugout;
+
+ stat = 1; /* found usb device that matches uri */
+
+bugout:
+ if (hd != NULL)
+ usb_close(hd);
+
+ return stat;
+}
+
+/* See if this usb device and serial number match. Return model if match. */
+static int is_serial(struct usb_device *dev, const char *sn, char *model, int model_size)
+{
+ usb_dev_handle *hd=NULL;
+ char sz[128];
+ char gen[128];
+ int r, stat=0;
+
+ if ((hd = usb_open(dev)) == NULL)
+ {
+ BUG("invalid usb_open: %m\n");
+ goto bugout;
+ }
+
+ if (dev->descriptor.idVendor != 0x3f0)
+ goto bugout; /* not a HP product */
+
+ if ((r=get_string_descriptor(hd, dev->descriptor.iSerialNumber, sz, sizeof(sz))) < 0)
+ {
+ BUG("invalid serial id string ret=%d\n", r);
+ goto bugout;
+ }
+ if (sz[0])
+ generalize_serial(sz, gen, sizeof(gen));
+ else
+ strcpy(gen, "0");
+
+ if (strncmp(sn, gen, sizeof(gen)) != 0)
+ goto bugout; /* match failed */
+
+ if ((r=get_string_descriptor(hd, dev->descriptor.iProduct, sz, sizeof(sz))) < 0)
+ {
+ BUG("invalid product id string ret=%d\n", r);
+ goto bugout;
+ }
+ generalize_model(sz, model, model_size);
+
+ stat = 1; /* found usb device that matches sn */
+
+bugout:
+ if (hd != NULL)
+ usb_close(hd);
+
+ return stat;
+}
+
+static struct usb_device *get_libusb_device(const char *uri)
+{
+ struct usb_bus *bus;
+ struct usb_device *dev;
+
+ for (bus=usb_busses; bus; bus=bus->next)
+ for (dev=bus->devices; dev; dev=dev->next)
+ if (dev->descriptor.idVendor == 0x3f0 && is_interface(dev, 7))
+ if (is_uri(dev, uri))
+ return dev; /* found usb device that matches uri */
+
+ return NULL;
+}
+
+static int device_id(int fd, char *buffer, int size)
+{
+ usb_dev_handle *hd;
+ int config,interface,alt;
+ int len=0, rlen, maxSize;
+
+ hd = fd_table[fd].hd;
+ config = fd_table[fd].config;
+ interface = fd_table[fd].interface;
+ alt = fd_table[fd].alt_setting;
+
+ if (hd == NULL)
+ {
+ BUG("invalid device_id state\n");
+ goto bugout;
+ }
+
+ maxSize = (size > 1024) ? 1024 : size; /* RH8 has a size limit for device id (usb) */
+
+ rlen = usb_control_msg(hd,
+ USB_ENDPOINT_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE, /* bmRequestType */
+ USB_REQ_GET_STATUS, /* bRequest */
+ config, /* wValue */
+ interface, /* wIndex */ /* note firmware does not follow the USB Printer Class specification for wIndex */
+ buffer, maxSize, LIBUSB_CONTROL_REQ_TIMEOUT);
+
+ if (rlen < 0)
+ {
+#if 0 /* Removed this PS A420 hack so a valid error is returned after USB reset. DES 10/1/09 */
+ /* Following retry is necessary for a firmware problem with PS A420 products. DES 4/17/07 */
+ BUG("invalid deviceid wIndex=%x, retrying wIndex=%x: %m\n", interface, interface << 8);
+ rlen = usb_control_msg(hd,
+ USB_ENDPOINT_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE, /* bmRequestType */
+ USB_REQ_GET_STATUS, /* bRequest */
+ config, /* wValue */
+ interface << 8, /* wIndex */
+ buffer, maxSize, LIBUSB_CONTROL_REQ_TIMEOUT);
+ if (rlen < 0)
+ {
+ BUG("invalid deviceid retry ret=%d: %m\n", rlen);
+ goto bugout;
+ }
+#endif
+ BUG("invalid deviceid ret=%d: %m\n", rlen);
+ goto bugout;
+ }
+
+ len = ntohs(*(short *)buffer);
+ if (len > (size-1))
+ len = size-1; /* leave byte for zero termination */
+ if (len > 2)
+ len -= 2;
+ memcpy(buffer, buffer+2, len); /* remove length */
+ buffer[len]=0;
+ DBG("read actual device_id successfully fd=%d len=%d\n", fd, len);
+
+bugout:
+ return len; /* length does not include zero termination */
+}
+
+static int device_status(int fd, unsigned int *status)
+{
+ usb_dev_handle *hd;
+ int interface;
+ int len, stat=1;
+ char byte;
+
+ hd = fd_table[fd].hd;
+ interface = fd_table[fd].interface;
+
+ if (hd == NULL)
+ {
+ BUG("invalid device_status state\n");
+ goto bugout;
+ }
+
+ len = usb_control_msg(hd,
+ USB_ENDPOINT_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE, /* bmRequestType */
+ USB_REQ_CLEAR_FEATURE, /* bRequest */
+ 0, /* wValue */
+ interface, /* wIndex */
+ &byte, 1, LIBUSB_CONTROL_REQ_TIMEOUT);
+
+ if (len < 0)
+ {
+ BUG("invalid device_status: %m\n");
+ goto bugout;
+ }
+
+ *status = (unsigned int)byte;
+ stat = 0;
+ DBG("read actual device_status successfully fd=%d\n", fd);
+
+bugout:
+ return stat;
+}
+
+/* Get VStatus from S-field. */
+static int sfield_printer_state(const char *id)
+{
+ char *pSf;
+ int vstatus=0, ver;
+
+ if ((pSf = strstr(id, ";S:")) == NULL)
+ {
+ BUG("invalid S-field\n");
+ return vstatus;
+ }
+
+ /* Valid S-field, get version number. */
+ pSf+=3;
+ ver = 0;
+ HEX2INT(*pSf, ver);
+ pSf++;
+ ver = ver << 4;
+ HEX2INT(*pSf, ver);
+ pSf++;
+
+ /* Position pointer to printer state subfield. */
+ switch (ver)
+ {
+ case 0:
+ case 1:
+ case 2:
+ pSf+=12;
+ break;
+ case 3:
+ pSf+=14;
+ break;
+ case 4:
+ pSf+=18;
+ break;
+ default:
+ BUG("unknown S-field version=%d\n", ver);
+ pSf+=12;
+ break;
+ }
+
+ /* Extract VStatus.*/
+ vstatus = 0;
+ HEX2INT(*pSf, vstatus);
+ pSf++;
+ vstatus = vstatus << 4;
+ HEX2INT(*pSf, vstatus);
+
+ return vstatus;
+}
+
+/*
+ * Power up printer if necessary. Most all-in-ones have no power down state (ie: OJ K80), so they are already powered up.
+ * Newer single function printers power-up with the print job. May be called by other mud_device.
+ */
+int __attribute__ ((visibility ("hidden"))) power_up(mud_device *pd, int fd)
+{
+ const char *pSf;
+
+ if ((pSf = strstr(pd->id, "CMD:LDL")) != NULL)
+ return 0; /* crossbow don't do power-up */
+
+ if ((pSf = strstr(pd->id, ";S:")) != NULL)
+ {
+ if (sfield_printer_state(pd->id) != 3)
+ return 0; /* already powered up */
+ }
+ else if ((pSf = strstr(pd->id, "VSTATUS:")) != NULL)
+ {
+ /* DJ895C returns $XB0$XC0 (unknown pens) when powered off. */
+ if (!(strstr(pSf+8, "OFFF") || strstr(pSf+8, "PWDN") || strstr(pSf+8, "$X")))
+ return 0; /* already powered up */
+ }
+ else
+ return 0; /* must be laserjet, don't do power-up */
+
+ (pd->vf.write)(fd, venice_power_on, sizeof(venice_power_on), HPMUD_EXCEPTION_TIMEOUT);
+ sleep(2);
+
+ return 0;
+}
+
+/* Create channel object given the requested socket id and service name. */
+static int new_channel(mud_device *pd, int index, const char *sn)
+{
+ int stat=1;
+
+ /* Check for existing name service already open. */
+ if (pd->channel[index].client_cnt)
+ {
+#if 0
+ if (index == HPMUD_EWS_CHANNEL)
+ {
+ pd->channel[index].client_cnt++; /* allow multiple clients for separate USB interfaces only */
+ stat = 0;
+ DBG("reused %s channel=%d clientCnt=%d channelCnt=%d\n", sn, index, pd->channel[index].client_cnt, pd->channel_cnt);
+ }
+ else
+#endif
+ BUG("%s channel=%d is busy, used by [%d], clientCnt=%d channelCnt=%d\n", sn, index, pd->channel[index].pid, pd->channel[index].client_cnt, pd->channel_cnt);
+ goto bugout;
+ }
+
+ if (index == HPMUD_EWS_CHANNEL || index == HPMUD_EWS_LEDM_CHANNEL ||
+ index == HPMUD_SOAPSCAN_CHANNEL || index == HPMUD_SOAPFAX_CHANNEL ||
+ index == HPMUD_MARVELL_SCAN_CHANNEL || index == HPMUD_MARVELL_FAX_CHANNEL ||
+ index == HPMUD_LEDM_SCAN_CHANNEL) {
+ pd->channel[index].vf = musb_comp_channel_vf;
+ }
+ else if (pd->io_mode == HPMUD_RAW_MODE || pd->io_mode == HPMUD_UNI_MODE) {
+ pd->channel[index].vf = musb_raw_channel_vf;
+ }
+ else if (pd->io_mode == HPMUD_MLC_GUSHER_MODE || pd->io_mode == HPMUD_MLC_MISER_MODE) {
+ pd->channel[index].vf = musb_mlc_channel_vf;
+ }
+ else {
+ pd->channel[index].vf = musb_dot4_channel_vf;
+ }
+
+ pd->channel[index].index = index;
+ pd->channel[index].client_cnt = 1;
+ pd->channel[index].sockid = index; /* static socket id is valid for MLC but not 1284.4 */
+ pd->channel[index].pid = getpid();
+ pd->channel[index].dindex = pd->index;
+ pd->channel[index].fd = 0;
+ strcpy(pd->channel[index].sn, sn);
+ pd->channel_cnt++;
+
+ stat = 0;
+ DBG("new %s channel=%d clientCnt=%d channelCnt=%d\n", sn, index, pd->channel[index].client_cnt, pd->channel_cnt);
+
+bugout:
+ return stat;
+}
+
+/* Remove channel object given the channel decriptor. */
+static int del_channel(mud_device *pd, mud_channel *pc)
+{
+ pc->client_cnt--;
+
+ if (pc->client_cnt <= 0)
+ {
+ pd->channel_cnt--;
+ }
+ DBG("removed %s channel=%d clientCnt=%d channelCnt=%d\n", pc->sn, pc->index, pc->client_cnt, pd->channel_cnt);
+ return 0;
+}
+
+static void write_thread(file_descriptor *pfd)
+{
+ int ep;
+
+ pthread_detach(pthread_self());
+
+ if ((ep = get_out_ep(libusb_device, pfd->config, pfd->interface, pfd->alt_setting, USB_ENDPOINT_TYPE_BULK)) < 0)
+ {
+ BUG("invalid bulk out endpoint\n");
+ goto bugout;
+ }
+
+ /* Wait forever for write to complete (actually 72 hours in ms). */
+ pfd->write_return = usb_bulk_write(pfd->hd, ep, (char *)pfd->write_buf, pfd->write_size, 72*3600*1000);
+
+bugout:
+ pthread_mutex_lock(&pfd->mutex);
+ pfd->write_buf = NULL;
+ pthread_cond_signal(&pfd->write_done_cond); /* signal write is complete */
+ pthread_mutex_unlock(&pfd->mutex);
+
+ return;
+}
+
+/*********************************************************************************************************************************
+ * USB mud_device functions.
+ */
+
+int __attribute__ ((visibility ("hidden"))) musb_write(int fd, const void *buf, int size, int usec)
+{
+ int len=-EIO;
+
+ if (fd_table[fd].hd == NULL)
+ {
+ BUG("invalid musb_write state\n");
+ goto bugout;
+ }
+
+#if 1
+ struct timeval now;
+ struct timespec timeout;
+ int ret;
+ /* If write is still active, probably OOP condition, don't kick off a new write. */
+ if (!fd_table[fd].write_active)
+ {
+ fd_table[fd].write_active = 1;
+ fd_table[fd].write_buf = buf;
+ fd_table[fd].write_size = size;
+
+ /* Create usb_bulk_write thread so we can use our own timeout. Otherwise we cannot handle OOP condition. */
+ if (pthread_create(&fd_table[fd].tid, NULL, (void *(*)(void*))write_thread, (void *)&fd_table[fd]) != 0)
+ {
+ BUG("unable to creat write_thread: %m\n");
+ goto bugout; /* bail */
+ }
+ }
+
+ /* Wait for write to complete. */
+ pthread_mutex_lock(&fd_table[fd].mutex);
+ gettimeofday(&now, NULL);
+ now.tv_usec += usec;
+ now.tv_sec += now.tv_usec / 1000000;
+ now.tv_usec %= 1000000;
+ timeout.tv_sec = now.tv_sec;
+ timeout.tv_nsec = now.tv_usec * 1000;
+ ret = 0;
+ while (fd_table[fd].write_buf && ret != ETIMEDOUT)
+ ret = pthread_cond_timedwait(&fd_table[fd].write_done_cond, &fd_table[fd].mutex, &timeout);
+ pthread_mutex_unlock(&fd_table[fd].mutex);
+
+ if (ret == ETIMEDOUT)
+ {
+ len = -ETIMEDOUT; /* write timeout, let client know */
+ goto bugout;
+ }
+
+ fd_table[fd].write_active = 0;
+
+ len = fd_table[fd].write_return;
+#else
+ int ep;
+ if ((ep = get_out_ep(libusb_device, fd_table[fd].config, fd_table[fd].interface, fd_table[fd].alt_setting, USB_ENDPOINT_TYPE_BULK)) < 0)
+ {
+ BUG("invalid bulk out endpoint\n");
+ goto bugout;
+ }
+
+ len = usb_bulk_write(fd_table[fd].hd, ep, (char *)buf, size, usec);
+#endif
+
+ if (len < 0)
+ {
+ BUG("bulk_write failed buf=%p size=%d len=%d: %m\n", buf, size, len);
+ goto bugout;
+ }
+
+ DBG("write fd=%d len=%d size=%d usec=%d\n", fd, len, size, usec);
+ DBG_DUMP(buf, len < 512 ? len : 512);
+
+bugout:
+ return len;
+}
+
+int __attribute__ ((visibility ("hidden"))) musb_read(int fd, void *buf, int size, int usec)
+{
+ struct timeval t1, t2;
+ int total_usec, tmo_usec=usec;
+ int len=-EIO, ep;
+
+ if (fd_table[fd].hd == NULL)
+ {
+ BUG("invalid musb_read state\n");
+ goto bugout;
+ }
+
+ gettimeofday (&t1, NULL); /* get start time */
+
+ if ((ep = get_in_ep(libusb_device, fd_table[fd].config, fd_table[fd].interface, fd_table[fd].alt_setting, USB_ENDPOINT_TYPE_BULK)) < 0)
+ {
+ BUG("invalid bulk in endpoint\n");
+ goto bugout;
+ }
+
+ while (1)
+ {
+ len = usb_bulk_read(fd_table[fd].hd, ep, (char *)buf, size, tmo_usec/1000);
+
+ if (len == -ETIMEDOUT)
+ goto bugout;
+
+ if (len < 0)
+ {
+ BUG("bulk_read failed: %m\n");
+ goto bugout;
+ }
+
+ if (len == 0)
+ {
+ /* Bulk_read has a timeout, but bulk_read can return zero byte packet(s), so we must use our own timeout here. */
+ gettimeofday(&t2, NULL); /* get current time */
+
+ total_usec = (t2.tv_sec - t1.tv_sec)*1000000;
+ total_usec += (t2.tv_usec > t1.tv_usec) ? t2.tv_usec - t1.tv_usec : t1.tv_usec - t2.tv_usec;
+ if (total_usec > usec)
+ {
+ len = -ETIMEDOUT; /* timeout */
+ goto bugout;
+ }
+ tmo_usec = usec - total_usec; /* decrease timeout */
+ continue;
+ }
+
+ break;
+ }
+
+ DBG("read fd=%d len=%d size=%d usec=%d\n", fd, len, size, usec);
+ DBG_DUMP(buf, len < 32 ? len : 32);
+
+bugout:
+ return len;
+}
+
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) musb_open(mud_device *pd)
+{
+ int len=0, fd=0;
+ enum HPMUD_RESULT stat = HPMUD_R_IO_ERROR;
+
+ usb_init();
+ usb_find_busses();
+ usb_find_devices();
+
+ /* Find usb device for specified uri. */
+ if ((libusb_device = get_libusb_device(pd->uri)) == NULL)
+ {
+ BUG("unable to open %s\n", pd->uri);
+ goto bugout;
+ }
+
+ pthread_mutex_lock(&pd->mutex);
+
+ if (pd->id[0] == 0)
+ {
+ /* First client. */
+
+ if ((fd = claim_id_interface(libusb_device)) == MAX_FD)
+ {
+ stat = HPMUD_R_DEVICE_BUSY;
+ goto blackout;
+ }
+
+ len = device_id(fd, pd->id, sizeof(pd->id)); /* get new copy and cache it */
+
+ if (len > 0 && is_hp(pd->id))
+ power_up(pd, fd);
+
+ release_interface(&fd_table[fd]);
+
+ if (len == 0)
+ goto blackout;
+
+ pd->open_fd = fd;
+ }
+
+ stat = HPMUD_R_OK;
+
+blackout:
+ pthread_mutex_unlock(&pd->mutex);
+
+bugout:
+ return stat;
+}
+
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) musb_close(mud_device *pd)
+{
+ int i;
+ enum HPMUD_RESULT stat = HPMUD_R_OK;
+
+ pthread_mutex_lock(&pd->mutex);
+
+ for (i=1; i<MAX_FD; i++)
+ {
+ if (fd_table[i].hd != NULL)
+ release_interface(&fd_table[i]);
+ }
+
+ pd->id[0] = 0;
+
+ pthread_mutex_unlock(&pd->mutex);
+
+ return stat;
+}
+
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) musb_get_device_id(mud_device *pd, char *buf, int size, int *len)
+{
+ int i, fd=FD_NA;
+ enum HPMUD_RESULT stat = HPMUD_R_DEVICE_BUSY;
+
+ *len=0;
+
+ pthread_mutex_lock(&pd->mutex);
+
+ if (pd->io_mode == HPMUD_DOT4_BRIDGE_MODE || pd->io_mode == HPMUD_UNI_MODE)
+ {
+ *len = strlen(pd->id); /* usb/parallel bridge chip, use cached copy */
+ }
+ else
+ {
+ /* See if any interface is already claimed. */
+ for (i=1; i<MAX_FD; i++)
+ {
+ if (fd_table[i].hd != NULL)
+ {
+ fd = i;
+ break;
+ }
+ }
+
+ if (fd == FD_NA)
+ {
+ /* Device not in use. Claim interface, but release for other processes. */
+ if ((fd = claim_id_interface(libusb_device)) != MAX_FD)
+ {
+ *len = device_id(fd, pd->id, sizeof(pd->id)); /* get new copy and cache it */
+ release_interface(&fd_table[fd]);
+ }
+ else
+ {
+ /* Device is in use by another process, return cache copy. */
+ *len = strlen(pd->id);
+ }
+ }
+ else
+ {
+ /* Device in use by current process, leave interface up. Other processes are blocked. */
+ *len = device_id(fd, pd->id, sizeof(pd->id)); /* get new copy and cache it */
+ }
+ }
+
+ if (*len)
+ {
+ memcpy(buf, pd->id, *len > size ? size : *len);
+ stat = HPMUD_R_OK;
+ }
+
+ pthread_mutex_unlock(&pd->mutex);
+ return stat;
+}
+
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) musb_get_device_status(mud_device *pd, unsigned int *status)
+{
+ int i, fd=FD_NA;
+ enum HPMUD_RESULT stat = HPMUD_R_DEVICE_BUSY;
+ int r=1;
+
+ pthread_mutex_lock(&pd->mutex);
+
+ if (pd->io_mode == HPMUD_DOT4_BRIDGE_MODE || pd->io_mode == HPMUD_UNI_MODE)
+ *status = NFAULT_BIT; /* usb/parallel bridge chip, fake status */
+ else
+ {
+ /* See if any interface is already claimed. */
+ for (i=1; i<MAX_FD; i++)
+ {
+ if (fd_table[i].hd != NULL)
+ {
+ fd = i;
+ break;
+ }
+ }
+
+ if (fd == FD_NA)
+ {
+ /* Device not in use. Claim interface, but release for other processes. */
+ if ((fd = claim_id_interface(libusb_device)) != MAX_FD)
+ {
+ r = device_status(fd, status);
+ release_interface(&fd_table[fd]);
+ }
+ }
+ else
+ {
+ /* Device in use by current process, leave interface up. Other processes are blocked. */
+ r = device_status(fd, status);
+ }
+ }
+
+ pthread_mutex_unlock(&pd->mutex);
+
+ if (r != 0)
+ goto bugout;
+
+ stat = HPMUD_R_OK;
+
+bugout:
+ return stat;
+}
+
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) musb_channel_write(mud_device *pd, mud_channel *pc, const void *buf, int length, int sec_timeout, int *bytes_wrote)
+{
+ enum HPMUD_RESULT stat;
+
+ pthread_mutex_lock(&pd->mutex);
+ stat = (pc->vf.channel_write)(pc, buf, length, sec_timeout, bytes_wrote);
+ pthread_mutex_unlock(&pd->mutex);
+ return stat;
+}
+
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) musb_channel_read(mud_device *pd, mud_channel *pc, void *buf, int length, int sec_timeout, int *bytes_read)
+{
+ enum HPMUD_RESULT stat;
+
+ if (pd->io_mode == HPMUD_UNI_MODE)
+ {
+ stat = HPMUD_R_INVALID_STATE;
+ BUG("invalid channel_read io_mode=%d\n", pd->io_mode);
+ goto bugout;
+ }
+
+ pthread_mutex_lock(&pd->mutex);
+ stat = (pc->vf.channel_read)(pc, buf, length, sec_timeout, bytes_read);
+ pthread_mutex_unlock(&pd->mutex);
+
+bugout:
+ return stat;
+}
+
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) musb_channel_open(mud_device *pd, const char *sn, HPMUD_CHANNEL *cd)
+{
+ int index;
+ enum HPMUD_RESULT stat;
+
+ /* Check for valid service requests. */
+ if ((stat = service_to_channel(pd, sn, &index)) != HPMUD_R_OK)
+ goto bugout;
+
+ pthread_mutex_lock(&pd->mutex);
+
+ if (new_channel(pd, index, sn))
+ {
+ stat = HPMUD_R_DEVICE_BUSY;
+ }
+ else
+ {
+ if ((stat = (pd->channel[index].vf.open)(&pd->channel[index])) != HPMUD_R_OK) /* call transport specific open */
+ del_channel(pd, &pd->channel[index]); /* open failed, cleanup */
+ else
+ *cd = index;
+ }
+
+ pthread_mutex_unlock(&pd->mutex);
+
+bugout:
+ return stat;
+}
+
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) musb_channel_close(mud_device *pd, mud_channel *pc)
+{
+ enum HPMUD_RESULT stat = HPMUD_R_OK;
+
+ pthread_mutex_lock(&pd->mutex);
+ stat = (pc->vf.close)(pc); /* call trasport specific close */
+ del_channel(pd, pc);
+ pthread_mutex_unlock(&pd->mutex);
+
+ return stat;
+}
+
+/*******************************************************************************************************************************
+ * USB raw_channel functions.
+ */
+
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) musb_raw_channel_open(mud_channel *pc)
+{
+ int fd = FD_7_1_2;
+ enum HPMUD_RESULT stat = HPMUD_R_DEVICE_BUSY;
+
+ get_interface(libusb_device, fd, &fd_table[fd]);
+
+ if (claim_interface(libusb_device, &fd_table[fd]))
+ goto bugout;
+
+ pc->fd = fd;
+
+ stat = HPMUD_R_OK;
+
+bugout:
+ return stat;
+}
+
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) musb_raw_channel_close(mud_channel *pc)
+{
+ int fd = pc->fd;
+
+ // For New laserjet devices like Tsunami, end point was getting stall or halted, hence clearing it
+ int ep = -1;
+ if (( ep = get_in_ep(libusb_device, fd_table[fd].config, fd_table[fd].interface, fd_table[fd].alt_setting, USB_ENDPOINT_TYPE_BULK)) >= 0)
+ {
+ usb_clear_halt(fd_table[fd].hd, ep);
+ }
+
+ if (( ep = get_out_ep(libusb_device, fd_table[fd].config, fd_table[fd].interface, fd_table[fd].alt_setting, USB_ENDPOINT_TYPE_BULK)) >= 0)
+ {
+ usb_clear_halt(fd_table[fd].hd, ep);
+ }
+
+ release_interface(&fd_table[fd]);
+
+ pc->fd = 0;
+
+ return HPMUD_R_OK;
+}
+
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) musb_raw_channel_write(mud_channel *pc, const void *buf, int length, int sec_timeout, int *bytes_wrote)
+{
+ int len, size, total=0;
+ enum HPMUD_RESULT stat = HPMUD_R_IO_ERROR;
+
+ *bytes_wrote=0;
+ size = length;
+
+ while (size > 0)
+ {
+ len = (msp->device[pc->dindex].vf.write)(pc->fd, buf+total, size, sec_timeout*1000000);
+ if (len < 0)
+ {
+ if (len == -ETIMEDOUT)
+ {
+ stat = HPMUD_R_IO_TIMEOUT;
+ if (sec_timeout >= HPMUD_EXCEPTION_SEC_TIMEOUT)
+ BUG("unable to write data %s: %d second io timeout\n", msp->device[pc->dindex].uri, sec_timeout);
+ }
+ else
+ BUG("unable to write data %s: %m\n", msp->device[pc->dindex].uri);
+ goto bugout;
+ }
+ size-=len;
+ total+=len;
+ *bytes_wrote+=len;
+ }
+
+ stat = HPMUD_R_OK;
+
+bugout:
+ return stat;
+}
+
+/*
+ * Channel_read() tries to read "length" bytes from the peripheral. The returned read count may be zero
+ * (timeout, no data available), less than "length" or equal "length".
+ */
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) musb_raw_channel_read(mud_channel *pc, void *buf, int length, int sec_timeout, int *bytes_read)
+{
+ int len=0, usec;
+ enum HPMUD_RESULT stat = HPMUD_R_IO_ERROR;
+
+ *bytes_read = 0;
+
+ if (sec_timeout==0)
+ usec = 1000; /* minmum timeout is 1ms for libusb 0.1.12, hangs forever with zero */
+ else
+ usec = sec_timeout*1000000;
+
+ len = (msp->device[pc->dindex].vf.read)(pc->fd, buf, length, usec);
+ if (len < 0)
+ {
+ if (len == -ETIMEDOUT)
+ {
+ stat = HPMUD_R_IO_TIMEOUT;
+ if (sec_timeout >= HPMUD_EXCEPTION_SEC_TIMEOUT)
+ BUG("unable to read data %s: %d second io timeout\n", msp->device[pc->dindex].uri, sec_timeout);
+ }
+ else
+ BUG("unable to read data %s: %m\n", msp->device[pc->dindex].uri);
+ goto bugout;
+ }
+
+ *bytes_read = len;
+ stat = HPMUD_R_OK;
+
+bugout:
+ return stat;
+}
+
+/*******************************************************************************************************************************
+ * USB comp_channel functions.
+ */
+
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) musb_comp_channel_open(mud_channel *pc)
+{
+ int fd;
+ enum HPMUD_RESULT stat = HPMUD_R_DEVICE_BUSY;
+
+ /* Get requested composite interface. */
+ switch (pc->index)
+ {
+ case HPMUD_EWS_CHANNEL:
+ fd = FD_ff_1_1;
+ break;
+ case HPMUD_EWS_LEDM_CHANNEL:
+ fd = FD_ff_4_1;
+ break;
+ case HPMUD_SOAPSCAN_CHANNEL:
+ fd = FD_ff_2_1;
+ break;
+ case HPMUD_SOAPFAX_CHANNEL:
+ fd = FD_ff_3_1;
+ break;
+ case HPMUD_MARVELL_SCAN_CHANNEL:
+ fd = FD_ff_ff_ff;
+ break;
+ case HPMUD_MARVELL_FAX_CHANNEL: //using vendor specific C/S/P codes for fax too
+ fd = FD_ff_1_0;
+ break;
+ case HPMUD_LEDM_SCAN_CHANNEL: //using vendor specific C/S/P codes for fax too
+ fd = FD_ff_cc_0;
+ break;
+ default:
+ stat = HPMUD_R_INVALID_SN;
+ BUG("invalid %s channel=%d\n", pc->sn, pc->index);
+ goto bugout;
+ break;
+ }
+
+ if (get_interface(libusb_device, fd, &fd_table[fd]))
+ {
+ stat = HPMUD_R_INVALID_SN;
+ BUG("invalid %s channel=%d\n", pc->sn, pc->index);
+ goto bugout;
+ }
+
+ if (claim_interface(libusb_device, &fd_table[fd]))
+ goto bugout;
+
+ pc->fd = fd;
+
+ stat = HPMUD_R_OK;
+
+bugout:
+ return stat;
+}
+
+/*******************************************************************************************************************************
+ * USB mlc_channel functions.
+ */
+
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) musb_mlc_channel_open(mud_channel *pc)
+{
+ mud_device *pd = &msp->device[pc->dindex];
+ enum FD_ID fd;
+ enum HPMUD_RESULT stat = HPMUD_R_IO_ERROR;
+
+ /* Initialize MLC transport if this is the first MLC channel. */
+ if (pd->channel_cnt==1)
+ {
+ if (get_interface(libusb_device, FD_7_1_3, &fd_table[FD_7_1_3]) == 0 && claim_interface(libusb_device, &fd_table[FD_7_1_3]) == 0)
+ fd = FD_7_1_3; /* mlc, dot4 */
+ else if (get_interface(libusb_device, FD_ff_ff_ff, &fd_table[FD_ff_ff_ff]) == 0 && claim_interface(libusb_device, &fd_table[FD_ff_ff_ff]) == 0)
+ fd = FD_ff_ff_ff; /* mlc, dot4 */
+ else if (get_interface(libusb_device, FD_ff_d4_0, &fd_table[FD_ff_d4_0]) == 0 && claim_interface(libusb_device, &fd_table[FD_ff_d4_0]) == 0)
+ fd = FD_ff_d4_0; /* mlc, dot4 */
+ else if (get_interface(libusb_device, FD_7_1_2, &fd_table[FD_7_1_2]) == 0 && claim_interface(libusb_device, &fd_table[FD_7_1_2]) == 0)
+ fd = FD_7_1_2; /* raw, mlc, dot4 */
+ else
+ {
+ stat = HPMUD_R_DEVICE_BUSY;
+ goto bugout;
+ }
+
+ if (fd == FD_7_1_2)
+ {
+ /* Emulate 7/1/3 on 7/1/2 using vendor-specific ECP channel-77. */
+ if (write_ecp_channel(&fd_table[fd], 77))
+ goto bugout;
+ }
+
+ unsigned int i;
+#if 0
+// Removed reverse drain I seen it hang forever on read, one-time with PSC750 (FC5 64-bit). DES
+ int len;
+ unsigned char buf[255];
+
+ /* Drain any reverse data. */
+ for (i=0,len=1; len > 0 && i < sizeof(buf); i++)
+ len = (pd->vf.read)(fd, buf+i, 1, 0); /* no blocking */
+#endif
+
+ /* MLC initialize */
+ if (MlcInit(pc, fd) != 0)
+ goto bugout;
+
+ /* Reset transport attributes for all channels. */
+ for (i=0; i<HPMUD_CHANNEL_MAX; i++)
+ memset(&pd->channel[i].ta, 0 , sizeof(transport_attributes));
+
+ pd->mlc_fd = fd;
+ pd->mlc_up=1;
+
+ } /* if (pDev->ChannelCnt==1) */
+
+ if (MlcConfigSocket(pc, pd->mlc_fd))
+ goto bugout;
+
+ if (MlcOpenChannel(pc, pd->mlc_fd))
+ goto bugout;
+
+ pc->rcnt = pc->rindex = 0;
+
+ stat = HPMUD_R_OK;
+
+bugout:
+ return stat;
+}
+
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) musb_mlc_channel_close(mud_channel *pc)
+{
+ mud_device *pd = &msp->device[pc->dindex];
+ unsigned char nullByte=0;
+ enum HPMUD_RESULT stat = HPMUD_R_OK;
+
+ if (pd->mlc_up)
+ {
+ if (MlcCloseChannel(pc, pd->mlc_fd))
+ stat = HPMUD_R_IO_ERROR;
+ }
+
+ /* Remove MLC transport if this is the last MLC channel. */
+ if (pd->channel_cnt==1)
+ {
+ if (pd->mlc_up)
+ {
+ if (MlcExit(pc, pd->mlc_fd))
+ stat = HPMUD_R_IO_ERROR;
+ }
+ pd->mlc_up=0;
+
+ if (pd->mlc_fd == FD_7_1_2)
+ {
+ write_ecp_channel(&fd_table[pd->mlc_fd], 78);
+ (pd->vf.write)(pd->mlc_fd, &nullByte, 1, HPMUD_EXCEPTION_TIMEOUT);
+ write_ecp_channel(&fd_table[pd->mlc_fd], 0);
+ }
+
+ release_interface(&fd_table[pd->mlc_fd]);
+
+ /* Delay for back-to-back scanning using scanimage (OJ 7110, OJ d135). */
+ sleep(1);
+ }
+
+ return stat;
+}
+
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) musb_mlc_channel_write(mud_channel *pc, const void *buf, int length, int sec_timeout, int *bytes_wrote)
+{
+ mud_device *pd = &msp->device[pc->dindex];
+ int ret, len, size, dlen, total=0;
+ enum HPMUD_RESULT stat = HPMUD_R_IO_ERROR;
+
+ *bytes_wrote=0;
+ size = length;
+ dlen = pc->ta.h2psize - sizeof(MLCHeader);
+ while (size > 0)
+ {
+ len = (size > dlen) ? dlen : size;
+
+ if (pc->ta.h2pcredit == 0 && pd->io_mode == HPMUD_MLC_MISER_MODE)
+ {
+ if (MlcCreditRequest(pc, pd->mlc_fd, 1)) /* Miser flow control */
+ {
+ BUG("invalid MlcCreditRequest from peripheral\n");
+ goto bugout;
+ }
+ }
+
+ if (pc->ta.h2pcredit == 0)
+ {
+ ret = MlcReverseCmd(pc, pd->mlc_fd);
+ if (pc->ta.h2pcredit == 0)
+ {
+ if (ret == 0)
+ continue; /* Got a reverse command, but no MlcCredit, try again. */
+
+ if (pd->io_mode != HPMUD_MLC_MISER_MODE)
+ {
+ /* If miser flow control works for this device, set "miser" in models.dat. */
+ BUG("invalid MlcCredit from peripheral, trying miser\n");
+ pd->io_mode = HPMUD_MLC_MISER_MODE;
+ continue;
+ }
+
+ BUG("invalid MlcCredit from peripheral\n");
+ goto bugout;
+ }
+ }
+
+ if (MlcForwardData(pc, pd->mlc_fd, buf+total, len, sec_timeout*1000000))
+ {
+ goto bugout;
+ }
+
+ pc->ta.h2pcredit--;
+ size-=len;
+ total+=len;
+ *bytes_wrote+=len;
+ }
+
+ stat = HPMUD_R_OK;
+
+bugout:
+ return stat;
+}
+
+/*
+ * Mlc_channel_read() tries to read "length" bytes from the peripheral. ReadData() reads data in packet size chunks.
+ * The returned read count may be zero (timeout, no data available), less than "length" or equal "length".
+ *
+ * Mlc_channel_read() may read more the "length" if the data packet is greater than "length". For this case the
+ * return value will equal "length" and the left over data will be buffered for the next ReadData() call.
+ *
+ * The "timeout" specifies how many seconds to wait for a data packet. Once the read of the data packet has
+ * started the "timeout" is no longer used.
+ *
+ * Note, if a "timeout" occurs one peripheral to host credit is left outstanding. Which means the peripheral
+ * can send unsolicited data later.
+ */
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) musb_mlc_channel_read(mud_channel *pc, void *buf, int length, int sec_timeout, int *bytes_read)
+{
+ mud_device *pd = &msp->device[pc->dindex];
+ enum HPMUD_RESULT stat = HPMUD_R_IO_ERROR;
+
+ *bytes_read=0;
+ if (pc->ta.p2hsize==0)
+ {
+ BUG("invalid channel_read state\n");
+ goto bugout;
+ }
+
+ if (pc->rcnt)
+ {
+ stat=HPMUD_R_OK;
+ *bytes_read = cut_buf(pc, buf, length);
+ goto bugout;
+ }
+
+ if (pc->ta.p2hcredit == 0)
+ {
+ /* Issue enough credit to the peripheral to read one data packet. */
+ if (MlcCredit(pc, pd->mlc_fd, 1))
+ goto bugout;
+ }
+
+ stat=HPMUD_R_OK;
+ pc->rcnt = MlcReverseData(pc, pd->mlc_fd, pc->rbuf, sizeof(pc->rbuf), sec_timeout*1000000);
+ if (pc->rcnt)
+ pc->ta.p2hcredit--; /* one data packet was read, decrement credit count */
+
+ *bytes_read = cut_buf(pc, buf, length);
+
+bugout:
+ return stat;
+}
+
+/*******************************************************************************************************************************
+ * USB dot4_channel functions.
+ */
+
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) musb_dot4_channel_open(mud_channel *pc)
+{
+ mud_device *pd = &msp->device[pc->dindex];
+ enum FD_ID fd;
+ enum HPMUD_RESULT stat = HPMUD_R_IO_ERROR;
+
+ /* Initialize MLC transport if this is the first MLC channel. */
+ if (pd->channel_cnt==1)
+ {
+ if (get_interface(libusb_device, FD_7_1_3, &fd_table[FD_7_1_3]) == 0 && claim_interface(libusb_device, &fd_table[FD_7_1_3]) == 0)
+ fd = FD_7_1_3; /* mlc, dot4 */
+ else if (get_interface(libusb_device, FD_ff_ff_ff, &fd_table[FD_ff_ff_ff]) == 0 && claim_interface(libusb_device, &fd_table[FD_ff_ff_ff]) == 0)
+ fd = FD_ff_ff_ff; /* mlc, dot4 */
+ else if (get_interface(libusb_device, FD_ff_d4_0, &fd_table[FD_ff_d4_0]) == 0 && claim_interface(libusb_device, &fd_table[FD_ff_d4_0]) == 0)
+ fd = FD_ff_d4_0; /* mlc, dot4 */
+ else if (get_interface(libusb_device, FD_7_1_2, &fd_table[FD_7_1_2]) == 0 && claim_interface(libusb_device, &fd_table[FD_7_1_2]) == 0)
+ fd = FD_7_1_2; /* raw, mlc, dot4 */
+ else
+ {
+ stat = HPMUD_R_DEVICE_BUSY;
+ goto bugout;
+ }
+
+ if (fd == FD_7_1_2)
+ {
+ if (pd->io_mode == HPMUD_DOT4_BRIDGE_MODE)
+ {
+ /* Emulate 7/1/3 on 7/1/2 using the bridge chip set (ie: CLJ2500). */
+ if (bridge_chip_up(&fd_table[fd]))
+ goto bugout;
+ }
+ else
+ {
+ /* Emulate 7/1/3 on 7/1/2 using vendor-specific ECP channel-77. */
+ if (write_ecp_channel(&fd_table[fd], 77))
+ goto bugout;
+ }
+ }
+
+ if (pd->io_mode == HPMUD_DOT4_PHOENIX_MODE)
+ write_phoenix_setup(&fd_table[fd]);
+
+ unsigned int i;
+#if 0
+// Removed reverse drain LJ1015 can hang forever on read (FC5 64-bit). DES
+ unsigned char buf[255];
+ int len;
+
+ /* Drain any reverse data. */
+ for (i=0,len=1; len > 0 && i < sizeof(buf); i++)
+ len = (pd->vf.read)(fd, buf+i, 1, 0); /* no blocking */
+#endif
+ /* DOT4 initialize */
+ if (Dot4Init(pc, fd) != 0)
+ goto bugout;
+
+ /* Reset transport attributes for all channels. */
+ for (i=0; i<HPMUD_CHANNEL_MAX; i++)
+ memset(&pd->channel[i].ta, 0 , sizeof(transport_attributes));
+
+ pd->mlc_fd = fd;
+ pd->mlc_up=1;
+
+ } /* if (pDev->ChannelCnt==1) */
+
+ if (Dot4GetSocket(pc, pd->mlc_fd))
+ goto bugout;
+
+ if (Dot4OpenChannel(pc, pd->mlc_fd))
+ goto bugout;
+
+ if (pd->io_mode == HPMUD_DOT4_PHOENIX_MODE)
+ {
+ /* Issue credit to peripheral. */
+ if (Dot4Credit(pc, pd->mlc_fd, 2))
+ {
+ BUG("invalid Dot4Credit to peripheral\n");
+ goto bugout;
+ }
+ }
+
+ pc->rcnt = pc->rindex = 0;
+
+ stat = HPMUD_R_OK;
+
+bugout:
+ return stat;
+}
+
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) musb_dot4_channel_close(mud_channel *pc)
+{
+ mud_device *pd = &msp->device[pc->dindex];
+ enum HPMUD_RESULT stat = HPMUD_R_OK;
+
+ if (pd->mlc_up)
+ {
+ if (Dot4CloseChannel(pc, pd->mlc_fd))
+ stat = HPMUD_R_IO_ERROR;
+ }
+
+ /* Remove 1284.4 transport if this is the last 1284.4 channel. */
+ if (pd->channel_cnt==1)
+ {
+ if (pd->mlc_up)
+ {
+ if (Dot4Exit(pc, pd->mlc_fd))
+ stat = HPMUD_R_IO_ERROR;
+ }
+ pd->mlc_up=0;
+
+ if (pd->mlc_fd == FD_7_1_2)
+ {
+ if (pd->io_mode == HPMUD_DOT4_BRIDGE_MODE)
+ {
+ bridge_chip_down(&fd_table[pd->mlc_fd]);
+ }
+ else
+ {
+ write_ecp_channel(&fd_table[pd->mlc_fd], 78);
+ write_ecp_channel(&fd_table[pd->mlc_fd], 0);
+ }
+ }
+
+ release_interface(&fd_table[pd->mlc_fd]);
+
+ /* Delay for back-to-back scanning using scanimage (OJ 7110, OJ d135). */
+ sleep(1);
+ }
+
+ return stat;
+}
+
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) musb_dot4_channel_write(mud_channel *pc, const void *buf, int length, int sec_timeout, int *bytes_wrote)
+{
+ mud_device *pd = &msp->device[pc->dindex];
+ int ret, len, size, dlen, total=0, cnt=0;
+ enum HPMUD_RESULT stat = HPMUD_R_IO_ERROR;
+
+ *bytes_wrote=0;
+ size = length;
+ dlen = pc->ta.h2psize - sizeof(DOT4Header);
+ while (size > 0)
+ {
+ len = (size > dlen) ? dlen : size;
+
+ if (pc->ta.h2pcredit == 0 && pd->io_mode == HPMUD_DOT4_PHOENIX_MODE)
+ {
+ /* Issue credit request to peripheral. */
+ if (Dot4CreditRequest(pc, pd->mlc_fd, 1))
+ {
+ BUG("invalid Dot4CreditRequest from peripheral\n");
+ goto bugout;
+ }
+ if (pc->ta.h2pcredit == 0)
+ {
+ if (cnt++ > HPMUD_EXCEPTION_SEC_TIMEOUT)
+ {
+ BUG("invalid Dot4CreditRequest from peripheral\n");
+ goto bugout;
+ }
+ sleep(1);
+ continue; /* Got a valid Dot4CreditRequest but no credit from peripheral, try again. */
+ }
+ }
+
+ if (pc->ta.h2pcredit == 0)
+ {
+ ret = Dot4ReverseCmd(pc, pd->mlc_fd);
+ if (pc->ta.h2pcredit == 0)
+ {
+ if (ret == 0)
+ continue; /* Got a reverse command, but no Dot4Credit, try again. */
+
+ BUG("invalid Dot4Credit from peripheral\n");
+ goto bugout;
+ }
+ }
+
+ if (Dot4ForwardData(pc, pd->mlc_fd, buf+total, len, sec_timeout*1000000))
+ {
+ goto bugout;
+ }
+
+ pc->ta.h2pcredit--;
+ size-=len;
+ total+=len;
+ *bytes_wrote+=len;
+ cnt=0;
+ }
+
+ stat = HPMUD_R_OK;
+
+bugout:
+ return stat;
+}
+
+/*
+ * dot4_read_data() tries to read "length" bytes from the peripheral. Read_data() reads data in packet size chunks.
+ * The returned read count may be zero (timeout, no data available), less than "length" or equal "length".
+ *
+ * dot4_read_data() may read more the "length" if the data packet is greater than "length". For this case the
+ * return value will equal "length" and the left over data will be buffered for the next read_data() call.
+ *
+ * The "timeout" specifies how many seconds to wait for a data packet. Once the read of the data packet has
+ * started the "timeout" is no longer used.
+ *
+ * Note, if a "timeout" occurs one peripheral to host credit is left outstanding. Which means the peripheral
+ * can send unsolicited data later.
+ */
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) musb_dot4_channel_read(mud_channel *pc, void *buf, int length, int sec_timeout, int *bytes_read)
+{
+ mud_device *pd = &msp->device[pc->dindex];
+ enum HPMUD_RESULT stat = HPMUD_R_IO_ERROR;
+
+ *bytes_read=0;
+ if (pc->ta.p2hsize==0)
+ {
+ BUG("invalid channel_read state\n");
+ goto bugout;
+ }
+
+ if (pc->rcnt)
+ {
+ stat=HPMUD_R_OK;
+ *bytes_read = cut_buf(pc, buf, length);
+ goto bugout;
+ }
+
+ if (pc->ta.p2hcredit == 0)
+ {
+ /* Issue enough credit to the peripheral to read one data packet. */
+ if (Dot4Credit(pc, pd->mlc_fd, 1))
+ goto bugout;
+ }
+
+ stat=HPMUD_R_OK;
+ pc->rcnt = Dot4ReverseData(pc, pd->mlc_fd, pc->rbuf, sizeof(pc->rbuf), sec_timeout*1000000);
+ if (pc->rcnt)
+ pc->ta.p2hcredit--; /* one data packet was read, decrement credit count */
+
+ *bytes_read = cut_buf(pc, buf, length);
+
+bugout:
+ return stat;
+}
+
+/*******************************************************************************************************************************
+ * USB probe devices, walk the USB bus(s) looking for HP products.
+ */
+
+int __attribute__ ((visibility ("hidden"))) musb_probe_devices(char *lst, int lst_size, int *cnt)
+{
+ struct usb_bus *bus;
+ struct usb_device *dev;
+ usb_dev_handle *hd;
+ struct hpmud_model_attributes ma;
+ char rmodel[128];
+ char rserial[128];
+ char model[128];
+ char serial[128];
+ char mfg[128];
+ char sz[HPMUD_LINE_SIZE];
+ int r, size=0;
+
+ usb_init();
+ usb_find_busses();
+ usb_find_devices();
+
+ for (bus=usb_busses; bus; bus=bus->next)
+ {
+ for (dev=bus->devices; dev; dev=dev->next)
+ {
+
+ model[0] = serial[0] = rmodel[0] = rserial[0] = sz[0] = mfg[0] = 0;
+
+ if (dev->descriptor.idVendor == 0x3f0 && is_interface(dev, 7))
+ {
+ if((hd = usb_open(dev)) == NULL)
+ {
+ BUG("Invalid usb_open: %m\n");
+ continue;
+ }
+ /* Found hp device. */
+ if ((r=get_string_descriptor(hd, dev->descriptor.iProduct, rmodel, sizeof(rmodel))) < 0)
+ BUG("invalid product id string ret=%d\n", r);
+ else
+ generalize_model(rmodel, model, sizeof(model));
+
+ if ((r=get_string_descriptor(hd, dev->descriptor.iSerialNumber, rserial, sizeof(rserial))) < 0)
+ BUG("invalid serial id string ret=%d\n", r);
+ else
+ generalize_serial(rserial, serial, sizeof(serial));
+
+ if ((r=get_string_descriptor(hd, dev->descriptor.iManufacturer, sz, sizeof(sz))) < 0)
+ BUG("invalid manufacturer string ret=%d\n", r);
+ else
+ generalize_serial(sz, mfg, sizeof(serial));
+
+ if (!serial[0])
+ strcpy(serial, "0"); /* no serial number, make it zero */
+
+ if (model[0])
+ {
+ snprintf(sz, sizeof(sz), "hp:/usb/%s?serial=%s", model, serial);
+
+ /* See if device is supported by hplip. */
+ hpmud_query_model(sz, &ma);
+ if (ma.support != HPMUD_SUPPORT_TYPE_HPLIP)
+ {
+ BUG("ignoring %s support=%d\n", sz, ma.support);
+ continue; /* ignor, not supported */
+ }
+
+ /*
+ * For Cups 1.2 we append a dummy deviceid. A valid deviceid would require us to claim the USB interface, thus removing usblp.
+ * This will allow us to do discovery and not disable other CUPS backend(s) who use /dev/usb/lpx instead of libusb.
+ */
+ if (strncasecmp(rmodel, "hp ", 3) == 0)
+ size += snprintf(lst+size, lst_size-size, "direct %s \"HP %s\" \"HP %s USB %s HPLIP\" \"MFG:%s;MDL:%s;CLS:PRINTER;DES:%s;SN:%s;\"\n",
+ sz, &rmodel[3], &rmodel[3], serial, mfg, rmodel, rmodel, rserial);
+ else
+ size += snprintf(lst+size, lst_size-size, "direct %s \"HP %s\" \"HP %s USB %s HPLIP\" \"MFG:%s;MDL:%s;CLS:PRINTER;DES:%s;SN:%s;\"\n",
+ sz, rmodel, rmodel, serial, mfg, rmodel, rmodel, rserial);
+
+ *cnt+=1;
+ }
+ usb_close(hd);
+ }
+ }
+ }
+
+ return size;
+}
+
+enum HPMUD_RESULT hpmud_make_usb_uri(const char *busnum, const char *devnum, char *uri, int uri_size, int *bytes_read)
+{
+ struct usb_bus *bus;
+ struct usb_device *dev, *found_dev=NULL;
+ usb_dev_handle *hd=NULL;
+ char model[128];
+ char serial[128];
+ char sz[256];
+ int r;
+ enum HPMUD_RESULT stat = HPMUD_R_INVALID_DEVICE_NODE;
+
+ DBG("[%d] hpmud_make_usb_uri() bus=%s dev=%s\n", getpid(), busnum, devnum);
+
+ *bytes_read=0;
+
+ usb_init();
+ usb_find_busses();
+ usb_find_devices();
+
+ for (bus=usb_busses; bus && !found_dev; bus=bus->next)
+ if (strcmp(bus->dirname, busnum) == 0)
+ for (dev=bus->devices; dev && !found_dev; dev=dev->next)
+ if (strcmp(dev->filename, devnum) == 0)
+ found_dev = dev; /* found usb device that matches bus:device */
+
+ if (found_dev == NULL)
+ {
+ BUG("invalid busnum:devnum %s:%s\n", busnum, devnum);
+ goto bugout;
+ }
+
+ dev = found_dev;
+ if ((hd = usb_open(dev)) == NULL)
+ {
+ BUG("invalid usb_open: %m\n");
+ goto bugout;
+ }
+
+ model[0] = serial[0] = sz[0] = 0;
+
+ if (dev->descriptor.idVendor == 0x3f0)
+ {
+ /* Found hp device. */
+ if ((r=get_string_descriptor(hd, dev->descriptor.iProduct, sz, sizeof(sz))) < 0)
+ BUG("invalid product id string ret=%d\n", r);
+ else
+ generalize_model(sz, model, sizeof(model));
+
+ if ((r=get_string_descriptor(hd, dev->descriptor.iSerialNumber, sz, sizeof(sz))) < 0)
+ BUG("invalid serial id string ret=%d\n", r);
+ else
+ generalize_serial(sz, serial, sizeof(serial));
+
+ if (!serial[0])
+ strcpy(serial, "0"); /* no serial number, make it zero */
+ }
+ else
+ {
+ BUG("invalid vendor id: %d\n", dev->descriptor.idVendor);
+ goto bugout;
+ }
+
+ if (!model[0] || !serial[0])
+ goto bugout;
+
+ *bytes_read = snprintf(uri, uri_size, "hp:/usb/%s?serial=%s", model, serial);
+ stat = HPMUD_R_OK;
+
+bugout:
+ if (hd != NULL)
+ usb_close(hd);
+
+ return stat;
+}
+
+enum HPMUD_RESULT hpmud_make_usb_serial_uri(const char *sn, char *uri, int uri_size, int *bytes_read)
+{
+ struct usb_bus *bus;
+ struct usb_device *dev, *found_dev=NULL;
+ char model[128];
+ enum HPMUD_RESULT stat = HPMUD_R_INVALID_DEVICE_NODE;
+
+ DBG("[%d] hpmud_make_usb_serial_uri() sn=%s\n", getpid(), sn);
+
+ *bytes_read=0;
+
+ usb_init();
+ usb_find_busses();
+ usb_find_devices();
+
+ for (bus=usb_busses; bus && !found_dev; bus=bus->next)
+ for (dev=bus->devices; dev && !found_dev; dev=dev->next)
+ if (is_serial(dev, sn, model, sizeof(model)))
+ found_dev = dev; /* found usb device that matches serial number */
+
+ if (found_dev == NULL)
+ {
+ BUG("invalid sn %s\n", sn);
+ goto bugout;
+ }
+
+ *bytes_read = snprintf(uri, uri_size, "hp:/usb/%s?serial=%s", model, sn);
+ stat = HPMUD_R_OK;
+
+bugout:
+ return stat;
+}
diff --git a/io/hpmud/musb.h b/io/hpmud/musb.h
new file mode 100644
index 0000000..df4a8a6
--- /dev/null
+++ b/io/hpmud/musb.h
@@ -0,0 +1,121 @@
+/*****************************************************************************\
+
+ musb.h - USB support for multi-point transport driver
+
+ (c) 2010 Copyright Hewlett-Packard Development Company, LP
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+ of the Software, and to permit persons to whom the Software is furnished to do
+ so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+ Author: Naga Samrat Chowdary Narla
+\*****************************************************************************/
+
+#ifndef _MUSB_H
+#define _MUSB_H
+
+#include <usb.h>
+#include "hpmud.h"
+#include "hpmudi.h"
+
+#define LIBUSB_TIMEOUT 30000 /* milliseconds */
+#define LIBUSB_CONTROL_REQ_TIMEOUT 5000
+
+enum FD_ID
+{
+ FD_NA=0,
+ FD_7_1_2, /* bi-di interface */
+ FD_7_1_3, /* 1284.4 interface */
+ FD_ff_1_1, /* HP EWS interface */
+ FD_ff_2_1, /* HP Soap Scan interface */
+ FD_ff_3_1, /* HP Soap Fax interface */
+ FD_ff_ff_ff, /* HP dot4 interface */
+ FD_ff_d4_0, /* HP dot4 interface */
+ FD_ff_4_1, /* orblite scan / rest scan interface */
+ FD_ff_1_0, /* Marvell fax support*/
+ FD_ff_cc_0,
+ FD_ff_2_10,
+ MAX_FD
+};
+
+enum BRIGE_REG_ID
+{
+ ECRR=2,
+ CCTR=3,
+ ATAA=8
+};
+
+/* USB file descriptor, one for each USB protocol. */
+typedef struct
+{
+ usb_dev_handle *hd;
+ enum FD_ID fd;
+ int config;
+ int interface;
+ int alt_setting;
+
+ /* Write thread definitions. */
+ int write_active; /* 0=no, 1=yes */
+ const void *write_buf;
+ int write_size;
+ int write_return; /* return value, normally number bytes written */
+ pthread_t tid;
+ pthread_mutex_t mutex;
+ pthread_cond_t write_done_cond;
+
+ unsigned char ubuf[HPMUD_BUFFER_SIZE]; /* usb read packet buffer */
+ int uindex;
+ int ucnt;
+} file_descriptor;
+
+struct _mud_device;
+struct _mud_channel;
+
+extern struct _mud_device_vf __attribute__ ((visibility ("hidden"))) musb_mud_device_vf;
+
+int __attribute__ ((visibility ("hidden"))) musb_write(int fd, const void *buf, int size, int usec_timout);
+int __attribute__ ((visibility ("hidden"))) musb_read(int fd, void *buf, int size, int usec_timout);
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) musb_open(struct _mud_device *pd);
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) musb_close(struct _mud_device *pd);
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) musb_get_device_id(struct _mud_device *pd, char *buf, int size, int *len);
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) musb_get_device_status(struct _mud_device *pd, unsigned int *status);
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) musb_channel_open(struct _mud_device *pd, const char *sn, HPMUD_CHANNEL *cd);
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) musb_channel_close(struct _mud_device *pd, struct _mud_channel *pc);
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) musb_channel_write(struct _mud_device *pd, struct _mud_channel *pc, const void *buf, int length, int timeout, int *bytes_wrote);
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) musb_channel_read(struct _mud_device *pd, struct _mud_channel *pc, void *buf, int length, int timeout, int *bytes_read);
+
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) musb_raw_channel_open(struct _mud_channel *pc);
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) musb_raw_channel_close(struct _mud_channel *pc);
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) musb_raw_channel_write(struct _mud_channel *pc, const void *buf, int length, int timeout, int *bytes_wrote);
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) musb_raw_channel_read(struct _mud_channel *pc, void *buf, int length, int timeout, int *bytes_wrote);
+
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) musb_comp_channel_open(struct _mud_channel *pc);
+
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) musb_mlc_channel_open(struct _mud_channel *pc);
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) musb_mlc_channel_close(struct _mud_channel *pc);
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) musb_mlc_channel_write(struct _mud_channel *pc, const void *buf, int length, int timeout, int *bytes_wrote);
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) musb_mlc_channel_read(struct _mud_channel *pc, void *buf, int length, int timeout, int *bytes_wrote);
+
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) musb_dot4_channel_open(struct _mud_channel *pc);
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) musb_dot4_channel_close(struct _mud_channel *pc);
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) musb_dot4_channel_write(struct _mud_channel *pc, const void *buf, int length, int sec_timeout, int *bytes_wrote);
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) musb_dot4_channel_read(struct _mud_channel *pc, void *buf, int length, int sec_timeout, int *bytes_read);
+
+int __attribute__ ((visibility ("hidden"))) musb_probe_devices(char *lst, int lst_size, int *cnt);
+int __attribute__ ((visibility ("hidden"))) power_up(struct _mud_device *pd, int fd);
+
+#endif // _MUSB_H
+
diff --git a/io/hpmud/pml.c b/io/hpmud/pml.c
new file mode 100644
index 0000000..a84a9a2
--- /dev/null
+++ b/io/hpmud/pml.c
@@ -0,0 +1,520 @@
+/*****************************************************************************\
+
+ pml.c - get/set pml api for hpmud
+
+ The get/set pml commands are a high level interface to hpmud. This hpmud system
+ interface sits on top of the hpmud core interface. The system interface does
+ not use the hpmud memory map file system.
+
+ (c) 2004-2007 Copyright Hewlett-Packard Development Company, LP
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+ of the Software, and to permit persons to whom the Software is furnished to do
+ so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+\*****************************************************************************/
+
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+#include "hpmud.h"
+#include "hpmudi.h"
+
+#ifdef HAVE_LIBNETSNMP
+#ifdef HAVE_UCDSNMP
+#include <ucd-snmp/ucd-snmp-config.h>
+#include <ucd-snmp/ucd-snmp-includes.h>
+#else
+#include <net-snmp/net-snmp-config.h>
+#include <net-snmp/net-snmp-includes.h>
+#endif
+static const char *SnmpPort[] = { "","public.1","public.2","public.3" };
+#endif
+
+static int PmlOidToHex(const char *szoid, unsigned char *oid, int oidSize)
+{
+ char *tail;
+ int i=0, val;
+
+ if (szoid[0] == 0)
+ goto bugout;
+
+ val = strtol(szoid, &tail, 10);
+
+ while (i < oidSize)
+ {
+ if (val > 128)
+ {
+ BUG("invalid oid size: oid=%s\n", szoid);
+ goto bugout;
+ }
+ oid[i++] = (unsigned char)val;
+
+ if (*tail == 0)
+ break; /* done */
+
+ val = strtol(tail+1, &tail, 10);
+ }
+
+bugout:
+ return i;
+}
+
+/* Convert ascii snmp oid to pml hex oid. */
+static int SnmpToPml(const char *snmp_oid, unsigned char *oid, int oidSize)
+{
+ static const char hp_pml_mib_prefix[] = "1.3.6.1.4.1.11.2.3.9.4.2";
+ static const char standard_printer_mib_prefix[] = "1.3.6.1.2.1.43";
+ static const char host_resource_mib_prefix[] = "1.3.6.1.2.1.25";
+ int len=0;
+
+ if (strncmp(snmp_oid, hp_pml_mib_prefix, sizeof(hp_pml_mib_prefix)-1) == 0)
+ {
+ /* Strip out snmp prefix and convert to hex. */
+ len = 0;
+ len += PmlOidToHex(&snmp_oid[sizeof(hp_pml_mib_prefix)], &oid[0], oidSize);
+ len--; /* remove trailing zero in pml mib */
+ }
+ else if (strncmp(snmp_oid, standard_printer_mib_prefix, sizeof(standard_printer_mib_prefix)-1) == 0)
+ {
+ /* Replace snmp prefix with 2 and convert to hex. */
+ len = 1;
+ oid[0] = 0x2;
+ len += PmlOidToHex(&snmp_oid[sizeof(standard_printer_mib_prefix)], &oid[1], oidSize);
+ }
+ else if (strncmp(snmp_oid, host_resource_mib_prefix, sizeof(host_resource_mib_prefix)-1) == 0)
+ {
+ /* Replace snmp prefix with 3 and convert to hex. */
+ len = 1;
+ oid[0] = 0x3;
+ len += PmlOidToHex(&snmp_oid[sizeof(host_resource_mib_prefix)], &oid[1], oidSize);
+ }
+ else
+ BUG("SnmpToPml failed snmp oid=%s\n", snmp_oid);
+
+ return len;
+}
+
+#ifdef HAVE_LIBNETSNMP
+
+static int SnmpErrorToPml(int snmp_error)
+{
+ int err;
+
+ switch (snmp_error)
+ {
+ case SNMP_ERR_NOERROR:
+ err = PML_EV_OK;
+ break;
+ case SNMP_ERR_TOOBIG:
+ err = PML_EV_ERROR_BUFFER_OVERFLOW;
+ break;
+ case SNMP_ERR_NOSUCHNAME:
+ err = PML_EV_ERROR_UNKNOWN_OBJECT_IDENTIFIER;
+ break;
+ case SNMP_ERR_BADVALUE:
+ err = PML_EV_ERROR_INVALID_OR_UNSUPPORTED_VALUE;
+ break;
+ case SNMP_ERR_READONLY:
+ err = PML_EV_ERROR_OBJECT_DOES_NOT_SUPPORT_REQUESTED_ACTION;
+ break;
+ case SNMP_ERR_GENERR:
+ default:
+ err = PML_EV_ERROR_UNKNOWN_REQUEST;
+ break;
+ }
+
+ return err;
+}
+
+static int SetSnmp(const char *ip, int port, const char *szoid, int type, void *buffer, unsigned int size, int *pml_result, int *result)
+{
+ struct snmp_session session, *ss=NULL;
+ struct snmp_pdu *pdu=NULL;
+ struct snmp_pdu *response=NULL;
+ oid anOID[MAX_OID_LEN];
+ size_t anOID_len = MAX_OID_LEN;
+ unsigned int i, len=0;
+ uint32_t val;
+
+ *result = HPMUD_R_IO_ERROR;
+ *pml_result = PML_EV_ERROR_UNKNOWN_REQUEST;
+
+ init_snmp("snmpapp");
+
+ snmp_sess_init(&session ); /* set up defaults */
+ session.peername = (char *)ip;
+ session.version = SNMP_VERSION_1;
+ session.community = (unsigned char *)SnmpPort[port];
+ session.community_len = strlen((const char *)session.community);
+ ss = snmp_open(&session); /* establish the session */
+ if (ss == NULL)
+ goto bugout;
+
+ pdu = snmp_pdu_create(SNMP_MSG_SET);
+ read_objid(szoid, anOID, &anOID_len);
+
+ switch (type)
+ {
+ case PML_DT_ENUMERATION:
+ case PML_DT_SIGNED_INTEGER:
+ /* Convert PML big-endian to SNMP little-endian byte stream. */
+ for(i=0, val=0; i<size && i<sizeof(val); i++)
+ val = ((val << 8) | ((unsigned char *)buffer)[i]);
+ snmp_pdu_add_variable(pdu, anOID, anOID_len, ASN_INTEGER, (unsigned char *)&val, sizeof(val));
+ break;
+ case PML_DT_REAL:
+ case PML_DT_STRING:
+ case PML_DT_BINARY:
+ case PML_DT_NULL_VALUE:
+ case PML_DT_COLLECTION:
+ default:
+ snmp_pdu_add_variable(pdu, anOID, anOID_len, ASN_OCTET_STR, buffer, size);
+ break;
+ }
+
+
+ /* Send the request and get response. */
+ if (snmp_synch_response(ss, pdu, &response) != STAT_SUCCESS)
+ goto bugout;
+
+ if (response->errstat == SNMP_ERR_NOERROR)
+ {
+ len = size;
+ }
+
+ *pml_result = SnmpErrorToPml(response->errstat);
+ *result = HPMUD_R_OK;
+
+bugout:
+ if (response != NULL)
+ snmp_free_pdu(response);
+ if (ss != NULL)
+ snmp_close(ss);
+ return len;
+}
+
+int __attribute__ ((visibility ("hidden"))) GetSnmp(const char *ip, int port, const char *szoid, void *buffer, unsigned int size, int *type, int *pml_result, int *result)
+{
+ struct snmp_session session, *ss=NULL;
+ struct snmp_pdu *pdu=NULL;
+ struct snmp_pdu *response=NULL;
+ unsigned int i, len=0;
+ oid anOID[MAX_OID_LEN];
+ size_t anOID_len = MAX_OID_LEN;
+ struct variable_list *vars;
+ uint32_t val;
+ unsigned char tmp[sizeof(uint32_t)];
+
+ *result = HPMUD_R_IO_ERROR;
+ *type = PML_DT_NULL_VALUE;
+ *pml_result = PML_EV_ERROR_UNKNOWN_REQUEST;
+
+ init_snmp("snmpapp");
+
+ snmp_sess_init(&session ); /* set up defaults */
+ session.peername = (char *)ip;
+ session.version = SNMP_VERSION_1;
+ session.community = (unsigned char *)SnmpPort[port];
+ session.community_len = strlen((const char *)session.community);
+ session.retries = 2;
+ session.timeout = 1000000; /* 1 second */
+ ss = snmp_open(&session); /* establish the session */
+ if (ss == NULL)
+ goto bugout;
+
+ pdu = snmp_pdu_create(SNMP_MSG_GET);
+ read_objid(szoid, anOID, &anOID_len);
+ snmp_add_null_var(pdu, anOID, anOID_len);
+
+ /* Send the request and get response. */
+ if (snmp_synch_response(ss, pdu, &response) != STAT_SUCCESS)
+ goto bugout;
+
+ if (response->errstat == SNMP_ERR_NOERROR)
+ {
+ vars = response->variables;
+ switch (vars->type)
+ {
+ case ASN_INTEGER:
+ *type = PML_DT_SIGNED_INTEGER;
+
+ /* Convert SNMP little-endian to PML big-endian byte stream. */
+ len = (sizeof(uint32_t) < size) ? sizeof(uint32_t) : size;
+ val = *vars->val.integer;
+ for(i=len; i>0; i--)
+ {
+ tmp[i-1] = val & 0xff;
+ val >>= 8;
+ }
+
+ /* Remove any in-significant bytes. */
+ for (; tmp[i]==0 && i<len; i++)
+ ;
+ len -= i;
+
+ memcpy(buffer, tmp+i, len);
+ break;
+ case ASN_NULL:
+ *type = PML_DT_NULL_VALUE;
+ break;
+ case ASN_OCTET_STR:
+ *type = PML_DT_STRING;
+ len = (vars->val_len < size) ? vars->val_len : size;
+ memcpy(buffer, vars->val.string, len);
+ break;
+ default:
+ BUG("unable to GetSnmp: data type=%d\n", vars->type);
+ goto bugout;
+ break;
+ }
+ }
+
+ *pml_result = SnmpErrorToPml(response->errstat);
+ *result = HPMUD_R_OK;
+
+bugout:
+ if (response != NULL)
+ snmp_free_pdu(response);
+ if (ss != NULL)
+ snmp_close(ss);
+ return len;
+}
+
+#else
+
+int __attribute__ ((visibility ("hidden"))) SetSnmp(const char *ip, int port, const char *szoid, int type, void *buffer, unsigned int size, int *pml_result, int *result)
+{
+ BUG("no JetDirect support enabled\n");
+ return 0;
+}
+
+int __attribute__ ((visibility ("hidden"))) GetSnmp(const char *ip, int port, const char *szoid, void *buffer, unsigned int size, int *type, int *pml_result, int *result)
+{
+ BUG("no JetDirect support enabled\n");
+ return 0;
+}
+
+#endif /* HAVE_LIBSNMP */
+
+/* Set a PML object in the hp device. */
+enum HPMUD_RESULT hpmud_set_pml(HPMUD_DEVICE device, HPMUD_CHANNEL channel, const char *snmp_oid, int type, void *data, int data_size, int *pml_result)
+{
+ unsigned char message[HPMUD_BUFFER_SIZE];
+ unsigned char oid[HPMUD_LINE_SIZE];
+ char ip[HPMUD_LINE_SIZE], *psz, *tail;
+ unsigned char *p=message;
+ int len, dLen, result, reply, status, port;
+ struct hpmud_dstat ds;
+ enum HPMUD_RESULT stat = HPMUD_R_IO_ERROR;
+
+ DBG("[%d] hpmud_set_pml() dd=%d cd=%d oid=%s type=%d data=%p size=%d\n", getpid(), device, channel, snmp_oid, type, data, data_size);
+
+ if ((result = hpmud_get_dstat(device, &ds)) != HPMUD_R_OK)
+ {
+ stat = result;
+ goto bugout;
+ }
+
+ if (strcasestr(ds.uri, "net/") != NULL)
+ {
+ /* Process pml via snmp. */
+
+ hpmud_get_uri_datalink(ds.uri, ip, sizeof(ip));
+
+ if ((psz = strstr(ds.uri, "port=")) != NULL)
+ port = strtol(psz+5, &tail, 10);
+ else
+ port = 1;
+
+ SetSnmp(ip, port, snmp_oid, type, data, data_size, &status, &result);
+ if (result != HPMUD_R_OK)
+ {
+ BUG("SetPml failed ret=%d\n", result);
+ stat = result;
+ goto bugout;
+ }
+ }
+ else
+ {
+ /* Process pml via local transport. */
+
+ /* Convert snmp ascii oid to pml hex oid. */
+ dLen = SnmpToPml(snmp_oid, oid, sizeof(oid));
+
+ *p++ = PML_SET_REQUEST;
+ *p++ = PML_DT_OBJECT_IDENTIFIER;
+ *p++ = dLen; /* assume oid length is < 10 bits */
+ memcpy(p, oid, dLen);
+ p+=dLen;
+ *p = type;
+ *p |= data_size >> 8; /* assume data length is 10 bits */
+ *(p+1) = data_size & 0xff;
+ p += 2;
+ memcpy(p, data, data_size);
+
+ result = hpmud_write_channel(device, channel, message, dLen+data_size+3+2, HPMUD_EXCEPTION_SEC_TIMEOUT, &len);
+ if (result != HPMUD_R_OK)
+ {
+ BUG("SetPml channel_write failed ret=%d\n", result);
+ stat = result;
+ goto bugout;
+ }
+
+ result = hpmud_read_channel(device, channel, message, sizeof(message), HPMUD_EXCEPTION_SEC_TIMEOUT, &len);
+ if (result != HPMUD_R_OK || len == 0)
+ {
+ BUG("SetPml channel_read failed ret=%d len=%d\n", result, len);
+ goto bugout;
+ }
+
+ p = message;
+ reply = *p++; /* read command reply */
+ status = *p++; /* read execution outcome */
+
+ if (reply != (PML_SET_REQUEST | 0x80) && status & 0x80)
+ {
+ BUG("SetPml failed reply=%x outcome=%x\n", reply, status);
+ DBG_DUMP(p, len-2);
+ goto bugout;
+ }
+ }
+
+ *pml_result = status;
+ stat = HPMUD_R_OK;
+
+ DBG("set_pml result pmlresult=%x\n", status);
+
+bugout:
+ return stat;
+}
+
+/* Get a PML object from the hp device. */
+enum HPMUD_RESULT hpmud_get_pml(HPMUD_DEVICE device, HPMUD_CHANNEL channel, const char *snmp_oid, void *buf, int buf_size, int *bytes_read, int *type, int *pml_result)
+{
+ unsigned char message[HPMUD_BUFFER_SIZE];
+ unsigned char oid[HPMUD_LINE_SIZE];
+ char ip[HPMUD_LINE_SIZE], *psz, *tail;
+ unsigned char *p=message;
+ int len, dLen, result, reply, status, dt, port;
+ struct hpmud_dstat ds;
+ enum HPMUD_RESULT stat = HPMUD_R_IO_ERROR;
+
+ DBG("[%d] hpmud_get_pml() dd=%d cd=%d oid=%s data=%p size=%d\n", getpid(), device, channel, snmp_oid, buf, buf_size);
+
+ if ((result = hpmud_get_dstat(device, &ds)) != HPMUD_R_OK)
+ {
+ stat = result;
+ goto bugout;
+ }
+
+ if (strcasestr(ds.uri, "net/") != NULL)
+ {
+ /* Process pml via snmp. */
+
+ hpmud_get_uri_datalink(ds.uri, ip, sizeof(ip));
+
+ if ((psz = strstr(ds.uri, "port=")) != NULL)
+ port = strtol(psz+5, &tail, 10);
+ else
+ port = 1;
+
+ dLen = GetSnmp(ip, port, snmp_oid, message, sizeof(message), &dt, &status, &result);
+ if (result != HPMUD_R_OK)
+ {
+ BUG("GetPml failed ret=%d\n", result);
+ stat = result;
+ goto bugout;
+ }
+ p = message;
+ }
+ else
+ {
+ /* Process pml via local transport. */
+
+ /* Convert snmp ascii oid to pml hex oid. */
+ dLen = SnmpToPml(snmp_oid, oid, sizeof(oid));
+
+ *p++ = PML_GET_REQUEST;
+ *p++ = PML_DT_OBJECT_IDENTIFIER;
+ *p++ = dLen; /* assume oid length is < 10 bits */
+ memcpy(p, oid, dLen);
+ result = hpmud_write_channel(device, channel, message, dLen+3, HPMUD_EXCEPTION_SEC_TIMEOUT, &len);
+ if (result != HPMUD_R_OK)
+ {
+ BUG("GetPml channel_write failed ret=%d\n", result);
+ stat = result;
+ goto bugout;
+ }
+
+ result = hpmud_read_channel(device, channel, message, sizeof(message), HPMUD_EXCEPTION_SEC_TIMEOUT, &len);
+ if (result != HPMUD_R_OK || len == 0)
+ {
+ BUG("GetPml channel_read failed ret=%d len=%d\n", result, len);
+ goto bugout;
+ }
+
+ p = message;
+ reply = *p++; /* read command reply */
+ status = *p++; /* read execution outcome */
+
+ if (reply != (PML_GET_REQUEST | 0x80) && status & 0x80)
+ {
+ BUG("GetPml failed reply=%x outcome=%x\n", reply, status);
+ DBG_DUMP(p, len-2);
+ goto bugout;
+ }
+
+ dt = *p++; /* read data type */
+
+ if (dt == PML_DT_ERROR_CODE)
+ {
+ /* Ok, but invalid data type requested, get new data type. */
+ p += 2; /* eat length and err code */
+ dt = *p++; /* read data type */
+ }
+
+ if (dt != PML_DT_OBJECT_IDENTIFIER)
+ {
+ BUG("GetPml failed data type=%x\n", dt);
+ goto bugout;
+ }
+
+ dLen = *p++; /* read oid length */
+ p += dLen; /* eat oid */
+
+ dt = *p; /* read data type. */
+ dLen = ((*p & 0x3) << 8 | *(p+1)); /* read 10 bit len from 2 byte field */
+ p += 2; /* eat type and length */
+ }
+
+ memcpy(buf, p, dLen);
+ *bytes_read = dLen;
+ *type = dt;
+ *pml_result = status;
+ stat = HPMUD_R_OK;
+
+ DBG("get_pml result len=%d datatype=%x pmlresult=%x\n", dLen, dt, status);
+ DBG_DUMP(buf, dLen);
+
+bugout:
+ return stat;
+}
+
+
diff --git a/io/hpmud/pml.h b/io/hpmud/pml.h
new file mode 100644
index 0000000..188d584
--- /dev/null
+++ b/io/hpmud/pml.h
@@ -0,0 +1,77 @@
+/*****************************************************************************\
+
+ pml.h - get/set pml api for hpmud
+
+ (c) 2004-2007 Copyright Hewlett-Packard Development Company, LP
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+ of the Software, and to permit persons to whom the Software is furnished to do
+ so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ (c) 2003-2004 Copyright Hewlett-Packard Development Company, LP
+
+\*****************************************************************************/
+
+#ifndef _PML_H
+#define _PML_H
+
+/*
+ * PML definitions
+ */
+
+enum PML_REQUESTS
+{
+ PML_GET_REQUEST = 0,
+ PML_GET_NEXT_REQUEST = 0x1,
+ PML_BLOCK_REQUEST = 0x3,
+ PML_SET_REQUEST = 0x4,
+ PML_ENABLE_TRAP_REQUEST = 0x5,
+ PML_DISABLE_TRAP_REQUEST = 0x6,
+ PML_TRAP_REQUEST = 0x7
+};
+
+enum PML_ERROR_VALUES
+{
+ PML_EV_OK = 0,
+ PML_EV_OK_END_OF_SUPPORTED_OBJECTS = 0x1,
+ PML_EV_OK_NEAREST_LEGAL_VALUE_SUBSTITUTED = 0x2,
+ PML_EV_ERROR_UNKNOWN_REQUEST = 0x80,
+ PML_EV_ERROR_BUFFER_OVERFLOW = 0x81,
+ PML_EV_ERROR_COMMAND_EXECUTION_ERROR = 0x82,
+ PML_EV_ERROR_UNKNOWN_OBJECT_IDENTIFIER = 0x83,
+ PML_EV_ERROR_OBJECT_DOES_NOT_SUPPORT_REQUESTED_ACTION = 0x84,
+ PML_EV_ERROR_INVALID_OR_UNSUPPORTED_VALUE = 0x85,
+ PML_EV_ERROR_PAST_END_OF_SUPPORTED_OBJECTS = 0x86,
+ PML_EV_ERROR_ACTION_CAN_NOT_BE_PERFORMED_NOW = 0x87
+};
+
+enum PML_DATA_TYPES
+{
+ PML_DT_OBJECT_IDENTIFIER = 0,
+ PML_DT_ENUMERATION = 0x04,
+ PML_DT_SIGNED_INTEGER = 0x08,
+ PML_DT_REAL = 0x0C,
+ PML_DT_STRING = 0x10,
+ PML_DT_BINARY = 0x14,
+ PML_DT_ERROR_CODE = 0x18,
+ PML_DT_NULL_VALUE = 0x1C,
+ PML_DT_COLLECTION = 0x20,
+ PML_DT_UNKNOWN = 0xff
+};
+
+int __attribute__ ((visibility ("hidden"))) GetSnmp(const char *ip, int port, const char *szoid, void *buffer, unsigned int size, int *type, int *pml_result, int *result);
+
+#endif // _PML_H
+
diff --git a/io/hpmud/pp.c b/io/hpmud/pp.c
new file mode 100644
index 0000000..3b95ab7
--- /dev/null
+++ b/io/hpmud/pp.c
@@ -0,0 +1,1310 @@
+/*****************************************************************************\
+
+ pp.c - parallel port support for multi-point transport driver
+
+ (c) 2004-2007 Copyright Hewlett-Packard Development Company, LP
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+ of the Software, and to permit persons to whom the Software is furnished to do
+ so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ Client/Server generic message format (see messaging-protocol.doc):
+
+\*****************************************************************************/
+
+#ifdef HAVE_PPORT
+
+#include "hpmud.h"
+#include "hpmudi.h"
+
+mud_device_vf __attribute__ ((visibility ("hidden"))) pp_mud_device_vf =
+{
+ .read = pp_read,
+ .write = pp_write,
+ .open = pp_open,
+ .close = pp_close,
+ .get_device_id = pp_get_device_id,
+ .get_device_status = pp_get_device_status,
+ .channel_open = pp_channel_open,
+ .channel_close = pp_channel_close,
+ .channel_write = musb_channel_write,
+ .channel_read = musb_channel_read
+};
+
+static mud_channel_vf pp_raw_channel_vf =
+{
+ .open = pp_raw_channel_open,
+ .close = pp_raw_channel_close,
+ .channel_write = musb_raw_channel_write,
+ .channel_read = musb_raw_channel_read
+};
+
+static mud_channel_vf pp_mlc_channel_vf =
+{
+ .open = pp_mlc_channel_open,
+ .close = pp_mlc_channel_close,
+ .channel_write = musb_mlc_channel_write,
+ .channel_read = musb_mlc_channel_read
+};
+
+static mud_channel_vf pp_dot4_channel_vf =
+{
+ .open = pp_dot4_channel_open,
+ .close = pp_dot4_channel_close,
+ .channel_write = musb_dot4_channel_write,
+ .channel_read = musb_dot4_channel_read
+};
+
+static int frob_control(int fd, unsigned char mask, unsigned char val)
+{
+ struct ppdev_frob_struct frob;
+
+ /* Convert ieee1284 control values to PC-style (invert Strobe, AutoFd and Select) . */
+ frob.val = val ^ (mask & (PARPORT_CONTROL_STROBE | PARPORT_CONTROL_AUTOFD | PARPORT_CONTROL_SELECT));
+
+ frob.mask = mask;
+ return ioctl(fd, PPFCONTROL, &frob);
+}
+
+static unsigned char read_status(int fd)
+{
+ unsigned char status;
+ if (ioctl(fd, PPRSTATUS, &status))
+ BUG("read_status error: %m\n");
+
+ /* Convert PC-style status values to ieee1284 (invert Busy). */
+ return (status ^ PARPORT_STATUS_BUSY);
+}
+
+static int wait_status(int fd, unsigned char mask, unsigned char val, int usec)
+{
+ struct timeval tmo, now;
+ struct timespec min;
+ unsigned char status;
+ int cnt=0;
+
+ gettimeofday (&tmo, NULL);
+ tmo.tv_usec += usec;
+ tmo.tv_sec += tmo.tv_usec / 1000000;
+ tmo.tv_usec %= 1000000;
+
+ min.tv_sec = 0;
+ min.tv_nsec = 5000000; /* 5ms */
+
+ while (1)
+ {
+ status = read_status(fd);
+ if ((status & mask) == val)
+ {
+ // bug("found status=%x mask=%x val=%x cnt=%d: %s %d\n", status, mask, val, cnt, __FILE__, __LINE__);
+ return 0;
+ }
+ cnt++;
+ // nanosleep(&min, NULL);
+ gettimeofday(&now, NULL);
+ if ((now.tv_sec > tmo.tv_sec) || (now.tv_sec == tmo.tv_sec && now.tv_usec > tmo.tv_usec))
+ {
+ DBG("wait_status timeout status=%x mask=%x val=%x us=%d\n", status, mask, val, usec);
+ return -1; /* timeout */
+ }
+ }
+}
+
+static int wait(int usec)
+{
+ struct timeval tmo, now;
+ int cnt=0;
+
+ gettimeofday (&tmo, NULL);
+ tmo.tv_usec += usec;
+ tmo.tv_sec += tmo.tv_usec / 1000000;
+ tmo.tv_usec %= 1000000;
+
+ while (1)
+ {
+ cnt++;
+ gettimeofday(&now, NULL);
+ if ((now.tv_sec > tmo.tv_sec) || (now.tv_sec == tmo.tv_sec && now.tv_usec > tmo.tv_usec))
+ {
+ return 0; /* timeout */
+ }
+ }
+}
+
+static int ecp_is_fwd(int fd)
+{
+ unsigned char status;
+
+ status = read_status(fd);
+ if ((status & PARPORT_STATUS_PAPEROUT) == PARPORT_STATUS_PAPEROUT)
+ return 1;
+ return 0;
+}
+
+static int ecp_is_rev(int fd)
+{
+ unsigned char status;
+
+ status = read_status(fd);
+ if ((status & PARPORT_STATUS_PAPEROUT) == 0)
+ return 1;
+ return 0;
+}
+
+static int ecp_rev_to_fwd(int fd)
+{
+ int dir=0;
+
+ if (ecp_is_fwd(fd))
+ return 0;
+
+ /* Event 47: write NReverseRequest/nInit=1 */
+ frob_control(fd, PARPORT_CONTROL_INIT, PARPORT_CONTROL_INIT);
+
+ /* Event 48: wait PeriphClk/nAck=1, PeriphAck/Busy=0 */
+ // wait_status(fd, PARPORT_STATUS_PAPEROUT | PARPORT_STATUS_BUSY, PARPORT_STATUS_PAPEROUT, SIGNAL_TIMEOUT);
+
+ /* Event 49: wait nAckReverse/PError=1 */
+ wait_status(fd, PARPORT_STATUS_PAPEROUT, PARPORT_STATUS_PAPEROUT, PP_SIGNAL_TIMEOUT);
+
+ ioctl(fd, PPDATADIR, &dir);
+
+ return 0;
+}
+
+static int ecp_fwd_to_rev(int fd)
+{
+ int dir=1;
+
+ if (ecp_is_rev(fd))
+ return 0;
+
+ /* Event 33: NPeriphRequest/nFault=0, PeriphAck/Busy=0 */
+ wait_status(fd, PARPORT_STATUS_BUSY | PARPORT_STATUS_ERROR, 0, PP_DEVICE_TIMEOUT);
+
+ /* Event 38: write HostAck/nAutoFd=0 */
+ ioctl(fd, PPDATADIR, &dir);
+ frob_control(fd, PARPORT_CONTROL_AUTOFD, 0);
+ wait(PP_SETUP_TIMEOUT);
+
+ /* Event 39: write NReverseRequest/nInit=0 (start bus reversal) */
+ frob_control(fd, PARPORT_CONTROL_INIT, 0);
+
+ /* Event 40: wait nAckReverse/PError=0 */
+ wait_status(fd, PARPORT_STATUS_PAPEROUT, 0, PP_SIGNAL_TIMEOUT);
+
+ return 0;
+}
+
+static int ecp_write_addr(int fd, unsigned char data)
+{
+ int cnt=0, len=0;
+ unsigned d=(data | 0x80); /* set channel address bit */
+
+ ecp_rev_to_fwd(fd);
+
+ /* Event 33: PeriphAck/Busy=0 */
+ if (wait_status(fd, PARPORT_STATUS_BUSY, 0, PP_SIGNAL_TIMEOUT))
+ {
+ BUG("ecp_write_addr transfer stalled\n");
+ goto bugout;
+ }
+
+ while (1)
+ {
+ /* Event 34: write HostAck/nAutoFD=0 (channel command), data */
+ frob_control(fd, PARPORT_CONTROL_AUTOFD, 0);
+ ioctl(fd, PPWDATA, &d);
+
+ /* Event 35: write HostClk/NStrobe=0 */
+ frob_control(fd, PARPORT_CONTROL_STROBE, 0);
+
+ /* Event 36: wait PeriphAck/Busy=1 */
+ if (wait_status(fd, PARPORT_STATUS_BUSY, PARPORT_STATUS_BUSY, PP_SIGNAL_TIMEOUT))
+ {
+
+ /* Event 72: write NReverseRequest/nInit=0 (Host Transfer Recovery) */
+ frob_control(fd, PARPORT_CONTROL_INIT, 0);
+
+ /* Event 73: wait nAckReverse/PError=0 */
+ wait_status(fd, PARPORT_STATUS_PAPEROUT, 0, PP_SIGNAL_TIMEOUT);
+
+ /* Event 74: write NReverseRequest/nInit=1 */
+ frob_control(fd, PARPORT_CONTROL_INIT, PARPORT_CONTROL_INIT);
+
+ /* Event 75: wait nAckReverse/PError=1 */
+ wait_status(fd, PARPORT_STATUS_PAPEROUT, PARPORT_STATUS_PAPEROUT, PP_SIGNAL_TIMEOUT);
+
+ cnt++;
+ if (cnt > 4)
+ {
+ BUG("ecp_write_addr transfer stalled\n");
+ goto bugout;
+ }
+ BUG("ecp_write_addr host transfer recovery cnt=%d\n", cnt);
+ continue; /* retry */
+ }
+ break; /* done */
+ } /* while (1) */
+
+ len = 1;
+
+bugout:
+
+ /* Event 37: write HostClk/NStrobe=1 */
+ frob_control(fd, PARPORT_CONTROL_STROBE, PARPORT_CONTROL_STROBE);
+
+ return len;
+}
+
+static int ecp_write_data(int fd, unsigned char data)
+{
+ int cnt=0, len=0;
+
+ // ecp_rev_to_fwd(fd);
+
+ /* Event 33: check PeriphAck/Busy=0 */
+ if (wait_status(fd, PARPORT_STATUS_BUSY, 0, PP_SIGNAL_TIMEOUT))
+ {
+ BUG("ecp_write_data transfer stalled\n");
+ goto bugout;
+ }
+
+ while (1)
+ {
+ /* Event 34: write HostAck/nAutoFD=1 (channel data), data */
+ frob_control(fd, PARPORT_CONTROL_AUTOFD, PARPORT_CONTROL_AUTOFD);
+ ioctl(fd, PPWDATA, &data);
+
+ /* Event 35: write HostClk/NStrobe=0 */
+ frob_control(fd, PARPORT_CONTROL_STROBE, 0);
+
+ /* Event 36: wait PeriphAck/Busy=1 */
+ if (wait_status(fd, PARPORT_STATUS_BUSY, PARPORT_STATUS_BUSY, PP_SIGNAL_TIMEOUT))
+ {
+
+ /* Event 72: write NReverseRequest/nInit=0 (Host Transfer Recovery) */
+ frob_control(fd, PARPORT_CONTROL_INIT, 0);
+
+ /* Event 73: wait nAckReverse/PError=0 */
+ wait_status(fd, PARPORT_STATUS_PAPEROUT, 0, PP_SIGNAL_TIMEOUT);
+
+ /* Event 74: write NReverseRequest/nInit=1 */
+ frob_control(fd, PARPORT_CONTROL_INIT, PARPORT_CONTROL_INIT);
+
+ /* Event 75: wait nAckReverse/PError=1 */
+ wait_status(fd, PARPORT_STATUS_PAPEROUT, PARPORT_STATUS_PAPEROUT, PP_SIGNAL_TIMEOUT);
+
+ cnt++;
+ if (cnt > 4)
+ {
+ BUG("ecp_write_data transfer stalled\n");
+ goto bugout;
+ }
+ BUG("ecp_write_data host transfer recovery cnt=%d\n", cnt);
+ continue; /* retry */
+ }
+ break; /* done */
+ } /* while (1) */
+
+ len = 1;
+
+bugout:
+
+ /* Event 37: write HostClk/NStrobe=1 */
+ frob_control(fd, PARPORT_CONTROL_STROBE, PARPORT_CONTROL_STROBE);
+
+ return len;
+}
+
+static int ecp_read_data(int fd, unsigned char *data)
+{
+ int len=0;
+
+ // ecp_fwd_to_rev(fd);
+
+ /* Event 43: wait PeriphClk/NAck=0 */
+ if (wait_status(fd, PARPORT_STATUS_ACK, 0, PP_SIGNAL_TIMEOUT))
+ {
+ len = -1;
+ goto bugout;
+ }
+ ioctl(fd, PPRDATA, data);
+
+ /* Event 44: write HostAck/nAutoFd=1 */
+ frob_control(fd, PARPORT_CONTROL_AUTOFD, PARPORT_CONTROL_AUTOFD);
+
+ /* Event 45: wait PeriphClk/NAck=1 */
+ wait_status(fd, PARPORT_STATUS_ACK, PARPORT_STATUS_ACK, PP_SIGNAL_TIMEOUT);
+
+ /* Event 46: write HostAck/nAutoFd=0 */
+ frob_control(fd, PARPORT_CONTROL_AUTOFD, 0);
+
+ len = 1;
+
+bugout:
+
+ return len;
+}
+
+static int ecp_read(int fd, void *buffer, int size, int usec)
+{
+ int i=0;
+ unsigned char *p = (unsigned char *)buffer;
+
+ ecp_fwd_to_rev(fd);
+
+ while (i < size)
+ {
+ if (ecp_read_data(fd, p+i) != 1)
+ {
+ usec-=PP_SIGNAL_TIMEOUT;
+ if (usec > 0)
+ continue;
+
+// return -1;
+ return -ETIMEDOUT; /* timeout */
+ }
+ i++;
+ }
+ return i;
+}
+
+static int ecp_write(int fd, const void *buffer, int size)
+{
+ int i;
+ unsigned char *p = (unsigned char *)buffer;
+ static int timeout=0;
+
+ if (timeout)
+ {
+ timeout=0;
+ return -1; /* report timeout */
+ }
+
+ ecp_rev_to_fwd(fd);
+
+ for (i=0; i < size; i++)
+ {
+ if (ecp_write_data(fd, p[i]) != 1)
+ {
+ if (i)
+ timeout=1; /* save timeout, report bytes written */
+ else
+ i=-1; /* report timeout */
+ break;
+ }
+ }
+ return i;
+}
+
+static int nibble_read_data(int fd, unsigned char *data)
+{
+ int len=0;
+ unsigned char nibble;
+
+ /* Event 7: write HostBusy/nAutoFd=0 */
+ frob_control(fd, PARPORT_CONTROL_AUTOFD, 0);
+
+ /* Event 8: peripheral sets low-order nibble. */
+
+ /* Event 9: wait PtrClk/NAck=0 */
+ if (wait_status(fd, PARPORT_STATUS_ACK, 0, PP_SIGNAL_TIMEOUT))
+ {
+ len = -1;
+ goto bugout;
+ }
+ nibble = read_status(fd) >> 3;
+ nibble = ((nibble & 0x10) >> 1) | (nibble & 0x7);
+ *data = nibble;
+
+ /* Event 10: write HostBusy/nAutoFd=1 */
+ frob_control(fd, PARPORT_CONTROL_AUTOFD, PARPORT_CONTROL_AUTOFD);
+
+ /* Event 11: wait PtrClk/NAck=1 */
+ wait_status(fd, PARPORT_STATUS_ACK, PARPORT_STATUS_ACK, PP_SIGNAL_TIMEOUT);
+
+ /* Event 7: write HostBusy/nAutoFd=0 */
+ frob_control(fd, PARPORT_CONTROL_AUTOFD, 0);
+
+ /* Event 8: peripheral sets high-order nibble. */
+
+ /* Event 9: wait PtrClk/NAck=0 */
+ if (wait_status(fd, PARPORT_STATUS_ACK, 0, PP_SIGNAL_TIMEOUT))
+ {
+ len = -1;
+ goto bugout;
+ }
+ nibble = read_status(fd) >> 3;
+ nibble = ((nibble & 0x10) >> 1) | (nibble & 0x7);
+ *data |= (nibble<<4);
+
+ /* Event 10: write HostBusy/nAutoFd=1 */
+ frob_control(fd, PARPORT_CONTROL_AUTOFD, PARPORT_CONTROL_AUTOFD);
+
+ /* Event 11: wait PtrClk/NAck=1 */
+ wait_status(fd, PARPORT_STATUS_ACK, PARPORT_STATUS_ACK, PP_SIGNAL_TIMEOUT);
+
+ len = 1;
+
+bugout:
+
+ return len;
+}
+
+static int nibble_read(int fd, int flag, void *buffer, int size, int usec)
+{
+ int i=0;
+ unsigned char *p = (unsigned char *)buffer;
+ int m = IEEE1284_MODE_NIBBLE | flag;
+ int mc = IEEE1284_MODE_COMPAT;
+ unsigned char status;
+
+ ioctl (fd, PPNEGOT, &mc);
+ if (ioctl (fd, PPNEGOT, &m))
+ {
+ DBG("nibble_read negotiation failed: %m\n");
+ return -1;
+ }
+
+ while (i < size)
+ {
+ if (nibble_read_data(fd, p+i) != 1)
+ {
+ usec-=PP_SIGNAL_TIMEOUT;
+ if (usec > 0)
+ continue;
+
+// return -1;
+ return -ETIMEDOUT; /* timeout */
+ }
+
+ i++;
+
+ /* More data? */
+ status = read_status(fd);
+ if (status & PARPORT_STATUS_ERROR)
+ {
+ /* Event 7: write HostBusy/nAutoFd=0, idle phase */
+ frob_control(fd, PARPORT_CONTROL_AUTOFD, 0);
+
+ break; /* done */
+ }
+ }
+
+ return i;
+}
+
+static int compat_write_data(int fd, unsigned char data)
+{
+ int len=0;
+
+ /* wait Busy=0 */
+ if (wait_status(fd, PARPORT_STATUS_BUSY, 0, PP_DEVICE_TIMEOUT))
+ {
+ BUG("compat_write_data transfer stalled\n");
+ goto bugout;
+ }
+
+ ioctl(fd, PPWDATA, &data);
+ wait(PP_SETUP_TIMEOUT);
+
+ /* write NStrobe=0 */
+ frob_control(fd, PARPORT_CONTROL_STROBE, 0);
+
+ /* wait Busy=1 */
+ if (wait_status(fd, PARPORT_STATUS_BUSY, PARPORT_STATUS_BUSY, PP_SIGNAL_TIMEOUT))
+ {
+ BUG("compat_write_data transfer stalled\n");
+ goto bugout;
+ }
+
+ /* write nStrobe=1 */
+ frob_control(fd, PARPORT_CONTROL_STROBE, PARPORT_CONTROL_STROBE);
+
+ len = 1;
+
+bugout:
+ return len;
+}
+
+static int compat_write(int fd, const void *buffer, int size)
+{
+ int i=0;
+ unsigned char *p = (unsigned char *)buffer;
+ int m = IEEE1284_MODE_COMPAT;
+ static int timeout=0;
+
+ if (timeout)
+ {
+ timeout=0;
+ return -1; /* report timeout */
+ }
+
+ if (ioctl(fd, PPNEGOT, &m))
+ {
+ BUG("compat_write failed: %m\n");
+ goto bugout;
+ }
+
+ for (i=0; i < size; i++)
+ {
+ if (compat_write_data(fd, p[i]) != 1)
+ {
+ if (i)
+ timeout=1; /* save timeout, report bytes written */
+ else
+ i=-1; /* report timeout */
+ break;
+ }
+ }
+
+bugout:
+ return i;
+}
+
+static int claim_pp(int fd)
+{
+ int stat=1;
+
+ /* Claim parallel port (can block forever). */
+ if (ioctl(fd, PPCLAIM))
+ {
+ BUG("failed claim_pp fd=%d: %m\n", fd);
+ goto bugout;
+ }
+
+ DBG("claimed pp fd=%d\n", fd);
+
+ stat=0;
+
+bugout:
+ return stat;
+}
+
+static int release_pp(int fd)
+{
+ int stat=1, m=IEEE1284_MODE_COMPAT;
+
+ /* Restore compat_mode (default), otherwise close(fd) may block restoring compat_mode. */
+ if (ioctl(fd, PPNEGOT, &m))
+ {
+ BUG("failed release_pp fd=%d: %m\n", fd);
+ goto bugout;
+ }
+
+ ioctl(fd, PPRELEASE);
+
+ DBG("released pp fd=%d\n", fd);
+
+ stat=0;
+
+bugout:
+ return 0;
+}
+
+static int device_id(int fd, char *buffer, int size)
+{
+ int len=0, maxSize;
+
+ maxSize = (size > 1024) ? 1024 : size; /* RH8 has a size limit for device id */
+
+ len = nibble_read(fd, IEEE1284_DEVICEID, buffer, maxSize, 0);
+ if (len < 0)
+ {
+ BUG("unable to read device-id ret=%d\n", len);
+ len = 0;
+ goto bugout;
+ }
+ if (len > (size-1))
+ len = size-1; /* leave byte for zero termination */
+ if (len > 2)
+ len -= 2;
+ memcpy(buffer, buffer+2, len); /* remove length */
+ buffer[len]=0;
+
+ DBG("read actual device_id successfully fd=%d len=%d\n", fd, len);
+
+bugout:
+ return len; /* length does not include zero termination */
+}
+
+static int device_status(int fd, unsigned int *status)
+{
+ int m, stat=1;
+ unsigned char byte = NFAULT_BIT; /* set default */
+
+ m = IEEE1284_MODE_COMPAT;
+ if (ioctl (fd, PPNEGOT, &m))
+ {
+ BUG("unable to read device_status: %m\n");
+ stat = HPMUD_R_IO_ERROR;
+ goto bugout;
+ }
+ byte = read_status(fd);
+
+ *status = (unsigned int)byte;
+ stat = 0;
+ DBG("read actual device_status successfully fd=%d\n", fd);
+
+bugout:
+ return stat;
+}
+
+/* Create channel object given the requested socket id and service name. */
+static int new_channel(mud_device *pd, int index, const char *sn)
+{
+ int stat=1;
+
+ /* Check for existing name service already open. */
+ if (pd->channel[index].client_cnt)
+ {
+#if 0
+ if (index == HPMUD_EWS_CHANNEL)
+ {
+ pd->channel[index].client_cnt++; /* allow multiple clients for separate USB interfaces only */
+ stat = 0;
+ DBG("reused %s channel=%d clientCnt=%d channelCnt=%d\n", sn, index, pd->channel[index].client_cnt, pd->channel_cnt);
+ }
+ else
+#endif
+ BUG("%s channel=%d is busy, used by [%d], clientCnt=%d channelCnt=%d\n", sn, index, pd->channel[index].pid, pd->channel[index].client_cnt, pd->channel_cnt);
+ goto bugout;
+ }
+
+ if (pd->io_mode == HPMUD_RAW_MODE || pd->io_mode == HPMUD_UNI_MODE)
+ pd->channel[index].vf = pp_raw_channel_vf;
+ else if (pd->io_mode == HPMUD_MLC_GUSHER_MODE || pd->io_mode == HPMUD_MLC_MISER_MODE)
+ pd->channel[index].vf = pp_mlc_channel_vf;
+ else
+ pd->channel[index].vf = pp_dot4_channel_vf;
+
+ pd->channel[index].index = index;
+ pd->channel[index].client_cnt = 1;
+ pd->channel[index].sockid = index; /* static socket id is valid for MLC but not 1284.4 */
+ pd->channel[index].pid = getpid();
+ pd->channel[index].dindex = pd->index;
+ pd->channel[index].fd = -1;
+ strcpy(pd->channel[index].sn, sn);
+ pd->channel_cnt++;
+
+ stat = 0;
+ DBG("new %s channel=%d clientCnt=%d channelCnt=%d\n", sn, index, pd->channel[index].client_cnt, pd->channel_cnt);
+
+bugout:
+ return stat;
+}
+
+/* Remove channel object given the channel decriptor. */
+static int del_channel(mud_device *pd, mud_channel *pc)
+{
+ pc->client_cnt--;
+
+ if (pc->client_cnt <= 0)
+ {
+ pd->channel_cnt--;
+ }
+ DBG("removed %s channel=%d clientCnt=%d channelCnt=%d\n", pc->sn, pc->index, pc->client_cnt, pd->channel_cnt);
+ return 0;
+}
+
+/*********************************************************************************************************************************
+ * Parallel port mud_device functions.
+ */
+
+int __attribute__ ((visibility ("hidden"))) pp_write(int fd, const void *buf, int size, int usec)
+{
+ int len=0, m;
+
+ ioctl(fd, PPGETMODE, &m);
+
+ if (m & (IEEE1284_MODE_ECPSWE | IEEE1284_MODE_ECP))
+ {
+ len = ecp_write(fd, buf, size);
+ }
+ else
+ {
+ len = compat_write(fd, buf, size);
+ }
+
+ DBG("write fd=%d len=%d size=%d\n", fd, len, size);
+ DBG_DUMP(buf, len < 32 ? len : 32);
+
+ return len;
+}
+
+int __attribute__ ((visibility ("hidden"))) pp_read(int fd, void *buf, int size, int usec)
+{
+ int len=0, m;
+// int sec = usec/1000000;
+
+ ioctl(fd, PPGETMODE, &m);
+
+ if (m & (IEEE1284_MODE_ECPSWE | IEEE1284_MODE_ECP))
+ {
+ len = ecp_read(fd, buf, size, usec);
+ }
+ else
+ {
+ len = nibble_read(fd, 0, buf, size, usec);
+ }
+
+ DBG("read fd=%d len=%d size=%d usec=%d\n", fd, len, size, usec);
+ DBG_DUMP(buf, len < 32 ? len : 32);
+
+ return len;
+}
+
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) pp_open(mud_device *pd)
+{
+ char dev[255], uriModel[128], model[128];
+ int len, m, fd;
+ enum HPMUD_RESULT stat = HPMUD_R_IO_ERROR;
+
+ pthread_mutex_lock(&pd->mutex);
+
+ hpmud_get_uri_model(pd->uri, uriModel, sizeof(uriModel));
+
+ if (pd->id[0] == 0)
+ {
+ /* First client, open actual kernal device, use blocking i/o. */
+ hpmud_get_uri_datalink(pd->uri, dev, sizeof(dev));
+ if ((fd = open(dev, O_RDWR | O_NOCTTY)) < 0)
+ {
+ BUG("unable to open %s: %m\n", pd->uri);
+ goto bugout;
+ }
+
+ /* Open can succeed with no connected device, see if this is a valid device. */
+ if (ioctl(fd, PPGETMODES, &m))
+ {
+ BUG("unable to open %s: %m\n", pd->uri);
+ goto bugout;
+ }
+
+ /* Claim parallel port (can block forever). */
+ if (claim_pp(fd))
+ goto bugout;
+
+ len = device_id(fd, pd->id, sizeof(pd->id)); /* get new copy and cache it */
+
+ if (len > 0 && is_hp(pd->id))
+ power_up(pd, fd);
+
+ release_pp(fd);
+
+ if (len == 0)
+ goto bugout;
+
+ pd->open_fd = fd;
+ }
+
+ /* Make sure uri model matches device id model. */
+ hpmud_get_model(pd->id, model, sizeof(model));
+ if (strcmp(uriModel, model) != 0)
+ {
+ stat = HPMUD_R_INVALID_DEVICE_NODE; /* probably a laserjet, or different device plugged in */
+ BUG("invalid model %s != %s\n", uriModel, model);
+ goto bugout;
+ }
+
+ stat = HPMUD_R_OK;
+
+bugout:
+ pthread_mutex_unlock(&pd->mutex);
+ return stat;
+}
+
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) pp_close(mud_device *pd)
+{
+ enum HPMUD_RESULT stat = HPMUD_R_OK;
+
+ pthread_mutex_lock(&pd->mutex);
+
+ if (pd->open_fd >=0)
+ close(pd->open_fd);
+
+ pd->open_fd = -1;
+ pd->id[0] = 0;
+
+ pthread_mutex_unlock(&pd->mutex);
+
+ return stat;
+}
+
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) pp_get_device_id(mud_device *pd, char *buf, int size, int *len)
+{
+ int m, fd = pd->open_fd;
+ enum HPMUD_RESULT stat = HPMUD_R_DEVICE_BUSY;
+
+ *len=0;
+
+ pthread_mutex_lock(&pd->mutex);
+
+ if (fd < 0)
+ {
+ stat = HPMUD_R_INVALID_STATE;
+ BUG("invalid get_device_id state\n");
+ goto bugout;
+ }
+
+ if (pd->io_mode == HPMUD_UNI_MODE)
+ {
+ *len = strlen(pd->id); /* use cached copy */
+ DBG("using cached device_id io_mode=%d\n", pd->io_mode);
+ }
+ else
+ {
+ ioctl(fd, PPGETMODE, &m);
+ if (m & (IEEE1284_MODE_ECPSWE | IEEE1284_MODE_ECP))
+ {
+ *len = strlen(pd->id); /* channel is busy, return cached copy. */
+ DBG("using cached device_id m=%x\n", m);
+ }
+ else
+ {
+ if (pd->channel_cnt == 0)
+ {
+ /* Device not in use. Claim it, but release for other processes. */
+ if (claim_pp(fd))
+ goto bugout;
+ *len = device_id(fd, pd->id, sizeof(pd->id)); /* get new copy */
+ release_pp(fd);
+ }
+ else
+ {
+ /* Device already claimed by open_channel. */
+ *len = device_id(fd, pd->id, sizeof(pd->id)); /* get new copy */
+ }
+ }
+ }
+
+ if (*len)
+ {
+ memcpy(buf, pd->id, *len > size ? size : *len);
+ stat = HPMUD_R_OK;
+ }
+
+bugout:
+ pthread_mutex_unlock(&pd->mutex);
+ return stat;
+}
+
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) pp_get_device_status(mud_device *pd, unsigned int *status)
+{
+ int fd=pd->open_fd;
+ enum HPMUD_RESULT stat = HPMUD_R_DEVICE_BUSY;
+ int m, r=0;
+
+ pthread_mutex_lock(&pd->mutex);
+
+ if (fd < 0)
+ {
+ stat = HPMUD_R_INVALID_STATE;
+ BUG("invalid get_device_id state\n");
+ goto bugout;
+ }
+
+ if (pd->io_mode == HPMUD_UNI_MODE)
+ {
+ *status = NFAULT_BIT; /* fake status */
+ DBG("using cached device_status io_mode=%d\n", pd->io_mode);
+ }
+ else
+ {
+ ioctl(fd, PPGETMODE, &m);
+ if (m & (IEEE1284_MODE_ECPSWE | IEEE1284_MODE_ECP))
+ {
+ *status = NFAULT_BIT; /* channel is busy, fake 8-bit status */
+ DBG("using cached device_status m=%x\n", m);
+ }
+ else
+ {
+ if (pd->channel_cnt == 0)
+ {
+ /* Device not in use. Claim it, but release for other processes. */
+ if (claim_pp(fd))
+ goto bugout;
+ r = device_status(fd, status);
+ release_pp(fd);
+ }
+ else
+ {
+ /* Device already claimed by open_channel. */
+ r = device_status(fd, status);
+ }
+ }
+ }
+
+ if (r != 0)
+ goto bugout;
+
+ stat = HPMUD_R_OK;
+
+bugout:
+ pthread_mutex_unlock(&pd->mutex);
+ return stat;
+}
+
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) pp_channel_open(mud_device *pd, const char *sn, HPMUD_CHANNEL *cd)
+{
+ int index;
+ enum HPMUD_RESULT stat = HPMUD_R_DEVICE_BUSY;
+
+ /* Check for valid service requests. */
+ if ((stat = service_to_channel(pd, sn, &index)) != HPMUD_R_OK)
+ goto bugout;
+
+ pthread_mutex_lock(&pd->mutex);
+
+ if (new_channel(pd, index, sn))
+ {
+ stat = HPMUD_R_DEVICE_BUSY;
+ }
+ else
+ {
+ if ((stat = (pd->channel[index].vf.open)(&pd->channel[index])) != HPMUD_R_OK) /* call transport specific open */
+ del_channel(pd, &pd->channel[index]); /* open failed, cleanup */
+ else
+ *cd = index;
+ }
+
+ pthread_mutex_unlock(&pd->mutex);
+
+bugout:
+ return stat;
+}
+
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) pp_channel_close(mud_device *pd, mud_channel *pc)
+{
+ enum HPMUD_RESULT stat = HPMUD_R_OK;
+
+ pthread_mutex_lock(&pd->mutex);
+ stat = (pc->vf.close)(pc); /* call trasport specific close */
+ del_channel(pd, pc);
+ pthread_mutex_unlock(&pd->mutex);
+
+ return stat;
+}
+
+/*******************************************************************************************************************************
+ * Parallel port raw_channel functions.
+ */
+
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) pp_raw_channel_open(mud_channel *pc)
+{
+ mud_device *pd = &msp->device[pc->dindex];
+ if (claim_pp(pd->open_fd))
+ return HPMUD_R_IO_ERROR;
+ pc->fd = pd->open_fd;
+ return HPMUD_R_OK;
+}
+
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) pp_raw_channel_close(mud_channel *pc)
+{
+ if (pc->fd >= 0)
+ release_pp(pc->fd);
+ pc->fd = -1;
+ return HPMUD_R_OK;
+}
+
+/*******************************************************************************************************************************
+ * Parallel port mlc_channel functions.
+ */
+
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) pp_mlc_channel_open(mud_channel *pc)
+{
+ mud_device *pd = &msp->device[pc->dindex];
+ enum HPMUD_RESULT stat = HPMUD_R_IO_ERROR;
+ int i, m;
+
+ /* Initialize MLC transport if this is the first MLC channel. */
+ if (pd->channel_cnt==1)
+ {
+ if (claim_pp(pd->open_fd))
+ goto bugout;
+
+ /* Negotiate ECP mode. */
+ m = IEEE1284_MODE_ECPSWE;
+ if (ioctl(pd->open_fd, PPNEGOT, &m))
+ {
+ BUG("unable to negotiate %s ECP mode: %m\n", pd->uri);
+ goto bugout;
+ }
+
+ /* Enable MLC mode with ECP channel-77. */
+ ecp_write_addr(pd->open_fd, 78);
+ ecp_write(pd->open_fd, "\0", 1);
+ ecp_write_addr(pd->open_fd, 77);
+
+ /* MLC initialize */
+ if (MlcInit(pc, pd->open_fd) != 0)
+ goto bugout;
+
+ /* Reset transport attributes for all channels. */
+ for (i=0; i<HPMUD_CHANNEL_MAX; i++)
+ memset(&pd->channel[i].ta, 0 , sizeof(transport_attributes));
+
+ pd->mlc_fd = pd->open_fd;
+ pd->mlc_up=1;
+
+ } /* if (pDev->ChannelCnt==1) */
+
+ if (MlcConfigSocket(pc, pd->mlc_fd))
+ goto bugout;
+
+ if (MlcOpenChannel(pc, pd->mlc_fd))
+ goto bugout;
+
+ pc->rcnt = pc->rindex = 0;
+
+ stat = HPMUD_R_OK;
+
+bugout:
+ return stat;
+}
+
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) pp_mlc_channel_close(mud_channel *pc)
+{
+ mud_device *pd = &msp->device[pc->dindex];
+ enum HPMUD_RESULT stat = HPMUD_R_OK;
+ int m;
+
+ if (pd->mlc_up)
+ {
+ if (MlcCloseChannel(pc, pd->mlc_fd))
+ stat = HPMUD_R_IO_ERROR;
+ }
+
+ /* Remove MLC transport if this is the last MLC channel. */
+ if (pd->channel_cnt==1)
+ {
+ if (pd->mlc_up)
+ {
+ if (MlcExit(pc, pd->mlc_fd))
+ stat = HPMUD_R_IO_ERROR;
+ }
+ pd->mlc_up=0;
+
+ ecp_write_addr(pd->mlc_fd, 78); /* disable MLC mode with ECP channel-78 */
+ ecp_write(pd->mlc_fd, "\0", 1);
+
+ m = IEEE1284_MODE_NIBBLE;
+ ioctl(pd->mlc_fd, PPNEGOT, &m);
+ release_pp(pd->mlc_fd);
+
+ /* Delay for batch scanning. */
+ sleep(1);
+ }
+
+ return stat;
+}
+
+/*******************************************************************************************************************************
+ * Parallel port dot4_channel functions.
+ */
+
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) pp_dot4_channel_open(mud_channel *pc)
+{
+ mud_device *pd = &msp->device[pc->dindex];
+ enum HPMUD_RESULT stat = HPMUD_R_IO_ERROR;
+ int i, m;
+
+ /* Initialize MLC transport if this is the first MLC channel. */
+ if (pd->channel_cnt==1)
+ {
+ if (claim_pp(pd->open_fd))
+ goto bugout;
+
+ /* Negotiate ECP mode. */
+ m = IEEE1284_MODE_ECPSWE;
+ if (ioctl(pd->open_fd, PPNEGOT, &m))
+ {
+ BUG("unable to negotiate %s ECP mode: %m\n", pd->uri);
+ goto bugout;
+ }
+
+ /* Enable MLC mode with ECP channel-77. */
+ ecp_write_addr(pd->open_fd, 78);
+ ecp_write(pd->open_fd, "\0", 1);
+ ecp_write_addr(pd->open_fd, 77);
+
+ /* DOT4 initialize */
+ if (Dot4Init(pc, pd->open_fd) != 0)
+ goto bugout;
+
+ /* Reset transport attributes for all channels. */
+ for (i=0; i<HPMUD_CHANNEL_MAX; i++)
+ memset(&pd->channel[i].ta, 0 , sizeof(transport_attributes));
+
+ pd->mlc_fd = pd->open_fd;
+ pd->mlc_up=1;
+
+ } /* if (pDev->ChannelCnt==1) */
+
+ if (Dot4GetSocket(pc, pd->mlc_fd))
+ goto bugout;
+
+ if (Dot4OpenChannel(pc, pd->mlc_fd))
+ goto bugout;
+
+ pc->rcnt = pc->rindex = 0;
+
+ stat = HPMUD_R_OK;
+
+bugout:
+ return stat;
+}
+
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) pp_dot4_channel_close(mud_channel *pc)
+{
+ mud_device *pd = &msp->device[pc->dindex];
+ enum HPMUD_RESULT stat = HPMUD_R_OK;
+ int m;
+
+ if (pd->mlc_up)
+ {
+ if (Dot4CloseChannel(pc, pd->mlc_fd))
+ stat = HPMUD_R_IO_ERROR;
+ }
+
+ /* Remove MLC transport if this is the last MLC channel. */
+ if (pd->channel_cnt==1)
+ {
+ if (pd->mlc_up)
+ {
+ if (Dot4Exit(pc, pd->mlc_fd))
+ stat = HPMUD_R_IO_ERROR;
+ }
+ pd->mlc_up=0;
+
+ ecp_write_addr(pd->mlc_fd, 78); /* disable MLC mode with ECP channel-78 */
+ ecp_write(pd->mlc_fd, "\0", 1);
+
+ m = IEEE1284_MODE_NIBBLE;
+ ioctl(pd->mlc_fd, PPNEGOT, &m);
+ release_pp(pd->mlc_fd);
+
+ /* Delay for batch scanning. */
+ sleep(1);
+ }
+
+ return stat;
+}
+
+/*******************************************************************************************************************************
+ * Parallel port probe devices, walk the parallel port bus(s) looking for HP products.
+ */
+
+int __attribute__ ((visibility ("hidden"))) pp_probe_devices(char *lst, int lst_size, int *cnt)
+{
+ struct hpmud_model_attributes ma;
+ char dev[HPMUD_LINE_SIZE];
+ char rmodel[128];
+ char model[128];
+ char id[1024];
+ int i, size=0, fd, m;
+
+ for (i=0; i < 4; i++)
+ {
+ sprintf(dev, "/dev/parport%d", i);
+
+ if ((fd = open(dev, O_RDONLY | O_NOCTTY)) < 0)
+ continue;
+
+ /* Silently check the port for valid device (no syslog errors). */
+ if (ioctl(fd, PPGETMODES, &m) == 0)
+ {
+ if (claim_pp(fd) == 0)
+ {
+ if (device_id(fd, id, sizeof(id)) > 0 && is_hp(id))
+ {
+ hpmud_get_model(id, model, sizeof(model));
+ hpmud_get_raw_model(id, rmodel, sizeof(rmodel));
+ snprintf(dev, sizeof(dev), "hp:/par/%s?device=/dev/parport%d", model, i);
+
+ /* See if device is supported by hplip. */
+ hpmud_query_model(dev, &ma);
+ if (ma.support != HPMUD_SUPPORT_TYPE_HPLIP)
+ {
+ BUG("ignoring %s support=%d\n", dev, ma.support);
+ continue; /* ignor, not supported */
+ }
+
+ if (strncasecmp(rmodel, "hp ", 3) == 0)
+ size += sprintf(lst+size,"direct %s \"HP %s\" \"HP %s LPT parport%d HPLIP\" \"%s\"\n", dev, &rmodel[3], &rmodel[3], i, id);
+ else
+ size += sprintf(lst+size,"direct %s \"HP %s\" \"HP %s LPT parport%d HPLIP\" \"%s\"\n", dev, rmodel, rmodel, i, id);
+ *cnt+=1;
+ }
+ release_pp(fd);
+ }
+ else
+ {
+ BUG("unable to probe %s: %m\n", dev); /* device is busy */
+ }
+ }
+ close(fd);
+ }
+ return size;
+}
+
+enum HPMUD_RESULT hpmud_make_par_uri(const char *dnode, char *uri, int uri_size, int *bytes_read)
+{
+ char model[128];
+ char id[1024];
+ enum HPMUD_RESULT stat = HPMUD_R_IO_ERROR;
+ int fd=-1, m;
+
+ DBG("[%d] hpmud_make_par_uri() dnode=%s\n", getpid(), dnode);
+
+ *bytes_read=0;
+
+ uri[0]=0;
+
+ if ((fd = open(dnode, O_RDONLY | O_NOCTTY)) < 0)
+ {
+ BUG("unable to open %s: %m\n", dnode);
+ goto bugout;
+ }
+
+ if (ioctl(fd, PPGETMODES, &m))
+ {
+ BUG("unable to make uri %s: %m\n", dnode);
+ goto bugout;
+ }
+
+ if (claim_pp(fd))
+ {
+ BUG("unable to make uri %s: %m\n", dnode); /* device is busy */
+ goto bugout;
+ }
+
+ if (device_id(fd, id, sizeof(id)) > 0 && is_hp(id))
+ {
+ hpmud_get_model(id, model, sizeof(model));
+ *bytes_read = snprintf(uri, uri_size, "hp:/par/%s?device=%s", model, dnode);
+ }
+ release_pp(fd);
+
+ stat = HPMUD_R_OK;
+
+bugout:
+ if (fd >= 0)
+ close(fd);
+ return stat;
+}
+
+#endif /* HAVE_PPORT */
diff --git a/io/hpmud/pp.h b/io/hpmud/pp.h
new file mode 100644
index 0000000..5a5198f
--- /dev/null
+++ b/io/hpmud/pp.h
@@ -0,0 +1,100 @@
+/*****************************************************************************\
+
+ pp.h - parallel port support for multi-point transport driver
+
+ (c) 2004-2007 Copyright Hewlett-Packard Development Company, LP
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+ of the Software, and to permit persons to whom the Software is furnished to do
+ so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+\*****************************************************************************/
+
+#ifndef _PP_H
+#define _PP_H
+
+#include <sys/ioctl.h>
+#include <linux/parport.h>
+#include <linux/ppdev.h>
+#include "hpmud.h"
+#include "hpmudi.h"
+
+/*
+ * PC-style parallel port bit definitions.
+ *
+ * Status
+ * bit
+ * 7 - Busy *
+ * 6 - NAck
+ * 5 - PError (PARPORT_STATUS_PAPEROUT)
+ * 4 - Select
+ *
+ * 3 - NFault (PARPORT_STATUS_ERROR)
+ * 2 -
+ * 1 -
+ * 0 -
+ *
+ * Control
+ * bit
+ * 7 -
+ * 6 -
+ * 5 -
+ * 4 -
+ *
+ * 3 - Select *
+ * 2 - Init
+ * 1 - AutoFD *
+ * 0 - Strobe *
+ *
+ * * inverted
+ *
+ * Notes:
+ * For ECP mode use low-level parport ioctl instead of high-level parport read/writes because its more reliable. High-level support
+ * for Compatible and Nibble modes are probably ok, but for consistency low-level parport ioctl is used.
+ *
+ */
+
+#define PP_DEVICE_TIMEOUT 30000000 /* device timeout (us) */
+//#define PP_SIGNAL_TIMEOUT 1000000 /* signal timeout (us), too long for 1ms timeout, DES 8/18/08 */
+//#define PP_SIGNAL_TIMEOUT 1000 /* signal timeout (us), too short for DJ540, DES 8/18/08 */
+#define PP_SIGNAL_TIMEOUT 100000 /* signal timeout (us), DES 8/18/08 */
+#define PP_SETUP_TIMEOUT 10 /* setup timeout (us) */
+
+struct _mud_device;
+struct _mud_channel;
+
+extern struct _mud_device_vf __attribute__ ((visibility ("hidden"))) pp_mud_device_vf;
+
+int __attribute__ ((visibility ("hidden"))) pp_write(int fd, const void *buf, int size, int usec);
+int __attribute__ ((visibility ("hidden"))) pp_read(int fd, void *buf, int size, int usec);
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) pp_open(struct _mud_device *pd);
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) pp_close(struct _mud_device *pd);
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) pp_get_device_id(struct _mud_device *pd, char *buf, int size, int *len);
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) pp_get_device_status(struct _mud_device *pd, unsigned int *status);
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) pp_channel_open(struct _mud_device *pd, const char *sn, HPMUD_CHANNEL *cd);
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) pp_channel_close(struct _mud_device *pd, struct _mud_channel *pc);
+
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) pp_raw_channel_open(struct _mud_channel *pc);
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) pp_raw_channel_close(struct _mud_channel *pc);
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) pp_mlc_channel_open(struct _mud_channel *pc);
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) pp_mlc_channel_close(struct _mud_channel *pc);
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) pp_dot4_channel_open(struct _mud_channel *pc);
+enum HPMUD_RESULT __attribute__ ((visibility ("hidden"))) pp_dot4_channel_close(struct _mud_channel *pc);
+
+int __attribute__ ((visibility ("hidden"))) pp_probe_devices(char *lst, int lst_size, int *cnt);
+
+#endif // _PP_H
+
diff --git a/io/mudext/hpmudext.c b/io/mudext/hpmudext.c
new file mode 100644
index 0000000..e387501
--- /dev/null
+++ b/io/mudext/hpmudext.c
@@ -0,0 +1,495 @@
+/*****************************************************************************\
+ hpmudext - Python extension for HP multi-point transport driver (HPMUD)
+
+ (c) Copyright 2010 Hewlett-Packard Development Company, L.P.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+Requires:
+Python 2.2+
+
+Authors: Don Welch, David Suffield, Naga Samrat Chowdary Narla
+
+\*****************************************************************************/
+
+#include <Python.h>
+#include "hpmud.h"
+#include "hpmudi.h"
+
+/* Ref: PEP 353 (Python 2.5) */
+#if PY_VERSION_HEX < 0x02050000
+typedef int Py_ssize_t;
+#define PY_SSIZE_T_MAX INT_MAX
+#define PY_SSIZE_T_MIN INT_MIN
+#endif
+
+/*
+HPMUDEXT API:
+
+result_code, dd = open_device(uri, io_mode)
+
+result_code = close_device(dd)
+
+result_code, data = get_device_id(dd)
+
+result_code, data = probe_devices(bus)
+
+result_code, cd = open_channel(dd, channel_name)
+
+result_code = close_channel(dd, cd)
+
+result_code, bytes_written = write_channel(dd, cd, data, [timeout])
+
+result_code, data = read_channel(dd, cd, bytes_to_read, [timeout])
+
+result_code, pml_result_code = set_pml(dd, cd, oid, type, data)
+
+result_code, data, pml_result_code = get_pml(dd, cd, oid, type)
+
+result_code, uri = make_usb_uri(busnum, devnum)
+
+result_code, uri = make_net_uri(ip, port)
+
+result_code, uri = make_zc_uri(ip, port)
+
+result_code, ip_address = get_zc_ip_address(hostname)
+
+result_code, uri = make_par_uri(devnode)
+
+*/
+
+
+ static PyObject *open_device(PyObject *self, PyObject *args)
+{
+ char * uri;
+ enum HPMUD_IO_MODE io_mode;
+ HPMUD_DEVICE dd;
+ enum HPMUD_RESULT result = HPMUD_R_OK;
+
+ if (!PyArg_ParseTuple(args, "si", &uri, &io_mode))
+ return NULL;
+
+ Py_BEGIN_ALLOW_THREADS
+ result = hpmud_open_device(uri, io_mode, &dd);
+ Py_END_ALLOW_THREADS
+
+ return Py_BuildValue("(ii)", result, dd);
+}
+
+static PyObject *close_device(PyObject *self, PyObject *args)
+{
+ HPMUD_DEVICE dd;
+ enum HPMUD_RESULT result = HPMUD_R_OK;
+
+ if (!PyArg_ParseTuple(args, "i", &dd))
+ return NULL;
+
+ Py_BEGIN_ALLOW_THREADS
+ result = hpmud_close_device(dd);
+ Py_END_ALLOW_THREADS
+
+ return Py_BuildValue("i", result);
+}
+
+static PyObject *get_device_id(PyObject *self, PyObject *args)
+{
+ HPMUD_DEVICE dd;
+ enum HPMUD_RESULT result = HPMUD_R_OK;
+ char buf[HPMUD_BUFFER_SIZE];
+ int bytes_read = 0;
+
+ if (!PyArg_ParseTuple(args, "i", &dd))
+ return NULL;
+
+ Py_BEGIN_ALLOW_THREADS
+ result = hpmud_get_device_id(dd, buf, HPMUD_BUFFER_SIZE, &bytes_read);
+ Py_END_ALLOW_THREADS
+
+ return Py_BuildValue("(is#)", result, buf, bytes_read);
+
+}
+
+static PyObject *probe_devices(PyObject *self, PyObject *args)
+{
+ enum HPMUD_BUS_ID bus;
+ enum HPMUD_RESULT result = HPMUD_R_OK;
+ int cnt = 0;
+ int bytes_read = 0;
+ char buf[HPMUD_BUFFER_SIZE * 4];
+
+ if (!PyArg_ParseTuple(args, "i", &bus))
+ return NULL;
+
+ Py_BEGIN_ALLOW_THREADS
+ result = hpmud_probe_devices(bus, buf, HPMUD_BUFFER_SIZE * 4, &cnt, &bytes_read);
+ Py_END_ALLOW_THREADS
+
+ return Py_BuildValue("(is#)", result, buf, bytes_read);
+}
+
+static PyObject *open_channel(PyObject *self, PyObject *args)
+{
+ enum HPMUD_RESULT result = HPMUD_R_OK;
+ HPMUD_DEVICE dd = -1;
+ char * channel_name;
+ HPMUD_CHANNEL cd = -1;
+
+ if (!PyArg_ParseTuple(args, "is", &dd, &channel_name))
+ return NULL;
+
+ Py_BEGIN_ALLOW_THREADS
+ result = hpmud_open_channel(dd, channel_name, &cd);
+ Py_END_ALLOW_THREADS
+
+ return Py_BuildValue("(ii)", result, cd);
+
+}
+
+static PyObject *close_channel(PyObject *self, PyObject *args)
+{
+ enum HPMUD_RESULT result = HPMUD_R_OK;
+ HPMUD_DEVICE dd;
+ HPMUD_CHANNEL cd;
+
+ if (!PyArg_ParseTuple(args, "ii", &dd, &cd))
+ return NULL;
+
+ Py_BEGIN_ALLOW_THREADS
+ result = hpmud_close_channel(dd, cd);
+ Py_END_ALLOW_THREADS
+
+ return Py_BuildValue("i", result);
+}
+
+static PyObject *write_channel(PyObject *self, PyObject *args)
+{
+ enum HPMUD_RESULT result = HPMUD_R_OK;
+ HPMUD_DEVICE dd;
+ HPMUD_CHANNEL cd;
+ int timeout = 30;
+ char * buf;
+ int buf_size = 0;
+ int bytes_written = 0;
+
+ if (!PyArg_ParseTuple(args, "iis#|i", &dd, &cd, &buf, &buf_size, &timeout))
+ return NULL;
+
+ Py_BEGIN_ALLOW_THREADS
+ result = hpmud_write_channel(dd, cd, buf, buf_size, timeout, &bytes_written);
+ Py_END_ALLOW_THREADS
+
+ return Py_BuildValue("(ii)", result, bytes_written);
+}
+
+static PyObject *read_channel(PyObject *self, PyObject *args)
+{
+ enum HPMUD_RESULT result = HPMUD_R_OK;
+ HPMUD_DEVICE dd;
+ HPMUD_CHANNEL cd;
+ int timeout = 30;
+ char buf[HPMUD_BUFFER_SIZE];
+ int bytes_read = 0;
+ int bytes_to_read;
+
+ if (!PyArg_ParseTuple(args, "iii|i", &dd, &cd, &bytes_to_read, &timeout))
+ return NULL;
+
+ if (bytes_to_read > HPMUD_BUFFER_SIZE)
+ return Py_BuildValue("(is#)", HPMUD_R_INVALID_LENGTH, "", 0);
+
+ Py_BEGIN_ALLOW_THREADS
+ result = hpmud_read_channel(dd, cd, (void *)buf, bytes_to_read, timeout, &bytes_read);
+ Py_END_ALLOW_THREADS
+
+ return Py_BuildValue("(is#)", result, buf, bytes_read);
+}
+
+static PyObject *set_pml(PyObject *self, PyObject *args)
+{
+ enum HPMUD_RESULT result = HPMUD_R_OK;
+ HPMUD_DEVICE dd;
+ HPMUD_CHANNEL cd;
+ char * oid;
+ int type;
+ char * data;
+ int data_size;
+ int pml_result;
+
+ if (!PyArg_ParseTuple(args, "iisis#", &dd, &cd, &oid, &type, &data, &data_size))
+ return NULL;
+
+ Py_BEGIN_ALLOW_THREADS
+ result = hpmud_set_pml(dd, cd, oid, type, (void *)data, data_size, &pml_result);
+ Py_END_ALLOW_THREADS
+
+ return Py_BuildValue("(ii)", result, pml_result);
+}
+
+static PyObject *get_pml(PyObject *self, PyObject *args)
+{
+ enum HPMUD_RESULT result = HPMUD_R_OK;
+ HPMUD_DEVICE dd;
+ HPMUD_CHANNEL cd;
+ char * oid;
+ int type;
+ char buf[HPMUD_BUFFER_SIZE * 4];
+ int pml_result;
+ int bytes_read = 0;
+
+ if (!PyArg_ParseTuple(args, "iisi", &dd, &cd, &oid, &type))
+ return NULL;
+
+ Py_BEGIN_ALLOW_THREADS
+ result = hpmud_get_pml(dd, cd, oid, (void *)buf, HPMUD_BUFFER_SIZE * 4, &bytes_read, &type, &pml_result);
+ Py_END_ALLOW_THREADS
+
+ return Py_BuildValue("(is#ii)", result, buf, bytes_read, type, pml_result);
+}
+
+static PyObject *make_usb_uri(PyObject *self, PyObject *args)
+{
+ char * busnum;
+ char * devnum;
+ char uri[HPMUD_BUFFER_SIZE];
+ enum HPMUD_RESULT result = HPMUD_R_OK;
+ int bytes_read = 0;
+
+ if (!PyArg_ParseTuple(args, "ss", &busnum, &devnum))
+ return NULL;
+
+ Py_BEGIN_ALLOW_THREADS
+ result = hpmud_make_usb_uri(busnum, devnum, uri, HPMUD_BUFFER_SIZE, &bytes_read);
+ Py_END_ALLOW_THREADS
+
+ return Py_BuildValue("(is#)", result, uri, bytes_read);
+}
+
+#ifdef HAVE_LIBNETSNMP
+static PyObject *make_net_uri(PyObject *self, PyObject *args)
+{
+ char * ip;
+ int port;
+ char uri[HPMUD_BUFFER_SIZE];
+ enum HPMUD_RESULT result = HPMUD_R_OK;
+ int bytes_read = 0;
+
+ if (!PyArg_ParseTuple(args, "si", &ip, &port))
+ return NULL;
+
+ Py_BEGIN_ALLOW_THREADS
+ result = hpmud_make_net_uri(ip, port, uri, HPMUD_BUFFER_SIZE, &bytes_read);
+ Py_END_ALLOW_THREADS
+
+ return Py_BuildValue("(is#)", result, uri, bytes_read);
+}
+#else
+static PyObject *make_net_uri(PyObject *self, PyObject *args)
+{
+ return Py_BuildValue("(is#)", HPMUD_R_INVALID_URI, "", 0);
+}
+#endif /* HAVE_LIBSNMP */
+
+#ifdef HAVE_LIBNETSNMP
+static PyObject *make_zc_uri(PyObject *self, PyObject *args)
+{
+ char *hn;
+ int port;
+ char uri[HPMUD_BUFFER_SIZE];
+ enum HPMUD_RESULT result = HPMUD_R_OK;
+ int bytes_read = 0;
+
+ if (!PyArg_ParseTuple(args, "si", &hn, &port))
+ return NULL;
+
+ Py_BEGIN_ALLOW_THREADS
+ result = hpmud_make_mdns_uri(hn, port, uri, HPMUD_BUFFER_SIZE, &bytes_read);
+ Py_END_ALLOW_THREADS
+
+ return Py_BuildValue("(is#)", result, uri, bytes_read);
+}
+#else
+static PyObject *make_zc_uri(PyObject *self, PyObject *args)
+{
+ return Py_BuildValue("(is#)", HPMUD_R_INVALID_URI, "", 0);
+}
+#endif /* HAVE_LIBSNMP */
+
+#ifdef HAVE_LIBNETSNMP
+static PyObject *get_zc_ip_address(PyObject *self, PyObject *args)
+{
+ char *hn;
+ char ip[HPMUD_BUFFER_SIZE];
+ enum HPMUD_RESULT result = HPMUD_R_OK;
+
+ if (!PyArg_ParseTuple(args, "s", &hn))
+ return NULL;
+
+ Py_BEGIN_ALLOW_THREADS
+ result = hpmud_mdns_lookup(hn, HPMUD_MDNS_TIMEOUT, ip);
+ Py_END_ALLOW_THREADS
+
+ return Py_BuildValue("(is)", result, ip);
+}
+#else
+static PyObject *get_zc_ip_address(PyObject *self, PyObject *args)
+{
+ return Py_BuildValue("(is)", HPMUD_R_INVALID_URI, "");
+}
+#endif /* HAVE_LIBSNMP */
+
+#ifdef HAVE_PPORT
+static PyObject *make_par_uri(PyObject *self, PyObject *args)
+{
+ char * devnode;
+ char uri[HPMUD_BUFFER_SIZE];
+ enum HPMUD_RESULT result = HPMUD_R_OK;
+ int bytes_read = 0;
+
+ if (!PyArg_ParseTuple(args, "s", &devnode))
+ return NULL;
+
+ Py_BEGIN_ALLOW_THREADS
+ result = hpmud_make_par_uri(devnode, uri, HPMUD_BUFFER_SIZE, &bytes_read);
+ Py_END_ALLOW_THREADS
+
+ return Py_BuildValue("(is#)", result, uri, bytes_read);
+}
+#else
+static PyObject *make_par_uri(PyObject *self, PyObject *args)
+{
+ return Py_BuildValue("(is#)", HPMUD_R_INVALID_URI, "", 0);
+}
+#endif /* HAVE_PPORT */
+
+// Unwrapped MUD APIs:
+// int hpmud_get_model(const char *id, char *buf, int buf_size);
+// int hpmud_get_uri_model(const char *uri, char *buf, int buf_size);
+// int hpmud_get_uri_datalink(const char *uri, char *buf, int buf_size);
+// enum HPMUD_RESULT hpmud_get_model_attributes(char *uri, char *attr, int attrSize);
+// enum HPMUD_RESULT hpmud_model_query(char *uri, struct hpmud_model_attributes *ma);
+// enum HPMUD_RESULT hpmud_get_device_status(HPMUD_DEVICE dd, unsigned int *status);
+// enum HPMUD_RESULT hpmud_get_dstat(HPMUD_DEVICE dd, struct hpmud_dstat *ds);
+
+
+static PyMethodDef mudext_functions[] =
+{
+ {"open_device", (PyCFunction)open_device, METH_VARARGS },
+ {"close_device", (PyCFunction)close_device, METH_VARARGS },
+ {"get_device_id", (PyCFunction)get_device_id, METH_VARARGS },
+ {"probe_devices", (PyCFunction)probe_devices, METH_VARARGS },
+ {"open_channel", (PyCFunction)open_channel, METH_VARARGS },
+ {"write_channel", (PyCFunction)write_channel, METH_VARARGS },
+ {"read_channel", (PyCFunction)read_channel, METH_VARARGS },
+ {"close_channel", (PyCFunction)close_channel, METH_VARARGS },
+ {"set_pml", (PyCFunction)set_pml, METH_VARARGS },
+ {"get_pml", (PyCFunction)get_pml, METH_VARARGS },
+ {"make_usb_uri", (PyCFunction)make_usb_uri, METH_VARARGS },
+ {"make_net_uri", (PyCFunction)make_net_uri, METH_VARARGS },
+ {"make_zc_uri", (PyCFunction)make_zc_uri, METH_VARARGS },
+ {"get_zc_ip_address", (PyCFunction)get_zc_ip_address, METH_VARARGS },
+ {"make_par_uri", (PyCFunction)make_par_uri, METH_VARARGS },
+ { NULL, NULL }
+};
+
+
+static char mudext_documentation[] = "Python extension for HP multi-point transport driver";
+
+static void insint(PyObject *d, char *name, int value)
+{
+ PyObject *v = PyInt_FromLong((long) value);
+
+ if (!v || PyDict_SetItemString(d, name, v))
+ Py_FatalError("Initialization failed.");
+
+ Py_DECREF(v);
+}
+
+static void insstr(PyObject *d, char *name, char *value)
+{
+ PyObject *v = PyString_FromString(value);
+
+ if (!v || PyDict_SetItemString(d, name, v))
+ Py_FatalError("Initialization failed.");
+
+ Py_DECREF(v);
+}
+
+
+void inithpmudext(void)
+{
+ PyObject *mod = Py_InitModule3("hpmudext", mudext_functions, mudext_documentation);
+
+ if (mod == NULL)
+ return;
+
+ PyObject * d = PyModule_GetDict(mod);
+
+ // enum HPMUD_RESULT
+ insint(d, "HPMUD_R_OK", HPMUD_R_OK);
+ insint(d, "HPMUD_R_INVALID_DEVICE", HPMUD_R_INVALID_DEVICE);
+ insint(d, "HPMUD_R_INVALID_DESCRIPTOR", HPMUD_R_INVALID_DESCRIPTOR);
+ insint(d, "HPMUD_R_INVALID_URI", HPMUD_R_INVALID_URI);
+ insint(d, "HPMUD_R_INVALID_LENGTH", HPMUD_R_INVALID_LENGTH);
+ insint(d, "HPMUD_R_IO_ERROR", HPMUD_R_IO_ERROR);
+ insint(d, "HPMUD_R_DEVICE_BUSY", HPMUD_R_DEVICE_BUSY);
+ insint(d, "HPMUD_R_INVALID_SN", HPMUD_R_INVALID_SN);
+ insint(d, "HPMUD_R_INVALID_CHANNEL_ID", HPMUD_R_INVALID_CHANNEL_ID);
+ insint(d, "HPMUD_R_INVALID_STATE", HPMUD_R_INVALID_STATE);
+ insint(d, "HPMUD_R_INVALID_DEVICE_OPEN", HPMUD_R_INVALID_DEVICE_OPEN);
+ insint(d, "HPMUD_R_INVALID_DEVICE_NODE", HPMUD_R_INVALID_DEVICE_NODE);
+ insint(d, "HPMUD_R_INVALID_IP", HPMUD_R_INVALID_IP);
+ insint(d, "HPMUD_R_INVALID_IP_PORT", HPMUD_R_INVALID_IP_PORT);
+ insint(d, "HPMUD_R_INVALID_TIMEOUT", HPMUD_R_INVALID_TIMEOUT);
+ insint(d, "HPMUD_R_DATFILE_ERROR", HPMUD_R_DATFILE_ERROR);
+ insint(d, "HPMUD_R_IO_TIMEOUT", HPMUD_R_IO_TIMEOUT);
+
+ // enum HPMUD_IO_MODE
+ insint(d, "HPMUD_UNI_MODE", HPMUD_UNI_MODE);
+ insint(d, "HPMUD_RAW_MODE",HPMUD_RAW_MODE);
+ insint(d, "HPMUD_DOT4_MODE", HPMUD_DOT4_MODE);
+ insint(d, "HPMUD_DOT4_PHOENIX_MODE", HPMUD_DOT4_PHOENIX_MODE);
+ insint(d, "HPMUD_DOT4_BRIDGE_MODE", HPMUD_DOT4_BRIDGE_MODE);
+ insint(d, "HPMUD_MLC_GUSHER_MODE", HPMUD_MLC_GUSHER_MODE);
+ insint(d, "HPMUD_MLC_MISER_MODE", HPMUD_MLC_MISER_MODE);
+
+ // enum HPMUD_BUS_ID
+ insint(d, "HPMUD_BUS_NA", HPMUD_BUS_NA);
+ insint(d, "HPMUD_BUS_USB", HPMUD_BUS_USB);
+ insint(d, "HPMUD_BUS_PARALLEL", HPMUD_BUS_PARALLEL);
+ insint(d, "HPMUD_BUS_ALL", HPMUD_BUS_ALL);
+
+ // Channel names
+ insstr(d, "HPMUD_S_PRINT_CHANNEL", HPMUD_S_PRINT_CHANNEL);
+ insstr(d, "HPMUD_S_PML_CHANNEL", HPMUD_S_PML_CHANNEL);
+ insstr(d, "HPMUD_S_SCAN_CHANNEL", HPMUD_S_SCAN_CHANNEL);
+ insstr(d, "HPMUD_S_FAX_SEND_CHANNEL", HPMUD_S_FAX_SEND_CHANNEL);
+ insstr(d, "HPMUD_S_CONFIG_UPLOAD_CHANNEL", HPMUD_S_CONFIG_UPLOAD_CHANNEL);
+ insstr(d, "HPMUD_S_CONFIG_DOWNLOAD_CHANNEL", HPMUD_S_CONFIG_DOWNLOAD_CHANNEL);
+ insstr(d, "HPMUD_S_MEMORY_CARD_CHANNEL", HPMUD_S_MEMORY_CARD_CHANNEL);
+ insstr(d, "HPMUD_S_EWS_CHANNEL", HPMUD_S_EWS_CHANNEL);
+ insstr(d, "HPMUD_S_EWS_LEDM_CHANNEL", HPMUD_S_EWS_LEDM_CHANNEL);
+ insstr(d, "HPMUD_S_SOAP_SCAN", HPMUD_S_SOAP_SCAN);
+ insstr(d, "HPMUD_S_SOAP_FAX", HPMUD_S_SOAP_FAX);
+ insstr(d, "HPMUD_S_DEVMGMT_CHANNEL", HPMUD_S_DEVMGMT_CHANNEL);
+ insstr(d, "HPMUD_S_WIFI_CHANNEL", HPMUD_S_WIFI_CHANNEL);
+ insstr(d, "HPMUD_S_MARVELL_FAX_CHANNEL", HPMUD_S_MARVELL_FAX_CHANNEL);
+ insstr(d, "HPMUD_S_LEDM_SCAN", HPMUD_S_LEDM_SCAN);
+
+ // Max buffer size
+ insint(d, "HPMUD_BUFFER_SIZE", HPMUD_BUFFER_SIZE);
+
+}
+
+
diff --git a/ip/hpip.h b/ip/hpip.h
new file mode 100644
index 0000000..10ca913
--- /dev/null
+++ b/ip/hpip.h
@@ -0,0 +1,918 @@
+/* libhpojip -- HP OfficeJet image-processing library. */
+
+/* Copyright (C) 1995-2002 Hewlett-Packard Company
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ * MA 02111-1307, USA.
+ *
+ * In addition, as a special exception, Hewlett-Packard Company
+ * gives permission to link the code of this program with any
+ * version of the OpenSSL library which is distributed under a
+ * license identical to that listed in the included LICENSE.OpenSSL
+ * file, and distribute linked combinations including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * this file, you may extend this exception to your version of the
+ * file, but you are not obligated to do so. If you do not wish to
+ * do so, delete this exception statement from your version.
+ */
+
+/* Original author: Mark Overton and others.
+ *
+ * Ported to Linux by David Paschal.
+ */
+
+/*****************************************************************************\
+ *
+ * hpojip.h - Interface into the Image Processing module
+ *
+ *****************************************************************************
+ *
+ * Mark Overton, Dec 1997
+ *
+\*****************************************************************************/
+
+
+#if !defined HPIP_INC
+#define HPIP_INC
+
+#if defined(__cplusplus)
+ extern "C" {
+#endif
+
+#include <stdlib.h>
+
+/* TODO: Fix this! */
+// #include <endian.h>
+#undef LITTLE_ENDIAN
+
+#define FAR
+#define WINAPI
+#define EXPORT(x) x
+
+typedef unsigned char BYTE, *PBYTE, FAR *LPBYTE;
+typedef unsigned short WORD, *PWORD, FAR *LPWORD;
+typedef unsigned short USHORT, *PUSHORT, FAR *LPUSHORT;
+typedef unsigned int DWORD, *PDWORD, FAR *LPDWORD;
+typedef unsigned int UINT, *PUINT, FAR *LPUINT;
+typedef unsigned long ULONG, *PULONG, FAR *LPULONG;
+typedef enum { FALSE=0, TRUE=1 } BOOL;
+typedef void VOID, *PVOID, FAR *LPVOID;
+typedef long long int __int64;
+
+typedef struct {
+ BYTE rgbRed:8;
+ BYTE rgbGreen:8;
+ BYTE rgbBlue:8;
+} __attribute__((packed)) RGBQUAD;
+
+/****************************************************************************\
+ ****************************************************************************
+ *
+ * COMMON DEFINITIONS for both xform drivers and ip functions
+ *
+ ****************************************************************************
+\****************************************************************************/
+
+#define IP_MAX_XFORMS 20 /* Max number of xforms we can handle. */
+
+/* These bit-values are returned by all transform driver and ip functions.
+ * Zero or more of these bits is set, telling you if anything interesting
+ * happened.
+ */
+#define IP_READY_FOR_DATA 0X0001u
+#define IP_PARSED_HEADER 0x0002u
+#define IP_CONSUMED_ROW 0x0004u
+#define IP_PRODUCED_ROW 0x0008u
+#define IP_INPUT_ERROR 0x0010u
+#define IP_FATAL_ERROR 0x0020u
+#define IP_NEW_INPUT_PAGE 0x0040u
+#define IP_NEW_OUTPUT_PAGE 0x0080u
+#define IP_WRITE_INSERT_OK 0x0100u
+#define IP_DONE 0x0200u
+
+
+/* IP_IMAGE_TRAITS describes everything about an image. If an item is not
+ * known, a negative number is used, meaning "I don't know." So all items
+ * are signed.
+ */
+typedef struct {
+ int iPixelsPerRow;
+ int iBitsPerPixel;
+ int iComponentsPerPixel;
+ long lHorizDPI; /* 32.0 or 16.16 fixed-point */
+ long lVertDPI; /* 32.0 or 16.16 fixed-point */
+ long lNumRows;
+ int iNumPages;
+ int iPageNum;
+} IP_IMAGE_TRAITS, *PIP_IMAGE_TRAITS, FAR*LPIP_IMAGE_TRAITS;
+
+typedef union {
+ DWORD dword;
+ PVOID pvoid;
+ __int64 i64;
+ RGBQUAD rgbquad;
+ float fl;
+} DWORD_OR_PVOID;
+
+//#ifdef HPIP_INTERNAL
+#include "xform.h" // this file uses the above definitions
+//#else
+//typedef struct IP_XFORM_TBL_s FAR *LPIP_XFORM_TBL;
+//#endif
+
+
+/****************************************************************************\
+ ****************************************************************************
+ *
+ * Definitions for Exported IP Routines
+ *
+ ****************************************************************************
+\****************************************************************************/
+
+
+/* Synopsis of the interface:
+ *
+ * Main routines:
+ *
+ * ipOpen - opens a new conversion-job
+ * ipConvert - converts some data
+ * ipClose - closes the conversion-job
+ *
+ * Ancillary routines:
+ *
+ * ipGetFuncPtrs - loads table with ptrs to these global routines
+ * ipGetClientDataPtr - returns ptr to client data-area in instance
+ * ipInsertedData - client inserted some data in output data stream
+ * ipGetImageTraits - returns traits of input and output images
+ */
+
+/* handle for a conversion job */
+typedef void FAR*IP_HANDLE, *FAR*PIP_HANDLE, FAR*FAR*LPIP_HANDLE;
+
+typedef void (WINAPI *LPIP_PEEK_FUNC)(
+ IP_HANDLE hJob, /* handle for job making the callback */
+ LPIP_IMAGE_TRAITS pTraits, /* traits of the data being peeked at */
+ int nBytes, /* # bytes in buffer below */
+ LPBYTE pBuf, /* data being peeked at */
+ long nFilePos, /* file-position where data belongs */
+ PVOID pUserdata); /* Data passed to the user in peek calls. */
+
+
+/* IP_XFORM - The list of the standard xforms supplied in image processor
+ *
+ * Warning: If the list below changes, you must also change an array in
+ * ipmain.c that is indexed by this enum.
+ */
+typedef enum {
+ X_FAX_ENCODE, X_FAX_DECODE, /* MH, MR and MMR formats */
+ X_PCX_ENCODE, X_PCX_DECODE,
+ /* X_BMP_ENCODE, X_BMP_DECODE, */
+ X_JPG_ENCODE, X_JPG_DECODE, X_JPG_FIX,
+ X_TIF_ENCODE, X_TIF_DECODE,
+ X_PNM_ENCODE, X_PNM_DECODE,
+ X_SCALE,
+ X_GRAY_2_BI, X_BI_2_GRAY,
+ X_CNV_COLOR_SPACE,
+ X_Y_EXTRACT,
+ /* X_HEADER, */
+ X_THUMB,
+ X_TABLE, /* tables are: user1,user3,mirror,gamma,threshold,pass-thru */
+ X_CROP,
+ X_TONEMAP,
+ X_SATURATION,
+ X_ROTATE,
+ X_PAD,
+ X_FAKE_MONO,
+ X_GRAYOUT,
+ X_CHANGE_BPP,
+ X_MATRIX,
+ X_CONVOLVE,
+ X_INVERT,
+ X_SKEL,
+} IP_XFORM, *PIP_XFORM, FAR*LPIP_XFORM;
+
+
+#define IP_MAX_XFORM_INFO 8
+
+/* IP_XFORM_SPEC - Fully specifies an xform
+ * Each transform driver documents what goes into aXformInfo.
+ */
+typedef struct {
+ LPIP_XFORM_TBL pXform; /* ptr to jmp-table for xform to do */
+ IP_XFORM eXform; /* which xform (used if pXform is NULL) */
+ LPIP_PEEK_FUNC pfReadPeek; /* callback when xform dvr reads data */
+ LPIP_PEEK_FUNC pfWritePeek; /* callback when xform dvr writes data */
+ PVOID pUserData; /* Data passed to user in peek functions. */
+ DWORD_OR_PVOID aXformInfo[IP_MAX_XFORM_INFO]; /* xform-specific info */
+} IP_XFORM_SPEC, *PIP_XFORM_SPEC, FAR*LPIP_XFORM_SPEC;
+
+
+
+/*****************************************************************************\
+ *
+ * ipOpen - Opens a new conversion job
+ *
+ *****************************************************************************
+ *
+ * This routine allocates some instance data, including space for nClientData.
+ * More memory is allocated once row-lengths are such are known.
+ * To deallocate all memory, ipClose must be called.
+ *
+ * The nXforms and pXforms parameters specify the sequence of transforms
+ * to go from input to output. The handle for the new job is returned
+ * in *pXform.
+ *
+ * A restriction on the list of xforms: the data-flows between xforms must be
+ * fixed-length buffers. This restricts you to raw raster rows between xforms.
+ * The data-flows into and out of ipConvert can be variable-length in nature.
+ *
+ * Return value: IP_DONE=success; IP_FATAL_ERROR=misc error.
+ *
+\*****************************************************************************/
+
+EXPORT(WORD) ipOpen (
+ int nXforms, /* in: number of xforms in lpXforms below */
+ LPIP_XFORM_SPEC lpXforms, /* in: list of xforms we should perform */
+ int nClientData, /* in: # bytes of additional client data */
+ LPIP_HANDLE phJob); /* out: handle for conversion job */
+
+
+
+/*****************************************************************************\
+ *
+ * ipMirrorBytes - Swaps bits in each byte of buffer
+ * (bits 0<->7, 1<->6, etc.)
+ *
+\*****************************************************************************/
+
+VOID ipMirrorBytes(PBYTE pbInputBuf,DWORD dwInputAvail);
+
+
+
+/*****************************************************************************\
+ *
+ * ipConvert - Converts some input data (work-horse function)
+ *
+ *****************************************************************************
+ *
+ * This function consumes input data and produces output data via the
+ * input- and output-buffer parameters. And it tells you what's happening
+ * via its function return value.
+ *
+ * On entry, pbInputBuf and wInputAvail specify the location and number of
+ * data-bytes in the input buffer. On return, pwInputUsed tells you how
+ * many of those input bytes were consumed. pdwInputNextPos tells you
+ * where in the input file you should read next for the following call;
+ * 0 is the beginning of the file. This is almost always the current file
+ * position plus pwInputUsed; if not, a file-seek is being requested.
+ *
+ * The output buffer parameters are analogous to the input parameters,
+ * except that pdwOutputThisPos tells you where the bytes just output
+ * should be written in the output file. That is, it applies to *this*
+ * write, not the *next* write, unlike the input arrangement.
+ * The output buffer pointers are allowed to be NULL, in which case
+ * the output is discarded.
+ *
+ * The function return value is a bit-mask that tells you if anything
+ * interesting happened. Multiple bits can be set. This information
+ * should be treated as independent of the data-transfers occuring via
+ * the parameters. The IP_CONSUMED_ROW and IP_PRODUCED_ROW bits can
+ * be used to count how many rows have been input and output.
+ *
+ * The IP_NEW_OUTPUT_PAGE bit is set when or after the last row of the
+ * page has been sent, and before the first row of the following page (if
+ * any) is sent.
+ *
+ * You may wish to insert secret data, such as thumbnails, into the
+ * output stream. When ipConvert returns the IP_WRITE_INSERT_OK bit,
+ * it is giving you permission to write stuff AFTER you write the output
+ * buffer it gave you. After adding your secret data, you must call
+ * ipInsertedData to tell us how many bytes were added.
+ *
+ * When there is no more input data, ipConvert must be called repeatedly
+ * with a NULL pbInputBuf parameter, which tells the processor to flush out
+ * any buffered rows. Keep calling it until it returns the IP_DONE bit.
+ *
+ * Do not call ipConvert again after it has returned either error bit or
+ * IP_DONE.
+ *
+ * At any time after ipConvert returns the IP_PARSED_HEADER bit,
+ * ipGetImageTraits may be called to obtain the input and output traits.
+ * IP_PARSED_HEADER is returned in *every* call after the header was parsed.
+ *
+ * Return value: Zero or more of these bits may be set:
+ *
+ * IP_PARSED_HEADER = input header has been parsed; traits are known
+ * IP_CONSUMED_ROW = an input row was parsed
+ * IP_PRODUCED_ROW = an output row was produced
+ * IP_INPUT_ERROR = syntax error in input data
+ * IP_FATAL_ERROR = misc error (internal error or bad param)
+ * IP_NEW_INPUT_PAGE = just encountered end of page on input
+ * IP_NEW_OUTPUT_PAGE = just finished outputting a page
+ * IP_WRITE_INSERT_OK = okay to insert data in output file
+ * IP_DONE = conversion is completed.
+ *
+\*****************************************************************************/
+
+EXPORT(WORD) ipConvert (
+ IP_HANDLE hJob, /* in: handle to conversion job */
+ DWORD dwInputAvail, /* in: # avail bytes in input buf */
+ LPBYTE pbInputBuf, /* in: ptr to input buffer */
+ LPDWORD pdwInputUsed, /* out: # bytes used from input buf */
+ LPDWORD pdwInputNextPos, /* out: file-pos to read from next */
+ DWORD dwOutputAvail, /* in: # avail bytes in output buf */
+ LPBYTE pbOutputBuf, /* in: ptr to output buffer */
+ LPDWORD pdwOutputUsed, /* out: # bytes written in out buf */
+ LPDWORD pdwOutputThisPos); /* out: file-pos to write this data */
+
+
+
+/*****************************************************************************\
+ *
+ * ipClose - Destroys the given conversion job
+ *
+ *****************************************************************************
+ *
+ * This routine deallocates all memory associated with the given conversion
+ * job. It may be called at any time, which is how you do an abort.
+ *
+ * Return value: IP_DONE=success; IP_FATAL_ERROR=misc error.
+ *
+\*****************************************************************************/
+
+EXPORT(WORD) ipClose (
+ IP_HANDLE hJob); /* in: handle to conversion job */
+
+
+/****************************************************************************\
+ *
+ * ipResultMask - Selects bit-results to be returned by ipConvert
+ *
+ ****************************************************************************
+ *
+ * The mask parameter is the OR of the IP_... bits you want returned by
+ * calls to ipConvert. A 1 means you want that bit; 0 means you don't.
+ * By disabling frequently-returned bits, efficiency will improve because
+ * fewer ipConvert calls will be made because each call can do more work.
+ *
+ * The mask is all zeroes by default. The IP_DONE, IP_FATAL_ERROR, and
+ * IP_INPUT_ERROR bits are always enabled, regardless of their bit-values
+ * in the mask.
+ *
+\*****************************************************************************/
+
+EXPORT(WORD) ipResultMask (
+ IP_HANDLE hJob, /* in: handle to conversion job */
+ WORD wMask); /* in: result bits you are interested in */
+
+
+/*****************************************************************************\
+ *
+ * ipGetClientDataPtr - Returns ptr to client's data in conversion instance
+ *
+ *****************************************************************************
+ *
+ * ipOpen accepts an nClientData parameter which is the number of extra bytes
+ * we allocate for the client for his own use. This function returns the
+ * pointer to that memory in the given conversion instance.
+ *
+ * Return value: IP_DONE=success; IP_FATAL_ERROR=misc error.
+ *
+\*****************************************************************************/
+
+EXPORT(WORD) ipGetClientDataPtr (
+ IP_HANDLE hJob, /* in: handle to conversion job */
+ LPVOID FAR*ppvClientData); /* out: ptr to client's memory area */
+
+
+
+/*****************************************************************************\
+ *
+ * ipSetDefaultInputTraits - Specifies default input image traits
+ *
+ *****************************************************************************
+ *
+ * The header of the file-type handled by the first transform might not
+ * include *all* the image traits we'd like to know. Those not specified
+ * in the file-header are filled in from info provided by this routine.
+ *
+ * Return value: IP_DONE=success; IP_FATAL_ERROR=misc error.
+ *
+\*****************************************************************************/
+
+EXPORT(WORD) ipSetDefaultInputTraits (
+ IP_HANDLE hJob, /* in: handle to conversion job */
+ LPIP_IMAGE_TRAITS pTraits); /* in: default image traits */
+
+
+
+/*****************************************************************************\
+ *
+ * ipGetOutputTraits - Returns the output traits before ipConvert is called
+ *
+ *****************************************************************************
+ *
+ * If the first xform does not have a header, then you can call this function
+ * *after* calling ipSetDefaultInputTraits to get the output image traits.
+ * Ordinarily, you'd have to call ipConvert a few times and wait until it tells
+ * you that the (non-existent) header has been parsed. But if you need the
+ * output traits before calling ipConvert, this function will return them.
+ *
+ * Return value: IP_DONE=success; IP_FATAL_ERROR=misc error.
+ *
+\*****************************************************************************/
+
+EXPORT(WORD) ipGetOutputTraits (
+ IP_HANDLE hJob, /* in: handle to conversion job */
+ LPIP_IMAGE_TRAITS pTraits); /* out: output image traits */
+
+
+
+/*****************************************************************************\
+ *
+ * ipGetImageTraits - Returns traits of input and output images
+ *
+ *****************************************************************************
+ *
+ * At any time after ipConvert has returned the IP_PARSED_HEADER bit, this
+ * function may be called to obtain the traits of the input and output images.
+ * If a pointer parameter is NULL, that traits record is not returned.
+ *
+ * After the conversion job is done, these traits will contain the actual
+ * number of rows input and output.
+ *
+ * Return value: IP_DONE=success; IP_FATAL_ERROR=misc error.
+ *
+\*****************************************************************************/
+
+EXPORT(WORD) ipGetImageTraits (
+ IP_HANDLE hJob, /* in: handle to conversion job */
+ LPIP_IMAGE_TRAITS pInputTraits, /* out: traits of input image */
+ LPIP_IMAGE_TRAITS pOutputTraits); /* out: traits of output image */
+
+
+
+/*****************************************************************************\
+ *
+ * ipInsertedData - Client inserted some bytes into our output stream
+ *
+ *****************************************************************************
+ *
+ * After ipConvert returns the IP_WRITE_INSERT_OK bit, and after the client
+ * writes out the output buffer, he is permitted to write out some additional
+ * data for his own use, such as a thumbnail image. After writing the added
+ * data, the client calls this function to tell us how much data he wrote.
+ *
+ * Return value: IP_DONE=success; IP_FATAL_ERROR=misc error.
+ *
+\*****************************************************************************/
+
+EXPORT(WORD) ipInsertedData (
+ IP_HANDLE hJob, /* in: handle to conversion job */
+ DWORD dwNumBytes); /* in: # of bytes of additional data written */
+
+
+
+/*****************************************************************************\
+ *
+ * ipOverrideDPI - Force a different DPI to be reported in the output
+ *
+ *****************************************************************************
+ *
+ * The values supplied only change the DPI that's *reported* in the output
+ * traits and in the header (if any) of the output file. These DPI values
+ * do *not* affect the transforms, and do *not* affect or change any scaling.
+ *
+ * The image processor code supplies these values in the input traits of
+ * the last transform in the list of transforms so that they'll make it
+ * in the output file header.
+ *
+ * The DPI values are in fixed-point with 16 bits of fraction. A value of
+ * 0 means "no override; use the normal value".
+ *
+ * Return value: IP_DONE=success; IP_FATAL_ERROR=misc error.
+ *
+\*****************************************************************************/
+
+EXPORT(WORD) ipOverrideDPI (
+ IP_HANDLE hJob, /* in: handle to conversion job */
+ DWORD dwHorizDPI, /* in: horiz DPI as 16.16; 0 means no override */
+ DWORD dwVertDPI); /* in: vert DPI as 16.16; 0 means no override */
+
+
+
+/*****************************************************************************\
+ *
+ * ipGetFuncPtrs - Loads jump-table with pointers to the ip entry points
+ *
+ *****************************************************************************
+ *
+ * This function loads a jump-table (typedef'ed below) for your convenience
+ * so you won't have to call GetProcAddress on every function.
+ *
+ * Return value: IP_DONE=success; IP_FATAL_ERROR=misc error.
+ *
+\*****************************************************************************/
+
+/*****************************************************************************\
+ *
+ * ipGetXformTable - Returns ptr to IP_XFORM_TBL for transform.
+ *
+ *****************************************************************************
+ *
+ *
+ * Return value: IP_DONE=success; IP_FATAL_ERROR=misc error.
+ *
+\*****************************************************************************/
+
+EXPORT(WORD) ipGetXformTable (LPIP_XFORM_TBL phXform);
+
+
+
+/*** Prototype for ipGetFuncPtrs function ***/
+typedef WORD (WINAPI *IPOPEN) (int, LPIP_XFORM_SPEC,
+ int, LPIP_HANDLE);
+typedef WORD (WINAPI *IPCONVERT) (IP_HANDLE, DWORD, LPBYTE,
+ LPDWORD, LPDWORD, DWORD,
+ LPBYTE, LPDWORD, LPDWORD);
+typedef WORD (WINAPI *IPCLOSE) (IP_HANDLE);
+typedef WORD (WINAPI *IPGETCLIENTDATAPTR) (IP_HANDLE, LPVOID FAR *);
+typedef WORD (WINAPI *IPRESULTMASK) (IP_HANDLE, WORD);
+typedef WORD (WINAPI *IPSETDEFAULTINPUTTRAITS) (IP_HANDLE,
+ LPIP_IMAGE_TRAITS);
+typedef WORD (WINAPI *IPGETIMAGETRAITS) (IP_HANDLE,
+ LPIP_IMAGE_TRAITS,
+ LPIP_IMAGE_TRAITS);
+typedef WORD (WINAPI *IPINSERTEDDATA) (IP_HANDLE, DWORD);
+typedef WORD (WINAPI *IPOVERRIDEDPI) (IP_HANDLE, DWORD, DWORD);
+
+typedef WORD (WINAPI *IPGETXFORMTABLE) (LPIP_XFORM_TBL);
+
+typedef WORD (WINAPI *IPGETOUTPUTTRAITS) (IP_HANDLE,
+ LPIP_IMAGE_TRAITS);
+
+typedef struct {
+ WORD wStructSize; /* # of bytes in this struct */
+ IPOPEN ipOpen;
+ IPCONVERT ipConvert;
+ IPCLOSE ipClose;
+ IPGETCLIENTDATAPTR ipGetClientDataPtr;
+ IPRESULTMASK ipResultMask;
+ IPSETDEFAULTINPUTTRAITS ipSetDefaultInputTraits;
+ IPGETIMAGETRAITS ipGetImageTraits;
+ IPINSERTEDDATA ipInsertedData;
+ IPOVERRIDEDPI ipOverrideDPI;
+ IPGETOUTPUTTRAITS ipGetOutputTraits;
+} IP_JUMP_TBL, * PIP_JUMP_TBL, FAR * LPIP_JUMP_TBL;
+
+/*** Prototype for ipGetFuncPtrs function ***/
+typedef WORD (WINAPI *LPFNIPGETFUNCPTRS) (LPIP_JUMP_TBL);
+
+EXPORT(WORD) ipGetFuncPtrs (LPIP_JUMP_TBL lpJumpTbl);
+
+/****************************************************************************\
+ ****************************************************************************
+ *
+ * OPTION DEFINITIONS for xform drivers
+ *
+ ****************************************************************************
+\****************************************************************************/
+
+/* xbi2gray.h */
+
+/* This .h file contains symbols for the transform in the corresponding .c file.
+ * See that .c file for instructions on using this transform.
+ */
+
+#define IP_BI_2_GRAY_OUTPUT_BPP 0
+#define IP_BI_2_GRAY_WHITE_PIXEL 1
+#define IP_BI_2_GRAY_BLACK_PIXEL 2
+
+
+#if 0
+
+/* xbmp.h */
+
+/* This .h file contains symbols for the transform in the corresponding .c file.
+ * See that .c file for instructions on using this transform.
+ */
+
+#define IP_BMP_NEGATIVE_HEIGHT 0
+
+#endif
+
+
+/* xchgbpp.h */
+
+/* This .h file contains symbols for the transform in the corresponding .c file.
+ * See that .c file for instructions on using this transform.
+ */
+
+#define IP_CHANGE_BPP_OUTPUT_BPP 0
+
+
+/* xcolrspc.h */
+
+/* This .h file contains symbols for the transform in the corresponding .c file.
+ * See that .c file for instructions on using this transform.
+ */
+
+#define IP_CNV_COLOR_SPACE_WHICH_CNV 0
+#define IP_CNV_COLOR_SPACE_GAMMA 1
+
+/* The following conversions are possible: */
+
+typedef enum {
+ IP_CNV_YCC_TO_CIELAB = 0,
+ IP_CNV_CIELAB_TO_YCC = 1,
+ IP_CNV_YCC_TO_SRGB = 2,
+ IP_CNV_SRGB_TO_YCC = 3,
+ IP_CNV_LHS_TO_SRGB = 4,
+ IP_CNV_SRGB_TO_LHS = 5,
+ IP_CNV_BGR_SWAP = 100
+} IP_WHICH_CNV;
+
+
+/* xconvolve.h */
+
+/* This .h file contains symbols for the transform in the corresponding .c file.
+ * See that .c file for instructions on using this transform.
+ */
+
+#define IP_CONVOLVE_NROWS 0
+#define IP_CONVOLVE_NCOLS 1
+#define IP_CONVOLVE_MATRIX 2
+#define IP_CONVOLVE_DIVISOR 3
+
+#define IP_CONVOLVE_MAXSIZE 9 /* up to 9x9 matrix */
+
+
+/* xcrop.h */
+
+/* This .h file contains symbols for the transform in the corresponding .c file.
+ * See that .c file for instructions on using this transform.
+ */
+
+#define IP_CROP_LEFT 0
+#define IP_CROP_RIGHT 1
+#define IP_CROP_TOP 2
+#define IP_CROP_MAXOUTROWS 3
+
+
+/* xfakemono.h */
+
+/* This .h file contains symbols for the transform in the corresponding .c file.
+ * See that .c file for instructions on using this transform.
+ */
+
+#define IP_FAKE_MONO_BPP 0
+
+
+/* xfax.h */
+
+/* This .h file contains symbols for the transform in the corresponding .c file.
+ * See that .c file for instructions on using this transform.
+ */
+
+#define IP_FAX_FORMAT 0
+#define IP_FAX_NO_EOLS 1
+#define IP_FAX_MIN_ROW_LEN 2
+
+enum {IP_FAX_MH, IP_FAX_MR, IP_FAX_MMR};
+
+
+/* xgray2bi.h */
+
+/* This .h file contains symbols for the transform in the corresponding .c file.
+ * See that .c file for instructions on using this transform.
+ */
+
+#define IP_GRAY_2_BI_THRESHOLD 0
+
+
+/* xgrayout.h */
+
+/* This .h file contains symbols for the transform in the corresponding .c file.
+ * See that .c file for instructions on using this transform.
+ */
+
+#define IP_GRAYOUT_LEFT 0
+#define IP_GRAYOUT_RIGHT 1
+#define IP_GRAYOUT_TOP 2
+#define IP_GRAYOUT_BOTTOM 3
+
+
+#if 0
+
+/* xheader.h */
+
+/* xheader.h - aXformInfo[0] struct given to xheader.c, the header generator
+ *
+ * Mark Overton, March 1998
+ */
+
+#define IP_HEADER_SPEC 0
+
+/* aXformInfo[IP_HEADER_SPEC] shall be a pointer pointing to this: */
+
+typedef struct {
+ PSTR pszLeftStr; // ptr to left-justified string; 0 -> none
+ PSTR pszCenterStr; // ptr to centered string; 0 -> none
+ PSTR pszRightStr; // ptr to right-justified string; 0 -> none
+ WORD wCharSet; // character set (may be a two-byte set)
+ PSTR pszTypeFace; // ptr to name of typeface (required)
+ float fHeightPoints; // point-size of font
+ float fMarginPoints; // left and right margin, in points
+ BOOL bOverlay; // 0=append header, 1=overlay it on top of page
+ RGBQUAD rgbWhite; // a white pixel
+ RGBQUAD rgbBlack; // a black pixel
+} __attribute__((packed)) XHEADER_SPEC, *PXHEADER_SPEC, FAR*LPXHEADER_SPEC;
+
+/* A header is one line of text appearing at the top of faxes. This is known
+ * as a "TTI" in faxland. We implement this as a left-justified portion, a
+ * centered portion, and a right-justified portion. All three portions are
+ * optional.
+ *
+ * Note that xheader.c copies over the string fields in the struct. Therefore,
+ * those strings may go away after the call to cvtOpen.
+ *
+ * The bOverlay field controls whether the header is concatenated
+ * to the top of the page (0), or overlays the top of the page (1).
+ *
+ * xheader.c needs to know what values to use for white and black pixels,
+ * so rgbWhite and rgbBlack are a white pixel and black pixel repectively.
+ * If the page data is gray (8 bits/pixel), only the rgbRed field is used.
+ * If the page data is bilevel, then only the least significant bit of rgbRed
+ * is used.
+ */
+#endif
+
+
+/* xjpg.h */
+
+/* This .h file contains symbols xjpg_dec.c and xjpg_enc.c
+ * See those .c files for instructions on using these transforms.
+ */
+
+/* Specifications for decoder: */
+
+#define IP_JPG_DECODE_OUTPUT_SUBSAMPLED 0
+#define IP_JPG_DECODE_FROM_DENALI 1
+
+/* Specifications for encoder: */
+
+#define IP_JPG_ENCODE_QUALITY_FACTORS 0
+#define IP_JPG_ENCODE_SAMPLE_FACTORS 1
+#define IP_JPG_ENCODE_ALREADY_SUBSAMPLED 2
+#define IP_JPG_ENCODE_FOR_DENALI 3
+#define IP_JPG_ENCODE_OUTPUT_DNL 4
+#define IP_JPG_ENCODE_FOR_COLOR_FAX 5
+#define IP_JPG_ENCODE_DUMMY_HEADER_LEN 6
+
+
+/* xpad.h */
+
+/* This .h file contains symbols for the transform in the corresponding .c file.
+ * See that .c file for instructions on using this transform.
+ */
+
+#define IP_PAD_LEFT 0
+#define IP_PAD_RIGHT 1
+#define IP_PAD_TOP 2
+#define IP_PAD_BOTTOM 3
+#define IP_PAD_VALUE 4
+#define IP_PAD_MIN_HEIGHT 5
+
+
+/* xrotate.h */
+
+/* This .h file contains symbols for the transform in the corresponding .c file.
+ * See that .c file for instructions on using this transform.
+ */
+
+#define IP_ROTATE_UPPER_LEFT 0
+#define IP_ROTATE_UPPER_RIGHT 1
+#define IP_ROTATE_LOWER_LEFT 2
+#define IP_ROTATE_OUTPUT_SIZE 3
+#define IP_ROTATE_FAST 4
+
+
+/* xsaturation.h */
+
+/* This .h file contains symbols for the transform in the corresponding .c file.
+ * See that .c file for instructions on using this transform.
+ */
+
+#define IP_SATURATION_FACTOR 0
+
+
+/* xscale.h */
+
+/* This .h file contains symbols for the transform in the corresponding .c file.
+ * See that .c file for instructions on using this transform.
+ */
+
+#define IP_SCALE_HORIZ_FACTOR 0
+#define IP_SCALE_VERT_FACTOR 1
+#define IP_SCALE_FAST 2
+
+
+/* xskel.h */
+
+/* This .h file contains symbols for the transform in the corresponding .c file.
+ * See that .c file for instructions on using this transform.
+ */
+
+#define IP_SKEL_SPEC_1 0
+#define IP_SKEL_SPEC_2 1
+
+
+/* xtable.h */
+
+/* This .h file contains symbols for the transform in the corresponding .c file.
+ * See that .c file for instructions on using this transform.
+ */
+
+#define IP_TABLE_WHICH 0
+#define IP_TABLE_OPTION 1
+
+#define IP_TABLE_COLOR_1 1
+#define IP_TABLE_COLOR_2 2
+#define IP_TABLE_COLOR_3 3
+
+typedef enum {
+ IP_TABLE_USER,
+ IP_TABLE_PASS_THRU,
+ IP_TABLE_GAMMA,
+ IP_TABLE_THRESHOLD,
+ IP_TABLE_MIRROR,
+ IP_TABLE_USER_THREE,
+ IP_TABLE_BW_CLIP,
+ IP_TABLE_USER_WORD,
+ IP_TABLE_USER_THREE_WORD
+} IP_TABLE_TYPE;
+
+
+/* xthumb.h */
+
+/* This .h file contains symbols for the transform in the corresponding .c file.
+ * See that .c file for instructions on using this transform.
+ */
+
+#define IP_THUMB_SCALE_SPEC 0
+
+
+/* xtiff.h */
+
+/* This .h file contains symbols for the transform in the corresponding .c file.
+ * See that .c file for instructions on using this transform.
+ */
+
+#define IP_TIFF_FILE_PATH 0
+
+
+/* xtonemap.h */
+
+/* This .h file contains symbols for the transform in the corresponding .c file.
+ * See that .c file for instructions on using this transform.
+ */
+
+#define IP_TONEMAP_POINTER 0
+#define IP_TONEMAP_LUM_SPACE 1
+
+
+/* xyxtract.h */
+
+/* This .h file contains symbols for the transform in the corresponding .c file.
+ * See that .c file for instructions on using this transform.
+ */
+
+#define IP_Y_EXTRACT_COLOR_SPACE 0
+
+typedef enum {
+ IP_Y_EXTRACT_LUM_CHROME,
+ IP_Y_EXTRACT_RGB,
+ IP_Y_EXTRACT_BGR
+} IP_Y_EXTRACT_WHICH_SPACE;
+
+#if defined(__cplusplus)
+ }
+#endif
+
+#endif
+
+
+/* End of File */
diff --git a/ip/ipdefs.h b/ip/ipdefs.h
new file mode 100644
index 0000000..6611c6a
--- /dev/null
+++ b/ip/ipdefs.h
@@ -0,0 +1,116 @@
+/* libhpojip -- HP OfficeJet image-processing library. */
+
+/* Copyright (C) 1995-2002 Hewlett-Packard Company
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ * MA 02111-1307, USA.
+ *
+ * In addition, as a special exception, Hewlett-Packard Company
+ * gives permission to link the code of this program with any
+ * version of the OpenSSL library which is distributed under a
+ * license identical to that listed in the included LICENSE.OpenSSL
+ * file, and distribute linked combinations including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * this file, you may extend this exception to your version of the
+ * file, but you are not obligated to do so. If you do not wish to
+ * do so, delete this exception statement from your version.
+ */
+
+/* Original author: Mark Overton and others.
+ *
+ * Ported to Linux by David Paschal.
+ */
+
+/*****************************************************************************\
+ *
+ * ipdefs.h - Definitions common among image processor files
+ *
+ * Mark Overton, Jan 1998
+ *
+\*****************************************************************************/
+
+#if ! defined IPDEFS_INC
+#define IPDEFS_INC
+
+#ifdef EXPORT_TRANSFORM
+#define fatalBreakPoint() assert(0);
+#else
+extern void fatalBreakPoint(void);
+#endif
+
+#define INSURE(must_be_true) \
+do { \
+ if (! (must_be_true)) { \
+ fatalBreakPoint(); \
+ goto fatal_error; \
+ } \
+} while (0)
+
+
+#define HANDLE_TO_PTR(hJob_macpar, inst_macpar) \
+do { \
+ inst_macpar = (void*)hJob_macpar; \
+ INSURE (inst_macpar->dwValidChk == CHECK_VALUE); \
+} while (0)
+
+
+#define IP_MEM_ALLOC(nBytes_macpar, ptr_macpar) \
+do { \
+ /* the weirdness below is equivalent to a type cast */ \
+ /* the 12 below is buffer-overrun allowance */ \
+/* *(void**)&(ptr_macpar) = (void*) malloc(nBytes_macpar+12); */ \
+ (ptr_macpar) = malloc(nBytes_macpar+12); \
+ INSURE (ptr_macpar != NULL); \
+} while (0)
+
+
+#define IP_MEM_FREE(ptr_macpar) \
+do { \
+ if (ptr_macpar != NULL) \
+ free (ptr_macpar); \
+} while (0)
+
+
+#define IP_MAX(valOne,valTwo) \
+ ((valOne)>(valTwo) ? (valOne) : (valTwo))
+
+#define IP_MIN(valOne,valTwo) \
+ ((valOne)<(valTwo) ? (valOne) : (valTwo))
+
+
+/* We use approx NTSC weights of 5/16, 9/16, 2/16 for R, G and B respectively. */
+#define NTSC_LUMINANCE(Rval,Gval,Bval) \
+ ((((Rval)<<2) + (Rval) + ((Gval)<<3) + (Gval) + ((Bval)<<1)) >> 4)
+
+
+/* The MUL32HIHALF macro does a signed 32x32->64 multiply, and then
+ * discards the low 32 bits, giving you the high 32 bits. The way
+ * this is done is compiler-dependent.
+ */
+#if 0
+#define MUL32HIHALF(firstpar, secondpar, hihalfresult) { \
+ __int64 prod64; \
+ prod64 = (__int64)(firstpar) * (secondpar); \
+ hihalfresult = ((int*)&prod64)[1]; \
+ /* above, use a [0] for big endian */
+#endif
+#define MUL32HIHALF(firstpar, secondpar, hihalfresult) { \
+ hihalfresult = ((__int64)(firstpar) * (secondpar)) >> 32; \
+}
+
+#endif
+
+/* End of File */
diff --git a/ip/ipmain.c b/ip/ipmain.c
new file mode 100644
index 0000000..598ead3
--- /dev/null
+++ b/ip/ipmain.c
@@ -0,0 +1,1342 @@
+/* libhpojip -- HP OfficeJet image-processing library. */
+
+/* Copyright (C) 1995-2002 Hewlett-Packard Company
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ * MA 02111-1307, USA.
+ *
+ * In addition, as a special exception, Hewlett-Packard Company
+ * gives permission to link the code of this program with any
+ * version of the OpenSSL library which is distributed under a
+ * license identical to that listed in the included LICENSE.OpenSSL
+ * file, and distribute linked combinations including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * this file, you may extend this exception to your version of the
+ * file, but you are not obligated to do so. If you do not wish to
+ * do so, delete this exception statement from your version.
+ */
+
+/* Original author: Mark Overton and others.
+ *
+ * Ported to Linux by David Paschal.
+ */
+
+/*****************************************************************************\
+ *
+ * ipmain.c - main control code and entry points for image processor
+ *
+ *****************************************************************************
+ *
+ * Mark Overton, Dec 1997
+ *
+\*****************************************************************************/
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <string.h> /* for memcpy, memset, etc. */
+#include <unistd.h>
+#include "hpip.h"
+#include "ipdefs.h"
+
+//#define HPIP_DEBUG
+
+#ifdef HPIP_DEBUG
+ #include <stdio.h>
+ #include <assert.h>
+
+ #define _T(msg) msg
+
+ #define PRINT0(args...) fprintf(stderr, args)
+
+ #if 0
+ #define PRINT1(args...) fprintf(stderr, args)
+ #else
+ #define PRINT1(args...)
+ #endif
+
+ #undef INSURE
+ #define INSURE(boolexp) \
+ do { if (0) goto fatal_error; assert(boolexp); } while(0)
+
+ int infd;
+ int outfd;
+
+#else
+ #define PRINT0(args...)
+ #define PRINT1(args...)
+#endif
+
+
+
+/*****************************************************************************\
+ *
+ * Constants
+ *
+\*****************************************************************************/
+
+
+#define CHECK_VALUE 0xACEC0DE4U /* for checking validity of instance struc */
+#define MIN_GENBUF_LEN 4000 /* arbitrary, but higher boosts speed some */
+#define PERMANENT_RESULTS \
+ (IP_INPUT_ERROR | IP_FATAL_ERROR | IP_DONE)
+
+
+
+/*****************************************************************************\
+ *
+ * Types
+ *
+\*****************************************************************************/
+
+
+/* XFORM_STATE enum - all possible states of an xform */
+
+typedef enum {
+ XS_NONEXISTENT=0, /* xform is not yet instantiated */
+ XS_PARSING_HEADER, /* parsing header (always goes thru this state) */
+ XS_CONVERTING, /* inputting and outputting */
+ XS_CONV_NOT_RFD, /* only outputting; not ready for input */
+ XS_FLUSHING, /* outputting buffered stuff; no more input */
+ XS_DONE /* done and de-instantiated */
+} XFORM_STATE;
+
+
+/* XFORM_INFO type - everything we know about an xform */
+
+typedef struct {
+ XFORM_STATE eState; /* state of this xform */
+ PIP_XFORM_TBL pXform; /* ptr to jmp-table for xform */
+ LPIP_PEEK_FUNC pfReadPeek; /* callback when xform dvr reads data */
+ LPIP_PEEK_FUNC pfWritePeek; /* callback when xform dvr writes data */
+ PVOID pUserData; /* Data passed to user in peek functions. */
+ DWORD_OR_PVOID aXformInfo[8]; /* xform-specific information */
+ IP_XFORM_HANDLE hXform; /* handle for the xform */
+ IP_IMAGE_TRAITS inTraits; /* traits of input data into xform */
+ IP_IMAGE_TRAITS outTraits; /* traits of output data from xform */
+ DWORD dwMinInBufLen; /* min # bytes in input buf */
+ DWORD dwMinOutBufLen; /* min # bytes in output buf */
+} XFORM_INFO, *PXFORM_INFO;
+
+
+/* GENBUF type - a general-purpose buffer which allows one to write or read
+ * varying amounts of data.
+ */
+typedef struct {
+ PBYTE pbBuf; /* ptr to beginning of buffer */
+ DWORD dwBufLen; /* size of entire buffer (# of bytes) */
+ DWORD dwValidStart; /* index of first valid data byte in buffer */
+ DWORD dwValidLen; /* number of valid data bytes in buffer */
+ DWORD dwFilePos; /* file-pos of start of valid data (starts at 0) */
+} GENBUF, *PGENBUF;
+
+
+/* INST type - all variables in an instance of the image processor */
+
+typedef struct {
+
+ /* genbufs are used for input into the first xform, and to store output
+ * from the last xform. The client's input data is first put into gbIn,
+ * which is then fed into the first xform. The last xform's output is put
+ * into gbOut, which is then copied out to the client's output buffer.
+ */
+ GENBUF gbIn;
+ GENBUF gbOut;
+
+ /* mid-buffers are simple buffers that handle fixed-length raster-rows
+ * passed between xforms in the xform-list. For an xform, there's an input
+ * and an output buffer. For the next xform, they swap roles, so the old
+ * output buffer becomes the new input buffer, and vice versa. When the
+ * roles are swapped, the two pointers below are swapped.
+ */
+ PBYTE pbMidInBuf; /* ptr to beginning of input mid-buf */
+ PBYTE pbMidOutBuf; /* ptr to beginning of output mid-buf */
+ DWORD dwMidLen; /* size of either buffer (# of bytes) */
+ DWORD dwMidValidLen; /* # of bytes of good data in input mid-buf */
+ int iOwner; /* index into xfArray of xform owning (using)
+ * the input mid-buf. negative means no owner
+ * and that pbMidInBuf is empty */
+
+ /* variables pertaining to the array of xforms */
+
+ XFORM_INFO xfArray[IP_MAX_XFORMS]; /* the array of xforms */
+ WORD xfCount; /* number of xforms */
+
+ /* misc variables */
+
+ DWORD dwValidChk; /* struct validity check value */
+ DWORD dwForcedHorizDPI; /* horiz DPI override as 16.16; 0=none */
+ DWORD dwForcedVertDPI; /* vert DPI override as 16.16; 0=none */
+ WORD wResultMask; /* desired ipConvert result bits */
+ long lInRows; /* number of rows we've input */
+ long lOutRows; /* number of rows we've output */
+ int iInPages; /* number of pages we've received */
+ int iOutPages; /* number of pages we've output */
+ BOOL pendingInsert; /* ret IP_WRITE_INSERT_OK after outbuf empty? */
+
+} INST, *PINST;
+
+
+
+/*****************************************************************************\
+ *
+ * xformJumpTables - Array of ptrs to all driver jump tables
+ *
+ * Warning: This array is indexed by the enum IP_XFORM. If one changes,
+ * the other must change too.
+ *
+\*****************************************************************************/
+
+extern IP_XFORM_TBL faxEncodeTbl, faxDecodeTbl;
+extern IP_XFORM_TBL pcxEncodeTbl, pcxDecodeTbl;
+/* extern IP_XFORM_TBL bmpEncodeTbl, bmpDecodeTbl; */
+extern IP_XFORM_TBL jpgEncodeTbl, jpgDecodeTbl, jpgFixTbl;
+extern IP_XFORM_TBL tifEncodeTbl, tifDecodeTbl;
+extern IP_XFORM_TBL pnmEncodeTbl, pnmDecodeTbl;
+extern IP_XFORM_TBL scaleTbl;
+extern IP_XFORM_TBL gray2biTbl, bi2grayTbl;
+extern IP_XFORM_TBL colorTbl;
+extern IP_XFORM_TBL yXtractTbl;
+/* extern IP_XFORM_TBL headerTbl; */
+extern IP_XFORM_TBL thumbTbl;
+extern IP_XFORM_TBL tableTbl;
+extern IP_XFORM_TBL cropTbl;
+extern IP_XFORM_TBL tonemapTbl;
+extern IP_XFORM_TBL saturationTbl;
+extern IP_XFORM_TBL rotateTbl;
+extern IP_XFORM_TBL padTbl;
+extern IP_XFORM_TBL fakeMonoTbl;
+extern IP_XFORM_TBL grayOutTbl;
+extern IP_XFORM_TBL changeBPPTbl;
+extern IP_XFORM_TBL matrixTbl;
+extern IP_XFORM_TBL convolveTbl;
+extern IP_XFORM_TBL invertTbl;
+extern IP_XFORM_TBL skelTbl;
+
+static IP_XFORM_TBL * const xformJumpTables[] = {
+ &faxEncodeTbl, &faxDecodeTbl, /* MH, MR and MMR formats */
+ &pcxEncodeTbl, &pcxDecodeTbl,
+ /* &bmpEncodeTbl, &bmpDecodeTbl, */
+ &jpgEncodeTbl, &jpgDecodeTbl, &jpgFixTbl,
+ &tifEncodeTbl, &tifDecodeTbl,
+ &pnmEncodeTbl, &pnmDecodeTbl,
+ &scaleTbl,
+ &gray2biTbl, &bi2grayTbl,
+ &colorTbl,
+ &yXtractTbl,
+ /* &headerTbl, */
+ &thumbTbl,
+ &tableTbl,
+ &cropTbl,
+ &tonemapTbl,
+ &saturationTbl,
+ &rotateTbl,
+ &padTbl,
+ &fakeMonoTbl,
+ &grayOutTbl,
+ &changeBPPTbl,
+ &matrixTbl,
+ &convolveTbl,
+ &invertTbl,
+ &skelTbl,
+};
+
+
+
+/*****************************************************************************\
+ *
+ * fatalBreakPoint - Called when INSURE fails, used for debugger breakpoint
+ *
+\*****************************************************************************/
+
+void fatalBreakPoint (void)
+{
+ /* do nothing */
+#if defined _DEBUG
+ __asm int 3;
+#endif
+ PRINT0 (_T("\nhit fatalBreakPoint!\n"));
+}
+
+
+
+/*****************************************************************************\
+ *
+ * deleteMidBufs - Frees the two mid-buffers, if they've been allocated
+ *
+\*****************************************************************************/
+
+static void deleteMidBufs (PINST g)
+{
+ PRINT0 (_T("deleteMidBufs\n"));
+
+ if (g->pbMidInBuf != NULL)
+ IP_MEM_FREE (g->pbMidInBuf);
+
+ if (g->pbMidOutBuf != NULL)
+ IP_MEM_FREE (g->pbMidOutBuf);
+
+ g->pbMidInBuf = NULL;
+ g->pbMidOutBuf = NULL;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * ipOpen - Opens a new conversion job
+ *
+\*****************************************************************************/
+
+EXPORT(WORD) ipOpen (
+ int nXforms, /* in: number of xforms in lpXforms below */
+ LPIP_XFORM_SPEC lpXforms, /* in: the xforms we should perform */
+ int nClientData, /* in: # bytes of additional client data */
+ PIP_HANDLE phJob) /* out: handle for conversion job */
+{
+ PINST g;
+ int i;
+ PIP_XFORM_SPEC src;
+ PXFORM_INFO dest;
+
+#ifdef HPIP_DEBUG
+ char *ipIn = "/tmp/ipIn.dib";
+#endif
+
+ PRINT0 (_T("ipOpen: nXforms=%d\n"), nXforms);
+ INSURE (nXforms>0 && lpXforms!=NULL && nClientData>=0 && phJob!=NULL);
+
+#ifdef HPIP_DEBUG
+ for (i=0; i<nXforms; i++)
+ {
+ switch (lpXforms[i].eXform)
+ {
+ case X_FAX_DECODE:
+ PRINT0("Fax_format=%d\n", lpXforms[i].aXformInfo[IP_FAX_FORMAT].dword);
+ ipIn = "/tmp/ipIn.pbm";
+ break;
+ case X_JPG_DECODE:
+ PRINT0("JPG_decode=%d\n", lpXforms[i].aXformInfo[IP_JPG_DECODE_FROM_DENALI].dword);
+ ipIn = "/tmp/ipIn.jpg";
+ break;
+ case X_CNV_COLOR_SPACE:
+ PRINT0("Color_space conversion=%d\n", lpXforms[i].aXformInfo[IP_CNV_COLOR_SPACE_WHICH_CNV].dword);
+ PRINT0("Color_space gamma=%d\n", lpXforms[i].aXformInfo[IP_CNV_COLOR_SPACE_GAMMA].dword);
+ break;
+ case X_CROP:
+ PRINT0("Crop_left=%d\n", lpXforms[i].aXformInfo[IP_CROP_LEFT].dword);
+ PRINT0("Crop_right=%d\n", lpXforms[i].aXformInfo[IP_CROP_RIGHT].dword);
+ PRINT0("Crop_top=%d\n", lpXforms[i].aXformInfo[IP_CROP_TOP].dword);
+ PRINT0("Crop_maxoutrows=%d\n", lpXforms[i].aXformInfo[IP_CROP_MAXOUTROWS].dword);
+ break;
+ case X_PAD:
+ PRINT0("Pad_left=%d\n", lpXforms[i].aXformInfo[IP_PAD_LEFT].dword);
+ PRINT0("Pad_right=%d\n", lpXforms[i].aXformInfo[IP_PAD_RIGHT].dword);
+ PRINT0("Pad_top=%d\n", lpXforms[i].aXformInfo[IP_PAD_TOP].dword);
+ PRINT0("Pad_bottom=%d\n", lpXforms[i].aXformInfo[IP_PAD_BOTTOM].dword);
+ PRINT0("Pad_value=%d\n", lpXforms[i].aXformInfo[IP_PAD_VALUE].dword);
+ PRINT0("Pad_minheight=%d\n", lpXforms[i].aXformInfo[IP_PAD_MIN_HEIGHT].dword);
+ break;
+ default:
+ PRINT0("Unknown xform\n");
+ break;
+ }
+ }
+
+ infd = creat(ipIn, 0600);
+ outfd = creat("/tmp/ipOut.ppm", 0600);
+#endif
+
+ /**** Create Instance and Init Misc Variables ****/
+
+ IP_MEM_ALLOC (sizeof(INST) + nClientData, g);
+ *phJob = g;
+
+ memset (g, 0, sizeof(INST));
+ g->dwValidChk = CHECK_VALUE;
+ g->iOwner = -1;
+ g->wResultMask = PERMANENT_RESULTS;
+
+ /**** Transfer the Xforms to xfArray ****/
+
+ g->xfCount = (WORD)nXforms;
+
+ for (i=0; i<nXforms; i++) {
+ src = &(lpXforms[i]);
+ dest = &(g->xfArray[i]);
+
+ dest->eState = XS_NONEXISTENT;
+ dest->pXform = (src->pXform != NULL)
+ ? src->pXform
+ : xformJumpTables[src->eXform];
+ INSURE (dest->pXform != NULL);
+ dest->pfReadPeek = src->pfReadPeek;
+ dest->pfWritePeek = src->pfWritePeek;
+ dest->pUserData = src->pUserData;
+ memcpy (dest->aXformInfo, src->aXformInfo, sizeof(dest->aXformInfo));
+ }
+
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * ipClose - Destroys the given conversion job, deallocating all its memory
+ *
+\*****************************************************************************/
+
+EXPORT(WORD) ipClose (IP_HANDLE hJob)
+{
+ PINST g;
+ PXFORM_INFO pXform;
+ WORD n;
+
+ PRINT0 (_T("ipClose: hJob=%p\n"), (void*)hJob);
+ HANDLE_TO_PTR (hJob, g);
+
+ /**** Delete All Buffers ****/
+
+ deleteMidBufs (g);
+ g->dwMidLen = 0;
+ g->dwMidValidLen = 0;
+
+ if (g->gbIn.pbBuf != NULL) IP_MEM_FREE (g->gbIn.pbBuf);
+ if (g->gbOut.pbBuf != NULL) IP_MEM_FREE (g->gbOut.pbBuf);
+
+ /**** Delete All Xform Instances ****/
+
+ for (n=0; n<g->xfCount; n++) {
+ pXform = &(g->xfArray[n]);
+ if (pXform->hXform != NULL)
+ pXform->pXform->closeXform (pXform->hXform);
+ }
+
+ IP_MEM_FREE (g); /* Delete our instance, and we're done */
+
+#ifdef HPIP_DEBUG
+ close(infd);
+ close(outfd);
+#endif
+
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * ipGetClientDataPtr - Returns ptr to client's data in conversion instance
+ *
+\*****************************************************************************/
+
+EXPORT(WORD) ipGetClientDataPtr (
+ IP_HANDLE hJob, /* in: handle to conversion job */
+ PVOID *ppvClientData) /* out: ptr to client's memory area */
+{
+ PINST g;
+
+ PRINT0 (_T("ipGetClientDataPtr\n"));
+ HANDLE_TO_PTR (hJob, g);
+ *ppvClientData = (PVOID)((PBYTE)g + sizeof(INST));
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/****************************************************************************\
+ *
+ * ipResultMask - Selects bit-results to be returned by ipConvert
+ *
+\****************************************************************************/
+
+EXPORT(WORD) ipResultMask (
+ IP_HANDLE hJob, /* in: handle to conversion job */
+ WORD wMask) /* in: result bits you are interested in */
+{
+ PINST g;
+
+ PRINT0 (_T("ipResultMask: hJob=%p, wMask=%04x\n"), (void*)hJob, wMask);
+ HANDLE_TO_PTR (hJob, g);
+ g->wResultMask = wMask | PERMANENT_RESULTS;
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * ipSetDefaultInputTraits - Specifies default input image traits
+ *
+ *****************************************************************************
+ *
+ * The header of the file-type handled by the first transform might not
+ * include *all* the image traits we'd like to know. Those not specified
+ * in the file-header are filled in from info provided by this routine.
+ *
+ * Return value: IP_DONE=success; IP_FATAL_ERROR=misc error.
+ *
+\*****************************************************************************/
+
+EXPORT(WORD) ipSetDefaultInputTraits (
+ IP_HANDLE hJob, /* in: handle to conversion job */
+ LPIP_IMAGE_TRAITS pTraits) /* in: default image traits */
+{
+ PINST g;
+ PIP_IMAGE_TRAITS p;
+
+ PRINT0 (_T("ipSetDefaultInputTraits: hJob=%p PixelsPerRow=%d BitsPerPixel=%d ComponentsPerPixel=%d HorzDPI=%ld VertDPI=%ld Rows=%ld Pages=%d PageNum=%d\n"),
+ (void*)hJob, pTraits->iPixelsPerRow, pTraits->iBitsPerPixel, pTraits->iComponentsPerPixel, pTraits->lHorizDPI,
+ pTraits->lVertDPI, pTraits->lNumRows, pTraits->iNumPages, pTraits->iPageNum);
+ HANDLE_TO_PTR (hJob, g);
+ INSURE (g->xfArray[0].eState == XS_NONEXISTENT);
+ g->xfArray[0].inTraits = *pTraits; /* a structure copy */
+
+ /* Convert DPI from integer to 16.16 fixed-pt if necessary */
+ p = &(g->xfArray[0].inTraits);
+ if (p->lHorizDPI < 0x10000) p->lHorizDPI <<= 16;
+ if (p->lVertDPI < 0x10000) p->lVertDPI <<= 16;
+
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * ipGetImageTraits - Returns traits of input and output images
+ *
+ *****************************************************************************
+ *
+ * After the conversion job is done, these traits will contain the actual
+ * number of rows input and output (ipConvert patches traits upon completion).
+ *
+\*****************************************************************************/
+
+EXPORT(WORD) ipGetImageTraits (
+ IP_HANDLE hJob, /* in: handle to conversion job */
+ LPIP_IMAGE_TRAITS pInputTraits, /* out: traits of input image */
+ LPIP_IMAGE_TRAITS pOutputTraits) /* out: traits of output image */
+{
+ PINST g;
+ PXFORM_INFO pTail;
+
+ PRINT0 (_T("ipGetImageTraits: hJob=%p\n"), (void*)hJob);
+ HANDLE_TO_PTR (hJob, g);
+ INSURE (g->xfCount > 0);
+ pTail = &(g->xfArray[g->xfCount-1]);
+
+ if (pInputTraits != NULL) {
+ INSURE (g->xfArray[0].eState > XS_PARSING_HEADER);
+ *pInputTraits = g->xfArray[0].inTraits;
+ PRINT0 (_T("InputTraits: hJob=%p PixelsPerRow=%d BitsPerPixel=%d ComponentsPerPixel=%d HorzDPI=%ld VertDPI=%ld Rows=%ld Pages=%d PageNum=%d\n"),
+ (void*)hJob, pInputTraits->iPixelsPerRow, pInputTraits->iBitsPerPixel, pInputTraits->iComponentsPerPixel, pInputTraits->lHorizDPI,
+ pInputTraits->lVertDPI, pInputTraits->lNumRows, pInputTraits->iNumPages, pInputTraits->iPageNum);
+ }
+
+ if (pOutputTraits != NULL) {
+ INSURE (pTail->eState > XS_PARSING_HEADER);
+ *pOutputTraits = pTail->outTraits;
+ PRINT0 (_T("OutputTraits: hJob=%p PixelsPerRow=%d BitsPerPixel=%d ComponentsPerPixel=%d HorzDPI=%ld VertDPI=%ld Rows=%ld Pages=%d PageNum=%d\n"),
+ (void*)hJob, pOutputTraits->iPixelsPerRow, pOutputTraits->iBitsPerPixel, pOutputTraits->iComponentsPerPixel, pOutputTraits->lHorizDPI,
+ pOutputTraits->lVertDPI, pOutputTraits->lNumRows, pOutputTraits->iNumPages, pOutputTraits->iPageNum);
+ }
+
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * ipInsertedData - Client inserted some bytes into our output stream
+ *
+\*****************************************************************************/
+
+EXPORT(WORD) ipInsertedData (
+ IP_HANDLE hJob, /* in: handle to conversion job */
+ DWORD dwNumBytes) /* in: # of bytes of additional data written */
+{
+ PINST g;
+ PXFORM_INFO pTail;
+
+ PRINT0 (_T("ipInsertedData: hJob=%p, dwNumBytes=%d\n"), (void*)hJob, dwNumBytes);
+ HANDLE_TO_PTR (hJob, g);
+ INSURE (g->xfCount > 0);
+ pTail = &(g->xfArray[g->xfCount-1]);
+ INSURE (pTail->eState > XS_PARSING_HEADER);
+ INSURE (g->gbOut.dwValidLen == 0); /* output genbuf must be empty */
+
+ pTail->pXform->insertedData (pTail->hXform, dwNumBytes);
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * ipOverrideDPI - Force a different DPI to be reported in the output
+ *
+\*****************************************************************************/
+
+EXPORT(WORD) ipOverrideDPI (
+ IP_HANDLE hJob, /* in: handle to conversion job */
+ DWORD dwHorizDPI, /* in: horiz DPI as 16.16; 0 means no override */
+ DWORD dwVertDPI) /* in: vert DPI as 16.16; 0 means no override */
+{
+ PINST g;
+
+ PRINT0 (_T("ipOverrideDPI: dwHorizDPI=%x, dwVertDPI=%x\n"),
+ dwHorizDPI, dwVertDPI);
+ HANDLE_TO_PTR (hJob, g);
+
+ /* Convert from integer to fixed-pt if necessary */
+ if (dwHorizDPI < 0x10000) dwHorizDPI <<= 16;
+ if (dwVertDPI < 0x10000) dwVertDPI <<= 16;
+
+ g->dwForcedHorizDPI = dwHorizDPI;
+ g->dwForcedVertDPI = dwVertDPI;
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * ipGetFuncPtrs - Loads jump-table with pointers to the ip entry points
+ *
+\*****************************************************************************/
+
+EXPORT(WORD) ipGetFuncPtrs (LPIP_JUMP_TBL lpJumpTbl)
+{
+ PRINT0 (_T("ipGetFuncPtrs\n"));
+ INSURE (lpJumpTbl!=NULL && lpJumpTbl->wStructSize==sizeof(IP_JUMP_TBL));
+
+ lpJumpTbl->ipOpen = (LPVOID) ipOpen;
+ lpJumpTbl->ipConvert = (LPVOID) ipConvert;
+ lpJumpTbl->ipClose = (LPVOID) ipClose;
+ lpJumpTbl->ipGetClientDataPtr = (LPVOID) ipGetClientDataPtr;
+ lpJumpTbl->ipResultMask = (LPVOID) ipResultMask;
+ lpJumpTbl->ipSetDefaultInputTraits = (LPVOID) ipSetDefaultInputTraits;
+ lpJumpTbl->ipGetImageTraits = (LPVOID) ipGetImageTraits;
+ lpJumpTbl->ipInsertedData = (LPVOID) ipInsertedData;
+ lpJumpTbl->ipOverrideDPI = (LPVOID) ipOverrideDPI;
+ lpJumpTbl->ipGetOutputTraits = (LPVOID) ipGetOutputTraits;
+
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * ipGetOutputTraits - Returns the output traits before ipConvert is called
+ *
+ *****************************************************************************
+ *
+ * If the first xform does not have a header, then you can call this function
+ * *after* calling ipSetDefaultInputTraits to get the output image traits.
+ * Ordinarily, you'd have to call ipConvert a few times and wait until it tells
+ * you that the (non-existent) header has been parsed. But if you need the
+ * output traits before calling ipConvert, this function will return them.
+ *
+ * Return value: IP_DONE=success; IP_FATAL_ERROR=misc error.
+ *
+\*****************************************************************************/
+
+EXPORT(WORD) ipGetOutputTraits (
+ IP_HANDLE hJob, /* in: handle to conversion job */
+ LPIP_IMAGE_TRAITS pTraits) /* out: output image traits */
+{
+ PINST g;
+ IP_IMAGE_TRAITS inTraits, outTraits;
+ int iXform;
+ PXFORM_INFO pXform;
+ WORD result;
+ DWORD dwHeaderLen;
+ DWORD dwInUsed, dwInNextPos;
+
+ HANDLE_TO_PTR (hJob, g);
+ INSURE (g->xfCount>=1);
+ inTraits = g->xfArray[0].inTraits; /* set by SetDefaultInputTraits */
+
+ for (iXform=0; iXform<g->xfCount; iXform++) {
+ pXform = &(g->xfArray[iXform]);
+ INSURE (pXform->eState == XS_NONEXISTENT);
+
+ /* Open the xform, set it up, get the traits, and close it */
+
+ result = pXform->pXform->openXform (&pXform->hXform);
+ INSURE (result == IP_DONE);
+
+ result = pXform->pXform->setDefaultInputTraits (
+ pXform->hXform, &inTraits);
+ INSURE (result == IP_DONE);
+
+ result = pXform->pXform->setXformSpec (
+ pXform->hXform, pXform->aXformInfo);
+ INSURE (result == IP_DONE);
+
+ result = pXform->pXform->getHeaderBufSize (
+ pXform->hXform, &dwHeaderLen);
+ INSURE (result == IP_DONE);
+ INSURE (dwHeaderLen == 0);
+
+ result = pXform->pXform->getActualTraits (
+ pXform->hXform,
+ 0, NULL, &dwInUsed, &dwInNextPos,
+ &inTraits, &outTraits);
+ INSURE (result & IP_DONE);
+
+ result = pXform->pXform->closeXform (pXform->hXform);
+ INSURE (result == IP_DONE);
+
+ inTraits = outTraits;
+ pXform->hXform = NULL;
+ }
+
+ *pTraits = outTraits;
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * ipConvert - Converts some input data (work-horse function)
+ *
+\*****************************************************************************/
+
+EXPORT(WORD) ipConvert (
+ IP_HANDLE hJob, /* in: handle to conversion job */
+ DWORD dwInputAvail, /* in: # avail bytes in input buf */
+ PBYTE pbInputBuf, /* in: ptr to input buffer */
+ PDWORD pdwInputUsed, /* out: # bytes used from input buf */
+ PDWORD pdwInputNextPos, /* out: file-pos to read from next */
+ DWORD dwOutputAvail, /* in: # avail bytes in output buf */
+ PBYTE pbOutputBuf, /* in: ptr to output buffer */
+ PDWORD pdwOutputUsed, /* out: # bytes written in out buf */
+ PDWORD pdwOutputThisPos) /* out: file-pos to write this data */
+{
+ PINST g;
+ WORD ipResult;
+ int iXform;
+ WORD result;
+ PGENBUF pgbIn, pgbOut;
+ BOOL atTheHead, atTheTail;
+ PXFORM_INFO pXform, pPriorXform, pNextXform;
+ BOOL needInput, selectCnvState;
+ DWORD dwBytes;
+ int i;
+ DWORD n;
+ DWORD dwInUsed, dwOutUsed;
+ DWORD dwInNextPos, dwOutThisPos;
+ DWORD dwTheInLen, dwTheOutLen;
+ PBYTE pbTemp;
+ PBYTE pbTheInBuf, pbTheOutBuf;
+ DWORD dwJunk;
+
+ if (pbOutputBuf == NULL) {
+ /* client wants us to discard all data */
+ pdwOutputUsed = &dwJunk;
+ pdwOutputThisPos = &dwJunk;
+ dwOutputAvail = 0xfffffffu;
+ }
+
+ PRINT0 (_T("ipConvert: hJob=%p, pbInputBuf=%p InputBufSize=%d pbOutputBuf=%p OutputBufSize=%d\n"),
+ (void*)hJob, pbInputBuf, dwInputAvail, pbOutputBuf, dwOutputAvail);
+ INSURE (pdwInputUsed !=NULL && pdwInputNextPos !=NULL &&
+ pdwOutputUsed!=NULL && pdwOutputThisPos!=NULL);
+ HANDLE_TO_PTR (hJob, g);
+ INSURE (g->xfCount>=1);
+
+ pgbIn = &g->gbIn;
+ pgbOut = &g->gbOut;
+
+ *pdwInputUsed = 0;
+ *pdwOutputUsed = 0;
+ ipResult = 0;
+
+ /**************************/
+ /* Beginning of Main Loop */
+ /**************************/
+
+ while (TRUE) {
+
+ /**** Output any data in the output genbuf ****/
+
+ if (*pdwOutputUsed == 0)
+ *pdwOutputThisPos = pgbOut->dwFilePos;
+
+ if (pgbOut->dwValidLen != 0) { /* output genbuf is not empty */
+ /* Logic below:
+ *
+ * 1. If next output file-pos doesn't match output genbuf, exit loop.
+ *
+ * 2. Copy as much as possible from output genbuf to clients output buf.
+ * 2.1 decide number of bytes to copy
+ * 2.2 copy them
+ * 2.3 update misc variables
+ *
+ * 3. If output genbuf is not empty, exit loop (client's buf is full),
+ * else set wValidStart to 0 because output genbuf is empty.
+ */
+
+ if ((*pdwOutputThisPos+*pdwOutputUsed) != pgbOut->dwFilePos) {
+ PRINT0 (_T("ipConvert: output seek to %d\n"), pgbOut->dwFilePos);
+ goto exitLoop;
+ }
+
+ dwBytes = pgbOut->dwValidLen;
+ if (dwOutputAvail < dwBytes)
+ dwBytes = dwOutputAvail;
+
+ if (pbOutputBuf != NULL) {
+ memcpy (pbOutputBuf + *pdwOutputUsed,
+ pgbOut->pbBuf + pgbOut->dwValidStart,
+ dwBytes);
+ }
+
+ *pdwOutputUsed += dwBytes;
+ dwOutputAvail -= dwBytes;
+ pgbOut->dwValidStart += dwBytes;
+ pgbOut->dwFilePos += dwBytes;
+ pgbOut->dwValidLen -= dwBytes;
+
+ if (pgbOut->dwValidLen != 0)
+ goto exitLoop;
+
+ pgbOut->dwValidStart = 0; /* output genbuf is now empty */
+ }
+
+ if (g->pendingInsert) {
+ g->pendingInsert = FALSE;
+ ipResult |= IP_WRITE_INSERT_OK;
+ }
+
+ /**** If ipResult has any returnable bits set, exit loop now ****/
+
+ if (ipResult & g->wResultMask)
+ goto exitLoop;
+
+ /**** Select an xform to run ****/
+
+ /* select the owner of input midbuf, or negative means 'none selected' */
+ iXform = g->iOwner;
+
+ if (iXform < 0) {
+ for (i=g->xfCount-1; i>=0; i--) {
+ if (g->xfArray[i].eState == XS_CONV_NOT_RFD) {
+ /* select last xform that's convnotrfd; this xform
+ * is outputting (or thinking) but not inputting */
+ iXform = i;
+ break;
+ }
+ }
+ }
+
+ if (iXform < 0) {
+ for (i=0; i<g->xfCount; i++) {
+ if (g->xfArray[i].eState != XS_DONE) {
+ /* select first xform that's not done */
+ iXform = i;
+ break;
+ }
+ }
+ }
+
+ if (iXform < 0) {
+ /* all xforms are done: discard all input, and report that we're done */
+ *pdwInputUsed = dwInputAvail;
+ ipResult |= IP_DONE;
+ /* patch the last outtraits with actual # of rows output, so that
+ * ipGetImageTraits will return actual row-count after we're done */
+ g->xfArray[g->xfCount-1].outTraits.lNumRows = g->lOutRows;
+ /* patch first intraits for the same reason */
+ g->xfArray[0].inTraits.lNumRows = g->lInRows;
+ goto exitLoop;
+ }
+
+ /**** Miscellaneous preparation ****/
+
+ pXform = &(g->xfArray[iXform]);
+ atTheHead = (iXform == 0);
+ atTheTail = (iXform == g->xfCount-1);
+ pPriorXform = atTheHead ? NULL : &(g->xfArray[iXform-1]);
+ pNextXform = atTheTail ? NULL : &(g->xfArray[iXform+1]);
+
+ /**** Create the Xform if necessary ****/
+
+ if (pXform->eState == XS_NONEXISTENT) {
+ PRINT0 (_T("ipConvert: creating xform %d\n"), iXform);
+ INSURE (atTheHead || pPriorXform->eState>=XS_CONVERTING);
+
+ if (atTheHead) {
+ /* this xform's input traits were set by ipSetDefaultInputTraits */
+ } else {
+ /* this xform's input traits are prior xform's output traits */
+ memcpy (&pXform->inTraits, &pPriorXform->outTraits,
+ sizeof(IP_IMAGE_TRAITS));
+
+ if (atTheTail) {
+ /* apply any DPI overrides */
+ if (g->dwForcedHorizDPI != 0)
+ pXform->inTraits.lHorizDPI = (long)g->dwForcedHorizDPI;
+ if (g->dwForcedVertDPI != 0)
+ pXform->inTraits.lVertDPI = (long)g->dwForcedVertDPI;
+ }
+ }
+
+ result = pXform->pXform->openXform (&pXform->hXform);
+ INSURE (result == IP_DONE);
+ result = pXform->pXform->setDefaultInputTraits (
+ pXform->hXform, &pXform->inTraits);
+ INSURE (result == IP_DONE);
+ result = pXform->pXform->setXformSpec (
+ pXform->hXform, pXform->aXformInfo);
+ INSURE (result == IP_DONE);
+ result = pXform->pXform->getHeaderBufSize (
+ pXform->hXform, &pXform->dwMinInBufLen);
+ INSURE (result == IP_DONE);
+
+ if (! atTheHead) {
+ /* a header is only allowed on first xform */
+ INSURE (pXform->dwMinInBufLen == 0);
+ } else {
+ /* allocate the input genbuf */
+ if (pXform->dwMinInBufLen == 0)
+ pXform->dwMinInBufLen = 1;
+ PRINT0 (_T("ipConvert: alloc input genbuf, len=%d\n"),
+ pXform->dwMinInBufLen);
+ IP_MEM_ALLOC (pXform->dwMinInBufLen, pgbIn->pbBuf);
+ pgbIn->dwBufLen = pXform->dwMinInBufLen;
+ pgbIn->dwValidStart = 0;
+ pgbIn->dwValidLen = 0;
+ pgbIn->dwFilePos = 0;
+ }
+
+ pXform->eState = XS_PARSING_HEADER;
+ }
+
+ /**** Enter flushing state if appropriate ****/
+
+ if (pXform->eState == XS_CONVERTING &&
+ (( atTheHead && pbInputBuf==NULL && pgbIn->dwValidLen==0) ||
+ (!atTheHead && pPriorXform->eState==XS_DONE && g->iOwner<0))) {
+ /* there will never be any more input to this xform: start flushing */
+ PRINT0 (_T("ipConvert: xform %d is now flushing\n"), iXform);
+ pXform->eState = XS_FLUSHING;
+ }
+
+ /**** Check that input data and output space are available ****/
+
+ needInput = (pXform->eState==XS_PARSING_HEADER ||
+ pXform->eState==XS_CONVERTING);
+
+ if (needInput) {
+ if (! atTheHead) {
+ /* the input midbuf must contain data */
+ INSURE (g->iOwner>=0 && g->dwMidValidLen>0);
+ PRINT1 (_T("not at head, pixels = %08x\n"), *(DWORD*)(g->pbMidInBuf));
+ } else if (pbInputBuf != NULL) {
+ DWORD dwUnusedStart;
+
+ /* left-justify data in input genbuf if necessary */
+
+ if (pgbIn->dwBufLen-pgbIn->dwValidStart < pXform->dwMinInBufLen) {
+ /* too much wasted space on left end, so left justify */
+ memmove (pgbIn->pbBuf, pgbIn->pbBuf + pgbIn->dwValidStart,
+ pgbIn->dwValidLen);
+ pgbIn->dwValidStart = 0;
+ PRINT1 (_T("left just, pixels = %08x\n"), *(DWORD*)(pgbIn->pbBuf));
+ }
+
+ /* put as much client input as possible into the input genbuf */
+
+ dwUnusedStart = pgbIn->dwValidStart + pgbIn->dwValidLen;
+ dwBytes = pgbIn->dwBufLen - dwUnusedStart;
+ if (dwBytes > dwInputAvail)
+ dwBytes = dwInputAvail;
+
+ memcpy (pgbIn->pbBuf + dwUnusedStart,
+ pbInputBuf + *pdwInputUsed,
+ dwBytes);
+
+ pgbIn->dwValidLen += dwBytes;
+ *pdwInputUsed += dwBytes;
+ dwInputAvail -= dwBytes;
+ *pdwInputNextPos += dwBytes;
+
+ /* if input genbuf has insufficient data, exit loop */
+ if (pgbIn->dwValidLen < pXform->dwMinInBufLen)
+ goto exitLoop;
+ PRINT1 (_T("at head, pixels = %08x\n"), *(DWORD*)(pgbIn->pbBuf));
+ }
+ }
+
+ if (atTheTail && pXform->eState!=XS_PARSING_HEADER) {
+ /* output might be produced; output genbuf must be empty */
+ INSURE (pgbOut->dwValidLen == 0);
+ }
+
+ /**** Call the Conversion Routine ****/
+
+ pbTheInBuf = atTheHead ? pgbIn->pbBuf + pgbIn->dwValidStart : g->pbMidInBuf;
+ dwTheInLen = atTheHead ? pgbIn->dwValidLen : g->dwMidValidLen;
+ pbTheOutBuf = atTheTail ? pgbOut->pbBuf : g->pbMidOutBuf;
+ dwTheOutLen = atTheTail ? pgbOut->dwBufLen : g->dwMidLen;
+
+ if (pXform->eState == XS_PARSING_HEADER) {
+ result = pXform->pXform->getActualTraits (
+ pXform->hXform,
+ dwTheInLen, pbTheInBuf, &dwInUsed, &dwInNextPos,
+ &pXform->inTraits,
+ &pXform->outTraits);
+ dwOutUsed = 0;
+ dwOutThisPos = 0;
+ } else {
+ if (pXform->eState == XS_FLUSHING)
+ pbTheInBuf = NULL;
+ result = pXform->pXform->convert (
+ pXform->hXform,
+ dwTheInLen, pbTheInBuf, &dwInUsed, &dwInNextPos,
+ dwTheOutLen, pbTheOutBuf, &dwOutUsed, &dwOutThisPos);
+ }
+
+ PRINT1 (_T("ipConvert: xform %d returned %04x\n"), iXform, result);
+ PRINT1 (_T("ipConvert: consumed %d and produced %d bytes\n"),
+ dwInUsed, dwOutUsed);
+
+ if (pbTheOutBuf != NULL)
+ PRINT1 (_T("ipConvert: out data = %08x\n"), *(DWORD*)pbTheOutBuf);
+
+ INSURE ((result & IP_FATAL_ERROR) == 0);
+
+ /**** Update Input and Output Buffers ****/
+
+ if (dwInUsed > 0) {
+ if (pXform->pfReadPeek != NULL) {
+ #if defined _WIN32
+ __try {
+ #endif
+ pXform->pfReadPeek (hJob, &(pXform->inTraits),
+ dwInUsed, pbTheInBuf, pgbIn->dwFilePos,
+ pXform->pUserData);
+ #if defined _WIN32
+ } __except (EXCEPTION_EXECUTE_HANDLER) {
+ goto fatal_error;
+ }
+ #endif
+ }
+
+ if (! atTheHead) {
+ /* We _assume_ that the xform consumed all the data in the midbuf */
+ g->iOwner = -1; /* input midbuf is consumed and un-owned now */
+ g->dwMidValidLen = 0;
+ }
+ }
+
+ if (needInput && atTheHead) {
+ if (dwInUsed >= pgbIn->dwValidLen) {
+ /* consumed all input; mark input genbuf as empty */
+ pgbIn->dwValidLen = 0;
+ pgbIn->dwValidStart = 0;
+ pgbIn->dwFilePos = dwInNextPos;
+ } else {
+ /* advance counters in genbuf */
+ pgbIn->dwValidLen -= dwInUsed;
+ pgbIn->dwValidStart += dwInUsed;
+ pgbIn->dwFilePos += dwInUsed;
+ }
+
+ /* if new genbuf file-pos doesn't match what xform wants,
+ * discard remainder of buffer */
+ if (pgbIn->dwFilePos != dwInNextPos) {
+ PRINT0 (_T("ipConvert: input seek to %d\n"), dwInNextPos);
+ pgbIn->dwValidLen = 0;
+ pgbIn->dwValidStart = 0;
+ pgbIn->dwFilePos = dwInNextPos;
+ }
+ }
+
+ if (dwOutUsed > 0) {
+ if (pXform->pfWritePeek != NULL) {
+ #if defined _WIN32
+ __try {
+ #endif
+ pXform->pfWritePeek (hJob, &(pXform->outTraits),
+ dwOutUsed, pbTheOutBuf, dwOutThisPos,
+ pXform->pUserData);
+ #if defined _WIN32
+ } __except (EXCEPTION_EXECUTE_HANDLER) {
+ goto fatal_error;
+ }
+ #endif
+ }
+
+ if (atTheTail) {
+ pgbOut->dwFilePos = dwOutThisPos;
+ pgbOut->dwValidStart = 0;
+ pgbOut->dwValidLen = dwOutUsed;
+ } else {
+ INSURE (g->iOwner < 0); /* mid inbuf must be unowned here */
+ g->iOwner = iXform + 1; /* next xform hereby owns mid inbuf */
+ /* swap input and output midbuf pointers */
+ pbTemp = g->pbMidInBuf;
+ g->pbMidInBuf = g->pbMidOutBuf;
+ g->pbMidOutBuf = pbTemp;
+ g->dwMidValidLen = dwOutUsed;
+ }
+ }
+
+ /**** Handle Results of Conversion Call ****/
+
+ selectCnvState = FALSE;
+
+ if (pXform->eState == XS_PARSING_HEADER) {
+
+ if (result & IP_DONE) {
+ PRINT0 (_T("ipConvert: xform %d is done parsing header\n"), iXform);
+ pXform->pXform->getActualBufSizes (pXform->hXform,
+ &pXform->dwMinInBufLen, &pXform->dwMinOutBufLen);
+
+ if (atTheHead) {
+ /* allocate new input genbuf, and xfer data into it */
+ n = pXform->dwMinInBufLen;
+ if (n < MIN_GENBUF_LEN)
+ n = MIN_GENBUF_LEN;
+ if (n < pgbIn->dwValidLen)
+ n = pgbIn->dwValidLen;
+ PRINT0 (_T("ipConvert: alloc new input genbuf, ")
+ _T("old len=%d, new len=%d\n"), pgbIn->dwBufLen, n);
+ PRINT0 (_T(" dwMinInBufLen=%d, dwValidLen=%d\n"),
+ pXform->dwMinInBufLen, pgbIn->dwValidLen);
+ IP_MEM_ALLOC (n, pbTemp);
+ memcpy (pbTemp,
+ pgbIn->pbBuf + pgbIn->dwValidStart,
+ pgbIn->dwValidLen);
+ IP_MEM_FREE (pgbIn->pbBuf);
+ pgbIn->pbBuf = pbTemp;
+ pgbIn->dwBufLen = n;
+ pgbIn->dwValidStart = 0;
+ }
+
+ /* boost size of midbufs if necessary (also 1st malloc of them) */
+ n = atTheHead ? 0 : pXform->dwMinInBufLen;
+ if (!atTheTail && pXform->dwMinOutBufLen > n)
+ n = pXform->dwMinOutBufLen;
+ /* note: the code below (correctly) does not create mid-bufs if
+ * n is 0, which occurs if there's only one xform in the list */
+ if (n > g->dwMidLen) {
+ /* delete both mid-bufs, and (re) allocate them */
+ /* copy data from old to new, if necessary */
+ PBYTE pbOldMidInBuf = g->pbMidInBuf;
+ g->pbMidInBuf = NULL;
+ PRINT0 (_T("ipConvert: alloc mid-bufs, old len=%d, new len=%d\n"),
+ g->dwMidLen, n);
+ deleteMidBufs (g);
+ IP_MEM_ALLOC (n, g->pbMidInBuf );
+ IP_MEM_ALLOC (n, g->pbMidOutBuf);
+ if (pbOldMidInBuf != NULL) {
+ memcpy (g->pbMidInBuf, pbOldMidInBuf, g->dwMidLen);
+ IP_MEM_FREE (pbOldMidInBuf);
+ }
+ g->dwMidLen = n;
+ }
+
+ if (atTheTail) {
+ /* allocate output genbuf */
+ n = pXform->dwMinOutBufLen;
+ if (n < MIN_GENBUF_LEN)
+ n = MIN_GENBUF_LEN;
+ PRINT0 (_T("ipConvert: alloc output genbuf, len=%d, minlen=%d\n"),
+ n, pXform->dwMinOutBufLen);
+ IP_MEM_ALLOC (n, pgbOut->pbBuf);
+ pgbOut->dwBufLen = n;
+ pgbOut->dwValidStart = 0;
+ pgbOut->dwValidLen = 0;
+
+ /* At this point it is permissible to call ipGetImageTraits
+ * to obtain output traits because all xforms are past the
+ * parsing-header state, and thus the output traits are known.
+ * So tell caller that we're done parsing the header. */
+ ipResult |= IP_PARSED_HEADER;
+ }
+
+ selectCnvState = TRUE;
+ }
+
+ } else { /* state is XS_CONVERTING or XS_CONV_NOT_RFD or XS_FLUSHING */
+
+ if (atTheHead) {
+ /* handle status bits pertaining to the input data */
+ if (result & IP_CONSUMED_ROW) {
+ g->lInRows += 1;
+ ipResult |= IP_CONSUMED_ROW;
+ }
+ if (result & IP_NEW_OUTPUT_PAGE) {
+ /* a new *output* page for the input xform is a new *input* page
+ * for the IP as a whole */
+ g->iInPages += 1;
+ ipResult |= IP_NEW_INPUT_PAGE;
+ }
+ }
+
+ if (atTheTail) {
+ /* handle status bits pertaining to the output data */
+ ipResult |= (result & (IP_PRODUCED_ROW | IP_NEW_OUTPUT_PAGE));
+ if (result & IP_PRODUCED_ROW)
+ g->lOutRows += 1;
+ if (result & IP_NEW_OUTPUT_PAGE)
+ g->iOutPages += 1;
+ if (result & IP_WRITE_INSERT_OK & g->wResultMask)
+ g->pendingInsert = TRUE;
+ } else if (result & IP_NEW_OUTPUT_PAGE) {
+ /* this xform hit end of page, so tell next xform about it */
+ PRINT0 (_T("ipConvert: xform %d hit end of page\n"), iXform);
+ pNextXform->pXform->newPage (pNextXform->hXform);
+ }
+
+ if (result & IP_DONE) {
+ PRINT0 (_T("ipConvert: xform %d is done\n"), iXform);
+ pXform->eState = XS_DONE;
+ } else if (pXform->eState != XS_FLUSHING)
+ selectCnvState = TRUE;
+ } /* if state is 'parsing header' */
+
+ if (selectCnvState) {
+ /* go to one of the two 'converting' states */
+ if ((result & IP_READY_FOR_DATA) == 0)
+ PRINT1 (_T("ipConvert: xform %d is not ready for data\n"), iXform);
+ pXform->eState = (result & IP_READY_FOR_DATA)
+ ? XS_CONVERTING : XS_CONV_NOT_RFD;
+ }
+
+ } /* end of while (TRUE) */
+ exitLoop: ;
+
+ /********************/
+ /* End of Main Loop */
+ /********************/
+
+ *pdwInputNextPos = pgbIn->dwFilePos + pgbIn->dwValidLen;
+
+ /* After headers are parsed, parsed-header bit should always be set */
+ if (g->xfArray[g->xfCount-1].eState >= XS_CONVERTING)
+ ipResult |= IP_PARSED_HEADER;
+
+ PRINT0 (_T("ipConvert: ipResult=%04x, returning %04x, InputUsed=%d InputNextPos=%d OutputUsed=%d OutputThisPos=%d\n"),
+ ipResult, ipResult & g->wResultMask, *pdwInputUsed, *pdwInputNextPos, *pdwOutputUsed, *pdwOutputThisPos);
+
+#ifdef HPIP_DEBUG
+ if (pbInputBuf && *pdwInputUsed)
+ write(infd, pbInputBuf, *pdwInputUsed);
+
+ if (*pdwOutputUsed)
+ write(outfd, pbOutputBuf, *pdwOutputUsed);
+#endif
+
+ return ipResult & g->wResultMask;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * ipMirrorBytes - Swaps bits in each byte of buffer
+ * (bits 0<->7, 1<->6, etc.)
+ *
+\*****************************************************************************/
+
+static const BYTE baMirrorImage[256] =
+{
+ 0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0,
+ 0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0,
+ 0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8,
+ 0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8,
+ 0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4,
+ 0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4,
+ 0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec,
+ 0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc,
+ 0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2,
+ 0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2,
+ 0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea,
+ 0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa,
+ 0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6,
+ 0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6,
+ 0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee,
+ 0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe,
+ 0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1,
+ 0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1,
+ 0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9,
+ 0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9,
+ 0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5,
+ 0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5,
+ 0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed,
+ 0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd,
+ 0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3,
+ 0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3,
+ 0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb,
+ 0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb,
+ 0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7,
+ 0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7,
+ 0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef,
+ 0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff
+};
+
+VOID ipMirrorBytes(PBYTE pbInputBuf,DWORD dwInputAvail) {
+ while (dwInputAvail>0) {
+ *pbInputBuf=baMirrorImage[*pbInputBuf];
+ pbInputBuf++;
+ dwInputAvail--;
+ }
+}
+
+/* End of File */
diff --git a/ip/xbi2gray.c b/ip/xbi2gray.c
new file mode 100644
index 0000000..a250811
--- /dev/null
+++ b/ip/xbi2gray.c
@@ -0,0 +1,453 @@
+/* libhpojip -- HP OfficeJet image-processing library. */
+
+/* Copyright (C) 1995-2002 Hewlett-Packard Company
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ * MA 02111-1307, USA.
+ *
+ * In addition, as a special exception, Hewlett-Packard Company
+ * gives permission to link the code of this program with any
+ * version of the OpenSSL library which is distributed under a
+ * license identical to that listed in the included LICENSE.OpenSSL
+ * file, and distribute linked combinations including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * this file, you may extend this exception to your version of the
+ * file, but you are not obligated to do so. If you do not wish to
+ * do so, delete this exception statement from your version.
+ */
+
+/* Original author: Mark Overton and others.
+ *
+ * Ported to Linux by David Paschal.
+ */
+
+/******************************************************************************\
+ *
+ * xbi2gray.c - Converts bilevel into gray (8-bit gray or 24-bit gray)
+ *
+ ******************************************************************************
+ *
+ * Name of Global Jump-Table:
+ *
+ * yBi2GrayTbl
+ *
+ * Items in aXformInfo array passed into setXformSpec:
+ *
+ * aXformInfo[IP_BI_2_GRAY_OUTPUT_BPP] = format of output:
+ * 8 = output 8-bit gray,
+ * 24 = output 24-bit gray.
+ * aXformInfo[IP_BI_2_GRAY_WHITE_PIXEL] =
+ * an RGBQUAD representing a white output pixel.
+ * aXformInfo[IP_BI_2_GRAY_BLACK_PIXEL] =
+ * an RGBQUAD representing a black output pixel.
+ *
+ * Each bilevel pixel is output as a full white or full black pixel.
+ * This xform needs to know what values to use for those white and
+ * black output pixels. Hence the two RGBQUAD items above.
+ * For 8-bit gray output, only the rgbRed field is used in each.
+ *
+ * Capabilities and Limitations:
+ *
+ * Translates each white or black bilevel input pixel into an 8-bit
+ * or 24-bit output white or black output pixel.
+ *
+ * Default Input Traits, and Output Traits:
+ *
+ * trait default input output
+ * ------------------- --------------------- ------------------------
+ * iPixelsPerRow * passed into output same as default input
+ * iBitsPerPixel * must be 1 8 or 24
+ * iComponentsPerPixel * must be 1 1 or 3
+ * lHorizDPI passed into output same as default input
+ * lVertDPI passed into output same as default input
+ * lNumRows passed into output same as default input
+ * iNumPages passed into output same as default input
+ * iPageNum passed into output same as default input
+ *
+ * Above, a "*" by an item indicates it must be valid (not negative).
+ *
+ * Mar 1998 Mark Overton -- wrote code
+ *
+\******************************************************************************/
+
+#include "hpip.h"
+#include "ipdefs.h"
+#include "string.h" /* for memset and memcpy */
+
+
+#if 0
+ #include "stdio.h"
+ #include <tchar.h>
+
+ #define PRINT(msg,arg1,arg2) \
+ _ftprintf(stderr, msg, (int)arg1, (int)arg2)
+#else
+ #define PRINT(msg,arg1,arg2)
+#endif
+
+#define CHECK_VALUE 0x1ce5ca7e
+
+typedef struct {
+ IP_IMAGE_TRAITS inTraits; /* traits of the input image */
+ UINT uRowsDone; /* number of rows converted so far */
+ WORD wOutBitsPerPixel; /* bits/pixel to output (8 or 24) */
+ RGBQUAD rgbWhite; /* value of an output white */
+ RGBQUAD rgbBlack; /* value of an output black */
+ DWORD dwInRowBytes; /* # bytes per input row */
+ DWORD dwOutRowBytes; /* # bytes per output row */
+ DWORD dwInNextPos; /* file pos for subsequent input */
+ DWORD dwOutNextPos; /* file pos for subsequent output */
+ DWORD dwValidChk; /* struct validity check value */
+} B2G_INST, *PB2G_INST;
+
+
+
+/*****************************************************************************\
+ *
+ * bi2gray_openXform - Creates a new instance of the transformer
+ *
+ *****************************************************************************
+ *
+ * This returns a handle for the new instance to be passed into
+ * all subsequent calls.
+ *
+ * Return value: IP_DONE=success; IP_FATAL_ERROR=misc error.
+ *
+\*****************************************************************************/
+
+static WORD bi2gray_openXform (
+ IP_XFORM_HANDLE *pXform) /* out: returned handle */
+{
+ PB2G_INST g;
+
+ INSURE (pXform != NULL);
+ IP_MEM_ALLOC (sizeof(B2G_INST), g);
+ *pXform = g;
+ memset (g, 0, sizeof(B2G_INST));
+ g->dwValidChk = CHECK_VALUE;
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * bi2gray_setDefaultInputTraits - Specifies default input image traits
+ *
+ *****************************************************************************
+ *
+ * The header of the file-type handled by the transform probably does
+ * not include *all* the image traits we'd like to know. Those not
+ * specified in the file-header are filled in from info provided by
+ * this routine.
+ *
+ * Return value: IP_DONE=success; IP_FATAL_ERROR=misc error.
+ *
+\*****************************************************************************/
+
+static WORD bi2gray_setDefaultInputTraits (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ PIP_IMAGE_TRAITS pTraits) /* in: default image traits */
+{
+ PB2G_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ /* Insure that values we care about are correct */
+ INSURE (pTraits->iBitsPerPixel == 1);
+ INSURE (pTraits->iComponentsPerPixel == 1);
+ INSURE (pTraits->iPixelsPerRow > 0);
+
+ g->inTraits = *pTraits; /* a structure copy */
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * bi2gray_setXformSpec - Provides xform-specific information
+ *
+\*****************************************************************************/
+
+static WORD bi2gray_setXformSpec (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD_OR_PVOID aXformInfo[]) /* in: xform information */
+{
+ PB2G_INST g;
+ UINT nBits;
+
+ HANDLE_TO_PTR (hXform, g);
+ nBits = aXformInfo[IP_BI_2_GRAY_OUTPUT_BPP].dword;
+ INSURE (nBits==8 || nBits==24);
+ g->wOutBitsPerPixel = (WORD)nBits;
+ g->rgbWhite = aXformInfo[IP_BI_2_GRAY_WHITE_PIXEL].rgbquad;
+ g->rgbBlack = aXformInfo[IP_BI_2_GRAY_BLACK_PIXEL].rgbquad;
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * bi2gray_getHeaderBufSize- Returns size of input buf needed to hold header
+ *
+\*****************************************************************************/
+
+static WORD bi2gray_getHeaderBufSize (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD *pdwInBufLen) /* out: buf size for parsing header */
+{
+ /* since input is raw pixels, there is no header, so set it to zero */
+ *pdwInBufLen = 0;
+ return IP_DONE;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * bi2gray_getActualTraits - Parses header, and returns input & output traits
+ *
+\*****************************************************************************/
+
+static WORD bi2gray_getActualTraits (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD dwInputAvail, /* in: # avail bytes in input buf */
+ PBYTE pbInputBuf, /* in: ptr to input buffer */
+ PDWORD pdwInputUsed, /* out: # bytes used from input buf */
+ PDWORD pdwInputNextPos,/* out: file-pos to read from next */
+ PIP_IMAGE_TRAITS pInTraits, /* out: input image traits */
+ PIP_IMAGE_TRAITS pOutTraits) /* out: output image traits */
+{
+ PB2G_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ /* Since there is no header, we'll report no usage of input */
+ *pdwInputUsed = 0;
+ *pdwInputNextPos = 0;
+
+ *pInTraits = g->inTraits; /* structure copies */
+ *pOutTraits = g->inTraits;
+ pOutTraits->iBitsPerPixel = g->wOutBitsPerPixel;
+ pOutTraits->iComponentsPerPixel = g->wOutBitsPerPixel==8 ? 1 : 3;
+
+ g->dwInRowBytes = (g->inTraits.iPixelsPerRow+7) / 8;
+ g->dwOutRowBytes = g->inTraits.iPixelsPerRow * pOutTraits->iComponentsPerPixel;
+
+ return IP_DONE | IP_READY_FOR_DATA;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/****************************************************************************\
+ *
+ * bi2gray_getActualBufSizes - Returns buf sizes needed for remainder of job
+ *
+\****************************************************************************/
+
+static WORD bi2gray_getActualBufSizes (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ PDWORD pdwMinInBufLen, /* out: min input buf size */
+ PDWORD pdwMinOutBufLen) /* out: min output buf size */
+{
+ PB2G_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+ *pdwMinInBufLen = g->dwInRowBytes;
+ *pdwMinOutBufLen = g->dwOutRowBytes;
+
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * bi2gray_convert - Converts one row
+ *
+\*****************************************************************************/
+
+static WORD bi2gray_convert (
+ IP_XFORM_HANDLE hXform,
+ DWORD dwInputAvail, /* in: # avail bytes in in-buf */
+ PBYTE pbInputBuf, /* in: ptr to in-buffer */
+ PDWORD pdwInputUsed, /* out: # bytes used from in-buf */
+ PDWORD pdwInputNextPos, /* out: file-pos to read from next */
+ DWORD dwOutputAvail, /* in: # avail bytes in out-buf */
+ PBYTE pbOutputBuf, /* in: ptr to out-buffer */
+ PDWORD pdwOutputUsed, /* out: # bytes written in out-buf */
+ PDWORD pdwOutputThisPos) /* out: file-pos to write the data */
+{
+ PB2G_INST g;
+ PBYTE pIn, pOut, pInAfter;
+ BYTE bMask, bBilevel;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ /**** Check if we were told to flush ****/
+
+ if (pbInputBuf == NULL) {
+ PRINT (_T("bi2gray_convert: Told to flush.\n"), 0, 0);
+ *pdwInputUsed = *pdwOutputUsed = 0;
+ *pdwInputNextPos = g->dwInNextPos;
+ *pdwOutputThisPos = g->dwOutNextPos;
+ return IP_DONE;
+ }
+
+ /**** Output a Row ****/
+
+ INSURE (dwInputAvail >= g->dwInRowBytes );
+ INSURE (dwOutputAvail >= g->dwOutRowBytes);
+
+ pIn = pbInputBuf;
+ pOut = pbOutputBuf;
+ pInAfter = pIn + g->dwInRowBytes;
+
+ while (pIn < pInAfter) {
+ bBilevel = *pIn++;
+
+ if (g->wOutBitsPerPixel == 24) {
+ for (bMask=0x80u; bMask!=0; bMask>>=1) {
+ *(RGBQUAD*)pOut = (bMask & bBilevel)
+ ? g->rgbBlack
+ : g->rgbWhite;
+ pOut += 3;
+ }
+ } else { /* 8 bits per output pixel */
+ for (bMask=0x80u; bMask!=0; bMask>>=1) {
+ *pOut++ = (bMask & bBilevel)
+ ? g->rgbBlack.rgbRed
+ : g->rgbWhite.rgbRed;
+ }
+ }
+ }
+
+ *pdwInputUsed = g->dwInRowBytes;
+ g->dwInNextPos += g->dwInRowBytes;
+ *pdwInputNextPos = g->dwInNextPos;
+
+ *pdwOutputUsed = g->dwOutRowBytes;
+ *pdwOutputThisPos = g->dwOutNextPos;
+ g->dwOutNextPos += g->dwOutRowBytes;
+
+ g->uRowsDone += 1;
+
+ return IP_CONSUMED_ROW | IP_PRODUCED_ROW | IP_READY_FOR_DATA;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * bi2gray_insertedData - client inserted into our output stream
+ *
+\*****************************************************************************/
+
+static WORD bi2gray_insertedData (
+ IP_XFORM_HANDLE hXform,
+ DWORD dwNumBytes)
+{
+ fatalBreakPoint ();
+ return IP_FATAL_ERROR; /* must never be called (can't insert data) */
+}
+
+
+
+/*****************************************************************************\
+ *
+ * bi2gray_newPage - Tells us to flush this page, and start a new page
+ *
+\*****************************************************************************/
+
+static WORD bi2gray_newPage (
+ IP_XFORM_HANDLE hXform)
+{
+ PB2G_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+ /* todo: return fatal error if convert is called again? */
+ return IP_DONE; /* can't insert page-breaks, so ignore this call */
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+
+}
+
+
+
+/*****************************************************************************\
+ *
+ * bi2gray_closeXform - Destroys this instance
+ *
+\*****************************************************************************/
+
+static WORD bi2gray_closeXform (IP_XFORM_HANDLE hXform)
+{
+ PB2G_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ g->dwValidChk = 0;
+ IP_MEM_FREE (g); /* free memory for the instance */
+
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * bi2grayTbl - Jump-table for encoder
+ *
+\*****************************************************************************/
+
+IP_XFORM_TBL bi2grayTbl = {
+ bi2gray_openXform,
+ bi2gray_setDefaultInputTraits,
+ bi2gray_setXformSpec,
+ bi2gray_getHeaderBufSize,
+ bi2gray_getActualTraits,
+ bi2gray_getActualBufSizes,
+ bi2gray_convert,
+ bi2gray_newPage,
+ bi2gray_insertedData,
+ bi2gray_closeXform
+};
+
+/* End of File */
diff --git a/ip/xchgbpp.c b/ip/xchgbpp.c
new file mode 100644
index 0000000..dd8a454
--- /dev/null
+++ b/ip/xchgbpp.c
@@ -0,0 +1,627 @@
+/* libhpojip -- HP OfficeJet image-processing library. */
+
+/* Copyright (C) 1995-2002 Hewlett-Packard Company
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ * MA 02111-1307, USA.
+ *
+ * In addition, as a special exception, Hewlett-Packard Company
+ * gives permission to link the code of this program with any
+ * version of the OpenSSL library which is distributed under a
+ * license identical to that listed in the included LICENSE.OpenSSL
+ * file, and distribute linked combinations including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * this file, you may extend this exception to your version of the
+ * file, but you are not obligated to do so. If you do not wish to
+ * do so, delete this exception statement from your version.
+ */
+
+/* Original author: Mark Overton and others.
+ *
+ * Ported to Linux by David Paschal.
+ */
+
+/******************************************************************************\
+ *
+ * xchangeBPP.c - Changes bits per pixel
+ *
+ ******************************************************************************
+ *
+ * Name of Global Jump-Table:
+ *
+ * changeBPPTbl
+ *
+ * Items in aXformInfo array passed into setXformSpec:
+ *
+ * aXformInfo[IP_CHANGE_BPP_OUTPUT_BPP] = bits/pixel to output
+ *
+ * Capabilities and Limitations:
+ *
+ * 1 bpp is assumed to be bilevel (0=white, 1=black).
+ * 8 and 16 bpp are assumed to be grayscale.
+ * 24 and 48 bpp are assumed to be 3-component color (rgb is assumed when
+ * we convert from color into grayscale).
+ * Among the above supported bpp values, any bpp can be changed into any
+ * other bpp. Changing into bi-level (bpp=1) performs simple thresholding.
+ * Use xgray2bi if you want error-diffusion.
+ * If the input and output bpp values are the same, this xform merely passes
+ * the pixels through unexamined.
+ *
+ * Default Input Traits, and Output Traits:
+ *
+ * trait default input output
+ * ------------------- --------------------- ------------------------
+ * iPixelsPerRow * passed into output same as default input
+ * iBitsPerPixel * anything changed as specified
+ * iComponentsPerPixel * 1 or 3 can be changed to 3
+ * lHorizDPI passed into output same as default input
+ * lVertDPI passed into output same as default input
+ * lNumRows passed into output same as default input
+ * iNumPages passed into output same as default input
+ * iPageNum passed into output same as default input
+ *
+ * Above, a "*" by an item indicates it must be valid (not negative).
+ *
+ * Mar 1998 Mark Overton -- wrote code (for 1 -> 8/24 only)
+ * Apr 2000 Mark Overton -- generalized as a change-BPP xform
+ *
+\******************************************************************************/
+
+#include "hpip.h"
+#include "ipdefs.h"
+#include "string.h" /* for memset and memcpy */
+#include "assert.h"
+
+
+#if 0
+ #include "stdio.h"
+ #include <tchar.h>
+
+ #define PRINT(msg,arg1,arg2) \
+ _ftprintf(stderr, msg, (int)arg1, (int)arg2)
+#else
+ #define PRINT(msg,arg1,arg2)
+#endif
+
+#define CHECK_VALUE 0x1ce5ca7e
+
+typedef struct {
+ IP_IMAGE_TRAITS inTraits; /* traits of the input image */
+ UINT uRowsDone; /* number of rows converted so far */
+ WORD wOutBitsPerPixel; /* bits/pixel to output */
+ DWORD dwInRowBytes; /* # bytes per input row */
+ DWORD dwOutRowBytes; /* # bytes per output row */
+ DWORD dwInNextPos; /* file pos for subsequent input */
+ DWORD dwOutNextPos; /* file pos for subsequent output */
+ DWORD dwValidChk; /* struct validity check value */
+} CBPP_INST, *PCBPP_INST;
+
+
+
+/*****************************************************************************\
+ *
+ * changeBPP_openXform - Creates a new instance of the transformer
+ *
+ *****************************************************************************
+ *
+ * This returns a handle for the new instance to be passed into
+ * all subsequent calls.
+ *
+ * Return value: IP_DONE=success; IP_FATAL_ERROR=misc error.
+ *
+\*****************************************************************************/
+
+static WORD changeBPP_openXform (
+ IP_XFORM_HANDLE *pXform) /* out: returned handle */
+{
+ PCBPP_INST g;
+
+ INSURE (pXform != NULL);
+ IP_MEM_ALLOC (sizeof(CBPP_INST), g);
+ *pXform = g;
+ memset (g, 0, sizeof(CBPP_INST));
+ g->dwValidChk = CHECK_VALUE;
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * changeBPP_setDefaultInputTraits - Specifies default input image traits
+ *
+ *****************************************************************************
+ *
+ * The header of the file-type handled by the transform probably does
+ * not include *all* the image traits we'd like to know. Those not
+ * specified in the file-header are filled in from info provided by
+ * this routine.
+ *
+ * Return value: IP_DONE=success; IP_FATAL_ERROR=misc error.
+ *
+\*****************************************************************************/
+
+static WORD changeBPP_setDefaultInputTraits (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ PIP_IMAGE_TRAITS pTraits) /* in: default image traits */
+{
+ PCBPP_INST g;
+ int bpp;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ /* Insure that values we care about are correct */
+ bpp = pTraits->iBitsPerPixel;
+ INSURE (bpp==1 || bpp==8 || bpp==16 || bpp==24 || bpp==48);
+ INSURE (pTraits->iComponentsPerPixel==1 || pTraits->iComponentsPerPixel==3);
+ INSURE (pTraits->iPixelsPerRow > 0);
+
+ g->inTraits = *pTraits; /* a structure copy */
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * changeBPP_setXformSpec - Provides xform-specific information
+ *
+\*****************************************************************************/
+
+static WORD changeBPP_setXformSpec (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD_OR_PVOID aXformInfo[]) /* in: xform information */
+{
+ PCBPP_INST g;
+ UINT nBits;
+
+ HANDLE_TO_PTR (hXform, g);
+ nBits = aXformInfo[IP_CHANGE_BPP_OUTPUT_BPP].dword;
+ g->wOutBitsPerPixel = (WORD)nBits;
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * changeBPP_getHeaderBufSize- Returns size of input buf needed to hold header
+ *
+\*****************************************************************************/
+
+static WORD changeBPP_getHeaderBufSize (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD *pdwInBufLen) /* out: buf size for parsing header */
+{
+ /* since input is raw pixels, there is no header, so set it to zero */
+ *pdwInBufLen = 0;
+ return IP_DONE;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * changeBPP_getActualTraits - Parses header, and returns input & output traits
+ *
+\*****************************************************************************/
+
+static WORD changeBPP_getActualTraits (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD dwInputAvail, /* in: # avail bytes in input buf */
+ PBYTE pbInputBuf, /* in: ptr to input buffer */
+ PDWORD pdwInputUsed, /* out: # bytes used from input buf */
+ PDWORD pdwInputNextPos,/* out: file-pos to read from next */
+ PIP_IMAGE_TRAITS pInTraits, /* out: input image traits */
+ PIP_IMAGE_TRAITS pOutTraits) /* out: output image traits */
+{
+ PCBPP_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ /* Since there is no header, we'll report no usage of input */
+ *pdwInputUsed = 0;
+ *pdwInputNextPos = 0;
+
+ *pInTraits = g->inTraits; /* structure copies */
+ *pOutTraits = g->inTraits;
+ pOutTraits->iBitsPerPixel = g->wOutBitsPerPixel;
+ pOutTraits->iComponentsPerPixel = g->wOutBitsPerPixel<24 ? 1 : 3;
+
+ g->dwInRowBytes = (g->inTraits.iPixelsPerRow*g->inTraits.iBitsPerPixel + 7) / 8;
+ g->dwOutRowBytes = (g->inTraits.iPixelsPerRow*g->wOutBitsPerPixel + 7) / 8;
+
+ return IP_DONE | IP_READY_FOR_DATA;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/****************************************************************************\
+ *
+ * changeBPP_getActualBufSizes - Returns buf sizes needed for remainder of job
+ *
+\****************************************************************************/
+
+static WORD changeBPP_getActualBufSizes (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ PDWORD pdwMinInBufLen, /* out: min input buf size */
+ PDWORD pdwMinOutBufLen) /* out: min output buf size */
+{
+ PCBPP_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+ *pdwMinInBufLen = g->dwInRowBytes;
+ *pdwMinOutBufLen = g->dwOutRowBytes;
+
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * changeBPP_convert - Converts one row
+ *
+\*****************************************************************************/
+
+static WORD changeBPP_convert (
+ IP_XFORM_HANDLE hXform,
+ DWORD dwInputAvail, /* in: # avail bytes in in-buf */
+ PBYTE pbInputBuf, /* in: ptr to in-buffer */
+ PDWORD pdwInputUsed, /* out: # bytes used from in-buf */
+ PDWORD pdwInputNextPos, /* out: file-pos to read from next */
+ DWORD dwOutputAvail, /* in: # avail bytes in out-buf */
+ PBYTE pbOutputBuf, /* in: ptr to out-buffer */
+ PDWORD pdwOutputUsed, /* out: # bytes written in out-buf */
+ PDWORD pdwOutputThisPos) /* out: file-pos to write the data */
+{
+ PCBPP_INST g;
+ PBYTE pIn, pOut, pInAfter;
+ unsigned rv, gv, bv;
+ BYTE bMask, bBilevel;
+ BYTE bPixels;
+ WORD wPixels;
+ DWORD dwPixels;
+
+ #define OUTPUT_THRESHOLDED_BIT(grayParam) { \
+ int gray = grayParam; \
+ if (gray < 128) bBilevel |= bMask; \
+ bMask >>= 1; \
+ if (bMask == 0) { \
+ *pOut++ = (BYTE)bBilevel; \
+ bBilevel = 0; \
+ bMask = (BYTE)0x80; \
+ } \
+ }
+
+ HANDLE_TO_PTR (hXform, g);
+
+ /**** Check if we were told to flush ****/
+
+ if (pbInputBuf == NULL) {
+ PRINT (_T("changeBPP_convert: Told to flush.\n"), 0, 0);
+ *pdwInputUsed = *pdwOutputUsed = 0;
+ *pdwInputNextPos = g->dwInNextPos;
+ *pdwOutputThisPos = g->dwOutNextPos;
+ return IP_DONE;
+ }
+
+ /**** Output a Row ****/
+
+ INSURE (dwInputAvail >= g->dwInRowBytes );
+ INSURE (dwOutputAvail >= g->dwOutRowBytes);
+
+ bMask = 0x80;
+ bBilevel = 0;
+
+ pIn = pbInputBuf;
+ pOut = pbOutputBuf;
+ pInAfter = pIn + g->dwInRowBytes;
+
+ if (g->inTraits.iBitsPerPixel == g->wOutBitsPerPixel) {
+ /* no change in bpp; just copy the buffer */
+ memcpy (pOut, pIn, g->dwInRowBytes);
+ } else if (g->inTraits.iBitsPerPixel == 1) {
+ while (pIn < pInAfter) {
+ bBilevel = *pIn++;
+
+ if (g->wOutBitsPerPixel == 48) {
+ for (bMask=0x80u; bMask!=0; bMask>>=1) {
+ dwPixels = (bMask & bBilevel)
+ ? 0 /* black */
+ : 0xffffffff; /* white */
+ *(DWORD*)pOut = dwPixels;
+ *(WORD*)(pOut+4) = (WORD)dwPixels;
+ pOut += 6;
+ }
+ } else if (g->wOutBitsPerPixel == 24) {
+ for (bMask=0x80u; bMask!=0; bMask>>=1) {
+ *(DWORD*)pOut = (bMask & bBilevel)
+ ? 0 /* black */
+ : 0xffffffff; /* white */
+ pOut += 3;
+ }
+ } else if (g->wOutBitsPerPixel == 16) {
+ for (bMask=0x80u; bMask!=0; bMask>>=1) {
+ *(WORD*)pOut = (bMask & bBilevel)
+ ? 0 /* black */
+ : 0xffff; /* white */
+ pOut += 2;
+ }
+ } else if (g->wOutBitsPerPixel == 8) {
+ for (bMask=0x80u; bMask!=0; bMask>>=1) {
+ *pOut++ = (bMask & bBilevel)
+ ? 0 /* black */
+ : 0xff; /* white */
+ }
+ } else
+ assert (0);
+ }
+ }
+ else if (g->inTraits.iBitsPerPixel == 8) {
+ if (g->wOutBitsPerPixel == 48) {
+ while (pIn < pInAfter) {
+ wPixels = (*pIn++ << 8);
+ *(WORD*)(pOut+0) = wPixels;
+ *(WORD*)(pOut+2) = wPixels;
+ *(WORD*)(pOut+4) = wPixels;
+ pOut += 6;
+ }
+ } else if (g->wOutBitsPerPixel == 24) {
+ while (pIn < pInAfter) {
+ bPixels = *pIn++;
+ *pOut++ = bPixels;
+ *pOut++ = bPixels;
+ *pOut++ = bPixels;
+ }
+ } else if (g->wOutBitsPerPixel == 16) {
+ while (pIn < pInAfter) {
+ wPixels = (*pIn++ << 8);
+ *(WORD*)pOut = wPixels;
+ pOut += 2;
+ }
+ } else if (g->wOutBitsPerPixel == 1) {
+ while (pIn < pInAfter) {
+ OUTPUT_THRESHOLDED_BIT (*pIn);
+ pIn++;
+ }
+ } else
+ assert (0);
+ }
+ else if (g->inTraits.iBitsPerPixel == 16) {
+ if (g->wOutBitsPerPixel == 48) {
+ while (pIn < pInAfter) {
+ wPixels = *(WORD*)pIn;
+ *(WORD*)(pOut+0) = wPixels;
+ *(WORD*)(pOut+2) = wPixels;
+ *(WORD*)(pOut+4) = wPixels;
+ pIn += 2;
+ pOut += 6;
+ }
+ } else if (g->wOutBitsPerPixel == 24) {
+ while (pIn < pInAfter) {
+ bPixels = (*(WORD*)pIn) >> 8;
+ pIn += 2;
+ *pOut++ = bPixels;
+ *pOut++ = bPixels;
+ *pOut++ = bPixels;
+ }
+ } else if (g->wOutBitsPerPixel == 8) {
+ while (pIn < pInAfter) {
+ *pOut++ = (*(WORD*)pIn) >> 8;
+ pIn += 2;
+ }
+ } else if (g->wOutBitsPerPixel == 1) {
+ while (pIn < pInAfter) {
+ OUTPUT_THRESHOLDED_BIT ((*(WORD*)pIn) >> 8);
+ pIn += 2;
+ }
+ } else
+ assert (0);
+ }
+ else if (g->inTraits.iBitsPerPixel == 24) {
+ if (g->wOutBitsPerPixel == 48) {
+ while (pIn < pInAfter) {
+ *(WORD*)(pOut+0) = (WORD)(*pIn++) << 8;
+ *(WORD*)(pOut+2) = (WORD)(*pIn++) << 8;
+ *(WORD*)(pOut+4) = (WORD)(*pIn++) << 8;
+ pOut += 6;
+ }
+ } else if (g->wOutBitsPerPixel == 16) {
+ /* converting rgb color (24) to grayscale (16) */
+ while (pIn < pInAfter) {
+ rv = (*pIn++) << 8;
+ gv = (*pIn++) << 8;
+ bv = (*pIn++) << 8;
+ *(WORD*)pOut = NTSC_LUMINANCE (rv, gv, bv);
+ pOut += 2;
+ }
+ } else if (g->wOutBitsPerPixel == 8) {
+ /* converting rgb color (24) to grayscale (8) */
+ while (pIn < pInAfter) {
+ rv = *pIn++;
+ gv = *pIn++;
+ bv = *pIn++;
+ *pOut++ = NTSC_LUMINANCE (rv, gv, bv);
+ }
+ } else if (g->wOutBitsPerPixel == 1) {
+ /* converting rgb color (24) to bi-level */
+ while (pIn < pInAfter) {
+ rv = *pIn++;
+ gv = *pIn++;
+ bv = *pIn++;
+ OUTPUT_THRESHOLDED_BIT (NTSC_LUMINANCE(rv,gv,bv));
+ }
+ } else
+ assert (0);
+ }
+ else if (g->inTraits.iBitsPerPixel == 48) {
+ if (g->wOutBitsPerPixel == 24) {
+ while (pIn < pInAfter) {
+ *pOut++ = ((WORD*)pIn)[0] >> 8;
+ *pOut++ = ((WORD*)pIn)[1] >> 8;
+ *pOut++ = ((WORD*)pIn)[2] >> 8;
+ pIn += 6;
+ }
+ } else if (g->wOutBitsPerPixel == 16) {
+ /* converting rgb color (48) to grayscale (16) */
+ while (pIn < pInAfter) {
+ rv = ((WORD*)pIn)[0];
+ gv = ((WORD*)pIn)[1];
+ bv = ((WORD*)pIn)[2];
+ *(WORD*)pOut = NTSC_LUMINANCE (rv, gv, bv);
+ pIn += 6;
+ pOut += 2;
+ }
+ } else if (g->wOutBitsPerPixel == 8) {
+ /* converting rgb color (48) to grayscale (8) */
+ while (pIn < pInAfter) {
+ rv = ((WORD*)pIn)[0];
+ gv = ((WORD*)pIn)[1];
+ bv = ((WORD*)pIn)[2];
+ *pOut++ = NTSC_LUMINANCE (rv, gv, bv) >> 8;
+ pIn += 6;
+ }
+ } else if (g->wOutBitsPerPixel == 1) {
+ /* converting rgb color (48) to bi-level */
+ while (pIn < pInAfter) {
+ rv = ((WORD*)pIn)[0];
+ gv = ((WORD*)pIn)[1];
+ bv = ((WORD*)pIn)[2];
+ OUTPUT_THRESHOLDED_BIT (NTSC_LUMINANCE(rv,gv,bv) >> 8);
+ pIn += 6;
+ }
+ } else
+ assert (0);
+ }
+
+ if (g->inTraits.iBitsPerPixel>1 && g->wOutBitsPerPixel==1 && bMask!=(BYTE)0x80)
+ *pOut = bBilevel; /* output any partially-filled byte */
+
+ *pdwInputUsed = g->dwInRowBytes;
+ g->dwInNextPos += g->dwInRowBytes;
+ *pdwInputNextPos = g->dwInNextPos;
+
+ *pdwOutputUsed = g->dwOutRowBytes;
+ *pdwOutputThisPos = g->dwOutNextPos;
+ g->dwOutNextPos += g->dwOutRowBytes;
+
+ g->uRowsDone += 1;
+
+ return IP_CONSUMED_ROW | IP_PRODUCED_ROW | IP_READY_FOR_DATA;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * changeBPP_insertedData - client inserted into our output stream
+ *
+\*****************************************************************************/
+
+static WORD changeBPP_insertedData (
+ IP_XFORM_HANDLE hXform,
+ DWORD dwNumBytes)
+{
+ fatalBreakPoint ();
+ return IP_FATAL_ERROR; /* must never be called (can't insert data) */
+}
+
+
+
+/*****************************************************************************\
+ *
+ * changeBPP_newPage - Tells us to flush this page, and start a new page
+ *
+\*****************************************************************************/
+
+static WORD changeBPP_newPage (
+ IP_XFORM_HANDLE hXform)
+{
+ PCBPP_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+ /* todo: return fatal error if convert is called again? */
+ return IP_DONE; /* can't insert page-breaks, so ignore this call */
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+
+}
+
+
+
+/*****************************************************************************\
+ *
+ * changeBPP_closeXform - Destroys this instance
+ *
+\*****************************************************************************/
+
+static WORD changeBPP_closeXform (IP_XFORM_HANDLE hXform)
+{
+ PCBPP_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ g->dwValidChk = 0;
+ IP_MEM_FREE (g); /* free memory for the instance */
+
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * changeBPPTbl - Jump-table for xform
+ *
+\*****************************************************************************/
+
+IP_XFORM_TBL changeBPPTbl = {
+ changeBPP_openXform,
+ changeBPP_setDefaultInputTraits,
+ changeBPP_setXformSpec,
+ changeBPP_getHeaderBufSize,
+ changeBPP_getActualTraits,
+ changeBPP_getActualBufSizes,
+ changeBPP_convert,
+ changeBPP_newPage,
+ changeBPP_insertedData,
+ changeBPP_closeXform
+};
+
+/* End of File */
diff --git a/ip/xcolrspc.c b/ip/xcolrspc.c
new file mode 100644
index 0000000..98a60b8
--- /dev/null
+++ b/ip/xcolrspc.c
@@ -0,0 +1,1191 @@
+/* libhpojip -- HP OfficeJet image-processing library. */
+
+/* Copyright (C) 1995-2002 Hewlett-Packard Company
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ * MA 02111-1307, USA.
+ *
+ * In addition, as a special exception, Hewlett-Packard Company
+ * gives permission to link the code of this program with any
+ * version of the OpenSSL library which is distributed under a
+ * license identical to that listed in the included LICENSE.OpenSSL
+ * file, and distribute linked combinations including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * this file, you may extend this exception to your version of the
+ * file, but you are not obligated to do so. If you do not wish to
+ * do so, delete this exception statement from your version.
+ */
+
+/* Original author: Mark Overton and others.
+ *
+ * Ported to Linux by David Paschal.
+ */
+
+/******************************************************************************\
+ *
+ * xcolrspc.c - Converts between color spaces
+ *
+ ******************************************************************************
+ *
+ * Name of Global Jump-Table:
+ *
+ * colorTbl
+ *
+ * Items in aXformInfo array passed into setXformSpec:
+ *
+ * aXformInfo[IP_CNV_COLOR_SPACE_WHICH_CNV] = Which color-space conversion to do:
+ * IP_CNV_YCC_TO_CIELAB = ycc -> cielab
+ * IP_CNV_CIELAB_TO_YCC = cielab -> ycc
+ * IP_CNV_YCC_TO_SRGB = ycc -> srgb
+ * IP_CNV_SRGB_TO_YCC = srgb -> ycc
+ * IP_CNV_LHS_TO_SRGB = lhs -> srgb
+ * IP_CNV_SRGB_TO_LHS = srgb -> lhs
+ * IP_CNV_BGR_SWAP = rgb<->bgr swap
+ *
+ * aXformInfo[IP_CNV_COLOR_SPACE_GAMMA] = Gamma value for gamma correction,
+ * in 16.16 fixed-point.
+ * In the YCC->CIELab conversion, the data will be
+ * inverse-gamma corrected using 1/Gamma.
+ * In the CIELab->YCC conversion, it will be gamma corrected
+ * using Gamma.
+ * This Gamma value is ignored in the other conversions.
+ * A value of 0.0 makes us use a default Gamma of 2.2.
+ * You must set this to 1.0 if you want to disable Gamma.
+ *
+ * Gamma is done here because the pixels are in RGB at one
+ * point in the YCC<->CIELab conversions. Since you can't do
+ * Gamma on YCC or CIELab data, it can't be done outside
+ * this xform for those two conversions.
+ *
+ * Capabilities and Limitations:
+ *
+ * Does the space conversions listed above. Conversions will only be done on
+ * 24-bit data; monochrome data are passed through unchanged.
+ *
+ * Default Input Traits, and Output Traits:
+ *
+ * trait default input output
+ * ------------------- --------------------- ------------------------
+ * iPixelsPerRow * passed into output same as default input
+ * iBitsPerPixel * must be <= 24 same as default input
+ * iComponentsPerPixel passed into output same as default input
+ * lHorizDPI passed into output same as default input
+ * lVertDPI passed into output same as default input
+ * lNumRows passed into output same as default input
+ * iNumPages passed into output same as default input
+ * iPageNum passed into output same as default input
+ *
+ * Above, a "*" by an item indicates it must be valid (not negative).
+ *
+ * Feb 1998 Mark Overton -- wrote original code, with dummy conversions
+ * Apr 1998 Mark Overton -- added actual conversion code, adapted from
+ * Cindy Samson's code
+ *
+\******************************************************************************/
+
+#include "math.h" // needed for pow and floor
+#include "hpip.h"
+#include "ipdefs.h"
+#include "string.h" /* for memset and memcpy */
+#include "assert.h"
+
+/* xsc_clean[Uu]p.h: */
+
+int Send_yTable[100] = {
+210,212,213,214,215,216,
+217,218,219,220,221,223,
+224,225,226,228,230,232,
+233,234,235,237,238,239,
+240,242,243,244,245,246,
+247,248,249,250,251,252,
+253,254,255,255,255,255,
+255,255,255,255};
+
+/* end xsc_clean[Uu]p.h */
+
+
+#if 0
+ #include "stdio.h"
+ #include <tchar.h>
+ #define PRINT(msg,arg1,arg2) \
+ _ftprintf(stderr, msg, (int)arg1, (int)arg2)
+#else
+ #define PRINT(msg,arg1,arg2)
+#endif
+
+#define CHECK_VALUE 0x4ba1dace
+
+
+typedef struct {
+ IP_IMAGE_TRAITS traits; /* traits of the input image */
+ IP_WHICH_CNV which_cnv; /* which space-conversion to do */
+ BYTE bGammaTbl[256]; /* Gamma-correction table */
+ DWORD dwRowsDone; /* number of rows converted so far */
+ DWORD dwInNextPos; /* file pos for subsequent input */
+ DWORD dwOutNextPos; /* file pos for subsequent output */
+ DWORD dwValidChk; /* struct validity check value */
+} COL_INST, *PCOL_INST;
+
+static BOOL fInited = FALSE;
+
+//Neutral Shift Data Definition
+#define NEUTRAL_SHIFT_SEND TRUE
+
+
+// constants to convert [r,g,b] into Y
+#define RGBTOY_R_FAC 0.30078125f
+#define RGBTOY_G_FAC 0.5859375f
+#define RGBTOY_B_FAC 0.11328125f
+
+// constants to convert [y,cb,cr] into [r,g,b]
+#define YCCTORGB_CR_TO_R 1.39946f
+#define YCCTORGB_CB_TO_G -0.344228f
+#define YCCTORGB_CR_TO_G -0.717202f
+#define YCCTORGB_CB_TO_B 1.77243f
+
+
+// The above constants used for converting between RGB and YCC are based
+// on the following conversion matrices. The code assumes that the
+// 0.003 and 0.006 below are zero.
+#if 0
+ static float RGBtoYCC[3][3]= { // input is RGB
+ 0.30078125f, 0.5859375f, 0.11328125f, // Y
+ -0.16796875f, -0.33203125f, 0.5f, // Cb
+ 0.5f, -0.41796875f, -0.08203125f // Cr
+ };
+
+ static float YCCtoRGB[3][3]= { // input is YCbCr
+ 1.0f, 0.003f, 1.39946f, // R
+ 1.0f, -0.344228f, -0.717202f, // G
+ 1.0f, 1.77243f, 0.006f // B
+ };
+#endif
+
+
+#define X_SCALE (255.0/244.0)
+#define Y_SCALE (255.0/255.0)
+#define Z_SCALE (255.0/210.0)
+
+#define DEFAULT_GAMMA 2.2f
+#define SLIGHT_BOOST (255.0/253.0) // todo - get rid of this
+
+
+/****************************************************************************\
+ ****************************************************************************
+ ** **
+ ** W O R K E R R O U T I N E S **
+ ** **
+ ****************************************************************************
+\****************************************************************************/
+
+
+
+#define CLIP(wilma) ((wilma>255) ? 255 : ((wilma<0) ? 0 : (wilma)))
+
+#define TERM_FRAC_BITS 4 // # frac bits in temp x/y/z terms
+#define CONV_FRAC_BITS 4 // # frac bits in "_fix" conversion tables
+#define CONV_FRAC_ROUND (1L<<(CONV_FRAC_BITS-1))
+#define TBL33_FRAC_BITS 16 // # bits of fraction in 3x3 tables
+#define TABLE_FRAC_SCALE (1L << TBL33_FRAC_BITS)
+
+
+// these tables are computed by initTables
+
+static BYTE YtoL [256]; // these are for to/from CIELab
+static BYTE LtoY [256];
+static short cubeRoot [256];
+static BYTE cube [256];
+
+static short cb2b [256]; // these are for [y,cb,cr]->[r,g,b]
+static short cr2r [256];
+static short cr2g_fix [256];
+static short cb2g_fix [256];
+
+static short r2y_fix [256]; // these are for [r,g,b]->Y
+static short g2y_fix [256];
+static short b2y_fix [256];
+
+static BYTE by2cb [2*256]; // these are for [r,g,b]->CbCr
+static BYTE ry2cr [2*256];
+
+
+
+// VectMult - Multiplies a pixel by a 3x3 matrix, with fixed-point math
+//
+static void VectMult(
+ int inPixel[3], // in: input pixel
+ int outPixel[3], // out: output pixel
+ long *pMat) // in: 3x3 matrix with TBL33_FRAC_BITS of fraction
+{
+ int i;
+
+ for (i=0; i<3; i++) {
+ outPixel[i] = (int)( pMat[0]*inPixel[0] +
+ pMat[1]*inPixel[1] +
+ pMat[2]*inPixel[2] + (1L<<(TBL33_FRAC_BITS-1))
+ ) >> TBL33_FRAC_BITS;
+ pMat += 3;
+ }
+}
+
+
+
+// initTables - Computes look-up tables
+//
+// CIE Illuminant D50 white point Xn=96.422 Yn=100 Zn=82.521
+// CIE Illuminant D65 white point Xn=95.04 Yn=100 Zn=108.89
+// FAX gamut Range:
+// L* = [0,100]
+// a* = [-85, 85]
+// b* = [-75, 125]
+//
+// NL = 255/100*l
+// Na = 255/170 x a* + 128
+// Nb = 255/200 x b* + 96
+//
+
+static void initTables (void)
+{
+ int val;
+ int icr, icb;
+ float fval;
+ float t;
+
+ for (val=0; val<=255; val++)
+ {
+ fval = (float)val / 255.0f;
+
+ // compute Y->L array
+
+ if (fval > 0.008856f) t = 116.0f*(float)pow(fval,1.0/3.0) - 16.0f;
+ else t = 903.3f*fval;
+ t = (255.0f/100.0f)*t;
+ if (t < 0.0f) t = 0.0f;
+ if (t > 255.0f) t = 255.0f;
+ YtoL[val] = (BYTE)(t + 0.5f);
+
+ // compute L->Y array
+
+ if (val <= 7)
+ t = val * (100.0f/903.3f);
+ else {
+ t = (fval*100.0f+16.0f) / 116.0f;
+ t = 255.0f*t*t*t;
+ }
+ LtoY[val] = (BYTE)(t + 0.5f);
+
+ // compute cube-root array.
+ // Input is 0..255. We divide it by 255 so it's 0..1, take cube root,
+ // and scale result to 0..255. Adjustment is for small numbers.
+
+ if (fval > 0.008856f) t = (float)pow(fval, 1.0f/3.0f);
+ else t = 7.7867f*fval + 16.0f/116.0f;
+ cubeRoot[val] = (short)(t*255.0f*(1L<<TERM_FRAC_BITS) + 0.5f);
+
+ cube[val] = (BYTE)(255.0f*fval*fval*fval);
+ // above, we don't round because we won't reach full black in lab->ycc conv
+
+ // compute ycc<->rgb conversion tables
+
+ fval = (float)val;
+
+ r2y_fix[val] = (short)(SLIGHT_BOOST*RGBTOY_R_FAC*fval*(1<<CONV_FRAC_BITS));
+ g2y_fix[val] = (short)(SLIGHT_BOOST*RGBTOY_G_FAC*fval*(1<<CONV_FRAC_BITS));
+ b2y_fix[val] = (short)(SLIGHT_BOOST*RGBTOY_B_FAC*fval*(1<<CONV_FRAC_BITS));
+
+ fval -= 128.0f;
+
+ cb2b [val] = (short)(floor(YCCTORGB_CB_TO_B*fval + 0.5));
+ cr2r [val] = (short)(floor(YCCTORGB_CR_TO_R*fval + 0.5));
+ cb2g_fix[val] = (short)(YCCTORGB_CB_TO_G*fval*(1<<CONV_FRAC_BITS));
+ cr2g_fix[val] = (short)(YCCTORGB_CR_TO_G*fval*(1<<CONV_FRAC_BITS));
+ }
+
+
+ for (val=0; val<=2*255; val++)
+ {
+ fval = (float)val - 255.0f;
+
+ icb = (int)floor(fval/YCCTORGB_CB_TO_B + 0.5);
+ if (icb>=-4 && icb<=4) // make sure white is white
+ icb = 0;
+ icb += 128;
+ by2cb[val] = (BYTE)CLIP(icb);
+
+ icr = (int)floor(fval/YCCTORGB_CR_TO_R + 0.5);
+ if (icr>=-4 && icr<=4) // make sure white is white.
+ icr = 0;
+ icr += 128;
+ ry2cr[val] = (BYTE)CLIP(icr);
+ }
+}
+
+
+
+static void calcGammaTable (
+ PCOL_INST g,
+ DWORD dwGamma) /* Gamma value in 16.16 fixed-point */
+{
+ #define MAX_GAMMA_SLOPE 4
+
+ int i;
+ int maxval;
+ float fGamma, f, gamval;
+ BYTE bGamVal;
+
+ fGamma = (dwGamma == 0) ? DEFAULT_GAMMA : (float)dwGamma/(1L<<16);
+
+ switch (g->which_cnv) {
+ case IP_CNV_YCC_TO_CIELAB:
+ /* YCC is assumed to have been Gamma corrected. So we must do
+ * inverse Gamma when converting to CIELab
+ */
+ fGamma = 1.0f / fGamma;
+ break;
+
+ case IP_CNV_CIELAB_TO_YCC:
+ /* CIELab has not been Gamma corrected, so we must do forward
+ * Gamma when going to YCC.
+ */
+ break;
+
+ default:
+ /* No Gamma for the other conversions */
+ fGamma = 1.0f;
+ }
+
+ if (fGamma == 1.0f) {
+ /* No gamma correction: use identity table */
+ for (i=0; i<=255; i++)
+ g->bGammaTbl[i] = i;
+ } else {
+ fGamma = 1.0f / fGamma;
+ for (i=0; i<=255; i++) {
+ f = (float)i / 255.0f;
+ gamval = (float)pow(f, fGamma);
+ bGamVal = (BYTE)(255.0f*gamval + 0.5f);
+ maxval = (int)(i * MAX_GAMMA_SLOPE);
+ if (fGamma<1.0f && bGamVal>maxval)
+ bGamVal = maxval;
+ g->bGammaTbl[i] = bGamVal;
+ }
+ }
+}
+
+
+
+/****************************************************************************\
+ ****************************************************************************
+ ** **
+ ** YCC -> sRGB and YCC -> CIELAB **
+ ** **
+ ****************************************************************************
+\****************************************************************************/
+
+
+/* Table for Molokai (and Wizard, I think) */
+#if 0
+static long RGBtoXYZ50[9] = {
+ (long)(0.4358530*X_SCALE*TABLE_FRAC_SCALE + 0.5),
+ (long)(0.3840300*X_SCALE*TABLE_FRAC_SCALE + 0.5),
+ (long)(0.1431260*X_SCALE*TABLE_FRAC_SCALE + 0.5),
+
+ (long)(0.2225640*Y_SCALE*TABLE_FRAC_SCALE + 0.5),
+ (long)(0.7200520*Y_SCALE*TABLE_FRAC_SCALE + 0.5),
+ (long)(0.0607176*Y_SCALE*TABLE_FRAC_SCALE + 0.5),
+
+ (long)(0.0139307*Z_SCALE*TABLE_FRAC_SCALE + 0.5),
+ (long)(0.0973260*Z_SCALE*TABLE_FRAC_SCALE + 0.5),
+ (long)(0.7142870*Z_SCALE*TABLE_FRAC_SCALE + 0.5)
+};
+#endif
+
+
+/* Table for Polaris and Avalon */
+#if 1
+static long RGBtoXYZ50[9] = {
+ (long)(0.464700*X_SCALE*TABLE_FRAC_SCALE + 0.5),
+ (long)(0.339211*X_SCALE*TABLE_FRAC_SCALE + 0.5),
+ (long)(0.156961*X_SCALE*TABLE_FRAC_SCALE + 0.5),
+
+ (long)(0.220615*Y_SCALE*TABLE_FRAC_SCALE + 0.5),
+ (long)(0.700919*Y_SCALE*TABLE_FRAC_SCALE + 0.5),
+ (long)(0.053199*Y_SCALE*TABLE_FRAC_SCALE + 0.5),
+
+ (long)(0.005146*Z_SCALE*TABLE_FRAC_SCALE + 0.5),
+ (long)(0.050405*Z_SCALE*TABLE_FRAC_SCALE + 0.5),
+ (long)(0.774384*Z_SCALE*TABLE_FRAC_SCALE + 0.5)
+};
+#endif
+
+
+
+// YCCToCIELab - Converts a pixel (3 unsigned bytes) from YCC to fax LAB
+//
+// Conversions done herein:
+// YCC -> sRGB -> inverse Gamma -> XYZ(d65) -> XYZ(d50) -> LAB
+// Some of the above steps are combined for speed.
+//
+static void YCCToCIELab (
+ PBYTE pYCC, // in: YCC pixel (3 unsigned bytes)
+ PBYTE pCIELab, // out: LAB pixel (3 unsigned bytes)
+ PBYTE pGamma) // in: inverse Gamma table
+{
+ int iy, icb,icr;
+ int sR, sG, sB;
+ int sRGBval[3];
+ int XYZ50val[3];
+ int x, y, z;
+ int xterm, yterm, zterm;
+ int L, a, b;
+ int absCr, absCb; //Neutral Shift Purpose
+
+
+ iy = pYCC[0];
+ icb = pYCC[1];
+ icr = pYCC[2];
+
+#ifdef NEUTRAL_SHIFT_SEND
+
+ absCb = abs(icb-128);
+ absCr = abs(icr-128);
+
+ if (iy>=210)
+ {
+ iy = Send_yTable[iy-210];
+ }
+
+ if (iy ==255)
+ {
+
+ if ((absCb < 5) && (absCr <5))
+ {
+ icr = icb = 128;
+ }
+ }
+ else if (iy>240)
+ {
+ if ((absCb < 4) && (absCr <4))
+ {
+ icr=icb=128;
+ iy = 255;
+ }
+ else if ((absCb < 3) && (absCr <3))
+ {
+ icr=icb=128;
+ }
+ }
+ else if (iy>230)
+ {
+ if ((absCb < 3) && (absCr <3))
+ {
+ icr=icb=128;
+ iy = 250;
+ }
+ }
+ else if (iy>220)
+ {
+ if ((absCb < 3) && (absCr <3))
+ {
+ icr=icb=128;
+ iy = 240;
+ }
+ }
+ else if (iy >60)
+ {
+ if ((absCb <3) && (absCr <3))
+ {
+ icr=icb=128;
+ }
+ }
+
+ #endif
+
+/* END NEUTRAL SHIFT */
+ // iy=77; icb=85; icr=255; // solid red
+ // ycc=29,255,107 is solid blue
+
+
+ /**** Convert YCC to sRGB ****/
+
+ sR = iy + cr2r[icr];
+ sR = CLIP(sR);
+
+ sG = iy + ((cr2g_fix[icr] + cb2g_fix[icb] + CONV_FRAC_ROUND) >> CONV_FRAC_BITS);
+ sG = CLIP(sG);
+
+ sB = iy + cb2b[icb];
+ sB = CLIP(sB);
+
+ /**** Inverse Gamma correction, and Convert sRGB(d65) to XYZ(d50) ****/
+
+ sRGBval[0] = (long)pGamma[sR];
+ sRGBval[1] = (long)pGamma[sG];
+ sRGBval[2] = (long)pGamma[sB];
+
+ VectMult (sRGBval, XYZ50val, RGBtoXYZ50);
+
+ x = CLIP(XYZ50val[0]);
+ y = CLIP(XYZ50val[1]);
+ z = CLIP(XYZ50val[2]);
+
+ /**** Convert XYZ(d50) to fax LAB ****/
+
+ pCIELab[0] = L = YtoL[y];
+ xterm = cubeRoot[x];
+ yterm = cubeRoot[y];
+ zterm = cubeRoot[z];
+
+ b = yterm - zterm;
+ b += (96<<TERM_FRAC_BITS) + (1<<(TERM_FRAC_BITS-1));
+ b >>= TERM_FRAC_BITS;
+ pCIELab[2] = (BYTE)CLIP(b);
+
+ if (b < 0) { /* todo - adjustment for out-of-gamut bright blue */
+ /* xterm and L factors below of 6,1 -> rgb of 32,31,229 */
+ /* xterm and L factors below of 8,2 -> rgb of 84,80,255 */
+ /* xterm and L factors below of 6,0.5 are visually best */
+ xterm += 6*b;
+ L -= b>>1;
+ pCIELab[0] = (BYTE)CLIP(L);
+ }
+
+ // a = (long)((1<<10)*500.0/170.0) * (xterm-yterm) >> 10;
+ // the 3*a - a/16 below is close enough to (500.0/170.0)*a
+ a = xterm - yterm;
+ a = a + a + a - (a>>4); // multiply by approx 500/170
+ a += (128<<TERM_FRAC_BITS) + (1<<(TERM_FRAC_BITS-1));
+ a >>= TERM_FRAC_BITS;
+ pCIELab[1] = (BYTE)CLIP(a);
+}
+
+
+
+// YCCTosRGB - Converts a pixel (3 unsigned bytes) from YCC to sRGB
+//
+static void YCCTosRGB (
+ PBYTE pYCC, // in: YCC pixel (3 unsigned bytes)
+ PBYTE psRGB) // out: sRGB pixel (3 unsigned bytes)
+{
+ int iy, icb, icr;
+ int sR, sG, sB;
+
+ iy = pYCC[0];
+ icb = pYCC[1];
+ icr = pYCC[2];
+
+ sR = iy + cr2r[icr];
+ psRGB[0] = (BYTE)CLIP(sR);
+
+ sG = iy + ((cr2g_fix[icr] + cb2g_fix[icb] + CONV_FRAC_ROUND) >> CONV_FRAC_BITS);
+ psRGB[1] = (BYTE)CLIP(sG);
+
+ sB = iy + cb2b[icb];
+ psRGB[2] = (BYTE)CLIP(sB);
+}
+
+
+
+/****************************************************************************\
+ ****************************************************************************
+ ** **
+ ** sRGB -> YCC and CIELAB -> YCC **
+ ** **
+ ****************************************************************************
+\****************************************************************************/
+
+
+static long XYZ50tosRGB[9] = {
+ (long)( 3.1344500*TABLE_FRAC_SCALE /* *(255.0/248.0) */ /X_SCALE + 0.5),
+ (long)(-1.6177000*TABLE_FRAC_SCALE /* *(255.0/248.0) */ /Y_SCALE - 0.5),
+ (long)(-0.4905000*TABLE_FRAC_SCALE /* *(255.0/248.0) */ /Z_SCALE - 0.5),
+
+ (long)(-0.9788600*TABLE_FRAC_SCALE /* *(255.0/258.0) */ /X_SCALE - 0.5),
+ (long)( 1.9164800*TABLE_FRAC_SCALE /* *(255.0/258.0) */ /Y_SCALE + 0.5),
+ (long)( 0.0334962*TABLE_FRAC_SCALE /* *(255.0/258.0) */ /Z_SCALE + 0.5),
+
+ (long)( 0.0719813*TABLE_FRAC_SCALE /* *(255.0/254.0) */ /X_SCALE + 0.5),
+ (long)(-0.2290660*TABLE_FRAC_SCALE /* *(255.0/254.0) */ /Y_SCALE - 0.5),
+ (long)( 1.4050500*TABLE_FRAC_SCALE /* *(255.0/254.0) */ /Z_SCALE + 0.5)
+};
+
+
+
+// CIELabToYCC - Converts a pixel (3 unsigned bytes) from fax LAB to YCC
+//
+// Conversions done herein:
+// LAB(d50) -> XYZ(d50) -> XYZ(d65) -> sRGB -> Gamma -> YCC
+// Some of the above steps are combined for speed.
+//
+static void CIELabToYCC (
+ PBYTE pCIELab, // in: LAB pixel (3 unsigned bytes)
+ PBYTE pYCC, // out: YCC pixel (3 unsigned bytes)
+ PBYTE pGamma) // in: Gamma table
+{
+ int a, b, xterm, yterm, zterm;
+ int Y;
+ long factor;
+ int XYZ50[3];
+ int sRGB[3];
+ int sR,sG,sB;
+ int iy;
+ int icr, icb;
+
+ /**** LAB -> XYZ, both in d50 ****/
+
+ factor = (long)((1L<<16)*170.0/500.0);
+ a = (int)(((((long)pCIELab[1]-128) * factor) + 0x8000L) >> 16);
+ b = (int)pCIELab[2] - 96;
+
+ XYZ50[1] = Y = LtoY[pCIELab[0]];
+ yterm = (cubeRoot[Y] + (1<<(TERM_FRAC_BITS-1))) >> TERM_FRAC_BITS;
+
+ xterm = a + yterm;
+ XYZ50[0] = cube[CLIP(xterm)];
+
+ zterm = yterm - b;
+ XYZ50[2] = cube[CLIP(zterm)];
+
+ /**** XYZ(d50)->XYZ(d65)->sRGB via 3x3 matrix, then Gamma correct ****/
+
+ VectMult (XYZ50, sRGB, XYZ50tosRGB);
+
+ sR = pGamma[CLIP(sRGB[0])];
+ sG = pGamma[CLIP(sRGB[1])];
+ sB = pGamma[CLIP(sRGB[2])];
+
+ /**** sRGB -> YCC ****/
+
+ iy = r2y_fix[sR] + g2y_fix[sG] + b2y_fix[sB];
+ iy = (iy + CONV_FRAC_ROUND) >> CONV_FRAC_BITS;
+ iy = CLIP(iy);
+
+ //It is done inside the Neutral Shift area
+ //pYCC[0] = (BYTE)iy;
+
+ //pYCC[1] = (by2cb+255)[sB-iy];
+ // pYCC[2] = (ry2cr+255)[sR-iy];
+ icb = (int)((by2cb+255)[sB-iy]); //it is pYCC[1]
+ icr = (int)((ry2cr+255)[sR-iy]); //it is pYCC[2]
+
+ pYCC[0] = (BYTE)iy;
+ pYCC[1] = (BYTE)icb;
+ pYCC[2] = (BYTE)icr;
+
+
+
+}
+
+
+
+// sRGBToYCC - Converts a pixel (3 unsigned bytes) from sRGB to YCC
+//
+static void sRGBToYCC (
+ PBYTE psRGB, // in: sRGB pixel (3 unsigned bytes)
+ PBYTE pYCC) // out: YCC pixel (3 unsigned bytes)
+{
+ int sR, sG, sB;
+ int iy;
+
+ sR = psRGB[0];
+ sG = psRGB[1];
+ sB = psRGB[2];
+
+ iy = r2y_fix[sR] + g2y_fix[sG] + b2y_fix[sB];
+ iy = (iy + CONV_FRAC_ROUND) >> CONV_FRAC_BITS;
+ iy = CLIP(iy);
+ pYCC[0] = (BYTE)iy;
+
+ pYCC[1] = (by2cb+255)[sB-iy];
+ pYCC[2] = (ry2cr+255)[sR-iy];
+}
+
+
+
+/****************************************************************************\
+ ****************************************************************************
+ ** **
+ ** sRGB -> HLS and HLS -> YCC **
+ ** **
+ ****************************************************************************
+\****************************************************************************/
+
+
+
+// sRGBToLHS - Converts a pixel (3 unsigned bytes) from sRGB to LHS
+//
+static void sRGBToLHS (
+ PBYTE psRGB, // in: sRGB pixel (3 unsigned bytes)
+ PBYTE pLHS) // out: LHS pixel (3 unsigned bytes)
+{
+ int R, G, B;
+ int L, H, S; // these are in 0..255
+ int maxVal, minVal, diff, sum, numerator;
+
+ R = (unsigned)psRGB[0];
+ G = (unsigned)psRGB[1];
+ B = (unsigned)psRGB[2];
+
+ maxVal = IP_MAX (R, G);
+ maxVal = IP_MAX (maxVal, B);
+ minVal = IP_MIN (R, G);
+ minVal = IP_MIN (minVal, B);
+ diff = maxVal - minVal;
+ sum = maxVal + minVal;
+ L = sum >> 1;
+
+ if (diff <= 1) {
+ S = 0;
+ H = 0;
+ } else {
+ // below is really 255*diff / (...), but avoiding the multiply
+ S = ((diff<<9) - diff - diff) / (L<=127 ? sum : 510-sum);
+ S = (S+1) >> 1; // round to 8 bits
+
+ // determine the hue
+ if (R == maxVal) {
+ numerator = (maxVal-B) - (maxVal-G);
+ H = 0; // red is at 0 degrees
+ } else if (G == maxVal) {
+ numerator = (maxVal-R) - (maxVal-B);
+ H = (1<<12)*1/3; // green is at 120 degrees
+ } else { // blue-dominant
+ numerator = (maxVal-G) - (maxVal-R);
+ H = (1<<12)*2/3; // blue is at 240 degrees
+ }
+
+ // The line below is same as: hue += ((1<<12)/6) * numerator / diff;
+ // but is faster and more accurate.
+ H += (numerator<<11) / (diff+diff+diff);
+ H = (H + (1<<3)) >> 4; // rounds 12 bits down to 8 bits
+ }
+
+ pLHS[0] = (unsigned char)L;
+ pLHS[1] = (unsigned char)H;
+ pLHS[2] = (unsigned char)S;
+}
+
+
+
+// LHSTosRGB - Converts a pixel (3 unsigned bytes) from LHS to sRGB
+//
+static void LHSTosRGB (
+ PBYTE pLHS, // in: LHS pixel (3 unsigned bytes)
+ PBYTE psRGB) // out: sRGB pixel (3 unsigned bytes)
+{
+ int L, H, S;
+ int R=0, G=0, B=0;
+ int hbase, hfrac, product, maxVal, minVal, midVal;
+
+ L = (unsigned)pLHS[0]; // 1.0 is at 255
+ H = (unsigned)pLHS[1]; // 1.0 is at 255 (which is 360 degrees)
+ S = (unsigned)pLHS[2]; // 1.0 is at 255
+
+ // In RGB_to_HLS, L=sum/2, which truncates. The average error from this
+ // truncation is 0.25, which is the (1<<4) added below.
+ L = (L<<6) + (1<<4); // now 1.0 is at 255*(1<<6), 6 bits of frac
+ S = S<<6;
+
+ H *= 6;
+ hbase = H >> 8; // in 0..5, and is the basic hue
+ hfrac = H & 0x00ff; // fractional offset from basic hue to next basic hue
+
+ product = L*S;
+ product = (product + (product>>8)) >> (8+6); // approx division by 255*(1<<6)
+ if (L <= (127<<6)+(1<<4)) maxVal = L + product;
+ else maxVal = L + S - product;
+
+ minVal = L + L - maxVal;
+ midVal = minVal + (((maxVal-minVal) * ((hbase&1) ? 256-hfrac : hfrac)) >> 8);
+
+ // round the results to 8 bits by shifting out the 6 frac bits
+ minVal = (minVal+(1<<5)) >> 6;
+ midVal = (midVal+(1<<5)) >> 6;
+ maxVal = (maxVal+(1<<5)) >> 6;
+
+ // I ran this routine with all possible h-l-s values (2^24 of them!), and
+ // none produced a value outside 0..255, so we don't do the checks below.
+ // if (maxVal < 0) maxVal=0; else if (maxVal > 255) maxVal = 255;
+ // if (midVal < 0) midVal=0; else if (midVal > 255) midVal = 255;
+ // if (minVal < 0) minVal=0; else if (minVal > 255) minVal = 255;
+
+ switch (hbase)
+ {
+ case 0: R = maxVal; G = midVal; B = minVal; break;
+ case 1: R = midVal; G = maxVal; B = minVal; break;
+ case 2: R = minVal; G = maxVal; B = midVal; break;
+ case 3: R = minVal; G = midVal; B = maxVal; break;
+ case 4: R = midVal; G = minVal; B = maxVal; break;
+ case 5: R = maxVal; G = minVal; B = midVal; break;
+ }
+
+ psRGB[0] = (BYTE)R;
+ psRGB[1] = (BYTE)G;
+ psRGB[2] = (BYTE)B;
+}
+
+
+
+/****************************************************************************\
+ ****************************************************************************
+ ** **
+ ** E N T R Y P O I N T S **
+ ** **
+ ****************************************************************************
+\****************************************************************************/
+
+
+
+/*****************************************************************************\
+ *
+ * color_openXform - Creates a new instance of the transformer
+ *
+ *****************************************************************************
+ *
+ * This returns a handle for the new instance to be passed into
+ * all subsequent calls.
+ *
+ * Return value: IP_DONE=success; IP_FATAL_ERROR=misc error.
+ *
+\*****************************************************************************/
+
+static WORD color_openXform (
+ IP_XFORM_HANDLE *pXform) /* out: returned handle */
+{
+ PCOL_INST g;
+
+ if (! fInited) {
+ initTables ();
+ fInited = TRUE;
+ }
+
+ INSURE (pXform != NULL);
+ IP_MEM_ALLOC (sizeof(COL_INST), g);
+ *pXform = g;
+ memset (g, 0, sizeof(COL_INST));
+ g->dwValidChk = CHECK_VALUE;
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * color_setDefaultInputTraits - Specifies default input image traits
+ *
+ *****************************************************************************
+ *
+ * The header of the file-type handled by the transform probably does
+ * not include *all* the image traits we'd like to know. Those not
+ * specified in the file-header are filled in from info provided by
+ * this routine.
+ *
+ * Return value: IP_DONE=success; IP_FATAL_ERROR=misc error.
+ *
+\*****************************************************************************/
+
+static WORD color_setDefaultInputTraits (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ PIP_IMAGE_TRAITS pTraits) /* in: default image traits */
+{
+ PCOL_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ /* Insure that values we care about are correct */
+ INSURE (pTraits->iBitsPerPixel <= 24);
+ INSURE (pTraits->iPixelsPerRow > 0);
+
+ g->traits = *pTraits; /* a structure copy */
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * color_setXformSpec - Provides xform-specific information
+ *
+\*****************************************************************************/
+
+static WORD color_setXformSpec (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD_OR_PVOID aXformInfo[]) /* in: xform information */
+{
+ PCOL_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+ g->which_cnv = (IP_WHICH_CNV)aXformInfo[IP_CNV_COLOR_SPACE_WHICH_CNV].dword;
+ calcGammaTable (g, aXformInfo[IP_CNV_COLOR_SPACE_GAMMA].dword);
+
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * color_getHeaderBufSize- Returns size of input buf needed to hold header
+ *
+\*****************************************************************************/
+
+static WORD color_getHeaderBufSize (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD *pdwInBufLen) /* out: buf size for parsing header */
+{
+ /* since input is raw pixels, there is no header, so set it to zero */
+ *pdwInBufLen = 0;
+ return IP_DONE;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * color_getActualTraits - Parses header, and returns input & output traits
+ *
+\*****************************************************************************/
+
+static WORD color_getActualTraits (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD dwInputAvail, /* in: # avail bytes in input buf */
+ PBYTE pbInputBuf, /* in: ptr to input buffer */
+ PDWORD pdwInputUsed, /* out: # bytes used from input buf */
+ PDWORD pdwInputNextPos, /* out: file-pos to read from next */
+ PIP_IMAGE_TRAITS pIntraits, /* out: input image traits */
+ PIP_IMAGE_TRAITS pOutTraits) /* out: output image traits */
+{
+ PCOL_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ /* Since there is no header, we'll report no usage of input */
+ *pdwInputUsed = 0;
+ *pdwInputNextPos = 0;
+
+ *pIntraits = g->traits; /* structure copies */
+ *pOutTraits = g->traits;
+
+ return IP_DONE | IP_READY_FOR_DATA;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/****************************************************************************\
+ *
+ * color_getActualBufSizes - Returns buf sizes needed for remainder of job
+ *
+\****************************************************************************/
+
+static WORD color_getActualBufSizes (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ PDWORD pdwMinInBufLen, /* out: min input buf size */
+ PDWORD pdwMinOutBufLen) /* out: min output buf size */
+{
+ PCOL_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+ *pdwMinInBufLen = *pdwMinOutBufLen =
+ (g->traits.iPixelsPerRow*g->traits.iBitsPerPixel + 7) / 8;
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * color_convert - Converts one row
+ *
+\*****************************************************************************/
+
+static WORD color_convert (
+ IP_XFORM_HANDLE hXform,
+ DWORD dwInputAvail, /* in: # avail bytes in in-buf */
+ PBYTE pbInputBuf, /* in: ptr to in-buffer */
+ PDWORD pdwInputUsed, /* out: # bytes used from in-buf */
+ PDWORD pdwInputNextPos, /* out: file-pos to read from next */
+ DWORD dwOutputAvail, /* in: # avail bytes in out-buf */
+ PBYTE pbOutputBuf, /* in: ptr to out-buffer */
+ PDWORD pdwOutputUsed, /* out: # bytes written in out-buf */
+ PDWORD pdwOutputThisPos) /* out: file-pos to write the data */
+{
+ PCOL_INST g;
+ int nBytes;
+ PBYTE pIn, pOut, pOutAfter;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ /**** Check if we were told to flush ****/
+
+ if (pbInputBuf == NULL) {
+ PRINT (_T("color_convert: Told to flush.\n"), 0, 0);
+ *pdwInputUsed = *pdwOutputUsed = 0;
+ *pdwInputNextPos = g->dwInNextPos;
+ *pdwOutputThisPos = g->dwOutNextPos;
+ return IP_DONE;
+ }
+
+ /**** Output a Row ****/
+
+ nBytes = (g->traits.iPixelsPerRow*g->traits.iBitsPerPixel + 7) / 8;
+ INSURE (dwInputAvail >= (DWORD)nBytes );
+ INSURE (dwOutputAvail >= (DWORD)nBytes);
+
+ pIn = pbInputBuf;
+ pOut = pbOutputBuf;
+ pOutAfter = pOut + nBytes;
+
+ if (g->traits.iBitsPerPixel < 24) {
+ /* grayscale data; pass through unchanged */
+ memcpy (pOut, pIn, nBytes);
+ } else if (g->which_cnv == IP_CNV_BGR_SWAP) {
+ while (pOut < pOutAfter) {
+ pOut[0] = pIn[2];
+ pOut[1] = pIn[1];
+ pOut[2] = pIn[0];
+ pIn += 3;
+ pOut += 3;
+ }
+ } else {
+ while (pOut < pOutAfter) {
+ switch (g->which_cnv) {
+ case IP_CNV_YCC_TO_CIELAB: YCCToCIELab (pIn, pOut, g->bGammaTbl); break;
+ case IP_CNV_CIELAB_TO_YCC: CIELabToYCC (pIn, pOut, g->bGammaTbl); break;
+ case IP_CNV_YCC_TO_SRGB: YCCTosRGB (pIn, pOut); break;
+ case IP_CNV_SRGB_TO_YCC: sRGBToYCC (pIn, pOut); break;
+ case IP_CNV_LHS_TO_SRGB: LHSTosRGB (pIn, pOut); break;
+ case IP_CNV_SRGB_TO_LHS: sRGBToLHS (pIn, pOut); break;
+ default: goto fatal_error;
+ }
+
+ pIn += 3;
+ pOut += 3;
+ }
+ }
+
+ *pdwInputUsed = nBytes;
+ g->dwInNextPos += nBytes;
+ *pdwInputNextPos = g->dwInNextPos;
+
+ *pdwOutputUsed = nBytes;
+ *pdwOutputThisPos = g->dwOutNextPos;
+ g->dwOutNextPos += nBytes;
+
+ g->dwRowsDone += 1;
+
+ return IP_CONSUMED_ROW | IP_PRODUCED_ROW | IP_READY_FOR_DATA;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * color_insertedData - client inserted into our output stream
+ *
+\*****************************************************************************/
+
+static WORD color_insertedData (
+ IP_XFORM_HANDLE hXform,
+ DWORD dwNumBytes)
+{
+ fatalBreakPoint ();
+ return IP_FATAL_ERROR; /* must never be called (can't insert data) */
+}
+
+
+
+/*****************************************************************************\
+ *
+ * color_newPage - Tells us to flush this page, and start a new page
+ *
+\*****************************************************************************/
+
+static WORD color_newPage (
+ IP_XFORM_HANDLE hXform)
+{
+ PCOL_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+ return IP_DONE; /* can't insert page-breaks, so ignore this call */
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+
+}
+
+
+
+/*****************************************************************************\
+ *
+ * color_closeXform - Destroys this instance
+ *
+\*****************************************************************************/
+
+static WORD color_closeXform (IP_XFORM_HANDLE hXform)
+{
+ PCOL_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ g->dwValidChk = 0;
+ IP_MEM_FREE (g); /* free memory for the instance */
+
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * colorTbl - Jump-table for transform driver
+ *
+\*****************************************************************************/
+
+IP_XFORM_TBL colorTbl = {
+ color_openXform,
+ color_setDefaultInputTraits,
+ color_setXformSpec,
+ color_getHeaderBufSize,
+ color_getActualTraits,
+ color_getActualBufSizes,
+ color_convert,
+ color_newPage,
+ color_insertedData,
+ color_closeXform
+};
+
+/* End of File */
diff --git a/ip/xconvolve.c b/ip/xconvolve.c
new file mode 100644
index 0000000..56d420d
--- /dev/null
+++ b/ip/xconvolve.c
@@ -0,0 +1,658 @@
+/* libhpojip -- HP OfficeJet image-processing library. */
+
+/* Copyright (C) 1995-2002 Hewlett-Packard Company
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ * MA 02111-1307, USA.
+ *
+ * In addition, as a special exception, Hewlett-Packard Company
+ * gives permission to link the code of this program with any
+ * version of the OpenSSL library which is distributed under a
+ * license identical to that listed in the included LICENSE.OpenSSL
+ * file, and distribute linked combinations including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * this file, you may extend this exception to your version of the
+ * file, but you are not obligated to do so. If you do not wish to
+ * do so, delete this exception statement from your version.
+ */
+
+/* Original author: Mark Overton and others.
+ *
+ * Ported to Linux by David Paschal.
+ */
+
+/******************************************************************************\
+ *
+ * xconvolve.c - convolution using any number or rows and columns up to max
+ *
+ ******************************************************************************
+ *
+ * Name of Global Jump-Table:
+ *
+ * convolveTbl
+ *
+ * Items in aXformInfo array passed into setXformSpec:
+ *
+ * aXformInfo[IP_CONVOLVE_NROWS ] = # rows in convolution matrix (odd)
+ * aXformInfo[IP_CONVOLVE_NCOLS ] = # columns in convolution matrix (odd)
+ * aXformInfo[IP_CONVOLVE_MATRIX ] = ptr to convolution matrix
+ * aXformInfo[IP_CONVOLVE_DIVISOR] = divide by this after summing products
+ *
+ * The matrix is an array of int's, ordered left to right, top to bottom.
+ * After the pixels are multiplied by the elements in the matrix and these
+ * products summed together, the sum is divided by the integer divisor.
+ *
+ * If you set nRows and nCols to 7, then this xform is identical to the
+ * "User defined filter" feature in Paint Shop Pro.
+ *
+ * This xform makes a copy of the given matrix, so its memory can be freed
+ * after you've called setXformSpec.
+ *
+ * IP_CONVOLVE_MAXSIZE is the max number of rows or columns.
+ *
+ * Capabilities and Limitations:
+ *
+ * The input data must be grayscale (8 or 16 bits/pixel), or color (24 or
+ * 48 bits/pixel) in a luminance-chrominance color-space. This xform only
+ * changes the first component of color data (assumed to be the luminance).
+ *
+ * Default Input Traits, and Output Traits:
+ *
+ * trait default input output
+ * ------------------- --------------------- ------------------------
+ * iPixelsPerRow * passed into output same as default input
+ * iBitsPerPixel * 8, 16, 24 or 48 same as default input
+ * iComponentsPerPixel * 1 or 3 same as default input
+ * lHorizDPI passed into output same as default input
+ * lVertDPI passed into output same as default input
+ * lNumRows passed into output same as default input
+ * iNumPages passed into output same as default input
+ * iPageNum passed into output same as default input
+ *
+ * Above, a "*" by an item indicates it must be valid (not negative).
+ *
+\******************************************************************************/
+
+/* Use the #define below if this transform will exist in a dll outside of the
+ * image pipeline. This will allow the functions to be exported.
+ * #define EXPORT_TRANFORM 1
+ */
+
+#include "hpip.h"
+#include "ipdefs.h"
+#include "string.h" /* for memset and memcpy */
+
+
+#if 0
+ #include "stdio.h"
+ #include <tchar.h>
+ #define PRINT(msg,arg1,arg2) \
+ _ftprintf(stderr, msg, (int)arg1, (int)arg2)
+#else
+ #define PRINT(msg,arg1,arg2)
+#endif
+
+#define CHECK_VALUE 0x4ba1dace
+
+#ifdef EXPORT_TRANSFORM
+#define FUNC_STATUS __declspec (dllexport)
+#else
+#define FUNC_STATUS static
+#endif
+
+typedef struct {
+ IP_IMAGE_TRAITS traits; /* traits of the input and output image */
+ DWORD dwBytesPerRow; /* # of bytes in each row */
+ int iBytesPerPixel; /* # bytes in each pixel */
+ DWORD dwRowsRead; /* number of rows read so far */
+ DWORD dwRowsWritten; /* number of rows output so far */
+ DWORD dwInNextPos; /* file pos for subsequent input */
+ DWORD dwOutNextPos; /* file pos for subsequent output */
+ int nCols; /* # columns in the matrix (must be odd) */
+ int nRows; /* # rows in the matrix (must be odd) */
+ int nRowsFilled; /* # rows filled so far in the matrix */
+ int iDivisor; /* divide sum of products by this */
+ int matrix[IP_CONVOLVE_MAXSIZE*IP_CONVOLVE_MAXSIZE]; /* the matrix */
+ PBYTE apRows[IP_CONVOLVE_MAXSIZE]; /* ptrs to buffered rows */
+ DWORD dwValidChk; /* struct validity check value */
+} CONV_INST, *PCONV_INST;
+
+
+
+/*****************************************************************************\
+ *
+ * convolve_openXform - Creates a new instance of the transformer
+ *
+ *****************************************************************************
+ *
+ * This returns a handle for the new instance to be passed into
+ * all subsequent calls.
+ *
+ * Return value: IP_DONE=success; IP_FATAL_ERROR=misc error.
+ *
+\*****************************************************************************/
+
+FUNC_STATUS WORD convolve_openXform (
+ IP_XFORM_HANDLE *pXform) /* out: returned handle */
+{
+ PCONV_INST g;
+
+ INSURE (pXform != NULL);
+ IP_MEM_ALLOC (sizeof(CONV_INST), g);
+ *pXform = g;
+ memset (g, 0, sizeof(CONV_INST));
+ g->dwValidChk = CHECK_VALUE;
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * convolve_setDefaultInputTraits - Specifies default input image traits
+ *
+ *****************************************************************************
+ *
+ * The header of the file-type handled by the transform probably does
+ * not include *all* the image traits we'd like to know. Those not
+ * specified in the file-header are filled in from info provided by
+ * this routine.
+ *
+ * Return value: IP_DONE=success; IP_FATAL_ERROR=misc error.
+ *
+\*****************************************************************************/
+
+FUNC_STATUS WORD convolve_setDefaultInputTraits (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ PIP_IMAGE_TRAITS pTraits) /* in: default image traits */
+{
+ PCONV_INST g;
+ int bpp;
+ int comps;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ /* insure that traits we care about are valid */
+ bpp = pTraits->iBitsPerPixel;
+ comps = pTraits->iComponentsPerPixel;
+ INSURE ((comps==1 && (bpp==8 || bpp==16)) ||
+ (comps==3 && (bpp==24 || bpp==48)));
+ INSURE (pTraits->iPixelsPerRow > 0);
+
+ g->traits = *pTraits; /* a structure copy */
+ g->iBytesPerPixel = g->traits.iBitsPerPixel / 8;
+ g->dwBytesPerRow = g->traits.iPixelsPerRow * g->iBytesPerPixel;
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * convolve_setXformSpec - Provides xform-specific information
+ *
+\*****************************************************************************/
+
+FUNC_STATUS WORD convolve_setXformSpec (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD_OR_PVOID aXformInfo[]) /* in: xform information */
+{
+ PCONV_INST g;
+ int i, n;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ g->nRows = aXformInfo[IP_CONVOLVE_NROWS ].dword;
+ g->nCols = aXformInfo[IP_CONVOLVE_NCOLS ].dword;
+ g->iDivisor = aXformInfo[IP_CONVOLVE_DIVISOR].dword;
+
+ INSURE ((g->nRows&1)!=0 && g->nRows>0 && g->nRows<=IP_CONVOLVE_MAXSIZE);
+ INSURE ((g->nCols&1)!=0 && g->nCols>0 && g->nCols<=IP_CONVOLVE_MAXSIZE);
+ INSURE (g->iDivisor != 0);
+ INSURE (aXformInfo[IP_CONVOLVE_MATRIX].pvoid != 0);
+
+ n = g->nRows * g->nCols;
+ for (i=0; i<n; i++)
+ g->matrix[i] = ((int*)(aXformInfo[IP_CONVOLVE_MATRIX].pvoid))[i];
+
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * convolve_getHeaderBufSize- Returns size of input buf needed to hold header
+ *
+\*****************************************************************************/
+
+FUNC_STATUS WORD convolve_getHeaderBufSize (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD *pdwInBufLen) /* out: buf size for parsing header */
+{
+ /* since input is raw pixels, there is no header, so set it to zero */
+ *pdwInBufLen = 0;
+ return IP_DONE;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * convolve_getActualTraits - Parses header, and returns input & output traits
+ *
+\*****************************************************************************/
+
+FUNC_STATUS WORD convolve_getActualTraits (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD dwInputAvail, /* in: # avail bytes in input buf */
+ PBYTE pbInputBuf, /* in: ptr to input buffer */
+ PDWORD pdwInputUsed, /* out: # bytes used from input buf */
+ PDWORD pdwInputNextPos,/* out: file-pos to read from next */
+ PIP_IMAGE_TRAITS pIntraits, /* out: input image traits */
+ PIP_IMAGE_TRAITS pOutTraits) /* out: output image traits */
+{
+ PCONV_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ /* Since there is no header, we'll report no usage of input */
+ *pdwInputUsed = 0;
+ *pdwInputNextPos = 0;
+
+ *pIntraits = g->traits; /* structure copies */
+ *pOutTraits = g->traits;
+
+ return IP_DONE | IP_READY_FOR_DATA;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/****************************************************************************\
+ *
+ * convolve_getActualBufSizes - Returns buf sizes needed for remainder of job
+ *
+\****************************************************************************/
+
+FUNC_STATUS WORD convolve_getActualBufSizes (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ PDWORD pdwMinInBufLen, /* out: min input buf size */
+ PDWORD pdwMinOutBufLen) /* out: min output buf size */
+{
+ PCONV_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ *pdwMinInBufLen = *pdwMinOutBufLen = g->dwBytesPerRow;
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * CopyRow - Copies row to row-buffer, filling over-run zone on sides
+ *
+\*****************************************************************************/
+
+static void CopyRow (
+ PCONV_INST g, /* ptr to our instance variables */
+ PBYTE pbSrc, /* input buffer */
+ PBYTE pbDest) /* output buffer in apRows (with side-zones allocated) */
+{
+ int nSidePixels;
+ int i;
+
+ nSidePixels = g->nCols / 2;
+
+ /* copy leftmost pixel into all pixels in left side-zone */
+ for (i=0; i<nSidePixels; i++) {
+ memcpy (pbDest, pbSrc, g->iBytesPerPixel);
+ pbDest += g->iBytesPerPixel;
+ }
+
+ /* copy the buffer */
+ memcpy (pbDest, pbSrc, g->dwBytesPerRow);
+ pbDest += g->dwBytesPerRow;
+ pbSrc += g->dwBytesPerRow - g->iBytesPerPixel; /* leave at rightmost pixel */
+
+ /* copy rightmost pixel into all pixels in right side-zone */
+ for (i=0; i<nSidePixels; i++) {
+ memcpy (pbDest, pbSrc, g->iBytesPerPixel);
+ pbDest += g->iBytesPerPixel;
+ }
+}
+
+
+
+/*****************************************************************************\
+ *
+ * convolve_bytes - performs convolution on a row pixels with 8 or 24 bits each
+ *
+\*****************************************************************************/
+
+static void convolve_bytes (
+ PCONV_INST g, /* ptr to our instance variables */
+ PBYTE pbDest) /* output buffer */
+{
+ PBYTE pbSrc, pbDestAfter;
+ int iSrcOffset, iSideOffset, iSum;
+ int *pMatrix;
+ int row, col;
+
+ pbDestAfter = pbDest + g->dwBytesPerRow;
+ iSrcOffset = 0;
+ iSideOffset = g->iBytesPerPixel * (g->nCols>>1);
+
+ while (pbDest < pbDestAfter) /* for each output pixel ... */
+ {
+ iSum = 0;
+ pMatrix = g->matrix;
+
+ for (row=0; row<g->nRows; row++) {
+ pbSrc = g->apRows[row] + iSrcOffset;
+ for (col=0; col<g->nCols; col++) {
+ iSum += (*pMatrix++) * (int)(unsigned)(*pbSrc);
+ pbSrc += g->iBytesPerPixel;
+ }
+ }
+
+ iSum = (iSum + (g->iDivisor>>1)) / g->iDivisor;
+ if (iSum < 0) iSum = 0; else if (iSum > 255) iSum = 255;
+ *pbDest++ = (BYTE)iSum;
+
+ if (g->iBytesPerPixel == 3) {
+ /* copy chrominance values from the center pixel to the output pixel */
+ pbSrc = g->apRows[g->nRows>>1] + (iSideOffset + iSrcOffset + 1);
+ *pbDest++ = *pbSrc++;
+ *pbDest++ = *pbSrc++;
+ }
+
+ iSrcOffset += g->iBytesPerPixel;
+ }
+}
+
+
+
+/*****************************************************************************\
+ *
+ * convolve_words - performs convolution on a row pixels with 16 or 48 bits each
+ *
+\*****************************************************************************/
+
+static void convolve_words (
+ PCONV_INST g, /* ptr to our instance variables */
+ PWORD pwDest) /* output buffer */
+{
+ PWORD pwSrc, pwDestAfter;
+ int iSrcOffset, iSideOffset, iSum;
+ int *pMatrix;
+ int row, col;
+
+ pwDestAfter = pwDest + (g->dwBytesPerRow>>1);
+ iSrcOffset = 0;
+ iSideOffset = g->traits.iComponentsPerPixel * (g->nCols>>1);
+
+ while (pwDest < pwDestAfter) /* for each output pixel ... */
+ {
+ iSum = 0;
+ pMatrix = g->matrix;
+
+ for (row=0; row<g->nRows; row++) {
+ pwSrc = (WORD*)(g->apRows[row]) + iSrcOffset;
+ for (col=0; col<g->nCols; col++) {
+ iSum += (*pMatrix++) * (int)(unsigned)(*pwSrc);
+ pwSrc += g->traits.iComponentsPerPixel;
+ }
+ }
+
+ iSum = (iSum + (g->iDivisor>>1)) / g->iDivisor;
+ if (iSum < 0) iSum = 0; else if (iSum > 0x00ffff) iSum = 0x00ffff;
+ *pwDest++ = (WORD)iSum;
+
+ if (g->traits.iComponentsPerPixel == 3) {
+ /* copy chrominance values from the center pixel to the output pixel */
+ pwSrc = (WORD*)(g->apRows[g->nRows>>1]) + (iSideOffset + iSrcOffset + 1);
+ *pwDest++ = *pwSrc++;
+ *pwDest++ = *pwSrc++;
+ }
+
+ iSrcOffset += g->traits.iComponentsPerPixel;
+ }
+}
+
+
+
+/*****************************************************************************\
+ *
+ * convolve_convert - Converts one row
+ *
+\*****************************************************************************/
+
+FUNC_STATUS WORD convolve_convert (
+ IP_XFORM_HANDLE hXform,
+ DWORD dwInputAvail, /* in: # avail bytes in in-buf */
+ PBYTE pbInputBuf, /* in: ptr to in-buffer */
+ PDWORD pdwInputUsed, /* out: # bytes used from in-buf */
+ PDWORD pdwInputNextPos, /* out: file-pos to read from next */
+ DWORD dwOutputAvail, /* in: # avail bytes in out-buf */
+ PBYTE pbOutputBuf, /* in: ptr to out-buffer */
+ PDWORD pdwOutputUsed, /* out: # bytes written in out-buf */
+ PDWORD pdwOutputThisPos) /* out: file-pos to write the data */
+{
+ PCONV_INST g;
+ WORD wFlags;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ *pdwInputUsed = *pdwOutputUsed = 0;
+ *pdwInputNextPos = g->dwInNextPos;
+ *pdwOutputThisPos = g->dwOutNextPos;
+ wFlags = 0;
+
+ /**** We'll always consume an input row, so update its vars ****/
+
+ if (pbInputBuf != NULL) {
+ INSURE (dwInputAvail >= g->dwBytesPerRow);
+ *pdwInputUsed = g->dwBytesPerRow;
+ g->dwInNextPos += g->dwBytesPerRow;
+ *pdwInputNextPos = g->dwInNextPos;
+ g->dwRowsRead += 1;
+ wFlags |= IP_CONSUMED_ROW | IP_READY_FOR_DATA;
+ }
+
+ /**** Fill the row-buffers ****/
+
+ if (g->nRowsFilled < g->nRows) { /* This is the initial fill */
+ INSURE (pbInputBuf != NULL); /* not allowed to flush now */
+ do {
+ IP_MEM_ALLOC (g->dwBytesPerRow + g->iBytesPerPixel*g->nCols,
+ g->apRows[g->nRowsFilled]);
+ CopyRow (g, pbInputBuf, g->apRows[g->nRowsFilled]);
+ g->nRowsFilled += 1;
+ } while (g->nRowsFilled < (g->nRows+1)/2);
+
+ if (g->nRowsFilled < g->nRows)
+ return wFlags; /* we're not done with initial fill */
+ } else {
+ /* rotate buffer-pointers, and copy new row to bottom row */
+ int i;
+ PBYTE pBottomRow;
+
+ if (pbInputBuf == NULL) {
+ /* flushing */
+ if (g->dwRowsRead == g->dwRowsWritten)
+ return IP_DONE;
+ pbInputBuf = g->apRows[g->nRows-1]; /* duplicate prior row */
+ }
+
+ pBottomRow = g->apRows[0]; /* new bottom row overwrites oldest top row */
+ for (i=1; i<g->nRows; i++)
+ g->apRows[i-1] = g->apRows[i];
+ g->apRows[g->nRows-1] = pBottomRow;
+
+ CopyRow (g, pbInputBuf, pBottomRow);
+ }
+
+ /**** Output a Row ****/
+
+ INSURE (dwOutputAvail >= g->dwBytesPerRow);
+
+ if (g->traits.iBitsPerPixel==8 || g->traits.iBitsPerPixel==24)
+ convolve_bytes (g, pbOutputBuf);
+ else
+ convolve_words (g, (WORD*)pbOutputBuf);
+
+ *pdwOutputUsed = g->dwBytesPerRow;
+ *pdwOutputThisPos = g->dwOutNextPos;
+ g->dwOutNextPos += g->dwBytesPerRow;
+ g->dwRowsWritten += 1;
+ wFlags |= IP_PRODUCED_ROW;
+
+ return wFlags;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * convolve_insertedData - client inserted into our output stream
+ *
+\*****************************************************************************/
+
+FUNC_STATUS WORD convolve_insertedData (
+ IP_XFORM_HANDLE hXform,
+ DWORD dwNumBytes)
+{
+ fatalBreakPoint ();
+ return IP_FATAL_ERROR; /* must never be called (can't insert data) */
+}
+
+
+
+/*****************************************************************************\
+ *
+ * convolve_newPage - Tells us to flush this page, and start a new page
+ *
+\*****************************************************************************/
+
+FUNC_STATUS WORD convolve_newPage (
+ IP_XFORM_HANDLE hXform)
+{
+ PCONV_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+ /* todo: return fatal error if convert is called again? */
+ return IP_DONE; /* can't insert page-breaks, so ignore this call */
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+
+}
+
+
+
+/*****************************************************************************\
+ *
+ * convolve_closeXform - Destroys this instance
+ *
+\*****************************************************************************/
+
+FUNC_STATUS WORD convolve_closeXform (IP_XFORM_HANDLE hXform)
+{
+ PCONV_INST g;
+ int i;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ /* free any rows that were allocated */
+ for (i=0; i<IP_CONVOLVE_MAXSIZE; i++)
+ if (g->apRows[i] != NULL)
+ IP_MEM_FREE (g->apRows[i]);
+
+ g->dwValidChk = 0;
+ IP_MEM_FREE (g); /* free memory for the instance */
+
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * convolveTbl - Jump-table for transform driver
+ *
+\*****************************************************************************/
+
+#ifdef EXPORT_TRANSFORM
+__declspec (dllexport)
+#endif
+IP_XFORM_TBL convolveTbl = {
+ convolve_openXform,
+ convolve_setDefaultInputTraits,
+ convolve_setXformSpec,
+ convolve_getHeaderBufSize,
+ convolve_getActualTraits,
+ convolve_getActualBufSizes,
+ convolve_convert,
+ convolve_newPage,
+ convolve_insertedData,
+ convolve_closeXform
+};
+
+/* End of File */
+
+
+/*****************************************************************************\
+ *
+ * ipGetXformTable - Returns pointer to the jump table
+ *
+\*****************************************************************************/
+
+#ifdef EXPORT_TRANSFORM
+EXPORT(WORD) ipGetXformTable (LPIP_XFORM_TBL pXform)
+{
+ WORD wRet = IP_DONE;
+
+ if (pXform)
+ *pXform = clrmapTbl;
+ else
+ wRet = IP_FATAL_ERROR;
+
+ return wRet;
+}
+#endif
diff --git a/ip/xcrop.c b/ip/xcrop.c
new file mode 100644
index 0000000..2613b98
--- /dev/null
+++ b/ip/xcrop.c
@@ -0,0 +1,470 @@
+/* libhpojip -- HP OfficeJet image-processing library. */
+
+/* Copyright (C) 1995-2002 Hewlett-Packard Company
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ * MA 02111-1307, USA.
+ *
+ * In addition, as a special exception, Hewlett-Packard Company
+ * gives permission to link the code of this program with any
+ * version of the OpenSSL library which is distributed under a
+ * license identical to that listed in the included LICENSE.OpenSSL
+ * file, and distribute linked combinations including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * this file, you may extend this exception to your version of the
+ * file, but you are not obligated to do so. If you do not wish to
+ * do so, delete this exception statement from your version.
+ */
+
+/* Original author: Mark Overton and others.
+ *
+ * Ported to Linux by David Paschal.
+ */
+
+/******************************************************************************\
+ *
+ * xcrop.c - Crops all four sides of the input image
+ *
+ ******************************************************************************
+ *
+ * Name of Global Jump-Table:
+ *
+ * cropTbl
+ *
+ * Items in aXformInfo array passed into setXformSpec:
+ *
+ * aXformInfo[IP_CROP_LEFT ] = left: # of pixels to remove from left side
+ * aXformInfo[IP_CROP_RIGHT ] = right: # of pixels to remove from right side
+ * aXformInfo[IP_CROP_TOP ] = top: # of rows to remove from top
+ * aXformInfo[IP_CROP_MAXOUTROWS] = maxOutRows: max # of rows to output
+ *
+ * Any (or even all) of the above values may be zero. If maxOutRows is
+ * zero, then an unlimited number of rows can be output.
+ *
+ * Capabilities and Limitations:
+ *
+ * Crops all four sides of the image.
+ * The image data must be fixed-length rows of uncompressed pixels.
+ * For bilevel data, the "left" value is changed to the nearest multiple
+ * of 8, and the "right" value is changed so the resulting row-width
+ * does not change.
+ * If all crop-amounts above are 0, this xform becomes merely a pass-thru.
+ *
+ * Default Input Traits, and Output Traits:
+ *
+ * trait default input output
+ * ------------------- --------------------- ------------------------
+ * iPixelsPerRow * used input width - horiz crop
+ * iBitsPerPixel * passed into output same as default input
+ * iComponentsPerPixel passed into output same as default input
+ * lHorizDPI passed into output same as default input
+ * lVertDPI passed into output same as default input
+ * lNumRows used if known output height, if input known
+ * iNumPages passed into output same as default input
+ * iPageNum passed into output same as default input
+ *
+ * Above, a "*" by an item indicates it must be valid (not negative).
+ *
+\******************************************************************************/
+
+#include "hpip.h"
+#include "ipdefs.h"
+#include "string.h" /* for memset and memcpy */
+
+
+#if 0
+ #include "stdio.h"
+ #include <tchar.h>
+
+ #define PRINT(msg,arg1,arg2) \
+ _ftprintf(stderr, msg, (int)arg1, (int)arg2)
+#else
+ #define PRINT(msg,arg1,arg2)
+#endif
+
+#define CHECK_VALUE 0x4ba1dace
+
+
+typedef struct {
+ IP_IMAGE_TRAITS traits; /* traits of the input image */
+ DWORD dwLeft, dwRight; /* # pixels to crop, left and right sides */
+ DWORD dwTop; /* # rows to crop from top */
+ DWORD dwMaxOutRows; /* max # rows to output */
+ DWORD dwInBytesPerRow; /* # bytes in each input row */
+ DWORD dwOutBytesPerRow; /* # bytes in each output row */
+ DWORD dwLeftCropBytes; /* # bytes to toss from left side of each row */
+ DWORD dwInRows; /* number of rows input so far */
+ DWORD dwOutRows; /* number of rows output so far */
+ DWORD dwInNextPos; /* file pos for subsequent input */
+ DWORD dwOutNextPos; /* file pos for subsequent output */
+ DWORD dwValidChk; /* struct validity check value */
+} CROP_INST, *PCROP_INST;
+
+
+
+/*****************************************************************************\
+ *
+ * crop_openXform - Creates a new instance of the transformer
+ *
+ *****************************************************************************
+ *
+ * This returns a handle for the new instance to be passed into
+ * all subsequent calls.
+ *
+ * Return value: IP_DONE=success; IP_FATAL_ERROR=misc error.
+ *
+\*****************************************************************************/
+
+static WORD crop_openXform (
+ IP_XFORM_HANDLE *pXform) /* out: returned handle */
+{
+ PCROP_INST g;
+
+ INSURE (pXform != NULL);
+ IP_MEM_ALLOC (sizeof(CROP_INST), g);
+ *pXform = g;
+ memset (g, 0, sizeof(CROP_INST));
+ g->dwValidChk = CHECK_VALUE;
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * crop_setDefaultInputTraits - Specifies default input image traits
+ *
+ *****************************************************************************
+ *
+ * The header of the file-type handled by the transform probably does
+ * not include *all* the image traits we'd like to know. Those not
+ * specified in the file-header are filled in from info provided by
+ * this routine.
+ *
+ * Return value: IP_DONE=success; IP_FATAL_ERROR=misc error.
+ *
+\*****************************************************************************/
+
+static WORD crop_setDefaultInputTraits (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ PIP_IMAGE_TRAITS pTraits) /* in: default image traits */
+{
+ PCROP_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ /* insure that traits we care about are known */
+ INSURE (pTraits->iPixelsPerRow>0 && pTraits->iBitsPerPixel>0);
+ g->traits = *pTraits; /* a structure copy */
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * crop_setXformSpec - Provides xform-specific information
+ *
+\*****************************************************************************/
+
+static WORD crop_setXformSpec (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD_OR_PVOID aXformInfo[]) /* in: xform information */
+{
+ PCROP_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ g->dwLeft = aXformInfo[IP_CROP_LEFT].dword;
+ g->dwRight = aXformInfo[IP_CROP_RIGHT].dword;
+ g->dwTop = aXformInfo[IP_CROP_TOP].dword;
+ g->dwMaxOutRows = aXformInfo[IP_CROP_MAXOUTROWS].dword;
+
+ if (g->dwMaxOutRows == 0)
+ g->dwMaxOutRows = 0x7ffffffful; /* 0 -> infinite */
+
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * crop_getHeaderBufSize- Returns size of input buf needed to hold header
+ *
+\*****************************************************************************/
+
+static WORD crop_getHeaderBufSize (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD *pdwInBufLen) /* out: buf size for parsing header */
+{
+ /* since input is raw pixels, there is no header, so set it to zero */
+ *pdwInBufLen = 0;
+ return IP_DONE;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * crop_getActualTraits - Parses header, and returns input & output traits
+ *
+\*****************************************************************************/
+
+static WORD crop_getActualTraits (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD dwInputAvail, /* in: # avail bytes in input buf */
+ PBYTE pbInputBuf, /* in: ptr to input buffer */
+ PDWORD pdwInputUsed, /* out: # bytes used from input buf */
+ PDWORD pdwInputNextPos,/* out: file-pos to read from next */
+ PIP_IMAGE_TRAITS pInTraits, /* out: input image traits */
+ PIP_IMAGE_TRAITS pOutTraits) /* out: output image traits */
+{
+ PCROP_INST g;
+ int left, right, shift;
+ int inWidth, outWidth;
+ int bpp;
+ long actualOut, maxOut;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ /* Since there is no header, we'll report no usage of input */
+
+ *pdwInputUsed = 0;
+ *pdwInputNextPos = 0;
+
+ /* Compute the crop info */
+
+ bpp = g->traits.iBitsPerPixel;
+ left = g->dwLeft;
+ right = g->dwRight;
+ inWidth = g->traits.iPixelsPerRow;
+ outWidth = inWidth - left - right;
+ INSURE (outWidth >= 0);
+
+ if (bpp == 1) {
+ /* shift to start at nearest byte boundary */
+ shift = ((left+4) & ~7) - left;
+ left += shift; /* this is now a multiple of 8 */
+ right += shift;
+ }
+
+ g->dwInBytesPerRow = (bpp*inWidth + 7) / 8;
+ g->dwOutBytesPerRow = (bpp*outWidth + 7) / 8;
+ g->dwLeftCropBytes = (bpp*left + 7) / 8;
+
+ /* Report the traits */
+
+ *pInTraits = g->traits; /* structure copies */
+ *pOutTraits = g->traits;
+ pOutTraits->iPixelsPerRow = outWidth;
+
+ /* compute the output lNumRows, if possible */
+ if (pInTraits->lNumRows > 0) {
+ maxOut = g->dwMaxOutRows;
+ actualOut = pInTraits->lNumRows - (long)g->dwTop;
+ INSURE (actualOut >= 0);
+ pOutTraits->lNumRows = actualOut<maxOut ? actualOut : maxOut;
+ }
+
+ return IP_DONE | IP_READY_FOR_DATA;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/****************************************************************************\
+ *
+ * crop_getActualBufSizes - Returns buf sizes needed for remainder of job
+ *
+\****************************************************************************/
+
+static WORD crop_getActualBufSizes (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ PDWORD pdwMinInBufLen, /* out: min input buf size */
+ PDWORD pdwMinOutBufLen) /* out: min output buf size */
+{
+ PCROP_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ *pdwMinInBufLen = g->dwInBytesPerRow;
+ *pdwMinOutBufLen = g->dwOutBytesPerRow;
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * crop_convert - Converts one row
+ *
+\*****************************************************************************/
+
+static WORD crop_convert (
+ IP_XFORM_HANDLE hXform,
+ DWORD dwInputAvail, /* in: # avail bytes in in-buf */
+ PBYTE pbInputBuf, /* in: ptr to in-buffer */
+ PDWORD pdwInputUsed, /* out: # bytes used from in-buf */
+ PDWORD pdwInputNextPos, /* out: file-pos to read from next */
+ DWORD dwOutputAvail, /* in: # avail bytes in out-buf */
+ PBYTE pbOutputBuf, /* in: ptr to out-buffer */
+ PDWORD pdwOutputUsed, /* out: # bytes written in out-buf */
+ PDWORD pdwOutputThisPos) /* out: file-pos to write the data */
+{
+ PCROP_INST g;
+ DWORD dwOutBytes;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ /**** Check if we were told to flush ****/
+
+ if (pbInputBuf == NULL) {
+ PRINT (_T("crop_convert: Told to flush.\n"), 0, 0);
+ *pdwInputUsed = *pdwOutputUsed = 0;
+ *pdwInputNextPos = g->dwInNextPos;
+ *pdwOutputThisPos = g->dwOutNextPos;
+ return IP_DONE;
+ }
+
+ /**** Check if we should discard the row (vertical cropping) ****/
+
+ dwOutBytes = (g->dwInRows < g->dwTop || g->dwOutRows >= g->dwMaxOutRows)
+ ? 0 : g->dwOutBytesPerRow;
+
+ /**** Output a Row ****/
+
+ INSURE (dwInputAvail >= g->dwInBytesPerRow);
+ INSURE (dwOutputAvail >= dwOutBytes);
+
+ if (dwOutBytes > 0) {
+ memcpy (pbOutputBuf, pbInputBuf+g->dwLeftCropBytes, dwOutBytes);
+ g->dwOutRows += 1;
+ }
+
+ g->dwInRows += 1;
+
+ *pdwInputUsed = g->dwInBytesPerRow;
+ g->dwInNextPos += g->dwInBytesPerRow;
+ *pdwInputNextPos = g->dwInNextPos;
+
+ *pdwOutputUsed = dwOutBytes;
+ *pdwOutputThisPos = g->dwOutNextPos;
+ g->dwOutNextPos += dwOutBytes;
+
+ return IP_CONSUMED_ROW | IP_PRODUCED_ROW | IP_READY_FOR_DATA;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * crop_insertedData - client inserted into our output stream
+ *
+\*****************************************************************************/
+
+static WORD crop_insertedData (
+ IP_XFORM_HANDLE hXform,
+ DWORD dwNumBytes)
+{
+ fatalBreakPoint ();
+ return IP_FATAL_ERROR; /* must never be called (can't insert data) */
+}
+
+
+
+/*****************************************************************************\
+ *
+ * crop_newPage - Tells us to flush this page, and start a new page
+ *
+\*****************************************************************************/
+
+static WORD crop_newPage (
+ IP_XFORM_HANDLE hXform)
+{
+ PCROP_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+ /* todo: return fatal error if convert is called again? */
+ return IP_DONE; /* can't insert page-breaks, so ignore this call */
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+
+}
+
+
+
+/*****************************************************************************\
+ *
+ * crop_closeXform - Destroys this instance
+ *
+\*****************************************************************************/
+
+static WORD crop_closeXform (IP_XFORM_HANDLE hXform)
+{
+ PCROP_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ g->dwValidChk = 0;
+ IP_MEM_FREE (g); /* free memory for the instance */
+
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * cropTbl - Jump-table for transform driver
+ *
+\*****************************************************************************/
+
+IP_XFORM_TBL cropTbl = {
+ crop_openXform,
+ crop_setDefaultInputTraits,
+ crop_setXformSpec,
+ crop_getHeaderBufSize,
+ crop_getActualTraits,
+ crop_getActualBufSizes,
+ crop_convert,
+ crop_newPage,
+ crop_insertedData,
+ crop_closeXform
+};
+
+/* End of File */
diff --git a/ip/xfakemono.c b/ip/xfakemono.c
new file mode 100644
index 0000000..e21a862
--- /dev/null
+++ b/ip/xfakemono.c
@@ -0,0 +1,465 @@
+/* libhpojip -- HP OfficeJet image-processing library. */
+
+/* Copyright (C) 1995-2002 Hewlett-Packard Company
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ * MA 02111-1307, USA.
+ *
+ * In addition, as a special exception, Hewlett-Packard Company
+ * gives permission to link the code of this program with any
+ * version of the OpenSSL library which is distributed under a
+ * license identical to that listed in the included LICENSE.OpenSSL
+ * file, and distribute linked combinations including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * this file, you may extend this exception to your version of the
+ * file, but you are not obligated to do so. If you do not wish to
+ * do so, delete this exception statement from your version.
+ */
+
+/* Original author: Mark Overton and others.
+ *
+ * Ported to Linux by David Paschal.
+ */
+
+/******************************************************************************\
+ *
+ * xfakemono.c - Simulates grayscale or bilevel in 24-bit data.
+ *
+ ******************************************************************************
+ *
+ * Name of Global Jump-Table:
+ *
+ * fakeMonoTbl
+ *
+ * Items in aXformInfo array passed into setXformSpec:
+ *
+ * aXformInfo[IP_FAKE_MONO_BPP] = 8 or 1, to simulate grayscale or mono
+ *
+ * Capabilities and Limitations:
+ *
+ * The input and output image are 24-bits per pixel. But the output image
+ * will *appear* to be grayscale if aXformInfo[0] == 8, or bilevel if it == 1.
+ *
+ * Default Input Traits, and Output Traits:
+ *
+ * trait default input output
+ * ------------------- --------------------- ------------------------
+ * iPixelsPerRow * passed into output same as default input
+ * iBitsPerPixel * must be 24 24
+ * iComponentsPerPixel * must be 3 3
+ * lHorizDPI passed into output same as default input
+ * lVertDPI passed into output same as default input
+ * lNumRows passed into output same as default input
+ * iNumPages passed into output same as default input
+ * iPageNum passed into output same as default input
+ *
+ * Above, a "*" by an item indicates it must be valid (not negative).
+ *
+\******************************************************************************/
+
+// Use the #define below if this transform will exist in a dll outside of the
+// image pipeline. This will allow the functions to be exported.
+// #define EXPORT_TRANFORM 1
+
+#include "hpip.h"
+#include "ipdefs.h"
+#include "string.h" /* for memset and memcpy */
+
+
+#if 0
+ #include "stdio.h"
+ #include <tchar.h>
+ #define PRINT(msg,arg1,arg2) \
+ _ftprintf(stderr, msg, (int)arg1, (int)arg2)
+#else
+ #define PRINT(msg,arg1,arg2)
+#endif
+
+#define CHECK_VALUE 0x4ba1dace
+
+#ifdef EXPORT_TRANSFORM
+#define FUNC_STATUS __declspec (dllexport)
+#else
+#define FUNC_STATUS static
+#endif
+
+typedef struct {
+ IP_IMAGE_TRAITS traits; /* traits of the input and output image */
+ int iFakeDPI; /* dpi to fake (8 or 1) */
+ DWORD dwBytesPerRow; /* # of bytes in each row */
+ DWORD dwRowsDone; /* number of rows converted so far */
+ DWORD dwInNextPos; /* file pos for subsequent input */
+ DWORD dwOutNextPos; /* file pos for subsequent output */
+ DWORD dwValidChk; /* struct validity check value */
+} FMON_INST, *PFMON_INST;
+
+
+
+/*****************************************************************************\
+ *
+ * fakeMono_openXform - Creates a new instance of the transformer
+ *
+ *****************************************************************************
+ *
+ * This returns a handle for the new instance to be passed into
+ * all subsequent calls.
+ *
+ * Return value: IP_DONE=success; IP_FATAL_ERROR=misc error.
+ *
+\*****************************************************************************/
+
+FUNC_STATUS WORD fakeMono_openXform (
+ IP_XFORM_HANDLE *pXform) /* out: returned handle */
+{
+ PFMON_INST g;
+
+ INSURE (pXform != NULL);
+ IP_MEM_ALLOC (sizeof(FMON_INST), g);
+ *pXform = g;
+ memset (g, 0, sizeof(FMON_INST));
+ g->dwValidChk = CHECK_VALUE;
+ g->iFakeDPI = 8;
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * fakeMono_setDefaultInputTraits - Specifies default input image traits
+ *
+ *****************************************************************************
+ *
+ * The header of the file-type handled by the transform probably does
+ * not include *all* the image traits we'd like to know. Those not
+ * specified in the file-header are filled in from info provided by
+ * this routine.
+ *
+ * Return value: IP_DONE=success; IP_FATAL_ERROR=misc error.
+ *
+\*****************************************************************************/
+
+FUNC_STATUS WORD fakeMono_setDefaultInputTraits (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ PIP_IMAGE_TRAITS pTraits) /* in: default image traits */
+{
+ PFMON_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ /* insure that traits we care about are known */
+ INSURE (pTraits->iPixelsPerRow > 0 &&
+ pTraits->iBitsPerPixel == 24 &&
+ pTraits->iComponentsPerPixel == 3);
+
+ g->traits = *pTraits; /* a structure copy */
+ g->dwBytesPerRow = (g->traits.iPixelsPerRow*g->traits.iBitsPerPixel + 7) / 8;
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * fakeMono_setXformSpec - Provides xform-specific information
+ *
+\*****************************************************************************/
+
+FUNC_STATUS WORD fakeMono_setXformSpec (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD_OR_PVOID aXformInfo[]) /* in: xform information */
+{
+ PFMON_INST g;
+ HANDLE_TO_PTR (hXform, g);
+ g->iFakeDPI = aXformInfo[IP_FAKE_MONO_BPP].dword;
+ INSURE (g->iFakeDPI==1 || g->iFakeDPI==8);
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * fakeMono_getHeaderBufSize- Returns size of input buf needed to hold header
+ *
+\*****************************************************************************/
+
+FUNC_STATUS WORD fakeMono_getHeaderBufSize (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD *pdwInBufLen) /* out: buf size for parsing header */
+{
+ /* since input is raw pixels, there is no header, so set it to zero */
+ *pdwInBufLen = 0;
+ return IP_DONE;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * fakeMono_getActualTraits - Parses header, and returns input & output traits
+ *
+\*****************************************************************************/
+
+FUNC_STATUS WORD fakeMono_getActualTraits (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD dwInputAvail, /* in: # avail bytes in input buf */
+ PBYTE pbInputBuf, /* in: ptr to input buffer */
+ PDWORD pdwInputUsed, /* out: # bytes used from input buf */
+ PDWORD pdwInputNextPos,/* out: file-pos to read from next */
+ PIP_IMAGE_TRAITS pIntraits, /* out: input image traits */
+ PIP_IMAGE_TRAITS pOutTraits) /* out: output image traits */
+{
+ PFMON_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ /* Since there is no header, we'll report no usage of input */
+ *pdwInputUsed = 0;
+ *pdwInputNextPos = 0;
+
+ *pIntraits = g->traits; /* structure copies */
+ *pOutTraits = g->traits;
+
+ return IP_DONE | IP_READY_FOR_DATA;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/****************************************************************************\
+ *
+ * fakeMono_getActualBufSizes - Returns buf sizes needed for remainder of job
+ *
+\****************************************************************************/
+
+FUNC_STATUS WORD fakeMono_getActualBufSizes (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ PDWORD pdwMinInBufLen, /* out: min input buf size */
+ PDWORD pdwMinOutBufLen) /* out: min output buf size */
+{
+ PFMON_INST g;
+ HANDLE_TO_PTR (hXform, g);
+ *pdwMinInBufLen = *pdwMinOutBufLen = g->dwBytesPerRow;
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * fakeMono_convert - Converts one row
+ *
+\*****************************************************************************/
+
+FUNC_STATUS WORD fakeMono_convert (
+ IP_XFORM_HANDLE hXform,
+ DWORD dwInputAvail, /* in: # avail bytes in in-buf */
+ PBYTE pbInputBuf, /* in: ptr to in-buffer */
+ PDWORD pdwInputUsed, /* out: # bytes used from in-buf */
+ PDWORD pdwInputNextPos, /* out: file-pos to read from next */
+ DWORD dwOutputAvail, /* in: # avail bytes in out-buf */
+ PBYTE pbOutputBuf, /* in: ptr to out-buffer */
+ PDWORD pdwOutputUsed, /* out: # bytes written in out-buf */
+ PDWORD pdwOutputThisPos) /* out: file-pos to write the data */
+{
+ PFMON_INST g;
+ int nBytes;
+ PBYTE pIn, pInAfter, pOut;
+ unsigned rv, gv, bv;
+ int gray;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ /**** Check if we were told to flush ****/
+
+ if (pbInputBuf == NULL) {
+ PRINT (_T("fakeMono_convert: Told to flush.\n"), 0, 0);
+ *pdwInputUsed = *pdwOutputUsed = 0;
+ *pdwInputNextPos = g->dwInNextPos;
+ *pdwOutputThisPos = g->dwOutNextPos;
+ return IP_DONE;
+ }
+
+ /**** Output a Row ****/
+
+ nBytes = g->dwBytesPerRow;
+ INSURE (dwInputAvail >= (DWORD)nBytes );
+ INSURE (dwOutputAvail >= (DWORD)nBytes);
+
+ pIn = pbInputBuf;
+ pOut = pbOutputBuf;
+ pInAfter = pIn + nBytes;
+
+ if (g->iFakeDPI == 1) { // faking bi-level
+ while (pIn < pInAfter) {
+ rv = *pIn++;
+ gv = *pIn++;
+ bv = *pIn++;
+ gray = NTSC_LUMINANCE (rv, gv, bv);
+ gray = (gray >= 128) ? 255 : 0;
+ *pOut++ = (BYTE)gray;
+ *pOut++ = (BYTE)gray;
+ *pOut++ = (BYTE)gray;
+ }
+ } else { // faking grayscale
+ while (pIn < pInAfter) {
+ rv = *pIn++;
+ gv = *pIn++;
+ bv = *pIn++;
+ gray = NTSC_LUMINANCE (rv, gv, bv);
+ *pOut++ = (BYTE)gray;
+ *pOut++ = (BYTE)gray;
+ *pOut++ = (BYTE)gray;
+ }
+ }
+
+ *pdwInputUsed = nBytes;
+ g->dwInNextPos += nBytes;
+ *pdwInputNextPos = g->dwInNextPos;
+
+ *pdwOutputUsed = nBytes;
+ *pdwOutputThisPos = g->dwOutNextPos;
+ g->dwOutNextPos += nBytes;
+
+ g->dwRowsDone += 1;
+
+ return IP_CONSUMED_ROW | IP_PRODUCED_ROW | IP_READY_FOR_DATA;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * fakeMono_insertedData - client inserted into our output stream
+ *
+\*****************************************************************************/
+
+FUNC_STATUS WORD fakeMono_insertedData (
+ IP_XFORM_HANDLE hXform,
+ DWORD dwNumBytes)
+{
+ fatalBreakPoint ();
+ return IP_FATAL_ERROR; /* must never be called (can't insert data) */
+}
+
+
+
+/*****************************************************************************\
+ *
+ * fakeMono_newPage - Tells us to flush this page, and start a new page
+ *
+\*****************************************************************************/
+
+FUNC_STATUS WORD fakeMono_newPage (
+ IP_XFORM_HANDLE hXform)
+{
+ PFMON_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+ /* todo: return fatal error if convert is called again? */
+ return IP_DONE; /* can't insert page-breaks, so ignore this call */
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+
+}
+
+
+
+/*****************************************************************************\
+ *
+ * fakeMono_closeXform - Destroys this instance
+ *
+\*****************************************************************************/
+
+FUNC_STATUS WORD fakeMono_closeXform (IP_XFORM_HANDLE hXform)
+{
+ PFMON_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ g->dwValidChk = 0;
+ IP_MEM_FREE (g); /* free memory for the instance */
+
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * fakeMonoTbl - Jump-table for transform driver
+ *
+\*****************************************************************************/
+#ifdef EXPORT_TRANSFORM
+__declspec (dllexport)
+#endif
+IP_XFORM_TBL fakeMonoTbl = {
+ fakeMono_openXform,
+ fakeMono_setDefaultInputTraits,
+ fakeMono_setXformSpec,
+ fakeMono_getHeaderBufSize,
+ fakeMono_getActualTraits,
+ fakeMono_getActualBufSizes,
+ fakeMono_convert,
+ fakeMono_newPage,
+ fakeMono_insertedData,
+ fakeMono_closeXform
+};
+
+/* End of File */
+
+
+/*****************************************************************************\
+ *
+ * ipGetXformTable - Returns pointer to the jump table
+ *
+\*****************************************************************************/
+
+#ifdef EXPORT_TRANSFORM
+EXPORT(WORD) ipGetXformTable (LPIP_XFORM_TBL pXform)
+{
+ WORD wRet = IP_DONE;
+
+ if (pXform)
+ *pXform = clrmapTbl;
+ else
+ wRet = IP_FATAL_ERROR;
+
+ return wRet;
+}
+#endif
diff --git a/ip/xfax.c b/ip/xfax.c
new file mode 100644
index 0000000..1c23de9
--- /dev/null
+++ b/ip/xfax.c
@@ -0,0 +1,3566 @@
+/* libhpojip -- HP OfficeJet image-processing library. */
+
+/* Copyright (C) 1995-2002 Hewlett-Packard Company
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ * MA 02111-1307, USA.
+ *
+ * In addition, as a special exception, Hewlett-Packard Company
+ * gives permission to link the code of this program with any
+ * version of the OpenSSL library which is distributed under a
+ * license identical to that listed in the included LICENSE.OpenSSL
+ * file, and distribute linked combinations including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * this file, you may extend this exception to your version of the
+ * file, but you are not obligated to do so. If you do not wish to
+ * do so, delete this exception statement from your version.
+ */
+
+/* Original author: Mark Overton and others.
+ *
+ * Ported to Linux by David Paschal.
+ */
+
+/*****************************************************************************\
+ *
+ * xfax.c - encoder and decoder for fax data (MH, MR and MMR)
+ *
+ *****************************************************************************
+ *
+ * Name of Global Jump-Table:
+ *
+ * faxEncodeTbl = the encoder,
+ * faxDecodeTbl = the decoder.
+ *
+ * Items in aXformInfo array passed into setXformSpec:
+ *
+ * aXformInfo[IP_FAX_FORMAT]: Format of data (both encoder & decoder).
+ * Values are: IP_FAX_MH, IP_FAX_MR, IP_FAX_MMR.
+ *
+ * aXformInfo[IP_FAX_NO_EOLS]: No EOLs in the data?
+ * 0 = EOLs are in data as usual;
+ * 1 = no EOLs in data.
+ * This tells the encoder whether to output EOLs.
+ * This tells the decoder if there are EOLs in the data.
+ *
+ * aXformInfo[IP_FAX_MIN_ROW_LEN]: Minimum # bits to put in each output row
+ * (MH & MR only).
+ * Only the encoder needs this, and guarantees that each
+ * row it outputs contains at least this many bits. It
+ * inserts fill 0's as needed. The fax standard needs
+ * this to insure that a row consumes a minimum amout of
+ * time when sent over the modem, hence there's a minimum
+ * number of bits to be transmitted per row.
+ *
+ * Capabilities and Limitations:
+ *
+ * Bits per pixel must be 1 (bi-level only).
+ * Encodes and decodes MH, MR and MMR per the fax standard.
+ * Encoding MR uses a k-factor of 2 if vert dpi < 150, else k-factor is 4.
+ * If an error occurs in MH or MR data, the previous good row is returned.
+ *
+ * Default Input Traits, and Output Traits:
+ *
+ * For both encoder and decoder:
+ *
+ * trait default input output
+ * ------------------- ------------------- ------------------------
+ * iPixelsPerRow * passed into output same as default input
+ * iBitsPerPixel * must be 1 1
+ * iComponentsPerPixel passed into output same as default input
+ * lHorizDPI passed into output same as default input
+ * lVertDPI passed into output same as default input
+ * lNumRows passed into output same as default input
+ * iNumPages passed into output same as default input
+ * iPageNum passed into output same as default input
+ *
+ * Above, a "*" by an item indicates it must be valid (not negative).
+ *
+ * Mark Overton, Jan 1998
+ *
+\*****************************************************************************/
+
+#include "hpip.h"
+#include "ipdefs.h"
+#include "string.h" /* for memset and memcpy */
+#include "assert.h" /* todo: eliminate all asserts */
+
+
+#if 0
+ #include "stdio.h"
+ #include <tchar.h>
+
+ #define PRINT(msg,arg1,arg2) \
+ _ftprintf(stdout, msg, (int)arg1, (int)arg2)
+#else
+ #define PRINT(msg,arg1,arg2)
+#endif
+
+#define CHECK_VALUE 0x1ce5ca7e
+
+
+
+
+/*
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+@@ @@
+@@ @@
+@@ U T I L I T I E S @@
+@@ @@
+@@ @@
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+*/
+
+
+/* baLeftZeroesTbl returns number of leading zeroes in byte index */
+
+static const BYTE baLeftZeroesTbl[256] =
+{
+ 8, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+};
+
+
+/* baRightZeroesTbl returns number of trailing zeroes in byte index */
+
+static const BYTE baRightZeroesTbl[256] =
+{
+ 8, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
+ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
+ 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
+ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
+ 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
+ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
+ 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
+ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
+ 7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
+ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
+ 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
+ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
+ 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
+ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
+ 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
+ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0
+};
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | scan_to | Scan pixels rightward until hitting desired color (white/black) |
+ |_________|__________________________________________________________________|
+ | |
+ | Pos, the initial search position, must not be negative nor greater than |
+ | pixels_in_row+1. This function will not return a value greater than |
+ | pixels_in_row. |
+ | |
+ | WARNING: Before calling this routine, the first byte after the end of the |
+ | buffer must be set to alternating zeroes and ones (such as 0x55).|
+ | This allows us to scan bytes for a pixel-change without doing |
+ | the end-of-buffer boundary-check. |
+ | |
+ | Function return value: index of first pixel of desired color. |
+ |____________________________________________________________________________|
+*/
+static int scan_to (
+ UINT skip, /* color to skip over (FF=black, 00=white) */
+ BYTE *buf_p, /* buffer in which to search */
+ int start_pos, /* start-index for search (0=leftmost pixel in buf) */
+ int pixels_in_row) /* # pixels in the buffer */
+{
+ /**************************************************************************
+ *
+ * PERFORMANCE NOTE
+ *
+ * This routine skips all-white and all-black areas a *byte* at a time
+ * using a three-instruction loop. The old routine did this a *word*
+ * (2 bytes) at a time using a three-instruction loop. But this routine
+ * results in faster G3/G4 encoding/decoding, even for mostly white areas,
+ * because it has so little overhead outside the loop. Also, its small
+ * size doesn't toss as much other G3/G4 code out of the cache, improving
+ * performance even more.
+ *
+ * Seconds to MMR encode+decode 1000 rows of 1728 pixels (bench_fax.c):
+ *
+ * black density: 0% 10% 20% 50%
+ * old routine: 2.1 10.2 18.8 45.1
+ * this routine: 2.2 7.4 12.8 29.9
+ * inlining this routine: 2.2 7.9 13.8 32.4
+ *
+ * Inlining this routine *hurt* performance a little because more MMR
+ * code was kicked out of the cache.
+ *
+ *************************************************************************/
+
+ BYTE *cur_p;
+ UINT byte_mask;
+ UINT byte;
+ int pos;
+
+ byte_mask = 0x00FFu;
+ cur_p = buf_p + (start_pos >> 3);
+ skip &= byte_mask;
+ byte = (*cur_p ^ skip) & (byte_mask >> (start_pos & 7));
+
+ if (byte == 0) {
+ do {
+ cur_p += 1;
+ byte = *cur_p;
+ } while (byte == skip);
+ byte ^= skip;
+ }
+
+ pos = ((cur_p-buf_p)<<3) + baLeftZeroesTbl[byte];
+
+ if (pos > pixels_in_row)
+ pos = pixels_in_row;
+ return pos;
+}
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | worst_buf_size | calculates worst buffer-usage for a compressed row |
+ |________________|___________________________________________________________|
+*/
+/* worst-case failure of compression (which is expansion) */
+#define WORST_EXPAND_1D (9<<1) /* = 4.5 in 14.2 fixed-point */
+#define WORST_EXPAND_2D (6<<2) /* = 6.0 in 14.2 fixed-point */
+
+static int worst_buf_size (
+ WORD wFmt, /* fax format (IP_FAX_MH/MR/MMR) */
+ int iRowWidth) /* width of each row of bitmap (# pixels) */
+{
+ return ( ( (wFmt==IP_FAX_MH ? WORST_EXPAND_1D : WORST_EXPAND_2D)
+ * ((iRowWidth+7)/8)
+ ) >> 2
+ ) + 4;
+}
+
+
+
+/*
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+@@ @@
+@@ @@
+@@ E N C O D E R @@
+@@ @@
+@@ @@
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+*/
+
+
+/* ENC_INST - our instance variables */
+
+typedef struct {
+ IP_IMAGE_TRAITS traits; /* traits of the image */
+ DWORD dwValidChk; /* struct validity check value */
+ DWORD dwInNextPos; /* file pos for subsequent input */
+ DWORD dwOutNextPos; /* file pos for subsequent output */
+ int iRowLen; /* # pixels in each uncompressed input row */
+ BYTE wOutFmt; /* output format (IP_FAX_MH/FAX_MR/FAX_MMR) */
+ BOOL fNoEOLs; /* don't output any EOLs? */
+ UINT w12Cycle; /* (MR only) # rows in [1d,2d,2d...] cycle */
+ UINT wMinBits; /* minimum # bits to output in each row */
+ int iRowNum; /* current row-number of output, 0 is first */
+ BYTE *prior_p; /* (MR/MMR only) the prior row */
+
+ /* Variables for "Outputting Bits" section */
+ BYTE *pbBufStart; /* beginning of output buffer */
+ BYTE *pbOutByte; /* current byte in output buffer */
+ DWORD dwBitBuffer; /* buffer of bits (to be written to pbOutByte) */
+ UINT wBitsAvail; /* # of unused bits in dwBitBuffer */
+} ENC_INST, *PENC_INST;
+
+
+
+/*****************************************************************************
+ * *
+ * O U T P U T T I N G B I T S *
+ * *
+ *****************************************************************************
+
+
+Interface into this section:
+ put_init - initializes this section
+ put_bits - outputs a variable-number of bits (buffered)
+ put_fill_bits - Outputs fill bits (if necessary) to reach the minimum
+ put_grab - gives all bytes except the partial one to caller
+ put_new_buf - tells us to use a new buffer (after put_grab was called)
+ put_done - writes any remaining bits in the buffer
+*/
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | put_init | Initializes this 'put' section |
+ |__________|_________________________________________________________________|
+*/
+static void put_init (
+ ENC_INST *g,
+ BYTE *pbOutBuf)
+{
+ g->dwBitBuffer = 0;
+ g->wBitsAvail = 32;
+ g->pbOutByte = pbOutBuf;
+ g->pbBufStart = pbOutBuf;
+}
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | put_bits | Outputs (buffered) the low-order 'length' bits in 'bits' |
+ |__________|_________________________________________________________________|
+ | |
+ | 'length' must be no larger than 25. |
+ | The bits in 'bits' that are not to be written must be zeroes. |
+ | |
+ | This routine lets dwBitBuffer fill up until data won't fit. Then it |
+ | writes out as many bytes as possible from the buffer in a loop. I |
+ | did it this way so the byte-write code would be in cache for more of |
+ | the writes, and so 'write_bytes' will be called as seldom as possible. |
+ |____________________________________________________________________________|
+*/
+
+static void write_bytes (ENC_INST *g)
+{
+ /* PERFORMANCE NOTE: inlining this routine slows down the encoder
+ * due to worse cache usage.
+ */
+ BYTE *byte_p;
+ DWORD bitbuf;
+ UINT bitsavail;
+
+ /* assert (g->wBitsAvail <= 24); */
+ byte_p = g->pbOutByte;
+ bitbuf = g->dwBitBuffer;
+ bitsavail = g->wBitsAvail;
+
+ do {
+ *byte_p++ = (BYTE )(bitbuf >> 24);
+ bitbuf <<= 8;
+ bitsavail += 8;
+ } while (bitsavail <= 24);
+
+ g->pbOutByte = byte_p;
+ g->dwBitBuffer = bitbuf;;
+ g->wBitsAvail = bitsavail;
+}
+
+
+#define put_bits(g, length_par, bits_par) \
+do { \
+ UINT length_loc = length_par; \
+ DWORD bits_loc = bits_par; \
+ \
+ if (length_loc > g->wBitsAvail) \
+ write_bytes (g); \
+ \
+ g->wBitsAvail -= length_loc; \
+ g->dwBitBuffer |= bits_loc << g->wBitsAvail; \
+} while (0)
+
+
+static void put_bits_routine (
+ ENC_INST *g,
+ UINT length,
+ DWORD bits)
+{
+ put_bits (g, length, bits);
+}
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | put_flush | Writes out all bytes containing any data in dwBitBuffer |
+ |___________|________________________________________________________________|
+*/
+static void put_flush (ENC_INST *g)
+{
+ if (g->wBitsAvail < 32) {
+ g->wBitsAvail &= ~7ul; /* reduce to a multiple of 8 (byte-boundary) */
+ write_bytes (g);
+ }
+
+ assert (g->wBitsAvail == 32);
+}
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | put_fill_bits | Outputs fill bits (if necessary) to reach the minimum |
+ |_______________|____________________________________________________________|
+ | |
+ | We want put_grab to return the minimum # of bits, but it returns an |
+ | array of bytes (not bits). So this routine insures that at least |
+ | the minimum # of bits have been written (as bytes) into the output |
+ | buffer. |
+ |____________________________________________________________________________|
+*/
+static void put_fill_bits (ENC_INST *g)
+{
+ int iMore;
+
+ put_flush (g);
+
+ /* write out zero-bytes until we're at (or past) the minimum # bits */
+
+ iMore = (int)g->wMinBits - 8*(g->pbOutByte - g->pbBufStart);
+ if (iMore > 0) {
+ iMore = (iMore+7) / 8;
+ memset (g->pbOutByte, 0, iMore);
+ g->pbOutByte += iMore;
+ }
+}
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | put_grab | Returns # of bytes written so far, and restarts at buffer-start |
+ |__________|_________________________________________________________________|
+ | |
+ | The caller is expected to copy N bytes from the buffer, where N is the |
+ | number this function returns. |
+ |____________________________________________________________________________|
+*/
+static int put_grab (ENC_INST *g)
+{
+ int n;
+
+ n = g->pbOutByte - g->pbBufStart;
+ g->pbOutByte = g->pbBufStart; /* next byte goes into beginning of buffer */
+ return n;
+}
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | put_new_buf | Use a new buffer (must be called after put_grab) |
+ |_____________|______________________________________________________________|
+*/
+static void put_new_buf (
+ ENC_INST *g,
+ BYTE *pbOutBuf)
+{
+ assert (g->pbOutByte == g->pbBufStart);
+ g->pbOutByte = pbOutBuf;
+ g->pbBufStart = pbOutBuf;
+}
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | put_done | Writes any buffered bits, and returns total # of bytes written |
+ |__________|_________________________________________________________________|
+*/
+static int put_done (
+ ENC_INST *g)
+{
+ put_flush (g);
+ return g->pbOutByte - g->pbBufStart;
+}
+
+
+
+/*
+ *****************************************************************************
+ * *
+ * E N C O D I N G R O W S *
+ * *
+ *****************************************************************************
+
+
+Interface into this section:
+ encode_row_1d - compresses a row into 1-dim format for MH and MR
+ encode_row_2d - compresses a row into 2-dim format for MR and MMR
+*/
+
+
+
+/* Structure for storing G3 codes */
+
+typedef struct {
+ USHORT bits;
+ USHORT length;
+} huff_t;
+
+
+/* run-length = index, index is in 0..63 */
+static const huff_t MHWhiteRuns[] = {
+ {0x35, 8}, {0x7, 6}, {0x7, 4}, {0x8, 4},
+ {0xb, 4}, {0xc, 4}, {0xe, 4}, {0xf, 4},
+ {0x13, 5}, {0x14, 5}, {0x7, 5}, {0x8, 5},
+ {0x8, 6}, {0x3, 6}, {0x34, 6}, {0x35, 6},
+ {0x2a, 6}, {0x2b, 6}, {0x27, 7}, {0xc, 7},
+ {0x8, 7}, {0x17, 7}, {0x3, 7}, {0x4, 7},
+ {0x28, 7}, {0x2b, 7}, {0x13, 7}, {0x24, 7},
+ {0x18, 7}, {0x2, 8}, {0x3, 8}, {0x1a, 8},
+ {0x1b, 8}, {0x12, 8}, {0x13, 8}, {0x14, 8},
+ {0x15, 8}, {0x16, 8}, {0x17, 8}, {0x28, 8},
+ {0x29, 8}, {0x2a, 8}, {0x2b, 8}, {0x2c, 8},
+ {0x2d, 8}, {0x4, 8}, {0x5, 8}, {0xa, 8},
+ {0xb, 8}, {0x52, 8}, {0x53, 8}, {0x54, 8},
+ {0x55, 8}, {0x24, 8}, {0x25, 8}, {0x58, 8},
+ {0x59, 8}, {0x5a, 8}, {0x5b, 8}, {0x4a, 8},
+ {0x4b, 8}, {0x32, 8}, {0x33, 8}, {0x34, 8}
+};
+
+
+/* run-length = 64*(index+1), index is in 0..26 */
+static const huff_t MHMakeupWhite[] = {
+ {0x1b, 5}, {0x12, 5}, {0x17, 6}, {0x37, 7},
+ {0x36, 8}, {0x37, 8}, {0x64, 8}, {0x65, 8},
+ {0x68, 8}, {0x67, 8}, {0xcc, 9}, {0xcd, 9},
+ {0xd2, 9}, {0xd3, 9}, {0xd4, 9}, {0xd5, 9},
+ {0xd6, 9}, {0xd7, 9}, {0xd8, 9}, {0xd9, 9},
+ {0xda, 9}, {0xdb, 9}, {0x98, 9}, {0x99, 9},
+ {0x9a, 9}, {0x18, 6}, {0x9b, 9}
+};
+
+
+/* run-length = index, index is in 0..63 */
+static const huff_t MHBlackRuns[] = {
+ {0x37, 10}, {0x2, 3}, {0x3, 2}, {0x2, 2},
+ {0x3, 3}, {0x3, 4}, {0x2, 4}, {0x3, 5},
+ {0x5, 6}, {0x4, 6}, {0x4, 7}, {0x5, 7},
+ {0x7, 7}, {0x4, 8}, {0x7, 8}, {0x18, 9},
+ {0x17, 10}, {0x18, 10}, {0x8, 10}, {0x67, 11},
+ {0x68, 11}, {0x6c, 11}, {0x37, 11}, {0x28, 11},
+ {0x17, 11}, {0x18, 11}, {0xca, 12}, {0xcb, 12},
+ {0xcc, 12}, {0xcd, 12}, {0x68, 12}, {0x69, 12},
+ {0x6a, 12}, {0x6b, 12}, {0xd2, 12}, {0xd3, 12},
+ {0xd4, 12}, {0xd5, 12}, {0xd6, 12}, {0xd7, 12},
+ {0x6c, 12}, {0x6d, 12}, {0xda, 12}, {0xdb, 12},
+ {0x54, 12}, {0x55, 12}, {0x56, 12}, {0x57, 12},
+ {0x64, 12}, {0x65, 12}, {0x52, 12}, {0x53, 12},
+ {0x24, 12}, {0x37, 12}, {0x38, 12}, {0x27, 12},
+ {0x28, 12}, {0x58, 12}, {0x59, 12}, {0x2b, 12},
+ {0x2c, 12}, {0x5a, 12}, {0x66, 12}, {0x67, 12}
+};
+
+
+/* run-length = 64*(index+1), index is in 0..26 */
+static const huff_t MHMakeupBlack[] = {
+ {0xf, 10}, {0xc8, 12}, {0xc9, 12}, {0x5b, 12},
+ {0x33, 12}, {0x34, 12}, {0x35, 12}, {0x6c, 13},
+ {0x6d, 13}, {0x4a, 13}, {0x4b, 13}, {0x4c, 13},
+ {0x4d, 13}, {0x72, 13}, {0x73, 13}, {0x74, 13},
+ {0x75, 13}, {0x76, 13}, {0x77, 13}, {0x52, 13},
+ {0x53, 13}, {0x54, 13}, {0x55, 13}, {0x5a, 13},
+ {0x5b, 13}, {0x64, 13}, {0x65, 13}
+};
+
+
+/* run-length = 64*(index+28), index is in 0..12 */
+static const huff_t MHExtMakeup[] = {
+ {0x8, 11}, {0xc, 11}, {0xd, 11}, {0x12, 12},
+ {0x13, 12}, {0x14, 12}, {0x15, 12}, {0x16, 12},
+ {0x17, 12}, {0x1c, 12}, {0x1d, 12}, {0x1e, 12},
+ {0x1f, 12}
+};
+
+
+/* vertical-offset = index-3 */
+static const huff_t VertTbl[] = {
+ {2, 7},
+ {2, 6},
+ {2, 3},
+ {1, 1},
+ {3, 3},
+ {3, 6},
+ {3, 7}
+};
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | put_run | Outputs a white or black run |
+ |_________|__________________________________________________________________|
+*/
+static void put_run_routine(
+ ENC_INST *g,
+ int iRunLen,
+ const huff_t *makeup_tbl,
+ const huff_t *code_tbl)
+{
+ huff_t te;
+
+ while (iRunLen >= 1792) {
+ int tpos;
+ tpos = (iRunLen>>6) - (1792>>6);
+ if (tpos > 12)
+ tpos = 12;
+ te = MHExtMakeup [tpos];
+ put_bits_routine (g, te.length, te.bits);
+ iRunLen -= (tpos+(1792>>6)) << 6;
+ }
+
+ if (iRunLen >= 64) {
+ te = makeup_tbl [(iRunLen>>6) - 1];
+ put_bits_routine (g, te.length, te.bits);
+ iRunLen &= 63;
+ }
+
+ te = code_tbl [iRunLen];
+ put_bits_routine (g, te.length, te.bits);
+}
+
+#define put_run(g, par_run_len, par_makeup_tbl, par_code_tbl) \
+do { \
+ huff_t te; \
+ int loc_run_len = par_run_len; \
+ \
+ if (loc_run_len >= 64) \
+ put_run_routine (g, loc_run_len, par_makeup_tbl, par_code_tbl); \
+ else { \
+ te = par_code_tbl [loc_run_len]; \
+ put_bits (g, te.length, te.bits); \
+ } \
+} while (0)
+
+
+
+#define PutWhiteRun(g, iRunLen) \
+ put_run (g, iRunLen, MHMakeupWhite, MHWhiteRuns)
+
+
+#define PutBlackRun(g, iRunLen) \
+ put_run (g, iRunLen, MHMakeupBlack, MHBlackRuns)
+
+
+static void PutEOL(ENC_INST *g) /* output the EOL code (11 zeroes and a one) */
+{
+ put_bits_routine (g, 12, 0x001);
+}
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | encode_row_1d | Converts a pixel-row into MH (CCITT G3) format |
+ |_______________|____________________________________________________________|
+ | |
+ | Before calling this routine, you must call put_init. |
+ | After calling this routine, you must call put_grab/put_done. |
+ | This routine puts the EOL at the beginning of the line. |
+ |____________________________________________________________________________|
+*/
+static void encode_row_1d (
+ ENC_INST *g,
+ BYTE *pbPixelRow, /* ptr to pixel-row */
+ int iPixels, /* # of pixels in above row */
+ BOOL fDoingMR) /* Sending MR? Ie, send a 1d/2d tag-bit after EOL? */
+{
+ int iStartPos;
+ int iChange;
+ UINT skip; /* the color we're skipping over; 0x00=black, 0xFF=white */
+
+ PutEOL (g);
+ if (fDoingMR)
+ put_bits_routine (g,1,1); /* tag-bit after EOL means 1-dim row-data */
+
+ pbPixelRow[iPixels>>3] = 0x55u; /* scan_to requires this */
+ iStartPos = 0;
+ skip = 0;
+
+ while (iStartPos < iPixels) {
+ iChange = scan_to (skip, pbPixelRow, iStartPos, iPixels);
+ if (skip) PutBlackRun (g, iChange-iStartPos);
+ else PutWhiteRun (g, iChange-iStartPos);
+ iStartPos = iChange;
+ skip = ~skip;
+ }
+}
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | encode_row_2d | Converts a pixel-row into 2-dimensional format |
+ |_______________|____________________________________________________________|
+ | |
+ | Before calling this routine, you must call put_init. |
+ | After calling this routine, you must call put_grab/put_done. |
+ | For MR data, this routine puts the EOL+tag at the beginning of the line. |
+ |____________________________________________________________________________|
+*/
+/*
+ * The variable 'need' below is a bit-array telling us which values (a1, b0,
+ * etc) are needed. It is determined by the cases below.
+ *
+ * b0 is not in the standard. I've defined it as, "A pixel on the reference
+ * line above or to the right of a0, and to the left of b1." Since b1 is the
+ * first changing pixel, b0 must be the same color as a0. b0 is the point at
+ * which the search for b1 begins.
+ *
+ * In the code below, b0 uses the b1 variable because if we're using b0, then
+ * b1 is not known, so it's okay to clobber it.
+ *
+ * Below, a0, a1, b0, b1 etc denote positions before coding, and A0, A1,
+ * B0, B1, etc denote positions after coding.
+ *
+ * Pass Mode:
+ *
+ * B0
+ * b1 b2
+ * - - - X X X - - -
+ * X - - - - - - X -
+ * a0 a1
+ * A0 A1
+ *
+ * A0 = b2, specified by the standard.
+ * A1 = a1, because A0 is to the left of a1, a1 does not move.
+ * B0 = b2, which is known to be the same color as A0.
+ *
+ * Needed: B1 and B2.
+ *
+ * Vertical Mode:
+ *
+ * Normal case:
+ *
+ * B1
+ * b1 b2
+ * - - - X X X - - -
+ * - - X X - - - - -
+ * a0 a1
+ * A0
+ *
+ * A0 = a1, specified by the standard.
+ * B1 = b2, the first changing pixel of opposite color as A0.
+ *
+ * Needed: A1, B2.
+ *
+ * An exception (a1=b2):
+ *
+ * b1 b2
+ * - - - X - - - - -
+ * - - - - X - - - -
+ * a0 a1
+ * A0
+ *
+ * Here, b2 is above A0, and therefore cannot be used as B1.
+ * And its color is opposite A0, so it's not even usable as B0.
+ * So B0 and B1 must be scanned.
+ *
+ * Needed: A1, B0, B1, B2.
+ *
+ * A subtle exception (a1 is at least 2 pixels to the left of b1):
+ *
+ * B1 B2
+ * b1 b2
+ * - - X X X - X - -
+ * - - - - X - - - -
+ * a0 a1
+ * A0
+ *
+ * b1 and b2 move *backwards* after coding.
+ * B1 = b1-1, and B2=b1. Since it's not worth the time to check
+ * for this rare pixel-arrangement, we'll just rescan B0, B1 and B2.
+ *
+ * Needed: A1, B0, B1, B2.
+ *
+ * Horizontal Mode:
+ *
+ * First case (a2 > b2):
+ *
+ * b1 b2
+ * - - - - - X - - -
+ * - X X X X X X - -
+ * a0 a1 a2
+ * A0
+ *
+ * Since b2 is left of A0, we know nothing about what's above A0.
+ * So everything must be scanned.
+ *
+ * Needed: A1, B0, B1, B2.
+ *
+ * Second case: (a2 <= b2):
+ *
+ * B0
+ * b1 b2
+ * - - - - - X X X -
+ * - X X X X X X - -
+ * a0 a1 a2
+ * A0
+ *
+ * A0 = a2, specified by the standard.
+ * B0 = b2, because it's the same color as A0, and not to left of A0.
+ *
+ * Needed: A1, B1, B2.
+ *
+ * Exception to above case (a2 < b1):
+ *
+ * B1 B2
+ * b1 b2
+ * - - - - - - X X -
+ * - X X X X - - - -
+ * a0 a1 a2
+ * A0
+ *
+ * b1 is to the right of A0, so b1 and b2 don't move.
+ * This case is common because it occurs whenever a row with some
+ * data follows a blank row.
+ *
+ * Needed: A1.
+ */
+static void encode_row_2d (
+ ENC_INST *g,
+ BYTE *pbPixelRow, /* ptr to pixel-row */
+ BYTE *pbRefRow, /* ptr to reference-row */
+ int iPixels, /* # of pixels in above row */
+ BOOL fDoingMR) /* Sending MR? Ie, output an EOL + tag-bit? */
+{
+ #define A1 1
+ #define B0 2
+ #define B1 4
+ #define B2 8
+
+ int a0, a1, a2;
+ int b1, b2;
+ int iDelta;
+ UINT skip; /* the color we're skipping over; 00=white, FF=black */
+ UINT need;
+
+ if (fDoingMR) {
+ PutEOL (g);
+ put_bits_routine (g,1,0); /* tag-bit after EOL means 2-dim row-data */
+ }
+
+ pbPixelRow[iPixels>>3] = 0x55u; /* scan_to requires this */
+ pbRefRow [iPixels>>3] = 0x55u; /* scan_to requires this */
+
+ /* The imaginary pixel before the first is considered a white pixel.
+ * So if the first pixel in the row is black, it is considered
+ * a "changing" pixel (white->black).
+ */
+ a1 = scan_to ( 0x00, pbPixelRow, 0, iPixels);
+ b1 = scan_to ( 0x00, pbRefRow, 0, iPixels);
+ b2 = scan_to ((UINT)~0x00, pbRefRow, b1+1, iPixels);
+ skip = (UINT)~0x00u; /* white, initially */
+ a0 = 0;
+
+ while (TRUE) {
+
+ /* output one of the modes */
+
+ iDelta = a1 - b1;
+
+ if (b2 < a1) { /* pass mode */
+ put_bits (g,4,1);
+ need = B1 | B2;
+ a0 = b2;
+ b1 = b2;
+ } else if (-3<=iDelta && iDelta<=3) { /* vertical mode */
+ huff_t te = VertTbl[iDelta+3];
+ put_bits (g, te.length, te.bits);
+ need = A1 | B2;
+ if (b2==a1 || iDelta<=-2)
+ need = A1 | B0 | B1 | B2;
+ a0 = a1;
+ b1 = b2;
+ skip = ~skip;
+ } else { /* horizontal mode */
+ a2 = scan_to (skip, pbPixelRow, a1+1, iPixels);
+ put_bits (g,3,1);
+ if (skip) {
+ PutWhiteRun (g,a1-a0);
+ PutBlackRun (g,a2-a1);
+ } else {
+ PutBlackRun (g,a1-a0);
+ PutWhiteRun (g,a2-a1);
+ }
+ if (a2 > b2) {
+ need = A1 | B0 | B1 | B2;
+ } else if (a2 < b1) {
+ need = A1;
+ } else {
+ b1 = b2;
+ need = A1 | B1 | B2;
+ }
+ a0 = a2;
+ }
+
+ if (a0 >= iPixels)
+ break;
+
+ /* compute next a1, b1, b2 */
+
+ if (need & A1) a1 = scan_to (~skip, pbPixelRow, a0+1, iPixels);
+ if (need & B0) b1 = scan_to ( skip, pbRefRow, a0, iPixels);
+ if (need & B1) b1 = scan_to (~skip, pbRefRow, b1+1, iPixels);
+ if (need & B2) b2 = scan_to ( skip, pbRefRow, b1+1, iPixels);
+ }
+}
+
+
+
+/*
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+@@ @@
+@@ @@
+@@ E N C O D E R @@
+@@ @@
+@@ @@
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+*/
+
+
+
+/*****************************************************************************\
+ *
+ * faxEncode_openXform - Creates a new instance of the transformer
+ *
+ *****************************************************************************
+ *
+ * This returns a handle for the new instance to be passed into
+ * all subsequent calls.
+ *
+ * Return value: IP_DONE=success; IP_FATAL_ERROR=misc error.
+ *
+\*****************************************************************************/
+
+static WORD faxEncode_openXform (
+ IP_XFORM_HANDLE *pXform) /* out: returned handle */
+{
+ PENC_INST g;
+
+ INSURE (pXform != NULL);
+ IP_MEM_ALLOC (sizeof(ENC_INST), g);
+ *pXform = g;
+ memset (g, 0, sizeof(ENC_INST));
+ g->dwValidChk = CHECK_VALUE;
+ put_init (g, NULL); /* put_new_buf will be called later */
+
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * faxEncode_setDefaultInputTraits - Specifies default input image traits
+ *
+ *****************************************************************************
+ *
+ * The header of the file-type handled by the transform probably does
+ * not include *all* the image traits we'd like to know. Those not
+ * specified in the file-header are filled in from info provided by
+ * this routine.
+ *
+ * Return value: IP_DONE=success; IP_FATAL_ERROR=misc error.
+ *
+\*****************************************************************************/
+
+static WORD faxEncode_setDefaultInputTraits (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ PIP_IMAGE_TRAITS pTraits) /* in: default image traits */
+{
+ PENC_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ /* Insure that values we actually use or care about are known */
+ INSURE (pTraits->iPixelsPerRow > 0); /* we need the row-length */
+ INSURE (pTraits->iBitsPerPixel == 1); /* image must be bi-level */
+
+ g->traits = *pTraits; /* a structure copy */
+
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * faxEncode_setXformSpec - Provides xform-specific information
+ *
+\*****************************************************************************/
+
+static WORD faxEncode_setXformSpec (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD_OR_PVOID aXformInfo[]) /* in: xform information */
+{
+ PENC_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+ g->wOutFmt = (BYTE)aXformInfo[IP_FAX_FORMAT].dword;
+ g->fNoEOLs = (BOOL)aXformInfo[IP_FAX_NO_EOLS].dword;
+ g->wMinBits = (WORD)aXformInfo[IP_FAX_MIN_ROW_LEN].dword;
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * faxEncode_getHeaderBufSize- Returns size of input buf needed to hold header
+ *
+\*****************************************************************************/
+
+static WORD faxEncode_getHeaderBufSize (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD *pdwInBufLen) /* out: buf size for parsing header */
+{
+ /* since input is raw pixels, there is no header, so set it to zero */
+ *pdwInBufLen = 0;
+ return IP_DONE;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * faxEncode_getActualTraits - Parses header, and returns input & output traits
+ *
+ *****************************************************************************
+ *
+ * For this fax xform driver, this routine merely returns input traits.
+ *
+\*****************************************************************************/
+
+static WORD faxEncode_getActualTraits (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD dwInputAvail, /* in: # avail bytes in input buf */
+ PBYTE pbInputBuf, /* in: ptr to input buffer */
+ PDWORD pdwInputUsed, /* out: # bytes used from input buf */
+ PDWORD pdwInputNextPos,/* out: file-pos to read from next */
+ PIP_IMAGE_TRAITS pInTraits, /* out: input image traits */
+ PIP_IMAGE_TRAITS pOutTraits) /* out: output image traits */
+{
+ PENC_INST g;
+ int inBytes;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ /* Since there is no header, we'll report no usage of input */
+
+ *pdwInputUsed = 0;
+ *pdwInputNextPos = 0;
+
+ /* Since we don't change traits, just copy out the default traits */
+
+ *pInTraits = g->traits;
+ *pOutTraits = g->traits;
+
+ /* Compute some stuff */
+
+ g->iRowLen = g->traits.iPixelsPerRow; /* todo: eliminate redundant var */
+
+ /* below, if vert dpi is unknown (negative), we use cycle-len of 2 */
+ g->w12Cycle = (g->traits.lVertDPI < (150l<<16)) ? 2 : 4;
+
+ /* Allocate the prior-row buffer, if needed */
+
+ if (g->wOutFmt != IP_FAX_MH) {
+ if (g->prior_p != NULL)
+ IP_MEM_FREE (g->prior_p);
+ inBytes = (g->iRowLen+7) / 8;
+ IP_MEM_ALLOC (inBytes, g->prior_p);
+ memset (g->prior_p, 0, inBytes);
+ }
+
+ return IP_DONE | IP_READY_FOR_DATA;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/****************************************************************************\
+ *
+ * faxEncode_getActualBufSizes - Returns buf sizes needed for remainder of job
+ *
+\****************************************************************************/
+
+static WORD faxEncode_getActualBufSizes (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ PDWORD pdwMinInBufLen, /* out: min input buf size */
+ PDWORD pdwMinOutBufLen) /* out: min output buf size */
+{
+ PENC_INST g;
+ UINT uWorstBuf, uMinBytes;
+
+ HANDLE_TO_PTR (hXform, g);
+ *pdwMinInBufLen = (g->iRowLen+7) / 8;
+
+ uWorstBuf = worst_buf_size (g->wOutFmt, g->iRowLen);
+ uMinBytes = (g->wMinBits+7) / 8;
+ *pdwMinOutBufLen = uWorstBuf > uMinBytes ? uWorstBuf : uMinBytes;
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * faxEncode_convert - the work-horse routine
+ *
+ *****************************************************************************
+ *
+ * This routine (actually put_bits) hangs onto the last 1-3 bytes of
+ * encoded row-data due to its buffering method.
+ *
+\*****************************************************************************/
+
+static WORD faxEncode_convert (
+ IP_XFORM_HANDLE hXform,
+ DWORD dwInputAvail, /* in: # avail bytes in in-buf */
+ PBYTE pbInputBuf, /* in: ptr to in-buffer */
+ PDWORD pdwInputUsed, /* out: # bytes used from in-buf */
+ PDWORD pdwInputNextPos, /* out: file-pos to read from next */
+ DWORD dwOutputAvail, /* in: # avail bytes in out-buf */
+ PBYTE pbOutputBuf, /* in: ptr to out-buffer */
+ PDWORD pdwOutputUsed, /* out: # bytes written in out-buf */
+ PDWORD pdwOutputThisPos) /* out: file-pos to write the data */
+{
+ PENC_INST g;
+ int inBytes;
+ int i;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ put_new_buf (g, pbOutputBuf);
+
+ /********************************************************/
+ /* If we're being told to flush, output the ending EOLs */
+ /********************************************************/
+
+ if (dwInputAvail == 0) {
+
+ switch (g->wOutFmt) {
+ case IP_FAX_MH:
+ for (i=6; i>0; i--)
+ PutEOL (g);
+ break;
+
+ case IP_FAX_MR:
+ for (i=6; i>0; i--) {
+ PutEOL (g);
+ put_bits_routine (g,1,1);
+ }
+ break;
+
+ case IP_FAX_MMR:
+ PutEOL (g);
+ PutEOL (g);
+ break;
+ }
+
+ *pdwInputUsed = 0;
+ *pdwOutputUsed = put_done (g);
+ *pdwInputNextPos = g->dwInNextPos;
+ *pdwOutputThisPos = g->dwOutNextPos;
+ return IP_DONE;
+ }
+
+ /******************************/
+ /* Normal Case (not flushing) */
+ /******************************/
+
+ inBytes = (g->iRowLen+7) / 8;
+ INSURE (dwInputAvail >= (DWORD)inBytes);
+ INSURE (dwOutputAvail > 0);
+
+ switch (g->wOutFmt) {
+ case IP_FAX_MH:
+ encode_row_1d (g, pbInputBuf, g->iRowLen, FALSE);
+ put_fill_bits (g);
+ break;
+
+ case IP_FAX_MR:
+ if (g->iRowNum % g->w12Cycle == 0)
+ encode_row_1d (g, pbInputBuf, g->iRowLen, TRUE);
+ else
+ encode_row_2d (g, pbInputBuf, g->prior_p, g->iRowLen, TRUE);
+ put_fill_bits (g);
+ break;
+
+ case IP_FAX_MMR:
+ encode_row_2d (g, pbInputBuf, g->prior_p, g->iRowLen, FALSE);
+ break;
+ }
+
+ if (g->prior_p != NULL)
+ memcpy (g->prior_p, pbInputBuf, inBytes);
+
+ *pdwInputUsed = inBytes;
+ g->dwInNextPos += inBytes;
+ *pdwInputNextPos = g->dwInNextPos;
+
+ *pdwOutputUsed = put_grab (g);
+ *pdwOutputThisPos = g->dwOutNextPos;
+ g->dwOutNextPos += *pdwOutputUsed;
+ g->iRowNum += 1;
+
+ return IP_CONSUMED_ROW | IP_PRODUCED_ROW | IP_READY_FOR_DATA;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * faxEncode_insertedData - client inserted into our output stream
+ *
+\*****************************************************************************/
+
+static WORD faxEncode_insertedData (
+ IP_XFORM_HANDLE hXform,
+ DWORD dwNumBytes)
+{
+ fatalBreakPoint ();
+ return IP_FATAL_ERROR; /* must never be called (can't insert data) */
+}
+
+
+
+/*****************************************************************************\
+ *
+ * faxEncode_newPage - Tells us to flush this page, and start a new page
+ *
+\*****************************************************************************/
+
+static WORD faxEncode_newPage (
+ IP_XFORM_HANDLE hXform)
+{
+ PENC_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+ /* todo: output EOLs to mark a new page */
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+
+}
+
+
+
+/*****************************************************************************\
+ *
+ * faxEncode_closeXform - Destroys this instance
+ *
+\*****************************************************************************/
+
+static WORD faxEncode_closeXform (IP_XFORM_HANDLE hXform)
+{
+ PENC_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ if (g->prior_p != NULL)
+ IP_MEM_FREE (g->prior_p);
+
+ g->dwValidChk = 0;
+ IP_MEM_FREE (g); /* free memory for the instance */
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * faxEncodeTbl - Jump-table for encoder
+ *
+\*****************************************************************************/
+
+IP_XFORM_TBL faxEncodeTbl = {
+ faxEncode_openXform,
+ faxEncode_setDefaultInputTraits,
+ faxEncode_setXformSpec,
+ faxEncode_getHeaderBufSize,
+ faxEncode_getActualTraits,
+ faxEncode_getActualBufSizes,
+ faxEncode_convert,
+ faxEncode_newPage,
+ faxEncode_insertedData,
+ faxEncode_closeXform
+};
+
+
+
+/*
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+@@ @@
+@@ @@
+@@ D E C O D E R @@
+@@ @@
+@@ @@
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+*/
+
+
+/* white/nonwhite might be put in interface later on */
+#define NONWHITE_ROW 0x0000 /* row is not all white */
+#define WHITE_ROW 0x0000 /* row is all white */
+
+#define MAX_CODE_LEN 13 /* length of longest code */
+#define EOL_LEN 12 /* EOL is 11 zeroes and a one */
+#define EOLS_FOR_MH_MR 3 /* the std says 6, but some might be zapped */
+#define EOLS_FOR_MMR 1 /* the std says 2, but we'll stop at first because
+ * we might not be able to fetch the second EOL from
+ * the cache because we won't fetch anything unless
+ * it contains 13 bits, and an EOL is only 12 */
+
+/* Huffman tables (at end of file): */
+
+extern const BYTE fax_vert_huff_index[];
+extern const USHORT fax_vert_huff[];
+extern const BYTE fax_black_huff_index[];
+extern const USHORT fax_black_huff[];
+extern const BYTE fax_white_huff_index[];
+extern const USHORT fax_white_huff[];
+
+#define MAX_BLACK_CODELEN 13
+#define MAX_WHITE_CODELEN 12
+#define MAX_VERT_CODELEN 7
+
+#define CODELEN_SHIFT 12
+#define VALUE_MASK 0x0fffu
+
+/* items only in fax_vert_huff table: */
+#define LAST_VERT 6
+#define PASS_MODE 7
+#define HORIZ_MODE 8
+
+enum {
+ RET_GOT_CODE, /* we parsed a good code (ret in *piResult) */
+ RET_BAD_CODE, /* trash in row-data */
+ RET_FILL, /* got some fill-zeroes */
+ RET_HIT_EOL, /* hit EOL; no row-data was parsed or returned */
+ RET_NEED_MORE /* need more input-bytes to complete the row */
+};
+
+
+
+/*____________________________________________________________________________
+ | |
+ | Type-definition of our instance-variables |
+ |____________________________________________________________________________|
+*/
+
+typedef enum {
+ NORMAL_2D,
+ HORIZ_1ST,
+ HORIZ_2ND
+} STATE_2D;
+
+typedef struct {
+ IP_IMAGE_TRAITS traits; /* traits of the image */
+ DWORD dwInNextPos; /* file pos for subsequent input */
+ DWORD dwOutNextPos; /* file pos for subsequent output */
+ DWORD dwValidChk; /* struct validity check value */
+
+ /* Variables for getting bits: */
+ BYTE *gb_buf_p; /* beginning of our buffer */
+ BYTE *gb_buf_after_p; /* 1st byte after our buffer */
+ BYTE *gb_byte_p; /* ptr to next byte */
+ int gb_cache_cnt; /* # of available bits in gb_cache */
+ DWORD gb_cache; /* 32-bit buffer to cache the next few bits */
+ /* is also pos of next avail bit; msb=32, lsb=1 */
+ int gb_num_zeroes; /* # of successive zero-bits we've gotten */
+
+ /* Variables for row-decoding functions: */
+ int pixel_pos; /* coordinate of next pixel; 0 is leftmost */
+ BYTE white; /* doing a white run? (00=black, FF=white) */
+ STATE_2D state_2d; /* state of the 2-dim decoder */
+ int a0; /* pixel before 1st is an imaginary white pixel */
+ BYTE *prior_p; /* buffer containing prior row */
+ BOOL ref_row_invalid; /* (MR only) reference row invalid due to error?*/
+
+ /* Variables for the exported functions: */
+ BYTE input_format; /* input format (IP_FAX_MH/MR/MMR) */
+ BYTE num_eols; /* number of successive EOLs we've gotten */
+ BOOL no_eols; /* are EOLs not present in input? */
+ BOOL toss_everything; /* are we discarding all data due to prior err? */
+ BOOL flushing_to_eol; /* are we ignoring bits until an EOL? */
+ BOOL got_fill; /* gotten any fill-zeroes? */
+ BOOL got_black; /* set any black pixels in the row? */
+ BOOL two_dim; /* next row is 2-dimensional encoding? */
+ int row_len; /* # pixels in each row */
+ int bytes_in_row; /* # bytes in each row */
+} DEC_INST, *PDEC_INST;
+
+
+
+/*****************************************************************************
+ * *
+ * F E T C H I N G B I T S *
+ * *
+ *****************************************************************************
+
+
+Interface into this section:
+
+ bits_init - inits this section
+ bits_buf_open - gives us (this section) a buffer to consume
+ BITS_REFILL_CACHE - fills cache; must be called before parsing
+ BITS_IN_CACHE - returns # bits currently in the cache
+ BITS_LOAD - returns next N bits of input (no advance is done)
+ BITS_ADVANCE - advances input by the given # of bits
+ bits_buf_close - returns # bytes consumed in buffer
+ bits_flush - discards all unread bits
+ bits_flush_to_eol - flushes input bits until EOL is encountered
+*/
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | bits_init | initializes this "fetching bits" section |
+ |___________|________________________________________________________________|
+*/
+static void bits_init (DEC_INST *g)
+{
+ g->gb_num_zeroes = 0;
+ g->gb_cache_cnt = 0; /* the cache is empty */
+}
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | bits_buf_open | gives us (this section) a buffer to consume |
+ |_______________|____________________________________________________________|
+*/
+static void bits_buf_open (
+ DEC_INST *g,
+ BYTE *buf_p,
+ int num_bytes)
+{
+ g->gb_byte_p = buf_p;
+ g->gb_buf_p = buf_p;
+ g->gb_buf_after_p = buf_p + num_bytes;
+}
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | bits_buf_close | returns # bytes consumed in buffer |
+ |________________|___________________________________________________________|
+*/
+static UINT bits_buf_close (DEC_INST *g)
+{
+ return (g->gb_byte_p - g->gb_buf_p);
+}
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | bits_flush | discards all unread bits |
+ |____________|_______________________________________________________________|
+*/
+static void bits_flush (DEC_INST *g)
+{
+ g->gb_cache_cnt = 0;
+ g->gb_byte_p = g->gb_buf_after_p;
+}
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | BITS_REFILL_CACHE | fills cache as full as possible |
+ |___________________|________________________________________________________|
+*/
+#define BITS_REFILL_CACHE(g) \
+{ \
+ int cache_cnt = g->gb_cache_cnt; \
+ DWORD cache = g->gb_cache; \
+ BYTE *byte_p = g->gb_byte_p; \
+ BYTE *buf_after_p = g->gb_buf_after_p; \
+ \
+ while (cache_cnt<=24 && byte_p<buf_after_p) { \
+ cache = (cache << 8) | (*byte_p++); \
+ cache_cnt += 8; \
+ } \
+ \
+ g->gb_cache_cnt = cache_cnt; \
+ g->gb_cache = cache; \
+ g->gb_byte_p = byte_p; \
+}
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | BITS_IN_CACHE | returns # bits currently in the bit-cache |
+ |_______________|____________________________________________________________|
+*/
+#define BITS_IN_CACHE(g) (g->gb_cache_cnt)
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | bits_flush_to_eol | flushes input bits until EOL is encountered |
+ |___________________|________________________________________________________|
+ | |
+ | If got_fill is TRUE, then we merely scan for a set bit. |
+ | Otherwise, we first count leading zeroes until it reaches 11. |
+ | |
+ | Return value: TRUE = We hit an EOL. In this case, if leave_a_bit is |
+ | TRUE, the cache will contain at least one bit so |
+ | you can fetch a 1-dim/2-dim bit. |
+ | FALSE = We need more input data. |
+ |____________________________________________________________________________|
+*/
+static BOOL bits_flush_to_eol (
+ DEC_INST *g, /* our instance vars */
+ BOOL got_fill, /* have we gotten fill zeroes? */
+ BOOL leave_a_bit) /* after hitting EOL, insure that cache isn't empty? */
+{
+ #define CLEAR_UNUSED_CACHE_BITS \
+ if (g->gb_cache_cnt < 32) \
+ g->gb_cache &= (1lu << g->gb_cache_cnt) - 1lu;
+
+ DWORD bit;
+ BYTE byt;
+
+ /*********************************************/
+ /* Scan input until 11 zeroes have been seen */
+ /*********************************************/
+
+ if (g->gb_num_zeroes >= 11)
+ got_fill = TRUE;
+
+ if (! got_fill)
+ {
+ if (g->gb_cache_cnt != 0) {
+ for (bit = (1lu<<(g->gb_cache_cnt-1));
+ bit != 0;
+ bit >>= 1) {
+ g->gb_cache_cnt -= 1;
+ if (bit & g->gb_cache)
+ g->gb_num_zeroes =0;
+ else {
+ g->gb_num_zeroes += 1;
+ if (g->gb_num_zeroes >= 11)
+ break;
+ }
+ }
+ }
+
+ /* the cache is now empty; start scanning bytes */
+
+ while (TRUE) {
+ if (g->gb_byte_p >= g->gb_buf_after_p)
+ return FALSE;
+ byt = *(g->gb_byte_p)++;
+ g->gb_num_zeroes += baLeftZeroesTbl[byt];
+ if (g->gb_num_zeroes >= 11) {
+ g->gb_byte_p -= 1;
+ break;
+ }
+ if (byt != 0)
+ g->gb_num_zeroes = baRightZeroesTbl[byt];
+ }
+ }
+
+ /*******************************************/
+ /* Scan input until a non-zero bit is seen */
+ /*******************************************/
+
+ while (TRUE)
+ {
+ BITS_REFILL_CACHE (g)
+ if (g->gb_cache_cnt==0 || (leave_a_bit && g->gb_cache_cnt==1))
+ return FALSE;
+
+ CLEAR_UNUSED_CACHE_BITS
+
+ if (g->gb_cache == 0)
+ g->gb_cache_cnt = 0; /* cache is all zeroes; discard it */
+ else {
+ /* we hit the EOL */
+ for (bit = (1lu<<(g->gb_cache_cnt-1));
+ (bit & g->gb_cache) == 0;
+ bit >>= 1)
+ g->gb_cache_cnt -= 1; /* discard the 0's before the 1 */
+
+ /* After discarding the set bit, if leave_a_bit is TRUE, we want
+ * the cache to be non-empty so that a 1-dim/2-dim bit can then
+ * be fetched. Hence the check for 2 bits in cache below.
+ */
+ if (!leave_a_bit || g->gb_cache_cnt>=2) {
+ g->gb_cache_cnt -= 1; /* discard the set bit we found above */
+ g->gb_num_zeroes = 0;
+ return TRUE;
+ }
+ }
+
+ /* discard zero bytes */
+
+ /* Warning: If fax_decode_convert_row was told to flush, both
+ * pointers gb_byte_p and gb_buf_after_p can be NULL. So the
+ * pointer-compare below must be *before* the dereference in the
+ * test of the while loop, to avoid dereferencing a NULL pointer.
+ */
+ if (g->gb_cache_cnt == 0)
+ while (g->gb_byte_p<g->gb_buf_after_p && *(g->gb_byte_p)==0)
+ g->gb_byte_p++;
+ }
+}
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | BITS_LOAD | returns the next num_bits of input, with NO advance |
+ |___________|________________________________________________________________|
+*/
+#define BITS_LOAD(g, num_bits, par_result) { \
+ int n_bits = (int)(num_bits); \
+ \
+ par_result = (g->gb_cache >> (g->gb_cache_cnt-n_bits)) \
+ & ((1u<<n_bits) - 1u); \
+}
+
+#if 0
+
+#define BITS_LOAD(g, num_bits, par_result) { \
+ int n_bits = (int)(num_bits); \
+ \
+ par_result = g->gb_cache; \
+ \
+ asm ("extract %1,%2,%0" \
+ : "=d" (par_result) \
+ : "dI" (g->gb_cache_cnt - n_bits), "dI" (n_bits), "0" (par_result)); \
+}
+
+#endif
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | BITS_ADVANCE | advances input by num_bits bits |
+ |______________|_____________________________________________________________|
+*/
+#define BITS_ADVANCE(g, num_bits) { \
+ g->gb_cache_cnt -= (num_bits); \
+}
+
+
+
+/*****************************************************************************
+ * *
+ * U T I L I T I E S *
+ * *
+ *****************************************************************************/
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | parse_code_routine | Parses a Huffman code using the given code tables |
+ |____________________|_______________________________________________________|
+ | |
+ | Function return values: RET_GOT_CODE |
+ | RET_BAD_CODE |
+ | RET_FILL |
+ | RET_HIT_EOL |
+ | RET_NEED_MORE |
+ | |
+ | This function must NOT be called to scan for an EOL after it has |
+ | returned RET_BAD_CODE or RET_FILL. |
+ | |
+ | Warning: When this returns RET_HIT_EOL, it must guarantee that the |
+ | bit-cache is not empty so a 1-dim/2-dim bit can be fetched. |
+ |____________________________________________________________________________|
+*/
+
+static UINT parse_code_routine (
+ DEC_INST *g,
+ int bits_in_index, /* in: # bits in index for index_tbl */
+ const BYTE index_tbl[], /* in: contains indices into value_tbl */
+ const USHORT value_tbl[], /* in: contains [codelen, value] pairs */
+ int *value_p) /* out: the value corresponding to the code */
+{
+ UINT blob, values;
+
+ BITS_REFILL_CACHE(g)
+ if (BITS_IN_CACHE(g) < bits_in_index)
+ return RET_NEED_MORE;
+
+ BITS_LOAD (g, bits_in_index, blob);
+ values = value_tbl[index_tbl[blob]];
+
+ if (values != 0) {
+ /* normal case: we got a valid code */
+ BITS_ADVANCE (g, values >> CODELEN_SHIFT);
+ *value_p = values & VALUE_MASK;
+ return RET_GOT_CODE;
+ }
+
+ if (BITS_IN_CACHE(g) < MAX_CODE_LEN)
+ return RET_NEED_MORE;
+
+ BITS_LOAD (g, EOL_LEN, blob);
+
+ if (blob == 1) {
+ BITS_ADVANCE (g, EOL_LEN);
+ return RET_HIT_EOL;
+ }
+
+ if (blob == 0) {
+ BITS_ADVANCE (g, EOL_LEN);
+ return RET_FILL;
+ }
+
+ return RET_BAD_CODE;
+}
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | PARSE_CODE | A fast macro for parsing Huffman codes |
+ |____________|_______________________________________________________________|
+*/
+#define PARSE_CODE( \
+ g, \
+ bits_in_index, /* in: # bits in index for index_tbl */ \
+ index_tbl, /* in: contains indices into value_tbl */ \
+ value_tbl, /* in: contains [codelen, value] pairs */ \
+ out_result, /* out: RET_GOT_CODE, RET_BAD_CODE, etc */ \
+ out_value) /* out: the value corresponding to the code */ \
+do { \
+ UINT blob, values; \
+ \
+ if (BITS_IN_CACHE(g) < bits_in_index) \
+ goto call##value_tbl; \
+ \
+ BITS_LOAD (g, bits_in_index, blob); \
+ values = value_tbl[index_tbl[blob]]; \
+ \
+ if (values == 0) { \
+ call##value_tbl: \
+ out_result = parse_code_routine \
+ (g, bits_in_index, index_tbl, value_tbl, &out_value); \
+ } else { \
+ BITS_ADVANCE (g, values >> CODELEN_SHIFT); \
+ out_result = RET_GOT_CODE; \
+ out_value = values & VALUE_MASK; \
+ } \
+} while (0)
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | runs_array | all possible runs that fit in 16 bits |
+ |____________|_______________________________________________________________|
+ | |
+ | This array is indexed by (leftbit<<4)+rightbit. |
+ | Leftbit and rightbit are in 0..15. 0=msb, 15=lsb. |
+ |____________________________________________________________________________|
+*/
+
+static const USHORT runs_array_le[256] = { /* little-endian array */
+ 0x0080, 0x00c0, 0x00e0, 0x00f0, 0x00f8, 0x00fc, 0x00fe, 0x00ff,
+ 0x80ff, 0xc0ff, 0xe0ff, 0xf0ff, 0xf8ff, 0xfcff, 0xfeff, 0xffff,
+ 0x0000, 0x0040, 0x0060, 0x0070, 0x0078, 0x007c, 0x007e, 0x007f,
+ 0x807f, 0xc07f, 0xe07f, 0xf07f, 0xf87f, 0xfc7f, 0xfe7f, 0xff7f,
+ 0x0000, 0x0000, 0x0020, 0x0030, 0x0038, 0x003c, 0x003e, 0x003f,
+ 0x803f, 0xc03f, 0xe03f, 0xf03f, 0xf83f, 0xfc3f, 0xfe3f, 0xff3f,
+ 0x0000, 0x0000, 0x0000, 0x0010, 0x0018, 0x001c, 0x001e, 0x001f,
+ 0x801f, 0xc01f, 0xe01f, 0xf01f, 0xf81f, 0xfc1f, 0xfe1f, 0xff1f,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x000c, 0x000e, 0x000f,
+ 0x800f, 0xc00f, 0xe00f, 0xf00f, 0xf80f, 0xfc0f, 0xfe0f, 0xff0f,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0006, 0x0007,
+ 0x8007, 0xc007, 0xe007, 0xf007, 0xf807, 0xfc07, 0xfe07, 0xff07,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0002, 0x0003,
+ 0x8003, 0xc003, 0xe003, 0xf003, 0xf803, 0xfc03, 0xfe03, 0xff03,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001,
+ 0x8001, 0xc001, 0xe001, 0xf001, 0xf801, 0xfc01, 0xfe01, 0xff01,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8000, 0xc000, 0xe000, 0xf000, 0xf800, 0xfc00, 0xfe00, 0xff00,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x4000, 0x6000, 0x7000, 0x7800, 0x7c00, 0x7e00, 0x7f00,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x2000, 0x3000, 0x3800, 0x3c00, 0x3e00, 0x3f00,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x1000, 0x1800, 0x1c00, 0x1e00, 0x1f00,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x0c00, 0x0e00, 0x0f00,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0600, 0x0700,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0200, 0x0300,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0100,
+};
+
+static const USHORT runs_array_be[256] = { /* big-endian array */
+ 0x8000, 0xc000, 0xe000, 0xf000, 0xf800, 0xfc00, 0xfe00, 0xff00,
+ 0xff80, 0xffc0, 0xffe0, 0xfff0, 0xfff8, 0xfffc, 0xfffe, 0xffff,
+ 0x0000, 0x4000, 0x6000, 0x7000, 0x7800, 0x7c00, 0x7e00, 0x7f00,
+ 0x7f80, 0x7fc0, 0x7fe0, 0x7ff0, 0x7ff8, 0x7ffc, 0x7ffe, 0x7fff,
+ 0x0000, 0x0000, 0x2000, 0x3000, 0x3800, 0x3c00, 0x3e00, 0x3f00,
+ 0x3f80, 0x3fc0, 0x3fe0, 0x3ff0, 0x3ff8, 0x3ffc, 0x3ffe, 0x3fff,
+ 0x0000, 0x0000, 0x0000, 0x1000, 0x1800, 0x1c00, 0x1e00, 0x1f00,
+ 0x1f80, 0x1fc0, 0x1fe0, 0x1ff0, 0x1ff8, 0x1ffc, 0x1ffe, 0x1fff,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x0c00, 0x0e00, 0x0f00,
+ 0x0f80, 0x0fc0, 0x0fe0, 0x0ff0, 0x0ff8, 0x0ffc, 0x0ffe, 0x0fff,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0600, 0x0700,
+ 0x0780, 0x07c0, 0x07e0, 0x07f0, 0x07f8, 0x07fc, 0x07fe, 0x07ff,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0200, 0x0300,
+ 0x0380, 0x03c0, 0x03e0, 0x03f0, 0x03f8, 0x03fc, 0x03fe, 0x03ff,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0100,
+ 0x0180, 0x01c0, 0x01e0, 0x01f0, 0x01f8, 0x01fc, 0x01fe, 0x01ff,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0080, 0x00c0, 0x00e0, 0x00f0, 0x00f8, 0x00fc, 0x00fe, 0x00ff,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0040, 0x0060, 0x0070, 0x0078, 0x007c, 0x007e, 0x007f,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0020, 0x0030, 0x0038, 0x003c, 0x003e, 0x003f,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0010, 0x0018, 0x001c, 0x001e, 0x001f,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x000c, 0x000e, 0x000f,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0006, 0x0007,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0002, 0x0003,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001,
+};
+
+static const USHORT *runs_array = runs_array_le;
+
+static void initRunArray(void) {
+ int iTest=1;
+ char *pcTest=((char *)(&iTest));
+
+ if (*pcTest==1) {
+ runs_array = runs_array_le;
+ } else {
+ runs_array = runs_array_be;
+ }
+}
+
+
+/*____________________________________________________________________________
+ | | |
+ | set_run | Sets a run of pixels to black |
+ |_________|__________________________________________________________________|
+ | |
+ | This routine does bounds-checking to avoid setting any pixels outside the |
+ | given buffer. |
+ | |
+ | Since this is called often, it's written to be as fast as I could make it. |
+ |____________________________________________________________________________|
+*/
+static void set_run (
+ BYTE *buf_p, /* buffer in which we're to set the run */
+ int start_pos, /* pixel-index of left side of run */
+ int run_len, /* # of pixels in the run (non-negative) */
+ int row_len) /* # of pixels in the buffer */
+{
+ /*************************************************************************
+ *
+ * PERFORMANCE NOTE
+ *
+ * Inlining this routine slows it down a little.
+ * Seconds to MMR encode+decode 1000 rows of 1728 pixels (bench_fax.c):
+ *
+ * black density: 0% 10% 20% 50%
+ * calling this routine: 2.2 7.4 12.8 29.9
+ * inlining this routine: 2.2 7.5 13.2 30.6
+ *
+ * Inlining this routine *hurt* performance a little because more MMR
+ * code was kicked out of the cache.
+ *
+ *************************************************************************/
+
+ int end_pos; /* pixel-index of rightmost pixel in run */
+ int start_index; /* byte-index of first byte in run */
+ BYTE *left_p; /* ptr to byte containing leftmost pixel in run */
+ BYTE *right_p; /* ptr to byte containing rightmost pixel in run */
+
+ end_pos = start_pos + run_len - 1;
+
+ if (end_pos >= row_len)
+ end_pos = row_len - 1;
+
+ start_index = start_pos >> 4;
+
+ if ((end_pos >> 4) == start_index) {
+ /* the run is contained within an even-aligned 2-byte word */
+ ((USHORT*)buf_p)[start_index] |=
+ runs_array [((start_pos & 15)<<4) | (end_pos & 15)];
+ } else if (end_pos > start_pos) {
+ /* the run spans two or more bytes */
+ left_p = buf_p + (start_pos >> 3);
+ right_p = buf_p + (end_pos >> 3);
+
+ *left_p |= (BYTE )0xFFu >> (UINT)( start_pos & 7u );
+ *right_p = (BYTE )0xFFu << (UINT)(7u - (end_pos & 7u));
+ left_p++;
+
+ while (left_p < right_p)
+ *left_p++ = 0xFFu;
+ }
+}
+
+
+/*****************************************************************************
+ * *
+ * DECODING ROW-DATA *
+ * *
+ *****************************************************************************
+
+
+ Interface into this section:
+
+ decode_row_init - inits instance-vars for this section
+ decode_row_1d - parses a row of 1-dim data
+ decode_row_2d - parses a row of 2-dim data
+
+ The parsing routines return these bit-values:
+
+ IP_PRODUCED_ROW
+ IP_INPUT_ERROR
+ DECODE_HIT_EOL (defined below, not in the public interface)
+ DECODE_HIT_FILL (ditto)
+
+ A return-value of zero (ie, none of the above bits are set) means that the
+ routine wants to be called again with more input-bytes.
+
+ These routines fetch input by calling BITS_LOAD, so bits_init and
+ bits_buf_open must have already been called.
+*/
+
+#define DECODE_HIT_EOL 0x4000u
+#define DECODE_HIT_FILL 0x8000u
+
+
+/*____________________________________________________________________________
+ | | |
+ | decode_row_init | inits instance-variables for this section |
+ |_________________|__________________________________________________________|
+*/
+static void decode_row_init (DEC_INST *g)
+{
+ g->pixel_pos = 0;
+ g->white = 0xFFu; /* start with a white run */
+ g->state_2d = NORMAL_2D;
+ g->a0 = -1; /* pixel before 1st is an imaginary white pixel */
+ g->got_black = FALSE; /* haven't gotten any black pixels */
+}
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | decode_row_1d | Decodes a row of MH (1-dimensional G3) data |
+ |_______________|____________________________________________________________|
+*/
+static UINT decode_row_1d (
+ DEC_INST *g, /* in: pointer to our instance-variables */
+ BYTE *pbPrevOutBuf, /* in: prev output row (for error-handling) */
+ BYTE *pbOutBuf) /* out: output buf */
+{
+ int run_len; /* # pixels in current run */
+ UINT white;
+ int pixel_pos;
+ UINT result;
+ UINT ret_val = 0; /* init to zap a compiler warning */
+ int index_length;
+ const BYTE *index_tbl_p;
+ const USHORT *value_tbl_p;
+
+ if (g->pixel_pos == 0) {
+ memset (pbOutBuf, 0, g->bytes_in_row); /* set whole row to white */
+ g->ref_row_invalid = TRUE;
+ }
+
+ white = (UINT)(int )(signed char)g->white; /* must be all 0's or all 1's */
+ pixel_pos = g->pixel_pos;
+
+ while (TRUE) {
+
+ if (white) {
+ index_length = MAX_WHITE_CODELEN;
+ index_tbl_p = fax_white_huff_index;
+ value_tbl_p = fax_white_huff;
+ } else {
+ index_length = MAX_BLACK_CODELEN;
+ index_tbl_p = fax_black_huff_index;
+ value_tbl_p = fax_black_huff;
+ }
+
+ PARSE_CODE (g, index_length, index_tbl_p, value_tbl_p, result, run_len);
+ PRINT (_T("pc result=%d, len=%d\n"), result, run_len);
+
+ if (result == RET_GOT_CODE) {
+ /* todo: below, we call set_run for EVERY make-up code (slow) */
+ if (! white) {
+ set_run (pbOutBuf, pixel_pos, run_len, g->row_len);
+ g->got_black = TRUE;
+ }
+
+ pixel_pos += run_len;
+ if (run_len <= 63) /* this is a final run (not a make-up) */
+ white = ~white;
+ continue; /* go to top of main 'while' loop */
+ }
+
+ switch (result) { /* handle unusual condition */
+
+ case RET_NEED_MORE:
+ ret_val = 0;
+ goto bail_out;
+ break;
+
+ case RET_BAD_CODE:
+ memcpy (pbOutBuf, pbPrevOutBuf, g->bytes_in_row);
+ ret_val = IP_PRODUCED_ROW | IP_INPUT_ERROR;
+ goto bail_out;
+ break;
+
+ case RET_FILL:
+ case RET_HIT_EOL:
+ ret_val = result==RET_FILL ? DECODE_HIT_FILL : DECODE_HIT_EOL;
+ if (pixel_pos == 0)
+ goto bail_out;
+ if (pixel_pos == g->row_len) {
+ ret_val |= IP_PRODUCED_ROW;
+ g->ref_row_invalid = FALSE;
+ goto bail_out;
+ }
+ memcpy (pbOutBuf, pbPrevOutBuf, g->bytes_in_row);
+ ret_val |= IP_PRODUCED_ROW | IP_INPUT_ERROR;
+ goto bail_out;
+ break;
+
+ default:
+ assert (FALSE);
+ } /* end of switch */
+ } /* end of while */
+
+ bail_out:
+
+ g->white = white;
+ g->pixel_pos = pixel_pos;
+
+ return ret_val;
+}
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | decode_row_2d | Decodes a row of MR/MMR (2-dimensional) data |
+ |_______________|____________________________________________________________|
+*/
+static UINT decode_row_2d (
+ DEC_INST *g, /* in: pointer to our instance-variables */
+ BYTE *pbPrevBuf, /* in: prev output row ("reference row") */
+ BYTE *pbOutBuf) /* out: output buffer */
+{
+ UINT group4;
+ int iAction;
+ UINT white;
+ UINT result = 0; /* the 0 eliminates a compiler warning */
+ int row_len;
+ int run_len;
+ int a0, a1;
+ int b1=0, b2; /* the 0 eliminates a compiler warning */
+ UINT need_b0;
+ UINT ret_val = 0; /* the 0 eliminates a compiler warning */
+
+ group4 = (g->input_format == IP_FAX_MMR);
+ row_len = g->row_len;
+ white = (UINT)(int)(signed char)g->white; /* must be all 0's or all 1's so sign extend */
+ a0 = g->a0;
+
+ if (a0 < 0) {
+ memset (pbOutBuf, 0, g->bytes_in_row); /* set whole row to white */
+ pbPrevBuf[g->bytes_in_row] = 0x55u; /* scan_to requires this */
+ }
+
+ while (TRUE) {
+
+ /****************************************/
+ /* Process a usual code -- normal state */
+ /****************************************/
+
+ need_b0 = TRUE;
+
+ while (g->state_2d == NORMAL_2D) {
+
+ if (a0>=row_len && group4) {
+ /* ret_val = IP_PRODUCED_ROW; goto bail_out;
+ * todo: undelete the line above? */
+ if (a0 == row_len) ret_val = IP_PRODUCED_ROW;
+ else ret_val = IP_INPUT_ERROR;
+ goto bail_out;
+ }
+
+ PARSE_CODE (g, MAX_VERT_CODELEN, fax_vert_huff_index,
+ fax_vert_huff, result, iAction);
+ if (result != RET_GOT_CODE)
+ goto unusual_condition;
+
+ if (iAction == HORIZ_MODE) {
+ g->state_2d = HORIZ_1ST;
+ break;
+ }
+
+ if (a0 < 0) {
+ a0 = 0;
+ b1 = -1; /* a kludge so scan below will start at pixel 0 */
+ } else if (need_b0)
+ b1 = scan_to (white, pbPrevBuf, a0, row_len);
+
+ b1 = scan_to (~white, pbPrevBuf, b1+1, row_len);
+
+ if (iAction <= LAST_VERT) { /* vertical mode */
+ iAction -= 3;
+ a1 = b1 + iAction;
+ need_b0 = (iAction<-1 || iAction>0);
+ if (! white) {
+ set_run (pbOutBuf, a0, a1-a0, row_len);
+ g->got_black = TRUE;
+ }
+ if (a1<a0 || a1>row_len) goto corrupt;
+ a0 = a1;
+ white = ~white;
+ } else { /* pass mode */
+ b2 = scan_to (white, pbPrevBuf, b1+1, row_len);
+ if (! white) {
+ set_run (pbOutBuf, a0, b2-a0, row_len);
+ g->got_black = TRUE;
+ }
+ need_b0 = FALSE;
+ a0 = b2;
+ b1 = b2;
+ }
+ } /* while NORMAL_2D */
+
+ /*******************************************/
+ /* Process a usual code -- horizontal mode */
+ /*******************************************/
+
+ while (TRUE) { /* HORIZ_1ST or HORIZ_2ND */
+ int index_length;
+ const BYTE *index_tbl_p;
+ const USHORT *value_tbl_p;
+
+ do {
+ if (white) {
+ index_length = MAX_WHITE_CODELEN;
+ index_tbl_p = fax_white_huff_index;
+ value_tbl_p = fax_white_huff;
+ } else {
+ index_length = MAX_BLACK_CODELEN;
+ index_tbl_p = fax_black_huff_index;
+ value_tbl_p = fax_black_huff;
+ }
+
+ PARSE_CODE (g, index_length, index_tbl_p, value_tbl_p,
+ result, run_len);
+
+ if (result != RET_GOT_CODE)
+ goto unusual_condition;
+ if (a0 < 0) /* Exception: See Fascicle VII.3, */
+ a0 = 0; /* rec T.4, section 4.2.1.3.4 */
+ /* todo: below, we call set_run for EVERY make-up code (slow) */
+ if (! white) {
+ set_run (pbOutBuf, a0, run_len, row_len);
+ g->got_black = TRUE;
+ }
+ a0 += run_len;
+ } while (run_len > 63);
+
+ white = ~white;
+ if (g->state_2d == HORIZ_1ST)
+ g->state_2d = HORIZ_2ND;
+ else {
+ g->state_2d = NORMAL_2D;
+ if (a0 > row_len) goto corrupt;
+ break; /* exit while */
+ }
+ }
+
+ continue; /* no unusual condition, so resume main while loop */
+
+ /*****************************/
+ /* Handle unusual conditions */
+ /*****************************/
+
+ corrupt:
+ result = RET_BAD_CODE;
+
+ unusual_condition:
+
+ switch (result) {
+
+ case RET_GOT_CODE:
+ /* normal case: was handled in the block of code above */
+ break;
+
+ case RET_NEED_MORE:
+ ret_val = 0;
+ goto bail_out;
+ break;
+
+ case RET_BAD_CODE:
+ g->state_2d = NORMAL_2D;
+ memcpy (pbOutBuf, pbPrevBuf, g->bytes_in_row);
+ ret_val = IP_PRODUCED_ROW | IP_INPUT_ERROR;
+ g->ref_row_invalid = TRUE;
+ goto bail_out;
+ break;
+
+ case RET_FILL:
+ case RET_HIT_EOL:
+ ret_val = result==RET_FILL ? DECODE_HIT_FILL : DECODE_HIT_EOL;
+ g->state_2d = NORMAL_2D;
+
+ if (group4) {
+ /* We should only hit EOL when no row-data is present */
+ /* todo: Always report error if fill-zeroes were seen? */
+ if (a0 >= 0)
+ ret_val |= IP_INPUT_ERROR;
+ } else {
+ if (!g->ref_row_invalid && a0==row_len)
+ ret_val |= IP_PRODUCED_ROW;
+ else if (a0 >= 0) {
+ memcpy (pbOutBuf, pbPrevBuf, g->bytes_in_row);
+ ret_val |= IP_PRODUCED_ROW | IP_INPUT_ERROR;
+ g->ref_row_invalid = TRUE;
+ }
+ }
+ goto bail_out;
+ break;
+
+ default:
+ assert (FALSE);
+
+ } /* end of switch to handle unusual condition */
+ } /* end of while */
+
+ bail_out:
+
+ /* save variables needed in next call */
+ g->a0 = a0;
+ g->white = white;
+
+ return ret_val;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * faxDecode_openXform - Creates a new instance of the transformer
+ *
+ *****************************************************************************
+ *
+ * This returns a handle for the new instance to be passed into
+ * all subsequent calls.
+ *
+ * Return value: IP_DONE=success; IP_FATAL_ERROR=misc error.
+ *
+\*****************************************************************************/
+
+static WORD faxDecode_openXform (
+ IP_XFORM_HANDLE *pXform) /* out: returned handle */
+{
+ PDEC_INST g;
+
+ initRunArray();
+ INSURE (pXform != NULL);
+ IP_MEM_ALLOC (sizeof(DEC_INST), g);
+ *pXform = g;
+ memset (g, 0, sizeof(DEC_INST));
+ g->dwValidChk = CHECK_VALUE;
+
+ bits_init (g);
+ decode_row_init (g);
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * faxDecode_setDefaultInputTraits - Specifies default input image traits
+ *
+ *****************************************************************************
+ *
+ * The header of the file-type handled by the transform probably does
+ * not include *all* the image traits we'd like to know. Those not
+ * specified in the file-header are filled in from info provided by
+ * this routine.
+ *
+ * Return value: IP_DONE=success; IP_FATAL_ERROR=misc error.
+ *
+\*****************************************************************************/
+
+static WORD faxDecode_setDefaultInputTraits (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ PIP_IMAGE_TRAITS pTraits) /* in: default image traits */
+{
+ PDEC_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ /* Insure that values we actually use or care about are known */
+ INSURE (pTraits->iPixelsPerRow > 0); /* we need the row-length */
+ INSURE (pTraits->iBitsPerPixel == 1); /* image must be bi-level */
+
+ g->traits = *pTraits; /* a structure copy */
+
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * faxDecode_setXformSpec - Provides xform-specific information
+ *
+\*****************************************************************************/
+
+static WORD faxDecode_setXformSpec (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD_OR_PVOID aXformInfo[]) /* in: xform information */
+{
+ PDEC_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+ g->input_format = (BYTE)aXformInfo[IP_FAX_FORMAT].dword;
+ g->no_eols = (BOOL)aXformInfo[IP_FAX_NO_EOLS].dword;
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * faxDecode_getHeaderBufSize- Returns size of input buf needed to hold header
+ *
+\*****************************************************************************/
+
+static WORD faxDecode_getHeaderBufSize (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD *pdwInBufLen) /* out: buf size for parsing header */
+{
+ /* since input is raw pixels, there is no header, so set it to zero */
+ *pdwInBufLen = 0;
+ return IP_DONE;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * faxDecode_getActualTraits - Parses header, and returns input & output traits
+ *
+ *****************************************************************************
+ *
+ * There is no header, so this routine merely computes some stuff
+ *
+\*****************************************************************************/
+
+static WORD faxDecode_getActualTraits (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD dwInputAvail, /* in: # avail bytes in input buf */
+ PBYTE pbInputBuf, /* in: ptr to input buffer */
+ PDWORD pdwInputUsed, /* out: # bytes used from input buf */
+ PDWORD pdwInputNextPos,/* out: file-pos to read from next */
+ PIP_IMAGE_TRAITS pInTraits, /* out: input image traits */
+ PIP_IMAGE_TRAITS pOutTraits) /* out: output image traits */
+{
+ PDEC_INST g;
+ int inBytes;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ /* Since there is no header, we'll report no usage of input */
+
+ *pdwInputUsed = 0;
+ *pdwInputNextPos = 0;
+
+ /* Since we don't change traits, just copy out the default traits */
+
+ *pInTraits = g->traits;
+ *pOutTraits = g->traits;
+
+ /* Compute some stuff */
+
+ g->row_len = g->traits.iPixelsPerRow; /* todo: zap redundant var */
+ g->bytes_in_row = inBytes = (g->row_len+7) / 8;
+ g->two_dim = (g->input_format == IP_FAX_MMR);
+
+ /* For MH and MR: Discard bits before the first EOL */
+ g->flushing_to_eol = ! g->two_dim;
+
+ /* allocate the prior-row buffer */
+
+ if (g->prior_p != NULL)
+ IP_MEM_FREE (g->prior_p);
+ IP_MEM_ALLOC (inBytes, g->prior_p);
+ memset (g->prior_p, 0, inBytes);
+
+ return IP_DONE | IP_READY_FOR_DATA;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/****************************************************************************\
+ *
+ * faxDecode_getActualBufSizes - Returns buf sizes needed for remainder of job
+ *
+\****************************************************************************/
+
+static WORD faxDecode_getActualBufSizes (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ PDWORD pdwMinInBufLen, /* out: min input buf size */
+ PDWORD pdwMinOutBufLen) /* out: min output buf size */
+{
+ PDEC_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+ *pdwMinInBufLen = 1;
+ *pdwMinOutBufLen = g->bytes_in_row;
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * faxDecode_convert - the work-horse routine
+ *
+\*****************************************************************************/
+
+static WORD faxDecode_convert (
+ IP_XFORM_HANDLE hXform,
+ DWORD dwInputAvail, /* in: # avail bytes in in-buf */
+ PBYTE pbInputBuf, /* in: ptr to in-buffer */
+ PDWORD pdwInputUsed, /* out: # bytes used from in-buf */
+ PDWORD pdwInputNextPos, /* out: file-pos to read from next */
+ DWORD dwOutputAvail, /* in: # avail bytes in out-buf */
+ PBYTE pbOutputBuf, /* in: ptr to out-buffer */
+ PDWORD pdwOutputUsed, /* out: # bytes written in out-buf */
+ PDWORD pdwOutputThisPos) /* out: file-pos to write the data */
+{
+ PDEC_INST g;
+ UINT bit;
+ UINT ret_val; /* return-value of this function */
+
+ HANDLE_TO_PTR (hXform, g);
+
+ *pdwOutputUsed = 0;
+
+ if (dwInputAvail==0 && BITS_IN_CACHE(g)<MAX_CODE_LEN) {
+ /* We're being told to flush; indicate we're done. */
+ /* Our only buffer is the cache */
+ *pdwInputUsed = 0;
+ *pdwInputNextPos = g->dwInNextPos;
+ *pdwOutputThisPos = g->dwOutNextPos;
+ return IP_DONE;
+ }
+
+ if (g->toss_everything) {
+ *pdwInputUsed = dwInputAvail;
+ *pdwInputNextPos = g->dwInNextPos = g->dwInNextPos + dwInputAvail;
+ *pdwOutputThisPos = g->dwOutNextPos;
+ return IP_READY_FOR_DATA;
+ }
+
+ bits_buf_open (g, pbInputBuf, dwInputAvail);
+
+ if (g->flushing_to_eol) {
+ ret_val = bits_flush_to_eol(g, g->got_fill,
+ (BOOL)(g->input_format==IP_FAX_MR))
+ ? DECODE_HIT_EOL : 0;
+ } else {
+ if (g->two_dim) ret_val = decode_row_2d(g, g->prior_p, pbOutputBuf);
+ else ret_val = decode_row_1d(g, g->prior_p, pbOutputBuf);
+ PRINT (_T("decoder returned %x\n"), ret_val, 0);
+ }
+
+ if (ret_val & IP_INPUT_ERROR) {
+ if (g->input_format == IP_FAX_MMR) {
+ bits_flush (g);
+ g->toss_everything = TRUE;
+ /* This isn't fatal any more. We merely toss all following data */
+ /* ret_val |= IP_INPUT_ERROR; */
+ } else {
+ g->flushing_to_eol = TRUE;
+ g->num_eols = 0;
+ }
+ }
+
+ if (ret_val & IP_PRODUCED_ROW) {
+ if (g->got_black) ret_val |= NONWHITE_ROW | IP_CONSUMED_ROW;
+ else ret_val |= WHITE_ROW | IP_CONSUMED_ROW;
+ *pdwOutputUsed = g->bytes_in_row;
+ memcpy (g->prior_p, pbOutputBuf, g->bytes_in_row);
+ decode_row_init (g);
+ g->num_eols = 0; /* ignore all EOLs before the row */
+ }
+
+ if (ret_val & DECODE_HIT_FILL) {
+ g->flushing_to_eol = TRUE;
+ g->got_fill = TRUE;
+ }
+
+ if (ret_val & DECODE_HIT_EOL) {
+ if (g->input_format == IP_FAX_MR) {
+ /* read the tag-bit for 1-dim/2-dim */
+ BITS_LOAD (g, 1, bit)
+ g->two_dim = (bit == 0);
+ BITS_ADVANCE (g, 1)
+ }
+
+ decode_row_init (g);
+ g->flushing_to_eol = FALSE;
+ g->got_fill = FALSE;
+ g->num_eols += 1;
+
+ if (g->num_eols>=EOLS_FOR_MH_MR ||
+ (g->input_format==IP_FAX_MMR && g->num_eols>=EOLS_FOR_MMR)) {
+ /* WE HIT END OF PAGE */
+ g->num_eols = 0;
+ bits_flush (g);
+ ret_val |= IP_NEW_OUTPUT_PAGE;
+ }
+ }
+
+ *pdwInputUsed = bits_buf_close (g);
+ g->dwInNextPos += *pdwInputUsed;
+ *pdwInputNextPos = g->dwInNextPos;
+
+ *pdwOutputUsed = (ret_val & IP_PRODUCED_ROW) ? g->bytes_in_row : 0;
+ *pdwOutputThisPos = g->dwOutNextPos;
+ g->dwOutNextPos += *pdwOutputUsed;
+
+#if 0
+ {
+ int i;
+ for (i=0; i<*pdwInputUsed; i++)
+ PRINT (_T("%02x "), pbInputBuf[i], 0);
+ }
+#endif
+
+ return (ret_val | IP_READY_FOR_DATA)
+ & (IP_CONSUMED_ROW | IP_PRODUCED_ROW | IP_READY_FOR_DATA |
+ /* NONWHITE_ROW | WHITE_ROW | */
+ IP_NEW_OUTPUT_PAGE |
+ IP_INPUT_ERROR | IP_FATAL_ERROR);
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * faxDecode_insertedData - client inserted into our output stream
+ *
+\*****************************************************************************/
+
+static WORD faxDecode_insertedData (
+ IP_XFORM_HANDLE hXform,
+ DWORD dwNumBytes)
+{
+ fatalBreakPoint ();
+ return IP_FATAL_ERROR; /* must never be called (can't insert data) */
+}
+
+
+
+/*****************************************************************************\
+ *
+ * faxDecode_newPage - Tells us to flush this page, and start a new page
+ *
+\*****************************************************************************/
+
+static WORD faxDecode_newPage (
+ IP_XFORM_HANDLE hXform)
+{
+ PDEC_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+ /* todo: flush bits until we see a page boundary */
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+
+}
+
+
+
+/*****************************************************************************\
+ *
+ * faxDecode_closeXform - Destroys this instance
+ *
+\*****************************************************************************/
+
+static WORD faxDecode_closeXform (IP_XFORM_HANDLE hXform)
+{
+ PDEC_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ if (g->prior_p != NULL)
+ IP_MEM_FREE (g->prior_p);
+
+ g->dwValidChk = 0;
+ IP_MEM_FREE (g); /* free memory for the instance */
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * faxDecodeTbl - Jump-table for Decoder
+ *
+\*****************************************************************************/
+
+IP_XFORM_TBL faxDecodeTbl = {
+ faxDecode_openXform,
+ faxDecode_setDefaultInputTraits,
+ faxDecode_setXformSpec,
+ faxDecode_getHeaderBufSize,
+ faxDecode_getActualTraits,
+ faxDecode_getActualBufSizes,
+ faxDecode_convert,
+ faxDecode_newPage,
+ faxDecode_insertedData,
+ faxDecode_closeXform
+};
+
+
+
+
+/*
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+@ @
+@ T A B L E S F O R D E C O D E R @
+@ @
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+*/
+
+
+
+const USHORT fax_white_huff[105] = { 0,
+ 0x4002, 0x4003, 0x4004, 0x4005, 0x4006, 0x4007, 0x500a, 0x500b,
+ 0x5080, 0x5008, 0x5009, 0x5040, 0x600d, 0x6001, 0x600c, 0x60c0,
+ 0x6680, 0x6010, 0x6011, 0x600e, 0x600f, 0x7016, 0x7017, 0x7014,
+ 0x7013, 0x701a, 0x7015, 0x701c, 0x701b, 0x7012, 0x7018, 0x7019,
+ 0x7100, 0x801d, 0x801e, 0x802d, 0x802e, 0x802f, 0x8030, 0x8021,
+ 0x8022, 0x8023, 0x8024, 0x8025, 0x8026, 0x801f, 0x8020, 0x8035,
+ 0x8036, 0x8027, 0x8028, 0x8029, 0x802a, 0x802b, 0x802c, 0x803d,
+ 0x803e, 0x803f, 0x8000, 0x8140, 0x8180, 0x803b, 0x803c, 0x8031,
+ 0x8032, 0x8033, 0x8034, 0x8037, 0x8038, 0x8039, 0x803a, 0x81c0,
+ 0x8200, 0x8280, 0x8240, 0x95c0, 0x9600, 0x9640, 0x96c0, 0x92c0,
+ 0x9300, 0x9340, 0x9380, 0x93c0, 0x9400, 0x9440, 0x9480, 0x94c0,
+ 0x9500, 0x9540, 0x9580, 0xb700, 0xb740, 0xb780, 0xc7c0, 0xc800,
+ 0xc840, 0xc880, 0xc8c0, 0xc900, 0xc940, 0xc980, 0xc9c0, 0xca00,
+};
+
+
+const BYTE fax_white_huff_index[4096] = {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 92, 92, 95, 96, 97, 98, 99, 100, 93, 93, 94, 94, 101, 102, 103, 104,
+ 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
+ 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
+ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
+ 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
+ 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+ 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
+ 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62,
+ 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63,
+ 76, 76, 76, 76, 76, 76, 76, 76, 77, 77, 77, 77, 77, 77, 77, 77,
+ 78, 78, 78, 78, 78, 78, 78, 78, 79, 79, 79, 79, 79, 79, 79, 79,
+ 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
+ 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31,
+ 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
+ 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66,
+ 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
+ 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 80, 80, 80, 80, 80, 80, 80, 80, 81, 81, 81, 81, 81, 81, 81, 81,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75,
+ 82, 82, 82, 82, 82, 82, 82, 82, 83, 83, 83, 83, 83, 83, 83, 83,
+ 84, 84, 84, 84, 84, 84, 84, 84, 85, 85, 85, 85, 85, 85, 85, 85,
+ 86, 86, 86, 86, 86, 86, 86, 86, 87, 87, 87, 87, 87, 87, 87, 87,
+ 88, 88, 88, 88, 88, 88, 88, 88, 89, 89, 89, 89, 89, 89, 89, 89,
+ 90, 90, 90, 90, 90, 90, 90, 90, 91, 91, 91, 91, 91, 91, 91, 91,
+ 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+ 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+ 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+ 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+};
+
+
+const USHORT fax_black_huff[105] = { 0,
+ 0x2003, 0x2002, 0x3001, 0x3004, 0x4006, 0x4005, 0x5007, 0x6009,
+ 0x6008, 0x700a, 0x700b, 0x700c, 0x800d, 0x800e, 0x900f, 0xa012,
+ 0xa040, 0xa010, 0xa011, 0xa000, 0xb700, 0xb740, 0xb780, 0xb018,
+ 0xb019, 0xb017, 0xb016, 0xb013, 0xb014, 0xb015, 0xc7c0, 0xc800,
+ 0xc840, 0xc880, 0xc8c0, 0xc900, 0xc940, 0xc980, 0xc9c0, 0xca00,
+ 0xc034, 0xc037, 0xc038, 0xc03b, 0xc03c, 0xc140, 0xc180, 0xc1c0,
+ 0xc035, 0xc036, 0xc032, 0xc033, 0xc02c, 0xc02d, 0xc02e, 0xc02f,
+ 0xc039, 0xc03a, 0xc03d, 0xc100, 0xc030, 0xc031, 0xc03e, 0xc03f,
+ 0xc01e, 0xc01f, 0xc020, 0xc021, 0xc028, 0xc029, 0xc080, 0xc0c0,
+ 0xc01a, 0xc01b, 0xc01c, 0xc01d, 0xc022, 0xc023, 0xc024, 0xc025,
+ 0xc026, 0xc027, 0xc02a, 0xc02b, 0xd280, 0xd2c0, 0xd300, 0xd340,
+ 0xd500, 0xd540, 0xd580, 0xd5c0, 0xd600, 0xd640, 0xd680, 0xd6c0,
+ 0xd200, 0xd240, 0xd380, 0xd3c0, 0xd400, 0xd440, 0xd480, 0xd4c0,
+};
+
+
+const BYTE fax_black_huff_index[8192] = {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 21, 21, 21, 21, 31, 31, 32, 32, 33, 33, 34, 34, 35, 35, 36, 36,
+ 22, 22, 22, 22, 23, 23, 23, 23, 37, 37, 38, 38, 39, 39, 40, 40,
+ 16, 16, 16, 16, 16, 16, 16, 16, 41, 41, 85, 86, 87, 88, 42, 42,
+ 43, 43, 89, 90, 91, 92, 44, 44, 45, 45, 93, 94, 24, 24, 24, 24,
+ 25, 25, 25, 25, 95, 96, 46, 46, 47, 47, 48, 48, 97, 98, 49, 49,
+ 50, 50, 99, 100, 101, 102, 103, 104, 17, 17, 17, 17, 17, 17, 17, 17,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 26, 26, 26, 26, 51, 51, 52, 52, 53, 53, 54, 54, 55, 55, 56, 56,
+ 57, 57, 58, 58, 59, 59, 60, 60, 18, 18, 18, 18, 18, 18, 18, 18,
+ 19, 19, 19, 19, 19, 19, 19, 19, 61, 61, 62, 62, 63, 63, 64, 64,
+ 65, 65, 66, 66, 67, 67, 68, 68, 69, 69, 70, 70, 27, 27, 27, 27,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 71, 71, 72, 72, 73, 73, 74, 74, 75, 75, 76, 76, 28, 28, 28, 28,
+ 29, 29, 29, 29, 77, 77, 78, 78, 79, 79, 80, 80, 81, 81, 82, 82,
+ 30, 30, 30, 30, 83, 83, 84, 84, 20, 20, 20, 20, 20, 20, 20, 20,
+ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+};
+
+
+const USHORT fax_vert_huff[10] = { 0,
+ 0x1003, 0x3008, 0x3002, 0x3004, 0x4007, 0x6001, 0x6005, 0x7000,
+ 0x7006,
+};
+
+
+const BYTE fax_vert_huff_index[128] = {
+ 0, 0, 8, 9, 6, 6, 7, 7, 5, 5, 5, 5, 5, 5, 5, 5,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+};
+
+/* End of File */
diff --git a/ip/xform.h b/ip/xform.h
new file mode 100644
index 0000000..4ce4829
--- /dev/null
+++ b/ip/xform.h
@@ -0,0 +1,340 @@
+/* libhpojip -- HP OfficeJet image-processing library. */
+
+/* Copyright (C) 1995-2002 Hewlett-Packard Company
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ * MA 02111-1307, USA.
+ *
+ * In addition, as a special exception, Hewlett-Packard Company
+ * gives permission to link the code of this program with any
+ * version of the OpenSSL library which is distributed under a
+ * license identical to that listed in the included LICENSE.OpenSSL
+ * file, and distribute linked combinations including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * this file, you may extend this exception to your version of the
+ * file, but you are not obligated to do so. If you do not wish to
+ * do so, delete this exception statement from your version.
+ */
+
+/* Original author: Mark Overton and others.
+ *
+ * Ported to Linux by David Paschal.
+ */
+
+/* xform.h - Interface into the transform drivers
+ *
+ * Mark Overton, Jan 2000 - Extracted from hpojip.h
+ */
+
+#if ! defined XFORM_H_INC
+#define XFORM_H_INC
+
+
+/*****************************************************************************\
+ *****************************************************************************
+ *
+ * TRANSFORM DRIVER interface
+ *
+ *****************************************************************************
+\*****************************************************************************/
+
+
+/* In some ways, this driver interface is very similar to the main ip
+ * interface. Please don't get them confused.
+ *
+ * One of the parameters of the ipOpen function is an array of structures.
+ * Each such structure defines a transform, and contains, among other things,
+ * a pointer to a jump-table for the transform-driver. The jump-table is
+ * a structure containing function-pointers for all the driver's functions.
+ * These functions and the jump-table are defined below.
+ *
+ * Function Call Order
+ *
+ * openXform;
+ * setDefaultInputTraits, setXformSpec, getHeaderBufSize (any order);
+ * getActualTraits (possibly multiple calls);
+ * getActualBufSizes;
+ * convert, insertedData, newPage (usually multiple calls);
+ * closeXform.
+ *
+ * Raw Data Format
+ *
+ * A decoder outputs raw data, an encoder inputs raw data, and all data passed
+ * between xforms consists of raw data.
+ * Such raw raster data consists of fixed-length raster rows of packed pixels.
+ * The pixels are packed as follows:
+ *
+ * bi-level: 8 pixels/byte, left pixel in msb, 0=white, 1=black.
+ * 4-bit gray: 2 pixels/byte, left pixel in hi nibble, 0=black, 15=white.
+ * 8-bit gray: 1 pixel/byte, 0=black, 255=white.
+ * color: three bytes per pixel, in some color space.
+ *
+ * Driver Documentation
+ *
+ * The .c file for an xform driver starts with a comment-section documenting
+ * the following items:
+ *
+ * - the capabilities of the driver, and its limitations.
+ * - the name of the global jump-table (of type IP_XFORM_TBL).
+ * - what should be put in the aXformInfo array passed to setXformSpec.
+ * - which items in default input traits are ignored versus used.
+ * - what the output image traits are.
+ *
+ * Note that image traits, such as pixels per row, should *not* be put in
+ * aXformInfo because such info is provided by setDefaultInputTraits.
+ * Things like the JPEG quality-factor should be in aXformInfo.
+ *
+ * An xform driver is allowed to overrun its input or output buffer by
+ * up to 12 bytes. This is allowed because some image processing algorithms
+ * are faster if they operate on multiple pixels at a time, which will cause
+ * them to read or write a little past the end of the buffer. Reading or
+ * writing before the beginning of a buffer is not allowed.
+ */
+
+
+typedef void* IP_XFORM_HANDLE; /* handle for an xform driver */
+
+
+/* IP_XFORM_TBL - Jump-table for a transform driver (all the entry points)
+ */
+typedef struct IP_XFORM_TBL_s {
+
+ /* openXform - Creates a new instance of the transformer
+ *
+ * This returns a handle for the new instance to be passed into
+ * all subsequent calls.
+ *
+ * Return value: IP_DONE=success; IP_FATAL_ERROR=misc error.
+ */
+ WORD (*openXform) (
+ IP_XFORM_HANDLE *pXform); /* out: returned handle */
+
+
+ /* setDefaultInputTraits - Specifies default input image traits
+ *
+ * The header of the file-type handled by the transform probably does
+ * not include *all* the image traits we'd like to know. Those not
+ * specified in the file-header are filled in from info provided by
+ * this routine.
+ *
+ * Return value: IP_DONE=success; IP_FATAL_ERROR=misc error.
+ */
+ WORD (*setDefaultInputTraits) (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ PIP_IMAGE_TRAITS pTraits); /* in: default image traits */
+
+
+ /* setXformSpec - Provides xform-specific information
+ *
+ * The aXformInfo array provides the transform-specific info.
+ * For example, for a scaling transform, this array would contain
+ * the horizontal and vertical scaling factors and possibly additional
+ * info about whether to scale quickly by simple pixel-replication.
+ * For a JPEG-encode transform, the array would contain the quality
+ * factor and subsampling information.
+ *
+ * Each transform documents what it needs in aXformInfo.
+ *
+ * Return value: IP_DONE=success; IP_FATAL_ERROR=misc error.
+ */
+ WORD (*setXformSpec) (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD_OR_PVOID aXformInfo[]); /* in: xform information */
+
+
+ /* getHeaderBufSize- Returns size of input buf needed to hold header
+ *
+ * Returns size of input buffer that's guaranteed to hold the file
+ * header. If that's too big, the xform code will have to parse the
+ * header across several calls, and return a suitable buffer size.
+ * If there is no header, this function returns 0 in pwInBufLen.
+ *
+ * Return value: IP_DONE=success; IP_FATAL_ERROR=misc error.
+ */
+ WORD (*getHeaderBufSize) (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD *pdwInBufLen); /* out: buf size for parsing header */
+
+
+ /* getActualTraits - Parses header, and returns input & output traits
+ *
+ * This function may need to be called multiple times to parse the
+ * file header. And it can consume input in each call.
+ * Once the header has been parsed, it returns IP_DONE, meaning that
+ * it is not to be called again and that the in-traits and out-traits
+ * structures have been filled in. The output traits are computed based
+ * on the input traits and the xform information provided by setXformSpec.
+ *
+ * See the description of 'convert' below for how the input-buffer
+ * parameters are used. The final value returned in pdwInputNextPos
+ * (where this returns IP_DONE) is the one that applies to the
+ * 'convert' function. This function MUST be called even if there is
+ * no header because you need that pdwInputNextPos value.
+ *
+ * NOTE: In addition to IP_DONE, the IP_READY_FOR_DATA bit must also
+ * be set if the xform will want data on the first call to 'convert'.
+ *
+ * Return value:
+ * 0 = call again with more input,
+ * IP_DONE = normal end (IP_READY_FOR_DATA set if data needed)
+ * IP_INPUT_ERROR = error in input data,
+ * IP_FATAL_ERROR = misc error.
+ */
+ WORD (*getActualTraits) (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD dwInputAvail, /* in: # avail bytes in input buf */
+ PBYTE pbInputBuf, /* in: ptr to input buffer */
+ PDWORD pdwInputUsed, /* out: # bytes used from input buf */
+ PDWORD pdwInputNextPos,/* out: file-pos to read from next */
+ PIP_IMAGE_TRAITS pInTraits, /* out: input image traits */
+ PIP_IMAGE_TRAITS pOutTraits); /* out: output image traits */
+
+
+ /* getActualBufSizes - Returns buf sizes needed for remainder of session
+ *
+ * Since the input and output row-lengths are now known because
+ * getActualTraits has parsed the header, and actual buffer sizes needed
+ * for the remainder of the conversion session can now be fetched.
+ *
+ * Return value: IP_DONE=success; IP_FATAL_ERROR=misc error.
+ */
+ WORD (*getActualBufSizes) (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ PDWORD pwMinInBufLen, /* out: min input buf size */
+ PDWORD pwMinOutBufLen); /* out: min output buf size */
+
+
+ /* convert - The work-horse conversion routine
+ *
+ * This function consumes input data and produces output data via the
+ * input- and output-buffer parameters. And it tells you what's happening
+ * via its function return value.
+ *
+ * On entry, pbInputBuf and wInputAvail specify the location and number of
+ * data-bytes in the input buffer. On return, pwInputUsed tells you how
+ * many of those input bytes were consumed. pdwInputNextPos tells you
+ * where in the input file you should read next for the following call;
+ * 0 is the beginning of the file. This is almost always the current file
+ * position plus pwInputUsed; if not, a file-seek is being requested.
+ *
+ * The output buffer parameters are analogous to the input parameters,
+ * except that pdwOutputThisPos tells you where the bytes just output
+ * should be written in the output file. That is, it applies to *this*
+ * write, not the *next* write, unlike the input arrangement.
+ *
+ * The function return value is a bit-mask that tells you if anything
+ * interesting happened. Multiple bits can be set. This information
+ * should be treated as independent of the data-transfers occuring via
+ * the parameters. The IP_CONSUMED_ROW and IP_PRODUCED_ROW bits can
+ * be used to count how many rows have been input and output.
+ *
+ * The IP_READY_FOR_DATA bit indicates that the next call to 'convert'
+ * definitely will consume data. If this bit is 0, the next call
+ * definitely will NOT consume data. The main converter code that calls
+ * these xform functions uses this ready-for-data info to control the
+ * order of xform calls. The IP_READY_FOR_DATA bit must be set correctly.
+ *
+ * The IP_NEW_INPUT_PAGE bit is set when or after the last row of the
+ * input page has been parsed. It may be a few rows before you get the
+ * corresponding IP_NEW_OUTPUT_PAGE bit.
+ *
+ * The IP_NEW_OUTPUT_PAGE bit is set when or after the last row of the
+ * page has been sent, and before the first row of the following page (if
+ * any) is sent.
+ *
+ * You may wish to insert secret data, such as thumbnails, into the
+ * output stream. When 'convert' returns the IP_WRITE_INSERT_OK bit,
+ * it is giving you permission to write stuff AFTER you write the output
+ * buffer it gave you. After adding your secret data, you must call
+ * insertedData to tell us how many bytes were added.
+ *
+ * When there is no more input data, 'convert' must be called repeatedly
+ * with a NULL pbInputBuf parameter, which tells the xform to flush out
+ * any buffered rows. Keep calling it until it returns the IP_DONE bit.
+ *
+ * Do not call 'convert' again after it has returned either error bit or
+ * IP_DONE.
+ *
+ * If the input or output data consists of fixed-length uncompressed rows,
+ * then it is permissible for the xform to read up to 8 bytes past the
+ * end of the (fixed-length) input row, or to write up to 8 bytes past the
+ * end of the (fixed-length) output row. The caller of the xform routines
+ * allocates at least this many extra overrun-zone bytes so that algorithms
+ * can process pixels multiple-bytes at a time without worrying about
+ * running past the end of the row. These overrun-zone bytes must NOT be
+ * reported by getActualBufSizes, which should report only what's needed
+ * for the actual row-data.
+ *
+ * Return value: Zero or more of these bits may be set:
+ *
+ * IP_CONSUMED_ROW = an input row was parsed
+ * IP_PRODUCED_ROW = an output row was produced
+ * IP_INPUT_ERROR = syntax error in input data
+ * IP_FATAL_ERROR = misc error (internal error or bad param)
+ * IP_NEW_INPUT_PAGE = just finished parsing the input page
+ * IP_NEW_OUTPUT_PAGE = just finished outputting a page
+ * IP_WRITE_INSERT_OK = okay to insert data in output file
+ * IP_DONE = conversion is completed.
+ */
+ WORD (*convert) (
+ IP_XFORM_HANDLE hXform,
+ DWORD dwInputAvail, /* in: # avail bytes in in-buf */
+ PBYTE pbInputBuf, /* in: ptr to in-buffer */
+ PDWORD pdwInputUsed, /* out: # bytes used from in-buf */
+ PDWORD pdwInputNextPos, /* out: file-pos to read from next */
+ DWORD dwOutputAvail, /* in: # avail bytes in out-buf */
+ PBYTE pbOutputBuf, /* in: ptr to out-buffer */
+ PDWORD pdwOutputUsed, /* out: # bytes written in out-buf */
+ PDWORD pdwOutputThisPos); /* out: file-pos to write the data */
+
+
+ /* newPage - Tells xform to flush rest of this page, and start a new page
+ *
+ * Uncompressed input-data formats do not have page-boundary info, so
+ * calling this function between rows fed into 'convert' is how you tell
+ * xform to output a page-boundary. After this is called, 'convert' will
+ * first flush any buffered rows, then return the IP_NEW_OUTPUT_PAGE bit,
+ * and finally start a new page.
+ *
+ * Return value: IP_DONE=success; IP_FATAL_ERROR=misc error.
+ */
+ WORD (*newPage) (IP_XFORM_HANDLE hXform);
+
+
+ /* insertedData - Tells us that bytes were inserted into output stream
+ *
+ * See IP_WRITE_INSERT_OK discussion above. You call this routine to tell
+ * the xform code how many bytes were secretly added to the output stream.
+ *
+ * Return value: IP_DONE=success; IP_FATAL_ERROR=misc error.
+ */
+ WORD (*insertedData) (
+ IP_XFORM_HANDLE hXform,
+ DWORD dwNumBytes);
+
+
+ /* closeXform - destroys instance of xform
+ *
+ * This may be called at any time to remove an instance of the xform.
+ * It deallocates all dynamic memory associated with the xform.
+ *
+ * Return value: IP_DONE=success; IP_FATAL_ERROR=misc error.
+ */
+ WORD (*closeXform)(IP_XFORM_HANDLE hXform);
+
+} IP_XFORM_TBL, *PIP_XFORM_TBL, FAR*LPIP_XFORM_TBL;
+
+#endif
diff --git a/ip/xgamma.c b/ip/xgamma.c
new file mode 100644
index 0000000..4058b91
--- /dev/null
+++ b/ip/xgamma.c
@@ -0,0 +1,760 @@
+/* libhpojip -- HP OfficeJet image-processing library. */
+
+/* Copyright (C) 1995-2002 Hewlett-Packard Company
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ * MA 02111-1307, USA.
+ *
+ * In addition, as a special exception, Hewlett-Packard Company
+ * gives permission to link the code of this program with any
+ * version of the OpenSSL library which is distributed under a
+ * license identical to that listed in the included LICENSE.OpenSSL
+ * file, and distribute linked combinations including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * this file, you may extend this exception to your version of the
+ * file, but you are not obligated to do so. If you do not wish to
+ * do so, delete this exception statement from your version.
+ */
+
+/* Original author: Mark Overton and others.
+ *
+ * Ported to Linux by David Paschal.
+ */
+
+/******************************************************************************\
+ *
+ * xgamma.c - Applies Gamma transform
+ *
+ ******************************************************************************
+ *
+ * Name of Global Jump-Table:
+ *
+ * gammaTbl
+ *
+ * Items in aXformInfo array passed into setXformSpec:
+ *
+ * aXformInfo[0] = gamma value, in 16.16 fixed point
+ *
+ * Capabilities and Limitations:
+ *
+ * Gamma values must range between 0.0 and 3.5.
+ * Only operates on 8-bit grayscale data.
+ * Uses cubic splines for speed.
+ *
+ * Default Input Traits, and Output Traits:
+ *
+ * trait default input output
+ * ------------------- --------------------- ------------------------
+ * iPixelsPerRow * passed into output same as default input
+ * iBitsPerPixel * must be 8 8
+ * iComponentsPerPixel * must be 1 1
+ * lHorizDPI passed into output same as default input
+ * lVertDPI passed into output same as default input
+ * lNumRows passed into output same as default input
+ * iNumPages passed into output same as default input
+ * iPageNum passed into output same as default input
+ *
+ * Above, a "*" by an item indicates it must be valid (not negative).
+ *
+ * Feb 1998 Mark Overton -- ported code to software
+ * early 1997 Mark Overton -- wrote original code for Kodiak firmware
+ *
+\******************************************************************************/
+
+#include "hpip.h"
+#include "ipdefs.h"
+#include "string.h" /* for memset and memcpy */
+
+
+#if 0
+ #include "stdio.h"
+ #define PRINT(msg,arg1,arg2) \
+ fprintf(stderr, msg, (int)arg1, (int)arg2)
+#else
+ #define PRINT(msg,arg1,arg2)
+#endif
+
+#define CHECK_VALUE 0x4ba1dace
+
+
+typedef struct {
+ IP_IMAGE_TRAITS traits; /* traits of the input image */
+ BYTE gammaTable[256]; /* the gamma table */
+ WORD wRowsDone; /* number of rows converted so far */
+ DWORD dwInNextPos; /* file pos for subsequent input */
+ DWORD dwOutNextPos; /* file pos for subsequent output */
+ DWORD dwValidChk; /* struct validity check value */
+} GAM_INST, *PGAM_INST;
+
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | fast_sin fast_cos | fast sine and cosine functions |
+ |___________________|________________________________________________________|
+ | |
+ | Input: Units of angle is fraction of circle (e.g., 1.0 is 360 deg). |
+ | Format is 0.32 fixed-point (i.e., 32 bits of fraction). |
+ | |
+ | Returns: Sine or cosine expressed as 16.16 signed fixed-point. |
+ | |
+ | Accuracy: Max error is 0.000054 (i.e., 14 good bits of fraction). |
+ |____________________________________________________________________________|
+*/
+static long fast_sin (ULONG ang)
+{
+ ULONG ang31, ang30, delta_ang, result;
+ UINT index, base, next;
+
+ /* 90 deg is divided into this many intervals */
+ #define INDEX_BITS 6
+ #define N_INTERVALS (1<<INDEX_BITS)
+ #define HALF_WORST_ERR 3
+
+ static const USHORT sin_table[N_INTERVALS+2] = {
+ 0, 1608, 3216, 4821, 6424, 8022, 9616, 11204,
+ 12785, 14359, 15924, 17479, 19024, 20557, 22078, 23586,
+ 25080, 26558, 28020, 29466, 30893, 32303, 33692, 35062,
+ 36410, 37736, 39040, 40320, 41576, 42806, 44011, 45190,
+ 46341, 47464, 48559, 49624, 50660, 51665, 52639, 53581,
+ 54491, 55368, 56212, 57022, 57798, 58538, 59244, 59914,
+ 60547, 61145, 61705, 62228, 62714, 63162, 63572, 63944,
+ 64277, 64571, 64827, 65043, 65220, 65358, 65457, 65516,
+ 65535, 65535 /* <-- these should be 65536 (won't fit in 16 bits) */
+ };
+
+ /* zero the msb (representing 180 deg), leaving 31 bits */
+ ang31 = (ang << 1) >> 1;
+
+ /* fold angle to first quadrant, leaving 30 bits */
+ ang30 = ang31;
+ if (ang30 >= 0x40000000u)
+ ang30 = 0x80000000u - ang30; /* sin(180-a) = sin(a) */
+
+ index = ang30 >> (30-INDEX_BITS);
+ base = sin_table [index];
+ next = sin_table [index+1];
+ delta_ang = ang30>>(14-INDEX_BITS) & 0x0000ffffu;
+ result = ((next-base)*delta_ang >> 16) + base + HALF_WORST_ERR;
+
+ /* negate result if 180-bit was set in original angle */
+ if ((long)ang < 0)
+ result = (ULONG)(-(long)result);
+
+ return (long)result;
+
+ #undef INDEX_BITS
+ #undef N_INTERVALS
+ #undef HALF_WORST_ERR
+}
+
+
+static /* inline */ int fast_cos (UINT ang)
+{
+ return fast_sin(0x40000000u-ang);
+}
+
+
+#if 0
+
+#include <stdio.h>
+#include <math.h>
+
+void main (void)
+{
+ int i;
+ float err, max_err;
+
+ max_err = 0.0;
+
+ for (i=0; i<=16*65536; i++) {
+ err = sin ((float)i * (2.0*3.1415926535897932384626/(16*65536.0)))
+ - fast_sin(i<<12)/65536.0;
+ if (err < 0) err = -err;
+ if (err > max_err) max_err = err;
+ }
+
+ printf ("max err = %f\n", max_err);
+}
+
+#endif
+
+
+#if 0
+
+#include <stdio.h>
+#include <math.h>
+
+void main (void)
+{
+ int i;
+ float s;
+
+ for (i=0; i<=64; i++) {
+ s = sin ((float)i * (3.1415926535897932384626/(2.0*64.0)));
+ printf ("%5d, ", (int)(s*(1<<16) + 0.5));
+ if (i%8 == 7) puts("");
+ }
+}
+
+#endif
+
+
+
+typedef struct {
+ long a, b, c; /* x = at + bt^2 + ct^3 */
+ long d, e, f; /* y = dt + et^2 + ft^3 */
+} cubic_t;
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | calc_cubic_coeffs | calcs coefficients given start/end angles/velocities |
+ |___________________|________________________________________________________|
+ | |
+ | Units of angle is fraction of circle (e.g., 1.0 is 360 deg). |
+ | Format is 0.32 fixed-point (i.e., 32 bits of fraction). |
+ |____________________________________________________________________________|
+*/
+static void calc_cubic_coeffs (
+ ULONG start_ang,
+ ULONG final_ang,
+ long start_vel, /* velocities are in 16.16 fixed point */
+ long final_vel,
+ cubic_t *p)
+{
+ long start_x, start_y, final_x, final_y;
+
+ /* For both start and final below: vel = vel * 2.0 / (1.0 + cos(ang)),
+ * where vel is 16.16 before calc, and is 20.12 after the calc below.
+ */
+ start_vel = (start_vel<<11) / ((1lu<<14) + (fast_cos(start_ang)>>2));
+ final_vel = (final_vel<<11) / ((1lu<<14) + (fast_cos(final_ang)>>2));
+
+ /* Below: (vel is 20.12) * (cos>>2 is 18.14) yields a 6.26;
+ * the >>10 changes 6.26 into a 16.16.
+ */
+ start_x = start_vel*(fast_cos(start_ang)>>2) >> 10;
+ start_y = start_vel*(fast_sin(start_ang)>>2) >> 10;
+ final_x = final_vel*(fast_cos(final_ang)>>2) >> 10;
+ final_y = final_vel*(fast_sin(final_ang)>>2) >> 10;
+
+ p->a = start_x;
+ p->d = start_y;
+ p->b = (3<<16) - 2*start_x - final_x;
+ p->e = -2*start_y - final_y;
+ p->c = start_x + final_x - (2<<16);
+ p->f = start_y + final_y;
+}
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | transform_cubic | makes cubic end at (x_end,y_end) instead of (1,0) |
+ |_________________|__________________________________________________________|
+*/
+static void transform_cubic (
+ int x_end,
+ int y_end,
+ cubic_t *p)
+{
+ cubic_t q;
+
+ q.a = p->a*x_end - p->d*y_end;
+ q.b = p->b*x_end - p->e*y_end;
+ q.c = p->c*x_end - p->f*y_end;
+
+ q.d = p->a*y_end + p->d*x_end;
+ q.e = p->b*y_end + p->e*x_end;
+ q.f = p->c*y_end + p->f*x_end;
+
+ *p = q;
+}
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | calc_gamma_from_coeffs | calcs gamma table, given the coefficients |
+ |________________________|___________________________________________________|
+*/
+static void calc_gamma_from_coeffs (
+ cubic_t *p, /* in: coefficients of cubic curve */
+ BYTE tbl[]) /* out: array to receive the gamma table */
+{
+ #define LG_N_INTERVALS 7 /* 7 is the max; 8 causes overflow */
+ #define N_INTERVALS (1u<<LG_N_INTERVALS)
+ #define RND_PROD(p) (((p) + ((1<<LG_N_INTERVALS)-1)) >> LG_N_INTERVALS)
+
+ int t, x, y, xprev=0, yprev=0, xtmp, ytmp;
+
+ for (t=0; t<=N_INTERVALS; t+=1) {
+ x = (((RND_PROD((RND_PROD(p->c*t) + p->b)*t) + p->a)*t
+ >> (LG_N_INTERVALS+15)) + 1) >> 1;
+ y = (((RND_PROD((RND_PROD(p->f*t) + p->e)*t) + p->d)*t
+ >> (LG_N_INTERVALS+15)) + 1) >> 1;
+
+ if (t==0 || x!=xprev) tbl[x] = y;
+
+ if (t > 0) {
+ xtmp = xprev + 1;
+ ytmp = (yprev+y) / 2;
+ while (xtmp < x)
+ tbl[xtmp++] = ytmp;
+ }
+
+ xprev = x; yprev = y;
+ }
+}
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | calc_gamma_table | calculates gamma table using a cubic curve |
+ |__________________|_________________________________________________________|
+*/
+static void calc_gamma_table (
+ long gamma, /* in: gamma value as 24.8 (0.7 .. 3.5 is useful range) */
+ BYTE tbl[]) /* out: array to receive the gamma table */
+{
+ #define FLOAT_TO_FIX(f) ((short)((f)*0x1000 + 0.5)) /* output is 8.8 */
+ #define FLOAT_TO_ANG(f) ((USHORT)(long)((f)*0x10000/360.0 + 0.5))
+
+ #define MIN_INDEX 0 /* corresponds to gamma=0.0 */
+ #define MAX_INDEX 6 /* corresponds to gamma=3.0 */
+
+ typedef struct { /* ang_base=0.16; all others are 4.12 */
+ short start_vel_base; short start_vel_slope;
+ USHORT start_ang_base; short start_ang_slope;
+ short final_vel_base; short final_vel_slope;
+ USHORT final_ang_base; short final_ang_slope;
+ } spec_t;
+
+ static const spec_t specs[MAX_INDEX-MIN_INDEX+1] = {
+ { /* 0.0 .. 0.5 (just does a straight line) */
+ FLOAT_TO_FIX(1.0), FLOAT_TO_FIX(0.0), /* start vel */
+ FLOAT_TO_ANG(0.0), FLOAT_TO_FIX(0.0), /* start ang */
+ FLOAT_TO_FIX(1.0), FLOAT_TO_FIX(0.0), /* final vel */
+ FLOAT_TO_ANG(0.0), FLOAT_TO_FIX(0.0), /* final ang */
+ },
+ { /* 0.5 .. 1.0 (bogus below about 0.7) */
+ FLOAT_TO_FIX(0.05), FLOAT_TO_FIX(0.5), /* start vel */
+ FLOAT_TO_ANG(-75.0), FLOAT_TO_FIX(150.0/360.0), /* start ang */
+ FLOAT_TO_FIX(2.0), FLOAT_TO_FIX(0.0), /* final vel */
+ FLOAT_TO_ANG(15.0), FLOAT_TO_FIX(-30.0/360.0), /* final ang */
+ },
+ { /* 1.0 .. 1.5 */
+ FLOAT_TO_FIX(0.3), FLOAT_TO_FIX(0.2), /* start vel */
+ FLOAT_TO_ANG(0.0), FLOAT_TO_FIX(60.0/360.0), /* start ang */
+ FLOAT_TO_FIX(2.0), FLOAT_TO_FIX(0.0), /* final vel */
+ FLOAT_TO_ANG(0.0), FLOAT_TO_FIX(-20.0/360.0), /* final ang */
+ },
+ { /* 1.5 .. 2.0 */
+ FLOAT_TO_FIX(0.4), FLOAT_TO_FIX(0.2), /* start vel */
+ FLOAT_TO_ANG(30.0), FLOAT_TO_FIX(20.0/360.0), /* start ang */
+ FLOAT_TO_FIX(2.0), FLOAT_TO_FIX(0.0), /* final vel */
+ FLOAT_TO_ANG(-10.0), FLOAT_TO_FIX(-16.0/360.0), /* final ang */
+ },
+ { /* 2.0 .. 2.5 */
+ FLOAT_TO_FIX(0.5), FLOAT_TO_FIX(0.3), /* start vel */
+ FLOAT_TO_ANG(40.0), FLOAT_TO_FIX(4.0/360.0), /* start ang */
+ FLOAT_TO_FIX(2.0), FLOAT_TO_FIX(0.0), /* final vel */
+ FLOAT_TO_ANG(-18.0), FLOAT_TO_FIX(-8.0/360.0), /* final ang */
+ },
+ { /* 2.5 .. 3.0 */
+ FLOAT_TO_FIX(0.65), FLOAT_TO_FIX(0.4), /* start vel */
+ FLOAT_TO_ANG(42.0), FLOAT_TO_FIX(4.0/360.0), /* start ang */
+ FLOAT_TO_FIX(2.0), FLOAT_TO_FIX(0.0), /* final vel */
+ FLOAT_TO_ANG(-22.0), FLOAT_TO_FIX(-6.0/360.0), /* final ang */
+ },
+ { /* 3.0 .. 3.5 */
+ FLOAT_TO_FIX(0.85), FLOAT_TO_FIX(0.5), /* start vel */
+ FLOAT_TO_ANG(44.0), FLOAT_TO_FIX(1.0/360.0), /* start ang */
+ FLOAT_TO_FIX(2.0), FLOAT_TO_FIX(0.0), /* final vel */
+ FLOAT_TO_ANG(-25.0), FLOAT_TO_FIX(-4.0/360.0), /* final ang */
+ },
+ };
+
+ #define BEGIN_BLACKS 0 /* # of 0's at beginning of gamma table */
+ #define END_WHITES 4 /* # of 255's at final of gamma table */
+
+ const spec_t *p;
+ long start_vel, final_vel;
+ ULONG start_ang, final_ang;
+ cubic_t cubic;
+ int i;
+
+ i = gamma >> 7;
+ if (i > MAX_INDEX) i = MAX_INDEX;
+ p = &specs[i-MIN_INDEX];
+ gamma -= i << 7;
+
+ start_vel = ((long)p->start_vel_base << 4)
+ + (p->start_vel_slope*gamma >> 4);
+ final_vel = ((long)p->final_vel_base << 4)
+ + (p->final_vel_slope*gamma >> 4);
+ start_ang = ((long)p->start_ang_base << 16)
+ + (p->start_ang_slope*gamma << 12);
+ final_ang = ((long)p->final_ang_base << 16)
+ + (p->final_ang_slope*gamma << 12);
+
+ calc_cubic_coeffs (start_ang, final_ang, start_vel, final_vel, &cubic);
+ transform_cubic (255-BEGIN_BLACKS-END_WHITES, 254, &cubic);
+ calc_gamma_from_coeffs (&cubic, tbl);
+
+ memmove (&tbl[BEGIN_BLACKS], &tbl[0], (256-BEGIN_BLACKS)*sizeof(BYTE));
+ tbl[0] = 0;
+ for (i=0; i<BEGIN_BLACKS; i++)
+ tbl[i] = 0;
+
+ for (i=256-END_WHITES; i<=255; i++)
+ tbl[i] = 255;
+}
+
+
+
+
+/*****************************************************************************\
+ *
+ * gamma_openXform - Creates a new instance of the transformer
+ *
+ *****************************************************************************
+ *
+ * This returns a handle for the new instance to be passed into
+ * all subsequent calls.
+ *
+ * Return value: IP_DONE=success; IP_FATAL_ERROR=misc error.
+ *
+\*****************************************************************************/
+
+static WORD gamma_openXform (
+ IP_XFORM_HANDLE *pXform) /* out: returned handle */
+{
+ PGAM_INST g;
+
+ INSURE (pXform != NULL);
+ IP_MEM_ALLOC (sizeof(GAM_INST), g);
+ *pXform = g;
+ memset (g, 0, sizeof(GAM_INST));
+ g->dwValidChk = CHECK_VALUE;
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * gamma_setDefaultInputTraits - Specifies default input image traits
+ *
+ *****************************************************************************
+ *
+ * The header of the file-type handled by the transform probably does
+ * not include *all* the image traits we'd like to know. Those not
+ * specified in the file-header are filled in from info provided by
+ * this routine.
+ *
+ * Return value: IP_DONE=success; IP_FATAL_ERROR=misc error.
+ *
+\*****************************************************************************/
+
+static WORD gamma_setDefaultInputTraits (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ PIP_IMAGE_TRAITS pTraits) /* in: default image traits */
+{
+ PGAM_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ /* Insure that values we care about are correct */
+ INSURE (pTraits->iBitsPerPixel == 8);
+ INSURE (pTraits->iComponentsPerPixel == 1);
+ INSURE (pTraits->iPixelsPerRow > 0);
+
+ g->traits = *pTraits; /* a structure copy */
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * gamma_setXformSpec - Provides xform-specific information
+ *
+\*****************************************************************************/
+
+static WORD gamma_setXformSpec (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD_OR_PVOID aXformInfo[]) /* in: xform information */
+{
+ PGAM_INST g;
+ DWORD gamma;
+
+ HANDLE_TO_PTR (hXform, g);
+ gamma = aXformInfo[0].dword;
+ INSURE (gamma <= 0x38000u); /* 3.5 is our limit */
+
+ calc_gamma_table ((gamma+0x0080u)>>8, g->gammaTable);
+ /* todo: make calc_gamma_table accept a 16.16 gamma value */
+
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * gamma_getHeaderBufSize- Returns size of input buf needed to hold header
+ *
+\*****************************************************************************/
+
+static WORD gamma_getHeaderBufSize (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD *pwInBufLen) /* out: buf size for parsing header */
+{
+ /* since input is raw pixels, there is no header, so set it to zero */
+ *pwInBufLen = 0;
+ return IP_DONE;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * gamma_getActualTraits - Parses header, and returns input & output traits
+ *
+\*****************************************************************************/
+
+static WORD gamma_getActualTraits (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD wInputAvail, /* in: # avail bytes in input buf */
+ PBYTE pbInputBuf, /* in: ptr to input buffer */
+ PDWORD pwInputUsed, /* out: # bytes used from input buf */
+ PDWORD pdwInputNextPos,/* out: file-pos to read from next */
+ PIP_IMAGE_TRAITS pIntraits, /* out: input image traits */
+ PIP_IMAGE_TRAITS pOutTraits) /* out: output image traits */
+{
+ PGAM_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ /* Since there is no header, we'll report no usage of input */
+ *pwInputUsed = 0;
+ *pdwInputNextPos = 0;
+
+ *pIntraits = g->traits; /* structure copies */
+ *pOutTraits = g->traits;
+
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/****************************************************************************\
+ *
+ * gamma_getActualBufSizes - Returns buf sizes needed for remainder of job
+ *
+\****************************************************************************/
+
+static WORD gamma_getActualBufSizes (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ PDWORD pwMinInBufLen, /* out: min input buf size */
+ PDWORD pwMinOutBufLen) /* out: min output buf size */
+{
+ PGAM_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+ *pwMinInBufLen = *pwMinOutBufLen = g->traits.iPixelsPerRow;
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * gamma_convert - Converts one row
+ *
+\*****************************************************************************/
+
+static WORD gamma_convert (
+ IP_XFORM_HANDLE hXform,
+ DWORD wInputAvail, /* in: # avail bytes in in-buf */
+ PBYTE pbInputBuf, /* in: ptr to in-buffer */
+ PDWORD pwInputUsed, /* out: # bytes used from in-buf */
+ PDWORD pdwInputNextPos, /* out: file-pos to read from next */
+ DWORD wOutputAvail, /* in: # avail bytes in out-buf */
+ PBYTE pbOutputBuf, /* in: ptr to out-buffer */
+ PDWORD pwOutputUsed, /* out: # bytes written in out-buf */
+ PDWORD pdwOutputThisPos) /* out: file-pos to write the data */
+{
+ PGAM_INST g;
+ int nBytes;
+ PBYTE pIn, pOut, pOutAfter;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ /**** Check if we were told to flush ****/
+
+ if (pbInputBuf == NULL) {
+ PRINT ("gamma_convert: Told to flush.\n", 0, 0);
+ *pwInputUsed = *pwOutputUsed = 0;
+ *pdwInputNextPos = g->dwInNextPos;
+ *pdwOutputThisPos = g->dwOutNextPos;
+ return IP_DONE;
+ }
+
+ /**** Output a Row ****/
+
+ nBytes = g->traits.iPixelsPerRow;
+ INSURE (wInputAvail >= nBytes );
+ INSURE (wOutputAvail >= nBytes);
+
+ pIn = pbInputBuf;
+ pOut = pbOutputBuf;
+ pOutAfter = pOut + nBytes;
+
+ while (pOut < pOutAfter) {
+ pOut[0] = g->gammaTable[pIn[0]];
+ pOut[1] = g->gammaTable[pIn[1]];
+ pOut[2] = g->gammaTable[pIn[2]];
+ pOut[3] = g->gammaTable[pIn[3]];
+ pOut[4] = g->gammaTable[pIn[4]];
+ pOut[5] = g->gammaTable[pIn[5]];
+ pOut[6] = g->gammaTable[pIn[6]];
+ pOut[7] = g->gammaTable[pIn[7]];
+
+ pIn += 8;
+ pOut += 8;
+ }
+
+ *pwInputUsed = nBytes;
+ g->dwInNextPos += nBytes;
+ *pdwInputNextPos = g->dwInNextPos;
+
+ *pwOutputUsed = nBytes;
+ *pdwOutputThisPos = g->dwOutNextPos;
+ g->dwOutNextPos += nBytes;
+
+ g->wRowsDone += 1;
+
+ PRINT ("gamma_convert: Returning, out used = %d\n", out_used, 0);
+ return IP_CONSUMED_ROW | IP_PRODUCED_ROW | IP_READY_FOR_DATA;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * gamma_insertedData - client inserted into our output stream
+ *
+\*****************************************************************************/
+
+static WORD gamma_insertedData (
+ IP_XFORM_HANDLE hXform,
+ DWORD wNumBytes)
+{
+ fatalBreakPoint ();
+ return IP_FATAL_ERROR; /* must never be called (can't insert data) */
+}
+
+
+
+/*****************************************************************************\
+ *
+ * gamma_newPage - Tells us to flush this page, and start a new page
+ *
+\*****************************************************************************/
+
+static WORD gamma_newPage (
+ IP_XFORM_HANDLE hXform)
+{
+ PGAM_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+ /* todo: return fatal error if convert is called again? */
+ return IP_DONE; /* can't insert page-breaks, so ignore this call */
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+
+}
+
+
+
+/*****************************************************************************\
+ *
+ * gamma_closeXform - Destroys this instance
+ *
+\*****************************************************************************/
+
+static WORD gamma_closeXform (IP_XFORM_HANDLE hXform)
+{
+ PGAM_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ g->dwValidChk = 0;
+ IP_MEM_FREE (g); /* free memory for the instance */
+
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * gammaTbl - Jump-table for transform driver
+ *
+\*****************************************************************************/
+
+IP_XFORM_TBL gammaTbl = {
+ gamma_openXform,
+ gamma_setDefaultInputTraits,
+ gamma_setXformSpec,
+ gamma_getHeaderBufSize,
+ gamma_getActualTraits,
+ gamma_getActualBufSizes,
+ gamma_convert,
+ gamma_newPage,
+ gamma_insertedData,
+ gamma_closeXform
+};
+
+/* End of File */
diff --git a/ip/xgray2bi.c b/ip/xgray2bi.c
new file mode 100644
index 0000000..1946e1b
--- /dev/null
+++ b/ip/xgray2bi.c
@@ -0,0 +1,614 @@
+/* libhpojip -- HP OfficeJet image-processing library. */
+
+/* Copyright (C) 1995-2002 Hewlett-Packard Company
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ * MA 02111-1307, USA.
+ *
+ * In addition, as a special exception, Hewlett-Packard Company
+ * gives permission to link the code of this program with any
+ * version of the OpenSSL library which is distributed under a
+ * license identical to that listed in the included LICENSE.OpenSSL
+ * file, and distribute linked combinations including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * this file, you may extend this exception to your version of the
+ * file, but you are not obligated to do so. If you do not wish to
+ * do so, delete this exception statement from your version.
+ */
+
+/* Original author: Mark Overton and others.
+ *
+ * Ported to Linux by David Paschal.
+ */
+
+/******************************************************************************\
+ *
+ * xgray2bi.c - Error-diffuser and thresholder that's designed to be fast
+ *
+ ******************************************************************************
+ *
+ * Jan 1998 Mark Overton -- ported code into an xform driver
+ * June 1995 Mark Overton -- developed and benchmarked algorithm
+ *
+ * Name of Global Jump-Table:
+ *
+ * gray2biTbl
+ *
+ * Items in aXformInfo array passed into setXformSpec:
+ *
+ * aXformInfo[IP_GRAY_2_BI_THRESHOLD] = Threshold.
+ * If threshold is zero, error-diffusion is done.
+ * If non-zero, it is the black/white threshold:
+ * A gray pixel >= to threshold becomes white, else black.
+ *
+ * Capabilities and Limitations:
+ *
+ * Inputs rows of 8-bit gray pixels, and outputs rows of bi-level pixels.
+ * The formats are the standard raw formats described in hpojip.h.
+ * The error-diffusion weights are perturbed by small internally-generated
+ * amounts to break up any pixel patterns that would otherwise occur.
+ *
+ * Default Input Traits, and Output Traits:
+ *
+ * trait default input output
+ * ------------------- --------------------- ------------------------
+ * iPixelsPerRow * passed into output same as default input
+ * iBitsPerPixel * must be 8 1
+ * iComponentsPerPixel * must be 1 1
+ * lHorizDPI passed into output same as default input
+ * lVertDPI passed into output same as default input
+ * lNumRows passed into output same as default input
+ * iNumPages passed into output same as default input
+ * iPageNum passed into output same as default input
+ *
+ * Above, a "*" by an item indicates it must be valid (not negative).
+ *
+ * Error-diffusion timings (seconds for one page):
+ *
+ * 386-33 486-33 486-66 P-90 735 image dim task
+ * ------ ------ ------ ---- ----- --------- ---------------------------------
+ * 21.6 9.0 4.4 2.3 1.4 1728x2200 200x200 fax in photo mode
+ * 43. 17.9 8.9 4.6 2.9 2400x3150 300x300 local copy, 1/4" margins
+ * 86. 36. 17.9 9.3 5.7 4800x3150 600x300 local copy, 1/4" margins
+ *
+\******************************************************************************/
+
+#include "hpip.h"
+#include "ipdefs.h"
+#include "string.h" /* for memset and memcpy */
+
+
+#if 0
+ #include "stdio.h"
+ #include <tchar.h>
+
+ #define PRINT(msg,arg1,arg2) \
+ _ftprintf(stderr, msg, (int)arg1, (int)arg2)
+#else
+ #define PRINT(msg,arg1,arg2)
+#endif
+
+#define CHECK_VALUE 0x1ce5ca7e
+
+
+typedef struct {
+ IP_IMAGE_TRAITS inTraits; /* traits of the input image */
+ DWORD dwRowsDone; /* number of rows converted so far */
+ BYTE bThreshold; /* white/black threshold; 0 -> diffuse */
+ DWORD dwInNextPos; /* file pos for subsequent input */
+ DWORD dwOutNextPos; /* file pos for subsequent output */
+ DWORD dwValidChk; /* struct validity check value */
+ short *pErrBuf; /* error-term buffer */
+} G2B_INST, *PG2B_INST;
+
+
+
+/****************************************************************************\
+ *
+ * thresholdRow - work-horse thresholding routine
+ *
+\****************************************************************************/
+
+static void thresholdRow (
+ int iPixelsPerRow, /* in: # of pixels in the row */
+ BYTE bThreshold, /* in: white/black threshold value */
+ BYTE baInBuf [], /* in: input pixels (0=black, 255=white) */
+ BYTE baOutBuf []) /* out: output pixels (0=white, 1=black, 8 per byte) */
+{
+ int iMore;
+ PBYTE pbIn, pbOut;
+ BYTE bOut, bMask;
+
+ pbIn = baInBuf;
+ pbOut = baOutBuf;
+
+ for (iMore=iPixelsPerRow; iMore>0; iMore-=8)
+ {
+ bOut = 0;
+
+ for (bMask=0x80u; bMask!=0; bMask>>=1)
+ {
+ if (*pbIn++ < bThreshold)
+ bOut |= bMask;
+ }
+
+ *pbOut++ = bOut;
+ }
+}
+
+
+
+/****************************************************************************\
+ *
+ * diffuseRow - work-horse error-diffusion routine
+ *
+\****************************************************************************/
+
+static void diffuseRow (
+ int iPixelsPerRow, /* in: # of pixels in the row */
+ short iaErrBuf [], /* in/out: error-term buffer from prior call */
+ BYTE baInBuf [], /* in: input pixels (0=black, 255=white) */
+ BYTE baOutBuf []) /* out: output pixels (0=white, 1=black, 8 per byte) */
+{
+ int rr, r, cur;
+ int br, b, bl, bll;
+ int err;
+ int weight4, weight2, weight1;
+ short *eptr;
+ int noise;
+ BYTE *inptr, *inafter;
+ BYTE *outptr;
+ BYTE outvalue;
+ int mask;
+ BOOL second; /* computing 2nd nibble in byte? */
+
+ /* The diffusion algorithm below uses the following 6 weights:
+ *
+ * X 4 2
+ * 1 3 4 2
+ *
+ * These weights add to 16, so there are shifts by 4 in the code.
+ * weight4 is the 4 above. Likewise with weight2 and weight1.
+ * eptr is positioned at the 1 above.
+ * The macro reads the error at the top 4 above, and writes it at the 1.
+ * bll is positioned at the 1 above. bleft at the 3. below at the low 4.
+ * The noise perturbations add to zero, so no net noise is injected.
+ */
+#if 0
+ #define DIFFUSE(par_outmask) { \
+ mask = cur >> (8*sizeof(cur)-1); /* signed shift */ \
+ outvalue |= par_outmask & mask; \
+ weight4 = (cur - (~mask&0x0ff0)) >> 2; \
+ \
+ noise = (cur & (0x7f<<1)) - 0x7f; \
+ cur = ((unsigned)(*inptr++) << 4) \
+ + eptr[3] + weight2 + weight4 + noise ; \
+ weight2 = (weight4>>1); \
+ weight1 = (weight2>>1); \
+ *eptr++ = bll + weight1 - noise ; \
+ bll = bleft + weight2 + weight1 /* + noise */ ; \
+ bleft = below + weight4 - noise ; \
+ below = weight2 + noise ; \
+ }
+
+ cur = iaErrBuf[2] + ((unsigned)(*inptr++) << 4);
+ bll = 0;
+ bleft = 0;
+ below = 0;
+ weight2 = 0;
+
+#endif
+
+ #define DIFFUSE(par_outmask) { \
+ /* decide if output pixel is black or white */ \
+ mask = (cur-0x800) >> (8*sizeof(cur)-1); /* all 0's or all 1's */ \
+ outvalue |= par_outmask & mask; \
+ \
+ /* compute error, and weights of 4/16, 2/16 and 1/16 */ \
+ err = cur - (~mask&0x0ff0); \
+ /* multiply error by 15/16 so it won't propagate a long distance */ \
+ err = err - (err>>4); \
+ weight4 = err >> 2; \
+ weight2 = weight4 >> 1; \
+ weight1 = weight2 >> 1; \
+ \
+ /* distribute error to neighboring pixels */ \
+ noise = err & 0x00ff; \
+ rr += weight2; \
+ r += weight4 + noise; \
+ br = weight2 + noise; \
+ b += weight4 - noise; \
+ bl += weight2 + weight1; /* the 3 weight */ \
+ bll += weight1 - noise; \
+ \
+ /* advance right one pixel, so move values left one pixel */ \
+ cur = r; \
+ r = rr; \
+ rr = ((unsigned)(*inptr++) << 4) + eptr[2]; \
+ eptr[-2] = bll; \
+ bll = bl; \
+ bl = b; \
+ b = br; \
+ eptr += 1; \
+ }
+
+ inptr = baInBuf;
+ inafter = baInBuf + iPixelsPerRow;
+ outptr = baOutBuf;
+ eptr = iaErrBuf + 2;
+ outvalue = 0;
+ second = FALSE;
+
+ cur = ((unsigned)inptr[0] << 4) + eptr[0];
+ r = ((unsigned)inptr[1] << 4) + eptr[1];
+ rr = ((unsigned)inptr[2] << 4) + eptr[2];
+ inptr += 3;
+ bll = bl = b = br = 0;
+
+ while (inptr < inafter) {
+ DIFFUSE (0x08);
+ DIFFUSE (0x04);
+ DIFFUSE (0x02);
+ DIFFUSE (0x01);
+
+ if (! second) {
+ /* we just computed the left half of the byte */
+ outvalue <<= 4;
+ second = TRUE;
+ } else {
+ /* we just computed the right half of the byte, so store it */
+ *outptr++ = outvalue;
+ outvalue = 0;
+ second = FALSE;
+ }
+ } /* end of for */
+
+ if (second)
+ *outptr = outvalue; /* store final nibble */
+
+ eptr[-2] = bll;
+ eptr[-1] = bl;
+ eptr[ 0] = b;
+
+ #undef DIFFUSE
+}
+
+
+
+/*****************************************************************************\
+ *
+ * gray2bi_openXform - Creates a new instance of the transformer
+ *
+ *****************************************************************************
+ *
+ * This returns a handle for the new instance to be passed into
+ * all subsequent calls.
+ *
+ * Return value: IP_DONE=success; IP_FATAL_ERROR=misc error.
+ *
+\*****************************************************************************/
+
+static WORD gray2bi_openXform (
+ IP_XFORM_HANDLE *pXform) /* out: returned handle */
+{
+ PG2B_INST g;
+
+ INSURE (pXform != NULL);
+ IP_MEM_ALLOC (sizeof(G2B_INST), g);
+ *pXform = g;
+ memset (g, 0, sizeof(G2B_INST));
+ g->dwValidChk = CHECK_VALUE;
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * gray2bi_setDefaultInputTraits - Specifies default input image traits
+ *
+ *****************************************************************************
+ *
+ * The header of the file-type handled by the transform probably does
+ * not include *all* the image traits we'd like to know. Those not
+ * specified in the file-header are filled in from info provided by
+ * this routine.
+ *
+ * Return value: IP_DONE=success; IP_FATAL_ERROR=misc error.
+ *
+\*****************************************************************************/
+
+static WORD gray2bi_setDefaultInputTraits (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ PIP_IMAGE_TRAITS pTraits) /* in: default image traits */
+{
+ PG2B_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ /* Insure that values we care about are correct */
+ INSURE (pTraits->iBitsPerPixel == 8);
+ INSURE (pTraits->iComponentsPerPixel == 1);
+ INSURE (pTraits->iPixelsPerRow > 0);
+
+ g->inTraits = *pTraits; /* a structure copy */
+
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * gray2bi_setXformSpec - Provides xform-specific information
+ *
+\*****************************************************************************/
+
+static WORD gray2bi_setXformSpec (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD_OR_PVOID aXformInfo[]) /* in: xform information */
+{
+ PG2B_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+ INSURE ((DWORD)aXformInfo[IP_GRAY_2_BI_THRESHOLD].dword <= 255);
+ g->bThreshold = (BYTE)aXformInfo[IP_GRAY_2_BI_THRESHOLD].dword;
+
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * gray2bi_getHeaderBufSize- Returns size of input buf needed to hold header
+ *
+\*****************************************************************************/
+
+static WORD gray2bi_getHeaderBufSize (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD *pdwInBufLen) /* out: buf size for parsing header */
+{
+ /* since input is raw pixels, there is no header, so set it to zero */
+ *pdwInBufLen = 0;
+ return IP_DONE;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * gray2bi_getActualTraits - Parses header, and returns input & output traits
+ *
+\*****************************************************************************/
+
+static WORD gray2bi_getActualTraits (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD dwInputAvail, /* in: # avail bytes in input buf */
+ PBYTE pbInputBuf, /* in: ptr to input buffer */
+ PDWORD pdwInputUsed, /* out: # bytes used from input buf */
+ PDWORD pdwInputNextPos,/* out: file-pos to read from next */
+ PIP_IMAGE_TRAITS pInTraits, /* out: input image traits */
+ PIP_IMAGE_TRAITS pOutTraits) /* out: output image traits */
+{
+ PG2B_INST g;
+ int nBytes;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ /* Since there is no header, we'll report no usage of input */
+ *pdwInputUsed = 0;
+ *pdwInputNextPos = 0;
+
+ *pInTraits = g->inTraits;
+ *pOutTraits = g->inTraits;
+ pOutTraits->iBitsPerPixel = 1; /* this xform only changes bits/pixel */
+
+ if (g->bThreshold == 0) {
+ nBytes = sizeof(short) * g->inTraits.iPixelsPerRow;
+ IP_MEM_ALLOC (nBytes, g->pErrBuf);
+ memset (g->pErrBuf, 0, nBytes);
+ }
+
+ return IP_DONE | IP_READY_FOR_DATA;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/****************************************************************************\
+ *
+ * gray2bi_getActualBufSizes - Returns buf sizes needed for remainder of job
+ *
+\****************************************************************************/
+
+static WORD gray2bi_getActualBufSizes (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ PDWORD pdwMinInBufLen, /* out: min input buf size */
+ PDWORD pdwMinOutBufLen) /* out: min output buf size */
+{
+ PG2B_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+ *pdwMinInBufLen = g->inTraits.iPixelsPerRow;
+ *pdwMinOutBufLen = (g->inTraits.iPixelsPerRow + 7) / 8;
+
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * gray2bi_convert - error-diffuses one row
+ *
+\*****************************************************************************/
+
+static WORD gray2bi_convert (
+ IP_XFORM_HANDLE hXform,
+ DWORD dwInputAvail, /* in: # avail bytes in in-buf */
+ PBYTE pbInputBuf, /* in: ptr to in-buffer */
+ PDWORD pdwInputUsed, /* out: # bytes used from in-buf */
+ PDWORD pdwInputNextPos, /* out: file-pos to read from next */
+ DWORD dwOutputAvail, /* in: # avail bytes in out-buf */
+ PBYTE pbOutputBuf, /* in: ptr to out-buffer */
+ PDWORD pdwOutputUsed, /* out: # bytes written in out-buf */
+ PDWORD pdwOutputThisPos) /* out: file-pos to write the data */
+{
+ PG2B_INST g;
+ int inBytes, outBytes;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ /**** Check if we were told to flush ****/
+
+ if (pbInputBuf == NULL) {
+ PRINT (_T("gray2bi_convert: Told to flush.\n"), 0, 0);
+ *pdwInputUsed = *pdwOutputUsed = 0;
+ *pdwInputNextPos = g->dwInNextPos;
+ *pdwOutputThisPos = g->dwOutNextPos;
+ return IP_DONE;
+ }
+
+ /**** Convert and Output a Row ****/
+
+ inBytes = g->inTraits.iPixelsPerRow;
+ outBytes = (inBytes + 7) / 8;
+ INSURE (dwInputAvail >= (DWORD)inBytes );
+ INSURE (dwOutputAvail >= (DWORD)outBytes);
+
+ if (g->bThreshold == 0) {
+ INSURE (g->pErrBuf != NULL);
+ diffuseRow (inBytes, g->pErrBuf, pbInputBuf, pbOutputBuf);
+ } else
+ thresholdRow (inBytes, g->bThreshold, pbInputBuf, pbOutputBuf);
+
+ *pdwInputUsed = inBytes;
+ g->dwInNextPos += inBytes;
+ *pdwInputNextPos = g->dwInNextPos;
+
+ *pdwOutputUsed = outBytes;
+ *pdwOutputThisPos = g->dwOutNextPos;
+ g->dwOutNextPos += outBytes;
+
+ g->dwRowsDone += 1;
+
+ return IP_CONSUMED_ROW | IP_PRODUCED_ROW | IP_READY_FOR_DATA;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * gray2bi_insertedData - client inserted into our output stream
+ *
+\*****************************************************************************/
+
+static WORD gray2bi_insertedData (
+ IP_XFORM_HANDLE hXform,
+ DWORD dwNumBytes)
+{
+ fatalBreakPoint ();
+ return IP_FATAL_ERROR; /* must never be called (can't insert data) */
+}
+
+
+
+/*****************************************************************************\
+ *
+ * gray2bi_newPage - Tells us to flush this page, and start a new page
+ *
+\*****************************************************************************/
+
+static WORD gray2bi_newPage (
+ IP_XFORM_HANDLE hXform)
+{
+ PG2B_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+ /* todo: return fatal error if convert is called again? */
+ return IP_DONE; /* can't insert page-breaks, so ignore this call */
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+
+}
+
+
+
+/*****************************************************************************\
+ *
+ * gray2bi_closeXform - Destroys this instance
+ *
+\*****************************************************************************/
+
+static WORD gray2bi_closeXform (IP_XFORM_HANDLE hXform)
+{
+ PG2B_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ if (g->pErrBuf != NULL)
+ IP_MEM_FREE (g->pErrBuf);
+
+ g->dwValidChk = 0;
+ IP_MEM_FREE (g); /* free memory for the instance */
+
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * gray2biTbl - Jump-table for encoder
+ *
+\*****************************************************************************/
+
+IP_XFORM_TBL gray2biTbl = {
+ gray2bi_openXform,
+ gray2bi_setDefaultInputTraits,
+ gray2bi_setXformSpec,
+ gray2bi_getHeaderBufSize,
+ gray2bi_getActualTraits,
+ gray2bi_getActualBufSizes,
+ gray2bi_convert,
+ gray2bi_newPage,
+ gray2bi_insertedData,
+ gray2bi_closeXform
+};
+
+/* End of File */
diff --git a/ip/xgrayout.c b/ip/xgrayout.c
new file mode 100644
index 0000000..aa379a6
--- /dev/null
+++ b/ip/xgrayout.c
@@ -0,0 +1,495 @@
+/* libhpojip -- HP OfficeJet image-processing library. */
+
+/* Copyright (C) 1995-2002 Hewlett-Packard Company
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ * MA 02111-1307, USA.
+ *
+ * In addition, as a special exception, Hewlett-Packard Company
+ * gives permission to link the code of this program with any
+ * version of the OpenSSL library which is distributed under a
+ * license identical to that listed in the included LICENSE.OpenSSL
+ * file, and distribute linked combinations including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * this file, you may extend this exception to your version of the
+ * file, but you are not obligated to do so. If you do not wish to
+ * do so, delete this exception statement from your version.
+ */
+
+/* Original author: Mark Overton and others.
+ *
+ * Ported to Linux by David Paschal.
+ */
+
+/******************************************************************************\
+ *
+ * xgrayOut.c - Grays out everything outside the given rectangle.
+ *
+ * "Graying out" means changing pixels toward a middle gray value. Everything
+ * outside the given rectangle is grayed-out by this xform. This is useful for
+ * displaying a selected-area in an image (the rectangle).
+ *
+ ******************************************************************************
+ *
+ * Name of Global Jump-Table:
+ *
+ * grayOutTbl
+ *
+ * Items in aXformInfo array passed into setXformSpec:
+ *
+ * aXformInfo[IP_GRAYOUT_LEFT ] = left
+ * aXformInfo[IP_GRAYOUT_RIGHT ] = right
+ * aXformInfo[IP_GRAYOUT_TOP ] = top
+ * aXformInfo[IP_GRAYOUT_BOTTOM] = bottom
+ *
+ * The four numbers above give the locations of the sides of the rectangle
+ * which is *not* to be grayed-out. Everything outside these boundaries
+ * will be grayed-out. If these coordinates are outside the image, this
+ * xform will behave sensibly.
+ *
+ * Capabilities and Limitations:
+ *
+ * 24-bit, 3-component data only.
+ *
+ * Default Input Traits, and Output Traits:
+ *
+ * Describe what you do with the default input traits, and how the
+ * output traits are determined.
+ *
+ * trait default input output
+ * ------------------- --------------------- ------------------------
+ * iPixelsPerRow * passed into output same as default input
+ * iBitsPerPixel * must be 24 24
+ * iComponentsPerPixel * must be 3 3
+ * lHorizDPI passed into output same as default input
+ * lVertDPI passed into output same as default input
+ * lNumRows passed into output same as default input
+ * iNumPages passed into output same as default input
+ * iPageNum passed into output same as default input
+ *
+ * Above, a "*" by an item indicates it must be valid (not negative).
+ *
+\******************************************************************************/
+
+
+#define TARGET_GRAY 0xB0 /* grayed pixels are pushed toward this gray-level */
+
+// Use the #define below if this transform will exist in a dll outside of the
+// image pipeline. This will allow the functions to be exported.
+// #define EXPORT_TRANFORM 1
+
+#include "hpip.h"
+#include "ipdefs.h"
+#include "string.h" /* for memset and memcpy */
+
+
+#if 0
+ #include "stdio.h"
+ #include <tchar.h>
+ #define PRINT(msg,arg1,arg2) \
+ _ftprintf(stderr, msg, (int)arg1, (int)arg2)
+#else
+ #define PRINT(msg,arg1,arg2)
+#endif
+
+#define CHECK_VALUE 0x4ba1dace
+
+#ifdef EXPORT_TRANSFORM
+#define FUNC_STATUS __declspec (dllexport)
+#else
+#define FUNC_STATUS static
+#endif
+
+typedef struct {
+ IP_IMAGE_TRAITS traits; /* traits of the input and output image */
+ DWORD dwBytesPerRow; /* # of bytes in each row */
+ int iLeft, iRight; /* the rectangle to not gray-out */
+ int iTop, iBottom;
+ DWORD dwRowsDone; /* number of rows converted so far */
+ DWORD dwInNextPos; /* file pos for subsequent input */
+ DWORD dwOutNextPos; /* file pos for subsequent output */
+ DWORD dwValidChk; /* struct validity check value */
+} GRAYOUT_INST, *PGRAYOUT_INST;
+
+
+
+/*****************************************************************************\
+ *
+ * grayOut_openXform - Creates a new instance of the transformer
+ *
+ *****************************************************************************
+ *
+ * This returns a handle for the new instance to be passed into
+ * all subsequent calls.
+ *
+ * Return value: IP_DONE=success; IP_FATAL_ERROR=misc error.
+ *
+\*****************************************************************************/
+
+FUNC_STATUS WORD grayOut_openXform (
+ IP_XFORM_HANDLE *pXform) /* out: returned handle */
+{
+ PGRAYOUT_INST g;
+
+ INSURE (pXform != NULL);
+ IP_MEM_ALLOC (sizeof(GRAYOUT_INST), g);
+ *pXform = g;
+ memset (g, 0, sizeof(GRAYOUT_INST));
+ g->dwValidChk = CHECK_VALUE;
+ g->iRight = 1000000;
+ g->iBottom = 1000000;
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * grayOut_setDefaultInputTraits - Specifies default input image traits
+ *
+ *****************************************************************************
+ *
+ * The header of the file-type handled by the transform probably does
+ * not include *all* the image traits we'd like to know. Those not
+ * specified in the file-header are filled in from info provided by
+ * this routine.
+ *
+ * Return value: IP_DONE=success; IP_FATAL_ERROR=misc error.
+ *
+\*****************************************************************************/
+
+FUNC_STATUS WORD grayOut_setDefaultInputTraits (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ PIP_IMAGE_TRAITS pTraits) /* in: default image traits */
+{
+ PGRAYOUT_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ /* insure that traits we care about are known */
+ INSURE (pTraits->iPixelsPerRow > 0 &&
+ pTraits->iBitsPerPixel == 24 &&
+ pTraits->iComponentsPerPixel == 3);
+ g->traits = *pTraits; /* a structure copy */
+ g->dwBytesPerRow = (g->traits.iPixelsPerRow*g->traits.iBitsPerPixel + 7) / 8;
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * grayOut_setXformSpec - Provides xform-specific information
+ *
+\*****************************************************************************/
+
+FUNC_STATUS WORD grayOut_setXformSpec (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD_OR_PVOID aXformInfo[]) /* in: xform information */
+{
+ PGRAYOUT_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+ g->iLeft = aXformInfo[IP_GRAYOUT_LEFT ].dword;
+ g->iRight = aXformInfo[IP_GRAYOUT_RIGHT ].dword;
+ g->iTop = aXformInfo[IP_GRAYOUT_TOP ].dword;
+ g->iBottom = aXformInfo[IP_GRAYOUT_BOTTOM].dword;
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * grayOut_getHeaderBufSize- Returns size of input buf needed to hold header
+ *
+\*****************************************************************************/
+
+FUNC_STATUS WORD grayOut_getHeaderBufSize (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD *pdwInBufLen) /* out: buf size for parsing header */
+{
+ /* since input is raw pixels, there is no header, so set it to zero */
+ *pdwInBufLen = 0;
+ return IP_DONE;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * grayOut_getActualTraits - Parses header, and returns input & output traits
+ *
+\*****************************************************************************/
+
+FUNC_STATUS WORD grayOut_getActualTraits (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD dwInputAvail, /* in: # avail bytes in input buf */
+ PBYTE pbInputBuf, /* in: ptr to input buffer */
+ PDWORD pdwInputUsed, /* out: # bytes used from input buf */
+ PDWORD pdwInputNextPos,/* out: file-pos to read from next */
+ PIP_IMAGE_TRAITS pIntraits, /* out: input image traits */
+ PIP_IMAGE_TRAITS pOutTraits) /* out: output image traits */
+{
+ PGRAYOUT_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ /* Since there is no header, we'll report no usage of input */
+ *pdwInputUsed = 0;
+ *pdwInputNextPos = 0;
+
+ *pIntraits = g->traits; /* structure copies */
+ *pOutTraits = g->traits;
+
+ return IP_DONE | IP_READY_FOR_DATA;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/****************************************************************************\
+ *
+ * grayOut_getActualBufSizes - Returns buf sizes needed for remainder of job
+ *
+\****************************************************************************/
+
+FUNC_STATUS WORD grayOut_getActualBufSizes (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ PDWORD pdwMinInBufLen, /* out: min input buf size */
+ PDWORD pdwMinOutBufLen) /* out: min output buf size */
+{
+ PGRAYOUT_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+ *pdwMinInBufLen = *pdwMinOutBufLen = g->dwBytesPerRow;
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * grayOut_convert - Converts one row
+ *
+\*****************************************************************************/
+
+FUNC_STATUS WORD grayOut_convert (
+ IP_XFORM_HANDLE hXform,
+ DWORD dwInputAvail, /* in: # avail bytes in in-buf */
+ PBYTE pbInputBuf, /* in: ptr to in-buffer */
+ PDWORD pdwInputUsed, /* out: # bytes used from in-buf */
+ PDWORD pdwInputNextPos, /* out: file-pos to read from next */
+ DWORD dwOutputAvail, /* in: # avail bytes in out-buf */
+ PBYTE pbOutputBuf, /* in: ptr to out-buffer */
+ PDWORD pdwOutputUsed, /* out: # bytes written in out-buf */
+ PDWORD pdwOutputThisPos) /* out: file-pos to write the data */
+{
+ PGRAYOUT_INST g;
+ int nBytes;
+ PBYTE pIn, pInAfter, pOut, pLeft, pRight;
+
+ #define GRAYOUT_PIXEL \
+ *pOut++ = (BYTE)(((int)(*pIn++)+TARGET_GRAY) >> 1); /* R */ \
+ *pOut++ = (BYTE)(((int)(*pIn++)+TARGET_GRAY) >> 1); /* G */ \
+ *pOut++ = (BYTE)(((int)(*pIn++)+TARGET_GRAY) >> 1); /* B */
+
+ HANDLE_TO_PTR (hXform, g);
+
+ /**** Check if we were told to flush ****/
+
+ if (pbInputBuf == NULL) {
+ PRINT (_T("grayOut_convert: Told to flush.\n"), 0, 0);
+ *pdwInputUsed = *pdwOutputUsed = 0;
+ *pdwInputNextPos = g->dwInNextPos;
+ *pdwOutputThisPos = g->dwOutNextPos;
+ return IP_DONE;
+ }
+
+ /**** Output a Row ****/
+
+ nBytes = g->dwBytesPerRow;
+ INSURE (dwInputAvail >= (DWORD)nBytes );
+ INSURE (dwOutputAvail >= (DWORD)nBytes);
+
+ pIn = pbInputBuf;
+ pOut = pbOutputBuf;
+ pInAfter = pIn + nBytes;
+
+ if ((int)g->dwRowsDone<g->iTop || (int)g->dwRowsDone>g->iBottom) {
+ /* Gray-out the entire row */
+ while (pIn < pInAfter) {
+ GRAYOUT_PIXEL
+ }
+ } else {
+ /* Gray-out portion of row between iLeft and iRight */
+ pLeft = pIn + 3*g->iLeft;
+ pRight = pIn + 3*g->iRight;
+
+ if (pLeft >= pInAfter)
+ pLeft = pInAfter - 3; /* clamp to rightmost pixel */
+ if (pRight >= pInAfter)
+ pRight = pInAfter - 3; /* clamp to rightmost pixel */
+
+ while (pIn < pLeft) { /* gray-out left portion */
+ GRAYOUT_PIXEL
+ }
+ while (pIn <= pRight) { /* copy portion within rect */
+ *pOut++ = *pIn++;
+ *pOut++ = *pIn++;
+ *pOut++ = *pIn++;
+ }
+ while (pIn < pInAfter) { /* gray-out right portion */
+ GRAYOUT_PIXEL
+ }
+ }
+
+ *pdwInputUsed = nBytes;
+ g->dwInNextPos += nBytes;
+ *pdwInputNextPos = g->dwInNextPos;
+
+ *pdwOutputUsed = nBytes;
+ *pdwOutputThisPos = g->dwOutNextPos;
+ g->dwOutNextPos += nBytes;
+
+ g->dwRowsDone += 1;
+
+ return IP_CONSUMED_ROW | IP_PRODUCED_ROW | IP_READY_FOR_DATA;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * grayOut_insertedData - client inserted into our output stream
+ *
+\*****************************************************************************/
+
+FUNC_STATUS WORD grayOut_insertedData (
+ IP_XFORM_HANDLE hXform,
+ DWORD dwNumBytes)
+{
+ fatalBreakPoint ();
+ return IP_FATAL_ERROR; /* must never be called (can't insert data) */
+}
+
+
+
+/*****************************************************************************\
+ *
+ * grayOut_newPage - Tells us to flush this page, and start a new page
+ *
+\*****************************************************************************/
+
+FUNC_STATUS WORD grayOut_newPage (
+ IP_XFORM_HANDLE hXform)
+{
+ PGRAYOUT_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+ /* todo: return fatal error if convert is called again? */
+ return IP_DONE; /* can't insert page-breaks, so ignore this call */
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+
+}
+
+
+
+/*****************************************************************************\
+ *
+ * grayOut_closeXform - Destroys this instance
+ *
+\*****************************************************************************/
+
+FUNC_STATUS WORD grayOut_closeXform (IP_XFORM_HANDLE hXform)
+{
+ PGRAYOUT_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ g->dwValidChk = 0;
+ IP_MEM_FREE (g); /* free memory for the instance */
+
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * grayOutTbl - Jump-table for transform driver
+ *
+\*****************************************************************************/
+#ifdef EXPORT_TRANSFORM
+__declspec (dllexport)
+#endif
+IP_XFORM_TBL grayOutTbl = {
+ grayOut_openXform,
+ grayOut_setDefaultInputTraits,
+ grayOut_setXformSpec,
+ grayOut_getHeaderBufSize,
+ grayOut_getActualTraits,
+ grayOut_getActualBufSizes,
+ grayOut_convert,
+ grayOut_newPage,
+ grayOut_insertedData,
+ grayOut_closeXform
+};
+
+/* End of File */
+
+
+/*****************************************************************************\
+ *
+ * ipGetXformTable - Returns pointer to the jump table
+ *
+\*****************************************************************************/
+
+#ifdef EXPORT_TRANSFORM
+EXPORT(WORD) ipGetXformTable (LPIP_XFORM_TBL pXform)
+{
+ WORD wRet = IP_DONE;
+
+ if (pXform)
+ *pXform = clrmapTbl;
+ else
+ wRet = IP_FATAL_ERROR;
+
+ return wRet;
+}
+#endif
diff --git a/ip/xinvert.c b/ip/xinvert.c
new file mode 100644
index 0000000..a187fa9
--- /dev/null
+++ b/ip/xinvert.c
@@ -0,0 +1,459 @@
+/* libhpojip -- HP OfficeJet image-processing library. */
+
+/* Copyright (C) 1995-2002 Hewlett-Packard Company
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ * MA 02111-1307, USA.
+ *
+ * In addition, as a special exception, Hewlett-Packard Company
+ * gives permission to link the code of this program with any
+ * version of the OpenSSL library which is distributed under a
+ * license identical to that listed in the included LICENSE.OpenSSL
+ * file, and distribute linked combinations including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * this file, you may extend this exception to your version of the
+ * file, but you are not obligated to do so. If you do not wish to
+ * do so, delete this exception statement from your version.
+ */
+
+/* Original author: David Paschal (based on Mark Overton's "xskel" template). */
+
+/******************************************************************************\
+ *
+ * xinvert.c - Inverts bilevel, grayscale, or color data.
+ *
+ ******************************************************************************
+ *
+ * Name of Global Jump-Table:
+ *
+ * invertTbl
+ *
+ * Items in aXformInfo array passed into setXformSpec:
+ *
+ * None.
+ *
+ * Capabilities and Limitations:
+ *
+ * For 1-3 bpp, does a NOT operation (complements the bits).
+ * For >3 bpp, does a NEG operation (NEG plus 1).
+ *
+ * Default Input Traits, and Output Traits:
+ *
+ * Describe what you do with the default input traits, and how the
+ * output traits are determined.
+ *
+ * trait default input output
+ * ------------------- --------------------- ------------------------
+ * iPixelsPerRow * passed into output same as default input
+ * iBitsPerPixel * passed into output same as default input
+ * iComponentsPerPixel * passed into output same as default input
+ * lHorizDPI passed into output same as default input
+ * lVertDPI passed into output same as default input
+ * lNumRows passed into output same as default input
+ * iNumPages passed into output same as default input
+ * iPageNum passed into output same as default input
+ *
+ * Above, a "*" by an item indicates it must be valid (not negative).
+ *
+\******************************************************************************/
+
+// Use the #define below if this transform will exist in a dll outside of the
+// image pipeline. This will allow the functions to be exported.
+// #define EXPORT_TRANFORM 1
+
+#include "hpip.h"
+#include "ipdefs.h"
+#include "string.h" /* for memset and memcpy */
+
+
+#if 0
+ #include "stdio.h"
+ #include <tchar.h>
+ #define PRINT(msg,arg1,arg2) \
+ _ftprintf(stderr, msg, (int)arg1, (int)arg2)
+#else
+ #define PRINT(msg,arg1,arg2)
+#endif
+
+#define CHECK_VALUE 0x4ba1dace
+
+#ifdef EXPORT_TRANSFORM
+#define FUNC_STATUS __declspec (dllexport)
+#else
+#define FUNC_STATUS static
+#endif
+
+typedef struct {
+ IP_IMAGE_TRAITS traits; /* traits of the input and output image */
+ DWORD dwBytesPerRow; /* # of bytes in each row */
+ DWORD dwRowsDone; /* number of rows converted so far */
+ DWORD dwInNextPos; /* file pos for subsequent input */
+ DWORD dwOutNextPos; /* file pos for subsequent output */
+ DWORD dwAddToNot; /* 0=NOT, 1=NEG operation. */
+ DWORD dwValidChk; /* struct validity check value */
+} INVERT_INST, *PINVERT_INST;
+
+
+
+/*****************************************************************************\
+ *
+ * invert_openXform - Creates a new instance of the transformer
+ *
+ *****************************************************************************
+ *
+ * This returns a handle for the new instance to be passed into
+ * all subsequent calls.
+ *
+ * Return value: IP_DONE=success; IP_FATAL_ERROR=misc error.
+ *
+\*****************************************************************************/
+
+FUNC_STATUS WORD invert_openXform (
+ IP_XFORM_HANDLE *pXform) /* out: returned handle */
+{
+ PINVERT_INST g;
+
+ INSURE (pXform != NULL);
+ IP_MEM_ALLOC (sizeof(INVERT_INST), g);
+ *pXform = g;
+ memset (g, 0, sizeof(INVERT_INST));
+ g->dwValidChk = CHECK_VALUE;
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * invert_setDefaultInputTraits - Specifies default input image traits
+ *
+ *****************************************************************************
+ *
+ * The header of the file-type handled by the transform probably does
+ * not include *all* the image traits we'd like to know. Those not
+ * specified in the file-header are filled in from info provided by
+ * this routine.
+ *
+ * Return value: IP_DONE=success; IP_FATAL_ERROR=misc error.
+ *
+\*****************************************************************************/
+
+FUNC_STATUS WORD invert_setDefaultInputTraits (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ PIP_IMAGE_TRAITS pTraits) /* in: default image traits */
+{
+ PINVERT_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ /* insure that traits we care about are known */
+ INSURE (pTraits->iPixelsPerRow>0 && pTraits->iBitsPerPixel>0);
+ g->traits = *pTraits; /* a structure copy */
+ g->dwBytesPerRow = (g->traits.iPixelsPerRow*g->traits.iBitsPerPixel + 7) / 8;
+ if (pTraits->iBitsPerPixel>3) {
+ g->dwAddToNot=1;
+ } else {
+ g->dwAddToNot=0;
+ }
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * invert_setXformSpec - Provides xform-specific information
+ *
+\*****************************************************************************/
+
+FUNC_STATUS WORD invert_setXformSpec (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD_OR_PVOID aXformInfo[]) /* in: xform information */
+{
+ PINVERT_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ /* Check your options in aXformInfo here, and save them.
+ * Use the INSURE macro like you'd use assert. INSURE jumps to
+ * fatal_error below if it fails.
+ */
+
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * invert_getHeaderBufSize- Returns size of input buf needed to hold header
+ *
+\*****************************************************************************/
+
+FUNC_STATUS WORD invert_getHeaderBufSize (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD *pdwInBufLen) /* out: buf size for parsing header */
+{
+ /* since input is raw pixels, there is no header, so set it to zero */
+ *pdwInBufLen = 0;
+ return IP_DONE;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * invert_getActualTraits - Parses header, and returns input & output traits
+ *
+\*****************************************************************************/
+
+FUNC_STATUS WORD invert_getActualTraits (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD dwInputAvail, /* in: # avail bytes in input buf */
+ PBYTE pbInputBuf, /* in: ptr to input buffer */
+ PDWORD pdwInputUsed, /* out: # bytes used from input buf */
+ PDWORD pdwInputNextPos,/* out: file-pos to read from next */
+ PIP_IMAGE_TRAITS pInTraits, /* out: input image traits */
+ PIP_IMAGE_TRAITS pOutTraits) /* out: output image traits */
+{
+ PINVERT_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ /* Since there is no header, we'll report no usage of input */
+ *pdwInputUsed = 0;
+ *pdwInputNextPos = 0;
+ g->dwInNextPos = 0;
+
+ *pInTraits = g->traits; /* structure copies */
+ *pOutTraits = g->traits;
+
+ return IP_DONE | IP_READY_FOR_DATA;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/****************************************************************************\
+ *
+ * invert_getActualBufSizes - Returns buf sizes needed for remainder of job
+ *
+\****************************************************************************/
+
+FUNC_STATUS WORD invert_getActualBufSizes (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ PDWORD pdwMinInBufLen, /* out: min input buf size */
+ PDWORD pdwMinOutBufLen) /* out: min output buf size */
+{
+ PINVERT_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ *pdwMinInBufLen = *pdwMinOutBufLen = g->dwBytesPerRow;
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * invert_convert - Converts one row
+ *
+\*****************************************************************************/
+
+FUNC_STATUS WORD invert_convert (
+ IP_XFORM_HANDLE hXform,
+ DWORD dwInputAvail, /* in: # avail bytes in in-buf */
+ PBYTE pbInputBuf, /* in: ptr to in-buffer */
+ PDWORD pdwInputUsed, /* out: # bytes used from in-buf */
+ PDWORD pdwInputNextPos, /* out: file-pos to read from next */
+ DWORD dwOutputAvail, /* in: # avail bytes in out-buf */
+ PBYTE pbOutputBuf, /* in: ptr to out-buffer */
+ PDWORD pdwOutputUsed, /* out: # bytes written in out-buf */
+ PDWORD pdwOutputThisPos) /* out: file-pos to write the data */
+{
+ PINVERT_INST g;
+ int nBytes,i;
+ PBYTE pIn, pOut;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ /**** Check if we were told to flush ****/
+
+ if (pbInputBuf == NULL) {
+ PRINT (_T("invert_convert: Told to flush.\n"), 0, 0);
+ *pdwInputUsed = *pdwOutputUsed = 0;
+ *pdwInputNextPos = g->dwInNextPos;
+ *pdwOutputThisPos = g->dwOutNextPos;
+ return IP_DONE;
+ }
+
+ /**** Output a Row ****/
+
+ nBytes = g->dwBytesPerRow;
+ INSURE (dwInputAvail >= (DWORD)nBytes );
+ INSURE (dwOutputAvail >= (DWORD)nBytes);
+
+ pIn = pbInputBuf;
+ pOut = pbOutputBuf;
+
+ /* At this point, pIn is your input buffer, and pOut is your output buffer.
+ * Do whatever you are going to do here.
+ */
+ for (i=0;i<nBytes;i++) {
+ pOut[i]=~pIn[i]+g->dwAddToNot;
+ }
+
+ *pdwInputUsed = nBytes;
+ g->dwInNextPos += nBytes;
+ *pdwInputNextPos = g->dwInNextPos;
+
+ *pdwOutputUsed = nBytes;
+ *pdwOutputThisPos = g->dwOutNextPos;
+ g->dwOutNextPos += nBytes;
+
+ g->dwRowsDone += 1;
+
+ return IP_CONSUMED_ROW | IP_PRODUCED_ROW | IP_READY_FOR_DATA;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * invert_insertedData - client inserted into our output stream
+ *
+\*****************************************************************************/
+
+FUNC_STATUS WORD invert_insertedData (
+ IP_XFORM_HANDLE hXform,
+ DWORD dwNumBytes)
+{
+ fatalBreakPoint ();
+ return IP_FATAL_ERROR; /* must never be called (can't insert data) */
+}
+
+
+
+/*****************************************************************************\
+ *
+ * invert_newPage - Tells us to flush this page, and start a new page
+ *
+\*****************************************************************************/
+
+FUNC_STATUS WORD invert_newPage (
+ IP_XFORM_HANDLE hXform)
+{
+ PINVERT_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+ /* todo: return fatal error if convert is called again? */
+ return IP_DONE; /* can't insert page-breaks, so ignore this call */
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+
+}
+
+
+
+/*****************************************************************************\
+ *
+ * invert_closeXform - Destroys this instance
+ *
+\*****************************************************************************/
+
+FUNC_STATUS WORD invert_closeXform (IP_XFORM_HANDLE hXform)
+{
+ PINVERT_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ g->dwValidChk = 0;
+ IP_MEM_FREE (g); /* free memory for the instance */
+
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * invertTbl - Jump-table for transform driver
+ *
+\*****************************************************************************/
+#ifdef EXPORT_TRANSFORM
+__declspec (dllexport)
+#endif
+IP_XFORM_TBL invertTbl = {
+ invert_openXform,
+ invert_setDefaultInputTraits,
+ invert_setXformSpec,
+ invert_getHeaderBufSize,
+ invert_getActualTraits,
+ invert_getActualBufSizes,
+ invert_convert,
+ invert_newPage,
+ invert_insertedData,
+ invert_closeXform
+};
+
+/* End of File */
+
+
+/*****************************************************************************\
+ *
+ * ipGetXformTable - Returns pointer to the jump table
+ *
+\*****************************************************************************/
+
+#ifdef EXPORT_TRANSFORM
+EXPORT(WORD) ipGetXformTable (LPIP_XFORM_TBL pXform)
+{
+ WORD wRet = IP_DONE;
+
+ if (pXform)
+ {
+ *pXform = clrmapTbl;
+ }
+ else
+ {
+ wRet = IP_FATAL_ERROR;
+ }
+
+ return wRet;
+}
+#endif
diff --git a/ip/xjpg_dct.c b/ip/xjpg_dct.c
new file mode 100644
index 0000000..b20e17e
--- /dev/null
+++ b/ip/xjpg_dct.c
@@ -0,0 +1,393 @@
+/* libhpojip -- HP OfficeJet image-processing library. */
+
+/* Copyright (C) 1995-2002 Hewlett-Packard Company
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ * MA 02111-1307, USA.
+ *
+ * In addition, as a special exception, Hewlett-Packard Company
+ * gives permission to link the code of this program with any
+ * version of the OpenSSL library which is distributed under a
+ * license identical to that listed in the included LICENSE.OpenSSL
+ * file, and distribute linked combinations including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * this file, you may extend this exception to your version of the
+ * file, but you are not obligated to do so. If you do not wish to
+ * do so, delete this exception statement from your version.
+ */
+
+/* Original author: Mark Overton and others.
+ *
+ * Ported to Linux by David Paschal.
+ */
+
+/*____________________________________________________________________________
+ | | |
+ | xjpg_dct.c | Computes forward and inverse DCT for JPEG |
+ |____________|_______________________________________________________________|
+ | |
+ | Mark Overton, May 1997 |
+ |____________________________________________________________________________|
+*/
+
+#include "xjpg_dct.h"
+
+
+/*____________________________________________________________________________
+ | | |
+ | SUB_AND_ADD | replaces a with a-b, and b with a+b using no temp registers |
+ |_____________|______________________________________________________________|
+*/
+#define SUB_AND_ADD(a,b) { \
+ b += a; \
+ a += a; \
+ a -= b; \
+}
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | MUL_ROUND | computes x = round(x*c), using no temp registers |
+ |___________|________________________________________________________________|
+ | |
+ | c is assumed to have CONST_FRAC_BITS bits of fraction. |
+ |____________________________________________________________________________|
+*/
+#if (defined _WINDOWS) && !(defined _WIN32)
+
+ /* We are compiling for 16-bit Windows 3.1 */
+
+ #define MUL_ROUND(c,x) { \
+ long product; \
+ product = (long)(x) * ((long)(c) << (16-CONST_FRAC_BITS)); \
+ x = (product+0x8000L) >> 16; \
+ }
+
+#else
+
+ #define MUL_ROUND(c,x) { \
+ x = (short)(x) * (short)(c); \
+ x = ((x)+(1l<<(CONST_FRAC_BITS-1))) >> CONST_FRAC_BITS; \
+ }
+
+#endif
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | dct_forward | computes DCT for JPEG |
+ |_____________|______________________________________________________________|
+ | |
+ | This is the DCT algorithm based on the small FFT Winograd transform |
+ | from Trans. IEICE, vol. E 71(11), 1095-1097, Nov. 1988 |
+ | |
+ | Input: 'block' is 64 level-shifted pixels (-128..127 each). |
+ | |
+ | Output: 'block' is the DCT (64 words). |
+ | These values need to be scaled by the forward correction matrix |
+ | for the Winograd DCT. |
+ |____________________________________________________________________________|
+*/
+void dct_forward (register int *block_p)
+{
+ #define CONST_FRAC_BITS 14 /* bits of frac in CONST_1-CONST_5 below */
+
+ #define CONST_1 (23170/2) /* 15 bits of frac shifted down to 14 */
+ #define CONST_2 (17734/2)
+ #define CONST_3 (23170/2)
+ #define CONST_4 (42813/2) /* this one wouldn't fit with 15 bits of frac */
+ #define CONST_5 (12540/2)
+
+ int *data_p;
+ int d0, d1, d2, d3, d4, d5, d6, d7;
+
+ /******************/
+ /* Transform Rows */
+ /******************/
+
+ for (data_p=block_p; data_p<block_p+64; data_p+=8)
+ {
+ d0 = data_p[0];
+ d1 = data_p[1];
+ d2 = data_p[2];
+ d3 = data_p[3];
+ d4 = data_p[4];
+ d5 = data_p[5];
+ d6 = data_p[6];
+ d7 = data_p[7];
+
+ SUB_AND_ADD (d0, d7)
+ SUB_AND_ADD (d1, d6)
+ SUB_AND_ADD (d2, d5)
+ SUB_AND_ADD (d4, d3)
+
+ SUB_AND_ADD (d7, d3)
+ SUB_AND_ADD (d6, d5)
+
+ SUB_AND_ADD (d3, d5)
+ data_p[4] = d3;
+ data_p[0] = d5;
+
+ d6 += d7;
+ MUL_ROUND (CONST_1, d6)
+ SUB_AND_ADD (d7, d6)
+ data_p[6] = d7;
+ data_p[2] = d6;
+
+ /* At this point, the only live math vars are in: d0, d1, d2, d4 */
+
+ d7 = d1 + d2;
+ MUL_ROUND (CONST_3, d7)
+ d1 += d0;
+ SUB_AND_ADD (d0, d7)
+ d4 -= d2;
+ d6 = d1 + d4;
+ MUL_ROUND (CONST_5, d6)
+ MUL_ROUND (CONST_4, d1)
+ d1 -= d6;
+
+ SUB_AND_ADD (d7, d1)
+ data_p[7] = d7;
+ data_p[1] = d1;
+
+ MUL_ROUND (CONST_2, d4)
+ d4 += d6;
+ SUB_AND_ADD (d0, d4)
+ data_p[5] = d0;
+ data_p[3] = d4;
+ }
+
+ /*********************/
+ /* Transform Columns */
+ /*********************/
+
+ for (data_p=block_p; data_p<block_p+8; data_p++)
+ {
+ d0 = data_p[0*8];
+ d7 = data_p[7*8];
+ SUB_AND_ADD (d0, d7)
+
+ d4 = data_p[4*8];
+ d3 = data_p[3*8];
+ SUB_AND_ADD (d4, d3)
+
+ d1 = data_p[1*8];
+ d6 = data_p[6*8];
+ SUB_AND_ADD (d1, d6)
+
+ d2 = data_p[2*8];
+ d5 = data_p[5*8];
+ SUB_AND_ADD (d2, d5)
+
+ SUB_AND_ADD (d7, d3)
+ SUB_AND_ADD (d6, d5)
+
+ SUB_AND_ADD (d3, d5)
+ data_p[4*8] = d3;
+ data_p[0*8] = d5;
+
+ d6 += d7;
+ MUL_ROUND (CONST_1, d6)
+ SUB_AND_ADD (d7, d6)
+ data_p[6*8] = d7;
+ data_p[2*8] = d6;
+
+ /* At this point, the only live math vars are in: d0, d1, d2, d4 */
+
+ d7 = d1 + d2;
+ MUL_ROUND (CONST_3, d7)
+ d1 += d0;
+ SUB_AND_ADD (d0, d7)
+ d4 -= d2;
+ d6 = d1 + d4;
+ MUL_ROUND (CONST_5, d6)
+ MUL_ROUND (CONST_4, d1)
+ d1 -= d6;
+
+ SUB_AND_ADD (d7, d1)
+ data_p[7*8] = d7;
+ data_p[1*8] = d1;
+
+ MUL_ROUND (CONST_2, d4)
+ d4 += d6;
+ SUB_AND_ADD (d0, d4)
+ data_p[5*8] = d0;
+ data_p[3*8] = d4;
+ }
+
+ #undef CONST_FRAC_BITS
+ #undef CONST_1
+ #undef CONST_2
+ #undef CONST_3
+ #undef CONST_4
+ #undef CONST_5
+} /* end of dct_forward */
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | dct_inverse | computes inverse DCT for JPEG |
+ |_____________|______________________________________________________________|
+ | |
+ | This is the DCT algorithm based on the small FFT Winograd transform |
+ | from Trans. IEICE, vol. E 71(11), 1095-1097, Nov. 1988 |
+ | |
+ | Input: 'block' is the DCT (64 words). |
+ | These values are assumed to have been scaled by the inverse |
+ | correction matrix for the Winograd DCT. |
+ | |
+ | Output: 'block' is 64 level-shifted pixels. These values will have |
+ | as many bits of fraction as the input DCT had. After rounding |
+ | and level-shifting, you must clamp these values to 0..255. |
+ |____________________________________________________________________________|
+*/
+void dct_inverse (register int *block_p)
+{
+ #define CONST_FRAC_BITS 13 /* bits of frac in CONST_1-CONST_5 below */
+
+ #define CONST_1 ((46341+2)/4) /* 15 bits of frac shifted down to 13 */
+ #define CONST_2 ((85627+2)/4)
+ #define CONST_3 ((46341+2)/4)
+ #define CONST_4 ((35468+2)/4)
+ #define CONST_5 ((25080+2)/4)
+
+ int *data_p;
+ int d0, d1, d2, d3, d4, d5, d6, d7, tmp;
+
+ /*********************/
+ /* Transform Columns */
+ /*********************/
+
+ for (data_p=block_p; data_p<block_p+8; data_p++)
+ {
+ d0 = data_p[0*8];
+ d4 = data_p[4*8];
+ SUB_AND_ADD (d0, d4)
+
+ d1 = data_p[1*8];
+ d7 = data_p[7*8];
+ SUB_AND_ADD (d1, d7)
+
+ d2 = data_p[2*8];
+ d6 = data_p[6*8];
+ SUB_AND_ADD (d2, d6)
+
+ d5 = data_p[5*8];
+ d3 = data_p[3*8];
+ SUB_AND_ADD (d5, d3)
+
+ MUL_ROUND (CONST_1, d2)
+ d2 -= d6;
+ SUB_AND_ADD (d0, d2)
+ SUB_AND_ADD (d4, d6)
+ SUB_AND_ADD (d7, d3)
+
+ tmp = d3;
+ SUB_AND_ADD (d6, d3)
+ data_p[7*8] = d6;
+ data_p[0*8] = d3;
+
+ d6 = d5 - d1;
+ MUL_ROUND (CONST_5, d6);
+ MUL_ROUND (CONST_4, d1)
+ d1 -= d6;
+ d1 -= tmp;
+ MUL_ROUND (CONST_3, d7)
+ d7 -= d1;
+ MUL_ROUND (CONST_2, d5)
+ d6 -= d5;
+ d6 += d7;
+
+ SUB_AND_ADD (d2, d1)
+ data_p[6*8] = d2;
+ data_p[1*8] = d1;
+
+ SUB_AND_ADD (d0, d7)
+ data_p[5*8] = d0;
+ data_p[2*8] = d7;
+
+ SUB_AND_ADD (d4, d6)
+ data_p[3*8] = d4;
+ data_p[4*8] = d6;
+ }
+
+ /******************/
+ /* Transform Rows */
+ /******************/
+
+ for (data_p=block_p; data_p<block_p+64; data_p+=8)
+ {
+ d0 = data_p[0];
+ d1 = data_p[1];
+ d2 = data_p[2];
+ d3 = data_p[3];
+ d4 = data_p[4];
+ d5 = data_p[5];
+ d6 = data_p[6];
+ d7 = data_p[7];
+
+ SUB_AND_ADD (d0, d4)
+ SUB_AND_ADD (d1, d7)
+ SUB_AND_ADD (d2, d6)
+ SUB_AND_ADD (d5, d3)
+
+ MUL_ROUND (CONST_1, d2)
+ d2 -= d6;
+ SUB_AND_ADD (d0, d2)
+ SUB_AND_ADD (d4, d6)
+ SUB_AND_ADD (d7, d3)
+
+ tmp = d3;
+ SUB_AND_ADD (d6, d3)
+ data_p[7] = d6;
+ data_p[0] = d3;
+
+ d6 = d5 - d1;
+ MUL_ROUND (CONST_5, d6)
+ MUL_ROUND (CONST_4, d1)
+ d1 -= d6;
+ d1 -= tmp;
+ MUL_ROUND (CONST_3, d7)
+ d7 -= d1;
+ MUL_ROUND (CONST_2, d5)
+ d6 -= d5;
+ d6 += d7;
+
+ SUB_AND_ADD (d2, d1)
+ data_p[6] = d2;
+ data_p[1] = d1;
+
+ SUB_AND_ADD (d0, d7)
+ data_p[5] = d0;
+ data_p[2] = d7;
+
+ SUB_AND_ADD (d4, d6)
+ data_p[3] = d4;
+ data_p[4] = d6;
+ }
+
+ #undef CONST_FRAC_BITS
+ #undef CONST_1
+ #undef CONST_2
+ #undef CONST_3
+ #undef CONST_4
+ #undef CONST_5
+} /* end of dct_inverse */
+
+/* End of File */
diff --git a/ip/xjpg_dct.h b/ip/xjpg_dct.h
new file mode 100644
index 0000000..15fedb8
--- /dev/null
+++ b/ip/xjpg_dct.h
@@ -0,0 +1,50 @@
+/* libhpojip -- HP OfficeJet image-processing library. */
+
+/* Copyright (C) 1995-2002 Hewlett-Packard Company
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ * MA 02111-1307, USA.
+ *
+ * In addition, as a special exception, Hewlett-Packard Company
+ * gives permission to link the code of this program with any
+ * version of the OpenSSL library which is distributed under a
+ * license identical to that listed in the included LICENSE.OpenSSL
+ * file, and distribute linked combinations including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * this file, you may extend this exception to your version of the
+ * file, but you are not obligated to do so. If you do not wish to
+ * do so, delete this exception statement from your version.
+ */
+
+/* Original author: Mark Overton and others.
+ *
+ * Ported to Linux by David Paschal.
+ */
+
+/*____________________________________________________________________________
+ | | |
+ | xjpg_dct.h | Computes forward and inverse DCT for JPEG |
+ |____________|_______________________________________________________________|
+ | |
+ | Mark Overton, May 1997 |
+ |____________________________________________________________________________|
+*/
+
+void dct_forward (register int *block_p);
+
+void dct_inverse (register int *block_p);
+
+/* End of File */
diff --git a/ip/xjpg_dec.c b/ip/xjpg_dec.c
new file mode 100644
index 0000000..507e11a
--- /dev/null
+++ b/ip/xjpg_dec.c
@@ -0,0 +1,2838 @@
+/* libhpojip -- HP OfficeJet image-processing library. */
+
+/* Copyright (C) 1995-2002 Hewlett-Packard Company
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ * MA 02111-1307, USA.
+ *
+ * In addition, as a special exception, Hewlett-Packard Company
+ * gives permission to link the code of this program with any
+ * version of the OpenSSL library which is distributed under a
+ * license identical to that listed in the included LICENSE.OpenSSL
+ * file, and distribute linked combinations including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * this file, you may extend this exception to your version of the
+ * file, but you are not obligated to do so. If you do not wish to
+ * do so, delete this exception statement from your version.
+ */
+
+/* Original author: Mark Overton and others.
+ *
+ * Ported to Linux by David Paschal.
+ */
+
+/*****************************************************************************\
+ *
+ * xjpg_dec.c - Decodes a JPEG file into a raw gray image
+ *
+ *****************************************************************************
+ *
+ * Name of Global Jump-Table:
+ *
+ * jpgDecodeTbl
+ *
+ * Items in aXformInfo array passed into setXformSpec:
+ *
+ * aXformInfo[IP_JPG_DECODE_OUTPUT_SUBSAMPLED]:
+ * Output only subsampled raw data? 0=no, 1=yes.
+ * aXformInfo[IP_JPG_DECODE_FROM_DENALI]:
+ * Data came from a Denali? 0=no, 1=yes.
+ *
+ * The aXformInfo items above may all be set to 0 for typical JPEG files.
+ *
+ * For Denali, we assume the following:
+ * - Every 8x8 block ends with an EOB
+ * - A slight change in the Huffman tables (no 15-bit code)
+ * - Denali sends us a proprietary short header (APP1 marker)
+ *
+ * Capabilities and Limitations:
+ *
+ * Decodes a standard JPEG file. Also handles JFIF 1.0 (APP0 marker).
+ * Also handles the non-standard short header output by OfficeJet firmware
+ * (APP1 marker). Also handles APP1 markers defined by color fax standard.
+ * Will *not* decode a non-interleaved file; it must be interleaved.
+ * Handles 1-4 components per pixel, and 4 Huffman tables, so SOF1 with
+ * 8 bits/component is okay.
+ *
+ * Default Input Traits, and Output Traits:
+ *
+ * For decoder:
+ *
+ * trait default input output
+ * ------------------- ------------------- ------------------------
+ * iPixelsPerRow ignored based on header
+ * iBitsPerPixel ignored based on header
+ * iComponentsPerPixel ignored based on header
+ * lHorizDPI ignored based on header
+ * lVertDPI ignored based on header
+ * lNumRows ignored based on header
+ * iNumPages passed into output same as default input
+ * iPageNum passed into output same as default input
+ *
+ * Kludges:
+ *
+ * Chromafax and other software inserts fill 0's instead of fill 1's
+ * before a marker, such as the all-important EOI marker. So when
+ * we get a syntax error when parsing those 0's, we do not report
+ * an error if there's a following marker, but simply proceed to
+ * process the marker as usual.
+ *
+ * Chromafax uses an SOF1 instead of the correct SOF0, so we allow
+ * that, and also handle four Huffman tables that SOF1 requires.
+ *
+ * Jan 1998 Mark Overton -- Ported to new software Image Processor
+ * Apr 1996 Mark Overton -- Finished software-only JPEG decoder
+ * Feb 1996 Mark Overton -- initial code
+ *
+\*****************************************************************************/
+
+#include <string.h>
+#include <assert.h>
+
+#include "hpip.h"
+#include "ipdefs.h"
+#include "setjmp.h"
+#include "xjpg_dct.h"
+#include "xjpg_mrk.h"
+
+
+#define DUMP_JPEG 0
+
+#if DUMP_JPEG
+ #include "stdio.h"
+ #include <tchar.h>
+
+ #define DUMP(msg,arg1,arg2,arg3) \
+ _ftprintf(stdout, msg, (int)(arg1), (int)(arg2), (int)(arg3))
+#else
+ #define DUMP(msg,arg1,arg2,arg3)
+#endif
+
+
+#if 0
+ #include "stdio.h"
+ #include <tchar.h>
+ #define PRINT(msg,arg1,arg2) \
+ _ftprintf(stdout, _T("(jpeg) ") msg, (int)arg1, (int)arg2)
+#else
+ #define PRINT(msg,arg1,arg2)
+#endif
+
+
+/*____________________________________________________________________________
+ | |
+ | Constants |
+ |____________________________________________________________________________|
+*/
+
+#define MAX_HUFF_TBLS 4
+
+#define UNEXPECTED_MARKER 1
+#define BAD_MARKER_ID 2
+#define BAD_MARKER_DATA 3
+#define NO_RESTART_MARKER 4
+#define BAD_HUFF_CODE 5
+#define UNEXPECTED_END_OF_DATA 6
+#define NOT_IMPLEMENTED 7
+
+#define MAX_MARKER_LEN 15000 /* large in case marker holds a thumbnail */
+#define MAX_HEADER_SIZE (MAX_MARKER_LEN+2000)
+#define MAX_BLOCKS_IN_MCU 6
+#define MAX_MCU_SIZE (MAX_BLOCKS_IN_MCU*304)
+ /* max encoded MCU size, plus stuff-bytes */
+#define INBUF_NUM_MCUS 2 /* workbuf will be this multiple of max MCU */
+
+#define DC_TBL_INDEX_LEN 9
+#define AC_TBL_INDEX_LEN 12
+
+#define CHECK_VALUE 0x1ce5ca7e
+
+
+
+/*____________________________________________________________________________
+ | |
+ | Instance Variables |
+ |____________________________________________________________________________|
+*/
+
+typedef struct {
+ BYTE size; /* number of bits in the Huff code (code is the index) */
+ BYTE value; /* value that was coded */
+} main_huff_elem_t;
+
+typedef struct {
+ WORD code; /* Huff code to use for the 'value' below */
+ BYTE size; /* number of bits in above Huff 'code' */
+ BYTE value; /* value that was coded */
+} aux_huff_elem_t;
+
+typedef struct {
+ BYTE *index_p;
+ main_huff_elem_t *main_p;
+ aux_huff_elem_t *aux_p;
+} huff_tbl_t;
+
+
+/* Decoding is centered around out_rows_ap. It is indexed by
+ * [color_component_number][row_number].
+ * color_component_number 0 is Y (intensity); mono only has this component.
+ *
+ * Each component in out_rows_ap has a height (# rows) equal to the number of
+ * samples in the MCU, and a width equal to the number of samples in all the
+ * MCUs in a row. That is, pixels are stored in out_rows_ap with NO REPLICATION.
+ * So if a component has sample factors of H and V, it will have 8*V rows and
+ * pixels_in_row*H/max_horiz_samp_fac columns in out_rows_ap.
+ */
+
+typedef struct {
+ BYTE *out_rows_ap[4][32]; /* row-buffers [component][row] */
+
+ /***** Items from SOF, Start Of Frame *****/
+
+ IP_IMAGE_TRAITS traits; /* traits of the image */
+ BYTE num_comps; /* # of components (1 => mono) */
+ BYTE horiz_samp_facs[4]; /* horizontal sampling factors */
+ BYTE vert_samp_facs [4]; /* vertical sampling factors */
+ BYTE max_horiz_samp_fac; /* max sample factors */
+ BYTE max_vert_samp_fac;
+ BYTE which_quant_tbl[4]; /* selects q tbl for component */
+ UINT rows_per_mcu; /* # rows & cols in each MCU */
+ UINT cols_per_mcu;
+ UINT mcus_per_row; /* # of MCUs in each row */
+ UINT rowCountOffset;
+
+ /***** Items from other markers *****/
+
+ WORD restart_interval; /* restart interval (0 -> none) */
+ long quant_tbls[4][64]; /* quantization tables */
+ BYTE which_dc_tbl[4]; /* selects DC tbl for component */
+ BYTE which_ac_tbl[4]; /* selects AC tbl for component */
+ BOOL fColorFax; /* is this from a fax? */
+
+ /***** Huffman tables *****/
+
+ huff_tbl_t dc_tbls[MAX_HUFF_TBLS];
+ huff_tbl_t ac_tbls[MAX_HUFF_TBLS];
+
+ /***** Configuration variables *****/
+
+ BOOL output_subsampled; /* output subsampled data? */
+ BOOL fDenali; /* data is from a Denali? */
+
+ /***** Variables used while decoding *****/
+
+ DWORD dwInNextPos; /* next read pos in input file */
+ DWORD dwOutNextPos; /* next write pos in output file */
+ long rows_done; /* # rows decoded and output */
+ UINT mcus_done; /* # MCUs decoded so far in row */
+ BOOL sending_rows; /* returning the decoded rows? */
+ BOOL got_short_header; /* got an OfficeJet short header? */
+ BOOL got_EOI; /* hit the end-of-image marker? */
+ BYTE restart_cur_marker; /* index of next expected marker */
+ WORD restart_cur_mcu; /* current MCU-count in interval */
+ int prior_dc[4]; /* DC values of prior block */
+ jmp_buf syntax_error; /* jump-target for syntax errors */
+ jmp_buf old_syntax_error;
+ DWORD dwValidChk; /* struct validity check value */
+
+ /***** Reading bits variables *****/
+
+ DWORD rd_bit_buf;
+ /* Bits to be read from inbuf (read left-to-right). */
+
+ int rd_bits_avail;
+ /* Number of bits not yet read in rd_bit_buf (= 32 - number read). */
+
+ BYTE *rd_inbuf_beg;
+ /* The beginning of the input buffer. */
+
+ BYTE *rd_inbuf_next;
+ /* Next byte in inbuf to be read. */
+
+ /***** Decoding 8x8 blocks *****/
+
+ int block[64]; /* scratch-pad 8x8 block */
+ int *block_zz[64+16]; /* zig-zag ptrs into above block */
+
+} JDEC_INST, *PJDEC_INST;
+
+
+
+/*____________________________________________________________________________
+ | |
+ | Forward Routines |
+ |____________________________________________________________________________|
+*/
+
+static void huff_define_table (
+ PJDEC_INST g,
+ BOOL ac, /* defining an AC table? (else DC) */
+ UINT id, /* which table is being defined (0-3) */
+ const BYTE counts[16], /* number of Huffman codes of each length 1-16 */
+ const BYTE values[]); /* values associated with codes of above lengths */
+
+void wino_scale_table (long *tbl_p);
+
+
+
+
+/******************************************************************************
+ ******************************************************************************
+
+ R E A D I N G
+
+
+ Interface into this section:
+
+ read_init - inits this section
+ read_buf_open - we are being given a (new) input buffer
+ read_buf_close - done with current input buffer; return # bytes used
+ read_byte - returns next input byte (syncs to byte-boundary)
+ read_uint - returns next 2-byte integer (syncs)
+ read_skip_forward - discards the given number of input bytes
+ read_skip_backward - backs up the given number of bytes
+ READ_BITS_LOAD - loads N bits of input into lsb's of a var (no advance)
+ READ_BITS_ADVANCE - advance input N bits; you must call this to eat input
+
+ ******************************************************************************
+ ******************************************************************************/
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | read_init | Inits this section |
+ |___________|________________________________________________________________|
+*/
+static void read_init (PJDEC_INST g)
+{
+ g->rd_bits_avail = 0;
+ g->rd_bit_buf = 0;
+}
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | read_buf_open | We are being given a (new) buffer to read input |
+ |_______________|____________________________________________________________|
+ | |
+ | This routine records the location of the new input buffer. |
+ |____________________________________________________________________________|
+*/
+static void read_buf_open (PJDEC_INST g, BYTE *buf_p)
+{
+ g->rd_inbuf_beg = buf_p;
+ g->rd_inbuf_next = buf_p;
+}
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | read_buf_close | We are done with the current input buffer |
+ |________________|___________________________________________________________|
+ | |
+ | This function returns # bytes read from the input buffer. |
+ |____________________________________________________________________________|
+*/
+static int read_buf_close (PJDEC_INST g)
+{
+ return g->rd_inbuf_next - g->rd_inbuf_beg;
+}
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | rd_sync | Empties the bit-cache, and syncs to a byte-boundary |
+ |_________|__________________________________________________________________|
+*/
+static void rd_sync (PJDEC_INST g)
+{
+ g->rd_bits_avail = 0;
+}
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | read_byte | returns next input byte (syncs to byte-boundary) |
+ |___________|________________________________________________________________|
+*/
+static BYTE read_byte (PJDEC_INST g)
+{
+ rd_sync (g);
+ return *(g->rd_inbuf_next)++;
+}
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | read_uint | returns next 2-byte integer (syncs) |
+ |___________|________________________________________________________________|
+*/
+static unsigned read_uint (PJDEC_INST g)
+{
+ UINT uval;
+
+ rd_sync (g);
+ uval = (unsigned)*(g->rd_inbuf_next)++ << 8;
+ return uval | *(g->rd_inbuf_next)++;
+}
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | read_skip_forward | discards the given number of input bytes |
+ |___________________|________________________________________________________|
+*/
+static void read_skip_forward (PJDEC_INST g, UINT n)
+{
+ if (n > MAX_MARKER_LEN)
+ longjmp (g->syntax_error, BAD_MARKER_DATA);
+ rd_sync (g);
+ g->rd_inbuf_next += n;
+}
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | read_skip_backward | backs up N bytes in the input buffer |
+ |____________________|_______________________________________________________|
+*/
+static void read_skip_backward (PJDEC_INST g, UINT n)
+{
+ rd_sync (g);
+ g->rd_inbuf_next -= n;
+}
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | READ_BITS_LOAD | loads next par_n_bits of input into par_value (no advance)|
+ |________________|___________________________________________________________|
+ | |
+ | If a marker is encountered: |
+ | - this macro will goto hit_marker |
+ | - the marker will be the next two bytes in the buffer |
+ | - the cache will be empty (ie, any fill 1's were discarded) |
+ | |
+ | If the JPEG file erroneously has fill 0's (instead of 1's) before a |
+ | marker, we'll parse them as Huffman codes. If such a bogus Huffman code |
+ | has more bits than were in our bit-buffer, the extra non-existent bits |
+ | will be returned as zeroes. |
+ |____________________________________________________________________________|
+*/
+
+#define CANT_LOAD_NEAR_MARKER(g) \
+ (g->rd_bits_avail<=0 || \
+ (g->rd_bits_avail<=7 && (((1u<<g->rd_bits_avail)-1) & ~g->rd_bit_buf) == 0))
+ /* we just parsed past erroneous fill 0's OR */
+ /* cached bits are just fill 1's; toss them */
+
+
+#define READ_BITS_LOAD(g, fixed_len, par_n_bits, par_value, hit_marker) \
+{ \
+ if ((int)(par_n_bits) > g->rd_bits_avail) { \
+ BYTE a_byte; \
+ \
+ do { \
+ a_byte = *(g->rd_inbuf_next)++; \
+ DUMP (_T("<%02x>"), a_byte, 0, 0); \
+ \
+ if (a_byte == (BYTE )0xffu) { \
+ if (*(g->rd_inbuf_next)++ != 0) { /* we hit a marker */ \
+ g->rd_inbuf_next -= 2; \
+ if (CANT_LOAD_NEAR_MARKER(g)) \
+ goto hit_marker; \
+ break; /* exit 'while' loop */ \
+ } \
+ } \
+ \
+ g->rd_bit_buf = (g->rd_bit_buf<<8) | a_byte; \
+ g->rd_bits_avail += 8; \
+ } while (g->rd_bits_avail <= 24); \
+ } \
+ \
+ par_value = (g->rd_bit_buf << (32-g->rd_bits_avail)) >> (32-(par_n_bits)); \
+}
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | READ_BITS_ADVANCE | discards next par_n_bits of input |
+ |___________________|________________________________________________________|
+*/
+#define READ_BITS_ADVANCE(g, par_n_bits) \
+{ \
+ g->rd_bits_avail -= par_n_bits; \
+}
+
+
+
+/******************************************************************************
+ ******************************************************************************
+
+ M A R K E R S
+
+
+ Interface into this section:
+
+ mar_get - parses and returns next marker-id
+ mar_parse - parses the data associated with the marker
+
+ ******************************************************************************
+ ******************************************************************************/
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | parse_factors | parses sample-factors as nibbles into array |
+ |_______________|____________________________________________________________|
+ | |
+ | This is only called by parse_app_short_header below. |
+ | Function return value = maximum sample factor. |
+ |____________________________________________________________________________|
+*/
+static UINT parse_factors (
+ UINT factors, /* in: sample factors, one nibble each, l-to-r */
+ BYTE fac_array[4]) /* out: array of sample factors */
+{
+ int i;
+ UINT fac;
+ UINT max_fac;
+
+ max_fac = 0;
+
+ for (i=3; i>=0; i--) {
+ fac = factors & 0x000fu;
+ factors >>= 4;
+ if (fac > max_fac) max_fac = fac;
+ fac_array[i] = fac;
+ }
+
+ return max_fac;
+}
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | calc_quant_table | calculates a quantization table |
+ |__________________|_________________________________________________________|
+ | |
+ | This is only called by parse_app_short_header below. |
+ | Warning: The calculation below should match the firmware. |
+ |____________________________________________________________________________|
+*/
+static void calc_quant_table (
+ PJDEC_INST g,
+ UINT dc_q_fac, /* orig DC is scaled by (dc_q_fac/50) */
+ UINT ac_q_fac, /* orig ACs are scaled by (ac_q_fac/50) */
+ const BYTE *orig_tbl_p, /* original table */
+ UINT which_q_tbl) /* which table is being defined (0-3) */
+{
+ int i;
+ UINT quant;
+ long *tbl_p;
+
+ tbl_p = g->quant_tbls[which_q_tbl];
+
+ for (i=0; i<64; i++) {
+ quant = ((*orig_tbl_p++)*(i==0 ? dc_q_fac : ac_q_fac) + 25u) / 50u;
+ if (quant == 0) quant = 1;
+ if (quant > 255) quant = 255;
+ tbl_p[i] = quant;
+ }
+
+ wino_scale_table (tbl_p);
+}
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | mar_get | parses and returns next marker-id |
+ |_________|__________________________________________________________________|
+*/
+static UINT mar_get (PJDEC_INST g)
+{
+ UINT marker = 0; /* init to eliminate a compiler warning */
+ BOOL got_ff;
+
+ got_ff = FALSE;
+
+ while (TRUE) {
+ marker = read_byte (g);
+ if (marker == 0xff) got_ff = TRUE;
+ else break;
+ }
+
+ if (!got_ff || marker==0)
+ longjmp (g->syntax_error, BAD_MARKER_ID);
+
+ return marker;
+}
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | mar_flush | discards data associated with current marker |
+ |___________|________________________________________________________________|
+*/
+static void mar_flush (PJDEC_INST g, UINT marker)
+{
+ if (marker==MARKER_SOI || marker==MARKER_EOI ||
+ (marker>=MARKER_RST0 && marker<=MARKER_RST7))
+ return; /* marker has no associated segment */
+
+ read_skip_forward (g, read_uint(g) - 2);
+}
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | parse_app_jfif | parses a JFIF APP0 marker |
+ |________________|___________________________________________________________|
+ | |
+ | Sets these fields in 'traits': lHorizDPI, lVertDPI |
+ |____________________________________________________________________________|
+*/
+static void parse_app_jfif (PJDEC_INST g)
+{
+ UINT len;
+ BYTE byt;
+ UINT h_dpi, v_dpi;
+
+ len = read_uint (g);
+ byt = read_byte (g);
+ if (! (len==16 && (byt==(BYTE )'J' || byt==(BYTE )'j'))) {
+ /* This is not a JFIF APP-marker, so silently discard it */
+ read_skip_forward (g, len-3);
+ return;
+ }
+
+ read_skip_forward (g,6); /* discard "FIF\0" + 0x01 + 0x00 */
+ byt = read_byte (g);
+ h_dpi = read_uint (g);
+ v_dpi = read_uint (g);
+ read_skip_forward (g,2); /* discard thumbnail X and Y */
+
+ if (byt == 1) { /* 1 means that units are dots/inch */
+ g->traits.lHorizDPI = (DWORD)h_dpi << 16;
+ g->traits.lVertDPI = (DWORD)v_dpi << 16;
+ }
+}
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | parse_app_g3fax | parses a color fax APP1 marker |
+ |_________________|__________________________________________________________|
+ | |
+ | Can set these fields in 'traits': lHorizDPI, lVertDPI |
+ |____________________________________________________________________________|
+ */
+static void parse_app_g3fax (PJDEC_INST g)
+{
+ int i;
+ UINT len, dpi;
+ BYTE id_ver[8];
+ const BYTE valid_id_ver[8] = {
+ 0x47, 0x33, 0x46, 0x41, 0x58, 0x00, /* "G3FAX" plus a 0 byte */
+ 0x07, 0xca }; /* version is year of std, 1994 */
+
+ len = read_uint (g);
+ if (len != 12) {
+ /* wrong version, or a gamut or illuminant spec which we ignore */
+ read_skip_forward (g, len-2);
+ return;
+ }
+
+ for (i=0; i<8; i++) /* fax id is 6 bytes; version is 2 bytes */
+ id_ver[i] = read_byte (g);
+
+ dpi = read_uint (g);
+
+ if (memcmp(id_ver,valid_id_ver,8) == 0
+ && (dpi==200 || dpi==300 || dpi==400)) {
+ /* everything is valid (whew!), so save dpi */
+ g->traits.lHorizDPI = g->traits.lVertDPI = (long)dpi << 16;
+ g->fColorFax = TRUE;
+ }
+}
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | parse_app_short_header | An APP1 marker output by OfficeJet firmware |
+ |________________________|___________________________________________________|
+*/
+static void parse_app_short_header (PJDEC_INST g)
+{
+ /* Since the firmware does not supply tables in its header,
+ * the tables used in the firmware are supplied below. */
+
+ static const BYTE orig_lum_quant[64] = {
+ 16, 11, 12, 14, 12, 10, 16, 14,
+ 13, 14, 18, 17, 16, 19, 24, 40,
+ 26, 24, 22, 22, 24, 49, 35, 37,
+ 29, 40, 58, 51, 61, 60, 57, 51,
+ 56, 55, 64, 72, 92, 78, 64, 68,
+ 87, 69, 55, 56, 80, 109, 81, 87,
+ 95, 98, 103, 104, 103, 62, 77, 113,
+ 121, 112, 100, 120, 92, 101, 103, 99
+ };
+
+
+ static const BYTE orig_chrom_quant[64] = {
+ 17, 18, 18, 24, 21, 24, 47, 26,
+ 26, 47, 99, 66, 56, 66, 99, 99,
+ 99, 99, 99, 99, 99, 99, 99, 99,
+ 99, 99, 99, 99, 99, 99, 99, 99,
+ 99, 99, 99, 99, 99, 99, 99, 99,
+ 99, 99, 99, 99, 99, 99, 99, 99,
+ 99, 99, 99, 99, 99, 99, 99, 99,
+ 99, 99, 99, 99, 99, 99, 99, 99
+ };
+
+ static const BYTE lum_DC_counts[16] = {
+ 0x00, 0x01, 0x05, 0x01, 0x01, 0x01, 0x01, 0x01,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ };
+
+ static const BYTE lum_DC_values[12] = {
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b
+ };
+
+ static const BYTE chrom_DC_counts[16] = {
+ 0x00, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+ 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00
+ };
+
+ static const BYTE chrom_DC_values[12] = {
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b
+ };
+
+ static const BYTE lum_AC_counts[16] = {
+ 0x00, 0x02, 0x01, 0x03, 0x03, 0x02, 0x04, 0x03,
+ 0x05, 0x05, 0x04, 0x04, 0x00, 0x00, 0x01, 0x7d
+ };
+
+ static const BYTE lum_AC_counts_Denali[16] = {
+ 0x00, 0x02, 0x01, 0x03, 0x03, 0x02, 0x04, 0x03,
+ 0x05, 0x05, 0x04, 0x04, 0x00, 0x00, 0x00, 0x7e
+ /* Above, the [01,7d] in the normal table was changed to [00,7e].
+ * This alteration eliminates the sole 15-bit code, and yields
+ * Huffman codes as follows:
+ * - common codes are 12 bits wide or less,
+ * - uncommon codes are exactly 16 bits wide, and all those codes
+ * start with nine '1' bits, leaving seven bits of useful info.
+ * Denali uses a 4K-entry table for the common codes, and a
+ * quick lookup for the 7-bit leftover codes. So parsing of all
+ * codes is simple and fast.
+ */
+ };
+
+ static const BYTE lum_AC_values[162] = {
+ 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12,
+ 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07,
+ 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08,
+ 0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0,
+ 0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16,
+ 0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28,
+ 0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
+ 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,
+ 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,
+ 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
+ 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,
+ 0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,
+ 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98,
+ 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
+ 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6,
+ 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5,
+ 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4,
+ 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2,
+ 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea,
+ 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
+ 0xf9, 0xfa
+ };
+
+ static const BYTE chrom_AC_counts[16] = {
+ 0x00, 0x02, 0x01, 0x02, 0x04, 0x04, 0x03, 0x04,
+ 0x07, 0x05, 0x04, 0x04, 0x00, 0x01, 0x02, 0x77
+ };
+
+ static const BYTE chrom_AC_values[162] = {
+ 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21,
+ 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71,
+ 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91,
+ 0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0,
+ 0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34,
+ 0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26,
+ 0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38,
+ 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48,
+ 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,
+ 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68,
+ 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
+ 0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
+ 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96,
+ 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5,
+ 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4,
+ 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3,
+ 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2,
+ 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda,
+ 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9,
+ 0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
+ 0xf9, 0xfa
+ };
+
+ UINT len;
+ UINT dc_q_fac, ac_q_fac;
+ UINT reserved;
+
+ /***** default items not in the short header *****/
+
+ g->restart_interval = 0;
+
+ g->which_quant_tbl[0] = 0;
+ g->which_quant_tbl[1] = 1;
+ g->which_quant_tbl[2] = 1;
+
+ g->which_dc_tbl[0] = 0;
+ g->which_ac_tbl[0] = 0;
+ g->which_dc_tbl[1] = 1;
+ g->which_ac_tbl[1] = 1;
+ g->which_dc_tbl[2] = 1;
+ g->which_ac_tbl[2] = 1;
+
+ huff_define_table (g, FALSE, 0, lum_DC_counts , lum_DC_values);
+ huff_define_table (g, TRUE , 0, g->fDenali ? lum_AC_counts_Denali
+ : lum_AC_counts, lum_AC_values);
+ huff_define_table (g, FALSE, 1, chrom_DC_counts, chrom_DC_values);
+ huff_define_table (g, TRUE , 1, chrom_AC_counts, chrom_AC_values);
+
+ /***** parse the short header *****/
+
+ len = read_uint (g);
+ if (len != 18)
+ longjmp (g->syntax_error, BAD_MARKER_DATA);
+
+ g->traits.lNumRows = read_uint (g);
+ g->traits.iPixelsPerRow = read_uint (g);
+ g->traits.lHorizDPI = (long)read_uint(g) << 16;
+ g->traits.lVertDPI = (long)read_uint(g) << 16;
+ ac_q_fac = read_byte (g);
+ g->num_comps = read_byte (g);
+ g->max_horiz_samp_fac = parse_factors (read_uint(g), g->horiz_samp_facs);
+ g->max_vert_samp_fac = parse_factors (read_uint(g), g->vert_samp_facs);
+ dc_q_fac = read_byte (g);
+ reserved = read_byte (g); /* should be 0 */
+
+ g->traits.iComponentsPerPixel = g->num_comps;
+ g->traits.iBitsPerPixel = g->num_comps * 8;
+ if (g->traits.lNumRows == 0)
+ g->traits.lNumRows = -1; /* -1 means 'unknown' */
+ if (dc_q_fac == 0)
+ dc_q_fac = ac_q_fac;
+
+ calc_quant_table (g, dc_q_fac, ac_q_fac, orig_lum_quant, 0);
+ calc_quant_table (g, dc_q_fac, ac_q_fac, orig_chrom_quant, 1);
+
+ g->got_short_header = TRUE;
+}
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | mar_parse_app | application-specific marker |
+ |_______________|____________________________________________________________|
+ | |
+ | Can set these fields in 'traits': lHorizDPI, lVertDPI |
+ |____________________________________________________________________________|
+ */
+static void mar_parse_app (PJDEC_INST g, UINT marker)
+{
+ UINT len;
+ BYTE id1, id2, id3;
+
+ len = read_uint (g);
+ if (len <= 5) {
+ /* unknown marker; discard it */
+ read_skip_forward (g, len-2);
+ return;
+ }
+
+ id1 = read_byte (g);
+ id2 = read_byte (g);
+ id3 = read_byte (g);
+ read_skip_backward (g, 5);
+
+ if (marker==MARKER_APP+1 && id1==0x47 && id2==0x33 && id3==0x46) {
+ /* G3 color fax APP1 marker */
+ parse_app_g3fax (g);
+ } else if (marker==MARKER_APP+0 && (id1=='J' || id1=='j')
+ && (id2=='F' || id2=='f') && (id3=='I' || id3=='i')) {
+ /* JFIF APP0 marker for generic JPEG files */
+ parse_app_jfif (g);
+ } else if (marker==MARKER_APP+1 && len==18) {
+ /* assume that APP1 marker is a short header */
+ parse_app_short_header (g);
+ } else {
+ /* unrecognized APP marker; discard it */
+ read_skip_forward (g, len);
+ }
+}
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | mar_parse_sof | start of frame |
+ |_______________|____________________________________________________________|
+ | |
+ | Sets these fields in 'traits': lNumRows, iPixelsPerRow, iBitsPerPixel, |
+ | iComponentsPerPixel. |
+ | |
+ | Sets these variables: num_comps (equal to iComponentsPerPixel), |
+ | horiz_samp_facs, vert_samp_facs, which_quant_tbl, |
+ | max_horiz_samp_fac, max_vert_samp_fac |
+ |____________________________________________________________________________|
+*/
+static void mar_parse_sof (PJDEC_INST g, UINT marker)
+{
+ UINT len;
+ UINT uBitsPerComp;
+ UINT comp;
+ BYTE comp_id;
+ BYTE hv_samp;
+ BYTE q_table;
+ BYTE h, v;
+
+ len = read_uint (g);
+ uBitsPerComp = read_byte (g);
+ g->rowCountOffset=g->rd_inbuf_next-g->rd_inbuf_beg;
+ g->traits.lNumRows = read_uint (g);
+ g->traits.iPixelsPerRow = read_uint (g);
+ g->traits.iComponentsPerPixel = g->num_comps = read_byte (g);
+ g->traits.iBitsPerPixel = g->num_comps * uBitsPerComp;
+
+ if (g->traits.lNumRows == 0)
+ g->traits.lNumRows = -1; /* -1 means 'unknown' */
+
+ if (len != (8u + 3u*g->num_comps) || g->num_comps==0)
+ longjmp (g->syntax_error, BAD_MARKER_DATA);
+
+ /* Below, we also check for SOF1 because Chromafax erroneously outputs it */
+ if ((marker!=MARKER_SOF0 && marker!=MARKER_SOF0+1)
+ || uBitsPerComp!=8 || g->num_comps>4)
+ longjmp (g->syntax_error, NOT_IMPLEMENTED);
+
+ g->max_horiz_samp_fac = 1;
+ g->max_vert_samp_fac = 1;
+
+ #if DUMP_JPEG
+ _ftprintf (stderr, _T("\nSOF marker:\n"));
+ _ftprintf (stderr, _T(" bits per sample = %d\n"), uBitsPerComp);
+ _ftprintf (stderr, _T(" number of rows = %d\n"), g->traits.lNumRows);
+ _ftprintf (stderr, _T(" pixels per row = %d\n"), g->traits.iPixelsPerRow);
+ _ftprintf (stderr, _T(" # components = %d\n"), g->num_comps);
+ #endif
+
+ for (comp=0; comp<g->num_comps; comp++) {
+ comp_id = read_byte (g);
+ hv_samp = read_byte (g);
+ q_table = read_byte (g);
+
+ #if DUMP_JPEG
+ _ftprintf (stderr,
+ _T(" %d: comp id = %d, hv samp fac = %02x, which q = %d\n"),
+ comp, comp_id, hv_samp, q_table);
+ #endif
+
+ g->horiz_samp_facs[comp] = h = hv_samp >> 4;
+ g->vert_samp_facs [comp] = v = hv_samp & 0x0fu;
+ g->which_quant_tbl[comp] = q_table;
+
+ if (h > g->max_horiz_samp_fac) g->max_horiz_samp_fac = h;
+ if (v > g->max_vert_samp_fac ) g->max_vert_samp_fac = v;
+ }
+}
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | mar_parse_dqt | discrete quantization table |
+ |_______________|____________________________________________________________|
+ | |
+ | Sets the following variables: quant_tbls. |
+ |____________________________________________________________________________|
+*/
+static void mar_parse_dqt (PJDEC_INST g)
+{
+ int len, i;
+ BYTE pt;
+ long *tbl_p;
+
+ len = read_uint(g) - 2;
+
+ while (len >= 65) {
+ len -= 65;
+ pt = read_byte (g);
+ if ((pt & 0xfcu) != 0)
+ longjmp (g->syntax_error, NOT_IMPLEMENTED);
+ tbl_p = g->quant_tbls[pt & 3];
+ DUMP (_T("\nDQT marker: table=%d"), pt & 3, 0, 0);
+ for (i=0; i<64; i++) {
+ if ((i & 15) == 0) DUMP(_T("\n "), 0,0,0);
+ tbl_p[i] = read_byte (g);
+ DUMP (_T("%2d "), tbl_p[i], 0, 0);
+ }
+ DUMP (_T("\n"), 0,0,0);
+ wino_scale_table (tbl_p);
+ }
+
+ if (len != 0)
+ longjmp (g->syntax_error, BAD_MARKER_DATA);
+}
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | mar_parse_dht | define Huffman tables |
+ |_______________|____________________________________________________________|
+ | |
+ | Sets the following variables: dc_tbls, ac_tbls. |
+ |____________________________________________________________________________|
+*/
+static void mar_parse_dht (PJDEC_INST g)
+{
+ BYTE num_codes[16];
+ BYTE values[256];
+
+ int len, i, tot_codes;
+ BYTE class_id;
+
+ len = read_uint(g) - 2;
+
+ while (len > 17) {
+ class_id = read_byte (g);
+
+ for (tot_codes=0, i=0; i<=15; i++) {
+ num_codes[i] = read_byte (g);
+ tot_codes += num_codes[i];
+ }
+
+ len -= 17;
+ if (len < tot_codes)
+ longjmp (g->syntax_error, BAD_MARKER_DATA);
+
+ for (i=0; i<tot_codes; i++)
+ values[i] = read_byte (g);
+ len -= tot_codes;
+
+ #if DUMP_JPEG
+ _ftprintf (stderr, _T("\nDHT marker: class=%d, id=%d\n counts = "),
+ (BOOL )(class_id>>4), class_id & 0x0f);
+ for (i=0; i<16; i++)
+ _ftprintf (stderr, _T("%2d "), num_codes[i]);
+ _ftprintf (stderr, _T("\n values = "));
+ for (i=0; i<tot_codes; i++)
+ _ftprintf (stderr, _T("%02x "), values[i]);
+ _ftprintf (stderr, _T("\n"));
+ #endif
+
+ huff_define_table (g, (BOOL)(class_id>>4), class_id & 0x0f,
+ num_codes, values);
+ }
+
+ if (len != 0)
+ longjmp (g->syntax_error, BAD_MARKER_DATA);
+}
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | mar_parse_dri | define restart interval |
+ |_______________|____________________________________________________________|
+ | |
+ | Sets the following variable: restart_interval. |
+ |____________________________________________________________________________|
+*/
+static void mar_parse_dri (PJDEC_INST g)
+{
+ UINT len;
+
+ len = read_uint (g);
+ if (len != 4)
+ longjmp (g->syntax_error, BAD_MARKER_DATA);
+
+ g->restart_interval = read_uint (g);
+ DUMP (_T("\nDRI marker: restart interval = %d\n"), g->restart_interval, 0,0);
+}
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | mar_parse_sos | start of scan |
+ |_______________|____________________________________________________________|
+*/
+static void mar_parse_sos (PJDEC_INST g)
+{
+ UINT len;
+ UINT comp;
+ UINT cs;
+ UINT dc_ac;
+
+ len = read_uint (g);
+ if (len != 6u+2u*g->num_comps)
+ longjmp (g->syntax_error, BAD_MARKER_DATA);
+
+ read_byte (g); /* skip Ns value (number of components in scan) */
+
+ DUMP (_T("\nSOS marker:\n"), 0,0,0);
+
+ for (comp=0; comp<g->num_comps; comp++) {
+ cs = read_byte (g); /* skip Cs value (component selector) */
+ dc_ac = read_byte (g);
+ DUMP (_T(" %d: cs = %d, which dc_ac tbl = %02x\n"), comp, cs, dc_ac);
+ g->which_dc_tbl[comp] = dc_ac >> 4;
+ g->which_ac_tbl[comp] = dc_ac & 0x0fu;
+ }
+
+ read_byte (g); /* skip Ss value (start selection) */
+ read_byte (g); /* skip Se value (end selection) */
+ read_byte (g); /* skip AhAl value (approximation bit positions) */
+}
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | mar_parse_dnl | Define Number of Lines |
+ |_______________|____________________________________________________________|
+ | |
+ | Sets the following variable: traits.lNumRows |
+ |____________________________________________________________________________|
+*/
+static void mar_parse_dnl (PJDEC_INST g)
+{
+ UINT len, nRows;
+
+ len = read_uint (g);
+ nRows = read_uint (g);
+
+ if (len!=4u || nRows==0)
+ longjmp (g->syntax_error, BAD_MARKER_DATA);
+
+ DUMP (_T("\nDNL marker: %d\n"), nRows,0,0);
+ g->traits.lNumRows = nRows;
+}
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | mar_parse | parses the marker, storing results in global variables |
+ |___________|________________________________________________________________|
+*/
+static void mar_parse (PJDEC_INST g, UINT marker)
+{
+ PRINT (_T("mar_parse: marker = %02xh\n"), marker, 0);
+
+ switch (marker)
+ {
+ case MARKER_APP+0:
+ case MARKER_APP+1:
+ case MARKER_APP+2:
+ case MARKER_APP+3:
+ case MARKER_APP+4:
+ case MARKER_APP+5:
+ case MARKER_APP+6:
+ case MARKER_APP+7:
+ case MARKER_APP+8:
+ case MARKER_APP+9:
+ case MARKER_APP+10:
+ case MARKER_APP+11:
+ case MARKER_APP+12:
+ case MARKER_APP+13:
+ case MARKER_APP+14:
+ case MARKER_APP+15:
+ mar_parse_app (g, marker);
+ break;
+
+ case MARKER_COM: /* comment marker */
+ case MARKER_JPG+0:
+ case MARKER_JPG+1:
+ case MARKER_JPG+2:
+ case MARKER_JPG+3:
+ case MARKER_JPG+4:
+ case MARKER_JPG+5:
+ case MARKER_JPG+6:
+ case MARKER_JPG+7:
+ case MARKER_JPG+8:
+ case MARKER_JPG+9:
+ case MARKER_JPG+10:
+ case MARKER_JPG+11:
+ case MARKER_JPG+12:
+ case MARKER_JPG+13:
+ mar_flush (g, marker);
+ break;
+
+ case MARKER_SOF0:
+ case MARKER_SOF1:
+ case MARKER_SOF2:
+ case MARKER_SOF3:
+ case MARKER_SOF5:
+ case MARKER_SOF6:
+ case MARKER_SOF7:
+ case MARKER_SOF8:
+ case MARKER_SOF9:
+ case MARKER_SOFA:
+ case MARKER_SOFB:
+ case MARKER_SOFD:
+ case MARKER_SOFE:
+ case MARKER_SOFF:
+ mar_parse_sof (g, marker);
+ break;
+
+ case MARKER_RST0:
+ case MARKER_RST1:
+ case MARKER_RST2:
+ case MARKER_RST3:
+ case MARKER_RST4:
+ case MARKER_RST5:
+ case MARKER_RST6:
+ case MARKER_RST7:
+ DUMP (_T("\nRST marker.\n"), 0,0,0);
+ break;
+
+ case MARKER_DHT: mar_parse_dht (g); break;
+ case MARKER_DQT: mar_parse_dqt (g); break;
+ case MARKER_DRI: mar_parse_dri (g); break;
+ case MARKER_SOS: mar_parse_sos (g); break;
+ case MARKER_DNL: mar_parse_dnl (g); break;
+
+ case MARKER_DAC:
+ case MARKER_DHP:
+ case MARKER_EXP:
+ longjmp (g->syntax_error, NOT_IMPLEMENTED);
+ break;
+
+ /* The following markers have no data following them */
+
+ case MARKER_SOI:
+ DUMP (_T("\nSOI marker.\n"), 0,0,0);
+ break;
+
+ case MARKER_EOI:
+ DUMP (_T("\nEOI marker.\n"), 0,0,0);
+ break;
+
+ default:
+ longjmp (g->syntax_error, BAD_MARKER_DATA);
+ }
+}
+
+
+
+/******************************************************************************
+ ******************************************************************************
+
+ H U F F M A N
+
+
+ Interface into this section:
+
+ huff_init - inits this section
+ huff_free_tbl - deallocates memory for one table
+ huff_free_all - deallocates memory for all tables
+ huff_define_table - defines a new Huffman table
+ DECODE_HUFF - decodes and returns next Huffman code
+
+ ******************************************************************************
+ ******************************************************************************/
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | DECODE_HUFF | Decodes a Huffman code, returning corresponding value |
+ |_____________|______________________________________________________________|
+*/
+#define DECODE_HUFF( \
+ g, \
+ huff_tbl_p, \
+ main_ix_len, \
+ par_result, \
+ hit_marker) \
+{ \
+ UINT tbl_index, code, size; \
+ main_huff_elem_t *elem; \
+ \
+ READ_BITS_LOAD (g, FALSE, main_ix_len, code, hit_marker) \
+ tbl_index = huff_tbl_p->index_p[code]; \
+ elem = &(huff_tbl_p->main_p[tbl_index]); \
+ par_result = elem->value; \
+ size = elem->size; \
+ \
+ if (size == 0) { \
+ par_result = parse_aux_code (g, huff_tbl_p->aux_p); \
+ } else { \
+ DUMP (_T(" %2d-%04x-%3d(main) "), size, code, par_result); \
+ READ_BITS_ADVANCE (g, size) \
+ } \
+}
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | parse_aux_code | Code is not in short-width table; look in aux table |
+ |________________|___________________________________________________________|
+ | |
+ | Returns the value associated with the code. |
+ |____________________________________________________________________________|
+*/
+static UINT parse_aux_code (
+ PJDEC_INST g,
+ aux_huff_elem_t *aux_tbl_par_p)
+{
+ UINT code, size, val;
+ UINT diff;
+ UINT excess;
+ aux_huff_elem_t *lo_p, *hi_p, *mid_p;
+
+ READ_BITS_LOAD (g, FALSE, 16, code, syntax_err)
+
+#if 0 /* we are no longer using ROM tables */
+ if ((BYTE *)aux_tbl_par_p == dec_AC_aux_tbl)
+ {
+ /* We are using our default ROM table */
+ val = dec_AC_aux_tbl [code & 0x7f];
+ DUMP (_T(" %2d-%4x-%3d(aux-rom) "), 16, code, val);
+ if (val==0 || (code & 0xff80)!=0xff80) goto syntax_err;
+ READ_BITS_ADVANCE (g,16)
+ }
+#endif
+
+ lo_p = aux_tbl_par_p;
+ hi_p = lo_p + lo_p->size - 1;
+ lo_p += 1; /* 1st table-entry is a dummy containing above table-size */
+
+ while ((diff=(hi_p-lo_p)) > 1) {
+ mid_p = lo_p + (diff>>1);
+ if (mid_p->code > code) hi_p = mid_p;
+ else lo_p = mid_p;
+ }
+
+ size = lo_p->size;
+ excess = 16u - size;
+ if ((code>>excess) != (UINT)(lo_p->code>>excess)) {
+ lo_p = hi_p;
+ size = lo_p->size;
+ excess = 16u - size;
+ if ((code>>excess) != (UINT)(lo_p->code>>excess)) {
+ PRINT (_T("aux code of %x not found\n"), code, 0);
+ goto syntax_err;
+ }
+ }
+
+ val = lo_p->value;
+ READ_BITS_ADVANCE (g,size)
+ DUMP (_T(" %2d-%4x-%3d(aux) "), size, code, val);
+
+ return val;
+
+ syntax_err:
+ PRINT (_T("parse_aux_code: syntax error\n"), 0, 0);
+ longjmp (g->syntax_error, BAD_HUFF_CODE);
+}
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | huff_init | Inits this section |
+ |___________|________________________________________________________________|
+*/
+static void huff_init (PJDEC_INST g)
+{
+ memset (g->dc_tbls, 0, sizeof(g->dc_tbls));
+ memset (g->ac_tbls, 0, sizeof(g->ac_tbls));
+}
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | huff_free_tbl | Frees memory allocated for the given table |
+ |_______________|____________________________________________________________|
+*/
+static void huff_free_tbl (PJDEC_INST g, huff_tbl_t *tbl_p)
+{
+ if (tbl_p->index_p != NULL)
+ IP_MEM_FREE (tbl_p->index_p);
+ if (tbl_p->main_p != NULL)
+ IP_MEM_FREE (tbl_p->main_p);
+ if (tbl_p->aux_p != NULL)
+ IP_MEM_FREE (tbl_p->aux_p);
+
+ tbl_p->index_p = NULL;
+ tbl_p->main_p = NULL;
+ tbl_p->aux_p = NULL;
+}
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | huff_free_all | Frees all memory allocated for Huffman tables |
+ |_______________|____________________________________________________________|
+*/
+static void huff_free_all (PJDEC_INST g)
+{
+ int i;
+
+ for (i=0; i<MAX_HUFF_TBLS; i++) {
+ huff_free_tbl (g, &(g->dc_tbls[i]));
+ huff_free_tbl (g, &(g->ac_tbls[i]));
+ }
+}
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | calc_table | Defines a Huffman table |
+ |____________|_______________________________________________________________|
+*/
+static void calc_table (
+ const BYTE counts[16], /* in: # Huffman codes of each length 1-16 */
+ const BYTE huffval[], /* in: values for codes of above lengths */
+ UINT main_ix_len, /* in: # bits in main tbl index (0=use max) */
+ huff_tbl_t *huff_tbl_p) /* out: the three tables */
+{
+ BYTE huffsize[257];
+ WORD huffcode[257];
+ int tot_codes;
+ int i;
+ BYTE *index_p;
+ main_huff_elem_t *main_p;
+ aux_huff_elem_t *aux_p;
+
+ /***************************************************/
+ /* Compute a complete Huffman table. */
+ /* output: huffval, huffsize, huffcode, tot_codes */
+ /***************************************************/
+
+ {
+ int i, j, k, code, siz;
+
+ /* Generate size array -- see JPEG document
+ *
+ * Note that list BITS in JPEG doc. has index from 1-16, but this list
+ * is called 'counts', indexed 0-15. This thus BITS[i] is replaced
+ * by counts[i-1]
+ */
+ tot_codes = 0;
+ for (i=1; i<=16; i++)
+ for (j=1; j<=counts[i-1]; j++)
+ huffsize[tot_codes++] = i;
+
+ huffsize[tot_codes] = 0;
+
+ #if 0 /* we now only use RAM tables */
+ if (memcmp(counts, rom_counts, 16) == 0 &&
+ memcmp(huffval, rom_val, tot_codes) == 0) {
+ PRINT (_T("calc_table: using ROM Huffman tables\n"), 0, 0);
+ return FALSE; /* tell caller to use ROM-tables instead */
+ }
+ #endif
+
+ /* Generate code array -- see JPEG document
+ *
+ * The resulting table is sorted by increasing 'code', and also by
+ * increasing 'size'.
+ */
+ k = 0;
+ code = 0;
+ siz = huffsize[0];
+ while (TRUE) {
+ do {
+ huffcode[k++] = code++;
+ } while (huffsize[k]==siz && k<257); /* Overflow Detection */
+ if (huffsize[k] == 0)
+ break; /* all done */
+ do { /* Shift next code to expand prefix */
+ code <<= 1;
+ siz += 1;
+ } while (huffsize[k] != siz);
+ }
+ }
+
+ /****************************************/
+ /* Make the main table (output: main_p) */
+ /****************************************/
+
+ { /* This "main" table is indexed by the output of the "table table",
+ * which is indexed by 'main_ix_len' bits of input.
+ * If the table-entry has a 'size' of 0, the aux table is examined.
+ */
+ int i, nbytes;
+ int extra_bits;
+ UINT first, final, code_plus_junk;
+
+ if (main_ix_len == 0)
+ main_ix_len = huffsize[tot_codes-1];
+
+ nbytes = (tot_codes+1) * sizeof(main_huff_elem_t);
+ IP_MEM_ALLOC (nbytes, main_p);
+ memset (main_p, 0, nbytes);
+
+ nbytes = 1lu << main_ix_len;
+ IP_MEM_ALLOC (nbytes, index_p);
+ memset (index_p, 0, nbytes);
+
+ for (i=0; i<tot_codes && huffsize[i]<=main_ix_len; i++) {
+ main_p[i+1].value = huffval [i];
+ main_p[i+1].size = huffsize[i] ;
+
+ extra_bits = main_ix_len - huffsize[i];
+ first = huffcode[i] << extra_bits;
+ final = first + (1lu << extra_bits) - 1;
+ for (code_plus_junk = first;
+ code_plus_junk <= final;
+ code_plus_junk++)
+ index_p[code_plus_junk] = i+1;
+ }
+ }
+
+ /********************************************/
+ /* Make the auxiliary table (output: aux_p) */
+ /********************************************/
+
+ { /* This is used when an entry in the main table was 0, meaning that
+ * the code is longer than 'main_ix_len'. The aux table consists of
+ * all [code, size, value] triples for sizes > main_ix_len. A binary
+ * search is used to locate the code.
+ * The first table-entry is a dummy whose 'size' field is the number
+ * of table-entries (including the dummy).
+ */
+ int first, n_entries;
+ aux_huff_elem_t *p;
+
+ /* locate first huffsize > main_ix_len */
+ for (first=0; first<tot_codes && huffsize[first]<=main_ix_len; first++);
+
+ if (first == tot_codes) {
+ /* the main table captured everything; no aux table is needed */
+ IP_MEM_ALLOC (1, aux_p);
+ } else {
+ n_entries = tot_codes - first + 1; /* +1 because of dummy entry */
+ IP_MEM_ALLOC (n_entries * sizeof(aux_huff_elem_t), aux_p);
+
+ /* fill-in the dummy entry (contains # entries in table) */
+ p = aux_p;
+ p->size = (UINT) n_entries;
+ p->code = p->value = 0;
+ p += 1;
+
+ for (i=first; i<tot_codes; i++) {
+ p->size = huffsize[i];
+ p->code = huffcode[i] << (16u - p->size);
+ p->value = huffval [i];
+ p += 1;
+ }
+ }
+ }
+
+ #if DUMP_JPEG
+ {
+ int i, n;
+
+ _ftprintf (stderr, _T("\nOriginal size-code-val tuples:\n"));
+ for (i=0; i<tot_codes; i++) {
+ if ((i&7) == 0) _ftprintf(stderr, _T(" "));
+ _ftprintf (stderr, _T("%2d-%04x-%02x "),
+ huffsize[i], huffcode[i], huffval[i]);
+ if ((i&7)==7 || i==tot_codes-1) _ftprintf(stderr, _T("\n"));
+ }
+
+ _ftprintf(stderr, _T("\nIndex table: (%d entries)\n"), 1lu<<main_ix_len);
+ for (i=0; i<(1lu<<main_ix_len); i++) {
+ if ((i&7) == 0) _ftprintf(stderr, _T(" %3d: "), i);
+ _ftprintf (stderr, _T("%3d, "), index_p[i]);
+ if ((i&7) == 7) _ftprintf(stderr, _T("\n"));
+ }
+
+ _ftprintf(stderr, _T("\nMain table: (%d entries)\n"), tot_codes+1);
+ for (i=0; i<tot_codes; i++) {
+ if ((i&7) == 0) _ftprintf(stderr, _T(" %3d: "), i);
+ _ftprintf (stderr, _T("%04x(%2d) "), main_p[i].value, main_p[i].size);
+ if ((i&7)==7 || i==tot_codes-1) _ftprintf(stderr, _T("\n"));
+ }
+
+ if (huffsize[tot_codes-1] > main_ix_len) {
+ n = aux_p[0].size;
+ _ftprintf(stderr, _T("\nAux table: (%d entries of size-code-value)\n"),n);
+ for (i=0; i<n; i++) {
+ if ((i&3) == 0) _ftprintf(stderr, _T(" %3d: "), i);
+ _ftprintf (stderr, _T("%2d-%4x-%3d "),
+ aux_p[i].size, aux_p[i].code, aux_p[i].value);
+ if ((i&3)==3 || i==n-1) _ftprintf(stderr, _T("\n"));
+ }
+ }
+ }
+ #endif
+
+ huff_tbl_p->index_p = index_p;
+ huff_tbl_p->main_p = main_p;
+ huff_tbl_p->aux_p = aux_p;
+ return;
+
+ fatal_error:
+ assert (0); /* todo: eliminate this assert */
+}
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | huff_define_table | Defines the given Huffman table |
+ |___________________|________________________________________________________|
+ | |
+ | Sets the following variables: dc_tbls, ac_tbls. |
+ |____________________________________________________________________________|
+*/
+static void huff_define_table (
+ PJDEC_INST g,
+ BOOL ac, /* defining an AC table? (else DC) */
+ UINT id, /* which table is being defined (0-3) */
+ const BYTE counts[16], /* number of Huffman codes of each length 1-16 */
+ const BYTE values[]) /* values associated with codes of above lengths */
+{
+ huff_tbl_t *tbl_p;
+
+ tbl_p = ac ? &(g->ac_tbls[id]) : &(g->dc_tbls[id]);
+ huff_free_tbl (g,tbl_p);
+
+ DUMP (_T("\nhuff_define_table: ac=%d, id=%d\n"), ac, id, 0);
+ calc_table (counts, values,
+ ac ? AC_TBL_INDEX_LEN : DC_TBL_INDEX_LEN,
+ tbl_p);
+}
+
+
+
+/******************************************************************************
+ ******************************************************************************
+
+ W I N O G R A D
+
+
+ Interface into this section:
+
+ QNORM_TO_INPUT - adjusts precision of scaled DCT value for wino-input
+ INPUT_PRECISION - scales result of wino_inverse_dct back to pixels
+ wino_scale_table - scale a quantization table into a Winograd table
+ wino_inverse_dct - computes inverse DCT using Winograd's algorithm
+
+ ******************************************************************************
+ ******************************************************************************/
+
+
+
+#define SHIFT_TRUNC(mvalue,mshift) ((mvalue) >> (mshift))
+
+#define QNORM_TO_INPUT(mval) SHIFT_TRUNC(mval, QNORM_PRECISION-INPUT_PRECISION)
+
+#define QNORM_PRECISION 16 /* prec of q-table scaled by Wino norm constants */
+#define INPUT_PRECISION 5 /* prec of input to inverse-DCT */
+#define CONST_PRECISION 9 /* prec of b1-b5 below */
+
+#define b1 724L
+#define b2 1338L
+#define b3 724L
+#define b4 554L
+#define b5 392L
+
+#if 0
+#define CONST_PRECISION 15
+
+#define b1 46341L
+#define b2 85627L
+#define b3 46341L
+#define b4 35468L
+#define b5 25080L
+#endif
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | wino_scale_table | Scales a quantization table into a Winograd table |
+ |__________________|_________________________________________________________|
+ | |
+ | Multiplies all the components of the Quantization matrix by the fractional |
+ | normalization constants as required by the Winograd Transform. The |
+ | results are fixed-point with QNORM_PRECISION bits of fraction. |
+ |____________________________________________________________________________|
+*/
+
+static const float inv_dct_norm[] = {
+ 0.125000f, 0.173380f, 0.173380f, 0.163320f,
+ 0.240485f, 0.163320f, 0.146984f, 0.226532f,
+ 0.226532f, 0.146984f, 0.125000f, 0.203873f,
+ 0.213388f, 0.203873f, 0.125000f, 0.098212f,
+ 0.173380f, 0.192044f, 0.192044f, 0.173380f,
+ 0.098212f, 0.067650f, 0.136224f, 0.163320f,
+ 0.172835f, 0.163320f, 0.136224f, 0.067650f,
+ 0.034566f, 0.093833f, 0.128320f, 0.146984f,
+ 0.146984f, 0.128320f, 0.093833f, 0.034566f,
+ 0.047944f, 0.088388f, 0.115485f, 0.125000f,
+ 0.115485f, 0.088388f, 0.047944f, 0.045162f,
+ 0.079547f, 0.098212f, 0.098212f, 0.079547f,
+ 0.045162f, 0.040645f, 0.067650f, 0.077165f,
+ 0.067650f, 0.040645f, 0.034566f, 0.053152f,
+ 0.053152f, 0.034566f, 0.027158f, 0.036612f,
+ 0.027158f, 0.018707f, 0.018707f, 0.009558f
+};
+
+void wino_scale_table (
+ long *tbl_p)
+{
+ const float *fptr;
+ int i;
+
+ fptr = inv_dct_norm;
+ for (i=0; i<64; i++) {
+ *tbl_p = (long ) ((*tbl_p) * (*fptr++) * (1l<<QNORM_PRECISION) + 0.5);
+ tbl_p += 1;
+ }
+}
+
+
+
+/******************************************************************************
+ ******************************************************************************
+
+ D E C O D I N G
+
+
+ Interface into this section:
+
+ zero_prior_DC - sets the predicted DC values to zero
+ decode_MCU - decodes a single Minimum Coded Unit
+
+ ******************************************************************************
+ ******************************************************************************/
+
+
+
+static BYTE const zigzag_index_tbl[] = {
+ 0, 1, 8, 16, 9, 2, 3, 10,
+ 17, 24, 32, 25, 18, 11, 4, 5,
+ 12, 19, 26, 33, 40, 48, 41, 34,
+ 27, 20, 13, 6, 7, 14, 21, 28,
+ 35, 42, 49, 56, 57, 50, 43, 36,
+ 29, 22, 15, 23, 30, 37, 44, 51,
+ 58, 59, 52, 45, 38, 31, 39, 46,
+ 53, 60, 61, 54, 47, 55, 62, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, /* extra 16 elements in case */
+ 0, 0, 0, 0, 0, 0, 0, 0 /* parse_block overruns */
+};
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | decode_init | inits this section |
+ |_____________|______________________________________________________________|
+*/
+static void decode_init (PJDEC_INST g)
+{
+ BYTE const *zig_p;
+ int **block_pp;
+
+ zig_p = zigzag_index_tbl;
+ for (block_pp=g->block_zz; block_pp<g->block_zz+(64+16); block_pp++)
+ *block_pp = &(g->block[*zig_p++]);
+}
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | zero_prior_DC | zeroes the predicted DC values |
+ |_______________|____________________________________________________________|
+*/
+static void zero_prior_DC (PJDEC_INST g)
+{
+ g->prior_dc[0] = g->prior_dc[1] = g->prior_dc[2] = g->prior_dc[3] = 0;
+}
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | parse_block | parses an 8x8 block; return data is ready for inverse DCT |
+ |_____________|______________________________________________________________|
+ | |
+ | Return value: TRUE = we parsed a block, |
+ | FALSE = hit a marker. |
+ | Output data is put in 'block' array. |
+ |____________________________________________________________________________|
+*/
+static BOOL parse_block (
+ PJDEC_INST g,
+ int comp) /* in: image component number */
+{
+ /* FIX_TERM - changes a term (fetched from JPEG file) into an integer.
+ * The term is in ones-complement, with the sign-bit (and higher bits)
+ * zeroed. So the leftmost bit within the given size is the opposite of
+ * the desired sign bit. If that bit is 1, the number is positive, and
+ * needs no change. If it's 0, we set the higher bits to 1s, and add 1
+ * to convert from ones-complement to twos-complement.
+ * Select the macro below which is fastest on your computer.
+ */
+
+ #if 1
+ #define FIX_TERM(msize,mterm) { \
+ if ((mterm & (1u<<((msize)-1))) == 0) \
+ mterm = (mterm | (-1 << (msize))) + 1; \
+ }
+ #endif
+
+ #if 0
+ #define FIX_TERM(msize,mterm) { \
+ int mask = -1 << msize; \
+ if (((mterm<<1) & mask) == 0) \
+ mterm += mask + 1; \
+ }
+ #endif
+
+ #if 0
+ #define FIX_TERM(msize,mterm) \
+ mterm += ((mterm>>(msize-1)) - 1) & ~((1<<msize) - 2);
+ #endif
+
+ huff_tbl_t *huff_p;
+ int **block_p;
+ long *dequant_p;
+ UINT siz, run, rl_byte;
+ int dc, ac;
+
+ /* memset (block, 0, 64*sizeof(int)); */
+ {
+ int *block_p, *after_p;
+
+ for (block_p=g->block, after_p=g->block+64; block_p<after_p; ) {
+ *block_p++ = 0;
+ *block_p++ = 0;
+ *block_p++ = 0;
+ *block_p++ = 0;
+ *block_p++ = 0;
+ *block_p++ = 0;
+ *block_p++ = 0;
+ *block_p++ = 0;
+ }
+ }
+
+ dequant_p = g->quant_tbls[g->which_quant_tbl[comp]];
+ block_p = g->block_zz;
+
+ /**************************************/
+ /* Decode and dequantize the DC value */
+ /**************************************/
+
+ DUMP (_T("\nStart of block for component %d:\n"), comp, 0, 0);
+
+ huff_p = &(g->dc_tbls[g->which_dc_tbl[comp]]);
+ DECODE_HUFF (g, huff_p, DC_TBL_INDEX_LEN, siz, hit_marker)
+
+ if (siz == 0) {
+ DUMP (_T("dc=0, size of dc=0\n"), 0,0,0);
+ dc = 0;
+ } else {
+ READ_BITS_LOAD (g, TRUE, siz, dc, syntax_err)
+ READ_BITS_ADVANCE (g, siz)
+ DUMP (_T("dc=%x, size of dc=%d\n"), dc, siz, 0);
+ FIX_TERM (siz, dc)
+ }
+
+ dc += g->prior_dc[comp];
+ g->prior_dc[comp] = dc;
+ *(*block_p++) = QNORM_TO_INPUT ((long )*dequant_p++ * dc);
+
+ /*************************************************/
+ /* Decode, dezigzag and dequantize the AC values */
+ /*************************************************/
+
+ huff_p = &(g->ac_tbls[g->which_ac_tbl[comp]]);
+
+ /* The two 'hit_marker's below should be 'syntax_error' instead. But
+ * Chromafax and other software erroneously uses fill 0's instead
+ * of fill 1's, so we parse a few of those 0's before hitting the
+ * marker.
+ */
+
+ while (TRUE) {
+ DECODE_HUFF (g, huff_p, AC_TBL_INDEX_LEN, rl_byte, hit_marker);
+ run = rl_byte >> 4;
+ siz = rl_byte & 0x0f;
+ DUMP (_T("rlc: run=%d, size of ac=%d"), run, siz, 0);
+
+ if (siz == 0) {
+ if (run == 15) {
+ DUMP (_T(", run of 16\n"), 0,0,0);
+ block_p += 16;
+ dequant_p += 16;
+ } else if (run == 0) {
+ DUMP (_T(", EOB\n"), 0,0,0);
+ break; /* hit EOB */
+ } else
+ goto syntax_err;
+ } else {
+ block_p += run;
+ dequant_p += run;
+ READ_BITS_LOAD (g, TRUE, siz, ac, hit_marker);
+ READ_BITS_ADVANCE (g, siz);
+ DUMP (_T(", ac=%x\n"), ac, siz, 0);
+ FIX_TERM (siz, ac);
+ *(*block_p++) = QNORM_TO_INPUT ((long )*dequant_p++ * ac);
+ }
+
+ if (block_p >= g->block_zz+64) {
+ if (block_p > g->block_zz+64) {
+ PRINT(_T("parse_block: over 63 AC terms\n"), 0,0);
+ goto syntax_err;
+ }
+ if (! g->fDenali)
+ break; /* 63rd AC term was non-zero */
+ }
+ }
+
+ return TRUE;
+
+ syntax_err:
+ PRINT(_T("parse_block: syntax error\n"), 0,0);
+ longjmp (g->syntax_error, BAD_HUFF_CODE);
+
+ hit_marker:
+ return FALSE;
+
+ #undef FIX_TERM
+}
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | handleMarkerInStream | handles a marker in the data-stream |
+ |______________________|_____________________________________________________|
+ | |
+ | Parses EOI, DNL and RST; other markers cause an error (longjmp). |
+ | For an EOI, g->got_EOI is set to true. |
+ |____________________________________________________________________________|
+*/
+static void handleMarkerInStream (PJDEC_INST g)
+{
+ BYTE marker;
+
+ marker = mar_get(g);
+
+ if (marker == MARKER_EOI) {
+ PRINT (_T("handleMarkerInStream: parsed EOI\n"), 0, 0);
+ g->got_EOI = TRUE;
+ } else if (marker == MARKER_DNL) {
+ PRINT (_T("handleMarkerInStream: parsing DNL\n"), 0, 0);
+ mar_parse_dnl (g);
+ } else if (g->restart_interval > 0
+ && g->restart_cur_mcu == g->restart_interval
+ && (marker-MARKER_RST0) == g->restart_cur_marker)
+ {
+ /* it's a restart, and we expected it at this point in the data */
+ PRINT (_T("handleMarkerInStream: parsed expected RST\n"), 0, 0);
+ g->restart_cur_marker = (g->restart_cur_marker+1) & 7;
+ g->restart_cur_mcu = 0;
+ zero_prior_DC (g);
+ } else {
+ PRINT (_T("handleMarkerInStream: illegal marker=0x%2.2X\n"), marker, 0);
+ longjmp (g->syntax_error, BAD_MARKER_DATA);
+ }
+}
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | LevelShiftAndRound | Level-shifts, rounds, and outputs pixels in 0..255 |
+ |____________________|_______________________________________________________|
+*/
+static void LevelShiftAndRound (int *inBlock_p, BYTE *outBlock_p)
+{
+ BYTE *outAfter;
+ int pixel;
+
+ for (outAfter = outBlock_p + 64;
+ outBlock_p < outAfter;
+ outBlock_p++, inBlock_p++)
+ {
+ pixel = (*inBlock_p +
+ ((1<<(INPUT_PRECISION-1)) + (128<<INPUT_PRECISION)))
+ >> INPUT_PRECISION;
+ if (pixel>>8 != 0)
+ pixel = pixel>0 ? 255 : 0; /* clamp to 0 or 255 */
+ *outBlock_p = (BYTE) pixel;
+ }
+}
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | decode_MCU | Parses a Minimum Coded Unit, and loads pixels into out_rows_ap|
+ |____________|_______________________________________________________________|
+ | |
+ | The pixels are loaded starting at mcus_done (not incremented). |
+ | This routine handles the restart interval logic, and markers. |
+ | |
+ | Returns TRUE if an MCU was parsed, else FALSE. |
+ |____________________________________________________________________________|
+*/
+static BOOL decode_MCU (PJDEC_INST g)
+{
+ BYTE baPixels[256];
+ BYTE *pPixel;
+ int comp;
+ int h_block, v_block;
+ int ul_row, ul_col;
+ int row;
+ BYTE **row_pp;
+ BYTE *row_p;
+
+ for (comp=0; comp<g->num_comps; comp++) {
+ for (v_block=0; v_block<g->vert_samp_facs[comp]; v_block++) {
+ for (h_block=0; h_block<g->horiz_samp_facs[comp]; h_block++) {
+
+ /***** parse and inverse-dct an 8x8 block *****/
+
+ while (! parse_block(g,comp)) {
+ /* we hit a marker */
+ #if 0
+ /* The error-check below is commented-out to make us
+ * more forgiving of unexpected in-data markers, which
+ * we saw the Genoa color-fax test suite output at the
+ * end of the file.
+ */
+ if (comp>0 || v_block>0 || h_block>0)
+ longjmp (g->syntax_error, UNEXPECTED_MARKER);
+ #endif
+ handleMarkerInStream(g);
+ if (g->got_EOI)
+ return FALSE; /* we're out of data; cannot proceed */
+ }
+
+ dct_inverse (g->block);
+
+ /***** compute output pixels *****/
+
+ LevelShiftAndRound (g->block, baPixels);
+
+ /***** copy block into out_rows_ap *****/
+
+ ul_row = v_block*8;
+ ul_col = (g->mcus_done*g->horiz_samp_facs[comp] + h_block) * 8;
+ row_pp = &(g->out_rows_ap[comp][ul_row]);
+ pPixel = baPixels;
+
+ for (row=0; row<8; row++) {
+ row_p = *row_pp++ + ul_col;
+ /* copy the 8 pixel row quickly, using two dword transfers */
+ *(DWORD*) row_p = *(DWORD*) pPixel;
+ *(DWORD*)(row_p+4) = *(DWORD*)(pPixel+4);
+ pPixel += 8;
+ }
+ }
+ }
+ }
+
+ if (g->restart_interval>0 && g->restart_cur_mcu==g->restart_interval)
+ longjmp (g->syntax_error, NO_RESTART_MARKER);
+ g->restart_cur_mcu += 1;
+
+ return TRUE;
+}
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | copy_out_rows | copies a row (or rows) from out_rows_ap to output buffer |
+ |_______________|____________________________________________________________|
+ | |
+ | If output_subsampled is true, we output row data in the same odd order |
+ | which the ASIC outputs it. |
+ | |
+ | View a period as being a group of max_horiz_samp_fac by max_vert_samp_fac |
+ | samples. (BTW, an MCU contains exactly 8x8 periods.) Divide the entire |
+ | image into a grid of such periods. The ASIC outputs the periods left to |
+ | right, top to bottom. It outputs all the data in each period, before |
+ | moving to the next period. Within a period, it outputs the components in |
+ | succession; within a component, it outputs the samples left to right, top |
+ | to bottom. |
+ | |
+ | For example: |
+ | Three components = Y U V |
+ | Horiz sample factors = 2 1 1 |
+ | Vert sample factors = 2 1 1 |
+ | A period is 2x2 samples (i.e., a 2x2 square). |
+ | Each period contains these samples: YYYYUV. |
+ | Bytes output: YYYYUV YYYYUV YYYYUV .... |
+ | |
+ | In this routine, |
+ | |
+ | vert_period = index of which period we're outputting vertically within|
+ | an MCU (0-7). |
+ | |
+ | horiz_period = index of which period we're outputting horizontally; |
+ | since an MCU has 8 periods, this is 0 .. 8*mcus_per_row.|
+ |____________________________________________________________________________|
+*/
+static void copy_out_rows (
+ PJDEC_INST g,
+ UINT row_index, /* in: index of next row to send within MCU */
+ BYTE *outbuf_p, /* out: copied-out row data */
+ UINT *n_rows_p, /* out: # of rows copied out */
+ UINT *n_bytes_p) /* out: # of bytes output */
+{
+ BYTE *out_p;
+ UINT comp;
+ UINT vert_period, vert_mod;
+ UINT row, col;
+ BYTE *row_p;
+
+ vert_period = row_index / g->max_vert_samp_fac;
+ vert_mod = row_index % g->max_vert_samp_fac;
+
+ if (! g->output_subsampled) {
+
+ /*******************************************/
+ /* Perform duplication to undo subsampling */
+ /*******************************************/
+
+ UINT samp_fac;
+ UINT horiz_mod;
+
+ for (comp=0; comp<g->num_comps; comp++) {
+ samp_fac = g->vert_samp_facs[comp];
+ out_p = outbuf_p + comp;
+ row = vert_period*samp_fac +
+ (vert_mod<samp_fac ? vert_mod : samp_fac-1);
+ row_p = g->out_rows_ap[comp][row];
+
+ horiz_mod = 0;
+ samp_fac = g->horiz_samp_facs[comp];
+
+ if (samp_fac == g->max_horiz_samp_fac) {
+
+ /***** fast case: copying all pixels, with no duplication *****/
+
+ if (g->num_comps == 1) {
+ memcpy (out_p, row_p, g->traits.iPixelsPerRow);
+ } else {
+ for (col=0; col<(UINT)g->traits.iPixelsPerRow; col++) {
+ *out_p = *row_p++;
+ out_p += g->num_comps;
+ }
+ }
+
+ } else if (samp_fac==1 && g->max_horiz_samp_fac==2) {
+
+ /***** fast case: duplicating every other pixel *****/
+
+ BYTE prev_pix;
+ for (col=0; col<(UINT)g->traits.iPixelsPerRow; col+=2) {
+ *out_p = prev_pix = *row_p++;
+ out_p += g->num_comps;
+ *out_p = prev_pix;
+ out_p += g->num_comps;
+ }
+
+ } else {
+
+ /***** slow general case *****/
+
+ for (col=0; col<(UINT)g->traits.iPixelsPerRow; col++) {
+ *out_p = horiz_mod<samp_fac ? *row_p++ : row_p[-1];
+ out_p += g->num_comps;
+ horiz_mod += 1;
+ if (horiz_mod == g->max_horiz_samp_fac) horiz_mod = 0;
+ }
+ }
+ }
+
+ *n_rows_p = 1;
+ *n_bytes_p = g->num_comps * g->traits.iPixelsPerRow;
+
+ } else {
+
+ /**********************************************/
+ /* Output subsampled data in ASIC's odd order */
+ /**********************************************/
+
+ UINT horiz_period, periods_per_row;
+ UINT ul_row, ul_col;
+ BYTE *row_y1_p, *row_y2_p, *row_cb_p, *row_cr_p;
+
+ out_p = outbuf_p;
+ periods_per_row = g->mcus_per_row * 8;
+
+ if (g->num_comps==1 && g->max_horiz_samp_fac==1 && g->max_vert_samp_fac==1) {
+
+ /***** fast case: one component; just copy the row *****/
+
+ memcpy (out_p, g->out_rows_ap[0][row_index], g->traits.iPixelsPerRow);
+ out_p += g->traits.iPixelsPerRow;
+
+ } else if (g->num_comps==3 &&
+ (g->horiz_samp_facs[0]==1 &&
+ g->horiz_samp_facs[1]==1 &&
+ g->horiz_samp_facs[2]==1) &&
+ (g->vert_samp_facs[0]==1 &&
+ g->vert_samp_facs[1]==1 &&
+ g->vert_samp_facs[2]==1)) {
+
+ /***** fast case: color with no subsampling *****/
+
+ row_y1_p = g->out_rows_ap[0][vert_period];
+ row_cb_p = g->out_rows_ap[1][vert_period];
+ row_cr_p = g->out_rows_ap[2][vert_period];
+ for (col=0; col<(UINT)g->traits.iPixelsPerRow; col++) {
+ *out_p++ = *row_y1_p++;
+ *out_p++ = *row_cb_p++;
+ *out_p++ = *row_cr_p++;
+ }
+
+ } else if (g->num_comps==3 &&
+ (g->horiz_samp_facs[0]==2 &&
+ g->horiz_samp_facs[1]==1 &&
+ g->horiz_samp_facs[2]==1) &&
+ (g->vert_samp_facs[0]==2 &&
+ g->vert_samp_facs[1]==1 &&
+ g->vert_samp_facs[2]==1)) {
+
+ /***** fast case: 4-1-1 color subsampling *****/
+
+ row_y1_p = g->out_rows_ap[0][2*vert_period];
+ row_y2_p = g->out_rows_ap[0][2*vert_period+1];
+ row_cb_p = g->out_rows_ap[1][vert_period];
+ row_cr_p = g->out_rows_ap[2][vert_period];
+ for (horiz_period=0; horiz_period<periods_per_row; horiz_period++) {
+ *out_p++ = *row_y1_p++;
+ *out_p++ = *row_y1_p++;
+ *out_p++ = *row_y2_p++;
+ *out_p++ = *row_y2_p++;
+ *out_p++ = *row_cb_p++;
+ *out_p++ = *row_cr_p++;
+ }
+
+ } else {
+
+ /***** slow general case *****/
+
+ for (horiz_period=0; horiz_period<periods_per_row; horiz_period++) {
+ for (comp=0; comp<g->num_comps; comp++) {
+ ul_row = vert_period * g->vert_samp_facs[comp];
+ ul_col = horiz_period * g->horiz_samp_facs[comp];
+
+ for (row=ul_row; row<ul_row+ g->vert_samp_facs[comp]; row++)
+ for (col=ul_col; col<ul_col+g->horiz_samp_facs[comp]; col++) {
+ *out_p++ = g->out_rows_ap[comp][row][col];
+ }
+ }
+ }
+ }
+
+ *n_rows_p = g->max_vert_samp_fac;
+ *n_bytes_p = out_p - outbuf_p;
+ }
+}
+
+
+
+
+/******************************************************************************
+ ******************************************************************************
+
+ E X P O R T E D R O U T I N E S
+
+ ******************************************************************************
+ ******************************************************************************/
+
+
+
+/*****************************************************************************\
+ *
+ * jpgDecode_openXform - Creates a new instance of the transformer
+ *
+ *****************************************************************************
+ *
+ * This returns a handle for the new instance to be passed into
+ * all subsequent calls.
+ *
+ * Return value: IP_DONE=success; IP_FATAL_ERROR=misc error.
+ *
+\*****************************************************************************/
+
+static WORD jpgDecode_openXform (
+ IP_XFORM_HANDLE *pXform) /* out: returned handle */
+{
+ PJDEC_INST g;
+
+ INSURE (pXform != NULL);
+ IP_MEM_ALLOC (sizeof(JDEC_INST), g);
+ *pXform = g;
+ memset (g, 0, sizeof(JDEC_INST));
+ g->dwValidChk = CHECK_VALUE;
+ decode_init (g);
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * jpgDecode_setDefaultInputTraits - Specifies default input image traits
+ *
+ *****************************************************************************
+ *
+ * The header of the file-type handled by the transform probably does
+ * not include *all* the image traits we'd like to know. Those not
+ * specified in the file-header are filled in from info provided by
+ * this routine.
+ *
+ * Return value: IP_DONE=success; IP_FATAL_ERROR=misc error.
+ *
+\*****************************************************************************/
+
+static WORD jpgDecode_setDefaultInputTraits (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ PIP_IMAGE_TRAITS pTraits) /* in: default image traits */
+{
+ PJDEC_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+ g->traits = *pTraits; /* a structure copy */
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * jpgDecode_setXformSpec - Provides xform-specific information
+ *
+\*****************************************************************************/
+
+static WORD jpgDecode_setXformSpec (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD_OR_PVOID aXformInfo[]) /* in: xform information */
+{
+ PJDEC_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+ g->output_subsampled = aXformInfo[IP_JPG_DECODE_OUTPUT_SUBSAMPLED].dword;
+ g->fDenali = aXformInfo[IP_JPG_DECODE_FROM_DENALI].dword;
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * jpgDecode_getHeaderBufSize- Returns size of input buf needed to hold header
+ *
+\*****************************************************************************/
+
+static WORD jpgDecode_getHeaderBufSize (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD *pdwInBufLen) /* out: buf size for parsing header */
+{
+ PJDEC_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+ *pdwInBufLen = MAX_HEADER_SIZE;
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * jpgDecode_getActualTraits - Parses header, and returns input & output traits
+ *
+\*****************************************************************************/
+
+static WORD jpgDecode_getActualTraits (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD dwInputAvail, /* in: # avail bytes in input buf */
+ PBYTE pbInputBuf, /* in: ptr to input buffer */
+ PDWORD pdwInputUsed, /* out: # bytes used from input buf */
+ PDWORD pdwInputNextPos,/* out: file-pos to read from next */
+ PIP_IMAGE_TRAITS pInTraits, /* out: input image traits */
+ PIP_IMAGE_TRAITS pOutTraits) /* out: output image traits */
+{
+ PJDEC_INST g;
+ UINT comp;
+ UINT marker;
+ UINT row_len, n_rows;
+ UINT row;
+ UINT err;
+ BYTE *p;
+
+ /**************/
+ /* Misc. Init */
+ /**************/
+
+ HANDLE_TO_PTR (hXform, g);
+
+ g->rows_done = 0;
+ g->mcus_done = 0;
+ g->sending_rows = FALSE;
+ g->got_EOI = FALSE;
+ g->got_short_header = FALSE;
+ read_init (g);
+ huff_init (g);
+ zero_prior_DC (g);
+ g->restart_cur_mcu = 0;
+ g->restart_cur_marker = 0;
+ g->dwOutNextPos = 0;
+
+ /********************/
+ /* Parse the header */
+ /********************/
+
+ if ((err=setjmp(g->syntax_error)) != 0) {
+ PRINT (_T("jpeg_decode_parse_header: syntax error = %d\n"), err, 0);
+ return IP_FATAL_ERROR | IP_INPUT_ERROR;
+ }
+
+ read_buf_open (g, pbInputBuf);
+
+ if (mar_get(g) != MARKER_SOI)
+ return IP_FATAL_ERROR | IP_INPUT_ERROR;
+
+ do {
+ marker = mar_get (g);
+ mar_parse (g, marker);
+ if (marker == MARKER_EOI)
+ return IP_FATAL_ERROR | IP_INPUT_ERROR;
+ } while (!(marker==MARKER_SOS || g->got_short_header));
+
+ *pdwInputNextPos = g->dwInNextPos = *pdwInputUsed = read_buf_close (g);
+
+ /* todo: check that all markers arrived */
+
+ PRINT (_T("jpeg_decode_parse_header: pixels/row=%d, num_rows=%d\n"),
+ g->traits.iPixelsPerRow, g->traits.lNumRows);
+
+ g->cols_per_mcu = g->max_horiz_samp_fac * 8;
+ g->rows_per_mcu = g->max_vert_samp_fac * 8;
+ g->mcus_per_row = (g->traits.iPixelsPerRow + g->cols_per_mcu - 1) / g->cols_per_mcu;
+
+ /*******************************************/
+ /* Allocate the row-buffers in out_rows_ap */
+ /*******************************************/
+
+ memset (g->out_rows_ap, 0, sizeof(g->out_rows_ap));
+
+ for (comp=0; comp<g->num_comps; comp++) {
+ row_len = g->horiz_samp_facs[comp] * g->mcus_per_row * 8;
+ n_rows = g->vert_samp_facs[comp] * 8;
+
+ for (row=0; row<n_rows; row++) {
+ IP_MEM_ALLOC (row_len, p);
+ g->out_rows_ap[comp][row] = p;
+ }
+ }
+
+ /***************/
+ /* Return info */
+ /***************/
+
+ *pInTraits = g->traits;
+ *pOutTraits = g->traits;
+
+ return IP_DONE | IP_READY_FOR_DATA;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/****************************************************************************\
+ *
+ * jpgDecode_getActualBufSizes - Returns buf sizes needed for remainder of job
+ *
+\****************************************************************************/
+
+static WORD jpgDecode_getActualBufSizes (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ PDWORD pdwMinInBufLen, /* out: min input buf size */
+ PDWORD pdwMinOutBufLen) /* out: min output buf size */
+{
+ PJDEC_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+ *pdwMinInBufLen = INBUF_NUM_MCUS * MAX_MCU_SIZE;
+ *pdwMinOutBufLen = g->num_comps * g->traits.iPixelsPerRow;
+
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * jpgDecode_convert - the work-horse routine
+ *
+\*****************************************************************************/
+
+static WORD jpgDecode_convert (
+ IP_XFORM_HANDLE hXform,
+ DWORD dwInputAvail, /* in: # avail bytes in in-buf */
+ PBYTE pbInputBuf, /* in: ptr to in-buffer */
+ PDWORD pdwInputUsed, /* out: # bytes used from in-buf */
+ PDWORD pdwInputNextPos, /* out: file-pos to read from next */
+ DWORD dwOutputAvail, /* in: # avail bytes in out-buf */
+ PBYTE pbOutputBuf, /* in: ptr to out-buffer */
+ PDWORD pdwOutputUsed, /* out: # bytes written in out-buf */
+ PDWORD pdwOutputThisPos) /* out: file-pos to write the data */
+{
+ PJDEC_INST g;
+ /* The "static" keyword for ret_val and bDecoded is to prevent the
+ * "variable `' might be clobbered by `longjmp' or `vfork'" warning. */
+ static unsigned ret_val;
+ UINT comp, row, row_len, n_rows, n_bytes, trash;
+ int iErrorCode;
+ static BOOL bDecoded;
+ const BYTE ycc_white[4] = { 255, 128, 128, 255 };
+
+ HANDLE_TO_PTR (hXform, g);
+
+ *pdwInputUsed = 0;
+ *pdwOutputThisPos = g->dwOutNextPos;
+ *pdwOutputUsed = 0;
+ ret_val = IP_READY_FOR_DATA;
+
+ if (setjmp(g->syntax_error) != 0) {
+ PRINT (_T("got a syntax error\n"), 0, 0);
+ *pdwInputNextPos = g->dwInNextPos;
+ return IP_FATAL_ERROR | IP_INPUT_ERROR;
+ }
+
+ /**********************/
+ /* Parsing input data */
+ /**********************/
+
+ if (! g->sending_rows) {
+ if (pbInputBuf == NULL) {
+
+ /* We are being told to flush, so we should have consumed the EOI,
+ * and have discarded any bytes following it. */
+ if (! g->got_EOI) {
+ /* Unexpected end of data: we did not get an EOI */
+ ret_val |= IP_INPUT_ERROR;
+ }
+ ret_val |= IP_DONE;
+
+ } else if (g->got_EOI) {
+
+ /* Discard bytes after the EOI. We should report an error here, but
+ * the ASIC+firmware of Denali/Kodiak can send stuff after the EOI. */
+ *pdwInputUsed = dwInputAvail;
+
+ } else {
+
+ if (g->mcus_done == 0) {
+ /* init all row-buffers to white */
+ PRINT (_T("initing all row-buffers to white\n"), 0, 0);
+ for (comp=0; comp<g->num_comps; comp++) {
+ row_len = g->horiz_samp_facs[comp] * g->mcus_per_row * 8;
+ n_rows = g->vert_samp_facs[comp] * 8;
+
+ for (row=0; row<n_rows; row++)
+ memset (g->out_rows_ap[comp][row], ycc_white[comp], row_len);
+ }
+ }
+
+ do {
+ bDecoded = FALSE;
+ read_buf_open (g, pbInputBuf + *pdwInputUsed);
+ memcpy(&(g->old_syntax_error), &(g->syntax_error), sizeof(jmp_buf));
+ iErrorCode = setjmp(g->syntax_error);
+ if (iErrorCode == 0) {
+ bDecoded = decode_MCU(g);
+
+ /* Check for (and handle) a marker (DNL, RST, EOI).
+ * We need to handle DNL here so the sending_rows state below
+ * won't output the pad rows on the bottom of the image
+ */
+ if (! g->got_EOI) {
+ READ_BITS_LOAD (g, FALSE, 8, trash, at_a_marker);
+ goto no_marker;
+ at_a_marker:
+ handleMarkerInStream(g);
+ no_marker:;
+ }
+ }
+ memcpy(&(g->syntax_error), &(g->old_syntax_error), sizeof(jmp_buf));
+ n_bytes = read_buf_close (g);
+
+ *pdwInputUsed += n_bytes;
+ g->dwInNextPos += n_bytes;
+
+ if (*pdwInputUsed > dwInputAvail) {
+ /* Parser read past end of input buffer */
+ *pdwInputUsed = dwInputAvail;
+ g->dwInNextPos += dwInputAvail - n_bytes;
+ /* We will not make this a fatal error because that would
+ * immediately shut down the remaining xforms in the pipeline.
+ * Instead, we assume that the input data was truncated, and
+ * let the pipeline finish up normally so that it'll give a
+ * valid output file.
+ */
+ ret_val |= IP_INPUT_ERROR;
+ } else if (iErrorCode != 0) {
+ /* An error within the data: Make it fatal */
+ longjmp (g->syntax_error, iErrorCode);
+ } else if (g->got_EOI) {
+ ret_val |= IP_NEW_OUTPUT_PAGE;
+ /* Note: we should have just done the final MCU in a row, but
+ * we don't check for this because the firmware of Denali/Kodiak
+ * can't guarantee it. */
+ }
+
+ if (bDecoded) {
+ g->mcus_done += 1;
+
+ if (g->mcus_done >= g->mcus_per_row) {
+ PRINT (_T("done with row of MCUs; starting row-sends\n"), 0, 0);
+ g->sending_rows = TRUE;
+ g->mcus_done = 0;
+ }
+ }
+ } while (!g->got_EOI && !g->sending_rows &&
+ (dwInputAvail-*pdwInputUsed) >= MAX_MCU_SIZE);
+ }
+ }
+
+ /***************************/
+ /* Sending the output rows */
+ /***************************/
+
+ if (g->sending_rows) {
+ if (g->rows_done>=g->traits.lNumRows && g->traits.lNumRows>=0) {
+ /* we've already output all rows, so discard these */
+ g->sending_rows = FALSE;
+ } else {
+ copy_out_rows (
+ g,
+ g->rows_done % g->rows_per_mcu, /* in: index of next row to send */
+ pbOutputBuf, /* out: copied-out row data */
+ &n_rows, /* out: # of rows copied out */
+ &n_bytes); /* out: # of bytes output */
+ PRINT (_T("copied out %d rows\n"), n_rows, 0);
+ *pdwOutputUsed = n_bytes;
+ g->dwOutNextPos += n_bytes;
+ g->rows_done += n_rows;
+
+ if ((g->rows_done>=g->traits.lNumRows && g->traits.lNumRows>=0)
+ || (g->rows_done % g->rows_per_mcu)==0) {
+ g->sending_rows = FALSE;
+ }
+ /* n_rows is 1, unless the never-used output_subsampled feature is used */
+ if (n_rows > 0)
+ ret_val |= IP_CONSUMED_ROW | IP_PRODUCED_ROW;
+ }
+ }
+
+ *pdwInputNextPos = g->dwInNextPos;
+
+ PRINT (_T("jpeg_decode_convert_row: Returning %04x, in_used=%d\n"),
+ ret_val, *pdwInputUsed);
+ return ret_val;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * jpgDecode_insertedData - client inserted into our output stream
+ *
+\*****************************************************************************/
+
+static WORD jpgDecode_insertedData (
+ IP_XFORM_HANDLE hXform,
+ DWORD dwNumBytes)
+{
+ fatalBreakPoint ();
+ return IP_FATAL_ERROR; /* must never be called (can't insert data) */
+}
+
+
+
+/*****************************************************************************\
+ *
+ * jpgDecode_newPage - Tells us to flush this page, and start a new page
+ *
+\*****************************************************************************/
+
+static WORD jpgDecode_newPage (
+ IP_XFORM_HANDLE hXform)
+{
+ return IP_DONE; /* can't insert page-breaks, so ignore this call */
+}
+
+
+
+/*****************************************************************************\
+ *
+ * jpgDecode_closeXform - Destroys this instance
+ *
+\*****************************************************************************/
+
+static WORD jpgDecode_closeXform (IP_XFORM_HANDLE hXform)
+{
+ PJDEC_INST g;
+ BYTE **row_pp, **after_pp, *p;
+
+ HANDLE_TO_PTR (hXform, g);
+ PRINT (_T("jpeg_decode_close\n"), 0, 0);
+
+ row_pp = &(g->out_rows_ap[0][0]);
+ after_pp = row_pp + (sizeof(g->out_rows_ap)/sizeof(BYTE *));
+
+ for ( ; row_pp<after_pp; row_pp++) {
+ p = *row_pp;
+ if (p != NULL) {
+ IP_MEM_FREE (p);
+ *row_pp = NULL;
+ }
+ }
+
+ huff_free_all (g);
+ g->dwValidChk = 0;
+ IP_MEM_FREE (g); /* free memory for the instance */
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * jpgDecode_getRowCountInfo - Returns information for determining row count
+ *
+\*****************************************************************************/
+
+WORD jpgDecode_getRowCountInfo(IP_XFORM_HANDLE hXform,
+ int *pRcCountup,int *pRcTraits,int *pSofOffset)
+{
+ PJDEC_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+ *pRcCountup=g->rows_done;
+ *pRcTraits=g->traits.lNumRows;
+ *pSofOffset=g->rowCountOffset;
+
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * jpgDecodeTbl - Jump-table for decoder
+ *
+\*****************************************************************************/
+
+IP_XFORM_TBL jpgDecodeTbl = {
+ jpgDecode_openXform,
+ jpgDecode_setDefaultInputTraits,
+ jpgDecode_setXformSpec,
+ jpgDecode_getHeaderBufSize,
+ jpgDecode_getActualTraits,
+ jpgDecode_getActualBufSizes,
+ jpgDecode_convert,
+ jpgDecode_newPage,
+ jpgDecode_insertedData,
+ jpgDecode_closeXform
+};
+
+/* End of File */
+
+
+
+
+
+
+
+
+
+
diff --git a/ip/xjpg_enc.c b/ip/xjpg_enc.c
new file mode 100644
index 0000000..a65bddb
--- /dev/null
+++ b/ip/xjpg_enc.c
@@ -0,0 +1,2184 @@
+/* libhpojip -- HP OfficeJet image-processing library. */
+
+/* Copyright (C) 1995-2002 Hewlett-Packard Company
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ * MA 02111-1307, USA.
+ *
+ * In addition, as a special exception, Hewlett-Packard Company
+ * gives permission to link the code of this program with any
+ * version of the OpenSSL library which is distributed under a
+ * license identical to that listed in the included LICENSE.OpenSSL
+ * file, and distribute linked combinations including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * this file, you may extend this exception to your version of the
+ * file, but you are not obligated to do so. If you do not wish to
+ * do so, delete this exception statement from your version.
+ */
+
+/* Original author: Mark Overton and others.
+ *
+ * Ported to Linux by David Paschal.
+ */
+
+/*****************************************************************************\
+ *
+ * xjpg_enc.c - Converts raw gray image into a valid JPEG file
+ *
+ *****************************************************************************
+ *
+ * Name of Global Jump-Table:
+ *
+ * jpgEncodeTbl
+ *
+ * Items in aXformInfo array passed into setXformSpec:
+ *
+ * aXformInfo[IP_JPG_ENCODE_QUALITY_FACTORS]:
+ * Quality factors. Each 1..255 (best..worst), normal=20 or 0.
+ * If 2nd least significant byte is non-zero, then it is the
+ * DC factor, and lsb is the AC factor. If 2nd lsb is zero,
+ * then the lsb is both AC and DC factor. Q factors match PML.
+ * aXformInfo[IP_JPG_ENCODE_SAMPLE_FACTORS]:
+ * Sample factors in nibbles: HHHHVVVV, 0 means use defaults.
+ * aXformInfo[IP_JPG_ENCODE_ALREADY_SUBSAMPLED]:
+ * Is raw data already subsampled? 0=no, 1=yes.
+ * aXformInfo[IP_JPG_ENCODE_FOR_DENALI]:
+ * Output is for Denali? 0=no, 1=yes
+ * aXformInfo[IP_JPG_ENCODE_OUTPUT_DNL]:
+ * Output a DNL (Define Number of Lines) marker? 0=no, 1=yes.
+ * aXformInfo[IP_JPG_ENCODE_FOR_COLOR_FAX]:
+ * Output an APP1 per the G3 color fax standard? 0=no, 1=yes.
+ * aXformInfo[IP_JPG_ENCODE_DUMMY_HEADER_LEN]:
+ * # bytes in dummy header. 0 means output normal header.
+ * The firmware discards the header in the first raster data
+ * record. This value is the # data bytes in that record.
+ * This MUST be zero for JPEG files not being sent to firmware.
+ *
+ * The aXformInfo items above may all be set to 0 for typical JPEG files.
+ *
+ * For Denali, the JPEG that's output will be changed thusly:
+ * - An EOB will always follow every 8x8 block
+ * - A small change in the Huffman tables (no 15-bit codes)
+ *
+ * Capabilities and Limitations:
+ *
+ * Encodes a standard JPEG file with a JFIF 1.0 marker.
+ * Will *not* output a non-interleaved file; it's interleaved only.
+ * If the number of rows was unknown in the input traits, this encoder
+ * seeks back to the beginning of the file and fills in the row-count.
+ * A DNL is always output if the always-output-DNL item is set in
+ * the aXformInfo array above.
+ * Handles 8-bit gray, or 3-component 24-bit color.
+ *
+ * Default Input Traits, and Output Traits:
+ *
+ * trait default input output
+ * ------------------- --------------------- ------------------------
+ * iPixelsPerRow * passed into output same as default input
+ * iBitsPerPixel * passed into output same as default input
+ * iComponentsPerPixel * must be 1 or 3 same as default input
+ * lHorizDPI passed into output same as default input
+ * lVertDPI passed into output same as default input
+ * lNumRows passed into output same as default input
+ * iNumPages passed into output same as default input
+ * iPageNum passed into output same as default input
+ *
+ * Above, a "*" by an item indicates it must be valid (not negative).
+ *
+ * Jan 1998: Ported to Image Processor module of Windows software.
+ * Feb 1996: Written for firmware, Mark Overton;
+ * sections of this code were ported from HP-Labs (Hugh P. Nguyen).
+ *
+\*****************************************************************************/
+
+#include <string.h>
+#include "hpip.h"
+#include "ipdefs.h"
+#include "xjpg_dct.h"
+#include "xjpg_mrk.h"
+
+
+#if 0
+ #include "stdio.h"
+ #include <tchar.h>
+ #define PRINT(msg,arg1,arg2) \
+ _ftprintf(stdout, _T("(jpeg) ") msg, (int)arg1, (int)arg2)
+#else
+ #define PRINT(msg,arg1,arg2)
+#endif
+
+
+#define RUN_OF_16 0xf0 /* RLE code for run-of-16-zeroes */
+#define MAX_HEADER_SIZE 2000
+#define MAX_BLOCKS_IN_MCU 6
+#define MAX_MCU_SIZE (MAX_BLOCKS_IN_MCU*304)
+ /* max encoded MCU size, plus stuff-bytes */
+#define OUTBUF_NUM_MCUS 2 /* workbuf will be this multiple of max MCU */
+
+#define Q_DEFAULT 20 /* default quality-factor */
+#define MONO_FACTORS 0x10001000u /* default mono sample factors */
+#define COLOR_FACTORS 0x21102110u /* default color sample factors */
+
+#define CHECK_VALUE 0xAceC0de4U
+
+
+/*____________________________________________________________________________
+ | |
+ | Configuration Variables |
+ |____________________________________________________________________________|
+*/
+
+/* Encoding is centered around in_rows_ap. It is indexed by
+ * [color_component_number][row_number].
+ * color_component_number 0 is Y (intensity); mono only has this component.
+ *
+ * Each component in in_rows_ap has a height (# rows) equal to the number of
+ * samples in the MCU, and a width equal to the number of samples in all the
+ * MCUs in a row. That is, pixels are stored in in_rows_ap with NO REPLICATION.
+ * So if a component has sample factors of H and V, it will have 8*V rows and
+ * pixels_in_row*H/max_horiz_sam_fac columns in in_rows_ap.
+ */
+
+typedef struct {
+
+ /**** Configuration ****/
+
+ BYTE lum_quant[64];
+ BYTE chrom_quant[64];
+
+ int wino_lum_quant[64];
+ int wino_lum_quant_thres[64];
+ int wino_chrom_quant[64];
+ int wino_chrom_quant_thres[64];
+
+ BOOL input_subsampled;
+ BOOL fDenali;
+ BOOL fOutputDNL;
+ BOOL fOutputG3APP1;
+ DWORD dwDummyHeaderBytes;
+ UINT rows_in_mcu; /* # rows & cols in each MCU */
+ UINT cols_in_mcu;
+ UINT mcus_in_row; /* # of MCUs in each row */
+ DWORD sample_factors; /* H and V sample factors, one/nibble */
+ BYTE horiz_sam_facs[4]; /* horizontal sampling factors */
+ BYTE vert_sam_facs [4]; /* vertical sampling factors */
+ BYTE max_horiz_sam_fac; /* max sample factors */
+ BYTE max_vert_sam_fac;
+ BYTE dc_q_factor;
+ BYTE ac_q_factor;
+ BYTE comps_in_pixel; /* # components per pixel (1 or 3) */
+ BYTE whitePixel[4]; /* the value of a white pixel */
+ UINT pixels_in_row;
+ int rows_in_page; /* negative means "unknown" */
+ int xRes; /* dots per inch */
+ int yRes;
+
+ /**** Writing Bits ****/
+
+ DWORD wr_bit_buf;
+ /* Bits to be written to outbuf (accumulated left-to-right). */
+
+ int wr_bits_avail;
+ /* Number of bits not yet written in wr_bit_buf (= 32 - number written). */
+
+ BYTE *wr_outbuf_beg;
+ /* The beginning of the output buffer. */
+
+ BYTE *write_buf_next;
+ /* Next byte in outbuf to be written. */
+
+ /**** Encoding Blocks ****/
+
+ int enc_block[64]; /* scratch-pad 8x8 block */
+ int *enc_block_zz[64+16]; /* zig-zag ptrs into above block */
+ int prior_DC[4];
+
+ /**** Top Level Control ****/
+
+ UINT rows_received;
+ UINT rows_loaded;
+ UINT mcus_sent;
+ BOOL loading_rows;
+
+ /**** Miscellaneous ****/
+
+ IP_IMAGE_TRAITS traits;
+ BYTE *in_rows_ap[4][32]; /* row-buffers [component][row] */
+ BOOL fDidHeader; /* output the header yet? */
+ DWORD dwInNextPos; /* next read pos in input file */
+ DWORD dwOutNextPos; /* next write pos in output file */
+ DWORD dwValidChk; /* struct validity check value */
+
+} JENC_INST, *PJENC_INST;
+
+
+/*____________________________________________________________________________
+ | |
+ | Normal Quantization Tables |
+ |____________________________________________________________________________|
+*/
+
+#if 0
+
+static const BYTE orig_lum_quant[64] = {
+ 16, 11, 10, 16, 24, 40, 51, 61,
+ 12, 12, 14, 19, 26, 58, 60, 55,
+ 14, 13, 16, 24, 40, 57, 69, 56,
+ 14, 17, 22, 29, 51, 87, 80, 62,
+ 18, 22, 37, 56, 68, 109, 103, 77,
+ 24, 35, 55, 64, 81, 104, 113, 92,
+ 49, 64, 78, 87, 103, 121, 120, 101,
+ 72, 92, 95, 98, 112, 100, 103, 99
+};
+
+
+static const BYTE orig_chrom_quant[64] = {
+ 17, 18, 24, 47, 99, 99, 99, 99,
+ 18, 21, 26, 66, 99, 99, 99, 99,
+ 24, 26, 56, 99, 99, 99, 99, 99,
+ 47, 66, 99, 99, 99, 99, 99, 99,
+ 99, 99, 99, 99, 99, 99, 99, 99,
+ 99, 99, 99, 99, 99, 99, 99, 99,
+ 99, 99, 99, 99, 99, 99, 99, 99,
+ 99, 99, 99, 99, 99, 99, 99, 99
+};
+
+#endif
+
+
+/*____________________________________________________________________________
+ | |
+ | Zigzag of Normal Quantization Tables |
+ |____________________________________________________________________________|
+*/
+
+static const BYTE orig_lum_quant[64] = {
+ #if 0
+ /* these make color fax look better, but break gray copy
+ * because JPEG is sent to the device, so our tables must
+ * match those in the firmware
+ */
+ 10, 10, 10, 14, 12, 10, 16, 14,
+ #else
+ 16, 11, 12, 14, 12, 10, 16, 14,
+ #endif
+ 13, 14, 18, 17, 16, 19, 24, 40,
+ 26, 24, 22, 22, 24, 49, 35, 37,
+ 29, 40, 58, 51, 61, 60, 57, 51,
+ 56, 55, 64, 72, 92, 78, 64, 68,
+ 87, 69, 55, 56, 80, 109, 81, 87,
+ 95, 98, 103, 104, 103, 62, 77, 113,
+ 121, 112, 100, 120, 92, 101, 103, 99
+};
+
+
+static const BYTE orig_chrom_quant[64] = {
+ #if 0
+ 10, 14, 14, 24, 21, 24, 47, 26,
+ #else
+ 17, 18, 18, 24, 21, 24, 47, 26,
+ #endif
+ 26, 47, 99, 66, 56, 66, 99, 99,
+ 99, 99, 99, 99, 99, 99, 99, 99,
+ 99, 99, 99, 99, 99, 99, 99, 99,
+ 99, 99, 99, 99, 99, 99, 99, 99,
+ 99, 99, 99, 99, 99, 99, 99, 99,
+ 99, 99, 99, 99, 99, 99, 99, 99,
+ 99, 99, 99, 99, 99, 99, 99, 99
+};
+
+
+/*____________________________________________________________________________
+ | | |
+ | codesize_array | Array giving # of bits required to represent the index |
+ |________________|___________________________________________________________|
+*/
+
+static const BYTE codesize_array[256] = {
+ 0,
+ 1,
+ 2, 2,
+ 3, 3, 3, 3,
+ 4, 4, 4, 4, 4, 4, 4, 4,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8
+};
+
+
+
+/*____________________________________________________________________________
+ | |
+ | Huffman Tables |
+ |____________________________________________________________________________|
+*/
+
+static const BYTE lum_DC_counts[16] = {
+ 0x00, 0x01, 0x05, 0x01, 0x01, 0x01, 0x01, 0x01,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
+static const BYTE lum_DC_values[12] = {
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b
+};
+
+static const BYTE chrom_DC_counts[16] = {
+ 0x00, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+ 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
+static const BYTE chrom_DC_values[12] = {
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b
+};
+
+static const BYTE lum_AC_counts[16] = {
+ 0x00, 0x02, 0x01, 0x03, 0x03, 0x02, 0x04, 0x03,
+ 0x05, 0x05, 0x04, 0x04, 0x00, 0x00, 0x01, 0x7d
+};
+
+static const BYTE lum_AC_counts_Denali[16] = {
+ 0x00, 0x02, 0x01, 0x03, 0x03, 0x02, 0x04, 0x03,
+ 0x05, 0x05, 0x04, 0x04, 0x00, 0x00, 0x00, 0x7e
+ /* Above, the [01,7d] in the normal table was changed to [00,7e].
+ * This alteration eliminates the sole 15-bit code, and yields
+ * Huffman codes as follows:
+ * - common codes are 12 bits wide or less,
+ * - uncommon codes are exactly 16 bits wide, and all those codes
+ * start with nine '1' bits, leaving seven bits of useful info.
+ * Denali uses a 4K-entry table for the common codes, and a
+ * quick lookup for the 7-bit leftover codes. So parsing of all
+ * codes is simple and fast.
+ */
+};
+
+static const BYTE lum_AC_values[162] = {
+ 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12,
+ 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07,
+ 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08,
+ 0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0,
+ 0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16,
+ 0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28,
+ 0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
+ 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,
+ 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,
+ 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
+ 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,
+ 0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,
+ 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98,
+ 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
+ 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6,
+ 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5,
+ 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4,
+ 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2,
+ 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea,
+ 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
+ 0xf9, 0xfa
+};
+
+static const BYTE chrom_AC_counts[16] = {
+ 0x00, 0x02, 0x01, 0x02, 0x04, 0x04, 0x03, 0x04,
+ 0x07, 0x05, 0x04, 0x04, 0x00, 0x01, 0x02, 0x77
+};
+
+static const BYTE chrom_AC_values[162] = {
+ 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21,
+ 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71,
+ 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91,
+ 0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0,
+ 0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34,
+ 0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26,
+ 0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38,
+ 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48,
+ 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,
+ 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68,
+ 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
+ 0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
+ 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96,
+ 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5,
+ 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4,
+ 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3,
+ 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2,
+ 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda,
+ 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9,
+ 0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
+ 0xf9, 0xfa
+};
+
+
+
+/*____________________________________________________________________________
+ | |
+ | Huffman tables output by mk_jpg_huff program |
+ |____________________________________________________________________________|
+*/
+
+typedef struct {
+ WORD code; /* the Huff code to use */
+ BYTE size; /* number of bits in above Huff code */
+} huff_elem_t;
+
+
+static const huff_elem_t lum_DC_table[] = {
+ { 0x0000, 2 }, { 0x0002, 3 }, { 0x0003, 3 }, { 0x0004, 3 },
+ { 0x0005, 3 }, { 0x0006, 3 }, { 0x000e, 4 }, { 0x001e, 5 },
+ { 0x003e, 6 }, { 0x007e, 7 }, { 0x00fe, 8 }, { 0x01fe, 9 },
+ { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 },
+ { 0x0000, 0 }, };
+
+
+static const huff_elem_t lum_AC_table[] = {
+ { 0x000a, 4 }, { 0x0000, 2 }, { 0x0001, 2 }, { 0x0004, 3 },
+ { 0x000b, 4 }, { 0x001a, 5 }, { 0x0078, 7 }, { 0x00f8, 8 },
+ { 0x03f6, 10 }, { 0xff82, 16 }, { 0xff83, 16 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x000c, 4 }, { 0x001b, 5 }, { 0x0079, 7 },
+ { 0x01f6, 9 }, { 0x07f6, 11 }, { 0xff84, 16 }, { 0xff85, 16 },
+ { 0xff86, 16 }, { 0xff87, 16 }, { 0xff88, 16 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x001c, 5 }, { 0x00f9, 8 }, { 0x03f7, 10 },
+ { 0x0ff4, 12 }, { 0xff89, 16 }, { 0xff8a, 16 }, { 0xff8b, 16 },
+ { 0xff8c, 16 }, { 0xff8d, 16 }, { 0xff8e, 16 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x003a, 6 }, { 0x01f7, 9 }, { 0x0ff5, 12 },
+ { 0xff8f, 16 }, { 0xff90, 16 }, { 0xff91, 16 }, { 0xff92, 16 },
+ { 0xff93, 16 }, { 0xff94, 16 }, { 0xff95, 16 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x003b, 6 }, { 0x03f8, 10 }, { 0xff96, 16 },
+ { 0xff97, 16 }, { 0xff98, 16 }, { 0xff99, 16 }, { 0xff9a, 16 },
+ { 0xff9b, 16 }, { 0xff9c, 16 }, { 0xff9d, 16 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x007a, 7 }, { 0x07f7, 11 }, { 0xff9e, 16 },
+ { 0xff9f, 16 }, { 0xffa0, 16 }, { 0xffa1, 16 }, { 0xffa2, 16 },
+ { 0xffa3, 16 }, { 0xffa4, 16 }, { 0xffa5, 16 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x007b, 7 }, { 0x0ff6, 12 }, { 0xffa6, 16 },
+ { 0xffa7, 16 }, { 0xffa8, 16 }, { 0xffa9, 16 }, { 0xffaa, 16 },
+ { 0xffab, 16 }, { 0xffac, 16 }, { 0xffad, 16 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x00fa, 8 }, { 0x0ff7, 12 }, { 0xffae, 16 },
+ { 0xffaf, 16 }, { 0xffb0, 16 }, { 0xffb1, 16 }, { 0xffb2, 16 },
+ { 0xffb3, 16 }, { 0xffb4, 16 }, { 0xffb5, 16 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x01f8, 9 }, { 0x7fc0, 15 }, { 0xffb6, 16 },
+ { 0xffb7, 16 }, { 0xffb8, 16 }, { 0xffb9, 16 }, { 0xffba, 16 },
+ { 0xffbb, 16 }, { 0xffbc, 16 }, { 0xffbd, 16 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x01f9, 9 }, { 0xffbe, 16 }, { 0xffbf, 16 },
+ { 0xffc0, 16 }, { 0xffc1, 16 }, { 0xffc2, 16 }, { 0xffc3, 16 },
+ { 0xffc4, 16 }, { 0xffc5, 16 }, { 0xffc6, 16 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x01fa, 9 }, { 0xffc7, 16 }, { 0xffc8, 16 },
+ { 0xffc9, 16 }, { 0xffca, 16 }, { 0xffcb, 16 }, { 0xffcc, 16 },
+ { 0xffcd, 16 }, { 0xffce, 16 }, { 0xffcf, 16 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x03f9, 10 }, { 0xffd0, 16 }, { 0xffd1, 16 },
+ { 0xffd2, 16 }, { 0xffd3, 16 }, { 0xffd4, 16 }, { 0xffd5, 16 },
+ { 0xffd6, 16 }, { 0xffd7, 16 }, { 0xffd8, 16 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x03fa, 10 }, { 0xffd9, 16 }, { 0xffda, 16 },
+ { 0xffdb, 16 }, { 0xffdc, 16 }, { 0xffdd, 16 }, { 0xffde, 16 },
+ { 0xffdf, 16 }, { 0xffe0, 16 }, { 0xffe1, 16 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x07f8, 11 }, { 0xffe2, 16 }, { 0xffe3, 16 },
+ { 0xffe4, 16 }, { 0xffe5, 16 }, { 0xffe6, 16 }, { 0xffe7, 16 },
+ { 0xffe8, 16 }, { 0xffe9, 16 }, { 0xffea, 16 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0xffeb, 16 }, { 0xffec, 16 }, { 0xffed, 16 },
+ { 0xffee, 16 }, { 0xffef, 16 }, { 0xfff0, 16 }, { 0xfff1, 16 },
+ { 0xfff2, 16 }, { 0xfff3, 16 }, { 0xfff4, 16 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 },
+ { 0x07f9, 11 }, { 0xfff5, 16 }, { 0xfff6, 16 }, { 0xfff7, 16 },
+ { 0xfff8, 16 }, { 0xfff9, 16 }, { 0xfffa, 16 }, { 0xfffb, 16 },
+ { 0xfffc, 16 }, { 0xfffd, 16 }, { 0xfffe, 16 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 },
+};
+
+
+static const huff_elem_t lum_AC_table_Denali[] = {
+ { 0x000a, 4 }, { 0x0000, 2 }, { 0x0001, 2 }, { 0x0004, 3 },
+ { 0x000b, 4 }, { 0x001a, 5 }, { 0x0078, 7 }, { 0x00f8, 8 },
+ { 0x03f6, 10 }, { 0xff81, 16 }, { 0xff82, 16 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x000c, 4 }, { 0x001b, 5 }, { 0x0079, 7 },
+ { 0x01f6, 9 }, { 0x07f6, 11 }, { 0xff83, 16 }, { 0xff84, 16 },
+ { 0xff85, 16 }, { 0xff86, 16 }, { 0xff87, 16 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x001c, 5 }, { 0x00f9, 8 }, { 0x03f7, 10 },
+ { 0x0ff4, 12 }, { 0xff88, 16 }, { 0xff89, 16 }, { 0xff8a, 16 },
+ { 0xff8b, 16 }, { 0xff8c, 16 }, { 0xff8d, 16 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x003a, 6 }, { 0x01f7, 9 }, { 0x0ff5, 12 },
+ { 0xff8e, 16 }, { 0xff8f, 16 }, { 0xff90, 16 }, { 0xff91, 16 },
+ { 0xff92, 16 }, { 0xff93, 16 }, { 0xff94, 16 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x003b, 6 }, { 0x03f8, 10 }, { 0xff95, 16 },
+ { 0xff96, 16 }, { 0xff97, 16 }, { 0xff98, 16 }, { 0xff99, 16 },
+ { 0xff9a, 16 }, { 0xff9b, 16 }, { 0xff9c, 16 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x007a, 7 }, { 0x07f7, 11 }, { 0xff9d, 16 },
+ { 0xff9e, 16 }, { 0xff9f, 16 }, { 0xffa0, 16 }, { 0xffa1, 16 },
+ { 0xffa2, 16 }, { 0xffa3, 16 }, { 0xffa4, 16 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x007b, 7 }, { 0x0ff6, 12 }, { 0xffa5, 16 },
+ { 0xffa6, 16 }, { 0xffa7, 16 }, { 0xffa8, 16 }, { 0xffa9, 16 },
+ { 0xffaa, 16 }, { 0xffab, 16 }, { 0xffac, 16 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x00fa, 8 }, { 0x0ff7, 12 }, { 0xffad, 16 },
+ { 0xffae, 16 }, { 0xffaf, 16 }, { 0xffb0, 16 }, { 0xffb1, 16 },
+ { 0xffb2, 16 }, { 0xffb3, 16 }, { 0xffb4, 16 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x01f8, 9 }, { 0xff80, 16 }, { 0xffb5, 16 },
+ { 0xffb6, 16 }, { 0xffb7, 16 }, { 0xffb8, 16 }, { 0xffb9, 16 },
+ { 0xffba, 16 }, { 0xffbb, 16 }, { 0xffbc, 16 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x01f9, 9 }, { 0xffbd, 16 }, { 0xffbe, 16 },
+ { 0xffbf, 16 }, { 0xffc0, 16 }, { 0xffc1, 16 }, { 0xffc2, 16 },
+ { 0xffc3, 16 }, { 0xffc4, 16 }, { 0xffc5, 16 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x01fa, 9 }, { 0xffc6, 16 }, { 0xffc7, 16 },
+ { 0xffc8, 16 }, { 0xffc9, 16 }, { 0xffca, 16 }, { 0xffcb, 16 },
+ { 0xffcc, 16 }, { 0xffcd, 16 }, { 0xffce, 16 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x03f9, 10 }, { 0xffcf, 16 }, { 0xffd0, 16 },
+ { 0xffd1, 16 }, { 0xffd2, 16 }, { 0xffd3, 16 }, { 0xffd4, 16 },
+ { 0xffd5, 16 }, { 0xffd6, 16 }, { 0xffd7, 16 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x03fa, 10 }, { 0xffd8, 16 }, { 0xffd9, 16 },
+ { 0xffda, 16 }, { 0xffdb, 16 }, { 0xffdc, 16 }, { 0xffdd, 16 },
+ { 0xffde, 16 }, { 0xffdf, 16 }, { 0xffe0, 16 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x07f8, 11 }, { 0xffe1, 16 }, { 0xffe2, 16 },
+ { 0xffe3, 16 }, { 0xffe4, 16 }, { 0xffe5, 16 }, { 0xffe6, 16 },
+ { 0xffe7, 16 }, { 0xffe8, 16 }, { 0xffe9, 16 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0xffea, 16 }, { 0xffeb, 16 }, { 0xffec, 16 },
+ { 0xffed, 16 }, { 0xffee, 16 }, { 0xffef, 16 }, { 0xfff0, 16 },
+ { 0xfff1, 16 }, { 0xfff2, 16 }, { 0xfff3, 16 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 },
+ { 0x07f9, 11 }, { 0xfff4, 16 }, { 0xfff5, 16 }, { 0xfff6, 16 },
+ { 0xfff7, 16 }, { 0xfff8, 16 }, { 0xfff9, 16 }, { 0xfffa, 16 },
+ { 0xfffb, 16 }, { 0xfffc, 16 }, { 0xfffd, 16 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 },
+};
+
+
+static const huff_elem_t chrom_DC_table[] = {
+ { 0x0000, 2 }, { 0x0001, 2 }, { 0x0002, 2 }, { 0x0006, 3 },
+ { 0x000e, 4 }, { 0x001e, 5 }, { 0x003e, 6 }, { 0x007e, 7 },
+ { 0x00fe, 8 }, { 0x01fe, 9 }, { 0x03fe, 10 }, { 0x07fe, 11 },
+ { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 },
+ { 0x0000, 0 }, };
+
+
+static const huff_elem_t chrom_AC_table[] = {
+ { 0x0000, 2 }, { 0x0001, 2 }, { 0x0004, 3 }, { 0x000a, 4 },
+ { 0x0018, 5 }, { 0x0019, 5 }, { 0x0038, 6 }, { 0x0078, 7 },
+ { 0x01f4, 9 }, { 0x03f6, 10 }, { 0x0ff4, 12 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x000b, 4 }, { 0x0039, 6 }, { 0x00f6, 8 },
+ { 0x01f5, 9 }, { 0x07f6, 11 }, { 0x0ff5, 12 }, { 0xff88, 16 },
+ { 0xff89, 16 }, { 0xff8a, 16 }, { 0xff8b, 16 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x001a, 5 }, { 0x00f7, 8 }, { 0x03f7, 10 },
+ { 0x0ff6, 12 }, { 0x7fc2, 15 }, { 0xff8c, 16 }, { 0xff8d, 16 },
+ { 0xff8e, 16 }, { 0xff8f, 16 }, { 0xff90, 16 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x001b, 5 }, { 0x00f8, 8 }, { 0x03f8, 10 },
+ { 0x0ff7, 12 }, { 0xff91, 16 }, { 0xff92, 16 }, { 0xff93, 16 },
+ { 0xff94, 16 }, { 0xff95, 16 }, { 0xff96, 16 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x003a, 6 }, { 0x01f6, 9 }, { 0xff97, 16 },
+ { 0xff98, 16 }, { 0xff99, 16 }, { 0xff9a, 16 }, { 0xff9b, 16 },
+ { 0xff9c, 16 }, { 0xff9d, 16 }, { 0xff9e, 16 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x003b, 6 }, { 0x03f9, 10 }, { 0xff9f, 16 },
+ { 0xffa0, 16 }, { 0xffa1, 16 }, { 0xffa2, 16 }, { 0xffa3, 16 },
+ { 0xffa4, 16 }, { 0xffa5, 16 }, { 0xffa6, 16 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x0079, 7 }, { 0x07f7, 11 }, { 0xffa7, 16 },
+ { 0xffa8, 16 }, { 0xffa9, 16 }, { 0xffaa, 16 }, { 0xffab, 16 },
+ { 0xffac, 16 }, { 0xffad, 16 }, { 0xffae, 16 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x007a, 7 }, { 0x07f8, 11 }, { 0xffaf, 16 },
+ { 0xffb0, 16 }, { 0xffb1, 16 }, { 0xffb2, 16 }, { 0xffb3, 16 },
+ { 0xffb4, 16 }, { 0xffb5, 16 }, { 0xffb6, 16 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x00f9, 8 }, { 0xffb7, 16 }, { 0xffb8, 16 },
+ { 0xffb9, 16 }, { 0xffba, 16 }, { 0xffbb, 16 }, { 0xffbc, 16 },
+ { 0xffbd, 16 }, { 0xffbe, 16 }, { 0xffbf, 16 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x01f7, 9 }, { 0xffc0, 16 }, { 0xffc1, 16 },
+ { 0xffc2, 16 }, { 0xffc3, 16 }, { 0xffc4, 16 }, { 0xffc5, 16 },
+ { 0xffc6, 16 }, { 0xffc7, 16 }, { 0xffc8, 16 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x01f8, 9 }, { 0xffc9, 16 }, { 0xffca, 16 },
+ { 0xffcb, 16 }, { 0xffcc, 16 }, { 0xffcd, 16 }, { 0xffce, 16 },
+ { 0xffcf, 16 }, { 0xffd0, 16 }, { 0xffd1, 16 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x01f9, 9 }, { 0xffd2, 16 }, { 0xffd3, 16 },
+ { 0xffd4, 16 }, { 0xffd5, 16 }, { 0xffd6, 16 }, { 0xffd7, 16 },
+ { 0xffd8, 16 }, { 0xffd9, 16 }, { 0xffda, 16 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x01fa, 9 }, { 0xffdb, 16 }, { 0xffdc, 16 },
+ { 0xffdd, 16 }, { 0xffde, 16 }, { 0xffdf, 16 }, { 0xffe0, 16 },
+ { 0xffe1, 16 }, { 0xffe2, 16 }, { 0xffe3, 16 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x07f9, 11 }, { 0xffe4, 16 }, { 0xffe5, 16 },
+ { 0xffe6, 16 }, { 0xffe7, 16 }, { 0xffe8, 16 }, { 0xffe9, 16 },
+ { 0xffea, 16 }, { 0xffeb, 16 }, { 0xffec, 16 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x3fe0, 14 }, { 0xffed, 16 }, { 0xffee, 16 },
+ { 0xffef, 16 }, { 0xfff0, 16 }, { 0xfff1, 16 }, { 0xfff2, 16 },
+ { 0xfff3, 16 }, { 0xfff4, 16 }, { 0xfff5, 16 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 },
+ { 0x03fa, 10 }, { 0x7fc3, 15 }, { 0xfff6, 16 }, { 0xfff7, 16 },
+ { 0xfff8, 16 }, { 0xfff9, 16 }, { 0xfffa, 16 }, { 0xfffb, 16 },
+ { 0xfffc, 16 }, { 0xfffd, 16 }, { 0xfffe, 16 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 },
+};
+
+
+
+/******************************************************************************
+ ******************************************************************************
+
+ WRITING-BITS SECTION
+
+ ******************************************************************************
+ ******************************************************************************
+
+
+ Interface into this section:
+
+ write_init - inits this section
+ write_buf_open - we are being given a (new) output buffer
+ write_buf_close - done with current output buffer; return # bytes sent
+ write_buf_next - (a var) the next byte to write in the output buffer
+ WRITE_BITS_OPEN - setup code for WRITE_BITS
+ WRITE_BITS - outputs bits (fast)
+ WRITE_BITS_HIZERO - outputs bits (faster) assuming higher-order bits are 0
+ WRITE_BITS_CLOSE - teardown code for WRITE_BITS
+ write_bits_flush - flushes the bit-cache
+
+ ******************************************************************************/
+
+
+
+#define INITIAL_BITS_AVAIL (8*sizeof(DWORD))
+ /* Number of bits in wr_bit_buf, which is the # of bits in a DWORD . */
+
+
+/*____________________________________________________________________________
+ | | |
+ | PUT_BYTE_STUFF | Puts byte into outbuf, with byte-stuffing as needed |
+ |________________|___________________________________________________________|
+ | |
+ | A 0xff byte within bit-data is always followed by a 0x00 byte to |
+ | distinguish it from markers, which are 0xff followed by a non-zero byte. |
+ | Therefore, PUT_BYTE_STUFF should never be used to write markers. |
+ |____________________________________________________________________________|
+*/
+#define PUT_BYTE_STUFF(g, pbs_byte_expression) { \
+ BYTE pbs_byte; \
+ \
+ pbs_byte = (BYTE)(pbs_byte_expression); \
+ *(g->write_buf_next)++ = pbs_byte; \
+ if (pbs_byte == (BYTE)0xff) \
+ *(g->write_buf_next)++ = 0; \
+}
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | write_init | Inits this package, and registers the "write bytes" callback |
+ |____________|_______________________________________________________________|
+*/
+static void write_init (PJENC_INST g)
+{
+ g->wr_bits_avail = INITIAL_BITS_AVAIL;
+ g->wr_bit_buf = 0;
+}
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | write_buf_open | We are being given a (new) buffer to receive output |
+ |________________|___________________________________________________________|
+ | |
+ | This routine records the location of the new output buffer. |
+ |____________________________________________________________________________|
+*/
+static void write_buf_open (PJENC_INST g, BYTE *buf_p)
+{
+ g->wr_outbuf_beg = g->write_buf_next = buf_p;
+}
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | write_buf_close | We are done with the current output buffer |
+ |_________________|__________________________________________________________|
+ | |
+ | This function returns # bytes written to the output buffer |
+ |____________________________________________________________________________|
+*/
+static int write_buf_close (PJENC_INST g)
+{
+ return g->write_buf_next - g->wr_outbuf_beg;
+}
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | WRITE_BITS | Writes the given number of bits |
+ |____________|_______________________________________________________________|
+ | |
+ | WRITE_BITS_HIZERO assumes that the higher-order bits are all zero. |
+ | WRITE_BITS masks them out for you. |
+ |____________________________________________________________________________|
+*/
+
+#define WRITE_BITS_OPEN(g) \
+ int tmp_bits_avail = g->wr_bits_avail; \
+ DWORD tmp_bit_buf = g->wr_bit_buf;
+
+
+#define WRITE_BITS_HIZERO(g,wb_value,wb_nbits) { \
+ DWORD bits_loc; \
+ int length_loc; \
+ \
+ length_loc = (int)(wb_nbits); \
+ bits_loc = (DWORD)(wb_value); \
+ \
+ if (length_loc > tmp_bits_avail) { \
+ do { \
+ PUT_BYTE_STUFF (g, tmp_bit_buf >> 24) \
+ tmp_bit_buf <<= 8; \
+ tmp_bits_avail += 8; \
+ } while (tmp_bits_avail <= 24); \
+ } \
+ \
+ tmp_bits_avail -= length_loc; \
+ tmp_bit_buf |= bits_loc << tmp_bits_avail; \
+}
+
+
+#define WRITE_BITS(g,wb_value,wb_nbits) { \
+ int len_loc; \
+ \
+ len_loc = (int)(wb_nbits); \
+ WRITE_BITS_HIZERO (g, (DWORD )(wb_value) & ((1ul<<len_loc)-1), len_loc) \
+}
+
+
+#define WRITE_BITS_CLOSE(g) { \
+ g->wr_bits_avail = tmp_bits_avail; \
+ g->wr_bit_buf = tmp_bit_buf; \
+}
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | write_bits_flush | Writes any buffered bits, with buffering via outbuf |
+ |__________________|_________________________________________________________|
+ | |
+ | Bits are right-padded with ones if necessary to a byte-boundary. |
+ |____________________________________________________________________________|
+*/
+static void write_bits_flush (PJENC_INST g)
+{
+ int bits_used;
+
+ if (g->wr_bits_avail != INITIAL_BITS_AVAIL) {
+ /* JPEG wants pad-bits to be 1's */
+ g->wr_bit_buf |= ((DWORD )1 << g->wr_bits_avail) - 1;
+
+ for (bits_used = INITIAL_BITS_AVAIL - g->wr_bits_avail;
+ bits_used > 0;
+ bits_used -= 8) {
+ PUT_BYTE_STUFF (g, g->wr_bit_buf >> 24)
+ g->wr_bit_buf <<= 8;
+ }
+
+ g->wr_bits_avail = INITIAL_BITS_AVAIL;
+ g->wr_bit_buf = 0;
+ }
+}
+
+
+
+/******************************************************************************
+ ******************************************************************************
+
+ MARKERS SECTION
+
+ ******************************************************************************
+ ******************************************************************************/
+
+
+
+/*____________________________________________________________________________
+ | |
+ | Macros |
+ |____________________________________________________________________________|
+*/
+
+
+#define PUT_MARKER(g,marker) \
+do { \
+ *(g->write_buf_next)++ = 0xff; \
+ *(g->write_buf_next)++ = (BYTE)marker; \
+} while (0)
+
+
+#define PUT_INT(g,value) \
+do { \
+ unsigned loc_val = (unsigned)(value); \
+ *(g->write_buf_next)++ = loc_val >> 8; \
+ *(g->write_buf_next)++ = loc_val & 0xff; \
+} while (0)
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | em_write_SOI | Writes Start-Of-Image marker |
+ |______________|_____________________________________________________________|
+*/
+static void em_write_SOI (PJENC_INST g)
+{
+ PUT_MARKER(g, MARKER_SOI);
+}
+
+
+/*____________________________________________________________________________
+ | | |
+ | em_write_EOI | Writes End-Of-Image marker |
+ |______________|_____________________________________________________________|
+*/
+static void em_write_EOI (PJENC_INST g)
+{
+ PUT_MARKER(g, MARKER_EOI);
+}
+
+
+/*____________________________________________________________________________
+ | | |
+ | em_write_JFIF_APP0 | Writes Application marker for JFIF 1,0 |
+ |____________________|_______________________________________________________|
+*/
+static void em_write_JFIF_APP0 (
+ PJENC_INST g,
+ int xRes, /* X resolution of image (number of pixels per inch) */
+ int yRes) /* Y resolution of image (number of pixels per inch) */
+{
+ PUT_MARKER (g, MARKER_APP+0);
+ PUT_INT (g, 16); /* the length */
+
+ /*** ID ***/
+ *(g->write_buf_next)++ = 'J';
+ *(g->write_buf_next)++ = 'F';
+ *(g->write_buf_next)++ = 'I';
+ *(g->write_buf_next)++ = 'F';
+ *(g->write_buf_next)++ = '\0';
+
+ /*** Version 1.0 ***/
+ *(g->write_buf_next)++ = 0x01;
+ *(g->write_buf_next)++ = 0x00;
+
+ /*** Units (dots per inch) ***/
+ *(g->write_buf_next)++ = 0x01;
+
+ PUT_INT(g, xRes);
+ PUT_INT(g, yRes);
+
+ /*** Thumbnail X and Y ***/
+ *(g->write_buf_next)++ = 0x00;
+ *(g->write_buf_next)++ = 0x00;
+}
+
+
+/*____________________________________________________________________________
+ | | |
+ | em_write_G3_APP1 | Writes Application marker for G3 color fax standard |
+ |__________________|_________________________________________________________|
+*/
+static void em_write_G3_APP1 (
+ PJENC_INST g,
+ int res) /* resolution of image (number of pixels per inch) */
+{
+ res = ((res+50)/100)*100; /* round res to the nearest 100 */
+
+ PUT_MARKER (g, MARKER_APP+1);
+ PUT_INT (g, 12); /* the length */
+
+ /*** ID ***/
+ *(g->write_buf_next)++ = 'G';
+ *(g->write_buf_next)++ = '3';
+ *(g->write_buf_next)++ = 'F';
+ *(g->write_buf_next)++ = 'A';
+ *(g->write_buf_next)++ = 'X';
+ *(g->write_buf_next)++ = 0;
+
+ PUT_INT (g, 1994); /* version is year the std was approved */
+ PUT_INT (g, res); /* finally, the DPI */
+}
+
+
+/*____________________________________________________________________________
+ | | |
+ | em_write_SOF | Writes Start-Of-Frame marker |
+ |______________|_____________________________________________________________|
+*/
+static void em_write_SOF (
+ PJENC_INST g,
+ int width, /* width of image (number of pixels per row) */
+ int height, /* height of image (number of rows) */
+ int ncomps, /* # of color components; 1 is gray, 3 is color */
+ BYTE h_sam_facs[], /* horizontal sampling factors */
+ BYTE v_sam_facs[]) /* vertical sampling factors */
+{
+ int i;
+
+ PUT_MARKER(g, MARKER_SOF0);
+ PUT_INT(g, 8 + ncomps*3); /* the length */
+ *(g->write_buf_next)++ = 8;
+ PUT_INT(g, height);
+ PUT_INT(g, width);
+ *(g->write_buf_next)++ = ncomps;
+
+ for (i=0; i<ncomps; i++) {
+ *(g->write_buf_next)++ = i;
+ *(g->write_buf_next)++ = h_sam_facs[i]<<4 | v_sam_facs[i];
+ *(g->write_buf_next)++ = (i==0 ? 0 : 1);
+ }
+}
+
+
+/*____________________________________________________________________________
+ | | |
+ | em_write_DQT | Writes Define-Quantization-Table marker |
+ |______________|_____________________________________________________________|
+*/
+static void em_write_DQT (
+ PJENC_INST g,
+ int precision, /* 0 = 8-bit, 1 = 16-bit */
+ int ident, /* which table, 0-3 */
+ BYTE elements[64])
+{
+ PUT_MARKER(g, MARKER_DQT);
+ PUT_INT(g, 67); /* the length */
+ *(g->write_buf_next)++ = (precision << 4) + ident;
+ memcpy (g->write_buf_next, elements, 64);
+ g->write_buf_next += 64;
+}
+
+
+/*____________________________________________________________________________
+ | | |
+ | em_write_DHTs | Writes Define-Huffman-Tables marker |
+ |_______________|____________________________________________________________|
+*/
+static void em_write_DHTs (
+ PJENC_INST g,
+ int ntables, /* number of tables */
+ BYTE hclass[], /* 0 = DC or lossless table, 1 = AC table */
+ BYTE ident[], /* 0-3 = which Huffman table this is */
+ const BYTE *counts[], /* # Huffman codes of lengths 1-16 */
+ const BYTE *huffval[]) /* list of associated values */
+{
+ int nvals, i, j;
+
+ nvals = 0;
+ for (i=0; i<ntables; i++) {
+ for (j=0; j<16; j++)
+ nvals += counts[i][j];
+ }
+
+ PUT_MARKER(g, MARKER_DHT);
+ PUT_INT(g, 2 + 17*ntables + nvals); /* the length */
+
+ for (i=0; i<ntables; i++) {
+ for (nvals=j=0; j<16; j++)
+ nvals += counts[i][j];
+
+ *(g->write_buf_next)++ = hclass[i]<<4 | ident[i];
+ for (j=0; j<16; j++) *(g->write_buf_next)++ = counts[i][j];
+ for (j=0; j<nvals; j++) *(g->write_buf_next)++ = huffval[i][j];
+ }
+}
+
+
+/*____________________________________________________________________________
+ | | |
+ | em_write_SOS | Writes Start-Of-Scan marker |
+ |______________|_____________________________________________________________|
+*/
+static void em_write_SOS (
+ PJENC_INST g,
+ int ncomps) /* number of color components; 1 (gray) or 3 (color) */
+{
+ int i;
+
+ PUT_MARKER(g, MARKER_SOS);
+ PUT_INT(g, 6 + 2*ncomps); /* the length */
+ *(g->write_buf_next)++ = ncomps;
+
+ for (i=0; i<ncomps; i++) {
+ *(g->write_buf_next)++ = i;
+ *(g->write_buf_next)++ = (i==0 ? 0x00 : 0x11);
+ }
+
+ *(g->write_buf_next)++ = 0;
+ *(g->write_buf_next)++ = 63;
+ *(g->write_buf_next)++ = 0;
+}
+
+
+/*____________________________________________________________________________
+ | | |
+ | em_write_DNL | Writes Define-Number-of-Lines marker |
+ |______________|_____________________________________________________________|
+*/
+static void em_write_DNL (
+ PJENC_INST g,
+ int nlines) /* number of lines (raster rows) in the JPEG file */
+{
+ PUT_MARKER(g, MARKER_DNL);
+ PUT_INT(g, 4); /* the length */
+ PUT_INT(g, nlines);
+}
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | em_write_short_header | Writes a short non-standard header |
+ |_______________________|____________________________________________________|
+ | |
+ | This header is also output by the firmware, and is only in this |
+ | JPEG encoder for testing purposes. |
+ |____________________________________________________________________________|
+*/
+static void em_write_short_header (
+ PJENC_INST g,
+ UINT rows_in_page,
+ UINT pixels_in_row,
+ UINT xRes,
+ UINT yRes,
+ UINT dc_q_factor,
+ UINT ac_q_factor,
+ UINT comps_in_pixel,
+ DWORD sample_factors)
+{
+ PUT_MARKER (g, MARKER_SHORT_HEADER);
+ PUT_INT (g, 18); /* the length */
+ PUT_INT (g, rows_in_page);
+ PUT_INT (g, pixels_in_row);
+ PUT_INT (g, xRes);
+ PUT_INT (g, yRes);
+ *(g->write_buf_next)++ = ac_q_factor * 5 / 2;
+ *(g->write_buf_next)++ = comps_in_pixel;
+ PUT_INT (g, sample_factors >> 16); /* horiz sample factors */
+ PUT_INT (g, sample_factors & 0x0000ffffu); /* vert sample factors */
+ *(g->write_buf_next)++ = dc_q_factor * 5 / 2;
+ *(g->write_buf_next)++ = 0; /* reserved for future use */
+}
+
+
+
+/******************************************************************************
+ ******************************************************************************
+
+ WINOGRAD DCT SECTION
+
+ ******************************************************************************
+ ******************************************************************************/
+
+
+
+#define BITS_IN_DCT_FRAC 15
+#define ROUND(x) (((x)+(1l<<(BITS_IN_DCT_FRAC-1))) >> BITS_IN_DCT_FRAC)
+
+
+/*____________________________________________________________________________
+ | | |
+ | As table | The As multiplication constants used in the Winograd transform |
+ |__________|_________________________________________________________________|
+ | |
+ | These have 15 bits of fraction. |
+ |____________________________________________________________________________|
+*/
+#define a1 23170L
+#define a2 17734L
+#define a3 23170L
+#define a4 42813L
+#define a5 12540L
+
+
+/*____________________________________________________________________________
+ | | |
+ | wino_norm_tbl | DCT scale-factors; this table has been zigzagged |
+ |_______________|____________________________________________________________|
+*/
+/* todo: do this in fixed-point (see image_proc.c in firmware) */
+static float const wino_norm_tbl[] = {
+ 0.125000f, 0.090120f, 0.090120f, 0.095671f,
+ 0.064973f, 0.095671f, 0.106304f, 0.068975f,
+ 0.068975f, 0.106304f, 0.125000f, 0.076641f,
+ 0.073223f, 0.076641f, 0.125000f, 0.159095f,
+ 0.090120f, 0.081361f, 0.081361f, 0.090120f,
+ 0.159095f, 0.230970f, 0.114701f, 0.095671f,
+ 0.090404f, 0.095671f, 0.114701f, 0.230970f,
+ 0.453064f, 0.166520f, 0.121766f, 0.106304f,
+ 0.106304f, 0.121766f, 0.166520f, 0.453064f,
+ 0.326641f, 0.176777f, 0.135299f, 0.125000f,
+ 0.135299f, 0.176777f, 0.326641f, 0.346760f,
+ 0.196424f, 0.159095f, 0.159095f, 0.196424f,
+ 0.346760f, 0.385299f, 0.230970f, 0.202489f,
+ 0.230970f, 0.385299f, 0.453064f, 0.293969f,
+ 0.293969f, 0.453064f, 0.576641f, 0.426777f,
+ 0.576641f, 0.837153f, 0.837153f, 1.642134f
+};
+
+
+/*____________________________________________________________________________
+ | | |
+ | scale_for_wino | Computes quant-table and threshold-table for Wino's DCT |
+ |________________|___________________________________________________________|
+*/
+static void scale_for_wino (
+ BYTE *in, /* in: regular quantization table */
+ int *out, /* out: winograd quantization table */
+ int *thresh) /* out: threshold table */
+{
+ #define FIX(x) ((long) ((x)*(1l<<BITS_IN_DCT_FRAC) + 0.5))
+ float const *fptr;
+ int i, q;
+
+ /* Note that in order for FIX(fptr[i]/in[i]) to fit inside 16-bit signed
+ * int, (fptr[i]/in[i] < 1) => (in[i] > fptr[i]) (1). Since in[i] >= 1,
+ * and (fptr[i] < 1) for i = 0 to 62, (1) is true for i = 0 to 62. For
+ * i = 63, (1) is true only when in[63] >= 2
+ */
+ if (in[63] < 2) in[63] = 2;
+
+ fptr = wino_norm_tbl;
+ for (i=0; i<64; i++) {
+ q = FIX (*fptr++ / (float)(*in++));
+ *out++ = q;
+ if (q == 0) *thresh++ = 32767;
+ else *thresh++ = (1 << (BITS_IN_DCT_FRAC-1)) / q;
+ }
+}
+
+
+
+/******************************************************************************
+ ******************************************************************************
+
+ E N C O D I N G
+
+ ******************************************************************************
+ ******************************************************************************/
+
+
+
+static const BYTE zigzag_index_table[64] = {
+ 0, 1, 8, 16, 9, 2, 3, 10,
+ 17, 24, 32, 25, 18, 11, 4, 5,
+ 12, 19, 26, 33, 40, 48, 41, 34,
+ 27, 20, 13, 6, 7, 14, 21, 28,
+ 35, 42, 49, 56, 57, 50, 43, 36,
+ 29, 22, 15, 23, 30, 37, 44, 51,
+ 58, 59, 52, 45, 38, 31, 39, 46,
+ 53, 60, 61, 54, 47, 55, 62, 63
+};
+
+
+#define WRITE_HUFF_CODE(g,val,huffman) { \
+ int whc_val = (int)(val); \
+ WRITE_BITS_HIZERO (g, huffman[whc_val].code, huffman[whc_val].size) \
+}
+
+
+
+static void zero_prior_DC (PJENC_INST g)
+{
+ g->prior_DC[0] = g->prior_DC[1] = g->prior_DC[2] = g->prior_DC[3] = 0;
+}
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | encode_init | Inits this section |
+ |_____________|______________________________________________________________|
+*/
+static void encode_init (PJENC_INST g)
+{
+ BYTE const *zig_p;
+ int **block_pp;
+
+ zig_p = zigzag_index_table;
+ for (block_pp=g->enc_block_zz; block_pp<g->enc_block_zz+(64+16); block_pp++)
+ *block_pp = &(g->enc_block[*zig_p++]);
+}
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | encode_block | Encodes an 8x8 block of pixels into Huffman data |
+ |______________|_____________________________________________________________|
+ | |
+ | The input data is variable 'enc_block' via 'enc_block_zz'. |
+ | |
+ | The data to be quantized is compared to thresh to determine if the |
+ | quantized data will be zero. In most cases, this is true, thus |
+ | eliminating the quantization steps (multiplication + add + shift). |
+ |____________________________________________________________________________|
+*/
+static void encode_block (
+ PJENC_INST g,
+ int comp, /* image component number */
+ const huff_elem_t *dc_huff_p,
+ const huff_elem_t *ac_huff_p,
+ int *quant_p,
+ int *thresh_p)
+{
+ int **block_p;
+ int i, data, absdata, run, siz;
+ int diff, absdiff;
+ WRITE_BITS_OPEN(g)
+
+ /************************************/
+ /* Quantize and Encode DC component */
+ /************************************/
+
+ thresh_p++;
+ block_p = g->enc_block_zz;
+ data = ROUND ((long)*(*block_p++) * (*quant_p++));
+ absdiff = diff = data - g->prior_DC[comp];
+ if (absdiff < 0) absdiff = -absdiff;
+ g->prior_DC[comp] = data;
+
+ if (absdiff < 256) siz = codesize_array[absdiff];
+ else siz = codesize_array[absdiff>>8] + 8;
+
+ WRITE_HUFF_CODE (g, siz, dc_huff_p)
+ WRITE_BITS (g, diff<0 ? diff-1 : diff, siz)
+
+ /************************************************/
+ /* Quantize, Zigzag, and Encode AC coefficients */
+ /************************************************/
+
+ run = 0;
+
+ for (i=63; i>0; i--) /* do 63 times... */
+ {
+ absdata = data = *(*block_p++);
+ if (absdata < 0) absdata = -absdata;
+
+ if (absdata <= *thresh_p++) {
+ /* quantization would be zero */
+ quant_p++;
+ run++; /* increment run-length of zeroes */
+ }
+ else /* need to quantize */
+ {
+ while (run >= 16) {
+ WRITE_HUFF_CODE (g, RUN_OF_16, ac_huff_p)
+ run -= 16;
+ }
+
+ absdata = ROUND ((DWORD )absdata * (DWORD )(*quant_p++));
+ if (absdata < 256) siz = codesize_array[absdata];
+ else siz = codesize_array[absdata>>8] + 8;
+
+ /* output the RLE code, and the AC term */
+ WRITE_HUFF_CODE (g, (run<<4) + siz, ac_huff_p)
+ WRITE_BITS (g, data<0 ? ~absdata : absdata, siz)
+ run = 0;
+ }
+ }
+
+ if (run>0 || g->fDenali)
+ WRITE_HUFF_CODE (g, 0, ac_huff_p) /* output EOB code */
+
+ WRITE_BITS_CLOSE(g)
+}
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | encode_MCU | encodes the given MCU from the input rows in in_rows_ap |
+ |____________|_______________________________________________________________|
+*/
+static void encode_MCU (
+ PJENC_INST g,
+ UINT mcu_index)
+{
+ int *block_p;
+ UINT comp;
+ UINT h_block, v_block;
+ UINT ul_row, ul_col;
+ UINT row;
+ BYTE **row_pp;
+ BYTE *row_p;
+
+ for (comp=0; comp<g->comps_in_pixel; comp++) {
+ for (v_block=0; v_block<g->vert_sam_facs[comp]; v_block++) {
+ for (h_block=0; h_block<g->horiz_sam_facs[comp]; h_block++) {
+
+ /***** level-shift and copy the block into 'enc_block' *****/
+
+ ul_row = v_block*8;
+ ul_col = (mcu_index*g->horiz_sam_facs[comp] + h_block) * 8;
+ row_pp = &(g->in_rows_ap[comp][ul_row]);
+ block_p = g->enc_block;
+
+ for (row=0; row<8; row++) {
+ row_p = *row_pp++ + ul_col;
+
+ *block_p++ = (int)(UINT)*row_p++ - 128;
+ *block_p++ = (int)(UINT)*row_p++ - 128;
+ *block_p++ = (int)(UINT)*row_p++ - 128;
+ *block_p++ = (int)(UINT)*row_p++ - 128;
+ *block_p++ = (int)(UINT)*row_p++ - 128;
+ *block_p++ = (int)(UINT)*row_p++ - 128;
+ *block_p++ = (int)(UINT)*row_p++ - 128;
+ *block_p++ = (int)(UINT)*row_p - 128;
+ }
+
+ dct_forward (g->enc_block);
+
+ /***** encode and output the block *****/
+
+ if (comp == 0) {
+ encode_block (g, comp, lum_DC_table, g->fDenali ? lum_AC_table_Denali : lum_AC_table,
+ g->wino_lum_quant, g->wino_lum_quant_thres);
+ } else {
+ encode_block (g, comp, chrom_DC_table, chrom_AC_table,
+ g->wino_chrom_quant, g->wino_chrom_quant_thres);
+ }
+ }
+ }
+ }
+}
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | copy_in_rows | copies a row (or rows) from input buffer to in_rows_ap |
+ |______________|_____________________________________________________________|
+ | |
+ | If input_subsampled is true, the input row data must be in the same odd |
+ | order which the ASIC outputs it. |
+ | |
+ | View a period as being a group of max_horiz_sam_fac by max_vert_sam_fac |
+ | samples. (BTW, an MCU contains exactly 8x8 periods.) Divide the entire |
+ | image into a grid of such periods. The ASIC outputs the periods left to |
+ | right, top to bottom. It outputs all the data in each period, before |
+ | moving to the next period. Within a period, it outputs the components in |
+ | succession; within a component, it outputs the samples left to right, top |
+ | to bottom. |
+ | |
+ | For example: |
+ | Three components = Y U V |
+ | Horiz sample factors = 2 1 1 |
+ | Vert sample factors = 2 1 1 |
+ | A period is 2x2 samples (i.e., a 2x2 square). |
+ | Each period contains these samples: YYYYUV. |
+ | Bytes output: YYYYUV YYYYUV YYYYUV .... |
+ | |
+ | In this routine, |
+ | |
+ | vert_period = index of which period we're inputting vertically within |
+ | an MCU (0-7). |
+ | |
+ | horiz_period = index of which period we're inputting horizontally; |
+ | since an MCU has 8 periods, this is 0 .. 8*mcus_in_row. |
+ |____________________________________________________________________________|
+*/
+static void copy_in_rows (
+ PJENC_INST g,
+ UINT row_index, /* in: index of next row to get within MCU */
+ BYTE *inbuf_p, /* in: input row data */
+ UINT *n_rows_p, /* out: # of rows copied in */
+ UINT *n_bytes_p) /* out: # of bytes copied in */
+{
+ BYTE *in_p;
+ UINT comp;
+ UINT vert_period, vert_mod;
+
+ vert_period = row_index / g->max_vert_sam_fac;
+ vert_mod = row_index % g->max_vert_sam_fac;
+
+ if (!g->input_subsampled || (g->max_vert_sam_fac==1 && g->max_horiz_sam_fac==1))
+ {
+ /********************************************************/
+ /* Perform subsampling (or copying of non-sampled data) */
+ /********************************************************/
+
+ BYTE *row_p;
+ UINT sam_fac;
+ UINT col, horiz_mod;
+ UINT inc;
+
+ for (comp=0; comp<g->comps_in_pixel; comp++) {
+ sam_fac = g->vert_sam_facs[comp];
+
+ if (vert_mod < sam_fac) {
+ in_p = inbuf_p + comp;
+ row_p = g->in_rows_ap[comp][vert_period*sam_fac + vert_mod];
+ horiz_mod = 0;
+ sam_fac = g->horiz_sam_facs[comp];
+
+ if (sam_fac == g->max_horiz_sam_fac) {
+
+ /***** fast case: copying all pixels *****/
+
+ if (g->comps_in_pixel == 1) {
+ memcpy (row_p, in_p, g->pixels_in_row);
+ } else {
+ for (col=0; col<g->pixels_in_row; col+=4) {
+ *row_p++ = *in_p; in_p += g->comps_in_pixel;
+ *row_p++ = *in_p; in_p += g->comps_in_pixel;
+ *row_p++ = *in_p; in_p += g->comps_in_pixel;
+ *row_p++ = *in_p; in_p += g->comps_in_pixel;
+ }
+ }
+
+ } else if (sam_fac==1 && g->max_horiz_sam_fac==2) {
+
+ /***** fast case: copying every other pixel *****/
+
+ inc = 2 * g->comps_in_pixel;
+ for (col=0; col<g->pixels_in_row; col+=8) {
+ *row_p++ = *in_p; in_p += inc;
+ *row_p++ = *in_p; in_p += inc;
+ *row_p++ = *in_p; in_p += inc;
+ *row_p++ = *in_p; in_p += inc;
+ }
+
+ } else {
+
+ /***** slow general case *****/
+
+ for (col=0; col<g->pixels_in_row; col++) {
+ if (horiz_mod < sam_fac) *row_p++ = *in_p;
+ in_p += g->comps_in_pixel;
+ horiz_mod += 1;
+ if (horiz_mod == g->max_horiz_sam_fac) horiz_mod = 0;
+ }
+ }
+ }
+ }
+
+ *n_rows_p = 1;
+ *n_bytes_p = g->comps_in_pixel * g->pixels_in_row;
+
+ } else {
+
+ /************************************************/
+ /* Already subsampled (in the ASIC's odd order) */
+ /************************************************/
+
+ UINT horiz_period, periods_in_row;
+ UINT ul_row, ul_col, row, col;
+ BYTE *row_y1_p, *row_y2_p, *row_cb_p, *row_cr_p;
+
+ in_p = inbuf_p;
+ periods_in_row = g->mcus_in_row * 8;
+
+ if (g->sample_factors == 0x21102110u) { /* fast case: 4-1-1 subsampling */
+ row_y1_p = g->in_rows_ap[0][2*vert_period];
+ row_y2_p = g->in_rows_ap[0][2*vert_period+1];
+ row_cb_p = g->in_rows_ap[1][vert_period];
+ row_cr_p = g->in_rows_ap[2][vert_period];
+ for (horiz_period=0; horiz_period<periods_in_row; horiz_period++) {
+ *row_y1_p++ = *in_p++;
+ *row_y1_p++ = *in_p++;
+ *row_y2_p++ = *in_p++;
+ *row_y2_p++ = *in_p++;
+ *row_cb_p++ = *in_p++;
+ *row_cr_p++ = *in_p++;
+ }
+ } else { /* slow general case */
+
+ for (horiz_period=0; horiz_period<periods_in_row; horiz_period++) {
+ for (comp=0; comp<g->comps_in_pixel; comp++) {
+ ul_row = vert_period * g->vert_sam_facs[comp];
+ ul_col = horiz_period * g->horiz_sam_facs[comp];
+
+ for (row=ul_row; row<ul_row+ g->vert_sam_facs[comp]; row++)
+ for (col=ul_col; col<ul_col+g->horiz_sam_facs[comp]; col++) {
+ g->in_rows_ap[comp][row][col] = *in_p++;
+ }
+ }
+ }
+ }
+
+ *n_rows_p = g->max_vert_sam_fac;
+ *n_bytes_p = in_p - inbuf_p;
+ }
+}
+
+
+/******************************************************************************
+ ******************************************************************************
+
+ EXPORTED ROUTINES
+
+ ******************************************************************************
+ ******************************************************************************/
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | scale_q_table | scales a q-table according to the q-factors |
+ |_______________|____________________________________________________________|
+*/
+static void scale_q_table (
+ UINT dc_q_factor,
+ UINT ac_q_factor,
+ const BYTE *in,
+ BYTE *out)
+{
+ #define FINAL_DC_INDEX 9
+
+ UINT i, val;
+ UINT q;
+
+ q = dc_q_factor;
+
+ for (i=0; i<64; i++) {
+ val = ((*in++)*q + Q_DEFAULT/2) / Q_DEFAULT;
+ if (val < 1) val = 1;
+ if (val > 255) val = 255;
+ *out++ = (BYTE)val;
+ if (i == FINAL_DC_INDEX)
+ q = ac_q_factor;
+ }
+}
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | output_header | outputs the JPEG header |
+ |_______________|____________________________________________________________|
+ | |
+ | Inputs: lum_quant, chrom_quant, xRes, yRes, pixels_in_row, comps_in_pixel,|
+ | horiz_sam_facs, vert_sam_facs |
+ |____________________________________________________________________________|
+*/
+static UINT output_header (
+ PJENC_INST g,
+ BYTE *buf_p)
+{
+ BYTE hclass[4];
+ BYTE ident[4];
+ const BYTE *counts[4];
+ const BYTE *huffval[4];
+
+ hclass [0] = 0;
+ ident [0] = 0;
+ counts [0] = lum_DC_counts;
+ huffval[0] = lum_DC_values;
+
+ hclass [1] = 1;
+ ident [1] = 0;
+ counts [1] = g->fDenali ? lum_AC_counts_Denali : lum_AC_counts;
+ huffval[1] = lum_AC_values;
+
+ hclass [2] = 0;
+ ident [2] = 1;
+ counts [2] = chrom_DC_counts;
+ huffval[2] = chrom_DC_values;
+
+ hclass [3] = 1;
+ ident [3] = 1;
+ counts [3] = chrom_AC_counts;
+ huffval[3] = chrom_AC_values;
+
+ write_buf_open (g, buf_p);
+ em_write_SOI (g);
+
+ if (0 /* todo */ ) {
+ em_write_short_header (g, g->rows_in_page<0 ? 0 : g->rows_in_page,
+ g->pixels_in_row,
+ g->xRes, g->yRes,
+ g->dc_q_factor, g->ac_q_factor,
+ g->comps_in_pixel,
+ g->sample_factors);
+ } else {
+ if (g->fOutputG3APP1)
+ em_write_G3_APP1 (g, g->xRes);
+ else
+ em_write_JFIF_APP0 (g, g->xRes, g->yRes);
+ em_write_SOF (g, g->pixels_in_row, g->rows_in_page<0 ? 0 : g->rows_in_page,
+ g->comps_in_pixel, g->horiz_sam_facs, g->vert_sam_facs);
+ em_write_DQT (g, 0, 0, g->lum_quant);
+ if (g->comps_in_pixel > 1)
+ em_write_DQT (g, 0, 1, g->chrom_quant);
+ em_write_DHTs (g, g->comps_in_pixel==1 ? 2 : 4,
+ hclass, ident, counts, huffval);
+ em_write_SOS (g, g->comps_in_pixel);
+ }
+ return write_buf_close (g);
+}
+
+
+
+/*****************************************************************************\
+ *
+ * jpgEncode_openXform - Creates a new instance of the transformer
+ *
+ *****************************************************************************
+ *
+ * This returns a handle for the new instance to be passed into
+ * all subsequent calls.
+ *
+ * Return value: IP_DONE=success; IP_FATAL_ERROR=misc error.
+ *
+\*****************************************************************************/
+
+static WORD jpgEncode_openXform (
+ IP_XFORM_HANDLE *pXform) /* out: returned handle */
+{
+ PJENC_INST g;
+
+ INSURE (pXform != NULL);
+ IP_MEM_ALLOC (sizeof(JENC_INST), g);
+ *pXform = g;
+ memset (g, 0, sizeof(JENC_INST));
+ g->dwValidChk = CHECK_VALUE;
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * jpgEncode_setDefaultInputTraits - Specifies default input image traits
+ *
+ *****************************************************************************
+ *
+ * The header of the file-type handled by the transform probably does
+ * not include *all* the image traits we'd like to know. Those not
+ * specified in the file-header are filled in from info provided by
+ * this routine.
+ *
+ * Return value: IP_DONE=success; IP_FATAL_ERROR=misc error.
+ *
+\*****************************************************************************/
+
+static WORD jpgEncode_setDefaultInputTraits (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ PIP_IMAGE_TRAITS pTraits) /* in: default image traits */
+{
+ PJENC_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+ g->traits = *pTraits; /* a structure copy */
+
+ INSURE (g->traits.iPixelsPerRow > 0);
+ INSURE (g->traits.iComponentsPerPixel==1 || g->traits.iComponentsPerPixel==3);
+
+ g->pixels_in_row = g->traits.iPixelsPerRow;
+ g->comps_in_pixel = g->traits.iComponentsPerPixel;
+ g->rows_in_page = g->traits.lNumRows;
+ g->xRes = g->traits.lHorizDPI >> 16;
+ g->yRes = g->traits.lVertDPI >> 16;
+ if (g->xRes < 0) g->xRes = 300;
+ if (g->yRes < 0) g->yRes = 300;
+
+ g->fDidHeader = FALSE;
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * jpgEncode_setXformSpec - Provides xform-specific information
+ *
+\*****************************************************************************/
+
+static WORD jpgEncode_setXformSpec (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD_OR_PVOID aXformInfo[]) /* in: xform information */
+{
+ PJENC_INST g;
+ UINT qfacs;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ qfacs = aXformInfo[IP_JPG_ENCODE_QUALITY_FACTORS].dword;
+ g->sample_factors = aXformInfo[IP_JPG_ENCODE_SAMPLE_FACTORS].dword;
+ g->input_subsampled = aXformInfo[IP_JPG_ENCODE_ALREADY_SUBSAMPLED].dword;
+ g->fDenali = (BOOL)aXformInfo[IP_JPG_ENCODE_FOR_DENALI].dword;
+ g->fOutputDNL = (BOOL)aXformInfo[IP_JPG_ENCODE_OUTPUT_DNL].dword;
+ g->fOutputG3APP1 = (BOOL)aXformInfo[IP_JPG_ENCODE_FOR_COLOR_FAX].dword;
+ g->dwDummyHeaderBytes = aXformInfo[IP_JPG_ENCODE_DUMMY_HEADER_LEN].dword;
+
+ g->dc_q_factor = (BYTE)(qfacs >> 8);
+ g->ac_q_factor = (BYTE)(qfacs);
+
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * jpgEncode_getHeaderBufSize- Returns size of input buf needed to hold header
+ *
+\*****************************************************************************/
+
+static WORD jpgEncode_getHeaderBufSize (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD *pdwInBufLen) /* out: buf size for parsing header */
+{
+ PJENC_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+ /* since input is raw pixels, there is no header, so set it to zero */
+ *pdwInBufLen = 0;
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * jpgEncode_getActualTraits - Parses header, and returns input & output traits
+ *
+\*****************************************************************************/
+
+static WORD jpgEncode_getActualTraits (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD dwInputAvail, /* in: # avail bytes in input buf */
+ PBYTE pbInputBuf, /* in: ptr to input buffer */
+ PDWORD pdwInputUsed, /* out: # bytes used from input buf */
+ PDWORD pdwInputNextPos,/* out: file-pos to read from next */
+ PIP_IMAGE_TRAITS pInTraits, /* out: input image traits */
+ PIP_IMAGE_TRAITS pOutTraits) /* out: output image traits */
+{
+ PJENC_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ /* Since there is no header, we'll report no usage of input */
+ *pdwInputUsed = 0;
+ *pdwInputNextPos = 0;
+
+ /* Since we don't change traits, just copy out the default traits */
+ *pInTraits = g->traits;
+ *pOutTraits = g->traits;
+
+ return IP_DONE | IP_READY_FOR_DATA;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/****************************************************************************\
+ *
+ * jpgEncode_getActualBufSizes - Returns buf sizes needed for remainder of job
+ *
+\****************************************************************************/
+
+static WORD jpgEncode_getActualBufSizes (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ PDWORD pdwMinInBufLen, /* out: min input buf size */
+ PDWORD pdwMinOutBufLen) /* out: min output buf size */
+{
+ PJENC_INST g;
+ WORD n;
+
+ HANDLE_TO_PTR (hXform, g);
+ *pdwMinInBufLen = g->comps_in_pixel * g->pixels_in_row;
+
+ n = OUTBUF_NUM_MCUS * MAX_MCU_SIZE;
+ if (n < MAX_HEADER_SIZE) n = MAX_HEADER_SIZE;
+ *pdwMinOutBufLen = n;
+
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * jpgEncode_convert - the work-horse routine
+ *
+\*****************************************************************************/
+
+static WORD jpgEncode_convert (
+ IP_XFORM_HANDLE hXform,
+ DWORD dwInputAvail, /* in: # avail bytes in in-buf */
+ PBYTE pbInputBuf, /* in: ptr to in-buffer */
+ PDWORD pdwInputUsed, /* out: # bytes used from in-buf */
+ PDWORD pdwInputNextPos, /* out: file-pos to read from next */
+ DWORD dwOutputAvail, /* in: # avail bytes in out-buf */
+ PBYTE pbOutputBuf, /* in: ptr to out-buffer */
+ PDWORD pdwOutputUsed, /* out: # bytes written in out-buf */
+ PDWORD pdwOutputThisPos) /* out: file-pos to write the data */
+{
+ PJENC_INST g;
+ unsigned ret_val;
+ UINT row, n_rows, n_bytes;
+ int comp;
+ UINT row_len;
+ UINT n_loaded;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ *pdwInputNextPos = g->dwInNextPos;
+ *pdwInputUsed = 0;
+ *pdwOutputThisPos = g->dwOutNextPos;
+ *pdwOutputUsed = 0;
+ ret_val = IP_READY_FOR_DATA;
+
+ /****************************************************/
+ /* Init and output the Header if we haven't already */
+ /****************************************************/
+
+ if (! g->fDidHeader) {
+ UINT row_len;
+ BYTE *p;
+ DWORD factors;
+ UINT fac;
+
+ /* Init */
+
+ g->rows_loaded = 0;
+ g->mcus_sent = 0;
+ g->loading_rows = TRUE;
+ write_init (g);
+ zero_prior_DC (g);
+ encode_init (g);
+
+ if (g->ac_q_factor == 0)
+ g->ac_q_factor = Q_DEFAULT;
+ if (g->dc_q_factor == 0)
+ g->dc_q_factor = g->ac_q_factor;
+
+ if (g->sample_factors == 0)
+ g->sample_factors = g->comps_in_pixel==1 ? MONO_FACTORS : COLOR_FACTORS;
+
+ factors = g->sample_factors >> 16;
+ g->max_horiz_sam_fac = 0;
+ for (comp=3; comp>=0; comp--) {
+ fac = factors & 0x0fu;
+ if (fac > g->max_horiz_sam_fac) g->max_horiz_sam_fac = fac;
+ g->horiz_sam_facs[comp] = fac;
+ factors >>= 4;
+ }
+
+ factors = g->sample_factors & 0x0000ffffu;
+ g->max_vert_sam_fac = 0;
+ for (comp=3; comp>=0; comp--) {
+ fac = factors & 0x0fu;
+ if (fac > g->max_vert_sam_fac) g->max_vert_sam_fac = fac;
+ g->vert_sam_facs[comp] = fac;
+ factors >>= 4;
+ }
+
+ g->cols_in_mcu = g->max_horiz_sam_fac * 8;
+ g->rows_in_mcu = g->max_vert_sam_fac * 8;
+ g->mcus_in_row = (g->pixels_in_row + g->cols_in_mcu - 1) / g->cols_in_mcu;
+
+ scale_q_table (g->dc_q_factor, g->ac_q_factor, orig_lum_quant, g->lum_quant);
+ scale_q_table (g->dc_q_factor, g->ac_q_factor, orig_chrom_quant, g->chrom_quant);
+
+ /* scale lum_quant & chrom_quant for Wino DCT */
+ scale_for_wino (g->lum_quant, g->wino_lum_quant, g->wino_lum_quant_thres);
+ scale_for_wino (g->chrom_quant, g->wino_chrom_quant, g->wino_chrom_quant_thres);
+
+ g->whitePixel[0] = 255; /* YCC value of a white pixel (color) */
+ g->whitePixel[1] = 128; /* The 255 is white in mono too */
+ g->whitePixel[2] = 128;
+ g->whitePixel[3] = 255;
+
+ g->dwOutNextPos = *pdwOutputUsed = (g->dwDummyHeaderBytes == 0)
+ ? output_header (g,pbOutputBuf)
+ : g->dwDummyHeaderBytes;
+
+ *pdwOutputThisPos = 0;
+
+ /* Allocate the row-buffers in in_rows_ap */
+
+ memset (g->in_rows_ap, 0, sizeof(g->in_rows_ap));
+
+ for (comp=0; comp<(int)g->comps_in_pixel; comp++) {
+ row_len = g->horiz_sam_facs[comp] * g->mcus_in_row * 8;
+ n_rows = g->vert_sam_facs[comp] * 8;
+
+ for (row=0; row<n_rows; row++) {
+ IP_MEM_ALLOC (row_len, p);
+ g->in_rows_ap[comp][row] = p;
+ }
+ }
+
+ *pdwInputUsed = 0;
+ *pdwInputNextPos = 0;
+ g->dwInNextPos = 0;
+ g->fDidHeader = TRUE;
+
+ return IP_READY_FOR_DATA;
+ }
+
+ /*********************************/
+ /* We are filling the input rows */
+ /*********************************/
+
+ if (g->loading_rows) {
+
+ /***** Init all row-buffers to white if starting new row-set *****/
+
+ n_loaded = g->rows_loaded % g->rows_in_mcu;
+
+ if (n_loaded == 0) {
+ for (comp=0; comp<g->comps_in_pixel; comp++) {
+ row_len = g->horiz_sam_facs[comp] * g->mcus_in_row * 8;
+ n_rows = g->vert_sam_facs[comp] * 8;
+
+ for (row=0; row<n_rows; row++)
+ memset (g->in_rows_ap[comp][row], g->whitePixel[comp], row_len);
+ }
+ }
+
+ if (pbInputBuf == NULL) {
+
+ /***** We are being told to flush *****/
+
+ if (n_loaded != 0) {
+ /* some rows were loaded; start compressing rows now */
+ g->loading_rows = FALSE;
+ /* boost rows_loaded to next multiple of rows_in_mcu so
+ * n_loaded will be 0 next time around */
+ g->rows_loaded += g->rows_in_mcu - n_loaded;
+ } else if ((g->rows_in_page<0 || (int)g->rows_received<g->rows_in_page)
+ && g->dwDummyHeaderBytes == 0) {
+ /* row-count was unknown or too big, output header w/ correct row-count */
+ g->rows_in_page = g->rows_received;
+ *pdwOutputUsed = output_header (g, pbOutputBuf);
+ *pdwOutputThisPos = 0;
+ } else {
+ /* no rows were loaded, and row-count is valid, so we're done */
+ PRINT (_T("jpeg_encode_convert_row: Done\n"),0,0);
+ write_buf_open (g, pbOutputBuf);
+ write_bits_flush (g);
+ if (g->fOutputDNL)
+ em_write_DNL (g, g->rows_received);
+ em_write_EOI (g);
+ *pdwOutputUsed = write_buf_close (g);
+ ret_val |= IP_DONE;
+ }
+ } else {
+
+ /***** Copy the row(s) into in_rows_ap *****/
+
+ copy_in_rows (
+ g,
+ n_loaded, /* in: index of next row to get */
+ pbInputBuf, /* in: copied-in row data */
+ &n_rows, /* out: # of rows copied in */
+ &n_bytes); /* out: # of bytes fetched */
+
+ *pdwInputUsed = n_bytes;
+ *pdwInputNextPos = (g->dwInNextPos += n_bytes);
+ g->rows_loaded += n_rows;
+ g->rows_received += n_rows;
+ n_loaded = g->rows_loaded % g->rows_in_mcu;
+
+ /* it's hard to set IP_PRODUCED_ROW 8 times per 8 rows, so cheat */
+ if (n_rows > 0)
+ ret_val |= IP_CONSUMED_ROW | IP_PRODUCED_ROW;
+
+ /***** Check if all needed rows are loaded *****/
+
+ if (n_loaded == 0) {
+ /* # rows loaded is rows_in_mcu, but the mod wrapped to zero */
+ g->loading_rows = FALSE; /* start compressing rows now */
+ }
+ }
+ }
+
+ /************************************************************/
+ /* Compress as many MCUs as will fit into the output buffer */
+ /************************************************************/
+
+ while (!g->loading_rows &&
+ dwOutputAvail-*pdwOutputUsed > MAX_MCU_SIZE) {
+ PRINT (_T("jpeg_encode_convert_row: Encoding MCU, mcus_sent=%d\n"),
+ g->mcus_sent, 0);
+
+ write_buf_open (g, pbOutputBuf + *pdwOutputUsed);
+ encode_MCU (g, g->mcus_sent);
+ n_bytes = write_buf_close (g);
+
+ g->dwOutNextPos += n_bytes;
+ *pdwOutputUsed += n_bytes;
+
+ g->mcus_sent += 1;
+ if (g->mcus_sent >= g->mcus_in_row) {
+ g->loading_rows = TRUE;
+ g->mcus_sent = 0;
+ }
+ }
+
+ PRINT (_T("jpeg_encode_convert_row: Returning %04x, out_used=%d\n"),
+ ret_val, *pdwOutputUsed);
+ return ret_val;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * jpgEncode_insertedData - client inserted into our output stream
+ *
+\*****************************************************************************/
+
+static WORD jpgEncode_insertedData (
+ IP_XFORM_HANDLE hXform,
+ DWORD dwNumBytes)
+{
+ fatalBreakPoint ();
+ return IP_FATAL_ERROR; /* must never be called (can't insert data) */
+}
+
+
+
+/*****************************************************************************\
+ *
+ * jpgEncode_newPage - Tells us to flush this page, and start a new page
+ *
+\*****************************************************************************/
+
+static WORD jpgEncode_newPage (
+ IP_XFORM_HANDLE hXform)
+{
+ PJENC_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+ /* todo: return fatal error if convert is called again? */
+ return IP_DONE; /* can't insert page-breaks, so ignore this call */
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * jpgEncode_closeXform - Destroys this instance
+ *
+\*****************************************************************************/
+
+static WORD jpgEncode_closeXform (IP_XFORM_HANDLE hXform)
+{
+ PJENC_INST g;
+ BYTE **row_pp, **after_pp, *p;
+
+ HANDLE_TO_PTR (hXform, g);
+ row_pp = &(g->in_rows_ap[0][0]);
+ after_pp = row_pp + (sizeof(g->in_rows_ap)/sizeof(BYTE*));
+
+ for ( ; row_pp<after_pp; row_pp++) {
+ p = *row_pp;
+ if (p != NULL) {
+ IP_MEM_FREE (p);
+ *row_pp = NULL;
+ }
+ }
+
+ g->dwValidChk = 0;
+ IP_MEM_FREE (g); /* free memory for the instance */
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * jpgEncodeTbl - Jump-table for encoder
+ *
+\*****************************************************************************/
+
+IP_XFORM_TBL jpgEncodeTbl = {
+ jpgEncode_openXform,
+ jpgEncode_setDefaultInputTraits,
+ jpgEncode_setXformSpec,
+ jpgEncode_getHeaderBufSize,
+ jpgEncode_getActualTraits,
+ jpgEncode_getActualBufSizes,
+ jpgEncode_convert,
+ jpgEncode_newPage,
+ jpgEncode_insertedData,
+ jpgEncode_closeXform
+};
+
+/* End of File */
diff --git a/ip/xjpg_fix.c b/ip/xjpg_fix.c
new file mode 100644
index 0000000..709fcac
--- /dev/null
+++ b/ip/xjpg_fix.c
@@ -0,0 +1,839 @@
+/* libhpojip -- HP OfficeJet image-processing library. */
+
+/* Copyright (C) 1995-2002 Hewlett-Packard Company
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ * MA 02111-1307, USA.
+ *
+ * In addition, as a special exception, Hewlett-Packard Company
+ * gives permission to link the code of this program with any
+ * version of the OpenSSL library which is distributed under a
+ * license identical to that listed in the included LICENSE.OpenSSL
+ * file, and distribute linked combinations including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * this file, you may extend this exception to your version of the
+ * file, but you are not obligated to do so. If you do not wish to
+ * do so, delete this exception statement from your version.
+ */
+
+/* Original author: David Paschal (based on Mark Overton's "skel" template
+ * and a few bits and pieces from xjpg_{enc,dec}.c). */
+
+/******************************************************************************\
+ *
+ * xjpg_fix.c - Fixes JPEG files to have a standard JFIF APP0 header and
+ * a correct row-count value in the SOF header.
+ *
+ ******************************************************************************
+ *
+ * Name of Global Jump-Table:
+ *
+ * jpgFixTbl
+ *
+ * Items in aXformInfo array passed into setXformSpec:
+ *
+ * None.
+ *
+ * Capabilities and Limitations:
+ *
+ * Looks at the header, and converts an OfficeJet APP1 short header to
+ * a standard JFIF APP0 header. Passes the resulting header and data
+ * through to the JPEG decoder in order to count the number of rows in
+ * the image. Discards the decompressed data and passes the original
+ * compressed data (possibly with modified header) to the output. At
+ * the end of the file, seeks back to the SOF header and rewrites the
+ * row count field.
+ *
+ * Able to handle JPEG files with JFIF APP0 or OfficeJet APP1 headers,
+ * but not color-fax APP1 headers or Denali-style compression (in
+ * these cases, you must do the full decode, any necessary color-space
+ * conversion, and encode).
+ *
+ * Default Input Traits, and Output Traits:
+ *
+ * trait default input output
+ * ------------------- ------------------- ------------------------
+ * iPixelsPerRow ignored based on header
+ * iBitsPerPixel ignored based on header
+ * iComponentsPerPixel ignored based on header
+ * lHorizDPI ignored based on header
+ * lVertDPI ignored based on header
+ * lNumRows ignored based on header
+ * iNumPages passed into output same as default input
+ * iPageNum passed into output same as default input
+ *
+ * Above, a "*" by an item indicates it must be valid (not negative).
+ *
+\******************************************************************************/
+
+#include "hpip.h"
+#include "ipdefs.h"
+#include "string.h" /* for memset and memcpy */
+#include <stdio.h>
+
+#define PRINTF(args...) fprintf(stderr,args)
+
+/* TODO: Move this to a separate .h file: */
+extern IP_XFORM_TBL jpgDecodeTbl;
+extern WORD jpgDecode_getRowCountInfo(IP_XFORM_HANDLE hXform,
+ int *pRcCountup,int *pRcTraits,int *pSofOffset);
+
+#if 0
+ #include "stdio.h"
+ #include <tchar.h>
+ #define PRINT(msg,arg1,arg2) \
+ _ftprintf(stderr, msg, (int)arg1, (int)arg2)
+#else
+ #define PRINT(msg,arg1,arg2)
+#endif
+
+#define CHECK_VALUE 0x4ba1dace
+
+#define FUNC_STATUS static
+
+#define BEND_GET_SHORT(s) (((s)[0]<<8)|((s)[1]))
+#define BEND_SET_SHORT(s,x) ((s)[0]=((x)>>8)&0xFF,(s)[1]=(x)&0xFF)
+
+typedef struct {
+ IP_XFORM_HANDLE pSlaveXform; /* JPEG-decoder slave transformer. */
+ PBYTE headerBuffer;
+ DWORD outNextPos;
+ DWORD lenHeader;
+ DWORD lenAddedHeader;
+ DWORD lenHeaderBuffer;
+ DWORD readyForSofRewrite;
+ DWORD dwValidChk; /* struct validity check value */
+} JFIX_INST, *PJFIX_INST;
+
+
+/* TODO: Move the tables to a separate common file. */
+
+/* Since the firmware does not supply tables in its header,
+ * the tables used in the firmware are supplied below. */
+
+/*____________________________________________________________________________
+ | |
+ | Zigzag of Normal Quantization Tables |
+ |____________________________________________________________________________|
+*/
+
+static const unsigned char orig_lum_quant[64] = {
+ 16, 11, 12, 14, 12, 10, 16, 14,
+ 13, 14, 18, 17, 16, 19, 24, 40,
+ 26, 24, 22, 22, 24, 49, 35, 37,
+ 29, 40, 58, 51, 61, 60, 57, 51,
+ 56, 55, 64, 72, 92, 78, 64, 68,
+ 87, 69, 55, 56, 80, 109, 81, 87,
+ 95, 98, 103, 104, 103, 62, 77, 113,
+ 121, 112, 100, 120, 92, 101, 103, 99
+};
+
+static const unsigned char orig_chrom_quant[64] = {
+ 17, 18, 18, 24, 21, 24, 47, 26,
+ 26, 47, 99, 66, 56, 66, 99, 99,
+ 99, 99, 99, 99, 99, 99, 99, 99,
+ 99, 99, 99, 99, 99, 99, 99, 99,
+ 99, 99, 99, 99, 99, 99, 99, 99,
+ 99, 99, 99, 99, 99, 99, 99, 99,
+ 99, 99, 99, 99, 99, 99, 99, 99,
+ 99, 99, 99, 99, 99, 99, 99, 99
+};
+
+/*____________________________________________________________________________
+ | |
+ | Huffman Tables |
+ |____________________________________________________________________________|
+*/
+
+static const unsigned char lum_DC_counts[16] = {
+ 0x00, 0x01, 0x05, 0x01, 0x01, 0x01, 0x01, 0x01,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
+static const unsigned char lum_DC_values[12] = {
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b
+};
+
+static const unsigned char chrom_DC_counts[16] = {
+ 0x00, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+ 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
+static const unsigned char chrom_DC_values[12] = {
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b
+};
+
+static const unsigned char lum_AC_counts[16] = {
+ 0x00, 0x02, 0x01, 0x03, 0x03, 0x02, 0x04, 0x03,
+ 0x05, 0x05, 0x04, 0x04, 0x00, 0x00, 0x01, 0x7d
+};
+
+static const unsigned char lum_AC_values[162] = {
+ 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12,
+ 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07,
+ 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08,
+ 0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0,
+ 0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16,
+ 0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28,
+ 0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
+ 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,
+ 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,
+ 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
+ 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,
+ 0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,
+ 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98,
+ 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
+ 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6,
+ 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5,
+ 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4,
+ 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2,
+ 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea,
+ 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
+ 0xf9, 0xfa
+};
+
+static const unsigned char chrom_AC_counts[16] = {
+ 0x00, 0x02, 0x01, 0x02, 0x04, 0x04, 0x03, 0x04,
+ 0x07, 0x05, 0x04, 0x04, 0x00, 0x01, 0x02, 0x77
+};
+
+static const unsigned char chrom_AC_values[162] = {
+ 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21,
+ 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71,
+ 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91,
+ 0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0,
+ 0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34,
+ 0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26,
+ 0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38,
+ 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48,
+ 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,
+ 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68,
+ 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
+ 0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
+ 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96,
+ 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5,
+ 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4,
+ 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3,
+ 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2,
+ 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda,
+ 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9,
+ 0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
+ 0xf9, 0xfa
+};
+
+/*____________________________________________________________________________
+ | | |
+ | scale_q_table | scales a q-table according to the q-factors |
+ |_______________|____________________________________________________________|
+*/
+/* TODO: Reference this from a common .h file. */
+void scale_q_table(int dc_q_factor,int ac_q_factor,int ident,
+ unsigned char *out) {
+ static const int Q_DEFAULT=20;
+ static const int FINAL_DC_INDEX=9;
+ int i,val;
+ int q=dc_q_factor;
+ const unsigned char *in=orig_lum_quant;
+ if (ident) in=orig_chrom_quant;
+
+ for (i=0; i<64; i++) {
+ val = ((*in++)*q + Q_DEFAULT/2) / Q_DEFAULT;
+ if (val < 1) val = 1;
+ if (val > 255) val = 255;
+ *out++ = (unsigned char)val;
+ if (i == FINAL_DC_INDEX) {
+ q = ac_q_factor;
+ }
+ }
+}
+
+
+/*****************************************************************************\
+ *
+ * jpgFix_openXform - Creates a new instance of the transformer
+ *
+ *****************************************************************************
+ *
+ * This returns a handle for the new instance to be passed into
+ * all subsequent calls.
+ *
+ * Return value: IP_DONE=success; IP_FATAL_ERROR=misc error.
+ *
+\*****************************************************************************/
+
+FUNC_STATUS WORD jpgFix_openXform (
+ IP_XFORM_HANDLE *pXform) /* out: returned handle */
+{
+ PJFIX_INST g;
+
+ INSURE (pXform != NULL);
+ IP_MEM_ALLOC (sizeof(JFIX_INST), g);
+ *pXform = g;
+ memset (g, 0, sizeof(JFIX_INST));
+ if (jpgDecodeTbl.openXform(&g->pSlaveXform)!=IP_DONE) {
+ IP_MEM_FREE(g);
+ goto fatal_error;
+ }
+ g->dwValidChk = CHECK_VALUE;
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * jpgFix_setDefaultInputTraits - Specifies default input image traits
+ *
+ *****************************************************************************
+ *
+ * The header of the file-type handled by the transform probably does
+ * not include *all* the image traits we'd like to know. Those not
+ * specified in the file-header are filled in from info provided by
+ * this routine.
+ *
+ * Return value: IP_DONE=success; IP_FATAL_ERROR=misc error.
+ *
+\*****************************************************************************/
+
+FUNC_STATUS WORD jpgFix_setDefaultInputTraits (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ PIP_IMAGE_TRAITS pTraits) /* in: default image traits */
+{
+ PJFIX_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ return jpgDecodeTbl.setDefaultInputTraits(g->pSlaveXform,pTraits);
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * jpgFix_setXformSpec - Provides xform-specific information
+ *
+\*****************************************************************************/
+
+FUNC_STATUS WORD jpgFix_setXformSpec (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD_OR_PVOID aXformInfo[]) /* in: xform information */
+{
+ PJFIX_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ /* Check your options in aXformInfo here, and save them.
+ * Use the INSURE macro like you'd use assert. INSURE jumps to
+ * fatal_error below if it fails.
+ */
+
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * jpgFix_getHeaderBufSize- Returns size of input buf needed to hold header
+ *
+\*****************************************************************************/
+
+FUNC_STATUS WORD jpgFix_getHeaderBufSize (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD *pdwInBufLen) /* out: buf size for parsing header */
+{
+ WORD r;
+ PJFIX_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ r=jpgDecodeTbl.getHeaderBufSize(g->pSlaveXform,pdwInBufLen);
+ if (r!=IP_DONE) return r;
+
+ g->lenHeaderBuffer=*pdwInBufLen;
+ IP_MEM_ALLOC(g->lenHeaderBuffer,g->headerBuffer);
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * jpgFix_getActualTraits - Parses header, and returns input & output traits
+ *
+\*****************************************************************************/
+
+
+//#define MYLOCATE(p) (void *)(p)=(g->headerBuffer+lenAddedHeader)
+#define MYLOCATE(p) (p)=(void *)(g->headerBuffer+lenAddedHeader)
+#define MYWRITE(p) lenAddedHeader+=sizeof(*(p))
+#define MYWRITEBUF(data,datalen) \
+ do { \
+ INSURE((datalen)<=g->lenHeaderBuffer-lenAddedHeader); \
+ memcpy(g->headerBuffer+lenAddedHeader,(char *)(data),(datalen)); \
+ lenAddedHeader+=(datalen); \
+ } while(0)
+
+FUNC_STATUS WORD jpgFix_getActualTraits (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD dwInputAvail, /* in: # avail bytes in input buf */
+ PBYTE pbInputBuf, /* in: ptr to input buffer */
+ PDWORD pdwInputUsed, /* out: # bytes used from input buf */
+ PDWORD pdwInputNextPos,/* out: file-pos to read from next */
+ PIP_IMAGE_TRAITS pInTraits, /* out: input image traits */
+ PIP_IMAGE_TRAITS pOutTraits) /* out: output image traits */
+{
+ struct shortHeader_s {
+ unsigned char soi[2]; /* 0xFF, 0xD8 */
+
+ unsigned char app1[2]; /* 0xFF, 0xE1 */
+ unsigned char app1Length[2]; /* 0x00, 0x12 */
+ unsigned char height[2];
+ unsigned char width[2];
+ unsigned char xres[2];
+ unsigned char yres[2];
+ unsigned char ac_q_factor;
+ unsigned char numComponents; /* 1=gray, 3=color */
+ unsigned char xSampleFactors[2];
+ unsigned char ySampleFactors[2];
+ unsigned char dc_q_factor;
+ unsigned char reserved; /* 0x00 */
+ } *pInputHeader=(struct shortHeader_s *)pbInputBuf;
+ struct outputSoiApp0_s {
+ unsigned char soi[2]; /* 0xFF, 0xD8 */
+
+ unsigned char app0[2]; /* 0xFF, 0xE0 */
+ unsigned char app0Length[2]; /* 0x00, 0x10 */
+ unsigned char jfif[5]; /* "JFIF\0" */
+ unsigned char majorVersion; /* 0x01 */
+ unsigned char minorVersion; /* 0x00 */
+ unsigned char units; /* 0x01 = DPI */
+ unsigned char xres[2];
+ unsigned char yres[2];
+ unsigned char xthumb; /* 0x00 */
+ unsigned char ythumb; /* 0x00 */
+ } *pOutputSoiApp0;
+ struct {
+ unsigned char sof0[2]; /* 0xFF, 0xC0 */
+ unsigned char sof0Length[2]; /* 0x00, 0x?? */
+ unsigned char eight; /* 0x08 */
+ unsigned char height[2];
+ unsigned char width[2];
+ unsigned char numComponents; /* 1=gray, 3=color */
+ } *pOutputSof0Part1;
+ struct {
+ unsigned char iComponent;
+ unsigned char xySampleFactors;
+ unsigned char isNotFirstComponent;
+ } *pOutputSofComponent;
+ struct {
+ unsigned char dqt[2]; /* 0xFF, 0xDB */
+ unsigned char dqtLength[2]; /* 0x00, 0x43 */
+ unsigned char ident; /* 0=lum., 1=chrom. */
+ unsigned char elements[64];
+ } *pOutputDqt;
+ struct {
+ unsigned char dht[2]; /* 0xFF, 0xC4 */
+ unsigned char dhtLength[2]; /* 0x00, 0x?? */
+ } *pOutputDhtPart1;
+ struct {
+ unsigned char hclass_ident;
+ unsigned char counts[16];
+ /* Variable-length huffval table follows. */
+ } *pOutputDhtPart2;
+ static const struct {
+ unsigned char hclass_ident;
+ const unsigned char *counts;
+ const unsigned char *huffval;
+ } dhtInfo[4]={
+ {0x00,lum_DC_counts,lum_DC_values},
+ {0x10,lum_AC_counts,lum_AC_values},
+ {0x01,chrom_DC_counts,chrom_DC_values},
+ {0x11,chrom_AC_counts,chrom_AC_values}
+ };
+ int dhtCountCounts[4];
+ struct {
+ unsigned char sos[2]; /* 0xFF, 0xDA */
+ unsigned char sosLength[2]; /* 0x00, 0x?? */
+ unsigned char numComponents; /* 1=gray, 3=color */
+ } *pOutputSosPart1;
+ struct {
+ unsigned char iComponent;
+ unsigned char x00x11; /* (i==0 ? 0x00 : 0x11) */
+ } *pOutputSosComponent;
+ struct {
+ unsigned char zero1; /* 0x00 */
+ unsigned char sixtythree; /* 0x3F */
+ unsigned char zero2; /* 0x00 */
+ } *pOutputSosPart2;
+
+ PJFIX_INST g;
+ DWORD lenRemovedHeader=0,lenAddedHeader=0;
+ int imax,i,j,x,y,r,len;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ /* Validate APP1 (OfficeJet short header) record.
+ * If we actually get a JFIF standard APP0 record, then
+ * skip parsing the header. */
+ if (dwInputAvail>=sizeof(*pInputHeader) &&
+ pInputHeader->soi[0]==0xFF && pInputHeader->soi[1]==0xD8 &&
+ pInputHeader->app1[0]==0xFF && pInputHeader->app1[1]==0xE1 &&
+ !pInputHeader->app1Length[0] && pInputHeader->app1Length[1]==0x12) {
+
+ /* Write standard JPEG/JFIF records... */
+ lenRemovedHeader=sizeof(*pInputHeader);
+
+ /* Start Of Image record. */
+ MYLOCATE(pOutputSoiApp0);
+ pOutputSoiApp0->soi[0]=0xFF;
+ pOutputSoiApp0->soi[1]=0xD8;
+ /* APP0 (JFIF header) record. */
+ pOutputSoiApp0->app0[0]=0xFF;
+ pOutputSoiApp0->app0[1]=0xE0;
+ pOutputSoiApp0->app0Length[0]=0x00;
+ pOutputSoiApp0->app0Length[1]=sizeof(*pOutputSoiApp0)-4;
+ strcpy((char *)pOutputSoiApp0->jfif,"JFIF");
+ pOutputSoiApp0->majorVersion=0x01;
+ pOutputSoiApp0->minorVersion=0x00;
+ pOutputSoiApp0->units=0x01;
+ pOutputSoiApp0->xres[0]=pInputHeader->xres[0];
+ pOutputSoiApp0->xres[1]=pInputHeader->xres[1];
+ pOutputSoiApp0->yres[0]=pInputHeader->yres[0];
+ pOutputSoiApp0->yres[1]=pInputHeader->yres[1];
+ pOutputSoiApp0->xthumb=0;
+ pOutputSoiApp0->ythumb=0;
+ MYWRITE(pOutputSoiApp0);
+
+ /* Start Of Frame record. */
+ MYLOCATE(pOutputSof0Part1);
+ pOutputSof0Part1->sof0[0]=0xFF;
+ pOutputSof0Part1->sof0[1]=0xC0;
+ pOutputSof0Part1->sof0Length[0]=0x00;
+ pOutputSof0Part1->sof0Length[1]=sizeof(*pOutputSof0Part1)-2+
+ pInputHeader->numComponents*sizeof(*pOutputSofComponent);
+ pOutputSof0Part1->eight=0x08;
+ pOutputSof0Part1->height[0]=pInputHeader->height[0];
+ pOutputSof0Part1->height[1]=pInputHeader->height[1];
+ pOutputSof0Part1->width[0]=pInputHeader->width[0];
+ pOutputSof0Part1->width[1]=pInputHeader->width[1];
+ pOutputSof0Part1->numComponents=pInputHeader->numComponents;
+ MYWRITE(pOutputSof0Part1);
+ x=BEND_GET_SHORT(pInputHeader->xSampleFactors);
+ y=BEND_GET_SHORT(pInputHeader->ySampleFactors);
+ for (i=0;i<pInputHeader->numComponents;i++) {
+ MYLOCATE(pOutputSofComponent);
+ pOutputSofComponent->iComponent=i;
+ pOutputSofComponent->xySampleFactors=
+ (((x>>(4*(3-i)))&0x0F)<<4) | ((y>>(4*(3-i)))&0x0F);
+ pOutputSofComponent->isNotFirstComponent=(!i?0:1);
+ MYWRITE(pOutputSofComponent);
+ }
+
+ /* Define Quantization Table record. */
+ imax=pInputHeader->numComponents>1?1:0;
+ for (i=0;i<=imax;i++) {
+ MYLOCATE(pOutputDqt);
+ pOutputDqt->dqt[0]=0xFF;
+ pOutputDqt->dqt[1]=0xDB;
+ pOutputDqt->dqtLength[0]=0x00;
+ pOutputDqt->dqtLength[1]=sizeof(*pOutputDqt)-2;
+ pOutputDqt->ident=i; /* Upper nibble=0 for 8-bit table. */
+ scale_q_table(pInputHeader->dc_q_factor,pInputHeader->ac_q_factor,
+ i,pOutputDqt->elements);
+ MYWRITE(pOutputDqt);
+ }
+ imax=pInputHeader->numComponents>1?4:2;
+ x=sizeof(*pOutputDhtPart1)-2;
+ for (i=0;i<imax;i++) {
+ dhtCountCounts[i]=0;
+ x+=sizeof(*pOutputDhtPart2);
+ for (j=0;j<16;j++) {
+ y=dhtInfo[i].counts[j];
+ dhtCountCounts[i]+=y;
+ x+=y;
+ }
+ }
+ MYLOCATE(pOutputDhtPart1);
+ pOutputDhtPart1->dht[0]=0xFF;
+ pOutputDhtPart1->dht[1]=0xC4;
+ BEND_SET_SHORT(pOutputDhtPart1->dhtLength,x);
+ MYWRITE(pOutputDhtPart1);
+ for (i=0;i<imax;i++) {
+ MYLOCATE(pOutputDhtPart2);
+ pOutputDhtPart2->hclass_ident=dhtInfo[i].hclass_ident;
+ memcpy(pOutputDhtPart2->counts,dhtInfo[i].counts,16);
+ MYWRITE(pOutputDhtPart2);
+ MYWRITEBUF(dhtInfo[i].huffval,dhtCountCounts[i]);
+ }
+
+ /* Start Of Scan record. */
+ MYLOCATE(pOutputSosPart1);
+ imax=pInputHeader->numComponents;
+ pOutputSosPart1->sos[0]=0xFF;
+ pOutputSosPart1->sos[1]=0xDA;
+ pOutputSosPart1->sosLength[0]=0;
+ pOutputSosPart1->sosLength[1]=sizeof(*pOutputSosPart1)-2+
+ imax*sizeof(*pOutputSosComponent)+sizeof(*pOutputSosPart2);
+ pOutputSosPart1->numComponents=imax;
+ MYWRITE(pOutputSosPart1);
+ for (i=0;i<imax;i++) {
+ MYLOCATE(pOutputSosComponent);
+ pOutputSosComponent->iComponent=i;
+ pOutputSosComponent->x00x11=(!i?0x00:0x11);
+ MYWRITE(pOutputSosComponent);
+ }
+ MYLOCATE(pOutputSosPart2);
+ pOutputSosPart2->zero1=0;
+ pOutputSosPart2->sixtythree=63;
+ pOutputSosPart2->zero2=0;
+ MYWRITE(pOutputSosPart2);
+ }
+
+ /* Save a copy of the (possibly rewritten) header (plus any residual
+ * data) so we can emit it later. */
+ len=dwInputAvail-(lenAddedHeader-lenRemovedHeader);
+ if (len>g->lenHeaderBuffer-lenAddedHeader) {
+ len=g->lenHeaderBuffer-lenAddedHeader;
+ }
+ memcpy(g->headerBuffer+lenAddedHeader,pbInputBuf+lenRemovedHeader,len);
+
+ /* Pass the (possibly rewritten) header to the slave transformer. */
+ r=jpgDecodeTbl.getActualTraits(g->pSlaveXform,
+ len+lenAddedHeader,g->headerBuffer,
+ pdwInputUsed,pdwInputNextPos,
+ pInTraits,pOutTraits);
+ if ((r&(IP_DONE|IP_READY_FOR_DATA))!=(IP_DONE|IP_READY_FOR_DATA)) {
+ return (r|IP_FATAL_ERROR);
+ }
+
+ g->lenHeader=*pdwInputUsed;
+ g->lenAddedHeader=lenAddedHeader-lenRemovedHeader;
+ *pdwInputUsed-=g->lenAddedHeader;
+ *pdwInputNextPos-=g->lenAddedHeader;
+
+ return r;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/****************************************************************************\
+ *
+ * jpgFix_getActualBufSizes - Returns buf sizes needed for remainder of job
+ *
+\****************************************************************************/
+
+FUNC_STATUS WORD jpgFix_getActualBufSizes (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ PDWORD pdwMinInBufLen, /* out: min input buf size */
+ PDWORD pdwMinOutBufLen) /* out: min output buf size */
+{
+ WORD r;
+ PJFIX_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ r=jpgDecodeTbl.getActualBufSizes(g->pSlaveXform,
+ pdwMinInBufLen,pdwMinOutBufLen);
+ if (r==IP_DONE) {
+ INSURE(*pdwMinOutBufLen<=g->lenHeaderBuffer);
+ }
+ *pdwMinOutBufLen=g->lenHeaderBuffer;
+ return r;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * jpgFix_convert - Converts one row
+ *
+\*****************************************************************************/
+
+FUNC_STATUS WORD jpgFix_convert (
+ IP_XFORM_HANDLE hXform,
+ DWORD dwInputAvail, /* in: # avail bytes in in-buf */
+ PBYTE pbInputBuf, /* in: ptr to in-buffer */
+ PDWORD pdwInputUsed, /* out: # bytes used from in-buf */
+ PDWORD pdwInputNextPos, /* out: file-pos to read from next */
+ DWORD dwOutputAvail, /* in: # avail bytes in out-buf */
+ PBYTE pbOutputBuf, /* in: ptr to out-buffer */
+ PDWORD pdwOutputUsed, /* out: # bytes written in out-buf */
+ PDWORD pdwOutputThisPos) /* out: file-pos to write the data */
+{
+ PJFIX_INST g;
+ WORD r=0;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ if (g->outNextPos<g->lenHeader) {
+ DWORD len=g->lenHeader-g->outNextPos;
+ if (len>dwOutputAvail) len=dwOutputAvail;
+ if (len) {
+ memcpy(pbOutputBuf,g->headerBuffer+g->outNextPos,len);
+ }
+ *pdwInputUsed=0;
+ *pdwInputNextPos=g->lenHeader-g->lenAddedHeader;
+ *pdwOutputUsed=len;
+ *pdwOutputThisPos=g->outNextPos;
+ g->outNextPos+=len;
+ r|=IP_READY_FOR_DATA;
+
+ } else if (!g->readyForSofRewrite) {
+ DWORD dwOutputUsed,dwOutputThisPos;
+ r=jpgDecodeTbl.convert(g->pSlaveXform,
+ dwInputAvail,pbInputBuf,pdwInputUsed,pdwInputNextPos,
+ g->lenHeaderBuffer,g->headerBuffer,
+ &dwOutputUsed,&dwOutputThisPos);
+ *pdwInputNextPos-=g->lenAddedHeader;
+ if (r&IP_DONE) {
+ g->readyForSofRewrite=1;
+ if (!*pdwInputUsed) goto rewriteSof;
+ }
+ if (*pdwInputUsed) {
+ INSURE(*pdwInputUsed<=dwOutputAvail);
+ memcpy(pbOutputBuf,pbInputBuf,*pdwInputUsed);
+ }
+ *pdwOutputUsed=*pdwInputUsed;
+ *pdwOutputThisPos=g->outNextPos;
+ g->outNextPos+=*pdwInputUsed;
+
+ } else {
+rewriteSof:
+ r|=IP_DONE;
+ *pdwInputUsed=0;
+ *pdwInputNextPos=g->outNextPos-g->lenAddedHeader;
+ *pdwOutputUsed=0;
+ *pdwOutputThisPos=g->outNextPos;
+ if (g->readyForSofRewrite>0) {
+ int rcCountup,rcTraits,sofOffset;
+ r=jpgDecode_getRowCountInfo(g->pSlaveXform,
+ &rcCountup,&rcTraits,&sofOffset);
+ BEND_SET_SHORT(pbOutputBuf,rcCountup);
+ *pdwOutputUsed=2;
+ *pdwOutputThisPos=sofOffset;
+ g->readyForSofRewrite=-1;
+ }
+ }
+
+ return r;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * jpgFix_insertedData - client inserted into our output stream
+ *
+\*****************************************************************************/
+
+FUNC_STATUS WORD jpgFix_insertedData (
+ IP_XFORM_HANDLE hXform,
+ DWORD dwNumBytes)
+{
+ fatalBreakPoint ();
+ return IP_FATAL_ERROR; /* must never be called (can't insert data) */
+}
+
+
+
+/*****************************************************************************\
+ *
+ * jpgFix_newPage - Tells us to flush this page, and start a new page
+ *
+\*****************************************************************************/
+
+FUNC_STATUS WORD jpgFix_newPage (
+ IP_XFORM_HANDLE hXform)
+{
+ PJFIX_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+ /* todo: return fatal error if convert is called again? */
+ return IP_DONE; /* can't insert page-breaks, so ignore this call */
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+
+}
+
+
+
+/*****************************************************************************\
+ *
+ * jpgFix_closeXform - Destroys this instance
+ *
+\*****************************************************************************/
+
+FUNC_STATUS WORD jpgFix_closeXform (IP_XFORM_HANDLE hXform)
+{
+ PJFIX_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ if (g->pSlaveXform) jpgDecodeTbl.closeXform(g->pSlaveXform);
+ if (g->headerBuffer) IP_MEM_FREE(g->headerBuffer);
+ g->dwValidChk = 0;
+ IP_MEM_FREE (g); /* free memory for the instance */
+
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * jpgFixTbl - Jump-table for transform driver
+ *
+\*****************************************************************************/
+IP_XFORM_TBL jpgFixTbl = {
+ jpgFix_openXform,
+ jpgFix_setDefaultInputTraits,
+ jpgFix_setXformSpec,
+ jpgFix_getHeaderBufSize,
+ jpgFix_getActualTraits,
+ jpgFix_getActualBufSizes,
+ jpgFix_convert,
+ jpgFix_newPage,
+ jpgFix_insertedData,
+ jpgFix_closeXform
+};
+
+/* End of File */
diff --git a/ip/xjpg_huf.c b/ip/xjpg_huf.c
new file mode 100644
index 0000000..9373577
--- /dev/null
+++ b/ip/xjpg_huf.c
@@ -0,0 +1,558 @@
+/* libhpojip -- HP OfficeJet image-processing library. */
+
+/* Copyright (C) 1995-2002 Hewlett-Packard Company
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ * MA 02111-1307, USA.
+ *
+ * In addition, as a special exception, Hewlett-Packard Company
+ * gives permission to link the code of this program with any
+ * version of the OpenSSL library which is distributed under a
+ * license identical to that listed in the included LICENSE.OpenSSL
+ * file, and distribute linked combinations including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * this file, you may extend this exception to your version of the
+ * file, but you are not obligated to do so. If you do not wish to
+ * do so, delete this exception statement from your version.
+ */
+
+/* Original author: Mark Overton and others.
+ *
+ * Ported to Linux by David Paschal.
+ */
+
+/*____________________________________________________________________________
+ | | |
+ | xjpg_huf.c | Huffman tables for JPEG encoder and decoder |
+ |____________|_______________________________________________________________|
+ | |
+ | Mark Overton, April 1996 |
+ |____________________________________________________________________________|
+*/
+
+#include "xjpg_huf.h"
+
+
+/*____________________________________________________________________________
+ | |
+ | Histograms and values for Building Huffman Tables |
+ |____________________________________________________________________________|
+*/
+
+const BYTE LuminanceDCCounts[16] = {
+ 0x00, 0x01, 0x05, 0x01, 0x01, 0x01, 0x01, 0x01,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
+const BYTE LuminanceDCValues[12] = {
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b
+};
+
+#ifdef COLOR_JPEG
+const BYTE ChrominanceDCCounts[16] = {
+ 0x00, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+ 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
+const BYTE ChrominanceDCValues[12] = {
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b
+};
+#endif
+
+const BYTE LuminanceACCounts[16] = {
+ 0x00, 0x02, 0x01, 0x03, 0x03, 0x02, 0x04, 0x03,
+ 0x05, 0x05, 0x04, 0x04, 0x00, 0x00, /* 0x01, 0x7d */ 0x00, 0x7e
+ /* The alteration above yields Huffman codes as follows:
+ * - common codes are 12 bits wide or less,
+ * - uncommon codes are exactly 16 bits wide, and all those codes
+ * start with nine '1' bits, leaving seven bits of useful info. */
+};
+
+const BYTE LuminanceACValues[162] = {
+ 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12,
+ 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07,
+ 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08,
+ 0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0,
+ 0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16,
+ 0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28,
+ 0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
+ 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,
+ 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,
+ 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
+ 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,
+ 0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,
+ 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98,
+ 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
+ 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6,
+ 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5,
+ 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4,
+ 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2,
+ 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea,
+ 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
+ 0xf9, 0xfa
+};
+
+#ifdef COLOR_JPEG
+const BYTE ChrominanceACCounts[16] = {
+ 0x00, 0x02, 0x01, 0x02, 0x04, 0x04, 0x03, 0x04,
+ 0x07, 0x05, 0x04, 0x04, 0x00, 0x01, 0x02, 0x77
+};
+
+const BYTE ChrominanceACValues[162] = {
+ 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21,
+ 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71,
+ 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91,
+ 0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0,
+ 0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34,
+ 0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26,
+ 0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38,
+ 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48,
+ 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,
+ 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68,
+ 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
+ 0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
+ 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96,
+ 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5,
+ 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4,
+ 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3,
+ 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2,
+ 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda,
+ 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9,
+ 0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
+ 0xf9, 0xfa
+};
+#endif
+
+
+
+/*____________________________________________________________________________
+ | |
+ | Tables output by mk_jpg_huff program |
+ |____________________________________________________________________________|
+*/
+
+
+const enc_huff_elem_t enc_DC_table[] = {
+ { 0x0000, 2 }, { 0x0002, 3 }, { 0x0003, 3 }, { 0x0004, 3 },
+ { 0x0005, 3 }, { 0x0006, 3 }, { 0x000e, 4 }, { 0x001e, 5 },
+ { 0x003e, 6 }, { 0x007e, 7 }, { 0x00fe, 8 }, { 0x01fe, 9 },
+ { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 },
+ { 0x0000, 0 },
+};
+
+
+const dec_huff_elem_t dec_DC_table[] = { {0,0},
+ { 2, 0x00 }, { 3, 0x01 }, { 3, 0x02 }, { 3, 0x03 },
+ { 3, 0x04 }, { 3, 0x05 }, { 4, 0x06 }, { 5, 0x07 },
+ { 6, 0x08 }, { 7, 0x09 }, { 8, 0x0a }, { 9, 0x0b },
+};
+
+const BYTE dec_DC_table_index[] = {
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 12, 0,
+};
+
+
+const enc_huff_elem_t enc_AC_table[] = {
+ { 0x000a, 4 }, { 0x0000, 2 }, { 0x0001, 2 }, { 0x0004, 3 },
+ { 0x000b, 4 }, { 0x001a, 5 }, { 0x0078, 7 }, { 0x00f8, 8 },
+ { 0x03f6, 10 }, { 0xff81, 16 }, { 0xff82, 16 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x000c, 4 }, { 0x001b, 5 }, { 0x0079, 7 },
+ { 0x01f6, 9 }, { 0x07f6, 11 }, { 0xff83, 16 }, { 0xff84, 16 },
+ { 0xff85, 16 }, { 0xff86, 16 }, { 0xff87, 16 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x001c, 5 }, { 0x00f9, 8 }, { 0x03f7, 10 },
+ { 0x0ff4, 12 }, { 0xff88, 16 }, { 0xff89, 16 }, { 0xff8a, 16 },
+ { 0xff8b, 16 }, { 0xff8c, 16 }, { 0xff8d, 16 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x003a, 6 }, { 0x01f7, 9 }, { 0x0ff5, 12 },
+ { 0xff8e, 16 }, { 0xff8f, 16 }, { 0xff90, 16 }, { 0xff91, 16 },
+ { 0xff92, 16 }, { 0xff93, 16 }, { 0xff94, 16 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x003b, 6 }, { 0x03f8, 10 }, { 0xff95, 16 },
+ { 0xff96, 16 }, { 0xff97, 16 }, { 0xff98, 16 }, { 0xff99, 16 },
+ { 0xff9a, 16 }, { 0xff9b, 16 }, { 0xff9c, 16 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x007a, 7 }, { 0x07f7, 11 }, { 0xff9d, 16 },
+ { 0xff9e, 16 }, { 0xff9f, 16 }, { 0xffa0, 16 }, { 0xffa1, 16 },
+ { 0xffa2, 16 }, { 0xffa3, 16 }, { 0xffa4, 16 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x007b, 7 }, { 0x0ff6, 12 }, { 0xffa5, 16 },
+ { 0xffa6, 16 }, { 0xffa7, 16 }, { 0xffa8, 16 }, { 0xffa9, 16 },
+ { 0xffaa, 16 }, { 0xffab, 16 }, { 0xffac, 16 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x00fa, 8 }, { 0x0ff7, 12 }, { 0xffad, 16 },
+ { 0xffae, 16 }, { 0xffaf, 16 }, { 0xffb0, 16 }, { 0xffb1, 16 },
+ { 0xffb2, 16 }, { 0xffb3, 16 }, { 0xffb4, 16 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x01f8, 9 }, { 0xff80, 16 }, { 0xffb5, 16 },
+ { 0xffb6, 16 }, { 0xffb7, 16 }, { 0xffb8, 16 }, { 0xffb9, 16 },
+ { 0xffba, 16 }, { 0xffbb, 16 }, { 0xffbc, 16 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x01f9, 9 }, { 0xffbd, 16 }, { 0xffbe, 16 },
+ { 0xffbf, 16 }, { 0xffc0, 16 }, { 0xffc1, 16 }, { 0xffc2, 16 },
+ { 0xffc3, 16 }, { 0xffc4, 16 }, { 0xffc5, 16 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x01fa, 9 }, { 0xffc6, 16 }, { 0xffc7, 16 },
+ { 0xffc8, 16 }, { 0xffc9, 16 }, { 0xffca, 16 }, { 0xffcb, 16 },
+ { 0xffcc, 16 }, { 0xffcd, 16 }, { 0xffce, 16 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x03f9, 10 }, { 0xffcf, 16 }, { 0xffd0, 16 },
+ { 0xffd1, 16 }, { 0xffd2, 16 }, { 0xffd3, 16 }, { 0xffd4, 16 },
+ { 0xffd5, 16 }, { 0xffd6, 16 }, { 0xffd7, 16 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x03fa, 10 }, { 0xffd8, 16 }, { 0xffd9, 16 },
+ { 0xffda, 16 }, { 0xffdb, 16 }, { 0xffdc, 16 }, { 0xffdd, 16 },
+ { 0xffde, 16 }, { 0xffdf, 16 }, { 0xffe0, 16 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x07f8, 11 }, { 0xffe1, 16 }, { 0xffe2, 16 },
+ { 0xffe3, 16 }, { 0xffe4, 16 }, { 0xffe5, 16 }, { 0xffe6, 16 },
+ { 0xffe7, 16 }, { 0xffe8, 16 }, { 0xffe9, 16 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0xffea, 16 }, { 0xffeb, 16 }, { 0xffec, 16 },
+ { 0xffed, 16 }, { 0xffee, 16 }, { 0xffef, 16 }, { 0xfff0, 16 },
+ { 0xfff1, 16 }, { 0xfff2, 16 }, { 0xfff3, 16 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 },
+ { 0x07f9, 11 }, { 0xfff4, 16 }, { 0xfff5, 16 }, { 0xfff6, 16 },
+ { 0xfff7, 16 }, { 0xfff8, 16 }, { 0xfff9, 16 }, { 0xfffa, 16 },
+ { 0xfffb, 16 }, { 0xfffc, 16 }, { 0xfffd, 16 }, { 0x0000, 0 },
+ { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 }, { 0x0000, 0 },
+};
+
+
+const dec_huff_elem_t dec_AC_main_table[] = { {0,0},
+ { 2, 0x01 }, { 2, 0x02 }, { 3, 0x03 }, { 4, 0x00 },
+ { 4, 0x04 }, { 4, 0x11 }, { 5, 0x05 }, { 5, 0x12 },
+ { 5, 0x21 }, { 6, 0x31 }, { 6, 0x41 }, { 7, 0x06 },
+ { 7, 0x13 }, { 7, 0x51 }, { 7, 0x61 }, { 8, 0x07 },
+ { 8, 0x22 }, { 8, 0x71 }, { 9, 0x14 }, { 9, 0x32 },
+ { 9, 0x81 }, { 9, 0x91 }, { 9, 0xa1 }, { 10, 0x08 },
+ { 10, 0x23 }, { 10, 0x42 }, { 10, 0xb1 }, { 10, 0xc1 },
+ { 11, 0x15 }, { 11, 0x52 }, { 11, 0xd1 }, { 11, 0xf0 },
+ { 12, 0x24 }, { 12, 0x33 }, { 12, 0x62 }, { 12, 0x72 },
+};
+
+const BYTE dec_AC_main_table_index[] = {
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+ 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20,
+ 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22,
+ 23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 25, 25, 25, 25,
+ 26, 26, 26, 26, 27, 27, 27, 27, 28, 28, 28, 28, 29, 29, 30, 30,
+ 31, 31, 32, 32, 33, 34, 35, 36, 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+
+const BYTE dec_AC_aux_table[] = {
+ 0x82, 0x09, 0x0a, 0x16, 0x17, 0x18, 0x19, 0x1a,
+ 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x34, 0x35,
+ 0x36, 0x37, 0x38, 0x39, 0x3a, 0x43, 0x44, 0x45,
+ 0x46, 0x47, 0x48, 0x49, 0x4a, 0x53, 0x54, 0x55,
+ 0x56, 0x57, 0x58, 0x59, 0x5a, 0x63, 0x64, 0x65,
+ 0x66, 0x67, 0x68, 0x69, 0x6a, 0x73, 0x74, 0x75,
+ 0x76, 0x77, 0x78, 0x79, 0x7a, 0x83, 0x84, 0x85,
+ 0x86, 0x87, 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94,
+ 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3,
+ 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2,
+ 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba,
+ 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9,
+ 0xca, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8,
+ 0xd9, 0xda, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6,
+ 0xe7, 0xe8, 0xe9, 0xea, 0xf1, 0xf2, 0xf3, 0xf4,
+ 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0x00, 0x00,
+};
+
+/* End of File */
diff --git a/ip/xjpg_huf.h b/ip/xjpg_huf.h
new file mode 100644
index 0000000..1dd4be3
--- /dev/null
+++ b/ip/xjpg_huf.h
@@ -0,0 +1,83 @@
+/* libhpojip -- HP OfficeJet image-processing library. */
+
+/* Copyright (C) 1995-2002 Hewlett-Packard Company
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ * MA 02111-1307, USA.
+ *
+ * In addition, as a special exception, Hewlett-Packard Company
+ * gives permission to link the code of this program with any
+ * version of the OpenSSL library which is distributed under a
+ * license identical to that listed in the included LICENSE.OpenSSL
+ * file, and distribute linked combinations including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * this file, you may extend this exception to your version of the
+ * file, but you are not obligated to do so. If you do not wish to
+ * do so, delete this exception statement from your version.
+ */
+
+/* Original author: Mark Overton and others.
+ *
+ * Ported to Linux by David Paschal.
+ */
+
+/*____________________________________________________________________________
+ | | |
+ | xjpg_huf.h | Huffman tables for JPEG encoder and decoder |
+ |____________|_______________________________________________________________|
+ | |
+ | Mark Overton, April 1996 |
+ |____________________________________________________________________________|
+*/
+
+#include "hpip.h"
+
+typedef struct {
+ WORD code;
+ BYTE size;
+} enc_huff_elem_t;
+
+typedef struct {
+ BYTE size;
+ BYTE value;
+} dec_huff_elem_t;
+
+
+/* Tables used by encoder */
+extern const enc_huff_elem_t enc_DC_table[17];
+extern const enc_huff_elem_t enc_AC_table[256];
+
+/* Tables used by decoder */
+extern const dec_huff_elem_t dec_DC_table[13];
+extern const BYTE dec_DC_table_index[512];
+extern const dec_huff_elem_t dec_AC_main_table[37];
+extern const BYTE dec_AC_main_table_index[4096];
+extern const BYTE dec_AC_aux_table[128];
+
+/* Tables from which Huffman tables are computed */
+extern const BYTE LuminanceDCCounts[16];
+extern const BYTE LuminanceDCValues[12];
+extern const BYTE LuminanceACCounts[16];
+extern const BYTE LuminanceACValues[162];
+
+#if 0
+extern const BYTE ChrominanceDCCounts[16];
+extern const BYTE ChrominanceDCValues[12];
+extern const BYTE ChrominanceACCounts[16];
+extern const BYTE ChrominanceACValues[162];
+#endif
+
+/* End of File */
diff --git a/ip/xjpg_mrk.h b/ip/xjpg_mrk.h
new file mode 100644
index 0000000..29aecc9
--- /dev/null
+++ b/ip/xjpg_mrk.h
@@ -0,0 +1,91 @@
+/* libhpojip -- HP OfficeJet image-processing library. */
+
+/* Copyright (C) 1995-2002 Hewlett-Packard Company
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ * MA 02111-1307, USA.
+ *
+ * In addition, as a special exception, Hewlett-Packard Company
+ * gives permission to link the code of this program with any
+ * version of the OpenSSL library which is distributed under a
+ * license identical to that listed in the included LICENSE.OpenSSL
+ * file, and distribute linked combinations including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * this file, you may extend this exception to your version of the
+ * file, but you are not obligated to do so. If you do not wish to
+ * do so, delete this exception statement from your version.
+ */
+
+/* Original author: Mark Overton and others.
+ *
+ * Ported to Linux by David Paschal.
+ */
+
+/*____________________________________________________________________________
+ | | |
+ | xjpg_mrk.h | Markers used in JPEG images |
+ |____________|_______________________________________________________________|
+ | |
+ | Mark Overton, Feb 1996 |
+ |____________________________________________________________________________|
+*/
+
+#define MARKER_NONE 0x00
+#define MARKER_END_FILE 0x100
+
+#define MARKER_SOF0 0xc0
+#define MARKER_SOF1 0xc1
+#define MARKER_SOF2 0xc2
+#define MARKER_SOF3 0xc3
+#define MARKER_SOF5 0xc5
+#define MARKER_SOF6 0xc6
+#define MARKER_SOF7 0xc7
+#define MARKER_SOF8 0xc8
+#define MARKER_SOF9 0xc9
+#define MARKER_SOFA 0xca
+#define MARKER_SOFB 0xcb
+#define MARKER_SOFD 0xcd
+#define MARKER_SOFE 0xce
+#define MARKER_SOFF 0xcf
+
+#define MARKER_DHT 0xc4
+#define MARKER_DAC 0xcc
+
+#define MARKER_RST0 0xd0
+#define MARKER_RST1 0xd1
+#define MARKER_RST2 0xd2
+#define MARKER_RST3 0xd3
+#define MARKER_RST4 0xd4
+#define MARKER_RST5 0xd5
+#define MARKER_RST6 0xd6
+#define MARKER_RST7 0xd7
+
+#define MARKER_SOI 0xd8
+#define MARKER_EOI 0xd9
+#define MARKER_SOS 0xda
+#define MARKER_DQT 0xdb
+#define MARKER_DNL 0xdc
+#define MARKER_DRI 0xdd
+#define MARKER_DHP 0xde
+#define MARKER_EXP 0xdf
+
+#define MARKER_APP 0xe0 /* from 0xe0 - 0xef */
+#define MARKER_JPG 0xf0 /* from 0xf0 - 0xfd */
+#define MARKER_COM 0xfe
+
+#define MARKER_SHORT_HEADER (MARKER_APP+1)
+
+/* End of File */
diff --git a/ip/xmatrix.c b/ip/xmatrix.c
new file mode 100644
index 0000000..759f5b0
--- /dev/null
+++ b/ip/xmatrix.c
@@ -0,0 +1,547 @@
+/* libhpojip -- HP OfficeJet image-processing library. */
+
+/* Copyright (C) 1995-2002 Hewlett-Packard Company
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ * MA 02111-1307, USA.
+ *
+ * In addition, as a special exception, Hewlett-Packard Company
+ * gives permission to link the code of this program with any
+ * version of the OpenSSL library which is distributed under a
+ * license identical to that listed in the included LICENSE.OpenSSL
+ * file, and distribute linked combinations including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * this file, you may extend this exception to your version of the
+ * file, but you are not obligated to do so. If you do not wish to
+ * do so, delete this exception statement from your version.
+ */
+
+/* Original author: Mark Overton and others.
+ *
+ * Ported to Linux by David Paschal.
+ */
+
+/******************************************************************************\
+ *
+ * xmatrix.c - runs color data thru a 3x3 matrix (24 or 48 bits/pixel)
+ *
+ * Mark Overton, June 2000
+ *
+ ******************************************************************************
+ *
+ * Name of Global Jump-Table:
+ *
+ * matrixTbl
+ *
+ * Items in aXformInfo array passed into setXformSpec:
+ *
+ * aXformInfo[0] = pointer to the matrix, which is an array of nine
+ * signed integers (type int) in 8.24 fixed-point. If we pretend that
+ * the array is named 'm', then pixels are computed as follows:
+ *
+ * r_out = m[0]*r_in + m[1]*g_in + m[2]*b_in
+ * g_out = m[3]*r_in + m[4]*g_in + m[5]*b_in
+ * b_out = m[6]*r_in + m[7]*g_in + m[8]*b_in
+ *
+ * Capabilities and Limitations:
+ *
+ * Passes pixels through a 3x3 matrix. 24 or 48 bits/pixel only.
+ *
+ * Default Input Traits, and Output Traits:
+ *
+ * trait default input output
+ * ------------------- --------------------- ------------------------
+ * iPixelsPerRow * passed into output same as default input
+ * iBitsPerPixel * must be 24 or 48 same as default input
+ * iComponentsPerPixel * must be 3 same as default input
+ * lHorizDPI passed into output same as default input
+ * lVertDPI passed into output same as default input
+ * lNumRows passed into output same as default input
+ * iNumPages passed into output same as default input
+ * iPageNum passed into output same as default input
+ *
+ * Above, a "*" by an item indicates it must be valid (not negative).
+ *
+\******************************************************************************/
+
+/* Use the #define below if this transform will exist in a dll outside of the
+ * image pipeline. This will allow the functions to be exported.
+ * #define EXPORT_TRANFORM 1
+ */
+
+#include "hpip.h"
+#include "ipdefs.h"
+#include "string.h" /* for memset and memcpy */
+
+
+#if 0
+ #include "stdio.h"
+ #include <tchar.h>
+ #define PRINT(msg,arg1,arg2) \
+ _ftprintf(stderr, msg, (int)arg1, (int)arg2)
+#else
+ #define PRINT(msg,arg1,arg2)
+#endif
+
+#define CHECK_VALUE 0x4ba1dace
+
+#ifdef EXPORT_TRANSFORM
+#define FUNC_STATUS __declspec (dllexport)
+#else
+#define FUNC_STATUS static
+#endif
+
+
+typedef struct {
+ IP_IMAGE_TRAITS traits; /* traits of the input and output image */
+ DWORD dwBytesPerRow; /* # of bytes in each row */
+ DWORD dwRowsDone; /* number of rows processed so far */
+ DWORD dwInNextPos; /* file pos for subsequent input */
+ DWORD dwOutNextPos; /* file pos for subsequent output */
+ int mat[9]; /* the matrix */
+ DWORD dwValidChk; /* struct validity check value */
+} MAT_INST, *PMAT_INST;
+
+
+
+/*****************************************************************************\
+ *
+ * mat_openXform - Creates a new instance of the transformer
+ *
+ *****************************************************************************
+ *
+ * This returns a handle for the new instance to be passed into
+ * all subsequent calls.
+ *
+ * Return value: IP_DONE=success; IP_FATAL_ERROR=misc error.
+ *
+\*****************************************************************************/
+
+FUNC_STATUS WORD mat_openXform (
+ IP_XFORM_HANDLE *pXform) /* out: returned handle */
+{
+ PMAT_INST g;
+
+ INSURE (pXform != NULL);
+ IP_MEM_ALLOC (sizeof(MAT_INST), g);
+ *pXform = g;
+ memset (g, 0, sizeof(MAT_INST));
+ g->dwValidChk = CHECK_VALUE;
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * mat_setDefaultInputTraits - Specifies default input image traits
+ *
+ *****************************************************************************
+ *
+ * The header of the file-type handled by the transform probably does
+ * not include *all* the image traits we'd like to know. Those not
+ * specified in the file-header are filled in from info provided by
+ * this routine.
+ *
+ * Return value: IP_DONE=success; IP_FATAL_ERROR=misc error.
+ *
+\*****************************************************************************/
+
+FUNC_STATUS WORD mat_setDefaultInputTraits (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ PIP_IMAGE_TRAITS pTraits) /* in: default image traits */
+{
+ PMAT_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ /* insure that traits we care about are known */
+ INSURE (pTraits->iPixelsPerRow > 0);
+ INSURE (pTraits->iBitsPerPixel==24 || pTraits->iBitsPerPixel==48);
+ INSURE (pTraits->iComponentsPerPixel == 3);
+
+ g->traits = *pTraits; /* a structure copy */
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * mat_setXformSpec - Provides xform-specific information
+ *
+\*****************************************************************************/
+
+FUNC_STATUS WORD mat_setXformSpec (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD_OR_PVOID aXformInfo[]) /* in: xform information */
+{
+ PMAT_INST g;
+ int *ptr;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ ptr = (int*)aXformInfo[0].pvoid;
+ INSURE (ptr != NULL);
+ memcpy (g->mat, ptr, sizeof(g->mat));
+
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * mat_getHeaderBufSize- Returns size of input buf needed to hold header
+ *
+\*****************************************************************************/
+
+FUNC_STATUS WORD mat_getHeaderBufSize (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD *pdwInBufLen) /* out: buf size for parsing header */
+{
+ /* since input is raw pixels, there is no header, so set it to zero */
+ *pdwInBufLen = 0;
+ return IP_DONE;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * mat_getActualTraits - Parses header, and returns input & output traits
+ *
+\*****************************************************************************/
+
+FUNC_STATUS WORD mat_getActualTraits (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD dwInputAvail, /* in: # avail bytes in input buf */
+ PBYTE pbInputBuf, /* in: ptr to input buffer */
+ PDWORD pdwInputUsed, /* out: # bytes used from input buf */
+ PDWORD pdwInputNextPos,/* out: file-pos to read from next */
+ PIP_IMAGE_TRAITS pIntraits, /* out: input image traits */
+ PIP_IMAGE_TRAITS pOutTraits) /* out: output image traits */
+{
+ PMAT_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ /* Since there is no header, we'll report no usage of input */
+ *pdwInputUsed = 0;
+ *pdwInputNextPos = 0;
+
+ *pIntraits = g->traits; /* structure copies */
+ *pOutTraits = g->traits;
+
+ /* At this point, nothing will change, so compute internal variables */
+ g->dwBytesPerRow = (g->traits.iPixelsPerRow*g->traits.iBitsPerPixel + 7) / 8;
+
+ if (g->traits.iBitsPerPixel == 24) {
+ int i;
+ for (i=0; i<9; i++) {
+ /* we'll use 16 bits of fraction instead of 24 */
+ g->mat[i] = (g->mat[i]+(1<<7)) >> 8;
+ }
+ }
+
+ return IP_DONE | IP_READY_FOR_DATA;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/****************************************************************************\
+ *
+ * mat_getActualBufSizes - Returns buf sizes needed for remainder of job
+ *
+\****************************************************************************/
+
+FUNC_STATUS WORD mat_getActualBufSizes (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ PDWORD pdwMinInBufLen, /* out: min input buf size */
+ PDWORD pdwMinOutBufLen) /* out: min output buf size */
+{
+ PMAT_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ *pdwMinInBufLen = *pdwMinOutBufLen = g->dwBytesPerRow;
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * mat_convert - Converts one row
+ *
+\*****************************************************************************/
+
+FUNC_STATUS WORD mat_convert (
+ IP_XFORM_HANDLE hXform,
+ DWORD dwInputAvail, /* in: # avail bytes in in-buf */
+ PBYTE pbInputBuf, /* in: ptr to in-buffer */
+ PDWORD pdwInputUsed, /* out: # bytes used from in-buf */
+ PDWORD pdwInputNextPos, /* out: file-pos to read from next */
+ DWORD dwOutputAvail, /* in: # avail bytes in out-buf */
+ PBYTE pbOutputBuf, /* in: ptr to out-buffer */
+ PDWORD pdwOutputUsed, /* out: # bytes written in out-buf */
+ PDWORD pdwOutputThisPos) /* out: file-pos to write the data */
+{
+ PMAT_INST g;
+ int nBytes;
+ PBYTE pIn, pOut, pOutAfter;
+ int rIn, gIn, bIn, rOut, gOut, bOut;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ /**** Check for flushing ****/
+
+ if (pbInputBuf == NULL) {
+ PRINT (_T("mat_convert: Told to flush.\n"), 0, 0);
+ /* we are done */
+ *pdwInputUsed = *pdwOutputUsed = 0;
+ *pdwInputNextPos = g->dwInNextPos;
+ *pdwOutputThisPos = g->dwOutNextPos;
+ return IP_DONE;
+ }
+
+ /**** Output a Row ****/
+
+ nBytes = g->dwBytesPerRow;
+ INSURE (dwInputAvail >= (DWORD)nBytes);
+ INSURE (dwOutputAvail >= (DWORD)nBytes);
+
+ pIn = pbInputBuf;
+ pOut = pbOutputBuf;
+ pOutAfter = pbOutputBuf + nBytes;
+
+ if (g->traits.iBitsPerPixel == 24)
+ {
+ while (pOut < pOutAfter)
+ {
+ rIn = (int)(unsigned)(*pIn++);
+ gIn = (int)(unsigned)(*pIn++);
+ bIn = (int)(unsigned)(*pIn++);
+
+ /* for this 24-bit case, we assume that the matrix has already
+ * been shifted down to just 16 bits of fraction instead of 24 */
+ rOut = rIn*g->mat[0] + gIn*g->mat[1] + bIn*g->mat[2];
+ gOut = rIn*g->mat[3] + gIn*g->mat[4] + bIn*g->mat[5];
+ bOut = rIn*g->mat[6] + gIn*g->mat[7] + bIn*g->mat[8];
+
+ /* we have 16 bits of fraction, so round to integer */
+ rOut = (rOut+(1<<15)) >> 16;
+ gOut = (gOut+(1<<15)) >> 16;
+ bOut = (bOut+(1<<15)) >> 16;
+
+ /* make sure the result fits in a byte */
+ if (rOut > 255) rOut = 255; else if (rOut < 0) rOut = 0;
+ if (gOut > 255) gOut = 255; else if (gOut < 0) gOut = 0;
+ if (bOut > 255) bOut = 255; else if (bOut < 0) bOut = 0;
+
+ *pOut++ = (BYTE)rOut;
+ *pOut++ = (BYTE)gOut;
+ *pOut++ = (BYTE)bOut;
+ }
+ }
+ else /* 48 bits per pixel */
+ {
+ WORD *pwIn, *pwOut;
+ pwIn = (WORD*)pIn;
+ pwOut = (WORD*)pOut;
+
+ while (pwOut < (WORD*)pOutAfter)
+ {
+ int prod0, prod1, prod2;
+
+ /* The fixed-point calculations below are as follows:
+ * 17.15 = input pixel
+ * 8.24 = factor from matrix
+ * 25.39 = result of 32x32->64 multiply of above numbers
+ * 25.7 = result of discarding low 32 bits of 64-bit product
+ * Finally, we add (1<<6) and shift right 7 to round to integer.
+ *
+ * The MUL32HIHALF macro does a signed 32x32->64 multiply, and then
+ * discards the low 32 bits, giving you the high 32 bits.
+ */
+
+ rIn = (int)(unsigned)(*pwIn++) << 15;
+ gIn = (int)(unsigned)(*pwIn++) << 15;
+ bIn = (int)(unsigned)(*pwIn++) << 15;
+
+ MUL32HIHALF (rIn, g->mat[0], prod0);
+ MUL32HIHALF (gIn, g->mat[1], prod1);
+ MUL32HIHALF (bIn, g->mat[2], prod2);
+ rOut = (prod0 + prod1 + prod2 + (1<<6)) >> 7;
+ if (rOut > 0x00ffff) rOut = 0x00ffff; else if (rOut < 0) rOut = 0;
+ *pwOut++ = rOut;
+
+ MUL32HIHALF (rIn, g->mat[3], prod0);
+ MUL32HIHALF (gIn, g->mat[4], prod1);
+ MUL32HIHALF (bIn, g->mat[5], prod2);
+ gOut = (prod0 + prod1 + prod2 + (1<<6)) >> 7;
+ if (gOut > 0x00ffff) gOut = 0x00ffff; else if (gOut < 0) gOut = 0;
+ *pwOut++ = gOut;
+
+ MUL32HIHALF (rIn, g->mat[6], prod0);
+ MUL32HIHALF (gIn, g->mat[7], prod1);
+ MUL32HIHALF (bIn, g->mat[8], prod2);
+ bOut = (prod0 + prod1 + prod2 + (1<<6)) >> 7;
+ if (bOut > 0x00ffff) bOut = 0x00ffff; else if (bOut < 0) bOut = 0;
+ *pwOut++ = bOut;
+ }
+ }
+
+ *pdwInputUsed = nBytes;
+ g->dwInNextPos += nBytes;
+ *pdwInputNextPos = g->dwInNextPos;
+
+ *pdwOutputUsed = nBytes;
+ *pdwOutputThisPos = g->dwOutNextPos;
+ g->dwOutNextPos += nBytes;
+
+ g->dwRowsDone += 1;
+ return IP_CONSUMED_ROW | IP_PRODUCED_ROW | IP_READY_FOR_DATA;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * mat_insertedData - client inserted into our output stream
+ *
+\*****************************************************************************/
+
+FUNC_STATUS WORD mat_insertedData (
+ IP_XFORM_HANDLE hXform,
+ DWORD dwNumBytes)
+{
+ fatalBreakPoint ();
+ return IP_FATAL_ERROR; /* must never be called (can't insert data) */
+}
+
+
+
+/*****************************************************************************\
+ *
+ * mat_newPage - Tells us to flush this page, and start a new page
+ *
+\*****************************************************************************/
+
+FUNC_STATUS WORD mat_newPage (
+ IP_XFORM_HANDLE hXform)
+{
+ PMAT_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+ /* todo: return fatal error if convert is called again? */
+ return IP_DONE; /* can't insert page-breaks, so ignore this call */
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+
+}
+
+
+
+/*****************************************************************************\
+ *
+ * mat_closeXform - Destroys this instance
+ *
+\*****************************************************************************/
+
+FUNC_STATUS WORD mat_closeXform (IP_XFORM_HANDLE hXform)
+{
+ PMAT_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ g->dwValidChk = 0;
+ IP_MEM_FREE (g); /* free memory for the instance */
+
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * matTbl - Jump-table for transform driver
+ *
+\*****************************************************************************/
+#ifdef EXPORT_TRANSFORM
+__declspec (dllexport)
+#endif
+IP_XFORM_TBL matrixTbl = {
+ mat_openXform,
+ mat_setDefaultInputTraits,
+ mat_setXformSpec,
+ mat_getHeaderBufSize,
+ mat_getActualTraits,
+ mat_getActualBufSizes,
+ mat_convert,
+ mat_newPage,
+ mat_insertedData,
+ mat_closeXform
+};
+
+/* End of File */
+
+
+/*****************************************************************************\
+ *
+ * ipGetXformTable - Returns pointer to the jump table
+ *
+\*****************************************************************************/
+
+#ifdef EXPORT_TRANSFORM
+EXPORT(WORD) ipGetXformTable (LPIP_XFORM_TBL pXform)
+{
+ WORD wRet = IP_DONE;
+
+ if (pXform)
+ {
+ *pXform = clrmapTbl;
+ }
+ else
+ {
+ wRet = IP_FATAL_ERROR;
+ }
+
+ return wRet;
+}
+#endif
diff --git a/ip/xpad.c b/ip/xpad.c
new file mode 100644
index 0000000..5e32eaa
--- /dev/null
+++ b/ip/xpad.c
@@ -0,0 +1,523 @@
+/* libhpojip -- HP OfficeJet image-processing library. */
+
+/* Copyright (C) 1995-2002 Hewlett-Packard Company
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ * MA 02111-1307, USA.
+ *
+ * In addition, as a special exception, Hewlett-Packard Company
+ * gives permission to link the code of this program with any
+ * version of the OpenSSL library which is distributed under a
+ * license identical to that listed in the included LICENSE.OpenSSL
+ * file, and distribute linked combinations including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * this file, you may extend this exception to your version of the
+ * file, but you are not obligated to do so. If you do not wish to
+ * do so, delete this exception statement from your version.
+ */
+
+/* Original author: Mark Overton and others.
+ *
+ * Ported to Linux by David Paschal.
+ */
+
+/******************************************************************************\
+ *
+ * xpad.c - Pads all four sides of the input image with extra pixels
+ *
+ ******************************************************************************
+ *
+ * Name of Global Jump-Table:
+ *
+ * padTbl
+ *
+ * Items in aXformInfo array passed into setXformSpec:
+ *
+ * aXformInfo[IP_PAD_LEFT ] = left: # of pixels to add to left side (or negative)
+ * aXformInfo[IP_PAD_RIGHT ] = right: # of pixels to add to right side
+ * aXformInfo[IP_PAD_TOP ] = top: # of rows to add to top (or negative)
+ * aXformInfo[IP_PAD_BOTTOM] = bottom: # of rows to add to bottom
+ * aXformInfo[IP_PAD_VALUE ] = pad value (0-255)
+ * aXformInfo[IP_PAD_MIN_HEIGHT] = minimum # of input rows, pad if needed
+ *
+ * The pad value above (at index 4) is the value of the added pad-pixels.
+ * For color data, all three bytes will be set to this value.
+ * For bi-level data, only the lsb is used.
+ *
+ * If 'left' is negative, then the output width will be forced to be a
+ * multiple of abs(left) pixels.
+ * If 'top' is negative, the same thing is done with the height.
+ *
+ * Capabilities and Limitations:
+ *
+ * Pads all four sides of the image.
+ * The image data must be fixed-length rows of uncompressed pixels.
+ * For bilevel data, the "left" value is changed to the nearest multiple
+ * of 8, and the "right" value is changed so the resulting row-width
+ * does not change.
+ * If all pad-amounts above are 0, this xform becomes merely a pass-thru.
+ *
+ * Default Input Traits, and Output Traits:
+ *
+ * trait default input output
+ * ------------------- --------------------- ------------------------
+ * iPixelsPerRow * used input width + horiz pad
+ * iBitsPerPixel * passed into output same as default input
+ * iComponentsPerPixel passed into output same as default input
+ * lHorizDPI passed into output same as default input
+ * lVertDPI passed into output same as default input
+ * lNumRows used if known output height, if input known
+ * iNumPages passed into output same as default input
+ * iPageNum passed into output same as default input
+ *
+ * Above, a "*" by an item indicates it must be valid (not negative).
+ *
+\******************************************************************************/
+
+#include "hpip.h"
+#include "ipdefs.h"
+#include "string.h" /* for memset and memcpy */
+
+
+#if 0
+ #include "stdio.h"
+ #include <tchar.h>
+
+ #define PRINT(msg,arg1,arg2) \
+ _ftprintf(stderr, msg, (int)arg1, (int)arg2)
+#else
+ #define PRINT(msg,arg1,arg2)
+#endif
+
+#define CHECK_VALUE 0x4ba1dace
+
+
+typedef struct {
+ IP_IMAGE_TRAITS traits; /* traits of the input image */
+ DWORD dwLeft, dwRight; /* # pixels to pad, left and right sides */
+ DWORD dwTop; /* # rows to pad to top */
+ DWORD dwBottom; /* # rows to pad to bottom */
+ DWORD dwMinInRows; /* minimum # input rows, pad if necessary */
+ DWORD dwInBytesPerRow; /* # bytes in each input row */
+ DWORD dwOutBytesPerRow; /* # bytes in each output row */
+ DWORD dwLeftPadBytes; /* # bytes to add to left side of each row */
+ DWORD dwRightPadBytes; /* # bytes to add to right side of each row */
+ BYTE bPadVal; /* value of pad pixels */
+ DWORD dwInRows; /* number of rows input so far */
+ DWORD dwOutRows; /* number of rows output so far */
+ DWORD dwInNextPos; /* file pos for subsequent input */
+ DWORD dwOutNextPos; /* file pos for subsequent output */
+ DWORD dwValidChk; /* struct validity check value */
+} PAD_INST, *PPAD_INST;
+
+
+
+/*****************************************************************************\
+ *
+ * pad_openXform - Creates a new instance of the transformer
+ *
+ *****************************************************************************
+ *
+ * This returns a handle for the new instance to be passed into
+ * all subsequent calls.
+ *
+ * Return value: IP_DONE=success; IP_FATAL_ERROR=misc error.
+ *
+\*****************************************************************************/
+
+static WORD pad_openXform (
+ IP_XFORM_HANDLE *pXform) /* out: returned handle */
+{
+ PPAD_INST g;
+
+ INSURE (pXform != NULL);
+ IP_MEM_ALLOC (sizeof(PAD_INST), g);
+ *pXform = g;
+ memset (g, 0, sizeof(PAD_INST));
+ g->dwValidChk = CHECK_VALUE;
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * pad_setDefaultInputTraits - Specifies default input image traits
+ *
+ *****************************************************************************
+ *
+ * The header of the file-type handled by the transform probably does
+ * not include *all* the image traits we'd like to know. Those not
+ * specified in the file-header are filled in from info provided by
+ * this routine.
+ *
+ * Return value: IP_DONE=success; IP_FATAL_ERROR=misc error.
+ *
+\*****************************************************************************/
+
+static WORD pad_setDefaultInputTraits (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ PIP_IMAGE_TRAITS pTraits) /* in: default image traits */
+{
+ PPAD_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ /* insure that traits we care about are known */
+ INSURE (pTraits->iPixelsPerRow>0 && pTraits->iBitsPerPixel>0);
+ g->traits = *pTraits; /* a structure copy */
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * pad_setXformSpec - Provides xform-specific information
+ *
+\*****************************************************************************/
+
+static WORD pad_setXformSpec (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD_OR_PVOID aXformInfo[]) /* in: xform information */
+{
+ PPAD_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ g->dwLeft = aXformInfo[IP_PAD_LEFT].dword;
+ g->dwRight = aXformInfo[IP_PAD_RIGHT].dword;
+ g->dwTop = aXformInfo[IP_PAD_TOP].dword;
+ g->dwBottom = aXformInfo[IP_PAD_BOTTOM].dword;
+ g->bPadVal = (BYTE)aXformInfo[IP_PAD_VALUE].dword;
+ g->dwMinInRows = aXformInfo[IP_PAD_MIN_HEIGHT].dword;
+
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * pad_getHeaderBufSize- Returns size of input buf needed to hold header
+ *
+\*****************************************************************************/
+
+static WORD pad_getHeaderBufSize (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD *pdwInBufLen) /* out: buf size for parsing header */
+{
+ /* since input is raw pixels, there is no header, so set it to zero */
+ *pdwInBufLen = 0;
+ return IP_DONE;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * pad_getActualTraits - Parses header, and returns input & output traits
+ *
+\*****************************************************************************/
+
+static WORD pad_getActualTraits (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD dwInputAvail, /* in: # avail bytes in input buf */
+ PBYTE pbInputBuf, /* in: ptr to input buffer */
+ PDWORD pdwInputUsed, /* out: # bytes used from input buf */
+ PDWORD pdwInputNextPos,/* out: file-pos to read from next */
+ PIP_IMAGE_TRAITS pInTraits, /* out: input image traits */
+ PIP_IMAGE_TRAITS pOutTraits) /* out: output image traits */
+{
+ PPAD_INST g;
+ int left, right, shift, more;
+ int inWidth, outWidth;
+ int bpp;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ /* Since there is no header, we'll report no usage of input */
+
+ *pdwInputUsed = 0;
+ *pdwInputNextPos = 0;
+
+ /* Compute the pad info */
+
+ bpp = g->traits.iBitsPerPixel;
+ left = g->dwLeft;
+ right = g->dwRight;
+ inWidth = g->traits.iPixelsPerRow;
+
+ if (left < 0) {
+ left = -left;
+ // pad horizontally so that width is a multiple of left
+ outWidth = ((inWidth+left-1) / left) * left;
+ more = outWidth - inWidth;
+ left = more >> 1;
+ right = more - left;
+ g->dwLeft = left;
+ g->dwRight = right;
+ }
+
+ outWidth = inWidth + left + right;
+
+ if (bpp == 1) {
+ /* shift to start at nearest byte boundary */
+ shift = ((left+4) & ~7) - left;
+ left += shift; /* this is now a multiple of 8 */
+ right += shift;
+
+ g->bPadVal = g->bPadVal & 1 ? 0xffu : 0;
+ }
+
+ g->dwInBytesPerRow = (bpp*inWidth + 7) / 8;
+ g->dwOutBytesPerRow = (bpp*outWidth + 7) / 8;
+ g->dwLeftPadBytes = (bpp*left + 7) / 8;
+ g->dwRightPadBytes = g->dwOutBytesPerRow - g->dwInBytesPerRow - g->dwLeftPadBytes;
+
+ /* Report the traits */
+
+ *pInTraits = g->traits; /* structure copies */
+ *pOutTraits = g->traits;
+ pOutTraits->iPixelsPerRow = outWidth;
+
+ if (pInTraits->lNumRows > 0) {
+ if ((int)g->dwTop < 0) {
+ int top, bot, inHeight, outHeight;
+ top = - (int)g->dwTop;
+ // pad vertically so that #rows is a multiple of top
+ inHeight = pInTraits->lNumRows;
+ outHeight = ((inHeight+top-1) / top) * top;
+ more = outHeight - inHeight;
+ top = more >> 1;
+ bot = more - top;
+ g->dwTop = top;
+ g->dwBottom = bot;
+ }
+
+ pOutTraits->lNumRows = pInTraits->lNumRows + g->dwTop + g->dwBottom;
+ }
+
+ INSURE ((int)g->dwLeft >= 0);
+ INSURE ((int)g->dwTop >= 0);
+
+ return IP_DONE | (g->dwTop>0 ? 0 : IP_READY_FOR_DATA);
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/****************************************************************************\
+ *
+ * pad_getActualBufSizes - Returns buf sizes needed for remainder of job
+ *
+\****************************************************************************/
+
+static WORD pad_getActualBufSizes (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ PDWORD pdwMinInBufLen, /* out: min input buf size */
+ PDWORD pdwMinOutBufLen) /* out: min output buf size */
+{
+ PPAD_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ *pdwMinInBufLen = g->dwInBytesPerRow;
+ *pdwMinOutBufLen = g->dwOutBytesPerRow;
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * pad_convert - Converts one row
+ *
+\*****************************************************************************/
+
+static WORD pad_convert (
+ IP_XFORM_HANDLE hXform,
+ DWORD dwInputAvail, /* in: # avail bytes in in-buf */
+ PBYTE pbInputBuf, /* in: ptr to in-buffer */
+ PDWORD pdwInputUsed, /* out: # bytes used from in-buf */
+ PDWORD pdwInputNextPos, /* out: file-pos to read from next */
+ DWORD dwOutputAvail, /* in: # avail bytes in out-buf */
+ PBYTE pbOutputBuf, /* in: ptr to out-buffer */
+ PDWORD pdwOutputUsed, /* out: # bytes written in out-buf */
+ PDWORD pdwOutputThisPos) /* out: file-pos to write the data */
+{
+ PPAD_INST g;
+ BOOL bWhiteRow;
+
+ HANDLE_TO_PTR (hXform, g);
+ bWhiteRow = FALSE;
+
+ /**** Decide what to do ****/
+
+ if (pbInputBuf == NULL) {
+ PRINT (_T("pad_convert: Told to flush.\n"), 0, 0);
+
+ if (g->dwInRows < g->dwMinInRows) {
+ /* We need to output another pad row on the bottom */
+ bWhiteRow = TRUE;
+ g->dwInRows += 1;
+ } else if (g->dwBottom > 0) {
+ /* We need to output another pad row on the bottom */
+ bWhiteRow = TRUE;
+ g->dwBottom -= 1;
+ } else {
+ /* We are done */
+ *pdwInputUsed = *pdwOutputUsed = 0;
+ *pdwInputNextPos = g->dwInNextPos;
+ *pdwOutputThisPos = g->dwOutNextPos;
+ return IP_DONE;
+ }
+ } else if (g->dwOutRows < g->dwTop) {
+ /* We need to output another pad row on the top */
+ bWhiteRow = TRUE;
+ }
+
+ /**** Output a Row ****/
+
+ INSURE (bWhiteRow || (dwInputAvail >= g->dwInBytesPerRow));
+ INSURE (dwOutputAvail >= g->dwOutBytesPerRow);
+
+ if (bWhiteRow)
+ memset (pbOutputBuf, g->bPadVal, g->dwOutBytesPerRow);
+ else {
+ BYTE *p = pbOutputBuf;
+ memset (p, g->bPadVal, g->dwLeftPadBytes);
+ p += g->dwLeftPadBytes;
+ memcpy (p, pbInputBuf, g->dwInBytesPerRow);
+ p += g->dwInBytesPerRow;
+ memset (p, g->bPadVal, g->dwRightPadBytes);
+
+ g->dwInRows += 1;
+ *pdwInputUsed = g->dwInBytesPerRow;
+ g->dwInNextPos += g->dwInBytesPerRow;
+ }
+
+ g->dwOutRows += 1;
+ *pdwInputNextPos = g->dwInNextPos;
+ *pdwOutputUsed = g->dwOutBytesPerRow;
+ *pdwOutputThisPos = g->dwOutNextPos;
+ g->dwOutNextPos += g->dwOutBytesPerRow;
+
+ return (bWhiteRow ? 0 : IP_CONSUMED_ROW) |
+ IP_PRODUCED_ROW |
+ (g->dwOutRows < g->dwTop ? 0 : IP_READY_FOR_DATA);
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * pad_insertedData - client inserted into our output stream
+ *
+\*****************************************************************************/
+
+static WORD pad_insertedData (
+ IP_XFORM_HANDLE hXform,
+ DWORD dwNumBytes)
+{
+ fatalBreakPoint ();
+ return IP_FATAL_ERROR; /* must never be called (can't insert data) */
+}
+
+
+
+/*****************************************************************************\
+ *
+ * pad_newPage - Tells us to flush this page, and start a new page
+ *
+\*****************************************************************************/
+
+static WORD pad_newPage (
+ IP_XFORM_HANDLE hXform)
+{
+ PPAD_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+ /* todo: return fatal error if convert is called again? */
+ return IP_DONE; /* can't insert page-breaks, so ignore this call */
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+
+}
+
+
+
+/*****************************************************************************\
+ *
+ * pad_closeXform - Destroys this instance
+ *
+\*****************************************************************************/
+
+static WORD pad_closeXform (IP_XFORM_HANDLE hXform)
+{
+ PPAD_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ g->dwValidChk = 0;
+ IP_MEM_FREE (g); /* free memory for the instance */
+
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * padTbl - Jump-table for transform driver
+ *
+\*****************************************************************************/
+
+IP_XFORM_TBL padTbl = {
+ pad_openXform,
+ pad_setDefaultInputTraits,
+ pad_setXformSpec,
+ pad_getHeaderBufSize,
+ pad_getActualTraits,
+ pad_getActualBufSizes,
+ pad_convert,
+ pad_newPage,
+ pad_insertedData,
+ pad_closeXform
+};
+
+/* End of File */
diff --git a/ip/xpcx.c b/ip/xpcx.c
new file mode 100644
index 0000000..6a9327c
--- /dev/null
+++ b/ip/xpcx.c
@@ -0,0 +1,1318 @@
+/* libhpojip -- HP OfficeJet image-processing library. */
+
+/* Copyright (C) 1995-2002 Hewlett-Packard Company
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ * MA 02111-1307, USA.
+ *
+ * In addition, as a special exception, Hewlett-Packard Company
+ * gives permission to link the code of this program with any
+ * version of the OpenSSL library which is distributed under a
+ * license identical to that listed in the included LICENSE.OpenSSL
+ * file, and distribute linked combinations including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * this file, you may extend this exception to your version of the
+ * file, but you are not obligated to do so. If you do not wish to
+ * do so, delete this exception statement from your version.
+ */
+
+/* Original author: Mark Overton and others.
+ *
+ * Ported to Linux by David Paschal.
+ */
+
+/*****************************************************************************\
+ *
+ * xpcx.c - encoder and decoder for PCX files for Image Processor
+ *
+ *****************************************************************************
+ *
+ * Name of Global Jump-Table:
+ *
+ * pcxEncodeTbl = the encoder,
+ * pcxDecodeTbl = the decoder.
+ *
+ * Items in aXformInfo array passed into setXformSpec:
+ *
+ * none
+ *
+ * Capabilities and Limitations:
+ *
+ * Handles 1 or 4 bits per pixel.
+ * Decoder discards the palette in the PCX file (todo: keep it).
+ * Encoder assumes input is internal raw format, which means that
+ * 1 and 4 bits/pixel are assumed to be grayscales, where
+ * 1 bit/pixel is [0=white, 1=black], 4 bits/pixel is [0=black, 15=white].
+ * Encoder outputs a palette for the preceding gray-ranges.
+ * If # rows is not known in input traits (negative), the encoder will
+ * re-write the header when # rows is known at the end of the page. So
+ * the output file will have a valid row-count when conversion is done.
+ *
+ * Default Input Traits, and Output Traits:
+ *
+ * For decoder:
+ *
+ * trait default input output
+ * ------------------- --------------------- ------------------------
+ * iPixelsPerRow ignored based on header
+ * iBitsPerPixel ignored based on header (1 or 4)
+ * iComponentsPerPixel ignored 1
+ * lHorizDPI ignored based on header
+ * lVertDPI ignored based on header
+ * lNumRows ignored based on header
+ * iNumPages passed into output same as default input
+ * iPageNum passed into output same as default input
+ *
+ * For encoder:
+ *
+ * trait default input output
+ * ------------------- --------------------- ------------------------
+ * iPixelsPerRow * passed into output same as default input
+ * iBitsPerPixel * must be 1 or 4 same as default input
+ * iComponentsPerPixel passed into output same as default input
+ * lHorizDPI passed into output same as default input
+ * lVertDPI passed into output same as default input
+ * lNumRows passed into output same as default input
+ * iNumPages passed into output same as default input
+ * iPageNum passed into output same as default input
+ *
+ * Above, a "*" by an item indicates it must be valid (not negative).
+ *
+ * Mark Overton, Feb 1998
+ *
+\*****************************************************************************/
+
+/* todo: this PCX code encodes/decodes 4-bit gray as one pixel per byte.
+ * it should be two pixels per byte.
+ */
+
+
+#include "hpip.h"
+#include "ipdefs.h"
+#include "string.h" /* for memset and memcpy */
+
+
+#if 0
+ #include "stdio.h"
+ #include <tchar.h>
+
+ #define PRINT(msg,arg1,arg2) \
+ _ftprintf(stderr, msg, (int)arg1, (int)arg2)
+#else
+ #define PRINT(msg,arg1,arg2)
+#endif
+
+#define CHECK_VALUE 0x1ce5ca7e
+
+/* TODO: Make this work for big and little endian. */
+#define LITTLE_ENDIAN (! (defined SNAKES))
+
+
+/* PCX_INST - our instance variables */
+
+typedef struct {
+ IP_IMAGE_TRAITS traits; /* traits of the image */
+ DWORD dwInNextPos; /* file pos for subsequent input */
+ DWORD dwOutNextPos; /* file pos for subsequent output */
+ BOOL fDidHeader; /* already processed the header? */
+ BYTE *pPlanes; /* buffer containing separated planes */
+ UINT uBytesPerRawRow; /* number of bytes per unencoded row */
+ UINT uBytesPerPlane; /* number of bytes per plane per row */
+ UINT uRowsDone; /* number of rows converted so far */
+ DWORD dwValidChk; /* struct validity check value */
+} PCX_INST, *PPCX_INST;
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | pcx_header_t | Each PCX file starts with this 128-byte header |
+ |______________|_____________________________________________________________|
+*/
+typedef struct {
+ BYTE PcxId; /* must be 0Ah, which means PC Paintbrush */
+ BYTE Version; /* 2=v2.8 w/ palette; 3=v2.8 w/o pal; 5=v3 w/ pal */
+ BYTE EncodingMethod; /* encoding method == 1 */
+ BYTE BitsPerPixel; /* = 1 for fax mode transfers */
+ WORD XMin; /* X position of the upper left corner */
+ WORD YMin; /* Y position of the upper left corner */
+ WORD XMax; /* X position of the bottom right corner */
+ WORD YMax; /* Y position of the bottom right corner */
+ WORD HorizResolution; /* horizontal resolution */
+ WORD VertResolution; /* vertical resolution */
+ BYTE PaletteInfo[48]; /* Palette information */
+ BYTE Reserved1; /* reserved, must be zero */
+ BYTE ColorPlanes; /* number of color planes == 1 */
+ WORD BytesPerPlane; /* bytes per plane per row */
+ BYTE Reserved2[60]; /* reserved, should be zero */
+} pcx_header_t;
+
+#define PCX_ID 0x0A
+#define PCX_VERSION 2
+#define PCX_HEADER_SIZE 128
+
+
+/*____________________________________________________________________________
+ | | |
+ | swap_header_bytes | if big-endian machine, swaps bytes in WORD items |
+ |___________________|________________________________________________________|
+*/
+static void swap_header_bytes (pcx_header_t *head_p)
+{
+#if ! LITTLE_ENDIAN
+ #define SWAP_IT(item) \
+ head_p->item = (head_p->item << 8) | (head_p->item >> 8)
+
+ SWAP_IT (XMin);
+ SWAP_IT (YMin);
+ SWAP_IT (XMax);
+ SWAP_IT (YMax);
+ SWAP_IT (HorizResolution);
+ SWAP_IT (VertResolution);
+ SWAP_IT (BytesPerPlane);
+#endif
+}
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | encode_buffer | encodes inbuf (separated planes) into run-length PCX data |
+ |_______________|____________________________________________________________|
+*/
+static UINT encode_buffer ( /* ret-val is # bytes written to outbuf */
+ PCX_INST *g, /* in: our instance variables */
+ BYTE *inbuf_p, /* in: ptr to inbuf having separated planes */
+ BYTE *outbuf_p) /* in: ptr to outbuf to get PCX run-lens */
+{
+ BYTE *out_p;
+ BYTE *beg_run_p;
+ BYTE *aft_run_p;
+ BYTE *inbuf_aft_p;
+ BYTE byt;
+ UINT run_len;
+
+ out_p = outbuf_p;
+ beg_run_p = inbuf_p;
+ inbuf_aft_p = inbuf_p + g->uBytesPerPlane * g->traits.iBitsPerPixel;
+
+ while (beg_run_p < inbuf_aft_p)
+ {
+ byt = *beg_run_p;
+
+ for (aft_run_p = beg_run_p+1;
+ aft_run_p<inbuf_aft_p && *aft_run_p==byt;
+ aft_run_p++) ;
+
+ run_len = aft_run_p - beg_run_p;
+ if (run_len > 63) {
+ run_len = 63;
+ aft_run_p = beg_run_p + 63;
+ }
+
+ if (run_len>1 || byt>=(BYTE)0xc0)
+ *out_p++ = (BYTE)run_len | (BYTE)0xc0;
+ *out_p++ = byt;
+
+ beg_run_p = aft_run_p;
+ }
+
+ return out_p - outbuf_p;
+}
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | decode_buffer | decodes PCX run-length data into separated planes |
+ |_______________|____________________________________________________________|
+*/
+static UINT decode_buffer ( /* ret-val is # bytes read from inbuf */
+ PCX_INST *g, /* in: our instance variables */
+ BYTE *inbuf_p, /* in: ptr to input buffer */
+ BYTE *outbuf_p) /* in: ptr to output buffer */
+{
+ BYTE *in_p;
+ BYTE *out_p;
+ BYTE *out_aft_p;
+ UINT run_len;
+ BYTE byt;
+
+ in_p = inbuf_p;
+ out_p = outbuf_p;
+ out_aft_p = outbuf_p + g->uBytesPerPlane*g->traits.iBitsPerPixel;
+
+ while (out_p < out_aft_p)
+ {
+ byt = *in_p++;
+
+ if (byt < (BYTE)0xc0)
+ *out_p++ = byt;
+ else {
+ run_len = byt & (BYTE)0x3f;
+ if (run_len > (UINT) (out_aft_p - out_p))
+ run_len = out_aft_p-out_p; /* run went past end of outbuf */
+ memset (out_p, *in_p++, run_len);
+ out_p += run_len;
+ }
+ }
+
+ return in_p - inbuf_p;
+}
+
+
+
+/*____________________________________________________________________________
+ | |
+ | Encoding/Decoding Bilevel |
+ |____________________________________________________________________________|
+*/
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | flip_pixels | in PCX, 0=black and 1=white, so this flips all the bits |
+ |_____________|______________________________________________________________|
+*/
+static void flip_pixels (
+ PCX_INST *g, /* our instance variables */
+ BYTE *byte_buf_p) /* ptr to buffer to be flipped */
+{
+ ULONG *buf_p;
+ ULONG *buf_aft_p;
+
+ buf_p = (ULONG*)byte_buf_p;
+ buf_aft_p = buf_p + ((g->uBytesPerRawRow+3) >> 2);
+ for ( ; buf_p<buf_aft_p; buf_p++)
+ *buf_p = ~ *buf_p;
+}
+
+
+
+static UINT encode_1 (
+ PCX_INST *g, /* in: our instance variables */
+ BYTE *inbuf_p, /* in: ptr to input buffer */
+ BYTE *outbuf_p) /* in: ptr to output buffer */
+{
+ UINT n_bytes;
+
+ flip_pixels (g, inbuf_p);
+ n_bytes = encode_buffer (g, inbuf_p, outbuf_p);
+ flip_pixels (g, inbuf_p);
+ return n_bytes;
+}
+
+
+
+static UINT decode_1 (
+ PCX_INST *g, /* in: our instance variables */
+ BYTE *inbuf_p, /* in: ptr to input buffer */
+ BYTE *outbuf_p) /* in: ptr to output buffer */
+{
+ UINT used;
+
+ used = decode_buffer (g, inbuf_p, outbuf_p);
+ flip_pixels (g, outbuf_p);
+ return used;
+}
+
+
+
+/*____________________________________________________________________________
+ | |
+ | Encoding/Decoding 16-Level |
+ |____________________________________________________________________________|
+*/
+
+
+#if 0
+
+/*____________________________________________________________________________
+ | | |
+ | pcxtable.c | Outputs table for PCX's 16-level decoder to stdout |
+ |____________|_______________________________________________________________|
+*/
+
+#include <stdio.h>
+#define little_endian 1
+
+void main (void)
+{
+ unsigned nib;
+ long unsigned outlong;
+
+ for (nib=0; nib<=15; nib++) {
+ outlong = 0;
+ if (nib & 0x08) outlong |= 0x10000000;
+ if (nib & 0x04) outlong |= 0x00100000;
+ if (nib & 0x02) outlong |= 0x00001000;
+ if (nib & 0x01) outlong |= 0x00000010;
+
+ if (little_endian)
+ outlong = (outlong & 0xff000000) >> 24 |
+ (outlong & 0x00ff0000) >> 8 |
+ (outlong & 0x0000ff00) << 8 |
+ (outlong & 0x000000ff) << 24;
+
+ _tprintf (_T("0x%08x, "), outlong);
+ if ((nib%4) == 3) _tputs(_T(""));
+ }
+ _tputs (_T(""));
+}
+
+#endif
+
+
+
+static UINT encode_4 (
+ PCX_INST *g, /* in: our instance variables */
+ BYTE *inbuf_p, /* in: ptr to input buffer */
+ BYTE *outbuf_p) /* in: ptr to output buffer */
+{
+ #if LITTLE_ENDIAN
+ #define NIB_0 0x000000f0
+ #define NIB_1 0x0000f000
+ #define NIB_2 0x00f00000
+ #define NIB_3 0xf0000000
+ #else
+ #define NIB_0 0xf0000000
+ #define NIB_1 0x00f00000
+ #define NIB_2 0x0000f000
+ #define NIB_3 0x000000f0
+ #endif
+
+ ULONG *in_p;
+ ULONG *in_aft_p;
+ BYTE *plane_p;
+ ULONG quad;
+ ULONG mask;
+ BYTE byt;
+
+ /* Separate the four planes (into pPlanes) */
+
+ in_aft_p = (ULONG *) (inbuf_p + g->uBytesPerRawRow);
+ plane_p = g->pPlanes;
+ mask = 0x10101010;
+
+ while (TRUE)
+ {
+ for (in_p=(ULONG*)inbuf_p; in_p<in_aft_p; ) {
+ byt = 0;
+ quad = *in_p++ & mask;
+ if (quad & NIB_0) byt = 0x80;
+ if (quad & NIB_1) byt |= 0x40;
+ if (quad & NIB_2) byt |= 0x20;
+ if (quad & NIB_3) byt |= 0x10;
+
+ quad = *in_p++ & mask;
+ if (quad & NIB_0) byt |= 0x08;
+ if (quad & NIB_1) byt |= 0x04;
+ if (quad & NIB_2) byt |= 0x02;
+ if (quad & NIB_3) byt |= 0x01;
+ *plane_p++ = byt;
+ }
+
+ if (mask == 0x80808080)
+ break;
+ mask <<= 1;
+ }
+
+ return encode_buffer (g, g->pPlanes, outbuf_p);
+}
+
+
+
+static UINT decode_4 (
+ PCX_INST *g, /* in: our instance variables */
+ BYTE *inbuf_p, /* in: ptr to input buffer */
+ BYTE *outbuf_p) /* in: ptr to output buffer */
+{
+ #if LITTLE_ENDIAN
+ static const ULONG unscramble[16] = {
+ 0x00000000, 0x10000000, 0x00100000, 0x10100000,
+ 0x00001000, 0x10001000, 0x00101000, 0x10101000,
+ 0x00000010, 0x10000010, 0x00100010, 0x10100010,
+ 0x00001010, 0x10001010, 0x00101010, 0x10101010,
+ };
+ #else
+ static const ULONG unscramble[16] = {
+ 0x00000000, 0x00000010, 0x00001000, 0x00001010,
+ 0x00100000, 0x00100010, 0x00101000, 0x00101010,
+ 0x10000000, 0x10000010, 0x10001000, 0x10001010,
+ 0x10100000, 0x10100010, 0x10101000, 0x10101010,
+ };
+ #endif
+
+ UINT used;
+ BYTE *plane_p;
+ BYTE *plane_aft_p;
+ ULONG *out_p;
+
+ used = decode_buffer (g, inbuf_p, g->pPlanes);
+
+ /* Combine the separated planes (in pPlanes) back into pixels */
+
+ plane_p = g->pPlanes;
+
+ out_p = (ULONG*)outbuf_p;
+ plane_aft_p = plane_p + g->uBytesPerPlane;
+ for (; plane_p<plane_aft_p; plane_p++) {
+ *out_p++ = unscramble[*plane_p >> 4];
+ *out_p++ = unscramble[*plane_p & 15];
+ }
+
+ out_p = (ULONG*)outbuf_p;
+ plane_aft_p = plane_p + g->uBytesPerPlane;
+ for (; plane_p<plane_aft_p; plane_p++) {
+ *out_p++ |= unscramble[*plane_p >> 4] << 1;
+ *out_p++ |= unscramble[*plane_p & 15] << 1;
+ }
+
+ out_p = (ULONG*)outbuf_p;
+ plane_aft_p = plane_p + g->uBytesPerPlane;
+ for (; plane_p<plane_aft_p; plane_p++) {
+ *out_p++ |= unscramble[*plane_p >> 4] << 2;
+ *out_p++ |= unscramble[*plane_p & 15] << 2;
+ }
+
+ out_p = (ULONG*)outbuf_p;
+ plane_aft_p = plane_p + g->uBytesPerPlane;
+ for (; plane_p<plane_aft_p; plane_p++) {
+ *out_p++ |= unscramble[*plane_p >> 4] << 3;
+ *out_p++ |= unscramble[*plane_p & 15] << 3;
+ }
+
+ return used;
+}
+
+
+
+/*____________________________________________________________________________
+ | |
+ | Encoding/Decoding 256-Level |
+ |____________________________________________________________________________|
+*/
+
+
+#if 0
+
+static UINT encode_8 (
+ PCX_INST *g, /* in: our instance variables */
+ BYTE *inbuf_p, /* in: ptr to input buffer */
+ BYTE *outbuf_p) /* in: ptr to output buffer */
+{
+ assert (0);
+ return 0;
+}
+
+
+
+static UINT decode_8 (
+ PCX_INST *g, /* in: our instance variables */
+ BYTE *inbuf_p, /* in: ptr to input buffer */
+ BYTE *outbuf_p) /* in: ptr to output buffer */
+{
+ assert (0);
+ return 0;
+}
+
+#endif /* 256-level stuff */
+
+
+
+/*
+******************************************************************************
+******************************************************************************
+**
+**
+** E N C O D E R
+**
+**
+******************************************************************************
+******************************************************************************
+*/
+
+
+
+/*****************************************************************************\
+ *
+ * pcxEncode_openXform - Creates a new instance of the transformer
+ *
+ *****************************************************************************
+ *
+ * This returns a handle for the new instance to be passed into
+ * all subsequent calls.
+ *
+ * Return value: IP_DONE=success; IP_FATAL_ERROR=misc error.
+ *
+\*****************************************************************************/
+
+static WORD pcxEncode_openXform (
+ IP_XFORM_HANDLE *pXform) /* out: returned handle */
+{
+ PPCX_INST g;
+
+ INSURE (pXform != NULL);
+ IP_MEM_ALLOC (sizeof(PCX_INST), g);
+ *pXform = g;
+ memset (g, 0, sizeof(PCX_INST));
+ g->dwValidChk = CHECK_VALUE;
+ INSURE (sizeof(pcx_header_t) == PCX_HEADER_SIZE);
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * pcxEncode_setDefaultInputTraits - Specifies default input image traits
+ *
+ *****************************************************************************
+ *
+ * The header of the file-type handled by the transform probably does
+ * not include *all* the image traits we'd like to know. Those not
+ * specified in the file-header are filled in from info provided by
+ * this routine.
+ *
+ * Return value: IP_DONE=success; IP_FATAL_ERROR=misc error.
+ *
+\*****************************************************************************/
+
+static WORD pcxEncode_setDefaultInputTraits (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ PIP_IMAGE_TRAITS pTraits) /* in: default image traits */
+{
+ PPCX_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+ INSURE (pTraits->iBitsPerPixel==1 || pTraits->iBitsPerPixel==4);
+ INSURE (pTraits->iPixelsPerRow > 0);
+ g->traits = *pTraits; /* a structure copy */
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * pcxEncode_setXformSpec - Provides xform-specific information
+ *
+\*****************************************************************************/
+
+static WORD pcxEncode_setXformSpec (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD_OR_PVOID aXformInfo[]) /* in: xform information */
+{
+ PPCX_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+ /* do nothing, because we don't have any xform-specific info */
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * pcxEncode_getHeaderBufSize- Returns size of input buf needed to hold header
+ *
+\*****************************************************************************/
+
+static WORD pcxEncode_getHeaderBufSize (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD *pdwInBufLen) /* out: buf size for parsing header */
+{
+ *pdwInBufLen = 0; /* no header on raw input data */
+ return IP_DONE;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * pcxEncode_getActualTraits - Parses header, and returns input & output traits
+ *
+ *****************************************************************************
+ *
+ * If depth is 1, a bilevel PCX will be encoded/decoded from/to a
+ * RASTER_BITMAP image.
+ *
+ * If depth is 4, a 16-level PCX will be encoded/decoded from/to gray data.
+ * The 4-bit gray value is in the upper nibble of each byte in the raw gray
+ * data.
+ *
+ * If depth is 8, a 256-level PCX will be encoded/decoded from/to gray data.
+ *
+ * If depth is 24, the PCX will be encoded/decoded from/to RGB data.
+ *
+\*****************************************************************************/
+
+static WORD pcxEncode_getActualTraits (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD dwInputAvail, /* in: # avail bytes in input buf */
+ PBYTE pbInputBuf, /* in: ptr to input buffer */
+ PDWORD pdwInputUsed, /* out: # bytes used from input buf */
+ PDWORD pdwInputNextPos,/* out: file-pos to read from next */
+ PIP_IMAGE_TRAITS pInTraits, /* out: input image traits */
+ PIP_IMAGE_TRAITS pOutTraits) /* out: output image traits */
+{
+ PPCX_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ /* Since there is no input header, we'll report no usage of input */
+ *pdwInputUsed = 0;
+ *pdwInputNextPos = 0;
+
+ /* Since we don't change traits, just copy out the default traits */
+ *pInTraits = g->traits;
+ *pOutTraits = g->traits;
+
+ /***************************/
+ /* Process the traits info */
+ /***************************/
+
+ g->uBytesPerPlane = (g->traits.iPixelsPerRow + 7) / 8;
+ g->uBytesPerRawRow = g->traits.iBitsPerPixel == 1
+ ? g->uBytesPerPlane
+ : g->traits.iPixelsPerRow;
+
+ PRINT (_T("pcx_encode_output_header: pixels/row=%d, n_rows=%d\n"),
+ g->traits.iPixelsPerRow, g->traits.lNumRows);
+ PRINT (_T("pcx_encode_output_header: depth=%d, uBytesPerRawRow=%d\n"),
+ g->traits.iBitsPerPixel, g->uBytesPerRawRow);
+
+ if (g->traits.iBitsPerPixel > 1)
+ IP_MEM_ALLOC (g->uBytesPerPlane*g->traits.iBitsPerPixel, g->pPlanes);
+
+ return IP_DONE | IP_READY_FOR_DATA;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/****************************************************************************\
+ *
+ * pcxEncode_getActualBufSizes - Returns buf sizes needed for remainder of job
+ *
+\****************************************************************************/
+
+static WORD pcxEncode_getActualBufSizes (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ PDWORD pdwMinInBufLen, /* out: min input buf size */
+ PDWORD pdwMinOutBufLen) /* out: min output buf size */
+{
+ PPCX_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+ *pdwMinInBufLen = g->uBytesPerRawRow;
+ *pdwMinOutBufLen = g->traits.iBitsPerPixel * g->uBytesPerPlane * 2;
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/****************************************************************************\
+ *
+ * outputHeader - Only called by pcxEncode_convert
+ *
+\****************************************************************************/
+
+static WORD outputHeader (
+ PPCX_INST g, /* in: ptr to instance structure */
+ DWORD dwOutputAvail, /* in: # avail bytes in out-buf */
+ PBYTE pbOutputBuf, /* in: ptr to out-buffer */
+ PDWORD pdwOutputUsed, /* out: # bytes written in out-buf */
+ PDWORD pdwOutputThisPos) /* out: file-pos to write the data */
+{
+ pcx_header_t *pPCXHeader;
+ PIP_IMAGE_TRAITS pTr;
+ BYTE *pal_p;
+ UINT i;
+
+ *pdwOutputThisPos = 0;
+ *pdwOutputUsed = PCX_HEADER_SIZE;
+ g->dwOutNextPos = PCX_HEADER_SIZE;
+ INSURE (dwOutputAvail >= PCX_HEADER_SIZE);
+
+ pTr = &g->traits;
+ pPCXHeader = (pcx_header_t *)pbOutputBuf;
+
+ pPCXHeader->PcxId = PCX_ID;
+ pPCXHeader->Version = PCX_VERSION;
+ pPCXHeader->EncodingMethod = 1;
+ pPCXHeader->BitsPerPixel = 1;
+ pPCXHeader->XMin = 0;
+ pPCXHeader->YMin = 0;
+ pPCXHeader->XMax = pTr->iPixelsPerRow - 1;
+ pPCXHeader->YMax = pTr->lNumRows<=0 ? 0 : pTr->lNumRows-1;
+ pPCXHeader->HorizResolution = (USHORT)(pTr->lHorizDPI>>16); /* todo: use width */
+ pPCXHeader->VertResolution = (USHORT)(pTr->lVertDPI >>16); /* and height? */
+ pPCXHeader->Reserved1 = 0;
+ pPCXHeader->ColorPlanes = pTr->iBitsPerPixel;
+ pPCXHeader->BytesPerPlane = g->uBytesPerPlane;
+
+ memset (pPCXHeader->Reserved2, 0, 60);
+
+ pal_p = pPCXHeader->PaletteInfo;
+ if (pTr->iBitsPerPixel == 1) {
+ memset (pal_p, 0, 48);
+ pal_p[3] = pal_p[4] = pal_p[5] = 255; /* 0=black, 1=white */
+ } else {
+ /* set the palette to a black-to-white gray ramp */
+ for (i=0; i<=15; i++) {
+ *pal_p++ = i << 4; /* red */
+ *pal_p++ = i << 4; /* green */
+ *pal_p++ = i << 4; /* blue */
+ }
+ }
+
+ swap_header_bytes (pPCXHeader);
+ return IP_READY_FOR_DATA;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * pcxEncode_convert - the work-horse routine
+ *
+\*****************************************************************************/
+
+static WORD pcxEncode_convert (
+ IP_XFORM_HANDLE hXform,
+ DWORD dwInputAvail, /* in: # avail bytes in in-buf */
+ PBYTE pbInputBuf, /* in: ptr to in-buffer */
+ PDWORD pdwInputUsed, /* out: # bytes used from in-buf */
+ PDWORD pdwInputNextPos, /* out: file-pos to read from next */
+ DWORD dwOutputAvail, /* in: # avail bytes in out-buf */
+ PBYTE pbOutputBuf, /* in: ptr to out-buffer */
+ PDWORD pdwOutputUsed, /* out: # bytes written in out-buf */
+ PDWORD pdwOutputThisPos) /* out: file-pos to write the data */
+{
+ PPCX_INST g;
+ UINT out_used = 0; /* init to zap stupid compiler warning */
+
+ HANDLE_TO_PTR (hXform, g);
+
+ /**** Output the Header if we haven't already ****/
+
+ if (! g->fDidHeader) {
+ g->fDidHeader = TRUE;
+ *pdwInputUsed = 0;
+ *pdwInputNextPos = 0;
+ return outputHeader (g, dwOutputAvail, pbOutputBuf,
+ pdwOutputUsed, pdwOutputThisPos);
+ }
+
+ /**** Check if we were told to flush ****/
+
+ if (pbInputBuf == NULL) {
+ PRINT (_T("pcx_encode_convert_row: Told to flush.\n"), 0, 0);
+ if (g->traits.lNumRows < 0) {
+ /* # rows wasn't known at first, so output header again
+ * now that we know the number of rows */
+ g->traits.lNumRows = g->uRowsDone;
+ *pdwInputUsed = 0;
+ *pdwInputNextPos = g->dwInNextPos;
+ return outputHeader (g, dwOutputAvail, pbOutputBuf,
+ pdwOutputUsed, pdwOutputThisPos);
+ }
+
+ *pdwInputUsed = *pdwOutputUsed = 0;
+ *pdwInputNextPos = g->dwInNextPos;
+ *pdwOutputThisPos = g->dwOutNextPos;
+ return IP_DONE;
+ }
+
+ /**** Output a Row ****/
+
+ switch (g->traits.iBitsPerPixel) {
+ case 1: out_used = encode_1 (g, pbInputBuf, pbOutputBuf);
+ break;
+
+ case 4: out_used = encode_4 (g, pbInputBuf, pbOutputBuf);
+ break;
+ #if 0
+ case 8: out_used = encode_8 (g, pbInputBuf, pbOutputBuf);
+ break;
+ #endif
+ }
+
+ INSURE (dwInputAvail >= g->uBytesPerRawRow);
+ INSURE (dwOutputAvail >= out_used);
+
+ g->dwInNextPos += g->uBytesPerRawRow;
+ *pdwInputNextPos = g->dwInNextPos;
+ *pdwInputUsed = g->uBytesPerRawRow;
+ *pdwOutputUsed = out_used;
+ *pdwOutputThisPos = g->dwOutNextPos;
+ g->dwOutNextPos += out_used;
+
+ g->uRowsDone += 1;
+
+ PRINT (_T("pcx_encode_convert_row: Returning, out used = %d\n"), out_used, 0);
+ return IP_CONSUMED_ROW | IP_PRODUCED_ROW | IP_READY_FOR_DATA;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * pcxEncode_insertedData - client inserted into our output stream
+ *
+\*****************************************************************************/
+
+static WORD pcxEncode_insertedData (
+ IP_XFORM_HANDLE hXform,
+ DWORD dwNumBytes)
+{
+ fatalBreakPoint ();
+ return IP_FATAL_ERROR; /* must never be called (can't insert data) */
+}
+
+
+
+/*****************************************************************************\
+ *
+ * pcxEncode_newPage - Tells us to flush this page, and start a new page
+ *
+\*****************************************************************************/
+
+static WORD pcxEncode_newPage (
+ IP_XFORM_HANDLE hXform)
+{
+ PPCX_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+ /* todo: return fatal error if convert is called again? */
+ return IP_DONE; /* can't insert page-breaks, so ignore this call */
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+
+}
+
+
+
+/*****************************************************************************\
+ *
+ * pcxEncode_closeXform - Destroys this instance
+ *
+\*****************************************************************************/
+
+static WORD pcxEncode_closeXform (IP_XFORM_HANDLE hXform)
+{
+ PPCX_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+ if (g->pPlanes != NULL)
+ IP_MEM_FREE (g->pPlanes);
+ g->dwValidChk = 0;
+ IP_MEM_FREE (g); /* free memory for the instance */
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * pcxEncodeTbl - Jump-table for encoder
+ *
+\*****************************************************************************/
+
+IP_XFORM_TBL pcxEncodeTbl = {
+ pcxEncode_openXform,
+ pcxEncode_setDefaultInputTraits,
+ pcxEncode_setXformSpec,
+ pcxEncode_getHeaderBufSize,
+ pcxEncode_getActualTraits,
+ pcxEncode_getActualBufSizes,
+ pcxEncode_convert,
+ pcxEncode_newPage,
+ pcxEncode_insertedData,
+ pcxEncode_closeXform
+};
+
+
+
+/*
+******************************************************************************
+******************************************************************************
+**
+**
+** D E C O D E R
+**
+**
+******************************************************************************
+******************************************************************************
+*/
+
+
+
+/*****************************************************************************\
+ *
+ * pcxDecode_openXform - Creates a new instance of the transformer
+ *
+ *****************************************************************************
+ *
+ * This returns a handle for the new instance to be passed into
+ * all subsequent calls.
+ *
+ * Return value: IP_DONE=success; IP_FATAL_ERROR=misc error.
+ *
+\*****************************************************************************/
+
+static WORD pcxDecode_openXform (
+ IP_XFORM_HANDLE *pXform) /* out: returned handle */
+{
+ return pcxEncode_openXform(pXform); /* allocs & zeroes a new instance */
+}
+
+
+
+/*****************************************************************************\
+ *
+ * pcxDecode_setDefaultInputTraits - Specifies default input image traits
+ *
+ *****************************************************************************
+ *
+ * The header of the file-type handled by the transform probably does
+ * not include *all* the image traits we'd like to know. Those not
+ * specified in the file-header are filled in from info provided by
+ * this routine.
+ *
+ * Return value: IP_DONE=success; IP_FATAL_ERROR=misc error.
+ *
+\*****************************************************************************/
+
+static WORD pcxDecode_setDefaultInputTraits (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ PIP_IMAGE_TRAITS pTraits) /* in: default image traits */
+{
+ PPCX_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+ /* the PCX header will overwrite most items in traits below */
+ g->traits = *pTraits; /* a structure copy */
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * pcxDecode_setXformSpec - Provides xform-specific information
+ *
+\*****************************************************************************/
+
+static WORD pcxDecode_setXformSpec (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD_OR_PVOID aXformInfo[]) /* in: xform information */
+{
+ PPCX_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+ /* do nothing, because we don't have any xform-specific info */
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * pcxDecode_getHeaderBufSize- Returns size of input buf needed to hold header
+ *
+\*****************************************************************************/
+
+static WORD pcxDecode_getHeaderBufSize (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD *pdwInBufLen) /* out: buf size for parsing header */
+{
+ *pdwInBufLen = PCX_HEADER_SIZE;
+ return IP_DONE;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * pcxDecode_getActualTraits - Parses header, and returns input & output traits
+ *
+\*****************************************************************************/
+
+static WORD pcxDecode_getActualTraits (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD dwInputAvail, /* in: # avail bytes in input buf */
+ PBYTE pbInputBuf, /* in: ptr to input buffer */
+ PDWORD pdwInputUsed, /* out: # bytes used from input buf */
+ PDWORD pdwInputNextPos,/* out: file-pos to read from next */
+ PIP_IMAGE_TRAITS pInTraits, /* out: input image traits */
+ PIP_IMAGE_TRAITS pOutTraits) /* out: output image traits */
+{
+ PPCX_INST g;
+ pcx_header_t *pcxhead_p;
+ PIP_IMAGE_TRAITS pTr;
+ WORD ret_val;
+
+ ret_val = IP_DONE | IP_READY_FOR_DATA;
+ HANDLE_TO_PTR (hXform, g);
+
+ INSURE (dwInputAvail >= PCX_HEADER_SIZE);
+ *pdwInputUsed = PCX_HEADER_SIZE;
+ *pdwInputNextPos = PCX_HEADER_SIZE;
+ g->dwInNextPos = PCX_HEADER_SIZE;
+
+ pcxhead_p = (pcx_header_t*)pbInputBuf;
+ pTr = &g->traits;
+
+ swap_header_bytes (pcxhead_p);
+ pTr->lNumRows = pcxhead_p->YMax - pcxhead_p->YMin + 1;
+ pTr->iPixelsPerRow = pcxhead_p->XMax - pcxhead_p->XMin + 1;
+ pTr->iBitsPerPixel = pcxhead_p->ColorPlanes;
+ pTr->lHorizDPI = (ULONG)pcxhead_p->HorizResolution << 16;
+ pTr->lVertDPI = (ULONG)pcxhead_p->VertResolution << 16;
+ pTr->iComponentsPerPixel = 1;
+ g->uBytesPerPlane = pcxhead_p->BytesPerPlane;
+ swap_header_bytes (pcxhead_p);
+
+ g->uBytesPerRawRow = pTr->iBitsPerPixel == 1
+ ? g->uBytesPerPlane
+ : g->traits.iPixelsPerRow;
+
+ if (! (pcxhead_p->PcxId == PCX_ID
+ && pTr->iPixelsPerRow > 1
+ && g->uBytesPerPlane == ((UINT)pTr->iPixelsPerRow+7)/8
+ && (pTr->iBitsPerPixel==1 || pTr->iBitsPerPixel==4)))
+ ret_val |= IP_INPUT_ERROR;
+
+ if (pTr->iBitsPerPixel > 1)
+ IP_MEM_ALLOC (g->uBytesPerPlane*pTr->iBitsPerPixel, g->pPlanes);
+
+ if (pTr->lNumRows <= 1)
+ pTr->lNumRows = -1; /* both YMax and YMin were 0; # rows is unknown */
+
+ *pInTraits = *pOutTraits = g->traits; /* structure copy */
+
+ PRINT (_T("pcx_decode_parse_header: depth=%d, n_rows=%d\n"),
+ g->traits.iBitsPerPixel, g->traits.lNumRows);
+
+ return ret_val;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/****************************************************************************\
+ *
+ * pcxDecode_getActualBufSizes - Returns buf sizes needed for remainder of job
+ *
+\****************************************************************************/
+
+static WORD pcxDecode_getActualBufSizes (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ PDWORD pdwMinInBufLen, /* out: min input buf size */
+ PDWORD pdwMinOutBufLen) /* out: min output buf size */
+{
+ PPCX_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+ *pdwMinInBufLen = g->traits.iBitsPerPixel * g->uBytesPerPlane * 2;
+ *pdwMinOutBufLen = g->uBytesPerRawRow;
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * pcxDecode_convert - the work-horse routine
+ *
+\*****************************************************************************/
+
+static WORD pcxDecode_convert (
+ IP_XFORM_HANDLE hXform,
+ DWORD dwInputAvail, /* in: # avail bytes in in-buf */
+ PBYTE pbInputBuf, /* in: ptr to in-buffer */
+ PDWORD pdwInputUsed, /* out: # bytes used from in-buf */
+ PDWORD pdwInputNextPos, /* out: file-pos to read from next */
+ DWORD dwOutputAvail, /* in: # avail bytes in out-buf */
+ PBYTE pbOutputBuf, /* in: ptr to out-buffer */
+ PDWORD pdwOutputUsed, /* out: # bytes written in out-buf */
+ PDWORD pdwOutputThisPos) /* out: file-pos to write the data */
+{
+ PPCX_INST g;
+ DWORD in_used=0;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ if (pbInputBuf == NULL) {
+ /* we are being told to flush */
+ PRINT (_T("pcx_decode_convert_row: Told to flush; doing nothing.\n"), 0, 0);
+ *pdwInputUsed = *pdwOutputUsed = 0;
+ *pdwInputNextPos = g->dwInNextPos;
+ *pdwOutputThisPos = g->dwOutNextPos;
+ return IP_DONE;
+ }
+
+ if (g->traits.lNumRows>=0 && g->uRowsDone==(UINT)g->traits.lNumRows) {
+ /* discard extra data after final row */
+ *pdwInputUsed = dwInputAvail;
+ g->dwInNextPos += dwInputAvail;
+ *pdwOutputUsed = 0;
+ *pdwInputNextPos = g->dwInNextPos;
+ *pdwOutputThisPos = g->dwOutNextPos;
+ return 0;
+ }
+
+ switch (g->traits.iBitsPerPixel) {
+ case 1: in_used = decode_1 (g, pbInputBuf, pbOutputBuf);
+ break;
+
+ case 4: in_used = decode_4 (g, pbInputBuf, pbOutputBuf);
+ break;
+ #if 0
+ case 8: in_used = decode_8 (g, pbInputBuf, pbOutputBuf);
+ break;
+ #endif
+ }
+
+ INSURE (dwInputAvail >= in_used);
+ INSURE (dwOutputAvail >= g->uBytesPerRawRow);
+
+ g->dwInNextPos += in_used;
+ *pdwInputNextPos = g->dwInNextPos;
+ *pdwInputUsed = in_used;
+ *pdwOutputUsed = g->uBytesPerRawRow;
+ *pdwOutputThisPos = g->dwOutNextPos;
+ g->dwOutNextPos += g->uBytesPerRawRow;
+
+ g->uRowsDone += 1;
+
+ PRINT (_T("pcx_decode_convert_row: Returning, in used = %d\n"), in_used, 0);
+ return IP_CONSUMED_ROW | IP_PRODUCED_ROW | IP_READY_FOR_DATA;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * pcxDecode_insertedData - client inserted into our output stream
+ *
+\*****************************************************************************/
+
+static WORD pcxDecode_insertedData (
+ IP_XFORM_HANDLE hXform,
+ DWORD dwNumBytes)
+{
+ fatalBreakPoint ();
+ return IP_FATAL_ERROR; /* must never be called (can't insert data) */
+}
+
+
+
+/*****************************************************************************\
+ *
+ * pcxDecode_newPage - Tells us to flush this page, and start a new page
+ *
+\*****************************************************************************/
+
+static WORD pcxDecode_newPage (
+ IP_XFORM_HANDLE hXform)
+{
+ PPCX_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+ /* todo: return fatal error if convert is called again? */
+ return IP_DONE; /* can't insert page-breaks, so ignore this call */
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * pcxDecode_closeXform - Destroys this instance
+ *
+\*****************************************************************************/
+
+static WORD pcxDecode_closeXform (IP_XFORM_HANDLE hXform)
+{
+ return pcxEncode_closeXform (hXform);
+}
+
+
+
+/*****************************************************************************\
+ *
+ * pcxDecodeTbl - Jump-table for Decoder
+ *
+\*****************************************************************************/
+
+IP_XFORM_TBL pcxDecodeTbl = {
+ pcxDecode_openXform,
+ pcxDecode_setDefaultInputTraits,
+ pcxDecode_setXformSpec,
+ pcxDecode_getHeaderBufSize,
+ pcxDecode_getActualTraits,
+ pcxDecode_getActualBufSizes,
+ pcxDecode_convert,
+ pcxDecode_newPage,
+ pcxDecode_insertedData,
+ pcxDecode_closeXform
+};
+
+/* End of File */
diff --git a/ip/xpnm.c b/ip/xpnm.c
new file mode 100644
index 0000000..5f814df
--- /dev/null
+++ b/ip/xpnm.c
@@ -0,0 +1,591 @@
+/* libhpojip -- HP OfficeJet image-processing library. */
+
+/* Copyright (C) 1995-2002 Hewlett-Packard Company
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ * MA 02111-1307, USA.
+ *
+ * In addition, as a special exception, Hewlett-Packard Company
+ * gives permission to link the code of this program with any
+ * version of the OpenSSL library which is distributed under a
+ * license identical to that listed in the included LICENSE.OpenSSL
+ * file, and distribute linked combinations including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * this file, you may extend this exception to your version of the
+ * file, but you are not obligated to do so. If you do not wish to
+ * do so, delete this exception statement from your version.
+ */
+
+/* Original author: David Paschal (based on Mark Overton's "xskel" template). */
+
+/******************************************************************************\
+ *
+ * xpnm.c - encoder and decoder for PNM (PBM, PGM, PPM) files
+ *
+ ******************************************************************************
+ *
+ * Name of Global Jump-Table:
+ *
+ * pnmEncodeTbl = the encoder.
+ * pnmDecodeTbl = the decoder.
+ *
+ * Items in aXformInfo array passed into setXformSpec:
+ *
+ * None.
+ *
+ * Capabilities and Limitations:
+ *
+ * Handles 1, 8, and 24 bits per pixel.
+ *
+ * Default Input Traits, and Output Traits:
+ *
+ * trait default input output
+ * ------------------- --------------------- ------------------------
+ * iPixelsPerRow * passed into output same as default input
+ * iBitsPerPixel * passed into output same as default input
+ * iComponentsPerPixel * passed into output same as default input
+ * lHorizDPI passed into output same as default input
+ * lVertDPI passed into output same as default input
+ * lNumRows passed into output same as default input
+ * iNumPages passed into output same as default input
+ * iPageNum passed into output same as default input
+ *
+ * Above, a "*" by an item indicates it must be valid (not negative).
+ *
+\******************************************************************************/
+
+#include "hpip.h"
+#include "ipdefs.h"
+#include "string.h" /* for memset and memcpy */
+#include <stdio.h>
+
+
+#if 0
+ #include "stdio.h"
+ #include <tchar.h>
+ #define PRINT(msg,arg1,arg2) \
+ _ftprintf(stderr, msg, (int)arg1, (int)arg2)
+#else
+ #define PRINT(msg,arg1,arg2)
+#endif
+
+#define CHECK_VALUE 0x4ba1dace
+
+#define FUNC_STATUS static
+
+typedef struct {
+ IP_IMAGE_TRAITS traits; /* traits of the input and output image */
+ DWORD dwBytesPerRow; /* # of bytes in each row */
+ DWORD dwRowsDone; /* number of rows converted so far */
+ DWORD dwInNextPos; /* file pos for subsequent input */
+ DWORD dwOutNextPos; /* file pos for subsequent output */
+ DWORD dwValidChk; /* struct validity check value */
+ BOOL fIsEncode; /* false=decode, true=encode */
+ BOOL fDidHeader; /* already sent/processed the header? */
+} PNM_INST, *PPNM_INST;
+
+#define MAX_DECODE_HEADER_SIZE 4096
+#define MAX_ENCODE_HEADER_SIZE 128
+
+
+
+/*****************************************************************************\
+ *
+ * pnm{De,En}code_openXform - Creates a new instance of the transformer
+ *
+ *****************************************************************************
+ *
+ * This returns a handle for the new instance to be passed into
+ * all subsequent calls.
+ *
+ * Return value: IP_DONE=success; IP_FATAL_ERROR=misc error.
+ *
+\*****************************************************************************/
+
+FUNC_STATUS WORD pnmDecode_openXform (
+ IP_XFORM_HANDLE *pXform) /* out: returned handle */
+{
+ PPNM_INST g;
+
+ INSURE (pXform != NULL);
+ IP_MEM_ALLOC (sizeof(PNM_INST), g);
+ *pXform = g;
+ memset (g, 0, sizeof(PNM_INST));
+ g->dwValidChk = CHECK_VALUE;
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+FUNC_STATUS WORD pnmEncode_openXform (
+ IP_XFORM_HANDLE *pXform) /* out: returned handle */
+{
+ WORD wResult=pnmDecode_openXform(pXform);
+ if (wResult==IP_DONE) {
+ PPNM_INST g;
+
+ HANDLE_TO_PTR (*pXform, g);
+
+ g->dwOutNextPos=MAX_ENCODE_HEADER_SIZE;
+ g->fIsEncode=TRUE;
+ }
+ return wResult;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+/*****************************************************************************\
+ *
+ * pnm_setDefaultInputTraits - Specifies default input image traits
+ *
+ *****************************************************************************
+ *
+ * The header of the file-type handled by the transform probably does
+ * not include *all* the image traits we'd like to know. Those not
+ * specified in the file-header are filled in from info provided by
+ * this routine.
+ *
+ * Return value: IP_DONE=success; IP_FATAL_ERROR=misc error.
+ *
+\*****************************************************************************/
+
+FUNC_STATUS WORD pnm_setDefaultInputTraits (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ PIP_IMAGE_TRAITS pTraits) /* in: default image traits */
+{
+ PPNM_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ g->traits = *pTraits; /* a structure copy */
+ if (g->fIsEncode) {
+ /* insure that traits we care about are known */
+ INSURE (pTraits->iPixelsPerRow>0 && pTraits->iBitsPerPixel>0);
+ g->dwBytesPerRow = (g->traits.iPixelsPerRow*g->traits.iBitsPerPixel + 7) / 8;
+ }
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * pnm_setXformSpec - Provides xform-specific information
+ *
+\*****************************************************************************/
+
+FUNC_STATUS WORD pnm_setXformSpec (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD_OR_PVOID aXformInfo[]) /* in: xform information */
+{
+ PPNM_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ /* Check your options in aXformInfo here, and save them.
+ * Use the INSURE macro like you'd use assert. INSURE jumps to
+ * fatal_error below if it fails.
+ */
+
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * pnm_getHeaderBufSize- Returns size of input buf needed to hold header
+ *
+\*****************************************************************************/
+
+FUNC_STATUS WORD pnm_getHeaderBufSize (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD *pdwInBufLen) /* out: buf size for parsing header */
+{
+ PPNM_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ if (!g->fIsEncode) {
+ *pdwInBufLen = MAX_DECODE_HEADER_SIZE;
+ } else {
+ /* since input is raw pixels, there is no header, so set it to zero */
+ *pdwInBufLen = 0;
+ }
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * pnm_getActualTraits - Parses header, and returns input & output traits
+ *
+\*****************************************************************************/
+
+#define PEEK_CHAR(pc) \
+ do { \
+ if (*pdwInputUsed>=dwInputAvail) { \
+ return IP_INPUT_ERROR; \
+ } \
+ *(pc)=pbInputBuf[*pdwInputUsed]; \
+ } while (0)
+
+#define NEXT_CHAR ((*pdwInputUsed)++)
+
+#define GET_CHAR(pc) \
+ do { \
+ PEEK_CHAR(pc); \
+ NEXT_CHAR; \
+ } while (0)
+
+#define SKIP_WS \
+ do { \
+ unsigned char c; \
+ PEEK_CHAR(&c); \
+ if (c=='#') { \
+ /* NEXT_CHAR; */ \
+ do { \
+ GET_CHAR(&c); \
+ } while (c!='\n'); \
+ PEEK_CHAR(&c); \
+ } \
+ if (c>' ') break; \
+ NEXT_CHAR; \
+ } while (42)
+
+#define GET_INT(pi) \
+ do { \
+ unsigned char c; \
+ *(pi)=0; \
+ SKIP_WS; \
+ while (42) { \
+ GET_CHAR(&c); \
+ c-='0'; \
+ if (c>9) { \
+ break; \
+ } \
+ *(pi)=(*(pi)*10)+c; \
+ } \
+ } while (0)
+
+FUNC_STATUS WORD pnm_getActualTraits (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD dwInputAvail, /* in: # avail bytes in input buf */
+ PBYTE pbInputBuf, /* in: ptr to input buffer */
+ PDWORD pdwInputUsed, /* out: # bytes used from input buf */
+ PDWORD pdwInputNextPos,/* out: file-pos to read from next */
+ PIP_IMAGE_TRAITS pInTraits, /* out: input image traits */
+ PIP_IMAGE_TRAITS pOutTraits) /* out: output image traits */
+{
+ PPNM_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ /* If there is no header, we'll report no usage of input */
+ *pdwInputUsed = 0;
+
+ /* Parse the header for decode operations. */
+ if (!g->fIsEncode) {
+ unsigned char c;
+ unsigned int maxval;
+
+ GET_CHAR(&c);
+ if (c!='P') {
+ return IP_INPUT_ERROR;
+ }
+ GET_CHAR(&c);
+ if (c=='4') {
+ /* PBM */
+ g->traits.iComponentsPerPixel=1;
+ g->traits.iBitsPerPixel=1;
+
+ } else if (c=='5') {
+ /* PGM */
+ g->traits.iComponentsPerPixel=1;
+ g->traits.iBitsPerPixel=0;
+
+ } else if (c=='6') {
+ /* PPM */
+ g->traits.iComponentsPerPixel=3;
+ g->traits.iBitsPerPixel=0;
+
+ } else {
+ /* "Plain" (all-ASCII) formats (1-3) not (yet) supported. */
+ return IP_INPUT_ERROR;
+ }
+
+ GET_INT(&g->traits.iPixelsPerRow);
+ GET_INT(&g->traits.lNumRows);
+ if (!g->traits.iBitsPerPixel) {
+ GET_INT(&maxval);
+ while (maxval) {
+ g->traits.iBitsPerPixel++;
+ maxval>>=1;
+ }
+ }
+ g->traits.iBitsPerPixel*=g->traits.iComponentsPerPixel;
+ g->dwBytesPerRow = (g->traits.iPixelsPerRow*g->traits.iBitsPerPixel + 7) / 8;
+ }
+
+ *pdwInputNextPos = *pdwInputUsed;
+ g->dwInNextPos = *pdwInputUsed;
+
+ *pInTraits = g->traits; /* structure copies */
+ *pOutTraits = g->traits;
+
+ return IP_DONE | IP_READY_FOR_DATA;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/****************************************************************************\
+ *
+ * pnm_getActualBufSizes - Returns buf sizes needed for remainder of job
+ *
+\****************************************************************************/
+
+FUNC_STATUS WORD pnm_getActualBufSizes (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ PDWORD pdwMinInBufLen, /* out: min input buf size */
+ PDWORD pdwMinOutBufLen) /* out: min output buf size */
+{
+ PPNM_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ *pdwMinInBufLen = *pdwMinOutBufLen = g->dwBytesPerRow;
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * pnm_convert - Converts one row
+ *
+\*****************************************************************************/
+
+FUNC_STATUS WORD pnm_convert (
+ IP_XFORM_HANDLE hXform,
+ DWORD dwInputAvail, /* in: # avail bytes in in-buf */
+ PBYTE pbInputBuf, /* in: ptr to in-buffer */
+ PDWORD pdwInputUsed, /* out: # bytes used from in-buf */
+ PDWORD pdwInputNextPos, /* out: file-pos to read from next */
+ DWORD dwOutputAvail, /* in: # avail bytes in out-buf */
+ PBYTE pbOutputBuf, /* in: ptr to out-buffer */
+ PDWORD pdwOutputUsed, /* out: # bytes written in out-buf */
+ PDWORD pdwOutputThisPos) /* out: file-pos to write the data */
+{
+ PPNM_INST g;
+ int nBytes;
+ PBYTE pIn, pOut;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ /**** Check if we were told to flush ****/
+
+ if (pbInputBuf == NULL) {
+ PRINT (_T("pnm_convert: Told to flush.\n"), 0, 0);
+ *pdwInputUsed = *pdwOutputUsed = 0;
+ *pdwInputNextPos = g->dwInNextPos;
+ *pdwOutputThisPos = g->dwOutNextPos;
+ if (g->fIsEncode && !g->fDidHeader) {
+ BYTE buffer[MAX_ENCODE_HEADER_SIZE];
+ DWORD maxval=(2<<((g->traits.iBitsPerPixel/
+ g->traits.iComponentsPerPixel)-1))-1;
+ int len;
+
+ INSURE(dwOutputAvail>=MAX_ENCODE_HEADER_SIZE);
+
+ memset(pbOutputBuf,' ',MAX_ENCODE_HEADER_SIZE);
+ pbOutputBuf[0]='P';
+ if (g->traits.iComponentsPerPixel==1) {
+ if (maxval==1) {
+ pbOutputBuf[1]='4';
+ } else {
+ pbOutputBuf[1]='5';
+ }
+ } else if (g->traits.iComponentsPerPixel==3) {
+ pbOutputBuf[1]='6';
+ } else {
+ goto fatal_error;
+ }
+
+ snprintf((char *)buffer,MAX_ENCODE_HEADER_SIZE,"\n%d %d\n",
+ g->traits.iPixelsPerRow,g->dwRowsDone);
+ if (g->traits.iComponentsPerPixel>1 || maxval>1) {
+ buffer[MAX_ENCODE_HEADER_SIZE-1]=0;
+ len=strlen((char *)buffer);
+ snprintf((char *)buffer+len,MAX_ENCODE_HEADER_SIZE-len,
+ "%d\n",maxval);
+ }
+
+ buffer[MAX_ENCODE_HEADER_SIZE-1]=0;
+ len=strlen((char *)buffer);
+ memcpy(pbOutputBuf+MAX_ENCODE_HEADER_SIZE-len,buffer,len);
+
+ *pdwOutputUsed=MAX_ENCODE_HEADER_SIZE;
+ *pdwOutputThisPos=0;
+ g->dwOutNextPos=MAX_ENCODE_HEADER_SIZE;
+ g->fDidHeader=1;
+ }
+ return IP_DONE;
+ }
+
+ /**** Output a Row ****/
+
+ nBytes = g->dwBytesPerRow;
+ INSURE (dwInputAvail >= (DWORD)nBytes );
+ INSURE (dwOutputAvail >= (DWORD)nBytes);
+
+ pIn = pbInputBuf;
+ pOut = pbOutputBuf;
+
+ /* At this point, pIn is your input buffer, and pOut is your output buffer.
+ * Do whatever you are going to do here.
+ */
+ memcpy(pOut,pIn,nBytes);
+
+ *pdwInputUsed = nBytes;
+ g->dwInNextPos += nBytes;
+ *pdwInputNextPos = g->dwInNextPos;
+
+ *pdwOutputUsed = nBytes;
+ *pdwOutputThisPos = g->dwOutNextPos;
+ g->dwOutNextPos += nBytes;
+
+ g->dwRowsDone += 1;
+
+ return IP_CONSUMED_ROW | IP_PRODUCED_ROW | IP_READY_FOR_DATA;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * pnm_insertedData - client inserted into our output stream
+ *
+\*****************************************************************************/
+
+FUNC_STATUS WORD pnm_insertedData (
+ IP_XFORM_HANDLE hXform,
+ DWORD dwNumBytes)
+{
+ fatalBreakPoint ();
+ return IP_FATAL_ERROR; /* must never be called (can't insert data) */
+}
+
+
+
+/*****************************************************************************\
+ *
+ * pnm_newPage - Tells us to flush this page, and start a new page
+ *
+\*****************************************************************************/
+
+FUNC_STATUS WORD pnm_newPage (
+ IP_XFORM_HANDLE hXform)
+{
+ PPNM_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+ /* todo: return fatal error if convert is called again? */
+ return IP_DONE; /* can't insert page-breaks, so ignore this call */
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+
+}
+
+
+
+/*****************************************************************************\
+ *
+ * pnm_closeXform - Destroys this instance
+ *
+\*****************************************************************************/
+
+FUNC_STATUS WORD pnm_closeXform (IP_XFORM_HANDLE hXform)
+{
+ PPNM_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ g->dwValidChk = 0;
+ IP_MEM_FREE (g); /* free memory for the instance */
+
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * pnmTbl - Jump-table for transform driver
+ *
+\*****************************************************************************/
+IP_XFORM_TBL pnmDecodeTbl = {
+ pnmDecode_openXform,
+ pnm_setDefaultInputTraits,
+ pnm_setXformSpec,
+ pnm_getHeaderBufSize,
+ pnm_getActualTraits,
+ pnm_getActualBufSizes,
+ pnm_convert,
+ pnm_newPage,
+ pnm_insertedData,
+ pnm_closeXform
+};
+
+IP_XFORM_TBL pnmEncodeTbl = {
+ pnmEncode_openXform,
+ pnm_setDefaultInputTraits,
+ pnm_setXformSpec,
+ pnm_getHeaderBufSize,
+ pnm_getActualTraits,
+ pnm_getActualBufSizes,
+ pnm_convert,
+ pnm_newPage,
+ pnm_insertedData,
+ pnm_closeXform
+};
+
+/* End of File */
diff --git a/ip/xrotate.c b/ip/xrotate.c
new file mode 100644
index 0000000..130b05a
--- /dev/null
+++ b/ip/xrotate.c
@@ -0,0 +1,819 @@
+/* libhpojip -- HP OfficeJet image-processing library. */
+
+/* Copyright (C) 1995-2002 Hewlett-Packard Company
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ * MA 02111-1307, USA.
+ *
+ * In addition, as a special exception, Hewlett-Packard Company
+ * gives permission to link the code of this program with any
+ * version of the OpenSSL library which is distributed under a
+ * license identical to that listed in the included LICENSE.OpenSSL
+ * file, and distribute linked combinations including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * this file, you may extend this exception to your version of the
+ * file, but you are not obligated to do so. If you do not wish to
+ * do so, delete this exception statement from your version.
+ */
+
+/* Original author: Mark Overton and others.
+ *
+ * Ported to Linux by David Paschal.
+ */
+
+/******************************************************************************\
+ *
+ * xrotate.c - Rotates the image
+ *
+ * Mark Overton, Feb 2000
+ *
+ ******************************************************************************
+ *
+ * Imagine a rotated rectangle contained somewhere within the input image, or
+ * even partially outside the input image. This xform outputs that rectangle
+ * unrotated. This xform crops out all image-area outside the rotated rectangle,
+ * and white-fills any part of the rectangle outside the image-area. It is
+ * intended for procuring a selected portion of a scan.
+ *
+ * A rotated rectangle is specified using three points in the input image.
+ * Depending on the orientation of these points, horizontal and/or vertical
+ * flipping can be performed, as well as rotation by any angle.
+ *
+ * Scaling is also performed. The interpolation for rotation also does the
+ * scaling in the same step, resulting in higher quality output than the usual
+ * use of separate rotation and scaling, as well as being faster.
+ *
+ * Rotation can be fast or slow, depending on an aXformInfo flag. If slow,
+ * interpolation (anti-aliasing) is done with superb results. If fast, the
+ * results have jaggies.
+ *
+ * Name of Global Jump-Table:
+ *
+ * rotateTbl
+ *
+ * Items in aXformInfo array passed into setXformSpec:
+ *
+ * aXformInfo[IP_ROTATE_UPPER_LEFT] = [xUL,yUL] = pos of upper-left corner of rotated rect
+ * aXformInfo[IP_ROTATE_UPPER_RIGHT] = [xUR,yUR] = pos of upper-right corner of rotated rect
+ * aXformInfo[IP_ROTATE_LOWER_LEFT] = [xLL,yLL] = pos of lower-left corner of rotated rect
+ * aXformInfo[IP_ROTATE_OUTPUT_SIZE] = [outWidth,outHeight] = size of output image (0 = no scaling)
+ * aXformInfo[IP_ROTATE_FAST] = rotate fast? (0=no=interpolated, 1=yes=jaggy)
+ *
+ * The coordinates (xUL,yUL) are in relation to the *input* image (Y increases
+ * downward), and locates what will be the upper-left corner in the output
+ * (before scaling). The other two points are defined similarly. If UL is to
+ * the right of UR, the output image is flipped horizontally. Vertical flipping
+ * can be done similarly.
+ * This rectangle is then scaled to produce outWidth and outHeight pixels.
+ *
+ * Capabilities and Limitations:
+ *
+ * Crops, white-pads, rotates by any angle, scales, mirrors, and flips vertically.
+ * Input data may be 1 bit/pixel, or any multiple of 8 bits/pixel.
+ * Internally, the miniumum amount of memory required for the rotation is
+ * allocated. For small angles, internal allocation will be very small.
+ *
+ * Default Input Traits, and Output Traits:
+ *
+ * trait default input output
+ * ------------------- --------------------- ------------------------
+ * iPixelsPerRow * width of scan abs(outWidth)
+ * iBitsPerPixel * 1, or n*8 same as default input
+ * iComponentsPerPixel passed into output same as default input
+ * lHorizDPI passed into output same as default input
+ * lVertDPI passed into output same as default input
+ * lNumRows * height of scan abs(outHeight)
+ * iNumPages passed into output same as default input
+ * iPageNum passed into output same as default input
+ *
+ * Above, a "*" by an item indicates it must be valid (not negative).
+ *
+\******************************************************************************/
+
+/* Use the #define below if this transform will exist in a dll outside of the */
+/* image pipeline. This will allow the functions to be exported. */
+/* #define EXPORT_TRANFORM 1 */
+
+#include "hpip.h"
+#include "ipdefs.h"
+#include "string.h" /* for memset and memcpy */
+#include "math.h" /* for sqrt */
+
+
+#if 0
+ #include "stdio.h"
+ #include <tchar.h>
+ #define PRINT(msg,arg1,arg2) \
+ _ftprintf(stderr, msg, (int)arg1, (int)arg2)
+#else
+ #define PRINT(msg,arg1,arg2)
+#endif
+
+#define CHECK_VALUE 0x4ba1dace
+
+#ifdef EXPORT_TRANSFORM
+#define FUNC_STATUS __declspec (dllexport)
+#else
+#define FUNC_STATUS static
+#endif
+
+typedef struct {
+ IP_IMAGE_TRAITS inTraits; /* traits of the input image */
+ IP_IMAGE_TRAITS outTraits; /* traits of the output image */
+
+ // Items from aXformInfo:
+ int xUL, yUL; /* UL corner of image */
+ int xUR, yUR; /* UR corner of image */
+ int xLL, yLL; /* LL corner of image */
+ int xLR, yLR; /* LR corner of image (computed) */
+ int iOutWidth; /* width of output image */
+ int iOutHeight; /* height of output image */
+ BOOL bRotateFast; /* rotate fast? (produces worse jaggies) */
+
+ int hSlopeDx, hSlopeDy; /* input-change for moving right 1 pix in output (16.16) */
+ int vSlopeDx, vSlopeDy; /* input-change for moving down 1 pix in output (16.16) */
+ int xLeft, yLeft; /* current left-end of row (input coords) (16.16) */
+ int xRight, yRight; /* current right-end of row (input coords) (16.16) */
+ BYTE *pStrip; /* strip with a portion of input image */
+ BYTE *pStripAfter; /* ptr to 1st byte after the strip-buffer */
+ int stripIndexYTop; /* row-index of stripYTop in the strip */
+ int stripYTop; /* Y-value for topmost row in strip */
+ int stripYBottom; /* Y-value for bottommost row in strip */
+ int stripRows; /* number of rows allocated in the strip */
+ int stripLoaded; /* number of rows actually loaded into the strip */
+ int stripSize; /* number of bytes allocated in the strip */
+ int stripBytesPerRow; /* bytes/row in strip */
+ int inBytesPerRow; /* bytes/row of input image */
+ int outBytesPerRow; /* bytes/row of output image */
+ int bytesPerPixel; /* bytes/pixel (=1 for bilevel; 1 pixel in each byte) */
+ DWORD dwRowsSent; /* number of rows output so far */
+ DWORD dwInNextPos; /* file pos for subsequent input */
+ DWORD dwOutNextPos; /* file pos for subsequent output */
+ DWORD dwValidChk; /* struct validity check value */
+} ROTATE_INST, *PROTATE_INST;
+
+
+
+/*****************************************************************************\
+ *
+ * rotate_openXform - Creates a new instance of the transformer
+ *
+ *****************************************************************************
+ *
+ * This returns a handle for the new instance to be passed into
+ * all subsequent calls.
+ *
+ * Return value: IP_DONE=success; IP_FATAL_ERROR=misc error.
+ *
+\*****************************************************************************/
+
+FUNC_STATUS WORD rotate_openXform (
+ IP_XFORM_HANDLE *pXform) /* out: returned handle */
+{
+ PROTATE_INST g;
+
+ INSURE (pXform != NULL);
+ IP_MEM_ALLOC (sizeof(ROTATE_INST), g);
+ *pXform = g;
+ memset (g, 0, sizeof(ROTATE_INST));
+ g->dwValidChk = CHECK_VALUE;
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * rotate_setDefaultInputTraits - Specifies default input image traits
+ *
+ *****************************************************************************
+ *
+ * The header of the file-type handled by the transform probably does
+ * not include *all* the image traits we'd like to know. Those not
+ * specified in the file-header are filled in from info provided by
+ * this routine.
+ *
+ * Return value: IP_DONE=success; IP_FATAL_ERROR=misc error.
+ *
+\*****************************************************************************/
+
+FUNC_STATUS WORD rotate_setDefaultInputTraits (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ PIP_IMAGE_TRAITS pTraits) /* in: default image traits */
+{
+ PROTATE_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ /* insure that traits we care about are known */
+ INSURE (pTraits->iPixelsPerRow > 0 &&
+ pTraits->lNumRows > 0 &&
+ pTraits->iBitsPerPixel > 0);
+ g->inTraits = *pTraits; /* a structure copy */
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * rotate_setXformSpec - Provides xform-specific information
+ *
+\*****************************************************************************/
+
+FUNC_STATUS WORD rotate_setXformSpec (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD_OR_PVOID aXformInfo[]) /* in: xform information */
+{
+ PROTATE_INST g;
+ int i;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ i = aXformInfo[IP_ROTATE_UPPER_LEFT].dword;
+ g->xUL = i >> 16;
+ g->yUL = i & 0xFFFF;
+
+ i = aXformInfo[IP_ROTATE_UPPER_RIGHT].dword;
+ g->xUR = i >> 16;
+ g->yUR = i & 0xFFFF;
+
+ i = aXformInfo[IP_ROTATE_LOWER_LEFT].dword;
+ g->xLL = i >> 16;
+ g->yLL = i & 0xFFFF;
+
+ i = aXformInfo[IP_ROTATE_OUTPUT_SIZE].dword;
+ g->iOutWidth = i >> 16;
+ g->iOutHeight = i & 0xFFFF;
+
+ g->bRotateFast = aXformInfo[IP_ROTATE_FAST].dword == 1;
+
+ INSURE (g->iOutWidth>=0 && g->iOutHeight>=0);
+ g->xLR = g->xUR + (g->xLL - g->xUL);
+ g->yLR = g->yUR + (g->yLL - g->yUL);
+
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * rotate_getHeaderBufSize - Returns size of input buf needed to hold header
+ *
+\*****************************************************************************/
+
+FUNC_STATUS WORD rotate_getHeaderBufSize (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD *pdwInBufLen) /* out: buf size for parsing header */
+{
+ /* since input is raw pixels, there is no header, so set it to zero */
+ *pdwInBufLen = 0;
+ return IP_DONE;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * rotate_getActualTraits - Parses header, and returns input & output traits
+ *
+\*****************************************************************************/
+
+FUNC_STATUS WORD rotate_getActualTraits (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD dwInputAvail, /* in: # avail bytes in input buf */
+ PBYTE pbInputBuf, /* in: ptr to input buffer */
+ PDWORD pdwInputUsed, /* out: # bytes used from input buf */
+ PDWORD pdwInputNextPos,/* out: file-pos to read from next */
+ PIP_IMAGE_TRAITS pIntraits, /* out: input image traits */
+ PIP_IMAGE_TRAITS pOutTraits) /* out: output image traits */
+{
+ PROTATE_INST g;
+ int dxH, dyH, dxV, dyV;
+ double rotWidthSq, rotHeightSq, rotWidth, rotHeight;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ /***** Compute Output Traits (and rotation variables) *****/
+
+ memcpy (&g->outTraits, &g->inTraits, sizeof(IP_IMAGE_TRAITS));
+
+ dxH = g->xUR - g->xUL;
+ dyH = g->yUR - g->yUL;
+ dxV = g->xLL - g->xUL;
+ dyV = g->yLL - g->yUL;
+
+ rotWidthSq = dxH*dxH + dyH*dyH;
+ rotWidth = sqrt (rotWidthSq);
+ rotHeightSq = dxV*dxV + dyV*dyV;
+ rotHeight = sqrt (rotHeightSq);
+ INSURE (rotWidth>0.0 && rotHeight>0.0);
+
+ if (g->iOutWidth == 0)
+ g->iOutWidth = (int)(rotWidth+0.5);
+ if (g->iOutHeight == 0)
+ g->iOutHeight = (int)(rotHeight+0.5);
+
+ g->outTraits.iPixelsPerRow = g->iOutWidth;
+ g->outTraits.lNumRows = g->iOutHeight;
+
+ g->bytesPerPixel = g->inTraits.iBitsPerPixel / 8;
+ if (g->bytesPerPixel == 0)
+ g->bytesPerPixel = 1; /* bi-level is expanded to one byte/pixel */
+
+ g->inBytesPerRow = (g->inTraits.iPixelsPerRow*g->inTraits.iBitsPerPixel + 7) / 8;
+ g->outBytesPerRow = (g->iOutWidth *g->inTraits.iBitsPerPixel + 7) / 8;
+
+ g->hSlopeDx = (dxH << 16) / g->iOutWidth;
+ g->hSlopeDy = (dyH << 16) / g->iOutWidth;
+ g->vSlopeDx = (dxV << 16) / g->iOutHeight;
+ g->vSlopeDy = (dyV << 16) / g->iOutHeight;
+
+ /* we start outputting at the upper-left corner of output-image */
+ /* do NOT add 0x8000 because when we're not scaling or rotating,
+ * it causes each pair of rows and each pair of columns to be
+ * averaged together, losing sharpness. */
+ g->xLeft = g->xUL << 16;
+ g->yLeft = g->yUL << 16;
+ g->xRight = g->xUR << 16;
+ g->yRight = g->yUR << 16;
+
+ /* set-up the strip-buffer */
+ g->stripBytesPerRow = g->inTraits.iPixelsPerRow * g->bytesPerPixel;
+ g->stripIndexYTop = 0;
+ g->stripYTop = 0;
+ g->stripYBottom = -1;
+ g->stripLoaded = 0;
+ if (g->vSlopeDy < 0) /* we'll proceed *upward* thru the input image */
+ g->stripRows = IP_MAX(g->yUL, g->yUR) - IP_MIN(g->yLL, g->yLR) + 1;
+ else /* normal case of proceeding *downward* */
+ g->stripRows = IP_MAX(g->yUL, g->yUR) - IP_MIN(g->yUL, g->yUR) + 1;
+ g->stripRows += 2; /* allocate extra row on top & bottom for interpolation */
+ g->stripSize = g->stripRows * g->stripBytesPerRow;
+ IP_MEM_ALLOC (g->stripSize, g->pStrip);
+ g->pStripAfter = g->pStrip + g->stripSize;
+
+ /***** Return Values *****/
+
+ /* Since there is no header, we'll report no usage of input */
+ *pdwInputUsed = 0;
+ *pdwInputNextPos = 0;
+
+ *pIntraits = g->inTraits; /* structure copies */
+ *pOutTraits = g->outTraits;
+
+ return IP_DONE | IP_READY_FOR_DATA;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/****************************************************************************\
+ *
+ * rotate_getActualBufSizes - Returns buf sizes needed for remainder of job
+ *
+\****************************************************************************/
+
+FUNC_STATUS WORD rotate_getActualBufSizes (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ PDWORD pdwMinInBufLen, /* out: min input buf size */
+ PDWORD pdwMinOutBufLen) /* out: min output buf size */
+{
+ PROTATE_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ *pdwMinInBufLen = g->inBytesPerRow;
+ *pdwMinOutBufLen = g->outBytesPerRow;
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * rotate_convert - Converts one row
+ *
+\*****************************************************************************/
+
+
+
+/* ExpandBilevelRow - Expands 8 bits/pixel (input) to 1 byte/pixel (output) */
+static void ExpandBilevelRow (
+ PBYTE pDest,
+ PBYTE pSrc,
+ int nPixels)
+{
+ BYTE mask, inbyte=0;
+
+ mask = 0;
+
+ while (nPixels > 0) {
+ if (mask == 0) {
+ mask = 0x80u;
+ inbyte = *pSrc++;
+ }
+ *pDest++ = inbyte & mask ? 0 : 255;
+ mask >>= 1;
+ nPixels -= 1;
+ }
+}
+
+
+
+FUNC_STATUS WORD rotate_convert (
+ IP_XFORM_HANDLE hXform,
+ DWORD dwInputAvail, /* in: # avail bytes in in-buf */
+ PBYTE pbInputBuf, /* in: ptr to in-buffer */
+ PDWORD pdwInputUsed, /* out: # bytes used from in-buf */
+ PDWORD pdwInputNextPos, /* out: file-pos to read from next */
+ DWORD dwOutputAvail, /* in: # avail bytes in out-buf */
+ PBYTE pbOutputBuf, /* in: ptr to out-buffer */
+ PDWORD pdwOutputUsed, /* out: # bytes written in out-buf */
+ PDWORD pdwOutputThisPos) /* out: file-pos to write the data */
+{
+ // We need another row if the Y of either endpoint of the current rotated row
+ // is below the bottom of the strip.
+ #define NEED_MORE \
+ ((g->yLeft >>16) >= g->stripYBottom || (g->yRight>>16) >= g->stripYBottom)
+
+ PROTATE_INST g;
+ PBYTE pSrc, pDest;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ *pdwInputUsed = *pdwOutputUsed = 0;
+ *pdwInputNextPos = g->dwInNextPos;
+ *pdwOutputThisPos = g->dwOutNextPos;
+
+ /**** Check if we were told to flush ****/
+
+ if (pbInputBuf == NULL) {
+ PRINT (_T("rotate_convert: Told to flush.\n"), 0, 0);
+ dwInputAvail = (DWORD)g->inBytesPerRow;
+ if ((long)g->dwRowsSent >= g->outTraits.lNumRows)
+ return IP_DONE;
+ }
+
+ /**** Initial load of strip-buffer ****/
+
+ if (g->stripLoaded < g->stripRows) {
+ if (dwInputAvail == 0)
+ return IP_READY_FOR_DATA;
+ INSURE (dwInputAvail >= (DWORD)g->inBytesPerRow);
+ pDest = g->pStrip + g->stripBytesPerRow*g->stripLoaded;
+ if (g->inTraits.iBitsPerPixel == 1)
+ ExpandBilevelRow (pDest, pbInputBuf, g->inTraits.iPixelsPerRow);
+ else if (pbInputBuf == NULL)
+ memcpy (pDest, pDest - g->stripBytesPerRow, g->stripBytesPerRow);
+ else
+ memcpy (pDest, pbInputBuf, g->stripBytesPerRow);
+ g->stripLoaded += 1;
+ g->stripYBottom += 1;
+ if (g->stripLoaded == 1) {
+ /* first row is *above* top for interpolation; replicate it */
+ memcpy (g->pStrip+g->stripBytesPerRow, g->pStrip, g->stripBytesPerRow);
+ g->stripLoaded += 1;
+ g->stripYBottom += 1;
+ }
+ if (pbInputBuf == NULL)
+ return 0; /* wait for next call to replicate another row and start rotation */
+ *pdwInputUsed = (DWORD)g->inBytesPerRow;
+ g->dwInNextPos += (DWORD)g->inBytesPerRow;
+ *pdwInputNextPos = g->dwInNextPos;
+ return ((g->stripLoaded<g->stripRows || NEED_MORE) ? IP_READY_FOR_DATA : 0)
+ | IP_CONSUMED_ROW;
+ }
+
+ /**** Load next row into strip-buffer ****/
+
+ if (NEED_MORE)
+ {
+ /* we need to load a row into the strip-buffer (a wrapping load) */
+ if (dwInputAvail == 0)
+ return IP_READY_FOR_DATA;
+ INSURE (dwInputAvail >= (DWORD)g->inBytesPerRow);
+ pDest = g->pStrip + g->stripBytesPerRow*g->stripIndexYTop;
+ if (pbInputBuf == NULL) // then white-fill the row
+ memset (pDest, 255, g->stripBytesPerRow);
+ else if (g->inTraits.iBitsPerPixel == 1)
+ ExpandBilevelRow (pDest, pbInputBuf, g->inTraits.iPixelsPerRow);
+ else
+ memcpy (pDest, pbInputBuf, g->stripBytesPerRow);
+ g->stripIndexYTop = (g->stripIndexYTop + 1) % g->stripRows;
+ g->stripYTop += 1;
+ g->stripYBottom += 1;
+ if (pbInputBuf != NULL) {
+ *pdwInputUsed = (DWORD)g->inBytesPerRow;
+ g->dwInNextPos += (DWORD)g->inBytesPerRow;
+ *pdwInputNextPos = g->dwInNextPos;
+ }
+ }
+
+ /**** Output a row ****/
+
+ if ((long)g->dwRowsSent >= g->outTraits.lNumRows)
+ {
+ /* we've outputted all rows; discard any further input */
+ g->stripYBottom = -100000; /* forces strip-loading logic to keep loading */
+ }
+ else if (! NEED_MORE)
+ {
+ int rowIndex, iPix;
+ int xcur,ycur, xint,yint;
+ unsigned xfrac,yfrac;
+ PBYTE pNextRow;
+ BYTE mask;
+
+ INSURE (dwOutputAvail >= (DWORD)g->outBytesPerRow);
+
+ pDest = pbOutputBuf;
+ xcur = g->xLeft;
+ ycur = g->yLeft;
+
+ /* These two lines set-up bi-level packing: */
+ *pDest = 0;
+ mask = 0x80u;
+
+ for (iPix=0; iPix<g->outTraits.iPixelsPerRow; iPix++)
+ {
+ xint = xcur >> 16;
+ yint = (ycur >> 16) - g->stripYTop;
+
+ /* below, unsigned makes negatives huge (therefore not in strip) */
+ /* also, we check stripRows-1; the -1 allows the extra interpolation-row */
+ if ((unsigned)yint < (unsigned)(g->stripRows-1) &&
+ (unsigned)xint < (unsigned)g->inTraits.iPixelsPerRow)
+ {
+ /**** We are inside the strip ****/
+
+ /* Compute address of pixel in the strip */
+ rowIndex = yint + g->stripIndexYTop;
+ if (rowIndex >= g->stripRows)
+ rowIndex -= g->stripRows;
+ pSrc = (rowIndex*g->inTraits.iPixelsPerRow + xint) * g->bytesPerPixel
+ + g->pStrip;
+
+ /**** Output a pixel ****/
+
+ /* The byte at ptrSrcCur is the upper-left byte out of a 2x2 group.
+ * These four bytes are interpolated together based on xfrac and yfrac.
+ */
+ #define INTERPOLATE_BYTE(ptrOut,ptrSrcCur,ptrSrcNex,bpp) { \
+ int xtop, xbot, val; \
+ xtop = (ptrSrcCur)[0]*(256-xfrac) + (ptrSrcCur)[bpp]*xfrac; \
+ xbot = (ptrSrcNex)[0]*(256-xfrac) + (ptrSrcNex)[bpp]*xfrac; \
+ val = xtop*(256-yfrac) + xbot*yfrac; \
+ val = (val + 0x8000) >> 16; /* the add rounds result of shift */ \
+ *(ptrOut) = (BYTE)val; \
+ }
+
+ #define INTERPOLATE_WORD(ptrOut,ptrSrcCur,ptrSrcNex,bpp) { \
+ WORD *wptrOut = (PWORD)(ptrOut ); \
+ WORD *wptrSrcCur = (PWORD)(ptrSrcCur); \
+ WORD *wptrSrcNex = (PWORD)(ptrSrcNex); \
+ unsigned xtop, xbot, val; \
+ xtop = ((wptrSrcCur)[0]*(0x10000-xfrac)>>8) + ((wptrSrcCur)[bpp]*xfrac>>8); \
+ xtop = (xtop+128) >> 8; /* the add rounds result of shift */ \
+ xbot = ((wptrSrcNex)[0]*(0x10000-xfrac)>>8) + ((wptrSrcNex)[bpp]*xfrac>>8); \
+ xbot = (xbot+128) >> 8; \
+ val = (xtop*(0x10000-yfrac)>>8) + (xbot*yfrac>>8); \
+ val = (val+128) >> 8; \
+ *(wptrOut) = (WORD)val; \
+ }
+
+ pNextRow = pSrc + g->stripBytesPerRow;
+ if (pNextRow >= g->pStripAfter)
+ pNextRow -= g->stripSize; /* next row wrapped to top of strip */
+
+ xfrac = (xcur>>8) & 0x0000ff;
+ yfrac = (ycur>>8) & 0x0000ff;
+
+ if (g->bytesPerPixel == 3) {
+ if (g->bRotateFast) {
+ pDest[0] = pSrc[0];
+ pDest[1] = pSrc[1];
+ pDest[2] = pSrc[2];
+ } else {
+ /* interpolate to eliminate jaggies */
+ INTERPOLATE_BYTE (pDest+0, pSrc+0, pNextRow+0, 3)
+ INTERPOLATE_BYTE (pDest+1, pSrc+1, pNextRow+1, 3)
+ INTERPOLATE_BYTE (pDest+2, pSrc+2, pNextRow+2, 3)
+ }
+ pDest += 3;
+ } else if (g->bytesPerPixel == 1) {
+ BYTE byt;
+
+ if (g->bRotateFast)
+ byt = pSrc[0];
+ else
+ INTERPOLATE_BYTE (&byt, pSrc, pNextRow, 1)
+
+ if (g->inTraits.iBitsPerPixel == 8)
+ *pDest++ = byt;
+ else {
+ /* bi-level: pack 8 pixels per byte */
+ if (byt < 128)
+ *pDest |= mask;
+ mask >>= 1;
+ if (mask == 0) {
+ mask = 0x80u;
+ pDest += 1;
+ *pDest = 0;
+ }
+ }
+ } else if (g->bytesPerPixel==2 || g->bytesPerPixel==6) {
+ /* 16-bit grayscale or 48-bit color */
+ if (g->bRotateFast) {
+ memcpy (pDest, pSrc, g->bytesPerPixel);
+ } else {
+ xfrac = xcur & 0x00ffff;
+ yfrac = ycur & 0x00ffff;
+ INTERPOLATE_WORD (pDest+0, pSrc+0, pNextRow+0, g->inTraits.iComponentsPerPixel)
+ if (g->bytesPerPixel == 6) {
+ INTERPOLATE_WORD (pDest+2, pSrc+2, pNextRow+2, 3)
+ INTERPOLATE_WORD (pDest+4, pSrc+4, pNextRow+4, 3)
+ }
+ }
+
+ pDest += g->bytesPerPixel;
+ } else {
+ /* unsupported bits per pixel */
+ INSURE (FALSE);
+ }
+ }
+ else /* current pos is outside strip, so output a white pixel (padding) */
+ {
+ if (g->inTraits.iBitsPerPixel == 1) {
+ mask >>= 1;
+ if (mask == 0) {
+ mask = 0x80u;
+ pDest += 1;
+ *pDest = 0;
+ }
+ } else {
+ memset (pDest, 255, g->bytesPerPixel);
+ pDest += g->bytesPerPixel;
+ }
+ }
+
+ /* Advance to next pixel in input image */
+ xcur += g->hSlopeDx;
+ ycur += g->hSlopeDy;
+ } /* end of for-each-pixel loop */
+
+ *pdwOutputUsed = (DWORD)g->outBytesPerRow;
+ *pdwOutputThisPos = g->dwOutNextPos;
+ g->dwOutNextPos += (DWORD)g->outBytesPerRow;
+
+ g->dwRowsSent += 1;
+
+ g->xLeft += g->vSlopeDx;
+ g->yLeft += g->vSlopeDy;
+ g->xRight += g->vSlopeDx;
+ g->yRight += g->vSlopeDy;
+ }
+
+ return (*pdwInputUsed !=0 ? IP_CONSUMED_ROW : 0) |
+ (*pdwOutputUsed!=0 ? IP_PRODUCED_ROW : 0) |
+ (NEED_MORE ? IP_READY_FOR_DATA : 0);
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * rotate_insertedData - client inserted into our output stream
+ *
+\*****************************************************************************/
+
+FUNC_STATUS WORD rotate_insertedData (
+ IP_XFORM_HANDLE hXform,
+ DWORD dwNumBytes)
+{
+ fatalBreakPoint ();
+ return IP_FATAL_ERROR; /* must never be called (can't insert data) */
+}
+
+
+
+/*****************************************************************************\
+ *
+ * rotate_newPage - Tells us to flush this page, and start a new page
+ *
+\*****************************************************************************/
+
+FUNC_STATUS WORD rotate_newPage (
+ IP_XFORM_HANDLE hXform)
+{
+ PROTATE_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+ /* todo: return fatal error if convert is called again? */
+ return IP_DONE; /* can't insert page-breaks, so ignore this call */
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+
+}
+
+
+
+/*****************************************************************************\
+ *
+ * rotate_closeXform - Destroys this instance
+ *
+\*****************************************************************************/
+
+FUNC_STATUS WORD rotate_closeXform (IP_XFORM_HANDLE hXform)
+{
+ PROTATE_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ if (g->pStrip != NULL)
+ IP_MEM_FREE (g->pStrip);
+ g->dwValidChk = 0;
+ IP_MEM_FREE (g); /* free memory for the instance */
+
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * rotateTbl - Jump-table for transform driver
+ *
+\*****************************************************************************/
+
+#ifdef EXPORT_TRANSFORM
+__declspec (dllexport)
+#endif
+IP_XFORM_TBL rotateTbl = {
+ rotate_openXform,
+ rotate_setDefaultInputTraits,
+ rotate_setXformSpec,
+ rotate_getHeaderBufSize,
+ rotate_getActualTraits,
+ rotate_getActualBufSizes,
+ rotate_convert,
+ rotate_newPage,
+ rotate_insertedData,
+ rotate_closeXform
+};
+
+
+
+/*****************************************************************************\
+ *
+ * ipGetXformTable - Returns pointer to the jump table
+ *
+\*****************************************************************************/
+
+#ifdef EXPORT_TRANSFORM
+EXPORT(WORD) rotateGetXformTable (LPIP_XFORM_TBL pXform)
+{
+ if (pXform == NULL)
+ return IP_FATAL_ERROR;
+
+ *pXform = clrmapTbl;
+ return IP_DONE;
+}
+#endif
+
+/* End of File */
diff --git a/ip/xsaturation.c b/ip/xsaturation.c
new file mode 100644
index 0000000..472dfda
--- /dev/null
+++ b/ip/xsaturation.c
@@ -0,0 +1,463 @@
+/* libhpojip -- HP OfficeJet image-processing library. */
+
+/* Copyright (C) 1995-2002 Hewlett-Packard Company
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ * MA 02111-1307, USA.
+ *
+ * In addition, as a special exception, Hewlett-Packard Company
+ * gives permission to link the code of this program with any
+ * version of the OpenSSL library which is distributed under a
+ * license identical to that listed in the included LICENSE.OpenSSL
+ * file, and distribute linked combinations including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * this file, you may extend this exception to your version of the
+ * file, but you are not obligated to do so. If you do not wish to
+ * do so, delete this exception statement from your version.
+ */
+
+/* Original author: Mark Overton and others.
+ *
+ * Ported to Linux by David Paschal.
+ */
+
+/******************************************************************************\
+ *
+ * xsaturation.c - Changes the saturation of color data
+ *
+ ******************************************************************************
+ *
+ * Name of Global Jump-Table:
+ *
+ * saturationTbl
+ *
+ * Items in aXformInfo array passed into setXformSpec:
+ *
+ * aXformInfo[IP_SATURATION_FACTOR] = saturation factor, in 24.8 fixed point (8 bits of frac)
+ *
+ * A conceptual value of 1.0 (aXformInfo[0] = 256) means no change in
+ * saturation. 2.0 doubles it; 0.5 cuts it in half. 0.0 eliminates all
+ * color, outputting RGB grayscale.
+ *
+ * Capabilities and Limitations:
+ *
+ * The incoming data can be 24-bit color or 48-bit color.
+ * The pixels are assumed to be RGB.
+ *
+ * Default Input Traits, and Output Traits:
+ *
+ * trait default input output
+ * ------------------- --------------------- ------------------------
+ * iPixelsPerRow * passed into output same as default input
+ * iBitsPerPixel * passed into output same as default input
+ * iComponentsPerPixel passed into output same as default input
+ * lHorizDPI passed into output same as default input
+ * lVertDPI passed into output same as default input
+ * lNumRows passed into output same as default input
+ * iNumPages passed into output same as default input
+ * iPageNum passed into output same as default input
+ *
+ * Above, a "*" by an item indicates it must be valid (not negative).
+ *
+ * Feb 2000 Mark Overton -- wrote original code
+ *
+\******************************************************************************/
+
+#include "hpip.h"
+#include "ipdefs.h"
+#include "string.h" /* for memset and memcpy */
+
+
+#if 0
+ #include "stdio.h"
+ #include <tchar.h>
+
+ #define PRINT(msg,arg1,arg2) \
+ _ftprintf(stderr, msg, (int)arg1, (int)arg2)
+#else
+ #define PRINT(msg,arg1,arg2)
+#endif
+
+#define CHECK_VALUE 0x4ba1dace
+
+
+typedef struct {
+ IP_IMAGE_TRAITS traits; /* traits of the input and output image */
+ DWORD dwSatFac; /* desired saturation factor */
+ DWORD dwBytesPerRow; /* # of bytes in each row */
+ DWORD dwRowsDone; /* number of rows converted so far */
+ DWORD dwInNextPos; /* file pos for subsequent input */
+ DWORD dwOutNextPos; /* file pos for subsequent output */
+ DWORD dwValidChk; /* struct validity check value */
+} SAT_INST, *PSAT_INST;
+
+
+
+/*****************************************************************************\
+ *
+ * saturation_openXform - Creates a new instance of the transformer
+ *
+ *****************************************************************************
+ *
+ * This returns a handle for the new instance to be passed into
+ * all subsequent calls.
+ *
+ * Return value: IP_DONE=success; IP_FATAL_ERROR=misc error.
+ *
+\*****************************************************************************/
+
+static WORD saturation_openXform (
+ IP_XFORM_HANDLE *pXform) /* out: returned handle */
+{
+ PSAT_INST g;
+
+ INSURE (pXform != NULL);
+ IP_MEM_ALLOC (sizeof(SAT_INST), g);
+ *pXform = g;
+ memset (g, 0, sizeof(SAT_INST));
+ g->dwValidChk = CHECK_VALUE;
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * saturation_setDefaultInputTraits - Specifies default input image traits
+ *
+ *****************************************************************************
+ *
+ * The header of the file-type handled by the transform probably does
+ * not include *all* the image traits we'd like to know. Those not
+ * specified in the file-header are filled in from info provided by
+ * this routine.
+ *
+ * Return value: IP_DONE=success; IP_FATAL_ERROR=misc error.
+ *
+\*****************************************************************************/
+
+static WORD saturation_setDefaultInputTraits (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ PIP_IMAGE_TRAITS pTraits) /* in: default image traits */
+{
+ PSAT_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ /* insure that traits we care about are known */
+ INSURE (pTraits->iPixelsPerRow>0
+ && (pTraits->iBitsPerPixel==24 || pTraits->iBitsPerPixel==48));
+ g->traits = *pTraits; /* a structure copy */
+ g->dwBytesPerRow = (g->traits.iPixelsPerRow*g->traits.iBitsPerPixel + 7) / 8;
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * saturation_setXformSpec - Provides xform-specific information
+ *
+\*****************************************************************************/
+
+static WORD saturation_setXformSpec (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD_OR_PVOID aXformInfo[]) /* in: xform information */
+{
+ PSAT_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+ g->dwSatFac = aXformInfo[IP_SATURATION_FACTOR].dword;
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * saturation_getHeaderBufSize- Returns size of input buf needed to hold header
+ *
+\*****************************************************************************/
+
+static WORD saturation_getHeaderBufSize (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD *pdwInBufLen) /* out: buf size for parsing header */
+{
+ /* since input is raw pixels, there is no header, so set it to zero */
+ *pdwInBufLen = 0;
+ return IP_DONE;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * saturation_getActualTraits - Parses header, and returns input & output traits
+ *
+\*****************************************************************************/
+
+static WORD saturation_getActualTraits (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD dwInputAvail, /* in: # avail bytes in input buf */
+ PBYTE pbInputBuf, /* in: ptr to input buffer */
+ PDWORD pdwInputUsed, /* out: # bytes used from input buf */
+ PDWORD pdwInputNextPos,/* out: file-pos to read from next */
+ PIP_IMAGE_TRAITS pIntraits, /* out: input image traits */
+ PIP_IMAGE_TRAITS pOutTraits) /* out: output image traits */
+{
+ PSAT_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ /* Since there is no header, we'll report no usage of input */
+ *pdwInputUsed = 0;
+ *pdwInputNextPos = 0;
+
+ *pIntraits = g->traits; /* structure copies */
+ *pOutTraits = g->traits;
+
+ return IP_DONE | IP_READY_FOR_DATA;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/****************************************************************************\
+ *
+ * saturation_getActualBufSizes - Returns buf sizes needed for remainder of job
+ *
+\****************************************************************************/
+
+static WORD saturation_getActualBufSizes (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ PDWORD pdwMinInBufLen, /* out: min input buf size */
+ PDWORD pdwMinOutBufLen) /* out: min output buf size */
+{
+ PSAT_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ *pdwMinInBufLen = *pdwMinOutBufLen = g->dwBytesPerRow;
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * saturation_convert - Converts one row
+ *
+\*****************************************************************************/
+
+static WORD saturation_convert (
+ IP_XFORM_HANDLE hXform,
+ DWORD dwInputAvail, /* in: # avail bytes in in-buf */
+ PBYTE pbInputBuf, /* in: ptr to in-buffer */
+ PDWORD pdwInputUsed, /* out: # bytes used from in-buf */
+ PDWORD pdwInputNextPos, /* out: file-pos to read from next */
+ DWORD dwOutputAvail, /* in: # avail bytes in out-buf */
+ PBYTE pbOutputBuf, /* in: ptr to out-buffer */
+ PDWORD pdwOutputUsed, /* out: # bytes written in out-buf */
+ PDWORD pdwOutputThisPos) /* out: file-pos to write the data */
+{
+ PSAT_INST g;
+ int nBytes;
+ PBYTE pIn, pOut, pOutAfter;
+ int l, rv, gv, bv;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ /**** Check if we were told to flush ****/
+
+ if (pbInputBuf == NULL) {
+ PRINT (_T("saturation_convert: Told to flush.\n"), 0, 0);
+ *pdwInputUsed = *pdwOutputUsed = 0;
+ *pdwInputNextPos = g->dwInNextPos;
+ *pdwOutputThisPos = g->dwOutNextPos;
+ return IP_DONE;
+ }
+
+ /**** Output a Row ****/
+
+ nBytes = g->dwBytesPerRow;
+ INSURE (dwInputAvail >= (DWORD)nBytes );
+ INSURE (dwOutputAvail >= (DWORD)nBytes);
+
+ pIn = pbInputBuf;
+ pOut = pbOutputBuf;
+ pOutAfter = pOut + nBytes;
+
+ if (g->traits.iBitsPerPixel == 24) {
+ /* 24-bit color in RGB */
+
+ while (pOut < pOutAfter) {
+ rv = *pIn++;
+ gv = *pIn++;
+ bv = *pIn++;
+
+ l = NTSC_LUMINANCE (rv,gv,bv);
+
+ rv = l + (((rv-l)*(int)g->dwSatFac + (1<<7)) >> 8);
+ gv = l + (((gv-l)*(int)g->dwSatFac + (1<<7)) >> 8);
+ bv = l + (((bv-l)*(int)g->dwSatFac + (1<<7)) >> 8);
+
+ if (rv > 255) rv = 255; else if (rv < 0) rv = 0;
+ if (gv > 255) gv = 255; else if (gv < 0) gv = 0;
+ if (bv > 255) bv = 255; else if (bv < 0) bv = 0;
+
+ *pOut++ = (BYTE)rv;
+ *pOut++ = (BYTE)gv;
+ *pOut++ = (BYTE)bv;
+ }
+ } else { /* 48 bits/pixel */
+ PWORD src = (PWORD)pIn;
+ PWORD dst = (PWORD)pOut;
+ PWORD dstAfter = (PWORD)pOutAfter;
+
+ while (dst < dstAfter) {
+ rv = (unsigned)(*src++);
+ gv = (unsigned)(*src++);
+ bv = (unsigned)(*src++);
+
+ l = NTSC_LUMINANCE (rv,gv,bv);
+
+ rv = l + (((rv-l)*(int)g->dwSatFac + (1<<7)) >> 8);
+ gv = l + (((gv-l)*(int)g->dwSatFac + (1<<7)) >> 8);
+ bv = l + (((bv-l)*(int)g->dwSatFac + (1<<7)) >> 8);
+
+ if (rv > 65535) rv = 65535; else if (rv < 0) rv = 0;
+ if (gv > 65535) gv = 65535; else if (gv < 0) gv = 0;
+ if (bv > 65535) bv = 65535; else if (bv < 0) bv = 0;
+
+ *dst++ = (WORD)rv;
+ *dst++ = (WORD)gv;
+ *dst++ = (WORD)bv;
+ }
+ }
+
+ *pdwInputUsed = nBytes;
+ g->dwInNextPos += nBytes;
+ *pdwInputNextPos = g->dwInNextPos;
+
+ *pdwOutputUsed = nBytes;
+ *pdwOutputThisPos = g->dwOutNextPos;
+ g->dwOutNextPos += nBytes;
+
+ g->dwRowsDone += 1;
+
+ return IP_CONSUMED_ROW | IP_PRODUCED_ROW | IP_READY_FOR_DATA;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * saturation_insertedData - client inserted into our output stream
+ *
+\*****************************************************************************/
+
+static WORD saturation_insertedData (
+ IP_XFORM_HANDLE hXform,
+ DWORD dwNumBytes)
+{
+ fatalBreakPoint ();
+ return IP_FATAL_ERROR; /* must never be called (can't insert data) */
+}
+
+
+
+/*****************************************************************************\
+ *
+ * saturation_newPage - Tells us to flush this page, and start a new page
+ *
+\*****************************************************************************/
+
+static WORD saturation_newPage (
+ IP_XFORM_HANDLE hXform)
+{
+ PSAT_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+ /* todo: return fatal error if convert is called again? */
+ return IP_DONE; /* can't insert page-breaks, so ignore this call */
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+
+}
+
+
+
+/*****************************************************************************\
+ *
+ * saturation_closeXform - Destroys this instance
+ *
+\*****************************************************************************/
+
+static WORD saturation_closeXform (IP_XFORM_HANDLE hXform)
+{
+ PSAT_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ g->dwValidChk = 0;
+ IP_MEM_FREE (g); /* free memory for the instance */
+
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * saturationTbl - Jump-table for transform driver
+ *
+\*****************************************************************************/
+
+IP_XFORM_TBL saturationTbl = {
+ saturation_openXform,
+ saturation_setDefaultInputTraits,
+ saturation_setXformSpec,
+ saturation_getHeaderBufSize,
+ saturation_getActualTraits,
+ saturation_getActualBufSizes,
+ saturation_convert,
+ saturation_newPage,
+ saturation_insertedData,
+ saturation_closeXform
+};
+
+/* End of File */
diff --git a/ip/xscale.c b/ip/xscale.c
new file mode 100644
index 0000000..0dbd5c7
--- /dev/null
+++ b/ip/xscale.c
@@ -0,0 +1,1277 @@
+/* libhpojip -- HP OfficeJet image-processing library. */
+
+/* Copyright (C) 1995-2002 Hewlett-Packard Company
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ * MA 02111-1307, USA.
+ *
+ * In addition, as a special exception, Hewlett-Packard Company
+ * gives permission to link the code of this program with any
+ * version of the OpenSSL library which is distributed under a
+ * license identical to that listed in the included LICENSE.OpenSSL
+ * file, and distribute linked combinations including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * this file, you may extend this exception to your version of the
+ * file, but you are not obligated to do so. If you do not wish to
+ * do so, delete this exception statement from your version.
+ */
+
+/* Original author: Mark Overton and others.
+ *
+ * Ported to Linux (minus bilevel scaling) by David Paschal.
+ */
+
+/******************************************************************************\
+ *
+ * xscale.c - Scales (and interpolates) bi-level, gray and color
+ *
+ ******************************************************************************
+ *
+ * Name of Global Jump-Table:
+ *
+ * scaleTbl
+ *
+ * Items in aXformInfo array passed into setXformSpec:
+ *
+ * aXformInfo[IP_SCALE_HORIZ_FACTOR] = Horizontal scale-factor, in 8.24 fixed point
+ *
+ * aXformInfo[IP_SCALE_VERT_FACTOR] = Vertical scale-factor, in 8.24 fixed point
+ *
+ * aXformInfo[IP_SCALE_FAST] = scale fast using simple pixel-replication? 0=no, 1=yes
+ * currently, this only affects bi-level up-scaling.
+ *
+ * Capabilities and Limitations:
+ *
+ * This driver can scale both up and down, independently. That is, one
+ * direction can up-scale while the other direction down-scales. Bi-level
+ * scaling is done using tables to maximize speed. 24-bit color,
+ * 8-bit gray and bi-level pixels can be scaled.
+ *
+ * Color and gray data are interpolated intellegently.
+ * Bi-level data are smoothed when up-scaling (several patents), and
+ * data-loss is avoided when down-scaling (another patent).
+ *
+ * The allowed scale-factor ranges differ based on data type (bi-level,
+ * gray and color). An assert will occur if range is exceeded.
+ * These ranges are:
+ *
+ * bi-level: horiz_fac=[1/2..4.0] vert_fac=[1/16..4.0]
+ * gray: horiz_fac=[1/4..6.0] vert_fac=[1/4..6.0]
+ * color: horiz_fac=[1/4..6.0] vert_fac=[1/4..6.0]
+ *
+ * Default Input Traits, and Output Traits:
+ *
+ * trait default input output
+ * ------------------- --------------------- ------------------------
+ * iPixelsPerRow * passed into output computed
+ * iBitsPerPixel * passed into output same as default input
+ * iComponentsPerPixel * passed into output same as default input
+ * lHorizDPI passed into output same as default input
+ * lVertDPI passed into output same as default input
+ * lNumRows passed into output computed
+ * iNumPages passed into output same as default input
+ * iPageNum passed into output same as default input
+ *
+ * Above, a "*" by an item indicates it must be valid (not negative).
+ *
+ *
+ * Feb 1998 Mark Overton, ported to new Windows software Image Processor
+ * Jun 1997 Mark Overton, added color scaling
+ * May 1997 Mark Overton, added gray scaling
+ * 1995 Mark Overton, wrote original code (bi-level only)
+ *
+\******************************************************************************/
+
+#include "string.h" /* for memset and memcpy */
+#include "assert.h"
+
+#include "hpip.h"
+#include "ipdefs.h"
+
+
+#if 0
+ #include "stdio.h"
+ #include <tchar.h>
+
+ #define PRINT(msg,arg1,arg2) \
+ _ftprintf(stderr, msg, (int)arg1, (int)arg2)
+#else
+ #define PRINT(msg,arg1,arg2)
+#endif
+
+#define CHECK_VALUE 0x1ce5ca7e
+#define SC_WHITE_ROW 1 /* was for tracking all-white rows; not used */
+
+
+/*____________________________________________________________________________
+ | |
+ | Things common to all image-types |
+ |____________________________________________________________________________|
+*/
+
+
+#define MAX_ROWS_AP 6 /* Number of entries in rows_ap */
+#define HELD_ARRAY_SIZE 7 /* # entries in apHeldOutRows array */
+
+typedef enum {
+ IM_BILEVEL,
+ IM_GRAY,
+ IM_COLOR
+} IM_TYPE;
+
+
+/* SC_INST contains all the variables for a scaling-instance */
+
+typedef struct {
+ IM_TYPE image_type; /* type of image (bilevel, gray, color) */
+ BOOL fast; /* scale (quickly) using pixel replication? */
+ BYTE nMoreFlush; /* # more flush calls reqd to send buffered rows */
+ ULONG horiz_fac; /* horiz scale-factor (16.16 fixed-pt) */
+ ULONG vert_fac; /* vert scale-factor (16.16 fixed-pt) */
+ long vert_pos; /* current vert pos (16.16; signed, we use neg) */
+ int in_row_nbytes; /* # bytes in each input row */
+ int out_row_nbytes; /* # bytes in each output row */
+ int out_row_pixels; /* # pixels in each output row */
+ int in_nrows; /* number of rows read in so far */
+ int out_nrows; /* number of rows written so far */
+ BYTE *rows_ap[MAX_ROWS_AP]; /* ptrs to successive input rows */
+ int nMaxOutRows; /* max # output rows resulting from one input row*/
+ int nMoreHeldOutRows;/* more output rows needed to be returned */
+ int iNextHeldOutRow; /* index of next output row to be returned */
+ BYTE *apHeldOutRows[HELD_ARRAY_SIZE];
+ /* output rows stored for subsequent returning; */
+ /* index [0] is caller's output buffer */
+ int top_row; /* bilevel: index of top of 3 rows in rows_ap */
+ ULONG post_fac; /* bilevel: additional upscaling */
+ BYTE mid_traits; /* bilevel: trait-bits of middle row */
+
+ ULONG inv_horiz_fac; /* gray: inverse of horiz scaling factor (16.16) */
+ ULONG inv_vert_fac; /* gray: inverse of vert scaling factor (16.16) */
+ long inv_vert_pos; /* cur inv vert pos (16.16; signed, we use neg) */
+ BYTE n_saved_rows; /* gray: # rows saved in rows_ap for vert scaling*/
+ BYTE n_alloced_rows; /* gray: # rows allocated in rows_ap */
+
+ IP_IMAGE_TRAITS inTraits;/* traits of the input image */
+ DWORD dwInNextPos; /* file pos for subsequent input */
+ DWORD dwOutNextPos; /* file pos for subsequent output */
+ DWORD dwValidChk; /* struct validity check value */
+} SC_INST, *PSC_INST;
+
+
+/******************************************************************************
+ ******************************************************************************
+
+ DUMMY BILEVEL FUNCTIONS
+
+ ******************************************************************************
+ ******************************************************************************/
+
+/* These functions were removed because they contained patented algorithms.
+ * Therefore, only gray and color (not bilevel) scaling are currently
+ * supported. If this is ever fixed, then remove the assert in
+ * scale_setDefaultInputTraits(). */
+
+void bi_fast_open(PSC_INST g, UINT in_row_len) {
+ fatalBreakPoint();
+}
+
+void bi_scale_open(PSC_INST g, UINT in_row_len) {
+ fatalBreakPoint();
+}
+
+int bi_fast_row(PSC_INST g,PBYTE pbInputBuf,BYTE src_traits,
+ BYTE *apHeldOutRows[],ULONG *pdest_traits) {
+ fatalBreakPoint();
+ return 0;
+}
+
+int bi_scale_row(PSC_INST g,PBYTE pbInputBuf,BYTE src_traits,
+ BYTE *apHeldOutRows[],ULONG *pdest_traits) {
+ fatalBreakPoint();
+ return 0;
+}
+
+void bi_fast_close(PSC_INST g) {
+ fatalBreakPoint();
+}
+
+void bi_scale_close(PSC_INST g) {
+ fatalBreakPoint();
+}
+
+
+/******************************************************************************
+ ******************************************************************************
+
+ CONTONE (GRAY AND COLOR)
+
+ ******************************************************************************
+ ******************************************************************************/
+
+
+/*
+ * Scaling Algorithms
+ *
+ * The descriptions below are for the X axis. For the Y axis, substitute
+ * "input row" for "input pixel", and "output row" for "output pixel", and
+ * apply weights to entire rows using the same algorithms.
+ *
+ * Each axis is scaled separately using the these methods. So you can
+ * down-scale in one axis and up-scale in the other, if you wish.
+ *
+ *
+ * Down-scaling Algorithm
+ *
+ * Imagine marking the pixel-boundaries on two rulers, and laying them
+ * next to each other:
+ *
+ * in1 pos in2 in3
+ * |______|______|______|______|______|______|______| <-- input pixels
+ * | | | | | <-- output pixels
+ * 0 out 1
+ *
+ * An output pixel consists of a weighted sum of the input pixels that
+ * it overlaps. The weights are the amount of overlap.
+ *
+ * pos is the right side of the leftmost input pixel that overlaps the
+ * current output pixel. This position is in units of output pixels (a
+ * distance of 1 is the width of an output pixel), and 0 is the left side
+ * of the current output pixel. Since this position is in units of output
+ * pixels, it can be used to easily compute the weights.
+ *
+ * The weights of the overlapping input pixels are:
+ *
+ * leftmost: pos
+ * middle pixels (if any): scale factor (which is less than 1)
+ * rightmost: 1.0 - (sum of above weights)
+ *
+ * Above, the pixel 'out' is computed as:
+ *
+ * out = pos*in1 + scalefactor*in2 + (1-pos-scalefactor)*in3
+ *
+ *
+ * Up-scaling Algorithm
+ *
+ * I first tried an overlap method like that used for down-scaling, but
+ * for large scale-factors, one output pixel would overlap two input
+ * pixels, and many output pixels would overlap just one input pixel.
+ * So the result looked almost as bad as pixel-replication, because many
+ * pixels were indeed just replications.
+ *
+ * So I devised an interpolating algorithm wherein a pos value is the
+ * weight of the next input pixel, and (1-pos) is the weight of the
+ * current input pixel. As pos increases along the current input pixel,
+ * the weight will smoothly shift from it to the next input pixel,
+ * eliminating jaggies.
+ *
+ * 0 in0 1 in1
+ * |___________|___________|___________|___________| <-- input_pixels
+ * | | | out | | | | | <-- output pixels
+ * pos
+ *
+ * pos is the left side of the current output pixel, in units of input
+ * pixels. 0 is the left side of the current input pixel (in0 above).
+ *
+ * pos is advanced by adding 1/scalefactor to it. When it becomes >= 1,
+ * move to the next input pixel, and subtract 1 from pos.
+ *
+ * Above, the pixel 'out' is computed as: out = (1-pos)*in0 + pos*in1
+ */
+
+#define CONTONE_MIN_HORIZ_FAC (ULONG)0x04000 /* 0.25 */
+ /* Minimum horizontal scale-factor (16.16) */
+
+#define CONTONE_MAX_HORIZ_FAC ((ULONG)MAX_ROWS_AP << 16)
+ /* Maximum horizontal scale-factor (arbitrary) */
+
+#define CONTONE_MIN_VERT_FAC (ULONG)0x04000 /* 0.25 */
+ /* Minimum vertical scale-factor (16.16) */
+
+#define CONTONE_MAX_VERT_FAC ((ULONG)MAX_ROWS_AP << 16)
+ /* Maximum vertical scale-factor (16.16) */
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | gray_horiz_scale | Scales the given input row into the given output row |
+ |__________________|_________________________________________________________|
+ | |
+ | Up-scaling is done by interpolation using horiz_pos. |
+ | Down-scaling is done by blending (averaging two or more input pixels |
+ | together, forming an output pixel). |
+ |____________________________________________________________________________|
+*/
+static void gray_horiz_scale (
+ SC_INST *g, /* in: our instance variables */
+ BYTE *src_p, /* in: input row to be scaled */
+ BYTE *dest_p) /* out: output row that we scaled */
+{
+ ULONG horiz_pos, new_pos;
+ BYTE *in_p, *out_p, *out_aft_p;
+ UINT sum, pix;
+ UINT w1, w2;
+ UINT n_pix, u;
+
+ in_p = src_p;
+ out_p = dest_p;
+ out_aft_p = out_p + g->out_row_nbytes;
+ in_p[g->in_row_nbytes] = in_p[g->in_row_nbytes-1]; /* dup right pixel */
+
+ /**************/
+ /* Up-scaling */
+ /**************/
+
+ if (g->horiz_fac >= 0x00010000u)
+ {
+ horiz_pos = 0;
+
+ while (out_p < out_aft_p) {
+ do {
+ w2 = (UINT) (horiz_pos >> 8);
+ w1 = 256 - w2;
+ *out_p++ = (w1*in_p[0] + w2*in_p[1]) >> 8;
+ horiz_pos += g->inv_horiz_fac;
+ } while ((horiz_pos>>16) == 0);
+
+ horiz_pos &= 0x0000ffffu;
+ in_p += 1;
+ }
+ }
+
+ /****************/
+ /* Down-scaling */
+ /****************/
+
+ else if (g->fast)
+ {
+ horiz_pos = 0;
+ while (out_p < out_aft_p) {
+ *out_p++ = *in_p;
+ horiz_pos += g->inv_horiz_fac;
+ in_p += horiz_pos >> 16;
+ horiz_pos &= 0x0000ffffu;
+ }
+ }
+ else // not fast
+ {
+ horiz_pos = g->horiz_fac;
+ w2 = g->horiz_fac >> 8;
+
+ while (out_p < out_aft_p) {
+ new_pos = horiz_pos;
+ n_pix = 1;
+ do {
+ new_pos += g->horiz_fac;
+ n_pix += 1;
+ } while ((new_pos>>16) == 0);
+
+ /* Blend n_pix pixels together using these weights:
+ * 1st pixel: horiz_pos
+ * mid pixels: horiz_fac
+ * final pixel: 1.0 - (sum of above weights)
+ */
+ sum = horiz_pos >> 8;
+ pix = sum * (*in_p++); /* 1st pixel */
+
+ for (u=1; u<=n_pix-2; u++) {
+ pix += w2 * (*in_p++); /* middle pixels */
+ sum += w2;
+ }
+
+ pix += (256-sum) * (*in_p); /* final pixel */
+
+ *out_p++ = pix >> 8;
+ horiz_pos = new_pos & 0x0000ffffu;
+ }
+ } /* end if up-scaling else down-scaling */
+}
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | color_horiz_scale | Scales the given input row into the given output row |
+ |___________________|________________________________________________________|
+ | |
+ | Up-scaling is done by interpolation using horiz_pos. |
+ | Down-scaling is done by blending (averaging two or more input pixels |
+ | together, forming an output pixel). |
+ |____________________________________________________________________________|
+*/
+static void color_horiz_scale (
+ SC_INST *g, /* in: our instance variables */
+ BYTE *src_p, /* in: input row to be scaled */
+ BYTE *dest_p) /* out: output row that we scaled */
+{
+ ULONG horiz_pos, new_pos;
+ BYTE *in_p, *out_p, *out_aft_p, *p;
+ UINT sum, pix_y, pix_u, pix_v;
+ UINT w1, w2;
+ UINT n_pix, u;
+
+ in_p = src_p;
+ out_p = dest_p;
+ out_aft_p = out_p + g->out_row_nbytes;
+
+ p = in_p + g->in_row_nbytes;
+ p[0] = p[-3]; /* dup right pixel */
+ p[1] = p[-2];
+ p[2] = p[-1];
+
+ /**************/
+ /* Up-scaling */
+ /**************/
+
+ if (g->horiz_fac >= 0x00010000u)
+ {
+ horiz_pos = 0;
+
+ while (out_p < out_aft_p) {
+ do {
+ w2 = (UINT) (horiz_pos >> 8);
+ w1 = 256 - w2;
+ *out_p++ = (w1*in_p[0] + w2*in_p[3]) >> 8; /* y component */
+ *out_p++ = (w1*in_p[1] + w2*in_p[4]) >> 8; /* u component */
+ *out_p++ = (w1*in_p[2] + w2*in_p[5]) >> 8; /* v component */
+ horiz_pos += g->inv_horiz_fac;
+ } while ((horiz_pos>>16) == 0);
+
+ horiz_pos &= 0x0000ffffu;
+ in_p += 3;
+ }
+ }
+
+ /****************/
+ /* Down-scaling */
+ /****************/
+
+ else if (g->fast)
+ {
+ int iStep;
+ horiz_pos = 0;
+ while (out_p < out_aft_p) {
+ *out_p++ = in_p[0];
+ *out_p++ = in_p[1];
+ *out_p++ = in_p[2];
+
+ horiz_pos += g->inv_horiz_fac;
+ iStep = horiz_pos >> 16;
+ in_p += iStep + iStep + iStep;
+ horiz_pos &= 0x0000ffffu;
+ }
+ }
+ else // down-scaling, not fast
+ {
+ horiz_pos = g->horiz_fac;
+ w2 = g->horiz_fac >> 8;
+
+ while (out_p < out_aft_p) {
+ new_pos = horiz_pos;
+ n_pix = 1;
+ do {
+ new_pos += g->horiz_fac;
+ n_pix += 1;
+ } while ((new_pos>>16) == 0);
+
+ /* Blend n_pix pixels together using these weights:
+ * 1st pixel: horiz_pos
+ * mid pixels: horiz_fac
+ * final pixel: 1.0 - (sum of above weights)
+ */
+ sum = horiz_pos >> 8;
+ pix_y = sum * (*in_p++); /* 1st pixel */
+ pix_u = sum * (*in_p++);
+ pix_v = sum * (*in_p++);
+
+ for (u=1; u<=n_pix-2; u++) {
+ pix_y += w2 * (*in_p++); /* middle pixels */
+ pix_u += w2 * (*in_p++);
+ pix_v += w2 * (*in_p++);
+ sum += w2;
+ }
+
+ sum = 256 - sum;
+ pix_y += sum * in_p[0]; /* final pixel */
+ pix_u += sum * in_p[1];
+ pix_v += sum * in_p[2];
+
+ *out_p++ = pix_y >> 8;
+ *out_p++ = pix_u >> 8;
+ *out_p++ = pix_v >> 8;
+ horiz_pos = new_pos & 0x0000ffffu;
+ }
+ } /* end if up-scaling else down-scaling */
+}
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | weight_two_rows | Output row is a weighted-average of two rows in rows_ap |
+ |_________________|__________________________________________________________|
+ | |
+ | rows_ap[0] is weighted by first_weight. |
+ | rows_ap[1] is weighted by 1.0 - first_weight. |
+ | The output is written to dest_p. |
+ |____________________________________________________________________________|
+*/
+static void weight_two_rows (
+ SC_INST *g, /* in: our instance variables */
+ ULONG first_weight, /* in: weight for first row (16.16) */
+ BYTE *dest_p) /* out: output row */
+{
+ BYTE *p1, *p2;
+ BYTE *out_p, *out_aft_p;
+
+ p1 = g->rows_ap[0];
+ p2 = g->rows_ap[1];
+ out_p = dest_p;
+ out_aft_p = out_p + g->out_row_nbytes;
+
+#if 0
+ UINT w1, w2;
+ w1 = first_weight >> 8;
+ w2 = 256 - w1;
+ while (out_p < out_aft_p)
+ *out_p++ = (w1*(*p1++) + w2*(*p2++)) >> 8;
+#else
+ switch ((first_weight+(1u<<12)) >> 13) /* round weight to closest 8th */
+ {
+ case 0:
+ memcpy (out_p, p2, g->out_row_nbytes);
+ break;
+ case 1:
+ while (out_p < out_aft_p)
+ *out_p++ = (*p1>>3) + *p2 - (*p2>>3);
+ p1++; p2++;
+ break;
+ case 2:
+ while (out_p < out_aft_p)
+ *out_p++ = (*p1>>2) + *p2 - (*p2>>2);
+ p1++; p2++;
+ break;
+ case 3:
+ while (out_p < out_aft_p)
+ *out_p++ = (*p1>>2) + (*p1>>3) + (*p2>>1) + (*p2>>3);
+ p1++; p2++;
+ break;
+ case 4:
+ while (out_p < out_aft_p)
+ *out_p++ = (*p1>>1) + (*p2>>1);
+ p1++; p2++;
+ break;
+ case 5:
+ while (out_p < out_aft_p)
+ *out_p++ = (*p1>>1) + (*p1>>3) + (*p2>>2) + (*p2>>3);
+ p1++; p2++;
+ break;
+ case 6:
+ while (out_p < out_aft_p)
+ *out_p++ = *p1 - (*p1>>2) + (*p2>>2);
+ p1++; p2++;
+ break;
+ case 7:
+ while (out_p < out_aft_p)
+ *out_p++ = *p1 - (*p1>>3) + (*p2>>3);
+ p1++; p2++;
+ break;
+ case 8:
+ memcpy (out_p, p1, g->out_row_nbytes);
+ break;
+ default:
+ assert (0);
+ }
+#endif
+}
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | weight_n_rows | Blends two or more rows in rows_ap into one output row |
+ |_______________|____________________________________________________________|
+ | |
+ | The weights are: |
+ | 1st row: first_weight |
+ | middle rows: mid_weight |
+ | final row: 1.0 - (sum of above weights) |
+ |____________________________________________________________________________|
+*/
+static void weight_n_rows (
+ SC_INST *g, /* in: our instance variables */
+ UINT n_rows, /* in: number of rows to blend together */
+ ULONG first_weight, /* in: weight of first row (16.16) */
+ ULONG mid_weight, /* in: weight of middle rows (16.16) */
+ BYTE *dest_p) /* out: output row */
+{
+ BYTE *in_p[MAX_ROWS_AP];
+ BYTE *out_p, *out_aft_p;
+ UINT weights[MAX_ROWS_AP];
+ UINT sum;
+ UINT u;
+
+ assert (n_rows>=2 && n_rows<=MAX_ROWS_AP);
+
+ if (n_rows == 2) {
+ weight_two_rows (g, first_weight, dest_p);
+ return;
+ }
+
+ out_p = dest_p;
+ out_aft_p = out_p + g->out_row_nbytes;
+ for (u=0; u<n_rows; u++)
+ in_p[u] = g->rows_ap[u];
+
+ sum = weights[0] = first_weight >> 8;
+ for (u=1; u<=n_rows-2; u++)
+ sum += (weights[u] = mid_weight >> 8);
+ weights[n_rows-1] = 256 - sum;
+
+ while (out_p < out_aft_p) {
+ sum = 0;
+ for (u=0; u<n_rows; u++)
+ sum += weights[u] * (*in_p[u]++);
+ *out_p++ = sum >> 8;
+ }
+}
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | contone_scale_open | sets up the given scaling job |
+ |____________________|_______________________________________________________|
+*/
+static void contone_scale_open (
+ SC_INST *g, /* ptr to our scaling instance */
+ UINT in_row_len) /* # pixels per input row */
+{
+ ULONG horiz_fac; /* scale-factors in 16.16 fixed-point */
+ ULONG vert_fac;
+ UINT n;
+
+ horiz_fac = g->horiz_fac;
+ vert_fac = g->vert_fac;
+
+ if (! g->fast) {
+ assert (horiz_fac>=CONTONE_MIN_HORIZ_FAC &&
+ horiz_fac<=CONTONE_MAX_HORIZ_FAC);
+ assert ( vert_fac>=CONTONE_MIN_VERT_FAC &&
+ vert_fac<=CONTONE_MAX_VERT_FAC);
+ }
+
+ g->vert_pos = 0;
+ g->in_row_nbytes = in_row_len;
+ g->out_row_pixels = g->out_row_nbytes = (horiz_fac*in_row_len) >> 16;
+
+ if (g->image_type == IM_COLOR) {
+ g->in_row_nbytes *= 3;
+ g->out_row_nbytes *= 3;
+ }
+
+ g->inv_horiz_fac = ((0x80000000u / horiz_fac) << 1) + 1u;
+ g->inv_vert_fac = ((0x80000000u / vert_fac) << 1) + 1u;
+ /* We added 1 to the inverse factors above as an unusual way of rounding */
+
+ if (g->fast) {
+ g->n_alloced_rows = 0;
+ } else if (vert_fac >= 0x00010000u) { /* up-scaling vertically */
+ g->inv_vert_pos = g->inv_vert_fac;
+ g->n_alloced_rows = 2;
+ } else { /* down-scaling vertically */
+ g->n_alloced_rows = (BYTE)((g->inv_vert_fac+0x0000ffffu) >> 16) + 1;
+ g->vert_pos = vert_fac;
+ }
+
+ for (n=0; n<g->n_alloced_rows; n++) {
+ IP_MEM_ALLOC (g->out_row_nbytes, g->rows_ap[n]);
+ memset (g->rows_ap[n], 0xff, g->out_row_nbytes + 4);
+ }
+
+ g->nMoreFlush = 0; /* no flush-calls are needed */
+ return;
+
+ fatal_error:
+ assert (0);
+}
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | contone_scale_close | de-allocates scaling instance |
+ |_____________________|______________________________________________________|
+*/
+static void contone_scale_close (SC_INST *g)
+{
+ UINT n;
+
+ for (n=0; n<g->n_alloced_rows; n++)
+ IP_MEM_FREE (g->rows_ap[n]);
+}
+
+
+
+/*____________________________________________________________________________
+ | | |
+ | contone_scale_row | scales the given input row into 0 or more output rows |
+ |___________________|________________________________________________________|
+*/
+static int contone_scale_row (
+ SC_INST *g, /* in: ptr to our scaling instance */
+ BYTE *src_row_p, /* in: input row */
+ BYTE *dest_rows_ap[]) /* out: output rows */
+{
+ UINT n_out_rows;
+ UINT u;
+ long weight;
+ long new_pos;
+ BYTE *p;
+
+ assert (src_row_p != NULL);
+
+ if (g->fast && g->vert_fac<=0x00010000u)
+ {
+ /* down-scaling fast */
+ g->vert_pos += g->vert_fac;
+ n_out_rows = g->vert_pos >> 16;
+ g->vert_pos &= 0x0000ffffu;
+
+ if (n_out_rows > 0) {
+ if (g->image_type == IM_GRAY) gray_horiz_scale (g, src_row_p, dest_rows_ap[0]);
+ else color_horiz_scale (g, src_row_p, dest_rows_ap[0]);
+ }
+
+ return n_out_rows;
+ }
+
+ p = g->rows_ap[g->n_saved_rows];
+ if (g->image_type == IM_GRAY) gray_horiz_scale (g, src_row_p, p);
+ else color_horiz_scale (g, src_row_p, p);
+
+ g->n_saved_rows += 1;
+
+ if (g->n_saved_rows == 1) {
+ /* call again to duplicate the first row to get us started */
+ return contone_scale_row (g, src_row_p, dest_rows_ap);
+ }
+
+ /*************************/
+ /* Up-scaling Vertically */
+ /*************************/
+
+ if (g->vert_fac >= 0x00010000u)
+ {
+ n_out_rows = 0;
+
+ if (g->n_saved_rows == 2) {
+#if 0
+ do {
+ weight_two_rows (g, 0x10000u-g->vert_pos,
+ dest_rows_ap[n_out_rows]);
+ n_out_rows += 1;
+ g->vert_pos += g->inv_vert_fac;
+ } while ((g->vert_pos>>16) == 0);
+ g->vert_pos &= 0x0000ffffu;
+#else
+ /* We use vert_pos solely to determine the number of rows.
+ * We use inv_vert_pos to create the weights.
+ * In the commented-out code above, inv_vert_pos did both,
+ * but the problem was that the number of rows output can
+ * off by 1 compared with (num_in_rows*vert_fac), which is
+ * what our callers expect.
+ */
+ g->vert_pos += g->vert_fac;
+ n_out_rows = (UINT)(g->vert_pos >> 16);
+ g->vert_pos &= 0x0000ffffu;
+
+ for (u=0; u<n_out_rows; u++) {
+ weight = 0x10000 - g->inv_vert_pos;
+ if (weight < 0) weight = 0;
+ else if (weight > 0x10000) weight = 0x10000;
+ weight_two_rows (g, weight, dest_rows_ap[u]);
+ g->inv_vert_pos += g->inv_vert_fac;
+ }
+
+ g->inv_vert_pos -= 0x10000;
+#endif
+ /* discard the oldest row */
+ g->n_saved_rows = 1;
+ p = g->rows_ap[0];
+ g->rows_ap[0] = g->rows_ap[1];
+ g->rows_ap[1] = p;
+ }
+ }
+
+ /***************************/
+ /* Down-scaling Vertically */
+ /***************************/
+
+ else
+ {
+ n_out_rows = 0;
+ new_pos = g->vert_pos + (g->n_saved_rows-1)*g->vert_fac;
+
+ if ((new_pos>>16) != 0) {
+ weight_n_rows (g, g->n_saved_rows, g->vert_pos, g->vert_fac,
+ dest_rows_ap[0]);
+ n_out_rows = 1;
+ g->vert_pos = new_pos & 0x0000ffffu;
+
+ /* retain the newest row */
+ p = g->rows_ap[0];
+ g->rows_ap[0] = g->rows_ap[g->n_saved_rows-1];
+ g->rows_ap[g->n_saved_rows-1] = p;
+ g->n_saved_rows = 1;
+ }
+ }
+
+ return n_out_rows;
+}
+
+
+
+/******************************************************************************
+ ******************************************************************************
+
+ E X P O R T E D R O U T I N E S
+
+ ******************************************************************************
+ ******************************************************************************/
+
+
+
+/*****************************************************************************\
+ *
+ * scale_openXform - Creates a new instance of the transformer
+ *
+ *****************************************************************************
+ *
+ * This returns a handle for the new instance to be passed into
+ * all subsequent calls.
+ *
+ * Return value: IP_DONE=success; IP_FATAL_ERROR=misc error.
+ *
+\*****************************************************************************/
+
+static WORD scale_openXform (
+ IP_XFORM_HANDLE *pXform) /* out: returned handle */
+{
+ PSC_INST g;
+
+ INSURE (pXform != NULL);
+ IP_MEM_ALLOC (sizeof(SC_INST), g);
+ *pXform = g;
+ memset (g, 0, sizeof(SC_INST));
+ g->dwValidChk = CHECK_VALUE;
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * scale_setDefaultInputTraits - Specifies default input image traits
+ *
+ *****************************************************************************
+ *
+ * The header of the file-type handled by the transform probably does
+ * not include *all* the image traits we'd like to know. Those not
+ * specified in the file-header are filled in from info provided by
+ * this routine.
+ *
+ * Return value: IP_DONE=success; IP_FATAL_ERROR=misc error.
+ *
+\*****************************************************************************/
+
+static WORD scale_setDefaultInputTraits (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ PIP_IMAGE_TRAITS pTraits) /* in: default image traits */
+{
+ PSC_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ /* Insure that values we care about are correct */
+ INSURE ( (pTraits->iBitsPerPixel==24 && pTraits->iComponentsPerPixel==3)
+ || (pTraits->iBitsPerPixel==8 && pTraits->iComponentsPerPixel==1)
+ || (pTraits->iBitsPerPixel==1 && pTraits->iComponentsPerPixel==1));
+ INSURE (pTraits->iPixelsPerRow > 0);
+
+ switch (pTraits->iBitsPerPixel) {
+ case 1: g->image_type = IM_BILEVEL; break;
+ case 8: g->image_type = IM_GRAY; break;
+ case 24: g->image_type = IM_COLOR; break;
+ }
+
+ /* We don't actually support IM_BILEVEL currently. */
+ INSURE(g->image_type != IM_BILEVEL);
+
+ g->inTraits = *pTraits; /* a structure copy */
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * scale_setXformSpec - Provides xform-specific information
+ *
+\*****************************************************************************/
+
+static WORD scale_setXformSpec (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD_OR_PVOID aXformInfo[]) /* in: xform information */
+{
+ PSC_INST g;
+ HANDLE_TO_PTR (hXform, g);
+
+ g->horiz_fac = (aXformInfo[IP_SCALE_HORIZ_FACTOR].dword+0x80) >> 8;
+ g->vert_fac = (aXformInfo[IP_SCALE_VERT_FACTOR].dword+0x80) >> 8;
+ g->fast = aXformInfo[IP_SCALE_FAST].dword;
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * scale_getHeaderBufSize- Returns size of input buf needed to hold header
+ *
+\*****************************************************************************/
+
+static WORD scale_getHeaderBufSize (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD *pdwInBufLen) /* out: buf size for parsing header */
+{
+ /* since input is raw pixels, there is no header, so set it to zero */
+ *pdwInBufLen = 0;
+ return IP_DONE;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * scale_getActualTraits - Parses header, and returns input & output traits
+ *
+\*****************************************************************************/
+
+static WORD scale_getActualTraits (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD dwInputAvail, /* in: # avail bytes in input buf */
+ PBYTE pbInputBuf, /* in: ptr to input buffer */
+ PDWORD pdwInputUsed, /* out: # bytes used from input buf */
+ PDWORD pdwInputNextPos,/* out: file-pos to read from next */
+ PIP_IMAGE_TRAITS pInTraits, /* out: input image traits */
+ PIP_IMAGE_TRAITS pOutTraits) /* out: output image traits */
+{
+ PSC_INST g;
+ int i;
+ UINT in_row_len;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ /**** Since there is no header, we'll report no usage of input ****/
+
+ *pdwInputUsed = 0;
+ *pdwInputNextPos = 0;
+
+ /**** Open the particular type of scaler we'll need ****/
+
+ in_row_len = g->inTraits.iPixelsPerRow;
+
+ switch (g->image_type) {
+ case IM_BILEVEL:
+ if (g->vert_fac < 0x10000u)
+ g->fast = FALSE; /* bi-level down-scale doesn't have fast case */
+ if (g->fast) bi_fast_open (g, in_row_len);
+ else bi_scale_open (g, in_row_len);
+ break;
+
+ case IM_GRAY:
+ case IM_COLOR:
+ if (g->vert_fac > 0x10000u)
+ g->fast = FALSE; /* contone up-scale doesn't have fast case */
+ contone_scale_open (g, in_row_len);
+ break;
+ }
+
+ /**** Allocate the held output rows ****/
+
+ g->nMaxOutRows = (g->vert_fac+0x0000ffffu) >> 16;
+ INSURE (g->nMaxOutRows <= HELD_ARRAY_SIZE);
+ for (i=1; i<g->nMaxOutRows; i++)
+ IP_MEM_ALLOC (g->out_row_nbytes, g->apHeldOutRows[i]);
+
+ /**** Report back input- and output-traits ****/
+
+ *pInTraits = g->inTraits; /* structure copies */
+ *pOutTraits = g->inTraits;
+ pOutTraits->iPixelsPerRow = g->out_row_pixels;
+ if (pInTraits->lNumRows >= 0) {
+ /* use floating point because fixed-point product would
+ * overflow if # rows is over 16 bits */
+ pOutTraits->lNumRows = (long)
+ ((float)pInTraits->lNumRows * g->vert_fac / 65536.0);
+ }
+
+ return IP_DONE | IP_READY_FOR_DATA;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/****************************************************************************\
+ *
+ * scale_getActualBufSizes - Returns buf sizes needed for remainder of job
+ *
+\****************************************************************************/
+
+static WORD scale_getActualBufSizes (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ PDWORD pdwMinInBufLen, /* out: min input buf size */
+ PDWORD pdwMinOutBufLen) /* out: min output buf size */
+{
+ PSC_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+ *pdwMinInBufLen = g->in_row_nbytes;
+ *pdwMinOutBufLen = g->out_row_nbytes;
+
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * scale_convert - Converts one row
+ *
+\*****************************************************************************/
+
+static WORD scale_convert (
+ IP_XFORM_HANDLE hXform,
+ DWORD dwInputAvail, /* in: # avail bytes in in-buf */
+ PBYTE pbInputBuf, /* in: ptr to in-buffer */
+ PDWORD pdwInputUsed, /* out: # bytes used from in-buf */
+ PDWORD pdwInputNextPos, /* out: file-pos to read from next */
+ DWORD dwOutputAvail, /* in: # avail bytes in out-buf */
+ PBYTE pbOutputBuf, /* in: ptr to out-buffer */
+ PDWORD pdwOutputUsed, /* out: # bytes written in out-buf */
+ PDWORD pdwOutputThisPos) /* out: file-pos to write the data */
+{
+ PSC_INST g;
+ BYTE src_traits;
+ ULONG dest_traits;
+ int inUsed, outUsed;
+ int n_rows;
+ WORD wResults;
+
+ HANDLE_TO_PTR (hXform, g);
+ inUsed = 0;
+ outUsed = 0;
+
+ /**** Return next stored output-row, if any ****/
+
+ if (g->nMoreHeldOutRows > 0) {
+ memcpy (pbOutputBuf,
+ g->apHeldOutRows[g->iNextHeldOutRow],
+ g->out_row_nbytes);
+ g->nMoreHeldOutRows -= 1;
+ g->iNextHeldOutRow += 1;
+ outUsed = g->out_row_nbytes;
+ goto finish;
+ }
+
+ /**** Check if we were told to flush ****/
+
+ if (pbInputBuf == NULL) {
+ PRINT (_T("scale_convert: Told to flush.\n"), 0, 0);
+ if (g->nMoreFlush == 0)
+ goto finish;
+ g->nMoreFlush -= 1;
+ /* do "scale a row" section below, with pbInputBuf equal to NULL */
+ } else
+ inUsed = g->in_row_nbytes;
+
+ /**** Scale a Row ****/
+
+ g->apHeldOutRows[0] = pbOutputBuf; /* 1st out-row is client's buffer */
+ n_rows = 0; /* init to avoid compiler warning */
+ src_traits = 0;
+
+ switch (g->image_type) {
+ case IM_BILEVEL:
+ if (g->fast)
+ n_rows = bi_fast_row (g, pbInputBuf, src_traits,
+ g->apHeldOutRows, &dest_traits);
+ else
+ n_rows = bi_scale_row (g, pbInputBuf, src_traits,
+ g->apHeldOutRows, &dest_traits);
+ break;
+
+ case IM_GRAY:
+ case IM_COLOR:
+ n_rows = contone_scale_row (g, pbInputBuf, g->apHeldOutRows);
+ break;
+ }
+
+ INSURE (n_rows <= g->nMaxOutRows);
+ if (n_rows > 0) {
+ g->nMoreHeldOutRows = n_rows - 1;
+ g->iNextHeldOutRow = 1;
+ outUsed = g->out_row_nbytes;
+ }
+
+ /**** Report results and return (inUsed and outUsed are valid here) ****/
+
+ finish:
+
+ *pdwInputUsed = (DWORD)inUsed;
+ g->dwInNextPos += (DWORD)inUsed;
+ *pdwInputNextPos = g->dwInNextPos;
+
+ *pdwOutputUsed = (DWORD)outUsed;
+ *pdwOutputThisPos = g->dwOutNextPos;
+ g->dwOutNextPos += (DWORD)outUsed;
+
+ wResults = ( inUsed>0 ? IP_CONSUMED_ROW : 0)
+ | (outUsed>0 ? IP_PRODUCED_ROW : 0)
+ | (g->nMoreHeldOutRows==0 ? IP_READY_FOR_DATA : 0)
+ | (pbInputBuf==NULL &&
+ g->nMoreFlush==0 &&
+ g->nMoreHeldOutRows==0 ? IP_DONE : 0);
+ return wResults;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * scale_insertedData - client inserted into our output stream
+ *
+\*****************************************************************************/
+
+static WORD scale_insertedData (
+ IP_XFORM_HANDLE hXform,
+ DWORD dwNumBytes)
+{
+ fatalBreakPoint ();
+ return IP_FATAL_ERROR; /* must never be called (can't insert data) */
+}
+
+
+
+/*****************************************************************************\
+ *
+ * scale_newPage - Tells us to flush this page, and start a new page
+ *
+\*****************************************************************************/
+
+static WORD scale_newPage (
+ IP_XFORM_HANDLE hXform)
+{
+ PSC_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+ /* todo: return fatal error if convert is called again? */
+ return IP_DONE; /* can't insert page-breaks, so ignore this call */
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+
+}
+
+
+
+/*****************************************************************************\
+ *
+ * scale_closeXform - Destroys this instance
+ *
+\*****************************************************************************/
+
+static WORD scale_closeXform (IP_XFORM_HANDLE hXform)
+{
+ PSC_INST g;
+ int i;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ switch (g->image_type) {
+ case IM_BILEVEL:
+ if (g->fast) bi_fast_close (g);
+ else bi_scale_close (g);
+ break;
+
+ case IM_GRAY:
+ case IM_COLOR:
+ contone_scale_close (g);
+ break;
+ }
+
+ for (i=1; i<g->nMaxOutRows; i++)
+ IP_MEM_FREE (g->apHeldOutRows[i]);
+
+ g->dwValidChk = 0;
+ IP_MEM_FREE (g); /* free memory for the instance */
+
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * scaleTbl - Jump-table for scaler
+ *
+\*****************************************************************************/
+
+IP_XFORM_TBL scaleTbl = {
+ scale_openXform,
+ scale_setDefaultInputTraits,
+ scale_setXformSpec,
+ scale_getHeaderBufSize,
+ scale_getActualTraits,
+ scale_getActualBufSizes,
+ scale_convert,
+ scale_newPage,
+ scale_insertedData,
+ scale_closeXform
+};
+
+/* End of File */
diff --git a/ip/xskel.c b/ip/xskel.c
new file mode 100644
index 0000000..930af94
--- /dev/null
+++ b/ip/xskel.c
@@ -0,0 +1,456 @@
+/* libhpojip -- HP OfficeJet image-processing library. */
+
+/* Copyright (C) 1995-2002 Hewlett-Packard Company
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ * MA 02111-1307, USA.
+ *
+ * In addition, as a special exception, Hewlett-Packard Company
+ * gives permission to link the code of this program with any
+ * version of the OpenSSL library which is distributed under a
+ * license identical to that listed in the included LICENSE.OpenSSL
+ * file, and distribute linked combinations including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * this file, you may extend this exception to your version of the
+ * file, but you are not obligated to do so. If you do not wish to
+ * do so, delete this exception statement from your version.
+ */
+
+/* Original author: Mark Overton and others.
+ *
+ * Ported to Linux by David Paschal.
+ */
+
+/******************************************************************************\
+ *
+ * xskel.c - A skeleton xform driver on which new xforms can be based
+ *
+ * You must change "skel" and "SKEL" to your actual xform name.
+ *
+ ******************************************************************************
+ *
+ * Name of Global Jump-Table:
+ *
+ * skelTbl
+ *
+ * Items in aXformInfo array passed into setXformSpec:
+ *
+ * aXformInfo[IP_SKEL_SPEC_1] = fully describe these options here, if any
+ * aXformInfo[IP_SKEL_SPEC_2] =
+ *
+ * Capabilities and Limitations:
+ *
+ * What does this xform do? What limitations of data types, ranges, etc?
+ *
+ * Default Input Traits, and Output Traits:
+ *
+ * Describe what you do with the default input traits, and how the
+ * output traits are determined.
+ *
+ * trait default input output
+ * ------------------- --------------------- ------------------------
+ * iPixelsPerRow * passed into output same as default input
+ * iBitsPerPixel * passed into output same as default input
+ * iComponentsPerPixel * passed into output same as default input
+ * lHorizDPI passed into output same as default input
+ * lVertDPI passed into output same as default input
+ * lNumRows passed into output same as default input
+ * iNumPages passed into output same as default input
+ * iPageNum passed into output same as default input
+ *
+ * Above, a "*" by an item indicates it must be valid (not negative).
+ *
+\******************************************************************************/
+
+// Use the #define below if this transform will exist in a dll outside of the
+// image pipeline. This will allow the functions to be exported.
+// #define EXPORT_TRANFORM 1
+
+#include "hpip.h"
+#include "ipdefs.h"
+#include "string.h" /* for memset and memcpy */
+
+
+#if 0
+ #include "stdio.h"
+ #include <tchar.h>
+ #define PRINT(msg,arg1,arg2) \
+ _ftprintf(stderr, msg, (int)arg1, (int)arg2)
+#else
+ #define PRINT(msg,arg1,arg2)
+#endif
+
+#define CHECK_VALUE 0x4ba1dace
+
+#ifdef EXPORT_TRANSFORM
+#define FUNC_STATUS __declspec (dllexport)
+#else
+#define FUNC_STATUS static
+#endif
+
+typedef struct {
+ IP_IMAGE_TRAITS traits; /* traits of the input and output image */
+ DWORD dwBytesPerRow; /* # of bytes in each row */
+ DWORD dwRowsDone; /* number of rows converted so far */
+ DWORD dwInNextPos; /* file pos for subsequent input */
+ DWORD dwOutNextPos; /* file pos for subsequent output */
+ DWORD dwValidChk; /* struct validity check value */
+} SKEL_INST, *PSKEL_INST;
+
+
+
+/*****************************************************************************\
+ *
+ * skel_openXform - Creates a new instance of the transformer
+ *
+ *****************************************************************************
+ *
+ * This returns a handle for the new instance to be passed into
+ * all subsequent calls.
+ *
+ * Return value: IP_DONE=success; IP_FATAL_ERROR=misc error.
+ *
+\*****************************************************************************/
+
+FUNC_STATUS WORD skel_openXform (
+ IP_XFORM_HANDLE *pXform) /* out: returned handle */
+{
+ PSKEL_INST g;
+
+ INSURE (pXform != NULL);
+ IP_MEM_ALLOC (sizeof(SKEL_INST), g);
+ *pXform = g;
+ memset (g, 0, sizeof(SKEL_INST));
+ g->dwValidChk = CHECK_VALUE;
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * skel_setDefaultInputTraits - Specifies default input image traits
+ *
+ *****************************************************************************
+ *
+ * The header of the file-type handled by the transform probably does
+ * not include *all* the image traits we'd like to know. Those not
+ * specified in the file-header are filled in from info provided by
+ * this routine.
+ *
+ * Return value: IP_DONE=success; IP_FATAL_ERROR=misc error.
+ *
+\*****************************************************************************/
+
+FUNC_STATUS WORD skel_setDefaultInputTraits (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ PIP_IMAGE_TRAITS pTraits) /* in: default image traits */
+{
+ PSKEL_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ /* insure that traits we care about are known */
+ INSURE (pTraits->iPixelsPerRow>0 && pTraits->iBitsPerPixel>0);
+ g->traits = *pTraits; /* a structure copy */
+ g->dwBytesPerRow = (g->traits.iPixelsPerRow*g->traits.iBitsPerPixel + 7) / 8;
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * skel_setXformSpec - Provides xform-specific information
+ *
+\*****************************************************************************/
+
+FUNC_STATUS WORD skel_setXformSpec (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD_OR_PVOID aXformInfo[]) /* in: xform information */
+{
+ PSKEL_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ /* Check your options in aXformInfo here, and save them.
+ * Use the INSURE macro like you'd use assert. INSURE jumps to
+ * fatal_error below if it fails.
+ */
+
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * skel_getHeaderBufSize- Returns size of input buf needed to hold header
+ *
+\*****************************************************************************/
+
+FUNC_STATUS WORD skel_getHeaderBufSize (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD *pdwInBufLen) /* out: buf size for parsing header */
+{
+ /* since input is raw pixels, there is no header, so set it to zero */
+ *pdwInBufLen = 0;
+ return IP_DONE;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * skel_getActualTraits - Parses header, and returns input & output traits
+ *
+\*****************************************************************************/
+
+FUNC_STATUS WORD skel_getActualTraits (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD dwInputAvail, /* in: # avail bytes in input buf */
+ PBYTE pbInputBuf, /* in: ptr to input buffer */
+ PDWORD pdwInputUsed, /* out: # bytes used from input buf */
+ PDWORD pdwInputNextPos,/* out: file-pos to read from next */
+ PIP_IMAGE_TRAITS pInTraits, /* out: input image traits */
+ PIP_IMAGE_TRAITS pOutTraits) /* out: output image traits */
+{
+ PSKEL_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ /* Since there is no header, we'll report no usage of input */
+ *pdwInputUsed = 0;
+ *pdwInputNextPos = 0;
+ g->dwInNextPos = 0;
+
+ *pInTraits = g->traits; /* structure copies */
+ *pOutTraits = g->traits;
+
+ return IP_DONE | IP_READY_FOR_DATA;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/****************************************************************************\
+ *
+ * skel_getActualBufSizes - Returns buf sizes needed for remainder of job
+ *
+\****************************************************************************/
+
+FUNC_STATUS WORD skel_getActualBufSizes (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ PDWORD pdwMinInBufLen, /* out: min input buf size */
+ PDWORD pdwMinOutBufLen) /* out: min output buf size */
+{
+ PSKEL_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ *pdwMinInBufLen = *pdwMinOutBufLen = g->dwBytesPerRow;
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * skel_convert - Converts one row
+ *
+\*****************************************************************************/
+
+FUNC_STATUS WORD skel_convert (
+ IP_XFORM_HANDLE hXform,
+ DWORD dwInputAvail, /* in: # avail bytes in in-buf */
+ PBYTE pbInputBuf, /* in: ptr to in-buffer */
+ PDWORD pdwInputUsed, /* out: # bytes used from in-buf */
+ PDWORD pdwInputNextPos, /* out: file-pos to read from next */
+ DWORD dwOutputAvail, /* in: # avail bytes in out-buf */
+ PBYTE pbOutputBuf, /* in: ptr to out-buffer */
+ PDWORD pdwOutputUsed, /* out: # bytes written in out-buf */
+ PDWORD pdwOutputThisPos) /* out: file-pos to write the data */
+{
+ PSKEL_INST g;
+ int nBytes;
+ PBYTE pIn, pOut;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ /**** Check if we were told to flush ****/
+
+ if (pbInputBuf == NULL) {
+ PRINT (_T("skel_convert: Told to flush.\n"), 0, 0);
+ *pdwInputUsed = *pdwOutputUsed = 0;
+ *pdwInputNextPos = g->dwInNextPos;
+ *pdwOutputThisPos = g->dwOutNextPos;
+ return IP_DONE;
+ }
+
+ /**** Output a Row ****/
+
+ nBytes = g->dwBytesPerRow;
+ INSURE (dwInputAvail >= (DWORD)nBytes );
+ INSURE (dwOutputAvail >= (DWORD)nBytes);
+
+ pIn = pbInputBuf;
+ pOut = pbOutputBuf;
+
+ /* At this point, pIn is your input buffer, and pOut is your output buffer.
+ * Do whatever you are going to do here.
+ */
+ memcpy(pOut,pIn,nBytes);
+
+ *pdwInputUsed = nBytes;
+ g->dwInNextPos += nBytes;
+ *pdwInputNextPos = g->dwInNextPos;
+
+ *pdwOutputUsed = nBytes;
+ *pdwOutputThisPos = g->dwOutNextPos;
+ g->dwOutNextPos += nBytes;
+
+ g->dwRowsDone += 1;
+
+ return IP_CONSUMED_ROW | IP_PRODUCED_ROW | IP_READY_FOR_DATA;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * skel_insertedData - client inserted into our output stream
+ *
+\*****************************************************************************/
+
+FUNC_STATUS WORD skel_insertedData (
+ IP_XFORM_HANDLE hXform,
+ DWORD dwNumBytes)
+{
+ fatalBreakPoint ();
+ return IP_FATAL_ERROR; /* must never be called (can't insert data) */
+}
+
+
+
+/*****************************************************************************\
+ *
+ * skel_newPage - Tells us to flush this page, and start a new page
+ *
+\*****************************************************************************/
+
+FUNC_STATUS WORD skel_newPage (
+ IP_XFORM_HANDLE hXform)
+{
+ PSKEL_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+ /* todo: return fatal error if convert is called again? */
+ return IP_DONE; /* can't insert page-breaks, so ignore this call */
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+
+}
+
+
+
+/*****************************************************************************\
+ *
+ * skel_closeXform - Destroys this instance
+ *
+\*****************************************************************************/
+
+FUNC_STATUS WORD skel_closeXform (IP_XFORM_HANDLE hXform)
+{
+ PSKEL_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ g->dwValidChk = 0;
+ IP_MEM_FREE (g); /* free memory for the instance */
+
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * skelTbl - Jump-table for transform driver
+ *
+\*****************************************************************************/
+#ifdef EXPORT_TRANSFORM
+__declspec (dllexport)
+#endif
+IP_XFORM_TBL skelTbl = {
+ skel_openXform,
+ skel_setDefaultInputTraits,
+ skel_setXformSpec,
+ skel_getHeaderBufSize,
+ skel_getActualTraits,
+ skel_getActualBufSizes,
+ skel_convert,
+ skel_newPage,
+ skel_insertedData,
+ skel_closeXform
+};
+
+/* End of File */
+
+
+/*****************************************************************************\
+ *
+ * ipGetXformTable - Returns pointer to the jump table
+ *
+\*****************************************************************************/
+
+#ifdef EXPORT_TRANSFORM
+EXPORT(WORD) ipGetXformTable (LPIP_XFORM_TBL pXform)
+{
+ WORD wRet = IP_DONE;
+
+ if (pXform)
+ {
+ *pXform = clrmapTbl;
+ }
+ else
+ {
+ wRet = IP_FATAL_ERROR;
+ }
+
+ return wRet;
+}
+#endif
diff --git a/ip/xtable.c b/ip/xtable.c
new file mode 100644
index 0000000..35c85a2
--- /dev/null
+++ b/ip/xtable.c
@@ -0,0 +1,742 @@
+/* libhpojip -- HP OfficeJet image-processing library. */
+
+/* Copyright (C) 1995-2002 Hewlett-Packard Company
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ * MA 02111-1307, USA.
+ *
+ * In addition, as a special exception, Hewlett-Packard Company
+ * gives permission to link the code of this program with any
+ * version of the OpenSSL library which is distributed under a
+ * license identical to that listed in the included LICENSE.OpenSSL
+ * file, and distribute linked combinations including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * this file, you may extend this exception to your version of the
+ * file, but you are not obligated to do so. If you do not wish to
+ * do so, delete this exception statement from your version.
+ */
+
+/* Original author: Mark Overton and others.
+ *
+ * Ported to Linux by David Paschal.
+ */
+
+/******************************************************************************\
+ *
+ * xtable.c - Performs a 256-entry table lookup on all bytes
+ *
+ ******************************************************************************
+ *
+ * Name of Global Jump-Table:
+ *
+ * tableTbl
+ *
+ * Items in aXformInfo array passed into setXformSpec:
+ *
+ * aXformInfo[IP_TABLE_WHICH] = contents of table to use:
+ * IP_TABLE_USER = user-supplied pointer to a 256-byte table,
+ * IP_TABLE_USER_WORD = user-supplied pointer to a 4096-word table,
+ * IP_TABLE_PASS_THRU = pass-thru table that does nothing,
+ * IP_TABLE_GAMMA = gamma function,
+ * IP_TABLE_THRESHOLD = threshold (snaps each incoming byte to 0 or 255),
+ * IP_TABLE_MIRROR = mirror-image each incoming byte,
+ * IP_TABLE_USER_THREE = three user-supplied table pointers,
+ * IP_TABLE_USER_THREE_WORD = three user-supplied table pointers for 48-bit (see format below),
+ * IP_TABLE_BW_CLIP = white/black clipper (2 thresholds below)
+ *
+ * aXformInfo[IP_TABLE_OPTION] =
+ * parameter based on type of table to use. values:
+ * - (type IP_TABLE_USER) pointer to user table,
+ * this table is copied into this xform's instance,
+ * - (type IP_TABLE_GAMMA) gamma value, in 16.16 fixed-point, a value
+ * less than 1.0 does an inverse gamma, (for
+ * type IP_TABLE_GAMMA above),
+ * - (type IP_TABLE_THRESHOLD) threshold value. if an incoming byte is >=
+ * this value, it changes to 255, else it changes
+ * to 0 (for type IP_TABLE_THRESHOLD above),
+ * - (type IP_TABLE_BW_CLIP) hi word = number of 0 entries at start,
+ * lo word = number of 255 entries at end,
+ *
+ * For option IP_TABLE_USER_THREE above (three user-supplied table pointers),
+ * these three 256-byte tables are for 3-component color data. The pointers are in
+ * aXformInfo[IP_TABLE_COLOR_1], aXformInfo[IP_TABLE_COLOR_2], and aXformInfo[IP_TABLE_COLOR_3].
+ *
+ * For option IP_TABLE_USER_THREE_WORD (three user tables for 48-bit color data),
+ * the pointers are in aXformInfo as with IP_TABLE_USER_THREE.
+ * Each table consists of 4096 words (8192 bytes) which are indexed by the high 12 bits
+ * of each color-channel. The low four bits are interpolated herein. Each table-entry
+ * contains a 16-bit pixel-value, even though it's indexed by just 12 bits.
+ *
+ * IP_TABLE_USER_WORD is like IP_TABLE_USER_THREE_WORD described above.
+ *
+ * For option IP_TABLE_BW_CLIP, the white/black clipper, the table starts with the given
+ * number of 0's, and ends with the given number of 255's, and linearly
+ * progresses between 1 and 254 in between them. This serves to snap
+ * almost-black to black, and almost-white to white. If these numbers
+ * are large, this table also boosts contrast.
+ *
+ * Capabilities and Limitations:
+ *
+ * The incoming data can be any kind of raw pixels of 1, 8, 16, 24 or 48
+ * bits/pixel. Bi-level (1 bit/pixel) data is treated as 8 pixels per byte.
+ * All table-types support all these forms of input data. For 16 bits/channel
+ * data, the tables are interpolated.
+ *
+ * For improved precision, the following define larger (12-bit index) tables:
+ * IP_TABLE_USER_WORD - 16 bits per pixel (grayscale)
+ * IP_TABLE_USER_THREE_WORD - 48 bits per pixel (color)
+ *
+ * Also, IP_TABLE_GAMMA will create a 12-bit table when the input data
+ * is 16 bits/channel.
+ *
+ * 12-bit tables work with 8-bit/channel data, and 8-bit tables work with
+ * 16-bit/channel data. Truncation or interpolation is done as needed.
+ *
+ * Default Input Traits, and Output Traits:
+ *
+ * trait default input output
+ * ------------------- --------------------- ------------------------
+ * iPixelsPerRow * passed into output same as default input
+ * iBitsPerPixel * passed into output same as default input
+ * iComponentsPerPixel passed into output same as default input
+ * lHorizDPI passed into output same as default input
+ * lVertDPI passed into output same as default input
+ * lNumRows passed into output same as default input
+ * iNumPages passed into output same as default input
+ * iPageNum passed into output same as default input
+ *
+ * Above, a "*" by an item indicates it must be valid (not negative).
+ *
+ * Apr 1998 Mark Overton -- wrote original code
+ *
+\******************************************************************************/
+
+#include "hpip.h"
+#include "ipdefs.h"
+#include "string.h" /* for memset and memcpy */
+#include "math.h" /* for pow for generating gamma table */
+
+
+#if 0
+ #include "stdio.h"
+ #include <tchar.h>
+
+ #define PRINT(msg,arg1,arg2) \
+ _ftprintf(stderr, msg, (int)arg1, (int)arg2)
+#else
+ #define PRINT(msg,arg1,arg2)
+#endif
+
+#define CHECK_VALUE 0x4ba1dace
+
+
+typedef struct {
+ IP_IMAGE_TRAITS traits; /* traits of the input and output image */
+ BYTE bWhich; /* which table to generate */
+ BYTE bTables[3][256]; /* the 8-bit look-up tables */
+ WORD *pwTables[3]; /* ptrs to 12-bit-index tables (for 16-bits/pixel) */
+ BOOL bBigTable; /* are we using the 12-bit tables? */
+ int nTables; /* # of tables defined (1 or 3) */
+ DWORD dwBytesPerRow; /* # of bytes in each row */
+ DWORD dwRowsDone; /* number of rows converted so far */
+ DWORD dwInNextPos; /* file pos for subsequent input */
+ DWORD dwOutNextPos; /* file pos for subsequent output */
+ DWORD dwValidChk; /* struct validity check value */
+} TBL_INST, *PTBL_INST;
+
+
+typedef enum {
+ TBL_USER,
+ TBL_PASS_THRU,
+ TBL_GAMMA,
+ TBL_THRESHOLD,
+ TBL_MIRROR,
+ TBL_USER_THREE,
+ TBL_BW_CLIP
+} TABLE_TYPE;
+
+
+
+static BOOL generateTable (
+ PTBL_INST g,
+ DWORD_OR_PVOID aXformInfo[])
+{
+ IP_TABLE_TYPE which;
+ DWORD dwparam;
+ PVOID pvparam;
+ float flparam;
+ PBYTE pTable;
+ PWORD pwTable;
+ int nTable;
+
+ g->nTables = 1;
+ g->bBigTable = FALSE;
+ pTable = g->bTables[0];
+ dwparam = aXformInfo[IP_TABLE_OPTION].dword;
+ pvparam = aXformInfo[IP_TABLE_OPTION].pvoid;
+ flparam = aXformInfo[IP_TABLE_OPTION].fl;
+ which = (IP_TABLE_TYPE)aXformInfo[IP_TABLE_WHICH].dword;
+ g->bWhich = (BYTE)which;
+
+ switch (which)
+ {
+ case IP_TABLE_USER:
+ if (pvparam == 0)
+ return FALSE;
+ memcpy (pTable, (PBYTE)pvparam, 256);
+ break;
+
+ case IP_TABLE_USER_WORD:
+ if (pvparam == 0)
+ return FALSE;
+ IP_MEM_ALLOC (4097*sizeof(WORD), pwTable); /* 4097: extra entry at end */
+ g->pwTables[0] = pwTable;
+ memcpy (pwTable, (PWORD)pvparam, 4096*sizeof(WORD));
+ pwTable[4096] = pwTable[4095]; /* extra entry to help interpolation */
+ g->bBigTable = TRUE;
+ break;
+
+ case IP_TABLE_USER_THREE:
+ if (aXformInfo[IP_TABLE_COLOR_1].pvoid==0 ||
+ aXformInfo[IP_TABLE_COLOR_2].pvoid==0 ||
+ aXformInfo[IP_TABLE_COLOR_3].pvoid==0)
+ return FALSE;
+ memcpy (g->bTables[0], (PBYTE)aXformInfo[IP_TABLE_COLOR_1].pvoid, 256);
+ memcpy (g->bTables[1], (PBYTE)aXformInfo[IP_TABLE_COLOR_2].pvoid, 256);
+ memcpy (g->bTables[2], (PBYTE)aXformInfo[IP_TABLE_COLOR_3].pvoid, 256);
+ g->nTables = 3;
+ break;
+
+ case IP_TABLE_USER_THREE_WORD:
+ if (aXformInfo[IP_TABLE_COLOR_1].pvoid==0 ||
+ aXformInfo[IP_TABLE_COLOR_2].pvoid==0 ||
+ aXformInfo[IP_TABLE_COLOR_3].pvoid==0)
+ return FALSE;
+
+ for (nTable=0; nTable<3; nTable++) {
+ IP_MEM_ALLOC (4097*sizeof(WORD), pwTable); /* 4097: extra entry at end */
+ g->pwTables[nTable] = pwTable;
+ memcpy (pwTable, (PWORD)aXformInfo[IP_TABLE_COLOR_1+nTable].pvoid, 4096*sizeof(WORD));
+ pwTable[4096] = pwTable[4095]; /* extra entry to help interpolation */
+ }
+ g->nTables = 3;
+ g->bBigTable = TRUE;
+ break;
+
+ case IP_TABLE_PASS_THRU:
+ {
+ int i;
+
+ for (i=0; i<=255; i++)
+ pTable[i] = i;
+ }
+ break;
+
+ case IP_TABLE_GAMMA:
+ {
+ int index;
+ float fval;
+ float gamma;
+ float gamval;
+
+ gamma = (float)flparam / (float)(1L<<16);
+ if (gamma<=0.0f || gamma>=10.0f)
+ return FALSE;
+ gamma = 1.0f / gamma;
+
+ if (g->traits.iBitsPerPixel==16 || g->traits.iBitsPerPixel==48) {
+ WORD *pwTable;
+ IP_MEM_ALLOC (4097*sizeof(WORD), pwTable); /* 4097: extra entry at end */
+ g->pwTables[0] = pwTable;
+
+ for (index=0; index<=4095u; index++) {
+ fval = (float)index / 4095.0f;
+ gamval = 65535.0f * (float)pow(fval, gamma);
+ pwTable[index] = (WORD)(gamval + 0.5f);
+ }
+
+ pwTable[4096] = pwTable[4095]; /* extra entry to help interpolation */
+ g->bBigTable = TRUE;
+ } else {
+ for (index=0; index<=255u; index++) {
+ fval = (float)index / 255.0f;
+ gamval = 255.0f * (float)pow(fval, gamma);
+ pTable[index] = (BYTE)(gamval + 0.5f);
+ }
+ }
+ }
+ break;
+
+ case IP_TABLE_THRESHOLD:
+ if (dwparam<1 || dwparam>255)
+ return FALSE;
+ memset (pTable, 0, dwparam);
+ memset (pTable+dwparam, 255, 256-dwparam);
+ break;
+
+ case IP_TABLE_MIRROR:
+ {
+ UINT index, mask;
+
+ for (index=0; index<=255; index++) {
+ for (mask=0x01u; mask<=0x80u; mask<<=1) {
+ pTable[index] <<= 1;
+ if (index & mask)
+ pTable[index] += 1;
+ }
+ }
+ }
+ break;
+
+ case IP_TABLE_BW_CLIP:
+ {
+ DWORD nBlack, nWhite, nMid, slopeMid, posMid, index;
+
+ nBlack = dwparam >> 16;
+ nWhite = dwparam & 0xFFFFu;
+
+ if (nBlack+nWhite > 256)
+ return FALSE;
+
+ for (index=0; index<nBlack; index++)
+ pTable[index] = 0;
+
+ for (index=256-nWhite; index<=255; index++)
+ pTable[index] = 255;
+
+ nMid = 256 - nBlack - nWhite;
+ slopeMid = (255ul<<16) / (nMid + 1);
+ posMid = 0x8000u; /* offset for rounding */
+
+ for (index=nBlack; index<256-nWhite; index++) {
+ posMid += slopeMid;
+ pTable[index] = (BYTE)(posMid >> 16);
+ }
+ }
+ break;
+
+ default:
+ return FALSE;
+ }
+
+ return TRUE;
+
+fatal_error:
+ return FALSE;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * table_openXform - Creates a new instance of the transformer
+ *
+ *****************************************************************************
+ *
+ * This returns a handle for the new instance to be passed into
+ * all subsequent calls.
+ *
+ * Return value: IP_DONE=success; IP_FATAL_ERROR=misc error.
+ *
+\*****************************************************************************/
+
+static WORD table_openXform (
+ IP_XFORM_HANDLE *pXform) /* out: returned handle */
+{
+ PTBL_INST g;
+
+ INSURE (pXform != NULL);
+ IP_MEM_ALLOC (sizeof(TBL_INST), g);
+ *pXform = g;
+ memset (g, 0, sizeof(TBL_INST));
+ g->dwValidChk = CHECK_VALUE;
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * table_setDefaultInputTraits - Specifies default input image traits
+ *
+ *****************************************************************************
+ *
+ * The header of the file-type handled by the transform probably does
+ * not include *all* the image traits we'd like to know. Those not
+ * specified in the file-header are filled in from info provided by
+ * this routine.
+ *
+ * Return value: IP_DONE=success; IP_FATAL_ERROR=misc error.
+ *
+\*****************************************************************************/
+
+static WORD table_setDefaultInputTraits (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ PIP_IMAGE_TRAITS pTraits) /* in: default image traits */
+{
+ PTBL_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ /* insure that traits we care about are known */
+ INSURE (pTraits->iPixelsPerRow>0 && pTraits->iBitsPerPixel>0);
+ g->traits = *pTraits; /* a structure copy */
+ g->dwBytesPerRow = (g->traits.iPixelsPerRow*g->traits.iBitsPerPixel + 7) / 8;
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * table_setXformSpec - Provides xform-specific information
+ *
+\*****************************************************************************/
+
+static WORD table_setXformSpec (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD_OR_PVOID aXformInfo[]) /* in: xform information */
+{
+ PTBL_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ if (! generateTable(g,aXformInfo))
+ goto fatal_error;
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * table_getHeaderBufSize- Returns size of input buf needed to hold header
+ *
+\*****************************************************************************/
+
+static WORD table_getHeaderBufSize (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD *pdwInBufLen) /* out: buf size for parsing header */
+{
+ /* since input is raw pixels, there is no header, so set it to zero */
+ *pdwInBufLen = 0;
+ return IP_DONE;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * table_getActualTraits - Parses header, and returns input & output traits
+ *
+\*****************************************************************************/
+
+static WORD table_getActualTraits (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD dwInputAvail, /* in: # avail bytes in input buf */
+ PBYTE pbInputBuf, /* in: ptr to input buffer */
+ PDWORD pdwInputUsed, /* out: # bytes used from input buf */
+ PDWORD pdwInputNextPos,/* out: file-pos to read from next */
+ PIP_IMAGE_TRAITS pIntraits, /* out: input image traits */
+ PIP_IMAGE_TRAITS pOutTraits) /* out: output image traits */
+{
+ PTBL_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ /* Since there is no header, we'll report no usage of input */
+ *pdwInputUsed = 0;
+ *pdwInputNextPos = 0;
+
+ *pIntraits = g->traits; /* structure copies */
+ *pOutTraits = g->traits;
+
+ return IP_DONE | IP_READY_FOR_DATA;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/****************************************************************************\
+ *
+ * table_getActualBufSizes - Returns buf sizes needed for remainder of job
+ *
+\****************************************************************************/
+
+static WORD table_getActualBufSizes (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ PDWORD pdwMinInBufLen, /* out: min input buf size */
+ PDWORD pdwMinOutBufLen) /* out: min output buf size */
+{
+ PTBL_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ *pdwMinInBufLen = *pdwMinOutBufLen = g->dwBytesPerRow;
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * table_convert - Converts one row
+ *
+\*****************************************************************************/
+
+static WORD table_convert (
+ IP_XFORM_HANDLE hXform,
+ DWORD dwInputAvail, /* in: # avail bytes in in-buf */
+ PBYTE pbInputBuf, /* in: ptr to in-buffer */
+ PDWORD pdwInputUsed, /* out: # bytes used from in-buf */
+ PDWORD pdwInputNextPos, /* out: file-pos to read from next */
+ DWORD dwOutputAvail, /* in: # avail bytes in out-buf */
+ PBYTE pbOutputBuf, /* in: ptr to out-buffer */
+ PDWORD pdwOutputUsed, /* out: # bytes written in out-buf */
+ PDWORD pdwOutputThisPos) /* out: file-pos to write the data */
+{
+ PTBL_INST g;
+ int nBytes, nTable;
+ PBYTE pIn, pOut, pOutAfter;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ /**** Check if we were told to flush ****/
+
+ if (pbInputBuf == NULL) {
+ PRINT (_T("table_convert: Told to flush.\n"), 0, 0);
+ *pdwInputUsed = *pdwOutputUsed = 0;
+ *pdwInputNextPos = g->dwInNextPos;
+ *pdwOutputThisPos = g->dwOutNextPos;
+ return IP_DONE;
+ }
+
+ /**** Output a Row ****/
+
+ nBytes = g->dwBytesPerRow;
+ INSURE (dwInputAvail >= (DWORD)nBytes);
+ INSURE (dwOutputAvail >= (DWORD)nBytes);
+
+ pIn = pbInputBuf;
+ pOut = pbOutputBuf;
+ pOutAfter = pOut + nBytes;
+
+ if (g->bWhich == IP_TABLE_PASS_THRU)
+ {
+ memcpy (pOut, pIn, nBytes);
+ }
+ else if (g->traits.iBitsPerPixel==16 || g->traits.iBitsPerPixel==48)
+ {
+ /* 16 bits per channel -- interpolate between table-entries */
+ int x, xHi, y1, y2;
+ WORD *pwTable, *pwIn, *pwOut, *pwOutAfter;
+ BYTE *pbTable;
+
+ pwIn = (WORD*)pIn;
+ pwOut = (WORD*)pOut;
+ pwOutAfter = (WORD*)pOutAfter;
+
+ if (g->bBigTable)
+ {
+ /* we're using 12-bit table(s) */
+ while (pwOut < pwOutAfter) {
+ for (nTable=0; nTable<g->nTables; nTable++) {
+ pwTable = g->pwTables[nTable];
+ x = (unsigned)(*pwIn++);
+ xHi = x >> 4; /* hi 12 bits is used for indexing into the table */
+ y1 = (unsigned)pwTable[xHi ]; /* index is in 0..4095 */
+ y2 = (unsigned)pwTable[xHi+1]; /* extra entry in table is for index=4096 */
+ /* interpolate the lowest 4 bits */
+ *pwOut++ = (WORD)(((y2-y1)*(x&0x0f)>>4) + y1);
+ }
+ }
+ }
+ else /* we're using 8-bit table(s) */
+ {
+ while (pwOut < pwOutAfter) {
+ for (nTable=0; nTable<g->nTables; nTable++) {
+ pbTable = g->bTables[nTable];
+ x = (unsigned)(*pwIn++);
+ xHi = x >> 8; /* hi 8 bits is used for indexing into the table */
+ y1 = (unsigned)pbTable[xHi]; /* index is in 0..255 for both */
+ y2 = (unsigned)pbTable[xHi==255 ? 255 : xHi+1];
+ /* interpolate the lowest 8 bits */
+ *pwOut++ = (WORD)((y2-y1)*(x&0x0ff) + (y1<<8));
+ }
+ }
+ }
+ }
+ else /* 8 bits per channel -- the normal case */
+ {
+ if (g->bBigTable)
+ {
+ /* using a big table for 8- or 24-bit data, for some reason */
+ while (pOut < pOutAfter)
+ for (nTable=0; nTable<g->nTables; nTable++)
+ *pOut++ = (BYTE)(g->pwTables[nTable][(unsigned)(*pIn++)<<4] >> 8);
+ }
+ else if (g->nTables == 3)
+ {
+ while (pOut < pOutAfter) {
+ /* process two pixels at a time for improved speed */
+ pOut[0] = g->bTables[0][pIn[0]];
+ pOut[1] = g->bTables[1][pIn[1]];
+ pOut[2] = g->bTables[2][pIn[2]];
+ pOut[3] = g->bTables[0][pIn[3]];
+ pOut[4] = g->bTables[1][pIn[4]];
+ pOut[5] = g->bTables[2][pIn[5]];
+
+ pIn += 6;
+ pOut += 6;
+ }
+ }
+ else /* using a single table */
+ {
+ while (pOut < pOutAfter) {
+ /* process eight pixels at a time for improved speed */
+ pOut[0] = g->bTables[0][pIn[0]];
+ pOut[1] = g->bTables[0][pIn[1]];
+ pOut[2] = g->bTables[0][pIn[2]];
+ pOut[3] = g->bTables[0][pIn[3]];
+ pOut[4] = g->bTables[0][pIn[4]];
+ pOut[5] = g->bTables[0][pIn[5]];
+ pOut[6] = g->bTables[0][pIn[6]];
+ pOut[7] = g->bTables[0][pIn[7]];
+
+ pIn += 8;
+ pOut += 8;
+ }
+ }
+ }
+
+ *pdwInputUsed = nBytes;
+ g->dwInNextPos += nBytes;
+ *pdwInputNextPos = g->dwInNextPos;
+
+ *pdwOutputUsed = nBytes;
+ *pdwOutputThisPos = g->dwOutNextPos;
+ g->dwOutNextPos += nBytes;
+
+ g->dwRowsDone += 1;
+
+ return IP_CONSUMED_ROW | IP_PRODUCED_ROW | IP_READY_FOR_DATA;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * table_insertedData - client inserted into our output stream
+ *
+\*****************************************************************************/
+
+static WORD table_insertedData (
+ IP_XFORM_HANDLE hXform,
+ DWORD dwNumBytes)
+{
+ fatalBreakPoint ();
+ return IP_FATAL_ERROR; /* must never be called (can't insert data) */
+}
+
+
+
+/*****************************************************************************\
+ *
+ * table_newPage - Tells us to flush this page, and start a new page
+ *
+\*****************************************************************************/
+
+static WORD table_newPage (
+ IP_XFORM_HANDLE hXform)
+{
+ PTBL_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+ /* todo: return fatal error if convert is called again? */
+ return IP_DONE; /* can't insert page-breaks, so ignore this call */
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+
+}
+
+
+
+/*****************************************************************************\
+ *
+ * table_closeXform - Destroys this instance
+ *
+\*****************************************************************************/
+
+static WORD table_closeXform (IP_XFORM_HANDLE hXform)
+{
+ PTBL_INST g;
+ int i;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ for (i=0; i<3; i++)
+ if (g->pwTables[i] != NULL)
+ IP_MEM_FREE (g->pwTables[i]);
+
+ g->dwValidChk = 0;
+ IP_MEM_FREE (g); /* free memory for the instance */
+
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * tableTbl - Jump-table for transform driver
+ *
+\*****************************************************************************/
+
+IP_XFORM_TBL tableTbl = {
+ table_openXform,
+ table_setDefaultInputTraits,
+ table_setXformSpec,
+ table_getHeaderBufSize,
+ table_getActualTraits,
+ table_getActualBufSizes,
+ table_convert,
+ table_newPage,
+ table_insertedData,
+ table_closeXform
+};
+
+/* End of File */
diff --git a/ip/xthumb.c b/ip/xthumb.c
new file mode 100644
index 0000000..f5fb33a
--- /dev/null
+++ b/ip/xthumb.c
@@ -0,0 +1,558 @@
+/* libhpojip -- HP OfficeJet image-processing library. */
+
+/* Copyright (C) 1995-2002 Hewlett-Packard Company
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ * MA 02111-1307, USA.
+ *
+ * In addition, as a special exception, Hewlett-Packard Company
+ * gives permission to link the code of this program with any
+ * version of the OpenSSL library which is distributed under a
+ * license identical to that listed in the included LICENSE.OpenSSL
+ * file, and distribute linked combinations including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * this file, you may extend this exception to your version of the
+ * file, but you are not obligated to do so. If you do not wish to
+ * do so, delete this exception statement from your version.
+ */
+
+/* Original author: Mark Overton and others.
+ *
+ * Ported to Linux by David Paschal.
+ */
+
+/******************************************************************************\
+ *
+ * xthumb.c - Downscales quickly by large factor for generating thumbnail image
+ *
+ ******************************************************************************
+ *
+ * Name of Global Jump-Table:
+ *
+ * thumbTbl
+ *
+ * Items in aXformInfo array passed into setXformSpec:
+ *
+ * aXformInfo[IP_THUMB_SCALE_SPEC] determines scale-factor indirectly or directly,
+ * depending on whether it's positive or negative.
+ *
+ * positive: value is the maximum output-width in pixels. xthumb will
+ * select the N for the scale-factor of the form 1/N which
+ * results in the largest possible output width not exceeding
+ * the value in aXformInfo[IP_THUMB_SCALE_SPEC].
+ *
+ * negative: absolute value is N for the scale-factor of the form 1/N.
+ * the scale-factor is being specified directly.
+ *
+ * Capabilities and Limitations:
+ *
+ * Downscales any type of raw data quickly by a large scale-factor
+ * specified by aXformInfo[IP_THUMB_SCALE_SPEC]. The pixels are averaged together.
+ * For bilevel input, the output is 8-bit gray, where each gray pixel
+ * is the average blackness of an area of the input bilevel image.
+ * For 8-bit gray and 24-bit color input data, the output data is
+ * the same type as the input.
+ *
+ * The scale-factor is of the form 1/N, where N is an integer.
+ * Warning: If N is 1 or almost 1, the actual output width will be
+ * quite smaller than that requested.
+ *
+ * If input width is smaller than output width, N will be 1 (no
+ * scaling).
+ *
+ * ipGetImageTraits must be called to determine the actual output width.
+ *
+ * Default Input Traits, and Output Traits:
+ *
+ * trait default input output
+ * ------------------- --------------------- ------------------------
+ * iPixelsPerRow * used based on scale factor
+ * iBitsPerPixel * must be 1, 8 or 24 8 or 24
+ * iComponentsPerPixel * must be 1 or 3 same as default input
+ * lHorizDPI passed into output same as default input
+ * lVertDPI passed into output same as default input
+ * lNumRows used if valid based on scale factor
+ * iNumPages passed into output same as default input
+ * iPageNum passed into output same as default input
+ *
+ * Above, a "*" by an item indicates it must be valid (not negative).
+ *
+ * Mar 1998 Mark Overton -- wrote original code
+ *
+\******************************************************************************/
+
+#include "hpip.h"
+#include "ipdefs.h"
+#include "string.h" /* for memset and memcpy */
+
+
+#if 0
+ #include "stdio.h"
+ #include <tchar.h>
+
+ #define PRINT(msg,arg1,arg2) \
+ _ftprintf(stderr, msg, (int)arg1, (int)arg2)
+#else
+ #define PRINT(msg,arg1,arg2)
+#endif
+
+#define CHECK_VALUE 0x4ba1dace
+
+
+typedef struct {
+ IP_IMAGE_TRAITS inTraits; /* traits of the input image */
+ int iFactorSpec; /* factor spec in aXformInfo[0] */
+ WORD wScale; /* the N in scale-factor of 1/N */
+ WORD wPreShift; /* # bits to shift sum right before multiply */
+ DWORD dwSumFac; /* factor to multiply sum by (16.16 fixed-pt) */
+ DWORD dwOutputWidth; /* # pixels per row in output */
+ DWORD dwInRowBytes; /* # bytes in each input row */
+ DWORD dwOutRowBytes; /* # bytes in each output row */
+ WORD wMoreRows2Sum; /* # more rows to be summed together */
+ PULONG pulSums; /* pixel-sums; each pixel is a ULONG */
+ ULONG ulRowsInput; /* # of rows input so far */
+ ULONG ulRowsOutput; /* # of rows output so far */
+ DWORD dwInNextPos; /* file pos for subsequent input */
+ DWORD dwOutNextPos; /* file pos for subsequent output */
+ DWORD dwValidChk; /* struct validity check value */
+} TN_INST, *PTN_INST;
+
+
+
+/*****************************************************************************\
+ *
+ * thumb_openXform - Creates a new instance of the transformer
+ *
+ *****************************************************************************
+ *
+ * This returns a handle for the new instance to be passed into
+ * all subsequent calls.
+ *
+ * Return value: IP_DONE=success; IP_FATAL_ERROR=misc error.
+ *
+\*****************************************************************************/
+
+static WORD thumb_openXform (
+ IP_XFORM_HANDLE *pXform) /* out: returned handle */
+{
+ PTN_INST g;
+
+ INSURE (pXform != NULL);
+ IP_MEM_ALLOC (sizeof(TN_INST), g);
+ *pXform = g;
+ memset (g, 0, sizeof(TN_INST));
+ g->dwValidChk = CHECK_VALUE;
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * thumb_setDefaultInputTraits - Specifies default input image traits
+ *
+ *****************************************************************************
+ *
+ * The header of the file-type handled by the transform probably does
+ * not include *all* the image traits we'd like to know. Those not
+ * specified in the file-header are filled in from info provided by
+ * this routine.
+ *
+ * Return value: IP_DONE=success; IP_FATAL_ERROR=misc error.
+ *
+\*****************************************************************************/
+
+static WORD thumb_setDefaultInputTraits (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ PIP_IMAGE_TRAITS pTraits) /* in: default image traits */
+{
+ PTN_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ INSURE (pTraits->iPixelsPerRow > 0);
+ g->inTraits = *pTraits; /* a structure copy */
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * thumb_setXformSpec - Provides xform-specific information
+ *
+\*****************************************************************************/
+
+static WORD thumb_setXformSpec (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD_OR_PVOID aXformInfo[]) /* in: xform information */
+{
+ PTN_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+ g->iFactorSpec = (int)aXformInfo[IP_THUMB_SCALE_SPEC].dword;
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * thumb_getHeaderBufSize- Returns size of input buf needed to hold header
+ *
+\*****************************************************************************/
+
+static WORD thumb_getHeaderBufSize (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD *pdwInBufLen) /* out: buf size for parsing header */
+{
+ /* since input is raw pixels, there is no header, so set it to zero */
+ *pdwInBufLen = 0;
+ return IP_DONE;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * thumb_getActualTraits - Parses header, and returns input & output traits
+ *
+\*****************************************************************************/
+
+static WORD thumb_getActualTraits (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD dwInputAvail, /* in: # avail bytes in input buf */
+ PBYTE pbInputBuf, /* in: ptr to input buffer */
+ PDWORD pdwInputUsed, /* out: # bytes used from input buf */
+ PDWORD pdwInputNextPos,/* out: file-pos to read from next */
+ PIP_IMAGE_TRAITS pInTraits, /* out: input image traits */
+ PIP_IMAGE_TRAITS pOutTraits) /* out: output image traits */
+{
+ PTN_INST g;
+ int N;
+ long lMaxSum;
+ long nBytes;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ /* Since there is no header, we'll report no usage of input */
+ *pdwInputUsed = 0;
+ *pdwInputNextPos = 0;
+
+ /* Compute N in our scale-factor of 1/N */
+ if (g->iFactorSpec <= 0) {
+ N = -(g->iFactorSpec);
+ } else {
+ /* the +iFactorSpec-1 below biases N high (cieling function),
+ * so the output width is biased low, so that we'll never go
+ * larger than the requested output width.
+ */
+ N = (g->inTraits.iPixelsPerRow + g->iFactorSpec - 1) / g->iFactorSpec;
+ }
+
+ if (N < 1) N = 1;
+ g->wScale = N;
+
+ /* Compute max summation of N-by-N input pixels */
+ lMaxSum = (long)N*N * (g->inTraits.iBitsPerPixel==1 ? 1 : 255);
+
+ /* Compute pre-shift so that max sum does not exceed 16 bits */
+ if (lMaxSum >= (1L<<28)) g->wPreShift = 16;
+ else if (lMaxSum >= (1L<<24)) g->wPreShift = 12;
+ else if (lMaxSum >= (1L<<20)) g->wPreShift = 8;
+ else if (lMaxSum >= (1L<<16)) g->wPreShift = 4;
+ else g->wPreShift = 0;
+
+ /* Now do the pre-shift on max sum */
+ lMaxSum >>= g->wPreShift;
+ INSURE (lMaxSum < (1L<<16)); /* make sure it fits in 16 bits */
+
+ /* And compute the factor for converting a sum into a 0..255 pixel */
+ g->dwSumFac = (DWORD)((255.0/(float)lMaxSum) * (float)(1L<<16));
+
+ *pInTraits = g->inTraits; /* structure copies */
+ *pOutTraits = g->inTraits;
+
+ if (pOutTraits->iBitsPerPixel == 1)
+ pOutTraits->iBitsPerPixel = 8;
+ pOutTraits->iPixelsPerRow = g->dwOutputWidth = pInTraits->iPixelsPerRow / N;
+ if (pOutTraits->lNumRows >= 0)
+ pOutTraits->lNumRows /= N;
+
+ g->wMoreRows2Sum = N;
+ g->dwInRowBytes =
+ (pInTraits->iPixelsPerRow * pInTraits->iBitsPerPixel + 7) / 8;
+ g->dwOutRowBytes = g->dwOutputWidth * pInTraits->iComponentsPerPixel;
+
+ nBytes = g->dwOutRowBytes * sizeof(ULONG);
+ IP_MEM_ALLOC (nBytes, g->pulSums);
+ memset (g->pulSums, 0, nBytes);
+
+ return IP_DONE | IP_READY_FOR_DATA;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/****************************************************************************\
+ *
+ * thumb_getActualBufSizes - Returns buf sizes needed for remainder of job
+ *
+\****************************************************************************/
+
+static WORD thumb_getActualBufSizes (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ PDWORD pdwMinInBufLen, /* out: min input buf size */
+ PDWORD pdwMinOutBufLen) /* out: min output buf size */
+{
+ PTN_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+ *pdwMinInBufLen = g->dwInRowBytes;
+ *pdwMinOutBufLen = g->dwOutRowBytes;
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * thumb_convert - Converts one row
+ *
+\*****************************************************************************/
+
+static WORD thumb_convert (
+ IP_XFORM_HANDLE hXform,
+ DWORD dwInputAvail, /* in: # avail bytes in in-buf */
+ PBYTE pbInputBuf, /* in: ptr to in-buffer */
+ PDWORD pdwInputUsed, /* out: # bytes used from in-buf */
+ PDWORD pdwInputNextPos, /* out: file-pos to read from next */
+ DWORD dwOutputAvail, /* in: # avail bytes in out-buf */
+ PBYTE pbOutputBuf, /* in: ptr to out-buffer */
+ PDWORD pdwOutputUsed, /* out: # bytes written in out-buf */
+ PDWORD pdwOutputThisPos) /* out: file-pos to write the data */
+{
+ PTN_INST g;
+ PBYTE pIn, pOut;
+ BYTE bMask, bVal=0;
+ ULONG ulSum, sum0, sum1, sum2;
+ ULONG *pulSum, *pulSumAfter;
+ UINT u;
+ BOOL fSentRow;
+
+ HANDLE_TO_PTR (hXform, g);
+ pulSumAfter = g->pulSums + g->dwOutRowBytes;
+
+ /**** Check if we were told to flush ****/
+
+ if (pbInputBuf == NULL) {
+ PRINT (_T("thumb_convert: Told to flush.\n"), 0, 0);
+ *pdwInputUsed = *pdwOutputUsed = 0;
+ *pdwInputNextPos = g->dwInNextPos;
+ *pdwOutputThisPos = g->dwOutNextPos;
+ return IP_DONE;
+ }
+
+ /**** Sum this Input Row ****/
+
+ INSURE (dwInputAvail >= g->dwInRowBytes);
+ pIn = pbInputBuf;
+
+ switch (g->inTraits.iBitsPerPixel) {
+ case 1: /* bilevel input */
+ bMask = 0;
+ for (pulSum=g->pulSums; pulSum<pulSumAfter; pulSum++) {
+ ulSum = *pulSum;
+ for (u=g->wScale; u>0; u--) {
+ if (bMask == 0) {
+ bMask = 0x80u;
+ bVal = *pIn++;
+ }
+ if ((bMask & bVal) == 0) {
+ /* since the sum is a measure of overall whiteness,
+ * increment it for a *white* input pixel (0) */
+ ulSum += 1;
+ }
+ bMask >>= 1;
+ }
+ *pulSum = ulSum;
+ }
+ break;
+
+ case 8: /* 8-bit gray input */
+ for (pulSum=g->pulSums; pulSum<pulSumAfter; pulSum++) {
+ ulSum = *pulSum;
+ for (u=g->wScale; u>0; u--)
+ ulSum += (ULONG)(*pIn++);
+ *pulSum = ulSum;
+ }
+ break;
+
+ case 24: /* 3-component color input */
+ for (pulSum=g->pulSums; pulSum<pulSumAfter; pulSum+=3) {
+ sum0 = pulSum[0];
+ sum1 = pulSum[1];
+ sum2 = pulSum[2];
+ for (u=g->wScale; u>0; u--) {
+ sum0 += (ULONG)(*pIn++);
+ sum1 += (ULONG)(*pIn++);
+ sum2 += (ULONG)(*pIn++);
+ }
+ pulSum[0] = sum0;
+ pulSum[1] = sum1;
+ pulSum[2] = sum2;
+ }
+ break;
+ } /* switch */
+
+ *pdwInputUsed = g->dwInRowBytes;
+ g->dwInNextPos += g->dwInRowBytes;
+ *pdwInputNextPos = g->dwInNextPos;
+ g->ulRowsInput += 1;
+
+ /**** If it's time, Compute Output Row ****/
+
+ *pdwOutputThisPos = g->dwOutNextPos;
+ g->wMoreRows2Sum -= 1;
+
+ if (g->wMoreRows2Sum > 0) {
+ fSentRow = FALSE;
+ *pdwOutputUsed = 0;
+ } else {
+ g->wMoreRows2Sum = g->wScale;
+ fSentRow = TRUE;
+ g->ulRowsOutput += 1;
+ INSURE (dwOutputAvail >= g->dwOutRowBytes);
+ *pdwOutputUsed = g->dwOutRowBytes;
+ g->dwOutNextPos += g->dwOutRowBytes;
+
+ pulSum = g->pulSums;
+ pOut = pbOutputBuf;
+ for (pulSum=g->pulSums; pulSum<pulSumAfter; pulSum++) {
+ *pOut++ = (BYTE)((*pulSum >> g->wPreShift) * g->dwSumFac >> 16);
+ }
+
+ memset (g->pulSums, 0, g->dwOutRowBytes*sizeof(ULONG));
+ }
+
+ /**** Return ****/
+
+ return IP_CONSUMED_ROW |
+ IP_READY_FOR_DATA |
+ (fSentRow ? IP_PRODUCED_ROW : 0);
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * thumb_insertedData - client inserted into our output stream
+ *
+\*****************************************************************************/
+
+static WORD thumb_insertedData (
+ IP_XFORM_HANDLE hXform,
+ DWORD dwNumBytes)
+{
+ fatalBreakPoint ();
+ return IP_FATAL_ERROR; /* must never be called (can't insert data) */
+}
+
+
+
+/*****************************************************************************\
+ *
+ * thumb_newPage - Tells us to flush this page, and start a new page
+ *
+\*****************************************************************************/
+
+static WORD thumb_newPage (
+ IP_XFORM_HANDLE hXform)
+{
+ PTN_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+ return IP_DONE; /* can't insert page-breaks, so ignore this call */
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+
+}
+
+
+
+/*****************************************************************************\
+ *
+ * thumb_closeXform - Destroys this instance
+ *
+\*****************************************************************************/
+
+static WORD thumb_closeXform (IP_XFORM_HANDLE hXform)
+{
+ PTN_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ if (g->pulSums != NULL)
+ IP_MEM_FREE (g->pulSums);
+ g->dwValidChk = 0;
+ IP_MEM_FREE (g); /* free memory for the instance */
+
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * thumbTbl - Jump-table for transform driver
+ *
+\*****************************************************************************/
+
+IP_XFORM_TBL thumbTbl = {
+ thumb_openXform,
+ thumb_setDefaultInputTraits,
+ thumb_setXformSpec,
+ thumb_getHeaderBufSize,
+ thumb_getActualTraits,
+ thumb_getActualBufSizes,
+ thumb_convert,
+ thumb_newPage,
+ thumb_insertedData,
+ thumb_closeXform
+};
+
+/* End of File */
diff --git a/ip/xtiff.c b/ip/xtiff.c
new file mode 100644
index 0000000..e1338e5
--- /dev/null
+++ b/ip/xtiff.c
@@ -0,0 +1,1338 @@
+/* libhpojip -- HP OfficeJet image-processing library. */
+
+/* Copyright (C) 1995-2002 Hewlett-Packard Company
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ * MA 02111-1307, USA.
+ *
+ * In addition, as a special exception, Hewlett-Packard Company
+ * gives permission to link the code of this program with any
+ * version of the OpenSSL library which is distributed under a
+ * license identical to that listed in the included LICENSE.OpenSSL
+ * file, and distribute linked combinations including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * this file, you may extend this exception to your version of the
+ * file, but you are not obligated to do so. If you do not wish to
+ * do so, delete this exception statement from your version.
+ */
+
+/* Original author: Mark Overton and others.
+ *
+ * Ported to Linux by David Paschal.
+ */
+
+/*****************************************************************************\
+ *
+ * xtiff.c - encoder and decoder for TIFF files for image processor
+ *
+ *****************************************************************************
+ *
+ * Name of Global Jump-Table:
+ *
+ * tifEncodeTbl = the encoder,
+ * tifDecodeTbl = the decoder.
+ *
+ * Encoder: Items in aXformInfo array passed into setXformSpec:
+ *
+ * aXformInfo[IP_TIFF_FILE_PATH] = pointer to a file-path, or NULL
+ *
+ * If NULL, a one-page TIFF is output in the normal manner.
+ * If not NULL, this must be a pointer to a string containing a file-path.
+ * If the given file does not exist, it will be created and one image will
+ * be put in it. If it does exist, the image will be APPENDED to this file,
+ * and no data will be output by this xform. So if one or more pages are
+ * already in the file, we will add another page to it. This xform does
+ * the opening and closing of the file.
+ *
+ * Decoder: Items in aXformInfo array passed into setXformSpec:
+ *
+ * None.
+ *
+ * Capabilities and Limitations:
+ *
+ * Handles 1, 8, 16, 24 and 48 bits per pixel.
+ *
+ * Default Input Traits, and Output Traits:
+ *
+ * trait default input output
+ * ------------------- --------------------- ------------------------
+ * iPixelsPerRow * passed into output same as default input
+ * iBitsPerPixel * passed into output same as default input
+ * iComponentsPerPixel passed into output same as default input
+ * lHorizDPI passed into output same as default input
+ * lVertDPI passed into output same as default input
+ * lNumRows passed into output same as default input
+ * iNumPages passed into output same as default input
+ * iPageNum passed into output same as default input
+ *
+ * Above, a "*" by an item indicates it must be valid (not negative).
+ *
+ * Apr 2000, Mark Overton, ported header-setup from TWAIN source, and added
+ * multi-page capability
+ * Feb 1998, Mark Overton, ported to new Image Processor code
+ * May 1996, Mark Overton, wrote original code
+ * Jun 2000, Mark Overton, wrote a simple decoder that does no file-seeks
+ *
+ *****************************************************************************/
+
+
+#include "stdio.h" /* for FILE operations */
+#include "assert.h"
+#include "hpip.h"
+#include "ipdefs.h"
+#include "string.h"
+
+
+#if 0
+ #include "stdio.h"
+ #include <tchar.h>
+
+ #define PRINT(msg,arg1,arg2) \
+ _ftprintf(stderr, msg, (int)arg1, (int)arg2)
+#else
+ #define PRINT(msg,arg1,arg2)
+#endif
+
+#define CHECK_VALUE 0x1ce5ca7e
+
+
+
+/*____________________________________________________________________________
+ | |
+ | Constants pertaining to tags |
+ |____________________________________________________________________________|
+*/
+
+
+/* TIF_INST - our instance variables */
+
+typedef struct {
+ IP_IMAGE_TRAITS traits; /* traits of the image */
+ int iBitsPerSample; /* bits per channel (1, 8 or 16) */
+ BOOL bByteSwap; /* bytes are in wrong endian order, so must swap? */
+ char sFilePath[200]; /* path to the file (empty string means none) */
+ FILE *fileOut; /* handle of opened file */
+ DWORD dwRawRowBytes; /* bytes per raw row */
+ DWORD dwRowsDone; /* number of rows converted so far */
+ DWORD dwValidChk; /* struct validity check value */
+ DWORD dwInNextPos; /* file pos for subsequent input */
+ DWORD dwOutNextPos; /* file pos for subsequent output */
+ BOOL fDidHeader; /* already sent the header? */
+} TIF_INST, *PTIF_INST;
+
+
+/* Types having known sizes */
+typedef unsigned char TIFF_UBYTE; /* 8 bits */
+typedef unsigned short TIFF_USHORT; /* 16 bits */
+typedef unsigned int TIFF_ULONG; /* 32 bits */
+typedef signed char TIFF_SBYTE; /* 8 bits */
+typedef signed short TIFF_SSHORT; /* 16 bits */
+typedef signed int TIFF_SLONG; /* 32 bits */
+
+/* TIFF file header defines */
+#define INTEL 0x4949
+#define TIFF_VERSION 42
+
+/* TIFF field lengths */
+#define TIFFBYTE 1
+#define TIFFASCII 2
+#define TIFFSHORT 3
+#define TIFFLONG 4
+#define TIFFRATIONAL 5
+#define TIFFSBYTE 6
+#define TIFFUNDEFINED 7
+#define TIFFSSHORT 8
+#define TIFFSLONG 9
+#define TIFFSRATIONAL 10
+
+/* TIFF compression type */
+#define NOCOMPRESSION 1
+
+/* TIFF planar configuration */
+#define CONTIGUOUS 1
+#define PLANAR 2
+
+/* TIFF photometric interpretations */
+#define ZERO_IS_WHITE 0
+#define ZERO_IS_BLACK 1
+#define RGB_COLOR 2
+
+/* TIFF resolution units */
+#define DOTS_PER_INCH 2
+
+
+/* TIFF tags */
+#define NUMTAGS 13
+#define BITS_PER_SAMPLE 258 // 0x0102
+#define COMPRESSION 259 // 0x0103
+#define IMAGE_LENGTH 257 // 0x0101
+#define IMAGE_WIDTH 256 // 0x0100
+#define NEW_SUBFILE 254 // 0x00fe
+#define PHOTO_INTERPRET 262 // 0x0106
+#define RESOLUTION_UNIT 296 // 0x0128
+#define ROWS_PER_STRIP 278 // 0x0116
+#define SAMPLES_PER_PIXEL 277 // 0x0115
+#define STRIP_COUNTS 279 // 0x0117
+#define STRIP_OFFSETS 273 // 0x0111
+#define XRESOLUTION 282 // 0x011A
+#define YRESOLUTION 283 // 0x011B
+
+typedef struct {
+ TIFF_ULONG n;
+ TIFF_ULONG d;
+} __attribute__((packed)) RATIONAL;
+
+typedef union {
+ TIFF_UBYTE b[4];
+ TIFF_USHORT s[2];
+ TIFF_ULONG l;
+ TIFF_ULONG o;
+} __attribute__((packed)) TIFFVALUE;
+
+typedef struct {
+ TIFF_USHORT TagID;
+ TIFF_USHORT Kind;
+ TIFF_ULONG Length; /* number of items, NOT number of bytes */
+ TIFFVALUE Value;
+} __attribute__((packed)) TIFFTAG;
+
+typedef struct {
+ TIFF_USHORT NumTags;
+ TIFFTAG Tag[NUMTAGS];
+ TIFF_ULONG OffsetNextIFD;
+} __attribute__((packed)) TIFFIFD;
+
+typedef struct {
+ TIFF_UBYTE ByteOrder[2];
+ TIFF_USHORT Version;
+ TIFF_ULONG OffsetFirstIFD;
+} __attribute__((packed)) TIFFHEADER;
+
+#define NUMEXTBYTES (2*sizeof(RATIONAL) + 3*sizeof(TIFF_USHORT))
+#define MAX_HEADER_SIZE (sizeof(TIFFHEADER) + sizeof(TIFFIFD) + NUMEXTBYTES)
+
+
+
+/*****************************************************************************\
+ *
+ * tifEncode_openXform - Creates a new instance of the transformer
+ *
+ *****************************************************************************
+ *
+ * This returns a handle for the new instance to be passed into
+ * all subsequent calls.
+ *
+ * Return value: IP_DONE=success; IP_FATAL_ERROR=misc error.
+ *
+\*****************************************************************************/
+
+static WORD tifEncode_openXform (
+ IP_XFORM_HANDLE *pXform) /* out: returned handle */
+{
+ PTIF_INST g;
+
+ INSURE (pXform != NULL);
+ IP_MEM_ALLOC (sizeof(TIF_INST), g);
+ *pXform = g;
+ memset (g, 0, sizeof(TIF_INST));
+ g->dwValidChk = CHECK_VALUE;
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * tifEncode_setDefaultInputTraits - Specifies default input image traits
+ *
+ *****************************************************************************
+ *
+ * The header of the file-type handled by the transform probably does
+ * not include *all* the image traits we'd like to know. Those not
+ * specified in the file-header are filled in from info provided by
+ * this routine.
+ *
+ * Return value: IP_DONE=success; IP_FATAL_ERROR=misc error.
+ *
+\*****************************************************************************/
+
+static WORD tifEncode_setDefaultInputTraits (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ PIP_IMAGE_TRAITS pTraits) /* in: default image traits */
+{
+ PTIF_INST g;
+ int ppr, bpp;
+
+ HANDLE_TO_PTR (hXform, g);
+ ppr = pTraits->iPixelsPerRow;
+ bpp = pTraits->iBitsPerPixel;
+
+ /* Insure that values we actually use are known */
+ INSURE (ppr > 0);
+ INSURE (bpp > 0);
+
+ g->dwRawRowBytes = (ppr*bpp + 7) / 8;
+ g->traits = *pTraits; /* a structure copy */
+
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * tifEncode_setXformSpec - Provides xform-specific information
+ *
+\*****************************************************************************/
+
+static WORD tifEncode_setXformSpec (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD_OR_PVOID aXformInfo[]) /* in: xform information */
+{
+ PTIF_INST g;
+ char *s;
+
+ HANDLE_TO_PTR (hXform, g);
+ s = (char*)aXformInfo[IP_TIFF_FILE_PATH].pvoid;
+ if (s != NULL)
+ strcpy (g->sFilePath, s);
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * tifEncode_getHeaderBufSize- Returns size of input buf needed to hold header
+ *
+\*****************************************************************************/
+
+static WORD tifEncode_getHeaderBufSize (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD *pdwInBufLen) /* out: buf size for parsing header */
+{
+ /* since input is raw pixels, there is no header, so set it to zero */
+ *pdwInBufLen = 0;
+ return IP_DONE;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * tifEncode_getActualTraits - Parses header, and returns input & output traits
+ *
+\*****************************************************************************/
+
+static WORD tifEncode_getActualTraits (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD dwInputAvail, /* in: # avail bytes in input buf */
+ PBYTE pbInputBuf, /* in: ptr to input buffer */
+ PDWORD pdwInputUsed, /* out: # bytes used from input buf */
+ PDWORD pdwInputNextPos,/* out: file-pos to read from next */
+ PIP_IMAGE_TRAITS pInTraits, /* out: input image traits */
+ PIP_IMAGE_TRAITS pOutTraits) /* out: output image traits */
+{
+ PTIF_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ /* Since there is no header, we'll report no usage of input */
+ *pdwInputUsed = 0;
+ *pdwInputNextPos = 0;
+
+ /* Since we don't change traits, just copy out the default traits */
+ *pInTraits = g->traits;
+ *pOutTraits = g->traits;
+ return IP_DONE | IP_READY_FOR_DATA;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/****************************************************************************\
+ *
+ * tifEncode_getActualBufSizes - Returns buf sizes needed for remainder of job
+ *
+\****************************************************************************/
+
+static WORD tifEncode_getActualBufSizes (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ PDWORD pdwMinInBufLen, /* out: min input buf size */
+ PDWORD pdwMinOutBufLen) /* out: min output buf size */
+{
+ PTIF_INST g;
+ UINT len;
+
+ HANDLE_TO_PTR (hXform, g);
+ len = g->dwRawRowBytes;
+ *pdwMinInBufLen = len;
+
+ if (len < MAX_HEADER_SIZE)
+ len = MAX_HEADER_SIZE;
+ *pdwMinOutBufLen = len;
+
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/****************************************************************************\
+ *
+ * outputHeader - Only called by tifEncode_convert
+ *
+\****************************************************************************/
+
+
+
+static void SetTag (TIFFTAG *pTag,
+ unsigned short TagID, short Kind, long Length, int Value)
+{
+ pTag->TagID = (TIFF_USHORT)TagID;
+ pTag->Kind = (TIFF_USHORT)Kind;
+ pTag->Length = (TIFF_ULONG)Length;
+ pTag->Value.l = (TIFF_ULONG)Value; /* assumes little-endian computer */
+}
+
+
+
+static int WriteFileHeader (PBYTE pTIFF)
+{
+ TIFFHEADER *pHead;
+
+ pHead = (TIFFHEADER*) pTIFF;
+ pHead->ByteOrder[0] = 'I';
+ pHead->ByteOrder[1] = 'I'; /* assumes little-endian computer */
+ pHead->Version = 42;
+ pHead->OffsetFirstIFD = 8;
+
+ return 8; /* we output 8 bytes */
+}
+
+
+
+static int WriteIFD (
+ PBYTE pTIFF, /* out: the IFD is written to this buffer */
+ int iStartOffset, /* in: file-offset at which this IFD starts */
+ int WidthBytes, /* in: row-width in bytes */
+ int WidthPixels, /* in: row-width in pixels */
+ int Height, /* in: number of rows */
+ int BPP, /* in: bits per pixel */
+ int XRes, /* in: dpi in X */
+ int YRes) /* in: dpi in Y */
+{
+ TIFFIFD *pIFD;
+ TIFFTAG *pTag;
+ BYTE *pMore;
+ TIFF_USHORT *pBPS;
+ int iBPSOffset, iImageOffset;
+ int SPP, BPS, PI;
+
+ pIFD = (TIFFIFD*)pTIFF;
+ pMore = pTIFF + sizeof(TIFFIFD); /* 1st byte after the IFD */
+
+ /* allocate space for the 3 shorts for the 3 bps values (if needed) */
+ iBPSOffset = iStartOffset + (pMore-pTIFF);
+ pBPS = (TIFF_USHORT*)pMore;
+ pMore += 3*sizeof(TIFF_USHORT);
+
+ /* the pixels are put after the above items */
+ iImageOffset = iStartOffset + (pMore-pTIFF);
+
+ switch (BPP) {
+ case 1:
+ PI = ZERO_IS_WHITE; SPP = 1; BPS = 1; break; /* 1-bit bilevel */
+ case 8:
+ PI = ZERO_IS_BLACK; SPP = 1; BPS = 8; break; /* 8-bit grayscale */
+ case 16:
+ PI = ZERO_IS_BLACK; SPP = 1; BPS = 16; break; /* 16-bit grayscale */
+ case 24:
+ PI = RGB_COLOR; SPP = 3; BPS = 8; break; /* 24-bit color */
+ case 48:
+ PI = RGB_COLOR; SPP = 3; BPS = 16; break; /* 48-bit color */
+ default:
+ PI = RGB_COLOR; SPP = 3; BPS = 8; /* guess 24-bit color */
+ assert (0); /* crash if in debug mode */
+ }
+
+ pIFD->NumTags = NUMTAGS;
+ pTag = pIFD->Tag;
+ SetTag (pTag++, NEW_SUBFILE, TIFFSHORT, 1, 0);
+ SetTag (pTag++, IMAGE_WIDTH, TIFFLONG, 1, WidthPixels);
+ SetTag (pTag++, IMAGE_LENGTH, TIFFLONG, 1, Height);
+ SetTag (pTag++, BITS_PER_SAMPLE, TIFFSHORT, SPP, SPP>1 ? iBPSOffset : BPS);
+ SetTag (pTag++, COMPRESSION, TIFFSHORT, 1, 1);
+ SetTag (pTag++, PHOTO_INTERPRET, TIFFSHORT, 1, PI);
+ SetTag (pTag++, STRIP_OFFSETS, TIFFLONG, 1, iImageOffset);
+ SetTag (pTag++, SAMPLES_PER_PIXEL, TIFFSHORT, 1, SPP);
+ SetTag (pTag++, ROWS_PER_STRIP, TIFFLONG, 1, Height);
+ SetTag (pTag++, STRIP_COUNTS, TIFFLONG, 1, WidthBytes*Height);
+ SetTag (pTag++, XRESOLUTION, TIFFSHORT, 1, XRes);
+ SetTag (pTag++, YRESOLUTION, TIFFSHORT, 1, YRes);
+ SetTag (pTag++, RESOLUTION_UNIT, TIFFSHORT, 1, 2);
+ assert ((pTag - pIFD->Tag) == NUMTAGS);
+ pIFD->OffsetNextIFD = 0L; /* assume there is no next IFD */
+
+ /* Stick Samples Per Pixel here for color; Only used if pointed to by tag */
+ *pBPS++ = BPS;
+ *pBPS++ = BPS;
+ *pBPS++ = BPS;
+
+ return pMore - pTIFF;
+}
+
+
+
+static WORD AppendIFDToFile (
+ PTIF_INST g, /* in: ptr to instance structure */
+ PBYTE pbTempBuf) /* in: temp buffer large enough to hold an IFD */
+{
+ int result;
+ TIFF_ULONG fileEndPos, IFDPos, pointerPos;
+ TIFF_USHORT numTags;
+ int iHeaderLen, iIFDLen, iTotalLen;
+
+ /***** If the file is empty, do usual set-up *****/
+
+ g->fileOut = fopen (g->sFilePath, "a+b");
+ INSURE (g->fileOut != NULL);
+ result = fseek (g->fileOut, 0, SEEK_END);
+ INSURE (result == 0);
+ fileEndPos = ftell (g->fileOut);
+ INSURE (result >= 0);
+
+ if (fileEndPos == 0) {
+ iHeaderLen = WriteFileHeader(pbTempBuf);
+ iIFDLen = WriteIFD (pbTempBuf+iHeaderLen, iHeaderLen,
+ g->dwRawRowBytes, g->traits.iPixelsPerRow,
+ g->traits.lNumRows, g->traits.iBitsPerPixel,
+ g->traits.lHorizDPI>>16, g->traits.lVertDPI>>16);
+
+ iTotalLen = iHeaderLen + iIFDLen;
+ INSURE (iTotalLen <= MAX_HEADER_SIZE);
+
+ result = fwrite (pbTempBuf, 1, iTotalLen, g->fileOut);
+ INSURE (result == iTotalLen);
+
+ return IP_READY_FOR_DATA;
+ }
+
+ /***** Find the last IFD *****/
+
+ result = fseek (g->fileOut, 4, SEEK_SET);
+ INSURE (result == 0);
+ result = fread (&IFDPos, 4, 1, g->fileOut); /* assumes little-endian file */
+ INSURE (result == 1);
+
+ do { /* hop thru the IFDs until we hit the last one */
+ result = fseek (g->fileOut, IFDPos, SEEK_SET);
+ INSURE (result == 0);
+ result = fread (&numTags, 2, 1, g->fileOut); /* assumes little-endian file */
+ INSURE (result==1 && numTags>0);
+ pointerPos = IFDPos + 2 + numTags*sizeof(TIFFTAG);
+ result = fseek (g->fileOut, pointerPos, SEEK_SET);
+ INSURE (result == 0);
+ result = fread (&IFDPos, 4, 1, g->fileOut); /* assumes little-endian file */
+ INSURE (result == 1);
+ } while (IFDPos != 0);
+
+ /***** PointerPos is the final IFD offset in the file; change it *****/
+
+ /* switch to writing from now on */
+ fclose (g->fileOut);
+ g->fileOut = fopen(g->sFilePath, "r+b");
+ INSURE (g->fileOut != NULL);
+
+ result = fseek (g->fileOut, pointerPos, SEEK_SET);
+ INSURE (result == 0);
+ result = fwrite (&fileEndPos, 4, 1, g->fileOut); /* assumes little-endian file */
+ INSURE (result == 1);
+
+ /***** Output a new IFD for the new page *****/
+
+ iIFDLen = WriteIFD (pbTempBuf, fileEndPos,
+ g->dwRawRowBytes, g->traits.iPixelsPerRow,
+ g->traits.lNumRows, g->traits.iBitsPerPixel,
+ g->traits.lHorizDPI>>16, g->traits.lVertDPI>>16);
+
+ result = fseek (g->fileOut, 0, SEEK_END);
+ INSURE (result == 0);
+ result = fwrite (pbTempBuf, 1, iIFDLen, g->fileOut);
+ INSURE (result == iIFDLen);
+ /* leave the file-position at the end, where image-data will go */
+
+ return IP_READY_FOR_DATA;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+static WORD outputHeader (
+ PTIF_INST g, /* in: ptr to instance structure */
+ DWORD dwOutputAvail, /* in: # avail bytes in out-buf */
+ PBYTE pbOutputBuf, /* in: ptr to out-buffer */
+ PDWORD pdwOutputUsed, /* out: # bytes written in out-buf */
+ PDWORD pdwOutputThisPos) /* out: file-pos to write the data */
+{
+ int iHeaderLen, iIFDLen, iTotalLen;
+
+ INSURE (dwOutputAvail >= MAX_HEADER_SIZE);
+ *pdwOutputThisPos = 0;
+
+ if (g->sFilePath[0] != 0) {
+ *pdwOutputUsed = 0;
+ return AppendIFDToFile (g, pbOutputBuf);
+ }
+
+ iHeaderLen = WriteFileHeader(pbOutputBuf);
+ iIFDLen = WriteIFD (pbOutputBuf+iHeaderLen, iHeaderLen,
+ g->dwRawRowBytes, g->traits.iPixelsPerRow,
+ g->traits.lNumRows, g->traits.iBitsPerPixel,
+ g->traits.lHorizDPI>>16, g->traits.lVertDPI>>16);
+
+ iTotalLen = iHeaderLen + iIFDLen;
+ INSURE (iTotalLen <= MAX_HEADER_SIZE);
+ *pdwOutputUsed = iTotalLen;
+ *pdwOutputThisPos = 0;
+ g->dwOutNextPos = iTotalLen;
+
+ return IP_READY_FOR_DATA;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * tifEncode_convert - the work-horse routine
+ *
+\*****************************************************************************/
+
+static WORD tifEncode_convert (
+ IP_XFORM_HANDLE hXform,
+ DWORD dwInputAvail, /* in: # avail bytes in in-buf */
+ PBYTE pbInputBuf, /* in: ptr to in-buffer */
+ PDWORD pdwInputUsed, /* out: # bytes used from in-buf */
+ PDWORD pdwInputNextPos, /* out: file-pos to read from next */
+ DWORD dwOutputAvail, /* in: # avail bytes in out-buf */
+ PBYTE pbOutputBuf, /* in: ptr to out-buffer */
+ PDWORD pdwOutputUsed, /* out: # bytes written in out-buf */
+ PDWORD pdwOutputThisPos) /* out: file-pos to write the data */
+{
+ PTIF_INST g;
+ UINT n;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ /**** Output the Header if we haven't already ****/
+
+ if (! g->fDidHeader) {
+ g->fDidHeader = TRUE;
+ *pdwInputUsed = 0;
+ *pdwInputNextPos = 0;
+ return outputHeader (g, dwOutputAvail, pbOutputBuf,
+ pdwOutputUsed, pdwOutputThisPos);
+ }
+
+ /**** Check if we were told to flush ****/
+
+ if (pbInputBuf == NULL) {
+ PRINT (_T("tif_encode_convert_row: Told to flush.\n"), 0, 0);
+ if (g->traits.lNumRows < 0) {
+ /* # rows wasn't known at first, so output header again
+ * now that we know the number of rows */
+ INSURE (g->sFilePath[0] == 0);
+ g->traits.lNumRows = g->dwRowsDone;
+ *pdwInputUsed = 0;
+ *pdwInputNextPos = g->dwInNextPos;
+ return outputHeader (g, dwOutputAvail, pbOutputBuf,
+ pdwOutputUsed, pdwOutputThisPos);
+ }
+
+ *pdwInputUsed = *pdwOutputUsed = 0;
+ *pdwInputNextPos = g->dwInNextPos;
+ *pdwOutputThisPos = g->dwOutNextPos;
+ return IP_DONE;
+ }
+
+ /**** Output a Row ****/
+
+ n = g->dwRawRowBytes;
+ INSURE (dwInputAvail >= n);
+ INSURE (dwOutputAvail >= n);
+
+ if (g->sFilePath[0] == 0) {
+ memcpy (pbOutputBuf, pbInputBuf, n);
+
+ *pdwOutputUsed = n;
+ *pdwOutputThisPos = g->dwOutNextPos;
+ g->dwOutNextPos += n;
+ } else {
+ UINT result;
+ INSURE (g->fileOut != NULL);
+ result = fwrite (pbInputBuf, 1, n, g->fileOut);
+ INSURE (result == n);
+
+ *pdwOutputUsed = 0;
+ *pdwOutputThisPos = 0;
+ g->dwOutNextPos = 0;
+ }
+
+ g->dwInNextPos += n;
+ *pdwInputNextPos = g->dwInNextPos;
+ *pdwInputUsed = n;
+ g->dwRowsDone += 1;
+
+ return IP_CONSUMED_ROW | IP_PRODUCED_ROW | IP_READY_FOR_DATA;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * tifEncode_insertedData - client inserted into our output stream
+ *
+\*****************************************************************************/
+
+static WORD tifEncode_insertedData (
+ IP_XFORM_HANDLE hXform,
+ DWORD dwNumBytes)
+{
+ fatalBreakPoint ();
+ return IP_FATAL_ERROR; /* must never be called (can't insert data) */
+}
+
+
+
+/*****************************************************************************\
+ *
+ * tifEncode_newPage - Tells us to flush this page, and start a new page
+ *
+\*****************************************************************************/
+
+static WORD tifEncode_newPage (
+ IP_XFORM_HANDLE hXform)
+{
+ PTIF_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+ /* todo: return fatal error if convert is called again? */
+ return IP_DONE; /* can't insert page-breaks, so ignore this call */
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+
+}
+
+
+
+/*****************************************************************************\
+ *
+ * tifEncode_closeXform - Destroys this instance
+ *
+\*****************************************************************************/
+
+static WORD tifEncode_closeXform (IP_XFORM_HANDLE hXform)
+{
+ PTIF_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+ if (g->fileOut != NULL)
+ fclose (g->fileOut);
+ g->dwValidChk = 0;
+ IP_MEM_FREE (g); /* free memory for the instance */
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * tifEncodeTbl - Jump-table for encoder
+ *
+\*****************************************************************************/
+
+IP_XFORM_TBL tifEncodeTbl = {
+ tifEncode_openXform,
+ tifEncode_setDefaultInputTraits,
+ tifEncode_setXformSpec,
+ tifEncode_getHeaderBufSize,
+ tifEncode_getActualTraits,
+ tifEncode_getActualBufSizes,
+ tifEncode_convert,
+ tifEncode_newPage,
+ tifEncode_insertedData,
+ tifEncode_closeXform
+};
+
+
+
+
+/*****************************************************************************\
+ *****************************************************************************
+ *
+ * D E C O D E R
+ *
+ *****************************************************************************
+\*****************************************************************************/
+
+
+
+
+/*****************************************************************************\
+ *
+ * tifDecode_openXform - Creates a new instance of the transformer
+ *
+ *****************************************************************************
+ *
+ * This returns a handle for the new instance to be passed into
+ * all subsequent calls.
+ *
+ * Return value: IP_DONE=success; IP_FATAL_ERROR=misc error.
+ *
+\*****************************************************************************/
+
+static WORD tifDecode_openXform (
+ IP_XFORM_HANDLE *pXform) /* out: returned handle */
+{
+ PTIF_INST g;
+
+ INSURE (pXform != NULL);
+ IP_MEM_ALLOC (sizeof(TIF_INST), g);
+ *pXform = g;
+ memset (g, 0, sizeof(TIF_INST));
+ g->dwValidChk = CHECK_VALUE;
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * tifDecode_setDefaultInputTraits - Specifies default input image traits
+ *
+ *****************************************************************************
+ *
+ * The header of the file-type handled by the transform probably does
+ * not include *all* the image traits we'd like to know. Those not
+ * specified in the file-header are filled in from info provided by
+ * this routine.
+ *
+ * Return value: IP_DONE=success; IP_FATAL_ERROR=misc error.
+ *
+\*****************************************************************************/
+
+static WORD tifDecode_setDefaultInputTraits (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ PIP_IMAGE_TRAITS pTraits) /* in: default image traits */
+{
+ PTIF_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+ g->traits = *pTraits; /* a structure copy */
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * tifDecode_setXformSpec - Provides xform-specific information
+ *
+\*****************************************************************************/
+
+static WORD tifDecode_setXformSpec (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD_OR_PVOID aXformInfo[]) /* in: xform information */
+{
+ PTIF_INST g;
+ char *s;
+
+ HANDLE_TO_PTR (hXform, g);
+ /* file-path is not used, but might be later, so save it */
+ s = (char*)aXformInfo[IP_TIFF_FILE_PATH].pvoid;
+ if (s != NULL)
+ strcpy (g->sFilePath, s);
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * tifDecode_getHeaderBufSize - Returns size of input buf needed to hold header
+ *
+\*****************************************************************************/
+
+static WORD tifDecode_getHeaderBufSize (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD *pdwInBufLen) /* out: buf size for parsing header */
+{
+ *pdwInBufLen = MAX_HEADER_SIZE + 10000; /* 10000 gives us huge margin */
+ return IP_DONE;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * ByteSwap - Reverses endian-type of the given variable (1, 2, 4 or 8 bytes)
+ *
+\*****************************************************************************/
+
+static void ByteSwap (
+ void *pvVar,
+ int nBytes)
+{
+ BYTE b;
+ BYTE *pb = (BYTE*)pvVar;
+
+ switch (nBytes) {
+ case 1:
+ /* do nothing */
+ break;
+ case 2:
+ b = pb[0]; pb[0] = pb[1]; pb[1] = b;
+ break;
+ case 4:
+ b = pb[1]; pb[1] = pb[2]; pb[2] = b;
+ b = pb[0]; pb[0] = pb[3]; pb[3] = b;
+ break;
+ case 8:
+ /* this is actually two longs, so fix each one */
+ ByteSwap (pvVar, 4);
+ ByteSwap ((BYTE*)pvVar+4, 4);
+ break;
+ }
+}
+
+
+
+/*****************************************************************************\
+ *
+ * ParseTag - Parses a tag, putting value in traits or dwImageOffset
+ *
+\*****************************************************************************/
+
+static BOOL ParseTag (
+ PTIF_INST g, /* in: our instance variables */
+ TIFFTAG *pTag, /* in: the tag to parse */
+ BYTE *pbInputBuf, /* in: input buffer containing TIFF header */
+ BYTE *pbBufAfter, /* in: 1st byte after the input buffer */
+ DWORD *pdwImageOffset) /* out: image start offset set by STRIP_OFFSETS */
+{
+ unsigned id;
+ unsigned kind;
+ unsigned count;
+ void *pValue;
+ int value;
+ int nTypeBytes, nValueBytes;
+ int i;
+
+ if (g->bByteSwap) {
+ ByteSwap (&(pTag->TagID ), 2);
+ ByteSwap (&(pTag->Kind ), 2);
+ ByteSwap (&(pTag->Length), 4);
+ }
+
+ id = pTag->TagID;
+ kind = pTag->Kind;
+ count = pTag->Length;
+
+ switch (kind) {
+ case TIFFUNDEFINED: nTypeBytes = 1; break;
+ case TIFFBYTE: nTypeBytes = 1; break;
+ case TIFFSBYTE: nTypeBytes = 1; break;
+ case TIFFSHORT: nTypeBytes = 2; break;
+ case TIFFSSHORT: nTypeBytes = 2; break;
+ case TIFFLONG: nTypeBytes = 4; break;
+ case TIFFSLONG: nTypeBytes = 4; break;
+ case TIFFRATIONAL: nTypeBytes = 8; break;
+ case TIFFSRATIONAL: nTypeBytes = 8; break;
+ default: INSURE(0);
+ }
+
+ nValueBytes = count * nTypeBytes;
+
+ if (nValueBytes <= 4)
+ pValue = &(pTag->Value.l);
+ else {
+ if (g->bByteSwap)
+ ByteSwap (&(pTag->Value.l), 4);
+ pValue = pbInputBuf + pTag->Value.l;
+ }
+ INSURE ((BYTE*)pValue>pbInputBuf && (BYTE*)pValue<pbBufAfter);
+
+ if (g->bByteSwap) {
+ for (i=0; i<(int)count; i++)
+ ByteSwap ((BYTE*)pValue + i*nTypeBytes, nTypeBytes);
+ }
+
+ switch (kind) {
+ case TIFFUNDEFINED: value = *(TIFF_UBYTE *)pValue; break;
+ case TIFFBYTE: value = *(TIFF_UBYTE *)pValue; break;
+ case TIFFSBYTE: value = *(TIFF_SBYTE *)pValue; break;
+ case TIFFSHORT: value = *(TIFF_USHORT*)pValue; break;
+ case TIFFSSHORT: value = *(TIFF_SSHORT*)pValue; break;
+ case TIFFLONG: value = *(TIFF_ULONG *)pValue; break;
+ case TIFFSLONG: value = *(TIFF_SLONG *)pValue; break;
+ case TIFFRATIONAL: value = ((RATIONAL*)pValue)->n / ((RATIONAL*)pValue)->d; break;
+ case TIFFSRATIONAL: value = ((RATIONAL*)pValue)->n / ((RATIONAL*)pValue)->d; break;
+ default: INSURE(0);
+ }
+
+ switch (id) {
+ case NEW_SUBFILE:
+ /* do nothing */
+ break;
+ case IMAGE_WIDTH:
+ g->traits.iPixelsPerRow = value;
+ break;
+ case IMAGE_LENGTH:
+ g->traits.lNumRows = value;
+ break;
+ case BITS_PER_SAMPLE:
+ g->iBitsPerSample = value;
+ break;
+ case COMPRESSION:
+ INSURE (value == 1); /* we only support uncompressed */
+ break;
+ case PHOTO_INTERPRET:
+ /* do nothing */
+ break;
+ case STRIP_OFFSETS:
+ INSURE (count == 1); /* we only support one strip */
+ *pdwImageOffset = value;
+ break;
+ case SAMPLES_PER_PIXEL:
+ g->traits.iComponentsPerPixel = value;
+ break;
+ case ROWS_PER_STRIP:
+ /* do nothing -- we assume entire image is in one strip */
+ break;
+ case STRIP_COUNTS:
+ /* do nothing -- this should be the # bytes in the raw data */
+ break;
+ case XRESOLUTION:
+ g->traits.lHorizDPI = value << 16;
+ break;
+ case YRESOLUTION:
+ g->traits.lVertDPI = value << 16;
+ break;
+ case RESOLUTION_UNIT:
+ /* do nothing -- if it's not DPI, then reported DPI will be wrong */
+ break;
+ default:
+ /* ignore the unknown tag */
+ break;
+ }
+
+ return TRUE;
+
+ fatal_error:
+ return FALSE;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * tifDecode_getActualTraits - Parses header, and returns input & output traits
+ *
+\*****************************************************************************/
+
+static WORD tifDecode_getActualTraits (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD dwInputAvail, /* in: # avail bytes in input buf */
+ PBYTE pbInputBuf, /* in: ptr to input buffer */
+ PDWORD pdwInputUsed, /* out: # bytes used from input buf */
+ PDWORD pdwInputNextPos,/* out: file-pos to read from next */
+ PIP_IMAGE_TRAITS pInTraits, /* out: input image traits */
+ PIP_IMAGE_TRAITS pOutTraits) /* out: output image traits */
+{
+ PTIF_INST g;
+ DWORD dwImageOffset;
+ PBYTE pb;
+ TIFFHEADER *pHead;
+ TIFFIFD *pIFD;
+ int iTag, nTags;
+
+ HANDLE_TO_PTR (hXform, g);
+ pb = pbInputBuf;
+
+ /**** Parse the file-header ****/
+
+ pHead = (TIFFHEADER*)pb;
+ INSURE (pHead->ByteOrder[0]=='I' || pHead->ByteOrder[0]=='M');
+ INSURE (pHead->ByteOrder[1]=='I' || pHead->ByteOrder[1]=='M');
+ g->bByteSwap = pHead->ByteOrder[0] == 'M';
+ if (g->bByteSwap)
+ ByteSwap (&(pHead->OffsetFirstIFD), 4);
+ INSURE (pHead->OffsetFirstIFD < dwInputAvail);
+ /* ignore the file-version */
+ pb = pbInputBuf + pHead->OffsetFirstIFD;
+
+ /**** Parse the IFD (i.e., the tags), setting traits ****/
+
+ pIFD = (TIFFIFD*)pb;
+ if (g->bByteSwap)
+ ByteSwap (&(pIFD->NumTags), 2);
+ nTags = pIFD->NumTags;
+ INSURE (nTags>0 && nTags<100); /* sanity check */
+ INSURE (nTags*sizeof(TIFFTAG) < dwInputAvail);
+ dwImageOffset = 0;
+
+ for (iTag=0; iTag<nTags; iTag++) {
+ if (! ParseTag (g, pIFD->Tag+iTag, pbInputBuf, pbInputBuf+dwInputAvail, &dwImageOffset))
+ goto fatal_error;
+ }
+
+ INSURE (g->iBitsPerSample==1 || g->iBitsPerSample==8 || g->iBitsPerSample==16);
+ g->traits.iBitsPerPixel = g->iBitsPerSample * g->traits.iComponentsPerPixel;
+ INSURE (dwImageOffset <= dwInputAvail);
+ g->dwRawRowBytes = (g->traits.iBitsPerPixel*g->traits.iPixelsPerRow + 7) / 8;
+
+ /**** Finish up ****/
+
+ g->dwInNextPos = dwImageOffset;
+ *pdwInputUsed = dwImageOffset;
+ *pdwInputNextPos = dwImageOffset;
+
+ *pInTraits = g->traits;
+ *pOutTraits = g->traits;
+ return IP_DONE | IP_READY_FOR_DATA;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/****************************************************************************\
+ *
+ * tifDecode_getActualBufSizes - Returns buf sizes needed for remainder of job
+ *
+\****************************************************************************/
+
+static WORD tifDecode_getActualBufSizes (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ PDWORD pdwMinInBufLen, /* out: min input buf size */
+ PDWORD pdwMinOutBufLen) /* out: min output buf size */
+{
+ PTIF_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+ *pdwMinInBufLen = g->dwRawRowBytes;
+ *pdwMinOutBufLen = g->dwRawRowBytes;
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * tifDecode_convert - the work-horse routine
+ *
+\*****************************************************************************/
+
+static WORD tifDecode_convert (
+ IP_XFORM_HANDLE hXform,
+ DWORD dwInputAvail, /* in: # avail bytes in in-buf */
+ PBYTE pbInputBuf, /* in: ptr to in-buffer */
+ PDWORD pdwInputUsed, /* out: # bytes used from in-buf */
+ PDWORD pdwInputNextPos, /* out: file-pos to read from next */
+ DWORD dwOutputAvail, /* in: # avail bytes in out-buf */
+ PBYTE pbOutputBuf, /* in: ptr to out-buffer */
+ PDWORD pdwOutputUsed, /* out: # bytes written in out-buf */
+ PDWORD pdwOutputThisPos) /* out: file-pos to write the data */
+{
+ PTIF_INST g;
+ UINT n;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ /**** Check if we were told to flush ****/
+
+ if (pbInputBuf == NULL) {
+ PRINT (_T("tif_decode_convert_row: Told to flush.\n"), 0, 0);
+ *pdwInputUsed = *pdwOutputUsed = 0;
+ *pdwInputNextPos = g->dwInNextPos;
+ *pdwOutputThisPos = g->dwOutNextPos;
+ return IP_DONE;
+ }
+
+ /**** Output a Row ****/
+
+ n = g->dwRawRowBytes;
+
+ if (dwInputAvail < n) {
+ /* we got a partial row at the end -- just toss it */
+ g->dwInNextPos += dwInputAvail;
+ *pdwInputNextPos = g->dwInNextPos;
+ *pdwInputUsed = dwInputAvail;
+ *pdwOutputUsed = 0;
+ *pdwOutputThisPos = g->dwOutNextPos;
+ return IP_READY_FOR_DATA;
+ }
+
+ INSURE (dwOutputAvail >= n);
+ memcpy (pbOutputBuf, pbInputBuf, n);
+
+ if (g->bByteSwap && g->iBitsPerSample==16) {
+ /* we need to swap bytes in the 16-bit words in the pixels */
+ BYTE *pb, *pbAfter, b;
+ pbAfter = pbInputBuf + n;
+ for (pb=pbInputBuf; pb<pbAfter; pb+=4) {
+ /* process two words at a time for speed */
+ b = pb[0]; pb[0] = pb[1]; pb[1] = b;
+ b = pb[2]; pb[2] = pb[3]; pb[3] = b;
+ }
+ }
+
+ *pdwOutputUsed = n;
+ *pdwOutputThisPos = g->dwOutNextPos;
+ g->dwOutNextPos += n;
+
+ g->dwInNextPos += n;
+ *pdwInputNextPos = g->dwInNextPos;
+ *pdwInputUsed = n;
+ g->dwRowsDone += 1;
+
+ return IP_CONSUMED_ROW | IP_PRODUCED_ROW | IP_READY_FOR_DATA;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * tifDecode_insertedData - client inserted into our output stream
+ *
+\*****************************************************************************/
+
+static WORD tifDecode_insertedData (
+ IP_XFORM_HANDLE hXform,
+ DWORD dwNumBytes)
+{
+ fatalBreakPoint ();
+ return IP_FATAL_ERROR; /* must never be called (can't insert data) */
+}
+
+
+
+/*****************************************************************************\
+ *
+ * tifDecode_newPage - Tells us to flush this page, and start a new page
+ *
+\*****************************************************************************/
+
+static WORD tifDecode_newPage (
+ IP_XFORM_HANDLE hXform)
+{
+ PTIF_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+ /* todo: return fatal error if convert is called again? */
+ return IP_DONE; /* can't insert page-breaks, so ignore this call */
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+
+}
+
+
+
+/*****************************************************************************\
+ *
+ * tifDecode_closeXform - Destroys this instance
+ *
+\*****************************************************************************/
+
+static WORD tifDecode_closeXform (IP_XFORM_HANDLE hXform)
+{
+ PTIF_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+ if (g->fileOut != NULL)
+ fclose (g->fileOut);
+ g->dwValidChk = 0;
+ IP_MEM_FREE (g); /* free memory for the instance */
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * tifDecodeTbl - Jump-table for decoder
+ *
+\*****************************************************************************/
+
+IP_XFORM_TBL tifDecodeTbl = {
+ tifDecode_openXform,
+ tifDecode_setDefaultInputTraits,
+ tifDecode_setXformSpec,
+ tifDecode_getHeaderBufSize,
+ tifDecode_getActualTraits,
+ tifDecode_getActualBufSizes,
+ tifDecode_convert,
+ tifDecode_newPage,
+ tifDecode_insertedData,
+ tifDecode_closeXform
+};
+
+/* End of File */
diff --git a/ip/xtonemap.c b/ip/xtonemap.c
new file mode 100644
index 0000000..a92080a
--- /dev/null
+++ b/ip/xtonemap.c
@@ -0,0 +1,496 @@
+/* libhpojip -- HP OfficeJet image-processing library. */
+
+/* Copyright (C) 1995-2002 Hewlett-Packard Company
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ * MA 02111-1307, USA.
+ *
+ * In addition, as a special exception, Hewlett-Packard Company
+ * gives permission to link the code of this program with any
+ * version of the OpenSSL library which is distributed under a
+ * license identical to that listed in the included LICENSE.OpenSSL
+ * file, and distribute linked combinations including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * this file, you may extend this exception to your version of the
+ * file, but you are not obligated to do so. If you do not wish to
+ * do so, delete this exception statement from your version.
+ */
+
+/* Original author: Mark Overton and others.
+ *
+ * Ported to Linux by David Paschal.
+ */
+
+/******************************************************************************\
+ *
+ * xtonemap.c - Performs a 256-byte tonemap to grayscale or color data
+ *
+ ******************************************************************************
+ *
+ * Name of Global Jump-Table:
+ *
+ * tonemapTbl
+ *
+ * Items in aXformInfo array passed into setXformSpec:
+ *
+ * aXformInfo[IP_TONEMAP_POINTER] = pointer to the 256-byte tonemap.
+ * aXformInfo[IP_TONEMAP_LUM_SPACE] = Is color-space luminance-based?
+ * 0: color space is RGB
+ * 1: color space has luminance as first byte (eg, YCC)
+ *
+ * The tonemap is indexed by luminance (0..255), and returns the new
+ * luminance. For color data, the luminance is computed based on r-g-b,
+ * and these are updated based on th new luminance.
+ *
+ * An internal copy is made of the tonemap.
+ *
+ * Capabilities and Limitations:
+ *
+ * The incoming data can be 8-bit gray or 24-bit color or 48-bit color.
+ *
+ * Default Input Traits, and Output Traits:
+ *
+ * trait default input output
+ * ------------------- --------------------- ------------------------
+ * iPixelsPerRow * passed into output same as default input
+ * iBitsPerPixel * passed into output same as default input
+ * iComponentsPerPixel passed into output same as default input
+ * lHorizDPI passed into output same as default input
+ * lVertDPI passed into output same as default input
+ * lNumRows passed into output same as default input
+ * iNumPages passed into output same as default input
+ * iPageNum passed into output same as default input
+ *
+ * Above, a "*" by an item indicates it must be valid (not negative).
+ *
+ * Jan 2000 Mark Overton -- wrote original code
+ *
+\******************************************************************************/
+
+#include "hpip.h"
+#include "ipdefs.h"
+#include "string.h" /* for memset and memcpy */
+
+
+#if 0
+ #include "stdio.h"
+ #include <tchar.h>
+
+ #define PRINT(msg,arg1,arg2) \
+ _ftprintf(stderr, msg, (int)arg1, (int)arg2)
+#else
+ #define PRINT(msg,arg1,arg2)
+#endif
+
+#define CHECK_VALUE 0x4ba1dace
+
+
+typedef struct {
+ IP_IMAGE_TRAITS traits; /* traits of the input and output image */
+ BOOL bLumSpace; /* luminance-based color space? (else RGB) */
+ BYTE tonemap[256]; /* the tonemap */
+ DWORD dwBytesPerRow; /* # of bytes in each row */
+ DWORD dwRowsDone; /* number of rows converted so far */
+ DWORD dwInNextPos; /* file pos for subsequent input */
+ DWORD dwOutNextPos; /* file pos for subsequent output */
+ DWORD dwValidChk; /* struct validity check value */
+} TMAP_INST, *PTMAP_INST;
+
+
+
+/*****************************************************************************\
+ *
+ * tonemap_openXform - Creates a new instance of the transformer
+ *
+ *****************************************************************************
+ *
+ * This returns a handle for the new instance to be passed into
+ * all subsequent calls.
+ *
+ * Return value: IP_DONE=success; IP_FATAL_ERROR=misc error.
+ *
+\*****************************************************************************/
+
+static WORD tonemap_openXform (
+ IP_XFORM_HANDLE *pXform) /* out: returned handle */
+{
+ PTMAP_INST g;
+
+ INSURE (pXform != NULL);
+ IP_MEM_ALLOC (sizeof(TMAP_INST), g);
+ *pXform = g;
+ memset (g, 0, sizeof(TMAP_INST));
+ g->dwValidChk = CHECK_VALUE;
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * tonemap_setDefaultInputTraits - Specifies default input image traits
+ *
+ *****************************************************************************
+ *
+ * The header of the file-type handled by the transform probably does
+ * not include *all* the image traits we'd like to know. Those not
+ * specified in the file-header are filled in from info provided by
+ * this routine.
+ *
+ * Return value: IP_DONE=success; IP_FATAL_ERROR=misc error.
+ *
+\*****************************************************************************/
+
+static WORD tonemap_setDefaultInputTraits (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ PIP_IMAGE_TRAITS pTraits) /* in: default image traits */
+{
+ PTMAP_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ /* insure that traits we care about are known */
+ INSURE (pTraits->iPixelsPerRow>0 && pTraits->iBitsPerPixel>1);
+ g->traits = *pTraits; /* a structure copy */
+ g->dwBytesPerRow = (g->traits.iPixelsPerRow*g->traits.iBitsPerPixel + 7) / 8;
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * tonemap_setXformSpec - Provides xform-specific information
+ *
+\*****************************************************************************/
+
+static WORD tonemap_setXformSpec (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD_OR_PVOID aXformInfo[]) /* in: xform information */
+{
+ PTMAP_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+ memcpy (g->tonemap, aXformInfo[IP_TONEMAP_POINTER].pvoid, 256);
+ g->bLumSpace = aXformInfo[IP_TONEMAP_LUM_SPACE].dword;
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * tonemap_getHeaderBufSize- Returns size of input buf needed to hold header
+ *
+\*****************************************************************************/
+
+static WORD tonemap_getHeaderBufSize (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD *pdwInBufLen) /* out: buf size for parsing header */
+{
+ /* since input is raw pixels, there is no header, so set it to zero */
+ *pdwInBufLen = 0;
+ return IP_DONE;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * tonemap_getActualTraits - Parses header, and returns input & output traits
+ *
+\*****************************************************************************/
+
+static WORD tonemap_getActualTraits (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD dwInputAvail, /* in: # avail bytes in input buf */
+ PBYTE pbInputBuf, /* in: ptr to input buffer */
+ PDWORD pdwInputUsed, /* out: # bytes used from input buf */
+ PDWORD pdwInputNextPos,/* out: file-pos to read from next */
+ PIP_IMAGE_TRAITS pIntraits, /* out: input image traits */
+ PIP_IMAGE_TRAITS pOutTraits) /* out: output image traits */
+{
+ PTMAP_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ /* Since there is no header, we'll report no usage of input */
+ *pdwInputUsed = 0;
+ *pdwInputNextPos = 0;
+
+ *pIntraits = g->traits; /* structure copies */
+ *pOutTraits = g->traits;
+
+ return IP_DONE | IP_READY_FOR_DATA;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/****************************************************************************\
+ *
+ * tonemap_getActualBufSizes - Returns buf sizes needed for remainder of job
+ *
+\****************************************************************************/
+
+static WORD tonemap_getActualBufSizes (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ PDWORD pdwMinInBufLen, /* out: min input buf size */
+ PDWORD pdwMinOutBufLen) /* out: min output buf size */
+{
+ PTMAP_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ *pdwMinInBufLen = *pdwMinOutBufLen = g->dwBytesPerRow;
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * tonemap_convert - Converts one row
+ *
+\*****************************************************************************/
+
+static WORD tonemap_convert (
+ IP_XFORM_HANDLE hXform,
+ DWORD dwInputAvail, /* in: # avail bytes in in-buf */
+ PBYTE pbInputBuf, /* in: ptr to in-buffer */
+ PDWORD pdwInputUsed, /* out: # bytes used from in-buf */
+ PDWORD pdwInputNextPos, /* out: file-pos to read from next */
+ DWORD dwOutputAvail, /* in: # avail bytes in out-buf */
+ PBYTE pbOutputBuf, /* in: ptr to out-buffer */
+ PDWORD pdwOutputUsed, /* out: # bytes written in out-buf */
+ PDWORD pdwOutputThisPos) /* out: file-pos to write the data */
+{
+ PTMAP_INST g;
+ int nBytes;
+ PBYTE pIn, pOut, pOutAfter;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ /**** Check if we were told to flush ****/
+
+ if (pbInputBuf == NULL) {
+ PRINT (_T("tonemap_convert: Told to flush.\n"), 0, 0);
+ *pdwInputUsed = *pdwOutputUsed = 0;
+ *pdwInputNextPos = g->dwInNextPos;
+ *pdwOutputThisPos = g->dwOutNextPos;
+ return IP_DONE;
+ }
+
+ /**** Output a Row ****/
+
+ nBytes = g->dwBytesPerRow;
+ INSURE (dwInputAvail >= (DWORD)nBytes );
+ INSURE (dwOutputAvail >= (DWORD)nBytes);
+
+ pIn = pbInputBuf;
+ pOut = pbOutputBuf;
+ pOutAfter = pOut + nBytes;
+
+ if (g->traits.iBitsPerPixel == 8) {
+ /* easiest case */
+ while (pOut < pOutAfter) {
+ *pOut++ = g->tonemap[*pIn++];
+ }
+ } else if (g->traits.iBitsPerPixel == 24) {
+ if (g->bLumSpace) {
+ /* easy case: 24-bit color in a luminance space */
+ while (pOut < pOutAfter) {
+ *pOut = g->tonemap[*pIn];
+ pIn += 3;
+ pOut += 3;
+ }
+ } else {
+ /* 24-bit color in RGB */
+ int rv, gv, bv;
+ int l_old, l_new, dl;
+
+ while (pOut < pOutAfter) {
+ rv = *pIn++;
+ gv = *pIn++;
+ bv = *pIn++;
+
+ l_old = NTSC_LUMINANCE (rv, gv, bv);
+ l_new = g->tonemap[l_old]; /* new luminance */
+ dl = l_new - l_old;
+ rv += dl;
+ gv += dl;
+ bv += dl;
+
+ if (rv > 255) rv = 255; else if (rv < 0) rv = 0;
+ if (gv > 255) gv = 255; else if (gv < 0) gv = 0;
+ if (bv > 255) bv = 255; else if (bv < 0) bv = 0;
+
+ *pOut++ = (BYTE)rv;
+ *pOut++ = (BYTE)gv;
+ *pOut++ = (BYTE)bv;
+ }
+ }
+ } else { /* 48 bits/pixel */
+ PWORD src = (PWORD)pIn;
+ PWORD dst = (PWORD)pOut;
+ PWORD dstAfter = (PWORD)pOutAfter;
+
+ int rv, gv, bv;
+ int l_old, l_old8, l_new1, l_new2, l_new, dl;
+
+ while (dst < dstAfter) {
+ rv = *src++;
+ gv = *src++;
+ bv = *src++;
+
+ /* use linear interpolation between tonemap entries
+ * to compute new luminance (l_new) */
+ l_old = g->bLumSpace ? rv : NTSC_LUMINANCE (rv, gv, bv);
+ l_old8 = l_old >> 8;
+ l_new1 = g->tonemap[l_old8];
+ l_new2 = l_old8<255 ? g->tonemap[l_old8+1] : l_new1;
+ l_new = (l_new2-l_new1)*(l_old&0x00ff) + (l_new1<<8);
+
+ dl = l_new - l_old;
+ rv += dl;
+ if (rv > 65535) rv = 65535; else if (rv < 0) rv = 0;
+
+ if (! g->bLumSpace) {
+ gv += dl;
+ bv += dl;
+ if (gv > 65535) gv = 65535; else if (gv < 0) gv = 0;
+ if (bv > 65535) bv = 65535; else if (bv < 0) bv = 0;
+ }
+
+ *dst++ = (WORD)rv;
+ *dst++ = (WORD)gv;
+ *dst++ = (WORD)bv;
+ }
+ }
+
+ *pdwInputUsed = nBytes;
+ g->dwInNextPos += nBytes;
+ *pdwInputNextPos = g->dwInNextPos;
+
+ *pdwOutputUsed = nBytes;
+ *pdwOutputThisPos = g->dwOutNextPos;
+ g->dwOutNextPos += nBytes;
+
+ g->dwRowsDone += 1;
+
+ return IP_CONSUMED_ROW | IP_PRODUCED_ROW | IP_READY_FOR_DATA;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * tonemap_insertedData - client inserted into our output stream
+ *
+\*****************************************************************************/
+
+static WORD tonemap_insertedData (
+ IP_XFORM_HANDLE hXform,
+ DWORD dwNumBytes)
+{
+ fatalBreakPoint ();
+ return IP_FATAL_ERROR; /* must never be called (can't insert data) */
+}
+
+
+
+/*****************************************************************************\
+ *
+ * tonemap_newPage - Tells us to flush this page, and start a new page
+ *
+\*****************************************************************************/
+
+static WORD tonemap_newPage (
+ IP_XFORM_HANDLE hXform)
+{
+ PTMAP_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+ /* todo: return fatal error if convert is called again? */
+ return IP_DONE; /* can't insert page-breaks, so ignore this call */
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+
+}
+
+
+
+/*****************************************************************************\
+ *
+ * tonemap_closeXform - Destroys this instance
+ *
+\*****************************************************************************/
+
+static WORD tonemap_closeXform (IP_XFORM_HANDLE hXform)
+{
+ PTMAP_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ g->dwValidChk = 0;
+ IP_MEM_FREE (g); /* free memory for the instance */
+
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * tonemapTbl - Jump-table for transform driver
+ *
+\*****************************************************************************/
+
+IP_XFORM_TBL tonemapTbl = {
+ tonemap_openXform,
+ tonemap_setDefaultInputTraits,
+ tonemap_setXformSpec,
+ tonemap_getHeaderBufSize,
+ tonemap_getActualTraits,
+ tonemap_getActualBufSizes,
+ tonemap_convert,
+ tonemap_newPage,
+ tonemap_insertedData,
+ tonemap_closeXform
+};
+
+/* End of File */
diff --git a/ip/xyxtract.c b/ip/xyxtract.c
new file mode 100644
index 0000000..b5156e4
--- /dev/null
+++ b/ip/xyxtract.c
@@ -0,0 +1,451 @@
+/* libhpojip -- HP OfficeJet image-processing library. */
+
+/* Copyright (C) 1995-2002 Hewlett-Packard Company
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ * MA 02111-1307, USA.
+ *
+ * In addition, as a special exception, Hewlett-Packard Company
+ * gives permission to link the code of this program with any
+ * version of the OpenSSL library which is distributed under a
+ * license identical to that listed in the included LICENSE.OpenSSL
+ * file, and distribute linked combinations including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * this file, you may extend this exception to your version of the
+ * file, but you are not obligated to do so. If you do not wish to
+ * do so, delete this exception statement from your version.
+ */
+
+/* Original author: Mark Overton and others.
+ *
+ * Ported to Linux by David Paschal.
+ */
+
+/******************************************************************************\
+ *
+ * xyxtract.c - Y-extract - Extracts Y-component from YCC color data
+ *
+ ******************************************************************************
+ *
+ * Name of Global Jump-Table:
+ *
+ * yXtractTbl
+ *
+ * Items in aXformInfo array passed into setXformSpec:
+ *
+ * xXformInfo[IP_Y_EXTRACT_COLOR_SPACE] tells us something about the color-space
+ * of input data: See the enum IP_Y_EXTRACT_WHICH_SPACE:
+ * IP_Y_EXTRACT_LUM_CHROME = luminance-chrominance, we merely fetch 1st component,
+ * IP_Y_EXTRACT_RGB = input is RGB,
+ * IP_Y_EXTRACT_BGR = input is BGR.
+ *
+ * Capabilities and Limitations:
+ *
+ * Inputs rows of 24-bit color data, and outputs rows of 8-bit gray
+ * consisting of the first component of the color data.
+ *
+ * Default Input Traits, and Output Traits:
+ *
+ * trait default input output
+ * ------------------- --------------------- ------------------------
+ * iPixelsPerRow * passed into output same as default input
+ * iBitsPerPixel * must be 24 8
+ * iComponentsPerPixel * must be 3 1
+ * lHorizDPI passed into output same as default input
+ * lVertDPI passed into output same as default input
+ * lNumRows passed into output same as default input
+ * iNumPages passed into output same as default input
+ * iPageNum passed into output same as default input
+ *
+ * Above, a "*" by an item indicates it must be valid (not negative).
+ *
+ * Jan 1998 Mark Overton -- wrote code
+ *
+\******************************************************************************/
+
+#include "hpip.h"
+#include "ipdefs.h"
+#include "string.h" /* for memset and memcpy */
+
+
+#if 0
+ #include "stdio.h"
+ #include <tchar.h>
+
+ #define PRINT(msg,arg1,arg2) \
+ _ftprintf(stderr, msg, (int)arg1, (int)arg2)
+#else
+ #define PRINT(msg,arg1,arg2)
+#endif
+
+#define CHECK_VALUE 0x1ce5ca7e
+
+typedef struct {
+ IP_IMAGE_TRAITS inTraits; /* traits of the input image */
+ IP_Y_EXTRACT_WHICH_SPACE eInputType; /* type of input data */
+ DWORD dwRowsDone; /* number of rows converted so far */
+ DWORD dwInNextPos; /* file pos for subsequent input */
+ DWORD dwOutNextPos; /* file pos for subsequent output */
+ DWORD dwValidChk; /* struct validity check value */
+} YEX_INST, *PYEX_INST;
+
+
+
+/*****************************************************************************\
+ *
+ * yXtract_openXform - Creates a new instance of the transformer
+ *
+ *****************************************************************************
+ *
+ * This returns a handle for the new instance to be passed into
+ * all subsequent calls.
+ *
+ * Return value: IP_DONE=success; IP_FATAL_ERROR=misc error.
+ *
+\*****************************************************************************/
+
+static WORD yXtract_openXform (
+ IP_XFORM_HANDLE *pXform) /* out: returned handle */
+{
+ PYEX_INST g;
+
+ INSURE (pXform != NULL);
+ IP_MEM_ALLOC (sizeof(YEX_INST), g);
+ *pXform = g;
+ memset (g, 0, sizeof(YEX_INST));
+ g->dwValidChk = CHECK_VALUE;
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * yXtract_setDefaultInputTraits - Specifies default input image traits
+ *
+ *****************************************************************************
+ *
+ * The header of the file-type handled by the transform probably does
+ * not include *all* the image traits we'd like to know. Those not
+ * specified in the file-header are filled in from info provided by
+ * this routine.
+ *
+ * Return value: IP_DONE=success; IP_FATAL_ERROR=misc error.
+ *
+\*****************************************************************************/
+
+static WORD yXtract_setDefaultInputTraits (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ PIP_IMAGE_TRAITS pTraits) /* in: default image traits */
+{
+ PYEX_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ /* Insure that values we care about are correct */
+ INSURE (pTraits->iBitsPerPixel == 24);
+ INSURE (pTraits->iComponentsPerPixel == 3);
+ INSURE (pTraits->iPixelsPerRow > 0);
+
+ g->inTraits = *pTraits; /* a structure copy */
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * yXtract_setXformSpec - Provides xform-specific information
+ *
+\*****************************************************************************/
+
+static WORD yXtract_setXformSpec (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD_OR_PVOID aXformInfo[]) /* in: xform information */
+{
+ PYEX_INST g;
+ HANDLE_TO_PTR (hXform, g);
+ g->eInputType = (IP_Y_EXTRACT_WHICH_SPACE)aXformInfo[IP_Y_EXTRACT_COLOR_SPACE].dword;
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * yXtract_getHeaderBufSize- Returns size of input buf needed to hold header
+ *
+\*****************************************************************************/
+
+static WORD yXtract_getHeaderBufSize (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD *pdwInBufLen) /* out: buf size for parsing header */
+{
+ /* since input is raw pixels, there is no header, so set it to zero */
+ *pdwInBufLen = 0;
+ return IP_DONE;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * yXtract_getActualTraits - Parses header, and returns input & output traits
+ *
+\*****************************************************************************/
+
+static WORD yXtract_getActualTraits (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ DWORD dwInputAvail, /* in: # avail bytes in input buf */
+ PBYTE pbInputBuf, /* in: ptr to input buffer */
+ PDWORD pdwInputUsed, /* out: # bytes used from input buf */
+ PDWORD pdwInputNextPos,/* out: file-pos to read from next */
+ PIP_IMAGE_TRAITS pInTraits, /* out: input image traits */
+ PIP_IMAGE_TRAITS pOutTraits) /* out: output image traits */
+{
+ PYEX_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ /* Since there is no header, we'll report no usage of input */
+ *pdwInputUsed = 0;
+ *pdwInputNextPos = 0;
+
+ *pInTraits = g->inTraits;
+ *pOutTraits = g->inTraits;
+ pOutTraits->iBitsPerPixel = 8;
+ pOutTraits->iComponentsPerPixel = 1;
+
+ return IP_DONE | IP_READY_FOR_DATA;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/****************************************************************************\
+ *
+ * yXtract_getActualBufSizes - Returns buf sizes needed for remainder of job
+ *
+\****************************************************************************/
+
+static WORD yXtract_getActualBufSizes (
+ IP_XFORM_HANDLE hXform, /* in: handle for xform */
+ PDWORD pdwMinInBufLen, /* out: min input buf size */
+ PDWORD pdwMinOutBufLen) /* out: min output buf size */
+{
+ PYEX_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+ *pdwMinInBufLen = 3 * g->inTraits.iPixelsPerRow;
+ *pdwMinOutBufLen = g->inTraits.iPixelsPerRow;
+
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * yXtract_convert - Converts one row
+ *
+\*****************************************************************************/
+
+static WORD yXtract_convert (
+ IP_XFORM_HANDLE hXform,
+ DWORD dwInputAvail, /* in: # avail bytes in in-buf */
+ PBYTE pbInputBuf, /* in: ptr to in-buffer */
+ PDWORD pdwInputUsed, /* out: # bytes used from in-buf */
+ PDWORD pdwInputNextPos, /* out: file-pos to read from next */
+ DWORD dwOutputAvail, /* in: # avail bytes in out-buf */
+ PBYTE pbOutputBuf, /* in: ptr to out-buffer */
+ PDWORD pdwOutputUsed, /* out: # bytes written in out-buf */
+ PDWORD pdwOutputThisPos) /* out: file-pos to write the data */
+{
+ PYEX_INST g;
+ int inBytes, outBytes;
+ PBYTE pIn, pOut, pOutAfter;
+ UINT red, grn, blu;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ /**** Check if we were told to flush ****/
+
+ if (pbInputBuf == NULL) {
+ PRINT (_T("yXtract_convert: Told to flush.\n"), 0, 0);
+ *pdwInputUsed = *pdwOutputUsed = 0;
+ *pdwInputNextPos = g->dwInNextPos;
+ *pdwOutputThisPos = g->dwOutNextPos;
+ return IP_DONE;
+ }
+
+ /**** Output a Row ****/
+
+ outBytes = g->inTraits.iPixelsPerRow;
+ inBytes = 3 * outBytes;
+ INSURE (dwInputAvail >= (DWORD)inBytes );
+ INSURE (dwOutputAvail >= (DWORD)outBytes);
+
+ pIn = pbInputBuf;
+ pOut = pbOutputBuf;
+ pOutAfter = pOut + outBytes;
+
+ switch (g->eInputType) {
+ case IP_Y_EXTRACT_LUM_CHROME:
+ while (pOut < pOutAfter) {
+ *pOut++ = *pIn;
+ pIn += 3;
+ }
+ break;
+
+ case IP_Y_EXTRACT_RGB:
+ while (pOut < pOutAfter) {
+ red = (UINT)(*pIn++);
+ grn = (UINT)(*pIn++);
+ blu = (UINT)(*pIn++);
+ /* the formula below is: Y = (5*R + 9*G + 2*B) / 16 */
+ *pOut++ =
+ (BYTE)((((red<<2)+red) + ((grn<<3)+grn) + (blu<<1) + 8) >> 4);
+ }
+ break;
+
+ case IP_Y_EXTRACT_BGR:
+ while (pOut < pOutAfter) {
+ blu = (UINT)(*pIn++);
+ grn = (UINT)(*pIn++);
+ red = (UINT)(*pIn++);
+ /* the formula below is: Y = (5*R + 9*G + 2*B) / 16 */
+ *pOut++ =
+ (BYTE)((((red<<2)+red) + ((grn<<3)+grn) + (blu<<1) + 8) >> 4);
+ }
+ break;
+
+ default:
+ goto fatal_error;
+ }
+
+ *pdwInputUsed = inBytes;
+ g->dwInNextPos += inBytes;
+ *pdwInputNextPos = g->dwInNextPos;
+
+ *pdwOutputUsed = outBytes;
+ *pdwOutputThisPos = g->dwOutNextPos;
+ g->dwOutNextPos += outBytes;
+
+ g->dwRowsDone += 1;
+
+ return IP_CONSUMED_ROW | IP_PRODUCED_ROW | IP_READY_FOR_DATA;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * yXtract_insertedData - client inserted into our output stream
+ *
+\*****************************************************************************/
+
+static WORD yXtract_insertedData (
+ IP_XFORM_HANDLE hXform,
+ DWORD dwNumBytes)
+{
+ fatalBreakPoint ();
+ return IP_FATAL_ERROR; /* must never be called (can't insert data) */
+}
+
+
+
+/*****************************************************************************\
+ *
+ * yXtract_newPage - Tells us to flush this page, and start a new page
+ *
+\*****************************************************************************/
+
+static WORD yXtract_newPage (
+ IP_XFORM_HANDLE hXform)
+{
+ PYEX_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+ /* todo: return fatal error if convert is called again? */
+ return IP_DONE; /* can't insert page-breaks, so ignore this call */
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+
+}
+
+
+
+/*****************************************************************************\
+ *
+ * yXtract_closeXform - Destroys this instance
+ *
+\*****************************************************************************/
+
+static WORD yXtract_closeXform (IP_XFORM_HANDLE hXform)
+{
+ PYEX_INST g;
+
+ HANDLE_TO_PTR (hXform, g);
+
+ g->dwValidChk = 0;
+ IP_MEM_FREE (g); /* free memory for the instance */
+
+ return IP_DONE;
+
+ fatal_error:
+ return IP_FATAL_ERROR;
+}
+
+
+
+/*****************************************************************************\
+ *
+ * yXtractTbl - Jump-table for encoder
+ *
+\*****************************************************************************/
+
+IP_XFORM_TBL yXtractTbl = {
+ yXtract_openXform,
+ yXtract_setDefaultInputTraits,
+ yXtract_setXformSpec,
+ yXtract_getHeaderBufSize,
+ yXtract_getActualTraits,
+ yXtract_getActualBufSizes,
+ yXtract_convert,
+ yXtract_newPage,
+ yXtract_insertedData,
+ yXtract_closeXform
+};
+
+/* End of File */
diff --git a/levels.py b/levels.py
new file mode 100755
index 0000000..c86b15b
--- /dev/null
+++ b/levels.py
@@ -0,0 +1,207 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2008 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+__version__ = '2.0'
+__title__ = 'Supply Levels Utility'
+__mod__ = 'hp-levels'
+__doc__ = "Display bar graphs of current supply levels for supported HPLIP printers."
+
+# Std Lib
+import sys
+import getopt
+import time
+import operator
+import os
+
+# Local
+from base.g import *
+from base import device, status, utils, tui, module
+from prnt import cups
+
+DEFAULT_BAR_GRAPH_SIZE = 8*(tui.ttysize()[1])/10
+
+
+def logBarGraph(agent_level, agent_type, size=DEFAULT_BAR_GRAPH_SIZE, use_colors=True, bar_char='/'):
+ #print agent_level, agent_type, size, use_colors, bar_char
+
+ adj = 100.0/size
+ if adj==0.0: adj=100.0
+ bar = int(agent_level/adj)
+ if bar > (size-2): bar = size-2
+
+ if use_colors:
+ if agent_type in (AGENT_TYPE_CMY, AGENT_TYPE_KCM, AGENT_TYPE_CYAN, AGENT_TYPE_CYAN_LOW):
+ log.info(log.codes['teal'])
+ elif agent_type in (AGENT_TYPE_MAGENTA, AGENT_TYPE_MAGENTA_LOW):
+ log.info(log.codes['fuscia'])
+ elif agent_type in (AGENT_TYPE_YELLOW, AGENT_TYPE_YELLOW_LOW):
+ log.info(log.codes['yellow'])
+ elif agent_type == AGENT_TYPE_BLUE:
+ log.info(log.codes['blue'])
+ elif agent_type in (AGENT_TYPE_BLACK, AGENT_TYPE_BLACK_B8800):
+ log.info(log.codes['bold'])
+ elif agent_type in (AGENT_TYPE_LG, AGENT_TYPE_G, AGENT_TYPE_PG):
+ pass
+
+ color = ''
+ if use_colors:
+ if agent_type in (AGENT_TYPE_CMY, AGENT_TYPE_KCM):
+ color = log.codes['fuscia']
+
+ log.info(("-"*size)+color)
+
+ color = ''
+ if use_colors:
+ if agent_type in (AGENT_TYPE_CMY, AGENT_TYPE_KCM):
+ color = log.codes['yellow']
+
+ log.info("%s%s%s%s (approx. %d%%)%s" % ("|", bar_char*bar,
+ " "*(size-bar-2), "|", agent_level, color))
+
+ color = ''
+ if use_colors:
+ color = log.codes['reset']
+
+ log.info(("-"*size)+color)
+
+
+
+log.set_module('hp-levels')
+
+try:
+ mod = module.Module(__mod__, __title__, __version__, __doc__, None,
+ (INTERACTIVE_MODE,))
+
+ mod.setUsage(module.USAGE_FLAG_DEVICE_ARGS,
+ extra_options=[
+ ("Bar graph size:", "-s<size> or --size=<size> (current default=%d)" % DEFAULT_BAR_GRAPH_SIZE, "option", False),
+ ("Use colored bar graphs:", "-c or --color (default is colorized)", "option", False),
+ ("Bar graph character:", "-a<char> or --char=<char> (default is '/')", "option", False)])
+
+
+ opts, device_uri, printer_name, mode, ui_toolkit, lang = \
+ mod.parseStdOpts('s:ca:', ['size=', 'color', 'char='])
+
+ device_uri = mod.getDeviceUri(device_uri, printer_name)
+
+ size = DEFAULT_BAR_GRAPH_SIZE
+ color = True
+ bar_char = '/'
+
+ for o, a in opts:
+ if o in ('-s', '--size'):
+ try:
+ size = int(a.strip())
+ except (TypeError, ValueError):
+ log.warn("Invalid size specified. Using the default of %d" % DEFAULT_BAR_GRAPH_SIZE)
+ size = DEFAULT_BAR_GRAPH_SIZE
+
+ if size < 1 or size > DEFAULT_BAR_GRAPH_SIZE:
+ log.warn("Invalid size specified. Using the default of %d" % DEFAULT_BAR_GRAPH_SIZE)
+ size = DEFAULT_BAR_GRAPH_SIZE
+
+ elif o in ('-c', '--color'):
+ color = True
+
+ elif o in ('-a', '--char'):
+ try:
+ bar_char = a[0]
+ except KeyError:
+ bar_char = '/'
+
+
+ try:
+ d = device.Device(device_uri, printer_name)
+ except Error:
+ log.error("Error opening device. Exiting.")
+ sys.exit(1)
+
+ try:
+ try:
+ d.open()
+ d.queryDevice()
+ except Error, e:
+ log.error("Error opening device (%s). Exiting." % e.msg)
+ sys.exit(1)
+
+ if d.mq['status-type'] != STATUS_TYPE_NONE:
+ log.info("")
+
+ sorted_supplies = []
+ a = 1
+ while True:
+ try:
+ agent_type = int(d.dq['agent%d-type' % a])
+ agent_kind = int(d.dq['agent%d-kind' % a])
+ agent_sku = d.dq['agent%d-sku' % a]
+ log.debug("%d: agent_type %d agent_kind %d agent_sku '%s'" % (a, agent_type, agent_kind, agent_sku))
+ except KeyError:
+ break
+ else:
+ sorted_supplies.append((a, agent_kind, agent_type, agent_sku))
+ a += 1
+
+ sorted_supplies.sort(lambda x, y: cmp(x[1], y[1]) or cmp(x[3], y[3]))
+
+ for x in sorted_supplies:
+ a, agent_kind, agent_type, agent_sku = x
+ agent_health = d.dq['agent%d-health' % a]
+ agent_level = d.dq['agent%d-level' % a]
+ agent_desc = d.dq['agent%d-desc' % a]
+ agent_health_desc = d.dq['agent%d-health-desc' % a]
+
+ if agent_health in (AGENT_HEALTH_OK, AGENT_HEALTH_UNKNOWN) and \
+ agent_kind in (AGENT_KIND_SUPPLY,
+ AGENT_KIND_HEAD_AND_SUPPLY,
+ AGENT_KIND_TONER_CARTRIDGE,
+ AGENT_KIND_MAINT_KIT,
+ AGENT_KIND_ADF_KIT,
+ AGENT_KIND_INT_BATTERY,
+ AGENT_KIND_DRUM_KIT,):
+
+ log.info(log.bold(agent_desc))
+ log.info("Part No.: %s" % agent_sku)
+ log.info("Health: %s" % agent_health_desc)
+ logBarGraph(agent_level, agent_type, size, color, bar_char)
+ log.info("")
+
+ else:
+ log.info(log.bold(agent_desc))
+ log.info("Part No.: %s" % agent_sku)
+ log.info("Health: %s" % agent_health_desc)
+ log.info("")
+
+
+ else:
+ log.error("Status not supported for selected device.")
+ sys.exit(1)
+ finally:
+ d.close()
+
+except KeyboardInterrupt:
+ log.error("User exit")
+
+log.info("")
+log.info("Done.")
+
+
+
diff --git a/linefeedcal.py b/linefeedcal.py
new file mode 100755
index 0000000..6c63f4a
--- /dev/null
+++ b/linefeedcal.py
@@ -0,0 +1,90 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2009 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+__version__ = '1.0'
+__title__ = 'Printer Line Feed Calibration Utility'
+__mod__ = 'hp-linefeedcal'
+__doc__ = "Line feed calibration utility for HPLIP supported inkjet printers. (Note: Most printers do not require the use of this utility)."
+
+#Std Lib
+import sys
+import re
+import getopt
+import time
+import operator
+import os
+
+# Local
+from base.g import *
+from base import device, utils, maint, tui, module
+from prnt import cups
+
+try:
+ mod = module.Module(__mod__, __title__, __version__, __doc__, None,
+ (GUI_MODE,), (UI_TOOLKIT_QT4,))
+
+ mod.setUsage(module.USAGE_FLAG_DEVICE_ARGS,
+ see_also_list=['hp-align', 'hp-clean', 'hp-colorcal',
+ 'hp-pqdiag'])
+
+ opts, device_uri, printer_name, mode, ui_toolkit, lang = \
+ mod.parseStdOpts()
+
+ device_uri = mod.getDeviceUri(device_uri, printer_name,
+ filter={'linefeed-cal-type': (operator.gt, 0)})
+
+ if not utils.canEnterGUIMode4():
+ log.error("%s -u/--gui requires Qt4 GUI support. Exiting." % __mod__)
+ sys.exit(1)
+
+ try:
+ from PyQt4.QtGui import QApplication
+ from ui4.linefeedcaldialog import LineFeedCalDialog
+ except ImportError:
+ log.error("Unable to load Qt4 support. Is it installed?")
+ sys.exit(1)
+
+
+ #try:
+ if 1:
+ app = QApplication(sys.argv)
+
+ dlg = LineFeedCalDialog(None, device_uri)
+ dlg.show()
+ try:
+ log.debug("Starting GUI loop...")
+ app.exec_()
+ except KeyboardInterrupt:
+ sys.exit(0)
+
+ #finally:
+ if 1:
+ sys.exit(0)
+
+
+
+except KeyboardInterrupt:
+ log.error("User exit")
+
+log.info("")
+log.info("Done.")
+
diff --git a/ltmain.sh b/ltmain.sh
new file mode 100644
index 0000000..2bcb848
--- /dev/null
+++ b/ltmain.sh
@@ -0,0 +1,6956 @@
+# ltmain.sh - Provide generalized library-building support services.
+# NOTE: Changing this file will not affect anything until you rerun configure.
+#
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006,
+# 2007, 2008 Free Software Foundation, Inc.
+# Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+basename="s,^.*/,,g"
+
+# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh
+# is ksh but when the shell is invoked as "sh" and the current value of
+# the _XPG environment variable is not equal to 1 (one), the special
+# positional parameter $0, within a function call, is the name of the
+# function.
+progpath="$0"
+
+# The name of this program:
+progname=`echo "$progpath" | $SED $basename`
+modename="$progname"
+
+# Global variables:
+EXIT_SUCCESS=0
+EXIT_FAILURE=1
+
+PROGRAM=ltmain.sh
+PACKAGE=libtool
+VERSION=1.5.26
+TIMESTAMP=" (1.1220.2.493 2008/02/01 16:58:18)"
+
+# Be Bourne compatible (taken from Autoconf:_AS_BOURNE_COMPATIBLE).
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+ emulate sh
+ NULLCMD=:
+ # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else
+ case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac
+fi
+BIN_SH=xpg4; export BIN_SH # for Tru64
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# Check that we have a working $echo.
+if test "X$1" = X--no-reexec; then
+ # Discard the --no-reexec flag, and continue.
+ shift
+elif test "X$1" = X--fallback-echo; then
+ # Avoid inline document here, it may be left over
+ :
+elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then
+ # Yippee, $echo works!
+ :
+else
+ # Restart under the correct shell, and then maybe $echo will work.
+ exec $SHELL "$progpath" --no-reexec ${1+"$@"}
+fi
+
+if test "X$1" = X--fallback-echo; then
+ # used as fallback echo
+ shift
+ cat <<EOF
+$*
+EOF
+ exit $EXIT_SUCCESS
+fi
+
+default_mode=
+help="Try \`$progname --help' for more information."
+magic="%%%MAGIC variable%%%"
+mkdir="mkdir"
+mv="mv -f"
+rm="rm -f"
+
+# Sed substitution that helps us do robust quoting. It backslashifies
+# metacharacters that are still active within double-quoted strings.
+Xsed="${SED}"' -e 1s/^X//'
+sed_quote_subst='s/\([\\`\\"$\\\\]\)/\\\1/g'
+# test EBCDIC or ASCII
+case `echo X|tr X '\101'` in
+ A) # ASCII based system
+ # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
+ SP2NL='tr \040 \012'
+ NL2SP='tr \015\012 \040\040'
+ ;;
+ *) # EBCDIC based system
+ SP2NL='tr \100 \n'
+ NL2SP='tr \r\n \100\100'
+ ;;
+esac
+
+# NLS nuisances.
+# Only set LANG and LC_ALL to C if already set.
+# These must not be set unconditionally because not all systems understand
+# e.g. LANG=C (notably SCO).
+# We save the old values to restore during execute mode.
+lt_env=
+for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
+do
+ eval "if test \"\${$lt_var+set}\" = set; then
+ save_$lt_var=\$$lt_var
+ lt_env=\"$lt_var=\$$lt_var \$lt_env\"
+ $lt_var=C
+ export $lt_var
+ fi"
+done
+
+if test -n "$lt_env"; then
+ lt_env="env $lt_env"
+fi
+
+# Make sure IFS has a sensible default
+lt_nl='
+'
+IFS=" $lt_nl"
+
+if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then
+ $echo "$modename: not configured to build any kind of library" 1>&2
+ $echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2
+ exit $EXIT_FAILURE
+fi
+
+# Global variables.
+mode=$default_mode
+nonopt=
+prev=
+prevopt=
+run=
+show="$echo"
+show_help=
+execute_dlfiles=
+duplicate_deps=no
+preserve_args=
+lo2o="s/\\.lo\$/.${objext}/"
+o2lo="s/\\.${objext}\$/.lo/"
+extracted_archives=
+extracted_serial=0
+
+#####################################
+# Shell function definitions:
+# This seems to be the best place for them
+
+# func_mktempdir [string]
+# Make a temporary directory that won't clash with other running
+# libtool processes, and avoids race conditions if possible. If
+# given, STRING is the basename for that directory.
+func_mktempdir ()
+{
+ my_template="${TMPDIR-/tmp}/${1-$progname}"
+
+ if test "$run" = ":"; then
+ # Return a directory name, but don't create it in dry-run mode
+ my_tmpdir="${my_template}-$$"
+ else
+
+ # If mktemp works, use that first and foremost
+ my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null`
+
+ if test ! -d "$my_tmpdir"; then
+ # Failing that, at least try and use $RANDOM to avoid a race
+ my_tmpdir="${my_template}-${RANDOM-0}$$"
+
+ save_mktempdir_umask=`umask`
+ umask 0077
+ $mkdir "$my_tmpdir"
+ umask $save_mktempdir_umask
+ fi
+
+ # If we're not in dry-run mode, bomb out on failure
+ test -d "$my_tmpdir" || {
+ $echo "cannot create temporary directory \`$my_tmpdir'" 1>&2
+ exit $EXIT_FAILURE
+ }
+ fi
+
+ $echo "X$my_tmpdir" | $Xsed
+}
+
+
+# func_win32_libid arg
+# return the library type of file 'arg'
+#
+# Need a lot of goo to handle *both* DLLs and import libs
+# Has to be a shell function in order to 'eat' the argument
+# that is supplied when $file_magic_command is called.
+func_win32_libid ()
+{
+ win32_libid_type="unknown"
+ win32_fileres=`file -L $1 2>/dev/null`
+ case $win32_fileres in
+ *ar\ archive\ import\ library*) # definitely import
+ win32_libid_type="x86 archive import"
+ ;;
+ *ar\ archive*) # could be an import, or static
+ if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | \
+ $EGREP -e 'file format pe-i386(.*architecture: i386)?' >/dev/null ; then
+ win32_nmres=`eval $NM -f posix -A $1 | \
+ $SED -n -e '1,100{
+ / I /{
+ s,.*,import,
+ p
+ q
+ }
+ }'`
+ case $win32_nmres in
+ import*) win32_libid_type="x86 archive import";;
+ *) win32_libid_type="x86 archive static";;
+ esac
+ fi
+ ;;
+ *DLL*)
+ win32_libid_type="x86 DLL"
+ ;;
+ *executable*) # but shell scripts are "executable" too...
+ case $win32_fileres in
+ *MS\ Windows\ PE\ Intel*)
+ win32_libid_type="x86 DLL"
+ ;;
+ esac
+ ;;
+ esac
+ $echo $win32_libid_type
+}
+
+
+# func_infer_tag arg
+# Infer tagged configuration to use if any are available and
+# if one wasn't chosen via the "--tag" command line option.
+# Only attempt this if the compiler in the base compile
+# command doesn't match the default compiler.
+# arg is usually of the form 'gcc ...'
+func_infer_tag ()
+{
+ if test -n "$available_tags" && test -z "$tagname"; then
+ CC_quoted=
+ for arg in $CC; do
+ case $arg in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ arg="\"$arg\""
+ ;;
+ esac
+ CC_quoted="$CC_quoted $arg"
+ done
+ case $@ in
+ # Blanks in the command may have been stripped by the calling shell,
+ # but not from the CC environment variable when configure was run.
+ " $CC "* | "$CC "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*) ;;
+ # Blanks at the start of $base_compile will cause this to fail
+ # if we don't check for them as well.
+ *)
+ for z in $available_tags; do
+ if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then
+ # Evaluate the configuration.
+ eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`"
+ CC_quoted=
+ for arg in $CC; do
+ # Double-quote args containing other shell metacharacters.
+ case $arg in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ arg="\"$arg\""
+ ;;
+ esac
+ CC_quoted="$CC_quoted $arg"
+ done
+ case "$@ " in
+ " $CC "* | "$CC "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*)
+ # The compiler in the base compile command matches
+ # the one in the tagged configuration.
+ # Assume this is the tagged configuration we want.
+ tagname=$z
+ break
+ ;;
+ esac
+ fi
+ done
+ # If $tagname still isn't set, then no tagged configuration
+ # was found and let the user know that the "--tag" command
+ # line option must be used.
+ if test -z "$tagname"; then
+ $echo "$modename: unable to infer tagged configuration"
+ $echo "$modename: specify a tag with \`--tag'" 1>&2
+ exit $EXIT_FAILURE
+# else
+# $echo "$modename: using $tagname tagged configuration"
+ fi
+ ;;
+ esac
+ fi
+}
+
+
+# func_extract_an_archive dir oldlib
+func_extract_an_archive ()
+{
+ f_ex_an_ar_dir="$1"; shift
+ f_ex_an_ar_oldlib="$1"
+
+ $show "(cd $f_ex_an_ar_dir && $AR x $f_ex_an_ar_oldlib)"
+ $run eval "(cd \$f_ex_an_ar_dir && $AR x \$f_ex_an_ar_oldlib)" || exit $?
+ if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then
+ :
+ else
+ $echo "$modename: ERROR: object name conflicts: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" 1>&2
+ exit $EXIT_FAILURE
+ fi
+}
+
+# func_extract_archives gentop oldlib ...
+func_extract_archives ()
+{
+ my_gentop="$1"; shift
+ my_oldlibs=${1+"$@"}
+ my_oldobjs=""
+ my_xlib=""
+ my_xabs=""
+ my_xdir=""
+ my_status=""
+
+ $show "${rm}r $my_gentop"
+ $run ${rm}r "$my_gentop"
+ $show "$mkdir $my_gentop"
+ $run $mkdir "$my_gentop"
+ my_status=$?
+ if test "$my_status" -ne 0 && test ! -d "$my_gentop"; then
+ exit $my_status
+ fi
+
+ for my_xlib in $my_oldlibs; do
+ # Extract the objects.
+ case $my_xlib in
+ [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;;
+ *) my_xabs=`pwd`"/$my_xlib" ;;
+ esac
+ my_xlib=`$echo "X$my_xlib" | $Xsed -e 's%^.*/%%'`
+ my_xlib_u=$my_xlib
+ while :; do
+ case " $extracted_archives " in
+ *" $my_xlib_u "*)
+ extracted_serial=`expr $extracted_serial + 1`
+ my_xlib_u=lt$extracted_serial-$my_xlib ;;
+ *) break ;;
+ esac
+ done
+ extracted_archives="$extracted_archives $my_xlib_u"
+ my_xdir="$my_gentop/$my_xlib_u"
+
+ $show "${rm}r $my_xdir"
+ $run ${rm}r "$my_xdir"
+ $show "$mkdir $my_xdir"
+ $run $mkdir "$my_xdir"
+ exit_status=$?
+ if test "$exit_status" -ne 0 && test ! -d "$my_xdir"; then
+ exit $exit_status
+ fi
+ case $host in
+ *-darwin*)
+ $show "Extracting $my_xabs"
+ # Do not bother doing anything if just a dry run
+ if test -z "$run"; then
+ darwin_orig_dir=`pwd`
+ cd $my_xdir || exit $?
+ darwin_archive=$my_xabs
+ darwin_curdir=`pwd`
+ darwin_base_archive=`$echo "X$darwin_archive" | $Xsed -e 's%^.*/%%'`
+ darwin_arches=`lipo -info "$darwin_archive" 2>/dev/null | $EGREP Architectures 2>/dev/null`
+ if test -n "$darwin_arches"; then
+ darwin_arches=`echo "$darwin_arches" | $SED -e 's/.*are://'`
+ darwin_arch=
+ $show "$darwin_base_archive has multiple architectures $darwin_arches"
+ for darwin_arch in $darwin_arches ; do
+ mkdir -p "unfat-$$/${darwin_base_archive}-${darwin_arch}"
+ lipo -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}"
+ cd "unfat-$$/${darwin_base_archive}-${darwin_arch}"
+ func_extract_an_archive "`pwd`" "${darwin_base_archive}"
+ cd "$darwin_curdir"
+ $rm "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}"
+ done # $darwin_arches
+ ## Okay now we have a bunch of thin objects, gotta fatten them up :)
+ darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print| xargs basename | sort -u | $NL2SP`
+ darwin_file=
+ darwin_files=
+ for darwin_file in $darwin_filelist; do
+ darwin_files=`find unfat-$$ -name $darwin_file -print | $NL2SP`
+ lipo -create -output "$darwin_file" $darwin_files
+ done # $darwin_filelist
+ ${rm}r unfat-$$
+ cd "$darwin_orig_dir"
+ else
+ cd "$darwin_orig_dir"
+ func_extract_an_archive "$my_xdir" "$my_xabs"
+ fi # $darwin_arches
+ fi # $run
+ ;;
+ *)
+ func_extract_an_archive "$my_xdir" "$my_xabs"
+ ;;
+ esac
+ my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP`
+ done
+ func_extract_archives_result="$my_oldobjs"
+}
+# End of Shell function definitions
+#####################################
+
+# Darwin sucks
+eval std_shrext=\"$shrext_cmds\"
+
+disable_libs=no
+
+# Parse our command line options once, thoroughly.
+while test "$#" -gt 0
+do
+ arg="$1"
+ shift
+
+ case $arg in
+ -*=*) optarg=`$echo "X$arg" | $Xsed -e 's/[-_a-zA-Z0-9]*=//'` ;;
+ *) optarg= ;;
+ esac
+
+ # If the previous option needs an argument, assign it.
+ if test -n "$prev"; then
+ case $prev in
+ execute_dlfiles)
+ execute_dlfiles="$execute_dlfiles $arg"
+ ;;
+ tag)
+ tagname="$arg"
+ preserve_args="${preserve_args}=$arg"
+
+ # Check whether tagname contains only valid characters
+ case $tagname in
+ *[!-_A-Za-z0-9,/]*)
+ $echo "$progname: invalid tag name: $tagname" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ esac
+
+ case $tagname in
+ CC)
+ # Don't test for the "default" C tag, as we know, it's there, but
+ # not specially marked.
+ ;;
+ *)
+ if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "$progpath" > /dev/null; then
+ taglist="$taglist $tagname"
+ # Evaluate the configuration.
+ eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$tagname'$/,/^# ### END LIBTOOL TAG CONFIG: '$tagname'$/p' < $progpath`"
+ else
+ $echo "$progname: ignoring unknown tag $tagname" 1>&2
+ fi
+ ;;
+ esac
+ ;;
+ *)
+ eval "$prev=\$arg"
+ ;;
+ esac
+
+ prev=
+ prevopt=
+ continue
+ fi
+
+ # Have we seen a non-optional argument yet?
+ case $arg in
+ --help)
+ show_help=yes
+ ;;
+
+ --version)
+ echo "\
+$PROGRAM (GNU $PACKAGE) $VERSION$TIMESTAMP
+
+Copyright (C) 2008 Free Software Foundation, Inc.
+This is free software; see the source for copying conditions. There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+ exit $?
+ ;;
+
+ --config)
+ ${SED} -e '1,/^# ### BEGIN LIBTOOL CONFIG/d' -e '/^# ### END LIBTOOL CONFIG/,$d' $progpath
+ # Now print the configurations for the tags.
+ for tagname in $taglist; do
+ ${SED} -n -e "/^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$/,/^# ### END LIBTOOL TAG CONFIG: $tagname$/p" < "$progpath"
+ done
+ exit $?
+ ;;
+
+ --debug)
+ $echo "$progname: enabling shell trace mode"
+ set -x
+ preserve_args="$preserve_args $arg"
+ ;;
+
+ --dry-run | -n)
+ run=:
+ ;;
+
+ --features)
+ $echo "host: $host"
+ if test "$build_libtool_libs" = yes; then
+ $echo "enable shared libraries"
+ else
+ $echo "disable shared libraries"
+ fi
+ if test "$build_old_libs" = yes; then
+ $echo "enable static libraries"
+ else
+ $echo "disable static libraries"
+ fi
+ exit $?
+ ;;
+
+ --finish) mode="finish" ;;
+
+ --mode) prevopt="--mode" prev=mode ;;
+ --mode=*) mode="$optarg" ;;
+
+ --preserve-dup-deps) duplicate_deps="yes" ;;
+
+ --quiet | --silent)
+ show=:
+ preserve_args="$preserve_args $arg"
+ ;;
+
+ --tag)
+ prevopt="--tag"
+ prev=tag
+ preserve_args="$preserve_args --tag"
+ ;;
+ --tag=*)
+ set tag "$optarg" ${1+"$@"}
+ shift
+ prev=tag
+ preserve_args="$preserve_args --tag"
+ ;;
+
+ -dlopen)
+ prevopt="-dlopen"
+ prev=execute_dlfiles
+ ;;
+
+ -*)
+ $echo "$modename: unrecognized option \`$arg'" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+
+ *)
+ nonopt="$arg"
+ break
+ ;;
+ esac
+done
+
+if test -n "$prevopt"; then
+ $echo "$modename: option \`$prevopt' requires an argument" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+fi
+
+case $disable_libs in
+no)
+ ;;
+shared)
+ build_libtool_libs=no
+ build_old_libs=yes
+ ;;
+static)
+ build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac`
+ ;;
+esac
+
+# If this variable is set in any of the actions, the command in it
+# will be execed at the end. This prevents here-documents from being
+# left over by shells.
+exec_cmd=
+
+if test -z "$show_help"; then
+
+ # Infer the operation mode.
+ if test -z "$mode"; then
+ $echo "*** Warning: inferring the mode of operation is deprecated." 1>&2
+ $echo "*** Future versions of Libtool will require --mode=MODE be specified." 1>&2
+ case $nonopt in
+ *cc | cc* | *++ | gcc* | *-gcc* | g++* | xlc*)
+ mode=link
+ for arg
+ do
+ case $arg in
+ -c)
+ mode=compile
+ break
+ ;;
+ esac
+ done
+ ;;
+ *db | *dbx | *strace | *truss)
+ mode=execute
+ ;;
+ *install*|cp|mv)
+ mode=install
+ ;;
+ *rm)
+ mode=uninstall
+ ;;
+ *)
+ # If we have no mode, but dlfiles were specified, then do execute mode.
+ test -n "$execute_dlfiles" && mode=execute
+
+ # Just use the default operation mode.
+ if test -z "$mode"; then
+ if test -n "$nonopt"; then
+ $echo "$modename: warning: cannot infer operation mode from \`$nonopt'" 1>&2
+ else
+ $echo "$modename: warning: cannot infer operation mode without MODE-ARGS" 1>&2
+ fi
+ fi
+ ;;
+ esac
+ fi
+
+ # Only execute mode is allowed to have -dlopen flags.
+ if test -n "$execute_dlfiles" && test "$mode" != execute; then
+ $echo "$modename: unrecognized option \`-dlopen'" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ # Change the help message to a mode-specific one.
+ generic_help="$help"
+ help="Try \`$modename --help --mode=$mode' for more information."
+
+ # These modes are in order of execution frequency so that they run quickly.
+ case $mode in
+ # libtool compile mode
+ compile)
+ modename="$modename: compile"
+ # Get the compilation command and the source file.
+ base_compile=
+ srcfile="$nonopt" # always keep a non-empty value in "srcfile"
+ suppress_opt=yes
+ suppress_output=
+ arg_mode=normal
+ libobj=
+ later=
+
+ for arg
+ do
+ case $arg_mode in
+ arg )
+ # do not "continue". Instead, add this to base_compile
+ lastarg="$arg"
+ arg_mode=normal
+ ;;
+
+ target )
+ libobj="$arg"
+ arg_mode=normal
+ continue
+ ;;
+
+ normal )
+ # Accept any command-line options.
+ case $arg in
+ -o)
+ if test -n "$libobj" ; then
+ $echo "$modename: you cannot specify \`-o' more than once" 1>&2
+ exit $EXIT_FAILURE
+ fi
+ arg_mode=target
+ continue
+ ;;
+
+ -static | -prefer-pic | -prefer-non-pic)
+ later="$later $arg"
+ continue
+ ;;
+
+ -no-suppress)
+ suppress_opt=no
+ continue
+ ;;
+
+ -Xcompiler)
+ arg_mode=arg # the next one goes into the "base_compile" arg list
+ continue # The current "srcfile" will either be retained or
+ ;; # replaced later. I would guess that would be a bug.
+
+ -Wc,*)
+ args=`$echo "X$arg" | $Xsed -e "s/^-Wc,//"`
+ lastarg=
+ save_ifs="$IFS"; IFS=','
+ for arg in $args; do
+ IFS="$save_ifs"
+
+ # Double-quote args containing other shell metacharacters.
+ # Many Bourne shells cannot handle close brackets correctly
+ # in scan sets, so we specify it separately.
+ case $arg in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ arg="\"$arg\""
+ ;;
+ esac
+ lastarg="$lastarg $arg"
+ done
+ IFS="$save_ifs"
+ lastarg=`$echo "X$lastarg" | $Xsed -e "s/^ //"`
+
+ # Add the arguments to base_compile.
+ base_compile="$base_compile $lastarg"
+ continue
+ ;;
+
+ * )
+ # Accept the current argument as the source file.
+ # The previous "srcfile" becomes the current argument.
+ #
+ lastarg="$srcfile"
+ srcfile="$arg"
+ ;;
+ esac # case $arg
+ ;;
+ esac # case $arg_mode
+
+ # Aesthetically quote the previous argument.
+ lastarg=`$echo "X$lastarg" | $Xsed -e "$sed_quote_subst"`
+
+ case $lastarg in
+ # Double-quote args containing other shell metacharacters.
+ # Many Bourne shells cannot handle close brackets correctly
+ # in scan sets, and some SunOS ksh mistreat backslash-escaping
+ # in scan sets (worked around with variable expansion),
+ # and furthermore cannot handle '|' '&' '(' ')' in scan sets
+ # at all, so we specify them separately.
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ lastarg="\"$lastarg\""
+ ;;
+ esac
+
+ base_compile="$base_compile $lastarg"
+ done # for arg
+
+ case $arg_mode in
+ arg)
+ $echo "$modename: you must specify an argument for -Xcompile"
+ exit $EXIT_FAILURE
+ ;;
+ target)
+ $echo "$modename: you must specify a target with \`-o'" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ *)
+ # Get the name of the library object.
+ [ -z "$libobj" ] && libobj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%'`
+ ;;
+ esac
+
+ # Recognize several different file suffixes.
+ # If the user specifies -o file.o, it is replaced with file.lo
+ xform='[cCFSifmso]'
+ case $libobj in
+ *.ada) xform=ada ;;
+ *.adb) xform=adb ;;
+ *.ads) xform=ads ;;
+ *.asm) xform=asm ;;
+ *.c++) xform=c++ ;;
+ *.cc) xform=cc ;;
+ *.ii) xform=ii ;;
+ *.class) xform=class ;;
+ *.cpp) xform=cpp ;;
+ *.cxx) xform=cxx ;;
+ *.[fF][09]?) xform=[fF][09]. ;;
+ *.for) xform=for ;;
+ *.java) xform=java ;;
+ *.obj) xform=obj ;;
+ *.sx) xform=sx ;;
+ esac
+
+ libobj=`$echo "X$libobj" | $Xsed -e "s/\.$xform$/.lo/"`
+
+ case $libobj in
+ *.lo) obj=`$echo "X$libobj" | $Xsed -e "$lo2o"` ;;
+ *)
+ $echo "$modename: cannot determine name of library object from \`$libobj'" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ esac
+
+ func_infer_tag $base_compile
+
+ for arg in $later; do
+ case $arg in
+ -static)
+ build_old_libs=yes
+ continue
+ ;;
+
+ -prefer-pic)
+ pic_mode=yes
+ continue
+ ;;
+
+ -prefer-non-pic)
+ pic_mode=no
+ continue
+ ;;
+ esac
+ done
+
+ qlibobj=`$echo "X$libobj" | $Xsed -e "$sed_quote_subst"`
+ case $qlibobj in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ qlibobj="\"$qlibobj\"" ;;
+ esac
+ test "X$libobj" != "X$qlibobj" \
+ && $echo "X$libobj" | grep '[]~#^*{};<>?"'"'"' &()|`$[]' \
+ && $echo "$modename: libobj name \`$libobj' may not contain shell special characters."
+ objname=`$echo "X$obj" | $Xsed -e 's%^.*/%%'`
+ xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'`
+ if test "X$xdir" = "X$obj"; then
+ xdir=
+ else
+ xdir=$xdir/
+ fi
+ lobj=${xdir}$objdir/$objname
+
+ if test -z "$base_compile"; then
+ $echo "$modename: you must specify a compilation command" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ # Delete any leftover library objects.
+ if test "$build_old_libs" = yes; then
+ removelist="$obj $lobj $libobj ${libobj}T"
+ else
+ removelist="$lobj $libobj ${libobj}T"
+ fi
+
+ $run $rm $removelist
+ trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15
+
+ # On Cygwin there's no "real" PIC flag so we must build both object types
+ case $host_os in
+ cygwin* | mingw* | pw32* | os2*)
+ pic_mode=default
+ ;;
+ esac
+ if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then
+ # non-PIC code in shared libraries is not supported
+ pic_mode=default
+ fi
+
+ # Calculate the filename of the output object if compiler does
+ # not support -o with -c
+ if test "$compiler_c_o" = no; then
+ output_obj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\.[^.]*$%%'`.${objext}
+ lockfile="$output_obj.lock"
+ removelist="$removelist $output_obj $lockfile"
+ trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15
+ else
+ output_obj=
+ need_locks=no
+ lockfile=
+ fi
+
+ # Lock this critical section if it is needed
+ # We use this script file to make the link, it avoids creating a new file
+ if test "$need_locks" = yes; then
+ until $run ln "$progpath" "$lockfile" 2>/dev/null; do
+ $show "Waiting for $lockfile to be removed"
+ sleep 2
+ done
+ elif test "$need_locks" = warn; then
+ if test -f "$lockfile"; then
+ $echo "\
+*** ERROR, $lockfile exists and contains:
+`cat $lockfile 2>/dev/null`
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together. If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+ $run $rm $removelist
+ exit $EXIT_FAILURE
+ fi
+ $echo "$srcfile" > "$lockfile"
+ fi
+
+ if test -n "$fix_srcfile_path"; then
+ eval srcfile=\"$fix_srcfile_path\"
+ fi
+ qsrcfile=`$echo "X$srcfile" | $Xsed -e "$sed_quote_subst"`
+ case $qsrcfile in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ qsrcfile="\"$qsrcfile\"" ;;
+ esac
+
+ $run $rm "$libobj" "${libobj}T"
+
+ # Create a libtool object file (analogous to a ".la" file),
+ # but don't create it if we're doing a dry run.
+ test -z "$run" && cat > ${libobj}T <<EOF
+# $libobj - a libtool object file
+# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+EOF
+
+ # Only build a PIC object if we are building libtool libraries.
+ if test "$build_libtool_libs" = yes; then
+ # Without this assignment, base_compile gets emptied.
+ fbsd_hideous_sh_bug=$base_compile
+
+ if test "$pic_mode" != no; then
+ command="$base_compile $qsrcfile $pic_flag"
+ else
+ # Don't build PIC code
+ command="$base_compile $qsrcfile"
+ fi
+
+ if test ! -d "${xdir}$objdir"; then
+ $show "$mkdir ${xdir}$objdir"
+ $run $mkdir ${xdir}$objdir
+ exit_status=$?
+ if test "$exit_status" -ne 0 && test ! -d "${xdir}$objdir"; then
+ exit $exit_status
+ fi
+ fi
+
+ if test -z "$output_obj"; then
+ # Place PIC objects in $objdir
+ command="$command -o $lobj"
+ fi
+
+ $run $rm "$lobj" "$output_obj"
+
+ $show "$command"
+ if $run eval $lt_env "$command"; then :
+ else
+ test -n "$output_obj" && $run $rm $removelist
+ exit $EXIT_FAILURE
+ fi
+
+ if test "$need_locks" = warn &&
+ test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
+ $echo "\
+*** ERROR, $lockfile contains:
+`cat $lockfile 2>/dev/null`
+
+but it should contain:
+$srcfile
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together. If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+ $run $rm $removelist
+ exit $EXIT_FAILURE
+ fi
+
+ # Just move the object if needed, then go on to compile the next one
+ if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then
+ $show "$mv $output_obj $lobj"
+ if $run $mv $output_obj $lobj; then :
+ else
+ error=$?
+ $run $rm $removelist
+ exit $error
+ fi
+ fi
+
+ # Append the name of the PIC object to the libtool object file.
+ test -z "$run" && cat >> ${libobj}T <<EOF
+pic_object='$objdir/$objname'
+
+EOF
+
+ # Allow error messages only from the first compilation.
+ if test "$suppress_opt" = yes; then
+ suppress_output=' >/dev/null 2>&1'
+ fi
+ else
+ # No PIC object so indicate it doesn't exist in the libtool
+ # object file.
+ test -z "$run" && cat >> ${libobj}T <<EOF
+pic_object=none
+
+EOF
+ fi
+
+ # Only build a position-dependent object if we build old libraries.
+ if test "$build_old_libs" = yes; then
+ if test "$pic_mode" != yes; then
+ # Don't build PIC code
+ command="$base_compile $qsrcfile"
+ else
+ command="$base_compile $qsrcfile $pic_flag"
+ fi
+ if test "$compiler_c_o" = yes; then
+ command="$command -o $obj"
+ fi
+
+ # Suppress compiler output if we already did a PIC compilation.
+ command="$command$suppress_output"
+ $run $rm "$obj" "$output_obj"
+ $show "$command"
+ if $run eval $lt_env "$command"; then :
+ else
+ $run $rm $removelist
+ exit $EXIT_FAILURE
+ fi
+
+ if test "$need_locks" = warn &&
+ test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
+ $echo "\
+*** ERROR, $lockfile contains:
+`cat $lockfile 2>/dev/null`
+
+but it should contain:
+$srcfile
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together. If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+ $run $rm $removelist
+ exit $EXIT_FAILURE
+ fi
+
+ # Just move the object if needed
+ if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then
+ $show "$mv $output_obj $obj"
+ if $run $mv $output_obj $obj; then :
+ else
+ error=$?
+ $run $rm $removelist
+ exit $error
+ fi
+ fi
+
+ # Append the name of the non-PIC object the libtool object file.
+ # Only append if the libtool object file exists.
+ test -z "$run" && cat >> ${libobj}T <<EOF
+# Name of the non-PIC object.
+non_pic_object='$objname'
+
+EOF
+ else
+ # Append the name of the non-PIC object the libtool object file.
+ # Only append if the libtool object file exists.
+ test -z "$run" && cat >> ${libobj}T <<EOF
+# Name of the non-PIC object.
+non_pic_object=none
+
+EOF
+ fi
+
+ $run $mv "${libobj}T" "${libobj}"
+
+ # Unlock the critical section if it was locked
+ if test "$need_locks" != no; then
+ $run $rm "$lockfile"
+ fi
+
+ exit $EXIT_SUCCESS
+ ;;
+
+ # libtool link mode
+ link | relink)
+ modename="$modename: link"
+ case $host in
+ *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)
+ # It is impossible to link a dll without this setting, and
+ # we shouldn't force the makefile maintainer to figure out
+ # which system we are compiling for in order to pass an extra
+ # flag for every libtool invocation.
+ # allow_undefined=no
+
+ # FIXME: Unfortunately, there are problems with the above when trying
+ # to make a dll which has undefined symbols, in which case not
+ # even a static library is built. For now, we need to specify
+ # -no-undefined on the libtool link line when we can be certain
+ # that all symbols are satisfied, otherwise we get a static library.
+ allow_undefined=yes
+ ;;
+ *)
+ allow_undefined=yes
+ ;;
+ esac
+ libtool_args="$nonopt"
+ base_compile="$nonopt $@"
+ compile_command="$nonopt"
+ finalize_command="$nonopt"
+
+ compile_rpath=
+ finalize_rpath=
+ compile_shlibpath=
+ finalize_shlibpath=
+ convenience=
+ old_convenience=
+ deplibs=
+ old_deplibs=
+ compiler_flags=
+ linker_flags=
+ dllsearchpath=
+ lib_search_path=`pwd`
+ inst_prefix_dir=
+
+ avoid_version=no
+ dlfiles=
+ dlprefiles=
+ dlself=no
+ export_dynamic=no
+ export_symbols=
+ export_symbols_regex=
+ generated=
+ libobjs=
+ ltlibs=
+ module=no
+ no_install=no
+ objs=
+ non_pic_objects=
+ notinst_path= # paths that contain not-installed libtool libraries
+ precious_files_regex=
+ prefer_static_libs=no
+ preload=no
+ prev=
+ prevarg=
+ release=
+ rpath=
+ xrpath=
+ perm_rpath=
+ temp_rpath=
+ thread_safe=no
+ vinfo=
+ vinfo_number=no
+ single_module="${wl}-single_module"
+
+ func_infer_tag $base_compile
+
+ # We need to know -static, to get the right output filenames.
+ for arg
+ do
+ case $arg in
+ -all-static | -static | -static-libtool-libs)
+ case $arg in
+ -all-static)
+ if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then
+ $echo "$modename: warning: complete static linking is impossible in this configuration" 1>&2
+ fi
+ if test -n "$link_static_flag"; then
+ dlopen_self=$dlopen_self_static
+ fi
+ prefer_static_libs=yes
+ ;;
+ -static)
+ if test -z "$pic_flag" && test -n "$link_static_flag"; then
+ dlopen_self=$dlopen_self_static
+ fi
+ prefer_static_libs=built
+ ;;
+ -static-libtool-libs)
+ if test -z "$pic_flag" && test -n "$link_static_flag"; then
+ dlopen_self=$dlopen_self_static
+ fi
+ prefer_static_libs=yes
+ ;;
+ esac
+ build_libtool_libs=no
+ build_old_libs=yes
+ break
+ ;;
+ esac
+ done
+
+ # See if our shared archives depend on static archives.
+ test -n "$old_archive_from_new_cmds" && build_old_libs=yes
+
+ # Go through the arguments, transforming them on the way.
+ while test "$#" -gt 0; do
+ arg="$1"
+ shift
+ case $arg in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ qarg=\"`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`\" ### testsuite: skip nested quoting test
+ ;;
+ *) qarg=$arg ;;
+ esac
+ libtool_args="$libtool_args $qarg"
+
+ # If the previous option needs an argument, assign it.
+ if test -n "$prev"; then
+ case $prev in
+ output)
+ compile_command="$compile_command @OUTPUT@"
+ finalize_command="$finalize_command @OUTPUT@"
+ ;;
+ esac
+
+ case $prev in
+ dlfiles|dlprefiles)
+ if test "$preload" = no; then
+ # Add the symbol object into the linking commands.
+ compile_command="$compile_command @SYMFILE@"
+ finalize_command="$finalize_command @SYMFILE@"
+ preload=yes
+ fi
+ case $arg in
+ *.la | *.lo) ;; # We handle these cases below.
+ force)
+ if test "$dlself" = no; then
+ dlself=needless
+ export_dynamic=yes
+ fi
+ prev=
+ continue
+ ;;
+ self)
+ if test "$prev" = dlprefiles; then
+ dlself=yes
+ elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then
+ dlself=yes
+ else
+ dlself=needless
+ export_dynamic=yes
+ fi
+ prev=
+ continue
+ ;;
+ *)
+ if test "$prev" = dlfiles; then
+ dlfiles="$dlfiles $arg"
+ else
+ dlprefiles="$dlprefiles $arg"
+ fi
+ prev=
+ continue
+ ;;
+ esac
+ ;;
+ expsyms)
+ export_symbols="$arg"
+ if test ! -f "$arg"; then
+ $echo "$modename: symbol file \`$arg' does not exist"
+ exit $EXIT_FAILURE
+ fi
+ prev=
+ continue
+ ;;
+ expsyms_regex)
+ export_symbols_regex="$arg"
+ prev=
+ continue
+ ;;
+ inst_prefix)
+ inst_prefix_dir="$arg"
+ prev=
+ continue
+ ;;
+ precious_regex)
+ precious_files_regex="$arg"
+ prev=
+ continue
+ ;;
+ release)
+ release="-$arg"
+ prev=
+ continue
+ ;;
+ objectlist)
+ if test -f "$arg"; then
+ save_arg=$arg
+ moreargs=
+ for fil in `cat $save_arg`
+ do
+# moreargs="$moreargs $fil"
+ arg=$fil
+ # A libtool-controlled object.
+
+ # Check to see that this really is a libtool object.
+ if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+ pic_object=
+ non_pic_object=
+
+ # Read the .lo file
+ # If there is no directory component, then add one.
+ case $arg in
+ */* | *\\*) . $arg ;;
+ *) . ./$arg ;;
+ esac
+
+ if test -z "$pic_object" || \
+ test -z "$non_pic_object" ||
+ test "$pic_object" = none && \
+ test "$non_pic_object" = none; then
+ $echo "$modename: cannot find name of object for \`$arg'" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ # Extract subdirectory from the argument.
+ xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'`
+ if test "X$xdir" = "X$arg"; then
+ xdir=
+ else
+ xdir="$xdir/"
+ fi
+
+ if test "$pic_object" != none; then
+ # Prepend the subdirectory the object is found in.
+ pic_object="$xdir$pic_object"
+
+ if test "$prev" = dlfiles; then
+ if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
+ dlfiles="$dlfiles $pic_object"
+ prev=
+ continue
+ else
+ # If libtool objects are unsupported, then we need to preload.
+ prev=dlprefiles
+ fi
+ fi
+
+ # CHECK ME: I think I busted this. -Ossama
+ if test "$prev" = dlprefiles; then
+ # Preload the old-style object.
+ dlprefiles="$dlprefiles $pic_object"
+ prev=
+ fi
+
+ # A PIC object.
+ libobjs="$libobjs $pic_object"
+ arg="$pic_object"
+ fi
+
+ # Non-PIC object.
+ if test "$non_pic_object" != none; then
+ # Prepend the subdirectory the object is found in.
+ non_pic_object="$xdir$non_pic_object"
+
+ # A standard non-PIC object
+ non_pic_objects="$non_pic_objects $non_pic_object"
+ if test -z "$pic_object" || test "$pic_object" = none ; then
+ arg="$non_pic_object"
+ fi
+ else
+ # If the PIC object exists, use it instead.
+ # $xdir was prepended to $pic_object above.
+ non_pic_object="$pic_object"
+ non_pic_objects="$non_pic_objects $non_pic_object"
+ fi
+ else
+ # Only an error if not doing a dry-run.
+ if test -z "$run"; then
+ $echo "$modename: \`$arg' is not a valid libtool object" 1>&2
+ exit $EXIT_FAILURE
+ else
+ # Dry-run case.
+
+ # Extract subdirectory from the argument.
+ xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'`
+ if test "X$xdir" = "X$arg"; then
+ xdir=
+ else
+ xdir="$xdir/"
+ fi
+
+ pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"`
+ non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"`
+ libobjs="$libobjs $pic_object"
+ non_pic_objects="$non_pic_objects $non_pic_object"
+ fi
+ fi
+ done
+ else
+ $echo "$modename: link input file \`$save_arg' does not exist"
+ exit $EXIT_FAILURE
+ fi
+ arg=$save_arg
+ prev=
+ continue
+ ;;
+ rpath | xrpath)
+ # We need an absolute path.
+ case $arg in
+ [\\/]* | [A-Za-z]:[\\/]*) ;;
+ *)
+ $echo "$modename: only absolute run-paths are allowed" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ esac
+ if test "$prev" = rpath; then
+ case "$rpath " in
+ *" $arg "*) ;;
+ *) rpath="$rpath $arg" ;;
+ esac
+ else
+ case "$xrpath " in
+ *" $arg "*) ;;
+ *) xrpath="$xrpath $arg" ;;
+ esac
+ fi
+ prev=
+ continue
+ ;;
+ xcompiler)
+ compiler_flags="$compiler_flags $qarg"
+ prev=
+ compile_command="$compile_command $qarg"
+ finalize_command="$finalize_command $qarg"
+ continue
+ ;;
+ xlinker)
+ linker_flags="$linker_flags $qarg"
+ compiler_flags="$compiler_flags $wl$qarg"
+ prev=
+ compile_command="$compile_command $wl$qarg"
+ finalize_command="$finalize_command $wl$qarg"
+ continue
+ ;;
+ xcclinker)
+ linker_flags="$linker_flags $qarg"
+ compiler_flags="$compiler_flags $qarg"
+ prev=
+ compile_command="$compile_command $qarg"
+ finalize_command="$finalize_command $qarg"
+ continue
+ ;;
+ shrext)
+ shrext_cmds="$arg"
+ prev=
+ continue
+ ;;
+ darwin_framework|darwin_framework_skip)
+ test "$prev" = "darwin_framework" && compiler_flags="$compiler_flags $arg"
+ compile_command="$compile_command $arg"
+ finalize_command="$finalize_command $arg"
+ prev=
+ continue
+ ;;
+ *)
+ eval "$prev=\"\$arg\""
+ prev=
+ continue
+ ;;
+ esac
+ fi # test -n "$prev"
+
+ prevarg="$arg"
+
+ case $arg in
+ -all-static)
+ if test -n "$link_static_flag"; then
+ compile_command="$compile_command $link_static_flag"
+ finalize_command="$finalize_command $link_static_flag"
+ fi
+ continue
+ ;;
+
+ -allow-undefined)
+ # FIXME: remove this flag sometime in the future.
+ $echo "$modename: \`-allow-undefined' is deprecated because it is the default" 1>&2
+ continue
+ ;;
+
+ -avoid-version)
+ avoid_version=yes
+ continue
+ ;;
+
+ -dlopen)
+ prev=dlfiles
+ continue
+ ;;
+
+ -dlpreopen)
+ prev=dlprefiles
+ continue
+ ;;
+
+ -export-dynamic)
+ export_dynamic=yes
+ continue
+ ;;
+
+ -export-symbols | -export-symbols-regex)
+ if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
+ $echo "$modename: more than one -exported-symbols argument is not allowed"
+ exit $EXIT_FAILURE
+ fi
+ if test "X$arg" = "X-export-symbols"; then
+ prev=expsyms
+ else
+ prev=expsyms_regex
+ fi
+ continue
+ ;;
+
+ -framework|-arch|-isysroot)
+ case " $CC " in
+ *" ${arg} ${1} "* | *" ${arg} ${1} "*)
+ prev=darwin_framework_skip ;;
+ *) compiler_flags="$compiler_flags $arg"
+ prev=darwin_framework ;;
+ esac
+ compile_command="$compile_command $arg"
+ finalize_command="$finalize_command $arg"
+ continue
+ ;;
+
+ -inst-prefix-dir)
+ prev=inst_prefix
+ continue
+ ;;
+
+ # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:*
+ # so, if we see these flags be careful not to treat them like -L
+ -L[A-Z][A-Z]*:*)
+ case $with_gcc/$host in
+ no/*-*-irix* | /*-*-irix*)
+ compile_command="$compile_command $arg"
+ finalize_command="$finalize_command $arg"
+ ;;
+ esac
+ continue
+ ;;
+
+ -L*)
+ dir=`$echo "X$arg" | $Xsed -e 's/^-L//'`
+ # We need an absolute path.
+ case $dir in
+ [\\/]* | [A-Za-z]:[\\/]*) ;;
+ *)
+ absdir=`cd "$dir" && pwd`
+ if test -z "$absdir"; then
+ $echo "$modename: cannot determine absolute directory name of \`$dir'" 1>&2
+ absdir="$dir"
+ notinst_path="$notinst_path $dir"
+ fi
+ dir="$absdir"
+ ;;
+ esac
+ case "$deplibs " in
+ *" -L$dir "*) ;;
+ *)
+ deplibs="$deplibs -L$dir"
+ lib_search_path="$lib_search_path $dir"
+ ;;
+ esac
+ case $host in
+ *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)
+ testbindir=`$echo "X$dir" | $Xsed -e 's*/lib$*/bin*'`
+ case :$dllsearchpath: in
+ *":$dir:"*) ;;
+ *) dllsearchpath="$dllsearchpath:$dir";;
+ esac
+ case :$dllsearchpath: in
+ *":$testbindir:"*) ;;
+ *) dllsearchpath="$dllsearchpath:$testbindir";;
+ esac
+ ;;
+ esac
+ continue
+ ;;
+
+ -l*)
+ if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then
+ case $host in
+ *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos*)
+ # These systems don't actually have a C or math library (as such)
+ continue
+ ;;
+ *-*-os2*)
+ # These systems don't actually have a C library (as such)
+ test "X$arg" = "X-lc" && continue
+ ;;
+ *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+ # Do not include libc due to us having libc/libc_r.
+ test "X$arg" = "X-lc" && continue
+ ;;
+ *-*-rhapsody* | *-*-darwin1.[012])
+ # Rhapsody C and math libraries are in the System framework
+ deplibs="$deplibs -framework System"
+ continue
+ ;;
+ *-*-sco3.2v5* | *-*-sco5v6*)
+ # Causes problems with __ctype
+ test "X$arg" = "X-lc" && continue
+ ;;
+ *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
+ # Compiler inserts libc in the correct place for threads to work
+ test "X$arg" = "X-lc" && continue
+ ;;
+ esac
+ elif test "X$arg" = "X-lc_r"; then
+ case $host in
+ *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+ # Do not include libc_r directly, use -pthread flag.
+ continue
+ ;;
+ esac
+ fi
+ deplibs="$deplibs $arg"
+ continue
+ ;;
+
+ # Tru64 UNIX uses -model [arg] to determine the layout of C++
+ # classes, name mangling, and exception handling.
+ -model)
+ compile_command="$compile_command $arg"
+ compiler_flags="$compiler_flags $arg"
+ finalize_command="$finalize_command $arg"
+ prev=xcompiler
+ continue
+ ;;
+
+ -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads)
+ compiler_flags="$compiler_flags $arg"
+ compile_command="$compile_command $arg"
+ finalize_command="$finalize_command $arg"
+ continue
+ ;;
+
+ -multi_module)
+ single_module="${wl}-multi_module"
+ continue
+ ;;
+
+ -module)
+ module=yes
+ continue
+ ;;
+
+ # -64, -mips[0-9] enable 64-bit mode on the SGI compiler
+ # -r[0-9][0-9]* specifies the processor on the SGI compiler
+ # -xarch=*, -xtarget=* enable 64-bit mode on the Sun compiler
+ # +DA*, +DD* enable 64-bit mode on the HP compiler
+ # -q* pass through compiler args for the IBM compiler
+ # -m* pass through architecture-specific compiler args for GCC
+ # -m*, -t[45]*, -txscale* pass through architecture-specific
+ # compiler args for GCC
+ # -p, -pg, --coverage, -fprofile-* pass through profiling flag for GCC
+ # -F/path gives path to uninstalled frameworks, gcc on darwin
+ # @file GCC response files
+ -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \
+ -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*)
+
+ # Unknown arguments in both finalize_command and compile_command need
+ # to be aesthetically quoted because they are evaled later.
+ arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
+ case $arg in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ arg="\"$arg\""
+ ;;
+ esac
+ compile_command="$compile_command $arg"
+ finalize_command="$finalize_command $arg"
+ compiler_flags="$compiler_flags $arg"
+ continue
+ ;;
+
+ -shrext)
+ prev=shrext
+ continue
+ ;;
+
+ -no-fast-install)
+ fast_install=no
+ continue
+ ;;
+
+ -no-install)
+ case $host in
+ *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin*)
+ # The PATH hackery in wrapper scripts is required on Windows
+ # and Darwin in order for the loader to find any dlls it needs.
+ $echo "$modename: warning: \`-no-install' is ignored for $host" 1>&2
+ $echo "$modename: warning: assuming \`-no-fast-install' instead" 1>&2
+ fast_install=no
+ ;;
+ *) no_install=yes ;;
+ esac
+ continue
+ ;;
+
+ -no-undefined)
+ allow_undefined=no
+ continue
+ ;;
+
+ -objectlist)
+ prev=objectlist
+ continue
+ ;;
+
+ -o) prev=output ;;
+
+ -precious-files-regex)
+ prev=precious_regex
+ continue
+ ;;
+
+ -release)
+ prev=release
+ continue
+ ;;
+
+ -rpath)
+ prev=rpath
+ continue
+ ;;
+
+ -R)
+ prev=xrpath
+ continue
+ ;;
+
+ -R*)
+ dir=`$echo "X$arg" | $Xsed -e 's/^-R//'`
+ # We need an absolute path.
+ case $dir in
+ [\\/]* | [A-Za-z]:[\\/]*) ;;
+ *)
+ $echo "$modename: only absolute run-paths are allowed" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ esac
+ case "$xrpath " in
+ *" $dir "*) ;;
+ *) xrpath="$xrpath $dir" ;;
+ esac
+ continue
+ ;;
+
+ -static | -static-libtool-libs)
+ # The effects of -static are defined in a previous loop.
+ # We used to do the same as -all-static on platforms that
+ # didn't have a PIC flag, but the assumption that the effects
+ # would be equivalent was wrong. It would break on at least
+ # Digital Unix and AIX.
+ continue
+ ;;
+
+ -thread-safe)
+ thread_safe=yes
+ continue
+ ;;
+
+ -version-info)
+ prev=vinfo
+ continue
+ ;;
+ -version-number)
+ prev=vinfo
+ vinfo_number=yes
+ continue
+ ;;
+
+ -Wc,*)
+ args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wc,//'`
+ arg=
+ save_ifs="$IFS"; IFS=','
+ for flag in $args; do
+ IFS="$save_ifs"
+ case $flag in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ flag="\"$flag\""
+ ;;
+ esac
+ arg="$arg $wl$flag"
+ compiler_flags="$compiler_flags $flag"
+ done
+ IFS="$save_ifs"
+ arg=`$echo "X$arg" | $Xsed -e "s/^ //"`
+ ;;
+
+ -Wl,*)
+ args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wl,//'`
+ arg=
+ save_ifs="$IFS"; IFS=','
+ for flag in $args; do
+ IFS="$save_ifs"
+ case $flag in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ flag="\"$flag\""
+ ;;
+ esac
+ arg="$arg $wl$flag"
+ compiler_flags="$compiler_flags $wl$flag"
+ linker_flags="$linker_flags $flag"
+ done
+ IFS="$save_ifs"
+ arg=`$echo "X$arg" | $Xsed -e "s/^ //"`
+ ;;
+
+ -Xcompiler)
+ prev=xcompiler
+ continue
+ ;;
+
+ -Xlinker)
+ prev=xlinker
+ continue
+ ;;
+
+ -XCClinker)
+ prev=xcclinker
+ continue
+ ;;
+
+ # Some other compiler flag.
+ -* | +*)
+ # Unknown arguments in both finalize_command and compile_command need
+ # to be aesthetically quoted because they are evaled later.
+ arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
+ case $arg in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ arg="\"$arg\""
+ ;;
+ esac
+ ;;
+
+ *.$objext)
+ # A standard object.
+ objs="$objs $arg"
+ ;;
+
+ *.lo)
+ # A libtool-controlled object.
+
+ # Check to see that this really is a libtool object.
+ if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+ pic_object=
+ non_pic_object=
+
+ # Read the .lo file
+ # If there is no directory component, then add one.
+ case $arg in
+ */* | *\\*) . $arg ;;
+ *) . ./$arg ;;
+ esac
+
+ if test -z "$pic_object" || \
+ test -z "$non_pic_object" ||
+ test "$pic_object" = none && \
+ test "$non_pic_object" = none; then
+ $echo "$modename: cannot find name of object for \`$arg'" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ # Extract subdirectory from the argument.
+ xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'`
+ if test "X$xdir" = "X$arg"; then
+ xdir=
+ else
+ xdir="$xdir/"
+ fi
+
+ if test "$pic_object" != none; then
+ # Prepend the subdirectory the object is found in.
+ pic_object="$xdir$pic_object"
+
+ if test "$prev" = dlfiles; then
+ if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
+ dlfiles="$dlfiles $pic_object"
+ prev=
+ continue
+ else
+ # If libtool objects are unsupported, then we need to preload.
+ prev=dlprefiles
+ fi
+ fi
+
+ # CHECK ME: I think I busted this. -Ossama
+ if test "$prev" = dlprefiles; then
+ # Preload the old-style object.
+ dlprefiles="$dlprefiles $pic_object"
+ prev=
+ fi
+
+ # A PIC object.
+ libobjs="$libobjs $pic_object"
+ arg="$pic_object"
+ fi
+
+ # Non-PIC object.
+ if test "$non_pic_object" != none; then
+ # Prepend the subdirectory the object is found in.
+ non_pic_object="$xdir$non_pic_object"
+
+ # A standard non-PIC object
+ non_pic_objects="$non_pic_objects $non_pic_object"
+ if test -z "$pic_object" || test "$pic_object" = none ; then
+ arg="$non_pic_object"
+ fi
+ else
+ # If the PIC object exists, use it instead.
+ # $xdir was prepended to $pic_object above.
+ non_pic_object="$pic_object"
+ non_pic_objects="$non_pic_objects $non_pic_object"
+ fi
+ else
+ # Only an error if not doing a dry-run.
+ if test -z "$run"; then
+ $echo "$modename: \`$arg' is not a valid libtool object" 1>&2
+ exit $EXIT_FAILURE
+ else
+ # Dry-run case.
+
+ # Extract subdirectory from the argument.
+ xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'`
+ if test "X$xdir" = "X$arg"; then
+ xdir=
+ else
+ xdir="$xdir/"
+ fi
+
+ pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"`
+ non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"`
+ libobjs="$libobjs $pic_object"
+ non_pic_objects="$non_pic_objects $non_pic_object"
+ fi
+ fi
+ ;;
+
+ *.$libext)
+ # An archive.
+ deplibs="$deplibs $arg"
+ old_deplibs="$old_deplibs $arg"
+ continue
+ ;;
+
+ *.la)
+ # A libtool-controlled library.
+
+ if test "$prev" = dlfiles; then
+ # This library was specified with -dlopen.
+ dlfiles="$dlfiles $arg"
+ prev=
+ elif test "$prev" = dlprefiles; then
+ # The library was specified with -dlpreopen.
+ dlprefiles="$dlprefiles $arg"
+ prev=
+ else
+ deplibs="$deplibs $arg"
+ fi
+ continue
+ ;;
+
+ # Some other compiler argument.
+ *)
+ # Unknown arguments in both finalize_command and compile_command need
+ # to be aesthetically quoted because they are evaled later.
+ arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
+ case $arg in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ arg="\"$arg\""
+ ;;
+ esac
+ ;;
+ esac # arg
+
+ # Now actually substitute the argument into the commands.
+ if test -n "$arg"; then
+ compile_command="$compile_command $arg"
+ finalize_command="$finalize_command $arg"
+ fi
+ done # argument parsing loop
+
+ if test -n "$prev"; then
+ $echo "$modename: the \`$prevarg' option requires an argument" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then
+ eval arg=\"$export_dynamic_flag_spec\"
+ compile_command="$compile_command $arg"
+ finalize_command="$finalize_command $arg"
+ fi
+
+ oldlibs=
+ # calculate the name of the file, without its directory
+ outputname=`$echo "X$output" | $Xsed -e 's%^.*/%%'`
+ libobjs_save="$libobjs"
+
+ if test -n "$shlibpath_var"; then
+ # get the directories listed in $shlibpath_var
+ eval shlib_search_path=\`\$echo \"X\${$shlibpath_var}\" \| \$Xsed -e \'s/:/ /g\'\`
+ else
+ shlib_search_path=
+ fi
+ eval sys_lib_search_path=\"$sys_lib_search_path_spec\"
+ eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\"
+
+ output_objdir=`$echo "X$output" | $Xsed -e 's%/[^/]*$%%'`
+ if test "X$output_objdir" = "X$output"; then
+ output_objdir="$objdir"
+ else
+ output_objdir="$output_objdir/$objdir"
+ fi
+ # Create the object directory.
+ if test ! -d "$output_objdir"; then
+ $show "$mkdir $output_objdir"
+ $run $mkdir $output_objdir
+ exit_status=$?
+ if test "$exit_status" -ne 0 && test ! -d "$output_objdir"; then
+ exit $exit_status
+ fi
+ fi
+
+ # Determine the type of output
+ case $output in
+ "")
+ $echo "$modename: you must specify an output file" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ *.$libext) linkmode=oldlib ;;
+ *.lo | *.$objext) linkmode=obj ;;
+ *.la) linkmode=lib ;;
+ *) linkmode=prog ;; # Anything else should be a program.
+ esac
+
+ case $host in
+ *cygwin* | *mingw* | *pw32*)
+ # don't eliminate duplications in $postdeps and $predeps
+ duplicate_compiler_generated_deps=yes
+ ;;
+ *)
+ duplicate_compiler_generated_deps=$duplicate_deps
+ ;;
+ esac
+ specialdeplibs=
+
+ libs=
+ # Find all interdependent deplibs by searching for libraries
+ # that are linked more than once (e.g. -la -lb -la)
+ for deplib in $deplibs; do
+ if test "X$duplicate_deps" = "Xyes" ; then
+ case "$libs " in
+ *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+ esac
+ fi
+ libs="$libs $deplib"
+ done
+
+ if test "$linkmode" = lib; then
+ libs="$predeps $libs $compiler_lib_search_path $postdeps"
+
+ # Compute libraries that are listed more than once in $predeps
+ # $postdeps and mark them as special (i.e., whose duplicates are
+ # not to be eliminated).
+ pre_post_deps=
+ if test "X$duplicate_compiler_generated_deps" = "Xyes" ; then
+ for pre_post_dep in $predeps $postdeps; do
+ case "$pre_post_deps " in
+ *" $pre_post_dep "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;;
+ esac
+ pre_post_deps="$pre_post_deps $pre_post_dep"
+ done
+ fi
+ pre_post_deps=
+ fi
+
+ deplibs=
+ newdependency_libs=
+ newlib_search_path=
+ need_relink=no # whether we're linking any uninstalled libtool libraries
+ notinst_deplibs= # not-installed libtool libraries
+ case $linkmode in
+ lib)
+ passes="conv link"
+ for file in $dlfiles $dlprefiles; do
+ case $file in
+ *.la) ;;
+ *)
+ $echo "$modename: libraries can \`-dlopen' only libtool libraries: $file" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ esac
+ done
+ ;;
+ prog)
+ compile_deplibs=
+ finalize_deplibs=
+ alldeplibs=no
+ newdlfiles=
+ newdlprefiles=
+ passes="conv scan dlopen dlpreopen link"
+ ;;
+ *) passes="conv"
+ ;;
+ esac
+ for pass in $passes; do
+ if test "$linkmode,$pass" = "lib,link" ||
+ test "$linkmode,$pass" = "prog,scan"; then
+ libs="$deplibs"
+ deplibs=
+ fi
+ if test "$linkmode" = prog; then
+ case $pass in
+ dlopen) libs="$dlfiles" ;;
+ dlpreopen) libs="$dlprefiles" ;;
+ link) libs="$deplibs %DEPLIBS% $dependency_libs" ;;
+ esac
+ fi
+ if test "$pass" = dlopen; then
+ # Collect dlpreopened libraries
+ save_deplibs="$deplibs"
+ deplibs=
+ fi
+ for deplib in $libs; do
+ lib=
+ found=no
+ case $deplib in
+ -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads)
+ if test "$linkmode,$pass" = "prog,link"; then
+ compile_deplibs="$deplib $compile_deplibs"
+ finalize_deplibs="$deplib $finalize_deplibs"
+ else
+ compiler_flags="$compiler_flags $deplib"
+ fi
+ continue
+ ;;
+ -l*)
+ if test "$linkmode" != lib && test "$linkmode" != prog; then
+ $echo "$modename: warning: \`-l' is ignored for archives/objects" 1>&2
+ continue
+ fi
+ name=`$echo "X$deplib" | $Xsed -e 's/^-l//'`
+ if test "$linkmode" = lib; then
+ searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path"
+ else
+ searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path"
+ fi
+ for searchdir in $searchdirs; do
+ for search_ext in .la $std_shrext .so .a; do
+ # Search the libtool library
+ lib="$searchdir/lib${name}${search_ext}"
+ if test -f "$lib"; then
+ if test "$search_ext" = ".la"; then
+ found=yes
+ else
+ found=no
+ fi
+ break 2
+ fi
+ done
+ done
+ if test "$found" != yes; then
+ # deplib doesn't seem to be a libtool library
+ if test "$linkmode,$pass" = "prog,link"; then
+ compile_deplibs="$deplib $compile_deplibs"
+ finalize_deplibs="$deplib $finalize_deplibs"
+ else
+ deplibs="$deplib $deplibs"
+ test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
+ fi
+ continue
+ else # deplib is a libtool library
+ # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib,
+ # We need to do some special things here, and not later.
+ if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+ case " $predeps $postdeps " in
+ *" $deplib "*)
+ if (${SED} -e '2q' $lib |
+ grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+ library_names=
+ old_library=
+ case $lib in
+ */* | *\\*) . $lib ;;
+ *) . ./$lib ;;
+ esac
+ for l in $old_library $library_names; do
+ ll="$l"
+ done
+ if test "X$ll" = "X$old_library" ; then # only static version available
+ found=no
+ ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'`
+ test "X$ladir" = "X$lib" && ladir="."
+ lib=$ladir/$old_library
+ if test "$linkmode,$pass" = "prog,link"; then
+ compile_deplibs="$deplib $compile_deplibs"
+ finalize_deplibs="$deplib $finalize_deplibs"
+ else
+ deplibs="$deplib $deplibs"
+ test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
+ fi
+ continue
+ fi
+ fi
+ ;;
+ *) ;;
+ esac
+ fi
+ fi
+ ;; # -l
+ -L*)
+ case $linkmode in
+ lib)
+ deplibs="$deplib $deplibs"
+ test "$pass" = conv && continue
+ newdependency_libs="$deplib $newdependency_libs"
+ newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`
+ ;;
+ prog)
+ if test "$pass" = conv; then
+ deplibs="$deplib $deplibs"
+ continue
+ fi
+ if test "$pass" = scan; then
+ deplibs="$deplib $deplibs"
+ else
+ compile_deplibs="$deplib $compile_deplibs"
+ finalize_deplibs="$deplib $finalize_deplibs"
+ fi
+ newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`
+ ;;
+ *)
+ $echo "$modename: warning: \`-L' is ignored for archives/objects" 1>&2
+ ;;
+ esac # linkmode
+ continue
+ ;; # -L
+ -R*)
+ if test "$pass" = link; then
+ dir=`$echo "X$deplib" | $Xsed -e 's/^-R//'`
+ # Make sure the xrpath contains only unique directories.
+ case "$xrpath " in
+ *" $dir "*) ;;
+ *) xrpath="$xrpath $dir" ;;
+ esac
+ fi
+ deplibs="$deplib $deplibs"
+ continue
+ ;;
+ *.la) lib="$deplib" ;;
+ *.$libext)
+ if test "$pass" = conv; then
+ deplibs="$deplib $deplibs"
+ continue
+ fi
+ case $linkmode in
+ lib)
+ valid_a_lib=no
+ case $deplibs_check_method in
+ match_pattern*)
+ set dummy $deplibs_check_method
+ match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"`
+ if eval $echo \"$deplib\" 2>/dev/null \
+ | $SED 10q \
+ | $EGREP "$match_pattern_regex" > /dev/null; then
+ valid_a_lib=yes
+ fi
+ ;;
+ pass_all)
+ valid_a_lib=yes
+ ;;
+ esac
+ if test "$valid_a_lib" != yes; then
+ $echo
+ $echo "*** Warning: Trying to link with static lib archive $deplib."
+ $echo "*** I have the capability to make that library automatically link in when"
+ $echo "*** you link to this library. But I can only do this if you have a"
+ $echo "*** shared version of the library, which you do not appear to have"
+ $echo "*** because the file extensions .$libext of this argument makes me believe"
+ $echo "*** that it is just a static archive that I should not used here."
+ else
+ $echo
+ $echo "*** Warning: Linking the shared library $output against the"
+ $echo "*** static library $deplib is not portable!"
+ deplibs="$deplib $deplibs"
+ fi
+ continue
+ ;;
+ prog)
+ if test "$pass" != link; then
+ deplibs="$deplib $deplibs"
+ else
+ compile_deplibs="$deplib $compile_deplibs"
+ finalize_deplibs="$deplib $finalize_deplibs"
+ fi
+ continue
+ ;;
+ esac # linkmode
+ ;; # *.$libext
+ *.lo | *.$objext)
+ if test "$pass" = conv; then
+ deplibs="$deplib $deplibs"
+ elif test "$linkmode" = prog; then
+ if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then
+ # If there is no dlopen support or we're linking statically,
+ # we need to preload.
+ newdlprefiles="$newdlprefiles $deplib"
+ compile_deplibs="$deplib $compile_deplibs"
+ finalize_deplibs="$deplib $finalize_deplibs"
+ else
+ newdlfiles="$newdlfiles $deplib"
+ fi
+ fi
+ continue
+ ;;
+ %DEPLIBS%)
+ alldeplibs=yes
+ continue
+ ;;
+ esac # case $deplib
+ if test "$found" = yes || test -f "$lib"; then :
+ else
+ $echo "$modename: cannot find the library \`$lib' or unhandled argument \`$deplib'" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ # Check to see that this really is a libtool archive.
+ if (${SED} -e '2q' $lib | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then :
+ else
+ $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'`
+ test "X$ladir" = "X$lib" && ladir="."
+
+ dlname=
+ dlopen=
+ dlpreopen=
+ libdir=
+ library_names=
+ old_library=
+ # If the library was installed with an old release of libtool,
+ # it will not redefine variables installed, or shouldnotlink
+ installed=yes
+ shouldnotlink=no
+ avoidtemprpath=
+
+
+ # Read the .la file
+ case $lib in
+ */* | *\\*) . $lib ;;
+ *) . ./$lib ;;
+ esac
+
+ if test "$linkmode,$pass" = "lib,link" ||
+ test "$linkmode,$pass" = "prog,scan" ||
+ { test "$linkmode" != prog && test "$linkmode" != lib; }; then
+ test -n "$dlopen" && dlfiles="$dlfiles $dlopen"
+ test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen"
+ fi
+
+ if test "$pass" = conv; then
+ # Only check for convenience libraries
+ deplibs="$lib $deplibs"
+ if test -z "$libdir"; then
+ if test -z "$old_library"; then
+ $echo "$modename: cannot find name of link library for \`$lib'" 1>&2
+ exit $EXIT_FAILURE
+ fi
+ # It is a libtool convenience library, so add in its objects.
+ convenience="$convenience $ladir/$objdir/$old_library"
+ old_convenience="$old_convenience $ladir/$objdir/$old_library"
+ tmp_libs=
+ for deplib in $dependency_libs; do
+ deplibs="$deplib $deplibs"
+ if test "X$duplicate_deps" = "Xyes" ; then
+ case "$tmp_libs " in
+ *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+ esac
+ fi
+ tmp_libs="$tmp_libs $deplib"
+ done
+ elif test "$linkmode" != prog && test "$linkmode" != lib; then
+ $echo "$modename: \`$lib' is not a convenience library" 1>&2
+ exit $EXIT_FAILURE
+ fi
+ continue
+ fi # $pass = conv
+
+
+ # Get the name of the library we link against.
+ linklib=
+ for l in $old_library $library_names; do
+ linklib="$l"
+ done
+ if test -z "$linklib"; then
+ $echo "$modename: cannot find name of link library for \`$lib'" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ # This library was specified with -dlopen.
+ if test "$pass" = dlopen; then
+ if test -z "$libdir"; then
+ $echo "$modename: cannot -dlopen a convenience library: \`$lib'" 1>&2
+ exit $EXIT_FAILURE
+ fi
+ if test -z "$dlname" ||
+ test "$dlopen_support" != yes ||
+ test "$build_libtool_libs" = no; then
+ # If there is no dlname, no dlopen support or we're linking
+ # statically, we need to preload. We also need to preload any
+ # dependent libraries so libltdl's deplib preloader doesn't
+ # bomb out in the load deplibs phase.
+ dlprefiles="$dlprefiles $lib $dependency_libs"
+ else
+ newdlfiles="$newdlfiles $lib"
+ fi
+ continue
+ fi # $pass = dlopen
+
+ # We need an absolute path.
+ case $ladir in
+ [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;;
+ *)
+ abs_ladir=`cd "$ladir" && pwd`
+ if test -z "$abs_ladir"; then
+ $echo "$modename: warning: cannot determine absolute directory name of \`$ladir'" 1>&2
+ $echo "$modename: passing it literally to the linker, although it might fail" 1>&2
+ abs_ladir="$ladir"
+ fi
+ ;;
+ esac
+ laname=`$echo "X$lib" | $Xsed -e 's%^.*/%%'`
+
+ # Find the relevant object directory and library name.
+ if test "X$installed" = Xyes; then
+ if test ! -f "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then
+ $echo "$modename: warning: library \`$lib' was moved." 1>&2
+ dir="$ladir"
+ absdir="$abs_ladir"
+ libdir="$abs_ladir"
+ else
+ dir="$libdir"
+ absdir="$libdir"
+ fi
+ test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes
+ else
+ if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then
+ dir="$ladir"
+ absdir="$abs_ladir"
+ # Remove this search path later
+ notinst_path="$notinst_path $abs_ladir"
+ else
+ dir="$ladir/$objdir"
+ absdir="$abs_ladir/$objdir"
+ # Remove this search path later
+ notinst_path="$notinst_path $abs_ladir"
+ fi
+ fi # $installed = yes
+ name=`$echo "X$laname" | $Xsed -e 's/\.la$//' -e 's/^lib//'`
+
+ # This library was specified with -dlpreopen.
+ if test "$pass" = dlpreopen; then
+ if test -z "$libdir"; then
+ $echo "$modename: cannot -dlpreopen a convenience library: \`$lib'" 1>&2
+ exit $EXIT_FAILURE
+ fi
+ # Prefer using a static library (so that no silly _DYNAMIC symbols
+ # are required to link).
+ if test -n "$old_library"; then
+ newdlprefiles="$newdlprefiles $dir/$old_library"
+ # Otherwise, use the dlname, so that lt_dlopen finds it.
+ elif test -n "$dlname"; then
+ newdlprefiles="$newdlprefiles $dir/$dlname"
+ else
+ newdlprefiles="$newdlprefiles $dir/$linklib"
+ fi
+ fi # $pass = dlpreopen
+
+ if test -z "$libdir"; then
+ # Link the convenience library
+ if test "$linkmode" = lib; then
+ deplibs="$dir/$old_library $deplibs"
+ elif test "$linkmode,$pass" = "prog,link"; then
+ compile_deplibs="$dir/$old_library $compile_deplibs"
+ finalize_deplibs="$dir/$old_library $finalize_deplibs"
+ else
+ deplibs="$lib $deplibs" # used for prog,scan pass
+ fi
+ continue
+ fi
+
+
+ if test "$linkmode" = prog && test "$pass" != link; then
+ newlib_search_path="$newlib_search_path $ladir"
+ deplibs="$lib $deplibs"
+
+ linkalldeplibs=no
+ if test "$link_all_deplibs" != no || test -z "$library_names" ||
+ test "$build_libtool_libs" = no; then
+ linkalldeplibs=yes
+ fi
+
+ tmp_libs=
+ for deplib in $dependency_libs; do
+ case $deplib in
+ -L*) newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`;; ### testsuite: skip nested quoting test
+ esac
+ # Need to link against all dependency_libs?
+ if test "$linkalldeplibs" = yes; then
+ deplibs="$deplib $deplibs"
+ else
+ # Need to hardcode shared library paths
+ # or/and link against static libraries
+ newdependency_libs="$deplib $newdependency_libs"
+ fi
+ if test "X$duplicate_deps" = "Xyes" ; then
+ case "$tmp_libs " in
+ *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+ esac
+ fi
+ tmp_libs="$tmp_libs $deplib"
+ done # for deplib
+ continue
+ fi # $linkmode = prog...
+
+ if test "$linkmode,$pass" = "prog,link"; then
+ if test -n "$library_names" &&
+ { { test "$prefer_static_libs" = no ||
+ test "$prefer_static_libs,$installed" = "built,yes"; } ||
+ test -z "$old_library"; }; then
+ # We need to hardcode the library path
+ if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then
+ # Make sure the rpath contains only unique directories.
+ case "$temp_rpath " in
+ *" $dir "*) ;;
+ *" $absdir "*) ;;
+ *) temp_rpath="$temp_rpath $absdir" ;;
+ esac
+ fi
+
+ # Hardcode the library path.
+ # Skip directories that are in the system default run-time
+ # search path.
+ case " $sys_lib_dlsearch_path " in
+ *" $absdir "*) ;;
+ *)
+ case "$compile_rpath " in
+ *" $absdir "*) ;;
+ *) compile_rpath="$compile_rpath $absdir"
+ esac
+ ;;
+ esac
+ case " $sys_lib_dlsearch_path " in
+ *" $libdir "*) ;;
+ *)
+ case "$finalize_rpath " in
+ *" $libdir "*) ;;
+ *) finalize_rpath="$finalize_rpath $libdir"
+ esac
+ ;;
+ esac
+ fi # $linkmode,$pass = prog,link...
+
+ if test "$alldeplibs" = yes &&
+ { test "$deplibs_check_method" = pass_all ||
+ { test "$build_libtool_libs" = yes &&
+ test -n "$library_names"; }; }; then
+ # We only need to search for static libraries
+ continue
+ fi
+ fi
+
+ link_static=no # Whether the deplib will be linked statically
+ use_static_libs=$prefer_static_libs
+ if test "$use_static_libs" = built && test "$installed" = yes ; then
+ use_static_libs=no
+ fi
+ if test -n "$library_names" &&
+ { test "$use_static_libs" = no || test -z "$old_library"; }; then
+ if test "$installed" = no; then
+ notinst_deplibs="$notinst_deplibs $lib"
+ need_relink=yes
+ fi
+ # This is a shared library
+
+ # Warn about portability, can't link against -module's on
+ # some systems (darwin)
+ if test "$shouldnotlink" = yes && test "$pass" = link ; then
+ $echo
+ if test "$linkmode" = prog; then
+ $echo "*** Warning: Linking the executable $output against the loadable module"
+ else
+ $echo "*** Warning: Linking the shared library $output against the loadable module"
+ fi
+ $echo "*** $linklib is not portable!"
+ fi
+ if test "$linkmode" = lib &&
+ test "$hardcode_into_libs" = yes; then
+ # Hardcode the library path.
+ # Skip directories that are in the system default run-time
+ # search path.
+ case " $sys_lib_dlsearch_path " in
+ *" $absdir "*) ;;
+ *)
+ case "$compile_rpath " in
+ *" $absdir "*) ;;
+ *) compile_rpath="$compile_rpath $absdir"
+ esac
+ ;;
+ esac
+ case " $sys_lib_dlsearch_path " in
+ *" $libdir "*) ;;
+ *)
+ case "$finalize_rpath " in
+ *" $libdir "*) ;;
+ *) finalize_rpath="$finalize_rpath $libdir"
+ esac
+ ;;
+ esac
+ fi
+
+ if test -n "$old_archive_from_expsyms_cmds"; then
+ # figure out the soname
+ set dummy $library_names
+ realname="$2"
+ shift; shift
+ libname=`eval \\$echo \"$libname_spec\"`
+ # use dlname if we got it. it's perfectly good, no?
+ if test -n "$dlname"; then
+ soname="$dlname"
+ elif test -n "$soname_spec"; then
+ # bleh windows
+ case $host in
+ *cygwin* | mingw*)
+ major=`expr $current - $age`
+ versuffix="-$major"
+ ;;
+ esac
+ eval soname=\"$soname_spec\"
+ else
+ soname="$realname"
+ fi
+
+ # Make a new name for the extract_expsyms_cmds to use
+ soroot="$soname"
+ soname=`$echo $soroot | ${SED} -e 's/^.*\///'`
+ newlib="libimp-`$echo $soname | ${SED} 's/^lib//;s/\.dll$//'`.a"
+
+ # If the library has no export list, then create one now
+ if test -f "$output_objdir/$soname-def"; then :
+ else
+ $show "extracting exported symbol list from \`$soname'"
+ save_ifs="$IFS"; IFS='~'
+ cmds=$extract_expsyms_cmds
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ eval cmd=\"$cmd\"
+ $show "$cmd"
+ $run eval "$cmd" || exit $?
+ done
+ IFS="$save_ifs"
+ fi
+
+ # Create $newlib
+ if test -f "$output_objdir/$newlib"; then :; else
+ $show "generating import library for \`$soname'"
+ save_ifs="$IFS"; IFS='~'
+ cmds=$old_archive_from_expsyms_cmds
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ eval cmd=\"$cmd\"
+ $show "$cmd"
+ $run eval "$cmd" || exit $?
+ done
+ IFS="$save_ifs"
+ fi
+ # make sure the library variables are pointing to the new library
+ dir=$output_objdir
+ linklib=$newlib
+ fi # test -n "$old_archive_from_expsyms_cmds"
+
+ if test "$linkmode" = prog || test "$mode" != relink; then
+ add_shlibpath=
+ add_dir=
+ add=
+ lib_linked=yes
+ case $hardcode_action in
+ immediate | unsupported)
+ if test "$hardcode_direct" = no; then
+ add="$dir/$linklib"
+ case $host in
+ *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;;
+ *-*-sysv4*uw2*) add_dir="-L$dir" ;;
+ *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \
+ *-*-unixware7*) add_dir="-L$dir" ;;
+ *-*-darwin* )
+ # if the lib is a module then we can not link against
+ # it, someone is ignoring the new warnings I added
+ if /usr/bin/file -L $add 2> /dev/null |
+ $EGREP ": [^:]* bundle" >/dev/null ; then
+ $echo "** Warning, lib $linklib is a module, not a shared library"
+ if test -z "$old_library" ; then
+ $echo
+ $echo "** And there doesn't seem to be a static archive available"
+ $echo "** The link will probably fail, sorry"
+ else
+ add="$dir/$old_library"
+ fi
+ fi
+ esac
+ elif test "$hardcode_minus_L" = no; then
+ case $host in
+ *-*-sunos*) add_shlibpath="$dir" ;;
+ esac
+ add_dir="-L$dir"
+ add="-l$name"
+ elif test "$hardcode_shlibpath_var" = no; then
+ add_shlibpath="$dir"
+ add="-l$name"
+ else
+ lib_linked=no
+ fi
+ ;;
+ relink)
+ if test "$hardcode_direct" = yes; then
+ add="$dir/$linklib"
+ elif test "$hardcode_minus_L" = yes; then
+ add_dir="-L$dir"
+ # Try looking first in the location we're being installed to.
+ if test -n "$inst_prefix_dir"; then
+ case $libdir in
+ [\\/]*)
+ add_dir="$add_dir -L$inst_prefix_dir$libdir"
+ ;;
+ esac
+ fi
+ add="-l$name"
+ elif test "$hardcode_shlibpath_var" = yes; then
+ add_shlibpath="$dir"
+ add="-l$name"
+ else
+ lib_linked=no
+ fi
+ ;;
+ *) lib_linked=no ;;
+ esac
+
+ if test "$lib_linked" != yes; then
+ $echo "$modename: configuration error: unsupported hardcode properties"
+ exit $EXIT_FAILURE
+ fi
+
+ if test -n "$add_shlibpath"; then
+ case :$compile_shlibpath: in
+ *":$add_shlibpath:"*) ;;
+ *) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;;
+ esac
+ fi
+ if test "$linkmode" = prog; then
+ test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs"
+ test -n "$add" && compile_deplibs="$add $compile_deplibs"
+ else
+ test -n "$add_dir" && deplibs="$add_dir $deplibs"
+ test -n "$add" && deplibs="$add $deplibs"
+ if test "$hardcode_direct" != yes && \
+ test "$hardcode_minus_L" != yes && \
+ test "$hardcode_shlibpath_var" = yes; then
+ case :$finalize_shlibpath: in
+ *":$libdir:"*) ;;
+ *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;;
+ esac
+ fi
+ fi
+ fi
+
+ if test "$linkmode" = prog || test "$mode" = relink; then
+ add_shlibpath=
+ add_dir=
+ add=
+ # Finalize command for both is simple: just hardcode it.
+ if test "$hardcode_direct" = yes; then
+ add="$libdir/$linklib"
+ elif test "$hardcode_minus_L" = yes; then
+ add_dir="-L$libdir"
+ add="-l$name"
+ elif test "$hardcode_shlibpath_var" = yes; then
+ case :$finalize_shlibpath: in
+ *":$libdir:"*) ;;
+ *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;;
+ esac
+ add="-l$name"
+ elif test "$hardcode_automatic" = yes; then
+ if test -n "$inst_prefix_dir" &&
+ test -f "$inst_prefix_dir$libdir/$linklib" ; then
+ add="$inst_prefix_dir$libdir/$linklib"
+ else
+ add="$libdir/$linklib"
+ fi
+ else
+ # We cannot seem to hardcode it, guess we'll fake it.
+ add_dir="-L$libdir"
+ # Try looking first in the location we're being installed to.
+ if test -n "$inst_prefix_dir"; then
+ case $libdir in
+ [\\/]*)
+ add_dir="$add_dir -L$inst_prefix_dir$libdir"
+ ;;
+ esac
+ fi
+ add="-l$name"
+ fi
+
+ if test "$linkmode" = prog; then
+ test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs"
+ test -n "$add" && finalize_deplibs="$add $finalize_deplibs"
+ else
+ test -n "$add_dir" && deplibs="$add_dir $deplibs"
+ test -n "$add" && deplibs="$add $deplibs"
+ fi
+ fi
+ elif test "$linkmode" = prog; then
+ # Here we assume that one of hardcode_direct or hardcode_minus_L
+ # is not unsupported. This is valid on all known static and
+ # shared platforms.
+ if test "$hardcode_direct" != unsupported; then
+ test -n "$old_library" && linklib="$old_library"
+ compile_deplibs="$dir/$linklib $compile_deplibs"
+ finalize_deplibs="$dir/$linklib $finalize_deplibs"
+ else
+ compile_deplibs="-l$name -L$dir $compile_deplibs"
+ finalize_deplibs="-l$name -L$dir $finalize_deplibs"
+ fi
+ elif test "$build_libtool_libs" = yes; then
+ # Not a shared library
+ if test "$deplibs_check_method" != pass_all; then
+ # We're trying link a shared library against a static one
+ # but the system doesn't support it.
+
+ # Just print a warning and add the library to dependency_libs so
+ # that the program can be linked against the static library.
+ $echo
+ $echo "*** Warning: This system can not link to static lib archive $lib."
+ $echo "*** I have the capability to make that library automatically link in when"
+ $echo "*** you link to this library. But I can only do this if you have a"
+ $echo "*** shared version of the library, which you do not appear to have."
+ if test "$module" = yes; then
+ $echo "*** But as you try to build a module library, libtool will still create "
+ $echo "*** a static module, that should work as long as the dlopening application"
+ $echo "*** is linked with the -dlopen flag to resolve symbols at runtime."
+ if test -z "$global_symbol_pipe"; then
+ $echo
+ $echo "*** However, this would only work if libtool was able to extract symbol"
+ $echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
+ $echo "*** not find such a program. So, this module is probably useless."
+ $echo "*** \`nm' from GNU binutils and a full rebuild may help."
+ fi
+ if test "$build_old_libs" = no; then
+ build_libtool_libs=module
+ build_old_libs=yes
+ else
+ build_libtool_libs=no
+ fi
+ fi
+ else
+ deplibs="$dir/$old_library $deplibs"
+ link_static=yes
+ fi
+ fi # link shared/static library?
+
+ if test "$linkmode" = lib; then
+ if test -n "$dependency_libs" &&
+ { test "$hardcode_into_libs" != yes ||
+ test "$build_old_libs" = yes ||
+ test "$link_static" = yes; }; then
+ # Extract -R from dependency_libs
+ temp_deplibs=
+ for libdir in $dependency_libs; do
+ case $libdir in
+ -R*) temp_xrpath=`$echo "X$libdir" | $Xsed -e 's/^-R//'`
+ case " $xrpath " in
+ *" $temp_xrpath "*) ;;
+ *) xrpath="$xrpath $temp_xrpath";;
+ esac;;
+ *) temp_deplibs="$temp_deplibs $libdir";;
+ esac
+ done
+ dependency_libs="$temp_deplibs"
+ fi
+
+ newlib_search_path="$newlib_search_path $absdir"
+ # Link against this library
+ test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs"
+ # ... and its dependency_libs
+ tmp_libs=
+ for deplib in $dependency_libs; do
+ newdependency_libs="$deplib $newdependency_libs"
+ if test "X$duplicate_deps" = "Xyes" ; then
+ case "$tmp_libs " in
+ *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+ esac
+ fi
+ tmp_libs="$tmp_libs $deplib"
+ done
+
+ if test "$link_all_deplibs" != no; then
+ # Add the search paths of all dependency libraries
+ for deplib in $dependency_libs; do
+ case $deplib in
+ -L*) path="$deplib" ;;
+ *.la)
+ dir=`$echo "X$deplib" | $Xsed -e 's%/[^/]*$%%'`
+ test "X$dir" = "X$deplib" && dir="."
+ # We need an absolute path.
+ case $dir in
+ [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;;
+ *)
+ absdir=`cd "$dir" && pwd`
+ if test -z "$absdir"; then
+ $echo "$modename: warning: cannot determine absolute directory name of \`$dir'" 1>&2
+ absdir="$dir"
+ fi
+ ;;
+ esac
+ if grep "^installed=no" $deplib > /dev/null; then
+ path="$absdir/$objdir"
+ else
+ eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
+ if test -z "$libdir"; then
+ $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2
+ exit $EXIT_FAILURE
+ fi
+ if test "$absdir" != "$libdir"; then
+ $echo "$modename: warning: \`$deplib' seems to be moved" 1>&2
+ fi
+ path="$absdir"
+ fi
+ depdepl=
+ case $host in
+ *-*-darwin*)
+ # we do not want to link against static libs,
+ # but need to link against shared
+ eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib`
+ eval deplibdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
+ if test -n "$deplibrary_names" ; then
+ for tmp in $deplibrary_names ; do
+ depdepl=$tmp
+ done
+ if test -f "$deplibdir/$depdepl" ; then
+ depdepl="$deplibdir/$depdepl"
+ elif test -f "$path/$depdepl" ; then
+ depdepl="$path/$depdepl"
+ else
+ # Can't find it, oh well...
+ depdepl=
+ fi
+ # do not add paths which are already there
+ case " $newlib_search_path " in
+ *" $path "*) ;;
+ *) newlib_search_path="$newlib_search_path $path";;
+ esac
+ fi
+ path=""
+ ;;
+ *)
+ path="-L$path"
+ ;;
+ esac
+ ;;
+ -l*)
+ case $host in
+ *-*-darwin*)
+ # Again, we only want to link against shared libraries
+ eval tmp_libs=`$echo "X$deplib" | $Xsed -e "s,^\-l,,"`
+ for tmp in $newlib_search_path ; do
+ if test -f "$tmp/lib$tmp_libs.dylib" ; then
+ eval depdepl="$tmp/lib$tmp_libs.dylib"
+ break
+ fi
+ done
+ path=""
+ ;;
+ *) continue ;;
+ esac
+ ;;
+ *) continue ;;
+ esac
+ case " $deplibs " in
+ *" $path "*) ;;
+ *) deplibs="$path $deplibs" ;;
+ esac
+ case " $deplibs " in
+ *" $depdepl "*) ;;
+ *) deplibs="$depdepl $deplibs" ;;
+ esac
+ done
+ fi # link_all_deplibs != no
+ fi # linkmode = lib
+ done # for deplib in $libs
+ dependency_libs="$newdependency_libs"
+ if test "$pass" = dlpreopen; then
+ # Link the dlpreopened libraries before other libraries
+ for deplib in $save_deplibs; do
+ deplibs="$deplib $deplibs"
+ done
+ fi
+ if test "$pass" != dlopen; then
+ if test "$pass" != conv; then
+ # Make sure lib_search_path contains only unique directories.
+ lib_search_path=
+ for dir in $newlib_search_path; do
+ case "$lib_search_path " in
+ *" $dir "*) ;;
+ *) lib_search_path="$lib_search_path $dir" ;;
+ esac
+ done
+ newlib_search_path=
+ fi
+
+ if test "$linkmode,$pass" != "prog,link"; then
+ vars="deplibs"
+ else
+ vars="compile_deplibs finalize_deplibs"
+ fi
+ for var in $vars dependency_libs; do
+ # Add libraries to $var in reverse order
+ eval tmp_libs=\"\$$var\"
+ new_libs=
+ for deplib in $tmp_libs; do
+ # FIXME: Pedantically, this is the right thing to do, so
+ # that some nasty dependency loop isn't accidentally
+ # broken:
+ #new_libs="$deplib $new_libs"
+ # Pragmatically, this seems to cause very few problems in
+ # practice:
+ case $deplib in
+ -L*) new_libs="$deplib $new_libs" ;;
+ -R*) ;;
+ *)
+ # And here is the reason: when a library appears more
+ # than once as an explicit dependence of a library, or
+ # is implicitly linked in more than once by the
+ # compiler, it is considered special, and multiple
+ # occurrences thereof are not removed. Compare this
+ # with having the same library being listed as a
+ # dependency of multiple other libraries: in this case,
+ # we know (pedantically, we assume) the library does not
+ # need to be listed more than once, so we keep only the
+ # last copy. This is not always right, but it is rare
+ # enough that we require users that really mean to play
+ # such unportable linking tricks to link the library
+ # using -Wl,-lname, so that libtool does not consider it
+ # for duplicate removal.
+ case " $specialdeplibs " in
+ *" $deplib "*) new_libs="$deplib $new_libs" ;;
+ *)
+ case " $new_libs " in
+ *" $deplib "*) ;;
+ *) new_libs="$deplib $new_libs" ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ done
+ tmp_libs=
+ for deplib in $new_libs; do
+ case $deplib in
+ -L*)
+ case " $tmp_libs " in
+ *" $deplib "*) ;;
+ *) tmp_libs="$tmp_libs $deplib" ;;
+ esac
+ ;;
+ *) tmp_libs="$tmp_libs $deplib" ;;
+ esac
+ done
+ eval $var=\"$tmp_libs\"
+ done # for var
+ fi
+ # Last step: remove runtime libs from dependency_libs
+ # (they stay in deplibs)
+ tmp_libs=
+ for i in $dependency_libs ; do
+ case " $predeps $postdeps $compiler_lib_search_path " in
+ *" $i "*)
+ i=""
+ ;;
+ esac
+ if test -n "$i" ; then
+ tmp_libs="$tmp_libs $i"
+ fi
+ done
+ dependency_libs=$tmp_libs
+ done # for pass
+ if test "$linkmode" = prog; then
+ dlfiles="$newdlfiles"
+ dlprefiles="$newdlprefiles"
+ fi
+
+ case $linkmode in
+ oldlib)
+ case " $deplibs" in
+ *\ -l* | *\ -L*)
+ $echo "$modename: warning: \`-l' and \`-L' are ignored for archives" 1>&2 ;;
+ esac
+
+ if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+ $echo "$modename: warning: \`-dlopen' is ignored for archives" 1>&2
+ fi
+
+ if test -n "$rpath"; then
+ $echo "$modename: warning: \`-rpath' is ignored for archives" 1>&2
+ fi
+
+ if test -n "$xrpath"; then
+ $echo "$modename: warning: \`-R' is ignored for archives" 1>&2
+ fi
+
+ if test -n "$vinfo"; then
+ $echo "$modename: warning: \`-version-info/-version-number' is ignored for archives" 1>&2
+ fi
+
+ if test -n "$release"; then
+ $echo "$modename: warning: \`-release' is ignored for archives" 1>&2
+ fi
+
+ if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
+ $echo "$modename: warning: \`-export-symbols' is ignored for archives" 1>&2
+ fi
+
+ # Now set the variables for building old libraries.
+ build_libtool_libs=no
+ oldlibs="$output"
+ objs="$objs$old_deplibs"
+ ;;
+
+ lib)
+ # Make sure we only generate libraries of the form `libNAME.la'.
+ case $outputname in
+ lib*)
+ name=`$echo "X$outputname" | $Xsed -e 's/\.la$//' -e 's/^lib//'`
+ eval shared_ext=\"$shrext_cmds\"
+ eval libname=\"$libname_spec\"
+ ;;
+ *)
+ if test "$module" = no; then
+ $echo "$modename: libtool library \`$output' must begin with \`lib'" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+ if test "$need_lib_prefix" != no; then
+ # Add the "lib" prefix for modules if required
+ name=`$echo "X$outputname" | $Xsed -e 's/\.la$//'`
+ eval shared_ext=\"$shrext_cmds\"
+ eval libname=\"$libname_spec\"
+ else
+ libname=`$echo "X$outputname" | $Xsed -e 's/\.la$//'`
+ fi
+ ;;
+ esac
+
+ if test -n "$objs"; then
+ if test "$deplibs_check_method" != pass_all; then
+ $echo "$modename: cannot build libtool library \`$output' from non-libtool objects on this host:$objs" 2>&1
+ exit $EXIT_FAILURE
+ else
+ $echo
+ $echo "*** Warning: Linking the shared library $output against the non-libtool"
+ $echo "*** objects $objs is not portable!"
+ libobjs="$libobjs $objs"
+ fi
+ fi
+
+ if test "$dlself" != no; then
+ $echo "$modename: warning: \`-dlopen self' is ignored for libtool libraries" 1>&2
+ fi
+
+ set dummy $rpath
+ if test "$#" -gt 2; then
+ $echo "$modename: warning: ignoring multiple \`-rpath's for a libtool library" 1>&2
+ fi
+ install_libdir="$2"
+
+ oldlibs=
+ if test -z "$rpath"; then
+ if test "$build_libtool_libs" = yes; then
+ # Building a libtool convenience library.
+ # Some compilers have problems with a `.al' extension so
+ # convenience libraries should have the same extension an
+ # archive normally would.
+ oldlibs="$output_objdir/$libname.$libext $oldlibs"
+ build_libtool_libs=convenience
+ build_old_libs=yes
+ fi
+
+ if test -n "$vinfo"; then
+ $echo "$modename: warning: \`-version-info/-version-number' is ignored for convenience libraries" 1>&2
+ fi
+
+ if test -n "$release"; then
+ $echo "$modename: warning: \`-release' is ignored for convenience libraries" 1>&2
+ fi
+ else
+
+ # Parse the version information argument.
+ save_ifs="$IFS"; IFS=':'
+ set dummy $vinfo 0 0 0
+ IFS="$save_ifs"
+
+ if test -n "$8"; then
+ $echo "$modename: too many parameters to \`-version-info'" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ # convert absolute version numbers to libtool ages
+ # this retains compatibility with .la files and attempts
+ # to make the code below a bit more comprehensible
+
+ case $vinfo_number in
+ yes)
+ number_major="$2"
+ number_minor="$3"
+ number_revision="$4"
+ #
+ # There are really only two kinds -- those that
+ # use the current revision as the major version
+ # and those that subtract age and use age as
+ # a minor version. But, then there is irix
+ # which has an extra 1 added just for fun
+ #
+ case $version_type in
+ darwin|linux|osf|windows|none)
+ current=`expr $number_major + $number_minor`
+ age="$number_minor"
+ revision="$number_revision"
+ ;;
+ freebsd-aout|freebsd-elf|sunos)
+ current="$number_major"
+ revision="$number_minor"
+ age="0"
+ ;;
+ irix|nonstopux)
+ current=`expr $number_major + $number_minor`
+ age="$number_minor"
+ revision="$number_minor"
+ lt_irix_increment=no
+ ;;
+ esac
+ ;;
+ no)
+ current="$2"
+ revision="$3"
+ age="$4"
+ ;;
+ esac
+
+ # Check that each of the things are valid numbers.
+ case $current in
+ 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
+ *)
+ $echo "$modename: CURRENT \`$current' must be a nonnegative integer" 1>&2
+ $echo "$modename: \`$vinfo' is not valid version information" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ esac
+
+ case $revision in
+ 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
+ *)
+ $echo "$modename: REVISION \`$revision' must be a nonnegative integer" 1>&2
+ $echo "$modename: \`$vinfo' is not valid version information" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ esac
+
+ case $age in
+ 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
+ *)
+ $echo "$modename: AGE \`$age' must be a nonnegative integer" 1>&2
+ $echo "$modename: \`$vinfo' is not valid version information" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ esac
+
+ if test "$age" -gt "$current"; then
+ $echo "$modename: AGE \`$age' is greater than the current interface number \`$current'" 1>&2
+ $echo "$modename: \`$vinfo' is not valid version information" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ # Calculate the version variables.
+ major=
+ versuffix=
+ verstring=
+ case $version_type in
+ none) ;;
+
+ darwin)
+ # Like Linux, but with the current version available in
+ # verstring for coding it into the library header
+ major=.`expr $current - $age`
+ versuffix="$major.$age.$revision"
+ # Darwin ld doesn't like 0 for these options...
+ minor_current=`expr $current + 1`
+ xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision"
+ verstring="-compatibility_version $minor_current -current_version $minor_current.$revision"
+ ;;
+
+ freebsd-aout)
+ major=".$current"
+ versuffix=".$current.$revision";
+ ;;
+
+ freebsd-elf)
+ major=".$current"
+ versuffix=".$current";
+ ;;
+
+ irix | nonstopux)
+ if test "X$lt_irix_increment" = "Xno"; then
+ major=`expr $current - $age`
+ else
+ major=`expr $current - $age + 1`
+ fi
+ case $version_type in
+ nonstopux) verstring_prefix=nonstopux ;;
+ *) verstring_prefix=sgi ;;
+ esac
+ verstring="$verstring_prefix$major.$revision"
+
+ # Add in all the interfaces that we are compatible with.
+ loop=$revision
+ while test "$loop" -ne 0; do
+ iface=`expr $revision - $loop`
+ loop=`expr $loop - 1`
+ verstring="$verstring_prefix$major.$iface:$verstring"
+ done
+
+ # Before this point, $major must not contain `.'.
+ major=.$major
+ versuffix="$major.$revision"
+ ;;
+
+ linux)
+ major=.`expr $current - $age`
+ versuffix="$major.$age.$revision"
+ ;;
+
+ osf)
+ major=.`expr $current - $age`
+ versuffix=".$current.$age.$revision"
+ verstring="$current.$age.$revision"
+
+ # Add in all the interfaces that we are compatible with.
+ loop=$age
+ while test "$loop" -ne 0; do
+ iface=`expr $current - $loop`
+ loop=`expr $loop - 1`
+ verstring="$verstring:${iface}.0"
+ done
+
+ # Make executables depend on our current version.
+ verstring="$verstring:${current}.0"
+ ;;
+
+ sunos)
+ major=".$current"
+ versuffix=".$current.$revision"
+ ;;
+
+ windows)
+ # Use '-' rather than '.', since we only want one
+ # extension on DOS 8.3 filesystems.
+ major=`expr $current - $age`
+ versuffix="-$major"
+ ;;
+
+ *)
+ $echo "$modename: unknown library version type \`$version_type'" 1>&2
+ $echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ esac
+
+ # Clear the version info if we defaulted, and they specified a release.
+ if test -z "$vinfo" && test -n "$release"; then
+ major=
+ case $version_type in
+ darwin)
+ # we can't check for "0.0" in archive_cmds due to quoting
+ # problems, so we reset it completely
+ verstring=
+ ;;
+ *)
+ verstring="0.0"
+ ;;
+ esac
+ if test "$need_version" = no; then
+ versuffix=
+ else
+ versuffix=".0.0"
+ fi
+ fi
+
+ # Remove version info from name if versioning should be avoided
+ if test "$avoid_version" = yes && test "$need_version" = no; then
+ major=
+ versuffix=
+ verstring=""
+ fi
+
+ # Check to see if the archive will have undefined symbols.
+ if test "$allow_undefined" = yes; then
+ if test "$allow_undefined_flag" = unsupported; then
+ $echo "$modename: warning: undefined symbols not allowed in $host shared libraries" 1>&2
+ build_libtool_libs=no
+ build_old_libs=yes
+ fi
+ else
+ # Don't allow undefined symbols.
+ allow_undefined_flag="$no_undefined_flag"
+ fi
+ fi
+
+ if test "$mode" != relink; then
+ # Remove our outputs, but don't remove object files since they
+ # may have been created when compiling PIC objects.
+ removelist=
+ tempremovelist=`$echo "$output_objdir/*"`
+ for p in $tempremovelist; do
+ case $p in
+ *.$objext)
+ ;;
+ $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*)
+ if test "X$precious_files_regex" != "X"; then
+ if echo $p | $EGREP -e "$precious_files_regex" >/dev/null 2>&1
+ then
+ continue
+ fi
+ fi
+ removelist="$removelist $p"
+ ;;
+ *) ;;
+ esac
+ done
+ if test -n "$removelist"; then
+ $show "${rm}r $removelist"
+ $run ${rm}r $removelist
+ fi
+ fi
+
+ # Now set the variables for building old libraries.
+ if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then
+ oldlibs="$oldlibs $output_objdir/$libname.$libext"
+
+ # Transform .lo files to .o files.
+ oldobjs="$objs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP`
+ fi
+
+ # Eliminate all temporary directories.
+ #for path in $notinst_path; do
+ # lib_search_path=`$echo "$lib_search_path " | ${SED} -e "s% $path % %g"`
+ # deplibs=`$echo "$deplibs " | ${SED} -e "s% -L$path % %g"`
+ # dependency_libs=`$echo "$dependency_libs " | ${SED} -e "s% -L$path % %g"`
+ #done
+
+ if test -n "$xrpath"; then
+ # If the user specified any rpath flags, then add them.
+ temp_xrpath=
+ for libdir in $xrpath; do
+ temp_xrpath="$temp_xrpath -R$libdir"
+ case "$finalize_rpath " in
+ *" $libdir "*) ;;
+ *) finalize_rpath="$finalize_rpath $libdir" ;;
+ esac
+ done
+ if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then
+ dependency_libs="$temp_xrpath $dependency_libs"
+ fi
+ fi
+
+ # Make sure dlfiles contains only unique files that won't be dlpreopened
+ old_dlfiles="$dlfiles"
+ dlfiles=
+ for lib in $old_dlfiles; do
+ case " $dlprefiles $dlfiles " in
+ *" $lib "*) ;;
+ *) dlfiles="$dlfiles $lib" ;;
+ esac
+ done
+
+ # Make sure dlprefiles contains only unique files
+ old_dlprefiles="$dlprefiles"
+ dlprefiles=
+ for lib in $old_dlprefiles; do
+ case "$dlprefiles " in
+ *" $lib "*) ;;
+ *) dlprefiles="$dlprefiles $lib" ;;
+ esac
+ done
+
+ if test "$build_libtool_libs" = yes; then
+ if test -n "$rpath"; then
+ case $host in
+ *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos*)
+ # these systems don't actually have a c library (as such)!
+ ;;
+ *-*-rhapsody* | *-*-darwin1.[012])
+ # Rhapsody C library is in the System framework
+ deplibs="$deplibs -framework System"
+ ;;
+ *-*-netbsd*)
+ # Don't link with libc until the a.out ld.so is fixed.
+ ;;
+ *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+ # Do not include libc due to us having libc/libc_r.
+ ;;
+ *-*-sco3.2v5* | *-*-sco5v6*)
+ # Causes problems with __ctype
+ ;;
+ *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
+ # Compiler inserts libc in the correct place for threads to work
+ ;;
+ *)
+ # Add libc to deplibs on all other systems if necessary.
+ if test "$build_libtool_need_lc" = "yes"; then
+ deplibs="$deplibs -lc"
+ fi
+ ;;
+ esac
+ fi
+
+ # Transform deplibs into only deplibs that can be linked in shared.
+ name_save=$name
+ libname_save=$libname
+ release_save=$release
+ versuffix_save=$versuffix
+ major_save=$major
+ # I'm not sure if I'm treating the release correctly. I think
+ # release should show up in the -l (ie -lgmp5) so we don't want to
+ # add it in twice. Is that correct?
+ release=""
+ versuffix=""
+ major=""
+ newdeplibs=
+ droppeddeps=no
+ case $deplibs_check_method in
+ pass_all)
+ # Don't check for shared/static. Everything works.
+ # This might be a little naive. We might want to check
+ # whether the library exists or not. But this is on
+ # osf3 & osf4 and I'm not really sure... Just
+ # implementing what was already the behavior.
+ newdeplibs=$deplibs
+ ;;
+ test_compile)
+ # This code stresses the "libraries are programs" paradigm to its
+ # limits. Maybe even breaks it. We compile a program, linking it
+ # against the deplibs as a proxy for the library. Then we can check
+ # whether they linked in statically or dynamically with ldd.
+ $rm conftest.c
+ cat > conftest.c <<EOF
+ int main() { return 0; }
+EOF
+ $rm conftest
+ if $LTCC $LTCFLAGS -o conftest conftest.c $deplibs; then
+ ldd_output=`ldd conftest`
+ for i in $deplibs; do
+ name=`expr $i : '-l\(.*\)'`
+ # If $name is empty we are operating on a -L argument.
+ if test "$name" != "" && test "$name" != "0"; then
+ if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+ case " $predeps $postdeps " in
+ *" $i "*)
+ newdeplibs="$newdeplibs $i"
+ i=""
+ ;;
+ esac
+ fi
+ if test -n "$i" ; then
+ libname=`eval \\$echo \"$libname_spec\"`
+ deplib_matches=`eval \\$echo \"$library_names_spec\"`
+ set dummy $deplib_matches
+ deplib_match=$2
+ if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
+ newdeplibs="$newdeplibs $i"
+ else
+ droppeddeps=yes
+ $echo
+ $echo "*** Warning: dynamic linker does not accept needed library $i."
+ $echo "*** I have the capability to make that library automatically link in when"
+ $echo "*** you link to this library. But I can only do this if you have a"
+ $echo "*** shared version of the library, which I believe you do not have"
+ $echo "*** because a test_compile did reveal that the linker did not use it for"
+ $echo "*** its dynamic dependency list that programs get resolved with at runtime."
+ fi
+ fi
+ else
+ newdeplibs="$newdeplibs $i"
+ fi
+ done
+ else
+ # Error occurred in the first compile. Let's try to salvage
+ # the situation: Compile a separate program for each library.
+ for i in $deplibs; do
+ name=`expr $i : '-l\(.*\)'`
+ # If $name is empty we are operating on a -L argument.
+ if test "$name" != "" && test "$name" != "0"; then
+ $rm conftest
+ if $LTCC $LTCFLAGS -o conftest conftest.c $i; then
+ ldd_output=`ldd conftest`
+ if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+ case " $predeps $postdeps " in
+ *" $i "*)
+ newdeplibs="$newdeplibs $i"
+ i=""
+ ;;
+ esac
+ fi
+ if test -n "$i" ; then
+ libname=`eval \\$echo \"$libname_spec\"`
+ deplib_matches=`eval \\$echo \"$library_names_spec\"`
+ set dummy $deplib_matches
+ deplib_match=$2
+ if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
+ newdeplibs="$newdeplibs $i"
+ else
+ droppeddeps=yes
+ $echo
+ $echo "*** Warning: dynamic linker does not accept needed library $i."
+ $echo "*** I have the capability to make that library automatically link in when"
+ $echo "*** you link to this library. But I can only do this if you have a"
+ $echo "*** shared version of the library, which you do not appear to have"
+ $echo "*** because a test_compile did reveal that the linker did not use this one"
+ $echo "*** as a dynamic dependency that programs can get resolved with at runtime."
+ fi
+ fi
+ else
+ droppeddeps=yes
+ $echo
+ $echo "*** Warning! Library $i is needed by this library but I was not able to"
+ $echo "*** make it link in! You will probably need to install it or some"
+ $echo "*** library that it depends on before this library will be fully"
+ $echo "*** functional. Installing it before continuing would be even better."
+ fi
+ else
+ newdeplibs="$newdeplibs $i"
+ fi
+ done
+ fi
+ ;;
+ file_magic*)
+ set dummy $deplibs_check_method
+ file_magic_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"`
+ for a_deplib in $deplibs; do
+ name=`expr $a_deplib : '-l\(.*\)'`
+ # If $name is empty we are operating on a -L argument.
+ if test "$name" != "" && test "$name" != "0"; then
+ if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+ case " $predeps $postdeps " in
+ *" $a_deplib "*)
+ newdeplibs="$newdeplibs $a_deplib"
+ a_deplib=""
+ ;;
+ esac
+ fi
+ if test -n "$a_deplib" ; then
+ libname=`eval \\$echo \"$libname_spec\"`
+ for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
+ potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
+ for potent_lib in $potential_libs; do
+ # Follow soft links.
+ if ls -lLd "$potent_lib" 2>/dev/null \
+ | grep " -> " >/dev/null; then
+ continue
+ fi
+ # The statement above tries to avoid entering an
+ # endless loop below, in case of cyclic links.
+ # We might still enter an endless loop, since a link
+ # loop can be closed while we follow links,
+ # but so what?
+ potlib="$potent_lib"
+ while test -h "$potlib" 2>/dev/null; do
+ potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'`
+ case $potliblink in
+ [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";;
+ *) potlib=`$echo "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";;
+ esac
+ done
+ if eval $file_magic_cmd \"\$potlib\" 2>/dev/null \
+ | ${SED} 10q \
+ | $EGREP "$file_magic_regex" > /dev/null; then
+ newdeplibs="$newdeplibs $a_deplib"
+ a_deplib=""
+ break 2
+ fi
+ done
+ done
+ fi
+ if test -n "$a_deplib" ; then
+ droppeddeps=yes
+ $echo
+ $echo "*** Warning: linker path does not have real file for library $a_deplib."
+ $echo "*** I have the capability to make that library automatically link in when"
+ $echo "*** you link to this library. But I can only do this if you have a"
+ $echo "*** shared version of the library, which you do not appear to have"
+ $echo "*** because I did check the linker path looking for a file starting"
+ if test -z "$potlib" ; then
+ $echo "*** with $libname but no candidates were found. (...for file magic test)"
+ else
+ $echo "*** with $libname and none of the candidates passed a file format test"
+ $echo "*** using a file magic. Last file checked: $potlib"
+ fi
+ fi
+ else
+ # Add a -L argument.
+ newdeplibs="$newdeplibs $a_deplib"
+ fi
+ done # Gone through all deplibs.
+ ;;
+ match_pattern*)
+ set dummy $deplibs_check_method
+ match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"`
+ for a_deplib in $deplibs; do
+ name=`expr $a_deplib : '-l\(.*\)'`
+ # If $name is empty we are operating on a -L argument.
+ if test -n "$name" && test "$name" != "0"; then
+ if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+ case " $predeps $postdeps " in
+ *" $a_deplib "*)
+ newdeplibs="$newdeplibs $a_deplib"
+ a_deplib=""
+ ;;
+ esac
+ fi
+ if test -n "$a_deplib" ; then
+ libname=`eval \\$echo \"$libname_spec\"`
+ for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
+ potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
+ for potent_lib in $potential_libs; do
+ potlib="$potent_lib" # see symlink-check above in file_magic test
+ if eval $echo \"$potent_lib\" 2>/dev/null \
+ | ${SED} 10q \
+ | $EGREP "$match_pattern_regex" > /dev/null; then
+ newdeplibs="$newdeplibs $a_deplib"
+ a_deplib=""
+ break 2
+ fi
+ done
+ done
+ fi
+ if test -n "$a_deplib" ; then
+ droppeddeps=yes
+ $echo
+ $echo "*** Warning: linker path does not have real file for library $a_deplib."
+ $echo "*** I have the capability to make that library automatically link in when"
+ $echo "*** you link to this library. But I can only do this if you have a"
+ $echo "*** shared version of the library, which you do not appear to have"
+ $echo "*** because I did check the linker path looking for a file starting"
+ if test -z "$potlib" ; then
+ $echo "*** with $libname but no candidates were found. (...for regex pattern test)"
+ else
+ $echo "*** with $libname and none of the candidates passed a file format test"
+ $echo "*** using a regex pattern. Last file checked: $potlib"
+ fi
+ fi
+ else
+ # Add a -L argument.
+ newdeplibs="$newdeplibs $a_deplib"
+ fi
+ done # Gone through all deplibs.
+ ;;
+ none | unknown | *)
+ newdeplibs=""
+ tmp_deplibs=`$echo "X $deplibs" | $Xsed -e 's/ -lc$//' \
+ -e 's/ -[LR][^ ]*//g'`
+ if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+ for i in $predeps $postdeps ; do
+ # can't use Xsed below, because $i might contain '/'
+ tmp_deplibs=`$echo "X $tmp_deplibs" | ${SED} -e "1s,^X,," -e "s,$i,,"`
+ done
+ fi
+ if $echo "X $tmp_deplibs" | $Xsed -e 's/[ ]//g' \
+ | grep . >/dev/null; then
+ $echo
+ if test "X$deplibs_check_method" = "Xnone"; then
+ $echo "*** Warning: inter-library dependencies are not supported in this platform."
+ else
+ $echo "*** Warning: inter-library dependencies are not known to be supported."
+ fi
+ $echo "*** All declared inter-library dependencies are being dropped."
+ droppeddeps=yes
+ fi
+ ;;
+ esac
+ versuffix=$versuffix_save
+ major=$major_save
+ release=$release_save
+ libname=$libname_save
+ name=$name_save
+
+ case $host in
+ *-*-rhapsody* | *-*-darwin1.[012])
+ # On Rhapsody replace the C library is the System framework
+ newdeplibs=`$echo "X $newdeplibs" | $Xsed -e 's/ -lc / -framework System /'`
+ ;;
+ esac
+
+ if test "$droppeddeps" = yes; then
+ if test "$module" = yes; then
+ $echo
+ $echo "*** Warning: libtool could not satisfy all declared inter-library"
+ $echo "*** dependencies of module $libname. Therefore, libtool will create"
+ $echo "*** a static module, that should work as long as the dlopening"
+ $echo "*** application is linked with the -dlopen flag."
+ if test -z "$global_symbol_pipe"; then
+ $echo
+ $echo "*** However, this would only work if libtool was able to extract symbol"
+ $echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
+ $echo "*** not find such a program. So, this module is probably useless."
+ $echo "*** \`nm' from GNU binutils and a full rebuild may help."
+ fi
+ if test "$build_old_libs" = no; then
+ oldlibs="$output_objdir/$libname.$libext"
+ build_libtool_libs=module
+ build_old_libs=yes
+ else
+ build_libtool_libs=no
+ fi
+ else
+ $echo "*** The inter-library dependencies that have been dropped here will be"
+ $echo "*** automatically added whenever a program is linked with this library"
+ $echo "*** or is declared to -dlopen it."
+
+ if test "$allow_undefined" = no; then
+ $echo
+ $echo "*** Since this library must not contain undefined symbols,"
+ $echo "*** because either the platform does not support them or"
+ $echo "*** it was explicitly requested with -no-undefined,"
+ $echo "*** libtool will only create a static version of it."
+ if test "$build_old_libs" = no; then
+ oldlibs="$output_objdir/$libname.$libext"
+ build_libtool_libs=module
+ build_old_libs=yes
+ else
+ build_libtool_libs=no
+ fi
+ fi
+ fi
+ fi
+ # Done checking deplibs!
+ deplibs=$newdeplibs
+ fi
+
+
+ # move library search paths that coincide with paths to not yet
+ # installed libraries to the beginning of the library search list
+ new_libs=
+ for path in $notinst_path; do
+ case " $new_libs " in
+ *" -L$path/$objdir "*) ;;
+ *)
+ case " $deplibs " in
+ *" -L$path/$objdir "*)
+ new_libs="$new_libs -L$path/$objdir" ;;
+ esac
+ ;;
+ esac
+ done
+ for deplib in $deplibs; do
+ case $deplib in
+ -L*)
+ case " $new_libs " in
+ *" $deplib "*) ;;
+ *) new_libs="$new_libs $deplib" ;;
+ esac
+ ;;
+ *) new_libs="$new_libs $deplib" ;;
+ esac
+ done
+ deplibs="$new_libs"
+
+
+ # All the library-specific variables (install_libdir is set above).
+ library_names=
+ old_library=
+ dlname=
+
+ # Test again, we may have decided not to build it any more
+ if test "$build_libtool_libs" = yes; then
+ if test "$hardcode_into_libs" = yes; then
+ # Hardcode the library paths
+ hardcode_libdirs=
+ dep_rpath=
+ rpath="$finalize_rpath"
+ test "$mode" != relink && rpath="$compile_rpath$rpath"
+ for libdir in $rpath; do
+ if test -n "$hardcode_libdir_flag_spec"; then
+ if test -n "$hardcode_libdir_separator"; then
+ if test -z "$hardcode_libdirs"; then
+ hardcode_libdirs="$libdir"
+ else
+ # Just accumulate the unique libdirs.
+ case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+ *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+ ;;
+ *)
+ hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
+ ;;
+ esac
+ fi
+ else
+ eval flag=\"$hardcode_libdir_flag_spec\"
+ dep_rpath="$dep_rpath $flag"
+ fi
+ elif test -n "$runpath_var"; then
+ case "$perm_rpath " in
+ *" $libdir "*) ;;
+ *) perm_rpath="$perm_rpath $libdir" ;;
+ esac
+ fi
+ done
+ # Substitute the hardcoded libdirs into the rpath.
+ if test -n "$hardcode_libdir_separator" &&
+ test -n "$hardcode_libdirs"; then
+ libdir="$hardcode_libdirs"
+ if test -n "$hardcode_libdir_flag_spec_ld"; then
+ case $archive_cmds in
+ *\$LD*) eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\" ;;
+ *) eval dep_rpath=\"$hardcode_libdir_flag_spec\" ;;
+ esac
+ else
+ eval dep_rpath=\"$hardcode_libdir_flag_spec\"
+ fi
+ fi
+ if test -n "$runpath_var" && test -n "$perm_rpath"; then
+ # We should set the runpath_var.
+ rpath=
+ for dir in $perm_rpath; do
+ rpath="$rpath$dir:"
+ done
+ eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var"
+ fi
+ test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs"
+ fi
+
+ shlibpath="$finalize_shlibpath"
+ test "$mode" != relink && shlibpath="$compile_shlibpath$shlibpath"
+ if test -n "$shlibpath"; then
+ eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var"
+ fi
+
+ # Get the real and link names of the library.
+ eval shared_ext=\"$shrext_cmds\"
+ eval library_names=\"$library_names_spec\"
+ set dummy $library_names
+ realname="$2"
+ shift; shift
+
+ if test -n "$soname_spec"; then
+ eval soname=\"$soname_spec\"
+ else
+ soname="$realname"
+ fi
+ if test -z "$dlname"; then
+ dlname=$soname
+ fi
+
+ lib="$output_objdir/$realname"
+ linknames=
+ for link
+ do
+ linknames="$linknames $link"
+ done
+
+ # Use standard objects if they are pic
+ test -z "$pic_flag" && libobjs=`$echo "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+
+ # Prepare the list of exported symbols
+ if test -z "$export_symbols"; then
+ if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then
+ $show "generating symbol list for \`$libname.la'"
+ export_symbols="$output_objdir/$libname.exp"
+ $run $rm $export_symbols
+ cmds=$export_symbols_cmds
+ save_ifs="$IFS"; IFS='~'
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ eval cmd=\"$cmd\"
+ if len=`expr "X$cmd" : ".*"` &&
+ test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+ $show "$cmd"
+ $run eval "$cmd" || exit $?
+ skipped_export=false
+ else
+ # The command line is too long to execute in one step.
+ $show "using reloadable object file for export list..."
+ skipped_export=:
+ # Break out early, otherwise skipped_export may be
+ # set to false by a later but shorter cmd.
+ break
+ fi
+ done
+ IFS="$save_ifs"
+ if test -n "$export_symbols_regex"; then
+ $show "$EGREP -e \"$export_symbols_regex\" \"$export_symbols\" > \"${export_symbols}T\""
+ $run eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
+ $show "$mv \"${export_symbols}T\" \"$export_symbols\""
+ $run eval '$mv "${export_symbols}T" "$export_symbols"'
+ fi
+ fi
+ fi
+
+ if test -n "$export_symbols" && test -n "$include_expsyms"; then
+ $run eval '$echo "X$include_expsyms" | $SP2NL >> "$export_symbols"'
+ fi
+
+ tmp_deplibs=
+ for test_deplib in $deplibs; do
+ case " $convenience " in
+ *" $test_deplib "*) ;;
+ *)
+ tmp_deplibs="$tmp_deplibs $test_deplib"
+ ;;
+ esac
+ done
+ deplibs="$tmp_deplibs"
+
+ if test -n "$convenience"; then
+ if test -n "$whole_archive_flag_spec"; then
+ save_libobjs=$libobjs
+ eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
+ else
+ gentop="$output_objdir/${outputname}x"
+ generated="$generated $gentop"
+
+ func_extract_archives $gentop $convenience
+ libobjs="$libobjs $func_extract_archives_result"
+ fi
+ fi
+
+ if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then
+ eval flag=\"$thread_safe_flag_spec\"
+ linker_flags="$linker_flags $flag"
+ fi
+
+ # Make a backup of the uninstalled library when relinking
+ if test "$mode" = relink; then
+ $run eval '(cd $output_objdir && $rm ${realname}U && $mv $realname ${realname}U)' || exit $?
+ fi
+
+ # Do each of the archive commands.
+ if test "$module" = yes && test -n "$module_cmds" ; then
+ if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
+ eval test_cmds=\"$module_expsym_cmds\"
+ cmds=$module_expsym_cmds
+ else
+ eval test_cmds=\"$module_cmds\"
+ cmds=$module_cmds
+ fi
+ else
+ if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
+ eval test_cmds=\"$archive_expsym_cmds\"
+ cmds=$archive_expsym_cmds
+ else
+ eval test_cmds=\"$archive_cmds\"
+ cmds=$archive_cmds
+ fi
+ fi
+
+ if test "X$skipped_export" != "X:" &&
+ len=`expr "X$test_cmds" : ".*" 2>/dev/null` &&
+ test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+ :
+ else
+ # The command line is too long to link in one step, link piecewise.
+ $echo "creating reloadable object files..."
+
+ # Save the value of $output and $libobjs because we want to
+ # use them later. If we have whole_archive_flag_spec, we
+ # want to use save_libobjs as it was before
+ # whole_archive_flag_spec was expanded, because we can't
+ # assume the linker understands whole_archive_flag_spec.
+ # This may have to be revisited, in case too many
+ # convenience libraries get linked in and end up exceeding
+ # the spec.
+ if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then
+ save_libobjs=$libobjs
+ fi
+ save_output=$output
+ output_la=`$echo "X$output" | $Xsed -e "$basename"`
+
+ # Clear the reloadable object creation command queue and
+ # initialize k to one.
+ test_cmds=
+ concat_cmds=
+ objlist=
+ delfiles=
+ last_robj=
+ k=1
+ output=$output_objdir/$output_la-${k}.$objext
+ # Loop over the list of objects to be linked.
+ for obj in $save_libobjs
+ do
+ eval test_cmds=\"$reload_cmds $objlist $last_robj\"
+ if test "X$objlist" = X ||
+ { len=`expr "X$test_cmds" : ".*" 2>/dev/null` &&
+ test "$len" -le "$max_cmd_len"; }; then
+ objlist="$objlist $obj"
+ else
+ # The command $test_cmds is almost too long, add a
+ # command to the queue.
+ if test "$k" -eq 1 ; then
+ # The first file doesn't have a previous command to add.
+ eval concat_cmds=\"$reload_cmds $objlist $last_robj\"
+ else
+ # All subsequent reloadable object files will link in
+ # the last one created.
+ eval concat_cmds=\"\$concat_cmds~$reload_cmds $objlist $last_robj\"
+ fi
+ last_robj=$output_objdir/$output_la-${k}.$objext
+ k=`expr $k + 1`
+ output=$output_objdir/$output_la-${k}.$objext
+ objlist=$obj
+ len=1
+ fi
+ done
+ # Handle the remaining objects by creating one last
+ # reloadable object file. All subsequent reloadable object
+ # files will link in the last one created.
+ test -z "$concat_cmds" || concat_cmds=$concat_cmds~
+ eval concat_cmds=\"\${concat_cmds}$reload_cmds $objlist $last_robj\"
+
+ if ${skipped_export-false}; then
+ $show "generating symbol list for \`$libname.la'"
+ export_symbols="$output_objdir/$libname.exp"
+ $run $rm $export_symbols
+ libobjs=$output
+ # Append the command to create the export file.
+ eval concat_cmds=\"\$concat_cmds~$export_symbols_cmds\"
+ fi
+
+ # Set up a command to remove the reloadable object files
+ # after they are used.
+ i=0
+ while test "$i" -lt "$k"
+ do
+ i=`expr $i + 1`
+ delfiles="$delfiles $output_objdir/$output_la-${i}.$objext"
+ done
+
+ $echo "creating a temporary reloadable object file: $output"
+
+ # Loop through the commands generated above and execute them.
+ save_ifs="$IFS"; IFS='~'
+ for cmd in $concat_cmds; do
+ IFS="$save_ifs"
+ $show "$cmd"
+ $run eval "$cmd" || exit $?
+ done
+ IFS="$save_ifs"
+
+ libobjs=$output
+ # Restore the value of output.
+ output=$save_output
+
+ if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then
+ eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
+ fi
+ # Expand the library linking commands again to reset the
+ # value of $libobjs for piecewise linking.
+
+ # Do each of the archive commands.
+ if test "$module" = yes && test -n "$module_cmds" ; then
+ if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
+ cmds=$module_expsym_cmds
+ else
+ cmds=$module_cmds
+ fi
+ else
+ if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
+ cmds=$archive_expsym_cmds
+ else
+ cmds=$archive_cmds
+ fi
+ fi
+
+ # Append the command to remove the reloadable object files
+ # to the just-reset $cmds.
+ eval cmds=\"\$cmds~\$rm $delfiles\"
+ fi
+ save_ifs="$IFS"; IFS='~'
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ eval cmd=\"$cmd\"
+ $show "$cmd"
+ $run eval "$cmd" || {
+ lt_exit=$?
+
+ # Restore the uninstalled library and exit
+ if test "$mode" = relink; then
+ $run eval '(cd $output_objdir && $rm ${realname}T && $mv ${realname}U $realname)'
+ fi
+
+ exit $lt_exit
+ }
+ done
+ IFS="$save_ifs"
+
+ # Restore the uninstalled library and exit
+ if test "$mode" = relink; then
+ $run eval '(cd $output_objdir && $rm ${realname}T && $mv $realname ${realname}T && $mv "$realname"U $realname)' || exit $?
+
+ if test -n "$convenience"; then
+ if test -z "$whole_archive_flag_spec"; then
+ $show "${rm}r $gentop"
+ $run ${rm}r "$gentop"
+ fi
+ fi
+
+ exit $EXIT_SUCCESS
+ fi
+
+ # Create links to the real library.
+ for linkname in $linknames; do
+ if test "$realname" != "$linkname"; then
+ $show "(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)"
+ $run eval '(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)' || exit $?
+ fi
+ done
+
+ # If -module or -export-dynamic was specified, set the dlname.
+ if test "$module" = yes || test "$export_dynamic" = yes; then
+ # On all known operating systems, these are identical.
+ dlname="$soname"
+ fi
+ fi
+ ;;
+
+ obj)
+ case " $deplibs" in
+ *\ -l* | *\ -L*)
+ $echo "$modename: warning: \`-l' and \`-L' are ignored for objects" 1>&2 ;;
+ esac
+
+ if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+ $echo "$modename: warning: \`-dlopen' is ignored for objects" 1>&2
+ fi
+
+ if test -n "$rpath"; then
+ $echo "$modename: warning: \`-rpath' is ignored for objects" 1>&2
+ fi
+
+ if test -n "$xrpath"; then
+ $echo "$modename: warning: \`-R' is ignored for objects" 1>&2
+ fi
+
+ if test -n "$vinfo"; then
+ $echo "$modename: warning: \`-version-info' is ignored for objects" 1>&2
+ fi
+
+ if test -n "$release"; then
+ $echo "$modename: warning: \`-release' is ignored for objects" 1>&2
+ fi
+
+ case $output in
+ *.lo)
+ if test -n "$objs$old_deplibs"; then
+ $echo "$modename: cannot build library object \`$output' from non-libtool objects" 1>&2
+ exit $EXIT_FAILURE
+ fi
+ libobj="$output"
+ obj=`$echo "X$output" | $Xsed -e "$lo2o"`
+ ;;
+ *)
+ libobj=
+ obj="$output"
+ ;;
+ esac
+
+ # Delete the old objects.
+ $run $rm $obj $libobj
+
+ # Objects from convenience libraries. This assumes
+ # single-version convenience libraries. Whenever we create
+ # different ones for PIC/non-PIC, this we'll have to duplicate
+ # the extraction.
+ reload_conv_objs=
+ gentop=
+ # reload_cmds runs $LD directly, so let us get rid of
+ # -Wl from whole_archive_flag_spec and hope we can get by with
+ # turning comma into space..
+ wl=
+
+ if test -n "$convenience"; then
+ if test -n "$whole_archive_flag_spec"; then
+ eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\"
+ reload_conv_objs=$reload_objs\ `$echo "X$tmp_whole_archive_flags" | $Xsed -e 's|,| |g'`
+ else
+ gentop="$output_objdir/${obj}x"
+ generated="$generated $gentop"
+
+ func_extract_archives $gentop $convenience
+ reload_conv_objs="$reload_objs $func_extract_archives_result"
+ fi
+ fi
+
+ # Create the old-style object.
+ reload_objs="$objs$old_deplibs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test
+
+ output="$obj"
+ cmds=$reload_cmds
+ save_ifs="$IFS"; IFS='~'
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ eval cmd=\"$cmd\"
+ $show "$cmd"
+ $run eval "$cmd" || exit $?
+ done
+ IFS="$save_ifs"
+
+ # Exit if we aren't doing a library object file.
+ if test -z "$libobj"; then
+ if test -n "$gentop"; then
+ $show "${rm}r $gentop"
+ $run ${rm}r $gentop
+ fi
+
+ exit $EXIT_SUCCESS
+ fi
+
+ if test "$build_libtool_libs" != yes; then
+ if test -n "$gentop"; then
+ $show "${rm}r $gentop"
+ $run ${rm}r $gentop
+ fi
+
+ # Create an invalid libtool object if no PIC, so that we don't
+ # accidentally link it into a program.
+ # $show "echo timestamp > $libobj"
+ # $run eval "echo timestamp > $libobj" || exit $?
+ exit $EXIT_SUCCESS
+ fi
+
+ if test -n "$pic_flag" || test "$pic_mode" != default; then
+ # Only do commands if we really have different PIC objects.
+ reload_objs="$libobjs $reload_conv_objs"
+ output="$libobj"
+ cmds=$reload_cmds
+ save_ifs="$IFS"; IFS='~'
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ eval cmd=\"$cmd\"
+ $show "$cmd"
+ $run eval "$cmd" || exit $?
+ done
+ IFS="$save_ifs"
+ fi
+
+ if test -n "$gentop"; then
+ $show "${rm}r $gentop"
+ $run ${rm}r $gentop
+ fi
+
+ exit $EXIT_SUCCESS
+ ;;
+
+ prog)
+ case $host in
+ *cygwin*) output=`$echo $output | ${SED} -e 's,.exe$,,;s,$,.exe,'` ;;
+ esac
+ if test -n "$vinfo"; then
+ $echo "$modename: warning: \`-version-info' is ignored for programs" 1>&2
+ fi
+
+ if test -n "$release"; then
+ $echo "$modename: warning: \`-release' is ignored for programs" 1>&2
+ fi
+
+ if test "$preload" = yes; then
+ if test "$dlopen_support" = unknown && test "$dlopen_self" = unknown &&
+ test "$dlopen_self_static" = unknown; then
+ $echo "$modename: warning: \`AC_LIBTOOL_DLOPEN' not used. Assuming no dlopen support."
+ fi
+ fi
+
+ case $host in
+ *-*-rhapsody* | *-*-darwin1.[012])
+ # On Rhapsody replace the C library is the System framework
+ compile_deplibs=`$echo "X $compile_deplibs" | $Xsed -e 's/ -lc / -framework System /'`
+ finalize_deplibs=`$echo "X $finalize_deplibs" | $Xsed -e 's/ -lc / -framework System /'`
+ ;;
+ esac
+
+ case $host in
+ *darwin*)
+ # Don't allow lazy linking, it breaks C++ global constructors
+ if test "$tagname" = CXX ; then
+ compile_command="$compile_command ${wl}-bind_at_load"
+ finalize_command="$finalize_command ${wl}-bind_at_load"
+ fi
+ ;;
+ esac
+
+
+ # move library search paths that coincide with paths to not yet
+ # installed libraries to the beginning of the library search list
+ new_libs=
+ for path in $notinst_path; do
+ case " $new_libs " in
+ *" -L$path/$objdir "*) ;;
+ *)
+ case " $compile_deplibs " in
+ *" -L$path/$objdir "*)
+ new_libs="$new_libs -L$path/$objdir" ;;
+ esac
+ ;;
+ esac
+ done
+ for deplib in $compile_deplibs; do
+ case $deplib in
+ -L*)
+ case " $new_libs " in
+ *" $deplib "*) ;;
+ *) new_libs="$new_libs $deplib" ;;
+ esac
+ ;;
+ *) new_libs="$new_libs $deplib" ;;
+ esac
+ done
+ compile_deplibs="$new_libs"
+
+
+ compile_command="$compile_command $compile_deplibs"
+ finalize_command="$finalize_command $finalize_deplibs"
+
+ if test -n "$rpath$xrpath"; then
+ # If the user specified any rpath flags, then add them.
+ for libdir in $rpath $xrpath; do
+ # This is the magic to use -rpath.
+ case "$finalize_rpath " in
+ *" $libdir "*) ;;
+ *) finalize_rpath="$finalize_rpath $libdir" ;;
+ esac
+ done
+ fi
+
+ # Now hardcode the library paths
+ rpath=
+ hardcode_libdirs=
+ for libdir in $compile_rpath $finalize_rpath; do
+ if test -n "$hardcode_libdir_flag_spec"; then
+ if test -n "$hardcode_libdir_separator"; then
+ if test -z "$hardcode_libdirs"; then
+ hardcode_libdirs="$libdir"
+ else
+ # Just accumulate the unique libdirs.
+ case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+ *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+ ;;
+ *)
+ hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
+ ;;
+ esac
+ fi
+ else
+ eval flag=\"$hardcode_libdir_flag_spec\"
+ rpath="$rpath $flag"
+ fi
+ elif test -n "$runpath_var"; then
+ case "$perm_rpath " in
+ *" $libdir "*) ;;
+ *) perm_rpath="$perm_rpath $libdir" ;;
+ esac
+ fi
+ case $host in
+ *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)
+ testbindir=`$echo "X$libdir" | $Xsed -e 's*/lib$*/bin*'`
+ case :$dllsearchpath: in
+ *":$libdir:"*) ;;
+ *) dllsearchpath="$dllsearchpath:$libdir";;
+ esac
+ case :$dllsearchpath: in
+ *":$testbindir:"*) ;;
+ *) dllsearchpath="$dllsearchpath:$testbindir";;
+ esac
+ ;;
+ esac
+ done
+ # Substitute the hardcoded libdirs into the rpath.
+ if test -n "$hardcode_libdir_separator" &&
+ test -n "$hardcode_libdirs"; then
+ libdir="$hardcode_libdirs"
+ eval rpath=\" $hardcode_libdir_flag_spec\"
+ fi
+ compile_rpath="$rpath"
+
+ rpath=
+ hardcode_libdirs=
+ for libdir in $finalize_rpath; do
+ if test -n "$hardcode_libdir_flag_spec"; then
+ if test -n "$hardcode_libdir_separator"; then
+ if test -z "$hardcode_libdirs"; then
+ hardcode_libdirs="$libdir"
+ else
+ # Just accumulate the unique libdirs.
+ case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+ *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+ ;;
+ *)
+ hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
+ ;;
+ esac
+ fi
+ else
+ eval flag=\"$hardcode_libdir_flag_spec\"
+ rpath="$rpath $flag"
+ fi
+ elif test -n "$runpath_var"; then
+ case "$finalize_perm_rpath " in
+ *" $libdir "*) ;;
+ *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;;
+ esac
+ fi
+ done
+ # Substitute the hardcoded libdirs into the rpath.
+ if test -n "$hardcode_libdir_separator" &&
+ test -n "$hardcode_libdirs"; then
+ libdir="$hardcode_libdirs"
+ eval rpath=\" $hardcode_libdir_flag_spec\"
+ fi
+ finalize_rpath="$rpath"
+
+ if test -n "$libobjs" && test "$build_old_libs" = yes; then
+ # Transform all the library objects into standard objects.
+ compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+ finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+ fi
+
+ dlsyms=
+ if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+ if test -n "$NM" && test -n "$global_symbol_pipe"; then
+ dlsyms="${outputname}S.c"
+ else
+ $echo "$modename: not configured to extract global symbols from dlpreopened files" 1>&2
+ fi
+ fi
+
+ if test -n "$dlsyms"; then
+ case $dlsyms in
+ "") ;;
+ *.c)
+ # Discover the nlist of each of the dlfiles.
+ nlist="$output_objdir/${outputname}.nm"
+
+ $show "$rm $nlist ${nlist}S ${nlist}T"
+ $run $rm "$nlist" "${nlist}S" "${nlist}T"
+
+ # Parse the name list into a source file.
+ $show "creating $output_objdir/$dlsyms"
+
+ test -z "$run" && $echo > "$output_objdir/$dlsyms" "\
+/* $dlsyms - symbol resolution table for \`$outputname' dlsym emulation. */
+/* Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP */
+
+#ifdef __cplusplus
+extern \"C\" {
+#endif
+
+/* Prevent the only kind of declaration conflicts we can make. */
+#define lt_preloaded_symbols some_other_symbol
+
+/* External symbol declarations for the compiler. */\
+"
+
+ if test "$dlself" = yes; then
+ $show "generating symbol list for \`$output'"
+
+ test -z "$run" && $echo ': @PROGRAM@ ' > "$nlist"
+
+ # Add our own program objects to the symbol list.
+ progfiles=`$echo "X$objs$old_deplibs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+ for arg in $progfiles; do
+ $show "extracting global C symbols from \`$arg'"
+ $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'"
+ done
+
+ if test -n "$exclude_expsyms"; then
+ $run eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T'
+ $run eval '$mv "$nlist"T "$nlist"'
+ fi
+
+ if test -n "$export_symbols_regex"; then
+ $run eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T'
+ $run eval '$mv "$nlist"T "$nlist"'
+ fi
+
+ # Prepare the list of exported symbols
+ if test -z "$export_symbols"; then
+ export_symbols="$output_objdir/$outputname.exp"
+ $run $rm $export_symbols
+ $run eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"'
+ case $host in
+ *cygwin* | *mingw* )
+ $run eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
+ $run eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"'
+ ;;
+ esac
+ else
+ $run eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"'
+ $run eval 'grep -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T'
+ $run eval 'mv "$nlist"T "$nlist"'
+ case $host in
+ *cygwin* | *mingw* )
+ $run eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
+ $run eval 'cat "$nlist" >> "$output_objdir/$outputname.def"'
+ ;;
+ esac
+ fi
+ fi
+
+ for arg in $dlprefiles; do
+ $show "extracting global C symbols from \`$arg'"
+ name=`$echo "$arg" | ${SED} -e 's%^.*/%%'`
+ $run eval '$echo ": $name " >> "$nlist"'
+ $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'"
+ done
+
+ if test -z "$run"; then
+ # Make sure we have at least an empty file.
+ test -f "$nlist" || : > "$nlist"
+
+ if test -n "$exclude_expsyms"; then
+ $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T
+ $mv "$nlist"T "$nlist"
+ fi
+
+ # Try sorting and uniquifying the output.
+ if grep -v "^: " < "$nlist" |
+ if sort -k 3 </dev/null >/dev/null 2>&1; then
+ sort -k 3
+ else
+ sort +2
+ fi |
+ uniq > "$nlist"S; then
+ :
+ else
+ grep -v "^: " < "$nlist" > "$nlist"S
+ fi
+
+ if test -f "$nlist"S; then
+ eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$dlsyms"'
+ else
+ $echo '/* NONE */' >> "$output_objdir/$dlsyms"
+ fi
+
+ $echo >> "$output_objdir/$dlsyms" "\
+
+#undef lt_preloaded_symbols
+
+#if defined (__STDC__) && __STDC__
+# define lt_ptr void *
+#else
+# define lt_ptr char *
+# define const
+#endif
+
+/* The mapping between symbol names and symbols. */
+"
+
+ case $host in
+ *cygwin* | *mingw* )
+ $echo >> "$output_objdir/$dlsyms" "\
+/* DATA imports from DLLs on WIN32 can't be const, because
+ runtime relocations are performed -- see ld's documentation
+ on pseudo-relocs */
+struct {
+"
+ ;;
+ * )
+ $echo >> "$output_objdir/$dlsyms" "\
+const struct {
+"
+ ;;
+ esac
+
+
+ $echo >> "$output_objdir/$dlsyms" "\
+ const char *name;
+ lt_ptr address;
+}
+lt_preloaded_symbols[] =
+{\
+"
+
+ eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$dlsyms"
+
+ $echo >> "$output_objdir/$dlsyms" "\
+ {0, (lt_ptr) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+ return lt_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif\
+"
+ fi
+
+ pic_flag_for_symtable=
+ case $host in
+ # compiling the symbol table file with pic_flag works around
+ # a FreeBSD bug that causes programs to crash when -lm is
+ # linked before any other PIC object. But we must not use
+ # pic_flag when linking with -static. The problem exists in
+ # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1.
+ *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*)
+ case "$compile_command " in
+ *" -static "*) ;;
+ *) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND";;
+ esac;;
+ *-*-hpux*)
+ case "$compile_command " in
+ *" -static "*) ;;
+ *) pic_flag_for_symtable=" $pic_flag";;
+ esac
+ esac
+
+ # Now compile the dynamic symbol file.
+ $show "(cd $output_objdir && $LTCC $LTCFLAGS -c$no_builtin_flag$pic_flag_for_symtable \"$dlsyms\")"
+ $run eval '(cd $output_objdir && $LTCC $LTCFLAGS -c$no_builtin_flag$pic_flag_for_symtable "$dlsyms")' || exit $?
+
+ # Clean up the generated files.
+ $show "$rm $output_objdir/$dlsyms $nlist ${nlist}S ${nlist}T"
+ $run $rm "$output_objdir/$dlsyms" "$nlist" "${nlist}S" "${nlist}T"
+
+ # Transform the symbol file into the correct name.
+ case $host in
+ *cygwin* | *mingw* )
+ if test -f "$output_objdir/${outputname}.def" ; then
+ compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}.def $output_objdir/${outputname}S.${objext}%" | $NL2SP`
+ finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}.def $output_objdir/${outputname}S.${objext}%" | $NL2SP`
+ else
+ compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%" | $NL2SP`
+ finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%" | $NL2SP`
+ fi
+ ;;
+ * )
+ compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%" | $NL2SP`
+ finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%" | $NL2SP`
+ ;;
+ esac
+ ;;
+ *)
+ $echo "$modename: unknown suffix for \`$dlsyms'" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ esac
+ else
+ # We keep going just in case the user didn't refer to
+ # lt_preloaded_symbols. The linker will fail if global_symbol_pipe
+ # really was required.
+
+ # Nullify the symbol file.
+ compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "s% @SYMFILE@%%" | $NL2SP`
+ finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "s% @SYMFILE@%%" | $NL2SP`
+ fi
+
+ if test "$need_relink" = no || test "$build_libtool_libs" != yes; then
+ # Replace the output file specification.
+ compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e 's%@OUTPUT@%'"$output"'%g' | $NL2SP`
+ link_command="$compile_command$compile_rpath"
+
+ # We have no uninstalled library dependencies, so finalize right now.
+ $show "$link_command"
+ $run eval "$link_command"
+ exit_status=$?
+
+ # Delete the generated files.
+ if test -n "$dlsyms"; then
+ $show "$rm $output_objdir/${outputname}S.${objext}"
+ $run $rm "$output_objdir/${outputname}S.${objext}"
+ fi
+
+ exit $exit_status
+ fi
+
+ if test -n "$shlibpath_var"; then
+ # We should set the shlibpath_var
+ rpath=
+ for dir in $temp_rpath; do
+ case $dir in
+ [\\/]* | [A-Za-z]:[\\/]*)
+ # Absolute path.
+ rpath="$rpath$dir:"
+ ;;
+ *)
+ # Relative path: add a thisdir entry.
+ rpath="$rpath\$thisdir/$dir:"
+ ;;
+ esac
+ done
+ temp_rpath="$rpath"
+ fi
+
+ if test -n "$compile_shlibpath$finalize_shlibpath"; then
+ compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command"
+ fi
+ if test -n "$finalize_shlibpath"; then
+ finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command"
+ fi
+
+ compile_var=
+ finalize_var=
+ if test -n "$runpath_var"; then
+ if test -n "$perm_rpath"; then
+ # We should set the runpath_var.
+ rpath=
+ for dir in $perm_rpath; do
+ rpath="$rpath$dir:"
+ done
+ compile_var="$runpath_var=\"$rpath\$$runpath_var\" "
+ fi
+ if test -n "$finalize_perm_rpath"; then
+ # We should set the runpath_var.
+ rpath=
+ for dir in $finalize_perm_rpath; do
+ rpath="$rpath$dir:"
+ done
+ finalize_var="$runpath_var=\"$rpath\$$runpath_var\" "
+ fi
+ fi
+
+ if test "$no_install" = yes; then
+ # We don't need to create a wrapper script.
+ link_command="$compile_var$compile_command$compile_rpath"
+ # Replace the output file specification.
+ link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'`
+ # Delete the old output file.
+ $run $rm $output
+ # Link the executable and exit
+ $show "$link_command"
+ $run eval "$link_command" || exit $?
+ exit $EXIT_SUCCESS
+ fi
+
+ if test "$hardcode_action" = relink; then
+ # Fast installation is not supported
+ link_command="$compile_var$compile_command$compile_rpath"
+ relink_command="$finalize_var$finalize_command$finalize_rpath"
+
+ $echo "$modename: warning: this platform does not like uninstalled shared libraries" 1>&2
+ $echo "$modename: \`$output' will be relinked during installation" 1>&2
+ else
+ if test "$fast_install" != no; then
+ link_command="$finalize_var$compile_command$finalize_rpath"
+ if test "$fast_install" = yes; then
+ relink_command=`$echo "X$compile_var$compile_command$compile_rpath" | $SP2NL | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g' | $NL2SP`
+ else
+ # fast_install is set to needless
+ relink_command=
+ fi
+ else
+ link_command="$compile_var$compile_command$compile_rpath"
+ relink_command="$finalize_var$finalize_command$finalize_rpath"
+ fi
+ fi
+
+ # Replace the output file specification.
+ link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'`
+
+ # Delete the old output files.
+ $run $rm $output $output_objdir/$outputname $output_objdir/lt-$outputname
+
+ $show "$link_command"
+ $run eval "$link_command" || exit $?
+
+ # Now create the wrapper script.
+ $show "creating $output"
+
+ # Quote the relink command for shipping.
+ if test -n "$relink_command"; then
+ # Preserve any variables that may affect compiler behavior
+ for var in $variables_saved_for_relink; do
+ if eval test -z \"\${$var+set}\"; then
+ relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command"
+ elif eval var_value=\$$var; test -z "$var_value"; then
+ relink_command="$var=; export $var; $relink_command"
+ else
+ var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"`
+ relink_command="$var=\"$var_value\"; export $var; $relink_command"
+ fi
+ done
+ relink_command="(cd `pwd`; $relink_command)"
+ relink_command=`$echo "X$relink_command" | $SP2NL | $Xsed -e "$sed_quote_subst" | $NL2SP`
+ fi
+
+ # Quote $echo for shipping.
+ if test "X$echo" = "X$SHELL $progpath --fallback-echo"; then
+ case $progpath in
+ [\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $progpath --fallback-echo";;
+ *) qecho="$SHELL `pwd`/$progpath --fallback-echo";;
+ esac
+ qecho=`$echo "X$qecho" | $Xsed -e "$sed_quote_subst"`
+ else
+ qecho=`$echo "X$echo" | $Xsed -e "$sed_quote_subst"`
+ fi
+
+ # Only actually do things if our run command is non-null.
+ if test -z "$run"; then
+ # win32 will think the script is a binary if it has
+ # a .exe suffix, so we strip it off here.
+ case $output in
+ *.exe) output=`$echo $output|${SED} 's,.exe$,,'` ;;
+ esac
+ # test for cygwin because mv fails w/o .exe extensions
+ case $host in
+ *cygwin*)
+ exeext=.exe
+ outputname=`$echo $outputname|${SED} 's,.exe$,,'` ;;
+ *) exeext= ;;
+ esac
+ case $host in
+ *cygwin* | *mingw* )
+ output_name=`basename $output`
+ output_path=`dirname $output`
+ cwrappersource="$output_path/$objdir/lt-$output_name.c"
+ cwrapper="$output_path/$output_name.exe"
+ $rm $cwrappersource $cwrapper
+ trap "$rm $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15
+
+ cat > $cwrappersource <<EOF
+
+/* $cwrappersource - temporary wrapper executable for $objdir/$outputname
+ Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP
+
+ The $output program cannot be directly executed until all the libtool
+ libraries that it depends on are installed.
+
+ This wrapper executable should never be moved out of the build directory.
+ If it is, it will not operate correctly.
+
+ Currently, it simply execs the wrapper *script* "/bin/sh $output",
+ but could eventually absorb all of the scripts functionality and
+ exec $objdir/$outputname directly.
+*/
+EOF
+ cat >> $cwrappersource<<"EOF"
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <malloc.h>
+#include <stdarg.h>
+#include <assert.h>
+#include <string.h>
+#include <ctype.h>
+#include <sys/stat.h>
+
+#if defined(PATH_MAX)
+# define LT_PATHMAX PATH_MAX
+#elif defined(MAXPATHLEN)
+# define LT_PATHMAX MAXPATHLEN
+#else
+# define LT_PATHMAX 1024
+#endif
+
+#ifndef DIR_SEPARATOR
+# define DIR_SEPARATOR '/'
+# define PATH_SEPARATOR ':'
+#endif
+
+#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \
+ defined (__OS2__)
+# define HAVE_DOS_BASED_FILE_SYSTEM
+# ifndef DIR_SEPARATOR_2
+# define DIR_SEPARATOR_2 '\\'
+# endif
+# ifndef PATH_SEPARATOR_2
+# define PATH_SEPARATOR_2 ';'
+# endif
+#endif
+
+#ifndef DIR_SEPARATOR_2
+# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR)
+#else /* DIR_SEPARATOR_2 */
+# define IS_DIR_SEPARATOR(ch) \
+ (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2))
+#endif /* DIR_SEPARATOR_2 */
+
+#ifndef PATH_SEPARATOR_2
+# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR)
+#else /* PATH_SEPARATOR_2 */
+# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2)
+#endif /* PATH_SEPARATOR_2 */
+
+#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type)))
+#define XFREE(stale) do { \
+ if (stale) { free ((void *) stale); stale = 0; } \
+} while (0)
+
+/* -DDEBUG is fairly common in CFLAGS. */
+#undef DEBUG
+#if defined DEBUGWRAPPER
+# define DEBUG(format, ...) fprintf(stderr, format, __VA_ARGS__)
+#else
+# define DEBUG(format, ...)
+#endif
+
+const char *program_name = NULL;
+
+void * xmalloc (size_t num);
+char * xstrdup (const char *string);
+const char * base_name (const char *name);
+char * find_executable(const char *wrapper);
+int check_executable(const char *path);
+char * strendzap(char *str, const char *pat);
+void lt_fatal (const char *message, ...);
+
+int
+main (int argc, char *argv[])
+{
+ char **newargz;
+ int i;
+
+ program_name = (char *) xstrdup (base_name (argv[0]));
+ DEBUG("(main) argv[0] : %s\n",argv[0]);
+ DEBUG("(main) program_name : %s\n",program_name);
+ newargz = XMALLOC(char *, argc+2);
+EOF
+
+ cat >> $cwrappersource <<EOF
+ newargz[0] = (char *) xstrdup("$SHELL");
+EOF
+
+ cat >> $cwrappersource <<"EOF"
+ newargz[1] = find_executable(argv[0]);
+ if (newargz[1] == NULL)
+ lt_fatal("Couldn't find %s", argv[0]);
+ DEBUG("(main) found exe at : %s\n",newargz[1]);
+ /* we know the script has the same name, without the .exe */
+ /* so make sure newargz[1] doesn't end in .exe */
+ strendzap(newargz[1],".exe");
+ for (i = 1; i < argc; i++)
+ newargz[i+1] = xstrdup(argv[i]);
+ newargz[argc+1] = NULL;
+
+ for (i=0; i<argc+1; i++)
+ {
+ DEBUG("(main) newargz[%d] : %s\n",i,newargz[i]);
+ ;
+ }
+
+EOF
+
+ case $host_os in
+ mingw*)
+ cat >> $cwrappersource <<EOF
+ execv("$SHELL",(char const **)newargz);
+EOF
+ ;;
+ *)
+ cat >> $cwrappersource <<EOF
+ execv("$SHELL",newargz);
+EOF
+ ;;
+ esac
+
+ cat >> $cwrappersource <<"EOF"
+ return 127;
+}
+
+void *
+xmalloc (size_t num)
+{
+ void * p = (void *) malloc (num);
+ if (!p)
+ lt_fatal ("Memory exhausted");
+
+ return p;
+}
+
+char *
+xstrdup (const char *string)
+{
+ return string ? strcpy ((char *) xmalloc (strlen (string) + 1), string) : NULL
+;
+}
+
+const char *
+base_name (const char *name)
+{
+ const char *base;
+
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+ /* Skip over the disk name in MSDOS pathnames. */
+ if (isalpha ((unsigned char)name[0]) && name[1] == ':')
+ name += 2;
+#endif
+
+ for (base = name; *name; name++)
+ if (IS_DIR_SEPARATOR (*name))
+ base = name + 1;
+ return base;
+}
+
+int
+check_executable(const char * path)
+{
+ struct stat st;
+
+ DEBUG("(check_executable) : %s\n", path ? (*path ? path : "EMPTY!") : "NULL!");
+ if ((!path) || (!*path))
+ return 0;
+
+ if ((stat (path, &st) >= 0) &&
+ (
+ /* MinGW & native WIN32 do not support S_IXOTH or S_IXGRP */
+#if defined (S_IXOTH)
+ ((st.st_mode & S_IXOTH) == S_IXOTH) ||
+#endif
+#if defined (S_IXGRP)
+ ((st.st_mode & S_IXGRP) == S_IXGRP) ||
+#endif
+ ((st.st_mode & S_IXUSR) == S_IXUSR))
+ )
+ return 1;
+ else
+ return 0;
+}
+
+/* Searches for the full path of the wrapper. Returns
+ newly allocated full path name if found, NULL otherwise */
+char *
+find_executable (const char* wrapper)
+{
+ int has_slash = 0;
+ const char* p;
+ const char* p_next;
+ /* static buffer for getcwd */
+ char tmp[LT_PATHMAX + 1];
+ int tmp_len;
+ char* concat_name;
+
+ DEBUG("(find_executable) : %s\n", wrapper ? (*wrapper ? wrapper : "EMPTY!") : "NULL!");
+
+ if ((wrapper == NULL) || (*wrapper == '\0'))
+ return NULL;
+
+ /* Absolute path? */
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+ if (isalpha ((unsigned char)wrapper[0]) && wrapper[1] == ':')
+ {
+ concat_name = xstrdup (wrapper);
+ if (check_executable(concat_name))
+ return concat_name;
+ XFREE(concat_name);
+ }
+ else
+ {
+#endif
+ if (IS_DIR_SEPARATOR (wrapper[0]))
+ {
+ concat_name = xstrdup (wrapper);
+ if (check_executable(concat_name))
+ return concat_name;
+ XFREE(concat_name);
+ }
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+ }
+#endif
+
+ for (p = wrapper; *p; p++)
+ if (*p == '/')
+ {
+ has_slash = 1;
+ break;
+ }
+ if (!has_slash)
+ {
+ /* no slashes; search PATH */
+ const char* path = getenv ("PATH");
+ if (path != NULL)
+ {
+ for (p = path; *p; p = p_next)
+ {
+ const char* q;
+ size_t p_len;
+ for (q = p; *q; q++)
+ if (IS_PATH_SEPARATOR(*q))
+ break;
+ p_len = q - p;
+ p_next = (*q == '\0' ? q : q + 1);
+ if (p_len == 0)
+ {
+ /* empty path: current directory */
+ if (getcwd (tmp, LT_PATHMAX) == NULL)
+ lt_fatal ("getcwd failed");
+ tmp_len = strlen(tmp);
+ concat_name = XMALLOC(char, tmp_len + 1 + strlen(wrapper) + 1);
+ memcpy (concat_name, tmp, tmp_len);
+ concat_name[tmp_len] = '/';
+ strcpy (concat_name + tmp_len + 1, wrapper);
+ }
+ else
+ {
+ concat_name = XMALLOC(char, p_len + 1 + strlen(wrapper) + 1);
+ memcpy (concat_name, p, p_len);
+ concat_name[p_len] = '/';
+ strcpy (concat_name + p_len + 1, wrapper);
+ }
+ if (check_executable(concat_name))
+ return concat_name;
+ XFREE(concat_name);
+ }
+ }
+ /* not found in PATH; assume curdir */
+ }
+ /* Relative path | not found in path: prepend cwd */
+ if (getcwd (tmp, LT_PATHMAX) == NULL)
+ lt_fatal ("getcwd failed");
+ tmp_len = strlen(tmp);
+ concat_name = XMALLOC(char, tmp_len + 1 + strlen(wrapper) + 1);
+ memcpy (concat_name, tmp, tmp_len);
+ concat_name[tmp_len] = '/';
+ strcpy (concat_name + tmp_len + 1, wrapper);
+
+ if (check_executable(concat_name))
+ return concat_name;
+ XFREE(concat_name);
+ return NULL;
+}
+
+char *
+strendzap(char *str, const char *pat)
+{
+ size_t len, patlen;
+
+ assert(str != NULL);
+ assert(pat != NULL);
+
+ len = strlen(str);
+ patlen = strlen(pat);
+
+ if (patlen <= len)
+ {
+ str += len - patlen;
+ if (strcmp(str, pat) == 0)
+ *str = '\0';
+ }
+ return str;
+}
+
+static void
+lt_error_core (int exit_status, const char * mode,
+ const char * message, va_list ap)
+{
+ fprintf (stderr, "%s: %s: ", program_name, mode);
+ vfprintf (stderr, message, ap);
+ fprintf (stderr, ".\n");
+
+ if (exit_status >= 0)
+ exit (exit_status);
+}
+
+void
+lt_fatal (const char *message, ...)
+{
+ va_list ap;
+ va_start (ap, message);
+ lt_error_core (EXIT_FAILURE, "FATAL", message, ap);
+ va_end (ap);
+}
+EOF
+ # we should really use a build-platform specific compiler
+ # here, but OTOH, the wrappers (shell script and this C one)
+ # are only useful if you want to execute the "real" binary.
+ # Since the "real" binary is built for $host, then this
+ # wrapper might as well be built for $host, too.
+ $run $LTCC $LTCFLAGS -s -o $cwrapper $cwrappersource
+ ;;
+ esac
+ $rm $output
+ trap "$rm $output; exit $EXIT_FAILURE" 1 2 15
+
+ $echo > $output "\
+#! $SHELL
+
+# $output - temporary wrapper script for $objdir/$outputname
+# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP
+#
+# The $output program cannot be directly executed until all the libtool
+# libraries that it depends on are installed.
+#
+# This wrapper script should never be moved out of the build directory.
+# If it is, it will not operate correctly.
+
+# Sed substitution that helps us do robust quoting. It backslashifies
+# metacharacters that are still active within double-quoted strings.
+Xsed='${SED} -e 1s/^X//'
+sed_quote_subst='$sed_quote_subst'
+
+# Be Bourne compatible (taken from Autoconf:_AS_BOURNE_COMPATIBLE).
+if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then
+ emulate sh
+ NULLCMD=:
+ # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '\${1+\"\$@\"}'='\"\$@\"'
+ setopt NO_GLOB_SUBST
+else
+ case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac
+fi
+BIN_SH=xpg4; export BIN_SH # for Tru64
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+relink_command=\"$relink_command\"
+
+# This environment variable determines our operation mode.
+if test \"\$libtool_install_magic\" = \"$magic\"; then
+ # install mode needs the following variable:
+ notinst_deplibs='$notinst_deplibs'
+else
+ # When we are sourced in execute mode, \$file and \$echo are already set.
+ if test \"\$libtool_execute_magic\" != \"$magic\"; then
+ echo=\"$qecho\"
+ file=\"\$0\"
+ # Make sure echo works.
+ if test \"X\$1\" = X--no-reexec; then
+ # Discard the --no-reexec flag, and continue.
+ shift
+ elif test \"X\`(\$echo '\t') 2>/dev/null\`\" = 'X\t'; then
+ # Yippee, \$echo works!
+ :
+ else
+ # Restart under the correct shell, and then maybe \$echo will work.
+ exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"}
+ fi
+ fi\
+"
+ $echo >> $output "\
+
+ # Find the directory that this script lives in.
+ thisdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\`
+ test \"x\$thisdir\" = \"x\$file\" && thisdir=.
+
+ # Follow symbolic links until we get to the real thisdir.
+ file=\`ls -ld \"\$file\" | ${SED} -n 's/.*-> //p'\`
+ while test -n \"\$file\"; do
+ destdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\`
+
+ # If there was a directory component, then change thisdir.
+ if test \"x\$destdir\" != \"x\$file\"; then
+ case \"\$destdir\" in
+ [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;;
+ *) thisdir=\"\$thisdir/\$destdir\" ;;
+ esac
+ fi
+
+ file=\`\$echo \"X\$file\" | \$Xsed -e 's%^.*/%%'\`
+ file=\`ls -ld \"\$thisdir/\$file\" | ${SED} -n 's/.*-> //p'\`
+ done
+
+ # Try to get the absolute directory name.
+ absdir=\`cd \"\$thisdir\" && pwd\`
+ test -n \"\$absdir\" && thisdir=\"\$absdir\"
+"
+
+ if test "$fast_install" = yes; then
+ $echo >> $output "\
+ program=lt-'$outputname'$exeext
+ progdir=\"\$thisdir/$objdir\"
+
+ if test ! -f \"\$progdir/\$program\" || \\
+ { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\
+ test \"X\$file\" != \"X\$progdir/\$program\"; }; then
+
+ file=\"\$\$-\$program\"
+
+ if test ! -d \"\$progdir\"; then
+ $mkdir \"\$progdir\"
+ else
+ $rm \"\$progdir/\$file\"
+ fi"
+
+ $echo >> $output "\
+
+ # relink executable if necessary
+ if test -n \"\$relink_command\"; then
+ if relink_command_output=\`eval \$relink_command 2>&1\`; then :
+ else
+ $echo \"\$relink_command_output\" >&2
+ $rm \"\$progdir/\$file\"
+ exit $EXIT_FAILURE
+ fi
+ fi
+
+ $mv \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null ||
+ { $rm \"\$progdir/\$program\";
+ $mv \"\$progdir/\$file\" \"\$progdir/\$program\"; }
+ $rm \"\$progdir/\$file\"
+ fi"
+ else
+ $echo >> $output "\
+ program='$outputname'
+ progdir=\"\$thisdir/$objdir\"
+"
+ fi
+
+ $echo >> $output "\
+
+ if test -f \"\$progdir/\$program\"; then"
+
+ # Export our shlibpath_var if we have one.
+ if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
+ $echo >> $output "\
+ # Add our own library path to $shlibpath_var
+ $shlibpath_var=\"$temp_rpath\$$shlibpath_var\"
+
+ # Some systems cannot cope with colon-terminated $shlibpath_var
+ # The second colon is a workaround for a bug in BeOS R4 sed
+ $shlibpath_var=\`\$echo \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\`
+
+ export $shlibpath_var
+"
+ fi
+
+ # fixup the dll searchpath if we need to.
+ if test -n "$dllsearchpath"; then
+ $echo >> $output "\
+ # Add the dll search path components to the executable PATH
+ PATH=$dllsearchpath:\$PATH
+"
+ fi
+
+ $echo >> $output "\
+ if test \"\$libtool_execute_magic\" != \"$magic\"; then
+ # Run the actual program with our arguments.
+"
+ case $host in
+ # Backslashes separate directories on plain windows
+ *-*-mingw | *-*-os2*)
+ $echo >> $output "\
+ exec \"\$progdir\\\\\$program\" \${1+\"\$@\"}
+"
+ ;;
+
+ *)
+ $echo >> $output "\
+ exec \"\$progdir/\$program\" \${1+\"\$@\"}
+"
+ ;;
+ esac
+ $echo >> $output "\
+ \$echo \"\$0: cannot exec \$program \$*\"
+ exit $EXIT_FAILURE
+ fi
+ else
+ # The program doesn't exist.
+ \$echo \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2
+ \$echo \"This script is just a wrapper for \$program.\" 1>&2
+ $echo \"See the $PACKAGE documentation for more information.\" 1>&2
+ exit $EXIT_FAILURE
+ fi
+fi\
+"
+ chmod +x $output
+ fi
+ exit $EXIT_SUCCESS
+ ;;
+ esac
+
+ # See if we need to build an old-fashioned archive.
+ for oldlib in $oldlibs; do
+
+ if test "$build_libtool_libs" = convenience; then
+ oldobjs="$libobjs_save"
+ addlibs="$convenience"
+ build_libtool_libs=no
+ else
+ if test "$build_libtool_libs" = module; then
+ oldobjs="$libobjs_save"
+ build_libtool_libs=no
+ else
+ oldobjs="$old_deplibs $non_pic_objects"
+ fi
+ addlibs="$old_convenience"
+ fi
+
+ if test -n "$addlibs"; then
+ gentop="$output_objdir/${outputname}x"
+ generated="$generated $gentop"
+
+ func_extract_archives $gentop $addlibs
+ oldobjs="$oldobjs $func_extract_archives_result"
+ fi
+
+ # Do each command in the archive commands.
+ if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then
+ cmds=$old_archive_from_new_cmds
+ else
+ # POSIX demands no paths to be encoded in archives. We have
+ # to avoid creating archives with duplicate basenames if we
+ # might have to extract them afterwards, e.g., when creating a
+ # static archive out of a convenience library, or when linking
+ # the entirety of a libtool archive into another (currently
+ # not supported by libtool).
+ if (for obj in $oldobjs
+ do
+ $echo "X$obj" | $Xsed -e 's%^.*/%%'
+ done | sort | sort -uc >/dev/null 2>&1); then
+ :
+ else
+ $echo "copying selected object files to avoid basename conflicts..."
+
+ if test -z "$gentop"; then
+ gentop="$output_objdir/${outputname}x"
+ generated="$generated $gentop"
+
+ $show "${rm}r $gentop"
+ $run ${rm}r "$gentop"
+ $show "$mkdir $gentop"
+ $run $mkdir "$gentop"
+ exit_status=$?
+ if test "$exit_status" -ne 0 && test ! -d "$gentop"; then
+ exit $exit_status
+ fi
+ fi
+
+ save_oldobjs=$oldobjs
+ oldobjs=
+ counter=1
+ for obj in $save_oldobjs
+ do
+ objbase=`$echo "X$obj" | $Xsed -e 's%^.*/%%'`
+ case " $oldobjs " in
+ " ") oldobjs=$obj ;;
+ *[\ /]"$objbase "*)
+ while :; do
+ # Make sure we don't pick an alternate name that also
+ # overlaps.
+ newobj=lt$counter-$objbase
+ counter=`expr $counter + 1`
+ case " $oldobjs " in
+ *[\ /]"$newobj "*) ;;
+ *) if test ! -f "$gentop/$newobj"; then break; fi ;;
+ esac
+ done
+ $show "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj"
+ $run ln "$obj" "$gentop/$newobj" ||
+ $run cp "$obj" "$gentop/$newobj"
+ oldobjs="$oldobjs $gentop/$newobj"
+ ;;
+ *) oldobjs="$oldobjs $obj" ;;
+ esac
+ done
+ fi
+
+ eval cmds=\"$old_archive_cmds\"
+
+ if len=`expr "X$cmds" : ".*"` &&
+ test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+ cmds=$old_archive_cmds
+ else
+ # the command line is too long to link in one step, link in parts
+ $echo "using piecewise archive linking..."
+ save_RANLIB=$RANLIB
+ RANLIB=:
+ objlist=
+ concat_cmds=
+ save_oldobjs=$oldobjs
+
+ # Is there a better way of finding the last object in the list?
+ for obj in $save_oldobjs
+ do
+ last_oldobj=$obj
+ done
+ for obj in $save_oldobjs
+ do
+ oldobjs="$objlist $obj"
+ objlist="$objlist $obj"
+ eval test_cmds=\"$old_archive_cmds\"
+ if len=`expr "X$test_cmds" : ".*" 2>/dev/null` &&
+ test "$len" -le "$max_cmd_len"; then
+ :
+ else
+ # the above command should be used before it gets too long
+ oldobjs=$objlist
+ if test "$obj" = "$last_oldobj" ; then
+ RANLIB=$save_RANLIB
+ fi
+ test -z "$concat_cmds" || concat_cmds=$concat_cmds~
+ eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\"
+ objlist=
+ fi
+ done
+ RANLIB=$save_RANLIB
+ oldobjs=$objlist
+ if test "X$oldobjs" = "X" ; then
+ eval cmds=\"\$concat_cmds\"
+ else
+ eval cmds=\"\$concat_cmds~\$old_archive_cmds\"
+ fi
+ fi
+ fi
+ save_ifs="$IFS"; IFS='~'
+ for cmd in $cmds; do
+ eval cmd=\"$cmd\"
+ IFS="$save_ifs"
+ $show "$cmd"
+ $run eval "$cmd" || exit $?
+ done
+ IFS="$save_ifs"
+ done
+
+ if test -n "$generated"; then
+ $show "${rm}r$generated"
+ $run ${rm}r$generated
+ fi
+
+ # Now create the libtool archive.
+ case $output in
+ *.la)
+ old_library=
+ test "$build_old_libs" = yes && old_library="$libname.$libext"
+ $show "creating $output"
+
+ # Preserve any variables that may affect compiler behavior
+ for var in $variables_saved_for_relink; do
+ if eval test -z \"\${$var+set}\"; then
+ relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command"
+ elif eval var_value=\$$var; test -z "$var_value"; then
+ relink_command="$var=; export $var; $relink_command"
+ else
+ var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"`
+ relink_command="$var=\"$var_value\"; export $var; $relink_command"
+ fi
+ done
+ # Quote the link command for shipping.
+ relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)"
+ relink_command=`$echo "X$relink_command" | $SP2NL | $Xsed -e "$sed_quote_subst" | $NL2SP`
+ if test "$hardcode_automatic" = yes ; then
+ relink_command=
+ fi
+
+
+ # Only create the output if not a dry run.
+ if test -z "$run"; then
+ for installed in no yes; do
+ if test "$installed" = yes; then
+ if test -z "$install_libdir"; then
+ break
+ fi
+ output="$output_objdir/$outputname"i
+ # Replace all uninstalled libtool libraries with the installed ones
+ newdependency_libs=
+ for deplib in $dependency_libs; do
+ case $deplib in
+ *.la)
+ name=`$echo "X$deplib" | $Xsed -e 's%^.*/%%'`
+ eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
+ if test -z "$libdir"; then
+ $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2
+ exit $EXIT_FAILURE
+ fi
+ newdependency_libs="$newdependency_libs $libdir/$name"
+ ;;
+ *) newdependency_libs="$newdependency_libs $deplib" ;;
+ esac
+ done
+ dependency_libs="$newdependency_libs"
+ newdlfiles=
+ for lib in $dlfiles; do
+ name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'`
+ eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
+ if test -z "$libdir"; then
+ $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
+ exit $EXIT_FAILURE
+ fi
+ newdlfiles="$newdlfiles $libdir/$name"
+ done
+ dlfiles="$newdlfiles"
+ newdlprefiles=
+ for lib in $dlprefiles; do
+ name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'`
+ eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
+ if test -z "$libdir"; then
+ $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
+ exit $EXIT_FAILURE
+ fi
+ newdlprefiles="$newdlprefiles $libdir/$name"
+ done
+ dlprefiles="$newdlprefiles"
+ else
+ newdlfiles=
+ for lib in $dlfiles; do
+ case $lib in
+ [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
+ *) abs=`pwd`"/$lib" ;;
+ esac
+ newdlfiles="$newdlfiles $abs"
+ done
+ dlfiles="$newdlfiles"
+ newdlprefiles=
+ for lib in $dlprefiles; do
+ case $lib in
+ [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
+ *) abs=`pwd`"/$lib" ;;
+ esac
+ newdlprefiles="$newdlprefiles $abs"
+ done
+ dlprefiles="$newdlprefiles"
+ fi
+ $rm $output
+ # place dlname in correct position for cygwin
+ tdlname=$dlname
+ case $host,$output,$installed,$module,$dlname in
+ *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;;
+ esac
+ $echo > $output "\
+# $outputname - a libtool library file
+# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# The name that we can dlopen(3).
+dlname='$tdlname'
+
+# Names of this library.
+library_names='$library_names'
+
+# The name of the static archive.
+old_library='$old_library'
+
+# Libraries that this one depends upon.
+dependency_libs='$dependency_libs'
+
+# Version information for $libname.
+current=$current
+age=$age
+revision=$revision
+
+# Is this an already installed library?
+installed=$installed
+
+# Should we warn about portability when linking against -modules?
+shouldnotlink=$module
+
+# Files to dlopen/dlpreopen
+dlopen='$dlfiles'
+dlpreopen='$dlprefiles'
+
+# Directory that this library needs to be installed in:
+libdir='$install_libdir'"
+ if test "$installed" = no && test "$need_relink" = yes; then
+ $echo >> $output "\
+relink_command=\"$relink_command\""
+ fi
+ done
+ fi
+
+ # Do a symbolic link so that the libtool archive can be found in
+ # LD_LIBRARY_PATH before the program is installed.
+ $show "(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)"
+ $run eval '(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)' || exit $?
+ ;;
+ esac
+ exit $EXIT_SUCCESS
+ ;;
+
+ # libtool install mode
+ install)
+ modename="$modename: install"
+
+ # There may be an optional sh(1) argument at the beginning of
+ # install_prog (especially on Windows NT).
+ if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh ||
+ # Allow the use of GNU shtool's install command.
+ $echo "X$nonopt" | grep shtool > /dev/null; then
+ # Aesthetically quote it.
+ arg=`$echo "X$nonopt" | $Xsed -e "$sed_quote_subst"`
+ case $arg in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ arg="\"$arg\""
+ ;;
+ esac
+ install_prog="$arg "
+ arg="$1"
+ shift
+ else
+ install_prog=
+ arg=$nonopt
+ fi
+
+ # The real first argument should be the name of the installation program.
+ # Aesthetically quote it.
+ arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
+ case $arg in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ arg="\"$arg\""
+ ;;
+ esac
+ install_prog="$install_prog$arg"
+
+ # We need to accept at least all the BSD install flags.
+ dest=
+ files=
+ opts=
+ prev=
+ install_type=
+ isdir=no
+ stripme=
+ for arg
+ do
+ if test -n "$dest"; then
+ files="$files $dest"
+ dest=$arg
+ continue
+ fi
+
+ case $arg in
+ -d) isdir=yes ;;
+ -f)
+ case " $install_prog " in
+ *[\\\ /]cp\ *) ;;
+ *) prev=$arg ;;
+ esac
+ ;;
+ -g | -m | -o) prev=$arg ;;
+ -s)
+ stripme=" -s"
+ continue
+ ;;
+ -*)
+ ;;
+ *)
+ # If the previous option needed an argument, then skip it.
+ if test -n "$prev"; then
+ prev=
+ else
+ dest=$arg
+ continue
+ fi
+ ;;
+ esac
+
+ # Aesthetically quote the argument.
+ arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
+ case $arg in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ arg="\"$arg\""
+ ;;
+ esac
+ install_prog="$install_prog $arg"
+ done
+
+ if test -z "$install_prog"; then
+ $echo "$modename: you must specify an install program" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ if test -n "$prev"; then
+ $echo "$modename: the \`$prev' option requires an argument" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ if test -z "$files"; then
+ if test -z "$dest"; then
+ $echo "$modename: no file or destination specified" 1>&2
+ else
+ $echo "$modename: you must specify a destination" 1>&2
+ fi
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ # Strip any trailing slash from the destination.
+ dest=`$echo "X$dest" | $Xsed -e 's%/$%%'`
+
+ # Check to see that the destination is a directory.
+ test -d "$dest" && isdir=yes
+ if test "$isdir" = yes; then
+ destdir="$dest"
+ destname=
+ else
+ destdir=`$echo "X$dest" | $Xsed -e 's%/[^/]*$%%'`
+ test "X$destdir" = "X$dest" && destdir=.
+ destname=`$echo "X$dest" | $Xsed -e 's%^.*/%%'`
+
+ # Not a directory, so check to see that there is only one file specified.
+ set dummy $files
+ if test "$#" -gt 2; then
+ $echo "$modename: \`$dest' is not a directory" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+ fi
+ case $destdir in
+ [\\/]* | [A-Za-z]:[\\/]*) ;;
+ *)
+ for file in $files; do
+ case $file in
+ *.lo) ;;
+ *)
+ $echo "$modename: \`$destdir' must be an absolute directory name" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ esac
+ done
+ ;;
+ esac
+
+ # This variable tells wrapper scripts just to set variables rather
+ # than running their programs.
+ libtool_install_magic="$magic"
+
+ staticlibs=
+ future_libdirs=
+ current_libdirs=
+ for file in $files; do
+
+ # Do each installation.
+ case $file in
+ *.$libext)
+ # Do the static libraries later.
+ staticlibs="$staticlibs $file"
+ ;;
+
+ *.la)
+ # Check to see that this really is a libtool archive.
+ if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then :
+ else
+ $echo "$modename: \`$file' is not a valid libtool archive" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ library_names=
+ old_library=
+ relink_command=
+ # If there is no directory component, then add one.
+ case $file in
+ */* | *\\*) . $file ;;
+ *) . ./$file ;;
+ esac
+
+ # Add the libdir to current_libdirs if it is the destination.
+ if test "X$destdir" = "X$libdir"; then
+ case "$current_libdirs " in
+ *" $libdir "*) ;;
+ *) current_libdirs="$current_libdirs $libdir" ;;
+ esac
+ else
+ # Note the libdir as a future libdir.
+ case "$future_libdirs " in
+ *" $libdir "*) ;;
+ *) future_libdirs="$future_libdirs $libdir" ;;
+ esac
+ fi
+
+ dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`/
+ test "X$dir" = "X$file/" && dir=
+ dir="$dir$objdir"
+
+ if test -n "$relink_command"; then
+ # Determine the prefix the user has applied to our future dir.
+ inst_prefix_dir=`$echo "$destdir" | $SED "s%$libdir\$%%"`
+
+ # Don't allow the user to place us outside of our expected
+ # location b/c this prevents finding dependent libraries that
+ # are installed to the same prefix.
+ # At present, this check doesn't affect windows .dll's that
+ # are installed into $libdir/../bin (currently, that works fine)
+ # but it's something to keep an eye on.
+ if test "$inst_prefix_dir" = "$destdir"; then
+ $echo "$modename: error: cannot install \`$file' to a directory not ending in $libdir" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ if test -n "$inst_prefix_dir"; then
+ # Stick the inst_prefix_dir data into the link command.
+ relink_command=`$echo "$relink_command" | $SP2NL | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%" | $NL2SP`
+ else
+ relink_command=`$echo "$relink_command" | $SP2NL | $SED "s%@inst_prefix_dir@%%" | $NL2SP`
+ fi
+
+ $echo "$modename: warning: relinking \`$file'" 1>&2
+ $show "$relink_command"
+ if $run eval "$relink_command"; then :
+ else
+ $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2
+ exit $EXIT_FAILURE
+ fi
+ fi
+
+ # See the names of the shared library.
+ set dummy $library_names
+ if test -n "$2"; then
+ realname="$2"
+ shift
+ shift
+
+ srcname="$realname"
+ test -n "$relink_command" && srcname="$realname"T
+
+ # Install the shared library and build the symlinks.
+ $show "$install_prog $dir/$srcname $destdir/$realname"
+ $run eval "$install_prog $dir/$srcname $destdir/$realname" || exit $?
+ if test -n "$stripme" && test -n "$striplib"; then
+ $show "$striplib $destdir/$realname"
+ $run eval "$striplib $destdir/$realname" || exit $?
+ fi
+
+ if test "$#" -gt 0; then
+ # Delete the old symlinks, and create new ones.
+ # Try `ln -sf' first, because the `ln' binary might depend on
+ # the symlink we replace! Solaris /bin/ln does not understand -f,
+ # so we also need to try rm && ln -s.
+ for linkname
+ do
+ if test "$linkname" != "$realname"; then
+ $show "(cd $destdir && { $LN_S -f $realname $linkname || { $rm $linkname && $LN_S $realname $linkname; }; })"
+ $run eval "(cd $destdir && { $LN_S -f $realname $linkname || { $rm $linkname && $LN_S $realname $linkname; }; })"
+ fi
+ done
+ fi
+
+ # Do each command in the postinstall commands.
+ lib="$destdir/$realname"
+ cmds=$postinstall_cmds
+ save_ifs="$IFS"; IFS='~'
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ eval cmd=\"$cmd\"
+ $show "$cmd"
+ $run eval "$cmd" || {
+ lt_exit=$?
+
+ # Restore the uninstalled library and exit
+ if test "$mode" = relink; then
+ $run eval '(cd $output_objdir && $rm ${realname}T && $mv ${realname}U $realname)'
+ fi
+
+ exit $lt_exit
+ }
+ done
+ IFS="$save_ifs"
+ fi
+
+ # Install the pseudo-library for information purposes.
+ name=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+ instname="$dir/$name"i
+ $show "$install_prog $instname $destdir/$name"
+ $run eval "$install_prog $instname $destdir/$name" || exit $?
+
+ # Maybe install the static library, too.
+ test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library"
+ ;;
+
+ *.lo)
+ # Install (i.e. copy) a libtool object.
+
+ # Figure out destination file name, if it wasn't already specified.
+ if test -n "$destname"; then
+ destfile="$destdir/$destname"
+ else
+ destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+ destfile="$destdir/$destfile"
+ fi
+
+ # Deduce the name of the destination old-style object file.
+ case $destfile in
+ *.lo)
+ staticdest=`$echo "X$destfile" | $Xsed -e "$lo2o"`
+ ;;
+ *.$objext)
+ staticdest="$destfile"
+ destfile=
+ ;;
+ *)
+ $echo "$modename: cannot copy a libtool object to \`$destfile'" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ esac
+
+ # Install the libtool object if requested.
+ if test -n "$destfile"; then
+ $show "$install_prog $file $destfile"
+ $run eval "$install_prog $file $destfile" || exit $?
+ fi
+
+ # Install the old object if enabled.
+ if test "$build_old_libs" = yes; then
+ # Deduce the name of the old-style object file.
+ staticobj=`$echo "X$file" | $Xsed -e "$lo2o"`
+
+ $show "$install_prog $staticobj $staticdest"
+ $run eval "$install_prog \$staticobj \$staticdest" || exit $?
+ fi
+ exit $EXIT_SUCCESS
+ ;;
+
+ *)
+ # Figure out destination file name, if it wasn't already specified.
+ if test -n "$destname"; then
+ destfile="$destdir/$destname"
+ else
+ destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+ destfile="$destdir/$destfile"
+ fi
+
+ # If the file is missing, and there is a .exe on the end, strip it
+ # because it is most likely a libtool script we actually want to
+ # install
+ stripped_ext=""
+ case $file in
+ *.exe)
+ if test ! -f "$file"; then
+ file=`$echo $file|${SED} 's,.exe$,,'`
+ stripped_ext=".exe"
+ fi
+ ;;
+ esac
+
+ # Do a test to see if this is really a libtool program.
+ case $host in
+ *cygwin*|*mingw*)
+ wrapper=`$echo $file | ${SED} -e 's,.exe$,,'`
+ ;;
+ *)
+ wrapper=$file
+ ;;
+ esac
+ if (${SED} -e '4q' $wrapper | grep "^# Generated by .*$PACKAGE")>/dev/null 2>&1; then
+ notinst_deplibs=
+ relink_command=
+
+ # Note that it is not necessary on cygwin/mingw to append a dot to
+ # foo even if both foo and FILE.exe exist: automatic-append-.exe
+ # behavior happens only for exec(3), not for open(2)! Also, sourcing
+ # `FILE.' does not work on cygwin managed mounts.
+ #
+ # If there is no directory component, then add one.
+ case $wrapper in
+ */* | *\\*) . ${wrapper} ;;
+ *) . ./${wrapper} ;;
+ esac
+
+ # Check the variables that should have been set.
+ if test -z "$notinst_deplibs"; then
+ $echo "$modename: invalid libtool wrapper script \`$wrapper'" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ finalize=yes
+ for lib in $notinst_deplibs; do
+ # Check to see that each library is installed.
+ libdir=
+ if test -f "$lib"; then
+ # If there is no directory component, then add one.
+ case $lib in
+ */* | *\\*) . $lib ;;
+ *) . ./$lib ;;
+ esac
+ fi
+ libfile="$libdir/"`$echo "X$lib" | $Xsed -e 's%^.*/%%g'` ### testsuite: skip nested quoting test
+ if test -n "$libdir" && test ! -f "$libfile"; then
+ $echo "$modename: warning: \`$lib' has not been installed in \`$libdir'" 1>&2
+ finalize=no
+ fi
+ done
+
+ relink_command=
+ # Note that it is not necessary on cygwin/mingw to append a dot to
+ # foo even if both foo and FILE.exe exist: automatic-append-.exe
+ # behavior happens only for exec(3), not for open(2)! Also, sourcing
+ # `FILE.' does not work on cygwin managed mounts.
+ #
+ # If there is no directory component, then add one.
+ case $wrapper in
+ */* | *\\*) . ${wrapper} ;;
+ *) . ./${wrapper} ;;
+ esac
+
+ outputname=
+ if test "$fast_install" = no && test -n "$relink_command"; then
+ if test "$finalize" = yes && test -z "$run"; then
+ tmpdir=`func_mktempdir`
+ file=`$echo "X$file$stripped_ext" | $Xsed -e 's%^.*/%%'`
+ outputname="$tmpdir/$file"
+ # Replace the output file specification.
+ relink_command=`$echo "X$relink_command" | $SP2NL | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g' | $NL2SP`
+
+ $show "$relink_command"
+ if $run eval "$relink_command"; then :
+ else
+ $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2
+ ${rm}r "$tmpdir"
+ continue
+ fi
+ file="$outputname"
+ else
+ $echo "$modename: warning: cannot relink \`$file'" 1>&2
+ fi
+ else
+ # Install the binary that we compiled earlier.
+ file=`$echo "X$file$stripped_ext" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"`
+ fi
+ fi
+
+ # remove .exe since cygwin /usr/bin/install will append another
+ # one anyway
+ case $install_prog,$host in
+ */usr/bin/install*,*cygwin*)
+ case $file:$destfile in
+ *.exe:*.exe)
+ # this is ok
+ ;;
+ *.exe:*)
+ destfile=$destfile.exe
+ ;;
+ *:*.exe)
+ destfile=`$echo $destfile | ${SED} -e 's,.exe$,,'`
+ ;;
+ esac
+ ;;
+ esac
+ $show "$install_prog$stripme $file $destfile"
+ $run eval "$install_prog\$stripme \$file \$destfile" || exit $?
+ test -n "$outputname" && ${rm}r "$tmpdir"
+ ;;
+ esac
+ done
+
+ for file in $staticlibs; do
+ name=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+
+ # Set up the ranlib parameters.
+ oldlib="$destdir/$name"
+
+ $show "$install_prog $file $oldlib"
+ $run eval "$install_prog \$file \$oldlib" || exit $?
+
+ if test -n "$stripme" && test -n "$old_striplib"; then
+ $show "$old_striplib $oldlib"
+ $run eval "$old_striplib $oldlib" || exit $?
+ fi
+
+ # Do each command in the postinstall commands.
+ cmds=$old_postinstall_cmds
+ save_ifs="$IFS"; IFS='~'
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ eval cmd=\"$cmd\"
+ $show "$cmd"
+ $run eval "$cmd" || exit $?
+ done
+ IFS="$save_ifs"
+ done
+
+ if test -n "$future_libdirs"; then
+ $echo "$modename: warning: remember to run \`$progname --finish$future_libdirs'" 1>&2
+ fi
+
+ if test -n "$current_libdirs"; then
+ # Maybe just do a dry run.
+ test -n "$run" && current_libdirs=" -n$current_libdirs"
+ exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs'
+ else
+ exit $EXIT_SUCCESS
+ fi
+ ;;
+
+ # libtool finish mode
+ finish)
+ modename="$modename: finish"
+ libdirs="$nonopt"
+ admincmds=
+
+ if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
+ for dir
+ do
+ libdirs="$libdirs $dir"
+ done
+
+ for libdir in $libdirs; do
+ if test -n "$finish_cmds"; then
+ # Do each command in the finish commands.
+ cmds=$finish_cmds
+ save_ifs="$IFS"; IFS='~'
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ eval cmd=\"$cmd\"
+ $show "$cmd"
+ $run eval "$cmd" || admincmds="$admincmds
+ $cmd"
+ done
+ IFS="$save_ifs"
+ fi
+ if test -n "$finish_eval"; then
+ # Do the single finish_eval.
+ eval cmds=\"$finish_eval\"
+ $run eval "$cmds" || admincmds="$admincmds
+ $cmds"
+ fi
+ done
+ fi
+
+ # Exit here if they wanted silent mode.
+ test "$show" = : && exit $EXIT_SUCCESS
+
+ $echo "X----------------------------------------------------------------------" | $Xsed
+ $echo "Libraries have been installed in:"
+ for libdir in $libdirs; do
+ $echo " $libdir"
+ done
+ $echo
+ $echo "If you ever happen to want to link against installed libraries"
+ $echo "in a given directory, LIBDIR, you must either use libtool, and"
+ $echo "specify the full pathname of the library, or use the \`-LLIBDIR'"
+ $echo "flag during linking and do at least one of the following:"
+ if test -n "$shlibpath_var"; then
+ $echo " - add LIBDIR to the \`$shlibpath_var' environment variable"
+ $echo " during execution"
+ fi
+ if test -n "$runpath_var"; then
+ $echo " - add LIBDIR to the \`$runpath_var' environment variable"
+ $echo " during linking"
+ fi
+ if test -n "$hardcode_libdir_flag_spec"; then
+ libdir=LIBDIR
+ eval flag=\"$hardcode_libdir_flag_spec\"
+
+ $echo " - use the \`$flag' linker flag"
+ fi
+ if test -n "$admincmds"; then
+ $echo " - have your system administrator run these commands:$admincmds"
+ fi
+ if test -f /etc/ld.so.conf; then
+ $echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'"
+ fi
+ $echo
+ $echo "See any operating system documentation about shared libraries for"
+ $echo "more information, such as the ld(1) and ld.so(8) manual pages."
+ $echo "X----------------------------------------------------------------------" | $Xsed
+ exit $EXIT_SUCCESS
+ ;;
+
+ # libtool execute mode
+ execute)
+ modename="$modename: execute"
+
+ # The first argument is the command name.
+ cmd="$nonopt"
+ if test -z "$cmd"; then
+ $echo "$modename: you must specify a COMMAND" 1>&2
+ $echo "$help"
+ exit $EXIT_FAILURE
+ fi
+
+ # Handle -dlopen flags immediately.
+ for file in $execute_dlfiles; do
+ if test ! -f "$file"; then
+ $echo "$modename: \`$file' is not a file" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ dir=
+ case $file in
+ *.la)
+ # Check to see that this really is a libtool archive.
+ if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then :
+ else
+ $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ # Read the libtool library.
+ dlname=
+ library_names=
+
+ # If there is no directory component, then add one.
+ case $file in
+ */* | *\\*) . $file ;;
+ *) . ./$file ;;
+ esac
+
+ # Skip this library if it cannot be dlopened.
+ if test -z "$dlname"; then
+ # Warn if it was a shared library.
+ test -n "$library_names" && $echo "$modename: warning: \`$file' was not linked with \`-export-dynamic'"
+ continue
+ fi
+
+ dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`
+ test "X$dir" = "X$file" && dir=.
+
+ if test -f "$dir/$objdir/$dlname"; then
+ dir="$dir/$objdir"
+ else
+ if test ! -f "$dir/$dlname"; then
+ $echo "$modename: cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" 1>&2
+ exit $EXIT_FAILURE
+ fi
+ fi
+ ;;
+
+ *.lo)
+ # Just add the directory containing the .lo file.
+ dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`
+ test "X$dir" = "X$file" && dir=.
+ ;;
+
+ *)
+ $echo "$modename: warning \`-dlopen' is ignored for non-libtool libraries and objects" 1>&2
+ continue
+ ;;
+ esac
+
+ # Get the absolute pathname.
+ absdir=`cd "$dir" && pwd`
+ test -n "$absdir" && dir="$absdir"
+
+ # Now add the directory to shlibpath_var.
+ if eval "test -z \"\$$shlibpath_var\""; then
+ eval "$shlibpath_var=\"\$dir\""
+ else
+ eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\""
+ fi
+ done
+
+ # This variable tells wrapper scripts just to set shlibpath_var
+ # rather than running their programs.
+ libtool_execute_magic="$magic"
+
+ # Check if any of the arguments is a wrapper script.
+ args=
+ for file
+ do
+ case $file in
+ -*) ;;
+ *)
+ # Do a test to see if this is really a libtool program.
+ if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+ # If there is no directory component, then add one.
+ case $file in
+ */* | *\\*) . $file ;;
+ *) . ./$file ;;
+ esac
+
+ # Transform arg to wrapped name.
+ file="$progdir/$program"
+ fi
+ ;;
+ esac
+ # Quote arguments (to preserve shell metacharacters).
+ file=`$echo "X$file" | $Xsed -e "$sed_quote_subst"`
+ args="$args \"$file\""
+ done
+
+ if test -z "$run"; then
+ if test -n "$shlibpath_var"; then
+ # Export the shlibpath_var.
+ eval "export $shlibpath_var"
+ fi
+
+ # Restore saved environment variables
+ for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
+ do
+ eval "if test \"\${save_$lt_var+set}\" = set; then
+ $lt_var=\$save_$lt_var; export $lt_var
+ fi"
+ done
+
+ # Now prepare to actually exec the command.
+ exec_cmd="\$cmd$args"
+ else
+ # Display what would be done.
+ if test -n "$shlibpath_var"; then
+ eval "\$echo \"\$shlibpath_var=\$$shlibpath_var\""
+ $echo "export $shlibpath_var"
+ fi
+ $echo "$cmd$args"
+ exit $EXIT_SUCCESS
+ fi
+ ;;
+
+ # libtool clean and uninstall mode
+ clean | uninstall)
+ modename="$modename: $mode"
+ rm="$nonopt"
+ files=
+ rmforce=
+ exit_status=0
+
+ # This variable tells wrapper scripts just to set variables rather
+ # than running their programs.
+ libtool_install_magic="$magic"
+
+ for arg
+ do
+ case $arg in
+ -f) rm="$rm $arg"; rmforce=yes ;;
+ -*) rm="$rm $arg" ;;
+ *) files="$files $arg" ;;
+ esac
+ done
+
+ if test -z "$rm"; then
+ $echo "$modename: you must specify an RM program" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ rmdirs=
+
+ origobjdir="$objdir"
+ for file in $files; do
+ dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`
+ if test "X$dir" = "X$file"; then
+ dir=.
+ objdir="$origobjdir"
+ else
+ objdir="$dir/$origobjdir"
+ fi
+ name=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+ test "$mode" = uninstall && objdir="$dir"
+
+ # Remember objdir for removal later, being careful to avoid duplicates
+ if test "$mode" = clean; then
+ case " $rmdirs " in
+ *" $objdir "*) ;;
+ *) rmdirs="$rmdirs $objdir" ;;
+ esac
+ fi
+
+ # Don't error if the file doesn't exist and rm -f was used.
+ if (test -L "$file") >/dev/null 2>&1 \
+ || (test -h "$file") >/dev/null 2>&1 \
+ || test -f "$file"; then
+ :
+ elif test -d "$file"; then
+ exit_status=1
+ continue
+ elif test "$rmforce" = yes; then
+ continue
+ fi
+
+ rmfiles="$file"
+
+ case $name in
+ *.la)
+ # Possibly a libtool archive, so verify it.
+ if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+ . $dir/$name
+
+ # Delete the libtool libraries and symlinks.
+ for n in $library_names; do
+ rmfiles="$rmfiles $objdir/$n"
+ done
+ test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library"
+
+ case "$mode" in
+ clean)
+ case " $library_names " in
+ # " " in the beginning catches empty $dlname
+ *" $dlname "*) ;;
+ *) rmfiles="$rmfiles $objdir/$dlname" ;;
+ esac
+ test -n "$libdir" && rmfiles="$rmfiles $objdir/$name $objdir/${name}i"
+ ;;
+ uninstall)
+ if test -n "$library_names"; then
+ # Do each command in the postuninstall commands.
+ cmds=$postuninstall_cmds
+ save_ifs="$IFS"; IFS='~'
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ eval cmd=\"$cmd\"
+ $show "$cmd"
+ $run eval "$cmd"
+ if test "$?" -ne 0 && test "$rmforce" != yes; then
+ exit_status=1
+ fi
+ done
+ IFS="$save_ifs"
+ fi
+
+ if test -n "$old_library"; then
+ # Do each command in the old_postuninstall commands.
+ cmds=$old_postuninstall_cmds
+ save_ifs="$IFS"; IFS='~'
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ eval cmd=\"$cmd\"
+ $show "$cmd"
+ $run eval "$cmd"
+ if test "$?" -ne 0 && test "$rmforce" != yes; then
+ exit_status=1
+ fi
+ done
+ IFS="$save_ifs"
+ fi
+ # FIXME: should reinstall the best remaining shared library.
+ ;;
+ esac
+ fi
+ ;;
+
+ *.lo)
+ # Possibly a libtool object, so verify it.
+ if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+
+ # Read the .lo file
+ . $dir/$name
+
+ # Add PIC object to the list of files to remove.
+ if test -n "$pic_object" \
+ && test "$pic_object" != none; then
+ rmfiles="$rmfiles $dir/$pic_object"
+ fi
+
+ # Add non-PIC object to the list of files to remove.
+ if test -n "$non_pic_object" \
+ && test "$non_pic_object" != none; then
+ rmfiles="$rmfiles $dir/$non_pic_object"
+ fi
+ fi
+ ;;
+
+ *)
+ if test "$mode" = clean ; then
+ noexename=$name
+ case $file in
+ *.exe)
+ file=`$echo $file|${SED} 's,.exe$,,'`
+ noexename=`$echo $name|${SED} 's,.exe$,,'`
+ # $file with .exe has already been added to rmfiles,
+ # add $file without .exe
+ rmfiles="$rmfiles $file"
+ ;;
+ esac
+ # Do a test to see if this is a libtool program.
+ if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+ relink_command=
+ . $dir/$noexename
+
+ # note $name still contains .exe if it was in $file originally
+ # as does the version of $file that was added into $rmfiles
+ rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}"
+ if test "$fast_install" = yes && test -n "$relink_command"; then
+ rmfiles="$rmfiles $objdir/lt-$name"
+ fi
+ if test "X$noexename" != "X$name" ; then
+ rmfiles="$rmfiles $objdir/lt-${noexename}.c"
+ fi
+ fi
+ fi
+ ;;
+ esac
+ $show "$rm $rmfiles"
+ $run $rm $rmfiles || exit_status=1
+ done
+ objdir="$origobjdir"
+
+ # Try to remove the ${objdir}s in the directories where we deleted files
+ for dir in $rmdirs; do
+ if test -d "$dir"; then
+ $show "rmdir $dir"
+ $run rmdir $dir >/dev/null 2>&1
+ fi
+ done
+
+ exit $exit_status
+ ;;
+
+ "")
+ $echo "$modename: you must specify a MODE" 1>&2
+ $echo "$generic_help" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ esac
+
+ if test -z "$exec_cmd"; then
+ $echo "$modename: invalid operation mode \`$mode'" 1>&2
+ $echo "$generic_help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+fi # test -z "$show_help"
+
+if test -n "$exec_cmd"; then
+ eval exec $exec_cmd
+ exit $EXIT_FAILURE
+fi
+
+# We need to display help for each of the modes.
+case $mode in
+"") $echo \
+"Usage: $modename [OPTION]... [MODE-ARG]...
+
+Provide generalized library-building support services.
+
+ --config show all configuration variables
+ --debug enable verbose shell tracing
+-n, --dry-run display commands without modifying any files
+ --features display basic configuration information and exit
+ --finish same as \`--mode=finish'
+ --help display this help message and exit
+ --mode=MODE use operation mode MODE [default=inferred from MODE-ARGS]
+ --quiet same as \`--silent'
+ --silent don't print informational messages
+ --tag=TAG use configuration variables from tag TAG
+ --version print version information
+
+MODE must be one of the following:
+
+ clean remove files from the build directory
+ compile compile a source file into a libtool object
+ execute automatically set library path, then run a program
+ finish complete the installation of libtool libraries
+ install install libraries or executables
+ link create a library or an executable
+ uninstall remove libraries from an installed directory
+
+MODE-ARGS vary depending on the MODE. Try \`$modename --help --mode=MODE' for
+a more detailed description of MODE.
+
+Report bugs to <bug-libtool@gnu.org>."
+ exit $EXIT_SUCCESS
+ ;;
+
+clean)
+ $echo \
+"Usage: $modename [OPTION]... --mode=clean RM [RM-OPTION]... FILE...
+
+Remove files from the build directory.
+
+RM is the name of the program to use to delete files associated with each FILE
+(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed
+to RM.
+
+If FILE is a libtool library, object or program, all the files associated
+with it are deleted. Otherwise, only FILE itself is deleted using RM."
+ ;;
+
+compile)
+ $echo \
+"Usage: $modename [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE
+
+Compile a source file into a libtool library object.
+
+This mode accepts the following additional options:
+
+ -o OUTPUT-FILE set the output file name to OUTPUT-FILE
+ -prefer-pic try to building PIC objects only
+ -prefer-non-pic try to building non-PIC objects only
+ -static always build a \`.o' file suitable for static linking
+
+COMPILE-COMMAND is a command to be used in creating a \`standard' object file
+from the given SOURCEFILE.
+
+The output file name is determined by removing the directory component from
+SOURCEFILE, then substituting the C source code suffix \`.c' with the
+library object suffix, \`.lo'."
+ ;;
+
+execute)
+ $echo \
+"Usage: $modename [OPTION]... --mode=execute COMMAND [ARGS]...
+
+Automatically set library path, then run a program.
+
+This mode accepts the following additional options:
+
+ -dlopen FILE add the directory containing FILE to the library path
+
+This mode sets the library path environment variable according to \`-dlopen'
+flags.
+
+If any of the ARGS are libtool executable wrappers, then they are translated
+into their corresponding uninstalled binary, and any of their required library
+directories are added to the library path.
+
+Then, COMMAND is executed, with ARGS as arguments."
+ ;;
+
+finish)
+ $echo \
+"Usage: $modename [OPTION]... --mode=finish [LIBDIR]...
+
+Complete the installation of libtool libraries.
+
+Each LIBDIR is a directory that contains libtool libraries.
+
+The commands that this mode executes may require superuser privileges. Use
+the \`--dry-run' option if you just want to see what would be executed."
+ ;;
+
+install)
+ $echo \
+"Usage: $modename [OPTION]... --mode=install INSTALL-COMMAND...
+
+Install executables or libraries.
+
+INSTALL-COMMAND is the installation command. The first component should be
+either the \`install' or \`cp' program.
+
+The rest of the components are interpreted as arguments to that command (only
+BSD-compatible install options are recognized)."
+ ;;
+
+link)
+ $echo \
+"Usage: $modename [OPTION]... --mode=link LINK-COMMAND...
+
+Link object files or libraries together to form another library, or to
+create an executable program.
+
+LINK-COMMAND is a command using the C compiler that you would use to create
+a program from several object files.
+
+The following components of LINK-COMMAND are treated specially:
+
+ -all-static do not do any dynamic linking at all
+ -avoid-version do not add a version suffix if possible
+ -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime
+ -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols
+ -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3)
+ -export-symbols SYMFILE
+ try to export only the symbols listed in SYMFILE
+ -export-symbols-regex REGEX
+ try to export only the symbols matching REGEX
+ -LLIBDIR search LIBDIR for required installed libraries
+ -lNAME OUTPUT-FILE requires the installed library libNAME
+ -module build a library that can dlopened
+ -no-fast-install disable the fast-install mode
+ -no-install link a not-installable executable
+ -no-undefined declare that a library does not refer to external symbols
+ -o OUTPUT-FILE create OUTPUT-FILE from the specified objects
+ -objectlist FILE Use a list of object files found in FILE to specify objects
+ -precious-files-regex REGEX
+ don't remove output files matching REGEX
+ -release RELEASE specify package release information
+ -rpath LIBDIR the created library will eventually be installed in LIBDIR
+ -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries
+ -static do not do any dynamic linking of uninstalled libtool libraries
+ -static-libtool-libs
+ do not do any dynamic linking of libtool libraries
+ -version-info CURRENT[:REVISION[:AGE]]
+ specify library version info [each variable defaults to 0]
+
+All other options (arguments beginning with \`-') are ignored.
+
+Every other argument is treated as a filename. Files ending in \`.la' are
+treated as uninstalled libtool libraries, other files are standard or library
+object files.
+
+If the OUTPUT-FILE ends in \`.la', then a libtool library is created,
+only library objects (\`.lo' files) may be specified, and \`-rpath' is
+required, except when creating a convenience library.
+
+If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created
+using \`ar' and \`ranlib', or on Windows using \`lib'.
+
+If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file
+is created, otherwise an executable program is created."
+ ;;
+
+uninstall)
+ $echo \
+"Usage: $modename [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE...
+
+Remove libraries from an installation directory.
+
+RM is the name of the program to use to delete files associated with each FILE
+(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed
+to RM.
+
+If FILE is a libtool library, all the files associated with it are deleted.
+Otherwise, only FILE itself is deleted using RM."
+ ;;
+
+*)
+ $echo "$modename: invalid operation mode \`$mode'" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+esac
+
+$echo
+$echo "Try \`$modename --help' for more information about other modes."
+
+exit $?
+
+# The TAGs below are defined such that we never get into a situation
+# in which we disable both kinds of libraries. Given conflicting
+# choices, we go for a static library, that is the most portable,
+# since we can't tell whether shared libraries were disabled because
+# the user asked for that or because the platform doesn't support
+# them. This is particularly important on AIX, because we don't
+# support having both static and shared libraries enabled at the same
+# time on that platform, so we default to a shared-only configuration.
+# If a disable-shared tag is given, we'll fallback to a static-only
+# configuration. But we'll never go from static-only to shared-only.
+
+# ### BEGIN LIBTOOL TAG CONFIG: disable-shared
+disable_libs=shared
+# ### END LIBTOOL TAG CONFIG: disable-shared
+
+# ### BEGIN LIBTOOL TAG CONFIG: disable-static
+disable_libs=static
+# ### END LIBTOOL TAG CONFIG: disable-static
+
+# Local Variables:
+# mode:shell-script
+# sh-indentation:2
+# End:
diff --git a/makecopies.py b/makecopies.py
new file mode 100755
index 0000000..abb3b71
--- /dev/null
+++ b/makecopies.py
@@ -0,0 +1,355 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2009 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+__version__ = '4.0'
+__title__ = "Make Copies Utility"
+__mod__ = 'hp-makecopies'
+__doc__ = "PC initiated make copies function on supported HP AiO and MFP devices. (Note: Currently unsupported in Qt4.)"
+
+# Std Lib
+import sys
+import os
+import getopt
+import re
+import Queue
+import time
+import operator
+
+# Local
+from base.g import *
+from base import utils, device, pml, tui, module
+from copier import copier
+from prnt import cups
+
+
+mod = module.Module(__mod__, __title__, __version__, __doc__, None,
+ (NON_INTERACTIVE_MODE, GUI_MODE),
+ (UI_TOOLKIT_QT3, UI_TOOLKIT_QT4))
+
+mod.setUsage(module.USAGE_FLAG_DEVICE_ARGS,
+ extra_options=[
+ ("Number of copies:", "-m<num_copies> or --copies=<num_copies> or --num=<num_copies> (1-99)", "option", False),
+ ("Reduction/enlargement:", "-r<%> or --reduction=<%> or --enlargement=<%> (25-400%)", "option", False),
+ ("Quality:", "-q<quality> or --quality=<quality> (where quality is: 'fast', 'draft', 'normal', 'presentation', or 'best')", "option", False),
+ ("Contrast:", "-c<contrast> or --contrast=<contrast> (-5 to +5)", "option", False),
+ ("Fit to page (flatbed only):", "-f or --fittopage or --fit (overrides reduction/enlargement)", "option", False)])
+
+opts, device_uri, printer_name, mode, ui_toolkit, loc = \
+ mod.parseStdOpts('m:r:q:c:f',
+ ['num=', 'copies=', 'reduction=', 'enlargement=', 'quality=',
+ 'contrast=', 'fittopage', 'fit', 'fit-to-page'])
+
+device_uri = mod.getDeviceUri(device_uri, printer_name,
+ filter={'copy-type': (operator.gt, 0)})
+
+num_copies = None
+reduction = None
+reduction_spec = False
+contrast = None
+quality = None
+fit_to_page = None
+
+
+for o, a in opts:
+ if o in ('-m', '--num', '--copies'):
+ try:
+ num_copies = int(a)
+ except ValueError:
+ log.warning("Invalid number of copies. Set to default of 1.")
+ num_copies = 1
+
+ if num_copies < 1:
+ log.warning("Invalid number of copies. Set to minimum of 1.")
+ num_copies = 1
+
+ elif num_copies > 99:
+ log.warning("Invalid number of copies. Set to maximum of 99.")
+ num_copies = 99
+
+ elif o in ('-c', '--contrast'):
+ try:
+ contrast = int(a)
+ except ValueError:
+ log.warning("Invalid contrast setting. Set to default of 0.")
+ contrast = 0
+
+ if contrast < -5:
+ log.warning("Invalid contrast setting. Set to minimum of -5.")
+ contrast = -5
+
+ elif contrast > 5:
+ log.warning("Invalid contrast setting. Set to maximum of +5.")
+ contrast = 5
+
+ contrast *= 25
+
+ elif o in ('-q', '--quality'):
+ a = a.lower().strip()
+
+ if a == 'fast':
+ quality = pml.COPIER_QUALITY_FAST
+
+ elif a.startswith('norm'):
+ quality = pml.COPIER_QUALITY_NORMAL
+
+ elif a.startswith('pres'):
+ quality = pml.COPIER_QUALITY_PRESENTATION
+
+ elif a.startswith('draf'):
+ quality = pml.COPIER_QUALITY_DRAFT
+
+ elif a == 'best':
+ quality = pml.COPIER_QUALITY_BEST
+
+ else:
+ log.warning("Invalid quality. Set to default of 'normal'.")
+
+ elif o in ('-r', '--reduction', '--enlargement'):
+ reduction_spec = True
+ try:
+ reduction = int(a.replace('%', ''))
+ except ValueError:
+ log.warning("Invalid reduction %. Set to default of 100%.")
+ reduction = 100
+
+ if reduction < 25:
+ log.warning("Invalid reduction %. Set to minimum of 25%.")
+ reduction = 25
+
+ elif reduction > 400:
+ log.warning("Invalid reduction %. Set to maximum of 400%.")
+ reduction = 400
+
+ elif o in ('-f', '--fittopage', '--fit', '--fit-to-page'):
+ fit_to_page = pml.COPIER_FIT_TO_PAGE_ENABLED
+
+
+
+if fit_to_page == pml.COPIER_FIT_TO_PAGE_ENABLED and reduction_spec:
+ log.warning("Fit to page specfied: Reduction/enlargement parameter ignored.")
+
+
+if mode == GUI_MODE:
+ if ui_toolkit == 'qt3':
+ if not utils.canEnterGUIMode():
+ log.error("%s requires GUI support (try running with --qt4). Also, try using non-interactive (-n) mode." % __mod__)
+ sys.exit(1)
+ else:
+ if not utils.canEnterGUIMode4():
+ log.error("%s requires GUI support (try running with --qt3). Also, try using non-interactive (-n) mode." % __mod__)
+ sys.exit(1)
+
+
+if mode == GUI_MODE:
+ if ui_toolkit == 'qt3':
+ app = None
+ makecopiesdlg = None
+
+ try:
+ from qt import *
+ from ui.makecopiesform import MakeCopiesForm
+ except ImportError:
+ log.error("Unable to load Qt3 support. Is it installed?")
+ sys.exit(1)
+
+ # create the main application object
+ app = QApplication(sys.argv)
+
+ if loc is None:
+ loc = user_conf.get('ui', 'loc', 'system')
+ if loc.lower() == 'system':
+ loc = str(QTextCodec.locale())
+ log.debug("Using system locale: %s" % loc)
+
+ if loc.lower() != 'c':
+ e = 'utf8'
+ try:
+ l, x = loc.split('.')
+ loc = '.'.join([l, e])
+ except ValueError:
+ l = loc
+ loc = '.'.join([loc, e])
+
+ log.debug("Trying to load .qm file for %s locale." % loc)
+ trans = QTranslator(None)
+
+ qm_file = 'hplip_%s.qm' % l
+ log.debug("Name of .qm file: %s" % qm_file)
+ loaded = trans.load(qm_file, prop.localization_dir)
+
+ if loaded:
+ app.installTranslator(trans)
+ else:
+ loc = 'c'
+
+ if loc == 'c':
+ log.debug("Using default 'C' locale")
+ else:
+ log.debug("Using locale: %s" % loc)
+ QLocale.setDefault(QLocale(loc))
+ prop.locale = loc
+ try:
+ locale.setlocale(locale.LC_ALL, locale.normalize(loc))
+ except locale.Error:
+ pass
+
+ bus = ['cups']
+ makecopiesdlg = MakeCopiesForm(bus, device_uri, printer_name,
+ num_copies, contrast, quality,
+ reduction, fit_to_page)
+
+ makecopiesdlg.show()
+ app.setMainWidget(makecopiesdlg)
+
+ try:
+ log.debug("Starting GUI loop...")
+ app.exec_loop()
+ except KeyboardInterrupt:
+ pass
+
+ else: # qt4
+ try:
+ from PyQt4.QtGui import QApplication
+ from ui4.makecopiesdialog import MakeCopiesDialog
+ except ImportError:
+ log.error("Unable to load Qt4 support. Is it installed?")
+ sys.exit(1)
+
+ #try:
+ if 1:
+ app = QApplication(sys.argv)
+
+ dlg = MakeCopiesDialog(None, device_uri)
+ dlg.show()
+ try:
+ log.debug("Starting GUI loop...")
+ app.exec_()
+ except KeyboardInterrupt:
+ sys.exit(0)
+
+ #finally:
+ if 1:
+ sys.exit(0)
+
+
+else: # NON_INTERACTIVE_MODE
+ try:
+ dev = copier.PMLCopyDevice(device_uri, printer_name)
+
+ try:
+ try:
+ dev.open()
+
+ if num_copies is None:
+ result_code, num_copies = dev.getPML(pml.OID_COPIER_NUM_COPIES)
+
+ if contrast is None:
+ result_code, contrast = dev.getPML(pml.OID_COPIER_CONTRAST)
+
+ if reduction is None:
+ result_code, reduction = dev.getPML(pml.OID_COPIER_REDUCTION)
+
+ if quality is None:
+ result_code, quality = dev.getPML(pml.OID_COPIER_QUALITY)
+
+ if fit_to_page is None and dev.copy_type == COPY_TYPE_DEVICE:
+ result_code, fit_to_page = dev.getPML(pml.OID_COPIER_FIT_TO_PAGE)
+ else:
+ fit_to_page = pml.COPIER_FIT_TO_PAGE_DISABLED
+
+ result_code, max_reduction = dev.getPML(pml.OID_COPIER_REDUCTION_MAXIMUM)
+ result_code, max_enlargement = dev.getPML(pml.OID_COPIER_ENLARGEMENT_MAXIMUM)
+
+ except Error, e:
+ log.error(e.msg)
+ sys.exit(1)
+
+ scan_src = dev.mq.get('scan-src', SCAN_SRC_FLATBED)
+ log.debug(scan_src)
+
+ if scan_src == SCAN_SRC_SCROLLFED:
+ fit_to_page = pml.COPIER_FIT_TO_PAGE_DISABLED
+
+ log.debug("num_copies = %d" % num_copies)
+ log.debug("contrast= %d" % contrast)
+ log.debug("reduction = %d" % reduction)
+ log.debug("quality = %d" % quality)
+ log.debug("fit_to_page = %d" % fit_to_page)
+ log.debug("max_reduction = %d" % max_reduction)
+ log.debug("max_enlargement = %d" % max_enlargement)
+ log.debug("scan_src = %d" % scan_src)
+
+ update_queue = Queue.Queue()
+ event_queue = Queue.Queue()
+
+ dev.copy(num_copies, contrast, reduction,
+ quality, fit_to_page, scan_src,
+ update_queue, event_queue)
+
+
+ cont = True
+ while cont:
+ while update_queue.qsize():
+ try:
+ status = update_queue.get(0)
+ except Queue.Empty:
+ break
+
+ if status == copier.STATUS_IDLE:
+ log.debug("Idle")
+ continue
+
+ elif status in (copier.STATUS_SETTING_UP, copier.STATUS_WARMING_UP):
+ log.info("Warming up...")
+ continue
+
+ elif status == copier.STATUS_ACTIVE:
+ log.info("Copying...")
+ continue
+
+ elif status in (copier.STATUS_ERROR, copier.STATUS_DONE):
+
+ if status == copier.STATUS_ERROR:
+ log.error("Copier error!")
+ dev.sendEvent(EVENT_COPY_JOB_FAIL)
+ cont = False
+ break
+
+ elif status == copier.STATUS_DONE:
+ cont = False
+ break
+
+ time.sleep(2)
+
+ finally:
+ dev.close()
+
+ except KeyboardInterrupt:
+ log.error("User interrupt. Canceling...")
+ event_queue.put(copier.COPY_CANCELED)
+ dev.sendEvent(EVENT_COPY_JOB_CANCELED)
+
+ dev.waitForCopyThread()
+ dev.sendEvent(EVENT_END_COPY_JOB)
+ log.info("")
+ log.info("Done.")
+
diff --git a/makeuri.py b/makeuri.py
new file mode 100755
index 0000000..5f6a2b9
--- /dev/null
+++ b/makeuri.py
@@ -0,0 +1,161 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2008 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Authors: Don Welch, Smith Kennedy
+#
+
+__version__ = '5.0'
+__title__ = 'Device URI Creation Utility'
+__mod__ = 'hp-makeuri'
+__doc__ = "Creates device URIs for local and network connected printers for use with CUPS."
+
+# Std Lib
+import sys
+import re
+import getopt
+import os
+
+# Local
+from base.g import *
+from base.codes import *
+from base import device, utils, module
+
+
+USAGE = [ (__doc__, "", "name", True),
+ ("Usage: %s [OPTIONS] [SERIAL NO.|USB ID|IP|DEVNODE]" % __mod__, "", "summary", True),
+ ("[SERIAL NO.|USB ID|IP|DEVNODE]", "", "heading", False),
+ ("USB IDs (usb only):", """"xxx:yyy" where xxx is the USB bus ID and yyy is the USB device ID. The ':' and all leading zeroes must be present.""", 'option', False),
+ ("", """(Use the 'lsusb' command to obtain this information. See Note 1.)""", "option", False),
+ ("IPs (network only):", 'IPv4 address "a.b.c.d" or "hostname"', "option", False),
+ ("DEVNODE (parallel only):", '"/dev/parportX", X=0,1,2,...', "option", False),
+ ("SERIAL NO. (usb and parallel only):", '"serial no."', "option", True),
+ utils.USAGE_OPTIONS,
+ ("To specify the port on a multi-port JetDirect:", "-p<port> or --port=<port> (Valid values are 1\*, 2, and 3. \*default)", "option", False),
+ ("Show the CUPS URI only (quiet mode):", "-c or --cups", "option", False),
+ ("Show the SANE URI only (quiet mode):", "-s or --sane", "option", False),
+ ("Show the HP Fax URI only (quiet mode):", "-f or --fax", "option", False),
+ utils.USAGE_LOGGING1, utils.USAGE_LOGGING2, utils.USAGE_LOGGING3,
+ utils.USAGE_HELP,
+ utils.USAGE_EXAMPLES,
+ ("USB:", "$ hp-makeuri 001:002", "example", False),
+ ("Network:", "$ hp-makeuri 66.35.250.209", "example", False),
+ ("Parallel:", "$ hp-makeuri /dev/parport0", "example", False),
+ ("USB or parallel (using serial number):", "$ hp-makeuri US123456789", "example", False),
+ utils.USAGE_SPACE,
+ utils.USAGE_NOTES,
+ ("1. Example using 'lsusb' to obtain USB bus ID and USB device ID (example only, the values you obtain will differ) :", "", 'note', False),
+ (" $ lsusb", "", 'note', False),
+ (" Bus 003 Device 011: ID 03f0:c202 Hewlett-Packard", "", 'note', False),
+ (" $ hp-makeuri 003:011", "", 'note', False),
+ (" (Note: You may have to run 'lsusb' from /sbin or another location. Use '$ locate lsusb' to determine this.)", "", 'note', True),
+ utils.USAGE_SPACE,
+ utils.USAGE_SEEALSO,
+ ("hp-setup", "", "seealso", False),
+ ]
+
+
+mod = module.Module(__mod__, __title__, __version__, __doc__, USAGE,
+ (INTERACTIVE_MODE,), None, True, True)
+
+opts, device_uri, printer_name, mode, ui_toolkit, lang = \
+ mod.parseStdOpts('p:csf', ['port', 'cups', 'sane', 'fax'],
+ handle_device_printer=False)
+
+try:
+ cups_quiet_mode = False
+ sane_quiet_mode = False
+ fax_quiet_mode = False
+ jd_port = 1
+
+ for o, a in opts:
+ if o in ('-c', '--cups'):
+ cups_quiet_mode = True
+
+ elif o in ('-s', '--sane'):
+ sane_quiet_mode = True
+
+ elif o in ('-f', '--fax'):
+ fax_quiet_mode = True
+
+ elif o in ('-p', '--port'):
+ try:
+ jd_port = int(a)
+ except ValueError:
+ mod.usage(error_msg=["Invalid port number. Must be between 1 and 3 inclusive."])
+
+ elif o == '-g':
+ log.set_level('debug')
+
+
+ quiet_mode = cups_quiet_mode or sane_quiet_mode or fax_quiet_mode
+ mod.quiet = quiet_mode
+
+ #if quiet_mode:
+ # log.set_level('warn')
+
+ #utils.log_title(__title__, __version__)
+ mod.showTitle()
+
+ if len(mod.args) != 1:
+ mod.usage(error_msg=["You must specify one SERIAL NO., IP, USB ID or DEVNODE parameter."])
+
+ param = mod.args[0]
+
+ if 'localhost' in param.lower():
+ mod.usage(error_msg=['Invalid hostname'])
+
+ cups_uri, sane_uri, fax_uri = device.makeURI(param, jd_port)
+
+ if not cups_uri:
+ log.error("Device not found")
+ sys.exit(1)
+
+ if cups_quiet_mode:
+ print cups_uri
+
+ elif not quiet_mode:
+ print "CUPS URI: %s" % cups_uri
+
+ if sane_uri:
+ if sane_quiet_mode:
+ print sane_uri
+
+ elif not quiet_mode:
+ print "SANE URI: %s" % sane_uri
+
+ elif not sane_uri and sane_quiet_mode:
+ log.error("Device does not support scan.")
+
+ if fax_uri:
+ if fax_quiet_mode:
+ print fax_uri
+
+ elif not quiet_mode:
+ print "HP Fax URI: %s" % fax_uri
+
+ elif not fax_uri and fax_quiet_mode:
+ log.error("Device does not support fax.")
+
+except KeyboardInterrupt:
+ log.error("User exit")
+
+if not quiet_mode:
+ log.info("")
+ log.info("Done.")
+
diff --git a/missing b/missing
new file mode 100755
index 0000000..28055d2
--- /dev/null
+++ b/missing
@@ -0,0 +1,376 @@
+#! /bin/sh
+# Common stub for a few missing GNU programs while installing.
+
+scriptversion=2009-04-28.21; # UTC
+
+# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006,
+# 2008, 2009 Free Software Foundation, Inc.
+# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+if test $# -eq 0; then
+ echo 1>&2 "Try \`$0 --help' for more information"
+ exit 1
+fi
+
+run=:
+sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p'
+sed_minuso='s/.* -o \([^ ]*\).*/\1/p'
+
+# In the cases where this matters, `missing' is being run in the
+# srcdir already.
+if test -f configure.ac; then
+ configure_ac=configure.ac
+else
+ configure_ac=configure.in
+fi
+
+msg="missing on your system"
+
+case $1 in
+--run)
+ # Try to run requested program, and just exit if it succeeds.
+ run=
+ shift
+ "$@" && exit 0
+ # Exit code 63 means version mismatch. This often happens
+ # when the user try to use an ancient version of a tool on
+ # a file that requires a minimum version. In this case we
+ # we should proceed has if the program had been absent, or
+ # if --run hadn't been passed.
+ if test $? = 63; then
+ run=:
+ msg="probably too old"
+ fi
+ ;;
+
+ -h|--h|--he|--hel|--help)
+ echo "\
+$0 [OPTION]... PROGRAM [ARGUMENT]...
+
+Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
+error status if there is no known handling for PROGRAM.
+
+Options:
+ -h, --help display this help and exit
+ -v, --version output version information and exit
+ --run try to run the given command, and emulate it if it fails
+
+Supported PROGRAM values:
+ aclocal touch file \`aclocal.m4'
+ autoconf touch file \`configure'
+ autoheader touch file \`config.h.in'
+ autom4te touch the output file, or create a stub one
+ automake touch all \`Makefile.in' files
+ bison create \`y.tab.[ch]', if possible, from existing .[ch]
+ flex create \`lex.yy.c', if possible, from existing .c
+ help2man touch the output file
+ lex create \`lex.yy.c', if possible, from existing .c
+ makeinfo touch the output file
+ tar try tar, gnutar, gtar, then tar without non-portable flags
+ yacc create \`y.tab.[ch]', if possible, from existing .[ch]
+
+Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and
+\`g' are ignored when checking the name.
+
+Send bug reports to <bug-automake@gnu.org>."
+ exit $?
+ ;;
+
+ -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
+ echo "missing $scriptversion (GNU Automake)"
+ exit $?
+ ;;
+
+ -*)
+ echo 1>&2 "$0: Unknown \`$1' option"
+ echo 1>&2 "Try \`$0 --help' for more information"
+ exit 1
+ ;;
+
+esac
+
+# normalize program name to check for.
+program=`echo "$1" | sed '
+ s/^gnu-//; t
+ s/^gnu//; t
+ s/^g//; t'`
+
+# Now exit if we have it, but it failed. Also exit now if we
+# don't have it and --version was passed (most likely to detect
+# the program). This is about non-GNU programs, so use $1 not
+# $program.
+case $1 in
+ lex*|yacc*)
+ # Not GNU programs, they don't have --version.
+ ;;
+
+ tar*)
+ if test -n "$run"; then
+ echo 1>&2 "ERROR: \`tar' requires --run"
+ exit 1
+ elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
+ exit 1
+ fi
+ ;;
+
+ *)
+ if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
+ # We have it, but it failed.
+ exit 1
+ elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
+ # Could not run --version or --help. This is probably someone
+ # running `$TOOL --version' or `$TOOL --help' to check whether
+ # $TOOL exists and not knowing $TOOL uses missing.
+ exit 1
+ fi
+ ;;
+esac
+
+# If it does not exist, or fails to run (possibly an outdated version),
+# try to emulate it.
+case $program in
+ aclocal*)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified \`acinclude.m4' or \`${configure_ac}'. You might want
+ to install the \`Automake' and \`Perl' packages. Grab them from
+ any GNU archive site."
+ touch aclocal.m4
+ ;;
+
+ autoconf*)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified \`${configure_ac}'. You might want to install the
+ \`Autoconf' and \`GNU m4' packages. Grab them from any GNU
+ archive site."
+ touch configure
+ ;;
+
+ autoheader*)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified \`acconfig.h' or \`${configure_ac}'. You might want
+ to install the \`Autoconf' and \`GNU m4' packages. Grab them
+ from any GNU archive site."
+ files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}`
+ test -z "$files" && files="config.h"
+ touch_files=
+ for f in $files; do
+ case $f in
+ *:*) touch_files="$touch_files "`echo "$f" |
+ sed -e 's/^[^:]*://' -e 's/:.*//'`;;
+ *) touch_files="$touch_files $f.in";;
+ esac
+ done
+ touch $touch_files
+ ;;
+
+ automake*)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'.
+ You might want to install the \`Automake' and \`Perl' packages.
+ Grab them from any GNU archive site."
+ find . -type f -name Makefile.am -print |
+ sed 's/\.am$/.in/' |
+ while read f; do touch "$f"; done
+ ;;
+
+ autom4te*)
+ echo 1>&2 "\
+WARNING: \`$1' is needed, but is $msg.
+ You might have modified some files without having the
+ proper tools for further handling them.
+ You can get \`$1' as part of \`Autoconf' from any GNU
+ archive site."
+
+ file=`echo "$*" | sed -n "$sed_output"`
+ test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
+ if test -f "$file"; then
+ touch $file
+ else
+ test -z "$file" || exec >$file
+ echo "#! /bin/sh"
+ echo "# Created by GNU Automake missing as a replacement of"
+ echo "# $ $@"
+ echo "exit 0"
+ chmod +x $file
+ exit 1
+ fi
+ ;;
+
+ bison*|yacc*)
+ echo 1>&2 "\
+WARNING: \`$1' $msg. You should only need it if
+ you modified a \`.y' file. You may need the \`Bison' package
+ in order for those modifications to take effect. You can get
+ \`Bison' from any GNU archive site."
+ rm -f y.tab.c y.tab.h
+ if test $# -ne 1; then
+ eval LASTARG="\${$#}"
+ case $LASTARG in
+ *.y)
+ SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
+ if test -f "$SRCFILE"; then
+ cp "$SRCFILE" y.tab.c
+ fi
+ SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
+ if test -f "$SRCFILE"; then
+ cp "$SRCFILE" y.tab.h
+ fi
+ ;;
+ esac
+ fi
+ if test ! -f y.tab.h; then
+ echo >y.tab.h
+ fi
+ if test ! -f y.tab.c; then
+ echo 'main() { return 0; }' >y.tab.c
+ fi
+ ;;
+
+ lex*|flex*)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified a \`.l' file. You may need the \`Flex' package
+ in order for those modifications to take effect. You can get
+ \`Flex' from any GNU archive site."
+ rm -f lex.yy.c
+ if test $# -ne 1; then
+ eval LASTARG="\${$#}"
+ case $LASTARG in
+ *.l)
+ SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
+ if test -f "$SRCFILE"; then
+ cp "$SRCFILE" lex.yy.c
+ fi
+ ;;
+ esac
+ fi
+ if test ! -f lex.yy.c; then
+ echo 'main() { return 0; }' >lex.yy.c
+ fi
+ ;;
+
+ help2man*)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified a dependency of a manual page. You may need the
+ \`Help2man' package in order for those modifications to take
+ effect. You can get \`Help2man' from any GNU archive site."
+
+ file=`echo "$*" | sed -n "$sed_output"`
+ test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
+ if test -f "$file"; then
+ touch $file
+ else
+ test -z "$file" || exec >$file
+ echo ".ab help2man is required to generate this page"
+ exit $?
+ fi
+ ;;
+
+ makeinfo*)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified a \`.texi' or \`.texinfo' file, or any other file
+ indirectly affecting the aspect of the manual. The spurious
+ call might also be the consequence of using a buggy \`make' (AIX,
+ DU, IRIX). You might want to install the \`Texinfo' package or
+ the \`GNU make' package. Grab either from any GNU archive site."
+ # The file to touch is that specified with -o ...
+ file=`echo "$*" | sed -n "$sed_output"`
+ test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
+ if test -z "$file"; then
+ # ... or it is the one specified with @setfilename ...
+ infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
+ file=`sed -n '
+ /^@setfilename/{
+ s/.* \([^ ]*\) *$/\1/
+ p
+ q
+ }' $infile`
+ # ... or it is derived from the source name (dir/f.texi becomes f.info)
+ test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info
+ fi
+ # If the file does not exist, the user really needs makeinfo;
+ # let's fail without touching anything.
+ test -f $file || exit 1
+ touch $file
+ ;;
+
+ tar*)
+ shift
+
+ # We have already tried tar in the generic part.
+ # Look for gnutar/gtar before invocation to avoid ugly error
+ # messages.
+ if (gnutar --version > /dev/null 2>&1); then
+ gnutar "$@" && exit 0
+ fi
+ if (gtar --version > /dev/null 2>&1); then
+ gtar "$@" && exit 0
+ fi
+ firstarg="$1"
+ if shift; then
+ case $firstarg in
+ *o*)
+ firstarg=`echo "$firstarg" | sed s/o//`
+ tar "$firstarg" "$@" && exit 0
+ ;;
+ esac
+ case $firstarg in
+ *h*)
+ firstarg=`echo "$firstarg" | sed s/h//`
+ tar "$firstarg" "$@" && exit 0
+ ;;
+ esac
+ fi
+
+ echo 1>&2 "\
+WARNING: I can't seem to be able to run \`tar' with the given arguments.
+ You may want to install GNU tar or Free paxutils, or check the
+ command line arguments."
+ exit 1
+ ;;
+
+ *)
+ echo 1>&2 "\
+WARNING: \`$1' is needed, and is $msg.
+ You might have modified some files without having the
+ proper tools for further handling them. Check the \`README' file,
+ it often tells you about the needed prerequisites for installing
+ this package. You may also peek at any GNU archive site, in case
+ some other package would contain this missing \`$1' program."
+ exit 1
+ ;;
+esac
+
+exit 0
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/packaging/change-udev-rules.diff b/packaging/change-udev-rules.diff
new file mode 100644
index 0000000..a791e71
--- /dev/null
+++ b/packaging/change-udev-rules.diff
@@ -0,0 +1,294 @@
+--- data/rules/55-hpmud.rules.orig 2011-12-09 12:19:54.000000000 +0100
++++ data/rules/55-hpmud.rules 2012-01-12 16:20:57.000000000 +0100
+@@ -12,142 +12,186 @@
+ # 3. This rules file is an attempt at being compatable with all distros. Feel free to make your own changes and if you feel your
+ # changes are not distro specific please send your patch to us. 2/11/2009, D Suffield
+ #
++# SUSE changed:
++#
++# ATTRS{idVendor} to ATTR{idVendor} and
++# ATTRS{idProduct to ATTR{idProduct}
++# because ATTRS search all parents which wastes resources
++# while ATTR is sufficient here,
++# see https://bugzilla.novell.com/show_bug.cgi?id=436085
++#
++# MODE="660" to MODE="0664"
++# because it is sufficiently secure to let any user read the device nodes
++# because HPLIP opens the device nodes exclusively so that sniffing
++# of print jobs or scanner image data should not be possible and
++# read permissions for any user is required in particular for USB devices
++# so that any user can see the USB devices when he runs the command "lsusb".
++#
++# Added ENV{sane_hpaio}="yes" to all entries for USB devices
++# to get the SANE driver "hpaio" automatically activated in any case
++# (only scanners in HP parallel port all-in-one devices are ignored)
++# because not only "AiO products (0x03f0xx11)" can have scanner units
++# but also Photosmart products, inkjet printers, and laser printers
++# (e.g. the LaserJet 1220 03f0:0417 has a scanner unit).
++# An activated SANE driver does not cause continuous system load because
++# it is only run when the user launches a scanning frontend (e.g. xsane)
++# and then all what the driver does is to scan the USB device information
++# to find devices which belong to the driver and if nothing found it exits.
++# Additionally see https://bugzilla.novell.com/show_bug.cgi?id=469721#c9
++#
++# Added ENV{libsane_matched}="yes" to all entries for USB devices
++# to get normal user access permissions via udev, see
++# https://bugzilla.novell.com/show_bug.cgi?id=542473#c14
++#
++# Added same rule to disable USB autosuspend
++# as in /etc/udev/rules.d/55-libsane.rules
++#
+
+ ACTION!="add", GOTO="hpmud_rules_end"
+-SUBSYSTEM=="ppdev", OWNER="root", GROUP="lp", MODE="0660"
++SUBSYSTEM=="ppdev", OWNER="root", GROUP="lp", MODE="0664"
+ SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", GOTO="hplip_pid_test"
+ SUBSYSTEM!="usb_device", GOTO="hpmud_rules_end"
+
+ LABEL="hplip_pid_test"
+
+ # Check for AiO products (0x03f0xx11).
+-ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="??11", OWNER="root", GROUP="lp", MODE="660"
++ATTR{idVendor}=="03f0", ATTR{idProduct}=="??11", OWNER="root", GROUP="lp", MODE="0664", ENV{sane_hpaio}="yes", ENV{libsane_matched}="yes"
+
+ # Check for Photosmart products without wildcard since cameras and scanners also used (0x03f0xx02).
+ # The xx02 pid has been retired so this explicit list should not change.
+ # photosmart_d2300_series
+-ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="c302", OWNER="root", GROUP="lp", MODE="660"
++ATTR{idVendor}=="03f0", ATTR{idProduct}=="c302", OWNER="root", GROUP="lp", MODE="0664", ENV{sane_hpaio}="yes", ENV{libsane_matched}="yes"
+ # photosmart_100
+-ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="3802", OWNER="root", GROUP="lp", MODE="660"
++ATTR{idVendor}=="03f0", ATTR{idProduct}=="3802", OWNER="root", GROUP="lp", MODE="0664", ENV{sane_hpaio}="yes", ENV{libsane_matched}="yes"
+ # photosmart_1115
+-ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="3402", OWNER="root", GROUP="lp", MODE="660"
++ATTR{idVendor}=="03f0", ATTR{idProduct}=="3402", OWNER="root", GROUP="lp", MODE="0664", ENV{sane_hpaio}="yes", ENV{libsane_matched}="yes"
+ # photosmart_1215
+-ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="3202", OWNER="root", GROUP="lp", MODE="660"
++ATTR{idVendor}=="03f0", ATTR{idProduct}=="3202", OWNER="root", GROUP="lp", MODE="0664", ENV{sane_hpaio}="yes", ENV{libsane_matched}="yes"
+ # photosmart_1218
+-ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="3302", OWNER="root", GROUP="lp", MODE="660"
++ATTR{idVendor}=="03f0", ATTR{idProduct}=="3302", OWNER="root", GROUP="lp", MODE="0664", ENV{sane_hpaio}="yes", ENV{libsane_matched}="yes"
+ # photosmart_130
+-ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="3902", OWNER="root", GROUP="lp", MODE="660"
++ATTR{idVendor}=="03f0", ATTR{idProduct}=="3902", OWNER="root", GROUP="lp", MODE="0664", ENV{sane_hpaio}="yes", ENV{libsane_matched}="yes"
+ # photosmart_1315
+-ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="3602", OWNER="root", GROUP="lp", MODE="660"
++ATTR{idVendor}=="03f0", ATTR{idProduct}=="3602", OWNER="root", GROUP="lp", MODE="0664", ENV{sane_hpaio}="yes", ENV{libsane_matched}="yes"
+ # photosmart_140_series
+-ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="1002", OWNER="root", GROUP="lp", MODE="660"
++ATTR{idVendor}=="03f0", ATTR{idProduct}=="1002", OWNER="root", GROUP="lp", MODE="0664", ENV{sane_hpaio}="yes", ENV{libsane_matched}="yes"
+ # photosmart_230
+-ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="3502", OWNER="root", GROUP="lp", MODE="660"
++ATTR{idVendor}=="03f0", ATTR{idProduct}=="3502", OWNER="root", GROUP="lp", MODE="0664", ENV{sane_hpaio}="yes", ENV{libsane_matched}="yes"
+ # photosmart_240_series
+-ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="1102", OWNER="root", GROUP="lp", MODE="660"
++ATTR{idVendor}=="03f0", ATTR{idProduct}=="1102", OWNER="root", GROUP="lp", MODE="0664", ENV{sane_hpaio}="yes", ENV{libsane_matched}="yes"
+ # photosmart_320_series
+-ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="1202", OWNER="root", GROUP="lp", MODE="660"
++ATTR{idVendor}=="03f0", ATTR{idProduct}=="1202", OWNER="root", GROUP="lp", MODE="0664", ENV{sane_hpaio}="yes", ENV{libsane_matched}="yes"
+ # photosmart_330_series
+-ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="1602", OWNER="root", GROUP="lp", MODE="660"
++ATTR{idVendor}=="03f0", ATTR{idProduct}=="1602", OWNER="root", GROUP="lp", MODE="0664", ENV{sane_hpaio}="yes", ENV{libsane_matched}="yes"
+ # photosmart_370_series
+-ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="1302", OWNER="root", GROUP="lp", MODE="660"
++ATTR{idVendor}=="03f0", ATTR{idProduct}=="1302", OWNER="root", GROUP="lp", MODE="0664", ENV{sane_hpaio}="yes", ENV{libsane_matched}="yes"
+ # photosmart_380_series
+-ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="1702", OWNER="root", GROUP="lp", MODE="660"
++ATTR{idVendor}=="03f0", ATTR{idProduct}=="1702", OWNER="root", GROUP="lp", MODE="0664", ENV{sane_hpaio}="yes", ENV{libsane_matched}="yes"
+ # photosmart_420_series
+-ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="1502", OWNER="root", GROUP="lp", MODE="660"
++ATTR{idVendor}=="03f0", ATTR{idProduct}=="1502", OWNER="root", GROUP="lp", MODE="0664", ENV{sane_hpaio}="yes", ENV{libsane_matched}="yes"
+ # photosmart_470_series
+-ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="1802", OWNER="root", GROUP="lp", MODE="660"
++ATTR{idVendor}=="03f0", ATTR{idProduct}=="1802", OWNER="root", GROUP="lp", MODE="0664", ENV{sane_hpaio}="yes", ENV{libsane_matched}="yes"
+ # photosmart_7150
+-ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="3a02", OWNER="root", GROUP="lp", MODE="660"
+-ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="3b02", OWNER="root", GROUP="lp", MODE="660"
++ATTR{idVendor}=="03f0", ATTR{idProduct}=="3a02", OWNER="root", GROUP="lp", MODE="0664", ENV{sane_hpaio}="yes", ENV{libsane_matched}="yes"
++ATTR{idVendor}=="03f0", ATTR{idProduct}=="3b02", OWNER="root", GROUP="lp", MODE="0664", ENV{sane_hpaio}="yes", ENV{libsane_matched}="yes"
+ # photosmart_7200_series
+-ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="b002", OWNER="root", GROUP="lp", MODE="660"
++ATTR{idVendor}=="03f0", ATTR{idProduct}=="b002", OWNER="root", GROUP="lp", MODE="0664", ENV{sane_hpaio}="yes", ENV{libsane_matched}="yes"
+ # photosmart_7345
+-ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="2002", OWNER="root", GROUP="lp", MODE="660"
++ATTR{idVendor}=="03f0", ATTR{idProduct}=="2002", OWNER="root", GROUP="lp", MODE="0664", ENV{sane_hpaio}="yes", ENV{libsane_matched}="yes"
+ # photosmart_7350
+-ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="3c02", OWNER="root", GROUP="lp", MODE="660"
++ATTR{idVendor}=="03f0", ATTR{idProduct}=="3c02", OWNER="root", GROUP="lp", MODE="0664", ENV{sane_hpaio}="yes", ENV{libsane_matched}="yes"
+ # photosmart_7400_series
+-ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="b802", OWNER="root", GROUP="lp", MODE="660"
++ATTR{idVendor}=="03f0", ATTR{idProduct}=="b802", OWNER="root", GROUP="lp", MODE="0664", ENV{sane_hpaio}="yes", ENV{libsane_matched}="yes"
+ # photosmart_7550
+-ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="3e02", OWNER="root", GROUP="lp", MODE="660"
++ATTR{idVendor}=="03f0", ATTR{idProduct}=="3e02", OWNER="root", GROUP="lp", MODE="0664", ENV{sane_hpaio}="yes", ENV{libsane_matched}="yes"
+ # photosmart_7600_series
+-ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="b202", OWNER="root", GROUP="lp", MODE="660"
++ATTR{idVendor}=="03f0", ATTR{idProduct}=="b202", OWNER="root", GROUP="lp", MODE="0664", ENV{sane_hpaio}="yes", ENV{libsane_matched}="yes"
+ # photosmart_7700_series
+-ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="b402", OWNER="root", GROUP="lp", MODE="660"
++ATTR{idVendor}=="03f0", ATTR{idProduct}=="b402", OWNER="root", GROUP="lp", MODE="0664", ENV{sane_hpaio}="yes", ENV{libsane_matched}="yes"
+ # photosmart_7800_series
+-ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="c002", OWNER="root", GROUP="lp", MODE="660"
++ATTR{idVendor}=="03f0", ATTR{idProduct}=="c002", OWNER="root", GROUP="lp", MODE="0664", ENV{sane_hpaio}="yes", ENV{libsane_matched}="yes"
+ # photosmart_7900_series
+-ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="b602", OWNER="root", GROUP="lp", MODE="660"
++ATTR{idVendor}=="03f0", ATTR{idProduct}=="b602", OWNER="root", GROUP="lp", MODE="0664", ENV{sane_hpaio}="yes", ENV{libsane_matched}="yes"
+ # photosmart_8000_series
+-ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="c102", OWNER="root", GROUP="lp", MODE="660"
++ATTR{idVendor}=="03f0", ATTR{idProduct}=="c102", OWNER="root", GROUP="lp", MODE="0664", ENV{sane_hpaio}="yes", ENV{libsane_matched}="yes"
+ # photosmart_8100_series
+-ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="ba02", OWNER="root", GROUP="lp", MODE="660"
++ATTR{idVendor}=="03f0", ATTR{idProduct}=="ba02", OWNER="root", GROUP="lp", MODE="0664", ENV{sane_hpaio}="yes", ENV{libsane_matched}="yes"
+ # photosmart_8200_series
+-ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="c202", OWNER="root", GROUP="lp", MODE="660"
++ATTR{idVendor}=="03f0", ATTR{idProduct}=="c202", OWNER="root", GROUP="lp", MODE="0664", ENV{sane_hpaio}="yes", ENV{libsane_matched}="yes"
+ # photosmart_8400_series
+-ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="bb02", OWNER="root", GROUP="lp", MODE="660"
++ATTR{idVendor}=="03f0", ATTR{idProduct}=="bb02", OWNER="root", GROUP="lp", MODE="0664", ENV{sane_hpaio}="yes", ENV{libsane_matched}="yes"
+ # photosmart_8700_series
+-ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="bc02", OWNER="root", GROUP="lp", MODE="660"
++ATTR{idVendor}=="03f0", ATTR{idProduct}=="bc02", OWNER="root", GROUP="lp", MODE="0664", ENV{sane_hpaio}="yes", ENV{libsane_matched}="yes"
+ # photosmart_a310_series
+-ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="1d02", OWNER="root", GROUP="lp", MODE="660"
++ATTR{idVendor}=="03f0", ATTR{idProduct}=="1d02", OWNER="root", GROUP="lp", MODE="0664", ENV{sane_hpaio}="yes", ENV{libsane_matched}="yes"
+ # photosmart_a320_series
+-ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="1e02", OWNER="root", GROUP="lp", MODE="660"
++ATTR{idVendor}=="03f0", ATTR{idProduct}=="1e02", OWNER="root", GROUP="lp", MODE="0664", ENV{sane_hpaio}="yes", ENV{libsane_matched}="yes"
+ # photosmart_a430_series
+-ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="1902", OWNER="root", GROUP="lp", MODE="660"
++ATTR{idVendor}=="03f0", ATTR{idProduct}=="1902", OWNER="root", GROUP="lp", MODE="0664", ENV{sane_hpaio}="yes", ENV{libsane_matched}="yes"
+ # photosmart_a440_series
+-ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="1f02", OWNER="root", GROUP="lp", MODE="660"
++ATTR{idVendor}=="03f0", ATTR{idProduct}=="1f02", OWNER="root", GROUP="lp", MODE="0664", ENV{sane_hpaio}="yes", ENV{libsane_matched}="yes"
+ # photosmart_a510_series
+-ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="1a02", OWNER="root", GROUP="lp", MODE="660"
++ATTR{idVendor}=="03f0", ATTR{idProduct}=="1a02", OWNER="root", GROUP="lp", MODE="0664", ENV{sane_hpaio}="yes", ENV{libsane_matched}="yes"
+ # photosmart_a520_series
+-ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="2602", OWNER="root", GROUP="lp", MODE="660"
++ATTR{idVendor}=="03f0", ATTR{idProduct}=="2602", OWNER="root", GROUP="lp", MODE="0664", ENV{sane_hpaio}="yes", ENV{libsane_matched}="yes"
+ # photosmart_a530_series
+-ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="2b02", OWNER="root", GROUP="lp", MODE="660"
++ATTR{idVendor}=="03f0", ATTR{idProduct}=="2b02", OWNER="root", GROUP="lp", MODE="0664", ENV{sane_hpaio}="yes", ENV{libsane_matched}="yes"
+ # photosmart_a610_series
+-ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="1b02", OWNER="root", GROUP="lp", MODE="660"
++ATTR{idVendor}=="03f0", ATTR{idProduct}=="1b02", OWNER="root", GROUP="lp", MODE="0664", ENV{sane_hpaio}="yes", ENV{libsane_matched}="yes"
+ # photosmart_a620_series
+-ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="2702", OWNER="root", GROUP="lp", MODE="660"
++ATTR{idVendor}=="03f0", ATTR{idProduct}=="2702", OWNER="root", GROUP="lp", MODE="0664", ENV{sane_hpaio}="yes", ENV{libsane_matched}="yes"
+ # photosmart_a630_series
+-ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="2c02", OWNER="root", GROUP="lp", MODE="660"
++ATTR{idVendor}=="03f0", ATTR{idProduct}=="2c02", OWNER="root", GROUP="lp", MODE="0664", ENV{sane_hpaio}="yes", ENV{libsane_matched}="yes"
+ # photosmart_a710_series
+-ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="1c02", OWNER="root", GROUP="lp", MODE="660"
++ATTR{idVendor}=="03f0", ATTR{idProduct}=="1c02", OWNER="root", GROUP="lp", MODE="0664", ENV{sane_hpaio}="yes", ENV{libsane_matched}="yes"
+ # photosmart_a820_series
+-ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="2902", OWNER="root", GROUP="lp", MODE="660"
++ATTR{idVendor}=="03f0", ATTR{idProduct}=="2902", OWNER="root", GROUP="lp", MODE="0664", ENV{sane_hpaio}="yes", ENV{libsane_matched}="yes"
+ # photosmart_d5060_series
+-ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="c802", OWNER="root", GROUP="lp", MODE="660"
++ATTR{idVendor}=="03f0", ATTR{idProduct}=="c802", OWNER="root", GROUP="lp", MODE="0664", ENV{sane_hpaio}="yes", ENV{libsane_matched}="yes"
+ # photosmart_d5100_series
+-ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="c402", OWNER="root", GROUP="lp", MODE="660"
++ATTR{idVendor}=="03f0", ATTR{idProduct}=="c402", OWNER="root", GROUP="lp", MODE="0664", ENV{sane_hpaio}="yes", ENV{libsane_matched}="yes"
+ # photosmart_d6100_series
+-ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="c502", OWNER="root", GROUP="lp", MODE="660"
++ATTR{idVendor}=="03f0", ATTR{idProduct}=="c502", OWNER="root", GROUP="lp", MODE="0664", ENV{sane_hpaio}="yes", ENV{libsane_matched}="yes"
+ # photosmart_d7100_series
+-ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="c602", OWNER="root", GROUP="lp", MODE="660"
++ATTR{idVendor}=="03f0", ATTR{idProduct}=="c602", OWNER="root", GROUP="lp", MODE="0664", ENV{sane_hpaio}="yes", ENV{libsane_matched}="yes"
+ # photosmart_d7300_series
+-ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="c702", OWNER="root", GROUP="lp", MODE="660"
++ATTR{idVendor}=="03f0", ATTR{idProduct}=="c702", OWNER="root", GROUP="lp", MODE="0664", ENV{sane_hpaio}="yes", ENV{libsane_matched}="yes"
+ # photosmart_pro_b8300_series
+-ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="be02", OWNER="root", GROUP="lp", MODE="660"
++ATTR{idVendor}=="03f0", ATTR{idProduct}=="be02", OWNER="root", GROUP="lp", MODE="0664", ENV{sane_hpaio}="yes", ENV{libsane_matched}="yes"
+ # photosmart_b8800_series
+-ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="d002", OWNER="root", GROUP="lp", MODE="660"
++ATTR{idVendor}=="03f0", ATTR{idProduct}=="d002", OWNER="root", GROUP="lp", MODE="0664", ENV{sane_hpaio}="yes", ENV{libsane_matched}="yes"
+ # photosmart_pro_b9100_series
+-ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="bd02", OWNER="root", GROUP="lp", MODE="660"
++ATTR{idVendor}=="03f0", ATTR{idProduct}=="bd02", OWNER="root", GROUP="lp", MODE="0664", ENV{sane_hpaio}="yes", ENV{libsane_matched}="yes"
+ # Photosmart_B8500_series
+-ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="d102", OWNER="root", GROUP="lp", MODE="660"
++ATTR{idVendor}=="03f0", ATTR{idProduct}=="d102", OWNER="root", GROUP="lp", MODE="0664", ENV{sane_hpaio}="yes", ENV{libsane_matched}="yes"
+ # Photosmart_A640_series
+-ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="7902", OWNER="root", GROUP="lp", MODE="660"
++ATTR{idVendor}=="03f0", ATTR{idProduct}=="7902", OWNER="root", GROUP="lp", MODE="0664", ENV{sane_hpaio}="yes", ENV{libsane_matched}="yes"
+
+ # Check for Business Inkjet products (0x03f0xx12).
+-ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="??12", OWNER="root", GROUP="lp", MODE="660"
++ATTR{idVendor}=="03f0", ATTR{idProduct}=="??12", OWNER="root", GROUP="lp", MODE="0664", ENV{sane_hpaio}="yes", ENV{libsane_matched}="yes"
+ # Check for Deskjet products (0x03f0xx04).
+-ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="??04", OWNER="root", GROUP="lp", MODE="660"
++ATTR{idVendor}=="03f0", ATTR{idProduct}=="??04", OWNER="root", GROUP="lp", MODE="0664", ENV{sane_hpaio}="yes", ENV{libsane_matched}="yes"
+ # Check for LaserJet products (0x03f0xx17).
+-ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="??17", OWNER="root", GROUP="lp", MODE="660"
++ATTR{idVendor}=="03f0", ATTR{idProduct}=="??17", OWNER="root", GROUP="lp", MODE="0664", ENV{sane_hpaio}="yes", ENV{libsane_matched}="yes"
+ # Check for LaserJet products (0x03f0xx2a).
+-ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="??2a", OWNER="root", GROUP="lp", MODE="660"
++ATTR{idVendor}=="03f0", ATTR{idProduct}=="??2a", OWNER="root", GROUP="lp", MODE="0664", ENV{sane_hpaio}="yes", ENV{libsane_matched}="yes"
+ # Check for DesignJet product (0x03f0xx14).
+-ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="??14", OWNER="root", GROUP="lp", MODE="660"
++ATTR{idVendor}=="03f0", ATTR{idProduct}=="??14", OWNER="root", GROUP="lp", MODE="0664", ENV{sane_hpaio}="yes", ENV{libsane_matched}="yes"
+
+ # Removed the following rule because FHS states that /etc should be reserved for static files only. This
+ # functionality should be done in a deb/rpm post install script. 2/11/2009, D Suffield
+ #
++# SUSE re-enabled it
++# because it is how it works with SANE regardless what FHS think how it should work.
++# Files in /etc/ are config files which can be adapted as needed during runtime.
++# Adapting /etc/sane.d/dll.conf only during package install time is insufficient
++# because a device may be not connected by the admin during package install time
++# but later during runtime by the system's end-user (e.g. on a company workstation).
++#
+ # If sane-bankends is installed add hpaio backend support to dll.conf if needed.
+-# ENV{sane_hpaio}=="yes", RUN+="/bin/sh -c 'grep -q ^#hpaio /etc/sane.d/dll.conf;if [ $$? -eq 0 ];then sed -i -e s/^#hpaio/hpaio/ /etc/sane.d/dll.conf;else grep -q ^hpaio /etc/sane.d/dll.conf;if [ $$? -ne 0 ];then echo hpaio >>/etc/sane.d/dll.conf;fi;fi'"
++ENV{sane_hpaio}=="yes", RUN+="/bin/sh -c 'grep -q ^#hpaio /etc/sane.d/dll.conf;if [ $$? -eq 0 ];then sed -i -e s/^#hpaio/hpaio/ /etc/sane.d/dll.conf;else grep -q ^hpaio /etc/sane.d/dll.conf;if [ $$? -ne 0 ];then echo hpaio >>/etc/sane.d/dll.conf;fi;fi'"
++
++# The following rule will disable USB autosuspend for the device
++ENV{libsane_matched}=="yes", RUN+="/bin/sh -c 'test -e /sys/$env{DEVPATH}/power/level && echo on > /sys/$env{DEVPATH}/power/level'"
+
+ LABEL="hpmud_rules_end"
+--- data/rules/56-hpmud_support.rules.orig 2011-12-09 12:19:54.000000000 +0100
++++ data/rules/56-hpmud_support.rules 2012-01-12 16:24:00.000000000 +0100
+@@ -1,15 +1,16 @@
+ # HPLIP udev rules file. Notify console user if plugin support is required for this device.
+
+-ACTION!="add", GOTO="hpmud_rules_end"
+-SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", GOTO="pid_test"
+-SUBSYSTEM!="usb_device", GOTO="hpmud_rules_end"
+-
+-LABEL="pid_test"
++ACTION!="add", GOTO="hpmud_support_rules_end"
++SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", GOTO="hpmud_support_pid_test"
++SUBSYSTEM!="usb_device", GOTO="hpmud_support_rules_end"
++
++LABEL="hpmud_support_pid_test"
+
+ # Check for LaserJet products (0x03f0xx17).
+-ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="??17", ENV{hp_model}="$attrs{product}", ENV{hp_test}="yes"
++ATTR{idVendor}=="03f0", ATTR{idProduct}=="??17", ENV{hp_model}="$attrs{product}", ENV{hp_test}="yes"
+ # Check for LaserJet products (0x03f0xx2a).
+-ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="??2a", ENV{hp_model}="$attrs{product}", ENV{hp_test}="yes"
++ATTR{idVendor}=="03f0", ATTR{idProduct}=="??2a", ENV{hp_model}="$attrs{product}", ENV{hp_test}="yes"
+ ENV{hp_test}=="yes", RUN+="/bin/sh -c '/usr/bin/hp-mkuri -c &'"
+
+-LABEL="hpmud_rules_end"
++LABEL="hpmud_support_rules_end"
++
+--- data/rules/86-hpmud_plugin.rules.orig 2011-12-09 12:19:54.000000000 +0100
++++ data/rules/86-hpmud_plugin.rules 2012-01-12 17:07:28.000000000 +0100
+@@ -1,9 +1,9 @@
+ # Load hp firmware for this printer.
+
+-ACTION!="add", GOTO="hpmud_rules_end"
++ACTION!="add", GOTO="hpmud_plugin_rules_end"
+
+ # hp_Marvel_Device (These printer requires the plugin files. installling when device is detected)
+-SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="??17", PROGRAM="/bin/sh -c 'logger -p user.info loading hp_printer_device $env{BUSNUM} $env{DEVNUM}'", RUN+="/bin/sh -c '/usr/bin/hp-check-plugin -m &'"
+-SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="??2a", PROGRAM="/bin/sh -c 'logger -p user.info loading hp_printer_device $env{BUSNUM} $env{DEVNUM}'", RUN+="/bin/sh -c '/usr/bin/hp-check-plugin -m &'"
++SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTR{idVendor}=="03f0", ATTR{idProduct}=="??17", PROGRAM="/bin/sh -c 'logger -p user.info loading hp_printer_device $env{BUSNUM} $env{DEVNUM}'", RUN+="/bin/sh -c '/usr/bin/hp-check-plugin -m &'"
++SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTR{idVendor}=="03f0", ATTR{idProduct}=="??2a", PROGRAM="/bin/sh -c 'logger -p user.info loading hp_printer_device $env{BUSNUM} $env{DEVNUM}'", RUN+="/bin/sh -c '/usr/bin/hp-check-plugin -m &'"
+
+-LABEL="hpmud_rules_end"
++LABEL="hpmud_plugin_rules_end"
diff --git a/packaging/fix-uninitialized-variables.diff b/packaging/fix-uninitialized-variables.diff
new file mode 100644
index 0000000..c84eee3
--- /dev/null
+++ b/packaging/fix-uninitialized-variables.diff
@@ -0,0 +1,11 @@
+--- ip/xmatrix.c.orig 2004-02-18 23:43:44.000000000 +0100
++++ ip/xmatrix.c 2005-05-17 13:48:17.000000000 +0200
+@@ -380,7 +380,7 @@
+
+ while (pwOut < (WORD*)pOutAfter)
+ {
+- int prod0, prod1, prod2;
++ int prod0 = 0, prod1 = 0, prod2 = 0;
+
+ /* The fixed-point calculations below are as follows:
+ * 17.15 = input pixel
diff --git a/packaging/hp-systray.wrapper b/packaging/hp-systray.wrapper
new file mode 100644
index 0000000..60053f1
--- /dev/null
+++ b/packaging/hp-systray.wrapper
@@ -0,0 +1,17 @@
+#! /bin/bash
+
+# Be polite and sleep a bit to let more important processes go ahead
+# (in particular after booting let the cupsd finish its startup):
+sleep 10
+# Run hp-systray only if an appropriate local print queue exists
+# (i.e. on localhost a queue with a "hp:/..." DeviceURI)
+# see https://bugzilla.novell.com/show_bug.cgi?id=649280
+# otherwise and in case of any error do an unnoticeable exit:
+set -o pipefail
+lpstat -h localhost -v | grep -q ': hp:/' || exit 0
+# Replace this wrapper with the actual command
+# so that it exits with the exit code of the command
+# and that the command gets any signals directly,
+# see https://bugzilla.novell.com/show_bug.cgi?id=499735
+exec hp-systray
+
diff --git a/packaging/hpijs.1.gz b/packaging/hpijs.1.gz
new file mode 100644
index 0000000..c810dff
--- /dev/null
+++ b/packaging/hpijs.1.gz
Binary files differ
diff --git a/packaging/hplip-3.9.8-CVE-2010-4267.patch b/packaging/hplip-3.9.8-CVE-2010-4267.patch
new file mode 100644
index 0000000..f146ce8
--- /dev/null
+++ b/packaging/hplip-3.9.8-CVE-2010-4267.patch
@@ -0,0 +1,11 @@
+--- io/hpmud/pml.c.orig 2009-08-04 23:37:25.000000000 +0200
++++ io/hpmud/pml.c 2010-12-17 13:09:28.000000000 +0100
+@@ -504,6 +504,8 @@ enum HPMUD_RESULT hpmud_get_pml(HPMUD_DE
+ p += 2; /* eat type and length */
+ }
+
++ if (dLen > buf_size)
++ dLen = buf_size;
+ memcpy(buf, p, dLen);
+ *bytes_read = dLen;
+ *type = dt;
diff --git a/packaging/hplip.desktop b/packaging/hplip.desktop
new file mode 100644
index 0000000..e1475b5
--- /dev/null
+++ b/packaging/hplip.desktop
@@ -0,0 +1,6 @@
+[Desktop Entry]
+Type=Application
+Name=hp-toolbox
+GenericName=HP Device Manager
+Exec=hp-toolbox
+Icon=HPmenu
diff --git a/packaging/hplip.spec b/packaging/hplip.spec
new file mode 100644
index 0000000..eac46fa
--- /dev/null
+++ b/packaging/hplip.spec
@@ -0,0 +1,1591 @@
+#
+# spec file for package hplip
+#
+# Copyright (c) 2012 SUSE LINUX Products GmbH, Nuernberg, Germany.
+#
+# All modifications and additions to the file contributed by third parties
+# remain the property of their copyright owners, unless otherwise agreed
+# upon. The license for this file, and modifications and additions to the
+# file, is the same license as for the pristine package itself (unless the
+# license for the pristine package is not an Open Source License, in which
+# case the license is the MIT License). An "Open Source License" is a
+# license that conforms to the Open Source Definition (Version 1.9)
+# published by the Open Source Initiative.
+
+# Please submit bugfixes or comments via http://bugs.opensuse.org/
+#
+
+%define _unpackaged_files_terminate_build 0
+
+Name: hplip
+Summary: HP's Printing, Scanning, and Faxing Software
+License: BSD-3-Clause ; GPL-2.0+ ; MIT
+Group: Hardware/Printing
+# HPLIP has reached 1.0 status. With this release a date encoded revision number is used:
+# x.y.m : x = major release number, y = year (eg: 6 = 2006), m = month (eg: 6a = second release in June)
+# Official releases have a 3 digit number and release candidates have a 4 digit number: x.y.m.rc
+Version: 3.12.4
+Release: 12
+Url: http://hplipopensource.com
+# Source0...Source9 is for sources from HP:
+# URL for Source0: http://prdownloads.sourceforge.net/hplip/hplip-3.12.4.tar.gz
+# URL to verify Source0: http://prdownloads.sourceforge.net/hplip/hplip-3.12.4.tar.gz.asc
+# How to verify Source0 see: http://hplipopensource.com/node/327
+# For example: /usr/bin/gpg --keyserver pgp.mit.edu --recv-keys 0xA59047B9
+# /usr/bin/gpg --verify hplip-3.12.4.tar.gz.asc hplip-3.12.4.tar.gz
+# must result: Good signature from "HPLIP (HP Linux Imaging and Printing) <hplip@hp.com>"
+Source0: hplip-%{version}.tar.gz
+BuildRoot: %{_tmppath}/%{name}-%{version}-build
+
+# BuildRequires foomatic-filters to avoid /usr/lib/rpm/brp-symlink ERROR:
+# link target doesn't exist (neither in build root nor in installed system):
+# /usr/lib/cups/filter/foomatic-rip-hplip -> /usr/bin/foomatic-rip
+Requires: cups
+BuildRequires: cups-devel
+#BuildRequires: dbus-1-devel
+#BuildRequires: fdupes
+#BuildRequires: foomatic-filters
+#BuildRequires: hicolor-icon-theme
+#BuildRequires: libdrm-devel
+#BuildRequires: libgphoto2-devel
+BuildRequires: pkgconfig(turbojpeg)
+#BuildRequires: libqt4-devel
+BuildRequires: libtool
+BuildRequires: pkgconfig(libusb)
+#BuildRequires: net-snmp-devel
+BuildRequires: pkgconfig
+# All printer driver packages should have "BuildRequires: python-cups"
+# because python-cups installs special rpm macros that adds Provides tags
+# for the printer drivers supported by the package,
+# see https://bugzilla.novell.com/show_bug.cgi?id=735865
+#BuildRequires: python-cups
+BuildRequires: python-devel
+#BuildRequires: python-openssl
+#BuildRequires: python-qt4
+#BuildRequires: python-xml
+#BuildRequires: readline-devel
+#%if 0%{?suse_version} > 1130
+#BuildRequires: sane-backends-devel
+#%else
+#BuildRequires: sane-backends
+#%endif
+#BuildRequires: update-desktop-files
+# Patch0...Patch9 is for patches from HP:
+# Patch10...Patch99 is for Suse patches for the sources from HP:
+# Patch10 fixes "... is used uninitialized ..." warnings:
+Patch10: fix-uninitialized-variables.diff
+# Patch11 fix_gcc44_glib.diff is obsolete since version 3.9.6b because it is fixed in the source.
+# Patch12 hplip-3.9.8-CVE-2010-4267.patch fixes a remote buffer overflow in hpmud/pml.c:
+Patch12: hplip-3.9.8-CVE-2010-4267.patch
+# Source100... is for special Suse sources:
+# Source100 is the primary source for the suse_update_desktop_file stuff.
+# It is found automatically in $RPM_SOURCE_DIR by 'suse_update_desktop_file -i hplip':
+Source100: hplip.desktop
+# Source101 hp-toolbox.wrapper was a wrapper for hp-toolbox which is no longer needed
+# see https://bugzilla.novell.com/show_bug.cgi?id=755820
+# Source102 is a small man page for /usr/bin/hpijs:
+Source102: hpijs.1.gz
+# Source103 was the init script for hpssd which is obsolete since version 2.8.4.
+# Source104 was a script which outputs a global HAL fdi file which is obsolete
+# since openSUSE 11.2 where HAL is no longer used to manage ACLs,
+# see https://bugzilla.novell.com/show_bug.cgi?id=542473#c13
+# Source105 hplip.SuSEfirewall2 provides support
+# to open UDP ports 5353(mdns) and 427(svrloc) for mDNS support
+# according to the init-suse-firewall in the tar ball
+# (compare also Novell/Suse Bugzilla bnc#498429)
+# hplip.SuSEfirewall2 is no longer provided
+# see https://bugzilla.novell.com/show_bug.cgi?id=757354#c10
+# Source106 is a wrapper for hp-systray which tests via "lpstat"
+# whether or not a 'hp:/...' print queue exists and exits otherwise,
+# see https://bugzilla.novell.com/show_bug.cgi?id=649280
+# hp-systray.wrapper is called via /etc/xdg/autostart/hplip-systray.desktop
+# which is changed accordingly in the install section.
+Source106: hp-systray.wrapper
+# Patch100... is for special Suse patches:
+# Patch101 changes the udev rules files 55-hpmud.rules and 56-hpmud_support.rules:
+Patch101: change-udev-rules.diff
+# Patch102 deactivates the "chgrp lp -R /var/log/hp" in Makefile.am
+# because during install this results "Operation not permitted"
+# this is done in the files section via attr(0774,root,lp)
+# where mode 0774 matches to what is set in Makefile.am:
+Patch102: no-chgrp_lp_hplip_Logdir.diff
+
+# Tizen patch
+# Tizen do not use dbus communication in hpcups filter
+Patch103: tizen_disable_dbus_hpcups.patch
+# Added SIGPIPE, IGN to avoide hpcups crash
+Patch104: tizen_add_sigpipe_ign.patch
+Patch105: tizen_fix_image_align.patch
+Patch106: tizen_fix_debug_log.patch
+
+#PreReq: coreutils
+#PreReq: /bin/grep
+#PreReq: /bin/sed
+#PreReq: /usr/bin/find
+# Require the exact matching version-release of the hpijs sub-package to make sure
+# to have the exact matching version of libhpip and libhpmud installed.
+# The exact matching version-release of the sub-package is available on the same
+# repository where the main-package is (compare the "Recommends: hplip" entry below).
+#Requires: %{name}-hpijs = %{version}-%{release}
+# Same rationale for the sane subpackage.
+#Requires: %{name}-sane = %{version}-%{release}
+# Because foomatic-rip-hplip has CVE-2011-2697 (bnc#698451)
+# plus a leftover in CVE-2004-0801 (bnc#59233)
+# foomatic-rip-hplip is no longer installed and foomatic-rip
+# from the foomatic-filters RPM is used instead.
+# The RPM requirement for foomatic-filters should actually be
+# in the hplip-hpijs sub-package but this would bloat a minimalist system
+# (see the comment for the hplip-hpijs sub-package below).
+# Therefore the hplip main package which is intended
+# to get "all the HPLIP stuff" installed has the RPM requirement:
+#Requires: foomatic-filters
+# foomatic-filters does not require Ghostscript because depending on the PPD
+# (e.g. some PPDs for PostScript printers in OpenPrintingPPDs-postscript)
+# foomatic-rip can also be used without Ghostscript but for the drivers
+# HPIJS and HPCUPS Ghostscript is needed.
+# The RPM requirement for ghostscript should actually be in the
+# hplip-hpijs sub-package but this would bloat a minimalist system
+# (see the comment for the hplip-hpijs sub-package below).
+# Therefore the hplip main package which is intended
+# to get "all the HPLIP stuff" installed has the RPM requirement:
+#Requires: ghostscript
+# Require special Python stuff (which pulls in Python base stuff).
+# At least since openSUSE 11.1 and SLE11 pyxml is no longer required
+# (pyxml was required in particular for openSUSE 10.3 and SLE10,
+# see https://answers.launchpad.net/hplip/+question/25696)
+# but meanwhile python-xml alone is sufficient for "import xml.parsers.expat"
+# see https://bugzilla.novell.com/show_bug.cgi?id=656779#c3
+#Requires: python-xml
+# Since version 3.9.2 by default only Qt4 is used:
+#Requires: python-qt4
+# Since version 2.8.4 all interprocess communication uses dbus.
+# Therefore python-dbus version 0.80 or greater is required (which pulls in dbus base stuff).
+# The dbus stuff in HPLIP requires the Python module gobject
+# but there is no automated RPM requirement for python-gobject2,
+# see https://answers.launchpad.net/hplip/+question/30741
+#Requires: dbus-1-python >= 0.80
+#Requires: python-gobject2
+# Either the hplip17 packages or the hplip packages can be installed,
+# see https://bugzilla.novell.com/show_bug.cgi?id=251830#c20
+# for the full story why there is this unversioned Obsoletes:
+Obsoletes: hplip17
+# Obsolete the hplip3 copy that was introduced for older SLED11-GA HP preloads:
+Provides: hplip3 = 3.9.5
+Obsoletes: hplip3 < 3.9.5
+# Skip testing devel dependencies required by libtool .la files by the following comment:
+# skip-check-libtool-deps
+
+%description
+The Hewlett-Packard Linux Imaging and Printing project (HPLIP) provides
+a unified single and multifunction connectivity solution for HP
+printers and scanners (in particular, HP all-in-one devices).
+
+HPLIP provides unified connectivity for printing, scanning, sending
+faxes, photo card access, and device management and is designed to work
+with CUPS.
+
+It includes the Ghostscript printer driver HPIJS for HP printers and a
+special "hp" CUPS back-end that provides bidirectional communication
+with the device (required for HP printer device management).
+
+It also includes the SANE scanner driver "hpaio" for HP all-in-one
+devices. Basic PC send fax functionality is supported on a number of
+devices.
+
+The special "hpfax" CUPS back-end is required to send faxes. Direct
+uploading (i.e. without print and scan) of received faxes from the
+device to the PC is not supported.
+
+The "hp-toolbox" program is provided for device management.
+
+The "hp-sendfax" program must be used to send faxes.
+
+The "hp-setup" program can be used to set up HP all-in-one devices.
+
+The HPLIP project is open source software and uses GPL-compatible
+licenses. For more information, see:
+
+http://hplipopensource.com
+
+/usr/share/doc/packages/hplip/index.html
+
+
+#%package hpijs
+#Summary: Only plain printing with HPLIP printer drivers
+#Group: Hardware/Printing
+# Since Nov 14 2007 ghostscript-library does no longer require /usr/bin/hpijs
+# but only "Suggests hplip-hpijs" (see Novell/Suse Bugzilla bnc#341564).
+# Have the matching "reverse suggests" = "Enhances" here
+# to document the ghostscript <-> hplip-hpijs relationship:
+#Enhances: ghostscript
+# On a minimalist system only hplip-hpijs may be installed
+# or on a minimalist package repository (e.g. on the openSUSE CDs)
+# only hplip-hpijs may be available (even when a usual system is installed).
+# When only hplip-hpijs is there, it should tell the dependency resolver
+# that for usual functionality, hplip should be installed too (if possible).
+# Unfortunately the installer ignores suggested packages silently
+# but on the other hand I cannot use "Recommends hplip" here
+# because the installer installs recommended packages silently
+# which would bloat a minimal selection (when hplip is available to be installed)
+# because the minimal selection contains hplip-hpijs which recommends hplip
+# so that the installer installs hplip and all what this requires silently
+# see https://bugzilla.novell.com/show_bug.cgi?id=546893
+# Require only the matching version of the hplip main-package
+# (compare the "Requires: hplip-hpijs" entry above) but do not depend
+# on the exact matching release because the exact matching release
+# may be not available to be installed (e.g. when hplip-hpijs-1.2.3-4.5 is
+# installed from the openSUSE CDs but on our official online repository
+# only hplip-1.2.3-6.7 is available which should usually also work):
+#Suggests: %{name} = %{version}
+# hpijs-standalone was a stand-alone minimalist package
+# which is no longer provided since a long time.
+# hplip-hpijs and hpijs-standalone both contain /usr/bin/hpijs
+# so that both packages have a RPM conflict which should
+# be solved by a silent replacement of the old hpijs-standalone.
+# This Obsoletes is intentionally unversioned because
+# hplip-hpijs should replace any version of hpijs-standalone.
+#Obsoletes: hpijs-standalone
+# Either the hplip17 packages or the hplip packages can be installed,
+# see https://bugzilla.novell.com/show_bug.cgi?id=251830#c20
+# for the full story why there is this unversioned Obsoletes:
+#Obsoletes: hplip17-hpijs
+# Obsolete the hplip3 copy that was introduced for older SLED11-GA HP preloads:
+#Provides: hplip3-hpijs = 3.9.5
+#Obsoletes: hplip3-hpijs < 3.9.5
+# PackMan provides HPLIP in the packages hplip and hplip-hpcups.
+# HPLIP does not work if the openSUSE packages hplip and hplip-hpijs
+# are installed together with a leftover PackMan package hplip-hpcups
+# see https://bugzilla.novell.com/show_bug.cgi?id=515005#c17
+# This Obsoletes is intentionally unversioned because
+# the openSUSE package hplip-hpijs must replace
+# any version of PackMan's hplip-hpcups package.
+#Obsoletes: hplip-hpcups
+
+#%description hpijs
+#HPIJS is HPLIP's Ghostscript printer driver for HP printers.
+#HPCUPS is HPLIP's native CUPS printer driver for HP printers.
+
+#This sub-package includes only what is needed for plain printing
+#with the printer drivers in HPLIP for standard HP printers.
+
+#It does neither provide device status information,
+#nor support for scanning, nor support for faxing,
+#nor support for memory card (mass storage) access,
+#nor support for non-standard devices e.g. no support
+#for devices which require an additional plugin from HP.
+
+#This sub-package includes in particular:
+
+#The hpijs binary and the libraries libhpip and libhpmud
+#which are needed to run it.
+
+#The HPCUPS driver (/usr/lib[64]/cups/filter/hpcups).
+
+#The CUPS backend "hp".
+
+#All HPLIP PPD files (also for HP PostScript printers).
+
+#For the full-featured HPLIP printing and scanning solution,
+#the main-package package hplip must be installed.
+
+#For full documentation and license see the main-package hplip.
+
+
+#%package sane
+#Summary: Only plain scanning with HPLIP scan drivers
+#Group: Hardware/Scanner
+# Require the exact matching version-release of the hpijs sub-package to make sure
+# to have the exact matching version of libhpip and libhpmud installed.
+# A wrong library version may let libsane-hpaio crash (e.g. segfault)
+# which lets the whole scanning stack frontend<->libsane-dll<->libsane-backend crash
+# also for any other backend when the hpaio backend is enabled (e.g. "scanimage -L"):
+#Requires: %{name}-hpijs = %{version}-%{release}
+# See comment in hpijs sub-package for same Suggests:
+#Suggests: %{name} = %{version}
+# Automatically install this package if hpijs sub-package and sane-backends are
+# both installed:
+#Supplements: packageand(%{name}-hpijs:sane-backends)
+#Enhances: sane-backends
+
+#%description sane
+#This sub-package includes only what is needed for plain scanning
+#with the scan drivers in HPLIP for standard HP all-in-one printers.
+
+%prep
+# Be quiet when unpacking:
+%setup -q
+# Patch10 fix-uninitialized-variables.diff
+# fixes "... is used uninitialized ..." warnings:
+%patch10
+# Patch12 hplip-3.9.8-CVE-2010-4267.patch
+# fixes a remote buffer overflow in hpmud/pml.c:
+%patch12
+# Patch101 change-udev-rules.diff
+# changes the udev rules files 55-hpmud.rules and 56-hpmud_support.rules:
+%patch101
+# Patch102 deactivates the "chgrp lp -R /var/log/hp" in Makefile.am
+# because during install this results "Operation not permitted"
+# this is done in the files section via attr(0774,root,lp)
+# where mode 0774 matches to what is set in Makefile.am:
+%patch102
+%patch103
+%patch104
+%patch105
+%patch106
+
+%build
+# If AUTOMAKE='automake --foreign' is not set, autoreconf (in fact automake)
+# complains about missing files like NEWS, README, AUTHORS, ChangeLog
+# in each directory where a Makefile.am exists:
+AUTOMAKE='automake --foreign' autoreconf --force --install
+# Set our preferred architecture-specific flags for the compiler and linker:
+export CFLAGS="$RPM_OPT_FLAGS"
+export CXXFLAGS="$RPM_OPT_FLAGS -fno-strict-aliasing"
+# Static "hpijs" PPD files via enable-foomatic-ppd-install
+# require foomatic-rip-hplip via their cupsFilter entries
+# so that enable-foomatic-rip-hplip-install is also needed.
+# Since version 3.9.6 the default printer driver install changed from hpijs to hpcups.
+# According to http://hplipopensource.com/hplip-web/release_notes.html
+# all drv installs require CUPSDDK 1.2.3 or higher.
+# Otherwise a static PPD install must be performed.
+# Furthermore dynamic PPDs will be deprecated in the future in CUPS,
+# see http://www.cups.org/str.php?L3772
+# For hpcups static PPD install one needs:
+# --enable-hpcups-install enable hpcups install (default=yes)
+# --disable-cups-drv-install enable cups dynamic ppd install (default=yes)
+# --enable-cups-ppd-install enable cups static ppd install (default=no)
+# For both hpcups and hpijs install with static PPDs one needs additionally:
+# --enable-hpijs-install enable hpijs install (default=no)
+# --disable-foomatic-drv-install enable foomatic dynamic ppd install (default=no), uses drvdir and hpppddir
+# --enable-foomatic-ppd-install enable foomatic static ppd install (default=no), uses hpppddir
+# --enable-foomatic-rip-hplip-install enable foomatic-rip-hplip install (default=no), uses cupsfilterdir
+# Because foomatic-rip-hplip has CVE-2011-2697 (bnc#698451) plus a leftover in CVE-2004-0801 (bnc#59233)
+# which are fixed up to openSUSE 11.4 with patches, after openSUSE 11.4 (i.e. since openSUSE 12.1)
+# foomatic-rip-hplip is no longer installed and foomatic-rip from foomatic-filters is used instead so that
+# --disable-foomatic-rip-hplip-install is explicitly set and as a consequence the "cupsFilter" entries
+# in the static PPDs are changed in the install section to use foomatic-rip.
+./configure --prefix=/usr \
+ --libdir=%{_libdir} \
+ --prefix=/usr \
+ --localstatedir=/var \
+ --sysconfdir=/opt/etc \
+ --mandir=\$${prefix}/share/man \
+ --infodir=\$${prefix}/share/info \
+ --docdir=\$${prefix}/share/doc/hplip \
+ --with-docdir=\$${prefix}/share/doc/hplip \
+ --disable-qt3 \
+ --disable-qt4 \
+ --disable-policykit \
+ --disable-doc-build \
+ --disable-network-build \
+ --disable-pp-build \
+ --disable-scan-build \
+ --disable-gui-build \
+ --disable-fax-build \
+ --disable-dbus-build \
+ --enable-hpcups-install \
+ --disable-cups-drv-install \
+ --disable-cups-ppd-install \
+ --disable-hpijs-install \
+ --disable-foomatic-drv-install \
+ --disable-foomatic-ppd-install \
+ --disable-foomatic-rip-hplip-install \
+ --with-hpppddir=%{_datadir}/cups/model/manufacturer-PPDs/%{name} \
+ --with-cupsbackenddir=/usr/lib/cups/backend \
+ --with-cupsfilterdir=/usr/lib/cups/filter
+# --with-drvdir=/usr/lib/cups/driver \
+# --with-mimedir=%{_sysconfdir}/cups \
+# --with-docdir=%{_defaultdocdir}/%{name}
+make
+
+%install
+make install DESTDIR=%{buildroot}
+
+mkdir -p %{buildroot}/usr/share/license
+cp %{_builddir}/%{buildsubdir}/COPYING %{buildroot}/usr/share/license/%{name}
+
+# Remove the installed /etc/sane.d/dll.conf
+# because this is provided by the sane-backends package:
+#rm %{buildroot}%{_sysconfdir}/sane.d/dll.conf
+# Remove the installed HAL fdi file because HAL is no longer used (HAL is deprecated):
+#rm %{buildroot}%{_datadir}/hal/fdi/preprobe/10osvendor/20-hplip-devices.fdi
+# Remove the outdated "Check and add printer for Suse 10.3 distro" udev rule
+# and let the build fail if it does no longer match to notify about the change:
+#grep 'for Suse 10.3 distro' %{buildroot}%{_sysconfdir}/udev/rules.d/56-hpmud_add_printer.rules || exit 1
+#sed -i -e '/for Suse 10.3 distro/,+1 d' %{buildroot}%{_sysconfdir}/udev/rules.d/56-hpmud_add_printer.rules
+# Begin "General tests and adjustments for all PPDs" (see manufacturer-PPDs.spec):
+#pushd %{buildroot}%{_datadir}/cups/model/manufacturer-PPDs/%{name}
+# Do not pollute the build log file with zillions of meaningless messages:
+#set +x
+#gunzip *.ppd.gz
+# Make some general tests and adjustments for all PPDs:
+#echo "Making some general tests and adjustments for all PPDs:"
+# Add a line-feed to the end of all PPDs to fix those PPDs where it is missing.
+# See Novell/Suse Bugzilla bug #309832: Unix/Linux text files must end with a line-feed.
+# Otherwise reading the last line results EOF and then some programs may ignore the last line.
+#echo "Adding a line-feed to the end of all PPDs to fix those PPDs where it is missing..."
+#for p in *.ppd
+#do echo -en '\n' >>$p
+#done
+# Because foomatic-rip-hplip has CVE-2011-2697 (bnc#698451) plus a leftover in CVE-2004-0801 (bnc#59233)
+# foomatic-rip-hplip is no longer installed and foomatic-rip from foomatic-filters is used instead so that
+# the "cupsFilter" entries in the static PPDs must be changed accordingly:
+#echo "Replacing insecure foomatic-rip-hplip with foomatic-rip everywhere in in the PPDs..."
+#for p in *.ppd
+#do sed -i -e 's/foomatic-rip-hplip/foomatic-rip/' $p
+#done
+# Final test by cupstestppd:
+# To save disk space gzip the files (gzipped PPDs can also be used by CUPS).
+# Future goal: Only have files which don't FAIL for cupstestppd.
+# Ignore FAILs because of errors in UIConstraints and/or NonUIConstraints
+# which are detected since cupstestppd in CUPS > 1.2.7 (i.e. in openSUSE 10.3).
+# See Novell/Suse Bugzilla bug #309822: When this bug is fixed, cupstestppd would
+# no longer result zero exit code.
+# In the long run the PPDs should be fixed but as far as we know there have been
+# no problems because of such UIConstraints errors so that it should be o.k.
+# let those PPDs pass even if they are not strictly compliant.
+# Ignore FAILs because of missing cupsFilter programs because
+# in the package build environment the usual HPLIP filters
+# like "hpcups" and "hpcupsfax" are
+# installed at an unusual place (in the BuildRoot directory).
+# For now keep all PPDs even if cupstestppd FAILs.
+# Reason:
+# With each CUPS version upgrade cupstestppd finds more and more errors
+# so that more and more PPDs would be no longer included in the RPM
+# which have been included before which results a regression.
+# As far as we know there have been no problems at all because of
+# not strictly compliant PPDs in HPLIP so that it is much better
+# to provide all HPLIP PPDs so that the matching printers can be used
+# than to be rigorous regarding enforcing compliance to the PPD specification:
+#echo "Final testing by cupstestppd..."
+#for p in *.ppd
+#do grep -E -v '^\*UIConstraints:|^\*NonUIConstraints:|^\*cupsFilter:' $p | cupstestppd - || true
+# gzip $p
+#done
+#echo "End of general tests and adjustments for all PPDs."
+# Switch back to the usual build log messages:
+#set -x
+# End of "General tests and adjustments for all PPDs":
+#popd
+# Because foomatic-rip-hplip has CVE-2011-2697 (bnc#698451)
+# plus a leftover in CVE-2004-0801 (bnc#59233)
+# foomatic-rip-hplip is no longer installed and foomatic-rip
+# from the foomatic-filters RPM must be used instead.
+# To be backward compatible with PPDs in /etc/cups/ppd/
+# for existing print queues a compatibility link
+# /usr/lib/cups/filter/foomatic-rip-hplip
+# which points to foomatic-rip is installed:
+#ln -s ../../../bin/foomatic-rip %{buildroot}/usr/lib/cups/filter/foomatic-rip-hplip
+# Begin "Desktop menue entry stuff":
+# Install /usr/share/hplip/data/images/64x64/hp_logo.png as desktop icon file
+# because it is used in the hplip.desktop.in and hplip-systray.desktop.in sources:
+#install -D -m 644 %{buildroot}%{_datadir}/hplip/data/images/32x32/hp_logo.png %{buildroot}%{_datadir}/icons/hicolor/32x32/apps/HPmenu.png
+#install -D -m 644 %{buildroot}%{_datadir}/hplip/data/images/64x64/hp_logo.png %%{buildroot}%{_datadir}/icons/hicolor/64x64/apps/HPmenu.png
+#install -D -m 644 %{buildroot}%{_datadir}/hplip/data/images/128x128/hp_logo.png %{buildroot}%{_datadir}/icons/hicolor/128x128/apps/HPmenu.png
+#install -D -m 644 %{buildroot}%{_datadir}/hplip/data/images/256x256/hp_logo.png %{buildroot}%{_datadir}/icons/hicolor/256x256/apps/HPmenu.png
+# Set up and install the desktop menue entry stuff using "Categories=System;Monitor;"
+# and remove HP's hplip.desktop and hplip-systray.desktop files before because we use Source100:
+# (additionally there is/was a typo in HP's install because of the trailing blank at 'applications ')
+#rm %{buildroot}%{_datadir}/applications/hplip*.desktop
+#%suse_update_desktop_file -i %{name} System HardwareSettings Printing
+# Let suse_update_desktop_file add X-SuSE-translate key to /etc/xdg/autostart/hplip-systray.desktop
+# so that we can update its translations with translation-only packages.
+#%suse_update_desktop_file %{buildroot}/etc/xdg/autostart/hplip-systray.desktop
+# End of "Desktop menue entry stuff".
+# Install the man page for /usr/bin/hpijs:
+#install -d %{buildroot}%{_mandir}/man1
+#install -m 644 %{SOURCE102} %{buildroot}%{_mandir}/man1/
+# Begin "Desktop autostart notification tray stuff":
+# Install the wrapper for hp-systray:
+#install -m 755 %{SOURCE106} %{buildroot}%{_bindir}/hp-systray.wrapper
+# Change /etc/xdg/autostart/hplip-systray.desktop to call hp-systray.wrapper:
+#sed -i -e '/^Exec=hp-systray$/s/hp-systray/hp-systray.wrapper/;' %{buildroot}/etc/xdg/autostart/hplip-systray.desktop
+# End of "Desktop autostart notification tray stuff".
+# Find duplicate files:
+#%fdupes -s %{buildroot}
+
+%post
+#%if 0%{?suse_version} > 1130
+#%icon_theme_cache_post
+#%else
+#gtk-update-icon-cache %{_datadir}/icons/hicolor || true
+#%endif
+/sbin/ldconfig
+#exit 0
+
+#%triggerin -- sane-backends
+# As hplip can be used for plain printers it cannot "PreReq sane-backends".
+# Therefore if sane-backends is installed it may be installed or updated after hplip.
+# In this case trigger to add the SANE backend "hpaio" to /etc/sane.d/dll.conf if it is not there.
+# To be safe there is a test that /etc/sane.d/dll.conf is writable.
+#if [ -w /etc/sane.d/dll.conf ]
+#then if ! grep -q 'hpaio' /etc/sane.d/dll.conf
+# then echo -e '# The hpaio backend is provided by the hplip package:\n#hpaio' >>/etc/sane.d/dll.conf
+# fi
+#fi
+#exit 0
+
+%preun
+# If the package was removed and if it was updated
+# remove all byte-compiled Python .pyc (and perhaps .pyo) files
+# which are created at run-time by Python in /usr/share/hplip/.
+# Use a generic method via "find" so that it works in any case
+# without the need to maintain a long list of individual files.
+# Even if this may accidentally remove "foreign" .pyc/.pyo files
+# which do not originate from matching .py files from this package
+# (e.g. third-party stuff in /usr/share/hplip/), there is no damage
+# because Python could re-create them or work only with .py files.
+#find /usr/share/hplip/ -name '*.py[co]' -delete
+#exit 0
+
+%postun
+#%if 0%{?suse_version} > 1130
+#%icon_theme_cache_postun
+#%else
+#gtk-update-icon-cache %{_datadir}/icons/hicolor || true
+#%endif
+/sbin/ldconfig
+# If the package was removed (but not if it was updated)
+# then remove the hpaio lines in /etc/sane.d/dll.conf.
+# Don't remove them when the hplip package was automatically
+# replaced by the hplip17 package (via RPM obsoletes) or vice versa.
+# Because postun of the old package runs last (after triggerin -- sane-backends)
+# it is done via a special "ls" test if any libsane-hpaio.so exists
+# (e.g. there could be only 32-bit installed on 64-bit hardware).
+# If the "ls" test does not fail, some kind of HPLIP is installed.
+# The package sane-backends may not be installed (see triggerin)
+# and therefore the test that /etc/sane.d/dll.conf is writable.
+# The "exit 0" is necessary, otherwise the postun script
+# would exit with non-zero exit-code if the package was not removed.
+#if [ "$1" = "0" ]
+#then if ! ls /usr/lib*/sane/libsane-hpaio.so* &>/dev/null
+# then [ -w /etc/sane.d/dll.conf ] && sed -i -e '/hpaio/d' /etc/sane.d/dll.conf
+# fi
+#fi
+#exit 0
+
+#%post hpijs
+#/sbin/ldconfig
+#exit 0
+
+#%postun hpijs
+#/sbin/ldconfig
+#exit 0
+
+%files
+%manifest hplip.manifest
+%defattr(-, root, root)
+/usr/share/license/%{name}
+#%config %{_sysconfdir}/xdg/autostart/hplip-systray.desktop
+#%dir %{_sysconfdir}/udev
+#%dir %{_sysconfdir}/udev/rules.d
+#%config %{_sysconfdir}/udev/rules.d/55-hpmud.rules
+#%config %{_sysconfdir}/udev/rules.d/56-hpmud_add_printer.rules
+#%config %{_sysconfdir}/udev/rules.d/56-hpmud_support.rules
+#%config %{_sysconfdir}/udev/rules.d/86-hpmud_plugin.rules
+#%{_bindir}/hp-align
+#%{_bindir}/hp-check
+#%{_bindir}/hp-check-plugin
+#%{_bindir}/hp-clean
+#%{_bindir}/hp-colorcal
+#%{_bindir}/hp-config_usb_printer
+#%{_bindir}/hp-devicesettings
+#%{_bindir}/hp-diagnose_plugin
+#%{_bindir}/hp-diagnose_queues
+#%{_bindir}/hp-fab
+#%{_bindir}/hp-faxsetup
+#%{_bindir}/hp-firmware
+#%{_bindir}/hp-info
+#%{_bindir}/hp-levels
+#%{_bindir}/hp-linefeedcal
+#%{_bindir}/hp-makecopies
+#%{_bindir}/hp-makeuri
+#%{_bindir}/hp-mkuri
+#%{_bindir}/hp-pkservice
+#%{_bindir}/hp-plugin
+#%{_bindir}/hp-pqdiag
+#%{_bindir}/hp-print
+#%{_bindir}/hp-printsettings
+#%{_bindir}/hp-probe
+#%{_bindir}/hp-query
+#%{_bindir}/hp-scan
+#%{_bindir}/hp-sendfax
+#%{_bindir}/hp-setup
+#%{_bindir}/hp-systray
+#%{_bindir}/hp-testpage
+#%{_bindir}/hp-timedate
+#%{_bindir}/hp-toolbox
+#%{_bindir}/hp-uninstall
+#%{_bindir}/hp-unload
+#%{_bindir}/hp-upgrade
+#%{_bindir}/hp-wificonfig
+#%{_libdir}/python%{py_ver}/site-packages/cupsext.*
+#%{_libdir}/python%{py_ver}/site-packages/hpmudext.*
+#%{_libdir}/python%{py_ver}/site-packages/pcardext.*
+#%{_libdir}/python%{py_ver}/site-packages/scanext.*
+#%dir /usr/lib/cups
+#%dir /usr/lib/cups/backend
+#/usr/lib/cups/backend/hpfax
+%dir /usr/lib/cups/filter
+/usr/lib/cups/filter/hpcups
+#/usr/lib/cups/filter/hpcupsfax
+#%doc %{_defaultdocdir}/%{name}/
+#%{_datadir}/icons/hicolor/*/apps/HPmenu.png
+#%{_datadir}/applications/%{name}.desktop
+#%{_bindir}/hp-systray.wrapper
+#%{_datadir}/hplip/
+#%exclude %{_datadir}/hplip/data/models/models.dat
+
+#%files hpijs
+#%defattr(-, root, root)
+#%config %{_sysconfdir}/hp/
+#%config %{_sysconfdir}/cups/pstotiff.convs
+#%config %{_sysconfdir}/cups/pstotiff.types
+#%{_bindir}/hpijs
+#%doc %{_mandir}/man1/hpijs.1.gz
+#%{_libdir}/libhpip.*
+#%{_libdir}/libhpmud.*
+#%dir /usr/lib/cups
+#%dir /usr/lib/cups/backend
+#/usr/lib/cups/backend/hp
+#%dir /usr/lib/cups/filter
+#/usr/lib/cups/filter/foomatic-rip-hplip
+#/usr/lib/cups/filter/hpcac
+#/usr/lib/cups/filter/hplipjs
+#/usr/lib/cups/filter/hpps
+#/usr/lib/cups/filter/pstotiff
+#%dir %{_datadir}/cups
+#%dir %{_datadir}/cups/model
+#%dir %{_datadir}/cups/model/manufacturer-PPDs
+#%{_datadir}/cups/model/manufacturer-PPDs/%{name}/
+#%{_datadir}/%{name}/data/models/models.dat
+#%dir %attr(0774,root,lp) %{_var}/log/hp
+
+#%files sane
+#%defattr(-, root, root)
+#%dir %{_libdir}/sane
+#%{_libdir}/sane/libsane-hpaio.*
+
+%changelog
+* Tue Apr 24 2012 jsmeix@suse.de
+- hplip.SuSEfirewall2 is no longer provided
+ (see SUSE Bugzilla bnc#757354 comment #10).
+* Thu Apr 12 2012 jsmeix@suse.de
+- Upgraded to version 3.12.4:
+ Uninstall Support: User can uninstall complete HPLIP package
+ by running "hp-uninstall" command.
+ Upgrade Support: Settings can be configured using
+ "hp-systray -> settings -> Update settings" for notification
+ of newer version of HPLIP release. User can also upgrade to
+ latest version by running "hp-upgrade" command.
+ Queue Analyzer: Print/Fax queues can be analyzed by
+ running "hp-diagnose-queues" command or by clicking
+ on "Diagnose Queues" from toolbox.
+ Several more supported printers and all-in-one devices.
+ Several bug fixes.
+ For details see
+ http://hplipopensource.com/hplip-web/release_notes.html
+- Removed hp-toolbox.wrapper because the reason for it
+ is no longer valid (see SUSE Bugzilla bnc#755820).
+- Added "BuildRequires: python-cups" to get special
+ RPM Provides tags for the printers supported by
+ this package (see SUSE Bugzilla bnc#735865).
+* Wed Feb 8 2012 jsmeix@suse.de
+- Upgraded to version 3.12.2:
+ Fixed digital signature mismatch issue for plugin download.
+ Removed unsupported features (Water Mark overlay, Job Storage,
+ PIN 2 Print) from the PS PPDs.
+ Several more supported printers and all-in-one devices.
+ A few bug fixes.
+ For details see
+ http://hplipopensource.com/hplip-web/release_notes.html
+* Thu Jan 12 2012 jsmeix@suse.de
+- Upgraded to version 3.11.12:
+ Auto-detection and installation of missing plug-ins.
+ Designed tool to detect the missing plugin files and intimate
+ user about it and giving the path forward to install it.
+ SYSFS is replaced by ATTRS in udev rules.
+ Uses D-Bus from separate threads without locking.
+ Several more supported printers and all-in-one devices.
+ Several bug fixes.
+ For details see
+ http://hplipopensource.com/hplip-web/release_notes.html
+- change-udev-rules.diff changes ATTRS to ATTR (bnc#436085).
+- no-chgrp_lp_hplip_Logdir.diff deactivates
+ the "chgrp lp -R /var/log/hp" in Makefile.am because
+ during install this results "Operation not permitted".
+ This is done in the files section via attr(0774,root,lp)
+ where mode 0774 matches to what is set in Makefile.am.
+* Fri Oct 28 2011 badshah400@gmail.com
+- Install icons of various sizes in hicolor icon directory for
+ better appearance in gnome-shell (bnc#713902).
+- Add hicolor-icon-theme BuildRequires to own the hicolor icon
+ directory correctly and install icons in there
+- Use appropriate icon theme macros in post scripts
+- Modified hplip.desktop to use these hicolor icons
+- In hplip.desktop replace the category "Settings" by "System" to
+ make it appear under the correct group "System Tools" rather
+ than "Others" in desktop menus.
+* Sat Oct 15 2011 coolo@suse.com
+- add libtool as buildrequire to make the spec file more reliable
+* Thu Oct 13 2011 vuntz@opensuse.org
+- Split the sane driver in a hplip-sane subpackage, so that it's
+ not necessary to install the full hplip tools to use an
+ all-in-one HP printer. See bnc#723870.
+* Tue Oct 4 2011 jsmeix@suse.de
+- Upgraded to version 3.11.10:
+ Fixed insecure tmp file handling in hpcupsfax.cpp CVE-2011-2722
+ see https://bugs.launchpad.net/hplip/+bug/809904 (bnc#704608).
+ New tech classes for HP OfficeJet Pro 8100,
+ HP Deskjet 3070 B611 series and HP Photosmart 7510 e-All-in-One.
+ Added new subtech class for HP Photosmart 6510 e-All-in-one.
+ Modified the error message which was displayed in case
+ of missing .asc file for manual plug-in install.
+ Several more supported printers and all-in-one devices.
+ Several bug fixes.
+ For details see
+ http://hplipopensource.com/hplip-web/release_notes.html
+* Fri Aug 12 2011 jsmeix@suse.de
+- Upgraded to version 3.11.7:
+ A few more supported printers and all-in-one devices.
+ Several bug fixes.
+ For details see
+ http://hplipopensource.com/hplip-web/release_notes.html
+- Because foomatic-rip-hplip has CVE-2011-2697 (bnc#698451)
+ plus a leftover in CVE-2004-0801 (bnc#59233)
+ foomatic-rip-hplip is no longer installed and foomatic-rip
+ from the foomatic-filters RPM is used instead and the
+ "cupsFilter" entries in the PPDs are changed accordingly.
+ To be backward compatible with PPDs in /etc/cups/ppd/
+ for existing print queues a compatibility link
+ /usr/lib/cups/filter/foomatic-rip-hplip
+ which points to foomatic-rip is installed.
+- The DefaultPageSize in the PPDs is no longer set to A4
+ if A4 is an available PageSize choice but left "as is"
+ because the DefaultPageSize in the PPD templates in
+ /usr/share/cups/model/ does not matter because the cupsd
+ sets the DefaultPageSize for PPDs in /etc/cups/ppd/
+ by default according to the locale that the cupsd runs in or
+ according to a DefaultPaperSize entry in /etc/cups/cupsd.conf.
+- No longer "Correcting or removing non-working PPDs..."
+ because none of those cases which were fixed still exist
+ (i.e. all those cases are meanwhile fixed upstream).
+* Fri May 13 2011 jsmeix@suse.de
+- Upgraded to version 3.11.5:
+ Added LEDM ADF Scan support.
+ Added LEDM Wireless support.
+ Some more supported printers and all-in-one devices.
+ It may fix the inverted/wrong color problem in HPCUPS
+ (see Novell/openSUSE Bugzilla bnc #692905).
+ For details see
+ http://hplipopensource.com/hplip-web/release_notes.html
+* Tue Mar 29 2011 jsmeix@suse.de
+- Upgraded to version 3.11.3a:
+ Fixed hp-plugin plugin download error (no Suse bug), see
+ http://hplipopensource.com/hplip-web/release_notes.html
+* Fri Mar 18 2011 jsmeix@suse.de
+- Upgraded to version 3.11.3:
+ New device class StingrayOJ for HP OfficeJet 100 Mobile L411.
+ New filter hpps (HP PS filter for PostScript printers) currently
+ only used via hp-officejet_pro_8000_enterprise_a811a-ps.ppd.gz
+ Some more supported printers and all-in-one devices.
+ For details see
+ http://hplipopensource.com/hplip-web/release_notes.html
+* Tue Feb 1 2011 jsmeix@suse.de
+- Updated to version 3.11.1:
+ New encapsulation format for LJZJStream class.
+ Alignment of cartridges over LEDM (Low End Data Model).
+ LEDM dynamic scan resolution.
+ New fax protocol (Low End Data Model) support.
+ ADF and color scan for some HP LaserJet Pro and MFP devices.
+ Some more supported all-in-one devices.
+ Many bug fixes (no Suse bugs).
+ For details see
+ http://hplipopensource.com/hplip-web/release_notes.html
+- Adapted change-udev-rules.diff for version 3.11.1
+ because the "DesignJet product (0x03f0xx14)" was added.
+* Thu Jan 13 2011 jsmeix@suse.de
+- hplip-3.9.8-CVE-2010-4267.patch fixes a remote buffer overflow
+ (CVE-2010-4267 and Novell/Suse Bugzilla bnc#336658).
+* Wed Dec 29 2010 gber@opensuse.org
+- Use more appropriate categories for hplip.desktop
+ 'Settings HardwareSettings Printing' instead of 'System Monitor'
+* Fri Dec 3 2010 jsmeix@suse.de
+- Removed explicite RPM requirement for pyxml. At least since
+ openSUSE 11.1 and SLE11 pyxml is no longer required (pyxml was
+ required e.g. for openSUSE 10.3 and SLE10, see the entry below
+ dated "Wed Apr 2 14:40:57 CEST 2008") but meanwhile python-xml
+ alone is sufficient for "import xml.parsers.expat"
+ (see Novell/openSUSE Bugzilla bnc#656779 comment #3).
+- Added "Obsoletes: hplip-hpcups" because HPLIP does not work
+ if the openSUSE packages hplip and hplip-hpijs are installed
+ together with a leftover PackMan package hplip-hpcups
+ (see Novell/openSUSE Bugzilla bnc#515005 comment #17).
+- Do not pollute the build log file with zillions of meaningless
+ messages while "General tests and adjustments for all PPDs"
+ (compare the OpenPrintingPPDs.spec file).
+* Wed Oct 27 2010 jsmeix@suse.de
+- Added hp-systray.wrapper which is called
+ via /etc/xdg/autostart/hplip-systray.desktop
+ to increase desktop startup speed so that the purpose
+ of this hp-systray.wrapper is different to the
+ entry below dated "Tue Apr 8 14:56:53 CEST 2008".
+ hp-systray.wrapper tests via "lpstat" if a 'hp:/...'
+ print queue exists and exits otherwise.
+ This avoids that hp-systray with all its Python stuff must be
+ loaded when the desktop starts up only to let hp-systray do
+ its built-in test and exit if there is no HPLIP print queue
+ (see Novell/openSUSE Bugzilla bnc#649280).
+- Updated to version 3.10.9:
+ New Scan protocol (Low End Data Model) support.
+ Many more supported all-in-one devices.
+ Many bug fixes.
+ For details see
+ http://hplipopensource.com/hplip-web/release_notes.html
+- Updated to version 3.10.6:
+ New protocol support (LEDM) for device status over Network
+ and USB.
+ Some more supported all-in-one devices.
+ Several bug fixes.
+ For details see
+ http://hplipopensource.com/hplip-web/release_notes.html
+- Updated to version 3.10.5:
+ Fixed "libusb couldn't open USB device, Permission denied"
+ error message in openSUSE.
+ Several more supported all-in-one devices.
+ Several bug fixes.
+ For details see
+ http://hplipopensource.com/hplip-web/release_notes.html
+* Wed Sep 15 2010 aj@suse.de
+- Change BuildRequires for sane-backends devel split.
+* Thu Apr 1 2010 jsmeix@suse.de
+- Updated to version 3.10.2:
+ The hpcups driver is again updated to better align with
+ the product specifications for various printer models.
+ Several more supported all-in-one devices.
+ Several bug fixes (no Suse bugs).
+ For details see
+ http://hplipopensource.com/hplip-web/release_notes.html
+- Updated to version 3.9.12:
+ The hpcups driver is updated to better align with the
+ product specifications for various printer models.
+ Several more supported printers.
+ Several bug fixes (no Suse bugs).
+ For details see
+ http://hplipopensource.com/hplip-web/release_notes.html
+- Updated to version 3.9.10:
+ The hpcups driver has been re-written. It does no longer do
+ bi-directional IO. Printer specific settings are no longer
+ hard coded, but are controlled by the PPD file.
+ Many more supported printers and all-in-one devices.
+ Several bug fixes (no Suse bugs).
+ For details see
+ http://hplipopensource.com/hplip-web/release_notes.html
+- hpcups.drv.in-3.9.8-reorder.patch and
+ hpcups-ppds-3.9.8-reorder.tar.bz2 are obsolete
+ because it is fixed in the source.
+- create_hal_global_fdi_from_hpmud_rules is obsolete
+ because HAL is no longer used to manage ACLs
+ (see Novell/Suse Bugzilla bnc#542473 comment#13).
+- change-udev-rules.diff fixes now also 56-hpmud_support.rules
+ (see for example Novell/Suse Bugzilla bnc#577035) and
+ it should trigger udev's generic ACL support for SANE
+ via 'ENV{libsane_matched}="yes"' in 55-hpmud.rules
+ (see Novell/Suse Bugzilla bnc#542473 comment#14).
+ Perhaps the latter could be better achieved with the
+ configure option --enable-udev-acl-rules (default=no)
+ which installs 40-hplip.rules instead of 55-hpmud.rules
+ but this was not at all tested up to now and it is
+ likely not backward compatible (e.g. for openSUSE 11.2).
+* Thu Oct 15 2009 jsmeix@suse.de
+- Also moved /usr/share/hplip/data/models/models.dat
+ and /etc/hp/hplip.conf to the hplip-hpijs sub-package
+ so that the "hp" backend can autodetect printers
+ (see Novell/Suse Bugzilla bnc#546856 comment#10).
+* Thu Oct 15 2009 jsmeix@suse.de
+- In the hplip-hpijs sub-package made weak package dependencies
+ even weaker to avoid bloating of minimal installations. Now
+ the hplip-hpijs sub-package only "Enhances: ghostscript_any"
+ and "Suggests: hplip" (see Novell/Suse Bugzilla bnc#546893).
+- Enlarged hplip-hpijs to be useful for a CUPS print queue.
+ Moved the following files from the hplip main package
+ to the hplip-hpijs sub-package: cups/backend/hp,
+ cups/filter/foomatic-rip-hplip, cups/filter/hpcac,
+ cups/filter/hpcups, cups/filter/hplipjs,
+ and all PPD files (see Novell/Suse Bugzilla bnc#546856).
+* Wed Sep 16 2009 jsmeix@suse.de
+- hpcups.drv.in-3.9.8-reorder.patch addresses two issues
+ in the 3.9.8 hpcups.drv.in file from which dynamic PPDs
+ are generated.
+ It re-orders common paper sizes so that normal, fullbleed
+ and duplex papers sizes are grouped together in the PPD.
+ It changes the LJColor device class from RGBW to RGB
+ color space. The K band was not being printed by hpcups.
+- The hpcups-ppds-3.9.8-reorder.tar.bz2 source file contains
+ the matching static PPDs which are fixed according to what
+ hpcups.drv.in-3.9.8-reorder.patch fixes for dynamic PPDs.
+* Thu Aug 6 2009 jsmeix@suse.de
+- The hplip.SuSEfirewall2 source file provides support
+ to open UDP ports 5353(mdns) and 427(svrloc) for mDNS support
+ according to the init-suse-firewall in the tar ball
+ (see Novell/Suse Bugzilla bnc#528819).
+- Updated to version 3.9.8:
+ Added mDNS/Bonjour support.
+ Enabled mDNS as the default network search mechanism.
+ Added front-end support for mDNS/Bonjour in setup.
+ Added hpmud support for mDNS.
+ The tar ball provides a init-suse-firewall init script
+ for mDNS support which is not included in the RPM.
+ Fixed wificonfig associate issue when called from hp-setup.
+ Added 40-hplip.rules to the tar ball for distros with
+ udev ACL support. Use configure option --enable-udev-acl-rules
+ to install 40-hplip.rules instead of 55-hpmud.rules.
+ Fixed Normal Grayscale on DJ8xx and DJ8x5 for HPCUPS.
+ Added -lsane link option for libsane-hpaio in Makefile.
+ Many more supported printers and all-in-one devices.
+ Many bug fixes (no Suse bugs).
+ For details see
+ http://hplipopensource.com/hplip-web/release_notes.html
+* Wed Jul 1 2009 jsmeix@suse.de
+- Fixed hp-toolbox.wrapper by adding "..." quotation when
+ calling 'test -x "$( type -p whatever )"' because
+ when 'type -p whatever' fails calling 'test -x' without
+ an explicite empty argument would result true
+ (see Novell/Suse Bugzilla bnc#503322 comment#6).
+- fix_gcc44_glib.diff is obsolete since version 3.9.6b
+ because it is fixed in the source.
+- Updated to version 3.9.6b:
+ The new native CUPS driver (HPCUPS) is now the default
+ printer driver. HPCUPS provides new paper sizes for borderless
+ and duplex so that there are now HPCUPS PPDs with exact
+ printable regions for normal, borderless and duplex paper sizes
+ which should fix https://bugs.launchpad.net/hplip/+bug/173857
+ For now HPIJS (and its matching foomatic-rip-hplip PPDs)
+ are still included (HPIJS can co-exist with HPCUPS).
+ A new utility 'hp-wificonfig' can pre-configure wifi-capable
+ printers on a wireless network. Once pre-configured, a queue
+ for the printer can be set up as usual using hp-setup.
+ Renamed hp-devicesetup to hp-devicesettings.
+ Added CUPS filter hpcupsfax and new hpcups fax PPDs.
+ Bumped libhpmud.so.0.0.4 to libhpmud.so.0.0.5.
+ Integrated --enable-lite-build (default=no) into configure.in
+ which can be used to get a minimal print/scan only build with
+ limited Plugin support (Novell/Suse provides the "full" build).
+ Many more supported printers and all-in-one devices.
+ Many bug fixes (no Suse bugs).
+ For details see
+ http://hplipopensource.com/hplip-web/release_notes.html
+* Tue Jun 2 2009 jsmeix@suse.de
+- fix_gcc44_glib.diff fixes GCC/glibc issues, here in particular
+ "invalid conversion from 'const char*' to 'char*'" errors.
+ The upstream bug report is
+ https://bugs.launchpad.net/hplip/+bug/382720
+* Tue May 5 2009 jsmeix@suse.de
+- force-qt4-for-hp-systray-desktop.diff is obsolete because
+ configure uses --enable-qt4 by default now which obsoletes
+ also "Recommends: python-qt" (only python-qt4 is required).
+- Updated to version 3.9.4b:
+ A few bug fixes (no Suse bugs).
+ For details see
+ http://hplipopensource.com/hplip-web/release_notes.html
+- Updated to version 3.9.4:
+ Added PolicyKit support. Command line tools like hp-setup,
+ hp-plugin, etc. are now run as regular user.
+ Added GPG digital signature support to the HPLIP plug-in
+ to validate that the plug-in is not corrupted and authentic.
+ Added native CUPS driver support (hpcups) currently for
+ testing only and added static PPDs for hpcups.
+ Some more supported printers and all-in-one devices
+ (in particular a few Designjet PostScript printers).
+ Many bug fixes (no Suse bugs).
+ For details see
+ http://hplipopensource.com/hplip-web/release_notes.html
+- Updated to version 3.9.2:
+ Qt4 now default UI.
+ Support policy change. End of support date is added to
+ all HPLIP supported devices, for details see
+ http://hplipopensource.com/node/314
+ New file /var/lib/hp/hplip.state for runtime variable data.
+ Removed any variable data from /etc/hp/hplip.conf.
+ Some more supported printers and all-in-one devices.
+ Major bug fixing on Qt4 solution (no Suse bugs).
+ For details see
+ http://hplipopensource.com/hplip-web/release_notes.html
+- Updated to version 2.8.12:
+ From this release forward, all PPD files - even for devices
+ that require a binary plug-in - will reside in the tarball
+ (the "plugin PPDs" are moved into hpijs.drv).
+ Preview (alpha) release of the Qt4 version of HPLIP.
+ Replaced "MODE 0666" udev device permissions with
+ "console permissions via HAL".
+ No new supported devices.
+ Several bug fixes (no Suse bugs).
+ For details see
+ http://hplipopensource.com/hplip-web/release_notes.html
+- Updated to version 2.8.10:
+ Bumped libhpmud version for new plugin attribute.
+ Many more supported printers and all-in-one devices.
+ Several bug fixes (no Suse bugs).
+ For details see
+ http://hplipopensource.com/hplip-web/release_notes.html
+- Updated to version 2.8.9:
+ Added Qt4 configure option but Qt3 is the default.
+ Many bug fixes (no Suse bugs).
+ Several more supported printers, in particular
+ some Compact Photo (QuickConnect) printers.
+ For details see
+ http://hplipopensource.com/hplip-web/release_notes.html
+* Wed Dec 3 2008 lnussel@suse.de
+- use "usb" instead of "usb_device" (bnc#438867)
+* Wed Dec 3 2008 jsmeix@suse.de
+- Moved /etc/hal/fdi/policy/10osvendor/70-hpmud.fdi
+ to /usr/share/hal/fdi/information/20thirdparty/70-hpmud.fdi
+ (see Novell/Suse Bugzilla bnc#438867).
+* Tue Nov 18 2008 jsmeix@suse.de
+- Let suse_update_desktop_file add X-SuSE-translate key
+ to /etc/xdg/autostart/hplip-systray.desktop so that we can
+ update its translations with translation-only packages
+ (see Novell/Suse Bugzilla bnc#445738).
+* Tue Oct 21 2008 jsmeix@suse.de
+- Changed change-udev-rules.diff to jump to the end
+ if SUBSYSTEM!="usb" and replaced SYSFS by ATTR
+ (see Novell/Suse Bugzilla bnc#436085).
+* Tue Sep 16 2008 jsmeix@suse.de
+- Added "Recommends: hplip" to hplip-hpijs because when only
+ hplip-hpijs is there, it should tell the dependency resolver
+ that for usual functionality, hplip should be installed
+ too (if possible).
+* Thu Sep 11 2008 jsmeix@suse.de
+- force-qt4-for-hp-systray-desktop.diff forces Gnome and KDE
+ to execute hp-systray as "hp-systray --qt4" via
+ /etc/xdg/autostart/hplip-systray.desktop so that
+ hp-systray docks to the notification tray of the desktops.
+ Because of this the python-qt4 RPM is now required
+ (see Novell/Suse Bugzilla bnc#377575).
+ This additional requirement should be no problem because
+ in an upcoming release HPLIP is converted over to Qt4, see
+ https://bugs.launchpad.net/hplip/+bug/231978/comments/7
+ and then the "Recommends: python-qt" can be dropped
+ (see the entry below) but currently only hp-systray
+ can be used with Qt4.
+* Wed Sep 10 2008 jsmeix@suse.de
+- Do no longer have a hard RPM requirement for python-qt
+ (now there is only "Recommends: python-qt") to be able
+ to provide hplip even on a distribution without python-qt.
+ Without python-qt all GUI stuff would fail but
+ several /usr/bin/hp-* tools have a command line
+ option to run in non-graphical mode so that the basic driver
+ functionality still works even without python-qt.
+- Have versioned "Obsoletes" for hpijs-standalone to meet our
+ policies even if the real intention is that any installed
+ version of hpijs-standalone is replaced and explain the
+ unversioned "Obsoletes" for hplip17 and hplip17-hpijs
+ (see Novell/Suse Bugzilla bnc#251830).
+* Tue Sep 9 2008 jsmeix@suse.de
+- The configure option disable-foomatic-xml-install
+ does no longer exist.
+- Updated to version 2.8.7:
+ Some bug fixes (no Suse bugs).
+ Some more supported printers.
+ For details see release_notes.html
+- Updated to version 2.8.6b:
+ Replaced the doc directory with an abbreviated web document
+ (there is no longer hpijs.html and device_classes.html).
+ Redesigned the proprietary plugin support. There is now only
+ one plugin that is valid for each HPLIP release, see
+ https://answers.launchpad.net/hplip/+question/30595
+ Changed the hpijs.drv to support multiple products via
+ multiple "Product" entries in the PPD but see
+ https://bugs.launchpad.net/hplip/+bug/235148
+ Several bug fixes (no Suse bugs).
+ Many more supported printers.
+ For details see release_notes.html
+- Updated to version 2.8.5:
+ Major toolbox (HP Device Manager) revamp/refresh.
+ More dbus support (live status updating).
+ hp-systray will exit if no HPLIP installed queues found which
+ obsoletes HPLIP-2.8.4-systray_exit_if_no_device_2.patch
+ Many bug fixes (no Suse bugs).
+ Several more supported printers.
+ For details see release_notes.html
+* Fri Sep 5 2008 jsmeix@suse.de
+- Keep all PPDs even if cupstestppd FAILs.
+ With each CUPS version upgrade cupstestppd finds more
+ and more errors so that more and more PPDs would be
+ no longer included in the RPM which have been included
+ before which results a regression.
+ As far as we know there have been no problems at all because of
+ not strictly compliant PPDs in HPLIP so that it is much better
+ to provide all PPDs so that the matching printers can be used
+ than to be rigorous regarding compliance to the PPD spec.
+* Thu Sep 4 2008 jsmeix@suse.de
+- Changed the "Conflicts: hpijs-standalone" in hplip-hpijs
+ to "Obsoletes: hpijs-standalone" regardless of any version.
+ hplip-hpijs and hpijs-standalone both contain /usr/bin/hpijs
+ so that both packages have a RPM conflict.
+ But when the minimalist hpijs-standalone is to be replaced
+ by the full-featured hplip, hplip requires hplip-hpijs
+ and this should silently supersede hpijs-standalone
+ regardless of any version (see Novell/Suse Bugzilla bnc#388149).
+* Thu Aug 14 2008 jsmeix@suse.de
+- Removed the hplip init script which is obsolete since
+ version 2.8.4 where hpssd is gone and replaced by
+ hp-systray, see Novell/Suse Bugzilla bnc#390663.
+* Tue Apr 29 2008 jsmeix@suse.de
+- Added RPM requirement for python-gobject2 because the dbus stuff
+ in HPLIP requires the Python module gobject but there is no
+ automated RPM requirement for python-gobject2, see
+ https://answers.launchpad.net/hplip/+question/30741
+* Thu Apr 10 2008 jsmeix@suse.de
+- HPLIP-2.8.4-systray_exit_if_no_device_2.patch lets hp-systray
+ exit if the HPLIP driver seems to be not in use (i.e. if there
+ is neither a 'hp:/...' nor a 'hpfax:/...' print queue), see
+ https://bugs.launchpad.net/hplip/+bug/213938
+ This patch obsoletes the whole hp-systray.wrapper stuff,
+ see the entry below and Novell/Suse Bugzilla bnc#377885.
+* Tue Apr 8 2008 jsmeix@suse.de
+- Added hp-systray.wrapper which is a wrapper for hp-systray
+ which runs it only if there is a 'hp:/...' print queue
+ and changed /etc/xdg/autostart/hplip-systray.desktop
+ to run the wrapper, see Novell/Suse Bugzilla bnc#377885.
+* Thu Apr 3 2008 jsmeix@suse.de
+- Updated to version 2.8.4:
+ Elimination of all persistent startup daemons.
+ The last daemon hpssd has been replaced with hp-systray.
+ All interprocess communication uses now dbus.
+ Therefore dbus-1-python version 0.80 or greater is required.
+ PC send fax requires dbus and a running hp-systray to operate
+ but hp-toolbox and hp-sendfax launch hp-systray automatically
+ and there is also /etc/xdg/autostart/hplip-systray.desktop.
+ When no HPLIP tools are running (e.g. hp-toolbox),
+ and the user closes or disables hp-systray,
+ there will be no HPLIP processes running whatsoever.
+ Many bug fixes (no Suse bugs).
+ One more supported LaserJet ZJStream printers (M1120),
+ one OfficeJet (J6400), and two Photosmart (C4340, B8800)
+ where the latter has a new printer device class (PSB9100).
+ For details see release_notes.html
+- Adapted the hplip init script to provide backward compatibility:
+ It still exists to avoid that printer/scanner setup tools fail
+ when they try to enable the "hplip" service but all it does
+ is to stop a possibly running hpssd.
+* Wed Apr 2 2008 jsmeix@suse.de
+- Exchanged create_hal_global_fdi_from_models.dat with
+ create_hal_global_fdi_from_hpmud_rules which creates the
+ global HAL 70-hpmud.fdi file during build-time from the
+ 55-hpmud.rules file to be in sync with the udev rules file
+ and to make sure to have all possible HPLIP device IDs, see
+ https://bugs.launchpad.net/ubuntu/+source/hplip/+bug/195782
+- Require the exact matching version of the hpijs sub-package
+ to have the correct libhpip and libhpmud installed.
+- Require pyxml to have the xml.parsers.expat Python module,
+ see https://answers.launchpad.net/hplip/+question/25696
+* Tue Feb 26 2008 jsmeix@suse.de
+- Static "hpijs" PPD files via enable-foomatic-ppd-install
+ require foomatic-rip-hplip via their cupsFilter entries
+ so that enable-foomatic-rip-hplip-install is also needed.
+ See https://answers.launchpad.net/hplip/+question/25654
+ and see Novell/Suse Bugzilla bnc#364419.
+* Thu Feb 21 2008 jsmeix@suse.de
+- create_hal_global_fdi_from_models.dat creates the
+ global HAL 70-hpmud.fdi file during build-time from the
+ models.dat file (see Novell/Suse Bugzilla bnc#336658).
+- Built version 2.8.2 in the traditional way with readymade
+ PPD files in /usr/share/cups/model/manufacturer-PPDs/hplip/
+ (i.e. without hpijs.drv and foomatic-rip-hplip)
+- Updated to version 2.8.2:
+ HPIJS PPD files are now created with the CUPS DDK instead of
+ the foomatic database. Dynamic PPD files are now supported
+ via the hpijs.drv file.
+ Added foomatic-rip-hplip support. Foomatic-rip-hplip is for
+ distros that do not have the latest foomatic-rip which is
+ required for drv support.
+ Updated the krgb patch for gpl ghostscript 8.61.
+ Updated the "hp" backend to return only hplip supported devices
+ during device discovery. If the device is not in models.dat
+ the "hp" backend will exclude it.
+ Changed margins to 0.125 inch from 0.
+ Bumped libhpmud from 0.0.1 to 0.0.2 for support_type
+ in hpmud_query_model().
+ Several bug fixes (no Suse bugs).
+ Several more supported printers (some more ZJStream printers).
+- Updated to version 2.7.12:
+ Added PJL support to "hp" backend which provides in-band
+ printer status.
+ Bumped libhpmud from 0.0.0 to 0.0.1 for statustype support
+ in hpmud_query_model().
+ Several bug fixes (no Suse bugs).
+ Several more supported LaserJet printers, one ZJStream printer,
+ one LJm1005 printer with binary-only plugin (LaserJet M1005 MFP).
+* Fri Nov 9 2007 jsmeix@suse.de
+- Changed rchplip (i.e. /etc/init.d/hplip):
+ Added "$local_fs $remote_fs $syslog" to Required-Start
+ to be on the safe side and added a line "export HOME=/tmp"
+ to mitigate Novell/Suse Bugzilla bnc#339443.
+* Tue Oct 23 2007 jsmeix@suse.de
+- Updated to version 2.7.10:
+ New LJZjsMono printer device class for ZJStream printers.
+ ZJStream printers require JBIG which has issues
+ (see Novell/Suse Bugzilla bnc#263181). Therefore the support
+ for ZJStream printers is provided only via a binary-only plugin
+ which is downloaded by "hp-setup" from the HP web-site only after
+ the user has accepted the license terms.
+ Applied patch for issue CVE-2007-5208 (hpssd command injection)
+ Several bug fixes (no Suse bugs).
+ Two more supported Photosmart and Officejet printers.
+ For details see release_notes.html
+- Updated to version 2.7.9:
+ Made the default udev 55-hpmud.rules file more permissive
+ (ie: MODE=0666) so that also device status works for any user.
+ This looks sufficiently secure by default because the
+ 55-hpmud.rules matches now only for those USB product IDs
+ which belong to HP printers and all-in-one devices so that
+ other HP USB devices like keyboard, mouse, and mass storage
+ devices won't get MODE=0666 by accident.
+ All known product-ids that HPLIP/HPIJS supports have been
+ added to the model.dat file.
+ Many bug fixes (no Suse bugs).
+ Some more supported Photosmart and Officejet printers.
+ For details see release_notes.html
+* Tue Sep 18 2007 jsmeix@suse.de
+- Add a line-feed to the end of all PPDs to fix those PPDs where
+ it is missing. See Novell/Suse Bugzilla bnc#309832:
+ Unix/Linux text files must end with a line-feed.
+ Otherwise reading the last line results EOF and then some
+ programs may ignore the last line.
+* Wed Sep 12 2007 jsmeix@suse.de
+- Ignore cupstestppd FAILs because of errors in UIConstraints
+ and/or NonUIConstraints which are detected since cupstestppd
+ in CUPS > 1.2.7 (i.e. since openSUSE 10.3).
+ See Novell/Suse Bugzilla bnc#309822: When this bug is fixed,
+ cupstestppd would no longer result zero exit code.
+ In the long run the PPDs should be fixed but as far as we know
+ there have been no problems because of such UIConstraints errors
+ so that it should be o.k. let those PPDs pass even if they are
+ not strictly compliant.
+* Tue Aug 7 2007 jsmeix@suse.de
+- Changed /etc/udev/rules.d/55-hpmud.rules (via a change in
+ change-udev-rules.diff) from OWNER="root" GROUP="lp" MODE="0660"
+ to OWNER="root" GROUP="lp" MODE="0664" (i.e. allow read
+ permissions for HP USB device files for normal users).
+ Reason: Without read permissions even a simple command
+ like "lsusb" cannot list HP USB devices to normal users
+ which could cause unnecessary confusion.
+ Furthermore have only read permissions for HP USB device files
+ for normal users is in compliance to the default assumptions
+ in upstream HPLIP and it should be sufficiently secure because
+ for retrieving data from the device a matching request must be
+ sent to the device which requires write permissions.
+* Thu Aug 2 2007 jsmeix@suse.de
+- Updated to version 2.7.7:
+ Many bug fixes (no Suse bugs).
+ Some more supported Photosmart printers.
+ For details see release_notes.html
+- fix-printing-white-spaces-and-empty-lines.diff is no longer
+ needed because the bug is now fixed in the source.
+* Thu Jul 26 2007 jsmeix@suse.de
+- Changed change-udev-rules.diff so that 55-hpmud.rules matches
+ also against the new SUBSYSTEM=="usb" but keep "usb_device"
+ for backward compatibility (Novell/Suse Bugzilla bnc#294161).
+* Fri Jul 6 2007 jsmeix@suse.de
+- fix-printing-white-spaces-and-empty-lines.diff fixes printing
+ white spaces and empty lines according to a mail from HP
+ on the hplip-help@lists.sourceforge.net list.
+* Tue Jul 3 2007 jsmeix@suse.de
+- Updated to version 2.7.6:
+ No more start-up daemons:
+ hpiod is replaced by new direct device I/O (via hpmud library),
+ hpssd (for device status) still exists but is started by default
+ as a daemon by the first user who needs it which is not nice
+ because this results a random user which runs hpssd therefore
+ we (i.e. Novell/Suse) still provide /etc/init.d/hplip which
+ is used to start hpssd as before during system boot.
+ Many bug fixes (no Suse bugs) and some enhancements.
+ Some more supported Photosmart, Color LaserJet, and DeskJet
+ printers.
+ For details see release_notes.html
+* Thu Jun 21 2007 jsmeix@suse.de
+- Added stop_on_removal to preun, insserv_cleanup to postun,
+ and ldconfig to post and postun for the hpijs sub-package.
+* Thu May 24 2007 ro@suse.de
+- Added libusb-devel to BuildRequires.
+* Fri Apr 27 2007 jsmeix@suse.de
+- Updated to version 1.7.4a:
+ Resolved a build issue that caused a couple missing files
+ in the 1.7.4 release and a fix for hp-check (no Suse bugs).
+* Mon Apr 23 2007 jsmeix@suse.de
+- Updated to version 1.7.4:
+ Many bug fixes (no Suse bugs).
+ Some more supported DeskJet printers.
+ For details see release_notes.html
+* Mon Mar 26 2007 jsmeix@suse.de
+- Updated to version 1.7.3:
+ Many bug fixes (no Suse bugs).
+ No new supported models but enhancements for some models.
+ For details see release_notes.html
+* Thu Mar 1 2007 jsmeix@suse.de
+- Updated to version 1.7.2:
+ Several more supported Officejet Pro devices.
+ New OJProKx50 device class (derived from DJGenericVIP).
+ Major hp-toolbox upgrade/redesign.
+ Many bug fixes (no Suse bugs).
+ fix-buffer-overflow.patch and hplip-1.7.1-1.patch are no longer
+ needed because the bugs are now fixed in the sources.
+* Fri Feb 16 2007 jsmeix@suse.de
+- Added a fix for fat.c to fix-buffer-overflow.patch
+ to aviod access when array subscript is above array bounds
+ (Suse Bugzilla bnc#243047).
+- Remove all byte-compiled Python .pyc (and perhaps .pyo)
+ files which are created at run-time in /usr/share/hplip/
+ via preun script (Suse Bugzilla bnc#244451).
+* Mon Feb 5 2007 jsmeix@suse.de
+- fix-buffer-overflow.patch fixes a too small string buffer
+ which overflows in line 310 in ljcolor.cpp.
+- Moved the hpijs man page to the hplip-hpijs sub-package
+ so that there is no same file in hplip and hpijs-standalone
+ (hplip-hpijs and hpijs-standalone conflict with each other).
+* Thu Feb 1 2007 jsmeix@suse.de
+- hplip-1.7.1-1.patch from HP fixes Deskjet D4100/D4160
+ christmas-tree (firmware hangs up with flashing LEDs)
+ on second print job.
+- Removed /usr/bin/hpijs.without-libcups from hplip-hpijs
+ to get rid of confusing RPM package requirements (hplip-hpijs
+ requires cups-libs because of /usr/bin/hpijs).
+- Created new package hpijs-standalone and hpijs-standalone.spec
+ for a special version of /usr/bin/hpijs which neither needs
+ a HPLIP library nor a CUPS library to run it.
+* Wed Jan 31 2007 jsmeix@suse.de
+- Removed explicite fstack-protector-all from CFLAGS and CXXFLAGS
+ because fstack-protector will be enabled by default.
+* Mon Jan 29 2007 jsmeix@suse.de
+- Package 'sane' was renamed to 'sane-backends'.
+ Adapted it so that it works with 'sane-backends'.
+* Thu Jan 25 2007 jsmeix@suse.de
+- Updated to version 1.7.1:
+ Many bug fixes (no Suse bugs).
+ No new supported models but enhancements for several models.
+ For details see release_notes.html
+- Removed the fix for uninitialized file pointer in api/model.c
+ from fix-uninitialized-variables.diff because it is now
+ fixed in the sources.
+* Fri Jan 19 2007 jsmeix@suse.de
+- Added fix for uninitialized file pointer in api/model.c to
+ fix-uninitialized-variables.diff (Suse Bugzilla bnc#236709).
+* Fri Jan 12 2007 jsmeix@suse.de
+- Since version 1.6.12 /usr/bin/hpijs is linked with libcups
+ so that the package hplip-hpijs could be no longer installed
+ without at least the package cups-libs. Therefore an additional
+ special /usr/bin/hpijs.without-libcups is built which does not
+ require the CUPS library.
+* Wed Dec 20 2006 jsmeix@suse.de
+- Updated to version 1.6.12:
+ Three more supported LaserJet printers.
+ Many bug fixes (no Suse bugs).
+ For details see release_notes.html
+ Added SANE_DEBUG_HPAIO support for the hpaio SANE backend.
+ The new models.dat file replaces the .xml files. The hplip_api
+ can be used to get model attributes without running the HPLIP
+ daemons. See hplip_api.h for reference (this affects the Suse
+ Bugzilla bugs bnc#184798 and bnc#184824).
+- Fixed hp-toolbox.wrapper to catch 'error' regardless of the case
+ (see Suse Bugzilla bnc#229620).
+* Tue Oct 17 2006 jsmeix@suse.de
+- Updated to version 1.6.10:
+ Several more supported LaserJet printers.
+ Many bug fixes (no Suse bugs).
+- Fixed typo in keyword in some LaserJet PPDs
+ ("* PageRegion" -> "*PageRegion").
+* Mon Sep 18 2006 jsmeix@suse.de
+- Updated to version 1.6.9:
+ Added support CD/DVD label printing (ie: PS D5100).
+ Several more supported Photosmart printers.
+ Many bug fixes (no Suse bugs).
+* Mon Sep 11 2006 jsmeix@suse.de
+- Using generalised cupsext* and pcardext* in the files section
+ (instead of explicit only cupsext.so and pcardext.so)
+ so that it works now both for Python 2.4 and 2.5
+ (the latter installs additional *.egg-info files).
+* Mon Sep 4 2006 jsmeix@suse.de
+- Exchanged the hard RPM requirement for ghostscript_any by a
+ supplements entry for hplip-hpijs so that there is no longer
+ a mutual (cyclic) hard RPM dependency between hplip-hpijs
+ and ghostscript-library.
+* Thu Aug 3 2006 jsmeix@suse.de
+- Updated to version 1.6.7:
+ Changed from dynamic IP ports to static IANA IP ports
+ for hpiod (2208) and hpssd (2207).
+ Two more supported Photosmart printers.
+ Several bug fixes (no Suse bugs).
+* Mon Jul 17 2006 jsmeix@suse.de
+- Fixed PPDs which contain "1284DeviceId" which must be
+ "1284DeviceID" (detected by new CUPS 1.2 cupstestppd).
+* Wed Jun 28 2006 jsmeix@suse.de
+- Updated to maintenance release 1.6.6a:
+ This provides various minor fixes and enhancements.
+ For details see doc/release_notes.html in the source
+ or /usr/share/doc/packages/hplip/release_notes.html
+* Mon Jun 19 2006 jsmeix@suse.de
+- Updated to version 1.6.6:
+ HPLIP has reached 1.0 status.
+ With this release a date encoded revision number x.y.m is used:
+ x = major release number, y = year (6=2006), m = month (6=June)
+ Correct URLs in HTML docs (obsoletes fix-doc-hrefs.diff).
+ Removed DeviceOpen from hp backend. This fixes two problems:
+ 1) usblp will no longer be removed for device discovery
+ 2) device discovery will no longer cause Inkjets to power-up.
+ Added hpaio.desc file for SANE.
+ Several more supported printers.
+- Cleaned up build (simplified spec file):
+ Changed install dir for PPDs and doc in Makefile.am.
+ Using configure without rpm-install.
+ Using configure with --disable-cups-install.
+ Links to work around inconsistent naming of python scripts
+ and links to hpfax backend and its associated PPD file
+ are no longer needed.
+* Fri Jun 9 2006 jsmeix@suse.de
+- Added man page for /usr/bin/hpijs (hpijs.1.gz).
+- Fixed wrong URLs in HTML documentation (fix-doc-hrefs.diff).
+- Added links to work around inconsistent naming of python scripts.
+- Added links to hpfax backend and its associated PPD file
+ to make them available as usual for CUPS setup tools.
+* Mon May 22 2006 jsmeix@suse.de
+- Fixed typo (missing '"') in hplip-init-script.diff
+* Fri May 19 2006 jsmeix@suse.de
+- Updated to version 0.9.11:
+ Revised and updated documentation.
+ Some more supported all-in-one devices and printers.
+ Several bug fixes (no Suse bugs).
+- Updated to version 0.9.10:
+ Several bug fixes (no Suse bugs).
+- Updated to version 0.9.9:
+ Uses libusb for all USB I/O.
+ CUPS USB DeviceURIs must be changed from
+ "hp:/hp_model?device=/dev/usb/lpX" (no longer supported)
+ to "hp:/hp_model?serial=xxxxxxxx".
+ One more supported all-in-one device.
+ Several bug fixes (no Suse bugs).
+- Updated to version 0.9.8:
+ New PC send fax support via special CUPS backend (hpfax)
+ and special HP-Fax-hplip.ppd PPD file
+ and a new send fax UI (hp-sendfax).
+ Some more supported printers.
+ Several bug fixes (no Suse bugs).
+* Wed Apr 26 2006 jsmeix@suse.de
+- Fixed PPDs for "LaserJet 5Si" and "LaserJet 5MP"
+ (see Suse Bugzilla bnc#164991).
+* Fri Feb 24 2006 jsmeix@suse.de
+- Fixed an array index underflow (for LJ1010, LJ1012)
+ in ljfastraster.cpp (Suse Bugzilla bnc#152720).
+* Wed Jan 25 2006 mls@suse.de
+- converted neededforbuild to BuildRequires
+* Thu Jan 12 2006 jsmeix@suse.de
+- Set compiler flag "-fstack-protector-all" to build it with
+ "Stack Protector" via a so called "canary" (requires gcc >= 4.1)
+* Wed Jan 4 2006 jsmeix@suse.de
+- Moved /usr/lib[64]/libhpip.* library files to the hplip-hpijs
+ sub-package because /usr/bin/hpijs requires libhpip but for
+ special cases (e.g. for a minimal printing system) it should
+ be possible to use only HPIJS without the rest of HPLIP.
+* Tue Jan 3 2006 jsmeix@suse.de
+- Updated to version 0.9.7
+ including the additional hplip-0.9.7-2.patch from HP.
+* Thu Dec 22 2005 ro@suse.de
+- requires: PyQt -> python-qt
+* Thu Dec 1 2005 jsmeix@suse.de
+- Removed unneeded KDE packages from "neededforbuild" since
+ the new package python-qt was split from kdebindings3-python
+ (see Suse Bugzilla bnc#135250).
+* Mon Nov 28 2005 jsmeix@suse.de
+- Replaced requirement for the package kdebindings3-python
+ by a generic requirement for the RPM capability PyQt
+ to avoid needless dependencies to KDE libraries
+ (see Suse Bugzilla bnc#135250).
+* Tue Nov 22 2005 jsmeix@suse.de
+- Added -fno-strict-aliasing to the CXXFLAGS to avoid problems
+ in ljfastraster.cpp (line 1213) and hpijs.cpp (lines 86, 223).
+* Fri Nov 18 2005 jsmeix@suse.de
+- Updated to version 0.9.6
+* Wed Sep 21 2005 jsmeix@suse.de
+- Updated to version 0.9.5
+ including the additional hplip-0.9.5-3.patch from HP.
+* Mon Sep 12 2005 jsmeix@suse.de
+- Several PPDs contain "600x600x2dpi" which is not allowed
+ according to the Adobe PPD specification section 5.9
+ and which is therefore simply replaced by "600x1200dpi"
+ (see Suse Bugzilla bnc#116393).
+* Mon Aug 29 2005 jsmeix@suse.de
+- Removed a non-working PPD.
+- Fix "... is used uninitialized ..." warning.
+* Tue Jul 26 2005 jsmeix@suse.de
+- Updated to version 0.9.4
+- Removed obsolete fixes for missing class prototypes.
+- Removed obsolete fixes for HP_Business_Inkjet_3000.ppd
+- Added a fix for condrestart in /etc/init.d/hplip
+* Tue May 31 2005 jsmeix@suse.de
+- Updated to version 0.9.3
+* Tue May 24 2005 jsmeix@suse.de
+- Fixed missing class prototypes, otherwise it fails with
+ "error: ISO C++ forbids declaration of 'xxx' with no type".
+* Tue May 17 2005 jsmeix@suse.de
+- Fix "... is used uninitialized ..." warnings.
+* Wed May 4 2005 jsmeix@suse.de
+- Updated to version 0.9.2 which does no longer need
+ the "fix C" (i.e. hplip-0.8.8.diff) from below.
+* Sun Apr 10 2005 coolo@suse.de
+- fix C
+* Tue Mar 22 2005 jsmeix@suse.de
+- Added PreReq.
+* Thu Mar 17 2005 jsmeix@suse.de
+- Fixed a bug in HP-DeskJet_3740-hpijs.ppd.gz:
+ According to hpijs_readme.html the DeskJet 3740 belongs to the
+ DJ3320 device class.
+* Tue Mar 8 2005 jsmeix@suse.de
+- Added %%suse_update_desktop_file stuff for hp-toolbox.
+- Moved %%{_libdir}/libsane-hpaio.* to %%{_libdir}/sane/
+ instead of creating symlinks (see Tue Mar 1 11:15:33).
+* Tue Mar 1 2005 jsmeix@suse.de
+- Added python-xml to RPM requirements because otherwise
+ hpssd (i.e. /usr/share/hplip/hpssd.py) doesn't work.
+- Create symlinks (via '%%triggerin -- sane') to all
+ %%{_libdir}/libsane-hpaio.* so that SANE will find them.
+- Added kdebindings3-python to RPM requirements because otherwise
+ hp-toolbox (i.e. /usr/share/hplip/toolbox) doesn't work.
+* Tue Feb 22 2005 jsmeix@suse.de
+- Changed default media size from Letter to A4
+ if this is an available choice in the PPD.
+* Tue Feb 15 2005 jsmeix@suse.de
+- Updated to version 0.8.8, for details see ChangeLog and
+ http://hpinkjet.sourceforge.net/updates.php
+- Removed the "compatibility"-links because they are not needed.
+- Fixed basic stuff in the init script (needs further improvement).
+- Source should be x86_64 clean (SUSE patch no longer needed).
+* Tue Feb 1 2005 jsmeix@suse.de
+- Updated to version 0.8.7, for details see ChangeLog and
+ http://hpinkjet.sourceforge.net/updates.php
+- Added triggerin and postun scripts to add and remove
+ the SANE backend "hpaio" in /etc/sane.d/dll.conf
+- Replaced hplip-0.8.4-models.xml.diff by
+ hplip-0.8.7-models.xml.diff because the "HP LaserJet 1220"
+ is now in the models.xml file but the entry is buggy.
+* Tue Jan 25 2005 jsmeix@suse.de
+- Branched the sub-package hplip-hpijs which contains only
+ the plain HPIJS binary so that Ghostscript can require
+ only this sub-package (without all the other stuff).
+- Added a link to the toolbox program to have it accessible
+ via the user's PATH.
+- Added the usual 'rc'-link to the runlevel script.
+- Added the following RPM requirements regarding printing:
+ hplip requires hplip-hpijs and foomatic-filters
+ hplip-hpijs requires ghostscript_any
+ (There are no RPM requirements regarding scanning because
+ HPLIP will be also used for plain printers.)
+- Exchanged the destructive line for the cupsd in the runlevel script
+ because cupsd runs as user lp and dies in case of a SIGHUP.
+* Tue Jan 18 2005 jsmeix@suse.de
+- patch hplip-0.8.4-models.xml.diff adds the "HP LaserJet 1220"
+ to the list of known models of the SANE backend "hpaio"
+* Wed Jan 12 2005 sf@suse.de
+- add --libdir=%%_libdir to build on multilib archs
+- add patch for cups search path for backends
+* Thu Dec 2 2004 jsmeix@suse.de
+- initial version
diff --git a/packaging/no-chgrp_lp_hplip_Logdir.diff b/packaging/no-chgrp_lp_hplip_Logdir.diff
new file mode 100644
index 0000000..3388074
--- /dev/null
+++ b/packaging/no-chgrp_lp_hplip_Logdir.diff
@@ -0,0 +1,20 @@
+--- Makefile.am.orig 2012-04-10 10:35:14.000000000 +0200
++++ Makefile.am 2012-04-13 12:05:40.000000000 +0200
+@@ -509,14 +509,14 @@ endif
+ install-dist_hplip_LogDATA:
+ if FULL_BUILD
+ test -z "$(DESTDIR)$(hplip_Logdir)" || mkdir -p $(DESTDIR)$(hplip_Logdir)
+- chgrp "lp" -R $(DESTDIR)$(hplip_Logdir)
++# chgrp "lp" -R $(DESTDIR)$(hplip_Logdir)
+ chmod 774 $(DESTDIR)$(hplip_Logdir)
+ endif #FULL_BUILD
+ if HPLIP_BUILD
+ test -z "$(DESTDIR)$(hplip_Logdir)" || mkdir -p $(DESTDIR)$(hplip_Logdir)
+- chgrp "lp" -R $(DESTDIR)$(hplip_Logdir)
++# chgrp "lp" -R $(DESTDIR)$(hplip_Logdir)
+ chmod 774 $(DESTDIR)$(hplip_Logdir)
+-endif #FULL_BUILD
++endif #HPLIP_BUILD
+
+ install-data-hook:
+ if HPLIP_BUILD
diff --git a/packaging/tizen_add_sigpipe_ign.patch b/packaging/tizen_add_sigpipe_ign.patch
new file mode 100644
index 0000000..720450f
--- /dev/null
+++ b/packaging/tizen_add_sigpipe_ign.patch
@@ -0,0 +1,11 @@
+--- prnt/hpcups/HPCupsFilter.cpp.orig 2012-09-18 13:38:56.754794644 +0900
++++ prnt/hpcups/HPCupsFilter.cpp 2012-09-17 14:10:09.481765002 +0900
+@@ -521,7 +521,7 @@
+ */
+
+ signal(SIGTERM, HPCancelJob);
+-
++ signal(SIGPIPE, SIG_IGN);
+
+ cups_raster = cupsRasterOpen(fd, CUPS_RASTER_READ);
+
diff --git a/packaging/tizen_disable_dbus_hpcups.patch b/packaging/tizen_disable_dbus_hpcups.patch
new file mode 100644
index 0000000..5e38389
--- /dev/null
+++ b/packaging/tizen_disable_dbus_hpcups.patch
@@ -0,0 +1,20 @@
+--- prnt/hpcups/HPCupsFilter.cpp.orig 2012-09-18 15:45:46.546793734 +0900
++++ prnt/hpcups/HPCupsFilter.cpp 2012-09-18 15:46:08.966793734 +0900
+@@ -408,7 +408,7 @@
+ }
+
+ string strPrinterURI="" ,strPrinterName= "";
+- m_DBusComm.initDBusComm(DBUS_PATH,DBUS_INTERFACE, getenv("DEVICE_URI"), m_JA.printer_name);
++ //m_DBusComm.initDBusComm(DBUS_PATH,DBUS_INTERFACE, getenv("DEVICE_URI"), m_JA.printer_name);
+
+ ptr = strstr(m_argv[5], "job-uuid");
+ if (ptr) {
+@@ -429,7 +429,7 @@
+ {
+ fputs ("STATE: +hplip.plugin-error\n", stderr);
+
+- m_DBusComm.sendEvent(EVENT_PRINT_FAILED_MISSING_PLUGIN, "Plugin missing", m_JA.job_id, m_JA.user_name);
++ //m_DBusComm.sendEvent(EVENT_PRINT_FAILED_MISSING_PLUGIN, "Plugin missing", m_JA.job_id, m_JA.user_name);
+
+ }
+ dbglog ("m_Job initialization failed with error = %d", err);
diff --git a/packaging/tizen_fix_debug_log.patch b/packaging/tizen_fix_debug_log.patch
new file mode 100644
index 0000000..1507c93
--- /dev/null
+++ b/packaging/tizen_fix_debug_log.patch
@@ -0,0 +1,11 @@
+--- prnt/hpcups/HPCupsFilter.cpp.orig 2012-10-30 16:05:54.096118488 +0900
++++ prnt/hpcups/HPCupsFilter.cpp 2012-10-30 16:08:33.800115451 +0900
+@@ -846,7 +846,7 @@
+ FILE *fp;
+ char str[258];
+ char *p;
+- fp = fopen ("/etc/cups/cupsd.conf", "r");
++ fp = fopen ("/opt/etc/cups/cupsd.conf", "r");
+ if (fp == NULL)
+ return;
+ while (!feof (fp))
diff --git a/packaging/tizen_fix_image_align.patch b/packaging/tizen_fix_image_align.patch
new file mode 100644
index 0000000..d0fbf62
--- /dev/null
+++ b/packaging/tizen_fix_image_align.patch
@@ -0,0 +1,11 @@
+--- prnt/hpcups/HPCupsFilter.cpp.orig 2012-10-30 16:05:54.096118488 +0900
++++ prnt/hpcups/HPCupsFilter.cpp 2012-10-30 16:08:33.800115451 +0900
+@@ -328,7 +328,7 @@
+ m_JA.media_attributes.printable_height = cups_header->cupsHeight;
+
+ m_JA.media_attributes.printable_start_x = (cups_header->Margins[0] * horz_res) / 72;
+- m_JA.media_attributes.printable_start_y = ((cups_header->PageSize[1] - cups_header->ImagingBoundingBox[3]) * vert_res) / 72;
++ m_JA.media_attributes.printable_start_y = ( cups_header->Margins[1] * vert_res) / 72;
+
+ m_JA.media_attributes.horizontal_overspray = (xoverspray * horz_res) / 1000;
+ m_JA.media_attributes.vertical_overspray = (yoverspray * vert_res) / 1000;
diff --git a/pcard/__init__.py b/pcard/__init__.py
new file mode 100644
index 0000000..97d3c89
--- /dev/null
+++ b/pcard/__init__.py
@@ -0,0 +1,20 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2007 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
diff --git a/pcard/fat.c b/pcard/fat.c
new file mode 100644
index 0000000..888bccc
--- /dev/null
+++ b/pcard/fat.c
@@ -0,0 +1,789 @@
+/*****************************************************************************\
+
+ fat.c - FAT12/FAT16 file system
+
+ (c) 2004 Copyright Hewlett-Packard Development Company, LP
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+ Author: David Suffield
+
+ Caveats:
+ 1. Global variables are used, therefore this library is not thread safe.
+ 2. Current implementation has not been tested on a big-edian system.
+
+\*****************************************************************************/
+
+#include <stdlib.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+#include <netinet/in.h>
+#include "fat.h"
+
+/*
+ * Private data structures.
+ */
+
+typedef struct
+{
+ int FatStartSector;
+ int DataStartSector;
+ int RootDirStartSector;
+ int RootDirNumSectors;
+ uint8_t *Fat; /* cached FAT16 data */
+ int FatSize; /* in bytes */
+ uint8_t *Fat12; /* FAT12 backup */
+ int Fat12Size; /* in bytes */
+ uint8_t *Fat16; /* FAT16 backup */
+ int WriteProtect; /* 0=false, 1=true */
+} DISK_ATTRIBUTES;
+
+typedef struct
+{
+ char Name[16];
+ int StartCluster; /* equals zero if root */
+ int StartSector;
+ int CurrSector;
+ int NumEntries;
+} CURRENT_WORKING_DIRECTORY;
+
+typedef struct
+{
+ char Name[16];
+ char Attr;
+ int StartCluster;
+ int CurrCluster;
+ int Size;
+ int CurrSector;
+ int CurrSectorNumInCluster;
+ int CurrByte;
+ int DirSectorNum;
+ int DirEntryNum; /* number in current directory */
+} CURRENT_FILE_ATTRIBUTES;
+
+typedef struct
+{
+ char JumpInstruction[3]; /* offset = 0 */
+ char OEMID[8]; /* 3 */
+ uint16_t BytesPerSector; /* 11 */
+ uint8_t SectorsPerCluster; /* 13 */
+ uint16_t ReservedSectors; /* 14 */
+ uint8_t Fats; /* number of copies of the fat, 16 */
+ uint16_t RootEntries; /* 17 */
+ uint16_t SmallSectors; /* 19 */
+ uint8_t Media; /* 21 */
+ uint16_t SectorsPerFat; /* 22 */
+ uint16_t SectorsPerTrack; /* 24 */
+ uint16_t Heads; /* 26 */
+ uint32_t HiddenSectors; /* 28 */
+ uint32_t LargeSectors; /* number of sector if SmallSectors == 0, 32 */
+ uint8_t DriveNumber; /* 36 */
+ uint8_t CurrentHead; /* 37 */
+ uint8_t Signature; /* 38 */
+ uint32_t ID; /* random serial number, 39 */
+ uint8_t VolumeLabel[11]; /* 43 */
+ uint8_t SystemID[8]; /* 54 */
+ uint8_t LoadInstructions[512-64];
+ uint16_t EndSignature; /*=AA55h*/
+} __attribute__((packed)) FAT_BOOT_SECTOR; /* 512 bytes total */
+
+typedef struct
+{
+ char Name[8],Ext[3]; /* name and extension */
+ uint8_t Attributes; /* attribute bits */
+ uint8_t Reserved[10];
+ uint16_t Time;
+ uint16_t Date;
+ uint16_t StartCluster;
+ uint32_t Size; /* size of the file in bytes */
+} __attribute__((packed)) FAT_DIRECTORY; /* 32 bytes total */
+
+#define FAT_IS_DIR 0x10
+#define FAT_END_OF_DIR 0x2
+#define FAT_FILE_DELETED 0xe5
+#define FAT_LONG_FILENAME 0x3
+
+/*
+ * Private data objects. Note, static variables are initialized to zero.
+ */
+static FAT_BOOT_SECTOR bpb; /* bios parameter block */
+static DISK_ATTRIBUTES da;
+static CURRENT_WORKING_DIRECTORY cwd;
+static CURRENT_FILE_ATTRIBUTES fa;
+
+/* Convert 12-bit FAT to 16-bit FAT. */
+int ConvertFat12to16(uint8_t *dest, uint8_t *src, int maxentry)
+{
+ uint8_t *p12 = src;
+ uint16_t *p16 = (uint16_t *)dest;
+ int i;
+
+ for (i=0; i<maxentry; i++)
+ {
+ if (i&1)
+ {
+ *p16++ = lit2hs(*(uint16_t *)p12 >> 4); /* odd fat entry */
+ p12+=2;
+ }
+ else
+ {
+ *p16++ = lit2hs(*(uint16_t *)p12 & 0xfff); /* even fat entry */
+ p12++;
+ }
+ }
+ return 0;
+}
+
+/* Convert 16-bit FAT to 12-bit FAT. */
+int ConvertFat16to12(uint8_t *dest, uint8_t *src, int maxentry)
+{
+ uint8_t *p12 = dest;
+ uint16_t *p16 = (uint16_t *)src;
+ int i;
+
+ for (i=0; i<maxentry; i++, p16++)
+ {
+ if (i&1)
+ {
+ *p12 = (uint8_t)h2lits(*p16 >> 4); /* odd fat entry */
+ p12++;
+ }
+ else
+ {
+ *(uint16_t *)p12 = h2lits(*p16 | (*(p16+1) << 12)); /* even fat entry */
+ p12+=2;
+ }
+ }
+ return 0;
+}
+
+int readsect(int sector, int nsector, void *buf, int size)
+{
+ int len=nsector, total=0;
+ int i, n, stat=1;
+
+ /* Read 1-blksize sectors. */
+ for (i=0; i<nsector; i+=n, len-=n)
+ {
+ n = len > FAT_BLKSIZE ? FAT_BLKSIZE : len;
+ if (ReadSector(sector+i, n, buf+total, size-total) != 0)
+ goto bugout;
+ total += n*FAT_HARDSECT;
+ }
+
+ stat = 0;
+
+bugout:
+ return stat;
+};
+
+int writesect(int sector, int nsector, void *buf, int size)
+{
+ int len=nsector, total=0;
+ int i, n, stat=1;
+
+ /* Write 1-blksize sectors. */
+ for (i=0; i<nsector; i+=n, len-=n)
+ {
+ n = len > FAT_BLKSIZE ? FAT_BLKSIZE : len;
+ if (WriteSector(sector+i, n, buf+total, size-total) != 0)
+ goto bugout;
+ total += n*FAT_HARDSECT;
+ }
+
+ stat = 0;
+
+bugout:
+ return stat;
+};
+
+int UpdateFat(void)
+{
+ int stat=1;
+ uint8_t *p12=NULL;
+ int i, total=0;
+
+ if (strcmp((char *)bpb.SystemID, "FAT12") == 0)
+ {
+ if ((p12 = malloc(da.Fat12Size)) == NULL)
+ goto bugout;
+ ConvertFat16to12(p12, da.Fat, da.Fat12Size/1.5);
+ for (i=0; i<bpb.SectorsPerFat; i++)
+ {
+ if (memcmp(p12+total, da.Fat12+total, FAT_HARDSECT) != 0)
+ if (writesect(da.FatStartSector+i, 1, p12+total, FAT_HARDSECT) != 0)
+ goto bugout;
+ total += FAT_HARDSECT;
+ }
+ }
+ else
+ { /* Assume FAT16 */
+ for (i=0; i<bpb.SectorsPerFat; i++)
+ {
+ if (memcmp(da.Fat+total, da.Fat16+total, FAT_HARDSECT) != 0)
+ if (writesect(da.FatStartSector+i, 1, da.Fat+total, FAT_HARDSECT) != 0)
+ goto bugout;
+ total += FAT_HARDSECT;
+ }
+ }
+
+ stat = 0;
+
+bugout:
+
+ if (p12 != NULL)
+ free(p12);
+
+ return stat;
+};
+
+int RootSetCWD(void)
+{
+ /* Set CWD to the root directory. */
+ cwd.Name[0] = '/'; cwd.Name[1] = 0;
+ cwd.StartSector = da.RootDirStartSector;
+ cwd.CurrSector = cwd.StartSector;
+ cwd.NumEntries = bpb.RootEntries;
+ cwd.StartCluster = 0;
+
+ return 0;
+};
+
+/* Returns number of free clusters (ie: those with 0x0 as the value in FAT). */
+int FindFreeClusters(void)
+{
+ int16_t *pfat = (int16_t *)da.Fat;
+ int max_entry = da.FatSize/2;
+ int i, freeclusters=0;
+
+ for (i=0; i<max_entry; i++)
+ {
+ if (*pfat++ == 0x0)
+ freeclusters++;
+ }
+ return freeclusters;
+}
+
+int ConvertClusterToSector(int cluster)
+{
+ int sector;
+
+ sector = cluster - 2; /* skip first two FAT entries */
+ sector *= bpb.SectorsPerCluster; /* find the sector number relative to data start */
+ sector += da.DataStartSector; /* find absolute sector number */
+
+ return sector;
+}
+
+/* Get next cluster from FAT. */
+int GetNextCluster(int cluster)
+{
+ uint16_t *pfat = (uint16_t *)da.Fat;
+ return *(pfat+cluster);
+}
+
+/* Tries to load the directory entry specified by filenumber. */
+int LoadFileInCWD(int filenumber)
+{
+ uint8_t buf[FAT_HARDSECT];
+ FAT_DIRECTORY *pde = (FAT_DIRECTORY *)buf;
+ int i, j, fn, sector, cluster, cluster_cnt;
+ int de_per_sector = FAT_HARDSECT/sizeof(FAT_DIRECTORY);
+ uint8_t c;
+
+ sector = filenumber / de_per_sector; /* determine sector offset */
+ fn = filenumber - (sector * de_per_sector); /* determine file number in sector */
+
+ if (cwd.StartCluster)
+ { /* CWD = subdirectory */
+
+ /* Determine cluster */
+ cluster = cwd.StartCluster;
+ cluster_cnt = sector / bpb.SectorsPerCluster;
+ for (i=0; i<cluster_cnt && cluster<0xfff7 && cluster; i++)
+ cluster = GetNextCluster(cluster);
+ if (cluster >= 0xfff7 || cluster == 0)
+ return FAT_END_OF_DIR;
+ cwd.CurrSector = ConvertClusterToSector(cluster);
+ sector -= cluster_cnt * bpb.SectorsPerCluster;
+ }
+ else
+ { /* CWD = root */
+ cwd.CurrSector = cwd.StartSector;
+
+ /* Check for max entry. */
+ if (filenumber > (da.RootDirNumSectors * de_per_sector))
+ return FAT_END_OF_DIR;
+ }
+
+ cwd.CurrSector += sector;
+
+ fa.DirEntryNum = fn;
+ fa.DirSectorNum = cwd.CurrSector;
+
+ /* Read the directory sector. */
+ pde += fn;
+ pde->Name[0] = 0;
+ readsect(fa.DirSectorNum, 1, buf, sizeof(buf));
+
+ c = pde->Name[0];
+ if (c == 0x0)
+ return FAT_END_OF_DIR;
+ if (c == FAT_FILE_DELETED)
+ return FAT_FILE_DELETED;
+
+ /* Read file information from directory and convert to 8.3 format. */
+ for (i=0; (i<sizeof(pde->Name)) && pde->Name[i] && (pde->Name[i] != ' '); i++) /* copy charactors up to any space */
+ fa.Name[i] = pde->Name[i];
+ if (pde->Ext[0] && (pde->Ext[0] != ' '))
+ {
+ fa.Name[i++] = '.';
+ for (j=0; (pde->Ext[j] != ' ') && (j<sizeof(pde->Ext)); j++, i++) /* copy charactors up to space */
+ fa.Name[i] = pde->Ext[j];
+ }
+
+ fa.Name[i] = 0; /* zero terminate */
+
+ fa.Attr = pde->Attributes;
+
+ if (pde->Attributes == 0xf)
+ {
+ return FAT_LONG_FILENAME; /* ignor long filename (slot) directory entries */
+ }
+
+ fa.StartCluster = pde->StartCluster;
+ fa.CurrCluster = fa.StartCluster;
+ fa.Size = pde->Size;
+ fa.CurrSectorNumInCluster = 0;
+
+ return 0;
+}
+
+/* Look in CWD for file with given name. */
+int LoadFileWithName(char *filename)
+{
+ int filenum;
+ int ret, stat=1;
+
+ filenum = 0;
+
+ while (1)
+ {
+ ret = LoadFileInCWD(filenum);
+ if (ret == FAT_END_OF_DIR)
+ break;
+
+ if ((ret != FAT_FILE_DELETED) && (ret != FAT_LONG_FILENAME))
+ {
+ if (strcasecmp(fa.Name, filename) == 0)
+ {
+ stat = 0; /* found file */
+ break;
+ }
+ }
+ filenum++;
+ }
+ return stat;
+}
+
+void PrintCurrFileInfo(void)
+{
+ fprintf(stdout, "%s %d bytes (cluster %d, sector %d)", fa.Name, fa.Size,
+ fa.StartCluster, ConvertClusterToSector(fa.StartCluster));
+ if (fa.Attr & FAT_IS_DIR)
+ fputs(" <DIR>\n", stdout);
+ else
+ fputc('\n', stdout);
+}
+
+/* Get the FAT boot sector and root directory. */
+int FatInit(void)
+{
+ int bootsector_startsector, stat=1, fatsize;
+ char dummy[FAT_HARDSECT];
+
+ if (da.Fat != NULL)
+ free(da.Fat);
+ if (da.Fat12 != NULL)
+ free(da.Fat12);
+ da.Fat = NULL;
+ da.Fat12 = NULL;
+
+ /* Assume no MBR and boot sector starts at first sector. */
+ bootsector_startsector = 0;
+
+ /* Read boot sector. */
+ /*fprintf( stdout, "start=%d", bootsector_startsector );*/
+ if (readsect(bootsector_startsector, 1, &bpb, sizeof(bpb)) != 0)
+ goto bugout;
+
+ /* TODO: take care big-endian byte ordering in bpb. */
+
+ if (bpb.BytesPerSector != FAT_HARDSECT)
+ goto bugout;
+
+ bpb.SystemID[5] = 0;
+
+ if (verbose > 0)
+ {
+ fprintf(stderr, "bytes/sectors=%d\n", bpb.BytesPerSector);
+ fprintf(stderr, "sectors/cluster=%d\n", bpb.SectorsPerCluster);
+ fprintf(stderr, "reserved sectors=%d\n", bpb.ReservedSectors);
+ fprintf(stderr, "sectors/FAT=%d\n", bpb.SectorsPerFat);
+ fprintf(stderr, "root entries=%d\n", bpb.RootEntries);
+ fprintf(stderr, "small sectors=%d\n", bpb.SmallSectors);
+ fprintf(stderr, "large sectors=%d\n", bpb.LargeSectors);
+ fprintf(stderr, "system id=%s\n", bpb.SystemID);
+ }
+
+ /* Calculate where the fat and root directory are. */
+ da.FatStartSector = bootsector_startsector + bpb.ReservedSectors;
+ da.RootDirNumSectors = ((bpb.RootEntries * 32) + (bpb.BytesPerSector - 1)) / bpb.BytesPerSector;
+ da.RootDirStartSector = da.FatStartSector + ((int16_t)bpb.Fats * (int16_t)bpb.SectorsPerFat);
+ da.DataStartSector = da.RootDirStartSector + da.RootDirNumSectors;
+
+ RootSetCWD();
+ fatsize = bpb.SectorsPerFat * FAT_HARDSECT;
+
+ if (strcmp((char *)bpb.SystemID, "FAT12") == 0)
+ {
+ da.Fat12Size = fatsize;
+ if ((da.Fat12 = (uint8_t *)malloc(da.Fat12Size)) == NULL)
+ goto bugout;
+ if (readsect(da.FatStartSector, bpb.SectorsPerFat, da.Fat12, da.Fat12Size) != 0)
+ goto bugout;
+ da.FatSize = da.Fat12Size/1.5*2;
+ if ((da.Fat = (uint8_t *)malloc(da.FatSize)) == NULL)
+ goto bugout;
+ ConvertFat12to16(da.Fat, da.Fat12, da.Fat12Size/1.5);
+ }
+ else
+ {
+ da.FatSize = fatsize;
+ if ((da.Fat16 = (uint8_t *)malloc(da.FatSize)) == NULL)
+ goto bugout;
+ if (readsect(da.FatStartSector, bpb.SectorsPerFat, da.Fat16, da.FatSize) != 0)
+ goto bugout;
+ if ((da.Fat = (uint8_t *)malloc(da.FatSize)) == NULL)
+ goto bugout;
+ memcpy(da.Fat, da.Fat16, da.FatSize);
+ }
+
+ if (verbose > 0)
+ {
+ fprintf(stderr, "FAT start sector=%d\n", da.FatStartSector);
+ fprintf(stderr, "root start sector=%d\n", da.RootDirStartSector);
+ fprintf(stderr, "root number of sectors=%d\n", da.RootDirNumSectors);
+ fprintf(stderr, "data start sector=%d\n", da.DataStartSector);
+ }
+
+ /* Check for write protected disk. Try read/write to last sector in root directory. */
+ da.WriteProtect = 1;
+ if (readsect(da.RootDirStartSector+da.RootDirNumSectors-1, 1, dummy, sizeof(dummy)) == 0)
+ if (writesect(da.RootDirStartSector+da.RootDirNumSectors-1, 1, dummy, sizeof(dummy)) == 0)
+ da.WriteProtect = 0;
+
+ stat = 0;
+
+bugout:
+ if (stat != 0)
+ {
+ if (da.Fat != NULL)
+ free(da.Fat);
+ if (da.Fat12 != NULL)
+ free(da.Fat12);
+ if (da.Fat16 != NULL)
+ free(da.Fat16);
+ }
+ return stat;
+}
+
+int FatFreeSpace(void)
+{
+ return(FindFreeClusters() * bpb.SectorsPerCluster * FAT_HARDSECT);
+}
+
+int FatDiskAttributes( PHOTO_CARD_ATTRIBUTES * pa )
+{
+ strncpy( pa->OEMID, bpb.OEMID, 8 );
+ pa->BytesPerSector = bpb.BytesPerSector;
+ pa->SectorsPerCluster = bpb.SectorsPerCluster;
+ pa->ReservedSectors = bpb.ReservedSectors;
+ pa->SectorsPerFat = bpb.SectorsPerFat;
+ pa->RootEntries = bpb.RootEntries;
+ strncpy( pa->SystemID, (char *)bpb.SystemID, 8 );
+ strncpy( pa->VolumeLabel, (char *)bpb.VolumeLabel, 11 );
+ pa->WriteProtect = da.WriteProtect;
+
+ return 0;
+}
+
+/* Prints out all entries in the current directory to stdout. */
+int FatListDir(void)
+{
+ int ret, filenum;
+ int freespace;
+
+ if (verbose > 0)
+ {
+ freespace = FatFreeSpace();
+ fprintf(stdout, "Free Space=%d bytes\n", freespace);
+ }
+
+ filenum = 0;
+ while (1)
+ {
+ ret = LoadFileInCWD(filenum);
+ if (ret == FAT_END_OF_DIR)
+ {
+ fputs("<EOD>\n", stdout);
+ break;
+ }
+ if ((ret != FAT_FILE_DELETED) && (ret != FAT_LONG_FILENAME))
+ PrintCurrFileInfo();
+ filenum++;
+ }
+ return 0;
+}
+
+/* Directory List "Iterator": Begin, Next... */
+static int fatdir_filenum = 0;
+
+int FatDirBegin(FILE_ATTRIBUTES *a)
+{
+ fatdir_filenum = 0;
+ return FatDirNext( a );
+}
+
+int FatDirNext(FILE_ATTRIBUTES *a)
+{
+ int ret;
+ ret = LoadFileInCWD( fatdir_filenum );
+
+ if( ret == FAT_END_OF_DIR )
+ return 0;
+
+ if ((ret != FAT_FILE_DELETED) && (ret != FAT_LONG_FILENAME))
+ {
+ strcpy( a->Name, fa.Name );
+
+ if( fa.Attr == FAT_IS_DIR )
+ a->Attr = 'd';
+ else
+ a->Attr = ' ';
+
+ a->Size = fa.Size;
+ }
+ else
+ {
+ strcpy( a->Name, "" );
+ a->Attr = 'x';
+ a->Size = 0;
+ }
+
+ fatdir_filenum++;
+ return 1;
+}
+
+/* Dump FAT file to the output file (fd). */
+int FatReadFile(char *name, int fd)
+{
+ uint8_t *buf=NULL;
+ int cluster, sector, old;
+ int block = bpb.SectorsPerCluster * FAT_HARDSECT;
+ int i, n, total = 0;
+
+ if (LoadFileWithName(name) != 0)
+ goto bugout; /* file not found */
+
+ cluster = fa.StartCluster;
+ sector = ConvertClusterToSector(cluster);
+
+ if ((buf = malloc(block)) == NULL)
+ {
+ goto bugout;
+ }
+
+ for (i=0; i<fa.Size; i+=n)
+ {
+ if (readsect(sector, bpb.SectorsPerCluster, buf, block) != 0) /* read full cluster */
+ {
+ total = -1;
+ goto bugout;
+ }
+
+ n = fa.Size-i > block ? block : fa.Size-i;
+ write(fd, buf, n);
+
+ total += n;
+ old = cluster;
+ cluster = GetNextCluster(cluster);
+ if (cluster >= 0xfff7 || cluster == 0)
+ break;
+
+ sector = ConvertClusterToSector(cluster);
+ }
+
+bugout:
+ if (buf != NULL)
+ free(buf);
+
+ return total;
+}
+
+/* Dump FAT file, given the "offset" in bytes and the "len" in bytes, to the output buffer. */
+int FatReadFileExt(char *name, int offset, int len, void *outbuf)
+{
+ uint8_t *buf=NULL;
+ int cluster, sector, old;
+ int block = bpb.SectorsPerCluster * FAT_HARDSECT; /* cluster size in bytes */
+ int i, n, total = 0, btotal = 0;
+ int bn, boff, blen;
+ int b1 = offset / block; /* first cluster to read */
+ int b2 = (offset+len) / block; /* last cluster to read */
+
+ if (LoadFileWithName(name) != 0)
+ goto bugout; /* file not found */
+
+ cluster = fa.StartCluster;
+ sector = ConvertClusterToSector(cluster);
+
+ if ((buf = malloc(block)) == NULL)
+ {
+ goto bugout;
+ }
+
+ for (i=0, bn=0; i<fa.Size; i+=n, bn++)
+ {
+ /* Determine size in bytes to write for this cluster */
+ n = fa.Size-i > block ? block : fa.Size-i;
+
+ /* Read/write data if it falls within "offset" and "len". */
+ if (bn >= b1)
+ {
+ if (readsect(sector, bpb.SectorsPerCluster, buf, block) != 0) /* read full cluster */
+ {
+ total = -1;
+ goto bugout;
+ }
+
+ if (bn == b1)
+ boff = offset-total; /* cluster overlaps "offset" */
+ else
+ boff = 0; /* cluster is past "offset" */
+
+ if (bn <= b2)
+ {
+ if (bn == b2)
+ blen = (offset+len)-total-boff; /* cluster overlaps "len" */
+ else
+ blen = n-boff; /* cluster is within "len" */
+
+ memcpy(outbuf+btotal, buf+boff, blen);
+ btotal += blen;
+ }
+ else
+ break; /* done writing data */
+ }
+
+ total += n;
+ old = cluster;
+ cluster = GetNextCluster(cluster);
+ if (cluster >= 0xfff7 || cluster == 0)
+ break;
+
+ sector = ConvertClusterToSector(cluster);
+ }
+
+bugout:
+ if (buf != NULL)
+ free(buf);
+
+ return btotal;
+}
+
+/* Make dir current working directory. */
+int FatSetCWD(char *dir)
+{
+ int ret;
+
+ if (dir[0] == '.')
+ return 0;
+
+ if (dir[0] == '/')
+ {
+ RootSetCWD();
+ return 0;
+ }
+
+ if (strcmp(cwd.Name, dir) == 0)
+ return 0;
+
+ ret = LoadFileWithName(dir);
+ if (ret != 0)
+ return ret;
+
+ if (!(fa.Attr & FAT_IS_DIR))
+ return 1;
+
+ strncpy(cwd.Name, fa.Name, sizeof(cwd.Name));
+ cwd.StartSector = ConvertClusterToSector(fa.StartCluster);
+ cwd.CurrSector = cwd.StartSector;
+ cwd.StartCluster = fa.StartCluster;
+ return 0;
+}
+
+int FatDeleteFile(char *name)
+{
+ uint8_t buf[FAT_HARDSECT];
+ uint16_t *pfat = (uint16_t *)da.Fat;
+ int cluster, next_cluster, filenum, stat=1;
+
+ if (LoadFileWithName(name) != 0)
+ goto bugout;
+
+ cluster = fa.StartCluster;
+
+ /* Free all fat cluster entries for specified file. */
+ while ((cluster <= 0xFFF8) && (cluster != 0x0000))
+ {
+ next_cluster = *(pfat+cluster); /* get next cluster */
+ *(pfat+cluster) = 0; /* free current cluster */
+ cluster = next_cluster;
+ }
+
+ /* Remove directory entry for specified file. */
+ readsect(fa.DirSectorNum, 1, buf, sizeof(buf));
+ filenum = fa.DirEntryNum & 0x000F;
+ filenum <<= 4;
+ buf[filenum * 2] = FAT_FILE_DELETED;
+ if (writesect(fa.DirSectorNum, 1, buf, sizeof(buf)) != 0)
+ goto bugout;
+
+ /* Write updated fat to disk. */
+ if (UpdateFat() != 0)
+ goto bugout;
+
+ stat = 0;
+
+bugout:
+ return stat;
+}
+
+
+
+
diff --git a/pcard/fat.h b/pcard/fat.h
new file mode 100644
index 0000000..7b347b4
--- /dev/null
+++ b/pcard/fat.h
@@ -0,0 +1,79 @@
+/*****************************************************************************\
+
+ fat.h - FAT12/FAT16 file system
+
+ (c) 2004 Copyright Hewlett-Packard Development Company, LP
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USALP
+
+\*****************************************************************************/
+#ifndef _FAT_H
+#define _FAT_H
+
+#define FAT_HARDSECT 512 /* sector size in bytes */
+
+/* Block size is set to the lowest common denominator. The ps325 reads 3 sectors max per command (LP?). While the ps130, ps 245,
+ * and ?? can do 8 sector reads.
+ */
+#define FAT_BLKSIZE 3 /* block size in sectors */
+
+typedef struct
+{
+ char Name[16];
+ char Attr;
+ int Size;
+} FILE_ATTRIBUTES;
+
+typedef struct
+{
+ char OEMID[8];
+ int BytesPerSector;
+ int SectorsPerCluster;
+ int ReservedSectors;
+ int RootEntries;
+ int SectorsPerFat;
+ char VolumeLabel[11];
+ char SystemID[8];
+ int WriteProtect;
+} PHOTO_CARD_ATTRIBUTES;
+
+/* APIs */
+int FatInit(void);
+int FatListDir(void);
+int FatReadFile(char *name, int fd);
+int FatReadFileExt(char *name, int offset, int len, void *outbuf);
+int FatSetCWD(char *dir);
+int FatDeleteFile(char *name);
+int FatFreeSpace(void);
+int FatDirBegin(FILE_ATTRIBUTES * a);
+int FatDirNext(FILE_ATTRIBUTES * a);
+int FatDiskAttributes(PHOTO_CARD_ATTRIBUTES * pa);
+
+/* System dependent external functions */
+extern int ReadSector(int sector, int nsector, void *buf, int size);
+extern int WriteSector(int sector, int nsector, void *buf, int size);
+
+extern int verbose;
+
+#if defined(WORDS_BIGENDIAN)
+#define h2lits(A) ((((uint16_t)(A) & 0xff00) >> 8) | (((uint16_t)(A) & 0x00ff) << 8)) /* host to little-endian 16-bit value */
+#define lit2hs h2lits /* little-endian to host 16-bit value */
+
+#else
+#define h2lits(A) (A)
+#define lit2hs(A) (A)
+#endif
+
+#endif // _FAT_H
diff --git a/pcard/pcardext/pcardext.c b/pcard/pcardext/pcardext.c
new file mode 100644
index 0000000..0470984
--- /dev/null
+++ b/pcard/pcardext/pcardext.c
@@ -0,0 +1,246 @@
+/*****************************************************************************\
+pcardext - Python extension for HP photocard services
+
+ (c) Copyright 2003-2007 Hewlett-Packard Development Company, L.P.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+Requires:
+Python 2.2+
+
+Author: Don Welch
+
+\*****************************************************************************/
+
+#include <Python.h>
+#include <structmember.h>
+#include "../fat.h"
+
+
+/* Ref: PEP 353 (Python 2.5) */
+#if PY_VERSION_HEX < 0x02050000
+typedef int Py_ssize_t;
+#define PY_SSIZE_T_MAX INT_MAX
+#define PY_SSIZE_T_MIN INT_MIN
+#endif
+
+int verbose=0;
+
+PyObject * readsectorFunc = NULL;
+PyObject * writesectorFunc = NULL;
+
+int ReadSector(int sector, int nsector, void *buf, int size)
+{
+ PyObject * result;
+ char * result_str;
+
+ if( readsectorFunc )
+ {
+ if( nsector <= 0 || (nsector*FAT_HARDSECT) > size || nsector > FAT_BLKSIZE )
+ goto abort;
+
+ result = PyObject_CallFunction( readsectorFunc, "ii", sector, nsector );
+
+ if( result )
+ {
+ Py_ssize_t len = 0;
+ PyString_AsStringAndSize( result, &result_str, &len );
+
+ if( len < nsector*FAT_HARDSECT )
+ {
+ goto abort;
+ }
+
+ memcpy( buf, result_str, nsector*FAT_HARDSECT );
+ return 0;
+ }
+ }
+
+abort:
+ return 1;
+}
+
+int WriteSector(int sector, int nsector, void *buf, int size )
+{
+ PyObject * result;
+
+ if( writesectorFunc )
+ {
+ result = PyObject_CallFunction( writesectorFunc, "iis#", sector, nsector, buf, size );
+
+ return PyInt_AS_LONG( result );
+ }
+
+ return 1;
+}
+
+
+PyObject * pcardext_mount( PyObject * self, PyObject * args )
+{
+ if( !PyArg_ParseTuple( args, "OO", &readsectorFunc, &writesectorFunc ) )
+ {
+ return Py_BuildValue( "i", 1 );
+ }
+
+ if( !PyCallable_Check( readsectorFunc ) || !PyCallable_Check( writesectorFunc ) )
+ {
+ return Py_BuildValue( "i", 2 );
+ }
+
+ Py_INCREF( readsectorFunc );
+ Py_INCREF( writesectorFunc );
+
+ int i = FatInit();
+ /*char buf[1024];
+ sprintf( buf, "print 'FatInit()=%d\n'", i );
+ PyRun_SimpleString( buf );*/
+
+ return Py_BuildValue( "i", i ); // ==0 ->OK, !=0 --> NG
+}
+
+
+PyObject * pcardext_df( PyObject * self, PyObject * args )
+{
+ return Py_BuildValue( "i", FatFreeSpace() );
+}
+
+
+PyObject * pcardext_ls( PyObject * self, PyObject * args )
+{
+ PyObject * file_list;
+ file_list = PyList_New((Py_ssize_t)0);
+ FILE_ATTRIBUTES fa;
+
+ FatDirBegin( &fa );
+
+ do
+ {
+ if( fa.Attr != 'x' )
+ PyList_Append( file_list, Py_BuildValue( "(sci)", fa.Name, fa.Attr, fa.Size ) );
+
+ } while( FatDirNext( &fa ) );
+
+ return file_list;
+}
+
+
+PyObject * pcardext_cp( PyObject * self, PyObject * args )
+{
+ char * name;
+ int fileno = 0;
+
+ if( !PyArg_ParseTuple( args, "si", &name, &fileno ) )
+ {
+ return Py_BuildValue( "i", 0 );
+ }
+
+ return Py_BuildValue( "i", FatReadFile( name, fileno ) );
+}
+
+PyObject * pcardext_cd( PyObject * self, PyObject * args )
+{
+ char * dir;
+
+ if( !PyArg_ParseTuple( args, "s", &dir ) )
+ {
+ return Py_BuildValue( "i", 0 );
+ }
+
+ FatSetCWD( dir );
+
+ return Py_BuildValue( "i", 1 );
+}
+
+PyObject * pcardext_rm( PyObject * self, PyObject * args )
+{
+ char * name;
+ if( !PyArg_ParseTuple( args, "s", &name ) )
+ {
+ return Py_BuildValue( "i", 0 );
+ }
+
+ return Py_BuildValue( "i", FatDeleteFile( name ) );
+}
+
+PyObject * pcardext_umount( PyObject * self, PyObject * args )
+{
+ return Py_BuildValue( "" );
+}
+
+PyObject * pcardext_info( PyObject * self, PyObject * args )
+{
+ PHOTO_CARD_ATTRIBUTES pa;
+ FatDiskAttributes( &pa );
+
+ return Py_BuildValue( "(siiiiissi)", pa.OEMID, pa.BytesPerSector, pa.SectorsPerCluster, pa.ReservedSectors,
+ pa.RootEntries, pa.SectorsPerFat, pa.VolumeLabel, pa.SystemID,
+ pa.WriteProtect );
+}
+
+PyObject * pcardext_read( PyObject * self, PyObject * args )
+{
+ char * name;
+ int offset = 0;
+ Py_ssize_t len = 0;
+ void * buffer;
+
+ if( !PyArg_ParseTuple( args, "sii", &name, &offset, &len ) )
+ {
+ return Py_BuildValue( "s", "" );
+ }
+
+ buffer = alloca( len );
+
+ if( FatReadFileExt( name, offset, len, buffer ) == len )
+ {
+ return PyString_FromStringAndSize( (char *)buffer, len );
+ }
+ else
+ {
+ return Py_BuildValue( "s", "" );
+ }
+
+
+}
+
+
+static PyMethodDef pcardext_methods[] =
+{
+ { "mount", (PyCFunction)pcardext_mount, METH_VARARGS },
+ { "ls", (PyCFunction)pcardext_ls, METH_VARARGS },
+ { "cp", (PyCFunction)pcardext_cp, METH_VARARGS },
+ { "cd", (PyCFunction)pcardext_cd, METH_VARARGS },
+ { "rm", (PyCFunction)pcardext_rm, METH_VARARGS },
+ { "umount", (PyCFunction)pcardext_umount, METH_VARARGS },
+ { "df", (PyCFunction)pcardext_df, METH_VARARGS },
+ { "info", (PyCFunction)pcardext_info, METH_VARARGS },
+ { "read", (PyCFunction)pcardext_read, METH_VARARGS },
+ { NULL, NULL }
+};
+
+
+static char pcardext_documentation[] = "Python extension for HP photocard services";
+
+void initpcardext( void )
+{
+ PyObject * mod = Py_InitModule4( "pcardext", pcardext_methods,
+ pcardext_documentation, (PyObject*)NULL,
+ PYTHON_API_VERSION );
+
+ if (mod == NULL)
+ return;
+}
+
+
diff --git a/pcard/photocard.py b/pcard/photocard.py
new file mode 100644
index 0000000..77964c3
--- /dev/null
+++ b/pcard/photocard.py
@@ -0,0 +1,741 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2007 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+
+# Std Lib
+import struct
+import time
+import fnmatch
+import mimetypes
+import array
+
+# Local
+from base.g import *
+from base.codes import *
+from base import device, utils, exif
+
+try:
+ import pcardext
+except ImportError:
+ if not os.getenv("HPLIP_BUILD"):
+ log.error("PCARDEXT could not be loaded. Please check HPLIP installation.")
+ sys.exit(1)
+
+# Photocard command codes
+ACK = 0x0100
+NAK = 0x0101
+READ_CMD = 0x0010
+WRITE_CMD = 0x0020
+
+SECTOR_SIZE = 512 # don't change this (TODO: impl. in pcardext)
+
+# Photocard sector cache
+MAX_CACHE = 512 # units = no. sectors
+
+# PhotoCardFile byte cache
+# Used for thumbnails
+INITIAL_PCARDFILE_BUFFER = 20*SECTOR_SIZE
+INCREMENTAL_PCARDFILE_BUFFER = 2*SECTOR_SIZE
+
+class PhotoCardFile:
+ # File-like interface
+
+ def __init__(self, pc, name=None):
+ self.pos = 0
+ self.closed = True
+ self.file_size = 0
+ self.pc = pc
+ self.buffer = array.array('c')
+
+ if name is not None:
+ self.open(name)
+
+ self.buffer_size = INITIAL_PCARDFILE_BUFFER
+ self.buffer.fromstring(pcardext.read(self.name, 0, self.buffer_size))
+
+
+ def open(self, name):
+ self.closed = False
+ self.name = name
+
+ def seek(self, offset, whence=0):
+ if whence == 0:
+ self.pos = offset
+ elif whence == 1:
+ self.pos += offset
+ elif whence == 2:
+ self.pos = self.file_size - offset
+ else:
+ return
+
+
+ def tell(self):
+ return self.pos
+
+
+ def read(self, size):
+ if size > 0:
+ if self.pos + size < self.buffer_size:
+ data = self.buffer[self.pos : self.pos + size].tostring()
+ self.pos += size
+ return data
+ else:
+ # Read some more in from the card to satisfy the request
+ while self.pos + size >= self.buffer_size:
+ self.buffer.fromstring(pcardext.read(self.name, self.buffer_size, INCREMENTAL_PCARDFILE_BUFFER))
+ self.buffer_size += INCREMENTAL_PCARDFILE_BUFFER
+ return self.read(size)
+
+
+ def close(self):
+ self.closed = True
+ self.pos = 0
+
+
+class PhotoCard:
+
+ def __init__(self, dev_obj=None, device_uri=None, printer_name=None):
+
+ if dev_obj is None:
+ self.device = device.Device(device_uri, printer_name)
+ self.device.open()
+ self.close_device = True
+ else:
+ self.device = dev_obj
+ self.close_device = False
+
+ self.dir_stack = utils.Stack()
+ self.current_dir = []
+ self.device_uri = self.device.device_uri
+ self.pcard_mounted = False
+ self.saved_pwd = []
+ self.sector_buffer = {}
+ self.sector_buffer_counts = {}
+ self.cache_flag = True
+ self.write_protect = False
+
+ self.callback = None
+
+ self.channel_opened = False
+
+
+ def START_OPERATION(self, name=''):
+ pass
+
+ def END_OPERATION(self, name='', flag=True):
+ if self.channel_opened and flag:
+ self.close_channel()
+
+ def set_callback(self, callback):
+ self.callback = callback
+
+ def _read(self, sector, nsector):
+ log.debug("read pcard sector: sector=%d count=%d" % (sector, nsector))
+
+ if self.cache_flag:
+ for s in range(sector, sector+nsector):
+ if s not in self.sector_buffer:
+ break
+ else:
+ buffer = ''
+ for s in range(sector, sector+nsector):
+ buffer = ''.join([buffer, self.sector_buffer[s]])
+ log.debug("Cached sector read sector=%d" % s)
+ count = self.sector_buffer_counts[s]
+ self.sector_buffer_counts[s] = count+1
+
+ if self.callback is not None:
+ self.callback()
+
+ #log.log_data(buffer)
+ return buffer
+
+ if self.callback is not None:
+ self.callback()
+
+ if not self.channel_opened:
+ self.open_channel()
+
+ log.debug("Normal sector read sector=%d count=%d" % (sector, nsector))
+ sectors_to_read = range(sector, sector+nsector)
+ request = struct.pack('!HH' + 'I'*nsector, READ_CMD, nsector, *sectors_to_read)
+ #log.log_data(request)
+
+ if self.callback is not None:
+ self.callback()
+
+ # send out request
+ bytes_written = self.device.writePCard(request)
+ log.debug("%d bytes written" % bytes_written)
+
+ # read return code
+ data = self.device.readPCard(2)
+ #log.log_data(data)
+ code = struct.unpack('!H', data)[0]
+
+ log.debug("Return code: %x" % code)
+
+ if code == 0x0110:
+
+ # read sector count and version
+ data = self.device.readPCard(6)
+ nsector_read, ver = struct.unpack('!IH', data)
+
+ log.debug("code=0x%x, nsector=%d, ver=%d" % (code, nsector_read, ver))
+
+ buffer, data_read, total_to_read = '', 0, nsector * SECTOR_SIZE
+
+ while (data_read < total_to_read):
+ data = self.device.readPCard(total_to_read)
+
+ data_read += len(data)
+ buffer = ''.join([buffer, data])
+
+ if self.callback is not None:
+ self.callback()
+
+ if self.cache_flag:
+ i = 0
+
+ for s in range(sector, sector + nsector_read):
+ self.sector_buffer[s] = buffer[i : i+SECTOR_SIZE]
+ #log.debug("Sector %d data=\n%s" % (s, repr(self.sector_buffer[s])))
+ count = self.sector_buffer_counts.get(s, 0)
+ self.sector_buffer_counts[s] = count+1
+ i += SECTOR_SIZE
+
+ if self.callback is not None:
+ self.callback()
+
+ self._check_cache(nsector)
+
+ #log.log_data(buffer)
+ return buffer
+ else:
+ log.error("Error code: %d" % code)
+ return ''
+
+ def _write(self, sector, nsector, buffer):
+
+ #log.debug("write pcard sector: sector=%d count=%d len=%d data=\n%s" % (sector, nsector, len(buffer), repr(buffer)))
+ log.debug("write pcard sector: sector=%d count=%d len=%d" % (sector, nsector, len(buffer)))
+
+ if not self.channel_opened:
+ self.open_channel()
+
+
+ sectors_to_write = range(sector, sector+nsector)
+ request = struct.pack('!HHH' + 'I'*nsector, WRITE_CMD, nsector, 0, *sectors_to_write)
+ request = ''.join([request, buffer])
+
+ if self.callback is not None:
+ self.callback()
+
+ self.device.writePCard(request)
+ data = self.device.readPCard(2)
+
+ if self.callback is not None:
+ self.callback()
+
+ code = struct.unpack('!H', data)[0]
+
+ if code != NAK:
+ if self.cache_flag:
+ i = 0
+ for s in range(sector, sector+nsector):
+ log.debug("Caching sector %d" % sector)
+ self.sector_buffer[s] = buffer[i:i+SECTOR_SIZE]
+ self.sector_buffer_counts[s] = 1
+ i += SECTOR_SIZE
+
+ if self.callback is not None:
+ self.callback()
+
+ self._check_cache(nsector)
+
+ return 0
+
+ else:
+ if self.cache_flag:
+ for s in range(sector, sector+nsector):
+ try:
+ del self.sector_buffer[s]
+ del self.sector_buffer_counts[s]
+ except KeyError:
+ pass
+
+ log.error("Photo card write failed (Card may be write protected)")
+ self.close_channel()
+ return 1
+
+
+ def _check_cache(self, nsector):
+ if len(self.sector_buffer) > MAX_CACHE:
+ # simple minded: scan for first nsector sectors that has count of 1 and throw it away
+ t, n = self.sector_buffer.keys()[:], 0
+ for s in t:
+ if self.sector_buffer_counts[s] == 1:
+ del self.sector_buffer[s]
+ del self.sector_buffer_counts[s]
+ n += 1
+ if n >= nsector:
+ break
+ if self.callback is not None:
+ self.callback()
+
+
+
+ def cache_info(self):
+ return self.sector_buffer_counts
+
+ def cache_check(self, sector):
+ return self.sector_buffer_counts.get(sector, 0)
+
+ def cache_control(self, control):
+ self.cache_flag = control
+
+ if not self.cache_flag:
+ self.cache_reset()
+
+ def cache_state(self):
+ return self.cache_flag
+
+ def cache_reset(self):
+ self.sector_buffer.clear()
+ self.sector_buffer_counts.clear()
+
+ def df(self):
+ df = 0
+ self.START_OPERATION('df')
+ try:
+ df = pcardext.df()
+ finally:
+ self.END_OPERATION('df')
+ return df
+
+ def ls(self, force_read=True, glob_list='*', openclose=True):
+ if not glob_list:
+ glob_list = '*'
+ if force_read:
+ self.START_OPERATION('ls')
+ try:
+ self.current_dir = pcardext.ls()
+ finally:
+ self.END_OPERATION('ls', openclose)
+
+ self.current_dir = [(n.lower(),a,s) for (n,a,s) in self.current_dir]
+
+ if glob_list == '*':
+ return self.current_dir
+
+ return [fnmatch.filter(self.current_dir, x) for x in glob_list.strip().lower().split()][0]
+
+ def size(self, name):
+ for f in self.current_dir:
+ if f == name:
+ return self.current_dir[f][2]
+ return 0
+
+ def current_files(self):
+ return [x for x in self.current_dir if x[1] != 'd']
+
+ def current_directories(self):
+ return [x for x in self.current_dir if x[1] == 'd']
+
+ def match_files(self, glob_list):
+ if len(glob_list) > 0:
+ current_files = [x[0] for x in self.current_files()]
+ return [fnmatch.filter(current_files, x) for x in glob_list.strip().lower().split()][0]
+ return []
+
+ def match_dirs(self, glob_list):
+ if len(glob_list) > 0:
+ current_dirs = [x[0] for x in self.current_directories()]
+ return [fnmatch.filter(current_dirs, x) for x in glob_list.strip().lower().split()][0]
+ return []
+
+ def classify_file(self, filename):
+ t = mimetypes.guess_type(filename)[0]
+ if t is None:
+ return 'unknown/unknown'
+ return t
+
+ # copy a single file fom pwd to lpwd
+ def cp(self, name, local_file, openclose=True):
+ self.START_OPERATION('cp')
+ total = 0
+ try:
+ f = file(local_file, 'w');
+ total = pcardext.cp(name, f.fileno())
+ f.close()
+ finally:
+ self.END_OPERATION('cp', openclose)
+ return total
+
+ # cp multiple files in the current working directory
+ def cp_multiple(self, filelist, remove_after_copy, cp_status_callback=None, rm_status_callback=None):
+ delta, total = 0, 0
+ self.START_OPERATION('cp_multiple')
+ t1 = time.time()
+ try:
+ for f in filelist:
+
+ size = self.cp(f, f, False)
+
+ if cp_status_callback:
+ cp_status_callback(os.path.join(self.pwd(), f), os.path.join(os.getcwd(), f), size)
+
+ total += size
+
+
+ if remove_after_copy:
+ pcardext.rm(f)
+
+ t2 = time.time()
+ delta = t2-t1
+ finally:
+ if remove_after_copy:
+ self.ls(True, '*', False)
+ self.END_OPERATION('cp_multiple')
+ return (total, delta)
+
+ # cp multiple files with paths
+ def cp_list(self, filelist, remove_after_copy, cp_status_callback=None, rm_status_callback=None):
+ self.save_wd()
+ delta, total = 0, 0
+ self.START_OPERATION('cp_list')
+ t1 = time.time()
+ try:
+ for f in filelist:
+
+ path_list = f.split('/')[:-1]
+ filename = f.split('/')[-1]
+
+ for p in path_list:
+ self.cd(p, False)
+
+ size = self.cp(filename, filename, False)
+
+ if cp_status_callback is not None:
+ cp_status_callback(f, os.path.join(os.getcwd(), filename), size)
+
+ total += size
+
+ if remove_after_copy:
+ pcardext.rm(filename)
+
+ if rm_status_callback is not None:
+ rm_status_callback(f)
+
+ self.cd('/', False)
+
+ t2 = time.time()
+ delta = t2-t1
+ finally:
+ #if remove_after_copy:
+ # self.ls( True, '*', False )
+ self.restore_wd()
+ self.END_OPERATION('cp_list')
+ return (total, delta)
+
+
+
+ def cp_fd(self, name, fd):
+ total = 0
+ self.START_OPERATION('cp_fd')
+ try:
+ total = pcardext.cp(name, fd)
+ finally:
+ self.END_OPERATION('cp_fd')
+ return total
+
+
+ def unload(self, unload_list, cp_status_callback=None, rm_status_callback=None, dont_remove=False):
+ was_cancelled = False
+ self.save_wd()
+ self.START_OPERATION('unload')
+ total = 0
+ t1 = time.time()
+
+ for f in unload_list:
+ if not was_cancelled:
+ name, size, typ, subtyp = f
+
+ p = name.split('/')
+ dirs = p[:-1]
+ filename = p[-1]
+ self.cd('/', False)
+
+ if cp_status_callback is not None:
+ if cp_status_callback(os.path.join(self.pwd(), filename),
+ os.path.join(os.getcwd(), filename), 0):
+ was_cancelled = True
+ break
+
+ if len(dirs) > 0:
+ for d in dirs:
+ self.cd(d, False)
+
+ if os.path.exists(os.path.join(os.getcwd(), filename)):
+ i = 2
+
+ while True:
+ if not os.path.exists(os.path.join(os.getcwd(), filename + " (%d)" % i)):
+ break
+
+ i += 1
+
+ total += self.cp(filename, filename + " (%d)" % i, False)
+
+ else:
+ total += self.cp(filename, filename, False)
+
+ if cp_status_callback is not None:
+ if cp_status_callback(os.path.join(self.pwd(), filename),
+ os.path.join(os.getcwd(), filename), size):
+ was_cancelled = True
+ break
+
+ if not dont_remove:
+ if rm_status_callback is not None:
+ rm_status_callback(os.path.join(self.pwd(), filename))
+
+ self.rm(filename, False, False)
+
+
+ t2 = time.time()
+ self.restore_wd(False)
+ self.ls(True, '*', False)
+ self.END_OPERATION('unload')
+
+ return total, (t2-t1), was_cancelled
+
+
+ def get_unload_list(self):
+ tree = self.tree()
+ return self.__build_unload_list(tree)
+
+
+ def __build_unload_list(self, tree, path=None, out=None):
+ if path is None:
+ out = []
+ path = utils.Stack()
+ for d in tree:
+ if type(tree[d]) == type({}):
+ path.push(d)
+ self.__build_unload_list(tree[d], path, out)
+ path.pop()
+ else:
+ typ, subtyp = self.classify_file(d).split('/')
+ if typ in ['image', 'audio', 'video']:
+ p = path.as_list()
+ name = '/'.join(['/'.join(p), d])
+ out.append((name, tree[d], typ, subtyp))
+
+ return out
+
+
+ def info(self):
+ return pcardext.info()
+
+
+ def cd(self, dirs, openclose=True):
+ self.START_OPERATION('cd')
+ try:
+ stat = pcardext.cd(dirs)
+ if stat:
+ if dirs == '/':
+ self.dir_stack.clear()
+
+ else:
+ dirs = dirs.split('/')
+ for d in dirs:
+ self.dir_stack.push(d)
+
+ self.ls(True, '*', False)
+
+ finally:
+ self.END_OPERATION('cd', openclose)
+
+
+ def cdup(self, openclose=True):
+ if len(self.dir_stack.as_list()) == 0:
+ return self.cd('/', openclose)
+
+ self.dir_stack.pop()
+ self.START_OPERATION('cdup')
+ try:
+ pcardext.cd('/')
+
+ for d in self.dir_stack.as_list():
+ pcardext.cd(d)
+
+ self.ls(True, '*', False)
+ finally:
+ self.END_OPERATION('cdup', openclose)
+
+ def rm(self, name, refresh_dir=True, openclose=True):
+ self.START_OPERATION()
+ try:
+ r = pcardext.rm(name)
+
+ if refresh_dir:
+ self.ls(True, '*', False)
+ finally:
+ self.END_OPERATION(openclose)
+ return r
+
+ def mount(self):
+ log.debug("Mounting photocard...")
+ self.START_OPERATION('mount')
+ try:
+ stat = pcardext.mount(self._read, self._write)
+ disk_info = pcardext.info()
+ self.write_protect = disk_info[8]
+ log.debug("stat=%d" % stat)
+
+ if stat == 0:
+ if self.write_protect:
+ # if write_protect is True,
+ # card write NAK'd and channel was
+ # closed. We have to reopen here.
+ self.open_channel()
+
+ self.pcard_mounted = True
+ pcardext.cd('/')
+
+ self.ls(True, '*', False)
+
+ else:
+ self.pcard_mounted = False
+ raise Error(ERROR_DEVICE_DOES_NOT_SUPPORT_OPERATION)
+ finally:
+ if self.pcard_mounted:
+ self.END_OPERATION('mount')
+
+
+
+ def pwd(self):
+ return '/' + '/'.join(self.dir_stack.as_list())
+
+
+ def save_wd(self):
+ self.saved_pwd = self.dir_stack.as_list()[:]
+
+ def restore_wd(self, openclose=True):
+ self.cd('/', openclose)
+ for d in self.saved_pwd:
+ self.cd(d, openclose)
+
+
+ def tree(self):
+ self.START_OPERATION('tree')
+ dir_tree = {}
+ try:
+ self.save_wd()
+ dir_tree = self.__tree()
+ self.restore_wd(False)
+ finally:
+ self.END_OPERATION('tree')
+ return dir_tree
+
+ def __tree(self, __d=None):
+ if __d is None:
+ __d = {}
+ pcardext.cd('/')
+
+ for f in pcardext.ls(): # True, '*', False ):
+ fname = f[0].lower()
+
+ if self.callback is not None:
+ self.callback()
+
+ if fname not in ('.', '..'):
+ if f[1] == 'd':
+ self.cd(fname, False)
+ __d[fname] = {}
+ __d[fname] = self.__tree(__d[fname])
+ self.cdup(False)
+
+ else:
+ __d[fname] = f[2]
+
+ return __d
+
+
+ def get_exif(self, name):
+ exif_info = {}
+ self.START_OPERATION('get_exif')
+ pcf = None
+ try:
+ pcf = PhotoCardFile(self, name)
+ exif_info = exif.process_file(pcf)
+ finally:
+ if pcf is not None:
+ pcf.close()
+ self.END_OPERATION('get_exif')
+ return exif_info
+
+
+ def get_exif_path(self, name):
+ exif_info = {}
+ self.START_OPERATION('get_exif_path')
+ self.save_wd()
+ try:
+ path_list = name.split('/')[:-1]
+ filename = name.split('/')[-1]
+
+ for p in path_list:
+ self.cd(p, False)
+
+ pcf = PhotoCardFile(self, filename)
+ exif_info = exif.process_file(pcf)
+
+ finally:
+ self.restore_wd(False)
+ pcf.close()
+ self.END_OPERATION('get_exif_path')
+ return exif_info
+
+
+
+ def sector(self, sector):
+ self.START_OPERATION('sector')
+ try:
+ data = self._read(sector, 1)
+ finally:
+ self.END_OPERATION('sector')
+ return data
+
+ def umount(self):
+ pcardext.umount()
+ self.pcard_mounted = False
+
+ def open_channel(self):
+ self.channel_opened = True
+ self.device.openPCard()
+
+ def close_channel(self):
+ self.channel_opened = False
+ self.device.closePCard()
+
+
+
+
+
+
diff --git a/pcard/ptest.c b/pcard/ptest.c
new file mode 100644
index 0000000..6ef516f
--- /dev/null
+++ b/pcard/ptest.c
@@ -0,0 +1,466 @@
+/*****************************************************************************\
+
+ ptest.c - HP MFP photo card file manager
+
+ (c) 2004 Copyright Hewlett-Packard Development Company, LP
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+\*****************************************************************************/
+
+#include <sys/stat.h>
+#include <sys/socket.h>
+#include <sys/ioctl.h>
+#include <sys/types.h>
+#include <netinet/in.h>
+#include <netdb.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <string.h>
+#include <unistd.h>
+#include <syslog.h>
+#include <stdarg.h>
+#include <signal.h>
+#include <arpa/inet.h>
+#include <errno.h>
+#include <ctype.h>
+#include "ptest.h"
+#include "fat.h"
+#include "hpmud.h"
+
+#define EXCEPTION_TIMEOUT 45 /* seconds */
+#define DEV_ACK 0x0100
+
+typedef struct
+{
+ short cmd;
+ unsigned short nsector;
+} __attribute__((packed)) CMD_READ_REQUEST;
+
+typedef struct{
+ short cmd;
+ unsigned short nsector;
+ short cs; /* check sum is not used */
+} __attribute__((packed)) CMD_WRITE_REQUEST;
+
+typedef struct
+{
+ short cmd;
+ uint32_t nsector;
+ short ver;
+} __attribute__((packed)) RESPONSE_SECTOR;
+
+static int hd=-1, channel=-1;
+
+int verbose=0;
+
+int bug(const char *fmt, ...)
+{
+ char buf[256];
+ va_list args;
+ int n;
+
+ va_start(args, fmt);
+
+ if ((n = vsnprintf(buf, 256, fmt, args)) == -1)
+ buf[255] = 0; /* output was truncated */
+
+ fprintf(stderr, "%s", buf);
+ syslog(LOG_WARNING, "%s", buf);
+
+ fflush(stderr);
+ va_end(args);
+ return n;
+}
+
+int last_slash(const char *path, int *number_found, int *path_size)
+{
+ int i, found=0, lasti=0;
+
+ /* Find last '/'. */
+ for (i=0; path[i] && i<HPMUD_LINE_SIZE; i++)
+ if (path[i] == '/')
+ {
+ found++;
+ lasti=i;
+ }
+
+ *number_found = found;
+ *path_size = i;
+
+ return lasti;
+}
+
+int nth_slash(const char *path, int n)
+{
+ int i, found=0, lasti=0;
+
+ /* Find nth '/'. */
+ for (i=0; path[i] && i<HPMUD_LINE_SIZE; i++)
+ if (path[i] == '/')
+ {
+ found++;
+ lasti=i;
+ if (found == n)
+ break;
+ }
+
+ return lasti;
+}
+
+char *basename(const char *path)
+{
+ int len, found=0, slash_index=0;
+
+ slash_index = last_slash(path, &found, &len);
+ return found ? (char *)path+slash_index+1 : (char *)path;
+}
+
+int dirname(const char *path, char *dir)
+{
+ int len, found=0, slash_index=0;
+
+ slash_index = last_slash(path, &found, &len);
+
+ if (found == 0)
+ strcpy(dir, "."); /* no '/' */
+ else if (path[slash_index+1]==0 && found==1)
+ strcpy(dir, "/"); /* '/' only */
+ else if (path[slash_index+1]==0 && found>1)
+ {
+ slash_index = nth_slash(path, found-1); /* trailing '/', backup */
+ strncpy(dir, path, slash_index);
+ dir[slash_index]=0;
+ }
+ else
+ {
+ strncpy(dir, path, slash_index); /* normal '/' */
+ dir[slash_index]=0;
+ }
+ return slash_index; /* return length of dir */
+}
+
+int GetDir(char *path, char *dir, char **tail)
+{
+ int i=0;
+
+ dir[0] = 0;
+
+ if (path[0] == 0)
+ {
+ strcpy(dir, "."); /* end of path */
+ i = 0;
+ }
+ else if ((path[0] == '/') && (*tail != path))
+ {
+ strcpy(dir, "/"); /* found root '/' at beginning of path */
+ i=1;
+ }
+ else
+ {
+ for (i=0; path[i] && (path[i] != '/') && (i<HPMUD_LINE_SIZE); i++) /* copy directory entry */
+ dir[i] = path[i];
+ if (i==0)
+ strcpy(dir, "."); /* end of path */
+ else
+ dir[i] = 0;
+ if (path[i] == '/')
+ i++; /* bump past '/' */
+ }
+
+ if (tail != NULL)
+ *tail = path + i; /* tail points to next directory or 0 */
+
+ return i;
+}
+
+int get_uri(char *uri, int urisize)
+{
+ char buf[HPMUD_LINE_SIZE*64];
+ int i=0, cnt, bytes_read;
+ char *pBeg;
+
+ uri[0] = 0;
+
+ hpmud_probe_devices(HPMUD_BUS_USB, buf, sizeof(buf), &cnt, &bytes_read);
+
+ /* Return first uri in list. */
+ if (cnt > 0)
+ {
+ pBeg = strstr(buf, "hp:");
+ for (i=0; *pBeg != ' ' && (i < urisize); i++, pBeg++) /* copy uri */
+ uri[i] = *pBeg;
+ uri[i] = 0; /* zero terminate */
+ }
+
+ return i;
+}
+
+int ReadSector(int sector, int nsector, void *buf, int size)
+{
+ char message[HPMUD_BUFFER_SIZE];
+ int i, len, rlen, wlen, stat=1, total=0;
+ CMD_READ_REQUEST *pC;
+ RESPONSE_SECTOR *pR;
+ uint32_t *pSect;
+ short cmd=0x0010; /* read request */
+
+ if (nsector <= 0 || (nsector*FAT_HARDSECT) > size)
+ {
+ bug("ReadSector invalid sector count=%d\n", nsector);
+ goto bugout;
+ }
+
+ /* Write photo card command to device. */
+ pC = (CMD_READ_REQUEST *)message;
+ pC->cmd = htons(cmd);
+ pC->nsector = htons(nsector);
+ pSect = (uint32_t *)(message + sizeof(CMD_READ_REQUEST));
+ for (i=0; i<nsector; i++)
+ *pSect++ = htonl(sector+i);
+ wlen = sizeof(CMD_READ_REQUEST)+(4*nsector);
+ hpmud_write_channel(hd, channel, message, wlen, EXCEPTION_TIMEOUT, &len);
+
+ /* Read photo card response header from device. */
+ memset(message, 0, sizeof(RESPONSE_SECTOR));
+ rlen = sizeof(RESPONSE_SECTOR);
+ hpmud_read_channel(hd, channel, message, rlen, EXCEPTION_TIMEOUT, &len);
+ pR = (RESPONSE_SECTOR *)message;
+ if (ntohs(pR->cmd) != (cmd | DEV_ACK))
+ {
+ bug("ReadSector invalid response header cmd=%x expected=%x\n", ntohs(pR->cmd), cmd | DEV_ACK);
+ goto bugout;
+ }
+
+ if (verbose > 0)
+ {
+ static int cnt=0;
+ if (cnt++ < 1)
+ fprintf(stderr, "photo card firmware version=%x\n", ntohs(pR->ver));
+ }
+
+ /* Read photo card sector data from device. */
+ rlen = nsector*FAT_HARDSECT;
+ while (total < rlen)
+ {
+ hpmud_read_channel(hd, channel, buf+total, rlen, EXCEPTION_TIMEOUT, &len);
+ if (len == 0)
+ break; /* timeout */
+ total+=len;
+ }
+
+ if (total != rlen)
+ {
+ bug("ReadSector invalid response data len=%d expected=%d\n", total, rlen);
+ goto bugout;
+ }
+
+ stat = 0;
+
+bugout:
+ return stat;
+}
+
+int WriteSector(int sector, int nsector, void *buf, int size)
+{
+ char message[HPMUD_BUFFER_SIZE];
+ int i, len, wlen, stat=1;
+ CMD_WRITE_REQUEST *pC;
+ uint32_t *pSect;
+ short response=0, cmd=0x0020; /* write request */
+
+ if (nsector <= 0 || (nsector*FAT_HARDSECT) > size)
+ {
+ bug("WriteSector invalid sector count=%d\n", nsector);
+ goto bugout;
+ }
+
+ /* Write photo card command header to device. */
+ pC = (CMD_WRITE_REQUEST *)message;
+ pC->cmd = htons(cmd);
+ pC->nsector = htons(nsector);
+ pC->cs = 0;
+ pSect = (uint32_t *)(message + sizeof(CMD_WRITE_REQUEST));
+ for (i=0; i<nsector; i++)
+ *pSect++ = htonl(sector+i);
+ wlen = sizeof(CMD_WRITE_REQUEST)+(4*nsector);
+ hpmud_write_channel(hd, channel, message, wlen, EXCEPTION_TIMEOUT, &len);
+
+ /* Write photo card sector data to device. */
+ hpmud_write_channel(hd, channel, buf, size, EXCEPTION_TIMEOUT, &len);
+
+ /* Read response. */
+ hpmud_read_channel(hd, channel, &response, sizeof(response), EXCEPTION_TIMEOUT, &len);
+ if (ntohs(response) != DEV_ACK)
+ {
+ bug("WriteSector invalid response cmd=%x expected=%x\n", ntohs(response), DEV_ACK);
+ goto bugout;
+ }
+ stat = 0;
+
+bugout:
+ return stat;
+}
+
+void usage()
+{
+ fprintf(stdout, "HP MFP Photo Card File Manager %s\n", VERSION);
+ fprintf(stdout, "(c) 2004-2007 Copyright Hewlett-Packard Development Company, LP\n");
+ fprintf(stdout, "usage: ptest [-v] [-u uri] -c ls [-p path] (list directory)\n");
+ fprintf(stdout, " ptest [-v] [-u uri] -c read -p path (read file to stdout)\n");
+ fprintf(stdout, " ptest [-v] [-u uri] -c rm -p path (delete file)\n");
+ // fprintf(stdout, " ptest [-v] -u uri -c write -p path (write stdin to file)\n");
+}
+
+int main(int argc, char *argv[])
+{
+ char cmd[16] = "", path[HPMUD_LINE_SIZE]="", uri[HPMUD_LINE_SIZE]="", dir[HPMUD_LINE_SIZE]="", spath[HPMUD_LINE_SIZE]="";
+ extern char *optarg;
+ char *tail;
+ int i, stat=-1;
+ PHOTO_CARD_ATTRIBUTES pa;
+ struct hpmud_model_attributes ma;
+
+ while ((i = getopt(argc, argv, "vhu:c:p:")) != -1)
+ {
+ switch (i)
+ {
+ case 'c':
+ strncpy(cmd, optarg, sizeof(cmd));
+ break;
+ case 'p':
+ strncpy(path, optarg, sizeof(path));
+ break;
+ case 'u':
+ strncpy(uri, optarg, sizeof(uri));
+ break;
+ case 'v':
+ verbose++;
+ break;
+ case 'h':
+ usage();
+ exit(0);
+ case '?':
+ usage();
+ fprintf(stderr, "unknown argument: %s\n", argv[1]);
+ exit(-1);
+ default:
+ break;
+ }
+ }
+
+ if (uri[0] == 0)
+ get_uri(uri, sizeof(uri));
+ if (uri[0] == 0)
+ {
+ bug("no uri found\n");
+ goto bugout;
+ }
+
+ /* Get any parameters needed for DeviceOpen. */
+ hpmud_query_model(uri, &ma);
+
+ if (hpmud_open_device(uri, ma.mfp_mode, &hd) != HPMUD_R_OK)
+ {
+ bug("unable to open device %s\n", uri);
+ goto bugout;
+ }
+ if (hpmud_open_channel(hd, "HP-CARD-ACCESS", &channel) != HPMUD_R_OK)
+ {
+ bug("unable to open hp-card-access channel %s\n", uri);
+ goto bugout;
+ }
+
+ if (FatInit() != 0)
+ {
+ bug("unable to read photo card %s\n", uri);
+ goto bugout;
+ }
+
+ FatDiskAttributes(&pa);
+
+ /* If disk is write protected reopen channel to clear write error. */
+ if (pa.WriteProtect)
+ {
+ hpmud_close_channel(hd, channel);
+ if (hpmud_open_channel(hd, "HP-CARD-ACCESS", &channel) != HPMUD_R_OK)
+ {
+ bug("unable to open hp-card-access channel %s\n", uri);
+ goto bugout;
+ }
+ }
+
+ if (strcasecmp(cmd, "ls") == 0)
+ {
+ /* Walk the path for each directory entry. */
+ GetDir(path, dir, &tail);
+ FatSetCWD(dir);
+ while (tail[0] != 0)
+ {
+ GetDir(tail, dir, &tail);
+ FatSetCWD(dir);
+ }
+ FatListDir();
+ }
+ else if (strcasecmp(cmd, "read") == 0)
+ {
+ dirname(path, spath); /* extract directory */
+ GetDir(spath, dir, &tail);
+ FatSetCWD(dir);
+ while (tail[0] != 0)
+ {
+ GetDir(tail, dir, &tail);
+ FatSetCWD(dir);
+ }
+ if ((FatReadFile(basename(path), STDOUT_FILENO)) <= 0)
+ {
+ bug("unable to locate file %s\n", path);
+ goto bugout;
+ }
+ }
+ else if (strcasecmp(cmd, "rm") == 0)
+ {
+ dirname(path, spath); /* extract directory */
+ GetDir(spath, dir, &tail);
+ FatSetCWD(dir);
+ while (tail[0] != 0)
+ {
+ GetDir(tail, dir, &tail);
+ FatSetCWD(dir);
+ }
+ if (FatDeleteFile(basename(path)) != 0)
+ {
+ bug("unable to locate file %s\n", path);
+ goto bugout;
+ }
+ }
+ else
+ {
+ usage(); /* invalid command */
+ goto bugout;
+ }
+
+ stat = 0;
+
+bugout:
+ if (channel >= 0)
+ hpmud_close_channel(hd, channel);
+ if (hd >= 0)
+ hpmud_close_device(hd);
+
+ exit (stat);
+}
+
diff --git a/pcard/ptest.h b/pcard/ptest.h
new file mode 100644
index 0000000..db30d7e
--- /dev/null
+++ b/pcard/ptest.h
@@ -0,0 +1,32 @@
+/*****************************************************************************\
+
+ ptest.h - HP MFP photo card file manager
+
+ (c) 2004 Copyright Hewlett-Packard Development Company, LP
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+\*****************************************************************************/
+#ifndef _PTEST_H
+#define _PTEST_H
+
+int bug(const char *fmt, ...);
+int sysdump(void *data, int size);
+
+#endif // _PTEST_H
+
+
+
+
diff --git a/pkservice.py b/pkservice.py
new file mode 100755
index 0000000..4b6434e
--- /dev/null
+++ b/pkservice.py
@@ -0,0 +1,106 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2009 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+__version__ = '1.0'
+__mod__ = 'hp-pkservice'
+__title__ = 'Policy Kit Service'
+__doc__ = ""
+
+# Std Lib
+import sys
+import getopt
+import time
+import os.path
+import re
+import os
+import gzip
+
+# Local
+from base.g import *
+from base import utils, module
+
+USAGE = [ (__doc__, "", "name", True),
+ ("Usage: %s [MODE] [OPTIONS]" % __mod__, "", "summary", True),
+ utils.USAGE_MODE,
+ utils.USAGE_INTERACTIVE_MODE,
+ utils.USAGE_LANGUAGE,
+ utils.USAGE_OPTIONS,
+ utils.USAGE_LOGGING1, utils.USAGE_LOGGING2, utils.USAGE_LOGGING3,
+ utils.USAGE_HELP,
+ utils.USAGE_SPACE,
+ ]
+
+mod = module.Module(__mod__, __title__, __version__, __doc__, USAGE,
+ (INTERACTIVE_MODE, ), run_as_root_ok=True)
+
+mod.setUsage(module.USAGE_FLAG_NONE,
+ extra_options=[utils.USAGE_SPACE,
+ ("[OPTIONS] (General)", "", "header", False),
+ ("PolicyKit version:", "-v<version> or --version=<version>", "option", False)])
+
+opts, device_uri, printer_name, mode, ui_toolkit, loc = \
+ mod.parseStdOpts('v:', ["version="])
+
+user_pkit_version = None
+
+for o, a in opts:
+ if o in ('-v', '--version'):
+ try:
+ user_pkit_version = int(a)
+ except:
+ log.error("-v or --version require an integer argument")
+ sys.exit(1)
+ if user_pkit_version < 0 or user_pkit_version > 1:
+ log.error("invalid PolicyKit version...use 0 or 1")
+ sys.exit(1)
+
+PKIT = utils.to_bool(sys_conf.get('configure', 'policy-kit'))
+if PKIT:
+ try:
+ from base.pkit import *
+ pkit_version = policykit_version()
+ if not user_pkit_version is None:
+ pkit_version = user_pkit_version
+ try:
+ from dbus.mainloop.glib import DBusGMainLoop
+ except ImportError:
+ log.error("PolicyKit requires dbus")
+ sys.exit(1)
+ except:
+ log.error("Unable to load pkit...is HPLIP installed?")
+ sys.exit(1)
+else:
+ log.error("PolicyKit support not installed")
+ sys.exit(1)
+
+DBusGMainLoop(set_as_default=True)
+
+if not os.geteuid() == 0:
+ log.error("You must be root to run this utility.")
+ sys.exit(1)
+
+log.debug("using PolicyKit version %d" % pkit_version)
+
+try:
+ BackendService().run(pkit_version)
+except dbus.DBusException, ex:
+ log.error("Unable to start service (%s)" % ex)
diff --git a/plugin.py b/plugin.py
new file mode 100755
index 0000000..3271905
--- /dev/null
+++ b/plugin.py
@@ -0,0 +1,452 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2009 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+__version__ = '2.1'
+__mod__ = 'hp-plugin'
+__title__ = 'Plugin Download and Install Utility'
+__doc__ = ""
+
+# Std Lib
+import sys
+import getopt
+import time
+import os.path
+import re
+import os
+import gzip
+
+# Local
+from base.g import *
+from base import device, utils, tui, module
+from prnt import cups
+
+pm = None
+
+def plugin_download_callback(c, s, t):
+ pm.update(int(100*c*s/t),
+ utils.format_bytes(c*s))
+
+
+def plugin_install_callback(s):
+ print s
+
+def clean_exit(code=0):
+ mod.unlockInstance()
+ sys.exit(code)
+
+USAGE = [ (__doc__, "", "name", True),
+ ("Usage: %s [MODE] [OPTIONS]" % __mod__, "", "summary", True),
+ utils.USAGE_MODE,
+ utils.USAGE_GUI_MODE,
+ utils.USAGE_INTERACTIVE_MODE,
+ ("Installation for required printer mode:", "--required (Qt4 only)", "option", False),
+ ("Installation for optional printer mode:", "--optional (Qt4 only)", "option", False),
+ #("Installation generic mode:", "--generic (default)", "option", False),
+ utils.USAGE_LANGUAGE,
+ utils.USAGE_OPTIONS,
+ ("Specify the path to the plugin file:", "-p <path> or --path=<path> or --plugin=<path>", "option", False),
+ utils.USAGE_LOGGING1, utils.USAGE_LOGGING2, utils.USAGE_LOGGING3,
+ utils.USAGE_HELP,
+ utils.USAGE_SPACE,
+ utils.USAGE_SEEALSO,
+ ("hp-setup", "", "seealso", False),
+ ("hp-firmware", "", "seealso", False),
+ ]
+
+
+mod = module.Module(__mod__, __title__, __version__, __doc__, USAGE,
+ (INTERACTIVE_MODE, GUI_MODE),
+ (UI_TOOLKIT_QT3, UI_TOOLKIT_QT4), True)
+
+opts, device_uri, printer_name, mode, ui_toolkit, loc = \
+ mod.parseStdOpts('p:', ['path=', 'plugin=', 'plug-in=', 'reason=',
+ 'generic', 'optional', 'required'],
+ handle_device_printer=False)
+
+plugin_path = None
+install_mode = PLUGIN_NONE # reuse plugin types for mode (PLUGIN_NONE = generic)
+plugin_reason = PLUGIN_REASON_NONE
+
+for o, a in opts:
+ if o in ('-p', '--path', '--plugin', '--plug-in'):
+ plugin_path = os.path.normpath(os.path.abspath(os.path.expanduser(a)))
+
+ elif o == '--required':
+ install_mode = PLUGIN_REQUIRED
+ if ui_toolkit == 'qt3':
+ log.warn("--required switch ignored.")
+
+ elif o == '--optional':
+ install_mode = PLUGIN_OPTIONAL
+ if ui_toolkit == 'qt3':
+ log.warn("--optional switch ignored.")
+
+ elif o == '--reason':
+ plugin_reason = int(a)
+
+
+version = prop.installed_version
+plugin_filename = 'hplip-%s-plugin.run' % version
+
+ok= mod.lockInstance()
+if ok is False:
+ log.error("Plug-in lock acquire failed. check if hp-plugin is already running")
+ sys.exit(1)
+
+if plugin_path is not None:
+ if not os.path.exists(plugin_path):
+ log.error("Plug-in path '%s' not found." % plugin_path)
+ clean_exit(1)
+
+ if os.path.isdir(plugin_path):
+ plugin_path = os.path.join(plugin_path, 'hplip-%s-plugin.run' % version)
+
+ if not os.path.exists(plugin_path):
+ log.error("Plug-in path '%s' not found." % plugin_path)
+ clean_exit(1)
+
+ if os.path.basename(plugin_path) != plugin_filename:
+ log.error("Plug-in filename must be '%s'." % plugin_filename)
+ clean_exit(1)
+
+
+ size, checksum, timestamp = os.stat(plugin_path)[6], '', 0.0
+ plugin_path = 'file://' + plugin_path
+ log.debug("Plugin path=%s (%d)" % (plugin_path, size))
+
+
+if mode == GUI_MODE:
+ if ui_toolkit == 'qt3':
+ if not utils.canEnterGUIMode():
+ log.error("%s requires GUI support (try running with --qt4). Try using interactive (-i) mode." % __mod__)
+ clean_exit(1)
+ else:
+ if not utils.canEnterGUIMode4():
+ log.error("%s requires GUI support (try running with --qt3). Try using interactive (-i) mode." % __mod__)
+ clean_exit(1)
+
+
+PKIT = utils.to_bool(sys_conf.get('configure', 'policy-kit'))
+if PKIT:
+ try:
+ from base.pkit import *
+ try:
+ pkit = PolicyKit()
+ pkit_installed = True
+ except dbus.DBusException, ex:
+ log.error("PolicyKit support requires DBUS or PolicyKit support files missing")
+ pkit_installed = False
+ except:
+ log.error("Unable to load pkit...is HPLIP installed?")
+ pkit_installed = False
+else:
+ pkit_installed = False
+
+
+if mode == GUI_MODE:
+ if ui_toolkit == 'qt3':
+ try:
+ from qt import *
+ from ui import pluginform2
+ except ImportError:
+ log.error("Unable to load Qt3 support. Is it installed?")
+ clean_exit(1)
+
+ app = QApplication(sys.argv)
+ QObject.connect(app, SIGNAL("lastWindowClosed()"), app, SLOT("quit()"))
+
+ if loc is None:
+ loc = user_conf.get('ui', 'loc', 'system')
+ if loc.lower() == 'system':
+ loc = str(QTextCodec.locale())
+ log.debug("Using system locale: %s" % loc)
+
+ if loc.lower() != 'c':
+ e = 'utf8'
+ try:
+ l, x = loc.split('.')
+ loc = '.'.join([l, e])
+ except ValueError:
+ l = loc
+ loc = '.'.join([loc, e])
+
+ log.debug("Trying to load .qm file for %s locale." % loc)
+ trans = QTranslator(None)
+
+ qm_file = 'hplip_%s.qm' % l
+ log.debug("Name of .qm file: %s" % qm_file)
+ loaded = trans.load(qm_file, prop.localization_dir)
+
+ if loaded:
+ app.installTranslator(trans)
+ else:
+ loc = 'c'
+
+ if loc == 'c':
+ log.debug("Using default 'C' locale")
+ else:
+ log.debug("Using locale: %s" % loc)
+ QLocale.setDefault(QLocale(loc))
+ prop.locale = loc
+ try:
+ locale.setlocale(locale.LC_ALL, locale.normalize(loc))
+ except locale.Error:
+ pass
+
+ if not pkit_installed and not os.geteuid() == 0:
+ log.error("You must be root to run this utility.")
+
+ QMessageBox.critical(None,
+ "HP Device Manager - Plug-in Installer",
+ "You must be root to run hp-plugin.",
+ QMessageBox.Ok,
+ QMessageBox.NoButton,
+ QMessageBox.NoButton)
+
+ clean_exit(1)
+
+ w = pluginform2.PluginForm2()
+ app.setMainWidget(w)
+ w.show()
+
+ app.exec_loop()
+
+ else: # qt4
+ try:
+ from PyQt4.QtGui import QApplication, QMessageBox
+ from ui4.plugindialog import PluginDialog
+ except ImportError:
+ log.error("Unable to load Qt4 support. Is it installed?")
+ clean_exit(1)
+
+ app = QApplication(sys.argv)
+
+ if not pkit_installed and not os.geteuid() == 0:
+ log.error("You must be root to run this utility.")
+
+ QMessageBox.critical(None,
+ "HP Device Manager - Plug-in Installer",
+ "You must be root to run hp-plugin.",
+ QMessageBox.Ok,
+ QMessageBox.NoButton,
+ QMessageBox.NoButton)
+
+ clean_exit(1)
+
+
+ dialog = PluginDialog(None, install_mode, plugin_reason)
+ dialog.show()
+ try:
+ log.debug("Starting GUI loop...")
+ app.exec_()
+ except KeyboardInterrupt:
+ log.error("User exit")
+ clean_exit(0)
+
+
+else: # INTERACTIVE_MODE
+ try:
+ if not os.geteuid() == 0:
+ log.error("You must be root to run this utility.")
+ clean_exit(1)
+
+ log.info("(Note: Defaults for each question are maked with a '*'. Press <enter> to accept the default.)")
+ log.info("")
+
+ from installer import core_install
+ core = core_install.CoreInstall()
+
+ core.set_plugin_version()
+
+ tui.header("PLUG-IN INSTALLATION FOR HPLIP %s" % version)
+
+ if core.check_for_plugin() == PLUGIN_INSTALLED and plugin_path is None:
+ log.info("The driver plugin for HPLIP %s appears to already be installed." % version)
+
+ cont, ans = tui.enter_yes_no("Do you wish to download and re-install the plug-in?")
+
+ if not cont or not ans:
+ clean_exit(0)
+
+
+ if plugin_path is None:
+ table = tui.Formatter(header=('Option', 'Description'), min_widths=(10, 50))
+ table.add(('d', 'Download plug-in from HP (recomended)'))
+ table.add(('p', 'Specify a path to the plug-in (advanced)'))
+ table.add(('q', 'Quit hp-plugin (skip installation)'))
+
+ table.output()
+
+ cont, ans = tui.enter_choice("\nEnter option (d=download*, p=specify path, q=quit) ? ",
+ ['d', 'p'], 'd')
+
+ if not cont: # q
+ clean_exit(0)
+
+
+ if ans == 'd': # d - download
+ # read plugin.conf (local or on sf.net) to get plugin_path (http://)
+ plugin_conf_url = core.get_plugin_conf_url()
+
+ if plugin_conf_url.startswith('file://'):
+ tui.header("COPY CONFIGURATION")
+ else:
+ tui.header("DOWNLOAD CONFIGURATION")
+
+ log.info("Checking for network connection...")
+ ok = core.check_network_connection()
+
+ if not ok:
+ log.error("Network connection not detected.")
+ clean_exit(1)
+
+
+ log.info("Downloading configuration file from: %s" % plugin_conf_url)
+ pm = tui.ProgressMeter("Downloading configuration:")
+
+ plugin_path, size, checksum, timestamp, ok = core.get_plugin_info(plugin_conf_url,
+ plugin_download_callback)
+
+ print
+
+ if not plugin_path.startswith('http://') and not plugin_path.startswith('file://'):
+ plugin_path = 'file://' + plugin_path
+
+ else: # p - specify plugin path
+
+ while True:
+ plugin_path = raw_input(log.bold("Enter the path to the 'hplip-%s-plugin.run' file (q=quit) : " %
+ version)).strip()
+
+ if plugin_path.strip().lower() == 'q':
+ clean_exit(1)
+
+ if not plugin_path.startswith('http://'):
+ plugin_path = os.path.normpath(os.path.abspath(os.path.expanduser(plugin_path)))
+
+ if not os.path.exists(plugin_path):
+ log.error("Plug-in path '%s' not found." % plugin_path)
+ continue
+
+ if os.path.isdir(plugin_path):
+ plugin_path = os.path.join(plugin_path, plugin_filename)
+
+ if not os.path.exists(plugin_path):
+ log.error("Plug-in path '%s' not found." % plugin_path)
+ continue
+
+ if os.path.basename(plugin_path) != plugin_filename:
+ log.error("Plug-in filename must be '%s'." % plugin_filename)
+ continue
+
+ size, checksum, timestamp = os.stat(plugin_path)[6], '', 0.0
+ plugin_path = 'file://' + plugin_path
+
+ break
+
+
+ if plugin_path.startswith('file://'):
+ tui.header("COPY PLUGIN")
+ else:
+ tui.header("DOWNLOAD PLUGIN")
+
+ log.info("Checking for network connection...")
+ ok = core.check_network_connection()
+
+ if not ok:
+ log.error("Network connection not detected.")
+ clean_exit(1)
+
+ log.info("Downloading plug-in from: %s" % plugin_path)
+ pm = tui.ProgressMeter("Downloading plug-in:")
+
+ status, ret = core.download_plugin(plugin_path, size, checksum, timestamp, plugin_download_callback)
+ print
+
+ if status in (core_install.PLUGIN_INSTALL_ERROR_UNABLE_TO_RECV_KEYS, core_install.PLUGIN_INSTALL_ERROR_DIGITAL_SIG_NOT_FOUND):
+ log.error("Digital signature file download failed. Without this file, it is not possible to authenticate and validate the plug-in prior to installation.")
+ cont, ans = tui.enter_yes_no("Do you still want to install the plug-in?", 'n')
+
+ if not cont or not ans:
+ clean_exit(0)
+
+ elif status != core_install.PLUGIN_INSTALL_ERROR_NONE:
+
+ if status == core_install.PLUGIN_INSTALL_ERROR_PLUGIN_FILE_NOT_FOUND:
+ desc = "Plug-in file not found (server returned 404 or similar error). Error code: %s" % str(ret)
+
+ elif status == core_install.PLUGIN_INSTALL_ERROR_DIGITAL_SIG_BAD:
+ desc = "Plug-in file does not match its digital signature. File may have been corrupted or altered. Error code: %s" % str(ret)
+
+ elif status == core_install.PLUGIN_INSTALL_ERROR_PLUGIN_FILE_CHECKSUM_ERROR:
+ desc = "Plug-in file does not match its checksum. File may have been corrupted or altered."
+
+ elif status == core_install.PLUGIN_INSTALL_ERROR_NO_NETWORK:
+ desc = "Unable to connect to network to download the plug-in. Please check your network connection and try again."
+
+ elif status == core_install.PLUGIN_INSTALL_ERROR_DIRECTORY_ERROR:
+ desc = "Unable to create the plug-in directory. Please check your permissions and try again."
+
+ core.delete_plugin()
+ log.error(desc)
+ clean_exit(1)
+
+
+ tui.header("INSTALLING PLUG-IN")
+
+ core.run_plugin(mode, plugin_install_callback)
+
+ cups_devices = device.getSupportedCUPSDevices(['hp']) #, 'hpfax'])
+ #print cups_devices
+
+ title = False
+
+ for dev in cups_devices:
+ mq = device.queryModelByURI(dev)
+
+ if mq.get('fw-download', 0):
+
+ if not title:
+ tui.header("DOWNLOADING FIRMWARE")
+ title = True
+
+ # Download firmware if needed
+ log.info(log.bold("\nDownloading firmware to device %s..." % dev))
+ try:
+ d = device.Device(dev)
+ except Error:
+ log.error("Error opening device. Exiting.")
+ clean_exit(1)
+
+ if d.downloadFirmware():
+ log.info("Firmware download successful.\n")
+
+ d.close()
+
+
+ except KeyboardInterrupt:
+ log.error("User exit")
+
+log.info("")
+log.info("Done.")
+clean_exit(0)
+
diff --git a/plugins/Deskjet_460.py b/plugins/Deskjet_460.py
new file mode 100644
index 0000000..a5e481e
--- /dev/null
+++ b/plugins/Deskjet_460.py
@@ -0,0 +1,25 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2001-2007 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+import powersettingsdialog
+
+def settingsUI(d, parent):
+ return powersettingsdialog.settingsUI(d, parent)
diff --git a/plugins/Officejet_H470.py b/plugins/Officejet_H470.py
new file mode 100644
index 0000000..a5e481e
--- /dev/null
+++ b/plugins/Officejet_H470.py
@@ -0,0 +1,25 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2001-2007 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+import powersettingsdialog
+
+def settingsUI(d, parent):
+ return powersettingsdialog.settingsUI(d, parent)
diff --git a/plugins/__init__.py b/plugins/__init__.py
new file mode 100644
index 0000000..97d3c89
--- /dev/null
+++ b/plugins/__init__.py
@@ -0,0 +1,20 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2007 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
diff --git a/plugins/dj450.py b/plugins/dj450.py
new file mode 100644
index 0000000..a5e481e
--- /dev/null
+++ b/plugins/dj450.py
@@ -0,0 +1,25 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2001-2007 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+import powersettingsdialog
+
+def settingsUI(d, parent):
+ return powersettingsdialog.settingsUI(d, parent)
diff --git a/plugins/powersettings.py b/plugins/powersettings.py
new file mode 100644
index 0000000..0981a73
--- /dev/null
+++ b/plugins/powersettings.py
@@ -0,0 +1,46 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2001-2007 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+# DJ 4x0 battery power settings
+
+# 15min = 015
+# 30min = 030
+# 45min = 045
+# 1hr = 060
+# 2hr = 120
+# 3hr = 180
+# never = 999
+
+from base.g import *
+from base import device
+
+def getPowerSettings(d):
+ value = d.getDynamicCounter(256, False)
+ log.debug("Current power settings: %s" % value)
+ d.closePrint()
+ return value[6:9]
+
+def setPowerSettings(d, value):
+ log.debug("Setting power setting to %s" % value)
+ pcl= \
+"""\x1b%%-12345X@PJL ENTER LANGUAGE=PCL3GUI\n\x1bE\x1b%%Pmech.set_battery_autooff %s;\nudw.quit;\x1b*rC\x1bE\x1b%%-12345X""" % value
+ d.printData(pcl, direct=True)
+ d.closePrint()
diff --git a/plugins/powersettings2.py b/plugins/powersettings2.py
new file mode 100644
index 0000000..2721f53
--- /dev/null
+++ b/plugins/powersettings2.py
@@ -0,0 +1,38 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2001-2007 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+# OJ H4xx battery power settings
+
+
+from base.g import *
+from base import device, pml
+
+def getPowerSettings(d):
+ pml_result_code, value = d.getPML(pml.OID_POWER_SETTINGS)
+ d.closePML()
+ log.debug("Current power settings: %s" % value)
+ return value
+
+def setPowerSettings(d, value):
+ log.debug("Setting power setting to %s" % value)
+ pml_result_code = d.setPML(pml.OID_POWER_SETTINGS, value)
+ d.closePML()
+
diff --git a/plugins/powersettingsdialog.py b/plugins/powersettingsdialog.py
new file mode 100644
index 0000000..b0522b3
--- /dev/null
+++ b/plugins/powersettingsdialog.py
@@ -0,0 +1,156 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2001-2007 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+from base.g import *
+import powersettings
+import powersettings2
+from base import pml
+
+from qt import *
+from powersettingsdialog_base import PowerSettingsDialog_base
+
+
+class PowerSettingsDialog(PowerSettingsDialog_base): # Dyn Ctr (DJ4xx)
+
+ def __init__(self,value,parent = None,name = None,modal = 0,fl = 0):
+ PowerSettingsDialog_base.__init__(self,parent,name,modal,fl)
+ self.setting = 0 # 0=never off, 1=timed off
+
+ log.debug("Initializing plugin dialog with power setting: %s" % value)
+
+ self.power_setting_table = {0 : (self.__tr("15 minutes"), '015'),
+ 1 : (self.__tr("30 minutes"), '030'),
+ 2 : (self.__tr("45 minutes"), '045'),
+ 3 : (self.__tr("1 hour"), '060'),
+ 4 : (self.__tr("2 hours"), '120'),
+ 5 : (self.__tr("3 hours"), '180'),
+ }
+
+ for x in self.power_setting_table:
+ self.power_setting_combo.insertItem(self.power_setting_table[x][0], x)
+
+ if value == '999':
+ self.power_setting.setButton(0)
+ #self.setting = 0
+ else:
+ self.power_setting.setButton(1)
+ self.setting = 1
+
+ for x in self.power_setting_table:
+ if self.power_setting_table[x][1] == value:
+ self.power_setting_combo.setCurrentItem(x)
+
+
+ def power_setting_clicked(self,a0):
+ self.setting = a0
+ log.debug("Setting (0=Always on/1=Timed off): %s" % a0)
+
+ def getValue(self):
+ return self.power_setting_table[self.power_setting_combo.currentItem()][1]
+
+ def __tr(self,s,c = None):
+ return qApp.translate("PowerSettingsDialog",s,c)
+
+
+class PowerSettingsDialog2(PowerSettingsDialog_base): # PML (OJ H4xx)
+
+ def __init__(self,value,parent = None,name = None,modal = 0,fl = 0):
+ PowerSettingsDialog_base.__init__(self,parent,name,modal,fl)
+ self.setting = 0 # 0=never off, 1=timed off
+
+ log.debug("Initializing plugin dialog with power setting: %s" % value)
+
+ self.power_setting_table = {0 : (self.__tr("15 minutes"), pml.OID_POWER_SETTINGS_15MIN),
+ 1 : (self.__tr("30 minutes"), pml.OID_POWER_SETTINGS_30MIN),
+ 2 : (self.__tr("45 minutes"), pml.OID_POWER_SETTINGS_45MIN),
+ 3 : (self.__tr("1 hour"), pml.OID_POWER_SETTINGS_1HR),
+ 4 : (self.__tr("2 hours"), pml.OID_POWER_SETTINGS_2HR),
+ 5 : (self.__tr("3 hours"), pml.OID_POWER_SETTINGS_3HR),
+ }
+
+ for x in self.power_setting_table:
+ self.power_setting_combo.insertItem(self.power_setting_table[x][0], x)
+
+ if value == pml.OID_POWER_SETTINGS_NEVER:
+ self.power_setting.setButton(0)
+ else:
+ self.power_setting.setButton(1)
+ self.setting = 1
+
+ for x in self.power_setting_table:
+ if self.power_setting_table[x][1] == value:
+ self.power_setting_combo.setCurrentItem(x)
+
+
+ def power_setting_clicked(self,a0):
+ self.setting = a0
+ log.debug("Setting (0=Always on/1=Timed off): %s" % a0)
+
+ def getValue(self):
+ return self.power_setting_table[self.power_setting_combo.currentItem()][1]
+
+ def __tr(self,s,c = None):
+ return qApp.translate("PowerSettingsDialog2",s,c)
+
+
+def settingsUIDynCtr(d, parent):
+ value = powersettings.getPowerSettings(d)
+ log.debug("Battery power settings: %s" % value)
+
+ dlg = PowerSettingsDialog(value, parent)
+
+ if dlg.exec_loop() == QDialog.Accepted:
+ value = dlg.getValue()
+ log.debug("Power setting set to %s in dialog" % value)
+
+ if dlg.setting == 0:
+ powersettings.setPowerSettings(d, '999')
+ else:
+ powersettings.setPowerSettings(d, value)
+
+
+def settingsUIPML(d, parent):
+ value = powersettings2.getPowerSettings(d)
+ log.debug("Battery power settings: %s" % value)
+
+ dlg = PowerSettingsDialog2(value, parent)
+
+ if dlg.exec_loop() == QDialog.Accepted:
+ value = dlg.getValue()
+ log.debug("Power setting set to %s in dialog" % value)
+
+ if dlg.setting == 0:
+ powersettings2.setPowerSettings(d, pml.OID_POWER_SETTINGS_NEVER)
+ else:
+ powersettings2.setPowerSettings(d, value)
+
+
+def settingsUI(d, parent=None):
+ log.debug("settingsUI(%s)" % __file__)
+
+ battery_check = d.mq['power-settings']
+
+ if battery_check == POWER_SETTINGS_EPML:
+ return settingsUIDynCtr(d, parent)
+
+ elif battery_check == POWER_SETTINGS_PML:
+ return settingsUIPML(d, parent)
+
diff --git a/plugins/powersettingsdialog_base.py b/plugins/powersettingsdialog_base.py
new file mode 100644
index 0000000..971721a
--- /dev/null
+++ b/plugins/powersettingsdialog_base.py
@@ -0,0 +1,108 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file '/home/dwelch/linux-imaging-and-printing/src/plugins/powersettingsdialog_base.ui'
+#
+# Created: Wed May 11 12:45:25 2005
+# by: The PyQt User Interface Compiler (pyuic) 3.14.1
+#
+# WARNING! All changes made in this file will be lost!
+
+
+import sys
+from qt import *
+
+
+class PowerSettingsDialog_base(QDialog):
+ def __init__(self,parent = None,name = None,modal = 0,fl = 0):
+ QDialog.__init__(self,parent,name,modal,fl)
+
+ if not name:
+ self.setName("PowerSettingsDialog_base")
+
+
+ PowerSettingsDialog_baseLayout = QGridLayout(self,1,1,11,6,"PowerSettingsDialog_baseLayout")
+
+ self.line1 = QFrame(self,"line1")
+ self.line1.setFrameShape(QFrame.HLine)
+ self.line1.setFrameShadow(QFrame.Sunken)
+ self.line1.setFrameShape(QFrame.HLine)
+
+ PowerSettingsDialog_baseLayout.addMultiCellWidget(self.line1,1,1,0,2)
+
+ self.textLabel1 = QLabel(self,"textLabel1")
+
+ PowerSettingsDialog_baseLayout.addMultiCellWidget(self.textLabel1,0,0,0,2)
+
+ self.pushButton1 = QPushButton(self,"pushButton1")
+
+ PowerSettingsDialog_baseLayout.addWidget(self.pushButton1,4,2)
+ spacer1 = QSpacerItem(361,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ PowerSettingsDialog_baseLayout.addItem(spacer1,4,0)
+
+ self.pushButton2 = QPushButton(self,"pushButton2")
+
+ PowerSettingsDialog_baseLayout.addWidget(self.pushButton2,4,1)
+ spacer2 = QSpacerItem(20,171,QSizePolicy.Minimum,QSizePolicy.Expanding)
+ PowerSettingsDialog_baseLayout.addItem(spacer2,3,0)
+
+ self.power_setting = QButtonGroup(self,"power_setting")
+ self.power_setting.setColumnLayout(0,Qt.Vertical)
+ self.power_setting.layout().setSpacing(6)
+ self.power_setting.layout().setMargin(11)
+ power_settingLayout = QGridLayout(self.power_setting.layout())
+ power_settingLayout.setAlignment(Qt.AlignTop)
+ spacer4 = QSpacerItem(121,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ power_settingLayout.addItem(spacer4,1,2)
+
+ self.power_setting_combo = QComboBox(0,self.power_setting,"power_setting_combo")
+ self.power_setting_combo.setEnabled(0)
+
+ power_settingLayout.addWidget(self.power_setting_combo,1,1)
+
+ self.radioButton2 = QRadioButton(self.power_setting,"radioButton2")
+ self.power_setting.insert( self.radioButton2,1)
+
+ power_settingLayout.addWidget(self.radioButton2,1,0)
+
+ self.radioButton1 = QRadioButton(self.power_setting,"radioButton1")
+ self.radioButton1.setChecked(1)
+ self.power_setting.insert( self.radioButton1,0)
+
+ power_settingLayout.addMultiCellWidget(self.radioButton1,0,0,0,2)
+
+ PowerSettingsDialog_baseLayout.addMultiCellWidget(self.power_setting,2,2,0,2)
+
+ self.languageChange()
+
+ self.resize(QSize(636,463).expandedTo(self.minimumSizeHint()))
+ self.clearWState(Qt.WState_Polished)
+
+ self.connect(self.pushButton2,SIGNAL("clicked()"),self.reject)
+ self.connect(self.pushButton1,SIGNAL("clicked()"),self.accept)
+ self.connect(self.radioButton1,SIGNAL("toggled(bool)"),self.power_setting_combo.setDisabled)
+ self.connect(self.power_setting,SIGNAL("clicked(int)"),self.power_setting_clicked)
+
+
+ def languageChange(self):
+ self.setCaption(self.__tr("HP Device Manager - Battery Mode Power Settings"))
+ self.textLabel1.setText(self.__tr("<b>Configure the power off settings when operating on battery power</b>"))
+ self.pushButton1.setText(self.__tr("OK"))
+ self.pushButton2.setText(self.__tr("Cancel"))
+ self.power_setting.setTitle(self.__tr("Power Settings"))
+ self.radioButton2.setText(self.__tr("Automatically turn off printer after:"))
+ self.radioButton1.setText(self.__tr("Always leave printer on"))
+
+
+ def power_setting_clicked(self,a0):
+ print "PowerSettingsDialog_base.power_setting_clicked(int): Not implemented yet"
+
+ def __tr(self,s,c = None):
+ return qApp.translate("PowerSettingsDialog_base",s,c)
+
+if __name__ == "__main__":
+ a = QApplication(sys.argv)
+ QObject.connect(a,SIGNAL("lastWindowClosed()"),a,SLOT("quit()"))
+ w = PowerSettingsDialog_base()
+ a.setMainWidget(w)
+ w.show()
+ a.exec_loop()
diff --git a/plugins/powersettingsdialog_base.ui b/plugins/powersettingsdialog_base.ui
new file mode 100644
index 0000000..b9d09d9
--- /dev/null
+++ b/plugins/powersettingsdialog_base.ui
@@ -0,0 +1,192 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>PowerSettingsDialog_base</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>PowerSettingsDialog_base</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>636</width>
+ <height>463</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>HP Device Manager - Battery Mode Power Settings</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="Line" row="1" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>line1</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>HLine</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Sunken</enum>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>&lt;b&gt;Configure the power off settings when operating on battery power&lt;/b&gt;</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="4" column="2">
+ <property name="name">
+ <cstring>pushButton1</cstring>
+ </property>
+ <property name="text">
+ <string>OK</string>
+ </property>
+ </widget>
+ <spacer row="4" column="0">
+ <property name="name">
+ <cstring>spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>361</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton" row="4" column="1">
+ <property name="name">
+ <cstring>pushButton2</cstring>
+ </property>
+ <property name="text">
+ <string>Cancel</string>
+ </property>
+ </widget>
+ <spacer row="3" column="0">
+ <property name="name">
+ <cstring>spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>171</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QButtonGroup" row="2" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>power_setting</cstring>
+ </property>
+ <property name="title">
+ <string>Power Settings</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer row="1" column="2">
+ <property name="name">
+ <cstring>spacer4</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>121</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QComboBox" row="1" column="1">
+ <property name="name">
+ <cstring>power_setting_combo</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ </widget>
+ <widget class="QRadioButton" row="1" column="0">
+ <property name="name">
+ <cstring>radioButton2</cstring>
+ </property>
+ <property name="text">
+ <string>Automatically turn off printer after:</string>
+ </property>
+ <property name="buttonGroupId">
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QRadioButton" row="0" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>radioButton1</cstring>
+ </property>
+ <property name="text">
+ <string>Always leave printer on</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ <property name="buttonGroupId">
+ <number>0</number>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>pushButton2</sender>
+ <signal>clicked()</signal>
+ <receiver>PowerSettingsDialog_base</receiver>
+ <slot>reject()</slot>
+ </connection>
+ <connection>
+ <sender>pushButton1</sender>
+ <signal>clicked()</signal>
+ <receiver>PowerSettingsDialog_base</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection>
+ <sender>radioButton1</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>power_setting_combo</receiver>
+ <slot>setDisabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>power_setting</sender>
+ <signal>clicked(int)</signal>
+ <receiver>PowerSettingsDialog_base</receiver>
+ <slot>power_setting_clicked(int)</slot>
+ </connection>
+</connections>
+<includes>
+ <include location="local" impldecl="in implementation">powersettingsdialog_base.ui.h</include>
+</includes>
+<slots>
+ <slot>power_setting_clicked( int )</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/ppd/hpcups/apollo-2100.ppd.gz b/ppd/hpcups/apollo-2100.ppd.gz
new file mode 100644
index 0000000..4048784
--- /dev/null
+++ b/ppd/hpcups/apollo-2100.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/apollo-2150.ppd.gz b/ppd/hpcups/apollo-2150.ppd.gz
new file mode 100644
index 0000000..95ca3ca
--- /dev/null
+++ b/ppd/hpcups/apollo-2150.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/apollo-2200.ppd.gz b/ppd/hpcups/apollo-2200.ppd.gz
new file mode 100644
index 0000000..d59cad0
--- /dev/null
+++ b/ppd/hpcups/apollo-2200.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/apollo-2500.ppd.gz b/ppd/hpcups/apollo-2500.ppd.gz
new file mode 100644
index 0000000..f9de790
--- /dev/null
+++ b/ppd/hpcups/apollo-2500.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/apollo-2600.ppd.gz b/ppd/hpcups/apollo-2600.ppd.gz
new file mode 100644
index 0000000..8c32d21
--- /dev/null
+++ b/ppd/hpcups/apollo-2600.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/apollo-2650.ppd.gz b/ppd/hpcups/apollo-2650.ppd.gz
new file mode 100644
index 0000000..13133f9
--- /dev/null
+++ b/ppd/hpcups/apollo-2650.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/apollo-p2000-u.ppd.gz b/ppd/hpcups/apollo-p2000-u.ppd.gz
new file mode 100644
index 0000000..58f234a
--- /dev/null
+++ b/ppd/hpcups/apollo-p2000-u.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/apollo-p2250.ppd.gz b/ppd/hpcups/apollo-p2250.ppd.gz
new file mode 100644
index 0000000..7f41933
--- /dev/null
+++ b/ppd/hpcups/apollo-p2250.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-2000c.ppd.gz b/ppd/hpcups/hp-2000c.ppd.gz
new file mode 100644
index 0000000..7eb973d
--- /dev/null
+++ b/ppd/hpcups/hp-2000c.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-2500c.ppd.gz b/ppd/hpcups/hp-2500c.ppd.gz
new file mode 100644
index 0000000..a392d20
--- /dev/null
+++ b/ppd/hpcups/hp-2500c.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-910.ppd.gz b/ppd/hpcups/hp-910.ppd.gz
new file mode 100644
index 0000000..7e9e317
--- /dev/null
+++ b/ppd/hpcups/hp-910.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-915.ppd.gz b/ppd/hpcups/hp-915.ppd.gz
new file mode 100644
index 0000000..77ca41f
--- /dev/null
+++ b/ppd/hpcups/hp-915.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-business_inkjet_1000.ppd.gz b/ppd/hpcups/hp-business_inkjet_1000.ppd.gz
new file mode 100644
index 0000000..4a29e0f
--- /dev/null
+++ b/ppd/hpcups/hp-business_inkjet_1000.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-business_inkjet_1100.ppd.gz b/ppd/hpcups/hp-business_inkjet_1100.ppd.gz
new file mode 100644
index 0000000..e19beb5
--- /dev/null
+++ b/ppd/hpcups/hp-business_inkjet_1100.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-business_inkjet_1200.ppd.gz b/ppd/hpcups/hp-business_inkjet_1200.ppd.gz
new file mode 100644
index 0000000..68df4d0
--- /dev/null
+++ b/ppd/hpcups/hp-business_inkjet_1200.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-business_inkjet_2200.ppd.gz b/ppd/hpcups/hp-business_inkjet_2200.ppd.gz
new file mode 100644
index 0000000..4fb2eb8
--- /dev/null
+++ b/ppd/hpcups/hp-business_inkjet_2200.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-business_inkjet_2230.ppd.gz b/ppd/hpcups/hp-business_inkjet_2230.ppd.gz
new file mode 100644
index 0000000..e17ecff
--- /dev/null
+++ b/ppd/hpcups/hp-business_inkjet_2230.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-business_inkjet_2250-pcl3.ppd.gz b/ppd/hpcups/hp-business_inkjet_2250-pcl3.ppd.gz
new file mode 100644
index 0000000..41e7ced
--- /dev/null
+++ b/ppd/hpcups/hp-business_inkjet_2250-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-business_inkjet_2280-pcl3.ppd.gz b/ppd/hpcups/hp-business_inkjet_2280-pcl3.ppd.gz
new file mode 100644
index 0000000..3d3c02a
--- /dev/null
+++ b/ppd/hpcups/hp-business_inkjet_2280-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-business_inkjet_2300-pcl3.ppd.gz b/ppd/hpcups/hp-business_inkjet_2300-pcl3.ppd.gz
new file mode 100644
index 0000000..b2e55e8
--- /dev/null
+++ b/ppd/hpcups/hp-business_inkjet_2300-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-business_inkjet_2600-pcl3.ppd.gz b/ppd/hpcups/hp-business_inkjet_2600-pcl3.ppd.gz
new file mode 100644
index 0000000..3328637
--- /dev/null
+++ b/ppd/hpcups/hp-business_inkjet_2600-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-business_inkjet_2800-pcl3.ppd.gz b/ppd/hpcups/hp-business_inkjet_2800-pcl3.ppd.gz
new file mode 100644
index 0000000..fb2c303
--- /dev/null
+++ b/ppd/hpcups/hp-business_inkjet_2800-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-business_inkjet_3000-pcl3.ppd.gz b/ppd/hpcups/hp-business_inkjet_3000-pcl3.ppd.gz
new file mode 100644
index 0000000..eb6025c
--- /dev/null
+++ b/ppd/hpcups/hp-business_inkjet_3000-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-color_inkjet_cp1700.ppd.gz b/ppd/hpcups/hp-color_inkjet_cp1700.ppd.gz
new file mode 100644
index 0000000..a69a2f3
--- /dev/null
+++ b/ppd/hpcups/hp-color_inkjet_cp1700.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-color_inkjet_printer_cp1700.ppd.gz b/ppd/hpcups/hp-color_inkjet_printer_cp1700.ppd.gz
new file mode 100644
index 0000000..8ad219f
--- /dev/null
+++ b/ppd/hpcups/hp-color_inkjet_printer_cp1700.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-color_laserjet_1600.ppd.gz b/ppd/hpcups/hp-color_laserjet_1600.ppd.gz
new file mode 100644
index 0000000..6316c59
--- /dev/null
+++ b/ppd/hpcups/hp-color_laserjet_1600.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-color_laserjet_2500-pcl3.ppd.gz b/ppd/hpcups/hp-color_laserjet_2500-pcl3.ppd.gz
new file mode 100644
index 0000000..4f4a9d0
--- /dev/null
+++ b/ppd/hpcups/hp-color_laserjet_2500-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-color_laserjet_2500_series.ppd.gz b/ppd/hpcups/hp-color_laserjet_2500_series.ppd.gz
new file mode 100644
index 0000000..feca08d
--- /dev/null
+++ b/ppd/hpcups/hp-color_laserjet_2500_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-color_laserjet_2600n.ppd.gz b/ppd/hpcups/hp-color_laserjet_2600n.ppd.gz
new file mode 100644
index 0000000..5a30471
--- /dev/null
+++ b/ppd/hpcups/hp-color_laserjet_2600n.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-color_laserjet_3000-pcl3.ppd.gz b/ppd/hpcups/hp-color_laserjet_3000-pcl3.ppd.gz
new file mode 100644
index 0000000..db9c8a4
--- /dev/null
+++ b/ppd/hpcups/hp-color_laserjet_3000-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-color_laserjet_3500.ppd.gz b/ppd/hpcups/hp-color_laserjet_3500.ppd.gz
new file mode 100644
index 0000000..1a0ea65
--- /dev/null
+++ b/ppd/hpcups/hp-color_laserjet_3500.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-color_laserjet_3500n.ppd.gz b/ppd/hpcups/hp-color_laserjet_3500n.ppd.gz
new file mode 100644
index 0000000..1e83cef
--- /dev/null
+++ b/ppd/hpcups/hp-color_laserjet_3500n.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-color_laserjet_3550.ppd.gz b/ppd/hpcups/hp-color_laserjet_3550.ppd.gz
new file mode 100644
index 0000000..cc86f53
--- /dev/null
+++ b/ppd/hpcups/hp-color_laserjet_3550.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-color_laserjet_3550n.ppd.gz b/ppd/hpcups/hp-color_laserjet_3550n.ppd.gz
new file mode 100644
index 0000000..6db4507
--- /dev/null
+++ b/ppd/hpcups/hp-color_laserjet_3550n.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-color_laserjet_3600.ppd.gz b/ppd/hpcups/hp-color_laserjet_3600.ppd.gz
new file mode 100644
index 0000000..1d2c9bf
--- /dev/null
+++ b/ppd/hpcups/hp-color_laserjet_3600.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-color_laserjet_3700-pcl3.ppd.gz b/ppd/hpcups/hp-color_laserjet_3700-pcl3.ppd.gz
new file mode 100644
index 0000000..8570e46
--- /dev/null
+++ b/ppd/hpcups/hp-color_laserjet_3700-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-color_laserjet_3700n.ppd.gz b/ppd/hpcups/hp-color_laserjet_3700n.ppd.gz
new file mode 100644
index 0000000..a5ab723
--- /dev/null
+++ b/ppd/hpcups/hp-color_laserjet_3700n.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-color_laserjet_3800-pcl3.ppd.gz b/ppd/hpcups/hp-color_laserjet_3800-pcl3.ppd.gz
new file mode 100644
index 0000000..74178b0
--- /dev/null
+++ b/ppd/hpcups/hp-color_laserjet_3800-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-color_laserjet_4500-pcl3.ppd.gz b/ppd/hpcups/hp-color_laserjet_4500-pcl3.ppd.gz
new file mode 100644
index 0000000..3f2e9ad
--- /dev/null
+++ b/ppd/hpcups/hp-color_laserjet_4500-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-color_laserjet_4550-pcl3.ppd.gz b/ppd/hpcups/hp-color_laserjet_4550-pcl3.ppd.gz
new file mode 100644
index 0000000..e99e9a7
--- /dev/null
+++ b/ppd/hpcups/hp-color_laserjet_4550-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-color_laserjet_4600-pcl3.ppd.gz b/ppd/hpcups/hp-color_laserjet_4600-pcl3.ppd.gz
new file mode 100644
index 0000000..f1ee56c
--- /dev/null
+++ b/ppd/hpcups/hp-color_laserjet_4600-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-color_laserjet_4600_series.ppd.gz b/ppd/hpcups/hp-color_laserjet_4600_series.ppd.gz
new file mode 100644
index 0000000..0723cc0
--- /dev/null
+++ b/ppd/hpcups/hp-color_laserjet_4600_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-color_laserjet_4610-pcl3.ppd.gz b/ppd/hpcups/hp-color_laserjet_4610-pcl3.ppd.gz
new file mode 100644
index 0000000..8a86449
--- /dev/null
+++ b/ppd/hpcups/hp-color_laserjet_4610-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-color_laserjet_4650-pcl3.ppd.gz b/ppd/hpcups/hp-color_laserjet_4650-pcl3.ppd.gz
new file mode 100644
index 0000000..5d67019
--- /dev/null
+++ b/ppd/hpcups/hp-color_laserjet_4650-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-color_laserjet_4700-pcl3.ppd.gz b/ppd/hpcups/hp-color_laserjet_4700-pcl3.ppd.gz
new file mode 100644
index 0000000..9b1d6f6
--- /dev/null
+++ b/ppd/hpcups/hp-color_laserjet_4700-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-color_laserjet_4730mfp-pcl3.ppd.gz b/ppd/hpcups/hp-color_laserjet_4730mfp-pcl3.ppd.gz
new file mode 100644
index 0000000..d5f3426
--- /dev/null
+++ b/ppd/hpcups/hp-color_laserjet_4730mfp-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-color_laserjet_5.ppd.gz b/ppd/hpcups/hp-color_laserjet_5.ppd.gz
new file mode 100644
index 0000000..567b70e
--- /dev/null
+++ b/ppd/hpcups/hp-color_laserjet_5.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-color_laserjet_5500-pcl3.ppd.gz b/ppd/hpcups/hp-color_laserjet_5500-pcl3.ppd.gz
new file mode 100644
index 0000000..c039d46
--- /dev/null
+++ b/ppd/hpcups/hp-color_laserjet_5500-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-color_laserjet_5550-pcl3.ppd.gz b/ppd/hpcups/hp-color_laserjet_5550-pcl3.ppd.gz
new file mode 100644
index 0000000..9f12d3f
--- /dev/null
+++ b/ppd/hpcups/hp-color_laserjet_5550-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-color_laserjet_5m-pcl3.ppd.gz b/ppd/hpcups/hp-color_laserjet_5m-pcl3.ppd.gz
new file mode 100644
index 0000000..97ada4a
--- /dev/null
+++ b/ppd/hpcups/hp-color_laserjet_5m-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-color_laserjet_8500-pcl3.ppd.gz b/ppd/hpcups/hp-color_laserjet_8500-pcl3.ppd.gz
new file mode 100644
index 0000000..a6fe1ca
--- /dev/null
+++ b/ppd/hpcups/hp-color_laserjet_8500-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-color_laserjet_8550-pcl3.ppd.gz b/ppd/hpcups/hp-color_laserjet_8550-pcl3.ppd.gz
new file mode 100644
index 0000000..d8e479d
--- /dev/null
+++ b/ppd/hpcups/hp-color_laserjet_8550-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-color_laserjet_9500-pcl3.ppd.gz b/ppd/hpcups/hp-color_laserjet_9500-pcl3.ppd.gz
new file mode 100644
index 0000000..cbff43d
--- /dev/null
+++ b/ppd/hpcups/hp-color_laserjet_9500-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-color_laserjet_9500_mfp-pcl3.ppd.gz b/ppd/hpcups/hp-color_laserjet_9500_mfp-pcl3.ppd.gz
new file mode 100644
index 0000000..173fbcd
--- /dev/null
+++ b/ppd/hpcups/hp-color_laserjet_9500_mfp-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-color_laserjet_cm1312_mfp-pcl3.ppd.gz b/ppd/hpcups/hp-color_laserjet_cm1312_mfp-pcl3.ppd.gz
new file mode 100644
index 0000000..d8711d8
--- /dev/null
+++ b/ppd/hpcups/hp-color_laserjet_cm1312_mfp-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-color_laserjet_cm1312nfi_mfp-pcl3.ppd.gz b/ppd/hpcups/hp-color_laserjet_cm1312nfi_mfp-pcl3.ppd.gz
new file mode 100644
index 0000000..b1eb2b0
--- /dev/null
+++ b/ppd/hpcups/hp-color_laserjet_cm1312nfi_mfp-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-color_laserjet_cm2320_mfp-pcl3.ppd.gz b/ppd/hpcups/hp-color_laserjet_cm2320_mfp-pcl3.ppd.gz
new file mode 100644
index 0000000..c28fe86
--- /dev/null
+++ b/ppd/hpcups/hp-color_laserjet_cm2320_mfp-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-color_laserjet_cm2320fxi_mfp-pcl3.ppd.gz b/ppd/hpcups/hp-color_laserjet_cm2320fxi_mfp-pcl3.ppd.gz
new file mode 100644
index 0000000..f3cf0fc
--- /dev/null
+++ b/ppd/hpcups/hp-color_laserjet_cm2320fxi_mfp-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-color_laserjet_cm2320n_mfp-pcl3.ppd.gz b/ppd/hpcups/hp-color_laserjet_cm2320n_mfp-pcl3.ppd.gz
new file mode 100644
index 0000000..aee5b99
--- /dev/null
+++ b/ppd/hpcups/hp-color_laserjet_cm2320n_mfp-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-color_laserjet_cm2320nf_mfp-pcl3.ppd.gz b/ppd/hpcups/hp-color_laserjet_cm2320nf_mfp-pcl3.ppd.gz
new file mode 100644
index 0000000..aa96dfc
--- /dev/null
+++ b/ppd/hpcups/hp-color_laserjet_cm2320nf_mfp-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-color_laserjet_cm3530_mfp-pcl3.ppd.gz b/ppd/hpcups/hp-color_laserjet_cm3530_mfp-pcl3.ppd.gz
new file mode 100644
index 0000000..5e62d1b
--- /dev/null
+++ b/ppd/hpcups/hp-color_laserjet_cm3530_mfp-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-color_laserjet_cm4540_mfp-pcl3.ppd.gz b/ppd/hpcups/hp-color_laserjet_cm4540_mfp-pcl3.ppd.gz
new file mode 100644
index 0000000..b65f643
--- /dev/null
+++ b/ppd/hpcups/hp-color_laserjet_cm4540_mfp-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-color_laserjet_cm4730_mfp-pcl3.ppd.gz b/ppd/hpcups/hp-color_laserjet_cm4730_mfp-pcl3.ppd.gz
new file mode 100644
index 0000000..3320078
--- /dev/null
+++ b/ppd/hpcups/hp-color_laserjet_cm4730_mfp-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-color_laserjet_cm6030_mfp-pcl3.ppd.gz b/ppd/hpcups/hp-color_laserjet_cm6030_mfp-pcl3.ppd.gz
new file mode 100644
index 0000000..16dfeb9
--- /dev/null
+++ b/ppd/hpcups/hp-color_laserjet_cm6030_mfp-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-color_laserjet_cm6040_mfp.ppd.gz b/ppd/hpcups/hp-color_laserjet_cm6040_mfp.ppd.gz
new file mode 100644
index 0000000..aeabf42
--- /dev/null
+++ b/ppd/hpcups/hp-color_laserjet_cm6040_mfp.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-color_laserjet_cm6049_mfp.ppd.gz b/ppd/hpcups/hp-color_laserjet_cm6049_mfp.ppd.gz
new file mode 100644
index 0000000..d16ed6a
--- /dev/null
+++ b/ppd/hpcups/hp-color_laserjet_cm6049_mfp.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-color_laserjet_cp1215.ppd.gz b/ppd/hpcups/hp-color_laserjet_cp1215.ppd.gz
new file mode 100644
index 0000000..3141114
--- /dev/null
+++ b/ppd/hpcups/hp-color_laserjet_cp1215.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-color_laserjet_cp1217.ppd.gz b/ppd/hpcups/hp-color_laserjet_cp1217.ppd.gz
new file mode 100644
index 0000000..bfe4982
--- /dev/null
+++ b/ppd/hpcups/hp-color_laserjet_cp1217.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-color_laserjet_cp1514n-pcl3.ppd.gz b/ppd/hpcups/hp-color_laserjet_cp1514n-pcl3.ppd.gz
new file mode 100644
index 0000000..092a799
--- /dev/null
+++ b/ppd/hpcups/hp-color_laserjet_cp1514n-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-color_laserjet_cp1515n-pcl3.ppd.gz b/ppd/hpcups/hp-color_laserjet_cp1515n-pcl3.ppd.gz
new file mode 100644
index 0000000..ce4be84
--- /dev/null
+++ b/ppd/hpcups/hp-color_laserjet_cp1515n-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-color_laserjet_cp1518ni-pcl3.ppd.gz b/ppd/hpcups/hp-color_laserjet_cp1518ni-pcl3.ppd.gz
new file mode 100644
index 0000000..02e4595
--- /dev/null
+++ b/ppd/hpcups/hp-color_laserjet_cp1518ni-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-color_laserjet_cp2025-pcl3.ppd.gz b/ppd/hpcups/hp-color_laserjet_cp2025-pcl3.ppd.gz
new file mode 100644
index 0000000..215306e
--- /dev/null
+++ b/ppd/hpcups/hp-color_laserjet_cp2025-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-color_laserjet_cp2025dn-pcl3.ppd.gz b/ppd/hpcups/hp-color_laserjet_cp2025dn-pcl3.ppd.gz
new file mode 100644
index 0000000..9304260
--- /dev/null
+++ b/ppd/hpcups/hp-color_laserjet_cp2025dn-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-color_laserjet_cp2025n-pcl3.ppd.gz b/ppd/hpcups/hp-color_laserjet_cp2025n-pcl3.ppd.gz
new file mode 100644
index 0000000..dbfd497
--- /dev/null
+++ b/ppd/hpcups/hp-color_laserjet_cp2025n-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-color_laserjet_cp2025x-pcl3.ppd.gz b/ppd/hpcups/hp-color_laserjet_cp2025x-pcl3.ppd.gz
new file mode 100644
index 0000000..ff121c0
--- /dev/null
+++ b/ppd/hpcups/hp-color_laserjet_cp2025x-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-color_laserjet_cp3505-pcl3.ppd.gz b/ppd/hpcups/hp-color_laserjet_cp3505-pcl3.ppd.gz
new file mode 100644
index 0000000..4949887
--- /dev/null
+++ b/ppd/hpcups/hp-color_laserjet_cp3505-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-color_laserjet_cp3525-pcl3.ppd.gz b/ppd/hpcups/hp-color_laserjet_cp3525-pcl3.ppd.gz
new file mode 100644
index 0000000..9321e8f
--- /dev/null
+++ b/ppd/hpcups/hp-color_laserjet_cp3525-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-color_laserjet_cp4005-pcl3.ppd.gz b/ppd/hpcups/hp-color_laserjet_cp4005-pcl3.ppd.gz
new file mode 100644
index 0000000..aa3f9a8
--- /dev/null
+++ b/ppd/hpcups/hp-color_laserjet_cp4005-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-color_laserjet_cp4020_series-pcl3.ppd.gz b/ppd/hpcups/hp-color_laserjet_cp4020_series-pcl3.ppd.gz
new file mode 100644
index 0000000..c83a309
--- /dev/null
+++ b/ppd/hpcups/hp-color_laserjet_cp4020_series-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-color_laserjet_cp4520_series-pcl3.ppd.gz b/ppd/hpcups/hp-color_laserjet_cp4520_series-pcl3.ppd.gz
new file mode 100644
index 0000000..7c09db1
--- /dev/null
+++ b/ppd/hpcups/hp-color_laserjet_cp4520_series-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-color_laserjet_cp5225-pcl3.ppd.gz b/ppd/hpcups/hp-color_laserjet_cp5225-pcl3.ppd.gz
new file mode 100644
index 0000000..f321ad8
--- /dev/null
+++ b/ppd/hpcups/hp-color_laserjet_cp5225-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-color_laserjet_cp5225dn-pcl3.ppd.gz b/ppd/hpcups/hp-color_laserjet_cp5225dn-pcl3.ppd.gz
new file mode 100644
index 0000000..fb0f171
--- /dev/null
+++ b/ppd/hpcups/hp-color_laserjet_cp5225dn-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-color_laserjet_cp5225n-pcl3.ppd.gz b/ppd/hpcups/hp-color_laserjet_cp5225n-pcl3.ppd.gz
new file mode 100644
index 0000000..ce5abe0
--- /dev/null
+++ b/ppd/hpcups/hp-color_laserjet_cp5225n-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-color_laserjet_cp5520_series-pcl3.ppd.gz b/ppd/hpcups/hp-color_laserjet_cp5520_series-pcl3.ppd.gz
new file mode 100644
index 0000000..7f1194a
--- /dev/null
+++ b/ppd/hpcups/hp-color_laserjet_cp5520_series-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-color_laserjet_cp6015-pcl3.ppd.gz b/ppd/hpcups/hp-color_laserjet_cp6015-pcl3.ppd.gz
new file mode 100644
index 0000000..2d43687
--- /dev/null
+++ b/ppd/hpcups/hp-color_laserjet_cp6015-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-cp1160.ppd.gz b/ppd/hpcups/hp-cp1160.ppd.gz
new file mode 100644
index 0000000..7e22b14
--- /dev/null
+++ b/ppd/hpcups/hp-cp1160.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_1000_j110_series.ppd.gz b/ppd/hpcups/hp-deskjet_1000_j110_series.ppd.gz
new file mode 100644
index 0000000..78251a5
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_1000_j110_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_1050_j410_series.ppd.gz b/ppd/hpcups/hp-deskjet_1050_j410_series.ppd.gz
new file mode 100644
index 0000000..d0b28fb
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_1050_j410_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_1100.ppd.gz b/ppd/hpcups/hp-deskjet_1100.ppd.gz
new file mode 100644
index 0000000..4653d72
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_1100.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_1120.ppd.gz b/ppd/hpcups/hp-deskjet_1120.ppd.gz
new file mode 100644
index 0000000..0c48059
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_1120.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_1125.ppd.gz b/ppd/hpcups/hp-deskjet_1125.ppd.gz
new file mode 100644
index 0000000..56222d4
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_1125.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_1200c.ppd.gz b/ppd/hpcups/hp-deskjet_1200c.ppd.gz
new file mode 100644
index 0000000..edf7d9d
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_1200c.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_1220c.ppd.gz b/ppd/hpcups/hp-deskjet_1220c.ppd.gz
new file mode 100644
index 0000000..ab6bcde
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_1220c.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_1280.ppd.gz b/ppd/hpcups/hp-deskjet_1280.ppd.gz
new file mode 100644
index 0000000..9bd4bb6
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_1280.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_1600c.ppd.gz b/ppd/hpcups/hp-deskjet_1600c.ppd.gz
new file mode 100644
index 0000000..6babb32
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_1600c.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_1600cm.ppd.gz b/ppd/hpcups/hp-deskjet_1600cm.ppd.gz
new file mode 100644
index 0000000..92e0dac
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_1600cm.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_1600cn.ppd.gz b/ppd/hpcups/hp-deskjet_1600cn.ppd.gz
new file mode 100644
index 0000000..e8a1709
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_1600cn.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_2000_j210_series.ppd.gz b/ppd/hpcups/hp-deskjet_2000_j210_series.ppd.gz
new file mode 100644
index 0000000..e40b721
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_2000_j210_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_2050_j510_series.ppd.gz b/ppd/hpcups/hp-deskjet_2050_j510_series.ppd.gz
new file mode 100644
index 0000000..45c38f7
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_2050_j510_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_3000_j310_series.ppd.gz b/ppd/hpcups/hp-deskjet_3000_j310_series.ppd.gz
new file mode 100644
index 0000000..5099271
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_3000_j310_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_3050_j610_series.ppd.gz b/ppd/hpcups/hp-deskjet_3050_j610_series.ppd.gz
new file mode 100644
index 0000000..4ec0799
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_3050_j610_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_3050a_j611_series.ppd.gz b/ppd/hpcups/hp-deskjet_3050a_j611_series.ppd.gz
new file mode 100644
index 0000000..6db9306
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_3050a_j611_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_3070_b611_series.ppd.gz b/ppd/hpcups/hp-deskjet_3070_b611_series.ppd.gz
new file mode 100644
index 0000000..0e9d160
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_3070_b611_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_3320.ppd.gz b/ppd/hpcups/hp-deskjet_3320.ppd.gz
new file mode 100644
index 0000000..866d158
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_3320.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_3325.ppd.gz b/ppd/hpcups/hp-deskjet_3325.ppd.gz
new file mode 100644
index 0000000..a8fa60f
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_3325.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_3420.ppd.gz b/ppd/hpcups/hp-deskjet_3420.ppd.gz
new file mode 100644
index 0000000..0cd987e
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_3420.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_3425.ppd.gz b/ppd/hpcups/hp-deskjet_3425.ppd.gz
new file mode 100644
index 0000000..62c772e
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_3425.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_3450.ppd.gz b/ppd/hpcups/hp-deskjet_3450.ppd.gz
new file mode 100644
index 0000000..99de67a
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_3450.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_3500.ppd.gz b/ppd/hpcups/hp-deskjet_3500.ppd.gz
new file mode 100644
index 0000000..0028970
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_3500.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_3550.ppd.gz b/ppd/hpcups/hp-deskjet_3550.ppd.gz
new file mode 100644
index 0000000..149ea89
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_3550.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_3600.ppd.gz b/ppd/hpcups/hp-deskjet_3600.ppd.gz
new file mode 100644
index 0000000..68409c9
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_3600.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_3650.ppd.gz b/ppd/hpcups/hp-deskjet_3650.ppd.gz
new file mode 100644
index 0000000..9acc079
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_3650.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_3740.ppd.gz b/ppd/hpcups/hp-deskjet_3740.ppd.gz
new file mode 100644
index 0000000..5e86215
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_3740.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_3810.ppd.gz b/ppd/hpcups/hp-deskjet_3810.ppd.gz
new file mode 100644
index 0000000..0f61e08
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_3810.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_3816.ppd.gz b/ppd/hpcups/hp-deskjet_3816.ppd.gz
new file mode 100644
index 0000000..36acecc
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_3816.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_3819.ppd.gz b/ppd/hpcups/hp-deskjet_3819.ppd.gz
new file mode 100644
index 0000000..fec0eed
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_3819.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_3820.ppd.gz b/ppd/hpcups/hp-deskjet_3820.ppd.gz
new file mode 100644
index 0000000..54dd8a8
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_3820.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_3822.ppd.gz b/ppd/hpcups/hp-deskjet_3822.ppd.gz
new file mode 100644
index 0000000..1e8163d
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_3822.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_3840.ppd.gz b/ppd/hpcups/hp-deskjet_3840.ppd.gz
new file mode 100644
index 0000000..ac5ae2a
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_3840.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_3870.ppd.gz b/ppd/hpcups/hp-deskjet_3870.ppd.gz
new file mode 100644
index 0000000..6a7af81
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_3870.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_3900.ppd.gz b/ppd/hpcups/hp-deskjet_3900.ppd.gz
new file mode 100644
index 0000000..4461ac2
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_3900.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_3910.ppd.gz b/ppd/hpcups/hp-deskjet_3910.ppd.gz
new file mode 100644
index 0000000..3d67485
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_3910.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_3920.ppd.gz b/ppd/hpcups/hp-deskjet_3920.ppd.gz
new file mode 100644
index 0000000..f525d1f
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_3920.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_3940.ppd.gz b/ppd/hpcups/hp-deskjet_3940.ppd.gz
new file mode 100644
index 0000000..3a36a1b
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_3940.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_400.ppd.gz b/ppd/hpcups/hp-deskjet_400.ppd.gz
new file mode 100644
index 0000000..dde9cb8
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_400.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_400l.ppd.gz b/ppd/hpcups/hp-deskjet_400l.ppd.gz
new file mode 100644
index 0000000..0757ef2
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_400l.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_460.ppd.gz b/ppd/hpcups/hp-deskjet_460.ppd.gz
new file mode 100644
index 0000000..0827b31
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_460.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_500.ppd.gz b/ppd/hpcups/hp-deskjet_500.ppd.gz
new file mode 100644
index 0000000..e5f729e
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_500.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_500c.ppd.gz b/ppd/hpcups/hp-deskjet_500c.ppd.gz
new file mode 100644
index 0000000..1b674fb
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_500c.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_505j.ppd.gz b/ppd/hpcups/hp-deskjet_505j.ppd.gz
new file mode 100644
index 0000000..c81d3fb
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_505j.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_510.ppd.gz b/ppd/hpcups/hp-deskjet_510.ppd.gz
new file mode 100644
index 0000000..0be9345
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_510.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_5100.ppd.gz b/ppd/hpcups/hp-deskjet_5100.ppd.gz
new file mode 100644
index 0000000..f3194bb
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_5100.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_520.ppd.gz b/ppd/hpcups/hp-deskjet_520.ppd.gz
new file mode 100644
index 0000000..cd31096
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_520.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_540.ppd.gz b/ppd/hpcups/hp-deskjet_540.ppd.gz
new file mode 100644
index 0000000..c003ed2
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_540.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_5400_series.ppd.gz b/ppd/hpcups/hp-deskjet_5400_series.ppd.gz
new file mode 100644
index 0000000..3cb2b19
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_5400_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_550c.ppd.gz b/ppd/hpcups/hp-deskjet_550c.ppd.gz
new file mode 100644
index 0000000..9a7cd78
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_550c.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_5550.ppd.gz b/ppd/hpcups/hp-deskjet_5550.ppd.gz
new file mode 100644
index 0000000..ab60af7
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_5550.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_5551.ppd.gz b/ppd/hpcups/hp-deskjet_5551.ppd.gz
new file mode 100644
index 0000000..1db2ae2
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_5551.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_5552.ppd.gz b/ppd/hpcups/hp-deskjet_5552.ppd.gz
new file mode 100644
index 0000000..7dfe886
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_5552.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_5600.ppd.gz b/ppd/hpcups/hp-deskjet_5600.ppd.gz
new file mode 100644
index 0000000..7853031
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_5600.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_5650.ppd.gz b/ppd/hpcups/hp-deskjet_5650.ppd.gz
new file mode 100644
index 0000000..491e184
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_5650.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_5652.ppd.gz b/ppd/hpcups/hp-deskjet_5652.ppd.gz
new file mode 100644
index 0000000..dbeba6b
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_5652.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_5700.ppd.gz b/ppd/hpcups/hp-deskjet_5700.ppd.gz
new file mode 100644
index 0000000..bf58a36
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_5700.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_5800.ppd.gz b/ppd/hpcups/hp-deskjet_5800.ppd.gz
new file mode 100644
index 0000000..157e246
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_5800.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_5850.ppd.gz b/ppd/hpcups/hp-deskjet_5850.ppd.gz
new file mode 100644
index 0000000..3982647
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_5850.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_5900_series.ppd.gz b/ppd/hpcups/hp-deskjet_5900_series.ppd.gz
new file mode 100644
index 0000000..8a508b8
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_5900_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_600.ppd.gz b/ppd/hpcups/hp-deskjet_600.ppd.gz
new file mode 100644
index 0000000..7910914
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_600.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_610c.ppd.gz b/ppd/hpcups/hp-deskjet_610c.ppd.gz
new file mode 100644
index 0000000..f3e0118
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_610c.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_610cl.ppd.gz b/ppd/hpcups/hp-deskjet_610cl.ppd.gz
new file mode 100644
index 0000000..ab9f4a3
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_610cl.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_6120.ppd.gz b/ppd/hpcups/hp-deskjet_6120.ppd.gz
new file mode 100644
index 0000000..8fc2f18
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_6120.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_6122.ppd.gz b/ppd/hpcups/hp-deskjet_6122.ppd.gz
new file mode 100644
index 0000000..5726e56
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_6122.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_6127.ppd.gz b/ppd/hpcups/hp-deskjet_6127.ppd.gz
new file mode 100644
index 0000000..a56d46b
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_6127.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_612c.ppd.gz b/ppd/hpcups/hp-deskjet_612c.ppd.gz
new file mode 100644
index 0000000..0711df0
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_612c.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_630c.ppd.gz b/ppd/hpcups/hp-deskjet_630c.ppd.gz
new file mode 100644
index 0000000..aee1828
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_630c.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_632c.ppd.gz b/ppd/hpcups/hp-deskjet_632c.ppd.gz
new file mode 100644
index 0000000..5ab5d01
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_632c.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_640c.ppd.gz b/ppd/hpcups/hp-deskjet_640c.ppd.gz
new file mode 100644
index 0000000..93b3f23
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_640c.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_648c.ppd.gz b/ppd/hpcups/hp-deskjet_648c.ppd.gz
new file mode 100644
index 0000000..508ddc6
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_648c.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_6500.ppd.gz b/ppd/hpcups/hp-deskjet_6500.ppd.gz
new file mode 100644
index 0000000..14458da
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_6500.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_656c.ppd.gz b/ppd/hpcups/hp-deskjet_656c.ppd.gz
new file mode 100644
index 0000000..3e1d37a
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_656c.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_660.ppd.gz b/ppd/hpcups/hp-deskjet_660.ppd.gz
new file mode 100644
index 0000000..b20cb96
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_660.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_6600.ppd.gz b/ppd/hpcups/hp-deskjet_6600.ppd.gz
new file mode 100644
index 0000000..f42f721
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_6600.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_670.ppd.gz b/ppd/hpcups/hp-deskjet_670.ppd.gz
new file mode 100644
index 0000000..fe2bb10
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_670.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_670c.ppd.gz b/ppd/hpcups/hp-deskjet_670c.ppd.gz
new file mode 100644
index 0000000..27ef13f
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_670c.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_670tv.ppd.gz b/ppd/hpcups/hp-deskjet_670tv.ppd.gz
new file mode 100644
index 0000000..e6d351c
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_670tv.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_672c.ppd.gz b/ppd/hpcups/hp-deskjet_672c.ppd.gz
new file mode 100644
index 0000000..ca3746d
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_672c.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_680.ppd.gz b/ppd/hpcups/hp-deskjet_680.ppd.gz
new file mode 100644
index 0000000..ae514c9
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_680.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_6800.ppd.gz b/ppd/hpcups/hp-deskjet_6800.ppd.gz
new file mode 100644
index 0000000..b3382a9
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_6800.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_682.ppd.gz b/ppd/hpcups/hp-deskjet_682.ppd.gz
new file mode 100644
index 0000000..487f377
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_682.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_690.ppd.gz b/ppd/hpcups/hp-deskjet_690.ppd.gz
new file mode 100644
index 0000000..64082fc
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_690.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_690c.ppd.gz b/ppd/hpcups/hp-deskjet_690c.ppd.gz
new file mode 100644
index 0000000..c121df9
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_690c.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_692.ppd.gz b/ppd/hpcups/hp-deskjet_692.ppd.gz
new file mode 100644
index 0000000..9a6cbf9
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_692.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_693.ppd.gz b/ppd/hpcups/hp-deskjet_693.ppd.gz
new file mode 100644
index 0000000..b5a0809
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_693.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_694.ppd.gz b/ppd/hpcups/hp-deskjet_694.ppd.gz
new file mode 100644
index 0000000..4c2fb5b
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_694.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_6940_series.ppd.gz b/ppd/hpcups/hp-deskjet_6940_series.ppd.gz
new file mode 100644
index 0000000..e31024c
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_6940_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_695.ppd.gz b/ppd/hpcups/hp-deskjet_695.ppd.gz
new file mode 100644
index 0000000..7e0570e
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_695.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_697.ppd.gz b/ppd/hpcups/hp-deskjet_697.ppd.gz
new file mode 100644
index 0000000..a733036
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_697.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_6980_series.ppd.gz b/ppd/hpcups/hp-deskjet_6980_series.ppd.gz
new file mode 100644
index 0000000..f8f5ed3
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_6980_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_810c.ppd.gz b/ppd/hpcups/hp-deskjet_810c.ppd.gz
new file mode 100644
index 0000000..b99261e
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_810c.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_812c.ppd.gz b/ppd/hpcups/hp-deskjet_812c.ppd.gz
new file mode 100644
index 0000000..cb5d71f
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_812c.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_815c.ppd.gz b/ppd/hpcups/hp-deskjet_815c.ppd.gz
new file mode 100644
index 0000000..e2bb256
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_815c.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_816c.ppd.gz b/ppd/hpcups/hp-deskjet_816c.ppd.gz
new file mode 100644
index 0000000..4195ecb
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_816c.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_825c.ppd.gz b/ppd/hpcups/hp-deskjet_825c.ppd.gz
new file mode 100644
index 0000000..5d10781
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_825c.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_830c.ppd.gz b/ppd/hpcups/hp-deskjet_830c.ppd.gz
new file mode 100644
index 0000000..c8299ce
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_830c.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_832c.ppd.gz b/ppd/hpcups/hp-deskjet_832c.ppd.gz
new file mode 100644
index 0000000..0ed880b
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_832c.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_840c.ppd.gz b/ppd/hpcups/hp-deskjet_840c.ppd.gz
new file mode 100644
index 0000000..f1eceac
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_840c.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_841c.ppd.gz b/ppd/hpcups/hp-deskjet_841c.ppd.gz
new file mode 100644
index 0000000..3fea267
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_841c.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_842c.ppd.gz b/ppd/hpcups/hp-deskjet_842c.ppd.gz
new file mode 100644
index 0000000..8e76abb
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_842c.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_843c.ppd.gz b/ppd/hpcups/hp-deskjet_843c.ppd.gz
new file mode 100644
index 0000000..62ea3bb
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_843c.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_845c.ppd.gz b/ppd/hpcups/hp-deskjet_845c.ppd.gz
new file mode 100644
index 0000000..034df27
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_845c.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_850c.ppd.gz b/ppd/hpcups/hp-deskjet_850c.ppd.gz
new file mode 100644
index 0000000..2711a26
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_850c.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_855c.ppd.gz b/ppd/hpcups/hp-deskjet_855c.ppd.gz
new file mode 100644
index 0000000..c84141a
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_855c.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_870c.ppd.gz b/ppd/hpcups/hp-deskjet_870c.ppd.gz
new file mode 100644
index 0000000..3defb38
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_870c.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_880c.ppd.gz b/ppd/hpcups/hp-deskjet_880c.ppd.gz
new file mode 100644
index 0000000..31a5de7
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_880c.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_882c.ppd.gz b/ppd/hpcups/hp-deskjet_882c.ppd.gz
new file mode 100644
index 0000000..e993cd3
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_882c.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_890c.ppd.gz b/ppd/hpcups/hp-deskjet_890c.ppd.gz
new file mode 100644
index 0000000..9294bf1
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_890c.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_895c.ppd.gz b/ppd/hpcups/hp-deskjet_895c.ppd.gz
new file mode 100644
index 0000000..8d9ea43
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_895c.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_916c.ppd.gz b/ppd/hpcups/hp-deskjet_916c.ppd.gz
new file mode 100644
index 0000000..a02f41a
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_916c.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_920c.ppd.gz b/ppd/hpcups/hp-deskjet_920c.ppd.gz
new file mode 100644
index 0000000..286f005
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_920c.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_9300.ppd.gz b/ppd/hpcups/hp-deskjet_9300.ppd.gz
new file mode 100644
index 0000000..70ada7b
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_9300.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_930c.ppd.gz b/ppd/hpcups/hp-deskjet_930c.ppd.gz
new file mode 100644
index 0000000..a2c102f
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_930c.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_932c.ppd.gz b/ppd/hpcups/hp-deskjet_932c.ppd.gz
new file mode 100644
index 0000000..28952b7
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_932c.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_933c.ppd.gz b/ppd/hpcups/hp-deskjet_933c.ppd.gz
new file mode 100644
index 0000000..81a52af
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_933c.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_934c.ppd.gz b/ppd/hpcups/hp-deskjet_934c.ppd.gz
new file mode 100644
index 0000000..2ba62ae
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_934c.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_935c.ppd.gz b/ppd/hpcups/hp-deskjet_935c.ppd.gz
new file mode 100644
index 0000000..47f0ba6
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_935c.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_940c.ppd.gz b/ppd/hpcups/hp-deskjet_940c.ppd.gz
new file mode 100644
index 0000000..30826dd
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_940c.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_948c.ppd.gz b/ppd/hpcups/hp-deskjet_948c.ppd.gz
new file mode 100644
index 0000000..59eb327
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_948c.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_950c.ppd.gz b/ppd/hpcups/hp-deskjet_950c.ppd.gz
new file mode 100644
index 0000000..792e4e3
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_950c.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_952c.ppd.gz b/ppd/hpcups/hp-deskjet_952c.ppd.gz
new file mode 100644
index 0000000..4919feb
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_952c.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_955c.ppd.gz b/ppd/hpcups/hp-deskjet_955c.ppd.gz
new file mode 100644
index 0000000..d832272
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_955c.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_957c.ppd.gz b/ppd/hpcups/hp-deskjet_957c.ppd.gz
new file mode 100644
index 0000000..378294d
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_957c.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_959c.ppd.gz b/ppd/hpcups/hp-deskjet_959c.ppd.gz
new file mode 100644
index 0000000..53b1f9a
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_959c.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_9600.ppd.gz b/ppd/hpcups/hp-deskjet_9600.ppd.gz
new file mode 100644
index 0000000..e798e37
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_9600.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_960c.ppd.gz b/ppd/hpcups/hp-deskjet_960c.ppd.gz
new file mode 100644
index 0000000..80967a5
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_960c.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_970c.ppd.gz b/ppd/hpcups/hp-deskjet_970c.ppd.gz
new file mode 100644
index 0000000..32f146f
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_970c.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_975c.ppd.gz b/ppd/hpcups/hp-deskjet_975c.ppd.gz
new file mode 100644
index 0000000..ebf9f35
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_975c.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_9800.ppd.gz b/ppd/hpcups/hp-deskjet_9800.ppd.gz
new file mode 100644
index 0000000..1a1fd83
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_9800.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_980c.ppd.gz b/ppd/hpcups/hp-deskjet_980c.ppd.gz
new file mode 100644
index 0000000..8b53c3b
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_980c.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_990c.ppd.gz b/ppd/hpcups/hp-deskjet_990c.ppd.gz
new file mode 100644
index 0000000..3eaa821
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_990c.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_995c.ppd.gz b/ppd/hpcups/hp-deskjet_995c.ppd.gz
new file mode 100644
index 0000000..1173313
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_995c.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_d1300_series.ppd.gz b/ppd/hpcups/hp-deskjet_d1300_series.ppd.gz
new file mode 100644
index 0000000..41a5472
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_d1300_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_d1400_series.ppd.gz b/ppd/hpcups/hp-deskjet_d1400_series.ppd.gz
new file mode 100644
index 0000000..8139d8d
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_d1400_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_d1500_series.ppd.gz b/ppd/hpcups/hp-deskjet_d1500_series.ppd.gz
new file mode 100644
index 0000000..496c26c
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_d1500_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_d1600_series.ppd.gz b/ppd/hpcups/hp-deskjet_d1600_series.ppd.gz
new file mode 100644
index 0000000..57e108d
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_d1600_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_d2300_series.ppd.gz b/ppd/hpcups/hp-deskjet_d2300_series.ppd.gz
new file mode 100644
index 0000000..60c197e
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_d2300_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_d2400_series.ppd.gz b/ppd/hpcups/hp-deskjet_d2400_series.ppd.gz
new file mode 100644
index 0000000..9932517
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_d2400_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_d2500_series.ppd.gz b/ppd/hpcups/hp-deskjet_d2500_series.ppd.gz
new file mode 100644
index 0000000..c9ec661
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_d2500_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_d2600_series.ppd.gz b/ppd/hpcups/hp-deskjet_d2600_series.ppd.gz
new file mode 100644
index 0000000..e29b7dd
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_d2600_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_d4100_series.ppd.gz b/ppd/hpcups/hp-deskjet_d4100_series.ppd.gz
new file mode 100644
index 0000000..5c44022
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_d4100_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_d4200_series.ppd.gz b/ppd/hpcups/hp-deskjet_d4200_series.ppd.gz
new file mode 100644
index 0000000..7911f5e
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_d4200_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_d4300_series.ppd.gz b/ppd/hpcups/hp-deskjet_d4300_series.ppd.gz
new file mode 100644
index 0000000..521d9c2
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_d4300_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_d5500_series.ppd.gz b/ppd/hpcups/hp-deskjet_d5500_series.ppd.gz
new file mode 100644
index 0000000..49eddb4
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_d5500_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_d730.ppd.gz b/ppd/hpcups/hp-deskjet_d730.ppd.gz
new file mode 100644
index 0000000..42db588
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_d730.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_f2100_series.ppd.gz b/ppd/hpcups/hp-deskjet_f2100_series.ppd.gz
new file mode 100644
index 0000000..88379d5
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_f2100_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_f2200_series.ppd.gz b/ppd/hpcups/hp-deskjet_f2200_series.ppd.gz
new file mode 100644
index 0000000..117bc4f
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_f2200_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_f2400_series.ppd.gz b/ppd/hpcups/hp-deskjet_f2400_series.ppd.gz
new file mode 100644
index 0000000..d25346b
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_f2400_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_f300_series.ppd.gz b/ppd/hpcups/hp-deskjet_f300_series.ppd.gz
new file mode 100644
index 0000000..7618641
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_f300_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_f4100_series.ppd.gz b/ppd/hpcups/hp-deskjet_f4100_series.ppd.gz
new file mode 100644
index 0000000..ac0023b
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_f4100_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_f4200_series.ppd.gz b/ppd/hpcups/hp-deskjet_f4200_series.ppd.gz
new file mode 100644
index 0000000..dc9282c
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_f4200_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_f4210_series.ppd.gz b/ppd/hpcups/hp-deskjet_f4210_series.ppd.gz
new file mode 100644
index 0000000..b6b6b59
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_f4210_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_f4213_series.ppd.gz b/ppd/hpcups/hp-deskjet_f4213_series.ppd.gz
new file mode 100644
index 0000000..9d7bdb7
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_f4213_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_f4400_series.ppd.gz b/ppd/hpcups/hp-deskjet_f4400_series.ppd.gz
new file mode 100644
index 0000000..c53d4dc
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_f4400_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_f4500_series.ppd.gz b/ppd/hpcups/hp-deskjet_f4500_series.ppd.gz
new file mode 100644
index 0000000..9903406
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_f4500_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_f735.ppd.gz b/ppd/hpcups/hp-deskjet_f735.ppd.gz
new file mode 100644
index 0000000..c5bfa0b
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_f735.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_ink_adv_2010_k010.ppd.gz b/ppd/hpcups/hp-deskjet_ink_adv_2010_k010.ppd.gz
new file mode 100644
index 0000000..3bbd533
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_ink_adv_2010_k010.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_ink_adv_2060_k110.ppd.gz b/ppd/hpcups/hp-deskjet_ink_adv_2060_k110.ppd.gz
new file mode 100644
index 0000000..6910b88
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_ink_adv_2060_k110.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_ink_advant_k109a-z.ppd.gz b/ppd/hpcups/hp-deskjet_ink_advant_k109a-z.ppd.gz
new file mode 100644
index 0000000..e9b3953
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_ink_advant_k109a-z.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-deskjet_ink_advant_k209a-z.ppd.gz b/ppd/hpcups/hp-deskjet_ink_advant_k209a-z.ppd.gz
new file mode 100644
index 0000000..b715837
--- /dev/null
+++ b/ppd/hpcups/hp-deskjet_ink_advant_k209a-z.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-dj350.ppd.gz b/ppd/hpcups/hp-dj350.ppd.gz
new file mode 100644
index 0000000..3dc2e5a
--- /dev/null
+++ b/ppd/hpcups/hp-dj350.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-dj450.ppd.gz b/ppd/hpcups/hp-dj450.ppd.gz
new file mode 100644
index 0000000..9b161b0
--- /dev/null
+++ b/ppd/hpcups/hp-dj450.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-envy_100_d410_series.ppd.gz b/ppd/hpcups/hp-envy_100_d410_series.ppd.gz
new file mode 100644
index 0000000..1648796
--- /dev/null
+++ b/ppd/hpcups/hp-envy_100_d410_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-envy_110_series.ppd.gz b/ppd/hpcups/hp-envy_110_series.ppd.gz
new file mode 100644
index 0000000..1185bdb
--- /dev/null
+++ b/ppd/hpcups/hp-envy_110_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_1000.ppd.gz b/ppd/hpcups/hp-laserjet_1000.ppd.gz
new file mode 100644
index 0000000..f2b78f5
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_1000.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_1005_series.ppd.gz b/ppd/hpcups/hp-laserjet_1005_series.ppd.gz
new file mode 100644
index 0000000..962657a
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_1005_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_1010.ppd.gz b/ppd/hpcups/hp-laserjet_1010.ppd.gz
new file mode 100644
index 0000000..96565f4
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_1010.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_1012.ppd.gz b/ppd/hpcups/hp-laserjet_1012.ppd.gz
new file mode 100644
index 0000000..6b6797b
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_1012.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_1015.ppd.gz b/ppd/hpcups/hp-laserjet_1015.ppd.gz
new file mode 100644
index 0000000..16d2104
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_1015.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_1018.ppd.gz b/ppd/hpcups/hp-laserjet_1018.ppd.gz
new file mode 100644
index 0000000..406daf1
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_1018.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_1020.ppd.gz b/ppd/hpcups/hp-laserjet_1020.ppd.gz
new file mode 100644
index 0000000..082bb72
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_1020.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_1022-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_1022-pcl3.ppd.gz
new file mode 100644
index 0000000..0ae51f9
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_1022-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_1022-zjs.ppd.gz b/ppd/hpcups/hp-laserjet_1022-zjs.ppd.gz
new file mode 100644
index 0000000..d4dc3a9
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_1022-zjs.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_1022n-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_1022n-pcl3.ppd.gz
new file mode 100644
index 0000000..6c908bd
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_1022n-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_1022n-zjs.ppd.gz b/ppd/hpcups/hp-laserjet_1022n-zjs.ppd.gz
new file mode 100644
index 0000000..1df8afe
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_1022n-zjs.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_1022nw-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_1022nw-pcl3.ppd.gz
new file mode 100644
index 0000000..b10524b
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_1022nw-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_1022nw-zjs.ppd.gz b/ppd/hpcups/hp-laserjet_1022nw-zjs.ppd.gz
new file mode 100644
index 0000000..1ed7a0b
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_1022nw-zjs.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_1100.ppd.gz b/ppd/hpcups/hp-laserjet_1100.ppd.gz
new file mode 100644
index 0000000..235e67f
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_1100.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_1100a.ppd.gz b/ppd/hpcups/hp-laserjet_1100a.ppd.gz
new file mode 100644
index 0000000..c348893
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_1100a.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_1100xi.ppd.gz b/ppd/hpcups/hp-laserjet_1100xi.ppd.gz
new file mode 100644
index 0000000..ccc4a59
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_1100xi.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_1150.ppd.gz b/ppd/hpcups/hp-laserjet_1150.ppd.gz
new file mode 100644
index 0000000..1d85235
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_1150.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_1160.ppd.gz b/ppd/hpcups/hp-laserjet_1160.ppd.gz
new file mode 100644
index 0000000..719f3b5
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_1160.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_1160_series.ppd.gz b/ppd/hpcups/hp-laserjet_1160_series.ppd.gz
new file mode 100644
index 0000000..0ed55b1
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_1160_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_1200-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_1200-pcl3.ppd.gz
new file mode 100644
index 0000000..2f60c12
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_1200-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_1200n.ppd.gz b/ppd/hpcups/hp-laserjet_1200n.ppd.gz
new file mode 100644
index 0000000..bdd04a9
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_1200n.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_1220-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_1220-pcl3.ppd.gz
new file mode 100644
index 0000000..24d8dc1
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_1220-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_1220se.ppd.gz b/ppd/hpcups/hp-laserjet_1220se.ppd.gz
new file mode 100644
index 0000000..3d9e5de
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_1220se.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_1300-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_1300-pcl3.ppd.gz
new file mode 100644
index 0000000..f16b59b
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_1300-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_1300n-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_1300n-pcl3.ppd.gz
new file mode 100644
index 0000000..b019d67
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_1300n-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_1300xi-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_1300xi-pcl3.ppd.gz
new file mode 100644
index 0000000..98e857f
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_1300xi-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_1320.ppd.gz b/ppd/hpcups/hp-laserjet_1320.ppd.gz
new file mode 100644
index 0000000..009bd7c
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_1320.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_1320_series-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_1320_series-pcl3.ppd.gz
new file mode 100644
index 0000000..da3d603
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_1320_series-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_1320n.ppd.gz b/ppd/hpcups/hp-laserjet_1320n.ppd.gz
new file mode 100644
index 0000000..0dd6bfd
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_1320n.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_1320nw.ppd.gz b/ppd/hpcups/hp-laserjet_1320nw.ppd.gz
new file mode 100644
index 0000000..f54cad6
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_1320nw.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_1320tn.ppd.gz b/ppd/hpcups/hp-laserjet_1320tn.ppd.gz
new file mode 100644
index 0000000..94570b2
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_1320tn.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_2100.ppd.gz b/ppd/hpcups/hp-laserjet_2100.ppd.gz
new file mode 100644
index 0000000..6d41ed5
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_2100.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_2100_series-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_2100_series-pcl3.ppd.gz
new file mode 100644
index 0000000..be1d177
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_2100_series-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_2200-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_2200-pcl3.ppd.gz
new file mode 100644
index 0000000..68b1377
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_2200-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_2200_series.ppd.gz b/ppd/hpcups/hp-laserjet_2200_series.ppd.gz
new file mode 100644
index 0000000..c16de9d
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_2200_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_2300-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_2300-pcl3.ppd.gz
new file mode 100644
index 0000000..2ec12bb
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_2300-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_2300_series.ppd.gz b/ppd/hpcups/hp-laserjet_2300_series.ppd.gz
new file mode 100644
index 0000000..8bb0c73
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_2300_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_2410-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_2410-pcl3.ppd.gz
new file mode 100644
index 0000000..85ed1ed
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_2410-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_2420-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_2420-pcl3.ppd.gz
new file mode 100644
index 0000000..76f2241
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_2420-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_2430-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_2430-pcl3.ppd.gz
new file mode 100644
index 0000000..1ff9318
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_2430-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_3015-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_3015-pcl3.ppd.gz
new file mode 100644
index 0000000..bd09eb2
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_3015-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_3020-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_3020-pcl3.ppd.gz
new file mode 100644
index 0000000..faa07a8
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_3020-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_3030-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_3030-pcl3.ppd.gz
new file mode 100644
index 0000000..574e63c
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_3030-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_3050-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_3050-pcl3.ppd.gz
new file mode 100644
index 0000000..75044b2
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_3050-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_3052-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_3052-pcl3.ppd.gz
new file mode 100644
index 0000000..1df4502
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_3052-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_3055.ppd.gz b/ppd/hpcups/hp-laserjet_3055.ppd.gz
new file mode 100644
index 0000000..f11b917
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_3055.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_3100.ppd.gz b/ppd/hpcups/hp-laserjet_3100.ppd.gz
new file mode 100644
index 0000000..befce62
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_3100.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_3150.ppd.gz b/ppd/hpcups/hp-laserjet_3150.ppd.gz
new file mode 100644
index 0000000..f50efba
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_3150.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_3200.ppd.gz b/ppd/hpcups/hp-laserjet_3200.ppd.gz
new file mode 100644
index 0000000..b668eeb
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_3200.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_3200m-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_3200m-pcl3.ppd.gz
new file mode 100644
index 0000000..339ff23
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_3200m-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_3200se.ppd.gz b/ppd/hpcups/hp-laserjet_3200se.ppd.gz
new file mode 100644
index 0000000..32c3ac9
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_3200se.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_3300_3310_3320-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_3300_3310_3320-pcl3.ppd.gz
new file mode 100644
index 0000000..6b9ae43
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_3300_3310_3320-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_3330.ppd.gz b/ppd/hpcups/hp-laserjet_3330.ppd.gz
new file mode 100644
index 0000000..e8eea11
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_3330.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_3380-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_3380-pcl3.ppd.gz
new file mode 100644
index 0000000..8addb1c
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_3380-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_3390-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_3390-pcl3.ppd.gz
new file mode 100644
index 0000000..b3a2738
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_3390-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_3392.ppd.gz b/ppd/hpcups/hp-laserjet_3392.ppd.gz
new file mode 100644
index 0000000..c9bdd98
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_3392.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_4000_series-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_4000_series-pcl3.ppd.gz
new file mode 100644
index 0000000..8cead4c
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_4000_series-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_4050_series-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_4050_series-pcl3.ppd.gz
new file mode 100644
index 0000000..0a64f20
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_4050_series-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_4100_mfp-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_4100_mfp-pcl3.ppd.gz
new file mode 100644
index 0000000..968dac5
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_4100_mfp-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_4100_series-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_4100_series-pcl3.ppd.gz
new file mode 100644
index 0000000..c9b779f
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_4100_series-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_4150_series.ppd.gz b/ppd/hpcups/hp-laserjet_4150_series.ppd.gz
new file mode 100644
index 0000000..80836d6
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_4150_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_4200-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_4200-pcl3.ppd.gz
new file mode 100644
index 0000000..11bbd61
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_4200-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_4240-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_4240-pcl3.ppd.gz
new file mode 100644
index 0000000..990f16f
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_4240-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_4250-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_4250-pcl3.ppd.gz
new file mode 100644
index 0000000..a5eac50
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_4250-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_4300-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_4300-pcl3.ppd.gz
new file mode 100644
index 0000000..c81feba
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_4300-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_4345_mfp-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_4345_mfp-pcl3.ppd.gz
new file mode 100644
index 0000000..da6aeae
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_4345_mfp-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_4350-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_4350-pcl3.ppd.gz
new file mode 100644
index 0000000..9692f45
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_4350-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_4_plus-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_4_plus-pcl3.ppd.gz
new file mode 100644
index 0000000..5b161f7
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_4_plus-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_4l.ppd.gz b/ppd/hpcups/hp-laserjet_4l.ppd.gz
new file mode 100644
index 0000000..46d6a93
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_4l.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_4ml.ppd.gz b/ppd/hpcups/hp-laserjet_4ml.ppd.gz
new file mode 100644
index 0000000..ad254b3
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_4ml.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_4mp-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_4mp-pcl3.ppd.gz
new file mode 100644
index 0000000..0d28a51
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_4mp-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_4si-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_4si-pcl3.ppd.gz
new file mode 100644
index 0000000..494e2bb
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_4si-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_4v-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_4v-pcl3.ppd.gz
new file mode 100644
index 0000000..9063947
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_4v-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_5000.ppd.gz b/ppd/hpcups/hp-laserjet_5000.ppd.gz
new file mode 100644
index 0000000..981848e
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_5000.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_5000_series-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_5000_series-pcl3.ppd.gz
new file mode 100644
index 0000000..30e022b
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_5000_series-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_5100_series-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_5100_series-pcl3.ppd.gz
new file mode 100644
index 0000000..0202201
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_5100_series-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_5200-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_5200-pcl3.ppd.gz
new file mode 100644
index 0000000..b2e1970
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_5200-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_5200l-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_5200l-pcl3.ppd.gz
new file mode 100644
index 0000000..f23db4c
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_5200l-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_5200lx.ppd.gz b/ppd/hpcups/hp-laserjet_5200lx.ppd.gz
new file mode 100644
index 0000000..fa3e0e3
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_5200lx.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_5l.ppd.gz b/ppd/hpcups/hp-laserjet_5l.ppd.gz
new file mode 100644
index 0000000..161ef7f
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_5l.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_5mp-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_5mp-pcl3.ppd.gz
new file mode 100644
index 0000000..957b65d
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_5mp-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_5p.ppd.gz b/ppd/hpcups/hp-laserjet_5p.ppd.gz
new file mode 100644
index 0000000..25636ba
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_5p.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_5si-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_5si-pcl3.ppd.gz
new file mode 100644
index 0000000..495db97
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_5si-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_5si_mopier-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_5si_mopier-pcl3.ppd.gz
new file mode 100644
index 0000000..e449630
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_5si_mopier-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_6l.ppd.gz b/ppd/hpcups/hp-laserjet_6l.ppd.gz
new file mode 100644
index 0000000..36a5019
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_6l.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_6mp-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_6mp-pcl3.ppd.gz
new file mode 100644
index 0000000..fafb609
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_6mp-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_6p.ppd.gz b/ppd/hpcups/hp-laserjet_6p.ppd.gz
new file mode 100644
index 0000000..d522797
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_6p.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_8000.ppd.gz b/ppd/hpcups/hp-laserjet_8000.ppd.gz
new file mode 100644
index 0000000..878e62a
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_8000.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_8000_series-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_8000_series-pcl3.ppd.gz
new file mode 100644
index 0000000..80cbbe9
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_8000_series-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_8100_mfp.ppd.gz b/ppd/hpcups/hp-laserjet_8100_mfp.ppd.gz
new file mode 100644
index 0000000..635fb95
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_8100_mfp.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_8100_series-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_8100_series-pcl3.ppd.gz
new file mode 100644
index 0000000..6825c2d
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_8100_series-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_8150_mfp.ppd.gz b/ppd/hpcups/hp-laserjet_8150_mfp.ppd.gz
new file mode 100644
index 0000000..72fe477
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_8150_mfp.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_8150_series-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_8150_series-pcl3.ppd.gz
new file mode 100644
index 0000000..a3818c2
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_8150_series-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_9000_mfp-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_9000_mfp-pcl3.ppd.gz
new file mode 100644
index 0000000..4dd5e6e
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_9000_mfp-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_9000_series-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_9000_series-pcl3.ppd.gz
new file mode 100644
index 0000000..00604b0
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_9000_series-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_9040-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_9040-pcl3.ppd.gz
new file mode 100644
index 0000000..7ec213f
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_9040-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_9040_mfp-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_9040_mfp-pcl3.ppd.gz
new file mode 100644
index 0000000..07b86c2
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_9040_mfp-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_9050-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_9050-pcl3.ppd.gz
new file mode 100644
index 0000000..3feb6c2
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_9050-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_9050_mfp-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_9050_mfp-pcl3.ppd.gz
new file mode 100644
index 0000000..1239716
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_9050_mfp-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_9055mfp-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_9055mfp-pcl3.ppd.gz
new file mode 100644
index 0000000..1b11e76
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_9055mfp-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_9065mfp-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_9065mfp-pcl3.ppd.gz
new file mode 100644
index 0000000..293049d
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_9065mfp-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_cm1411fn-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_cm1411fn-pcl3.ppd.gz
new file mode 100644
index 0000000..77690e7
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_cm1411fn-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_cm1412fn-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_cm1412fn-pcl3.ppd.gz
new file mode 100644
index 0000000..38ea6fc
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_cm1412fn-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_cm1413fn-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_cm1413fn-pcl3.ppd.gz
new file mode 100644
index 0000000..38e1d3a
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_cm1413fn-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_cm1415fn-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_cm1415fn-pcl3.ppd.gz
new file mode 100644
index 0000000..0383783
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_cm1415fn-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_cm1415fnw-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_cm1415fnw-pcl3.ppd.gz
new file mode 100644
index 0000000..eb974ee
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_cm1415fnw-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_cm1416fnw-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_cm1416fnw-pcl3.ppd.gz
new file mode 100644
index 0000000..9e8ce7a
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_cm1416fnw-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_cm1417fnw-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_cm1417fnw-pcl3.ppd.gz
new file mode 100644
index 0000000..6509491
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_cm1417fnw-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_cm1418fnw-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_cm1418fnw-pcl3.ppd.gz
new file mode 100644
index 0000000..71dfe74
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_cm1418fnw-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_cp1025.ppd.gz b/ppd/hpcups/hp-laserjet_cp1025.ppd.gz
new file mode 100644
index 0000000..1aaacaa
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_cp1025.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_cp1025nw.ppd.gz b/ppd/hpcups/hp-laserjet_cp1025nw.ppd.gz
new file mode 100644
index 0000000..0d81c00
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_cp1025nw.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_cp_1025.ppd.gz b/ppd/hpcups/hp-laserjet_cp_1025.ppd.gz
new file mode 100644
index 0000000..003fab7
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_cp_1025.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_cp_1025nw.ppd.gz b/ppd/hpcups/hp-laserjet_cp_1025nw.ppd.gz
new file mode 100644
index 0000000..645164e
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_cp_1025nw.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_m1005.ppd.gz b/ppd/hpcups/hp-laserjet_m1005.ppd.gz
new file mode 100644
index 0000000..3c7f123
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_m1005.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_m1120_mfp.ppd.gz b/ppd/hpcups/hp-laserjet_m1120_mfp.ppd.gz
new file mode 100644
index 0000000..452560e
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_m1120_mfp.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_m1120n_mfp.ppd.gz b/ppd/hpcups/hp-laserjet_m1120n_mfp.ppd.gz
new file mode 100644
index 0000000..ce9ad95
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_m1120n_mfp.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_m1319f_mfp.ppd.gz b/ppd/hpcups/hp-laserjet_m1319f_mfp.ppd.gz
new file mode 100644
index 0000000..8a523b5
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_m1319f_mfp.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_m1522nf_mfp-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_m1522nf_mfp-pcl3.ppd.gz
new file mode 100644
index 0000000..54e72b1
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_m1522nf_mfp-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_m1536dnf_mfp-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_m1536dnf_mfp-pcl3.ppd.gz
new file mode 100644
index 0000000..37f9c31
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_m1536dnf_mfp-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_m1537dnf_mfp-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_m1537dnf_mfp-pcl3.ppd.gz
new file mode 100644
index 0000000..e51fba9
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_m1537dnf_mfp-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_m1538dnf_mfp-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_m1538dnf_mfp-pcl3.ppd.gz
new file mode 100644
index 0000000..d801369
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_m1538dnf_mfp-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_m1539dnf_mfp-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_m1539dnf_mfp-pcl3.ppd.gz
new file mode 100644
index 0000000..908b3e4
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_m1539dnf_mfp-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_m2727_mfp-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_m2727_mfp-pcl3.ppd.gz
new file mode 100644
index 0000000..9d87291
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_m2727_mfp-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_m3027_mfp-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_m3027_mfp-pcl3.ppd.gz
new file mode 100644
index 0000000..3b7b9c6
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_m3027_mfp-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_m3035_mfp-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_m3035_mfp-pcl3.ppd.gz
new file mode 100644
index 0000000..66c60fc
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_m3035_mfp-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_m4345_mfp-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_m4345_mfp-pcl3.ppd.gz
new file mode 100644
index 0000000..bc4e5ac
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_m4345_mfp-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_m4349_mfp-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_m4349_mfp-pcl3.ppd.gz
new file mode 100644
index 0000000..91c427b
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_m4349_mfp-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_m5025_mfp-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_m5025_mfp-pcl3.ppd.gz
new file mode 100644
index 0000000..f1dfadb
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_m5025_mfp-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_m5035_mfp-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_m5035_mfp-pcl3.ppd.gz
new file mode 100644
index 0000000..88e6710
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_m5035_mfp-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_m5039_mfp-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_m5039_mfp-pcl3.ppd.gz
new file mode 100644
index 0000000..8a6dafb
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_m5039_mfp-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_m9040_mfp-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_m9040_mfp-pcl3.ppd.gz
new file mode 100644
index 0000000..0f7f4fd
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_m9040_mfp-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_m9050_mfp-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_m9050_mfp-pcl3.ppd.gz
new file mode 100644
index 0000000..e19b42a
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_m9050_mfp-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_m9059_mfp-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_m9059_mfp-pcl3.ppd.gz
new file mode 100644
index 0000000..f47efcf
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_m9059_mfp-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_p1005.ppd.gz b/ppd/hpcups/hp-laserjet_p1005.ppd.gz
new file mode 100644
index 0000000..dece848
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_p1005.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_p1006.ppd.gz b/ppd/hpcups/hp-laserjet_p1006.ppd.gz
new file mode 100644
index 0000000..f7afa8b
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_p1006.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_p1007.ppd.gz b/ppd/hpcups/hp-laserjet_p1007.ppd.gz
new file mode 100644
index 0000000..5471d12
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_p1007.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_p1008.ppd.gz b/ppd/hpcups/hp-laserjet_p1008.ppd.gz
new file mode 100644
index 0000000..43e6f78
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_p1008.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_p1009.ppd.gz b/ppd/hpcups/hp-laserjet_p1009.ppd.gz
new file mode 100644
index 0000000..b422fe7
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_p1009.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_p1505.ppd.gz b/ppd/hpcups/hp-laserjet_p1505.ppd.gz
new file mode 100644
index 0000000..deaf69d
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_p1505.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_p1505n-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_p1505n-pcl3.ppd.gz
new file mode 100644
index 0000000..2eab205
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_p1505n-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_p1505n-zxs.ppd.gz b/ppd/hpcups/hp-laserjet_p1505n-zxs.ppd.gz
new file mode 100644
index 0000000..5dded88
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_p1505n-zxs.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_p2014-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_p2014-pcl3.ppd.gz
new file mode 100644
index 0000000..4d91955
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_p2014-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_p2014-zxs.ppd.gz b/ppd/hpcups/hp-laserjet_p2014-zxs.ppd.gz
new file mode 100644
index 0000000..519f5c2
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_p2014-zxs.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_p2014n-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_p2014n-pcl3.ppd.gz
new file mode 100644
index 0000000..4aad428
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_p2014n-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_p2014n-zxs.ppd.gz b/ppd/hpcups/hp-laserjet_p2014n-zxs.ppd.gz
new file mode 100644
index 0000000..aef281b
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_p2014n-zxs.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_p2015_series-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_p2015_series-pcl3.ppd.gz
new file mode 100644
index 0000000..1b37f39
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_p2015_series-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_p2015d_series.ppd.gz b/ppd/hpcups/hp-laserjet_p2015d_series.ppd.gz
new file mode 100644
index 0000000..12e1fa2
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_p2015d_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_p2015dn_series.ppd.gz b/ppd/hpcups/hp-laserjet_p2015dn_series.ppd.gz
new file mode 100644
index 0000000..89ec09c
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_p2015dn_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_p2015n_series.ppd.gz b/ppd/hpcups/hp-laserjet_p2015n_series.ppd.gz
new file mode 100644
index 0000000..8c12597
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_p2015n_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_p2015x_series.ppd.gz b/ppd/hpcups/hp-laserjet_p2015x_series.ppd.gz
new file mode 100644
index 0000000..47dbc74
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_p2015x_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_p2035-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_p2035-pcl3.ppd.gz
new file mode 100644
index 0000000..284892d
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_p2035-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_p2035-zjs.ppd.gz b/ppd/hpcups/hp-laserjet_p2035-zjs.ppd.gz
new file mode 100644
index 0000000..fed9983
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_p2035-zjs.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_p2035n-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_p2035n-pcl3.ppd.gz
new file mode 100644
index 0000000..fd8b3e7
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_p2035n-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_p2035n-zjs.ppd.gz b/ppd/hpcups/hp-laserjet_p2035n-zjs.ppd.gz
new file mode 100644
index 0000000..638bb20
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_p2035n-zjs.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_p2055-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_p2055-pcl3.ppd.gz
new file mode 100644
index 0000000..cb15094
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_p2055-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_p2055d-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_p2055d-pcl3.ppd.gz
new file mode 100644
index 0000000..35e9262
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_p2055d-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_p2055dn-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_p2055dn-pcl3.ppd.gz
new file mode 100644
index 0000000..9796fbf
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_p2055dn-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_p2055x-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_p2055x-pcl3.ppd.gz
new file mode 100644
index 0000000..77c9c21
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_p2055x-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_p3004-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_p3004-pcl3.ppd.gz
new file mode 100644
index 0000000..eac752c
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_p3004-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_p3005-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_p3005-pcl3.ppd.gz
new file mode 100644
index 0000000..1982092
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_p3005-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_p3010_series-pcl3.ppd.gz b/ppd/hpcups/hp-laserjet_p3010_series-pcl3.ppd.gz
new file mode 100644
index 0000000..6405660
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_p3010_series-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_p4014.ppd.gz b/ppd/hpcups/hp-laserjet_p4014.ppd.gz
new file mode 100644
index 0000000..d062fc8
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_p4014.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_p4014dn.ppd.gz b/ppd/hpcups/hp-laserjet_p4014dn.ppd.gz
new file mode 100644
index 0000000..231fc5c
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_p4014dn.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_p4014n.ppd.gz b/ppd/hpcups/hp-laserjet_p4014n.ppd.gz
new file mode 100644
index 0000000..a7debec
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_p4014n.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_p4015.ppd.gz b/ppd/hpcups/hp-laserjet_p4015.ppd.gz
new file mode 100644
index 0000000..f6830aa
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_p4015.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_p4015dn.ppd.gz b/ppd/hpcups/hp-laserjet_p4015dn.ppd.gz
new file mode 100644
index 0000000..a7c2851
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_p4015dn.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_p4015n.ppd.gz b/ppd/hpcups/hp-laserjet_p4015n.ppd.gz
new file mode 100644
index 0000000..b1e5a92
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_p4015n.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_p4015tn.ppd.gz b/ppd/hpcups/hp-laserjet_p4015tn.ppd.gz
new file mode 100644
index 0000000..f894216
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_p4015tn.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_p4015x.ppd.gz b/ppd/hpcups/hp-laserjet_p4015x.ppd.gz
new file mode 100644
index 0000000..0f53dca
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_p4015x.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_p4515.ppd.gz b/ppd/hpcups/hp-laserjet_p4515.ppd.gz
new file mode 100644
index 0000000..d0b3942
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_p4515.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_p4515n.ppd.gz b/ppd/hpcups/hp-laserjet_p4515n.ppd.gz
new file mode 100644
index 0000000..c49ea15
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_p4515n.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_p4515tn.ppd.gz b/ppd/hpcups/hp-laserjet_p4515tn.ppd.gz
new file mode 100644
index 0000000..8293f5b
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_p4515tn.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_p4515x.ppd.gz b/ppd/hpcups/hp-laserjet_p4515x.ppd.gz
new file mode 100644
index 0000000..5c815c2
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_p4515x.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_p4515xm.ppd.gz b/ppd/hpcups/hp-laserjet_p4515xm.ppd.gz
new file mode 100644
index 0000000..ae69b21
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_p4515xm.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_professional_m1132_mfp.ppd.gz b/ppd/hpcups/hp-laserjet_professional_m1132_mfp.ppd.gz
new file mode 100644
index 0000000..730e6ce
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_professional_m1132_mfp.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_professional_m1136_mfp.ppd.gz b/ppd/hpcups/hp-laserjet_professional_m1136_mfp.ppd.gz
new file mode 100644
index 0000000..c30ded9
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_professional_m1136_mfp.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_professional_m1212nf_mfp.ppd.gz b/ppd/hpcups/hp-laserjet_professional_m1212nf_mfp.ppd.gz
new file mode 100644
index 0000000..314697c
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_professional_m1212nf_mfp.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_professional_m1213nf_mfp.ppd.gz b/ppd/hpcups/hp-laserjet_professional_m1213nf_mfp.ppd.gz
new file mode 100644
index 0000000..652713e
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_professional_m1213nf_mfp.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_professional_m1214nfh_mfp.ppd.gz b/ppd/hpcups/hp-laserjet_professional_m1214nfh_mfp.ppd.gz
new file mode 100644
index 0000000..9df76ee
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_professional_m1214nfh_mfp.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_professional_m1216nfh_mfp.ppd.gz b/ppd/hpcups/hp-laserjet_professional_m1216nfh_mfp.ppd.gz
new file mode 100644
index 0000000..0e49f8c
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_professional_m1216nfh_mfp.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_professional_m1217nfw_mfp.ppd.gz b/ppd/hpcups/hp-laserjet_professional_m1217nfw_mfp.ppd.gz
new file mode 100644
index 0000000..98a6791
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_professional_m1217nfw_mfp.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_professional_m1219nf_mfp.ppd.gz b/ppd/hpcups/hp-laserjet_professional_m1219nf_mfp.ppd.gz
new file mode 100644
index 0000000..56d06ac
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_professional_m1219nf_mfp.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_professional_p1102.ppd.gz b/ppd/hpcups/hp-laserjet_professional_p1102.ppd.gz
new file mode 100644
index 0000000..f7dc710
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_professional_p1102.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_professional_p1102w.ppd.gz b/ppd/hpcups/hp-laserjet_professional_p1102w.ppd.gz
new file mode 100644
index 0000000..99c72af
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_professional_p1102w.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_professional_p1106.ppd.gz b/ppd/hpcups/hp-laserjet_professional_p1106.ppd.gz
new file mode 100644
index 0000000..0b5fde8
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_professional_p1106.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_professional_p1108.ppd.gz b/ppd/hpcups/hp-laserjet_professional_p1108.ppd.gz
new file mode 100644
index 0000000..b231ada
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_professional_p1108.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_professional_p1566.ppd.gz b/ppd/hpcups/hp-laserjet_professional_p1566.ppd.gz
new file mode 100644
index 0000000..cc1c1d9
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_professional_p1566.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_professional_p1606dn.ppd.gz b/ppd/hpcups/hp-laserjet_professional_p1606dn.ppd.gz
new file mode 100644
index 0000000..93abfff
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_professional_p1606dn.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-laserjet_professional_p_1102w.ppd.gz b/ppd/hpcups/hp-laserjet_professional_p_1102w.ppd.gz
new file mode 100644
index 0000000..b5f4c0d
--- /dev/null
+++ b/ppd/hpcups/hp-laserjet_professional_p_1102w.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-mopier_240-pcl3.ppd.gz b/ppd/hpcups/hp-mopier_240-pcl3.ppd.gz
new file mode 100644
index 0000000..66c913b
--- /dev/null
+++ b/ppd/hpcups/hp-mopier_240-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-mopier_320-pcl3.ppd.gz b/ppd/hpcups/hp-mopier_320-pcl3.ppd.gz
new file mode 100644
index 0000000..e0e8c9a
--- /dev/null
+++ b/ppd/hpcups/hp-mopier_320-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet.ppd.gz b/ppd/hpcups/hp-officejet.ppd.gz
new file mode 100644
index 0000000..485a219
--- /dev/null
+++ b/ppd/hpcups/hp-officejet.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_100_mobile_l411.ppd.gz b/ppd/hpcups/hp-officejet_100_mobile_l411.ppd.gz
new file mode 100644
index 0000000..e502a3b
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_100_mobile_l411.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_4000_k210.ppd.gz b/ppd/hpcups/hp-officejet_4000_k210.ppd.gz
new file mode 100644
index 0000000..77e1973
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_4000_k210.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_4100_series.ppd.gz b/ppd/hpcups/hp-officejet_4100_series.ppd.gz
new file mode 100644
index 0000000..f60d825
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_4100_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_4105.ppd.gz b/ppd/hpcups/hp-officejet_4105.ppd.gz
new file mode 100644
index 0000000..469a2a5
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_4105.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_4115_series.ppd.gz b/ppd/hpcups/hp-officejet_4115_series.ppd.gz
new file mode 100644
index 0000000..647380b
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_4115_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_4200_series.ppd.gz b/ppd/hpcups/hp-officejet_4200_series.ppd.gz
new file mode 100644
index 0000000..96290cc
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_4200_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_4255.ppd.gz b/ppd/hpcups/hp-officejet_4255.ppd.gz
new file mode 100644
index 0000000..b3f783e
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_4255.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_4300_series.ppd.gz b/ppd/hpcups/hp-officejet_4300_series.ppd.gz
new file mode 100644
index 0000000..b20aa91
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_4300_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_4400_k410.ppd.gz b/ppd/hpcups/hp-officejet_4400_k410.ppd.gz
new file mode 100644
index 0000000..55afd3d
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_4400_k410.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_4500_g510a-f.ppd.gz b/ppd/hpcups/hp-officejet_4500_g510a-f.ppd.gz
new file mode 100644
index 0000000..bc4e1f2
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_4500_g510a-f.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_4500_g510g-m.ppd.gz b/ppd/hpcups/hp-officejet_4500_g510g-m.ppd.gz
new file mode 100644
index 0000000..30c7004
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_4500_g510g-m.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_4500_g510n-z.ppd.gz b/ppd/hpcups/hp-officejet_4500_g510n-z.ppd.gz
new file mode 100644
index 0000000..915e693
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_4500_g510n-z.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_4500_k710.ppd.gz b/ppd/hpcups/hp-officejet_4500_k710.ppd.gz
new file mode 100644
index 0000000..e4b8bf3
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_4500_k710.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_5100_series.ppd.gz b/ppd/hpcups/hp-officejet_5100_series.ppd.gz
new file mode 100644
index 0000000..5c50805
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_5100_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_5105.ppd.gz b/ppd/hpcups/hp-officejet_5105.ppd.gz
new file mode 100644
index 0000000..989f1a5
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_5105.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_5110.ppd.gz b/ppd/hpcups/hp-officejet_5110.ppd.gz
new file mode 100644
index 0000000..05129d6
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_5110.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_5110v.ppd.gz b/ppd/hpcups/hp-officejet_5110v.ppd.gz
new file mode 100644
index 0000000..e9639c6
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_5110v.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_5500_series.ppd.gz b/ppd/hpcups/hp-officejet_5500_series.ppd.gz
new file mode 100644
index 0000000..bb0f3ff
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_5500_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_5600_series.ppd.gz b/ppd/hpcups/hp-officejet_5600_series.ppd.gz
new file mode 100644
index 0000000..6b7c3f5
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_5600_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_6000_e609a.ppd.gz b/ppd/hpcups/hp-officejet_6000_e609a.ppd.gz
new file mode 100644
index 0000000..ebd2152
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_6000_e609a.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_6000_e609n.ppd.gz b/ppd/hpcups/hp-officejet_6000_e609n.ppd.gz
new file mode 100644
index 0000000..b24244b
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_6000_e609n.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_6100.ppd.gz b/ppd/hpcups/hp-officejet_6100.ppd.gz
new file mode 100644
index 0000000..dfc2b6c
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_6100.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_6100_series.ppd.gz b/ppd/hpcups/hp-officejet_6100_series.ppd.gz
new file mode 100644
index 0000000..de8410f
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_6100_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_6150_series.ppd.gz b/ppd/hpcups/hp-officejet_6150_series.ppd.gz
new file mode 100644
index 0000000..437d527
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_6150_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_6200_series.ppd.gz b/ppd/hpcups/hp-officejet_6200_series.ppd.gz
new file mode 100644
index 0000000..cbb905b
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_6200_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_6300_series.ppd.gz b/ppd/hpcups/hp-officejet_6300_series.ppd.gz
new file mode 100644
index 0000000..a2fe15c
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_6300_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_6500_e709a.ppd.gz b/ppd/hpcups/hp-officejet_6500_e709a.ppd.gz
new file mode 100644
index 0000000..adc4ddc
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_6500_e709a.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_6500_e709n.ppd.gz b/ppd/hpcups/hp-officejet_6500_e709n.ppd.gz
new file mode 100644
index 0000000..51a336e
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_6500_e709n.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_6500_e710a-f.ppd.gz b/ppd/hpcups/hp-officejet_6500_e710a-f.ppd.gz
new file mode 100644
index 0000000..08d08fc
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_6500_e710a-f.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_6500_e710n-z.ppd.gz b/ppd/hpcups/hp-officejet_6500_e710n-z.ppd.gz
new file mode 100644
index 0000000..c1bfff3
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_6500_e710n-z.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_6600.ppd.gz b/ppd/hpcups/hp-officejet_6600.ppd.gz
new file mode 100644
index 0000000..4ba628e
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_6600.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_6700.ppd.gz b/ppd/hpcups/hp-officejet_6700.ppd.gz
new file mode 100644
index 0000000..945b41a
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_6700.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_7000_e809a.ppd.gz b/ppd/hpcups/hp-officejet_7000_e809a.ppd.gz
new file mode 100644
index 0000000..c3cd9d7
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_7000_e809a.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_7000_e809a_series.ppd.gz b/ppd/hpcups/hp-officejet_7000_e809a_series.ppd.gz
new file mode 100644
index 0000000..287a131
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_7000_e809a_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_7100_series.ppd.gz b/ppd/hpcups/hp-officejet_7100_series.ppd.gz
new file mode 100644
index 0000000..05161ea
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_7100_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_7200_series.ppd.gz b/ppd/hpcups/hp-officejet_7200_series.ppd.gz
new file mode 100644
index 0000000..63473e4
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_7200_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_7300_series.ppd.gz b/ppd/hpcups/hp-officejet_7300_series.ppd.gz
new file mode 100644
index 0000000..638da9a
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_7300_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_7400_series.ppd.gz b/ppd/hpcups/hp-officejet_7400_series.ppd.gz
new file mode 100644
index 0000000..b67180d
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_7400_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_7500_e910.ppd.gz b/ppd/hpcups/hp-officejet_7500_e910.ppd.gz
new file mode 100644
index 0000000..302edc0
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_7500_e910.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_9100_series-pcl3.ppd.gz b/ppd/hpcups/hp-officejet_9100_series-pcl3.ppd.gz
new file mode 100644
index 0000000..01a8048
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_9100_series-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_d_series.ppd.gz b/ppd/hpcups/hp-officejet_d_series.ppd.gz
new file mode 100644
index 0000000..85b43f3
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_d_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_g55.ppd.gz b/ppd/hpcups/hp-officejet_g55.ppd.gz
new file mode 100644
index 0000000..687b32c
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_g55.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_g55xi.ppd.gz b/ppd/hpcups/hp-officejet_g55xi.ppd.gz
new file mode 100644
index 0000000..27edfca
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_g55xi.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_g85.ppd.gz b/ppd/hpcups/hp-officejet_g85.ppd.gz
new file mode 100644
index 0000000..0b2432c
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_g85.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_g85xi.ppd.gz b/ppd/hpcups/hp-officejet_g85xi.ppd.gz
new file mode 100644
index 0000000..8818014
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_g85xi.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_g95.ppd.gz b/ppd/hpcups/hp-officejet_g95.ppd.gz
new file mode 100644
index 0000000..2ff7500
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_g95.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_h470.ppd.gz b/ppd/hpcups/hp-officejet_h470.ppd.gz
new file mode 100644
index 0000000..05e1c37
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_h470.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_j3500_series.ppd.gz b/ppd/hpcups/hp-officejet_j3500_series.ppd.gz
new file mode 100644
index 0000000..203c8b9
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_j3500_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_j3600_series.ppd.gz b/ppd/hpcups/hp-officejet_j3600_series.ppd.gz
new file mode 100644
index 0000000..1b0952d
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_j3600_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_j4500_series.ppd.gz b/ppd/hpcups/hp-officejet_j4500_series.ppd.gz
new file mode 100644
index 0000000..edcc15d
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_j4500_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_j4660_series.ppd.gz b/ppd/hpcups/hp-officejet_j4660_series.ppd.gz
new file mode 100644
index 0000000..05069ad
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_j4660_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_j4680_series.ppd.gz b/ppd/hpcups/hp-officejet_j4680_series.ppd.gz
new file mode 100644
index 0000000..98b214e
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_j4680_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_j5500_series.ppd.gz b/ppd/hpcups/hp-officejet_j5500_series.ppd.gz
new file mode 100644
index 0000000..774855b
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_j5500_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_j5700_series.ppd.gz b/ppd/hpcups/hp-officejet_j5700_series.ppd.gz
new file mode 100644
index 0000000..7db4471
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_j5700_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_j6400_series.ppd.gz b/ppd/hpcups/hp-officejet_j6400_series.ppd.gz
new file mode 100644
index 0000000..cea12fa
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_j6400_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_k60.ppd.gz b/ppd/hpcups/hp-officejet_k60.ppd.gz
new file mode 100644
index 0000000..d285b03
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_k60.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_k60xi.ppd.gz b/ppd/hpcups/hp-officejet_k60xi.ppd.gz
new file mode 100644
index 0000000..8f938ec
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_k60xi.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_k7100.ppd.gz b/ppd/hpcups/hp-officejet_k7100.ppd.gz
new file mode 100644
index 0000000..41ec220
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_k7100.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_k80.ppd.gz b/ppd/hpcups/hp-officejet_k80.ppd.gz
new file mode 100644
index 0000000..bb1d6ba
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_k80.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_k80xi.ppd.gz b/ppd/hpcups/hp-officejet_k80xi.ppd.gz
new file mode 100644
index 0000000..c1e86b4
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_k80xi.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_lx.ppd.gz b/ppd/hpcups/hp-officejet_lx.ppd.gz
new file mode 100644
index 0000000..385466a
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_lx.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_pro_1150c.ppd.gz b/ppd/hpcups/hp-officejet_pro_1150c.ppd.gz
new file mode 100644
index 0000000..1b1e227
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_pro_1150c.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_pro_1170c_series.ppd.gz b/ppd/hpcups/hp-officejet_pro_1170c_series.ppd.gz
new file mode 100644
index 0000000..543ea34
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_pro_1170c_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_pro_8000_a809.ppd.gz b/ppd/hpcups/hp-officejet_pro_8000_a809.ppd.gz
new file mode 100644
index 0000000..7ab18e6
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_pro_8000_a809.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_pro_8100.ppd.gz b/ppd/hpcups/hp-officejet_pro_8100.ppd.gz
new file mode 100644
index 0000000..a53c58b
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_pro_8100.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_pro_8500_a909a.ppd.gz b/ppd/hpcups/hp-officejet_pro_8500_a909a.ppd.gz
new file mode 100644
index 0000000..18ad0ff
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_pro_8500_a909a.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_pro_8500_a909g.ppd.gz b/ppd/hpcups/hp-officejet_pro_8500_a909g.ppd.gz
new file mode 100644
index 0000000..d7fb05f
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_pro_8500_a909g.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_pro_8500_a909n.ppd.gz b/ppd/hpcups/hp-officejet_pro_8500_a909n.ppd.gz
new file mode 100644
index 0000000..7240402
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_pro_8500_a909n.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_pro_8500_a910.ppd.gz b/ppd/hpcups/hp-officejet_pro_8500_a910.ppd.gz
new file mode 100644
index 0000000..ff9c4e3
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_pro_8500_a910.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_pro_8600.ppd.gz b/ppd/hpcups/hp-officejet_pro_8600.ppd.gz
new file mode 100644
index 0000000..586863b
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_pro_8600.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_pro_k5300.ppd.gz b/ppd/hpcups/hp-officejet_pro_k5300.ppd.gz
new file mode 100644
index 0000000..9891790
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_pro_k5300.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_pro_k5400.ppd.gz b/ppd/hpcups/hp-officejet_pro_k5400.ppd.gz
new file mode 100644
index 0000000..008c85e
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_pro_k5400.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_pro_k550.ppd.gz b/ppd/hpcups/hp-officejet_pro_k550.ppd.gz
new file mode 100644
index 0000000..4cc1e6b
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_pro_k550.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_pro_k850.ppd.gz b/ppd/hpcups/hp-officejet_pro_k850.ppd.gz
new file mode 100644
index 0000000..4e7a442
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_pro_k850.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_pro_k8600.ppd.gz b/ppd/hpcups/hp-officejet_pro_k8600.ppd.gz
new file mode 100644
index 0000000..2b906bc
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_pro_k8600.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_pro_l7300.ppd.gz b/ppd/hpcups/hp-officejet_pro_l7300.ppd.gz
new file mode 100644
index 0000000..be03739
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_pro_l7300.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_pro_l7400.ppd.gz b/ppd/hpcups/hp-officejet_pro_l7400.ppd.gz
new file mode 100644
index 0000000..6495eb5
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_pro_l7400.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_pro_l7500.ppd.gz b/ppd/hpcups/hp-officejet_pro_l7500.ppd.gz
new file mode 100644
index 0000000..9a8c7f4
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_pro_l7500.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_pro_l7600.ppd.gz b/ppd/hpcups/hp-officejet_pro_l7600.ppd.gz
new file mode 100644
index 0000000..a1f71ce
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_pro_l7600.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_pro_l7700.ppd.gz b/ppd/hpcups/hp-officejet_pro_l7700.ppd.gz
new file mode 100644
index 0000000..0bf5c45
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_pro_l7700.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_r40.ppd.gz b/ppd/hpcups/hp-officejet_r40.ppd.gz
new file mode 100644
index 0000000..c9e2f8f
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_r40.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_r40xi.ppd.gz b/ppd/hpcups/hp-officejet_r40xi.ppd.gz
new file mode 100644
index 0000000..9fe33ac
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_r40xi.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_r45.ppd.gz b/ppd/hpcups/hp-officejet_r45.ppd.gz
new file mode 100644
index 0000000..990cb26
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_r45.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_r60.ppd.gz b/ppd/hpcups/hp-officejet_r60.ppd.gz
new file mode 100644
index 0000000..fd13e75
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_r60.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_r65.ppd.gz b/ppd/hpcups/hp-officejet_r65.ppd.gz
new file mode 100644
index 0000000..57de8ca
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_r65.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_r80.ppd.gz b/ppd/hpcups/hp-officejet_r80.ppd.gz
new file mode 100644
index 0000000..6ada7bf
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_r80.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_r80xi.ppd.gz b/ppd/hpcups/hp-officejet_r80xi.ppd.gz
new file mode 100644
index 0000000..335f408
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_r80xi.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_series_300.ppd.gz b/ppd/hpcups/hp-officejet_series_300.ppd.gz
new file mode 100644
index 0000000..64a2813
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_series_300.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_series_310.ppd.gz b/ppd/hpcups/hp-officejet_series_310.ppd.gz
new file mode 100644
index 0000000..3358651
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_series_310.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_series_320.ppd.gz b/ppd/hpcups/hp-officejet_series_320.ppd.gz
new file mode 100644
index 0000000..f064a85
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_series_320.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_series_330.ppd.gz b/ppd/hpcups/hp-officejet_series_330.ppd.gz
new file mode 100644
index 0000000..b17432f
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_series_330.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_series_350.ppd.gz b/ppd/hpcups/hp-officejet_series_350.ppd.gz
new file mode 100644
index 0000000..0fdff5e
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_series_350.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_series_520.ppd.gz b/ppd/hpcups/hp-officejet_series_520.ppd.gz
new file mode 100644
index 0000000..4468932
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_series_520.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_series_570.ppd.gz b/ppd/hpcups/hp-officejet_series_570.ppd.gz
new file mode 100644
index 0000000..c2ae337
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_series_570.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_series_580.ppd.gz b/ppd/hpcups/hp-officejet_series_580.ppd.gz
new file mode 100644
index 0000000..35e138e
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_series_580.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_series_590.ppd.gz b/ppd/hpcups/hp-officejet_series_590.ppd.gz
new file mode 100644
index 0000000..b8749b5
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_series_590.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_series_600.ppd.gz b/ppd/hpcups/hp-officejet_series_600.ppd.gz
new file mode 100644
index 0000000..19aacc5
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_series_600.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_series_610.ppd.gz b/ppd/hpcups/hp-officejet_series_610.ppd.gz
new file mode 100644
index 0000000..985bffc
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_series_610.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_series_630.ppd.gz b/ppd/hpcups/hp-officejet_series_630.ppd.gz
new file mode 100644
index 0000000..e42d22d
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_series_630.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_series_700.ppd.gz b/ppd/hpcups/hp-officejet_series_700.ppd.gz
new file mode 100644
index 0000000..bf2efbe
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_series_700.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_series_710.ppd.gz b/ppd/hpcups/hp-officejet_series_710.ppd.gz
new file mode 100644
index 0000000..53cc73f
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_series_710.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_series_720.ppd.gz b/ppd/hpcups/hp-officejet_series_720.ppd.gz
new file mode 100644
index 0000000..ebd1f13
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_series_720.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_series_725.ppd.gz b/ppd/hpcups/hp-officejet_series_725.ppd.gz
new file mode 100644
index 0000000..884abe1
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_series_725.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_t_series.ppd.gz b/ppd/hpcups/hp-officejet_t_series.ppd.gz
new file mode 100644
index 0000000..40b7999
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_t_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_v30.ppd.gz b/ppd/hpcups/hp-officejet_v30.ppd.gz
new file mode 100644
index 0000000..ff8867a
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_v30.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_v40.ppd.gz b/ppd/hpcups/hp-officejet_v40.ppd.gz
new file mode 100644
index 0000000..08f22b8
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_v40.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_v40xi.ppd.gz b/ppd/hpcups/hp-officejet_v40xi.ppd.gz
new file mode 100644
index 0000000..e6065b2
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_v40xi.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-officejet_v45.ppd.gz b/ppd/hpcups/hp-officejet_v45.ppd.gz
new file mode 100644
index 0000000..7734d87
--- /dev/null
+++ b/ppd/hpcups/hp-officejet_v45.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_100.ppd.gz b/ppd/hpcups/hp-photosmart_100.ppd.gz
new file mode 100644
index 0000000..6fe1a85
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_100.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_1115.ppd.gz b/ppd/hpcups/hp-photosmart_1115.ppd.gz
new file mode 100644
index 0000000..6f82bd3
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_1115.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_1215.ppd.gz b/ppd/hpcups/hp-photosmart_1215.ppd.gz
new file mode 100644
index 0000000..8db5943
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_1215.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_1218.ppd.gz b/ppd/hpcups/hp-photosmart_1218.ppd.gz
new file mode 100644
index 0000000..01d399a
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_1218.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_130.ppd.gz b/ppd/hpcups/hp-photosmart_130.ppd.gz
new file mode 100644
index 0000000..eee71c5
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_130.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_1315.ppd.gz b/ppd/hpcups/hp-photosmart_1315.ppd.gz
new file mode 100644
index 0000000..c09fdee
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_1315.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_140_series.ppd.gz b/ppd/hpcups/hp-photosmart_140_series.ppd.gz
new file mode 100644
index 0000000..5a2e51d
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_140_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_230.ppd.gz b/ppd/hpcups/hp-photosmart_230.ppd.gz
new file mode 100644
index 0000000..ed5ceb6
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_230.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_240_series.ppd.gz b/ppd/hpcups/hp-photosmart_240_series.ppd.gz
new file mode 100644
index 0000000..9ad0779
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_240_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_2570_series.ppd.gz b/ppd/hpcups/hp-photosmart_2570_series.ppd.gz
new file mode 100644
index 0000000..102d64e
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_2570_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_2600_series.ppd.gz b/ppd/hpcups/hp-photosmart_2600_series.ppd.gz
new file mode 100644
index 0000000..2d28ec8
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_2600_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_2700_series.ppd.gz b/ppd/hpcups/hp-photosmart_2700_series.ppd.gz
new file mode 100644
index 0000000..eea5f16
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_2700_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_3100_series.ppd.gz b/ppd/hpcups/hp-photosmart_3100_series.ppd.gz
new file mode 100644
index 0000000..e1b92e4
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_3100_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_3200_series.ppd.gz b/ppd/hpcups/hp-photosmart_3200_series.ppd.gz
new file mode 100644
index 0000000..4f490b1
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_3200_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_320_series.ppd.gz b/ppd/hpcups/hp-photosmart_320_series.ppd.gz
new file mode 100644
index 0000000..a5a07c1
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_320_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_3300_series.ppd.gz b/ppd/hpcups/hp-photosmart_3300_series.ppd.gz
new file mode 100644
index 0000000..9209323
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_3300_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_330_series.ppd.gz b/ppd/hpcups/hp-photosmart_330_series.ppd.gz
new file mode 100644
index 0000000..b018546
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_330_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_370_series.ppd.gz b/ppd/hpcups/hp-photosmart_370_series.ppd.gz
new file mode 100644
index 0000000..b98f3ad
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_370_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_380_series.ppd.gz b/ppd/hpcups/hp-photosmart_380_series.ppd.gz
new file mode 100644
index 0000000..e4e2fb3
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_380_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_420_series.ppd.gz b/ppd/hpcups/hp-photosmart_420_series.ppd.gz
new file mode 100644
index 0000000..25fcb85
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_420_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_470_series.ppd.gz b/ppd/hpcups/hp-photosmart_470_series.ppd.gz
new file mode 100644
index 0000000..dedde91
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_470_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_5510_series.ppd.gz b/ppd/hpcups/hp-photosmart_5510_series.ppd.gz
new file mode 100644
index 0000000..eae4bd8
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_5510_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_5510d_series.ppd.gz b/ppd/hpcups/hp-photosmart_5510d_series.ppd.gz
new file mode 100644
index 0000000..df69dcc
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_5510d_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_6510_series.ppd.gz b/ppd/hpcups/hp-photosmart_6510_series.ppd.gz
new file mode 100644
index 0000000..cb6e249
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_6510_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_7150.ppd.gz b/ppd/hpcups/hp-photosmart_7150.ppd.gz
new file mode 100644
index 0000000..6743082
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_7150.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_7200_series.ppd.gz b/ppd/hpcups/hp-photosmart_7200_series.ppd.gz
new file mode 100644
index 0000000..47fa42b
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_7200_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_7345.ppd.gz b/ppd/hpcups/hp-photosmart_7345.ppd.gz
new file mode 100644
index 0000000..c3b4463
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_7345.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_7350.ppd.gz b/ppd/hpcups/hp-photosmart_7350.ppd.gz
new file mode 100644
index 0000000..16a075e
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_7350.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_7400_series.ppd.gz b/ppd/hpcups/hp-photosmart_7400_series.ppd.gz
new file mode 100644
index 0000000..85dcd4d
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_7400_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_7510_series.ppd.gz b/ppd/hpcups/hp-photosmart_7510_series.ppd.gz
new file mode 100644
index 0000000..86ebc62
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_7510_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_7550.ppd.gz b/ppd/hpcups/hp-photosmart_7550.ppd.gz
new file mode 100644
index 0000000..46f4765
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_7550.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_7600_series.ppd.gz b/ppd/hpcups/hp-photosmart_7600_series.ppd.gz
new file mode 100644
index 0000000..6059b24
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_7600_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_7700_series.ppd.gz b/ppd/hpcups/hp-photosmart_7700_series.ppd.gz
new file mode 100644
index 0000000..37a5a00
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_7700_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_7800_series.ppd.gz b/ppd/hpcups/hp-photosmart_7800_series.ppd.gz
new file mode 100644
index 0000000..4a1a4ac
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_7800_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_7900_series.ppd.gz b/ppd/hpcups/hp-photosmart_7900_series.ppd.gz
new file mode 100644
index 0000000..27d20f3
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_7900_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_8000_series.ppd.gz b/ppd/hpcups/hp-photosmart_8000_series.ppd.gz
new file mode 100644
index 0000000..c464af7
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_8000_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_8100_series.ppd.gz b/ppd/hpcups/hp-photosmart_8100_series.ppd.gz
new file mode 100644
index 0000000..740d6d6
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_8100_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_8200_series.ppd.gz b/ppd/hpcups/hp-photosmart_8200_series.ppd.gz
new file mode 100644
index 0000000..776795e
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_8200_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_8400_series.ppd.gz b/ppd/hpcups/hp-photosmart_8400_series.ppd.gz
new file mode 100644
index 0000000..187e2d2
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_8400_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_8700_series.ppd.gz b/ppd/hpcups/hp-photosmart_8700_series.ppd.gz
new file mode 100644
index 0000000..6ef81a8
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_8700_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_a310_series.ppd.gz b/ppd/hpcups/hp-photosmart_a310_series.ppd.gz
new file mode 100644
index 0000000..8981de3
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_a310_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_a320_series.ppd.gz b/ppd/hpcups/hp-photosmart_a320_series.ppd.gz
new file mode 100644
index 0000000..c940c2b
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_a320_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_a430_series.ppd.gz b/ppd/hpcups/hp-photosmart_a430_series.ppd.gz
new file mode 100644
index 0000000..db0bf16
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_a430_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_a440_series.ppd.gz b/ppd/hpcups/hp-photosmart_a440_series.ppd.gz
new file mode 100644
index 0000000..efe0444
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_a440_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_a510_series.ppd.gz b/ppd/hpcups/hp-photosmart_a510_series.ppd.gz
new file mode 100644
index 0000000..6272e5f
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_a510_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_a520_series.ppd.gz b/ppd/hpcups/hp-photosmart_a520_series.ppd.gz
new file mode 100644
index 0000000..92e8125
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_a520_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_a530_series.ppd.gz b/ppd/hpcups/hp-photosmart_a530_series.ppd.gz
new file mode 100644
index 0000000..b72d89c
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_a530_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_a610_series.ppd.gz b/ppd/hpcups/hp-photosmart_a610_series.ppd.gz
new file mode 100644
index 0000000..35a26a0
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_a610_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_a620_series.ppd.gz b/ppd/hpcups/hp-photosmart_a620_series.ppd.gz
new file mode 100644
index 0000000..b3a5c86
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_a620_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_a630_series.ppd.gz b/ppd/hpcups/hp-photosmart_a630_series.ppd.gz
new file mode 100644
index 0000000..49d6026
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_a630_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_a640_series.ppd.gz b/ppd/hpcups/hp-photosmart_a640_series.ppd.gz
new file mode 100644
index 0000000..903ac6c
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_a640_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_a710_series.ppd.gz b/ppd/hpcups/hp-photosmart_a710_series.ppd.gz
new file mode 100644
index 0000000..d916f56
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_a710_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_a820_series.ppd.gz b/ppd/hpcups/hp-photosmart_a820_series.ppd.gz
new file mode 100644
index 0000000..50edf92
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_a820_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_b010_series.ppd.gz b/ppd/hpcups/hp-photosmart_b010_series.ppd.gz
new file mode 100644
index 0000000..1e64d68
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_b010_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_b109a-m.ppd.gz b/ppd/hpcups/hp-photosmart_b109a-m.ppd.gz
new file mode 100644
index 0000000..bf2a2ac
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_b109a-m.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_b109a_series.ppd.gz b/ppd/hpcups/hp-photosmart_b109a_series.ppd.gz
new file mode 100644
index 0000000..9efa85f
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_b109a_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_b110_series.ppd.gz b/ppd/hpcups/hp-photosmart_b110_series.ppd.gz
new file mode 100644
index 0000000..a24d31c
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_b110_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_b8500_series.ppd.gz b/ppd/hpcups/hp-photosmart_b8500_series.ppd.gz
new file mode 100644
index 0000000..d1a87f8
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_b8500_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_c309a_series.ppd.gz b/ppd/hpcups/hp-photosmart_c309a_series.ppd.gz
new file mode 100644
index 0000000..c6da61c
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_c309a_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_c3100_series.ppd.gz b/ppd/hpcups/hp-photosmart_c3100_series.ppd.gz
new file mode 100644
index 0000000..1c0f35b
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_c3100_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_c4100_series.ppd.gz b/ppd/hpcups/hp-photosmart_c4100_series.ppd.gz
new file mode 100644
index 0000000..a15148c
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_c4100_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_c4200_series.ppd.gz b/ppd/hpcups/hp-photosmart_c4200_series.ppd.gz
new file mode 100644
index 0000000..58418bf
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_c4200_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_c4340_series.ppd.gz b/ppd/hpcups/hp-photosmart_c4340_series.ppd.gz
new file mode 100644
index 0000000..d77b3c6
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_c4340_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_c4380_series.ppd.gz b/ppd/hpcups/hp-photosmart_c4380_series.ppd.gz
new file mode 100644
index 0000000..59cecda
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_c4380_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_c4400_series.ppd.gz b/ppd/hpcups/hp-photosmart_c4400_series.ppd.gz
new file mode 100644
index 0000000..5ae192c
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_c4400_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_c4500_series.ppd.gz b/ppd/hpcups/hp-photosmart_c4500_series.ppd.gz
new file mode 100644
index 0000000..0b1bd57
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_c4500_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_c4600_series.ppd.gz b/ppd/hpcups/hp-photosmart_c4600_series.ppd.gz
new file mode 100644
index 0000000..d6b75b5
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_c4600_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_c4700_series.ppd.gz b/ppd/hpcups/hp-photosmart_c4700_series.ppd.gz
new file mode 100644
index 0000000..2164242
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_c4700_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_c5100_series.ppd.gz b/ppd/hpcups/hp-photosmart_c5100_series.ppd.gz
new file mode 100644
index 0000000..56ada79
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_c5100_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_c5200_series.ppd.gz b/ppd/hpcups/hp-photosmart_c5200_series.ppd.gz
new file mode 100644
index 0000000..5fb38fb
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_c5200_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_c5300_series.ppd.gz b/ppd/hpcups/hp-photosmart_c5300_series.ppd.gz
new file mode 100644
index 0000000..3768e07
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_c5300_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_c5500_series.ppd.gz b/ppd/hpcups/hp-photosmart_c5500_series.ppd.gz
new file mode 100644
index 0000000..ba0d9ac
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_c5500_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_c6100_series.ppd.gz b/ppd/hpcups/hp-photosmart_c6100_series.ppd.gz
new file mode 100644
index 0000000..3f8ef6c
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_c6100_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_c6200_series.ppd.gz b/ppd/hpcups/hp-photosmart_c6200_series.ppd.gz
new file mode 100644
index 0000000..70d307d
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_c6200_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_c6300_series.ppd.gz b/ppd/hpcups/hp-photosmart_c6300_series.ppd.gz
new file mode 100644
index 0000000..11803a8
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_c6300_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_c7100_series.ppd.gz b/ppd/hpcups/hp-photosmart_c7100_series.ppd.gz
new file mode 100644
index 0000000..3a03d90
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_c7100_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_c7200_series.ppd.gz b/ppd/hpcups/hp-photosmart_c7200_series.ppd.gz
new file mode 100644
index 0000000..0241596
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_c7200_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_c8100_series.ppd.gz b/ppd/hpcups/hp-photosmart_c8100_series.ppd.gz
new file mode 100644
index 0000000..aef3b6e
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_c8100_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_d110_series.ppd.gz b/ppd/hpcups/hp-photosmart_d110_series.ppd.gz
new file mode 100644
index 0000000..5d7085f
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_d110_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_d5060_series.ppd.gz b/ppd/hpcups/hp-photosmart_d5060_series.ppd.gz
new file mode 100644
index 0000000..f867650
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_d5060_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_d5100_series.ppd.gz b/ppd/hpcups/hp-photosmart_d5100_series.ppd.gz
new file mode 100644
index 0000000..ddba886
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_d5100_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_d5300_series.ppd.gz b/ppd/hpcups/hp-photosmart_d5300_series.ppd.gz
new file mode 100644
index 0000000..6ff8f2f
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_d5300_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_d5400_series.ppd.gz b/ppd/hpcups/hp-photosmart_d5400_series.ppd.gz
new file mode 100644
index 0000000..4bac51e
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_d5400_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_d6100_series.ppd.gz b/ppd/hpcups/hp-photosmart_d6100_series.ppd.gz
new file mode 100644
index 0000000..e153021
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_d6100_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_d7100_series.ppd.gz b/ppd/hpcups/hp-photosmart_d7100_series.ppd.gz
new file mode 100644
index 0000000..fe18545
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_d7100_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_d7200_series.ppd.gz b/ppd/hpcups/hp-photosmart_d7200_series.ppd.gz
new file mode 100644
index 0000000..57a09d2
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_d7200_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_d7300_series.ppd.gz b/ppd/hpcups/hp-photosmart_d7300_series.ppd.gz
new file mode 100644
index 0000000..38ad1af
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_d7300_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_d7400_series.ppd.gz b/ppd/hpcups/hp-photosmart_d7400_series.ppd.gz
new file mode 100644
index 0000000..59d5049
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_d7400_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_d7500_series.ppd.gz b/ppd/hpcups/hp-photosmart_d7500_series.ppd.gz
new file mode 100644
index 0000000..b3ab39c
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_d7500_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_estn_c510_series.ppd.gz b/ppd/hpcups/hp-photosmart_estn_c510_series.ppd.gz
new file mode 100644
index 0000000..b4ae1e5
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_estn_c510_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_ink_adv_k510.ppd.gz b/ppd/hpcups/hp-photosmart_ink_adv_k510.ppd.gz
new file mode 100644
index 0000000..a554f3b
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_ink_adv_k510.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_p1000.ppd.gz b/ppd/hpcups/hp-photosmart_p1000.ppd.gz
new file mode 100644
index 0000000..6c8b1e7
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_p1000.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_p1100.ppd.gz b/ppd/hpcups/hp-photosmart_p1100.ppd.gz
new file mode 100644
index 0000000..39c9c00
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_p1100.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_plus_b209a-m.ppd.gz b/ppd/hpcups/hp-photosmart_plus_b209a-m.ppd.gz
new file mode 100644
index 0000000..fdc2113
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_plus_b209a-m.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_plus_b210_series.ppd.gz b/ppd/hpcups/hp-photosmart_plus_b210_series.ppd.gz
new file mode 100644
index 0000000..2817c78
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_plus_b210_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_prem-web_c309n-s.ppd.gz b/ppd/hpcups/hp-photosmart_prem-web_c309n-s.ppd.gz
new file mode 100644
index 0000000..d5e7a5b
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_prem-web_c309n-s.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_prem_c310_series.ppd.gz b/ppd/hpcups/hp-photosmart_prem_c310_series.ppd.gz
new file mode 100644
index 0000000..55d6f27
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_prem_c310_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_prem_c410_series.ppd.gz b/ppd/hpcups/hp-photosmart_prem_c410_series.ppd.gz
new file mode 100644
index 0000000..12c2191
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_prem_c410_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_premium_c309g-m.ppd.gz b/ppd/hpcups/hp-photosmart_premium_c309g-m.ppd.gz
new file mode 100644
index 0000000..325bfee
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_premium_c309g-m.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_pro_b8300_series.ppd.gz b/ppd/hpcups/hp-photosmart_pro_b8300_series.ppd.gz
new file mode 100644
index 0000000..43c3053
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_pro_b8300_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_pro_b8800_series.ppd.gz b/ppd/hpcups/hp-photosmart_pro_b8800_series.ppd.gz
new file mode 100644
index 0000000..e0171f2
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_pro_b8800_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-photosmart_wireless_b109n-z.ppd.gz b/ppd/hpcups/hp-photosmart_wireless_b109n-z.ppd.gz
new file mode 100644
index 0000000..535f28b
--- /dev/null
+++ b/ppd/hpcups/hp-photosmart_wireless_b109n-z.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-printer_scanner_copier_300.ppd.gz b/ppd/hpcups/hp-printer_scanner_copier_300.ppd.gz
new file mode 100644
index 0000000..e8298ea
--- /dev/null
+++ b/ppd/hpcups/hp-printer_scanner_copier_300.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-psc_1000_series.ppd.gz b/ppd/hpcups/hp-psc_1000_series.ppd.gz
new file mode 100644
index 0000000..9c85985
--- /dev/null
+++ b/ppd/hpcups/hp-psc_1000_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-psc_1100_series.ppd.gz b/ppd/hpcups/hp-psc_1100_series.ppd.gz
new file mode 100644
index 0000000..3bba842
--- /dev/null
+++ b/ppd/hpcups/hp-psc_1100_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-psc_1200_series.ppd.gz b/ppd/hpcups/hp-psc_1200_series.ppd.gz
new file mode 100644
index 0000000..05f8288
--- /dev/null
+++ b/ppd/hpcups/hp-psc_1200_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-psc_1300_series.ppd.gz b/ppd/hpcups/hp-psc_1300_series.ppd.gz
new file mode 100644
index 0000000..93cc03b
--- /dev/null
+++ b/ppd/hpcups/hp-psc_1300_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-psc_1310_series.ppd.gz b/ppd/hpcups/hp-psc_1310_series.ppd.gz
new file mode 100644
index 0000000..37238ac
--- /dev/null
+++ b/ppd/hpcups/hp-psc_1310_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-psc_1358_series.ppd.gz b/ppd/hpcups/hp-psc_1358_series.ppd.gz
new file mode 100644
index 0000000..7dd0d86
--- /dev/null
+++ b/ppd/hpcups/hp-psc_1358_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-psc_1400_series.ppd.gz b/ppd/hpcups/hp-psc_1400_series.ppd.gz
new file mode 100644
index 0000000..3bdd1a1
--- /dev/null
+++ b/ppd/hpcups/hp-psc_1400_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-psc_1500_series.ppd.gz b/ppd/hpcups/hp-psc_1500_series.ppd.gz
new file mode 100644
index 0000000..36fc10c
--- /dev/null
+++ b/ppd/hpcups/hp-psc_1500_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-psc_1510_series.ppd.gz b/ppd/hpcups/hp-psc_1510_series.ppd.gz
new file mode 100644
index 0000000..4e3d728
--- /dev/null
+++ b/ppd/hpcups/hp-psc_1510_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-psc_1600_series.ppd.gz b/ppd/hpcups/hp-psc_1600_series.ppd.gz
new file mode 100644
index 0000000..afefbb4
--- /dev/null
+++ b/ppd/hpcups/hp-psc_1600_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-psc_2100_series.ppd.gz b/ppd/hpcups/hp-psc_2100_series.ppd.gz
new file mode 100644
index 0000000..470686e
--- /dev/null
+++ b/ppd/hpcups/hp-psc_2100_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-psc_2150_series.ppd.gz b/ppd/hpcups/hp-psc_2150_series.ppd.gz
new file mode 100644
index 0000000..f0c59a4
--- /dev/null
+++ b/ppd/hpcups/hp-psc_2150_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-psc_2170_series.ppd.gz b/ppd/hpcups/hp-psc_2170_series.ppd.gz
new file mode 100644
index 0000000..33f7af7
--- /dev/null
+++ b/ppd/hpcups/hp-psc_2170_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-psc_2200_series.ppd.gz b/ppd/hpcups/hp-psc_2200_series.ppd.gz
new file mode 100644
index 0000000..f936aae
--- /dev/null
+++ b/ppd/hpcups/hp-psc_2200_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-psc_2210_series.ppd.gz b/ppd/hpcups/hp-psc_2210_series.ppd.gz
new file mode 100644
index 0000000..6b6100a
--- /dev/null
+++ b/ppd/hpcups/hp-psc_2210_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-psc_2300_series.ppd.gz b/ppd/hpcups/hp-psc_2300_series.ppd.gz
new file mode 100644
index 0000000..73136e1
--- /dev/null
+++ b/ppd/hpcups/hp-psc_2300_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-psc_2350_series.ppd.gz b/ppd/hpcups/hp-psc_2350_series.ppd.gz
new file mode 100644
index 0000000..46cdd52
--- /dev/null
+++ b/ppd/hpcups/hp-psc_2350_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-psc_2400_series.ppd.gz b/ppd/hpcups/hp-psc_2400_series.ppd.gz
new file mode 100644
index 0000000..af1f882
--- /dev/null
+++ b/ppd/hpcups/hp-psc_2400_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-psc_2500_series.ppd.gz b/ppd/hpcups/hp-psc_2500_series.ppd.gz
new file mode 100644
index 0000000..1d258e7
--- /dev/null
+++ b/ppd/hpcups/hp-psc_2500_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-psc_500.ppd.gz b/ppd/hpcups/hp-psc_500.ppd.gz
new file mode 100644
index 0000000..c8857e7
--- /dev/null
+++ b/ppd/hpcups/hp-psc_500.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-psc_720.ppd.gz b/ppd/hpcups/hp-psc_720.ppd.gz
new file mode 100644
index 0000000..fa4e866
--- /dev/null
+++ b/ppd/hpcups/hp-psc_720.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-psc_750.ppd.gz b/ppd/hpcups/hp-psc_750.ppd.gz
new file mode 100644
index 0000000..dd057cd
--- /dev/null
+++ b/ppd/hpcups/hp-psc_750.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-psc_750xi.ppd.gz b/ppd/hpcups/hp-psc_750xi.ppd.gz
new file mode 100644
index 0000000..056704d
--- /dev/null
+++ b/ppd/hpcups/hp-psc_750xi.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-psc_760.ppd.gz b/ppd/hpcups/hp-psc_760.ppd.gz
new file mode 100644
index 0000000..0c22a16
--- /dev/null
+++ b/ppd/hpcups/hp-psc_760.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-psc_780.ppd.gz b/ppd/hpcups/hp-psc_780.ppd.gz
new file mode 100644
index 0000000..fb42426
--- /dev/null
+++ b/ppd/hpcups/hp-psc_780.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-psc_780xi.ppd.gz b/ppd/hpcups/hp-psc_780xi.ppd.gz
new file mode 100644
index 0000000..8b6e6ac
--- /dev/null
+++ b/ppd/hpcups/hp-psc_780xi.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-psc_900_series.ppd.gz b/ppd/hpcups/hp-psc_900_series.ppd.gz
new file mode 100644
index 0000000..c0bc4d9
--- /dev/null
+++ b/ppd/hpcups/hp-psc_900_series.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-psc_920.ppd.gz b/ppd/hpcups/hp-psc_920.ppd.gz
new file mode 100644
index 0000000..c60dc8e
--- /dev/null
+++ b/ppd/hpcups/hp-psc_920.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-psc_950.ppd.gz b/ppd/hpcups/hp-psc_950.ppd.gz
new file mode 100644
index 0000000..0804ced
--- /dev/null
+++ b/ppd/hpcups/hp-psc_950.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-psc_950vr.ppd.gz b/ppd/hpcups/hp-psc_950vr.ppd.gz
new file mode 100644
index 0000000..5af8a8e
--- /dev/null
+++ b/ppd/hpcups/hp-psc_950vr.ppd.gz
Binary files differ
diff --git a/ppd/hpcups/hp-psc_950xi.ppd.gz b/ppd/hpcups/hp-psc_950xi.ppd.gz
new file mode 100644
index 0000000..2ac7bfe
--- /dev/null
+++ b/ppd/hpcups/hp-psc_950xi.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-2000c-hpijs.ppd.gz b/ppd/hpijs/hp-2000c-hpijs.ppd.gz
new file mode 100644
index 0000000..7c5de5c
--- /dev/null
+++ b/ppd/hpijs/hp-2000c-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-2500c-hpijs.ppd.gz b/ppd/hpijs/hp-2500c-hpijs.ppd.gz
new file mode 100644
index 0000000..22e52bd
--- /dev/null
+++ b/ppd/hpijs/hp-2500c-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-910-hpijs.ppd.gz b/ppd/hpijs/hp-910-hpijs.ppd.gz
new file mode 100644
index 0000000..97a1ec4
--- /dev/null
+++ b/ppd/hpijs/hp-910-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-915-hpijs.ppd.gz b/ppd/hpijs/hp-915-hpijs.ppd.gz
new file mode 100644
index 0000000..004a066
--- /dev/null
+++ b/ppd/hpijs/hp-915-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-business_inkjet_1000-hpijs.ppd.gz b/ppd/hpijs/hp-business_inkjet_1000-hpijs.ppd.gz
new file mode 100644
index 0000000..32a7cf4
--- /dev/null
+++ b/ppd/hpijs/hp-business_inkjet_1000-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-business_inkjet_1100-hpijs.ppd.gz b/ppd/hpijs/hp-business_inkjet_1100-hpijs.ppd.gz
new file mode 100644
index 0000000..0c31223
--- /dev/null
+++ b/ppd/hpijs/hp-business_inkjet_1100-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-business_inkjet_1200-hpijs.ppd.gz b/ppd/hpijs/hp-business_inkjet_1200-hpijs.ppd.gz
new file mode 100644
index 0000000..17bb4ae
--- /dev/null
+++ b/ppd/hpijs/hp-business_inkjet_1200-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-business_inkjet_2200-hpijs.ppd.gz b/ppd/hpijs/hp-business_inkjet_2200-hpijs.ppd.gz
new file mode 100644
index 0000000..a3fc0f1
--- /dev/null
+++ b/ppd/hpijs/hp-business_inkjet_2200-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-business_inkjet_2230-hpijs.ppd.gz b/ppd/hpijs/hp-business_inkjet_2230-hpijs.ppd.gz
new file mode 100644
index 0000000..3588eae
--- /dev/null
+++ b/ppd/hpijs/hp-business_inkjet_2230-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-business_inkjet_2250-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-business_inkjet_2250-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..e6ed121
--- /dev/null
+++ b/ppd/hpijs/hp-business_inkjet_2250-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-business_inkjet_2280-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-business_inkjet_2280-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..f31c0af
--- /dev/null
+++ b/ppd/hpijs/hp-business_inkjet_2280-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-business_inkjet_2300-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-business_inkjet_2300-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..20b3999
--- /dev/null
+++ b/ppd/hpijs/hp-business_inkjet_2300-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-business_inkjet_2600-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-business_inkjet_2600-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..5ef8b6c
--- /dev/null
+++ b/ppd/hpijs/hp-business_inkjet_2600-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-business_inkjet_2800-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-business_inkjet_2800-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..2840320
--- /dev/null
+++ b/ppd/hpijs/hp-business_inkjet_2800-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-business_inkjet_3000-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-business_inkjet_3000-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..09f97c4
--- /dev/null
+++ b/ppd/hpijs/hp-business_inkjet_3000-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-color_inkjet_cp1700-hpijs.ppd.gz b/ppd/hpijs/hp-color_inkjet_cp1700-hpijs.ppd.gz
new file mode 100644
index 0000000..f69e8a1
--- /dev/null
+++ b/ppd/hpijs/hp-color_inkjet_cp1700-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-color_inkjet_printer_cp1700-hpijs.ppd.gz b/ppd/hpijs/hp-color_inkjet_printer_cp1700-hpijs.ppd.gz
new file mode 100644
index 0000000..8e52371
--- /dev/null
+++ b/ppd/hpijs/hp-color_inkjet_printer_cp1700-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-color_laserjet_1600-hpijs.ppd.gz b/ppd/hpijs/hp-color_laserjet_1600-hpijs.ppd.gz
new file mode 100644
index 0000000..ef9103f
--- /dev/null
+++ b/ppd/hpijs/hp-color_laserjet_1600-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-color_laserjet_2500-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-color_laserjet_2500-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..ef12db6
--- /dev/null
+++ b/ppd/hpijs/hp-color_laserjet_2500-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-color_laserjet_2500_series-hpijs.ppd.gz b/ppd/hpijs/hp-color_laserjet_2500_series-hpijs.ppd.gz
new file mode 100644
index 0000000..7ea8ecf
--- /dev/null
+++ b/ppd/hpijs/hp-color_laserjet_2500_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-color_laserjet_2600n-hpijs.ppd.gz b/ppd/hpijs/hp-color_laserjet_2600n-hpijs.ppd.gz
new file mode 100644
index 0000000..d1530fc
--- /dev/null
+++ b/ppd/hpijs/hp-color_laserjet_2600n-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-color_laserjet_3000-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-color_laserjet_3000-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..af072ec
--- /dev/null
+++ b/ppd/hpijs/hp-color_laserjet_3000-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-color_laserjet_3500-hpijs.ppd.gz b/ppd/hpijs/hp-color_laserjet_3500-hpijs.ppd.gz
new file mode 100644
index 0000000..9b28776
--- /dev/null
+++ b/ppd/hpijs/hp-color_laserjet_3500-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-color_laserjet_3500n-hpijs.ppd.gz b/ppd/hpijs/hp-color_laserjet_3500n-hpijs.ppd.gz
new file mode 100644
index 0000000..cb74dd3
--- /dev/null
+++ b/ppd/hpijs/hp-color_laserjet_3500n-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-color_laserjet_3550-hpijs.ppd.gz b/ppd/hpijs/hp-color_laserjet_3550-hpijs.ppd.gz
new file mode 100644
index 0000000..ad39ca8
--- /dev/null
+++ b/ppd/hpijs/hp-color_laserjet_3550-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-color_laserjet_3550n-hpijs.ppd.gz b/ppd/hpijs/hp-color_laserjet_3550n-hpijs.ppd.gz
new file mode 100644
index 0000000..33f9304
--- /dev/null
+++ b/ppd/hpijs/hp-color_laserjet_3550n-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-color_laserjet_3600-hpijs.ppd.gz b/ppd/hpijs/hp-color_laserjet_3600-hpijs.ppd.gz
new file mode 100644
index 0000000..e5817c3
--- /dev/null
+++ b/ppd/hpijs/hp-color_laserjet_3600-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-color_laserjet_3700-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-color_laserjet_3700-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..ecd548c
--- /dev/null
+++ b/ppd/hpijs/hp-color_laserjet_3700-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-color_laserjet_3700n-hpijs.ppd.gz b/ppd/hpijs/hp-color_laserjet_3700n-hpijs.ppd.gz
new file mode 100644
index 0000000..ca4b2f7
--- /dev/null
+++ b/ppd/hpijs/hp-color_laserjet_3700n-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-color_laserjet_3800-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-color_laserjet_3800-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..f9baa57
--- /dev/null
+++ b/ppd/hpijs/hp-color_laserjet_3800-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-color_laserjet_4500-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-color_laserjet_4500-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..d029e75
--- /dev/null
+++ b/ppd/hpijs/hp-color_laserjet_4500-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-color_laserjet_4550-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-color_laserjet_4550-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..3f4e4e5
--- /dev/null
+++ b/ppd/hpijs/hp-color_laserjet_4550-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-color_laserjet_4600-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-color_laserjet_4600-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..89ed1f6
--- /dev/null
+++ b/ppd/hpijs/hp-color_laserjet_4600-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-color_laserjet_4600_series-hpijs.ppd.gz b/ppd/hpijs/hp-color_laserjet_4600_series-hpijs.ppd.gz
new file mode 100644
index 0000000..833a53a
--- /dev/null
+++ b/ppd/hpijs/hp-color_laserjet_4600_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-color_laserjet_4610-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-color_laserjet_4610-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..b805769
--- /dev/null
+++ b/ppd/hpijs/hp-color_laserjet_4610-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-color_laserjet_4650-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-color_laserjet_4650-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..0cedebe
--- /dev/null
+++ b/ppd/hpijs/hp-color_laserjet_4650-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-color_laserjet_4700-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-color_laserjet_4700-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..70d02a3
--- /dev/null
+++ b/ppd/hpijs/hp-color_laserjet_4700-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-color_laserjet_4730mfp-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-color_laserjet_4730mfp-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..7f21459
--- /dev/null
+++ b/ppd/hpijs/hp-color_laserjet_4730mfp-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-color_laserjet_5-hpijs.ppd.gz b/ppd/hpijs/hp-color_laserjet_5-hpijs.ppd.gz
new file mode 100644
index 0000000..70eb3e7
--- /dev/null
+++ b/ppd/hpijs/hp-color_laserjet_5-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-color_laserjet_5500-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-color_laserjet_5500-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..e0fb56d
--- /dev/null
+++ b/ppd/hpijs/hp-color_laserjet_5500-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-color_laserjet_5550-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-color_laserjet_5550-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..35d553d
--- /dev/null
+++ b/ppd/hpijs/hp-color_laserjet_5550-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-color_laserjet_5m-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-color_laserjet_5m-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..3a07084
--- /dev/null
+++ b/ppd/hpijs/hp-color_laserjet_5m-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-color_laserjet_8500-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-color_laserjet_8500-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..8aea656
--- /dev/null
+++ b/ppd/hpijs/hp-color_laserjet_8500-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-color_laserjet_8550-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-color_laserjet_8550-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..ee633b8
--- /dev/null
+++ b/ppd/hpijs/hp-color_laserjet_8550-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-color_laserjet_9500-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-color_laserjet_9500-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..f9230be
--- /dev/null
+++ b/ppd/hpijs/hp-color_laserjet_9500-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-color_laserjet_9500_mfp-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-color_laserjet_9500_mfp-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..3c53568
--- /dev/null
+++ b/ppd/hpijs/hp-color_laserjet_9500_mfp-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-color_laserjet_cm1312_mfp-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-color_laserjet_cm1312_mfp-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..d815ba6
--- /dev/null
+++ b/ppd/hpijs/hp-color_laserjet_cm1312_mfp-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-color_laserjet_cm1312nfi_mfp-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-color_laserjet_cm1312nfi_mfp-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..13e6288
--- /dev/null
+++ b/ppd/hpijs/hp-color_laserjet_cm1312nfi_mfp-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-color_laserjet_cm2320_mfp-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-color_laserjet_cm2320_mfp-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..efbf282
--- /dev/null
+++ b/ppd/hpijs/hp-color_laserjet_cm2320_mfp-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-color_laserjet_cm2320fxi_mfp-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-color_laserjet_cm2320fxi_mfp-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..98c75b1
--- /dev/null
+++ b/ppd/hpijs/hp-color_laserjet_cm2320fxi_mfp-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-color_laserjet_cm2320n_mfp-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-color_laserjet_cm2320n_mfp-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..d3e0d0d
--- /dev/null
+++ b/ppd/hpijs/hp-color_laserjet_cm2320n_mfp-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-color_laserjet_cm2320nf_mfp-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-color_laserjet_cm2320nf_mfp-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..c1db1bd
--- /dev/null
+++ b/ppd/hpijs/hp-color_laserjet_cm2320nf_mfp-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-color_laserjet_cm3530_mfp-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-color_laserjet_cm3530_mfp-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..2e348e6
--- /dev/null
+++ b/ppd/hpijs/hp-color_laserjet_cm3530_mfp-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-color_laserjet_cm4540_mfp-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-color_laserjet_cm4540_mfp-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..c638f96
--- /dev/null
+++ b/ppd/hpijs/hp-color_laserjet_cm4540_mfp-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-color_laserjet_cm4730_mfp-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-color_laserjet_cm4730_mfp-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..fb477c3
--- /dev/null
+++ b/ppd/hpijs/hp-color_laserjet_cm4730_mfp-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-color_laserjet_cm6030_mfp-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-color_laserjet_cm6030_mfp-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..ff61b5b
--- /dev/null
+++ b/ppd/hpijs/hp-color_laserjet_cm6030_mfp-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-color_laserjet_cm6040_mfp-hpijs.ppd.gz b/ppd/hpijs/hp-color_laserjet_cm6040_mfp-hpijs.ppd.gz
new file mode 100644
index 0000000..7149cd7
--- /dev/null
+++ b/ppd/hpijs/hp-color_laserjet_cm6040_mfp-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-color_laserjet_cm6049_mfp-hpijs.ppd.gz b/ppd/hpijs/hp-color_laserjet_cm6049_mfp-hpijs.ppd.gz
new file mode 100644
index 0000000..cdf872f
--- /dev/null
+++ b/ppd/hpijs/hp-color_laserjet_cm6049_mfp-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-color_laserjet_cp1215-hpijs.ppd.gz b/ppd/hpijs/hp-color_laserjet_cp1215-hpijs.ppd.gz
new file mode 100644
index 0000000..a64bb7f
--- /dev/null
+++ b/ppd/hpijs/hp-color_laserjet_cp1215-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-color_laserjet_cp1217-hpijs.ppd.gz b/ppd/hpijs/hp-color_laserjet_cp1217-hpijs.ppd.gz
new file mode 100644
index 0000000..4f66072
--- /dev/null
+++ b/ppd/hpijs/hp-color_laserjet_cp1217-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-color_laserjet_cp1514n-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-color_laserjet_cp1514n-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..2fb4742
--- /dev/null
+++ b/ppd/hpijs/hp-color_laserjet_cp1514n-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-color_laserjet_cp1515n-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-color_laserjet_cp1515n-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..4d005a8
--- /dev/null
+++ b/ppd/hpijs/hp-color_laserjet_cp1515n-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-color_laserjet_cp1518ni-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-color_laserjet_cp1518ni-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..1a9516f
--- /dev/null
+++ b/ppd/hpijs/hp-color_laserjet_cp1518ni-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-color_laserjet_cp2025-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-color_laserjet_cp2025-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..82b01b5
--- /dev/null
+++ b/ppd/hpijs/hp-color_laserjet_cp2025-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-color_laserjet_cp2025dn-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-color_laserjet_cp2025dn-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..1bf21a4
--- /dev/null
+++ b/ppd/hpijs/hp-color_laserjet_cp2025dn-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-color_laserjet_cp2025n-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-color_laserjet_cp2025n-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..cdc553b
--- /dev/null
+++ b/ppd/hpijs/hp-color_laserjet_cp2025n-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-color_laserjet_cp2025x-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-color_laserjet_cp2025x-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..4bc2e27
--- /dev/null
+++ b/ppd/hpijs/hp-color_laserjet_cp2025x-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-color_laserjet_cp3505-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-color_laserjet_cp3505-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..b24e692
--- /dev/null
+++ b/ppd/hpijs/hp-color_laserjet_cp3505-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-color_laserjet_cp3525-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-color_laserjet_cp3525-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..ed82d73
--- /dev/null
+++ b/ppd/hpijs/hp-color_laserjet_cp3525-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-color_laserjet_cp4005-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-color_laserjet_cp4005-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..3515a8b
--- /dev/null
+++ b/ppd/hpijs/hp-color_laserjet_cp4005-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-color_laserjet_cp4020_series-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-color_laserjet_cp4020_series-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..e9ca4b3
--- /dev/null
+++ b/ppd/hpijs/hp-color_laserjet_cp4020_series-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-color_laserjet_cp4520_series-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-color_laserjet_cp4520_series-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..00d9606
--- /dev/null
+++ b/ppd/hpijs/hp-color_laserjet_cp4520_series-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-color_laserjet_cp5225-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-color_laserjet_cp5225-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..7e83418
--- /dev/null
+++ b/ppd/hpijs/hp-color_laserjet_cp5225-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-color_laserjet_cp5225dn-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-color_laserjet_cp5225dn-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..699567c
--- /dev/null
+++ b/ppd/hpijs/hp-color_laserjet_cp5225dn-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-color_laserjet_cp5225n-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-color_laserjet_cp5225n-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..47582f9
--- /dev/null
+++ b/ppd/hpijs/hp-color_laserjet_cp5225n-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-color_laserjet_cp5520_series-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-color_laserjet_cp5520_series-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..024239a
--- /dev/null
+++ b/ppd/hpijs/hp-color_laserjet_cp5520_series-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-color_laserjet_cp6015-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-color_laserjet_cp6015-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..b343ba0
--- /dev/null
+++ b/ppd/hpijs/hp-color_laserjet_cp6015-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-cp1160-hpijs.ppd.gz b/ppd/hpijs/hp-cp1160-hpijs.ppd.gz
new file mode 100644
index 0000000..36bfc3a
--- /dev/null
+++ b/ppd/hpijs/hp-cp1160-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_1000_j110_series-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_1000_j110_series-hpijs.ppd.gz
new file mode 100644
index 0000000..57fe9d4
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_1000_j110_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_1050_j410_series-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_1050_j410_series-hpijs.ppd.gz
new file mode 100644
index 0000000..f04e9ed
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_1050_j410_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_1100-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_1100-hpijs.ppd.gz
new file mode 100644
index 0000000..d1c3258
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_1100-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_1120-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_1120-hpijs.ppd.gz
new file mode 100644
index 0000000..dcba56b
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_1120-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_1125-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_1125-hpijs.ppd.gz
new file mode 100644
index 0000000..55e69d3
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_1125-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_1200c-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_1200c-hpijs.ppd.gz
new file mode 100644
index 0000000..fd0e229
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_1200c-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_1220c-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_1220c-hpijs.ppd.gz
new file mode 100644
index 0000000..ff57003
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_1220c-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_1280-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_1280-hpijs.ppd.gz
new file mode 100644
index 0000000..a24abc6
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_1280-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_1600c-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_1600c-hpijs.ppd.gz
new file mode 100644
index 0000000..b63d518
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_1600c-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_1600cm-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_1600cm-hpijs.ppd.gz
new file mode 100644
index 0000000..3d82336
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_1600cm-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_1600cn-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_1600cn-hpijs.ppd.gz
new file mode 100644
index 0000000..163ddc4
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_1600cn-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_2000_j210_series-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_2000_j210_series-hpijs.ppd.gz
new file mode 100644
index 0000000..7f1a0c6
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_2000_j210_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_2050_j510_series-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_2050_j510_series-hpijs.ppd.gz
new file mode 100644
index 0000000..c4c4ca2
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_2050_j510_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_3000_j310_series-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_3000_j310_series-hpijs.ppd.gz
new file mode 100644
index 0000000..054ad72
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_3000_j310_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_3050_j610_series-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_3050_j610_series-hpijs.ppd.gz
new file mode 100644
index 0000000..bb0fb44
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_3050_j610_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_3050a_j611_series-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_3050a_j611_series-hpijs.ppd.gz
new file mode 100644
index 0000000..b6e179f
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_3050a_j611_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_3070_b611_series-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_3070_b611_series-hpijs.ppd.gz
new file mode 100644
index 0000000..675df10
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_3070_b611_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_3320-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_3320-hpijs.ppd.gz
new file mode 100644
index 0000000..6da40b2
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_3320-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_3325-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_3325-hpijs.ppd.gz
new file mode 100644
index 0000000..bfbe73f
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_3325-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_3420-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_3420-hpijs.ppd.gz
new file mode 100644
index 0000000..2226fec
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_3420-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_3425-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_3425-hpijs.ppd.gz
new file mode 100644
index 0000000..91ab328
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_3425-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_3450-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_3450-hpijs.ppd.gz
new file mode 100644
index 0000000..1a1f998
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_3450-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_3500-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_3500-hpijs.ppd.gz
new file mode 100644
index 0000000..f9eb048
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_3500-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_3550-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_3550-hpijs.ppd.gz
new file mode 100644
index 0000000..ca4de04
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_3550-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_3600-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_3600-hpijs.ppd.gz
new file mode 100644
index 0000000..5864c35
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_3600-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_3650-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_3650-hpijs.ppd.gz
new file mode 100644
index 0000000..430b731
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_3650-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_3740-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_3740-hpijs.ppd.gz
new file mode 100644
index 0000000..e3352f3
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_3740-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_3810-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_3810-hpijs.ppd.gz
new file mode 100644
index 0000000..d5b22e9
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_3810-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_3816-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_3816-hpijs.ppd.gz
new file mode 100644
index 0000000..63b2569
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_3816-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_3819-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_3819-hpijs.ppd.gz
new file mode 100644
index 0000000..321f0f9
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_3819-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_3820-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_3820-hpijs.ppd.gz
new file mode 100644
index 0000000..f853aec
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_3820-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_3822-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_3822-hpijs.ppd.gz
new file mode 100644
index 0000000..c6686e3
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_3822-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_3840-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_3840-hpijs.ppd.gz
new file mode 100644
index 0000000..5cc64c7
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_3840-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_3870-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_3870-hpijs.ppd.gz
new file mode 100644
index 0000000..30c94fc
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_3870-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_3900-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_3900-hpijs.ppd.gz
new file mode 100644
index 0000000..8d9a20f
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_3900-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_3910-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_3910-hpijs.ppd.gz
new file mode 100644
index 0000000..6edb21f
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_3910-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_3920-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_3920-hpijs.ppd.gz
new file mode 100644
index 0000000..16d26f2
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_3920-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_3940-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_3940-hpijs.ppd.gz
new file mode 100644
index 0000000..5cc1fcc
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_3940-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_400-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_400-hpijs.ppd.gz
new file mode 100644
index 0000000..4674153
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_400-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_400l-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_400l-hpijs.ppd.gz
new file mode 100644
index 0000000..9b31aa6
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_400l-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_460-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_460-hpijs.ppd.gz
new file mode 100644
index 0000000..77dc1bd
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_460-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_500-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_500-hpijs.ppd.gz
new file mode 100644
index 0000000..2771717
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_500-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_500c-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_500c-hpijs.ppd.gz
new file mode 100644
index 0000000..fbc27b8
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_500c-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_505j-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_505j-hpijs.ppd.gz
new file mode 100644
index 0000000..3106510
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_505j-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_510-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_510-hpijs.ppd.gz
new file mode 100644
index 0000000..c74641c
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_510-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_5100-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_5100-hpijs.ppd.gz
new file mode 100644
index 0000000..f3a8b27
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_5100-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_520-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_520-hpijs.ppd.gz
new file mode 100644
index 0000000..6d2eaff
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_520-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_540-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_540-hpijs.ppd.gz
new file mode 100644
index 0000000..f58df06
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_540-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_5400_series-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_5400_series-hpijs.ppd.gz
new file mode 100644
index 0000000..23814b8
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_5400_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_550c-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_550c-hpijs.ppd.gz
new file mode 100644
index 0000000..f446bec
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_550c-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_5550-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_5550-hpijs.ppd.gz
new file mode 100644
index 0000000..b7be68a
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_5550-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_5551-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_5551-hpijs.ppd.gz
new file mode 100644
index 0000000..cbb3baf
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_5551-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_5552-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_5552-hpijs.ppd.gz
new file mode 100644
index 0000000..9659acf
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_5552-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_5600-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_5600-hpijs.ppd.gz
new file mode 100644
index 0000000..04e2140
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_5600-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_5650-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_5650-hpijs.ppd.gz
new file mode 100644
index 0000000..ca44f7f
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_5650-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_5652-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_5652-hpijs.ppd.gz
new file mode 100644
index 0000000..daca58b
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_5652-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_5700-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_5700-hpijs.ppd.gz
new file mode 100644
index 0000000..f49d7eb
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_5700-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_5800-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_5800-hpijs.ppd.gz
new file mode 100644
index 0000000..192d20f
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_5800-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_5850-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_5850-hpijs.ppd.gz
new file mode 100644
index 0000000..825104c
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_5850-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_5900_series-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_5900_series-hpijs.ppd.gz
new file mode 100644
index 0000000..89c1f90
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_5900_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_600-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_600-hpijs.ppd.gz
new file mode 100644
index 0000000..2cf5e3c
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_600-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_610c-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_610c-hpijs.ppd.gz
new file mode 100644
index 0000000..c20217f
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_610c-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_610cl-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_610cl-hpijs.ppd.gz
new file mode 100644
index 0000000..e280bf2
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_610cl-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_6120-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_6120-hpijs.ppd.gz
new file mode 100644
index 0000000..4608ae6
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_6120-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_6122-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_6122-hpijs.ppd.gz
new file mode 100644
index 0000000..87077e0
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_6122-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_6127-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_6127-hpijs.ppd.gz
new file mode 100644
index 0000000..237d751
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_6127-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_612c-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_612c-hpijs.ppd.gz
new file mode 100644
index 0000000..f39d100
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_612c-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_630c-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_630c-hpijs.ppd.gz
new file mode 100644
index 0000000..31c9499
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_630c-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_632c-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_632c-hpijs.ppd.gz
new file mode 100644
index 0000000..bcb99b2
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_632c-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_640c-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_640c-hpijs.ppd.gz
new file mode 100644
index 0000000..5677b4f
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_640c-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_648c-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_648c-hpijs.ppd.gz
new file mode 100644
index 0000000..52559f1
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_648c-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_6500-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_6500-hpijs.ppd.gz
new file mode 100644
index 0000000..7956a4d
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_6500-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_656c-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_656c-hpijs.ppd.gz
new file mode 100644
index 0000000..ef9dc8e
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_656c-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_660-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_660-hpijs.ppd.gz
new file mode 100644
index 0000000..0065df1
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_660-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_6600-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_6600-hpijs.ppd.gz
new file mode 100644
index 0000000..588b565
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_6600-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_670-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_670-hpijs.ppd.gz
new file mode 100644
index 0000000..d0d718e
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_670-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_670c-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_670c-hpijs.ppd.gz
new file mode 100644
index 0000000..a933a9d
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_670c-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_670tv-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_670tv-hpijs.ppd.gz
new file mode 100644
index 0000000..ed9e61d
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_670tv-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_672c-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_672c-hpijs.ppd.gz
new file mode 100644
index 0000000..d0e8f4d
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_672c-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_680-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_680-hpijs.ppd.gz
new file mode 100644
index 0000000..d2b7bbd
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_680-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_6800-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_6800-hpijs.ppd.gz
new file mode 100644
index 0000000..06a3e73
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_6800-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_682-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_682-hpijs.ppd.gz
new file mode 100644
index 0000000..20c2316
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_682-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_690-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_690-hpijs.ppd.gz
new file mode 100644
index 0000000..60a199c
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_690-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_690c-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_690c-hpijs.ppd.gz
new file mode 100644
index 0000000..1364a29
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_690c-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_692-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_692-hpijs.ppd.gz
new file mode 100644
index 0000000..5469b0c
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_692-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_693-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_693-hpijs.ppd.gz
new file mode 100644
index 0000000..5c5e3c6
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_693-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_694-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_694-hpijs.ppd.gz
new file mode 100644
index 0000000..89ed9dc
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_694-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_6940_series-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_6940_series-hpijs.ppd.gz
new file mode 100644
index 0000000..53b428b
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_6940_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_695-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_695-hpijs.ppd.gz
new file mode 100644
index 0000000..ca424d7
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_695-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_697-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_697-hpijs.ppd.gz
new file mode 100644
index 0000000..df70231
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_697-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_6980_series-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_6980_series-hpijs.ppd.gz
new file mode 100644
index 0000000..58ee4a6
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_6980_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_810c-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_810c-hpijs.ppd.gz
new file mode 100644
index 0000000..3fb2572
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_810c-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_812c-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_812c-hpijs.ppd.gz
new file mode 100644
index 0000000..de6405c
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_812c-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_815c-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_815c-hpijs.ppd.gz
new file mode 100644
index 0000000..adbda65
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_815c-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_816c-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_816c-hpijs.ppd.gz
new file mode 100644
index 0000000..a4def89
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_816c-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_825c-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_825c-hpijs.ppd.gz
new file mode 100644
index 0000000..ea23f8c
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_825c-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_830c-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_830c-hpijs.ppd.gz
new file mode 100644
index 0000000..79e081a
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_830c-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_832c-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_832c-hpijs.ppd.gz
new file mode 100644
index 0000000..c3d172a
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_832c-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_840c-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_840c-hpijs.ppd.gz
new file mode 100644
index 0000000..520c36d
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_840c-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_841c-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_841c-hpijs.ppd.gz
new file mode 100644
index 0000000..fb63dc2
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_841c-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_842c-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_842c-hpijs.ppd.gz
new file mode 100644
index 0000000..1e5a734
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_842c-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_843c-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_843c-hpijs.ppd.gz
new file mode 100644
index 0000000..19f43e5
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_843c-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_845c-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_845c-hpijs.ppd.gz
new file mode 100644
index 0000000..9150a74
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_845c-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_850c-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_850c-hpijs.ppd.gz
new file mode 100644
index 0000000..39b44b2
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_850c-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_855c-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_855c-hpijs.ppd.gz
new file mode 100644
index 0000000..1a4a396
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_855c-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_870c-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_870c-hpijs.ppd.gz
new file mode 100644
index 0000000..52770e9
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_870c-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_880c-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_880c-hpijs.ppd.gz
new file mode 100644
index 0000000..b6f1699
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_880c-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_882c-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_882c-hpijs.ppd.gz
new file mode 100644
index 0000000..d2dcef6
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_882c-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_890c-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_890c-hpijs.ppd.gz
new file mode 100644
index 0000000..bf450c0
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_890c-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_895c-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_895c-hpijs.ppd.gz
new file mode 100644
index 0000000..e9fe8d5
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_895c-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_916c-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_916c-hpijs.ppd.gz
new file mode 100644
index 0000000..b3f48e9
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_916c-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_920c-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_920c-hpijs.ppd.gz
new file mode 100644
index 0000000..cb7fb41
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_920c-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_9300-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_9300-hpijs.ppd.gz
new file mode 100644
index 0000000..e285e16
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_9300-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_930c-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_930c-hpijs.ppd.gz
new file mode 100644
index 0000000..b7035f6
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_930c-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_932c-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_932c-hpijs.ppd.gz
new file mode 100644
index 0000000..e7c05b4
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_932c-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_933c-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_933c-hpijs.ppd.gz
new file mode 100644
index 0000000..a801e5e
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_933c-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_934c-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_934c-hpijs.ppd.gz
new file mode 100644
index 0000000..4385bfc
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_934c-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_935c-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_935c-hpijs.ppd.gz
new file mode 100644
index 0000000..f7b86e5
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_935c-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_940c-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_940c-hpijs.ppd.gz
new file mode 100644
index 0000000..fa3556f
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_940c-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_948c-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_948c-hpijs.ppd.gz
new file mode 100644
index 0000000..9aa80f3
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_948c-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_950c-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_950c-hpijs.ppd.gz
new file mode 100644
index 0000000..b455757
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_950c-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_952c-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_952c-hpijs.ppd.gz
new file mode 100644
index 0000000..72fa9ae
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_952c-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_955c-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_955c-hpijs.ppd.gz
new file mode 100644
index 0000000..8ec7845
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_955c-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_957c-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_957c-hpijs.ppd.gz
new file mode 100644
index 0000000..76dad41
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_957c-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_959c-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_959c-hpijs.ppd.gz
new file mode 100644
index 0000000..c186b60
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_959c-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_9600-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_9600-hpijs.ppd.gz
new file mode 100644
index 0000000..140638d
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_9600-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_960c-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_960c-hpijs.ppd.gz
new file mode 100644
index 0000000..eb9d311
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_960c-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_970c-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_970c-hpijs.ppd.gz
new file mode 100644
index 0000000..e9c1e88
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_970c-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_975c-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_975c-hpijs.ppd.gz
new file mode 100644
index 0000000..1b631ce
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_975c-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_9800-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_9800-hpijs.ppd.gz
new file mode 100644
index 0000000..34c7980
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_9800-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_980c-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_980c-hpijs.ppd.gz
new file mode 100644
index 0000000..d321372
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_980c-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_990c-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_990c-hpijs.ppd.gz
new file mode 100644
index 0000000..1b2ded6
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_990c-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_995c-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_995c-hpijs.ppd.gz
new file mode 100644
index 0000000..3c6eb19
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_995c-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_d1300_series-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_d1300_series-hpijs.ppd.gz
new file mode 100644
index 0000000..090a289
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_d1300_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_d1400_series-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_d1400_series-hpijs.ppd.gz
new file mode 100644
index 0000000..2541b9f
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_d1400_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_d1500_series-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_d1500_series-hpijs.ppd.gz
new file mode 100644
index 0000000..60763b1
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_d1500_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_d1600_series-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_d1600_series-hpijs.ppd.gz
new file mode 100644
index 0000000..9f0ad4e
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_d1600_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_d2300_series-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_d2300_series-hpijs.ppd.gz
new file mode 100644
index 0000000..6ecf2fc
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_d2300_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_d2400_series-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_d2400_series-hpijs.ppd.gz
new file mode 100644
index 0000000..b8735aa
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_d2400_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_d2500_series-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_d2500_series-hpijs.ppd.gz
new file mode 100644
index 0000000..7ecb803
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_d2500_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_d2600_series-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_d2600_series-hpijs.ppd.gz
new file mode 100644
index 0000000..a9070a1
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_d2600_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_d4100_series-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_d4100_series-hpijs.ppd.gz
new file mode 100644
index 0000000..a7a0f52
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_d4100_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_d4200_series-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_d4200_series-hpijs.ppd.gz
new file mode 100644
index 0000000..3b1cf37
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_d4200_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_d4300_series-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_d4300_series-hpijs.ppd.gz
new file mode 100644
index 0000000..ab359b9
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_d4300_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_d5500_series-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_d5500_series-hpijs.ppd.gz
new file mode 100644
index 0000000..d3eae48
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_d5500_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_d730-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_d730-hpijs.ppd.gz
new file mode 100644
index 0000000..4f1834b
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_d730-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_f2100_series-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_f2100_series-hpijs.ppd.gz
new file mode 100644
index 0000000..9a60e4a
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_f2100_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_f2200_series-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_f2200_series-hpijs.ppd.gz
new file mode 100644
index 0000000..1777c95
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_f2200_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_f2400_series-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_f2400_series-hpijs.ppd.gz
new file mode 100644
index 0000000..65f7b22
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_f2400_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_f300_series-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_f300_series-hpijs.ppd.gz
new file mode 100644
index 0000000..1383aae
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_f300_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_f4100_series-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_f4100_series-hpijs.ppd.gz
new file mode 100644
index 0000000..285cefd
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_f4100_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_f4200_series-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_f4200_series-hpijs.ppd.gz
new file mode 100644
index 0000000..4629faa
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_f4200_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_f4210_series-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_f4210_series-hpijs.ppd.gz
new file mode 100644
index 0000000..5d097e6
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_f4210_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_f4213_series-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_f4213_series-hpijs.ppd.gz
new file mode 100644
index 0000000..7b0f297
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_f4213_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_f4400_series-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_f4400_series-hpijs.ppd.gz
new file mode 100644
index 0000000..7b9474c
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_f4400_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_f4500_series-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_f4500_series-hpijs.ppd.gz
new file mode 100644
index 0000000..706238e
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_f4500_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_f735-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_f735-hpijs.ppd.gz
new file mode 100644
index 0000000..f1a71a6
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_f735-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_ink_adv_2010_k010-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_ink_adv_2010_k010-hpijs.ppd.gz
new file mode 100644
index 0000000..d55d9e4
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_ink_adv_2010_k010-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_ink_adv_2060_k110-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_ink_adv_2060_k110-hpijs.ppd.gz
new file mode 100644
index 0000000..336de80
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_ink_adv_2060_k110-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_ink_advant_k109a-z-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_ink_advant_k109a-z-hpijs.ppd.gz
new file mode 100644
index 0000000..62cc2da
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_ink_advant_k109a-z-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-deskjet_ink_advant_k209a-z-hpijs.ppd.gz b/ppd/hpijs/hp-deskjet_ink_advant_k209a-z-hpijs.ppd.gz
new file mode 100644
index 0000000..37b0188
--- /dev/null
+++ b/ppd/hpijs/hp-deskjet_ink_advant_k209a-z-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-dj350-hpijs.ppd.gz b/ppd/hpijs/hp-dj350-hpijs.ppd.gz
new file mode 100644
index 0000000..938f407
--- /dev/null
+++ b/ppd/hpijs/hp-dj350-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-dj450-hpijs.ppd.gz b/ppd/hpijs/hp-dj450-hpijs.ppd.gz
new file mode 100644
index 0000000..4f6b37a
--- /dev/null
+++ b/ppd/hpijs/hp-dj450-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-envy_100_d410_series-hpijs.ppd.gz b/ppd/hpijs/hp-envy_100_d410_series-hpijs.ppd.gz
new file mode 100644
index 0000000..16cc35e
--- /dev/null
+++ b/ppd/hpijs/hp-envy_100_d410_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-envy_110_series-hpijs.ppd.gz b/ppd/hpijs/hp-envy_110_series-hpijs.ppd.gz
new file mode 100644
index 0000000..2288e0e
--- /dev/null
+++ b/ppd/hpijs/hp-envy_110_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_1000-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_1000-hpijs.ppd.gz
new file mode 100644
index 0000000..c67ab19
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_1000-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_1005_series-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_1005_series-hpijs.ppd.gz
new file mode 100644
index 0000000..adab6a8
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_1005_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_1010-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_1010-hpijs.ppd.gz
new file mode 100644
index 0000000..0ac6254
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_1010-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_1012-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_1012-hpijs.ppd.gz
new file mode 100644
index 0000000..5e43a81
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_1012-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_1015-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_1015-hpijs.ppd.gz
new file mode 100644
index 0000000..f9235f7
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_1015-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_1018-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_1018-hpijs.ppd.gz
new file mode 100644
index 0000000..7babf50
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_1018-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_1020-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_1020-hpijs.ppd.gz
new file mode 100644
index 0000000..fcb274f
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_1020-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_1022-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_1022-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..727b847
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_1022-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_1022-hpijs-zjs.ppd.gz b/ppd/hpijs/hp-laserjet_1022-hpijs-zjs.ppd.gz
new file mode 100644
index 0000000..26422bc
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_1022-hpijs-zjs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_1022n-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_1022n-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..9485d57
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_1022n-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_1022n-hpijs-zjs.ppd.gz b/ppd/hpijs/hp-laserjet_1022n-hpijs-zjs.ppd.gz
new file mode 100644
index 0000000..c8af68f
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_1022n-hpijs-zjs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_1022nw-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_1022nw-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..36ca0e7
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_1022nw-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_1022nw-hpijs-zjs.ppd.gz b/ppd/hpijs/hp-laserjet_1022nw-hpijs-zjs.ppd.gz
new file mode 100644
index 0000000..f3ddd4e
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_1022nw-hpijs-zjs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_1100-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_1100-hpijs.ppd.gz
new file mode 100644
index 0000000..6ccc4a7
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_1100-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_1100a-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_1100a-hpijs.ppd.gz
new file mode 100644
index 0000000..85891fd
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_1100a-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_1100xi-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_1100xi-hpijs.ppd.gz
new file mode 100644
index 0000000..ce8773b
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_1100xi-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_1150-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_1150-hpijs.ppd.gz
new file mode 100644
index 0000000..52132c0
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_1150-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_1160-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_1160-hpijs.ppd.gz
new file mode 100644
index 0000000..7a06960
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_1160-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_1160_series-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_1160_series-hpijs.ppd.gz
new file mode 100644
index 0000000..0ec82de
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_1160_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_1200-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_1200-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..1371aac
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_1200-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_1200n-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_1200n-hpijs.ppd.gz
new file mode 100644
index 0000000..8e1dc3f
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_1200n-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_1220-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_1220-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..27f1afb
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_1220-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_1220se-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_1220se-hpijs.ppd.gz
new file mode 100644
index 0000000..4466489
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_1220se-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_1300-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_1300-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..77b7207
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_1300-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_1300n-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_1300n-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..9254785
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_1300n-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_1300xi-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_1300xi-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..6fbe46f
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_1300xi-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_1320-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_1320-hpijs.ppd.gz
new file mode 100644
index 0000000..d78cde0
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_1320-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_1320_series-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_1320_series-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..f94aeb8
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_1320_series-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_1320n-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_1320n-hpijs.ppd.gz
new file mode 100644
index 0000000..eaee0f7
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_1320n-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_1320nw-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_1320nw-hpijs.ppd.gz
new file mode 100644
index 0000000..b6a80f6
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_1320nw-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_1320tn-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_1320tn-hpijs.ppd.gz
new file mode 100644
index 0000000..bc917e9
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_1320tn-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_2100-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_2100-hpijs.ppd.gz
new file mode 100644
index 0000000..208665c
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_2100-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_2100_series-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_2100_series-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..bc8b0e1
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_2100_series-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_2200-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_2200-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..5fedbca
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_2200-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_2200_series-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_2200_series-hpijs.ppd.gz
new file mode 100644
index 0000000..edacf9f
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_2200_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_2300-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_2300-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..6a5e595
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_2300-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_2300_series-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_2300_series-hpijs.ppd.gz
new file mode 100644
index 0000000..9392136
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_2300_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_2410-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_2410-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..e88fd81
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_2410-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_2420-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_2420-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..a9fabb1
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_2420-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_2430-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_2430-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..fc28d13
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_2430-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_3015-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_3015-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..b7d1beb
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_3015-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_3020-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_3020-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..cc835cd
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_3020-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_3030-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_3030-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..be96543
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_3030-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_3050-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_3050-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..d98c332
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_3050-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_3052-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_3052-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..2f3808d
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_3052-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_3055-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_3055-hpijs.ppd.gz
new file mode 100644
index 0000000..e47ff3f
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_3055-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_3100-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_3100-hpijs.ppd.gz
new file mode 100644
index 0000000..b4fc85a
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_3100-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_3150-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_3150-hpijs.ppd.gz
new file mode 100644
index 0000000..62da91c
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_3150-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_3200-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_3200-hpijs.ppd.gz
new file mode 100644
index 0000000..b101d1b
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_3200-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_3200m-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_3200m-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..aa58593
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_3200m-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_3200se-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_3200se-hpijs.ppd.gz
new file mode 100644
index 0000000..5bab326
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_3200se-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_3300_3310_3320-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_3300_3310_3320-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..8dfc3f1
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_3300_3310_3320-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_3330-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_3330-hpijs.ppd.gz
new file mode 100644
index 0000000..9faf5ee
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_3330-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_3380-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_3380-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..4f26fe1
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_3380-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_3390-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_3390-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..7de5f82
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_3390-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_3392-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_3392-hpijs.ppd.gz
new file mode 100644
index 0000000..9f86fc5
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_3392-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_4000_series-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_4000_series-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..f45f13a
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_4000_series-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_4050_series-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_4050_series-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..b4ee507
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_4050_series-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_4100_mfp-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_4100_mfp-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..db962f9
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_4100_mfp-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_4100_series-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_4100_series-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..0b52b5a
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_4100_series-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_4150_series-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_4150_series-hpijs.ppd.gz
new file mode 100644
index 0000000..1dc3d84
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_4150_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_4200-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_4200-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..9d4fb4e
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_4200-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_4240-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_4240-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..7c0ca91
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_4240-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_4250-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_4250-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..5a55cd2
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_4250-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_4300-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_4300-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..7795abb
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_4300-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_4345_mfp-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_4345_mfp-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..f67ceb7
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_4345_mfp-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_4350-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_4350-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..1ad8893
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_4350-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_4_plus-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_4_plus-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..318049b
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_4_plus-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_4l-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_4l-hpijs.ppd.gz
new file mode 100644
index 0000000..f1221be
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_4l-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_4ml-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_4ml-hpijs.ppd.gz
new file mode 100644
index 0000000..2265f14
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_4ml-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_4mp-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_4mp-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..169f380
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_4mp-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_4si-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_4si-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..f825e57
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_4si-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_4v-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_4v-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..01f78f1
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_4v-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_5000-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_5000-hpijs.ppd.gz
new file mode 100644
index 0000000..21174d8
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_5000-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_5000_series-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_5000_series-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..7baf078
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_5000_series-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_5100_series-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_5100_series-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..80e4be2
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_5100_series-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_5200-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_5200-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..9b278bc
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_5200-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_5200l-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_5200l-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..ec0a270
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_5200l-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_5200lx-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_5200lx-hpijs.ppd.gz
new file mode 100644
index 0000000..7dab204
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_5200lx-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_5l-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_5l-hpijs.ppd.gz
new file mode 100644
index 0000000..955259b
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_5l-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_5mp-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_5mp-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..1fc0907
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_5mp-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_5p-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_5p-hpijs.ppd.gz
new file mode 100644
index 0000000..13073a2
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_5p-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_5si-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_5si-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..90cc7ab
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_5si-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_5si_mopier-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_5si_mopier-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..6e4f9b1
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_5si_mopier-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_6l-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_6l-hpijs.ppd.gz
new file mode 100644
index 0000000..ccaaa3e
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_6l-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_6mp-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_6mp-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..04677d9
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_6mp-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_6p-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_6p-hpijs.ppd.gz
new file mode 100644
index 0000000..de593b1
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_6p-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_8000-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_8000-hpijs.ppd.gz
new file mode 100644
index 0000000..565efb8
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_8000-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_8000_series-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_8000_series-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..bc5b33c
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_8000_series-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_8100_mfp-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_8100_mfp-hpijs.ppd.gz
new file mode 100644
index 0000000..8711f47
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_8100_mfp-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_8100_series-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_8100_series-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..038480b
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_8100_series-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_8150_mfp-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_8150_mfp-hpijs.ppd.gz
new file mode 100644
index 0000000..0e87d22
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_8150_mfp-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_8150_series-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_8150_series-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..cd5e038
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_8150_series-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_9000_mfp-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_9000_mfp-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..1c5571c
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_9000_mfp-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_9000_series-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_9000_series-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..fa4ecd1
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_9000_series-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_9040-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_9040-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..8b1fc73
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_9040-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_9040_mfp-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_9040_mfp-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..1476237
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_9040_mfp-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_9050-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_9050-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..2089bb1
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_9050-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_9050_mfp-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_9050_mfp-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..8cf28ea
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_9050_mfp-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_9055mfp-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_9055mfp-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..a83a5a0
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_9055mfp-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_9065mfp-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_9065mfp-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..5713660
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_9065mfp-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_cm1411fn-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_cm1411fn-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..289048d
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_cm1411fn-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_cm1412fn-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_cm1412fn-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..715cff5
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_cm1412fn-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_cm1413fn-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_cm1413fn-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..9f2d0d9
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_cm1413fn-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_cm1415fn-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_cm1415fn-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..50a2bee
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_cm1415fn-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_cm1415fnw-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_cm1415fnw-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..04ec74f
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_cm1415fnw-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_cm1416fnw-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_cm1416fnw-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..4715597
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_cm1416fnw-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_cm1417fnw-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_cm1417fnw-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..aadbe67
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_cm1417fnw-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_cm1418fnw-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_cm1418fnw-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..c1ab8e1
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_cm1418fnw-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_cp1025-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_cp1025-hpijs.ppd.gz
new file mode 100644
index 0000000..f9e87aa
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_cp1025-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_cp1025nw-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_cp1025nw-hpijs.ppd.gz
new file mode 100644
index 0000000..b7726fb
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_cp1025nw-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_cp_1025-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_cp_1025-hpijs.ppd.gz
new file mode 100644
index 0000000..2d8de74
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_cp_1025-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_cp_1025nw-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_cp_1025nw-hpijs.ppd.gz
new file mode 100644
index 0000000..00c0925
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_cp_1025nw-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_m1005-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_m1005-hpijs.ppd.gz
new file mode 100644
index 0000000..69b27a8
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_m1005-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_m1120_mfp-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_m1120_mfp-hpijs.ppd.gz
new file mode 100644
index 0000000..ceacab3
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_m1120_mfp-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_m1120n_mfp-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_m1120n_mfp-hpijs.ppd.gz
new file mode 100644
index 0000000..53a7887
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_m1120n_mfp-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_m1319f_mfp-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_m1319f_mfp-hpijs.ppd.gz
new file mode 100644
index 0000000..1efcb6f
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_m1319f_mfp-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_m1522nf_mfp-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_m1522nf_mfp-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..a0a9f40
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_m1522nf_mfp-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_m1536dnf_mfp-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_m1536dnf_mfp-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..dc46a84
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_m1536dnf_mfp-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_m1537dnf_mfp-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_m1537dnf_mfp-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..9d4b70e
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_m1537dnf_mfp-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_m1538dnf_mfp-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_m1538dnf_mfp-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..da6af51
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_m1538dnf_mfp-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_m1539dnf_mfp-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_m1539dnf_mfp-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..9bcb61f
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_m1539dnf_mfp-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_m2727_mfp-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_m2727_mfp-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..739e1c5
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_m2727_mfp-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_m3027_mfp-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_m3027_mfp-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..4614d1e
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_m3027_mfp-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_m3035_mfp-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_m3035_mfp-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..2b9f515
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_m3035_mfp-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_m4345_mfp-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_m4345_mfp-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..66a6c1f
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_m4345_mfp-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_m4349_mfp-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_m4349_mfp-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..ad5d2df
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_m4349_mfp-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_m5025_mfp-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_m5025_mfp-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..99eb40b
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_m5025_mfp-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_m5035_mfp-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_m5035_mfp-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..02170cf
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_m5035_mfp-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_m5039_mfp-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_m5039_mfp-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..8592964
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_m5039_mfp-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_m9040_mfp-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_m9040_mfp-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..8e3583a
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_m9040_mfp-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_m9050_mfp-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_m9050_mfp-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..96954fa
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_m9050_mfp-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_m9059_mfp-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_m9059_mfp-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..3746470
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_m9059_mfp-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_p1005-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_p1005-hpijs.ppd.gz
new file mode 100644
index 0000000..95e7583
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_p1005-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_p1006-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_p1006-hpijs.ppd.gz
new file mode 100644
index 0000000..0e65279
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_p1006-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_p1007-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_p1007-hpijs.ppd.gz
new file mode 100644
index 0000000..67909c0
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_p1007-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_p1008-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_p1008-hpijs.ppd.gz
new file mode 100644
index 0000000..ede1663
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_p1008-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_p1009-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_p1009-hpijs.ppd.gz
new file mode 100644
index 0000000..5e5a255
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_p1009-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_p1505-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_p1505-hpijs.ppd.gz
new file mode 100644
index 0000000..bce66cd
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_p1505-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_p1505n-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_p1505n-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..efb9a73
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_p1505n-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_p1505n-hpijs-zxs.ppd.gz b/ppd/hpijs/hp-laserjet_p1505n-hpijs-zxs.ppd.gz
new file mode 100644
index 0000000..c725137
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_p1505n-hpijs-zxs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_p2014-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_p2014-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..ab58c91
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_p2014-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_p2014-hpijs-zxs.ppd.gz b/ppd/hpijs/hp-laserjet_p2014-hpijs-zxs.ppd.gz
new file mode 100644
index 0000000..37b301c
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_p2014-hpijs-zxs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_p2014n-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_p2014n-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..fb56736
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_p2014n-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_p2014n-hpijs-zxs.ppd.gz b/ppd/hpijs/hp-laserjet_p2014n-hpijs-zxs.ppd.gz
new file mode 100644
index 0000000..e00f99b
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_p2014n-hpijs-zxs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_p2015_series-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_p2015_series-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..8ed892d
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_p2015_series-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_p2015d_series-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_p2015d_series-hpijs.ppd.gz
new file mode 100644
index 0000000..e810bb3
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_p2015d_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_p2015dn_series-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_p2015dn_series-hpijs.ppd.gz
new file mode 100644
index 0000000..0f5efa1
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_p2015dn_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_p2015n_series-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_p2015n_series-hpijs.ppd.gz
new file mode 100644
index 0000000..bba8d43
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_p2015n_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_p2015x_series-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_p2015x_series-hpijs.ppd.gz
new file mode 100644
index 0000000..c7af63f
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_p2015x_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_p2035-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_p2035-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..a01a30f
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_p2035-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_p2035-hpijs-zjs.ppd.gz b/ppd/hpijs/hp-laserjet_p2035-hpijs-zjs.ppd.gz
new file mode 100644
index 0000000..ea88e75
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_p2035-hpijs-zjs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_p2035n-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_p2035n-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..f7d45e3
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_p2035n-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_p2035n-hpijs-zjs.ppd.gz b/ppd/hpijs/hp-laserjet_p2035n-hpijs-zjs.ppd.gz
new file mode 100644
index 0000000..f990400
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_p2035n-hpijs-zjs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_p2055-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_p2055-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..7365ebb
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_p2055-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_p2055d-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_p2055d-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..3e0f895
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_p2055d-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_p2055dn-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_p2055dn-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..548a6ab
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_p2055dn-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_p2055x-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_p2055x-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..0f5ea11
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_p2055x-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_p3004-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_p3004-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..5baaea5
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_p3004-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_p3005-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_p3005-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..a217172
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_p3005-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_p3010_series-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-laserjet_p3010_series-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..f960849
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_p3010_series-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_p4014-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_p4014-hpijs.ppd.gz
new file mode 100644
index 0000000..54f94ba
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_p4014-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_p4014dn-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_p4014dn-hpijs.ppd.gz
new file mode 100644
index 0000000..a961e2e
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_p4014dn-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_p4014n-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_p4014n-hpijs.ppd.gz
new file mode 100644
index 0000000..926669a
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_p4014n-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_p4015-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_p4015-hpijs.ppd.gz
new file mode 100644
index 0000000..f9953a1
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_p4015-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_p4015dn-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_p4015dn-hpijs.ppd.gz
new file mode 100644
index 0000000..2f995e9
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_p4015dn-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_p4015n-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_p4015n-hpijs.ppd.gz
new file mode 100644
index 0000000..c012b4b
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_p4015n-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_p4015tn-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_p4015tn-hpijs.ppd.gz
new file mode 100644
index 0000000..b5a0e17
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_p4015tn-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_p4015x-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_p4015x-hpijs.ppd.gz
new file mode 100644
index 0000000..4666307
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_p4015x-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_p4515-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_p4515-hpijs.ppd.gz
new file mode 100644
index 0000000..6a977b7
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_p4515-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_p4515n-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_p4515n-hpijs.ppd.gz
new file mode 100644
index 0000000..6fe8cbd
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_p4515n-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_p4515tn-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_p4515tn-hpijs.ppd.gz
new file mode 100644
index 0000000..70d84d5
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_p4515tn-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_p4515x-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_p4515x-hpijs.ppd.gz
new file mode 100644
index 0000000..3a52ad3
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_p4515x-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_p4515xm-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_p4515xm-hpijs.ppd.gz
new file mode 100644
index 0000000..3ecfd52
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_p4515xm-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_professional_m1132_mfp-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_professional_m1132_mfp-hpijs.ppd.gz
new file mode 100644
index 0000000..7d39f97
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_professional_m1132_mfp-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_professional_m1136_mfp-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_professional_m1136_mfp-hpijs.ppd.gz
new file mode 100644
index 0000000..5b982fd
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_professional_m1136_mfp-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_professional_m1212nf_mfp-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_professional_m1212nf_mfp-hpijs.ppd.gz
new file mode 100644
index 0000000..cec7b68
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_professional_m1212nf_mfp-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_professional_m1213nf_mfp-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_professional_m1213nf_mfp-hpijs.ppd.gz
new file mode 100644
index 0000000..6b3dc9f
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_professional_m1213nf_mfp-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_professional_m1214nfh_mfp-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_professional_m1214nfh_mfp-hpijs.ppd.gz
new file mode 100644
index 0000000..bf63e44
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_professional_m1214nfh_mfp-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_professional_m1216nfh_mfp-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_professional_m1216nfh_mfp-hpijs.ppd.gz
new file mode 100644
index 0000000..6a52ea2
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_professional_m1216nfh_mfp-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_professional_m1217nfw_mfp-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_professional_m1217nfw_mfp-hpijs.ppd.gz
new file mode 100644
index 0000000..001f2a5
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_professional_m1217nfw_mfp-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_professional_m1219nf_mfp-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_professional_m1219nf_mfp-hpijs.ppd.gz
new file mode 100644
index 0000000..79118d3
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_professional_m1219nf_mfp-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_professional_p1102-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_professional_p1102-hpijs.ppd.gz
new file mode 100644
index 0000000..11a3b1a
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_professional_p1102-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_professional_p1102w-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_professional_p1102w-hpijs.ppd.gz
new file mode 100644
index 0000000..66bd63d
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_professional_p1102w-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_professional_p1106-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_professional_p1106-hpijs.ppd.gz
new file mode 100644
index 0000000..1a19141
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_professional_p1106-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_professional_p1108-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_professional_p1108-hpijs.ppd.gz
new file mode 100644
index 0000000..3d34cd9
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_professional_p1108-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_professional_p1566-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_professional_p1566-hpijs.ppd.gz
new file mode 100644
index 0000000..c801dfb
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_professional_p1566-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_professional_p1606dn-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_professional_p1606dn-hpijs.ppd.gz
new file mode 100644
index 0000000..3745b4a
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_professional_p1606dn-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-laserjet_professional_p_1102w-hpijs.ppd.gz b/ppd/hpijs/hp-laserjet_professional_p_1102w-hpijs.ppd.gz
new file mode 100644
index 0000000..bdef1f3
--- /dev/null
+++ b/ppd/hpijs/hp-laserjet_professional_p_1102w-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-mopier_240-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-mopier_240-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..c29e140
--- /dev/null
+++ b/ppd/hpijs/hp-mopier_240-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-mopier_320-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-mopier_320-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..35a98a7
--- /dev/null
+++ b/ppd/hpijs/hp-mopier_320-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet-hpijs.ppd.gz b/ppd/hpijs/hp-officejet-hpijs.ppd.gz
new file mode 100644
index 0000000..eb39cc3
--- /dev/null
+++ b/ppd/hpijs/hp-officejet-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_100_mobile_l411-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_100_mobile_l411-hpijs.ppd.gz
new file mode 100644
index 0000000..5f9316d
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_100_mobile_l411-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_4000_k210-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_4000_k210-hpijs.ppd.gz
new file mode 100644
index 0000000..4e244c3
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_4000_k210-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_4100_series-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_4100_series-hpijs.ppd.gz
new file mode 100644
index 0000000..8f70964
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_4100_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_4105-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_4105-hpijs.ppd.gz
new file mode 100644
index 0000000..905bebd
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_4105-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_4115_series-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_4115_series-hpijs.ppd.gz
new file mode 100644
index 0000000..b31a111
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_4115_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_4200_series-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_4200_series-hpijs.ppd.gz
new file mode 100644
index 0000000..fc4f66b
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_4200_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_4255-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_4255-hpijs.ppd.gz
new file mode 100644
index 0000000..1cfed92
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_4255-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_4300_series-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_4300_series-hpijs.ppd.gz
new file mode 100644
index 0000000..d074d49
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_4300_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_4400_k410-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_4400_k410-hpijs.ppd.gz
new file mode 100644
index 0000000..e1605f2
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_4400_k410-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_4500_g510a-f-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_4500_g510a-f-hpijs.ppd.gz
new file mode 100644
index 0000000..cb91b50
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_4500_g510a-f-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_4500_g510g-m-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_4500_g510g-m-hpijs.ppd.gz
new file mode 100644
index 0000000..3a17375
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_4500_g510g-m-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_4500_g510n-z-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_4500_g510n-z-hpijs.ppd.gz
new file mode 100644
index 0000000..df85c80
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_4500_g510n-z-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_4500_k710-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_4500_k710-hpijs.ppd.gz
new file mode 100644
index 0000000..7d3792a
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_4500_k710-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_5100_series-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_5100_series-hpijs.ppd.gz
new file mode 100644
index 0000000..850a35e
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_5100_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_5105-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_5105-hpijs.ppd.gz
new file mode 100644
index 0000000..594e91c
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_5105-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_5110-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_5110-hpijs.ppd.gz
new file mode 100644
index 0000000..b02773d
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_5110-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_5110v-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_5110v-hpijs.ppd.gz
new file mode 100644
index 0000000..c05677a
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_5110v-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_5500_series-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_5500_series-hpijs.ppd.gz
new file mode 100644
index 0000000..cc8f3e8
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_5500_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_5600_series-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_5600_series-hpijs.ppd.gz
new file mode 100644
index 0000000..a48bd86
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_5600_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_6000_e609a-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_6000_e609a-hpijs.ppd.gz
new file mode 100644
index 0000000..472f96c
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_6000_e609a-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_6000_e609n-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_6000_e609n-hpijs.ppd.gz
new file mode 100644
index 0000000..db8539e
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_6000_e609n-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_6100-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_6100-hpijs.ppd.gz
new file mode 100644
index 0000000..60a89a6
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_6100-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_6100_series-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_6100_series-hpijs.ppd.gz
new file mode 100644
index 0000000..3eedd77
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_6100_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_6150_series-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_6150_series-hpijs.ppd.gz
new file mode 100644
index 0000000..050a6bd
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_6150_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_6200_series-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_6200_series-hpijs.ppd.gz
new file mode 100644
index 0000000..088962d
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_6200_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_6300_series-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_6300_series-hpijs.ppd.gz
new file mode 100644
index 0000000..0458923
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_6300_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_6500_e709a-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_6500_e709a-hpijs.ppd.gz
new file mode 100644
index 0000000..ec8fdf1
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_6500_e709a-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_6500_e709n-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_6500_e709n-hpijs.ppd.gz
new file mode 100644
index 0000000..ad8f793
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_6500_e709n-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_6500_e710a-f-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_6500_e710a-f-hpijs.ppd.gz
new file mode 100644
index 0000000..6ecc290
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_6500_e710a-f-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_6500_e710n-z-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_6500_e710n-z-hpijs.ppd.gz
new file mode 100644
index 0000000..52513e7
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_6500_e710n-z-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_6600-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_6600-hpijs.ppd.gz
new file mode 100644
index 0000000..d190e04
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_6600-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_6700-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_6700-hpijs.ppd.gz
new file mode 100644
index 0000000..48f93ef
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_6700-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_7000_e809a-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_7000_e809a-hpijs.ppd.gz
new file mode 100644
index 0000000..284d942
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_7000_e809a-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_7000_e809a_series-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_7000_e809a_series-hpijs.ppd.gz
new file mode 100644
index 0000000..3463f59
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_7000_e809a_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_7100_series-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_7100_series-hpijs.ppd.gz
new file mode 100644
index 0000000..4730064
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_7100_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_7200_series-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_7200_series-hpijs.ppd.gz
new file mode 100644
index 0000000..6ca811e
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_7200_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_7300_series-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_7300_series-hpijs.ppd.gz
new file mode 100644
index 0000000..b9de130
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_7300_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_7400_series-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_7400_series-hpijs.ppd.gz
new file mode 100644
index 0000000..5264c60
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_7400_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_7500_e910-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_7500_e910-hpijs.ppd.gz
new file mode 100644
index 0000000..1eab04a
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_7500_e910-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_9100_series-hpijs-pcl3.ppd.gz b/ppd/hpijs/hp-officejet_9100_series-hpijs-pcl3.ppd.gz
new file mode 100644
index 0000000..e7e7499
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_9100_series-hpijs-pcl3.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_d_series-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_d_series-hpijs.ppd.gz
new file mode 100644
index 0000000..695a304
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_d_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_g55-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_g55-hpijs.ppd.gz
new file mode 100644
index 0000000..fdbe4f6
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_g55-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_g55xi-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_g55xi-hpijs.ppd.gz
new file mode 100644
index 0000000..a2219c8
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_g55xi-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_g85-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_g85-hpijs.ppd.gz
new file mode 100644
index 0000000..8e8ba79
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_g85-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_g85xi-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_g85xi-hpijs.ppd.gz
new file mode 100644
index 0000000..db04719
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_g85xi-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_g95-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_g95-hpijs.ppd.gz
new file mode 100644
index 0000000..f4756ff
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_g95-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_h470-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_h470-hpijs.ppd.gz
new file mode 100644
index 0000000..16a814e
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_h470-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_j3500_series-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_j3500_series-hpijs.ppd.gz
new file mode 100644
index 0000000..b7e0951
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_j3500_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_j3600_series-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_j3600_series-hpijs.ppd.gz
new file mode 100644
index 0000000..aec75d8
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_j3600_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_j4500_series-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_j4500_series-hpijs.ppd.gz
new file mode 100644
index 0000000..4710d60
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_j4500_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_j4660_series-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_j4660_series-hpijs.ppd.gz
new file mode 100644
index 0000000..9d4995c
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_j4660_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_j4680_series-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_j4680_series-hpijs.ppd.gz
new file mode 100644
index 0000000..0f29d2f
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_j4680_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_j5500_series-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_j5500_series-hpijs.ppd.gz
new file mode 100644
index 0000000..3eaeeea
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_j5500_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_j5700_series-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_j5700_series-hpijs.ppd.gz
new file mode 100644
index 0000000..d086e74
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_j5700_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_j6400_series-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_j6400_series-hpijs.ppd.gz
new file mode 100644
index 0000000..bed87b2
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_j6400_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_k60-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_k60-hpijs.ppd.gz
new file mode 100644
index 0000000..6f0b5a9
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_k60-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_k60xi-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_k60xi-hpijs.ppd.gz
new file mode 100644
index 0000000..fe0ab95
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_k60xi-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_k7100-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_k7100-hpijs.ppd.gz
new file mode 100644
index 0000000..7e8062b
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_k7100-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_k80-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_k80-hpijs.ppd.gz
new file mode 100644
index 0000000..0916677
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_k80-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_k80xi-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_k80xi-hpijs.ppd.gz
new file mode 100644
index 0000000..b6fb3fd
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_k80xi-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_lx-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_lx-hpijs.ppd.gz
new file mode 100644
index 0000000..0e36663
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_lx-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_pro_1150c-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_pro_1150c-hpijs.ppd.gz
new file mode 100644
index 0000000..cfec55f
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_pro_1150c-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_pro_1170c_series-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_pro_1170c_series-hpijs.ppd.gz
new file mode 100644
index 0000000..9cab325
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_pro_1170c_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_pro_8000_a809-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_pro_8000_a809-hpijs.ppd.gz
new file mode 100644
index 0000000..5d28c95
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_pro_8000_a809-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_pro_8100-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_pro_8100-hpijs.ppd.gz
new file mode 100644
index 0000000..85d61e3
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_pro_8100-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_pro_8500_a909a-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_pro_8500_a909a-hpijs.ppd.gz
new file mode 100644
index 0000000..faeb427
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_pro_8500_a909a-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_pro_8500_a909g-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_pro_8500_a909g-hpijs.ppd.gz
new file mode 100644
index 0000000..ad13c83
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_pro_8500_a909g-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_pro_8500_a909n-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_pro_8500_a909n-hpijs.ppd.gz
new file mode 100644
index 0000000..dd1e02e
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_pro_8500_a909n-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_pro_8500_a910-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_pro_8500_a910-hpijs.ppd.gz
new file mode 100644
index 0000000..d1da111
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_pro_8500_a910-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_pro_8600-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_pro_8600-hpijs.ppd.gz
new file mode 100644
index 0000000..a930eb3
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_pro_8600-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_pro_k5300-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_pro_k5300-hpijs.ppd.gz
new file mode 100644
index 0000000..7b4cdfa
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_pro_k5300-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_pro_k5400-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_pro_k5400-hpijs.ppd.gz
new file mode 100644
index 0000000..54829f0
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_pro_k5400-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_pro_k550-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_pro_k550-hpijs.ppd.gz
new file mode 100644
index 0000000..a100234
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_pro_k550-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_pro_k850-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_pro_k850-hpijs.ppd.gz
new file mode 100644
index 0000000..798baed
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_pro_k850-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_pro_k8600-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_pro_k8600-hpijs.ppd.gz
new file mode 100644
index 0000000..7e74688
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_pro_k8600-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_pro_l7300-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_pro_l7300-hpijs.ppd.gz
new file mode 100644
index 0000000..5141659
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_pro_l7300-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_pro_l7400-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_pro_l7400-hpijs.ppd.gz
new file mode 100644
index 0000000..493648c
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_pro_l7400-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_pro_l7500-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_pro_l7500-hpijs.ppd.gz
new file mode 100644
index 0000000..d3847d4
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_pro_l7500-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_pro_l7600-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_pro_l7600-hpijs.ppd.gz
new file mode 100644
index 0000000..3770909
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_pro_l7600-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_pro_l7700-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_pro_l7700-hpijs.ppd.gz
new file mode 100644
index 0000000..9ba6856
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_pro_l7700-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_r40-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_r40-hpijs.ppd.gz
new file mode 100644
index 0000000..f01a912
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_r40-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_r40xi-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_r40xi-hpijs.ppd.gz
new file mode 100644
index 0000000..8d67120
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_r40xi-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_r45-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_r45-hpijs.ppd.gz
new file mode 100644
index 0000000..a18ac35
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_r45-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_r60-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_r60-hpijs.ppd.gz
new file mode 100644
index 0000000..40296be
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_r60-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_r65-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_r65-hpijs.ppd.gz
new file mode 100644
index 0000000..2bbce8f
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_r65-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_r80-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_r80-hpijs.ppd.gz
new file mode 100644
index 0000000..2e22019
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_r80-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_r80xi-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_r80xi-hpijs.ppd.gz
new file mode 100644
index 0000000..e12deeb
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_r80xi-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_series_300-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_series_300-hpijs.ppd.gz
new file mode 100644
index 0000000..da3b7d8
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_series_300-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_series_310-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_series_310-hpijs.ppd.gz
new file mode 100644
index 0000000..7f5a96e
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_series_310-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_series_320-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_series_320-hpijs.ppd.gz
new file mode 100644
index 0000000..475d117
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_series_320-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_series_330-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_series_330-hpijs.ppd.gz
new file mode 100644
index 0000000..5e70972
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_series_330-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_series_350-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_series_350-hpijs.ppd.gz
new file mode 100644
index 0000000..50a827f
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_series_350-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_series_520-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_series_520-hpijs.ppd.gz
new file mode 100644
index 0000000..9ea770d
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_series_520-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_series_570-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_series_570-hpijs.ppd.gz
new file mode 100644
index 0000000..04de475
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_series_570-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_series_580-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_series_580-hpijs.ppd.gz
new file mode 100644
index 0000000..b60f92b
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_series_580-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_series_590-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_series_590-hpijs.ppd.gz
new file mode 100644
index 0000000..c186471
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_series_590-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_series_600-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_series_600-hpijs.ppd.gz
new file mode 100644
index 0000000..73aabfa
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_series_600-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_series_610-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_series_610-hpijs.ppd.gz
new file mode 100644
index 0000000..2a65617
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_series_610-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_series_630-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_series_630-hpijs.ppd.gz
new file mode 100644
index 0000000..1126aa6
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_series_630-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_series_700-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_series_700-hpijs.ppd.gz
new file mode 100644
index 0000000..b749fa5
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_series_700-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_series_710-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_series_710-hpijs.ppd.gz
new file mode 100644
index 0000000..dfe9fed
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_series_710-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_series_720-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_series_720-hpijs.ppd.gz
new file mode 100644
index 0000000..7173385
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_series_720-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_series_725-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_series_725-hpijs.ppd.gz
new file mode 100644
index 0000000..1afe7a8
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_series_725-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_t_series-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_t_series-hpijs.ppd.gz
new file mode 100644
index 0000000..2e37bc4
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_t_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_v30-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_v30-hpijs.ppd.gz
new file mode 100644
index 0000000..8b8c1f4
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_v30-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_v40-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_v40-hpijs.ppd.gz
new file mode 100644
index 0000000..a64b2f2
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_v40-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_v40xi-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_v40xi-hpijs.ppd.gz
new file mode 100644
index 0000000..b4747e6
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_v40xi-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-officejet_v45-hpijs.ppd.gz b/ppd/hpijs/hp-officejet_v45-hpijs.ppd.gz
new file mode 100644
index 0000000..dc61264
--- /dev/null
+++ b/ppd/hpijs/hp-officejet_v45-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_100-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_100-hpijs.ppd.gz
new file mode 100644
index 0000000..ccde1f1
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_100-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_1115-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_1115-hpijs.ppd.gz
new file mode 100644
index 0000000..8949103
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_1115-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_1215-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_1215-hpijs.ppd.gz
new file mode 100644
index 0000000..e33f2e4
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_1215-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_1218-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_1218-hpijs.ppd.gz
new file mode 100644
index 0000000..6d11617
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_1218-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_130-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_130-hpijs.ppd.gz
new file mode 100644
index 0000000..0d41ca9
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_130-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_1315-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_1315-hpijs.ppd.gz
new file mode 100644
index 0000000..5527870
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_1315-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_140_series-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_140_series-hpijs.ppd.gz
new file mode 100644
index 0000000..55fcb2d
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_140_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_230-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_230-hpijs.ppd.gz
new file mode 100644
index 0000000..f86d82b
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_230-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_240_series-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_240_series-hpijs.ppd.gz
new file mode 100644
index 0000000..7cab2da
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_240_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_2570_series-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_2570_series-hpijs.ppd.gz
new file mode 100644
index 0000000..e53367f
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_2570_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_2600_series-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_2600_series-hpijs.ppd.gz
new file mode 100644
index 0000000..01c3807
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_2600_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_2700_series-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_2700_series-hpijs.ppd.gz
new file mode 100644
index 0000000..d5a0ad7
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_2700_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_3100_series-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_3100_series-hpijs.ppd.gz
new file mode 100644
index 0000000..0c5fa8c
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_3100_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_3200_series-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_3200_series-hpijs.ppd.gz
new file mode 100644
index 0000000..97cbca5
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_3200_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_320_series-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_320_series-hpijs.ppd.gz
new file mode 100644
index 0000000..2858bf7
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_320_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_3300_series-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_3300_series-hpijs.ppd.gz
new file mode 100644
index 0000000..caff2b4
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_3300_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_330_series-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_330_series-hpijs.ppd.gz
new file mode 100644
index 0000000..a495ae3
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_330_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_370_series-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_370_series-hpijs.ppd.gz
new file mode 100644
index 0000000..db5b85a
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_370_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_380_series-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_380_series-hpijs.ppd.gz
new file mode 100644
index 0000000..4a864e5
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_380_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_420_series-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_420_series-hpijs.ppd.gz
new file mode 100644
index 0000000..61d7ee5
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_420_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_470_series-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_470_series-hpijs.ppd.gz
new file mode 100644
index 0000000..d2aa884
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_470_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_5510_series-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_5510_series-hpijs.ppd.gz
new file mode 100644
index 0000000..4a2f9ae
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_5510_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_5510d_series-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_5510d_series-hpijs.ppd.gz
new file mode 100644
index 0000000..4dc57de
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_5510d_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_6510_series-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_6510_series-hpijs.ppd.gz
new file mode 100644
index 0000000..35931ae
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_6510_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_7150-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_7150-hpijs.ppd.gz
new file mode 100644
index 0000000..5914059
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_7150-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_7200_series-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_7200_series-hpijs.ppd.gz
new file mode 100644
index 0000000..b1d14eb
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_7200_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_7345-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_7345-hpijs.ppd.gz
new file mode 100644
index 0000000..b86d306
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_7345-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_7350-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_7350-hpijs.ppd.gz
new file mode 100644
index 0000000..ecc219f
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_7350-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_7400_series-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_7400_series-hpijs.ppd.gz
new file mode 100644
index 0000000..2a654e0
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_7400_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_7510_series-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_7510_series-hpijs.ppd.gz
new file mode 100644
index 0000000..69c2a41
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_7510_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_7550-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_7550-hpijs.ppd.gz
new file mode 100644
index 0000000..85736de
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_7550-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_7600_series-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_7600_series-hpijs.ppd.gz
new file mode 100644
index 0000000..d2ae93b
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_7600_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_7700_series-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_7700_series-hpijs.ppd.gz
new file mode 100644
index 0000000..98bdb99
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_7700_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_7800_series-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_7800_series-hpijs.ppd.gz
new file mode 100644
index 0000000..d5afe20
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_7800_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_7900_series-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_7900_series-hpijs.ppd.gz
new file mode 100644
index 0000000..6867007
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_7900_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_8000_series-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_8000_series-hpijs.ppd.gz
new file mode 100644
index 0000000..2fe4ae5
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_8000_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_8100_series-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_8100_series-hpijs.ppd.gz
new file mode 100644
index 0000000..6e8b9b1
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_8100_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_8200_series-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_8200_series-hpijs.ppd.gz
new file mode 100644
index 0000000..3143c6b
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_8200_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_8400_series-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_8400_series-hpijs.ppd.gz
new file mode 100644
index 0000000..120a461
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_8400_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_8700_series-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_8700_series-hpijs.ppd.gz
new file mode 100644
index 0000000..394f507
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_8700_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_a310_series-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_a310_series-hpijs.ppd.gz
new file mode 100644
index 0000000..b285770
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_a310_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_a320_series-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_a320_series-hpijs.ppd.gz
new file mode 100644
index 0000000..25b90ba
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_a320_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_a430_series-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_a430_series-hpijs.ppd.gz
new file mode 100644
index 0000000..d80c0fc
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_a430_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_a440_series-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_a440_series-hpijs.ppd.gz
new file mode 100644
index 0000000..4e4e739
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_a440_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_a510_series-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_a510_series-hpijs.ppd.gz
new file mode 100644
index 0000000..4e1f34c
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_a510_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_a520_series-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_a520_series-hpijs.ppd.gz
new file mode 100644
index 0000000..1894a07
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_a520_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_a530_series-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_a530_series-hpijs.ppd.gz
new file mode 100644
index 0000000..30d5335
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_a530_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_a610_series-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_a610_series-hpijs.ppd.gz
new file mode 100644
index 0000000..5ad2ad1
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_a610_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_a620_series-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_a620_series-hpijs.ppd.gz
new file mode 100644
index 0000000..7bdf70e
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_a620_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_a630_series-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_a630_series-hpijs.ppd.gz
new file mode 100644
index 0000000..3bb3071
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_a630_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_a640_series-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_a640_series-hpijs.ppd.gz
new file mode 100644
index 0000000..aba45e7
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_a640_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_a710_series-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_a710_series-hpijs.ppd.gz
new file mode 100644
index 0000000..bb0036d
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_a710_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_a820_series-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_a820_series-hpijs.ppd.gz
new file mode 100644
index 0000000..80a4dae
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_a820_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_b010_series-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_b010_series-hpijs.ppd.gz
new file mode 100644
index 0000000..f4e47e9
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_b010_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_b109a-m-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_b109a-m-hpijs.ppd.gz
new file mode 100644
index 0000000..39588b6
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_b109a-m-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_b109a_series-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_b109a_series-hpijs.ppd.gz
new file mode 100644
index 0000000..1774fe3
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_b109a_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_b110_series-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_b110_series-hpijs.ppd.gz
new file mode 100644
index 0000000..4198572
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_b110_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_b8500_series-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_b8500_series-hpijs.ppd.gz
new file mode 100644
index 0000000..0d46cd0
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_b8500_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_c309a_series-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_c309a_series-hpijs.ppd.gz
new file mode 100644
index 0000000..916fd10
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_c309a_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_c3100_series-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_c3100_series-hpijs.ppd.gz
new file mode 100644
index 0000000..fa7b3d3
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_c3100_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_c4100_series-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_c4100_series-hpijs.ppd.gz
new file mode 100644
index 0000000..1918a46
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_c4100_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_c4200_series-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_c4200_series-hpijs.ppd.gz
new file mode 100644
index 0000000..ecee6d0
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_c4200_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_c4340_series-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_c4340_series-hpijs.ppd.gz
new file mode 100644
index 0000000..68bf16d
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_c4340_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_c4380_series-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_c4380_series-hpijs.ppd.gz
new file mode 100644
index 0000000..96d53b3
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_c4380_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_c4400_series-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_c4400_series-hpijs.ppd.gz
new file mode 100644
index 0000000..cf6f148
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_c4400_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_c4500_series-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_c4500_series-hpijs.ppd.gz
new file mode 100644
index 0000000..a494633
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_c4500_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_c4600_series-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_c4600_series-hpijs.ppd.gz
new file mode 100644
index 0000000..fb8e5e7
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_c4600_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_c4700_series-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_c4700_series-hpijs.ppd.gz
new file mode 100644
index 0000000..648ac56
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_c4700_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_c5100_series-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_c5100_series-hpijs.ppd.gz
new file mode 100644
index 0000000..bec6940
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_c5100_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_c5200_series-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_c5200_series-hpijs.ppd.gz
new file mode 100644
index 0000000..99f9179
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_c5200_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_c5300_series-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_c5300_series-hpijs.ppd.gz
new file mode 100644
index 0000000..2b49dc2
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_c5300_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_c5500_series-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_c5500_series-hpijs.ppd.gz
new file mode 100644
index 0000000..e0048df
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_c5500_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_c6100_series-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_c6100_series-hpijs.ppd.gz
new file mode 100644
index 0000000..03f2f0a
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_c6100_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_c6200_series-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_c6200_series-hpijs.ppd.gz
new file mode 100644
index 0000000..1284886
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_c6200_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_c6300_series-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_c6300_series-hpijs.ppd.gz
new file mode 100644
index 0000000..1cea1da
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_c6300_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_c7100_series-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_c7100_series-hpijs.ppd.gz
new file mode 100644
index 0000000..f7b7dff
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_c7100_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_c7200_series-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_c7200_series-hpijs.ppd.gz
new file mode 100644
index 0000000..2039c01
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_c7200_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_c8100_series-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_c8100_series-hpijs.ppd.gz
new file mode 100644
index 0000000..a5a690b
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_c8100_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_d110_series-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_d110_series-hpijs.ppd.gz
new file mode 100644
index 0000000..f0365da
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_d110_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_d5060_series-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_d5060_series-hpijs.ppd.gz
new file mode 100644
index 0000000..4bbb196
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_d5060_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_d5100_series-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_d5100_series-hpijs.ppd.gz
new file mode 100644
index 0000000..014bbdc
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_d5100_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_d5300_series-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_d5300_series-hpijs.ppd.gz
new file mode 100644
index 0000000..61d3fd6
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_d5300_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_d5400_series-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_d5400_series-hpijs.ppd.gz
new file mode 100644
index 0000000..75b50cc
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_d5400_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_d6100_series-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_d6100_series-hpijs.ppd.gz
new file mode 100644
index 0000000..1ccc9c5
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_d6100_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_d7100_series-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_d7100_series-hpijs.ppd.gz
new file mode 100644
index 0000000..5af593d
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_d7100_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_d7200_series-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_d7200_series-hpijs.ppd.gz
new file mode 100644
index 0000000..69ea811
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_d7200_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_d7300_series-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_d7300_series-hpijs.ppd.gz
new file mode 100644
index 0000000..6626ce5
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_d7300_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_d7400_series-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_d7400_series-hpijs.ppd.gz
new file mode 100644
index 0000000..4d59591
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_d7400_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_d7500_series-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_d7500_series-hpijs.ppd.gz
new file mode 100644
index 0000000..405413e
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_d7500_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_estn_c510_series-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_estn_c510_series-hpijs.ppd.gz
new file mode 100644
index 0000000..2b071c7
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_estn_c510_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_ink_adv_k510-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_ink_adv_k510-hpijs.ppd.gz
new file mode 100644
index 0000000..985d29c
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_ink_adv_k510-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_p1000-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_p1000-hpijs.ppd.gz
new file mode 100644
index 0000000..a644e35
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_p1000-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_p1100-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_p1100-hpijs.ppd.gz
new file mode 100644
index 0000000..054d267
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_p1100-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_plus_b209a-m-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_plus_b209a-m-hpijs.ppd.gz
new file mode 100644
index 0000000..0488259
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_plus_b209a-m-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_plus_b210_series-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_plus_b210_series-hpijs.ppd.gz
new file mode 100644
index 0000000..74fde86
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_plus_b210_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_prem-web_c309n-s-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_prem-web_c309n-s-hpijs.ppd.gz
new file mode 100644
index 0000000..07db163
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_prem-web_c309n-s-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_prem_c310_series-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_prem_c310_series-hpijs.ppd.gz
new file mode 100644
index 0000000..a50b314
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_prem_c310_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_prem_c410_series-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_prem_c410_series-hpijs.ppd.gz
new file mode 100644
index 0000000..b2b514f
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_prem_c410_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_premium_c309g-m-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_premium_c309g-m-hpijs.ppd.gz
new file mode 100644
index 0000000..bd7d16a
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_premium_c309g-m-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_pro_b8300_series-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_pro_b8300_series-hpijs.ppd.gz
new file mode 100644
index 0000000..65f05ed
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_pro_b8300_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_pro_b8800_series-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_pro_b8800_series-hpijs.ppd.gz
new file mode 100644
index 0000000..addfa56
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_pro_b8800_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-photosmart_wireless_b109n-z-hpijs.ppd.gz b/ppd/hpijs/hp-photosmart_wireless_b109n-z-hpijs.ppd.gz
new file mode 100644
index 0000000..9535f23
--- /dev/null
+++ b/ppd/hpijs/hp-photosmart_wireless_b109n-z-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-printer_scanner_copier_300-hpijs.ppd.gz b/ppd/hpijs/hp-printer_scanner_copier_300-hpijs.ppd.gz
new file mode 100644
index 0000000..9b24d43
--- /dev/null
+++ b/ppd/hpijs/hp-printer_scanner_copier_300-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-psc_1000_series-hpijs.ppd.gz b/ppd/hpijs/hp-psc_1000_series-hpijs.ppd.gz
new file mode 100644
index 0000000..e3e36c0
--- /dev/null
+++ b/ppd/hpijs/hp-psc_1000_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-psc_1100_series-hpijs.ppd.gz b/ppd/hpijs/hp-psc_1100_series-hpijs.ppd.gz
new file mode 100644
index 0000000..712e520
--- /dev/null
+++ b/ppd/hpijs/hp-psc_1100_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-psc_1200_series-hpijs.ppd.gz b/ppd/hpijs/hp-psc_1200_series-hpijs.ppd.gz
new file mode 100644
index 0000000..99b42cc
--- /dev/null
+++ b/ppd/hpijs/hp-psc_1200_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-psc_1300_series-hpijs.ppd.gz b/ppd/hpijs/hp-psc_1300_series-hpijs.ppd.gz
new file mode 100644
index 0000000..f24245e
--- /dev/null
+++ b/ppd/hpijs/hp-psc_1300_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-psc_1310_series-hpijs.ppd.gz b/ppd/hpijs/hp-psc_1310_series-hpijs.ppd.gz
new file mode 100644
index 0000000..aefd205
--- /dev/null
+++ b/ppd/hpijs/hp-psc_1310_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-psc_1358_series-hpijs.ppd.gz b/ppd/hpijs/hp-psc_1358_series-hpijs.ppd.gz
new file mode 100644
index 0000000..4f87478
--- /dev/null
+++ b/ppd/hpijs/hp-psc_1358_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-psc_1400_series-hpijs.ppd.gz b/ppd/hpijs/hp-psc_1400_series-hpijs.ppd.gz
new file mode 100644
index 0000000..00375e2
--- /dev/null
+++ b/ppd/hpijs/hp-psc_1400_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-psc_1500_series-hpijs.ppd.gz b/ppd/hpijs/hp-psc_1500_series-hpijs.ppd.gz
new file mode 100644
index 0000000..b49397d
--- /dev/null
+++ b/ppd/hpijs/hp-psc_1500_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-psc_1510_series-hpijs.ppd.gz b/ppd/hpijs/hp-psc_1510_series-hpijs.ppd.gz
new file mode 100644
index 0000000..56e857f
--- /dev/null
+++ b/ppd/hpijs/hp-psc_1510_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-psc_1600_series-hpijs.ppd.gz b/ppd/hpijs/hp-psc_1600_series-hpijs.ppd.gz
new file mode 100644
index 0000000..46f6111
--- /dev/null
+++ b/ppd/hpijs/hp-psc_1600_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-psc_2100_series-hpijs.ppd.gz b/ppd/hpijs/hp-psc_2100_series-hpijs.ppd.gz
new file mode 100644
index 0000000..be7a966
--- /dev/null
+++ b/ppd/hpijs/hp-psc_2100_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-psc_2150_series-hpijs.ppd.gz b/ppd/hpijs/hp-psc_2150_series-hpijs.ppd.gz
new file mode 100644
index 0000000..9a5c806
--- /dev/null
+++ b/ppd/hpijs/hp-psc_2150_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-psc_2170_series-hpijs.ppd.gz b/ppd/hpijs/hp-psc_2170_series-hpijs.ppd.gz
new file mode 100644
index 0000000..b74d0f8
--- /dev/null
+++ b/ppd/hpijs/hp-psc_2170_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-psc_2200_series-hpijs.ppd.gz b/ppd/hpijs/hp-psc_2200_series-hpijs.ppd.gz
new file mode 100644
index 0000000..9e6d042
--- /dev/null
+++ b/ppd/hpijs/hp-psc_2200_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-psc_2210_series-hpijs.ppd.gz b/ppd/hpijs/hp-psc_2210_series-hpijs.ppd.gz
new file mode 100644
index 0000000..b0fee6b
--- /dev/null
+++ b/ppd/hpijs/hp-psc_2210_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-psc_2300_series-hpijs.ppd.gz b/ppd/hpijs/hp-psc_2300_series-hpijs.ppd.gz
new file mode 100644
index 0000000..41e4651
--- /dev/null
+++ b/ppd/hpijs/hp-psc_2300_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-psc_2350_series-hpijs.ppd.gz b/ppd/hpijs/hp-psc_2350_series-hpijs.ppd.gz
new file mode 100644
index 0000000..9f6128c
--- /dev/null
+++ b/ppd/hpijs/hp-psc_2350_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-psc_2400_series-hpijs.ppd.gz b/ppd/hpijs/hp-psc_2400_series-hpijs.ppd.gz
new file mode 100644
index 0000000..ba22dea
--- /dev/null
+++ b/ppd/hpijs/hp-psc_2400_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-psc_2500_series-hpijs.ppd.gz b/ppd/hpijs/hp-psc_2500_series-hpijs.ppd.gz
new file mode 100644
index 0000000..2bdcf1b
--- /dev/null
+++ b/ppd/hpijs/hp-psc_2500_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-psc_500-hpijs.ppd.gz b/ppd/hpijs/hp-psc_500-hpijs.ppd.gz
new file mode 100644
index 0000000..d9d7e8e
--- /dev/null
+++ b/ppd/hpijs/hp-psc_500-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-psc_720-hpijs.ppd.gz b/ppd/hpijs/hp-psc_720-hpijs.ppd.gz
new file mode 100644
index 0000000..ab932fb
--- /dev/null
+++ b/ppd/hpijs/hp-psc_720-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-psc_750-hpijs.ppd.gz b/ppd/hpijs/hp-psc_750-hpijs.ppd.gz
new file mode 100644
index 0000000..b6eeda8
--- /dev/null
+++ b/ppd/hpijs/hp-psc_750-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-psc_750xi-hpijs.ppd.gz b/ppd/hpijs/hp-psc_750xi-hpijs.ppd.gz
new file mode 100644
index 0000000..c23cd72
--- /dev/null
+++ b/ppd/hpijs/hp-psc_750xi-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-psc_760-hpijs.ppd.gz b/ppd/hpijs/hp-psc_760-hpijs.ppd.gz
new file mode 100644
index 0000000..712338b
--- /dev/null
+++ b/ppd/hpijs/hp-psc_760-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-psc_780-hpijs.ppd.gz b/ppd/hpijs/hp-psc_780-hpijs.ppd.gz
new file mode 100644
index 0000000..c2b3ba4
--- /dev/null
+++ b/ppd/hpijs/hp-psc_780-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-psc_780xi-hpijs.ppd.gz b/ppd/hpijs/hp-psc_780xi-hpijs.ppd.gz
new file mode 100644
index 0000000..d5d80a9
--- /dev/null
+++ b/ppd/hpijs/hp-psc_780xi-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-psc_900_series-hpijs.ppd.gz b/ppd/hpijs/hp-psc_900_series-hpijs.ppd.gz
new file mode 100644
index 0000000..4773e41
--- /dev/null
+++ b/ppd/hpijs/hp-psc_900_series-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-psc_920-hpijs.ppd.gz b/ppd/hpijs/hp-psc_920-hpijs.ppd.gz
new file mode 100644
index 0000000..fa4b246
--- /dev/null
+++ b/ppd/hpijs/hp-psc_920-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-psc_950-hpijs.ppd.gz b/ppd/hpijs/hp-psc_950-hpijs.ppd.gz
new file mode 100644
index 0000000..52e39db
--- /dev/null
+++ b/ppd/hpijs/hp-psc_950-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-psc_950vr-hpijs.ppd.gz b/ppd/hpijs/hp-psc_950vr-hpijs.ppd.gz
new file mode 100644
index 0000000..89dcb60
--- /dev/null
+++ b/ppd/hpijs/hp-psc_950vr-hpijs.ppd.gz
Binary files differ
diff --git a/ppd/hpijs/hp-psc_950xi-hpijs.ppd.gz b/ppd/hpijs/hp-psc_950xi-hpijs.ppd.gz
new file mode 100644
index 0000000..68bc491
--- /dev/null
+++ b/ppd/hpijs/hp-psc_950xi-hpijs.ppd.gz
Binary files differ
diff --git a/pqdiag.py b/pqdiag.py
new file mode 100755
index 0000000..c59bb73
--- /dev/null
+++ b/pqdiag.py
@@ -0,0 +1,82 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2009 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+__version__ = '1.0'
+__mod__ = 'hp-pqdiag'
+__title__ = 'Print Quality Diagnostic Utility'
+__doc__ = "Print quality diagnostic utility for HPLIP supported inkjet printers. (Note: Most printers do not require the use of this utility)."
+
+#Std Lib
+import sys
+import re
+import getopt
+import time
+import operator
+import os
+
+# Local
+from base.g import *
+from base import device, utils, maint, tui, module
+from prnt import cups
+
+
+try:
+ mod = module.Module(__mod__, __title__, __version__, __doc__, None,
+ (GUI_MODE,), (UI_TOOLKIT_QT4,))
+
+ mod.setUsage(module.USAGE_FLAG_DEVICE_ARGS,
+ see_also_list=['hp-align', 'hp-clean', 'hp-colorcal',
+ 'hp-linefeedcal'])
+
+ opts, device_uri, printer_name, mode, ui_toolkit, lang = \
+ mod.parseStdOpts()
+
+ device_uri = mod.getDeviceUri(device_uri, printer_name)
+
+ if not utils.canEnterGUIMode4():
+ log.error("%s -u/--gui requires Qt4 GUI support. Exiting." % __mod__)
+ sys.exit(1)
+
+ try:
+ from PyQt4.QtGui import QApplication
+ from ui4.pqdiagdialog import PQDiagDialog
+ except ImportError:
+ log.error("Unable to load Qt4 support. Is it installed?")
+ sys.exit(1)
+
+ app = QApplication(sys.argv)
+
+ dlg = PQDiagDialog(None, device_uri) # TODO: add device_uri
+ dlg.show()
+ try:
+ log.debug("Starting GUI loop...")
+ app.exec_()
+ except KeyboardInterrupt:
+ sys.exit(0)
+
+
+
+except KeyboardInterrupt:
+ log.error("User exit")
+
+log.info("")
+log.info("Done.")
diff --git a/print.py b/print.py
new file mode 100755
index 0000000..1032f17
--- /dev/null
+++ b/print.py
@@ -0,0 +1,147 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2009 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+__version__ = '4.0'
+__title__ = 'Print Utility'
+__mod__ = 'hp-print'
+__doc__ = "A simple print UI front-end to lp/lpr."
+
+# Std Lib
+import sys
+import os
+import getopt
+
+# Local
+from base.g import *
+from base import utils, device, tui, module
+from prnt import cups
+
+log.set_module('hp-print')
+
+app = None
+printdlg = None
+
+
+mod = module.Module(__mod__, __title__, __version__, __doc__, None,
+ (GUI_MODE,), (UI_TOOLKIT_QT3, UI_TOOLKIT_QT4))
+
+mod.setUsage(module.USAGE_FLAG_DEVICE_ARGS | module.USAGE_FLAG_FILE_ARGS,
+ see_also_list=['hp-printsettings'])
+
+opts, device_uri, printer_name, mode, ui_toolkit, loc = \
+ mod.parseStdOpts()
+
+printer_name, device_uri = mod.getPrinterName(printer_name, device_uri)
+
+if ui_toolkit == 'qt3':
+ if not utils.canEnterGUIMode():
+ log.error("%s requires GUI support (try running with --qt4). Exiting." % __mod__)
+ sys.exit(1)
+else:
+ if not utils.canEnterGUIMode4():
+ log.error("%s requires GUI support (try running with --qt3). Exiting." % __mod__)
+ sys.exit(1)
+
+if ui_toolkit == 'qt3':
+ try:
+ from qt import *
+ from ui.printerform import PrinterForm
+ except ImportError:
+ log.error("Unable to load Qt3 support. Is it installed?")
+ sys.exit(1)
+
+ # create the main application object
+ app = QApplication(sys.argv)
+
+ if loc is None:
+ loc = user_conf.get('ui', 'loc', 'system')
+ if loc.lower() == 'system':
+ loc = str(QTextCodec.locale())
+ log.debug("Using system locale: %s" % loc)
+
+ if loc.lower() != 'c':
+ e = 'utf8'
+ try:
+ l, x = loc.split('.')
+ loc = '.'.join([l, e])
+ except ValueError:
+ l = loc
+ loc = '.'.join([loc, e])
+
+ log.debug("Trying to load .qm file for %s locale." % loc)
+ trans = QTranslator(None)
+
+ qm_file = 'hplip_%s.qm' % l
+ log.debug("Name of .qm file: %s" % qm_file)
+ loaded = trans.load(qm_file, prop.localization_dir)
+
+ if loaded:
+ app.installTranslator(trans)
+ else:
+ loc = 'c'
+
+ if loc == 'c':
+ log.debug("Using default 'C' locale")
+ else:
+ log.debug("Using locale: %s" % loc)
+ QLocale.setDefault(QLocale(loc))
+ prop.locale = loc
+ try:
+ locale.setlocale(locale.LC_ALL, locale.normalize(loc))
+ except locale.Error:
+ pass
+
+ #print printer_name
+ printdlg = PrinterForm(printer_name, mod.args)
+ printdlg.show()
+ app.setMainWidget(printdlg)
+
+ try:
+ log.debug("Starting GUI loop...")
+ app.exec_loop()
+ except KeyboardInterrupt:
+ pass
+
+
+else: # qt4
+ try:
+ from PyQt4.QtGui import QApplication
+ from ui4.printdialog import PrintDialog
+ except ImportError:
+ log.error("Unable to load Qt4 support. Is it installed?")
+ sys.exit(1)
+
+ if 1:
+ app = QApplication(sys.argv)
+
+ dlg = PrintDialog(None, printer_name, mod.args)
+ dlg.show()
+ try:
+ log.debug("Starting GUI loop...")
+ app.exec_()
+ except KeyboardInterrupt:
+ sys.exit(0)
+
+
+sys.exit(0)
+
+
diff --git a/printsettings.py b/printsettings.py
new file mode 100755
index 0000000..73f4122
--- /dev/null
+++ b/printsettings.py
@@ -0,0 +1,95 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2009 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+__version__ = '1.0'
+__title__ = 'Printer Settings Utility'
+__mod__ = 'hp-printsettings'
+__doc__ = "Printer settings (options) utility for HPLIP supported printers."
+
+#Std Lib
+import sys
+import re
+import getopt
+import time
+import operator
+import os
+
+# Local
+from base.g import *
+from base import device, utils, maint, tui, module
+from prnt import cups
+
+
+try:
+ mod = module.Module(__mod__, __title__, __version__, __doc__, None,
+ (GUI_MODE,), (UI_TOOLKIT_QT4,))
+
+ mod.setUsage(module.USAGE_FLAG_DEVICE_ARGS,
+ see_also_list=['hp-toolbox', 'hp-print'])
+
+ opts, device_uri, printer_name, mode, ui_toolkit, loc = \
+ mod.parseStdOpts('', ['fax'])
+
+ fax_mode = False
+ for o, a in opts:
+ if o == '--fax':
+ fax_mode = True
+
+ if fax_mode:
+ back_end_filter = ['hpfax']
+ else:
+ back_end_filter = ['hp', 'hpfax']
+
+ printer_name, device_uri = mod.getPrinterName(printer_name, device_uri, back_end_filter)
+
+ if ui_toolkit == 'qt3':
+ log.error("%s requires Qt4 support. Use hp-toolbox to adjust print settings. Exiting." % __mod__)
+ sys.exit(1)
+
+ if not utils.canEnterGUIMode4():
+ log.error("%s requires Qt4 GUI support. Exiting." % __mod__)
+ sys.exit(1)
+
+ try:
+ from PyQt4.QtGui import QApplication
+ from ui4.printsettingsdialog import PrintSettingsDialog
+ except ImportError:
+ log.error("Unable to load Qt4 support. Is it installed?")
+ sys.exit(1)
+
+ app = QApplication(sys.argv)
+
+ dialog = PrintSettingsDialog(None, printer_name, fax_mode)
+ dialog.show()
+ try:
+ log.debug("Starting GUI loop...")
+ app.exec_()
+ except KeyboardInterrupt:
+ log.error("User exit")
+ sys.exit(0)
+
+except KeyboardInterrupt:
+ log.error("User exit")
+
+log.info("")
+log.info("Done.")
+
diff --git a/prnt/__init__.py b/prnt/__init__.py
new file mode 100644
index 0000000..41cd78c
--- /dev/null
+++ b/prnt/__init__.py
@@ -0,0 +1,19 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2007 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+
diff --git a/prnt/backend/hp.c b/prnt/backend/hp.c
new file mode 100644
index 0000000..c8b686f
--- /dev/null
+++ b/prnt/backend/hp.c
@@ -0,0 +1,923 @@
+/*****************************************************************************\
+
+ hp.c - hp cups backend
+
+ (c) 2004-2008 Copyright Hewlett-Packard Development Company, LP
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+ of the Software, and to permit persons to whom the Software is furnished to do
+ so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+\*****************************************************************************/
+
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE
+#endif
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <netinet/in.h>
+#include <netdb.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <string.h>
+#include <unistd.h>
+#include <stdarg.h>
+#include <syslog.h>
+#include <ctype.h>
+#include <pthread.h>
+#ifdef HAVE_DBUS
+#include <dbus/dbus.h>
+#endif
+#include "hpmud.h"
+#include <signal.h>
+
+//#define HP_DEBUG
+
+enum BACKEND_RESULT
+{
+ BACKEND_OK = 0,
+ BACKEND_FAILED = 1, /* use error-policy */
+ BACKEND_HOLD = 3, /* hold job */
+ BACKEND_STOP = 4, /* stop queue */
+ BACKEND_CANCEL = 5 /* cancel job */
+};
+
+struct pjl_attributes
+{
+ int pjl_device; /* 0=disabled, 1=enabled */
+ int current_status;
+ int eoj_pages; /* end-of-job pages */
+ int abort; /* 0=no, 1=yes */
+ int done; /* 0=no, 1=yes */
+ HPMUD_DEVICE dd;
+ HPMUD_CHANNEL cd;
+ pthread_t tid;
+ pthread_mutex_t mutex;
+ pthread_cond_t done_cond;
+};
+
+#define _STRINGIZE(x) #x
+#define STRINGIZE(x) _STRINGIZE(x)
+
+#define BUG(args...) bug(__FILE__ " " STRINGIZE(__LINE__) ": " args)
+
+#ifdef HP_DEBUG
+ #define DBG(args...) syslog(LOG_INFO, __FILE__ " " STRINGIZE(__LINE__) ": " args)
+ #define DBG_DUMP(data, size) sysdump((data), (size))
+ #define DBG_SZ(args...) syslog(LOG_INFO, args)
+#else
+ #define DBG(args...)
+ #define DBG_DUMP(data, size)
+ #define DBG_SZ(args...)
+#endif
+
+#define RETRY_TIMEOUT 30 /* seconds */
+#define EXCEPTION_TIMEOUT 45 /* seconds */
+
+#define NFAULT_BIT 0x08
+#define PERROR_BIT 0x20
+
+#define OOP (NFAULT_BIT | PERROR_BIT)
+#define JAMMED (PERROR_BIT)
+#define ERROR_TRAP (0)
+
+#define STATUS_MASK (NFAULT_BIT | PERROR_BIT)
+
+#define DEVICE_IS_OOP(reg) ((reg & STATUS_MASK) == OOP)
+#define DEVICE_PAPER_JAMMED(reg) ((reg & STATUS_MASK) == JAMMED)
+#define DEVICE_IO_TRAP(reg) ((reg & STATUS_MASK) == ERROR_TRAP)
+
+#define HEX2INT(x, i) if (x >= '0' && x <= '9') i |= x - '0'; \
+ else if (x >= 'A' && x <= 'F') i |= 0xA + x - 'A'; \
+ else if (x >= 'a' && x <= 'f') i |= 0xA + x - 'a'
+
+/* Definitions for hpLogLevel in cupsd.conf. */
+#define BASIC_LOG 1
+#define SAVE_PCL_FILE 2
+#define SAVE_INPUT_RASTERS 4
+#define SEND_TO_PRINTER_ALSO 8
+
+/* Actual vstatus codes are mapped to 1000+vstatus for DeviceError messages. */
+typedef enum
+{
+ VSTATUS_IDLE = 1000,
+ VSTATUS_BUSY,
+ VSTATUS_PRNT, /* io printing */
+ VSTATUS_OFFF, /* turning off */
+ VSTATUS_RPRT, /* report printing */
+ VSTATUS_CNCL, /* canceling */
+ VSTATUS_IOST, /* io stall */
+ VSTATUS_DRYW, /* dry time wait */
+ VSTATUS_PENC, /* pen change */
+ VSTATUS_OOPA, /* out of paper */
+ VSTATUS_BNEJ, /* banner eject needed */
+ VSTATUS_BNMZ, /* banner mismatch */
+ VSTATUS_PHMZ, /* photo mismatch */
+ VSTATUS_DPMZ, /* duplex mismatch */
+ VSTATUS_PAJM, /* media jam */
+ VSTATUS_CARS, /* carriage stall */
+ VSTATUS_PAPS, /* paper stall */
+ VSTATUS_PENF, /* pen failure */
+ VSTATUS_ERRO, /* hard error */
+ VSTATUS_PWDN, /* power down */
+ VSTATUS_FPTS, /* front panel test */
+ VSTATUS_CLNO /* clean out tray missing */
+} VSTATUS;
+
+#define EVENT_START_JOB 500
+#define EVENT_END_JOB 501
+
+//const char pjl_status_cmd[] = "\e%-12345X@PJL INFO STATUS \r\n\e%-12345X";
+static const char pjl_ustatus_cmd[] = "\e%-12345X@PJL USTATUS DEVICE = ON \r\n@PJL USTATUS JOB = ON \r\n@PJL JOB \r\n\e%-12345X";
+static const char pjl_job_end_cmd[] = "\e%-12345X@PJL EOJ \r\n\e%-12345X";
+static const char pjl_ustatus_off_cmd[] = "\e%-12345X@PJL USTATUSOFF \r\n\e%-12345X";
+
+#ifdef HAVE_DBUS
+#define DBUS_INTERFACE "com.hplip.StatusService"
+#define DBUS_PATH "/"
+static DBusError dbus_err;
+static DBusConnection *dbus_conn;
+#endif
+
+static int bug(const char *fmt, ...)
+{
+ char buf[256];
+ va_list args;
+ int n;
+
+ va_start(args, fmt);
+
+ if ((n = vsnprintf(buf, 256, fmt, args)) == -1)
+ buf[255] = 0; /* output was truncated */
+
+ fprintf(stderr, "%s", buf);
+ syslog(LOG_ERR, "%s", buf);
+
+ fflush(stderr);
+ va_end(args);
+ return n;
+}
+
+#ifdef HP_DEBUG
+static void sysdump(const void *data, int size)
+{
+ /* Dump size bytes of *data. Output looks like:
+ * [0000] 75 6E 6B 6E 6F 77 6E 20 30 FF 00 00 00 00 39 00 unknown 0.....9.
+ */
+
+ unsigned char *p = (unsigned char *)data;
+ unsigned char c;
+ int n;
+ char bytestr[4] = {0};
+ char addrstr[10] = {0};
+ char hexstr[16*3 + 5] = {0};
+ char charstr[16*1 + 5] = {0};
+ for(n=1;n<=size;n++) {
+ if (n%16 == 1) {
+ /* store address for this line */
+ snprintf(addrstr, sizeof(addrstr), "%.4d", (int)((p-(unsigned char *)data) & 0xffff));
+ }
+
+ c = *p;
+ if (isprint(c) == 0) {
+ c = '.';
+ }
+
+ /* store hex str (for left side) */
+ snprintf(bytestr, sizeof(bytestr), "%02X ", *p);
+ strncat(hexstr, bytestr, sizeof(hexstr)-strlen(hexstr)-1);
+
+ /* store char str (for right side) */
+ snprintf(bytestr, sizeof(bytestr), "%c", c);
+ strncat(charstr, bytestr, sizeof(charstr)-strlen(charstr)-1);
+
+ if(n%16 == 0) {
+ /* line completed */
+ DBG_SZ("[%4.4s] %-50.50s %s\n", addrstr, hexstr, charstr);
+ hexstr[0] = 0;
+ charstr[0] = 0;
+ }
+ p++; /* next byte */
+ }
+
+ if (strlen(hexstr) > 0) {
+ /* print rest of buffer if not empty */
+ DBG_SZ("[%4.4s] %-50.50s %s\n", addrstr, hexstr, charstr);
+ }
+}
+#endif
+
+/* Map printer status to IPP printer-state-reasons (see RFC-2911). */
+static int map_ipp_printer_state_reason(int status, const char **state_msg)
+{
+
+ if (status >= 1000 && status <= 1999)
+ {
+ /* inkjet vstatus */
+ switch (status)
+ {
+ case VSTATUS_IDLE:
+ case VSTATUS_PRNT:
+ *state_msg = "none";
+ break;
+ case VSTATUS_OOPA:
+ *state_msg = "media-empty-error";
+ break;
+ case(VSTATUS_PAJM):
+ *state_msg = "media-jam-error";
+ break;
+ default:
+ *state_msg = "other";
+ break;
+ }
+ }
+ else if (status >= 10000 && status <= 55999)
+ {
+ /* laserjet pjl status */
+ if (status >= 10000 && status <= 10999)
+ *state_msg = "none";
+ else if (status >= 41000 && status <= 41999)
+ *state_msg = "media-empty-error";
+ else if ((status >= 42000 && status <= 42999) || (status >= 44000 && status <= 44999) || (status == 40022))
+ *state_msg = "media-jam-error";
+ else if (status == 40021)
+ *state_msg = "cover-open-error";
+ else if (status == 40600)
+ *state_msg = "toner-empty-error";
+ else
+ *state_msg = "other"; /* 40017 - cartridge E-LABEL is unreadable (ie: ljp1005) */
+ }
+ else
+ {
+ /* Assume hpmud error */
+ *state_msg = "other";
+ }
+
+ return 0;
+}
+
+static enum HPMUD_RESULT get_pjl_input(HPMUD_DEVICE dd, HPMUD_CHANNEL cd, char *buf, int buf_size, int sec_timeout, int *bytes_read)
+{
+ enum HPMUD_RESULT stat;
+ int len;
+
+ *bytes_read = 0;
+
+ /* Read unsolicited status from device. */
+ stat = hpmud_read_channel(dd, cd, buf, buf_size, sec_timeout, &len);
+ if (stat != HPMUD_R_OK)
+ goto bugout;
+
+ buf[len]=0;
+
+ DBG("pjl result len=%d\n", len);
+ DBG_DUMP(buf, len);
+
+ *bytes_read = len;
+
+ stat = HPMUD_R_OK;
+
+bugout:
+ return stat;
+}
+
+static int parse_pjl_job_end(char *buf, int *pages)
+{
+ char *p, *tail;
+ int stat=0;
+
+ if (buf[0] == 0)
+ goto bugout;
+
+ if ((p = strcasestr(buf, "ustatus job")) != NULL)
+ {
+ if (strncasecmp(p+13, "end", 3) == 0)
+ {
+ stat = 1;
+ if ((p = strcasestr(p+13+5, "pages=")) != NULL)
+ *pages = strtol(p+6, &tail, 10);
+ }
+ }
+
+bugout:
+ return stat;
+}
+
+static int parse_pjl_device_status(char *buf, int *status)
+{
+ char *p, *tail;
+ int stat=0;
+
+ if (buf[0] == 0)
+ goto bugout;
+
+ if ((p = strcasestr(buf, "code=")) != NULL)
+ {
+ *status = strtol(p+5, &tail, 10);
+ stat = 1;
+ }
+
+bugout:
+ return stat;
+}
+
+static void pjl_read_thread(struct pjl_attributes *pa)
+{
+ enum HPMUD_RESULT stat;
+ int len, new_status, new_eoj;
+ char buf[1024];
+
+ pthread_detach(pthread_self());
+
+ DBG("starting thread %d\n", (int)pa->tid);
+
+ pa->current_status = 10001; /* default is ready */
+ pa->eoj_pages = pa->abort = pa->done = 0;
+
+ while (!pa->abort)
+ {
+ stat = get_pjl_input(pa->dd, pa->cd, buf, sizeof(buf), 0, &len);
+ if (!(stat == HPMUD_R_OK || stat == HPMUD_R_IO_TIMEOUT))
+ {
+ BUG("exiting thread %d error=%d\n", (int)pa->tid, stat);
+ pthread_mutex_lock(&pa->mutex);
+ pa->current_status = 5000+stat; /* io error */
+ pthread_mutex_unlock(&pa->mutex);
+ break;
+ }
+
+ if (stat == HPMUD_R_OK)
+ {
+ pthread_mutex_lock(&pa->mutex);
+ new_status = parse_pjl_device_status(buf, &pa->current_status);
+ new_eoj = parse_pjl_job_end(buf, &pa->eoj_pages);
+ pthread_mutex_unlock(&pa->mutex);
+ if (new_status)
+ BUG("read new pjl status: %d\n", pa->current_status);
+ if (new_eoj)
+ BUG("read pjl job_end: %d\n", pa->eoj_pages);
+ }
+ else
+ sleep(1);
+ }
+
+ DBG("exiting thread %d abort=%d stat=%d\n", (int)pa->tid, pa->abort, stat);
+
+ pa->done=1;
+ pthread_cond_signal(&pa->done_cond);
+
+ return;
+}
+
+/*
+ * get_printer_status
+ *
+ * inputs:
+ * dd - device descriptor
+ * pa - see pjl_attributes definition
+ *
+ * outputs:
+ * return - printer status, 1000 to 1999 = inkjet vstatus, 5000 to 5999 = hpmud error, 10000 to 55999 = pjl status code
+ *
+ */
+static int get_printer_status(HPMUD_DEVICE dd, HPMUD_CHANNEL cd, struct pjl_attributes *pa)
+{
+ char id[1024];
+ char *pSf;
+ int status, ver, len;
+ enum HPMUD_RESULT r;
+
+ if (pa->pjl_device)
+ {
+ pthread_mutex_lock(&pa->mutex);
+ status = pa->current_status;
+ pthread_mutex_unlock(&pa->mutex);
+ }
+ else
+ {
+ status = VSTATUS_IDLE; /* set default */
+ r = hpmud_get_device_id(dd, id, sizeof(id), &len);
+// if (!(r == HPMUD_R_OK || r == HPMUD_R_DEVICE_BUSY))
+ if (r != HPMUD_R_OK)
+ {
+ status = 5000+r; /* no deviceid, return some error */
+ goto bugout;
+ }
+
+ /* Check for valid S-field in device id string. */
+ if ((pSf = strstr(id, ";S:")) == NULL)
+ {
+ /* No S-field, use status register instead of device id. */
+ unsigned int bit_status;
+ r = hpmud_get_device_status(dd, &bit_status);
+// if (!(r == HPMUD_R_OK || r == HPMUD_R_DEVICE_BUSY))
+ if (r != HPMUD_R_OK)
+ {
+ status = 5000+r; /* no 8-bit status, return some error */
+ goto bugout;
+ }
+
+ if (DEVICE_IS_OOP(bit_status))
+ status = VSTATUS_OOPA;
+ else if (DEVICE_PAPER_JAMMED(bit_status))
+ status = VSTATUS_PAJM;
+ else if (DEVICE_IO_TRAP(bit_status))
+ status = VSTATUS_CARS;
+ }
+ else
+ {
+ /* Valid S-field, get version number. */
+ pSf+=3;
+ ver = 0;
+ HEX2INT(*pSf, ver);
+ pSf++;
+ ver = ver << 4;
+ HEX2INT(*pSf, ver);
+ pSf++;
+
+ /* Position pointer to printer state subfield. */
+ switch (ver)
+ {
+ case 0:
+ case 1:
+ case 2:
+ pSf+=12;
+ break;
+ case 3:
+ pSf+=14;
+ break;
+ case 4:
+ pSf+=18;
+ break;
+ default:
+ BUG("WARNING: unknown S-field version=%d\n", ver);
+ pSf+=12;
+ break;
+ }
+
+ /* Extract VStatus.*/
+ status = 0;
+ HEX2INT(*pSf, status);
+ pSf++;
+ status = status << 4;
+ HEX2INT(*pSf, status);
+ status += 1000;
+ }
+ }
+
+bugout:
+ return status;
+}
+
+static int device_discovery()
+{
+ char buf[HPMUD_LINE_SIZE*64];
+ int cnt=0, bytes_read, r=1;
+ enum HPMUD_RESULT stat;
+
+ stat = hpmud_probe_devices(HPMUD_BUS_ALL, buf, sizeof(buf), &cnt, &bytes_read);
+
+ if (stat != HPMUD_R_OK)
+ goto bugout;
+
+ if (cnt == 0)
+#ifdef HAVE_CUPS11
+ fprintf(stdout, "direct hp:/no_device_found \"Unknown\" \"hp no_device_found\"\n");
+#else
+ fprintf(stdout, "direct hp \"Unknown\" \"HP Printer (HPLIP)\"\n");
+#endif
+ else
+ fprintf(stdout, "%s", buf);
+
+ r = 0;
+
+bugout:
+ return r;
+}
+
+#ifdef HAVE_DBUS
+static int device_event(const char *dev, const char *printer, int code,
+ const char *username, const char *jobid, const char *title)
+{
+ DBusMessage * msg = NULL;
+ int id = atoi(jobid);
+
+ if (dbus_conn == NULL)
+ return 0;
+
+ msg = dbus_message_new_signal(DBUS_PATH, DBUS_INTERFACE, "Event");
+
+ if (NULL == msg)
+ {
+ BUG("dbus message is NULL!\n");
+ return 0;
+ }
+
+ dbus_message_append_args(msg,
+ DBUS_TYPE_STRING, &dev,
+ DBUS_TYPE_STRING, &printer,
+ DBUS_TYPE_UINT32, &code,
+ DBUS_TYPE_STRING, &username,
+ DBUS_TYPE_UINT32, &id,
+ DBUS_TYPE_STRING, &title,
+ DBUS_TYPE_INVALID);
+
+ if (!dbus_connection_send(dbus_conn, msg, NULL))
+ {
+ BUG("dbus message send failed!\n");
+ return 0;
+ }
+
+ dbus_connection_flush(dbus_conn);
+ dbus_message_unref(msg);
+
+ return 1;
+}
+
+int init_dbus(void)
+{
+ dbus_error_init(&dbus_err);
+ dbus_conn = dbus_bus_get(DBUS_BUS_SYSTEM, &dbus_err);
+
+ if (dbus_error_is_set(&dbus_err))
+ {
+ BUG("dBus Connection Error (%s)!\n", dbus_err.message);
+ dbus_error_free(&dbus_err);
+ }
+
+ if (dbus_conn == NULL)
+ {
+ return 0;
+ }
+
+ return 1;
+}
+#else
+static int device_event(const char *dev, const char *printer, int code,
+ const char *username, const char *jobid, const char *title)
+{
+ return 1;
+}
+int init_dbus(void)
+{
+ return 1;
+}
+#endif /* HAVE_DBUS */
+
+/* Check printer status, if a valid error state, loop until error condition is cleared. */
+static int loop_test(HPMUD_DEVICE dd, HPMUD_CHANNEL cd, struct pjl_attributes *pa,
+ const char *dev, const char *printer, const char *username, const char *jobid, const char *title)
+{
+ int status, stat;
+ const char *pstate, *old_state=NULL;
+
+ while (1)
+ {
+ status = get_printer_status(dd, cd, pa);
+ map_ipp_printer_state_reason(status, &pstate);
+
+ /* Check for user intervention errors. */
+ if (strstr(pstate, "error"))
+ {
+ if (pstate != old_state)
+ {
+ if (old_state)
+ {
+ /* Clear old error. */
+// device_event(dev, printer, status, username, jobid, title);
+ fprintf(stderr, "STATE: -%s\n", old_state);
+ }
+
+ /* Display error. */
+ device_event(dev, printer, status, username, jobid, title);
+ fprintf(stderr, "STATE: +%s\n", pstate);
+ old_state = pstate;
+ }
+ BUG("ERROR: %d %s; will retry in %d seconds...\n", status, pstate, RETRY_TIMEOUT);
+ sleep(RETRY_TIMEOUT);
+ continue;
+ }
+
+ /* Clear any old state. */
+ if (old_state)
+ fprintf(stderr, "STATE: -%s\n", old_state);
+
+ /* Check for system errors. */
+ if (status >= 5000 && status <= 5999)
+ {
+ /* Display error. */
+ device_event(dev, printer, status, username, jobid, title);
+ BUG("ERROR: %d device communication error!\n", status);
+ stat = 1;
+ }
+ else
+ stat = 0;
+
+ break; /* done */
+ }
+
+ return stat;
+}
+
+int main(int argc, char *argv[])
+{
+ int fd;
+ int copies;
+ int len, status, cnt, exit_stat=BACKEND_FAILED;
+ char buf[HPMUD_BUFFER_SIZE];
+ struct hpmud_model_attributes ma;
+ struct pjl_attributes pa;
+ HPMUD_DEVICE hd=-1;
+ HPMUD_CHANNEL cd=-1;
+ int n, total=0, retry=0, size, pages;
+ enum HPMUD_RESULT stat;
+ char *printer = getenv("PRINTER");
+
+ // 0 1 2 3 4 5
+ // device_uri job-id user title copies options
+
+ openlog("hp", LOG_PID, LOG_DAEMON);
+
+ pa.tid = 0;
+
+ if (argc > 1)
+ {
+ const char *arg = argv[1];
+ if ((arg[0] == '-') && (arg[1] == 'h'))
+ {
+ fprintf(stdout, "HP Linux Imaging and Printing System\nCUPS Backend %s\n", VERSION);
+ fprintf(stdout, "(c) 2003-2008 Copyright Hewlett-Packard Development Company, LP\n");
+ exit(0);
+ }
+ }
+
+ if (argc == 1)
+ exit (device_discovery());
+
+ if (argc < 6 || argc > 7)
+ {
+ BUG("ERROR: invalid usage: device_uri job-id user title copies options [file]\n");
+ exit (1);
+ }
+
+ if (argc == 6)
+ {
+ fd = 0; /* use stdin. */
+ copies = 1;
+ }
+ else
+ {
+ if ((fd = open(argv[6], O_RDONLY)) < 0) /* use specified file */
+ {
+ BUG("ERROR: unable to open print file %s: %m\n", argv[6]);
+ exit (1);
+ }
+ copies = atoi(argv[4]);
+ }
+
+ signal(SIGTERM, SIG_IGN);
+ init_dbus();
+
+ /* Get any parameters needed for DeviceOpen. */
+ hpmud_query_model(argv[0], &ma);
+
+ DBG("job start %s prt_mode=%d statustype=%d\n", argv[0], ma.prt_mode, ma.statustype);
+
+ pa.pjl_device = 0;
+ if (strcasestr(argv[0], ":/net") == NULL && (ma.statustype==HPMUD_STATUSTYPE_PJL || ma.statustype==HPMUD_STATUSTYPE_PJLPML))
+ pa.pjl_device = 1;
+
+ device_event(argv[0], printer, EVENT_START_JOB, argv[2], argv[1], argv[3]);
+
+ /* Write print file. */
+ while (copies > 0)
+ {
+ copies--;
+
+ if (fd != 0)
+ {
+ fputs("PAGE: 1 1\n", stderr);
+ lseek(fd, 0, SEEK_SET);
+ }
+
+ while ((len = read(fd, buf, sizeof(buf))) > 0)
+ {
+ size=len;
+ total=0;
+
+ while (size > 0)
+ {
+ /* Got some data now open the hp device. This will handle any HPIJS device contention. */
+ if (hd <= 0)
+ {
+ fputs("STATE: +connecting-to-device\n", stderr);
+
+ /* Open hp device. */
+ while ((stat = hpmud_open_device(argv[0], ma.prt_mode, &hd)) != HPMUD_R_OK)
+ {
+ if (getenv("CLASS") != NULL)
+ {
+ /* The job was submitted to a class and not a specific queue. Abort to
+ * give another class member a chance to print the job.
+ */
+ BUG("INFO: open device failed stat=%d: %s; trying next printer in class...\n", stat, argv[0]);
+ sleep (5); /* Prevent job requeuing too quickly. */
+ goto bugout;
+ }
+
+ if (stat != HPMUD_R_DEVICE_BUSY)
+ {
+ BUG("ERROR: open device failed stat=%d: %s\n", stat, argv[0]);
+ goto bugout;
+ }
+
+ /* Display user error. */
+ device_event(argv[0], printer, 5000+stat, argv[2], argv[1], argv[3]);
+
+ BUG("INFO: open device failed stat=%d: %s; will retry in %d seconds...\n", stat, argv[0], RETRY_TIMEOUT);
+ sleep(RETRY_TIMEOUT);
+ retry = 1;
+ }
+
+ if (retry)
+ {
+ /* Clear user error. */
+ device_event(argv[0], printer, VSTATUS_PRNT, argv[2], argv[1], argv[3]);
+ retry=0;
+ }
+
+ while ((stat = hpmud_open_channel(hd, HPMUD_S_PRINT_CHANNEL, &cd)) != HPMUD_R_OK)
+ {
+ if (stat != HPMUD_R_DEVICE_BUSY)
+ {
+ BUG("ERROR: cannot open channel %s\n", HPMUD_S_PRINT_CHANNEL);
+ goto bugout;
+ }
+ device_event(argv[0], printer, 5000+stat, argv[2], argv[1], argv[3]);
+ BUG("INFO: open print channel failed stat=%d; will retry in %d seconds...\n", stat, RETRY_TIMEOUT);
+ sleep(RETRY_TIMEOUT);
+ retry = 1;
+ }
+
+ if (retry)
+ {
+ /* Clear user error. */
+ device_event(argv[0], printer, VSTATUS_PRNT, argv[2], argv[1], argv[3]);
+ retry=0;
+ }
+
+ fputs("STATE: -connecting-to-device\n", stderr);
+
+ if (pa.pjl_device)
+ {
+ /* Enable unsolicited status. */
+ hpmud_write_channel(hd, cd, pjl_ustatus_cmd, sizeof(pjl_ustatus_cmd)-1, 5, &len);
+ pa.dd = hd;
+ pa.cd = cd;
+ pthread_mutex_init(&pa.mutex, NULL);
+ pthread_cond_init(&pa.done_cond, NULL);
+ pthread_create(&pa.tid, NULL, (void *(*)(void*))pjl_read_thread, (void *)&pa);
+ }
+
+ /* Clear any errors left over from a previous job. */
+ fprintf(stderr, "STATE: -%s\n", "media-empty-error,media-jam-error,hplip.plugin-error,"
+ "cover-open-error,toner-empty-error,other");
+
+ } /* if (hd <= 0) */
+
+ stat = hpmud_write_channel(hd, cd, buf+total, size, EXCEPTION_TIMEOUT, &n);
+
+ if (n != size)
+ {
+ /* IO error, get printer status. */
+ if (loop_test(hd, cd, &pa, argv[0], printer, argv[2], argv[1], argv[3]))
+ {
+ exit_stat = BACKEND_STOP; /* stop queue */
+ goto bugout;
+ }
+ }
+ else
+ {
+ /* Data was sent to device successfully. */
+ if (pa.pjl_device)
+ {
+ /* Laserjets have a large data buffer, so manually check for operator intervention condition. */
+ if (loop_test(hd, cd, &pa, argv[0], printer, argv[2], argv[1], argv[3]))
+ {
+ exit_stat = BACKEND_STOP; /* stop queue */
+ goto bugout;
+ }
+ }
+ }
+ total+=n;
+ size-=n;
+ } /* while (size > 0) */
+ } /* while ((len = read(fd, buf, HPLIP_BUFFER_SIZE)) > 0) */
+ } /* while (copies > 0) */
+
+ DBG("job end %s prt_mode=%d statustype=%d total=%d\n", argv[0], ma.prt_mode, ma.statustype, total);
+
+ /* Note read() could return zero bytes. Check for bogus null print job. */
+ if (total==0)
+ {
+ exit_stat = BACKEND_OK; /* leave queue up */
+ BUG("ERROR: null print job total=%d\n", total);
+ goto bugout;
+ }
+
+ if (pa.pjl_device && pa.tid)
+ {
+ pthread_mutex_lock(&pa.mutex);
+ pa.eoj_pages=0;
+ pthread_mutex_unlock(&pa.mutex);
+ hpmud_write_channel(hd, cd, pjl_job_end_cmd, sizeof(pjl_job_end_cmd)-1, 5, &len);
+
+ /* Look for job end status. */
+ for (cnt=0; cnt<10; cnt++)
+ {
+ if (loop_test(hd, cd, &pa, argv[0], printer, argv[2], argv[1], argv[3]))
+ {
+ exit_stat = BACKEND_OK; /* leave queue up */
+ goto bugout;
+ }
+ pthread_mutex_lock(&pa.mutex);
+ pages = pa.eoj_pages;
+ pthread_mutex_unlock(&pa.mutex);
+ if (pages > 0)
+ {
+ DBG("job end pages=%d\n", pages);
+ break;
+ }
+ DBG("waiting for job end status...\n");
+ sleep(2);
+ }
+
+ hpmud_write_channel(hd, cd, pjl_ustatus_off_cmd, sizeof(pjl_ustatus_off_cmd)-1, 5, &len);
+ }
+ else if ((ma.prt_mode != HPMUD_UNI_MODE) && (ma.statustype == HPMUD_STATUSTYPE_SFIELD))
+ {
+ /* Wait for printer to receive all data before closing print channel. Otherwise data can be truncated. */
+ status = get_printer_status(hd, cd, &pa);
+ if (status < 5000)
+ {
+ /* Got valid status, wait for idle. */
+ cnt=0;
+ while ((status != VSTATUS_IDLE) && (status < 5000) && (cnt < 5))
+ {
+ sleep(2);
+ status = get_printer_status(hd, cd, &pa);
+ cnt++;
+ }
+ }
+ }
+ else
+ {
+ /* Just use fixed delay for uni-di, VSTATUS devices and laserjets without pjl. */
+ sleep(8);
+ }
+
+ exit_stat = BACKEND_OK;
+ fputs("INFO: ready to print\n", stderr);
+
+bugout:
+
+ device_event(argv[0], printer, EVENT_END_JOB, argv[2], argv[1], argv[3]);
+
+ if (pa.pjl_device && pa.tid)
+ {
+ /* Gracefully kill the pjl_read_thread. */
+ pthread_mutex_lock(&pa.mutex);
+ pa.abort=1;
+ while (!pa.done)
+ pthread_cond_wait(&pa.done_cond, &pa.mutex);
+ pthread_mutex_unlock(&pa.mutex);
+ pthread_cancel(pa.tid);
+ pthread_mutex_destroy(&pa.mutex);
+ pthread_cond_destroy(&pa.done_cond);
+ }
+
+ if (cd >= 0)
+ hpmud_close_channel(hd, cd);
+ if (hd >= 0)
+ hpmud_close_device(hd);
+ if (fd != 0)
+ close(fd);
+
+ exit (exit_stat);
+}
+
diff --git a/prnt/colorcal.py b/prnt/colorcal.py
new file mode 100644
index 0000000..a162ca5
--- /dev/null
+++ b/prnt/colorcal.py
@@ -0,0 +1,232 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2007 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+# For type 3 color cal and alignemnt types 5 and 7
+COLOR_ALIGN_TABLE = ((71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71),
+ (71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71),
+ (71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71),
+ (71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71),
+ (77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77),
+ (83, 85, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83),
+ (86, 85, 86, 88, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86),
+ (89, 89, 89, 88, 89, 91, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89),
+ (93, 93, 93, 93, 93, 91, 93, 94, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93),
+ (96, 96, 96, 96, 96, 96, 96, 94, 96, 98, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96),
+ (100, 100, 100, 100, 100, 100, 100, 100, 100, 98, 100, 102, 100, 100, 100, 100, 100, 100, 100, 100, 100),
+ (104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 102, 104, 106, 104, 104, 104, 104, 104, 104, 104),
+ (109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 106, 109, 111, 109, 109, 109, 109, 109),
+ (114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 111, 114, 116, 114, 114, 114),
+ (119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 116, 119, 122, 119),
+ (125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 122, 125),
+ (132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132),
+ (139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139),
+ (147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147),
+ (156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156),
+ (167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167)
+ )
+
+PHOTO_ALIGN_TABLE = ((167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167),
+ (167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167),
+ (167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167),
+ (167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167),
+ (143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143),
+ (125, 122, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125),
+ (119, 122, 119, 116, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119),
+ (114, 114, 114, 116, 114, 111, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114),
+ (109, 109, 109, 109, 109, 111, 109, 106, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109),
+ (104, 104, 104, 104, 104, 104, 104, 106, 104, 102, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104),
+ (100, 100, 100, 100, 100, 100, 100, 100, 100, 102, 100, 98, 100, 100, 100, 100, 100, 100, 100, 100, 100),
+ (96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 98, 96, 94, 96, 96, 96, 96, 96, 96, 96),
+ (93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 94, 93, 91, 93, 93, 93, 93, 93),
+ (89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 91, 89, 88, 89, 89, 89),
+ (86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 88, 86, 85, 86),
+ (83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 85, 83),
+ (81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81),
+ (80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80),
+ (78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78),
+ (74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74),
+ (71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71)
+ )
+
+
+COLOR_CAL_TABLE = (# For color cal type 2
+ 127, 127, 127, 127,
+ 0, -40, 40, 0,
+ 0, -30, 40, 0,
+ 0, -20, 40, 0,
+ 0, -10, 40, 0,
+ 0, 0, 40, 0,
+ 0, 10, 40, 0,
+ 0, 20, 40, 0,
+ 0, 30, 40, 0,
+ 0, 40, 40, 0,
+ 0, -40, 30, 0,
+ 0, -30, 30, 0,
+ 0, -20, 30, 0,
+ 0, -10, 30, 0,
+ 0, 0, 30, 0,
+ 0, 10, 30, 0,
+ 0, 20, 30, 0,
+ 0, 30, 30, 0,
+ 0, 40, 30, 0,
+ 0, -40, 20, 0,
+ 0, -30, 20, 0,
+ 0, -20, 20, 0,
+ 0, -10, 20, 0,
+ 0, 0, 20, 0,
+ 0, 10, 20, 0,
+ 0, 20, 20, 0,
+ 0, 30, 20, 0,
+ 0, 40, 20, 0,
+ 0, -40, 10, 0,
+ 0, -30, 10, 0,
+ 0, -20, 10, 0,
+ 0, -10, 10, 0,
+ 0, 0, 10, 0,
+ 0, 10, 10, 0,
+ 0, 20, 10, 0,
+ 0, 30, 10, 0,
+ 0, 40, 10, 0,
+ 0, -40, 0, 0,
+ 0, -30, 0, 0,
+ 0, -20, 0, 0,
+ 0, -10, 0, 0,
+ 0, 0, 0, 0,
+ 0, 10, 0, 0,
+ 0, 20, 0, 0,
+ 0, 30, 0, 0,
+ 0, 40, 0, 0,
+ 0, -40, -10, 0,
+ 0, -30, -10, 0,
+ 0, -20, -10, 0,
+ 0, -10, -10, 0,
+ 0, 0, -10, 0,
+ 0, 10, -10, 0,
+ 0, 20, -10, 0,
+ 0, 30, -10, 0,
+ 0, 40, -10, 0,
+ 0, -40, -20, 0,
+ 0, -30, -20, 0,
+ 0, -20, -20, 0,
+ 0, -10, -20, 0,
+ 0, 0, -20, 0,
+ 0, 10, -20, 0,
+ 0, 20, -20, 0,
+ 0, 30, -20, 0,
+ 0, 40, -20, 0,
+ 0, -40, -30, 0,
+ 0, -30, -30, 0,
+ 0, -20, -30, 0,
+ 0, -10, -30, 0,
+ 0, 0, -30, 0,
+ 0, 10, -30, 0,
+ 0, 20, -30, 0,
+ 0, 30, -30, 0,
+ 0, 40, -30, 0,
+ 0, -40, -40, 0,
+ 0, -30, -40, 0,
+ 0, -20, -40, 0,
+ 0, -10, -40, 0,
+ 0, 0, -40, 0,
+ 0, 10, -40, 0,
+ 0, 20, -40, 0,
+ 0, 30, -40, 0,
+ 0, 40, -40, 0
+)
+
+
+# Type 4 manual color calibration table
+
+TYPE_4_C_TABLE = \
+(
+ (32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,),
+ (32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,),
+ (21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,),
+ (21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,),
+ (11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,),
+ (11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,),
+ (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,),
+ (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,),
+ (-11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11,),
+ (-11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11,),
+ (-21, -21, -21, -21, -21, -21, -21, -21, -21, -21, -21, -21, -21, -21,),
+ (-21, -21, -21, -21, -21, -21, -21, -21, -21, -21, -21, -21, -21, -21,),
+ (-32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32,),
+ (-32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32,),
+)
+
+TYPE_4_M_TABLE = \
+(
+ (-30, -30, -20, -20, -10, -10, 0, 0, 10, 10, 20, 20, 30, 30,),
+ (-30, -30, -20, -20, -10, -10, 0, 0, 10, 10, 20, 20, 30, 30,),
+ (-30, -30, -20, -20, -10, -10, 0, 0, 10, 10, 20, 20, 30, 30,),
+ (-30, -30, -20, -20, -10, -10, 0, 0, 10, 10, 20, 20, 30, 30,),
+ (-30, -30, -20, -20, -10, -10, 0, 0, 10, 10, 20, 20, 30, 30,),
+ (-30, -30, -20, -20, -10, -10, 0, 0, 10, 10, 20, 20, 30, 30,),
+ (-30, -30, -20, -20, -10, -10, 0, 0, 10, 10, 20, 20, 30, 30,),
+ (-30, -30, -20, -20, -10, -10, 0, 0, 10, 10, 20, 20, 30, 30,),
+ (-30, -30, -20, -20, -10, -10, 0, 0, 10, 10, 20, 20, 30, 30,),
+ (-30, -30, -20, -20, -10, -10, 0, 0, 10, 10, 20, 20, 30, 30,),
+ (-30, -30, -20, -20, -10, -10, 0, 0, 10, 10, 20, 20, 30, 30,),
+ (-30, -30, -20, -20, -10, -10, 0, 0, 10, 10, 20, 20, 30, 30,),
+ (-30, -30, -20, -20, -10, -10, 0, 0, 10, 10, 20, 20, 30, 30,),
+ (-30, -30, -20, -20, -10, -10, 0, 0, 10, 10, 20, 20, 30, 30,),
+)
+
+TYPE_4_Y_TABLE = \
+(
+ (-28, -8, -28, -8, -28, -8, -28, -8, -28, -8, -28, -8, -28, -8,),
+ (8, 28, 8, 28, 8, 28, 8, 28, 8, 28, 8, 28, 8, 28,),
+ (-28, -8, -28, -8, -28, -8, -28, -8, -28, -8, -28, -8, -28, -8,),
+ (8, 28, 8, 28, 8, 28, 8, 28, 8, 28, 8, 28, 8, 28,),
+ (-28, -8, -28, -8, -28, -8, -28, -8, -28, -8, -28, -8, -28, -8,),
+ (8, 28, 8, 28, 8, 28, 8, 28, 8, 28, 8, 28, 8, 28,),
+ (-28, -8, -28, -8, -28, -8, -28, -8, -28, -8, -28, -8, -28, -8,),
+ (-28, -8, -28, -8, -28, -8, -28, -8, -28, -8, -28, -8, -28, -8,),
+ (8, 28, 8, 28, 8, 28, 8, 28, 8, 28, 8, 28, 8, 28,),
+ (-28, -8, -28, -8, -28, -8, -28, -8, -28, -8, -28, -8, -28, -8,),
+ (8, 28, 8, 28, 8, 28, 8, 28, 8, 28, 8, 28, 8, 28,),
+ (-28, -8, -28, -8, -28, -8, -28, -8, -28, -8, -28, -8, -28, -8,),
+ (8, 28, 8, 28, 8, 28, 8, 28, 8, 28, 8, 28, 8, 28,),
+ (-28, -8, -28, -8, -28, -8, -28, -8, -28, -8, -28, -8, -28, -8,),
+)
+
+TYPE_4_LC_TABLE = \
+(
+ (-31, -21, -10, 0, 10, 21, 31,),
+ (-31, -21, -10, 0, 10, 21, 31,),
+ (-31, -21, -10, 0, 10, 21, 31,),
+ (-31, -21, -10, 0, 10, 21, 31,),
+ (-31, -21, -10, 0, 10, 21, 31,),
+ (-31, -21, -10, 0, 10, 21, 31,),
+ (-31, -21, -10, 0, 10, 21, 31,),
+)
+
+TYPE_4_LM_TABLE = \
+(
+ (29, 29, 29, 29, 29, 29, 29,),
+ (19, 19, 19, 19, 19, 19, 19,),
+ (10, 10, 10, 10, 10, 10, 10,),
+ (0, 0, 0, 0, 0, 0, 0,),
+ (-10, -10, -10, -10, -10, -10, -10,),
+ (-19, -19, -19, -19, -19, -19, -19,),
+ (-29, -29, -29, -29, -29, -29, -29,),
+)
diff --git a/prnt/cups.py b/prnt/cups.py
new file mode 100644
index 0000000..cb202f0
--- /dev/null
+++ b/prnt/cups.py
@@ -0,0 +1,773 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2009 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+# Std Lib
+import os
+import os.path
+import gzip
+import re
+import time
+import urllib
+import tempfile
+import glob
+
+# Local
+from base.g import *
+from base import utils, models
+
+INVALID_PRINTER_NAME_CHARS = """~`!@#$%^&*()=+[]{}()\\/,.<>?'\";:| """
+
+# Handle case where cups.py (via device.py) is loaded
+# and cupsext doesn't exist yet. This happens in the
+# installer and in a fresh sandbox if the Python extensions
+# aren't installed yet.
+try:
+ current_language = os.getenv("LANG")
+ newlang = "C"
+
+ # this is a workaround due CUPS rejecting all encoding except ASCII
+ # and utf-8
+ # if the locale contains the encoding, switch to the same locale,
+ # but with utf-8 encoding. Otherwise use C locale.
+ if current_language is not None and current_language.count('.'):
+ newlang, encoding = current_language.split('.')
+ newlang += ".UTF-8"
+
+ os.environ['LANG'] = newlang
+
+ # the same works for LC_CTYPE, in case it's not set
+ current_ctype = os.getenv("LC_CTYPE")
+ newctype = "C"
+
+ if current_ctype is not None and current_ctype.count('.'):
+ newctype, encoding = current_ctype.split('.')
+ newctype += ".UTF-8"
+
+ os.environ['LC_CTYPE'] = newctype
+
+ import cupsext
+
+ # restore the old env values
+ if current_ctype is not None:
+ os.environ['LC_CTYPE'] = current_ctype
+
+ if current_language is not None:
+ os.environ['LANG'] = current_language
+
+except ImportError:
+ if not os.getenv("HPLIP_BUILD"):
+ log.warn("CUPSEXT could not be loaded. Please check HPLIP installation.")
+ sys.exit(1)
+
+
+IPP_PRINTER_STATE_IDLE = 3
+IPP_PRINTER_STATE_PROCESSING = 4
+IPP_PRINTER_STATE_STOPPED = 5
+
+# Std CUPS option types
+PPD_UI_BOOLEAN = 0 # True or False option
+PPD_UI_PICKONE = 1 # Pick one from a list
+PPD_UI_PICKMANY = 2 # Pick zero or more from a list
+
+# Non-std: General
+UI_SPINNER = 100 # Simple spinner with opt. suffix (ie, %)
+UI_UNITS_SPINNER = 101 # Spinner control w/pts, cm, in, etc. units (not impl.)
+UI_BANNER_JOB_SHEETS = 102 # dual combos for banner job-sheets
+UI_PAGE_RANGE = 103 # Radio + page range entry field
+
+# Non-std: Job storage
+UI_JOB_STORAGE_MODE = 104 # Combo w/linkage
+UI_JOB_STORAGE_PIN = 105 # Radios w/PIN entry
+UI_JOB_STORAGE_USERNAME = 106 # Radios w/text entry
+UI_JOB_STORAGE_ID = 107 # Radios w/text entry
+UI_JOB_STORAGE_ID_EXISTS = 108 # Combo
+
+UI_INFO = 109 # Information field, required Information name and Value
+
+# ipp_op_t
+IPP_PAUSE_PRINTER = 0x0010
+IPP_RESUME_PRINTER = 0x011
+IPP_PURGE_JOBS = 0x012
+CUPS_GET_DEFAULT = 0x4001
+CUPS_GET_PRINTERS = 0x4002
+CUPS_ADD_MODIFY_PRINTER = 0x4003
+CUPS_DELETE_PRINTER = 0x4004
+CUPS_GET_CLASSES = 0x4005
+CUPS_ADD_MODIFY_CLASS = 0x4006
+CUPS_DELETE_CLASS = 0x4007
+CUPS_ACCEPT_JOBS = 0x4008
+CUPS_REJECT_JOBS = 0x4009
+CUPS_SET_DEFAULT = 0x400a
+CUPS_GET_DEVICES = 0x400b
+CUPS_GET_PPDS = 0x400c
+CUPS_MOVE_JOB = 0x400d
+CUPS_AUTHENTICATE_JOB = 0x400e
+
+# ipp_jstate_t
+IPP_JOB_PENDING = 3 # Job is waiting to be printed
+IPP_JOB_HELD = 4 # Job is held for printing
+IPP_JOB_PROCESSING = 5 # Job is currently printing
+IPP_JOB_STOPPED = 6 # Job has been stopped
+IPP_JOB_CANCELLED = 7 # Job has been cancelled
+IPP_JOB_ABORTED = 8 # Job has aborted due to error
+IPP_JOB_COMPLETED = 8 # Job has completed successfully
+
+# ipp_status_e
+IPP_OK = 0x0000 # successful-ok
+IPP_OK_SUBST = 0x001 # successful-ok-ignored-or-substituted-attributes
+IPP_OK_CONFLICT = 0x002 # successful-ok-conflicting-attributes
+IPP_OK_IGNORED_SUBSCRIPTIONS = 0x003 # successful-ok-ignored-subscriptions
+IPP_OK_IGNORED_NOTIFICATIONS = 0x004 # successful-ok-ignored-notifications
+IPP_OK_TOO_MANY_EVENTS = 0x005 # successful-ok-too-many-events
+IPP_OK_BUT_CANCEL_SUBSCRIPTION = 0x006 # successful-ok-but-cancel-subscription
+IPP_OK_EVENTS_COMPLETE = 0x007 # successful-ok-events-complete
+IPP_REDIRECTION_OTHER_SITE = 0x300
+IPP_BAD_REQUEST = 0x0400 # client-error-bad-request
+IPP_FORBIDDEN = 0x0401 # client-error-forbidden
+IPP_NOT_AUTHENTICATED = 0x0402 # client-error-not-authenticated
+IPP_NOT_AUTHORIZED = 0x0403 # client-error-not-authorized
+IPP_NOT_POSSIBLE = 0x0404 # client-error-not-possible
+IPP_TIMEOUT = 0x0405 # client-error-timeout
+IPP_NOT_FOUND = 0x0406 # client-error-not-found
+IPP_GONE = 0x0407 # client-error-gone
+IPP_REQUEST_ENTITY = 0x0408 # client-error-request-entity-too-large
+IPP_REQUEST_VALUE = 0x0409 # client-error-request-value-too-long
+IPP_DOCUMENT_FORMAT = 0x040a # client-error-document-format-not-supported
+IPP_ATTRIBUTES = 0x040b # client-error-attributes-or-values-not-supported
+IPP_URI_SCHEME = 0x040c # client-error-uri-scheme-not-supported
+IPP_CHARSET = 0x040d # client-error-charset-not-supported
+IPP_CONFLICT = 0x040e # client-error-conflicting-attributes
+IPP_COMPRESSION_NOT_SUPPORTED = 0x040f # client-error-compression-not-supported
+IPP_COMPRESSION_ERROR = 0x0410 # client-error-compression-error
+IPP_DOCUMENT_FORMAT_ERROR = 0x0411 # client-error-document-format-error
+IPP_DOCUMENT_ACCESS_ERROR = 0x0412 # client-error-document-access-error
+IPP_ATTRIBUTES_NOT_SETTABLE = 0x0413 # client-error-attributes-not-settable
+IPP_IGNORED_ALL_SUBSCRIPTIONS = 0x0414 # client-error-ignored-all-subscriptions
+IPP_TOO_MANY_SUBSCRIPTIONS = 0x0415 # client-error-too-many-subscriptions
+IPP_IGNORED_ALL_NOTIFICATIONS = 0x0416 # client-error-ignored-all-notifications
+IPP_PRINT_SUPPORT_FILE_NOT_FOUND = 0x0417 # client-error-print-support-file-not-found
+IPP_INTERNAL_ERROR = 0x0500 # server-error-internal-error
+IPP_OPERATION_NOT_SUPPORTED = 0x0501 # server-error-operation-not-supported
+IPP_SERVICE_UNAVAILABLE = 0x0502 # server-error-service-unavailable
+IPP_VERSION_NOT_SUPPORTED = 0x0503 # server-error-version-not-supported
+IPP_DEVICE_ERROR = 0x0504 # server-error-device-error
+IPP_TEMPORARY_ERROR = 0x0505 # server-error-temporary-error
+IPP_NOT_ACCEPTING = 0x0506 # server-error-not-accepting-jobs
+IPP_PRINTER_BUSY = 0x0507 # server-error-busy
+IPP_ERROR_JOB_CANCELLED = 0x0508 # server-error-job-canceled
+IPP_MULTIPLE_JOBS_NOT_SUPPORTED = 0x0509 # server-error-multiple-document-jobs-not-supported
+IPP_PRINTER_IS_DEACTIVATED = 0x050a # server-error-printer-is-deactivated
+
+CUPS_ERROR_BAD_NAME = 0x0f00
+CUPS_ERROR_BAD_PARAMETERS = 0x0f01
+
+nickname_pat = re.compile(r'''\*NickName:\s*\"(.*)"''', re.MULTILINE)
+pat_cups_error_log = re.compile("""^loglevel\s?(debug|debug2|warn|info|error|none)""", re.I)
+ppd_pat = re.compile(r'''.*hp-(.*?)(-.*)*\.ppd.*''', re.I)
+
+
+
+def getPPDPath(addtional_paths=None):
+ """
+ Returns the CUPS ppd path (not the foomatic one under /usr/share/ppd).
+ Usually this is /usr/share/cups/model.
+ """
+ if addtional_paths is None:
+ addtional_paths = []
+
+ search_paths = prop.ppd_search_path.split(';') + addtional_paths
+
+ for path in search_paths:
+ ppd_path = os.path.join(path, 'cups/model')
+ if os.path.exists(ppd_path):
+ return ppd_path
+
+
+def getAllowableMIMETypes():
+ """
+ Scan all /etc/cups/*.convs and /usr/share/cups/mime
+ files for allowable file formats.
+ """
+ paths = []
+ allowable_mime_types = []
+ files = []
+ if os.path.exists("/etc/cups"):
+ paths.append("/etc/cups/*.convs")
+ if os.path.exists("/usr/share/cups/mime"):
+ paths.append("/usr/share/cups/mime/*.convs")
+ for path in paths:
+ files.extend(glob.glob(path))
+ for f in files:
+ #log.debug( "Capturing allowable MIME types from: %s" % f )
+ conv_file = file(f, 'r')
+
+ for line in conv_file:
+ if not line.startswith("#") and len(line) > 1:
+ try:
+ source, dest, cost, prog = line.split()
+ except ValueError:
+ continue
+
+ if source not in ('application/octet-stream', 'application/vnd.cups-postscript'):
+ allowable_mime_types.append(source)
+
+ # Add some well-known MIME types that may not appear in the .convs files
+ allowable_mime_types.append("image/x-bmp")
+ allowable_mime_types.append("text/cpp")
+ allowable_mime_types.append("application/x-python")
+ allowable_mime_types.append("application/hplip-fax")
+
+ return allowable_mime_types
+
+
+def getPPDDescription(f):
+ if f.endswith('.gz'):
+ nickname = gzip.GzipFile(f, 'r').read(4096)
+ else:
+ nickname = file(f, 'r').read(4096)
+
+ try:
+ desc = nickname_pat.search(nickname).group(1)
+ except AttributeError:
+ desc = ''
+
+ return desc
+
+
+def getSystemPPDs():
+ major, minor, patch = getVersionTuple()
+ ppds = {} # {'ppd name' : 'desc', ...}
+
+ if major == 1 and minor < 2:
+ ppd_dir = sys_conf.get('dirs', 'ppd')
+ log.debug("(CUPS 1.1.x) Searching for PPDs in: %s" % ppd_dir)
+
+ for f in utils.walkFiles(ppd_dir, pattern="HP*ppd*;hp*ppd*", abs_paths=True):
+ desc = getPPDDescription(f)
+
+ if not ('foo2' in desc or
+ 'gutenprint' in desc.lower() or
+ 'gutenprint' in f):
+
+ ppds[f] = desc
+ log.debug("%s: %s" % (f, desc))
+
+ else: # 1.2.x
+ log.debug("(CUPS 1.2.x) Getting list of PPDs using CUPS_GET_PPDS...")
+ ppd_dict = cupsext.getPPDList()
+ cups_ppd_path = getPPDPath() # usually /usr/share/cups/model
+ foomatic_ppd_path = sys_conf.get('dirs', 'ppdbase', '/usr/share/ppd')
+
+ if not foomatic_ppd_path or not os.path.exists(foomatic_ppd_path):
+ foomatic_ppd_path = '/usr/share/ppd'
+
+ log.debug("CUPS PPD base path = %s" % cups_ppd_path)
+ log.debug("Foomatic PPD base path = %s" % foomatic_ppd_path)
+
+ for ppd in ppd_dict:
+ if not ppd:
+ continue
+
+ if 'hp-' in ppd.lower() or 'hp_' in ppd.lower() and \
+ ppd_dict[ppd]['ppd-make'] == 'HP':
+
+ desc = ppd_dict[ppd]['ppd-make-and-model']
+
+ if not ('foo2' in desc.lower() or
+ 'gutenprint' in desc.lower() or
+ 'gutenprint' in ppd):
+
+ # PPD files returned by CUPS_GET_PPDS (and by lpinfo -m)
+ # can be relative to /usr/share/ppd/ or to
+ # /usr/share/cups/model/. Not sure why this is.
+ # Here we will try both and see which one it is...
+
+ if os.path.exists(ppd):
+ path = ppd
+ else:
+ try:
+ path = os.path.join(foomatic_ppd_path, ppd)
+ except AttributeError: # happens on some boxes with provider: style ppds (foomatic: etc)
+ path = ppd
+ else:
+ if not os.path.exists(path):
+ try:
+ path = os.path.join(cups_ppd_path, ppd)
+ except AttributeError:
+ path = ppd
+ else:
+ if not os.path.exists(path):
+ path = ppd # foomatic: or some other driver
+
+ ppds[path] = desc
+ #log.debug("%s: %s" % (path, desc))
+
+ return ppds
+
+
+## TODO: Move this to CUPSEXT for better performance
+def levenshtein_distance(a,b):
+ """
+ Calculates the Levenshtein distance between a and b.
+ Written by Magnus Lie Hetland.
+ """
+ n, m = len(a), len(b)
+ if n > m:
+ a,b = b,a
+ n,m = m,n
+
+ current = range(n+1)
+ for i in range(1,m+1):
+ previous, current = current, [i]+[0]*m
+
+ for j in range(1,n+1):
+ add, delete = previous[j]+1, current[j-1]+1
+ change = previous[j-1]
+
+ if a[j-1] != b[i-1]:
+ change = change + 1
+
+ current[j] = min(add, delete, change)
+
+ return current[n]
+
+
+number_pat = re.compile(r""".*?(\d+)""", re.IGNORECASE)
+
+STRIP_STRINGS2 = ['foomatic:', 'hp-', 'hp_', 'hp ', '.gz', '.ppd',
+ 'drv:', '-pcl', '-pcl3', '-jetready',
+ '-zxs', '-zjs', '-ps', '-postscript',
+ '-jr', '-lidl', '-lidil', '-ldl', '-hpijs']
+
+
+for p in models.TECH_CLASS_PDLS.values():
+ pp = '-%s' % p
+ if pp not in STRIP_STRINGS2:
+ STRIP_STRINGS2.append(pp)
+
+
+STRIP_STRINGS = STRIP_STRINGS2[:]
+STRIP_STRINGS.extend(['-series', ' series', '_series'])
+
+
+def stripModel2(model): # For new 2.8.10+ PPD find algorithm
+ model = model.lower()
+
+ for x in STRIP_STRINGS2:
+ model = model.replace(x, '')
+
+ return model
+
+
+def stripModel(model): # for old PPD find algorithm (removes "series" as well)
+ model = model.lower()
+
+ for x in STRIP_STRINGS:
+ model = model.replace(x, '')
+
+ return model
+
+
+def getPPDFile(stripped_model, ppds): # Old PPD find
+ """
+ Match up a model name to a PPD from a list of system PPD files.
+ """
+ log.debug("1st stage edit distance match")
+ mins = {}
+ eds = {}
+ min_edit_distance = sys.maxint
+
+ log.debug("Determining edit distance from %s (only showing edit distances < 4)..." % stripped_model)
+ for f in ppds:
+ t = stripModel(os.path.basename(f))
+ eds[f] = levenshtein_distance(stripped_model, t)
+ if eds[f] < 4:
+ log.debug("dist('%s') = %d" % (t, eds[f]))
+ min_edit_distance = min(min_edit_distance, eds[f])
+
+ log.debug("Min. dist = %d" % min_edit_distance)
+
+ for f in ppds:
+ if eds[f] == min_edit_distance:
+ for m in mins:
+ if os.path.basename(m) == os.path.basename(f):
+ break # File already in list possibly with different path (Ubuntu, etc)
+ else:
+ mins[f] = ppds[f]
+
+ log.debug(mins)
+
+ if len(mins) > 1: # try pattern matching the model number
+ log.debug("2nd stage matching with model number")
+
+ try:
+ model_number = number_pat.match(stripped_model).group(1)
+ model_number = int(model_number)
+ except AttributeError:
+ pass
+ except ValueError:
+ pass
+ else:
+ log.debug("model_number=%d" % model_number)
+ matches = {} #[]
+ for x in range(3): # 1, 10, 100
+ factor = 10**x
+ log.debug("Factor = %d" % factor)
+ adj_model_number = int(model_number/factor)*factor
+ number_matching, match = 0, ''
+
+ for m in mins:
+ try:
+ mins_model_number = number_pat.match(os.path.basename(m)).group(1)
+ mins_model_number = int(mins_model_number)
+ log.debug("mins_model_number= %d" % mins_model_number)
+ except AttributeError:
+ continue
+ except ValueError:
+ continue
+
+ mins_adj_model_number = int(mins_model_number/factor)*factor
+ log.debug("mins_adj_model_number=%d" % mins_adj_model_number)
+ log.debug("adj_model_number=%d" % adj_model_number)
+
+ if mins_adj_model_number == adj_model_number:
+ log.debug("match")
+ number_matching += 1
+ matches[m] = ppds[m]
+ log.debug(matches)
+
+ log.debug("***")
+
+ if len(matches):
+ mins = matches
+ break
+
+ return mins
+
+
+def getPPDFile2(stripped_model, ppds): # New PPD find
+ # This routine is for the new PPD naming scheme begun in 2.8.10
+ # and beginning with implementation in 2.8.12 (Qt4 hp-setup)
+ # hp-<model name from models.dat w/o beginning hp_>[-<pdl>][-<pdl>][...].ppd[.gz]
+ # 3.9.6: Added handling for hpijs vs. hpcups PPDs/DRVs
+ log.debug("Matching PPD list to model %s..." % stripped_model)
+ matches = []
+ for f in ppds:
+ match = ppd_pat.match(f)
+ if match is not None:
+ if match.group(1) == stripped_model:
+ log.debug("Found match: %s" % f)
+ try:
+ pdls = match.group(2).split('-')
+ except AttributeError:
+ pdls = []
+
+ if (prop.hpcups_build and 'hpijs' not in f) or \
+ ((prop.hpijs_build and 'hpijs' in pdls) or (prop.hpcups_build and 'hpijs' not in pdls)) or \
+ ('ps' in pdls):
+ matches.append((f, [p for p in pdls if p and p != 'hpijs']))
+
+ log.debug(matches)
+ num_matches = len(matches)
+
+ if num_matches == 0:
+ log.warn("No PPD found for model %s using new algorithm. Trying old algorithm..." % stripped_model)
+ matches2 = getPPDFile(stripModel(stripped_model), ppds).items()
+ log.debug(matches2)
+ num_matches2 = len(matches2)
+ if num_matches2:
+ for f, d in matches2:
+ match = ppd_pat.match(f)
+ if match is not None:
+ log.debug("Found match: %s" % f)
+ try:
+ pdls = match.group(2).split('-')
+ except AttributeError:
+ pdls = []
+
+ if (prop.hpcups_build and 'hpijs' not in f) or \
+ ((prop.hpijs_build and 'hpijs' in pdls) or (prop.hpcups_build and 'hpijs' not in pdls)) or \
+ ('ps' in pdls):
+ matches.append((f, [p for p in pdls if p and p != 'hpijs']))
+
+ log.debug(matches)
+ num_matches = len(matches)
+
+ if num_matches == 0:
+ log.error("No PPD found for model %s using old algorithm." % stripModel(stripped_model))
+ return None
+
+ elif num_matches == 1:
+ log.debug("One match found.")
+ return (matches[0][0], '')
+
+ # > 1
+ log.debug("%d matches found. Selecting based on PDL: Host > PS > PCL/Other" % num_matches)
+ for p in [models.PDL_TYPE_HOST, models.PDL_TYPE_PS, models.PDL_TYPE_PCL]:
+ for f, pdl_list in matches:
+ for x in pdl_list:
+ # default to HOST-based PDLs, as newly supported PDLs will most likely be of this type
+ if models.PDL_TYPES.get(x, models.PDL_TYPE_HOST) == p:
+ log.debug("Selecting '-%s' PPD: %s" % (x, f))
+ return (f, '')
+
+ # No specific PDL found, so just return 1st found PPD file
+ log.debug("No specific PDL located. Defaulting to first found PPD file.")
+ return (matches[0][0], '')
+
+
+
+def getErrorLogLevel():
+ cups_conf = '/etc/cups/cupsd.conf'
+ try:
+ f = file(cups_conf, 'r')
+ except OSError:
+ log.error("%s not found." % cups_conf)
+ except IOError:
+ log.error("%s: I/O error." % cups_conf)
+ else:
+ for l in f:
+ m = pat_cups_error_log.match(l)
+ if m is not None:
+ level = m.group(1).lower()
+ log.debug("CUPS error_log LogLevel: %s" % level)
+ return level
+
+ log.debug("CUPS error_log LogLevel: unknown")
+ return 'unknown'
+
+
+def getPrintJobErrorLog(job_id, max_lines=1000, cont_interval=5):
+ ret = []
+ s = '[Job %d]' % job_id
+ #level = getErrorLogLevel()
+ cups_conf = '/var/log/cups/error_log'
+
+ #if level in ('debug', 'debug2'):
+ if 1:
+ try:
+ f = file(cups_conf, 'r')
+ except (IOError, OSError):
+ log.error("Could not open the CUPS error_log file: %s" % cups_conf)
+ return ''
+
+ else:
+ if s in file(cups_conf, 'r').read():
+ queue = utils.Queue()
+ job_found = False
+
+ while True:
+ line = f.readline()
+
+ if s in line:
+ job_found = True
+
+ while len(queue):
+ ret.append(queue.get())
+
+ ret.append(line.strip())
+
+ if len(ret) > max_lines:
+ break
+
+ else:
+ if job_found:
+ queue.put(line.strip())
+
+ if len(queue) > cont_interval:
+ break
+
+ return '\n'.join(ret)
+
+
+#
+# cupsext wrappers
+#
+
+def getDefaultPrinter():
+ r = cupsext.getDefaultPrinter()
+ if r is None:
+ log.debug("The CUPS default printer is not set.")
+ return r
+
+def setDefaultPrinter(printer_name):
+ setPasswordPrompt("You do not have permission to set the default printer.")
+ return cupsext.setDefaultPrinter(printer_name)
+
+def accept(printer_name):
+ setPasswordPrompt("You do not have permission to accept jobs on a printer queue.")
+ return controlPrinter(printer_name, CUPS_ACCEPT_JOBS)
+
+def reject(printer_name):
+ setPasswordPrompt("You do not have permission to reject jobs on a printer queue.")
+ return controlPrinter(printer_name, CUPS_REJECT_JOBS)
+
+def start(printer_name):
+ setPasswordPrompt("You do not have permission to start a printer queue.")
+ return controlPrinter(printer_name, IPP_RESUME_PRINTER)
+
+def stop(printer_name):
+ setPasswordPrompt("You do not have permission to stop a printer queue.")
+ return controlPrinter(printer_name, IPP_PAUSE_PRINTER)
+
+def purge(printer_name):
+ setPasswordPrompt("You do not have permission to purge jobs.")
+ return controlPrinter(printer_name, IPP_PURGE_JOBS)
+
+def controlPrinter(printer_name, cups_op):
+ if cups_op in (CUPS_ACCEPT_JOBS, CUPS_REJECT_JOBS, IPP_PAUSE_PRINTER, IPP_RESUME_PRINTER, IPP_PURGE_JOBS):
+ return cupsext.controlPrinter(printer_name, cups_op)
+
+ return 0;
+
+def openPPD(printer):
+ if not printer:
+ return
+
+ return cupsext.openPPD(printer)
+
+def closePPD():
+ return cupsext.closePPD()
+
+def getPPD(printer):
+ if not printer:
+ return
+
+ return cupsext.getPPD(printer)
+
+def getPPDOption(option):
+ return cupsext.getPPDOption(option)
+
+def getPPDPageSize():
+ return cupsext.getPPDPageSize()
+
+def getPrinters():
+## p2 = []
+## p = cupsext.getPrinters()
+## for pp in p:
+## print pp
+## try:
+## pn = pp.name.decode('utf-8')
+## except UnicodeError:
+## pass
+##
+## p2.append(pp)
+##
+## return p2
+ return cupsext.getPrinters()
+
+def getJobs(my_job=0, completed=0):
+ return cupsext.getJobs(my_job, completed)
+
+def getAllJobs(my_job=0):
+ return cupsext.getJobs(my_job, 0) + cupsext.getJobs(my_job, 1)
+
+def getVersion():
+ return cupsext.getVersion()
+
+def getVersionTuple():
+ return cupsext.getVersionTuple()
+
+def getServer():
+ return cupsext.getServer()
+
+def cancelJob(jobid, dest=None):
+ setPasswordPrompt("You do not have permission to cancel a job.")
+ if dest is not None:
+ return cupsext.cancelJob(dest, jobid)
+ else:
+ jobs = cupsext.getJobs(0, 0)
+ for j in jobs:
+ if j.id == jobid:
+ return cupsext.cancelJob(j.dest, jobid)
+
+ return False
+
+def resetOptions():
+ return cupsext.resetOptions()
+
+def addOption(option):
+ return cupsext.addOption(option)
+
+def getOptions():
+ return cupsext.getOptions()
+
+def printFile(printer, filename, title):
+ if os.path.exists(filename):
+ printer = printer.encode('utf-8')
+ filename = filename.encode('utf-8')
+ title = title.encode('utf-8')
+ return cupsext.printFileWithOptions(printer, filename, title)
+
+ else:
+ return -1
+
+def addPrinter(printer_name, device_uri, location, ppd_file, model, info):
+ log.debug("addPrinter('%s', '%s', '%s', '%s', '%s', '%s')" %
+ ( printer_name, device_uri, location, ppd_file, model, info))
+
+ if ppd_file and not os.path.exists(ppd_file):
+ log.error("PPD file '%s' not found." % ppd_file)
+ return (-1, "PPD file not found")
+
+ return cupsext.addPrinter(printer_name, device_uri, location, ppd_file, model, info)
+
+def delPrinter(printer_name):
+ setPasswordPrompt("You do not have permission to delete a printer.")
+ return cupsext.delPrinter(printer_name)
+
+def enablePrinter(printer_name):
+ setPasswordPrompt("You do not have permission to enable a printer.")
+ cmd= "cupsenable %s"%printer_name
+ return os.system(cmd)
+
+def getGroupList():
+ return cupsext.getGroupList()
+
+def getGroup(group):
+ return cupsext.getGroup(group)
+
+def getOptionList(group):
+ return cupsext.getOptionList(group)
+
+def getOption(group, option):
+ return cupsext.getOption(group, option)
+
+def getChoiceList(group, option):
+ return cupsext.getChoiceList(group, option)
+
+def getChoice(group, option, choice):
+ return cupsext.getChoice(group, option, choice)
+
+def setOptions():
+ return cupsext.setOptions()
+
+def removeOption(option):
+ return cupsext.removeOption(option)
+
+def setPasswordCallback(func):
+ return cupsext.setPasswordCallback(func)
+
+def setPasswordPrompt(prompt):
+ return cupsext.setPasswordPrompt(prompt)
+
+def findPPDAttribute(name, spec):
+ return cupsext.findPPDAttribute(name, spec)
diff --git a/prnt/cupsext/cupsext.c b/prnt/cupsext/cupsext.c
new file mode 100644
index 0000000..f59b961
--- /dev/null
+++ b/prnt/cupsext/cupsext.c
@@ -0,0 +1,1921 @@
+/*
+cupsext - Python extension class for CUPS 1.1+
+
+(c) Copyright 2003-2007 Hewlett-Packard Development Company, L.P.
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+Portions based on:
+"lpadmin" command for the Common UNIX Printing System (CUPS).
+
+Copyright 1997-2003 by Easy Software Products.
+
+These coded instructions, statements, and computer programs are the
+property of Easy Software Products and are protected by Federal
+copyright law. Distribution and use rights are outlined in the file
+"LICENSE.txt" which should have been included with this file. If this
+file is missing or damaged please contact Easy Software Products
+at:
+
+Attn: CUPS Licensing Information
+Easy Software Products
+44141 Airport View Drive, Suite 204
+Hollywood, Maryland 20636-3111 USA
+
+Voice: (301) 373-9603
+EMail: cups-info@cups.org
+ WWW: http://www.cups.org
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+3. Neither the name of Hewlett-Packard nor the names of its
+contributors may be used to endorse or promote products derived
+from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+Requires:
+CUPS 1.1+
+Python 2.2+
+
+Author:
+Don Welch
+Yashwant Kumar Sahu
+
+*/
+
+
+#include <Python.h>
+#include <structmember.h>
+#include <cups/cups.h>
+#include <cups/language.h>
+#include <cups/ppd.h>
+
+/* Ref: PEP 353 (Python 2.5) */
+#if PY_VERSION_HEX < 0x02050000
+typedef int Py_ssize_t;
+#define PY_SSIZE_T_MAX INT_MAX
+#define PY_SSIZE_T_MIN INT_MIN
+#endif
+
+
+int g_num_options = 0;
+cups_option_t * g_options;
+
+ppd_file_t * ppd = NULL;
+cups_dest_t * dest = NULL;
+
+cups_dest_t * g_dests = NULL;
+int g_num_dests = 0;
+
+const char * g_ppd_file = NULL;
+
+/*
+ * 'validate_name()' - Make sure the printer name only contains valid chars.
+ */
+
+static int /* O - 0 if name is no good, 1 if name is good */
+validate_name( const char *name ) /* I - Name to check */
+{
+ return 1; // TODO: Make it work with utf-8 encoding
+}
+
+static PyObject * PyObj_from_UTF8(const char *utf8)
+{
+ PyObject *val = PyUnicode_Decode(utf8, strlen(utf8), "utf-8", NULL);
+
+ if (!val)
+ {
+ // CUPS 1.2 always gives us UTF-8. Before CUPS 1.2, the
+ // ppd-* strings come straight from the PPD with no
+ // transcoding, but the attributes-charset is still 'utf-8'
+ // so we've no way of knowing the real encoding.
+ // In that case, detect the error and force it to ASCII.
+ char * ascii;
+ const char * orig = utf8;
+ int i;
+
+ PyErr_Clear();
+ ascii = malloc(1 + strlen (orig));
+
+ for (i = 0; orig[i]; i++)
+ {
+ ascii[i] = orig[i] & 0x7f;
+ }
+
+ ascii[i] = '\0';
+ val = PyString_FromString( ascii );
+ free( ascii );
+ }
+
+ return val;
+}
+
+void debug(const char * text)
+{
+ char buf[4096];
+ sprintf( buf, "print '%s'", text);
+ PyRun_SimpleString( buf );
+
+}
+
+staticforward PyTypeObject printer_Type;
+
+#define printerObject_Check(v) ((v)->ob_type == &printer_Type)
+
+typedef struct
+{
+ PyObject_HEAD
+ PyObject * device_uri;
+ PyObject * printer_uri;
+ PyObject * name;
+ PyObject * location;
+ PyObject * makemodel;
+ PyObject * info;
+ int accepting;
+ int state;
+}
+printer_Object;
+
+
+static void printer_dealloc( printer_Object * self )
+{
+
+ Py_XDECREF( self->name );
+ Py_XDECREF( self->device_uri );
+ Py_XDECREF( self->printer_uri );
+ Py_XDECREF( self->location );
+ Py_XDECREF( self->makemodel );
+ Py_XDECREF( self->info );
+ PyObject_DEL( self );
+}
+
+
+static PyMemberDef printer_members[] =
+ {
+ { "device_uri", T_OBJECT_EX, offsetof( printer_Object, device_uri ), 0, "Device URI (device-uri)" },
+ { "printer_uri", T_OBJECT_EX, offsetof( printer_Object, printer_uri ), 0, "Printer URI (printer-uri)" },
+ { "name", T_OBJECT_EX, offsetof( printer_Object, name ), 0, "Name (printer-name)" },
+ { "location", T_OBJECT_EX, offsetof( printer_Object, location ), 0, "Location (printer-location)" },
+ { "makemodel", T_OBJECT_EX, offsetof( printer_Object, makemodel ), 0, "Make and model (printer-make-and-model)" },
+ { "state", T_INT, offsetof( printer_Object, state ), 0, "State (printer-state)" },
+ { "info", T_OBJECT_EX, offsetof( printer_Object, info ), 0, "Info/description (printer-info)" },
+ { "accepting", T_INT, offsetof( printer_Object, accepting ), 0, "Accepting/rejecting" },
+ {0}
+ };
+
+static PyTypeObject printer_Type =
+ {
+ PyObject_HEAD_INIT( &PyType_Type )
+ 0, /* ob_size */
+ "cupsext.Printer", /* tp_name */
+ sizeof( printer_Object ), /* tp_basicsize */
+ 0, /* tp_itemsize */
+ ( destructor ) printer_dealloc, /* tp_dealloc */
+ 0, /* tp_print */
+ 0, /* tp_getattr */
+ 0, /* tp_setattr */
+ 0, /* tp_compare */
+ 0, /* tp_repr */
+ 0, /* tp_as_number */
+ 0, /* tp_as_sequence */
+ 0, /* tp_as_mapping */
+ 0, /* tp_hash */
+ 0, /* tp_call */
+ 0, /* tp_str */
+ PyObject_GenericGetAttr, /* tp_getattro */
+ PyObject_GenericSetAttr, /* tp_setattro */
+ 0, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ "CUPS Printer object", /* tp_doc */
+ 0, /* tp_traverse */
+ 0, /* tp_clear */
+ 0, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ 0, /* tp_iter */
+ 0, /* tp_iternext */
+ 0, /*job_methods, */ /* tp_methods */
+ printer_members, /* tp_members */
+ 0, /* tp_getset */
+ 0, /* tp_base */
+ 0, /* tp_dict */
+ 0, /* tp_descr_get */
+ 0, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ 0, /* tp_init */
+ 0, /* tp_alloc */
+ 0, /* tp_new */
+ };
+
+
+
+
+static PyObject * _newPrinter( char * device_uri,
+ char * name,
+ char * printer_uri,
+ char * location,
+ char * makemodel,
+ char * info,
+ int state,
+ int accepting )
+{
+ printer_Object * self = PyObject_New( printer_Object, &printer_Type );
+
+ if ( !self )
+ return NULL;
+
+ if ( device_uri != NULL )
+ self->device_uri = Py_BuildValue( "s", device_uri );
+
+ if ( printer_uri != NULL )
+ self->printer_uri = Py_BuildValue( "s", printer_uri );
+
+ if ( name != NULL )
+ self->name = Py_BuildValue( "s", name );
+
+ if ( location != NULL )
+ self->location = Py_BuildValue( "s", location );
+
+ if ( makemodel != NULL )
+ self->makemodel = Py_BuildValue( "s", makemodel );
+
+ if ( info != NULL )
+ self->info = Py_BuildValue( "s", info );
+
+ self->accepting = accepting;
+ self->state = state;
+
+ return ( PyObject * ) self;
+}
+
+static PyObject * newPrinter( PyObject * self, PyObject * args, PyObject * kwargs )
+{
+ char * device_uri = "";
+ char * name = "";
+ char * location = "";
+ char * makemodel = "";
+ int state = 0;
+ char * printer_uri = "";
+ char * info = "";
+ int accepting = 0;
+
+ char * kwds[] = { "device_uri", "name", "printer_uri", "location",
+ "makemodel", "info", "state", "accepting", NULL };
+
+ if ( !PyArg_ParseTupleAndKeywords( args, kwargs, "zz|zzzzii", kwds,
+ &device_uri, &name, &printer_uri,
+ &location, &makemodel, &info, &state,
+ &accepting ) )
+ return NULL;
+
+ return _newPrinter( device_uri, printer_uri, name, location, makemodel, info, state, accepting);
+}
+
+
+
+PyObject * getPrinters( PyObject * self, PyObject * args )
+{
+ http_t * http = NULL; /* HTTP object */
+ ipp_t *request = NULL; /* IPP request object */
+ ipp_t *response = NULL; /* IPP response object */
+ ipp_attribute_t *attr; /* Current IPP attribute */
+ PyObject * printer_list;
+ cups_lang_t * language;
+
+ static const char * attrs[] = /* Requested attributes */
+ {
+ "printer-info",
+ "printer-location",
+ "printer-make-and-model",
+ "printer-state",
+ "printer-name",
+ "device-uri",
+ "printer-uri-supported",
+ "printer-is-accepting-jobs",
+ };
+
+ /* Connect to the HTTP server */
+ if ( ( http = httpConnectEncrypt( cupsServer(), ippPort(), cupsEncryption() ) ) == NULL )
+ {
+ goto abort;
+ }
+
+ /* Assemble the IPP request */
+ request = ippNew();
+ language = cupsLangDefault();
+
+ request->request.op.operation_id = CUPS_GET_PRINTERS;
+ request->request.any.request_id = 1;
+
+ ippAddString( request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
+ "attributes-charset", NULL, cupsLangEncoding( language ) );
+
+ ippAddString( request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
+ "attributes-natural-language", NULL, language->language );
+
+ ippAddStrings( request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD,
+ "requested-attributes", sizeof( attrs ) / sizeof( attrs[ 0 ] ),
+ NULL, attrs );
+
+ /* Send the request and get a response. */
+ if ( ( response = cupsDoRequest( http, request, "/" ) ) == NULL )
+ {
+ goto abort;
+ }
+
+ Py_ssize_t max_count = 0;
+
+ for ( attr = ippFindAttribute( response, "printer-name", IPP_TAG_NAME ),
+ max_count = 0;
+ attr != NULL;
+ attr = ippFindNextAttribute( response, "printer-name", IPP_TAG_NAME ),
+ max_count++ )
+ ;
+
+ if ( max_count > 0 )
+ {
+
+ //printer_list = PyList_New( max_count );
+ printer_list = PyList_New( 0 );
+
+ char * device_uri = "";
+ char * printer_uri = "";
+ char * info = "";
+ char * location = "";
+ char * make_model = "";
+ char * name = "";
+ int accepting = 0;
+ cups_ptype_t type;
+ ipp_pstate_t state;
+ int i = 0;
+
+ for ( attr = response->attrs; attr != NULL; attr = attr->next )
+ {
+ while ( attr != NULL && attr->group_tag != IPP_TAG_PRINTER )
+ attr = attr->next;
+
+ if ( attr == NULL )
+ break;
+
+ type = CUPS_PRINTER_REMOTE;
+ state = IPP_PRINTER_IDLE;
+ accepting = 0;
+
+ while ( attr != NULL && attr->group_tag == IPP_TAG_PRINTER )
+ {
+ if ( strcmp( attr->name, "printer-name" ) == 0 &&
+ attr->value_tag == IPP_TAG_NAME )
+ name = attr->values[ 0 ].string.text;
+
+ else if ( strcmp( attr->name, "device-uri" ) == 0 &&
+ attr->value_tag == IPP_TAG_URI )
+ device_uri = attr->values[ 0 ].string.text;
+
+ else if ( strcmp( attr->name, "printer-uri-supported" ) == 0 &&
+ attr->value_tag == IPP_TAG_URI )
+ printer_uri = attr->values[ 0 ].string.text;
+
+ else if ( strcmp( attr->name, "printer-info" ) == 0 &&
+ attr->value_tag == IPP_TAG_TEXT )
+ info = attr->values[ 0 ].string.text;
+
+ else if ( strcmp( attr->name, "printer-location" ) == 0 &&
+ attr->value_tag == IPP_TAG_TEXT )
+ location = attr->values[ 0 ].string.text;
+
+ else if ( strcmp( attr->name, "printer-make-and-model" ) == 0 &&
+ attr->value_tag == IPP_TAG_TEXT )
+ make_model = attr->values[ 0 ].string.text;
+
+ else if ( strcmp( attr->name, "printer-state" ) == 0 &&
+ attr->value_tag == IPP_TAG_ENUM )
+ state = ( ipp_pstate_t ) attr->values[ 0 ].integer;
+
+ else if (!strcmp(attr->name, "printer-is-accepting-jobs") &&
+ attr->value_tag == IPP_TAG_BOOLEAN)
+ accepting = attr->values[ 0 ].boolean;
+
+ attr = attr->next;
+ }
+
+ if ( device_uri == NULL )
+ {
+ if ( attr == NULL )
+ break;
+ else
+ continue;
+ }
+
+ printer_Object * printer;
+ printer = ( printer_Object * ) _newPrinter( device_uri, name, printer_uri, location, make_model,
+ info, state, accepting );
+
+ //PyList_SetItem( printer_list, i, ( PyObject * ) printer );
+ PyList_Append( printer_list, ( PyObject * ) printer );
+
+ i++;
+
+ if ( attr == NULL )
+ break;
+ }
+
+ return printer_list;
+ }
+abort:
+ if ( response != NULL )
+ ippDelete( response );
+
+ if ( http != NULL )
+ httpClose( http );
+
+ printer_list = PyList_New( ( Py_ssize_t ) 0 );
+ return printer_list;
+}
+
+
+PyObject * addPrinter( PyObject * self, PyObject * args )
+{
+ //char buf[1024];
+ ipp_status_t status;
+ http_t *http = NULL; /* HTTP object */
+ ipp_t *request = NULL; /* IPP request object */
+ ipp_t *response = NULL; /* IPP response object */
+ cups_lang_t * language;
+ int r;
+ char printer_uri[ HTTP_MAX_URI ];
+ char * name, * device_uri, *location, *ppd_file, * info, * model;
+ const char * status_str = "successful-ok";
+
+ if ( !PyArg_ParseTuple( args, "zzzzzz",
+ &name, // name of printer
+ &device_uri, // DeviceURI (e.g., hp:/usb/PSC_2200_Series?serial=0000000010)
+ &location, // location of printer
+ &ppd_file, // path to PPD file (uncompressed, must exist)
+ &model, // model name (e.g., foomatic:...)
+ &info // info/description
+ ) )
+ {
+ r = 0;
+ status_str = "Invalid arguments";
+ goto abort;
+ }
+
+ if ( ( strlen( ppd_file ) > 0 && strlen( model ) > 0 ) ||
+ ( strlen( ppd_file ) == 0 && strlen( model ) == 0) )
+ {
+ r = 0;
+ status_str = "Invalid arguments: specify only ppd_file or model, not both or neither";
+ goto abort;
+ }
+
+ if ( !validate_name( name ) )
+ {
+ r = 0;
+ status_str = "Invalid printer name";
+ goto abort;
+ }
+
+
+ sprintf( printer_uri, "ipp://localhost/printers/%s", name );
+
+ if ( info == NULL )
+ strcpy( info, name );
+
+ /* Connect to the HTTP server */
+ if ( ( http = httpConnectEncrypt( cupsServer(), ippPort(), cupsEncryption() ) ) == NULL )
+ {
+ r = 0;
+ status_str = "Unable to connect to CUPS server";
+ goto abort;
+ }
+
+ /* Assemble the IPP request */
+ request = ippNew();
+ language = cupsLangDefault();
+
+ request->request.op.operation_id = CUPS_ADD_PRINTER;
+ request->request.any.request_id = 1;
+
+ ippAddString( request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
+ "attributes-charset", NULL, cupsLangEncoding( language ) );
+
+ ippAddString( request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
+ "attributes-natural-language", NULL, language->language );
+
+ ippAddString( request, IPP_TAG_OPERATION, IPP_TAG_URI,
+ "printer-uri", NULL, printer_uri );
+
+ ippAddInteger( request, IPP_TAG_PRINTER, IPP_TAG_ENUM,
+ "printer-state", IPP_PRINTER_IDLE );
+
+ ippAddBoolean( request, IPP_TAG_PRINTER, "printer-is-accepting-jobs", 1 );
+
+ ippAddString( request, IPP_TAG_PRINTER, IPP_TAG_URI, "device-uri", NULL,
+ device_uri );
+
+ ippAddString( request, IPP_TAG_PRINTER, IPP_TAG_TEXT, "printer-info", NULL,
+ info );
+
+ ippAddString( request, IPP_TAG_PRINTER, IPP_TAG_TEXT, "printer-location", NULL,
+ location );
+
+ if ( strlen( model ) > 0 )
+ {
+ ippAddString( request, IPP_TAG_PRINTER, IPP_TAG_NAME, "ppd-name", NULL, model );
+
+ /* Send the request and get a response. */
+ response = cupsDoRequest( http, request, "/admin/" );
+ }
+ else
+ {
+ /* Send the request and get a response. */
+ response = cupsDoFileRequest( http, request, "/admin/", ppd_file );
+ }
+
+ if ( response == NULL )
+ {
+ status = cupsLastError();
+ r = 0;
+ }
+ else
+ {
+ status = response->request.status.status_code;
+ //ippDelete( response );
+ r = 1;
+ }
+
+ status_str = ippErrorString( status );
+
+abort:
+
+ if ( http != NULL )
+ httpClose( http );
+
+ if ( response != NULL )
+ ippDelete( response );
+
+ return Py_BuildValue( "is", r, status_str );
+
+}
+
+/*
+ * 'delPrinter()' - Delete a printer from the system...
+ */
+PyObject * delPrinter( PyObject * self, PyObject * args )
+{
+ ipp_t * request = NULL, /* IPP Request */
+ *response = NULL; /* IPP Response */
+ cups_lang_t *language; /* Default language */
+ char uri[ HTTP_MAX_URI ]; /* URI for printer/class */
+ char * name;
+ http_t *http = NULL; /* HTTP object */
+ int r = 0;
+ const char *username = NULL;
+
+ username = cupsUser();
+
+ if ( !PyArg_ParseTuple( args, "z",
+ &name ) ) // name of printer
+ {
+ goto abort;
+ }
+
+ if ( !validate_name( name ) )
+ {
+ goto abort;
+ }
+
+ /* Connect to the HTTP server */
+ if ( ( http = httpConnectEncrypt( cupsServer(), ippPort(), cupsEncryption() ) ) == NULL )
+ {
+ goto abort;
+ }
+ snprintf( uri, sizeof( uri ), "ipp://localhost/printers/%s", name );
+
+ /*
+ * Build a CUPS_DELETE_PRINTER request, which requires the following
+ * attributes:
+ *
+ * attributes-charset
+ * attributes-natural-language
+ * printer-uri
+ */
+ request = ippNew();
+
+ request->request.op.operation_id = CUPS_DELETE_PRINTER;
+ request->request.op.request_id = 1;
+
+ language = cupsLangDefault();
+
+ ippAddString( request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
+ "attributes-charset", NULL, cupsLangEncoding( language ) );
+
+ ippAddString( request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
+ "attributes-natural-language", NULL, language->language );
+
+ ippAddString( request, IPP_TAG_OPERATION, IPP_TAG_URI,
+ "printer-uri", NULL, uri );
+
+ /*
+ * Do the request and get back a response...
+ */
+ response = cupsDoRequest( http, request, "/admin/" );
+
+ if ( ( response != NULL ) && ( response->request.status.status_code <= IPP_OK_CONFLICT ) )
+ {
+ r = 1;
+ }
+
+abort:
+ if (username)
+ cupsSetUser(username);
+
+ if ( http != NULL )
+ httpClose( http );
+
+ if ( response != NULL )
+ ippDelete( response );
+
+ return Py_BuildValue( "i", r );
+
+}
+
+/*
+ * 'setDefaultPrinter()' - Set the default printing destination.
+ */
+
+PyObject * setDefaultPrinter( PyObject * self, PyObject * args )
+
+{
+ char uri[ HTTP_MAX_URI ]; /* URI for printer/class */
+ ipp_t *request = NULL, /* IPP Request */
+ *response = NULL; /* IPP Response */
+ cups_lang_t *language; /* Default language */
+ char * name;
+ http_t *http = NULL; /* HTTP object */
+ int r = 0;
+ const char *username = NULL;
+
+ username = cupsUser();
+
+ if ( !PyArg_ParseTuple( args, "z",
+ &name ) ) // name of printer
+ {
+ goto abort;
+ }
+
+ //char buf[1024];
+ //sprintf( buf, "print '%s'", name);
+ //PyRun_SimpleString( buf );
+
+ if ( !validate_name( name ) )
+ {
+ goto abort;
+ }
+
+ /* Connect to the HTTP server */
+ if ( ( http = httpConnectEncrypt( cupsServer(), ippPort(), cupsEncryption() ) ) == NULL )
+ {
+ goto abort;
+ }
+
+ /*
+ * Build a CUPS_SET_DEFAULT request, which requires the following
+ * attributes:
+ *
+ * attributes-charset
+ * attributes-natural-language
+ * printer-uri
+ */
+
+ snprintf( uri, sizeof( uri ), "ipp://localhost/printers/%s", name );
+
+ request = ippNew();
+
+ request->request.op.operation_id = CUPS_SET_DEFAULT;
+ request->request.op.request_id = 1;
+
+ language = cupsLangDefault();
+
+ ippAddString( request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
+ "attributes-charset", NULL, "utf-8" ); //cupsLangEncoding( language ) );
+
+ ippAddString( request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
+ "attributes-natural-language",
+ //NULL, language != NULL ? language->language : "en");
+ NULL, language->language );
+
+ ippAddString( request, IPP_TAG_OPERATION, IPP_TAG_URI,
+ "printer-uri", NULL, uri );
+
+ /*
+ * Do the request and get back a response...
+ */
+
+ response = cupsDoRequest( http, request, "/admin/" );
+
+ if ( ( response != NULL ) && ( response->request.status.status_code <= IPP_OK_CONFLICT ) )
+ {
+ r = 1;
+ }
+
+abort:
+ if (username)
+ cupsSetUser(username);
+
+ if ( http != NULL )
+ httpClose( http );
+
+ if ( response != NULL )
+ ippDelete( response );
+
+ return Py_BuildValue( "i", r );
+
+
+}
+
+
+
+PyObject * controlPrinter( PyObject * self, PyObject * args )
+{
+ ipp_t *request = NULL, /* IPP Request */
+ *response = NULL; /* IPP Response */
+ char * name;
+ http_t *http = NULL; /* HTTP object */
+ int op;
+ int r = 0;
+ char uri[ HTTP_MAX_URI ]; /* URI for printer/class */
+ cups_lang_t *language;
+ const char *username = NULL;
+
+ username = cupsUser();
+
+ if ( !PyArg_ParseTuple( args, "zi", &name, &op) )
+ {
+ goto abort;
+ }
+
+ if ( !validate_name( name ) )
+ {
+ goto abort;
+ }
+
+ /* Connect to the HTTP server */
+ if ( ( http = httpConnectEncrypt( cupsServer(), ippPort(), cupsEncryption() ) ) == NULL )
+ {
+ goto abort;
+ }
+
+ request = ippNew();
+
+ request->request.op.operation_id = op;
+ request->request.op.request_id = 1;
+
+ language = cupsLangDefault();
+
+ snprintf( uri, sizeof( uri ), "ipp://localhost/printers/%s", name );
+
+ ippAddString( request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
+ "attributes-charset", NULL, cupsLangEncoding( language ) );
+
+ ippAddString( request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
+ "attributes-natural-language", NULL, language->language );
+
+ ippAddString( request, IPP_TAG_OPERATION, IPP_TAG_URI,
+ "printer-uri", NULL, uri );
+
+
+ ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME,
+ "requesting-user-name", NULL, cupsUser());
+
+ if (op == IPP_PURGE_JOBS)
+ ippAddBoolean(request, IPP_TAG_OPERATION, "purge-jobs", 1);
+
+ response = cupsDoRequest(http, request, "/admin/");
+
+ if (( response != NULL ) && (response->request.status.status_code <= IPP_OK_CONFLICT))
+ {
+ r = 1;
+ }
+
+abort:
+ if (username)
+ cupsSetUser(username);
+
+ if ( http != NULL )
+ httpClose( http );
+
+ if ( response != NULL )
+ ippDelete( response );
+
+ return Py_BuildValue( "i", r );;
+}
+
+
+
+staticforward PyTypeObject job_Type;
+
+typedef struct
+{
+ PyObject_HEAD
+ int id;
+ PyObject * dest;
+ PyObject * title;
+ PyObject * user;
+ int state;
+ int size;
+}
+job_Object;
+
+
+
+static void job_dealloc( job_Object * self )
+{
+
+ Py_XDECREF( self->dest );
+ Py_XDECREF( self->title );
+ Py_XDECREF( self->user );
+ PyObject_DEL( self );
+}
+
+static PyMemberDef job_members[] =
+ {
+ { "id", T_INT, offsetof( job_Object, id ), 0, "Id" },
+ { "dest", T_OBJECT_EX, offsetof( job_Object, dest ), 0, "Destination" },
+ { "state", T_INT, offsetof( job_Object, state ), 0, "State" },
+ { "title", T_OBJECT_EX, offsetof( job_Object, title ), 0, "Title" },
+ { "user", T_OBJECT_EX, offsetof( job_Object, user ), 0, "User" },
+ { "size", T_INT, offsetof( job_Object, size ), 0, "Size" },
+ {0}
+ };
+
+
+
+static PyTypeObject job_Type =
+ {
+ PyObject_HEAD_INIT( &PyType_Type )
+ 0, /* ob_size */
+ "Job", /* tp_name */
+ sizeof( job_Object ), /* tp_basicsize */
+ 0, /* tp_itemsize */
+ ( destructor ) job_dealloc, /* tp_dealloc */
+ 0, /* tp_print */
+ 0, /* tp_getattr */
+ 0, /* tp_setattr */
+ 0, /* tp_compare */
+ 0, /* tp_repr */
+ 0, /* tp_as_number */
+ 0, /* tp_as_sequence */
+ 0, /* tp_as_mapping */
+ 0, /* tp_hash */
+ 0, /* tp_call */
+ 0, /* tp_str */
+ PyObject_GenericGetAttr, /* tp_getattro */
+ PyObject_GenericSetAttr, /* tp_setattro */
+ 0, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT, /* tp_flags */
+ "CUPS Job object", /* tp_doc */
+ 0, /* tp_traverse */
+ 0, /* tp_clear */
+ 0, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ 0, /* tp_iter */
+ 0, /* tp_iternext */
+ 0, /*job_methods, */ /* tp_methods */
+ job_members, /* tp_members */
+ 0, /* tp_getset */
+ 0, /* tp_base */
+ 0, /* tp_dict */
+ 0, /* tp_descr_get */
+ 0, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ 0, /* tp_init */
+ 0, //(initproc)job_init, /* tp_init */
+ 0, /* tp_alloc */
+ //PyType_GenericAlloc,
+ 0, //job_new, /* tp_new */
+ //PyType_GenericNew,
+ };
+
+
+static /*job_Object **/ PyObject * _newJob( int id, int state, char * dest, char * title, char * user, int size )
+{
+ job_Object * jo;
+ jo = PyObject_New( job_Object, &job_Type );
+ if ( jo == NULL )
+ return NULL;
+ jo->id = id;
+ jo->size = size;
+ jo->state = state;
+ if ( dest != NULL )
+ jo->dest = PyObj_from_UTF8( dest );
+ else
+ jo->dest = Py_BuildValue( "" );
+
+ if ( title != NULL )
+ jo->title = PyObj_from_UTF8( title );
+ else
+ jo->title = Py_BuildValue( "" );
+
+ if ( user != NULL )
+ jo->user = PyObj_from_UTF8( user );
+ else
+ jo->user = Py_BuildValue( "" );
+
+ return ( PyObject * ) jo;
+
+}
+
+static /*job_Object **/ PyObject * newJob( PyObject * self, PyObject * args, PyObject * kwargs )
+{
+ char * dest = "";
+ int id = 0;
+ int state = 0;
+ char * title = "";
+ char * user = "";
+ int size = 0;
+
+ char * kwds[] = { "id", "state", "dest", "title", "user", "size", NULL };
+
+ if ( !PyArg_ParseTupleAndKeywords( args, kwargs, "i|izzzi", kwds,
+ &id, &state, &dest, &title, &user, &size ) )
+ return NULL;
+
+ return _newJob( id, state, dest, title, user, size );
+
+}
+
+
+
+
+PyObject * getDefaultPrinter( PyObject * self, PyObject * args )
+{
+ const char * defdest;
+ defdest = cupsGetDefault();
+
+ /*char buf[1024];
+ sprintf( buf, "print 'Default Printer: %s'", defdest);
+ PyRun_SimpleString( buf );
+ */
+
+ if ( defdest == NULL )
+ return Py_BuildValue( "" ); // None
+ else
+ return Py_BuildValue( "s", defdest );
+
+}
+
+
+PyObject * cancelJob( PyObject * self, PyObject * args ) // cancelJob( dest, jobid )
+{
+ int status;
+ int jobid;
+ char * dest;
+
+ if ( !PyArg_ParseTuple( args, "si", &dest, &jobid ) )
+ {
+ return Py_BuildValue( "i", 0 );
+ }
+
+ status = cupsCancelJob( dest, jobid );
+
+ return Py_BuildValue( "i", status );
+}
+
+PyObject * getJobs( PyObject * self, PyObject * args )
+{
+ cups_job_t * jobs;
+ Py_ssize_t i;
+ int num_jobs;
+ PyObject * job_list;
+ int my_job;
+ int completed;
+
+ if ( !PyArg_ParseTuple( args, "ii", &my_job, &completed ) )
+ {
+ return PyList_New( ( Py_ssize_t ) 0 );
+ }
+
+ num_jobs = cupsGetJobs( &jobs, NULL, my_job, completed );
+
+ if ( num_jobs > 0 )
+ {
+ job_list = PyList_New( num_jobs );
+
+ for ( i = 0; i < num_jobs; i++ )
+ {
+ job_Object * newjob;
+ newjob = ( job_Object * ) _newJob( jobs[ i ].id,
+ jobs[ i ].state,
+ jobs[ i ].dest,
+ jobs[ i ].title,
+ jobs[ i ].user,
+ jobs[ i ].size );
+
+ PyList_SetItem( job_list, i, ( PyObject * ) newjob );
+
+ }
+ cupsFreeJobs( num_jobs, jobs );
+ }
+ else
+ {
+ job_list = PyList_New( ( Py_ssize_t ) 0 );
+ }
+ return job_list;
+}
+
+PyObject * getVersion( PyObject * self, PyObject * args )
+{
+ return Py_BuildValue( "f", CUPS_VERSION );
+}
+
+PyObject * getVersionTuple( PyObject * self, PyObject * args )
+{
+ return Py_BuildValue( "(iii)", CUPS_VERSION_MAJOR, CUPS_VERSION_MINOR, CUPS_VERSION_PATCH );
+}
+
+PyObject * getServer( PyObject * self, PyObject * args )
+{
+ return Py_BuildValue( "s", cupsServer() );
+}
+
+PyObject * setServer( PyObject * self, PyObject * args )
+{
+ char * server = NULL;
+
+ if (!PyArg_ParseTuple(args, "z", &server))
+ return Py_BuildValue( "" );
+
+ if (!strlen(server)) // Pass an empty string to restore default server
+ server = NULL;
+
+ cupsSetServer(server);
+
+ return Py_BuildValue( "" );
+}
+
+
+// ***************************************************************************************************
+
+PyObject * getPPDList( PyObject * self, PyObject * args )
+{
+
+/*
+ * Build a CUPS_GET_PPDS request, which requires the following
+ * attributes:
+ *
+ * attributes-charset
+ * attributes-natural-language
+ * printer-uri
+ */
+
+ ipp_t *request = NULL, /* IPP Request */
+ *response = NULL; /* IPP Response */
+ PyObject * result;
+ cups_lang_t *language;
+ ipp_attribute_t * attr;
+ //PyObject * ppd_list;
+ http_t *http = NULL; /* HTTP object */
+ //char buf[1024];
+
+ result = PyDict_New ();
+
+ if ( ( http = httpConnectEncrypt( cupsServer(), ippPort(), cupsEncryption() ) ) == NULL )
+ {
+ goto abort;
+ }
+
+ request = ippNew();
+
+ request->request.op.operation_id = CUPS_GET_PPDS;
+ request->request.op.request_id = 1;
+
+ language = cupsLangDefault();
+
+ ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
+ "attributes-charset", NULL, cupsLangEncoding(language));
+
+ ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
+ "attributes-natural-language", NULL, language->language);
+
+ //ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri",
+ // NULL, "ipp://localhost/printers/");
+
+ ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri",
+ NULL, "ipp://localhost/printers/officejet_4100");
+
+ ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "requested-attributes",
+ NULL, "all");
+
+ /*
+ * Do the request and get back a response...
+ */
+
+ if ((response = cupsDoRequest(http, request, "/")) != NULL)
+ {
+
+ for (attr = response->attrs; attr; attr = attr->next)
+ {
+ PyObject *dict;
+ char *ppdname = NULL;
+
+ while (attr && attr->group_tag != IPP_TAG_PRINTER)
+ attr = attr->next;
+
+ if (!attr)
+ break;
+
+ dict = PyDict_New ();
+
+ for (; attr && attr->group_tag == IPP_TAG_PRINTER; attr = attr->next)
+ {
+ PyObject *val = NULL;
+
+ if (!strcmp (attr->name, "ppd-name") && attr->value_tag == IPP_TAG_NAME)
+ {
+ ppdname = attr->values[0].string.text;
+
+ //sprintf( buf, "print '%s'", ppdname);
+ //PyRun_SimpleString( buf );
+ }
+
+ else if (attr->value_tag == IPP_TAG_TEXT || attr->value_tag == IPP_TAG_NAME || attr->value_tag == IPP_TAG_KEYWORD)
+ //else if ((!strcmp (attr->name, "ppd-natural-language") && attr->value_tag == IPP_TAG_LANGUAGE) ||
+ // (!strcmp (attr->name, "ppd-make-and-model") && attr->value_tag == IPP_TAG_TEXT) ||
+ // (!strcmp (attr->name, "ppd-make") && attr->value_tag == IPP_TAG_TEXT) ||
+ // (!strcmp (attr->name, "ppd-device-id") && attr->value_tag == IPP_TAG_TEXT))
+ {
+ val = PyObj_from_UTF8(attr->values[0].string.text);
+ }
+
+ if (val)
+ {
+ PyDict_SetItemString (dict, attr->name, val);
+ Py_DECREF (val);
+ }
+ }
+
+ if (ppdname)
+ {
+ PyDict_SetItemString (result, ppdname, dict);
+ }
+ else
+ {
+ Py_DECREF (dict);
+ }
+
+ if (!attr)
+ break;
+ }
+
+ //return result;
+ }
+
+abort:
+ if ( http != NULL )
+ httpClose( http );
+
+ if ( response != NULL )
+ ippDelete( response );
+
+ return result;
+}
+
+
+PyObject * openPPD( PyObject * self, PyObject * args )
+{
+ char * printer;
+ FILE * file;
+ int j;
+
+ if ( !PyArg_ParseTuple( args, "z", &printer ) )
+ {
+ return Py_BuildValue( "" ); // None
+ }
+
+ if ( ( g_ppd_file = cupsGetPPD( ( const char * ) printer ) ) == NULL )
+ {
+ goto bailout;
+ }
+
+ if ( ( file = fopen( g_ppd_file, "r" )) == NULL )
+ {
+ unlink(g_ppd_file);
+ g_ppd_file = NULL;
+ goto bailout;
+ }
+
+ ppd = ppdOpen( file );
+ ppdLocalize( ppd );
+ fclose( file );
+
+ g_num_dests = cupsGetDests( &g_dests );
+
+ if ( g_num_dests == 0 )
+ {
+ goto bailout;
+ }
+
+ if ( ( dest = cupsGetDest( printer, NULL, g_num_dests, g_dests ) ) == NULL )
+ {
+ goto bailout;
+ }
+
+ ppdMarkDefaults( ppd );
+ cupsMarkOptions( ppd, dest->num_options, dest->options );
+
+ for ( j = 0; j < dest->num_options; j++ )
+ {
+ if ( cupsGetOption( dest->options[ j ].name, g_num_options, g_options ) == NULL )
+ {
+ g_num_options = cupsAddOption( dest->options[ j ].name, dest->options[ j ].value, g_num_options, &g_options );
+ }
+ }
+
+bailout:
+ return Py_BuildValue( "s", g_ppd_file );
+}
+
+
+PyObject * closePPD( PyObject * self, PyObject * args )
+{
+ if ( ppd != NULL )
+ {
+ ppdClose( ppd );
+ unlink( g_ppd_file );
+ }
+
+ ppd = NULL;
+
+ return Py_BuildValue( "" ); // None
+}
+
+
+PyObject * getPPD( PyObject * self, PyObject * args )
+{
+ char * printer;
+
+ if ( !PyArg_ParseTuple( args, "z", &printer ) )
+ {
+ return Py_BuildValue( "" ); // None
+ }
+
+ const char * ppd_file;
+ ppd_file = cupsGetPPD( ( const char * ) printer );
+
+ return Py_BuildValue( "s", ppd_file );
+
+}
+
+
+PyObject * getPPDOption( PyObject * self, PyObject * args )
+{
+ if ( ppd != NULL )
+ {
+ char * option;
+
+ if ( !PyArg_ParseTuple( args, "z", &option ) )
+ {
+ return Py_BuildValue( "" ); // None
+ }
+
+ ppd_choice_t * marked_choice;
+ marked_choice = ppdFindMarkedChoice( ppd, option );
+
+ if ( marked_choice == NULL )
+ {
+ return Py_BuildValue( "" ); // None
+ }
+ else
+ {
+ return Py_BuildValue( "s", marked_choice->text );
+ }
+ }
+ else
+ {
+ return Py_BuildValue( "" ); // None
+ }
+}
+
+PyObject * findPPDAttribute( PyObject * self, PyObject * args )
+{
+ if ( ppd != NULL )
+ {
+ char * name;
+ char * spec;
+
+ if ( !PyArg_ParseTuple( args, "zz", &name, &spec ) )
+ {
+ return Py_BuildValue( "" ); // None
+ }
+
+ ppd_attr_t * ppd_attr;
+ ppd_attr = ppdFindAttr(ppd, name, spec );
+ if ( ppd_attr == NULL )
+ {
+ return Py_BuildValue( "" ); // None
+ }
+ else
+ {
+ return Py_BuildValue( "s", ppd_attr->value );
+ }
+ }
+ else
+ {
+ return Py_BuildValue( "" ); // None
+ }
+}
+
+PyObject * getPPDPageSize( PyObject * self, PyObject * args )
+{
+ //char buf[1024];
+
+ if ( ppd != NULL )
+ {
+ ppd_size_t * size = NULL;
+ float width = 0.0;
+ float length = 0.0;
+ ppd_choice_t * page_size = NULL;
+
+ page_size = ppdFindMarkedChoice( ppd, "PageSize" );
+
+ //sprintf( buf, "print '%s'", page_size->text );
+ //PyRun_SimpleString( buf );
+
+ if ( page_size == NULL )
+ goto bailout;
+
+ size = ppdPageSize( ppd, page_size->text );
+
+ if ( size == NULL )
+ goto bailout;
+
+ //sprintf( buf, "print '%s'", size->name );
+ //PyRun_SimpleString( buf );
+
+ width = ppdPageWidth( ppd, page_size->text );
+ length = ppdPageLength( ppd, page_size->text );
+
+ return Py_BuildValue( "(sffffff)", page_size->text, width, length, size->left,
+ size->bottom, size->right, size->top );
+ }
+
+bailout:
+ return Py_BuildValue( "(sffffff)", "", 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 );
+}
+
+// ***************************************************************************************************
+
+
+
+PyObject * resetOptions( PyObject * self, PyObject * args )
+{
+ if ( g_num_options > 0 )
+ cupsFreeOptions( g_num_options, g_options );
+ g_num_options = 0;
+ g_options = ( cups_option_t * ) 0;
+
+ return Py_BuildValue( "" );
+
+}
+
+PyObject * addOption( PyObject * self, PyObject * args )
+{
+ char * option;
+
+ if ( !PyArg_ParseTuple( args, "z", &option ) )
+ {
+ return Py_BuildValue( "i", 0 );
+ }
+
+ g_num_options = cupsParseOptions( option, g_num_options, &g_options );
+
+ return Py_BuildValue( "i", g_num_options ); // >0
+}
+
+PyObject * removeOption( PyObject * self, PyObject * args )
+{
+ char * option;
+ int j;
+ int r = 0;
+
+ if ( !PyArg_ParseTuple( args, "z", &option ) )
+ {
+ return Py_BuildValue( "i", 0 );
+ }
+
+ for (j = 0; j < g_num_options; j++)
+ {
+ if ( !strcasecmp(g_options[j].name, option) )
+ {
+ g_num_options--;
+
+ if ( j < g_num_options )
+ {
+ memcpy( (g_options + j), (g_options + j + 1),
+ sizeof(cups_option_t) * (g_num_options - j) );
+
+ r = 1;
+ }
+ }
+ }
+
+ return Py_BuildValue( "i", r );
+}
+
+
+PyObject * getOptions( PyObject * self, PyObject * args )
+{
+ PyObject * option_list;
+ int j;
+
+ option_list = PyList_New( ( Py_ssize_t ) 0 );
+ for ( j = 0; j < g_num_options; j++ )
+ {
+ PyList_Append( option_list, Py_BuildValue( "(ss)", g_options[ j ].name, g_options[ j ].value ) );
+ }
+
+ return option_list;
+}
+
+
+// ***************************************************************************************************
+
+
+
+PyObject * getGroupList( PyObject * self, PyObject * args )
+{
+ PyObject * group_list;
+ ppd_group_t *group;
+ int i;
+
+/* debug("at 0"); */
+
+ if ( ppd != NULL && dest != NULL )
+ {
+/* debug("at 1"); */
+
+ group_list = PyList_New( ( Py_ssize_t ) 0 );
+ for ( i = ppd->num_groups, group = ppd->groups; i > 0; i--, group++ )
+ {
+/* debug(group->name); */
+ PyList_Append( group_list, PyObj_from_UTF8( group->name ) );
+ }
+
+ return group_list;
+ }
+
+ return PyList_New( ( Py_ssize_t ) 0 );
+}
+
+
+PyObject * getGroup( PyObject * self, PyObject * args )
+{
+ const char *the_group;
+ ppd_group_t *group;
+ int i;
+
+ if ( !PyArg_ParseTuple( args, "z", &the_group ) )
+ {
+ goto bailout;
+ }
+
+ if ( ppd != NULL && dest != NULL )
+ {
+ for ( i = ppd->num_groups, group = ppd->groups; i > 0; i--, group++ )
+ {
+ if ( strcasecmp( group->name, the_group ) == 0 )
+ {
+ return Py_BuildValue( "(si)", group->text, group->num_subgroups);
+ }
+ }
+ }
+
+bailout:
+ return Py_BuildValue( "" );
+}
+
+
+
+PyObject * getOptionList( PyObject * self, PyObject * args )
+{
+ PyObject * option_list;
+ const char *the_group;
+ ppd_group_t *group;
+ int i, j;
+ ppd_option_t *option;
+
+ if ( !PyArg_ParseTuple( args, "z", &the_group ) )
+ {
+ goto bailout;
+ }
+
+ if ( ppd != NULL && dest != NULL )
+ {
+ option_list = PyList_New( ( Py_ssize_t ) 0 );
+
+ for ( i = ppd->num_groups, group = ppd->groups; i > 0; i--, group++ )
+ {
+ if ( strcasecmp( group->name, the_group ) == 0 )
+ {
+ for ( j = group->num_options, option = group->options; j > 0; j--, option++ )
+ {
+ PyList_Append( option_list, PyObj_from_UTF8( option->keyword ) );
+ }
+
+ break;
+ }
+ }
+
+ return option_list;
+ }
+
+
+
+bailout:
+ return PyList_New( ( Py_ssize_t ) 0 );
+}
+
+
+
+
+PyObject * getOption( PyObject * self, PyObject * args )
+{
+ const char *the_group;
+ const char *the_option;
+ ppd_group_t *group;
+ int i, j;
+ ppd_option_t *option;
+
+
+ if ( !PyArg_ParseTuple( args, "zz", &the_group, &the_option ) )
+ {
+ goto bailout;
+ }
+
+ if ( ppd != NULL && dest != NULL )
+ {
+
+ for ( i = ppd->num_groups, group = ppd->groups; i > 0; i--, group++ )
+ {
+ if ( strcasecmp( group->name, the_group ) == 0 )
+ {
+ for ( j = group->num_options, option = group->options; j > 0; j--, option++ )
+ {
+ if ( strcasecmp( option->keyword, the_option ) == 0 )
+ {
+ return Py_BuildValue( "(ssbi)", option->text, option->defchoice,
+ option->conflicted > 0 ? 1 : 0, option->ui );
+ }
+ }
+ }
+ }
+ }
+
+bailout:
+ return Py_BuildValue( "" );
+}
+
+
+PyObject * getChoiceList( PyObject * self, PyObject * args )
+{
+ PyObject * choice_list;
+ const char *the_group;
+ const char *the_option;
+ ppd_group_t *group;
+ int i, j, k;
+ ppd_option_t *option;
+ ppd_choice_t *choice;
+
+ if ( !PyArg_ParseTuple( args, "zz", &the_group, &the_option ) )
+ {
+ goto bailout;
+ }
+
+ if ( ppd != NULL && dest != NULL )
+ {
+ choice_list = PyList_New( ( Py_ssize_t ) 0 );
+
+ for ( i = ppd->num_groups, group = ppd->groups; i > 0; i--, group++ )
+ {
+ if ( strcasecmp( group->name, the_group ) == 0 )
+ {
+ for ( j = group->num_options, option = group->options; j > 0; j--, option++ )
+ {
+ if ( strcasecmp( option->keyword, the_option ) == 0 )
+ {
+ for ( k = option->num_choices, choice = option->choices; k > 0; k--, choice++ )
+ {
+ PyList_Append( choice_list, PyObj_from_UTF8( choice->choice ) );
+ }
+
+ break;
+ }
+ }
+ break;
+ }
+ }
+
+ return choice_list;
+ }
+
+
+bailout:
+ return PyList_New( ( Py_ssize_t ) 0 );
+}
+
+
+
+PyObject * getChoice( PyObject * self, PyObject * args )
+{
+ const char * the_group;
+ const char *the_option;
+ const char *the_choice;
+ ppd_group_t *group;
+ int i, j, k;
+ ppd_option_t *option;
+ ppd_choice_t *choice;
+
+
+ if ( !PyArg_ParseTuple( args, "zzz", &the_group, &the_option, &the_choice ) )
+ {
+ goto bailout;
+ }
+
+ if ( ppd != NULL && dest != NULL )
+ {
+ for ( i = ppd->num_groups, group = ppd->groups; i > 0; i--, group++ )
+ {
+ if ( strcasecmp( group->name, the_group ) == 0 )
+ {
+ for ( j = group->num_options, option = group->options; j > 0; j--, option++ )
+ {
+ if ( strcasecmp( option->keyword, the_option ) == 0 )
+ {
+ for ( k = option->num_choices, choice = option->choices; k > 0; k--, choice++ )
+ {
+ if ( strcasecmp( choice->choice, the_choice ) == 0 )
+ {
+ return Py_BuildValue( "(sb)", choice->text, choice->marked > 0 ? 1 : 0 );
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+
+bailout:
+ return Py_BuildValue( "" );
+
+
+
+}
+
+PyObject * setOptions( PyObject * self, PyObject * args )
+{
+ if ( ppd != NULL && dest != NULL )
+ {
+ cupsFreeOptions( dest->num_options, dest->options );
+ dest->num_options = g_num_options;
+ dest->options = g_options;
+ cupsSetDests( g_num_dests, g_dests );
+ cupsMarkOptions( ppd, dest->num_options, dest->options );
+ }
+
+ return Py_BuildValue( "" );
+}
+
+// ***************************************************************************************************
+
+PyObject * printFileWithOptions( PyObject * self, PyObject * args )
+{
+ char * printer;
+ char * filename;
+ char * title;
+ int job_id = -1;
+ cups_dest_t * dests = NULL;
+ cups_dest_t * dest = NULL;
+ int num_dests = 0;
+ int i = 0;
+
+ if ( !PyArg_ParseTuple( args, "zzz", &printer, &filename, &title ) )
+ {
+ return Py_BuildValue( "" ); // None
+ }
+
+ num_dests = cupsGetDests(&dests);
+ dest = cupsGetDest( printer, NULL, num_dests, dests );
+
+ if ( dest != NULL )
+ {
+ for( i = 0; i < dest->num_options; i++ )
+ {
+ if ( cupsGetOption( dest->options[i].name, g_num_options, g_options ) == NULL )
+ g_num_options = cupsAddOption( dest->options[i].name, dest->options[i].value, g_num_options, &g_options );
+
+ }
+
+ job_id = cupsPrintFile( dest->name, filename, title, g_num_options, g_options );
+
+ return Py_BuildValue( "i", job_id );
+ }
+
+ return Py_BuildValue( "i", -1 );
+}
+
+// ***************************************************************************************************
+
+static PyObject * passwordFunc = NULL;
+static char *passwordPrompt = NULL;
+
+const char * password_callback(const char * prompt)
+{
+
+ PyObject *result = NULL;
+ PyObject *usernameObj = NULL;
+ PyObject *passwordObj = NULL;
+ char *username = NULL;
+ char *password = NULL;
+
+ if (passwordFunc != NULL) {
+
+ if (passwordPrompt)
+ prompt = passwordPrompt;
+
+ result = PyObject_CallFunction(passwordFunc, "s", prompt);
+ if (!result)
+ return "";
+
+ usernameObj = PyTuple_GetItem(result, 0);
+ if (!usernameObj)
+ return "";
+ username = PyString_AsString(usernameObj);
+/* printf("usernameObj=%p, username='%s'\n", usernameObj, username); */
+ if (!username)
+ return "";
+
+ passwordObj = PyTuple_GetItem(result, 1);
+ if (!passwordObj)
+ return "";
+ password = PyString_AsString(passwordObj);
+/* printf("passwordObj=%p, password='%s'\n", passwordObj, password); */
+ if (!password)
+ return "";
+
+ cupsSetUser(username);
+ return password;
+
+ }
+
+ return "";
+
+}
+
+PyObject *setPasswordPrompt(PyObject *self, PyObject *args)
+{
+
+ char *userPrompt = NULL;
+
+ if (!PyArg_ParseTuple(args, "z", &userPrompt))
+ return Py_BuildValue("");
+
+ if (strlen(userPrompt) != 0)
+ passwordPrompt = userPrompt;
+ else
+ passwordPrompt = NULL;
+
+ return Py_BuildValue("");
+
+}
+
+PyObject * setPasswordCallback( PyObject * self, PyObject * args )
+{
+ if( !PyArg_ParseTuple( args, "O", &passwordFunc ) )
+ {
+ return Py_BuildValue( "i", 0 );
+ }
+
+ cupsSetPasswordCB(password_callback);
+
+ return Py_BuildValue( "i", 1 );
+}
+
+
+PyObject * getPassword( PyObject * self, PyObject * args )
+{
+ const char * pwd;
+ char * prompt;
+
+ if( !PyArg_ParseTuple( args, "s", &prompt ) )
+ {
+ return Py_BuildValue( "" );
+ }
+
+ pwd = cupsGetPassword( prompt );
+
+ if( pwd )
+ {
+ return Py_BuildValue( "s", pwd );
+ }
+ else
+ {
+ return Py_BuildValue( "" );
+ }
+}
+
+
+
+
+
+
+// ***************************************************************************************************
+
+static PyMethodDef cupsext_methods[] =
+ {
+ { "getPrinters", ( PyCFunction ) getPrinters, METH_VARARGS },
+ { "addPrinter", ( PyCFunction ) addPrinter, METH_VARARGS },
+ { "delPrinter", ( PyCFunction ) delPrinter, METH_VARARGS },
+ { "getDefaultPrinter", ( PyCFunction ) getDefaultPrinter, METH_VARARGS },
+ { "setDefaultPrinter", ( PyCFunction ) setDefaultPrinter, METH_VARARGS },
+ { "controlPrinter", ( PyCFunction ) controlPrinter, METH_VARARGS },
+ { "getPPDList", ( PyCFunction ) getPPDList, METH_VARARGS },
+ { "getPPD", ( PyCFunction ) getPPD, METH_VARARGS },
+ { "openPPD", ( PyCFunction ) openPPD, METH_VARARGS },
+ { "closePPD", ( PyCFunction ) closePPD, METH_VARARGS },
+ { "getPPDOption", ( PyCFunction ) getPPDOption, METH_VARARGS },
+ { "getPPDPageSize", ( PyCFunction ) getPPDPageSize, METH_VARARGS },
+ { "getVersion", ( PyCFunction ) getVersion, METH_VARARGS },
+ { "getVersionTuple", ( PyCFunction ) getVersionTuple, METH_VARARGS },
+ { "cancelJob", ( PyCFunction ) cancelJob, METH_VARARGS },
+ { "getJobs", ( PyCFunction ) getJobs, METH_VARARGS },
+ { "getServer", ( PyCFunction ) getServer, METH_VARARGS },
+ { "setServer", ( PyCFunction ) setServer, METH_VARARGS },
+ { "addOption", ( PyCFunction ) addOption, METH_VARARGS },
+ { "removeOption", ( PyCFunction ) removeOption, METH_VARARGS },
+ { "resetOptions", ( PyCFunction ) resetOptions, METH_VARARGS },
+ { "printFileWithOptions", ( PyCFunction ) printFileWithOptions, METH_VARARGS },
+ { "Job", ( PyCFunction ) newJob, METH_VARARGS | METH_KEYWORDS },
+ { "Printer", ( PyCFunction ) newPrinter, METH_VARARGS | METH_KEYWORDS },
+ { "getGroupList", ( PyCFunction ) getGroupList, METH_VARARGS },
+ { "getGroup", ( PyCFunction ) getGroup, METH_VARARGS },
+ { "getOptionList", ( PyCFunction ) getOptionList, METH_VARARGS },
+ { "getOption", ( PyCFunction ) getOption, METH_VARARGS },
+ { "getChoiceList", ( PyCFunction ) getChoiceList, METH_VARARGS },
+ { "getChoice", ( PyCFunction ) getChoice, METH_VARARGS },
+ { "setOptions", ( PyCFunction ) setOptions, METH_VARARGS },
+ { "getOptions", ( PyCFunction ) getOptions, METH_VARARGS },
+ { "setPasswordPrompt", (PyCFunction) setPasswordPrompt, METH_VARARGS },
+ { "setPasswordCallback", ( PyCFunction ) setPasswordCallback, METH_VARARGS },
+ { "getPassword", ( PyCFunction ) getPassword, METH_VARARGS },
+ { "findPPDAttribute", ( PyCFunction ) findPPDAttribute, METH_VARARGS },
+ { NULL, NULL }
+ };
+
+
+static char cupsext_documentation[] = "Python extension for CUPS 1.x";
+
+void initcupsext( void )
+{
+
+ PyObject * mod = Py_InitModule4( "cupsext", cupsext_methods,
+ cupsext_documentation, ( PyObject* ) NULL,
+ PYTHON_API_VERSION );
+
+ if ( mod == NULL )
+ return ;
+
+
+}
+
+
diff --git a/prnt/drv/hpcups.drv.in b/prnt/drv/hpcups.drv.in
new file mode 100644
index 0000000..b157a3c
--- /dev/null
+++ b/prnt/drv/hpcups.drv.in
@@ -0,0 +1,16338 @@
+// hpcups.drv - hpcups driver information file
+//
+// This driver information file (drv) produces PPD files for the CUPS interface solution.
+// Multiple printers are supported by a finite set of device classes. This file defines the device classes
+// and each model that is associated with that device class.
+//
+// All the PPDs created by this file are consumed by the /prnt/hpcups driver. Hpcups is a raster driver that
+// produces printer-ready-bits. The hpcups driver only works CUPS. Hpcups does not use the APDK, but
+// is based on re-purposed APDK code.
+//
+// Each device class will use the following Attributes to define what printer language and printer platform is
+// used by hpcups.
+//
+// Attribute "hpPrinterLanguage" "" "pcl3gui"
+// Attribute "hpPrinterPlatform" "" "dj970"
+//
+// Note the "cupsModelName" is no longer used and can be removed.
+//
+// The "hpPrinterLanguage" is required by all device classes. The "hpPrinterPlatform" is optional and is not
+// required for all device classes. For example the pcl3gui2 does use the "hpPrinterPlatform" attribute.
+//
+// Print modes, paper sizes and printable regions parameters are all now defined in the PPDs. In the old APDK code
+// these parameters were all hardcoded in the code.
+//
+// Each device class will have multiple model entrys.
+//
+// ModelName "HP Deskjet 970c"
+// Attribute "NickName" "" "HP Deskjet 970c, $Version"
+// Attribute "ShortNickName" "" "HP Deskjet 970c"
+// Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 970c;DES:deskjet 970c;"
+// PCFileName "hp-deskjet_970c.ppd"
+// Attribute "Product" "" "(HP Deskjet 970cxi Printer)"
+// Attribute "Product" "" "(HP Deskjet 970cse Printer)"
+// Attribute "Product" "" "(HP Deskjet 970c Printer)"
+//
+// The model entrys are filled in by the dat2drv.py script file. The dat2drv uses the model.dat file to determine
+// what models belong to what device class. The output of the dat2drv is hpcups.drv.in. The configure command
+// will create the final hpcups.drv file with the appropriate version number set.
+//
+// Normally the hpcups.drv.in file is built at bootstrap time and hpcups.drv file is build at configure time.
+//
+// The "ModelName" is a friendly name that can be displayed to the user for driver selection.
+//
+// The "PCFileName" should match the IEEE 1284 device-id model name. The model name is generated from the
+// IEEE 1284 "MDL" field. Leading and trailing spaces are removed, in-line spaces are replaced with a single
+// "_" character. Then an "hp-" prefix and "-hpijs.ppd" postfix is added/changed.
+//
+// The "1284DeviceID" is dummy IEEE 1284 device-id name. The name provides valid case insensitive MFG:, MDL: and DES fields.
+// This provides third-party applications with a generic mechanism for auto-ppd-selection.
+//
+// There should be one drv model entry for every unique device-id supported by hpcups. This means one model entry
+// may support more than one product. For example the DeskJet 970c, DeskJet 970cxi and DeskJet 950csi all have the
+// same device-id "MFG:HP;MDL:deskjet 970c;DES:deskjet 970c;". In this case there will only be one model entry
+// the "DeskJet 970c".
+//
+// Hpcups is a raster driver similar to hpijs. Hpcups is not a postscript driver. In order to discriminate hpcups
+// from other drivers we will use the following PPD file naming convention.
+//
+// hpijs with foomatic-rip
+// hp-xxxxxxx-hpijs-zzz.ppd for
+//
+// hpcups with native CUPS
+// hp-xxxxxxx-zzz.ppd
+//
+// Postscript
+// hp-xxxxxxx-ps.ppd
+//
+// Where
+// xxxxxxx = normalized device-id model name (ie: deskjet_6100_series)
+// zzz = page description language (ie: pcl, zjs, lidil). Use only to provide alternative PPD file selections.
+//
+// History
+// 1/7/08 dsuffield
+// New.
+//
+// 2/14/08 dsuffield
+// Tried using "#include xxx_margin.defs" inside the different device blocks, but CUPSDDK 1.2 did not handle it.
+// Driver "sizes" are deleted for every new block in ppdcSource::scan_file. So all xxx_margin.defs are in-lined.
+//
+// 4/20/09 dsuffield
+// All xxxDuplex papersizes have 1/8 inch subtracted from the length. Since ghostscript 8.63 cannot handle the same papersize
+// with different printable regions. The xxxDuplex printable region length is adjusted accordingly.
+//
+// 4/21/09 dsuffield
+// Ijsdump can no longer be used to update printable margins for xxxDuplex and xxxFB papersizes.
+//
+// 4/22/09 dsuffield
+// Since ijsdump is no longer useful, I collapsed most large format MediaSizes.
+//
+// 6/4/09 dsuffield
+// Converted papersizes to CustomMedia directive so that the PCL papersize can be specified with cupsInteger0.
+//
+// 10/27/09 jcallough
+// Corrected imageable areas for LJZjsMono, LJZjscolor on the following paper sizes:
+// 3x5, Hagaki, A5, 5x8, Oufuku-Hagaki, B5, Executive, A2Envelope, C6Envelope, #4Envelope, and C5Envelope
+//
+// 10/27/09 jcallough
+// Corrected imageable areas for LJZjsMono, LJZjscolor on the following paper sizes:
+// JB5, A4, #4, Monarch, DL, and #3
+// Changed the margin limitations to match hpijs on LJFastRaster
+//
+// 10/28/09 jcallough
+// Corrected margin issues for the following printer classes:
+// LJZjsMono, LJZjsColor, LJFastRaster,
+// LJFastRaster: Changed the CupsInteger0 from a specific # to 96 to ensure that the image is printed correctly
+// LJJetReady: Changed some CupsInteger0 #'s, changed some Imageable area parameters
+//
+// 11/3/09 jcallough
+// Corrected margin for DJ9xx A6.Duplex, A4.Duplex, cupsInteger0 was changed from 10 to 101 so that the full image will print
+// with ExecutiveJIS and American Foolscap
+//
+// 11/5/09 jcallough
+// DJ850, DJ630, DJ600&6xx : Deleted 3x5 paper size (doesn't fit in printer), Changed cupsInteger0 to 101
+//
+// 11/5/09 jcallough
+// DJ890: changed ExecutiveJIS and American Foolscap to cupsIntege0 101 from 10, Changed A2 and C6 cupsInteger0 to 101,
+// Changed #4 Envelope to cupsInteger0 to 101, DL Envelope to 101, #3 Envelope to 101, 5x7 to CupsInteger0 101
+// DJ8xx: Changed A2 margins to 9 36 9 9,
+// DJ6xxPhoto: Changed C6Envelope to CupsInteger0 101, Oufuku-Hagaki to CupsInteger0 101,
+//
+// 11/12/09 jcallough
+// DJ8x5: Removed ExecutiveJIS (paper size not supported), Removed American Foolscap (paper size not supported),
+// Changed 16k CupsInteger0 to 40,
+// DJ540: Changed ExecutiveJIS and AmericanFoolscap CupsInteger0 to 101,#10 Envelope CupsInteger0 to 101,DL Envelope
+// CupsInteger0 to 101,
+// DJ9xxVIP without 1200-dpi mode and without paper type sensor: Changed ExecutiveJIS and AmericanFoolscap CupsInteger0
+// to 101,
+//
+// 11/13/09 jcallough
+// DJ350: Removed paper sized smaller than JB5 (don't fit), Removed envelope sizes (don't fit), Oufuku-Hagaki CupsInteger0
+// to 101, ExecutiveJIS ad American Foolscap CupsInteger0 to 101
+// DJ130: Removed 3x5 Index Card (doesn't fit), Removed #4 Envelope (doesn't fit), Removed Monarch Envelope, Changed Imageable area
+// for all regular paper sizes to {9 36 9 9}, Changed Imageable area for all full bleed paper sizes to {0 0 0 ~46}
+// PSP470 5x7 4sided full bleed: Removed 3x5 Index, Oufuku-Hagaki, and A5 (don't fit); Monarch (not supported)
+// DJ630: Oufuku-Hagaki cupsInteger0 to 101,
+// DJ600 & 6xx, DJ6xxPhoto: Changed Hagaki, 4x6, A6, 5x8, Oufuku-Hagaki, #3 Envelope cupsInteger0 to 101;
+// DJGenericVIP 4x6 4sided Fullbleed: Removed 3x5 (doesn't fit) and Monarch Envelope (paper size not supported)
+//
+// 11/17/09 jcallough
+// DJ4100: Added the printer platform "djd2600" to the Deskjet D2660 printer under the DJ4100 class to allow for
+// proper grayscale printing
+//
+// 11/23/09 mubeen
+// Added Stabler class. More classes to follow.
+//
+// 12/08/09 mubeen
+// ViperPlusVIP, ViperMinusVIP, Corbett(OJPro8000) are new classes. (Removed Python)
+// Removed APDK device class attributes for all new classes
+// Borderless Overspray: Added cupsReal0 and cupsReal1 for left and top overspray for Fullbleed paper sizes
+// Stabler: Added 2L paper size. Updated Fullbleed paper sizes with overspray values
+// Upper Tray is identified as Main Tray now. (spec refers as main tray). PCL ID is taken from specs.
+// ViperPlusVIP: Media sources are Automatic and Main Tray
+// Added 2L paper size. Updated Fullbleed paper sizes with overspray values
+// Removed CD/DVD media and related constraints
+// Removed Draft mode and related constraints
+// ViperMinus: Removed all media sources. Updated Fullbleed paper sizes with overspray values
+// Removed Draft mode and related constraints
+// Removed CD/DVD media and related constraints
+// Corbett: Removed 3_L duplex size
+//
+// 12/09/09 mubeen
+// ViperPlusVIP: Added 2L, Mutsugiri paper sizes. Was not added earlier. Updated Cabinet.DB margin
+// ViperMinusVIP: Updated custom paper size margins
+// Stabler: Correct paper names for 3.5x5in, 3.5x5in FB, 2L
+// Corbett: Redid the class to align with the specs.
+//
+// 12/10/09 Shakil
+// Corbett: Changed the JB5.FB PCL ID to 45
+//
+// 12/10/09 mubeen
+// Corbett: Added UIConstraints for Draft and Fullbleed
+// Stabler, ViperPlusVIP, ViperMinusVIP: Added UIConstraints for FastDraft and Fullbleed
+// Changed Output mode order (RGB, High Quality Gray, Black only)
+// ViperPlus, ViperMinus: Updated overspray values.
+//
+// 12/11/09 adhir
+// Stabler: Margin correction of 0.3 for Hagaki.FB
+// ViperMinus: Margin correction for Executive and Legal; Added Card4x6, Photo4x6tab and Photo4x6tab.FB; Removed Photo4x6.FB
+// ViperPlus: Removed Media position section as it is not needed (as per specs).
+//
+// 12/15/09 adhir
+// Reverted Corbbet changes
+//
+// 01/15/10 adhir
+// Added ViperPlusTrim and ViperMinusTrim classes. Removed DJD2600 class.
+//
+// 01/18/10 mubeen
+// Added Corbett class
+//
+// 01/21/10 mubeen
+// Corbett: Updated corbett class with mechanical margin values for simplex and duplex papers
+// Updated constraints for FB with Duplex
+//
+// 01/29/10 mubeen
+// Added new classes Python. Created NoAutoDuplex, and NoCDDVD sub-class
+//
+// 02/03/10 mubeen
+// Added new Python B-size(Python:LargeFormatA3:NoAutoDuplex) and OJ7000 class
+//
+// 02/11/10 mubeen
+// Added new tech subclass NoMaxDPI for Python class.
+// Python B-size: Added paper sizes: B7(ISO), B7(JIS), 10x20cm (tab), 4x10in, 4x11in, 4x12in, Double A4
+//
+// 05/07/10 adhir
+// Added new class for LjZjsMono with NoAutoDuplex and no multiple trays.
+//
+// 01/08/10 Parul Singh and Naga Samrat Chowdary, Narla
+// Added subclass (LargeFormatA3:SmallMargins) to OJ7000 Class
+//
+// 17 july 2010 Naga Samrat Chowdary, Narla
+// Added subclass (Trim) to ViperPlusVIP
+//
+// 15 July 2010 Yashwant Kumar Sahu
+// ljZjsmono duplex: Added UI constraint for non duplex paper types
+
+
+// 24 August 2010 Sanjay
+// Added new classes Python10.
+//
+
+// 20 September 2010 Sanjay
+// Added new class mimas for slimfast.
+//
+
+// 21 February 2011 Goutam
+// Added new class StingrayOJ for Alpha
+//
+// 10 March 2011 Goutam
+// Corrected the Overspray values for borderless paper sizes in StingrayOJ class
+// replaced names PhotoL.FB with L.FB and Photo3.5x5.FB with PhotoL.FB
+
+// 26 July 2011 Ani
+// Added new tech class Copperhead for Munich
+
+// 3 August 2011 Ani
+// Added new tech class Ampere
+
+// 13 September 2011 Goutam
+// Added AutoDuplex PaperSizes in Copperhead techclass
+
+
+// 10 Jan 2012 Sanjay
+// Added the new tech class : Saipan
+
+// 20 Feb 2012
+// Added New Tech Class PyramidPlus
+
+
+
+// Include necessary files...
+#include <font.defs>
+//#include <media.defs>
+
+// Driver-specific media sizes...
+//#include "hplip_media.defs"
+
+#define _VERSION "@VERSION@"
+#define Version "hpcups $_VERSION"
+
+// Copyright for all drivers...
+Copyright "(c) 2008 Copyright Hewlett-Packard Development Company, LP"
+
+// Driver version
+Version $Version
+
+// Custom driver
+DriverType custom
+
+// All standard fonts...
+Font *
+
+// Generate copies manually
+ManualCopies Yes
+
+// Color output
+ColorDevice Yes
+
+// 1 page per minute
+Throughput 1
+
+// CUPS filters...
+Filter "application/vnd.cups-raster 0 hpcups"
+//Filter "application/vnd.cups-command 0 commandtohpijs"
+
+Attribute "RequiresPageRegion" "All" "True"
+
+{
+// Manufacturer - PPD spec has "HP" registered for "Hewlett-Packard"...
+Manufacturer "HP"
+
+///////// DJ9xx
+{
+
+ Attribute "cupsEvenDuplex" "" "True"
+ Attribute "cupsBackSide" "" "Rotated"
+ Attribute "cupsFlipDuplex" "" "True"
+ Attribute "hpPrinterLanguage" "" "pcl3gui"
+ Attribute "hpPrinterPlatform" "" "dj970"
+ Attribute "HPMechOffset" "" "70"
+
+ Group "General/General"
+
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 10.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "<</Duplex true/Tumble false>>setpagedevice"
+ Choice "DuplexTumble/Short Edge (Flip)" "<</Duplex true/Tumble true>>setpagedevice"
+ *Choice "None/Off" "<</Duplex false/Tumble false>>setpagedevice"
+
+ // MediaPosition values map to MediaSource enumeration in global_types.h
+ Option "InputSlot/Media Source" PickOne AnySetup 10.0
+ *Choice "Auto/Auto-Select" "<</MediaPosition 7>>setpagedevice"
+ Choice "PhotoTray/Photo Tray" "<</MediaPosition 6>>setpagedevice"
+ Choice "Upper/Upper Tray" "<</MediaPosition 1>>setpagedevice"
+ Choice "Lower/Lower Tray" "<</MediaPosition 4>>setpagedevice"
+ Choice "Envelope/Envelope Feeder" "<</MediaPosition 3>>setpagedevice"
+ Choice "LargeCapacity/Large Capacity Tray" "<</MediaPosition 5>>setpagedevice"
+ Choice "Manual/Manual Feeder" "<</MediaPosition 2>>setpagedevice"
+ Choice "MPTray/Multi Purpose Tray" "<</MediaPosition 1>>setpagedevice"
+
+ // cupsMediaType values map to MEDIATYPE from global_types.h
+ Option "MediaType/Media Type" PickOne AnySetup 10.0
+ *Choice "Plain/Plain Paper" "<</MediaType(Plain)/cupsMediaType 0>>setpagedevice"
+ Choice "Glossy/Photo Paper" "<</MediaType(Glossy)/cupsMediaType 3>>setpagedevice"
+
+ // cupsCompression values map to QUALITY_MODE from global_types.h
+ Option "OutputMode/Print Quality" PickOne AnySetup 10.0
+ *Choice "NormalRGB/Normal Color" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 0/OutputType(0)/cupsString0(PlainNormalColor)/HWResolution[300 300]>>setpagedevice"
+ Choice "NormalGray/Normal Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 2/OutputType(0)/cupsString0(PlainNormalGrayK)/HWResolution[600 600]>>setpagedevice"
+ Choice "DraftRGB/Draft Color" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 0/OutputType(-1)/cupsString0(PlainDraftColor)/HWResolution[300 300]>>setpagedevice"
+ Choice "DraftGray/Draft Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 2/OutputType(-1)/cupsString0(PlainDraftGrayK)/HWResolution[300 300]>>setpagedevice"
+ Choice "BestRGB/Best Color" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 0/OutputType(1)/cupsString0(PlainBestColor)/HWResolution[600 600]>>setpagedevice"
+ //Choice "BestGray/Best Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 2/cupsCompression 2/HWResolution[600 600]>>setpagedevice"
+ Choice "Photo/High-Resolution Photo" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 0/OutputType(2)/cupsString0(PhotoMaxDpiColor)/HWResolution[1200 1200]>>setpagedevice"
+
+ // Duplexer is optional...
+ Installable "OptionDuplex/Duplexer Installed"
+
+ // Constraints
+ UIConstraints "*Duplex *OptionDuplex False"
+ UIConstraints "*MediaType Glossy *OutputMode DraftGray"
+ UIConstraints "*MediaType Plain *OutputMode Photo"
+ UIConstraints "*PageSize Letter *Duplex"
+ UIConstraints "*PageSize A4 *Duplex"
+ UIConstraints "*PageSize Legal *Duplex"
+ UIConstraints "*PageSize Photo4x6 *Duplex"
+ UIConstraints "*PageSize Photo5x7 *Duplex"
+ UIConstraints "*PageSize A5 *Duplex"
+ UIConstraints "*PageSize A6 *Duplex"
+ UIConstraints "*PageSize B5 *Duplex"
+ UIConstraints "*PageSize Oufuku *Duplex"
+ UIConstraints "*PageSize Hagaki *Duplex"
+ UIConstraints "*PageSize Executive *Duplex"
+ UIConstraints "*PageSize FLSA *Duplex"
+ UIConstraints "*PageSize ExecutiveJIS *Duplex"
+ UIConstraints "*PageSize 16k *Duplex"
+ UIConstraints "*PageSize Card3x5 *Duplex"
+ UIConstraints "*PageSize Card5x8 *Duplex"
+ UIConstraints "*PageSize Env10 *Duplex"
+ UIConstraints "*PageSize EnvA2 *Duplex"
+ UIConstraints "*PageSize EnvC6 *Duplex"
+ UIConstraints "*PageSize EnvDL *Duplex"
+ UIConstraints "*PageSize EnvC5 *Duplex"
+ UIConstraints "*PageSize EnvB5 *Duplex"
+ UIConstraints "*PageSize EnvChou3 *Duplex"
+ UIConstraints "*PageSize EnvChou4 *Duplex"
+ UIConstraints "*PageSize EnvMonarch *Duplex"
+
+ Attribute "cupsModelName" "" "DESKJET 930" // APDK device class
+
+// 4x6 or smaller
+ CustomMedia "Card3x5/Index Card 3x5in" 216 360 18 36 18 9 "<</cupsInteger0 78/PageSize [216 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 78/PageSize[216 360]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki/Hagaki 100x148mm" 284 420 9.00 36.00 9.00 9.00 "<</cupsInteger0 71/PageSize[284 420]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/PageSize[284 420]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki.Duplex/Hagaki AutoDuplex 100x148mm" 284 411 9 27 9 36 "<</cupsInteger0 71/PageSize[284 411]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/PageSize[284 411]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6/Photo 4x6in" 288 432 9 36 9 9 "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6/A6 105x148mm" 297.36 419.76 9 36 9 9 "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6.Duplex/A6 AutoDuplex 105x148mm" 297 411 9.00 36.00 9.00 36.00 "<</cupsInteger0 73/PageSize[297 411]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 73/PageSize[297 411]/ImagingBBox null>>setpagedevice"
+
+// 5x7
+ CustomMedia "Photo5x7/Photo 5x7in" 360 504 9 36 9 9 "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card5x8/Index Card 5x8in" 360 576 18 36 18 9 "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card5x8.Duplex/Index Card AutoDuplex 5x8in" 360 567 9 27 9 36 "<</cupsInteger0 75/PageSize[360 567]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 75/PageSize[360 567]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Oufuku/Oufuku-Hagaki 148x200mm" 567 420 18.00 36.00 18.00 9.00 "<</cupsInteger0 72/PageSize[567 420]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 72/PageSize[567 420]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Oufuku.Duplex/Oufuku-Hagaki AutoDuplex 148x200mm" 567 411 9 27 9 36 "<</cupsInteger0 72/PageSize[567 411]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 72/PageSize[567 411]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5/A5 148x210mm" 419.76 595.44 9 36 9 9 "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5.Duplex/A5 AutoDuplex 148x210mm" 420 586 18 27 18 36 "<</cupsInteger0 25/PageSize[420 586]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/PageSize[420 586]/ImagingBBox null>>setpagedevice"
+
+// Standard
+ CustomMedia "B5/B5 176x250mm" 498.96 708.48 18 36 18 9 "<</cupsInteger0 65/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 65/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ CustomMedia "B5.Duplex/B5 AutoDuplex 176x250mm" 499 699 18 27 18 36 "<</cupsInteger0 65/PageSize[499 699]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 65/PageSize[499 699]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5/JB5 182x257mm" 516.24 728.64 18 36 18 9 "<</cupsInteger0 45/PageSize[516.24 728.64]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 45/PageSize [516.24 728.64]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5.Duplex/JB5 AutoDuplex 182x257mm" 516 720 18 27 18 36 "<</cupsInteger0 45/PageSize[516 720]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 45/PageSize [516 720]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Executive/Executive 7.25x10.5in" 522 756 18.00 36.00 18.00 9.00 "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Executive.Duplex/Executive AutoDuplex 7.25x10.5in" 522 747 18 27 18 36 "<</cupsInteger0 1/PageSize[522 747]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[522 747]/ImagingBBox null>>setpagedevice"
+ CustomMedia "16k/16k 7.75x10.75in" 558 774 18 36 18 9 "<</cupsInteger0 101/PageSize[558 774]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[558 774]/ImagingBBox null>>setpagedevice" // custom
+ *CustomMedia "Letter/Letter 8.5x11in" 612 792 18 36 18 9 "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Letter.Duplex/Letter AutoDuplex 8.5x11in" 612 783 18 27 18 36 "<</cupsInteger0 2/PageSize[612 783]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/PageSize[612 783]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4/A4 210x297mm" 595.44 841.68 9.72 36 9.72 9.00 "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4.Duplex/A4 AutoDuplex 210x297mm" 595 833 9.72 27 9.72 36 "<</cupsInteger0 26/PageSize[595 833]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/PageSize[595 833]/ImagingBBox null>>setpagedevice"
+ CustomMedia "ExecutiveJIS/Executive (JIS) 8.5x12.986in" 612 936 18 36 18 9 "<</cupsInteger0 101/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ CustomMedia "FLSA/American Foolscap 8.5x13in" 612 936 18.00 36.00 18.00 9.00 "<</cupsInteger0 101/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Legal/Legal 8.5x14in" 612 1008 18 36 18 9 "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Legal.Duplex/Legal AutoDuplex 8.5x14in" 612 999 18 27 18 36 "<</cupsInteger0 3/PageSize[612 999]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 3/PageSize[612 999]/ImagingBBox null>>setpagedevice"
+
+// Envelopes
+ CustomMedia "EnvA2/A2 Envelope 4.37x5.75in" 314.64 414 9 42 9 9 "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC6/C6 Envelope 114x162mm" 323.28 459.36 18.00 36.00 18.00 9.00 "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou4/#4 Japanese Envelope 90x205mm" 254.88 581.04 9 41 9 9 "<</cupsInteger0 111/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 111/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvMonarch/Monarch Envelope 3.875x7.5in" 279 540 18.00 36.00 18.00 9.00 "<</cupsInteger0 80/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 80/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvDL/DL Envelope 110x220mm" 311.76 623.52 18.00 36.00 18.00 9.00 "<</cupsInteger0 90/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 90/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Env10/#10 Envelope 4.12x9.5in" 297 684 18.00 36.00 18.00 9.00 "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou3/#3 Japanese Envelope 120x235mm" 339.84 666 9 41 9 9 "<</cupsInteger0 110/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 110/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC5/C5 Envelope 162x229mm" 459 649 18.00 36.00 18.00 9.00 "<</cupsInteger0 91/PageSize[459 649]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 91/PageSize[459 649]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvB5/B5 Envelope 176x250mm" 499 709 18.00 36.00 18.00 9.00 "<</cupsInteger0 100/PageSize[499 709]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 100/PageSize[499 709]/ImagingBBox null>>setpagedevice"
+ {
+ // Custom page sizes from 1x4in to Legal
+ HWMargins 18 36 18 36
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 8.5in 14in
+
+ // <%DJ9xx:Normal%>
+ {
+ ModelName "HP Officejet v30"
+ Attribute "NickName" "" "HP Officejet v30, $Version"
+ Attribute "ShortNickName" "" "HP Officejet v30"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet v30;DES:officejet v30;"
+ PCFileName "hp-officejet_v30.ppd"
+ Attribute "Product" "" "(HP Officejet v30 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet v40xi"
+ Attribute "NickName" "" "HP Officejet v40xi, $Version"
+ Attribute "ShortNickName" "" "HP Officejet v40xi"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet v40xi;DES:officejet v40xi;"
+ PCFileName "hp-officejet_v40xi.ppd"
+ Attribute "Product" "" "(HP Officejet v40xi All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet v40"
+ Attribute "NickName" "" "HP Officejet v40, $Version"
+ Attribute "ShortNickName" "" "HP Officejet v40"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet v40;DES:officejet v40;"
+ PCFileName "hp-officejet_v40.ppd"
+ Attribute "Product" "" "(HP Officejet v40 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet v40s All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet v45"
+ Attribute "NickName" "" "HP Officejet v45, $Version"
+ Attribute "ShortNickName" "" "HP Officejet v45"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet v45;DES:officejet v45;"
+ PCFileName "hp-officejet_v45.ppd"
+ Attribute "Product" "" "(HP Officejet v45 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet g55"
+ Attribute "NickName" "" "HP Officejet g55, $Version"
+ Attribute "ShortNickName" "" "HP Officejet g55"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet g55;DES:officejet g55;"
+ PCFileName "hp-officejet_g55.ppd"
+ Attribute "Product" "" "(HP Officejet g55 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet g55xi"
+ Attribute "NickName" "" "HP Officejet g55xi, $Version"
+ Attribute "ShortNickName" "" "HP Officejet g55xi"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet g55xi;DES:officejet g55xi;"
+ PCFileName "hp-officejet_g55xi.ppd"
+ Attribute "Product" "" "(HP Officejet g55xi All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet k60xi"
+ Attribute "NickName" "" "HP Officejet k60xi, $Version"
+ Attribute "ShortNickName" "" "HP Officejet k60xi"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet k60xi;DES:officejet k60xi;"
+ PCFileName "hp-officejet_k60xi.ppd"
+ Attribute "Product" "" "(HP Officejet k60xi All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet k60"
+ Attribute "NickName" "" "HP Officejet k60, $Version"
+ Attribute "ShortNickName" "" "HP Officejet k60"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet k60;DES:officejet k60;"
+ PCFileName "hp-officejet_k60.ppd"
+ Attribute "Product" "" "(HP Officejet k60 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet k80xi"
+ Attribute "NickName" "" "HP Officejet k80xi, $Version"
+ Attribute "ShortNickName" "" "HP Officejet k80xi"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet k80xi;DES:officejet k80xi;"
+ PCFileName "hp-officejet_k80xi.ppd"
+ Attribute "Product" "" "(HP Officejet k80xi All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet k80"
+ Attribute "NickName" "" "HP Officejet k80, $Version"
+ Attribute "ShortNickName" "" "HP Officejet k80"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet k80;DES:officejet k80;"
+ PCFileName "hp-officejet_k80.ppd"
+ Attribute "Product" "" "(HP Officejet k80 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet g85"
+ Attribute "NickName" "" "HP Officejet g85, $Version"
+ Attribute "ShortNickName" "" "HP Officejet g85"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet g85;DES:officejet g85;"
+ PCFileName "hp-officejet_g85.ppd"
+ Attribute "Product" "" "(HP Officejet g85 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet g85xi"
+ Attribute "NickName" "" "HP Officejet g85xi, $Version"
+ Attribute "ShortNickName" "" "HP Officejet g85xi"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet g85xi;DES:officejet g85xi;"
+ PCFileName "hp-officejet_g85xi.ppd"
+ Attribute "Product" "" "(HP Officejet g85xi All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet g95"
+ Attribute "NickName" "" "HP Officejet g95, $Version"
+ Attribute "ShortNickName" "" "HP Officejet g95"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet g95;DES:officejet g95;"
+ PCFileName "hp-officejet_g95.ppd"
+ Attribute "Product" "" "(HP Officejet g95 All-in-one Printer)"
+ }
+ {
+ ModelName "HP PSC 720"
+ Attribute "NickName" "" "HP PSC 720, $Version"
+ Attribute "ShortNickName" "" "HP PSC 720"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:psc 720;DES:psc 720;"
+ PCFileName "hp-psc_720.ppd"
+ Attribute "Product" "" "(HP PSC 720 All-in-one Printer)"
+ }
+ {
+ ModelName "HP PSC 750xi"
+ Attribute "NickName" "" "HP PSC 750xi, $Version"
+ Attribute "ShortNickName" "" "HP PSC 750xi"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:psc 750xi;DES:psc 750xi;"
+ PCFileName "hp-psc_750xi.ppd"
+ Attribute "Product" "" "(HP PSC 750xi All-in-one Printer)"
+ }
+ {
+ ModelName "HP PSC 750"
+ Attribute "NickName" "" "HP PSC 750, $Version"
+ Attribute "ShortNickName" "" "HP PSC 750"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:psc 750;DES:psc 750;"
+ PCFileName "hp-psc_750.ppd"
+ Attribute "Product" "" "(HP PSC 750 All-in-one Printer)"
+ }
+ {
+ ModelName "HP PSC 760"
+ Attribute "NickName" "" "HP PSC 760, $Version"
+ Attribute "ShortNickName" "" "HP PSC 760"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:psc 760;DES:psc 760;"
+ PCFileName "hp-psc_760.ppd"
+ Attribute "Product" "" "(HP PSC 760 All-in-one Printer)"
+ }
+ {
+ ModelName "HP PSC 780"
+ Attribute "NickName" "" "HP PSC 780, $Version"
+ Attribute "ShortNickName" "" "HP PSC 780"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:psc 780;DES:psc 780;"
+ PCFileName "hp-psc_780.ppd"
+ Attribute "Product" "" "(HP PSC 780 All-in-one Printer)"
+ }
+ {
+ ModelName "HP PSC 780xi"
+ Attribute "NickName" "" "HP PSC 780xi, $Version"
+ Attribute "ShortNickName" "" "HP PSC 780xi"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:psc 780xi;DES:psc 780xi;"
+ PCFileName "hp-psc_780xi.ppd"
+ Attribute "Product" "" "(HP PSC 780xi All-in-one Printer)"
+ }
+ {
+ ModelName "HP PSC 900 Series"
+ Attribute "NickName" "" "HP PSC 900 Series, $Version"
+ Attribute "ShortNickName" "" "HP PSC 900 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:psc 900 series;DES:psc 900 series;"
+ PCFileName "hp-psc_900_series.ppd"
+ Attribute "Product" "" "(HP PSC 900 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Deskjet 916c"
+ Attribute "NickName" "" "HP Deskjet 916c, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 916c"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 916c;DES:deskjet 916c;"
+ PCFileName "hp-deskjet_916c.ppd"
+ Attribute "Product" "" "(HP Deskjet 916c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 920c"
+ Attribute "NickName" "" "HP Deskjet 920c, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 920c"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 920c;DES:deskjet 920c;"
+ PCFileName "hp-deskjet_920c.ppd"
+ Attribute "Product" "" "(HP Deskjet 920c Printer)"
+ Attribute "Product" "" "(HP Deskjet 920cvr Printer)"
+ Attribute "Product" "" "(HP Deskjet 920cw Printer)"
+ Attribute "Product" "" "(HP Deskjet 920cxi Printer)"
+ }
+ {
+ ModelName "HP PSC 920"
+ Attribute "NickName" "" "HP PSC 920, $Version"
+ Attribute "ShortNickName" "" "HP PSC 920"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:psc 920;DES:psc 920;"
+ PCFileName "hp-psc_920.ppd"
+ Attribute "Product" "" "(HP PSC 920 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Deskjet 930c"
+ Attribute "NickName" "" "HP Deskjet 930c, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 930c"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 930c;DES:deskjet 930c;"
+ PCFileName "hp-deskjet_930c.ppd"
+ Attribute "Product" "" "(HP Deskjet 930c Printer)"
+ Attribute "Product" "" "(HP Deskjet 930cm Printer)"
+ }
+ {
+ ModelName "HP Deskjet 932c"
+ Attribute "NickName" "" "HP Deskjet 932c, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 932c"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 932c;DES:deskjet 932c;"
+ PCFileName "hp-deskjet_932c.ppd"
+ Attribute "Product" "" "(HP Deskjet 932c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 933c"
+ Attribute "NickName" "" "HP Deskjet 933c, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 933c"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 933c;DES:deskjet 933c;"
+ PCFileName "hp-deskjet_933c.ppd"
+ Attribute "Product" "" "(HP Deskjet 933c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 934c"
+ Attribute "NickName" "" "HP Deskjet 934c, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 934c"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 934c;DES:deskjet 934c;"
+ PCFileName "hp-deskjet_934c.ppd"
+ Attribute "Product" "" "(HP Deskjet 934c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 935c"
+ Attribute "NickName" "" "HP Deskjet 935c, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 935c"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 935c;DES:deskjet 935c;"
+ PCFileName "hp-deskjet_935c.ppd"
+ Attribute "Product" "" "(HP Deskjet 935c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 940c"
+ Attribute "NickName" "" "HP Deskjet 940c, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 940c"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 940c;DES:deskjet 940c;"
+ PCFileName "hp-deskjet_940c.ppd"
+ Attribute "Product" "" "(HP Deskjet 940cvr Printer)"
+ Attribute "Product" "" "(HP Deskjet 940c Printer)"
+ Attribute "Product" "" "(HP Deskjet 940cw Printer)"
+ Attribute "Product" "" "(HP Deskjet 940cxi Printer)"
+ }
+ {
+ ModelName "HP Deskjet 948c"
+ Attribute "NickName" "" "HP Deskjet 948c, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 948c"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 948c;DES:deskjet 948c;"
+ PCFileName "hp-deskjet_948c.ppd"
+ Attribute "Product" "" "(HP Deskjet 948c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 950c"
+ Attribute "NickName" "" "HP Deskjet 950c, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 950c"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 950c;DES:deskjet 950c;"
+ PCFileName "hp-deskjet_950c.ppd"
+ Attribute "Product" "" "(HP Deskjet 950c Printer)"
+ }
+ {
+ ModelName "HP PSC 950xi"
+ Attribute "NickName" "" "HP PSC 950xi, $Version"
+ Attribute "ShortNickName" "" "HP PSC 950xi"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:psc 950xi;DES:psc 950xi;"
+ PCFileName "hp-psc_950xi.ppd"
+ Attribute "Product" "" "(HP PSC 950xi All-in-one Printer)"
+ }
+ {
+ ModelName "HP PSC 950vr"
+ Attribute "NickName" "" "HP PSC 950vr, $Version"
+ Attribute "ShortNickName" "" "HP PSC 950vr"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:psc 950vr;DES:psc 950vr;"
+ PCFileName "hp-psc_950vr.ppd"
+ Attribute "Product" "" "(HP PSC 950vr All-in-one Printer)"
+ }
+ {
+ ModelName "HP PSC 950"
+ Attribute "NickName" "" "HP PSC 950, $Version"
+ Attribute "ShortNickName" "" "HP PSC 950"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:psc 950;DES:psc 950;"
+ PCFileName "hp-psc_950.ppd"
+ Attribute "Product" "" "(HP PSC 950 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Deskjet 952c"
+ Attribute "NickName" "" "HP Deskjet 952c, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 952c"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 952c;DES:deskjet 952c;"
+ PCFileName "hp-deskjet_952c.ppd"
+ Attribute "Product" "" "(HP Deskjet 952c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 955c"
+ Attribute "NickName" "" "HP Deskjet 955c, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 955c"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 955c;DES:deskjet 955c;"
+ PCFileName "hp-deskjet_955c.ppd"
+ Attribute "Product" "" "(HP Deskjet 955c Printer)"
+ Attribute "Product" "" "(HP Deskjet 995ck Color Inkjet Printer)"
+ }
+ {
+ ModelName "HP Deskjet 957c"
+ Attribute "NickName" "" "HP Deskjet 957c, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 957c"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 957c;DES:deskjet 957c;"
+ PCFileName "hp-deskjet_957c.ppd"
+ Attribute "Product" "" "(HP Deskjet 957c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 959c"
+ Attribute "NickName" "" "HP Deskjet 959c, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 959c"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 959c;DES:deskjet 959c;"
+ PCFileName "hp-deskjet_959c.ppd"
+ Attribute "Product" "" "(HP Deskjet 959c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 970c"
+ Attribute "NickName" "" "HP Deskjet 970c, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 970c"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 970c;DES:deskjet 970c;"
+ PCFileName "hp-deskjet_970c.ppd"
+ Attribute "Product" "" "(HP Deskjet 970cxi Printer)"
+ Attribute "Product" "" "(HP Deskjet 970cse Printer)"
+ Attribute "Product" "" "(HP Deskjet 970c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 975c"
+ Attribute "NickName" "" "HP Deskjet 975c, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 975c"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 975c;DES:deskjet 975c;"
+ PCFileName "hp-deskjet_975c.ppd"
+ Attribute "Product" "" "(HP Deskjet 975c Printer)"
+ Attribute "Product" "" "(HP Deskjet 975cse Printer)"
+ Attribute "Product" "" "(HP Deskjet 975cxi Printer)"
+ }
+ {
+ ModelName "HP Photosmart p1000"
+ Attribute "NickName" "" "HP Photosmart p1000, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart p1000"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart p1000;DES:photosmart p1000;"
+ PCFileName "hp-photosmart_p1000.ppd"
+ Attribute "Product" "" "(HP Photosmart p1000/1000 Printer)"
+ Attribute "Product" "" "(HP Photosmart p1000xi Printer)"
+ }
+ {
+ ModelName "HP Photosmart p1100"
+ Attribute "NickName" "" "HP Photosmart p1100, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart p1100"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart p1100;DES:photosmart p1100;"
+ PCFileName "hp-photosmart_p1100.ppd"
+ Attribute "Product" "" "(HP Photosmart p1100 Printer)"
+ Attribute "Product" "" "(HP Photosmart p1100xi Printer)"
+ }
+ {
+ ModelName "HP Deskjet 3810"
+ Attribute "NickName" "" "HP Deskjet 3810, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 3810"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 3810;DES:deskjet 3810;"
+ PCFileName "hp-deskjet_3810.ppd"
+ Attribute "Product" "" "(HP Deskjet 3810 Color Inkjet Printer)"
+ }
+ {
+ ModelName "HP Deskjet 3816"
+ Attribute "NickName" "" "HP Deskjet 3816, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 3816"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 3816;DES:deskjet 3816;"
+ PCFileName "hp-deskjet_3816.ppd"
+ Attribute "Product" "" "(HP Deskjet 3816 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3818 Color Inkjet Printer)"
+ }
+ {
+ ModelName "HP Deskjet 3819"
+ Attribute "NickName" "" "HP Deskjet 3819, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 3819"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 3819;DES:deskjet 3819;"
+ PCFileName "hp-deskjet_3819.ppd"
+ Attribute "Product" "" "(HP Deskjet 3819 Color Inkjet Printer)"
+ }
+ {
+ ModelName "HP Deskjet 3820"
+ Attribute "NickName" "" "HP Deskjet 3820, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 3820"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 3820;DES:deskjet 3820;"
+ PCFileName "hp-deskjet_3820.ppd"
+ Attribute "Product" "" "(HP Deskjet 3820 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3820v Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3820w Color Inkjet Printer)"
+ }
+ {
+ ModelName "HP Deskjet 3822"
+ Attribute "NickName" "" "HP Deskjet 3822, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 3822"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 3822;DES:deskjet 3822;"
+ PCFileName "hp-deskjet_3822.ppd"
+ Attribute "Product" "" "(HP Deskjet 3822 Color Inkjet Printer)"
+ }
+ {
+ ModelName "HP Deskjet 3870"
+ Attribute "NickName" "" "HP Deskjet 3870, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 3870"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 3870;DES:deskjet 3870;"
+ PCFileName "hp-deskjet_3870.ppd"
+ Attribute "Product" "" "(HP Deskjet 3870 Color Inkjet Printer)"
+ }
+ {
+ ModelName "HP Officejet 5100 Series"
+ Attribute "NickName" "" "HP Officejet 5100 Series, $Version"
+ Attribute "ShortNickName" "" "HP Officejet 5100 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet 5100 series;DES:officejet 5100 series;"
+ PCFileName "hp-officejet_5100_series.ppd"
+ Attribute "Product" "" "(HP Officejet 5100 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 5105 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 5110v All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 5110xi All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 5110 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet 5105"
+ Attribute "NickName" "" "HP Officejet 5105, $Version"
+ Attribute "ShortNickName" "" "HP Officejet 5105"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet 5105;DES:officejet 5105;"
+ PCFileName "hp-officejet_5105.ppd"
+ Attribute "Product" "" "(HP Officejet 5105 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet 5110v"
+ Attribute "NickName" "" "HP Officejet 5110v, $Version"
+ Attribute "ShortNickName" "" "HP Officejet 5110v"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet 5110v;DES:officejet 5110v;"
+ PCFileName "hp-officejet_5110v.ppd"
+ Attribute "Product" "" "(HP Officejet 5110v All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet 5110"
+ Attribute "NickName" "" "HP Officejet 5110, $Version"
+ Attribute "ShortNickName" "" "HP Officejet 5110"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet 5110;DES:officejet 5110;"
+ PCFileName "hp-officejet_5110.ppd"
+ Attribute "Product" "" "(HP Officejet 5110 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 5110xi All-in-one Printer)"
+ }
+ } // End Supported media sizes.
+
+ {
+// Large format
+ UIConstraints "*PageSize A3 *Duplex"
+ UIConstraints "*PageSize B4 *Duplex"
+ UIConstraints "*PageSize Ledger *Duplex"
+ UIConstraints "*PageSize SuperB *Duplex"
+ UIConstraints "*PageSize 8k *Duplex"
+
+// Large
+ CustomMedia "SuperB/SuperB 13x19in" 936 1368 14.40 36.00 14.40 9.00 "<</cupsInteger0 16/PageSize[936 1368]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 16/PageSize[936 1368]/ImagingBBox null>>setpagedevice"
+ CustomMedia "B4/B4 257x364mm" 729 1033 18 36 18 9 "<</cupsInteger0 46/PageSize[729 1033]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 46/PageSize[729 1033]/ImagingBBox null>>setpagedevice"
+ CustomMedia "B4.Duplex/B4 AutoDuplex 257x364mm" 729 1024 18 27 18 36 "<</cupsInteger0 1/PageSize[729 1024]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[729 1024]/ImagingBBox null>>setpagedevice"
+ CustomMedia "8k/8k 10.75x15.5in" 774 1116 18 36 18 9 "<</cupsInteger0 101/PageSize[774 1116]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[774 1116]/ImagingBBox null>>setpagedevice" // custom
+ CustomMedia "Ledger/Ledger 11x17in" 792 1224 14.40 36.00 14.40 9.00 "<</cupsInteger0 6/PageSize[792 1224]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 6/PageSize[792 1224]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A3/A3 297x420mm" 842 1190 18 36 18 9 "<</cupsInteger0 27/PageSize[842 1190]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 27/PageSize[842 1190]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A3.Duplex/A3 AutoDuplex 297x420mm" 842 1181 18 27 18 36 "<</cupsInteger0 1/PageSize[842 1181]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[842 1181]/ImagingBBox null>>setpagedevice"
+
+
+ // Custom page sizes from 1x4in to SuperB
+ HWMargins 18 36 18 36
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 936 1368
+
+ // <%DJ9xx:LargeFormatSuperB%>
+ {
+ ModelName "HP Deskjet 1220c"
+ Attribute "NickName" "" "HP Deskjet 1220c, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 1220c"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 1220c;DES:deskjet 1220c;"
+ PCFileName "hp-deskjet_1220c.ppd"
+ Attribute "Product" "" "(HP Deskjet 1220c Printer)"
+ Attribute "Product" "" "(HP Deskjet 1220cse Printer)"
+ Attribute "Product" "" "(HP Deskjet 1220cxi Printer)"
+ Attribute "Product" "" "(HP Deskjet 1220c/ps Printer)"
+ }
+ {
+ ModelName "HP Deskjet 1280"
+ Attribute "NickName" "" "HP Deskjet 1280, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 1280"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 1280;DES:deskjet 1280;"
+ PCFileName "hp-deskjet_1280.ppd"
+ Attribute "Product" "" "(HP Deskjet 1280 Printer)"
+ }
+ {
+ ModelName "HP Deskjet 9300"
+ Attribute "NickName" "" "HP Deskjet 9300, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 9300"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp deskjet 9300;DES:hp deskjet 9300;"
+ PCFileName "hp-deskjet_9300.ppd"
+ Attribute "Product" "" "(HP Deskjet 9300 Printer)"
+ }
+
+ } // End Large format media sizes.
+} // End DJ9xx
+
+/////////// DJ9xx without photo modes
+{
+
+ Attribute "cupsEvenDuplex" "" "True"
+ Attribute "cupsBackSide" "" "Rotated"
+ Attribute "cupsFlipDuplex" "" "True"
+ Attribute "hpPrinterLanguage" "" "pcl3gui"
+ Attribute "hpPrinterPlatform" "" "dj970"
+ Attribute "HPMechOffset" "" "70"
+
+ Group "General/General"
+
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 10.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "<</Duplex true/Tumble false>>setpagedevice"
+ Choice "DuplexTumble/Short Edge (Flip)" "<</Duplex true/Tumble true>>setpagedevice"
+ *Choice "None/Off" "<</Duplex false/Tumble false>>setpagedevice"
+
+ // MediaPosition values map to MediaSource enumeration in global_types.h
+ Option "InputSlot/Media Source" PickOne AnySetup 10.0
+ *Choice "Auto/Auto-Select" "<</MediaPosition 7>>setpagedevice"
+ Choice "PhotoTray/Photo Tray" "<</MediaPosition 6>>setpagedevice"
+ Choice "Upper/Upper Tray" "<</MediaPosition 1>>setpagedevice"
+ Choice "Lower/Lower Tray" "<</MediaPosition 4>>setpagedevice"
+ Choice "Envelope/Envelope Feeder" "<</MediaPosition 3>>setpagedevice"
+ Choice "LargeCapacity/Large Capacity Tray" "<</MediaPosition 5>>setpagedevice"
+ Choice "Manual/Manual Feeder" "<</MediaPosition 2>>setpagedevice"
+ Choice "MPTray/Multi Purpose Tray" "<</MediaPosition 1>>setpagedevice"
+
+ // cupsMediaType values map to MEDIATYPE from global_types.h
+ Option "MediaType/Media Type" PickOne AnySetup 10.0
+ *Choice "Plain/Plain Paper" "<</MediaType(Plain)/cupsMediaType 0>>setpagedevice"
+
+ // cupsCompression values map to QUALITY_MODE from global_types.h
+ Option "OutputMode/Print Quality" PickOne AnySetup 10.0
+ *Choice "NormalRGB/Normal Color" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 0/OutputType(0)/cupsString0(PlainNormalColor)/HWResolution[300 300]>>setpagedevice"
+ Choice "NormalGray/Normal Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 2/OutputType(0)/cupsString0(PlainNormalGrayK)/HWResolution[600 600]>>setpagedevice"
+ Choice "DraftRGB/Draft Color" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 0/OutputType(-1)/cupsString0(PlainDraftColor)/HWResolution[300 300]>>setpagedevice"
+ Choice "DraftGray/Draft Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 2/OutputType(-1)/cupsString0(PlainDraftGrayK)/HWResolution[300 300]>>setpagedevice"
+ Choice "BestRGB/Best Color" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 0/OutputType(1)/cupsString0(PlainBestColor)/HWResolution[600 600]>>setpagedevice"
+ //Choice "BestGray/Best Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 2/cupsCompression 2/HWResolution[600 600]>>setpagedevice"
+
+ // Duplexer is optional...
+ Installable "OptionDuplex/Duplexer Installed"
+
+ // Constraints
+ UIConstraints "*Duplex *OptionDuplex False"
+ UIConstraints "*PageSize Letter *Duplex"
+ UIConstraints "*PageSize A4 *Duplex"
+ UIConstraints "*PageSize Legal *Duplex"
+ UIConstraints "*PageSize Photo4x6 *Duplex"
+ UIConstraints "*PageSize Photo5x7 *Duplex"
+ UIConstraints "*PageSize A5 *Duplex"
+ UIConstraints "*PageSize A6 *Duplex"
+ UIConstraints "*PageSize B5 *Duplex"
+ UIConstraints "*PageSize Oufuku *Duplex"
+ UIConstraints "*PageSize Hagaki *Duplex"
+ UIConstraints "*PageSize Executive *Duplex"
+ UIConstraints "*PageSize FLSA *Duplex"
+ UIConstraints "*PageSize ExecutiveJIS *Duplex"
+ UIConstraints "*PageSize 16k *Duplex"
+ UIConstraints "*PageSize Card3x5 *Duplex"
+ UIConstraints "*PageSize Card5x8 *Duplex"
+ UIConstraints "*PageSize Env10 *Duplex"
+ UIConstraints "*PageSize EnvA2 *Duplex"
+ UIConstraints "*PageSize EnvC6 *Duplex"
+ UIConstraints "*PageSize EnvDL *Duplex"
+ UIConstraints "*PageSize EnvC5 *Duplex"
+ UIConstraints "*PageSize EnvB5 *Duplex"
+ UIConstraints "*PageSize EnvChou3 *Duplex"
+ UIConstraints "*PageSize EnvChou4 *Duplex"
+ UIConstraints "*PageSize EnvMonarch *Duplex"
+
+ Attribute "cupsModelName" "" "DESKJET 930" // APDK device class
+
+// 4x6 or smaller
+ CustomMedia "Card3x5/Index Card 3x5in" 216 360 18.00 36.00 18.00 9.00 "<</cupsInteger0 78/PageSize [216 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 78/PageSize[216 360]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki/Hagaki 100x148mm" 284 420 9.00 36.00 9.00 9.00 "<</cupsInteger0 71/PageSize[284 420]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/PageSize[284 420]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki.Duplex/Hagaki AutoDuplex 100x148mm" 284 411 9 27 9 36 "<</cupsInteger0 71/PageSize[284 411]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/PageSize[284 411]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6/Photo 4x6in" 288 432 9 36 9 9 "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6/A6 105x148mm" 297.36 419.76 9.00 36.00 9.00 9.00 "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6.Duplex/A6 AutoDuplex 105x148mm)" 297 411 18 27 18 36 "<</cupsInteger0 73/PageSize[297 411]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 73/PageSize[297 411]/ImagingBBox null>>setpagedevice"
+
+// 5x7
+ CustomMedia "Photo5x7/Photo 5x7in" 360 504 9 36 9 9 "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card5x8/Index Card 5x8in" 360 576 18.00 36.00 18.00 9.00 "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card5x8.Duplex/Index Card AutoDuplex 5x8in" 360 567 9 27 9 36 "<</cupsInteger0 75/PageSize[360 567]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 75/PageSize[360 567]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Oufuku/Oufuku-Hagaki 148x200mm" 567 420 9 36 9 9 "<</cupsInteger0 72/PageSize[567 420]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 72/PageSize[567 420]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Oufuku.Duplex/Oufuku-Hagaki AutoDuplex 148x200mm" 567 411 18.00 36.00 18.00 9.00 "<</cupsInteger0 72/PageSize[567 411]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 72/PageSize[567 411]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5/A5 148x210mm" 419.76 595.44 9.00 36.00 9.00 9.00 "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5.Duplex/A5 AutoDuplex 148x210mm" 420 586 18 27 18 36 "<</cupsInteger0 25/PageSize[420 586]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/PageSize[420 586]/ImagingBBox null>>setpagedevice"
+
+// Standard
+ CustomMedia "B5/B5 176x250mm" 498.96 708.48 18 36 18 9 "<</cupsInteger0 65/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 65/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ CustomMedia "B5.Duplex/B5 AutoDuplex 176x250mm" 499 699 18 27 18 36 "<</cupsInteger0 65/PageSize[499 699]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 65/PageSize[499 699]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5/JB5 182x257mm" 516.24 728.64 18 36 18 9 "<</cupsInteger0 45/PageSize[516.24 728.64]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 45/PageSize [516.24 728.64]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5.Duplex/JB5 AutoDuplex 182x257mm" 516 720 18 27 18 36 "<</cupsInteger0 45/PageSize[516 720]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 45/PageSize [516 720]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Executive/Executive 7.25x10.5in" 522 756 18.00 36.00 18.00 9.00 "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Executive.Duplex/Executive AutoDuplex 7.25x10.5in" 522 747 18 27 18 36 "<</cupsInteger0 1/PageSize[522 747]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[522 747]/ImagingBBox null>>setpagedevice"
+ CustomMedia "16k/16k 7.75x10.75in" 558 774 18.00 36.00 18.00 9.00 "<</cupsInteger0 101/PageSize[558 774]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[558 774]/ImagingBBox null>>setpagedevice" // custom
+ *CustomMedia "Letter/Letter 8.5x11in" 612 792 18 36 18 9 "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Letter.Duplex/Letter AutoDuplex 8.5x11in" 612 783 18 27 18 36 "<</cupsInteger0 2/PageSize[612 783]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/PageSize[612 783]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4/A4 210x297mm" 595.44 841.68 9.72 36.00 9.72 9.00 "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4.Duplex/A4 AutoDuplex 210x297mm" 595 833 18 27 18 36 "<</cupsInteger0 26/PageSize[595 833]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/PageSize[595 833]/ImagingBBox null>>setpagedevice"
+ CustomMedia "ExecutiveJIS/Executive (JIS) 8.5x12.986in" 612 936 18.00 36.00 18.00 9.00 "<</cupsInteger0 10/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 10/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ CustomMedia "FLSA/American Foolscap 8.5x13in" 612 936 18.00 36.00 18.00 9.00 "<</cupsInteger0 10/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 10/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Legal/Legal 8.5x14in" 612 1008 18 36 18 9 "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Legal.Duplex/Legal AutoDuplex 8.5x14in" 612 999 18.00 36.00 18.00 9.00 "<</cupsInteger0 3/PageSize[612 999]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 3/PageSize[612 999]/ImagingBBox null>>setpagedevice"
+
+// Envelope
+ CustomMedia "EnvA2/A2 Envelope 4.37x5.75in" 314.64 414 9 42 9 9 "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC6/C6 Envelope 114x162mm" 323.28 459.36 18.00 36.00 18.00 9.00 "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou4/#4 Japanese Envelope 90x205mm" 254.88 581.04 9 41 9 9 "<</cupsInteger0 111/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 111/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvMonarch/Monarch Envelope 3.875x7.5in" 279 540 18.00 36.00 18.00 9.00 "<</cupsInteger0 80/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 80/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvDL/DL Envelope 110x220mm" 311.76 623.52 18.00 36.00 18.00 9.00 "<</cupsInteger0 90/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 90/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Env10/#10 Envelope 4.12x9.5in" 297 684 18.00 36.00 18.00 9.00 "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou3/#3 Japanese Envelope 120x235mm" 339.84 666 9 41 9 9 "<</cupsInteger0 110/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 110/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC5/C5 Envelope 162x229mm" 459 649 18.00 36.00 18.00 9.00 "<</cupsInteger0 91/PageSize[459 649]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 91/PageSize[459 649]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvB5/B5 Envelope 176x250mm" 499 709 18.00 36.00 18.00 9.00 "<</cupsInteger0 100/PageSize[499 709]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 100/PageSize[499 709]/ImagingBBox null>>setpagedevice"
+
+ {
+
+ // Custom page sizes from 1x4in to Legal
+ HWMargins 18 36 18 36
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 8.5in 14in
+
+ // <%DJ9xx:NoPhotoMode%>
+ {
+ ModelName "HP 2000c"
+ Attribute "NickName" "" "HP 2000c, $Version"
+ Attribute "ShortNickName" "" "HP 2000c"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp 2000c;DES:hp 2000c;"
+ PCFileName "hp-2000c.ppd"
+ Attribute "Product" "" "(HP 2000cse Printer)"
+ Attribute "Product" "" "(HP 2000c Printer)"
+ Attribute "Product" "" "(HP 2000cn Printer)"
+ Attribute "Product" "" "(HP 2000cxi Printer)"
+ }
+ } // End Supported media sizes.
+
+ {
+ // Large format
+ UIConstraints "*PageSize A3 *Duplex"
+ UIConstraints "*PageSize B4 *Duplex"
+ UIConstraints "*PageSize Ledger *Duplex"
+ UIConstraints "*PageSize SuperB *Duplex"
+ UIConstraints "*PageSize 8k *Duplex"
+
+// Large
+ CustomMedia "SuperB/SuperB 13x19in" 936 1368 18 36 18 9 "<</cupsInteger0 16/PageSize[936 1368]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 16/PageSize[936 1368]/ImagingBBox null>>setpagedevice"
+ CustomMedia "B4/B4 257x364mm" 729 1033 18 36 18 9 "<</cupsInteger0 46/PageSize[729 1033]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 46/PageSize[729 1033]/ImagingBBox null>>setpagedevice"
+ CustomMedia "B4.Duplex/B4 AutoDuplex 257x364mm" 729 1024 18 27 18 36 "<</cupsInteger0 1/PageSize[729 1024]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[729 1024]/ImagingBBox null>>setpagedevice"
+ CustomMedia "8k/8k 10.75x15.5in" 774 1116 18 36 18 9 "<</cupsInteger0 101/PageSize[774 1116]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[774 1116]/ImagingBBox null>>setpagedevice" // custom
+ CustomMedia "Ledger/Ledger 11x17in" 792 1224 18 36 18 9 "<</cupsInteger0 6/PageSize[792 1224]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 6/PageSize[792 1224]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A3/A3 297x420mm" 842 1190 18 36 18 9 "<</cupsInteger0 27/PageSize[842 1190]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 27/PageSize[842 1190]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A3.Duplex/A3 AutoDuplex 297x420mm" 842 1181 18 27 18 36 "<</cupsInteger0 1/PageSize[842 1181]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[842 1181]/ImagingBBox null>>setpagedevice"
+
+ // Custom page sizes from 1x4in to SuperB
+ HWMargins 18 36 18 36
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 936 1368
+
+ // <%DJ9xx:NoPhotoMode:LargeFormatSuperB%>
+ {
+ ModelName "HP 2500c"
+ Attribute "NickName" "" "HP 2500c, $Version"
+ Attribute "ShortNickName" "" "HP 2500c"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp 2500c;DES:hp 2500c;"
+ PCFileName "hp-2500c.ppd"
+ Attribute "Product" "" "(HP 2500c Plus Printer)"
+ Attribute "Product" "" "(HP 2500c Printer)"
+ Attribute "Product" "" "(HP 2500cm Printer)"
+ Attribute "Product" "" "(HP 2500cse Printer)"
+ Attribute "Product" "" "(HP 2500cxi Printer)"
+ }
+
+ } // End Large format media sizes.
+} // End DJ9xx without photo modes
+
+/////////// DJ9xx without photo/hires/best color modes
+{
+
+ Attribute "cupsEvenDuplex" "" "True"
+ Attribute "cupsBackSide" "" "Rotated"
+ Attribute "cupsFlipDuplex" "" "True"
+ Attribute "hpPrinterLanguage" "" "pcl3gui"
+ Attribute "hpPrinterPlatform" "" "dj970"
+ Attribute "HPMechOffset" "" "70"
+
+ Group "General/General"
+
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 10.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "<</Duplex true/Tumble false>>setpagedevice"
+ Choice "DuplexTumble/Short Edge (Flip)" "<</Duplex true/Tumble true>>setpagedevice"
+ *Choice "None/Off" "<</Duplex false/Tumble false>>setpagedevice"
+
+ // MediaPosition values map to MediaSource enumeration in global_types.h
+ Option "InputSlot/Media Source" PickOne AnySetup 10.0
+ *Choice "Auto/Auto-Select" "<</MediaPosition 7>>setpagedevice"
+ Choice "PhotoTray/Photo Tray" "<</MediaPosition 6>>setpagedevice"
+ Choice "Upper/Upper Tray" "<</MediaPosition 1>>setpagedevice"
+ Choice "Lower/Lower Tray" "<</MediaPosition 4>>setpagedevice"
+ Choice "Envelope/Envelope Feeder" "<</MediaPosition 3>>setpagedevice"
+ Choice "LargeCapacity/Large Capacity Tray" "<</MediaPosition 5>>setpagedevice"
+ Choice "Manual/Manual Feeder" "<</MediaPosition 2>>setpagedevice"
+ Choice "MPTray/Multi Purpose Tray" "<</MediaPosition 1>>setpagedevice"
+
+ // cupsMediaType values map to MEDIATYPE from global_types.h
+ Option "MediaType/Media Type" PickOne AnySetup 10.0
+ *Choice "Plain/Plain Paper" "<</MediaType(Plain)/cupsMediaType 0>>setpagedevice"
+
+ // cupsCompression values map to QUALITY_MODE from global_types.h
+ Option "OutputMode/Print Quality" PickOne AnySetup 10.0
+ *Choice "NormalRGB/Normal Color" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 0/OutputType(0)/cupsString0(PlainNormalColor)/HWResolution[300 300]>>setpagedevice"
+ Choice "NormalGray/Normal Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 2/OutputType(0)/cupsString0(PlainNormalGrayK)/HWResolution[600 600]>>setpagedevice"
+ Choice "DraftRGB/Draft Color" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 0/OutputType(-1)/cupsString0(PlainDraftColor)/HWResolution[300 300]>>setpagedevice"
+ Choice "DraftGray/Draft Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 2/OutputType(-1)/cupsString0(PlainDraftGrayK)/HWResolution[300 300]>>setpagedevice"
+ Choice "BestRGB/Best Color" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 0/OutputType(1)/cupsString0(PlainBestColor)/HWResolution[600 600]>>setpagedevice"
+ //Choice "BestGray/Best Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 2/cupsCompression 2/HWResolution[600 600]>>setpagedevice"
+
+ // Duplexer is optional...
+ Installable "OptionDuplex/Duplexer Installed"
+
+ // Constraints
+ UIConstraints "*Duplex *OptionDuplex False"
+ UIConstraints "*PageSize Letter *Duplex"
+ UIConstraints "*PageSize A4 *Duplex"
+ UIConstraints "*PageSize Legal *Duplex"
+ UIConstraints "*PageSize Photo4x6 *Duplex"
+ UIConstraints "*PageSize Photo5x7 *Duplex"
+ UIConstraints "*PageSize A5 *Duplex"
+ UIConstraints "*PageSize A6 *Duplex"
+ UIConstraints "*PageSize B5 *Duplex"
+ UIConstraints "*PageSize Oufuku *Duplex"
+ UIConstraints "*PageSize Hagaki *Duplex"
+ UIConstraints "*PageSize Executive *Duplex"
+ UIConstraints "*PageSize FLSA *Duplex"
+ UIConstraints "*PageSize ExecutiveJIS *Duplex"
+ UIConstraints "*PageSize 16k *Duplex"
+ UIConstraints "*PageSize Card3x5 *Duplex"
+ UIConstraints "*PageSize Card5x8 *Duplex"
+ UIConstraints "*PageSize Env10 *Duplex"
+ UIConstraints "*PageSize EnvA2 *Duplex"
+ UIConstraints "*PageSize EnvC6 *Duplex"
+ UIConstraints "*PageSize EnvDL *Duplex"
+ UIConstraints "*PageSize EnvC5 *Duplex"
+ UIConstraints "*PageSize EnvB5 *Duplex"
+ UIConstraints "*PageSize EnvChou3 *Duplex"
+ UIConstraints "*PageSize EnvChou4 *Duplex"
+ UIConstraints "*PageSize EnvMonarch *Duplex"
+
+ // Large format
+ UIConstraints "*PageSize A3 *Duplex"
+ UIConstraints "*PageSize B4 *Duplex"
+ UIConstraints "*PageSize Ledger *Duplex"
+ UIConstraints "*PageSize SuperB *Duplex"
+ UIConstraints "*PageSize 8k *Duplex"
+
+ Attribute "cupsModelName" "" "DESKJET 930" // APDK device class
+
+ {
+// 4x6 or smaller
+ CustomMedia "Card3x5/Index Card 3x5in" 216 360 9 36 9 9 "<</cupsInteger0 78/PageSize [216 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 78/PageSize[216 360]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki/Hagaki 100x148mm" 284 420 9 36 9 9 "<</cupsInteger0 71/PageSize[284 420]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/PageSize[284 420]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki.Duplex/Hagaki AutoDuplex 100x148mm" 284 411 9 27 9 36 "<</cupsInteger0 71/PageSize[284 411]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/PageSize[284 411]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6/Photo 4x6in" 288 432 9 36 9 9 "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6/A6 105x148mm" 297.36 419.76 9 36 9 9 "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6.Duplex/A6 AutoDuplex 105x148mm)" 297 411 18 27 18 36 "<</cupsInteger0 73/PageSize[297 411]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 73/PageSize[297 411]/ImagingBBox null>>setpagedevice"
+
+// 5x7
+ CustomMedia "Photo5x7/Photo 5x7in" 360 504 9 36 9 9 "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card5x8/Index Card 5x8in" 360 576 9 36 9 9 "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card5x8.Duplex/Index Card AutoDuplex 5x8in" 360 567 9 27 9 36 "<</cupsInteger0 75/PageSize[360 567]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 75/PageSize[360 567]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Oufuku/Oufuku-Hagaki 148x200mm" 567 420 9 36 9 9 "<</cupsInteger0 72/PageSize[567 420]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 72/PageSize[567 420]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Oufuku.Duplex/Oufuku-Hagaki AutoDuplex 148x200mm" 567 411 9 27 9 36 "<</cupsInteger0 72/PageSize[567 411]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 72/PageSize[567 411]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5/A5 148x210mm" 419.76 595.44 9 36 9 9 "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5.Duplex/A5 AutoDuplex 148x210mm" 420 586 18 27 18 36 "<</cupsInteger0 25/PageSize[420 586]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/PageSize[420 586]/ImagingBBox null>>setpagedevice"
+
+// Standard
+ CustomMedia "B5/B5 176x250mm" 498.96 708.48 18 36 18 9 "<</cupsInteger0 65/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 65/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ CustomMedia "B5.Duplex/B5 AutoDuplex 176x250mm" 499 699 18 27 18 36 "<</cupsInteger0 65/PageSize[499 699]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 65/PageSize[499 699]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5/JB5 182x257mm" 516.24 728.64 18 36 18 9 "<</cupsInteger0 45/PageSize[516.24 728.64]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 45/PageSize [516.24 728.64]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5.Duplex/JB5 AutoDuplex 182x257mm" 516 720 18 27 18 36 "<</cupsInteger0 45/PageSize[516 720]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 45/PageSize [516 720]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Executive/Executive 7.25x10.5in" 522 756 18 36 18 9 "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Executive.Duplex/Executive AutoDuplex 7.25x10.5in" 522 747 18 27 18 36 "<</cupsInteger0 1/PageSize[522 747]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[522 747]/ImagingBBox null>>setpagedevice"
+ CustomMedia "16k/16k 7.75x10.75in" 558 774 18 36 18 9 "<</cupsInteger0 101/PageSize[558 774]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[558 774]/ImagingBBox null>>setpagedevice" // custom
+ *CustomMedia "Letter/Letter 8.5x11in" 612 792 18 36 18 9 "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Letter.Duplex/Letter AutoDuplex 8.5x11in" 612 783 18 27 18 36 "<</cupsInteger0 2/PageSize[612 783]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/PageSize[612 783]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4/A4 210x297mm" 595.44 841.68 18 36 18 9 "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4.Duplex/A4 AutoDuplex 210x297mm" 595 833 18 27 18 36 "<</cupsInteger0 26/PageSize[595 833]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/PageSize[595 833]/ImagingBBox null>>setpagedevice"
+ CustomMedia "ExecutiveJIS/Executive (JIS) 8.5x12.986in" 612 936 18 36 18 9 "<</cupsInteger0 10/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 10/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ CustomMedia "FLSA/American Foolscap 8.5x13in" 612 936 18 36 18 9 "<</cupsInteger0 10/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 10/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Legal/Legal 8.5x14in" 612 1008 18 36 18 9 "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Legal.Duplex/Legal AutoDuplex 8.5x14in" 612 999 18 27 18 36 "<</cupsInteger0 3/PageSize[612 999]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 3/PageSize[612 999]/ImagingBBox null>>setpagedevice"
+
+// Large
+ CustomMedia "SuperB/SuperB 13x19in" 936 1368 18 36 18 9 "<</cupsInteger0 16/PageSize[936 1368]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 16/PageSize[936 1368]/ImagingBBox null>>setpagedevice"
+ CustomMedia "B4/B4 257x364mm" 729 1033 18 36 18 9 "<</cupsInteger0 46/PageSize[729 1033]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 46/PageSize[729 1033]/ImagingBBox null>>setpagedevice"
+ CustomMedia "B4.Duplex/B4 AutoDuplex 257x364mm" 729 1024 18 27 18 36 "<</cupsInteger0 1/PageSize[729 1024]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[729 1024]/ImagingBBox null>>setpagedevice"
+ CustomMedia "8k/8k 10.75x15.5in" 774 1116 18 36 18 9 "<</cupsInteger0 101/PageSize[774 1116]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[774 1116]/ImagingBBox null>>setpagedevice" // custom
+ CustomMedia "Ledger/Ledger 11x17in" 792 1224 18 36 18 9 "<</cupsInteger0 6/PageSize[792 1224]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 6/PageSize[792 1224]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A3/A3 297x420mm" 842 1190 18 36 18 9 "<</cupsInteger0 27/PageSize[842 1190]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 27/PageSize[842 1190]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A3.Duplex/A3 AutoDuplex 297x420mm" 842 1181 18 27 18 36 "<</cupsInteger0 1/PageSize[842 1181]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[842 1181]/ImagingBBox null>>setpagedevice"
+
+// Envelope
+ CustomMedia "EnvA2/A2 Envelope 4.37x5.75in" 314.64 414 9 42 9 9 "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC6/C6 Envelope 114x162mm" 323.28 459.36 9 39 9 9 "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou4/#4 Japanese Envelope 90x205mm" 254.88 581.04 9 41 9 9 "<</cupsInteger0 111/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 111/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvMonarch/Monarch Envelope 3.875x7.5in" 279 540 9 41 9 9 "<</cupsInteger0 80/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 80/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvDL/DL Envelope 110x220mm" 311.76 623.52 9 41 9 9 "<</cupsInteger0 90/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 90/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Env10/#10 Envelope 4.12x9.5in" 297 684 9 41 9 9 "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou3/#3 Japanese Envelope 120x235mm" 339.84 666 9 41 9 9 "<</cupsInteger0 110/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 110/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC5/C5 Envelope 162x229mm" 459 649 18 41 18 9 "<</cupsInteger0 91/PageSize[459 649]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 91/PageSize[459 649]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvB5/B5 Envelope 176x250mm" 499 709 18 41 18 9 "<</cupsInteger0 100/PageSize[499 709]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 100/PageSize[499 709]/ImagingBBox null>>setpagedevice"
+
+ // Custom page sizes from 1x4in to SuperB
+ HWMargins 18 36 18 36
+ VariablePaperSize Yes
+ MinSize 1in 4in // TODO: check custom page sizes for large format
+ MaxSize 936 1368
+
+ // <%DJ9xx:LargeFormatSuperB:NoPhotoBestHiresModes%>
+ {
+ ModelName "HP Deskjet 1120"
+ Attribute "NickName" "" "HP Deskjet 1120, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 1120"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 1120;DES:deskjet 1120;"
+ PCFileName "hp-deskjet_1120.ppd"
+ Attribute "Product" "" "(HP Deskjet 1120cxi Printer)"
+ Attribute "Product" "" "(HP Deskjet 1120cse Printer)"
+ Attribute "Product" "" "(HP Deskjet 1120c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 1125"
+ Attribute "NickName" "" "HP Deskjet 1125, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 1125"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 1125;DES:deskjet 1125;"
+ PCFileName "hp-deskjet_1125.ppd"
+ Attribute "Product" "" "(HP Deskjet 1125c Printer)"
+ }
+
+ } // End Large format media sizes.
+} // End DJ9xx without photo/hires/best color modes
+
+//////// DJ9xxVIP
+{
+ Attribute "cupsEvenDuplex" "" "True"
+ Attribute "cupsBackSide" "" "Rotated"
+ Attribute "cupsFlipDuplex" "" "True"
+ Attribute "hpPrinterLanguage" "" "pcl3gui2"
+ Attribute "HPMechOffset" "" "70"
+
+ Group "General/General"
+
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 10.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "<</Duplex true/Tumble false>>setpagedevice"
+ Choice "DuplexTumble/Short Edge (Flip)" "<</Duplex true/Tumble true>>setpagedevice"
+ *Choice "None/Off" "<</Duplex false/Tumble false>>setpagedevice"
+
+ // MediaPosition values map to MediaSource enumeration in global_types.h
+ Option "InputSlot/Media Source" PickOne AnySetup 10.0
+ *Choice "Auto/Auto-Select" "<</MediaPosition 7>>setpagedevice"
+ Choice "PhotoTray/Photo Tray" "<</MediaPosition 6>>setpagedevice"
+ Choice "Upper/Upper Tray" "<</MediaPosition 1>>setpagedevice"
+ Choice "Lower/Lower Tray" "<</MediaPosition 4>>setpagedevice"
+ Choice "Envelope/Envelope Feeder" "<</MediaPosition 3>>setpagedevice"
+ Choice "LargeCapacity/Large Capacity Tray" "<</MediaPosition 5>>setpagedevice"
+ Choice "Manual/Manual Feeder" "<</MediaPosition 2>>setpagedevice"
+ Choice "MPTray/Multi Purpose Tray" "<</MediaPosition 1>>setpagedevice"
+
+ Option "ColorModel/Output Mode" PickOne AnySetup 10.0
+ Choice "CMYGray/High Quality Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 1>>setpagedevice"
+ Choice "KGray/Black Only Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 2>>setpagedevice"
+ *Choice "RGB/Color" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 0>>setpagedevice"
+
+ // cupsMediaType values map to MEDIATYPE from global_types.h
+ Option "MediaType/Media Type" PickOne AnySetup 10.0
+ *Choice "Automatic/Automatic" "<</MediaType(Automatic)/cupsMediaType -1>>setpagedevice"
+ Choice "Plain/Plain Paper" "<</MediaType(Plain)/cupsMediaType 0>>setpagedevice"
+ Choice "Glossy/Photo Paper" "<</MediaType(Glossy)/cupsMediaType 3>>setpagedevice"
+ Choice "TransparencyFilm/Transparency Film" "<</MediaType(TransparencyFilm)/cupsMediaType 4>>setpagedevice"
+
+ // cupsCompression values map to QUALITY_MODE from global_types.h
+ Option "OutputMode/Print Quality" PickOne AnySetup 10.0
+ *Choice "Normal/Normal" "<</OutputType(0)/HWResolution[600 600]>>setpagedevice"
+ Choice "Draft/Draft" "<</OutputType(-1)/HWResolution[300 300]>>setpagedevice"
+ Choice "Best/Best" "<</OutputType(1)/HWResolution[600 600]>>setpagedevice"
+ Choice "Photo/High-Resolution Photo" "<</OutputType(2)/HWResolution[1200 1200]>>setpagedevice"
+
+ // Duplexer is optional...
+ Installable "OptionDuplex/Duplexer Installed"
+
+ // Constraints
+ UIConstraints "*Duplex *OptionDuplex False"
+ UIConstraints "*ColorModel KGray *OutputMode Photo"
+ UIConstraints "*ColorModel CMYGray *OutputMode Photo"
+ UIConstraints "*MediaType Glossy *OutputMode Draft"
+ UIConstraints "*MediaType Plain *OutputMode Photo"
+ UIConstraints "*PageSize Letter *Duplex"
+ UIConstraints "*PageSize A4 *Duplex"
+ UIConstraints "*PageSize Legal *Duplex"
+ UIConstraints "*PageSize Photo4x6 *Duplex"
+ UIConstraints "*PageSize Photo5x7 *Duplex"
+ UIConstraints "*PageSize A5 *Duplex"
+ UIConstraints "*PageSize A6 *Duplex"
+ UIConstraints "*PageSize B5 *Duplex"
+ UIConstraints "*PageSize Oufuku *Duplex"
+ UIConstraints "*PageSize Hagaki *Duplex"
+ UIConstraints "*PageSize Executive *Duplex"
+ UIConstraints "*PageSize FLSA *Duplex"
+ UIConstraints "*PageSize ExecutiveJIS *Duplex"
+ UIConstraints "*PageSize 16k *Duplex"
+ UIConstraints "*PageSize Card3x5 *Duplex"
+ UIConstraints "*PageSize Card5x8 *Duplex"
+ UIConstraints "*PageSize Env10 *Duplex"
+ UIConstraints "*PageSize EnvA2 *Duplex"
+ UIConstraints "*PageSize EnvC6 *Duplex"
+ UIConstraints "*PageSize EnvDL *Duplex"
+ UIConstraints "*PageSize EnvC5 *Duplex"
+ UIConstraints "*PageSize EnvB5 *Duplex"
+ UIConstraints "*PageSize EnvChou3 *Duplex"
+ UIConstraints "*PageSize EnvChou4 *Duplex"
+ UIConstraints "*PageSize EnvMonarch *Duplex"
+
+ Attribute "cupsModelName" "" "DESKJET 990" // APDK device class
+
+ // Supported media sizes
+// 4x6 or smaller
+ CustomMedia "Card3x5/Index Card 3x5in" 216 360 18.00 36.00 18.00 9.00 "<</cupsInteger0 78/PageSize [216 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 78/PageSize[216 360]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki/Hagaki 100x148mm" 284 420 9.00 36.00 9.00 9.00 "<</cupsInteger0 71/PageSize[284 420]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/PageSize[284 420]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki.Duplex/Hagaki AutoDuplex 100x148mm" 284 411 9 27 9 36 "<</cupsInteger0 71/PageSize[284 411]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/PageSize[284 411]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6/Photo 4x6in" 288 432 9.00 36.00 9.00 9.00 "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6/A6 105x148mm" 297.36 419.76 9.00 36.00 9.00 9.00 "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6.Duplex/A6 AutoDuplex 105x148mm)" 297 411 18 27 18 36 "<</cupsInteger0 73/PageSize[297 411]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 73/PageSize[297 411]/ImagingBBox null>>setpagedevice"
+
+// 5x7
+ CustomMedia "Photo5x7/Photo 5x7in" 360 504 9 36 9 9 "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card5x8/Index Card 5x8in" 360 576 18.00 36.00 18.00 9.00 "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card5x8.Duplex/Index Card AutoDuplex 5x8in" 360 567 9 27 9 36 "<</cupsInteger0 75/PageSize[360 567]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 75/PageSize[360 567]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Oufuku/Oufuku-Hagaki 148x200mm" 567 420 18.00 36.00 18.00 9.00 "<</cupsInteger0 72/PageSize[567 420]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 72/PageSize[567 420]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Oufuku.Duplex/Oufuku-Hagaki AutoDuplex 148x200mm" 567 411 9 27 9 36 "<</cupsInteger0 72/PageSize[567 411]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 72/PageSize[567 411]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5/A5 148x210mm" 419.76 595.44 9 36 9 9 "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5.Duplex/A5 AutoDuplex 148x210mm" 420 586 18 27 18 36 "<</cupsInteger0 25/PageSize[420 586]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/PageSize[420 586]/ImagingBBox null>>setpagedevice"
+
+// Standard
+ CustomMedia "B5/B5 176x250mm" 498.96 708.48 18 36 18 9 "<</cupsInteger0 65/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 65/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ CustomMedia "B5.Duplex/B5 AutoDuplex 176x250mm" 499 699 18 27 18 36 "<</cupsInteger0 65/PageSize[499 699]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 65/PageSize[499 699]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5/JB5 182x257mm" 516.24 728.64 18 36 18 9 "<</cupsInteger0 45/PageSize[516.24 728.64]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 45/PageSize [516.24 728.64]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5.Duplex/JB5 AutoDuplex 182x257mm" 516 720 18 27 18 36 "<</cupsInteger0 45/PageSize[516 720]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 45/PageSize [516 720]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Executive/Executive 7.25x10.5in" 522 756 18.00 36.00 18.00 9.00 "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Executive.Duplex/Executive AutoDuplex 7.25x10.5in" 522 747 18 27 18 36 "<</cupsInteger0 1/PageSize[522 747]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[522 747]/ImagingBBox null>>setpagedevice"
+ CustomMedia "16k/16k 7.75x10.75in" 558 774 18.00 36.00 18.00 9.00 "<</cupsInteger0 101/PageSize[558 774]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[558 774]/ImagingBBox null>>setpagedevice" // custom
+ *CustomMedia "Letter/Letter 8.5x11in" 612 792 18 36 18 9 "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Letter.Duplex/Letter AutoDuplex 8.5x11in" 612 783 18 27 18 36 "<</cupsInteger0 2/PageSize[612 783]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/PageSize[612 783]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4/A4 210x297mm" 595.44 841.68 18 36.00 18 9.00 "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4.Duplex/A4 AutoDuplex 210x297mm" 595 833 18 27 18 36 "<</cupsInteger0 26/PageSize[595 833]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/PageSize[595 833]/ImagingBBox null>>setpagedevice"
+ CustomMedia "ExecutiveJIS/Executive (JIS) 8.5x12.986in" 612 936 18 36 18 9 "<</cupsInteger0 10/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 10/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ CustomMedia "FLSA/American Foolscap 8.5x13in" 612 936 18.00 36.00 18.00 9.00 "<</cupsInteger0 10/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 10/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Legal/Legal 8.5x14in" 612 1008 18 36 18 9 "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Legal.Duplex/Legal AutoDuplex 8.5x14in" 612 999 18 27 18 36 "<</cupsInteger0 3/PageSize[612 999]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 3/PageSize[612 999]/ImagingBBox null>>setpagedevice"
+
+// Envelope
+ CustomMedia "EnvA2/A2 Envelope 4.37x5.75in" 314.64 414 9 42 9 9 "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC6/C6 Envelope 114x162mm" 323.28 459.36 18.00 36.00 18.00 9.00 "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou4/#4 Japanese Envelope 90x205mm" 254.88 581.04 9 41 9 9 "<</cupsInteger0 111/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 111/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvMonarch/Monarch Envelope 3.875x7.5in" 279 540 18.00 36.00 18.00 9.00 "<</cupsInteger0 80/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 80/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvDL/DL Envelope 110x220mm" 311.76 623.52 18.00 36.00 18.00 9.00 "<</cupsInteger0 90/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 90/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Env10/#10 Envelope 4.12x9.5in" 297 684 18.00 36.00 18.00 9.00 "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou3/#3 Japanese Envelope 120x235mm" 339.84 666 9 41 9 9 "<</cupsInteger0 110/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 110/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC5/C5 Envelope 162x229mm" 459 649 18.00 36.00 18.00 9.00 "<</cupsInteger0 91/PageSize[459 649]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 91/PageSize[459 649]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvB5/B5 Envelope 176x250mm" 499 709 18.00 36.00 18.00 9.00 "<</cupsInteger0 100/PageSize[499 709]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 100/PageSize[499 709]/ImagingBBox null>>setpagedevice"
+
+ {
+ // Custom page sizes from 1x4in to Legal
+ HWMargins 9 36 9 36
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 8.5in 14in
+
+ // <%DJ9xxVIP:Normal%>
+ {
+ ModelName "HP Officejet D Series"
+ Attribute "NickName" "" "HP Officejet D Series, $Version"
+ Attribute "ShortNickName" "" "HP Officejet D Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet d series;DES:officejet d series;"
+ PCFileName "hp-officejet_d_series.ppd"
+ Attribute "Product" "" "(HP Officejet d125xi All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet d135 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet d135xi All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet d145xi All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet d145 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet d155xi All-in-one Printer)"
+ }
+ {
+ ModelName "HP dj450"
+ Attribute "NickName" "" "HP dj450, $Version"
+ Attribute "ShortNickName" "" "HP dj450"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:dj450;DES:dj450;"
+ PCFileName "hp-dj450.ppd"
+ Attribute "Product" "" "(HP Deskjet 450ci Mobile Printer)"
+ Attribute "Product" "" "(HP Deskjet 450cbi Mobile Printer)"
+ Attribute "Product" "" "(HP Deskjet 450wbt Mobile Printer)"
+ }
+ {
+ ModelName "HP Deskjet 960c"
+ Attribute "NickName" "" "HP Deskjet 960c, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 960c"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 960c;DES:deskjet 960c;"
+ PCFileName "hp-deskjet_960c.ppd"
+ Attribute "Product" "" "(HP Deskjet 960cse Printer)"
+ Attribute "Product" "" "(HP Deskjet 960cxi Printer)"
+ Attribute "Product" "" "(HP Deskjet 960c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 980c"
+ Attribute "NickName" "" "HP Deskjet 980c, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 980c"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 980c;DES:deskjet 980c;"
+ PCFileName "hp-deskjet_980c.ppd"
+ Attribute "Product" "" "(HP Deskjet 980cxi Printer)"
+ Attribute "Product" "" "(HP Deskjet 980c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 990c"
+ Attribute "NickName" "" "HP Deskjet 990c, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 990c"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 990c;DES:deskjet 990c;"
+ PCFileName "hp-deskjet_990c.ppd"
+ Attribute "Product" "" "(HP Deskjet 990cxi Printer)"
+ Attribute "Product" "" "(HP Deskjet 990cse Printer)"
+ Attribute "Product" "" "(HP Deskjet 990cm Printer)"
+ Attribute "Product" "" "(HP Deskjet 990c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 995c"
+ Attribute "NickName" "" "HP Deskjet 995c, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 995c"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 995c;DES:deskjet 995c;"
+ PCFileName "hp-deskjet_995c.ppd"
+ Attribute "Product" "" "(HP Deskjet 995c Printer)"
+ Attribute "Product" "" "(HP Deskjet 995ck Printer)"
+ }
+ {
+ ModelName "HP Photosmart 1115"
+ Attribute "NickName" "" "HP Photosmart 1115, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 1115"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 1115;DES:photosmart 1115;"
+ PCFileName "hp-photosmart_1115.ppd"
+ Attribute "Product" "" "(HP Photosmart 1115 Printer)"
+ }
+ {
+ ModelName "HP cp1160"
+ Attribute "NickName" "" "HP cp1160, $Version"
+ Attribute "ShortNickName" "" "HP cp1160"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:cp1160;DES:cp1160;"
+ PCFileName "hp-cp1160.ppd"
+ Attribute "Product" "" "(HP Color Inkjet cp1160 Printer)"
+ Attribute "Product" "" "(HP Color Inkjet cp1160tn Printer)"
+ }
+ {
+ ModelName "HP Photosmart 1215"
+ Attribute "NickName" "" "HP Photosmart 1215, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 1215"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 1215;DES:photosmart 1215;"
+ PCFileName "hp-photosmart_1215.ppd"
+ Attribute "Product" "" "(HP Photosmart 1215 Printer)"
+ Attribute "Product" "" "(HP Photosmart 1215vm Printer)"
+ }
+ {
+ ModelName "HP Photosmart 1218"
+ Attribute "NickName" "" "HP Photosmart 1218, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 1218"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 1218;DES:photosmart 1218;"
+ PCFileName "hp-photosmart_1218.ppd"
+ Attribute "Product" "" "(HP Photosmart 1218 Printer)"
+ Attribute "Product" "" "(HP Photosmart 1218xi Printer)"
+ }
+ {
+ ModelName "HP Photosmart 1315"
+ Attribute "NickName" "" "HP Photosmart 1315, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 1315"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 1315;DES:photosmart 1315;"
+ PCFileName "hp-photosmart_1315.ppd"
+ Attribute "Product" "" "(HP Photosmart 1315 Printer)"
+ }
+ {
+ ModelName "HP Color Inkjet cp1700"
+ Attribute "NickName" "" "HP Color Inkjet cp1700, $Version"
+ Attribute "ShortNickName" "" "HP Color Inkjet cp1700"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color inkjet cp1700;DES:hp color inkjet cp1700;"
+ PCFileName "hp-color_inkjet_cp1700.ppd"
+ Attribute "Product" "" "(HP Color Inkjet cp1700 Printer)"
+ }
+ {
+ ModelName "HP PSC 2100 Series"
+ Attribute "NickName" "" "HP PSC 2100 Series, $Version"
+ Attribute "ShortNickName" "" "HP PSC 2100 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:psc 2100 series;DES:psc 2100 series;"
+ PCFileName "hp-psc_2100_series.ppd"
+ Attribute "Product" "" "(HP PSC 2105 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 2108 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 2110v All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 2110 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 2110xi All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 2115 All-in-one Printer)"
+ }
+ {
+ ModelName "HP PSC 2150 Series"
+ Attribute "NickName" "" "HP PSC 2150 Series, $Version"
+ Attribute "ShortNickName" "" "HP PSC 2150 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:psc 2150 series;DES:psc 2150 series;"
+ PCFileName "hp-psc_2150_series.ppd"
+ Attribute "Product" "" "(HP PSC 2150 All-in-one Printer)"
+ }
+ {
+ ModelName "HP PSC 2170 Series"
+ Attribute "NickName" "" "HP PSC 2170 Series, $Version"
+ Attribute "ShortNickName" "" "HP PSC 2170 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:psc 2170 series;DES:psc 2170 series;"
+ PCFileName "hp-psc_2170_series.ppd"
+ Attribute "Product" "" "(HP PSC 2170 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 2171 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 2175xi All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 2175v All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 2175 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 2179 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Deskjet 6120"
+ Attribute "NickName" "" "HP Deskjet 6120, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 6120"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 6120;DES:deskjet 6120;"
+ PCFileName "hp-deskjet_6120.ppd"
+ Attribute "Product" "" "(HP Deskjet 6120 Color Inkjet Printer)"
+ }
+ {
+ ModelName "HP Deskjet 6122"
+ Attribute "NickName" "" "HP Deskjet 6122, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 6122"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 6122;DES:deskjet 6122;"
+ PCFileName "hp-deskjet_6122.ppd"
+ Attribute "Product" "" "(HP Deskjet 6122 Color Inkjet Printer)"
+ }
+ {
+ ModelName "HP Deskjet 6127"
+ Attribute "NickName" "" "HP Deskjet 6127, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 6127"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 6127;DES:deskjet 6127;"
+ PCFileName "hp-deskjet_6127.ppd"
+ Attribute "Product" "" "(HP Deskjet 6127 Color Inkjet Printer)"
+ }
+ {
+ ModelName "HP Officejet 7100 Series"
+ Attribute "NickName" "" "HP Officejet 7100 Series, $Version"
+ Attribute "ShortNickName" "" "HP Officejet 7100 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet 7100 series;DES:officejet 7100 series;"
+ PCFileName "hp-officejet_7100_series.ppd"
+ Attribute "Product" "" "(HP Officejet 7100 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 7110 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 7110xi All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 7115 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 7130 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 7130xi All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 7135xi All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 7140xi All-in-one Printer)"
+ }
+
+ } // End Supported media sizes.
+
+ {
+ // Large format
+ UIConstraints "*PageSize A3 *Duplex"
+ UIConstraints "*PageSize B4 *Duplex"
+ UIConstraints "*PageSize Ledger *Duplex"
+ UIConstraints "*PageSize SuperB *Duplex"
+ UIConstraints "*PageSize 8k *Duplex"
+
+// Large
+ CustomMedia "SuperB/SuperB 13x19in" 936 1368 14.40 36.00 14.40 9.00 "<</cupsInteger0 16/PageSize[936 1368]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 16/PageSize[936 1368]/ImagingBBox null>>setpagedevice"
+ CustomMedia "B4/B4 257x364mm" 729 1033 18 36 18 9 "<</cupsInteger0 46/PageSize[729 1033]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 46/PageSize[729 1033]/ImagingBBox null>>setpagedevice"
+ CustomMedia "B4.Duplex/B4 AutoDuplex 257x364mm" 729 1024 18 27 18 36 "<</cupsInteger0 1/PageSize[729 1024]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[729 1024]/ImagingBBox null>>setpagedevice"
+ CustomMedia "8k/8k 10.75x15.5in" 774 1116 18.00 36.00 18.00 9.00 "<</cupsInteger0 101/PageSize[774 1116]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[774 1116]/ImagingBBox null>>setpagedevice" // custom
+ CustomMedia "Ledger/Ledger 11x17in" 792 1224 14.40 36.00 14.40 9.00 "<</cupsInteger0 6/PageSize[792 1224]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 6/PageSize[792 1224]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A3/A3 297x420mm" 842 1190 18.00 36.00 18.00 9.00 "<</cupsInteger0 27/PageSize[842 1190]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 27/PageSize[842 1190]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A3.Duplex/A3 AutoDuplex 297x420mm" 842 1181 18 27 18 36 "<</cupsInteger0 1/PageSize[842 1181]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[842 1181]/ImagingBBox null>>setpagedevice"
+
+ // Custom page sizes from 1x4in to SuperB
+ HWMargins 18 36 18 36
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 936 1368
+
+ // <%DJ9xxVIP:LargeFormatSuperB%>
+ {
+ ModelName "HP Color Inkjet Printer cp1700"
+ Attribute "NickName" "" "HP Color Inkjet Printer cp1700, $Version"
+ Attribute "ShortNickName" "" "HP Color Inkjet Printer cp1700"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:color inkjet printer cp1700;DES:color inkjet printer cp1700;"
+ PCFileName "hp-color_inkjet_printer_cp1700.ppd"
+ Attribute "Product" "" "(HP Color Inkjet cp1700 Printer)"
+ Attribute "Product" "" "(HP Color Inkjet cp1700ps Printer)"
+ Attribute "Product" "" "(HP Color Inkjet cp1700d Printer)"
+ }
+
+ } // End Large format media sizes.
+} // End DJ9xxVIP
+
+//////// DJ9xxVIP without 1200-dpi mode and without paper type sensor
+{
+ Attribute "cupsEvenDuplex" "" "True"
+ Attribute "cupsBackSide" "" "Rotated"
+ Attribute "cupsFlipDuplex" "" "True"
+ Attribute "hpPrinterLanguage" "" "pcl3gui2"
+ Attribute "HPMechOffset" "" "70"
+
+ Group "General/General"
+
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 10.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "<</Duplex true/Tumble false>>setpagedevice"
+ Choice "DuplexTumble/Short Edge (Flip)" "<</Duplex true/Tumble true>>setpagedevice"
+ *Choice "None/Off" "<</Duplex false/Tumble false>>setpagedevice"
+
+ // MediaPosition values map to MediaSource enumeration in global_types.h
+ Option "InputSlot/Media Source" PickOne AnySetup 10.0
+ *Choice "Auto/Auto-Select" "<</MediaPosition 7>>setpagedevice"
+ Choice "PhotoTray/Photo Tray" "<</MediaPosition 6>>setpagedevice"
+ Choice "Upper/Upper Tray" "<</MediaPosition 1>>setpagedevice"
+ Choice "Lower/Lower Tray" "<</MediaPosition 4>>setpagedevice"
+ Choice "Envelope/Envelope Feeder" "<</MediaPosition 3>>setpagedevice"
+ Choice "LargeCapacity/Large Capacity Tray" "<</MediaPosition 5>>setpagedevice"
+ Choice "Manual/Manual Feeder" "<</MediaPosition 2>>setpagedevice"
+ Choice "MPTray/Multi Purpose Tray" "<</MediaPosition 1>>setpagedevice"
+
+ Option "ColorModel/Output Mode" PickOne AnySetup 10.0
+ Choice "Gray/Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 2>>setpagedevice"
+ *Choice "RGB/Color" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 0>>setpagedevice"
+
+ // cupsMediaType values map to MEDIATYPE from global_types.h
+ Option "MediaType/Media Type" PickOne AnySetup 10.0
+ *Choice "Plain/Plain Paper" "<</MediaType(Plain)/cupsMediaType 0>>setpagedevice"
+ Choice "Glossy/Photo Paper" "<</MediaType(Glossy)/cupsMediaType 3>>setpagedevice"
+
+ // cupsCompression values map to QUALITY_MODE from global_types.h
+ Option "OutputMode/Print Quality" PickOne AnySetup 10.0
+ *Choice "Normal/Normal" "<</OutputType(0)/HWResolution[600 600]>>setpagedevice"
+ Choice "Draft/Draft" "<</OutputType(-1)/HWResolution[300 300]>>setpagedevice"
+ Choice "Best/Best" "<</OutputType(1)/HWResolution[600 600]>>setpagedevice"
+ Choice "Photo/Photo" "<</OutputType(2)/HWResolution[600 600]>>setpagedevice"
+
+ // Duplexer is optional...
+ Installable "OptionDuplex/Duplexer Installed"
+
+ // Constraints
+ UIConstraints "*Duplex *OptionDuplex False"
+ UIConstraints "*MediaType Glossy *OutputMode Draft"
+ UIConstraints "*MediaType Plain *OutputMode Photo"
+ UIConstraints "*PageSize Letter *Duplex"
+ UIConstraints "*PageSize A4 *Duplex"
+ UIConstraints "*PageSize Legal *Duplex"
+ UIConstraints "*PageSize Photo4x6 *Duplex"
+ UIConstraints "*PageSize Photo5x7 *Duplex"
+ UIConstraints "*PageSize A5 *Duplex"
+ UIConstraints "*PageSize A6 *Duplex"
+ UIConstraints "*PageSize B5 *Duplex"
+ UIConstraints "*PageSize Oufuku *Duplex"
+ UIConstraints "*PageSize Hagaki *Duplex"
+ UIConstraints "*PageSize Executive *Duplex"
+ UIConstraints "*PageSize FLSA *Duplex"
+ UIConstraints "*PageSize ExecutiveJIS *Duplex"
+ UIConstraints "*PageSize 16k *Duplex"
+ UIConstraints "*PageSize Card3x5 *Duplex"
+ UIConstraints "*PageSize Card5x8 *Duplex"
+ UIConstraints "*PageSize Env10 *Duplex"
+ UIConstraints "*PageSize EnvA2 *Duplex"
+ UIConstraints "*PageSize EnvC6 *Duplex"
+ UIConstraints "*PageSize EnvDL *Duplex"
+ UIConstraints "*PageSize EnvC5 *Duplex"
+ UIConstraints "*PageSize EnvB5 *Duplex"
+ UIConstraints "*PageSize EnvChou3 *Duplex"
+ UIConstraints "*PageSize EnvChou4 *Duplex"
+ UIConstraints "*PageSize EnvMonarch *Duplex"
+
+ Attribute "cupsModelName" "" "DESKJET 990" // APDK device class
+
+ {
+// 4x6 or smaller
+ CustomMedia "Card3x5/Index Card 3x5in" 216 360 18.00 36.00 18.00 9.00 "<</cupsInteger0 78/PageSize [216 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 78/PageSize[216 360]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki/Hagaki 100x148mm" 284 420 9 36 9 9 "<</cupsInteger0 71/PageSize[284 420]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/PageSize[284 420]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki.Duplex/Hagaki AutoDuplex 100x148mm" 284 411 9.00 36.00 9.00 9.00 "<</cupsInteger0 71/PageSize[284 411]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/PageSize[284 411]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6/Photo 4x6in" 288 432 9.00 36.00 9.00 9.00 "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6/A6 105x148mm" 297.36 419.76 9.00 36.00 9.00 9.00 "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6.Duplex/A6 AutoDuplex 105x148mm)" 297 411 18 27 18 36 "<</cupsInteger0 73/PageSize[297 411]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 73/PageSize[297 411]/ImagingBBox null>>setpagedevice"
+
+// 5x7
+ CustomMedia "Photo5x7/Photo 5x7in" 360 504 9.00 36.00 9.00 9.00 "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card5x8/Index Card 5x8in" 360 576 18.00 36.00 18.00 9.00 "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card5x8.Duplex/Index Card AutoDuplex 5x8in" 360 567 9 27 9 36 "<</cupsInteger0 75/PageSize[360 567]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 75/PageSize[360 567]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Oufuku/Oufuku-Hagaki 148x200mm" 567 420 18.00 36.00 18.00 9.00 "<</cupsInteger0 72/PageSize[567 420]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 72/PageSize[567 420]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Oufuku.Duplex/Oufuku-Hagaki AutoDuplex 148x200mm" 567 411 9 27 9 36 "<</cupsInteger0 72/PageSize[567 411]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 72/PageSize[567 411]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5/A5 148x210mm" 419.76 595.44 9.00 36.00 9.00 9.00 "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5.Duplex/A5 AutoDuplex 148x210mm" 420 586 18 27 18 36 "<</cupsInteger0 25/PageSize[420 586]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/PageSize[420 586]/ImagingBBox null>>setpagedevice"
+
+// Standard
+ CustomMedia "B5/B5 176x250mm" 498.96 708.48 18 36 18 9 "<</cupsInteger0 65/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 65/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ CustomMedia "B5.Duplex/B5 AutoDuplex 176x250mm" 499 699 18 27 18 36 "<</cupsInteger0 65/PageSize[499 699]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 65/PageSize[499 699]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5/JB5 182x257mm" 516.24 728.64 18 36 18 9 "<</cupsInteger0 45/PageSize[516.24 728.64]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 45/PageSize [516.24 728.64]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5.Duplex/JB5 AutoDuplex 182x257mm" 516 720 18 27 18 36 "<</cupsInteger0 45/PageSize[516 720]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 45/PageSize [516 720]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Executive/Executive 7.25x10.5in" 522 756 18 36 18 9 "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Executive.Duplex/Executive AutoDuplex 7.25x10.5in" 522 747 18 27 18 36 "<</cupsInteger0 1/PageSize[522 747]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[522 747]/ImagingBBox null>>setpagedevice"
+ CustomMedia "16k/16k 7.75x10.75in" 558 774 18 36 18 9 "<</cupsInteger0 101/PageSize[558 774]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[558 774]/ImagingBBox null>>setpagedevice" // custom
+ *CustomMedia "Letter/Letter 8.5x11in" 612 792 18 36 18 9 "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Letter.Duplex/Letter AutoDuplex 8.5x11in" 612 783 18 27 18 36 "<</cupsInteger0 2/PageSize[612 783]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/PageSize[612 783]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4/A4 210x297mm" 595.44 841.68 9.72 36.00 9.72 9.0 "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4.Duplex/A4 AutoDuplex 210x297mm" 595 833 18 27 18 36 "<</cupsInteger0 26/PageSize[595 833]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/PageSize[595 833]/ImagingBBox null>>setpagedevice"
+ CustomMedia "ExecutiveJIS/Executive (JIS) 8.5x12.986in" 612 936 18 36 18 9 "<</cupsInteger0 101/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ CustomMedia "FLSA/American Foolscap 8.5x13in" 612 936 18 36 18 9 "<</cupsInteger0 101/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Legal/Legal 8.5x14in" 612 1008 18 36 18 9 "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Legal.Duplex/Legal AutoDuplex 8.5x14in" 612 999 18 27 18 36 "<</cupsInteger0 3/PageSize[612 999]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 3/PageSize[612 999]/ImagingBBox null>>setpagedevice"
+
+// Envelope
+ CustomMedia "EnvA2/A2 Envelope 4.37x5.75in" 314.64 414 9 42 9 9 "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC6/C6 Envelope 114x162mm" 323.28 459.36 18.00 36.00 18.00 9.00 "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou4/#4 Japanese Envelope 90x205mm" 254.88 581.04 9 41 9 9 "<</cupsInteger0 111/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 111/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvMonarch/Monarch Envelope 3.875x7.5in" 279 540 18.00 36.00 18.00 9.00 "<</cupsInteger0 80/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 80/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvDL/DL Envelope 110x220mm" 311.76 623.52 18.00 36.00 18.00 9.00 "<</cupsInteger0 90/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 90/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Env10/#10 Envelope 4.12x9.5in" 297 684 18.00 36.00 18.00 9.00 "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou3/#3 Japanese Envelope 120x235mm" 339.84 666 9 41 9 9 "<</cupsInteger0 110/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 110/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC5/C5 Envelope 162x229mm" 459 649 18.00 36.00 18.00 9.00 "<</cupsInteger0 91/PageSize[459 649]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 91/PageSize[459 649]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvB5/B5 Envelope 176x250mm" 499 709 18.00 36.00 18.00 9.00 "<</cupsInteger0 100/PageSize[499 709]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 100/PageSize[499 709]/ImagingBBox null>>setpagedevice"
+
+ // Custom page sizes from 1x4in to Legal
+ HWMargins 9 36 9 36
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 8.5in 14in
+
+ // <%DJ9xxVIP:No1200dpiNoSensor%>
+ {
+ ModelName "HP Business Inkjet 2200"
+ Attribute "NickName" "" "HP Business Inkjet 2200, $Version"
+ Attribute "ShortNickName" "" "HP Business Inkjet 2200"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp business inkjet 2200;DES:hp business inkjet 2200;"
+ PCFileName "hp-business_inkjet_2200.ppd"
+ Attribute "Product" "" "(HP Business Inkjet 2200 Printer)"
+ Attribute "Product" "" "(HP Business Inkjet 2200se Printer)"
+ Attribute "Product" "" "(HP Business Inkjet 2200xi Printer)"
+ }
+ {
+ ModelName "HP Business Inkjet 2230"
+ Attribute "NickName" "" "HP Business Inkjet 2230, $Version"
+ Attribute "ShortNickName" "" "HP Business Inkjet 2230"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp business inkjet 2230;DES:hp business inkjet 2230;"
+ PCFileName "hp-business_inkjet_2230.ppd"
+ Attribute "Product" "" "(HP Business Inkjet 2230 Printer)"
+ }
+ {
+ ModelName "HP Business Inkjet 2250"
+ Attribute "NickName" "" "HP Business Inkjet 2250 pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Business Inkjet 2250"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp business inkjet 2250;DES:hp business inkjet 2250;"
+ PCFileName "hp-business_inkjet_2250-pcl3.ppd"
+ Attribute "Product" "" "(HP Business Inkjet 2250 Printer)"
+ Attribute "Product" "" "(HP Business Inkjet 2250tn Printer)"
+ }
+ {
+ ModelName "HP Business Inkjet 2280"
+ Attribute "NickName" "" "HP Business Inkjet 2280 pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Business Inkjet 2280"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp business inkjet 2280;DES:hp business inkjet 2280;"
+ PCFileName "hp-business_inkjet_2280-pcl3.ppd"
+ Attribute "Product" "" "(HP Business Inkjet 2280 Printer)"
+ Attribute "Product" "" "(HP Business Inkjet 2280tn Printer)"
+ }
+ } // End Supported media sizes.
+} // End DJ9xxVIP without 1200-dpi mode and without paper type sensor
+
+////////// DJ55xx (a VIP)
+{
+ Attribute "cupsEvenDuplex" "" "True"
+ Attribute "cupsBackSide" "" "Rotated"
+ Attribute "cupsFlipDuplex" "" "True"
+ Attribute "hpPrinterLanguage" "" "pcl3gui2"
+ Attribute "HPMechOffset" "" "70"
+
+ Group "General/General"
+
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 10.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "<</Duplex true/Tumble false>>setpagedevice"
+ Choice "DuplexTumble/Short Edge (Flip)" "<</Duplex true/Tumble true>>setpagedevice"
+ *Choice "None/Off" "<</Duplex false/Tumble false>>setpagedevice"
+
+ Option "ColorModel/Output Mode" PickOne AnySetup 10.0
+ Choice "CMYGray/High Quality Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 1>>setpagedevice"
+ Choice "KGray/Black Only Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 2>>setpagedevice"
+ *Choice "RGB/Color" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 0>>setpagedevice"
+
+ // cupsMediaType values map to MEDIATYPE from global_types.h
+ Option "MediaType/Media Type" PickOne AnySetup 10.0
+ *Choice "Automatic/Automatic" "<</MediaType(Automatic)/cupsMediaType -1>>setpagedevice"
+ Choice "Plain/Plain Paper" "<</MediaType(Plain)/cupsMediaType 0>>setpagedevice"
+ Choice "Glossy/Photo Paper" "<</MediaType(Glossy)/cupsMediaType 3>>setpagedevice"
+ Choice "TransparencyFilm/Transparency Film" "<</MediaType(TransparencyFilm)/cupsMediaType 4>>setpagedevice"
+ Choice "CDDVDMedia/CD or DVD Media" "<</MediaType(CDDVDMedia)/cupsMediaType 7>>setpagedevice"
+
+ // cupsCompression values map to QUALITY_MODE from global_types.h
+ Option "OutputMode/Print Quality" PickOne AnySetup 10.0
+ *Choice "Normal/Normal" "<</OutputType(0)/HWResolution[600 600]>>setpagedevice"
+ Choice "Draft/Draft" "<</OutputType(-1)/HWResolution[300 300]>>setpagedevice"
+ Choice "Best/Best" "<</OutputType(1)/HWResolution[600 600]>>setpagedevice"
+ Choice "Photo/High-Resolution Photo" "<</OutputType(2)/HWResolution[1200 1200]>>setpagedevice"
+ Choice "FastDraft/Fast Draft" "<</OutputType(-2)/HWResolution[300 300]>>setpagedevice"
+
+ // MediaPosition values map to MediaSource enumeration in global_types.h
+ Option "InputSlot/Media Source" PickOne AnySetup 10.0
+ *Choice "Auto/Auto-Select" "<</MediaPosition 7>>setpagedevice"
+ Choice "PhotoTray/Photo Tray" "<</MediaPosition 6>>setpagedevice"
+ Choice "Upper/Upper Tray" "<</MediaPosition 1>>setpagedevice"
+ Choice "Lower/Lower Tray" "<</MediaPosition 4>>setpagedevice"
+ Choice "Envelope/Envelope Feeder" "<</MediaPosition 3>>setpagedevice"
+ Choice "LargeCapacity/Large Capacity Tray" "<</MediaPosition 5>>setpagedevice"
+ Choice "Manual/Manual Feeder" "<</MediaPosition 2>>setpagedevice"
+ Choice "MPTray/Multi Purpose Tray" "<</MediaPosition 1>>setpagedevice"
+ Choice "CDDVDTray/CD or DVD Tray" "<</MediaPosition 14>>setpagedevice"
+
+ // Duplexer is optional...
+ Installable "OptionDuplex/Duplexer Installed"
+
+ // Constraints
+ UIConstraints "*Duplex *OptionDuplex False"
+ UIConstraints "*ColorModel KGray *OutputMode Photo"
+ UIConstraints "*ColorModel CMYGray *OutputMode Photo"
+ UIConstraints "*MediaType Automatic *OutputMode FastDraft"
+
+ UIConstraints "*MediaType Glossy *OutputMode FastDraft"
+ UIConstraints "*MediaType Glossy *OutputMode Draft"
+ UIConstraints "*MediaType TransparencyFilm *OutputMode FastDraft"
+ UIConstraints "*MediaType Plain *OutputMode Photo"
+
+ UIConstraints "*InputSlot CDDVDTray *MediaType Automatic"
+ UIConstraints "*InputSlot CDDVDTray *MediaType Plain"
+ UIConstraints "*InputSlot CDDVDTray *MediaType Glossy"
+ UIConstraints "*InputSlot CDDVDTray *MediaType TransparencyFilm"
+ UIConstraints "*MediaType Automatic *PageSize Oufuku.Duplex"
+ UIConstraints "*PageSize Oufuku *Duplex"
+ UIConstraints "*PageSize Hagaki *Duplex"
+ UIConstraints "*PageSize FLSA *Duplex"
+ UIConstraints "*PageSize ExecutiveJIS *Duplex"
+ UIConstraints "*PageSize 16k *Duplex"
+ UIConstraints "*PageSize Card5x8 *Duplex"
+ UIConstraints "*PageSize EnvB5 *Duplex"
+ UIConstraints "*PageSize B5 *Duplex"
+ UIConstraints "*PageSize Letter *Duplex"
+ UIConstraints "*PageSize A4 *Duplex"
+ UIConstraints "*PageSize Legal *Duplex"
+ UIConstraints "*PageSize Photo4x6 *Duplex"
+ UIConstraints "*PageSize Photo5x7 *Duplex"
+ UIConstraints "*PageSize A5 *Duplex"
+ UIConstraints "*PageSize A6 *Duplex"
+ UIConstraints "*PageSize Executive *Duplex"
+ UIConstraints "*PageSize Card3x5 *Duplex"
+ UIConstraints "*PageSize Env10 *Duplex"
+ UIConstraints "*PageSize EnvA2 *Duplex"
+ UIConstraints "*PageSize EnvC6 *Duplex"
+ UIConstraints "*PageSize EnvDL *Duplex"
+ UIConstraints "*PageSize EnvC5 *Duplex"
+ UIConstraints "*PageSize EnvChou3 *Duplex"
+ UIConstraints "*PageSize EnvChou4 *Duplex"
+ UIConstraints "*PageSize EnvMonarch *Duplex"
+
+
+ {
+ // APDK device class
+ Attribute "cupsModelName" "" "deskjet 5550"
+
+ // 4x6 or smaller
+ CustomMedia "Card3x5/Index Card 3x5in" 216 360 9 27 9 9 "<</cupsInteger0 78/PageSize [216 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 78/PageSize[216 360]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki/Hagaki 100x148mm" 284 420 9 27 9 9 "<</cupsInteger0 71/PageSize[284 420]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/PageSize[284 420]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki.Duplex/Hagaki AutoDuplex 100x148mm" 284 411 9 27 9 36 "<</cupsInteger0 71/PageSize[284 411]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/PageSize[284 411]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6/Photo 4x6in" 288 432 9 27 9 9 "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6/A6 105x148mm" 297.36 419.76 9 27 9 9 "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6.Duplex/A6 AutoDuplex 105x148mm)" 297 411 9 27 9 36 "<</cupsInteger0 73/PageSize[297 411]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 73/PageSize[297 411]/ImagingBBox null>>setpagedevice"
+
+// 5x7
+ CustomMedia "Photo5x7/Photo 5x7in" 360 504 9 27 9 9 "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card5x8/Index Card 5x8in" 360 576 9 27 9 9 "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card5x8.Duplex/Index Card AutoDuplex 5x8in" 360 567 9 27 9 36 "<</cupsInteger0 75/PageSize[360 567]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 75/PageSize[360 567]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Oufuku/Oufuku-Hagaki 148x200mm" 567 420 9 27 9 9 "<</cupsInteger0 72/PageSize[567 420]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 72/PageSize[567 420]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Oufuku.Duplex/Oufuku-Hagaki AutoDuplex 148x200mm" 567 411 9 27 9 36 "<</cupsInteger0 72/PageSize[567 411]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 72/PageSize[567 411]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5/A5 148x210mm" 419.76 595.44 9.00 27.00 9.00 9.00 "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5.Duplex/A5 AutoDuplex 148x210mm" 420 586 18 27 18 36 "<</cupsInteger0 25/PageSize[420 586]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/PageSize[420 586]/ImagingBBox null>>setpagedevice"
+
+// Standard
+ CustomMedia "B5/B5 176x250mm" 498.96 708.48 18 27 18 9 "<</cupsInteger0 65/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 65/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ CustomMedia "B5.Duplex/B5 AutoDuplex 176x250mm" 499 699 18 27 18 36 "<</cupsInteger0 65/PageSize[499 699]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 65/PageSize[499 699]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5/JB5 182x257mm" 516.24 728.64 18 27 18 9 "<</cupsInteger0 45/PageSize[516.24 728.64]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 45/PageSize [516.24 728.64]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5.Duplex/JB5 AutoDuplex 182x257mm" 516 720 18 27 18 36 "<</cupsInteger0 45/PageSize[516 720]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 45/PageSize [516 720]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Executive/Executive 7.25x10.5in" 522 756 18 27 18 9 "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Executive.Duplex/Executive AutoDuplex 7.25x10.5in" 522 747 18 27 18 36 "<</cupsInteger0 1/PageSize[522 747]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[522 747]/ImagingBBox null>>setpagedevice"
+ CustomMedia "16k/16k 7.75x10.75in" 558 774 18 27 18 9 "<</cupsInteger0 101/PageSize[558 774]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[558 774]/ImagingBBox null>>setpagedevice" // custom
+ *CustomMedia "Letter/Letter 8.5x11in" 612 792 18 27 18 9 "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Letter.Duplex/Letter AutoDuplex 8.5x11in" 612 783 18 27 18 36 "<</cupsInteger0 2/PageSize[612 783]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/PageSize[612 783]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4/A4 210x297mm" 595.44 841.68 9.72 27.00 9.72 9.00 "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4.Duplex/A4 AutoDuplex 210x297mm" 595 833 18 27 18 36 "<</cupsInteger0 26/PageSize[595 833]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/PageSize[595 833]/ImagingBBox null>>setpagedevice"
+ CustomMedia "ExecutiveJIS/Executive (JIS) 8.5x12.986in" 612 936 18 27 18 9 "<</cupsInteger0 10/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 10/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ CustomMedia "FLSA/American Foolscap 8.5x13in" 612 936 18 27 18 9 "<</cupsInteger0 10/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 10/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Legal/Legal 8.5x14in" 612 1008 18 27 18 9 "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Legal.Duplex/Legal AutoDuplex 8.5x14in" 612 999 18 27 18 36 "<</cupsInteger0 3/PageSize[612 999]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 3/PageSize[612 999]/ImagingBBox null>>setpagedevice"
+
+// CDDVD
+ CustomMedia "CDDVD80/CD DVD 80mm" 238 238 4 4 4 4 "<</cupsInteger0 98/PageSize[238 238]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 98/PageSize[238 238]/ImagingBBox null>>setpagedevice"
+ CustomMedia "CDDVD120/CD DVD 120mm" 360 360 4 4 4 4 "<</cupsInteger0 99/PageSize[360 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 99/PageSize[360 360]/ImagingBBox null>>setpagedevice"
+
+// Envelope
+ CustomMedia "EnvA2/A2 Envelope 4.37x5.75in" 314.64 414 18.00 36.00 18.00 9.00 "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC6/C6 Envelope 114x162mm" 323.28 459.36 18.00 36.00 18.00 9.00 "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou4/#4 Japanese Envelope 90x205mm" 254.88 581.04 18.00 36.00 18.00 9.00 "<</cupsInteger0 111/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 111/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvMonarch/Monarch Envelope 3.875x7.5in" 279 540 18.00 36.00 18.00 9.00 "<</cupsInteger0 80/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 80/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvDL/DL Envelope 110x220mm" 311.76 623.52 18.00 36.00 18.00 9.00 "<</cupsInteger0 90/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 90/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Env10/#10 Envelope 4.12x9.5in" 297 684 18.00 36.00 18.00 9.00 "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou3/#3 Japanese Envelope 120x235mm" 339.84 666 18.00 36.00 18.00 9.00 "<</cupsInteger0 110/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 110/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC5/C5 Envelope 162x229mm" 459 649 18.00 36.00 18.00 9.00 "<</cupsInteger0 91/PageSize[459 649]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 91/PageSize[459 649]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvB5/B5 Envelope 176x250mm" 499 709 18.00 36.00 18.00 9.00 "<</cupsInteger0 100/PageSize[499 709]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 100/PageSize[499 709]/ImagingBBox null>>setpagedevice"
+
+ // Custom page sizes from 1x4in to legal
+ HWMargins 9 36 9 36
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 8.5in 14in
+
+ // <%DJ55xx:Normal%>
+ {
+ ModelName "HP Deskjet 460"
+ Attribute "NickName" "" "HP Deskjet 460, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 460"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 460;DES:deskjet 460;"
+ PCFileName "hp-deskjet_460.ppd"
+ Attribute "Product" "" "(HP Deskjet 460c Mobile Printer)"
+ Attribute "Product" "" "(HP Deskjet 460cb Mobile Printer)"
+ Attribute "Product" "" "(HP Deskjet 460wf Mobile Printer)"
+ Attribute "Product" "" "(HP Deskjet 460wbt Mobile Printer)"
+ }
+ {
+ ModelName "HP Officejet h470"
+ Attribute "NickName" "" "HP Officejet h470, $Version"
+ Attribute "ShortNickName" "" "HP Officejet h470"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet h470;DES:officejet h470;"
+ PCFileName "hp-officejet_h470.ppd"
+ Attribute "Product" "" "(HP Officejet h470 Mobile Printer)"
+ Attribute "Product" "" "(HP Officejet h470wbt Mobile Printer)"
+ Attribute "Product" "" "(HP Officejet h470wf Mobile Printer)"
+ Attribute "Product" "" "(HP Officejet h470bt Mobile Printer)"
+ }
+ {
+ ModelName "HP Deskjet 5550"
+ Attribute "NickName" "" "HP Deskjet 5550, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 5550"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 5550;DES:deskjet 5550;"
+ PCFileName "hp-deskjet_5550.ppd"
+ Attribute "Product" "" "(HP Deskjet 5550 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 5550w Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 5550v Color Inkjet Printer)"
+ }
+ {
+ ModelName "HP Deskjet 5551"
+ Attribute "NickName" "" "HP Deskjet 5551, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 5551"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 5551;DES:deskjet 5551;"
+ PCFileName "hp-deskjet_5551.ppd"
+ Attribute "Product" "" "(HP Deskjet 5551 Color Inkjet Printer)"
+ }
+ } // End Supported media sizes.
+
+
+} // End DJ55xx
+
+//////// DJGenericVIP
+{
+ Attribute "cupsEvenDuplex" "" "True"
+ Attribute "cupsBackSide" "" "Rotated"
+ Attribute "cupsFlipDuplex" "" "True"
+ Attribute "hpPrinterLanguage" "" "pcl3gui2"
+ Attribute "HPMechOffset" "" "70"
+
+ Group "General/General"
+
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 10.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "<</Duplex true/Tumble false>>setpagedevice"
+ Choice "DuplexTumble/Short Edge (Flip)" "<</Duplex true/Tumble true>>setpagedevice"
+ *Choice "None/Off" "<</Duplex false/Tumble false>>setpagedevice"
+
+ // MediaPosition values map to MediaSource enumeration in global_types.h
+ Option "InputSlot/Media Source" PickOne AnySetup 10.0
+ *Choice "Auto/Auto-Select" "<</MediaPosition 7>>setpagedevice"
+ Choice "PhotoTray/Photo Tray" "<</MediaPosition 6>>setpagedevice"
+ Choice "Upper/Upper Tray" "<</MediaPosition 1>>setpagedevice"
+ Choice "Lower/Lower Tray" "<</MediaPosition 4>>setpagedevice"
+ Choice "Envelope/Envelope Feeder" "<</MediaPosition 3>>setpagedevice"
+ Choice "LargeCapacity/Large Capacity Tray" "<</MediaPosition 5>>setpagedevice"
+ Choice "Manual/Manual Feeder" "<</MediaPosition 2>>setpagedevice"
+ Choice "MPTray/Multi Purpose Tray" "<</MediaPosition 1>>setpagedevice"
+ Choice "CDDVDTray/CD or DVD Tray" "<</MediaPosition 14>>setpagedevice"
+
+ Option "ColorModel/Output Mode" PickOne AnySetup 10.0
+ Choice "CMYGray/High Quality Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 1>>setpagedevice"
+ Choice "KGray/Black Only Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 2>>setpagedevice"
+ *Choice "RGB/Color" "<</cupsColorSpace 17/cupsBitsPerColor 8/cupsRowStep 0>>setpagedevice"
+
+ // cupsMediaType values map to MEDIATYPE from global_types.h
+ Option "MediaType/Media Type" PickOne AnySetup 10.0
+ *Choice "Automatic/Automatic" "<</MediaType(Automatic)/cupsMediaType -1>>setpagedevice"
+ Choice "Plain/Plain Paper" "<</MediaType(Plain)/cupsMediaType 0>>setpagedevice"
+ Choice "Glossy/Photo Paper" "<</MediaType(Glossy)/cupsMediaType 3>>setpagedevice"
+ Choice "TransparencyFilm/Transparency Film" "<</MediaType(TransparencyFilm)/cupsMediaType 4>>setpagedevice"
+ Choice "CDDVDMedia/CD or DVD Media" "<</MediaType(CDDVDMedia)/cupsMediaType 7>>setpagedevice"
+
+ // cupsCompression values map to QUALITY_MODE from global_types.h
+ Option "OutputMode/Print Quality" PickOne AnySetup 10.0
+ *Choice "Normal/Normal" "<</OutputType(0)/HWResolution[600 600]>>setpagedevice"
+ Choice "Draft/Draft" "<</OutputType(-1)/HWResolution[300 300]>>setpagedevice"
+ Choice "Best/Best" "<</OutputType(1)/HWResolution[600 600]>>setpagedevice"
+ Choice "Photo/High-Resolution Photo" "<</OutputType(2)/HWResolution[1200 1200]>>setpagedevice"
+ Choice "FastDraft/Fast Draft" "<</OutputType(-2)/HWResolution[300 300]>>setpagedevice"
+
+ // Duplexer is optional...
+ Installable "OptionDuplex/Duplexer Installed"
+
+ // Constraints
+ UIConstraints "*Duplex *OptionDuplex False"
+ UIConstraints "*ColorModel KGray *OutputMode Photo"
+ UIConstraints "*ColorModel CMYGray *OutputMode Photo"
+ UIConstraints "*MediaType Automatic *OutputMode FastDraft"
+ UIConstraints "*MediaType Glossy *OutputMode FastDraft"
+ UIConstraints "*MediaType Glossy *OutputMode Draft"
+ UIConstraints "*MediaType TransparencyFilm *OutputMode FastDraft"
+ UIConstraints "*MediaType Plain *OutputMode Photo"
+ UIConstraints "*InputSlot CDDVDTray *MediaType Automatic"
+ UIConstraints "*InputSlot CDDVDTray *MediaType Plain"
+ UIConstraints "*InputSlot CDDVDTray *MediaType Glossy"
+ UIConstraints "*InputSlot CDDVDTray *MediaType TransparencyFilm"
+ UIConstraints "*PageSize Letter *Duplex"
+ UIConstraints "*PageSize A4 *Duplex"
+ UIConstraints "*PageSize Legal *Duplex"
+ UIConstraints "*PageSize Photo4x6 *Duplex"
+ UIConstraints "*PageSize Photo5x7 *Duplex"
+ UIConstraints "*PageSize A5 *Duplex"
+ UIConstraints "*PageSize A6 *Duplex"
+ UIConstraints "*PageSize B5 *Duplex"
+ UIConstraints "*PageSize Oufuku *Duplex"
+ UIConstraints "*PageSize Hagaki *Duplex"
+ UIConstraints "*PageSize Executive *Duplex"
+ UIConstraints "*PageSize FLSA *Duplex"
+ UIConstraints "*PageSize ExecutiveJIS *Duplex"
+ UIConstraints "*PageSize 16k *Duplex"
+ UIConstraints "*PageSize Card3x5 *Duplex"
+ UIConstraints "*PageSize Card5x8 *Duplex"
+ UIConstraints "*PageSize Env10 *Duplex"
+ UIConstraints "*PageSize EnvA2 *Duplex"
+ UIConstraints "*PageSize EnvC6 *Duplex"
+ UIConstraints "*PageSize EnvDL *Duplex"
+ UIConstraints "*PageSize EnvC5 *Duplex"
+ UIConstraints "*PageSize EnvB5 *Duplex"
+ UIConstraints "*PageSize EnvChou3 *Duplex"
+ UIConstraints "*PageSize EnvChou4 *Duplex"
+ UIConstraints "*PageSize EnvMonarch *Duplex"
+
+ Attribute "cupsModelName" "" "deskjet 5600" // APDK device class
+
+// 4x6 or smaller
+ CustomMedia "Card3x5/Index Card 3x5in" 216 360 9 9 9 9 "<</cupsInteger0 78/PageSize [216 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 78/PageSize[216 360]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card3x5.FB/Index Card Borderless 3x5in" 226 370 0 0 0 0 "<</cupsInteger0 78/PageSize [226 370]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 78/PageSize[226 370]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki/Hagaki 100x148mm" 284 420 9 9 9 9 "<</cupsInteger0 71/PageSize[284 420]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/PageSize[284 420]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki.FB/Hagaki Borderless 100x148mm" 294 430 0 0 0 0 "<</cupsInteger0 71/PageSize[294 430]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/PageSize[294 430]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki.Duplex/Hagaki AutoDuplex 100x148mm" 284 411 9 27 9 36 "<</cupsInteger0 71/PageSize[284 411]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/PageSize[284 411]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6/Photo 4x6in" 288 432 9 9 9 9 "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6.FB/Photo Borderless 4x6 in" 298 442 0 0 0 0 "<</cupsInteger0 74/PageSize[298 442]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[298 442]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6/A6 105x148mm" 297.36 419.76 9 9 9 9 "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6.FB/A6 Borderless 105x148mm" 307 430 0 0 0 0 "<</cupsInteger0 73/PageSize[307 430]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 73/PageSize[307 430]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6.Duplex/A6 AutoDuplex 105x148mm)" 297 411 9 27 9 36 "<</cupsInteger0 73/PageSize[297 411]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 73/PageSize[297 411]/ImagingBBox null>>setpagedevice"
+
+// 5x7
+ CustomMedia "Photo5x7/Photo 5x7in" 360 504 9 9 9 9 "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo5x7.FB/Photo Borderless 5x7in" 370 514 0 0 0 0 "<</cupsInteger0 122/PageSize[370 514]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/PageSize[370 514]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card5x8/Index Card 5x8in" 360 576 9 9 9 9 "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card5x8.Duplex/Index Card AutoDuplex 5x8in" 360 567 9 27 9 36 "<</cupsInteger0 75/PageSize[360 567]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 75/PageSize[360 567]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Oufuku/Oufuku-Hagaki 148x200mm" 567 420 9 9 9 9 "<</cupsInteger0 72/PageSize[567 420]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 72/PageSize[567 420]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Oufuku.FB/Oufuku-Hagaki Borderless 148x200mm" 577 430 0 0 0 0 "<</cupsInteger0 72/PageSize[577 430]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 72/PageSize[577 430]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Oufuku.Duplex/Oufuku-Hagaki AutoDuplex 148x200mm" 567 411 9 27 9 36 "<</cupsInteger0 72/PageSize[567 411]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 72/PageSize[567 411]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5/A5 148x210mm" 419.76 595.44 9 9 9 9 "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5.FB/A5 Borderless 148x210mm" 430 605 0 0 0 0 "<</cupsInteger0 25/PageSize[430 605]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/PageSize[430 605]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5.Duplex/A5 AutoDuplex 148x210mm" 420 586 9 27 9 36 "<</cupsInteger0 25/PageSize[420 586]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/PageSize[420 586]/ImagingBBox null>>setpagedevice"
+
+// Standard
+ CustomMedia "B5/B5 176x250mm" 498.96 708.48 9 9 9 9 "<</cupsInteger0 65/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 65/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ CustomMedia "B5.Duplex/B5 AutoDuplex 176x250mm" 499 699 9 27 9 36 "<</cupsInteger0 65/PageSize[499 699]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 65/PageSize[499 699]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5/JB5 182x257mm" 516.24 728.64 9 9 9 9 "<</cupsInteger0 45/PageSize[516.24 728.64]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 45/PageSize [516.24 728.64]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5.FB/JB5 Borderless 182x257mm" 526 739 0 0 0 0 "<</cupsInteger0 45/PageSize[526 739]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 45/PageSize [526 739]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5.Duplex/JB5 AutoDuplex 182x257mm" 516 720 9 27 9 36 "<</cupsInteger0 45/PageSize[516 720]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 45/PageSize [516 720]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Executive/Executive 7.25x10.5in" 522 756 9 9 9 9 "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Executive.Duplex/Executive AutoDuplex 7.25x10.5in" 522 747 9 27 9 36 "<</cupsInteger0 1/PageSize[522 747]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[522 747]/ImagingBBox null>>setpagedevice"
+ CustomMedia "16k/16k 7.75x10.75in" 558 774 9 9 9 9 "<</cupsInteger0 101/PageSize[558 774]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[558 774]/ImagingBBox null>>setpagedevice" // custom
+ CustomMedia "8x10/8x10in" 576 720 9 36 9 9 "<</cupsInteger0 7/PageSize[576 720]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 7/PageSize[576 720]/ImagingBBox null>>setpagedevice"
+ *CustomMedia "Letter/Letter 8.5x11in" 612 792 9 9 9 9 "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Letter.FB/Letter Borderless 8.5x11in" 622 802 0 0 0 0 "<</cupsInteger0 2/PageSize[622 802]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/PageSize[622 802]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Letter.Duplex/Letter AutoDuplex 8.5x11in" 612 783 9 27 9 36 "<</cupsInteger0 2/PageSize[612 783]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/PageSize[612 783]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4/A4 210x297mm" 595.44 841.68 9 9 9 9 "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4.FB/A4 Borderless 210x297mm" 605 852 0 0 0 0 "<</cupsInteger0 26/PageSize[605 852]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/PageSize[605 852]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4.Duplex/A4 AutoDuplex 210x297mm" 595 833 9 27 9 36 "<</cupsInteger0 26/PageSize[595 833]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/PageSize[595 833]/ImagingBBox null>>setpagedevice"
+ CustomMedia "ExecutiveJIS/Executive (JIS) 8.5x12.986in" 612 936 9 9 9 9 "<</cupsInteger0 10/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 10/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ CustomMedia "FLSA/American Foolscap 8.5x13in" 612 936 9 9 9 9 "<</cupsInteger0 10/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 10/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Legal/Legal 8.5x14in" 612 1008 9 9 9 9 "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Legal.Duplex/Legal AutoDuplex 8.5x14in" 612 999 9 27 9 36 "<</cupsInteger0 3/PageSize[612 999]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 3/PageSize[612 999]/ImagingBBox null>>setpagedevice"
+
+// CDDVD
+ CustomMedia "CDDVD80/CD DVD 80mm" 238 238 4 4 4 4 "<</cupsInteger0 98/PageSize[238 238]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 98/PageSize[238 238]/ImagingBBox null>>setpagedevice"
+ CustomMedia "CDDVD120/CD DVD 120mm" 360 360 4 4 4 4 "<</cupsInteger0 99/PageSize[360 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 99/PageSize[360 360]/ImagingBBox null>>setpagedevice"
+
+// Envelope
+ CustomMedia "EnvA2/A2 Envelope 4.37x5.75in" 314.64 414 9 42 9 9 "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC6/C6 Envelope 114x162mm" 323.28 459.36 9 39 9 9 "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou4/#4 Japanese Envelope 90x205mm" 254.88 581.04 9 41 9 9 "<</cupsInteger0 111/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 111/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvMonarch/Monarch Envelope 3.875x7.5in" 279 540 9 41 9 9 "<</cupsInteger0 80/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 80/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvDL/DL Envelope 110x220mm" 311.76 623.52 9 41 9 9 "<</cupsInteger0 90/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 90/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Env10/#10 Envelope 4.12x9.5in" 297 684 9 41 9 9 "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou3/#3 Japanese Envelope 120x235mm" 339.84 666 9 41 9 9 "<</cupsInteger0 110/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 110/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC5/C5 Envelope 162x229mm" 459 649 9 41 9 9 "<</cupsInteger0 91/PageSize[459 649]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 91/PageSize[459 649]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvB5/B5 Envelope 176x250mm" 499 709 9 41 9 9 "<</cupsInteger0 100/PageSize[499 709]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 100/PageSize[499 709]/ImagingBBox null>>setpagedevice"
+
+ {
+ // Custom page sizes from 1x4in to Legal
+ HWMargins 18 36 18 36
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 8.5in 14in
+
+ // <%DJGenericVIP:Normal%>
+ {
+ ModelName "HP Deskjet Ink Advant k209a-z"
+ Attribute "NickName" "" "HP Deskjet Ink Advant k209a-z, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet Ink Advant k209a-z"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet ink advant k209a-z;DES:deskjet ink advant k209a-z;"
+ PCFileName "hp-deskjet_ink_advant_k209a-z.ppd"
+ Attribute "Product" "" "(HP Deskjet Ink Advantage k209a All-in-one Printer)"
+ }
+ {
+ ModelName "HP Deskjet d730"
+ Attribute "NickName" "" "HP Deskjet d730, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet d730"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet d730;DES:deskjet d730;"
+ PCFileName "hp-deskjet_d730.ppd"
+ Attribute "Product" "" "(HP Deskjet d730 Printer)"
+ }
+ {
+ ModelName "HP Deskjet f735"
+ Attribute "NickName" "" "HP Deskjet f735, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet f735"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet f735;DES:deskjet f735;"
+ PCFileName "hp-deskjet_f735.ppd"
+ Attribute "Product" "" "(HP Deskjet f735 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f4280 All-in-one)"
+ }
+ {
+ ModelName "HP Business Inkjet 1000"
+ Attribute "NickName" "" "HP Business Inkjet 1000, $Version"
+ Attribute "ShortNickName" "" "HP Business Inkjet 1000"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:business inkjet 1000;DES:business inkjet 1000;"
+ PCFileName "hp-business_inkjet_1000.ppd"
+ Attribute "Product" "" "(HP Business Inkjet 1000 Printer)"
+ }
+ {
+ ModelName "HP PSC 1500 Series"
+ Attribute "NickName" "" "HP PSC 1500 Series, $Version"
+ Attribute "ShortNickName" "" "HP PSC 1500 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:psc 1500 series;DES:psc 1500 series;"
+ PCFileName "hp-psc_1500_series.ppd"
+ Attribute "Product" "" "(HP PSC 1503 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1504 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1507 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1508 All-in-one Printer)"
+ }
+ {
+ ModelName "HP PSC 1510 Series"
+ Attribute "NickName" "" "HP PSC 1510 Series, $Version"
+ Attribute "ShortNickName" "" "HP PSC 1510 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:psc 1510 series;DES:psc 1510 series;"
+ PCFileName "hp-psc_1510_series.ppd"
+ Attribute "Product" "" "(HP PSC 1508 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1510xi All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1510v All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1510s All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1510 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1513s All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1513 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1514 All-in-one Printer)"
+ }
+ {
+ ModelName "HP PSC 1600 Series"
+ Attribute "NickName" "" "HP PSC 1600 Series, $Version"
+ Attribute "ShortNickName" "" "HP PSC 1600 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:psc 1600 series;DES:psc 1600 series;"
+ PCFileName "hp-psc_1600_series.ppd"
+ Attribute "Product" "" "(HP PSC 1600 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1603 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1605 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1608 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1610xi All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1610v All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1610 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1613 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1615 All-in-one Printer)"
+ }
+ {
+ ModelName "HP PSC 2200 Series"
+ Attribute "NickName" "" "HP PSC 2200 Series, $Version"
+ Attribute "ShortNickName" "" "HP PSC 2200 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:psc 2200 series;DES:psc 2200 series;"
+ PCFileName "hp-psc_2200_series.ppd"
+ Attribute "Product" "" "(HP PSC 2200 All-in-one Printer)"
+ }
+ {
+ ModelName "HP PSC 2210 Series"
+ Attribute "NickName" "" "HP PSC 2210 Series, $Version"
+ Attribute "ShortNickName" "" "HP PSC 2210 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:psc 2210 series;DES:psc 2210 series;"
+ PCFileName "hp-psc_2210_series.ppd"
+ Attribute "Product" "" "(HP PSC 2210 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 2210xi All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 2210v All-in-one Printer)"
+ }
+ {
+ ModelName "HP PSC 2300 Series"
+ Attribute "NickName" "" "HP PSC 2300 Series, $Version"
+ Attribute "ShortNickName" "" "HP PSC 2300 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:psc 2300 series;DES:psc 2300 series;"
+ PCFileName "hp-psc_2300_series.ppd"
+ Attribute "Product" "" "(HP PSC 2300 Series All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 2310 All-in-one Printer)"
+ }
+ {
+ ModelName "HP PSC 2350 Series"
+ Attribute "NickName" "" "HP PSC 2350 Series, $Version"
+ Attribute "ShortNickName" "" "HP PSC 2350 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:psc 2350 series;DES:psc 2350 series;"
+ PCFileName "hp-psc_2350_series.ppd"
+ Attribute "Product" "" "(HP PSC 2350 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 2352 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 2353 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 2353p All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 2355xi All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 2355v All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 2355 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 2355p All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 2357 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 2358 All-in-one Printer)"
+ }
+ {
+ ModelName "HP PSC 2400 Series"
+ Attribute "NickName" "" "HP PSC 2400 Series, $Version"
+ Attribute "ShortNickName" "" "HP PSC 2400 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:psc 2400 series;DES:psc 2400 series;"
+ PCFileName "hp-psc_2400_series.ppd"
+ Attribute "Product" "" "(HP PSC 2405 Photosmart All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 2410xi Photosmart All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 2410v Photosmart All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 2410 Photosmart All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 2420 Photosmart All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 2450 Photosmart All-in-one Printer)"
+ }
+ {
+ ModelName "HP Deskjet d2500 Series"
+ Attribute "NickName" "" "HP Deskjet d2500 Series, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet d2500 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet d2500 series;DES:deskjet d2500 series;"
+ PCFileName "hp-deskjet_d2500_series.ppd"
+ Attribute "Product" "" "(HP Deskjet d2530 Printer)"
+ Attribute "Product" "" "(HP Deskjet d2545 Printer)"
+ Attribute "Product" "" "(HP Deskjet d2560 Printer)"
+ Attribute "Product" "" "(HP Deskjet d2563 Printer)"
+ Attribute "Product" "" "(HP Deskjet d2566 Printer)"
+ Attribute "Product" "" "(HP Deskjet d2568 Printer)"
+ }
+ {
+ ModelName "HP PSC 2500 Series"
+ Attribute "NickName" "" "HP PSC 2500 Series, $Version"
+ Attribute "ShortNickName" "" "HP PSC 2500 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:psc 2500 series;DES:psc 2500 series;"
+ PCFileName "hp-psc_2500_series.ppd"
+ Attribute "Product" "" "(HP PSC 2500 Photosmart All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 2510 Photosmart All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 2510xi Photosmart All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 2550 Photosmart All-in-one Printer)"
+ }
+ {
+ ModelName "HP Photosmart 2570 Series"
+ Attribute "NickName" "" "HP Photosmart 2570 Series, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 2570 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 2570 series;DES:photosmart 2570 series;"
+ PCFileName "hp-photosmart_2570_series.ppd"
+ Attribute "Product" "" "(HP Photosmart 2570 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart 2571 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart 2573 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart 2574 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart 2575 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart 2575xi All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart 2575v All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart 2575a All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart 2578 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Photosmart 2600 Series"
+ Attribute "NickName" "" "HP Photosmart 2600 Series, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 2600 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 2600 series;DES:photosmart 2600 series;"
+ PCFileName "hp-photosmart_2600_series.ppd"
+ Attribute "Product" "" "(HP Photosmart 2605 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart 2608 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart 2610v All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart 2610xi All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart 2610 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart 2613 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart 2615 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Photosmart 2700 Series"
+ Attribute "NickName" "" "HP Photosmart 2700 Series, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 2700 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 2700 series;DES:photosmart 2700 series;"
+ PCFileName "hp-photosmart_2700_series.ppd"
+ Attribute "Product" "" "(HP Photosmart 2710 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart 2710xi All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart 2713 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Photosmart c3100 Series"
+ Attribute "NickName" "" "HP Photosmart c3100 Series, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart c3100 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart c3100 series;DES:photosmart c3100 series;"
+ PCFileName "hp-photosmart_c3100_series.ppd"
+ Attribute "Product" "" "(HP Photosmart c3110 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c3125 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c3135 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c3140 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c3150 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c3170 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c3173 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c3175 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c3180 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c3183 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c3188 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c3190 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c3193 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c3194 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Photosmart 3100 Series"
+ Attribute "NickName" "" "HP Photosmart 3100 Series, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 3100 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 3100 series;DES:photosmart 3100 series;"
+ PCFileName "hp-photosmart_3100_series.ppd"
+ Attribute "Product" "" "(HP Photosmart 3108 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart 3110 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart 3110v All-in-one Printer)"
+ }
+ {
+ ModelName "HP Photosmart 3200 Series"
+ Attribute "NickName" "" "HP Photosmart 3200 Series, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 3200 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 3200 series;DES:photosmart 3200 series;"
+ PCFileName "hp-photosmart_3200_series.ppd"
+ Attribute "Product" "" "(HP Photosmart 3207 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart 3210 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart 3210xi All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart 3210v All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart 3210a All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart 3213 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart 3214 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Photosmart 3300 Series"
+ Attribute "NickName" "" "HP Photosmart 3300 Series, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 3300 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 3300 series;DES:photosmart 3300 series;"
+ PCFileName "hp-photosmart_3300_series.ppd"
+ Attribute "Product" "" "(HP Photosmart 3308 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart 3310 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart 3310xi All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart 3313 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart 3314 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Photosmart c4100 Series"
+ Attribute "NickName" "" "HP Photosmart c4100 Series, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart c4100 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart c4100 series;DES:photosmart c4100 series;"
+ PCFileName "hp-photosmart_c4100_series.ppd"
+ Attribute "Product" "" "(HP Photosmart c4110 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4140 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4150 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4170 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4173 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4175 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4180 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4183 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4188 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4190 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4193 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4194 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Deskjet f4200 Series"
+ Attribute "NickName" "" "HP Deskjet f4200 Series, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet f4200 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet f4200 series;DES:deskjet f4200 series;"
+ PCFileName "hp-deskjet_f4200_series.ppd"
+ Attribute "Product" "" "(HP Deskjet f4224 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f4230 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f4235 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f4238 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f4240 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f4250 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f4272 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f4273 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f4274 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f4275 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f4275 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f4280 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f4283 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f4288 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f4292 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f4293 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f4294 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Photosmart c4200 Series"
+ Attribute "NickName" "" "HP Photosmart c4200 Series, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart c4200 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart c4200 series;DES:photosmart c4200 series;"
+ PCFileName "hp-photosmart_c4200_series.ppd"
+ Attribute "Product" "" "(HP Photosmart c4205 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4210 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4235 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4240 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4250 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4270 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4272 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4273 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4275 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4280 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4283 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4285 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4288 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4293 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4294 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Deskjet f4210 Series"
+ Attribute "NickName" "" "HP Deskjet f4210 Series, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet f4210 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet f4210 series;DES:deskjet f4210 series;"
+ PCFileName "hp-deskjet_f4210_series.ppd"
+ Attribute "Product" "" "(HP Deskjet f4210 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f4280 All-in-one)"
+ }
+ {
+ ModelName "HP Deskjet f4213 Series"
+ Attribute "NickName" "" "HP Deskjet f4213 Series, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet f4213 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet f4213 series;DES:deskjet f4213 series;"
+ PCFileName "hp-deskjet_f4213_series.ppd"
+ Attribute "Product" "" "(HP Deskjet f4213 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f4280 All-in-one)"
+ }
+ {
+ ModelName "HP Photosmart c4340 Series"
+ Attribute "NickName" "" "HP Photosmart c4340 Series, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart c4340 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart c4340 series;DES:photosmart c4340 series;"
+ PCFileName "hp-photosmart_c4340_series.ppd"
+ Attribute "Product" "" "(HP Photosmart c4340 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4342 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4343 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4344 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4345 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4348 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Photosmart c4380 Series"
+ Attribute "NickName" "" "HP Photosmart c4380 Series, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart c4380 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart c4380 series;DES:photosmart c4380 series;"
+ PCFileName "hp-photosmart_c4380_series.ppd"
+ Attribute "Product" "" "(HP Photosmart c4380 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4383 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4384 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4385 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4388 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Photosmart c4400 Series"
+ Attribute "NickName" "" "HP Photosmart c4400 Series, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart c4400 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart c4400 series;DES:photosmart c4400 series;"
+ PCFileName "hp-photosmart_c4400_series.ppd"
+ Attribute "Product" "" "(HP Photosmart c4410 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4424 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4435 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4440 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4450 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4470 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4472 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4473 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4480 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4483 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4485 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4486 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4488 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4490 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4493 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4494 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet j4500 Series"
+ Attribute "NickName" "" "HP Officejet j4500 Series, $Version"
+ Attribute "ShortNickName" "" "HP Officejet j4500 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet j4500 series;DES:officejet j4500 series;"
+ PCFileName "hp-officejet_j4500_series.ppd"
+ Attribute "Product" "" "(HP Officejet j4524 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet j4525 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet j4535 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet j4540 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet j4550 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet j4560 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet j4580 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet j4580c All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet j4585 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Photosmart c4500 Series"
+ Attribute "NickName" "" "HP Photosmart c4500 Series, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart c4500 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart c4500 series;DES:photosmart c4500 series;"
+ PCFileName "hp-photosmart_c4500_series.ppd"
+ Attribute "Product" "" "(HP Photosmart c4540 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4550 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4570 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4572 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4573 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4575 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4580 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4583 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4585 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4588 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4593 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4599 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet j4660 Series"
+ Attribute "NickName" "" "HP Officejet j4660 Series, $Version"
+ Attribute "ShortNickName" "" "HP Officejet j4660 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet j4660 series;DES:officejet j4660 series;"
+ PCFileName "hp-officejet_j4660_series.ppd"
+ Attribute "Product" "" "(HP Deskjet f4280 All-in-one)"
+ Attribute "Product" "" "(HP Officejet j4660 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet j4680 Series"
+ Attribute "NickName" "" "HP Officejet j4680 Series, $Version"
+ Attribute "ShortNickName" "" "HP Officejet j4680 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet j4680 series;DES:officejet j4680 series;"
+ PCFileName "hp-officejet_j4680_series.ppd"
+ Attribute "Product" "" "(HP Deskjet f4280 All-in-one)"
+ Attribute "Product" "" "(HP Officejet j4680c All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet j4680 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Photosmart d5060 Series"
+ Attribute "NickName" "" "HP Photosmart d5060 Series, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart d5060 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart d5060 series;DES:photosmart d5060 series;"
+ PCFileName "hp-photosmart_d5060_series.ppd"
+ Attribute "Product" "" "(HP Photosmart d5060 Printer)"
+ Attribute "Product" "" "(HP Photosmart d5063 Printer)"
+ Attribute "Product" "" "(HP Photosmart d5065 Printer)"
+ Attribute "Product" "" "(HP Photosmart d5069 Printer)"
+ }
+ {
+ ModelName "HP Photosmart c5100 Series"
+ Attribute "NickName" "" "HP Photosmart c5100 Series, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart c5100 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart c5100 series;DES:photosmart c5100 series;"
+ PCFileName "hp-photosmart_c5100_series.ppd"
+ Attribute "Product" "" "(HP Photosmart c5140 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c5150 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c5170 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c5173 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c5175 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c5180 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c5183 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c5185 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c5188 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c5194 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Deskjet 5100"
+ Attribute "NickName" "" "HP Deskjet 5100, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 5100"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 5100;DES:deskjet 5100;"
+ PCFileName "hp-deskjet_5100.ppd"
+ Attribute "Product" "" "(HP Deskjet 5100 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 5145 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 5150v Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 5150w Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 5150 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 5151 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 5160 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 5168 Color Inkjet Printer)"
+ }
+ {
+ ModelName "HP Photosmart d5100 Series"
+ Attribute "NickName" "" "HP Photosmart d5100 Series, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart d5100 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart d5100 series;DES:photosmart d5100 series;"
+ PCFileName "hp-photosmart_d5100_series.ppd"
+ Attribute "Product" "" "(HP Photosmart d5145 Printer)"
+ Attribute "Product" "" "(HP Photosmart d5155 Printer)"
+ Attribute "Product" "" "(HP Photosmart d5156 Printer)"
+ Attribute "Product" "" "(HP Photosmart d5160 Printer)"
+ Attribute "Product" "" "(HP Photosmart d5163 Printer)"
+ Attribute "Product" "" "(HP Photosmart d5168 Printer)"
+ }
+ {
+ ModelName "HP Photosmart c5200 Series"
+ Attribute "NickName" "" "HP Photosmart c5200 Series, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart c5200 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart c5200 series;DES:photosmart c5200 series;"
+ PCFileName "hp-photosmart_c5200_series.ppd"
+ Attribute "Product" "" "(HP Photosmart c5240 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c5250 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c5270 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c5273 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c5275 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c5280 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c5283 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c5288 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c5290 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c5293 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Photosmart d5300 Series"
+ Attribute "NickName" "" "HP Photosmart d5300 Series, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart d5300 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart d5300 series;DES:photosmart d5300 series;"
+ PCFileName "hp-photosmart_d5300_series.ppd"
+ Attribute "Product" "" "(HP Photosmart d5345 Printer)"
+ Attribute "Product" "" "(HP Photosmart d5360 Printer)"
+ Attribute "Product" "" "(HP Photosmart d5363 Printer)"
+ Attribute "Product" "" "(HP Photosmart d5368 Printer)"
+ }
+ {
+ ModelName "HP Photosmart d5400 Series"
+ Attribute "NickName" "" "HP Photosmart d5400 Series, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart d5400 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart d5400 series;DES:photosmart d5400 series;"
+ PCFileName "hp-photosmart_d5400_series.ppd"
+ Attribute "Product" "" "(HP Photosmart d5460 Printer)"
+ Attribute "Product" "" "(HP Photosmart d5463 Printer)"
+ Attribute "Product" "" "(HP Photosmart d5468 Printer)"
+ }
+ {
+ ModelName "HP Deskjet 5400 Series"
+ Attribute "NickName" "" "HP Deskjet 5400 Series, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 5400 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 5400 series;DES:deskjet 5400 series;"
+ PCFileName "hp-deskjet_5400_series.ppd"
+ Attribute "Product" "" "(HP Deskjet 5420v Photo Printer)"
+ Attribute "Product" "" "(HP Deskjet 5432 Photo Printer)"
+ Attribute "Product" "" "(HP Deskjet 5438 Photo Printer)"
+ Attribute "Product" "" "(HP Deskjet 5440v Photo Printer)"
+ Attribute "Product" "" "(HP Deskjet 5440 Photo Printer)"
+ Attribute "Product" "" "(HP Deskjet 5440xi Photo Printer)"
+ Attribute "Product" "" "(HP Deskjet 5442 Photo Printer)"
+ Attribute "Product" "" "(HP Deskjet 5443 Photo Printer)"
+ }
+ {
+ ModelName "HP Photosmart c5500 Series"
+ Attribute "NickName" "" "HP Photosmart c5500 Series, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart c5500 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart c5500 series;DES:photosmart c5500 series;"
+ PCFileName "hp-photosmart_c5500_series.ppd"
+ Attribute "Product" "" "(HP Photosmart c5540 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c5550 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c5570 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c5580 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Deskjet 5552"
+ Attribute "NickName" "" "HP Deskjet 5552, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 5552"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 5552;DES:deskjet 5552;"
+ PCFileName "hp-deskjet_5552.ppd"
+ Attribute "Product" "" "(HP Deskjet 5552 Color Inkjet Printer)"
+ }
+ {
+ ModelName "HP Deskjet 5600"
+ Attribute "NickName" "" "HP Deskjet 5600, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 5600"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 5600;DES:deskjet 5600;"
+ PCFileName "hp-deskjet_5600.ppd"
+ Attribute "Product" "" "(HP Deskjet 5600 Color Inkjet Printer)"
+ }
+ {
+ ModelName "HP Deskjet 5650"
+ Attribute "NickName" "" "HP Deskjet 5650, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 5650"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 5650;DES:deskjet 5650;"
+ PCFileName "hp-deskjet_5650.ppd"
+ Attribute "Product" "" "(HP Deskjet 5650 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 5650w Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 5650v Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 5655 Color Inkjet Printer)"
+ }
+ {
+ ModelName "HP Deskjet 5652"
+ Attribute "NickName" "" "HP Deskjet 5652, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 5652"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 5652;DES:deskjet 5652;"
+ PCFileName "hp-deskjet_5652.ppd"
+ Attribute "Product" "" "(HP Deskjet 5652 Color Inkjet Printer)"
+ }
+ {
+ ModelName "HP Deskjet 5700"
+ Attribute "NickName" "" "HP Deskjet 5700, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 5700"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 5700;DES:deskjet 5700;"
+ PCFileName "hp-deskjet_5700.ppd"
+ Attribute "Product" "" "(HP Deskjet 5700 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 5740 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 5740xi Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 5743 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 5745 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 5748 Color Inkjet Printer)"
+ }
+ {
+ ModelName "HP Officejet j5700 Series"
+ Attribute "NickName" "" "HP Officejet j5700 Series, $Version"
+ Attribute "ShortNickName" "" "HP Officejet j5700 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet j5700 series;DES:officejet j5700 series;"
+ PCFileName "hp-officejet_j5700_series.ppd"
+ Attribute "Product" "" "(HP Officejet j5725 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet j5725 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet j5730 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet j5735 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet j5738 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet j5740 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet j5750 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet j5780 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet j5783 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet j5785 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet j5788 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet j5790 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Deskjet 5800"
+ Attribute "NickName" "" "HP Deskjet 5800, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 5800"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 5800;DES:deskjet 5800;"
+ PCFileName "hp-deskjet_5800.ppd"
+ Attribute "Product" "" "(HP Deskjet 5800 Color Inkjet Printer)"
+ }
+ {
+ ModelName "HP Deskjet 5850"
+ Attribute "NickName" "" "HP Deskjet 5850, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 5850"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 5850;DES:deskjet 5850;"
+ PCFileName "hp-deskjet_5850.ppd"
+ Attribute "Product" "" "(HP Deskjet 5850 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 5850w Color Inkjet Printer)"
+ }
+ {
+ ModelName "HP Deskjet 5900 Series"
+ Attribute "NickName" "" "HP Deskjet 5900 Series, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 5900 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 5900 series;DES:deskjet 5900 series;"
+ PCFileName "hp-deskjet_5900_series.ppd"
+ Attribute "Product" "" "(HP Deskjet 5938 Photo Printer)"
+ Attribute "Product" "" "(HP Deskjet 5940 Photo Printer)"
+ Attribute "Product" "" "(HP Deskjet 5940xi Photo Printer)"
+ Attribute "Product" "" "(HP Deskjet 5943 Photo Printer)"
+ }
+ {
+ ModelName "HP Photosmart c6100 Series"
+ Attribute "NickName" "" "HP Photosmart c6100 Series, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart c6100 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart c6100 series;DES:photosmart c6100 series;"
+ PCFileName "hp-photosmart_c6100_series.ppd"
+ Attribute "Product" "" "(HP Photosmart c6150 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c6154 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c6170 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c6175 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c6180 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c6183 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c6185 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c6188 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c6190 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Photosmart d6100 Series"
+ Attribute "NickName" "" "HP Photosmart d6100 Series, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart d6100 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart d6100 series;DES:photosmart d6100 series;"
+ PCFileName "hp-photosmart_d6100_series.ppd"
+ Attribute "Product" "" "(HP Photosmart d6160 Printer)"
+ Attribute "Product" "" "(HP Photosmart d6163 Printer)"
+ Attribute "Product" "" "(HP Photosmart d6168 Printer)"
+ }
+ {
+ ModelName "HP Officejet 6100 Series"
+ Attribute "NickName" "" "HP Officejet 6100 Series, $Version"
+ Attribute "ShortNickName" "" "HP Officejet 6100 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet 6100 series;DES:officejet 6100 series;"
+ PCFileName "hp-officejet_6100_series.ppd"
+ Attribute "Product" "" "(HP Officejet 6105 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 6110xi All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 6110v All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 6110 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet 6150 Series"
+ Attribute "NickName" "" "HP Officejet 6150 Series, $Version"
+ Attribute "ShortNickName" "" "HP Officejet 6150 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet 6150 series;DES:officejet 6150 series;"
+ PCFileName "hp-officejet_6150_series.ppd"
+ Attribute "Product" "" "(HP Officejet 6150 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet 6200 Series"
+ Attribute "NickName" "" "HP Officejet 6200 Series, $Version"
+ Attribute "ShortNickName" "" "HP Officejet 6200 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet 6200 series;DES:officejet 6200 series;"
+ PCFileName "hp-officejet_6200_series.ppd"
+ Attribute "Product" "" "(HP Officejet 6200 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 6203 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 6205 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 6208 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 6210xi All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 6210v All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 6210 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 6213 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 6215 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Photosmart c6200 Series"
+ Attribute "NickName" "" "HP Photosmart c6200 Series, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart c6200 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart c6200 series;DES:photosmart c6200 series;"
+ PCFileName "hp-photosmart_c6200_series.ppd"
+ Attribute "Product" "" "(HP Photosmart c6240 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c6245 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c6250 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c6260 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c6263 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c6268 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c6270 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c6275 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c6280 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c6283 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c6285 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c6286 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c6288 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet 6300 Series"
+ Attribute "NickName" "" "HP Officejet 6300 Series, $Version"
+ Attribute "ShortNickName" "" "HP Officejet 6300 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet 6300 series;DES:officejet 6300 series;"
+ PCFileName "hp-officejet_6300_series.ppd"
+ Attribute "Product" "" "(HP Officejet 6301 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 6304 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 6305 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 6307 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 6308 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 6310 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 6310xi All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 6310v All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 6313 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 6315 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 6318 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet j6400 Series"
+ Attribute "NickName" "" "HP Officejet j6400 Series, $Version"
+ Attribute "ShortNickName" "" "HP Officejet j6400 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet j6400 series;DES:officejet j6400 series;"
+ PCFileName "hp-officejet_j6400_series.ppd"
+ Attribute "Product" "" "(HP Officejet j6405 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet j6410 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet j6413 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet j6415 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet j6424 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet j6450 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet j6480 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet j6488 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Deskjet 6500"
+ Attribute "NickName" "" "HP Deskjet 6500, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 6500"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 6500;DES:deskjet 6500;"
+ PCFileName "hp-deskjet_6500.ppd"
+ Attribute "Product" "" "(HP Deskjet 6500 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 6520 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 6520xi Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 6540d Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 6540 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 6540xi Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 6540dt Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 6543 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 6543d Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 6548 Color Inkjet Printer)"
+ }
+ {
+ ModelName "HP Deskjet 6600"
+ Attribute "NickName" "" "HP Deskjet 6600, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 6600"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 6600;DES:deskjet 6600;"
+ PCFileName "hp-deskjet_6600.ppd"
+ Attribute "Product" "" "(HP Deskjet 6600 Series Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 6620 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 6620xi Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 6623 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 6628 Color Inkjet Printer)"
+ }
+ {
+ ModelName "HP Deskjet 6800"
+ Attribute "NickName" "" "HP Deskjet 6800, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 6800"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 6800;DES:deskjet 6800;"
+ PCFileName "hp-deskjet_6800.ppd"
+ Attribute "Product" "" "(HP Deskjet 6800 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 6830v Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 6840xi Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 6840dt Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 6840 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 6843 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 6848 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 6850 Color Inkjet Printer)"
+ }
+ {
+ ModelName "HP Deskjet 6940 Series"
+ Attribute "NickName" "" "HP Deskjet 6940 Series, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 6940 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 6940 series;DES:deskjet 6940 series;"
+ PCFileName "hp-deskjet_6940_series.ppd"
+ Attribute "Product" "" "(HP Deskjet 6940 Printer)"
+ Attribute "Product" "" "(HP Deskjet 6940dt Printer)"
+ Attribute "Product" "" "(HP Deskjet 6943 Printer)"
+ }
+ {
+ ModelName "HP Deskjet 6980 Series"
+ Attribute "NickName" "" "HP Deskjet 6980 Series, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 6980 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 6980 series;DES:deskjet 6980 series;"
+ PCFileName "hp-deskjet_6980_series.ppd"
+ Attribute "Product" "" "(HP Deskjet 6980xi Printer)"
+ Attribute "Product" "" "(HP Deskjet 6980 Printer)"
+ Attribute "Product" "" "(HP Deskjet 6980dt Printer)"
+ Attribute "Product" "" "(HP Deskjet 6983 Printer)"
+ Attribute "Product" "" "(HP Deskjet 6988dt Printer)"
+ Attribute "Product" "" "(HP Deskjet 6988xi Printer)"
+ Attribute "Product" "" "(HP Deskjet 6988 Printer)"
+ }
+ {
+ ModelName "HP Photosmart c7100 Series"
+ Attribute "NickName" "" "HP Photosmart c7100 Series, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart c7100 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart c7100 series;DES:photosmart c7100 series;"
+ PCFileName "hp-photosmart_c7100_series.ppd"
+ Attribute "Product" "" "(HP Photosmart c7150 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c7154 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c7170 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c7180 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c7183 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c7185 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c7188 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c7190 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Photosmart d7100 Series"
+ Attribute "NickName" "" "HP Photosmart d7100 Series, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart d7100 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart d7100 series;DES:photosmart d7100 series;"
+ PCFileName "hp-photosmart_d7100_series.ppd"
+ Attribute "Product" "" "(HP Photosmart d7145 Printer)"
+ Attribute "Product" "" "(HP Photosmart d7155 Printer)"
+ Attribute "Product" "" "(HP Photosmart d7160 Printer)"
+ Attribute "Product" "" "(HP Photosmart d7163 Printer)"
+ Attribute "Product" "" "(HP Photosmart d7168 Printer)"
+ }
+ {
+ ModelName "HP Photosmart 7150"
+ Attribute "NickName" "" "HP Photosmart 7150, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 7150"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 7150;DES:photosmart 7150;"
+ PCFileName "hp-photosmart_7150.ppd"
+ Attribute "Product" "" "(HP Photosmart 7150 Printer)"
+ Attribute "Product" "" "(HP Photosmart 7150v Printer)"
+ Attribute "Product" "" "(HP Photosmart 7150w Printer)"
+ }
+ {
+ ModelName "HP Photosmart 7150"
+ Attribute "NickName" "" "HP Photosmart 7150, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 7150"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 7150~;DES:photosmart 7150~;"
+ PCFileName "hp-photosmart_7150.ppd"
+ Attribute "Product" "" "(HP Photosmart 7150 Series Printer)"
+ }
+ {
+ ModelName "HP Photosmart d7200 Series"
+ Attribute "NickName" "" "HP Photosmart d7200 Series, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart d7200 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart d7200 series;DES:photosmart d7200 series;"
+ PCFileName "hp-photosmart_d7200_series.ppd"
+ Attribute "Product" "" "(HP Photosmart d7245 Printer)"
+ Attribute "Product" "" "(HP Photosmart d7255 Printer)"
+ Attribute "Product" "" "(HP Photosmart d7260 Printer)"
+ Attribute "Product" "" "(HP Photosmart d7263 Printer)"
+ Attribute "Product" "" "(HP Photosmart d7268 Printer)"
+ }
+ {
+ ModelName "HP Photosmart 7200 Series"
+ Attribute "NickName" "" "HP Photosmart 7200 Series, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 7200 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 7200 series~;DES:photosmart 7200 series~;"
+ PCFileName "hp-photosmart_7200_series.ppd"
+ Attribute "Product" "" "(HP Photosmart 7260w Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 7260 Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 7260v Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 7268 Photo Printer)"
+ }
+ {
+ ModelName "HP Officejet 7200 Series"
+ Attribute "NickName" "" "HP Officejet 7200 Series, $Version"
+ Attribute "ShortNickName" "" "HP Officejet 7200 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet 7200 series;DES:officejet 7200 series;"
+ PCFileName "hp-officejet_7200_series.ppd"
+ Attribute "Product" "" "(HP Officejet 7205 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 7208 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 7210v All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 7210xi All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 7210 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 7213 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 7215 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Photosmart c7200 Series"
+ Attribute "NickName" "" "HP Photosmart c7200 Series, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart c7200 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart c7200 series;DES:photosmart c7200 series;"
+ PCFileName "hp-photosmart_c7200_series.ppd"
+ Attribute "Product" "" "(HP Photosmart c7250 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c7275 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c7280 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c7283 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c7288 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Photosmart 7200 Series"
+ Attribute "NickName" "" "HP Photosmart 7200 Series, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 7200 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 7200 series;DES:photosmart 7200 series;"
+ PCFileName "hp-photosmart_7200_series.ppd"
+ Attribute "Product" "" "(HP Photosmart 7260 Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 7260v Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 7260w Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 7268 Photo Printer)"
+ }
+ {
+ ModelName "HP Officejet 7300 Series"
+ Attribute "NickName" "" "HP Officejet 7300 Series, $Version"
+ Attribute "ShortNickName" "" "HP Officejet 7300 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet 7300 series;DES:officejet 7300 series;"
+ PCFileName "hp-officejet_7300_series.ppd"
+ Attribute "Product" "" "(HP Officejet 7310 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 7310xi All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 7313 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Photosmart d7300 Series"
+ Attribute "NickName" "" "HP Photosmart d7300 Series, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart d7300 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart d7300 series;DES:photosmart d7300 series;"
+ PCFileName "hp-photosmart_d7300_series.ppd"
+ Attribute "Product" "" "(HP Photosmart d7345 Printer)"
+ Attribute "Product" "" "(HP Photosmart d7355 Printer)"
+ Attribute "Product" "" "(HP Photosmart d7360 Printer)"
+ Attribute "Product" "" "(HP Photosmart d7363 Printer)"
+ Attribute "Product" "" "(HP Photosmart d7368 Printer)"
+ }
+ {
+ ModelName "HP Photosmart 7345"
+ Attribute "NickName" "" "HP Photosmart 7345, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 7345"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 7345;DES:photosmart 7345;"
+ PCFileName "hp-photosmart_7345.ppd"
+ Attribute "Product" "" "(HP Photosmart 7345 Printer)"
+ }
+ {
+ ModelName "HP Photosmart 7350"
+ Attribute "NickName" "" "HP Photosmart 7350, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 7350"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 7350;DES:photosmart 7350;"
+ PCFileName "hp-photosmart_7350.ppd"
+ Attribute "Product" "" "(HP Photosmart 7350 Printer)"
+ Attribute "Product" "" "(HP Photosmart 7350v Printer)"
+ Attribute "Product" "" "(HP Photosmart 7350w Printer)"
+ }
+ {
+ ModelName "HP Photosmart 7350"
+ Attribute "NickName" "" "HP Photosmart 7350, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 7350"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 7350~;DES:photosmart 7350~;"
+ PCFileName "hp-photosmart_7350.ppd"
+ Attribute "Product" "" "(HP Photosmart 7350 Series Printer)"
+ }
+ {
+ ModelName "HP Officejet 7400 Series"
+ Attribute "NickName" "" "HP Officejet 7400 Series, $Version"
+ Attribute "ShortNickName" "" "HP Officejet 7400 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet 7400 series;DES:officejet 7400 series;"
+ PCFileName "hp-officejet_7400_series.ppd"
+ Attribute "Product" "" "(HP Officejet 7408 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 7410 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 7410xi All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 7413 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Photosmart 7400 Series"
+ Attribute "NickName" "" "HP Photosmart 7400 Series, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 7400 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 7400 series;DES:photosmart 7400 series;"
+ PCFileName "hp-photosmart_7400_series.ppd"
+ Attribute "Product" "" "(HP Photosmart 7450 Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 7450v Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 7450xi Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 7458 Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 7459 Photo Printer)"
+ }
+ {
+ ModelName "HP Photosmart d7400 Series"
+ Attribute "NickName" "" "HP Photosmart d7400 Series, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart d7400 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart d7400 series;DES:photosmart d7400 series;"
+ PCFileName "hp-photosmart_d7400_series.ppd"
+ Attribute "Product" "" "(HP Photosmart d7460 Printer)"
+ Attribute "Product" "" "(HP Photosmart d7463 Printer)"
+ Attribute "Product" "" "(HP Photosmart d7468 Printer)"
+ }
+ {
+ ModelName "HP Photosmart 7550"
+ Attribute "NickName" "" "HP Photosmart 7550, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 7550"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 7550;DES:photosmart 7550;"
+ PCFileName "hp-photosmart_7550.ppd"
+ Attribute "Product" "" "(HP Photosmart 7550 Printer)"
+ Attribute "Product" "" "(HP Photosmart 7550v Printer)"
+ Attribute "Product" "" "(HP Photosmart 7550w Printer)"
+ }
+ {
+ ModelName "HP Photosmart 7600 Series"
+ Attribute "NickName" "" "HP Photosmart 7600 Series, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 7600 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 7600 series;DES:photosmart 7600 series;"
+ PCFileName "hp-photosmart_7600_series.ppd"
+ Attribute "Product" "" "(HP Photosmart 7655 Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 7660 Photo Printer)"
+ }
+ {
+ ModelName "HP Photosmart 7700 Series"
+ Attribute "NickName" "" "HP Photosmart 7700 Series, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 7700 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 7700 series;DES:photosmart 7700 series;"
+ PCFileName "hp-photosmart_7700_series.ppd"
+ Attribute "Product" "" "(HP Photosmart 7755 Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 7760od Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 7760 Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 7760v Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 7760w Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 7762w Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 7762w Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 7762 Photo Printer)"
+ }
+ {
+ ModelName "HP Photosmart 7800 Series"
+ Attribute "NickName" "" "HP Photosmart 7800 Series, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 7800 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 7800 series;DES:photosmart 7800 series;"
+ PCFileName "hp-photosmart_7800_series.ppd"
+ Attribute "Product" "" "(HP Photosmart 7830 Printer)"
+ Attribute "Product" "" "(HP Photosmart 7838 Printer)"
+ Attribute "Product" "" "(HP Photosmart 7850 Printer)"
+ Attribute "Product" "" "(HP Photosmart 7850v Printer)"
+ Attribute "Product" "" "(HP Photosmart 7850vxi Printer)"
+ Attribute "Product" "" "(HP Photosmart 7853 Printer)"
+ }
+ {
+ ModelName "HP Photosmart 7900 Series"
+ Attribute "NickName" "" "HP Photosmart 7900 Series, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 7900 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 7900 series;DES:photosmart 7900 series;"
+ PCFileName "hp-photosmart_7900_series.ppd"
+ Attribute "Product" "" "(HP Photosmart 7960 Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 7960v Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 7960w Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 7960gp Photo Printer)"
+ }
+ {
+ ModelName "HP Photosmart 8000 Series"
+ Attribute "NickName" "" "HP Photosmart 8000 Series, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 8000 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 8000 series;DES:photosmart 8000 series;"
+ PCFileName "hp-photosmart_8000_series.ppd"
+ Attribute "Product" "" "(HP Photosmart 8030 Printer)"
+ Attribute "Product" "" "(HP Photosmart 8038 Printer)"
+ Attribute "Product" "" "(HP Photosmart 8049 Printer)"
+ Attribute "Product" "" "(HP Photosmart 8050xi Printer)"
+ Attribute "Product" "" "(HP Photosmart 8050 Printer)"
+ Attribute "Product" "" "(HP Photosmart 8050v Printer)"
+ Attribute "Product" "" "(HP Photosmart 8053 Printer)"
+ }
+ {
+ ModelName "HP Photosmart 8100 Series"
+ Attribute "NickName" "" "HP Photosmart 8100 Series, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 8100 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 8100 series;DES:photosmart 8100 series;"
+ PCFileName "hp-photosmart_8100_series.ppd"
+ Attribute "Product" "" "(HP Photosmart 8150 Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 8150v Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 8150xi Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 8153 Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 8158 Photo Printer)"
+ }
+ {
+ ModelName "HP Photosmart 8200 Series"
+ Attribute "NickName" "" "HP Photosmart 8200 Series, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 8200 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 8200 series;DES:photosmart 8200 series;"
+ PCFileName "hp-photosmart_8200_series.ppd"
+ Attribute "Product" "" "(HP Photosmart 8230 Printer)"
+ Attribute "Product" "" "(HP Photosmart 8238 Printer)"
+ Attribute "Product" "" "(HP Photosmart 8250 Printer)"
+ Attribute "Product" "" "(HP Photosmart 8250xi Printer)"
+ Attribute "Product" "" "(HP Photosmart 8250v Printer)"
+ Attribute "Product" "" "(HP Photosmart 8253 Printer)"
+ }
+ {
+ ModelName "HP Photosmart 8400 Series"
+ Attribute "NickName" "" "HP Photosmart 8400 Series, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 8400 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 8400 series;DES:photosmart 8400 series;"
+ PCFileName "hp-photosmart_8400_series.ppd"
+ Attribute "Product" "" "(HP Photosmart 8450gp Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 8450v Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 8450 Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 8450xi Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 8453 Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 8458 Photo Printer)"
+ }
+ } // End Supported media sizes with full bleed.
+
+ {
+ // Large format
+ UIConstraints "*PageSize A3 *Duplex"
+ UIConstraints "*PageSize B4 *Duplex"
+ UIConstraints "*PageSize Ledger *Duplex"
+ UIConstraints "*PageSize SuperB *Duplex"
+ UIConstraints "*PageSize 8k *Duplex"
+
+// Large
+ CustomMedia "SuperB/SuperB 13x19in" 936 1368 18 36 18 9 "<</cupsInteger0 16/PageSize[936 1368]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 16/PageSize[936 1368]/ImagingBBox null>>setpagedevice"
+ CustomMedia "B4/B4 257x364mm" 729 1033 18 36 18 9 "<</cupsInteger0 46/PageSize[729 1033]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 46/PageSize[729 1033]/ImagingBBox null>>setpagedevice"
+ CustomMedia "B4.Duplex/B4 AutoDuplex 257x364mm" 729 1024 18 27 18 36 "<</cupsInteger0 1/PageSize[729 1024]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[729 1024]/ImagingBBox null>>setpagedevice"
+ CustomMedia "8k/8k 10.75x15.5in" 774 1116 18 36 18 9 "<</cupsInteger0 101/PageSize[774 1116]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[774 1116]/ImagingBBox null>>setpagedevice" // custom
+ CustomMedia "Ledger/Ledger 11x17in" 792 1224 18 36 18 9 "<</cupsInteger0 6/PageSize[792 1224]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 6/PageSize[792 1224]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A3/A3 297x420mm" 842 1190 18 36 18 9 "<</cupsInteger0 27/PageSize[842 1190]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 27/PageSize[842 1190]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A3.Duplex/A3 AutoDuplex 297x420mm" 842 1181 18 27 18 36 "<</cupsInteger0 1/PageSize[842 1181]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[842 1181]/ImagingBBox null>>setpagedevice"
+
+ // Custom page sizes from 1x4in to SuperB
+ HWMargins 18 36 18 36
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 936 1368
+
+ // <%DJGenericVIP:LargeFormatSuperB%>
+ {
+ ModelName "HP Officejet k7100"
+ Attribute "NickName" "" "HP Officejet k7100, $Version"
+ Attribute "ShortNickName" "" "HP Officejet k7100"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet k7100;DES:officejet k7100;"
+ PCFileName "hp-officejet_k7100.ppd"
+ Attribute "Product" "" "(HP Officejet k7100 Printer)"
+ Attribute "Product" "" "(HP Officejet k7103 Printer)"
+ Attribute "Product" "" "(HP Officejet k7108 Printer)"
+ }
+ {
+ ModelName "HP Deskjet 9600"
+ Attribute "NickName" "" "HP Deskjet 9600, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 9600"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 9600;DES:deskjet 9600;"
+ PCFileName "hp-deskjet_9600.ppd"
+ Attribute "Product" "" "(HP Deskjet 9650 Printer)"
+ Attribute "Product" "" "(HP Deskjet 9670 Printer)"
+ Attribute "Product" "" "(HP Deskjet 9680 Printer)"
+ Attribute "Product" "" "(HP Deskjet 9680gp Printer)"
+ }
+ {
+ ModelName "HP Deskjet 9800"
+ Attribute "NickName" "" "HP Deskjet 9800, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 9800"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 9800;DES:deskjet 9800;"
+ PCFileName "hp-deskjet_9800.ppd"
+ Attribute "Product" "" "(HP Deskjet 9800 Printer)"
+ Attribute "Product" "" "(HP Deskjet 9800d Printer)"
+ Attribute "Product" "" "(HP Deskjet 9803 Printer)"
+ Attribute "Product" "" "(HP Deskjet 9803d Printer)"
+ Attribute "Product" "" "(HP Deskjet 9808 Printer)"
+ Attribute "Product" "" "(HP Deskjet 9808d Printer)"
+ Attribute "Product" "" "(HP Deskjet 9860 Printer)"
+ Attribute "Product" "" "(HP Deskjet 9868 Printer)"
+ }
+
+ } // End Large format media sizes with full bleed.
+
+} // End DJGenericVIP
+
+//////// DJGenericVIP with NoAutoTray
+{
+ Attribute "cupsEvenDuplex" "" "True"
+ Attribute "cupsBackSide" "" "Rotated"
+ Attribute "cupsFlipDuplex" "" "True"
+ Attribute "hpPrinterLanguage" "" "pcl3gui2"
+ Attribute "HPMechOffset" "" "70"
+
+ Group "General/General"
+
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 10.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "<</Duplex true/Tumble false>>setpagedevice"
+ Choice "DuplexTumble/Short Edge (Flip)" "<</Duplex true/Tumble true>>setpagedevice"
+ *Choice "None/Off" "<</Duplex false/Tumble false>>setpagedevice"
+
+ // MediaPosition values map to MediaSource enumeration in global_types.h
+ Option "InputSlot/Media Source" PickOne AnySetup 10.0
+ Choice "PhotoTray/Photo Tray" "<</MediaPosition 6>>setpagedevice"
+ *Choice "Upper/Upper Tray" "<</MediaPosition 1>>setpagedevice"
+ Choice "Lower/Lower Tray" "<</MediaPosition 4>>setpagedevice"
+ Choice "Envelope/Envelope Feeder" "<</MediaPosition 3>>setpagedevice"
+ Choice "LargeCapacity/Large Capacity Tray" "<</MediaPosition 5>>setpagedevice"
+ Choice "Manual/Manual Feeder" "<</MediaPosition 2>>setpagedevice"
+ Choice "MPTray/Multi Purpose Tray" "<</MediaPosition 1>>setpagedevice"
+ Choice "CDDVDTray/CD or DVD Tray" "<</MediaPosition 14>>setpagedevice"
+
+ Option "ColorModel/Output Mode" PickOne AnySetup 10.0
+ Choice "CMYGray/High Quality Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 1>>setpagedevice"
+ Choice "KGray/Black Only Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 2>>setpagedevice"
+ *Choice "RGB/Color" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 0>>setpagedevice"
+
+ // cupsMediaType values map to MEDIATYPE from global_types.h
+ Option "MediaType/Media Type" PickOne AnySetup 10.0
+ *Choice "Plain/Plain Paper" "<</MediaType(Plain)/cupsMediaType 0>>setpagedevice"
+ Choice "Glossy/Photo Paper" "<</MediaType(Glossy)/cupsMediaType 3>>setpagedevice"
+ Choice "TransparencyFilm/Transparency Film" "<</MediaType(TransparencyFilm)/cupsMediaType 4>>setpagedevice"
+ Choice "CDDVDMedia/CD or DVD Media" "<</MediaType(CDDVDMedia)/cupsMediaType 7>>setpagedevice"
+
+ // cupsCompression values map to QUALITY_MODE from global_types.h
+ Option "OutputMode/Print Quality" PickOne AnySetup 10.0
+ *Choice "Normal/Normal" "<</OutputType(0)/HWResolution[600 600]>>setpagedevice"
+ Choice "Draft/Draft" "<</OutputType(-1)/HWResolution[300 300]>>setpagedevice"
+ Choice "Best/Best" "<</OutputType(1)/HWResolution[600 600]>>setpagedevice"
+ Choice "Photo/High-Resolution Photo" "<</OutputType(2)/HWResolution[1200 1200]>>setpagedevice"
+ Choice "FastDraft/Fast Draft" "<</OutputType(-2)/HWResolution[300 300]>>setpagedevice"
+
+ // Duplexer is optional...
+ Installable "OptionDuplex/Duplexer Installed"
+
+ // Constraints
+ UIConstraints "*Duplex *OptionDuplex False"
+ UIConstraints "*ColorModel KGray *OutputMode Photo"
+ UIConstraints "*ColorModel CMYGray *OutputMode Photo"
+ UIConstraints "*MediaType Glossy *OutputMode FastDraft"
+ UIConstraints "*MediaType Glossy *OutputMode Draft"
+ UIConstraints "*MediaType TransparencyFilm *OutputMode FastDraft"
+ UIConstraints "*MediaType Plain *OutputMode Photo"
+ UIConstraints "*InputSlot CDDVDTray *MediaType Plain"
+ UIConstraints "*InputSlot CDDVDTray *MediaType Glossy"
+ UIConstraints "*InputSlot CDDVDTray *MediaType TransparencyFilm"
+ UIConstraints "*PageSize Letter *Duplex"
+ UIConstraints "*PageSize A4 *Duplex"
+ UIConstraints "*PageSize Legal *Duplex"
+ UIConstraints "*PageSize Photo4x6 *Duplex"
+ UIConstraints "*PageSize Photo5x7 *Duplex"
+ UIConstraints "*PageSize A5 *Duplex"
+ UIConstraints "*PageSize A6 *Duplex"
+ UIConstraints "*PageSize B5 *Duplex"
+ UIConstraints "*PageSize Oufuku *Duplex"
+ UIConstraints "*PageSize Hagaki *Duplex"
+ UIConstraints "*PageSize Executive *Duplex"
+ UIConstraints "*PageSize FLSA *Duplex"
+ UIConstraints "*PageSize ExecutiveJIS *Duplex"
+ UIConstraints "*PageSize 16k *Duplex"
+ UIConstraints "*PageSize Card3x5 *Duplex"
+ UIConstraints "*PageSize Card5x8 *Duplex"
+ UIConstraints "*PageSize Env10 *Duplex"
+ UIConstraints "*PageSize EnvA2 *Duplex"
+ UIConstraints "*PageSize EnvC6 *Duplex"
+ UIConstraints "*PageSize EnvDL *Duplex"
+ UIConstraints "*PageSize EnvC5 *Duplex"
+ UIConstraints "*PageSize EnvB5 *Duplex"
+ UIConstraints "*PageSize EnvChou3 *Duplex"
+ UIConstraints "*PageSize EnvChou4 *Duplex"
+ UIConstraints "*PageSize EnvMonarch *Duplex"
+
+ Attribute "cupsModelName" "" "deskjet 5600" // APDK device class
+
+// 4x6 or smaller
+ CustomMedia "Card3x5/Index Card 3x5in" 216 360 9 9 9 9 "<</cupsInteger0 78/PageSize [216 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 78/PageSize[216 360]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card3x5.FB/Index Card Borderless 3x5in" 226 370 0 0 0 0 "<</cupsInteger0 78/PageSize [226 370]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 78/PageSize[226 370]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki/Hagaki 100x148mm" 284 420 9 9 9 9 "<</cupsInteger0 71/PageSize[284 420]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/PageSize[284 420]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki.Duplex/Hagaki AutoDuplex 100x148mm" 284 411 9 27 9 36 "<</cupsInteger0 71/PageSize[284 411]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/PageSize[284 411]/ImagingBBox null>>setpagedevice"
+ CustomMedia "HagakiFB/Hagaki Borderless 100x148mm" 294 430 0 0 0 0 "<</cupsInteger0 71/PageSize[294 430]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/PageSize[294 430]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6/Photo 4x6in" 288 432 9 9 9 9 "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6.FB/Photo Borderless 4x6 in" 298 442 0 0 0 0 "<</cupsInteger0 74/PageSize[298 442]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[298 442]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6/A6 105x148mm" 297.36 419.76 9 9 9 9 "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6.Duplex/A6 AutoDuplex 105x148mm)" 297 411 9 27 9 36 "<</cupsInteger0 73/PageSize[297 411]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 73/PageSize[297 411]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6.FB/A6 Borderless 105x148mm" 307 430 0 0 0 0 "<</cupsInteger0 73/PageSize[307 430]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 73/PageSize[307 430]/ImagingBBox null>>setpagedevice"
+
+// 5x7
+ CustomMedia "Photo5x7/Photo 5x7in" 360 504 9 9 9 9 "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo5x7.FB/Photo Borderless 5x7in" 370 514 0 0 0 0 "<</cupsInteger0 122/PageSize[370 514]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/PageSize[370 514]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card5x8/Index Card 5x8in" 360 576 9 9 9 9 "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card5x8.Duplex/Index Card AutoDuplex 5x8in" 360 567 9 27 9 36 "<</cupsInteger0 75/PageSize[360 567]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 75/PageSize[360 567]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Oufuku/Oufuku-Hagaki 148x200mm" 567 420 9 9 9 9 "<</cupsInteger0 72/PageSize[567 420]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 72/PageSize[567 420]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Oufuku.Duplex/Oufuku-Hagaki AutoDuplex 148x200mm" 567 411 9 27 9 36 "<</cupsInteger0 72/PageSize[567 411]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 72/PageSize[567 411]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Oufuku.FB/Oufuku-Hagaki Borderless 148x200mm" 577 430 0 0 0 0 "<</cupsInteger0 72/PageSize[577 430]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 72/PageSize[577 430]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5/A5 148x210mm" 419.76 595.44 9 9 9 9 "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5.Duplex/A5 AutoDuplex 148x210mm" 420 586 9 27 9 36 "<</cupsInteger0 25/PageSize[420 586]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/PageSize[420 586]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5.FB/A5 Borderless 148x210mm" 430 605 0 0 0 0 "<</cupsInteger0 25/PageSize[430 605]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/PageSize[430 605]/ImagingBBox null>>setpagedevice"
+
+// Standard
+ CustomMedia "B5/B5 176x250mm" 498.96 708.48 9 9 9 9 "<</cupsInteger0 65/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 65/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ CustomMedia "B5.Duplex/B5 AutoDuplex 176x250mm" 499 699 9 27 9 36 "<</cupsInteger0 65/PageSize[499 699]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 65/PageSize[499 699]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5/JB5 182x257mm" 516.24 728.64 9 9 9 9 "<</cupsInteger0 45/PageSize[516.24 728.64]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 45/PageSize [516.24 728.64]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5.Duplex/JB5 AutoDuplex 182x257mm" 516 720 9 27 9 36 "<</cupsInteger0 45/PageSize[516 720]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 45/PageSize [516 720]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5.FB/JB5 Borderless 182x257mm" 526 739 0 0 0 0 "<</cupsInteger0 45/PageSize[526 739]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 45/PageSize [526 739]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Executive/Executive 7.25x10.5in" 522 756 9 9 9 9 "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Executive.Duplex/Executive AutoDuplex 7.25x10.5in" 522 747 9 27 9 36 "<</cupsInteger0 1/PageSize[522 747]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[522 747]/ImagingBBox null>>setpagedevice"
+ CustomMedia "16k/16k 7.75x10.75in" 558 774 9 9 9 9 "<</cupsInteger0 101/PageSize[558 774]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[558 774]/ImagingBBox null>>setpagedevice" // custom
+ CustomMedia "8x10/8x10in" 576 720 9 36 9 9 "<</cupsInteger0 7/PageSize[576 720]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 7/PageSize[576 720]/ImagingBBox null>>setpagedevice"
+ *CustomMedia "Letter/Letter 8.5x11in" 612 792 9 9 9 9 "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Letter.Duplex/Letter AutoDuplex 8.5x11in" 612 783 9 27 9 36 "<</cupsInteger0 2/PageSize[612 783]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/PageSize[612 783]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Letter.FB/Letter Borderless 8.5x11in" 622 802 0 0 0 0 "<</cupsInteger0 2/PageSize[622 802]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/PageSize[622 802]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4/A4 210x297mm" 595.44 841.68 9 9 9 9 "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4.Duplex/A4 AutoDuplex 210x297mm" 595 833 9 27 9 36 "<</cupsInteger0 26/PageSize[595 833]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/PageSize[595 833]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4.FB/A4 Borderless 210x297mm" 605 852 0 0 0 0 "<</cupsInteger0 26/PageSize[605 852]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/PageSize[605 852]/ImagingBBox null>>setpagedevice"
+ CustomMedia "ExecutiveJIS/Executive (JIS) 8.5x12.986in" 612 936 9 9 9 9 "<</cupsInteger0 10/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 10/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ CustomMedia "FLSA/American Foolscap 8.5x13in" 612 936 9 9 9 9 "<</cupsInteger0 10/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 10/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Legal/Legal 8.5x14in" 612 1008 9 9 9 9 "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Legal.Duplex/Legal AutoDuplex 8.5x14in" 612 999 9 27 9 36 "<</cupsInteger0 3/PageSize[612 999]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 3/PageSize[612 999]/ImagingBBox null>>setpagedevice"
+
+// CDDVD
+ CustomMedia "CDDVD80/CD DVD 80mm" 238 238 4 4 4 4 "<</cupsInteger0 98/PageSize[238 238]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 98/PageSize[238 238]/ImagingBBox null>>setpagedevice"
+ CustomMedia "CDDVD120/CD DVD 120mm" 360 360 4 4 4 4 "<</cupsInteger0 99/PageSize[360 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 99/PageSize[360 360]/ImagingBBox null>>setpagedevice"
+
+// Envelope
+ CustomMedia "EnvA2/A2 Envelope 4.37x5.75in" 314.64 414 9 42 9 9 "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC6/C6 Envelope 114x162mm" 323.28 459.36 9 39 9 9 "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou4/#4 Japanese Envelope 90x205mm" 254.88 581.04 9 41 9 9 "<</cupsInteger0 111/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 111/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvMonarch/Monarch Envelope 3.875x7.5in" 279 540 9 41 9 9 "<</cupsInteger0 80/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 80/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvDL/DL Envelope 110x220mm" 311.76 623.52 9 41 9 9 "<</cupsInteger0 90/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 90/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Env10/#10 Envelope 4.12x9.5in" 297 684 9 41 9 9 "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou3/#3 Japanese Envelope 120x235mm" 339.84 666 9 41 9 9 "<</cupsInteger0 110/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 110/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC5/C5 Envelope 162x229mm" 459 649 9 41 9 9 "<</cupsInteger0 91/PageSize[459 649]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 91/PageSize[459 649]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvB5/B5 Envelope 176x250mm" 499 709 9 41 9 9 "<</cupsInteger0 100/PageSize[499 709]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 100/PageSize[499 709]/ImagingBBox null>>setpagedevice"
+
+ {
+ // Custom page sizes from 1x4in to Legal
+ HWMargins 18 36 18 36
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 8.5in 14in
+
+ } // End Supported media sizes with full bleed.
+
+ {
+ // Large format
+ UIConstraints "*PageSize A3 *Duplex"
+ UIConstraints "*PageSize B4 *Duplex"
+ UIConstraints "*PageSize Ledger *Duplex"
+ UIConstraints "*PageSize SuperB *Duplex"
+ UIConstraints "*PageSize 8k *Duplex"
+
+// Large
+ CustomMedia "SuperB/SuperB 13x19in" 936 1368 18 36 18 9 "<</cupsInteger0 16/PageSize[936 1368]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 16/PageSize[936 1368]/ImagingBBox null>>setpagedevice"
+ CustomMedia "B4/B4 257x364mm" 729 1033 18 36 18 9 "<</cupsInteger0 46/PageSize[729 1033]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 46/PageSize[729 1033]/ImagingBBox null>>setpagedevice"
+ CustomMedia "B4.Duplex/B4 AutoDuplex 257x364mm" 729 1024 18 27 18 9 "<</cupsInteger0 1/PageSize[729 1024]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[729 1024]/ImagingBBox null>>setpagedevice"
+ CustomMedia "8k/8k 10.75x15.5in" 774 1116 18 36 18 9 "<</cupsInteger0 101/PageSize[774 1116]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[774 1116]/ImagingBBox null>>setpagedevice" // custom
+ CustomMedia "Ledger/Ledger 11x17in" 792 1224 18 36 18 9 "<</cupsInteger0 6/PageSize[792 1224]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 6/PageSize[792 1224]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A3/A3 297x420mm" 842 1190 18 36 18 9 "<</cupsInteger0 27/PageSize[842 1190]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 27/PageSize[842 1190]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A3.Duplex/A3 AutoDuplex 297x420mm" 842 1181 18 27 18 36 "<</cupsInteger0 1/PageSize[842 1181]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[842 1181]/ImagingBBox null>>setpagedevice"
+
+ // Custom page sizes from 1x4in to SuperB
+ HWMargins 18 36 18 36
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 936 1368
+
+ // <%DJGenericVIP:LargeFormatSuperB:NoAutoTray%>
+ {
+ ModelName "HP Photosmart 8700 Series"
+ Attribute "NickName" "" "HP Photosmart 8700 Series, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 8700 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 8700 series;DES:photosmart 8700 series;"
+ PCFileName "hp-photosmart_8700_series.ppd"
+ Attribute "Product" "" "(HP Photosmart 8750 Professional Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 8750xi Professional Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 8750gp Professional Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 8753 Professional Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 8758 Professional Photo Printer)"
+ }
+
+ } // End Large format media sizes with full bleed.
+
+} // End DJGenericVIP with NoAutoTray
+
+//////// DJGenericVIP with NoEvenDuplex (ie: cupsEvenDuplex = False)
+{
+ Attribute "cupsBackSide" "" "Rotated"
+ Attribute "cupsFlipDuplex" "" "True"
+ Attribute "hpPrinterLanguage" "" "pcl3gui2"
+ Attribute "HPMechOffset" "" "70"
+
+ Group "General/General"
+
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 10.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "<</Duplex true/Tumble false>>setpagedevice"
+ Choice "DuplexTumble/Short Edge (Flip)" "<</Duplex true/Tumble true>>setpagedevice"
+ *Choice "None/Off" "<</Duplex false/Tumble false>>setpagedevice"
+
+ // MediaPosition values map to MediaSource enumeration in global_types.h
+ Option "InputSlot/Media Source" PickOne AnySetup 10.0
+ *Choice "Auto/Auto-Select" "<</MediaPosition 7>>setpagedevice"
+ Choice "PhotoTray/Photo Tray" "<</MediaPosition 6>>setpagedevice"
+ Choice "Upper/Upper Tray" "<</MediaPosition 1>>setpagedevice"
+ Choice "Lower/Lower Tray" "<</MediaPosition 4>>setpagedevice"
+ Choice "Envelope/Envelope Feeder" "<</MediaPosition 3>>setpagedevice"
+ Choice "LargeCapacity/Large Capacity Tray" "<</MediaPosition 5>>setpagedevice"
+ Choice "Manual/Manual Feeder" "<</MediaPosition 2>>setpagedevice"
+ Choice "MPTray/Multi Purpose Tray" "<</MediaPosition 1>>setpagedevice"
+ Choice "CDDVDTray/CD or DVD Tray" "<</MediaPosition 14>>setpagedevice"
+
+ Option "ColorModel/Output Mode" PickOne AnySetup 10.0
+ Choice "CMYGray/High Quality Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 1>>setpagedevice"
+ Choice "KGray/Black Only Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 2>>setpagedevice"
+ *Choice "RGB/Color" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 0>>setpagedevice"
+
+ // cupsMediaType values map to MEDIATYPE from global_types.h
+ Option "MediaType/Media Type" PickOne AnySetup 10.0
+ *Choice "Automatic/Automatic" "<</MediaType(Automatic)/cupsMediaType -1>>setpagedevice"
+ Choice "Plain/Plain Paper" "<</MediaType(Plain)/cupsMediaType 0>>setpagedevice"
+ Choice "Glossy/Photo Paper" "<</MediaType(Glossy)/cupsMediaType 3>>setpagedevice"
+ Choice "TransparencyFilm/Transparency Film" "<</MediaType(TransparencyFilm)/cupsMediaType 4>>setpagedevice"
+ Choice "CDDVDMedia/CD or DVD Media" "<</MediaType(CDDVDMedia)/cupsMediaType 7>>setpagedevice"
+
+ // cupsCompression values map to QUALITY_MODE from global_types.h
+ Option "OutputMode/Print Quality" PickOne AnySetup 10.0
+ *Choice "Normal/Normal" "<</OutputType(0)/HWResolution[600 600]>>setpagedevice"
+ Choice "Draft/Draft" "<</OutputType(-1)/HWResolution[300 300]>>setpagedevice"
+ Choice "Best/Best" "<</OutputType(1)/HWResolution[600 600]>>setpagedevice"
+ Choice "Photo/High-Resolution Photo" "<</OutputType(2)/HWResolution[1200 1200]>>setpagedevice"
+ Choice "FastDraft/Fast Draft" "<</OutputType(-2)/HWResolution[300 300]>>setpagedevice"
+
+ // Duplexer is optional...
+ Installable "OptionDuplex/Duplexer Installed"
+
+ // Constraints
+ UIConstraints "*Duplex *OptionDuplex False"
+ UIConstraints "*ColorModel KGray *OutputMode Photo"
+ UIConstraints "*ColorModel CMYGray *OutputMode Photo"
+ UIConstraints "*MediaType Automatic *OutputMode FastDraft"
+ UIConstraints "*MediaType Automatic *PageSize EnvMonarch"
+ UIConstraints "*MediaType Glossy *OutputMode FastDraft"
+ UIConstraints "*MediaType Glossy *OutputMode Draft"
+ UIConstraints "*MediaType TransparencyFilm *OutputMode FastDraft"
+ UIConstraints "*MediaType Plain *OutputMode Photo"
+ UIConstraints "*InputSlot CDDVDTray *MediaType Automatic"
+ UIConstraints "*InputSlot CDDVDTray *MediaType Plain"
+ UIConstraints "*InputSlot CDDVDTray *MediaType Glossy"
+ UIConstraints "*InputSlot CDDVDTray *MediaType TransparencyFilm"
+ UIConstraints "*PageSize Letter *Duplex"
+ UIConstraints "*PageSize A4 *Duplex"
+ UIConstraints "*PageSize Legal *Duplex"
+ UIConstraints "*PageSize Photo4x6 *Duplex"
+ UIConstraints "*PageSize Photo5x7 *Duplex"
+ UIConstraints "*PageSize A5 *Duplex"
+ UIConstraints "*PageSize A6 *Duplex"
+ UIConstraints "*PageSize B5 *Duplex"
+ UIConstraints "*PageSize Oufuku *Duplex"
+ UIConstraints "*PageSize Hagaki *Duplex"
+ UIConstraints "*PageSize Executive *Duplex"
+ UIConstraints "*PageSize FLSA *Duplex"
+ UIConstraints "*PageSize ExecutiveJIS *Duplex"
+ UIConstraints "*PageSize 16k *Duplex"
+ UIConstraints "*PageSize Card3x5 *Duplex"
+ UIConstraints "*PageSize Card5x8 *Duplex"
+ UIConstraints "*PageSize Env10 *Duplex"
+ UIConstraints "*PageSize EnvA2 *Duplex"
+ UIConstraints "*PageSize EnvC6 *Duplex"
+ UIConstraints "*PageSize EnvDL *Duplex"
+ UIConstraints "*PageSize EnvC5 *Duplex"
+ UIConstraints "*PageSize EnvB5 *Duplex"
+ UIConstraints "*PageSize EnvChou3 *Duplex"
+ UIConstraints "*PageSize EnvChou4 *Duplex"
+ UIConstraints "*PageSize EnvMonarch *Duplex"
+
+ Attribute "cupsModelName" "" "deskjet 5600" // APDK device class
+
+// 4x6 or smaller
+ CustomMedia "Card3x5/Index Card 3x5in" 216 360 9 9 9 9 "<</cupsInteger0 78/PageSize [216 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 78/PageSize[216 360]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card3x5.FB/Index Card Borderless 3x5in" 226 370 0 0 0 0 "<</cupsInteger0 78/PageSize [226 370]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 78/PageSize[226 370]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki/Hagaki 100x148mm" 284 420 9 9 9 9 "<</cupsInteger0 71/PageSize[284 420]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/PageSize[284 420]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki.Duplex/Hagaki AutoDuplex 100x148mm" 284 411 9 27 9 36 "<</cupsInteger0 71/PageSize[284 411]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/PageSize[284 411]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki.FB/Hagaki Borderless 100x148mm" 294 430 0 0 0 0 "<</cupsInteger0 71/PageSize[294 430]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/PageSize[294 430]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6/Photo 4x6in" 288 432 9 9 9 9 "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6.FB/Photo Borderless 4x6 in" 298 442 0 0 0 0 "<</cupsInteger0 74/PageSize[298 442]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[298 442]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6/A6 105x148mm" 297.36 419.76 9 9 9 9 "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6.Duplex/A6 AutoDuplex 105x148mm)" 297 411 9 27 9 36 "<</cupsInteger0 73/PageSize[297 411]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 73/PageSize[297 411]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6.FB/A6 Borderless 105x148mm" 307 430 0 0 0 0 "<</cupsInteger0 73/PageSize[307 430]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 73/PageSize[307 430]/ImagingBBox null>>setpagedevice"
+
+// 5x7
+ CustomMedia "Photo5x7/Photo 5x7in" 360 504 9 9 9 9 "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo5x7.FB/Photo Borderless 5x7in" 370 514 0 0 0 0 "<</cupsInteger0 122/PageSize[370 514]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/PageSize[370 514]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card5x8/Index Card 5x8in" 360 576 9 9 9 9 "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card5x8.Duplex/Index Card AutoDuplex 5x8in" 360 567 9 27 9 36 "<</cupsInteger0 75/PageSize[360 567]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 75/PageSize[360 567]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Oufuku/Oufuku-Hagaki 148x200mm" 567 420 9 9 9 9 "<</cupsInteger0 72/PageSize[567 420]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 72/PageSize[567 420]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Oufuku.Duplex/Oufuku-Hagaki AutoDuplex 148x200mm" 567 411 9 27 9 36 "<</cupsInteger0 72/PageSize[567 411]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 72/PageSize[567 411]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Oufuku.FB/Oufuku-Hagaki Borderless 148x200mm" 577 430 0 0 0 0 "<</cupsInteger0 72/PageSize[577 430]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 72/PageSize[577 430]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5/A5 148x210mm" 419.76 595.44 9 9 9 9 "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5.Duplex/A5 AutoDuplex 148x210mm" 420 586 9 27 9 36 "<</cupsInteger0 25/PageSize[420 586]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/PageSize[420 586]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5.FB/A5 Borderless 148x210mm" 430 605 0 0 0 0 "<</cupsInteger0 25/PageSize[430 605]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/PageSize[430 605]/ImagingBBox null>>setpagedevice"
+
+// Standard
+ CustomMedia "B5/B5 176x250mm" 498.96 708.48 9 9 9 9 "<</cupsInteger0 65/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 65/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ CustomMedia "B5.Duplex/B5 AutoDuplex 176x250mm" 499 699 9 27 9 36 "<</cupsInteger0 65/PageSize[499 699]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 65/PageSize[499 699]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5/JB5 182x257mm" 516.24 728.64 9 9 9 9 "<</cupsInteger0 45/PageSize[516.24 728.64]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 45/PageSize [516.24 728.64]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5.Duplex/JB5 AutoDuplex 182x257mm" 516 720 9 27 9 36 "<</cupsInteger0 45/PageSize[516 720]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 45/PageSize [516 720]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5.FB/JB5 Borderless 182x257mm" 526 739 0 0 0 0 "<</cupsInteger0 45/PageSize[526 739]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 45/PageSize [526 739]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Executive/Executive 7.25x10.5in" 522 756 9 9 9 9 "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Executive.Duplex/Executive AutoDuplex 7.25x10.5in" 522 747 9 27 9 36 "<</cupsInteger0 1/PageSize[522 747]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[522 747]/ImagingBBox null>>setpagedevice"
+ CustomMedia "16k/16k 7.75x10.75in" 558 774 9 9 9 9 "<</cupsInteger0 101/PageSize[558 774]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[558 774]/ImagingBBox null>>setpagedevice" // custom
+ CustomMedia "8x10/8x10in" 576 720 9 36 9 9 "<</cupsInteger0 7/PageSize[576 720]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 7/PageSize[576 720]/ImagingBBox null>>setpagedevice"
+ *CustomMedia "Letter/Letter 8.5x11in" 612 792 9 9 9 9 "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Letter.Duplex/Letter AutoDuplex 8.5x11in" 612 783 9 27 9 36 "<</cupsInteger0 2/PageSize[612 783]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/PageSize[612 783]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Letter.FB/Letter Borderless 8.5x11in" 622 802 0 0 0 0 "<</cupsInteger0 2/PageSize[622 802]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/PageSize[622 802]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4/A4 210x297mm" 595.44 841.68 9 9 9 9 "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4.Duplex/A4 AutoDuplex 210x297mm" 595 833 9 27 9 36 "<</cupsInteger0 26/PageSize[595 833]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/PageSize[595 833]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4.FB/A4 Borderless 210x297mm" 605 852 0 0 0 0 "<</cupsInteger0 26/PageSize[605 852]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/PageSize[605 852]/ImagingBBox null>>setpagedevice"
+ CustomMedia "ExecutiveJIS/Executive (JIS) 8.5x12.986in" 612 936 9 9 9 9 "<</cupsInteger0 10/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 10/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ CustomMedia "FLSA/American Foolscap 8.5x13in" 612 936 9 9 9 9 "<</cupsInteger0 10/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 10/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Legal/Legal 8.5x14in" 612 1008 9 9 9 9 "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Legal.Duplex/Legal AutoDuplex 8.5x14in" 612 999 9 27 9 36 "<</cupsInteger0 3/PageSize[612 999]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 3/PageSize[612 999]/ImagingBBox null>>setpagedevice"
+
+// CDDVD
+ CustomMedia "CDDVD80/CD DVD 80mm" 238 238 4 4 4 4 "<</cupsInteger0 98/PageSize[238 238]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 98/PageSize[238 238]/ImagingBBox null>>setpagedevice"
+ CustomMedia "CDDVD120/CD DVD 120mm" 360 360 4 4 4 4 "<</cupsInteger0 99/PageSize[360 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 99/PageSize[360 360]/ImagingBBox null>>setpagedevice"
+
+// Envelope
+ CustomMedia "EnvA2/A2 Envelope 4.37x5.75in" 314.64 414 9 42 9 9 "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC6/C6 Envelope 114x162mm" 323.28 459.36 9 39 9 9 "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou4/#4 Japanese Envelope 90x205mm" 254.88 581.04 9 41 9 9 "<</cupsInteger0 111/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 111/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvMonarch/Monarch Envelope 3.875x7.5in" 279 540 9 41 9 9 "<</cupsInteger0 80/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 80/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvDL/DL Envelope 110x220mm" 311.76 623.52 9 41 9 9 "<</cupsInteger0 90/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 90/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Env10/#10 Envelope 4.12x9.5in" 297 684 9 41 9 9 "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou3/#3 Japanese Envelope 120x235mm" 339.84 666 9 41 9 9 "<</cupsInteger0 110/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 110/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC5/C5 Envelope 162x229mm" 459 649 9 41 9 9 "<</cupsInteger0 91/PageSize[459 649]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 91/PageSize[459 649]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvB5/B5 Envelope 176x250mm" 499 709 9 41 9 9 "<</cupsInteger0 100/PageSize[499 709]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 100/PageSize[499 709]/ImagingBBox null>>setpagedevice"
+
+ {
+ // Custom page sizes from 1x4in to Legal
+ HWMargins 18 36 18 36
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 8.5in 14in
+
+ // <%DJGenericVIP:NoEvenDuplex%>
+ {
+ ModelName "HP Photosmart c8100 Series"
+ Attribute "NickName" "" "HP Photosmart c8100 Series, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart c8100 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart c8100 series;DES:photosmart c8100 series;"
+ PCFileName "hp-photosmart_c8100_series.ppd"
+ Attribute "Product" "" "(HP Photosmart c8150 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c8180 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c8183 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c8188 All-in-one Printer)"
+ }
+ } // End Supported media sizes with full bleed.
+} // End DJGenericVIP with NoEvenDuplex
+
+
+
+//////// Stabler
+{
+ Attribute "hpPrinterLanguage" "" "pcl3gui2"
+ Attribute "HPMechOffset" "" "70"
+
+ Group "General/General"
+
+ // MediaPosition values map to MediaSource enumeration in global_types.h
+ Option "InputSlot/Media Source" PickOne AnySetup 10.0
+ *Choice "Auto/Auto-Select" "<</MediaPosition 7>>setpagedevice"
+ Choice "Main/Main Tray" "<</MediaPosition 1>>setpagedevice"
+ Choice "PhotoTray/Photo Tray" "<</MediaPosition 6>>setpagedevice"
+
+ Option "ColorModel/Output Mode" PickOne AnySetup 10.0
+ *Choice "RGB/Color" "<</cupsColorSpace 17/cupsBitsPerColor 8/cupsRowStep 0>>setpagedevice"
+ Choice "CMYGray/High Quality Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 1>>setpagedevice"
+ Choice "KGray/Black Only Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 2>>setpagedevice"
+
+ // cupsMediaType values map to MEDIATYPE from global_types.h
+ Option "MediaType/Media Type" PickOne AnySetup 10.0
+ *Choice "Plain/Plain Paper" "<</MediaType(Plain)/cupsMediaType 0>>setpagedevice"
+ Choice "Glossy/Photo Paper" "<</MediaType(Glossy)/cupsMediaType 3>>setpagedevice"
+ Choice "TransparencyFilm/Transparency Film" "<</MediaType(TransparencyFilm)/cupsMediaType 4>>setpagedevice"
+
+ // cupsCompression values map to QUALITY_MODE from global_types.h
+ Option "OutputMode/Print Quality" PickOne AnySetup 10.0
+ *Choice "Normal/Normal" "<</OutputType(0)/HWResolution[600 600]>>setpagedevice"
+ Choice "Best/Best" "<</OutputType(1)/HWResolution[600 600]>>setpagedevice"
+ Choice "Photo/High-Resolution Photo" "<</OutputType(2)/HWResolution[1200 1200]>>setpagedevice"
+ Choice "FastDraft/Fast Draft" "<</OutputType(-2)/HWResolution[300 300]>>setpagedevice"
+
+ // Constraints
+ UIConstraints "*ColorModel KGray *OutputMode Photo"
+ UIConstraints "*ColorModel CMYGray *OutputMode Photo"
+ UIConstraints "*MediaType Glossy *OutputMode FastDraft"
+ UIConstraints "*MediaType TransparencyFilm *OutputMode FastDraft"
+ UIConstraints "*MediaType Plain *OutputMode Photo"
+ UIConstraints "*MediaType TransparencyFilm *OutputMode Best"
+ UIConstraints "*MediaType TransparencyFilm *OutputMode Photo"
+
+ UIConstraints "*PageSize L.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize Hagaki.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize Photo4x6.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize A6.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize Cabinet.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize Photo5x7.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize A5.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize 8x10.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize Letter.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize A4.FB *OutputMode FastDraft"
+
+// 4x6 or smaller
+ CustomMedia "Card3x5/Index Card 3x5in" 216 360 9 9 9 9 "<</cupsInteger0 78/PageSize [216 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 78/PageSize[216 360]/ImagingBBox null>>setpagedevice"
+ CustomMedia "L/L 89x127mm" 252 360 9 9 9 9 "<</cupsInteger0 121/PageSize[252 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 121/PageSize[252 360]/ImagingBBox null>>setpagedevice"
+ CustomMedia "L.FB/L Borderless 89x127mm" 264.744 374.112 0 0 0 0 "<</cupsInteger0 121/PageSize[264.744 374.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 121/cupsReal0 .079/cupsReal1 .098/PageSize[264.744 374.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki/Hagaki 100x148mm" 283.68 419.76 9 9 9 9 "<</cupsInteger0 71/PageSize[283.68 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/PageSize[283.68 419.76]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki.FB/Hagaki Borderless 100x148mm" 296.424 433.872 0 0 0 0 "<</cupsInteger0 71/PageSize[296.424 433.872]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/cupsReal0 .079/cupsReal1 .098/PageSize[296.424 433.872]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6/Photo 4x6in" 288 432 9 9 9 9 "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6.FB/Photo Borderless 4x6in" 303.552 446.112 0 0 0 0 "<</cupsInteger0 74/PageSize[303.552 446.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/cupsReal0 .098/cupsReal1 .098/PageSize[303.552 446.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6/A6 105x148mm" 297.36 419.76 9 9 9 9 "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6.FB/A6 Borderless 105x148mm" 310.104 433.872 0 0 0 0 "<</cupsInteger0 73/PageSize[310.104 433.872]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 73/cupsReal0 .079/cupsReal1 .098/PageSize[310.104 433.872]/ImagingBBox null>>setpagedevice"
+
+// 5x7
+ CustomMedia "Cabinet/Cabinet Size 120x165mm" 339.84 468 9 9 9 9 "<</cupsInteger0 119/PageSize[339.84 468]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 119/PageSize[339.84 468]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Cabinet.FB/Cabinet Size Borderless 120x165mm" 352.584 482.112 0 0 0 0 "<</cupsInteger0 119/PageSize[352.584 482.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 119/cupsReal0 .079/cupsReal1 .098/PageSize[352.584 482.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo5x7/Photo 5x7in" 360 504 9 9 9 9 "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo5x7.FB/Photo Borderless 5x7in" 372.816 518.112 0 0 0 0 "<</cupsInteger0 122/PageSize[372.816 518.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/cupsReal0 .089/cupsReal1 .098/PageSize[372.816 518.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card5x8/Index Card 5x8in" 360 576 9 9 9 9 "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Oufuku/Oufuku-Hagaki 200x148mm" 566.64 419.76 9 9 9 9 "<</cupsInteger0 72/PageSize[566.64 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 72/PageSize[566.64 419.76]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5/A5 148x210mm" 419.76 595.44 9 9 9 9 "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5.FB/A5 Borderless 148x210mm" 435.312 609.552 0 0 0 0 "<</cupsInteger0 25/PageSize[435.312 609.552]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/cupsReal0 .098/cupsReal1 .098/PageSize[435.312 609.552]/ImagingBBox null>>setpagedevice"
+
+// Standard
+ CustomMedia "B5/B5 176x250mm" 498.96 708.48 9 9 9 9 "<</cupsInteger0 65/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 65/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5/JB5 182x257mm" 516.24 728.64 9 9 9 9 "<</cupsInteger0 45/PageSize[516.24 728.64]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 45/PageSize [516.24 728.64]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Executive/Executive 7.25x10.5in" 522 756 9 9 9 9 "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ CustomMedia "8x10/8x10in" 576 720 9 9 9 9 "<</cupsInteger0 7/PageSize[576 720]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 7/PageSize[576 720]/ImagingBBox null>>setpagedevice"
+ CustomMedia "8x10.FB/Borderless 8x10in" 591.552 734.112 0 0 0 0 "<</cupsInteger0 7/PageSize[591.552 734.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 7/cupsReal0 .098/cupsReal1 .098/PageSize[591.552 734.112]/ImagingBBox null>>setpagedevice"
+ *CustomMedia "Letter/Letter 8.5x11in" 612 792 9 9 9 9 "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Letter.FB/Letter Borderless 8.5x11in" 627.552 806.112 0 0 0 0 "<</cupsInteger0 2/PageSize[627.552 806.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/cupsReal0 .098/cupsReal1 .098/PageSize[627.552 806.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4/A4 210x297mm" 595.44 841.68 9 9 9 9 "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4.FB/A4 Borderless 210x297mm" 610.992 855.792 0 0 0 0 "<</cupsInteger0 26/PageSize[610.992 855.792]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/cupsReal0 .098/cupsReal1 .098/PageSize[610.992 855.792]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Legal/Legal 8.5x14in" 612 1008 9 9 9 9 "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+
+// Envelope
+ CustomMedia "EnvA2/A2 Envelope 4.37x5.75in" 314.64 414 9 42.192 9 9 "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvCard/Card Envelope 4.4x6in" 315 432 9 42.192 9 9 "<</cupsInteger0 114/PageSize[315 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 114/PageSize[315 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Env6/#6 Envelope 3.63x6.5in" 261.36 468 9 42.192 9 9 "<</cupsInteger0 83/PageSize[261.36 468]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 83/PageSize[261.36 468]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC6/C6 Envelope 114x162mm" 323.28 459.36 9 42.192 9 9 "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou4/#4 Japanese Envelope 90x205mm" 254.88 581.04 9 42.192 9 9 "<</cupsInteger0 111/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 111/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvMonarch/Monarch Envelope 3.875x7.5in" 279 540 9 42.192 9 9 "<</cupsInteger0 80/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 80/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvDL/DL Envelope 110x220mm" 311.76 623.52 9 42.192 9 9 "<</cupsInteger0 90/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 90/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Env10/#10 Envelope 4.125x9.5in" 297 684 9 42.192 9 9 "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou3/#3 Japanese Envelope 120x235mm" 339.84 666 9 42.192 9 9 "<</cupsInteger0 110/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 110/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC5/C5 Envelope 162x229mm" 459.36 649.44 9 42.192 9 9 "<</cupsInteger0 91/PageSize[459.36 649.44]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 91/PageSize[459.36 649.44]/ImagingBBox null>>setpagedevice"
+
+ {
+ // Custom page sizes from 3x4in to Legal
+ HWMargins 9 9 9 9
+ VariablePaperSize Yes
+ MinSize 3in 4in
+ MaxSize 8.5in 30in
+
+ // <%Stabler:Normal%>
+ {
+ ModelName "HP Photosmart b010 Series"
+ Attribute "NickName" "" "HP Photosmart b010 Series, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart b010 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart b010 series;DES:photosmart b010 series;"
+ PCFileName "hp-photosmart_b010_series.ppd"
+ Attribute "Product" "" "(HP Photosmart All-in-one Printer - b010)"
+ }
+ {
+ ModelName "HP Photosmart b109a Series"
+ Attribute "NickName" "" "HP Photosmart b109a Series, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart b109a Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart b109a series;DES:photosmart b109a series;"
+ PCFileName "hp-photosmart_b109a_series.ppd"
+ Attribute "Product" "" "(HP Photosmart All-in-one Printer - b109a)"
+ Attribute "Product" "" "(HP Photosmart All-in-one Printer - b109c)"
+ Attribute "Product" "" "(HP Photosmart All-in-one Printer - b109d)"
+ Attribute "Product" "" "(HP Photosmart All-in-one Printer - b109e)"
+ }
+ {
+ ModelName "HP Photosmart Wireless b109n-z"
+ Attribute "NickName" "" "HP Photosmart Wireless b109n-z, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart Wireless b109n-z"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart wireless b109n-z;DES:photosmart wireless b109n-z;"
+ PCFileName "hp-photosmart_wireless_b109n-z.ppd"
+ Attribute "Product" "" "(HP Photosmart Wireless All-in-one Printer - b109n)"
+ Attribute "Product" "" "(HP Photosmart Wireless All-in-one Printer - b109q)"
+ Attribute "Product" "" "(HP Photosmart Wireless All-in-one Printer - b109q=r)"
+ }
+ {
+ ModelName "HP Photosmart b109a-m"
+ Attribute "NickName" "" "HP Photosmart b109a-m, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart b109a-m"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart b109a-m;DES:photosmart b109a-m;"
+ PCFileName "hp-photosmart_b109a-m.ppd"
+ Attribute "Product" "" "(HP Photosmart All-in-one Printer - b109a)"
+ Attribute "Product" "" "(HP Photosmart All-in-one Printer - b109c)"
+ Attribute "Product" "" "(HP Photosmart All-in-one Printer - b109d)"
+ Attribute "Product" "" "(HP Photosmart All-in-one Printer - b109e)"
+ }
+ {
+ ModelName "HP Photosmart b110 Series"
+ Attribute "NickName" "" "HP Photosmart b110 Series, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart b110 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart b110 series;DES:photosmart b110 series;"
+ PCFileName "hp-photosmart_b110_series.ppd"
+ Attribute "Product" "" "(HP Photosmart Wireless All-in-one Printer - b110)"
+ }
+ {
+ ModelName "HP Photosmart Plus b209a-m"
+ Attribute "NickName" "" "HP Photosmart Plus b209a-m, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart Plus b209a-m"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart plus b209a-m;DES:photosmart plus b209a-m;"
+ PCFileName "hp-photosmart_plus_b209a-m.ppd"
+ Attribute "Product" "" "(HP Photosmart Plus All-in-one Printer - b209a)"
+ Attribute "Product" "" "(HP Photosmart Plus All-in-one Printer - b209b)"
+ Attribute "Product" "" "(HP Photosmart Plus All-in-one Printer - b209c)"
+ }
+ {
+ ModelName "HP Photosmart Plus b210 Series"
+ Attribute "NickName" "" "HP Photosmart Plus b210 Series, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart Plus b210 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart plus b210 series;DES:photosmart plus b210 series;"
+ PCFileName "hp-photosmart_plus_b210_series.ppd"
+ Attribute "Product" "" "(HP Photosmart Plus b210 Series)"
+ }
+ } // End Supported media sizes with full bleed.
+
+} // End Stabler
+
+//////// StingrayOJ
+{
+
+ Attribute "hpPrinterLanguage" "" "pcl3gui2"
+ Attribute "HPMechOffset" "" "70"
+
+ Group "General/General"
+
+ Option "ColorModel/Output Mode" PickOne AnySetup 10.0
+ Choice "CMYGray/High Quality Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 1>>setpagedevice"
+ Choice "KGray/Black Only Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 2>>setpagedevice"
+ *Choice "RGB/Color" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 0>>setpagedevice"
+
+ // cupsMediaType values map to MEDIATYPE from global_types.h
+ Option "MediaType/Media Type" PickOne AnySetup 10.0
+ *Choice "Automatic/Automatic" "<</MediaType(Automatic)/cupsMediaType -1>>setpagedevice"
+ Choice "Plain/Plain Paper" "<</MediaType(Plain)/cupsMediaType 0>>setpagedevice"
+ Choice "Glossy/Photo Paper" "<</MediaType(Glossy)/cupsMediaType 3>>setpagedevice"
+
+
+ // cupsCompression values map to QUALITY_MODE from global_types.h
+ Option "OutputMode/Print Quality" PickOne AnySetup 10.0
+ *Choice "Normal/Normal" "<</OutputType(0)/HWResolution[600 600]>>setpagedevice"
+ Choice "FastDraft/Fast Draft" "<</OutputType(-2)/HWResolution[300 300]>>setpagedevice"
+ Choice "Best/Best" "<</OutputType(1)/HWResolution[600 600]>>setpagedevice"
+ Choice "Photo/High-Resolution Photo" "<</OutputType(2)/HWResolution[1200 1200]>>setpagedevice"
+
+ Option "InputSlot/Media Source" PickOne AnySetup 10.0
+ *Choice "Tray1/Tray 1" "<</MediaPosition 1>>setpagedevice"
+
+ //Constraints
+ //MediaType & OutputMode
+ UIConstraints "*MediaType Plain *OutputMode Photo"
+ UIConstraints "*MediaType Glossy *OutputMode FastDraft"
+ UIConstraints "*MediaType Glossy *OutputMode Photo"
+
+ //PaperSizes & MediaTypes
+ UIConstraints "*PageSize PhotoL.FB *MediaType Plain"
+ UIConstraints "*PageSize Photo3.5x5.FB *MediaType Plain"
+ UIConstraints "*PageSize Photo4x6.FB *MediaType Plain"
+ UIConstraints "*PageSize Photo4x6tab.FB *MediaType Plain"
+ UIConstraints "*PageSize Photo10x15.FB *MediaType Plain"
+ UIConstraints "*PageSize Photo10x15tab.FB *MediaType Plain"
+ UIConstraints "*PageSize Photo10x15tab.FB *MediaType Plain"
+ UIConstraints "*PageSize Photo3x5 *MediaType Plain"
+ UIConstraints "*PageSize PhotoL *MediaType Plain"
+ UIConstraints "*PageSize Photo3.5x5 *MediaType Plain"
+ UIConstraints "*PageSize Photo10x15 *MediaType Plain"
+ UIConstraints "*PageSize Photo4x6 *MediaType Plain"
+ UIConstraints "*PageSize Photo4x6tab *MediaType Plain"
+ UIConstraints "*PageSize Photo10x15tab *MediaType Plain"
+ UIConstraints "*PageSize Photo2L *MediaType Plain"
+ UIConstraints "*PageSize Photo13x18 *MediaType Plain"
+ UIConstraints "*PageSize Photo5x7 *MediaType Plain"
+ UIConstraints "*PageSize Photo8x10 *MediaType Plain"
+
+ UIConstraints "*PageSize Statement *MediaType Glossy"
+ UIConstraints "*PageSize A5 *MediaType Glossy"
+ UIConstraints "*PageSize JB5 *MediaType Glossy"
+ UIConstraints "*PageSize Executive *MediaType Glossy"
+ UIConstraints "*PageSize A4 *MediaType Glossy"
+ UIConstraints "*PageSize Letter *MediaType Glossy"
+ UIConstraints "*PageSize Legal *MediaType Glossy"
+ UIConstraints "*PageSize A6 *MediaType Glossy"
+ UIConstraints "*PageSize EnvChou4 *MediaType Glossy"
+ UIConstraints "*PageSize EnvMonarch *MediaType Glossy"
+ UIConstraints "*PageSize Env10 *MediaType Glossy"
+ UIConstraints "*PageSize EnvDL *MediaType Glossy"
+ UIConstraints "*PageSize EnvA2 *MediaType Glossy"
+ UIConstraints "*PageSize EnvC6 *MediaType Glossy"
+ UIConstraints "*PageSize EnvChou3 *MediaType Glossy"
+ UIConstraints "*PageSize EnvC5 *MediaType Glossy"
+ UIConstraints "*PageSize EnvC5 *MediaType Glossy"
+ UIConstraints "*PageSize Card3x5 *MediaType Glossy"
+ UIConstraints "*PageSize Card4x6 *MediaType Glossy"
+ UIConstraints "*PageSize Card5x8 *MediaType Glossy"
+ UIConstraints "*PageSize 8.5x13 *MediaType Glossy"
+
+
+
+
+
+ // 4x6 or smaller
+ CustomMedia "Card3x5/Index Card 3x5in" 216 360 5.76 33.84 5.76 8.64 "<</cupsInteger0 78/PageSize [216 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 78/PageSize[216 360]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card4x6/Index Card 4x6in" 288 432 5.76 33.84 5.76 8.64 "<</cupsInteger0 74/PageSize [288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "PhotoL/Photo L 89x127mm" 252 360 5.76 33.84 5.76 8.64 "<</cupsInteger0 121/PageSize[252 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 121/PageSize[252 360]/ImagingBBox null>>setpagedevice"
+ CustomMedia "L.FB/Borderless Photo L 89x127mm" 269 382.38 0 0 0 0 "<</cupsInteger0 121/cupsReal0 .118/cupsReal1 .051/PageSize [269 382.38]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 121/cupsReal0 .118/cupsReal1 .051/PageSize[269 382.38]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo3.5x5/Photo 3.5x5in" 252 360 5.76 33.84 5.76 8.64 "<</cupsInteger0 121/PageSize[252 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 121/PageSize[252 360]/ImagingBBox null>>setpagedevice"
+ CustomMedia "PhotoL.FB/Borderless Photo 3.5x5in" 269 382.38 0 0 0 0 "<</cupsInteger0 121/cupsReal0 .118/cupsReal1 .051/PageSize[269 382.38]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 121/cupsReal0 .118/cupsReal1 .051/PageSize[269 382.38]/ImagingBBox null>>setpagedevice"
+ //CustomMedia "Photo3.5x5.FB/Borderless Photo 3.5x5in" 269 382.38 0 0 0 0 "<</cupsInteger0 74/PageSize[269 382.38]/ImagingBBox null>>setpagedevice"
+ //"<</cupsInteger0 74/cupsReal0 .118/cupsReal1 .051/PageSize[269 382.38]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo3x5/Photo 3x5in" 216 360 5.76 33.84 5.76 8.64 "<</cupsInteger0 78/PageSize [216 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 78/PageSize[216 360]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6/Photo 4x6in" 288 432 5.76 33.84 5.76 8.64 "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6.FB/Borderless Photo 4x6in" 298.22 455.23 0 0 0 0 "<</cupsInteger0 74/cupsReal0 .091/cupsReal1 .051/PageSize[298.22 455.23]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/cupsReal0 .091/cupsReal1 .051/PageSize[298.22 455.23]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6/A6 105x148mm" 297.36 419.76 5.76 33.84 5.76 8.64 "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6tab/Photo 4x6in (tab)" 288 432 5.76 33.84 5.76 8.64 "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6tab.FB/Borderless Photo 4x6in (tab)" 298.22 455.23 0 0 0 0 "<</cupsInteger0 74/cupsReal0 .091/cupsReal1 .051/PageSize[298.22 455.23]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/cupsReal0 .091/cupsReal1 .051/PageSize[298.22 455.23]/ImagingBBox null>>setpagedevice"
+
+ // 5x7
+ CustomMedia "Photo5x7/Photo 5x7in" 360 504 5.76 33.84 5.76 8.64 "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card5x8/Index Card 5x8in" 360 576 5.76 33.84 5.76 8.64 "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5/A5 148x210mm" 419.76 595.44 9.36 33.84 9.36 8.64 "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+
+
+ // Standard
+ CustomMedia "JB5/JB5 182x257mm" 516.24 728.64 9.36 33.84 9.36 8.64 "<</cupsInteger0 45/PageSize[516.24 728.64]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 45/PageSize [516.24 728.64]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Executive/Executive 7.25x10.5in" 522 756 9.36 33.84 9.36 8.64 "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ *CustomMedia "Letter/Letter 8.5x11in" 612 792 18 33.84 18 8.64 "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4/A4 210x297mm" 595.44 841.68 9.36 33.84 9.36 8.64 "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Legal/Legal 8.5x14in" 612 1008 18 33.84 18 8.64 "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Statement/Statement 5.5x8.5in" 396 612 9.36 33.84 9.36 8.64 "<</cupsInteger0 15/PageSize[396 612]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 15/PageSize[396 612]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo10x15/Photo 10x15cm" 288 432 5.76 33.84 5.76 8.64 "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo10x15.FB/Borderless Photo 10x15cm" 298.22 455.23 0 0 0 0 "<</cupsInteger0 74/cupsReal0 .091/cupsReal1 .051/PageSize[298.22 455.23]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/cupsReal0 .091/cupsReal1 .051/PageSize[298.22 455.23]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo10x15tab/Photo 10x15cm (tab)" 288 432 5.76 33.84 5.76 8.64 "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo10x15tab.FB/ Borderless Photo 10x15cm (tab)" 298.22 455.23 0 0 0 0 "<</cupsInteger0 74/cupsReal0 .091/cupsReal1 .051/PageSize[298.22 455.23]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/cupsReal0 .091/cupsReal1 .051/PageSize[298.22 455.23]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo2L/Photo 2L 127x178mm" 360 504 5.76 33.84 5.76 8.64 "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo13x18/Photo 13x18cm" 360 504 5.76 33.84 5.76 8.64 "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo8x10/Photo 8x10in" 576 720 5.76 33.84 5.76 8.64 "<</cupsInteger0 7/PageSize[576 720]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 7/PageSize[576 720]/ImagingBBox null>>setpagedevice"
+ CustomMedia "8.5x13/8.5x13in" 612 936 18 33.84 18 8.64 "<</cupsInteger0 10/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 10/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+
+
+
+ // Envelope
+ CustomMedia "EnvA2/A2 Envelope 4.37x5.75in" 314.64 414 9.36 40.32 9.36 40.32 "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC6/C6 Envelope 114x162mm" 323.28 459.36 9.36 40.32 9.36 40.32 "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou4/#4 Japanese Envelope 90x205mm" 254.88 581.04 9.36 40.32 9.36 40.32 "<</cupsInteger0 111/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 111/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvMonarch/Monarch Envelope 3.875x7.5in" 279 540 9.36 40.32 9.36 40.32 "<</cupsInteger0 80/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 80/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvDL/DL Envelope 110x220mm" 311.76 623.52 9.36 40.32 9.36 40.32 "<</cupsInteger0 90/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 90/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Env10/#10 Envelope 4.12x9.5in" 297 684 9.36 40.32 9.36 40.32 "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou3/#3 Japanese Envelope 120x235mm" 339.84 666 9.36 40.32 9.36 40.32 "<</cupsInteger0 110/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 110/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC5/C5 Envelope 162x229mm" 459 649 9.36 40.32 9.36 40.32 "<</cupsInteger0 91/PageSize[459 649]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 91/PageSize[459 649]/ImagingBBox null>>setpagedevice"
+
+
+
+ // Custom page sizes from 1x4in to legal
+ HWMargins 18 40.32 18 8.64
+ VariablePaperSize Yes
+ MinSize 3in 4in
+ MaxSize 8.5in 14in
+
+ // <%StingrayOJ:Normal%>
+ {
+ ModelName "HP Officejet 100 Mobile l411"
+ Attribute "NickName" "" "HP Officejet 100 Mobile l411, $Version"
+ Attribute "ShortNickName" "" "HP Officejet 100 Mobile l411"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet 100 mobile l411;DES:officejet 100 mobile l411;"
+ PCFileName "hp-officejet_100_mobile_l411.ppd"
+ Attribute "Product" "" "(HP Officejet 100 Mobile l411)"
+ }
+ // End Supported media sizes with full bleed.
+
+} // End StingrayOJ
+
+//////// Copperhead
+{
+
+ Attribute "hpPrinterLanguage" "" "pcl3gui2"
+ Attribute "HPMechOffset" "" "69"
+
+ Group "General/General"
+
+ Option "ColorModel/Output Mode" PickOne AnySetup 10.0
+ *Choice "RGB/Color" "<</cupsColorSpace 17/cupsBitsPerColor 8/cupsRowStep 0>>setpagedevice"
+ Choice "CMYGray/High Quality Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 1>>setpagedevice"
+ Choice "KGray/Black Only Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 2>>setpagedevice"
+
+ // cupsMediaType values map to MEDIATYPE from global_types.h
+ Option "MediaType/Media Type" PickOne AnySetup 10.0
+ *Choice "Plain/Plain Paper" "<</MediaType(Plain)/cupsMediaType 0>>setpagedevice"
+ Choice "Glossy/Photo Paper" "<</MediaType(Glossy)/cupsMediaType 3>>setpagedevice"
+ Choice "TransparencyFilm/Transparency Film" "<</MediaType(TransparencyFilm)/cupsMediaType 4>>setpagedevice"
+
+
+ // cupsCompression values map to QUALITY_MODE from global_types.h
+ Option "OutputMode/Print Quality" PickOne AnySetup 10.0
+ *Choice "Normal/Normal" "<</OutputType(0)/HWResolution[600 600]>>setpagedevice"
+ Choice "FastDraft/Fast Draft" "<</OutputType(-2)/HWResolution[300 300]>>setpagedevice"
+ Choice "Best/Best" "<</OutputType(1)/HWResolution[600 600]>>setpagedevice"
+ Choice "Photo/High-Resolution Photo" "<</OutputType(2)/HWResolution[1200 1200]>>setpagedevice"
+
+
+ Option "InputSlot/Media Source" PickOne AnySetup 10.0
+ *Choice "Auto/Auto-Select" "<</MediaPosition 7>>setpagedevice"
+
+ //Constraints
+ //MediaType & OutputMode
+ UIConstraints "*MediaType Plain *OutputMode MaxDPI"
+ UIConstraints "*MediaType Glossy *OutputMode FastDraft"
+ UIConstraints "*MediaType Glossy *OutputMode MaxDPI"
+ UIConstraints "*MediaType TransparencyFilm *OutputMode FastDraft"
+ UIConstraints "*MediaType TransparencyFilm *OutputMode Best"
+ UIConstraints "*MediaType TransparencyFilm *OutputMode MaxDPI"
+
+ //PaperSizes & MediaTypes
+ UIConstraints "*PageSize PhotoL.FB *MediaType Plain"
+ UIConstraints "*PageSize Photo3.5x5.FB *MediaType Plain"
+ UIConstraints "*PageSize Photo4x6.FB *MediaType Plain"
+ UIConstraints "*PageSize Photo4x6tab.FB *MediaType Plain"
+ UIConstraints "*PageSize Photo10x15.FB *MediaType Plain"
+ UIConstraints "*PageSize Photo10x15tab.FB *MediaType Plain"
+ UIConstraints "*PageSize Photo10x15tab.FB *MediaType Plain"
+ UIConstraints "*PageSize Photo3x5 *MediaType Plain"
+ UIConstraints "*PageSize PhotoL *MediaType Plain"
+ UIConstraints "*PageSize Photo3.5x5 *MediaType Plain"
+ UIConstraints "*PageSize Photo10x15 *MediaType Plain"
+ UIConstraints "*PageSize Photo4x6 *MediaType Plain"
+ UIConstraints "*PageSize Photo4x6tab *MediaType Plain"
+ UIConstraints "*PageSize Photo10x15tab *MediaType Plain"
+ UIConstraints "*PageSize Photo2L *MediaType Plain"
+ UIConstraints "*PageSize Photo13x18 *MediaType Plain"
+ UIConstraints "*PageSize Photo5x7 *MediaType Plain"
+ UIConstraints "*PageSize Photo8x10 *MediaType Plain"
+
+ UIConstraints "*PageSize Statement *MediaType Glossy"
+ UIConstraints "*PageSize A5 *MediaType Glossy"
+ UIConstraints "*PageSize JB5 *MediaType Glossy"
+ UIConstraints "*PageSize Executive *MediaType Glossy"
+ UIConstraints "*PageSize A4 *MediaType Glossy"
+ UIConstraints "*PageSize Letter *MediaType Glossy"
+ UIConstraints "*PageSize Legal *MediaType Glossy"
+ UIConstraints "*PageSize A6 *MediaType Glossy"
+ UIConstraints "*PageSize EnvChou4 *MediaType Glossy"
+ UIConstraints "*PageSize EnvMonarch *MediaType Glossy"
+ UIConstraints "*PageSize Env10 *MediaType Glossy"
+ UIConstraints "*PageSize EnvDL *MediaType Glossy"
+ UIConstraints "*PageSize EnvA2 *MediaType Glossy"
+ UIConstraints "*PageSize EnvC6 *MediaType Glossy"
+ UIConstraints "*PageSize EnvChou3 *MediaType Glossy"
+ UIConstraints "*PageSize EnvC5 *MediaType Glossy"
+ UIConstraints "*PageSize EnvC5 *MediaType Glossy"
+ UIConstraints "*PageSize Card3x5 *MediaType Glossy"
+ UIConstraints "*PageSize Card4x6 *MediaType Glossy"
+ UIConstraints "*PageSize Card5x8 *MediaType Glossy"
+ UIConstraints "*PageSize 8.5x13 *MediaType Glossy"
+
+ // 4x6 or smaller
+ CustomMedia "Card3x5/Index Card 3x5in" 216 360 9 9 9 9 "<</cupsInteger0 78/PageSize [216 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 78/PageSize[216 360]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card4x6/Index Card 4x6in" 288 432 9 9 9 9 "<</cupsInteger0 74/PageSize [288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "PhotoL/Photo L 89x127mm" 252 360 9 9 9 9 "<</cupsInteger0 121/PageSize[252 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 121/PageSize[252 360]/ImagingBBox null>>setpagedevice"
+ CustomMedia "L.FB/Borderless Photo L 89x127mm" 264.744 374.112 0 0 0 0 "<</cupsInteger0 121/cupsReal0 .079/cupsReal1 .098/PageSize [264.744 374.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 121/cupsReal0 .079/cupsReal1 .098/PageSize[264.744 374.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo3.5x5/Photo 3.5x5in" 252 360 9 9 9 9 "<</cupsInteger0 121/PageSize[252 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 121/PageSize[252 360]/ImagingBBox null>>setpagedevice"
+ CustomMedia "PhotoL.FB/Borderless Photo 3.5x5in" 264.744 374.112 0 0 0 0 "<</cupsInteger0 121/cupsReal0 .079/cupsReal1 .098/PageSize[264.744 374.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 121/cupsReal0 .079/cupsReal1 .098/PageSize[264.744 374.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6/Photo 4x6in" 288 432 9 9 9 9 "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6.FB/Borderless Photo 4x6in" 303.552 446.112 0 0 0 0 "<</cupsInteger0 74/cupsReal0 .098/cupsReal1 .098/PageSize[303.552 446.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/cupsReal0 .098/cupsReal1 .098/PageSize[303.552 446.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6tab/Photo 4x6in (tab)" 288 432 9 9 9 9 "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6tab.FB/Borderless Photo 4x6in (tab)" 303.552 446.112 0 0 0 0 "<</cupsInteger0 74/cupsReal0 .098/cupsReal1 .098/PageSize[303.552 446.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/cupsReal0 .098/cupsReal1 .098/PageSize[303.552 446.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6/A6 105x148mm" 297.36 419.76 9 9 9 9 "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6.FB/A6 Borderless 105x148mm" 310.104 433.872 0 0 0 0 "<</cupsInteger0 73/PageSize[310.104 433.872]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 73/cupsReal0 .079/cupsReal1 .098/PageSize[310.104 433.872]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki/Hagaki 100x148mm" 283.68 419.76 9 9 9 9 "<</cupsInteger0 71/PageSize[283.68 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/PageSize[283.68 419.76]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki.FB/Hagaki Borderless 100x148mm" 296.424 433.872 0 0 0 0 "<</cupsInteger0 71/PageSize[296.424 433.872]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/PageSize[296.424 433.872]/ImagingBBox null>>setpagedevice"
+
+ // 5x7
+ CustomMedia "Photo5x7/Photo 5x7in" 360 504 9 9 9 9 "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo5x7.FB/Photo Borderless 5x7in" 372.816 518.112 0 0 0 0 "<</cupsInteger0 122/PageSize[372.816 518.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/PageSize[372.816 518.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card5x8/Index Card 5x8in" 360 576 9 9 9 9 "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5/A5 148x210mm" 419.76 595.44 9 9 9 9 "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5.FB/A5 Borderless 148x210mm" 435.312 609.552 0 0 0 0 "<</cupsInteger0 25/PageSize[435.312 609.552]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/cupsReal0 .098/cupsReal1 .098/PageSize[435.312 609.552]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Cabinet/Cabinet Size 120x165mm" 339.84 468 9 9 9 9 "<</cupsInteger0 119/PageSize[339.84 468]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 119/PageSize[339.84 468]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Cabinet.FB/Cabinet Size Borderless 120x165mm" 352.584 482.112 0 0 0 0 "<</cupsInteger0 119/PageSize[352.584 482.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 119/cupsReal0 .079/cupsReal1 .098/PageSize[352.58 478.36]/ImagingBBox null>>setpagedevice"
+ CustomMedia "2L/2L 127x178mm" 360 504 9 9 9 9 "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ CustomMedia "2L.FB/2L Borderless 127x178mm" 372.816 518.112 0 0 0 0 "<</cupsInteger0 122/PageSize[372.816 518.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/cupsReal0 .089/cupsReal1 .098/PageSize[372.816 518.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Oufuku/Oufuku-Hagaki 200x148mm" 566.64 419.76 9 9 9 9 "<</cupsInteger0 72/PageSize[566.64 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 72/PageSize[566.64 419.76]/ImagingBBox null>>setpagedevice"
+
+
+ // Standard
+ CustomMedia "JB5/JB5 182x257mm" 516.24 728.64 9 9 9 9 "<</cupsInteger0 45/PageSize[516.24 728.64]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 45/PageSize [516.24 728.64]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Executive/Executive 7.25x10.5in" 522 756 9 9 9 9 "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ *CustomMedia "Letter/Letter 8.5x11in" 612 792 9 9 9 9 "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Letter.FB/Letter Borderless 8.5x11in" 627.552 806.112 0 0 0 0 "<</cupsInteger0 2/PageSize[627.552 806.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/cupsReal0 .098/cupsReal1 .098/PageSize[627.552 806.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4/A4 210x297mm" 595.44 841.68 9 9 9 9 "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4.FB/A4 Borderless 210x297mm" 610.992 855.792 0 0 0 0 "<</cupsInteger0 26/PageSize[610.992 855.792]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/cupsReal0 .098/cupsReal1 .098/PageSize[610.992 855.792]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Legal/Legal 8.5x14in" 612 1008 9 9 9 9 "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo10x15/Photo 10x15cm" 288 432 9 9 9 9 "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo10x15.FB/Borderless Photo 10x15cm" 303.552 446.112 0 0 0 0 "<</cupsInteger0 74/cupsReal0 .098/cupsReal1 .098/PageSize[303.552 446.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/cupsReal0 .098/cupsReal1 .098/PageSize[303.552 446.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo10x15tab/Photo 10x15cm (tab)" 288 432 9 9 9 9 "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo10x15tab.FB/ Borderless Photo 10x15cm (tab)" 303.552 446.112 0 0 0 0 "<</cupsInteger0 74/cupsReal0 .098/cupsReal1 .098/PageSize[303.552 446.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/cupsReal0 .098/cupsReal1 .098/PageSize[303.552 446.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo2L/Photo 2L 127x178mm" 360 504 9 9 9 9 "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo13x18/Photo 13x18cm" 360 504 9 9 9 9 "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo8x10/Photo 8x10in" 576 720 9 9 9 9 "<</cupsInteger0 7/PageSize[576 720]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 7/PageSize[576 720]/ImagingBBox null>>setpagedevice"
+ CustomMedia "8x10.FB/Borderless 8x10in" 591.552 734.112 0 0 0 0 "<</cupsInteger0 7/PageSize[591.552 734.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 7/cupsReal0 .098/cupsReal1 .098/PageSize[591.552 734.112]/ImagingBBox null>>setpagedevice"
+
+
+ // Envelope
+ CustomMedia "EnvA2/A2 Envelope 4.37x5.75in" 314.64 414 9 42.192 9 9 "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC6/C6 Envelope 114x162mm" 323.28 459.36 9 42.192 9 9 "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou4/#4 Japanese Envelope 90x205mm" 254.88 581.04 9 42.192 9 9 "<</cupsInteger0 111/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 111/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Env6/#6 Envelope 3.63x6.5in" 261.36 468 9 42.192 9 9 "<</cupsInteger0 83/PageSize[261.36 468]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 83/PageSize[261.36 468]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvCard/Card Envelope 4.4x6in" 315 432 9 42.192 9 9 "<</cupsInteger0 114/PageSize[315 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 114/PageSize[315 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvMonarch/Monarch Envelope 3.875x7.5in" 279 540 9 42.192 9 9 "<</cupsInteger0 80/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 80/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvDL/DL Envelope 110x220mm" 311.76 623.52 9 42.192 9 9 "<</cupsInteger0 90/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 90/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Env10/#10 Envelope 4.125x9.5in" 297 684 9 42.192 9 9 "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou3/#3 Japanese Envelope 120x235mm" 339.84 666 9 42.192 9 9 "<</cupsInteger0 110/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 110/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC5/C5 Envelope 162x229mm" 459.36 649.44 9 42.192 9 9 "<</cupsInteger0 91/PageSize[459.36 649.44]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 91/PageSize[459.36 649.44]/ImagingBBox null>>setpagedevice"
+
+
+
+ // Custom page sizes from 1x4in to legal
+ HWMargins 9 9 9 9
+ VariablePaperSize Yes
+ MinSize 3in 4in
+ MaxSize 8.5in 30in
+
+ // <%Copperhead:Normal%>
+ {
+ ModelName "HP Deskjet 3070 b611 Series"
+ Attribute "NickName" "" "HP Deskjet 3070 b611 Series, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 3070 b611 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 3070 b611 series;DES:deskjet 3070 b611 series;"
+ PCFileName "hp-deskjet_3070_b611_series.ppd"
+ Attribute "Product" "" "(HP Deskjet 3070 b611 Series)"
+ }
+ {
+ ModelName "HP Photosmart 5510 Series"
+ Attribute "NickName" "" "HP Photosmart 5510 Series, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 5510 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 5510 series;DES:photosmart 5510 series;"
+ PCFileName "hp-photosmart_5510_series.ppd"
+ Attribute "Product" "" "(HP Photosmart 5510 E-all-in-one)"
+ }
+ // End Supported media sizes with full bleed.
+
+ //Copperhead Auto Duplex PaperSizes
+ {
+ Attribute "cupsEvenDuplex" "" "True"
+ Attribute "cupsBackSide" "" "Rotated"
+ Attribute "cupsFlipDuplex" "" "True"
+
+
+
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 10.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "<</Duplex true/Tumble false>>setpagedevice"
+ Choice "DuplexTumble/Short Edge (Flip)" "<</Duplex true/Tumble true>>setpagedevice"
+ *Choice "None/Off" "<</Duplex false/Tumble false>>setpagedevice"
+
+
+
+ CustomMedia "Card4x6.Duplex/Index Card AutoDuplex 4x6in" 288 423 9 0 9 9 "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card5x8.Duplex/Index Card AutoDuplex 5x8in" 360 567 9 0 9 9 "<</cupsInteger0 75/PageSize[360 567]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 75/PageSize[360 567]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5.Duplex/A5 AutoDuplex 148x210mm" 419.76 586.44 9 33.192 9 42.192 "<</cupsInteger0 25/PageSize[419.76 586.44]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/PageSize[419.76 586.44]/ImagingBBox null>>setpagedevice"
+ CustomMedia "B5.Duplex/B5 AutoDuplex 176x250mm" 498.96 699.48 9 33.192 9 42.192 "<</cupsInteger0 65/PageSize[498.96 699.48]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 65/PageSize[498.96 699.48]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5.Duplex/JB5 AutoDuplex 182x257mm" 516.24 719.64 9 33.192 9 42.192 "<</cupsInteger0 45/PageSize[516.24 719.64]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 45/PageSize [516.24 719.64]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Executive.Duplex/Executive AutoDuplex 7.25x10.5in" 522 747 9 33.192 9 42.192 "<</cupsInteger0 1/PageSize[522 747]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[522 747]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4.Duplex/A4 AutoDuplex 210x297mm" 595.44 832.68 9 33.192 9 42.192 "<</cupsInteger0 26/PageSize[595.44 832.68]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/PageSize[595.44 832.68]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Letter.Duplex/Letter AutoDuplex 8.5x11in" 612 783 9 33.192 9 42.192 "<</cupsInteger0 2/PageSize[612 783]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/PageSize[612 783]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki.Duplex/Hagaki AutoDuplex 100x148mm" 283.68 410.76 9 0 9 9 "<</cupsInteger0 71/PageSize[283.68 410.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/PageSize[283.68 410.76]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Oufuku.Duplex/Oufuku-Hagaki AutoDuplex 200x148mm" 566.64 410.76 9 0 9 9 "<</cupsInteger0 72/PageSize[566.64 410.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 72/PageSize[566.64 410.76]/ImagingBBox null>>setpagedevice"
+ // <%Copperhead:AutoDuplex%>
+ {
+ ModelName "HP Photosmart 5510d Series"
+ Attribute "NickName" "" "HP Photosmart 5510d Series, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 5510d Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 5510d series;DES:photosmart 5510d series;"
+ PCFileName "hp-photosmart_5510d_series.ppd"
+ Attribute "Product" "" "(HP Photosmart 5510d E-all-in-one)"
+ }
+ {
+ ModelName "HP Photosmart 6510 Series"
+ Attribute "NickName" "" "HP Photosmart 6510 Series, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 6510 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 6510 series;DES:photosmart 6510 series;"
+ PCFileName "hp-photosmart_6510_series.ppd"
+ Attribute "Product" "" "(HP Photosmart 6510 E-all-in-one)"
+ }
+ }
+} // End Copperhead
+
+
+
+//////// Saipan
+{
+
+ Attribute "hpPrinterLanguage" "" "pcl3gui2"
+ Attribute "HPMechOffset" "" "130"
+
+ Group "General/General"
+
+ Option "ColorModel/Output Mode" PickOne AnySetup 10.0
+ *Choice "RGB/Color" "<</cupsColorSpace 17/cupsBitsPerColor 8/cupsRowStep 0>>setpagedevice"
+ Choice "CMYGray/High Quality Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 1>>setpagedevice"
+ Choice "KGray/Black Only Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 2>>setpagedevice"
+
+ // cupsMediaType values map to MEDIATYPE from global_types.h
+ Option "MediaType/Media Type" PickOne AnySetup 10.0
+ *Choice "Plain/Plain Paper" "<</MediaType(Plain)/cupsMediaType 0>>setpagedevice"
+ Choice "Glossy/Photo Paper" "<</MediaType(Glossy)/cupsMediaType 3>>setpagedevice"
+ Choice "TransparencyFilm/Transparency Film" "<</MediaType(TransparencyFilm)/cupsMediaType 4>>setpagedevice"
+
+
+ // cupsCompression values map to QUALITY_MODE from global_types.h
+ Option "OutputMode/Print Quality" PickOne AnySetup 10.0
+ *Choice "Normal/Normal" "<</OutputType(0)/HWResolution[600 600]>>setpagedevice"
+ Choice "Draft/Draft" "<</OutputType(-2)/HWResolution[300 300]>>setpagedevice"
+ Choice "Best/Best" "<</OutputType(1)/HWResolution[600 600]>>setpagedevice"
+ Choice "Photo/High-Resolution Photo" "<</OutputType(2)/HWResolution[1200 1200]>>setpagedevice"
+
+
+ Option "InputSlot/Media Source" PickOne AnySetup 10.0
+ *Choice "Tray1/Tray 1" "<</MediaPosition 1>>setpagedevice"
+
+ //Constraints
+ //MediaType & OutputMode
+ UIConstraints "*MediaType Plain *OutputMode MaxDPI"
+ UIConstraints "*MediaType Glossy *OutputMode FastDraft"
+ UIConstraints "*MediaType Glossy *OutputMode MaxDPI"
+ UIConstraints "*MediaType TransparencyFilm *OutputMode FastDraft"
+ UIConstraints "*MediaType TransparencyFilm *OutputMode Best"
+ UIConstraints "*MediaType TransparencyFilm *OutputMode MaxDPI"
+
+ // 4x6 or smaller
+ CustomMedia "Card3x5/Index Card 3x5in" 216 360 9.36 9.36 9.36 9.36 "<</cupsInteger0 78/PageSize [216 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 78/PageSize[216 360]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card4x6/Index Card 4x6in" 288 432 9.36 9.36 9.36 9.36 "<</cupsInteger0 74/PageSize [288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "L/L 89x127mm" 252.288 360 9.36 9.36 9.36 9.36 "<</cupsInteger0 121/PageSize[252.288 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 121/PageSize[252.288 360]/ImagingBBox null>>setpagedevice"
+ CustomMedia "L.FB/Borderless Photo L 89x127mm" 265.032 374.112 0 0 0 0 "<</cupsInteger0 121/cupsReal0 .079/cupsReal1 .098/PageSize [265.032 374.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 121/cupsReal0 .079/cupsReal1 .098/PageSize[265.032 374.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6/Photo 4x6in" 288 432 9.36 9.36 9.36 9.36 "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6.FB/Borderless Photo 4x6in" 303.552 446.112 0 0 0 0 "<</cupsInteger0 74/cupsReal0 .098/cupsReal1 .098/PageSize[303.552 446.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/cupsReal0 .098/cupsReal1 .098/PageSize[303.552 446.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6/A6 105x148mm" 297.65 419.54 9.36 9.36 9.36 9.36 "<</cupsInteger0 73/PageSize[297.65 419.54]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 73/PageSize[297.65 419.54]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6.FB/A6 Borderless 105x148mm" 310.392 433.656 0 0 0 0 "<</cupsInteger0 73/PageSize[310.392 433.656]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 73/cupsReal0 .079/cupsReal1 .098/PageSize[310.392 433.656]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki/Hagaki card 100x148mm" 283.46 419.54 9.36 9.36 9.36 9.36 "<</cupsInteger0 71/PageSize[283.46 419.54]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/PageSize[283.46 419.54]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki.FB/Hagaki Borderless 100x148mm" 297.864 433.656 0 0 0 0 "<</cupsInteger0 71/PageSize[297.864 433.656]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/PageSize[297.864 433.656]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo3x5/Photo 3x5in" 216 360 9.36 9.36 9.36 9.36 "<</cupsInteger0 78/PageSize [216 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 78/PageSize[216 360]/ImagingBBox null>>setpagedevice"
+
+ // 5x7
+ CustomMedia "Photo5x7/Photo 5x7in" 360 504 9.36 9.36 9.36 9.36 "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo13x18/Photo 13x18cm" 360 504 9.36 9.36 9.36 9.36 "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo5x7.FB/Photo Borderless 5x7in" 372.816 518.112 0 0 0 0 "<</cupsInteger0 122/PageSize[372.816 518.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/PageSize[372.816 518.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo13x18.FB/Photo Borderless 13x18cm" 372.816 518.112 0 0 0 0 "<</cupsInteger0 122/PageSize[372.816 518.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/PageSize[372.816 518.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card5x8/Index Card 5x8in" 360 576 9.36 9.36 9.36 9.36 "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5/A5 148x210mm" 419.544 595.296 9.36 9.36 9.36 9.36 "<</cupsInteger0 25/PageSize[419.544 595.296]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/PageSize[419.544 595.296]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5.FB/A5 Borderless 148x210mm" 435.096 609.408 0 0 0 0 "<</cupsInteger0 25/PageSize[435.096 609.408]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/cupsReal0 .098/cupsReal1 .098/PageSize[435.096 609.408]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Ofuku/Ofuku-Hagaki 200x148mm" 566.92 419.54 9.36 9.36 9.36 9.36 "<</cupsInteger0 72/PageSize[566.92 419.54]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 72/PageSize[566.92 419.54]/ImagingBBox null>>setpagedevice"
+
+ // Standard
+ CustomMedia "Photo2L.FB/2L Borderless 127x178mm" 372.81 518.328 0 0 0 0 "<</cupsInteger0 122/PageSize[372.81 518.328]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/cupsReal0 .089/cupsReal1 .098/PageSize[372.81 518.328]/ImagingBBox null>>setpagedevice"
+ CustomMedia "6x8/6x8in" 432 576 9.36 9.36 9.36 9.36 "<</cupsInteger0 101/PageSize[432 576]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[432 576]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5/JB5 182x257mm" 515.88 728.49 9.36 9.36 9.36 9.36 "<</cupsInteger0 45/PageSize[515.88 728.49]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 45/PageSize [515.88 728.49]/ImagingBBox null>>setpagedevice"
+ CustomMedia "B5.FB/B5 Borderless 176x250mm" 531.432 742.608 0 0 0 0 "<</cupsInteger0 65/PageSize[531.432 742.608]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 65/cupsReal0 .098/cupsReal1 .098/PageSize[531.432 742.608]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Executive/Executive 7.25x10.5in" 522 756 9.36 9.36 9.36 9.36 "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Statement/Statement 5.5x8.5in" 396 612 9.36 9.36 9.36 9.36 "<</cupsInteger0 15/PageSize[396 612]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 15/PageSize[396 612]/ImagingBBox null>>setpagedevice"
+ *CustomMedia "Letter/Letter 8.5x11in" 612 792 9.36 9.36 9.36 9.36 "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Letter.FB/Letter Borderless 8.5x11in" 627.552 806.112 0 0 0 0 "<</cupsInteger0 2/PageSize[627.552 806.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/cupsReal0 .098/cupsReal1 .098/PageSize[627.552 806.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "CardLetter/Index Card Letter 8.5x11in" 612 792 9.36 9.36 9.36 9.36 "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4/A4 210x297mm" 595.29 841.89 9.36 9.36 9.36 9.36 "<</cupsInteger0 26/PageSize[595.29 841.89]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/PageSize[595.29 841.89]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4.FB/A4 Borderless 210x297mm" 610.848 856.008 0 0 0 0 "<</cupsInteger0 26/PageSize[610.848 856.008]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/cupsReal0 .098/cupsReal1 .098/PageSize[610.848 856.008]/ImagingBBox null>>setpagedevice"
+ CustomMedia "CardA4/Index Card A4 210x297mm" 595.44 841.68 9.36 9.36 9.36 9.36 "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Legal/Legal 8.5x14in" 612 1008 9.36 9.36 9.36 9.36 "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo10x15/Photo 10x15cm" 288 432 9.36 9.36 9.36 9.36 "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo10x15.FB/Borderless Photo 10x15cm" 303.552 446.112 0 0 0 0 "<</cupsInteger0 74/cupsReal0 .098/cupsReal1 .098/PageSize[303.552 446.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/cupsReal0 .098/cupsReal1 .098/PageSize[303.552 446.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo2L/Photo 2L 127x178mm" 360 504.216 9.36 9.36 9.36 9.36 "<</cupsInteger0 122/PageSize[360 504.216]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/PageSize[360 504.216]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo8x10/Photo 8x10in" 576 720 9.36 9.36 9.36 9.36 "<</cupsInteger0 7/PageSize[576 720]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 7/PageSize[576 720]/ImagingBBox null>>setpagedevice"
+ CustomMedia "8x10.FB/Borderless 8x10in" 591.552 734.112 0 0 0 0 "<</cupsInteger0 7/PageSize[591.552 734.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 7/cupsReal0 .098/cupsReal1 .098/PageSize[591.552 734.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "8.5x13/8.5x13in" 612 936 9.36 9.36 9.36 9.36 "<</cupsInteger0 101/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+
+ // Envelope
+ CustomMedia "EnvA2/A2 Envelope 4.37x5.75in" 314.64 413.856 9.36 46.8 9.36 46.8 "<</cupsInteger0 109/PageSize[314.64 413.856]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 109/PageSize[314.64 413.856]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC6/C6 Envelope 114x162mm" 323.136 459.216 9.36 46.8 9.36 46.8 "<</cupsInteger0 92/PageSize[323.136 459.216]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 92/PageSize[323.136 459.216]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou4/#4 Japanese Envelope 90x205mm" 255.096 581.112 9.36 46.8 9.36 46.8 "<</cupsInteger0 111/PageSize[255.096 581.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 111/PageSize[255.096 581.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvCard/Card Envelope 4.4x6in" 316.8 432 9.36 46.8 9.36 46.8 "<</cupsInteger0 114/PageSize[316.8 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 114/PageSize[316.8 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvMonarch/Monarch Envelope 3.875x7.5in" 279.36 540 9.36 46.8 9.36 46.8 "<</cupsInteger0 80/PageSize[279.36 540]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 80/PageSize[279.36 540]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvDL/DL Envelope 110x220mm" 311.832 623.592 9.36 46.8 9.36 46.8 "<</cupsInteger0 90/PageSize[311.832 623.592]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 90/PageSize[311.832 623.592]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Env10/#10 Envelope 4.125x9.5in" 297.36 684 9.36 46.8 9.36 46.8 "<</cupsInteger0 81/PageSize[297.36 684]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 81/PageSize[297.36 684]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou3/#3 Japanese Envelope 120x235mm" 340.128 666.144 9.36 46.8 9.36 46.8 "<</cupsInteger0 110/PageSize[340.128 666.144]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 110/PageSize[340.128 666.144]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC5/C5 Envelope 162x229mm" 459.216 649.152 9.36 46.8 9.36 46.8 "<</cupsInteger0 91/PageSize[459.216 649.152]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 91/PageSize[459.216 649.152]/ImagingBBox null>>setpagedevice"
+
+ // Custom page sizes from 1x4in to legal
+ HWMargins 9.36 9.36 9.36 9.36
+ VariablePaperSize Yes
+ MinSize 3in 5in
+ MaxSize 8.5in 14in
+
+ // <%Saipan:Normal%>
+ {
+ ModelName "HP Officejet 6100"
+ Attribute "NickName" "" "HP Officejet 6100, $Version"
+ Attribute "ShortNickName" "" "HP Officejet 6100"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet 6100;DES:officejet 6100;"
+ PCFileName "hp-officejet_6100.ppd"
+ Attribute "Product" "" "(HP Officejet 6100 Eprinter h611a)"
+ }
+ {
+ ModelName "HP Officejet 6600"
+ Attribute "NickName" "" "HP Officejet 6600, $Version"
+ Attribute "ShortNickName" "" "HP Officejet 6600"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet 6600;DES:officejet 6600;"
+ PCFileName "hp-officejet_6600.ppd"
+ Attribute "Product" "" "(HP Officejet 6600 E-all-in-one Printer - h711a)"
+ }
+ // End Supported media sizes with full bleed.
+
+ //Saipan Auto Duplex PaperSizes
+ {
+ Attribute "cupsEvenDuplex" "" "True"
+ Attribute "cupsBackSide" "" "Rotated"
+ Attribute "cupsFlipDuplex" "" "True"
+
+ // Duplexer is optional...
+ Installable "OptionDuplex/Duplexer Installed"
+
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 10.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "<</Duplex true/Tumble false>>setpagedevice"
+ Choice "DuplexTumble/Short Edge (Flip)" "<</Duplex true/Tumble true>>setpagedevice"
+ *Choice "None/Off" "<</Duplex false/Tumble false>>setpagedevice"
+
+ // Non duplex media against duplex
+ UIConstraints "*PageSize Card3x5 *Duplex"
+ UIConstraints "*PageSize L *Duplex"
+ UIConstraints "*PageSize L.FB *Duplex"
+ UIConstraints "*PageSize Hagaki *Duplex"
+ UIConstraints "*PageSize Hagaki.FB *Duplex"
+ UIConstraints "*PageSize Card4x6 *Duplex"
+ UIConstraints "*PageSize Photo4x6 *Duplex"
+ UIConstraints "*PageSize Photo4x6.FB *Duplex"
+ UIConstraints "*PageSize A6 *Duplex"
+ UIConstraints "*PageSize A6.FB *Duplex"
+ UIConstraints "*PageSize Photo5x7 *Duplex"
+ UIConstraints "*PageSize Photo5x7.FB *Duplex"
+ UIConstraints "*PageSize Photo2L *Duplex"
+ UIConstraints "*PageSize Photo2L.FB *Duplex"
+ UIConstraints "*PageSize Card5x8 *Duplex"
+ UIConstraints "*PageSize Oufuku *Duplex"
+ UIConstraints "*PageSize A5 *Duplex"
+ UIConstraints "*PageSize A5.FB *Duplex"
+ UIConstraints "*PageSize B5 *Duplex"
+ UIConstraints "*PageSize B5.FB *Duplex"
+ UIConstraints "*PageSize JB5 *Duplex"
+ UIConstraints "*PageSize JB5.FB *Duplex"
+ UIConstraints "*PageSize Executive *Duplex"
+ UIConstraints "*PageSize 8x10 *Duplex"
+ UIConstraints "*PageSize 8x10.FB *Duplex"
+ UIConstraints "*PageSize Letter.FB *Duplex"
+ UIConstraints "*PageSize A4.FB *Duplex"
+ UIConstraints "*PageSize Legal *Duplex"
+ UIConstraints "*PageSize EnvA2 *Duplex"
+ UIConstraints "*PageSize EnvC6 *Duplex"
+ UIConstraints "*PageSize EnvChou4 *Duplex"
+ UIConstraints "*PageSize EnvCard *Duplex"
+ UIConstraints "*PageSize EnvMonarch *Duplex"
+ UIConstraints "*PageSize EnvDL *Duplex"
+ UIConstraints "*PageSize Env10 *Duplex"
+ UIConstraints "*PageSize EnvChou3 *Duplex"
+ UIConstraints "*PageSize EnvC5 *Duplex"
+ UIConstraints "*PageSize Statement *Duplex"
+ UIConstraints "*PageSize Photo10x15 *Duplex"
+ UIConstraints "*PageSize Photo10x15.FB *Duplex"
+ UIConstraints "*PageSize Photo13x18 *Duplex"
+ UIConstraints "*PageSize Photo13x18.FB *Duplex"
+ UIConstraints "*PageSize 6X8 *Duplex"
+ UIConstraints "*PageSize 8.5X13 *Duplex"
+
+ CustomMedia "A4.Duplex/A4 AutoDuplex 210x297mm" 595.29 799.34 9.36 33.192 9.36 9.36 "<</cupsInteger0 26/PageSize[595.29 799.34]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/PageSize[595.29 799.34]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Letter.Duplex/Letter AutoDuplex 8.5x11in" 612 749.44 9.36 33.192 9.36 9.36 "<</cupsInteger0 2/PageSize[612 749.44]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/PageSize[612 749.44]/ImagingBBox null>>setpagedevice"
+ CustomMedia "CardA4/Index Card A4 210x297mm AutoDuplex" 595.44 799.13 9.36 33.192 9.36 9.36 "<</cupsInteger0 26/PageSize[595.44 799.13]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/PageSize[595.44 799.13]/ImagingBBox null>>setpagedevice"
+ CustomMedia "CardLetter/Index Card Letter 8.5x11in AutoDuplex" 612 749.44 9.36 33.192 9.36 9.36 "<</cupsInteger0 2/PageSize[612 749.44]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/PageSize[612 749.44]/ImagingBBox null>>setpagedevice"
+
+ // <%Saipan:AutoDuplex%>
+ {
+ ModelName "HP Officejet 6700"
+ Attribute "NickName" "" "HP Officejet 6700, $Version"
+ Attribute "ShortNickName" "" "HP Officejet 6700"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet 6700;DES:officejet 6700;"
+ PCFileName "hp-officejet_6700.ppd"
+ Attribute "Product" "" "(HP Officejet 6700 E-all-in-one Printer - h711n)"
+ }
+ }
+
+} // End Saipan
+
+
+
+//////// Python11
+{
+ Attribute "cupsEvenDuplex" "" "True"
+ Attribute "cupsBackSide" "" "Rotated"
+ Attribute "cupsFlipDuplex" "" "True"
+ Attribute "hpPrinterLanguage" "" "pcl3gui2"
+ Attribute "HPMechOffset" "" "69"
+
+ Group "General/General"
+
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 10.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "<</Duplex true/Tumble false>>setpagedevice"
+ Choice "DuplexTumble/Short Edge (Flip)" "<</Duplex true/Tumble true>>setpagedevice"
+ *Choice "None/Off" "<</Duplex false/Tumble false>>setpagedevice"
+
+
+ Option "ColorModel/Output Mode" PickOne AnySetup 10.0
+ Choice "CMYGray/High Quality Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 1>>setpagedevice"
+ Choice "KGray/Black Only Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 2>>setpagedevice"
+ *Choice "RGB/Color" "<</cupsColorSpace 17/cupsBitsPerColor 8/cupsRowStep 0>>setpagedevice"
+
+ // cupsMediaType values map to MEDIATYPE from global_types.h
+ Option "MediaType/Media Type" PickOne AnySetup 10.0
+ *Choice "Automatic/Automatic" "<</MediaType(Automatic)/cupsMediaType -1>>setpagedevice"
+ Choice "Plain/Plain Paper" "<</MediaType(Plain)/cupsMediaType 0>>setpagedevice"
+ Choice "Glossy/Photo Paper" "<</MediaType(Glossy)/cupsMediaType 3>>setpagedevice"
+ Choice "TransparencyFilm/Transparency Film" "<</MediaType(TransparencyFilm)/cupsMediaType 4>>setpagedevice"
+
+ Option "OutputMode/Print Quality" PickOne AnySetup 10.0
+ Choice "Auto/Automatic" "<</OutputType(-3)/HWResolution[600 600]>>setpagedevice"
+ Choice "FastDraft/Fast Draft" "<</OutputType(-2)/HWResolution[300 300]>>setpagedevice"
+ *Choice "Normal/Normal" "<</OutputType(0)/HWResolution[600 600]>>setpagedevice"
+ Choice "Best/Best" "<</OutputType(1)/HWResolution[600 600]>>setpagedevice"
+ Choice "Photo/High-Resolution Photo" "<</OutputType(2)/HWResolution[1200 1200]>>setpagedevice"
+
+ Option "InputSlot/Media Source" PickOne AnySetup 10.0
+ *Choice "Auto/Auto-Select" "<</MediaPosition 7>>setpagedevice"
+ Choice "PhotoTray/Photo Tray" "<</MediaPosition 6>>setpagedevice"
+ Choice "Upper/Main Tray" "<</MediaPosition 1>>setpagedevice"
+
+
+
+ // Duplexer is optional...
+ Installable "OptionDuplex/Duplexer Installed"
+
+ // Constraints
+ UIConstraints "*Duplex *OptionDuplex False"
+ UIConstraints "*MediaType Automatic *OutputMode FastDraft"
+ UIConstraints "*MediaType Glossy *OutputMode FastDraft"
+ UIConstraints "*MediaType TransparencyFilm *OutputMode FastDraft"
+ UIConstraints "*MediaType TransparencyFilm *OutputMode Best"
+
+ // Non duplex media against duplex
+ UIConstraints "*PageSize Card3x5 *Duplex"
+ UIConstraints "*PageSize PhotoL *Duplex"
+ UIConstraints "*PageSize PhotoL.FB *Duplex"
+ UIConstraints "*PageSize Hagaki *Duplex"
+ UIConstraints "*PageSize Hagaki.FB *Duplex"
+ UIConstraints "*PageSize Card4x6 *Duplex"
+ UIConstraints "*PageSize Photo4x6 *Duplex"
+ UIConstraints "*PageSize Photo4x6.FB *Duplex"
+ UIConstraints "*PageSize A6 *Duplex"
+ UIConstraints "*PageSize A6.FB *Duplex"
+ UIConstraints "*PageSize HV *Duplex"
+ UIConstraints "*PageSize HV.FB *Duplex"
+ UIConstraints "*PageSize Photo5x7 *Duplex"
+ UIConstraints "*PageSize Photo5x7.FB *Duplex"
+ UIConstraints "*PageSize Photo2L *Duplex"
+ UIConstraints "*PageSize Photo2L.FB *Duplex"
+ UIConstraints "*PageSize Card5x8 *Duplex"
+ UIConstraints "*PageSize Oufuku *Duplex"
+ UIConstraints "*PageSize Cabinet *Duplex"
+ UIConstraints "*PageSize Cabinet.FB *Duplex"
+ UIConstraints "*PageSize A5 *Duplex"
+ UIConstraints "*PageSize A5.FB *Duplex"
+ UIConstraints "*PageSize B5 *Duplex"
+ UIConstraints "*PageSize JB5 *Duplex"
+ UIConstraints "*PageSize JB5.FB *Duplex"
+ UIConstraints "*PageSize Executive *Duplex"
+ UIConstraints "*PageSize 8x10 *Duplex"
+ UIConstraints "*PageSize Letter *Duplex"
+ UIConstraints "*PageSize Letter.FB *Duplex"
+ UIConstraints "*PageSize A4 *Duplex"
+ UIConstraints "*PageSize A4.FB *Duplex"
+ UIConstraints "*PageSize Legal *Duplex"
+ UIConstraints "*PageSize EnvA2 *Duplex"
+ UIConstraints "*PageSize EnvC6 *Duplex"
+ UIConstraints "*PageSize EnvChou4 *Duplex"
+ UIConstraints "*PageSize Env6 *Duplex"
+ UIConstraints "*PageSize EnvCard *Duplex"
+ UIConstraints "*PageSize EnvMonarch *Duplex"
+ UIConstraints "*PageSize EnvDL *Duplex"
+ UIConstraints "*PageSize Env10 *Duplex"
+ UIConstraints "*PageSize EnvChou3 *Duplex"
+ UIConstraints "*PageSize EnvC5 *Duplex"
+
+ // Constraint FB against FastDraft
+ UIConstraints "*PageSize PhotoL.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize L.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize Hagaki.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize Photo4x6.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize A6.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize HV.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize Photo5x7.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize Photo2L.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize Cabinet.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize A5.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize JB5.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize Letter.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize A4.FB *OutputMode FastDraft"
+
+// 4x6 or smaller
+ CustomMedia "Card3x5/Index Card 3x5in" 216 360 9 9 9 9 "<</cupsInteger0 78/PageSize [216 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 78/PageSize[216 360]/ImagingBBox null>>setpagedevice"
+ CustomMedia "PhotoL/Photo 3.5x5in" 252 360 9 9 9 9 "<</cupsInteger0 121/PageSize[252 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 121/PageSize[252 360]/ImagingBBox null>>setpagedevice"
+ CustomMedia "PhotoL.FB/Photo Borderless 3.5x5in" 264.744 374.112 0 0 0 0 "<</cupsInteger0 121/PageSize[264.744 374.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 121/cupsReal0 .079/cupsReal1 .098/PageSize[264.744 374.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "L/L 89x127mm" 252 360 9 9 9 9 "<</cupsInteger0 121/PageSize[252 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 121/PageSize[252 360]/ImagingBBox null>>setpagedevice"
+ CustomMedia "L.FB/L Borderless 89x127mm" 264.744 374.112 0 0 0 0 "<</cupsInteger0 121/PageSize[264.744 374.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 121/cupsReal0 .079/cupsReal1 .098/PageSize[264.744 374.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki/Hagaki 100x148mm" 283.68 419.76 9 9 9 9 "<</cupsInteger0 71/PageSize[283.68 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/PageSize[283.68 419.76]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki.FB/Hagaki Borderless 100x148mm" 296.424 433.872 0 0 0 0 "<</cupsInteger0 71/PageSize[296.424 433.872]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/cupsReal0 .079/cupsReal1 .098/PageSize[296.424 433.872]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card4x6/Index Card 4x6in" 288 432 9 9 9 9 "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6/Photo 4x6in" 288 432 9 9 9 9 "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6.FB/Photo Borderless 4x6in" 303.552 446.112 0 0 0 0 "<</cupsInteger0 74/PageSize[303.552 446.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/cupsReal0 .098/cupsReal1 .098/PageSize[303.552 446.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6tab/Photo 4x6in (tab)" 288 432 9 9 9 9 "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6tab.FB/Photo Borderless 4x6in (tab)" 303.55 446.11 0 0 0 0 "<</cupsInteger0 74/PageSize[303.55 446.11]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/cupsReal0 .098/cupsReal1 .098/PageSize[303.55 446.11]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6/A6 105x148mm" 297.36 419.76 9 9 9 9 "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6.FB/A6 Borderless 105x148mm" 310.104 433.872 0 0 0 0 "<</cupsInteger0 73/PageSize[310.104 433.872]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 73/cupsReal0 .079/cupsReal1 .098/PageSize[310.104 433.872]/ImagingBBox null>>setpagedevice"
+
+// 5x7
+ CustomMedia "Photo5x7/Photo 5x7in" 360 504 9 9 9 9 "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo5x7.FB/Photo Borderless 5x7in" 372.816 518.112 0 0 0 0 "<</cupsInteger0 122/PageSize[372.816 518.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/cupsReal0 .089/cupsReal1 .098/PageSize[372.816 518.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo2L/Photo 2L 127x178mm" 360 504 9 9 9 9 "<</cupsInteger0 126/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 126/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo2L.FB/Photo 2L Borderless 127x178mm" 372.816 518.112 0 0 0 0 "<</cupsInteger0 126/PageSize[372.816 518.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 126/cupsReal0 .089/cupsReal1 .098/PageSize[372.816 518.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card5x8/Index Card 5x8in" 360 576 9 9 9 9 "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Ofuku/Ofuku-Hagaki 200x148mm" 566.64 419.76 9 9 9 9 "<</cupsInteger0 72/PageSize[566.64 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 72/PageSize[566.64 419.76]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Cabinet/Cabinet Size 165x120mm" 339.84 468 9 9 9 9 "<</cupsInteger0 119/PageSize[339.84 468]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 119/PageSize[339.84 468]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Cabinet.FB/Cabinet Size 120x165 Borderless" 352.584 482.112 0 0 0 0 "<</cupsInteger0 119/PageSize[352.584 482.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 119/cupsReal0 .079/cupsReal1 .098/PageSize[352.584 482.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5/A5 148x210mm" 419.76 595.44 9 9 9 9 "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5.FB/A5 Borderless 148x210mm" 435.312 609.552 0 0 0 0 "<</cupsInteger0 25/PageSize[435.312 609.552]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/cupsReal0 .098/cupsReal1 .098/PageSize[435.312 609.552]/ImagingBBox null>>setpagedevice"
+
+// Standard
+ CustomMedia "B5/B5 176x250mm" 498.96 708.48 9 9 9 9 "<</cupsInteger0 65/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 65/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ CustomMedia "B5.Duplex/B5 AutoDuplex 176x250mm" 498.96 699.48 9 33.192 9 42.192 "<</cupsInteger0 65/PageSize[498.96 699.48]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 65/PageSize[498.96 699.48]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5/JB5 182x257mm" 516.24 728.64 9 9 9 9 "<</cupsInteger0 45/PageSize[516.24 728.64]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 45/PageSize [516.24 728.64]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5.Duplex/JB5 AutoDuplex 182x257mm" 516.24 719.64 9 33.192 9 42.192 "<</cupsInteger0 45/PageSize[516.24 719.64]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 45/PageSize [516.24 719.64]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Executive/Executive 7.25x10.5in" 522 756 9 9 9 9 "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Executive.Duplex/Executive AutoDuplex 7.25x10.5in" 522 747 9 33.192 9 42.192 "<</cupsInteger0 1/PageSize[522 747]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[522 747]/ImagingBBox null>>setpagedevice"
+ CustomMedia "8x10/8x10in" 576 720 9 9 9 9 "<</cupsInteger0 7/PageSize[576 720]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 7/PageSize[576 720]/ImagingBBox null>>setpagedevice"
+ CustomMedia "8x10.FB/Borderless 8x10in" 591.552 734.112 0 0 0 0 "<</cupsInteger0 7/PageSize[591.552 734.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 7/cupsReal0 .098/cupsReal1 .098/PageSize[591.552 734.112]/ImagingBBox null>>setpagedevice"
+ *CustomMedia "Letter/Letter 8.5x11in" 612 792 9 9 9 9 "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Letter.FB/Letter Borderless 8.5x11in" 627.552 806.112 0 0 0 0 "<</cupsInteger0 2/PageSize[627.552 806.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/cupsReal0 .098/cupsReal1 .098/PageSize[627.552 806.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Letter.Duplex/Letter AutoDuplex 8.5x11in" 612 783 9 33.192 9 42.192 "<</cupsInteger0 2/PageSize[612 783]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/PageSize[612 783]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4/A4 210x297mm" 595.44 841.68 9 9 9 9 "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4.FB/A4 Borderless 210x297mm" 610.992 855.792 0 0 0 0 "<</cupsInteger0 26/PageSize[610.992 855.792]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/cupsReal0 .098/cupsReal1 .098/PageSize[610.992 855.792]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4.Duplex/A4 AutoDuplex 210x297mm" 595.44 832.68 9 33.192 9 42.192 "<</cupsInteger0 26/PageSize[595.44 832.68]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/PageSize[595.44 832.68]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Legal/Legal 8.5x14in" 612 1008 9 9 9 9 "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo10x15/Photo 10x15cm" 288 432 9 9 9 9 "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo10x15.FB/Borderless Photo 10x15cm" 303.552 446.112 0 0 0 0 "<</cupsInteger0 74/cupsReal0 .098/cupsReal1 .098/PageSize[303.552 446.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/cupsReal0 .098/cupsReal1 .098/PageSize[303.552 446.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo10x15tab/Photo 10x15cm (tab)" 288 432 9 9 9 9 "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo10x15tab.FB/ Borderless Photo 10x15cm (tab)" 303.552 446.112 0 0 0 0 "<</cupsInteger0 74/cupsReal0 .098/cupsReal1 .098/PageSize[303.552 446.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/cupsReal0 .098/cupsReal1 .098/PageSize[303.552 446.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo13x18/Photo 13x18cm" 360 504 9 9 9 9 "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo13x18.FB/Borderless Photo 13x18cm" 372.816 518.112 0 0 0 0 "<</cupsInteger0 122/PageSize[372.816 518.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/cupsReal0 .089/cupsReal1 .098/PageSize[372.816 518.112]/ImagingBBox null>>setpagedevice"
+
+// Envelope
+ CustomMedia "EnvA2/A2 Envelope 4.37x5.75in" 314.64 414 9 42.192 9 9 "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC6/C6 Envelope 114x162mm" 323.28 459.36 9 42.192 9 9 "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou4/#4 Japanese Envelope 90x205mm" 254.88 581.04 9 42.192 9 9 "<</cupsInteger0 111/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 111/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Env6/#6 Envelope 3.63x6.5in" 261.36 468 9 42.192 9 9 "<</cupsInteger0 83/PageSize[261.36 468]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 83/PageSize[261.36 468]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvCard/Card Envelope 4.4x6in" 316.8 432 9 42.192 9 9 "<</cupsInteger0 114/PageSize[316.8 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 114/PageSize[316.8 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvMonarch/Monarch Envelope 3.875x7.5in" 279 540 9 42.192 9 9 "<</cupsInteger0 80/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 80/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvDL/DL Envelope 110x220mm" 311.76 623.52 9 42.192 9 9 "<</cupsInteger0 90/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 90/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Env10/#10 Envelope 4.125x9.5in" 297 684 9 42.192 9 9 "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou3/#3 Japanese Envelope 120x235mm" 339.84 666 9 42.192 9 9 "<</cupsInteger0 110/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 110/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC5/C5 Envelope 162x229mm" 459.36 649.44 9 42.192 9 9 "<</cupsInteger0 91/PageSize[459.36 649.44]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 91/PageSize[459.36 649.44]/ImagingBBox null>>setpagedevice"
+
+ // Custom page sizes from 3x4in to Legal
+ HWMargins 9 9 9 9
+ VariablePaperSize Yes
+ MinSize 3in 4in
+ MaxSize 8.5in 30in
+
+ // <%Python11:Normal%>
+ {
+ ModelName "HP Photosmart 7510 Series"
+ Attribute "NickName" "" "HP Photosmart 7510 Series, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 7510 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 7510 series;DES:photosmart 7510 series;"
+ PCFileName "hp-photosmart_7510_series.ppd"
+ Attribute "Product" "" "(HP Photosmart 7510 E-all-in-one)"
+ }
+
+} // End Python11
+
+
+//////// ViperPlusVIP
+{
+ Attribute "hpPrinterLanguage" "" "pcl3gui2"
+ Attribute "HPMechOffset" "" "70"
+
+ Group "General/General"
+
+ // MediaPosition values map to MediaSource enumeration in global_types.h
+ Option "InputSlot/Media Source" PickOne AnySetup 10.0
+ *Choice "Auto/Auto-Select" "<</MediaPosition 7>>setpagedevice"
+ Choice "Main/Main Tray" "<</MediaPosition 1>>setpagedevice"
+
+ Option "ColorModel/Output Mode" PickOne AnySetup 10.0
+ *Choice "RGB/Color" "<</cupsColorSpace 17/cupsBitsPerColor 8/cupsRowStep 0>>setpagedevice"
+ Choice "CMYGray/High Quality Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 1>>setpagedevice"
+ Choice "KGray/Black Only Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 2>>setpagedevice"
+
+ // cupsMediaType values map to MEDIATYPE from global_types.h
+ Option "MediaType/Media Type" PickOne AnySetup 10.0
+ *Choice "Plain/Plain Paper" "<</MediaType(Plain)/cupsMediaType 0>>setpagedevice"
+ Choice "Glossy/Photo Paper" "<</MediaType(Glossy)/cupsMediaType 3>>setpagedevice"
+ Choice "TransparencyFilm/Transparency Film" "<</MediaType(TransparencyFilm)/cupsMediaType 4>>setpagedevice"
+
+ // cupsCompression values map to QUALITY_MODE from global_types.h
+ Option "OutputMode/Print Quality" PickOne AnySetup 10.0
+ *Choice "Normal/Normal" "<</OutputType(0)/HWResolution[600 600]>>setpagedevice"
+ Choice "Best/Best" "<</OutputType(1)/HWResolution[600 600]>>setpagedevice"
+ Choice "Photo/High-Resolution Photo" "<</OutputType(2)/HWResolution[1200 1200]>>setpagedevice"
+ Choice "FastDraft/Fast Draft" "<</OutputType(-2)/HWResolution[300 300]>>setpagedevice"
+
+ // Constraints
+ UIConstraints "*ColorModel KGray *OutputMode Photo"
+ UIConstraints "*ColorModel CMYGray *OutputMode Photo"
+ UIConstraints "*MediaType Glossy *OutputMode FastDraft"
+ UIConstraints "*MediaType TransparencyFilm *OutputMode FastDraft"
+ UIConstraints "*MediaType Plain *OutputMode Photo"
+ UIConstraints "*MediaType TransparencyFilm *OutputMode Photo"
+ UIConstraints "*MediaType TransparencyFilm *OutputMode Best"
+
+ UIConstraints "*PageSize PhotoL.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize Photo4x6.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize A6.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize Cabinet.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize Photo5x7.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize A5.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize 8x10.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize Letter.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize A4.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize B5.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize HV.FB *OutputMode FastDraft"
+
+// 4x6 or smaller
+ CustomMedia "Card3x5/Index Card 3x5in" 216 360 9 9 9 9 "<</cupsInteger0 78/PageSize [216 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 78/PageSize[216 360]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card4x6/Index Card 4x6in" 306 450 9 9 9 9 "<</cupsInteger0 74/PageSize [216 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[306 450]/ImagingBBox null>>setpagedevice"
+ CustomMedia "PhotoL/Photo 3.5x5in" 252 360 9 9 9 9 "<</cupsInteger0 121/PageSize[252 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 121/PageSize[252 360]/ImagingBBox null>>setpagedevice"
+ CustomMedia "PhotoL.FB/Photo Borderless 3.5x5in" 264.74 370.36 0 0 0 0 "<</cupsInteger0 121/PageSize[264.74 370.36]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 121/cupsReal0 .079/cupsReal1 .051/PageSize[264.74 370.36]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6/Photo 4x6in" 288 432 9 9 9 9 "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6.FB/Photo Borderless 4x6in" 303.55 442.36 0 0 0 0 "<</cupsInteger0 74/PageSize[303.55 442.36]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/cupsReal0 .098/cupsReal1 .051/PageSize[303.55 442.36]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6/A6 105x148mm" 297.36 419.76 9 9 9 9 "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6.FB/A6 Borderless 105x148mm" 310.1 430.12 0 0 0 0 "<</cupsInteger0 73/PageSize[310.1 430.12]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 73/cupsReal0 .079/cupsReal1 .051/PageSize[310.1 430.12]/ImagingBBox null>>setpagedevice"
+
+// 5x7
+ CustomMedia "HV/HV 101x180mm" 286.56 510.48 9 9 9 9 "<</cupsInteger0 101/PageSize[286.56 510.48]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[286.56 510.48]/ImagingBBox null>>setpagedevice"
+ CustomMedia "HV.FB/HV Borderless 101x180mm" 302.11 520.84 0 0 0 0 "<</cupsInteger0 101/PageSize[302.11 520.84]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/cupsReal0 .098/cupsReal1 .051/PageSize[302.11 520.84]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Cabinet/Cabinet Size 120x165mm" 339.84 468 9 9 9 9 "<</cupsInteger0 119/PageSize[339.84 468]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 119/PageSize[339.84 468]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Cabinet.FB/Cabinet Size Borderless 120x165mm" 352.58 478.36 0 0 0 0 "<</cupsInteger0 119/PageSize[352.58 478.36]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 119/cupsReal0 .079/cupsReal1 .051/PageSize[352.58 478.36]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo5x7/Photo 5x7in" 360 504 9 9 9 9 "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo5x7.FB/Photo Borderless 5x7in" 372.81 514.36 0 0 0 0 "<</cupsInteger0 122/PageSize[372.81 514.36]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/cupsReal0 .089/cupsReal1 .051/PageSize[372.81 514.36]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card5x8/Index Card 5x8in" 360 576 9 9 9 9 "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5/A5 148x210mm" 419.76 595.44 9 9 9 9 "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5.FB/A5 Borderless 148x210mm" 435.31 605.8 0 0 0 0 "<</cupsInteger0 25/PageSize[435.31 605.8]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/cupsReal0 .098/cupsReal1 .051/PageSize[435.31 605.8]/ImagingBBox null>>setpagedevice"
+
+// Standard
+ CustomMedia "B5/B5 176x250mm" 498.96 708.48 9 9 9 9 "<</cupsInteger0 65/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 65/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ CustomMedia "B5.FB/B5 Borderless 176x250mm" 514.51 718.84 0 0 0 0 "<</cupsInteger0 65/PageSize[514.51 718.84]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 65/cupsReal0 .098/cupsReal1 .051/PageSize[514.51 718.84]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Executive/Executive 7.25x10.5in" 522 756 9 9 9 9 "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ CustomMedia "8x10/8x10in" 576 720 9 9 9 9 "<</cupsInteger0 7/PageSize[576 720]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 7/PageSize[576 720]/ImagingBBox null>>setpagedevice"
+ CustomMedia "8x10.FB/Borderless 8x10in" 589.46 730.36 0 0 0 0 "<</cupsInteger0 7/PageSize[589.46 730.36]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 7/cupsReal0 .098/cupsReal1 .051/PageSize[589.46 730.36]/ImagingBBox null>>setpagedevice"
+ *CustomMedia "Letter/Letter 8.5x11in" 612 792 9 9 9 9 "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Letter.FB/Letter Borderless 8.5x11in" 627.55 802.36 0 0 0 0 "<</cupsInteger0 2/PageSize[627.55 802.36]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/cupsReal0 .098/cupsReal1 .051/PageSize[627.55 802.36]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4/A4 210x297mm" 595.44 841.68 9 9 9 9 "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4.FB/A4 Borderless 210x297mm" 610.99 852.04 0 0 0 0 "<</cupsInteger0 26/PageSize[610.99 852.04]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/cupsReal0 .098/cupsReal1 .051/PageSize[610.99 852.04]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Legal/Legal 8.5x14in" 612 1008 9 9 9 9 "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 3/cupsReal0 .098/cupsReal1 .051/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+
+// Envelope
+ CustomMedia "EnvA2/A2 Envelope 4.37x5.75in" 314.64 414 9 40.536 9 9 "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC6/C6 Envelope 114x162mm" 323.28 459.36 9 40.536 9 9 "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvMonarch/Monarch Envelope 3.875x7.5in" 279 540 9 40.536 9 9 "<</cupsInteger0 80/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 80/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvDL/DL Envelope 110x220mm" 311.76 623.52 9 40.536 9 9 "<</cupsInteger0 90/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 90/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Env10/#10 Envelope 4.125x9.5in" 297 684 9 40.536 9 9 "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC5/C5 Envelope 162x229mm" 459.36 649.44 9 40.536 9 9 "<</cupsInteger0 91/PageSize[459.36 649.44]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 91/PageSize[459.36 649.44]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Env6/#6 Envelope 3.63x6.5in" 261.36 468 9 40.536 9 9 "<</cupsInteger0 83/PageSize[261.36 468]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 83/PageSize[261.36 468]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvCard/Card Envelope 4.4x6in" 315 432 9 40.536 9 9 "<</cupsInteger0 114/PageSize[315 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 114/PageSize[315 432]/ImagingBBox null>>setpagedevice"
+
+ {
+
+ // Custom page sizes from 3x4in to Legal
+ HWMargins 9 9 9 9
+ VariablePaperSize Yes
+ MinSize 3in 4in
+ MaxSize 8.5in 30in
+
+ // <%ViperPlusVIP:Trim%>
+ {
+ ModelName "HP Officejet 4500 g510n-z"
+ Attribute "NickName" "" "HP Officejet 4500 g510n-z, $Version"
+ Attribute "ShortNickName" "" "HP Officejet 4500 g510n-z"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet 4500 g510n-z;DES:officejet 4500 g510n-z;"
+ PCFileName "hp-officejet_4500_g510n-z.ppd"
+ Attribute "Product" "" "(HP Officejet 4500 g510n-z All-in-one Printer)"
+ }
+ } // End Supported media sizes with full bleed.
+
+ {
+ UIConstraints "*PageSize L.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize Hagaki.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize JB5.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize 2L.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize Mutsugiri.FB *OutputMode FastDraft"
+
+ CustomMedia "L/L 89x127mm" 252 360 9 9 9 9 "<</cupsInteger0 121/PageSize[252 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 121/PageSize[252 360]/ImagingBBox null>>setpagedevice"
+ CustomMedia "L.FB/L Borderless 89x127mm" 264.74 370.36 0 0 0 0 "<</cupsInteger0 121/PageSize[264.74 370.36]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 121/cupsReal0 .079/cupsReal1 .051/PageSize[264.74 370.36]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki/Hagaki 100x148mm" 283.68 419.76 9 9 9 9 "<</cupsInteger0 71/PageSize[283.68 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/PageSize[283.68 419.76]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki.FB/Hagaki Borderless 100x148mm" 296.42 430.12 0 0 0 0 "<</cupsInteger0 71/PageSize[296.42 430.12]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/cupsReal0 .098/cupsReal1 .051/PageSize[296.42 430.12]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Oufuku/Oufuku-Hagaki 200x148mm" 566.64 419.76 9 9 9 9 "<</cupsInteger0 72/PageSize[566.64 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 72/PageSize[566.64 419.76]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5/JB5 182x257mm" 516.24 728.64 9 9 9 9 "<</cupsInteger0 45/PageSize[516.24 728.64]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 45/PageSize [516.24 728.64]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5.FB/JB5 Borderless 182x257mm" 531.79 739 0 0 0 0 "<</cupsInteger0 45/PageSize[531.79 739]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 45/cupsReal0 .098/cupsReal1 .051/PageSize [531.79 739]/ImagingBBox null>>setpagedevice"
+ CustomMedia "2L/2L 127x178mm" 360 504 9 9 9 9 "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ CustomMedia "2L.FB/2L Borderless 127x178mm" 372.81 514.36 0 0 0 0 "<</cupsInteger0 122/PageSize[372.81 514.36]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/cupsReal0 .089/cupsReal1 .051/PageSize[372.81 514.36]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Mutsugiri/Mutsugiri 8x10in" 576 720 9 9 9 9 "<</cupsInteger0 7/PageSize[576 720]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 7/PageSize[576 720]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Mutsugiri.FB/Mutsugiri Borderless 8x10in" 589.46 730.36 0 0 0 0 "<</cupsInteger0 7/PageSize[589.46 730.36]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 7/cupsReal0 .098/cupsReal1 .051/PageSize[589.46 730.36]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou3/#3 Japanese Envelope 120x235mm" 339.84 666 9 40.536 9 9 "<</cupsInteger0 110/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 110/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou4/#4 Japanese Envelope 90x205mm" 254.88 581.04 9 40.536 9 9 "<</cupsInteger0 111/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 111/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+
+ // Custom page sizes from 3x4in to Legal
+ HWMargins 9 9 9 9
+ VariablePaperSize Yes
+ MinSize 3in 4in
+ MaxSize 8.5in 30in
+
+ // <%ViperPlusVIP:Normal%>
+ {
+ ModelName "HP Photosmart d110 Series"
+ Attribute "NickName" "" "HP Photosmart d110 Series, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart d110 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart d110 series;DES:photosmart d110 series;"
+ PCFileName "hp-photosmart_d110_series.ppd"
+ Attribute "Product" "" "(HP Photosmart d110 Series Printer)"
+ }
+ {
+ ModelName "HP Photosmart Ink Adv k510"
+ Attribute "NickName" "" "HP Photosmart Ink Adv k510, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart Ink Adv k510"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart ink adv k510;DES:photosmart ink adv k510;"
+ PCFileName "hp-photosmart_ink_adv_k510.ppd"
+ Attribute "Product" "" "(HP Photosmart Ink Adv k510)"
+ }
+ {
+ ModelName "HP Officejet 4400 k410"
+ Attribute "NickName" "" "HP Officejet 4400 k410, $Version"
+ Attribute "ShortNickName" "" "HP Officejet 4400 k410"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet 4400 k410;DES:officejet 4400 k410;"
+ PCFileName "hp-officejet_4400_k410.ppd"
+ Attribute "Product" "" "(HP Officejet 4400 k410 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Deskjet f4400 Series"
+ Attribute "NickName" "" "HP Deskjet f4400 Series, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet f4400 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet f4400 series;DES:deskjet f4400 series;"
+ PCFileName "hp-deskjet_f4400_series.ppd"
+ Attribute "Product" "" "(HP Deskjet f4440 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f4435 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f4450 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f4470 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f4472 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f4473 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f4480 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f4483 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f4488 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f4492 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet 4500 g510a-f"
+ Attribute "NickName" "" "HP Officejet 4500 g510a-f, $Version"
+ Attribute "ShortNickName" "" "HP Officejet 4500 g510a-f"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet 4500 g510a-f;DES:officejet 4500 g510a-f;"
+ PCFileName "hp-officejet_4500_g510a-f.ppd"
+ Attribute "Product" "" "(HP Officejet 4500 Desktop All-in-one Printer - g510a)"
+ Attribute "Product" "" "(HP Officejet 4500 All-in-one Desktop Printer - g510b)"
+ }
+ {
+ ModelName "HP Deskjet f4500 Series"
+ Attribute "NickName" "" "HP Deskjet f4500 Series, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet f4500 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet f4500 series;DES:deskjet f4500 series;"
+ PCFileName "hp-deskjet_f4500_series.ppd"
+ Attribute "Product" "" "(HP Deskjet f4500 All-in-one Printer Series)"
+ }
+ {
+ ModelName "HP Officejet 4500 k710"
+ Attribute "NickName" "" "HP Officejet 4500 k710, $Version"
+ Attribute "ShortNickName" "" "HP Officejet 4500 k710"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet 4500 k710;DES:officejet 4500 k710;"
+ PCFileName "hp-officejet_4500_k710.ppd"
+ Attribute "Product" "" "(HP Officejet 4500 All-in-one Printer - k710)"
+ }
+ {
+ ModelName "HP Officejet 4500 g510g-m"
+ Attribute "NickName" "" "HP Officejet 4500 g510g-m, $Version"
+ Attribute "ShortNickName" "" "HP Officejet 4500 g510g-m"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet 4500 g510g-m;DES:officejet 4500 g510g-m;"
+ PCFileName "hp-officejet_4500_g510g-m.ppd"
+ Attribute "Product" "" "(HP Officejet 4500 All-in-one Printer - g510g)"
+ Attribute "Product" "" "(HP Officejet 4500 All-in-one Printer - g510h)"
+ }
+ {
+ ModelName "HP Photosmart c4600 Series"
+ Attribute "NickName" "" "HP Photosmart c4600 Series, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart c4600 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart c4600 series;DES:photosmart c4600 series;"
+ PCFileName "hp-photosmart_c4600_series.ppd"
+ Attribute "Product" "" "(HP Photosmart c4640 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4650 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4680 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4610 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4635 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4670 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4673 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4680 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4683 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4688 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Photosmart c4700 Series"
+ Attribute "NickName" "" "HP Photosmart c4700 Series, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart c4700 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart c4700 series;DES:photosmart c4700 series;"
+ PCFileName "hp-photosmart_c4700_series.ppd"
+ Attribute "Product" "" "(HP Photosmart c4740 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4750 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4780 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4783 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4785 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4788 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4793 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4795 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4798 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4799 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Deskjet d5500 Series"
+ Attribute "NickName" "" "HP Deskjet d5500 Series, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet d5500 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet d5500 series;DES:deskjet d5500 series;"
+ PCFileName "hp-deskjet_d5500_series.ppd"
+ Attribute "Product" "" "(HP Deskjet d5545 Printer)"
+ Attribute "Product" "" "(HP Deskjet d5560 Printer)"
+ Attribute "Product" "" "(HP Deskjet d5563 Printer)"
+ Attribute "Product" "" "(HP Deskjet d5568 Printer)"
+ }
+ } // End Supported media sizes with full bleed.
+
+} // End ViperPlusVIP
+
+//////// ViperMinusVIP
+{
+ Attribute "hpPrinterLanguage" "" "pcl3gui2"
+ Attribute "HPMechOffset" "" "70"
+
+ Group "General/General"
+
+// MediaPosition values map to MediaSource enumeration in global_types.h
+ Option "InputSlot/Media Source" PickOne AnySetup 10.0
+ *Choice "Auto/Auto-Select" "<</MediaPosition 7>>setpagedevice"
+
+ Option "ColorModel/Output Mode" PickOne AnySetup 10.0
+ *Choice "RGB/Color" "<</cupsColorSpace 17/cupsBitsPerColor 8/cupsRowStep 0>>setpagedevice"
+ Choice "CMYGray/High Quality Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 1>>setpagedevice"
+ Choice "KGray/Black Only Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 2>>setpagedevice"
+
+ // cupsMediaType values map to MEDIATYPE from global_types.h
+ Option "MediaType/Media Type" PickOne AnySetup 10.0
+ *Choice "Plain/Plain Paper" "<</MediaType(Plain)/cupsMediaType 0>>setpagedevice"
+ Choice "Glossy/Photo Paper" "<</MediaType(Glossy)/cupsMediaType 3>>setpagedevice"
+ Choice "TransparencyFilm/Transparency Film" "<</MediaType(TransparencyFilm)/cupsMediaType 4>>setpagedevice"
+
+ // cupsCompression values map to QUALITY_MODE from global_types.h
+ Option "OutputMode/Print Quality" PickOne AnySetup 10.0
+ *Choice "Normal/Normal" "<</OutputType(0)/HWResolution[600 600]>>setpagedevice"
+ Choice "Best/Best" "<</OutputType(1)/HWResolution[600 600]>>setpagedevice"
+ Choice "Photo/High-Resolution Photo" "<</OutputType(2)/HWResolution[1200 1200]>>setpagedevice"
+ Choice "FastDraft/Fast Draft" "<</OutputType(-2)/HWResolution[300 300]>>setpagedevice"
+
+ // Constraints
+ UIConstraints "*ColorModel KGray *OutputMode Photo"
+ UIConstraints "*ColorModel CMYGray *OutputMode Photo"
+ UIConstraints "*MediaType Glossy *OutputMode FastDraft"
+ UIConstraints "*MediaType TransparencyFilm *OutputMode FastDraft"
+ UIConstraints "*MediaType Plain *OutputMode Photo"
+ UIConstraints "*MediaType TransparencyFilm *OutputMode Photo"
+ UIConstraints "*MediaType TransparencyFilm *OutputMode Best"
+ UIConstraints "*PageSize Photo4x6tab.FB *OutputMode FastDraft"
+
+// 4x6 or smaller
+ CustomMedia "Card3x5/Index Card 3x5in" 216 360 9 36 9 4.968 "<</cupsInteger0 78/PageSize [216 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 78/PageSize[216 360]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card4x6/Card 4x6in" 288 432 9 36 9 4.968 "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6/Photo 4x6in" 288 432 9 36 9 9 "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6tab/Photo 4x6in (tab)" 288 432 9 9 9 9 "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6tab.FB/Photo Borderless 4x6in (tab)" 303.55 443.01 0 0 0 0 "<</cupsInteger0 74/PageSize[303.55 443.01]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/cupsReal0 .098/cupsReal1 .051/PageSize[303.55 443.01]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6/A6 105x148mm" 297.36 419.76 9 36 9 4.968 "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+
+// 5x7
+ CustomMedia "Cabinet/Cabinet Size 120x165mm" 339.84 468 9 36 9 4.968 "<</cupsInteger0 119/PageSize[339.84 468]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 119/PageSize[339.84 468]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo5x7/Photo 5x7in" 360 504 9 36 9 9 "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card5x8/Index Card 5x8in" 360 576 9 36 9 4.968 "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5/A5 148x210mm" 419.76 595.44 9 36 9 4.968 "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+
+// Standard
+ CustomMedia "B5/B5 176x250mm" 498.96 708.48 9 36 9 4.968 "<</cupsInteger0 65/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 65/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5/JB5 182x257mm" 516.24 728.64 9 36 9 4.968 "<</cupsInteger0 45/PageSize[516.24 728.64]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 45/PageSize [516.24 728.64]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Executive/Executive 7.25x10.5in" 522 756 18 36 18 4.968 "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ CustomMedia "8x10/8x10in" 576 720 9 36 9 9 "<</cupsInteger0 7/PageSize[576 720]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 7/PageSize[576 720]/ImagingBBox null>>setpagedevice"
+ *CustomMedia "Letter/Letter 8.5x11in" 612 792 9 36 9 4.968 "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4/A4 210x297mm" 595.44 841.68 9 36 9 4.968 "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Legal/Legal 8.5x14in" 612 1008 18 36 18 4.968 "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+
+// Envelope
+ CustomMedia "EnvA2/A2 Envelope 4.37x5.75in" 314.64 414 9 36 9 4.968 "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC6/C6 Envelope 114x162mm" 323.28 459.36 9 36 9 4.968 "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvDL/DL Envelope 110x220mm" 311.76 623.52 9 36 9 4.968 "<</cupsInteger0 90/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 90/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Env10/#10 Envelope 4.125x9.5in" 297 684 9 36 9 4.968 "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC5/C5 Envelope 162x229mm" 459.36 649.44 9 36 9 4.968 "<</cupsInteger0 91/PageSize[459.36 649.44]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 91/PageSize[459.36 649.44]/ImagingBBox null>>setpagedevice"
+
+ {
+ // Custom page sizes from 3x4in to Legal
+ HWMargins 18 36 18 5.04
+ VariablePaperSize Yes
+ MinSize 3in 4in
+ MaxSize 8.5in 30in
+
+ // <%ViperMinusVIP:Normal%>
+ {
+ ModelName "HP Deskjet f2400 Series"
+ Attribute "NickName" "" "HP Deskjet f2400 Series, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet f2400 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet f2400 series;DES:deskjet f2400 series;"
+ PCFileName "hp-deskjet_f2400_series.ppd"
+ Attribute "Product" "" "(HP Deskjet f2410 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f2418 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f2420 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f2423 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f2430 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f2440 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f2476 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f2480 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f2483 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f2488 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f2492 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f2493 All-in-one Printer)"
+ }
+ } // End Supported media sizes with full bleed.
+
+} // End ViperMinusVIP
+
+//////// ViperPlusTrim
+{
+ Attribute "hpPrinterLanguage" "" "lidil"
+ Attribute "hpPrinterPlatform" "" "dj2600"
+ Attribute "HPMechOffset" "" "70"
+
+ Group "General/General"
+
+ // MediaPosition values map to MediaSource enumeration in global_types.h
+ Option "InputSlot/Media Source" PickOne AnySetup 10.0
+ *Choice "Auto/Auto-Select" "<</MediaPosition 7>>setpagedevice"
+ Choice "Main/Main Tray" "<</MediaPosition 1>>setpagedevice"
+
+ // cupsMediaType values map to MEDIATYPE from global_types.h
+ Option "MediaType/Media Type" PickOne AnySetup 10.0
+ *Choice "Plain/Plain Paper" "<</MediaType(Plain)/cupsMediaType 0>>setpagedevice"
+ Choice "Glossy/Photo Paper" "<</MediaType(Glossy)/cupsMediaType 3>>setpagedevice"
+ Choice "TransparencyFilm/Transparency Film" "<</MediaType(TransparencyFilm)/cupsMediaType 4>>setpagedevice"
+
+ // cupsCompression values map to QUALITY_MODE from global_types.h
+ Option "OutputMode/Print Quality" PickOne AnySetup 10.0
+ *Choice "NormalRGB/Normal Color" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 1/OutputType(0)/cupsInteger2 0/HWResolution[600 600]>>setpagedevice"
+ Choice "NormalGray/Normal Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 2/OutputType(0)/cupsInteger2 1/HWResolution[600 600]>>setpagedevice"
+ Choice "DraftRGB/Draft Color" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 0/OutputType(-1)/cupsInteger2 2/HWResolution[300 300]>>setpagedevice"
+ Choice "DraftGray/Draft Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 2/OutputType(-1)/cupsInteger2 3/HWResolution[300 300]>>setpagedevice"
+ Choice "Photo/High-Resolution Photo" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 0/OutputType(2)/cupsInteger2 4/HWResolution[600 600]>>setpagedevice"
+
+
+ // Installed Cartridge: Only For Lidil Devices.
+ Option "InstalledCartridge/Installed Cartridges" PickOne AnySetup 10.0
+ Choice "BlackColorOnly/Black Only" "<</cupsInteger1 0>>setpagedevice"
+ Choice "TriColorOnly/TriColor Only" "<</cupsInteger1 1>>setpagedevice"
+ Choice "PhotoColorOnly/Photo Only" "<</cupsInteger1 2>>setpagedevice"
+ *Choice "BlackAndTriColor/Black and TriColor" "<</cupsInteger1 3>>setpagedevice"
+ Choice "PhotoAndColor/Photo and TriColor" "<</cupsInteger1 4>>setpagedevice"
+
+ // Constraints
+ UIConstraints "*MediaType Glossy *OutputMode DraftRGB"
+ UIConstraints "*MediaType Glossy *OutputMode DraftGray"
+ UIConstraints "*MediaType TransparencyFilm *OutputMode DraftRGB"
+ UIConstraints "*MediaType TransparencyFilm *OutputMode DraftGray"
+ UIConstraints "*MediaType Plain *OutputMode Photo"
+ UIConstraints "*MediaType TransparencyFilm *OutputMode Photo"
+
+ UIConstraints "*PageSize L.FB *OutputMode DraftRGB"
+ UIConstraints "*PageSize L.FB *OutputMode DraftGray"
+ UIConstraints "*PageSize PhotoL.FB *OutputMode DraftRGB"
+ UIConstraints "*PageSize PhotoL.FB *OutputMode DraftGray"
+ UIConstraints "*PageSize Hagaki.FB *OutputMode DraftRGB"
+ UIConstraints "*PageSize Hagaki.FB *OutputMode DraftGray"
+ UIConstraints "*PageSize Photo4x6.FB *OutputMode DraftRGB"
+ UIConstraints "*PageSize Photo4x6.FB *OutputMode DraftGray"
+ UIConstraints "*PageSize A6.FB *OutputMode DraftRGB"
+ UIConstraints "*PageSize A6.FB *OutputMode DraftGray"
+ UIConstraints "*PageSize Cabinet.FB *OutputMode DraftRGB"
+ UIConstraints "*PageSize Cabinet.FB *OutputMode DraftGray"
+ UIConstraints "*PageSize Photo5x7.FB *OutputMode DraftRGB"
+ UIConstraints "*PageSize Photo5x7.FB *OutputMode DraftGray"
+ UIConstraints "*PageSize 2L.FB *OutputMode DraftRGB"
+ UIConstraints "*PageSize 2L.FB *OutputMode DraftGray"
+ UIConstraints "*PageSize A5.FB *OutputMode DraftRGB"
+ UIConstraints "*PageSize A5.FB *OutputMode DraftGray"
+ UIConstraints "*PageSize 8x10.FB *OutputMode DraftRGB"
+ UIConstraints "*PageSize 8x10.FB *OutputMode DraftGray"
+ UIConstraints "*PageSize Letter.FB *OutputMode DraftRGB"
+ UIConstraints "*PageSize Letter.FB *OutputMode DraftGray"
+ UIConstraints "*PageSize A4.FB *OutputMode DraftRGB"
+ UIConstraints "*PageSize A4.FB *OutputMode DraftGray"
+ UIConstraints "*PageSize B5.FB *OutputMode DraftRGB"
+ UIConstraints "*PageSize B5.FB *OutputMode DraftGray"
+ UIConstraints "*PageSize JB5.FB *OutputMode DraftRGB"
+ UIConstraints "*PageSize JB5.FB *OutputMode DraftGray"
+ UIConstraints "*PageSize HV.FB *OutputMode DraftRGB"
+ UIConstraints "*PageSize HV.FB *OutputMode DraftGray"
+ UIConstraints "*PageSize Mutsugiri.FB *OutputMode DraftRGB"
+ UIConstraints "*PageSize Mutsugiri.FB *OutputMode DraftGray"
+
+// 4x6 or smaller
+ CustomMedia "Card3x5/Index Card 3x5in" 216 360 9 9 9 9 "<</cupsInteger0 78/PageSize [216 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 78/PageSize[216 360]/ImagingBBox null>>setpagedevice"
+ CustomMedia "L/L 89x127mm" 252 360 9 9 9 9 "<</cupsInteger0 121/PageSize[252 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 121/PageSize[252 360]/ImagingBBox null>>setpagedevice"
+ CustomMedia "L.FB/L Borderless 89x127mm" 264.74 370.36 0 0 0 0 "<</cupsInteger0 121/PageSize[264.74 370.36]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 121/cupsReal0 .079/cupsReal1 .051/PageSize[264.74 370.36]/ImagingBBox null>>setpagedevice"
+ CustomMedia "PhotoL/Photo 3.5x5in" 252 360 9 9 9 9 "<</cupsInteger0 121/PageSize[252 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 121/PageSize[252 360]/ImagingBBox null>>setpagedevice"
+ CustomMedia "PhotoL.FB/Photo Borderless 3.5x5in" 264.74 370.36 0 0 0 0 "<</cupsInteger0 121/PageSize[264.74 370.36]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 121/cupsReal0 .079/cupsReal1 .051/PageSize[264.74 370.36]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki/Hagaki 100x148mm" 283.68 419.76 9 9 9 9 "<</cupsInteger0 71/PageSize[283.68 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/PageSize[283.68 419.76]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki.FB/Hagaki Borderless 100x148mm" 296.42 430.12 0 0 0 0 "<</cupsInteger0 71/PageSize[296.42 430.12]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/cupsReal0 .098/cupsReal1 .051/PageSize[296.42 430.12]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6/Photo 4x6in" 288 432 9 9 9 9 "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6.FB/Photo Borderless 4x6in" 303.55 442.36 0 0 0 0 "<</cupsInteger0 74/PageSize[303.55 442.36]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/cupsReal0 .098/cupsReal1 .051/PageSize[303.55 442.36]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6/A6 105x148mm" 297.36 419.76 9 9 9 9 "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6.FB/A6 Borderless 105x148mm" 310.1 430.12 0 0 0 0 "<</cupsInteger0 73/PageSize[310.1 430.12]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 73/cupsReal0 .079/cupsReal1 .051/PageSize[310.1 430.12]/ImagingBBox null>>setpagedevice"
+
+// 5x7
+ CustomMedia "HV/HV 101x180mm" 286.56 510.48 9 9 9 9 "<</cupsInteger0 101/PageSize[286.56 510.48]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[286.56 510.48]/ImagingBBox null>>setpagedevice"
+ CustomMedia "HV.FB/HV Borderless 101x180mm" 302.11 520.84 0 0 0 0 "<</cupsInteger0 101/PageSize[302.11 520.84]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/cupsReal0 .098/cupsReal1 .051/PageSize[302.11 520.84]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Cabinet/Cabinet Size 120x165mm" 339.84 468 9 9 9 9 "<</cupsInteger0 119/PageSize[339.84 468]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 119/PageSize[339.84 468]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Cabinet.FB/Cabinet Size Borderless 120x165mm" 352.58 478.36 0 0 0 0 "<</cupsInteger0 119/PageSize[352.58 478.36]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 119/cupsReal0 .079/cupsReal1 .051/PageSize[352.58 478.36]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo5x7/Photo 5x7in" 360 504 9 9 9 9 "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo5x7.FB/Photo Borderless 5x7in" 372.81 514.36 0 0 0 0 "<</cupsInteger0 122/PageSize[372.81 514.36]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/cupsReal0 .089/cupsReal1 .051/PageSize[372.81 514.36]/ImagingBBox null>>setpagedevice"
+ CustomMedia "2L/2L 127x178mm" 360 504 9 9 9 9 "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ CustomMedia "2L.FB/2L Borderless 127x178mm" 372.81 514.36 0 0 0 0 "<</cupsInteger0 122/PageSize[372.81 514.36]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/cupsReal0 .089/cupsReal1 .051/PageSize[372.81 514.36]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card5x8/Index Card 5x8in" 360 576 9 9 9 9 "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Oufuku/Oufuku-Hagaki 200x148mm" 566.64 419.76 9 9 9 9 "<</cupsInteger0 72/PageSize[566.64 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 72/PageSize[566.64 419.76]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5/A5 148x210mm" 419.76 595.44 9 9 9 9 "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5.FB/A5 Borderless 148x210mm" 435.31 605.8 0 0 0 0 "<</cupsInteger0 25/PageSize[435.31 605.8]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/cupsReal0 .098/cupsReal1 .051/PageSize[435.31 605.8]/ImagingBBox null>>setpagedevice"
+
+// Standard
+ CustomMedia "B5/B5 176x250mm" 498.96 708.48 9 9 9 9 "<</cupsInteger0 65/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 65/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ CustomMedia "B5.FB/B5 Borderless 176x250mm" 514.51 718.84 0 0 0 0 "<</cupsInteger0 65/PageSize[514.51 718.84]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 65/cupsReal0 .098/cupsReal1 .051/PageSize[514.51 718.84]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5/JB5 182x257mm" 516.24 728.64 9 9 9 9 "<</cupsInteger0 45/PageSize[516.24 728.64]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 45/PageSize [516.24 728.64]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5.FB/JB5 Borderless 182x257mm" 531.79 739 0 0 0 0 "<</cupsInteger0 45/PageSize[531.79 739]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 45/cupsReal0 .098/cupsReal1 .051/PageSize [531.79 739]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Executive/Executive 7.25x10.5in" 522 756 9 9 9 9 "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ CustomMedia "8x10/8x10in" 576 720 9 9 9 9 "<</cupsInteger0 7/PageSize[576 720]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 7/PageSize[576 720]/ImagingBBox null>>setpagedevice"
+ CustomMedia "8x10.FB/Borderless 8x10in" 589.46 730.36 0 0 0 0 "<</cupsInteger0 7/PageSize[589.46 730.36]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 7/cupsReal0 .098/cupsReal1 .051/PageSize[589.46 730.36]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Mutsugiri/Mutsugiri 8x10in" 576 720 9 9 9 9 "<</cupsInteger0 7/PageSize[576 720]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 7/PageSize[576 720]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Mutsugiri.FB/Mutsugiri Borderless 8x10in" 589.46 730.36 0 0 0 0 "<</cupsInteger0 7/PageSize[589.46 730.36]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 7/cupsReal0 .098/cupsReal1 .051/PageSize[589.46 730.36]/ImagingBBox null>>setpagedevice"
+ *CustomMedia "Letter/Letter 8.5x11in" 612 792 9 9 9 9 "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Letter.FB/Letter Borderless 8.5x11in" 627.55 802.36 0 0 0 0 "<</cupsInteger0 2/PageSize[627.55 802.36]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/cupsReal0 .098/cupsReal1 .051/PageSize[627.55 802.36]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4/A4 210x297mm" 595.44 841.68 9 9 9 9 "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4.FB/A4 Borderless 210x297mm" 610.99 852.04 0 0 0 0 "<</cupsInteger0 26/PageSize[610.99 852.04]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/cupsReal0 .098/cupsReal1 .051/PageSize[610.99 852.04]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Legal/Legal 8.5x14in" 612 1008 9 9 9 9 "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 3/cupsReal0 .098/cupsReal1 .051/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+
+// Envelope
+ CustomMedia "EnvA2/A2 Envelope 4.37x5.75in" 314.64 414 9 40.536 9 9 "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC6/C6 Envelope 114x162mm" 323.28 459.36 9 40.536 9 9 "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou4/#4 Japanese Envelope 90x205mm" 254.88 581.04 9 40.536 9 9 "<</cupsInteger0 111/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 111/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvMonarch/Monarch Envelope 3.875x7.5in" 279 540 9 40.536 9 9 "<</cupsInteger0 80/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 80/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvDL/DL Envelope 110x220mm" 311.76 623.52 9 40.536 9 9 "<</cupsInteger0 90/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 90/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Env10/#10 Envelope 4.125x9.5in" 297 684 9 40.536 9 9 "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou3/#3 Japanese Envelope 120x235mm" 339.84 666 9 40.536 9 9 "<</cupsInteger0 110/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 110/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC5/C5 Envelope 162x229mm" 459.36 649.44 9 40.536 9 9 "<</cupsInteger0 91/PageSize[459.36 649.44]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 91/PageSize[459.36 649.44]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Env6/#6 Envelope 3.63x6.5in" 261.36 468 9 40.536 9 9 "<</cupsInteger0 83/PageSize[261.36 468]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 83/PageSize[261.36 468]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvCard/Card Envelope 4.4x6in" 315 432 9 40.536 9 9 "<</cupsInteger0 114/PageSize[315 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 114/PageSize[315 432]/ImagingBBox null>>setpagedevice"
+
+ {
+ // Custom page sizes from 3x4in to Legal
+ HWMargins 9 9 9 9
+ VariablePaperSize Yes
+ MinSize 3in 4in
+ MaxSize 8.5in 30in
+
+ // <%ViperPlusTrim:Normal%>
+ {
+ ModelName "HP Deskjet Ink Advant k109a-z"
+ Attribute "NickName" "" "HP Deskjet Ink Advant k109a-z, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet Ink Advant k109a-z"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet ink advant k109a-z;DES:deskjet ink advant k109a-z;"
+ PCFileName "hp-deskjet_ink_advant_k109a-z.ppd"
+ Attribute "Product" "" "(HP Deskjet Ink Advantage k109a Printer)"
+ }
+ {
+ ModelName "HP Deskjet d2600 Series"
+ Attribute "NickName" "" "HP Deskjet d2600 Series, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet d2600 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet d2600 series;DES:deskjet d2600 series;"
+ PCFileName "hp-deskjet_d2600_series.ppd"
+ Attribute "Product" "" "(HP Deskjet d2660 Printer)"
+ Attribute "Product" "" "(HP Deskjet d2645 Printer)"
+ Attribute "Product" "" "(HP Deskjet d2663 Printer)"
+ Attribute "Product" "" "(HP Deskjet d2666 Printer)"
+ Attribute "Product" "" "(HP Deskjet d2668 Printer)"
+ Attribute "Product" "" "(HP Deskjet d2680 Printer)"
+ }
+ {
+ ModelName "HP Officejet 4000 k210"
+ Attribute "NickName" "" "HP Officejet 4000 k210, $Version"
+ Attribute "ShortNickName" "" "HP Officejet 4000 k210"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet 4000 k210;DES:officejet 4000 k210;"
+ PCFileName "hp-officejet_4000_k210.ppd"
+ Attribute "Product" "" "(HP Officejet 4000 k210 Printer)"
+ }
+ } // End Supported media sizes with full bleed.
+
+} // End ViperPlusTrim
+
+//////// ViperMinusTrim
+{
+ Attribute "hpPrinterLanguage" "" "lidil"
+ Attribute "hpPrinterPlatform" "" "dj2600"
+ Attribute "HPMechOffset" "" "70"
+
+ Group "General/General"
+
+// MediaPosition values map to MediaSource enumeration in global_types.h
+ Option "InputSlot/Media Source" PickOne AnySetup 10.0
+ *Choice "Auto/Auto-Select" "<</MediaPosition 7>>setpagedevice"
+
+ // cupsMediaType values map to MEDIATYPE from global_types.h
+ Option "MediaType/Media Type" PickOne AnySetup 10.0
+ *Choice "Plain/Plain Paper" "<</MediaType(Plain)/cupsMediaType 0>>setpagedevice"
+ Choice "Glossy/Photo Paper" "<</MediaType(Glossy)/cupsMediaType 3>>setpagedevice"
+ Choice "TransparencyFilm/Transparency Film" "<</MediaType(TransparencyFilm)/cupsMediaType 4>>setpagedevice"
+
+// cupsCompression values map to QUALITY_MODE from global_types.h
+ Option "OutputMode/Print Quality" PickOne AnySetup 10.0
+ *Choice "NormalRGB/Normal Color" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 1/OutputType(0)/cupsInteger2 0/HWResolution[600 600]>>setpagedevice"
+ Choice "NormalGray/Normal Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 2/OutputType(0)/cupsInteger2 1/HWResolution[600 600]>>setpagedevice"
+ Choice "DraftRGB/Draft Color" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 0/OutputType(-1)/cupsInteger2 2/HWResolution[300 300]>>setpagedevice"
+ Choice "DraftGray/Draft Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 2/OutputType(-1)/cupsInteger2 3/HWResolution[300 300]>>setpagedevice"
+ Choice "Photo/High-Resolution Photo" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 0/OutputType(2)/cupsInteger2 4/HWResolution[600 600]>>setpagedevice"
+
+
+ // Installed Cartridge: Only For Lidil Devices.
+ Option "InstalledCartridge/Installed Cartridges" PickOne AnySetup 10.0
+ Choice "BlackColorOnly/Black Only" "<</cupsInteger1 0>>setpagedevice"
+ Choice "TriColorOnly/TriColor Only" "<</cupsInteger1 1>>setpagedevice"
+ Choice "PhotoColorOnly/Photo Only" "<</cupsInteger1 2>>setpagedevice"
+ *Choice "BlackAndTriColor/Black and TriColor" "<</cupsInteger1 3>>setpagedevice"
+ Choice "PhotoAndColor/Photo and TriColor" "<</cupsInteger1 4>>setpagedevice"
+
+
+ // Constraints
+ UIConstraints "*MediaType Glossy *OutputMode DraftRGB"
+ UIConstraints "*MediaType Glossy *OutputMode DraftGray"
+ UIConstraints "*MediaType TransparencyFilm *OutputMode DraftRGB"
+ UIConstraints "*MediaType TransparencyFilm *OutputMode DraftGray"
+ UIConstraints "*MediaType Plain *OutputMode Photo"
+ UIConstraints "*MediaType TransparencyFilm *OutputMode Photo"
+
+ UIConstraints "*PageSize Photo4x6tab.FB *OutputMode DraftRGB"
+ UIConstraints "*PageSize Photo4x6tab.FB *OutputMode DraftGray"
+
+// 4x6 or smaller
+ CustomMedia "Card3x5/Index Card 3x5in" 216 360 9 36 9 4.968 "<</cupsInteger0 78/PageSize [216 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 78/PageSize[216 360]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card4x6/Card 4x6in" 288 432 9 36 9 4.968 "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6/Photo 4x6in" 288 432 9 36 9 9 "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6tab/Photo 4x6in (tab)" 288 432 9 9 9 9 "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6tab.FB/Photo Borderless 4x6in (tab)" 303.55 443.01 0 0 0 0 "<</cupsInteger0 74/PageSize[303.55 443.01]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/cupsReal0 .098/cupsReal1 .051/PageSize[303.55 443.01]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6/A6 105x148mm" 297.36 419.76 9 36 9 4.968 "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+
+// 5x7
+ CustomMedia "Cabinet/Cabinet Size 120x165mm" 339.84 468 9 36 9 4.968 "<</cupsInteger0 119/PageSize[339.84 468]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 119/PageSize[339.84 468]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo5x7/Photo 5x7in" 360 504 9 36 9 9 "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card5x8/Index Card 5x8in" 360 576 9 36 9 4.968 "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5/A5 148x210mm" 419.76 595.44 9 36 9 4.968 "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+
+// Standard
+ CustomMedia "B5/B5 176x250mm" 498.96 708.48 9 36 9 4.968 "<</cupsInteger0 65/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 65/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5/JB5 182x257mm" 516.24 728.64 9 36 9 4.968 "<</cupsInteger0 45/PageSize[516.24 728.64]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 45/PageSize [516.24 728.64]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Executive/Executive 7.25x10.5in" 522 756 18 36 18 4.968 "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ CustomMedia "8x10/8x10in" 576 720 9 36 9 9 "<</cupsInteger0 7/PageSize[576 720]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 7/PageSize[576 720]/ImagingBBox null>>setpagedevice"
+ *CustomMedia "Letter/Letter 8.5x11in" 612 792 9 36 9 4.968 "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4/A4 210x297mm" 595.44 841.68 9 36 9 4.968 "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Legal/Legal 8.5x14in" 612 1008 18 36 18 4.968 "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+
+// Envelope
+ CustomMedia "EnvA2/A2 Envelope 4.37x5.75in" 314.64 414 9 36 9 4.968 "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC6/C6 Envelope 114x162mm" 323.28 459.36 9 36 9 4.968 "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvDL/DL Envelope 110x220mm" 311.76 623.52 9 36 9 4.968 "<</cupsInteger0 90/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 90/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Env10/#10 Envelope 4.125x9.5in" 297 684 9 36 9 4.968 "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC5/C5 Envelope 162x229mm" 459.36 649.44 9 36 9 4.968 "<</cupsInteger0 91/PageSize[459.36 649.44]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 91/PageSize[459.36 649.44]/ImagingBBox null>>setpagedevice"
+
+ {
+ // Custom page sizes from 3x4in to Legal
+ HWMargins 18 36 18 5.04
+ VariablePaperSize Yes
+ MinSize 3in 4in
+ MaxSize 8.5in 30in
+
+ // <%ViperMinusTrim:Normal%>
+ {
+ ModelName "HP Deskjet d1600 Series"
+ Attribute "NickName" "" "HP Deskjet d1600 Series, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet d1600 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet d1600 series;DES:deskjet d1600 series;"
+ PCFileName "hp-deskjet_d1600_series.ppd"
+ Attribute "Product" "" "(HP Deskjet d1620 Printer)"
+ Attribute "Product" "" "(HP Deskjet d1630 Printer)"
+ Attribute "Product" "" "(HP Deskjet d1650 Printer)"
+ Attribute "Product" "" "(HP Deskjet d1658 Printer)"
+ Attribute "Product" "" "(HP Deskjet d1660 Printer)"
+ Attribute "Product" "" "(HP Deskjet d1663 Printer)"
+ Attribute "Product" "" "(HP Deskjet d1668 Printer)"
+ }
+ } // End Supported media sizes with full bleed.
+
+} // End ViperMinusTrim
+
+//////// Corbett
+{
+ Attribute "cupsEvenDuplex" "" "True"
+ Attribute "cupsBackSide" "" "Rotated"
+ Attribute "cupsFlipDuplex" "" "True"
+ Attribute "hpPrinterLanguage" "" "pcl3gui2"
+ Attribute "HPMechOffset" "" "130"
+
+ Group "General/General"
+
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 10.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "<</Duplex true/Tumble false>>setpagedevice"
+ Choice "DuplexTumble/Short Edge (Flip)" "<</Duplex true/Tumble true>>setpagedevice"
+ *Choice "None/Off" "<</Duplex false/Tumble false>>setpagedevice"
+
+ // MediaPosition values map to MediaSource enumeration in global_types.h
+ Option "InputSlot/Media Source" PickOne AnySetup 10.0
+ *Choice "Auto/Auto-Select" "<</MediaPosition 7>>setpagedevice"
+ Choice "Tray1/Tray 1" "<</MediaPosition 1>>setpagedevice"
+ Choice "Tray2/Tray 2" "<</MediaPosition 4>>setpagedevice"
+
+ Option "ColorModel/Output Mode" PickOne AnySetup 10.0
+ *Choice "RGB/Color" "<</cupsColorSpace 17/cupsBitsPerColor 8/cupsRowStep 0>>setpagedevice"
+ Choice "CMYGray/High Quality Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 1>>setpagedevice"
+ Choice "KGray/Black Only Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 2>>setpagedevice"
+
+ // cupsMediaType values map to MEDIATYPE from global_types.h
+ Option "MediaType/Media Type" PickOne AnySetup 10.0
+ *Choice "Plain/Plain Paper" "<</MediaType(Plain)/cupsMediaType 0>>setpagedevice"
+ Choice "Glossy/Photo Paper" "<</MediaType(Glossy)/cupsMediaType 3>>setpagedevice"
+ Choice "TransparencyFilm/Transparency Film" "<</MediaType(TransparencyFilm)/cupsMediaType 4>>setpagedevice"
+
+ // cupsCompression values map to QUALITY_MODE from global_types.h
+ Option "OutputMode/Print Quality" PickOne AnySetup 10.0
+ *Choice "Normal/Normal" "<</OutputType(0)/HWResolution[600 600]>>setpagedevice"
+ Choice "Draft/Draft" "<</OutputType(-1)/HWResolution[300 300]>>setpagedevice"
+ Choice "Best/Best" "<</OutputType(1)/HWResolution[600 600]>>setpagedevice"
+ Choice "Photo/High-Resolution Photo" "<</OutputType(2)/HWResolution[1200 1200]>>setpagedevice"
+
+ // Duplexer is optional...
+ Installable "OptionDuplex/Duplexer Installed"
+
+ // Constraints
+ UIConstraints "*Duplex *OptionDuplex False"
+ UIConstraints "*ColorModel KGray *OutputMode Photo"
+ UIConstraints "*ColorModel CMYGray *OutputMode Photo"
+ UIConstraints "*MediaType Glossy *OutputMode Draft"
+ UIConstraints "*MediaType Plain *OutputMode Photo"
+ UIConstraints "*MediaType TransparencyFilm *OutputMode Best"
+ UIConstraints "*MediaType TransparencyFilm *OutputMode Photo"
+ UIConstraints "*PageSize Letter *Duplex"
+ UIConstraints "*PageSize Legal *Duplex"
+ UIConstraints "*PageSize A4 *Duplex"
+ UIConstraints "*PageSize Photo5x7 *Duplex"
+ UIConstraints "*PageSize Photo4x6 *Duplex"
+ UIConstraints "*PageSize Card4x6 *Duplex"
+ UIConstraints "*PageSize A5 *Duplex"
+ UIConstraints "*PageSize A6 *Duplex"
+ UIConstraints "*PageSize JB5 *Duplex"
+ UIConstraints "*PageSize Executive *Duplex"
+ UIConstraints "*PageSize Card5x8 *Duplex"
+ UIConstraints "*PageSize Oufuku *Duplex"
+ UIConstraints "*PageSize Hagaki *Duplex"
+ UIConstraints "*PageSize Statement *Duplex"
+ UIConstraints "*PageSize 6x8 *Duplex"
+ UIConstraints "*PageSize Card3x5 *Duplex"
+ UIConstraints "*PageSize Photo2L *Duplex"
+ UIConstraints "*PageSize 8.5x13 *Duplex"
+ UIConstraints "*PageSize L *Duplex"
+ UIConstraints "*PageSize 8x10 *Duplex"
+ UIConstraints "*PageSize Env10 *Duplex"
+ UIConstraints "*PageSize EnvA2 *Duplex"
+ UIConstraints "*PageSize EnvC6 *Duplex"
+ UIConstraints "*PageSize EnvDL *Duplex"
+ UIConstraints "*PageSize EnvC5 *Duplex"
+ UIConstraints "*PageSize EnvChou3 *Duplex"
+ UIConstraints "*PageSize EnvChou4 *Duplex"
+ UIConstraints "*PageSize EnvMonarch *Duplex"
+ UIConstraints "*PageSize EnvCard *Duplex"
+
+// Constraint FB and Draft
+ UIConstraints "*PageSize L.FB *OutputMode Draft"
+ UIConstraints "*PageSize Hagaki.FB *OutputMode Draft"
+ UIConstraints "*PageSize Photo4x6.FB *OutputMode Draft"
+ UIConstraints "*PageSize A6.FB *OutputMode Draft"
+ UIConstraints "*PageSize Photo5x7.FB *OutputMode Draft"
+ UIConstraints "*PageSize Photo2L.FB *OutputMode Draft"
+ UIConstraints "*PageSize A5.FB *OutputMode Draft"
+ UIConstraints "*PageSize 8x10.FB *OutputMode Draft"
+ UIConstraints "*PageSize Letter.FB *OutputMode Draft"
+ UIConstraints "*PageSize A4.FB *OutputMode Draft"
+ UIConstraints "*PageSize JB5.FB *OutputMode Draft"
+
+// Constraint FB and Duplex
+ UIConstraints "*PageSize L.FB *Duplex"
+ UIConstraints "*PageSize Hagaki.FB *Duplex"
+ UIConstraints "*PageSize Photo4x6.FB *Duplex"
+ UIConstraints "*PageSize A6.FB *Duplex"
+ UIConstraints "*PageSize Photo5x7.FB *Duplex"
+ UIConstraints "*PageSize Photo2L.FB *Duplex"
+ UIConstraints "*PageSize A5.FB *Duplex"
+ UIConstraints "*PageSize 8x10.FB *Duplex"
+ UIConstraints "*PageSize Letter.FB *Duplex"
+ UIConstraints "*PageSize A4.FB *Duplex"
+ UIConstraints "*PageSize JB5.FB *Duplex"
+
+// 4x6 or smaller
+ CustomMedia "Card3x5/Index Card 3x5in" 216 360 9.36 9.36 9.36 9.36 "<</cupsInteger0 78/PageSize [216 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 78/PageSize[216 360]/ImagingBBox null>>setpagedevice"
+ CustomMedia "L/L 89x127mm" 252 360 9.36 9.36 9.36 9.36 "<</cupsInteger0 121/PageSize[252 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 121/PageSize[252 360]/ImagingBBox null>>setpagedevice"
+ CustomMedia "L.FB/L Borderless 89x127mm" 264.96 371.16 0 0 0 0 "<</cupsInteger0 121/PageSize [264.96 371.16]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 121/cupsReal0 .090/cupsReal1 .060/PageSize[264.96 371.16]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki/Hagaki 100x148mm" 283.68 419.76 9.36 9.36 9.36 9.36 "<</cupsInteger0 71/PageSize[283.68 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/PageSize[283.68 419.76]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki.FB/Hagaki Borderless 100x148mm" 296.64 430.2 0 0 0 0 "<</cupsInteger0 71/PageSize[296.64 430.2]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/cupsReal0 .090/cupsReal1 .050/PageSize[296.64 430.2]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card4x6/Index Card 4x6in" 288 432 9.36 9.36 9.36 9.36 "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card4x6.Duplex/Index Card AutoDuplex 4x6in" 288 423 9.36 25.56 9.36 34.56 "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6/Photo 4x6in" 288 432 9.36 9.36 9.36 9.36 "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6.FB/Photo Borderless 4x6in" 300.96 442.44 0 0 0 0 "<</cupsInteger0 74/PageSize[300.96 442.44]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/cupsReal0 .090/cupsReal1 .050/PageSize[300.96 442.44]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6/A6 105x148mm" 297.36 419.76 9.36 9.36 9.36 9.36 "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6.FB/A6 Borderless 105x148mm" 310.32 430.92 0 0 0 0 "<</cupsInteger0 73/PageSize[310.32 430.92]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 73/cupsReal0 .090/cupsReal1 .060/PageSize[310.32 430.92]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6.Duplex/A6 AutoDuplex 105x148mm" 297.36 410.76 9.36 25.56 9.36 34.56 "<</cupsInteger0 73/PageSize[297.36 410.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 73/PageSize[297.36 410.76]/ImagingBBox null>>setpagedevice"
+
+
+// 5x7
+ CustomMedia "Photo5x7/Photo 5x7in" 360 504 9.36 9.36 9.36 9.36 "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo5x7.FB/Photo Borderless 5x7in" 372.96 515.6 0 0 0 0 "<</cupsInteger0 122/PageSize[372.96 515.6]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/cupsReal0 .090/cupsReal1 .060/PageSize[372.96 515.6]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo2L/Photo 2L 127x178mm" 360 504 9.36 9.36 9.36 9.36 "<</cupsInteger0 126/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 126/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo2L.FB/Photo 2L Borderless 127x178mm" 372.96 515.16 0 0 0 0 "<</cupsInteger0 126/PageSize[372.96 515.16]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 126/cupsReal0 .090/cupsReal1 .060/PageSize[372.96 515.16]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Oufuku/Oufuku-Hagaki 200x148mm" 566.64 419.76 9.36 9.36 9.36 9.36 "<</cupsInteger0 72/PageSize[566.64 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 72/PageSize[566.64 419.76]/ImagingBBox null>>setpagedevice"
+
+// Standard
+ CustomMedia "Card5x8/Index Card 5x8in" 360 576 9.36 9.36 9.36 9.36 "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card5x8.Duplex/Index Card AutoDuplex 5x8in" 360 567 9.36 25.56 9.36 34.56 "<</cupsInteger0 75/PageSize[360 567]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 75/PageSize[360 567]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Statement/Statement 5.5x8.5in" 396 612 9.36 9.36 9.36 9.36 "<</cupsInteger0 15/PageSize[396 612]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 15/PageSize[396 612]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5/A5 148x210mm" 419.76 595.44 9.36 9.36 9.36 9.36 "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5.FB/A5 Borderless 148x210mm" 432.72 606.6 0 0 0 0 "<</cupsInteger0 25/PageSize[432.72 606.6]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/cupsReal0 .090/cupsReal1 .060/PageSize[432.72 606.6]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5.Duplex/A5 AutoDuplex 148x210mm" 419.76 586.44 9.36 25.56 9.36 34.56 "<</cupsInteger0 25/PageSize[419.76 586.44]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/PageSize[419.76 586.44]/ImagingBBox null>>setpagedevice"
+ CustomMedia "6x8/6x8in" 432 576 9.36 9.36 9.36 9.36 "<</cupsInteger0 101/PageSize[432 576]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[432 576]/ImagingBBox null>>setpagedevice"
+ CustomMedia "6x8.Duplex/AutoDuplex 6x8in" 432 567 9.36 25.56 9.36 34.56 "<</cupsInteger0 101/PageSize[432 567]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[432 567]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5/JB5 182x257mm" 516.24 728.64 9.36 9.36 9.36 9.36 "<</cupsInteger0 45/PageSize[516.24 728.64]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 45/PageSize [516.24 728.64]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5.FB/JB5 Borderless 182x257mm" 529.2 739.8 0 0 0 0 "<</cupsInteger0 45/PageSize[529.2 739.8]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 45/cupsReal0 .090/cupsReal1 .060/PageSize [529.2 739.8]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5.Duplex/JB5 AutoDuplex 182x257mm" 516.24 719.64 9.36 24.84 9.36 33.84 "<</cupsInteger0 45/PageSize[516.24 719.64]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 45/PageSize [516.24 719.64]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Executive/Executive 7.25x10.5in" 522 756 9.36 9.36 9.36 9.36 "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Executive.Duplex/Executive AutoDuplex 7.25x10.5in" 522 747 9.36 25.56 9.36 34.56 "<</cupsInteger0 1/PageSize[522 747]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[522 747]/ImagingBBox null>>setpagedevice"
+ CustomMedia "8x10/8x10in" 576 720 9.36 9.36 9.36 9.36 "<</cupsInteger0 7/PageSize[576 720]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 7/PageSize[576 720]/ImagingBBox null>>setpagedevice"
+ CustomMedia "8x10.FB/Borderless 8x10in" 584.64 731.16 0 0 0 0 "<</cupsInteger0 7/PageSize[584.64 731.16]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 7/cupsReal0 .060/cupsReal1 .060/PageSize[584.64 731.16]/ImagingBBox null>>setpagedevice"
+ *CustomMedia "Letter/Letter 8.5x11in" 612 792 9.36 9.36 9.36 9.36 "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Letter.FB/Letter Borderless 8.5x11in" 624.96 803.16 0 0 0 0 "<</cupsInteger0 2/PageSize[624.96 803.16]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/cupsReal0 .090/cupsReal1 .060/PageSize[624.96 803.16]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Letter.Duplex/Letter AutoDuplex 8.5x11in" 612 783 9.36 24.84 9.36 33.84 "<</cupsInteger0 2/PageSize[612 783]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/PageSize[612 783]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4/A4 210x297mm" 595.44 841.68 9.36 9.36 9.36 9.36 "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4.FB/A4 Borderless 210x297mm" 608.4 852.84 0 0 0 0 "<</cupsInteger0 26/PageSize[608.4 852.84]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/cupsReal0 .090/cupsReal1 .060/PageSize[608.4 852.84]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4.Duplex/A4 AutoDuplex 210x297mm" 595.44 832.68 9.36 24.84 9.36 33.84 "<</cupsInteger0 26/PageSize[595.44 832.68]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/PageSize[595.44 832.68]/ImagingBBox null>>setpagedevice"
+ CustomMedia "8.5x13/8.5x13in" 612 936 9.36 9.36 9.36 9.36 "<</cupsInteger0 101/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Legal/Legal 8.5x14in" 612 1008 9.36 9.36 9.36 9.36 "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+
+// Envelope
+ CustomMedia "EnvA2/A2 Envelope 4.37x5.75in" 314.64 414 9.36 46.8 9.36 46.8 "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvCard/Card Envelope 4.4x6in" 315.36 432 9.36 46.8 9.36 46.8 "<</cupsInteger0 114/PageSize[315.36 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 114/PageSize[315.36 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC6/C6 Envelope 114x162mm" 323.28 459.36 9.36 46.8 9.36 46.8 "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou4/#4 Japanese Envelope 90x205mm" 254.88 581.04 9.36 46.8 9.36 46.8 "<</cupsInteger0 111/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 111/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvMonarch/Monarch Envelope 3.875x7.5in" 279 540 9.36 46.8 9.36 46.8 "<</cupsInteger0 80/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 80/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvDL/DL Envelope 110x220mm" 311.76 623.52 9.36 46.8 9.36 46.8 "<</cupsInteger0 90/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 90/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Env10/#10 Envelope 4.125x9.5in" 297 684 9.36 46.8 9.36 46.8 "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou3/#3 Japanese Envelope 120x235mm" 339.84 666 9.36 46.8 9.36 46.8 "<</cupsInteger0 110/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 110/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC5/C5 Envelope 162x229mm" 459.36 649.44 9.36 46.8 9.36 46.8 "<</cupsInteger0 91/PageSize[459.36 649.44]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 91/PageSize[459.36 649.44]/ImagingBBox null>>setpagedevice"
+
+ {
+ // Custom page sizes from 3x4in to Legal
+ HWMargins 9.36 9.36 9.36 9.36
+ VariablePaperSize Yes
+ MinSize 3in 5in
+ MaxSize 8.5in 14in
+
+ // <%Corbett:Normal%>
+ {
+ ModelName "HP Officejet Pro 8000 a809"
+ Attribute "NickName" "" "HP Officejet Pro 8000 a809, $Version"
+ Attribute "ShortNickName" "" "HP Officejet Pro 8000 a809"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet pro 8000 a809;DES:officejet pro 8000 a809;"
+ PCFileName "hp-officejet_pro_8000_a809.ppd"
+ Attribute "Product" "" "(HP Officejet Pro 8000 Printer - a809a)"
+ Attribute "Product" "" "(HP Officejet Pro 8000 Wireless Printer - a809n)"
+ }
+ {
+ ModelName "HP Officejet Pro 8500 a909g"
+ Attribute "NickName" "" "HP Officejet Pro 8500 a909g, $Version"
+ Attribute "ShortNickName" "" "HP Officejet Pro 8500 a909g"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet pro 8500 a909g;DES:officejet pro 8500 a909g;"
+ PCFileName "hp-officejet_pro_8500_a909g.ppd"
+ Attribute "Product" "" "(HP Officejet Pro 8500 Wireless All-in-one Printer - a909g)"
+ }
+ {
+ ModelName "HP Officejet Pro 8500 a909a"
+ Attribute "NickName" "" "HP Officejet Pro 8500 a909a, $Version"
+ Attribute "ShortNickName" "" "HP Officejet Pro 8500 a909a"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet pro 8500 a909a;DES:officejet pro 8500 a909a;"
+ PCFileName "hp-officejet_pro_8500_a909a.ppd"
+ Attribute "Product" "" "(HP Officejet Pro 8500 All-in-one Printer - a909a)"
+ }
+ {
+ ModelName "HP Officejet Pro 8500 a909n"
+ Attribute "NickName" "" "HP Officejet Pro 8500 a909n, $Version"
+ Attribute "ShortNickName" "" "HP Officejet Pro 8500 a909n"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet pro 8500 a909n;DES:officejet pro 8500 a909n;"
+ PCFileName "hp-officejet_pro_8500_a909n.ppd"
+ Attribute "Product" "" "(HP Officejet Pro 8500 Premier All-in-one Printer - a909n)"
+ }
+ {
+ ModelName "HP Officejet Pro 8500 a910"
+ Attribute "NickName" "" "HP Officejet Pro 8500 a910, $Version"
+ Attribute "ShortNickName" "" "HP Officejet Pro 8500 a910"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet pro 8500 a910;DES:officejet pro 8500 a910;"
+ PCFileName "hp-officejet_pro_8500_a910.ppd"
+ Attribute "Product" "" "(HP Officejet Pro 8500a Plus E-aio Printer - a910g)"
+ Attribute "Product" "" "(HP Officejet Pro 8500a Premium E-aio Printer - a910n)"
+ Attribute "Product" "" "(HP Officejet Pro 8500a E-aio Printer - a910a)"
+ }
+ } // End Supported media sizes with full bleed.
+
+} // End Corbett
+
+//////// Ampere
+{
+ Attribute "cupsEvenDuplex" "" "True"
+ Attribute "cupsBackSide" "" "Rotated"
+ Attribute "cupsFlipDuplex" "" "True"
+ Attribute "hpPrinterLanguage" "" "pcl3gui2"
+ Attribute "HPMechOffset" "" "130"
+
+ Group "General/General"
+
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 10.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "<</Duplex true/Tumble false>>setpagedevice"
+ Choice "DuplexTumble/Short Edge (Flip)" "<</Duplex true/Tumble true>>setpagedevice"
+ *Choice "None/Off" "<</Duplex false/Tumble false>>setpagedevice"
+
+ // MediaPosition values map to MediaSource enumeration in global_types.h
+ Option "InputSlot/Media Source" PickOne AnySetup 10.0
+ *Choice "Auto/Auto-Select" "<</MediaPosition 7>>setpagedevice"
+ Choice "Tray1/Tray 1" "<</MediaPosition 1>>setpagedevice"
+ Choice "Tray2/Tray 2" "<</MediaPosition 4>>setpagedevice"
+
+ Option "ColorModel/Output Mode" PickOne AnySetup 10.0
+ *Choice "RGB/Color" "<</cupsColorSpace 17/cupsBitsPerColor 8/cupsRowStep 0>>setpagedevice"
+ Choice "CMYGray/High Quality Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 1>>setpagedevice"
+ Choice "KGray/Black Only Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 2>>setpagedevice"
+
+ // cupsMediaType values map to MEDIATYPE from global_types.h
+ Option "MediaType/Media Type" PickOne AnySetup 10.0
+ *Choice "Plain/Plain Paper" "<</MediaType(Plain)/cupsMediaType 0>>setpagedevice"
+ Choice "Glossy/Photo Paper" "<</MediaType(Glossy)/cupsMediaType 3>>setpagedevice"
+ Choice "TransparencyFilm/Transparency Film" "<</MediaType(TransparencyFilm)/cupsMediaType 4>>setpagedevice"
+
+ // cupsCompression values map to QUALITY_MODE from global_types.h
+ Option "OutputMode/Print Quality" PickOne AnySetup 10.0
+ *Choice "Normal/Normal" "<</OutputType(0)/HWResolution[600 600]>>setpagedevice"
+ Choice "Draft/Draft" "<</OutputType(-1)/HWResolution[600 600]>>setpagedevice"
+ Choice "Best/Best" "<</OutputType(1)/HWResolution[600 600]>>setpagedevice"
+ Choice "Photo/High-Resolution Photo" "<</OutputType(2)/HWResolution[1200 1200]>>setpagedevice"
+
+ // Duplexer is optional...
+ Installable "OptionDuplex/Duplexer Installed"
+
+ //Constraints
+ //MediaType & OutputMode
+ UIConstraints "*MediaType Plain *OutputMode Photo"
+ UIConstraints "*MediaType Glossy *OutputMode Draft"
+ UIConstraints "*MediaType TransparencyFilm *OutputMode Draft"
+
+
+ // Constraints
+ UIConstraints "*Duplex *OptionDuplex False"
+ UIConstraints "*PageSize Letter *Duplex"
+ UIConstraints "*PageSize A4 *Duplex"
+ UIConstraints "*PageSize JB5 *Duplex"
+ UIConstraints "*PageSize Executive *Duplex"
+
+ // Constraint FB and Draft
+ UIConstraints "*PageSize L.FB *OutputMode Draft"
+ UIConstraints "*PageSize Hagaki.FB *OutputMode Draft"
+ UIConstraints "*PageSize Photo4x6.FB *OutputMode Draft"
+ UIConstraints "*PageSize A6.FB *OutputMode Draft"
+ UIConstraints "*PageSize Photo5x7.FB *OutputMode Draft"
+ UIConstraints "*PageSize Photo2L.FB *OutputMode Draft"
+ UIConstraints "*PageSize A5.FB *OutputMode Draft"
+ UIConstraints "*PageSize 8x10.FB *OutputMode Draft"
+ UIConstraints "*PageSize Letter.FB *OutputMode Draft"
+ UIConstraints "*PageSize A4.FB *OutputMode Draft"
+ UIConstraints "*PageSize JB5.FB *OutputMode Draft"
+
+// 4x6 or smaller
+ CustomMedia "Card3x5/Index Card 3x5in" 216 360 9.36 9.36 9.36 9.36 "<</cupsInteger0 78/PageSize [216 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 78/PageSize[216 360]/ImagingBBox null>>setpagedevice"
+ CustomMedia "L/L 89x127mm" 252.288 360 9.36 9.36 9.36 9.36 "<</cupsInteger0 121/PageSize[252.288 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 121/PageSize[252.288 360]/ImagingBBox null>>setpagedevice"
+ CustomMedia "L.FB/L Borderless 89x127mm" 265 371 0 0 0 0 "<</cupsInteger0 121/PageSize [265 371]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 121/cupsReal0 .090/cupsReal1 .060/PageSize[265 371]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo3x5/Photo 3x5in" 216 360 9.36 9.36 9.36 9.36 "<</cupsInteger0 78/PageSize [216 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 78/PageSize[216 360]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo10x15/Photo 10x15cm" 288 432 9.36 9.36 9.36 9.36 "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki/Hagaki 100x148mm" 283.464 419.544 9.36 9.36 9.36 9.36 "<</cupsInteger0 71/PageSize[283.464 419.544]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/PageSize[283.464 419.544]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki.FB/Hagaki Borderless 100x148mm" 296 430 0 0 0 0 "<</cupsInteger0 71/PageSize[296 430]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/cupsReal0 .090/cupsReal1 .050/PageSize[296 430]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card4x6/Index Card 4x6in" 288 432 9.36 9.36 9.36 9.36 "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6/Photo 4x6in" 288 432 9.36 9.36 9.36 9.36 "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6.FB/Photo Borderless 4x6in" 301 442 0 0 0 0 "<</cupsInteger0 74/PageSize[301 442]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/cupsReal0 .090/cupsReal1 .050/PageSize[301 442]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo10x15.FB/Borderless 10x15cm" 301 442 0 0 0 0 "<</cupsInteger0 74/PageSize[301 442]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/cupsReal0 .090/cupsReal1 .050/PageSize[301 442]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6/A6 105x148mm" 297.648 419.544 9.36 9.36 9.36 9.36 "<</cupsInteger0 73/PageSize[297.648 419.544]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 73/PageSize[297.648 419.544]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6.FB/A6 Borderless 105x148mm" 311 431 0 0 0 0 "<</cupsInteger0 73/PageSize[311 431]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 73/cupsReal0 .090/cupsReal1 .060/PageSize[311 431]/ImagingBBox null>>setpagedevice"
+
+// 5x7
+ CustomMedia "Photo5x7/Photo 5x7in" 360 504 9.36 9.36 9.36 9.36 "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo13x18/13x18cm" 360 504 9.36 9.36 9.36 9.36 "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo5x7.FB/Photo Borderless 5x7in" 372 515 0 0 0 0 "<</cupsInteger0 122/PageSize[372 515]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/cupsReal0 .090/cupsReal1 .060/PageSize[372 515]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo13x18.FB/Borderless 13x18cm" 372 515 0 0 0 0 "<</cupsInteger0 122/PageSize[372 515]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/cupsReal0 .090/cupsReal1 .060/PageSize[372 515]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo2L/Photo 2L 127x178mm" 360 504.576 9.36 9.36 9.36 9.36 "<</cupsInteger0 126/PageSize[360 504.576]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 126/PageSize[360 504.576]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo2L.FB/Photo 2L Borderless 127x178mm" 373 515 0 0 0 0 "<</cupsInteger0 126/PageSize[373 515]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 126/cupsReal0 .090/cupsReal1 .060/PageSize[373 515]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Oufuku/Oufuku-Hagaki 200x148mm" 566.928 419.544 9.36 9.36 9.36 9.36 "<</cupsInteger0 72/PageSize[566.928 419.544]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 72/PageSize[566.928 419.544]/ImagingBBox null>>setpagedevice"
+
+// Standard
+ CustomMedia "Card5x8/Index Card 5x8in" 360 576 9.36 9.36 9.36 9.36 "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Statement/Statement 5.5x8.5in" 396 612 9.36 9.36 9.36 9.36 "<</cupsInteger0 15/PageSize[396 612]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 15/PageSize[396 612]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5/A5 148x210mm" 419.544 595.296 9.36 9.36 9.36 9.36 "<</cupsInteger0 25/PageSize[419.544 595.296]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/PageSize[419.544 595.296]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5.FB/A5 Borderless 148x210mm" 432 606 0 0 0 0 "<</cupsInteger0 25/PageSize[432 606]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/cupsReal0 .090/cupsReal1 .060/PageSize[432 606]/ImagingBBox null>>setpagedevice"
+ CustomMedia "6x8/6x8in" 432 576 9.36 9.36 9.36 9.36 "<</cupsInteger0 101/PageSize[432 576]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[432 576]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5/JB5 182x257mm" 515.88 728.496 9.36 9.36 9.36 9.36 "<</cupsInteger0 45/PageSize[515.88 728.496]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 45/PageSize [515.88 728.496]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5.FB/JB5 Borderless 182x257mm" 529 740 0 0 0 0 "<</cupsInteger0 45/PageSize[529 740]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 45/cupsReal0 .090/cupsReal1 .060/PageSize [529 740]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5.Duplex/JB5 AutoDuplex 182x257mm" 515.88 728.496 9.36 7.92 9.36 17.28 "<</cupsInteger0 45/PageSize[515.88 728.496]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 45/PageSize [515.88 728.496]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Executive/Executive 7.25x10.5in" 522 756 9.36 9.36 9.36 9.36 "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Executive.Duplex/Executive AutoDuplex 7.25x10.5in" 522 756 9.36 7.92 9.36 17.28 "<</cupsInteger0 1/PageSize[522 747]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[522 747]/ImagingBBox null>>setpagedevice"
+ CustomMedia "8x10/8x10in" 576 720 9.36 9.36 9.36 9.36 "<</cupsInteger0 7/PageSize[576 720]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 7/PageSize[576 720]/ImagingBBox null>>setpagedevice"
+ CustomMedia "8x10.FB/Borderless 8x10in" 589 731 0 0 0 0 "<</cupsInteger0 7/PageSize[589 731]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 7/cupsReal0 .090/cupsReal1 .060/PageSize[589 731]/ImagingBBox null>>setpagedevice"
+ *CustomMedia "Letter/Letter 8.5x11in" 612 792 9.36 9.36 9.36 9.36 "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Letter.FB/Letter Borderless 8.5x11in" 625 803 0 0 0 0 "<</cupsInteger0 2/PageSize[625 803]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/cupsReal0 .090/cupsReal1 .060/PageSize[625 803]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Letter.Duplex/Letter AutoDuplex 8.5x11in" 612 792 9.36 7.92 9.36 17.28 "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ CustomMedia "CardLetter/Index Card Letter 8.5x11in" 612 792 9.36 9.36 9.36 9.36 "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4/A4 210x297mm" 595.296 841.896 9.36 9.36 9.36 9.36 "<</cupsInteger0 26/PageSize[595.296 841.896]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/PageSize[595.296 841.896]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4.FB/A4 Borderless 210x297mm" 608 853 0 0 0 0 "<</cupsInteger0 26/PageSize[608 853]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/cupsReal0 .090/cupsReal1 .060/PageSize[608 853]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4.Duplex/A4 AutoDuplex 210x297mm" 595.296 841.896 9.36 7.92 9.36 17.28 "<</cupsInteger0 26/PageSize[595.296 841.896]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/PageSize[595.296 841.896]/ImagingBBox null>>setpagedevice"
+ CustomMedia "CardA4/Index Card A4 210x297mm" 595.44 841.68 9.36 9.36 9.36 9.36 "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ CustomMedia "8.5x13/8.5x13in" 612 936 9.36 9.36 9.36 9.36 "<</cupsInteger0 101/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Legal/Legal 8.5x14in" 612 1008 9.36 9.36 9.36 9.36 "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+
+// Envelope
+ CustomMedia "EnvA2/A2 Envelope 4.37x5.75in" 314.64 413.856 9.36 46.8 9.36 9.36 "<</cupsInteger0 109/PageSize[314.64 413.856]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 109/PageSize[314.64 413.856]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvCard/Card Envelope 4.4x6in" 315.36 432 9.36 46.8 9.36 9.36 "<</cupsInteger0 114/PageSize[315.36 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 114/PageSize[315.36 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC6/C6 Envelope 114x162mm" 323.136 459.216 9.36 46.8 9.36 9.36 "<</cupsInteger0 92/PageSize[323.136 459.216]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 92/PageSize[323.136 459.216]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou4/#4 Japanese Envelope 90x205mm" 255.096 581.112 9.36 46.8 9.36 9.36 "<</cupsInteger0 111/PageSize[255.096 581.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 111/PageSize[255.096 581.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvMonarch/Monarch Envelope 3.875x7.5in" 279.36 540 9.36 46.8 9.36 9.36 "<</cupsInteger0 80/PageSize[279.36 540]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 80/PageSize[279.36 540]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvDL/DL Envelope 110x220mm" 311.832 623.52 9.36 46.8 9.36 9.36 "<</cupsInteger0 90/PageSize[311.832 623.52]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 90/PageSize[311.832 623.52]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Env10/#10 Envelope 4.125x9.5in" 297.36 684 9.36 46.8 9.36 9.36 "<</cupsInteger0 81/PageSize[297.36 684]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 81/PageSize[297.36 684]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou3/#3 Japanese Envelope 120x235mm" 340.128 666.144 9.36 46.8 9.36 9.36 "<</cupsInteger0 110/PageSize[340.128 666.144]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 110/PageSize[340.128 666.144]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC5/C5 Envelope 162x229mm" 459.216 649.152 9.36 46.8 9.36 9.36 "<</cupsInteger0 91/PageSize[459.216 649.152]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 91/PageSize[459.216 649.152]/ImagingBBox null>>setpagedevice"
+
+ {
+ // Custom page sizes from 3x4in to Legal
+ HWMargins 9.36 9.36 9.36 9.36
+ VariablePaperSize Yes
+ MinSize 3in 5in
+ MaxSize 8.5in 14in
+
+ // <%Ampere:Normal%>
+ {
+ ModelName "HP Officejet Pro 8100"
+ Attribute "NickName" "" "HP Officejet Pro 8100, $Version"
+ Attribute "ShortNickName" "" "HP Officejet Pro 8100"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet pro 8100;DES:officejet pro 8100;"
+ PCFileName "hp-officejet_pro_8100.ppd"
+ Attribute "Product" "" "(HP Officejet Pro 8100 eprinter-n811a)"
+ }
+ {
+ ModelName "HP Officejet Pro 8600"
+ Attribute "NickName" "" "HP Officejet Pro 8600, $Version"
+ Attribute "ShortNickName" "" "HP Officejet Pro 8600"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet pro 8600;DES:officejet pro 8600;"
+ PCFileName "hp-officejet_pro_8600.ppd"
+ Attribute "Product" "" "(HP Officejet Pro 8600 E-aio n911a)"
+ Attribute "Product" "" "(HP Officejet Pro 8600 Plus E-aio n911g)"
+ }
+ } // End Supported media sizes with full bleed.
+
+} // End Ampere
+
+
+
+//////// Python with AutoDuplex and CDDVD (Photosmart c309a series)
+{
+ Attribute "cupsEvenDuplex" "" "True"
+ Attribute "cupsBackSide" "" "Rotated"
+ Attribute "cupsFlipDuplex" "" "True"
+ Attribute "hpPrinterLanguage" "" "pcl3gui2"
+ Attribute "HPMechOffset" "" "69"
+
+ Group "General/General"
+
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 10.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "<</Duplex true/Tumble false>>setpagedevice"
+ Choice "DuplexTumble/Short Edge (Flip)" "<</Duplex true/Tumble true>>setpagedevice"
+ *Choice "None/Off" "<</Duplex false/Tumble false>>setpagedevice"
+
+ // MediaPosition values map to MediaSource enumeration in global_types.h
+ Option "InputSlot/Media Source" PickOne AnySetup 10.0
+ *Choice "Auto/Auto-Select" "<</MediaPosition 7>>setpagedevice"
+ Choice "PhotoTray/Photo Tray" "<</MediaPosition 6>>setpagedevice"
+ Choice "Upper/Upper Tray" "<</MediaPosition 1>>setpagedevice"
+ Choice "CDDVDTray/CD or DVD Tray" "<</MediaPosition 14>>setpagedevice"
+
+ Option "ColorModel/Output Mode" PickOne AnySetup 10.0
+ Choice "CMYGray/High Quality Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 1>>setpagedevice"
+ Choice "KGray/Black Only Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 2>>setpagedevice"
+ *Choice "RGB/Color" "<</cupsColorSpace 17/cupsBitsPerColor 8/cupsRowStep 0>>setpagedevice"
+
+ // cupsMediaType values map to MEDIATYPE from global_types.h
+ Option "MediaType/Media Type" PickOne AnySetup 10.0
+ *Choice "Automatic/Automatic" "<</MediaType(Automatic)/cupsMediaType -1>>setpagedevice"
+ Choice "Plain/Plain Paper" "<</MediaType(Plain)/cupsMediaType 0>>setpagedevice"
+ Choice "Glossy/Photo Paper" "<</MediaType(Glossy)/cupsMediaType 3>>setpagedevice"
+ Choice "TransparencyFilm/Transparency Film" "<</MediaType(TransparencyFilm)/cupsMediaType 4>>setpagedevice"
+ Choice "CDDVDMedia/CD or DVD Media" "<</MediaType(CDDVDMedia)/cupsMediaType 7>>setpagedevice"
+
+ // cupsCompression values map to QUALITY_MODE from global_types.h
+ Option "OutputMode/Print Quality" PickOne AnySetup 10.0
+ Choice "Auto/Automatic" "<</OutputType(-3)/HWResolution[600 600]>>setpagedevice"
+ Choice "FastDraft/Fast Draft" "<</OutputType(-2)/HWResolution[300 300]>>setpagedevice"
+ *Choice "Normal/Normal" "<</OutputType(0)/HWResolution[600 600]>>setpagedevice"
+ Choice "Best/Best" "<</OutputType(1)/HWResolution[600 600]>>setpagedevice"
+
+ // Duplexer is optional...
+ Installable "OptionDuplex/Duplexer Installed"
+
+ // Constraints
+ UIConstraints "*Duplex *OptionDuplex False"
+ UIConstraints "*MediaType Automatic *OutputMode FastDraft"
+ UIConstraints "*MediaType Glossy *OutputMode FastDraft"
+ UIConstraints "*MediaType TransparencyFilm *OutputMode FastDraft"
+ UIConstraints "*MediaType TransparencyFilm *OutputMode Best"
+
+ // Non duplex media against duplex
+ UIConstraints "*PageSize Card3x5 *Duplex"
+ UIConstraints "*PageSize PhotoL *Duplex"
+ UIConstraints "*PageSize PhotoL.FB *Duplex"
+ UIConstraints "*PageSize Hagaki *Duplex"
+ UIConstraints "*PageSize Hagaki.FB *Duplex"
+ UIConstraints "*PageSize Card4x6 *Duplex"
+ UIConstraints "*PageSize Photo4x6 *Duplex"
+ UIConstraints "*PageSize Photo4x6.FB *Duplex"
+ UIConstraints "*PageSize A6 *Duplex"
+ UIConstraints "*PageSize A6.FB *Duplex"
+ UIConstraints "*PageSize HV *Duplex"
+ UIConstraints "*PageSize HV.FB *Duplex"
+ UIConstraints "*PageSize Photo5x7 *Duplex"
+ UIConstraints "*PageSize Photo5x7.FB *Duplex"
+ UIConstraints "*PageSize Photo2L *Duplex"
+ UIConstraints "*PageSize Photo2L.FB *Duplex"
+ UIConstraints "*PageSize Card5x8 *Duplex"
+ UIConstraints "*PageSize Oufuku *Duplex"
+ UIConstraints "*PageSize Cabinet *Duplex"
+ UIConstraints "*PageSize Cabinet.FB *Duplex"
+ UIConstraints "*PageSize A5 *Duplex"
+ UIConstraints "*PageSize A5.FB *Duplex"
+ UIConstraints "*PageSize B5 *Duplex"
+ UIConstraints "*PageSize JB5 *Duplex"
+ UIConstraints "*PageSize JB5.FB *Duplex"
+ UIConstraints "*PageSize Executive *Duplex"
+ UIConstraints "*PageSize 8x10 *Duplex"
+ UIConstraints "*PageSize Letter *Duplex"
+ UIConstraints "*PageSize Letter.FB *Duplex"
+ UIConstraints "*PageSize A4 *Duplex"
+ UIConstraints "*PageSize A4.FB *Duplex"
+ UIConstraints "*PageSize Legal *Duplex"
+ UIConstraints "*PageSize EnvA2 *Duplex"
+ UIConstraints "*PageSize EnvC6 *Duplex"
+ UIConstraints "*PageSize EnvChou4 *Duplex"
+ UIConstraints "*PageSize Env6 *Duplex"
+ UIConstraints "*PageSize EnvCard *Duplex"
+ UIConstraints "*PageSize EnvMonarch *Duplex"
+ UIConstraints "*PageSize EnvDL *Duplex"
+ UIConstraints "*PageSize Env10 *Duplex"
+ UIConstraints "*PageSize EnvChou3 *Duplex"
+ UIConstraints "*PageSize EnvC5 *Duplex"
+
+ // Constraint FB against FastDraft
+ UIConstraints "*PageSize PhotoL.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize L.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize Hagaki.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize Photo4x6.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize A6.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize HV.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize Photo5x7.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize Photo2L.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize Cabinet.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize A5.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize JB5.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize Letter.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize A4.FB *OutputMode FastDraft"
+
+// 4x6 or smaller
+ CustomMedia "Card3x5/Index Card 3x5in" 216 360 9 9 9 9 "<</cupsInteger0 78/PageSize [216 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 78/PageSize[216 360]/ImagingBBox null>>setpagedevice"
+ CustomMedia "PhotoL/Photo 3.5x5in" 252 360 9 9 9 9 "<</cupsInteger0 121/PageSize[252 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 121/PageSize[252 360]/ImagingBBox null>>setpagedevice"
+ CustomMedia "PhotoL.FB/Photo Borderless 3.5x5in" 264.744 374.112 0 0 0 0 "<</cupsInteger0 121/PageSize[264.744 374.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 121/cupsReal0 .079/cupsReal1 .098/PageSize[264.744 374.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "L/L 89x127mm" 252 360 9 9 9 9 "<</cupsInteger0 121/PageSize[252 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 121/PageSize[252 360]/ImagingBBox null>>setpagedevice"
+ CustomMedia "L.FB/L Borderless 89x127mm" 264.744 374.112 0 0 0 0 "<</cupsInteger0 121/PageSize[264.744 374.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 121/cupsReal0 .079/cupsReal1 .098/PageSize[264.744 374.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki/Hagaki 100x148mm" 283.68 419.76 9 9 9 9 "<</cupsInteger0 71/PageSize[283.68 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/PageSize[283.68 419.76]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki.FB/Hagaki Borderless 100x148mm" 296.424 433.872 0 0 0 0 "<</cupsInteger0 71/PageSize[296.424 433.872]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/cupsReal0 .079/cupsReal1 .098/PageSize[296.424 433.872]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki.Duplex/Hagaki AutoDuplex 100x148mm" 283.68 410.76 9 0 9 9 "<</cupsInteger0 71/PageSize[283.68 410.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/PageSize[283.68 410.76]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card4x6/Index Card 4x6in" 288 432 9 9 9 9 "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card4x6.Duplex/Index Card AutoDuplex 4x6in" 288 423 9 0 9 9 "<</cupsInteger0 74/PageSize[288 423]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[288 423]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6/Photo 4x6in" 288 432 9 9 9 9 "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6.FB/Photo Borderless 4x6in" 303.552 446.112 0 0 0 0 "<</cupsInteger0 74/PageSize[303.552 446.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/cupsReal0 .098/cupsReal1 .098/PageSize[303.552 446.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6/A6 105x148mm" 297.36 419.76 9 9 9 9 "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6.FB/A6 Borderless 105x148mm" 310.104 433.872 0 0 0 0 "<</cupsInteger0 73/PageSize[310.104 433.872]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 73/cupsReal0 .079/cupsReal1 .098/PageSize[310.104 433.872]/ImagingBBox null>>setpagedevice"
+
+// 5x7
+ CustomMedia "HV/HV 101x180mm" 286.56 510.48 9 9 9 9 "<</cupsInteger0 101/PageSize[286.56 510.48]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[286.56 510.48]/ImagingBBox null>>setpagedevice"
+ CustomMedia "HV.FB/HV Borderless 101x180mm" 302.112 524.592 0 0 0 0 "<</cupsInteger0 101/PageSize[302.112 524.592]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/cupsReal0 .098/cupsReal1 .098/PageSize[302.112 524.592]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo5x7/Photo 5x7in" 360 504 9 9 9 9 "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo5x7.FB/Photo Borderless 5x7in" 372.816 518.112 0 0 0 0 "<</cupsInteger0 122/PageSize[372.816 518.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/cupsReal0 .089/cupsReal1 .098/PageSize[372.816 518.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo2L/Photo 2L 127x178mm" 360 504 9 9 9 9 "<</cupsInteger0 126/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 126/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo2L.FB/Photo 2L Borderless 127x178mm" 372.816 518.112 0 0 0 0 "<</cupsInteger0 126/PageSize[372.816 518.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 126/cupsReal0 .089/cupsReal1 .098/PageSize[372.816 518.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card5x8/Index Card 5x8in" 360 576 9 9 9 9 "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card5x8.Duplex/Index Card AutoDuplex 5x8in" 360 567 9 27 9 36 "<</cupsInteger0 75/PageSize[360 567]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 75/PageSize[360 567]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Oufuku/Oufuku-Hagaki 200x148mm" 566.64 419.76 9 9 9 9 "<</cupsInteger0 72/PageSize[566.64 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 72/PageSize[566.64 419.76]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Oufuku.Duplex/Oufuku-Hagaki AutoDuplex 200x148mm" 566.64 410.76 9 0 9 9 "<</cupsInteger0 72/PageSize[566.64 410.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 72/PageSize[566.64 410.76]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Cabinet/Cabinet Size 120x165" 339.84 468 9 9 9 9 "<</cupsInteger0 119/PageSize[339.84 468]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 119/PageSize[339.84 468]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Cabinet.FB/Cabinet Size 120x165 Borderless" 352.584 482.112 0 0 0 0 "<</cupsInteger0 119/PageSize[352.584 482.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 119/cupsReal0 .079/cupsReal1 .098/PageSize[352.584 482.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5/A5 148x210mm" 419.76 595.44 9 9 9 9 "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5.FB/A5 Borderless 148x210mm" 435.312 609.552 0 0 0 0 "<</cupsInteger0 25/PageSize[435.312 609.552]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/cupsReal0 .098/cupsReal1 .098/PageSize[435.312 609.552]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5.Duplex/A5 AutoDuplex 148x210mm" 419.76 586.44 9 33.192 9 42.192 "<</cupsInteger0 25/PageSize[419.76 586.44]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/PageSize[419.76 586.44]/ImagingBBox null>>setpagedevice"
+
+// Standard
+ CustomMedia "B5/B5 176x250mm" 498.96 708.48 9 9 9 9 "<</cupsInteger0 65/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 65/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ CustomMedia "B5.Duplex/B5 AutoDuplex 176x250mm" 498.96 699.48 9 33.192 9 42.192 "<</cupsInteger0 65/PageSize[498.96 699.48]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 65/PageSize[498.96 699.48]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5/JB5 182x257mm" 516.24 728.64 9 9 9 9 "<</cupsInteger0 45/PageSize[516.24 728.64]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 45/PageSize [516.24 728.64]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5.FB/JB5 Borderless 182x257mm" 531.792 742.752 0 0 0 0 "<</cupsInteger0 45/PageSize[531.792 742.752]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 45/cupsReal0 .098/cupsReal1 .098/PageSize [531.792 742.752]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5.Duplex/JB5 AutoDuplex 182x257mm" 516.24 719.64 9 33.192 9 42.192 "<</cupsInteger0 45/PageSize[516.24 719.64]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 45/PageSize [516.24 719.64]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Executive/Executive 7.25x10.5in" 522 756 9 9 9 9 "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Executive.Duplex/Executive AutoDuplex 7.25x10.5in" 522 747 9 33.192 9 42.192 "<</cupsInteger0 1/PageSize[522 747]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[522 747]/ImagingBBox null>>setpagedevice"
+ CustomMedia "8x10/8x10in" 576 720 9 9 9 9 "<</cupsInteger0 7/PageSize[576 720]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 7/PageSize[576 720]/ImagingBBox null>>setpagedevice"
+ *CustomMedia "Letter/Letter 8.5x11in" 612 792 9 9 9 9 "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Letter.FB/Letter Borderless 8.5x11in" 627.552 806.112 0 0 0 0 "<</cupsInteger0 2/PageSize[627.552 806.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/cupsReal0 .098/cupsReal1 .098/PageSize[627.552 806.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Letter.Duplex/Letter AutoDuplex 8.5x11in" 612 783 9 33.192 9 42.192 "<</cupsInteger0 2/PageSize[612 783]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/PageSize[612 783]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4/A4 210x297mm" 595.44 841.68 9 9 9 9 "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4.FB/A4 Borderless 210x297mm" 610.992 855.792 0 0 0 0 "<</cupsInteger0 26/PageSize[610.992 855.792]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/cupsReal0 .098/cupsReal1 .098/PageSize[610.992 855.792]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4.Duplex/A4 AutoDuplex 210x297mm" 595.44 832.68 9 33.192 9 42.192 "<</cupsInteger0 26/PageSize[595.44 832.68]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/PageSize[595.44 832.68]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Legal/Legal 8.5x14in" 612 1008 9 9 9 9 "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+
+// Envelope
+ CustomMedia "EnvA2/A2 Envelope 4.37x5.75in" 314.64 414 9 42.192 9 9 "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC6/C6 Envelope 114x162mm" 323.28 459.36 9 42.192 9 9 "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou4/#4 Japanese Envelope 90x205mm" 254.88 581.04 9 42.192 9 9 "<</cupsInteger0 111/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 111/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Env6/#6 Envelope 3.63x6.5in" 261.36 468 9 42.192 9 9 "<</cupsInteger0 83/PageSize[261.36 468]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 83/PageSize[261.36 468]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvCard/Card Envelope 4.4x6in" 315 432 9 42.192 9 9 "<</cupsInteger0 114/PageSize[315 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 114/PageSize[315 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvMonarch/Monarch Envelope 3.875x7.5in" 279 540 9 42.192 9 9 "<</cupsInteger0 80/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 80/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvDL/DL Envelope 110x220mm" 311.76 623.52 9 42.192 9 9 "<</cupsInteger0 90/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 90/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Env10/#10 Envelope 4.125x9.5in" 297 684 9 42.192 9 9 "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou3/#3 Japanese Envelope 120x235mm" 339.84 666 9 42.192 9 9 "<</cupsInteger0 110/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 110/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC5/C5 Envelope 162x229mm" 459.36 649.44 9 42.192 9 9 "<</cupsInteger0 91/PageSize[459.36 649.44]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 91/PageSize[459.36 649.44]/ImagingBBox null>>setpagedevice"
+
+ {
+ // CDDVD
+ UIConstraints "*InputSlot CDDVDTray *MediaType Automatic"
+ UIConstraints "*InputSlot CDDVDTray *MediaType Plain"
+ UIConstraints "*InputSlot CDDVDTray *MediaType Glossy"
+ UIConstraints "*InputSlot CDDVDTray *MediaType TransparencyFilm"
+
+ // CDDVD
+ CustomMedia "CDDVD80/CD DVD 80mm" 254.88 254.88 14.184 14.184 14.184 14.184 "<</cupsInteger0 98/PageSize[254.88 254.88]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 98/PageSize[254.88 254.88]/ImagingBBox null>>setpagedevice"
+ CustomMedia "CDDVD120/CD DVD 120mm" 368.64 368.64 14.184 14.184 14.184 14.184 "<</cupsInteger0 99/PageSize[368.64 368.64]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 99/PageSize[368.64 368.64]/ImagingBBox null>>setpagedevice"
+
+ // Custom page sizes from 3x4in to Legal
+ HWMargins 9 9 9 9
+ VariablePaperSize Yes
+ MinSize 3in 4in
+ MaxSize 8.5in 30in
+
+ // <%Python:NoMaxDPI%>
+ {
+ ModelName "HP Photosmart c309a Series"
+ Attribute "NickName" "" "HP Photosmart c309a Series, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart c309a Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart c309a series;DES:photosmart c309a series;"
+ PCFileName "hp-photosmart_c309a_series.ppd"
+ Attribute "Product" "" "(HP Photosmart Premium Fax All-in-one Printer - c309a)"
+ }
+ } // End Supported media sizes with full bleed and Duplex.
+
+} // End Python with AutoDuplex and CDDVD
+
+//////// Python without CD-DVD
+{
+ Attribute "cupsEvenDuplex" "" "True"
+ Attribute "cupsBackSide" "" "Rotated"
+ Attribute "cupsFlipDuplex" "" "True"
+ Attribute "hpPrinterLanguage" "" "pcl3gui2"
+ Attribute "HPMechOffset" "" "69"
+
+ Group "General/General"
+
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 10.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "<</Duplex true/Tumble false>>setpagedevice"
+ Choice "DuplexTumble/Short Edge (Flip)" "<</Duplex true/Tumble true>>setpagedevice"
+ *Choice "None/Off" "<</Duplex false/Tumble false>>setpagedevice"
+
+ // MediaPosition values map to MediaSource enumeration in global_types.h
+ Option "InputSlot/Media Source" PickOne AnySetup 10.0
+ *Choice "Auto/Auto-Select" "<</MediaPosition 7>>setpagedevice"
+ Choice "PhotoTray/Photo Tray" "<</MediaPosition 6>>setpagedevice"
+ Choice "Upper/Upper Tray" "<</MediaPosition 1>>setpagedevice"
+
+ Option "ColorModel/Output Mode" PickOne AnySetup 10.0
+ Choice "CMYGray/High Quality Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 1>>setpagedevice"
+ Choice "KGray/Black Only Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 2>>setpagedevice"
+ *Choice "RGB/Color" "<</cupsColorSpace 17/cupsBitsPerColor 8/cupsRowStep 0>>setpagedevice"
+
+ // cupsMediaType values map to MEDIATYPE from global_types.h
+ Option "MediaType/Media Type" PickOne AnySetup 10.0
+ *Choice "Automatic/Automatic" "<</MediaType(Automatic)/cupsMediaType -1>>setpagedevice"
+ Choice "Plain/Plain Paper" "<</MediaType(Plain)/cupsMediaType 0>>setpagedevice"
+ Choice "Glossy/Photo Paper" "<</MediaType(Glossy)/cupsMediaType 3>>setpagedevice"
+ Choice "TransparencyFilm/Transparency Film" "<</MediaType(TransparencyFilm)/cupsMediaType 4>>setpagedevice"
+
+ // cupsCompression values map to QUALITY_MODE from global_types.h
+ Option "OutputMode/Print Quality" PickOne AnySetup 10.0
+ Choice "Auto/Automatic" "<</OutputType(-3)/HWResolution[600 600]>>setpagedevice"
+ Choice "FastDraft/Fast Draft" "<</OutputType(-2)/HWResolution[300 300]>>setpagedevice"
+ *Choice "Normal/Normal" "<</OutputType(0)/HWResolution[600 600]>>setpagedevice"
+ Choice "Best/Best" "<</OutputType(1)/HWResolution[600 600]>>setpagedevice"
+ Choice "Photo/High-Resolution Photo" "<</OutputType(2)/HWResolution[1200 1200]>>setpagedevice"
+
+ // Duplexer is optional...
+ Installable "OptionDuplex/Duplexer Installed"
+
+ // Constraints
+ UIConstraints "*Duplex *OptionDuplex False"
+ UIConstraints "*ColorModel KGray *OutputMode Photo"
+ UIConstraints "*ColorModel CMYGray *OutputMode Photo"
+ UIConstraints "*MediaType Automatic *OutputMode FastDraft"
+ UIConstraints "*MediaType Glossy *OutputMode FastDraft"
+ UIConstraints "*MediaType TransparencyFilm *OutputMode FastDraft"
+ UIConstraints "*MediaType TransparencyFilm *OutputMode Best"
+ UIConstraints "*MediaType TransparencyFilm *OutputMode Photo"
+ UIConstraints "*MediaType Plain *OutputMode Photo"
+
+ // Non duplex media against duplex
+ UIConstraints "*PageSize Card3x5 *Duplex"
+ UIConstraints "*PageSize PhotoL *Duplex"
+ UIConstraints "*PageSize PhotoL.FB *Duplex"
+ UIConstraints "*PageSize Hagaki *Duplex"
+ UIConstraints "*PageSize Hagaki.FB *Duplex"
+ UIConstraints "*PageSize Card4x6 *Duplex"
+ UIConstraints "*PageSize Photo4x6 *Duplex"
+ UIConstraints "*PageSize Photo4x6.FB *Duplex"
+ UIConstraints "*PageSize A6 *Duplex"
+ UIConstraints "*PageSize A6.FB *Duplex"
+ UIConstraints "*PageSize HV *Duplex"
+ UIConstraints "*PageSize HV.FB *Duplex"
+ UIConstraints "*PageSize Photo5x7 *Duplex"
+ UIConstraints "*PageSize Photo5x7.FB *Duplex"
+ UIConstraints "*PageSize Photo2L *Duplex"
+ UIConstraints "*PageSize Photo2L.FB *Duplex"
+ UIConstraints "*PageSize Card5x8 *Duplex"
+ UIConstraints "*PageSize Oufuku *Duplex"
+ UIConstraints "*PageSize Cabinet *Duplex"
+ UIConstraints "*PageSize Cabinet.FB *Duplex"
+ UIConstraints "*PageSize A5 *Duplex"
+ UIConstraints "*PageSize A5.FB *Duplex"
+ UIConstraints "*PageSize B5 *Duplex"
+ UIConstraints "*PageSize JB5 *Duplex"
+ UIConstraints "*PageSize JB5.FB *Duplex"
+ UIConstraints "*PageSize Executive *Duplex"
+ UIConstraints "*PageSize 8x10 *Duplex"
+ UIConstraints "*PageSize Letter *Duplex"
+ UIConstraints "*PageSize Letter.FB *Duplex"
+ UIConstraints "*PageSize A4 *Duplex"
+ UIConstraints "*PageSize A4.FB *Duplex"
+ UIConstraints "*PageSize Legal *Duplex"
+ UIConstraints "*PageSize EnvA2 *Duplex"
+ UIConstraints "*PageSize EnvC6 *Duplex"
+ UIConstraints "*PageSize EnvChou4 *Duplex"
+ UIConstraints "*PageSize Env6 *Duplex"
+ UIConstraints "*PageSize EnvCard *Duplex"
+ UIConstraints "*PageSize EnvMonarch *Duplex"
+ UIConstraints "*PageSize EnvDL *Duplex"
+ UIConstraints "*PageSize Env10 *Duplex"
+ UIConstraints "*PageSize EnvChou3 *Duplex"
+ UIConstraints "*PageSize EnvC5 *Duplex"
+
+ // Constraint FB against FastDraft
+ UIConstraints "*PageSize PhotoL.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize L.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize Hagaki.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize Photo4x6.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize A6.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize HV.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize Photo5x7.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize Photo2L.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize Cabinet.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize A5.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize JB5.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize Letter.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize A4.FB *OutputMode FastDraft"
+
+// 4x6 or smaller
+ CustomMedia "Card3x5/Index Card 3x5in" 216 360 9 9 9 9 "<</cupsInteger0 78/PageSize [216 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 78/PageSize[216 360]/ImagingBBox null>>setpagedevice"
+ CustomMedia "PhotoL/Photo 3.5x5in" 252 360 9 9 9 9 "<</cupsInteger0 121/PageSize[252 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 121/PageSize[252 360]/ImagingBBox null>>setpagedevice"
+ CustomMedia "PhotoL.FB/Photo Borderless 3.5x5in" 264.744 374.112 0 0 0 0 "<</cupsInteger0 121/PageSize[264.744 374.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 121/cupsReal0 .079/cupsReal1 .098/PageSize[264.744 374.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "L/L 89x127mm" 252 360 9 9 9 9 "<</cupsInteger0 121/PageSize[252 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 121/PageSize[252 360]/ImagingBBox null>>setpagedevice"
+ CustomMedia "L.FB/L Borderless 89x127mm" 264.744 374.112 0 0 0 0 "<</cupsInteger0 121/PageSize[264.744 374.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 121/cupsReal0 .079/cupsReal1 .098/PageSize[264.744 374.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki/Hagaki 100x148mm" 283.68 419.76 9 9 9 9 "<</cupsInteger0 71/PageSize[283.68 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/PageSize[283.68 419.76]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki.FB/Hagaki Borderless 100x148mm" 296.424 433.872 0 0 0 0 "<</cupsInteger0 71/PageSize[296.424 433.872]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/cupsReal0 .079/cupsReal1 .098/PageSize[296.424 433.872]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki.Duplex/Hagaki AutoDuplex 100x148mm" 283.68 410.76 9 0 9 9 "<</cupsInteger0 71/PageSize[283.68 410.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/PageSize[283.68 410.76]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card4x6/Index Card 4x6in" 288 432 9 9 9 9 "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card4x6.Duplex/Index Card AutoDuplex 4x6in" 288 423 9 0 9 9 "<</cupsInteger0 74/PageSize[288 423]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[288 423]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6/Photo 4x6in" 288 432 9 9 9 9 "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6.FB/Photo Borderless 4x6in" 303.552 446.112 0 0 0 0 "<</cupsInteger0 74/PageSize[303.552 446.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/cupsReal0 .098/cupsReal1 .098/PageSize[303.552 446.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6/A6 105x148mm" 297.36 419.76 9 9 9 9 "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6.FB/A6 Borderless 105x148mm" 310.104 433.872 0 0 0 0 "<</cupsInteger0 73/PageSize[310.104 433.872]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 73/cupsReal0 .079/cupsReal1 .098/PageSize[310.104 433.872]/ImagingBBox null>>setpagedevice"
+
+// 5x7
+ CustomMedia "HV/HV 101x180mm" 286.56 510.48 9 9 9 9 "<</cupsInteger0 101/PageSize[286.56 510.48]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[286.56 510.48]/ImagingBBox null>>setpagedevice"
+ CustomMedia "HV.FB/HV Borderless 101x180mm" 302.112 524.592 0 0 0 0 "<</cupsInteger0 101/PageSize[302.112 524.592]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/cupsReal0 .098/cupsReal1 .098/PageSize[302.112 524.592]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo5x7/Photo 5x7in" 360 504 9 9 9 9 "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo5x7.FB/Photo Borderless 5x7in" 372.816 518.112 0 0 0 0 "<</cupsInteger0 122/PageSize[372.816 518.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/cupsReal0 .089/cupsReal1 .098/PageSize[372.816 518.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo2L/Photo 2L 127x178mm" 360 504 9 9 9 9 "<</cupsInteger0 126/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 126/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo2L.FB/Photo 2L Borderless 127x178mm" 372.816 518.112 0 0 0 0 "<</cupsInteger0 126/PageSize[372.816 518.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 126/cupsReal0 .089/cupsReal1 .098/PageSize[372.816 518.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card5x8/Index Card 5x8in" 360 576 9 9 9 9 "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card5x8.Duplex/Index Card AutoDuplex 5x8in" 360 567 9 27 9 36 "<</cupsInteger0 75/PageSize[360 567]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 75/PageSize[360 567]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Oufuku/Oufuku-Hagaki 200x148mm" 566.64 419.76 9 9 9 9 "<</cupsInteger0 72/PageSize[566.64 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 72/PageSize[566.64 419.76]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Oufuku.Duplex/Oufuku-Hagaki AutoDuplex 200x148mm" 566.64 410.76 9 0 9 9 "<</cupsInteger0 72/PageSize[566.64 410.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 72/PageSize[566.64 410.76]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Cabinet/Cabinet Size 120x165" 339.84 468 9 9 9 9 "<</cupsInteger0 119/PageSize[339.84 468]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 119/PageSize[339.84 468]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Cabinet.FB/Cabinet Size 120x165 Borderless" 352.584 482.112 0 0 0 0 "<</cupsInteger0 119/PageSize[352.584 482.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 119/cupsReal0 .079/cupsReal1 .098/PageSize[352.584 482.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5/A5 148x210mm" 419.76 595.44 9 9 9 9 "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5.FB/A5 Borderless 148x210mm" 435.312 609.552 0 0 0 0 "<</cupsInteger0 25/PageSize[435.312 609.552]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/cupsReal0 .098/cupsReal1 .098/PageSize[435.312 609.552]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5.Duplex/A5 AutoDuplex 148x210mm" 419.76 586.44 9 33.192 9 42.192 "<</cupsInteger0 25/PageSize[419.76 586.44]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/PageSize[419.76 586.44]/ImagingBBox null>>setpagedevice"
+
+// Standard
+ CustomMedia "B5/B5 176x250mm" 498.96 708.48 9 9 9 9 "<</cupsInteger0 65/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 65/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ CustomMedia "B5.Duplex/B5 AutoDuplex 176x250mm" 498.96 699.48 9 33.192 9 42.192 "<</cupsInteger0 65/PageSize[498.96 699.48]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 65/PageSize[498.96 699.48]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5/JB5 182x257mm" 516.24 728.64 9 9 9 9 "<</cupsInteger0 45/PageSize[516.24 728.64]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 45/PageSize [516.24 728.64]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5.FB/JB5 Borderless 182x257mm" 531.792 742.752 0 0 0 0 "<</cupsInteger0 45/PageSize[531.792 742.752]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 45/cupsReal0 .098/cupsReal1 .098/PageSize [531.792 742.752]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5.Duplex/JB5 AutoDuplex 182x257mm" 516.24 719.64 9 33.192 9 42.192 "<</cupsInteger0 45/PageSize[516.24 719.64]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 45/PageSize [516.24 719.64]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Executive/Executive 7.25x10.5in" 522 756 9 9 9 9 "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Executive.Duplex/Executive AutoDuplex 7.25x10.5in" 522 747 9 33.192 9 42.192 "<</cupsInteger0 1/PageSize[522 747]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[522 747]/ImagingBBox null>>setpagedevice"
+ CustomMedia "8x10/8x10in" 576 720 9 9 9 9 "<</cupsInteger0 7/PageSize[576 720]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 7/PageSize[576 720]/ImagingBBox null>>setpagedevice"
+ *CustomMedia "Letter/Letter 8.5x11in" 612 792 9 9 9 9 "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Letter.FB/Letter Borderless 8.5x11in" 627.552 806.112 0 0 0 0 "<</cupsInteger0 2/PageSize[627.552 806.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/cupsReal0 .098/cupsReal1 .098/PageSize[627.552 806.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Letter.Duplex/Letter AutoDuplex 8.5x11in" 612 783 9 33.192 9 42.192 "<</cupsInteger0 2/PageSize[612 783]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/PageSize[612 783]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4/A4 210x297mm" 595.44 841.68 9 9 9 9 "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4.FB/A4 Borderless 210x297mm" 610.992 855.792 0 0 0 0 "<</cupsInteger0 26/PageSize[610.992 855.792]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/cupsReal0 .098/cupsReal1 .098/PageSize[610.992 855.792]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4.Duplex/A4 AutoDuplex 210x297mm" 595.44 832.68 9 33.192 9 42.192 "<</cupsInteger0 26/PageSize[595.44 832.68]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/PageSize[595.44 832.68]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Legal/Legal 8.5x14in" 612 1008 9 9 9 9 "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+
+// Envelope
+ CustomMedia "EnvA2/A2 Envelope 4.37x5.75in" 314.64 414 9 42.192 9 9 "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC6/C6 Envelope 114x162mm" 323.28 459.36 9 42.192 9 9 "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou4/#4 Japanese Envelope 90x205mm" 254.88 581.04 9 42.192 9 9 "<</cupsInteger0 111/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 111/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Env6/#6 Envelope 3.63x6.5in" 261.36 468 9 42.192 9 9 "<</cupsInteger0 83/PageSize[261.36 468]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 83/PageSize[261.36 468]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvCard/Card Envelope 4.4x6in" 315 432 9 42.192 9 9 "<</cupsInteger0 114/PageSize[315 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 114/PageSize[315 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvMonarch/Monarch Envelope 3.875x7.5in" 279 540 9 42.192 9 9 "<</cupsInteger0 80/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 80/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvDL/DL Envelope 110x220mm" 311.76 623.52 9 42.192 9 9 "<</cupsInteger0 90/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 90/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Env10/#10 Envelope 4.125x9.5in" 297 684 9 42.192 9 9 "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou3/#3 Japanese Envelope 120x235mm" 339.84 666 9 42.192 9 9 "<</cupsInteger0 110/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 110/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC5/C5 Envelope 162x229mm" 459.36 649.44 9 42.192 9 9 "<</cupsInteger0 91/PageSize[459.36 649.44]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 91/PageSize[459.36 649.44]/ImagingBBox null>>setpagedevice"
+
+ // Custom page sizes from 3x4in to Legal
+ HWMargins 9 9 9 9
+ VariablePaperSize Yes
+ MinSize 3in 4in
+ MaxSize 8.5in 30in
+
+ // <%Python:NoCDDVD%>
+ {
+ ModelName "HP Officejet 6000 e609n"
+ Attribute "NickName" "" "HP Officejet 6000 e609n, $Version"
+ Attribute "ShortNickName" "" "HP Officejet 6000 e609n"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet 6000 e609n;DES:officejet 6000 e609n;"
+ PCFileName "hp-officejet_6000_e609n.ppd"
+ Attribute "Product" "" "(HP Officejet 6000 Wireless Printer - e609n)"
+ }
+ {
+ ModelName "HP Officejet 6500 e709n"
+ Attribute "NickName" "" "HP Officejet 6500 e709n, $Version"
+ Attribute "ShortNickName" "" "HP Officejet 6500 e709n"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet 6500 e709n;DES:officejet 6500 e709n;"
+ PCFileName "hp-officejet_6500_e709n.ppd"
+ Attribute "Product" "" "(HP Officejet 6500 Wireless All-in-one Printer - e709n)"
+ Attribute "Product" "" "(HP Officejet 6500 Wireless All-in-one Printer - e709q)"
+ }
+ // End Supported media sizes with full bleed and Duplex.
+
+} // End Python without CD-DVD
+
+//////// Python without CD-DVD and NoMaxDPI
+{
+ Attribute "cupsEvenDuplex" "" "True"
+ Attribute "cupsBackSide" "" "Rotated"
+ Attribute "cupsFlipDuplex" "" "True"
+ Attribute "hpPrinterLanguage" "" "pcl3gui2"
+ Attribute "HPMechOffset" "" "69"
+
+ Group "General/General"
+
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 10.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "<</Duplex true/Tumble false>>setpagedevice"
+ Choice "DuplexTumble/Short Edge (Flip)" "<</Duplex true/Tumble true>>setpagedevice"
+ *Choice "None/Off" "<</Duplex false/Tumble false>>setpagedevice"
+
+ // MediaPosition values map to MediaSource enumeration in global_types.h
+ Option "InputSlot/Media Source" PickOne AnySetup 10.0
+ *Choice "Auto/Auto-Select" "<</MediaPosition 7>>setpagedevice"
+ Choice "PhotoTray/Photo Tray" "<</MediaPosition 6>>setpagedevice"
+ Choice "Upper/Upper Tray" "<</MediaPosition 1>>setpagedevice"
+
+ Option "ColorModel/Output Mode" PickOne AnySetup 10.0
+ Choice "CMYGray/High Quality Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 1>>setpagedevice"
+ Choice "KGray/Black Only Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 2>>setpagedevice"
+ *Choice "RGB/Color" "<</cupsColorSpace 17/cupsBitsPerColor 8/cupsRowStep 0>>setpagedevice"
+
+ // cupsMediaType values map to MEDIATYPE from global_types.h
+ Option "MediaType/Media Type" PickOne AnySetup 10.0
+ *Choice "Automatic/Automatic" "<</MediaType(Automatic)/cupsMediaType -1>>setpagedevice"
+ Choice "Plain/Plain Paper" "<</MediaType(Plain)/cupsMediaType 0>>setpagedevice"
+ Choice "Glossy/Photo Paper" "<</MediaType(Glossy)/cupsMediaType 3>>setpagedevice"
+ Choice "TransparencyFilm/Transparency Film" "<</MediaType(TransparencyFilm)/cupsMediaType 4>>setpagedevice"
+
+ // cupsCompression values map to QUALITY_MODE from global_types.h
+ Option "OutputMode/Print Quality" PickOne AnySetup 10.0
+ *Choice "Normal/Normal" "<</OutputType(0)/HWResolution[600 600]>>setpagedevice"
+ Choice "Best/Best" "<</OutputType(1)/HWResolution[600 600]>>setpagedevice"
+ Choice "FastDraft/Fast Draft" "<</OutputType(-2)/HWResolution[300 300]>>setpagedevice"
+ Choice "Auto/Automatic" "<</OutputType(-3)/HWResolution[600 600]>>setpagedevice"
+
+ // Duplexer is optional...
+ Installable "OptionDuplex/Duplexer Installed"
+
+ // Constraints
+ UIConstraints "*Duplex *OptionDuplex False"
+ UIConstraints "*MediaType Automatic *OutputMode FastDraft"
+ UIConstraints "*MediaType Glossy *OutputMode FastDraft"
+ UIConstraints "*MediaType TransparencyFilm *OutputMode FastDraft"
+ UIConstraints "*MediaType TransparencyFilm *OutputMode Best"
+
+ // Non duplex media against duplex
+ UIConstraints "*PageSize Card3x5 *Duplex"
+ UIConstraints "*PageSize PhotoL *Duplex"
+ UIConstraints "*PageSize PhotoL.FB *Duplex"
+ UIConstraints "*PageSize Hagaki *Duplex"
+ UIConstraints "*PageSize Hagaki.FB *Duplex"
+ UIConstraints "*PageSize Card4x6 *Duplex"
+ UIConstraints "*PageSize Photo4x6 *Duplex"
+ UIConstraints "*PageSize Photo4x6.FB *Duplex"
+ UIConstraints "*PageSize A6 *Duplex"
+ UIConstraints "*PageSize A6.FB *Duplex"
+ UIConstraints "*PageSize HV *Duplex"
+ UIConstraints "*PageSize HV.FB *Duplex"
+ UIConstraints "*PageSize Photo5x7 *Duplex"
+ UIConstraints "*PageSize Photo5x7.FB *Duplex"
+ UIConstraints "*PageSize Photo2L *Duplex"
+ UIConstraints "*PageSize Photo2L.FB *Duplex"
+ UIConstraints "*PageSize Card5x8 *Duplex"
+ UIConstraints "*PageSize Oufuku *Duplex"
+ UIConstraints "*PageSize Cabinet *Duplex"
+ UIConstraints "*PageSize Cabinet.FB *Duplex"
+ UIConstraints "*PageSize A5 *Duplex"
+ UIConstraints "*PageSize A5.FB *Duplex"
+ UIConstraints "*PageSize B5 *Duplex"
+ UIConstraints "*PageSize JB5 *Duplex"
+ UIConstraints "*PageSize JB5.FB *Duplex"
+ UIConstraints "*PageSize Executive *Duplex"
+ UIConstraints "*PageSize 8x10 *Duplex"
+ UIConstraints "*PageSize Letter *Duplex"
+ UIConstraints "*PageSize Letter.FB *Duplex"
+ UIConstraints "*PageSize A4 *Duplex"
+ UIConstraints "*PageSize A4.FB *Duplex"
+ UIConstraints "*PageSize Legal *Duplex"
+ UIConstraints "*PageSize EnvA2 *Duplex"
+ UIConstraints "*PageSize EnvC6 *Duplex"
+ UIConstraints "*PageSize EnvChou4 *Duplex"
+ UIConstraints "*PageSize Env6 *Duplex"
+ UIConstraints "*PageSize EnvCard *Duplex"
+ UIConstraints "*PageSize EnvMonarch *Duplex"
+ UIConstraints "*PageSize EnvDL *Duplex"
+ UIConstraints "*PageSize Env10 *Duplex"
+ UIConstraints "*PageSize EnvChou3 *Duplex"
+ UIConstraints "*PageSize EnvC5 *Duplex"
+
+ // Constraint FB against FastDraft
+ UIConstraints "*PageSize PhotoL.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize L.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize Hagaki.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize Photo4x6.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize A6.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize HV.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize Photo5x7.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize Photo2L.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize Cabinet.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize A5.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize JB5.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize Letter.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize A4.FB *OutputMode FastDraft"
+
+// 4x6 or smaller
+ CustomMedia "Card3x5/Index Card 3x5in" 216 360 9 9 9 9 "<</cupsInteger0 78/PageSize [216 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 78/PageSize[216 360]/ImagingBBox null>>setpagedevice"
+ CustomMedia "PhotoL/Photo 3.5x5in" 252 360 9 9 9 9 "<</cupsInteger0 121/PageSize[252 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 121/PageSize[252 360]/ImagingBBox null>>setpagedevice"
+ CustomMedia "PhotoL.FB/Photo Borderless 3.5x5in" 264.744 374.112 0 0 0 0 "<</cupsInteger0 121/PageSize[264.744 374.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 121/cupsReal0 .079/cupsReal1 .098/PageSize[264.744 374.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "L/L 89x127mm" 252 360 9 9 9 9 "<</cupsInteger0 121/PageSize[252 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 121/PageSize[252 360]/ImagingBBox null>>setpagedevice"
+ CustomMedia "L.FB/L Borderless 89x127mm" 264.744 374.112 0 0 0 0 "<</cupsInteger0 121/PageSize[264.744 374.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 121/cupsReal0 .079/cupsReal1 .098/PageSize[264.744 374.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki/Hagaki 100x148mm" 283.68 419.76 9 9 9 9 "<</cupsInteger0 71/PageSize[283.68 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/PageSize[283.68 419.76]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki.FB/Hagaki Borderless 100x148mm" 296.424 433.872 0 0 0 0 "<</cupsInteger0 71/PageSize[296.424 433.872]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/cupsReal0 .079/cupsReal1 .098/PageSize[296.424 433.872]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki.Duplex/Hagaki AutoDuplex 100x148mm" 283.68 410.76 9 0 9 9 "<</cupsInteger0 71/PageSize[283.68 410.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/PageSize[283.68 410.76]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card4x6/Index Card 4x6in" 288 432 9 9 9 9 "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card4x6.Duplex/Index Card AutoDuplex 4x6in" 288 423 9 0 9 9 "<</cupsInteger0 74/PageSize[288 423]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[288 423]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6/Photo 4x6in" 288 432 9 9 9 9 "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6.FB/Photo Borderless 4x6in" 303.552 446.112 0 0 0 0 "<</cupsInteger0 74/PageSize[303.552 446.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/cupsReal0 .098/cupsReal1 .098/PageSize[303.552 446.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6/A6 105x148mm" 297.36 419.76 9 9 9 9 "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6.FB/A6 Borderless 105x148mm" 310.104 433.872 0 0 0 0 "<</cupsInteger0 73/PageSize[310.104 433.872]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 73/cupsReal0 .079/cupsReal1 .098/PageSize[310.104 433.872]/ImagingBBox null>>setpagedevice"
+
+// 5x7
+ CustomMedia "HV/HV 101x180mm" 286.56 510.48 9 9 9 9 "<</cupsInteger0 101/PageSize[286.56 510.48]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[286.56 510.48]/ImagingBBox null>>setpagedevice"
+ CustomMedia "HV.FB/HV Borderless 101x180mm" 302.112 524.592 0 0 0 0 "<</cupsInteger0 101/PageSize[302.112 524.592]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/cupsReal0 .098/cupsReal1 .098/PageSize[302.112 524.592]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo5x7/Photo 5x7in" 360 504 9 9 9 9 "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo5x7.FB/Photo Borderless 5x7in" 372.816 518.112 0 0 0 0 "<</cupsInteger0 122/PageSize[372.816 518.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/cupsReal0 .089/cupsReal1 .098/PageSize[372.816 518.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo2L/Photo 2L 127x178mm" 360 504 9 9 9 9 "<</cupsInteger0 126/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 126/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo2L.FB/Photo 2L Borderless 127x178mm" 372.816 518.112 0 0 0 0 "<</cupsInteger0 126/PageSize[372.816 518.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 126/cupsReal0 .089/cupsReal1 .098/PageSize[372.816 518.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card5x8/Index Card 5x8in" 360 576 9 9 9 9 "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card5x8.Duplex/Index Card AutoDuplex 5x8in" 360 567 9 27 9 36 "<</cupsInteger0 75/PageSize[360 567]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 75/PageSize[360 567]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Oufuku/Oufuku-Hagaki 200x148mm" 566.64 419.76 9 9 9 9 "<</cupsInteger0 72/PageSize[566.64 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 72/PageSize[566.64 419.76]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Oufuku.Duplex/Oufuku-Hagaki AutoDuplex 200x148mm" 566.64 410.76 9 0 9 9 "<</cupsInteger0 72/PageSize[566.64 410.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 72/PageSize[566.64 410.76]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Cabinet/Cabinet Size 120x165" 339.84 468 9 9 9 9 "<</cupsInteger0 119/PageSize[339.84 468]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 119/PageSize[339.84 468]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Cabinet.FB/Cabinet Size 120x165 Borderless" 352.584 482.112 0 0 0 0 "<</cupsInteger0 119/PageSize[352.584 482.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 119/cupsReal0 .079/cupsReal1 .098/PageSize[352.584 482.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5/A5 148x210mm" 419.76 595.44 9 9 9 9 "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5.FB/A5 Borderless 148x210mm" 435.312 609.552 0 0 0 0 "<</cupsInteger0 25/PageSize[435.312 609.552]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/cupsReal0 .098/cupsReal1 .098/PageSize[435.312 609.552]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5.Duplex/A5 AutoDuplex 148x210mm" 419.76 586.44 9 33.192 9 42.192 "<</cupsInteger0 25/PageSize[419.76 586.44]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/PageSize[419.76 586.44]/ImagingBBox null>>setpagedevice"
+
+// Standard
+ CustomMedia "B5/B5 176x250mm" 498.96 708.48 9 9 9 9 "<</cupsInteger0 65/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 65/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ CustomMedia "B5.Duplex/B5 AutoDuplex 176x250mm" 498.96 699.48 9 33.192 9 42.192 "<</cupsInteger0 65/PageSize[498.96 699.48]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 65/PageSize[498.96 699.48]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5/JB5 182x257mm" 516.24 728.64 9 9 9 9 "<</cupsInteger0 45/PageSize[516.24 728.64]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 45/PageSize [516.24 728.64]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5.FB/JB5 Borderless 182x257mm" 531.792 742.752 0 0 0 0 "<</cupsInteger0 45/PageSize[531.792 742.752]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 45/cupsReal0 .098/cupsReal1 .098/PageSize [531.792 742.752]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5.Duplex/JB5 AutoDuplex 182x257mm" 516.24 719.64 9 33.192 9 42.192 "<</cupsInteger0 45/PageSize[516.24 719.64]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 45/PageSize [516.24 719.64]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Executive/Executive 7.25x10.5in" 522 756 9 9 9 9 "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Executive.Duplex/Executive AutoDuplex 7.25x10.5in" 522 747 9 33.192 9 42.192 "<</cupsInteger0 1/PageSize[522 747]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[522 747]/ImagingBBox null>>setpagedevice"
+ CustomMedia "8x10/8x10in" 576 720 9 9 9 9 "<</cupsInteger0 7/PageSize[576 720]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 7/PageSize[576 720]/ImagingBBox null>>setpagedevice"
+ *CustomMedia "Letter/Letter 8.5x11in" 612 792 9 9 9 9 "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Letter.FB/Letter Borderless 8.5x11in" 627.552 806.112 0 0 0 0 "<</cupsInteger0 2/PageSize[627.552 806.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/cupsReal0 .098/cupsReal1 .098/PageSize[627.552 806.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Letter.Duplex/Letter AutoDuplex 8.5x11in" 612 783 9 33.192 9 42.192 "<</cupsInteger0 2/PageSize[612 783]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/PageSize[612 783]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4/A4 210x297mm" 595.44 841.68 9 9 9 9 "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4.FB/A4 Borderless 210x297mm" 610.992 855.792 0 0 0 0 "<</cupsInteger0 26/PageSize[610.992 855.792]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/cupsReal0 .098/cupsReal1 .098/PageSize[610.992 855.792]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4.Duplex/A4 AutoDuplex 210x297mm" 595.44 832.68 9 33.192 9 42.192 "<</cupsInteger0 26/PageSize[595.44 832.68]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/PageSize[595.44 832.68]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Legal/Legal 8.5x14in" 612 1008 9 9 9 9 "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+
+// Envelope
+ CustomMedia "EnvA2/A2 Envelope 4.37x5.75in" 314.64 414 9 42.192 9 9 "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC6/C6 Envelope 114x162mm" 323.28 459.36 9 42.192 9 9 "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou4/#4 Japanese Envelope 90x205mm" 254.88 581.04 9 42.192 9 9 "<</cupsInteger0 111/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 111/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Env6/#6 Envelope 3.63x6.5in" 261.36 468 9 42.192 9 9 "<</cupsInteger0 83/PageSize[261.36 468]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 83/PageSize[261.36 468]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvCard/Card Envelope 4.4x6in" 315 432 9 42.192 9 9 "<</cupsInteger0 114/PageSize[315 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 114/PageSize[315 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvMonarch/Monarch Envelope 3.875x7.5in" 279 540 9 42.192 9 9 "<</cupsInteger0 80/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 80/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvDL/DL Envelope 110x220mm" 311.76 623.52 9 42.192 9 9 "<</cupsInteger0 90/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 90/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Env10/#10 Envelope 4.125x9.5in" 297 684 9 42.192 9 9 "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou3/#3 Japanese Envelope 120x235mm" 339.84 666 9 42.192 9 9 "<</cupsInteger0 110/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 110/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC5/C5 Envelope 162x229mm" 459.36 649.44 9 42.192 9 9 "<</cupsInteger0 91/PageSize[459.36 649.44]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 91/PageSize[459.36 649.44]/ImagingBBox null>>setpagedevice"
+
+ // Custom page sizes from 3x4in to Legal
+ HWMargins 9 9 9 9
+ VariablePaperSize Yes
+ MinSize 3in 4in
+ MaxSize 8.5in 30in
+
+ // <%Python:NoCDDVD:NoMaxDPI%>
+ {
+ ModelName "HP Photosmart Prem-web c309n-s"
+ Attribute "NickName" "" "HP Photosmart Prem-web c309n-s, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart Prem-web c309n-s"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart prem-web c309n-s;DES:photosmart prem-web c309n-s;"
+ PCFileName "hp-photosmart_prem-web_c309n-s.ppd"
+ Attribute "Product" "" "(HP Photosmart Premium Fax All-in-one Printer Series -c309a)"
+ Attribute "Product" "" "(HP Photosmart Premium Fax All-in-one Printer Series -c309c)"
+ }
+ {
+ ModelName "HP Photosmart Premium c309g-m"
+ Attribute "NickName" "" "HP Photosmart Premium c309g-m, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart Premium c309g-m"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart premium c309g-m;DES:photosmart premium c309g-m;"
+ PCFileName "hp-photosmart_premium_c309g-m.ppd"
+ Attribute "Product" "" "(HP Photosmart Premium All-in-one Printer Series - c309g)"
+ Attribute "Product" "" "(HP Photosmart Premium All-in-one Printer Series - c309h)"
+ }
+ // End Supported media sizes with full bleed and Duplex.
+
+} // End Python without CD-DVD and NoMaxDPI
+
+//////// Python without AutoDuplex and CD-DVD
+{
+ Attribute "hpPrinterLanguage" "" "pcl3gui2"
+ Attribute "HPMechOffset" "" "69"
+
+ Group "General/General"
+
+ // MediaPosition values map to MediaSource enumeration in global_types.h
+ Option "InputSlot/Media Source" PickOne AnySetup 10.0
+ *Choice "Auto/Auto-Select" "<</MediaPosition 7>>setpagedevice"
+ Choice "PhotoTray/Photo Tray" "<</MediaPosition 6>>setpagedevice"
+ Choice "Upper/Upper Tray" "<</MediaPosition 1>>setpagedevice"
+
+ Option "ColorModel/Output Mode" PickOne AnySetup 10.0
+ Choice "CMYGray/High Quality Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 1>>setpagedevice"
+ Choice "KGray/Black Only Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 2>>setpagedevice"
+ *Choice "RGB/Color" "<</cupsColorSpace 17/cupsBitsPerColor 8/cupsRowStep 0>>setpagedevice"
+
+ // cupsMediaType values map to MEDIATYPE from global_types.h
+ Option "MediaType/Media Type" PickOne AnySetup 10.0
+ *Choice "Automatic/Automatic" "<</MediaType(Automatic)/cupsMediaType -1>>setpagedevice"
+ Choice "Plain/Plain Paper" "<</MediaType(Plain)/cupsMediaType 0>>setpagedevice"
+ Choice "Glossy/Photo Paper" "<</MediaType(Glossy)/cupsMediaType 3>>setpagedevice"
+ Choice "TransparencyFilm/Transparency Film" "<</MediaType(TransparencyFilm)/cupsMediaType 4>>setpagedevice"
+
+ // cupsCompression values map to QUALITY_MODE from global_types.h
+ Option "OutputMode/Print Quality" PickOne AnySetup 10.0
+ Choice "Auto/Automatic" "<</OutputType(-3)/HWResolution[600 600]>>setpagedevice"
+ Choice "FastDraft/Fast Draft" "<</OutputType(-2)/HWResolution[300 300]>>setpagedevice"
+ *Choice "Normal/Normal" "<</OutputType(0)/HWResolution[600 600]>>setpagedevice"
+ Choice "Best/Best" "<</OutputType(1)/HWResolution[600 600]>>setpagedevice"
+ Choice "Photo/High-Resolution Photo" "<</OutputType(2)/HWResolution[1200 1200]>>setpagedevice"
+
+ // Constraints
+ UIConstraints "*ColorModel KGray *OutputMode Photo"
+ UIConstraints "*ColorModel CMYGray *OutputMode Photo"
+ UIConstraints "*MediaType Automatic *OutputMode FastDraft"
+ UIConstraints "*MediaType Glossy *OutputMode FastDraft"
+ UIConstraints "*MediaType TransparencyFilm *OutputMode FastDraft"
+ UIConstraints "*MediaType TransparencyFilm *OutputMode Best"
+ UIConstraints "*MediaType TransparencyFilm *OutputMode Photo"
+ UIConstraints "*MediaType Plain *OutputMode Photo"
+
+ // Constraint FB against FastDraft
+ UIConstraints "*PageSize PhotoL.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize L.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize Hagaki.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize Photo4x6.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize A6.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize HV.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize Photo5x7.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize Photo2L.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize Cabinet.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize A5.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize JB5.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize Letter.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize A4.FB *OutputMode FastDraft"
+
+// 4x6 or smaller
+ CustomMedia "Card3x5/Index Card 3x5in" 216 360 9 9 9 9 "<</cupsInteger0 78/PageSize [216 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 78/PageSize[216 360]/ImagingBBox null>>setpagedevice"
+ CustomMedia "PhotoL/Photo 3.5x5in" 252 360 9 9 9 9 "<</cupsInteger0 121/PageSize[252 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 121/PageSize[252 360]/ImagingBBox null>>setpagedevice"
+ CustomMedia "PhotoL.FB/Photo Borderless 3.5x5in" 264.744 374.112 0 0 0 0 "<</cupsInteger0 121/PageSize[264.744 374.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 121/cupsReal0 .079/cupsReal1 .098/PageSize[264.744 374.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "L/L 89x127mm" 252 360 9 9 9 9 "<</cupsInteger0 121/PageSize[252 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 121/PageSize[252 360]/ImagingBBox null>>setpagedevice"
+ CustomMedia "L.FB/L Borderless 89x127mm" 264.744 374.112 0 0 0 0 "<</cupsInteger0 121/PageSize[264.744 374.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 121/cupsReal0 .079/cupsReal1 .098/PageSize[264.744 374.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki/Hagaki 100x148mm" 283.68 419.76 9 9 9 9 "<</cupsInteger0 71/PageSize[283.68 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/PageSize[283.68 419.76]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki.FB/Hagaki Borderless 100x148mm" 296.424 433.872 0 0 0 0 "<</cupsInteger0 71/PageSize[296.424 433.872]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/cupsReal0 .079/cupsReal1 .098/PageSize[296.424 433.872]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card4x6/Index Card 4x6in" 288 432 9 9 9 9 "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6/Photo 4x6in" 288 432 9 9 9 9 "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6.FB/Photo Borderless 4x6in" 303.552 446.112 0 0 0 0 "<</cupsInteger0 74/PageSize[303.552 446.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/cupsReal0 .098/cupsReal1 .098/PageSize[303.552 446.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6/A6 105x148mm" 297.36 419.76 9 9 9 9 "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6.FB/A6 Borderless 105x148mm" 310.104 433.872 0 0 0 0 "<</cupsInteger0 73/PageSize[310.104 433.872]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 73/cupsReal0 .079/cupsReal1 .098/PageSize[310.104 433.872]/ImagingBBox null>>setpagedevice"
+
+// 5x7
+ CustomMedia "HV/HV 101x180mm" 286.56 510.48 9 9 9 9 "<</cupsInteger0 101/PageSize[286.56 510.48]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[286.56 510.48]/ImagingBBox null>>setpagedevice"
+ CustomMedia "HV.FB/HV Borderless 101x180mm" 302.112 524.592 0 0 0 0 "<</cupsInteger0 101/PageSize[302.112 524.592]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/cupsReal0 .098/cupsReal1 .098/PageSize[302.112 524.592]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo5x7/Photo 5x7in" 360 504 9 9 9 9 "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo5x7.FB/Photo Borderless 5x7in" 372.816 518.112 0 0 0 0 "<</cupsInteger0 122/PageSize[372.816 518.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/cupsReal0 .089/cupsReal1 .098/PageSize[372.816 518.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo2L/Photo 2L 127x178mm" 360 504 9 9 9 9 "<</cupsInteger0 126/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 126/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo2L.FB/Photo 2L Borderless 127x178mm" 372.816 518.112 0 0 0 0 "<</cupsInteger0 126/PageSize[372.816 518.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 126/cupsReal0 .089/cupsReal1 .098/PageSize[372.816 518.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card5x8/Index Card 5x8in" 360 576 9 9 9 9 "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Oufuku/Oufuku-Hagaki 200x148mm" 566.64 419.76 9 9 9 9 "<</cupsInteger0 72/PageSize[566.64 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 72/PageSize[566.64 419.76]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Cabinet/Cabinet Size 120x165" 339.84 468 9 9 9 9 "<</cupsInteger0 119/PageSize[339.84 468]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 119/PageSize[339.84 468]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Cabinet.FB/Cabinet Size 120x165 Borderless" 352.584 482.112 0 0 0 0 "<</cupsInteger0 119/PageSize[352.584 482.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 119/cupsReal0 .079/cupsReal1 .098/PageSize[352.584 482.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5/A5 148x210mm" 419.76 595.44 9 9 9 9 "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5.FB/A5 Borderless 148x210mm" 435.312 609.552 0 0 0 0 "<</cupsInteger0 25/PageSize[435.312 609.552]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/cupsReal0 .098/cupsReal1 .098/PageSize[435.312 609.552]/ImagingBBox null>>setpagedevice"
+
+// Standard
+ CustomMedia "B5/B5 176x250mm" 498.96 708.48 9 9 9 9 "<</cupsInteger0 65/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 65/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5/JB5 182x257mm" 516.24 728.64 9 9 9 9 "<</cupsInteger0 45/PageSize[516.24 728.64]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 45/PageSize [516.24 728.64]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5.FB/JB5 Borderless 182x257mm" 531.792 742.752 0 0 0 0 "<</cupsInteger0 45/PageSize[531.792 742.752]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 45/cupsReal0 .098/cupsReal1 .098/PageSize [531.792 742.752]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Executive/Executive 7.25x10.5in" 522 756 9 9 9 9 "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ CustomMedia "8x10/8x10in" 576 720 9 9 9 9 "<</cupsInteger0 7/PageSize[576 720]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 7/PageSize[576 720]/ImagingBBox null>>setpagedevice"
+ *CustomMedia "Letter/Letter 8.5x11in" 612 792 9 9 9 9 "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Letter.FB/Letter Borderless 8.5x11in" 627.552 806.112 0 0 0 0 "<</cupsInteger0 2/PageSize[627.552 806.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/cupsReal0 .098/cupsReal1 .098/PageSize[627.552 806.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4/A4 210x297mm" 595.44 841.68 9 9 9 9 "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4.FB/A4 Borderless 210x297mm" 610.992 855.792 0 0 0 0 "<</cupsInteger0 26/PageSize[610.992 855.792]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/cupsReal0 .098/cupsReal1 .098/PageSize[610.992 855.792]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Legal/Legal 8.5x14in" 612 1008 9 9 9 9 "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+
+// Envelope
+ CustomMedia "EnvA2/A2 Envelope 4.37x5.75in" 314.64 414 9 42.192 9 9 "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC6/C6 Envelope 114x162mm" 323.28 459.36 9 42.192 9 9 "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou4/#4 Japanese Envelope 90x205mm" 254.88 581.04 9 42.192 9 9 "<</cupsInteger0 111/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 111/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Env6/#6 Envelope 3.63x6.5in" 261.36 468 9 42.192 9 9 "<</cupsInteger0 83/PageSize[261.36 468]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 83/PageSize[261.36 468]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvCard/Card Envelope 4.4x6in" 315 432 9 42.192 9 9 "<</cupsInteger0 114/PageSize[315 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 114/PageSize[315 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvMonarch/Monarch Envelope 3.875x7.5in" 279 540 9 42.192 9 9 "<</cupsInteger0 80/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 80/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvDL/DL Envelope 110x220mm" 311.76 623.52 9 42.192 9 9 "<</cupsInteger0 90/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 90/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Env10/#10 Envelope 4.125x9.5in" 297 684 9 42.192 9 9 "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou3/#3 Japanese Envelope 120x235mm" 339.84 666 9 42.192 9 9 "<</cupsInteger0 110/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 110/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC5/C5 Envelope 162x229mm" 459.36 649.44 9 42.192 9 9 "<</cupsInteger0 91/PageSize[459.36 649.44]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 91/PageSize[459.36 649.44]/ImagingBBox null>>setpagedevice"
+
+ // Custom page sizes from 3x4in to Legal
+ HWMargins 9 9 9 9
+ VariablePaperSize Yes
+ MinSize 3in 4in
+ MaxSize 8.5in 30in
+
+ // <%Python:NoAutoDuplex:NoCDDVD%>
+ {
+ ModelName "HP Officejet 6000 e609a"
+ Attribute "NickName" "" "HP Officejet 6000 e609a, $Version"
+ Attribute "ShortNickName" "" "HP Officejet 6000 e609a"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet 6000 e609a;DES:officejet 6000 e609a;"
+ PCFileName "hp-officejet_6000_e609a.ppd"
+ Attribute "Product" "" "(HP Officejet 6000 Printer - e609a)"
+ }
+ {
+ ModelName "HP Officejet 6500 e709a"
+ Attribute "NickName" "" "HP Officejet 6500 e709a, $Version"
+ Attribute "ShortNickName" "" "HP Officejet 6500 e709a"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet 6500 e709a;DES:officejet 6500 e709a;"
+ PCFileName "hp-officejet_6500_e709a.ppd"
+ Attribute "Product" "" "(HP Officejet 6500 All-in-one Printer - e709a)"
+ Attribute "Product" "" "(HP Officejet 6500 All-in-one Printer - e709c)"
+ }
+ {
+ ModelName "HP Officejet 6500 e710a-f"
+ Attribute "NickName" "" "HP Officejet 6500 e710a-f, $Version"
+ Attribute "ShortNickName" "" "HP Officejet 6500 e710a-f"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet 6500 e710a-f;DES:officejet 6500 e710a-f;"
+ PCFileName "hp-officejet_6500_e710a-f.ppd"
+ Attribute "Product" "" "(HP Officejet 6500 e710)"
+ }
+ // End Supported media sizes with full bleed.
+
+} // End Python without AutoDuplex and CD-DVD
+
+//////// Python without AutoDuplex and CD-DVD and NoMaxDPI
+{
+ Attribute "hpPrinterLanguage" "" "pcl3gui2"
+ Attribute "HPMechOffset" "" "69"
+
+ Group "General/General"
+
+ // MediaPosition values map to MediaSource enumeration in global_types.h
+ Option "InputSlot/Media Source" PickOne AnySetup 10.0
+ *Choice "Auto/Auto-Select" "<</MediaPosition 7>>setpagedevice"
+ Choice "PhotoTray/Photo Tray" "<</MediaPosition 6>>setpagedevice"
+ Choice "Upper/Upper Tray" "<</MediaPosition 1>>setpagedevice"
+
+ Option "ColorModel/Output Mode" PickOne AnySetup 10.0
+ Choice "CMYGray/High Quality Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 1>>setpagedevice"
+ Choice "KGray/Black Only Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 2>>setpagedevice"
+ *Choice "RGB/Color" "<</cupsColorSpace 17/cupsBitsPerColor 8/cupsRowStep 0>>setpagedevice"
+
+ // cupsMediaType values map to MEDIATYPE from global_types.h
+ Option "MediaType/Media Type" PickOne AnySetup 10.0
+ *Choice "Automatic/Automatic" "<</MediaType(Automatic)/cupsMediaType -1>>setpagedevice"
+ Choice "Plain/Plain Paper" "<</MediaType(Plain)/cupsMediaType 0>>setpagedevice"
+ Choice "Glossy/Photo Paper" "<</MediaType(Glossy)/cupsMediaType 3>>setpagedevice"
+ Choice "TransparencyFilm/Transparency Film" "<</MediaType(TransparencyFilm)/cupsMediaType 4>>setpagedevice"
+
+ // cupsCompression values map to QUALITY_MODE from global_types.h
+ Option "OutputMode/Print Quality" PickOne AnySetup 10.0
+ Choice "Auto/Automatic" "<</OutputType(-3)/HWResolution[600 600]>>setpagedevice"
+ Choice "FastDraft/Fast Draft" "<</OutputType(-2)/HWResolution[300 300]>>setpagedevice"
+ *Choice "Normal/Normal" "<</OutputType(0)/HWResolution[600 600]>>setpagedevice"
+ Choice "Best/Best" "<</OutputType(1)/HWResolution[600 600]>>setpagedevice"
+
+ // Constraints
+ UIConstraints "*MediaType Automatic *OutputMode FastDraft"
+ UIConstraints "*MediaType Glossy *OutputMode FastDraft"
+ UIConstraints "*MediaType TransparencyFilm *OutputMode FastDraft"
+ UIConstraints "*MediaType TransparencyFilm *OutputMode Best"
+
+ // Constraint FB against FastDraft
+ UIConstraints "*PageSize PhotoL.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize L.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize Hagaki.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize Photo4x6.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize A6.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize HV.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize Photo5x7.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize Photo2L.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize Cabinet.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize A5.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize JB5.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize Letter.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize A4.FB *OutputMode FastDraft"
+
+// 4x6 or smaller
+ CustomMedia "Card3x5/Index Card 3x5in" 216 360 9 9 9 9 "<</cupsInteger0 78/PageSize [216 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 78/PageSize[216 360]/ImagingBBox null>>setpagedevice"
+ CustomMedia "PhotoL/Photo 3.5x5in" 252 360 9 9 9 9 "<</cupsInteger0 121/PageSize[252 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 121/PageSize[252 360]/ImagingBBox null>>setpagedevice"
+ CustomMedia "PhotoL.FB/Photo Borderless 3.5x5in" 264.744 374.112 0 0 0 0 "<</cupsInteger0 121/PageSize[264.744 374.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 121/cupsReal0 .079/cupsReal1 .098/PageSize[264.744 374.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "L/L 89x127mm" 252 360 9 9 9 9 "<</cupsInteger0 121/PageSize[252 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 121/PageSize[252 360]/ImagingBBox null>>setpagedevice"
+ CustomMedia "L.FB/L Borderless 89x127mm" 264.744 374.112 0 0 0 0 "<</cupsInteger0 121/PageSize[264.744 374.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 121/cupsReal0 .079/cupsReal1 .098/PageSize[264.744 374.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki/Hagaki 100x148mm" 283.68 419.76 9 9 9 9 "<</cupsInteger0 71/PageSize[283.68 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/PageSize[283.68 419.76]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki.FB/Hagaki Borderless 100x148mm" 296.424 433.872 0 0 0 0 "<</cupsInteger0 71/PageSize[296.424 433.872]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/cupsReal0 .079/cupsReal1 .098/PageSize[296.424 433.872]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card4x6/Index Card 4x6in" 288 432 9 9 9 9 "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6/Photo 4x6in" 288 432 9 9 9 9 "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6.FB/Photo Borderless 4x6in" 303.552 446.112 0 0 0 0 "<</cupsInteger0 74/PageSize[303.552 446.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/cupsReal0 .098/cupsReal1 .098/PageSize[303.552 446.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6/A6 105x148mm" 297.36 419.76 9 9 9 9 "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6.FB/A6 Borderless 105x148mm" 310.104 433.872 0 0 0 0 "<</cupsInteger0 73/PageSize[310.104 433.872]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 73/cupsReal0 .079/cupsReal1 .098/PageSize[310.104 433.872]/ImagingBBox null>>setpagedevice"
+
+// 5x7
+ CustomMedia "HV/HV 101x180mm" 286.56 510.48 9 9 9 9 "<</cupsInteger0 101/PageSize[286.56 510.48]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[286.56 510.48]/ImagingBBox null>>setpagedevice"
+ CustomMedia "HV.FB/HV Borderless 101x180mm" 302.112 524.592 0 0 0 0 "<</cupsInteger0 101/PageSize[302.112 524.592]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/cupsReal0 .098/cupsReal1 .098/PageSize[302.112 524.592]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo5x7/Photo 5x7in" 360 504 9 9 9 9 "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo5x7.FB/Photo Borderless 5x7in" 372.816 518.112 0 0 0 0 "<</cupsInteger0 122/PageSize[372.816 518.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/cupsReal0 .089/cupsReal1 .098/PageSize[372.816 518.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo2L/Photo 2L 127x178mm" 360 504 9 9 9 9 "<</cupsInteger0 126/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 126/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo2L.FB/Photo 2L Borderless 127x178mm" 372.816 518.112 0 0 0 0 "<</cupsInteger0 126/PageSize[372.816 518.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 126/cupsReal0 .089/cupsReal1 .098/PageSize[372.816 518.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card5x8/Index Card 5x8in" 360 576 9 9 9 9 "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Oufuku/Oufuku-Hagaki 200x148mm" 566.64 419.76 9 9 9 9 "<</cupsInteger0 72/PageSize[566.64 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 72/PageSize[566.64 419.76]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Cabinet/Cabinet Size 120x165" 339.84 468 9 9 9 9 "<</cupsInteger0 119/PageSize[339.84 468]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 119/PageSize[339.84 468]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Cabinet.FB/Cabinet Size 120x165 Borderless" 352.584 482.112 0 0 0 0 "<</cupsInteger0 119/PageSize[352.584 482.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 119/cupsReal0 .079/cupsReal1 .098/PageSize[352.584 482.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5/A5 148x210mm" 419.76 595.44 9 9 9 9 "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5.FB/A5 Borderless 148x210mm" 435.312 609.552 0 0 0 0 "<</cupsInteger0 25/PageSize[435.312 609.552]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/cupsReal0 .098/cupsReal1 .098/PageSize[435.312 609.552]/ImagingBBox null>>setpagedevice"
+
+// Standard
+ CustomMedia "B5/B5 176x250mm" 498.96 708.48 9 9 9 9 "<</cupsInteger0 65/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 65/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5/JB5 182x257mm" 516.24 728.64 9 9 9 9 "<</cupsInteger0 45/PageSize[516.24 728.64]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 45/PageSize [516.24 728.64]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5.FB/JB5 Borderless 182x257mm" 531.792 742.752 0 0 0 0 "<</cupsInteger0 45/PageSize[531.792 742.752]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 45/cupsReal0 .098/cupsReal1 .098/PageSize [531.792 742.752]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Executive/Executive 7.25x10.5in" 522 756 9 9 9 9 "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ CustomMedia "8x10/8x10in" 576 720 9 9 9 9 "<</cupsInteger0 7/PageSize[576 720]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 7/PageSize[576 720]/ImagingBBox null>>setpagedevice"
+ *CustomMedia "Letter/Letter 8.5x11in" 612 792 9 9 9 9 "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Letter.FB/Letter Borderless 8.5x11in" 627.552 806.112 0 0 0 0 "<</cupsInteger0 2/PageSize[627.552 806.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/cupsReal0 .098/cupsReal1 .098/PageSize[627.552 806.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4/A4 210x297mm" 595.44 841.68 9 9 9 9 "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4.FB/A4 Borderless 210x297mm" 610.992 855.792 0 0 0 0 "<</cupsInteger0 26/PageSize[610.992 855.792]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/cupsReal0 .098/cupsReal1 .098/PageSize[610.992 855.792]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Legal/Legal 8.5x14in" 612 1008 9 9 9 9 "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+
+// Envelope
+ CustomMedia "EnvA2/A2 Envelope 4.37x5.75in" 314.64 414 9 42.192 9 9 "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC6/C6 Envelope 114x162mm" 323.28 459.36 9 42.192 9 9 "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou4/#4 Japanese Envelope 90x205mm" 254.88 581.04 9 42.192 9 9 "<</cupsInteger0 111/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 111/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Env6/#6 Envelope 3.63x6.5in" 261.36 468 9 42.192 9 9 "<</cupsInteger0 83/PageSize[261.36 468]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 83/PageSize[261.36 468]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvCard/Card Envelope 4.4x6in" 315 432 9 42.192 9 9 "<</cupsInteger0 114/PageSize[315 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 114/PageSize[315 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvMonarch/Monarch Envelope 3.875x7.5in" 279 540 9 42.192 9 9 "<</cupsInteger0 80/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 80/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvDL/DL Envelope 110x220mm" 311.76 623.52 9 42.192 9 9 "<</cupsInteger0 90/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 90/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Env10/#10 Envelope 4.125x9.5in" 297 684 9 42.192 9 9 "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou3/#3 Japanese Envelope 120x235mm" 339.84 666 9 42.192 9 9 "<</cupsInteger0 110/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 110/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC5/C5 Envelope 162x229mm" 459.36 649.44 9 42.192 9 9 "<</cupsInteger0 91/PageSize[459.36 649.44]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 91/PageSize[459.36 649.44]/ImagingBBox null>>setpagedevice"
+
+ // Custom page sizes from 3x4in to Legal
+ HWMargins 9 9 9 9
+ VariablePaperSize Yes
+ MinSize 3in 4in
+ MaxSize 8.5in 30in
+
+ // <%Python:NoAutoDuplex:NoCDDVD:NoMaxDPI%>
+ {
+ ModelName "HP Photosmart c5300 Series"
+ Attribute "NickName" "" "HP Photosmart c5300 Series, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart c5300 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart c5300 series;DES:photosmart c5300 series;"
+ PCFileName "hp-photosmart_c5300_series.ppd"
+ Attribute "Product" "" "(HP Photosmart c5370 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c5373 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c5380 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c5383 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c5388 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c5390 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c5393 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Photosmart c6300 Series"
+ Attribute "NickName" "" "HP Photosmart c6300 Series, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart c6300 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart c6300 series;DES:photosmart c6300 series;"
+ PCFileName "hp-photosmart_c6300_series.ppd"
+ Attribute "Product" "" "(HP Photosmart c6324 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c6340 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c6350 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c6375 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c6380 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c6383 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c6388 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Photosmart d7500 Series"
+ Attribute "NickName" "" "HP Photosmart d7500 Series, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart d7500 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart d7500 series;DES:photosmart d7500 series;"
+ PCFileName "hp-photosmart_d7500_series.ppd"
+ Attribute "Product" "" "(HP Photosmart d7560 Printer)"
+ }
+ // End Supported media sizes with full bleed.
+
+} // End Python without AutoDuplex and CD-DVD and NoMaxDPI
+
+//////// Python B-size (Standard media support different from Python:Normal class)
+{
+ Attribute "hpPrinterLanguage" "" "pcl3gui2"
+ Attribute "HPMechOffset" "" "69"
+
+ Group "General/General"
+
+ // MediaPosition values map to MediaSource enumeration in global_types.h
+ Option "InputSlot/Media Source" PickOne AnySetup 10.0
+ *Choice "Auto/Auto-Select" "<</MediaPosition 7>>setpagedevice"
+ Choice "PhotoTray/Photo Tray" "<</MediaPosition 6>>setpagedevice"
+ Choice "Upper/Upper Tray" "<</MediaPosition 1>>setpagedevice"
+
+ Option "ColorModel/Output Mode" PickOne AnySetup 10.0
+ Choice "CMYGray/High Quality Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 1>>setpagedevice"
+ Choice "KGray/Black Only Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 2>>setpagedevice"
+ *Choice "RGB/Color" "<</cupsColorSpace 17/cupsBitsPerColor 8/cupsRowStep 0>>setpagedevice"
+
+ // cupsMediaType values map to MEDIATYPE from global_types.h
+ Option "MediaType/Media Type" PickOne AnySetup 10.0
+ *Choice "Automatic/Automatic" "<</MediaType(Automatic)/cupsMediaType -1>>setpagedevice"
+ Choice "Plain/Plain Paper" "<</MediaType(Plain)/cupsMediaType 0>>setpagedevice"
+ Choice "Glossy/Photo Paper" "<</MediaType(Glossy)/cupsMediaType 3>>setpagedevice"
+ Choice "TransparencyFilm/Transparency Film" "<</MediaType(TransparencyFilm)/cupsMediaType 4>>setpagedevice"
+
+ // cupsCompression values map to QUALITY_MODE from global_types.h
+ Option "OutputMode/Print Quality" PickOne AnySetup 10.0
+ Choice "Auto/Automatic" "<</OutputType(-3)/HWResolution[600 600]>>setpagedevice"
+ Choice "FastDraft/Fast Draft" "<</OutputType(-2)/HWResolution[300 300]>>setpagedevice"
+ *Choice "Normal/Normal" "<</OutputType(0)/HWResolution[600 600]>>setpagedevice"
+ Choice "Best/Best" "<</OutputType(1)/HWResolution[600 600]>>setpagedevice"
+ Choice "Photo/High-Resolution Photo" "<</OutputType(2)/HWResolution[1200 1200]>>setpagedevice"
+
+ // Constraints
+ UIConstraints "*ColorModel KGray *OutputMode Photo"
+ UIConstraints "*ColorModel CMYGray *OutputMode Photo"
+ UIConstraints "*MediaType Automatic *OutputMode FastDraft"
+ UIConstraints "*MediaType Glossy *OutputMode FastDraft"
+ UIConstraints "*MediaType TransparencyFilm *OutputMode FastDraft"
+ UIConstraints "*MediaType TransparencyFilm *OutputMode Best"
+ UIConstraints "*MediaType Plain *OutputMode Photo"
+ UIConstraints "*MediaType TransparencyFilm *OutputMode Photo"
+
+// 4x6 or smaller
+ CustomMedia "Card3x5/Index Card 3x5in" 216 360 9 9 9 9 "<</cupsInteger0 78/PageSize [216 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 78/PageSize[216 360]/ImagingBBox null>>setpagedevice"
+ CustomMedia "L/L 89x127mm" 252 360 9 9 9 9 "<</cupsInteger0 121/PageSize[252 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 121/PageSize[252 360]/ImagingBBox null>>setpagedevice"
+ CustomMedia "L.FB/L Borderless 89x127mm" 264.744 374.112 0 0 0 0 "<</cupsInteger0 121/PageSize[264.744 374.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 121/cupsReal0 .079/cupsReal1 .098/PageSize[264.744 374.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki/Hagaki 100x148mm" 283.68 419.76 9 9 9 9 "<</cupsInteger0 71/PageSize[283.68 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/PageSize[283.68 419.76]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki.FB/Hagaki Borderless 100x148mm" 296.424 433.872 0 0 0 0 "<</cupsInteger0 71/PageSize[296.424 433.872]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/cupsReal0 .079/cupsReal1 .098/PageSize[296.424 433.872]/ImagingBBox null>>setpagedevice"
+ CustomMedia "B7/B7 88x125mm" 249.12 354.24 9 9 9 9 "<</cupsInteger0 63/PageSize[249.12 354.24]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 63/PageSize[249.12 354.24]/ImagingBBox null>>setpagedevice"
+ CustomMedia "B7.FB/B7 Borderless 88x125mm" 263.232 368.352 0 0 0 0 "<</cupsInteger0 63/PageSize[263.232 368.352]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 63/cupsReal0 .098/cupsReal1 .098/PageSize[263.232 368.352]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB7/JB7 91x128mm" 257.76 362.88 9 9 9 9 "<</cupsInteger0 43/PageSize[257.76 362.88]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 43/PageSize [257.76 362.88]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB7.FB/JB7 Borderless 91x128mm" 271.872 376.992 0 0 0 0 "<</cupsInteger0 43/PageSize[271.872 376.992]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 43/cupsReal0 .098/cupsReal1 .098/PageSize [271.872 376.992]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card4x6/Index Card 4x6in" 288 432 9 9 9 9 "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6/Photo 4x6in" 288 432 9 9 9 9 "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6.FB/Photo Borderless 4x6in" 303.552 446.112 0 0 0 0 "<</cupsInteger0 74/PageSize[303.552 446.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/cupsReal0 .098/cupsReal1 .098/PageSize[303.552 446.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6/A6 105x148mm" 297.36 419.76 9 9 9 9 "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6.FB/A6 Borderless 105x148mm" 310.104 433.872 0 0 0 0 "<</cupsInteger0 73/PageSize[310.104 433.872]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 73/cupsReal0 .079/cupsReal1 .098/PageSize[310.104 433.872]/ImagingBBox null>>setpagedevice"
+
+
+// 5x7
+ CustomMedia "HV/HV 101x180mm" 286.56 510.48 9 9 9 9 "<</cupsInteger0 101/PageSize[286.56 510.48]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[286.56 510.48]/ImagingBBox null>>setpagedevice"
+ CustomMedia "HV.FB/HV Borderless 101x180mm" 302.112 524.592 0 0 0 0 "<</cupsInteger0 101/PageSize[302.112 524.592]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/cupsReal0 .098/cupsReal1 .098/PageSize[302.112 524.592]/ImagingBBox null>>setpagedevice"
+ CustomMedia "10x20/10x20cm (tab)" 288 576 9 9 9 9 "<</cupsInteger0 101/PageSize[288 576]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[288 576]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo5x7/Photo 5x7in" 360 504 9 9 9 9 "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo5x7.FB/Photo Borderless 5x7in" 372.816 518.112 0 0 0 0 "<</cupsInteger0 122/PageSize[372.816 518.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/cupsReal0 .089/cupsReal1 .098/PageSize[372.816 518.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo2L/Photo 2L 127x178mm" 360 504 9 9 9 9 "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo2L.FB/Photo 2L Borderless 127x178mm" 372.816 518.112 0 0 0 0 "<</cupsInteger0 122/PageSize[372.816 518.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/cupsReal0 .089/cupsReal1 .098/PageSize[372.816 518.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card5x8/Index Card 5x8in" 360 576 9 9 9 9 "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Oufuku/Oufuku-Hagaki 200x148mm" 566.64 419.76 9 9 9 9 "<</cupsInteger0 72/PageSize[566.64 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 72/PageSize[566.64 419.76]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Oufuku.FB/Oufuku-Hagaki Borderless 200x148mm" 579.384 433.872 0 0 0 0 "<</cupsInteger0 72/PageSize[579.384 433.872]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 72/cupsReal0 .079/cupsReal1 .098/PageSize[579.384 433.872]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Cabinet/Cabinet Size 120x165" 339.84 468 9 9 9 9 "<</cupsInteger0 119/PageSize[339.84 468]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 119/PageSize[339.84 468]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Cabinet.FB/Cabinet Size 120x165 Borderless" 352.584 482.112 0 0 0 0 "<</cupsInteger0 119/PageSize[352.584 482.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 119/cupsReal0 .079/cupsReal1 .098/PageSize[352.584 482.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5/A5 148x210mm" 419.76 595.44 9 9 9 9 "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5.FB/A5 Borderless 148x210mm" 435.312 609.552 0 0 0 0 "<</cupsInteger0 25/PageSize[435.312 609.552]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/cupsReal0 .098/cupsReal1 .098/PageSize[435.312 609.552]/ImagingBBox null>>setpagedevice"
+
+//Photo 4x10, 4x11, 4x12
+ CustomMedia "Photo4x10/Photo 4x10in" 288 720 9 9 9 9 "<</cupsInteger0 101/PageSize[288 720]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[288 720]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x10.FB/Photo Borderless 4x10in" 304.992 734.112 0 0 0 0 "<</cupsInteger0 101/PageSize[304.992 734.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/cupsReal0 .098/cupsReal1 .098/PageSize[304.992 734.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x11/Photo 4x11in" 288 792 9 9 9 9 "<</cupsInteger0 101/PageSize[288 792]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize [288 792]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x11.FB/Photo Borderless 4x11in" 306.432 806.112 0 0 0 0 "<</cupsInteger0 101/PageSize[306.432 806.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/cupsReal0 .108/cupsReal1 .098/PageSize[306.432 806.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x12/Photo 4x12in" 288 864 9 9 9 9 "<</cupsInteger0 101/PageSize[288 864]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize [288 864]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x12.FB/Photo Borderless 4x12in" 307.8 878.112 0 0 0 0 "<</cupsInteger0 101/PageSize[307.8 878.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/cupsReal0 .118/cupsReal1 .098/PageSize[307.8 878.112]/ImagingBBox null>>setpagedevice"
+
+
+// Standard
+ CustomMedia "B5/B5 176x250mm" 498.96 708.48 9 9 9 9 "<</cupsInteger0 65/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 65/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5/JB5 182x257mm" 516.24 728.64 9 9 9 9 "<</cupsInteger0 45/PageSize[516.24 728.64]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 45/PageSize [516.24 728.64]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5.FB/JB5 Borderless 182x257mm" 531.792 742.752 0 0 0 0 "<</cupsInteger0 45/PageSize[531.792 742.752]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 45/cupsReal0 .098/cupsReal1 .098/PageSize [531.792 742.752]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Executive/Executive 7.25x10.5in" 522 756 9 9 9 9 "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ CustomMedia "8x10/8x10in" 576 720 9 9 9 9 "<</cupsInteger0 7/PageSize[576 720]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 7/PageSize[576 720]/ImagingBBox null>>setpagedevice"
+ CustomMedia "8x10.FB/Borderless 8x10in" 591.552 734.112 0 0 0 0 "<</cupsInteger0 7/PageSize[591.552 734.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 7/cupsReal0 .098/cupsReal1 .098/PageSize[591.552 734.112]/ImagingBBox null>>setpagedevice"
+ *CustomMedia "Letter/Letter 8.5x11in" 612 792 9 9 9 9 "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Letter.FB/Letter Borderless 8.5x11in" 627.552 806.112 0 0 0 0 "<</cupsInteger0 2/PageSize[627.552 806.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/cupsReal0 .098/cupsReal1 .098/PageSize[627.552 806.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4/A4 210x297mm" 595.44 841.68 9 9 9 9 "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4.FB/A4 Borderless 210x297mm" 610.992 855.792 0 0 0 0 "<</cupsInteger0 26/PageSize[610.992 855.792]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/cupsReal0 .098/cupsReal1 .098/PageSize[610.992 855.792]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Legal/Legal 8.5x14in" 612 1008 9 9 9 9 "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+ CustomMedia "DoubleA4/Double A4 210x594mm" 595.44 1684.08 9 9 9 9 "<</cupsInteger0 101/PageSize[595.44 1684.08]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[595.44 1684.08]/ImagingBBox null>>setpagedevice"
+ CustomMedia "DoubleA4.FB/Double A4 Borderless 210x594mm" 621.648 1698.192 0 0 0 0 "<</cupsInteger0 101/PageSize[621.648 1698.192]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/cupsReal0 .167/cupsReal1 .098/PageSize[621.648 1698.192]/ImagingBBox null>>setpagedevice"
+
+// Envelope
+ CustomMedia "EnvA2/A2 Envelope 4.37x5.75in" 314.64 414 9 42.192 9 9 "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC6/C6 Envelope 114x162mm" 323.28 459.36 9 42.192 9 9 "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou4/#4 Japanese Envelope 90x205mm" 254.88 581.04 9 42.192 9 9 "<</cupsInteger0 111/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 111/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Env6/#6 Envelope 3.63x6.5in" 261.36 468 9 42.192 9 9 "<</cupsInteger0 83/PageSize[261.36 468]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 83/PageSize[261.36 468]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvCard/Card Envelope 4.4x6in" 315 432 9 42.192 9 9 "<</cupsInteger0 114/PageSize[315 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 114/PageSize[315 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvMonarch/Monarch Envelope 3.875x7.5in" 279 540 9 42.192 9 9 "<</cupsInteger0 80/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 80/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvDL/DL Envelope 110x220mm" 311.76 623.52 9 42.192 9 9 "<</cupsInteger0 90/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 90/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Env10/#10 Envelope 4.125x9.5in" 297 684 9 42.192 9 9 "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou3/#3 Japanese Envelope 120x235mm" 339.84 666 9 42.192 9 9 "<</cupsInteger0 110/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 110/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou2/#2 Envelope 119x277mm" 337.68 785.52 9 42.192 9 9 "<</cupsInteger0 109/PageSize[337.68 785.52]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 109/PageSize[337.68 785.52]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvKaku2/#2 Envelope Kaku 240x332mm" 680.40 941.04 9 42.192 9 9 "<</cupsInteger0 101/PageSize[680.40 941.04]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[680.40 941.04]/ImagingBBox null>>setpagedevice"
+
+ {
+ // Large Media
+ CustomMedia "11x14/11x14in" 792 1008 9 9 9 9 "<</cupsInteger0 4/PageSize[792 1008]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 4/PageSize[792 1008]/ImagingBBox null>>setpagedevice"
+ CustomMedia "11x14.FB/Borderless 11x14in" 807.552 1022.112 0 0 0 0 "<</cupsInteger0 4/PageSize[807.552 1022.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 4/cupsReal0 .098/cupsReal1 .098/PageSize[807.552 1022.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "12x12/12x12in" 864 864 9 9 9 9 "<</cupsInteger0 117/PageSize[864 864]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 117/PageSize[864 864]/ImagingBBox null>>setpagedevice"
+ CustomMedia "12x12.FB/Borderless 12x12in" 879.552 878.112 0 0 0 0 "<</cupsInteger0 117/PageSize[879.552 878.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 117/cupsReal0 .098/cupsReal1 .098/PageSize[879.552 878.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "B/B 11x17in" 792 1224 9 9 9 9 "<</cupsInteger0 6/PageSize[792 1224]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 6/PageSize[792 1224]/ImagingBBox null>>setpagedevice"
+ CustomMedia "B.FB/B Borderless 11x17in" 807.552 1238.112 0 0 0 0 "<</cupsInteger0 6/PageSize[807.552 1238.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 6/cupsReal0 .098/cupsReal1 .098/PageSize[807.552 1238.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "SuperB/SuperB 13x19in" 936 1368 9 9 9 9 "<</cupsInteger0 16/PageSize[936 1368]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 16/PageSize[936 1368]/ImagingBBox null>>setpagedevice"
+ CustomMedia "SuperB.FB/SuperB Borderless 13x19in" 951.552 1382.112 0 0 0 0 "<</cupsInteger0 16/PageSize[951.552 1382.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 16/cupsReal0 .098/cupsReal1 .098/PageSize[951.552 1382.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A3/A3 297x420mm" 841.68 1190.88 9 9 9 9 "<</cupsInteger0 27/PageSize[841.68 1190.88]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 27/PageSize[841.68 1190.88]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A3.FB/A3 Borderless 297x420mm" 857.232 1204.992 0 0 0 0 "<</cupsInteger0 27/PageSize[857.232 1204.992]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 27/cupsReal0 .098/cupsReal1 .098/PageSize[857.232 1204.992]/ImagingBBox null>>setpagedevice"
+ CustomMedia "SuperA3/A3+ 330x483mm" 935.28 1369.44 9 9 9 9 "<</cupsInteger0 16/PageSize[935.28 1369.44]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 16/PageSize[935.28 1369.44]/ImagingBBox null>>setpagedevice"
+ CustomMedia "SuperA3.FB/A3+ Borderless 330x483mm" 950.832 1383.552 0 0 0 0 "<</cupsInteger0 16/PageSize[950.832 1383.552]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 16/cupsReal0 .098/cupsReal1 .098/PageSize[950.832 1383.552]/ImagingBBox null>>setpagedevice"
+
+
+ // Custom page sizes from 3x4in to 13x44in
+ HWMargins 9 9 9 9
+ VariablePaperSize Yes
+ MinSize 3in 4in
+ MaxSize 13in 44in
+
+ // <%Python:LargeFormatA3:NoAutoDuplex%>
+ {
+ ModelName "HP Photosmart Pro b8300 Series"
+ Attribute "NickName" "" "HP Photosmart Pro b8300 Series, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart Pro b8300 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart pro b8300 series;DES:photosmart pro b8300 series;"
+ PCFileName "hp-photosmart_pro_b8300_series.ppd"
+ Attribute "Product" "" "(HP Photosmart Pro b8330 Printer)"
+ Attribute "Product" "" "(HP Photosmart Pro b8338 Printer)"
+ Attribute "Product" "" "(HP Photosmart Pro b8350 Printer)"
+ Attribute "Product" "" "(HP Photosmart Pro b8353 Printer)"
+ }
+ {
+ ModelName "HP Photosmart b8500 Series"
+ Attribute "NickName" "" "HP Photosmart b8500 Series, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart b8500 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart b8500 series;DES:photosmart b8500 series;"
+ PCFileName "hp-photosmart_b8500_series.ppd"
+ Attribute "Product" "" "(HP Photosmart b8550 Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart b8553 Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart b8558 Photo Printer)"
+ }
+
+ //Adding Speciality Media Tray Support (LP#105443)
+ {
+ Option "InputSlot/Media Source" PickOne AnySetup 10.0
+ Choice "MediaTray/Speciality Media Tray" "<</MediaPosition 2>>setpagedevice"
+ // <%Python:LargeFormatA3:NoAutoDuplex:Advanced%>
+ {
+ ModelName "HP Photosmart Pro b8800 Series"
+ Attribute "NickName" "" "HP Photosmart Pro b8800 Series, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart Pro b8800 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart pro b8800 series;DES:photosmart pro b8800 series;"
+ PCFileName "hp-photosmart_pro_b8800_series.ppd"
+ Attribute "Product" "" "(HP Photosmart Pro b8850 Printer)"
+ }
+ }
+
+
+
+ } // End Large format media sizes with full bleed
+
+} // End Python B-size
+
+//Sanjay: changes Start
+//////// Python10
+{
+ Attribute "cupsEvenDuplex" "" "True"
+ Attribute "cupsBackSide" "" "Rotated"
+ Attribute "cupsFlipDuplex" "" "True"
+ Attribute "hpPrinterLanguage" "" "pcl3gui2"
+ Attribute "HPMechOffset" "" "69"
+
+ Group "General/General"
+
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 10.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "<</Duplex true/Tumble false>>setpagedevice"
+ Choice "DuplexTumble/Short Edge (Flip)" "<</Duplex true/Tumble true>>setpagedevice"
+ *Choice "None/Off" "<</Duplex false/Tumble false>>setpagedevice"
+
+
+ Option "ColorModel/Output Mode" PickOne AnySetup 10.0
+ Choice "CMYGray/High Quality Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 1>>setpagedevice"
+ Choice "KGray/Black Only Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 2>>setpagedevice"
+ *Choice "RGB/Color" "<</cupsColorSpace 17/cupsBitsPerColor 8/cupsRowStep 0>>setpagedevice"
+
+ // cupsMediaType values map to MEDIATYPE from global_types.h
+ Option "MediaType/Media Type" PickOne AnySetup 10.0
+ *Choice "Automatic/Automatic" "<</MediaType(Automatic)/cupsMediaType -1>>setpagedevice"
+ Choice "Plain/Plain Paper" "<</MediaType(Plain)/cupsMediaType 0>>setpagedevice"
+ Choice "Glossy/Photo Paper" "<</MediaType(Glossy)/cupsMediaType 3>>setpagedevice"
+ Choice "TransparencyFilm/Transparency Film" "<</MediaType(TransparencyFilm)/cupsMediaType 4>>setpagedevice"
+
+
+ // Duplexer is optional...
+ Installable "OptionDuplex/Duplexer Installed"
+
+ // Constraints
+ UIConstraints "*Duplex *OptionDuplex False"
+ UIConstraints "*MediaType Automatic *OutputMode FastDraft"
+ UIConstraints "*MediaType Glossy *OutputMode FastDraft"
+ UIConstraints "*MediaType TransparencyFilm *OutputMode FastDraft"
+ UIConstraints "*MediaType TransparencyFilm *OutputMode Best"
+
+ // Non duplex media against duplex
+ UIConstraints "*PageSize Card3x5 *Duplex"
+ UIConstraints "*PageSize PhotoL *Duplex"
+ UIConstraints "*PageSize PhotoL.FB *Duplex"
+ UIConstraints "*PageSize Hagaki *Duplex"
+ UIConstraints "*PageSize Hagaki.FB *Duplex"
+ UIConstraints "*PageSize Card4x6 *Duplex"
+ UIConstraints "*PageSize Photo4x6 *Duplex"
+ UIConstraints "*PageSize Photo4x6.FB *Duplex"
+ UIConstraints "*PageSize A6 *Duplex"
+ UIConstraints "*PageSize A6.FB *Duplex"
+ UIConstraints "*PageSize HV *Duplex"
+ UIConstraints "*PageSize HV.FB *Duplex"
+ UIConstraints "*PageSize Photo5x7 *Duplex"
+ UIConstraints "*PageSize Photo5x7.FB *Duplex"
+ UIConstraints "*PageSize Photo2L *Duplex"
+ UIConstraints "*PageSize Photo2L.FB *Duplex"
+ UIConstraints "*PageSize Card5x8 *Duplex"
+ UIConstraints "*PageSize Oufuku *Duplex"
+ UIConstraints "*PageSize Cabinet *Duplex"
+ UIConstraints "*PageSize Cabinet.FB *Duplex"
+ UIConstraints "*PageSize A5 *Duplex"
+ UIConstraints "*PageSize A5.FB *Duplex"
+ UIConstraints "*PageSize B5 *Duplex"
+ UIConstraints "*PageSize JB5 *Duplex"
+ UIConstraints "*PageSize JB5.FB *Duplex"
+ UIConstraints "*PageSize Executive *Duplex"
+ UIConstraints "*PageSize 8x10 *Duplex"
+ UIConstraints "*PageSize Letter *Duplex"
+ UIConstraints "*PageSize Letter.FB *Duplex"
+ UIConstraints "*PageSize A4 *Duplex"
+ UIConstraints "*PageSize A4.FB *Duplex"
+ UIConstraints "*PageSize Legal *Duplex"
+ UIConstraints "*PageSize EnvA2 *Duplex"
+ UIConstraints "*PageSize EnvC6 *Duplex"
+ UIConstraints "*PageSize EnvChou4 *Duplex"
+ UIConstraints "*PageSize Env6 *Duplex"
+ UIConstraints "*PageSize EnvCard *Duplex"
+ UIConstraints "*PageSize EnvMonarch *Duplex"
+ UIConstraints "*PageSize EnvDL *Duplex"
+ UIConstraints "*PageSize Env10 *Duplex"
+ UIConstraints "*PageSize EnvChou3 *Duplex"
+ UIConstraints "*PageSize EnvC5 *Duplex"
+
+ // Constraint FB against FastDraft
+ UIConstraints "*PageSize PhotoL.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize L.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize Hagaki.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize Photo4x6.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize A6.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize HV.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize Photo5x7.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize Photo2L.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize Cabinet.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize A5.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize JB5.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize Letter.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize A4.FB *OutputMode FastDraft"
+
+// 4x6 or smaller
+ CustomMedia "Card3x5/Index Card 3x5in" 216 360 9 9 9 9 "<</cupsInteger0 78/PageSize [216 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 78/PageSize[216 360]/ImagingBBox null>>setpagedevice"
+ CustomMedia "PhotoL/Photo 3.5x5in" 252 360 9 9 9 9 "<</cupsInteger0 121/PageSize[252 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 121/PageSize[252 360]/ImagingBBox null>>setpagedevice"
+ CustomMedia "PhotoL.FB/Photo Borderless 3.5x5in" 264.744 374.112 0 0 0 0 "<</cupsInteger0 121/PageSize[264.744 374.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 121/cupsReal0 .079/cupsReal1 .098/PageSize[264.744 374.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "L/L 89x127mm" 252 360 9 9 9 9 "<</cupsInteger0 121/PageSize[252 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 121/PageSize[252 360]/ImagingBBox null>>setpagedevice"
+ CustomMedia "L.FB/L Borderless 89x127mm" 264.744 374.112 0 0 0 0 "<</cupsInteger0 121/PageSize[264.744 374.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 121/cupsReal0 .079/cupsReal1 .098/PageSize[264.744 374.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki/Hagaki 100x148mm" 283.68 419.76 9 9 9 9 "<</cupsInteger0 71/PageSize[283.68 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/PageSize[283.68 419.76]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki.FB/Hagaki Borderless 100x148mm" 296.424 433.872 0 0 0 0 "<</cupsInteger0 71/PageSize[296.424 433.872]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/cupsReal0 .079/cupsReal1 .098/PageSize[296.424 433.872]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card4x6/Index Card 4x6in" 288 432 9 9 9 9 "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6/Photo 4x6in" 288 432 9 9 9 9 "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6.FB/Photo Borderless 4x6in" 303.552 446.112 0 0 0 0 "<</cupsInteger0 74/PageSize[303.552 446.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/cupsReal0 .098/cupsReal1 .098/PageSize[303.552 446.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6/A6 105x148mm" 297.36 419.76 9 9 9 9 "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6.FB/A6 Borderless 105x148mm" 310.104 433.872 0 0 0 0 "<</cupsInteger0 73/PageSize[310.104 433.872]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 73/cupsReal0 .079/cupsReal1 .098/PageSize[310.104 433.872]/ImagingBBox null>>setpagedevice"
+
+// 5x7
+ CustomMedia "HV/HV 101x180mm" 286.56 510.48 9 9 9 9 "<</cupsInteger0 101/PageSize[286.56 510.48]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[286.56 510.48]/ImagingBBox null>>setpagedevice"
+ CustomMedia "HV.FB/HV Borderless 101x180mm" 302.112 524.592 0 0 0 0 "<</cupsInteger0 101/PageSize[302.112 524.592]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/cupsReal0 .098/cupsReal1 .098/PageSize[302.112 524.592]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo5x7/Photo 5x7in" 360 504 9 9 9 9 "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo5x7.FB/Photo Borderless 5x7in" 372.816 518.112 0 0 0 0 "<</cupsInteger0 122/PageSize[372.816 518.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/cupsReal0 .089/cupsReal1 .098/PageSize[372.816 518.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo2L/Photo 2L 127x178mm" 360 504 9 9 9 9 "<</cupsInteger0 126/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 126/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo2L.FB/Photo 2L Borderless 127x178mm" 372.816 518.112 0 0 0 0 "<</cupsInteger0 126/PageSize[372.816 518.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 126/cupsReal0 .089/cupsReal1 .098/PageSize[372.816 518.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card5x8/Index Card 5x8in" 360 576 9 9 9 9 "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Oufuku/Oufuku-Hagaki 200x148mm" 566.64 419.76 9 9 9 9 "<</cupsInteger0 72/PageSize[566.64 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 72/PageSize[566.64 419.76]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Cabinet/Cabinet Size 120x165" 339.84 468 9 9 9 9 "<</cupsInteger0 119/PageSize[339.84 468]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 119/PageSize[339.84 468]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Cabinet.FB/Cabinet Size 120x165 Borderless" 352.584 482.112 0 0 0 0 "<</cupsInteger0 119/PageSize[352.584 482.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 119/cupsReal0 .079/cupsReal1 .098/PageSize[352.584 482.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5/A5 148x210mm" 419.76 595.44 9 9 9 9 "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5.FB/A5 Borderless 148x210mm" 435.312 609.552 0 0 0 0 "<</cupsInteger0 25/PageSize[435.312 609.552]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/cupsReal0 .098/cupsReal1 .098/PageSize[435.312 609.552]/ImagingBBox null>>setpagedevice"
+
+// Standard
+ CustomMedia "B5/B5 176x250mm" 498.96 708.48 9 9 9 9 "<</cupsInteger0 65/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 65/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ CustomMedia "B5.Duplex/B5 AutoDuplex 176x250mm" 498.96 699.48 9 33.192 9 42.192 "<</cupsInteger0 65/PageSize[498.96 699.48]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 65/PageSize[498.96 699.48]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5/JB5 182x257mm" 516.24 728.64 9 9 9 9 "<</cupsInteger0 45/PageSize[516.24 728.64]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 45/PageSize [516.24 728.64]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5.FB/JB5 Borderless 182x257mm" 531.792 742.752 0 0 0 0 "<</cupsInteger0 45/PageSize[531.792 742.752]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 45/cupsReal0 .098/cupsReal1 .098/PageSize [531.792 742.752]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5.Duplex/JB5 AutoDuplex 182x257mm" 516.24 719.64 9 33.192 9 42.192 "<</cupsInteger0 45/PageSize[516.24 719.64]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 45/PageSize [516.24 719.64]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Executive/Executive 7.25x10.5in" 522 756 9 9 9 9 "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Executive.Duplex/Executive AutoDuplex 7.25x10.5in" 522 747 9 33.192 9 42.192 "<</cupsInteger0 1/PageSize[522 747]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[522 747]/ImagingBBox null>>setpagedevice"
+ CustomMedia "8x10/8x10in" 576 720 9 9 9 9 "<</cupsInteger0 7/PageSize[576 720]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 7/PageSize[576 720]/ImagingBBox null>>setpagedevice"
+ *CustomMedia "Letter/Letter 8.5x11in" 612 792 9 9 9 9 "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Letter.FB/Letter Borderless 8.5x11in" 627.552 806.112 0 0 0 0 "<</cupsInteger0 2/PageSize[627.552 806.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/cupsReal0 .098/cupsReal1 .098/PageSize[627.552 806.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Letter.Duplex/Letter AutoDuplex 8.5x11in" 612 783 9 33.192 9 42.192 "<</cupsInteger0 2/PageSize[612 783]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/PageSize[612 783]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4/A4 210x297mm" 595.44 841.68 9 9 9 9 "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4.FB/A4 Borderless 210x297mm" 610.992 855.792 0 0 0 0 "<</cupsInteger0 26/PageSize[610.992 855.792]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/cupsReal0 .098/cupsReal1 .098/PageSize[610.992 855.792]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4.Duplex/A4 AutoDuplex 210x297mm" 595.44 832.68 9 33.192 9 42.192 "<</cupsInteger0 26/PageSize[595.44 832.68]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/PageSize[595.44 832.68]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Legal/Legal 8.5x14in" 612 1008 9 9 9 9 "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+
+// Envelope
+ CustomMedia "EnvA2/A2 Envelope 4.37x5.75in" 314.64 414 9 42.192 9 9 "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC6/C6 Envelope 114x162mm" 323.28 459.36 9 42.192 9 9 "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou4/#4 Japanese Envelope 90x205mm" 254.88 581.04 9 42.192 9 9 "<</cupsInteger0 111/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 111/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Env6/#6 Envelope 3.63x6.5in" 261.36 468 9 42.192 9 9 "<</cupsInteger0 83/PageSize[261.36 468]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 83/PageSize[261.36 468]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvCard/Card Envelope 4.4x6in" 315 432 9 42.192 9 9 "<</cupsInteger0 114/PageSize[315 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 114/PageSize[315 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvMonarch/Monarch Envelope 3.875x7.5in" 279 540 9 42.192 9 9 "<</cupsInteger0 80/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 80/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvDL/DL Envelope 110x220mm" 311.76 623.52 9 42.192 9 9 "<</cupsInteger0 90/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 90/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Env10/#10 Envelope 4.125x9.5in" 297 684 9 42.192 9 9 "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou3/#3 Japanese Envelope 120x235mm" 339.84 666 9 42.192 9 9 "<</cupsInteger0 110/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 110/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC5/C5 Envelope 162x229mm" 459.36 649.44 9 42.192 9 9 "<</cupsInteger0 91/PageSize[459.36 649.44]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 91/PageSize[459.36 649.44]/ImagingBBox null>>setpagedevice"
+
+ // Custom page sizes from 3x4in to Legal
+ HWMargins 9 9 9 9
+ VariablePaperSize Yes
+ MinSize 3in 4in
+ MaxSize 8.5in 30in
+
+ //Python10 with NoCDDVD
+ {
+ // MediaPosition values map to MediaSource enumeration in global_types.h
+ Option "InputSlot/Media Source" PickOne AnySetup 10.0
+ *Choice "Auto/Auto-Select" "<</MediaPosition 7>>setpagedevice"
+ Choice "PhotoTray/Photo Tray" "<</MediaPosition 6>>setpagedevice"
+ Choice "Upper/Main Tray" "<</MediaPosition 1>>setpagedevice"
+
+ //With NoMaxDPI
+ {
+ // cupsCompression values map to QUALITY_MODE from global_types.h
+ Option "OutputMode/Print Quality" PickOne AnySetup 10.0
+ Choice "Auto/Automatic" "<</OutputType(-3)/HWResolution[600 600]>>setpagedevice"
+ Choice "FastDraft/Fast Draft" "<</OutputType(-2)/HWResolution[300 300]>>setpagedevice"
+ *Choice "Normal/Normal" "<</OutputType(0)/HWResolution[600 600]>>setpagedevice"
+ Choice "Best/Best" "<</OutputType(1)/HWResolution[600 600]>>setpagedevice"
+
+ // <%Python10:NoCDDVD:NoMaxDPI%>
+ {
+ ModelName "HP Photosmart Prem c310 Series"
+ Attribute "NickName" "" "HP Photosmart Prem c310 Series, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart Prem c310 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart prem c310 series;DES:photosmart prem c310 series;"
+ PCFileName "hp-photosmart_prem_c310_series.ppd"
+ Attribute "Product" "" "(HP Photosmart Prem c310 Series)"
+ }
+ {
+ ModelName "HP Photosmart Prem c410 Series"
+ Attribute "NickName" "" "HP Photosmart Prem c410 Series, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart Prem c410 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart prem c410 series;DES:photosmart prem c410 series;"
+ PCFileName "hp-photosmart_prem_c410_series.ppd"
+ Attribute "Product" "" "(HP Photosmart Prem c410 Series)"
+ }
+ {
+ ModelName "HP Photosmart Estn c510 Series"
+ Attribute "NickName" "" "HP Photosmart Estn c510 Series, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart Estn c510 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart estn c510 series;DES:photosmart estn c510 series;"
+ PCFileName "hp-photosmart_estn_c510_series.ppd"
+ Attribute "Product" "" "(HP Photosmart Estn c510 Series)"
+ }
+ }
+
+ } //NOCDDVD Block Ends
+
+ //Python10 with NoAutoTray
+ {
+ // MediaPosition values map to MediaSource enumeration in global_types.h
+ Option "InputSlot/Media Source" PickOne AnySetup 10.0
+ Choice "Main/Main Tray" "<</MediaPosition 1>>setpagedevice"
+
+ //With MaxDPI as 1200x1200
+ {
+ // cupsCompression values map to QUALITY_MODE from global_types.h
+ Option "OutputMode/Print Quality" PickOne AnySetup 10.0
+ Choice "Auto/Automatic" "<</OutputType(-3)/HWResolution[600 600]>>setpagedevice"
+ Choice "FastDraft/Fast Draft" "<</OutputType(-2)/HWResolution[300 300]>>setpagedevice"
+ *Choice "Normal/Normal" "<</OutputType(0)/HWResolution[600 600]>>setpagedevice"
+ Choice "Best/Best" "<</OutputType(1)/HWResolution[600 600]>>setpagedevice"
+ Choice "Photo/High-Resolution Photo" "<</OutputType(2)/HWResolution[1200 1200]>>setpagedevice"
+
+ // <%Python10:NoAutoTray%>
+ {
+ ModelName "HP Officejet 6500 e710n-z"
+ Attribute "NickName" "" "HP Officejet 6500 e710n-z, $Version"
+ Attribute "ShortNickName" "" "HP Officejet 6500 e710n-z"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet 6500 e710n-z;DES:officejet 6500 e710n-z;"
+ PCFileName "hp-officejet_6500_e710n-z.ppd"
+ Attribute "Product" "" "(HP Oficejet 6500 e710n-z)"
+ }
+ }
+ } //NoAutoTray Block Ends
+
+
+} // End Python10
+
+
+
+//////// Mimas class without CDDVD
+{
+ Attribute "cupsEvenDuplex" "" "True"
+ Attribute "cupsBackSide" "" "Rotated"
+ Attribute "cupsFlipDuplex" "" "True"
+ Attribute "hpPrinterLanguage" "" "pcl3gui2"
+ Attribute "HPMechOffset" "" "70"
+
+ Group "General/General"
+
+
+ // MediaPosition values map to MediaSource enumeration in global_types.h
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 10.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "<</Duplex true/Tumble false>>setpagedevice"
+ Choice "DuplexTumble/Short Edge (Flip)" "<</Duplex true/Tumble true>>setpagedevice"
+ *Choice "None/Off" "<</Duplex false/Tumble false>>setpagedevice"
+
+ // MediaPosition values map to MediaSource enumeration in global_types.h
+ Option "InputSlot/Media Source" PickOne AnySetup 10.0
+ *Choice "Auto/Auto-Select" "<</MediaPosition 7>>setpagedevice"
+ Choice "Main/Main Tray" "<</MediaPosition 1>>setpagedevice"
+
+ Option "ColorModel/Output Mode" PickOne AnySetup 10.0
+ *Choice "RGB/Color" "<</cupsColorSpace 17/cupsBitsPerColor 8/cupsRowStep 0>>setpagedevice"
+ Choice "CMYGray/High Quality Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 1>>setpagedevice"
+ Choice "KGray/Black Only Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 2>>setpagedevice"
+
+ // cupsMediaType values map to MEDIATYPE from global_types.h
+ Option "MediaType/Media Type" PickOne AnySetup 10.0
+ *Choice "Plain/Plain Paper" "<</MediaType(Plain)/cupsMediaType 0>>setpagedevice"
+ Choice "Glossy/Photo Paper" "<</MediaType(Glossy)/cupsMediaType 3>>setpagedevice"
+ Choice "TransparencyFilm/Transparency Film" "<</MediaType(TransparencyFilm)/cupsMediaType 4>>setpagedevice"
+
+ // cupsCompression values map to QUALITY_MODE from global_types.h
+ Option "OutputMode/Print Quality" PickOne AnySetup 10.0
+ *Choice "Normal/Normal" "<</OutputType(0)/HWResolution[600 600]>>setpagedevice"
+ Choice "Best/Best" "<</OutputType(1)/HWResolution[600 600]>>setpagedevice"
+ Choice "Photo/High-Resolution Photo" "<</OutputType(2)/HWResolution[1200 1200]>>setpagedevice"
+ Choice "FastDraft/Fast Draft" "<</OutputType(-2)/HWResolution[300 300]>>setpagedevice"
+
+
+ // Duplexer is optional...
+ Installable "OptionDuplex/Duplexer Installed"
+
+
+ // Constraints
+ UIConstraints "*Duplex *OptionDuplex False"
+ UIConstraints "*MediaType Automatic *OutputMode FastDraft"
+ UIConstraints "*MediaType Glossy *OutputMode FastDraft"
+ UIConstraints "*MediaType TransparencyFilm *OutputMode FastDraft"
+ UIConstraints "*MediaType TransparencyFilm *OutputMode Best"
+
+ UIConstraints "*ColorModel KGray *OutputMode Photo"
+ UIConstraints "*ColorModel CMYGray *OutputMode Photo"
+ UIConstraints "*MediaType Glossy *OutputMode FastDraft"
+ UIConstraints "*MediaType TransparencyFilm *OutputMode FastDraft"
+ UIConstraints "*MediaType Plain *OutputMode Photo"
+ UIConstraints "*MediaType TransparencyFilm *OutputMode Photo"
+ UIConstraints "*MediaType TransparencyFilm *OutputMode Best"
+
+ UIConstraints "*PageSize PhotoL.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize Photo4x6.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize A6.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize Cabinet.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize Photo5x7.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize A5.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize 8x10.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize Letter.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize A4.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize B5.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize HV.FB *OutputMode FastDraft"
+
+
+ // Non duplex media against duplex
+ UIConstraints "*PageSize Card3x5 *Duplex"
+ UIConstraints "*PageSize PhotoL *Duplex"
+ UIConstraints "*PageSize PhotoL.FB *Duplex"
+ UIConstraints "*PageSize Hagaki *Duplex"
+ UIConstraints "*PageSize Hagaki.FB *Duplex"
+ UIConstraints "*PageSize Card4x6 *Duplex"
+ UIConstraints "*PageSize Photo4x6 *Duplex"
+ UIConstraints "*PageSize Photo4x6.FB *Duplex"
+ UIConstraints "*PageSize A6 *Duplex"
+ UIConstraints "*PageSize A6.FB *Duplex"
+ UIConstraints "*PageSize HV *Duplex"
+ UIConstraints "*PageSize HV.FB *Duplex"
+ UIConstraints "*PageSize Photo5x7 *Duplex"
+ UIConstraints "*PageSize Photo5x7.FB *Duplex"
+ UIConstraints "*PageSize Photo2L *Duplex"
+ UIConstraints "*PageSize Photo2L.FB *Duplex"
+ UIConstraints "*PageSize Card5x8 *Duplex"
+ UIConstraints "*PageSize Oufuku *Duplex"
+ UIConstraints "*PageSize Cabinet *Duplex"
+ UIConstraints "*PageSize Cabinet.FB *Duplex"
+ UIConstraints "*PageSize A5 *Duplex"
+ UIConstraints "*PageSize A5.FB *Duplex"
+ UIConstraints "*PageSize B5 *Duplex"
+ UIConstraints "*PageSize JB5 *Duplex"
+ UIConstraints "*PageSize JB5.FB *Duplex"
+ UIConstraints "*PageSize Executive *Duplex"
+ UIConstraints "*PageSize 8x10 *Duplex"
+ UIConstraints "*PageSize Letter *Duplex"
+ UIConstraints "*PageSize Letter.FB *Duplex"
+ UIConstraints "*PageSize A4 *Duplex"
+ UIConstraints "*PageSize A4.FB *Duplex"
+ UIConstraints "*PageSize Legal *Duplex"
+ UIConstraints "*PageSize EnvA2 *Duplex"
+ UIConstraints "*PageSize EnvC6 *Duplex"
+ UIConstraints "*PageSize EnvChou4 *Duplex"
+ UIConstraints "*PageSize Env6 *Duplex"
+ UIConstraints "*PageSize EnvCard *Duplex"
+ UIConstraints "*PageSize EnvMonarch *Duplex"
+ UIConstraints "*PageSize EnvDL *Duplex"
+ UIConstraints "*PageSize Env10 *Duplex"
+ UIConstraints "*PageSize EnvChou3 *Duplex"
+ UIConstraints "*PageSize EnvC5 *Duplex"
+
+// 4x6 or smaller
+ CustomMedia "Card3x5/Index Card 3x5in" 216 360 9 9 9 9 "<</cupsInteger0 78/PageSize [216 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 78/PageSize[216 360]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card4x6/Index Card 4x6in" 306 450 9 9 9 9 "<</cupsInteger0 74/PageSize [216 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[306 450]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card4x6.Duplex/Index Card AutoDuplex 4x6in" 288 423 9 27 9 36 "<</cupsInteger0 74/PageSize[288 423]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[288 423]/ImagingBBox null>>setpagedevice"
+ CustomMedia "L/L 89x127mm" 252 360 9 9 9 9 "<</cupsInteger0 121/PageSize[252 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 121/PageSize[252 360]/ImagingBBox null>>setpagedevice"
+ CustomMedia "L.FB/L Borderless 89x127mm" 264.74 370.36 0 0 0 0 "<</cupsInteger0 121/PageSize[264.74 370.36]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 121/cupsReal0 .079/cupsReal1 .051/PageSize[264.74 370.36]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6/Photo 4x6in" 288 432 9 9 9 9 "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6.FB/Photo Borderless 4x6in" 303.55 442.36 0 0 0 0 "<</cupsInteger0 74/PageSize[303.55 442.36]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/cupsReal0 .098/cupsReal1 .051/PageSize[303.55 442.36]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6/A6 105x148mm" 297.36 419.76 9 9 9 9 "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6.FB/A6 Borderless 105x148mm" 310.1 430.12 0 0 0 0 "<</cupsInteger0 73/PageSize[310.1 430.12]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 73/cupsReal0 .079/cupsReal1 .051/PageSize[310.1 430.12]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6.Duplex/A6 AutoDuplex 105x148mm)" 297 411 9 27 9 36 "<</cupsInteger0 73/PageSize[297 411]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 73/PageSize[297 411]/ImagingBBox null>>setpagedevice"
+
+// 5x7
+ CustomMedia "HV/HV 101x180mm" 286.56 510.48 9 9 9 9 "<</cupsInteger0 101/PageSize[286.56 510.48]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[286.56 510.48]/ImagingBBox null>>setpagedevice"
+ CustomMedia "HV.FB/HV Borderless 101x180mm" 302.11 520.84 0 0 0 0 "<</cupsInteger0 101/PageSize[302.11 520.84]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/cupsReal0 .098/cupsReal1 .051/PageSize[302.11 520.84]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Cabinet/Cabinet Size 120x165mm" 339.84 468 9 9 9 9 "<</cupsInteger0 119/PageSize[339.84 468]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 119/PageSize[339.84 468]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Cabinet.FB/Cabinet Size Borderless 120x165mm" 352.58 478.36 0 0 0 0 "<</cupsInteger0 119/PageSize[352.58 478.36]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 119/cupsReal0 .079/cupsReal1 .051/PageSize[352.58 478.36]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo5x7/Photo 5x7in" 360 504 9 9 9 9 "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo5x7.FB/Photo Borderless 5x7in" 372.81 514.36 0 0 0 0 "<</cupsInteger0 122/PageSize[372.81 514.36]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/cupsReal0 .089/cupsReal1 .051/PageSize[372.81 514.36]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card5x8/Index Card 5x8in" 360 576 9 9 9 9 "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card5x8.Duplex/Index Card AutoDuplex 5x8in" 360 567 9 27 9 36 "<</cupsInteger0 75/PageSize[360 567]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 75/PageSize[360 567]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5/A5 148x210mm" 419.76 595.44 9 9 9 9 "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5.Duplex/A5 AutoDuplex 148x210mm" 419.76 586.44 9 27 9 36 "<</cupsInteger0 25/PageSize[419.76 586.44]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/PageSize[419.76 586.44]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5.FB/A5 Borderless 148x210mm" 435.31 605.8 0 0 0 0 "<</cupsInteger0 25/PageSize[435.31 605.8]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/cupsReal0 .098/cupsReal1 .051/PageSize[435.31 605.8]/ImagingBBox null>>setpagedevice"
+
+// Standard
+ CustomMedia "B5/B5 176x250mm" 498.96 708.48 9 9 9 9 "<</cupsInteger0 65/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 65/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ CustomMedia "B5.Duplex/B5 AutoDuplex 176x250mm" 498.96 699.48 9 27 9 36 "<</cupsInteger0 65/PageSize[498.96 699.48]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 65/PageSize[498.96 699.48]/ImagingBBox null>>setpagedevice"
+ CustomMedia "B5.FB/B5 Borderless 176x250mm" 514.51 718.84 0 0 0 0 "<</cupsInteger0 65/PageSize[514.51 718.84]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 65/cupsReal0 .098/cupsReal1 .051/PageSize[514.51 718.84]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Executive/Executive 7.25x10.5in" 522 756 9 9 9 9 "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Executive.Duplex/Executive AutoDuplex 7.25x10.5in" 522 747 9 27 9 36 "<</cupsInteger0 1/PageSize[522 747]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[522 747]/ImagingBBox null>>setpagedevice"
+ CustomMedia "8x10/8x10in" 576 720 9 9 9 9 "<</cupsInteger0 7/PageSize[576 720]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 7/PageSize[576 720]/ImagingBBox null>>setpagedevice"
+ CustomMedia "8x10.FB/Borderless 8x10in" 589.46 730.36 0 0 0 0 "<</cupsInteger0 7/PageSize[589.46 730.36]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 7/cupsReal0 .098/cupsReal1 .051/PageSize[589.46 730.36]/ImagingBBox null>>setpagedevice"
+ *CustomMedia "Letter/Letter 8.5x11in" 612 792 9 9 9 9 "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Letter.Duplex/Letter AutoDuplex 8.5x11in" 612 783 9 27 9 36 "<</cupsInteger0 2/PageSize[612 783]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/PageSize[612 783]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Letter.FB/Letter Borderless 8.5x11in" 627.55 802.36 0 0 0 0 "<</cupsInteger0 2/PageSize[627.55 802.36]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/cupsReal0 .098/cupsReal1 .051/PageSize[627.55 802.36]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4/A4 210x297mm" 595.44 841.68 9 9 9 9 "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4.Duplex/A4 AutoDuplex 210x297mm" 595.44 832.68 9 27 9 36 "<</cupsInteger0 26/PageSize[595.44 832.68]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/PageSize[595.44 832.68]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4.FB/A4 Borderless 210x297mm" 610.99 852.04 0 0 0 0 "<</cupsInteger0 26/PageSize[610.99 852.04]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/cupsReal0 .098/cupsReal1 .051/PageSize[610.99 852.04]/ImagingBBox null>>setpagedevice"
+
+// Envelope
+ CustomMedia "EnvA2/A2 Envelope 4.37x5.75in" 314.64 414 9 40.536 9 9 "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC6/C6 Envelope 114x162mm" 323.28 459.36 9 40.536 9 9 "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvMonarch/Monarch Envelope 3.875x7.5in" 279 540 9 40.536 9 9 "<</cupsInteger0 80/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 80/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvDL/DL Envelope 110x220mm" 311.76 623.52 9 40.536 9 9 "<</cupsInteger0 90/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 90/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Env10/#10 Envelope 4.125x9.5in" 297 684 9 40.536 9 9 "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Env6/#6 Envelope 3.63x6.5in" 261.36 468 9 40.536 9 9 "<</cupsInteger0 83/PageSize[261.36 468]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 83/PageSize[261.36 468]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvCard/Card Envelope 4.4x6in" 315 432 9 40.536 9 9 "<</cupsInteger0 114/PageSize[315 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 114/PageSize[315 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC5/C5 Envelope 162x229mm" 457.92 649.44 9 42.19 9 9 "<</cupsInteger0 91/PageSize[457.92 649.44]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 91/PageSize[457.92 649.44]/ImagingBBox null>>setpagedevice"
+
+ {
+ UIConstraints "*PageSize L.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize Hagaki.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize JB5.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize 2L.FB *OutputMode FastDraft"
+ UIConstraints "*PageSize Mutsugiri.FB *OutputMode FastDraft"
+
+ CustomMedia "Hagaki/Hagaki 100x148mm" 283.68 419.76 9 9 9 9 "<</cupsInteger0 71/PageSize[283.68 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/PageSize[283.68 419.76]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki.Duplex/Hagaki AutoDuplex 100x148mm" 283.68 410.76 9 27 9 36 "<</cupsInteger0 71/PageSize[283.68 410.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/PageSize[283.68 410.76]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki.FB/Hagaki Borderless 100x148mm" 296.42 430.12 0 0 0 0 "<</cupsInteger0 71/PageSize[296.42 430.12]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/cupsReal0 .098/cupsReal1 .051/PageSize[296.42 430.12]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Oufuku/Oufuku-Hagaki 200x148mm" 566.64 419.76 9 9 9 9 "<</cupsInteger0 72/PageSize[566.64 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 72/PageSize[566.64 419.76]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Oufuku.Duplex/Oufuku-Hagaki AutoDuplex 200x148mm" 566.64 410.76 9 27 9 36 "<</cupsInteger0 72/PageSize[566.64 410.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 72/PageSize[566.64 410.76]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5/JB5 182x257mm" 516.24 728.64 9 9 9 9 "<</cupsInteger0 45/PageSize[516.24 728.64]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 45/PageSize [516.24 728.64]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5.Duplex/JB5 AutoDuplex 182x257mm" 516.24 719.64 9 27 9 36 "<</cupsInteger0 45/PageSize[516.24 719.64]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 45/PageSize [516.24 719.64]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5.FB/JB5 Borderless 182x257mm" 531.79 739 0 0 0 0 "<</cupsInteger0 45/PageSize[531.79 739]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 45/cupsReal0 .098/cupsReal1 .051/PageSize [531.79 739]/ImagingBBox null>>setpagedevice"
+ CustomMedia "2L/2L 127x178mm" 360 504 9 9 9 9 "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ CustomMedia "2L.FB/2L Borderless 127x178mm" 372.81 514.36 0 0 0 0 "<</cupsInteger0 122/PageSize[372.81 514.36]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/cupsReal0 .089/cupsReal1 .051/PageSize[372.81 514.36]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou3/#3 Japanese Envelope 120x235mm" 339.84 666 9 40.536 9 9 "<</cupsInteger0 110/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 110/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou4/#4 Japanese Envelope 90x205mm" 254.88 581.04 9 40.536 9 9 "<</cupsInteger0 111/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 111/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+
+ // Custom page sizes from 3x4in to Legal
+ HWMargins 9 9 9 9
+ VariablePaperSize Yes
+ MinSize 3in 4in
+ MaxSize 8.5in 30in
+
+ // <%Mimas:NoCDDVD%>
+ {
+ ModelName "HP Envy 100 d410 Series"
+ Attribute "NickName" "" "HP Envy 100 d410 Series, $Version"
+ Attribute "ShortNickName" "" "HP Envy 100 d410 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:envy 100 d410 series;DES:envy 100 d410 series;"
+ PCFileName "hp-envy_100_d410_series.ppd"
+ Attribute "Product" "" "(HP Envy 100 d410 Series)"
+ }
+ {
+ ModelName "HP Envy 110 Series"
+ Attribute "NickName" "" "HP Envy 110 Series, $Version"
+ Attribute "ShortNickName" "" "HP Envy 110 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:envy 110 series;DES:envy 110 series;"
+ PCFileName "hp-envy_110_series.ppd"
+ Attribute "Product" "" "(HP Envy 110 E-all-in-one)"
+ }
+ } // End Supported media sizes with full bleed.
+
+} // End Mimas
+
+//Sanjay: Changes End
+
+
+
+//////// Pyramid without AutoDuplex and CD-DVD
+{
+ Attribute "hpPrinterLanguage" "" "pcl3gui2"
+ Attribute "HPMechOffset" "" "60"
+
+ Group "General/General"
+
+ // MediaPosition values map to MediaSource enumeration in global_types.h
+ Option "InputSlot/Media Source" PickOne AnySetup 10.0
+ *Choice "Auto/Auto-Select" "<</MediaPosition 7>>setpagedevice"
+ Choice "Main/Main Tray" "<</MediaPosition 1>>setpagedevice"
+
+ Option "ColorModel/Output Mode" PickOne AnySetup 10.0
+ Choice "CMYGray/High Quality Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 1>>setpagedevice"
+ Choice "KGray/Black Only Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 2>>setpagedevice"
+ *Choice "RGB/Color" "<</cupsColorSpace 17/cupsBitsPerColor 8/cupsRowStep 0>>setpagedevice"
+
+ // cupsMediaType values map to MEDIATYPE from global_types.h
+ Option "MediaType/Media Type" PickOne AnySetup 10.0
+ *Choice "Plain/Plain Paper" "<</MediaType(Plain)/cupsMediaType 0>>setpagedevice"
+ Choice "Photo/Photo Paper" "<</MediaType(FastGlossy)/cupsMediaType 5>>setpagedevice"
+
+ // cupsCompression values map to QUALITY_MODE from global_types.h
+ Option "OutputMode/Print Quality" PickOne AnySetup 10.0
+ Choice "FastDraft/Fast Draft" "<</OutputType(-2)/HWResolution[300 300]>>setpagedevice"
+ *Choice "Normal/Normal" "<</OutputType(0)/HWResolution[600 300]>>setpagedevice"
+ Choice "Best/Best" "<</OutputType(1)/HWResolution[600 600]>>setpagedevice"
+ Choice "Photo/High-Resolution Photo" "<</OutputType(2)/HWResolution[1200 1200]>>setpagedevice"
+
+ // Constraints
+ UIConstraints "*ColorModel KGray *OutputMode Photo"
+ UIConstraints "*ColorModel CMYGray *OutputMode Photo"
+ UIConstraints "*MediaType Plain *OutputMode Photo"
+ UIConstraints "*MediaType Photo *OutputMode FastDraft"
+ UIConstraints "*MediaType Photo *OutputMode Normal"
+
+
+// 4x6 or smaller
+ CustomMedia "Card4x6/Index Card 4x6in" 288 432 9 41.04 9 4.32 "<</cupsInteger0 74/PageSize [288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6/Photo 4x6in" 288 432 9 41.04 9 4.32 "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6/A6 105x148mm" 297.36 419.76 9 41.04 9 4.32 "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Cabinet/Cabinet Size 120x165" 339.84 468 9 41.04 9 4.32 "<</cupsInteger0 119/PageSize[339.84 468]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 119/PageSize[339.84 468]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki/Hagaki 100x148mm" 283.68 419.76 9 41.04 9 4.32 "<</cupsInteger0 71/PageSize[283.68 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/PageSize[283.68 419.76]/ImagingBBox null>>setpagedevice"
+
+// 5x7
+ CustomMedia "Card5x8/Index Card 5x8in" 360 576 9 41.04 9 4.32 "<</cupsInteger0 75/PageSize [360 576]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo2L/Photo 2L 127x178mm" 360 504 9 41.04 9 4.32 "<</cupsInteger0 126/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 126/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Oufuku/Oufuku-Hagaki 200x148mm" 566.64 419.76 9 41.04 9 4.32 "<</cupsInteger0 72/PageSize[566.64 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 72/PageSize[566.64 419.76]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo5x7/Photo 5x7in" 360 504 9 41.04 9 4.32 "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5/A5 148x210mm" 419.76 595.44 9 41.04 9 4.32 "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+
+// Standard
+ CustomMedia "6x8/6x8in" 432 576 9 41.04 9 4.32 "<</cupsInteger0 101/PageSize[432 576]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[432 576]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Mutsugiri/Mutsugiri 8x10in" 576 720 9 41.04 9 4.32 "<</cupsInteger0 7/PageSize[576 720]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 7/PageSize[576 720]/ImagingBBox null>>setpagedevice"
+ CustomMedia "FLSA/American Foolscap 8.5x13in" 612 936 9.00 41.04 9.00 4.32 "<</cupsInteger0 10/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 10/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ CustomMedia "B5/B5 176x250mm" 498.96 708.48 9 41.04 9 4.32 "<</cupsInteger0 65/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 65/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5/JB5 182x257mm" 516.24 728.64 9 41.04 9 4.32 "<</cupsInteger0 45/PageSize[516.24 728.64]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 45/PageSize [516.24 728.64]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Executive/Executive 7.25x10.5in" 522 756 9 41.04 9 4.32 "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Legal/Legal 8.5x14in" 612 1008 9 41.04 9 4.32 "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4/A4 210x297mm" 595.44 841.68 9 41.04 9 4.32 "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ *CustomMedia "Letter/Letter 8.5x11in" 612 792 9 41.04 9 4.32 "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Statement/Statement 5.5x8.5in" 396 612 9 41.04 9 4.32 "<</cupsInteger0 15/PageSize[396 612]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 15/PageSize[396 612]/ImagingBBox null>>setpagedevice"
+
+
+// Envelope
+ CustomMedia "EnvDL/DL Envelope 110x220mm" 311.76 623.52 9 41.04 9 4.32 "<</cupsInteger0 90/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 90/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC6/C6 Envelope 114x162mm" 323.28 459.36 9 41.04 9 4.32 "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC5/C5 Envelope 162x229mm" 459.36 649.44 9 41.04 9 4.32 "<</cupsInteger0 91/PageSize[459.36 649.44]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 91/PageSize[459.36 649.44]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou2/#2 Envelope 111x146mm" 314.64 414 9 41.04 9 4.32 "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvCard/Card Envelope 4.4x6in" 315 432 9 41.04 9 4.32 "<</cupsInteger0 114/PageSize[315 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 114/PageSize[315 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou3/#3 Japanese Envelope 120x235mm" 339.84 666 9 41.04 9 4.32 "<</cupsInteger0 110/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 110/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Env10/#10 Envelope 4.125x9.5in" 297 684 9 41.04 9 4.32 "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+
+ // Custom page sizes from 3x4in to Legal
+ HWMargins 9 41.04 9 4.32
+ VariablePaperSize Yes
+ MinSize 3.94in 5.83in
+ MaxSize 8.5in 14in
+
+ // <%Pyramid:NoAutoDuplex:NoCDDVD%>
+ {
+ ModelName "HP Deskjet 1000 j110 Series"
+ Attribute "NickName" "" "HP Deskjet 1000 j110 Series, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 1000 j110 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 1000 j110 series;DES:deskjet 1000 j110 series;"
+ PCFileName "hp-deskjet_1000_j110_series.ppd"
+ Attribute "Product" "" "(HP Deskjet 1000 j110 Series)"
+ }
+ {
+ ModelName "HP Deskjet 1050 j410 Series"
+ Attribute "NickName" "" "HP Deskjet 1050 j410 Series, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 1050 j410 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 1050 j410 series;DES:deskjet 1050 j410 series;"
+ PCFileName "hp-deskjet_1050_j410_series.ppd"
+ Attribute "Product" "" "(HP Deskjet 1050 j410 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Deskjet 2000 j210 Series"
+ Attribute "NickName" "" "HP Deskjet 2000 j210 Series, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 2000 j210 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 2000 j210 series;DES:deskjet 2000 j210 series;"
+ PCFileName "hp-deskjet_2000_j210_series.ppd"
+ Attribute "Product" "" "(HP Deskjet 2000 j210 Series)"
+ }
+ {
+ ModelName "HP Deskjet Ink Adv 2010 k010"
+ Attribute "NickName" "" "HP Deskjet Ink Adv 2010 k010, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet Ink Adv 2010 k010"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet ink adv 2010 k010;DES:deskjet ink adv 2010 k010;"
+ PCFileName "hp-deskjet_ink_adv_2010_k010.ppd"
+ Attribute "Product" "" "(HP Deskjet Ink Adv 2010 k010)"
+ }
+ {
+ ModelName "HP Deskjet 2050 j510 Series"
+ Attribute "NickName" "" "HP Deskjet 2050 j510 Series, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 2050 j510 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 2050 j510 series;DES:deskjet 2050 j510 series;"
+ PCFileName "hp-deskjet_2050_j510_series.ppd"
+ Attribute "Product" "" "(HP Deskjet 2050 j510 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Deskjet Ink Adv 2060 k110"
+ Attribute "NickName" "" "HP Deskjet Ink Adv 2060 k110, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet Ink Adv 2060 k110"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet ink adv 2060 k110;DES:deskjet ink adv 2060 k110;"
+ PCFileName "hp-deskjet_ink_adv_2060_k110.ppd"
+ Attribute "Product" "" "(HP Deskjet Ink Adv 2060 k110)"
+ }
+ {
+ ModelName "HP Deskjet 3000 j310 Series"
+ Attribute "NickName" "" "HP Deskjet 3000 j310 Series, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 3000 j310 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 3000 j310 series;DES:deskjet 3000 j310 series;"
+ PCFileName "hp-deskjet_3000_j310_series.ppd"
+ Attribute "Product" "" "(HP Deskjet 3000 j310 Series)"
+ }
+ {
+ ModelName "HP Deskjet 3050 j610 Series"
+ Attribute "NickName" "" "HP Deskjet 3050 j610 Series, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 3050 j610 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 3050 j610 series;DES:deskjet 3050 j610 series;"
+ PCFileName "hp-deskjet_3050_j610_series.ppd"
+ Attribute "Product" "" "(HP Deskjet 3050 j610 Series)"
+ }
+ {
+ ModelName "HP Deskjet 3050a j611 Series"
+ Attribute "NickName" "" "HP Deskjet 3050a j611 Series, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 3050a j611 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 3050a j611 series;DES:deskjet 3050a j611 series;"
+ PCFileName "hp-deskjet_3050a_j611_series.ppd"
+ Attribute "Product" "" "(HP Deskjet 3050a j611 Series)"
+ }
+
+
+} // End Pyramid without AutoDuplex and CD-DVD
+
+
+//////// OJ7000
+{
+ Attribute "hpPrinterLanguage" "" "pcl3gui2"
+ Attribute "HPMechOffset" "" "69"
+
+ Group "General/General"
+
+ // MediaPosition values map to MediaSource enumeration in global_types.h
+ Option "InputSlot/Media Source" PickOne AnySetup 10.0
+ *Choice "Auto/Auto-Select" "<</MediaPosition 7>>setpagedevice"
+ Choice "PhotoTray/Photo Tray" "<</MediaPosition 6>>setpagedevice"
+ Choice "Upper/Upper Tray" "<</MediaPosition 1>>setpagedevice"
+
+ Option "ColorModel/Output Mode" PickOne AnySetup 10.0
+ Choice "CMYGray/High Quality Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 1>>setpagedevice"
+ Choice "KGray/Black Only Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 2>>setpagedevice"
+ *Choice "RGB/Color" "<</cupsColorSpace 17/cupsBitsPerColor 8/cupsRowStep 0>>setpagedevice"
+
+ // cupsMediaType values map to MEDIATYPE from global_types.h
+ Option "MediaType/Media Type" PickOne AnySetup 10.0
+ *Choice "Automatic/Automatic" "<</MediaType(Automatic)/cupsMediaType -1>>setpagedevice"
+ Choice "Plain/Plain Paper" "<</MediaType(Plain)/cupsMediaType 0>>setpagedevice"
+ Choice "Glossy/Photo Paper" "<</MediaType(Glossy)/cupsMediaType 3>>setpagedevice"
+ Choice "TransparencyFilm/Transparency Film" "<</MediaType(TransparencyFilm)/cupsMediaType 4>>setpagedevice"
+
+ // cupsCompression values map to QUALITY_MODE from global_types.h
+ Option "OutputMode/Print Quality" PickOne AnySetup 10.0
+ Choice "Auto/Automatic" "<</OutputType(-3)/HWResolution[600 600]>>setpagedevice"
+ Choice "FastDraft/Fast Draft" "<</OutputType(-2)/HWResolution[300 300]>>setpagedevice"
+ *Choice "Normal/Normal" "<</OutputType(0)/HWResolution[600 600]>>setpagedevice"
+ Choice "Best/Best" "<</OutputType(1)/HWResolution[600 600]>>setpagedevice"
+ Choice "Photo/High-Resolution Photo" "<</OutputType(2)/HWResolution[1200 1200]>>setpagedevice"
+
+ // Constraints
+ UIConstraints "*ColorModel KGray *OutputMode Photo"
+ UIConstraints "*ColorModel CMYGray *OutputMode Photo"
+ UIConstraints "*MediaType Automatic *OutputMode FastDraft"
+ UIConstraints "*MediaType Glossy *OutputMode FastDraft"
+ UIConstraints "*MediaType TransparencyFilm *OutputMode FastDraft"
+ UIConstraints "*MediaType TransparencyFilm *OutputMode Best"
+ UIConstraints "*MediaType Plain *OutputMode Photo"
+ UIConstraints "*MediaType TransparencyFilm *OutputMode Photo"
+
+// 4x6 or smaller
+ CustomMedia "Card3x5/Index Card 3x5in" 216 360 9 9 9 9 "<</cupsInteger0 78/PageSize [216 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 78/PageSize[216 360]/ImagingBBox null>>setpagedevice"
+ CustomMedia "L/L 89x127mm" 252 360 9 9 9 9 "<</cupsInteger0 121/PageSize[252 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 121/PageSize[252 360]/ImagingBBox null>>setpagedevice"
+ CustomMedia "L.FB/L Borderless 89x127mm" 264.744 374.112 0 0 0 0 "<</cupsInteger0 121/PageSize[264.744 374.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 121/cupsReal0 .079/cupsReal1 .098/PageSize[264.744 374.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki/Hagaki 100x148mm" 283.68 419.76 9 9 9 9 "<</cupsInteger0 71/PageSize[283.68 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/PageSize[283.68 419.76]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki.FB/Hagaki Borderless 100x148mm" 296.424 433.872 0 0 0 0 "<</cupsInteger0 71/PageSize[296.424 433.872]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/cupsReal0 .079/cupsReal1 .098/PageSize[296.424 433.872]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card4x6/Index Card 4x6in" 288 432 9 9 9 9 "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6/Photo 4x6in" 288 432 9 9 9 9 "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6.FB/Photo Borderless 4x6in" 303.552 446.112 0 0 0 0 "<</cupsInteger0 74/PageSize[303.552 446.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/cupsReal0 .098/cupsReal1 .098/PageSize[303.552 446.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6/A6 105x148mm" 297.36 419.76 9 9 9 9 "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6.FB/A6 Borderless 105x148mm" 310.104 433.872 0 0 0 0 "<</cupsInteger0 73/PageSize[310.104 433.872]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 73/cupsReal0 .079/cupsReal1 .098/PageSize[310.104 433.872]/ImagingBBox null>>setpagedevice"
+
+// 5x7
+ CustomMedia "HV/HV 101x180mm" 286.56 510.48 9 9 9 9 "<</cupsInteger0 101/PageSize[286.56 510.48]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[286.56 510.48]/ImagingBBox null>>setpagedevice"
+ CustomMedia "HV.FB/HV Borderless 101x180mm" 302.112 524.592 0 0 0 0 "<</cupsInteger0 101/PageSize[302.112 524.592]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/cupsReal0 .098/cupsReal1 .098/PageSize[302.112 524.592]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo5x7/Photo 5x7in" 360 504 9 9 9 9 "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo5x7.FB/Photo Borderless 5x7in" 372.816 518.112 0 0 0 0 "<</cupsInteger0 122/PageSize[372.816 518.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/cupsReal0 .089/cupsReal1 .098/PageSize[372.816 518.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo2L/Photo 2L 127x178mm" 360 504 9 9 9 9 "<</cupsInteger0 126/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 126/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo2L.FB/Photo 2L Borderless 127x178mm" 372.816 518.112 0 0 0 0 "<</cupsInteger0 126/PageSize[372.816 518.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 126/cupsReal0 .089/cupsReal1 .098/PageSize[372.816 518.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card5x8/Index Card 5x8in" 360 576 9 9 9 9 "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Oufuku/Oufuku-Hagaki 200x148mm" 566.64 419.76 9 9 9 9 "<</cupsInteger0 72/PageSize[566.64 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 72/PageSize[566.64 419.76]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Cabinet/Cabinet Size 120x165" 339.84 468 9 9 9 9 "<</cupsInteger0 119/PageSize[339.84 468]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 119/PageSize[339.84 468]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Cabinet.FB/Cabinet Size 120x165 Borderless" 352.584 482.112 0 0 0 0 "<</cupsInteger0 119/PageSize[352.584 482.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 119/cupsReal0 .079/cupsReal1 .098/PageSize[352.584 482.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5/A5 148x210mm" 419.76 595.44 9 9 9 9 "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5.FB/A5 Borderless 148x210mm" 435.312 609.552 0 0 0 0 "<</cupsInteger0 25/PageSize[435.312 609.552]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/cupsReal0 .098/cupsReal1 .098/PageSize[435.312 609.552]/ImagingBBox null>>setpagedevice"
+
+// Standard
+ CustomMedia "B5/B5 176x250mm" 498.96 708.48 9 9 9 9 "<</cupsInteger0 65/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 65/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5/JB5 182x257mm" 516.24 728.64 9 9 9 9 "<</cupsInteger0 45/PageSize[516.24 728.64]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 45/PageSize [516.24 728.64]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5.FB/JB5 Borderless 182x257mm" 531.792 742.752 0 0 0 0 "<</cupsInteger0 45/PageSize[531.792 742.752]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 45/cupsReal0 .098/cupsReal1 .098/PageSize [531.792 742.752]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Executive/Executive 7.25x10.5in" 522 756 9 9 9 9 "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ CustomMedia "8x10/8x10in" 576 720 9 9 9 9 "<</cupsInteger0 7/PageSize[576 720]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 7/PageSize[576 720]/ImagingBBox null>>setpagedevice"
+ CustomMedia "8x10.FB/Borderless 8x10in" 591.552 734.112 0 0 0 0 "<</cupsInteger0 7/PageSize[591.552 734.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 7/cupsReal0 .098/cupsReal1 .098/PageSize[591.552 734.112]/ImagingBBox null>>setpagedevice"
+ *CustomMedia "Letter/Letter 8.5x11in" 612 792 9 9 9 9 "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Letter.FB/Letter Borderless 8.5x11in" 627.552 806.112 0 0 0 0 "<</cupsInteger0 2/PageSize[627.552 806.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/cupsReal0 .098/cupsReal1 .098/PageSize[627.552 806.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4/A4 210x297mm" 595.44 841.68 9 9 9 9 "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4.FB/A4 Borderless 210x297mm" 610.992 855.792 0 0 0 0 "<</cupsInteger0 26/PageSize[610.992 855.792]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/cupsReal0 .098/cupsReal1 .098/PageSize[610.992 855.792]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Legal/Legal 8.5x14in" 612 1008 9 9 9 9 "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+
+// Envelope
+ CustomMedia "EnvC6/C6 Envelope 114x162mm" 323.28 459.36 9 42.192 9 9 "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou4/#4 Japanese Envelope 90x205mm" 254.88 581.04 9 42.192 9 9 "<</cupsInteger0 111/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 111/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Env6/#6 Envelope 3.63x6.5in" 261.36 468 9 42.192 9 9 "<</cupsInteger0 83/PageSize[261.36 468]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 83/PageSize[261.36 468]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvCard/Card Envelope 4.4x6in" 315 432 9 42.192 9 9 "<</cupsInteger0 114/PageSize[315 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 114/PageSize[315 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvMonarch/Monarch Envelope 3.875x7.5in" 279 540 9 42.192 9 9 "<</cupsInteger0 80/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 80/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Env10/#10 Envelope 4.125x9.5in" 297 684 9 42.192 9 9 "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou3/#3 Japanese Envelope 120x235mm" 339.84 666 9 42.192 9 9 "<</cupsInteger0 110/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 110/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvKaku2/#2 Envelope Kaku 240x332mm" 680.40 941.04 9 42.192 9 9 "<</cupsInteger0 101/PageSize[680.40 941.04]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[680.40 941.04]/ImagingBBox null>>setpagedevice"
+
+ {
+ // Large Media
+ CustomMedia "11x14/11x14in" 792 1008 14.184 56.736 14.184 56.736 "<</cupsInteger0 4/PageSize[792 1008]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 4/PageSize[792 1008]/ImagingBBox null>>setpagedevice"
+ CustomMedia "11x14.FB/Borderless 11x14in" 807.552 1022.112 0 0 0 0 "<</cupsInteger0 4/PageSize[807.552 1022.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 4/cupsReal0 .098/cupsReal1 .098/PageSize[807.552 1022.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "12x12/12x12in" 864 864 14.184 56.736 14.184 56.736 "<</cupsInteger0 117/PageSize[864 864]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 117/PageSize[864 864]/ImagingBBox null>>setpagedevice"
+ CustomMedia "12x12.FB/Borderless 12x12in" 879.552 878.112 0 0 0 0 "<</cupsInteger0 117/PageSize[879.552 878.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 117/cupsReal0 .098/cupsReal1 .098/PageSize[879.552 878.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB4/JB4 257x364mm" 729.36 1031.76 14.184 56.736 14.184 56.736 "<</cupsInteger0 46/PageSize[729.36 1031.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 46/PageSize[729.36 1031.76]/ImagingBBox null>>setpagedevice"
+ CustomMedia "B/B 11x17in" 792 1224 14.184 56.736 14.184 56.736 "<</cupsInteger0 6/PageSize[792 1224]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 6/PageSize[792 1224]/ImagingBBox null>>setpagedevice"
+ CustomMedia "B.FB/B Borderless 11x17in" 807.552 1238.112 0 0 0 0 "<</cupsInteger0 6/PageSize[807.552 1238.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 6/cupsReal0 .098/cupsReal1 .098/PageSize[807.552 1238.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "SuperB/SuperB 13x19in" 936 1368 14.184 56.736 14.184 56.736 "<</cupsInteger0 16/PageSize[936 1368]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 16/PageSize[936 1368]/ImagingBBox null>>setpagedevice"
+ CustomMedia "SuperB.FB/SuperB Borderless 13x19in" 951.552 1382.112 0 0 0 0 "<</cupsInteger0 16/PageSize[951.552 1382.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 16/cupsReal0 .098/cupsReal1 .098/PageSize[951.552 1382.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A3/A3 297x420mm" 841.68 1190.88 14.184 56.736 14.184 56.736 "<</cupsInteger0 27/PageSize[841.68 1190.88]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 27/PageSize[841.68 1190.88]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A3.FB/A3 Borderless 297x420mm" 857.232 1204.992 0 0 0 0 "<</cupsInteger0 27/PageSize[857.232 1204.992]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 27/cupsReal0 .098/cupsReal1 .098/PageSize[857.232 1204.992]/ImagingBBox null>>setpagedevice"
+ CustomMedia "SuperA3/A3+ 330x483mm" 935.28 1369.44 14.184 56.736 14.184 56.736 "<</cupsInteger0 16/PageSize[935.28 1369.44]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 16/PageSize[935.28 1369.44]/ImagingBBox null>>setpagedevice"
+ CustomMedia "SuperA3.FB/A3+ Borderless 330x483mm" 950.832 1383.552 0 0 0 0 "<</cupsInteger0 16/PageSize[950.832 1383.552]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 16/cupsReal0 .098/cupsReal1 .098/PageSize[950.832 1383.552]/ImagingBBox null>>setpagedevice"
+
+
+ // Custom page sizes from 3x4in to 13x44in
+ HWMargins 9 9 9 9
+ VariablePaperSize Yes
+ MinSize 3in 4in
+ MaxSize 13in 44in
+
+ // <%OJ7000:LargeFormatA3%>
+ {
+ ModelName "HP Officejet 7000 e809a Series"
+ Attribute "NickName" "" "HP Officejet 7000 e809a Series, $Version"
+ Attribute "ShortNickName" "" "HP Officejet 7000 e809a Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet 7000 e809a series;DES:officejet 7000 e809a series;"
+ PCFileName "hp-officejet_7000_e809a_series.ppd"
+ Attribute "Product" "" "(HP Officejet 7000 Wide Format Printer -- e809a)"
+ }
+ {
+ ModelName "HP Officejet 7000 e809a"
+ Attribute "NickName" "" "HP Officejet 7000 e809a, $Version"
+ Attribute "ShortNickName" "" "HP Officejet 7000 e809a"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet 7000 e809a;DES:officejet 7000 e809a;"
+ PCFileName "hp-officejet_7000_e809a.ppd"
+ Attribute "Product" "" "(HP Officejet 7000 Wide Format Printer -- e809a)"
+ }
+ } // End Large format media sizes with full bleed
+
+ {
+ // Large Media and Small Margins
+ CustomMedia "11x14/11x14in" 792 1008 14.184 56.736 14.184 56.736 "<</cupsInteger0 4/PageSize[792 1008]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 4/PageSize[792 1008]/ImagingBBox null>>setpagedevice"
+ CustomMedia "11x14.FB/Borderless 11x14in" 807.552 1022.112 0 0 0 0 "<</cupsInteger0 4/PageSize[807.552 1022.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 4/cupsReal0 .098/cupsReal1 .098/PageSize[807.552 1022.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "11x14SM/11x14in Small Margins" 792 1008 14.184 14.184 14.184 14.184 "<</cupsInteger0 4/PageSize[792 1008]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 4/PageSize[792 1008]/ImagingBBox null>>setpagedevice"
+ CustomMedia "12x12/12x12in" 864 864 14.184 56.736 14.184 56.736 "<</cupsInteger0 117/PageSize[864 864]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 117/PageSize[864 864]/ImagingBBox null>>setpagedevice"
+ CustomMedia "12x12.FB/Borderless 12x12in" 879.552 878.112 0 0 0 0 "<</cupsInteger0 117/PageSize[879.552 878.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 117/cupsReal0 .098/cupsReal1 .098/PageSize[879.552 878.112]/ImagingBBox null>>setpagedevice"
+ //CustomMedia "12x12SM/12x12in SmallMargins" 864 864 14.184 14.184 14.184 14.184 "<</cupsInteger0 117/PageSize[864 864]/ImagingBBox null>>setpagedevice"
+ //"<</cupsInteger0 117/PageSize[864 864]/ImagingBBox null>>setpagedevice"
+ CustomMedia "12x12SM/12x12in SmallMargins" 870 870 14.184 14.184 14.184 14.184 "<</cupsInteger0 117/PageSize[870 870]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 117/PageSize[870 870]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB4/JB4 257x364mm" 729.36 1031.76 14.184 56.736 14.184 56.736 "<</cupsInteger0 46/PageSize[729.36 1031.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 46/PageSize[729.36 1031.76]/ImagingBBox null>>setpagedevice"
+ //CustomMedia "JB4SM/JB4 257x364mm SmallMargins" 729.36 1031.76 14.184 14.184 14.184 14.184 "<</cupsInteger0 46/PageSize[729.36 1031.76]/ImagingBBox null>>setpagedevice"
+ //"<</cupsInteger0 46/PageSize[729.36 1031.76]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB4SM/JB4 257x364mm SmallMargins" 735.36 1037.76 14.184 14.184 14.184 14.184 "<</cupsInteger0 46/PageSize[735.36 1037.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 46/PageSize[735.36 1037.76]/ImagingBBox null>>setpagedevice"
+ CustomMedia "B/B 11x17in" 792 1224 14.184 56.736 14.184 56.736 "<</cupsInteger0 6/PageSize[792 1224]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 6/PageSize[792 1224]/ImagingBBox null>>setpagedevice"
+ CustomMedia "B.FB/B Borderless 11x17in" 807.552 1238.112 0 0 0 0 "<</cupsInteger0 6/PageSize[807.552 1238.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 6/cupsReal0 .098/cupsReal1 .098/PageSize[807.552 1238.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "BSM/B 11x17in SmallMargins" 792 1224 14.184 14.184 14.184 14.184 "<</cupsInteger0 6/PageSize[792 1224]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 6/PageSize[792 1224]/ImagingBBox null>>setpagedevice"
+ CustomMedia "SuperB/SuperB 13x19in" 936 1368 14.184 56.736 14.184 56.736 "<</cupsInteger0 16/PageSize[936 1368]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 16/PageSize[936 1368]/ImagingBBox null>>setpagedevice"
+ CustomMedia "SuperB.FB/SuperB Borderless 13x19in" 951.552 1382.112 0 0 0 0 "<</cupsInteger0 16/PageSize[951.552 1382.112]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 16/cupsReal0 .098/cupsReal1 .098/PageSize[951.552 1382.112]/ImagingBBox null>>setpagedevice"
+ CustomMedia "SuperBSM/SuperB 13x19in SmallMargins" 936 1368 14.184 14.184 14.184 14.184 "<</cupsInteger0 16/PageSize[936 1368]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 16/PageSize[936 1368]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A3/A3 297x420mm" 841.68 1190.88 14.184 56.736 14.184 56.736 "<</cupsInteger0 27/PageSize[841.68 1190.88]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 27/PageSize[841.68 1190.88]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A3.FB/A3 Borderless 297x420mm" 857.232 1204.992 0 0 0 0 "<</cupsInteger0 27/PageSize[857.232 1204.992]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 27/cupsReal0 .098/cupsReal1 .098/PageSize[857.232 1204.992]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A3SM/A3 297x420mm SmallMargins" 847.68 1196.88 14.184 14.184 14.184 14.184 "<</cupsInteger0 27/PageSize[847.68 1196.88]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 27/PageSize[847.68 1196.88]/ImagingBBox null>>setpagedevice"
+ CustomMedia "SuperA3/A3+ 330x483mm" 935.28 1369.44 14.184 56.736 14.184 56.736 "<</cupsInteger0 16/PageSize[935.28 1369.44]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 16/PageSize[935.28 1369.44]/ImagingBBox null>>setpagedevice"
+ CustomMedia "SuperA3.FB/A3+ Borderless 330x483mm" 950.832 1383.552 0 0 0 0 "<</cupsInteger0 16/PageSize[950.832 1383.552]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 16/cupsReal0 .098/cupsReal1 .098/PageSize[950.832 1383.552]/ImagingBBox null>>setpagedevice"
+ CustomMedia "SuperA3SM/A3+ 330x483mm SmallMargins" 935.28 1369.44 14.184 14.184 14.184 14.184 "<</cupsInteger0 16/PageSize[935.28 1369.44]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 16/PageSize[935.28 1369.44]/ImagingBBox null>>setpagedevice"
+
+ // Custom page sizes from 3x4in to 13x44in
+ HWMargins 9 9 9 9
+ VariablePaperSize Yes
+ MinSize 3in 5in
+ MaxSize 13in 44in
+
+ // <%OJ7000:LargeFormatA3:SmallMargins%>
+ {
+ ModelName "HP Officejet 7500 e910"
+ Attribute "NickName" "" "HP Officejet 7500 e910, $Version"
+ Attribute "ShortNickName" "" "HP Officejet 7500 e910"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet 7500 e910;DES:officejet 7500 e910;"
+ PCFileName "hp-officejet_7500_e910.ppd"
+ Attribute "Product" "" "(HP Officejet 7500 e910)"
+ }
+ } // End Large Media and Small Margins
+
+} // End OJ7000
+
+//////// OJProKx50 and DJGenericVIP with no fullbleed
+{
+ Attribute "cupsEvenDuplex" "" "True"
+ Attribute "cupsBackSide" "" "Rotated"
+ Attribute "cupsFlipDuplex" "" "True"
+ Attribute "hpPrinterLanguage" "" "pcl3gui2"
+ Attribute "HPMechOffset" "" "70"
+
+ Group "General/General"
+
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 10.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "<</Duplex true/Tumble false>>setpagedevice"
+ Choice "DuplexTumble/Short Edge (Flip)" "<</Duplex true/Tumble true>>setpagedevice"
+ *Choice "None/Off" "<</Duplex false/Tumble false>>setpagedevice"
+
+ // MediaPosition values map to MediaSource enumeration in global_types.h
+ Option "InputSlot/Media Source" PickOne AnySetup 10.0
+ *Choice "Auto/Auto-Select" "<</MediaPosition 7>>setpagedevice"
+ Choice "PhotoTray/Photo Tray" "<</MediaPosition 6>>setpagedevice"
+ Choice "Upper/Upper Tray" "<</MediaPosition 1>>setpagedevice"
+ Choice "Lower/Lower Tray" "<</MediaPosition 4>>setpagedevice"
+ Choice "Envelope/Envelope Feeder" "<</MediaPosition 3>>setpagedevice"
+ Choice "LargeCapacity/Large Capacity Tray" "<</MediaPosition 5>>setpagedevice"
+ Choice "Manual/Manual Feeder" "<</MediaPosition 2>>setpagedevice"
+ Choice "MPTray/Multi Purpose Tray" "<</MediaPosition 1>>setpagedevice"
+ Choice "CDDVDTray/CD or DVD Tray" "<</MediaPosition 14>>setpagedevice"
+
+ Option "ColorModel/Output Mode" PickOne AnySetup 10.0
+ Choice "CMYGray/High Quality Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 1>>setpagedevice"
+ Choice "KGray/Black Only Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 2>>setpagedevice"
+ *Choice "RGB/Color" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 0>>setpagedevice"
+
+ // cupsMediaType values map to MEDIATYPE from global_types.h
+ Option "MediaType/Media Type" PickOne AnySetup 10.0
+ *Choice "Automatic/Automatic" "<</MediaType(Automatic)/cupsMediaType -1>>setpagedevice"
+ Choice "Plain/Plain Paper" "<</MediaType(Plain)/cupsMediaType 0>>setpagedevice"
+ Choice "Glossy/Photo Paper" "<</MediaType(Glossy)/cupsMediaType 3>>setpagedevice"
+ Choice "TransparencyFilm/Transparency Film" "<</MediaType(TransparencyFilm)/cupsMediaType 4>>setpagedevice"
+ Choice "CDDVDMedia/CD or DVD Media" "<</MediaType(CDDVDMedia)/cupsMediaType 7>>setpagedevice"
+
+ // cupsCompression values map to QUALITY_MODE from global_types.h
+ Option "OutputMode/Print Quality" PickOne AnySetup 10.0
+ *Choice "Normal/Normal" "<</OutputType(0)/HWResolution[600 600]>>setpagedevice"
+ Choice "Draft/Draft" "<</OutputType(-1)/HWResolution[300 300]>>setpagedevice"
+ Choice "Best/Best" "<</OutputType(1)/HWResolution[600 600]>>setpagedevice"
+ Choice "Photo/High-Resolution Photo" "<</OutputType(2)/HWResolution[1200 1200]>>setpagedevice"
+ Choice "FastDraft/Fast Draft" "<</OutputType(-2)/HWResolution[300 300]>>setpagedevice"
+
+ // Duplexer is optional...
+ Installable "OptionDuplex/Duplexer Installed"
+
+ // Constraints
+ UIConstraints "*Duplex *OptionDuplex False"
+ UIConstraints "*ColorModel KGray *OutputMode Photo"
+ UIConstraints "*ColorModel CMYGray *OutputMode Photo"
+ UIConstraints "*MediaType Automatic *OutputMode FastDraft"
+ UIConstraints "*MediaType Glossy *OutputMode FastDraft"
+ UIConstraints "*MediaType Glossy *OutputMode Draft"
+ UIConstraints "*MediaType TransparencyFilm *OutputMode FastDraft"
+ UIConstraints "*MediaType Plain *OutputMode Photo"
+ UIConstraints "*InputSlot CDDVDTray *MediaType Automatic"
+ UIConstraints "*InputSlot CDDVDTray *MediaType Plain"
+ UIConstraints "*InputSlot CDDVDTray *MediaType Glossy"
+ UIConstraints "*InputSlot CDDVDTray *MediaType TransparencyFilm"
+ UIConstraints "*PageSize Letter *Duplex"
+ UIConstraints "*PageSize A4 *Duplex"
+ UIConstraints "*PageSize Legal *Duplex"
+ UIConstraints "*PageSize Photo4x6 *Duplex"
+ UIConstraints "*PageSize Photo5x7 *Duplex"
+ UIConstraints "*PageSize A5 *Duplex"
+ UIConstraints "*PageSize A6 *Duplex"
+ UIConstraints "*PageSize B5 *Duplex"
+ UIConstraints "*PageSize Oufuku *Duplex"
+ UIConstraints "*PageSize Hagaki *Duplex"
+ UIConstraints "*PageSize Executive *Duplex"
+ UIConstraints "*PageSize FLSA *Duplex"
+ UIConstraints "*PageSize ExecutiveJIS *Duplex"
+ UIConstraints "*PageSize 16k *Duplex"
+ UIConstraints "*PageSize Card3x5 *Duplex"
+ UIConstraints "*PageSize Card5x8 *Duplex"
+ UIConstraints "*PageSize Env10 *Duplex"
+ UIConstraints "*PageSize EnvA2 *Duplex"
+ UIConstraints "*PageSize EnvC6 *Duplex"
+ UIConstraints "*PageSize EnvDL *Duplex"
+ UIConstraints "*PageSize EnvC5 *Duplex"
+ UIConstraints "*PageSize EnvB5 *Duplex"
+ UIConstraints "*PageSize EnvChou3 *Duplex"
+ UIConstraints "*PageSize EnvChou4 *Duplex"
+ UIConstraints "*PageSize EnvMonarch *Duplex"
+
+ Attribute "cupsModelName" "" "Officejet Pro K5400" // APDK device class
+
+ // Supported media sizes with no full bleed
+// 4x6 or smaller
+ CustomMedia "Card3x5/Index Card 3x5in" 216 360 9 9 9 9 "<</cupsInteger0 78/PageSize [216 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 78/PageSize[216 360]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki/Hagaki 100x148mm" 284 420 9 9 9 9 "<</cupsInteger0 71/PageSize[284 420]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/PageSize[284 420]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki.Duplex/Hagaki AutoDuplex 100x148mm" 284 411 9 27 9 36 "<</cupsInteger0 71/PageSize[284 411]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/PageSize[284 411]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6/Photo 4x6in" 288 432 9 9 9 9 "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6/A6 105x148mm" 297.36 419.76 9 9 9 9 "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6.Duplex/A6 AutoDuplex 105x148mm)" 297 411 9 27 9 36 "<</cupsInteger0 73/PageSize[297 411]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 73/PageSize[297 411]/ImagingBBox null>>setpagedevice"
+
+// 5x7
+ CustomMedia "Photo5x7/Photo 5x7in" 360 504 9 9 9 9 "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card5x8/Index Card 5x8in" 360 576 9 9 9 9 "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card5x8.Duplex/Index Card AutoDuplex 5x8in" 360 567 9 27 9 36 "<</cupsInteger0 75/PageSize[360 567]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 75/PageSize[360 567]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Oufuku/Oufuku-Hagaki 148x200mm" 567 420 9 9 9 9 "<</cupsInteger0 72/PageSize[567 420]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 72/PageSize[567 420]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Oufuku.Duplex/Oufuku-Hagaki AutoDuplex 148x200mm" 567 411 9 27 9 36 "<</cupsInteger0 72/PageSize[567 411]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 72/PageSize[567 411]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5/A5 148x210mm" 419.76 595.44 9 9 9 9 "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5.Duplex/A5 AutoDuplex 148x210mm" 420 586 9 27 9 36 "<</cupsInteger0 25/PageSize[420 586]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/PageSize[420 586]/ImagingBBox null>>setpagedevice"
+
+// Standard
+ CustomMedia "B5/B5 176x250mm" 498.96 708.48 9 9 9 9 "<</cupsInteger0 65/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 65/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ CustomMedia "B5.Duplex/B5 AutoDuplex 176x250mm" 499 699 9 27 9 36 "<</cupsInteger0 65/PageSize[499 699]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 65/PageSize[499 699]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5/JB5 182x257mm" 516.24 728.64 9 9 9 9 "<</cupsInteger0 45/PageSize[516.24 728.64]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 45/PageSize [516.24 728.64]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5.Duplex/JB5 AutoDuplex 182x257mm" 516 720 9 27 9 36 "<</cupsInteger0 45/PageSize[516 720]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 45/PageSize [516 720]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Executive/Executive 7.25x10.5in" 522 756 9 9 9 9 "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Executive.Duplex/Executive AutoDuplex 7.25x10.5in" 522 747 9 27 9 36 "<</cupsInteger0 1/PageSize[522 747]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[522 747]/ImagingBBox null>>setpagedevice"
+ CustomMedia "16k/16k 7.75x10.75in" 558 774 9 9 9 9 "<</cupsInteger0 101/PageSize[558 774]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[558 774]/ImagingBBox null>>setpagedevice" // custom
+ *CustomMedia "Letter/Letter 8.5x11in" 612 792 9 9 9 9 "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Letter.Duplex/Letter AutoDuplex 8.5x11in" 612 783 9 27 9 36 "<</cupsInteger0 2/PageSize[612 783]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/PageSize[612 783]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4/A4 210x297mm" 595.44 841.68 9 9 9 9 "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4.Duplex/A4 AutoDuplex 210x297mm" 595 833 9 27 9 36 "<</cupsInteger0 26/PageSize[595 833]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/PageSize[595 833]/ImagingBBox null>>setpagedevice"
+ CustomMedia "ExecutiveJIS/Executive (JIS) 8.5x12.986in" 612 936 9 9 9 9 "<</cupsInteger0 10/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 10/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ CustomMedia "FLSA/American Foolscap 8.5x13in" 612 936 9 9 9 9 "<</cupsInteger0 10/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 10/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Legal/Legal 8.5x14in" 612 1008 9 9 9 9 "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Legal.Duplex/Legal AutoDuplex 8.5x14in" 612 999 9 27 9 36 "<</cupsInteger0 3/PageSize[612 999]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 3/PageSize[612 999]/ImagingBBox null>>setpagedevice"
+
+// CDDVD
+ CustomMedia "CDDVD80/CD DVD 80mm" 238 238 4 4 4 4 "<</cupsInteger0 98/PageSize[238 238]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 98/PageSize[238 238]/ImagingBBox null>>setpagedevice"
+ CustomMedia "CDDVD120/CD DVD 120mm" 360 360 4 4 4 4 "<</cupsInteger0 99/PageSize[360 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 99/PageSize[360 360]/ImagingBBox null>>setpagedevice"
+
+// Envelope
+ CustomMedia "EnvA2/A2 Envelope 4.37x5.75in" 314.64 414 9 42 9 9 "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC6/C6 Envelope 114x162mm" 323.28 459.36 9 39 9 9 "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou4/#4 Japanese Envelope 90x205mm" 254.88 581.04 9 41 9 9 "<</cupsInteger0 111/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 111/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvMonarch/Monarch Envelope 3.875x7.5in" 279 540 9 41 9 9 "<</cupsInteger0 80/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 80/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvDL/DL Envelope 110x220mm" 311.76 623.52 9 41 9 9 "<</cupsInteger0 90/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 90/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Env10/#10 Envelope 4.12x9.5in" 297 684 9 41 9 9 "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou3/#3 Japanese Envelope 120x235mm" 339.84 666 9 41 9 9 "<</cupsInteger0 110/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 110/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC5/C5 Envelope 162x229mm" 459 649 9 41 9 9 "<</cupsInteger0 91/PageSize[459 649]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 91/PageSize[459 649]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvB5/B5 Envelope 176x250mm" 499 709 9 41 9 9 "<</cupsInteger0 100/PageSize[499 709]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 100/PageSize[499 709]/ImagingBBox null>>setpagedevice"
+
+ {
+ // Custom page sizes from 1x4in to Legal
+ HWMargins 9 36 9 36
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 8.5in 14in
+
+ // <%DJGenericVIP:NoFullBleed%>
+ {
+ ModelName "HP Business Inkjet 1000"
+ Attribute "NickName" "" "HP Business Inkjet 1000, $Version"
+ Attribute "ShortNickName" "" "HP Business Inkjet 1000"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp business inkjet 1000;DES:hp business inkjet 1000;"
+ PCFileName "hp-business_inkjet_1000.ppd"
+ Attribute "Product" "" "(HP Business Inkjet 1000 Printer)"
+ }
+ {
+ ModelName "HP Business Inkjet 1100"
+ Attribute "NickName" "" "HP Business Inkjet 1100, $Version"
+ Attribute "ShortNickName" "" "HP Business Inkjet 1100"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp business inkjet 1100;DES:hp business inkjet 1100;"
+ PCFileName "hp-business_inkjet_1100.ppd"
+ Attribute "Product" "" "(HP Business Inkjet 1100d Printer)"
+ Attribute "Product" "" "(HP Business Inkjet 1100dtn Printer)"
+ Attribute "Product" "" "(HP Business Inkjet 1100 Printer)"
+ }
+ {
+ ModelName "HP Business Inkjet 1200"
+ Attribute "NickName" "" "HP Business Inkjet 1200, $Version"
+ Attribute "ShortNickName" "" "HP Business Inkjet 1200"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:business inkjet 1200;DES:business inkjet 1200;"
+ PCFileName "hp-business_inkjet_1200.ppd"
+ Attribute "Product" "" "(HP Business Inkjet 1200dtn Printer)"
+ Attribute "Product" "" "(HP Business Inkjet 1200dn Printer)"
+ Attribute "Product" "" "(HP Business Inkjet 1200dtwn Printer)"
+ Attribute "Product" "" "(HP Business Inkjet 1200d Printer)"
+ Attribute "Product" "" "(HP Business Inkjet 1200 Printer)"
+ }
+ {
+ ModelName "HP Officejet Pro k5300"
+ Attribute "NickName" "" "HP Officejet Pro k5300, $Version"
+ Attribute "ShortNickName" "" "HP Officejet Pro k5300"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet pro k5300;DES:officejet pro k5300;"
+ PCFileName "hp-officejet_pro_k5300.ppd"
+ Attribute "Product" "" "(HP Officejet Pro k5300 Printer)"
+ }
+ {
+ ModelName "HP Officejet Pro k5400"
+ Attribute "NickName" "" "HP Officejet Pro k5400, $Version"
+ Attribute "ShortNickName" "" "HP Officejet Pro k5400"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet pro k5400;DES:officejet pro k5400;"
+ PCFileName "hp-officejet_pro_k5400.ppd"
+ Attribute "Product" "" "(HP Officejet Pro k5400dn Printer)"
+ Attribute "Product" "" "(HP Officejet Pro k5400dtn Printer)"
+ Attribute "Product" "" "(HP Officejet Pro k5400n Printer)"
+ Attribute "Product" "" "(HP Officejet Pro k5400 Printer)"
+ Attribute "Product" "" "(HP Officejet Pro k5400z Printer)"
+ }
+ // <%OJProKx50:NoFullBleed%>
+ {
+ ModelName "HP Officejet Pro k550"
+ Attribute "NickName" "" "HP Officejet Pro k550, $Version"
+ Attribute "ShortNickName" "" "HP Officejet Pro k550"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet pro k550;DES:officejet pro k550;"
+ PCFileName "hp-officejet_pro_k550.ppd"
+ Attribute "Product" "" "(HP Officejet Pro k550dtwn Printer)"
+ Attribute "Product" "" "(HP Officejet Pro k550dtn Printer)"
+ Attribute "Product" "" "(HP Officejet Pro k550 Printer)"
+ Attribute "Product" "" "(HP Officejet Pro k550xi Printer)"
+ }
+ {
+ ModelName "HP Officejet Pro l7300"
+ Attribute "NickName" "" "HP Officejet Pro l7300, $Version"
+ Attribute "ShortNickName" "" "HP Officejet Pro l7300"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet pro l7300;DES:officejet pro l7300;"
+ PCFileName "hp-officejet_pro_l7300.ppd"
+ Attribute "Product" "" "(HP Officejet Pro l7300 Series All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet Pro l7380 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet Pro l7400"
+ Attribute "NickName" "" "HP Officejet Pro l7400, $Version"
+ Attribute "ShortNickName" "" "HP Officejet Pro l7400"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet pro l7400;DES:officejet pro l7400;"
+ PCFileName "hp-officejet_pro_l7400.ppd"
+ Attribute "Product" "" "(HP Officejet Pro l7480 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet Pro l7500"
+ Attribute "NickName" "" "HP Officejet Pro l7500, $Version"
+ Attribute "ShortNickName" "" "HP Officejet Pro l7500"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet pro l7500;DES:officejet pro l7500;"
+ PCFileName "hp-officejet_pro_l7500.ppd"
+ Attribute "Product" "" "(HP Officejet Pro l7500 Series All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet Pro l7550 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet Pro l7555 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet Pro l7580 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet Pro l7590 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet Pro l7600"
+ Attribute "NickName" "" "HP Officejet Pro l7600, $Version"
+ Attribute "ShortNickName" "" "HP Officejet Pro l7600"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet pro l7600;DES:officejet pro l7600;"
+ PCFileName "hp-officejet_pro_l7600.ppd"
+ Attribute "Product" "" "(HP Officejet Pro l7600 Series All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet Pro l7650 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet Pro l7680 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet Pro l7681 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet Pro l7700"
+ Attribute "NickName" "" "HP Officejet Pro l7700, $Version"
+ Attribute "ShortNickName" "" "HP Officejet Pro l7700"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet pro l7700;DES:officejet pro l7700;"
+ PCFileName "hp-officejet_pro_l7700.ppd"
+ Attribute "Product" "" "(HP Officejet Pro l7700 Series All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet Pro l7710 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet Pro l7750 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet Pro l7780 All-in-one Printer)"
+ }
+
+ } // End Supported media sizes with no full bleed.
+
+ {
+ // Large format
+ UIConstraints "*PageSize A3 *Duplex"
+ UIConstraints "*PageSize B4 *Duplex"
+ UIConstraints "*PageSize Ledger *Duplex"
+ UIConstraints "*PageSize SuperB *Duplex"
+ UIConstraints "*PageSize 8k *Duplex"
+
+ // Large format media sizes with no full bleed.
+// Large
+ CustomMedia "SuperB/SuperB 13x19in" 936 1368 18 36 18 9 "<</cupsInteger0 16/PageSize[936 1368]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 16/PageSize[936 1368]/ImagingBBox null>>setpagedevice"
+ CustomMedia "B4/B4 257x364mm" 729 1033 18 36 18 9 "<</cupsInteger0 46/PageSize[729 1033]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 46/PageSize[729 1033]/ImagingBBox null>>setpagedevice"
+ CustomMedia "B4.Duplex/B4 AutoDuplex 257x364mm" 729 1024 18 27 18 36 "<</cupsInteger0 1/PageSize[729 1024]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[729 1024]/ImagingBBox null>>setpagedevice"
+ CustomMedia "8k/8k 10.75x15.5in" 774 1116 18 36 18 9 "<</cupsInteger0 101/PageSize[774 1116]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[774 1116]/ImagingBBox null>>setpagedevice" // custom
+ CustomMedia "Ledger/Ledger 11x17in" 792 1224 18 36 18 9 "<</cupsInteger0 6/PageSize[792 1224]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 6/PageSize[792 1224]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A3/A3 297x420mm" 842 1190 18 36 18 9 "<</cupsInteger0 27/PageSize[842 1190]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 27/PageSize[842 1190]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A3.Duplex/A3 AutoDuplex 297x420mm" 842 1181 18 27 18 36 "<</cupsInteger0 1/PageSize[842 1181]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[842 1181]/ImagingBBox null>>setpagedevice"
+
+ // Custom page sizes from 1x4in to SuperB
+ HWMargins 9 36 9 36
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 936 1368
+
+ // <%DJGenericVIP:LargeFormatSuperB:NoFullBleed%>
+ {
+ ModelName "HP Officejet Pro k8600"
+ Attribute "NickName" "" "HP Officejet Pro k8600, $Version"
+ Attribute "ShortNickName" "" "HP Officejet Pro k8600"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet pro k8600;DES:officejet pro k8600;"
+ PCFileName "hp-officejet_pro_k8600.ppd"
+ Attribute "Product" "" "(HP Officejet Pro k8600 Color Printer)"
+ Attribute "Product" "" "(HP Officejet Pro k8600dn Color Printer)"
+ }
+ // <%OJProKx50:LargeFormatSuperB:NoFullBleed%>
+ {
+ ModelName "HP Officejet Pro k850"
+ Attribute "NickName" "" "HP Officejet Pro k850, $Version"
+ Attribute "ShortNickName" "" "HP Officejet Pro k850"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet pro k850;DES:officejet pro k850;"
+ PCFileName "hp-officejet_pro_k850.ppd"
+ Attribute "Product" "" "(HP Officejet Pro k850 Printer)"
+ Attribute "Product" "" "(HP Officejet Pro k850dn Printer)"
+ }
+
+ } // End Large format media sizes no full bleed.
+
+} // End OJProKx50 and DJGenericVIP with no fullbleed
+
+///////////////// DJ3320
+{
+ Attribute "hpPrinterLanguage" "" "lidil"
+ Attribute "hpPrinterPlatform" "" "dj3320"
+ Attribute "HPMechOffset" "" "70"
+
+ Group "General/General"
+
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 10.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "<</Duplex true/Tumble false>>setpagedevice"
+ Choice "DuplexTumble/Short Edge (Flip)" "<</Duplex true/Tumble true>>setpagedevice"
+ *Choice "None/Off" "<</Duplex false/Tumble false>>setpagedevice"
+
+ // MediaPosition values map to MediaSource enumeration in global_types.h
+ Option "InputSlot/Media Source" PickOne AnySetup 10.0
+ *Choice "Auto/Auto-Select" "<</MediaPosition 7>>setpagedevice"
+ Choice "PhotoTray/Photo Tray" "<</MediaPosition 6>>setpagedevice"
+ Choice "Upper/Upper Tray" "<</MediaPosition 1>>setpagedevice"
+ Choice "Lower/Lower Tray" "<</MediaPosition 4>>setpagedevice"
+ Choice "Envelope/Envelope Feeder" "<</MediaPosition 3>>setpagedevice"
+ Choice "LargeCapacity/Large Capacity Tray" "<</MediaPosition 5>>setpagedevice"
+ Choice "Manual/Manual Feeder" "<</MediaPosition 2>>setpagedevice"
+ Choice "MPTray/Multi Purpose Tray" "<</MediaPosition 1>>setpagedevice"
+
+ // cupsMediaType values map to MEDIATYPE from global_types.h
+ Option "MediaType/Media Type" PickOne AnySetup 10.0
+ *Choice "Plain/Plain Paper" "<</MediaType(Plain)/cupsMediaType 0>>setpagedevice"
+ Choice "Glossy/Photo Paper" "<</MediaType(Glossy)/cupsMediaType 3>>setpagedevice"
+
+// cupsCompression values map to QUALITY_MODE from global_types.h
+ Option "OutputMode/Print Quality" PickOne AnySetup 10.0
+ *Choice "NormalRGB/Normal Color" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 1/OutputType(0)/cupsInteger2 0/HWResolution[600 600]>>setpagedevice"
+ Choice "NormalGray/Normal Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 2/OutputType(0)/cupsInteger2 1/HWResolution[600 600]>>setpagedevice"
+ Choice "DraftRGB/Draft Color" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 0/OutputType(-1)/cupsInteger2 2/HWResolution[300 300]>>setpagedevice"
+ Choice "DraftGray/Draft Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 2/OutputType(-1)/cupsInteger2 3/HWResolution[300 300]>>setpagedevice"
+ Choice "Photo/High-Resolution Photo" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 0/OutputType(2)/cupsInteger2 4/HWResolution[600 600]>>setpagedevice"
+
+
+ // Installed Cartridge: Only For Lidil Devices.
+ Option "InstalledCartridge/Installed Cartridges" PickOne AnySetup 10.0
+ Choice "BlackColorOnly/Black Only" "<</cupsInteger1 0>>setpagedevice"
+ Choice "TriColorOnly/TriColor Only" "<</cupsInteger1 1>>setpagedevice"
+ Choice "PhotoColorOnly/Photo Only" "<</cupsInteger1 2>>setpagedevice"
+ *Choice "BlackAndTriColor/Black and TriColor" "<</cupsInteger1 3>>setpagedevice"
+ Choice "PhotoAndColor/Photo and TriColor" "<</cupsInteger1 4>>setpagedevice"
+
+
+ // Duplexer is optional...
+ Installable "OptionDuplex/Duplexer Installed"
+
+ // Constraints
+ UIConstraints "*Duplex *OptionDuplex False"
+ UIConstraints "*MediaType Glossy *OutputMode DraftRGB"
+ UIConstraints "*MediaType Glossy *OutputMode DraftGray"
+ UIConstraints "*MediaType Plain *OutputMode Photo"
+
+ Attribute "cupsModelName" "" "deskjet 3320" // APDK device class
+
+ {
+// 4x6 or smaller
+ CustomMedia "Card3x5/Index Card 3x5in" 216 360 18.00 36.00 18.00 9.00 "<</cupsInteger0 78/PageSize [216 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 78/PageSize[216 360]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki/Hagaki 100x148mm" 284 420 9.00 36.00 9.00 9.00 "<</cupsInteger0 71/PageSize[284 420]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/PageSize[284 420]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6/Photo 4x6in" 288 432 9.00 36.00 9.00 9.00 "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6/A6 105x148mm" 297.36 419.76 9.00 36.00 9.00 9.00 "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+
+// 5x7
+ CustomMedia "Photo5x7/Photo 5x7in" 360 504 9.00 36.00 9.00 9.00 "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card5x8/Index Card 5x8in" 360 576 18.00 36.00 18.00 9.00 "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Oufuku/Oufuku-Hagaki 148x200mm" 567 420 18.00 36.00 18.00 9.00 "<</cupsInteger0 72/PageSize[567 420]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 72/PageSize[567 420]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5/A5 148x210mm" 419.76 595.44 9.00 36.00 9.00 9.00 "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+
+// Standard
+ CustomMedia "B5/B5 176x250mm" 498.96 708.48 18 36 18 9 "<</cupsInteger0 65/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 65/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5/JB5 182x257mm" 516.24 728.64 18 36 18 9 "<</cupsInteger0 45/PageSize[516.24 728.64]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 45/PageSize [516.24 728.64]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Executive/Executive 7.25x10.5in" 522 756 18.00 36.00 18.00 9.00 "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ CustomMedia "16k/16k 7.75x10.75in" 558 774 18 36 18 9 "<</cupsInteger0 101/PageSize[558 774]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[558 774]/ImagingBBox null>>setpagedevice" // custom
+ *CustomMedia "Letter/Letter 8.5x11in" 612 792 18 36 18 9 "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4/A4 210x297mm" 595.44 841.68 9.72 36.00 9.72 9.00 "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ CustomMedia "ExecutiveJIS/Executive (JIS) 8.5x12.986in" 612 936 18 36 18 9 "<</cupsInteger0 10/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 10/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ CustomMedia "FLSA/American Foolscap 8.5x13in" 612 936 18.00 36.00 18.00 9.00 "<</cupsInteger0 10/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 10/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Legal/Legal 8.5x14in" 612 1008 18.00 36.00 18.00 9.00 "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+
+// Envelope
+ CustomMedia "EnvA2/A2 Envelope 4.37x5.75in" 314.64 414 18.00 36.00 18.00 9.00 "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC6/C6 Envelope 114x162mm" 323.28 459.36 18.00 36.00 18.00 9.00 "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou4/#4 Japanese Envelope 90x205mm" 254.88 581.04 18.00 36.00 18.00 9.00 "<</cupsInteger0 111/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 111/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvMonarch/Monarch Envelope 3.875x7.5in" 279 540 18.00 36.00 18.00 9.00 "<</cupsInteger0 80/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 80/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvDL/DL Envelope 110x220mm" 311.76 623.52 18.00 36.00 18.00 9.00 "<</cupsInteger0 90/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 90/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Env10/#10 Envelope 4.12x9.5in" 297 684 18.00 36.00 18.00 9.00 "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou3/#3 Japanese Envelope 120x235mm" 339.84 666 18.00 36.00 18.00 9.00 "<</cupsInteger0 110/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 110/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC5/C5 Envelope 162x229mm" 459 649 18.00 36.00 18.00 9.00 "<</cupsInteger0 91/PageSize[459 649]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 91/PageSize[459 649]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvB5/B5 Envelope 176x250mm" 499 709 18.00 36.00 18.00 9.00 "<</cupsInteger0 100/PageSize[499 709]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 100/PageSize[499 709]/ImagingBBox null>>setpagedevice"
+
+ // Custom page sizes from 1x4in to Legal
+ HWMargins 18 36 18 36
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 8.5in 14in
+
+ // <%DJ3320:Normal%>
+ {
+ ModelName "HP PSC 1000 Series"
+ Attribute "NickName" "" "HP PSC 1000 Series, $Version"
+ Attribute "ShortNickName" "" "HP PSC 1000 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:psc 1000 series;DES:psc 1000 series;"
+ PCFileName "hp-psc_1000_series.ppd"
+ Attribute "Product" "" "(HP PSC 1110 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1110v All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1118 All-in-one Printer)"
+ }
+ {
+ ModelName "HP PSC 1100 Series"
+ Attribute "NickName" "" "HP PSC 1100 Series, $Version"
+ Attribute "ShortNickName" "" "HP PSC 1100 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:psc 1100 series;DES:psc 1100 series;"
+ PCFileName "hp-psc_1100_series.ppd"
+ Attribute "Product" "" "(HP PSC 1110 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1110v All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1118 All-in-one Printer)"
+ }
+ {
+ ModelName "HP PSC 1200 Series"
+ Attribute "NickName" "" "HP PSC 1200 Series, $Version"
+ Attribute "ShortNickName" "" "HP PSC 1200 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:psc 1200 series;DES:psc 1200 series;"
+ PCFileName "hp-psc_1200_series.ppd"
+ Attribute "Product" "" "(HP PSC 1200 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1205 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1209 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1210 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1210xi All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1210v All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1213 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1215 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1216 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1217 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1218 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1219 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Deskjet d1300 Series"
+ Attribute "NickName" "" "HP Deskjet d1300 Series, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet d1300 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet d1300 series;DES:deskjet d1300 series;"
+ PCFileName "hp-deskjet_d1300_series.ppd"
+ Attribute "Product" "" "(HP Deskjet d1311 Printer)"
+ Attribute "Product" "" "(HP Deskjet d1320 Printer)"
+ Attribute "Product" "" "(HP Deskjet d1330 Printer)"
+ Attribute "Product" "" "(HP Deskjet d1341 Printer)"
+ Attribute "Product" "" "(HP Deskjet d1360 Printer)"
+ Attribute "Product" "" "(HP Deskjet d1368 Printer)"
+ }
+ {
+ ModelName "HP Deskjet d1400 Series"
+ Attribute "NickName" "" "HP Deskjet d1400 Series, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet d1400 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet d1400 series;DES:deskjet d1400 series;"
+ PCFileName "hp-deskjet_d1400_series.ppd"
+ Attribute "Product" "" "(HP Deskjet d1415 Printer)"
+ Attribute "Product" "" "(HP Deskjet d1420 Printer)"
+ Attribute "Product" "" "(HP Deskjet d1430 Printer)"
+ Attribute "Product" "" "(HP Deskjet d1445 Printer)"
+ Attribute "Product" "" "(HP Deskjet d1455 Printer)"
+ Attribute "Product" "" "(HP Deskjet d1460 Printer)"
+ Attribute "Product" "" "(HP Deskjet d1468 Printer)"
+ Attribute "Product" "" "(HP Deskjet d1470 Printer)"
+ }
+ {
+ ModelName "HP Deskjet d1500 Series"
+ Attribute "NickName" "" "HP Deskjet d1500 Series, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet d1500 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet d1500 series;DES:deskjet d1500 series;"
+ PCFileName "hp-deskjet_d1500_series.ppd"
+ Attribute "Product" "" "(HP Deskjet d1520 Printer)"
+ Attribute "Product" "" "(HP Deskjet d1530 Printer)"
+ Attribute "Product" "" "(HP Deskjet d1550 Printer)"
+ Attribute "Product" "" "(HP Deskjet d1555 Printer)"
+ Attribute "Product" "" "(HP Deskjet d1558 Printer)"
+ Attribute "Product" "" "(HP Deskjet d1560 Printer)"
+ Attribute "Product" "" "(HP Deskjet d1568 Printer)"
+ }
+ {
+ ModelName "HP Deskjet f2100 Series"
+ Attribute "NickName" "" "HP Deskjet f2100 Series, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet f2100 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet f2100 series;DES:deskjet f2100 series;"
+ PCFileName "hp-deskjet_f2100_series.ppd"
+ Attribute "Product" "" "(HP Deskjet f2110 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f2120 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f2128 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f2140 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f2179 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f2180 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f2185 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f2187 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f2188 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Deskjet f2200 Series"
+ Attribute "NickName" "" "HP Deskjet f2200 Series, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet f2200 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet f2200 series;DES:deskjet f2200 series;"
+ PCFileName "hp-deskjet_f2200_series.ppd"
+ Attribute "Product" "" "(HP Deskjet f2210 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f2212 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f2214 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f2224 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f2235 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f2238 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f2240 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f2250 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f2275 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f2276 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f2280 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f2288 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f2290 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Deskjet 3320"
+ Attribute "NickName" "" "HP Deskjet 3320, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 3320"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 3320;DES:deskjet 3320;"
+ PCFileName "hp-deskjet_3320.ppd"
+ Attribute "Product" "" "(HP Deskjet 3320v Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3320 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3322 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3323 Color Inkjet Printer)"
+ }
+ {
+ ModelName "HP Deskjet 3325"
+ Attribute "NickName" "" "HP Deskjet 3325, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 3325"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 3325;DES:deskjet 3325;"
+ PCFileName "hp-deskjet_3325.ppd"
+ Attribute "Product" "" "(HP Deskjet 3325 Printer/scanjet 3530c)"
+ }
+ {
+ ModelName "HP Deskjet 3500"
+ Attribute "NickName" "" "HP Deskjet 3500, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 3500"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 3500;DES:deskjet 3500;"
+ PCFileName "hp-deskjet_3500.ppd"
+ Attribute "Product" "" "(HP Deskjet 3500 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3520w Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3520 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3520v Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3535 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3538 Color Inkjet Printer)"
+ }
+ {
+ ModelName "HP Deskjet 3550"
+ Attribute "NickName" "" "HP Deskjet 3550, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 3550"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 3550;DES:deskjet 3550;"
+ PCFileName "hp-deskjet_3550.ppd"
+ Attribute "Product" "" "(HP Deskjet 3550 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3550v Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3550w Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3558 Color Inkjet Printer)"
+ }
+ {
+ ModelName "HP Deskjet 3740"
+ Attribute "NickName" "" "HP Deskjet 3740, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 3740"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 3740;DES:deskjet 3740;"
+ PCFileName "hp-deskjet_3740.ppd"
+ Attribute "Product" "" "(HP Deskjet 3740 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3743 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3744 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3745 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3745v Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3747 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3748 Color Inkjet Printer)"
+ }
+ {
+ ModelName "HP Deskjet 3900"
+ Attribute "NickName" "" "HP Deskjet 3900, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 3900"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 3900;DES:deskjet 3900;"
+ PCFileName "hp-deskjet_3900.ppd"
+ Attribute "Product" "" "(HP Deskjet 3900 Color Inkjet Printer)"
+ }
+ {
+ ModelName "HP Deskjet 3910"
+ Attribute "NickName" "" "HP Deskjet 3910, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 3910"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 3910;DES:deskjet 3910;"
+ PCFileName "hp-deskjet_3910.ppd"
+ Attribute "Product" "" "(HP Deskjet 3910 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3915 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3918 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3930v Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3930 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3938 Color Inkjet Printer)"
+ }
+ {
+ ModelName "HP Deskjet 3920"
+ Attribute "NickName" "" "HP Deskjet 3920, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 3920"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 3920;DES:deskjet 3920;"
+ PCFileName "hp-deskjet_3920.ppd"
+ Attribute "Product" "" "(HP Deskjet 3920 Color Inkjet Printer)"
+ }
+ {
+ ModelName "HP Deskjet 3940"
+ Attribute "NickName" "" "HP Deskjet 3940, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 3940"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 3940;DES:deskjet 3940;"
+ PCFileName "hp-deskjet_3940.ppd"
+ Attribute "Product" "" "(HP Deskjet 3940 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3940v Color Inkjet Printer)"
+ }
+ {
+ ModelName "HP Officejet 4100 Series"
+ Attribute "NickName" "" "HP Officejet 4100 Series, $Version"
+ Attribute "ShortNickName" "" "HP Officejet 4100 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet 4100 series;DES:officejet 4100 series;"
+ PCFileName "hp-officejet_4100_series.ppd"
+ Attribute "Product" "" "(HP Officejet 4100 Series All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 4110xi All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 4110 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 4110v All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet 4105"
+ Attribute "NickName" "" "HP Officejet 4105, $Version"
+ Attribute "ShortNickName" "" "HP Officejet 4105"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet 4105;DES:officejet 4105;"
+ PCFileName "hp-officejet_4105.ppd"
+ Attribute "Product" "" "(HP Officejet 4105 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet 4115 Series"
+ Attribute "NickName" "" "HP Officejet 4115 Series, $Version"
+ Attribute "ShortNickName" "" "HP Officejet 4115 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet 4115 series;DES:officejet 4115 series;"
+ PCFileName "hp-officejet_4115_series.ppd"
+ Attribute "Product" "" "(HP Officejet 4115 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet 4300 Series"
+ Attribute "NickName" "" "HP Officejet 4300 Series, $Version"
+ Attribute "ShortNickName" "" "HP Officejet 4300 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet 4300 series;DES:officejet 4300 series;"
+ PCFileName "hp-officejet_4300_series.ppd"
+ Attribute "Product" "" "(HP Officejet 4308 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 4311 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 4312 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 4314 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 4315 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 4315v All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 4315xi All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 4317 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 4319 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 4338 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 4352 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 4353 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 4355 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 4357 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 4359 All-in-one Printer)"
+ }
+
+ {
+ CustomMedia "3425-Cover/Cover for HP DeskJet 3425 8.5x15.5in" 612 1116 18 36 18 9 "<</cupsInteger0 78/PageSize[612 1116]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 78/PageSize[612 1116]/ImagingBBox null>>setpagedevice"
+ // <%DJ3320:CoverMedia%>
+ {
+ ModelName "HP Deskjet 3420"
+ Attribute "NickName" "" "HP Deskjet 3420, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 3420"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 3420;DES:deskjet 3420;"
+ PCFileName "hp-deskjet_3420.ppd"
+ Attribute "Product" "" "(HP Deskjet 3420 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3420v Color Inkjet Printer)"
+ }
+ {
+ ModelName "HP Deskjet 3425"
+ Attribute "NickName" "" "HP Deskjet 3425, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 3425"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 3425;DES:deskjet 3425;"
+ PCFileName "hp-deskjet_3425.ppd"
+ Attribute "Product" "" "(HP Deskjet 3425 Printer)"
+ }
+ {
+ ModelName "HP Deskjet 3450"
+ Attribute "NickName" "" "HP Deskjet 3450, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 3450"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 3450;DES:deskjet 3450;"
+ PCFileName "hp-deskjet_3450.ppd"
+ Attribute "Product" "" "(HP Deskjet 3450 Color Inkjet Printer)"
+ }
+ }
+ } // End Supported media sizes.
+} // End DJ3320
+
+//////////////////////// DJ3600
+{
+ Attribute "hpPrinterLanguage" "" "lidil"
+ Attribute "hpPrinterPlatform" "" "dj3600"
+ Attribute "HPMechOffset" "" "70"
+
+ Group "General/General"
+
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 10.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "<</Duplex true/Tumble false>>setpagedevice"
+ Choice "DuplexTumble/Short Edge (Flip)" "<</Duplex true/Tumble true>>setpagedevice"
+ *Choice "None/Off" "<</Duplex false/Tumble false>>setpagedevice"
+
+ // MediaPosition values map to MediaSource enumeration in global_types.h
+ Option "InputSlot/Media Source" PickOne AnySetup 10.0
+ *Choice "Auto/Auto-Select" "<</MediaPosition 7>>setpagedevice"
+ Choice "PhotoTray/Photo Tray" "<</MediaPosition 6>>setpagedevice"
+ Choice "Upper/Upper Tray" "<</MediaPosition 1>>setpagedevice"
+ Choice "Lower/Lower Tray" "<</MediaPosition 4>>setpagedevice"
+ Choice "Envelope/Envelope Feeder" "<</MediaPosition 3>>setpagedevice"
+ Choice "LargeCapacity/Large Capacity Tray" "<</MediaPosition 5>>setpagedevice"
+ Choice "Manual/Manual Feeder" "<</MediaPosition 2>>setpagedevice"
+ Choice "MPTray/Multi Purpose Tray" "<</MediaPosition 1>>setpagedevice"
+
+ // cupsMediaType values map to MEDIATYPE from global_types.h
+ Option "MediaType/Media Type" PickOne AnySetup 10.0
+ *Choice "Plain/Plain Paper" "<</MediaType(Plain)/cupsMediaType 0>>setpagedevice"
+ Choice "Glossy/Photo Paper" "<</MediaType(Glossy)/cupsMediaType 3>>setpagedevice"
+
+// cupsCompression values map to QUALITY_MODE from global_types.h
+ Option "OutputMode/Print Quality" PickOne AnySetup 10.0
+ *Choice "NormalRGB/Normal Color" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 1/OutputType(0)/cupsInteger2 0/HWResolution[600 600]>>setpagedevice"
+ Choice "NormalGray/Normal Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 2/OutputType(0)/cupsInteger2 1/HWResolution[600 600]>>setpagedevice"
+ Choice "DraftRGB/Draft Color" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 0/OutputType(-1)/cupsInteger2 2/HWResolution[300 300]>>setpagedevice"
+ Choice "DraftGray/Draft Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 2/OutputType(-1)/cupsInteger2 3/HWResolution[300 300]>>setpagedevice"
+ Choice "Photo/High-Resolution Photo" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 0/OutputType(2)/cupsInteger2 4/HWResolution[600 600]>>setpagedevice"
+
+
+ // Installed Cartridge: Only For Lidil Devices.
+ Option "InstalledCartridge/Installed Cartridges" PickOne AnySetup 10.0
+ Choice "BlackColorOnly/Black Only" "<</cupsInteger1 0>>setpagedevice"
+ Choice "TriColorOnly/TriColor Only" "<</cupsInteger1 1>>setpagedevice"
+ Choice "PhotoColorOnly/Photo Only" "<</cupsInteger1 2>>setpagedevice"
+ *Choice "BlackAndTriColor/Black and TriColor" "<</cupsInteger1 3>>setpagedevice"
+ Choice "PhotoAndColor/Photo and TriColor" "<</cupsInteger1 4>>setpagedevice"
+
+
+ // Duplexer is optional...
+ Installable "OptionDuplex/Duplexer Installed"
+
+ // Constraints
+ UIConstraints "*Duplex *OptionDuplex False"
+ UIConstraints "*MediaType Glossy *OutputMode DraftRGB"
+ UIConstraints "*MediaType Glossy *OutputMode DraftGray"
+ UIConstraints "*MediaType Plain *OutputMode Photo"
+
+ Attribute "cupsModelName" "" "deskjet 3600" // APDK device class
+
+ {
+// 4x6 or smaller
+ CustomMedia "Card3x5/Index Card 3x5in" 216 360 18.00 36.00 18.00 9.00 "<</cupsInteger0 78/PageSize [216 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 78/PageSize[216 360]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki/Hagaki 100x148mm" 284 420 9.00 36.00 9.00 9.00 "<</cupsInteger0 71/PageSize[284 420]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/PageSize[284 420]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki.FB/Hagaki Borderless 100x148mm" 294 430 0 0 0 0 "<</cupsInteger0 71/PageSize[294 430]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/PageSize[294 430]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6/Photo 4x6in" 288 432 9.00 36.00 9.00 9.00 "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6.FB/Photo Borderless 4x6 in" 298 442 0 0 0 0 "<</cupsInteger0 74/PageSize[298 442]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[298 442]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6/A6 105x148mm" 297.36 419.76 9.00 36.00 9.00 9.00 "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+
+// 5x7
+ CustomMedia "Photo5x7/Photo 5x7in" 360 504 9.00 36.00 9.00 9.00 "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card5x8/Index Card 5x8in" 360 576 18.00 36.00 18.00 9.00 "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Oufuku/Oufuku-Hagaki 148x200mm" 567 420 18.00 36.00 18.00 9.00 "<</cupsInteger0 72/PageSize[567 420]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 72/PageSize[567 420]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5/A5 148x210mm" 419.76 595.44 9.00 36.00 9.00 9.00 "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+
+// Standard
+ CustomMedia "B5/B5 176x250mm" 498.96 708.48 18.00 36.00 18.00 9.00 "<</cupsInteger0 65/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 65/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5/JB5 182x257mm" 516.24 728.64 18 36 18 9 "<</cupsInteger0 45/PageSize[516.24 728.64]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 45/PageSize [516.24 728.64]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Executive/Executive 7.25x10.5in" 522 756 18 36 18 9 "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ CustomMedia "16k/16k 7.75x10.75in" 558 774 18 36 18 9 "<</cupsInteger0 101/PageSize[558 774]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[558 774]/ImagingBBox null>>setpagedevice" // custom
+ *CustomMedia "Letter/Letter 8.5x11in" 612 792 18 36 18 9 "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4/A4 210x297mm" 595.44 841.68 9.72 36.00 9.72 9.00 "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ CustomMedia "ExecutiveJIS/Executive (JIS) 8.5x12.986in" 612 936 18 36 18 9 "<</cupsInteger0 10/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 10/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ CustomMedia "FLSA/American Foolscap 8.5x13in" 612 936 18 36 18 9 "<</cupsInteger0 10/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 10/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Legal/Legal 8.5x14in" 612 1008 18 36 18 9 "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+
+// Envelope
+ CustomMedia "EnvA2/A2 Envelope 4.37x5.75in" 314.64 414 9 42 9 9 "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC6/C6 Envelope 114x162mm" 323.28 459.36 18.00 36.00 18.00 9.00 "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou4/#4 Japanese Envelope 90x205mm" 254.88 581.04 9 41 9 9 "<</cupsInteger0 111/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 111/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvMonarch/Monarch Envelope 3.875x7.5in" 279 540 18.00 36.00 18.00 9.00 "<</cupsInteger0 80/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 80/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvDL/DL Envelope 110x220mm" 311.76 623.52 18.00 36.00 18.00 9.00 "<</cupsInteger0 90/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 90/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Env10/#10 Envelope 4.12x9.5in" 297 684 18.00 36.00 18.00 9.00 "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou3/#3 Japanese Envelope 120x235mm" 339.84 666 9 41 9 9 "<</cupsInteger0 110/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 110/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC5/C5 Envelope 162x229mm" 459 649 18.00 36.00 18.00 9.00 "<</cupsInteger0 91/PageSize[459 649]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 91/PageSize[459 649]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvB5/B5 Envelope 176x250mm" 499 709 18.00 36.00 18.00 9.00 "<</cupsInteger0 100/PageSize[499 709]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 100/PageSize[499 709]/ImagingBBox null>>setpagedevice"
+
+ // Custom page sizes from 1x4in to Legal
+ HWMargins 9 36 9 36
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 8.5in 14in
+
+ // <%DJ3600:Normal%>
+ {
+ ModelName "HP Deskjet f300 Series"
+ Attribute "NickName" "" "HP Deskjet f300 Series, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet f300 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet f300 series;DES:deskjet f300 series;"
+ PCFileName "hp-deskjet_f300_series.ppd"
+ Attribute "Product" "" "(HP Deskjet f310 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f325 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f335 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f340 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f350 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f370 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f375 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f378 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f379 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f380 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f385 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f388 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f390 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f394 All-in-one Printer)"
+ }
+ {
+ ModelName "HP 910"
+ Attribute "NickName" "" "HP 910, $Version"
+ Attribute "ShortNickName" "" "HP 910"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp 910;DES:hp 910;"
+ PCFileName "hp-910.ppd"
+ Attribute "Product" "" "(HP 910 Printer)"
+ }
+ {
+ ModelName "HP 915"
+ Attribute "NickName" "" "HP 915, $Version"
+ Attribute "ShortNickName" "" "HP 915"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp 915;DES:hp 915;"
+ PCFileName "hp-915.ppd"
+ Attribute "Product" "" "(HP 915 Inkjet All-in-one Printer)"
+ }
+ {
+ ModelName "HP PSC 1300 Series"
+ Attribute "NickName" "" "HP PSC 1300 Series, $Version"
+ Attribute "ShortNickName" "" "HP PSC 1300 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:psc 1300 series;DES:psc 1300 series;"
+ PCFileName "hp-psc_1300_series.ppd"
+ Attribute "Product" "" "(HP PSC 1300 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1340 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1345 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1350 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1350xi All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1350v All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1355 All-in-one Printer)"
+ }
+ {
+ ModelName "HP PSC 1310 Series"
+ Attribute "NickName" "" "HP PSC 1310 Series, $Version"
+ Attribute "ShortNickName" "" "HP PSC 1310 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:psc 1310 series;DES:psc 1310 series;"
+ PCFileName "hp-psc_1310_series.ppd"
+ Attribute "Product" "" "(HP PSC 1310 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1311 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1312 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1315 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1315xi All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1315v All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1315s All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1317 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1318 All-in-one Printer)"
+ }
+ {
+ ModelName "HP PSC 1358 Series"
+ Attribute "NickName" "" "HP PSC 1358 Series, $Version"
+ Attribute "ShortNickName" "" "HP PSC 1358 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:psc 1358 series;DES:psc 1358 series;"
+ PCFileName "hp-psc_1358_series.ppd"
+ Attribute "Product" "" "(HP PSC 1300 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1340 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1350v All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1350xi All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1350 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1355 All-in-one Printer)"
+ }
+ {
+ ModelName "HP PSC 1400 Series"
+ Attribute "NickName" "" "HP PSC 1400 Series, $Version"
+ Attribute "ShortNickName" "" "HP PSC 1400 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:psc 1400 series;DES:psc 1400 series;"
+ PCFileName "hp-psc_1400_series.ppd"
+ Attribute "Product" "" "(HP PSC 1401 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1402 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1403 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1406 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1408 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1410 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1410v All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1410xi All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1415 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1417 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Deskjet d2300 Series"
+ Attribute "NickName" "" "HP Deskjet d2300 Series, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet d2300 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet d2300 series;DES:deskjet d2300 series;"
+ PCFileName "hp-deskjet_d2300_series.ppd"
+ Attribute "Product" "" "(HP Deskjet d2320 Printer)"
+ Attribute "Product" "" "(HP Deskjet d2330 Printer)"
+ Attribute "Product" "" "(HP Deskjet d2345 Printer)"
+ Attribute "Product" "" "(HP Deskjet d2360 Printer)"
+ Attribute "Product" "" "(HP Deskjet d2368 Printer)"
+ }
+ {
+ ModelName "HP Deskjet d2400 Series"
+ Attribute "NickName" "" "HP Deskjet d2400 Series, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet d2400 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet d2400 series;DES:deskjet d2400 series;"
+ PCFileName "hp-deskjet_d2400_series.ppd"
+ Attribute "Product" "" "(HP Deskjet d2430 Printer)"
+ Attribute "Product" "" "(HP Deskjet d2445 Printer)"
+ Attribute "Product" "" "(HP Deskjet d2460 Printer)"
+ Attribute "Product" "" "(HP Deskjet d2466 Printer)"
+ Attribute "Product" "" "(HP Deskjet d2468 Printer)"
+ Attribute "Product" "" "(HP Deskjet d4263 Printer)"
+ }
+ {
+ ModelName "HP Officejet j3500 Series"
+ Attribute "NickName" "" "HP Officejet j3500 Series, $Version"
+ Attribute "ShortNickName" "" "HP Officejet j3500 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet j3500 series;DES:officejet j3500 series;"
+ PCFileName "hp-officejet_j3500_series.ppd"
+ Attribute "Product" "" "(HP Officejet j3508 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet j3600 Series"
+ Attribute "NickName" "" "HP Officejet j3600 Series, $Version"
+ Attribute "ShortNickName" "" "HP Officejet j3600 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet j3600 series;DES:officejet j3600 series;"
+ PCFileName "hp-officejet_j3600_series.ppd"
+ Attribute "Product" "" "(HP Officejet j3608 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet j3625 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet j3635 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet j3640 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet j3650 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet j3680 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Deskjet 3600"
+ Attribute "NickName" "" "HP Deskjet 3600, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 3600"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 3600;DES:deskjet 3600;"
+ PCFileName "hp-deskjet_3600.ppd"
+ Attribute "Product" "" "(HP Deskjet 3600 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3620 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3645 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3647 Color Inkjet Printer)"
+ }
+ {
+ ModelName "HP Deskjet 3650"
+ Attribute "NickName" "" "HP Deskjet 3650, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 3650"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 3650;DES:deskjet 3650;"
+ PCFileName "hp-deskjet_3650.ppd"
+ Attribute "Product" "" "(HP Deskjet 3620 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3645 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3647 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3650 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3651 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3652 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3653 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3658 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3668 Color Inkjet Printer)"
+ }
+ {
+ ModelName "HP Deskjet 3840"
+ Attribute "NickName" "" "HP Deskjet 3840, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 3840"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 3840;DES:deskjet 3840;"
+ PCFileName "hp-deskjet_3840.ppd"
+ Attribute "Product" "" "(HP Deskjet 3843 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3844 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3845xi Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3845 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3847 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3848 Color Inkjet Printer)"
+ }
+ {
+ ModelName "HP Deskjet f4100 Series"
+ Attribute "NickName" "" "HP Deskjet f4100 Series, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet f4100 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet f4100 series;DES:deskjet f4100 series;"
+ PCFileName "hp-deskjet_f4100_series.ppd"
+ Attribute "Product" "" "(HP Deskjet f4135 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f4140 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f4150 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f4172 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f4172 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f4175 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f4180 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f4185 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f4188 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f4190 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f4194 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet 4200 Series"
+ Attribute "NickName" "" "HP Officejet 4200 Series, $Version"
+ Attribute "ShortNickName" "" "HP Officejet 4200 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet 4200 series;DES:officejet 4200 series;"
+ PCFileName "hp-officejet_4200_series.ppd"
+ Attribute "Product" "" "(HP Officejet 4200 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 4211 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 4212 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 4215 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 4215xi All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 4215v All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 4219 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet 4255"
+ Attribute "NickName" "" "HP Officejet 4255, $Version"
+ Attribute "ShortNickName" "" "HP Officejet 4255"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet 4255;DES:officejet 4255;"
+ PCFileName "hp-officejet_4255.ppd"
+ Attribute "Product" "" "(HP Officejet 4251 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 4252 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 4255 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 4256 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 4259 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet 5500 Series"
+ Attribute "NickName" "" "HP Officejet 5500 Series, $Version"
+ Attribute "ShortNickName" "" "HP Officejet 5500 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet 5500 series;DES:officejet 5500 series;"
+ PCFileName "hp-officejet_5500_series.ppd"
+ Attribute "Product" "" "(HP Officejet 5505 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 5508 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 5510v All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 5510 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 5510xi All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 5515 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet j5500 Series"
+ Attribute "NickName" "" "HP Officejet j5500 Series, $Version"
+ Attribute "ShortNickName" "" "HP Officejet j5500 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet j5500 series;DES:officejet j5500 series;"
+ PCFileName "hp-officejet_j5500_series.ppd"
+ Attribute "Product" "" "(HP Officejet j5505 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet j5508 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet j5510xi All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet j5510 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet j5510v All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet j5515 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet j5520 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet 5600 Series"
+ Attribute "NickName" "" "HP Officejet 5600 Series, $Version"
+ Attribute "ShortNickName" "" "HP Officejet 5600 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet 5600 series;DES:officejet 5600 series;"
+ PCFileName "hp-officejet_5600_series.ppd"
+ Attribute "Product" "" "(HP Officejet 5600 Series All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 5605 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 5607 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 5608 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 5609 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 5610 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 5610xi All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 5610v All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 5615 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 5679 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 5680 All-in-one Printer)"
+ }
+
+ } // End Supported media sizes.
+} // End DJ3600
+
+////////////////// DJ4100 & DJ2600
+{
+ Attribute "hpPrinterLanguage" "" "lidil"
+ Attribute "HPMechOffset" "" "70"
+
+ Group "General/General"
+
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 10.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "<</Duplex true/Tumble false>>setpagedevice"
+ Choice "DuplexTumble/Short Edge (Flip)" "<</Duplex true/Tumble true>>setpagedevice"
+ *Choice "None/Off" "<</Duplex false/Tumble false>>setpagedevice"
+
+ // MediaPosition values map to MediaSource enumeration in global_types.h
+ Option "InputSlot/Media Source" PickOne AnySetup 10.0
+ *Choice "Auto/Auto-Select" "<</MediaPosition 7>>setpagedevice"
+ Choice "PhotoTray/Photo Tray" "<</MediaPosition 6>>setpagedevice"
+ Choice "Upper/Upper Tray" "<</MediaPosition 1>>setpagedevice"
+ Choice "Lower/Lower Tray" "<</MediaPosition 4>>setpagedevice"
+ Choice "Envelope/Envelope Feeder" "<</MediaPosition 3>>setpagedevice"
+ Choice "LargeCapacity/Large Capacity Tray" "<</MediaPosition 5>>setpagedevice"
+ Choice "Manual/Manual Feeder" "<</MediaPosition 2>>setpagedevice"
+ Choice "MPTray/Multi Purpose Tray" "<</MediaPosition 1>>setpagedevice"
+
+ // cupsMediaType values map to MEDIATYPE from global_types.h
+ Option "MediaType/Media Type" PickOne AnySetup 10.0
+ *Choice "Plain/Plain Paper" "<</MediaType(Plain)/cupsMediaType 0>>setpagedevice"
+ Choice "Glossy/Photo Paper" "<</MediaType(Glossy)/cupsMediaType 3>>setpagedevice"
+
+// cupsCompression values map to QUALITY_MODE from global_types.h
+ Option "OutputMode/Print Quality" PickOne AnySetup 10.0
+ *Choice "NormalRGB/Normal Color" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 1/OutputType(0)/cupsInteger2 0/HWResolution[600 600]>>setpagedevice"
+ Choice "NormalGray/Normal Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 2/OutputType(0)/cupsInteger2 1/HWResolution[600 600]>>setpagedevice"
+ Choice "DraftRGB/Draft Color" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 0/OutputType(-1)/cupsInteger2 2/HWResolution[300 300]>>setpagedevice"
+ Choice "DraftGray/Draft Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 2/OutputType(-1)/cupsInteger2 3/HWResolution[300 300]>>setpagedevice"
+ Choice "Photo/High-Resolution Photo" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 0/OutputType(2)/cupsInteger2 4/HWResolution[600 600]>>setpagedevice"
+
+
+ // Installed Cartridge: Only For Lidil Devices.
+ Option "InstalledCartridge/Installed Cartridges" PickOne AnySetup 10.0
+ Choice "BlackColorOnly/Black Only" "<</cupsInteger1 0>>setpagedevice"
+ Choice "TriColorOnly/TriColor Only" "<</cupsInteger1 1>>setpagedevice"
+ Choice "PhotoColorOnly/Photo Only" "<</cupsInteger1 2>>setpagedevice"
+ *Choice "BlackAndTriColor/Black and TriColor" "<</cupsInteger1 3>>setpagedevice"
+ Choice "PhotoAndColor/Photo and TriColor" "<</cupsInteger1 4>>setpagedevice"
+
+
+ // Duplexer is optional...
+ Installable "OptionDuplex/Duplexer Installed"
+
+ // Constraints
+ UIConstraints "*Duplex *OptionDuplex False"
+ UIConstraints "*MediaType Glossy *OutputMode DraftRGB"
+ UIConstraints "*MediaType Glossy *OutputMode DraftGray"
+ UIConstraints "*MediaType Plain *OutputMode Photo"
+
+ {
+// 4x6 or smaller
+ CustomMedia "Card3x5/Index Card 3x5in" 216 360 18.00 36.00 18.00 9.00 "<</cupsInteger0 78/PageSize [216 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 78/PageSize[216 360]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card3x5.FB/Index Card Borderless 3x5in" 226 370 0 0 0 0 "<</cupsInteger0 78/PageSize [226 370]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 78/PageSize[226 370]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki/Hagaki 100x148mm" 284 420 9.00 36.00 9.00 9.00 "<</cupsInteger0 71/PageSize[284 420]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/PageSize[284 420]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki.FB/Hagaki Borderless 100x148mm" 294 430 0 0 0 0 "<</cupsInteger0 71/PageSize[294 430]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/PageSize[294 430]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6/Photo 4x6in" 288 432 9.00 36.00 9.00 9.00 "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6.FB/Photo Borderless 4x6 in" 298 442 0 0 0 0 "<</cupsInteger0 74/PageSize[298 442]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[298 442]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6/A6 105x148mm" 297.36 419.76 9.00 36.00 9.00 9.00 "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6.FB/A6 Borderless 105x148mm" 307 430 0 0 0 0 "<</cupsInteger0 73/PageSize[307 430]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 73/PageSize[307 430]/ImagingBBox null>>setpagedevice"
+
+// 5x7
+ CustomMedia "Photo5x7/Photo 5x7in" 360 504 9.00 36.00 9.00 9.00 "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo5x7.FB/Photo Borderless 5x7in" 370 514 0 0 0 0 "<</cupsInteger0 122/PageSize[370 514]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/PageSize[370 514]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card5x8/Index Card 5x8in" 360 576 18.00 36.00 18.00 9.00 "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Oufuku/Oufuku-Hagaki 148x200mm" 567 420 18.00 36.00 18.00 9.00 "<</cupsInteger0 72/PageSize[567 420]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 72/PageSize[567 420]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Oufuku.FB/Oufuku-Hagaki Borderless 148x200mm" 577 430 0 0 0 0 "<</cupsInteger0 72/PageSize[577 430]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 72/PageSize[577 430]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5/A5 148x210mm" 419.76 595.44 9.00 36.00 9.00 9.00 "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5.FB/A5 Borderless 148x210mm" 430 605 0 0 0 0 "<</cupsInteger0 25/PageSize[430 605]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/PageSize[430 605]/ImagingBBox null>>setpagedevice"
+
+// Standard
+ CustomMedia "B5/B5 176x250mm" 498.96 708.48 18 36 18 9 "<</cupsInteger0 65/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 65/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5/JB5 182x257mm" 516.24 728.64 18 36 18 9 "<</cupsInteger0 45/PageSize[516.24 728.64]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 45/PageSize [516.24 728.64]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5.FB/JB5 Borderless 182x257mm" 526 739 0 0 0 0 "<</cupsInteger0 45/PageSize[526 739]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 45/PageSize [526 739]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Executive/Executive 7.25x10.5in" 522 756 18.00 36.00 18.00 9.00 "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ CustomMedia "16k/16k 7.75x10.75in" 558 774 18.00 36.00 18.00 9.00 "<</cupsInteger0 101/PageSize[558 774]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[558 774]/ImagingBBox null>>setpagedevice" // custom
+ *CustomMedia "Letter/Letter 8.5x11in" 612 792 18.00 36.00 18.00 9.00 "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Letter.FB/Letter Borderless 8.5x11in" 622 802 0 0 0 0 "<</cupsInteger0 2/PageSize[622 802]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/PageSize[622 802]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4/A4 210x297mm" 595.44 841.68 9.72 36.00 9.72 9.00 "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4.FB/A4 Borderless 210x297mm" 605 852 0 0 0 0 "<</cupsInteger0 26/PageSize[605 852]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/PageSize[605 852]/ImagingBBox null>>setpagedevice"
+ CustomMedia "ExecutiveJIS/Executive (JIS) 8.5x12.986in" 612 936 18.00 36.00 18.00 9.00 "<</cupsInteger0 10/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 10/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ CustomMedia "FLSA/American Foolscap 8.5x13in" 612 936 18.00 36.00 18.00 9.00 "<</cupsInteger0 10/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 10/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Legal/Legal 8.5x14in" 612 1008 18.00 36.00 18.00 9.00 "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+
+// Envelope
+ CustomMedia "EnvA2/A2 Envelope 4.37x5.75in" 314.64 414 9 42 9 9 "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC6/C6 Envelope 114x162mm" 323.28 459.36 18.00 36.00 18.00 9.00 "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou4/#4 Japanese Envelope 90x205mm" 254.88 581.04 9 41 9 9 "<</cupsInteger0 111/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 111/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvMonarch/Monarch Envelope 3.875x7.5in" 279 540 18.00 36.00 18.00 9.00 "<</cupsInteger0 80/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 80/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvDL/DL Envelope 110x220mm" 311.76 623.52 18.00 36.00 18.00 9.00 "<</cupsInteger0 90/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 90/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Env10/#10 Envelope 4.12x9.5in" 297 684 18.00 36.00 18.00 9.00 "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou3/#3 Japanese Envelope 120x235mm" 339.84 666 9 41 9 9 "<</cupsInteger0 110/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 110/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC5/C5 Envelope 162x229mm" 459 649 18.00 36.00 18.00 9.00 "<</cupsInteger0 91/PageSize[459 649]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 91/PageSize[459 649]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvB5/B5 Envelope 176x250mm" 499 709 18.00 36.00 18.00 9.00 "<</cupsInteger0 100/PageSize[499 709]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 100/PageSize[499 709]/ImagingBBox null>>setpagedevice"
+
+ // Custom page sizes from 1x4in to Legal
+ HWMargins 9 36 9 36
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 8.5in 14in
+ {
+ Attribute "cupsModelName" "" "Deskjet D4100" // APDK device class
+ Attribute "hpPrinterPlatform" "" "dj4100"
+ // <%DJ4100:Normal%>
+ {
+ ModelName "HP Deskjet d4100 Series"
+ Attribute "NickName" "" "HP Deskjet d4100 Series, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet d4100 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet d4100 series;DES:deskjet d4100 series;"
+ PCFileName "hp-deskjet_d4100_series.ppd"
+ Attribute "Product" "" "(HP Deskjet d4145 Printer)"
+ Attribute "Product" "" "(HP Deskjet d4145 Printer)"
+ Attribute "Product" "" "(HP Deskjet d4155 Printer)"
+ Attribute "Product" "" "(HP Deskjet d4155 Printer)"
+ Attribute "Product" "" "(HP Deskjet d4160 Printer)"
+ Attribute "Product" "" "(HP Deskjet d4163 Printer)"
+ Attribute "Product" "" "(HP Deskjet d4168 Printer)"
+ }
+ {
+ ModelName "HP Deskjet d4200 Series"
+ Attribute "NickName" "" "HP Deskjet d4200 Series, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet d4200 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet d4200 series;DES:deskjet d4200 series;"
+ PCFileName "hp-deskjet_d4200_series.ppd"
+ Attribute "Product" "" "(HP Deskjet d4245 Printer)"
+ Attribute "Product" "" "(HP Deskjet d4260 Printer)"
+ Attribute "Product" "" "(HP Deskjet d4266 Printer)"
+ Attribute "Product" "" "(HP Deskjet d4268 Printer)"
+ }
+ {
+ ModelName "HP Deskjet d4300 Series"
+ Attribute "NickName" "" "HP Deskjet d4300 Series, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet d4300 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet d4300 series;DES:deskjet d4300 series;"
+ PCFileName "hp-deskjet_d4300_series.ppd"
+ Attribute "Product" "" "(HP Deskjet d4360 Printer)"
+ Attribute "Product" "" "(HP Deskjet d4363 Printer)"
+ Attribute "Product" "" "(HP Deskjet d4368 Printer)"
+ }
+ }
+
+ } // End Supported media sizes.
+} // End DJ4100 & DJ2600
+
+//////////////////// PSP100 4x6, three-sided fullbleed
+{
+ Attribute "hpPrinterLanguage" "" "pcl3gui2"
+ Attribute "HPMechOffset" "" "70"
+
+ Group "General/General"
+
+ // MediaPosition values map to MediaSource enumeration in global_types.h
+ Option "InputSlot/Media Source" PickOne AnySetup 10.0
+ *Choice "Auto/Auto-Select" "<</MediaPosition 7>>setpagedevice"
+ Choice "PhotoTray/Photo Tray" "<</MediaPosition 6>>setpagedevice"
+ Choice "Upper/Upper Tray" "<</MediaPosition 1>>setpagedevice"
+ Choice "Lower/Lower Tray" "<</MediaPosition 4>>setpagedevice"
+ Choice "Envelope/Envelope Feeder" "<</MediaPosition 3>>setpagedevice"
+ Choice "LargeCapacity/Large Capacity Tray" "<</MediaPosition 5>>setpagedevice"
+ Choice "Manual/Manual Feeder" "<</MediaPosition 2>>setpagedevice"
+ Choice "MPTray/Multi Purpose Tray" "<</MediaPosition 1>>setpagedevice"
+
+ Option "ColorModel/Output Mode" PickOne AnySetup 10.0
+ *Choice "RGB/Color" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 0>>setpagedevice"
+
+ // cupsMediaType values map to MEDIATYPE from global_types.h
+ Option "MediaType/Media Type" PickOne AnySetup 10.0
+ *Choice "Automatic/Automatic" "<</MediaType(Automatic)/cupsMediaType -1>>setpagedevice"
+ Choice "Plain/Plain Paper" "<</MediaType(Plain)/cupsMediaType 0>>setpagedevice"
+ Choice "Glossy/Photo Paper" "<</MediaType(Glossy)/cupsMediaType 3>>setpagedevice"
+ Choice "TransparencyFilm/Transparency Film" "<</MediaType(TransparencyFilm)/cupsMediaType 4>>setpagedevice"
+
+ // cupsCompression values map to QUALITY_MODE from global_types.h
+ Option "OutputMode/Print Quality" PickOne AnySetup 10.0
+ Choice "Normal/Normal" "<</OutputType(0)/HWResolution[600 600]>>setpagedevice"
+ Choice "Best/Best" "<</OutputType(1)/HWResolution[600 600]>>setpagedevice"
+ Choice "Photo/High-Resolution Photo" "<</OutputType(2)/HWResolution[1200 1200]>>setpagedevice"
+ *Choice "Auto/Automatic" "<</OutputType(-3)/HWResolution[600 600]>>setpagedevice"
+
+ // Duplexer is optional...
+
+ // Constraints
+ UIConstraints "*MediaType Plain *OutputMode Photo"
+
+ Attribute "cupsModelName" "" "PHOTOSMART 100" // APDK device class
+
+ {
+// 4x6 or smaller
+ CustomMedia "Hagaki/Hagaki 100x148mm" 284 420 9 36 9 9 "<</cupsInteger0 71/PageSize[284 420]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/PageSize[284 420]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki.FB/Hagaki Borderless 100x148mm" 294 430 0 0 0 46 "<</cupsInteger0 71/PageSize[294 430]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/PageSize[294 430]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6/Photo 4x6in with tear-off tab" 288 432 9 36 9 9 "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ *CustomMedia "Photo4x6.FB/Photo Borderless 4x6 in" 298 442 0 0 0 46 "<</cupsInteger0 74/PageSize[298 442]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[298 442]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6/A6 105x148mm" 297.36 419.76 9 36 9 9 "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6.FB/A6 Borderless 105x148mm" 307 430 0 0 0 46.24 "<</cupsInteger0 73/PageSize[307 430]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 73/PageSize[307 430]/ImagingBBox null>>setpagedevice"
+
+ // Custom page sizes from 1x4in to A6
+ HWMargins 9 36 9 36
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 297 420
+
+ // <%PSP100:Normal%>
+ {
+ ModelName "HP Photosmart 100"
+ Attribute "NickName" "" "HP Photosmart 100, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 100"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 100;DES:photosmart 100;"
+ PCFileName "hp-photosmart_100.ppd"
+ Attribute "Product" "" "(HP Photosmart 100 Printer)"
+ }
+ {
+ ModelName "HP Photosmart 130"
+ Attribute "NickName" "" "HP Photosmart 130, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 130"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 130;DES:photosmart 130;"
+ PCFileName "hp-photosmart_130.ppd"
+ Attribute "Product" "" "(HP Photosmart 130 Printer)"
+ Attribute "Product" "" "(HP Photosmart 130v Printer)"
+ Attribute "Product" "" "(HP Photosmart 130xi Printer)"
+ }
+ {
+ ModelName "HP Photosmart 140 Series"
+ Attribute "NickName" "" "HP Photosmart 140 Series, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 140 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 140 series;DES:photosmart 140 series;"
+ PCFileName "hp-photosmart_140_series.ppd"
+ Attribute "Product" "" "(HP Photosmart 140 Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 145v Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 145xi Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 145 Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 148 Compact Photo Printer)"
+ }
+ {
+ ModelName "HP Photosmart 230"
+ Attribute "NickName" "" "HP Photosmart 230, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 230"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 230;DES:photosmart 230;"
+ PCFileName "hp-photosmart_230.ppd"
+ Attribute "Product" "" "(HP Photosmart 230 Printer)"
+ Attribute "Product" "" "(HP Photosmart 230v Printer)"
+ Attribute "Product" "" "(HP Photosmart 230xi Printer)"
+ }
+ {
+ ModelName "HP Photosmart 240 Series"
+ Attribute "NickName" "" "HP Photosmart 240 Series, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 240 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 240 series;DES:photosmart 240 series;"
+ PCFileName "hp-photosmart_240_series.ppd"
+ Attribute "Product" "" "(HP Photosmart 240 Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 245v Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 245xi Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 245 Compact Photo Printer)"
+ }
+
+ } // End Supported media sizes with full bleed.
+} // End PSP100 4x6, three-sided fullbleed
+
+//////////////// DJGenericVIP 4x6, 4-sided fullbleed
+{
+ Attribute "hpPrinterLanguage" "" "pcl3gui2"
+ Attribute "HPMechOffset" "" "70"
+
+ Group "General/General"
+
+ // MediaPosition values map to MediaSource enumeration in global_types.h
+ Option "InputSlot/Media Source" PickOne AnySetup 10.0
+ *Choice "Auto/Auto-Select" "<</MediaPosition 7>>setpagedevice"
+ Choice "PhotoTray/Photo Tray" "<</MediaPosition 6>>setpagedevice"
+ Choice "Upper/Upper Tray" "<</MediaPosition 1>>setpagedevice"
+ Choice "Lower/Lower Tray" "<</MediaPosition 4>>setpagedevice"
+ Choice "Envelope/Envelope Feeder" "<</MediaPosition 3>>setpagedevice"
+ Choice "LargeCapacity/Large Capacity Tray" "<</MediaPosition 5>>setpagedevice"
+ Choice "Manual/Manual Feeder" "<</MediaPosition 2>>setpagedevice"
+ Choice "MPTray/Multi Purpose Tray" "<</MediaPosition 1>>setpagedevice"
+
+ Option "ColorModel/Output Mode" PickOne AnySetup 10.0
+ *Choice "RGB/Color" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 0>>setpagedevice"
+
+ // cupsMediaType values map to MEDIATYPE from global_types.h
+ Option "MediaType/Media Type" PickOne AnySetup 10.0
+ *Choice "Automatic/Automatic" "<</MediaType(Automatic)/cupsMediaType -1>>setpagedevice"
+ Choice "Plain/Plain Paper" "<</MediaType(Plain)/cupsMediaType 0>>setpagedevice"
+ Choice "Glossy/Photo Paper" "<</MediaType(Glossy)/cupsMediaType 3>>setpagedevice"
+ Choice "TransparencyFilm/Transparency Film" "<</MediaType(TransparencyFilm)/cupsMediaType 4>>setpagedevice"
+
+ // cupsCompression values map to QUALITY_MODE from global_types.h
+ Option "OutputMode/Print Quality" PickOne AnySetup 10.0
+ Choice "Normal/Normal" "<</OutputType(0)/HWResolution[600 600]>>setpagedevice"
+ Choice "FastNormal/FastNormal" "<</OutputType(3)/HWResolution[600 600]>>setpagedevice"
+ Choice "Best/Best" "<</OutputType(1)/HWResolution[600 600]>>setpagedevice"
+ Choice "Photo/High-Resolution Photo" "<</OutputType(2)/HWResolution[1200 1200]>>setpagedevice"
+ *Choice "Auto/Automatic" "<</OutputType(-3)/HWResolution[600 600]>>setpagedevice"
+
+ // Duplexer is optional...
+
+ // Constraints
+ UIConstraints "*MediaType Plain *OutputMode Photo"
+
+ Attribute "cupsModelName" "" "deskjet 5600" // APDK device class
+
+ {
+// 4x6 or smaller
+ CustomMedia "Hagaki/Hagaki 100x148mm" 284 420 9 9 9 9 "<</cupsInteger0 71/PageSize[284 420]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/PageSize[284 420]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki.FB/Hagaki Borderless 100x148mm" 294 430 0 0 0 0 "<</cupsInteger0 71/PageSize[294 430]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/PageSize[294 430]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6/Photo 4x6in" 288 432 9 9 9 9 "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ *CustomMedia "Photo4x6.FB/Photo Borderless 4x6 in" 298 442 0 0 0 0 "<</cupsInteger0 74/PageSize[298 442]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[298 442]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6/A6 105x148mm" 297.36 419.76 9 9 9 9 "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6.FB/A6 Borderless 105x148mm" 307 430 0 0 0 0 "<</cupsInteger0 73/PageSize[307 430]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 73/PageSize[307 430]/ImagingBBox null>>setpagedevice"
+
+// Envelope
+ CustomMedia "EnvChou4/#4 Japanese Envelope 90x205mm" 254.88 581.04 9 41 9 9 "<</cupsInteger0 111/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 111/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+
+ // Custom page sizes from 1x4in to A6
+ HWMargins 9 9 9 9
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 297 420
+
+ // <%DJGenericVIP:4x6FullBleed%>
+ {
+ ModelName "HP Photosmart a310 Series"
+ Attribute "NickName" "" "HP Photosmart a310 Series, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart a310 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart a310 series;DES:photosmart a310 series;"
+ PCFileName "hp-photosmart_a310_series.ppd"
+ Attribute "Product" "" "(HP Photosmart a310 Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart a311 Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart a314 Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart a316 Compact Photo Printer)"
+ }
+ {
+ ModelName "HP Photosmart 320 Series"
+ Attribute "NickName" "" "HP Photosmart 320 Series, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 320 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 320 series;DES:photosmart 320 series;"
+ PCFileName "hp-photosmart_320_series.ppd"
+ Attribute "Product" "" "(HP Photosmart 320 Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 325xi Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 325v Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 325 Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 329 Compact Photo Printer)"
+ }
+ {
+ ModelName "HP Photosmart a320 Series"
+ Attribute "NickName" "" "HP Photosmart a320 Series, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart a320 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart a320 series;DES:photosmart a320 series;"
+ PCFileName "hp-photosmart_a320_series.ppd"
+ Attribute "Product" "" "(HP Photosmart a320 Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart a321 Compact Photo Printer)"
+ }
+ {
+ ModelName "HP Photosmart 330 Series"
+ Attribute "NickName" "" "HP Photosmart 330 Series, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 330 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 330 series;DES:photosmart 330 series;"
+ PCFileName "hp-photosmart_330_series.ppd"
+ Attribute "Product" "" "(HP Photosmart 330 Series Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 335 Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 335xi Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 335v Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 337 Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 338 Compact Photo Printer)"
+ }
+ {
+ ModelName "HP Photosmart 370 Series"
+ Attribute "NickName" "" "HP Photosmart 370 Series, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 370 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 370 series;DES:photosmart 370 series;"
+ PCFileName "hp-photosmart_370_series.ppd"
+ Attribute "Product" "" "(HP Photosmart 370 Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 375xi Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 375v Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 375 Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 375bxi Compact Photo Printer With Battery)"
+ Attribute "Product" "" "(HP Photosmart 375b Compact Photo Printer With Battery)"
+ }
+ {
+ ModelName "HP Photosmart 380 Series"
+ Attribute "NickName" "" "HP Photosmart 380 Series, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 380 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 380 series;DES:photosmart 380 series;"
+ PCFileName "hp-photosmart_380_series.ppd"
+ Attribute "Product" "" "(HP Photosmart 385 Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 385xi Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 385v Compact Photo Printer)"
+ }
+ {
+ ModelName "HP Photosmart 420 Series"
+ Attribute "NickName" "" "HP Photosmart 420 Series, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 420 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 420 series;DES:photosmart 420 series;"
+ PCFileName "hp-photosmart_420_series.ppd"
+ Attribute "Product" "" "(HP Photosmart 420 Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 422 Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 422v Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 422xi Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 425 Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 425v Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 428 Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 428v Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 428xi Compact Photo Printer)"
+ }
+ {
+ ModelName "HP Photosmart a430 Series"
+ Attribute "NickName" "" "HP Photosmart a430 Series, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart a430 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart a430 series;DES:photosmart a430 series;"
+ PCFileName "hp-photosmart_a430_series.ppd"
+ Attribute "Product" "" "(HP Photosmart a430 Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart a432 Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart a433 Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart a434 Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart a436 Compact Photo Printer)"
+ }
+ {
+ ModelName "HP Photosmart a440 Series"
+ Attribute "NickName" "" "HP Photosmart a440 Series, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart a440 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart a440 series;DES:photosmart a440 series;"
+ PCFileName "hp-photosmart_a440_series.ppd"
+ Attribute "Product" "" "(HP Photosmart a440 Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart a442 Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart a446 Compact Photo Printer)"
+ }
+ {
+ ModelName "HP Photosmart a510 Series"
+ Attribute "NickName" "" "HP Photosmart a510 Series, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart a510 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart a510 series;DES:photosmart a510 series;"
+ PCFileName "hp-photosmart_a510_series.ppd"
+ Attribute "Product" "" "(HP Photosmart a510 Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart a512 Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart a516 Compact Photo Printer)"
+ }
+ {
+ ModelName "HP Photosmart a520 Series"
+ Attribute "NickName" "" "HP Photosmart a520 Series, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart a520 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart a520 series;DES:photosmart a520 series;"
+ PCFileName "hp-photosmart_a520_series.ppd"
+ Attribute "Product" "" "(HP Photosmart a522xi Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart a522 Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart a525 Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart a526 Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart a528 Compact Photo Printer)"
+ }
+ } // End Supported media sizes with full bleed.
+} // End DJGenericVIP 4x6, 4-sided fullbleed
+
+//////////////// PSP470 5x7, 4-sided fullbleed
+{
+ Attribute "hpPrinterLanguage" "" "pcl3gui2"
+ Attribute "HPMechOffset" "" "70"
+
+ Group "General/General"
+
+ // MediaPosition values map to MediaSource enumeration in global_types.h
+ Option "InputSlot/Media Source" PickOne AnySetup 10.0
+ *Choice "Auto/Auto-Select" "<</MediaPosition 7>>setpagedevice"
+ Choice "PhotoTray/Photo Tray" "<</MediaPosition 6>>setpagedevice"
+ Choice "Upper/Upper Tray" "<</MediaPosition 1>>setpagedevice"
+ Choice "Lower/Lower Tray" "<</MediaPosition 4>>setpagedevice"
+ Choice "Envelope/Envelope Feeder" "<</MediaPosition 3>>setpagedevice"
+ Choice "LargeCapacity/Large Capacity Tray" "<</MediaPosition 5>>setpagedevice"
+ Choice "Manual/Manual Feeder" "<</MediaPosition 2>>setpagedevice"
+ Choice "MPTray/Multi Purpose Tray" "<</MediaPosition 1>>setpagedevice"
+
+ Option "ColorModel/Output Mode" PickOne AnySetup 10.0
+ *Choice "RGB/Color" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 0>>setpagedevice"
+
+ // cupsMediaType values map to MEDIATYPE from global_types.h
+ Option "MediaType/Media Type" PickOne AnySetup 10.0
+ *Choice "Automatic/Automatic" "<</MediaType(Automatic)/cupsMediaType -1>>setpagedevice"
+ Choice "Plain/Plain Paper" "<</MediaType(Plain)/cupsMediaType 0>>setpagedevice"
+ Choice "Glossy/Photo Paper" "<</MediaType(Glossy)/cupsMediaType 3>>setpagedevice"
+ Choice "TransparencyFilm/Transparency Film" "<</MediaType(TransparencyFilm)/cupsMediaType 4>>setpagedevice"
+
+ // cupsCompression values map to QUALITY_MODE from global_types.h
+ Option "OutputMode/Print Quality" PickOne AnySetup 10.0
+ Choice "Normal/Normal" "<</OutputType(0)/HWResolution[600 600]>>setpagedevice"
+ Choice "Draft/Draft" "<</OutputType(-1)/HWResolution[300 300]>>setpagedevice"
+ Choice "Best/Best" "<</OutputType(1)/HWResolution[600 600]>>setpagedevice"
+ *Choice "Photo/High-Resolution Photo" "<</OutputType(2)/HWResolution[1200 1200]>>setpagedevice"
+
+ // Duplexer is optional...
+
+ // Constraints
+ UIConstraints "*MediaType Glossy *OutputMode Draft"
+ UIConstraints "*MediaType Plain *OutputMode Photo"
+ UIConstraints "*MediaType Automatic *PageSize EnvMonarch"
+
+ Attribute "cupsModelName" "" "Photosmart 470" // APDK device class
+
+ {
+// 4x6 or smaller
+ CustomMedia "Hagaki/Hagaki 100x148mm" 284 420 9 9 9 9 "<</cupsInteger0 71/PageSize[284 420]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/PageSize[284 420]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki.FB/Hagaki Borderless 100x148mm" 294 430 0 0 0 0 "<</cupsInteger0 71/PageSize[294 430]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/PageSize[294 430]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6/Photo 4x6in" 288 432 9 9 9 9 "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6.FB/Photo Borderless 4x6 in" 298 442 0 0 0 0 "<</cupsInteger0 74/PageSize[298 442]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[298 442]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6/A6 105x148mm" 297.36 419.76 9 9 9 9 "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6.FB/A6 Borderless 105x148mm" 307 430 0 0 0 0 "<</cupsInteger0 73/PageSize[307 430]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 73/PageSize[307 430]/ImagingBBox null>>setpagedevice"
+
+// 5x7
+ CustomMedia "Photo5x7/Photo 5x7in" 360 504 9 9 9 9 "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ *CustomMedia "Photo5x7.FB/Photo Borderless 5x7in" 370 514 0 0 0 0 "<</cupsInteger0 122/PageSize[370 514]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/PageSize[370 514]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card5x8/Index Card 5x8in" 360 576 9 9 9 9 "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+
+// Envelope
+ CustomMedia "EnvA2/A2 Envelope 4.37x5.75in" 314.64 414 9 42 9 9 "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC6/C6 Envelope 114x162mm" 323.28 459.36 9 39 9 9 "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou4/#4 Japanese Envelope 90x205mm" 254.88 581.04 9 41 9 9 "<</cupsInteger0 111/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 111/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvDL/DL Envelope 110x220mm" 311.76 623.52 9 41 9 9 "<</cupsInteger0 90/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 90/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Env10/#10 Envelope 4.12x9.5in" 297 684 9 41 9 9 "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou3/#3 Japanese Envelope 120x235mm" 339.84 666 9 41 9 9 "<</cupsInteger0 110/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 110/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+
+ // Custom page sizes from 1x4in to 5x7
+ HWMargins 9 9 9 9
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 5in 7in
+
+ // <%PSP470:FullBleed%>
+ {
+ ModelName "HP Photosmart 470 Series"
+ Attribute "NickName" "" "HP Photosmart 470 Series, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 470 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 470 series;DES:photosmart 470 series;"
+ PCFileName "hp-photosmart_470_series.ppd"
+ Attribute "Product" "" "(HP Photosmart 470 Series Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 475xi Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 475v Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 475 Compact Photo Printer)"
+ }
+ {
+ ModelName "HP Photosmart a610 Series"
+ Attribute "NickName" "" "HP Photosmart a610 Series, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart a610 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart a610 series;DES:photosmart a610 series;"
+ PCFileName "hp-photosmart_a610_series.ppd"
+ Attribute "Product" "" "(HP Photosmart a610 Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart a612 Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart a616 Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart a617 Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart a618 Compact Photo Printer)"
+ }
+ {
+ ModelName "HP Photosmart a620 Series"
+ Attribute "NickName" "" "HP Photosmart a620 Series, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart a620 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart a620 series;DES:photosmart a620 series;"
+ PCFileName "hp-photosmart_a620_series.ppd"
+ Attribute "Product" "" "(HP Photosmart a620 Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart a622 Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart a626 Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart a627 Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart a628 Compact Photo Printer)"
+ }
+ {
+ ModelName "HP Photosmart a710 Series"
+ Attribute "NickName" "" "HP Photosmart a710 Series, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart a710 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart a710 series;DES:photosmart a710 series;"
+ PCFileName "hp-photosmart_a710_series.ppd"
+ Attribute "Product" "" "(HP Photosmart a712 Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart a716 Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart a717 Compact Photo Printer)"
+ }
+ {
+ ModelName "HP Photosmart a820 Series"
+ Attribute "NickName" "" "HP Photosmart a820 Series, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart a820 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart a820 series;DES:photosmart a820 series;"
+ PCFileName "hp-photosmart_a820_series.ppd"
+ Attribute "Product" "" "(HP Photosmart a826 Home Photo Center)"
+ Attribute "Product" "" "(HP Photosmart a827 Home Photo Center)"
+ Attribute "Product" "" "(HP Photosmart a828 Home Photo Center)"
+ }
+
+ } // End Supported media sizes with full bleed.
+} // End PSP470 4x6, 4-sided fullbleed
+
+//////////////// QuickConnect 5x7, 4-sided fullbleed
+{
+ Attribute "hpPrinterLanguage" "" "quickconnect"
+
+ Group "General/General"
+
+ // MediaPosition values map to MediaSource enumeration in global_types.h
+ Option "InputSlot/Media Source" PickOne AnySetup 10.0
+ *Choice "Auto/Auto-Select" "<</MediaPosition 7>>setpagedevice"
+
+ // cupsMediaType values map to MEDIATYPE from global_types.h
+ Option "MediaType/Media Type" PickOne AnySetup 10.0
+ *Choice "Automatic/Automatic" "<</cupsMediaType -1>>setpagedevice"
+ Choice "APhoto/HP Advanced Photo" "<</cupsMediaType 1>>setpagedevice"
+ Choice "PPhoto/HP Premium Photo" "<</cupsMediaType 3>>setpagedevice"
+ Choice "Plain/Plain" "<</cupsMediaType 3>>setpagedevice"
+ Choice "OPhoto/Other Photo" "<</cupsMediaType 4>>setpagedevice"
+
+ // cupsCompression values map to QUALITY_MODE from global_types.h
+ Option "OutputMode/Print Quality" PickOne AnySetup 10.0
+ *Choice "Auto/Automatic" "<</OutputType(0)>>setpagedevice"
+ Choice "Normal/Normal" "<</OutputType(1)>>setpagedevice"
+ Choice "Best/Best" "<</OutputType(2)>>setpagedevice"
+ Choice "FastNormal/Fast Normal" "<</OutputType(3)>>setpagedevice"
+
+ Option "Borderless/Borderless Printing" Boolean AnySetup 10.0
+ *Choice "On/Print Borderless" "<</cupsInteger1 2091572/HWResolution[300 300]/cupsColorSpace 1/cupsBitsPerColor 8/cupsInteger2 1>>setpagedevice"
+ Choice "Off/Print with Border" "<</cupsInteger1 2091572/HWResolution[300 300]/cupsColorSpace 1/cupsBitsPerColor 8/cupsInteger2 0>>setpagedevice"
+
+Group "RLT/HP Real Life Technologies"
+ Option "PhotoFix/Photo Fix" Boolean AnySetup 10.0
+ Choice "On/Enabled" "<</cupsInteger3 1>>setpagedevice"
+ *Choice "Off/Disabled" "<</cupsInteger3 0>>setpagedevice"
+ Option "RedEye/Red Eye Removal" Boolean AnySetup 10.0
+ Choice "On/Enabled" "<</cupsInteger4 1>>setpagedevice"
+ *Choice "Off/Disabled" "<</cupsInteger4 0>>setpagedevice"
+
+ // Constraints
+
+ Attribute "cupsModelName" "" "Photosmart A530" // APDK device class
+
+ {
+ *CustomMedia "0_Automatic/Automatic" 288 432 0 0 0 0 "<</cupsInteger0 0/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 0/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "1_4x6/4x6in, 10x15cm, A6, Hagaki" 288 432 0 0 0 0 "<</cupsInteger0 1/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "2_5x7/5x7in, 13x18cm, 2L" 360 504 0 0 0 0 "<</cupsInteger0 2/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ CustomMedia "3_L/3.5x5in, L" 252 360 0 0 0 0 "<</cupsInteger0 3/PageSize[252 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 3/PageSize[252 360]/ImagingBBox null>>setpagedevice"
+ CustomMedia "4_4x8/4x8in, 10x20cm" 288 576 0 0 0 0 "<</cupsInteger0 4/PageSize[288 576]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 4/PageSize[288 576]/ImagingBBox null>>setpagedevice"
+ CustomMedia "5_4x12/4x12in, 10x30cm" 288 864 0 0 0 0 "<</cupsInteger0 5/PageSize[288 864]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 5/PageSize[288 864]/ImagingBBox null>>setpagedevice"
+
+ // <%QuickConnect:Normal%>
+ {
+ ModelName "HP Photosmart a530 Series"
+ Attribute "NickName" "" "HP Photosmart a530 Series, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart a530 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart a530 series;DES:photosmart a530 series;"
+ PCFileName "hp-photosmart_a530_series.ppd"
+ Attribute "Product" "" "(HP Photosmart a532 Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart a536 Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart a538 Compact Photo Printer)"
+ }
+ {
+ ModelName "HP Photosmart a630 Series"
+ Attribute "NickName" "" "HP Photosmart a630 Series, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart a630 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart a630 series;DES:photosmart a630 series;"
+ PCFileName "hp-photosmart_a630_series.ppd"
+ Attribute "Product" "" "(HP Photosmart a636 Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart a637 Compact Photo Printer)"
+ }
+ {
+ ModelName "HP Photosmart a640 Series"
+ Attribute "NickName" "" "HP Photosmart a640 Series, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart a640 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart a640 series;DES:photosmart a640 series;"
+ PCFileName "hp-photosmart_a640_series.ppd"
+ Attribute "Product" "" "(HP Photosmart a640 Printer Series)"
+ }
+
+ } // End Supported media sizes with full bleed.
+} // End QuickConnect 5x7, 4-sided fullbleed
+
+///////////////// LJMono
+{
+ Attribute "cupsEvenDuplex" "" "True"
+ Attribute "hpPrinterLanguage" "" "ljmono"
+
+ Group "General/General"
+
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 10.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "<</Duplex true/Tumble false>>setpagedevice"
+ Choice "DuplexTumble/Short Edge (Flip)" "<</Duplex true/Tumble true>>setpagedevice"
+ *Choice "None/Off" "<</Duplex false/Tumble false>>setpagedevice"
+
+ // MediaPosition values map to MediaSource enumeration in global_types.h
+ Option "InputSlot/Media Source" PickOne AnySetup 10.0
+ *Choice "Auto/Auto-Select" "<</MediaPosition 7>>setpagedevice"
+ Choice "PhotoTray/Photo Tray" "<</MediaPosition 1>>setpagedevice"
+ Choice "Upper/Upper Tray" "<</MediaPosition 1>>setpagedevice"
+ Choice "Lower/Lower Tray" "<</MediaPosition 4>>setpagedevice"
+ Choice "Envelope/Envelope Feeder" "<</MediaPosition 3>>setpagedevice"
+ Choice "LargeCapacity/Large Capacity Tray" "<</MediaPosition 5>>setpagedevice"
+ Choice "Manual/Manual Feeder" "<</MediaPosition 2>>setpagedevice"
+ Choice "MPTray/Multi Purpose Tray" "<</MediaPosition 1>>setpagedevice"
+
+ // cupsRowCount values map to PEN_TYPE + 1 from global_types.h
+ Option "ColorModel/Output Mode" PickOne AnySetup 10.0
+ *Choice "Gray/Grayscale" "<</cupsColorSpace 3/cupsBitsPerColor 1/cupsRowCount 1/cupsRowStep 2>>setpagedevice"
+
+ // cupsMediaType values map to MEDIATYPE from global_types.h
+ Option "MediaType/Media Type" PickOne AnySetup 10.0
+ *Choice "Plain/Plain Paper" "<</MediaType(Plain)/cupsMediaType 0>>setpagedevice"
+
+ // cupsCompression values map to QUALITY_MODE from global_types.h
+ Option "OutputMode/Print Quality" PickOne AnySetup 10.0
+ *Choice "Normal/Normal" "<</OutputType(0)/HWResolution[600 600]>>setpagedevice"
+ Choice "Draft/Draft (Economy)" "<</OutputType(-1)/HWResolution[300 300]>>setpagedevice"
+ Choice "Best/Best" "<</OutputType(0)/HWResolution[600 600]>>setpagedevice"
+
+ // Duplexer is optional...
+ Installable "OptionDuplex/Duplexer Installed"
+
+ // Constraints
+ UIConstraints "*Duplex *OptionDuplex False"
+
+ Attribute "cupsModelName" "" "HP LaserJet" // APDK device class
+
+// 4x6 or smaller
+ CustomMedia "Card3x5/Index Card 3x5in" 216 360 18 14 18 14 "<</cupsInteger0 78/PageSize [216 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 78/PageSize[216 360]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki/Hagaki 100x148mm" 284 420 18 14 18 14 "<</cupsInteger0 71/PageSize[284 420]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/PageSize[284 420]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6/Photo 4x6in" 288 432 18 14 18 14 "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6/A6 105x148mm" 297.36 419.76 18 14 18 14 "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+
+// 5x7
+ CustomMedia "Photo5x7/Photo 5x7in" 360 504 18 14 18 14 "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card5x8/Index Card 5x8in" 360 576 18 14 18 14 "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Oufuku/Oufuku-Hagaki 148x200mm" 567 420 18 14 18 14 "<</cupsInteger0 72/PageSize[567 420]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 72/PageSize[567 420]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5/A5 148x210mm" 419.76 595.44 18 14 18 14 "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+
+// Standard
+ CustomMedia "B5/B5 176x250mm" 498.96 708.48 18 14 18 14 "<</cupsInteger0 65/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 65/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5/JB5 182x257mm" 516.24 728.64 18 14 18 14 "<</cupsInteger0 45/PageSize[516.24 728.64]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 45/PageSize [516.24 728.64]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Executive/Executive 7.25x10.5in" 522 756 18 14 18 14 "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ CustomMedia "16k/16k 7.75x10.75in" 558 774 18 14 18 14 "<</cupsInteger0 101/PageSize[558 774]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[558 774]/ImagingBBox null>>setpagedevice" // custom
+ *CustomMedia "Letter/Letter 8.5x11in" 612 792 18 14 18 14 "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4/A4 210x297mm" 595.44 841.68 18 14 18 14 "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ CustomMedia "ExecutiveJIS/Executive (JIS) 8.5x12.986in" 612 936 18 14 18 14 "<</cupsInteger0 10/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 10/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ CustomMedia "FLSA/American Foolscap 8.5x13in" 612 936 18 14 18 14 "<</cupsInteger0 10/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 10/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Legal/Legal 8.5x14in" 612 1008 18 14 18 14 "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+
+// Envelope
+ CustomMedia "EnvA2/A2 Envelope 4.37x5.75in" 314.64 414 18 14 18 14 "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC6/C6 Envelope 114x162mm" 323.28 459.36 18 14 18 14 "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou4/#4 Japanese Envelope 90x205mm" 254.88 581.04 18 14 18 14 "<</cupsInteger0 111/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 111/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvMonarch/Monarch Envelope 3.875x7.5in" 279 540 18 14 18 14 "<</cupsInteger0 80/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 80/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvDL/DL Envelope 110x220mm" 311.76 623.52 18 14 18 14 "<</cupsInteger0 90/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 90/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Env10/#10 Envelope 4.12x9.5in" 297 684 18 14 18 14 "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou3/#3 Japanese Envelope 120x235mm" 339.84 666 18 14 18 14 "<</cupsInteger0 110/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 110/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC5/C5 Envelope 162x229mm" 459 649 18 14 18 14 "<</cupsInteger0 91/PageSize[459 649]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 91/PageSize[459 649]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvB5/B5 Envelope 176x250mm" 499 709 18 14 18 14 "<</cupsInteger0 100/PageSize[499 709]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 100/PageSize[499 709]/ImagingBBox null>>setpagedevice"
+
+ {
+ // Custom page sizes from 1x4in to Legal
+ HWMargins 18 14 18 14
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 8.5in 14in
+
+ // <%LJMono:Normal%>
+ {
+ ModelName "HP LaserJet 4mp"
+ Attribute "NickName" "" "HP LaserJet 4mp pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 4mp"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 4mp;DES:hp laserjet 4mp;"
+ PCFileName "hp-laserjet_4mp-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 4mp Printer)"
+ }
+ {
+ ModelName "HP LaserJet 4 Plus"
+ Attribute "NickName" "" "HP LaserJet 4 Plus pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 4 Plus"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 4 plus;DES:hp laserjet 4 plus;"
+ PCFileName "hp-laserjet_4_plus-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 4 Plus Printer)"
+ Attribute "Product" "" "(HP LaserJet 4m Plus Printer)"
+ }
+ {
+ ModelName "HP LaserJet 4v"
+ Attribute "NickName" "" "HP LaserJet 4v pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 4v"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 4v;DES:hp laserjet 4v;"
+ PCFileName "hp-laserjet_4v-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 4v Printer)"
+ }
+ {
+ ModelName "HP LaserJet 4si"
+ Attribute "NickName" "" "HP LaserJet 4si pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 4si"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 4si;DES:hp laserjet 4si;"
+ PCFileName "hp-laserjet_4si-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 4si Printer)"
+ Attribute "Product" "" "(HP LaserJet 4si Mx Printer)"
+ }
+ {
+ ModelName "HP LaserJet 5l"
+ Attribute "NickName" "" "HP LaserJet 5l, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 5l"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 5l;DES:hp laserjet 5l;"
+ PCFileName "hp-laserjet_5l.ppd"
+ Attribute "Product" "" "(HP LaserJet 5l Printer)"
+ Attribute "Product" "" "(HP LaserJet 5l-fs Printer)"
+ Attribute "Product" "" "(HP LaserJet 5l Xtra Printer)"
+ }
+ {
+ ModelName "HP LaserJet 5mp"
+ Attribute "NickName" "" "HP LaserJet 5mp pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 5mp"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 5mp;DES:hp laserjet 5mp;"
+ PCFileName "hp-laserjet_5mp-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 5mp Printer)"
+ }
+ {
+ ModelName "HP LaserJet 5p"
+ Attribute "NickName" "" "HP LaserJet 5p, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 5p"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 5p;DES:hp laserjet 5p;"
+ PCFileName "hp-laserjet_5p.ppd"
+ Attribute "Product" "" "(HP LaserJet 5p Printer)"
+ }
+ {
+ ModelName "HP LaserJet 6l"
+ Attribute "NickName" "" "HP LaserJet 6l, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 6l"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 6l;DES:hp laserjet 6l;"
+ PCFileName "hp-laserjet_6l.ppd"
+ Attribute "Product" "" "(HP LaserJet 6l Printer)"
+ Attribute "Product" "" "(HP LaserJet 6lse Printer)"
+ Attribute "Product" "" "(HP LaserJet 6lxi Printer)"
+ Attribute "Product" "" "(HP LaserJet 6l Gold Printer)"
+ Attribute "Product" "" "(HP LaserJet 6l Pro Printer)"
+ }
+ {
+ ModelName "HP LaserJet 6p"
+ Attribute "NickName" "" "HP LaserJet 6p, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 6p"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 6p;DES:hp laserjet 6p;"
+ PCFileName "hp-laserjet_6p.ppd"
+ Attribute "Product" "" "(HP LaserJet 6p Printer)"
+ }
+ {
+ ModelName "HP LaserJet 6mp"
+ Attribute "NickName" "" "HP LaserJet 6mp pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 6mp"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 6mp;DES:hp laserjet 6mp;"
+ PCFileName "hp-laserjet_6mp-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 6mp Printer)"
+ Attribute "Product" "" "(HP LaserJet 6mp Se Printer)"
+ Attribute "Product" "" "(HP LaserJet 6mp Xi Printer)"
+ }
+ {
+ ModelName "HP LaserJet 1015"
+ Attribute "NickName" "" "HP LaserJet 1015, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 1015"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 1015;DES:hp laserjet 1015;"
+ PCFileName "hp-laserjet_1015.ppd"
+ Attribute "Product" "" "(HP LaserJet 1015 Printer)"
+ }
+ {
+ ModelName "HP LaserJet 1022nw"
+ Attribute "NickName" "" "HP LaserJet 1022nw pcl3, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LaserJet 1022nw"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 1022nw;DES:hp laserjet 1022nw;"
+ PCFileName "hp-laserjet_1022nw-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 1022nw Printer)"
+ }
+ {
+ ModelName "HP LaserJet 1022n"
+ Attribute "NickName" "" "HP LaserJet 1022n pcl3, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LaserJet 1022n"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 1022n;DES:hp laserjet 1022n;"
+ PCFileName "hp-laserjet_1022n-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 1022n Printer)"
+ Attribute "Product" "" "(HP LaserJet 1022nxi Printer)"
+ }
+ {
+ ModelName "HP LaserJet 1022"
+ Attribute "NickName" "" "HP LaserJet 1022 pcl3, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LaserJet 1022"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 1022;DES:hp laserjet 1022;"
+ PCFileName "hp-laserjet_1022-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 1022 Printer)"
+ }
+ {
+ ModelName "HP LaserJet 1100a"
+ Attribute "NickName" "" "HP LaserJet 1100a, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 1100a"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 1100a;DES:hp laserjet 1100a;"
+ PCFileName "hp-laserjet_1100a.ppd"
+ Attribute "Product" "" "(HP LaserJet 1100a All-in-one Printer)"
+ Attribute "Product" "" "(HP LaserJet 1100a Se All-in-one Printer)"
+ }
+ {
+ ModelName "HP LaserJet 1100"
+ Attribute "NickName" "" "HP LaserJet 1100, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 1100"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 1100;DES:hp laserjet 1100;"
+ PCFileName "hp-laserjet_1100.ppd"
+ Attribute "Product" "" "(HP LaserJet 1100 Printer)"
+ Attribute "Product" "" "(HP LaserJet 1100se Printer)"
+ Attribute "Product" "" "(HP LaserJet 1100xi Printer)"
+ }
+ {
+ ModelName "HP LaserJet 1100xi"
+ Attribute "NickName" "" "HP LaserJet 1100xi, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 1100xi"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 1100xi;DES:hp laserjet 1100xi;"
+ PCFileName "hp-laserjet_1100xi.ppd"
+ Attribute "Product" "" "(HP LaserJet 1100a Xi All-in-one Printer)"
+ }
+ {
+ ModelName "HP LaserJet 1150"
+ Attribute "NickName" "" "HP LaserJet 1150, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 1150"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 1150;DES:hp laserjet 1150;"
+ PCFileName "hp-laserjet_1150.ppd"
+ Attribute "Product" "" "(HP LaserJet 1150 Printer)"
+ }
+ {
+ ModelName "HP LaserJet 1160"
+ Attribute "NickName" "" "HP LaserJet 1160, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 1160"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 1160;DES:hp laserjet 1160;"
+ PCFileName "hp-laserjet_1160.ppd"
+ Attribute "Product" "" "(HP LaserJet 1160 Printer)"
+ Attribute "Product" "" "(HP LaserJet 1160le Printer)"
+ }
+ {
+ ModelName "HP LaserJet 1160 Series"
+ Attribute "NickName" "" "HP LaserJet 1160 Series, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 1160 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 1160 series;DES:hp laserjet 1160 series;"
+ PCFileName "hp-laserjet_1160_series.ppd"
+ Attribute "Product" "" "(HP LaserJet 1160 Series Printer)"
+ }
+ {
+ ModelName "HP LaserJet 1200"
+ Attribute "NickName" "" "HP LaserJet 1200 pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 1200"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 1200;DES:hp laserjet 1200;"
+ PCFileName "hp-laserjet_1200-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 1200 Printer)"
+ Attribute "Product" "" "(HP LaserJet 1200se Printer)"
+ }
+ {
+ ModelName "HP LaserJet 1200n"
+ Attribute "NickName" "" "HP LaserJet 1200n, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 1200n"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 1200n;DES:hp laserjet 1200n;"
+ PCFileName "hp-laserjet_1200n.ppd"
+ Attribute "Product" "" "(HP LaserJet 1200n Printer)"
+ }
+ {
+ ModelName "HP LaserJet 1220se"
+ Attribute "NickName" "" "HP LaserJet 1220se, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 1220se"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 1220se;DES:hp laserjet 1220se;"
+ PCFileName "hp-laserjet_1220se.ppd"
+ Attribute "Product" "" "(HP LaserJet 1220se All-in-one Printer)"
+ }
+ {
+ ModelName "HP LaserJet 1220"
+ Attribute "NickName" "" "HP LaserJet 1220 pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 1220"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 1220;DES:hp laserjet 1220;"
+ PCFileName "hp-laserjet_1220-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 1220 All-in-one Printer)"
+ }
+ {
+ ModelName "HP LaserJet 1300"
+ Attribute "NickName" "" "HP LaserJet 1300 pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 1300"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 1300;DES:hp laserjet 1300;"
+ PCFileName "hp-laserjet_1300-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 1300 Printer)"
+ Attribute "Product" "" "(HP LaserJet 1300t Printer)"
+ }
+ {
+ ModelName "HP LaserJet 1300n"
+ Attribute "NickName" "" "HP LaserJet 1300n pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 1300n"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 1300n;DES:hp laserjet 1300n;"
+ PCFileName "hp-laserjet_1300n-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 1300n Printer)"
+ }
+ {
+ ModelName "HP LaserJet 1300xi"
+ Attribute "NickName" "" "HP LaserJet 1300xi pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 1300xi"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 1300xi;DES:hp laserjet 1300xi;"
+ PCFileName "hp-laserjet_1300xi-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 1300xi Printer)"
+ }
+ {
+ ModelName "HP LaserJet 1320 Series"
+ Attribute "NickName" "" "HP LaserJet 1320 Series pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 1320 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 1320 series;DES:hp laserjet 1320 series;"
+ PCFileName "hp-laserjet_1320_series-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 1320 Series Printer)"
+ }
+ {
+ ModelName "HP LaserJet 1320n"
+ Attribute "NickName" "" "HP LaserJet 1320n, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 1320n"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 1320n;DES:hp laserjet 1320n;"
+ PCFileName "hp-laserjet_1320n.ppd"
+ Attribute "Product" "" "(HP LaserJet 1320n Printer)"
+ }
+ {
+ ModelName "HP LaserJet 1320tn"
+ Attribute "NickName" "" "HP LaserJet 1320tn, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 1320tn"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 1320tn;DES:hp laserjet 1320tn;"
+ PCFileName "hp-laserjet_1320tn.ppd"
+ Attribute "Product" "" "(HP LaserJet 1320tn Printer)"
+ }
+ {
+ ModelName "HP LaserJet 1320"
+ Attribute "NickName" "" "HP LaserJet 1320, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 1320"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 1320;DES:hp laserjet 1320;"
+ PCFileName "hp-laserjet_1320.ppd"
+ Attribute "Product" "" "(HP LaserJet 1320 Printer)"
+ Attribute "Product" "" "(HP LaserJet 1320t Printer)"
+ }
+ {
+ ModelName "HP LaserJet 1320nw"
+ Attribute "NickName" "" "HP LaserJet 1320nw, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 1320nw"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 1320nw;DES:hp laserjet 1320nw;"
+ PCFileName "hp-laserjet_1320nw.ppd"
+ Attribute "Product" "" "(HP LaserJet 1320nw Printer)"
+ }
+ {
+ ModelName "HP LaserJet p1505n"
+ Attribute "NickName" "" "HP LaserJet p1505n pcl3, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LaserJet p1505n"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet p1505n;DES:hp laserjet p1505n;"
+ PCFileName "hp-laserjet_p1505n-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet p1505n Printer)"
+ }
+ {
+ ModelName "HP LaserJet m1522nf MFP"
+ Attribute "NickName" "" "HP LaserJet m1522nf MFP pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet m1522nf MFP"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet m1522nf mfp;DES:hp laserjet m1522nf mfp;"
+ PCFileName "hp-laserjet_m1522nf_mfp-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet m1522nf Multifunction Printer)"
+ }
+ {
+ ModelName "HP LaserJet m1536dnf MFP"
+ Attribute "NickName" "" "HP LaserJet m1536dnf MFP pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet m1536dnf MFP"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet m1536dnf mfp;DES:hp laserjet m1536dnf mfp;"
+ PCFileName "hp-laserjet_m1536dnf_mfp-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet m1536dnf MFP)"
+ }
+ {
+ ModelName "HP LaserJet m1537dnf MFP"
+ Attribute "NickName" "" "HP LaserJet m1537dnf MFP pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet m1537dnf MFP"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet m1537dnf mfp;DES:hp laserjet m1537dnf mfp;"
+ PCFileName "hp-laserjet_m1537dnf_mfp-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet m1537dnf MFP)"
+ }
+ {
+ ModelName "HP LaserJet m1538dnf MFP"
+ Attribute "NickName" "" "HP LaserJet m1538dnf MFP pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet m1538dnf MFP"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet m1538dnf mfp;DES:hp laserjet m1538dnf mfp;"
+ PCFileName "hp-laserjet_m1538dnf_mfp-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet m1538dnf MFP)"
+ }
+ {
+ ModelName "HP LaserJet m1539dnf MFP"
+ Attribute "NickName" "" "HP LaserJet m1539dnf MFP pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet m1539dnf MFP"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet m1539dnf mfp;DES:hp laserjet m1539dnf mfp;"
+ PCFileName "hp-laserjet_m1539dnf_mfp-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet m1539dnf MFP)"
+ }
+ {
+ ModelName "HP LaserJet p2014"
+ Attribute "NickName" "" "HP LaserJet p2014 pcl3, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LaserJet p2014"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet p2014;DES:hp laserjet p2014;"
+ PCFileName "hp-laserjet_p2014-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet p2014 Printer)"
+ }
+ {
+ ModelName "HP LaserJet p2014n"
+ Attribute "NickName" "" "HP LaserJet p2014n pcl3, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LaserJet p2014n"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet p2014n;DES:hp laserjet p2014n;"
+ PCFileName "hp-laserjet_p2014n-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet p2014n Printer)"
+ }
+ {
+ ModelName "HP LaserJet p2015dn Series"
+ Attribute "NickName" "" "HP LaserJet p2015dn Series, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet p2015dn Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet p2015dn series;DES:hp laserjet p2015dn series;"
+ PCFileName "hp-laserjet_p2015dn_series.ppd"
+ Attribute "Product" "" "(HP LaserJet p2015dn Printer)"
+ }
+ {
+ ModelName "HP LaserJet p2015x Series"
+ Attribute "NickName" "" "HP LaserJet p2015x Series, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet p2015x Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet p2015x series;DES:hp laserjet p2015x series;"
+ PCFileName "hp-laserjet_p2015x_series.ppd"
+ Attribute "Product" "" "(HP LaserJet p2015x Printer)"
+ }
+ {
+ ModelName "HP LaserJet p2015d Series"
+ Attribute "NickName" "" "HP LaserJet p2015d Series, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet p2015d Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet p2015d series;DES:hp laserjet p2015d series;"
+ PCFileName "hp-laserjet_p2015d_series.ppd"
+ Attribute "Product" "" "(HP LaserJet p2015d Printer)"
+ }
+ {
+ ModelName "HP LaserJet p2015 Series"
+ Attribute "NickName" "" "HP LaserJet p2015 Series pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet p2015 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet p2015 series;DES:hp laserjet p2015 series;"
+ PCFileName "hp-laserjet_p2015_series-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet p2015 Printer)"
+ }
+ {
+ ModelName "HP LaserJet p2015n Series"
+ Attribute "NickName" "" "HP LaserJet p2015n Series, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet p2015n Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet p2015n series;DES:hp laserjet p2015n series;"
+ PCFileName "hp-laserjet_p2015n_series.ppd"
+ Attribute "Product" "" "(HP LaserJet p2015n Printer)"
+ }
+ {
+ ModelName "HP LaserJet p2035n"
+ Attribute "NickName" "" "HP LaserJet p2035n pcl3, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LaserJet p2035n"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet p2035n;DES:hp laserjet p2035n;"
+ PCFileName "hp-laserjet_p2035n-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet p2035n Printer)"
+ }
+ {
+ ModelName "HP LaserJet p2035"
+ Attribute "NickName" "" "HP LaserJet p2035 pcl3, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LaserJet p2035"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet p2035;DES:hp laserjet p2035;"
+ PCFileName "hp-laserjet_p2035-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet p2035 Printer)"
+ }
+ {
+ ModelName "HP LaserJet p2055dn"
+ Attribute "NickName" "" "HP LaserJet p2055dn pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet p2055dn"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet p2055dn;DES:hp laserjet p2055dn;"
+ PCFileName "hp-laserjet_p2055dn-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet p2055dn Printer)"
+ }
+ {
+ ModelName "HP LaserJet p2055"
+ Attribute "NickName" "" "HP LaserJet p2055 pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet p2055"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet p2055;DES:hp laserjet p2055;"
+ PCFileName "hp-laserjet_p2055-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet p2055 Printer)"
+ }
+ {
+ ModelName "HP LaserJet p2055d"
+ Attribute "NickName" "" "HP LaserJet p2055d pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet p2055d"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet p2055d;DES:hp laserjet p2055d;"
+ PCFileName "hp-laserjet_p2055d-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet p2055d Printer)"
+ }
+ {
+ ModelName "HP LaserJet p2055x"
+ Attribute "NickName" "" "HP LaserJet p2055x pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet p2055x"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet p2055x;DES:hp laserjet p2055x;"
+ PCFileName "hp-laserjet_p2055x-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet p2055x Printer)"
+ }
+ {
+ ModelName "HP LaserJet 2100"
+ Attribute "NickName" "" "HP LaserJet 2100, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 2100"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 2100;DES:hp laserjet 2100;"
+ PCFileName "hp-laserjet_2100.ppd"
+ Attribute "Product" "" "(HP LaserJet 2100 Printer)"
+ Attribute "Product" "" "(HP LaserJet 2100m Printer)"
+ Attribute "Product" "" "(HP LaserJet 2100se Printer)"
+ Attribute "Product" "" "(HP LaserJet 2100tn Printer)"
+ Attribute "Product" "" "(HP LaserJet 2100xi Printer)"
+ }
+ {
+ ModelName "HP LaserJet 2100 Series"
+ Attribute "NickName" "" "HP LaserJet 2100 Series pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 2100 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 2100 series;DES:hp laserjet 2100 series;"
+ PCFileName "hp-laserjet_2100_series-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 2100 Series Printer)"
+ }
+ {
+ ModelName "HP LaserJet 2200 Series"
+ Attribute "NickName" "" "HP LaserJet 2200 Series, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 2200 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 2200 series;DES:hp laserjet 2200 series;"
+ PCFileName "hp-laserjet_2200_series.ppd"
+ Attribute "Product" "" "(HP LaserJet 2200 Series Printer)"
+ }
+ {
+ ModelName "HP LaserJet 2200"
+ Attribute "NickName" "" "HP LaserJet 2200 pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 2200"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 2200;DES:hp laserjet 2200;"
+ PCFileName "hp-laserjet_2200-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 2200 Printer)"
+ Attribute "Product" "" "(HP LaserJet 2200d Printer)"
+ Attribute "Product" "" "(HP LaserJet 2200dn Printer)"
+ Attribute "Product" "" "(HP LaserJet 2200dse Printer)"
+ Attribute "Product" "" "(HP LaserJet 2200dt Printer)"
+ Attribute "Product" "" "(HP LaserJet 2200dtn Printer)"
+ }
+ {
+ ModelName "HP LaserJet 2300"
+ Attribute "NickName" "" "HP LaserJet 2300 pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 2300"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 2300;DES:hp laserjet 2300;"
+ PCFileName "hp-laserjet_2300-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 2300 Printer)"
+ Attribute "Product" "" "(HP LaserJet 2300n Printer)"
+ Attribute "Product" "" "(HP LaserJet 2300d Printer)"
+ Attribute "Product" "" "(HP LaserJet 2300dn Printer)"
+ Attribute "Product" "" "(HP LaserJet 2300dtn Printer)"
+ Attribute "Product" "" "(HP LaserJet 2300l Printer)"
+ }
+ {
+ ModelName "HP LaserJet 2300 Series"
+ Attribute "NickName" "" "HP LaserJet 2300 Series, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 2300 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 2300 series;DES:hp laserjet 2300 series;"
+ PCFileName "hp-laserjet_2300_series.ppd"
+ Attribute "Product" "" "(HP LaserJet 2300 Series Printer)"
+ }
+ {
+ ModelName "HP LaserJet 2410"
+ Attribute "NickName" "" "HP LaserJet 2410 pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 2410"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 2410;DES:hp laserjet 2410;"
+ PCFileName "hp-laserjet_2410-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 2410 Printer)"
+ }
+ {
+ ModelName "HP LaserJet 2420"
+ Attribute "NickName" "" "HP LaserJet 2420 pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 2420"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 2420;DES:hp laserjet 2420;"
+ PCFileName "hp-laserjet_2420-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 2420 Printer)"
+ Attribute "Product" "" "(HP LaserJet 2420d Printer)"
+ Attribute "Product" "" "(HP LaserJet 2420dn Printer)"
+ Attribute "Product" "" "(HP LaserJet 2420n Printer)"
+ }
+ {
+ ModelName "HP LaserJet 2430"
+ Attribute "NickName" "" "HP LaserJet 2430 pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 2430"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 2430;DES:hp laserjet 2430;"
+ PCFileName "hp-laserjet_2430-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 2430t Printer)"
+ Attribute "Product" "" "(HP LaserJet 2430 Printer)"
+ Attribute "Product" "" "(HP LaserJet 2430dtn Printer)"
+ Attribute "Product" "" "(HP LaserJet 2430n Printer)"
+ Attribute "Product" "" "(HP LaserJet 2430tn Printer)"
+ }
+ {
+ ModelName "HP LaserJet m2727 MFP"
+ Attribute "NickName" "" "HP LaserJet m2727 MFP pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet m2727 MFP"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet m2727 mfp;DES:hp laserjet m2727 mfp;"
+ PCFileName "hp-laserjet_m2727_mfp-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet m2727 Multifunction Printer)"
+ }
+ {
+ ModelName "HP LaserJet p3004"
+ Attribute "NickName" "" "HP LaserJet p3004 pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet p3004"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet p3004;DES:hp laserjet p3004;"
+ PCFileName "hp-laserjet_p3004-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet p3004 Printer)"
+ }
+ {
+ ModelName "HP LaserJet p3005"
+ Attribute "NickName" "" "HP LaserJet p3005 pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet p3005"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet p3005;DES:hp laserjet p3005;"
+ PCFileName "hp-laserjet_p3005-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet p3005 Printer)"
+ Attribute "Product" "" "(HP LaserJet p3005d Printer)"
+ Attribute "Product" "" "(HP LaserJet p3005dn Printer)"
+ Attribute "Product" "" "(HP LaserJet p3005n Printer)"
+ Attribute "Product" "" "(HP LaserJet p3005x Printer)"
+ Attribute "Product" "" "(HP LaserJet p3005dtn Printer)"
+ }
+ {
+ ModelName "HP LaserJet p3010 Series"
+ Attribute "NickName" "" "HP LaserJet p3010 Series pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet p3010 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet p3010 series;DES:hp laserjet p3010 series;"
+ PCFileName "hp-laserjet_p3010_series-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet p3015 Printer)"
+ Attribute "Product" "" "(HP LaserJet p3011 Printer)"
+ }
+ {
+ ModelName "HP LaserJet 3015"
+ Attribute "NickName" "" "HP LaserJet 3015 pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 3015"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 3015;DES:hp laserjet 3015;"
+ PCFileName "hp-laserjet_3015-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 3015 All-in-one Printer)"
+ }
+ {
+ ModelName "HP LaserJet 3020"
+ Attribute "NickName" "" "HP LaserJet 3020 pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 3020"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 3020;DES:hp laserjet 3020;"
+ PCFileName "hp-laserjet_3020-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 3020 All-in-one Printer)"
+ }
+ {
+ ModelName "HP LaserJet m3027 MFP"
+ Attribute "NickName" "" "HP LaserJet m3027 MFP pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet m3027 MFP"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet m3027 mfp;DES:hp laserjet m3027 mfp;"
+ PCFileName "hp-laserjet_m3027_mfp-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet m3027 Multifunction Printer)"
+ Attribute "Product" "" "(HP LaserJet m3027x Multifunction Printer)"
+ }
+ {
+ ModelName "HP LaserJet 3030"
+ Attribute "NickName" "" "HP LaserJet 3030 pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 3030"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 3030;DES:hp laserjet 3030;"
+ PCFileName "hp-laserjet_3030-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 3030 All-in-one Printer)"
+ }
+ {
+ ModelName "HP LaserJet 3050"
+ Attribute "NickName" "" "HP LaserJet 3050 pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 3050"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 3050;DES:hp laserjet 3050;"
+ PCFileName "hp-laserjet_3050-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 3050 All-in-one Printer)"
+ Attribute "Product" "" "(HP LaserJet 3050z All-in-one Printer)"
+ }
+ {
+ ModelName "HP LaserJet 3052"
+ Attribute "NickName" "" "HP LaserJet 3052 pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 3052"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 3052;DES:hp laserjet 3052;"
+ PCFileName "hp-laserjet_3052-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 3052 All-in-one Printer)"
+ }
+ {
+ ModelName "HP LaserJet 3055"
+ Attribute "NickName" "" "HP LaserJet 3055, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 3055"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 3055;DES:hp laserjet 3055;"
+ PCFileName "hp-laserjet_3055.ppd"
+ Attribute "Product" "" "(HP LaserJet 3055 All-in-one Printer)"
+ }
+ {
+ ModelName "HP LaserJet 3100"
+ Attribute "NickName" "" "HP LaserJet 3100, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 3100"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 3100;DES:hp laserjet 3100;"
+ PCFileName "hp-laserjet_3100.ppd"
+ Attribute "Product" "" "(HP LaserJet 3100 All-in-one Printer)"
+ Attribute "Product" "" "(HP LaserJet 3100se All-in-one Printer)"
+ Attribute "Product" "" "(HP LaserJet 3100xi All-in-one Printer)"
+ }
+ {
+ ModelName "HP LaserJet 3150"
+ Attribute "NickName" "" "HP LaserJet 3150, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 3150"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 3150;DES:hp laserjet 3150;"
+ PCFileName "hp-laserjet_3150.ppd"
+ Attribute "Product" "" "(HP LaserJet 3150xi All-in-one Printer)"
+ Attribute "Product" "" "(HP LaserJet 3150se All-in-one Printer)"
+ Attribute "Product" "" "(HP LaserJet 3150 All-in-one Printer)"
+ }
+ {
+ ModelName "HP LaserJet 3200m"
+ Attribute "NickName" "" "HP LaserJet 3200m pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 3200m"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 3200m;DES:hp laserjet 3200m;"
+ PCFileName "hp-laserjet_3200m-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 3200m All-in-one Printer)"
+ }
+ {
+ ModelName "HP LaserJet 3200se"
+ Attribute "NickName" "" "HP LaserJet 3200se, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 3200se"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 3200se;DES:hp laserjet 3200se;"
+ PCFileName "hp-laserjet_3200se.ppd"
+ Attribute "Product" "" "(HP LaserJet 3200 All-in-one Printer)"
+ }
+ {
+ ModelName "HP LaserJet 3200"
+ Attribute "NickName" "" "HP LaserJet 3200, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 3200"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 3200;DES:hp laserjet 3200;"
+ PCFileName "hp-laserjet_3200.ppd"
+ Attribute "Product" "" "(HP LaserJet 3200 All-in-one Printer)"
+ }
+ {
+ ModelName "HP LaserJet 3300 3310 3320"
+ Attribute "NickName" "" "HP LaserJet 3300 3310 3320 pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 3300 3310 3320"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 3300 3310 3320;DES:hp laserjet 3300 3310 3320;"
+ PCFileName "hp-laserjet_3300_3310_3320-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 3300 Multifunction Printer)"
+ Attribute "Product" "" "(HP LaserJet 3310 Digital Printer Copier)"
+ Attribute "Product" "" "(HP LaserJet 3320n Multifunction Printer)"
+ Attribute "Product" "" "(HP LaserJet 3320 Multifunction Printer)"
+ Attribute "Product" "" "(HP LaserJet 3330 Multifunction Printer)"
+ }
+ {
+ ModelName "HP LaserJet 3330"
+ Attribute "NickName" "" "HP LaserJet 3330, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 3330"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 3330;DES:hp laserjet 3330;"
+ PCFileName "hp-laserjet_3330.ppd"
+ Attribute "Product" "" "(HP LaserJet 3330 Multifunction Printer)"
+ }
+ {
+ ModelName "HP LaserJet 3380"
+ Attribute "NickName" "" "HP LaserJet 3380 pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 3380"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 3380;DES:hp laserjet 3380;"
+ PCFileName "hp-laserjet_3380-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 3380 All-in-one Printer)"
+ }
+ {
+ ModelName "HP LaserJet 3390"
+ Attribute "NickName" "" "HP LaserJet 3390 pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 3390"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 3390;DES:hp laserjet 3390;"
+ PCFileName "hp-laserjet_3390-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 3390 All-in-one Printer)"
+ }
+ {
+ ModelName "HP LaserJet 3392"
+ Attribute "NickName" "" "HP LaserJet 3392, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 3392"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 3392;DES:hp laserjet 3392;"
+ PCFileName "hp-laserjet_3392.ppd"
+ Attribute "Product" "" "(HP LaserJet 3392 All-in-one Printer)"
+ }
+ {
+ ModelName "HP LaserJet 4000 Series"
+ Attribute "NickName" "" "HP LaserJet 4000 Series pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 4000 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 4000 series;DES:hp laserjet 4000 series;"
+ PCFileName "hp-laserjet_4000_series-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 4000 Printer)"
+ Attribute "Product" "" "(HP LaserJet 4000n Printer)"
+ Attribute "Product" "" "(HP LaserJet 4000se Printer)"
+ Attribute "Product" "" "(HP LaserJet 4000t Printer)"
+ Attribute "Product" "" "(HP LaserJet 4000tn Printer)"
+ }
+ {
+ ModelName "HP LaserJet p4014n"
+ Attribute "NickName" "" "HP LaserJet p4014n, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet p4014n"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet p4014n;DES:hp laserjet p4014n;"
+ PCFileName "hp-laserjet_p4014n.ppd"
+ Attribute "Product" "" "(HP LaserJet p4014n Printer)"
+ }
+ {
+ ModelName "HP LaserJet p4014dn"
+ Attribute "NickName" "" "HP LaserJet p4014dn, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet p4014dn"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet p4014dn;DES:hp laserjet p4014dn;"
+ PCFileName "hp-laserjet_p4014dn.ppd"
+ Attribute "Product" "" "(HP LaserJet p4014dn Printer)"
+ }
+ {
+ ModelName "HP LaserJet p4014"
+ Attribute "NickName" "" "HP LaserJet p4014, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet p4014"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet p4014;DES:hp laserjet p4014;"
+ PCFileName "hp-laserjet_p4014.ppd"
+ Attribute "Product" "" "(HP LaserJet p4014 Printer)"
+ }
+ {
+ ModelName "HP LaserJet p4015tn"
+ Attribute "NickName" "" "HP LaserJet p4015tn, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet p4015tn"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet p4015tn;DES:hp laserjet p4015tn;"
+ PCFileName "hp-laserjet_p4015tn.ppd"
+ Attribute "Product" "" "(HP LaserJet p4015tn Printer)"
+ }
+ {
+ ModelName "HP LaserJet p4015"
+ Attribute "NickName" "" "HP LaserJet p4015, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet p4015"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet p4015;DES:hp laserjet p4015;"
+ PCFileName "hp-laserjet_p4015.ppd"
+ Attribute "Product" "" "(HP LaserJet p4015 Printer)"
+ }
+ {
+ ModelName "HP LaserJet p4015x"
+ Attribute "NickName" "" "HP LaserJet p4015x, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet p4015x"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet p4015x;DES:hp laserjet p4015x;"
+ PCFileName "hp-laserjet_p4015x.ppd"
+ Attribute "Product" "" "(HP LaserJet p4015x Printer)"
+ }
+ {
+ ModelName "HP LaserJet p4015n"
+ Attribute "NickName" "" "HP LaserJet p4015n, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet p4015n"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet p4015n;DES:hp laserjet p4015n;"
+ PCFileName "hp-laserjet_p4015n.ppd"
+ Attribute "Product" "" "(HP LaserJet p4015n Printer)"
+ }
+ {
+ ModelName "HP LaserJet p4015dn"
+ Attribute "NickName" "" "HP LaserJet p4015dn, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet p4015dn"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet p4015dn;DES:hp laserjet p4015dn;"
+ PCFileName "hp-laserjet_p4015dn.ppd"
+ Attribute "Product" "" "(HP LaserJet p4015dn Printer)"
+ }
+ {
+ ModelName "HP LaserJet 4050 Series"
+ Attribute "NickName" "" "HP LaserJet 4050 Series pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 4050 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 4050 series;DES:hp laserjet 4050 series;"
+ PCFileName "hp-laserjet_4050_series-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 4050 Printer)"
+ Attribute "Product" "" "(HP LaserJet 4050n Printer)"
+ Attribute "Product" "" "(HP LaserJet 4050se Printer)"
+ Attribute "Product" "" "(HP LaserJet 4050t Printer)"
+ Attribute "Product" "" "(HP LaserJet 4050tn Printer)"
+ }
+ {
+ ModelName "HP LaserJet 4100 MFP"
+ Attribute "NickName" "" "HP LaserJet 4100 MFP pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 4100 MFP"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 4100 mfp;DES:hp laserjet 4100 mfp;"
+ PCFileName "hp-laserjet_4100_mfp-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 4100 Multifunction Printer)"
+ Attribute "Product" "" "(HP LaserJet 4101 Multifunction Printer)"
+ }
+ {
+ ModelName "HP LaserJet 4100 Series"
+ Attribute "NickName" "" "HP LaserJet 4100 Series pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 4100 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 4100 series;DES:hp laserjet 4100 series;"
+ PCFileName "hp-laserjet_4100_series-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 410dtn Printer)"
+ Attribute "Product" "" "(HP LaserJet 4100tn Printer)"
+ Attribute "Product" "" "(HP LaserJet 4100n Printer)"
+ Attribute "Product" "" "(HP LaserJet 4100 Printer)"
+ }
+ {
+ ModelName "HP LaserJet 4150 Series"
+ Attribute "NickName" "" "HP LaserJet 4150 Series, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 4150 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 4150 series;DES:hp laserjet 4150 series;"
+ PCFileName "hp-laserjet_4150_series.ppd"
+ Attribute "Product" "" "(HP LaserJet 4150 Printer)"
+ }
+ {
+ ModelName "HP LaserJet 4200"
+ Attribute "NickName" "" "HP LaserJet 4200 pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 4200"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 4200;DES:hp laserjet 4200;"
+ PCFileName "hp-laserjet_4200-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 4200 Printer)"
+ Attribute "Product" "" "(HP LaserJet 4200l Printer)"
+ Attribute "Product" "" "(HP LaserJet 4200ln Printer)"
+ Attribute "Product" "" "(HP LaserJet 4200lvn Printer)"
+ Attribute "Product" "" "(HP LaserJet 4200dtn Printer)"
+ Attribute "Product" "" "(HP LaserJet 4200dtns Printer)"
+ Attribute "Product" "" "(HP LaserJet 4200dtnsl Printer)"
+ Attribute "Product" "" "(HP LaserJet 4200n Printer)"
+ Attribute "Product" "" "(HP LaserJet 4200tn Printer)"
+ }
+ {
+ ModelName "HP LaserJet 4240"
+ Attribute "NickName" "" "HP LaserJet 4240 pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 4240"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 4240;DES:hp laserjet 4240;"
+ PCFileName "hp-laserjet_4240-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 4240n Printer)"
+ Attribute "Product" "" "(HP LaserJet 4240 Printer)"
+ }
+ {
+ ModelName "HP LaserJet 4250"
+ Attribute "NickName" "" "HP LaserJet 4250 pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 4250"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 4250;DES:hp laserjet 4250;"
+ PCFileName "hp-laserjet_4250-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 4250 Printer)"
+ Attribute "Product" "" "(HP LaserJet 4250dtn Printer)"
+ Attribute "Product" "" "(HP LaserJet 4250dtnsl Printer)"
+ Attribute "Product" "" "(HP LaserJet 4250n Printer)"
+ Attribute "Product" "" "(HP LaserJet 4250tn Printer)"
+ }
+ {
+ ModelName "HP LaserJet 4300"
+ Attribute "NickName" "" "HP LaserJet 4300 pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 4300"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 4300;DES:hp laserjet 4300;"
+ PCFileName "hp-laserjet_4300-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 4300 Printer)"
+ Attribute "Product" "" "(HP LaserJet 4300dtn Printer)"
+ Attribute "Product" "" "(HP LaserJet 4300dtns Printer)"
+ Attribute "Product" "" "(HP LaserJet 4300dtnsl Printer)"
+ Attribute "Product" "" "(HP LaserJet 4300n Printer)"
+ Attribute "Product" "" "(HP LaserJet 4300tn Printer)"
+ }
+ {
+ ModelName "HP LaserJet 4345 MFP"
+ Attribute "NickName" "" "HP LaserJet 4345 MFP pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 4345 MFP"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 4345 mfp;DES:hp laserjet 4345 mfp;"
+ PCFileName "hp-laserjet_4345_mfp-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 4345 Multifunction Printer)"
+ Attribute "Product" "" "(HP LaserJet 4345x Multifunction Printer)"
+ Attribute "Product" "" "(HP LaserJet 4345xs Multifunction Printer)"
+ Attribute "Product" "" "(HP LaserJet 4345xm Multifunction Printer)"
+ }
+ {
+ ModelName "HP LaserJet m4345 MFP"
+ Attribute "NickName" "" "HP LaserJet m4345 MFP pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet m4345 MFP"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet m4345 mfp;DES:hp laserjet m4345 mfp;"
+ PCFileName "hp-laserjet_m4345_mfp-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet m4345 Multifunction Printer)"
+ Attribute "Product" "" "(HP LaserJet m4345x Multifunction Printer)"
+ Attribute "Product" "" "(HP LaserJet m4345xs Multifunction Printer)"
+ Attribute "Product" "" "(HP LaserJet m4345xm Multifunction Printer)"
+ }
+ {
+ ModelName "HP LaserJet m4349 MFP"
+ Attribute "NickName" "" "HP LaserJet m4349 MFP pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet m4349 MFP"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet m4349 mfp;DES:hp laserjet m4349 mfp;"
+ PCFileName "hp-laserjet_m4349_mfp-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet m4349 MFP)"
+ }
+ {
+ ModelName "HP LaserJet 4350"
+ Attribute "NickName" "" "HP LaserJet 4350 pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 4350"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 4350;DES:hp laserjet 4350;"
+ PCFileName "hp-laserjet_4350-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 4350 Printer)"
+ Attribute "Product" "" "(HP LaserJet 4350dtn Printer)"
+ Attribute "Product" "" "(HP LaserJet 4350dtnsl Printer)"
+ Attribute "Product" "" "(HP LaserJet 4350n Printer)"
+ Attribute "Product" "" "(HP LaserJet 4350tn Printer)"
+ }
+ {
+ ModelName "HP LaserJet p4515tn"
+ Attribute "NickName" "" "HP LaserJet p4515tn, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet p4515tn"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet p4515tn;DES:hp laserjet p4515tn;"
+ PCFileName "hp-laserjet_p4515tn.ppd"
+ Attribute "Product" "" "(HP LaserJet p4515tn Printer)"
+ }
+ {
+ ModelName "HP LaserJet p4515n"
+ Attribute "NickName" "" "HP LaserJet p4515n, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet p4515n"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet p4515n;DES:hp laserjet p4515n;"
+ PCFileName "hp-laserjet_p4515n.ppd"
+ Attribute "Product" "" "(HP LaserJet p4515n Printer)"
+ }
+ {
+ ModelName "HP LaserJet p4515xm"
+ Attribute "NickName" "" "HP LaserJet p4515xm, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet p4515xm"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet p4515xm;DES:hp laserjet p4515xm;"
+ PCFileName "hp-laserjet_p4515xm.ppd"
+ Attribute "Product" "" "(HP LaserJet p4515xm Printer)"
+ }
+ {
+ ModelName "HP LaserJet p4515"
+ Attribute "NickName" "" "HP LaserJet p4515, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet p4515"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet p4515;DES:hp laserjet p4515;"
+ PCFileName "hp-laserjet_p4515.ppd"
+ Attribute "Product" "" "(HP LaserJet p4515 Printer)"
+ }
+ {
+ ModelName "HP LaserJet p4515x"
+ Attribute "NickName" "" "HP LaserJet p4515x, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet p4515x"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet p4515x;DES:hp laserjet p4515x;"
+ PCFileName "hp-laserjet_p4515x.ppd"
+ Attribute "Product" "" "(HP LaserJet p4515x Printer)"
+ }
+ {
+ ModelName "HP LaserJet 5000 Series"
+ Attribute "NickName" "" "HP LaserJet 5000 Series pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 5000 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 5000 series;DES:hp laserjet 5000 series;"
+ PCFileName "hp-laserjet_5000_series-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 5000 Series Printer)"
+ }
+ {
+ ModelName "HP LaserJet 5200lx"
+ Attribute "NickName" "" "HP LaserJet 5200lx, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 5200lx"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 5200lx;DES:hp laserjet 5200lx;"
+ PCFileName "hp-laserjet_5200lx.ppd"
+ Attribute "Product" "" "(HP LaserJet 5200lx Printer)"
+ }
+ {
+ ModelName "HP LaserJet 8000 Series"
+ Attribute "NickName" "" "HP LaserJet 8000 Series pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 8000 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 8000 series;DES:hp laserjet 8000 series;"
+ PCFileName "hp-laserjet_8000_series-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 8000 Series Printer)"
+ }
+ {
+ ModelName "HP LaserJet 8100 MFP"
+ Attribute "NickName" "" "HP LaserJet 8100 MFP, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 8100 MFP"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 8100 mfp;DES:hp laserjet 8100 mfp;"
+ PCFileName "hp-laserjet_8100_mfp.ppd"
+ Attribute "Product" "" "(HP LaserJet 8100 Multifunction Printer)"
+ }
+ {
+ ModelName "HP LaserJet 8150 MFP"
+ Attribute "NickName" "" "HP LaserJet 8150 MFP, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 8150 MFP"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 8150 mfp;DES:hp laserjet 8150 mfp;"
+ PCFileName "hp-laserjet_8150_mfp.ppd"
+ Attribute "Product" "" "(HP LaserJet 8150 Multifunction Printer)"
+ }
+ {
+ ModelName "HP LaserJet m9040 MFP"
+ Attribute "NickName" "" "HP LaserJet m9040 MFP pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet m9040 MFP"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet m9040 mfp;DES:hp laserjet m9040 mfp;"
+ PCFileName "hp-laserjet_m9040_mfp-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet m9040 Multifunction Printer)"
+ }
+ {
+ ModelName "HP LaserJet m9050 MFP"
+ Attribute "NickName" "" "HP LaserJet m9050 MFP pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet m9050 MFP"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet m9050 mfp;DES:hp laserjet m9050 mfp;"
+ PCFileName "hp-laserjet_m9050_mfp-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet m9050 Multifunction Printer)"
+ Attribute "Product" "" "(HP LaserJet m9059 Multifunction Printer)"
+ }
+ {
+ ModelName "HP LaserJet m9059 MFP"
+ Attribute "NickName" "" "HP LaserJet m9059 MFP pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet m9059 MFP"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet m9059 mfp;DES:hp laserjet m9059 mfp;"
+ PCFileName "hp-laserjet_m9059_mfp-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet m9059 MFP)"
+ }
+ {
+ UIConstraints "*OutputMode Best *MediaType"
+ // <%LJMono:300dpiOnly%>
+ {
+ ModelName "HP LaserJet 4ml"
+ Attribute "NickName" "" "HP LaserJet 4ml, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 4ml"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 4ml;DES:hp laserjet 4ml;"
+ PCFileName "hp-laserjet_4ml.ppd"
+ Attribute "Product" "" "(HP LaserJet 4ml Printer)"
+ }
+ {
+ ModelName "HP LaserJet 4l"
+ Attribute "NickName" "" "HP LaserJet 4l, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 4l"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 4l;DES:hp laserjet 4l;"
+ PCFileName "hp-laserjet_4l.ppd"
+ Attribute "Product" "" "(HP LaserJet 4l Printer)"
+ Attribute "Product" "" "(HP LaserJet 4l Pro Printer)"
+ Attribute "Product" "" "(HP LaserJet 4lc Printer)"
+ Attribute "Product" "" "(HP LaserJet 4ml Printer)"
+ }
+ }
+ } // End Supported media sizes.
+
+ {
+// Large
+ CustomMedia "SuperB/SuperB 13x19in" 936 1368 18 14 18 14 "<</cupsInteger0 16/PageSize[936 1368]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 16/PageSize[936 1368]/ImagingBBox null>>setpagedevice"
+ CustomMedia "B4/B4 257x364mm" 729 1033 18 14 18 14 "<</cupsInteger0 46/PageSize[729 1033]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 46/PageSize[729 1033]/ImagingBBox null>>setpagedevice"
+ CustomMedia "8k/8k 10.75x15.5in" 774 1116 18 14 18 14 "<</cupsInteger0 101/PageSize[774 1116]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[774 1116]/ImagingBBox null>>setpagedevice" // custom
+ CustomMedia "Ledger/Ledger 11x17in" 792 1224 18 14 18 14 "<</cupsInteger0 6/PageSize[792 1224]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 6/PageSize[792 1224]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A3/A3 297x420mm" 842 1190 18 14 18 14 "<</cupsInteger0 27/PageSize[842 1190]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 27/PageSize[842 1190]/ImagingBBox null>>setpagedevice"
+
+ // Custom page sizes from 1x4in to SuperB
+ HWMargins 18 14 18 14
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 936 1368
+
+ // <%LJMono:LargeFormatA3%>
+ {
+ ModelName "HP LaserJet 5si"
+ Attribute "NickName" "" "HP LaserJet 5si pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 5si"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 5si;DES:hp laserjet 5si;"
+ PCFileName "hp-laserjet_5si-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 5si Printer)"
+ Attribute "Product" "" "(HP LaserJet 5si Hm Printer)"
+ Attribute "Product" "" "(HP LaserJet 5si Mx Printer)"
+ Attribute "Product" "" "(HP LaserJet 5si Nx Printer)"
+ }
+ {
+ ModelName "HP LaserJet 5si Mopier"
+ Attribute "NickName" "" "HP LaserJet 5si Mopier pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 5si Mopier"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 5si mopier;DES:hp laserjet 5si mopier;"
+ PCFileName "hp-laserjet_5si_mopier-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 5si Mopier)"
+ Attribute "Product" "" "(HP LaserJet 5si Mopier Engine)"
+ }
+ {
+ ModelName "HP Mopier 240"
+ Attribute "NickName" "" "HP Mopier 240 pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Mopier 240"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp mopier 240;DES:hp mopier 240;"
+ PCFileName "hp-mopier_240-pcl3.ppd"
+ Attribute "Product" "" "(HP Mopier 240 Printer)"
+ }
+ {
+ ModelName "HP Mopier 320"
+ Attribute "NickName" "" "HP Mopier 320 pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Mopier 320"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp mopier 320;DES:hp mopier 320;"
+ PCFileName "hp-mopier_320-pcl3.ppd"
+ Attribute "Product" "" "(HP Mopier 320 Printer)"
+ }
+ {
+ ModelName "HP LaserJet m3035 MFP"
+ Attribute "NickName" "" "HP LaserJet m3035 MFP pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet m3035 MFP"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet m3035 mfp;DES:hp laserjet m3035 mfp;"
+ PCFileName "hp-laserjet_m3035_mfp-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet m3035 Multifunction Printer)"
+ Attribute "Product" "" "(HP LaserJet m3035xs Multifunction Printer)"
+ }
+ {
+ ModelName "HP LaserJet 5000"
+ Attribute "NickName" "" "HP LaserJet 5000, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 5000"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 5000;DES:hp laserjet 5000;"
+ PCFileName "hp-laserjet_5000.ppd"
+ Attribute "Product" "" "(HP LaserJet 5000 Printer)"
+ Attribute "Product" "" "(HP LaserJet 5000le Printer)"
+ Attribute "Product" "" "(HP LaserJet 5000dn Printer)"
+ Attribute "Product" "" "(HP LaserJet 5000gn Printer)"
+ Attribute "Product" "" "(HP LaserJet 5000n Printer)"
+ }
+ {
+ ModelName "HP LaserJet m5025 MFP"
+ Attribute "NickName" "" "HP LaserJet m5025 MFP pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet m5025 MFP"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet m5025 mfp;DES:hp laserjet m5025 mfp;"
+ PCFileName "hp-laserjet_m5025_mfp-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet m5025 Multifunction Printer)"
+ }
+ {
+ ModelName "HP LaserJet m5035 MFP"
+ Attribute "NickName" "" "HP LaserJet m5035 MFP pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet m5035 MFP"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet m5035 mfp;DES:hp laserjet m5035 mfp;"
+ PCFileName "hp-laserjet_m5035_mfp-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet m5035 Multifunction Printer)"
+ Attribute "Product" "" "(HP LaserJet m5035x Multifunction Printer)"
+ Attribute "Product" "" "(HP LaserJet m5035xs Multifunction Printer)"
+ }
+ {
+ ModelName "HP LaserJet m5039 MFP"
+ Attribute "NickName" "" "HP LaserJet m5039 MFP pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet m5039 MFP"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet m5039 mfp;DES:hp laserjet m5039 mfp;"
+ PCFileName "hp-laserjet_m5039_mfp-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet m5039 Multifunction Printer)"
+ }
+ {
+ ModelName "HP LaserJet 5100 Series"
+ Attribute "NickName" "" "HP LaserJet 5100 Series pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 5100 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 5100 series;DES:hp laserjet 5100 series;"
+ PCFileName "hp-laserjet_5100_series-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 5100 Printer)"
+ Attribute "Product" "" "(HP LaserJet 5100le Printer)"
+ Attribute "Product" "" "(HP LaserJet 5100dtn Printer)"
+ Attribute "Product" "" "(HP LaserJet 5100se Printer)"
+ Attribute "Product" "" "(HP LaserJet 5100tn Printer)"
+ }
+ {
+ ModelName "HP LaserJet 5200"
+ Attribute "NickName" "" "HP LaserJet 5200 pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 5200"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 5200;DES:hp laserjet 5200;"
+ PCFileName "hp-laserjet_5200-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 5200 Printer)"
+ Attribute "Product" "" "(HP LaserJet 5200n Printer)"
+ Attribute "Product" "" "(HP LaserJet 5200tn Printer)"
+ Attribute "Product" "" "(HP LaserJet 5200dtn Printer)"
+ }
+ {
+ ModelName "HP LaserJet 5200l"
+ Attribute "NickName" "" "HP LaserJet 5200l pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 5200l"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 5200l;DES:hp laserjet 5200l;"
+ PCFileName "hp-laserjet_5200l-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 5200l Printer)"
+ }
+ {
+ ModelName "HP LaserJet 8000"
+ Attribute "NickName" "" "HP LaserJet 8000, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 8000"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 8000;DES:hp laserjet 8000;"
+ PCFileName "hp-laserjet_8000.ppd"
+ Attribute "Product" "" "(HP LaserJet 8000 Printer)"
+ Attribute "Product" "" "(HP LaserJet 8000dn Printer)"
+ Attribute "Product" "" "(HP LaserJet 8000n Printer)"
+ }
+ {
+ ModelName "HP LaserJet 8100 Series"
+ Attribute "NickName" "" "HP LaserJet 8100 Series pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 8100 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 8100 series;DES:hp laserjet 8100 series;"
+ PCFileName "hp-laserjet_8100_series-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 8100 Printer)"
+ Attribute "Product" "" "(HP LaserJet 8100dn Printer)"
+ Attribute "Product" "" "(HP LaserJet 8100n Printer)"
+ }
+ {
+ ModelName "HP LaserJet 8150 Series"
+ Attribute "NickName" "" "HP LaserJet 8150 Series pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 8150 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 8150 series;DES:hp laserjet 8150 series;"
+ PCFileName "hp-laserjet_8150_series-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 8150 Printer)"
+ Attribute "Product" "" "(HP LaserJet 8150n Printer)"
+ Attribute "Product" "" "(HP LaserJet 8150hn Printer)"
+ Attribute "Product" "" "(HP LaserJet 8150dn Printer)"
+ }
+ {
+ ModelName "HP LaserJet 9000 Series"
+ Attribute "NickName" "" "HP LaserJet 9000 Series pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 9000 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 9000 series;DES:hp laserjet 9000 series;"
+ PCFileName "hp-laserjet_9000_series-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 9000 Printer)"
+ Attribute "Product" "" "(HP LaserJet 9000n Printer)"
+ Attribute "Product" "" "(HP LaserJet 9000dn Printer)"
+ Attribute "Product" "" "(HP LaserJet 9000hns Printer)"
+ Attribute "Product" "" "(HP LaserJet 9000hnf Printer)"
+ }
+ {
+ ModelName "HP LaserJet 9000 MFP"
+ Attribute "NickName" "" "HP LaserJet 9000 MFP pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 9000 MFP"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 9000 mfp;DES:hp laserjet 9000 mfp;"
+ PCFileName "hp-laserjet_9000_mfp-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 9000 Multifunction Printer)"
+ Attribute "Product" "" "(HP LaserJet 9000l Multifunction Printer)"
+ }
+ {
+ ModelName "HP LaserJet 9040 MFP"
+ Attribute "NickName" "" "HP LaserJet 9040 MFP pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 9040 MFP"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 9040 mfp;DES:hp laserjet 9040 mfp;"
+ PCFileName "hp-laserjet_9040_mfp-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 9040n Printer)"
+ Attribute "Product" "" "(HP LaserJet 9040dn Printer)"
+ Attribute "Product" "" "(HP LaserJet 9040 Multifunction Printer)"
+ }
+ {
+ ModelName "HP LaserJet 9040"
+ Attribute "NickName" "" "HP LaserJet 9040 pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 9040"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 9040;DES:hp laserjet 9040;"
+ PCFileName "hp-laserjet_9040-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 9040 Printer)"
+ Attribute "Product" "" "(HP LaserJet 9040n Printer)"
+ Attribute "Product" "" "(HP LaserJet 9040dn Printer)"
+ }
+ {
+ ModelName "HP LaserJet 9050"
+ Attribute "NickName" "" "HP LaserJet 9050 pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 9050"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 9050;DES:hp laserjet 9050;"
+ PCFileName "hp-laserjet_9050-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 9050 Printer)"
+ Attribute "Product" "" "(HP LaserJet 9050n Printer)"
+ Attribute "Product" "" "(HP LaserJet 9050dn Printer)"
+ }
+ {
+ ModelName "HP LaserJet 9050 MFP"
+ Attribute "NickName" "" "HP LaserJet 9050 MFP pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 9050 MFP"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 9050 mfp;DES:hp laserjet 9050 mfp;"
+ PCFileName "hp-laserjet_9050_mfp-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 9050 Multifunction Printer)"
+ }
+ {
+ ModelName "HP LaserJet 9055mfp"
+ Attribute "NickName" "" "HP LaserJet 9055mfp pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 9055mfp"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 9055mfp;DES:hp laserjet 9055mfp;"
+ PCFileName "hp-laserjet_9055mfp-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 9055 Multifunction Printer)"
+ }
+ {
+ ModelName "HP LaserJet 9065mfp"
+ Attribute "NickName" "" "HP LaserJet 9065mfp pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 9065mfp"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 9065mfp;DES:hp laserjet 9065mfp;"
+ PCFileName "hp-laserjet_9065mfp-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 9065 Multifunction Printer)"
+ }
+
+ } // End Large format media sizes.
+} // End LJMono
+
+////////////// LJColor
+{
+ Attribute "cupsEvenDuplex" "" "True"
+ Attribute "hpPrinterLanguage" "" "ljcolor"
+
+ Group "General/General"
+
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 10.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "<</Duplex true/Tumble false>>setpagedevice"
+ Choice "DuplexTumble/Short Edge (Flip)" "<</Duplex true/Tumble true>>setpagedevice"
+ *Choice "None/Off" "<</Duplex false/Tumble false>>setpagedevice"
+
+ // cupsRowCount values map to PEN_TYPE + 1 from global_types.h
+ Option "ColorModel/Output Mode" PickOne AnySetup 10.0
+ Choice "Gray/Grayscale" "<</cupsColorSpace 3/cupsBitsPerColor 1/cupsRowCount 3/cupsRowStep 2>>setpagedevice"
+ *Choice "RGB/Color" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowCount 3/cupsRowStep 0>>setpagedevice"
+
+ // cupsMediaType values map to MEDIATYPE from global_types.h
+ Option "MediaType/Media Type" PickOne AnySetup 10.0
+ *Choice "Plain/Plain Paper" "<</MediaType(Plain)/cupsMediaType 0>>setpagedevice"
+ Choice "Glossy/Photo Paper" "<</MediaType(Glossy)/cupsMediaType 3>>setpagedevice"
+
+ // cupsCompression values map to QUALITY_MODE from global_types.h
+ Option "OutputMode/Print Quality" PickOne AnySetup 10.0
+ *Choice "Normal/Normal" "<</OutputType(0)/HWResolution[300 300]>>setpagedevice"
+ Choice "Draft/Draft" "<</OutputType(-1)/HWResolution[150 150]>>setpagedevice"
+ Choice "Best/Best" "<</OutputType(1)/HWResolution[600 600]>>setpagedevice"
+
+ // Duplexer is optional...
+ Installable "OptionDuplex/Duplexer Installed"
+
+ // Constraints
+ UIConstraints "*Duplex *OptionDuplex False"
+
+ Attribute "cupsModelName" "" "hp color LaserJet" // APDK device class
+
+// 4x6 or smaller
+ CustomMedia "Card3x5/Index Card 3x5in" 216 360 18.00 14.40 18.00 14.40 "<</cupsInteger0 78/PageSize [216 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 78/PageSize[216 360]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki/Hagaki 100x148mm" 284 420 18.00 14.40 18.00 14.40 "<</cupsInteger0 71/PageSize[284 420]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/PageSize[284 420]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6/Photo 4x6in" 288 432 18.00 14.40 18.00 14.40 "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6/A6 105x148mm" 297.36 419.76 18.00 14.40 18.00 14.40 "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+
+// 5x7
+ CustomMedia "Photo5x7/Photo 5x7in" 360 504 18.00 14.40 18.00 14.40 "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card5x8/Index Card 5x8in" 360 576 18.00 14.40 18.00 14.40 "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Oufuku/Oufuku-Hagaki 148x200mm" 567 420 18.00 14.40 18.00 14.40 "<</cupsInteger0 72/PageSize[567 420]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 72/PageSize[567 420]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5/A5 148x210mm" 419.76 595.44 18.00 14.40 18.00 14.40 "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+
+// Standard
+ CustomMedia "B5/B5 176x250mm" 498.96 708.48 18 14 18 14 "<</cupsInteger0 65/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 65/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5/JB5 182x257mm" 516.24 728.64 18 14 18 14 "<</cupsInteger0 45/PageSize[516.24 728.64]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 45/PageSize [516.24 728.64]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Executive/Executive 7.25x10.5in" 522 756 18.00 14.40 18.00 14.40 "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ CustomMedia "16k/16k 7.75x10.75in" 558 774 18.00 14.40 18.00 14.40 "<</cupsInteger0 101/PageSize[558 774]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[558 774]/ImagingBBox null>>setpagedevice" // custom
+ *CustomMedia "Letter/Letter 8.5x11in" 612 792 18.00 14.40 18.00 14.40 "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4/A4 210x297mm" 595.44 841.68 18.00 14.40 18.00 14.40 "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ CustomMedia "ExecutiveJIS/Executive (JIS) 8.5x12.986in" 612 936 18.00 14.40 18.00 14.40 "<</cupsInteger0 10/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 10/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ CustomMedia "FLSA/American Foolscap 8.5x13in" 612 936 18.00 14.40 18.00 14.40 "<</cupsInteger0 10/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 10/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Legal/Legal 8.5x14in" 612 1008 18.00 14.40 18.00 14.40 "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+
+// Envelope
+ CustomMedia "EnvA2/A2 Envelope 4.37x5.75in" 314.64 414 18 14 18 14 "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC6/C6 Envelope 114x162mm" 323.28 459.36 18.00 14.40 18.00 14.40 "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou4/#4 Japanese Envelope 90x205mm" 254.88 581.04 18 14 18 14 "<</cupsInteger0 111/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 111/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvMonarch/Monarch Envelope 3.875x7.5in" 279 540 18.00 14.40 18.00 14.40 "<</cupsInteger0 80/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 80/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvDL/DL Envelope 110x220mm" 311.76 623.52 18.00 14.40 18.00 14.40 "<</cupsInteger0 90/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 90/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Env10/#10 Envelope 4.12x9.5in" 297 684 18.00 14.40 18.00 14.40 "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou3/#3 Japanese Envelope 120x235mm" 339.84 666 18 14 18 14 "<</cupsInteger0 110/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 110/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC5/C5 Envelope 162x229mm" 459 649 18.00 14.40 18.00 14.40 "<</cupsInteger0 91/PageSize[459 649]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 91/PageSize[459 649]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvB5/B5 Envelope 176x250mm" 499 709 18.00 14.40 18.00 14.40 "<</cupsInteger0 100/PageSize[499 709]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 100/PageSize[499 709]/ImagingBBox null>>setpagedevice"
+
+ {
+ // Custom page sizes from 1x4in to Legal
+ HWMargins 18 14 18 14
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 8.5in 14in
+ {
+ // MediaPosition values map to MediaSource enumeration in global_types.h
+ Option "InputSlot/Media Source" PickOne AnySetup 10.0
+ *Choice "Auto/Auto-Select" "<</MediaPosition 7>>setpagedevice"
+ Choice "PhotoTray/Photo Tray" "<</MediaPosition 1>>setpagedevice"
+ Choice "Upper/Upper Tray" "<</MediaPosition 1>>setpagedevice"
+ Choice "Lower/Lower Tray" "<</MediaPosition 4>>setpagedevice"
+ Choice "Envelope/Envelope Feeder" "<</MediaPosition 3>>setpagedevice"
+ Choice "LargeCapacity/Large Capacity Tray" "<</MediaPosition 5>>setpagedevice"
+ Choice "Manual/Manual Feeder" "<</MediaPosition 2>>setpagedevice"
+ Choice "MPTray/Multi Purpose Tray" "<</MediaPosition 1>>setpagedevice"
+ // <%LJColor:Normal%>
+ {
+ ModelName "HP Color LaserJet cm1312nfi MFP"
+ Attribute "NickName" "" "HP Color LaserJet cm1312nfi MFP pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LaserJet cm1312nfi MFP"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet cm1312nfi mfp;DES:hp color laserjet cm1312nfi mfp;"
+ PCFileName "hp-color_laserjet_cm1312nfi_mfp-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet cm1312nfi Multifunction Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet cm1312 MFP"
+ Attribute "NickName" "" "HP Color LaserJet cm1312 MFP pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LaserJet cm1312 MFP"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet cm1312 mfp;DES:hp color laserjet cm1312 mfp;"
+ PCFileName "hp-color_laserjet_cm1312_mfp-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet cm1312 Multifunction Printer)"
+ }
+ {
+ ModelName "HP LaserJet cm1411fn"
+ Attribute "NickName" "" "HP LaserJet cm1411fn pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet cm1411fn"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet cm1411fn;DES:hp laserjet cm1411fn;"
+ PCFileName "hp-laserjet_cm1411fn-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet Professional cm1411fn)"
+ }
+ {
+ ModelName "HP LaserJet cm1412fn"
+ Attribute "NickName" "" "HP LaserJet cm1412fn pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet cm1412fn"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet cm1412fn;DES:hp laserjet cm1412fn;"
+ PCFileName "hp-laserjet_cm1412fn-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet Professional cm1412fn)"
+ }
+ {
+ ModelName "HP LaserJet cm1413fn"
+ Attribute "NickName" "" "HP LaserJet cm1413fn pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet cm1413fn"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet cm1413fn;DES:hp laserjet cm1413fn;"
+ PCFileName "hp-laserjet_cm1413fn-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet Professional cm1413fn)"
+ }
+ {
+ ModelName "HP LaserJet cm1415fnw"
+ Attribute "NickName" "" "HP LaserJet cm1415fnw pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet cm1415fnw"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet cm1415fnw;DES:hp laserjet cm1415fnw;"
+ PCFileName "hp-laserjet_cm1415fnw-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet Professional cm1415fnw)"
+ }
+ {
+ ModelName "HP LaserJet cm1415fn"
+ Attribute "NickName" "" "HP LaserJet cm1415fn pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet cm1415fn"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet cm1415fn;DES:hp laserjet cm1415fn;"
+ PCFileName "hp-laserjet_cm1415fn-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet Professional cm1415fn)"
+ }
+ {
+ ModelName "HP LaserJet cm1416fnw"
+ Attribute "NickName" "" "HP LaserJet cm1416fnw pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet cm1416fnw"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet cm1416fnw;DES:hp laserjet cm1416fnw;"
+ PCFileName "hp-laserjet_cm1416fnw-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet Professional cm1416fnw)"
+ }
+ {
+ ModelName "HP LaserJet cm1417fnw"
+ Attribute "NickName" "" "HP LaserJet cm1417fnw pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet cm1417fnw"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet cm1417fnw;DES:hp laserjet cm1417fnw;"
+ PCFileName "hp-laserjet_cm1417fnw-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet Professional cm1417fnw)"
+ }
+ {
+ ModelName "HP LaserJet cm1418fnw"
+ Attribute "NickName" "" "HP LaserJet cm1418fnw pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet cm1418fnw"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet cm1418fnw;DES:hp laserjet cm1418fnw;"
+ PCFileName "hp-laserjet_cm1418fnw-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet Professional cm1418fnw)"
+ }
+ {
+ ModelName "HP Color LaserJet cp1514n"
+ Attribute "NickName" "" "HP Color LaserJet cp1514n pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LaserJet cp1514n"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet cp1514n;DES:hp color laserjet cp1514n;"
+ PCFileName "hp-color_laserjet_cp1514n-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet cp1514n Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet cp1515n"
+ Attribute "NickName" "" "HP Color LaserJet cp1515n pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LaserJet cp1515n"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet cp1515n;DES:hp color laserjet cp1515n;"
+ PCFileName "hp-color_laserjet_cp1515n-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet cp1515n Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet cp1518ni"
+ Attribute "NickName" "" "HP Color LaserJet cp1518ni pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LaserJet cp1518ni"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet cp1518ni;DES:hp color laserjet cp1518ni;"
+ PCFileName "hp-color_laserjet_cp1518ni-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet cp1518ni Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet cp2025dn"
+ Attribute "NickName" "" "HP Color LaserJet cp2025dn pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LaserJet cp2025dn"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet cp2025dn;DES:hp color laserjet cp2025dn;"
+ PCFileName "hp-color_laserjet_cp2025dn-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet cp2025dn Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet cp2025"
+ Attribute "NickName" "" "HP Color LaserJet cp2025 pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LaserJet cp2025"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet cp2025;DES:hp color laserjet cp2025;"
+ PCFileName "hp-color_laserjet_cp2025-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet cp2025 Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet cp2025n"
+ Attribute "NickName" "" "HP Color LaserJet cp2025n pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LaserJet cp2025n"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet cp2025n;DES:hp color laserjet cp2025n;"
+ PCFileName "hp-color_laserjet_cp2025n-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet cp2025n Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet cp2025x"
+ Attribute "NickName" "" "HP Color LaserJet cp2025x pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LaserJet cp2025x"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet cp2025x;DES:hp color laserjet cp2025x;"
+ PCFileName "hp-color_laserjet_cp2025x-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet cp2025x Printer)"
+ }
+ {
+ ModelName "HP Business Inkjet 2300"
+ Attribute "NickName" "" "HP Business Inkjet 2300 pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Business Inkjet 2300"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp business inkjet 2300;DES:hp business inkjet 2300;"
+ PCFileName "hp-business_inkjet_2300-pcl3.ppd"
+ Attribute "Product" "" "(HP Business Inkjet 2300 Printer)"
+ Attribute "Product" "" "(HP Business Inkjet 2300n Printer)"
+ Attribute "Product" "" "(HP Business Inkjet 2300dtn Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet 2500"
+ Attribute "NickName" "" "HP Color LaserJet 2500 pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LaserJet 2500"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet 2500;DES:hp color laserjet 2500;"
+ PCFileName "hp-color_laserjet_2500-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet 2500 Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet 2500 Series"
+ Attribute "NickName" "" "HP Color LaserJet 2500 Series, $Version"
+ Attribute "ShortNickName" "" "HP Color LaserJet 2500 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet 2500 series;DES:hp color laserjet 2500 series;"
+ PCFileName "hp-color_laserjet_2500_series.ppd"
+ Attribute "Product" "" "(HP Color LaserJet 2500l Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 2500lse Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 2500n Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 2500tn Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet 3000"
+ Attribute "NickName" "" "HP Color LaserJet 3000 pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LaserJet 3000"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet 3000;DES:hp color laserjet 3000;"
+ PCFileName "hp-color_laserjet_3000-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet 3000 Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 3000n Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 3000dn Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 3000dtn Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet cp3505"
+ Attribute "NickName" "" "HP Color LaserJet cp3505 pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LaserJet cp3505"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet cp3505;DES:hp color laserjet cp3505;"
+ PCFileName "hp-color_laserjet_cp3505-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet cp3505n Printer)"
+ Attribute "Product" "" "(HP Color LaserJet cp3505dn Printer)"
+ Attribute "Product" "" "(HP Color LaserJet cp3505x Printer)"
+ Attribute "Product" "" "(HP Color LaserJet cp3505 Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet cp3525"
+ Attribute "NickName" "" "HP Color LaserJet cp3525 pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LaserJet cp3525"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet cp3525;DES:hp color laserjet cp3525;"
+ PCFileName "hp-color_laserjet_cp3525-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet cp3525 Printer)"
+ Attribute "Product" "" "(HP Color LaserJet cp3525n Printer)"
+ Attribute "Product" "" "(HP Color LaserJet cp3525dn Printer)"
+ Attribute "Product" "" "(HP Color LaserJet cp3525x Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet cm3530 MFP"
+ Attribute "NickName" "" "HP Color LaserJet cm3530 MFP pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LaserJet cm3530 MFP"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet cm3530 mfp;DES:hp color laserjet cm3530 mfp;"
+ PCFileName "hp-color_laserjet_cm3530_mfp-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet cm3530 Multifunction Printer)"
+ Attribute "Product" "" "(HP Color LaserJet cm3530fs Multifunction Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet 3700"
+ Attribute "NickName" "" "HP Color LaserJet 3700 pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LaserJet 3700"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet 3700;DES:hp color laserjet 3700;"
+ PCFileName "hp-color_laserjet_3700-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet 3700 Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet 3700n"
+ Attribute "NickName" "" "HP Color LaserJet 3700n, $Version"
+ Attribute "ShortNickName" "" "HP Color LaserJet 3700n"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet 3700n;DES:hp color laserjet 3700n;"
+ PCFileName "hp-color_laserjet_3700n.ppd"
+ Attribute "Product" "" "(HP Color LaserJet 3700n Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 3700dtn Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 3700dn Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 3700d Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet 3800"
+ Attribute "NickName" "" "HP Color LaserJet 3800 pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LaserJet 3800"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet 3800;DES:hp color laserjet 3800;"
+ PCFileName "hp-color_laserjet_3800-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet 3800 Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 3800n Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 3800dn Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 3800dtn Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet cp4005"
+ Attribute "NickName" "" "HP Color LaserJet cp4005 pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LaserJet cp4005"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet cp4005;DES:hp color laserjet cp4005;"
+ PCFileName "hp-color_laserjet_cp4005-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet cp4005n Printer)"
+ Attribute "Product" "" "(HP Color LaserJet cp4005dn Printer)"
+ Attribute "Product" "" "(HP Color LaserJet cp4005 Series Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet cp4020 Series"
+ Attribute "NickName" "" "HP Color LaserJet cp4020 Series pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LaserJet cp4020 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet cp4020 series;DES:hp color laserjet cp4020 series;"
+ PCFileName "hp-color_laserjet_cp4020_series-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet cp4020 Series Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet 4500"
+ Attribute "NickName" "" "HP Color LaserJet 4500 pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LaserJet 4500"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet 4500;DES:hp color laserjet 4500;"
+ PCFileName "hp-color_laserjet_4500-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet 4500 Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 4500dn Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 4500n Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet cp4520 Series"
+ Attribute "NickName" "" "HP Color LaserJet cp4520 Series pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LaserJet cp4520 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet cp4520 series;DES:hp color laserjet cp4520 series;"
+ PCFileName "hp-color_laserjet_cp4520_series-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet cp4520 Series Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet cm4540 MFP"
+ Attribute "NickName" "" "HP Color LaserJet cm4540 MFP pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LaserJet cm4540 MFP"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet cm4540 mfp;DES:hp color laserjet cm4540 mfp;"
+ PCFileName "hp-color_laserjet_cm4540_mfp-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet cm4540 Multifunction Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet 4550"
+ Attribute "NickName" "" "HP Color LaserJet 4550 pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LaserJet 4550"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet 4550;DES:hp color laserjet 4550;"
+ PCFileName "hp-color_laserjet_4550-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet 4550 Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 4550n Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 4550dn Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 4550hdn Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 4550n Plus Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 4550hdn Plus Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet 4600 Series"
+ Attribute "NickName" "" "HP Color LaserJet 4600 Series, $Version"
+ Attribute "ShortNickName" "" "HP Color LaserJet 4600 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet 4600 series;DES:hp color laserjet 4600 series;"
+ PCFileName "hp-color_laserjet_4600_series.ppd"
+ Attribute "Product" "" "(HP Color LaserJet 4600 Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 4600dn Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 4600dtn Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 4600hdn Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 4600n Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet 4600"
+ Attribute "NickName" "" "HP Color LaserJet 4600 pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LaserJet 4600"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet 4600;DES:hp color laserjet 4600;"
+ PCFileName "hp-color_laserjet_4600-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet 4600 Series Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet 4610"
+ Attribute "NickName" "" "HP Color LaserJet 4610 pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LaserJet 4610"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet 4610;DES:hp color laserjet 4610;"
+ PCFileName "hp-color_laserjet_4610-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet 4610n Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet 4650"
+ Attribute "NickName" "" "HP Color LaserJet 4650 pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LaserJet 4650"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet 4650;DES:hp color laserjet 4650;"
+ PCFileName "hp-color_laserjet_4650-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet 4650 Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 4650n Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 4650dn Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 4650dtn Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 4650hdn Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet 4700"
+ Attribute "NickName" "" "HP Color LaserJet 4700 pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LaserJet 4700"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet 4700;DES:hp color laserjet 4700;"
+ PCFileName "hp-color_laserjet_4700-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet 4700 Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 4700dn Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 4700dtn Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 4700n Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 4700ph+ Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet cm4730 MFP"
+ Attribute "NickName" "" "HP Color LaserJet cm4730 MFP pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LaserJet cm4730 MFP"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet cm4730 mfp;DES:hp color laserjet cm4730 mfp;"
+ PCFileName "hp-color_laserjet_cm4730_mfp-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet cm4730 Multifunction Printer)"
+ Attribute "Product" "" "(HP Color LaserJet cm4730f Multifunction Printer)"
+ Attribute "Product" "" "(HP Color LaserJet cm4730fm Multifunction Printer)"
+ Attribute "Product" "" "(HP Color LaserJet cm4730fsk Multifunction Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet 4730mfp"
+ Attribute "NickName" "" "HP Color LaserJet 4730mfp pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LaserJet 4730mfp"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet 4730mfp;DES:hp color laserjet 4730mfp;"
+ PCFileName "hp-color_laserjet_4730mfp-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet 4730xs Multifunction Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 4730xm Multifunction Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 4730x Multifunction Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 4730 Multifunction Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet cp5225"
+ Attribute "NickName" "" "HP Color LaserJet cp5225 pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LaserJet cp5225"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet cp5225;DES:hp color laserjet cp5225;"
+ PCFileName "hp-color_laserjet_cp5225-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet cp5225)"
+ }
+ {
+ ModelName "HP Color LaserJet cp5225n"
+ Attribute "NickName" "" "HP Color LaserJet cp5225n pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LaserJet cp5225n"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet cp5225n;DES:hp color laserjet cp5225n;"
+ PCFileName "hp-color_laserjet_cp5225n-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet cp5225n)"
+ }
+ {
+ ModelName "HP Color LaserJet cp5225dn"
+ Attribute "NickName" "" "HP Color LaserJet cp5225dn pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LaserJet cp5225dn"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet cp5225dn;DES:hp color laserjet cp5225dn;"
+ PCFileName "hp-color_laserjet_cp5225dn-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet cp5225dn)"
+ }
+ {
+ ModelName "HP Color LaserJet cp5520 Series"
+ Attribute "NickName" "" "HP Color LaserJet cp5520 Series pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LaserJet cp5520 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet cp5520 series;DES:hp color laserjet cp5520 series;"
+ PCFileName "hp-color_laserjet_cp5520_series-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet cp5520 Series Printer)"
+ }
+ {
+ ModelName "HP Officejet 9100 Series"
+ Attribute "NickName" "" "HP Officejet 9100 Series pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Officejet 9100 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet 9100 series;DES:officejet 9100 series;"
+ PCFileName "hp-officejet_9100_series-pcl3.ppd"
+ Attribute "Product" "" "(HP Officejet 9110 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 9120 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 9130 All-in-one Printer)"
+ }
+ }
+
+ {
+ // MediaPosition values map to MediaSource enumeration in global_types.h
+ Option "InputSlot/Media Source" PickOne AnySetup 10.0
+ *Choice "Auto/Auto-Select" "<</MediaPosition 7>>setpagedevice"
+ Choice "Tray1_Man/Tray 1 (Manual)" "<</MediaPosition 3>>setpagedevice"
+ Choice "Tray2/Tray 2" "<</MediaPosition 0>>setpagedevice"
+ Choice "Tray3/Tray 3" "<</MediaPosition 1>>setpagedevice"
+ // <%LJColor:Normal:Advanced%>
+ {
+ ModelName "HP Color LaserJet cm2320 MFP"
+ Attribute "NickName" "" "HP Color LaserJet cm2320 MFP pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LaserJet cm2320 MFP"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet cm2320 mfp;DES:hp color laserjet cm2320 mfp;"
+ PCFileName "hp-color_laserjet_cm2320_mfp-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet cm2320 Multifuntion Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet cm2320fxi MFP"
+ Attribute "NickName" "" "HP Color LaserJet cm2320fxi MFP pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LaserJet cm2320fxi MFP"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet cm2320fxi mfp;DES:hp color laserjet cm2320fxi mfp;"
+ PCFileName "hp-color_laserjet_cm2320fxi_mfp-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet cm2320fxi Multifunction Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet cm2320n MFP"
+ Attribute "NickName" "" "HP Color LaserJet cm2320n MFP pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LaserJet cm2320n MFP"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet cm2320n mfp;DES:hp color laserjet cm2320n mfp;"
+ PCFileName "hp-color_laserjet_cm2320n_mfp-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet cm2320n Multifunction Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet cm2320nf MFP"
+ Attribute "NickName" "" "HP Color LaserJet cm2320nf MFP pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LaserJet cm2320nf MFP"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet cm2320nf mfp;DES:hp color laserjet cm2320nf mfp;"
+ PCFileName "hp-color_laserjet_cm2320nf_mfp-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet cm2320nf Multifunction Printer)"
+ }
+ }
+ } // End supported media sizes.
+
+ {
+// Large
+ CustomMedia "SuperB/SuperB 13x19in" 936 1368 18 14 18 14 "<</cupsInteger0 16/PageSize[936 1368]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 16/PageSize[936 1368]/ImagingBBox null>>setpagedevice"
+ CustomMedia "B4/B4 257x364mm" 729 1033 18 14 18 14 "<</cupsInteger0 46/PageSize[729 1033]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 46/PageSize[729 1033]/ImagingBBox null>>setpagedevice"
+ CustomMedia "8k/8k 10.75x15.5in" 774 1116 18 14 18 14 "<</cupsInteger0 101/PageSize[774 1116]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[774 1116]/ImagingBBox null>>setpagedevice" // custom
+ CustomMedia "Ledger/Ledger 11x17in" 792 1224 18 14 18 14 "<</cupsInteger0 6/PageSize[792 1224]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 6/PageSize[792 1224]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A3/A3 297x420mm" 842 1190 18 14 18 14 "<</cupsInteger0 27/PageSize[842 1190]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 27/PageSize[842 1190]/ImagingBBox null>>setpagedevice"
+
+ // Custom page sizes from 1x4in to SuperB
+ HWMargins 18 14 18 14
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 936 1368
+
+ // <%LJColor:LargeFormatSuperB%>
+ {
+ ModelName "HP Business Inkjet 2600"
+ Attribute "NickName" "" "HP Business Inkjet 2600 pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Business Inkjet 2600"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp business inkjet 2600;DES:hp business inkjet 2600;"
+ PCFileName "hp-business_inkjet_2600-pcl3.ppd"
+ Attribute "Product" "" "(HP Business Inkjet 2600 Printer)"
+ Attribute "Product" "" "(HP Business Inkjet 2600dn Printer)"
+ }
+ {
+ ModelName "HP Business Inkjet 2800"
+ Attribute "NickName" "" "HP Business Inkjet 2800 pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Business Inkjet 2800"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp business inkjet 2800;DES:hp business inkjet 2800;"
+ PCFileName "hp-business_inkjet_2800-pcl3.ppd"
+ Attribute "Product" "" "(HP Business Inkjet 2800 Printer)"
+ Attribute "Product" "" "(HP Business Inkjet 2800dt Printer)"
+ Attribute "Product" "" "(HP Business Inkjet 2800dtn Printer)"
+ }
+ {
+ ModelName "HP Business Inkjet 3000"
+ Attribute "NickName" "" "HP Business Inkjet 3000 pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Business Inkjet 3000"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp business inkjet 3000;DES:hp business inkjet 3000;"
+ PCFileName "hp-business_inkjet_3000-pcl3.ppd"
+ Attribute "Product" "" "(HP Business Inkjet 3000 Printer)"
+ Attribute "Product" "" "(HP Business Inkjet 3000dtn Printer)"
+ Attribute "Product" "" "(HP Business Inkjet 3000n Printer)"
+ }
+ {
+ UIConstraints "*PageSize SuperB *MediaType"
+ // <%LJColor:LargeFormatA3%>
+ {
+ ModelName "HP Color LaserJet 5500"
+ Attribute "NickName" "" "HP Color LaserJet 5500 pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LaserJet 5500"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet 5500;DES:hp color laserjet 5500;"
+ PCFileName "hp-color_laserjet_5500-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet 5500 Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 5500n Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 5500dn Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 5500dtn Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 5500hdn Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet 5550"
+ Attribute "NickName" "" "HP Color LaserJet 5550 pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LaserJet 5550"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet 5550;DES:hp color laserjet 5550;"
+ PCFileName "hp-color_laserjet_5550-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet 5550n Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 5550 Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 5550dn Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 5550dtn Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 5550hdn Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet cp6015"
+ Attribute "NickName" "" "HP Color LaserJet cp6015 pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LaserJet cp6015"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet cp6015;DES:hp color laserjet cp6015;"
+ PCFileName "hp-color_laserjet_cp6015-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet cp6015dn Printer)"
+ Attribute "Product" "" "(HP Color LaserJet cp6015x Printer)"
+ Attribute "Product" "" "(HP Color LaserJet cp6015xh Printer)"
+ Attribute "Product" "" "(HP Color LaserJet cp6015de Printer)"
+ Attribute "Product" "" "(HP Color LaserJet cp6015n Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet cm6030 MFP"
+ Attribute "NickName" "" "HP Color LaserJet cm6030 MFP pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LaserJet cm6030 MFP"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet cm6030 mfp;DES:hp color laserjet cm6030 mfp;"
+ PCFileName "hp-color_laserjet_cm6030_mfp-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet cm6030 Multifunction Printer)"
+ Attribute "Product" "" "(HP Color LaserJet cm6030f Multifunction Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet cm6040 MFP"
+ Attribute "NickName" "" "HP Color LaserJet cm6040 MFP, $Version"
+ Attribute "ShortNickName" "" "HP Color LaserJet cm6040 MFP"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet cm6040 mfp;DES:hp color laserjet cm6040 mfp;"
+ PCFileName "hp-color_laserjet_cm6040_mfp.ppd"
+ Attribute "Product" "" "(HP Color LaserJet cm6040 Multifunction Printer)"
+ Attribute "Product" "" "(HP Color LaserJet cm6040f Multifunction Printer)"
+ Attribute "Product" "" "(HP Color LaserJet cm6049f Multifunction Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet cm6049 MFP"
+ Attribute "NickName" "" "HP Color LaserJet cm6049 MFP, $Version"
+ Attribute "ShortNickName" "" "HP Color LaserJet cm6049 MFP"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet cm6049 mfp;DES:hp color laserjet cm6049 mfp;"
+ PCFileName "hp-color_laserjet_cm6049_mfp.ppd"
+ Attribute "Product" "" "(HP Color LaserJet cm6049 MFP)"
+ }
+ {
+ ModelName "HP Color LaserJet 8500"
+ Attribute "NickName" "" "HP Color LaserJet 8500 pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LaserJet 8500"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet 8500;DES:hp color laserjet 8500;"
+ PCFileName "hp-color_laserjet_8500-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet 8500 Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 8500n Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 8500dn Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet 8550"
+ Attribute "NickName" "" "HP Color LaserJet 8550 pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LaserJet 8550"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet 8550;DES:hp color laserjet 8550;"
+ PCFileName "hp-color_laserjet_8550-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet 8550dn Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 8550gn Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 8550mn Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 8550 Multifunction Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 8550mfp-dlvry/unpkging)"
+ Attribute "Product" "" "(HP Color LaserJet 8550 Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet 9500"
+ Attribute "NickName" "" "HP Color LaserJet 9500 pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LaserJet 9500"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet 9500;DES:hp color laserjet 9500;"
+ PCFileName "hp-color_laserjet_9500-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet 9500n Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 9500hdn Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 9500gp Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 9500 Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet 9500 MFP"
+ Attribute "NickName" "" "HP Color LaserJet 9500 MFP pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LaserJet 9500 MFP"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet 9500 mfp;DES:hp color laserjet 9500 mfp;"
+ PCFileName "hp-color_laserjet_9500_mfp-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet 9500 Multifunction Printer)"
+ }
+ }
+ {
+ UIConstraints "*OutputMode Best *MediaType"
+ // <%LJColor:300dpiOnly:LargeFormatA3%>
+ {
+ ModelName "HP Color LaserJet 5"
+ Attribute "NickName" "" "HP Color LaserJet 5, $Version"
+ Attribute "ShortNickName" "" "HP Color LaserJet 5"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet 5;DES:hp color laserjet 5;"
+ PCFileName "hp-color_laserjet_5.ppd"
+ Attribute "Product" "" "(HP Color LaserJet 5 Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet 5m"
+ Attribute "NickName" "" "HP Color LaserJet 5m pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LaserJet 5m"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet 5m;DES:hp color laserjet 5m;"
+ PCFileName "hp-color_laserjet_5m-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet 5m Printer)"
+ }
+ {
+ ModelName "HP Deskjet 1200c"
+ Attribute "NickName" "" "HP Deskjet 1200c, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 1200c"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 1200c;DES:deskjet 1200c;"
+ PCFileName "hp-deskjet_1200c.ppd"
+ Attribute "Product" "" "(HP Deskjet 1200c/ps Printer)"
+ }
+ {
+ ModelName "HP Deskjet 1600c"
+ Attribute "NickName" "" "HP Deskjet 1600c, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 1600c"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 1600c;DES:deskjet 1600c;"
+ PCFileName "hp-deskjet_1600c.ppd"
+ Attribute "Product" "" "(HP Deskjet 1600c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 1600cn"
+ Attribute "NickName" "" "HP Deskjet 1600cn, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 1600cn"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 1600cn;DES:deskjet 1600cn;"
+ PCFileName "hp-deskjet_1600cn.ppd"
+ Attribute "Product" "" "(HP Deskjet 1600cn Printer)"
+ }
+ {
+ ModelName "HP Deskjet 1600cm"
+ Attribute "NickName" "" "HP Deskjet 1600cm, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 1600cm"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 1600cm;DES:deskjet 1600cm;"
+ PCFileName "hp-deskjet_1600cm.ppd"
+ Attribute "Product" "" "(HP Deskjet 1600cm Printer)"
+ }
+ }
+ } // End Large format media sizes.
+} // End LJColor
+
+//////////////// LJFastRaster (monochrome)
+{
+ Attribute "cupsEvenDuplex" "" "True"
+ Attribute "hpPrinterLanguage" "" "ljfastraster"
+
+ Group "General/General"
+
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 10.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "<</Duplex true/Tumble false>>setpagedevice"
+ Choice "DuplexTumble/Short Edge (Flip)" "<</Duplex true/Tumble true>>setpagedevice"
+ *Choice "None/Off" "<</Duplex false/Tumble false>>setpagedevice"
+
+ // MediaPosition values map to MediaSource enumeration in global_types.h
+ Option "InputSlot/Media Source" PickOne AnySetup 10.0
+ *Choice "Auto/Auto-Select" "<</MediaPosition 7>>setpagedevice"
+ Choice "PhotoTray/Photo Tray" "<</MediaPosition 1>>setpagedevice"
+ Choice "Upper/Upper Tray" "<</MediaPosition 1>>setpagedevice"
+ Choice "Lower/Lower Tray" "<</MediaPosition 4>>setpagedevice"
+ Choice "Envelope/Envelope Feeder" "<</MediaPosition 3>>setpagedevice"
+ Choice "LargeCapacity/Large Capacity Tray" "<</MediaPosition 5>>setpagedevice"
+ Choice "Manual/Manual Feeder" "<</MediaPosition 2>>setpagedevice"
+ Choice "MPTray/Multi Purpose Tray" "<</MediaPosition 1>>setpagedevice"
+
+ // cupsRowCount values map to PEN_TYPE + 1 from global_types.h
+ Option "ColorModel/Output Mode" PickOne AnySetup 10.0
+ *Choice "Gray/Grayscale" "<</cupsColorSpace 3/cupsBitsPerColor 1/cupsRowCount 1/cupsRowStep 2>>setpagedevice"
+
+ // cupsMediaType values map to MEDIATYPE from global_types.h
+ Option "MediaType/Media Type" PickOne AnySetup 10.0
+ *Choice "Plain/Plain Paper" "<</MediaType(Plain)/cupsMediaType 0>>setpagedevice"
+
+ // cupsCompression values map to QUALITY_MODE from global_types.h
+ Option "OutputMode/Print Quality" PickOne AnySetup 10.0
+ *Choice "Normal/Normal" "<</OutputType(0)/HWResolution[600 600]>>setpagedevice"
+ Choice "Draft/Draft" "<</OutputType(-1)/HWResolution[600 600]>>setpagedevice"
+
+ // Duplexer is optional...
+ Installable "OptionDuplex/Duplexer Installed"
+
+ // Constraints
+ UIConstraints "*Duplex *OptionDuplex False"
+
+ Attribute "cupsModelName" "" "hp LaserJet 1010" // APDK device class
+
+ {
+// 4x6 or smaller
+ CustomMedia "Card3x5/Index Card 3x5in" 216 360 12 12 12 12 "<</cupsInteger0 96/PageSize [216 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize[216 360]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki/Hagaki 100x148mm" 284 420 12 12 12 12 "<</cupsInteger0 14/PageSize[284 420]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 14/PageSize[284 420]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6/A6 105x148mm" 297.36 419.76 12 12 12 12 "<</cupsInteger0 96/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+
+// 5x7
+ CustomMedia "Card5x8/Index Card 5x8in" 360 576 12 12 12 12 "<</cupsInteger0 96/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Oufuku/Oufuku-Hagaki 148x200mm" 420 567 12 12 12 12 "<</cupsInteger0 15/PageSize[420 567]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 15/PageSize[420 567]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5/A5 148x210mm" 419.76 595.44 12 12 12 12 "<</cupsInteger0 16/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 16/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+
+// Standard
+ CustomMedia "B5/B5 176x250mm" 498.96 708.48 12 12 12 12 "<</cupsInteger0 11/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 11/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5/JB5 182x257mm" 516.24 728.64 12 12 12 12 "<</cupsInteger0 96/PageSize[516.24 728.64]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize [516.24 728.64]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Executive/Executive 7.25x10.5in" 522 756 12 12 12 12 "<</cupsInteger0 3/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 3/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ CustomMedia "16k/16k 7.75x10.75in" 558 774 12 12 12 12 "<</cupsInteger0 96/PageSize[558 774]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize[558 774]/ImagingBBox null>>setpagedevice" // custom
+ *CustomMedia "Letter/Letter 8.5x11in" 612 792 12 12 12 12 "<</cupsInteger0 0/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 0/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4/A4 210x297mm" 595.44 841.68 12 12 12 12 "<</cupsInteger0 2/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ CustomMedia "ExecutiveJIS/Executive (JIS) 8.5x12.986in" 612 936 12 12 12 12 "<</cupsInteger0 96/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ CustomMedia "FLSA/American Foolscap 8.5x13in" 612 936 12 12 12 12 "<</cupsInteger0 96/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Legal/Legal 8.5x14in" 612 1008 12 12 12 12 "<</cupsInteger0 1/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+
+// Envelope
+ CustomMedia "EnvA2/A2 Envelope 4.37x5.75in" 314.64 414 12 12 12 12 "<</cupsInteger0 6/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 6/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC6/C6 Envelope 114x162mm" 323.28 459.36 12 12 12 12 "<</cupsInteger0 96/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou4/#4 Japanese Envelope 90x205mm" 254.88 581.04 12 12 12 12 "<</cupsInteger0 96/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvMonarch/Monarch Envelope 3.875x7.5in" 279 540 12 12 12 12 "<</cupsInteger0 96/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvDL/DL Envelope 110x220mm" 311.76 623.52 12 12 12 12 "<</cupsInteger0 9/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 9/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Env10/#10 Envelope 4.12x9.5in" 297 684 12 12 12 12 "<</cupsInteger0 6/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 6/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou3/#3 Japanese Envelope 120x235mm" 339.84 666 12 12 12 12 "<</cupsInteger0 96/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC5/C5 Envelope 162x229mm" 459 649 12 12 12 12 "<</cupsInteger0 8/PageSize[459 649]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 8/PageSize[459 649]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvB5/B5 Envelope 176x250mm" 499 709 12 12 12 12 "<</cupsInteger0 96/PageSize[499 709]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize[499 709]/ImagingBBox null>>setpagedevice"
+
+ // Custom page sizes from 1x4in to Legal
+ HWMargins 12 12 12 12
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 8.5in 14in
+
+ // <%LJFastRaster:Normal%>
+ {
+ ModelName "HP LaserJet 1010"
+ Attribute "NickName" "" "HP LaserJet 1010, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 1010"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 1010;DES:hp laserjet 1010;"
+ PCFileName "hp-laserjet_1010.ppd"
+ Attribute "Product" "" "(HP LaserJet 1010 Printer)"
+ }
+ {
+ ModelName "HP LaserJet 1012"
+ Attribute "NickName" "" "HP LaserJet 1012, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 1012"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 1012;DES:hp laserjet 1012;"
+ PCFileName "hp-laserjet_1012.ppd"
+ Attribute "Product" "" "(HP LaserJet 1012 Printer)"
+ }
+ } // End Supported media sizes.
+} // End LJFastRaster
+
+/////////////// DJ350
+{
+ Attribute "hpPrinterLanguage" "" "pcl3"
+ Attribute "hpPrinterPlatform" "" "dj600"
+ Attribute "HPMechOffset" "" "40"
+
+ Group "General/General"
+
+ // MediaPosition values map to MediaSource enumeration in global_types.h
+ Option "InputSlot/Media Source" PickOne AnySetup 10.0
+ *Choice "Auto/Auto-Select" "<</MediaPosition 7>>setpagedevice"
+ Choice "PhotoTray/Photo Tray" "<</MediaPosition 6>>setpagedevice"
+ Choice "Upper/Upper Tray" "<</MediaPosition 1>>setpagedevice"
+ Choice "Lower/Lower Tray" "<</MediaPosition 4>>setpagedevice"
+ Choice "Envelope/Envelope Feeder" "<</MediaPosition 3>>setpagedevice"
+ Choice "LargeCapacity/Large Capacity Tray" "<</MediaPosition 5>>setpagedevice"
+ Choice "Manual/Manual Feeder" "<</MediaPosition 2>>setpagedevice"
+ Choice "MPTray/Multi Purpose Tray" "<</MediaPosition 1>>setpagedevice"
+
+ // cupsMediaType values map to MEDIATYPE from global_types.h
+ Option "MediaType/Media Type" PickOne AnySetup 10.0
+ *Choice "Plain/Plain Paper" "<</MediaType(Plain)/cupsMediaType 0>>setpagedevice"
+
+ // cupsCompression values map to QUALITY_MODE from global_types.h
+ Option "OutputMode/Print Quality" PickOne AnySetup 10.0
+ *Choice "NormalRGB/Normal Color" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 0/OutputType(0)/cupsString0(PlainNormalColor)/HWResolution[300 300]>>setpagedevice"
+ Choice "NormalGray/Normal Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 2/OutputType(0)/cupsString0(PlainNormalGrayK)/HWResolution[300 300]>>setpagedevice"
+ Choice "DraftRGB/Draft Color" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 0/OutputType(-1)/cupsString0(PlainDraftColor)/HWResolution[300 300]>>setpagedevice"
+ Choice "DraftGray/Draft Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 2/OutputType(-1)/cupsString0(PlainDraftGrayK)/HWResolution[300 300]>>setpagedevice"
+ Choice "Best/Best" "<</cupsColorSpace 3/cupsBitsPerColor 1/cupsRowStep 1/OutputType(1)/cupsString0(PlainBestGrayK)/HWResolution[600 300]>>setpagedevice" // black only
+
+
+ // Constraints
+
+ Attribute "cupsModelName" "" "DESKJET 350" // APDK device class
+
+ {
+// 5x7
+ CustomMedia "Oufuku/Oufuku-Hagaki 148x200mm" 567 420 18 48 18 9 "<</cupsInteger0 101/PageSize[567 420]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[567 420]/ImagingBBox null>>setpagedevice"
+
+// Standard
+ CustomMedia "JB5/JB5 182x257mm" 516.24 728.64 18 48 18 9 "<</cupsInteger0 45/PageSize[516.24 728.64]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 45/PageSize [516.24 728.64]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Executive/Executive 7.25x10.5in" 522 756 18 48 18 9 "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ CustomMedia "16k/16k 7.75x10.75in" 558 774 18 48 18 9 "<</cupsInteger0 101/PageSize[558 774]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[558 774]/ImagingBBox null>>setpagedevice" // custom
+ *CustomMedia "Letter/Letter 8.5x11in" 612 792 18 48 18 9 "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4/A4 210x297mm" 595.44 841.68 18 48 18 9 "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ CustomMedia "ExecutiveJIS/Executive (JIS) 8.5x12.986in" 612 936 18 48 18 9 "<</cupsInteger0 101/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ CustomMedia "FLSA/American Foolscap 8.5x13in" 612 936 18 48 18 9 "<</cupsInteger0 101/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Legal/Legal 8.5x14in" 612 1008 18 48 18 9 "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+
+ // Custom page sizes from 1x4in to Legal
+ HWMargins 18 48 18 9
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 8.5in 14in
+
+ // <%DJ350:Normal%>
+ {
+ ModelName "HP dj350"
+ Attribute "NickName" "" "HP dj350, $Version"
+ Attribute "ShortNickName" "" "HP dj350"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:dj350;DES:dj350;"
+ PCFileName "hp-dj350.ppd"
+ Attribute "Product" "" "(HP Deskjet 350c Printer)"
+ Attribute "Product" "" "(HP Deskjet 350cbi Printer)"
+ }
+ {
+ ModelName "HP Deskjet 400l"
+ Attribute "NickName" "" "HP Deskjet 400l, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 400l"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp deskjet 400l;DES:hp deskjet 400l;"
+ PCFileName "hp-deskjet_400l.ppd"
+ Attribute "Product" "" "(HP Deskjet 400l Printer)"
+ }
+ } // End Supported media sizes.
+} // End DJ350
+
+//////////// DJ540 grayscale only
+{
+ Attribute "hpPrinterLanguage" "" "pcl3"
+ Attribute "hpPrinterPlatform" "" "dj540"
+ Attribute "HPMechOffset" "" "40"
+
+ Group "General/General"
+
+ // MediaPosition values map to MediaSource enumeration in global_types.h
+ Option "InputSlot/Media Source" PickOne AnySetup 10.0
+ *Choice "Auto/Auto-Select" "<</MediaPosition 7>>setpagedevice"
+ Choice "PhotoTray/Photo Tray" "<</MediaPosition 6>>setpagedevice"
+ Choice "Upper/Upper Tray" "<</MediaPosition 1>>setpagedevice"
+ Choice "Lower/Lower Tray" "<</MediaPosition 4>>setpagedevice"
+ Choice "Envelope/Envelope Feeder" "<</MediaPosition 3>>setpagedevice"
+ Choice "LargeCapacity/Large Capacity Tray" "<</MediaPosition 5>>setpagedevice"
+ Choice "Manual/Manual Feeder" "<</MediaPosition 2>>setpagedevice"
+ Choice "MPTray/Multi Purpose Tray" "<</MediaPosition 1>>setpagedevice"
+
+ Option "ColorModel/Output Mode" PickOne AnySetup 10.0
+ *Choice "Gray/Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 2>>setpagedevice"
+
+ // cupsMediaType values map to MEDIATYPE from global_types.h
+ Option "MediaType/Media Type" PickOne AnySetup 10.0
+ *Choice "Plain/Plain Paper" "<</MediaType(Plain)/cupsMediaType 0>>setpagedevice"
+
+ // cupsCompression values map to QUALITY_MODE from global_types.h
+ Option "OutputMode/Print Quality" PickOne AnySetup 10.0
+ *Choice "Normal/Normal" "<</OutputType(0)/cupsString0(PlainNormalGrayK)/HWResolution[300 300]>>setpagedevice"
+ Choice "Draft/Draft" "<</OutputType(-1)/cupsString0(PlainDraftGrayK)/HWResolution[300 300]>>setpagedevice"
+
+ // Constraints
+
+ Attribute "cupsModelName" "" "DESKJET 540" // APDK device class
+
+ {
+// 4x6 or smaller
+ CustomMedia "Card3x5/Index Card 3x5in" 216 360 18 48 18 9 "<</cupsInteger0 78/PageSize [216 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 78/PageSize[216 360]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki/Hagaki 100x148mm" 284 420 18 48 18 9 "<</cupsInteger0 71/PageSize[284 420]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/PageSize[284 420]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6/Photo 4x6in" 288 432 18 48 18 9 "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6/A6 105x148mm" 297.36 419.76 18 48 18 9 "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+
+// 5x7
+ CustomMedia "Photo5x7/Photo 5x7in" 360 504 18 48 18 9 "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card5x8/Index Card 5x8in" 360 576 18 48 18 9 "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Oufuku/Oufuku-Hagaki 148x200mm" 567 420 18 48 18 9 "<</cupsInteger0 72/PageSize[567 420]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 72/PageSize[567 420]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5/A5 148x210mm" 419.76 595.44 18 48 18 9 "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+
+// Standard
+ CustomMedia "B5/B5 176x250mm" 498.96 708.48 18 48 18 9 "<</cupsInteger0 65/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 65/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5/JB5 182x257mm" 516.24 728.64 18 48 18 9 "<</cupsInteger0 45/PageSize[516.24 728.64]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 45/PageSize [516.24 728.64]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Executive/Executive 7.25x10.5in" 522 756 18 48 18 9 "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ CustomMedia "16k/16k 7.75x10.75in" 558 774 18 48 18 9 "<</cupsInteger0 101/PageSize[558 774]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[558 774]/ImagingBBox null>>setpagedevice" // custom
+ *CustomMedia "Letter/Letter 8.5x11in" 612 792 18 48 18 9 "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4/A4 210x297mm" 595.44 841.68 18 48 18 9 "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ CustomMedia "ExecutiveJIS/Executive (JIS) 8.5x12.986in" 612 936 18 48 18 9 "<</cupsInteger0 10/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 10/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ CustomMedia "FLSA/American Foolscap 8.5x13in" 612 936 18 48 18 9 "<</cupsInteger0 10/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 10/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Legal/Legal 8.5x14in" 612 1008 18 48 18 9 "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+
+// Envelope
+ CustomMedia "EnvA2/A2 Envelope 4.37x5.75in" 314.64 414 18 48 18 9 "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC6/C6 Envelope 114x162mm" 323.28 459.36 18 48 18 9 "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou4/#4 Japanese Envelope 90x205mm" 254.88 581.04 18 48 18 9 "<</cupsInteger0 111/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 111/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvMonarch/Monarch Envelope 3.875x7.5in" 279 540 18 48 18 9 "<</cupsInteger0 80/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 80/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvDL/DL Envelope 110x220mm" 311.76 623.52 18 48 18 9 "<</cupsInteger0 90/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 90/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Env10/#10 Envelope 4.12x9.5in" 297 684 18 48 18 9 "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou3/#3 Japanese Envelope 120x235mm" 339.84 666 18 48 18 9 "<</cupsInteger0 110/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 110/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC5/C5 Envelope 162x229mm" 459 649 18 48 18 9 "<</cupsInteger0 91/PageSize[459 649]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 91/PageSize[459 649]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvB5/B5 Envelope 176x250mm" 499 709 18 48 18 9 "<</cupsInteger0 100/PageSize[499 709]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 100/PageSize[499 709]/ImagingBBox null>>setpagedevice"
+
+ // Custom page sizes from 1x4in to Legal
+ HWMargins 18 48 18 9
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 8.5in 14in
+
+ // <%DJ540:GrayscaleOnly%>
+ {
+ ModelName "HP Officejet"
+ Attribute "NickName" "" "HP Officejet, $Version"
+ Attribute "ShortNickName" "" "HP Officejet"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet;DES:officejet;"
+ PCFileName "hp-officejet.ppd"
+ Attribute "Product" "" "(HP Officejet All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet Lx"
+ Attribute "NickName" "" "HP Officejet Lx, $Version"
+ Attribute "ShortNickName" "" "HP Officejet Lx"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet lx;DES:officejet lx;"
+ PCFileName "hp-officejet_lx.ppd"
+ Attribute "Product" "" "(HP Officejet Lx All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet Series 330"
+ Attribute "NickName" "" "HP Officejet Series 330, $Version"
+ Attribute "ShortNickName" "" "HP Officejet Series 330"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet series 330;DES:officejet series 330;"
+ PCFileName "hp-officejet_series_330.ppd"
+ Attribute "Product" "" "(HP Officejet 330 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet Series 350"
+ Attribute "NickName" "" "HP Officejet Series 350, $Version"
+ Attribute "ShortNickName" "" "HP Officejet Series 350"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet series 350;DES:officejet series 350;"
+ PCFileName "hp-officejet_series_350.ppd"
+ Attribute "Product" "" "(HP Officejet 350 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Deskjet 500"
+ Attribute "NickName" "" "HP Deskjet 500, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 500"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 500;DES:deskjet 500;"
+ PCFileName "hp-deskjet_500.ppd"
+ Attribute "Product" "" "(HP Deskjet 500 Printer)"
+ Attribute "Product" "" "(HP Deskjet 500j Printer)"
+ Attribute "Product" "" "(HP Deskjet 500q Printer)"
+ Attribute "Product" "" "(HP Deskjet 500k Printer)"
+ }
+ {
+ ModelName "HP Deskjet 505j"
+ Attribute "NickName" "" "HP Deskjet 505j, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 505j"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 505j;DES:deskjet 505j;"
+ PCFileName "hp-deskjet_505j.ppd"
+ Attribute "Product" "" "(HP Deskjet 505j Printer)"
+ }
+ {
+ ModelName "HP Deskjet 510"
+ Attribute "NickName" "" "HP Deskjet 510, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 510"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 510;DES:deskjet 510;"
+ PCFileName "hp-deskjet_510.ppd"
+ Attribute "Product" "" "(HP Deskjet 510 Printer)"
+ }
+ {
+ ModelName "HP Deskjet 520"
+ Attribute "NickName" "" "HP Deskjet 520, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 520"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 520;DES:deskjet 520;"
+ PCFileName "hp-deskjet_520.ppd"
+ Attribute "Product" "" "(HP Deskjet 520 Printer)"
+ }
+ } // End Supported media sizes.
+} // End DJ540 Grayscale only
+
+/////////////// DJ540
+{
+ Attribute "hpPrinterLanguage" "" "pcl3"
+ Attribute "hpPrinterPlatform" "" "dj540"
+ Attribute "HPMechOffset" "" "40"
+
+ Group "General/General"
+
+ // MediaPosition values map to MediaSource enumeration in global_types.h
+ Option "InputSlot/Media Source" PickOne AnySetup 10.0
+ *Choice "Auto/Auto-Select" "<</MediaPosition 7>>setpagedevice"
+ Choice "PhotoTray/Photo Tray" "<</MediaPosition 6>>setpagedevice"
+ Choice "Upper/Upper Tray" "<</MediaPosition 1>>setpagedevice"
+ Choice "Lower/Lower Tray" "<</MediaPosition 4>>setpagedevice"
+ Choice "Envelope/Envelope Feeder" "<</MediaPosition 3>>setpagedevice"
+ Choice "LargeCapacity/Large Capacity Tray" "<</MediaPosition 5>>setpagedevice"
+ Choice "Manual/Manual Feeder" "<</MediaPosition 2>>setpagedevice"
+ Choice "MPTray/Multi Purpose Tray" "<</MediaPosition 1>>setpagedevice"
+
+ // cupsMediaType values map to MEDIATYPE from global_types.h
+ Option "MediaType/Media Type" PickOne AnySetup 10.0
+ *Choice "Plain/Plain Paper" "<</MediaType(Plain)/cupsMediaType 0>>setpagedevice"
+
+ // cupsCompression values map to QUALITY_MODE from global_types.h
+ Option "OutputMode/Print Quality" PickOne AnySetup 10.0
+ *Choice "NormalRGB/Normal Color" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 0/OutputType(0)/cupsString0(PlainNormalColor)/HWResolution[300 300]>>setpagedevice"
+ Choice "NormalGray/Normal Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 2/OutputType(0)/cupsString0(PlainNormalGrayK)/HWResolution[300 300]>>setpagedevice"
+ Choice "DraftRGB/Draft Color" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 0/OutputType(-1)/cupsString0(PlainDraftColor)/HWResolution[300 300]>>setpagedevice"
+ Choice "DraftGray/Draft Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 2/OutputType(-1)/cupsString0(PlainDraftGrayK)/HWResolution[300 300]>>setpagedevice"
+
+ // Constraints
+
+ Attribute "cupsModelName" "" "DESKJET 540" // APDK device class
+
+ {
+// 4x6 or smaller
+ CustomMedia "Card3x5/Index Card 3x5in" 216 360 18 48 18 9 "<</cupsInteger0 78/PageSize [216 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 78/PageSize[216 360]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki/Hagaki 100x148mm" 284 420 18 48 18 9 "<</cupsInteger0 71/PageSize[284 420]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/PageSize[284 420]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6/Photo 4x6in" 288 432 18 48 18 9 "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6/A6 105x148mm" 297.36 419.76 18 48 18 9 "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+
+// 5x7
+ CustomMedia "Photo5x7/Photo 5x7in" 360 504 18 48 18 9 "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card5x8/Index Card 5x8in" 360 576 18 48 18 9 "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Oufuku/Oufuku-Hagaki 148x200mm" 567 420 18 48 18 9 "<</cupsInteger0 72/PageSize[567 420]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 72/PageSize[567 420]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5/A5 148x210mm" 419.76 595.44 18 48 18 9 "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+
+// Standard
+ CustomMedia "B5/B5 176x250mm" 498.96 708.48 18 48 18 9 "<</cupsInteger0 65/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 65/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5/JB5 182x257mm" 516.24 728.64 18 48 18 9 "<</cupsInteger0 45/PageSize[516.24 728.64]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 45/PageSize [516.24 728.64]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Executive/Executive 7.25x10.5in" 522 756 18 48 18 9 "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ CustomMedia "16k/16k 7.75x10.75in" 558 774 18 48 18 9 "<</cupsInteger0 101/PageSize[558 774]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[558 774]/ImagingBBox null>>setpagedevice" // custom
+ *CustomMedia "Letter/Letter 8.5x11in" 612 792 18 48 18 9 "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4/A4 210x297mm" 595.44 841.68 18 48 18 9 "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ CustomMedia "ExecutiveJIS/Executive (JIS) 8.5x12.986in" 612 936 18 48 18 9 "<</cupsInteger0 101/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ CustomMedia "FLSA/American Foolscap 8.5x13in" 612 936 18 48 18 9 "<</cupsInteger0 101/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Legal/Legal 8.5x14in" 612 1008 18 48 18 9 "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+
+// Envelope
+ CustomMedia "EnvA2/A2 Envelope 4.37x5.75in" 314.64 414 18 48 18 9 "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC6/C6 Envelope 114x162mm" 323.28 459.36 18 48 18 9 "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou4/#4 Japanese Envelope 90x205mm" 254.88 581.04 18 48 18 9 "<</cupsInteger0 111/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 111/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvMonarch/Monarch Envelope 3.875x7.5in" 279 540 18 48 18 9 "<</cupsInteger0 80/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 80/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvDL/DL Envelope 110x220mm" 311.76 623.52 18 48 18 9 "<</cupsInteger0 101/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Env10/#10 Envelope 4.12x9.5in" 297 684 18 48 18 9 "<</cupsInteger0 101/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou3/#3 Japanese Envelope 120x235mm" 339.84 666 18 48 18 9 "<</cupsInteger0 110/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 110/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC5/C5 Envelope 162x229mm" 459 649 18 48 18 9 "<</cupsInteger0 91/PageSize[459 649]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 91/PageSize[459 649]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvB5/B5 Envelope 176x250mm" 499 709 18 48 18 9 "<</cupsInteger0 100/PageSize[499 709]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 100/PageSize[499 709]/ImagingBBox null>>setpagedevice"
+
+ // Custom page sizes from 1x4in to Legal
+ HWMargins 18 48 18 9
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 8.5in 14in
+
+ // <%DJ540:Normal%>
+ {
+ ModelName "HP Officejet Series 300"
+ Attribute "NickName" "" "HP Officejet Series 300, $Version"
+ Attribute "ShortNickName" "" "HP Officejet Series 300"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet series 300;DES:officejet series 300;"
+ PCFileName "hp-officejet_series_300.ppd"
+ Attribute "Product" "" "(HP Officejet 300 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet Series 310"
+ Attribute "NickName" "" "HP Officejet Series 310, $Version"
+ Attribute "ShortNickName" "" "HP Officejet Series 310"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet series 310;DES:officejet series 310;"
+ PCFileName "hp-officejet_series_310.ppd"
+ Attribute "Product" "" "(HP Officejet 310 All-in-one Series Printer)"
+ }
+ {
+ ModelName "HP Officejet Series 320"
+ Attribute "NickName" "" "HP Officejet Series 320, $Version"
+ Attribute "ShortNickName" "" "HP Officejet Series 320"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet series 320;DES:officejet series 320;"
+ PCFileName "hp-officejet_series_320.ppd"
+ Attribute "Product" "" "(HP Officejet 320 All-in-one Series Printer)"
+ }
+ {
+ ModelName "HP Deskjet 400"
+ Attribute "NickName" "" "HP Deskjet 400, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 400"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp deskjet 400;DES:hp deskjet 400;"
+ PCFileName "hp-deskjet_400.ppd"
+ Attribute "Product" "" "(HP Deskjet 400 Printer)"
+ Attribute "Product" "" "(HP Deskjet 400 Color Capable Printer)"
+ }
+ {
+ ModelName "HP Deskjet 500c"
+ Attribute "NickName" "" "HP Deskjet 500c, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 500c"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 500c;DES:deskjet 500c;"
+ PCFileName "hp-deskjet_500c.ppd"
+ Attribute "Product" "" "(HP Deskjet 500c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 540"
+ Attribute "NickName" "" "HP Deskjet 540, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 540"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 540;DES:deskjet 540;"
+ PCFileName "hp-deskjet_540.ppd"
+ Attribute "Product" "" "(HP Deskjet 540 Printer)"
+ }
+ {
+ ModelName "HP Deskjet 550c"
+ Attribute "NickName" "" "HP Deskjet 550c, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 550c"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp deskjet 550c;DES:hp deskjet 550c;"
+ PCFileName "hp-deskjet_550c.ppd"
+ Attribute "Product" "" "(HP Deskjet 550c Printer)"
+ }
+ } // End Supported media sizes.
+} // End DJ540
+
+/////////////// DJ630
+{
+ Attribute "hpPrinterLanguage" "" "pcl3"
+ Attribute "hpPrinterPlatform" "" "dj630"
+ Attribute "HPMechOffset" "" "40"
+
+ Group "General/General"
+
+ // MediaPosition values map to MediaSource enumeration in global_types.h
+ Option "InputSlot/Media Source" PickOne AnySetup 10.0
+ *Choice "Auto/Auto-Select" "<</MediaPosition 7>>setpagedevice"
+ Choice "PhotoTray/Photo Tray" "<</MediaPosition 6>>setpagedevice"
+ Choice "Upper/Upper Tray" "<</MediaPosition 1>>setpagedevice"
+ Choice "Lower/Lower Tray" "<</MediaPosition 4>>setpagedevice"
+ Choice "Envelope/Envelope Feeder" "<</MediaPosition 3>>setpagedevice"
+ Choice "LargeCapacity/Large Capacity Tray" "<</MediaPosition 5>>setpagedevice"
+ Choice "Manual/Manual Feeder" "<</MediaPosition 2>>setpagedevice"
+ Choice "MPTray/Multi Purpose Tray" "<</MediaPosition 1>>setpagedevice"
+
+ // cupsMediaType values map to MEDIATYPE from global_types.h
+ Option "MediaType/Media Type" PickOne AnySetup 10.0
+ *Choice "Plain/Plain Paper" "<</MediaType(Plain)/cupsMediaType 0>>setpagedevice"
+ Choice "Glossy/Photo Paper" "<</MediaType(Glossy)/cupsMediaType 3>>setpagedevice"
+
+ // cupsCompression values map to QUALITY_MODE from global_types.h
+ Option "OutputMode/Print Quality" PickOne AnySetup 10.0
+ *Choice "NormalRGB/Normal Color" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 0/OutputType(0)/cupsString0(PlainNormalColor)/HWResolution[300 300]>>setpagedevice"
+ Choice "NormalGray/Normal Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 2/OutputType(0)/cupsString0(PlainNormalGrayK)/HWResolution[300 300]>>setpagedevice"
+ Choice "DraftRGB/Draft Color" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 0/OutputType(-1)/cupsString0(PlainDraftColor)/HWResolution[300 300]>>setpagedevice"
+ Choice "DraftGray/Draft Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 2/OutputType(-1)/cupsString0(PlainDraftGrayK)/HWResolution[300 300]>>setpagedevice"
+ Choice "Best/Best" "<</cupsColorSpace 3/cupsBitsPerColor 1/cupsRowStep 1/OutputType(1)/cupsString0(PlainBestGrayK)/HWResolution[600 300]>>setpagedevice" // black only
+ Choice "Photo/Photo" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 0/OutputType(2)/cupsString0(PhotoBestColor)/HWResolution[300 300]>>setpagedevice"
+
+ // Constraints
+ UIConstraints "*MediaType Glossy *OutputMode DraftRGB"
+ UIConstraints "*MediaType Glossy *OutputMode DraftGray"
+ UIConstraints "*MediaType Plain *OutputMode Photo"
+
+ Attribute "cupsModelName" "" "DESKJET 630" // APDK device class
+
+ {
+// 4x6 or smaller
+ CustomMedia "Hagaki/Hagaki 100x148mm" 284 420 18.00 48.24 18.00 9.00 "<</cupsInteger0 71/PageSize[284 420]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/PageSize[284 420]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6/Photo 4x6in" 288 432 18.00 48.24 18.00 9.00 "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6/A6 105x148mm" 297.36 419.76 18.00 48.24 18.00 9.00 "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+
+// 5x7
+ CustomMedia "Photo5x7/Photo 5x7in" 360 504 18.00 48.24 18.00 9.00 "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card5x8/Index Card 5x8in" 360 576 18.00 48.24 18.00 9.00 "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Oufuku/Oufuku-Hagaki 148x200mm" 567 420 18.00 48.24 18.00 9.00 "<</cupsInteger0 101/PageSize[567 420]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[567 420]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5/A5 148x210mm" 419.76 595.44 18.00 48.24 18.00 9.00 "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+
+// Standard
+ CustomMedia "B5/B5 176x250mm" 498.96 708.48 18.00 48.24 18.00 9.00 "<</cupsInteger0 65/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 65/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5/JB5 182x257mm" 516.24 728.64 18.00 48.24 18.00 9.00 "<</cupsInteger0 45/PageSize[516.24 728.64]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 45/PageSize [516.24 728.64]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Executive/Executive 7.25x10.5in" 522 756 18.00 48.24 18.00 9.00 "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ CustomMedia "16k/16k 7.75x10.75in" 558 774 18.00 48.24 18.00 9.00 "<</cupsInteger0 101/PageSize[558 774]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[558 774]/ImagingBBox null>>setpagedevice" // custom
+ *CustomMedia "Letter/Letter 8.5x11in" 612 792 18.00 48.24 18.00 9.00 "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4/A4 210x297mm" 595.44 841.68 9.72 48.24 9.72 9.00 "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ CustomMedia "ExecutiveJIS/Executive (JIS) 8.5x12.986in" 612 936 18.00 48.24 18.00 9.00 "<</cupsInteger0 10/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 10/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ CustomMedia "FLSA/American Foolscap 8.5x13in" 612 936 18.00 48.24 18.00 9.00 "<</cupsInteger0 10/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 10/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Legal/Legal 8.5x14in" 612 1008 18.00 48.24 18.00 9.00 "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+
+// Envelope
+ CustomMedia "EnvA2/A2 Envelope 4.37x5.75in" 314.64 414 18.00 48.24 18.00 9.00 "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC6/C6 Envelope 114x162mm" 323.28 459.36 18.00 48.24 18.00 9.00 "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou4/#4 Japanese Envelope 90x205mm" 254.88 581.04 18.00 48.24 18.00 9.00 "<</cupsInteger0 111/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 111/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvMonarch/Monarch Envelope 3.875x7.5in" 279 540 18.00 48.24 18.00 9.00 "<</cupsInteger0 80/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 80/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvDL/DL Envelope 110x220mm" 311.76 623.52 18.00 48.24 18.00 9.00 "<</cupsInteger0 90/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 90/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Env10/#10 Envelope 4.12x9.5in" 297 684 18.00 48.24 18.00 9.00 "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou3/#3 Japanese Envelope 120x235mm" 339.84 666 18.00 48.24 18.00 9.00 "<</cupsInteger0 110/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 110/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC5/C5 Envelope 162x229mm" 459 649 18.00 48.24 18.00 9.00 "<</cupsInteger0 91/PageSize[459 649]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 91/PageSize[459 649]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvB5/B5 Envelope 176x250mm" 499 709 18.00 48.24 18.00 9.00 "<</cupsInteger0 100/PageSize[499 709]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 100/PageSize[499 709]/ImagingBBox null>>setpagedevice"
+
+ // Custom page sizes from 1x4in to Legal
+ HWMargins 18 48 18 9
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 8.5in 14in
+
+ // <%DJ630:Normal%>
+ {
+ ModelName "HP Deskjet 630c"
+ Attribute "NickName" "" "HP Deskjet 630c, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 630c"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 630c;DES:deskjet 630c;"
+ PCFileName "hp-deskjet_630c.ppd"
+ Attribute "Product" "" "(HP Deskjet 630c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 632c"
+ Attribute "NickName" "" "HP Deskjet 632c, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 632c"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 632c;DES:deskjet 632c;"
+ PCFileName "hp-deskjet_632c.ppd"
+ Attribute "Product" "" "(HP Deskjet 632c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 656c"
+ Attribute "NickName" "" "HP Deskjet 656c, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 656c"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 656c;DES:deskjet 656c;"
+ PCFileName "hp-deskjet_656c.ppd"
+ Attribute "Product" "" "(HP Deskjet 656c Printer)"
+ Attribute "Product" "" "(HP Deskjet 656cvr Printer)"
+ }
+ } // End Supported media sizes.
+} // End DJ630
+
+/////////////// DJ600 and DJ6xx
+{
+ Attribute "hpPrinterLanguage" "" "pcl3"
+ Attribute "hpPrinterPlatform" "" "dj600"
+ Attribute "HPMechOffset" "" "40"
+
+ Group "General/General"
+
+ // MediaPosition values map to MediaSource enumeration in global_types.h
+ Option "InputSlot/Media Source" PickOne AnySetup 10.0
+ *Choice "Auto/Auto-Select" "<</MediaPosition 7>>setpagedevice"
+ Choice "PhotoTray/Photo Tray" "<</MediaPosition 6>>setpagedevice"
+ Choice "Upper/Upper Tray" "<</MediaPosition 1>>setpagedevice"
+ Choice "Lower/Lower Tray" "<</MediaPosition 4>>setpagedevice"
+ Choice "Envelope/Envelope Feeder" "<</MediaPosition 3>>setpagedevice"
+ Choice "LargeCapacity/Large Capacity Tray" "<</MediaPosition 5>>setpagedevice"
+ Choice "Manual/Manual Feeder" "<</MediaPosition 2>>setpagedevice"
+ Choice "MPTray/Multi Purpose Tray" "<</MediaPosition 1>>setpagedevice"
+
+ // cupsMediaType values map to MEDIATYPE from global_types.h
+ Option "MediaType/Media Type" PickOne AnySetup 10.0
+ *Choice "Plain/Plain Paper" "<</MediaType(Plain)/cupsMediaType 0>>setpagedevice"
+
+ // cupsCompression values map to QUALITY_MODE from global_types.h
+ Option "OutputMode/Print Quality" PickOne AnySetup 10.0
+ *Choice "NormalRGB/Normal Color" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 0/OutputType(0)/cupsString0(PlainNormalColor)/HWResolution[300 300]>>setpagedevice"
+ Choice "NormalGray/Normal Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 2/OutputType(0)/cupsString0(PlainNormalGrayK)/HWResolution[300 300]>>setpagedevice"
+ Choice "DraftRGB/Draft Color" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 0/OutputType(-1)/cupsString0(PlainDraftColor)/HWResolution[300 300]>>setpagedevice"
+ Choice "DraftGray/Draft Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 2/OutputType(-1)/cupsString0(PlainDraftGrayK)/HWResolution[300 300]>>setpagedevice"
+ Choice "Best/Best" "<</cupsColorSpace 3/cupsBitsPerColor 1/cupsRowStep 1/OutputType(1)/cupsString0(PlainBestGrayK)/HWResolution[600 300]>>setpagedevice" // black only
+
+ {
+// 4x6 or smaller
+ CustomMedia "Card3x5/Index Card 3x5in" 216 360 18 48 18 9 "<</cupsInteger0 78/PageSize [216 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 78/PageSize[216 360]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki/Hagaki 100x148mm" 284 420 18 48 18 9 "<</cupsInteger0 101/PageSize[284 420]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[284 420]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6/Photo 4x6in" 288 432 18 48 18 9 "<</cupsInteger0 101/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6/A6 105x148mm" 297.36 419.76 18 48 18 9 "<</cupsInteger0 101/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+
+// 5x7
+ CustomMedia "Photo5x7/Photo 5x7in" 360 504 18 48 18 9 "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card5x8/Index Card 5x8in" 360 576 18 48 18 9 "<</cupsInteger0 101/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Oufuku/Oufuku-Hagaki 148x200mm" 567 420 18 48 18 9 "<</cupsInteger0 101/PageSize[567 420]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[567 420]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5/A5 148x210mm" 419.76 595.44 18 48 18 9 "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+
+// Standard
+ CustomMedia "B5/B5 176x250mm" 498.96 708.48 18 48 18 9 "<</cupsInteger0 65/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 65/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5/JB5 182x257mm" 516.24 728.64 18 48 18 9 "<</cupsInteger0 45/PageSize[516.24 728.64]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 45/PageSize [516.24 728.64]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Executive/Executive 7.25x10.5in" 522 756 18 48 18 9 "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ CustomMedia "16k/16k 7.75x10.75in" 558 774 18 48 18 9 "<</cupsInteger0 101/PageSize[558 774]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[558 774]/ImagingBBox null>>setpagedevice" // custom
+ *CustomMedia "Letter/Letter 8.5x11in" 612 792 18 48 18 9 "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4/A4 210x297mm" 595.44 841.68 18 48 18 9 "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ CustomMedia "ExecutiveJIS/Executive (JIS) 8.5x12.986in" 612 936 18 48 18 9 "<</cupsInteger0 101/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ CustomMedia "FLSA/American Foolscap 8.5x13in" 612 936 18 48 18 9 "<</cupsInteger0 101/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Legal/Legal 8.5x14in" 612 1008 18 48 18 9 "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+
+// Envelope
+ CustomMedia "EnvA2/A2 Envelope 4.37x5.75in" 314.64 414 18 48 18 9 "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC6/C6 Envelope 114x162mm" 323.28 459.36 18 48 18 9 "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou4/#4 Japanese Envelope 90x205mm" 254.88 581.04 18 48 18 9 "<</cupsInteger0 111/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 111/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvMonarch/Monarch Envelope 3.875x7.5in" 279 540 18 48 18 9 "<</cupsInteger0 80/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 80/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvDL/DL Envelope 110x220mm" 311.76 623.52 18 48 18 9 "<</cupsInteger0 90/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 90/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Env10/#10 Envelope 4.12x9.5in" 297 684 18 48 18 9 "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou3/#3 Japanese Envelope 120x235mm" 339.84 666 18 48 18 9 "<</cupsInteger0 101/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC5/C5 Envelope 162x229mm" 459 649 18 48 18 9 "<</cupsInteger0 91/PageSize[459 649]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 91/PageSize[459 649]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvB5/B5 Envelope 176x250mm" 499 709 18 48 18 9 "<</cupsInteger0 100/PageSize[499 709]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 100/PageSize[499 709]/ImagingBBox null>>setpagedevice"
+
+ // Custom page sizes from 1x4in to Legal
+ HWMargins 18 48 18 9
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 8.5in 14in
+
+ {
+ Attribute "cupsModelName" "" "DESKJET 600" // APDK device class
+ // <%DJ600:Normal%>
+ {
+ ModelName "HP Deskjet 600"
+ Attribute "NickName" "" "HP Deskjet 600, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 600"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 600;DES:deskjet 600;"
+ PCFileName "hp-deskjet_600.ppd"
+ Attribute "Product" "" "(HP Deskjet 600c Printer)"
+ Attribute "Product" "" "(HP Deskjet 600 Printer)"
+ Attribute "Product" "" "(HP Deskjet 600k Printer)"
+ }
+ }
+ {
+ Attribute "cupsModelName" "" "DESKJET 660" // APDK device class
+ // <%DJ6xx:Normal%>
+ {
+ ModelName "HP Printer Scanner Copier 300"
+ Attribute "NickName" "" "HP Printer Scanner Copier 300, $Version"
+ Attribute "ShortNickName" "" "HP Printer Scanner Copier 300"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:printer scanner copier 300;DES:printer scanner copier 300;"
+ PCFileName "hp-printer_scanner_copier_300.ppd"
+ Attribute "Product" "" "(HP Printer Scanner Copier 300)"
+ }
+ {
+ ModelName "HP Officejet Series 520"
+ Attribute "NickName" "" "HP Officejet Series 520, $Version"
+ Attribute "ShortNickName" "" "HP Officejet Series 520"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet series 520;DES:officejet series 520;"
+ PCFileName "hp-officejet_series_520.ppd"
+ Attribute "Product" "" "(HP Officejet 520 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet Series 570"
+ Attribute "NickName" "" "HP Officejet Series 570, $Version"
+ Attribute "ShortNickName" "" "HP Officejet Series 570"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet series 570;DES:officejet series 570;"
+ PCFileName "hp-officejet_series_570.ppd"
+ Attribute "Product" "" "(HP Officejet 570 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet Series 580"
+ Attribute "NickName" "" "HP Officejet Series 580, $Version"
+ Attribute "ShortNickName" "" "HP Officejet Series 580"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet series 580;DES:officejet series 580;"
+ PCFileName "hp-officejet_series_580.ppd"
+ Attribute "Product" "" "(HP Officejet 580 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet Series 590"
+ Attribute "NickName" "" "HP Officejet Series 590, $Version"
+ Attribute "ShortNickName" "" "HP Officejet Series 590"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet series 590;DES:officejet series 590;"
+ PCFileName "hp-officejet_series_590.ppd"
+ Attribute "Product" "" "(HP Officejet 590 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet Series 600"
+ Attribute "NickName" "" "HP Officejet Series 600, $Version"
+ Attribute "ShortNickName" "" "HP Officejet Series 600"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet series 600;DES:officejet series 600;"
+ PCFileName "hp-officejet_series_600.ppd"
+ Attribute "Product" "" "(HP Officejet 600 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet Series 610"
+ Attribute "NickName" "" "HP Officejet Series 610, $Version"
+ Attribute "ShortNickName" "" "HP Officejet Series 610"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet series 610;DES:officejet series 610;"
+ PCFileName "hp-officejet_series_610.ppd"
+ Attribute "Product" "" "(HP Officejet 610 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet Series 630"
+ Attribute "NickName" "" "HP Officejet Series 630, $Version"
+ Attribute "ShortNickName" "" "HP Officejet Series 630"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet series 630;DES:officejet series 630;"
+ PCFileName "hp-officejet_series_630.ppd"
+ Attribute "Product" "" "(HP Officejet 630 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 635 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Deskjet 660"
+ Attribute "NickName" "" "HP Deskjet 660, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 660"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 660;DES:deskjet 660;"
+ PCFileName "hp-deskjet_660.ppd"
+ Attribute "Product" "" "(HP Deskjet 660k Printer)"
+ Attribute "Product" "" "(HP Deskjet 660c Printer)"
+ Attribute "Product" "" "(HP Deskjet 660cse Printer)"
+ }
+ {
+ ModelName "HP Deskjet 670"
+ Attribute "NickName" "" "HP Deskjet 670, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 670"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 670;DES:deskjet 670;"
+ PCFileName "hp-deskjet_670.ppd"
+ Attribute "Product" "" "(HP Deskjet 670k Printer)"
+ Attribute "Product" "" "(HP Deskjet 670c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 670tv"
+ Attribute "NickName" "" "HP Deskjet 670tv, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 670tv"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 670tv;DES:deskjet 670tv;"
+ PCFileName "hp-deskjet_670tv.ppd"
+ Attribute "Product" "" "(HP Deskjet 670tv Printer)"
+ }
+ {
+ ModelName "HP Deskjet 670c"
+ Attribute "NickName" "" "HP Deskjet 670c, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 670c"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 670c;DES:deskjet 670c;"
+ PCFileName "hp-deskjet_670c.ppd"
+ Attribute "Product" "" "(HP Deskjet 670c)"
+ }
+ {
+ ModelName "HP Deskjet 672c"
+ Attribute "NickName" "" "HP Deskjet 672c, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 672c"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 672c;DES:deskjet 672c;"
+ PCFileName "hp-deskjet_672c.ppd"
+ Attribute "Product" "" "(HP Deskjet 672c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 680"
+ Attribute "NickName" "" "HP Deskjet 680, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 680"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 680;DES:deskjet 680;"
+ PCFileName "hp-deskjet_680.ppd"
+ Attribute "Product" "" "(HP Deskjet 680c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 682"
+ Attribute "NickName" "" "HP Deskjet 682, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 682"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 682;DES:deskjet 682;"
+ PCFileName "hp-deskjet_682.ppd"
+ Attribute "Product" "" "(HP Deskjet 682c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 1100"
+ Attribute "NickName" "" "HP Deskjet 1100, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 1100"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 1100;DES:deskjet 1100;"
+ PCFileName "hp-deskjet_1100.ppd"
+ Attribute "Product" "" "(HP Deskjet 1100c Printer)"
+ }
+ }
+ } // End Supported media sizes.
+} // End DJ600 and DJ6xx
+
+///////////// DJ6xxPhoto
+{
+ Attribute "hpPrinterLanguage" "" "pcl3"
+ Attribute "hpPrinterPlatform" "" "dj690"
+ Attribute "HPMechOffset" "" "40"
+
+ Group "General/General"
+
+ // MediaPosition values map to MediaSource enumeration in global_types.h
+ Option "InputSlot/Media Source" PickOne AnySetup 10.0
+ *Choice "Auto/Auto-Select" "<</MediaPosition 7>>setpagedevice"
+ Choice "PhotoTray/Photo Tray" "<</MediaPosition 6>>setpagedevice"
+ Choice "Upper/Upper Tray" "<</MediaPosition 1>>setpagedevice"
+ Choice "Lower/Lower Tray" "<</MediaPosition 4>>setpagedevice"
+ Choice "Envelope/Envelope Feeder" "<</MediaPosition 3>>setpagedevice"
+ Choice "LargeCapacity/Large Capacity Tray" "<</MediaPosition 5>>setpagedevice"
+ Choice "Manual/Manual Feeder" "<</MediaPosition 2>>setpagedevice"
+ Choice "MPTray/Multi Purpose Tray" "<</MediaPosition 1>>setpagedevice"
+
+ // cupsMediaType values map to MEDIATYPE from global_types.h
+ Option "MediaType/Media Type" PickOne AnySetup 10.0
+ *Choice "Plain/Plain Paper" "<</MediaType(Plain)/cupsMediaType 0>>setpagedevice"
+ Choice "Glossy/Photo Paper" "<</MediaType(Glossy)/cupsMediaType 3>>setpagedevice"
+
+ // cupsCompression values map to QUALITY_MODE from global_types.h
+ Option "OutputMode/Print Quality" PickOne AnySetup 10.0
+ *Choice "NormalRGB/Normal Color" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 0/OutputType(0)/cupsString0(PlainNormalColor)/HWResolution[300 300]>>setpagedevice"
+ Choice "NormalGray/Normal Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 2/OutputType(0)/cupsString0(PlainNormalGrayK)/HWResolution[300 300]>>setpagedevice"
+ Choice "DraftRGB/Draft Color" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 0/OutputType(-1)/cupsString0(PlainDraftColor)/HWResolution[300 300]>>setpagedevice"
+ Choice "DraftGray/Draft Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 2/OutputType(-1)/cupsString0(PlainDraftGrayK)/HWResolution[300 300]>>setpagedevice"
+ Choice "Best/Best" "<</cupsColorSpace 3/cupsBitsPerColor 1/cupsRowStep 1/OutputType(1)/cupsString0(PlainBestGrayK)/HWResolution[600 300]>>setpagedevice"
+ Choice "Photo/Photo" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 0/OutputType(2)/cupsString0(PhotoBestColor)/HWResolution[300 300]>>setpagedevice"
+
+ // Constraints
+ UIConstraints "*MediaType Glossy *OutputMode DraftRGB"
+ UIConstraints "*MediaType Glossy *OutputMode DraftGray"
+ UIConstraints "*MediaType Plain *OutputMode Photo"
+
+ Attribute "cupsModelName" "" "DESKJET 610" // APDK device class
+
+ {
+// 4x6 or smaller
+ CustomMedia "Card3x5/Index Card 3x5in" 216 360 18.00 48.24 18.00 9.00 "<</cupsInteger0 78/PageSize [216 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 78/PageSize[216 360]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki/Hagaki 100x148mm" 284 420 18.00 48.24 18.00 9.00 "<</cupsInteger0 101/PageSize[284 420]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[284 420]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6/Photo 4x6in" 288 432 18.00 48.24 18.00 9.00 "<</cupsInteger0 101/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6/A6 105x148mm" 297.36 419.76 18.00 48.24 18.00 9.00 "<</cupsInteger0 101/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+
+// 5x7
+ CustomMedia "Photo5x7/Photo 5x7in" 360 504 18.00 48.24 18.00 9.00 "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card5x8/Index Card 5x8in" 360 576 18.00 48.24 18.00 9.00 "<</cupsInteger0 101/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Oufuku/Oufuku-Hagaki 148x200mm" 567 420 18.00 48.24 18.00 9.00 "<</cupsInteger0 101/PageSize[567 420]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[567 420]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5/A5 148x210mm" 419.76 595.44 18.00 48.24 18.00 9.00 "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+
+// Standard
+ CustomMedia "B5/B5 176x250mm" 498.96 708.48 18.00 48.24 18.00 9.00 "<</cupsInteger0 65/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 65/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5/JB5 182x257mm" 516.24 728.64 18.00 48.24 18.00 9.00 "<</cupsInteger0 45/PageSize[516.24 728.64]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 45/PageSize [516.24 728.64]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Executive/Executive 7.25x10.5in" 522 756 18.00 48.24 18.00 9.00 "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ CustomMedia "16k/16k 7.75x10.75in" 558 774 18.00 48.24 18.00 9.00 "<</cupsInteger0 101/PageSize[558 774]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[558 774]/ImagingBBox null>>setpagedevice" // custom
+ *CustomMedia "Letter/Letter 8.5x11in" 612 792 18.00 48.24 18.00 9.00 "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4/A4 210x297mm" 595.44 841.68 9.72 48.24 9.72 9.00 "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ CustomMedia "ExecutiveJIS/Executive (JIS) 8.5x12.986in" 612 936 18.00 48.24 18.00 9.00 "<</cupsInteger0 10/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 10/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ CustomMedia "FLSA/American Foolscap 8.5x13in" 612 936 18.00 48.24 18.00 9.00 "<</cupsInteger0 10/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 10/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Legal/Legal 8.5x14in" 612 1008 18.00 48.24 18.00 9.00 "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+
+// Envelope
+ CustomMedia "EnvA2/A2 Envelope 4.37x5.75in" 314.64 414 18.00 48.24 18.00 9.00 "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC6/C6 Envelope 114x162mm" 323.28 459.36 18.00 48.24 18.00 9.00 "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou4/#4 Japanese Envelope 90x205mm" 254.88 581.04 18.00 48.24 18.00 9.00 "<</cupsInteger0 101/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvMonarch/Monarch Envelope 3.875x7.5in" 279 540 18.00 48.24 18.00 9.00 "<</cupsInteger0 80/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 80/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvDL/DL Envelope 110x220mm" 311.76 623.52 18.00 48.24 18.00 9.00 "<</cupsInteger0 90/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 90/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Env10/#10 Envelope 4.12x9.5in" 297 684 18.00 48.24 18.00 9.00 "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou3/#3 Japanese Envelope 120x235mm" 339.84 666 18.00 48.24 18.00 9.00 "<</cupsInteger0 110/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 110/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC5/C5 Envelope 162x229mm" 459 649 18.00 48.24 18.00 9.00 "<</cupsInteger0 91/PageSize[459 649]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 91/PageSize[459 649]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvB5/B5 Envelope 176x250mm" 499 709 18.00 48.24 18.00 9.00 "<</cupsInteger0 100/PageSize[499 709]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 100/PageSize[499 709]/ImagingBBox null>>setpagedevice"
+
+ // Custom page sizes from 1x4in to Legal
+ HWMargins 18 48 18 9
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 8.5in 14in
+
+ // <%DJ6xxPhoto:Normal%>
+ {
+ ModelName "HP Deskjet 610c"
+ Attribute "NickName" "" "HP Deskjet 610c, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 610c"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 610c;DES:deskjet 610c;"
+ PCFileName "hp-deskjet_610c.ppd"
+ Attribute "Product" "" "(HP Deskjet 610c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 610cl"
+ Attribute "NickName" "" "HP Deskjet 610cl, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 610cl"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 610cl;DES:deskjet 610cl;"
+ PCFileName "hp-deskjet_610cl.ppd"
+ Attribute "Product" "" "(HP Deskjet 610cl Printer)"
+ }
+ {
+ ModelName "HP Deskjet 612c"
+ Attribute "NickName" "" "HP Deskjet 612c, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 612c"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 612c;DES:deskjet 612c;"
+ PCFileName "hp-deskjet_612c.ppd"
+ Attribute "Product" "" "(HP Deskjet 612c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 640c"
+ Attribute "NickName" "" "HP Deskjet 640c, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 640c"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 640c;DES:deskjet 640c;"
+ PCFileName "hp-deskjet_640c.ppd"
+ Attribute "Product" "" "(HP Deskjet 640c Lite Printer)"
+ Attribute "Product" "" "(HP Deskjet 640c Printer)"
+ Attribute "Product" "" "(HP Deskjet 640u Printer)"
+ Attribute "Product" "" "(HP Deskjet 640c Pavilion Turbo Printer)"
+ Attribute "Product" "" "(HP Deskjet 642c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 648c"
+ Attribute "NickName" "" "HP Deskjet 648c, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 648c"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 648c;DES:deskjet 648c;"
+ PCFileName "hp-deskjet_648c.ppd"
+ Attribute "Product" "" "(HP Deskjet 648c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 690c"
+ Attribute "NickName" "" "HP Deskjet 690c, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 690c"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 690c;DES:deskjet 690c;"
+ PCFileName "hp-deskjet_690c.ppd"
+ Attribute "Product" "" "(HP Deskjet 690c Plus Printer)"
+ Attribute "Product" "" "(HP Deskjet 690c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 690"
+ Attribute "NickName" "" "HP Deskjet 690, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 690"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 690;DES:deskjet 690;"
+ PCFileName "hp-deskjet_690.ppd"
+ Attribute "Product" "" "(HP Deskjet 690c Printer)"
+ Attribute "Product" "" "(HP Deskjet 690c Plus Printer)"
+ }
+ {
+ ModelName "HP Deskjet 692"
+ Attribute "NickName" "" "HP Deskjet 692, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 692"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 692;DES:deskjet 692;"
+ PCFileName "hp-deskjet_692.ppd"
+ Attribute "Product" "" "(HP Deskjet 692k Printer)"
+ Attribute "Product" "" "(HP Deskjet 692c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 693"
+ Attribute "NickName" "" "HP Deskjet 693, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 693"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 693;DES:deskjet 693;"
+ PCFileName "hp-deskjet_693.ppd"
+ Attribute "Product" "" "(HP Deskjet 693c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 694"
+ Attribute "NickName" "" "HP Deskjet 694, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 694"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 694;DES:deskjet 694;"
+ PCFileName "hp-deskjet_694.ppd"
+ Attribute "Product" "" "(HP Deskjet 694c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 695"
+ Attribute "NickName" "" "HP Deskjet 695, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 695"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 695;DES:deskjet 695;"
+ PCFileName "hp-deskjet_695.ppd"
+ Attribute "Product" "" "(HP Deskjet 695cci Printer)"
+ Attribute "Product" "" "(HP Deskjet 695c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 697"
+ Attribute "NickName" "" "HP Deskjet 697, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 697"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 697;DES:deskjet 697;"
+ PCFileName "hp-deskjet_697.ppd"
+ Attribute "Product" "" "(HP Deskjet 697c Printer)"
+ }
+ {
+ ModelName "HP Officejet Series 700"
+ Attribute "NickName" "" "HP Officejet Series 700, $Version"
+ Attribute "ShortNickName" "" "HP Officejet Series 700"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet series 700;DES:officejet series 700;"
+ PCFileName "hp-officejet_series_700.ppd"
+ Attribute "Product" "" "(HP Officejet 700 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet Series 710"
+ Attribute "NickName" "" "HP Officejet Series 710, $Version"
+ Attribute "ShortNickName" "" "HP Officejet Series 710"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet series 710;DES:officejet series 710;"
+ PCFileName "hp-officejet_series_710.ppd"
+ Attribute "Product" "" "(HP Officejet 710 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet Series 720"
+ Attribute "NickName" "" "HP Officejet Series 720, $Version"
+ Attribute "ShortNickName" "" "HP Officejet Series 720"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet series 720;DES:officejet series 720;"
+ PCFileName "hp-officejet_series_720.ppd"
+ Attribute "Product" "" "(HP Officejet 720 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet Series 725"
+ Attribute "NickName" "" "HP Officejet Series 725, $Version"
+ Attribute "ShortNickName" "" "HP Officejet Series 725"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet series 725;DES:officejet series 725;"
+ PCFileName "hp-officejet_series_725.ppd"
+ Attribute "Product" "" "(HP Officejet 725 All-in-one Printer)"
+ }
+ } // End Supported media sizes.
+} // End DJ6xxPhoto
+
+///////////////// DJ8xx
+{
+ Attribute "hpPrinterLanguage" "" "pcl3gui"
+ Attribute "hpPrinterPlatform" "" "dj895"
+ Attribute "HPMechOffset" "" "40"
+
+ Group "General/General"
+
+ // MediaPosition values map to MediaSource enumeration in global_types.h
+ Option "InputSlot/Media Source" PickOne AnySetup 10.0
+ *Choice "Auto/Auto-Select" "<</MediaPosition 7>>setpagedevice"
+ Choice "PhotoTray/Photo Tray" "<</MediaPosition 6>>setpagedevice"
+ Choice "Upper/Upper Tray" "<</MediaPosition 1>>setpagedevice"
+ Choice "Lower/Lower Tray" "<</MediaPosition 4>>setpagedevice"
+ Choice "Envelope/Envelope Feeder" "<</MediaPosition 3>>setpagedevice"
+ Choice "LargeCapacity/Large Capacity Tray" "<</MediaPosition 5>>setpagedevice"
+ Choice "Manual/Manual Feeder" "<</MediaPosition 2>>setpagedevice"
+ Choice "MPTray/Multi Purpose Tray" "<</MediaPosition 1>>setpagedevice"
+
+ // cupsMediaType values map to MEDIATYPE from global_types.h
+ Option "MediaType/Media Type" PickOne AnySetup 10.0
+ *Choice "Plain/Plain Paper" "<</MediaType(Plain)/cupsMediaType 0>>setpagedevice"
+ Choice "Glossy/Photo Paper" "<</MediaType(Glossy)/cupsMediaType 3>>setpagedevice"
+
+ // cupsCompression values map to QUALITY_MODE from global_types.h
+ Option "OutputMode/Print Quality" PickOne AnySetup 10.0
+ *Choice "NormalRGB/Normal Color" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 0/OutputType(0)/cupsString0(PlainNormalColor)/HWResolution[300 300]>>setpagedevice"
+ Choice "NormalGray/Normal Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 2/OutputType(0)/cupsString0(PlainNormalGrayK)/HWResolution[600 600]>>setpagedevice"
+ Choice "DraftRGB/Draft Color" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 0/OutputType(-1)/cupsString0(PlainDraftColor)/HWResolution[300 300]>>setpagedevice"
+ Choice "DraftGray/Draft Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 2/OutputType(-1)/cupsString0(PlainDraftGrayK)/HWResolution[300 300]>>setpagedevice"
+ //Choice "BestGray/Best Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 2/cupsCompression 2/HWResolution[600 600]>>setpagedevice" // black only
+ Choice "Photo/High-Resolution Photo" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 0/OutputType(2)/cupsString0(PhotoBestColor)/HWResolution[600 600]>>setpagedevice"
+
+ // Constraints
+ UIConstraints "*MediaType Glossy *OutputMode DraftGray"
+ UIConstraints "*MediaType Glossy *OutputMode DraftRGB"
+ UIConstraints "*MediaType Plain *OutputMode Photo"
+
+ Attribute "cupsModelName" "" "DESKJET 810" // APDK device class
+
+ {
+// 4x6 or smaller
+ CustomMedia "Card3x5/Index Card 3x5in" 216 360 18.00 36.00 18.00 9.00 "<</cupsInteger0 78/PageSize [216 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 78/PageSize[216 360]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki/Hagaki 100x148mm" 284 420 9.00 36.00 9.00 9.00 "<</cupsInteger0 71/PageSize[284 420]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/PageSize[284 420]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6/Photo 4x6in" 288 432 9.00 36.00 9.00 9.00 "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6/A6 105x148mm" 297.36 419.76 9 36 9 9 "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+
+// 5x7
+ CustomMedia "Photo5x7/Photo 5x7in" 360 504 9.00 36.00 9.00 9.00 "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card5x8/Index Card 5x8in" 360 576 18.00 36.00 18.00 9.00 "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Oufuku/Oufuku-Hagaki 148x200mm" 567 420 18.00 36.00 18.00 9.00 "<</cupsInteger0 72/PageSize[567 420]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 72/PageSize[567 420]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5/A5 148x210mm" 419.76 595.44 9.00 36.00 9.00 9.00 "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+
+// Standard
+ CustomMedia "B5/B5 176x250mm" 498.96 708.48 9 36 9 9 "<</cupsInteger0 65/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 65/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5/JB5 182x257mm" 516.24 728.64 9 36 9 9 "<</cupsInteger0 45/PageSize[516.24 728.64]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 45/PageSize [516.24 728.64]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Executive/Executive 7.25x10.5in" 522 756 18.00 36.00 18.00 9.00 "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ CustomMedia "16k/16k 7.75x10.75in" 558 774 18.00 36.00 18.00 9.00 "<</cupsInteger0 101/PageSize[558 774]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[558 774]/ImagingBBox null>>setpagedevice" // custom
+ *CustomMedia "Letter/Letter 8.5x11in" 612 792 18.00 36.00 18.00 9.00 "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4/A4 210x297mm" 595.44 841.68 9.72 36.00 9.72 9.00 "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ CustomMedia "ExecutiveJIS/Executive (JIS) 8.5x12.986in" 612 936 18.00 36.00 18.00 9.00 "<</cupsInteger0 10/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 10/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ CustomMedia "FLSA/American Foolscap 8.5x13in" 612 936 18.00 36.00 18.00 9.00 "<</cupsInteger0 10/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 10/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Legal/Legal 8.5x14in" 612 1008 18.00 36.00 18.00 9.00 "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+
+// Envelope
+ CustomMedia "EnvA2/A2 Envelope 4.37x5.75in" 314.64 414 9.00 36.00 9.00 9.00 "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC6/C6 Envelope 114x162mm" 323.28 459.36 18.00 36.00 18.00 9.00 "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou4/#4 Japanese Envelope 90x205mm" 254.88 581.04 18.00 36.00 18.00 9.00 "<</cupsInteger0 111/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 111/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvMonarch/Monarch Envelope 3.875x7.5in" 279 540 18.00 36.00 18.00 9.00 "<</cupsInteger0 80/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 80/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvDL/DL Envelope 110x220mm" 311.76 623.52 18.00 36.00 18.00 9.00 "<</cupsInteger0 90/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 90/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Env10/#10 Envelope 4.12x9.5in" 297 684 18.00 36.00 18.00 9.00 "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou3/#3 Japanese Envelope 120x235mm" 339.84 666 18.00 36.00 18.00 9.00 "<</cupsInteger0 110/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 110/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC5/C5 Envelope 162x229mm" 459 649 18.00 36.00 18.00 9.00 "<</cupsInteger0 91/PageSize[459 649]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 91/PageSize[459 649]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvB5/B5 Envelope 176x250mm" 499 709 18.00 36.00 18.00 9.00 "<</cupsInteger0 100/PageSize[499 709]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 100/PageSize[499 709]/ImagingBBox null>>setpagedevice"
+
+ // Custom page sizes from 1x4in to Legal
+ HWMargins 9 36 9 9
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 8.5in 14in
+
+ // <%DJ8xx:Normal%>
+ {
+ ModelName "HP Officejet T Series"
+ Attribute "NickName" "" "HP Officejet T Series, $Version"
+ Attribute "ShortNickName" "" "HP Officejet T Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet t series;DES:officejet t series;"
+ PCFileName "hp-officejet_t_series.ppd"
+ Attribute "Product" "" "(HP Officejet t45 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet t45xi All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet t65 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet t65xi All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet r40"
+ Attribute "NickName" "" "HP Officejet r40, $Version"
+ Attribute "ShortNickName" "" "HP Officejet r40"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet r40;DES:officejet r40;"
+ PCFileName "hp-officejet_r40.ppd"
+ Attribute "Product" "" "(HP Officejet r40 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet r40xi"
+ Attribute "NickName" "" "HP Officejet r40xi, $Version"
+ Attribute "ShortNickName" "" "HP Officejet r40xi"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet r40xi;DES:officejet r40xi;"
+ PCFileName "hp-officejet_r40xi.ppd"
+ Attribute "Product" "" "(HP Officejet r40xi All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet r45"
+ Attribute "NickName" "" "HP Officejet r45, $Version"
+ Attribute "ShortNickName" "" "HP Officejet r45"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet r45;DES:officejet r45;"
+ PCFileName "hp-officejet_r45.ppd"
+ Attribute "Product" "" "(HP Officejet r45 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet r60"
+ Attribute "NickName" "" "HP Officejet r60, $Version"
+ Attribute "ShortNickName" "" "HP Officejet r60"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet r60;DES:officejet r60;"
+ PCFileName "hp-officejet_r60.ppd"
+ Attribute "Product" "" "(HP Officejet r60 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet r65"
+ Attribute "NickName" "" "HP Officejet r65, $Version"
+ Attribute "ShortNickName" "" "HP Officejet r65"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet r65;DES:officejet r65;"
+ PCFileName "hp-officejet_r65.ppd"
+ Attribute "Product" "" "(HP Officejet r65 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet r80xi"
+ Attribute "NickName" "" "HP Officejet r80xi, $Version"
+ Attribute "ShortNickName" "" "HP Officejet r80xi"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet r80xi;DES:officejet r80xi;"
+ PCFileName "hp-officejet_r80xi.ppd"
+ Attribute "Product" "" "(HP Officejet r80xi All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet r80"
+ Attribute "NickName" "" "HP Officejet r80, $Version"
+ Attribute "ShortNickName" "" "HP Officejet r80"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet r80;DES:officejet r80;"
+ PCFileName "hp-officejet_r80.ppd"
+ Attribute "Product" "" "(HP Officejet r80 All-in-one Printer)"
+ }
+ {
+ ModelName "HP PSC 500"
+ Attribute "NickName" "" "HP PSC 500, $Version"
+ Attribute "ShortNickName" "" "HP PSC 500"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:psc 500;DES:psc 500;"
+ PCFileName "hp-psc_500.ppd"
+ Attribute "Product" "" "(HP PSC 500 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 500xi All-in-one Printer)"
+ }
+ {
+ ModelName "HP Deskjet 810c"
+ Attribute "NickName" "" "HP Deskjet 810c, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 810c"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 810c;DES:deskjet 810c;"
+ PCFileName "hp-deskjet_810c.ppd"
+ Attribute "Product" "" "(HP Deskjet 810c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 812c"
+ Attribute "NickName" "" "HP Deskjet 812c, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 812c"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 812c;DES:deskjet 812c;"
+ PCFileName "hp-deskjet_812c.ppd"
+ Attribute "Product" "" "(HP Deskjet 812c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 815c"
+ Attribute "NickName" "" "HP Deskjet 815c, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 815c"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 815c;DES:deskjet 815c;"
+ PCFileName "hp-deskjet_815c.ppd"
+ Attribute "Product" "" "(HP Deskjet 815c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 816c"
+ Attribute "NickName" "" "HP Deskjet 816c, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 816c"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 816c;DES:deskjet 816c;"
+ PCFileName "hp-deskjet_816c.ppd"
+ Attribute "Product" "" "(HP Deskjet 816 Printer)"
+ }
+ {
+ ModelName "HP Deskjet 830c"
+ Attribute "NickName" "" "HP Deskjet 830c, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 830c"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 830c;DES:deskjet 830c;"
+ PCFileName "hp-deskjet_830c.ppd"
+ Attribute "Product" "" "(HP Deskjet 830c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 832c"
+ Attribute "NickName" "" "HP Deskjet 832c, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 832c"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 832c;DES:deskjet 832c;"
+ PCFileName "hp-deskjet_832c.ppd"
+ Attribute "Product" "" "(HP Deskjet 832c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 840c"
+ Attribute "NickName" "" "HP Deskjet 840c, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 840c"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 840c;DES:deskjet 840c;"
+ PCFileName "hp-deskjet_840c.ppd"
+ Attribute "Product" "" "(HP Deskjet 840c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 841c"
+ Attribute "NickName" "" "HP Deskjet 841c, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 841c"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 841c;DES:deskjet 841c;"
+ PCFileName "hp-deskjet_841c.ppd"
+ Attribute "Product" "" "(HP Deskjet 841c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 842c"
+ Attribute "NickName" "" "HP Deskjet 842c, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 842c"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 842c;DES:deskjet 842c;"
+ PCFileName "hp-deskjet_842c.ppd"
+ Attribute "Product" "" "(HP Deskjet 842c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 843c"
+ Attribute "NickName" "" "HP Deskjet 843c, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 843c"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 843c;DES:deskjet 843c;"
+ PCFileName "hp-deskjet_843c.ppd"
+ Attribute "Product" "" "(HP Deskjet 843c Printer)"
+ Attribute "Product" "" "(HP Deskjet 843cxe Printer)"
+ }
+ {
+ ModelName "HP Deskjet 880c"
+ Attribute "NickName" "" "HP Deskjet 880c, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 880c"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 880c;DES:deskjet 880c;"
+ PCFileName "hp-deskjet_880c.ppd"
+ Attribute "Product" "" "(HP Deskjet 880c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 882c"
+ Attribute "NickName" "" "HP Deskjet 882c, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 882c"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 882c;DES:deskjet 882c;"
+ PCFileName "hp-deskjet_882c.ppd"
+ Attribute "Product" "" "(HP Deskjet 882c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 895c"
+ Attribute "NickName" "" "HP Deskjet 895c, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 895c"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 895c;DES:deskjet 895c;"
+ PCFileName "hp-deskjet_895c.ppd"
+ Attribute "Product" "" "(HP Deskjet 895cse Printer)"
+ Attribute "Product" "" "(HP Deskjet 895c Printer)"
+ Attribute "Product" "" "(HP Deskjet 895cxi Printer)"
+ }
+ } // End supported media sizes.
+} // End DJ8xx
+
+////////////// DJ8x5
+{
+ Attribute "hpPrinterLanguage" "" "pcl3gui"
+ Attribute "hpPrinterPlatform" "" "dj8x5"
+ Attribute "HPMechOffset" "" "40"
+
+ Group "General/General"
+
+ // MediaPosition values map to MediaSource enumeration in global_types.h
+ Option "InputSlot/Media Source" PickOne AnySetup 10.0
+ *Choice "Auto/Auto-Select" "<</MediaPosition 7>>setpagedevice"
+ Choice "PhotoTray/Photo Tray" "<</MediaPosition 6>>setpagedevice"
+ Choice "Upper/Upper Tray" "<</MediaPosition 1>>setpagedevice"
+ Choice "Lower/Lower Tray" "<</MediaPosition 4>>setpagedevice"
+ Choice "Envelope/Envelope Feeder" "<</MediaPosition 3>>setpagedevice"
+ Choice "LargeCapacity/Large Capacity Tray" "<</MediaPosition 5>>setpagedevice"
+ Choice "Manual/Manual Feeder" "<</MediaPosition 2>>setpagedevice"
+ Choice "MPTray/Multi Purpose Tray" "<</MediaPosition 1>>setpagedevice"
+
+ // cupsMediaType values map to MEDIATYPE from global_types.h
+ Option "MediaType/Media Type" PickOne AnySetup 10.0
+ *Choice "Plain/Plain Paper" "<</MediaType(Plain)/cupsMediaType 0>>setpagedevice"
+ Choice "Glossy/Photo Paper" "<</MediaType(Glossy)/cupsMediaType 3>>setpagedevice"
+
+ // cupsCompression values map to QUALITY_MODE from global_types.h
+ Option "OutputMode/Print Quality" PickOne AnySetup 10.0
+ *Choice "NormalRGB/Normal Color" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 0/OutputType(0)/cupsString0(PlainNormalColor)/HWResolution[300 300]>>setpagedevice"
+ Choice "NormalGray/Normal Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 2/OutputType(0)/cupsString0(PlainNormalGrayK)/HWResolution[600 600]>>setpagedevice"
+ Choice "DraftRGB/Draft Color" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 0/OutputType(-1)/cupsString0(PlainDraftColor)/HWResolution[300 300]>>setpagedevice"
+ Choice "DraftGray/Draft Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 2/OutputType(-1)/cupsString0(PlainDraftGrayK)/HWResolution[300 300]>>setpagedevice"
+ //Choice "BestGray/Best Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 2/cupsCompression 2/HWResolution[600 600]>>setpagedevice" // black only
+ Choice "Photo/High-Resolution Photo" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 0/OutputType(2)/cupsString0(PhotoBestColor)/HWResolution[600 600]>>setpagedevice"
+
+ // Constraints
+ UIConstraints "*MediaType Glossy *OutputMode DraftGray"
+ UIConstraints "*MediaType Glossy *OutputMode DraftRGB"
+ UIConstraints "*MediaType Plain *OutputMode Photo"
+
+ Attribute "cupsModelName" "" "DESKJET 825" // APDK device class
+
+ {
+// 4x6 or smaller
+ CustomMedia "Card3x5/Index Card 3x5in" 216 360 18.00 36.00 18.00 9.00 "<</cupsInteger0 78/PageSize [216 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 78/PageSize[216 360]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki/Hagaki 100x148mm" 284 420 9.00 36.00 9.00 9.00 "<</cupsInteger0 101/PageSize[284 420]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[284 420]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6/Photo 4x6in" 288 432 9.00 36.00 9.00 9.00 "<</cupsInteger0 101/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6/A6 105x148mm" 297.36 419.76 9.00 36.00 9.00 9.00 "<</cupsInteger0 101/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+
+// 5x7
+ CustomMedia "Photo5x7/Photo 5x7in" 360 504 9.00 36.00 9.00 9.00 "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card5x8/Index Card 5x8in" 360 576 18.00 36.00 18.00 9.00 "<</cupsInteger0 101/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Oufuku/Oufuku-Hagaki 148x200mm" 567 420 18.00 36.00 18.00 9.00 "<</cupsInteger0 101/PageSize[567 420]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[567 420]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5/A5 148x210mm" 419.76 595.44 9.00 36.00 9.00 9.00 "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+
+// Standard
+ CustomMedia "B5/B5 176x250mm" 498.96 708.48 9 36 9 9 "<</cupsInteger0 65/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 65/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5/JB5 182x257mm" 516.24 728.64 9 36 9 9 "<</cupsInteger0 45/PageSize[516.24 728.64]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 45/PageSize [516.24 728.64]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Executive/Executive 7.25x10.5in" 522 756 18.00 36.00 18.00 9.00 "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ CustomMedia "16k/16k 7.75x10.75in" 558 774 18.00 36.00 18.00 9.00 "<</cupsInteger0 40/PageSize[558 774]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 40/PageSize[558 774]/ImagingBBox null>>setpagedevice" // custom
+ *CustomMedia "Letter/Letter 8.5x11in" 612 792 18.00 36.00 18.00 9.00 "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4/A4 210x297mm" 595.44 841.68 9 36 9 9 "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Legal/Legal 8.5x14in" 612 1008 18.00 36.00 18.00 9.00 "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+
+// Envelope
+ CustomMedia "EnvA2/A2 Envelope 4.37x5.75in" 314.64 414 18.00 36.00 18.00 9.00 "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC6/C6 Envelope 114x162mm" 323.28 459.36 18.00 36.00 18.00 9.00 "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou4/#4 Japanese Envelope 90x205mm" 254.88 581.04 18.00 36.00 18.00 9.00 "<</cupsInteger0 111/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 111/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvMonarch/Monarch Envelope 3.875x7.5in" 279 540 18.00 36.00 18.00 9.00 "<</cupsInteger0 80/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 80/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvDL/DL Envelope 110x220mm" 311.76 623.52 18.00 36.00 18.00 9.00 "<</cupsInteger0 90/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 90/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Env10/#10 Envelope 4.12x9.5in" 297 684 18.00 36.00 18.00 9.00 "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou3/#3 Japanese Envelope 120x235mm" 339.84 666 18.00 36.00 18.00 9.00 "<</cupsInteger0 110/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 110/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC5/C5 Envelope 162x229mm" 459 649 18.00 36.00 18.00 9.00 "<</cupsInteger0 91/PageSize[459 649]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 91/PageSize[459 649]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvB5/B5 Envelope 176x250mm" 499 709 18.00 36.00 18.00 9.00 "<</cupsInteger0 100/PageSize[499 709]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 100/PageSize[499 709]/ImagingBBox null>>setpagedevice"
+
+ // Custom page sizes from 1x4in to Legal
+ HWMargins 9 36 9 9
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 8.5in 14in
+
+ // <%DJ8x5:Normal%>
+ {
+ ModelName "HP Deskjet 825c"
+ Attribute "NickName" "" "HP Deskjet 825c, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 825c"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 825c;DES:deskjet 825c;"
+ PCFileName "hp-deskjet_825c.ppd"
+ Attribute "Product" "" "(HP Deskjet 825cvr Printer)"
+ Attribute "Product" "" "(HP Deskjet 825c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 845c"
+ Attribute "NickName" "" "HP Deskjet 845c, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 845c"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 845c;DES:deskjet 845c;"
+ PCFileName "hp-deskjet_845c.ppd"
+ Attribute "Product" "" "(HP Deskjet 845c Printer)"
+ Attribute "Product" "" "(HP Deskjet 845cvr Printer)"
+ }
+ } // End supported media sizes.
+} // End DJ8x5
+
+///////////////////// DJ850
+{
+ Attribute "hpPrinterLanguage" "" "pcl3"
+ Attribute "hpPrinterPlatform" "" "dj850"
+ Attribute "HPMechOffset" "" "40"
+
+ Group "General/General"
+
+ // MediaPosition values map to MediaSource enumeration in global_types.h
+ Option "InputSlot/Media Source" PickOne AnySetup 10.0
+ *Choice "Auto/Auto-Select" "<</MediaPosition 7>>setpagedevice"
+ Choice "PhotoTray/Photo Tray" "<</MediaPosition 6>>setpagedevice"
+ Choice "Upper/Upper Tray" "<</MediaPosition 1>>setpagedevice"
+ Choice "Lower/Lower Tray" "<</MediaPosition 4>>setpagedevice"
+ Choice "Envelope/Envelope Feeder" "<</MediaPosition 3>>setpagedevice"
+ Choice "LargeCapacity/Large Capacity Tray" "<</MediaPosition 5>>setpagedevice"
+ Choice "Manual/Manual Feeder" "<</MediaPosition 2>>setpagedevice"
+ Choice "MPTray/Multi Purpose Tray" "<</MediaPosition 1>>setpagedevice"
+
+ // cupsMediaType values map to MEDIATYPE from global_types.h
+ Option "MediaType/Media Type" PickOne AnySetup 10.0
+ *Choice "Plain/Plain Paper" "<</MediaType(Plain)/cupsMediaType 0>>setpagedevice"
+
+ // cupsCompression values map to QUALITY_MODE from global_types.h
+ Option "OutputMode/Print Quality" PickOne AnySetup 10.0
+ *Choice "NormalRGB/Normal" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 0/OutputType(0)/cupsString0(PlainNormalColor)/HWResolution[300 300]>>setpagedevice"
+ Choice "NormalGray/Normal Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 0/cupsString0(PlainNormalGrayK)/OutputType(0)/HWResolution[300 300]>>setpagedevice"
+ Choice "DraftRGB/Draft" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 0/OutputType(-1)/cupsString0(PlainDraftColor)/HWResolution[300 300]>>setpagedevice"
+ Choice "DraftGray/Draft Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 0/OutputType(-1)/cupsString0(PlainDraftGrayK)/HWResolution[300 300]>>setpagedevice"
+
+ // Constraints
+
+ {
+// 4x6 or smaller
+ CustomMedia "Hagaki/Hagaki 100x148mm" 284 420 9 36 9 9 "<</cupsInteger0 71/PageSize[284 420]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/PageSize[284 420]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6/Photo 4x6in" 288 432 9.00 36.00 9.00 9.00 "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6/A6 105x148mm" 297.36 419.76 9 36 9 9 "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+
+// 5x7
+ CustomMedia "Photo5x7/Photo 5x7in" 360 504 9 36 9 9 "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card5x8/Index Card 5x8in" 360 576 18.00 36.00 18.00 9.00 "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Oufuku/Oufuku-Hagaki 148x200mm" 567 420 18.00 36.00 18.00 9.00 "<</cupsInteger0 72/PageSize[567 420]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 72/PageSize[567 420]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5/A5 148x210mm" 419.76 595.44 9 36 9 9 "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+
+// Standard
+ CustomMedia "B5/B5 176x250mm" 498.96 708.48 9 36 9 9 "<</cupsInteger0 65/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 65/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5/JB5 182x257mm" 516.24 728.64 9 36 9 9 "<</cupsInteger0 45/PageSize[516.24 728.64]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 45/PageSize [516.24 728.64]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Executive/Executive 7.25x10.5in" 522 756 18.00 36.00 18.00 9.00 "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ CustomMedia "16k/16k 7.75x10.75in" 558 774 18.00 36.00 18.00 9.00 "<</cupsInteger0 101/PageSize[558 774]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[558 774]/ImagingBBox null>>setpagedevice" // custom
+ *CustomMedia "Letter/Letter 8.5x11in" 612 792 18.00 36.00 18.00 9.00 "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4/A4 210x297mm" 595.44 841.68 9.72 36.00 9.72 9.00 "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ CustomMedia "ExecutiveJIS/Executive (JIS) 8.5x12.986in" 612 936 18.00 36.00 18.00 9.00 "<</cupsInteger0 10/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 10/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ CustomMedia "FLSA/American Foolscap 8.5x13in" 612 936 18.00 36.00 18.00 9.00 "<</cupsInteger0 10/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 10/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Legal/Legal 8.5x14in" 612 1008 18.00 36.00 18.00 9.00 "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+
+// Envelope
+ CustomMedia "EnvA2/A2 Envelope 4.37x5.75in" 314.64 414 18.00 36.00 18.00 9.00 "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC6/C6 Envelope 114x162mm" 323.28 459.36 18.00 36.00 18.00 9.00 "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou4/#4 Japanese Envelope 90x205mm" 254.88 581.04 18.00 36.00 18.00 9.00 "<</cupsInteger0 111/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 111/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvMonarch/Monarch Envelope 3.875x7.5in" 279 540 18.00 36.00 18.00 9.00 "<</cupsInteger0 80/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 80/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvDL/DL Envelope 110x220mm" 311.76 623.52 18.00 36.00 18.00 9.00 "<</cupsInteger0 90/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 90/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Env10/#10 Envelope 4.12x9.5in" 297 684 18.00 36.00 18.00 9.00 "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou3/#3 Japanese Envelope 120x235mm" 339.84 666 18.00 36.00 18.00 9.00 "<</cupsInteger0 110/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 110/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC5/C5 Envelope 162x229mm" 459 649 18.00 36.00 18.00 9.00 "<</cupsInteger0 91/PageSize[459 649]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 91/PageSize[459 649]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvB5/B5 Envelope 176x250mm" 499 709 18.00 36.00 18.00 9.00 "<</cupsInteger0 100/PageSize[499 709]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 100/PageSize[499 709]/ImagingBBox null>>setpagedevice"
+
+ // Custom page sizes from 1x4in to Legal
+ HWMargins 9 36 9 9
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 8.5in 14in
+
+ Attribute "cupsModelName" "" "DESKJET 850" // APDK device class
+ // <%DJ850:Normal%>
+ {
+ ModelName "HP Deskjet 850c"
+ Attribute "NickName" "" "HP Deskjet 850c, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 850c"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 850c;DES:deskjet 850c;"
+ PCFileName "hp-deskjet_850c.ppd"
+ Attribute "Product" "" "(HP Deskjet 850k Printer)"
+ Attribute "Product" "" "(HP Deskjet 850c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 855c"
+ Attribute "NickName" "" "HP Deskjet 855c, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 855c"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 855c;DES:deskjet 855c;"
+ PCFileName "hp-deskjet_855c.ppd"
+ Attribute "Product" "" "(HP Deskjet 855cxi Printer)"
+ Attribute "Product" "" "(HP Deskjet 855c Printer)"
+ Attribute "Product" "" "(HP Deskjet 855cse Printer)"
+ }
+ {
+ ModelName "HP Deskjet 870c"
+ Attribute "NickName" "" "HP Deskjet 870c, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 870c"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 870c;DES:deskjet 870c;"
+ PCFileName "hp-deskjet_870c.ppd"
+ Attribute "Product" "" "(HP Deskjet 870k Printer)"
+ Attribute "Product" "" "(HP Deskjet 870c Printer)"
+ Attribute "Product" "" "(HP Deskjet 870cse Printer)"
+ Attribute "Product" "" "(HP Deskjet 870cxi Printer)"
+ }
+ {
+ ModelName "HP Officejet Pro 1150c"
+ Attribute "NickName" "" "HP Officejet Pro 1150c, $Version"
+ Attribute "ShortNickName" "" "HP Officejet Pro 1150c"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet pro 1150c;DES:officejet pro 1150c;"
+ PCFileName "hp-officejet_pro_1150c.ppd"
+ Attribute "Product" "" "(HP Officejet Pro 1150c All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet Pro 1150cse All-in-one Printer)"
+ }
+
+ } // End supported media sizes.
+} // End DJ850
+
+///////////////////// DJ890
+{
+ Attribute "hpPrinterLanguage" "" "pcl3gui"
+ Attribute "hpPrinterPlatform" "" "dj890"
+ Attribute "HPMechOffset" "" "40"
+
+ Group "General/General"
+
+ // MediaPosition values map to MediaSource enumeration in global_types.h
+ Option "InputSlot/Media Source" PickOne AnySetup 10.0
+ *Choice "Auto/Auto-Select" "<</MediaPosition 7>>setpagedevice"
+ Choice "PhotoTray/Photo Tray" "<</MediaPosition 6>>setpagedevice"
+ Choice "Upper/Upper Tray" "<</MediaPosition 1>>setpagedevice"
+ Choice "Lower/Lower Tray" "<</MediaPosition 4>>setpagedevice"
+ Choice "Envelope/Envelope Feeder" "<</MediaPosition 3>>setpagedevice"
+ Choice "LargeCapacity/Large Capacity Tray" "<</MediaPosition 5>>setpagedevice"
+ Choice "Manual/Manual Feeder" "<</MediaPosition 2>>setpagedevice"
+ Choice "MPTray/Multi Purpose Tray" "<</MediaPosition 1>>setpagedevice"
+
+ // cupsMediaType values map to MEDIATYPE from global_types.h
+ Option "MediaType/Media Type" PickOne AnySetup 10.0
+ *Choice "Plain/Plain Paper" "<</MediaType(Plain)/cupsMediaType 0>>setpagedevice"
+
+ // cupsCompression values map to QUALITY_MODE from global_types.h
+ Option "OutputMode/Print Quality" PickOne AnySetup 10.0
+ *Choice "NormalRGB/Normal Color" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 0/OutputType(0)/cupsString0(PlainNormalColor)/HWResolution[300 300]>>setpagedevice"
+ Choice "NormalGray/Normal Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 2/OutputType(0)/cupsString0(PlainNormalGrayK)/HWResolution[300 300]>>setpagedevice"
+ Choice "DraftRGB/Draft Color" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 0/OutputType(-1)/cupsString0(PlainDraftColor)/HWResolution[300 300]>>setpagedevice"
+ Choice "DraftGray/Draft Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 2/OutputType(-1)/cupsString0(PlainDraftGrayK)/HWResolution[300 300]>>setpagedevice"
+
+ // Constraints
+
+ {
+// 4x6 or smaller
+ CustomMedia "Card3x5/Index Card 3x5in" 216 360 18.00 36.00 18.00 9.00 "<</cupsInteger0 78/PageSize [216 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 78/PageSize[216 360]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki/Hagaki 100x148mm" 284 420 9 36 9 9 "<</cupsInteger0 71/PageSize[284 420]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/PageSize[284 420]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6/Photo 4x6in" 288 432 9.00 36.00 9.00 9.00 "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6/A6 105x148mm" 297.36 419.76 9.00 36.00 9.00 9.00 "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+
+// 5x7
+ CustomMedia "Photo5x7/Photo 5x7in" 360 504 9 36 9 9 "<</cupsInteger0 101/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card5x8/Index Card 5x8in" 360 576 18.00 36.00 18.00 9.00 "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Oufuku/Oufuku-Hagaki 148x200mm" 567 420 18.00 36.00 18.00 9.00 "<</cupsInteger0 72/PageSize[567 420]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 72/PageSize[567 420]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5/A5 148x210mm" 419.76 595.44 9 36 9 9 "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+
+// Standard
+ CustomMedia "B5/B5 176x250mm" 498.96 708.48 9 36 9 9 "<</cupsInteger0 65/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 65/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5/JB5 182x257mm" 516.24 728.64 9 36 9 9 "<</cupsInteger0 45/PageSize[516.24 728.64]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 45/PageSize [516.24 728.64]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Executive/Executive 7.25x10.5in" 522 756 18.00 36.00 18.00 9.00 "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ CustomMedia "16k/16k 7.75x10.75in" 558 774 18.00 36.00 18.00 9.00 "<</cupsInteger0 101/PageSize[558 774]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[558 774]/ImagingBBox null>>setpagedevice" // custom
+ *CustomMedia "Letter/Letter 8.5x11in" 612 792 18.00 36.00 18.00 9.00 "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4/A4 210x297mm" 595.44 841.68 9.72 36.00 9.72 9.00 "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ CustomMedia "ExecutiveJIS/Executive (JIS) 8.5x12.986in" 612 936 18.00 36.00 18.00 9.00 "<</cupsInteger0 101/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ CustomMedia "FLSA/American Foolscap 8.5x13in" 612 936 18.00 36.00 18.00 9.00 "<</cupsInteger0 101/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Legal/Legal 8.5x14in" 612 1008 18.00 36.00 18.00 9.00 "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+
+// Envelope
+ CustomMedia "EnvA2/A2 Envelope 4.37x5.75in" 314.64 414 9 36 9 9 "<</cupsInteger0 101/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC6/C6 Envelope 114x162mm" 323.28 459.36 18.00 36.00 18.00 9.00 "<</cupsInteger0 101/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou4/#4 Japanese Envelope 90x205mm" 254.88 581.04 9 36 9 9 "<</cupsInteger0 101/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvMonarch/Monarch Envelope 3.875x7.5in" 279 540 18.00 36.00 18.00 9.00 "<</cupsInteger0 80/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 80/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvDL/DL Envelope 110x220mm" 311.76 623.52 18.00 36.00 18.00 9.00 "<</cupsInteger0 101/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Env10/#10 Envelope 4.12x9.5in" 297 684 18.00 36.00 18.00 9.00 "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou3/#3 Japanese Envelope 120x235mm" 339.84 666 9 36 9 9 "<</cupsInteger0 101/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC5/C5 Envelope 162x229mm" 459 649 18.00 36.00 18.00 9.00 "<</cupsInteger0 91/PageSize[459 649]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 91/PageSize[459 649]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvB5/B5 Envelope 176x250mm" 499 709 18.00 36.00 18.00 9.00 "<</cupsInteger0 100/PageSize[499 709]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 100/PageSize[499 709]/ImagingBBox null>>setpagedevice"
+
+ // Custom page sizes from 1x4in to Legal
+ HWMargins 9 36 9 9
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 8.5in 14in
+
+ Attribute "cupsModelName" "" "DESKJET 890" // APDK device class
+ // <%DJ890:Normal%>
+ {
+ ModelName "HP Deskjet 890c"
+ Attribute "NickName" "" "HP Deskjet 890c, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 890c"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 890c;DES:deskjet 890c;"
+ PCFileName "hp-deskjet_890c.ppd"
+ Attribute "Product" "" "(HP Deskjet 890cse Printer)"
+ Attribute "Product" "" "(HP Deskjet 890c Printer)"
+ }
+ {
+ ModelName "HP Officejet Pro 1170c Series"
+ Attribute "NickName" "" "HP Officejet Pro 1170c Series, $Version"
+ Attribute "ShortNickName" "" "HP Officejet Pro 1170c Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet pro 1170c series;DES:officejet pro 1170c series;"
+ PCFileName "hp-officejet_pro_1170c_series.ppd"
+ Attribute "Product" "" "(HP Officejet Pro 1170c All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet Pro 1170cse All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet Pro 1170cxi All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet Pro 1175c All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet Pro 1175cse All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet Pro 1175cxi All-in-one Printer)"
+ }
+
+ } // End supported media sizes.
+} // End DJ890
+
+///////////////// LJZjsMono (for proprietary plugin)
+{
+ Attribute "hpPrinterLanguage" "" "ljzjstream"
+
+ Group "General/General"
+
+ Attribute "cupsIPPReason" "hplip.plugin-error/HP Device requires a proprietary binary Plug-in, run hp-plugin" ""
+
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 10.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "<</Duplex true/Tumble false>>setpagedevice"
+ Choice "DuplexTumble/Short Edge (Flip)" "<</Duplex true/Tumble true>>setpagedevice"
+ *Choice "None/Off" "<</Duplex false/Tumble false>>setpagedevice"
+
+ // MediaPosition values map to MediaSource enumeration in global_types.h
+ Option "InputSlot/Media Source" PickOne AnySetup 10.0
+ *Choice "Auto/Auto-Select" "<</MediaPosition 7>>setpagedevice"
+ Choice "PhotoTray/Photo Tray" "<</MediaPosition 1>>setpagedevice"
+ Choice "Upper/Upper Tray" "<</MediaPosition 1>>setpagedevice"
+ Choice "Lower/Lower Tray" "<</MediaPosition 4>>setpagedevice"
+ Choice "Envelope/Envelope Feeder" "<</MediaPosition 3>>setpagedevice"
+ Choice "LargeCapacity/Large Capacity Tray" "<</MediaPosition 5>>setpagedevice"
+ Choice "Manual/Manual Feeder" "<</MediaPosition 2>>setpagedevice"
+ Choice "MPTray/Multi Purpose Tray" "<</MediaPosition 1>>setpagedevice"
+
+ // cupsRowCount values map to PEN_TYPE + 1 from global_types.h
+ Option "ColorModel/Output Mode" PickOne AnySetup 10.0
+ *Choice "Gray/Grayscale" "<</cupsColorSpace 3/cupsBitsPerColor 1/cupsRowCount 1/cupsRowStep 2>>setpagedevice"
+
+ // cupsMediaType values map to MEDIATYPE from global_types.h
+ Option "MediaType/Media Type" PickOne AnySetup 10.0
+ *Choice "Plain/Plain Paper" "<</MediaType(Plain)/cupsMediaType 0>>setpagedevice"
+
+ // cupsCompression values map to QUALITY_MODE from global_types.h
+ Option "OutputMode/Print Quality" PickOne AnySetup 10.0
+ *Choice "Normal/Normal" "<</OutputType(0)/HWResolution[600 600]>>setpagedevice"
+ Choice "Draft/Draft" "<</OutputType(-1)/HWResolution[600 600]>>setpagedevice"
+
+ // Duplexer is optional...
+ Installable "OptionDuplex/Duplexer Installed"
+
+ // Constraints
+ UIConstraints "*Duplex *OptionDuplex False"
+
+ Attribute "cupsModelName" "" "HP LaserJet 1018" // APDK device class
+
+ {
+// 4x6 or smaller
+ CustomMedia "Card3x5/Index Card 3x5in" 216 360 12.96 15.5 12.96 15.5 "<</cupsInteger0 96/PageSize [216 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize[216 360]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki/Hagaki 100x148mm" 284 420 19.12 15.5 19.12 15.5 "<</cupsInteger0 43/PageSize[284 420]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 43/PageSize[284 420]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6/A6 105x148mm" 297.36 419.76 18.12 15.5 18.12 15.5 "<</cupsInteger0 96/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+
+// 5x7
+ CustomMedia "Card5x8/Index Card 5x8in" 360 576 18.72 15.5 18.72 15.5 "<</cupsInteger0 96/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Oufuku/Oufuku-Hagaki 148x200mm" 567 420 18.54 15.5 18.54 15.5 "<</cupsInteger0 43/PageSize[567 420]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 43/PageSize[567 420]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5/A5 148x210mm" 419.76 595.44 18 15.5 18 15.5 "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+
+// Standard
+ CustomMedia "B5/B5 176x250mm" 498.96 708.48 19.08 14.4 19.08 14.4 "<</cupsInteger0 357/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 357/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5/JB5 182x257mm" 516.24 728.64 18 15.5 18 15.5 "<</cupsInteger0 96/PageSize[516.24 728.64]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize [516.24 728.64]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Executive/Executive 7.25x10.5in" 522 756 19.08 15.5 19.08 15.5 "<</cupsInteger0 7/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 7/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ CustomMedia "16k/16k 7.75x10.75in" 558 774 18 15.5 18 15.5 "<</cupsInteger0 96/PageSize[558 774]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize[558 774]/ImagingBBox null>>setpagedevice" // custom
+ *CustomMedia "Letter/Letter 8.5x11in" 612 792 18 15.5 18 15.5 "<</cupsInteger0 1/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4/A4 210x297mm" 595.44 841.68 18 15.5 18 15.5 "<</cupsInteger0 9/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 9/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ CustomMedia "ExecutiveJIS/Executive (JIS) 8.5x12.986in" 612 936 18 15.5 18 15.5 "<</cupsInteger0 96/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ CustomMedia "FLSA/American Foolscap 8.5x13in" 612 936 18 15.5 18 15.5 "<</cupsInteger0 258/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 258/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Legal/Legal 8.5x14in" 612 1008 18 15.5 18 15.5 "<</cupsInteger0 5/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 5/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+
+// Envelope
+ CustomMedia "EnvA2/A2 Envelope 4.37x5.75in" 314.64 414 19.08 15.5 19.08 15.5 "<</cupsInteger0 96/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC6/C6 Envelope 114x162mm" 323.28 459.36 19.56 15.5 19.56 15.5 "<</cupsInteger0 96/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou4/#4 Japanese Envelope 90x205mm" 254.88 581.04 19.92 15.5 19.92 15.5 "<</cupsInteger0 96/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvMonarch/Monarch Envelope 3.875x7.5in" 279 540 18 15.5 18 15.5 "<</cupsInteger0 96/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvDL/DL Envelope 110x220mm" 311.76 623.52 18 15.5 18 15.5 "<</cupsInteger0 27/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 27/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Env10/#10 Envelope 4.12x9.5in" 297 684 18 15.5 18 15.5 "<</cupsInteger0 20/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 20/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou3/#3 Japanese Envelope 120x235mm" 339.84 666 18 15.5 18 15.5 "<</cupsInteger0 96/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC5/C5 Envelope 162x229mm" 459 649 18.3 15.5 18.3 15.5 "<</cupsInteger0 96/PageSize[459 649]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize[459 649]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvB5/B5 Envelope 176x250mm" 499 709 18 15.5 18 15.5 "<</cupsInteger0 357/PageSize[499 709]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 357/PageSize[499 709]/ImagingBBox null>>setpagedevice"
+
+ // Custom page sizes from 1x4in to Legal
+ HWMargins 18 15.5 18 15.5
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 8.5in 14in
+
+ // <%LJZjsMono:Normal%>
+ {
+ ModelName "HP LaserJet 1000"
+ Attribute "NickName" "" "HP LaserJet 1000, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LaserJet 1000"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 1000;DES:hp laserjet 1000;"
+ PCFileName "hp-laserjet_1000.ppd"
+ Attribute "Product" "" "(HP LaserJet 1000 Printer)"
+ }
+ {
+ ModelName "HP LaserJet 1005 Series"
+ Attribute "NickName" "" "HP LaserJet 1005 Series, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LaserJet 1005 Series"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 1005 series;DES:hp laserjet 1005 series;"
+ PCFileName "hp-laserjet_1005_series.ppd"
+ Attribute "Product" "" "(HP LaserJet 1005 Printer)"
+ }
+ {
+ ModelName "HP LaserJet 1018"
+ Attribute "NickName" "" "HP LaserJet 1018, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LaserJet 1018"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 1018;DES:hp laserjet 1018;"
+ PCFileName "hp-laserjet_1018.ppd"
+ Attribute "Product" "" "(HP LaserJet 1018 Printer)"
+ Attribute "Product" "" "(HP LaserJet 1018s Printer)"
+ }
+ {
+ ModelName "HP LaserJet 1020"
+ Attribute "NickName" "" "HP LaserJet 1020, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LaserJet 1020"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 1020;DES:hp laserjet 1020;"
+ PCFileName "hp-laserjet_1020.ppd"
+ Attribute "Product" "" "(HP LaserJet 1020 Printer)"
+ Attribute "Product" "" "(HP LaserJet 1020 Plus Printer)"
+ }
+ {
+ ModelName "HP LaserJet 1022nw"
+ Attribute "NickName" "" "HP LaserJet 1022nw zjs, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LaserJet 1022nw"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 1022nw;DES:hp laserjet 1022nw;"
+ PCFileName "hp-laserjet_1022nw-zjs.ppd"
+ Attribute "Product" "" "(HP LaserJet 1022nw Printer)"
+ }
+ {
+ ModelName "HP LaserJet 1022n"
+ Attribute "NickName" "" "HP LaserJet 1022n zjs, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LaserJet 1022n"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 1022n;DES:hp laserjet 1022n;"
+ PCFileName "hp-laserjet_1022n-zjs.ppd"
+ Attribute "Product" "" "(HP LaserJet 1022n Printer)"
+ Attribute "Product" "" "(HP LaserJet 1022nxi Printer)"
+ }
+ {
+ ModelName "HP LaserJet 1022"
+ Attribute "NickName" "" "HP LaserJet 1022 zjs, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LaserJet 1022"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 1022;DES:hp laserjet 1022;"
+ PCFileName "hp-laserjet_1022-zjs.ppd"
+ Attribute "Product" "" "(HP LaserJet 1022 Printer)"
+ }
+ {
+ ModelName "HP LaserJet m1120 MFP"
+ Attribute "NickName" "" "HP LaserJet m1120 MFP, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LaserJet m1120 MFP"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet m1120 mfp;DES:hp laserjet m1120 mfp;"
+ PCFileName "hp-laserjet_m1120_mfp.ppd"
+ Attribute "Product" "" "(HP LaserJet m1120 Multifunction Printer)"
+ }
+ {
+ ModelName "HP LaserJet m1120n MFP"
+ Attribute "NickName" "" "HP LaserJet m1120n MFP, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LaserJet m1120n MFP"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet m1120n mfp;DES:hp laserjet m1120n mfp;"
+ PCFileName "hp-laserjet_m1120n_mfp.ppd"
+ Attribute "Product" "" "(HP LaserJet m1120n Multifunction Printer)"
+ }
+ {
+ ModelName "HP LaserJet m1319f MFP"
+ Attribute "NickName" "" "HP LaserJet m1319f MFP, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LaserJet m1319f MFP"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet m1319f mfp;DES:hp laserjet m1319f mfp;"
+ PCFileName "hp-laserjet_m1319f_mfp.ppd"
+ Attribute "Product" "" "(HP LaserJet m1319f Multifunction Printer)"
+ }
+ {
+ ModelName "HP LaserJet p2035n"
+ Attribute "NickName" "" "HP LaserJet p2035n zjs, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LaserJet p2035n"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet p2035n;DES:hp laserjet p2035n;"
+ PCFileName "hp-laserjet_p2035n-zjs.ppd"
+ Attribute "Product" "" "(HP LaserJet p2035n Printer)"
+ }
+ {
+ ModelName "HP LaserJet p2035"
+ Attribute "NickName" "" "HP LaserJet p2035 zjs, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LaserJet p2035"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet p2035;DES:hp laserjet p2035;"
+ PCFileName "hp-laserjet_p2035-zjs.ppd"
+ Attribute "Product" "" "(HP LaserJet p2035 Printer)"
+ }
+ } // End Supported media sizes.
+} // End LJZjsMono (for proprietary plugin)
+
+///////////////// LJZjsMono with No Auto Duplex and No multiple Trays (for proprietary plugin)
+{
+ Attribute "hpPrinterLanguage" "" "ljzjstream"
+
+ Group "General/General"
+
+ Attribute "cupsIPPReason" "hplip.plugin-error/HP Device requires a proprietary binary Plug-in, run hp-plugin" ""
+
+ // MediaPosition values map to MediaSource enumeration in global_types.h
+ Option "InputSlot/Media Source" PickOne AnySetup 10.0
+ *Choice "Auto/Auto-Select" "<</MediaPosition 7>>setpagedevice"
+ Choice "Manual/Manual Feeder" "<</MediaPosition 2>>setpagedevice"
+
+ // cupsRowCount values map to PEN_TYPE + 1 from global_types.h
+ Option "ColorModel/Output Mode" PickOne AnySetup 10.0
+ *Choice "Gray/Grayscale" "<</cupsColorSpace 3/cupsBitsPerColor 1/cupsRowCount 1/cupsRowStep 2>>setpagedevice"
+
+ // cupsMediaType values map to MEDIATYPE from global_types.h
+ Option "MediaType/Media Type" PickOne AnySetup 10.0
+ *Choice "Plain/Plain Paper" "<</MediaType(Plain)/cupsMediaType 0>>setpagedevice"
+
+ // cupsCompression values map to QUALITY_MODE from global_types.h
+ Option "OutputMode/Print Quality" PickOne AnySetup 10.0
+ *Choice "Normal/Normal" "<</OutputType(0)/HWResolution[600 600]>>setpagedevice"
+ Choice "Draft/Draft" "<</OutputType(-1)/HWResolution[600 600]>>setpagedevice"
+
+
+ Attribute "cupsModelName" "" "HP LaserJet 1018" // APDK device class
+
+ {
+// 4x6 or smaller
+ CustomMedia "A6/A6 105x148mm" 298 420 12 12 12 12 "<</cupsInteger0 24/PageSize[298 420]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 24/PageSize[298 420]/ImagingBBox null>>setpagedevice"
+
+// 5x7
+ CustomMedia "A5/A5 148x210mm" 420 595 12 12 12 12 "<</cupsInteger0 25/PageSize[420 595]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/PageSize[420 595]/ImagingBBox null>>setpagedevice"
+
+// Standard
+ CustomMedia "Postcard/Postcard" 283 420 12 12 12 12 "<</cupsInteger0 71/PageSize[283 420]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/PageSize[283 420]/ImagingBBox null>>setpagedevice"
+ CustomMedia "DoublePostcard/Double Postcard" 420 567 12 12 12 12 "<</cupsInteger0 72/PageSize[420 567]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 72/PageSize[420 567]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5/JB5 182x257mm" 516.24 728.64 18 15.5 18 15.5 "<</cupsInteger0 96/PageSize[516.24 728.64]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize [516.24 728.64]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Executive/Executive 7.25x10.5in" 522 756 12 12 12 12 "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ CustomMedia "16k195x270/16k 195x270mm" 553 765 18 15.5 18 15.5 "<</cupsInteger0 34/PageSize[553 765]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 34/PageSize[553 765]/ImagingBBox null>>setpagedevice"
+ CustomMedia "16k184x260/16k 184x260mm" 522 737 12 12 12 12 "<</cupsInteger0 89/PageSize[522 737]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 89/PageSize[522 737]/ImagingBBox null>>setpagedevice"
+ CustomMedia "16k197x273/16k 197x273mm" 558 774 12 12 12 12 "<</cupsInteger0 17/PageSize[558 774]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 17/PageSize[558 774]/ImagingBBox null>>setpagedevice"
+ *CustomMedia "Letter/Letter 8.5x11in" 612 792 12 12 12 12 "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4/A4 210x297mm" 595.44 841.68 18 15.5 18 15.5 "<</cupsInteger0 9/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 9/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ CustomMedia "FLSA/American Foolscap 8.5x13in" 612 936 12 12 12 12 "<</cupsInteger0 10/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 10/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Legal/Legal 8.5x14in" 612 1008 12 12 12 12 "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+
+// Envelope
+ CustomMedia "EnvMonarch/Monarch Envelope 3.875x7.5in" 279 540 18 15.5 18 15.5 "<</cupsInteger0 96/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvDL/DL Envelope 110x220mm" 311.76 623.52 18 15.5 18 15.5 "<</cupsInteger0 27/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 27/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Env10/#10 Envelope 4.12x9.5in" 297 684 12 12 12 12 "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC5/C5 Envelope 162x229mm" 459 649 12 12 12 12 "<</cupsInteger0 91/PageSize[459 649]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 91/PageSize[459 649]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvB5/B5 Envelope 176x250mm" 499 709 12 12 12 12 "<</cupsInteger0 100/PageSize[499 709]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 100/PageSize[499 709]/ImagingBBox null>>setpagedevice"
+
+ // Custom page sizes
+ HWMargins 12 12 12 12
+ VariablePaperSize Yes
+ MinSize 3in 5in
+ MaxSize 17in 36in
+
+ // <%LJZjsMono:NoAutoDuplex%>
+ {
+ ModelName "HP LaserJet Professional p1102w"
+ Attribute "NickName" "" "HP LaserJet Professional p1102w, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LaserJet Professional p1102w"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet professional p1102w;DES:hp laserjet professional p1102w;"
+ PCFileName "hp-laserjet_professional_p1102w.ppd"
+ Attribute "Product" "" "(HP LaserJet Professional p1102w Printer)"
+ }
+ {
+ ModelName "HP LaserJet Professional p1102"
+ Attribute "NickName" "" "HP LaserJet Professional p1102, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LaserJet Professional p1102"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet professional p1102;DES:hp laserjet professional p1102;"
+ PCFileName "hp-laserjet_professional_p1102.ppd"
+ Attribute "Product" "" "(HP LaserJet Professional p1102 Printer)"
+ Attribute "Product" "" "(HP LaserJet Professional p1102s Printer)"
+ }
+ {
+ ModelName "HP LaserJet Professional P 1102w"
+ Attribute "NickName" "" "HP LaserJet Professional P 1102w, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LJ Professional P 1102w"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet professional p 1102w;DES:hp laserjet professional p 1102w;"
+ PCFileName "hp-laserjet_professional_p_1102w.ppd"
+ Attribute "Product" "" "(HP LaserJet Professional P 1102w Printer)"
+ }
+ {
+ ModelName "HP LaserJet Professional p1106"
+ Attribute "NickName" "" "HP LaserJet Professional p1106, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LaserJet Professional p1106"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet professional p1106;DES:hp laserjet professional p1106;"
+ PCFileName "hp-laserjet_professional_p1106.ppd"
+ Attribute "Product" "" "(HP LaserJet Professional p1106 Printer)"
+ }
+ {
+ ModelName "HP LaserJet Professional p1108"
+ Attribute "NickName" "" "HP LaserJet Professional p1108, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LaserJet Professional p1108"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet professional p1108;DES:hp laserjet professional p1108;"
+ PCFileName "hp-laserjet_professional_p1108.ppd"
+ Attribute "Product" "" "(HP LaserJet Professional p1108 Printer)"
+ }
+ {
+ ModelName "HP LaserJet Professional m1132 MFP"
+ Attribute "NickName" "" "HP LaserJet Professional m1132 MFP, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LJ Professional m1132 MFP"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet professional m1132 mfp;DES:hp laserjet professional m1132 mfp;"
+ PCFileName "hp-laserjet_professional_m1132_mfp.ppd"
+ Attribute "Product" "" "(HP LaserJet Professional m1132 Multifunction Printer)"
+ Attribute "Product" "" "(HP LaserJet Professional m1132s Multifunction Printer)"
+ }
+ {
+ ModelName "HP LaserJet Professional m1136 MFP"
+ Attribute "NickName" "" "HP LaserJet Professional m1136 MFP, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LJ Professional m1136 MFP"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet professional m1136 mfp;DES:hp laserjet professional m1136 mfp;"
+ PCFileName "hp-laserjet_professional_m1136_mfp.ppd"
+ Attribute "Product" "" "(HP LaserJet Professional m1136 Multifunction Printer)"
+ }
+ {
+ ModelName "HP LaserJet Professional m1212nf MFP"
+ Attribute "NickName" "" "HP LaserJet Professional m1212nf MFP, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LJ Professional m1212nf MFP"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet professional m1212nf mfp;DES:hp laserjet professional m1212nf mfp;"
+ PCFileName "hp-laserjet_professional_m1212nf_mfp.ppd"
+ Attribute "Product" "" "(HP LaserJet Professional m1212nf Multifunction Printer)"
+ }
+ {
+ ModelName "HP LaserJet Professional m1213nf MFP"
+ Attribute "NickName" "" "HP LaserJet Professional m1213nf MFP, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LJ Professional m1213nf MFP"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet professional m1213nf mfp;DES:hp laserjet professional m1213nf mfp;"
+ PCFileName "hp-laserjet_professional_m1213nf_mfp.ppd"
+ Attribute "Product" "" "(HP LaserJet Professional m1213nf Multifunction Printer)"
+ }
+ {
+ ModelName "HP LaserJet Professional m1214nfh MFP"
+ Attribute "NickName" "" "HP LaserJet Professional m1214nfh MFP, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LJ Professional m1214nfh MFP"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet professional m1214nfh mfp;DES:hp laserjet professional m1214nfh mfp;"
+ PCFileName "hp-laserjet_professional_m1214nfh_mfp.ppd"
+ Attribute "Product" "" "(HP LaserJet Professional m1214nfh Multifunction Printer)"
+ }
+ {
+ ModelName "HP LaserJet Professional m1216nfh MFP"
+ Attribute "NickName" "" "HP LaserJet Professional m1216nfh MFP, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LJ Professional m1216nfh MFP"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet professional m1216nfh mfp;DES:hp laserjet professional m1216nfh mfp;"
+ PCFileName "hp-laserjet_professional_m1216nfh_mfp.ppd"
+ Attribute "Product" "" "(HP LaserJet Professional m1216nfh MFP)"
+ }
+ {
+ ModelName "HP LaserJet Professional m1217nfw MFP"
+ Attribute "NickName" "" "HP LaserJet Professional m1217nfw MFP, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LJ Professional m1217nfw MFP"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet professional m1217nfw mfp;DES:hp laserjet professional m1217nfw mfp;"
+ PCFileName "hp-laserjet_professional_m1217nfw_mfp.ppd"
+ Attribute "Product" "" "(HP LaserJet Professional m1217nfw Multifunction Printer)"
+ }
+ {
+ ModelName "HP LaserJet Professional m1219nf MFP"
+ Attribute "NickName" "" "HP LaserJet Professional m1219nf MFP, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LJ Professional m1219nf MFP"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet professional m1219nf mfp;DES:hp laserjet professional m1219nf mfp;"
+ PCFileName "hp-laserjet_professional_m1219nf_mfp.ppd"
+ Attribute "Product" "" "(HP LaserJet Professional m1219nf MFP)"
+ }
+ {
+ ModelName "HP LaserJet Professional p1566"
+ Attribute "NickName" "" "HP LaserJet Professional p1566, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LaserJet Professional p1566"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet professional p1566;DES:hp laserjet professional p1566;"
+ PCFileName "hp-laserjet_professional_p1566.ppd"
+ Attribute "Product" "" "(HP LaserJet Professional p1566)"
+ }
+ } // End Supported media sizes.
+} // End LJZjsMono with No Auto Duplex and No multiple Tray (for proprietary plugin)
+
+///////////////// LJZjsMono with Auto Duplex and No multiple Trays (for proprietary plugin)
+{
+ Attribute "cupsEvenDuplex" "" "True"
+ Attribute "cupsBackSide" "" "Rotated"
+ Attribute "cupsFlipDuplex" "" "True"
+ Attribute "hpPrinterLanguage" "" "ljzjstream"
+ Attribute "hpPrinterPlatform" "" "ljzjsmono"
+ Attribute "hpReverseRasterPages" "" "1"
+
+ Group "General/General"
+
+ Attribute "cupsIPPReason" "hplip.plugin-error/HP Device requires a proprietary binary Plug-in, run hp-plugin" ""
+
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 10.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "<</Duplex true/Tumble false>>setpagedevice"
+ Choice "DuplexTumble/Short Edge (Flip)" "<</Duplex true/Tumble true>>setpagedevice"
+ *Choice "None/Off" "<</Duplex false/Tumble false>>setpagedevice"
+
+ // MediaPosition values map to MediaSource enumeration in global_types.h
+ Option "InputSlot/Media Source" PickOne AnySetup 10.0
+ *Choice "Auto/Auto-Select" "<</MediaPosition 7>>setpagedevice"
+ Choice "Manual/Manual Feeder" "<</MediaPosition 2>>setpagedevice"
+
+ // cupsRowCount values map to PEN_TYPE + 1 from global_types.h
+ Option "ColorModel/Output Mode" PickOne AnySetup 10.0
+ *Choice "Gray/Grayscale" "<</cupsColorSpace 3/cupsBitsPerColor 1/cupsRowCount 1/cupsRowStep 2>>setpagedevice"
+
+ // cupsMediaType values map to MEDIATYPE from global_types.h
+ Option "MediaType/Media Type" PickOne AnySetup 10.0
+ *Choice "Plain/Plain Paper" "<</MediaType(Plain)/cupsMediaType 0>>setpagedevice"
+
+ // cupsCompression values map to QUALITY_MODE from global_types.h
+ Option "OutputMode/Print Quality" PickOne AnySetup 10.0
+ *Choice "Normal/Normal" "<</OutputType(0)/HWResolution[600 600]>>setpagedevice"
+ Choice "Draft/Draft" "<</OutputType(-1)/HWResolution[600 600]>>setpagedevice"
+
+ // Duplexer is optional...
+ Installable "OptionDuplex/Duplexer Installed"
+
+ // Constraints
+ UIConstraints "*Duplex *OptionDuplex False"
+ UIConstraints "*PageSize A6 *Duplex"
+ UIConstraints "*PageSize A5 *Duplex"
+ UIConstraints "*PageSize Postcard *Duplex"
+ UIConstraints "*PageSize DoublePostcard *Duplex"
+ UIConstraints "*PageSize JB5 *Duplex"
+ UIConstraints "*PageSize Executive *Duplex"
+ UIConstraints "*PageSize 16k195x270 *Duplex"
+ UIConstraints "*PageSize 16k184x260 *Duplex"
+ UIConstraints "*PageSize 16k197x273 *Duplex"
+ UIConstraints "*PageSize Letter *Duplex"
+ UIConstraints "*PageSize FLSA *Duplex"
+ UIConstraints "*PageSize Legal *Duplex"
+ UIConstraints "*PageSize EnvMonarch *Duplex"
+ UIConstraints "*PageSize EnvDL *Duplex"
+ UIConstraints "*PageSize Env10 *Duplex"
+ UIConstraints "*PageSize EnvC5 *Duplex"
+ UIConstraints "*PageSize EnvB5 *Duplex"
+
+ Attribute "cupsModelName" "" "HP LaserJet 1018" // APDK device class
+
+ {
+// 4x6 or smaller
+ CustomMedia "A6/A6 105x148mm" 298 420 12 12 12 12 "<</cupsInteger0 24/PageSize[298 420]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 24/PageSize[298 420]/ImagingBBox null>>setpagedevice"
+
+// 5x7
+ CustomMedia "A5/A5 148x210mm" 420 595 12 12 12 12 "<</cupsInteger0 25/PageSize[420 595]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/PageSize[420 595]/ImagingBBox null>>setpagedevice"
+
+// Standard
+ CustomMedia "Postcard/Postcard" 283 420 12 12 12 12 "<</cupsInteger0 71/PageSize[283 420]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/PageSize[283 420]/ImagingBBox null>>setpagedevice"
+ CustomMedia "DoublePostcard/Double Postcard" 420 567 12 12 12 12 "<</cupsInteger0 72/PageSize[420 567]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 72/PageSize[420 567]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5/JB5 182x257mm" 516.24 728.64 18 15.5 18 15.5 "<</cupsInteger0 96/PageSize[516.24 728.64]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize [516.24 728.64]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Executive/Executive 7.25x10.5in" 522 756 12 12 12 12 "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ CustomMedia "16k195x270/16k 195x270mm" 553 765 18 15.5 18 15.5 "<</cupsInteger0 34/PageSize[553 765]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 34/PageSize[553 765]/ImagingBBox null>>setpagedevice"
+ CustomMedia "16k184x260/16k 184x260mm" 522 737 12 12 12 12 "<</cupsInteger0 89/PageSize[522 737]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 89/PageSize[522 737]/ImagingBBox null>>setpagedevice"
+ CustomMedia "16k197x273/16k 197x273mm" 558 774 12 12 12 12 "<</cupsInteger0 17/PageSize[558 774]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 17/PageSize[558 774]/ImagingBBox null>>setpagedevice"
+ *CustomMedia "Letter/Letter 8.5x11in" 612 792 12 12 12 12 "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Letter.Duplex/Letter AutoDuplex 8.5x11in" 612 780 12 12 12 12 "<</cupsInteger0 2/PageSize[612 780]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/PageSize[612 780]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4/A4 210x297mm" 595.44 841.68 18 15.5 18 15.5 "<</cupsInteger0 9/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 9/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4.Duplex/A4 AutoDuplex 210x297mm" 595.44 829.68 18 15.5 18 15.5 "<</cupsInteger0 9/PageSize[595.44 829.68]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 9/PageSize[595.44 829.68]/ImagingBBox null>>setpagedevice"
+ CustomMedia "FLSA/American Foolscap 8.5x13in" 612 936 12 12 12 12 "<</cupsInteger0 10/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 10/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ CustomMedia "FLSA.Duplex/American Foolscap AutoDuplex 8.5x13in" 612 924 12 12 12 12 "<</cupsInteger0 10/PageSize[612 924]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 10/PageSize[612 924]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Legal/Legal 8.5x14in" 612 1008 12 12 12 12 "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Legal.Duplex/Legal AutoDuplex 8.5x14in" 612 996 12 12 12 12 "<</cupsInteger0 3/PageSize[612 996]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 3/PageSize[612 996]/ImagingBBox null>>setpagedevice"
+
+// Envelope
+ CustomMedia "EnvMonarch/Monarch Envelope 3.875x7.5in" 279 540 18 15.5 18 15.5 "<</cupsInteger0 96/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvDL/DL Envelope 110x220mm" 311.76 623.52 18 15.5 18 15.5 "<</cupsInteger0 27/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 27/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Env10/#10 Envelope 4.12x9.5in" 297 684 12 12 12 12 "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC5/C5 Envelope 162x229mm" 459 649 12 12 12 12 "<</cupsInteger0 91/PageSize[459 649]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 91/PageSize[459 649]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvB5/B5 Envelope 176x250mm" 499 709 12 12 12 12 "<</cupsInteger0 100/PageSize[499 709]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 100/PageSize[499 709]/ImagingBBox null>>setpagedevice"
+
+ // Custom page sizes
+ HWMargins 12 12 12 12
+ VariablePaperSize Yes
+ MinSize 3in 5in
+ MaxSize 17in 36in
+
+ // <%LJZjsMono:Duplex%>
+ {
+ ModelName "HP LaserJet Professional p1606dn"
+ Attribute "NickName" "" "HP LaserJet Professional p1606dn, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LJ Professional p1606dn"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet professional p1606dn;DES:hp laserjet professional p1606dn;"
+ PCFileName "hp-laserjet_professional_p1606dn.ppd"
+ Attribute "Product" "" "(HP LaserJet Professional p1606dn Printer)"
+ }
+ } // End Supported media sizes.
+} // End LJZjsMono with Auto Duplex and No multiple Tray (for proprietary plugin)
+
+///////////////////// LJZjsColor (for proprietary plugin)
+{
+ Attribute "hpPrinterLanguage" "" "ljzjstream"
+ Attribute "hpPrinterPlatform" "" "ljzjscolor"
+
+ Group "General/General"
+
+ // cupsRowCount values map to PEN_TYPE + 1 from global_types.h
+ Option "ColorModel/Output Mode" PickOne AnySetup 10.0
+ Choice "Gray/Grayscale" "<</cupsColorSpace 3/cupsBitsPerColor 1/cupsRowCount 3/cupsRowStep 2>>setpagedevice"
+ *Choice "RGB/Color" "<</cupsColorSpace 17/cupsBitsPerColor 8/cupsRowCount 3/cupsRowStep 0>>setpagedevice"
+
+ // cupsMediaType values map to MEDIATYPE from global_types.h
+ Option "MediaType/Media Type" PickOne AnySetup 10.0
+ *Choice "Plain/Plain Paper" "<</MediaType(Plain)/cupsMediaType 0>>setpagedevice"
+ Choice "Glossy/Photo Paper" "<</MediaType(Glossy)/cupsMediaType 3>>setpagedevice"
+
+ // cupsCompression values map to QUALITY_MODE from global_types.h
+ Option "OutputMode/Print Quality" PickOne AnySetup 10.0
+ *Choice "Normal/Normal" "<</OutputType(0)/HWResolution[600 600]>>setpagedevice"
+ Choice "Draft/Draft" "<</OutputType(-1)/HWResolution[600 600]>>setpagedevice"
+
+ Attribute "cupsModelName" "" "HP Color LaserJet 2600n" // APDK device class
+
+// 4x6 or smaller
+ CustomMedia "Card3x5/Index Card 3x5in" 216 360 12.96 14.40 12.96 14.40 "<</cupsInteger0 96/PageSize [216 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize[216 360]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki/Hagaki 100x148mm" 284 420 19.12 14.40 19.12 14.40 "<</cupsInteger0 43/PageSize[284 420]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 43/PageSize[284 420]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6/Photo 4x6in" 288 432 18.00 14.40 18.00 14.40 "<</cupsInteger0 96/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6/A6 105x148mm" 297.36 419.76 18.12 14.40 18.12 14.40 "<</cupsInteger0 96/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+
+// 5x7
+ CustomMedia "Photo5x7/Photo 5x7in" 360 504 18.72 14.40 18.72 14.40 "<</cupsInteger0 96/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card5x8/Index Card 5x8in" 360 576 18.72 14.40 18.72 14.40 "<</cupsInteger0 96/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Oufuku/Oufuku-Hagaki 148x200mm" 567 420 18.54 14.40 18.54 14.40 "<</cupsInteger0 101/PageSize[567 420]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[567 420]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5/A5 148x210mm" 419.76 595.44 18.00 14.40 18.00 14.40 "<</cupsInteger0 11/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 11/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+
+// Standard
+ CustomMedia "B5/B5 176x250mm" 498.96 708.48 19.08 14 19.08 14 "<</cupsInteger0 357/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 357/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5/JB5 182x257mm" 516.24 728.64 18 14 18 14 "<</cupsInteger0 96/PageSize[516.24 728.64]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize [516.24 728.64]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Executive/Executive 7.25x10.5in" 522 756 19.08 14.40 19.08 14.40 "<</cupsInteger0 7/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 7/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ CustomMedia "16k/16k 7.75x10.75in" 558 774 18.00 14.40 18.00 14.40 "<</cupsInteger0 96/PageSize[558 774]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize[558 774]/ImagingBBox null>>setpagedevice" // custom
+ *CustomMedia "Letter/Letter 8.5x11in" 612 792 18.00 14.40 18.00 14.40 "<</cupsInteger0 1/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4/A4 210x297mm" 595.44 841.68 18.00 14.40 18.00 14.40 "<</cupsInteger0 9/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 9/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ CustomMedia "ExecutiveJIS/Executive (JIS) 8.5x12.986in" 612 936 18.00 14.40 18.00 14.40 "<</cupsInteger0 96/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ CustomMedia "FLSA/American Foolscap 8.5x13in" 612 936 18.00 14.40 18.00 14.40 "<</cupsInteger0 258/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 258/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Legal/Legal 8.5x14in" 612 1008 18.00 14.40 18.00 14.40 "<</cupsInteger0 5/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 5/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+
+// Envelope
+ CustomMedia "EnvA2/A2 Envelope 4.37x5.75in" 314.64 414 19.08 14 19.08 14 "<</cupsInteger0 96/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC6/C6 Envelope 114x162mm" 323.28 459.36 19.56 14.40 19.56 14.40 "<</cupsInteger0 96/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou4/#4 Japanese Envelope 90x205mm" 254.88 581.04 19.92 14 19.92 14 "<</cupsInteger0 96/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvMonarch/Monarch Envelope 3.875x7.5in" 279 540 18.00 14.40 18.00 14.40 "<</cupsInteger0 96/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvDL/DL Envelope 110x220mm" 311.76 623.52 18.00 14.40 18.00 14.40 "<</cupsInteger0 27/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 27/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Env10/#10 Envelope 4.12x9.5in" 297 684 18.00 14.40 18.00 14.40 "<</cupsInteger0 20/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 20/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou3/#3 Japanese Envelope 120x235mm" 339.84 666 18 14 18 14 "<</cupsInteger0 96/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC5/C5 Envelope 162x229mm" 459 649 18.3 14.40 18.3 14.40 "<</cupsInteger0 96/PageSize[459 649]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize[459 649]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvB5/B5 Envelope 176x250mm" 499 709 18.00 14.40 18.00 14.40 "<</cupsInteger0 96/PageSize[499 709]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize[499 709]/ImagingBBox null>>setpagedevice"
+
+ // Custom page sizes from 1x4in to Legal
+ HWMargins 18 14 18 14
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 8.5in 14in
+
+ {
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 10.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "<</Duplex true/Tumble false>>setpagedevice"
+ Choice "DuplexTumble/Short Edge (Flip)" "<</Duplex true/Tumble true>>setpagedevice"
+ *Choice "None/Off" "<</Duplex false/Tumble false>>setpagedevice"
+
+
+ // MediaPosition values map to MediaSource enumeration in global_types.h
+ Option "InputSlot/Media Source" PickOne AnySetup 10.0
+ *Choice "Auto/Auto-Select" "<</MediaPosition 7>>setpagedevice"
+ Choice "PhotoTray/Photo Tray" "<</MediaPosition 1>>setpagedevice"
+ Choice "Upper/Upper Tray" "<</MediaPosition 1>>setpagedevice"
+ Choice "Lower/Lower Tray" "<</MediaPosition 4>>setpagedevice"
+ Choice "Envelope/Envelope Feeder" "<</MediaPosition 3>>setpagedevice"
+ Choice "LargeCapacity/Large Capacity Tray" "<</MediaPosition 5>>setpagedevice"
+ Choice "Manual/Manual Feeder" "<</MediaPosition 2>>setpagedevice"
+ Choice "MPTray/Multi Purpose Tray" "<</MediaPosition 1>>setpagedevice"
+
+ // Duplexer is optional...
+ Installable "OptionDuplex/Duplexer Installed"
+
+ // Constraints
+ UIConstraints "*Duplex *OptionDuplex False"
+
+ // <%LJZjsColor:Normal%>
+ {
+ ModelName "HP Color LaserJet cp1215"
+ Attribute "NickName" "" "HP Color LaserJet cp1215, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP Color LaserJet cp1215"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet cp1215;DES:hp color laserjet cp1215;"
+ PCFileName "hp-color_laserjet_cp1215.ppd"
+ Attribute "Product" "" "(HP Color LaserJet cp1215 Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet cp1217"
+ Attribute "NickName" "" "HP Color LaserJet cp1217, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP Color LaserJet cp1217"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet cp1217;DES:hp color laserjet cp1217;"
+ PCFileName "hp-color_laserjet_cp1217.ppd"
+ Attribute "Product" "" "(HP Color LaserJet cp1217 Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet 1600"
+ Attribute "NickName" "" "HP Color LaserJet 1600, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP Color LaserJet 1600"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet 1600;DES:hp color laserjet 1600;"
+ PCFileName "hp-color_laserjet_1600.ppd"
+ Attribute "Product" "" "(HP Color LaserJet 1600 Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet 2600n"
+ Attribute "NickName" "" "HP Color LaserJet 2600n, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP Color LaserJet 2600n"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet 2600n;DES:hp color laserjet 2600n;"
+ PCFileName "hp-color_laserjet_2600n.ppd"
+ Attribute "Product" "" "(HP Color LaserJet 2600n Printer)"
+ }
+ } // End Supported media sizes.
+
+ {
+ Option "InputSlot/Media Source" PickOne AnySetup 10.0
+ *Choice "Auto/Auto-Select" "<</MediaPosition 7>>setpagedevice"
+ Choice "Manual/Manual Feeder" "<</MediaPosition 2>>setpagedevice"
+
+ Attribute "hpLJZjsColorVersion" "" "2"
+ // <%LJZjsColor:Advanced%>
+ {
+ ModelName "HP LaserJet cp1025nw"
+ Attribute "NickName" "" "HP LaserJet cp1025nw, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LaserJet cp1025nw"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet cp1025nw;DES:hp laserjet cp1025nw;"
+ PCFileName "hp-laserjet_cp1025nw.ppd"
+ Attribute "Product" "" "(HP LaserJet Pro cp1025nw Color Printer Series)"
+ }
+ {
+ ModelName "HP LaserJet cp1025"
+ Attribute "NickName" "" "HP LaserJet cp1025, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LaserJet cp1025"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet cp1025;DES:hp laserjet cp1025;"
+ PCFileName "hp-laserjet_cp1025.ppd"
+ Attribute "Product" "" "(HP LaserJet Pro cp1025 Color Printer Series)"
+ }
+ {
+ ModelName "HP LaserJet Cp 1025nw"
+ Attribute "NickName" "" "HP LaserJet Cp 1025nw, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LaserJet Cp 1025nw"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet cp 1025nw;DES:hp laserjet cp 1025nw;"
+ PCFileName "hp-laserjet_cp_1025nw.ppd"
+ Attribute "Product" "" "(HP LaserJet Pro Cp 1025nw Color Printer Series)"
+ }
+ {
+ ModelName "HP LaserJet Cp 1025"
+ Attribute "NickName" "" "HP LaserJet Cp 1025, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LaserJet Cp 1025"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet cp 1025;DES:hp laserjet cp 1025;"
+ PCFileName "hp-laserjet_cp_1025.ppd"
+ Attribute "Product" "" "(HP LaserJet Pro Cp 1025 Color Printer Series)"
+ }
+ }
+} // End LJZjsColor (for proprietary plugin)
+
+///////////// LJJetReady (color, for both open and proprietary plugin)
+{
+ Attribute "hpPrinterLanguage" "" "ljjetready"
+
+ Group "General/General"
+
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 10.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "<</Duplex true/Tumble false>>setpagedevice"
+ Choice "DuplexTumble/Short Edge (Flip)" "<</Duplex true/Tumble true>>setpagedevice"
+ *Choice "None/Off" "<</Duplex false/Tumble false>>setpagedevice"
+
+ // MediaPosition values map to MediaSource enumeration in global_types.h
+ Option "InputSlot/Media Source" PickOne AnySetup 10.0
+ *Choice "Auto/Auto-Select" "<</MediaPosition 7>>setpagedevice"
+ Choice "PhotoTray/Photo Tray" "<</MediaPosition 1>>setpagedevice"
+ Choice "Upper/Upper Tray" "<</MediaPosition 1>>setpagedevice"
+ Choice "Lower/Lower Tray" "<</MediaPosition 4>>setpagedevice"
+ Choice "Envelope/Envelope Feeder" "<</MediaPosition 3>>setpagedevice"
+ Choice "LargeCapacity/Large Capacity Tray" "<</MediaPosition 5>>setpagedevice"
+ Choice "Manual/Manual Feeder" "<</MediaPosition 2>>setpagedevice"
+ Choice "MPTray/Multi Purpose Tray" "<</MediaPosition 1>>setpagedevice"
+
+ // cupsRowCount values map to PEN_TYPE + 1 from global_types.h
+ Option "ColorModel/Output Mode" PickOne AnySetup 10.0
+ Choice "Gray/Grayscale" "<</cupsColorSpace 3/cupsBitsPerColor 1/cupsRowCount 3/cupsRowStep 2>>setpagedevice"
+ *Choice "RGB/Color" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowCount 3/cupsRowStep 0>>setpagedevice" /* no RGBW */
+
+ // cupsMediaType values map to MEDIATYPE from global_types.h
+ Option "MediaType/Media Type" PickOne AnySetup 10.0
+ *Choice "Plain/Plain Paper" "<</MediaType(Plain)/cupsMediaType 0>>setpagedevice"
+ Choice "Glossy/Photo Paper" "<</MediaType(Glossy)/cupsMediaType 3>>setpagedevice"
+
+ // cupsCompression values map to QUALITY_MODE from global_types.h
+ // Best mode is only available with proprietary plugin.
+ // Best mode will down-select to Normal if no proprietary plugin is installed.
+ Option "OutputMode/Print Quality" PickOne AnySetup 10.0
+ *Choice "Normal/Normal" "<</OutputType(0)/HWResolution[600 600]>>setpagedevice"
+ Choice "Draft/Draft" "<</OutputType(-1)/HWResolution[600 600]>>setpagedevice"
+ Choice "Best/Best" "<</OutputType(1)/HWResolution[600 600]>>setpagedevice"
+
+ // Duplexer is optional...
+ Installable "OptionDuplex/Duplexer Installed"
+
+ // Constraints
+ UIConstraints "*Duplex *OptionDuplex False"
+
+ Attribute "cupsModelName" "" "hp color LaserJet 3500" // APDK device class
+
+ {
+// 4x6 or smaller
+ CustomMedia "Card3x5/Index Card 3x5in" 216 360 12.00 14.40 12.00 14.40 "<</cupsInteger0 96/PageSize [216 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize[216 360]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki/Hagaki 100x148mm" 284 420 13.36 14.40 13.36 14.40 "<</cupsInteger0 96/PageSize[284 420]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize[284 420]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6/Photo 4x6in" 288 432 17.28 14.40 17.28 14.40 "<</cupsInteger0 96/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6/A6 105x148mm" 297.36 419.76 14.28 14.40 14.28 14.40 "<</cupsInteger0 96/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+
+// 5x7
+ CustomMedia "Photo5x7/Photo 5x7in" 360 504 12.96 14.40 12.96 14.40 "<</cupsInteger0 96/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card5x8/Index Card 5x8in" 360 576 12.96 14.40 12.96 14.40 "<</cupsInteger0 96/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Oufuku/Oufuku-Hagaki 148x200mm" 567 420 14.70 14.40 14.70 14.40 "<</cupsInteger0 96/PageSize[567 420]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize[567 420]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5/A5 148x210mm" 419.76 595.44 12.12 14.40 12.12 14.40 "<</cupsInteger0 16/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 16/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+
+// Standard
+ CustomMedia "B5/B5 176x250mm" 498.96 708.48 13.32 14.40 13.32 14.40 "<</cupsInteger0 11/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 11/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5/JB5 182x257mm" 516.24 728.64 14.28 14.40 14.28 14.40 "<</cupsInteger0 96/PageSize[516.24 728.64]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize [516.24 728.64]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Executive/Executive 7.25x10.5in" 522 756 13.32 14.40 13.32 14.40 "<</cupsInteger0 3/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 3/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ CustomMedia "16k/16k 7.75x10.75in" 558 774 12.12 14.40 12.12 14.40 "<</cupsInteger0 96/PageSize[558 774]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize[558 774]/ImagingBBox null>>setpagedevice" // custom
+ *CustomMedia "Letter/Letter 8.5x11in" 612 792 14.16 14.40 14.16 14.40 "<</cupsInteger0 0/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 0/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4/A4 210x297mm" 595.44 841.68 13.56 14.40 13.56 14.40 "<</cupsInteger0 2/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ CustomMedia "ExecutiveJIS/Executive (JIS) 8.5x12.986in" 612 936 14.16 14.40 14.16 14.40 "<</cupsInteger0 96/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ CustomMedia "FLSA/American Foolscap 8.5x13in" 612 936 14.16 14.40 14.16 14.40 "<</cupsInteger0 96/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Legal/Legal 8.5x14in" 612 1008 14.16 14.40 14.16 14.40 "<</cupsInteger0 1/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+
+// Envelope
+ CustomMedia "EnvA2/A2 Envelope 4.37x5.75in" 314.64 414 21.00 14.40 21.00 14.40 "<</cupsInteger0 6/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 6/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC6/C6 Envelope 114x162mm" 323.28 459.36 14.16 14.40 14.16 14.40 "<</cupsInteger0 96/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou4/#4 Japanese Envelope 90x205mm" 254.88 581.04 14.16 14.40 14.16 14.40 "<</cupsInteger0 96/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvMonarch/Monarch Envelope 3.875x7.5in" 279 540 14.70 14.40 14.70 14.40 "<</cupsInteger0 96/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvDL/DL Envelope 110x220mm" 311.76 623.52 15.72 14.40 15.72 14.40 "<</cupsInteger0 9/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 9/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Env10/#10 Envelope 4.12x9.5in" 297 684 14.10 14.40 14.10 14.40 "<</cupsInteger0 6/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 6/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou3/#3 Japanese Envelope 120x235mm" 339.84 666 14.40 14.40 14.40 14.40 "<</cupsInteger0 96/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC5/C5 Envelope 162x229mm" 459 649 14.46 14.40 14.46 14.40 "<</cupsInteger0 96/PageSize[459 649]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize[459 649]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvB5/B5 Envelope 176x250mm" 499 709 14.76 14.40 14.76 14.40 "<</cupsInteger0 96/PageSize[499 709]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize[499 709]/ImagingBBox null>>setpagedevice"
+
+ // Custom page sizes from 1x4in to Legal
+ HWMargins 18 14.4 18 14.4
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 8.5in 14in
+
+ // <%LJJetReady:Normal%>
+ {
+ ModelName "HP Color LaserJet 3500n"
+ Attribute "NickName" "" "HP Color LaserJet 3500n, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP Color LaserJet 3500n"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet 3500n;DES:hp color laserjet 3500n;"
+ PCFileName "hp-color_laserjet_3500n.ppd"
+ Attribute "Product" "" "(HP Color LaserJet 3500n Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet 3500"
+ Attribute "NickName" "" "HP Color LaserJet 3500, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP Color LaserJet 3500"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet 3500;DES:hp color laserjet 3500;"
+ PCFileName "hp-color_laserjet_3500.ppd"
+ Attribute "Product" "" "(HP Color LaserJet 3500 Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 3500dn Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 3500dtn Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet 3550"
+ Attribute "NickName" "" "HP Color LaserJet 3550, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP Color LaserJet 3550"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet 3550;DES:hp color laserjet 3550;"
+ PCFileName "hp-color_laserjet_3550.ppd"
+ Attribute "Product" "" "(HP Color LaserJet 3550 Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet 3550n"
+ Attribute "NickName" "" "HP Color LaserJet 3550n, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP Color LaserJet 3550n"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet 3550n;DES:hp color laserjet 3550n;"
+ PCFileName "hp-color_laserjet_3550n.ppd"
+ Attribute "Product" "" "(HP Color LaserJet 3550n Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet 3600"
+ Attribute "NickName" "" "HP Color LaserJet 3600, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP Color LaserJet 3600"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet 3600;DES:hp color laserjet 3600;"
+ PCFileName "hp-color_laserjet_3600.ppd"
+ Attribute "Product" "" "(HP Color LaserJet 3600 Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 3600n Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 3600dn Printer)"
+ }
+ } // End Supported media sizes.
+} // End LJJetReady (color, for both open and proprietary plugin)
+
+///////////// LJm1005 (monochrome, for proprietary plugin)
+{
+ Attribute "hpPrinterLanguage" "" "ljzxstream"
+
+ Group "General/General"
+
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 10.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "<</Duplex true/Tumble false>>setpagedevice"
+ Choice "DuplexTumble/Short Edge (Flip)" "<</Duplex true/Tumble true>>setpagedevice"
+ *Choice "None/Off" "<</Duplex false/Tumble false>>setpagedevice"
+
+ // MediaPosition values map to MediaSource enumeration in global_types.h
+ Option "InputSlot/Media Source" PickOne AnySetup 10.0
+ *Choice "Auto/Auto-Select" "<</MediaPosition 7>>setpagedevice"
+ Choice "PhotoTray/Photo Tray" "<</MediaPosition 1>>setpagedevice"
+ Choice "Upper/Upper Tray" "<</MediaPosition 1>>setpagedevice"
+ Choice "Lower/Lower Tray" "<</MediaPosition 4>>setpagedevice"
+ Choice "Envelope/Envelope Feeder" "<</MediaPosition 3>>setpagedevice"
+ Choice "LargeCapacity/Large Capacity Tray" "<</MediaPosition 5>>setpagedevice"
+ Choice "Manual/Manual Feeder" "<</MediaPosition 2>>setpagedevice"
+ Choice "MPTray/Multi Purpose Tray" "<</MediaPosition 1>>setpagedevice"
+
+ // cupsRowCount values map to PEN_TYPE + 1 from global_types.h
+ Option "ColorModel/Output Mode" PickOne AnySetup 10.0
+ *Choice "Gray/Grayscale" "<</cupsColorSpace 3/cupsBitsPerColor 1/cupsRowCount 1/cupsRowStep 2>>setpagedevice"
+
+ // cupsMediaType values map to MEDIATYPE from global_types.h
+ Option "MediaType/Media Type" PickOne AnySetup 10.0
+ *Choice "Plain/Plain Paper" "<</MediaType(Plain)/cupsMediaType 0>>setpagedevice"
+
+ // cupsCompression values map to QUALITY_MODE from global_types.h
+ Option "OutputMode/Print Quality" PickOne AnySetup 10.0
+ *Choice "Normal/Normal" "<</cupsInteger1 600/OutputType(0)/HWResolution[600 600]>>setpagedevice"
+ Choice "Draft/Draft" "<</cupsInteger1 600/OutputType(-1)/HWResolution[600 600]>>setpagedevice"
+
+ // Duplexer is optional...
+ Installable "OptionDuplex/Duplexer Installed"
+
+ // Constraints
+ UIConstraints "*Duplex *OptionDuplex False"
+
+ Attribute "cupsModelName" "" "HP LaserJet M1005" // APDK device class
+
+ {
+// 4x6 or smaller
+ CustomMedia "Card3x5/Index Card 3x5in" 216 360 12 13 12 13 "<</cupsInteger0 96/PageSize [216 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize[216 360]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki/Hagaki 100x148mm" 284 420 12 13 12 13 "<</cupsInteger0 43/PageSize[284 420]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 43/PageSize[284 420]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6/A6 105x148mm" 297.36 419.76 12 13 12 13 "<</cupsInteger0 96/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+
+// 5x7
+ CustomMedia "Card5x8/Index Card 5x8in" 360 576 12 13 12 13 "<</cupsInteger0 96/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Oufuku/Oufuku-Hagaki 148x200mm" 567 420 12 13 12 13 "<</cupsInteger0 43/PageSize[567 420]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 43/PageSize[567 420]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5/A5 148x210mm" 419.76 595.44 12 13 12 13 "<</cupsInteger0 11/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 11/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+
+// Standard
+ CustomMedia "B5/B5 176x250mm" 498.96 708.48 12 13 12 13 "<</cupsInteger0 357/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 357/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5/JB5 182x257mm" 516.24 728.64 12.36 13 12.36 13 "<</cupsInteger0 96/PageSize[516.24 728.64]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize [516.24 728.64]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Executive/Executive 7.25x10.5in" 522 756 12 13 12 13 "<</cupsInteger0 7/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 7/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ CustomMedia "16k/16k 7.75x10.75in" 558 774 12 13 12 13 "<</cupsInteger0 96/PageSize[558 774]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize[558 774]/ImagingBBox null>>setpagedevice" // custom
+ *CustomMedia "Letter/Letter 8.5x11in" 612 792 12 13 12 13 "<</cupsInteger0 1/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4/A4 210x297mm" 595.44 841.68 13.56 13.5 13.56 13.5 "<</cupsInteger0 9/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 9/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ CustomMedia "ExecutiveJIS/Executive (JIS) 8.5x12.986in" 612 936 12 13 12 13 "<</cupsInteger0 96/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ CustomMedia "FLSA/American Foolscap 8.5x13in" 612 936 12 13 12 13 "<</cupsInteger0 258/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 258/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Legal/Legal 8.5x14in" 612 1008 12 13 12 13 "<</cupsInteger0 5/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 5/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+
+// Envelope
+ CustomMedia "EnvA2/A2 Envelope 4.37x5.75in" 314.64 414 12 13 12 13 "<</cupsInteger0 96/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC6/C6 Envelope 114x162mm" 323.28 459.36 12 13 12 13 "<</cupsInteger0 96/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou4/#4 Japanese Envelope 90x205mm" 254.88 581.04 12.24 13 12.24 13 "<</cupsInteger0 96/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvMonarch/Monarch Envelope 3.875x7.5in" 279 540 12.78 13 12.78 13 "<</cupsInteger0 96/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvDL/DL Envelope 110x220mm" 311.76 623.52 11.76 13 11.76 13 "<</cupsInteger0 27/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 27/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Env10/#10 Envelope 4.12x9.5in" 297 684 12 13 12 13 "<</cupsInteger0 20/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 20/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou3/#3 Japanese Envelope 120x235mm" 339.84 666 12.48 13 12.48 13 "<</cupsInteger0 96/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC5/C5 Envelope 162x229mm" 459 649 12 13 12 13 "<</cupsInteger0 96/PageSize[459 649]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize[459 649]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvB5/B5 Envelope 176x250mm" 499 709 12 13 12 13 "<</cupsInteger0 96/PageSize[499 709]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize[499 709]/ImagingBBox null>>setpagedevice"
+
+ // Custom page sizes from 1x4in to Legal
+ HWMargins 12 13 12 13
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 8.5in 14in
+
+ // <%LJm1005:Normal%>
+ {
+ ModelName "HP LaserJet m1005"
+ Attribute "NickName" "" "HP LaserJet m1005, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LaserJet m1005"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet m1005;DES:hp laserjet m1005;"
+ PCFileName "hp-laserjet_m1005.ppd"
+ Attribute "Product" "" "(HP LaserJet m1005 Multifunction Printer)"
+ }
+ {
+ ModelName "HP LaserJet p1505n"
+ Attribute "NickName" "" "HP LaserJet p1505n zxs, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LaserJet p1505n"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet p1505n;DES:hp laserjet p1505n;"
+ PCFileName "hp-laserjet_p1505n-zxs.ppd"
+ Attribute "Product" "" "(HP LaserJet p1505n Printer)"
+ }
+ {
+ ModelName "HP LaserJet p1505"
+ Attribute "NickName" "" "HP LaserJet p1505, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LaserJet p1505"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet p1505;DES:hp laserjet p1505;"
+ PCFileName "hp-laserjet_p1505.ppd"
+ Attribute "Product" "" "(HP LaserJet p1505 Printer)"
+ }
+ {
+ ModelName "HP LaserJet p2014"
+ Attribute "NickName" "" "HP LaserJet p2014 zxs, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LaserJet p2014"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet p2014;DES:hp laserjet p2014;"
+ PCFileName "hp-laserjet_p2014-zxs.ppd"
+ Attribute "Product" "" "(HP LaserJet p2014 Printer)"
+ }
+ {
+ ModelName "HP LaserJet p2014n"
+ Attribute "NickName" "" "HP LaserJet p2014n zxs, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LaserJet p2014n"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet p2014n;DES:hp laserjet p2014n;"
+ PCFileName "hp-laserjet_p2014n-zxs.ppd"
+ Attribute "Product" "" "(HP LaserJet p2014n Printer)"
+ }
+ } // End Supported media sizes.
+} // End LJm1005 (monochrome, for proprietary plugin)
+
+///////////// LJP1XXX (monochrome, for proprietary plugin)
+{
+ Attribute "hpPrinterLanguage" "" "ljzxstream"
+
+ Group "General/General"
+
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 10.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "<</Duplex true/Tumble false>>setpagedevice"
+ Choice "DuplexTumble/Short Edge (Flip)" "<</Duplex true/Tumble true>>setpagedevice"
+ *Choice "None/Off" "<</Duplex false/Tumble false>>setpagedevice"
+
+ // MediaPosition values map to MediaSource enumeration in global_types.h
+ Option "InputSlot/Media Source" PickOne AnySetup 10.0
+ *Choice "Auto/Auto-Select" "<</MediaPosition 7>>setpagedevice"
+ Choice "PhotoTray/Photo Tray" "<</MediaPosition 1>>setpagedevice"
+ Choice "Upper/Upper Tray" "<</MediaPosition 1>>setpagedevice"
+ Choice "Lower/Lower Tray" "<</MediaPosition 4>>setpagedevice"
+ Choice "Envelope/Envelope Feeder" "<</MediaPosition 3>>setpagedevice"
+ Choice "LargeCapacity/Large Capacity Tray" "<</MediaPosition 5>>setpagedevice"
+ Choice "Manual/Manual Feeder" "<</MediaPosition 2>>setpagedevice"
+ Choice "MPTray/Multi Purpose Tray" "<</MediaPosition 1>>setpagedevice"
+
+ // cupsRowCount values map to PEN_TYPE + 1 from global_types.h
+ Option "ColorModel/Output Mode" PickOne AnySetup 10.0
+ *Choice "Gray/Grayscale" "<</cupsColorSpace 3/cupsBitsPerColor 1/cupsRowCount 1/cupsRowStep 2>>setpagedevice"
+
+ // cupsMediaType values map to MEDIATYPE from global_types.h
+ Option "MediaType/Media Type" PickOne AnySetup 10.0
+ *Choice "Plain/Plain Paper" "<</MediaType(Plain)/cupsMediaType 0>>setpagedevice"
+
+ // cupsCompression values map to QUALITY_MODE from global_types.h
+ Option "OutputMode/Print Quality" PickOne AnySetup 10.0
+ *Choice "Normal/Normal" "<</cupsInteger1 600/OutputType(0)/HWResolution[600 600]>>setpagedevice"
+ Choice "Draft/Draft" "<</cupsInteger1 400/OutputType(-1)/HWResolution[600 600]>>setpagedevice"
+
+ // Duplexer is optional...
+ Installable "OptionDuplex/Duplexer Installed"
+
+ // Constraints
+ UIConstraints "*Duplex *OptionDuplex False"
+
+ Attribute "cupsModelName" "" "HP LaserJet P1005" // APDK device class
+
+ {
+// 4x6 or smaller
+ CustomMedia "Card3x5/Index Card 3x5in" 216 360 12 13 12 13 "<</cupsInteger0 96/PageSize [216 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize[216 360]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki/Hagaki 100x148mm" 284 420 12 13 12 13 "<</cupsInteger0 43/PageSize[284 420]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 43/PageSize[284 420]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6/A6 105x148mm" 297.36 419.76 12 13 12 13 "<</cupsInteger0 96/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+
+// 5x7
+ CustomMedia "Card5x8/Index Card 5x8in" 360 576 12 13 12 13 "<</cupsInteger0 96/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Oufuku/Oufuku-Hagaki 148x200mm" 567 420 12 13 12 13 "<</cupsInteger0 43/PageSize[567 420]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 43/PageSize[567 420]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5/A5 148x210mm" 419.76 595.44 12 13 12 13 "<</cupsInteger0 11/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 11/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+
+// Standard
+ CustomMedia "B5/B5 176x250mm" 498.96 708.48 12 13 12 13 "<</cupsInteger0 357/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 357/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5/JB5 182x257mm" 516.24 728.64 12.36 13 12.36 13 "<</cupsInteger0 96/PageSize[516.24 728.64]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize [516.24 728.64]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Executive/Executive 7.25x10.5in" 522 756 12 13 12 13 "<</cupsInteger0 7/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 7/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ CustomMedia "16k/16k 7.75x10.75in" 558 774 12 13 12 13 "<</cupsInteger0 96/PageSize[558 774]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize[558 774]/ImagingBBox null>>setpagedevice" // custom
+ *CustomMedia "Letter/Letter 8.5x11in" 612 792 12 13 12 13 "<</cupsInteger0 1/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4/A4 210x297mm" 595.44 841.68 13.56 13.5 13.56 13.5 "<</cupsInteger0 9/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 9/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ CustomMedia "ExecutiveJIS/Executive (JIS) 8.5x12.986in" 612 936 12 13 12 13 "<</cupsInteger0 96/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ CustomMedia "FLSA/American Foolscap 8.5x13in" 612 936 12 13 12 13 "<</cupsInteger0 258/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 258/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Legal/Legal 8.5x14in" 612 1008 12 13 12 13 "<</cupsInteger0 5/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 5/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+
+// Envelope
+ CustomMedia "EnvA2/A2 Envelope 4.37x5.75in" 314.64 414 12 13 12 13 "<</cupsInteger0 96/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC6/C6 Envelope 114x162mm" 323.28 459.36 12 13 12 13 "<</cupsInteger0 96/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou4/#4 Japanese Envelope 90x205mm" 254.88 581.04 12.24 13 12.24 13 "<</cupsInteger0 96/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvMonarch/Monarch Envelope 3.875x7.5in" 279 540 12.78 13 12.78 13 "<</cupsInteger0 96/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvDL/DL Envelope 110x220mm" 311.76 623.52 11.76 13 11.76 13 "<</cupsInteger0 27/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 27/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Env10/#10 Envelope 4.12x9.5in" 297 684 12 13 12 13 "<</cupsInteger0 20/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 20/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou3/#3 Japanese Envelope 120x235mm" 339.84 666 12.48 13 12.48 13 "<</cupsInteger0 96/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC5/C5 Envelope 162x229mm" 459 649 12 13 12 13 "<</cupsInteger0 96/PageSize[459 649]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize[459 649]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvB5/B5 Envelope 176x250mm" 499 709 12 13 12 13 "<</cupsInteger0 96/PageSize[499 709]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 96/PageSize[499 709]/ImagingBBox null>>setpagedevice"
+
+ // Custom page sizes from 1x4in to Legal
+ HWMargins 12 13 12 13
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 8.5in 14in
+
+ // <%LJP1XXX:Normal%>
+ {
+ ModelName "HP LaserJet p1005"
+ Attribute "NickName" "" "HP LaserJet p1005, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LaserJet p1005"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet p1005;DES:hp laserjet p1005;"
+ PCFileName "hp-laserjet_p1005.ppd"
+ Attribute "Product" "" "(HP LaserJet p1005 Printer)"
+ }
+ {
+ ModelName "HP LaserJet p1006"
+ Attribute "NickName" "" "HP LaserJet p1006, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LaserJet p1006"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet p1006;DES:hp laserjet p1006;"
+ PCFileName "hp-laserjet_p1006.ppd"
+ Attribute "Product" "" "(HP LaserJet p1006 Printer)"
+ }
+ {
+ ModelName "HP LaserJet p1007"
+ Attribute "NickName" "" "HP LaserJet p1007, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LaserJet p1007"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet p1007;DES:hp laserjet p1007;"
+ PCFileName "hp-laserjet_p1007.ppd"
+ Attribute "Product" "" "(HP LaserJet p1007 Printer)"
+ }
+ {
+ ModelName "HP LaserJet p1008"
+ Attribute "NickName" "" "HP LaserJet p1008, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LaserJet p1008"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet p1008;DES:hp laserjet p1008;"
+ PCFileName "hp-laserjet_p1008.ppd"
+ Attribute "Product" "" "(HP LaserJet p1008 Printer)"
+ }
+ {
+ ModelName "HP LaserJet p1009"
+ Attribute "NickName" "" "HP LaserJet p1009, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LaserJet p1009"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet p1009;DES:hp laserjet p1009;"
+ PCFileName "hp-laserjet_p1009.ppd"
+ Attribute "Product" "" "(HP LaserJet p1009 Printer)"
+ }
+ } // End Supported media sizes.
+} // End LJP1XXX (monochrome, for proprietary plugin)
+
+} // End Manufacturer "HP"
+
+{
+ Manufacturer "Apollo"
+///////////// Apollo
+{
+ Attribute "hpPrinterLanguage" "" "pcl3"
+ Attribute "hpPrinterPlatform" "" "apollo2xxx"
+ Attribute "HPMechOffset" "" "40"
+
+ Group "General/General"
+
+ // MediaPosition values map to MediaSource enumeration in global_types.h
+ Option "InputSlot/Media Source" PickOne AnySetup 10.0
+ *Choice "Auto/Auto-Select" "<</MediaPosition 7>>setpagedevice"
+ Choice "PhotoTray/Photo Tray" "<</MediaPosition 6>>setpagedevice"
+ Choice "Upper/Upper Tray" "<</MediaPosition 1>>setpagedevice"
+ Choice "Lower/Lower Tray" "<</MediaPosition 4>>setpagedevice"
+ Choice "Envelope/Envelope Feeder" "<</MediaPosition 3>>setpagedevice"
+ Choice "LargeCapacity/Large Capacity Tray" "<</MediaPosition 5>>setpagedevice"
+ Choice "Manual/Manual Feeder" "<</MediaPosition 2>>setpagedevice"
+ Choice "MPTray/Multi Purpose Tray" "<</MediaPosition 1>>setpagedevice"
+
+ // cupsMediaType values map to MEDIATYPE from global_types.h
+ Option "MediaType/Media Type" PickOne AnySetup 10.0
+ *Choice "Plain/Plain Paper" "<</MediaType(Plain)/cupsMediaType 0>>setpagedevice"
+ Choice "Glossy/Photo Paper" "<</MediaType(Glossy)/cupsMediaType 3>>setpagedevice"
+
+ // cupsCompression values map to QUALITY_MODE from global_types.h
+ Option "OutputMode/Print Quality" PickOne AnySetup 10.0
+ *Choice "NormalRGB/Normal Color" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 0/OutputType(0)/cupsString0(PlainNormalColor)/HWResolution[300 300]>>setpagedevice"
+ Choice "NormaGrayl/Normal Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 2/OutputType(0)/cupsString0(PlainNormalGrayK)/HWResolution[300 300]>>setpagedevice"
+ Choice "DraftRGB/Draft Color" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 0/OutputType(-1)/cupsString0(PlainDraftColor)/HWResolution[300 300]>>setpagedevice"
+ Choice "DraftGray/Draft Grayscale" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 2/OutputType(-1)/cupsString0(PlainDraftGrayK)/HWResolution[300 300]>>setpagedevice"
+ Choice "Best/Best" "<</cupsColorSpace 3/cupsBitsPerColor 1/cupsRowStep 1/OutputType(1)/cupsString0(PlainBestGrayK)/HWResolution[600 300]>>setpagedevice" // black only
+ Choice "Photo/Photo" "<</cupsColorSpace 1/cupsBitsPerColor 8/cupsRowStep 0/OutputType(2)/cupsString0(PhotoNormalColor)/HWResolution[300 300]>>setpagedevice"
+
+ // Constraints
+ UIConstraints "*MediaType Glossy *OutputMode DraftRGB"
+ UIConstraints "*MediaType Glossy *OutputMode DraftGray"
+ UIConstraints "*MediaType Plain *OutputMode Photo"
+
+ {
+// 4x6 or smaller
+ CustomMedia "Card3x5/Index Card 3x5in" 216 360 18 48 18 9 "<</cupsInteger0 78/PageSize [216 360]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 78/PageSize[216 360]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Hagaki/Hagaki 100x148mm" 284 420 18 48 18 9 "<</cupsInteger0 71/PageSize[284 420]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 71/PageSize[284 420]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Photo4x6/Photo 4x6in" 288 432 18 48 18 9 "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 74/PageSize[288 432]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A6/A6 105x148mm" 297.36 419.76 18 48 18 9 "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 73/PageSize[297.36 419.76]/ImagingBBox null>>setpagedevice"
+
+// 5x7
+ CustomMedia "Photo5x7/Photo 5x7in" 360 504 18 48 18 9 "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 122/PageSize[360 504]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Card5x8/Index Card 5x8in" 360 576 18 48 18 9 "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 75/PageSize[360 576]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Oufuku/Oufuku-Hagaki 148x200mm" 567 420 18 48 18 9 "<</cupsInteger0 72/PageSize[567 420]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 72/PageSize[567 420]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A5/A5 148x210mm" 419.76 595.44 18 48 18 9 "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 25/PageSize[419.76 595.44]/ImagingBBox null>>setpagedevice"
+
+// Standard
+ CustomMedia "B5/B5 176x250mm" 498.96 708.48 18 48 18 9 "<</cupsInteger0 65/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 65/PageSize[498.96 708.48]/ImagingBBox null>>setpagedevice"
+ CustomMedia "JB5/JB5 182x257mm" 516.24 728.64 18 48 18 9 "<</cupsInteger0 45/PageSize[516.24 728.64]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 45/PageSize [516.24 728.64]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Executive/Executive 7.25x10.5in" 522 756 18 48 18 9 "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 1/PageSize[522 756]/ImagingBBox null>>setpagedevice"
+ CustomMedia "16k/16k 7.75x10.75in" 558 774 18 48 18 9 "<</cupsInteger0 101/PageSize[558 774]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 101/PageSize[558 774]/ImagingBBox null>>setpagedevice" // custom
+ *CustomMedia "Letter/Letter 8.5x11in" 612 792 18 48 18 9 "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 2/PageSize[612 792]/ImagingBBox null>>setpagedevice"
+ CustomMedia "A4/A4 210x297mm" 595.44 841.68 18 48 18 9 "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 26/PageSize[595.44 841.68]/ImagingBBox null>>setpagedevice"
+ CustomMedia "ExecutiveJIS/Executive (JIS) 8.5x12.986in" 612 936 18 48 18 9 "<</cupsInteger0 10/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 10/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ CustomMedia "FLSA/American Foolscap 8.5x13in" 612 936 18 48 18 9 "<</cupsInteger0 10/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 10/PageSize[612 936]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Legal/Legal 8.5x14in" 612 1008 18 48 18 9 "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 3/PageSize[612 1008]/ImagingBBox null>>setpagedevice"
+
+// Envelope
+ CustomMedia "EnvA2/A2 Envelope 4.37x5.75in" 314.64 414 18 48 18 9 "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 109/PageSize[314.64 414]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC6/C6 Envelope 114x162mm" 323.28 459.36 18 48 18 9 "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 92/PageSize[323.28 459.36]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou4/#4 Japanese Envelope 90x205mm" 254.88 581.04 18 48 18 9 "<</cupsInteger0 111/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 111/PageSize[254.88 581.04]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvMonarch/Monarch Envelope 3.875x7.5in" 279 540 18 48 18 9 "<</cupsInteger0 80/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 80/PageSize[279 540]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvDL/DL Envelope 110x220mm" 311.76 623.52 18 48 18 9 "<</cupsInteger0 90/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 90/PageSize[311.76 623.52]/ImagingBBox null>>setpagedevice"
+ CustomMedia "Env10/#10 Envelope 4.12x9.5in" 297 684 18 48 18 9 "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 81/PageSize[297 684]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvChou3/#3 Japanese Envelope 120x235mm" 339.84 666 18 48 18 9 "<</cupsInteger0 110/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 110/PageSize[339.84 666]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvC5/C5 Envelope 162x229mm" 459 649 18 48 18 9 "<</cupsInteger0 91/PageSize[459 649]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 91/PageSize[459 649]/ImagingBBox null>>setpagedevice"
+ CustomMedia "EnvB5/B5 Envelope 176x250mm" 499 709 18 48 18 9 "<</cupsInteger0 100/PageSize[499 709]/ImagingBBox null>>setpagedevice"
+ "<</cupsInteger0 100/PageSize[499 709]/ImagingBBox null>>setpagedevice"
+
+ // Custom page sizes from 1x4in to Legal
+ HWMargins 18 48 18 9
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 8.5in 14in
+
+ {
+ Attribute "cupsModelName" "" "APOLLO P-2200" // APDK device class
+ // <%AP2xxx:Apollo2200%>
+ {
+ ModelName "Apollo 2200"
+ Attribute "NickName" "" "Apollo 2200, $Version"
+ Attribute "ShortNickName" "" "Apollo 2200"
+ Attribute "1284DeviceID" "" "MFG:Apollo;MDL:apollo 2200;DES:apollo 2200;"
+ PCFileName "apollo-2200.ppd"
+ Attribute "Product" "" "(Apollo 2200 Printer)"
+ }
+ {
+ ModelName "Apollo p2250"
+ Attribute "NickName" "" "Apollo p2250, $Version"
+ Attribute "ShortNickName" "" "Apollo p2250"
+ Attribute "1284DeviceID" "" "MFG:Apollo;MDL:apollo p2250;DES:apollo p2250;"
+ PCFileName "apollo-p2250.ppd"
+ Attribute "Product" "" "(Apollo p2250 Printer)"
+ }
+ }
+ {
+ Attribute "cupsModelName" "" "P-2000U" // APDK device class
+ // <%AP21xx:Apollo2000%>
+ {
+ ModelName "Apollo p2000-u"
+ Attribute "NickName" "" "Apollo p2000-u, $Version"
+ Attribute "ShortNickName" "" "Apollo p2000-u"
+ Attribute "1284DeviceID" "" "MFG:Apollo;MDL:apollo p2000-u;DES:apollo p2000-u;"
+ PCFileName "apollo-p2000-u.ppd"
+ Attribute "Product" "" "(Apollo p2000-u Printer)"
+ }
+ {
+ ModelName "Apollo 2100"
+ Attribute "NickName" "" "Apollo 2100, $Version"
+ Attribute "ShortNickName" "" "Apollo 2100"
+ Attribute "1284DeviceID" "" "MFG:Apollo;MDL:apollo 2100;DES:apollo 2100;"
+ PCFileName "apollo-2100.ppd"
+ Attribute "Product" "" "(Apollo 2100 Printer)"
+ }
+ {
+ ModelName "Apollo 2150"
+ Attribute "NickName" "" "Apollo 2150, $Version"
+ Attribute "ShortNickName" "" "Apollo 2150"
+ Attribute "1284DeviceID" "" "MFG:Apollo;MDL:apollo 2150;DES:apollo 2150;"
+ PCFileName "apollo-2150.ppd"
+ Attribute "Product" "" "(Apollo 2150 Printer)"
+ }
+ }
+ {
+ Attribute "cupsModelName" "" "APOLLO P2500/2600" // APDK device class
+ // <%AP2560:Apollo2500%>
+ {
+ ModelName "Apollo 2500"
+ Attribute "NickName" "" "Apollo 2500, $Version"
+ Attribute "ShortNickName" "" "Apollo 2500"
+ Attribute "1284DeviceID" "" "MFG:Apollo;MDL:apollo 2500;DES:apollo 2500;"
+ PCFileName "apollo-2500.ppd"
+ Attribute "Product" "" "(Apollo 2500 Printer)"
+ }
+ {
+ ModelName "Apollo 2600"
+ Attribute "NickName" "" "Apollo 2600, $Version"
+ Attribute "ShortNickName" "" "Apollo 2600"
+ Attribute "1284DeviceID" "" "MFG:Apollo;MDL:apollo 2600;DES:apollo 2600;"
+ PCFileName "apollo-2600.ppd"
+ Attribute "Product" "" "(Apollo 2600 Printer)"
+ }
+ {
+ ModelName "Apollo 2650"
+ Attribute "NickName" "" "Apollo 2650, $Version"
+ Attribute "ShortNickName" "" "Apollo 2650"
+ Attribute "1284DeviceID" "" "MFG:Apollo;MDL:apollo 2650;DES:apollo 2650;"
+ PCFileName "apollo-2650.ppd"
+ Attribute "Product" "" "(Apollo 2650 Printer)"
+ }
+ }
+ } // End Supported media sizes.
+} // End Apollo
+
+} // End Manufacturer "Apollo"
diff --git a/prnt/drv/hpijs.drv.in b/prnt/drv/hpijs.drv.in
new file mode 100644
index 0000000..22a514f
--- /dev/null
+++ b/prnt/drv/hpijs.drv.in
@@ -0,0 +1,16084 @@
+//
+// hpijs.drv - hpijs driver information file for foomatic-rip
+//
+// This driver information file (drv) produces PPD files for the hpijs/ghostscript/foomatic-rip solution.
+// Multiple printers are supported by a finite set of device classes. This file defines the device classes
+// and each model that is associated with that device class.
+//
+// Each model entry has the following convention.
+//
+// ModelName "HP DeskJet 3810 Foomatic/hpijs" // friendly name
+// PCFileName "hp-deskjet_3810-hpijs.ppd" // PPD file name
+// Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet_3810;DES:deskjet_3810;" // for generic auto-ppd-selection
+//
+// The "ModelName" is a friendly name that can be displayed to the user for driver selection.
+//
+// The "PCFileName" should match the IEEE 1284 device-id model name. The model name is generated from the
+// IEEE 1284 "MDL" field. Leading and trailing spaces are removed, in-line spaces are replaced with a single
+// "_" character. Then an "hp-" prefix and "-hpijs.ppd" postfix is added/changed.
+//
+// The "1284DeviceID" is dummy IEEE 1284 device-id name. The name provides valid case-insensitive MFG:, MDL: and DES fields.
+// This provides third-party applications with a generic mechanism for auto-ppd-selection.
+//
+// In general there should be one drv model entry for every unique device-id supported by hpijs. This means one model entry
+// may support more than one product. For example the DeskJet 6100, DeskJet 6105, DeskJet 6110 and DeskJet 6150 all have the
+// same device-id "deskjet_6100_series". In this case there will only be one model entry the "DeskJet 6100".
+//
+// ModelName "HP DeskJet 6100 Foomatic/hpijs"
+// PCFileName "hp-deskjet_6100_series-hpijs.ppd"
+// Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet_6100;DES:deskjet_6100;"
+//
+// Found one exception to the above rule. There may need to be more than one model entry if there are different PPD options
+// per device-id. For example different models may support different paper sizes (ie: LaserJet 4 versus LaserJet 4V).
+//
+// Hpijs is a raster driver. Hpijs is not a postscript driver. In order to discriminate hpijs from other drivers we will use
+// the following PPD file naming convention.
+//
+// hpijs with foomatic-rip
+// hp-xxxxxxx-hpijs-zzz.ppd for
+//
+// hpijs with native CUPS
+// hp-xxxxxxx-zzz.ppd
+//
+// Postscript
+// hp-xxxxxxx-ps.ppd
+//
+// Where
+// xxxxxxx = normalized device-id name (ie: deskjet_6100_series)
+// zzz = page description language (ie: pcl, zjs, lidil). Use only to provide alternative PPD file selections.
+//
+// History
+// dsuffield 12/17/07 New
+// Parul Singh and Naga Samrat Chowdary, Narla 01/08/10 Added New SubClass LargeFormatA3:SmallMargins to OJ7000
+//
+// Line specification for autogeneration of Model entries using dat2drv.py:
+// // <%APDK Class:HPLIP subclass:...%>
+//
+
+
+// Include necessary files...
+#include <font.defs>
+#include <media.defs>
+
+#define VERSION "@VERSION@"
+
+// Copyright for all drivers...
+Copyright "(c) 2004-2008 Copyright Hewlett-Packard Development Company, LP"
+
+// Manufacturer - PPD spec has "HP" registered for "Hewlett-Packard"...
+Manufacturer "HP"
+
+// Driver version
+Version "hpijs $VERSION"
+
+// Custom driver
+DriverType ps
+
+// All standard fonts...
+Font *
+
+// Generate copies manually
+ManualCopies Yes
+
+// Color output
+ColorDevice Yes
+
+// 1 page per minute
+Throughput 1
+
+Attribute TTRasterizer "" Type42
+
+// CUPS filters...
+Filter "application/vnd.cups-postscript 100 @foomatic_filter@"
+Filter "application/vnd.cups-pdf 0 @foomatic_filter@"
+
+{
+ Manufacturer "Apollo"
+
+/////////////// Apollo
+{
+ // Set an up-stream hint for applications that we suppport 300/600/1200dpi.
+ Attribute "DefaultResolution" "" "300dpi"
+
+ // Custom page sizes from 1x4in to Legal
+ HWMargins 18 48.24 18 9
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 8.5in 14in
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "Apollo-P-2100 hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=300DraftColorCM&&
+Y"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft.Gray" "Quality=300DraftGr&&
+ayscaleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=300ColorCMY"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal.Gray" "Quality=300Graysc&&
+aleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High.Gray" "Quality=600x300Best&&
+GrayscaleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Photo" "Quality=300PhotoCMYcmK"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=PhotoTearOff" " -dDEVICEWIDTHPOINTS&&
+=288 -dDEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6TearOff" " -dDEVICEWIDTHPOINTS=29&&
+7 -dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD120" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMY" " -r300 -sIjsParams=Qua&&
+lity:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet=&&
+1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYK" " -r300 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftColorCMY" " -r300 -sIjsParam&&
+s=Quality:Quality=1,Quality:ColorMode=2,Quality:MediaType=0,Quality:Pe&&
+nSet=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftColorCMYK" " -r300 -sIjsPara&&
+ms=Quality:Quality=1,Quality:ColorMode=2,Quality:MediaType=0,Quality:P&&
+enSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftGrayscaleK" " -r300 -sIjs&&
+Params=Quality:Quality=1,Quality:ColorMode=0,Quality:MediaType=0,Quali&&
+ty:PenSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300GrayscaleK" " -r300 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300PhotoCMYcmK" " -r300 -sIjsParams=&&
+Quality:Quality=2,Quality:ColorMode=2,Quality:MediaType=1,Quality:PenS&&
+et=4"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600x300BestGrayscaleK" " -r600x30&&
+0 -sIjsParams=Quality:Quality=2,Quality:ColorMode=0,Quality:MediaType=&&
+0,Quality:PenSet=2"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft (Color cartridge)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ Choice "Draft.Gray/Draft Grayscale (Black cartridge)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft.Gray"
+ *Choice "Normal/Normal (Color cartridge)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "Normal.Gray/Normal Grayscale (Black cartridge)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal.Gray"
+ Choice "High.Gray/High Quality Grayscale (Black cartridge)" "%% FoomaticRIPOptionSetting: PrintoutMode=High.Gray"
+ Choice "Photo/Photo (Photo + color cartridge, photo paper)" "%% FoomaticRIPOptionSetting: PrintoutMode=Photo"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "300ColorCMY/300 dpi, Color, Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMY"
+ Choice "300ColorCMYK/300 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYK"
+ Choice "300DraftColorCMY/300 dpi, Draft, Color, Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftColorCMY"
+ Choice "300DraftColorCMYK/300 dpi, Draft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftColorCMYK"
+ Choice "300DraftGrayscaleK/300 dpi, Draft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftGrayscaleK"
+ Choice "300GrayscaleK/300 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300GrayscaleK"
+ Choice "300PhotoCMYcmK/300 dpi, Photo, Photo + Color Cartr., Premium Paper" "%% FoomaticRIPOptionSetting: Quality=300PhotoCMYcmK"
+ Choice "600x300BestGrayscaleK/600x300 dpi, Best, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=600x300BestGrayscaleK"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 9.72 48.24 9.72 9.00 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo or 5x7 inch index card" 360.00 504.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "PhotoTearOff/Photo with tear-off tab" 288.00 432.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff" "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "A6TearOff/A6 with tear-off tab" 297.00 420.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A6TearOff" "%% FoomaticRIPOptionSetting: PageSize=A6TearOff"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "CDDVD120/CD or DVD 120 mm" 360.00 360.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD120" "%% FoomaticRIPOptionSetting: PageSize=CDDVD120"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+
+ {
+ Attribute "FoomaticRIPOptionSetting" "Model=Apollo-P-2200" " -sDeviceManufacturer=&&
+&quot;APOLLO&quot; -sDeviceModel=&quot;APOLLO P-2200&quot;"
+ // <%AP2xxx:Apollo2200%>
+ {
+ ModelName "Apollo 2200 hpijs"
+ Attribute "NickName" "" "Apollo 2200 hpijs, $Version"
+ Attribute "ShortNickName" "" "Apollo 2200 hpijs"
+ Attribute "1284DeviceID" "" "MFG:Apollo;MDL:apollo 2200;DES:apollo 2200;"
+ PCFileName "apollo-2200-hpijs.ppd"
+ Attribute "Product" "" "(Apollo 2200 Printer)"
+ }
+ {
+ ModelName "Apollo p2250 hpijs"
+ Attribute "NickName" "" "Apollo p2250 hpijs, $Version"
+ Attribute "ShortNickName" "" "Apollo p2250 hpijs"
+ Attribute "1284DeviceID" "" "MFG:Apollo;MDL:apollo p2250;DES:apollo p2250;"
+ PCFileName "apollo-p2250-hpijs.ppd"
+ Attribute "Product" "" "(Apollo p2250 Printer)"
+ }
+ }
+ {
+ Attribute "FoomaticRIPOptionSetting" "Model=Apollo-P-2100" " -sDeviceManufacturer=&&
+&quot;APOLLO&quot; -sDeviceModel=&quot;P-2000U&quot;"
+ // <%AP21xx:Apollo2000%>
+ {
+ ModelName "Apollo p2000-u hpijs"
+ Attribute "NickName" "" "Apollo p2000-u hpijs, $Version"
+ Attribute "ShortNickName" "" "Apollo p2000-u hpijs"
+ Attribute "1284DeviceID" "" "MFG:Apollo;MDL:apollo p2000-u;DES:apollo p2000-u;"
+ PCFileName "apollo-p2000-u-hpijs.ppd"
+ Attribute "Product" "" "(Apollo p2000-u Printer)"
+ }
+ {
+ ModelName "Apollo 2100 hpijs"
+ Attribute "NickName" "" "Apollo 2100 hpijs, $Version"
+ Attribute "ShortNickName" "" "Apollo 2100 hpijs"
+ Attribute "1284DeviceID" "" "MFG:Apollo;MDL:apollo 2100;DES:apollo 2100;"
+ PCFileName "apollo-2100-hpijs.ppd"
+ Attribute "Product" "" "(Apollo 2100 Printer)"
+ }
+ {
+ ModelName "Apollo 2150 hpijs"
+ Attribute "NickName" "" "Apollo 2150 hpijs, $Version"
+ Attribute "ShortNickName" "" "Apollo 2150 hpijs"
+ Attribute "1284DeviceID" "" "MFG:Apollo;MDL:apollo 2150;DES:apollo 2150;"
+ PCFileName "apollo-2150-hpijs.ppd"
+ Attribute "Product" "" "(Apollo 2150 Printer)"
+ }
+ }
+ {
+ Attribute "FoomaticRIPOptionSetting" "Model=Apollo-P-2500" " -sDeviceManufacturer=&&
+&quot;APOLLO&quot; -sDeviceModel=&quot;APOLLO P2500/2600&quot;"
+ // <%AP2560:Apollo2500%>
+ {
+ ModelName "Apollo 2500 hpijs"
+ Attribute "NickName" "" "Apollo 2500 hpijs, $Version"
+ Attribute "ShortNickName" "" "Apollo 2500 hpijs"
+ Attribute "1284DeviceID" "" "MFG:Apollo;MDL:apollo 2500;DES:apollo 2500;"
+ PCFileName "apollo-2500-hpijs.ppd"
+ Attribute "Product" "" "(Apollo 2500 Printer)"
+ }
+ {
+ ModelName "Apollo 2600 hpijs"
+ Attribute "NickName" "" "Apollo 2600 hpijs, $Version"
+ Attribute "ShortNickName" "" "Apollo 2600 hpijs"
+ Attribute "1284DeviceID" "" "MFG:Apollo;MDL:apollo 2600;DES:apollo 2600;"
+ PCFileName "apollo-2600-hpijs.ppd"
+ Attribute "Product" "" "(Apollo 2600 Printer)"
+ }
+ {
+ ModelName "Apollo 2650 hpijs"
+ Attribute "NickName" "" "Apollo 2650 hpijs, $Version"
+ Attribute "ShortNickName" "" "Apollo 2650 hpijs"
+ Attribute "1284DeviceID" "" "MFG:Apollo;MDL:apollo 2650;DES:apollo 2650;"
+ PCFileName "apollo-2650-hpijs.ppd"
+ Attribute "Product" "" "(Apollo 2650 Printer)"
+ }
+ }
+} // end Apollo
+} // end Manufacturer "Apollo"
+
+{
+ // Manufacturer - PPD spec has "HP" registered for "Hewlett-Packard"...
+ Manufacturer "HP"
+
+///////// DJ9xx
+{
+ // Set an up-stream hint for applications that we suppport 300/600/1200dpi.
+ Attribute "DefaultResolution" "" "1200dpi"
+
+ // Custom page sizes from 1x4in to SuperB
+ HWMargins 18 36 18 9
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 936 1368
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-PSC_750 hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-PSC_750" " -sDeviceManufacturer=&qu&&
+ot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;DESKJET 930&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=300DraftColorCM&&
+YK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft.Gray" "Quality=300DraftGr&&
+ayscaleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=300ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal.Gray" "Quality=300Graysc&&
+aleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High" "Quality=600BestColorCMYK&&
+"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High.Gray" "Quality=600Grayscal&&
+eK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Photo" "Quality=1200PhotoCMYK"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=PhotoTearOff" " -dDEVICEWIDTHPOINTS&&
+=288 -dDEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6TearOff" " -dDEVICEWIDTHPOINTS=29&&
+7 -dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD120" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ ////////// Large format paper support
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B4JIS" " -dDEVICEWIDTHPOINTS=729 -d&&
+DEVICEHEIGHTPOINTS=1033"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Ledger" " -dDEVICEWIDTHPOINTS=792 -&&
+dDEVICEHEIGHTPOINTS=1224"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=SuperB" " -dDEVICEWIDTHPOINTS=936 -&&
+dDEVICEHEIGHTPOINTS=1368"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w774h1116" " -dDEVICEWIDTHPOINTS=77&&
+4 -dDEVICEHEIGHTPOINTS=1116"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A3" " -dDEVICEWIDTHPOINTS=842 -dDEV&&
+ICEHEIGHTPOINTS=1190"
+ Attribute "FoomaticRIPOption" "Duplex" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexNoTumble" " -dDuplex=true -dTum&&
+ble=false"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexTumble" " -dDuplex=true -dTumbl&&
+e=true"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=None" " -dDuplex=false"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300BestColorCMYK" " -r300 -sIjsParam&&
+s=Quality:Quality=2,Quality:ColorMode=2,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYK" " -r300 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftColorCMYK" " -r300 -sIjsPara&&
+ms=Quality:Quality=1,Quality:ColorMode=2,Quality:MediaType=0,Quality:P&&
+enSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftGrayscaleK" " -r300 -sIjsPar&&
+ams=Quality:Quality=1,Quality:ColorMode=0,Quality:MediaType=0,Quality:&&
+PenSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300GrayscaleK" " -r300 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300PhotoCMYK" " -r300 -sIjsParams=Qu&&
+ality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600BestColorCMYK" " -r600 -sIjsParam&&
+s=Quality:Quality=2,Quality:ColorMode=2,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600GrayscaleK" " -r600 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600PhotoCMYK" " -r600 -sIjsParams=Qu&&
+ality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=1200PhotoCMYK" " -r1200 -sIjsParams=&&
+Quality:Quality=3,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenS&&
+et=2"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ Choice "Draft.Gray/Draft Grayscale" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft.Gray"
+ *Choice "Normal/Normal" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "Normal.Gray/Normal Grayscale" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal.Gray"
+ Choice "High/High Quality" "%% FoomaticRIPOptionSetting: PrintoutMode=High"
+ Choice "High.Gray/High Quality Grayscale" "%% FoomaticRIPOptionSetting: PrintoutMode=High.Gray"
+ Choice "Photo/Photo (on photo paper)" "%% FoomaticRIPOptionSetting: PrintoutMode=Photo"
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 120.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "%% FoomaticRIPOptionSetting: Duplex=DuplexNoTumble"
+ Choice "DuplexTumble/Short Edge (Flip)" "%% FoomaticRIPOptionSetting: Duplex=DuplexTumble"
+ *Choice "None/Off" "%% FoomaticRIPOptionSetting: Duplex=None"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "300BestColorCMYK/300 dpi, Best, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300BestColorCMYK"
+ Choice "300ColorCMYK/300 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYK"
+ Choice "300DraftColorCMYK/300 dpi, Draft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftColorCMYK"
+ Choice "300DraftGrayscaleK/300 dpi, Draft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftGrayscaleK"
+ Choice "300GrayscaleK/300 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300GrayscaleK"
+ Choice "300PhotoCMYK/300 dpi, Photo, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=300PhotoCMYK"
+ Choice "600BestColorCMYK/600 dpi, Best, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600BestColorCMYK"
+ Choice "600GrayscaleK/600 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=600GrayscaleK"
+ Choice "600PhotoCMYK/600 dpi, Photo, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=600PhotoCMYK"
+ Choice "1200PhotoCMYK/1200 dpi, Photo, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=1200PhotoCMYK"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 9.72 36.00 9.72 9.00 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo or 5x7 inch index card" 360.00 504.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "PhotoTearOff/Photo with tear-off tab" 288.00 432.00 9.00 9.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff" "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "A6TearOff/A6 with tear-off tab" 297.00 420.00 9.00 0.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A6TearOff" "%% FoomaticRIPOptionSetting: PageSize=A6TearOff"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "CDDVD120/CD or DVD 120 mm" 360.00 360.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD120" "%% FoomaticRIPOptionSetting: PageSize=CDDVD120"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+
+ // <%DJ9xx:Normal%>
+ {
+ ModelName "HP Officejet v30 hpijs"
+ Attribute "NickName" "" "HP Officejet v30 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet v30 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet v30;DES:officejet v30;"
+ PCFileName "hp-officejet_v30-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet v30 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet v40xi hpijs"
+ Attribute "NickName" "" "HP Officejet v40xi hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet v40xi hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet v40xi;DES:officejet v40xi;"
+ PCFileName "hp-officejet_v40xi-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet v40xi All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet v40 hpijs"
+ Attribute "NickName" "" "HP Officejet v40 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet v40 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet v40;DES:officejet v40;"
+ PCFileName "hp-officejet_v40-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet v40 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet v40s All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet v45 hpijs"
+ Attribute "NickName" "" "HP Officejet v45 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet v45 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet v45;DES:officejet v45;"
+ PCFileName "hp-officejet_v45-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet v45 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet g55 hpijs"
+ Attribute "NickName" "" "HP Officejet g55 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet g55 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet g55;DES:officejet g55;"
+ PCFileName "hp-officejet_g55-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet g55 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet g55xi hpijs"
+ Attribute "NickName" "" "HP Officejet g55xi hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet g55xi hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet g55xi;DES:officejet g55xi;"
+ PCFileName "hp-officejet_g55xi-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet g55xi All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet k60xi hpijs"
+ Attribute "NickName" "" "HP Officejet k60xi hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet k60xi hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet k60xi;DES:officejet k60xi;"
+ PCFileName "hp-officejet_k60xi-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet k60xi All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet k60 hpijs"
+ Attribute "NickName" "" "HP Officejet k60 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet k60 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet k60;DES:officejet k60;"
+ PCFileName "hp-officejet_k60-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet k60 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet k80xi hpijs"
+ Attribute "NickName" "" "HP Officejet k80xi hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet k80xi hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet k80xi;DES:officejet k80xi;"
+ PCFileName "hp-officejet_k80xi-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet k80xi All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet k80 hpijs"
+ Attribute "NickName" "" "HP Officejet k80 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet k80 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet k80;DES:officejet k80;"
+ PCFileName "hp-officejet_k80-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet k80 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet g85 hpijs"
+ Attribute "NickName" "" "HP Officejet g85 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet g85 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet g85;DES:officejet g85;"
+ PCFileName "hp-officejet_g85-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet g85 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet g85xi hpijs"
+ Attribute "NickName" "" "HP Officejet g85xi hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet g85xi hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet g85xi;DES:officejet g85xi;"
+ PCFileName "hp-officejet_g85xi-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet g85xi All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet g95 hpijs"
+ Attribute "NickName" "" "HP Officejet g95 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet g95 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet g95;DES:officejet g95;"
+ PCFileName "hp-officejet_g95-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet g95 All-in-one Printer)"
+ }
+ {
+ ModelName "HP PSC 720 hpijs"
+ Attribute "NickName" "" "HP PSC 720 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP PSC 720 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:psc 720;DES:psc 720;"
+ PCFileName "hp-psc_720-hpijs.ppd"
+ Attribute "Product" "" "(HP PSC 720 All-in-one Printer)"
+ }
+ {
+ ModelName "HP PSC 750xi hpijs"
+ Attribute "NickName" "" "HP PSC 750xi hpijs, $Version"
+ Attribute "ShortNickName" "" "HP PSC 750xi hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:psc 750xi;DES:psc 750xi;"
+ PCFileName "hp-psc_750xi-hpijs.ppd"
+ Attribute "Product" "" "(HP PSC 750xi All-in-one Printer)"
+ }
+ {
+ ModelName "HP PSC 750 hpijs"
+ Attribute "NickName" "" "HP PSC 750 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP PSC 750 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:psc 750;DES:psc 750;"
+ PCFileName "hp-psc_750-hpijs.ppd"
+ Attribute "Product" "" "(HP PSC 750 All-in-one Printer)"
+ }
+ {
+ ModelName "HP PSC 760 hpijs"
+ Attribute "NickName" "" "HP PSC 760 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP PSC 760 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:psc 760;DES:psc 760;"
+ PCFileName "hp-psc_760-hpijs.ppd"
+ Attribute "Product" "" "(HP PSC 760 All-in-one Printer)"
+ }
+ {
+ ModelName "HP PSC 780 hpijs"
+ Attribute "NickName" "" "HP PSC 780 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP PSC 780 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:psc 780;DES:psc 780;"
+ PCFileName "hp-psc_780-hpijs.ppd"
+ Attribute "Product" "" "(HP PSC 780 All-in-one Printer)"
+ }
+ {
+ ModelName "HP PSC 780xi hpijs"
+ Attribute "NickName" "" "HP PSC 780xi hpijs, $Version"
+ Attribute "ShortNickName" "" "HP PSC 780xi hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:psc 780xi;DES:psc 780xi;"
+ PCFileName "hp-psc_780xi-hpijs.ppd"
+ Attribute "Product" "" "(HP PSC 780xi All-in-one Printer)"
+ }
+ {
+ ModelName "HP PSC 900 Series hpijs"
+ Attribute "NickName" "" "HP PSC 900 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP PSC 900 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:psc 900 series;DES:psc 900 series;"
+ PCFileName "hp-psc_900_series-hpijs.ppd"
+ Attribute "Product" "" "(HP PSC 900 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Deskjet 916c hpijs"
+ Attribute "NickName" "" "HP Deskjet 916c hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 916c hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 916c;DES:deskjet 916c;"
+ PCFileName "hp-deskjet_916c-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 916c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 920c hpijs"
+ Attribute "NickName" "" "HP Deskjet 920c hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 920c hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 920c;DES:deskjet 920c;"
+ PCFileName "hp-deskjet_920c-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 920c Printer)"
+ Attribute "Product" "" "(HP Deskjet 920cvr Printer)"
+ Attribute "Product" "" "(HP Deskjet 920cw Printer)"
+ Attribute "Product" "" "(HP Deskjet 920cxi Printer)"
+ }
+ {
+ ModelName "HP PSC 920 hpijs"
+ Attribute "NickName" "" "HP PSC 920 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP PSC 920 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:psc 920;DES:psc 920;"
+ PCFileName "hp-psc_920-hpijs.ppd"
+ Attribute "Product" "" "(HP PSC 920 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Deskjet 930c hpijs"
+ Attribute "NickName" "" "HP Deskjet 930c hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 930c hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 930c;DES:deskjet 930c;"
+ PCFileName "hp-deskjet_930c-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 930c Printer)"
+ Attribute "Product" "" "(HP Deskjet 930cm Printer)"
+ }
+ {
+ ModelName "HP Deskjet 932c hpijs"
+ Attribute "NickName" "" "HP Deskjet 932c hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 932c hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 932c;DES:deskjet 932c;"
+ PCFileName "hp-deskjet_932c-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 932c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 933c hpijs"
+ Attribute "NickName" "" "HP Deskjet 933c hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 933c hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 933c;DES:deskjet 933c;"
+ PCFileName "hp-deskjet_933c-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 933c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 934c hpijs"
+ Attribute "NickName" "" "HP Deskjet 934c hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 934c hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 934c;DES:deskjet 934c;"
+ PCFileName "hp-deskjet_934c-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 934c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 935c hpijs"
+ Attribute "NickName" "" "HP Deskjet 935c hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 935c hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 935c;DES:deskjet 935c;"
+ PCFileName "hp-deskjet_935c-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 935c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 940c hpijs"
+ Attribute "NickName" "" "HP Deskjet 940c hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 940c hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 940c;DES:deskjet 940c;"
+ PCFileName "hp-deskjet_940c-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 940cvr Printer)"
+ Attribute "Product" "" "(HP Deskjet 940c Printer)"
+ Attribute "Product" "" "(HP Deskjet 940cw Printer)"
+ Attribute "Product" "" "(HP Deskjet 940cxi Printer)"
+ }
+ {
+ ModelName "HP Deskjet 948c hpijs"
+ Attribute "NickName" "" "HP Deskjet 948c hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 948c hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 948c;DES:deskjet 948c;"
+ PCFileName "hp-deskjet_948c-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 948c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 950c hpijs"
+ Attribute "NickName" "" "HP Deskjet 950c hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 950c hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 950c;DES:deskjet 950c;"
+ PCFileName "hp-deskjet_950c-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 950c Printer)"
+ }
+ {
+ ModelName "HP PSC 950xi hpijs"
+ Attribute "NickName" "" "HP PSC 950xi hpijs, $Version"
+ Attribute "ShortNickName" "" "HP PSC 950xi hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:psc 950xi;DES:psc 950xi;"
+ PCFileName "hp-psc_950xi-hpijs.ppd"
+ Attribute "Product" "" "(HP PSC 950xi All-in-one Printer)"
+ }
+ {
+ ModelName "HP PSC 950vr hpijs"
+ Attribute "NickName" "" "HP PSC 950vr hpijs, $Version"
+ Attribute "ShortNickName" "" "HP PSC 950vr hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:psc 950vr;DES:psc 950vr;"
+ PCFileName "hp-psc_950vr-hpijs.ppd"
+ Attribute "Product" "" "(HP PSC 950vr All-in-one Printer)"
+ }
+ {
+ ModelName "HP PSC 950 hpijs"
+ Attribute "NickName" "" "HP PSC 950 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP PSC 950 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:psc 950;DES:psc 950;"
+ PCFileName "hp-psc_950-hpijs.ppd"
+ Attribute "Product" "" "(HP PSC 950 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Deskjet 952c hpijs"
+ Attribute "NickName" "" "HP Deskjet 952c hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 952c hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 952c;DES:deskjet 952c;"
+ PCFileName "hp-deskjet_952c-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 952c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 955c hpijs"
+ Attribute "NickName" "" "HP Deskjet 955c hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 955c hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 955c;DES:deskjet 955c;"
+ PCFileName "hp-deskjet_955c-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 955c Printer)"
+ Attribute "Product" "" "(HP Deskjet 995ck Color Inkjet Printer)"
+ }
+ {
+ ModelName "HP Deskjet 957c hpijs"
+ Attribute "NickName" "" "HP Deskjet 957c hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 957c hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 957c;DES:deskjet 957c;"
+ PCFileName "hp-deskjet_957c-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 957c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 959c hpijs"
+ Attribute "NickName" "" "HP Deskjet 959c hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 959c hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 959c;DES:deskjet 959c;"
+ PCFileName "hp-deskjet_959c-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 959c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 970c hpijs"
+ Attribute "NickName" "" "HP Deskjet 970c hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 970c hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 970c;DES:deskjet 970c;"
+ PCFileName "hp-deskjet_970c-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 970cxi Printer)"
+ Attribute "Product" "" "(HP Deskjet 970cse Printer)"
+ Attribute "Product" "" "(HP Deskjet 970c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 975c hpijs"
+ Attribute "NickName" "" "HP Deskjet 975c hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 975c hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 975c;DES:deskjet 975c;"
+ PCFileName "hp-deskjet_975c-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 975c Printer)"
+ Attribute "Product" "" "(HP Deskjet 975cse Printer)"
+ Attribute "Product" "" "(HP Deskjet 975cxi Printer)"
+ }
+ {
+ ModelName "HP Photosmart p1000 hpijs"
+ Attribute "NickName" "" "HP Photosmart p1000 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart p1000 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart p1000;DES:photosmart p1000;"
+ PCFileName "hp-photosmart_p1000-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart p1000/1000 Printer)"
+ Attribute "Product" "" "(HP Photosmart p1000xi Printer)"
+ }
+ {
+ ModelName "HP Photosmart p1100 hpijs"
+ Attribute "NickName" "" "HP Photosmart p1100 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart p1100 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart p1100;DES:photosmart p1100;"
+ PCFileName "hp-photosmart_p1100-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart p1100 Printer)"
+ Attribute "Product" "" "(HP Photosmart p1100xi Printer)"
+ }
+ {
+ ModelName "HP Deskjet 3810 hpijs"
+ Attribute "NickName" "" "HP Deskjet 3810 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 3810 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 3810;DES:deskjet 3810;"
+ PCFileName "hp-deskjet_3810-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 3810 Color Inkjet Printer)"
+ }
+ {
+ ModelName "HP Deskjet 3816 hpijs"
+ Attribute "NickName" "" "HP Deskjet 3816 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 3816 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 3816;DES:deskjet 3816;"
+ PCFileName "hp-deskjet_3816-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 3816 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3818 Color Inkjet Printer)"
+ }
+ {
+ ModelName "HP Deskjet 3819 hpijs"
+ Attribute "NickName" "" "HP Deskjet 3819 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 3819 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 3819;DES:deskjet 3819;"
+ PCFileName "hp-deskjet_3819-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 3819 Color Inkjet Printer)"
+ }
+ {
+ ModelName "HP Deskjet 3820 hpijs"
+ Attribute "NickName" "" "HP Deskjet 3820 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 3820 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 3820;DES:deskjet 3820;"
+ PCFileName "hp-deskjet_3820-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 3820 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3820v Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3820w Color Inkjet Printer)"
+ }
+ {
+ ModelName "HP Deskjet 3822 hpijs"
+ Attribute "NickName" "" "HP Deskjet 3822 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 3822 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 3822;DES:deskjet 3822;"
+ PCFileName "hp-deskjet_3822-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 3822 Color Inkjet Printer)"
+ }
+ {
+ ModelName "HP Deskjet 3870 hpijs"
+ Attribute "NickName" "" "HP Deskjet 3870 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 3870 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 3870;DES:deskjet 3870;"
+ PCFileName "hp-deskjet_3870-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 3870 Color Inkjet Printer)"
+ }
+ {
+ ModelName "HP Officejet 5100 Series hpijs"
+ Attribute "NickName" "" "HP Officejet 5100 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet 5100 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet 5100 series;DES:officejet 5100 series;"
+ PCFileName "hp-officejet_5100_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet 5100 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 5105 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 5110v All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 5110xi All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 5110 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet 5105 hpijs"
+ Attribute "NickName" "" "HP Officejet 5105 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet 5105 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet 5105;DES:officejet 5105;"
+ PCFileName "hp-officejet_5105-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet 5105 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet 5110v hpijs"
+ Attribute "NickName" "" "HP Officejet 5110v hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet 5110v hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet 5110v;DES:officejet 5110v;"
+ PCFileName "hp-officejet_5110v-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet 5110v All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet 5110 hpijs"
+ Attribute "NickName" "" "HP Officejet 5110 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet 5110 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet 5110;DES:officejet 5110;"
+ PCFileName "hp-officejet_5110-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet 5110 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 5110xi All-in-one Printer)"
+ }
+ {
+ // Large format SuperB paper support
+ CustomMedia "B4JIS/B4 (JIS)" 729.00 1033.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B4JIS" "%% FoomaticRIPOptionSetting: PageSize=B4JIS"
+ CustomMedia "Ledger/Ledger" 792.00 1224.00 14.40 36.00 14.40 9.00 "%% FoomaticRIPOptionSetting: PageSize=Ledger" "%% FoomaticRIPOptionSetting: PageSize=Ledger"
+ CustomMedia "SuperB/Super B" 936.00 1368.00 14.40 36.00 14.40 9.00 "%% FoomaticRIPOptionSetting: PageSize=SuperB" "%% FoomaticRIPOptionSetting: PageSize=SuperB"
+ CustomMedia "w774h1116/8K" 774.00 1116.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w774h1116" "%% FoomaticRIPOptionSetting: PageSize=w774h1116"
+ CustomMedia "A3/A3" 842.00 1190.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A3" "%% FoomaticRIPOptionSetting: PageSize=A3"
+ // <%DJ9xx:LargeFormatSuperB%>
+ {
+ ModelName "HP Deskjet 1220c hpijs"
+ Attribute "NickName" "" "HP Deskjet 1220c hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 1220c hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 1220c;DES:deskjet 1220c;"
+ PCFileName "hp-deskjet_1220c-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 1220c Printer)"
+ Attribute "Product" "" "(HP Deskjet 1220cse Printer)"
+ Attribute "Product" "" "(HP Deskjet 1220cxi Printer)"
+ Attribute "Product" "" "(HP Deskjet 1220c/ps Printer)"
+ }
+ {
+ ModelName "HP Deskjet 1280 hpijs"
+ Attribute "NickName" "" "HP Deskjet 1280 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 1280 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 1280;DES:deskjet 1280;"
+ PCFileName "hp-deskjet_1280-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 1280 Printer)"
+ }
+ {
+ ModelName "HP Deskjet 9300 hpijs"
+ Attribute "NickName" "" "HP Deskjet 9300 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 9300 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp deskjet 9300;DES:hp deskjet 9300;"
+ PCFileName "hp-deskjet_9300-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 9300 Printer)"
+ }
+ }
+} // end DJ9xx
+
+/////////// DJ9xx but without photo modes
+{
+ // Set an up-stream hint for applications that we suppport 300/600/1200dpi.
+ Attribute "DefaultResolution" "" "600dpi"
+
+ // Custom page sizes from 1x4in to SuperB
+ HWMargins 18 36 18 9
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 936 1368
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-PSC_750 hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-PSC_750" " -sDeviceManufacturer=&qu&&
+ot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;DESKJET 930&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=300DraftColorCM&&
+YK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft.Gray" "Quality=300DraftGr&&
+ayscaleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=300ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal.Gray" "Quality=300Graysc&&
+aleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High" "Quality=600BestColorCMYK&&
+"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High.Gray" "Quality=600Grayscal&&
+eK"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=PhotoTearOff" " -dDEVICEWIDTHPOINTS&&
+=288 -dDEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6TearOff" " -dDEVICEWIDTHPOINTS=29&&
+7 -dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD120" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ ///////// Large format paper support
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B4JIS" " -dDEVICEWIDTHPOINTS=729 -d&&
+DEVICEHEIGHTPOINTS=1033"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Ledger" " -dDEVICEWIDTHPOINTS=792 -&&
+dDEVICEHEIGHTPOINTS=1224"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=SuperB" " -dDEVICEWIDTHPOINTS=936 -&&
+dDEVICEHEIGHTPOINTS=1368"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w774h1116" " -dDEVICEWIDTHPOINTS=77&&
+4 -dDEVICEHEIGHTPOINTS=1116"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A3" " -dDEVICEWIDTHPOINTS=842 -dDEV&&
+ICEHEIGHTPOINTS=1190"
+ Attribute "FoomaticRIPOption" "Duplex" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexNoTumble" " -dDuplex=true -dTum&&
+ble=false"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexTumble" " -dDuplex=true -dTumbl&&
+e=true"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=None" " -dDuplex=false"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300BestColorCMYK" " -r300 -sIjsParam&&
+s=Quality:Quality=2,Quality:ColorMode=2,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYK" " -r300 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftColorCMYK" " -r300 -sIjsPara&&
+ms=Quality:Quality=1,Quality:ColorMode=2,Quality:MediaType=0,Quality:P&&
+enSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftGrayscaleK" " -r300 -sIjsPar&&
+ams=Quality:Quality=1,Quality:ColorMode=0,Quality:MediaType=0,Quality:&&
+PenSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300GrayscaleK" " -r300 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300PhotoCMYK" " -r300 -sIjsParams=Qu&&
+ality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600BestColorCMYK" " -r600 -sIjsParam&&
+s=Quality:Quality=2,Quality:ColorMode=2,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600GrayscaleK" " -r600 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600PhotoCMYK" " -r600 -sIjsParams=Qu&&
+ality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=1200PhotoCMYK" " -r1200 -sIjsParams=&&
+Quality:Quality=3,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenS&&
+et=2"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ Choice "Draft.Gray/Draft Grayscale" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft.Gray"
+ *Choice "Normal/Normal" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "Normal.Gray/Normal Grayscale" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal.Gray"
+ Choice "High/High Quality" "%% FoomaticRIPOptionSetting: PrintoutMode=High"
+ Choice "High.Gray/High Quality Grayscale" "%% FoomaticRIPOptionSetting: PrintoutMode=High.Gray"
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 120.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "%% FoomaticRIPOptionSetting: Duplex=DuplexNoTumble"
+ Choice "DuplexTumble/Short Edge (Flip)" "%% FoomaticRIPOptionSetting: Duplex=DuplexTumble"
+ *Choice "None/Off" "%% FoomaticRIPOptionSetting: Duplex=None"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "300BestColorCMYK/300 dpi, Best, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300BestColorCMYK"
+ Choice "300ColorCMYK/300 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYK"
+ Choice "300DraftColorCMYK/300 dpi, Draft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftColorCMYK"
+ Choice "300DraftGrayscaleK/300 dpi, Draft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftGrayscaleK"
+ Choice "300GrayscaleK/300 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300GrayscaleK"
+ Choice "600BestColorCMYK/600 dpi, Best, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600BestColorCMYK"
+ Choice "600GrayscaleK/600 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=600GrayscaleK"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 9.72 36.00 9.72 9.00 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo or 5x7 inch index card" 360.00 504.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "PhotoTearOff/Photo with tear-off tab" 288.00 432.00 9.00 9.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff" "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "A6TearOff/A6 with tear-off tab" 297.00 420.00 9.00 0.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A6TearOff" "%% FoomaticRIPOptionSetting: PageSize=A6TearOff"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "CDDVD120/CD or DVD 120 mm" 360.00 360.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD120" "%% FoomaticRIPOptionSetting: PageSize=CDDVD120"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+ // <%DJ9xx:NoPhotoMode%>
+ {
+ ModelName "HP 2000c hpijs"
+ Attribute "NickName" "" "HP 2000c hpijs, $Version"
+ Attribute "ShortNickName" "" "HP 2000c hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp 2000c;DES:hp 2000c;"
+ PCFileName "hp-2000c-hpijs.ppd"
+ Attribute "Product" "" "(HP 2000cse Printer)"
+ Attribute "Product" "" "(HP 2000c Printer)"
+ Attribute "Product" "" "(HP 2000cn Printer)"
+ Attribute "Product" "" "(HP 2000cxi Printer)"
+ }
+ {
+ // Large format SuperB paper support
+ CustomMedia "B4JIS/B4 (JIS)" 729.00 1033.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B4JIS" "%% FoomaticRIPOptionSetting: PageSize=B4JIS"
+ CustomMedia "Ledger/Ledger" 792.00 1224.00 14.40 36.00 14.40 9.00 "%% FoomaticRIPOptionSetting: PageSize=Ledger" "%% FoomaticRIPOptionSetting: PageSize=Ledger"
+ CustomMedia "SuperB/Super B" 936.00 1368.00 14.40 36.00 14.40 9.00 "%% FoomaticRIPOptionSetting: PageSize=SuperB" "%% FoomaticRIPOptionSetting: PageSize=SuperB"
+ CustomMedia "w774h1116/8K" 774.00 1116.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w774h1116" "%% FoomaticRIPOptionSetting: PageSize=w774h1116"
+ CustomMedia "A3/A3" 842.00 1190.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A3" "%% FoomaticRIPOptionSetting: PageSize=A3"
+ // <%DJ9xx:NoPhotoMode:LargeFormatSuperB%>
+ {
+ ModelName "HP 2500c hpijs"
+ Attribute "NickName" "" "HP 2500c hpijs, $Version"
+ Attribute "ShortNickName" "" "HP 2500c hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp 2500c;DES:hp 2500c;"
+ PCFileName "hp-2500c-hpijs.ppd"
+ Attribute "Product" "" "(HP 2500c Plus Printer)"
+ Attribute "Product" "" "(HP 2500c Printer)"
+ Attribute "Product" "" "(HP 2500cm Printer)"
+ Attribute "Product" "" "(HP 2500cse Printer)"
+ Attribute "Product" "" "(HP 2500cxi Printer)"
+ }
+ }
+} // end DJ9xx but without photo modes
+
+///////// DJ9xx but without photo/hires/best color modes
+{
+ // Set an up-stream hint for applications that we suppport 300/600/1200dpi.
+ Attribute "DefaultResolution" "" "600dpi"
+
+ // Custom page sizes from 1x4in to SuperB
+ HWMargins 18 36 18 9
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 936 1368
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-PSC_750 hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-PSC_750" " -sDeviceManufacturer=&qu&&
+ot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;DESKJET 930&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=300DraftColorCM&&
+YK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft.Gray" "Quality=300DraftGr&&
+ayscaleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=300ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal.Gray" "Quality=300Graysc&&
+aleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High" "Quality=600BestColorCMYK&&
+"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High.Gray" "Quality=600Grayscal&&
+eK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Photo" "Quality=600PhotoCMYK"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=PhotoTearOff" " -dDEVICEWIDTHPOINTS&&
+=288 -dDEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6TearOff" " -dDEVICEWIDTHPOINTS=29&&
+7 -dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD120" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ /////////// Large format paper support
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B4JIS" " -dDEVICEWIDTHPOINTS=729 -d&&
+DEVICEHEIGHTPOINTS=1033"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Ledger" " -dDEVICEWIDTHPOINTS=792 -&&
+dDEVICEHEIGHTPOINTS=1224"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=SuperB" " -dDEVICEWIDTHPOINTS=936 -&&
+dDEVICEHEIGHTPOINTS=1368"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w774h1116" " -dDEVICEWIDTHPOINTS=77&&
+4 -dDEVICEHEIGHTPOINTS=1116"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A3" " -dDEVICEWIDTHPOINTS=842 -dDEV&&
+ICEHEIGHTPOINTS=1190"
+ Attribute "FoomaticRIPOption" "Duplex" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexNoTumble" " -dDuplex=true -dTum&&
+ble=false"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexTumble" " -dDuplex=true -dTumbl&&
+e=true"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=None" " -dDuplex=false"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300BestColorCMYK" " -r300 -sIjsParam&&
+s=Quality:Quality=2,Quality:ColorMode=2,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYK" " -r300 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftColorCMYK" " -r300 -sIjsPara&&
+ms=Quality:Quality=1,Quality:ColorMode=2,Quality:MediaType=0,Quality:P&&
+enSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftGrayscaleK" " -r300 -sIjsPar&&
+ams=Quality:Quality=1,Quality:ColorMode=0,Quality:MediaType=0,Quality:&&
+PenSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300GrayscaleK" " -r300 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300PhotoCMYK" " -r300 -sIjsParams=Qu&&
+ality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600BestColorCMYK" " -r600 -sIjsParam&&
+s=Quality:Quality=2,Quality:ColorMode=2,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600GrayscaleK" " -r600 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600PhotoCMYK" " -r600 -sIjsParams=Qu&&
+ality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenSet&&
+=2"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ Choice "Draft.Gray/Draft Grayscale" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft.Gray"
+ *Choice "Normal/Normal" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "Normal.Gray/Normal Grayscale" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal.Gray"
+ Choice "High/High Quality" "%% FoomaticRIPOptionSetting: PrintoutMode=High"
+ Choice "High.Gray/High Quality Grayscale" "%% FoomaticRIPOptionSetting: PrintoutMode=High.Gray"
+ Choice "Photo/Photo (on photo paper)" "%% FoomaticRIPOptionSetting: PrintoutMode=Photo"
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 120.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "%% FoomaticRIPOptionSetting: Duplex=DuplexNoTumble"
+ Choice "DuplexTumble/Short Edge (Flip)" "%% FoomaticRIPOptionSetting: Duplex=DuplexTumble"
+ *Choice "None/Off" "%% FoomaticRIPOptionSetting: Duplex=None"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "300BestColorCMYK/300 dpi, Best, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300BestColorCMYK"
+ Choice "300ColorCMYK/300 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYK"
+ Choice "300DraftColorCMYK/300 dpi, Draft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftColorCMYK"
+ Choice "300DraftGrayscaleK/300 dpi, Draft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftGrayscaleK"
+ Choice "300GrayscaleK/300 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300GrayscaleK"
+ Choice "300PhotoCMYK/300 dpi, Photo, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=300PhotoCMYK"
+ Choice "600BestColorCMYK/600 dpi, Best, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600BestColorCMYK"
+ Choice "600GrayscaleK/600 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=600GrayscaleK"
+ Choice "600PhotoCMYK/600 dpi, Photo, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=600PhotoCMYK"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 9.72 36.00 9.72 9.00 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo or 5x7 inch index card" 360.00 504.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "PhotoTearOff/Photo with tear-off tab" 288.00 432.00 9.00 9.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff" "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "A6TearOff/A6 with tear-off tab" 297.00 420.00 9.00 0.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A6TearOff" "%% FoomaticRIPOptionSetting: PageSize=A6TearOff"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "CDDVD120/CD or DVD 120 mm" 360.00 360.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD120" "%% FoomaticRIPOptionSetting: PageSize=CDDVD120"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+
+ // Large format SuperB paper support
+ CustomMedia "B4JIS/B4 (JIS)" 729.00 1033.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B4JIS" "%% FoomaticRIPOptionSetting: PageSize=B4JIS"
+ CustomMedia "Ledger/Ledger" 792.00 1224.00 14.40 36.00 14.40 9.00 "%% FoomaticRIPOptionSetting: PageSize=Ledger" "%% FoomaticRIPOptionSetting: PageSize=Ledger"
+ CustomMedia "SuperB/Super B" 936.00 1368.00 14.40 36.00 14.40 9.00 "%% FoomaticRIPOptionSetting: PageSize=SuperB" "%% FoomaticRIPOptionSetting: PageSize=SuperB"
+ CustomMedia "w774h1116/8K" 774.00 1116.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w774h1116" "%% FoomaticRIPOptionSetting: PageSize=w774h1116"
+ CustomMedia "A3/A3" 842.00 1190.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A3" "%% FoomaticRIPOptionSetting: PageSize=A3"
+ // <%DJ9xx:LargeFormatSuperB:NoPhotoBestHiresModes%>
+ {
+ ModelName "HP Deskjet 1120 hpijs"
+ Attribute "NickName" "" "HP Deskjet 1120 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 1120 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 1120;DES:deskjet 1120;"
+ PCFileName "hp-deskjet_1120-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 1120cxi Printer)"
+ Attribute "Product" "" "(HP Deskjet 1120cse Printer)"
+ Attribute "Product" "" "(HP Deskjet 1120c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 1125 hpijs"
+ Attribute "NickName" "" "HP Deskjet 1125 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 1125 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 1125;DES:deskjet 1125;"
+ PCFileName "hp-deskjet_1125-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 1125c Printer)"
+ }
+} // DJ9xx but without photo/hires/best color modes
+
+//////// DJ9xxVIP
+{
+ Attribute "DefaultResolution" "" "1200dpi"
+
+ // Custom page sizes from 1x4in to SuperB
+ HWMargins 18 36 18 9
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 936 1368
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-DeskJet_990C hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-DeskJet_990C" " -sDeviceManufacture&&
+r=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;DESKJET 990&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=300DraftColorCM&&
+YK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft.Gray" "Quality=300DraftGr&&
+ayscaleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=300ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal.Gray" "Quality=300Graysc&&
+aleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High" "Quality=600ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High.Gray" "Quality=600Grayscal&&
+eK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Photo" "Quality=1200PhotoCMYK"
+ Attribute "FoomaticRIPOption" "InputSlot" "enum CmdLine C"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Default" ",PS:MediaPosition=7"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=PhotoTray" ",PS:MediaPosition=6"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Upper" ",PS:MediaPosition=1"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Lower" ",PS:MediaPosition=4"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=CDDVDTray" ",PS:MediaPosition=14"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Envelope" ",PS:MediaPosition=3"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=LargeCapacity" ",PS:MediaPosition=&&
+5"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Manual" ",PS:MediaPosition=2"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=MPTray" ",PS:MediaPosition=8"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=PhotoTearOff" " -dDEVICEWIDTHPOINTS&&
+=288 -dDEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6TearOff" " -dDEVICEWIDTHPOINTS=29&&
+7 -dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD120" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ /////////// Large format paper support
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B4JIS" " -dDEVICEWIDTHPOINTS=729 -d&&
+DEVICEHEIGHTPOINTS=1033"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Ledger" " -dDEVICEWIDTHPOINTS=792 -&&
+dDEVICEHEIGHTPOINTS=1224"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=SuperB" " -dDEVICEWIDTHPOINTS=936 -&&
+dDEVICEHEIGHTPOINTS=1368"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w774h1116" " -dDEVICEWIDTHPOINTS=77&&
+4 -dDEVICEHEIGHTPOINTS=1116"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A3" " -dDEVICEWIDTHPOINTS=842 -dDEV&&
+ICEHEIGHTPOINTS=1190"
+ Attribute "FoomaticRIPOption" "Duplex" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexNoTumble" " -dDuplex=true -dTum&&
+ble=false"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexTumble" " -dDuplex=true -dTumbl&&
+e=true"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=None" " -dDuplex=false"
+ Attribute "FoomaticRIPOption" "DryTime" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Zero" ""
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Five" ",DryTime=5"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Ten" ",DryTime=10"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Fifteen" ",DryTime=15"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Twenty" ",DryTime=20"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=TwentyFive" ",DryTime=25"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Thirty" ",DryTime=30"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYK" " -r300 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftColorCMYK" " -r300 -sIjsPara&&
+ms=Quality:Quality=1,Quality:ColorMode=2,Quality:MediaType=0,Quality:P&&
+enSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftGrayscaleK" " -r300 -sIjs&&
+Params=Quality:Quality=1,Quality:ColorMode=0,Quality:MediaType=0,Quali&&
+ty:PenSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300GrayscaleK" " -r300 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMYK" " -r600 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600GrayscaleK" " -r600 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600PhotoCMYK" " -r600 -sIjsParams=Qu&&
+ality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=1200PhotoCMYK" " -r1200 -sIjsParams=&&
+Quality:Quality=3,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenS&&
+et=2"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ Choice "Draft.Gray/Draft Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft.Gray"
+ *Choice "Normal/Normal (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "Normal.Gray/Normal Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal.Gray"
+ Choice "High/High Quality (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=High"
+ Choice "High.Gray/High Quality Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=High.Gray"
+ Choice "Photo/Photo (on photo paper)" "%% FoomaticRIPOptionSetting: PrintoutMode=Photo"
+ Option "InputSlot/Media Source" PickOne AnySetup 100.0
+ *Choice "Default/Printer default" "%% FoomaticRIPOptionSetting: InputSlot=Default"
+ Choice "PhotoTray/Photo Tray" "%% FoomaticRIPOptionSetting: InputSlot=PhotoTray"
+ Choice "Upper/Upper Tray" "%% FoomaticRIPOptionSetting: InputSlot=Upper"
+ Choice "Lower/Lower Tray" "%% FoomaticRIPOptionSetting: InputSlot=Lower"
+ Choice "CDDVDTray/CD or DVD Tray" "%% FoomaticRIPOptionSetting: InputSlot=CDDVDTray"
+ Choice "Envelope/Envelope Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Envelope"
+ Choice "LargeCapacity/Large Capacity Tray" "%% FoomaticRIPOptionSetting: InputSlot=LargeCapacity"
+ Choice "Manual/Manual Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Manual"
+ Choice "MPTray/Multi Purpose Tray" "%% FoomaticRIPOptionSetting: InputSlot=MPTray"
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 120.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "%% FoomaticRIPOptionSetting: Duplex=DuplexNoTumble"
+ Choice "DuplexTumble/Short Edge (Flip)" "%% FoomaticRIPOptionSetting: Duplex=DuplexTumble"
+ *Choice "None/Off" "%% FoomaticRIPOptionSetting: Duplex=None"
+ Option "DryTime/Additional Dry Time" PickOne AnySetup 120.0
+ *Choice "Zero/Printer Default" "%% FoomaticRIPOptionSetting: DryTime=Zero"
+ Choice "Five/5 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Five"
+ Choice "Ten/10 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Ten"
+ Choice "Fifteen/15 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Fifteen"
+ Choice "Twenty/20 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Twenty"
+ Choice "TwentyFive/25 Seconds" "%% FoomaticRIPOptionSetting: DryTime=TwentyFive"
+ Choice "Thirty/30 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Thirty"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "300ColorCMYK/300 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYK"
+ Choice "300DraftColorCMYK/300 dpi, Draft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftColorCMYK"
+ Choice "300DraftGrayscaleK/300 dpi, Draft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftGrayscaleK"
+ Choice "300GrayscaleK/300 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300GrayscaleK"
+ Choice "600ColorCMYK/600 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMYK"
+ Choice "600GrayscaleK/600 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=600GrayscaleK"
+ Choice "600PhotoCMYK/600 dpi, Photo, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=600PhotoCMYK"
+ Choice "1200PhotoCMYK/1200 dpi, Photo, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=1200PhotoCMYK"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 9.72 36.00 9.72 9.00 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo or 5x7 inch index card" 360.00 504.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "PhotoTearOff/Photo with tear-off tab" 288.00 432.00 9.00 9.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff" "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "A6TearOff/A6 with tear-off tab" 297.00 420.00 9.00 0.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A6TearOff" "%% FoomaticRIPOptionSetting: PageSize=A6TearOff"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "CDDVD120/CD or DVD 120 mm" 360.00 360.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD120" "%% FoomaticRIPOptionSetting: PageSize=CDDVD120"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+ // <%DJ9xxVIP:Normal%>
+ {
+ ModelName "HP Officejet D Series hpijs"
+ Attribute "NickName" "" "HP Officejet D Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet D Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet d series;DES:officejet d series;"
+ PCFileName "hp-officejet_d_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet d125xi All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet d135 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet d135xi All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet d145xi All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet d145 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet d155xi All-in-one Printer)"
+ }
+ {
+ ModelName "HP dj450 hpijs"
+ Attribute "NickName" "" "HP dj450 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP dj450 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:dj450;DES:dj450;"
+ PCFileName "hp-dj450-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 450ci Mobile Printer)"
+ Attribute "Product" "" "(HP Deskjet 450cbi Mobile Printer)"
+ Attribute "Product" "" "(HP Deskjet 450wbt Mobile Printer)"
+ }
+ {
+ ModelName "HP Deskjet 960c hpijs"
+ Attribute "NickName" "" "HP Deskjet 960c hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 960c hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 960c;DES:deskjet 960c;"
+ PCFileName "hp-deskjet_960c-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 960cse Printer)"
+ Attribute "Product" "" "(HP Deskjet 960cxi Printer)"
+ Attribute "Product" "" "(HP Deskjet 960c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 980c hpijs"
+ Attribute "NickName" "" "HP Deskjet 980c hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 980c hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 980c;DES:deskjet 980c;"
+ PCFileName "hp-deskjet_980c-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 980cxi Printer)"
+ Attribute "Product" "" "(HP Deskjet 980c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 990c hpijs"
+ Attribute "NickName" "" "HP Deskjet 990c hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 990c hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 990c;DES:deskjet 990c;"
+ PCFileName "hp-deskjet_990c-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 990cxi Printer)"
+ Attribute "Product" "" "(HP Deskjet 990cse Printer)"
+ Attribute "Product" "" "(HP Deskjet 990cm Printer)"
+ Attribute "Product" "" "(HP Deskjet 990c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 995c hpijs"
+ Attribute "NickName" "" "HP Deskjet 995c hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 995c hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 995c;DES:deskjet 995c;"
+ PCFileName "hp-deskjet_995c-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 995c Printer)"
+ Attribute "Product" "" "(HP Deskjet 995ck Printer)"
+ }
+ {
+ ModelName "HP Photosmart 1115 hpijs"
+ Attribute "NickName" "" "HP Photosmart 1115 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 1115 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 1115;DES:photosmart 1115;"
+ PCFileName "hp-photosmart_1115-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart 1115 Printer)"
+ }
+ {
+ ModelName "HP cp1160 hpijs"
+ Attribute "NickName" "" "HP cp1160 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP cp1160 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:cp1160;DES:cp1160;"
+ PCFileName "hp-cp1160-hpijs.ppd"
+ Attribute "Product" "" "(HP Color Inkjet cp1160 Printer)"
+ Attribute "Product" "" "(HP Color Inkjet cp1160tn Printer)"
+ }
+ {
+ ModelName "HP Photosmart 1215 hpijs"
+ Attribute "NickName" "" "HP Photosmart 1215 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 1215 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 1215;DES:photosmart 1215;"
+ PCFileName "hp-photosmart_1215-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart 1215 Printer)"
+ Attribute "Product" "" "(HP Photosmart 1215vm Printer)"
+ }
+ {
+ ModelName "HP Photosmart 1218 hpijs"
+ Attribute "NickName" "" "HP Photosmart 1218 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 1218 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 1218;DES:photosmart 1218;"
+ PCFileName "hp-photosmart_1218-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart 1218 Printer)"
+ Attribute "Product" "" "(HP Photosmart 1218xi Printer)"
+ }
+ {
+ ModelName "HP Photosmart 1315 hpijs"
+ Attribute "NickName" "" "HP Photosmart 1315 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 1315 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 1315;DES:photosmart 1315;"
+ PCFileName "hp-photosmart_1315-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart 1315 Printer)"
+ }
+ {
+ ModelName "HP Color Inkjet cp1700 hpijs"
+ Attribute "NickName" "" "HP Color Inkjet cp1700 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Color Inkjet cp1700 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color inkjet cp1700;DES:hp color inkjet cp1700;"
+ PCFileName "hp-color_inkjet_cp1700-hpijs.ppd"
+ Attribute "Product" "" "(HP Color Inkjet cp1700 Printer)"
+ }
+ {
+ ModelName "HP PSC 2100 Series hpijs"
+ Attribute "NickName" "" "HP PSC 2100 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP PSC 2100 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:psc 2100 series;DES:psc 2100 series;"
+ PCFileName "hp-psc_2100_series-hpijs.ppd"
+ Attribute "Product" "" "(HP PSC 2105 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 2108 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 2110v All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 2110 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 2110xi All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 2115 All-in-one Printer)"
+ }
+ {
+ ModelName "HP PSC 2150 Series hpijs"
+ Attribute "NickName" "" "HP PSC 2150 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP PSC 2150 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:psc 2150 series;DES:psc 2150 series;"
+ PCFileName "hp-psc_2150_series-hpijs.ppd"
+ Attribute "Product" "" "(HP PSC 2150 All-in-one Printer)"
+ }
+ {
+ ModelName "HP PSC 2170 Series hpijs"
+ Attribute "NickName" "" "HP PSC 2170 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP PSC 2170 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:psc 2170 series;DES:psc 2170 series;"
+ PCFileName "hp-psc_2170_series-hpijs.ppd"
+ Attribute "Product" "" "(HP PSC 2170 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 2171 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 2175xi All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 2175v All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 2175 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 2179 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Deskjet 6120 hpijs"
+ Attribute "NickName" "" "HP Deskjet 6120 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 6120 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 6120;DES:deskjet 6120;"
+ PCFileName "hp-deskjet_6120-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 6120 Color Inkjet Printer)"
+ }
+ {
+ ModelName "HP Deskjet 6122 hpijs"
+ Attribute "NickName" "" "HP Deskjet 6122 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 6122 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 6122;DES:deskjet 6122;"
+ PCFileName "hp-deskjet_6122-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 6122 Color Inkjet Printer)"
+ }
+ {
+ ModelName "HP Deskjet 6127 hpijs"
+ Attribute "NickName" "" "HP Deskjet 6127 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 6127 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 6127;DES:deskjet 6127;"
+ PCFileName "hp-deskjet_6127-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 6127 Color Inkjet Printer)"
+ }
+ {
+ ModelName "HP Officejet 7100 Series hpijs"
+ Attribute "NickName" "" "HP Officejet 7100 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet 7100 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet 7100 series;DES:officejet 7100 series;"
+ PCFileName "hp-officejet_7100_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet 7100 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 7110 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 7110xi All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 7115 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 7130 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 7130xi All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 7135xi All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 7140xi All-in-one Printer)"
+ }
+ {
+ // Large format SuperB paper support
+ CustomMedia "B4JIS/B4 (JIS)" 729.00 1033.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B4JIS" "%% FoomaticRIPOptionSetting: PageSize=B4JIS"
+ CustomMedia "Ledger/Ledger" 792.00 1224.00 14.40 36.00 14.40 9.00 "%% FoomaticRIPOptionSetting: PageSize=Ledger" "%% FoomaticRIPOptionSetting: PageSize=Ledger"
+ CustomMedia "SuperB/Super B" 936.00 1368.00 14.40 36.00 14.40 9.00 "%% FoomaticRIPOptionSetting: PageSize=SuperB" "%% FoomaticRIPOptionSetting: PageSize=SuperB"
+ CustomMedia "w774h1116/8K" 774.00 1116.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w774h1116" "%% FoomaticRIPOptionSetting: PageSize=w774h1116"
+ CustomMedia "A3/A3" 842.00 1190.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A3" "%% FoomaticRIPOptionSetting: PageSize=A3"
+ // <%DJ9xxVIP:LargeFormatSuperB%>
+ {
+ ModelName "HP Color Inkjet Printer cp1700 hpijs"
+ Attribute "NickName" "" "HP Color Inkjet Printer cp1700 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP cp1700 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:color inkjet printer cp1700;DES:color inkjet printer cp1700;"
+ PCFileName "hp-color_inkjet_printer_cp1700-hpijs.ppd"
+ Attribute "Product" "" "(HP Color Inkjet cp1700 Printer)"
+ Attribute "Product" "" "(HP Color Inkjet cp1700ps Printer)"
+ Attribute "Product" "" "(HP Color Inkjet cp1700d Printer)"
+ }
+ }
+} // end DJ9xxVIP
+
+//////// DJ9xxVIP but without 1200-dpi mode and without paper type sensor
+{
+ Attribute "DefaultResolution" "" "600dpi"
+
+ // Custom page sizes from 1x4in to Legal
+ HWMargins 18 36 18 9
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 8.5in 14in
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-DeskJet_990C hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-DeskJet_990C" " -sDeviceManufacture&&
+r=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;DESKJET 990&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=300DraftColorCM&&
+YK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft.Gray" "Quality=300DraftGr&&
+ayscaleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=300ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal.Gray" "Quality=300Graysc&&
+aleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High" "Quality=600ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High.Gray" "Quality=600Grayscal&&
+eK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Photo" "Quality=600PhotoCMYK"
+ Attribute "FoomaticRIPOption" "InputSlot" "enum CmdLine C"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Default" ",PS:MediaPosition=7"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=PhotoTray" ",PS:MediaPosition=6"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Upper" ",PS:MediaPosition=1"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Lower" ",PS:MediaPosition=4"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=CDDVDTray" ",PS:MediaPosition=14"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Envelope" ",PS:MediaPosition=3"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=LargeCapacity" ",PS:MediaPosition=&&
+5"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Manual" ",PS:MediaPosition=2"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=MPTray" ",PS:MediaPosition=8"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=PhotoTearOff" " -dDEVICEWIDTHPOINTS&&
+=288 -dDEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6TearOff" " -dDEVICEWIDTHPOINTS=29&&
+7 -dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD120" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ Attribute "FoomaticRIPOption" "Duplex" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexNoTumble" " -dDuplex=true -dTum&&
+ble=false"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexTumble" " -dDuplex=true -dTumbl&&
+e=true"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=None" " -dDuplex=false"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYK" " -r300 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftColorCMYK" " -r300 -sIjsPara&&
+ms=Quality:Quality=1,Quality:ColorMode=2,Quality:MediaType=0,Quality:P&&
+enSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftGrayscaleK" " -r300 -sIjs&&
+Params=Quality:Quality=1,Quality:ColorMode=0,Quality:MediaType=0,Quali&&
+ty:PenSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300GrayscaleK" " -r300 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMYK" " -r600 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600GrayscaleK" " -r600 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600PhotoCMYK" " -r600 -sIjsParams=Qu&&
+ality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenSet&&
+=2"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ Choice "Draft.Gray/Draft Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft.Gray"
+ *Choice "Normal/Normal (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "Normal.Gray/Normal Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal.Gray"
+ Choice "High/High Quality (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=High"
+ Choice "High.Gray/High Quality Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=High.Gray"
+ Choice "Photo/Photo (on photo paper)" "%% FoomaticRIPOptionSetting: PrintoutMode=Photo"
+ Option "InputSlot/Media Source" PickOne AnySetup 100.0
+ *Choice "Default/Printer default" "%% FoomaticRIPOptionSetting: InputSlot=Default"
+ Choice "PhotoTray/Photo Tray" "%% FoomaticRIPOptionSetting: InputSlot=PhotoTray"
+ Choice "Upper/Upper Tray" "%% FoomaticRIPOptionSetting: InputSlot=Upper"
+ Choice "Lower/Lower Tray" "%% FoomaticRIPOptionSetting: InputSlot=Lower"
+ Choice "CDDVDTray/CD or DVD Tray" "%% FoomaticRIPOptionSetting: InputSlot=CDDVDTray"
+ Choice "Envelope/Envelope Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Envelope"
+ Choice "LargeCapacity/Large Capacity Tray" "%% FoomaticRIPOptionSetting: InputSlot=LargeCapacity"
+ Choice "Manual/Manual Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Manual"
+ Choice "MPTray/Multi Purpose Tray" "%% FoomaticRIPOptionSetting: InputSlot=MPTray"
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 120.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "%% FoomaticRIPOptionSetting: Duplex=DuplexNoTumble"
+ Choice "DuplexTumble/Short Edge (Flip)" "%% FoomaticRIPOptionSetting: Duplex=DuplexTumble"
+ *Choice "None/Off" "%% FoomaticRIPOptionSetting: Duplex=None"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "300ColorCMYK/300 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYK"
+ Choice "300DraftColorCMYK/300 dpi, Draft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftColorCMYK"
+ Choice "300DraftGrayscaleK/300 dpi, Draft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftGrayscaleK"
+ Choice "300GrayscaleK/300 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300GrayscaleK"
+ Choice "600ColorCMYK/600 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMYK"
+ Choice "600GrayscaleK/600 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=600GrayscaleK"
+ Choice "600PhotoCMYK/600 dpi, Photo, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=600PhotoCMYK"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 9.72 36.00 9.72 9.00 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo or 5x7 inch index card" 360.00 504.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "PhotoTearOff/Photo with tear-off tab" 288.00 432.00 9.00 9.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff" "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "A6TearOff/A6 with tear-off tab" 297.00 420.00 9.00 0.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A6TearOff" "%% FoomaticRIPOptionSetting: PageSize=A6TearOff"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "CDDVD120/CD or DVD 120 mm" 360.00 360.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD120" "%% FoomaticRIPOptionSetting: PageSize=CDDVD120"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+ // <%DJ9xxVIP:No1200dpiNoSensor%>
+ {
+ ModelName "HP Business Inkjet 2200 hpijs"
+ Attribute "NickName" "" "HP Business Inkjet 2200 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Business Inkjet 2200 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp business inkjet 2200;DES:hp business inkjet 2200;"
+ PCFileName "hp-business_inkjet_2200-hpijs.ppd"
+ Attribute "Product" "" "(HP Business Inkjet 2200 Printer)"
+ Attribute "Product" "" "(HP Business Inkjet 2200se Printer)"
+ Attribute "Product" "" "(HP Business Inkjet 2200xi Printer)"
+ }
+ {
+ ModelName "HP Business Inkjet 2230 hpijs"
+ Attribute "NickName" "" "HP Business Inkjet 2230 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Business Inkjet 2230 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp business inkjet 2230;DES:hp business inkjet 2230;"
+ PCFileName "hp-business_inkjet_2230-hpijs.ppd"
+ Attribute "Product" "" "(HP Business Inkjet 2230 Printer)"
+ }
+ {
+ ModelName "HP Business Inkjet 2250 hpijs"
+ Attribute "NickName" "" "HP Business Inkjet 2250 hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Business Inkjet 2250 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp business inkjet 2250;DES:hp business inkjet 2250;"
+ PCFileName "hp-business_inkjet_2250-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP Business Inkjet 2250 Printer)"
+ Attribute "Product" "" "(HP Business Inkjet 2250tn Printer)"
+ }
+ {
+ ModelName "HP Business Inkjet 2280 hpijs"
+ Attribute "NickName" "" "HP Business Inkjet 2280 hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Business Inkjet 2280 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp business inkjet 2280;DES:hp business inkjet 2280;"
+ PCFileName "hp-business_inkjet_2280-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP Business Inkjet 2280 Printer)"
+ Attribute "Product" "" "(HP Business Inkjet 2280tn Printer)"
+ }
+} // end DJ9xxVIP but without 1200-dpi mode and without paper type sensor
+
+////////// DJ55xx (a VIP)
+{
+ Attribute "DefaultResolution" "" "1200dpi"
+
+ // Custom page sizes from 1x4in to Legal
+ HWMargins 18 36 18 9
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 8.5in 14in
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-DeskJet_5550 hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-DeskJet_5550" " -sDeviceManufacture&&
+r=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;deskjet 5550&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=300FastDraftCol&&
+orCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft.Gray" "Quality=300FastDra&&
+ftGrayscaleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=300ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal.Gray" "Quality=300Graysc&&
+aleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High" "Quality=600ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High.Gray" "Quality=600Grayscal&&
+eK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Photo" "Quality=1200PhotoCMYKFu&&
+llBleed"
+ Attribute "FoomaticRIPOption" "InputSlot" "enum CmdLine C"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Default" ",PS:MediaPosition=7"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=PhotoTray" ",PS:MediaPosition=6"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Upper" ",PS:MediaPosition=1"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Lower" ",PS:MediaPosition=4"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=CDDVDTray" ",PS:MediaPosition=14"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Envelope" ",PS:MediaPosition=3"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=LargeCapacity" ",PS:MediaPosition=&&
+5"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Manual" ",PS:MediaPosition=2"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=MPTray" ",PS:MediaPosition=8"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=PhotoTearOff" " -dDEVICEWIDTHPOINTS&&
+=288 -dDEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6TearOff" " -dDEVICEWIDTHPOINTS=29&&
+7 -dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD120" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ Attribute "FoomaticRIPOption" "Duplex" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexNoTumble" " -dDuplex=true -dTum&&
+ble=false"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexTumble" " -dDuplex=true -dTumbl&&
+e=true"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=None" " -dDuplex=false"
+ Attribute "FoomaticRIPOption" "DryTime" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Zero" ""
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Five" ",DryTime=5"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Ten" ",DryTime=10"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Fifteen" ",DryTime=15"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Twenty" ",DryTime=20"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=TwentyFive" ",DryTime=25"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Thirty" ",DryTime=30"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYK" " -r300 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYKFullBleed" " -r300 -sIjs&&
+Params=Quality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:FullBleed=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftColorCMYK" " -r300 -sIjsPara&&
+ms=Quality:Quality=1,Quality:ColorMode=2,Quality:MediaType=0,Quality:P&&
+enSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftGrayscaleK" " -r300 -sIjs&&
+Params=Quality:Quality=1,Quality:ColorMode=0,Quality:MediaType=0,Quali&&
+ty:PenSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300FastDraftColorCMYK" " -r300 -sIjs&&
+Params=Quality:Quality=4,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:SpeedMech=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300FastDraftGrayscaleK" " -r300 -&&
+sIjsParams=Quality:Quality=4,Quality:ColorMode=0,Quality:MediaType=0,Q&&
+uality:PenSet=2,Quality:SpeedMech=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300GrayscaleK" " -r300 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMYK" " -r600 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMYKFullBleed" " -r600 -sIjs&&
+Params=Quality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:FullBleed=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600GrayscaleK" " -r600 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=1200PhotoCMYK" " -r1200 -sIjsParams=&&
+Quality:Quality=3,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenS&&
+et=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=1200PhotoCMYKFullBleed" " -r1200 -sI&&
+jsParams=Quality:Quality=3,Quality:ColorMode=2,Quality:MediaType=2,Qua&&
+lity:PenSet=2,Quality:FullBleed=1"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ Choice "Draft.Gray/Draft Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft.Gray"
+ *Choice "Normal/Normal (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "Normal.Gray/Normal Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal.Gray"
+ Choice "High/High Quality (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=High"
+ Choice "High.Gray/High Quality Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=High.Gray"
+ Choice "Photo/Photo (on photo paper)" "%% FoomaticRIPOptionSetting: PrintoutMode=Photo"
+ Option "InputSlot/Media Source" PickOne AnySetup 100.0
+ *Choice "Default/Printer default" "%% FoomaticRIPOptionSetting: InputSlot=Default"
+ Choice "PhotoTray/Photo Tray" "%% FoomaticRIPOptionSetting: InputSlot=PhotoTray"
+ Choice "Upper/Upper Tray" "%% FoomaticRIPOptionSetting: InputSlot=Upper"
+ Choice "Lower/Lower Tray" "%% FoomaticRIPOptionSetting: InputSlot=Lower"
+ Choice "CDDVDTray/CD or DVD Tray" "%% FoomaticRIPOptionSetting: InputSlot=CDDVDTray"
+ Choice "Envelope/Envelope Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Envelope"
+ Choice "LargeCapacity/Large Capacity Tray" "%% FoomaticRIPOptionSetting: InputSlot=LargeCapacity"
+ Choice "Manual/Manual Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Manual"
+ Choice "MPTray/Multi Purpose Tray" "%% FoomaticRIPOptionSetting: InputSlot=MPTray"
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 120.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "%% FoomaticRIPOptionSetting: Duplex=DuplexNoTumble"
+ Choice "DuplexTumble/Short Edge (Flip)" "%% FoomaticRIPOptionSetting: Duplex=DuplexTumble"
+ *Choice "None/Off" "%% FoomaticRIPOptionSetting: Duplex=None"
+ Option "DryTime/Additional Dry Time" PickOne AnySetup 120.0
+ *Choice "Zero/Printer Default" "%% FoomaticRIPOptionSetting: DryTime=Zero"
+ Choice "Five/5 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Five"
+ Choice "Ten/10 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Ten"
+ Choice "Fifteen/15 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Fifteen"
+ Choice "Twenty/20 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Twenty"
+ Choice "TwentyFive/25 Seconds" "%% FoomaticRIPOptionSetting: DryTime=TwentyFive"
+ Choice "Thirty/30 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Thirty"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "300ColorCMYK/300 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYK"
+ Choice "300ColorCMYKFullBleed/300 dpi, Color, Full Bleed, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYKFullBleed"
+ Choice "300DraftColorCMYK/300 dpi, Draft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftColorCMYK"
+ Choice "300DraftGrayscaleK/300 dpi, Draft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftGrayscaleK"
+ Choice "300FastDraftColorCMYK/300 dpi, FastDraft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300FastDraftColorCMYK"
+ Choice "300FastDraftGrayscaleK/300 dpi, FastDraft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300FastDraftGrayscaleK"
+ Choice "300GrayscaleK/300 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300GrayscaleK"
+ Choice "600ColorCMYK/600 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMYK"
+ Choice "600ColorCMYKFullBleed/600 dpi, Color, Full Bleed, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMYKFullBleed"
+ Choice "600GrayscaleK/600 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=600GrayscaleK"
+ Choice "1200PhotoCMYK/1200 dpi, Photo, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=1200PhotoCMYK"
+ Choice "1200PhotoCMYKFullBleed/1200 dpi, Photo, Full Bleed, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=1200PhotoCMYKFullBleed"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 9.72 36.00 9.72 9.00 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo or 5x7 inch index card" 360.00 504.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "PhotoTearOff/Photo with tear-off tab" 288.00 432.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff" "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "A6TearOff/A6 with tear-off tab" 297.00 420.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=A6TearOff" "%% FoomaticRIPOptionSetting: PageSize=A6TearOff"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "CDDVD120/CD or DVD 120 mm" 360.00 360.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD120" "%% FoomaticRIPOptionSetting: PageSize=CDDVD120"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+ // <%DJ55xx:Normal%>
+ {
+ ModelName "HP Deskjet 460 hpijs"
+ Attribute "NickName" "" "HP Deskjet 460 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 460 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 460;DES:deskjet 460;"
+ PCFileName "hp-deskjet_460-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 460c Mobile Printer)"
+ Attribute "Product" "" "(HP Deskjet 460cb Mobile Printer)"
+ Attribute "Product" "" "(HP Deskjet 460wf Mobile Printer)"
+ Attribute "Product" "" "(HP Deskjet 460wbt Mobile Printer)"
+ }
+ {
+ ModelName "HP Officejet h470 hpijs"
+ Attribute "NickName" "" "HP Officejet h470 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet h470 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet h470;DES:officejet h470;"
+ PCFileName "hp-officejet_h470-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet h470 Mobile Printer)"
+ Attribute "Product" "" "(HP Officejet h470wbt Mobile Printer)"
+ Attribute "Product" "" "(HP Officejet h470wf Mobile Printer)"
+ Attribute "Product" "" "(HP Officejet h470bt Mobile Printer)"
+ }
+ {
+ ModelName "HP Deskjet 5550 hpijs"
+ Attribute "NickName" "" "HP Deskjet 5550 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 5550 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 5550;DES:deskjet 5550;"
+ PCFileName "hp-deskjet_5550-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 5550 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 5550w Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 5550v Color Inkjet Printer)"
+ }
+ {
+ ModelName "HP Deskjet 5551 hpijs"
+ Attribute "NickName" "" "HP Deskjet 5551 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 5551 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 5551;DES:deskjet 5551;"
+ PCFileName "hp-deskjet_5551-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 5551 Color Inkjet Printer)"
+ }
+} // end DJ55xx
+
+/////////////// DJGenericVIP
+{
+ Attribute "DefaultResolution" "" "600dpi"
+
+ // Custom page sizes from 1x4in to SuperB
+ HWMargins 18 36 18 9
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 936 1368
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-DeskJet_5650 hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-DeskJet_5650" " -sDeviceManufacture&&
+r=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;deskjet 5600&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=300FastDraftCol&&
+orCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft.Gray" "Quality=300FastDra&&
+ftGrayscaleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=300ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal.Gray" "Quality=300Graysc&&
+aleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High" "Quality=600ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High.Gray" "Quality=600Grayscal&&
+eK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Photo" "Quality=600PhotoCMYKFu&&
+llBleed"
+ Attribute "FoomaticRIPOption" "InputSlot" "enum CmdLine C"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Default" ",PS:MediaPosition=7"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=PhotoTray" ",PS:MediaPosition=6"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Upper" ",PS:MediaPosition=1"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Lower" ",PS:MediaPosition=4"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=CDDVDTray" ",PS:MediaPosition=14"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Envelope" ",PS:MediaPosition=3"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=LargeCapacity" ",PS:MediaPosition=&&
+5"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Manual" ",PS:MediaPosition=2"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=MPTray" ",PS:MediaPosition=8"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=PhotoTearOff" " -dDEVICEWIDTHPOINTS&&
+=288 -dDEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6TearOff" " -dDEVICEWIDTHPOINTS=29&&
+7 -dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD120" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ /////////// Large format paper support
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B4JIS" " -dDEVICEWIDTHPOINTS=729 -d&&
+DEVICEHEIGHTPOINTS=1033"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Ledger" " -dDEVICEWIDTHPOINTS=792 -&&
+dDEVICEHEIGHTPOINTS=1224"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=SuperB" " -dDEVICEWIDTHPOINTS=936 -&&
+dDEVICEHEIGHTPOINTS=1368"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w774h1116" " -dDEVICEWIDTHPOINTS=77&&
+4 -dDEVICEHEIGHTPOINTS=1116"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A3" " -dDEVICEWIDTHPOINTS=842 -dDEV&&
+ICEHEIGHTPOINTS=1190"
+ Attribute "FoomaticRIPOption" "Duplex" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexNoTumble" " -dDuplex=true -dTum&&
+ble=false"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexTumble" " -dDuplex=true -dTumbl&&
+e=true"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=None" " -dDuplex=false"
+ Attribute "FoomaticRIPOption" "DryTime" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Zero" ""
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Five" ",DryTime=5"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Ten" ",DryTime=10"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Fifteen" ",DryTime=15"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Twenty" ",DryTime=20"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=TwentyFive" ",DryTime=25"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Thirty" ",DryTime=30"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYK" " -r300 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYKFullBleed" " -r300 -sIjs&&
+Params=Quality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:FullBleed=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftColorCMYK" " -r300 -sIjsPara&&
+ms=Quality:Quality=1,Quality:ColorMode=2,Quality:MediaType=0,Quality:P&&
+enSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftGrayscaleK" " -r300 -sIjs&&
+Params=Quality:Quality=1,Quality:ColorMode=0,Quality:MediaType=0,Quali&&
+ty:PenSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300FastDraftColorCMYK" " -r300 -sIjs&&
+Params=Quality:Quality=4,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:SpeedMech=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300FastDraftGrayscaleK" " -r300 -&&
+sIjsParams=Quality:Quality=4,Quality:ColorMode=0,Quality:MediaType=0,Q&&
+uality:PenSet=2,Quality:SpeedMech=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300GrayscaleK" " -r300 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMYK" " -r600 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMYKFullBleed" " -r600 -sIjs&&
+Params=Quality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:FullBleed=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600GrayscaleK" " -r600 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600PhotoCMYK" " -r600 -sIjsParams=&&
+Quality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenS&&
+et=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600PhotoCMYKFullBleed" " -r600 -sI&&
+jsParams=Quality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Qua&&
+lity:PenSet=2,Quality:FullBleed=1"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ Choice "Draft.Gray/Draft Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft.Gray"
+ *Choice "Normal/Normal (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "Normal.Gray/Normal Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal.Gray"
+ Choice "High/High Quality (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=High"
+ Choice "High.Gray/High Quality Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=High.Gray"
+ Choice "Photo/Photo (on photo paper)" "%% FoomaticRIPOptionSetting: PrintoutMode=Photo"
+ Option "InputSlot/Media Source" PickOne AnySetup 100.0
+ *Choice "Default/Printer default" "%% FoomaticRIPOptionSetting: InputSlot=Default"
+ Choice "PhotoTray/Photo Tray" "%% FoomaticRIPOptionSetting: InputSlot=PhotoTray"
+ Choice "Upper/Upper Tray" "%% FoomaticRIPOptionSetting: InputSlot=Upper"
+ Choice "Lower/Lower Tray" "%% FoomaticRIPOptionSetting: InputSlot=Lower"
+ Choice "CDDVDTray/CD or DVD Tray" "%% FoomaticRIPOptionSetting: InputSlot=CDDVDTray"
+ Choice "Envelope/Envelope Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Envelope"
+ Choice "LargeCapacity/Large Capacity Tray" "%% FoomaticRIPOptionSetting: InputSlot=LargeCapacity"
+ Choice "Manual/Manual Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Manual"
+ Choice "MPTray/Multi Purpose Tray" "%% FoomaticRIPOptionSetting: InputSlot=MPTray"
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 120.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "%% FoomaticRIPOptionSetting: Duplex=DuplexNoTumble"
+ Choice "DuplexTumble/Short Edge (Flip)" "%% FoomaticRIPOptionSetting: Duplex=DuplexTumble"
+ *Choice "None/Off" "%% FoomaticRIPOptionSetting: Duplex=None"
+ Option "DryTime/Additional Dry Time" PickOne AnySetup 120.0
+ *Choice "Zero/Printer Default" "%% FoomaticRIPOptionSetting: DryTime=Zero"
+ Choice "Five/5 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Five"
+ Choice "Ten/10 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Ten"
+ Choice "Fifteen/15 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Fifteen"
+ Choice "Twenty/20 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Twenty"
+ Choice "TwentyFive/25 Seconds" "%% FoomaticRIPOptionSetting: DryTime=TwentyFive"
+ Choice "Thirty/30 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Thirty"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "300ColorCMYK/300 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYK"
+ Choice "300ColorCMYKFullBleed/300 dpi, Color, Full Bleed, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYKFullBleed"
+ Choice "300DraftColorCMYK/300 dpi, Draft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftColorCMYK"
+ Choice "300DraftGrayscaleK/300 dpi, Draft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftGrayscaleK"
+ Choice "300FastDraftColorCMYK/300 dpi, FastDraft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300FastDraftColorCMYK"
+ Choice "300FastDraftGrayscaleK/300 dpi, FastDraft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300FastDraftGrayscaleK"
+ Choice "300GrayscaleK/300 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300GrayscaleK"
+ Choice "600ColorCMYK/600 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMYK"
+ Choice "600ColorCMYKFullBleed/600 dpi, Color, Full Bleed, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMYKFullBleed"
+ Choice "600GrayscaleK/600 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=600GrayscaleK"
+ Choice "600PhotoCMYK/600 dpi, Photo, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=600PhotoCMYK"
+ Choice "600PhotoCMYKFullBleed/600 dpi, Photo, Full Bleed, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=600PhotoCMYKFullBleed"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 9.72 36.00 9.72 9.00 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo or 5x7 inch index card" 360.00 504.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "PhotoTearOff/Photo with tear-off tab" 288.00 432.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff" "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "A6TearOff/A6 with tear-off tab" 297.00 420.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=A6TearOff" "%% FoomaticRIPOptionSetting: PageSize=A6TearOff"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "CDDVD120/CD or DVD 120 mm" 360.00 360.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD120" "%% FoomaticRIPOptionSetting: PageSize=CDDVD120"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+ // <%DJGenericVIP:Normal%>
+ {
+ ModelName "HP Deskjet Ink Advant k209a-z hpijs"
+ Attribute "NickName" "" "HP Deskjet Ink Advant k209a-z hpijs, $Version"
+ Attribute "ShortNickName" "" "HP DJ Ink Advant k209a-z hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet ink advant k209a-z;DES:deskjet ink advant k209a-z;"
+ PCFileName "hp-deskjet_ink_advant_k209a-z-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet Ink Advantage k209a All-in-one Printer)"
+ }
+ {
+ ModelName "HP Deskjet d730 hpijs"
+ Attribute "NickName" "" "HP Deskjet d730 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet d730 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet d730;DES:deskjet d730;"
+ PCFileName "hp-deskjet_d730-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet d730 Printer)"
+ }
+ {
+ ModelName "HP Deskjet f735 hpijs"
+ Attribute "NickName" "" "HP Deskjet f735 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet f735 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet f735;DES:deskjet f735;"
+ PCFileName "hp-deskjet_f735-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet f735 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f4280 All-in-one)"
+ }
+ {
+ ModelName "HP Business Inkjet 1000 hpijs"
+ Attribute "NickName" "" "HP Business Inkjet 1000 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Business Inkjet 1000 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:business inkjet 1000;DES:business inkjet 1000;"
+ PCFileName "hp-business_inkjet_1000-hpijs.ppd"
+ Attribute "Product" "" "(HP Business Inkjet 1000 Printer)"
+ }
+ {
+ ModelName "HP PSC 1500 Series hpijs"
+ Attribute "NickName" "" "HP PSC 1500 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP PSC 1500 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:psc 1500 series;DES:psc 1500 series;"
+ PCFileName "hp-psc_1500_series-hpijs.ppd"
+ Attribute "Product" "" "(HP PSC 1503 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1504 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1507 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1508 All-in-one Printer)"
+ }
+ {
+ ModelName "HP PSC 1510 Series hpijs"
+ Attribute "NickName" "" "HP PSC 1510 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP PSC 1510 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:psc 1510 series;DES:psc 1510 series;"
+ PCFileName "hp-psc_1510_series-hpijs.ppd"
+ Attribute "Product" "" "(HP PSC 1508 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1510xi All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1510v All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1510s All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1510 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1513s All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1513 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1514 All-in-one Printer)"
+ }
+ {
+ ModelName "HP PSC 1600 Series hpijs"
+ Attribute "NickName" "" "HP PSC 1600 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP PSC 1600 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:psc 1600 series;DES:psc 1600 series;"
+ PCFileName "hp-psc_1600_series-hpijs.ppd"
+ Attribute "Product" "" "(HP PSC 1600 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1603 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1605 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1608 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1610xi All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1610v All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1610 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1613 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1615 All-in-one Printer)"
+ }
+ {
+ ModelName "HP PSC 2200 Series hpijs"
+ Attribute "NickName" "" "HP PSC 2200 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP PSC 2200 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:psc 2200 series;DES:psc 2200 series;"
+ PCFileName "hp-psc_2200_series-hpijs.ppd"
+ Attribute "Product" "" "(HP PSC 2200 All-in-one Printer)"
+ }
+ {
+ ModelName "HP PSC 2210 Series hpijs"
+ Attribute "NickName" "" "HP PSC 2210 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP PSC 2210 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:psc 2210 series;DES:psc 2210 series;"
+ PCFileName "hp-psc_2210_series-hpijs.ppd"
+ Attribute "Product" "" "(HP PSC 2210 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 2210xi All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 2210v All-in-one Printer)"
+ }
+ {
+ ModelName "HP PSC 2300 Series hpijs"
+ Attribute "NickName" "" "HP PSC 2300 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP PSC 2300 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:psc 2300 series;DES:psc 2300 series;"
+ PCFileName "hp-psc_2300_series-hpijs.ppd"
+ Attribute "Product" "" "(HP PSC 2300 Series All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 2310 All-in-one Printer)"
+ }
+ {
+ ModelName "HP PSC 2350 Series hpijs"
+ Attribute "NickName" "" "HP PSC 2350 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP PSC 2350 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:psc 2350 series;DES:psc 2350 series;"
+ PCFileName "hp-psc_2350_series-hpijs.ppd"
+ Attribute "Product" "" "(HP PSC 2350 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 2352 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 2353 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 2353p All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 2355xi All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 2355v All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 2355 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 2355p All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 2357 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 2358 All-in-one Printer)"
+ }
+ {
+ ModelName "HP PSC 2400 Series hpijs"
+ Attribute "NickName" "" "HP PSC 2400 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP PSC 2400 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:psc 2400 series;DES:psc 2400 series;"
+ PCFileName "hp-psc_2400_series-hpijs.ppd"
+ Attribute "Product" "" "(HP PSC 2405 Photosmart All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 2410xi Photosmart All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 2410v Photosmart All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 2410 Photosmart All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 2420 Photosmart All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 2450 Photosmart All-in-one Printer)"
+ }
+ {
+ ModelName "HP Deskjet d2500 Series hpijs"
+ Attribute "NickName" "" "HP Deskjet d2500 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet d2500 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet d2500 series;DES:deskjet d2500 series;"
+ PCFileName "hp-deskjet_d2500_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet d2530 Printer)"
+ Attribute "Product" "" "(HP Deskjet d2545 Printer)"
+ Attribute "Product" "" "(HP Deskjet d2560 Printer)"
+ Attribute "Product" "" "(HP Deskjet d2563 Printer)"
+ Attribute "Product" "" "(HP Deskjet d2566 Printer)"
+ Attribute "Product" "" "(HP Deskjet d2568 Printer)"
+ }
+ {
+ ModelName "HP PSC 2500 Series hpijs"
+ Attribute "NickName" "" "HP PSC 2500 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP PSC 2500 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:psc 2500 series;DES:psc 2500 series;"
+ PCFileName "hp-psc_2500_series-hpijs.ppd"
+ Attribute "Product" "" "(HP PSC 2500 Photosmart All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 2510 Photosmart All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 2510xi Photosmart All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 2550 Photosmart All-in-one Printer)"
+ }
+ {
+ ModelName "HP Photosmart 2570 Series hpijs"
+ Attribute "NickName" "" "HP Photosmart 2570 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 2570 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 2570 series;DES:photosmart 2570 series;"
+ PCFileName "hp-photosmart_2570_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart 2570 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart 2571 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart 2573 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart 2574 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart 2575 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart 2575xi All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart 2575v All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart 2575a All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart 2578 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Photosmart 2600 Series hpijs"
+ Attribute "NickName" "" "HP Photosmart 2600 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 2600 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 2600 series;DES:photosmart 2600 series;"
+ PCFileName "hp-photosmart_2600_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart 2605 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart 2608 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart 2610v All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart 2610xi All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart 2610 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart 2613 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart 2615 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Photosmart 2700 Series hpijs"
+ Attribute "NickName" "" "HP Photosmart 2700 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 2700 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 2700 series;DES:photosmart 2700 series;"
+ PCFileName "hp-photosmart_2700_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart 2710 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart 2710xi All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart 2713 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Photosmart c3100 Series hpijs"
+ Attribute "NickName" "" "HP Photosmart c3100 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP PS c3100 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart c3100 series;DES:photosmart c3100 series;"
+ PCFileName "hp-photosmart_c3100_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart c3110 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c3125 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c3135 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c3140 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c3150 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c3170 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c3173 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c3175 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c3180 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c3183 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c3188 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c3190 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c3193 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c3194 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Photosmart 3100 Series hpijs"
+ Attribute "NickName" "" "HP Photosmart 3100 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 3100 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 3100 series;DES:photosmart 3100 series;"
+ PCFileName "hp-photosmart_3100_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart 3108 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart 3110 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart 3110v All-in-one Printer)"
+ }
+ {
+ ModelName "HP Photosmart 3200 Series hpijs"
+ Attribute "NickName" "" "HP Photosmart 3200 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 3200 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 3200 series;DES:photosmart 3200 series;"
+ PCFileName "hp-photosmart_3200_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart 3207 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart 3210 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart 3210xi All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart 3210v All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart 3210a All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart 3213 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart 3214 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Photosmart 3300 Series hpijs"
+ Attribute "NickName" "" "HP Photosmart 3300 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 3300 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 3300 series;DES:photosmart 3300 series;"
+ PCFileName "hp-photosmart_3300_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart 3308 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart 3310 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart 3310xi All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart 3313 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart 3314 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Photosmart c4100 Series hpijs"
+ Attribute "NickName" "" "HP Photosmart c4100 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP PS c4100 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart c4100 series;DES:photosmart c4100 series;"
+ PCFileName "hp-photosmart_c4100_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart c4110 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4140 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4150 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4170 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4173 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4175 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4180 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4183 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4188 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4190 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4193 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4194 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Deskjet f4200 Series hpijs"
+ Attribute "NickName" "" "HP Deskjet f4200 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet f4200 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet f4200 series;DES:deskjet f4200 series;"
+ PCFileName "hp-deskjet_f4200_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet f4224 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f4230 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f4235 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f4238 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f4240 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f4250 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f4272 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f4273 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f4274 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f4275 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f4275 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f4280 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f4283 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f4288 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f4292 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f4293 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f4294 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Photosmart c4200 Series hpijs"
+ Attribute "NickName" "" "HP Photosmart c4200 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP PS c4200 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart c4200 series;DES:photosmart c4200 series;"
+ PCFileName "hp-photosmart_c4200_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart c4205 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4210 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4235 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4240 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4250 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4270 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4272 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4273 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4275 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4280 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4283 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4285 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4288 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4293 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4294 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Deskjet f4210 Series hpijs"
+ Attribute "NickName" "" "HP Deskjet f4210 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet f4210 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet f4210 series;DES:deskjet f4210 series;"
+ PCFileName "hp-deskjet_f4210_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet f4210 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f4280 All-in-one)"
+ }
+ {
+ ModelName "HP Deskjet f4213 Series hpijs"
+ Attribute "NickName" "" "HP Deskjet f4213 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet f4213 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet f4213 series;DES:deskjet f4213 series;"
+ PCFileName "hp-deskjet_f4213_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet f4213 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f4280 All-in-one)"
+ }
+ {
+ ModelName "HP Photosmart c4340 Series hpijs"
+ Attribute "NickName" "" "HP Photosmart c4340 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP PS c4340 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart c4340 series;DES:photosmart c4340 series;"
+ PCFileName "hp-photosmart_c4340_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart c4340 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4342 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4343 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4344 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4345 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4348 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Photosmart c4380 Series hpijs"
+ Attribute "NickName" "" "HP Photosmart c4380 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP PS c4380 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart c4380 series;DES:photosmart c4380 series;"
+ PCFileName "hp-photosmart_c4380_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart c4380 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4383 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4384 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4385 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4388 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Photosmart c4400 Series hpijs"
+ Attribute "NickName" "" "HP Photosmart c4400 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP PS c4400 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart c4400 series;DES:photosmart c4400 series;"
+ PCFileName "hp-photosmart_c4400_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart c4410 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4424 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4435 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4440 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4450 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4470 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4472 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4473 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4480 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4483 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4485 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4486 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4488 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4490 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4493 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4494 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet j4500 Series hpijs"
+ Attribute "NickName" "" "HP Officejet j4500 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet j4500 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet j4500 series;DES:officejet j4500 series;"
+ PCFileName "hp-officejet_j4500_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet j4524 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet j4525 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet j4535 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet j4540 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet j4550 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet j4560 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet j4580 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet j4580c All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet j4585 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Photosmart c4500 Series hpijs"
+ Attribute "NickName" "" "HP Photosmart c4500 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP PS c4500 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart c4500 series;DES:photosmart c4500 series;"
+ PCFileName "hp-photosmart_c4500_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart c4540 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4550 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4570 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4572 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4573 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4575 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4580 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4583 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4585 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4588 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4593 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4599 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet j4660 Series hpijs"
+ Attribute "NickName" "" "HP Officejet j4660 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet j4660 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet j4660 series;DES:officejet j4660 series;"
+ PCFileName "hp-officejet_j4660_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet f4280 All-in-one)"
+ Attribute "Product" "" "(HP Officejet j4660 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet j4680 Series hpijs"
+ Attribute "NickName" "" "HP Officejet j4680 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet j4680 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet j4680 series;DES:officejet j4680 series;"
+ PCFileName "hp-officejet_j4680_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet f4280 All-in-one)"
+ Attribute "Product" "" "(HP Officejet j4680c All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet j4680 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Photosmart d5060 Series hpijs"
+ Attribute "NickName" "" "HP Photosmart d5060 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP PS d5060 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart d5060 series;DES:photosmart d5060 series;"
+ PCFileName "hp-photosmart_d5060_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart d5060 Printer)"
+ Attribute "Product" "" "(HP Photosmart d5063 Printer)"
+ Attribute "Product" "" "(HP Photosmart d5065 Printer)"
+ Attribute "Product" "" "(HP Photosmart d5069 Printer)"
+ }
+ {
+ ModelName "HP Photosmart c5100 Series hpijs"
+ Attribute "NickName" "" "HP Photosmart c5100 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP PS c5100 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart c5100 series;DES:photosmart c5100 series;"
+ PCFileName "hp-photosmart_c5100_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart c5140 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c5150 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c5170 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c5173 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c5175 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c5180 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c5183 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c5185 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c5188 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c5194 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Deskjet 5100 hpijs"
+ Attribute "NickName" "" "HP Deskjet 5100 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 5100 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 5100;DES:deskjet 5100;"
+ PCFileName "hp-deskjet_5100-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 5100 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 5145 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 5150v Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 5150w Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 5150 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 5151 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 5160 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 5168 Color Inkjet Printer)"
+ }
+ {
+ ModelName "HP Photosmart d5100 Series hpijs"
+ Attribute "NickName" "" "HP Photosmart d5100 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP PS d5100 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart d5100 series;DES:photosmart d5100 series;"
+ PCFileName "hp-photosmart_d5100_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart d5145 Printer)"
+ Attribute "Product" "" "(HP Photosmart d5155 Printer)"
+ Attribute "Product" "" "(HP Photosmart d5156 Printer)"
+ Attribute "Product" "" "(HP Photosmart d5160 Printer)"
+ Attribute "Product" "" "(HP Photosmart d5163 Printer)"
+ Attribute "Product" "" "(HP Photosmart d5168 Printer)"
+ }
+ {
+ ModelName "HP Photosmart c5200 Series hpijs"
+ Attribute "NickName" "" "HP Photosmart c5200 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP PS c5200 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart c5200 series;DES:photosmart c5200 series;"
+ PCFileName "hp-photosmart_c5200_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart c5240 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c5250 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c5270 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c5273 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c5275 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c5280 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c5283 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c5288 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c5290 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c5293 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Photosmart d5300 Series hpijs"
+ Attribute "NickName" "" "HP Photosmart d5300 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP PS d5300 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart d5300 series;DES:photosmart d5300 series;"
+ PCFileName "hp-photosmart_d5300_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart d5345 Printer)"
+ Attribute "Product" "" "(HP Photosmart d5360 Printer)"
+ Attribute "Product" "" "(HP Photosmart d5363 Printer)"
+ Attribute "Product" "" "(HP Photosmart d5368 Printer)"
+ }
+ {
+ ModelName "HP Photosmart d5400 Series hpijs"
+ Attribute "NickName" "" "HP Photosmart d5400 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP PS d5400 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart d5400 series;DES:photosmart d5400 series;"
+ PCFileName "hp-photosmart_d5400_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart d5460 Printer)"
+ Attribute "Product" "" "(HP Photosmart d5463 Printer)"
+ Attribute "Product" "" "(HP Photosmart d5468 Printer)"
+ }
+ {
+ ModelName "HP Deskjet 5400 Series hpijs"
+ Attribute "NickName" "" "HP Deskjet 5400 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 5400 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 5400 series;DES:deskjet 5400 series;"
+ PCFileName "hp-deskjet_5400_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 5420v Photo Printer)"
+ Attribute "Product" "" "(HP Deskjet 5432 Photo Printer)"
+ Attribute "Product" "" "(HP Deskjet 5438 Photo Printer)"
+ Attribute "Product" "" "(HP Deskjet 5440v Photo Printer)"
+ Attribute "Product" "" "(HP Deskjet 5440 Photo Printer)"
+ Attribute "Product" "" "(HP Deskjet 5440xi Photo Printer)"
+ Attribute "Product" "" "(HP Deskjet 5442 Photo Printer)"
+ Attribute "Product" "" "(HP Deskjet 5443 Photo Printer)"
+ }
+ {
+ ModelName "HP Photosmart c5500 Series hpijs"
+ Attribute "NickName" "" "HP Photosmart c5500 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP PS c5500 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart c5500 series;DES:photosmart c5500 series;"
+ PCFileName "hp-photosmart_c5500_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart c5540 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c5550 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c5570 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c5580 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Deskjet 5552 hpijs"
+ Attribute "NickName" "" "HP Deskjet 5552 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 5552 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 5552;DES:deskjet 5552;"
+ PCFileName "hp-deskjet_5552-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 5552 Color Inkjet Printer)"
+ }
+ {
+ ModelName "HP Deskjet 5600 hpijs"
+ Attribute "NickName" "" "HP Deskjet 5600 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 5600 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 5600;DES:deskjet 5600;"
+ PCFileName "hp-deskjet_5600-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 5600 Color Inkjet Printer)"
+ }
+ {
+ ModelName "HP Deskjet 5650 hpijs"
+ Attribute "NickName" "" "HP Deskjet 5650 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 5650 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 5650;DES:deskjet 5650;"
+ PCFileName "hp-deskjet_5650-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 5650 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 5650w Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 5650v Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 5655 Color Inkjet Printer)"
+ }
+ {
+ ModelName "HP Deskjet 5652 hpijs"
+ Attribute "NickName" "" "HP Deskjet 5652 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 5652 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 5652;DES:deskjet 5652;"
+ PCFileName "hp-deskjet_5652-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 5652 Color Inkjet Printer)"
+ }
+ {
+ ModelName "HP Deskjet 5700 hpijs"
+ Attribute "NickName" "" "HP Deskjet 5700 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 5700 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 5700;DES:deskjet 5700;"
+ PCFileName "hp-deskjet_5700-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 5700 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 5740 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 5740xi Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 5743 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 5745 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 5748 Color Inkjet Printer)"
+ }
+ {
+ ModelName "HP Officejet j5700 Series hpijs"
+ Attribute "NickName" "" "HP Officejet j5700 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet j5700 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet j5700 series;DES:officejet j5700 series;"
+ PCFileName "hp-officejet_j5700_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet j5725 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet j5725 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet j5730 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet j5735 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet j5738 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet j5740 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet j5750 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet j5780 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet j5783 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet j5785 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet j5788 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet j5790 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Deskjet 5800 hpijs"
+ Attribute "NickName" "" "HP Deskjet 5800 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 5800 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 5800;DES:deskjet 5800;"
+ PCFileName "hp-deskjet_5800-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 5800 Color Inkjet Printer)"
+ }
+ {
+ ModelName "HP Deskjet 5850 hpijs"
+ Attribute "NickName" "" "HP Deskjet 5850 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 5850 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 5850;DES:deskjet 5850;"
+ PCFileName "hp-deskjet_5850-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 5850 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 5850w Color Inkjet Printer)"
+ }
+ {
+ ModelName "HP Deskjet 5900 Series hpijs"
+ Attribute "NickName" "" "HP Deskjet 5900 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 5900 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 5900 series;DES:deskjet 5900 series;"
+ PCFileName "hp-deskjet_5900_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 5938 Photo Printer)"
+ Attribute "Product" "" "(HP Deskjet 5940 Photo Printer)"
+ Attribute "Product" "" "(HP Deskjet 5940xi Photo Printer)"
+ Attribute "Product" "" "(HP Deskjet 5943 Photo Printer)"
+ }
+ {
+ ModelName "HP Photosmart c6100 Series hpijs"
+ Attribute "NickName" "" "HP Photosmart c6100 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP PS c6100 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart c6100 series;DES:photosmart c6100 series;"
+ PCFileName "hp-photosmart_c6100_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart c6150 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c6154 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c6170 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c6175 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c6180 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c6183 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c6185 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c6188 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c6190 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Photosmart d6100 Series hpijs"
+ Attribute "NickName" "" "HP Photosmart d6100 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP PS d6100 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart d6100 series;DES:photosmart d6100 series;"
+ PCFileName "hp-photosmart_d6100_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart d6160 Printer)"
+ Attribute "Product" "" "(HP Photosmart d6163 Printer)"
+ Attribute "Product" "" "(HP Photosmart d6168 Printer)"
+ }
+ {
+ ModelName "HP Officejet 6100 Series hpijs"
+ Attribute "NickName" "" "HP Officejet 6100 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet 6100 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet 6100 series;DES:officejet 6100 series;"
+ PCFileName "hp-officejet_6100_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet 6105 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 6110xi All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 6110v All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 6110 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet 6150 Series hpijs"
+ Attribute "NickName" "" "HP Officejet 6150 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet 6150 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet 6150 series;DES:officejet 6150 series;"
+ PCFileName "hp-officejet_6150_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet 6150 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet 6200 Series hpijs"
+ Attribute "NickName" "" "HP Officejet 6200 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet 6200 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet 6200 series;DES:officejet 6200 series;"
+ PCFileName "hp-officejet_6200_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet 6200 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 6203 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 6205 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 6208 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 6210xi All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 6210v All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 6210 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 6213 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 6215 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Photosmart c6200 Series hpijs"
+ Attribute "NickName" "" "HP Photosmart c6200 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP PS c6200 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart c6200 series;DES:photosmart c6200 series;"
+ PCFileName "hp-photosmart_c6200_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart c6240 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c6245 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c6250 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c6260 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c6263 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c6268 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c6270 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c6275 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c6280 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c6283 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c6285 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c6286 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c6288 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet 6300 Series hpijs"
+ Attribute "NickName" "" "HP Officejet 6300 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet 6300 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet 6300 series;DES:officejet 6300 series;"
+ PCFileName "hp-officejet_6300_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet 6301 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 6304 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 6305 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 6307 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 6308 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 6310 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 6310xi All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 6310v All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 6313 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 6315 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 6318 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet j6400 Series hpijs"
+ Attribute "NickName" "" "HP Officejet j6400 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet j6400 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet j6400 series;DES:officejet j6400 series;"
+ PCFileName "hp-officejet_j6400_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet j6405 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet j6410 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet j6413 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet j6415 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet j6424 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet j6450 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet j6480 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet j6488 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Deskjet 6500 hpijs"
+ Attribute "NickName" "" "HP Deskjet 6500 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 6500 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 6500;DES:deskjet 6500;"
+ PCFileName "hp-deskjet_6500-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 6500 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 6520 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 6520xi Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 6540d Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 6540 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 6540xi Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 6540dt Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 6543 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 6543d Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 6548 Color Inkjet Printer)"
+ }
+ {
+ ModelName "HP Deskjet 6600 hpijs"
+ Attribute "NickName" "" "HP Deskjet 6600 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 6600 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 6600;DES:deskjet 6600;"
+ PCFileName "hp-deskjet_6600-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 6600 Series Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 6620 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 6620xi Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 6623 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 6628 Color Inkjet Printer)"
+ }
+ {
+ ModelName "HP Deskjet 6800 hpijs"
+ Attribute "NickName" "" "HP Deskjet 6800 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 6800 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 6800;DES:deskjet 6800;"
+ PCFileName "hp-deskjet_6800-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 6800 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 6830v Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 6840xi Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 6840dt Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 6840 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 6843 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 6848 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 6850 Color Inkjet Printer)"
+ }
+ {
+ ModelName "HP Deskjet 6940 Series hpijs"
+ Attribute "NickName" "" "HP Deskjet 6940 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 6940 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 6940 series;DES:deskjet 6940 series;"
+ PCFileName "hp-deskjet_6940_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 6940 Printer)"
+ Attribute "Product" "" "(HP Deskjet 6940dt Printer)"
+ Attribute "Product" "" "(HP Deskjet 6943 Printer)"
+ }
+ {
+ ModelName "HP Deskjet 6980 Series hpijs"
+ Attribute "NickName" "" "HP Deskjet 6980 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 6980 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 6980 series;DES:deskjet 6980 series;"
+ PCFileName "hp-deskjet_6980_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 6980xi Printer)"
+ Attribute "Product" "" "(HP Deskjet 6980 Printer)"
+ Attribute "Product" "" "(HP Deskjet 6980dt Printer)"
+ Attribute "Product" "" "(HP Deskjet 6983 Printer)"
+ Attribute "Product" "" "(HP Deskjet 6988dt Printer)"
+ Attribute "Product" "" "(HP Deskjet 6988xi Printer)"
+ Attribute "Product" "" "(HP Deskjet 6988 Printer)"
+ }
+ {
+ ModelName "HP Photosmart c7100 Series hpijs"
+ Attribute "NickName" "" "HP Photosmart c7100 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP PS c7100 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart c7100 series;DES:photosmart c7100 series;"
+ PCFileName "hp-photosmart_c7100_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart c7150 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c7154 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c7170 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c7180 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c7183 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c7185 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c7188 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c7190 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Photosmart d7100 Series hpijs"
+ Attribute "NickName" "" "HP Photosmart d7100 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP PS d7100 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart d7100 series;DES:photosmart d7100 series;"
+ PCFileName "hp-photosmart_d7100_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart d7145 Printer)"
+ Attribute "Product" "" "(HP Photosmart d7155 Printer)"
+ Attribute "Product" "" "(HP Photosmart d7160 Printer)"
+ Attribute "Product" "" "(HP Photosmart d7163 Printer)"
+ Attribute "Product" "" "(HP Photosmart d7168 Printer)"
+ }
+ {
+ ModelName "HP Photosmart 7150 hpijs"
+ Attribute "NickName" "" "HP Photosmart 7150 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 7150 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 7150;DES:photosmart 7150;"
+ PCFileName "hp-photosmart_7150-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart 7150 Printer)"
+ Attribute "Product" "" "(HP Photosmart 7150v Printer)"
+ Attribute "Product" "" "(HP Photosmart 7150w Printer)"
+ }
+ {
+ ModelName "HP Photosmart 7150 hpijs"
+ Attribute "NickName" "" "HP Photosmart 7150 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 7150 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 7150~;DES:photosmart 7150~;"
+ PCFileName "hp-photosmart_7150-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart 7150 Series Printer)"
+ }
+ {
+ ModelName "HP Photosmart d7200 Series hpijs"
+ Attribute "NickName" "" "HP Photosmart d7200 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP PS d7200 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart d7200 series;DES:photosmart d7200 series;"
+ PCFileName "hp-photosmart_d7200_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart d7245 Printer)"
+ Attribute "Product" "" "(HP Photosmart d7255 Printer)"
+ Attribute "Product" "" "(HP Photosmart d7260 Printer)"
+ Attribute "Product" "" "(HP Photosmart d7263 Printer)"
+ Attribute "Product" "" "(HP Photosmart d7268 Printer)"
+ }
+ {
+ ModelName "HP Photosmart 7200 Series hpijs"
+ Attribute "NickName" "" "HP Photosmart 7200 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 7200 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 7200 series~;DES:photosmart 7200 series~;"
+ PCFileName "hp-photosmart_7200_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart 7260w Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 7260 Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 7260v Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 7268 Photo Printer)"
+ }
+ {
+ ModelName "HP Officejet 7200 Series hpijs"
+ Attribute "NickName" "" "HP Officejet 7200 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet 7200 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet 7200 series;DES:officejet 7200 series;"
+ PCFileName "hp-officejet_7200_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet 7205 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 7208 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 7210v All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 7210xi All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 7210 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 7213 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 7215 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Photosmart c7200 Series hpijs"
+ Attribute "NickName" "" "HP Photosmart c7200 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP PS c7200 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart c7200 series;DES:photosmart c7200 series;"
+ PCFileName "hp-photosmart_c7200_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart c7250 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c7275 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c7280 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c7283 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c7288 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Photosmart 7200 Series hpijs"
+ Attribute "NickName" "" "HP Photosmart 7200 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 7200 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 7200 series;DES:photosmart 7200 series;"
+ PCFileName "hp-photosmart_7200_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart 7260 Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 7260v Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 7260w Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 7268 Photo Printer)"
+ }
+ {
+ ModelName "HP Officejet 7300 Series hpijs"
+ Attribute "NickName" "" "HP Officejet 7300 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet 7300 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet 7300 series;DES:officejet 7300 series;"
+ PCFileName "hp-officejet_7300_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet 7310 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 7310xi All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 7313 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Photosmart d7300 Series hpijs"
+ Attribute "NickName" "" "HP Photosmart d7300 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP PS d7300 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart d7300 series;DES:photosmart d7300 series;"
+ PCFileName "hp-photosmart_d7300_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart d7345 Printer)"
+ Attribute "Product" "" "(HP Photosmart d7355 Printer)"
+ Attribute "Product" "" "(HP Photosmart d7360 Printer)"
+ Attribute "Product" "" "(HP Photosmart d7363 Printer)"
+ Attribute "Product" "" "(HP Photosmart d7368 Printer)"
+ }
+ {
+ ModelName "HP Photosmart 7345 hpijs"
+ Attribute "NickName" "" "HP Photosmart 7345 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 7345 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 7345;DES:photosmart 7345;"
+ PCFileName "hp-photosmart_7345-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart 7345 Printer)"
+ }
+ {
+ ModelName "HP Photosmart 7350 hpijs"
+ Attribute "NickName" "" "HP Photosmart 7350 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 7350 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 7350;DES:photosmart 7350;"
+ PCFileName "hp-photosmart_7350-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart 7350 Printer)"
+ Attribute "Product" "" "(HP Photosmart 7350v Printer)"
+ Attribute "Product" "" "(HP Photosmart 7350w Printer)"
+ }
+ {
+ ModelName "HP Photosmart 7350 hpijs"
+ Attribute "NickName" "" "HP Photosmart 7350 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 7350 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 7350~;DES:photosmart 7350~;"
+ PCFileName "hp-photosmart_7350-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart 7350 Series Printer)"
+ }
+ {
+ ModelName "HP Officejet 7400 Series hpijs"
+ Attribute "NickName" "" "HP Officejet 7400 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet 7400 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet 7400 series;DES:officejet 7400 series;"
+ PCFileName "hp-officejet_7400_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet 7408 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 7410 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 7410xi All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 7413 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Photosmart 7400 Series hpijs"
+ Attribute "NickName" "" "HP Photosmart 7400 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 7400 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 7400 series;DES:photosmart 7400 series;"
+ PCFileName "hp-photosmart_7400_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart 7450 Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 7450v Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 7450xi Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 7458 Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 7459 Photo Printer)"
+ }
+ {
+ ModelName "HP Photosmart d7400 Series hpijs"
+ Attribute "NickName" "" "HP Photosmart d7400 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP PS d7400 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart d7400 series;DES:photosmart d7400 series;"
+ PCFileName "hp-photosmart_d7400_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart d7460 Printer)"
+ Attribute "Product" "" "(HP Photosmart d7463 Printer)"
+ Attribute "Product" "" "(HP Photosmart d7468 Printer)"
+ }
+ {
+ ModelName "HP Photosmart 7550 hpijs"
+ Attribute "NickName" "" "HP Photosmart 7550 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 7550 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 7550;DES:photosmart 7550;"
+ PCFileName "hp-photosmart_7550-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart 7550 Printer)"
+ Attribute "Product" "" "(HP Photosmart 7550v Printer)"
+ Attribute "Product" "" "(HP Photosmart 7550w Printer)"
+ }
+ {
+ ModelName "HP Photosmart 7600 Series hpijs"
+ Attribute "NickName" "" "HP Photosmart 7600 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 7600 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 7600 series;DES:photosmart 7600 series;"
+ PCFileName "hp-photosmart_7600_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart 7655 Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 7660 Photo Printer)"
+ }
+ {
+ ModelName "HP Photosmart 7700 Series hpijs"
+ Attribute "NickName" "" "HP Photosmart 7700 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 7700 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 7700 series;DES:photosmart 7700 series;"
+ PCFileName "hp-photosmart_7700_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart 7755 Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 7760od Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 7760 Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 7760v Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 7760w Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 7762w Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 7762w Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 7762 Photo Printer)"
+ }
+ {
+ ModelName "HP Photosmart 7800 Series hpijs"
+ Attribute "NickName" "" "HP Photosmart 7800 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 7800 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 7800 series;DES:photosmart 7800 series;"
+ PCFileName "hp-photosmart_7800_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart 7830 Printer)"
+ Attribute "Product" "" "(HP Photosmart 7838 Printer)"
+ Attribute "Product" "" "(HP Photosmart 7850 Printer)"
+ Attribute "Product" "" "(HP Photosmart 7850v Printer)"
+ Attribute "Product" "" "(HP Photosmart 7850vxi Printer)"
+ Attribute "Product" "" "(HP Photosmart 7853 Printer)"
+ }
+ {
+ ModelName "HP Photosmart 7900 Series hpijs"
+ Attribute "NickName" "" "HP Photosmart 7900 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 7900 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 7900 series;DES:photosmart 7900 series;"
+ PCFileName "hp-photosmart_7900_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart 7960 Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 7960v Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 7960w Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 7960gp Photo Printer)"
+ }
+ {
+ ModelName "HP Photosmart 8000 Series hpijs"
+ Attribute "NickName" "" "HP Photosmart 8000 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 8000 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 8000 series;DES:photosmart 8000 series;"
+ PCFileName "hp-photosmart_8000_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart 8030 Printer)"
+ Attribute "Product" "" "(HP Photosmart 8038 Printer)"
+ Attribute "Product" "" "(HP Photosmart 8049 Printer)"
+ Attribute "Product" "" "(HP Photosmart 8050xi Printer)"
+ Attribute "Product" "" "(HP Photosmart 8050 Printer)"
+ Attribute "Product" "" "(HP Photosmart 8050v Printer)"
+ Attribute "Product" "" "(HP Photosmart 8053 Printer)"
+ }
+ {
+ ModelName "HP Photosmart 8100 Series hpijs"
+ Attribute "NickName" "" "HP Photosmart 8100 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 8100 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 8100 series;DES:photosmart 8100 series;"
+ PCFileName "hp-photosmart_8100_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart 8150 Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 8150v Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 8150xi Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 8153 Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 8158 Photo Printer)"
+ }
+ {
+ ModelName "HP Photosmart 8200 Series hpijs"
+ Attribute "NickName" "" "HP Photosmart 8200 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 8200 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 8200 series;DES:photosmart 8200 series;"
+ PCFileName "hp-photosmart_8200_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart 8230 Printer)"
+ Attribute "Product" "" "(HP Photosmart 8238 Printer)"
+ Attribute "Product" "" "(HP Photosmart 8250 Printer)"
+ Attribute "Product" "" "(HP Photosmart 8250xi Printer)"
+ Attribute "Product" "" "(HP Photosmart 8250v Printer)"
+ Attribute "Product" "" "(HP Photosmart 8253 Printer)"
+ }
+ {
+ ModelName "HP Photosmart 8400 Series hpijs"
+ Attribute "NickName" "" "HP Photosmart 8400 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 8400 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 8400 series;DES:photosmart 8400 series;"
+ PCFileName "hp-photosmart_8400_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart 8450gp Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 8450v Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 8450 Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 8450xi Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 8453 Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 8458 Photo Printer)"
+ }
+ // <%DJGenericVIP:NoEvenDuplex%>
+ {
+ ModelName "HP Photosmart c8100 Series hpijs"
+ Attribute "NickName" "" "HP Photosmart c8100 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP PS c8100 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart c8100 series;DES:photosmart c8100 series;"
+ PCFileName "hp-photosmart_c8100_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart c8150 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c8180 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c8183 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c8188 All-in-one Printer)"
+ }
+ {
+ // Large format SuperB paper support
+ CustomMedia "B4JIS/B4 (JIS)" 729.00 1033.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B4JIS" "%% FoomaticRIPOptionSetting: PageSize=B4JIS"
+ CustomMedia "Ledger/Ledger" 792.00 1224.00 14.40 36.00 14.40 9.00 "%% FoomaticRIPOptionSetting: PageSize=Ledger" "%% FoomaticRIPOptionSetting: PageSize=Ledger"
+ CustomMedia "SuperB/Super B" 936.00 1368.00 14.40 36.00 14.40 9.00 "%% FoomaticRIPOptionSetting: PageSize=SuperB" "%% FoomaticRIPOptionSetting: PageSize=SuperB"
+ CustomMedia "w774h1116/8K" 774.00 1116.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w774h1116" "%% FoomaticRIPOptionSetting: PageSize=w774h1116"
+ CustomMedia "A3/A3" 842.00 1190.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A3" "%% FoomaticRIPOptionSetting: PageSize=A3"
+ // <%DJGenericVIP:LargeFormatSuperB%>
+ {
+ ModelName "HP Officejet k7100 hpijs"
+ Attribute "NickName" "" "HP Officejet k7100 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet k7100 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet k7100;DES:officejet k7100;"
+ PCFileName "hp-officejet_k7100-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet k7100 Printer)"
+ Attribute "Product" "" "(HP Officejet k7103 Printer)"
+ Attribute "Product" "" "(HP Officejet k7108 Printer)"
+ }
+ {
+ ModelName "HP Deskjet 9600 hpijs"
+ Attribute "NickName" "" "HP Deskjet 9600 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 9600 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 9600;DES:deskjet 9600;"
+ PCFileName "hp-deskjet_9600-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 9650 Printer)"
+ Attribute "Product" "" "(HP Deskjet 9670 Printer)"
+ Attribute "Product" "" "(HP Deskjet 9680 Printer)"
+ Attribute "Product" "" "(HP Deskjet 9680gp Printer)"
+ }
+ {
+ ModelName "HP Deskjet 9800 hpijs"
+ Attribute "NickName" "" "HP Deskjet 9800 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 9800 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 9800;DES:deskjet 9800;"
+ PCFileName "hp-deskjet_9800-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 9800 Printer)"
+ Attribute "Product" "" "(HP Deskjet 9800d Printer)"
+ Attribute "Product" "" "(HP Deskjet 9803 Printer)"
+ Attribute "Product" "" "(HP Deskjet 9803d Printer)"
+ Attribute "Product" "" "(HP Deskjet 9808 Printer)"
+ Attribute "Product" "" "(HP Deskjet 9808d Printer)"
+ Attribute "Product" "" "(HP Deskjet 9860 Printer)"
+ Attribute "Product" "" "(HP Deskjet 9868 Printer)"
+ }
+ }
+} // end DJGenericVIP
+
+/////////////// DJGenericVIP with NoAutoTray
+{
+ Attribute "DefaultResolution" "" "1200dpi"
+
+ // Custom page sizes from 1x4in to SuperB
+ HWMargins 18 36 18 9
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 936 1368
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-DeskJet_5650 hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-DeskJet_5650" " -sDeviceManufacture&&
+r=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;deskjet 5600&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=300FastDraftCol&&
+orCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft.Gray" "Quality=300FastDra&&
+ftGrayscaleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=300ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal.Gray" "Quality=300Graysc&&
+aleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High" "Quality=600ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High.Gray" "Quality=600Grayscal&&
+eK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Photo" "Quality=1200PhotoCMYKFu&&
+llBleed"
+ Attribute "FoomaticRIPOption" "InputSlot" "enum CmdLine C"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Default" ",PS:MediaPosition=7"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=PhotoTray" ",PS:MediaPosition=6"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Upper" ",PS:MediaPosition=1"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Lower" ",PS:MediaPosition=4"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=CDDVDTray" ",PS:MediaPosition=14"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Envelope" ",PS:MediaPosition=3"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=LargeCapacity" ",PS:MediaPosition=&&
+5"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Manual" ",PS:MediaPosition=2"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=MPTray" ",PS:MediaPosition=8"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=PhotoTearOff" " -dDEVICEWIDTHPOINTS&&
+=288 -dDEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6TearOff" " -dDEVICEWIDTHPOINTS=29&&
+7 -dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD120" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ /////////// Large format paper support
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B4JIS" " -dDEVICEWIDTHPOINTS=729 -d&&
+DEVICEHEIGHTPOINTS=1033"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Ledger" " -dDEVICEWIDTHPOINTS=792 -&&
+dDEVICEHEIGHTPOINTS=1224"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=SuperB" " -dDEVICEWIDTHPOINTS=936 -&&
+dDEVICEHEIGHTPOINTS=1368"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w774h1116" " -dDEVICEWIDTHPOINTS=77&&
+4 -dDEVICEHEIGHTPOINTS=1116"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A3" " -dDEVICEWIDTHPOINTS=842 -dDEV&&
+ICEHEIGHTPOINTS=1190"
+ Attribute "FoomaticRIPOption" "Duplex" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexNoTumble" " -dDuplex=true -dTum&&
+ble=false"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexTumble" " -dDuplex=true -dTumbl&&
+e=true"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=None" " -dDuplex=false"
+ Attribute "FoomaticRIPOption" "DryTime" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Zero" ""
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Five" ",DryTime=5"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Ten" ",DryTime=10"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Fifteen" ",DryTime=15"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Twenty" ",DryTime=20"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=TwentyFive" ",DryTime=25"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Thirty" ",DryTime=30"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYK" " -r300 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYKFullBleed" " -r300 -sIjs&&
+Params=Quality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:FullBleed=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftColorCMYK" " -r300 -sIjsPara&&
+ms=Quality:Quality=1,Quality:ColorMode=2,Quality:MediaType=0,Quality:P&&
+enSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftGrayscaleK" " -r300 -sIjs&&
+Params=Quality:Quality=1,Quality:ColorMode=0,Quality:MediaType=0,Quali&&
+ty:PenSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300FastDraftColorCMYK" " -r300 -sIjs&&
+Params=Quality:Quality=4,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:SpeedMech=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300FastDraftGrayscaleK" " -r300 -&&
+sIjsParams=Quality:Quality=4,Quality:ColorMode=0,Quality:MediaType=0,Q&&
+uality:PenSet=2,Quality:SpeedMech=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300GrayscaleK" " -r300 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMYK" " -r600 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMYKFullBleed" " -r600 -sIjs&&
+Params=Quality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:FullBleed=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600GrayscaleK" " -r600 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=1200PhotoCMYK" " -r1200 -sIjsParams=&&
+Quality:Quality=3,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenS&&
+et=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=1200PhotoCMYKFullBleed" " -r1200 -sI&&
+jsParams=Quality:Quality=3,Quality:ColorMode=2,Quality:MediaType=2,Qua&&
+lity:PenSet=2,Quality:FullBleed=1"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ Choice "Draft.Gray/Draft Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft.Gray"
+ *Choice "Normal/Normal (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "Normal.Gray/Normal Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal.Gray"
+ Choice "High/High Quality (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=High"
+ Choice "High.Gray/High Quality Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=High.Gray"
+ Choice "Photo/Photo (on photo paper)" "%% FoomaticRIPOptionSetting: PrintoutMode=Photo"
+ Option "InputSlot/Media Source" PickOne AnySetup 100.0
+ Choice "PhotoTray/Photo Tray" "%% FoomaticRIPOptionSetting: InputSlot=PhotoTray"
+ *Choice "Upper/Upper Tray" "%% FoomaticRIPOptionSetting: InputSlot=Upper"
+ Choice "Lower/Lower Tray" "%% FoomaticRIPOptionSetting: InputSlot=Lower"
+ Choice "CDDVDTray/CD or DVD Tray" "%% FoomaticRIPOptionSetting: InputSlot=CDDVDTray"
+ Choice "Envelope/Envelope Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Envelope"
+ Choice "LargeCapacity/Large Capacity Tray" "%% FoomaticRIPOptionSetting: InputSlot=LargeCapacity"
+ Choice "Manual/Manual Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Manual"
+ Choice "MPTray/Multi Purpose Tray" "%% FoomaticRIPOptionSetting: InputSlot=MPTray"
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 120.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "%% FoomaticRIPOptionSetting: Duplex=DuplexNoTumble"
+ Choice "DuplexTumble/Short Edge (Flip)" "%% FoomaticRIPOptionSetting: Duplex=DuplexTumble"
+ *Choice "None/Off" "%% FoomaticRIPOptionSetting: Duplex=None"
+ Option "DryTime/Additional Dry Time" PickOne AnySetup 120.0
+ *Choice "Zero/Printer Default" "%% FoomaticRIPOptionSetting: DryTime=Zero"
+ Choice "Five/5 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Five"
+ Choice "Ten/10 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Ten"
+ Choice "Fifteen/15 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Fifteen"
+ Choice "Twenty/20 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Twenty"
+ Choice "TwentyFive/25 Seconds" "%% FoomaticRIPOptionSetting: DryTime=TwentyFive"
+ Choice "Thirty/30 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Thirty"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "300ColorCMYK/300 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYK"
+ Choice "300ColorCMYKFullBleed/300 dpi, Color, Full Bleed, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYKFullBleed"
+ Choice "300DraftColorCMYK/300 dpi, Draft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftColorCMYK"
+ Choice "300DraftGrayscaleK/300 dpi, Draft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftGrayscaleK"
+ Choice "300FastDraftColorCMYK/300 dpi, FastDraft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300FastDraftColorCMYK"
+ Choice "300FastDraftGrayscaleK/300 dpi, FastDraft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300FastDraftGrayscaleK"
+ Choice "300GrayscaleK/300 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300GrayscaleK"
+ Choice "600ColorCMYK/600 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMYK"
+ Choice "600ColorCMYKFullBleed/600 dpi, Color, Full Bleed, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMYKFullBleed"
+ Choice "600GrayscaleK/600 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=600GrayscaleK"
+ Choice "1200PhotoCMYK/1200 dpi, Photo, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=1200PhotoCMYK"
+ Choice "1200PhotoCMYKFullBleed/1200 dpi, Photo, Full Bleed, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=1200PhotoCMYKFullBleed"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 9.72 36.00 9.72 9.00 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo or 5x7 inch index card" 360.00 504.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "PhotoTearOff/Photo with tear-off tab" 288.00 432.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff" "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "A6TearOff/A6 with tear-off tab" 297.00 420.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=A6TearOff" "%% FoomaticRIPOptionSetting: PageSize=A6TearOff"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "CDDVD120/CD or DVD 120 mm" 360.00 360.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD120" "%% FoomaticRIPOptionSetting: PageSize=CDDVD120"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+
+ {
+ // Large format SuperB paper support
+ CustomMedia "B4JIS/B4 (JIS)" 729.00 1033.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B4JIS" "%% FoomaticRIPOptionSetting: PageSize=B4JIS"
+ CustomMedia "Ledger/Ledger" 792.00 1224.00 14.40 36.00 14.40 9.00 "%% FoomaticRIPOptionSetting: PageSize=Ledger" "%% FoomaticRIPOptionSetting: PageSize=Ledger"
+ CustomMedia "SuperB/Super B" 936.00 1368.00 14.40 36.00 14.40 9.00 "%% FoomaticRIPOptionSetting: PageSize=SuperB" "%% FoomaticRIPOptionSetting: PageSize=SuperB"
+ CustomMedia "w774h1116/8K" 774.00 1116.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w774h1116" "%% FoomaticRIPOptionSetting: PageSize=w774h1116"
+ CustomMedia "A3/A3" 842.00 1190.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A3" "%% FoomaticRIPOptionSetting: PageSize=A3"
+ // <%DJGenericVIP:LargeFormatSuperB:NoAutoTray%>
+ {
+ ModelName "HP Photosmart 8700 Series hpijs"
+ Attribute "NickName" "" "HP Photosmart 8700 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 8700 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 8700 series;DES:photosmart 8700 series;"
+ PCFileName "hp-photosmart_8700_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart 8750 Professional Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 8750xi Professional Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 8750gp Professional Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 8753 Professional Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 8758 Professional Photo Printer)"
+ }
+ }
+} // end DJGenericVIP with NoAutoTray
+
+////////////// OJProKx50 and DJGenericVIP without full bleed
+{
+ Attribute "DefaultResolution" "" "1200dpi"
+
+ // Custom page sizes from 1x4in to SuperB
+ HWMargins 18 36 18 9
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 936 1368
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-Business_Inkjet_1000 hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-Business_Inkjet_1000" " -sDeviceMan&&
+ufacturer=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;Officejet Pro K5400&&
+&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=300FastDraftCol&&
+orCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft.Gray" "Quality=300FastDra&&
+ftGrayscaleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=300ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal.Gray" "Quality=300Graysc&&
+aleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High" "Quality=600ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High.Gray" "Quality=600Grayscal&&
+eK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Photo" "Quality=600PhotoCMYK"
+
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=PhotoBest" "Quality=1200PhotoCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=PhotoNormal" "Quality=600PhotoNormalCMYK"
+
+ Attribute "FoomaticRIPOption" "InputSlot" "enum CmdLine C"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Default" ",PS:MediaPosition=7"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=PhotoTray" ",PS:MediaPosition=6"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Upper" ",PS:MediaPosition=1"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Lower" ",PS:MediaPosition=4"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=CDDVDTray" ",PS:MediaPosition=14"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Envelope" ",PS:MediaPosition=3"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=LargeCapacity" ",PS:MediaPosition=&&
+5"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Manual" ",PS:MediaPosition=2"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=MPTray" ",PS:MediaPosition=8"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=PhotoTearOff" " -dDEVICEWIDTHPOINTS&&
+=288 -dDEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6TearOff" " -dDEVICEWIDTHPOINTS=29&&
+7 -dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD120" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ //////////// Large format paper support
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B4JIS" " -dDEVICEWIDTHPOINTS=729 -d&&
+DEVICEHEIGHTPOINTS=1033"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Ledger" " -dDEVICEWIDTHPOINTS=792 -&&
+dDEVICEHEIGHTPOINTS=1224"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=SuperB" " -dDEVICEWIDTHPOINTS=936 -&&
+dDEVICEHEIGHTPOINTS=1368"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w774h1116" " -dDEVICEWIDTHPOINTS=77&&
+4 -dDEVICEHEIGHTPOINTS=1116"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A3" " -dDEVICEWIDTHPOINTS=842 -dDEV&&
+ICEHEIGHTPOINTS=1190"
+ Attribute "FoomaticRIPOption" "Duplex" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexNoTumble" " -dDuplex=true -dTum&&
+ble=false"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexTumble" " -dDuplex=true -dTumbl&&
+e=true"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=None" " -dDuplex=false"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYK" " -r300 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftColorCMYK" " -r300 -sIjsPara&&
+ms=Quality:Quality=1,Quality:ColorMode=2,Quality:MediaType=0,Quality:P&&
+enSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftGrayscaleK" " -r300 -sIjs&&
+Params=Quality:Quality=1,Quality:ColorMode=0,Quality:MediaType=0,Quali&&
+ty:PenSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300FastDraftColorCMYK" " -r300 -sIjs&&
+Params=Quality:Quality=4,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:SpeedMech=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300FastDraftGrayscaleK" " -r300 -&&
+sIjsParams=Quality:Quality=4,Quality:ColorMode=0,Quality:MediaType=0,Q&&
+uality:PenSet=2,Quality:SpeedMech=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300GrayscaleK" " -r300 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMYK" " -r600 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600GrayscaleK" " -r600 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600PhotoCMYK" " -r600 -sIjsParams=Qu&&
+ality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600PhotoNormalCMYK" " -r600 -sIjsPar&&
+ams=Quality:Quality=0,Quality:ColorMode=2,Quality:MediaType=2,Quality:&&
+PenSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=1200PhotoCMYK" " -r1200 -sIjsParams=&&
+Quality:Quality=3,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenS&&
+et=2"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ Choice "Draft.Gray/Draft Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft.Gray"
+ *Choice "Normal/Normal (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "Normal.Gray/Normal Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal.Gray"
+ Choice "High/High Quality (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=High"
+ Choice "High.Gray/High Quality Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=High.Gray"
+ Choice "Photo/Photo (on photo paper)" "%% FoomaticRIPOptionSetting: PrintoutMode=Photo"
+ Choice "PhotoBest/Best Quality (color on photo paper)" "%% FoomaticRIPOptionSetting: PrintoutMode=PhotoBest"
+ Choice "PhotoNormal/Normal Quality (color on photo paper)" "%% FoomaticRIPOptionSetting: PrintoutMode=PhotoNormal"
+ Option "InputSlot/Media Source" PickOne AnySetup 100.0
+ *Choice "Default/Printer default" "%% FoomaticRIPOptionSetting: InputSlot=Default"
+ Choice "PhotoTray/Photo Tray" "%% FoomaticRIPOptionSetting: InputSlot=PhotoTray"
+ Choice "Upper/Upper Tray" "%% FoomaticRIPOptionSetting: InputSlot=Upper"
+ Choice "Lower/Lower Tray" "%% FoomaticRIPOptionSetting: InputSlot=Lower"
+ Choice "CDDVDTray/CD or DVD Tray" "%% FoomaticRIPOptionSetting: InputSlot=CDDVDTray"
+ Choice "Envelope/Envelope Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Envelope"
+ Choice "LargeCapacity/Large Capacity Tray" "%% FoomaticRIPOptionSetting: InputSlot=LargeCapacity"
+ Choice "Manual/Manual Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Manual"
+ Choice "MPTray/Multi Purpose Tray" "%% FoomaticRIPOptionSetting: InputSlot=MPTray"
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 120.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "%% FoomaticRIPOptionSetting: Duplex=DuplexNoTumble"
+ Choice "DuplexTumble/Short Edge (Flip)" "%% FoomaticRIPOptionSetting: Duplex=DuplexTumble"
+ *Choice "None/Off" "%% FoomaticRIPOptionSetting: Duplex=None"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "300ColorCMYK/300 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYK"
+ Choice "300DraftColorCMYK/300 dpi, Draft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftColorCMYK"
+ Choice "300DraftGrayscaleK/300 dpi, Draft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftGrayscaleK"
+ Choice "300FastDraftColorCMYK/300 dpi, FastDraft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300FastDraftColorCMYK"
+ Choice "300FastDraftGrayscaleK/300 dpi, FastDraft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300FastDraftGrayscaleK"
+ Choice "300GrayscaleK/300 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300GrayscaleK"
+ Choice "600ColorCMYK/600 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMYK"
+ Choice "600GrayscaleK/600 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=600GrayscaleK"
+ Choice "600PhotoCMYK/600 dpi, Photo, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=600PhotoCMYK"
+ Choice "600PhotoNormalCMYK/600 dpi, Color, Black + Color Cartr., Photo Paper, Normal" "%% FoomaticRIPOptionSetting: Quality=600PhotoNormalCMYK"
+ Choice "1200PhotoCMYK/1200 dpi, Photo, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=1200PhotoCMYK"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 9.72 36.00 9.72 9.00 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo or 5x7 inch index card" 360.00 504.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "PhotoTearOff/Photo with tear-off tab" 288.00 432.00 9.00 9.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff" "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "A6TearOff/A6 with tear-off tab" 297.00 420.00 9.00 0.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A6TearOff" "%% FoomaticRIPOptionSetting: PageSize=A6TearOff"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "CDDVD120/CD or DVD 120 mm" 360.00 360.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD120" "%% FoomaticRIPOptionSetting: PageSize=CDDVD120"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+ // <%DJGenericVIP:NoFullBleed%>
+ {
+ ModelName "HP Business Inkjet 1000 hpijs"
+ Attribute "NickName" "" "HP Business Inkjet 1000 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Business Inkjet 1000 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp business inkjet 1000;DES:hp business inkjet 1000;"
+ PCFileName "hp-business_inkjet_1000-hpijs.ppd"
+ Attribute "Product" "" "(HP Business Inkjet 1000 Printer)"
+ }
+ {
+ ModelName "HP Business Inkjet 1100 hpijs"
+ Attribute "NickName" "" "HP Business Inkjet 1100 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Business Inkjet 1100 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp business inkjet 1100;DES:hp business inkjet 1100;"
+ PCFileName "hp-business_inkjet_1100-hpijs.ppd"
+ Attribute "Product" "" "(HP Business Inkjet 1100d Printer)"
+ Attribute "Product" "" "(HP Business Inkjet 1100dtn Printer)"
+ Attribute "Product" "" "(HP Business Inkjet 1100 Printer)"
+ }
+ {
+ ModelName "HP Business Inkjet 1200 hpijs"
+ Attribute "NickName" "" "HP Business Inkjet 1200 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Business Inkjet 1200 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:business inkjet 1200;DES:business inkjet 1200;"
+ PCFileName "hp-business_inkjet_1200-hpijs.ppd"
+ Attribute "Product" "" "(HP Business Inkjet 1200dtn Printer)"
+ Attribute "Product" "" "(HP Business Inkjet 1200dn Printer)"
+ Attribute "Product" "" "(HP Business Inkjet 1200dtwn Printer)"
+ Attribute "Product" "" "(HP Business Inkjet 1200d Printer)"
+ Attribute "Product" "" "(HP Business Inkjet 1200 Printer)"
+ }
+ {
+ ModelName "HP Officejet Pro k5300 hpijs"
+ Attribute "NickName" "" "HP Officejet Pro k5300 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet Pro k5300 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet pro k5300;DES:officejet pro k5300;"
+ PCFileName "hp-officejet_pro_k5300-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet Pro k5300 Printer)"
+ }
+ {
+ ModelName "HP Officejet Pro k5400 hpijs"
+ Attribute "NickName" "" "HP Officejet Pro k5400 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet Pro k5400 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet pro k5400;DES:officejet pro k5400;"
+ PCFileName "hp-officejet_pro_k5400-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet Pro k5400dn Printer)"
+ Attribute "Product" "" "(HP Officejet Pro k5400dtn Printer)"
+ Attribute "Product" "" "(HP Officejet Pro k5400n Printer)"
+ Attribute "Product" "" "(HP Officejet Pro k5400 Printer)"
+ Attribute "Product" "" "(HP Officejet Pro k5400z Printer)"
+ }
+ // <%OJProKx50:NoFullBleed%>
+ {
+ ModelName "HP Officejet Pro k550 hpijs"
+ Attribute "NickName" "" "HP Officejet Pro k550 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet Pro k550 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet pro k550;DES:officejet pro k550;"
+ PCFileName "hp-officejet_pro_k550-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet Pro k550dtwn Printer)"
+ Attribute "Product" "" "(HP Officejet Pro k550dtn Printer)"
+ Attribute "Product" "" "(HP Officejet Pro k550 Printer)"
+ Attribute "Product" "" "(HP Officejet Pro k550xi Printer)"
+ }
+ {
+ ModelName "HP Officejet Pro l7300 hpijs"
+ Attribute "NickName" "" "HP Officejet Pro l7300 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet Pro l7300 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet pro l7300;DES:officejet pro l7300;"
+ PCFileName "hp-officejet_pro_l7300-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet Pro l7300 Series All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet Pro l7380 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet Pro l7400 hpijs"
+ Attribute "NickName" "" "HP Officejet Pro l7400 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet Pro l7400 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet pro l7400;DES:officejet pro l7400;"
+ PCFileName "hp-officejet_pro_l7400-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet Pro l7480 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet Pro l7500 hpijs"
+ Attribute "NickName" "" "HP Officejet Pro l7500 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet Pro l7500 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet pro l7500;DES:officejet pro l7500;"
+ PCFileName "hp-officejet_pro_l7500-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet Pro l7500 Series All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet Pro l7550 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet Pro l7555 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet Pro l7580 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet Pro l7590 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet Pro l7600 hpijs"
+ Attribute "NickName" "" "HP Officejet Pro l7600 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet Pro l7600 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet pro l7600;DES:officejet pro l7600;"
+ PCFileName "hp-officejet_pro_l7600-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet Pro l7600 Series All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet Pro l7650 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet Pro l7680 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet Pro l7681 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet Pro l7700 hpijs"
+ Attribute "NickName" "" "HP Officejet Pro l7700 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet Pro l7700 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet pro l7700;DES:officejet pro l7700;"
+ PCFileName "hp-officejet_pro_l7700-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet Pro l7700 Series All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet Pro l7710 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet Pro l7750 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet Pro l7780 All-in-one Printer)"
+ }
+ {
+ // Large format SuperB paper support
+ CustomMedia "B4JIS/B4 (JIS)" 729.00 1033.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B4JIS" "%% FoomaticRIPOptionSetting: PageSize=B4JIS"
+ CustomMedia "Ledger/Ledger" 792.00 1224.00 14.40 36.00 14.40 9.00 "%% FoomaticRIPOptionSetting: PageSize=Ledger" "%% FoomaticRIPOptionSetting: PageSize=Ledger"
+ CustomMedia "SuperB/Super B" 936.00 1368.00 14.40 36.00 14.40 9.00 "%% FoomaticRIPOptionSetting: PageSize=SuperB" "%% FoomaticRIPOptionSetting: PageSize=SuperB"
+ CustomMedia "w774h1116/8K" 774.00 1116.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w774h1116" "%% FoomaticRIPOptionSetting: PageSize=w774h1116"
+ CustomMedia "A3/A3" 842.00 1190.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A3" "%% FoomaticRIPOptionSetting: PageSize=A3"
+ // <%DJGenericVIP:LargeFormatSuperB:NoFullBleed%>
+ {
+ ModelName "HP Officejet Pro k8600 hpijs"
+ Attribute "NickName" "" "HP Officejet Pro k8600 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet Pro k8600 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet pro k8600;DES:officejet pro k8600;"
+ PCFileName "hp-officejet_pro_k8600-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet Pro k8600 Color Printer)"
+ Attribute "Product" "" "(HP Officejet Pro k8600dn Color Printer)"
+ }
+ // <%OJProKx50:LargeFormatSuperB:NoFullBleed%>
+ {
+ ModelName "HP Officejet Pro k850 hpijs"
+ Attribute "NickName" "" "HP Officejet Pro k850 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet Pro k850 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet pro k850;DES:officejet pro k850;"
+ PCFileName "hp-officejet_pro_k850-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet Pro k850 Printer)"
+ Attribute "Product" "" "(HP Officejet Pro k850dn Printer)"
+ }
+ }
+} // end OJProKx50 and DJGenericVIP without full bleed
+
+///////////////// DJ3320
+{
+ Attribute "DefaultResolution" "" "600dpi"
+
+ // Custom page sizes from 1x4in to Legal
+ HWMargins 18 36 18 9
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 8.5in 14in
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-DeskJet_3320 hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-DeskJet_3320" " -sDeviceManufacture&&
+r=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;deskjet 3320&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=300DraftColorCM&&
+Y"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft.Gray" "Quality=300DraftGr&&
+ayscaleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=300ColorCMY"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal.Gray" "Quality=300Graysc&&
+aleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High" "Quality=600ColorCMY"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High.Gray" "Quality=600Grayscal&&
+eK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Photo" "Quality=600PhotoCMY"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=PhotoTearOff" " -dDEVICEWIDTHPOINTS&&
+=288 -dDEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6TearOff" " -dDEVICEWIDTHPOINTS=29&&
+7 -dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD120" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMY" " -r300 -sIjsParams=Qua&&
+lity:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet=&&
+1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYK" " -r300 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftColorCMY" " -r300 -sIjsParam&&
+s=Quality:Quality=1,Quality:ColorMode=2,Quality:MediaType=0,Quality:Pe&&
+nSet=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftColorCMYK" " -r300 -sIjsPara&&
+ms=Quality:Quality=1,Quality:ColorMode=2,Quality:MediaType=0,Quality:P&&
+enSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftGrayscaleK" " -r300 -sIjsPar&&
+ams=Quality:Quality=1,Quality:ColorMode=0,Quality:MediaType=0,Quality:&&
+PenSet=0"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300GrayscaleK" " -r300 -sIjsParams=Q&&
+uality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:PenSe&&
+t=0"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300PhotoCMY" " -r300 -sIjsParams=Qua&&
+lity:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenSet=&&
+1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300PhotoCMYK" " -r300 -sIjsParams=Qu&&
+ality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMY" " -r600 -sIjsParams=Qua&&
+lity:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet=&&
+1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMYK" " -r600 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600GrayscaleK" " -r600 -sIjsParams=Q&&
+uality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:PenSe&&
+t=0"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600PhotoCMY" " -r600 -sIjsParams=Qua&&
+lity:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenSet=&&
+1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600PhotoCMYK" " -r600 -sIjsParams=Qu&&
+ality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenSet&&
+=2"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft (Color cartridge)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ Choice "Draft.Gray/Draft Grayscale (Black cartridge)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft.Gray"
+ *Choice "Normal/Normal (Color cartridge)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "Normal.Gray/Normal Grayscale (Black cartridge)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal.Gray"
+ Choice "High/High Quality (Color cartridge)" "%% FoomaticRIPOptionSetting: PrintoutMode=High"
+ Choice "High.Gray/High Quality Grayscale (Black cartridge)" "%% FoomaticRIPOptionSetting: PrintoutMode=High.Gray"
+ Choice "Photo/Photo (Color cartridge, on photo paper)" "%% FoomaticRIPOptionSetting: PrintoutMode=Photo"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "300ColorCMY/300 dpi, Color, Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMY"
+ Choice "300ColorCMYK/300 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYK"
+ Choice "300DraftColorCMY/300 dpi, Draft, Color, Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftColorCMY"
+ Choice "300DraftColorCMYK/300 dpi, Draft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftColorCMYK"
+ Choice "300DraftGrayscaleK/300 dpi, Draft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftGrayscaleK"
+ Choice "300GrayscaleK/300 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300GrayscaleK"
+ Choice "300PhotoCMY/300 dpi, Photo, Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=300PhotoCMY"
+ Choice "300PhotoCMYK/300 dpi, Photo, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=300PhotoCMYK"
+ Choice "600ColorCMY/600 dpi, Color, Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMY"
+ Choice "600ColorCMYK/600 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMYK"
+ Choice "600GrayscaleK/600 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=600GrayscaleK"
+ Choice "600PhotoCMY/600 dpi, Photo, Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=600PhotoCMY"
+ Choice "600PhotoCMYK/600 dpi, Photo, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=600PhotoCMYK"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 9.72 36.00 9.72 9.00 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo or 5x7 inch index card" 360.00 504.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "PhotoTearOff/Photo with tear-off tab" 288.00 432.00 9.00 9.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff" "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "A6TearOff/A6 with tear-off tab" 297.00 420.00 9.00 0.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A6TearOff" "%% FoomaticRIPOptionSetting: PageSize=A6TearOff"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "CDDVD120/CD or DVD 120 mm" 360.00 360.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD120" "%% FoomaticRIPOptionSetting: PageSize=CDDVD120"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+ // <%DJ3320:Normal%>
+ {
+ ModelName "HP PSC 1000 Series hpijs"
+ Attribute "NickName" "" "HP PSC 1000 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP PSC 1000 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:psc 1000 series;DES:psc 1000 series;"
+ PCFileName "hp-psc_1000_series-hpijs.ppd"
+ Attribute "Product" "" "(HP PSC 1110 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1110v All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1118 All-in-one Printer)"
+ }
+ {
+ ModelName "HP PSC 1100 Series hpijs"
+ Attribute "NickName" "" "HP PSC 1100 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP PSC 1100 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:psc 1100 series;DES:psc 1100 series;"
+ PCFileName "hp-psc_1100_series-hpijs.ppd"
+ Attribute "Product" "" "(HP PSC 1110 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1110v All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1118 All-in-one Printer)"
+ }
+ {
+ ModelName "HP PSC 1200 Series hpijs"
+ Attribute "NickName" "" "HP PSC 1200 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP PSC 1200 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:psc 1200 series;DES:psc 1200 series;"
+ PCFileName "hp-psc_1200_series-hpijs.ppd"
+ Attribute "Product" "" "(HP PSC 1200 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1205 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1209 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1210 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1210xi All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1210v All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1213 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1215 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1216 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1217 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1218 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1219 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Deskjet d1300 Series hpijs"
+ Attribute "NickName" "" "HP Deskjet d1300 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet d1300 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet d1300 series;DES:deskjet d1300 series;"
+ PCFileName "hp-deskjet_d1300_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet d1311 Printer)"
+ Attribute "Product" "" "(HP Deskjet d1320 Printer)"
+ Attribute "Product" "" "(HP Deskjet d1330 Printer)"
+ Attribute "Product" "" "(HP Deskjet d1341 Printer)"
+ Attribute "Product" "" "(HP Deskjet d1360 Printer)"
+ Attribute "Product" "" "(HP Deskjet d1368 Printer)"
+ }
+ {
+ ModelName "HP Deskjet d1400 Series hpijs"
+ Attribute "NickName" "" "HP Deskjet d1400 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet d1400 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet d1400 series;DES:deskjet d1400 series;"
+ PCFileName "hp-deskjet_d1400_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet d1415 Printer)"
+ Attribute "Product" "" "(HP Deskjet d1420 Printer)"
+ Attribute "Product" "" "(HP Deskjet d1430 Printer)"
+ Attribute "Product" "" "(HP Deskjet d1445 Printer)"
+ Attribute "Product" "" "(HP Deskjet d1455 Printer)"
+ Attribute "Product" "" "(HP Deskjet d1460 Printer)"
+ Attribute "Product" "" "(HP Deskjet d1468 Printer)"
+ Attribute "Product" "" "(HP Deskjet d1470 Printer)"
+ }
+ {
+ ModelName "HP Deskjet d1500 Series hpijs"
+ Attribute "NickName" "" "HP Deskjet d1500 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet d1500 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet d1500 series;DES:deskjet d1500 series;"
+ PCFileName "hp-deskjet_d1500_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet d1520 Printer)"
+ Attribute "Product" "" "(HP Deskjet d1530 Printer)"
+ Attribute "Product" "" "(HP Deskjet d1550 Printer)"
+ Attribute "Product" "" "(HP Deskjet d1555 Printer)"
+ Attribute "Product" "" "(HP Deskjet d1558 Printer)"
+ Attribute "Product" "" "(HP Deskjet d1560 Printer)"
+ Attribute "Product" "" "(HP Deskjet d1568 Printer)"
+ }
+ {
+ ModelName "HP Deskjet f2100 Series hpijs"
+ Attribute "NickName" "" "HP Deskjet f2100 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet f2100 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet f2100 series;DES:deskjet f2100 series;"
+ PCFileName "hp-deskjet_f2100_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet f2110 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f2120 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f2128 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f2140 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f2179 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f2180 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f2185 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f2187 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f2188 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Deskjet f2200 Series hpijs"
+ Attribute "NickName" "" "HP Deskjet f2200 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet f2200 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet f2200 series;DES:deskjet f2200 series;"
+ PCFileName "hp-deskjet_f2200_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet f2210 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f2212 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f2214 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f2224 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f2235 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f2238 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f2240 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f2250 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f2275 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f2276 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f2280 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f2288 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f2290 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Deskjet 3320 hpijs"
+ Attribute "NickName" "" "HP Deskjet 3320 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 3320 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 3320;DES:deskjet 3320;"
+ PCFileName "hp-deskjet_3320-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 3320v Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3320 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3322 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3323 Color Inkjet Printer)"
+ }
+ {
+ ModelName "HP Deskjet 3325 hpijs"
+ Attribute "NickName" "" "HP Deskjet 3325 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 3325 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 3325;DES:deskjet 3325;"
+ PCFileName "hp-deskjet_3325-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 3325 Printer/scanjet 3530c)"
+ }
+ {
+ ModelName "HP Deskjet 3500 hpijs"
+ Attribute "NickName" "" "HP Deskjet 3500 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 3500 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 3500;DES:deskjet 3500;"
+ PCFileName "hp-deskjet_3500-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 3500 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3520w Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3520 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3520v Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3535 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3538 Color Inkjet Printer)"
+ }
+ {
+ ModelName "HP Deskjet 3550 hpijs"
+ Attribute "NickName" "" "HP Deskjet 3550 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 3550 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 3550;DES:deskjet 3550;"
+ PCFileName "hp-deskjet_3550-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 3550 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3550v Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3550w Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3558 Color Inkjet Printer)"
+ }
+ {
+ ModelName "HP Deskjet 3740 hpijs"
+ Attribute "NickName" "" "HP Deskjet 3740 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 3740 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 3740;DES:deskjet 3740;"
+ PCFileName "hp-deskjet_3740-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 3740 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3743 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3744 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3745 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3745v Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3747 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3748 Color Inkjet Printer)"
+ }
+ {
+ ModelName "HP Deskjet 3900 hpijs"
+ Attribute "NickName" "" "HP Deskjet 3900 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 3900 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 3900;DES:deskjet 3900;"
+ PCFileName "hp-deskjet_3900-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 3900 Color Inkjet Printer)"
+ }
+ {
+ ModelName "HP Deskjet 3910 hpijs"
+ Attribute "NickName" "" "HP Deskjet 3910 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 3910 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 3910;DES:deskjet 3910;"
+ PCFileName "hp-deskjet_3910-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 3910 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3915 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3918 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3930v Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3930 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3938 Color Inkjet Printer)"
+ }
+ {
+ ModelName "HP Deskjet 3920 hpijs"
+ Attribute "NickName" "" "HP Deskjet 3920 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 3920 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 3920;DES:deskjet 3920;"
+ PCFileName "hp-deskjet_3920-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 3920 Color Inkjet Printer)"
+ }
+ {
+ ModelName "HP Deskjet 3940 hpijs"
+ Attribute "NickName" "" "HP Deskjet 3940 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 3940 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 3940;DES:deskjet 3940;"
+ PCFileName "hp-deskjet_3940-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 3940 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3940v Color Inkjet Printer)"
+ }
+ {
+ ModelName "HP Officejet 4100 Series hpijs"
+ Attribute "NickName" "" "HP Officejet 4100 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet 4100 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet 4100 series;DES:officejet 4100 series;"
+ PCFileName "hp-officejet_4100_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet 4100 Series All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 4110xi All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 4110 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 4110v All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet 4105 hpijs"
+ Attribute "NickName" "" "HP Officejet 4105 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet 4105 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet 4105;DES:officejet 4105;"
+ PCFileName "hp-officejet_4105-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet 4105 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet 4115 Series hpijs"
+ Attribute "NickName" "" "HP Officejet 4115 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet 4115 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet 4115 series;DES:officejet 4115 series;"
+ PCFileName "hp-officejet_4115_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet 4115 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet 4300 Series hpijs"
+ Attribute "NickName" "" "HP Officejet 4300 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet 4300 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet 4300 series;DES:officejet 4300 series;"
+ PCFileName "hp-officejet_4300_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet 4308 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 4311 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 4312 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 4314 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 4315 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 4315v All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 4315xi All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 4317 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 4319 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 4338 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 4352 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 4353 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 4355 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 4357 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 4359 All-in-one Printer)"
+ }
+ {
+ CustomMedia "3425-Cover/Cover for HP DeskJet 3425" 612.00 1116.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=3425-Cover" "%% FoomaticRIPOptionSetting: PageSize=3425-Cover"
+ // <%DJ3320:CoverMedia%>
+ {
+ ModelName "HP Deskjet 3420 hpijs"
+ Attribute "NickName" "" "HP Deskjet 3420 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 3420 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 3420;DES:deskjet 3420;"
+ PCFileName "hp-deskjet_3420-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 3420 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3420v Color Inkjet Printer)"
+ }
+ {
+ ModelName "HP Deskjet 3425 hpijs"
+ Attribute "NickName" "" "HP Deskjet 3425 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 3425 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 3425;DES:deskjet 3425;"
+ PCFileName "hp-deskjet_3425-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 3425 Printer)"
+ }
+ {
+ ModelName "HP Deskjet 3450 hpijs"
+ Attribute "NickName" "" "HP Deskjet 3450 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 3450 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 3450;DES:deskjet 3450;"
+ PCFileName "hp-deskjet_3450-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 3450 Color Inkjet Printer)"
+ }
+ }
+} // end DJ3320
+
+//////////////////////// DJ3600
+{
+ Attribute "DefaultResolution" "" "600dpi"
+
+ // Custom page sizes from 1x4in to Legal
+ HWMargins 18 36 18 9
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 8.5in 14in
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-DeskJet_3650 hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-DeskJet_3650" " -sDeviceManufacture&&
+r=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;deskjet 3600&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=300DraftColorCM&&
+Y"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft.Gray" "Quality=300DraftGr&&
+ayscaleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=300ColorCMY"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal.Gray" "Quality=300Graysc&&
+aleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High" "Quality=600ColorCMY"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High.Gray" "Quality=600Grayscal&&
+eK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Photo" "Quality=600PhotoCMYKFul&&
+lBleed"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=PhotoTearOff" " -dDEVICEWIDTHPOINTS&&
+=288 -dDEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6TearOff" " -dDEVICEWIDTHPOINTS=29&&
+7 -dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD120" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMY" " -r300 -sIjsParams=Qua&&
+lity:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet=&&
+1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYK" " -r300 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftColorCMY" " -r300 -sIjsParam&&
+s=Quality:Quality=1,Quality:ColorMode=2,Quality:MediaType=0,Quality:Pe&&
+nSet=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftColorCMYK" " -r300 -sIjsPara&&
+ms=Quality:Quality=1,Quality:ColorMode=2,Quality:MediaType=0,Quality:P&&
+enSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftGrayscaleK" " -r300 -sIjsPar&&
+ams=Quality:Quality=1,Quality:ColorMode=0,Quality:MediaType=0,Quality:&&
+PenSet=0"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300GrayscaleK" " -r300 -sIjsParams=Q&&
+uality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:PenSe&&
+t=0"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300PhotoCMY" " -r300 -sIjsParams=Qua&&
+lity:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenSet=&&
+1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300PhotoCMYK" " -r300 -sIjsParams=Qu&&
+ality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300PhotoCMYKFullBleed" " -r300 -sIjs&&
+Params=Quality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Quali&&
+ty:PenSet=2,Quality:FullBleed=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMY" " -r600 -sIjsParams=Qua&&
+lity:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet=&&
+1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMYK" " -r600 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600GrayscaleK" " -r600 -sIjsParams=Q&&
+uality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:PenSe&&
+t=0"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600PhotoCMY" " -r600 -sIjsParams=Qua&&
+lity:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenSet=&&
+1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600PhotoCMYcmK" " -r600 -sIjsParams=&&
+Quality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenS&&
+et=4"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600PhotoCMYcmKFullBleed" " -r600 -sI&&
+jsParams=Quality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Qua&&
+lity:PenSet=4,Quality:FullBleed=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600PhotoCMYK" " -r600 -sIjsParams=Qu&&
+ality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600PhotoCMYKFullBleed" " -r600 -sIjs&&
+Params=Quality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Quali&&
+ty:PenSet=2,Quality:FullBleed=1"
+ Group "General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft (Color cartridge)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ Choice "Draft.Gray/Draft Grayscale (Black cartridge)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft.Gray"
+ *Choice "Normal/Normal (Color cartridge)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "Normal.Gray/Normal Grayscale (Black cartridge)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal.Gray"
+ Choice "High/High Quality (Color cartridge)" "%% FoomaticRIPOptionSetting: PrintoutMode=High"
+ Choice "High.Gray/High Quality Grayscale (Black cartridge)" "%% FoomaticRIPOptionSetting: PrintoutMode=High.Gray"
+ Choice "Photo/Photo (Color cartridge, on photo paper)" "%% FoomaticRIPOptionSetting: PrintoutMode=Photo"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "300ColorCMY/300 dpi, Color, Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMY"
+ Choice "300ColorCMYK/300 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYK"
+ Choice "300DraftColorCMY/300 dpi, Draft, Color, Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftColorCMY"
+ Choice "300DraftColorCMYK/300 dpi, Draft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftColorCMYK"
+ Choice "300DraftGrayscaleK/300 dpi, Draft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftGrayscaleK"
+ Choice "300GrayscaleK/300 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300GrayscaleK"
+ Choice "300PhotoCMY/300 dpi, Photo, Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=300PhotoCMY"
+ Choice "300PhotoCMYK/300 dpi, Photo, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=300PhotoCMYK"
+ Choice "300PhotoCMYKFullBleed/300 dpi, Photo, Full Bleed, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=300PhotoCMYKFullBleed"
+ Choice "600ColorCMY/600 dpi, Color, Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMY"
+ Choice "600ColorCMYK/600 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMYK"
+ Choice "600GrayscaleK/600 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=600GrayscaleK"
+ Choice "600PhotoCMY/600 dpi, Photo, Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=600PhotoCMY"
+ Choice "600PhotoCMYcmK/600 dpi, Photo, Photo + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=600PhotoCMYcmK"
+ Choice "600PhotoCMYcmKFullBleed/600 dpi, Photo, Full Bleed, Photo + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=600PhotoCMYcmKFullBleed"
+ Choice "600PhotoCMYK/600 dpi, Photo, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=600PhotoCMYK"
+ Choice "600PhotoCMYKFullBleed/600 dpi, Photo, Full Bleed, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=600PhotoCMYKFullBleed"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 9.72 36.00 9.72 9.00 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo or 5x7 inch index card" 360.00 504.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "PhotoTearOff/Photo with tear-off tab" 288.00 432.00 9.00 9.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff" "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "A6TearOff/A6 with tear-off tab" 297.00 420.00 9.00 0.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A6TearOff" "%% FoomaticRIPOptionSetting: PageSize=A6TearOff"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "CDDVD120/CD or DVD 120 mm" 360.00 360.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD120" "%% FoomaticRIPOptionSetting: PageSize=CDDVD120"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+ // <%DJ3600:Normal%>
+ {
+ ModelName "HP Deskjet f300 Series hpijs"
+ Attribute "NickName" "" "HP Deskjet f300 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet f300 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet f300 series;DES:deskjet f300 series;"
+ PCFileName "hp-deskjet_f300_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet f310 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f325 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f335 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f340 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f350 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f370 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f375 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f378 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f379 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f380 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f385 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f388 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f390 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f394 All-in-one Printer)"
+ }
+ {
+ ModelName "HP 910 hpijs"
+ Attribute "NickName" "" "HP 910 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP 910 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp 910;DES:hp 910;"
+ PCFileName "hp-910-hpijs.ppd"
+ Attribute "Product" "" "(HP 910 Printer)"
+ }
+ {
+ ModelName "HP 915 hpijs"
+ Attribute "NickName" "" "HP 915 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP 915 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp 915;DES:hp 915;"
+ PCFileName "hp-915-hpijs.ppd"
+ Attribute "Product" "" "(HP 915 Inkjet All-in-one Printer)"
+ }
+ {
+ ModelName "HP PSC 1300 Series hpijs"
+ Attribute "NickName" "" "HP PSC 1300 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP PSC 1300 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:psc 1300 series;DES:psc 1300 series;"
+ PCFileName "hp-psc_1300_series-hpijs.ppd"
+ Attribute "Product" "" "(HP PSC 1300 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1340 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1345 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1350 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1350xi All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1350v All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1355 All-in-one Printer)"
+ }
+ {
+ ModelName "HP PSC 1310 Series hpijs"
+ Attribute "NickName" "" "HP PSC 1310 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP PSC 1310 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:psc 1310 series;DES:psc 1310 series;"
+ PCFileName "hp-psc_1310_series-hpijs.ppd"
+ Attribute "Product" "" "(HP PSC 1310 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1311 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1312 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1315 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1315xi All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1315v All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1315s All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1317 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1318 All-in-one Printer)"
+ }
+ {
+ ModelName "HP PSC 1358 Series hpijs"
+ Attribute "NickName" "" "HP PSC 1358 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP PSC 1358 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:psc 1358 series;DES:psc 1358 series;"
+ PCFileName "hp-psc_1358_series-hpijs.ppd"
+ Attribute "Product" "" "(HP PSC 1300 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1340 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1350v All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1350xi All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1350 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1355 All-in-one Printer)"
+ }
+ {
+ ModelName "HP PSC 1400 Series hpijs"
+ Attribute "NickName" "" "HP PSC 1400 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP PSC 1400 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:psc 1400 series;DES:psc 1400 series;"
+ PCFileName "hp-psc_1400_series-hpijs.ppd"
+ Attribute "Product" "" "(HP PSC 1401 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1402 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1403 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1406 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1408 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1410 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1410v All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1410xi All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1415 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 1417 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Deskjet d2300 Series hpijs"
+ Attribute "NickName" "" "HP Deskjet d2300 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet d2300 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet d2300 series;DES:deskjet d2300 series;"
+ PCFileName "hp-deskjet_d2300_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet d2320 Printer)"
+ Attribute "Product" "" "(HP Deskjet d2330 Printer)"
+ Attribute "Product" "" "(HP Deskjet d2345 Printer)"
+ Attribute "Product" "" "(HP Deskjet d2360 Printer)"
+ Attribute "Product" "" "(HP Deskjet d2368 Printer)"
+ }
+ {
+ ModelName "HP Deskjet d2400 Series hpijs"
+ Attribute "NickName" "" "HP Deskjet d2400 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet d2400 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet d2400 series;DES:deskjet d2400 series;"
+ PCFileName "hp-deskjet_d2400_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet d2430 Printer)"
+ Attribute "Product" "" "(HP Deskjet d2445 Printer)"
+ Attribute "Product" "" "(HP Deskjet d2460 Printer)"
+ Attribute "Product" "" "(HP Deskjet d2466 Printer)"
+ Attribute "Product" "" "(HP Deskjet d2468 Printer)"
+ Attribute "Product" "" "(HP Deskjet d4263 Printer)"
+ }
+ {
+ ModelName "HP Officejet j3500 Series hpijs"
+ Attribute "NickName" "" "HP Officejet j3500 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet j3500 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet j3500 series;DES:officejet j3500 series;"
+ PCFileName "hp-officejet_j3500_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet j3508 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet j3600 Series hpijs"
+ Attribute "NickName" "" "HP Officejet j3600 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet j3600 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet j3600 series;DES:officejet j3600 series;"
+ PCFileName "hp-officejet_j3600_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet j3608 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet j3625 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet j3635 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet j3640 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet j3650 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet j3680 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Deskjet 3600 hpijs"
+ Attribute "NickName" "" "HP Deskjet 3600 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 3600 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 3600;DES:deskjet 3600;"
+ PCFileName "hp-deskjet_3600-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 3600 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3620 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3645 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3647 Color Inkjet Printer)"
+ }
+ {
+ ModelName "HP Deskjet 3650 hpijs"
+ Attribute "NickName" "" "HP Deskjet 3650 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 3650 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 3650;DES:deskjet 3650;"
+ PCFileName "hp-deskjet_3650-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 3620 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3645 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3647 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3650 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3651 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3652 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3653 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3658 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3668 Color Inkjet Printer)"
+ }
+ {
+ ModelName "HP Deskjet 3840 hpijs"
+ Attribute "NickName" "" "HP Deskjet 3840 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 3840 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 3840;DES:deskjet 3840;"
+ PCFileName "hp-deskjet_3840-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 3843 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3844 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3845xi Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3845 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3847 Color Inkjet Printer)"
+ Attribute "Product" "" "(HP Deskjet 3848 Color Inkjet Printer)"
+ }
+ {
+ ModelName "HP Deskjet f4100 Series hpijs"
+ Attribute "NickName" "" "HP Deskjet f4100 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet f4100 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet f4100 series;DES:deskjet f4100 series;"
+ PCFileName "hp-deskjet_f4100_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet f4135 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f4140 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f4150 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f4172 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f4172 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f4175 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f4180 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f4185 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f4188 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f4190 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f4194 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet 4200 Series hpijs"
+ Attribute "NickName" "" "HP Officejet 4200 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet 4200 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet 4200 series;DES:officejet 4200 series;"
+ PCFileName "hp-officejet_4200_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet 4200 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 4211 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 4212 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 4215 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 4215xi All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 4215v All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 4219 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet 4255 hpijs"
+ Attribute "NickName" "" "HP Officejet 4255 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet 4255 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet 4255;DES:officejet 4255;"
+ PCFileName "hp-officejet_4255-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet 4251 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 4252 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 4255 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 4256 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 4259 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet 5500 Series hpijs"
+ Attribute "NickName" "" "HP Officejet 5500 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet 5500 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet 5500 series;DES:officejet 5500 series;"
+ PCFileName "hp-officejet_5500_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet 5505 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 5508 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 5510v All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 5510 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 5510xi All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 5515 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet j5500 Series hpijs"
+ Attribute "NickName" "" "HP Officejet j5500 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet j5500 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet j5500 series;DES:officejet j5500 series;"
+ PCFileName "hp-officejet_j5500_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet j5505 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet j5508 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet j5510xi All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet j5510 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet j5510v All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet j5515 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet j5520 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet 5600 Series hpijs"
+ Attribute "NickName" "" "HP Officejet 5600 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet 5600 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet 5600 series;DES:officejet 5600 series;"
+ PCFileName "hp-officejet_5600_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet 5600 Series All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 5605 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 5607 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 5608 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 5609 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 5610 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 5610xi All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 5610v All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 5615 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 5679 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 5680 All-in-one Printer)"
+ }
+} // end DJ3600
+
+////////////////// DJ4100
+{
+ Attribute "DefaultResolution" "" "600dpi"
+
+ // Custom page sizes from 1x4in to Legal
+ HWMargins 18 36 18 9
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 8.5in 14in
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-DeskJet_D4100 hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-DeskJet_D4100" " -sDeviceManufactur&&
+er=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;Deskjet D4100&quot;&&
+"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=600DraftColorCM&&
+Y"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft.Gray" "Quality=600DraftGr&&
+ayscaleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=600ColorCMY"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal.Gray" "Quality=600Graysc&&
+aleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High" "Quality=600ColorCMY"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High.Gray" "Quality=600Grayscal&&
+eK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Photo" "Quality=600PhotoCMYKFul&&
+lBleed"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=PhotoTearOff" " -dDEVICEWIDTHPOINTS&&
+=288 -dDEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6TearOff" " -dDEVICEWIDTHPOINTS=29&&
+7 -dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD120" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMY" " -r600 -sIjsParams=Qua&&
+lity:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet=&&
+1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMYK" " -r600 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600DraftColorCMY" " -r600 -sIjsParam&&
+s=Quality:Quality=1,Quality:ColorMode=2,Quality:MediaType=0,Quality:Pe&&
+nSet=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600DraftColorCMYK" " -r600 -sIjsPara&&
+ms=Quality:Quality=1,Quality:ColorMode=2,Quality:MediaType=0,Quality:P&&
+enSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600DraftGrayscaleK" " -r600 -sIjsPar&&
+ams=Quality:Quality=1,Quality:ColorMode=0,Quality:MediaType=0,Quality:&&
+PenSet=0"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600GrayscaleK" " -r600 -sIjsParams=Q&&
+uality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:PenSe&&
+t=0"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600PhotoCMY" " -r600 -sIjsParams=Qua&&
+lity:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenSet=&&
+1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600PhotoCMYcmK" " -r600 -sIjsParams=&&
+Quality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenS&&
+et=4"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600PhotoCMYcmKFullBleed" " -r600 -sI&&
+jsParams=Quality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Qua&&
+lity:PenSet=4,Quality:FullBleed=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600PhotoCMYK" " -r600 -sIjsParams=Qu&&
+ality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600PhotoCMYKFullBleed" " -r600 -sIjs&&
+Params=Quality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Quali&&
+ty:PenSet=2,Quality:FullBleed=1"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft (Color cartridge)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ Choice "Draft.Gray/Draft Grayscale (Black cartridge)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft.Gray"
+ *Choice "Normal/Normal (Color cartridge)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "Normal.Gray/Normal Grayscale (Black cartridge)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal.Gray"
+ Choice "High/High Quality (Color cartridge)" "%% FoomaticRIPOptionSetting: PrintoutMode=High"
+ Choice "High.Gray/High Quality Grayscale (Black cartridge)" "%% FoomaticRIPOptionSetting: PrintoutMode=High.Gray"
+ Choice "Photo/Photo (Color cartridge, on photo paper)" "%% FoomaticRIPOptionSetting: PrintoutMode=Photo"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "600ColorCMY/600 dpi, Color, Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMY"
+ Choice "600ColorCMYK/600 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMYK"
+ Choice "600DraftColorCMY/600 dpi, Draft, Color, Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600DraftColorCMY"
+ Choice "600DraftColorCMYK/600 dpi, Draft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600DraftColorCMYK"
+ Choice "600DraftGrayscaleK/600 dpi, Draft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=600DraftGrayscaleK"
+ Choice "600GrayscaleK/600 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=600GrayscaleK"
+ Choice "600PhotoCMY/600 dpi, Photo, Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=600PhotoCMY"
+ Choice "600PhotoCMYcmK/600 dpi, Photo, Photo + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=600PhotoCMYcmK"
+ Choice "600PhotoCMYcmKFullBleed/600 dpi, Photo, Full Bleed, Photo + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=600PhotoCMYcmKFullBleed"
+ Choice "600PhotoCMYK/600 dpi, Photo, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=600PhotoCMYK"
+ Choice "600PhotoCMYKFullBleed/600 dpi, Photo, Full Bleed, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=600PhotoCMYKFullBleed"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 9.72 36.00 9.72 9.00 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo or 5x7 inch index card" 360.00 504.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "PhotoTearOff/Photo with tear-off tab" 288.00 432.00 9.00 9.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff" "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "A6TearOff/A6 with tear-off tab" 297.00 420.00 9.00 0.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A6TearOff" "%% FoomaticRIPOptionSetting: PageSize=A6TearOff"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "CDDVD120/CD or DVD 120 mm" 360.00 360.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD120" "%% FoomaticRIPOptionSetting: PageSize=CDDVD120"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+ {
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-DeskJet_D4100" " -sDeviceManufactur&&
+er=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;Deskjet D4100&quot;"
+ // <%DJ4100:Normal%>
+ {
+ ModelName "HP Deskjet d4100 Series hpijs"
+ Attribute "NickName" "" "HP Deskjet d4100 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet d4100 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet d4100 series;DES:deskjet d4100 series;"
+ PCFileName "hp-deskjet_d4100_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet d4145 Printer)"
+ Attribute "Product" "" "(HP Deskjet d4145 Printer)"
+ Attribute "Product" "" "(HP Deskjet d4155 Printer)"
+ Attribute "Product" "" "(HP Deskjet d4155 Printer)"
+ Attribute "Product" "" "(HP Deskjet d4160 Printer)"
+ Attribute "Product" "" "(HP Deskjet d4163 Printer)"
+ Attribute "Product" "" "(HP Deskjet d4168 Printer)"
+ }
+ {
+ ModelName "HP Deskjet d4200 Series hpijs"
+ Attribute "NickName" "" "HP Deskjet d4200 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet d4200 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet d4200 series;DES:deskjet d4200 series;"
+ PCFileName "hp-deskjet_d4200_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet d4245 Printer)"
+ Attribute "Product" "" "(HP Deskjet d4260 Printer)"
+ Attribute "Product" "" "(HP Deskjet d4266 Printer)"
+ Attribute "Product" "" "(HP Deskjet d4268 Printer)"
+ }
+ {
+ ModelName "HP Deskjet d4300 Series hpijs"
+ Attribute "NickName" "" "HP Deskjet d4300 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet d4300 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet d4300 series;DES:deskjet d4300 series;"
+ PCFileName "hp-deskjet_d4300_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet d4360 Printer)"
+ Attribute "Product" "" "(HP Deskjet d4363 Printer)"
+ Attribute "Product" "" "(HP Deskjet d4368 Printer)"
+ }
+ }
+}
+
+//////////////////// PSP100 4x6, three-sided fullbleed
+{
+ Attribute "DefaultResolution" "" "1200dpi"
+
+ // Custom page sizes from 1x4in to A6
+ HWMargins 0 36 0 0
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 297 420
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-PhotoSmart_P100 hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-PhotoSmart_P100" " -sDeviceManufact&&
+urer=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;PHOTOSMART 100&qu&&
+ot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=300ColorCMYKFu&&
+llBleed"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High" "Quality=600ColorCMYKFull&&
+Bleed"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Photo" "Quality=1200PhotoCMYKFu&&
+llBleed"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=PhotoTearOff" " -dDEVICEWIDTHPOINTS&&
+=288 -dDEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6TearOff" " -dDEVICEWIDTHPOINTS=29&&
+7 -dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMY" " -r300 -sIjsParams=Qua&&
+lity:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet=&&
+1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYFullBleed" " -r300 -sIjsP&&
+arams=Quality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Qualit&&
+y:PenSet=1,Quality:FullBleed=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMY" " -r600 -sIjsParams=Qua&&
+lity:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet=&&
+1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMYFullBleed" " -r600 -sIjsP&&
+arams=Quality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Qualit&&
+y:PenSet=1,Quality:FullBleed=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=1200PhotoCMY" " -r1200 -sIjsParams=Q&&
+uality:Quality=3,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenSe&&
+t=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=1200PhotoCMYFullBleed" " -r1200 -sIj&&
+sParams=Quality:Quality=3,Quality:ColorMode=2,Quality:MediaType=2,Qual&&
+ity:PenSet=1,Quality:FullBleed=1"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Normal/Normal (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "High/High Quality (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=High"
+ *Choice "Photo/Photo (on photo paper)" "%% FoomaticRIPOptionSetting: PrintoutMode=Photo"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "300ColorCMY/300 dpi, Color, Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMY"
+ Choice "300ColorCMYFullBleed/300 dpi, Color, Full Bleed, Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYFullBleed"
+ Choice "600ColorCMY/600 dpi, Color, Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMY"
+ Choice "600ColorCMYFullBleed/600 dpi, Color, Full Bleed, Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMYFullBleed"
+ Choice "1200PhotoCMY/1200 dpi, Photo, Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=1200PhotoCMY"
+ Choice "1200PhotoCMYFullBleed/1200 dpi, Photo, Full Bleed, Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=1200PhotoCMYFullBleed"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ *CustomMedia "PhotoTearOff/Photo with tear-off tab" 288.00 432.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff" "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "A6/A6" 297.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "A6TearOff/A6 with tear-off tab" 297.00 420.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=A6TearOff" "%% FoomaticRIPOptionSetting: PageSize=A6TearOff"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ // <%PSP100:Normal%>
+ {
+ ModelName "HP Photosmart 100 hpijs"
+ Attribute "NickName" "" "HP Photosmart 100 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 100 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 100;DES:photosmart 100;"
+ PCFileName "hp-photosmart_100-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart 100 Printer)"
+ }
+ {
+ ModelName "HP Photosmart 130 hpijs"
+ Attribute "NickName" "" "HP Photosmart 130 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 130 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 130;DES:photosmart 130;"
+ PCFileName "hp-photosmart_130-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart 130 Printer)"
+ Attribute "Product" "" "(HP Photosmart 130v Printer)"
+ Attribute "Product" "" "(HP Photosmart 130xi Printer)"
+ }
+ {
+ ModelName "HP Photosmart 140 Series hpijs"
+ Attribute "NickName" "" "HP Photosmart 140 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 140 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 140 series;DES:photosmart 140 series;"
+ PCFileName "hp-photosmart_140_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart 140 Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 145v Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 145xi Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 145 Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 148 Compact Photo Printer)"
+ }
+ {
+ ModelName "HP Photosmart 230 hpijs"
+ Attribute "NickName" "" "HP Photosmart 230 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 230 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 230;DES:photosmart 230;"
+ PCFileName "hp-photosmart_230-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart 230 Printer)"
+ Attribute "Product" "" "(HP Photosmart 230v Printer)"
+ Attribute "Product" "" "(HP Photosmart 230xi Printer)"
+ }
+ {
+ ModelName "HP Photosmart 240 Series hpijs"
+ Attribute "NickName" "" "HP Photosmart 240 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 240 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 240 series;DES:photosmart 240 series;"
+ PCFileName "hp-photosmart_240_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart 240 Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 245v Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 245xi Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 245 Compact Photo Printer)"
+ }
+} // end PSP100 three-sided fullbleed
+
+//////////////// DJGenericVIP 4x6, 4-sided fullbleed
+{
+ Attribute "DefaultResolution" "" "1200dpi"
+
+ // Custom page sizes from 1x4in to A6
+ HWMargins 0 0 0 0
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 297 420
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-PhotoSmart_320 hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-PhotoSmart_320" " -sDeviceManufactu&&
+rer=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;deskjet 5600&quot;&&
+"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=300ColorCMYKFu&&
+llBleed"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High" "Quality=600ColorCMYKFull&&
+Bleed"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Photo" "Quality=1200PhotoCMYKFu&&
+llBleed"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=PhotoTearOff" " -dDEVICEWIDTHPOINTS&&
+=288 -dDEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6TearOff" " -dDEVICEWIDTHPOINTS=29&&
+7 -dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMY" " -r300 -sIjsParams=Qua&&
+lity:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet=&&
+1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYFullBleed" " -r300 -sIjsP&&
+arams=Quality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Qualit&&
+y:PenSet=1,Quality:FullBleed=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMY" " -r600 -sIjsParams=Qua&&
+lity:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet=&&
+1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMYFullBleed" " -r600 -sIjsP&&
+arams=Quality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Qualit&&
+y:PenSet=1,Quality:FullBleed=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=1200PhotoCMY" " -r1200 -sIjsParams=Q&&
+uality:Quality=3,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenSe&&
+t=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=1200PhotoCMYFullBleed" " -r1200 -sIj&&
+sParams=Quality:Quality=3,Quality:ColorMode=2,Quality:MediaType=2,Qual&&
+ity:PenSet=1,Quality:FullBleed=1"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Normal/Normal (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "High/High Quality (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=High"
+ *Choice "Photo/Photo (on photo paper)" "%% FoomaticRIPOptionSetting: PrintoutMode=Photo"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "300ColorCMY/300 dpi, Color, Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMY"
+ Choice "300ColorCMYFullBleed/300 dpi, Color, Full Bleed, Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYFullBleed"
+ Choice "600ColorCMY/600 dpi, Color, Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMY"
+ Choice "600ColorCMYFullBleed/600 dpi, Color, Full Bleed, Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMYFullBleed"
+ Choice "1200PhotoCMY/1200 dpi, Photo, Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=1200PhotoCMY"
+ Choice "1200PhotoCMYFullBleed/1200 dpi, Photo, Full Bleed, Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=1200PhotoCMYFullBleed"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ *CustomMedia "PhotoTearOff/Photo with tear-off tab" 288.00 432.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff" "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "A6/A6" 297.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "A6TearOff/A6 with tear-off tab" 297.00 420.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=A6TearOff" "%% FoomaticRIPOptionSetting: PageSize=A6TearOff"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ // <%DJGenericVIP:4x6FullBleed%>
+ {
+ ModelName "HP Photosmart a310 Series hpijs"
+ Attribute "NickName" "" "HP Photosmart a310 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart a310 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart a310 series;DES:photosmart a310 series;"
+ PCFileName "hp-photosmart_a310_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart a310 Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart a311 Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart a314 Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart a316 Compact Photo Printer)"
+ }
+ {
+ ModelName "HP Photosmart 320 Series hpijs"
+ Attribute "NickName" "" "HP Photosmart 320 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 320 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 320 series;DES:photosmart 320 series;"
+ PCFileName "hp-photosmart_320_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart 320 Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 325xi Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 325v Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 325 Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 329 Compact Photo Printer)"
+ }
+ {
+ ModelName "HP Photosmart a320 Series hpijs"
+ Attribute "NickName" "" "HP Photosmart a320 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart a320 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart a320 series;DES:photosmart a320 series;"
+ PCFileName "hp-photosmart_a320_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart a320 Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart a321 Compact Photo Printer)"
+ }
+ {
+ ModelName "HP Photosmart 330 Series hpijs"
+ Attribute "NickName" "" "HP Photosmart 330 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 330 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 330 series;DES:photosmart 330 series;"
+ PCFileName "hp-photosmart_330_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart 330 Series Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 335 Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 335xi Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 335v Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 337 Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 338 Compact Photo Printer)"
+ }
+ {
+ ModelName "HP Photosmart 370 Series hpijs"
+ Attribute "NickName" "" "HP Photosmart 370 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 370 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 370 series;DES:photosmart 370 series;"
+ PCFileName "hp-photosmart_370_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart 370 Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 375xi Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 375v Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 375 Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 375bxi Compact Photo Printer With Battery)"
+ Attribute "Product" "" "(HP Photosmart 375b Compact Photo Printer With Battery)"
+ }
+ {
+ ModelName "HP Photosmart 380 Series hpijs"
+ Attribute "NickName" "" "HP Photosmart 380 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 380 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 380 series;DES:photosmart 380 series;"
+ PCFileName "hp-photosmart_380_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart 385 Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 385xi Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 385v Compact Photo Printer)"
+ }
+ {
+ ModelName "HP Photosmart 420 Series hpijs"
+ Attribute "NickName" "" "HP Photosmart 420 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 420 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 420 series;DES:photosmart 420 series;"
+ PCFileName "hp-photosmart_420_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart 420 Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 422 Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 422v Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 422xi Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 425 Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 425v Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 428 Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 428v Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 428xi Compact Photo Printer)"
+ }
+ {
+ ModelName "HP Photosmart a430 Series hpijs"
+ Attribute "NickName" "" "HP Photosmart a430 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart a430 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart a430 series;DES:photosmart a430 series;"
+ PCFileName "hp-photosmart_a430_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart a430 Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart a432 Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart a433 Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart a434 Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart a436 Compact Photo Printer)"
+ }
+ {
+ ModelName "HP Photosmart a440 Series hpijs"
+ Attribute "NickName" "" "HP Photosmart a440 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart a440 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart a440 series;DES:photosmart a440 series;"
+ PCFileName "hp-photosmart_a440_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart a440 Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart a442 Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart a446 Compact Photo Printer)"
+ }
+ {
+ ModelName "HP Photosmart a510 Series hpijs"
+ Attribute "NickName" "" "HP Photosmart a510 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart a510 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart a510 series;DES:photosmart a510 series;"
+ PCFileName "hp-photosmart_a510_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart a510 Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart a512 Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart a516 Compact Photo Printer)"
+ }
+ {
+ ModelName "HP Photosmart a520 Series hpijs"
+ Attribute "NickName" "" "HP Photosmart a520 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart a520 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart a520 series;DES:photosmart a520 series;"
+ PCFileName "hp-photosmart_a520_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart a522xi Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart a522 Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart a525 Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart a526 Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart a528 Compact Photo Printer)"
+ }
+} // end DJGenericVIP 4x6, 4-sided fullbleed
+
+//////////////// PSP470 5x7, 4-sided fullbleed
+{
+ Attribute "DefaultResolution" "" "1200dpi"
+
+ // Custom page sizes from 1x4in to 5x7
+ HWMargins 0 0 0 0
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 5in 7in
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-PhotoSmart_470 hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-PhotoSmart_470" " -sDeviceManufactu&&
+rer=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;Photosmart 470&quo&&
+t;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=300ColorCMYKFu&&
+llBleed"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High" "Quality=600ColorCMYKFull&&
+Bleed"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Photo" "Quality=1200PhotoCMYKFu&&
+llBleed"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=PhotoTearOff" " -dDEVICEWIDTHPOINTS&&
+=288 -dDEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6TearOff" " -dDEVICEWIDTHPOINTS=29&&
+7 -dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD120" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMY" " -r300 -sIjsParams=Qua&&
+lity:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet=&&
+1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYFullBleed" " -r300 -sIjsP&&
+arams=Quality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Qualit&&
+y:PenSet=1,Quality:FullBleed=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMY" " -r600 -sIjsParams=Qua&&
+lity:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet=&&
+1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMYFullBleed" " -r600 -sIjsP&&
+arams=Quality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Qualit&&
+y:PenSet=1,Quality:FullBleed=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=1200PhotoCMY" " -r1200 -sIjsParams=Q&&
+uality:Quality=3,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenSe&&
+t=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=1200PhotoCMYFullBleed" " -r1200 -sIj&&
+sParams=Quality:Quality=3,Quality:ColorMode=2,Quality:MediaType=2,Qual&&
+ity:PenSet=1,Quality:FullBleed=1"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Normal/Normal (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "High/High Quality (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=High"
+ *Choice "Photo/Photo (on photo paper)" "%% FoomaticRIPOptionSetting: PrintoutMode=Photo"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "300ColorCMY/300 dpi, Color, Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMY"
+ Choice "300ColorCMYFullBleed/300 dpi, Color, Full Bleed, Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYFullBleed"
+ Choice "600ColorCMY/600 dpi, Color, Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMY"
+ Choice "600ColorCMYFullBleed/600 dpi, Color, Full Bleed, Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMYFullBleed"
+ Choice "1200PhotoCMY/1200 dpi, Photo, Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=1200PhotoCMY"
+ Choice "1200PhotoCMYFullBleed/1200 dpi, Photo, Full Bleed, Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=1200PhotoCMYFullBleed"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo or 5x7 inch index card" 360.00 504.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ *CustomMedia "PhotoTearOff/Photo with tear-off tab" 288.00 432.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff" "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "A6/A6" 297.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "A6TearOff/A6 with tear-off tab" 297.00 420.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=A6TearOff" "%% FoomaticRIPOptionSetting: PageSize=A6TearOff"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "CDDVD120/CD or DVD 120 mm" 360.00 360.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD120" "%% FoomaticRIPOptionSetting: PageSize=CDDVD120"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ // <%PSP470:FullBleed%>
+ {
+ ModelName "HP Photosmart 470 Series hpijs"
+ Attribute "NickName" "" "HP Photosmart 470 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 470 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 470 series;DES:photosmart 470 series;"
+ PCFileName "hp-photosmart_470_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart 470 Series Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 475xi Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 475v Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart 475 Compact Photo Printer)"
+ }
+ {
+ ModelName "HP Photosmart a610 Series hpijs"
+ Attribute "NickName" "" "HP Photosmart a610 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart a610 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart a610 series;DES:photosmart a610 series;"
+ PCFileName "hp-photosmart_a610_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart a610 Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart a612 Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart a616 Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart a617 Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart a618 Compact Photo Printer)"
+ }
+ {
+ ModelName "HP Photosmart a620 Series hpijs"
+ Attribute "NickName" "" "HP Photosmart a620 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart a620 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart a620 series;DES:photosmart a620 series;"
+ PCFileName "hp-photosmart_a620_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart a620 Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart a622 Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart a626 Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart a627 Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart a628 Compact Photo Printer)"
+ }
+ {
+ ModelName "HP Photosmart a710 Series hpijs"
+ Attribute "NickName" "" "HP Photosmart a710 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart a710 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart a710 series;DES:photosmart a710 series;"
+ PCFileName "hp-photosmart_a710_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart a712 Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart a716 Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart a717 Compact Photo Printer)"
+ }
+ {
+ ModelName "HP Photosmart a820 Series hpijs"
+ Attribute "NickName" "" "HP Photosmart a820 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart a820 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart a820 series;DES:photosmart a820 series;"
+ PCFileName "hp-photosmart_a820_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart a826 Home Photo Center)"
+ Attribute "Product" "" "(HP Photosmart a827 Home Photo Center)"
+ Attribute "Product" "" "(HP Photosmart a828 Home Photo Center)"
+ }
+} // end PSP470 5x7, 4-sided fullbleed
+
+//////////////// QuickConnect 5x7, 4-sided fullbleed
+{
+ Attribute "DefaultResolution" "" "300dpi"
+
+ // Custom page sizes from 1x4in to 5x7
+ HWMargins 0 0 0 0
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 5in 7in
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-PhotoSmart_A530 hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -r300 -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-Photosmart_A53" " -sDeviceManufacture&&
+r=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;Photosmart A530&quot;"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Automatic" " -dDEVICEWIDTHPOINTS=288 -&&
+dDEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=4x6" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=L" " -dDEVICEWIDTHPOINTS=252 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=4x8" " -dDEVICEWIDTHPOINTS=288 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=4x12" " -dDEVICEWIDTHPOINTS=288 -dDE&&
+VICEHEIGHTPOINTS=864"
+ Attribute "FoomaticRIPOption" "MediaType" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "MediaType=Automatic" " -sIjsParams=Quali&&
+ty:MediaType=0"
+ Attribute "FoomaticRIPOptionSetting" "MediaType=APhoto" " -sIjsParams=Qualit&&
+y:MediaType=1"
+ Attribute "FoomaticRIPOptionSetting" "MediaType=PPhoto" " -sIjsParams=Qualit&&
+y:MediaType=2"
+ Attribute "FoomaticRIPOptionSetting" "MediaType=Plain" " -sIjsParams=Qualit&&
+y:MediaType=3"
+ Attribute "FoomaticRIPOptionSetting" "MediaType=OPhoto" " -sIjsParams=Quali&&
+ty:MediaType=4"
+ Attribute "FoomaticRIPOption" "PrintQuality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "PrintQuality=Automatic" ",Quality:Qu&&
+ality=0"
+ Attribute "FoomaticRIPOptionSetting" "PrintQuality=Best" ",Quality:Qual&&
+ity=1"
+ Attribute "FoomaticRIPOptionSetting" "PrintQuality=Normal" ",Quality:Qual&&
+ity=2"
+ Attribute "FoomaticRIPOptionSetting" "PrintQuality=FastNormal" ",Qualit&&
+y:Quality=3"
+ Attribute "FoomaticRIPOption" "Borderless" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Borderless=off" ",Quality:Full&&
+Bleed=0"
+ Attribute "FoomaticRIPOptionSetting" "Borderless=on" ",Quality:Full&&
+Bleed=1"
+ Attribute "FoomaticRIPOption" "PhotoFix" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "PhotoFix=off" ",PhotoFix=0"
+ Attribute "FoomaticRIPOptionSetting" "PhotoFix=on" ",PhotoFix=1"
+ Attribute "FoomaticRIPOption" "RedEye" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "RedEye=off" ",RedEye=0"
+ Attribute "FoomaticRIPOptionSetting" "RedEye=on" ",RedEye=1"
+ Group "General/General"
+ Option "MediaType/Media Type " PickOne AnySetup 105.0
+ *Choice "Automatic/Automatic" "%% FoomaticRIPOptionSetting: MediaType=Automatic"
+ Choice "APhoto/HP Advanced Photo" "%% FoomaticRIPOptionSetting: MediaType=APhoto"
+ Choice "PPhoto/HP Premium Photo" "%% FoomaticRIPOptionSetting: MediaType=PPhoto"
+ Choice "Plain/Plain" "%% FoomaticRIPOptionSetting: MediaType=Plain"
+ Choice "OPhoto/Other Photo" "%% FoomaticRIPOptionSetting: MediaType=OPhoto"
+ Option "PrintQuality/Print Quality " PickOne AnySetup 105.0
+ *Choice "Automatic/Automatic" "%% FoomaticRIPOptionSetting: MediaType=Automatic"
+ Choice "Best/Best" "%% FoomaticRIPOptionSetting: MediaType=Best"
+ Choice "Normal/Normal" "%% FoomaticRIPOptionSetting: MediaType=Normal"
+ Choice "FastNormal/FastNormal" "%% FoomaticRIPOptionSetting: MediaType=FastNormal"
+ Option "Borderless/Borderless Printing" Boolean AnySetup 105.0
+ Choice "Disable/Disable" "%% FoomaticRIPOptionSetting: Borderless=off"
+ *Choice "Enable/Enable" "%% FoomaticRIPOptionSetting: Borderless=on"
+ Group "RLT/HP Real Life Technologies"
+ Option "PhotoFix/Photo Fix" Boolean AnySetup 105.0
+ *Choice "off/Disable" "%% FoomaticRIPOptionSetting: PhotoFix=off"
+ Choice "on/Enable" "%% FoomaticRIPOptionSetting: PhotoFix=on"
+ Option "RedEye/Red Eye Removal" Boolean AnySetup 105.0
+ Choice "off/Disable" "%% FoomaticRIPOptionSetting: RedEye=off"
+ *Choice "on/Enable" "%% FoomaticRIPOptionSetting: RedEye=on"
+ *CustomMedia "Automatic/Automatic" 288.00 432.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Automatic" "%% FoomaticRIPOptionSetting: PageSize=Automatic"
+ CustomMedia "4x6/4x6in, 10x15cm, A6, Hagaki " 288.00 432.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=4x6" "%% FoomaticRIPOptionSetting: PageSize=4x6"
+ CustomMedia "5x7/5x7in, 13x18cm, 2L" 360.00 504.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=5x7" "%% FoomaticRIPOptionSetting: PageSize=5x7"
+ CustomMedia "L/3.5x5in, L" 252.00 360.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=L" "%% FoomaticRIPOptionSetting: PageSize=L"
+ CustomMedia "4x8/4x8in, 10x20cm" 288.00 576.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=4x8" "%% FoomaticRIPOptionSetting: PageSize=4x8"
+ CustomMedia "4x12/4x12in, 10x30cm" 288.00 864.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=4x12" "%% FoomaticRIPOptionSetting: PageSize=4x12"
+ // <%QuickConnect:Normal%>
+ {
+ ModelName "HP Photosmart a530 Series hpijs"
+ Attribute "NickName" "" "HP Photosmart a530 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart a530 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart a530 series;DES:photosmart a530 series;"
+ PCFileName "hp-photosmart_a530_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart a532 Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart a536 Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart a538 Compact Photo Printer)"
+ }
+ {
+ ModelName "HP Photosmart a630 Series hpijs"
+ Attribute "NickName" "" "HP Photosmart a630 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart a630 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart a630 series;DES:photosmart a630 series;"
+ PCFileName "hp-photosmart_a630_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart a636 Compact Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart a637 Compact Photo Printer)"
+ }
+ {
+ ModelName "HP Photosmart a640 Series hpijs"
+ Attribute "NickName" "" "HP Photosmart a640 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart a640 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart a640 series;DES:photosmart a640 series;"
+ PCFileName "hp-photosmart_a640_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart a640 Printer Series)"
+ }
+} // end QuickConnect, 4-sided fullbleed
+
+///////////////// LJMono
+{
+ Attribute "DefaultResolution" "" "600dpi"
+
+ // Custom page sizes from 1x4in to Ledger
+ HWMargins 18 14.4 18 14.4
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 11in 17in
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-LaserJet_4 hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-LaserJet_4" " -sDeviceManufacturer=&&
+&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;HP LaserJet&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=300DraftGraysca&&
+leK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=300GrayscaleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High" "Quality=600GrayscaleK"
+ Attribute "FoomaticRIPOption" "InputSlot" "enum CmdLine C"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Default" ",PS:MediaPosition=7"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=PhotoTray" ",PS:MediaPosition=6"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Upper" ",PS:MediaPosition=1"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Lower" ",PS:MediaPosition=4"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=CDDVDTray" ",PS:MediaPosition=14"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Envelope" ",PS:MediaPosition=3"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=LargeCapacity" ",PS:MediaPosition=&&
+5"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Manual" ",PS:MediaPosition=2"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=MPTray" ",PS:MediaPosition=8"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD120" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ ////////// Large format paper support
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B4JIS" " -dDEVICEWIDTHPOINTS=729 -d&&
+DEVICEHEIGHTPOINTS=1033"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Ledger" " -dDEVICEWIDTHPOINTS=792 -&&
+dDEVICEHEIGHTPOINTS=1224"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=SuperB" " -dDEVICEWIDTHPOINTS=936 -&&
+dDEVICEHEIGHTPOINTS=1368"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w774h1116" " -dDEVICEWIDTHPOINTS=77&&
+4 -dDEVICEHEIGHTPOINTS=1116"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A3" " -dDEVICEWIDTHPOINTS=842 -dDEV&&
+ICEHEIGHTPOINTS=1190"
+ Attribute "FoomaticRIPOption" "Duplex" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexNoTumble" " -dDuplex=true -dTum&&
+ble=false"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexTumble" " -dDuplex=true -dTumbl&&
+e=true"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=None" " -dDuplex=false"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftGrayscaleK" " -r300 -sIjsPar&&
+ams=Quality:Quality=1,Quality:ColorMode=0,Quality:MediaType=0,Quality:&&
+PenSet=0"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300GrayscaleK" " -r300 -sIjsParams=Q&&
+uality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:PenSe&&
+t=0"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600GrayscaleK" " -r600 -sIjsParams=Q&&
+uality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:PenSe&&
+t=0"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft (Economy)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ *Choice "Normal/Normal" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "High/High Quality" "%% FoomaticRIPOptionSetting: PrintoutMode=High"
+ Option "InputSlot/Media Source" PickOne AnySetup 100.0
+ *Choice "Default/Printer default" "%% FoomaticRIPOptionSetting: InputSlot=Default"
+ Choice "PhotoTray/Photo Tray" "%% FoomaticRIPOptionSetting: InputSlot=PhotoTray"
+ Choice "Upper/Upper Tray" "%% FoomaticRIPOptionSetting: InputSlot=Upper"
+ Choice "Lower/Lower Tray" "%% FoomaticRIPOptionSetting: InputSlot=Lower"
+ Choice "CDDVDTray/CD or DVD Tray" "%% FoomaticRIPOptionSetting: InputSlot=CDDVDTray"
+ Choice "Envelope/Envelope Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Envelope"
+ Choice "LargeCapacity/Large Capacity Tray" "%% FoomaticRIPOptionSetting: InputSlot=LargeCapacity"
+ Choice "Manual/Manual Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Manual"
+ Choice "MPTray/Multi Purpose Tray" "%% FoomaticRIPOptionSetting: InputSlot=MPTray"
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 120.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "%% FoomaticRIPOptionSetting: Duplex=DuplexNoTumble"
+ Choice "DuplexTumble/Short Edge (Flip)" "%% FoomaticRIPOptionSetting: Duplex=DuplexTumble"
+ *Choice "None/Off" "%% FoomaticRIPOptionSetting: Duplex=None"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "300DraftGrayscaleK/300 dpi, Draft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftGrayscaleK"
+ Choice "300GrayscaleK/300 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300GrayscaleK"
+ Choice "600GrayscaleK/600 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=600GrayscaleK"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo or 5x7 inch index card" 360.00 504.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "CDDVD120/CD or DVD 120 mm" 360.00 360.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=CDDVD120" "%% FoomaticRIPOptionSetting: PageSize=CDDVD120"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+ // <%LJMono:Normal%>
+ {
+ ModelName "HP LaserJet 4mp hpijs"
+ Attribute "NickName" "" "HP LaserJet 4mp hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 4mp hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 4mp;DES:hp laserjet 4mp;"
+ PCFileName "hp-laserjet_4mp-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 4mp Printer)"
+ }
+ {
+ ModelName "HP LaserJet 4 Plus hpijs"
+ Attribute "NickName" "" "HP LaserJet 4 Plus hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 4 Plus hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 4 plus;DES:hp laserjet 4 plus;"
+ PCFileName "hp-laserjet_4_plus-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 4 Plus Printer)"
+ Attribute "Product" "" "(HP LaserJet 4m Plus Printer)"
+ }
+ {
+ ModelName "HP LaserJet 4v hpijs"
+ Attribute "NickName" "" "HP LaserJet 4v hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 4v hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 4v;DES:hp laserjet 4v;"
+ PCFileName "hp-laserjet_4v-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 4v Printer)"
+ }
+ {
+ ModelName "HP LaserJet 4si hpijs"
+ Attribute "NickName" "" "HP LaserJet 4si hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 4si hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 4si;DES:hp laserjet 4si;"
+ PCFileName "hp-laserjet_4si-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 4si Printer)"
+ Attribute "Product" "" "(HP LaserJet 4si Mx Printer)"
+ }
+ {
+ ModelName "HP LaserJet 5l hpijs"
+ Attribute "NickName" "" "HP LaserJet 5l hpijs, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 5l hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 5l;DES:hp laserjet 5l;"
+ PCFileName "hp-laserjet_5l-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet 5l Printer)"
+ Attribute "Product" "" "(HP LaserJet 5l-fs Printer)"
+ Attribute "Product" "" "(HP LaserJet 5l Xtra Printer)"
+ }
+ {
+ ModelName "HP LaserJet 5mp hpijs"
+ Attribute "NickName" "" "HP LaserJet 5mp hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 5mp hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 5mp;DES:hp laserjet 5mp;"
+ PCFileName "hp-laserjet_5mp-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 5mp Printer)"
+ }
+ {
+ ModelName "HP LaserJet 5p hpijs"
+ Attribute "NickName" "" "HP LaserJet 5p hpijs, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 5p hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 5p;DES:hp laserjet 5p;"
+ PCFileName "hp-laserjet_5p-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet 5p Printer)"
+ }
+ {
+ ModelName "HP LaserJet 6l hpijs"
+ Attribute "NickName" "" "HP LaserJet 6l hpijs, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 6l hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 6l;DES:hp laserjet 6l;"
+ PCFileName "hp-laserjet_6l-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet 6l Printer)"
+ Attribute "Product" "" "(HP LaserJet 6lse Printer)"
+ Attribute "Product" "" "(HP LaserJet 6lxi Printer)"
+ Attribute "Product" "" "(HP LaserJet 6l Gold Printer)"
+ Attribute "Product" "" "(HP LaserJet 6l Pro Printer)"
+ }
+ {
+ ModelName "HP LaserJet 6p hpijs"
+ Attribute "NickName" "" "HP LaserJet 6p hpijs, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 6p hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 6p;DES:hp laserjet 6p;"
+ PCFileName "hp-laserjet_6p-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet 6p Printer)"
+ }
+ {
+ ModelName "HP LaserJet 6mp hpijs"
+ Attribute "NickName" "" "HP LaserJet 6mp hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 6mp hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 6mp;DES:hp laserjet 6mp;"
+ PCFileName "hp-laserjet_6mp-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 6mp Printer)"
+ Attribute "Product" "" "(HP LaserJet 6mp Se Printer)"
+ Attribute "Product" "" "(HP LaserJet 6mp Xi Printer)"
+ }
+ {
+ ModelName "HP LaserJet 1015 hpijs"
+ Attribute "NickName" "" "HP LaserJet 1015 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 1015 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 1015;DES:hp laserjet 1015;"
+ PCFileName "hp-laserjet_1015-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet 1015 Printer)"
+ }
+ {
+ ModelName "HP LaserJet 1022nw hpijs"
+ Attribute "NickName" "" "HP LaserJet 1022nw hpijs pcl3, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LaserJet 1022nw hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 1022nw;DES:hp laserjet 1022nw;"
+ PCFileName "hp-laserjet_1022nw-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 1022nw Printer)"
+ }
+ {
+ ModelName "HP LaserJet 1022n hpijs"
+ Attribute "NickName" "" "HP LaserJet 1022n hpijs pcl3, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LaserJet 1022n hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 1022n;DES:hp laserjet 1022n;"
+ PCFileName "hp-laserjet_1022n-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 1022n Printer)"
+ Attribute "Product" "" "(HP LaserJet 1022nxi Printer)"
+ }
+ {
+ ModelName "HP LaserJet 1022 hpijs"
+ Attribute "NickName" "" "HP LaserJet 1022 hpijs pcl3, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LaserJet 1022 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 1022;DES:hp laserjet 1022;"
+ PCFileName "hp-laserjet_1022-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 1022 Printer)"
+ }
+ {
+ ModelName "HP LaserJet 1100a hpijs"
+ Attribute "NickName" "" "HP LaserJet 1100a hpijs, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 1100a hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 1100a;DES:hp laserjet 1100a;"
+ PCFileName "hp-laserjet_1100a-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet 1100a All-in-one Printer)"
+ Attribute "Product" "" "(HP LaserJet 1100a Se All-in-one Printer)"
+ }
+ {
+ ModelName "HP LaserJet 1100 hpijs"
+ Attribute "NickName" "" "HP LaserJet 1100 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 1100 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 1100;DES:hp laserjet 1100;"
+ PCFileName "hp-laserjet_1100-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet 1100 Printer)"
+ Attribute "Product" "" "(HP LaserJet 1100se Printer)"
+ Attribute "Product" "" "(HP LaserJet 1100xi Printer)"
+ }
+ {
+ ModelName "HP LaserJet 1100xi hpijs"
+ Attribute "NickName" "" "HP LaserJet 1100xi hpijs, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 1100xi hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 1100xi;DES:hp laserjet 1100xi;"
+ PCFileName "hp-laserjet_1100xi-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet 1100a Xi All-in-one Printer)"
+ }
+ {
+ ModelName "HP LaserJet 1150 hpijs"
+ Attribute "NickName" "" "HP LaserJet 1150 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 1150 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 1150;DES:hp laserjet 1150;"
+ PCFileName "hp-laserjet_1150-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet 1150 Printer)"
+ }
+ {
+ ModelName "HP LaserJet 1160 hpijs"
+ Attribute "NickName" "" "HP LaserJet 1160 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 1160 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 1160;DES:hp laserjet 1160;"
+ PCFileName "hp-laserjet_1160-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet 1160 Printer)"
+ Attribute "Product" "" "(HP LaserJet 1160le Printer)"
+ }
+ {
+ ModelName "HP LaserJet 1160 Series hpijs"
+ Attribute "NickName" "" "HP LaserJet 1160 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 1160 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 1160 series;DES:hp laserjet 1160 series;"
+ PCFileName "hp-laserjet_1160_series-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet 1160 Series Printer)"
+ }
+ {
+ ModelName "HP LaserJet 1200 hpijs"
+ Attribute "NickName" "" "HP LaserJet 1200 hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 1200 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 1200;DES:hp laserjet 1200;"
+ PCFileName "hp-laserjet_1200-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 1200 Printer)"
+ Attribute "Product" "" "(HP LaserJet 1200se Printer)"
+ }
+ {
+ ModelName "HP LaserJet 1200n hpijs"
+ Attribute "NickName" "" "HP LaserJet 1200n hpijs, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 1200n hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 1200n;DES:hp laserjet 1200n;"
+ PCFileName "hp-laserjet_1200n-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet 1200n Printer)"
+ }
+ {
+ ModelName "HP LaserJet 1220se hpijs"
+ Attribute "NickName" "" "HP LaserJet 1220se hpijs, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 1220se hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 1220se;DES:hp laserjet 1220se;"
+ PCFileName "hp-laserjet_1220se-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet 1220se All-in-one Printer)"
+ }
+ {
+ ModelName "HP LaserJet 1220 hpijs"
+ Attribute "NickName" "" "HP LaserJet 1220 hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 1220 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 1220;DES:hp laserjet 1220;"
+ PCFileName "hp-laserjet_1220-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 1220 All-in-one Printer)"
+ }
+ {
+ ModelName "HP LaserJet 1300 hpijs"
+ Attribute "NickName" "" "HP LaserJet 1300 hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 1300 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 1300;DES:hp laserjet 1300;"
+ PCFileName "hp-laserjet_1300-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 1300 Printer)"
+ Attribute "Product" "" "(HP LaserJet 1300t Printer)"
+ }
+ {
+ ModelName "HP LaserJet 1300n hpijs"
+ Attribute "NickName" "" "HP LaserJet 1300n hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 1300n hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 1300n;DES:hp laserjet 1300n;"
+ PCFileName "hp-laserjet_1300n-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 1300n Printer)"
+ }
+ {
+ ModelName "HP LaserJet 1300xi hpijs"
+ Attribute "NickName" "" "HP LaserJet 1300xi hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 1300xi hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 1300xi;DES:hp laserjet 1300xi;"
+ PCFileName "hp-laserjet_1300xi-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 1300xi Printer)"
+ }
+ {
+ ModelName "HP LaserJet 1320 Series hpijs"
+ Attribute "NickName" "" "HP LaserJet 1320 Series hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 1320 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 1320 series;DES:hp laserjet 1320 series;"
+ PCFileName "hp-laserjet_1320_series-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 1320 Series Printer)"
+ }
+ {
+ ModelName "HP LaserJet 1320n hpijs"
+ Attribute "NickName" "" "HP LaserJet 1320n hpijs, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 1320n hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 1320n;DES:hp laserjet 1320n;"
+ PCFileName "hp-laserjet_1320n-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet 1320n Printer)"
+ }
+ {
+ ModelName "HP LaserJet 1320tn hpijs"
+ Attribute "NickName" "" "HP LaserJet 1320tn hpijs, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 1320tn hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 1320tn;DES:hp laserjet 1320tn;"
+ PCFileName "hp-laserjet_1320tn-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet 1320tn Printer)"
+ }
+ {
+ ModelName "HP LaserJet 1320 hpijs"
+ Attribute "NickName" "" "HP LaserJet 1320 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 1320 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 1320;DES:hp laserjet 1320;"
+ PCFileName "hp-laserjet_1320-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet 1320 Printer)"
+ Attribute "Product" "" "(HP LaserJet 1320t Printer)"
+ }
+ {
+ ModelName "HP LaserJet 1320nw hpijs"
+ Attribute "NickName" "" "HP LaserJet 1320nw hpijs, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 1320nw hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 1320nw;DES:hp laserjet 1320nw;"
+ PCFileName "hp-laserjet_1320nw-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet 1320nw Printer)"
+ }
+ {
+ ModelName "HP LaserJet p1505n hpijs"
+ Attribute "NickName" "" "HP LaserJet p1505n hpijs pcl3, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LaserJet p1505n hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet p1505n;DES:hp laserjet p1505n;"
+ PCFileName "hp-laserjet_p1505n-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet p1505n Printer)"
+ }
+ {
+ ModelName "HP LaserJet m1522nf MFP hpijs"
+ Attribute "NickName" "" "HP LaserJet m1522nf MFP hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet m1522nf MFP hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet m1522nf mfp;DES:hp laserjet m1522nf mfp;"
+ PCFileName "hp-laserjet_m1522nf_mfp-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet m1522nf Multifunction Printer)"
+ }
+ {
+ ModelName "HP LaserJet m1536dnf MFP hpijs"
+ Attribute "NickName" "" "HP LaserJet m1536dnf MFP hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet m1536dnf MFP hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet m1536dnf mfp;DES:hp laserjet m1536dnf mfp;"
+ PCFileName "hp-laserjet_m1536dnf_mfp-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet m1536dnf MFP)"
+ }
+ {
+ ModelName "HP LaserJet m1537dnf MFP hpijs"
+ Attribute "NickName" "" "HP LaserJet m1537dnf MFP hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet m1537dnf MFP hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet m1537dnf mfp;DES:hp laserjet m1537dnf mfp;"
+ PCFileName "hp-laserjet_m1537dnf_mfp-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet m1537dnf MFP)"
+ }
+ {
+ ModelName "HP LaserJet m1538dnf MFP hpijs"
+ Attribute "NickName" "" "HP LaserJet m1538dnf MFP hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet m1538dnf MFP hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet m1538dnf mfp;DES:hp laserjet m1538dnf mfp;"
+ PCFileName "hp-laserjet_m1538dnf_mfp-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet m1538dnf MFP)"
+ }
+ {
+ ModelName "HP LaserJet m1539dnf MFP hpijs"
+ Attribute "NickName" "" "HP LaserJet m1539dnf MFP hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet m1539dnf MFP hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet m1539dnf mfp;DES:hp laserjet m1539dnf mfp;"
+ PCFileName "hp-laserjet_m1539dnf_mfp-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet m1539dnf MFP)"
+ }
+ {
+ ModelName "HP LaserJet p2014 hpijs"
+ Attribute "NickName" "" "HP LaserJet p2014 hpijs pcl3, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LaserJet p2014 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet p2014;DES:hp laserjet p2014;"
+ PCFileName "hp-laserjet_p2014-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet p2014 Printer)"
+ }
+ {
+ ModelName "HP LaserJet p2014n hpijs"
+ Attribute "NickName" "" "HP LaserJet p2014n hpijs pcl3, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LaserJet p2014n hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet p2014n;DES:hp laserjet p2014n;"
+ PCFileName "hp-laserjet_p2014n-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet p2014n Printer)"
+ }
+ {
+ ModelName "HP LaserJet p2015dn Series hpijs"
+ Attribute "NickName" "" "HP LaserJet p2015dn Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP LJ p2015dn Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet p2015dn series;DES:hp laserjet p2015dn series;"
+ PCFileName "hp-laserjet_p2015dn_series-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet p2015dn Printer)"
+ }
+ {
+ ModelName "HP LaserJet p2015x Series hpijs"
+ Attribute "NickName" "" "HP LaserJet p2015x Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet p2015x Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet p2015x series;DES:hp laserjet p2015x series;"
+ PCFileName "hp-laserjet_p2015x_series-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet p2015x Printer)"
+ }
+ {
+ ModelName "HP LaserJet p2015d Series hpijs"
+ Attribute "NickName" "" "HP LaserJet p2015d Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet p2015d Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet p2015d series;DES:hp laserjet p2015d series;"
+ PCFileName "hp-laserjet_p2015d_series-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet p2015d Printer)"
+ }
+ {
+ ModelName "HP LaserJet p2015 Series hpijs"
+ Attribute "NickName" "" "HP LaserJet p2015 Series hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet p2015 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet p2015 series;DES:hp laserjet p2015 series;"
+ PCFileName "hp-laserjet_p2015_series-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet p2015 Printer)"
+ }
+ {
+ ModelName "HP LaserJet p2015n Series hpijs"
+ Attribute "NickName" "" "HP LaserJet p2015n Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet p2015n Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet p2015n series;DES:hp laserjet p2015n series;"
+ PCFileName "hp-laserjet_p2015n_series-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet p2015n Printer)"
+ }
+ {
+ ModelName "HP LaserJet p2035n hpijs"
+ Attribute "NickName" "" "HP LaserJet p2035n hpijs pcl3, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LaserJet p2035n hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet p2035n;DES:hp laserjet p2035n;"
+ PCFileName "hp-laserjet_p2035n-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet p2035n Printer)"
+ }
+ {
+ ModelName "HP LaserJet p2035 hpijs"
+ Attribute "NickName" "" "HP LaserJet p2035 hpijs pcl3, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LaserJet p2035 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet p2035;DES:hp laserjet p2035;"
+ PCFileName "hp-laserjet_p2035-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet p2035 Printer)"
+ }
+ {
+ ModelName "HP LaserJet p2055dn hpijs"
+ Attribute "NickName" "" "HP LaserJet p2055dn hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet p2055dn hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet p2055dn;DES:hp laserjet p2055dn;"
+ PCFileName "hp-laserjet_p2055dn-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet p2055dn Printer)"
+ }
+ {
+ ModelName "HP LaserJet p2055 hpijs"
+ Attribute "NickName" "" "HP LaserJet p2055 hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet p2055 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet p2055;DES:hp laserjet p2055;"
+ PCFileName "hp-laserjet_p2055-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet p2055 Printer)"
+ }
+ {
+ ModelName "HP LaserJet p2055d hpijs"
+ Attribute "NickName" "" "HP LaserJet p2055d hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet p2055d hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet p2055d;DES:hp laserjet p2055d;"
+ PCFileName "hp-laserjet_p2055d-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet p2055d Printer)"
+ }
+ {
+ ModelName "HP LaserJet p2055x hpijs"
+ Attribute "NickName" "" "HP LaserJet p2055x hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet p2055x hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet p2055x;DES:hp laserjet p2055x;"
+ PCFileName "hp-laserjet_p2055x-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet p2055x Printer)"
+ }
+ {
+ ModelName "HP LaserJet 2100 hpijs"
+ Attribute "NickName" "" "HP LaserJet 2100 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 2100 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 2100;DES:hp laserjet 2100;"
+ PCFileName "hp-laserjet_2100-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet 2100 Printer)"
+ Attribute "Product" "" "(HP LaserJet 2100m Printer)"
+ Attribute "Product" "" "(HP LaserJet 2100se Printer)"
+ Attribute "Product" "" "(HP LaserJet 2100tn Printer)"
+ Attribute "Product" "" "(HP LaserJet 2100xi Printer)"
+ }
+ {
+ ModelName "HP LaserJet 2100 Series hpijs"
+ Attribute "NickName" "" "HP LaserJet 2100 Series hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 2100 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 2100 series;DES:hp laserjet 2100 series;"
+ PCFileName "hp-laserjet_2100_series-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 2100 Series Printer)"
+ }
+ {
+ ModelName "HP LaserJet 2200 Series hpijs"
+ Attribute "NickName" "" "HP LaserJet 2200 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 2200 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 2200 series;DES:hp laserjet 2200 series;"
+ PCFileName "hp-laserjet_2200_series-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet 2200 Series Printer)"
+ }
+ {
+ ModelName "HP LaserJet 2200 hpijs"
+ Attribute "NickName" "" "HP LaserJet 2200 hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 2200 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 2200;DES:hp laserjet 2200;"
+ PCFileName "hp-laserjet_2200-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 2200 Printer)"
+ Attribute "Product" "" "(HP LaserJet 2200d Printer)"
+ Attribute "Product" "" "(HP LaserJet 2200dn Printer)"
+ Attribute "Product" "" "(HP LaserJet 2200dse Printer)"
+ Attribute "Product" "" "(HP LaserJet 2200dt Printer)"
+ Attribute "Product" "" "(HP LaserJet 2200dtn Printer)"
+ }
+ {
+ ModelName "HP LaserJet 2300 hpijs"
+ Attribute "NickName" "" "HP LaserJet 2300 hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 2300 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 2300;DES:hp laserjet 2300;"
+ PCFileName "hp-laserjet_2300-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 2300 Printer)"
+ Attribute "Product" "" "(HP LaserJet 2300n Printer)"
+ Attribute "Product" "" "(HP LaserJet 2300d Printer)"
+ Attribute "Product" "" "(HP LaserJet 2300dn Printer)"
+ Attribute "Product" "" "(HP LaserJet 2300dtn Printer)"
+ Attribute "Product" "" "(HP LaserJet 2300l Printer)"
+ }
+ {
+ ModelName "HP LaserJet 2300 Series hpijs"
+ Attribute "NickName" "" "HP LaserJet 2300 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 2300 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 2300 series;DES:hp laserjet 2300 series;"
+ PCFileName "hp-laserjet_2300_series-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet 2300 Series Printer)"
+ }
+ {
+ ModelName "HP LaserJet 2410 hpijs"
+ Attribute "NickName" "" "HP LaserJet 2410 hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 2410 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 2410;DES:hp laserjet 2410;"
+ PCFileName "hp-laserjet_2410-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 2410 Printer)"
+ }
+ {
+ ModelName "HP LaserJet 2420 hpijs"
+ Attribute "NickName" "" "HP LaserJet 2420 hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 2420 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 2420;DES:hp laserjet 2420;"
+ PCFileName "hp-laserjet_2420-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 2420 Printer)"
+ Attribute "Product" "" "(HP LaserJet 2420d Printer)"
+ Attribute "Product" "" "(HP LaserJet 2420dn Printer)"
+ Attribute "Product" "" "(HP LaserJet 2420n Printer)"
+ }
+ {
+ ModelName "HP LaserJet 2430 hpijs"
+ Attribute "NickName" "" "HP LaserJet 2430 hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 2430 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 2430;DES:hp laserjet 2430;"
+ PCFileName "hp-laserjet_2430-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 2430t Printer)"
+ Attribute "Product" "" "(HP LaserJet 2430 Printer)"
+ Attribute "Product" "" "(HP LaserJet 2430dtn Printer)"
+ Attribute "Product" "" "(HP LaserJet 2430n Printer)"
+ Attribute "Product" "" "(HP LaserJet 2430tn Printer)"
+ }
+ {
+ ModelName "HP LaserJet m2727 MFP hpijs"
+ Attribute "NickName" "" "HP LaserJet m2727 MFP hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet m2727 MFP hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet m2727 mfp;DES:hp laserjet m2727 mfp;"
+ PCFileName "hp-laserjet_m2727_mfp-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet m2727 Multifunction Printer)"
+ }
+ {
+ ModelName "HP LaserJet p3004 hpijs"
+ Attribute "NickName" "" "HP LaserJet p3004 hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet p3004 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet p3004;DES:hp laserjet p3004;"
+ PCFileName "hp-laserjet_p3004-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet p3004 Printer)"
+ }
+ {
+ ModelName "HP LaserJet p3005 hpijs"
+ Attribute "NickName" "" "HP LaserJet p3005 hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet p3005 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet p3005;DES:hp laserjet p3005;"
+ PCFileName "hp-laserjet_p3005-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet p3005 Printer)"
+ Attribute "Product" "" "(HP LaserJet p3005d Printer)"
+ Attribute "Product" "" "(HP LaserJet p3005dn Printer)"
+ Attribute "Product" "" "(HP LaserJet p3005n Printer)"
+ Attribute "Product" "" "(HP LaserJet p3005x Printer)"
+ Attribute "Product" "" "(HP LaserJet p3005dtn Printer)"
+ }
+ {
+ ModelName "HP LaserJet p3010 Series hpijs"
+ Attribute "NickName" "" "HP LaserJet p3010 Series hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet p3010 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet p3010 series;DES:hp laserjet p3010 series;"
+ PCFileName "hp-laserjet_p3010_series-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet p3015 Printer)"
+ Attribute "Product" "" "(HP LaserJet p3011 Printer)"
+ }
+ {
+ ModelName "HP LaserJet 3015 hpijs"
+ Attribute "NickName" "" "HP LaserJet 3015 hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 3015 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 3015;DES:hp laserjet 3015;"
+ PCFileName "hp-laserjet_3015-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 3015 All-in-one Printer)"
+ }
+ {
+ ModelName "HP LaserJet 3020 hpijs"
+ Attribute "NickName" "" "HP LaserJet 3020 hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 3020 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 3020;DES:hp laserjet 3020;"
+ PCFileName "hp-laserjet_3020-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 3020 All-in-one Printer)"
+ }
+ {
+ ModelName "HP LaserJet m3027 MFP hpijs"
+ Attribute "NickName" "" "HP LaserJet m3027 MFP hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet m3027 MFP hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet m3027 mfp;DES:hp laserjet m3027 mfp;"
+ PCFileName "hp-laserjet_m3027_mfp-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet m3027 Multifunction Printer)"
+ Attribute "Product" "" "(HP LaserJet m3027x Multifunction Printer)"
+ }
+ {
+ ModelName "HP LaserJet 3030 hpijs"
+ Attribute "NickName" "" "HP LaserJet 3030 hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 3030 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 3030;DES:hp laserjet 3030;"
+ PCFileName "hp-laserjet_3030-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 3030 All-in-one Printer)"
+ }
+ {
+ ModelName "HP LaserJet 3050 hpijs"
+ Attribute "NickName" "" "HP LaserJet 3050 hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 3050 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 3050;DES:hp laserjet 3050;"
+ PCFileName "hp-laserjet_3050-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 3050 All-in-one Printer)"
+ Attribute "Product" "" "(HP LaserJet 3050z All-in-one Printer)"
+ }
+ {
+ ModelName "HP LaserJet 3052 hpijs"
+ Attribute "NickName" "" "HP LaserJet 3052 hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 3052 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 3052;DES:hp laserjet 3052;"
+ PCFileName "hp-laserjet_3052-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 3052 All-in-one Printer)"
+ }
+ {
+ ModelName "HP LaserJet 3055 hpijs"
+ Attribute "NickName" "" "HP LaserJet 3055 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 3055 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 3055;DES:hp laserjet 3055;"
+ PCFileName "hp-laserjet_3055-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet 3055 All-in-one Printer)"
+ }
+ {
+ ModelName "HP LaserJet 3100 hpijs"
+ Attribute "NickName" "" "HP LaserJet 3100 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 3100 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 3100;DES:hp laserjet 3100;"
+ PCFileName "hp-laserjet_3100-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet 3100 All-in-one Printer)"
+ Attribute "Product" "" "(HP LaserJet 3100se All-in-one Printer)"
+ Attribute "Product" "" "(HP LaserJet 3100xi All-in-one Printer)"
+ }
+ {
+ ModelName "HP LaserJet 3150 hpijs"
+ Attribute "NickName" "" "HP LaserJet 3150 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 3150 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 3150;DES:hp laserjet 3150;"
+ PCFileName "hp-laserjet_3150-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet 3150xi All-in-one Printer)"
+ Attribute "Product" "" "(HP LaserJet 3150se All-in-one Printer)"
+ Attribute "Product" "" "(HP LaserJet 3150 All-in-one Printer)"
+ }
+ {
+ ModelName "HP LaserJet 3200m hpijs"
+ Attribute "NickName" "" "HP LaserJet 3200m hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 3200m hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 3200m;DES:hp laserjet 3200m;"
+ PCFileName "hp-laserjet_3200m-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 3200m All-in-one Printer)"
+ }
+ {
+ ModelName "HP LaserJet 3200se hpijs"
+ Attribute "NickName" "" "HP LaserJet 3200se hpijs, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 3200se hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 3200se;DES:hp laserjet 3200se;"
+ PCFileName "hp-laserjet_3200se-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet 3200 All-in-one Printer)"
+ }
+ {
+ ModelName "HP LaserJet 3200 hpijs"
+ Attribute "NickName" "" "HP LaserJet 3200 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 3200 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 3200;DES:hp laserjet 3200;"
+ PCFileName "hp-laserjet_3200-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet 3200 All-in-one Printer)"
+ }
+ {
+ ModelName "HP LaserJet 3300 3310 3320 hpijs"
+ Attribute "NickName" "" "HP LaserJet 3300 3310 3320 hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LJ 3300 3310 3320 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 3300 3310 3320;DES:hp laserjet 3300 3310 3320;"
+ PCFileName "hp-laserjet_3300_3310_3320-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 3300 Multifunction Printer)"
+ Attribute "Product" "" "(HP LaserJet 3310 Digital Printer Copier)"
+ Attribute "Product" "" "(HP LaserJet 3320n Multifunction Printer)"
+ Attribute "Product" "" "(HP LaserJet 3320 Multifunction Printer)"
+ Attribute "Product" "" "(HP LaserJet 3330 Multifunction Printer)"
+ }
+ {
+ ModelName "HP LaserJet 3330 hpijs"
+ Attribute "NickName" "" "HP LaserJet 3330 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 3330 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 3330;DES:hp laserjet 3330;"
+ PCFileName "hp-laserjet_3330-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet 3330 Multifunction Printer)"
+ }
+ {
+ ModelName "HP LaserJet 3380 hpijs"
+ Attribute "NickName" "" "HP LaserJet 3380 hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 3380 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 3380;DES:hp laserjet 3380;"
+ PCFileName "hp-laserjet_3380-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 3380 All-in-one Printer)"
+ }
+ {
+ ModelName "HP LaserJet 3390 hpijs"
+ Attribute "NickName" "" "HP LaserJet 3390 hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 3390 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 3390;DES:hp laserjet 3390;"
+ PCFileName "hp-laserjet_3390-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 3390 All-in-one Printer)"
+ }
+ {
+ ModelName "HP LaserJet 3392 hpijs"
+ Attribute "NickName" "" "HP LaserJet 3392 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 3392 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 3392;DES:hp laserjet 3392;"
+ PCFileName "hp-laserjet_3392-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet 3392 All-in-one Printer)"
+ }
+ {
+ ModelName "HP LaserJet 4000 Series hpijs"
+ Attribute "NickName" "" "HP LaserJet 4000 Series hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 4000 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 4000 series;DES:hp laserjet 4000 series;"
+ PCFileName "hp-laserjet_4000_series-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 4000 Printer)"
+ Attribute "Product" "" "(HP LaserJet 4000n Printer)"
+ Attribute "Product" "" "(HP LaserJet 4000se Printer)"
+ Attribute "Product" "" "(HP LaserJet 4000t Printer)"
+ Attribute "Product" "" "(HP LaserJet 4000tn Printer)"
+ }
+ {
+ ModelName "HP LaserJet p4014n hpijs"
+ Attribute "NickName" "" "HP LaserJet p4014n hpijs, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet p4014n hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet p4014n;DES:hp laserjet p4014n;"
+ PCFileName "hp-laserjet_p4014n-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet p4014n Printer)"
+ }
+ {
+ ModelName "HP LaserJet p4014dn hpijs"
+ Attribute "NickName" "" "HP LaserJet p4014dn hpijs, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet p4014dn hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet p4014dn;DES:hp laserjet p4014dn;"
+ PCFileName "hp-laserjet_p4014dn-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet p4014dn Printer)"
+ }
+ {
+ ModelName "HP LaserJet p4014 hpijs"
+ Attribute "NickName" "" "HP LaserJet p4014 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet p4014 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet p4014;DES:hp laserjet p4014;"
+ PCFileName "hp-laserjet_p4014-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet p4014 Printer)"
+ }
+ {
+ ModelName "HP LaserJet p4015tn hpijs"
+ Attribute "NickName" "" "HP LaserJet p4015tn hpijs, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet p4015tn hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet p4015tn;DES:hp laserjet p4015tn;"
+ PCFileName "hp-laserjet_p4015tn-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet p4015tn Printer)"
+ }
+ {
+ ModelName "HP LaserJet p4015 hpijs"
+ Attribute "NickName" "" "HP LaserJet p4015 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet p4015 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet p4015;DES:hp laserjet p4015;"
+ PCFileName "hp-laserjet_p4015-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet p4015 Printer)"
+ }
+ {
+ ModelName "HP LaserJet p4015x hpijs"
+ Attribute "NickName" "" "HP LaserJet p4015x hpijs, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet p4015x hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet p4015x;DES:hp laserjet p4015x;"
+ PCFileName "hp-laserjet_p4015x-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet p4015x Printer)"
+ }
+ {
+ ModelName "HP LaserJet p4015n hpijs"
+ Attribute "NickName" "" "HP LaserJet p4015n hpijs, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet p4015n hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet p4015n;DES:hp laserjet p4015n;"
+ PCFileName "hp-laserjet_p4015n-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet p4015n Printer)"
+ }
+ {
+ ModelName "HP LaserJet p4015dn hpijs"
+ Attribute "NickName" "" "HP LaserJet p4015dn hpijs, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet p4015dn hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet p4015dn;DES:hp laserjet p4015dn;"
+ PCFileName "hp-laserjet_p4015dn-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet p4015dn Printer)"
+ }
+ {
+ ModelName "HP LaserJet 4050 Series hpijs"
+ Attribute "NickName" "" "HP LaserJet 4050 Series hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 4050 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 4050 series;DES:hp laserjet 4050 series;"
+ PCFileName "hp-laserjet_4050_series-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 4050 Printer)"
+ Attribute "Product" "" "(HP LaserJet 4050n Printer)"
+ Attribute "Product" "" "(HP LaserJet 4050se Printer)"
+ Attribute "Product" "" "(HP LaserJet 4050t Printer)"
+ Attribute "Product" "" "(HP LaserJet 4050tn Printer)"
+ }
+ {
+ ModelName "HP LaserJet 4100 MFP hpijs"
+ Attribute "NickName" "" "HP LaserJet 4100 MFP hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 4100 MFP hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 4100 mfp;DES:hp laserjet 4100 mfp;"
+ PCFileName "hp-laserjet_4100_mfp-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 4100 Multifunction Printer)"
+ Attribute "Product" "" "(HP LaserJet 4101 Multifunction Printer)"
+ }
+ {
+ ModelName "HP LaserJet 4100 Series hpijs"
+ Attribute "NickName" "" "HP LaserJet 4100 Series hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 4100 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 4100 series;DES:hp laserjet 4100 series;"
+ PCFileName "hp-laserjet_4100_series-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 410dtn Printer)"
+ Attribute "Product" "" "(HP LaserJet 4100tn Printer)"
+ Attribute "Product" "" "(HP LaserJet 4100n Printer)"
+ Attribute "Product" "" "(HP LaserJet 4100 Printer)"
+ }
+ {
+ ModelName "HP LaserJet 4150 Series hpijs"
+ Attribute "NickName" "" "HP LaserJet 4150 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 4150 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 4150 series;DES:hp laserjet 4150 series;"
+ PCFileName "hp-laserjet_4150_series-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet 4150 Printer)"
+ }
+ {
+ ModelName "HP LaserJet 4200 hpijs"
+ Attribute "NickName" "" "HP LaserJet 4200 hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 4200 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 4200;DES:hp laserjet 4200;"
+ PCFileName "hp-laserjet_4200-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 4200 Printer)"
+ Attribute "Product" "" "(HP LaserJet 4200l Printer)"
+ Attribute "Product" "" "(HP LaserJet 4200ln Printer)"
+ Attribute "Product" "" "(HP LaserJet 4200lvn Printer)"
+ Attribute "Product" "" "(HP LaserJet 4200dtn Printer)"
+ Attribute "Product" "" "(HP LaserJet 4200dtns Printer)"
+ Attribute "Product" "" "(HP LaserJet 4200dtnsl Printer)"
+ Attribute "Product" "" "(HP LaserJet 4200n Printer)"
+ Attribute "Product" "" "(HP LaserJet 4200tn Printer)"
+ }
+ {
+ ModelName "HP LaserJet 4240 hpijs"
+ Attribute "NickName" "" "HP LaserJet 4240 hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 4240 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 4240;DES:hp laserjet 4240;"
+ PCFileName "hp-laserjet_4240-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 4240n Printer)"
+ Attribute "Product" "" "(HP LaserJet 4240 Printer)"
+ }
+ {
+ ModelName "HP LaserJet 4250 hpijs"
+ Attribute "NickName" "" "HP LaserJet 4250 hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 4250 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 4250;DES:hp laserjet 4250;"
+ PCFileName "hp-laserjet_4250-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 4250 Printer)"
+ Attribute "Product" "" "(HP LaserJet 4250dtn Printer)"
+ Attribute "Product" "" "(HP LaserJet 4250dtnsl Printer)"
+ Attribute "Product" "" "(HP LaserJet 4250n Printer)"
+ Attribute "Product" "" "(HP LaserJet 4250tn Printer)"
+ }
+ {
+ ModelName "HP LaserJet 4300 hpijs"
+ Attribute "NickName" "" "HP LaserJet 4300 hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 4300 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 4300;DES:hp laserjet 4300;"
+ PCFileName "hp-laserjet_4300-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 4300 Printer)"
+ Attribute "Product" "" "(HP LaserJet 4300dtn Printer)"
+ Attribute "Product" "" "(HP LaserJet 4300dtns Printer)"
+ Attribute "Product" "" "(HP LaserJet 4300dtnsl Printer)"
+ Attribute "Product" "" "(HP LaserJet 4300n Printer)"
+ Attribute "Product" "" "(HP LaserJet 4300tn Printer)"
+ }
+ {
+ ModelName "HP LaserJet 4345 MFP hpijs"
+ Attribute "NickName" "" "HP LaserJet 4345 MFP hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 4345 MFP hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 4345 mfp;DES:hp laserjet 4345 mfp;"
+ PCFileName "hp-laserjet_4345_mfp-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 4345 Multifunction Printer)"
+ Attribute "Product" "" "(HP LaserJet 4345x Multifunction Printer)"
+ Attribute "Product" "" "(HP LaserJet 4345xs Multifunction Printer)"
+ Attribute "Product" "" "(HP LaserJet 4345xm Multifunction Printer)"
+ }
+ {
+ ModelName "HP LaserJet m4345 MFP hpijs"
+ Attribute "NickName" "" "HP LaserJet m4345 MFP hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet m4345 MFP hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet m4345 mfp;DES:hp laserjet m4345 mfp;"
+ PCFileName "hp-laserjet_m4345_mfp-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet m4345 Multifunction Printer)"
+ Attribute "Product" "" "(HP LaserJet m4345x Multifunction Printer)"
+ Attribute "Product" "" "(HP LaserJet m4345xs Multifunction Printer)"
+ Attribute "Product" "" "(HP LaserJet m4345xm Multifunction Printer)"
+ }
+ {
+ ModelName "HP LaserJet m4349 MFP hpijs"
+ Attribute "NickName" "" "HP LaserJet m4349 MFP hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet m4349 MFP hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet m4349 mfp;DES:hp laserjet m4349 mfp;"
+ PCFileName "hp-laserjet_m4349_mfp-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet m4349 MFP)"
+ }
+ {
+ ModelName "HP LaserJet 4350 hpijs"
+ Attribute "NickName" "" "HP LaserJet 4350 hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 4350 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 4350;DES:hp laserjet 4350;"
+ PCFileName "hp-laserjet_4350-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 4350 Printer)"
+ Attribute "Product" "" "(HP LaserJet 4350dtn Printer)"
+ Attribute "Product" "" "(HP LaserJet 4350dtnsl Printer)"
+ Attribute "Product" "" "(HP LaserJet 4350n Printer)"
+ Attribute "Product" "" "(HP LaserJet 4350tn Printer)"
+ }
+ {
+ ModelName "HP LaserJet p4515tn hpijs"
+ Attribute "NickName" "" "HP LaserJet p4515tn hpijs, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet p4515tn hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet p4515tn;DES:hp laserjet p4515tn;"
+ PCFileName "hp-laserjet_p4515tn-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet p4515tn Printer)"
+ }
+ {
+ ModelName "HP LaserJet p4515n hpijs"
+ Attribute "NickName" "" "HP LaserJet p4515n hpijs, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet p4515n hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet p4515n;DES:hp laserjet p4515n;"
+ PCFileName "hp-laserjet_p4515n-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet p4515n Printer)"
+ }
+ {
+ ModelName "HP LaserJet p4515xm hpijs"
+ Attribute "NickName" "" "HP LaserJet p4515xm hpijs, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet p4515xm hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet p4515xm;DES:hp laserjet p4515xm;"
+ PCFileName "hp-laserjet_p4515xm-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet p4515xm Printer)"
+ }
+ {
+ ModelName "HP LaserJet p4515 hpijs"
+ Attribute "NickName" "" "HP LaserJet p4515 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet p4515 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet p4515;DES:hp laserjet p4515;"
+ PCFileName "hp-laserjet_p4515-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet p4515 Printer)"
+ }
+ {
+ ModelName "HP LaserJet p4515x hpijs"
+ Attribute "NickName" "" "HP LaserJet p4515x hpijs, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet p4515x hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet p4515x;DES:hp laserjet p4515x;"
+ PCFileName "hp-laserjet_p4515x-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet p4515x Printer)"
+ }
+ {
+ ModelName "HP LaserJet 5000 Series hpijs"
+ Attribute "NickName" "" "HP LaserJet 5000 Series hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 5000 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 5000 series;DES:hp laserjet 5000 series;"
+ PCFileName "hp-laserjet_5000_series-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 5000 Series Printer)"
+ }
+ {
+ ModelName "HP LaserJet 5200lx hpijs"
+ Attribute "NickName" "" "HP LaserJet 5200lx hpijs, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 5200lx hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 5200lx;DES:hp laserjet 5200lx;"
+ PCFileName "hp-laserjet_5200lx-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet 5200lx Printer)"
+ }
+ {
+ ModelName "HP LaserJet 8000 Series hpijs"
+ Attribute "NickName" "" "HP LaserJet 8000 Series hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 8000 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 8000 series;DES:hp laserjet 8000 series;"
+ PCFileName "hp-laserjet_8000_series-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 8000 Series Printer)"
+ }
+ {
+ ModelName "HP LaserJet 8100 MFP hpijs"
+ Attribute "NickName" "" "HP LaserJet 8100 MFP hpijs, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 8100 MFP hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 8100 mfp;DES:hp laserjet 8100 mfp;"
+ PCFileName "hp-laserjet_8100_mfp-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet 8100 Multifunction Printer)"
+ }
+ {
+ ModelName "HP LaserJet 8150 MFP hpijs"
+ Attribute "NickName" "" "HP LaserJet 8150 MFP hpijs, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 8150 MFP hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 8150 mfp;DES:hp laserjet 8150 mfp;"
+ PCFileName "hp-laserjet_8150_mfp-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet 8150 Multifunction Printer)"
+ }
+ {
+ ModelName "HP LaserJet m9040 MFP hpijs"
+ Attribute "NickName" "" "HP LaserJet m9040 MFP hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet m9040 MFP hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet m9040 mfp;DES:hp laserjet m9040 mfp;"
+ PCFileName "hp-laserjet_m9040_mfp-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet m9040 Multifunction Printer)"
+ }
+ {
+ ModelName "HP LaserJet m9050 MFP hpijs"
+ Attribute "NickName" "" "HP LaserJet m9050 MFP hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet m9050 MFP hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet m9050 mfp;DES:hp laserjet m9050 mfp;"
+ PCFileName "hp-laserjet_m9050_mfp-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet m9050 Multifunction Printer)"
+ Attribute "Product" "" "(HP LaserJet m9059 Multifunction Printer)"
+ }
+ {
+ ModelName "HP LaserJet m9059 MFP hpijs"
+ Attribute "NickName" "" "HP LaserJet m9059 MFP hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet m9059 MFP hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet m9059 mfp;DES:hp laserjet m9059 mfp;"
+ PCFileName "hp-laserjet_m9059_mfp-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet m9059 MFP)"
+ }
+ {
+ // Large format A3 paper support
+ CustomMedia "A3/A3" 842.00 1190.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=A3" "%% FoomaticRIPOptionSetting: PageSize=A3"
+ CustomMedia "B4JIS/B4 (JIS)" 729.00 1033.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=B4JIS" "%% FoomaticRIPOptionSetting: PageSize=B4JIS"
+ CustomMedia "Ledger/Ledger" 792.00 1224.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Ledger" "%% FoomaticRIPOptionSetting: PageSize=Ledger"
+ CustomMedia "w774h1116/8K" 774.00 1116.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=w774h1116" "%% FoomaticRIPOptionSetting: PageSize=w774h1116"
+ // <%LJMono:LargeFormatA3%>
+ {
+ ModelName "HP LaserJet 5si hpijs"
+ Attribute "NickName" "" "HP LaserJet 5si hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 5si hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 5si;DES:hp laserjet 5si;"
+ PCFileName "hp-laserjet_5si-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 5si Printer)"
+ Attribute "Product" "" "(HP LaserJet 5si Hm Printer)"
+ Attribute "Product" "" "(HP LaserJet 5si Mx Printer)"
+ Attribute "Product" "" "(HP LaserJet 5si Nx Printer)"
+ }
+ {
+ ModelName "HP LaserJet 5si Mopier hpijs"
+ Attribute "NickName" "" "HP LaserJet 5si Mopier hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 5si Mopier hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 5si mopier;DES:hp laserjet 5si mopier;"
+ PCFileName "hp-laserjet_5si_mopier-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 5si Mopier)"
+ Attribute "Product" "" "(HP LaserJet 5si Mopier Engine)"
+ }
+ {
+ ModelName "HP Mopier 240 hpijs"
+ Attribute "NickName" "" "HP Mopier 240 hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Mopier 240 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp mopier 240;DES:hp mopier 240;"
+ PCFileName "hp-mopier_240-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP Mopier 240 Printer)"
+ }
+ {
+ ModelName "HP Mopier 320 hpijs"
+ Attribute "NickName" "" "HP Mopier 320 hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Mopier 320 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp mopier 320;DES:hp mopier 320;"
+ PCFileName "hp-mopier_320-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP Mopier 320 Printer)"
+ }
+ {
+ ModelName "HP LaserJet m3035 MFP hpijs"
+ Attribute "NickName" "" "HP LaserJet m3035 MFP hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet m3035 MFP hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet m3035 mfp;DES:hp laserjet m3035 mfp;"
+ PCFileName "hp-laserjet_m3035_mfp-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet m3035 Multifunction Printer)"
+ Attribute "Product" "" "(HP LaserJet m3035xs Multifunction Printer)"
+ }
+ {
+ ModelName "HP LaserJet 5000 hpijs"
+ Attribute "NickName" "" "HP LaserJet 5000 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 5000 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 5000;DES:hp laserjet 5000;"
+ PCFileName "hp-laserjet_5000-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet 5000 Printer)"
+ Attribute "Product" "" "(HP LaserJet 5000le Printer)"
+ Attribute "Product" "" "(HP LaserJet 5000dn Printer)"
+ Attribute "Product" "" "(HP LaserJet 5000gn Printer)"
+ Attribute "Product" "" "(HP LaserJet 5000n Printer)"
+ }
+ {
+ ModelName "HP LaserJet m5025 MFP hpijs"
+ Attribute "NickName" "" "HP LaserJet m5025 MFP hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet m5025 MFP hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet m5025 mfp;DES:hp laserjet m5025 mfp;"
+ PCFileName "hp-laserjet_m5025_mfp-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet m5025 Multifunction Printer)"
+ }
+ {
+ ModelName "HP LaserJet m5035 MFP hpijs"
+ Attribute "NickName" "" "HP LaserJet m5035 MFP hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet m5035 MFP hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet m5035 mfp;DES:hp laserjet m5035 mfp;"
+ PCFileName "hp-laserjet_m5035_mfp-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet m5035 Multifunction Printer)"
+ Attribute "Product" "" "(HP LaserJet m5035x Multifunction Printer)"
+ Attribute "Product" "" "(HP LaserJet m5035xs Multifunction Printer)"
+ }
+ {
+ ModelName "HP LaserJet m5039 MFP hpijs"
+ Attribute "NickName" "" "HP LaserJet m5039 MFP hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet m5039 MFP hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet m5039 mfp;DES:hp laserjet m5039 mfp;"
+ PCFileName "hp-laserjet_m5039_mfp-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet m5039 Multifunction Printer)"
+ }
+ {
+ ModelName "HP LaserJet 5100 Series hpijs"
+ Attribute "NickName" "" "HP LaserJet 5100 Series hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 5100 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 5100 series;DES:hp laserjet 5100 series;"
+ PCFileName "hp-laserjet_5100_series-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 5100 Printer)"
+ Attribute "Product" "" "(HP LaserJet 5100le Printer)"
+ Attribute "Product" "" "(HP LaserJet 5100dtn Printer)"
+ Attribute "Product" "" "(HP LaserJet 5100se Printer)"
+ Attribute "Product" "" "(HP LaserJet 5100tn Printer)"
+ }
+ {
+ ModelName "HP LaserJet 5200 hpijs"
+ Attribute "NickName" "" "HP LaserJet 5200 hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 5200 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 5200;DES:hp laserjet 5200;"
+ PCFileName "hp-laserjet_5200-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 5200 Printer)"
+ Attribute "Product" "" "(HP LaserJet 5200n Printer)"
+ Attribute "Product" "" "(HP LaserJet 5200tn Printer)"
+ Attribute "Product" "" "(HP LaserJet 5200dtn Printer)"
+ }
+ {
+ ModelName "HP LaserJet 5200l hpijs"
+ Attribute "NickName" "" "HP LaserJet 5200l hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 5200l hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 5200l;DES:hp laserjet 5200l;"
+ PCFileName "hp-laserjet_5200l-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 5200l Printer)"
+ }
+ {
+ ModelName "HP LaserJet 8000 hpijs"
+ Attribute "NickName" "" "HP LaserJet 8000 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 8000 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 8000;DES:hp laserjet 8000;"
+ PCFileName "hp-laserjet_8000-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet 8000 Printer)"
+ Attribute "Product" "" "(HP LaserJet 8000dn Printer)"
+ Attribute "Product" "" "(HP LaserJet 8000n Printer)"
+ }
+ {
+ ModelName "HP LaserJet 8100 Series hpijs"
+ Attribute "NickName" "" "HP LaserJet 8100 Series hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 8100 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 8100 series;DES:hp laserjet 8100 series;"
+ PCFileName "hp-laserjet_8100_series-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 8100 Printer)"
+ Attribute "Product" "" "(HP LaserJet 8100dn Printer)"
+ Attribute "Product" "" "(HP LaserJet 8100n Printer)"
+ }
+ {
+ ModelName "HP LaserJet 8150 Series hpijs"
+ Attribute "NickName" "" "HP LaserJet 8150 Series hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 8150 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 8150 series;DES:hp laserjet 8150 series;"
+ PCFileName "hp-laserjet_8150_series-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 8150 Printer)"
+ Attribute "Product" "" "(HP LaserJet 8150n Printer)"
+ Attribute "Product" "" "(HP LaserJet 8150hn Printer)"
+ Attribute "Product" "" "(HP LaserJet 8150dn Printer)"
+ }
+ {
+ ModelName "HP LaserJet 9000 Series hpijs"
+ Attribute "NickName" "" "HP LaserJet 9000 Series hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 9000 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 9000 series;DES:hp laserjet 9000 series;"
+ PCFileName "hp-laserjet_9000_series-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 9000 Printer)"
+ Attribute "Product" "" "(HP LaserJet 9000n Printer)"
+ Attribute "Product" "" "(HP LaserJet 9000dn Printer)"
+ Attribute "Product" "" "(HP LaserJet 9000hns Printer)"
+ Attribute "Product" "" "(HP LaserJet 9000hnf Printer)"
+ }
+ {
+ ModelName "HP LaserJet 9000 MFP hpijs"
+ Attribute "NickName" "" "HP LaserJet 9000 MFP hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 9000 MFP hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 9000 mfp;DES:hp laserjet 9000 mfp;"
+ PCFileName "hp-laserjet_9000_mfp-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 9000 Multifunction Printer)"
+ Attribute "Product" "" "(HP LaserJet 9000l Multifunction Printer)"
+ }
+ {
+ ModelName "HP LaserJet 9040 MFP hpijs"
+ Attribute "NickName" "" "HP LaserJet 9040 MFP hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 9040 MFP hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 9040 mfp;DES:hp laserjet 9040 mfp;"
+ PCFileName "hp-laserjet_9040_mfp-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 9040n Printer)"
+ Attribute "Product" "" "(HP LaserJet 9040dn Printer)"
+ Attribute "Product" "" "(HP LaserJet 9040 Multifunction Printer)"
+ }
+ {
+ ModelName "HP LaserJet 9040 hpijs"
+ Attribute "NickName" "" "HP LaserJet 9040 hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 9040 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 9040;DES:hp laserjet 9040;"
+ PCFileName "hp-laserjet_9040-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 9040 Printer)"
+ Attribute "Product" "" "(HP LaserJet 9040n Printer)"
+ Attribute "Product" "" "(HP LaserJet 9040dn Printer)"
+ }
+ {
+ ModelName "HP LaserJet 9050 hpijs"
+ Attribute "NickName" "" "HP LaserJet 9050 hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 9050 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 9050;DES:hp laserjet 9050;"
+ PCFileName "hp-laserjet_9050-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 9050 Printer)"
+ Attribute "Product" "" "(HP LaserJet 9050n Printer)"
+ Attribute "Product" "" "(HP LaserJet 9050dn Printer)"
+ }
+ {
+ ModelName "HP LaserJet 9050 MFP hpijs"
+ Attribute "NickName" "" "HP LaserJet 9050 MFP hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 9050 MFP hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 9050 mfp;DES:hp laserjet 9050 mfp;"
+ PCFileName "hp-laserjet_9050_mfp-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 9050 Multifunction Printer)"
+ }
+ {
+ ModelName "HP LaserJet 9055mfp hpijs"
+ Attribute "NickName" "" "HP LaserJet 9055mfp hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 9055mfp hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 9055mfp;DES:hp laserjet 9055mfp;"
+ PCFileName "hp-laserjet_9055mfp-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 9055 Multifunction Printer)"
+ }
+ {
+ ModelName "HP LaserJet 9065mfp hpijs"
+ Attribute "NickName" "" "HP LaserJet 9065mfp hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 9065mfp hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 9065mfp;DES:hp laserjet 9065mfp;"
+ PCFileName "hp-laserjet_9065mfp-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet 9065 Multifunction Printer)"
+ }
+ }
+} // end LJMono
+
+///////////////// LJMono 300 dpi only
+{
+ Attribute "DefaultResolution" "" "300dpi"
+
+ // Custom page sizes from 1x4in to Legal
+ HWMargins 18 14.4 18 14.4
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 8.5in 14in
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-LaserJet_4L hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-LaserJet_4L" " -sDeviceManufacturer&&
+=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;HP LaserJet&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B 10"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=300DraftGraysc&&
+aleK"
+ Attribute "FoomaticRIPOption" "InputSlot" "enum CmdLine C"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Default" ",PS:MediaPosition=7"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=PhotoTray" ",PS:MediaPosition=6"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Upper" ",PS:MediaPosition=1"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Lower" ",PS:MediaPosition=4"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=CDDVDTray" ",PS:MediaPosition=14"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Envelope" ",PS:MediaPosition=3"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=LargeCapacity" ",PS:MediaPosition=&&
+5"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Manual" ",PS:MediaPosition=2"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=MPTray" ",PS:MediaPosition=8"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD120" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ Attribute "FoomaticRIPOption" "Duplex" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexNoTumble" " -dDuplex=true -dTum&&
+ble=false"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexTumble" " -dDuplex=true -dTumbl&&
+e=true"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=None" " -dDuplex=false"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B 100"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftGrayscaleK" " -r300 -sIjsPar&&
+ams=Quality:Quality=1,Quality:ColorMode=0,Quality:MediaType=0,Quality:&&
+PenSet=0"
+ Group "General/General"
+ Option "InputSlot/Media Source" PickOne AnySetup 100.0
+ *Choice "Default/Printer default" "%% FoomaticRIPOptionSetting: InputSlot=Default"
+ Choice "PhotoTray/Photo Tray" "%% FoomaticRIPOptionSetting: InputSlot=PhotoTray"
+ Choice "Upper/Upper Tray" "%% FoomaticRIPOptionSetting: InputSlot=Upper"
+ Choice "Lower/Lower Tray" "%% FoomaticRIPOptionSetting: InputSlot=Lower"
+ Choice "CDDVDTray/CD or DVD Tray" "%% FoomaticRIPOptionSetting: InputSlot=CDDVDTray"
+ Choice "Envelope/Envelope Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Envelope"
+ Choice "LargeCapacity/Large Capacity Tray" "%% FoomaticRIPOptionSetting: InputSlot=LargeCapacity"
+ Choice "Manual/Manual Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Manual"
+ Choice "MPTray/Multi Purpose Tray" "%% FoomaticRIPOptionSetting: InputSlot=MPTray"
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 120.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "%% FoomaticRIPOptionSetting: Duplex=DuplexNoTumble"
+ Choice "DuplexTumble/Short Edge (Flip)" "%% FoomaticRIPOptionSetting: Duplex=DuplexTumble"
+ *Choice "None/Off" "%% FoomaticRIPOptionSetting: Duplex=None"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo or 5x7 inch index card" 360.00 504.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "CDDVD120/CD or DVD 120 mm" 360.00 360.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=CDDVD120" "%% FoomaticRIPOptionSetting: PageSize=CDDVD120"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+ // <%LJMono:300dpiOnly%>
+ {
+ ModelName "HP LaserJet 4ml hpijs"
+ Attribute "NickName" "" "HP LaserJet 4ml hpijs, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 4ml hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 4ml;DES:hp laserjet 4ml;"
+ PCFileName "hp-laserjet_4ml-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet 4ml Printer)"
+ }
+ {
+ ModelName "HP LaserJet 4l hpijs"
+ Attribute "NickName" "" "HP LaserJet 4l hpijs, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 4l hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 4l;DES:hp laserjet 4l;"
+ PCFileName "hp-laserjet_4l-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet 4l Printer)"
+ Attribute "Product" "" "(HP LaserJet 4l Pro Printer)"
+ Attribute "Product" "" "(HP LaserJet 4lc Printer)"
+ Attribute "Product" "" "(HP LaserJet 4ml Printer)"
+ }
+} // end LJMono 300dpi only
+
+////////////// LJColor
+{
+ Attribute "DefaultResolution" "" "600dpi"
+
+ // Custom page sizes from 1x4in to SuperB
+ HWMargins 18 14.4 18 14.4
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 936 1368
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-Color_LaserJet_2500 hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-Color_LaserJet_2500" " -sDeviceManu&&
+facturer=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;hp color Lase&&
+rJet&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=150DraftColorCM&&
+YK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft.Gray" "Quality=150DraftGr&&
+ayscaleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=300ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal.Gray" "Quality=300Graysc&&
+aleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High" "Quality=600BestColorCMYK&&
+"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High.Gray" "Quality=600Grayscal&&
+eK"
+ Attribute "FoomaticRIPOption" "InputSlot" "enum CmdLine C"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Default" ",PS:MediaPosition=7"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=PhotoTray" ",PS:MediaPosition=6"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Upper" ",PS:MediaPosition=1"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Lower" ",PS:MediaPosition=4"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=CDDVDTray" ",PS:MediaPosition=14"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Envelope" ",PS:MediaPosition=3"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=LargeCapacity" ",PS:MediaPosition=&&
+5"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Manual" ",PS:MediaPosition=2"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=MPTray" ",PS:MediaPosition=8"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD120" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ ///////// Large format paper support
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B4JIS" " -dDEVICEWIDTHPOINTS=729 -d&&
+DEVICEHEIGHTPOINTS=1033"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Ledger" " -dDEVICEWIDTHPOINTS=792 -&&
+dDEVICEHEIGHTPOINTS=1224"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=SuperB" " -dDEVICEWIDTHPOINTS=936 -&&
+dDEVICEHEIGHTPOINTS=1368"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w774h1116" " -dDEVICEWIDTHPOINTS=77&&
+4 -dDEVICEHEIGHTPOINTS=1116"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A3" " -dDEVICEWIDTHPOINTS=842 -dDEV&&
+ICEHEIGHTPOINTS=1190"
+ Attribute "FoomaticRIPOption" "Duplex" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexNoTumble" " -dDuplex=true -dTum&&
+ble=false"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexTumble" " -dDuplex=true -dTumbl&&
+e=true"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=None" " -dDuplex=false"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=150BestColorCMYK" " -r150 -sIjsParam&&
+s=Quality:Quality=2,Quality:ColorMode=2,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=150ColorCMYK" " -r150 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=150DraftColorCMYK" " -r150 -sIjsPara&&
+ms=Quality:Quality=1,Quality:ColorMode=2,Quality:MediaType=0,Quality:P&&
+enSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=150DraftGrayscaleK" " -r150 -sIjs&&
+Params=Quality:Quality=1,Quality:ColorMode=0,Quality:MediaType=0,Quali&&
+ty:PenSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=150GrayscaleK" " -r150 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300BestColorCMYK" " -r300 -sIjsParam&&
+s=Quality:Quality=2,Quality:ColorMode=2,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYK" " -r300 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300GrayscaleK" " -r300 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600BestColorCMYK" " -r600 -sIjsParam&&
+s=Quality:Quality=2,Quality:ColorMode=2,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600GrayscaleK" " -r600 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ Choice "Draft.Gray/Draft Grayscale" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft.Gray"
+ *Choice "Normal/Normal" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "Normal.Gray/Normal Grayscale" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal.Gray"
+ Choice "High/High Quality" "%% FoomaticRIPOptionSetting: PrintoutMode=High"
+ Choice "High.Gray/High Quality Grayscale" "%% FoomaticRIPOptionSetting: PrintoutMode=High.Gray"
+ Option "InputSlot/Media Source" PickOne AnySetup 100.0
+ *Choice "Default/Printer default" "%% FoomaticRIPOptionSetting: InputSlot=Default"
+ Choice "PhotoTray/Photo Tray" "%% FoomaticRIPOptionSetting: InputSlot=PhotoTray"
+ Choice "Upper/Upper Tray" "%% FoomaticRIPOptionSetting: InputSlot=Upper"
+ Choice "Lower/Lower Tray" "%% FoomaticRIPOptionSetting: InputSlot=Lower"
+ Choice "CDDVDTray/CD or DVD Tray" "%% FoomaticRIPOptionSetting: InputSlot=CDDVDTray"
+ Choice "Envelope/Envelope Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Envelope"
+ Choice "LargeCapacity/Large Capacity Tray" "%% FoomaticRIPOptionSetting: InputSlot=LargeCapacity"
+ Choice "Manual/Manual Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Manual"
+ Choice "MPTray/Multi Purpose Tray" "%% FoomaticRIPOptionSetting: InputSlot=MPTray"
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 120.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "%% FoomaticRIPOptionSetting: Duplex=DuplexNoTumble"
+ Choice "DuplexTumble/Short Edge (Flip)" "%% FoomaticRIPOptionSetting: Duplex=DuplexTumble"
+ *Choice "None/Off" "%% FoomaticRIPOptionSetting: Duplex=None"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "150BestColorCMYK/150 dpi, Best, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=150BestColorCMYK"
+ Choice "150ColorCMYK/150 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=150ColorCMYK"
+ Choice "150DraftColorCMYK/150 dpi, Draft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=150DraftColorCMYK"
+ Choice "150DraftGrayscaleK/150 dpi, Draft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=150DraftGrayscaleK"
+ Choice "150GrayscaleK/150 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=150GrayscaleK"
+ Choice "300BestColorCMYK/300 dpi, Best, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300BestColorCMYK"
+ Choice "300ColorCMYK/300 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYK"
+ Choice "300GrayscaleK/300 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300GrayscaleK"
+ Choice "600BestColorCMYK/600 dpi, Best, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600BestColorCMYK"
+ Choice "600GrayscaleK/600 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=600GrayscaleK"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo or 5x7 inch index card" 360.00 504.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "CDDVD120/CD or DVD 120 mm" 360.00 360.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=CDDVD120" "%% FoomaticRIPOptionSetting: PageSize=CDDVD120"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+ // <%LJColor:Normal%>
+ {
+ ModelName "HP Color LaserJet cm1312nfi MFP hpijs"
+ Attribute "NickName" "" "HP Color LaserJet cm1312nfi MFP hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LJ cm1312nfi MFP hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet cm1312nfi mfp;DES:hp color laserjet cm1312nfi mfp;"
+ PCFileName "hp-color_laserjet_cm1312nfi_mfp-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet cm1312nfi Multifunction Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet cm1312 MFP hpijs"
+ Attribute "NickName" "" "HP Color LaserJet cm1312 MFP hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LJ cm1312 MFP hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet cm1312 mfp;DES:hp color laserjet cm1312 mfp;"
+ PCFileName "hp-color_laserjet_cm1312_mfp-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet cm1312 Multifunction Printer)"
+ }
+ {
+ ModelName "HP LaserJet cm1411fn hpijs"
+ Attribute "NickName" "" "HP LaserJet cm1411fn hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet cm1411fn hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet cm1411fn;DES:hp laserjet cm1411fn;"
+ PCFileName "hp-laserjet_cm1411fn-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet Professional cm1411fn)"
+ }
+ {
+ ModelName "HP LaserJet cm1412fn hpijs"
+ Attribute "NickName" "" "HP LaserJet cm1412fn hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet cm1412fn hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet cm1412fn;DES:hp laserjet cm1412fn;"
+ PCFileName "hp-laserjet_cm1412fn-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet Professional cm1412fn)"
+ }
+ {
+ ModelName "HP LaserJet cm1413fn hpijs"
+ Attribute "NickName" "" "HP LaserJet cm1413fn hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet cm1413fn hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet cm1413fn;DES:hp laserjet cm1413fn;"
+ PCFileName "hp-laserjet_cm1413fn-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet Professional cm1413fn)"
+ }
+ {
+ ModelName "HP LaserJet cm1415fnw hpijs"
+ Attribute "NickName" "" "HP LaserJet cm1415fnw hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet cm1415fnw hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet cm1415fnw;DES:hp laserjet cm1415fnw;"
+ PCFileName "hp-laserjet_cm1415fnw-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet Professional cm1415fnw)"
+ }
+ {
+ ModelName "HP LaserJet cm1415fn hpijs"
+ Attribute "NickName" "" "HP LaserJet cm1415fn hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet cm1415fn hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet cm1415fn;DES:hp laserjet cm1415fn;"
+ PCFileName "hp-laserjet_cm1415fn-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet Professional cm1415fn)"
+ }
+ {
+ ModelName "HP LaserJet cm1416fnw hpijs"
+ Attribute "NickName" "" "HP LaserJet cm1416fnw hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet cm1416fnw hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet cm1416fnw;DES:hp laserjet cm1416fnw;"
+ PCFileName "hp-laserjet_cm1416fnw-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet Professional cm1416fnw)"
+ }
+ {
+ ModelName "HP LaserJet cm1417fnw hpijs"
+ Attribute "NickName" "" "HP LaserJet cm1417fnw hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet cm1417fnw hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet cm1417fnw;DES:hp laserjet cm1417fnw;"
+ PCFileName "hp-laserjet_cm1417fnw-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet Professional cm1417fnw)"
+ }
+ {
+ ModelName "HP LaserJet cm1418fnw hpijs"
+ Attribute "NickName" "" "HP LaserJet cm1418fnw hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet cm1418fnw hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet cm1418fnw;DES:hp laserjet cm1418fnw;"
+ PCFileName "hp-laserjet_cm1418fnw-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP LaserJet Professional cm1418fnw)"
+ }
+ {
+ ModelName "HP Color LaserJet cp1514n hpijs"
+ Attribute "NickName" "" "HP Color LaserJet cp1514n hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LaserJet cp1514n hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet cp1514n;DES:hp color laserjet cp1514n;"
+ PCFileName "hp-color_laserjet_cp1514n-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet cp1514n Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet cp1515n hpijs"
+ Attribute "NickName" "" "HP Color LaserJet cp1515n hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LaserJet cp1515n hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet cp1515n;DES:hp color laserjet cp1515n;"
+ PCFileName "hp-color_laserjet_cp1515n-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet cp1515n Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet cp1518ni hpijs"
+ Attribute "NickName" "" "HP Color LaserJet cp1518ni hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LJ cp1518ni hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet cp1518ni;DES:hp color laserjet cp1518ni;"
+ PCFileName "hp-color_laserjet_cp1518ni-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet cp1518ni Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet cp2025dn hpijs"
+ Attribute "NickName" "" "HP Color LaserJet cp2025dn hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LJ cp2025dn hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet cp2025dn;DES:hp color laserjet cp2025dn;"
+ PCFileName "hp-color_laserjet_cp2025dn-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet cp2025dn Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet cp2025 hpijs"
+ Attribute "NickName" "" "HP Color LaserJet cp2025 hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LaserJet cp2025 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet cp2025;DES:hp color laserjet cp2025;"
+ PCFileName "hp-color_laserjet_cp2025-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet cp2025 Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet cp2025n hpijs"
+ Attribute "NickName" "" "HP Color LaserJet cp2025n hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LaserJet cp2025n hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet cp2025n;DES:hp color laserjet cp2025n;"
+ PCFileName "hp-color_laserjet_cp2025n-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet cp2025n Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet cp2025x hpijs"
+ Attribute "NickName" "" "HP Color LaserJet cp2025x hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LaserJet cp2025x hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet cp2025x;DES:hp color laserjet cp2025x;"
+ PCFileName "hp-color_laserjet_cp2025x-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet cp2025x Printer)"
+ }
+ {
+ ModelName "HP Business Inkjet 2300 hpijs"
+ Attribute "NickName" "" "HP Business Inkjet 2300 hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Business Inkjet 2300 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp business inkjet 2300;DES:hp business inkjet 2300;"
+ PCFileName "hp-business_inkjet_2300-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP Business Inkjet 2300 Printer)"
+ Attribute "Product" "" "(HP Business Inkjet 2300n Printer)"
+ Attribute "Product" "" "(HP Business Inkjet 2300dtn Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet 2500 hpijs"
+ Attribute "NickName" "" "HP Color LaserJet 2500 hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LaserJet 2500 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet 2500;DES:hp color laserjet 2500;"
+ PCFileName "hp-color_laserjet_2500-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet 2500 Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet 2500 Series hpijs"
+ Attribute "NickName" "" "HP Color LaserJet 2500 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Color LJ 2500 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet 2500 series;DES:hp color laserjet 2500 series;"
+ PCFileName "hp-color_laserjet_2500_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Color LaserJet 2500l Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 2500lse Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 2500n Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 2500tn Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet 3000 hpijs"
+ Attribute "NickName" "" "HP Color LaserJet 3000 hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LaserJet 3000 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet 3000;DES:hp color laserjet 3000;"
+ PCFileName "hp-color_laserjet_3000-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet 3000 Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 3000n Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 3000dn Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 3000dtn Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet cp3505 hpijs"
+ Attribute "NickName" "" "HP Color LaserJet cp3505 hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LaserJet cp3505 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet cp3505;DES:hp color laserjet cp3505;"
+ PCFileName "hp-color_laserjet_cp3505-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet cp3505n Printer)"
+ Attribute "Product" "" "(HP Color LaserJet cp3505dn Printer)"
+ Attribute "Product" "" "(HP Color LaserJet cp3505x Printer)"
+ Attribute "Product" "" "(HP Color LaserJet cp3505 Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet cp3525 hpijs"
+ Attribute "NickName" "" "HP Color LaserJet cp3525 hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LaserJet cp3525 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet cp3525;DES:hp color laserjet cp3525;"
+ PCFileName "hp-color_laserjet_cp3525-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet cp3525 Printer)"
+ Attribute "Product" "" "(HP Color LaserJet cp3525n Printer)"
+ Attribute "Product" "" "(HP Color LaserJet cp3525dn Printer)"
+ Attribute "Product" "" "(HP Color LaserJet cp3525x Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet cm3530 MFP hpijs"
+ Attribute "NickName" "" "HP Color LaserJet cm3530 MFP hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LJ cm3530 MFP hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet cm3530 mfp;DES:hp color laserjet cm3530 mfp;"
+ PCFileName "hp-color_laserjet_cm3530_mfp-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet cm3530 Multifunction Printer)"
+ Attribute "Product" "" "(HP Color LaserJet cm3530fs Multifunction Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet 3700 hpijs"
+ Attribute "NickName" "" "HP Color LaserJet 3700 hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LaserJet 3700 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet 3700;DES:hp color laserjet 3700;"
+ PCFileName "hp-color_laserjet_3700-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet 3700 Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet 3700n hpijs"
+ Attribute "NickName" "" "HP Color LaserJet 3700n hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Color LaserJet 3700n hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet 3700n;DES:hp color laserjet 3700n;"
+ PCFileName "hp-color_laserjet_3700n-hpijs.ppd"
+ Attribute "Product" "" "(HP Color LaserJet 3700n Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 3700dtn Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 3700dn Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 3700d Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet 3800 hpijs"
+ Attribute "NickName" "" "HP Color LaserJet 3800 hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LaserJet 3800 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet 3800;DES:hp color laserjet 3800;"
+ PCFileName "hp-color_laserjet_3800-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet 3800 Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 3800n Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 3800dn Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 3800dtn Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet cp4005 hpijs"
+ Attribute "NickName" "" "HP Color LaserJet cp4005 hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LaserJet cp4005 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet cp4005;DES:hp color laserjet cp4005;"
+ PCFileName "hp-color_laserjet_cp4005-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet cp4005n Printer)"
+ Attribute "Product" "" "(HP Color LaserJet cp4005dn Printer)"
+ Attribute "Product" "" "(HP Color LaserJet cp4005 Series Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet cp4020 Series hpijs"
+ Attribute "NickName" "" "HP Color LaserJet cp4020 Series hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LJ cp4020 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet cp4020 series;DES:hp color laserjet cp4020 series;"
+ PCFileName "hp-color_laserjet_cp4020_series-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet cp4020 Series Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet 4500 hpijs"
+ Attribute "NickName" "" "HP Color LaserJet 4500 hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LaserJet 4500 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet 4500;DES:hp color laserjet 4500;"
+ PCFileName "hp-color_laserjet_4500-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet 4500 Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 4500dn Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 4500n Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet cp4520 Series hpijs"
+ Attribute "NickName" "" "HP Color LaserJet cp4520 Series hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LJ cp4520 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet cp4520 series;DES:hp color laserjet cp4520 series;"
+ PCFileName "hp-color_laserjet_cp4520_series-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet cp4520 Series Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet cm4540 MFP hpijs"
+ Attribute "NickName" "" "HP Color LaserJet cm4540 MFP hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LJ cm4540 MFP hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet cm4540 mfp;DES:hp color laserjet cm4540 mfp;"
+ PCFileName "hp-color_laserjet_cm4540_mfp-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet cm4540 Multifunction Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet 4550 hpijs"
+ Attribute "NickName" "" "HP Color LaserJet 4550 hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LaserJet 4550 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet 4550;DES:hp color laserjet 4550;"
+ PCFileName "hp-color_laserjet_4550-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet 4550 Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 4550n Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 4550dn Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 4550hdn Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 4550n Plus Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 4550hdn Plus Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet 4600 Series hpijs"
+ Attribute "NickName" "" "HP Color LaserJet 4600 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Color LJ 4600 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet 4600 series;DES:hp color laserjet 4600 series;"
+ PCFileName "hp-color_laserjet_4600_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Color LaserJet 4600 Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 4600dn Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 4600dtn Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 4600hdn Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 4600n Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet 4600 hpijs"
+ Attribute "NickName" "" "HP Color LaserJet 4600 hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LaserJet 4600 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet 4600;DES:hp color laserjet 4600;"
+ PCFileName "hp-color_laserjet_4600-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet 4600 Series Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet 4610 hpijs"
+ Attribute "NickName" "" "HP Color LaserJet 4610 hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LaserJet 4610 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet 4610;DES:hp color laserjet 4610;"
+ PCFileName "hp-color_laserjet_4610-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet 4610n Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet 4650 hpijs"
+ Attribute "NickName" "" "HP Color LaserJet 4650 hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LaserJet 4650 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet 4650;DES:hp color laserjet 4650;"
+ PCFileName "hp-color_laserjet_4650-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet 4650 Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 4650n Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 4650dn Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 4650dtn Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 4650hdn Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet 4700 hpijs"
+ Attribute "NickName" "" "HP Color LaserJet 4700 hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LaserJet 4700 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet 4700;DES:hp color laserjet 4700;"
+ PCFileName "hp-color_laserjet_4700-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet 4700 Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 4700dn Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 4700dtn Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 4700n Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 4700ph+ Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet cm4730 MFP hpijs"
+ Attribute "NickName" "" "HP Color LaserJet cm4730 MFP hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LJ cm4730 MFP hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet cm4730 mfp;DES:hp color laserjet cm4730 mfp;"
+ PCFileName "hp-color_laserjet_cm4730_mfp-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet cm4730 Multifunction Printer)"
+ Attribute "Product" "" "(HP Color LaserJet cm4730f Multifunction Printer)"
+ Attribute "Product" "" "(HP Color LaserJet cm4730fm Multifunction Printer)"
+ Attribute "Product" "" "(HP Color LaserJet cm4730fsk Multifunction Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet 4730mfp hpijs"
+ Attribute "NickName" "" "HP Color LaserJet 4730mfp hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LaserJet 4730mfp hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet 4730mfp;DES:hp color laserjet 4730mfp;"
+ PCFileName "hp-color_laserjet_4730mfp-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet 4730xs Multifunction Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 4730xm Multifunction Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 4730x Multifunction Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 4730 Multifunction Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet cp5225 hpijs"
+ Attribute "NickName" "" "HP Color LaserJet cp5225 hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LaserJet cp5225 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet cp5225;DES:hp color laserjet cp5225;"
+ PCFileName "hp-color_laserjet_cp5225-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet cp5225)"
+ }
+ {
+ ModelName "HP Color LaserJet cp5225n hpijs"
+ Attribute "NickName" "" "HP Color LaserJet cp5225n hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LaserJet cp5225n hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet cp5225n;DES:hp color laserjet cp5225n;"
+ PCFileName "hp-color_laserjet_cp5225n-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet cp5225n)"
+ }
+ {
+ ModelName "HP Color LaserJet cp5225dn hpijs"
+ Attribute "NickName" "" "HP Color LaserJet cp5225dn hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LJ cp5225dn hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet cp5225dn;DES:hp color laserjet cp5225dn;"
+ PCFileName "hp-color_laserjet_cp5225dn-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet cp5225dn)"
+ }
+ {
+ ModelName "HP Color LaserJet cp5520 Series hpijs"
+ Attribute "NickName" "" "HP Color LaserJet cp5520 Series hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LJ cp5520 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet cp5520 series;DES:hp color laserjet cp5520 series;"
+ PCFileName "hp-color_laserjet_cp5520_series-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet cp5520 Series Printer)"
+ }
+ {
+ ModelName "HP Officejet 9100 Series hpijs"
+ Attribute "NickName" "" "HP Officejet 9100 Series hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Officejet 9100 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet 9100 series;DES:officejet 9100 series;"
+ PCFileName "hp-officejet_9100_series-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP Officejet 9110 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 9120 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 9130 All-in-one Printer)"
+ }
+ // <%LJColor:Normal:Advanced%>
+ {
+ ModelName "HP Color LaserJet cm2320 MFP hpijs"
+ Attribute "NickName" "" "HP Color LaserJet cm2320 MFP hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LJ cm2320 MFP hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet cm2320 mfp;DES:hp color laserjet cm2320 mfp;"
+ PCFileName "hp-color_laserjet_cm2320_mfp-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet cm2320 Multifuntion Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet cm2320fxi MFP hpijs"
+ Attribute "NickName" "" "HP Color LaserJet cm2320fxi MFP hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LJ cm2320fxi MFP hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet cm2320fxi mfp;DES:hp color laserjet cm2320fxi mfp;"
+ PCFileName "hp-color_laserjet_cm2320fxi_mfp-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet cm2320fxi Multifunction Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet cm2320n MFP hpijs"
+ Attribute "NickName" "" "HP Color LaserJet cm2320n MFP hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LJ cm2320n MFP hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet cm2320n mfp;DES:hp color laserjet cm2320n mfp;"
+ PCFileName "hp-color_laserjet_cm2320n_mfp-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet cm2320n Multifunction Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet cm2320nf MFP hpijs"
+ Attribute "NickName" "" "HP Color LaserJet cm2320nf MFP hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LJ cm2320nf MFP hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet cm2320nf mfp;DES:hp color laserjet cm2320nf mfp;"
+ PCFileName "hp-color_laserjet_cm2320nf_mfp-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet cm2320nf Multifunction Printer)"
+ }
+ {
+ // Large format SuperB paper support
+ CustomMedia "B4JIS/B4 (JIS)" 729.00 1033.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B4JIS" "%% FoomaticRIPOptionSetting: PageSize=B4JIS"
+ CustomMedia "Ledger/Ledger" 792.00 1224.00 14.40 36.00 14.40 9.00 "%% FoomaticRIPOptionSetting: PageSize=Ledger" "%% FoomaticRIPOptionSetting: PageSize=Ledger"
+ CustomMedia "SuperB/Super B" 936.00 1368.00 14.40 36.00 14.40 9.00 "%% FoomaticRIPOptionSetting: PageSize=SuperB" "%% FoomaticRIPOptionSetting: PageSize=SuperB"
+ CustomMedia "w774h1116/8K" 774.00 1116.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w774h1116" "%% FoomaticRIPOptionSetting: PageSize=w774h1116"
+ CustomMedia "A3/A3" 842.00 1190.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A3" "%% FoomaticRIPOptionSetting: PageSize=A3"
+ // <%LJColor:LargeFormatSuperB%>
+ {
+ ModelName "HP Business Inkjet 2600 hpijs"
+ Attribute "NickName" "" "HP Business Inkjet 2600 hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Business Inkjet 2600 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp business inkjet 2600;DES:hp business inkjet 2600;"
+ PCFileName "hp-business_inkjet_2600-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP Business Inkjet 2600 Printer)"
+ Attribute "Product" "" "(HP Business Inkjet 2600dn Printer)"
+ }
+ {
+ ModelName "HP Business Inkjet 2800 hpijs"
+ Attribute "NickName" "" "HP Business Inkjet 2800 hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Business Inkjet 2800 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp business inkjet 2800;DES:hp business inkjet 2800;"
+ PCFileName "hp-business_inkjet_2800-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP Business Inkjet 2800 Printer)"
+ Attribute "Product" "" "(HP Business Inkjet 2800dt Printer)"
+ Attribute "Product" "" "(HP Business Inkjet 2800dtn Printer)"
+ }
+ {
+ ModelName "HP Business Inkjet 3000 hpijs"
+ Attribute "NickName" "" "HP Business Inkjet 3000 hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Business Inkjet 3000 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp business inkjet 3000;DES:hp business inkjet 3000;"
+ PCFileName "hp-business_inkjet_3000-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP Business Inkjet 3000 Printer)"
+ Attribute "Product" "" "(HP Business Inkjet 3000dtn Printer)"
+ Attribute "Product" "" "(HP Business Inkjet 3000n Printer)"
+ }
+ }
+ {
+ // Large format A3 paper support
+ CustomMedia "A3/A3" 842.00 1190.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=A3" "%% FoomaticRIPOptionSetting: PageSize=A3"
+ CustomMedia "B4JIS/B4 (JIS)" 729.00 1033.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=B4JIS" "%% FoomaticRIPOptionSetting: PageSize=B4JIS"
+ CustomMedia "Ledger/Ledger" 792.00 1224.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Ledger" "%% FoomaticRIPOptionSetting: PageSize=Ledger"
+ CustomMedia "w774h1116/8K" 774.00 1116.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=w774h1116" "%% FoomaticRIPOptionSetting: PageSize=w774h1116"
+ // <%LJColor:LargeFormatA3%>
+ {
+ ModelName "HP Color LaserJet 5500 hpijs"
+ Attribute "NickName" "" "HP Color LaserJet 5500 hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LaserJet 5500 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet 5500;DES:hp color laserjet 5500;"
+ PCFileName "hp-color_laserjet_5500-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet 5500 Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 5500n Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 5500dn Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 5500dtn Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 5500hdn Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet 5550 hpijs"
+ Attribute "NickName" "" "HP Color LaserJet 5550 hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LaserJet 5550 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet 5550;DES:hp color laserjet 5550;"
+ PCFileName "hp-color_laserjet_5550-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet 5550n Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 5550 Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 5550dn Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 5550dtn Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 5550hdn Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet cp6015 hpijs"
+ Attribute "NickName" "" "HP Color LaserJet cp6015 hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LaserJet cp6015 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet cp6015;DES:hp color laserjet cp6015;"
+ PCFileName "hp-color_laserjet_cp6015-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet cp6015dn Printer)"
+ Attribute "Product" "" "(HP Color LaserJet cp6015x Printer)"
+ Attribute "Product" "" "(HP Color LaserJet cp6015xh Printer)"
+ Attribute "Product" "" "(HP Color LaserJet cp6015de Printer)"
+ Attribute "Product" "" "(HP Color LaserJet cp6015n Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet cm6030 MFP hpijs"
+ Attribute "NickName" "" "HP Color LaserJet cm6030 MFP hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LJ cm6030 MFP hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet cm6030 mfp;DES:hp color laserjet cm6030 mfp;"
+ PCFileName "hp-color_laserjet_cm6030_mfp-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet cm6030 Multifunction Printer)"
+ Attribute "Product" "" "(HP Color LaserJet cm6030f Multifunction Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet cm6040 MFP hpijs"
+ Attribute "NickName" "" "HP Color LaserJet cm6040 MFP hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Color LJ cm6040 MFP hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet cm6040 mfp;DES:hp color laserjet cm6040 mfp;"
+ PCFileName "hp-color_laserjet_cm6040_mfp-hpijs.ppd"
+ Attribute "Product" "" "(HP Color LaserJet cm6040 Multifunction Printer)"
+ Attribute "Product" "" "(HP Color LaserJet cm6040f Multifunction Printer)"
+ Attribute "Product" "" "(HP Color LaserJet cm6049f Multifunction Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet cm6049 MFP hpijs"
+ Attribute "NickName" "" "HP Color LaserJet cm6049 MFP hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Color LJ cm6049 MFP hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet cm6049 mfp;DES:hp color laserjet cm6049 mfp;"
+ PCFileName "hp-color_laserjet_cm6049_mfp-hpijs.ppd"
+ Attribute "Product" "" "(HP Color LaserJet cm6049 MFP)"
+ }
+ {
+ ModelName "HP Color LaserJet 8500 hpijs"
+ Attribute "NickName" "" "HP Color LaserJet 8500 hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LaserJet 8500 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet 8500;DES:hp color laserjet 8500;"
+ PCFileName "hp-color_laserjet_8500-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet 8500 Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 8500n Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 8500dn Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet 8550 hpijs"
+ Attribute "NickName" "" "HP Color LaserJet 8550 hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LaserJet 8550 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet 8550;DES:hp color laserjet 8550;"
+ PCFileName "hp-color_laserjet_8550-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet 8550dn Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 8550gn Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 8550mn Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 8550 Multifunction Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 8550mfp-dlvry/unpkging)"
+ Attribute "Product" "" "(HP Color LaserJet 8550 Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet 9500 hpijs"
+ Attribute "NickName" "" "HP Color LaserJet 9500 hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LaserJet 9500 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet 9500;DES:hp color laserjet 9500;"
+ PCFileName "hp-color_laserjet_9500-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet 9500n Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 9500hdn Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 9500gp Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 9500 Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet 9500 MFP hpijs"
+ Attribute "NickName" "" "HP Color LaserJet 9500 MFP hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LJ 9500 MFP hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet 9500 mfp;DES:hp color laserjet 9500 mfp;"
+ PCFileName "hp-color_laserjet_9500_mfp-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet 9500 Multifunction Printer)"
+ }
+ }
+} // end LJColor
+
+////////////// LJColor 300 dpi max. only
+{
+ Attribute "DefaultResolution" "" "300dpi"
+
+ // Custom page sizes from 1x4in to Ledger
+ HWMargins 18 14.4 18 14.4
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 11in 17in
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-Color_LaserJet_5 hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-Color_LaserJet_5" " -sDeviceManufac&&
+turer=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;hp color LaserJe&&
+t&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=150DraftColorCM&&
+YK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft.Gray" "Quality=150DraftGr&&
+ayscaleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=300ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal.Gray" "Quality=300Graysc&&
+aleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High" "Quality=300BestColorCMYK&&
+"
+ Attribute "FoomaticRIPOption" "InputSlot" "enum CmdLine C"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Default" ",PS:MediaPosition=7"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=PhotoTray" ",PS:MediaPosition=6"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Upper" ",PS:MediaPosition=1"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Lower" ",PS:MediaPosition=4"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=CDDVDTray" ",PS:MediaPosition=14"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Envelope" ",PS:MediaPosition=3"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=LargeCapacity" ",PS:MediaPosition=&&
+5"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Manual" ",PS:MediaPosition=2"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=MPTray" ",PS:MediaPosition=8"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A3" " -dDEVICEWIDTHPOINTS=842 -dDEV&&
+ICEHEIGHTPOINTS=1190"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B4JIS" " -dDEVICEWIDTHPOINTS=729 -d&&
+DEVICEHEIGHTPOINTS=1033"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD120" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Ledger" " -dDEVICEWIDTHPOINTS=792 -&&
+dDEVICEHEIGHTPOINTS=1224"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w774h1116" " -dDEVICEWIDTHPOINTS=77&&
+4 -dDEVICEHEIGHTPOINTS=1116"
+ Attribute "FoomaticRIPOption" "Duplex" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexNoTumble" " -dDuplex=true -dTum&&
+ble=false"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexTumble" " -dDuplex=true -dTumbl&&
+e=true"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=None" " -dDuplex=false"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=150BestColorCMYK" " -r150 -sIjsParam&&
+s=Quality:Quality=2,Quality:ColorMode=2,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=150ColorCMYK" " -r150 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=150DraftColorCMYK" " -r150 -sIjsPara&&
+ms=Quality:Quality=1,Quality:ColorMode=2,Quality:MediaType=0,Quality:P&&
+enSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=150DraftGrayscaleK" " -r150 -sIjs&&
+Params=Quality:Quality=1,Quality:ColorMode=0,Quality:MediaType=0,Quali&&
+ty:PenSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=150GrayscaleK" " -r150 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300BestColorCMYK" " -r300 -sIjsParam&&
+s=Quality:Quality=2,Quality:ColorMode=2,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYK" " -r300 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300GrayscaleK" " -r300 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ Choice "Draft.Gray/Draft Grayscale" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft.Gray"
+ *Choice "Normal/Normal" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "Normal.Gray/Normal Grayscale" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal.Gray"
+ Choice "High/High Quality" "%% FoomaticRIPOptionSetting: PrintoutMode=High"
+ Option "InputSlot/Media Source" PickOne AnySetup 100.0
+ *Choice "Default/Printer default" "%% FoomaticRIPOptionSetting: InputSlot=Default"
+ Choice "PhotoTray/Photo Tray" "%% FoomaticRIPOptionSetting: InputSlot=PhotoTray"
+ Choice "Upper/Upper Tray" "%% FoomaticRIPOptionSetting: InputSlot=Upper"
+ Choice "Lower/Lower Tray" "%% FoomaticRIPOptionSetting: InputSlot=Lower"
+ Choice "CDDVDTray/CD or DVD Tray" "%% FoomaticRIPOptionSetting: InputSlot=CDDVDTray"
+ Choice "Envelope/Envelope Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Envelope"
+ Choice "LargeCapacity/Large Capacity Tray" "%% FoomaticRIPOptionSetting: InputSlot=LargeCapacity"
+ Choice "Manual/Manual Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Manual"
+ Choice "MPTray/Multi Purpose Tray" "%% FoomaticRIPOptionSetting: InputSlot=MPTray"
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 120.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "%% FoomaticRIPOptionSetting: Duplex=DuplexNoTumble"
+ Choice "DuplexTumble/Short Edge (Flip)" "%% FoomaticRIPOptionSetting: Duplex=DuplexTumble"
+ *Choice "None/Off" "%% FoomaticRIPOptionSetting: Duplex=None"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "150BestColorCMYK/150 dpi, Best, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=150BestColorCMYK"
+ Choice "150ColorCMYK/150 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=150ColorCMYK"
+ Choice "150DraftColorCMYK/150 dpi, Draft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=150DraftColorCMYK"
+ Choice "150DraftGrayscaleK/150 dpi, Draft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=150DraftGrayscaleK"
+ Choice "150GrayscaleK/150 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=150GrayscaleK"
+ Choice "300BestColorCMYK/300 dpi, Best, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300BestColorCMYK"
+ Choice "300ColorCMYK/300 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYK"
+ Choice "300GrayscaleK/300 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300GrayscaleK"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo or 5x7 inch index card" 360.00 504.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "CDDVD120/CD or DVD 120 mm" 360.00 360.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=CDDVD120" "%% FoomaticRIPOptionSetting: PageSize=CDDVD120"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+ {
+ // Large format A3 paper support
+ CustomMedia "A3/A3" 842.00 1190.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=A3" "%% FoomaticRIPOptionSetting: PageSize=A3"
+ CustomMedia "B4JIS/B4 (JIS)" 729.00 1033.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=B4JIS" "%% FoomaticRIPOptionSetting: PageSize=B4JIS"
+ CustomMedia "Ledger/Ledger" 792.00 1224.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Ledger" "%% FoomaticRIPOptionSetting: PageSize=Ledger"
+ CustomMedia "w774h1116/8K" 774.00 1116.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=w774h1116" "%% FoomaticRIPOptionSetting: PageSize=w774h1116"
+ // <%LJColor:300dpiOnly:LargeFormatA3%>
+ {
+ ModelName "HP Color LaserJet 5 hpijs"
+ Attribute "NickName" "" "HP Color LaserJet 5 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Color LaserJet 5 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet 5;DES:hp color laserjet 5;"
+ PCFileName "hp-color_laserjet_5-hpijs.ppd"
+ Attribute "Product" "" "(HP Color LaserJet 5 Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet 5m hpijs"
+ Attribute "NickName" "" "HP Color LaserJet 5m hpijs pcl3, $Version"
+ Attribute "ShortNickName" "" "HP Color LaserJet 5m hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet 5m;DES:hp color laserjet 5m;"
+ PCFileName "hp-color_laserjet_5m-hpijs-pcl3.ppd"
+ Attribute "Product" "" "(HP Color LaserJet 5m Printer)"
+ }
+ {
+ ModelName "HP Deskjet 1200c hpijs"
+ Attribute "NickName" "" "HP Deskjet 1200c hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 1200c hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 1200c;DES:deskjet 1200c;"
+ PCFileName "hp-deskjet_1200c-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 1200c/ps Printer)"
+ }
+ {
+ ModelName "HP Deskjet 1600c hpijs"
+ Attribute "NickName" "" "HP Deskjet 1600c hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 1600c hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 1600c;DES:deskjet 1600c;"
+ PCFileName "hp-deskjet_1600c-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 1600c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 1600cn hpijs"
+ Attribute "NickName" "" "HP Deskjet 1600cn hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 1600cn hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 1600cn;DES:deskjet 1600cn;"
+ PCFileName "hp-deskjet_1600cn-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 1600cn Printer)"
+ }
+ {
+ ModelName "HP Deskjet 1600cm hpijs"
+ Attribute "NickName" "" "HP Deskjet 1600cm hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 1600cm hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 1600cm;DES:deskjet 1600cm;"
+ PCFileName "hp-deskjet_1600cm-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 1600cm Printer)"
+ }
+ }
+} // end LJColor 300 dpi max. only
+
+//////////////// LJFastRaster
+{
+ Attribute "DefaultResolution" "" "600dpi"
+
+ // Custom page sizes from 1x4in to Legal
+ HWMargins 18 14.4 18 14.4
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 8.5in 14in
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-LaserJet_1010 hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-LaserJet_1010" " -sDeviceManufactur&&
+er=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;hp LaserJet 1010&qu&&
+ot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=600DraftGraysca&&
+leK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=600GrayscaleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=drvfunctionality" ""
+ Attribute "FoomaticRIPOption" "InputSlot" "enum CmdLine C"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Default" ",PS:MediaPosition=7"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=PhotoTray" ",PS:MediaPosition=6"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Upper" ",PS:MediaPosition=1"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Lower" ",PS:MediaPosition=4"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=CDDVDTray" ",PS:MediaPosition=14"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Envelope" ",PS:MediaPosition=3"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=LargeCapacity" ",PS:MediaPosition=&&
+5"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Manual" ",PS:MediaPosition=2"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=MPTray" ",PS:MediaPosition=8"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD120" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ Attribute "FoomaticRIPOption" "Duplex" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexNoTumble" " -dDuplex=true -dTum&&
+ble=false"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexTumble" " -dDuplex=true -dTumbl&&
+e=true"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=None" " -dDuplex=false"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600DraftGrayscaleK" " -r600 -sIjsPar&&
+ams=Quality:Quality=1,Quality:ColorMode=0,Quality:MediaType=0,Quality:&&
+PenSet=0"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600GrayscaleK" " -r600 -sIjsParams=Q&&
+uality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:PenSe&&
+t=0"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft (Economy)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ *Choice "Normal/Normal" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "drvfunctionality/drvfunctionality" "%% FoomaticRIPOptionSetting: PrintoutMode=drvfunctionality"
+ Option "InputSlot/Media Source" PickOne AnySetup 100.0
+ *Choice "Default/Printer default" "%% FoomaticRIPOptionSetting: InputSlot=Default"
+ Choice "PhotoTray/Photo Tray" "%% FoomaticRIPOptionSetting: InputSlot=PhotoTray"
+ Choice "Upper/Upper Tray" "%% FoomaticRIPOptionSetting: InputSlot=Upper"
+ Choice "Lower/Lower Tray" "%% FoomaticRIPOptionSetting: InputSlot=Lower"
+ Choice "CDDVDTray/CD or DVD Tray" "%% FoomaticRIPOptionSetting: InputSlot=CDDVDTray"
+ Choice "Envelope/Envelope Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Envelope"
+ Choice "LargeCapacity/Large Capacity Tray" "%% FoomaticRIPOptionSetting: InputSlot=LargeCapacity"
+ Choice "Manual/Manual Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Manual"
+ Choice "MPTray/Multi Purpose Tray" "%% FoomaticRIPOptionSetting: InputSlot=MPTray"
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 120.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "%% FoomaticRIPOptionSetting: Duplex=DuplexNoTumble"
+ Choice "DuplexTumble/Short Edge (Flip)" "%% FoomaticRIPOptionSetting: Duplex=DuplexTumble"
+ *Choice "None/Off" "%% FoomaticRIPOptionSetting: Duplex=None"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "600DraftGrayscaleK/600 dpi, Draft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=600DraftGrayscaleK"
+ Choice "600GrayscaleK/600 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=600GrayscaleK"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo or 5x7 inch index card" 360.00 504.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "CDDVD120/CD or DVD 120 mm" 360.00 360.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=CDDVD120" "%% FoomaticRIPOptionSetting: PageSize=CDDVD120"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+ // <%LJFastRaster:Normal%>
+ {
+ ModelName "HP LaserJet 1010 hpijs"
+ Attribute "NickName" "" "HP LaserJet 1010 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 1010 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 1010;DES:hp laserjet 1010;"
+ PCFileName "hp-laserjet_1010-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet 1010 Printer)"
+ }
+ {
+ ModelName "HP LaserJet 1012 hpijs"
+ Attribute "NickName" "" "HP LaserJet 1012 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP LaserJet 1012 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 1012;DES:hp laserjet 1012;"
+ PCFileName "hp-laserjet_1012-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet 1012 Printer)"
+ }
+} // end LJFastRaster
+
+///////////////// LJJetReady
+{
+ Attribute "DefaultResolution" "" "600dpi"
+
+ // Custom page sizes from 1x4in to Legal
+ HWMargins 18 14.4 18 14.4
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 8.5in 14in
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-Color_LaserJet_3500 hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-Color_LaserJet_3500" " -sDeviceManu&&
+facturer=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;hp color Lase&&
+rJet 3500&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=600ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal.Gray" "Quality=600Graysc&&
+aleK"
+ Attribute "FoomaticRIPOption" "InputSlot" "enum CmdLine C"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Default" ",PS:MediaPosition=7"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=PhotoTray" ",PS:MediaPosition=6"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Upper" ",PS:MediaPosition=1"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Lower" ",PS:MediaPosition=4"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=CDDVDTray" ",PS:MediaPosition=14"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Envelope" ",PS:MediaPosition=3"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=LargeCapacity" ",PS:MediaPosition=&&
+5"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Manual" ",PS:MediaPosition=2"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=MPTray" ",PS:MediaPosition=8"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD120" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ Attribute "FoomaticRIPOption" "Duplex" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexNoTumble" " -dDuplex=true -dTum&&
+ble=false"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexTumble" " -dDuplex=true -dTumbl&&
+e=true"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=None" " -dDuplex=false"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMYK" " -r600 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600GrayscaleK" " -r600 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ *Choice "Normal/Normal" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "Normal.Gray/Normal Grayscale" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal.Gray"
+ Option "InputSlot/Media Source" PickOne AnySetup 100.0
+ *Choice "Default/Printer default" "%% FoomaticRIPOptionSetting: InputSlot=Default"
+ Choice "PhotoTray/Photo Tray" "%% FoomaticRIPOptionSetting: InputSlot=PhotoTray"
+ Choice "Upper/Upper Tray" "%% FoomaticRIPOptionSetting: InputSlot=Upper"
+ Choice "Lower/Lower Tray" "%% FoomaticRIPOptionSetting: InputSlot=Lower"
+ Choice "CDDVDTray/CD or DVD Tray" "%% FoomaticRIPOptionSetting: InputSlot=CDDVDTray"
+ Choice "Envelope/Envelope Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Envelope"
+ Choice "LargeCapacity/Large Capacity Tray" "%% FoomaticRIPOptionSetting: InputSlot=LargeCapacity"
+ Choice "Manual/Manual Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Manual"
+ Choice "MPTray/Multi Purpose Tray" "%% FoomaticRIPOptionSetting: InputSlot=MPTray"
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 120.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "%% FoomaticRIPOptionSetting: Duplex=DuplexNoTumble"
+ Choice "DuplexTumble/Short Edge (Flip)" "%% FoomaticRIPOptionSetting: Duplex=DuplexTumble"
+ *Choice "None/Off" "%% FoomaticRIPOptionSetting: Duplex=None"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "600ColorCMYK/600 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMYK"
+ Choice "600GrayscaleK/600 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=600GrayscaleK"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo or 5x7 inch index card" 360.00 504.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "CDDVD120/CD or DVD 120 mm" 360.00 360.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=CDDVD120" "%% FoomaticRIPOptionSetting: PageSize=CDDVD120"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+ // <%LJJetReady:Normal%>
+ {
+ ModelName "HP Color LaserJet 3500n hpijs"
+ Attribute "NickName" "" "HP Color LaserJet 3500n hpijs, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP Color LaserJet 3500n hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet 3500n;DES:hp color laserjet 3500n;"
+ PCFileName "hp-color_laserjet_3500n-hpijs.ppd"
+ Attribute "Product" "" "(HP Color LaserJet 3500n Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet 3500 hpijs"
+ Attribute "NickName" "" "HP Color LaserJet 3500 hpijs, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP Color LaserJet 3500 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet 3500;DES:hp color laserjet 3500;"
+ PCFileName "hp-color_laserjet_3500-hpijs.ppd"
+ Attribute "Product" "" "(HP Color LaserJet 3500 Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 3500dn Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 3500dtn Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet 3550 hpijs"
+ Attribute "NickName" "" "HP Color LaserJet 3550 hpijs, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP Color LaserJet 3550 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet 3550;DES:hp color laserjet 3550;"
+ PCFileName "hp-color_laserjet_3550-hpijs.ppd"
+ Attribute "Product" "" "(HP Color LaserJet 3550 Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet 3550n hpijs"
+ Attribute "NickName" "" "HP Color LaserJet 3550n hpijs, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP Color LaserJet 3550n hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet 3550n;DES:hp color laserjet 3550n;"
+ PCFileName "hp-color_laserjet_3550n-hpijs.ppd"
+ Attribute "Product" "" "(HP Color LaserJet 3550n Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet 3600 hpijs"
+ Attribute "NickName" "" "HP Color LaserJet 3600 hpijs, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP Color LaserJet 3600 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet 3600;DES:hp color laserjet 3600;"
+ PCFileName "hp-color_laserjet_3600-hpijs.ppd"
+ Attribute "Product" "" "(HP Color LaserJet 3600 Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 3600n Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 3600dn Printer)"
+ }
+} // end LJJetReady
+
+/////////////// DJ350
+{
+ Attribute "DefaultResolution" "" "300dpi"
+
+ // Custom page sizes from 1x4in to Legal
+ HWMargins 18 48.24 18 9
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 8.5in 14in
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-DeskJet_350C hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-DeskJet_350C" " -sDeviceManufacture&&
+r=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;DESKJET 350&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=300DraftColorCM&&
+Y"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft.Gray" "Quality=300DraftGr&&
+ayscaleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=300ColorCMY"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal.Gray" "Quality=300Graysc&&
+aleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High.Gray" "Quality=600x300Best&&
+GrayscaleK"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=PhotoTearOff" " -dDEVICEWIDTHPOINTS&&
+=288 -dDEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6TearOff" " -dDEVICEWIDTHPOINTS=29&&
+7 -dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD120" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMY" " -r300 -sIjsParams=Qua&&
+lity:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet=&&
+1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftColorCMY" " -r300 -sIjsParam&&
+s=Quality:Quality=1,Quality:ColorMode=2,Quality:MediaType=0,Quality:Pe&&
+nSet=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftGrayscaleK" " -r300 -sIjsPar&&
+ams=Quality:Quality=1,Quality:ColorMode=0,Quality:MediaType=0,Quality:&&
+PenSet=0"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300GrayscaleK" " -r300 -sIjsParams=Q&&
+uality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:PenSe&&
+t=0"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600x300BestGrayscaleK" " -r600x300 -&&
+sIjsParams=Quality:Quality=2,Quality:ColorMode=0,Quality:MediaType=0,Q&&
+uality:PenSet=0"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft (Color cartridge)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ Choice "Draft.Gray/Draft Grayscale (Black cartridge)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft.Gray"
+ *Choice "Normal/Normal (Color cartridge)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "Normal.Gray/Normal Grayscale (Black cartridge)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal.Gray"
+ Choice "High.Gray/High Quality Grayscale (Black cartridge)" "%% FoomaticRIPOptionSetting: PrintoutMode=High.Gray"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "300ColorCMY/300 dpi, Color, Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMY"
+ Choice "300DraftColorCMY/300 dpi, Draft, Color, Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftColorCMY"
+ Choice "300DraftGrayscaleK/300 dpi, Draft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftGrayscaleK"
+ Choice "300GrayscaleK/300 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300GrayscaleK"
+ Choice "600x300BestGrayscaleK/600x300 dpi, Best, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=600x300BestGrayscaleK"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 9.72 48.24 9.72 9.00 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo or 5x7 inch index card" 360.00 504.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "PhotoTearOff/Photo with tear-off tab" 288.00 432.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff" "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "A6TearOff/A6 with tear-off tab" 297.00 420.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A6TearOff" "%% FoomaticRIPOptionSetting: PageSize=A6TearOff"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "CDDVD120/CD or DVD 120 mm" 360.00 360.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD120" "%% FoomaticRIPOptionSetting: PageSize=CDDVD120"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+ // <%DJ350:Normal%>
+ {
+ ModelName "HP dj350 hpijs"
+ Attribute "NickName" "" "HP dj350 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP dj350 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:dj350;DES:dj350;"
+ PCFileName "hp-dj350-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 350c Printer)"
+ Attribute "Product" "" "(HP Deskjet 350cbi Printer)"
+ }
+ {
+ ModelName "HP Deskjet 400l hpijs"
+ Attribute "NickName" "" "HP Deskjet 400l hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 400l hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp deskjet 400l;DES:hp deskjet 400l;"
+ PCFileName "hp-deskjet_400l-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 400l Printer)"
+ }
+}
+
+//////////// DJ540 grayscale only
+{
+ Attribute "DefaultResolution" "" "300dpi"
+
+ // Custom page sizes from 1x4in to Legal
+ HWMargins 18 48.24 18 9
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 8.5in 14in
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-DeskJet_500 hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-DeskJet_500" " -sDeviceManufacturer&&
+=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;DESKJET 540&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=300DraftGraysca&&
+leK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=300GrayscaleK"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=PhotoTearOff" " -dDEVICEWIDTHPOINTS&&
+=288 -dDEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6TearOff" " -dDEVICEWIDTHPOINTS=29&&
+7 -dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD120" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftGrayscaleK" " -r300 -sIjsPar&&
+ams=Quality:Quality=1,Quality:ColorMode=0,Quality:MediaType=0,Quality:&&
+PenSet=0"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300GrayscaleK" " -r300 -sIjsParams=Q&&
+uality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:PenSe&&
+t=0"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ *Choice "Normal/Normal" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "300DraftGrayscaleK/300 dpi, Draft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftGrayscaleK"
+ Choice "300GrayscaleK/300 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300GrayscaleK"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 9.72 48.24 9.72 9.00 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo or 5x7 inch index card" 360.00 504.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "PhotoTearOff/Photo with tear-off tab" 288.00 432.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff" "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "A6TearOff/A6 with tear-off tab" 297.00 420.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A6TearOff" "%% FoomaticRIPOptionSetting: PageSize=A6TearOff"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "CDDVD120/CD or DVD 120 mm" 360.00 360.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD120" "%% FoomaticRIPOptionSetting: PageSize=CDDVD120"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+ // <%DJ540:GrayscaleOnly%>
+ {
+ ModelName "HP Officejet hpijs"
+ Attribute "NickName" "" "HP Officejet hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet;DES:officejet;"
+ PCFileName "hp-officejet-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet Lx hpijs"
+ Attribute "NickName" "" "HP Officejet Lx hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet Lx hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet lx;DES:officejet lx;"
+ PCFileName "hp-officejet_lx-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet Lx All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet Series 330 hpijs"
+ Attribute "NickName" "" "HP Officejet Series 330 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet Series 330 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet series 330;DES:officejet series 330;"
+ PCFileName "hp-officejet_series_330-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet 330 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet Series 350 hpijs"
+ Attribute "NickName" "" "HP Officejet Series 350 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet Series 350 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet series 350;DES:officejet series 350;"
+ PCFileName "hp-officejet_series_350-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet 350 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Deskjet 500 hpijs"
+ Attribute "NickName" "" "HP Deskjet 500 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 500 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 500;DES:deskjet 500;"
+ PCFileName "hp-deskjet_500-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 500 Printer)"
+ Attribute "Product" "" "(HP Deskjet 500j Printer)"
+ Attribute "Product" "" "(HP Deskjet 500q Printer)"
+ Attribute "Product" "" "(HP Deskjet 500k Printer)"
+ }
+ {
+ ModelName "HP Deskjet 505j hpijs"
+ Attribute "NickName" "" "HP Deskjet 505j hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 505j hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 505j;DES:deskjet 505j;"
+ PCFileName "hp-deskjet_505j-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 505j Printer)"
+ }
+ {
+ ModelName "HP Deskjet 510 hpijs"
+ Attribute "NickName" "" "HP Deskjet 510 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 510 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 510;DES:deskjet 510;"
+ PCFileName "hp-deskjet_510-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 510 Printer)"
+ }
+ {
+ ModelName "HP Deskjet 520 hpijs"
+ Attribute "NickName" "" "HP Deskjet 520 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 520 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 520;DES:deskjet 520;"
+ PCFileName "hp-deskjet_520-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 520 Printer)"
+ }
+} // end DJ540 grayscale only
+
+/////////////// DJ540
+{
+ Attribute "DefaultResolution" "" "300dpi"
+
+ // Custom page sizes from 1x4in to Legal
+ HWMargins 18 48.24 18 9
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 8.5in 14in
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-DeskJet_400 hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-DeskJet_400" " -sDeviceManufacturer&&
+=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;DESKJET 540&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=300DraftColorCM&&
+Y"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft.Gray" "Quality=300DraftGr&&
+ayscaleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=300ColorCMY"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal.Gray" "Quality=300Graysc&&
+aleK"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=PhotoTearOff" " -dDEVICEWIDTHPOINTS&&
+=288 -dDEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6TearOff" " -dDEVICEWIDTHPOINTS=29&&
+7 -dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD120" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMY" " -r300 -sIjsParams=Qua&&
+lity:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet=&&
+1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftColorCMY" " -r300 -sIjsParam&&
+s=Quality:Quality=1,Quality:ColorMode=2,Quality:MediaType=0,Quality:Pe&&
+nSet=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftGrayscaleK" " -r300 -sIjsPar&&
+ams=Quality:Quality=1,Quality:ColorMode=0,Quality:MediaType=0,Quality:&&
+PenSet=0"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300GrayscaleK" " -r300 -sIjsParams=Q&&
+uality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:PenSe&&
+t=0"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft (Color cartridge)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ Choice "Draft.Gray/Draft Grayscale (Black cartridge)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft.Gray"
+ *Choice "Normal/Normal (Color cartridge)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "Normal.Gray/Normal Grayscale (Black cartridge)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal.Gray"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "300ColorCMY/300 dpi, Color, Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMY"
+ Choice "300DraftColorCMY/300 dpi, Draft, Color, Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftColorCMY"
+ Choice "300DraftGrayscaleK/300 dpi, Draft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftGrayscaleK"
+ Choice "300GrayscaleK/300 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300GrayscaleK"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 9.72 48.24 9.72 9.00 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo or 5x7 inch index card" 360.00 504.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "PhotoTearOff/Photo with tear-off tab" 288.00 432.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff" "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "A6TearOff/A6 with tear-off tab" 297.00 420.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A6TearOff" "%% FoomaticRIPOptionSetting: PageSize=A6TearOff"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "CDDVD120/CD or DVD 120 mm" 360.00 360.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD120" "%% FoomaticRIPOptionSetting: PageSize=CDDVD120"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+ // <%DJ540:Normal%>
+ {
+ ModelName "HP Officejet Series 300 hpijs"
+ Attribute "NickName" "" "HP Officejet Series 300 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet Series 300 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet series 300;DES:officejet series 300;"
+ PCFileName "hp-officejet_series_300-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet 300 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet Series 310 hpijs"
+ Attribute "NickName" "" "HP Officejet Series 310 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet Series 310 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet series 310;DES:officejet series 310;"
+ PCFileName "hp-officejet_series_310-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet 310 All-in-one Series Printer)"
+ }
+ {
+ ModelName "HP Officejet Series 320 hpijs"
+ Attribute "NickName" "" "HP Officejet Series 320 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet Series 320 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet series 320;DES:officejet series 320;"
+ PCFileName "hp-officejet_series_320-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet 320 All-in-one Series Printer)"
+ }
+ {
+ ModelName "HP Deskjet 400 hpijs"
+ Attribute "NickName" "" "HP Deskjet 400 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 400 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp deskjet 400;DES:hp deskjet 400;"
+ PCFileName "hp-deskjet_400-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 400 Printer)"
+ Attribute "Product" "" "(HP Deskjet 400 Color Capable Printer)"
+ }
+ {
+ ModelName "HP Deskjet 500c hpijs"
+ Attribute "NickName" "" "HP Deskjet 500c hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 500c hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 500c;DES:deskjet 500c;"
+ PCFileName "hp-deskjet_500c-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 500c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 540 hpijs"
+ Attribute "NickName" "" "HP Deskjet 540 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 540 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 540;DES:deskjet 540;"
+ PCFileName "hp-deskjet_540-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 540 Printer)"
+ }
+ {
+ ModelName "HP Deskjet 550c hpijs"
+ Attribute "NickName" "" "HP Deskjet 550c hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 550c hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp deskjet 550c;DES:hp deskjet 550c;"
+ PCFileName "hp-deskjet_550c-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 550c Printer)"
+ }
+} // end DJ540
+
+/////////////// DJ630
+{
+ Attribute "DefaultResolution" "" "300dpi"
+
+ // Custom page sizes from 1x4in to Legal
+ HWMargins 18 48.24 18 9
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 8.5in 14in
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-DeskJet_630C hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-DeskJet_630C" " -sDeviceManufacture&&
+r=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;DESKJET 630&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=300DraftColorCM&&
+Y"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft.Gray" "Quality=300DraftGr&&
+ayscaleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=300ColorCMY"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal.Gray" "Quality=300Graysc&&
+aleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High.Gray" "Quality=600x300Best&&
+GrayscaleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Photo" "Quality=300PhotoCMYcmK"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=PhotoTearOff" " -dDEVICEWIDTHPOINTS&&
+=288 -dDEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6TearOff" " -dDEVICEWIDTHPOINTS=29&&
+7 -dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD120" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMY" " -r300 -sIjsParams=Qua&&
+lity:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet=&&
+1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYK" " -r300 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftColorCMY" " -r300 -sIjsParam&&
+s=Quality:Quality=1,Quality:ColorMode=2,Quality:MediaType=0,Quality:Pe&&
+nSet=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftColorCMYK" " -r300 -sIjsPara&&
+ms=Quality:Quality=1,Quality:ColorMode=2,Quality:MediaType=0,Quality:P&&
+enSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftGrayscaleK" " -r300 -sIjsPar&&
+ams=Quality:Quality=1,Quality:ColorMode=0,Quality:MediaType=0,Quality:&&
+PenSet=0"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300GrayscaleK" " -r300 -sIjsParams=Q&&
+uality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:PenSe&&
+t=0"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300PhotoCMYcmK" " -r300 -sIjsParams=&&
+Quality:Quality=2,Quality:ColorMode=2,Quality:MediaType=1,Quality:PenS&&
+et=4"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600x300BestGrayscaleK" " -r600x300 -&&
+sIjsParams=Quality:Quality=2,Quality:ColorMode=0,Quality:MediaType=0,Q&&
+uality:PenSet=0"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft (Color cartridge)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ Choice "Draft.Gray/Draft Grayscale (Black cartridge)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft.Gray"
+ *Choice "Normal/Normal (Color cartridge)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "Normal.Gray/Normal Grayscale (Black cartridge)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal.Gray"
+ Choice "High.Gray/High Quality Grayscale (Black cartridge)" "%% FoomaticRIPOptionSetting: PrintoutMode=High.Gray"
+ Choice "Photo/Photo (Photo + color cartridge, photo paper)" "%% FoomaticRIPOptionSetting: PrintoutMode=Photo"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "300ColorCMY/300 dpi, Color, Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMY"
+ Choice "300ColorCMYK/300 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYK"
+ Choice "300DraftColorCMY/300 dpi, Draft, Color, Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftColorCMY"
+ Choice "300DraftColorCMYK/300 dpi, Draft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftColorCMYK"
+ Choice "300DraftGrayscaleK/300 dpi, Draft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftGrayscaleK"
+ Choice "300GrayscaleK/300 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300GrayscaleK"
+ Choice "300PhotoCMYcmK/300 dpi, Photo, Photo + Color Cartr., Premium Paper" "%% FoomaticRIPOptionSetting: Quality=300PhotoCMYcmK"
+ Choice "600x300BestGrayscaleK/600x300 dpi, Best, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=600x300BestGrayscaleK"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 9.72 48.24 9.72 9.00 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo or 5x7 inch index card" 360.00 504.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "PhotoTearOff/Photo with tear-off tab" 288.00 432.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff" "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "A6TearOff/A6 with tear-off tab" 297.00 420.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A6TearOff" "%% FoomaticRIPOptionSetting: PageSize=A6TearOff"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "CDDVD120/CD or DVD 120 mm" 360.00 360.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD120" "%% FoomaticRIPOptionSetting: PageSize=CDDVD120"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+ // <%DJ630:Normal%>
+ {
+ ModelName "HP Deskjet 630c hpijs"
+ Attribute "NickName" "" "HP Deskjet 630c hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 630c hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 630c;DES:deskjet 630c;"
+ PCFileName "hp-deskjet_630c-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 630c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 632c hpijs"
+ Attribute "NickName" "" "HP Deskjet 632c hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 632c hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 632c;DES:deskjet 632c;"
+ PCFileName "hp-deskjet_632c-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 632c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 656c hpijs"
+ Attribute "NickName" "" "HP Deskjet 656c hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 656c hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 656c;DES:deskjet 656c;"
+ PCFileName "hp-deskjet_656c-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 656c Printer)"
+ Attribute "Product" "" "(HP Deskjet 656cvr Printer)"
+ }
+} // end DJ630
+
+/////////////// DJ600 and DJ6xx
+{
+ Attribute "DefaultResolution" "" "300dpi"
+
+ // Custom page sizes from 1x4in to Legal
+ HWMargins 18 48.24 18 9
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 8.5in 14in
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-DeskJet_660C hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=300DraftColorCM&&
+YK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft.Gray" "Quality=300DraftGr&&
+ayscaleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=300ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal.Gray" "Quality=300Graysc&&
+aleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High.Gray" "Quality=600x300Best&&
+GrayscaleK"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=PhotoTearOff" " -dDEVICEWIDTHPOINTS&&
+=288 -dDEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6TearOff" " -dDEVICEWIDTHPOINTS=29&&
+7 -dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD120" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYK" " -r300 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftColorCMYK" " -r300 -sIjsPara&&
+ms=Quality:Quality=1,Quality:ColorMode=2,Quality:MediaType=0,Quality:P&&
+enSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftGrayscaleK" " -r300 -sIjs&&
+Params=Quality:Quality=1,Quality:ColorMode=0,Quality:MediaType=0,Quali&&
+ty:PenSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300GrayscaleK" " -r300 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600x300BestGrayscaleK" " -r600x30&&
+0 -sIjsParams=Quality:Quality=2,Quality:ColorMode=0,Quality:MediaType=&&
+0,Quality:PenSet=2"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ Choice "Draft.Gray/Draft Grayscale" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft.Gray"
+ *Choice "Normal/Normal" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "Normal.Gray/Normal Grayscale" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal.Gray"
+ Choice "High.Gray/High Quality Grayscale" "%% FoomaticRIPOptionSetting: PrintoutMode=High.Gray"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "300ColorCMYK/300 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYK"
+ Choice "300DraftColorCMYK/300 dpi, Draft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftColorCMYK"
+ Choice "300DraftGrayscaleK/300 dpi, Draft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftGrayscaleK"
+ Choice "300GrayscaleK/300 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300GrayscaleK"
+ Choice "600x300BestGrayscaleK/600x300 dpi, Best, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=600x300BestGrayscaleK"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 9.72 48.24 9.72 9.00 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo or 5x7 inch index card" 360.00 504.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "PhotoTearOff/Photo with tear-off tab" 288.00 432.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff" "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "A6TearOff/A6 with tear-off tab" 297.00 420.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A6TearOff" "%% FoomaticRIPOptionSetting: PageSize=A6TearOff"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "CDDVD120/CD or DVD 120 mm" 360.00 360.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD120" "%% FoomaticRIPOptionSetting: PageSize=CDDVD120"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+ {
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-DeskJet_600" " -sDeviceManufacturer&&
+=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;DESKJET 600&quot;"
+ // <%DJ600:Normal%>
+ {
+ ModelName "HP Deskjet 600 hpijs"
+ Attribute "NickName" "" "HP Deskjet 600 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 600 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 600;DES:deskjet 600;"
+ PCFileName "hp-deskjet_600-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 600c Printer)"
+ Attribute "Product" "" "(HP Deskjet 600 Printer)"
+ Attribute "Product" "" "(HP Deskjet 600k Printer)"
+ }
+ }
+ {
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-DeskJet_660C" " -sDeviceManufacture&&
+r=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;DESKJET 660&quot;"
+ // <%DJ6xx:Normal%>
+ {
+ ModelName "HP Printer Scanner Copier 300 hpijs"
+ Attribute "NickName" "" "HP Printer Scanner Copier 300 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP PSC 300 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:printer scanner copier 300;DES:printer scanner copier 300;"
+ PCFileName "hp-printer_scanner_copier_300-hpijs.ppd"
+ Attribute "Product" "" "(HP Printer Scanner Copier 300)"
+ }
+ {
+ ModelName "HP Officejet Series 520 hpijs"
+ Attribute "NickName" "" "HP Officejet Series 520 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet Series 520 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet series 520;DES:officejet series 520;"
+ PCFileName "hp-officejet_series_520-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet 520 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet Series 570 hpijs"
+ Attribute "NickName" "" "HP Officejet Series 570 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet Series 570 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet series 570;DES:officejet series 570;"
+ PCFileName "hp-officejet_series_570-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet 570 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet Series 580 hpijs"
+ Attribute "NickName" "" "HP Officejet Series 580 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet Series 580 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet series 580;DES:officejet series 580;"
+ PCFileName "hp-officejet_series_580-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet 580 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet Series 590 hpijs"
+ Attribute "NickName" "" "HP Officejet Series 590 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet Series 590 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet series 590;DES:officejet series 590;"
+ PCFileName "hp-officejet_series_590-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet 590 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet Series 600 hpijs"
+ Attribute "NickName" "" "HP Officejet Series 600 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet Series 600 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet series 600;DES:officejet series 600;"
+ PCFileName "hp-officejet_series_600-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet 600 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet Series 610 hpijs"
+ Attribute "NickName" "" "HP Officejet Series 610 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet Series 610 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet series 610;DES:officejet series 610;"
+ PCFileName "hp-officejet_series_610-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet 610 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet Series 630 hpijs"
+ Attribute "NickName" "" "HP Officejet Series 630 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet Series 630 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet series 630;DES:officejet series 630;"
+ PCFileName "hp-officejet_series_630-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet 630 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet 635 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Deskjet 660 hpijs"
+ Attribute "NickName" "" "HP Deskjet 660 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 660 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 660;DES:deskjet 660;"
+ PCFileName "hp-deskjet_660-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 660k Printer)"
+ Attribute "Product" "" "(HP Deskjet 660c Printer)"
+ Attribute "Product" "" "(HP Deskjet 660cse Printer)"
+ }
+ {
+ ModelName "HP Deskjet 670 hpijs"
+ Attribute "NickName" "" "HP Deskjet 670 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 670 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 670;DES:deskjet 670;"
+ PCFileName "hp-deskjet_670-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 670k Printer)"
+ Attribute "Product" "" "(HP Deskjet 670c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 670tv hpijs"
+ Attribute "NickName" "" "HP Deskjet 670tv hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 670tv hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 670tv;DES:deskjet 670tv;"
+ PCFileName "hp-deskjet_670tv-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 670tv Printer)"
+ }
+ {
+ ModelName "HP Deskjet 670c hpijs"
+ Attribute "NickName" "" "HP Deskjet 670c hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 670c hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 670c;DES:deskjet 670c;"
+ PCFileName "hp-deskjet_670c-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 670c)"
+ }
+ {
+ ModelName "HP Deskjet 672c hpijs"
+ Attribute "NickName" "" "HP Deskjet 672c hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 672c hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 672c;DES:deskjet 672c;"
+ PCFileName "hp-deskjet_672c-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 672c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 680 hpijs"
+ Attribute "NickName" "" "HP Deskjet 680 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 680 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 680;DES:deskjet 680;"
+ PCFileName "hp-deskjet_680-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 680c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 682 hpijs"
+ Attribute "NickName" "" "HP Deskjet 682 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 682 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 682;DES:deskjet 682;"
+ PCFileName "hp-deskjet_682-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 682c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 1100 hpijs"
+ Attribute "NickName" "" "HP Deskjet 1100 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 1100 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 1100;DES:deskjet 1100;"
+ PCFileName "hp-deskjet_1100-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 1100c Printer)"
+ }
+ }
+} // end DJ600 and DJ6xx
+
+///////////// DJ6xxPhoto
+{
+ Attribute "DefaultResolution" "" "300dpi"
+
+ // Custom page sizes from 1x4in to Legal
+ HWMargins 18 48.24 18 9
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 8.5in 14in
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-DeskJet_610C hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-DeskJet_610C" " -sDeviceManufacture&&
+r=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;DESKJET 610&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=300DraftColorCM&&
+YK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft.Gray" "Quality=300DraftGr&&
+ayscaleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=300ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal.Gray" "Quality=300Graysc&&
+aleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High.Gray" "Quality=600x300Best&&
+GrayscaleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Photo" "Quality=300PhotoCMYcmK"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=PhotoTearOff" " -dDEVICEWIDTHPOINTS&&
+=288 -dDEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6TearOff" " -dDEVICEWIDTHPOINTS=29&&
+7 -dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD120" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYK" " -r300 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftColorCMYK" " -r300 -sIjsPara&&
+ms=Quality:Quality=1,Quality:ColorMode=2,Quality:MediaType=0,Quality:P&&
+enSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftGrayscaleK" " -r300 -sIjs&&
+Params=Quality:Quality=1,Quality:ColorMode=0,Quality:MediaType=0,Quali&&
+ty:PenSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300GrayscaleK" " -r300 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300PhotoCMYcmK" " -r300 -sIjsParams=&&
+Quality:Quality=2,Quality:ColorMode=2,Quality:MediaType=1,Quality:PenS&&
+et=4"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600x300BestGrayscaleK" " -r600x30&&
+0 -sIjsParams=Quality:Quality=2,Quality:ColorMode=0,Quality:MediaType=&&
+0,Quality:PenSet=2"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ Choice "Draft.Gray/Draft Grayscale" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft.Gray"
+ *Choice "Normal/Normal" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "Normal.Gray/Normal Grayscale" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal.Gray"
+ Choice "High.Gray/High Quality Grayscale" "%% FoomaticRIPOptionSetting: PrintoutMode=High.Gray"
+ Choice "Photo/Photo (Photo + color cartridge, photo paper)" "%% FoomaticRIPOptionSetting: PrintoutMode=Photo"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "300ColorCMYK/300 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYK"
+ Choice "300DraftColorCMYK/300 dpi, Draft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftColorCMYK"
+ Choice "300DraftGrayscaleK/300 dpi, Draft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftGrayscaleK"
+ Choice "300GrayscaleK/300 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300GrayscaleK"
+ Choice "300PhotoCMYcmK/300 dpi, Photo, Photo + Color Cartr., Premium Paper" "%% FoomaticRIPOptionSetting: Quality=300PhotoCMYcmK"
+ Choice "600x300BestGrayscaleK/600x300 dpi, Best, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=600x300BestGrayscaleK"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 9.72 48.24 9.72 9.00 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo or 5x7 inch index card" 360.00 504.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "PhotoTearOff/Photo with tear-off tab" 288.00 432.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff" "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "A6TearOff/A6 with tear-off tab" 297.00 420.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A6TearOff" "%% FoomaticRIPOptionSetting: PageSize=A6TearOff"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "CDDVD120/CD or DVD 120 mm" 360.00 360.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD120" "%% FoomaticRIPOptionSetting: PageSize=CDDVD120"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+ // <%DJ6xxPhoto:Normal%>
+ {
+ ModelName "HP Deskjet 610c hpijs"
+ Attribute "NickName" "" "HP Deskjet 610c hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 610c hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 610c;DES:deskjet 610c;"
+ PCFileName "hp-deskjet_610c-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 610c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 610cl hpijs"
+ Attribute "NickName" "" "HP Deskjet 610cl hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 610cl hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 610cl;DES:deskjet 610cl;"
+ PCFileName "hp-deskjet_610cl-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 610cl Printer)"
+ }
+ {
+ ModelName "HP Deskjet 612c hpijs"
+ Attribute "NickName" "" "HP Deskjet 612c hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 612c hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 612c;DES:deskjet 612c;"
+ PCFileName "hp-deskjet_612c-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 612c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 640c hpijs"
+ Attribute "NickName" "" "HP Deskjet 640c hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 640c hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 640c;DES:deskjet 640c;"
+ PCFileName "hp-deskjet_640c-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 640c Lite Printer)"
+ Attribute "Product" "" "(HP Deskjet 640c Printer)"
+ Attribute "Product" "" "(HP Deskjet 640u Printer)"
+ Attribute "Product" "" "(HP Deskjet 640c Pavilion Turbo Printer)"
+ Attribute "Product" "" "(HP Deskjet 642c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 648c hpijs"
+ Attribute "NickName" "" "HP Deskjet 648c hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 648c hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 648c;DES:deskjet 648c;"
+ PCFileName "hp-deskjet_648c-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 648c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 690c hpijs"
+ Attribute "NickName" "" "HP Deskjet 690c hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 690c hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 690c;DES:deskjet 690c;"
+ PCFileName "hp-deskjet_690c-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 690c Plus Printer)"
+ Attribute "Product" "" "(HP Deskjet 690c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 690 hpijs"
+ Attribute "NickName" "" "HP Deskjet 690 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 690 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 690;DES:deskjet 690;"
+ PCFileName "hp-deskjet_690-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 690c Printer)"
+ Attribute "Product" "" "(HP Deskjet 690c Plus Printer)"
+ }
+ {
+ ModelName "HP Deskjet 692 hpijs"
+ Attribute "NickName" "" "HP Deskjet 692 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 692 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 692;DES:deskjet 692;"
+ PCFileName "hp-deskjet_692-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 692k Printer)"
+ Attribute "Product" "" "(HP Deskjet 692c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 693 hpijs"
+ Attribute "NickName" "" "HP Deskjet 693 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 693 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 693;DES:deskjet 693;"
+ PCFileName "hp-deskjet_693-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 693c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 694 hpijs"
+ Attribute "NickName" "" "HP Deskjet 694 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 694 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 694;DES:deskjet 694;"
+ PCFileName "hp-deskjet_694-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 694c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 695 hpijs"
+ Attribute "NickName" "" "HP Deskjet 695 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 695 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 695;DES:deskjet 695;"
+ PCFileName "hp-deskjet_695-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 695cci Printer)"
+ Attribute "Product" "" "(HP Deskjet 695c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 697 hpijs"
+ Attribute "NickName" "" "HP Deskjet 697 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 697 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 697;DES:deskjet 697;"
+ PCFileName "hp-deskjet_697-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 697c Printer)"
+ }
+ {
+ ModelName "HP Officejet Series 700 hpijs"
+ Attribute "NickName" "" "HP Officejet Series 700 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet Series 700 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet series 700;DES:officejet series 700;"
+ PCFileName "hp-officejet_series_700-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet 700 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet Series 710 hpijs"
+ Attribute "NickName" "" "HP Officejet Series 710 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet Series 710 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet series 710;DES:officejet series 710;"
+ PCFileName "hp-officejet_series_710-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet 710 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet Series 720 hpijs"
+ Attribute "NickName" "" "HP Officejet Series 720 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet Series 720 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet series 720;DES:officejet series 720;"
+ PCFileName "hp-officejet_series_720-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet 720 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet Series 725 hpijs"
+ Attribute "NickName" "" "HP Officejet Series 725 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet Series 725 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet series 725;DES:officejet series 725;"
+ PCFileName "hp-officejet_series_725-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet 725 All-in-one Printer)"
+ }
+} // end DJ6xxPhoto
+
+///////////////// DJ8xx
+{
+ Attribute "DefaultResolution" "" "600dpi"
+
+ // Custom page sizes from 1x4in to Legal
+ HWMargins 18 36 18 9
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 8.5in 14in
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-DeskJet_810C hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-DeskJet_810C" " -sDeviceManufacture&&
+r=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;DESKJET 810&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=300DraftColorK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft.Gray" "Quality=300DraftGr&&
+ayscaleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=300ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal.Gray" "Quality=300Graysc&&
+aleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High.Gray" "Quality=600Grayscal&&
+eK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Photo" "Quality=600PhotoCMYK"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=PhotoTearOff" " -dDEVICEWIDTHPOINTS&&
+=288 -dDEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6TearOff" " -dDEVICEWIDTHPOINTS=29&&
+7 -dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD120" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYK" " -r300 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftColorCMYK" " -r300 -sIjsPara&&
+ms=Quality:Quality=1,Quality:ColorMode=2,Quality:MediaType=0,Quality:P&&
+enSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftGrayscaleK" " -r300 -sIjs&&
+Params=Quality:Quality=1,Quality:ColorMode=0,Quality:MediaType=0,Quali&&
+ty:PenSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300GrayscaleK" " -r300 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300PhotoCMYK" " -r300 -sIjsParams=Qu&&
+ality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600GrayscaleK" " -r600 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600PhotoCMYK" " -r600 -sIjsParams=Qu&&
+ality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenSet&&
+=2"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ Choice "Draft.Gray/Draft Grayscale" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft.Gray"
+ *Choice "Normal/Normal" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "Normal.Gray/Normal Grayscale" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal.Gray"
+ Choice "High.Gray/High Quality Grayscale" "%% FoomaticRIPOptionSetting: PrintoutMode=High.Gray"
+ Choice "Photo/Photo (on photo paper)" "%% FoomaticRIPOptionSetting: PrintoutMode=Photo"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "300ColorCMYK/300 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYK"
+ Choice "300DraftColorCMYK/300 dpi, Draft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftColorCMYK"
+ Choice "300DraftGrayscaleK/300 dpi, Draft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftGrayscaleK"
+ Choice "300GrayscaleK/300 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300GrayscaleK"
+ Choice "300PhotoCMYK/300 dpi, Photo, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=300PhotoCMYK"
+ Choice "600GrayscaleK/600 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=600GrayscaleK"
+ Choice "600PhotoCMYK/600 dpi, Photo, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=600PhotoCMYK"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 9.72 36.00 9.72 9.00 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo or 5x7 inch index card" 360.00 504.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "PhotoTearOff/Photo with tear-off tab" 288.00 432.00 9.00 9.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff" "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "A6TearOff/A6 with tear-off tab" 297.00 420.00 9.00 0.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A6TearOff" "%% FoomaticRIPOptionSetting: PageSize=A6TearOff"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "CDDVD120/CD or DVD 120 mm" 360.00 360.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD120" "%% FoomaticRIPOptionSetting: PageSize=CDDVD120"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+ // <%DJ8xx:Normal%>
+ {
+ ModelName "HP Officejet T Series hpijs"
+ Attribute "NickName" "" "HP Officejet T Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet T Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet t series;DES:officejet t series;"
+ PCFileName "hp-officejet_t_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet t45 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet t45xi All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet t65 All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet t65xi All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet r40 hpijs"
+ Attribute "NickName" "" "HP Officejet r40 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet r40 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet r40;DES:officejet r40;"
+ PCFileName "hp-officejet_r40-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet r40 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet r40xi hpijs"
+ Attribute "NickName" "" "HP Officejet r40xi hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet r40xi hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet r40xi;DES:officejet r40xi;"
+ PCFileName "hp-officejet_r40xi-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet r40xi All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet r45 hpijs"
+ Attribute "NickName" "" "HP Officejet r45 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet r45 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet r45;DES:officejet r45;"
+ PCFileName "hp-officejet_r45-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet r45 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet r60 hpijs"
+ Attribute "NickName" "" "HP Officejet r60 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet r60 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet r60;DES:officejet r60;"
+ PCFileName "hp-officejet_r60-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet r60 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet r65 hpijs"
+ Attribute "NickName" "" "HP Officejet r65 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet r65 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet r65;DES:officejet r65;"
+ PCFileName "hp-officejet_r65-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet r65 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet r80xi hpijs"
+ Attribute "NickName" "" "HP Officejet r80xi hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet r80xi hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet r80xi;DES:officejet r80xi;"
+ PCFileName "hp-officejet_r80xi-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet r80xi All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet r80 hpijs"
+ Attribute "NickName" "" "HP Officejet r80 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet r80 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet r80;DES:officejet r80;"
+ PCFileName "hp-officejet_r80-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet r80 All-in-one Printer)"
+ }
+ {
+ ModelName "HP PSC 500 hpijs"
+ Attribute "NickName" "" "HP PSC 500 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP PSC 500 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:psc 500;DES:psc 500;"
+ PCFileName "hp-psc_500-hpijs.ppd"
+ Attribute "Product" "" "(HP PSC 500 All-in-one Printer)"
+ Attribute "Product" "" "(HP PSC 500xi All-in-one Printer)"
+ }
+ {
+ ModelName "HP Deskjet 810c hpijs"
+ Attribute "NickName" "" "HP Deskjet 810c hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 810c hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 810c;DES:deskjet 810c;"
+ PCFileName "hp-deskjet_810c-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 810c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 812c hpijs"
+ Attribute "NickName" "" "HP Deskjet 812c hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 812c hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 812c;DES:deskjet 812c;"
+ PCFileName "hp-deskjet_812c-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 812c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 815c hpijs"
+ Attribute "NickName" "" "HP Deskjet 815c hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 815c hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 815c;DES:deskjet 815c;"
+ PCFileName "hp-deskjet_815c-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 815c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 816c hpijs"
+ Attribute "NickName" "" "HP Deskjet 816c hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 816c hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 816c;DES:deskjet 816c;"
+ PCFileName "hp-deskjet_816c-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 816 Printer)"
+ }
+ {
+ ModelName "HP Deskjet 830c hpijs"
+ Attribute "NickName" "" "HP Deskjet 830c hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 830c hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 830c;DES:deskjet 830c;"
+ PCFileName "hp-deskjet_830c-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 830c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 832c hpijs"
+ Attribute "NickName" "" "HP Deskjet 832c hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 832c hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 832c;DES:deskjet 832c;"
+ PCFileName "hp-deskjet_832c-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 832c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 840c hpijs"
+ Attribute "NickName" "" "HP Deskjet 840c hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 840c hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 840c;DES:deskjet 840c;"
+ PCFileName "hp-deskjet_840c-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 840c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 841c hpijs"
+ Attribute "NickName" "" "HP Deskjet 841c hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 841c hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 841c;DES:deskjet 841c;"
+ PCFileName "hp-deskjet_841c-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 841c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 842c hpijs"
+ Attribute "NickName" "" "HP Deskjet 842c hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 842c hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 842c;DES:deskjet 842c;"
+ PCFileName "hp-deskjet_842c-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 842c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 843c hpijs"
+ Attribute "NickName" "" "HP Deskjet 843c hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 843c hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 843c;DES:deskjet 843c;"
+ PCFileName "hp-deskjet_843c-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 843c Printer)"
+ Attribute "Product" "" "(HP Deskjet 843cxe Printer)"
+ }
+ {
+ ModelName "HP Deskjet 880c hpijs"
+ Attribute "NickName" "" "HP Deskjet 880c hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 880c hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 880c;DES:deskjet 880c;"
+ PCFileName "hp-deskjet_880c-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 880c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 882c hpijs"
+ Attribute "NickName" "" "HP Deskjet 882c hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 882c hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 882c;DES:deskjet 882c;"
+ PCFileName "hp-deskjet_882c-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 882c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 895c hpijs"
+ Attribute "NickName" "" "HP Deskjet 895c hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 895c hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 895c;DES:deskjet 895c;"
+ PCFileName "hp-deskjet_895c-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 895cse Printer)"
+ Attribute "Product" "" "(HP Deskjet 895c Printer)"
+ Attribute "Product" "" "(HP Deskjet 895cxi Printer)"
+ }
+} // end DJ8xx
+
+////////////// DJ8x5
+{
+ Attribute "DefaultResolution" "" "600dpi"
+
+ // Custom page sizes from 1x4in to Legal
+ HWMargins 18 36 18 9
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 8.5in 14in
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-DeskJet_825C hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-DeskJet_825C" " -sDeviceManufacture&&
+r=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;DESKJET 825&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=300DraftColorCM&&
+Y"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft.Gray" "Quality=300DraftGr&&
+ayscaleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=300ColorCMY"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal.Gray" "Quality=300Graysc&&
+aleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High.Gray" "Quality=600Grayscal&&
+eK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Photo" "Quality=600PhotoCMY"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=PhotoTearOff" " -dDEVICEWIDTHPOINTS&&
+=288 -dDEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6TearOff" " -dDEVICEWIDTHPOINTS=29&&
+7 -dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD120" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMY" " -r300 -sIjsParams=Qua&&
+lity:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet=&&
+1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYK" " -r300 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftColorCMY" " -r300 -sIjsParam&&
+s=Quality:Quality=1,Quality:ColorMode=2,Quality:MediaType=0,Quality:Pe&&
+nSet=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftColorCMYK" " -r300 -sIjsPara&&
+ms=Quality:Quality=1,Quality:ColorMode=2,Quality:MediaType=0,Quality:P&&
+enSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftGrayscaleK" " -r300 -sIjsPar&&
+ams=Quality:Quality=1,Quality:ColorMode=0,Quality:MediaType=0,Quality:&&
+PenSet=0"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300GrayscaleK" " -r300 -sIjsParams=Q&&
+uality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:PenSe&&
+t=0"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300PhotoCMY" " -r300 -sIjsParams=Qua&&
+lity:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenSet=&&
+1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300PhotoCMYK" " -r300 -sIjsParams=Qu&&
+ality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600GrayscaleK" " -r600 -sIjsParams=Q&&
+uality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:PenSe&&
+t=0"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600PhotoCMY" " -r600 -sIjsParams=Qua&&
+lity:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenSet=&&
+1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600PhotoCMYK" " -r600 -sIjsParams=Qu&&
+ality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenSet&&
+=2"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft (Color cartridge)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ Choice "Draft.Gray/Draft Grayscale (Black cartridge)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft.Gray"
+ *Choice "Normal/Normal (Color cartridge)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "Normal.Gray/Normal Grayscale (Black cartridge)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal.Gray"
+ Choice "High.Gray/High Quality Grayscale (Black cartridge)" "%% FoomaticRIPOptionSetting: PrintoutMode=High.Gray"
+ Choice "Photo/Photo (Color cartridge, on photo paper)" "%% FoomaticRIPOptionSetting: PrintoutMode=Photo"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "300ColorCMY/300 dpi, Color, Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMY"
+ Choice "300ColorCMYK/300 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYK"
+ Choice "300DraftColorCMY/300 dpi, Draft, Color, Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftColorCMY"
+ Choice "300DraftColorCMYK/300 dpi, Draft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftColorCMYK"
+ Choice "300DraftGrayscaleK/300 dpi, Draft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftGrayscaleK"
+ Choice "300GrayscaleK/300 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300GrayscaleK"
+ Choice "300PhotoCMY/300 dpi, Photo, Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=300PhotoCMY"
+ Choice "300PhotoCMYK/300 dpi, Photo, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=300PhotoCMYK"
+ Choice "600GrayscaleK/600 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=600GrayscaleK"
+ Choice "600PhotoCMY/600 dpi, Photo, Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=600PhotoCMY"
+ Choice "600PhotoCMYK/600 dpi, Photo, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=600PhotoCMYK"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 9.72 36.00 9.72 9.00 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo or 5x7 inch index card" 360.00 504.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "PhotoTearOff/Photo with tear-off tab" 288.00 432.00 9.00 9.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff" "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "A6TearOff/A6 with tear-off tab" 297.00 420.00 9.00 0.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A6TearOff" "%% FoomaticRIPOptionSetting: PageSize=A6TearOff"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "CDDVD120/CD or DVD 120 mm" 360.00 360.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD120" "%% FoomaticRIPOptionSetting: PageSize=CDDVD120"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+ // <%DJ8x5:Normal%>
+ {
+ ModelName "HP Deskjet 825c hpijs"
+ Attribute "NickName" "" "HP Deskjet 825c hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 825c hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 825c;DES:deskjet 825c;"
+ PCFileName "hp-deskjet_825c-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 825cvr Printer)"
+ Attribute "Product" "" "(HP Deskjet 825c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 845c hpijs"
+ Attribute "NickName" "" "HP Deskjet 845c hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 845c hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 845c;DES:deskjet 845c;"
+ PCFileName "hp-deskjet_845c-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 845c Printer)"
+ Attribute "Product" "" "(HP Deskjet 845cvr Printer)"
+ }
+} // end DJ8x5
+
+///////////////////// DJ850 and DJ890
+{
+ Attribute "DefaultResolution" "" "600dpi"
+
+ // Custom page sizes from 1x4in to Legal
+ HWMargins 18 36 18 9
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 8.5in 14in
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-DeskJet_850C hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-DeskJet_850C" " -sDeviceManufacture&&
+r=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;DESKJET 850&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=300DraftColorCM&&
+YK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft.Gray" "Quality=300DraftGr&&
+ayscaleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=300ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal.Gray" "Quality=300Graysc&&
+aleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High.Gray" "Quality=600Grayscal&&
+eK"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=PhotoTearOff" " -dDEVICEWIDTHPOINTS&&
+=288 -dDEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6TearOff" " -dDEVICEWIDTHPOINTS=29&&
+7 -dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD120" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYK" " -r300 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftColorCMYK" " -r300 -sIjsPara&&
+ms=Quality:Quality=1,Quality:ColorMode=2,Quality:MediaType=0,Quality:P&&
+enSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftGrayscaleK" " -r300 -sIjs&&
+Params=Quality:Quality=1,Quality:ColorMode=0,Quality:MediaType=0,Quali&&
+ty:PenSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300GrayscaleK" " -r300 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600GrayscaleK" " -r600 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ Choice "Draft.Gray/Draft Grayscale" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft.Gray"
+ *Choice "Normal/Normal" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "Normal.Gray/Normal Grayscale" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal.Gray"
+ Choice "High.Gray/High Quality Grayscale" "%% FoomaticRIPOptionSetting: PrintoutMode=High.Gray"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "300ColorCMYK/300 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYK"
+ Choice "300DraftColorCMYK/300 dpi, Draft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftColorCMYK"
+ Choice "300DraftGrayscaleK/300 dpi, Draft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftGrayscaleK"
+ Choice "300GrayscaleK/300 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300GrayscaleK"
+ Choice "600GrayscaleK/600 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=600GrayscaleK"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 9.72 36.00 9.72 9.00 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo or 5x7 inch index card" 360.00 504.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "PhotoTearOff/Photo with tear-off tab" 288.00 432.00 9.00 9.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff" "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "A6TearOff/A6 with tear-off tab" 297.00 420.00 9.00 0.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A6TearOff" "%% FoomaticRIPOptionSetting: PageSize=A6TearOff"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "CDDVD120/CD or DVD 120 mm" 360.00 360.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD120" "%% FoomaticRIPOptionSetting: PageSize=CDDVD120"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+ {
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-DeskJet_850C" " -sDeviceManufacture&&
+r=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;DESKJET 850&quot;"
+ // <%DJ850:Normal%>
+ {
+ ModelName "HP Deskjet 850c hpijs"
+ Attribute "NickName" "" "HP Deskjet 850c hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 850c hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 850c;DES:deskjet 850c;"
+ PCFileName "hp-deskjet_850c-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 850k Printer)"
+ Attribute "Product" "" "(HP Deskjet 850c Printer)"
+ }
+ {
+ ModelName "HP Deskjet 855c hpijs"
+ Attribute "NickName" "" "HP Deskjet 855c hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 855c hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 855c;DES:deskjet 855c;"
+ PCFileName "hp-deskjet_855c-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 855cxi Printer)"
+ Attribute "Product" "" "(HP Deskjet 855c Printer)"
+ Attribute "Product" "" "(HP Deskjet 855cse Printer)"
+ }
+ {
+ ModelName "HP Deskjet 870c hpijs"
+ Attribute "NickName" "" "HP Deskjet 870c hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 870c hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 870c;DES:deskjet 870c;"
+ PCFileName "hp-deskjet_870c-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 870k Printer)"
+ Attribute "Product" "" "(HP Deskjet 870c Printer)"
+ Attribute "Product" "" "(HP Deskjet 870cse Printer)"
+ Attribute "Product" "" "(HP Deskjet 870cxi Printer)"
+ }
+ {
+ ModelName "HP Officejet Pro 1150c hpijs"
+ Attribute "NickName" "" "HP Officejet Pro 1150c hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet Pro 1150c hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet pro 1150c;DES:officejet pro 1150c;"
+ PCFileName "hp-officejet_pro_1150c-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet Pro 1150c All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet Pro 1150cse All-in-one Printer)"
+ }
+ }
+ {
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-DeskJet_890C" " -sDeviceManufacture&&
+r=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;DESKJET 890&quot;"
+ // <%DJ890:Normal%>
+ {
+ ModelName "HP Deskjet 890c hpijs"
+ Attribute "NickName" "" "HP Deskjet 890c hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet 890c hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 890c;DES:deskjet 890c;"
+ PCFileName "hp-deskjet_890c-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 890cse Printer)"
+ Attribute "Product" "" "(HP Deskjet 890c Printer)"
+ }
+ {
+ ModelName "HP Officejet Pro 1170c Series hpijs"
+ Attribute "NickName" "" "HP Officejet Pro 1170c Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP OJ Pro 1170c Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet pro 1170c series;DES:officejet pro 1170c series;"
+ PCFileName "hp-officejet_pro_1170c_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet Pro 1170c All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet Pro 1170cse All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet Pro 1170cxi All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet Pro 1175c All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet Pro 1175cse All-in-one Printer)"
+ Attribute "Product" "" "(HP Officejet Pro 1175cxi All-in-one Printer)"
+ }
+ }
+} // end DJ850 and DJ890
+
+///////////////////// LJZjsMono (for proprietary plugin)
+{
+ Attribute "DefaultResolution" "" "600dpi"
+
+ // Custom page sizes from 1x4in to Ledger
+ HWMargins 18 14.4 18 14.4
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 11in 17in
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-LaserJet_1018 hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C%D -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-LaserJet_1018" " -sDeviceManufactur&&
+er=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;HP LaserJet 1018&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=600DraftGraysca&&
+leK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=600GrayscaleK"
+ Attribute "FoomaticRIPOption" "MediaType" "enum CmdLine C"
+ Attribute "FoomaticRipOptionSetting" "MediaType=Plain" ",Quality:MediaType=0"
+ Attribute "FoomaticRipOptionSetting" "MediaType=Transparency" ",Quality:MediaType=3"
+ Attribute "FoomaticRipOptionSetting" "MediaType=Photo" ",Quality:MediaType=3"
+ Attribute "FoomaticRIPOption" "InputSlot" "enum CmdLine D"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Default" ",PS:MediaPosition=7"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Manual" ",PS:MediaPosition=2"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600DraftGrayscaleK" " -r600 -sIjsPar&&
+ams=Quality:Quality=1,Quality:ColorMode=0,Quality:PenSet=0"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600GrayscaleK" " -r600 -sIjsParams=Q&&
+uality:Quality=0,Quality:ColorMode=0,Quality:PenSet=0"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft (Economy)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ *Choice "Normal/Normal" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Option "MediaType/Media Type" PickOne AnySetup 10.0
+ *Choice "Plain/Plain Paper" "%% FoomaticRIPOptionSetting: MediaType=Plain"
+ Choice "Transparency/Transparency" "%% FoomaticRIPOptionSetting: MediaType=&&
+Transparency"
+ Choice "Photo/Photo Paper" "%% FoomaticRIPOptionSetting: MediaType=Photo"
+ Option "InputSlot/Media Source" PickOne AnySetup 100.0
+ *Choice "Default/Automatic" "%% FoomaticRIPOptionSetting: InputSlot=Default"
+ Choice "Manual/Manual Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Manual"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Toner Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "600DraftGrayscaleK/600 dpi, Draft, Grayscale, Black Toner" "%% FoomaticRIPOptionSetting: Quality=600DraftGrayscaleK"
+ Choice "600GrayscaleK/600 dpi, Normal, Grayscale, Black Toner" "%% FoomaticRIPOptionSetting: Quality=600GrayscaleK"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo/4x6 inch index card" 288.00 432.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo/5x7 inch index card" 360.00 504.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+ // <%LJZjsMono:Normal%>
+ {
+ ModelName "HP LaserJet 1000 hpijs"
+ Attribute "NickName" "" "HP LaserJet 1000 hpijs, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LaserJet 1000 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 1000;DES:hp laserjet 1000;"
+ PCFileName "hp-laserjet_1000-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet 1000 Printer)"
+ }
+ {
+ ModelName "HP LaserJet 1005 Series hpijs"
+ Attribute "NickName" "" "HP LaserJet 1005 Series hpijs, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LaserJet 1005 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 1005 series;DES:hp laserjet 1005 series;"
+ PCFileName "hp-laserjet_1005_series-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet 1005 Printer)"
+ }
+ {
+ ModelName "HP LaserJet 1018 hpijs"
+ Attribute "NickName" "" "HP LaserJet 1018 hpijs, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LaserJet 1018 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 1018;DES:hp laserjet 1018;"
+ PCFileName "hp-laserjet_1018-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet 1018 Printer)"
+ Attribute "Product" "" "(HP LaserJet 1018s Printer)"
+ }
+ {
+ ModelName "HP LaserJet 1020 hpijs"
+ Attribute "NickName" "" "HP LaserJet 1020 hpijs, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LaserJet 1020 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 1020;DES:hp laserjet 1020;"
+ PCFileName "hp-laserjet_1020-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet 1020 Printer)"
+ Attribute "Product" "" "(HP LaserJet 1020 Plus Printer)"
+ }
+ {
+ ModelName "HP LaserJet 1022nw hpijs"
+ Attribute "NickName" "" "HP LaserJet 1022nw hpijs zjs, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LaserJet 1022nw hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 1022nw;DES:hp laserjet 1022nw;"
+ PCFileName "hp-laserjet_1022nw-hpijs-zjs.ppd"
+ Attribute "Product" "" "(HP LaserJet 1022nw Printer)"
+ }
+ {
+ ModelName "HP LaserJet 1022n hpijs"
+ Attribute "NickName" "" "HP LaserJet 1022n hpijs zjs, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LaserJet 1022n hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 1022n;DES:hp laserjet 1022n;"
+ PCFileName "hp-laserjet_1022n-hpijs-zjs.ppd"
+ Attribute "Product" "" "(HP LaserJet 1022n Printer)"
+ Attribute "Product" "" "(HP LaserJet 1022nxi Printer)"
+ }
+ {
+ ModelName "HP LaserJet 1022 hpijs"
+ Attribute "NickName" "" "HP LaserJet 1022 hpijs zjs, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LaserJet 1022 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet 1022;DES:hp laserjet 1022;"
+ PCFileName "hp-laserjet_1022-hpijs-zjs.ppd"
+ Attribute "Product" "" "(HP LaserJet 1022 Printer)"
+ }
+ {
+ ModelName "HP LaserJet m1120 MFP hpijs"
+ Attribute "NickName" "" "HP LaserJet m1120 MFP hpijs, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LaserJet m1120 MFP hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet m1120 mfp;DES:hp laserjet m1120 mfp;"
+ PCFileName "hp-laserjet_m1120_mfp-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet m1120 Multifunction Printer)"
+ }
+ {
+ ModelName "HP LaserJet m1120n MFP hpijs"
+ Attribute "NickName" "" "HP LaserJet m1120n MFP hpijs, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LaserJet m1120n MFP hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet m1120n mfp;DES:hp laserjet m1120n mfp;"
+ PCFileName "hp-laserjet_m1120n_mfp-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet m1120n Multifunction Printer)"
+ }
+ {
+ ModelName "HP LaserJet m1319f MFP hpijs"
+ Attribute "NickName" "" "HP LaserJet m1319f MFP hpijs, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LaserJet m1319f MFP hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet m1319f mfp;DES:hp laserjet m1319f mfp;"
+ PCFileName "hp-laserjet_m1319f_mfp-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet m1319f Multifunction Printer)"
+ }
+ {
+ ModelName "HP LaserJet p2035n hpijs"
+ Attribute "NickName" "" "HP LaserJet p2035n hpijs zjs, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LaserJet p2035n hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet p2035n;DES:hp laserjet p2035n;"
+ PCFileName "hp-laserjet_p2035n-hpijs-zjs.ppd"
+ Attribute "Product" "" "(HP LaserJet p2035n Printer)"
+ }
+ {
+ ModelName "HP LaserJet p2035 hpijs"
+ Attribute "NickName" "" "HP LaserJet p2035 hpijs zjs, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LaserJet p2035 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet p2035;DES:hp laserjet p2035;"
+ PCFileName "hp-laserjet_p2035-hpijs-zjs.ppd"
+ Attribute "Product" "" "(HP LaserJet p2035 Printer)"
+ }
+} // end LJZjsMono (for proprietary plugin)
+
+///////////////////// LJZjsMono with No Auto Duplex (for proprietary plugin)
+{
+ Attribute "DefaultResolution" "" "600dpi"
+
+ // Custom page sizes from 1x4in to Ledger
+ HWMargins 18 14.4 18 14.4
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 11in 17in
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-LaserJet_1018 hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C%D -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-LaserJet_1018" " -sDeviceManufactur&&
+er=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;HP LaserJet 1018&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=600DraftGraysca&&
+leK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=600GrayscaleK"
+ Attribute "FoomaticRIPOption" "MediaType" "enum CmdLine C"
+ Attribute "FoomaticRipOptionSetting" "MediaType=Plain" ",Quality:MediaType=0"
+ Attribute "FoomaticRipOptionSetting" "MediaType=Transparency" ",Quality:MediaType=3"
+ Attribute "FoomaticRipOptionSetting" "MediaType=Photo" ",Quality:MediaType=3"
+ Attribute "FoomaticRIPOption" "InputSlot" "enum CmdLine D"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Default" ",PS:MediaPosition=7"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Manual" ",PS:MediaPosition=2"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600DraftGrayscaleK" " -r600 -sIjsPar&&
+ams=Quality:Quality=1,Quality:ColorMode=0,Quality:PenSet=0"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600GrayscaleK" " -r600 -sIjsParams=Q&&
+uality:Quality=0,Quality:ColorMode=0,Quality:PenSet=0"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft (Economy)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ *Choice "Normal/Normal" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Option "MediaType/Media Type" PickOne AnySetup 10.0
+ *Choice "Plain/Plain Paper" "%% FoomaticRIPOptionSetting: MediaType=Plain"
+ Choice "Transparency/Transparency" "%% FoomaticRIPOptionSetting: MediaType=&&
+Transparency"
+ Choice "Photo/Photo Paper" "%% FoomaticRIPOptionSetting: MediaType=Photo"
+ Option "InputSlot/Media Source" PickOne AnySetup 100.0
+ *Choice "Default/Automatic" "%% FoomaticRIPOptionSetting: InputSlot=Default"
+ Choice "Manual/Manual Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Manual"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Toner Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "600DraftGrayscaleK/600 dpi, Draft, Grayscale, Black Toner" "%% FoomaticRIPOptionSetting: Quality=600DraftGrayscaleK"
+ Choice "600GrayscaleK/600 dpi, Normal, Grayscale, Black Toner" "%% FoomaticRIPOptionSetting: Quality=600GrayscaleK"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo/4x6 inch index card" 288.00 432.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo/5x7 inch index card" 360.00 504.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+ // <%LJZjsMono:NoAutoDuplex%>
+ {
+ ModelName "HP LaserJet Professional p1102w hpijs"
+ Attribute "NickName" "" "HP LaserJet Professional p1102w hpijs, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LJ Professional p1102w hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet professional p1102w;DES:hp laserjet professional p1102w;"
+ PCFileName "hp-laserjet_professional_p1102w-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet Professional p1102w Printer)"
+ }
+ {
+ ModelName "HP LaserJet Professional p1102 hpijs"
+ Attribute "NickName" "" "HP LaserJet Professional p1102 hpijs, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LJ Professional p1102 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet professional p1102;DES:hp laserjet professional p1102;"
+ PCFileName "hp-laserjet_professional_p1102-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet Professional p1102 Printer)"
+ Attribute "Product" "" "(HP LaserJet Professional p1102s Printer)"
+ }
+ {
+ ModelName "HP LaserJet Professional P 1102w hpijs"
+ Attribute "NickName" "" "HP LaserJet Professional P 1102w hpijs, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LJ Pro P 1102w hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet professional p 1102w;DES:hp laserjet professional p 1102w;"
+ PCFileName "hp-laserjet_professional_p_1102w-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet Professional P 1102w Printer)"
+ }
+ {
+ ModelName "HP LaserJet Professional p1106 hpijs"
+ Attribute "NickName" "" "HP LaserJet Professional p1106 hpijs, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LJ Professional p1106 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet professional p1106;DES:hp laserjet professional p1106;"
+ PCFileName "hp-laserjet_professional_p1106-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet Professional p1106 Printer)"
+ }
+ {
+ ModelName "HP LaserJet Professional p1108 hpijs"
+ Attribute "NickName" "" "HP LaserJet Professional p1108 hpijs, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LJ Professional p1108 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet professional p1108;DES:hp laserjet professional p1108;"
+ PCFileName "hp-laserjet_professional_p1108-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet Professional p1108 Printer)"
+ }
+ {
+ ModelName "HP LaserJet Professional m1132 MFP hpijs"
+ Attribute "NickName" "" "HP LaserJet Professional m1132 MFP hpijs, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LJ Pro m1132 MFP hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet professional m1132 mfp;DES:hp laserjet professional m1132 mfp;"
+ PCFileName "hp-laserjet_professional_m1132_mfp-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet Professional m1132 Multifunction Printer)"
+ Attribute "Product" "" "(HP LaserJet Professional m1132s Multifunction Printer)"
+ }
+ {
+ ModelName "HP LaserJet Professional m1136 MFP hpijs"
+ Attribute "NickName" "" "HP LaserJet Professional m1136 MFP hpijs, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LJ Pro m1136 MFP hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet professional m1136 mfp;DES:hp laserjet professional m1136 mfp;"
+ PCFileName "hp-laserjet_professional_m1136_mfp-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet Professional m1136 Multifunction Printer)"
+ }
+ {
+ ModelName "HP LaserJet Professional m1212nf MFP hpijs"
+ Attribute "NickName" "" "HP LaserJet Professional m1212nf MFP hpijs, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LJ Pro m1212nf MFP hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet professional m1212nf mfp;DES:hp laserjet professional m1212nf mfp;"
+ PCFileName "hp-laserjet_professional_m1212nf_mfp-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet Professional m1212nf Multifunction Printer)"
+ }
+ {
+ ModelName "HP LaserJet Professional m1213nf MFP hpijs"
+ Attribute "NickName" "" "HP LaserJet Professional m1213nf MFP hpijs, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LJ Pro m1213nf MFP hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet professional m1213nf mfp;DES:hp laserjet professional m1213nf mfp;"
+ PCFileName "hp-laserjet_professional_m1213nf_mfp-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet Professional m1213nf Multifunction Printer)"
+ }
+ {
+ ModelName "HP LaserJet Professional m1214nfh MFP hpijs"
+ Attribute "NickName" "" "HP LaserJet Professional m1214nfh MFP hpijs, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LJ Pro m1214nfh MFP hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet professional m1214nfh mfp;DES:hp laserjet professional m1214nfh mfp;"
+ PCFileName "hp-laserjet_professional_m1214nfh_mfp-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet Professional m1214nfh Multifunction Printer)"
+ }
+ {
+ ModelName "HP LaserJet Professional m1216nfh MFP hpijs"
+ Attribute "NickName" "" "HP LaserJet Professional m1216nfh MFP hpijs, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LJ Pro m1216nfh MFP hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet professional m1216nfh mfp;DES:hp laserjet professional m1216nfh mfp;"
+ PCFileName "hp-laserjet_professional_m1216nfh_mfp-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet Professional m1216nfh MFP)"
+ }
+ {
+ ModelName "HP LaserJet Professional m1217nfw MFP hpijs"
+ Attribute "NickName" "" "HP LaserJet Professional m1217nfw MFP hpijs, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LJ Pro m1217nfw MFP hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet professional m1217nfw mfp;DES:hp laserjet professional m1217nfw mfp;"
+ PCFileName "hp-laserjet_professional_m1217nfw_mfp-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet Professional m1217nfw Multifunction Printer)"
+ }
+ {
+ ModelName "HP LaserJet Professional m1219nf MFP hpijs"
+ Attribute "NickName" "" "HP LaserJet Professional m1219nf MFP hpijs, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LJ Pro m1219nf MFP hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet professional m1219nf mfp;DES:hp laserjet professional m1219nf mfp;"
+ PCFileName "hp-laserjet_professional_m1219nf_mfp-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet Professional m1219nf MFP)"
+ }
+ {
+ ModelName "HP LaserJet Professional p1566 hpijs"
+ Attribute "NickName" "" "HP LaserJet Professional p1566 hpijs, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LJ Professional p1566 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet professional p1566;DES:hp laserjet professional p1566;"
+ PCFileName "hp-laserjet_professional_p1566-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet Professional p1566)"
+ }
+} // end LJZjsMono with No Auto Duplex (for proprietary plugin)
+
+///////////////////// LJZjsMono with Auto Duplex (for proprietary plugin)
+{
+ Attribute "DefaultResolution" "" "600dpi"
+
+ // Custom page sizes from 1x4in to Ledger
+ HWMargins 18 14.4 18 14.4
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 11in 17in
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-LaserJet_1018 hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C%D -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-LaserJet_1018" " -sDeviceManufactur&&
+er=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;HP LaserJet 1018&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=600DraftGraysca&&
+leK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=600GrayscaleK"
+ Attribute "FoomaticRIPOption" "MediaType" "enum CmdLine C"
+ Attribute "FoomaticRipOptionSetting" "MediaType=Plain" ",Quality:MediaType=0"
+ Attribute "FoomaticRipOptionSetting" "MediaType=Transparency" ",Quality:MediaType=3"
+ Attribute "FoomaticRipOptionSetting" "MediaType=Photo" ",Quality:MediaType=3"
+ Attribute "FoomaticRIPOption" "InputSlot" "enum CmdLine D"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Default" ",PS:MediaPosition=7"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Manual" ",PS:MediaPosition=2"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600DraftGrayscaleK" " -r600 -sIjsPar&&
+ams=Quality:Quality=1,Quality:ColorMode=0,Quality:PenSet=0"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600GrayscaleK" " -r600 -sIjsParams=Q&&
+uality:Quality=0,Quality:ColorMode=0,Quality:PenSet=0"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft (Economy)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ *Choice "Normal/Normal" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Option "MediaType/Media Type" PickOne AnySetup 10.0
+ *Choice "Plain/Plain Paper" "%% FoomaticRIPOptionSetting: MediaType=Plain"
+ Choice "Transparency/Transparency" "%% FoomaticRIPOptionSetting: MediaType=&&
+Transparency"
+ Choice "Photo/Photo Paper" "%% FoomaticRIPOptionSetting: MediaType=Photo"
+ Option "InputSlot/Media Source" PickOne AnySetup 100.0
+ *Choice "Default/Automatic" "%% FoomaticRIPOptionSetting: InputSlot=Default"
+ Choice "Manual/Manual Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Manual"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Toner Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "600DraftGrayscaleK/600 dpi, Draft, Grayscale, Black Toner" "%% FoomaticRIPOptionSetting: Quality=600DraftGrayscaleK"
+ Choice "600GrayscaleK/600 dpi, Normal, Grayscale, Black Toner" "%% FoomaticRIPOptionSetting: Quality=600GrayscaleK"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo/4x6 inch index card" 288.00 432.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo/5x7 inch index card" 360.00 504.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+ // <%LJZjsMono:Duplex%>
+ {
+ ModelName "HP LaserJet Professional p1606dn hpijs"
+ Attribute "NickName" "" "HP LaserJet Professional p1606dn hpijs, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LJ Pro p1606dn hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet professional p1606dn;DES:hp laserjet professional p1606dn;"
+ PCFileName "hp-laserjet_professional_p1606dn-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet Professional p1606dn Printer)"
+ }
+} // end LJZjsMono with Auto Duplex (for proprietary plugin)
+
+///////////// LJJetReady (for proprietary plugin)
+{
+ Attribute "DefaultResolution" "" "600dpi"
+
+ // Custom page sizes from 1x4in to Ledger
+ HWMargins 18 14.4 18 14.4
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 11in 17in
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-Color_LaserJet_3500 hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-Color_LaserJet_3500" " -sDeviceManu&&
+facturer=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;hp color Lase&&
+rJet 3500&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=NormalColor" "Quality=NormalColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=NormalGray" "Quality=NormalGraysc&&
+aleCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=BestColor" "Quality=BestColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=BestGray" "Quality=BestGraysc&&
+aleCMYK"
+ Attribute "FoomaticRIPOption" "InputSlot" "enum CmdLine C"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Default" ",PS:MediaPosition=7"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=PhotoTray" ",PS:MediaPosition=6"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Upper" ",PS:MediaPosition=1"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Lower" ",PS:MediaPosition=4"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Envelope" ",PS:MediaPosition=3"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=LargeCapacity" ",PS:MediaPosition=&&
+5"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Manual" ",PS:MediaPosition=2"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=MPTray" ",PS:MediaPosition=8"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ Attribute "FoomaticRIPOption" "Duplex" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexNoTumble" " -dDuplex=true -dTum&&
+ble=false"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexTumble" " -dDuplex=true -dTumbl&&
+e=true"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=None" " -dDuplex=false"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=NormalColorCMYK" " -r600 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=NormalGrayscaleCMYK" " -r600 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=BestColorCMYK" " -r600 -sIjsParams=Qu&&
+ality:Quality=2,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=BestGrayscaleCMYK" " -r600 -sIjsParam&&
+s=Quality:Quality=2,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ *Choice "NormalColor/Normal Color" "%% FoomaticRIPOptionSetting: PrintoutMode=NormalColor"
+ Choice "NormalGray/Normal Grayscale" "%% FoomaticRIPOptionSetting: PrintoutMode=NormalGray"
+ Choice "BestColor/Best Color" "%% FoomaticRIPOptionSetting: PrintoutMode=BestColor"
+ Choice "BestGray/Best Grayscale" "%% FoomaticRIPOptionSetting: PrintoutMode=BestGray"
+ Option "InputSlot/Media Source" PickOne AnySetup 100.0
+ *Choice "Default/Printer default" "%% FoomaticRIPOptionSetting: InputSlot=Default"
+ Choice "PhotoTray/Photo Tray" "%% FoomaticRIPOptionSetting: InputSlot=PhotoTray"
+ Choice "Upper/Upper Tray" "%% FoomaticRIPOptionSetting: InputSlot=Upper"
+ Choice "Lower/Lower Tray" "%% FoomaticRIPOptionSetting: InputSlot=Lower"
+ Choice "Envelope/Envelope Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Envelope"
+ Choice "LargeCapacity/Large Capacity Tray" "%% FoomaticRIPOptionSetting: InputSlot=LargeCapacity"
+ Choice "Manual/Manual Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Manual"
+ Choice "MPTray/Multi Purpose Tray" "%% FoomaticRIPOptionSetting: InputSlot=MPTray"
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 120.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "%% FoomaticRIPOptionSetting: Duplex=DuplexNoTumble"
+ Choice "DuplexTumble/Short Edge (Flip)" "%% FoomaticRIPOptionSetting: Duplex=DuplexTumble"
+ *Choice "None/Off" "%% FoomaticRIPOptionSetting: Duplex=None"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "NormalColorCMYK/600 dpi, Normal, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=NormalColorCMYK"
+ Choice "NormalGrayscaleCMYK/600 dpi, Normal, Grayscale, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=NormalGrayscaleCMYK"
+ Choice "BestColorCMYK/600 dpi, Best, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=BestColorCMYK"
+ Choice "BestGrayscaleCMYK/600 dpi, Best, Grayscale, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=BestGrayscaleCMYK"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo/4x6 inch index card" 288.00 432.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo/5x7 inch index card" 360.00 504.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+ // <%LJJetReady:Normal%>
+ {
+ ModelName "HP Color LaserJet 3500n hpijs"
+ Attribute "NickName" "" "HP Color LaserJet 3500n hpijs, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP Color LaserJet 3500n hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet 3500n;DES:hp color laserjet 3500n;"
+ PCFileName "hp-color_laserjet_3500n-hpijs.ppd"
+ Attribute "Product" "" "(HP Color LaserJet 3500n Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet 3500 hpijs"
+ Attribute "NickName" "" "HP Color LaserJet 3500 hpijs, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP Color LaserJet 3500 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet 3500;DES:hp color laserjet 3500;"
+ PCFileName "hp-color_laserjet_3500-hpijs.ppd"
+ Attribute "Product" "" "(HP Color LaserJet 3500 Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 3500dn Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 3500dtn Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet 3550 hpijs"
+ Attribute "NickName" "" "HP Color LaserJet 3550 hpijs, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP Color LaserJet 3550 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet 3550;DES:hp color laserjet 3550;"
+ PCFileName "hp-color_laserjet_3550-hpijs.ppd"
+ Attribute "Product" "" "(HP Color LaserJet 3550 Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet 3550n hpijs"
+ Attribute "NickName" "" "HP Color LaserJet 3550n hpijs, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP Color LaserJet 3550n hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet 3550n;DES:hp color laserjet 3550n;"
+ PCFileName "hp-color_laserjet_3550n-hpijs.ppd"
+ Attribute "Product" "" "(HP Color LaserJet 3550n Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet 3600 hpijs"
+ Attribute "NickName" "" "HP Color LaserJet 3600 hpijs, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP Color LaserJet 3600 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet 3600;DES:hp color laserjet 3600;"
+ PCFileName "hp-color_laserjet_3600-hpijs.ppd"
+ Attribute "Product" "" "(HP Color LaserJet 3600 Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 3600n Printer)"
+ Attribute "Product" "" "(HP Color LaserJet 3600dn Printer)"
+ }
+} // end LJJetReady (for proprietary plugin)
+
+///////////// LJm1005 (for proprietary plugin)
+{
+ Attribute "DefaultResolution" "" "600dpi"
+
+ // Custom page sizes from 1x4in to Ledger
+ HWMargins 18 14.4 18 14.4
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 11in 17in
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-LaserJet_M1005 hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C%D -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-LaserJet_M1005" " -sDeviceManufactur&&
+er=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;HP LaserJet M1005&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=600DraftGraysca&&
+leK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=600GrayscaleK"
+ Attribute "FoomaticRIPOption" "MediaType" "enum CmdLine C"
+ Attribute "FoomaticRipOptionSetting" "MediaType=Plain" ",Quality:MediaType=0"
+ Attribute "FoomaticRipOptionSetting" "MediaType=Transparency" ",Quality:MediaType=3"
+ Attribute "FoomaticRipOptionSetting" "MediaType=Photo" ",Quality:MediaType=3"
+ Attribute "FoomaticRIPOption" "InputSlot" "enum CmdLine D"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Default" ",PS:MediaPosition=7"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Manual" ",PS:MediaPosition=2"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600DraftGrayscaleK" " -r600 -sIjsPar&&
+ams=Quality:Quality=1,Quality:ColorMode=0,Quality:PenSet=0"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600GrayscaleK" " -r600 -sIjsParams=Q&&
+uality:Quality=0,Quality:ColorMode=0,Quality:PenSet=0"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600BestGrayscaleK" " -r600 -sIjsParams=Q&&
+uality:Quality=2,Quality:ColorMode=0,Quality:PenSet=0"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft (Economy)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ *Choice "Normal/Normal" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Option "MediaType/Media Type" PickOne AnySetup 10.0
+ *Choice "Plain/Plain Paper" "%% FoomaticRIPOptionSetting: MediaType=Plain"
+ Choice "Transparency/Transparency" "%% FoomaticRIPOptionSetting: MediaType=&&
+Transparency"
+ Choice "Photo/Photo Paper" "%% FoomaticRIPOptionSetting: MediaType=Photo"
+ Option "InputSlot/Media Source" PickOne AnySetup 100.0
+ *Choice "Default/Automatic" "%% FoomaticRIPOptionSetting: InputSlot=Default"
+ Choice "Manual/Manual Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Manual"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Toner Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "600DraftGrayscaleK/600 dpi, Draft, Grayscale, Black Toner" "%% FoomaticRIPOptionSetting: Quality=600DraftGrayscaleK"
+ Choice "600GrayscaleK/600 dpi, Normal, Grayscale, Black Toner" "%% FoomaticRIPOptionSetting: Quality=600GrayscaleK"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo/4x6 inch index card" 288.00 432.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo/5x7 inch index card" 360.00 504.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+ // <%LJm1005:Normal%>
+ {
+ ModelName "HP LaserJet m1005 hpijs"
+ Attribute "NickName" "" "HP LaserJet m1005 hpijs, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LaserJet m1005 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet m1005;DES:hp laserjet m1005;"
+ PCFileName "hp-laserjet_m1005-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet m1005 Multifunction Printer)"
+ }
+ {
+ ModelName "HP LaserJet p1505n hpijs"
+ Attribute "NickName" "" "HP LaserJet p1505n hpijs zxs, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LaserJet p1505n hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet p1505n;DES:hp laserjet p1505n;"
+ PCFileName "hp-laserjet_p1505n-hpijs-zxs.ppd"
+ Attribute "Product" "" "(HP LaserJet p1505n Printer)"
+ }
+ {
+ ModelName "HP LaserJet p1505 hpijs"
+ Attribute "NickName" "" "HP LaserJet p1505 hpijs, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LaserJet p1505 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet p1505;DES:hp laserjet p1505;"
+ PCFileName "hp-laserjet_p1505-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet p1505 Printer)"
+ }
+ {
+ ModelName "HP LaserJet p2014 hpijs"
+ Attribute "NickName" "" "HP LaserJet p2014 hpijs zxs, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LaserJet p2014 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet p2014;DES:hp laserjet p2014;"
+ PCFileName "hp-laserjet_p2014-hpijs-zxs.ppd"
+ Attribute "Product" "" "(HP LaserJet p2014 Printer)"
+ }
+ {
+ ModelName "HP LaserJet p2014n hpijs"
+ Attribute "NickName" "" "HP LaserJet p2014n hpijs zxs, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LaserJet p2014n hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet p2014n;DES:hp laserjet p2014n;"
+ PCFileName "hp-laserjet_p2014n-hpijs-zxs.ppd"
+ Attribute "Product" "" "(HP LaserJet p2014n Printer)"
+ }
+} // end LJm1005 (for proprietary plugin)
+
+///////////////////// LJZjsColor (for proprietary plugin)
+{
+ Attribute "DefaultResolution" "" "600dpi"
+
+ // Custom page sizes from 1x4in to Ledger
+ HWMargins 18 14.4 18 14.4
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 11in 17in
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-Color_LaserJet_2600n hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C%D -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-Color_LaserJet_2600n" " -sDeviceManufactur&&
+er=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;HP Color LaserJet 2600n&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=DraftColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft.Gray" "Quality=DraftGrayscaleCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=NormalColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal.Gray" "Quality=NormalGrayscaleCMYK"
+ Attribute "FoomaticRIPOption" "MediaType" "enum CmdLine C"
+ Attribute "FoomaticRipOptionSetting" "MediaType=Plain" ",Quality:MediaType=0"
+ Attribute "FoomaticRipOptionSetting" "MediaType=Transparency" ",Quality:MediaType=3"
+ Attribute "FoomaticRipOptionSetting" "MediaType=Photo" ",Quality:MediaType=3"
+ Attribute "FoomaticRIPOption" "InputSlot" "enum CmdLine D"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Default" ",PS:MediaPosition=7"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Manual" ",PS:MediaPosition=2"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=DraftColorCMYK" " -r600 -sIjsPar&&
+ams=Quality:Quality=1,Quality:ColorMode=2,Quality:PenSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=NormalColorCMYK" " -r600 -sIjsParams=Q&&
+uality:Quality=0,Quality:ColorMode=2,Quality:PenSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=DraftGrayscaleCMYK" " -r600 -sIjsPar&&
+ams=Quality:Quality=1,Quality:ColorMode=0,Quality:PenSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=NormalGrayscaleCMYK" " -r600 -sIjsParams=Q&&
+uality:Quality=0,Quality:ColorMode=0,Quality:PenSet=2"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft Color" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ *Choice "Normal/Normal Color" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "Draft.Gray/Draft Grayscale" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft.Gray"
+ Choice "Normal.Gray/Normal Grayscale" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal.Gray"
+ Option "MediaType/Media Type" PickOne AnySetup 10.0
+ *Choice "Plain/Plain Paper" "%% FoomaticRIPOptionSetting: MediaType=Plain"
+ Choice "Transparency/Transparency" "%% FoomaticRIPOptionSetting: MediaType=&&
+Transparency"
+ Choice "Photo/Photo Paper" "%% FoomaticRIPOptionSetting: MediaType=Photo"
+ Option "InputSlot/Media Source" PickOne AnySetup 100.0
+ *Choice "Default/Automatic" "%% FoomaticRIPOptionSetting: InputSlot=Default"
+ Choice "Manual/Manual Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Manual"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Toner Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "DraftColorCMYK/600 dpi, Draft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=DraftColorCMYK"
+ Choice "NormalColorCMYK/600 dpi, Normal, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=NormalColorCMYK"
+ Choice "DraftGrayscaleCMYK/600 dpi, Draft, Grayscale, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=DraftGrayscaleCMYK"
+ Choice "NormalGrayscaleCMYK/600 dpi, Normal, Grayscale, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=NormalGrayscaleCMYK"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo/4x6 inch index card" 288.00 432.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo/5x7 inch index card" 360.00 504.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+
+ {
+ // <%LJZjsColor:Normal%>
+ {
+ ModelName "HP Color LaserJet cp1215 hpijs"
+ Attribute "NickName" "" "HP Color LaserJet cp1215 hpijs, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP Color LaserJet cp1215 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet cp1215;DES:hp color laserjet cp1215;"
+ PCFileName "hp-color_laserjet_cp1215-hpijs.ppd"
+ Attribute "Product" "" "(HP Color LaserJet cp1215 Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet cp1217 hpijs"
+ Attribute "NickName" "" "HP Color LaserJet cp1217 hpijs, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP Color LaserJet cp1217 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet cp1217;DES:hp color laserjet cp1217;"
+ PCFileName "hp-color_laserjet_cp1217-hpijs.ppd"
+ Attribute "Product" "" "(HP Color LaserJet cp1217 Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet 1600 hpijs"
+ Attribute "NickName" "" "HP Color LaserJet 1600 hpijs, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP Color LaserJet 1600 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet 1600;DES:hp color laserjet 1600;"
+ PCFileName "hp-color_laserjet_1600-hpijs.ppd"
+ Attribute "Product" "" "(HP Color LaserJet 1600 Printer)"
+ }
+ {
+ ModelName "HP Color LaserJet 2600n hpijs"
+ Attribute "NickName" "" "HP Color LaserJet 2600n hpijs, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP Color LaserJet 2600n hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp color laserjet 2600n;DES:hp color laserjet 2600n;"
+ PCFileName "hp-color_laserjet_2600n-hpijs.ppd"
+ Attribute "Product" "" "(HP Color LaserJet 2600n Printer)"
+ }
+ }
+ {
+ Attribute "hpLJZjsColorVersion" "" "2"
+ // <%LJZjsColor:Advanced%>
+ {
+ ModelName "HP LaserJet cp1025nw hpijs"
+ Attribute "NickName" "" "HP LaserJet cp1025nw hpijs, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LaserJet cp1025nw hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet cp1025nw;DES:hp laserjet cp1025nw;"
+ PCFileName "hp-laserjet_cp1025nw-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet Pro cp1025nw Color Printer Series)"
+ }
+ {
+ ModelName "HP LaserJet cp1025 hpijs"
+ Attribute "NickName" "" "HP LaserJet cp1025 hpijs, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LaserJet cp1025 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet cp1025;DES:hp laserjet cp1025;"
+ PCFileName "hp-laserjet_cp1025-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet Pro cp1025 Color Printer Series)"
+ }
+ {
+ ModelName "HP LaserJet Cp 1025nw hpijs"
+ Attribute "NickName" "" "HP LaserJet Cp 1025nw hpijs, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LaserJet Cp 1025nw hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet cp 1025nw;DES:hp laserjet cp 1025nw;"
+ PCFileName "hp-laserjet_cp_1025nw-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet Pro Cp 1025nw Color Printer Series)"
+ }
+ {
+ ModelName "HP LaserJet Cp 1025 hpijs"
+ Attribute "NickName" "" "HP LaserJet Cp 1025 hpijs, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LaserJet Cp 1025 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet cp 1025;DES:hp laserjet cp 1025;"
+ PCFileName "hp-laserjet_cp_1025-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet Pro Cp 1025 Color Printer Series)"
+ }
+ }
+} // end LJZjsColor (for proprietary plugin)
+
+///////////// LJP1XXX (for proprietary plugin)
+{
+ Attribute "DefaultResolution" "" "600dpi"
+
+ // Custom page sizes from 1x4in to Ledger
+ HWMargins 18 14.4 18 14.4
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 11in 17in
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-LaserJet_M1005 hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C%D -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-LaserJet_M1005" " -sDeviceManufactur&&
+er=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;HP LaserJet P1005&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=600DraftGraysca&&
+leK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=600GrayscaleK"
+ Attribute "FoomaticRIPOption" "MediaType" "enum CmdLine C"
+ Attribute "FoomaticRipOptionSetting" "MediaType=Plain" ",Quality:MediaType=0"
+ Attribute "FoomaticRipOptionSetting" "MediaType=Transparency" ",Quality:MediaType=3"
+ Attribute "FoomaticRipOptionSetting" "MediaType=Photo" ",Quality:MediaType=3"
+ Attribute "FoomaticRIPOption" "InputSlot" "enum CmdLine D"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Default" ",PS:MediaPosition=7"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Manual" ",PS:MediaPosition=2"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600DraftGrayscaleK" " -r600 -sIjsPar&&
+ams=Quality:Quality=1,Quality:ColorMode=0,Quality:PenSet=0"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600GrayscaleK" " -r600 -sIjsParams=Q&&
+uality:Quality=0,Quality:ColorMode=0,Quality:PenSet=0"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600BestGrayscaleK" " -r600 -sIjsParams=Q&&
+uality:Quality=2,Quality:ColorMode=0,Quality:PenSet=0"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft (Economy)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ *Choice "Normal/Normal" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Option "MediaType/Media Type" PickOne AnySetup 10.0
+ *Choice "Plain/Plain Paper" "%% FoomaticRIPOptionSetting: MediaType=Plain"
+ Choice "Transparency/Transparency" "%% FoomaticRIPOptionSetting: MediaType=&&
+Transparency"
+ Choice "Photo/Photo Paper" "%% FoomaticRIPOptionSetting: MediaType=Photo"
+ Option "InputSlot/Media Source" PickOne AnySetup 100.0
+ *Choice "Default/Automatic" "%% FoomaticRIPOptionSetting: InputSlot=Default"
+ Choice "Manual/Manual Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Manual"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Toner Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "600DraftGrayscaleK/600 dpi, Draft, Grayscale, Black Toner" "%% FoomaticRIPOptionSetting: Quality=600DraftGrayscaleK"
+ Choice "600GrayscaleK/600 dpi, Normal, Grayscale, Black Toner" "%% FoomaticRIPOptionSetting: Quality=600GrayscaleK"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo/4x6 inch index card" 288.00 432.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo/5x7 inch index card" 360.00 504.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+ // <%LJP1XXX:Normal%>
+ {
+ ModelName "HP LaserJet p1005 hpijs"
+ Attribute "NickName" "" "HP LaserJet p1005 hpijs, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LaserJet p1005 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet p1005;DES:hp laserjet p1005;"
+ PCFileName "hp-laserjet_p1005-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet p1005 Printer)"
+ }
+ {
+ ModelName "HP LaserJet p1006 hpijs"
+ Attribute "NickName" "" "HP LaserJet p1006 hpijs, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LaserJet p1006 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet p1006;DES:hp laserjet p1006;"
+ PCFileName "hp-laserjet_p1006-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet p1006 Printer)"
+ }
+ {
+ ModelName "HP LaserJet p1007 hpijs"
+ Attribute "NickName" "" "HP LaserJet p1007 hpijs, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LaserJet p1007 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet p1007;DES:hp laserjet p1007;"
+ PCFileName "hp-laserjet_p1007-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet p1007 Printer)"
+ }
+ {
+ ModelName "HP LaserJet p1008 hpijs"
+ Attribute "NickName" "" "HP LaserJet p1008 hpijs, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LaserJet p1008 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet p1008;DES:hp laserjet p1008;"
+ PCFileName "hp-laserjet_p1008-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet p1008 Printer)"
+ }
+ {
+ ModelName "HP LaserJet p1009 hpijs"
+ Attribute "NickName" "" "HP LaserJet p1009 hpijs, $Version, requires proprietary plugin"
+ Attribute "ShortNickName" "" "HP LaserJet p1009 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:hp laserjet p1009;DES:hp laserjet p1009;"
+ PCFileName "hp-laserjet_p1009-hpijs.ppd"
+ Attribute "Product" "" "(HP LaserJet p1009 Printer)"
+ }
+} // end LJP1XXX (for proprietary plugin)
+
+/////////////// Stabler
+{
+ Attribute "DefaultResolution" "" "600dpi"
+
+ // Custom page sizes from 1x4in to SuperB
+ HWMargins 18 36 18 9
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 936 1368
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-DeskJet_5650 hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-DeskJet_5650" " -sDeviceManufacture&&
+r=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;deskjet 5600&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=300FastDraftCol&&
+orCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft.Gray" "Quality=300FastDra&&
+ftGrayscaleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=300ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal.Gray" "Quality=300Graysc&&
+aleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High" "Quality=600ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High.Gray" "Quality=600Grayscal&&
+eK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Photo" "Quality=600PhotoCMYKFu&&
+llBleed"
+ Attribute "FoomaticRIPOption" "InputSlot" "enum CmdLine C"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Default" ",PS:MediaPosition=7"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=PhotoTray" ",PS:MediaPosition=6"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Upper" ",PS:MediaPosition=1"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Lower" ",PS:MediaPosition=4"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=CDDVDTray" ",PS:MediaPosition=14"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Envelope" ",PS:MediaPosition=3"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=LargeCapacity" ",PS:MediaPosition=&&
+5"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Manual" ",PS:MediaPosition=2"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=MPTray" ",PS:MediaPosition=8"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=PhotoTearOff" " -dDEVICEWIDTHPOINTS&&
+=288 -dDEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6TearOff" " -dDEVICEWIDTHPOINTS=29&&
+7 -dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD120" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ /////////// Large format paper support
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B4JIS" " -dDEVICEWIDTHPOINTS=729 -d&&
+DEVICEHEIGHTPOINTS=1033"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Ledger" " -dDEVICEWIDTHPOINTS=792 -&&
+dDEVICEHEIGHTPOINTS=1224"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=SuperB" " -dDEVICEWIDTHPOINTS=936 -&&
+dDEVICEHEIGHTPOINTS=1368"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w774h1116" " -dDEVICEWIDTHPOINTS=77&&
+4 -dDEVICEHEIGHTPOINTS=1116"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A3" " -dDEVICEWIDTHPOINTS=842 -dDEV&&
+ICEHEIGHTPOINTS=1190"
+ Attribute "FoomaticRIPOption" "Duplex" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexNoTumble" " -dDuplex=true -dTum&&
+ble=false"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexTumble" " -dDuplex=true -dTumbl&&
+e=true"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=None" " -dDuplex=false"
+ Attribute "FoomaticRIPOption" "DryTime" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Zero" ""
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Five" ",DryTime=5"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Ten" ",DryTime=10"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Fifteen" ",DryTime=15"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Twenty" ",DryTime=20"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=TwentyFive" ",DryTime=25"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Thirty" ",DryTime=30"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYK" " -r300 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYKFullBleed" " -r300 -sIjs&&
+Params=Quality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:FullBleed=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftColorCMYK" " -r300 -sIjsPara&&
+ms=Quality:Quality=1,Quality:ColorMode=2,Quality:MediaType=0,Quality:P&&
+enSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftGrayscaleK" " -r300 -sIjs&&
+Params=Quality:Quality=1,Quality:ColorMode=0,Quality:MediaType=0,Quali&&
+ty:PenSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300FastDraftColorCMYK" " -r300 -sIjs&&
+Params=Quality:Quality=4,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:SpeedMech=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300FastDraftGrayscaleK" " -r300 -&&
+sIjsParams=Quality:Quality=4,Quality:ColorMode=0,Quality:MediaType=0,Q&&
+uality:PenSet=2,Quality:SpeedMech=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300GrayscaleK" " -r300 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMYK" " -r600 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMYKFullBleed" " -r600 -sIjs&&
+Params=Quality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:FullBleed=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600GrayscaleK" " -r600 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600PhotoCMYK" " -r600 -sIjsParams=&&
+Quality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenS&&
+et=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600PhotoCMYKFullBleed" " -r600 -sI&&
+jsParams=Quality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Qua&&
+lity:PenSet=2,Quality:FullBleed=1"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ Choice "Draft.Gray/Draft Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft.Gray"
+ *Choice "Normal/Normal (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "Normal.Gray/Normal Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal.Gray"
+ Choice "High/High Quality (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=High"
+ Choice "High.Gray/High Quality Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=High.Gray"
+ Choice "Photo/Photo (on photo paper)" "%% FoomaticRIPOptionSetting: PrintoutMode=Photo"
+ Option "InputSlot/Media Source" PickOne AnySetup 100.0
+ *Choice "Default/Printer default" "%% FoomaticRIPOptionSetting: InputSlot=Default"
+ Choice "PhotoTray/Photo Tray" "%% FoomaticRIPOptionSetting: InputSlot=PhotoTray"
+ Choice "Upper/Upper Tray" "%% FoomaticRIPOptionSetting: InputSlot=Upper"
+ Choice "Lower/Lower Tray" "%% FoomaticRIPOptionSetting: InputSlot=Lower"
+ Choice "CDDVDTray/CD or DVD Tray" "%% FoomaticRIPOptionSetting: InputSlot=CDDVDTray"
+ Choice "Envelope/Envelope Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Envelope"
+ Choice "LargeCapacity/Large Capacity Tray" "%% FoomaticRIPOptionSetting: InputSlot=LargeCapacity"
+ Choice "Manual/Manual Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Manual"
+ Choice "MPTray/Multi Purpose Tray" "%% FoomaticRIPOptionSetting: InputSlot=MPTray"
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 120.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "%% FoomaticRIPOptionSetting: Duplex=DuplexNoTumble"
+ Choice "DuplexTumble/Short Edge (Flip)" "%% FoomaticRIPOptionSetting: Duplex=DuplexTumble"
+ *Choice "None/Off" "%% FoomaticRIPOptionSetting: Duplex=None"
+ Option "DryTime/Additional Dry Time" PickOne AnySetup 120.0
+ *Choice "Zero/Printer Default" "%% FoomaticRIPOptionSetting: DryTime=Zero"
+ Choice "Five/5 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Five"
+ Choice "Ten/10 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Ten"
+ Choice "Fifteen/15 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Fifteen"
+ Choice "Twenty/20 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Twenty"
+ Choice "TwentyFive/25 Seconds" "%% FoomaticRIPOptionSetting: DryTime=TwentyFive"
+ Choice "Thirty/30 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Thirty"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "300ColorCMYK/300 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYK"
+ Choice "300ColorCMYKFullBleed/300 dpi, Color, Full Bleed, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYKFullBleed"
+ Choice "300DraftColorCMYK/300 dpi, Draft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftColorCMYK"
+ Choice "300DraftGrayscaleK/300 dpi, Draft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftGrayscaleK"
+ Choice "300FastDraftColorCMYK/300 dpi, FastDraft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300FastDraftColorCMYK"
+ Choice "300FastDraftGrayscaleK/300 dpi, FastDraft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300FastDraftGrayscaleK"
+ Choice "300GrayscaleK/300 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300GrayscaleK"
+ Choice "600ColorCMYK/600 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMYK"
+ Choice "600ColorCMYKFullBleed/600 dpi, Color, Full Bleed, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMYKFullBleed"
+ Choice "600GrayscaleK/600 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=600GrayscaleK"
+ Choice "600PhotoCMYK/600 dpi, Photo, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=600PhotoCMYK"
+ Choice "600PhotoCMYKFullBleed/600 dpi, Photo, Full Bleed, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=600PhotoCMYKFullBleed"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 9.72 36.00 9.72 9.00 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo or 5x7 inch index card" 360.00 504.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "PhotoTearOff/Photo with tear-off tab" 288.00 432.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff" "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "A6TearOff/A6 with tear-off tab" 297.00 420.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=A6TearOff" "%% FoomaticRIPOptionSetting: PageSize=A6TearOff"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "CDDVD120/CD or DVD 120 mm" 360.00 360.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD120" "%% FoomaticRIPOptionSetting: PageSize=CDDVD120"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+ // <%Stabler:Normal%>
+ {
+ ModelName "HP Photosmart b010 Series hpijs"
+ Attribute "NickName" "" "HP Photosmart b010 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart b010 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart b010 series;DES:photosmart b010 series;"
+ PCFileName "hp-photosmart_b010_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart All-in-one Printer - b010)"
+ }
+ {
+ ModelName "HP Photosmart b109a Series hpijs"
+ Attribute "NickName" "" "HP Photosmart b109a Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP PS b109a Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart b109a series;DES:photosmart b109a series;"
+ PCFileName "hp-photosmart_b109a_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart All-in-one Printer - b109a)"
+ Attribute "Product" "" "(HP Photosmart All-in-one Printer - b109c)"
+ Attribute "Product" "" "(HP Photosmart All-in-one Printer - b109d)"
+ Attribute "Product" "" "(HP Photosmart All-in-one Printer - b109e)"
+ }
+ {
+ ModelName "HP Photosmart Wireless b109n-z hpijs"
+ Attribute "NickName" "" "HP Photosmart Wireless b109n-z hpijs, $Version"
+ Attribute "ShortNickName" "" "HP PS Wireless b109n-z hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart wireless b109n-z;DES:photosmart wireless b109n-z;"
+ PCFileName "hp-photosmart_wireless_b109n-z-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart Wireless All-in-one Printer - b109n)"
+ Attribute "Product" "" "(HP Photosmart Wireless All-in-one Printer - b109q)"
+ Attribute "Product" "" "(HP Photosmart Wireless All-in-one Printer - b109q=r)"
+ }
+ {
+ ModelName "HP Photosmart b109a-m hpijs"
+ Attribute "NickName" "" "HP Photosmart b109a-m hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart b109a-m hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart b109a-m;DES:photosmart b109a-m;"
+ PCFileName "hp-photosmart_b109a-m-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart All-in-one Printer - b109a)"
+ Attribute "Product" "" "(HP Photosmart All-in-one Printer - b109c)"
+ Attribute "Product" "" "(HP Photosmart All-in-one Printer - b109d)"
+ Attribute "Product" "" "(HP Photosmart All-in-one Printer - b109e)"
+ }
+ {
+ ModelName "HP Photosmart b110 Series hpijs"
+ Attribute "NickName" "" "HP Photosmart b110 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart b110 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart b110 series;DES:photosmart b110 series;"
+ PCFileName "hp-photosmart_b110_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart Wireless All-in-one Printer - b110)"
+ }
+ {
+ ModelName "HP Photosmart Plus b209a-m hpijs"
+ Attribute "NickName" "" "HP Photosmart Plus b209a-m hpijs, $Version"
+ Attribute "ShortNickName" "" "HP PS Plus b209a-m hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart plus b209a-m;DES:photosmart plus b209a-m;"
+ PCFileName "hp-photosmart_plus_b209a-m-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart Plus All-in-one Printer - b209a)"
+ Attribute "Product" "" "(HP Photosmart Plus All-in-one Printer - b209b)"
+ Attribute "Product" "" "(HP Photosmart Plus All-in-one Printer - b209c)"
+ }
+ {
+ ModelName "HP Photosmart Plus b210 Series hpijs"
+ Attribute "NickName" "" "HP Photosmart Plus b210 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP PS Plus b210 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart plus b210 series;DES:photosmart plus b210 series;"
+ PCFileName "hp-photosmart_plus_b210_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart Plus b210 Series)"
+ }
+} // end Stabler
+
+////////// StingrayOJ
+{
+ Attribute "DefaultResolution" "" "1200dpi"
+
+ // Custom page sizes from 1x4in to Legal
+ HWMargins 18 36 18 9
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 8.5in 14in
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-DeskJet_5550 hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-DeskJet_5550" " -sDeviceManufacture&&
+r=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;deskjet 5550&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=300FastDraftCol&&
+orCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft.Gray" "Quality=300FastDra&&
+ftGrayscaleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=300ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal.Gray" "Quality=300Graysc&&
+aleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High" "Quality=600ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High.Gray" "Quality=600Grayscal&&
+eK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Photo" "Quality=1200PhotoCMYKFu&&
+llBleed"
+ Attribute "FoomaticRIPOption" "InputSlot" "enum CmdLine C"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Default" ",PS:MediaPosition=7"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=PhotoTray" ",PS:MediaPosition=6"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Upper" ",PS:MediaPosition=1"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Lower" ",PS:MediaPosition=4"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=CDDVDTray" ",PS:MediaPosition=14"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Envelope" ",PS:MediaPosition=3"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=LargeCapacity" ",PS:MediaPosition=&&
+5"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Manual" ",PS:MediaPosition=2"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=MPTray" ",PS:MediaPosition=8"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=PhotoTearOff" " -dDEVICEWIDTHPOINTS&&
+=288 -dDEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6TearOff" " -dDEVICEWIDTHPOINTS=29&&
+7 -dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD120" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ Attribute "FoomaticRIPOption" "Duplex" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexNoTumble" " -dDuplex=true -dTum&&
+ble=false"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexTumble" " -dDuplex=true -dTumbl&&
+e=true"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=None" " -dDuplex=false"
+ Attribute "FoomaticRIPOption" "DryTime" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Zero" ""
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Five" ",DryTime=5"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Ten" ",DryTime=10"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Fifteen" ",DryTime=15"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Twenty" ",DryTime=20"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=TwentyFive" ",DryTime=25"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Thirty" ",DryTime=30"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYK" " -r300 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYKFullBleed" " -r300 -sIjs&&
+Params=Quality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:FullBleed=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftColorCMYK" " -r300 -sIjsPara&&
+ms=Quality:Quality=1,Quality:ColorMode=2,Quality:MediaType=0,Quality:P&&
+enSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftGrayscaleK" " -r300 -sIjs&&
+Params=Quality:Quality=1,Quality:ColorMode=0,Quality:MediaType=0,Quali&&
+ty:PenSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300FastDraftColorCMYK" " -r300 -sIjs&&
+Params=Quality:Quality=4,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:SpeedMech=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300FastDraftGrayscaleK" " -r300 -&&
+sIjsParams=Quality:Quality=4,Quality:ColorMode=0,Quality:MediaType=0,Q&&
+uality:PenSet=2,Quality:SpeedMech=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300GrayscaleK" " -r300 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMYK" " -r600 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMYKFullBleed" " -r600 -sIjs&&
+Params=Quality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:FullBleed=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600GrayscaleK" " -r600 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=1200PhotoCMYK" " -r1200 -sIjsParams=&&
+Quality:Quality=3,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenS&&
+et=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=1200PhotoCMYKFullBleed" " -r1200 -sI&&
+jsParams=Quality:Quality=3,Quality:ColorMode=2,Quality:MediaType=2,Qua&&
+lity:PenSet=2,Quality:FullBleed=1"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ Choice "Draft.Gray/Draft Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft.Gray"
+ *Choice "Normal/Normal (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "Normal.Gray/Normal Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal.Gray"
+ Choice "High/High Quality (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=High"
+ Choice "High.Gray/High Quality Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=High.Gray"
+ Choice "Photo/Photo (on photo paper)" "%% FoomaticRIPOptionSetting: PrintoutMode=Photo"
+ Option "InputSlot/Media Source" PickOne AnySetup 100.0
+ *Choice "Default/Printer default" "%% FoomaticRIPOptionSetting: InputSlot=Default"
+ Choice "PhotoTray/Photo Tray" "%% FoomaticRIPOptionSetting: InputSlot=PhotoTray"
+ Choice "Upper/Upper Tray" "%% FoomaticRIPOptionSetting: InputSlot=Upper"
+ Choice "Lower/Lower Tray" "%% FoomaticRIPOptionSetting: InputSlot=Lower"
+ Choice "CDDVDTray/CD or DVD Tray" "%% FoomaticRIPOptionSetting: InputSlot=CDDVDTray"
+ Choice "Envelope/Envelope Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Envelope"
+ Choice "LargeCapacity/Large Capacity Tray" "%% FoomaticRIPOptionSetting: InputSlot=LargeCapacity"
+ Choice "Manual/Manual Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Manual"
+ Choice "MPTray/Multi Purpose Tray" "%% FoomaticRIPOptionSetting: InputSlot=MPTray"
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 120.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "%% FoomaticRIPOptionSetting: Duplex=DuplexNoTumble"
+ Choice "DuplexTumble/Short Edge (Flip)" "%% FoomaticRIPOptionSetting: Duplex=DuplexTumble"
+ *Choice "None/Off" "%% FoomaticRIPOptionSetting: Duplex=None"
+ Option "DryTime/Additional Dry Time" PickOne AnySetup 120.0
+ *Choice "Zero/Printer Default" "%% FoomaticRIPOptionSetting: DryTime=Zero"
+ Choice "Five/5 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Five"
+ Choice "Ten/10 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Ten"
+ Choice "Fifteen/15 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Fifteen"
+ Choice "Twenty/20 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Twenty"
+ Choice "TwentyFive/25 Seconds" "%% FoomaticRIPOptionSetting: DryTime=TwentyFive"
+ Choice "Thirty/30 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Thirty"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "300ColorCMYK/300 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYK"
+ Choice "300ColorCMYKFullBleed/300 dpi, Color, Full Bleed, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYKFullBleed"
+ Choice "300DraftColorCMYK/300 dpi, Draft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftColorCMYK"
+ Choice "300DraftGrayscaleK/300 dpi, Draft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftGrayscaleK"
+ Choice "300FastDraftColorCMYK/300 dpi, FastDraft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300FastDraftColorCMYK"
+ Choice "300FastDraftGrayscaleK/300 dpi, FastDraft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300FastDraftGrayscaleK"
+ Choice "300GrayscaleK/300 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300GrayscaleK"
+ Choice "600ColorCMYK/600 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMYK"
+ Choice "600ColorCMYKFullBleed/600 dpi, Color, Full Bleed, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMYKFullBleed"
+ Choice "600GrayscaleK/600 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=600GrayscaleK"
+ Choice "1200PhotoCMYK/1200 dpi, Photo, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=1200PhotoCMYK"
+ Choice "1200PhotoCMYKFullBleed/1200 dpi, Photo, Full Bleed, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=1200PhotoCMYKFullBleed"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 9.72 36.00 9.72 9.00 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo or 5x7 inch index card" 360.00 504.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "PhotoTearOff/Photo with tear-off tab" 288.00 432.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff" "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "A6TearOff/A6 with tear-off tab" 297.00 420.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=A6TearOff" "%% FoomaticRIPOptionSetting: PageSize=A6TearOff"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "CDDVD120/CD or DVD 120 mm" 360.00 360.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD120" "%% FoomaticRIPOptionSetting: PageSize=CDDVD120"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+ // <%StingrayOJ:Normal%>
+ {
+ ModelName "HP Officejet 100 Mobile l411 hpijs"
+ Attribute "NickName" "" "HP Officejet 100 Mobile l411 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP OJ 100 Mobile l411 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet 100 mobile l411;DES:officejet 100 mobile l411;"
+ PCFileName "hp-officejet_100_mobile_l411-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet 100 Mobile l411)"
+ }
+} // end StingrayOJ
+
+////////// Copperhead
+{
+ Attribute "DefaultResolution" "" "1200dpi"
+
+ // Custom page sizes from 1x4in to Legal
+ HWMargins 18 36 18 9
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 8.5in 14in
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-DeskJet_5550 hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-DeskJet_5550" " -sDeviceManufacture&&
+r=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;deskjet 5550&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=300FastDraftCol&&
+orCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft.Gray" "Quality=300FastDra&&
+ftGrayscaleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=300ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal.Gray" "Quality=300Graysc&&
+aleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High" "Quality=600ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High.Gray" "Quality=600Grayscal&&
+eK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Photo" "Quality=1200PhotoCMYKFu&&
+llBleed"
+ Attribute "FoomaticRIPOption" "InputSlot" "enum CmdLine C"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Default" ",PS:MediaPosition=7"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=PhotoTray" ",PS:MediaPosition=6"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Upper" ",PS:MediaPosition=1"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Lower" ",PS:MediaPosition=4"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=CDDVDTray" ",PS:MediaPosition=14"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Envelope" ",PS:MediaPosition=3"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=LargeCapacity" ",PS:MediaPosition=&&
+5"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Manual" ",PS:MediaPosition=2"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=MPTray" ",PS:MediaPosition=8"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=PhotoTearOff" " -dDEVICEWIDTHPOINTS&&
+=288 -dDEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6TearOff" " -dDEVICEWIDTHPOINTS=29&&
+7 -dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD120" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ Attribute "FoomaticRIPOption" "Duplex" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexNoTumble" " -dDuplex=true -dTum&&
+ble=false"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexTumble" " -dDuplex=true -dTumbl&&
+e=true"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=None" " -dDuplex=false"
+ Attribute "FoomaticRIPOption" "DryTime" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Zero" ""
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Five" ",DryTime=5"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Ten" ",DryTime=10"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Fifteen" ",DryTime=15"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Twenty" ",DryTime=20"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=TwentyFive" ",DryTime=25"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Thirty" ",DryTime=30"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYK" " -r300 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYKFullBleed" " -r300 -sIjs&&
+Params=Quality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:FullBleed=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftColorCMYK" " -r300 -sIjsPara&&
+ms=Quality:Quality=1,Quality:ColorMode=2,Quality:MediaType=0,Quality:P&&
+enSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftGrayscaleK" " -r300 -sIjs&&
+Params=Quality:Quality=1,Quality:ColorMode=0,Quality:MediaType=0,Quali&&
+ty:PenSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300FastDraftColorCMYK" " -r300 -sIjs&&
+Params=Quality:Quality=4,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:SpeedMech=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300FastDraftGrayscaleK" " -r300 -&&
+sIjsParams=Quality:Quality=4,Quality:ColorMode=0,Quality:MediaType=0,Q&&
+uality:PenSet=2,Quality:SpeedMech=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300GrayscaleK" " -r300 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMYK" " -r600 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMYKFullBleed" " -r600 -sIjs&&
+Params=Quality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:FullBleed=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600GrayscaleK" " -r600 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=1200PhotoCMYK" " -r1200 -sIjsParams=&&
+Quality:Quality=3,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenS&&
+et=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=1200PhotoCMYKFullBleed" " -r1200 -sI&&
+jsParams=Quality:Quality=3,Quality:ColorMode=2,Quality:MediaType=2,Qua&&
+lity:PenSet=2,Quality:FullBleed=1"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ Choice "Draft.Gray/Draft Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft.Gray"
+ *Choice "Normal/Normal (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "Normal.Gray/Normal Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal.Gray"
+ Choice "High/High Quality (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=High"
+ Choice "High.Gray/High Quality Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=High.Gray"
+ Choice "Photo/Photo (on photo paper)" "%% FoomaticRIPOptionSetting: PrintoutMode=Photo"
+ Option "InputSlot/Media Source" PickOne AnySetup 100.0
+ *Choice "Default/Printer default" "%% FoomaticRIPOptionSetting: InputSlot=Default"
+ Choice "PhotoTray/Photo Tray" "%% FoomaticRIPOptionSetting: InputSlot=PhotoTray"
+ Choice "Upper/Upper Tray" "%% FoomaticRIPOptionSetting: InputSlot=Upper"
+ Choice "Lower/Lower Tray" "%% FoomaticRIPOptionSetting: InputSlot=Lower"
+ Choice "CDDVDTray/CD or DVD Tray" "%% FoomaticRIPOptionSetting: InputSlot=CDDVDTray"
+ Choice "Envelope/Envelope Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Envelope"
+ Choice "LargeCapacity/Large Capacity Tray" "%% FoomaticRIPOptionSetting: InputSlot=LargeCapacity"
+ Choice "Manual/Manual Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Manual"
+ Choice "MPTray/Multi Purpose Tray" "%% FoomaticRIPOptionSetting: InputSlot=MPTray"
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 120.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "%% FoomaticRIPOptionSetting: Duplex=DuplexNoTumble"
+ Choice "DuplexTumble/Short Edge (Flip)" "%% FoomaticRIPOptionSetting: Duplex=DuplexTumble"
+ *Choice "None/Off" "%% FoomaticRIPOptionSetting: Duplex=None"
+ Option "DryTime/Additional Dry Time" PickOne AnySetup 120.0
+ *Choice "Zero/Printer Default" "%% FoomaticRIPOptionSetting: DryTime=Zero"
+ Choice "Five/5 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Five"
+ Choice "Ten/10 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Ten"
+ Choice "Fifteen/15 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Fifteen"
+ Choice "Twenty/20 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Twenty"
+ Choice "TwentyFive/25 Seconds" "%% FoomaticRIPOptionSetting: DryTime=TwentyFive"
+ Choice "Thirty/30 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Thirty"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "300ColorCMYK/300 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYK"
+ Choice "300ColorCMYKFullBleed/300 dpi, Color, Full Bleed, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYKFullBleed"
+ Choice "300DraftColorCMYK/300 dpi, Draft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftColorCMYK"
+ Choice "300DraftGrayscaleK/300 dpi, Draft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftGrayscaleK"
+ Choice "300FastDraftColorCMYK/300 dpi, FastDraft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300FastDraftColorCMYK"
+ Choice "300FastDraftGrayscaleK/300 dpi, FastDraft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300FastDraftGrayscaleK"
+ Choice "300GrayscaleK/300 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300GrayscaleK"
+ Choice "600ColorCMYK/600 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMYK"
+ Choice "600ColorCMYKFullBleed/600 dpi, Color, Full Bleed, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMYKFullBleed"
+ Choice "600GrayscaleK/600 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=600GrayscaleK"
+ Choice "1200PhotoCMYK/1200 dpi, Photo, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=1200PhotoCMYK"
+ Choice "1200PhotoCMYKFullBleed/1200 dpi, Photo, Full Bleed, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=1200PhotoCMYKFullBleed"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 9.72 36.00 9.72 9.00 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo or 5x7 inch index card" 360.00 504.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "PhotoTearOff/Photo with tear-off tab" 288.00 432.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff" "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "A6TearOff/A6 with tear-off tab" 297.00 420.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=A6TearOff" "%% FoomaticRIPOptionSetting: PageSize=A6TearOff"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "CDDVD120/CD or DVD 120 mm" 360.00 360.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD120" "%% FoomaticRIPOptionSetting: PageSize=CDDVD120"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+ // <%Copperhead:Normal%>
+ {
+ ModelName "HP Deskjet 3070 b611 Series hpijs"
+ Attribute "NickName" "" "HP Deskjet 3070 b611 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP DJ 3070 b611 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 3070 b611 series;DES:deskjet 3070 b611 series;"
+ PCFileName "hp-deskjet_3070_b611_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 3070 b611 Series)"
+ }
+ {
+ ModelName "HP Photosmart 5510 Series hpijs"
+ Attribute "NickName" "" "HP Photosmart 5510 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 5510 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 5510 series;DES:photosmart 5510 series;"
+ PCFileName "hp-photosmart_5510_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart 5510 E-all-in-one)"
+ }
+ // <%Copperhead:AutoDuplex%>
+ {
+ ModelName "HP Photosmart 5510d Series hpijs"
+ Attribute "NickName" "" "HP Photosmart 5510d Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP PS 5510d Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 5510d series;DES:photosmart 5510d series;"
+ PCFileName "hp-photosmart_5510d_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart 5510d E-all-in-one)"
+ }
+ {
+ ModelName "HP Photosmart 6510 Series hpijs"
+ Attribute "NickName" "" "HP Photosmart 6510 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 6510 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 6510 series;DES:photosmart 6510 series;"
+ PCFileName "hp-photosmart_6510_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart 6510 E-all-in-one)"
+ }
+} // end Copperhead
+
+
+////////// Saipan
+{
+ Attribute "DefaultResolution" "" "1200dpi"
+
+ // Custom page sizes from 1x4in to Legal
+ HWMargins 18 36 18 9
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 8.5in 14in
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-DeskJet_5550 hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-DeskJet_5550" " -sDeviceManufacture&&
+r=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;deskjet 5550&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=300FastDraftCol&&
+orCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft.Gray" "Quality=300FastDra&&
+ftGrayscaleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=300ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal.Gray" "Quality=300Graysc&&
+aleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High" "Quality=600ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High.Gray" "Quality=600Grayscal&&
+eK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Photo" "Quality=1200PhotoCMYKFu&&
+llBleed"
+ Attribute "FoomaticRIPOption" "InputSlot" "enum CmdLine C"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Default" ",PS:MediaPosition=7"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=PhotoTray" ",PS:MediaPosition=6"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Upper" ",PS:MediaPosition=1"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Lower" ",PS:MediaPosition=4"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=CDDVDTray" ",PS:MediaPosition=14"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Envelope" ",PS:MediaPosition=3"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=LargeCapacity" ",PS:MediaPosition=&&
+5"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Manual" ",PS:MediaPosition=2"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=MPTray" ",PS:MediaPosition=8"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=PhotoTearOff" " -dDEVICEWIDTHPOINTS&&
+=288 -dDEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6TearOff" " -dDEVICEWIDTHPOINTS=29&&
+7 -dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD120" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ Attribute "FoomaticRIPOption" "Duplex" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexNoTumble" " -dDuplex=true -dTum&&
+ble=false"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexTumble" " -dDuplex=true -dTumbl&&
+e=true"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=None" " -dDuplex=false"
+ Attribute "FoomaticRIPOption" "DryTime" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Zero" ""
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Five" ",DryTime=5"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Ten" ",DryTime=10"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Fifteen" ",DryTime=15"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Twenty" ",DryTime=20"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=TwentyFive" ",DryTime=25"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Thirty" ",DryTime=30"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYK" " -r300 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYKFullBleed" " -r300 -sIjs&&
+Params=Quality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:FullBleed=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftColorCMYK" " -r300 -sIjsPara&&
+ms=Quality:Quality=1,Quality:ColorMode=2,Quality:MediaType=0,Quality:P&&
+enSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftGrayscaleK" " -r300 -sIjs&&
+Params=Quality:Quality=1,Quality:ColorMode=0,Quality:MediaType=0,Quali&&
+ty:PenSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300FastDraftColorCMYK" " -r300 -sIjs&&
+Params=Quality:Quality=4,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:SpeedMech=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300FastDraftGrayscaleK" " -r300 -&&
+sIjsParams=Quality:Quality=4,Quality:ColorMode=0,Quality:MediaType=0,Q&&
+uality:PenSet=2,Quality:SpeedMech=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300GrayscaleK" " -r300 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMYK" " -r600 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMYKFullBleed" " -r600 -sIjs&&
+Params=Quality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:FullBleed=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600GrayscaleK" " -r600 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=1200PhotoCMYK" " -r1200 -sIjsParams=&&
+Quality:Quality=3,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenS&&
+et=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=1200PhotoCMYKFullBleed" " -r1200 -sI&&
+jsParams=Quality:Quality=3,Quality:ColorMode=2,Quality:MediaType=2,Qua&&
+lity:PenSet=2,Quality:FullBleed=1"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ Choice "Draft.Gray/Draft Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft.Gray"
+ *Choice "Normal/Normal (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "Normal.Gray/Normal Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal.Gray"
+ Choice "High/High Quality (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=High"
+ Choice "High.Gray/High Quality Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=High.Gray"
+ Choice "Photo/Photo (on photo paper)" "%% FoomaticRIPOptionSetting: PrintoutMode=Photo"
+ Option "InputSlot/Media Source" PickOne AnySetup 100.0
+ *Choice "Default/Printer default" "%% FoomaticRIPOptionSetting: InputSlot=Default"
+ Choice "PhotoTray/Photo Tray" "%% FoomaticRIPOptionSetting: InputSlot=PhotoTray"
+ Choice "Upper/Upper Tray" "%% FoomaticRIPOptionSetting: InputSlot=Upper"
+ Choice "Lower/Lower Tray" "%% FoomaticRIPOptionSetting: InputSlot=Lower"
+ Choice "CDDVDTray/CD or DVD Tray" "%% FoomaticRIPOptionSetting: InputSlot=CDDVDTray"
+ Choice "Envelope/Envelope Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Envelope"
+ Choice "LargeCapacity/Large Capacity Tray" "%% FoomaticRIPOptionSetting: InputSlot=LargeCapacity"
+ Choice "Manual/Manual Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Manual"
+ Choice "MPTray/Multi Purpose Tray" "%% FoomaticRIPOptionSetting: InputSlot=MPTray"
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 120.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "%% FoomaticRIPOptionSetting: Duplex=DuplexNoTumble"
+ Choice "DuplexTumble/Short Edge (Flip)" "%% FoomaticRIPOptionSetting: Duplex=DuplexTumble"
+ *Choice "None/Off" "%% FoomaticRIPOptionSetting: Duplex=None"
+ Option "DryTime/Additional Dry Time" PickOne AnySetup 120.0
+ *Choice "Zero/Printer Default" "%% FoomaticRIPOptionSetting: DryTime=Zero"
+ Choice "Five/5 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Five"
+ Choice "Ten/10 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Ten"
+ Choice "Fifteen/15 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Fifteen"
+ Choice "Twenty/20 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Twenty"
+ Choice "TwentyFive/25 Seconds" "%% FoomaticRIPOptionSetting: DryTime=TwentyFive"
+ Choice "Thirty/30 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Thirty"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "300ColorCMYK/300 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYK"
+ Choice "300ColorCMYKFullBleed/300 dpi, Color, Full Bleed, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYKFullBleed"
+ Choice "300DraftColorCMYK/300 dpi, Draft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftColorCMYK"
+ Choice "300DraftGrayscaleK/300 dpi, Draft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftGrayscaleK"
+ Choice "300FastDraftColorCMYK/300 dpi, FastDraft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300FastDraftColorCMYK"
+ Choice "300FastDraftGrayscaleK/300 dpi, FastDraft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300FastDraftGrayscaleK"
+ Choice "300GrayscaleK/300 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300GrayscaleK"
+ Choice "600ColorCMYK/600 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMYK"
+ Choice "600ColorCMYKFullBleed/600 dpi, Color, Full Bleed, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMYKFullBleed"
+ Choice "600GrayscaleK/600 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=600GrayscaleK"
+ Choice "1200PhotoCMYK/1200 dpi, Photo, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=1200PhotoCMYK"
+ Choice "1200PhotoCMYKFullBleed/1200 dpi, Photo, Full Bleed, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=1200PhotoCMYKFullBleed"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 9.72 36.00 9.72 9.00 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo or 5x7 inch index card" 360.00 504.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "PhotoTearOff/Photo with tear-off tab" 288.00 432.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff" "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "A6TearOff/A6 with tear-off tab" 297.00 420.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=A6TearOff" "%% FoomaticRIPOptionSetting: PageSize=A6TearOff"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "CDDVD120/CD or DVD 120 mm" 360.00 360.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD120" "%% FoomaticRIPOptionSetting: PageSize=CDDVD120"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+ // <%Saipan:Normal%>
+ {
+ ModelName "HP Officejet 6100 hpijs"
+ Attribute "NickName" "" "HP Officejet 6100 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet 6100 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet 6100;DES:officejet 6100;"
+ PCFileName "hp-officejet_6100-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet 6100 Eprinter h611a)"
+ }
+ {
+ ModelName "HP Officejet 6600 hpijs"
+ Attribute "NickName" "" "HP Officejet 6600 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet 6600 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet 6600;DES:officejet 6600;"
+ PCFileName "hp-officejet_6600-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet 6600 E-all-in-one Printer - h711a)"
+ }
+ // <%Saipan:AutoDuplex%>
+ {
+ ModelName "HP Officejet 6700 hpijs"
+ Attribute "NickName" "" "HP Officejet 6700 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet 6700 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet 6700;DES:officejet 6700;"
+ PCFileName "hp-officejet_6700-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet 6700 E-all-in-one Printer - h711n)"
+ }
+} // end Saipan
+
+////////// Python11
+{
+ Attribute "DefaultResolution" "" "1200dpi"
+
+ // Custom page sizes from 1x4in to Legal
+ HWMargins 18 36 18 9
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 8.5in 14in
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-DeskJet_5550 hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-DeskJet_5550" " -sDeviceManufacture&&
+r=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;deskjet 5550&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=300FastDraftCol&&
+orCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft.Gray" "Quality=300FastDra&&
+ftGrayscaleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=300ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal.Gray" "Quality=300Graysc&&
+aleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High" "Quality=600ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High.Gray" "Quality=600Grayscal&&
+eK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Photo" "Quality=1200PhotoCMYKFu&&
+llBleed"
+ Attribute "FoomaticRIPOption" "InputSlot" "enum CmdLine C"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Default" ",PS:MediaPosition=7"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=PhotoTray" ",PS:MediaPosition=6"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Upper" ",PS:MediaPosition=1"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Lower" ",PS:MediaPosition=4"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=CDDVDTray" ",PS:MediaPosition=14"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Envelope" ",PS:MediaPosition=3"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=LargeCapacity" ",PS:MediaPosition=&&
+5"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Manual" ",PS:MediaPosition=2"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=MPTray" ",PS:MediaPosition=8"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=PhotoTearOff" " -dDEVICEWIDTHPOINTS&&
+=288 -dDEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6TearOff" " -dDEVICEWIDTHPOINTS=29&&
+7 -dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD120" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ Attribute "FoomaticRIPOption" "Duplex" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexNoTumble" " -dDuplex=true -dTum&&
+ble=false"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexTumble" " -dDuplex=true -dTumbl&&
+e=true"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=None" " -dDuplex=false"
+ Attribute "FoomaticRIPOption" "DryTime" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Zero" ""
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Five" ",DryTime=5"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Ten" ",DryTime=10"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Fifteen" ",DryTime=15"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Twenty" ",DryTime=20"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=TwentyFive" ",DryTime=25"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Thirty" ",DryTime=30"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYK" " -r300 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYKFullBleed" " -r300 -sIjs&&
+Params=Quality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:FullBleed=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftColorCMYK" " -r300 -sIjsPara&&
+ms=Quality:Quality=1,Quality:ColorMode=2,Quality:MediaType=0,Quality:P&&
+enSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftGrayscaleK" " -r300 -sIjs&&
+Params=Quality:Quality=1,Quality:ColorMode=0,Quality:MediaType=0,Quali&&
+ty:PenSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300FastDraftColorCMYK" " -r300 -sIjs&&
+Params=Quality:Quality=4,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:SpeedMech=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300FastDraftGrayscaleK" " -r300 -&&
+sIjsParams=Quality:Quality=4,Quality:ColorMode=0,Quality:MediaType=0,Q&&
+uality:PenSet=2,Quality:SpeedMech=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300GrayscaleK" " -r300 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMYK" " -r600 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMYKFullBleed" " -r600 -sIjs&&
+Params=Quality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:FullBleed=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600GrayscaleK" " -r600 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=1200PhotoCMYK" " -r1200 -sIjsParams=&&
+Quality:Quality=3,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenS&&
+et=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=1200PhotoCMYKFullBleed" " -r1200 -sI&&
+jsParams=Quality:Quality=3,Quality:ColorMode=2,Quality:MediaType=2,Qua&&
+lity:PenSet=2,Quality:FullBleed=1"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ Choice "Draft.Gray/Draft Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft.Gray"
+ *Choice "Normal/Normal (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "Normal.Gray/Normal Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal.Gray"
+ Choice "High/High Quality (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=High"
+ Choice "High.Gray/High Quality Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=High.Gray"
+ Choice "Photo/Photo (on photo paper)" "%% FoomaticRIPOptionSetting: PrintoutMode=Photo"
+ Option "InputSlot/Media Source" PickOne AnySetup 100.0
+ *Choice "Default/Printer default" "%% FoomaticRIPOptionSetting: InputSlot=Default"
+ Choice "PhotoTray/Photo Tray" "%% FoomaticRIPOptionSetting: InputSlot=PhotoTray"
+ Choice "Upper/Upper Tray" "%% FoomaticRIPOptionSetting: InputSlot=Upper"
+ Choice "Lower/Lower Tray" "%% FoomaticRIPOptionSetting: InputSlot=Lower"
+ Choice "CDDVDTray/CD or DVD Tray" "%% FoomaticRIPOptionSetting: InputSlot=CDDVDTray"
+ Choice "Envelope/Envelope Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Envelope"
+ Choice "LargeCapacity/Large Capacity Tray" "%% FoomaticRIPOptionSetting: InputSlot=LargeCapacity"
+ Choice "Manual/Manual Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Manual"
+ Choice "MPTray/Multi Purpose Tray" "%% FoomaticRIPOptionSetting: InputSlot=MPTray"
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 120.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "%% FoomaticRIPOptionSetting: Duplex=DuplexNoTumble"
+ Choice "DuplexTumble/Short Edge (Flip)" "%% FoomaticRIPOptionSetting: Duplex=DuplexTumble"
+ *Choice "None/Off" "%% FoomaticRIPOptionSetting: Duplex=None"
+ Option "DryTime/Additional Dry Time" PickOne AnySetup 120.0
+ *Choice "Zero/Printer Default" "%% FoomaticRIPOptionSetting: DryTime=Zero"
+ Choice "Five/5 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Five"
+ Choice "Ten/10 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Ten"
+ Choice "Fifteen/15 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Fifteen"
+ Choice "Twenty/20 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Twenty"
+ Choice "TwentyFive/25 Seconds" "%% FoomaticRIPOptionSetting: DryTime=TwentyFive"
+ Choice "Thirty/30 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Thirty"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "300ColorCMYK/300 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYK"
+ Choice "300ColorCMYKFullBleed/300 dpi, Color, Full Bleed, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYKFullBleed"
+ Choice "300DraftColorCMYK/300 dpi, Draft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftColorCMYK"
+ Choice "300DraftGrayscaleK/300 dpi, Draft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftGrayscaleK"
+ Choice "300FastDraftColorCMYK/300 dpi, FastDraft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300FastDraftColorCMYK"
+ Choice "300FastDraftGrayscaleK/300 dpi, FastDraft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300FastDraftGrayscaleK"
+ Choice "300GrayscaleK/300 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300GrayscaleK"
+ Choice "600ColorCMYK/600 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMYK"
+ Choice "600ColorCMYKFullBleed/600 dpi, Color, Full Bleed, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMYKFullBleed"
+ Choice "600GrayscaleK/600 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=600GrayscaleK"
+ Choice "1200PhotoCMYK/1200 dpi, Photo, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=1200PhotoCMYK"
+ Choice "1200PhotoCMYKFullBleed/1200 dpi, Photo, Full Bleed, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=1200PhotoCMYKFullBleed"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 9.72 36.00 9.72 9.00 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo or 5x7 inch index card" 360.00 504.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "PhotoTearOff/Photo with tear-off tab" 288.00 432.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff" "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "A6TearOff/A6 with tear-off tab" 297.00 420.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=A6TearOff" "%% FoomaticRIPOptionSetting: PageSize=A6TearOff"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "CDDVD120/CD or DVD 120 mm" 360.00 360.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD120" "%% FoomaticRIPOptionSetting: PageSize=CDDVD120"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+ // <%Python11:Normal%>
+ {
+ ModelName "HP Photosmart 7510 Series hpijs"
+ Attribute "NickName" "" "HP Photosmart 7510 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart 7510 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart 7510 series;DES:photosmart 7510 series;"
+ PCFileName "hp-photosmart_7510_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart 7510 E-all-in-one)"
+ }
+} // end Python11
+
+
+/////////////// ViperPlusVIP
+{
+ Attribute "DefaultResolution" "" "600dpi"
+
+ // Custom page sizes from 1x4in to SuperB
+ HWMargins 18 36 18 9
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 936 1368
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-DeskJet_5650 hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-DeskJet_5650" " -sDeviceManufacture&&
+r=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;deskjet 5600&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=300FastDraftCol&&
+orCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft.Gray" "Quality=300FastDra&&
+ftGrayscaleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=300ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal.Gray" "Quality=300Graysc&&
+aleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High" "Quality=600ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High.Gray" "Quality=600Grayscal&&
+eK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Photo" "Quality=600PhotoCMYKFu&&
+llBleed"
+ Attribute "FoomaticRIPOption" "InputSlot" "enum CmdLine C"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Default" ",PS:MediaPosition=7"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=PhotoTray" ",PS:MediaPosition=6"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Upper" ",PS:MediaPosition=1"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Lower" ",PS:MediaPosition=4"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=CDDVDTray" ",PS:MediaPosition=14"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Envelope" ",PS:MediaPosition=3"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=LargeCapacity" ",PS:MediaPosition=&&
+5"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Manual" ",PS:MediaPosition=2"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=MPTray" ",PS:MediaPosition=8"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=PhotoTearOff" " -dDEVICEWIDTHPOINTS&&
+=288 -dDEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6TearOff" " -dDEVICEWIDTHPOINTS=29&&
+7 -dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD120" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ /////////// Large format paper support
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B4JIS" " -dDEVICEWIDTHPOINTS=729 -d&&
+DEVICEHEIGHTPOINTS=1033"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Ledger" " -dDEVICEWIDTHPOINTS=792 -&&
+dDEVICEHEIGHTPOINTS=1224"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=SuperB" " -dDEVICEWIDTHPOINTS=936 -&&
+dDEVICEHEIGHTPOINTS=1368"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w774h1116" " -dDEVICEWIDTHPOINTS=77&&
+4 -dDEVICEHEIGHTPOINTS=1116"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A3" " -dDEVICEWIDTHPOINTS=842 -dDEV&&
+ICEHEIGHTPOINTS=1190"
+ Attribute "FoomaticRIPOption" "Duplex" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexNoTumble" " -dDuplex=true -dTum&&
+ble=false"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexTumble" " -dDuplex=true -dTumbl&&
+e=true"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=None" " -dDuplex=false"
+ Attribute "FoomaticRIPOption" "DryTime" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Zero" ""
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Five" ",DryTime=5"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Ten" ",DryTime=10"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Fifteen" ",DryTime=15"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Twenty" ",DryTime=20"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=TwentyFive" ",DryTime=25"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Thirty" ",DryTime=30"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYK" " -r300 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYKFullBleed" " -r300 -sIjs&&
+Params=Quality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:FullBleed=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftColorCMYK" " -r300 -sIjsPara&&
+ms=Quality:Quality=1,Quality:ColorMode=2,Quality:MediaType=0,Quality:P&&
+enSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftGrayscaleK" " -r300 -sIjs&&
+Params=Quality:Quality=1,Quality:ColorMode=0,Quality:MediaType=0,Quali&&
+ty:PenSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300FastDraftColorCMYK" " -r300 -sIjs&&
+Params=Quality:Quality=4,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:SpeedMech=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300FastDraftGrayscaleK" " -r300 -&&
+sIjsParams=Quality:Quality=4,Quality:ColorMode=0,Quality:MediaType=0,Q&&
+uality:PenSet=2,Quality:SpeedMech=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300GrayscaleK" " -r300 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMYK" " -r600 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMYKFullBleed" " -r600 -sIjs&&
+Params=Quality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:FullBleed=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600GrayscaleK" " -r600 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600PhotoCMYK" " -r600 -sIjsParams=&&
+Quality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenS&&
+et=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600PhotoCMYKFullBleed" " -r600 -sI&&
+jsParams=Quality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Qua&&
+lity:PenSet=2,Quality:FullBleed=1"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ Choice "Draft.Gray/Draft Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft.Gray"
+ *Choice "Normal/Normal (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "Normal.Gray/Normal Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal.Gray"
+ Choice "High/High Quality (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=High"
+ Choice "High.Gray/High Quality Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=High.Gray"
+ Choice "Photo/Photo (on photo paper)" "%% FoomaticRIPOptionSetting: PrintoutMode=Photo"
+ Option "InputSlot/Media Source" PickOne AnySetup 100.0
+ *Choice "Default/Printer default" "%% FoomaticRIPOptionSetting: InputSlot=Default"
+ Choice "PhotoTray/Photo Tray" "%% FoomaticRIPOptionSetting: InputSlot=PhotoTray"
+ Choice "Upper/Upper Tray" "%% FoomaticRIPOptionSetting: InputSlot=Upper"
+ Choice "Lower/Lower Tray" "%% FoomaticRIPOptionSetting: InputSlot=Lower"
+ Choice "CDDVDTray/CD or DVD Tray" "%% FoomaticRIPOptionSetting: InputSlot=CDDVDTray"
+ Choice "Envelope/Envelope Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Envelope"
+ Choice "LargeCapacity/Large Capacity Tray" "%% FoomaticRIPOptionSetting: InputSlot=LargeCapacity"
+ Choice "Manual/Manual Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Manual"
+ Choice "MPTray/Multi Purpose Tray" "%% FoomaticRIPOptionSetting: InputSlot=MPTray"
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 120.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "%% FoomaticRIPOptionSetting: Duplex=DuplexNoTumble"
+ Choice "DuplexTumble/Short Edge (Flip)" "%% FoomaticRIPOptionSetting: Duplex=DuplexTumble"
+ *Choice "None/Off" "%% FoomaticRIPOptionSetting: Duplex=None"
+ Option "DryTime/Additional Dry Time" PickOne AnySetup 120.0
+ *Choice "Zero/Printer Default" "%% FoomaticRIPOptionSetting: DryTime=Zero"
+ Choice "Five/5 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Five"
+ Choice "Ten/10 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Ten"
+ Choice "Fifteen/15 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Fifteen"
+ Choice "Twenty/20 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Twenty"
+ Choice "TwentyFive/25 Seconds" "%% FoomaticRIPOptionSetting: DryTime=TwentyFive"
+ Choice "Thirty/30 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Thirty"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "300ColorCMYK/300 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYK"
+ Choice "300ColorCMYKFullBleed/300 dpi, Color, Full Bleed, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYKFullBleed"
+ Choice "300DraftColorCMYK/300 dpi, Draft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftColorCMYK"
+ Choice "300DraftGrayscaleK/300 dpi, Draft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftGrayscaleK"
+ Choice "300FastDraftColorCMYK/300 dpi, FastDraft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300FastDraftColorCMYK"
+ Choice "300FastDraftGrayscaleK/300 dpi, FastDraft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300FastDraftGrayscaleK"
+ Choice "300GrayscaleK/300 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300GrayscaleK"
+ Choice "600ColorCMYK/600 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMYK"
+ Choice "600ColorCMYKFullBleed/600 dpi, Color, Full Bleed, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMYKFullBleed"
+ Choice "600GrayscaleK/600 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=600GrayscaleK"
+ Choice "600PhotoCMYK/600 dpi, Photo, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=600PhotoCMYK"
+ Choice "600PhotoCMYKFullBleed/600 dpi, Photo, Full Bleed, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=600PhotoCMYKFullBleed"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 9.72 36.00 9.72 9.00 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo or 5x7 inch index card" 360.00 504.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "PhotoTearOff/Photo with tear-off tab" 288.00 432.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff" "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "A6TearOff/A6 with tear-off tab" 297.00 420.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=A6TearOff" "%% FoomaticRIPOptionSetting: PageSize=A6TearOff"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "CDDVD120/CD or DVD 120 mm" 360.00 360.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD120" "%% FoomaticRIPOptionSetting: PageSize=CDDVD120"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+ // <%ViperPlusVIP:Normal%>
+ {
+ ModelName "HP Photosmart d110 Series hpijs"
+ Attribute "NickName" "" "HP Photosmart d110 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Photosmart d110 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart d110 series;DES:photosmart d110 series;"
+ PCFileName "hp-photosmart_d110_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart d110 Series Printer)"
+ }
+ {
+ ModelName "HP Photosmart Ink Adv k510 hpijs"
+ Attribute "NickName" "" "HP Photosmart Ink Adv k510 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP PS Ink Adv k510 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart ink adv k510;DES:photosmart ink adv k510;"
+ PCFileName "hp-photosmart_ink_adv_k510-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart Ink Adv k510)"
+ }
+ {
+ ModelName "HP Officejet 4400 k410 hpijs"
+ Attribute "NickName" "" "HP Officejet 4400 k410 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet 4400 k410 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet 4400 k410;DES:officejet 4400 k410;"
+ PCFileName "hp-officejet_4400_k410-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet 4400 k410 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Deskjet f4400 Series hpijs"
+ Attribute "NickName" "" "HP Deskjet f4400 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet f4400 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet f4400 series;DES:deskjet f4400 series;"
+ PCFileName "hp-deskjet_f4400_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet f4440 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f4435 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f4450 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f4470 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f4472 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f4473 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f4480 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f4483 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f4488 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f4492 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Officejet 4500 g510a-f hpijs"
+ Attribute "NickName" "" "HP Officejet 4500 g510a-f hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet 4500 g510a-f hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet 4500 g510a-f;DES:officejet 4500 g510a-f;"
+ PCFileName "hp-officejet_4500_g510a-f-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet 4500 Desktop All-in-one Printer - g510a)"
+ Attribute "Product" "" "(HP Officejet 4500 All-in-one Desktop Printer - g510b)"
+ }
+ {
+ ModelName "HP Deskjet f4500 Series hpijs"
+ Attribute "NickName" "" "HP Deskjet f4500 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet f4500 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet f4500 series;DES:deskjet f4500 series;"
+ PCFileName "hp-deskjet_f4500_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet f4500 All-in-one Printer Series)"
+ }
+ {
+ ModelName "HP Officejet 4500 k710 hpijs"
+ Attribute "NickName" "" "HP Officejet 4500 k710 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet 4500 k710 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet 4500 k710;DES:officejet 4500 k710;"
+ PCFileName "hp-officejet_4500_k710-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet 4500 All-in-one Printer - k710)"
+ }
+ {
+ ModelName "HP Officejet 4500 g510g-m hpijs"
+ Attribute "NickName" "" "HP Officejet 4500 g510g-m hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet 4500 g510g-m hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet 4500 g510g-m;DES:officejet 4500 g510g-m;"
+ PCFileName "hp-officejet_4500_g510g-m-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet 4500 All-in-one Printer - g510g)"
+ Attribute "Product" "" "(HP Officejet 4500 All-in-one Printer - g510h)"
+ }
+ {
+ ModelName "HP Photosmart c4600 Series hpijs"
+ Attribute "NickName" "" "HP Photosmart c4600 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP PS c4600 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart c4600 series;DES:photosmart c4600 series;"
+ PCFileName "hp-photosmart_c4600_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart c4640 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4650 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4680 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4610 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4635 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4670 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4673 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4680 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4683 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4688 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Photosmart c4700 Series hpijs"
+ Attribute "NickName" "" "HP Photosmart c4700 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP PS c4700 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart c4700 series;DES:photosmart c4700 series;"
+ PCFileName "hp-photosmart_c4700_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart c4740 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4750 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4780 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4783 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4785 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4788 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4793 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4795 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4798 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c4799 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Deskjet d5500 Series hpijs"
+ Attribute "NickName" "" "HP Deskjet d5500 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet d5500 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet d5500 series;DES:deskjet d5500 series;"
+ PCFileName "hp-deskjet_d5500_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet d5545 Printer)"
+ Attribute "Product" "" "(HP Deskjet d5560 Printer)"
+ Attribute "Product" "" "(HP Deskjet d5563 Printer)"
+ Attribute "Product" "" "(HP Deskjet d5568 Printer)"
+ }
+ // <%ViperPlusVIP:Trim%>
+ {
+ ModelName "HP Officejet 4500 g510n-z hpijs"
+ Attribute "NickName" "" "HP Officejet 4500 g510n-z hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet 4500 g510n-z hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet 4500 g510n-z;DES:officejet 4500 g510n-z;"
+ PCFileName "hp-officejet_4500_g510n-z-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet 4500 g510n-z All-in-one Printer)"
+ }
+ // <%Mimas:NoCDDVD%>
+ {
+ ModelName "HP Envy 100 d410 Series hpijs"
+ Attribute "NickName" "" "HP Envy 100 d410 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Envy 100 d410 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:envy 100 d410 series;DES:envy 100 d410 series;"
+ PCFileName "hp-envy_100_d410_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Envy 100 d410 Series)"
+ }
+ {
+ ModelName "HP Envy 110 Series hpijs"
+ Attribute "NickName" "" "HP Envy 110 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Envy 110 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:envy 110 series;DES:envy 110 series;"
+ PCFileName "hp-envy_110_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Envy 110 E-all-in-one)"
+ }
+} // end ViperPlusVIP
+
+/////////////// ViperMinusVIP
+{
+ Attribute "DefaultResolution" "" "600dpi"
+
+ // Custom page sizes from 1x4in to SuperB
+ HWMargins 18 36 18 9
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 936 1368
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-DeskJet_5650 hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-DeskJet_5650" " -sDeviceManufacture&&
+r=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;deskjet 5600&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=300FastDraftCol&&
+orCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft.Gray" "Quality=300FastDra&&
+ftGrayscaleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=300ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal.Gray" "Quality=300Graysc&&
+aleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High" "Quality=600ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High.Gray" "Quality=600Grayscal&&
+eK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Photo" "Quality=600PhotoCMYKFu&&
+llBleed"
+ Attribute "FoomaticRIPOption" "InputSlot" "enum CmdLine C"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Default" ",PS:MediaPosition=7"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=PhotoTray" ",PS:MediaPosition=6"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Upper" ",PS:MediaPosition=1"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Lower" ",PS:MediaPosition=4"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=CDDVDTray" ",PS:MediaPosition=14"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Envelope" ",PS:MediaPosition=3"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=LargeCapacity" ",PS:MediaPosition=&&
+5"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Manual" ",PS:MediaPosition=2"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=MPTray" ",PS:MediaPosition=8"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=PhotoTearOff" " -dDEVICEWIDTHPOINTS&&
+=288 -dDEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6TearOff" " -dDEVICEWIDTHPOINTS=29&&
+7 -dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD120" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ /////////// Large format paper support
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B4JIS" " -dDEVICEWIDTHPOINTS=729 -d&&
+DEVICEHEIGHTPOINTS=1033"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Ledger" " -dDEVICEWIDTHPOINTS=792 -&&
+dDEVICEHEIGHTPOINTS=1224"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=SuperB" " -dDEVICEWIDTHPOINTS=936 -&&
+dDEVICEHEIGHTPOINTS=1368"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w774h1116" " -dDEVICEWIDTHPOINTS=77&&
+4 -dDEVICEHEIGHTPOINTS=1116"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A3" " -dDEVICEWIDTHPOINTS=842 -dDEV&&
+ICEHEIGHTPOINTS=1190"
+ Attribute "FoomaticRIPOption" "Duplex" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexNoTumble" " -dDuplex=true -dTum&&
+ble=false"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexTumble" " -dDuplex=true -dTumbl&&
+e=true"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=None" " -dDuplex=false"
+ Attribute "FoomaticRIPOption" "DryTime" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Zero" ""
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Five" ",DryTime=5"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Ten" ",DryTime=10"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Fifteen" ",DryTime=15"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Twenty" ",DryTime=20"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=TwentyFive" ",DryTime=25"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Thirty" ",DryTime=30"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYK" " -r300 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYKFullBleed" " -r300 -sIjs&&
+Params=Quality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:FullBleed=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftColorCMYK" " -r300 -sIjsPara&&
+ms=Quality:Quality=1,Quality:ColorMode=2,Quality:MediaType=0,Quality:P&&
+enSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftGrayscaleK" " -r300 -sIjs&&
+Params=Quality:Quality=1,Quality:ColorMode=0,Quality:MediaType=0,Quali&&
+ty:PenSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300FastDraftColorCMYK" " -r300 -sIjs&&
+Params=Quality:Quality=4,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:SpeedMech=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300FastDraftGrayscaleK" " -r300 -&&
+sIjsParams=Quality:Quality=4,Quality:ColorMode=0,Quality:MediaType=0,Q&&
+uality:PenSet=2,Quality:SpeedMech=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300GrayscaleK" " -r300 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMYK" " -r600 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMYKFullBleed" " -r600 -sIjs&&
+Params=Quality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:FullBleed=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600GrayscaleK" " -r600 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600PhotoCMYK" " -r600 -sIjsParams=&&
+Quality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenS&&
+et=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600PhotoCMYKFullBleed" " -r600 -sI&&
+jsParams=Quality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Qua&&
+lity:PenSet=2,Quality:FullBleed=1"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ Choice "Draft.Gray/Draft Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft.Gray"
+ *Choice "Normal/Normal (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "Normal.Gray/Normal Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal.Gray"
+ Choice "High/High Quality (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=High"
+ Choice "High.Gray/High Quality Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=High.Gray"
+ Choice "Photo/Photo (on photo paper)" "%% FoomaticRIPOptionSetting: PrintoutMode=Photo"
+ Option "InputSlot/Media Source" PickOne AnySetup 100.0
+ *Choice "Default/Printer default" "%% FoomaticRIPOptionSetting: InputSlot=Default"
+ Choice "PhotoTray/Photo Tray" "%% FoomaticRIPOptionSetting: InputSlot=PhotoTray"
+ Choice "Upper/Upper Tray" "%% FoomaticRIPOptionSetting: InputSlot=Upper"
+ Choice "Lower/Lower Tray" "%% FoomaticRIPOptionSetting: InputSlot=Lower"
+ Choice "CDDVDTray/CD or DVD Tray" "%% FoomaticRIPOptionSetting: InputSlot=CDDVDTray"
+ Choice "Envelope/Envelope Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Envelope"
+ Choice "LargeCapacity/Large Capacity Tray" "%% FoomaticRIPOptionSetting: InputSlot=LargeCapacity"
+ Choice "Manual/Manual Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Manual"
+ Choice "MPTray/Multi Purpose Tray" "%% FoomaticRIPOptionSetting: InputSlot=MPTray"
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 120.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "%% FoomaticRIPOptionSetting: Duplex=DuplexNoTumble"
+ Choice "DuplexTumble/Short Edge (Flip)" "%% FoomaticRIPOptionSetting: Duplex=DuplexTumble"
+ *Choice "None/Off" "%% FoomaticRIPOptionSetting: Duplex=None"
+ Option "DryTime/Additional Dry Time" PickOne AnySetup 120.0
+ *Choice "Zero/Printer Default" "%% FoomaticRIPOptionSetting: DryTime=Zero"
+ Choice "Five/5 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Five"
+ Choice "Ten/10 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Ten"
+ Choice "Fifteen/15 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Fifteen"
+ Choice "Twenty/20 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Twenty"
+ Choice "TwentyFive/25 Seconds" "%% FoomaticRIPOptionSetting: DryTime=TwentyFive"
+ Choice "Thirty/30 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Thirty"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "300ColorCMYK/300 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYK"
+ Choice "300ColorCMYKFullBleed/300 dpi, Color, Full Bleed, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYKFullBleed"
+ Choice "300DraftColorCMYK/300 dpi, Draft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftColorCMYK"
+ Choice "300DraftGrayscaleK/300 dpi, Draft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftGrayscaleK"
+ Choice "300FastDraftColorCMYK/300 dpi, FastDraft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300FastDraftColorCMYK"
+ Choice "300FastDraftGrayscaleK/300 dpi, FastDraft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300FastDraftGrayscaleK"
+ Choice "300GrayscaleK/300 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300GrayscaleK"
+ Choice "600ColorCMYK/600 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMYK"
+ Choice "600ColorCMYKFullBleed/600 dpi, Color, Full Bleed, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMYKFullBleed"
+ Choice "600GrayscaleK/600 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=600GrayscaleK"
+ Choice "600PhotoCMYK/600 dpi, Photo, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=600PhotoCMYK"
+ Choice "600PhotoCMYKFullBleed/600 dpi, Photo, Full Bleed, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=600PhotoCMYKFullBleed"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 9.72 36.00 9.72 9.00 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo or 5x7 inch index card" 360.00 504.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "PhotoTearOff/Photo with tear-off tab" 288.00 432.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff" "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "A6TearOff/A6 with tear-off tab" 297.00 420.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=A6TearOff" "%% FoomaticRIPOptionSetting: PageSize=A6TearOff"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "CDDVD120/CD or DVD 120 mm" 360.00 360.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD120" "%% FoomaticRIPOptionSetting: PageSize=CDDVD120"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+ // <%ViperMinusVIP:Normal%>
+ {
+ ModelName "HP Deskjet f2400 Series hpijs"
+ Attribute "NickName" "" "HP Deskjet f2400 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet f2400 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet f2400 series;DES:deskjet f2400 series;"
+ PCFileName "hp-deskjet_f2400_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet f2410 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f2418 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f2420 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f2423 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f2430 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f2440 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f2476 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f2480 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f2483 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f2488 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f2492 All-in-one Printer)"
+ Attribute "Product" "" "(HP Deskjet f2493 All-in-one Printer)"
+ }
+} // end ViperMinusVIP
+
+/////////////// ViperPlusTrim
+{
+ Attribute "DefaultResolution" "" "600dpi"
+
+ // Custom page sizes from 1x4in to SuperB
+ HWMargins 18 36 18 9
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 936 1368
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-DeskJet_5650 hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-DeskJet_5650" " -sDeviceManufacture&&
+r=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;deskjet 5600&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=300FastDraftCol&&
+orCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft.Gray" "Quality=300FastDra&&
+ftGrayscaleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=300ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal.Gray" "Quality=300Graysc&&
+aleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High" "Quality=600ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High.Gray" "Quality=600Grayscal&&
+eK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Photo" "Quality=600PhotoCMYKFu&&
+llBleed"
+ Attribute "FoomaticRIPOption" "InputSlot" "enum CmdLine C"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Default" ",PS:MediaPosition=7"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=PhotoTray" ",PS:MediaPosition=6"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Upper" ",PS:MediaPosition=1"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Lower" ",PS:MediaPosition=4"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=CDDVDTray" ",PS:MediaPosition=14"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Envelope" ",PS:MediaPosition=3"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=LargeCapacity" ",PS:MediaPosition=&&
+5"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Manual" ",PS:MediaPosition=2"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=MPTray" ",PS:MediaPosition=8"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=PhotoTearOff" " -dDEVICEWIDTHPOINTS&&
+=288 -dDEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6TearOff" " -dDEVICEWIDTHPOINTS=29&&
+7 -dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD120" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ /////////// Large format paper support
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B4JIS" " -dDEVICEWIDTHPOINTS=729 -d&&
+DEVICEHEIGHTPOINTS=1033"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Ledger" " -dDEVICEWIDTHPOINTS=792 -&&
+dDEVICEHEIGHTPOINTS=1224"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=SuperB" " -dDEVICEWIDTHPOINTS=936 -&&
+dDEVICEHEIGHTPOINTS=1368"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w774h1116" " -dDEVICEWIDTHPOINTS=77&&
+4 -dDEVICEHEIGHTPOINTS=1116"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A3" " -dDEVICEWIDTHPOINTS=842 -dDEV&&
+ICEHEIGHTPOINTS=1190"
+ Attribute "FoomaticRIPOption" "Duplex" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexNoTumble" " -dDuplex=true -dTum&&
+ble=false"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexTumble" " -dDuplex=true -dTumbl&&
+e=true"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=None" " -dDuplex=false"
+ Attribute "FoomaticRIPOption" "DryTime" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Zero" ""
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Five" ",DryTime=5"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Ten" ",DryTime=10"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Fifteen" ",DryTime=15"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Twenty" ",DryTime=20"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=TwentyFive" ",DryTime=25"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Thirty" ",DryTime=30"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYK" " -r300 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYKFullBleed" " -r300 -sIjs&&
+Params=Quality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:FullBleed=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftColorCMYK" " -r300 -sIjsPara&&
+ms=Quality:Quality=1,Quality:ColorMode=2,Quality:MediaType=0,Quality:P&&
+enSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftGrayscaleK" " -r300 -sIjs&&
+Params=Quality:Quality=1,Quality:ColorMode=0,Quality:MediaType=0,Quali&&
+ty:PenSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300FastDraftColorCMYK" " -r300 -sIjs&&
+Params=Quality:Quality=4,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:SpeedMech=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300FastDraftGrayscaleK" " -r300 -&&
+sIjsParams=Quality:Quality=4,Quality:ColorMode=0,Quality:MediaType=0,Q&&
+uality:PenSet=2,Quality:SpeedMech=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300GrayscaleK" " -r300 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMYK" " -r600 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMYKFullBleed" " -r600 -sIjs&&
+Params=Quality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:FullBleed=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600GrayscaleK" " -r600 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600PhotoCMYK" " -r600 -sIjsParams=&&
+Quality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenS&&
+et=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600PhotoCMYKFullBleed" " -r600 -sI&&
+jsParams=Quality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Qua&&
+lity:PenSet=2,Quality:FullBleed=1"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ Choice "Draft.Gray/Draft Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft.Gray"
+ *Choice "Normal/Normal (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "Normal.Gray/Normal Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal.Gray"
+ Choice "High/High Quality (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=High"
+ Choice "High.Gray/High Quality Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=High.Gray"
+ Choice "Photo/Photo (on photo paper)" "%% FoomaticRIPOptionSetting: PrintoutMode=Photo"
+ Option "InputSlot/Media Source" PickOne AnySetup 100.0
+ *Choice "Default/Printer default" "%% FoomaticRIPOptionSetting: InputSlot=Default"
+ Choice "PhotoTray/Photo Tray" "%% FoomaticRIPOptionSetting: InputSlot=PhotoTray"
+ Choice "Upper/Upper Tray" "%% FoomaticRIPOptionSetting: InputSlot=Upper"
+ Choice "Lower/Lower Tray" "%% FoomaticRIPOptionSetting: InputSlot=Lower"
+ Choice "CDDVDTray/CD or DVD Tray" "%% FoomaticRIPOptionSetting: InputSlot=CDDVDTray"
+ Choice "Envelope/Envelope Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Envelope"
+ Choice "LargeCapacity/Large Capacity Tray" "%% FoomaticRIPOptionSetting: InputSlot=LargeCapacity"
+ Choice "Manual/Manual Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Manual"
+ Choice "MPTray/Multi Purpose Tray" "%% FoomaticRIPOptionSetting: InputSlot=MPTray"
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 120.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "%% FoomaticRIPOptionSetting: Duplex=DuplexNoTumble"
+ Choice "DuplexTumble/Short Edge (Flip)" "%% FoomaticRIPOptionSetting: Duplex=DuplexTumble"
+ *Choice "None/Off" "%% FoomaticRIPOptionSetting: Duplex=None"
+ Option "DryTime/Additional Dry Time" PickOne AnySetup 120.0
+ *Choice "Zero/Printer Default" "%% FoomaticRIPOptionSetting: DryTime=Zero"
+ Choice "Five/5 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Five"
+ Choice "Ten/10 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Ten"
+ Choice "Fifteen/15 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Fifteen"
+ Choice "Twenty/20 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Twenty"
+ Choice "TwentyFive/25 Seconds" "%% FoomaticRIPOptionSetting: DryTime=TwentyFive"
+ Choice "Thirty/30 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Thirty"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "300ColorCMYK/300 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYK"
+ Choice "300ColorCMYKFullBleed/300 dpi, Color, Full Bleed, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYKFullBleed"
+ Choice "300DraftColorCMYK/300 dpi, Draft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftColorCMYK"
+ Choice "300DraftGrayscaleK/300 dpi, Draft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftGrayscaleK"
+ Choice "300FastDraftColorCMYK/300 dpi, FastDraft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300FastDraftColorCMYK"
+ Choice "300FastDraftGrayscaleK/300 dpi, FastDraft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300FastDraftGrayscaleK"
+ Choice "300GrayscaleK/300 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300GrayscaleK"
+ Choice "600ColorCMYK/600 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMYK"
+ Choice "600ColorCMYKFullBleed/600 dpi, Color, Full Bleed, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMYKFullBleed"
+ Choice "600GrayscaleK/600 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=600GrayscaleK"
+ Choice "600PhotoCMYK/600 dpi, Photo, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=600PhotoCMYK"
+ Choice "600PhotoCMYKFullBleed/600 dpi, Photo, Full Bleed, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=600PhotoCMYKFullBleed"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 9.72 36.00 9.72 9.00 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo or 5x7 inch index card" 360.00 504.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "PhotoTearOff/Photo with tear-off tab" 288.00 432.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff" "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "A6TearOff/A6 with tear-off tab" 297.00 420.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=A6TearOff" "%% FoomaticRIPOptionSetting: PageSize=A6TearOff"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "CDDVD120/CD or DVD 120 mm" 360.00 360.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD120" "%% FoomaticRIPOptionSetting: PageSize=CDDVD120"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+ // <%ViperPlusTrim:Normal%>
+ {
+ ModelName "HP Deskjet Ink Advant k109a-z hpijs"
+ Attribute "NickName" "" "HP Deskjet Ink Advant k109a-z hpijs, $Version"
+ Attribute "ShortNickName" "" "HP DJ Ink Advant k109a-z hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet ink advant k109a-z;DES:deskjet ink advant k109a-z;"
+ PCFileName "hp-deskjet_ink_advant_k109a-z-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet Ink Advantage k109a Printer)"
+ }
+ {
+ ModelName "HP Deskjet d2600 Series hpijs"
+ Attribute "NickName" "" "HP Deskjet d2600 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet d2600 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet d2600 series;DES:deskjet d2600 series;"
+ PCFileName "hp-deskjet_d2600_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet d2660 Printer)"
+ Attribute "Product" "" "(HP Deskjet d2645 Printer)"
+ Attribute "Product" "" "(HP Deskjet d2663 Printer)"
+ Attribute "Product" "" "(HP Deskjet d2666 Printer)"
+ Attribute "Product" "" "(HP Deskjet d2668 Printer)"
+ Attribute "Product" "" "(HP Deskjet d2680 Printer)"
+ }
+ {
+ ModelName "HP Officejet 4000 k210 hpijs"
+ Attribute "NickName" "" "HP Officejet 4000 k210 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet 4000 k210 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet 4000 k210;DES:officejet 4000 k210;"
+ PCFileName "hp-officejet_4000_k210-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet 4000 k210 Printer)"
+ }
+} // end ViperPlusTrim
+
+/////////////// ViperMinusTrim
+{
+ Attribute "DefaultResolution" "" "600dpi"
+
+ // Custom page sizes from 1x4in to SuperB
+ HWMargins 18 36 18 9
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 936 1368
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-DeskJet_5650 hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-DeskJet_5650" " -sDeviceManufacture&&
+r=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;deskjet 5600&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=300FastDraftCol&&
+orCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft.Gray" "Quality=300FastDra&&
+ftGrayscaleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=300ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal.Gray" "Quality=300Graysc&&
+aleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High" "Quality=600ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High.Gray" "Quality=600Grayscal&&
+eK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Photo" "Quality=600PhotoCMYKFu&&
+llBleed"
+ Attribute "FoomaticRIPOption" "InputSlot" "enum CmdLine C"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Default" ",PS:MediaPosition=7"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=PhotoTray" ",PS:MediaPosition=6"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Upper" ",PS:MediaPosition=1"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Lower" ",PS:MediaPosition=4"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=CDDVDTray" ",PS:MediaPosition=14"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Envelope" ",PS:MediaPosition=3"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=LargeCapacity" ",PS:MediaPosition=&&
+5"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Manual" ",PS:MediaPosition=2"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=MPTray" ",PS:MediaPosition=8"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=PhotoTearOff" " -dDEVICEWIDTHPOINTS&&
+=288 -dDEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6TearOff" " -dDEVICEWIDTHPOINTS=29&&
+7 -dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD120" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ /////////// Large format paper support
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B4JIS" " -dDEVICEWIDTHPOINTS=729 -d&&
+DEVICEHEIGHTPOINTS=1033"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Ledger" " -dDEVICEWIDTHPOINTS=792 -&&
+dDEVICEHEIGHTPOINTS=1224"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=SuperB" " -dDEVICEWIDTHPOINTS=936 -&&
+dDEVICEHEIGHTPOINTS=1368"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w774h1116" " -dDEVICEWIDTHPOINTS=77&&
+4 -dDEVICEHEIGHTPOINTS=1116"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A3" " -dDEVICEWIDTHPOINTS=842 -dDEV&&
+ICEHEIGHTPOINTS=1190"
+ Attribute "FoomaticRIPOption" "Duplex" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexNoTumble" " -dDuplex=true -dTum&&
+ble=false"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexTumble" " -dDuplex=true -dTumbl&&
+e=true"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=None" " -dDuplex=false"
+ Attribute "FoomaticRIPOption" "DryTime" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Zero" ""
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Five" ",DryTime=5"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Ten" ",DryTime=10"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Fifteen" ",DryTime=15"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Twenty" ",DryTime=20"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=TwentyFive" ",DryTime=25"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Thirty" ",DryTime=30"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYK" " -r300 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYKFullBleed" " -r300 -sIjs&&
+Params=Quality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:FullBleed=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftColorCMYK" " -r300 -sIjsPara&&
+ms=Quality:Quality=1,Quality:ColorMode=2,Quality:MediaType=0,Quality:P&&
+enSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftGrayscaleK" " -r300 -sIjs&&
+Params=Quality:Quality=1,Quality:ColorMode=0,Quality:MediaType=0,Quali&&
+ty:PenSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300FastDraftColorCMYK" " -r300 -sIjs&&
+Params=Quality:Quality=4,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:SpeedMech=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300FastDraftGrayscaleK" " -r300 -&&
+sIjsParams=Quality:Quality=4,Quality:ColorMode=0,Quality:MediaType=0,Q&&
+uality:PenSet=2,Quality:SpeedMech=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300GrayscaleK" " -r300 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMYK" " -r600 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMYKFullBleed" " -r600 -sIjs&&
+Params=Quality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:FullBleed=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600GrayscaleK" " -r600 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600PhotoCMYK" " -r600 -sIjsParams=&&
+Quality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenS&&
+et=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600PhotoCMYKFullBleed" " -r600 -sI&&
+jsParams=Quality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Qua&&
+lity:PenSet=2,Quality:FullBleed=1"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ Choice "Draft.Gray/Draft Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft.Gray"
+ *Choice "Normal/Normal (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "Normal.Gray/Normal Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal.Gray"
+ Choice "High/High Quality (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=High"
+ Choice "High.Gray/High Quality Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=High.Gray"
+ Choice "Photo/Photo (on photo paper)" "%% FoomaticRIPOptionSetting: PrintoutMode=Photo"
+ Option "InputSlot/Media Source" PickOne AnySetup 100.0
+ *Choice "Default/Printer default" "%% FoomaticRIPOptionSetting: InputSlot=Default"
+ Choice "PhotoTray/Photo Tray" "%% FoomaticRIPOptionSetting: InputSlot=PhotoTray"
+ Choice "Upper/Upper Tray" "%% FoomaticRIPOptionSetting: InputSlot=Upper"
+ Choice "Lower/Lower Tray" "%% FoomaticRIPOptionSetting: InputSlot=Lower"
+ Choice "CDDVDTray/CD or DVD Tray" "%% FoomaticRIPOptionSetting: InputSlot=CDDVDTray"
+ Choice "Envelope/Envelope Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Envelope"
+ Choice "LargeCapacity/Large Capacity Tray" "%% FoomaticRIPOptionSetting: InputSlot=LargeCapacity"
+ Choice "Manual/Manual Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Manual"
+ Choice "MPTray/Multi Purpose Tray" "%% FoomaticRIPOptionSetting: InputSlot=MPTray"
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 120.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "%% FoomaticRIPOptionSetting: Duplex=DuplexNoTumble"
+ Choice "DuplexTumble/Short Edge (Flip)" "%% FoomaticRIPOptionSetting: Duplex=DuplexTumble"
+ *Choice "None/Off" "%% FoomaticRIPOptionSetting: Duplex=None"
+ Option "DryTime/Additional Dry Time" PickOne AnySetup 120.0
+ *Choice "Zero/Printer Default" "%% FoomaticRIPOptionSetting: DryTime=Zero"
+ Choice "Five/5 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Five"
+ Choice "Ten/10 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Ten"
+ Choice "Fifteen/15 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Fifteen"
+ Choice "Twenty/20 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Twenty"
+ Choice "TwentyFive/25 Seconds" "%% FoomaticRIPOptionSetting: DryTime=TwentyFive"
+ Choice "Thirty/30 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Thirty"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "300ColorCMYK/300 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYK"
+ Choice "300ColorCMYKFullBleed/300 dpi, Color, Full Bleed, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYKFullBleed"
+ Choice "300DraftColorCMYK/300 dpi, Draft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftColorCMYK"
+ Choice "300DraftGrayscaleK/300 dpi, Draft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftGrayscaleK"
+ Choice "300FastDraftColorCMYK/300 dpi, FastDraft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300FastDraftColorCMYK"
+ Choice "300FastDraftGrayscaleK/300 dpi, FastDraft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300FastDraftGrayscaleK"
+ Choice "300GrayscaleK/300 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300GrayscaleK"
+ Choice "600ColorCMYK/600 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMYK"
+ Choice "600ColorCMYKFullBleed/600 dpi, Color, Full Bleed, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMYKFullBleed"
+ Choice "600GrayscaleK/600 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=600GrayscaleK"
+ Choice "600PhotoCMYK/600 dpi, Photo, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=600PhotoCMYK"
+ Choice "600PhotoCMYKFullBleed/600 dpi, Photo, Full Bleed, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=600PhotoCMYKFullBleed"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 9.72 36.00 9.72 9.00 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo or 5x7 inch index card" 360.00 504.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "PhotoTearOff/Photo with tear-off tab" 288.00 432.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff" "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "A6TearOff/A6 with tear-off tab" 297.00 420.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=A6TearOff" "%% FoomaticRIPOptionSetting: PageSize=A6TearOff"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "CDDVD120/CD or DVD 120 mm" 360.00 360.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD120" "%% FoomaticRIPOptionSetting: PageSize=CDDVD120"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+ // <%ViperMinusTrim:Normal%>
+ {
+ ModelName "HP Deskjet d1600 Series hpijs"
+ Attribute "NickName" "" "HP Deskjet d1600 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Deskjet d1600 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet d1600 series;DES:deskjet d1600 series;"
+ PCFileName "hp-deskjet_d1600_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet d1620 Printer)"
+ Attribute "Product" "" "(HP Deskjet d1630 Printer)"
+ Attribute "Product" "" "(HP Deskjet d1650 Printer)"
+ Attribute "Product" "" "(HP Deskjet d1658 Printer)"
+ Attribute "Product" "" "(HP Deskjet d1660 Printer)"
+ Attribute "Product" "" "(HP Deskjet d1663 Printer)"
+ Attribute "Product" "" "(HP Deskjet d1668 Printer)"
+ }
+} // end ViperMinusTrim
+
+/////////////// Corbett
+{
+ Attribute "DefaultResolution" "" "600dpi"
+
+ // Custom page sizes from 1x4in to SuperB
+ HWMargins 18 36 18 9
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 936 1368
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-DeskJet_5650 hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-DeskJet_5650" " -sDeviceManufacture&&
+r=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;deskjet 5600&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=300FastDraftCol&&
+orCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft.Gray" "Quality=300FastDra&&
+ftGrayscaleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=300ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal.Gray" "Quality=300Graysc&&
+aleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High" "Quality=600ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High.Gray" "Quality=600Grayscal&&
+eK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Photo" "Quality=600PhotoCMYKFu&&
+llBleed"
+ Attribute "FoomaticRIPOption" "InputSlot" "enum CmdLine C"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Default" ",PS:MediaPosition=7"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=PhotoTray" ",PS:MediaPosition=6"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Upper" ",PS:MediaPosition=1"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Lower" ",PS:MediaPosition=4"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=CDDVDTray" ",PS:MediaPosition=14"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Envelope" ",PS:MediaPosition=3"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=LargeCapacity" ",PS:MediaPosition=&&
+5"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Manual" ",PS:MediaPosition=2"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=MPTray" ",PS:MediaPosition=8"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=PhotoTearOff" " -dDEVICEWIDTHPOINTS&&
+=288 -dDEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6TearOff" " -dDEVICEWIDTHPOINTS=29&&
+7 -dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD120" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ /////////// Large format paper support
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B4JIS" " -dDEVICEWIDTHPOINTS=729 -d&&
+DEVICEHEIGHTPOINTS=1033"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Ledger" " -dDEVICEWIDTHPOINTS=792 -&&
+dDEVICEHEIGHTPOINTS=1224"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=SuperB" " -dDEVICEWIDTHPOINTS=936 -&&
+dDEVICEHEIGHTPOINTS=1368"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w774h1116" " -dDEVICEWIDTHPOINTS=77&&
+4 -dDEVICEHEIGHTPOINTS=1116"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A3" " -dDEVICEWIDTHPOINTS=842 -dDEV&&
+ICEHEIGHTPOINTS=1190"
+ Attribute "FoomaticRIPOption" "Duplex" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexNoTumble" " -dDuplex=true -dTum&&
+ble=false"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexTumble" " -dDuplex=true -dTumbl&&
+e=true"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=None" " -dDuplex=false"
+ Attribute "FoomaticRIPOption" "DryTime" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Zero" ""
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Five" ",DryTime=5"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Ten" ",DryTime=10"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Fifteen" ",DryTime=15"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Twenty" ",DryTime=20"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=TwentyFive" ",DryTime=25"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Thirty" ",DryTime=30"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYK" " -r300 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYKFullBleed" " -r300 -sIjs&&
+Params=Quality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:FullBleed=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftColorCMYK" " -r300 -sIjsPara&&
+ms=Quality:Quality=1,Quality:ColorMode=2,Quality:MediaType=0,Quality:P&&
+enSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftGrayscaleK" " -r300 -sIjs&&
+Params=Quality:Quality=1,Quality:ColorMode=0,Quality:MediaType=0,Quali&&
+ty:PenSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300FastDraftColorCMYK" " -r300 -sIjs&&
+Params=Quality:Quality=4,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:SpeedMech=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300FastDraftGrayscaleK" " -r300 -&&
+sIjsParams=Quality:Quality=4,Quality:ColorMode=0,Quality:MediaType=0,Q&&
+uality:PenSet=2,Quality:SpeedMech=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300GrayscaleK" " -r300 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMYK" " -r600 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMYKFullBleed" " -r600 -sIjs&&
+Params=Quality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:FullBleed=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600GrayscaleK" " -r600 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600PhotoCMYK" " -r600 -sIjsParams=&&
+Quality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenS&&
+et=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600PhotoCMYKFullBleed" " -r600 -sI&&
+jsParams=Quality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Qua&&
+lity:PenSet=2,Quality:FullBleed=1"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ Choice "Draft.Gray/Draft Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft.Gray"
+ *Choice "Normal/Normal (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "Normal.Gray/Normal Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal.Gray"
+ Choice "High/High Quality (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=High"
+ Choice "High.Gray/High Quality Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=High.Gray"
+ Choice "Photo/Photo (on photo paper)" "%% FoomaticRIPOptionSetting: PrintoutMode=Photo"
+ Option "InputSlot/Media Source" PickOne AnySetup 100.0
+ *Choice "Default/Printer default" "%% FoomaticRIPOptionSetting: InputSlot=Default"
+ Choice "PhotoTray/Photo Tray" "%% FoomaticRIPOptionSetting: InputSlot=PhotoTray"
+ Choice "Upper/Upper Tray" "%% FoomaticRIPOptionSetting: InputSlot=Upper"
+ Choice "Lower/Lower Tray" "%% FoomaticRIPOptionSetting: InputSlot=Lower"
+ Choice "CDDVDTray/CD or DVD Tray" "%% FoomaticRIPOptionSetting: InputSlot=CDDVDTray"
+ Choice "Envelope/Envelope Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Envelope"
+ Choice "LargeCapacity/Large Capacity Tray" "%% FoomaticRIPOptionSetting: InputSlot=LargeCapacity"
+ Choice "Manual/Manual Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Manual"
+ Choice "MPTray/Multi Purpose Tray" "%% FoomaticRIPOptionSetting: InputSlot=MPTray"
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 120.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "%% FoomaticRIPOptionSetting: Duplex=DuplexNoTumble"
+ Choice "DuplexTumble/Short Edge (Flip)" "%% FoomaticRIPOptionSetting: Duplex=DuplexTumble"
+ *Choice "None/Off" "%% FoomaticRIPOptionSetting: Duplex=None"
+ Option "DryTime/Additional Dry Time" PickOne AnySetup 120.0
+ *Choice "Zero/Printer Default" "%% FoomaticRIPOptionSetting: DryTime=Zero"
+ Choice "Five/5 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Five"
+ Choice "Ten/10 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Ten"
+ Choice "Fifteen/15 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Fifteen"
+ Choice "Twenty/20 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Twenty"
+ Choice "TwentyFive/25 Seconds" "%% FoomaticRIPOptionSetting: DryTime=TwentyFive"
+ Choice "Thirty/30 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Thirty"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "300ColorCMYK/300 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYK"
+ Choice "300ColorCMYKFullBleed/300 dpi, Color, Full Bleed, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYKFullBleed"
+ Choice "300DraftColorCMYK/300 dpi, Draft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftColorCMYK"
+ Choice "300DraftGrayscaleK/300 dpi, Draft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftGrayscaleK"
+ Choice "300FastDraftColorCMYK/300 dpi, FastDraft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300FastDraftColorCMYK"
+ Choice "300FastDraftGrayscaleK/300 dpi, FastDraft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300FastDraftGrayscaleK"
+ Choice "300GrayscaleK/300 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300GrayscaleK"
+ Choice "600ColorCMYK/600 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMYK"
+ Choice "600ColorCMYKFullBleed/600 dpi, Color, Full Bleed, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMYKFullBleed"
+ Choice "600GrayscaleK/600 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=600GrayscaleK"
+ Choice "600PhotoCMYK/600 dpi, Photo, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=600PhotoCMYK"
+ Choice "600PhotoCMYKFullBleed/600 dpi, Photo, Full Bleed, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=600PhotoCMYKFullBleed"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 9.72 36.00 9.72 9.00 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo or 5x7 inch index card" 360.00 504.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "PhotoTearOff/Photo with tear-off tab" 288.00 432.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff" "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "A6TearOff/A6 with tear-off tab" 297.00 420.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=A6TearOff" "%% FoomaticRIPOptionSetting: PageSize=A6TearOff"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "CDDVD120/CD or DVD 120 mm" 360.00 360.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD120" "%% FoomaticRIPOptionSetting: PageSize=CDDVD120"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+ // <%Corbett:Normal%>
+ {
+ ModelName "HP Officejet Pro 8000 a809 hpijs"
+ Attribute "NickName" "" "HP Officejet Pro 8000 a809 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP OJ Pro 8000 a809 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet pro 8000 a809;DES:officejet pro 8000 a809;"
+ PCFileName "hp-officejet_pro_8000_a809-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet Pro 8000 Printer - a809a)"
+ Attribute "Product" "" "(HP Officejet Pro 8000 Wireless Printer - a809n)"
+ }
+ {
+ ModelName "HP Officejet Pro 8500 a909g hpijs"
+ Attribute "NickName" "" "HP Officejet Pro 8500 a909g hpijs, $Version"
+ Attribute "ShortNickName" "" "HP OJ Pro 8500 a909g hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet pro 8500 a909g;DES:officejet pro 8500 a909g;"
+ PCFileName "hp-officejet_pro_8500_a909g-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet Pro 8500 Wireless All-in-one Printer - a909g)"
+ }
+ {
+ ModelName "HP Officejet Pro 8500 a909a hpijs"
+ Attribute "NickName" "" "HP Officejet Pro 8500 a909a hpijs, $Version"
+ Attribute "ShortNickName" "" "HP OJ Pro 8500 a909a hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet pro 8500 a909a;DES:officejet pro 8500 a909a;"
+ PCFileName "hp-officejet_pro_8500_a909a-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet Pro 8500 All-in-one Printer - a909a)"
+ }
+ {
+ ModelName "HP Officejet Pro 8500 a909n hpijs"
+ Attribute "NickName" "" "HP Officejet Pro 8500 a909n hpijs, $Version"
+ Attribute "ShortNickName" "" "HP OJ Pro 8500 a909n hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet pro 8500 a909n;DES:officejet pro 8500 a909n;"
+ PCFileName "hp-officejet_pro_8500_a909n-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet Pro 8500 Premier All-in-one Printer - a909n)"
+ }
+ {
+ ModelName "HP Officejet Pro 8500 a910 hpijs"
+ Attribute "NickName" "" "HP Officejet Pro 8500 a910 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP OJ Pro 8500 a910 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet pro 8500 a910;DES:officejet pro 8500 a910;"
+ PCFileName "hp-officejet_pro_8500_a910-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet Pro 8500a Plus E-aio Printer - a910g)"
+ Attribute "Product" "" "(HP Officejet Pro 8500a Premium E-aio Printer - a910n)"
+ Attribute "Product" "" "(HP Officejet Pro 8500a E-aio Printer - a910a)"
+ }
+} // end Corbett
+
+////////// Ampere
+{
+ Attribute "DefaultResolution" "" "1200dpi"
+
+ // Custom page sizes from 1x4in to Legal
+ HWMargins 18 36 18 9
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 8.5in 14in
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-DeskJet_5550 hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-DeskJet_5550" " -sDeviceManufacture&&
+r=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;deskjet 5550&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=300FastDraftCol&&
+orCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft.Gray" "Quality=300FastDra&&
+ftGrayscaleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=300ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal.Gray" "Quality=300Graysc&&
+aleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High" "Quality=600ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High.Gray" "Quality=600Grayscal&&
+eK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Photo" "Quality=1200PhotoCMYKFu&&
+llBleed"
+ Attribute "FoomaticRIPOption" "InputSlot" "enum CmdLine C"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Default" ",PS:MediaPosition=7"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=PhotoTray" ",PS:MediaPosition=6"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Upper" ",PS:MediaPosition=1"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Lower" ",PS:MediaPosition=4"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=CDDVDTray" ",PS:MediaPosition=14"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Envelope" ",PS:MediaPosition=3"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=LargeCapacity" ",PS:MediaPosition=&&
+5"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Manual" ",PS:MediaPosition=2"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=MPTray" ",PS:MediaPosition=8"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=PhotoTearOff" " -dDEVICEWIDTHPOINTS&&
+=288 -dDEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6TearOff" " -dDEVICEWIDTHPOINTS=29&&
+7 -dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD120" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ Attribute "FoomaticRIPOption" "Duplex" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexNoTumble" " -dDuplex=true -dTum&&
+ble=false"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexTumble" " -dDuplex=true -dTumbl&&
+e=true"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=None" " -dDuplex=false"
+ Attribute "FoomaticRIPOption" "DryTime" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Zero" ""
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Five" ",DryTime=5"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Ten" ",DryTime=10"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Fifteen" ",DryTime=15"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Twenty" ",DryTime=20"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=TwentyFive" ",DryTime=25"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Thirty" ",DryTime=30"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYK" " -r300 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYKFullBleed" " -r300 -sIjs&&
+Params=Quality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:FullBleed=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftColorCMYK" " -r300 -sIjsPara&&
+ms=Quality:Quality=1,Quality:ColorMode=2,Quality:MediaType=0,Quality:P&&
+enSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftGrayscaleK" " -r300 -sIjs&&
+Params=Quality:Quality=1,Quality:ColorMode=0,Quality:MediaType=0,Quali&&
+ty:PenSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300FastDraftColorCMYK" " -r300 -sIjs&&
+Params=Quality:Quality=4,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:SpeedMech=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300FastDraftGrayscaleK" " -r300 -&&
+sIjsParams=Quality:Quality=4,Quality:ColorMode=0,Quality:MediaType=0,Q&&
+uality:PenSet=2,Quality:SpeedMech=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300GrayscaleK" " -r300 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMYK" " -r600 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMYKFullBleed" " -r600 -sIjs&&
+Params=Quality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:FullBleed=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600GrayscaleK" " -r600 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=1200PhotoCMYK" " -r1200 -sIjsParams=&&
+Quality:Quality=3,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenS&&
+et=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=1200PhotoCMYKFullBleed" " -r1200 -sI&&
+jsParams=Quality:Quality=3,Quality:ColorMode=2,Quality:MediaType=2,Qua&&
+lity:PenSet=2,Quality:FullBleed=1"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ Choice "Draft.Gray/Draft Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft.Gray"
+ *Choice "Normal/Normal (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "Normal.Gray/Normal Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal.Gray"
+ Choice "High/High Quality (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=High"
+ Choice "High.Gray/High Quality Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=High.Gray"
+ Choice "Photo/Photo (on photo paper)" "%% FoomaticRIPOptionSetting: PrintoutMode=Photo"
+ Option "InputSlot/Media Source" PickOne AnySetup 100.0
+ *Choice "Default/Printer default" "%% FoomaticRIPOptionSetting: InputSlot=Default"
+ Choice "PhotoTray/Photo Tray" "%% FoomaticRIPOptionSetting: InputSlot=PhotoTray"
+ Choice "Upper/Upper Tray" "%% FoomaticRIPOptionSetting: InputSlot=Upper"
+ Choice "Lower/Lower Tray" "%% FoomaticRIPOptionSetting: InputSlot=Lower"
+ Choice "CDDVDTray/CD or DVD Tray" "%% FoomaticRIPOptionSetting: InputSlot=CDDVDTray"
+ Choice "Envelope/Envelope Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Envelope"
+ Choice "LargeCapacity/Large Capacity Tray" "%% FoomaticRIPOptionSetting: InputSlot=LargeCapacity"
+ Choice "Manual/Manual Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Manual"
+ Choice "MPTray/Multi Purpose Tray" "%% FoomaticRIPOptionSetting: InputSlot=MPTray"
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 120.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "%% FoomaticRIPOptionSetting: Duplex=DuplexNoTumble"
+ Choice "DuplexTumble/Short Edge (Flip)" "%% FoomaticRIPOptionSetting: Duplex=DuplexTumble"
+ *Choice "None/Off" "%% FoomaticRIPOptionSetting: Duplex=None"
+ Option "DryTime/Additional Dry Time" PickOne AnySetup 120.0
+ *Choice "Zero/Printer Default" "%% FoomaticRIPOptionSetting: DryTime=Zero"
+ Choice "Five/5 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Five"
+ Choice "Ten/10 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Ten"
+ Choice "Fifteen/15 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Fifteen"
+ Choice "Twenty/20 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Twenty"
+ Choice "TwentyFive/25 Seconds" "%% FoomaticRIPOptionSetting: DryTime=TwentyFive"
+ Choice "Thirty/30 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Thirty"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "300ColorCMYK/300 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYK"
+ Choice "300ColorCMYKFullBleed/300 dpi, Color, Full Bleed, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYKFullBleed"
+ Choice "300DraftColorCMYK/300 dpi, Draft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftColorCMYK"
+ Choice "300DraftGrayscaleK/300 dpi, Draft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftGrayscaleK"
+ Choice "300FastDraftColorCMYK/300 dpi, FastDraft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300FastDraftColorCMYK"
+ Choice "300FastDraftGrayscaleK/300 dpi, FastDraft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300FastDraftGrayscaleK"
+ Choice "300GrayscaleK/300 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300GrayscaleK"
+ Choice "600ColorCMYK/600 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMYK"
+ Choice "600ColorCMYKFullBleed/600 dpi, Color, Full Bleed, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMYKFullBleed"
+ Choice "600GrayscaleK/600 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=600GrayscaleK"
+ Choice "1200PhotoCMYK/1200 dpi, Photo, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=1200PhotoCMYK"
+ Choice "1200PhotoCMYKFullBleed/1200 dpi, Photo, Full Bleed, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=1200PhotoCMYKFullBleed"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 9.72 36.00 9.72 9.00 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo or 5x7 inch index card" 360.00 504.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "PhotoTearOff/Photo with tear-off tab" 288.00 432.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff" "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "A6TearOff/A6 with tear-off tab" 297.00 420.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=A6TearOff" "%% FoomaticRIPOptionSetting: PageSize=A6TearOff"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "CDDVD120/CD or DVD 120 mm" 360.00 360.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD120" "%% FoomaticRIPOptionSetting: PageSize=CDDVD120"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+ // <%Ampere:Normal%>
+ {
+ ModelName "HP Officejet Pro 8100 hpijs"
+ Attribute "NickName" "" "HP Officejet Pro 8100 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet Pro 8100 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet pro 8100;DES:officejet pro 8100;"
+ PCFileName "hp-officejet_pro_8100-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet Pro 8100 eprinter-n811a)"
+ }
+ {
+ ModelName "HP Officejet Pro 8600 hpijs"
+ Attribute "NickName" "" "HP Officejet Pro 8600 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet Pro 8600 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet pro 8600;DES:officejet pro 8600;"
+ PCFileName "hp-officejet_pro_8600-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet Pro 8600 E-aio n911a)"
+ Attribute "Product" "" "(HP Officejet Pro 8600 Plus E-aio n911g)"
+ }
+} // end Ampere
+
+
+//////// Python and OJ7000
+{
+ Attribute "DefaultResolution" "" "600dpi"
+
+ // Custom page sizes from 1x4in to SuperB
+ HWMargins 18 36 18 9
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 936 1368
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-DeskJet_5650 hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-DeskJet_5650" " -sDeviceManufacture&&
+r=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;deskjet 5600&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=300FastDraftCol&&
+orCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft.Gray" "Quality=300FastDra&&
+ftGrayscaleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=300ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal.Gray" "Quality=300Graysc&&
+aleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High" "Quality=600ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High.Gray" "Quality=600Grayscal&&
+eK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Photo" "Quality=600PhotoCMYKFu&&
+llBleed"
+ Attribute "FoomaticRIPOption" "InputSlot" "enum CmdLine C"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Default" ",PS:MediaPosition=7"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=PhotoTray" ",PS:MediaPosition=6"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Upper" ",PS:MediaPosition=1"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Lower" ",PS:MediaPosition=4"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=CDDVDTray" ",PS:MediaPosition=14"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Envelope" ",PS:MediaPosition=3"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=LargeCapacity" ",PS:MediaPosition=&&
+5"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Manual" ",PS:MediaPosition=2"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=MPTray" ",PS:MediaPosition=8"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=PhotoTearOff" " -dDEVICEWIDTHPOINTS&&
+=288 -dDEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6TearOff" " -dDEVICEWIDTHPOINTS=29&&
+7 -dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD120" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ /////////// Large format paper support
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B4JIS" " -dDEVICEWIDTHPOINTS=729 -d&&
+DEVICEHEIGHTPOINTS=1033"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Ledger" " -dDEVICEWIDTHPOINTS=792 -&&
+dDEVICEHEIGHTPOINTS=1224"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=SuperB" " -dDEVICEWIDTHPOINTS=936 -&&
+dDEVICEHEIGHTPOINTS=1368"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w774h1116" " -dDEVICEWIDTHPOINTS=77&&
+4 -dDEVICEHEIGHTPOINTS=1116"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A3" " -dDEVICEWIDTHPOINTS=842 -dDEV&&
+ICEHEIGHTPOINTS=1190"
+ Attribute "FoomaticRIPOption" "Duplex" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexNoTumble" " -dDuplex=true -dTum&&
+ble=false"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexTumble" " -dDuplex=true -dTumbl&&
+e=true"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=None" " -dDuplex=false"
+ Attribute "FoomaticRIPOption" "DryTime" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Zero" ""
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Five" ",DryTime=5"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Ten" ",DryTime=10"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Fifteen" ",DryTime=15"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Twenty" ",DryTime=20"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=TwentyFive" ",DryTime=25"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Thirty" ",DryTime=30"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYK" " -r300 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYKFullBleed" " -r300 -sIjs&&
+Params=Quality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:FullBleed=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftColorCMYK" " -r300 -sIjsPara&&
+ms=Quality:Quality=1,Quality:ColorMode=2,Quality:MediaType=0,Quality:P&&
+enSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftGrayscaleK" " -r300 -sIjs&&
+Params=Quality:Quality=1,Quality:ColorMode=0,Quality:MediaType=0,Quali&&
+ty:PenSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300FastDraftColorCMYK" " -r300 -sIjs&&
+Params=Quality:Quality=4,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:SpeedMech=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300FastDraftGrayscaleK" " -r300 -&&
+sIjsParams=Quality:Quality=4,Quality:ColorMode=0,Quality:MediaType=0,Q&&
+uality:PenSet=2,Quality:SpeedMech=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300GrayscaleK" " -r300 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMYK" " -r600 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMYKFullBleed" " -r600 -sIjs&&
+Params=Quality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:FullBleed=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600GrayscaleK" " -r600 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600PhotoCMYK" " -r600 -sIjsParams=&&
+Quality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenS&&
+et=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600PhotoCMYKFullBleed" " -r600 -sI&&
+jsParams=Quality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Qua&&
+lity:PenSet=2,Quality:FullBleed=1"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ Choice "Draft.Gray/Draft Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft.Gray"
+ *Choice "Normal/Normal (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "Normal.Gray/Normal Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal.Gray"
+ Choice "High/High Quality (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=High"
+ Choice "High.Gray/High Quality Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=High.Gray"
+ Choice "Photo/Photo (on photo paper)" "%% FoomaticRIPOptionSetting: PrintoutMode=Photo"
+ Option "InputSlot/Media Source" PickOne AnySetup 100.0
+ *Choice "Default/Printer default" "%% FoomaticRIPOptionSetting: InputSlot=Default"
+ Choice "PhotoTray/Photo Tray" "%% FoomaticRIPOptionSetting: InputSlot=PhotoTray"
+ Choice "Upper/Upper Tray" "%% FoomaticRIPOptionSetting: InputSlot=Upper"
+ Choice "Lower/Lower Tray" "%% FoomaticRIPOptionSetting: InputSlot=Lower"
+ Choice "CDDVDTray/CD or DVD Tray" "%% FoomaticRIPOptionSetting: InputSlot=CDDVDTray"
+ Choice "Envelope/Envelope Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Envelope"
+ Choice "LargeCapacity/Large Capacity Tray" "%% FoomaticRIPOptionSetting: InputSlot=LargeCapacity"
+ Choice "Manual/Manual Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Manual"
+ Choice "MPTray/Multi Purpose Tray" "%% FoomaticRIPOptionSetting: InputSlot=MPTray"
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 120.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "%% FoomaticRIPOptionSetting: Duplex=DuplexNoTumble"
+ Choice "DuplexTumble/Short Edge (Flip)" "%% FoomaticRIPOptionSetting: Duplex=DuplexTumble"
+ *Choice "None/Off" "%% FoomaticRIPOptionSetting: Duplex=None"
+ Option "DryTime/Additional Dry Time" PickOne AnySetup 120.0
+ *Choice "Zero/Printer Default" "%% FoomaticRIPOptionSetting: DryTime=Zero"
+ Choice "Five/5 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Five"
+ Choice "Ten/10 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Ten"
+ Choice "Fifteen/15 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Fifteen"
+ Choice "Twenty/20 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Twenty"
+ Choice "TwentyFive/25 Seconds" "%% FoomaticRIPOptionSetting: DryTime=TwentyFive"
+ Choice "Thirty/30 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Thirty"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "300ColorCMYK/300 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYK"
+ Choice "300ColorCMYKFullBleed/300 dpi, Color, Full Bleed, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYKFullBleed"
+ Choice "300DraftColorCMYK/300 dpi, Draft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftColorCMYK"
+ Choice "300DraftGrayscaleK/300 dpi, Draft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftGrayscaleK"
+ Choice "300FastDraftColorCMYK/300 dpi, FastDraft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300FastDraftColorCMYK"
+ Choice "300FastDraftGrayscaleK/300 dpi, FastDraft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300FastDraftGrayscaleK"
+ Choice "300GrayscaleK/300 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300GrayscaleK"
+ Choice "600ColorCMYK/600 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMYK"
+ Choice "600ColorCMYKFullBleed/600 dpi, Color, Full Bleed, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMYKFullBleed"
+ Choice "600GrayscaleK/600 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=600GrayscaleK"
+ Choice "600PhotoCMYK/600 dpi, Photo, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=600PhotoCMYK"
+ Choice "600PhotoCMYKFullBleed/600 dpi, Photo, Full Bleed, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=600PhotoCMYKFullBleed"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 9.72 36.00 9.72 9.00 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo or 5x7 inch index card" 360.00 504.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "PhotoTearOff/Photo with tear-off tab" 288.00 432.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff" "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "A6TearOff/A6 with tear-off tab" 297.00 420.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=A6TearOff" "%% FoomaticRIPOptionSetting: PageSize=A6TearOff"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "CDDVD120/CD or DVD 120 mm" 360.00 360.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD120" "%% FoomaticRIPOptionSetting: PageSize=CDDVD120"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+ // <%Python:NoMaxDPI%>
+ {
+ ModelName "HP Photosmart c309a Series hpijs"
+ Attribute "NickName" "" "HP Photosmart c309a Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP PS c309a Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart c309a series;DES:photosmart c309a series;"
+ PCFileName "hp-photosmart_c309a_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart Premium Fax All-in-one Printer - c309a)"
+ }
+ // <%Python:NoCDDVD%>
+ {
+ ModelName "HP Officejet 6000 e609n hpijs"
+ Attribute "NickName" "" "HP Officejet 6000 e609n hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet 6000 e609n hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet 6000 e609n;DES:officejet 6000 e609n;"
+ PCFileName "hp-officejet_6000_e609n-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet 6000 Wireless Printer - e609n)"
+ }
+ {
+ ModelName "HP Officejet 6500 e709n hpijs"
+ Attribute "NickName" "" "HP Officejet 6500 e709n hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet 6500 e709n hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet 6500 e709n;DES:officejet 6500 e709n;"
+ PCFileName "hp-officejet_6500_e709n-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet 6500 Wireless All-in-one Printer - e709n)"
+ Attribute "Product" "" "(HP Officejet 6500 Wireless All-in-one Printer - e709q)"
+ }
+ // <%Python:NoCDDVD:NoMaxDPI%>
+ {
+ ModelName "HP Photosmart Prem-web c309n-s hpijs"
+ Attribute "NickName" "" "HP Photosmart Prem-web c309n-s hpijs, $Version"
+ Attribute "ShortNickName" "" "HP PS Prem-web c309n-s hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart prem-web c309n-s;DES:photosmart prem-web c309n-s;"
+ PCFileName "hp-photosmart_prem-web_c309n-s-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart Premium Fax All-in-one Printer Series -c309a)"
+ Attribute "Product" "" "(HP Photosmart Premium Fax All-in-one Printer Series -c309c)"
+ }
+ {
+ ModelName "HP Photosmart Premium c309g-m hpijs"
+ Attribute "NickName" "" "HP Photosmart Premium c309g-m hpijs, $Version"
+ Attribute "ShortNickName" "" "HP PS Premium c309g-m hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart premium c309g-m;DES:photosmart premium c309g-m;"
+ PCFileName "hp-photosmart_premium_c309g-m-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart Premium All-in-one Printer Series - c309g)"
+ Attribute "Product" "" "(HP Photosmart Premium All-in-one Printer Series - c309h)"
+ }
+ // <%Python:NoAutoDuplex:NoCDDVD%>
+ {
+ ModelName "HP Officejet 6000 e609a hpijs"
+ Attribute "NickName" "" "HP Officejet 6000 e609a hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet 6000 e609a hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet 6000 e609a;DES:officejet 6000 e609a;"
+ PCFileName "hp-officejet_6000_e609a-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet 6000 Printer - e609a)"
+ }
+ {
+ ModelName "HP Officejet 6500 e709a hpijs"
+ Attribute "NickName" "" "HP Officejet 6500 e709a hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet 6500 e709a hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet 6500 e709a;DES:officejet 6500 e709a;"
+ PCFileName "hp-officejet_6500_e709a-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet 6500 All-in-one Printer - e709a)"
+ Attribute "Product" "" "(HP Officejet 6500 All-in-one Printer - e709c)"
+ }
+ {
+ ModelName "HP Officejet 6500 e710a-f hpijs"
+ Attribute "NickName" "" "HP Officejet 6500 e710a-f hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet 6500 e710a-f hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet 6500 e710a-f;DES:officejet 6500 e710a-f;"
+ PCFileName "hp-officejet_6500_e710a-f-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet 6500 e710)"
+ }
+ // <%Python:NoAutoDuplex:NoCDDVD:NoMaxDPI%>
+ {
+ ModelName "HP Photosmart c5300 Series hpijs"
+ Attribute "NickName" "" "HP Photosmart c5300 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP PS c5300 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart c5300 series;DES:photosmart c5300 series;"
+ PCFileName "hp-photosmart_c5300_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart c5370 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c5373 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c5380 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c5383 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c5388 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c5390 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c5393 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Photosmart c6300 Series hpijs"
+ Attribute "NickName" "" "HP Photosmart c6300 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP PS c6300 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart c6300 series;DES:photosmart c6300 series;"
+ PCFileName "hp-photosmart_c6300_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart c6324 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c6340 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c6350 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c6375 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c6380 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c6383 All-in-one Printer)"
+ Attribute "Product" "" "(HP Photosmart c6388 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Photosmart d7500 Series hpijs"
+ Attribute "NickName" "" "HP Photosmart d7500 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP PS d7500 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart d7500 series;DES:photosmart d7500 series;"
+ PCFileName "hp-photosmart_d7500_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart d7560 Printer)"
+ }
+ // <%Python10:NoCDDVD:NoMaxDPI%>
+ {
+ ModelName "HP Photosmart Prem c310 Series hpijs"
+ Attribute "NickName" "" "HP Photosmart Prem c310 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP PS Prem c310 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart prem c310 series;DES:photosmart prem c310 series;"
+ PCFileName "hp-photosmart_prem_c310_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart Prem c310 Series)"
+ }
+ {
+ ModelName "HP Photosmart Prem c410 Series hpijs"
+ Attribute "NickName" "" "HP Photosmart Prem c410 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP PS Prem c410 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart prem c410 series;DES:photosmart prem c410 series;"
+ PCFileName "hp-photosmart_prem_c410_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart Prem c410 Series)"
+ }
+ {
+ ModelName "HP Photosmart Estn c510 Series hpijs"
+ Attribute "NickName" "" "HP Photosmart Estn c510 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP PS Estn c510 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart estn c510 series;DES:photosmart estn c510 series;"
+ PCFileName "hp-photosmart_estn_c510_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart Estn c510 Series)"
+ }
+ // <%Python10:NoAutoTray%>
+ {
+ ModelName "HP Officejet 6500 e710n-z hpijs"
+ Attribute "NickName" "" "HP Officejet 6500 e710n-z hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet 6500 e710n-z hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet 6500 e710n-z;DES:officejet 6500 e710n-z;"
+ PCFileName "hp-officejet_6500_e710n-z-hpijs.ppd"
+ Attribute "Product" "" "(HP Oficejet 6500 e710n-z)"
+ }
+ {
+ // Large format SuperB paper support
+ CustomMedia "B4JIS/B4 (JIS)" 729.00 1033.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B4JIS" "%% FoomaticRIPOptionSetting: PageSize=B4JIS"
+ CustomMedia "Ledger/Ledger" 792.00 1224.00 14.40 36.00 14.40 9.00 "%% FoomaticRIPOptionSetting: PageSize=Ledger" "%% FoomaticRIPOptionSetting: PageSize=Ledger"
+ CustomMedia "SuperB/Super B" 936.00 1368.00 14.40 36.00 14.40 9.00 "%% FoomaticRIPOptionSetting: PageSize=SuperB" "%% FoomaticRIPOptionSetting: PageSize=SuperB"
+ CustomMedia "w774h1116/8K" 774.00 1116.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w774h1116" "%% FoomaticRIPOptionSetting: PageSize=w774h1116"
+ CustomMedia "A3/A3" 842.00 1190.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A3" "%% FoomaticRIPOptionSetting: PageSize=A3"
+ // <%Python:LargeFormatA3:NoAutoDuplex%>
+ {
+ ModelName "HP Photosmart Pro b8300 Series hpijs"
+ Attribute "NickName" "" "HP Photosmart Pro b8300 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP PS Pro b8300 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart pro b8300 series;DES:photosmart pro b8300 series;"
+ PCFileName "hp-photosmart_pro_b8300_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart Pro b8330 Printer)"
+ Attribute "Product" "" "(HP Photosmart Pro b8338 Printer)"
+ Attribute "Product" "" "(HP Photosmart Pro b8350 Printer)"
+ Attribute "Product" "" "(HP Photosmart Pro b8353 Printer)"
+ }
+ {
+ ModelName "HP Photosmart b8500 Series hpijs"
+ Attribute "NickName" "" "HP Photosmart b8500 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP PS b8500 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart b8500 series;DES:photosmart b8500 series;"
+ PCFileName "hp-photosmart_b8500_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart b8550 Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart b8553 Photo Printer)"
+ Attribute "Product" "" "(HP Photosmart b8558 Photo Printer)"
+ }
+ // <%Python:LargeFormatA3:NoAutoDuplex:Advanced%>
+ {
+ ModelName "HP Photosmart Pro b8800 Series hpijs"
+ Attribute "NickName" "" "HP Photosmart Pro b8800 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP PS Pro b8800 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:photosmart pro b8800 series;DES:photosmart pro b8800 series;"
+ PCFileName "hp-photosmart_pro_b8800_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Photosmart Pro b8850 Printer)"
+ }
+ // <%OJ7000:LargeFormatA3%>
+ {
+ ModelName "HP Officejet 7000 e809a Series hpijs"
+ Attribute "NickName" "" "HP Officejet 7000 e809a Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP OJ 7000 e809a Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet 7000 e809a series;DES:officejet 7000 e809a series;"
+ PCFileName "hp-officejet_7000_e809a_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet 7000 Wide Format Printer -- e809a)"
+ }
+ {
+ ModelName "HP Officejet 7000 e809a hpijs"
+ Attribute "NickName" "" "HP Officejet 7000 e809a hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet 7000 e809a hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet 7000 e809a;DES:officejet 7000 e809a;"
+ PCFileName "hp-officejet_7000_e809a-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet 7000 Wide Format Printer -- e809a)"
+ }
+ // <%OJ7000:LargeFormatA3:SmallMargins%>
+ {
+ ModelName "HP Officejet 7500 e910 hpijs"
+ Attribute "NickName" "" "HP Officejet 7500 e910 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP Officejet 7500 e910 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:officejet 7500 e910;DES:officejet 7500 e910;"
+ PCFileName "hp-officejet_7500_e910-hpijs.ppd"
+ Attribute "Product" "" "(HP Officejet 7500 e910)"
+ }
+ }
+} // End Python and OJ7000
+
+//////// Pyramid
+{
+ Attribute "DefaultResolution" "" "600dpi"
+
+ // Custom page sizes from 1x4in to SuperB
+ HWMargins 18 36 18 9
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 936 1368
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-DeskJet_5650 hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-DeskJet_5650" " -sDeviceManufacture&&
+r=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;deskjet 5600&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=300FastDraftCol&&
+orCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft.Gray" "Quality=300FastDra&&
+ftGrayscaleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=300ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal.Gray" "Quality=300Graysc&&
+aleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High" "Quality=600ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High.Gray" "Quality=600Grayscal&&
+eK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Photo" "Quality=600PhotoCMYKFu&&
+llBleed"
+ Attribute "FoomaticRIPOption" "InputSlot" "enum CmdLine C"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Default" ",PS:MediaPosition=7"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=PhotoTray" ",PS:MediaPosition=6"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Upper" ",PS:MediaPosition=1"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Lower" ",PS:MediaPosition=4"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=CDDVDTray" ",PS:MediaPosition=14"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Envelope" ",PS:MediaPosition=3"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=LargeCapacity" ",PS:MediaPosition=&&
+5"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Manual" ",PS:MediaPosition=2"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=MPTray" ",PS:MediaPosition=8"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=PhotoTearOff" " -dDEVICEWIDTHPOINTS&&
+=288 -dDEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6TearOff" " -dDEVICEWIDTHPOINTS=29&&
+7 -dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD120" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ /////////// Large format paper support
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B4JIS" " -dDEVICEWIDTHPOINTS=729 -d&&
+DEVICEHEIGHTPOINTS=1033"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Ledger" " -dDEVICEWIDTHPOINTS=792 -&&
+dDEVICEHEIGHTPOINTS=1224"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=SuperB" " -dDEVICEWIDTHPOINTS=936 -&&
+dDEVICEHEIGHTPOINTS=1368"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w774h1116" " -dDEVICEWIDTHPOINTS=77&&
+4 -dDEVICEHEIGHTPOINTS=1116"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A3" " -dDEVICEWIDTHPOINTS=842 -dDEV&&
+ICEHEIGHTPOINTS=1190"
+ Attribute "FoomaticRIPOption" "DryTime" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Zero" ""
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Five" ",DryTime=5"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Ten" ",DryTime=10"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Fifteen" ",DryTime=15"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Twenty" ",DryTime=20"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=TwentyFive" ",DryTime=25"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Thirty" ",DryTime=30"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYK" " -r300 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYKFullBleed" " -r300 -sIjs&&
+Params=Quality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:FullBleed=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftColorCMYK" " -r300 -sIjsPara&&
+ms=Quality:Quality=1,Quality:ColorMode=2,Quality:MediaType=0,Quality:P&&
+enSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftGrayscaleK" " -r300 -sIjs&&
+Params=Quality:Quality=1,Quality:ColorMode=0,Quality:MediaType=0,Quali&&
+ty:PenSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300FastDraftColorCMYK" " -r300 -sIjs&&
+Params=Quality:Quality=4,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:SpeedMech=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300FastDraftGrayscaleK" " -r300 -&&
+sIjsParams=Quality:Quality=4,Quality:ColorMode=0,Quality:MediaType=0,Q&&
+uality:PenSet=2,Quality:SpeedMech=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300GrayscaleK" " -r300 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMYK" " -r600 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMYKFullBleed" " -r600 -sIjs&&
+Params=Quality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:FullBleed=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600GrayscaleK" " -r600 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600PhotoCMYK" " -r600 -sIjsParams=&&
+Quality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenS&&
+et=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600PhotoCMYKFullBleed" " -r600 -sI&&
+jsParams=Quality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Qua&&
+lity:PenSet=2,Quality:FullBleed=1"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ Choice "Draft.Gray/Draft Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft.Gray"
+ *Choice "Normal/Normal (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "Normal.Gray/Normal Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal.Gray"
+ Choice "High/High Quality (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=High"
+ Choice "High.Gray/High Quality Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=High.Gray"
+ Choice "Photo/Photo (on photo paper)" "%% FoomaticRIPOptionSetting: PrintoutMode=Photo"
+ Option "InputSlot/Media Source" PickOne AnySetup 100.0
+ *Choice "Default/Printer default" "%% FoomaticRIPOptionSetting: InputSlot=Default"
+ Choice "PhotoTray/Photo Tray" "%% FoomaticRIPOptionSetting: InputSlot=PhotoTray"
+ Choice "Upper/Upper Tray" "%% FoomaticRIPOptionSetting: InputSlot=Upper"
+ Choice "Lower/Lower Tray" "%% FoomaticRIPOptionSetting: InputSlot=Lower"
+ Choice "CDDVDTray/CD or DVD Tray" "%% FoomaticRIPOptionSetting: InputSlot=CDDVDTray"
+ Choice "Envelope/Envelope Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Envelope"
+ Choice "LargeCapacity/Large Capacity Tray" "%% FoomaticRIPOptionSetting: InputSlot=LargeCapacity"
+ Choice "Manual/Manual Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Manual"
+ Choice "MPTray/Multi Purpose Tray" "%% FoomaticRIPOptionSetting: InputSlot=MPTray"
+ Option "DryTime/Additional Dry Time" PickOne AnySetup 120.0
+ *Choice "Zero/Printer Default" "%% FoomaticRIPOptionSetting: DryTime=Zero"
+ Choice "Five/5 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Five"
+ Choice "Ten/10 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Ten"
+ Choice "Fifteen/15 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Fifteen"
+ Choice "Twenty/20 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Twenty"
+ Choice "TwentyFive/25 Seconds" "%% FoomaticRIPOptionSetting: DryTime=TwentyFive"
+ Choice "Thirty/30 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Thirty"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "300ColorCMYK/300 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYK"
+ Choice "300ColorCMYKFullBleed/300 dpi, Color, Full Bleed, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYKFullBleed"
+ Choice "300DraftColorCMYK/300 dpi, Draft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftColorCMYK"
+ Choice "300DraftGrayscaleK/300 dpi, Draft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftGrayscaleK"
+ Choice "300FastDraftColorCMYK/300 dpi, FastDraft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300FastDraftColorCMYK"
+ Choice "300FastDraftGrayscaleK/300 dpi, FastDraft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300FastDraftGrayscaleK"
+ Choice "300GrayscaleK/300 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300GrayscaleK"
+ Choice "600ColorCMYK/600 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMYK"
+ Choice "600ColorCMYKFullBleed/600 dpi, Color, Full Bleed, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMYKFullBleed"
+ Choice "600GrayscaleK/600 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=600GrayscaleK"
+ Choice "600PhotoCMYK/600 dpi, Photo, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=600PhotoCMYK"
+ Choice "600PhotoCMYKFullBleed/600 dpi, Photo, Full Bleed, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=600PhotoCMYKFullBleed"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 9.72 36.00 9.72 9.00 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo or 5x7 inch index card" 360.00 504.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "PhotoTearOff/Photo with tear-off tab" 288.00 432.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff" "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "A6TearOff/A6 with tear-off tab" 297.00 420.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=A6TearOff" "%% FoomaticRIPOptionSetting: PageSize=A6TearOff"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "CDDVD120/CD or DVD 120 mm" 360.00 360.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD120" "%% FoomaticRIPOptionSetting: PageSize=CDDVD120"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+
+
+ // <%Pyramid:NoAutoDuplex:NoCDDVD%>
+ {
+ ModelName "HP Deskjet 1000 j110 Series hpijs"
+ Attribute "NickName" "" "HP Deskjet 1000 j110 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP DJ 1000 j110 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 1000 j110 series;DES:deskjet 1000 j110 series;"
+ PCFileName "hp-deskjet_1000_j110_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 1000 j110 Series)"
+ }
+ {
+ ModelName "HP Deskjet 1050 j410 Series hpijs"
+ Attribute "NickName" "" "HP Deskjet 1050 j410 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP DJ 1050 j410 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 1050 j410 series;DES:deskjet 1050 j410 series;"
+ PCFileName "hp-deskjet_1050_j410_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 1050 j410 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Deskjet 2000 j210 Series hpijs"
+ Attribute "NickName" "" "HP Deskjet 2000 j210 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP DJ 2000 j210 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 2000 j210 series;DES:deskjet 2000 j210 series;"
+ PCFileName "hp-deskjet_2000_j210_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 2000 j210 Series)"
+ }
+ {
+ ModelName "HP Deskjet Ink Adv 2010 k010 hpijs"
+ Attribute "NickName" "" "HP Deskjet Ink Adv 2010 k010 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP DJ Ink Adv 2010 k010 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet ink adv 2010 k010;DES:deskjet ink adv 2010 k010;"
+ PCFileName "hp-deskjet_ink_adv_2010_k010-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet Ink Adv 2010 k010)"
+ }
+ {
+ ModelName "HP Deskjet 2050 j510 Series hpijs"
+ Attribute "NickName" "" "HP Deskjet 2050 j510 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP DJ 2050 j510 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 2050 j510 series;DES:deskjet 2050 j510 series;"
+ PCFileName "hp-deskjet_2050_j510_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 2050 j510 All-in-one Printer)"
+ }
+ {
+ ModelName "HP Deskjet Ink Adv 2060 k110 hpijs"
+ Attribute "NickName" "" "HP Deskjet Ink Adv 2060 k110 hpijs, $Version"
+ Attribute "ShortNickName" "" "HP DJ Ink Adv 2060 k110 hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet ink adv 2060 k110;DES:deskjet ink adv 2060 k110;"
+ PCFileName "hp-deskjet_ink_adv_2060_k110-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet Ink Adv 2060 k110)"
+ }
+ {
+ ModelName "HP Deskjet 3000 j310 Series hpijs"
+ Attribute "NickName" "" "HP Deskjet 3000 j310 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP DJ 3000 j310 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 3000 j310 series;DES:deskjet 3000 j310 series;"
+ PCFileName "hp-deskjet_3000_j310_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 3000 j310 Series)"
+ }
+ {
+ ModelName "HP Deskjet 3050 j610 Series hpijs"
+ Attribute "NickName" "" "HP Deskjet 3050 j610 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP DJ 3050 j610 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 3050 j610 series;DES:deskjet 3050 j610 series;"
+ PCFileName "hp-deskjet_3050_j610_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 3050 j610 Series)"
+ }
+ {
+ ModelName "HP Deskjet 3050a j611 Series hpijs"
+ Attribute "NickName" "" "HP Deskjet 3050a j611 Series hpijs, $Version"
+ Attribute "ShortNickName" "" "HP DJ 3050a j611 Series hpijs"
+ Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet 3050a j611 series;DES:deskjet 3050a j611 series;"
+ PCFileName "hp-deskjet_3050a_j611_series-hpijs.ppd"
+ Attribute "Product" "" "(HP Deskjet 3050a j611 Series)"
+ }
+
+
+} // End Pyramid
+
+
+
+} // end Manufacturer "HP"
+
diff --git a/prnt/drv/hpijs.drv.in.template b/prnt/drv/hpijs.drv.in.template
new file mode 100644
index 0000000..27f114e
--- /dev/null
+++ b/prnt/drv/hpijs.drv.in.template
@@ -0,0 +1,9348 @@
+//
+// hpijs.drv - hpijs driver information file for foomatic-rip
+//
+// This driver information file (drv) produces PPD files for the hpijs/ghostscript/foomatic-rip solution.
+// Multiple printers are supported by a finite set of device classes. This file defines the device classes
+// and each model that is associated with that device class.
+//
+// Each model entry has the following convention.
+//
+// ModelName "HP DeskJet 3810 Foomatic/hpijs" // friendly name
+// PCFileName "hp-deskjet_3810-hpijs.ppd" // PPD file name
+// Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet_3810;DES:deskjet_3810;" // for generic auto-ppd-selection
+//
+// The "ModelName" is a friendly name that can be displayed to the user for driver selection.
+//
+// The "PCFileName" should match the IEEE 1284 device-id model name. The model name is generated from the
+// IEEE 1284 "MDL" field. Leading and trailing spaces are removed, in-line spaces are replaced with a single
+// "_" character. Then an "hp-" prefix and "-hpijs.ppd" postfix is added/changed.
+//
+// The "1284DeviceID" is dummy IEEE 1284 device-id name. The name provides valid case-insensitive MFG:, MDL: and DES fields.
+// This provides third-party applications with a generic mechanism for auto-ppd-selection.
+//
+// In general there should be one drv model entry for every unique device-id supported by hpijs. This means one model entry
+// may support more than one product. For example the DeskJet 6100, DeskJet 6105, DeskJet 6110 and DeskJet 6150 all have the
+// same device-id "deskjet_6100_series". In this case there will only be one model entry the "DeskJet 6100".
+//
+// ModelName "HP DeskJet 6100 Foomatic/hpijs"
+// PCFileName "hp-deskjet_6100_series-hpijs.ppd"
+// Attribute "1284DeviceID" "" "MFG:HP;MDL:deskjet_6100;DES:deskjet_6100;"
+//
+// Found one exception to the above rule. There may need to be more than one model entry if there are different PPD options
+// per device-id. For example different models may support different paper sizes (ie: LaserJet 4 versus LaserJet 4V).
+//
+// Hpijs is a raster driver. Hpijs is not a postscript driver. In order to discriminate hpijs from other drivers we will use
+// the following PPD file naming convention.
+//
+// hpijs with foomatic-rip
+// hp-xxxxxxx-hpijs-zzz.ppd for
+//
+// hpijs with native CUPS
+// hp-xxxxxxx-zzz.ppd
+//
+// Postscript
+// hp-xxxxxxx-ps.ppd
+//
+// Where
+// xxxxxxx = normalized device-id name (ie: deskjet_6100_series)
+// zzz = page description language (ie: pcl, zjs, lidil). Use only to provide alternative PPD file selections.
+//
+// History
+// dsuffield 12/17/07 New
+// Parul Singh and Naga Samrat Chowdary, Narla 01/08/10 Added New SubClass LargeFormatA3:SmallMargins to OJ7000
+//
+// Line specification for autogeneration of Model entries using dat2drv.py:
+// // <%APDK Class:HPLIP subclass:...%>
+//
+
+
+// Include necessary files...
+#include <font.defs>
+#include <media.defs>
+
+#define VERSION "@VERSION@"
+
+// Copyright for all drivers...
+Copyright "(c) 2004-2008 Copyright Hewlett-Packard Development Company, LP"
+
+// Manufacturer - PPD spec has "HP" registered for "Hewlett-Packard"...
+Manufacturer "HP"
+
+// Driver version
+Version "hpijs $VERSION"
+
+// Custom driver
+DriverType ps
+
+// All standard fonts...
+Font *
+
+// Generate copies manually
+ManualCopies Yes
+
+// Color output
+ColorDevice Yes
+
+// 1 page per minute
+Throughput 1
+
+Attribute TTRasterizer "" Type42
+
+// CUPS filters...
+Filter "application/vnd.cups-postscript 100 @foomatic_filter@"
+Filter "application/vnd.cups-pdf 0 @foomatic_filter@"
+
+{
+ Manufacturer "Apollo"
+
+/////////////// Apollo
+{
+ // Set an up-stream hint for applications that we suppport 300/600/1200dpi.
+ Attribute "DefaultResolution" "" "300dpi"
+
+ // Custom page sizes from 1x4in to Legal
+ HWMargins 18 48.24 18 9
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 8.5in 14in
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "Apollo-P-2100 hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=300DraftColorCM&&
+Y"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft.Gray" "Quality=300DraftGr&&
+ayscaleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=300ColorCMY"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal.Gray" "Quality=300Graysc&&
+aleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High.Gray" "Quality=600x300Best&&
+GrayscaleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Photo" "Quality=300PhotoCMYcmK"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=PhotoTearOff" " -dDEVICEWIDTHPOINTS&&
+=288 -dDEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6TearOff" " -dDEVICEWIDTHPOINTS=29&&
+7 -dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD120" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMY" " -r300 -sIjsParams=Qua&&
+lity:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet=&&
+1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYK" " -r300 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftColorCMY" " -r300 -sIjsParam&&
+s=Quality:Quality=1,Quality:ColorMode=2,Quality:MediaType=0,Quality:Pe&&
+nSet=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftColorCMYK" " -r300 -sIjsPara&&
+ms=Quality:Quality=1,Quality:ColorMode=2,Quality:MediaType=0,Quality:P&&
+enSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftGrayscaleK" " -r300 -sIjs&&
+Params=Quality:Quality=1,Quality:ColorMode=0,Quality:MediaType=0,Quali&&
+ty:PenSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300GrayscaleK" " -r300 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300PhotoCMYcmK" " -r300 -sIjsParams=&&
+Quality:Quality=2,Quality:ColorMode=2,Quality:MediaType=1,Quality:PenS&&
+et=4"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600x300BestGrayscaleK" " -r600x30&&
+0 -sIjsParams=Quality:Quality=2,Quality:ColorMode=0,Quality:MediaType=&&
+0,Quality:PenSet=2"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft (Color cartridge)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ Choice "Draft.Gray/Draft Grayscale (Black cartridge)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft.Gray"
+ *Choice "Normal/Normal (Color cartridge)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "Normal.Gray/Normal Grayscale (Black cartridge)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal.Gray"
+ Choice "High.Gray/High Quality Grayscale (Black cartridge)" "%% FoomaticRIPOptionSetting: PrintoutMode=High.Gray"
+ Choice "Photo/Photo (Photo + color cartridge, photo paper)" "%% FoomaticRIPOptionSetting: PrintoutMode=Photo"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "300ColorCMY/300 dpi, Color, Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMY"
+ Choice "300ColorCMYK/300 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYK"
+ Choice "300DraftColorCMY/300 dpi, Draft, Color, Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftColorCMY"
+ Choice "300DraftColorCMYK/300 dpi, Draft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftColorCMYK"
+ Choice "300DraftGrayscaleK/300 dpi, Draft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftGrayscaleK"
+ Choice "300GrayscaleK/300 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300GrayscaleK"
+ Choice "300PhotoCMYcmK/300 dpi, Photo, Photo + Color Cartr., Premium Paper" "%% FoomaticRIPOptionSetting: Quality=300PhotoCMYcmK"
+ Choice "600x300BestGrayscaleK/600x300 dpi, Best, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=600x300BestGrayscaleK"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 9.72 48.24 9.72 9.00 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo or 5x7 inch index card" 360.00 504.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "PhotoTearOff/Photo with tear-off tab" 288.00 432.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff" "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "A6TearOff/A6 with tear-off tab" 297.00 420.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A6TearOff" "%% FoomaticRIPOptionSetting: PageSize=A6TearOff"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "CDDVD120/CD or DVD 120 mm" 360.00 360.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD120" "%% FoomaticRIPOptionSetting: PageSize=CDDVD120"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+
+ {
+ Attribute "FoomaticRIPOptionSetting" "Model=Apollo-P-2200" " -sDeviceManufacturer=&&
+&quot;APOLLO&quot; -sDeviceModel=&quot;APOLLO P-2200&quot;"
+ // <%AP2xxx:Apollo2200%>
+ }
+ {
+ Attribute "FoomaticRIPOptionSetting" "Model=Apollo-P-2100" " -sDeviceManufacturer=&&
+&quot;APOLLO&quot; -sDeviceModel=&quot;P-2000U&quot;"
+ // <%AP21xx:Apollo2000%>
+ }
+ {
+ Attribute "FoomaticRIPOptionSetting" "Model=Apollo-P-2500" " -sDeviceManufacturer=&&
+&quot;APOLLO&quot; -sDeviceModel=&quot;APOLLO P2500/2600&quot;"
+ // <%AP2560:Apollo2500%>
+ }
+} // end Apollo
+} // end Manufacturer "Apollo"
+
+{
+ // Manufacturer - PPD spec has "HP" registered for "Hewlett-Packard"...
+ Manufacturer "HP"
+
+///////// DJ9xx
+{
+ // Set an up-stream hint for applications that we suppport 300/600/1200dpi.
+ Attribute "DefaultResolution" "" "1200dpi"
+
+ // Custom page sizes from 1x4in to SuperB
+ HWMargins 18 36 18 9
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 936 1368
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-PSC_750 hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-PSC_750" " -sDeviceManufacturer=&qu&&
+ot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;DESKJET 930&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=300DraftColorCM&&
+YK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft.Gray" "Quality=300DraftGr&&
+ayscaleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=300ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal.Gray" "Quality=300Graysc&&
+aleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High" "Quality=600BestColorCMYK&&
+"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High.Gray" "Quality=600Grayscal&&
+eK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Photo" "Quality=1200PhotoCMYK"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=PhotoTearOff" " -dDEVICEWIDTHPOINTS&&
+=288 -dDEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6TearOff" " -dDEVICEWIDTHPOINTS=29&&
+7 -dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD120" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ ////////// Large format paper support
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B4JIS" " -dDEVICEWIDTHPOINTS=729 -d&&
+DEVICEHEIGHTPOINTS=1033"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Ledger" " -dDEVICEWIDTHPOINTS=792 -&&
+dDEVICEHEIGHTPOINTS=1224"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=SuperB" " -dDEVICEWIDTHPOINTS=936 -&&
+dDEVICEHEIGHTPOINTS=1368"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w774h1116" " -dDEVICEWIDTHPOINTS=77&&
+4 -dDEVICEHEIGHTPOINTS=1116"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A3" " -dDEVICEWIDTHPOINTS=842 -dDEV&&
+ICEHEIGHTPOINTS=1190"
+ Attribute "FoomaticRIPOption" "Duplex" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexNoTumble" " -dDuplex=true -dTum&&
+ble=false"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexTumble" " -dDuplex=true -dTumbl&&
+e=true"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=None" " -dDuplex=false"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300BestColorCMYK" " -r300 -sIjsParam&&
+s=Quality:Quality=2,Quality:ColorMode=2,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYK" " -r300 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftColorCMYK" " -r300 -sIjsPara&&
+ms=Quality:Quality=1,Quality:ColorMode=2,Quality:MediaType=0,Quality:P&&
+enSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftGrayscaleK" " -r300 -sIjsPar&&
+ams=Quality:Quality=1,Quality:ColorMode=0,Quality:MediaType=0,Quality:&&
+PenSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300GrayscaleK" " -r300 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300PhotoCMYK" " -r300 -sIjsParams=Qu&&
+ality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600BestColorCMYK" " -r600 -sIjsParam&&
+s=Quality:Quality=2,Quality:ColorMode=2,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600GrayscaleK" " -r600 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600PhotoCMYK" " -r600 -sIjsParams=Qu&&
+ality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=1200PhotoCMYK" " -r1200 -sIjsParams=&&
+Quality:Quality=3,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenS&&
+et=2"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ Choice "Draft.Gray/Draft Grayscale" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft.Gray"
+ *Choice "Normal/Normal" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "Normal.Gray/Normal Grayscale" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal.Gray"
+ Choice "High/High Quality" "%% FoomaticRIPOptionSetting: PrintoutMode=High"
+ Choice "High.Gray/High Quality Grayscale" "%% FoomaticRIPOptionSetting: PrintoutMode=High.Gray"
+ Choice "Photo/Photo (on photo paper)" "%% FoomaticRIPOptionSetting: PrintoutMode=Photo"
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 120.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "%% FoomaticRIPOptionSetting: Duplex=DuplexNoTumble"
+ Choice "DuplexTumble/Short Edge (Flip)" "%% FoomaticRIPOptionSetting: Duplex=DuplexTumble"
+ *Choice "None/Off" "%% FoomaticRIPOptionSetting: Duplex=None"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "300BestColorCMYK/300 dpi, Best, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300BestColorCMYK"
+ Choice "300ColorCMYK/300 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYK"
+ Choice "300DraftColorCMYK/300 dpi, Draft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftColorCMYK"
+ Choice "300DraftGrayscaleK/300 dpi, Draft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftGrayscaleK"
+ Choice "300GrayscaleK/300 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300GrayscaleK"
+ Choice "300PhotoCMYK/300 dpi, Photo, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=300PhotoCMYK"
+ Choice "600BestColorCMYK/600 dpi, Best, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600BestColorCMYK"
+ Choice "600GrayscaleK/600 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=600GrayscaleK"
+ Choice "600PhotoCMYK/600 dpi, Photo, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=600PhotoCMYK"
+ Choice "1200PhotoCMYK/1200 dpi, Photo, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=1200PhotoCMYK"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 9.72 36.00 9.72 9.00 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo or 5x7 inch index card" 360.00 504.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "PhotoTearOff/Photo with tear-off tab" 288.00 432.00 9.00 9.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff" "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "A6TearOff/A6 with tear-off tab" 297.00 420.00 9.00 0.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A6TearOff" "%% FoomaticRIPOptionSetting: PageSize=A6TearOff"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "CDDVD120/CD or DVD 120 mm" 360.00 360.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD120" "%% FoomaticRIPOptionSetting: PageSize=CDDVD120"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+
+ // <%DJ9xx:Normal%>
+ {
+ // Large format SuperB paper support
+ CustomMedia "B4JIS/B4 (JIS)" 729.00 1033.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B4JIS" "%% FoomaticRIPOptionSetting: PageSize=B4JIS"
+ CustomMedia "Ledger/Ledger" 792.00 1224.00 14.40 36.00 14.40 9.00 "%% FoomaticRIPOptionSetting: PageSize=Ledger" "%% FoomaticRIPOptionSetting: PageSize=Ledger"
+ CustomMedia "SuperB/Super B" 936.00 1368.00 14.40 36.00 14.40 9.00 "%% FoomaticRIPOptionSetting: PageSize=SuperB" "%% FoomaticRIPOptionSetting: PageSize=SuperB"
+ CustomMedia "w774h1116/8K" 774.00 1116.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w774h1116" "%% FoomaticRIPOptionSetting: PageSize=w774h1116"
+ CustomMedia "A3/A3" 842.00 1190.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A3" "%% FoomaticRIPOptionSetting: PageSize=A3"
+ // <%DJ9xx:LargeFormatSuperB%>
+ }
+} // end DJ9xx
+
+/////////// DJ9xx but without photo modes
+{
+ // Set an up-stream hint for applications that we suppport 300/600/1200dpi.
+ Attribute "DefaultResolution" "" "600dpi"
+
+ // Custom page sizes from 1x4in to SuperB
+ HWMargins 18 36 18 9
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 936 1368
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-PSC_750 hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-PSC_750" " -sDeviceManufacturer=&qu&&
+ot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;DESKJET 930&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=300DraftColorCM&&
+YK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft.Gray" "Quality=300DraftGr&&
+ayscaleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=300ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal.Gray" "Quality=300Graysc&&
+aleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High" "Quality=600BestColorCMYK&&
+"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High.Gray" "Quality=600Grayscal&&
+eK"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=PhotoTearOff" " -dDEVICEWIDTHPOINTS&&
+=288 -dDEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6TearOff" " -dDEVICEWIDTHPOINTS=29&&
+7 -dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD120" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ ///////// Large format paper support
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B4JIS" " -dDEVICEWIDTHPOINTS=729 -d&&
+DEVICEHEIGHTPOINTS=1033"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Ledger" " -dDEVICEWIDTHPOINTS=792 -&&
+dDEVICEHEIGHTPOINTS=1224"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=SuperB" " -dDEVICEWIDTHPOINTS=936 -&&
+dDEVICEHEIGHTPOINTS=1368"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w774h1116" " -dDEVICEWIDTHPOINTS=77&&
+4 -dDEVICEHEIGHTPOINTS=1116"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A3" " -dDEVICEWIDTHPOINTS=842 -dDEV&&
+ICEHEIGHTPOINTS=1190"
+ Attribute "FoomaticRIPOption" "Duplex" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexNoTumble" " -dDuplex=true -dTum&&
+ble=false"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexTumble" " -dDuplex=true -dTumbl&&
+e=true"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=None" " -dDuplex=false"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300BestColorCMYK" " -r300 -sIjsParam&&
+s=Quality:Quality=2,Quality:ColorMode=2,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYK" " -r300 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftColorCMYK" " -r300 -sIjsPara&&
+ms=Quality:Quality=1,Quality:ColorMode=2,Quality:MediaType=0,Quality:P&&
+enSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftGrayscaleK" " -r300 -sIjsPar&&
+ams=Quality:Quality=1,Quality:ColorMode=0,Quality:MediaType=0,Quality:&&
+PenSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300GrayscaleK" " -r300 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300PhotoCMYK" " -r300 -sIjsParams=Qu&&
+ality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600BestColorCMYK" " -r600 -sIjsParam&&
+s=Quality:Quality=2,Quality:ColorMode=2,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600GrayscaleK" " -r600 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600PhotoCMYK" " -r600 -sIjsParams=Qu&&
+ality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=1200PhotoCMYK" " -r1200 -sIjsParams=&&
+Quality:Quality=3,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenS&&
+et=2"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ Choice "Draft.Gray/Draft Grayscale" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft.Gray"
+ *Choice "Normal/Normal" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "Normal.Gray/Normal Grayscale" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal.Gray"
+ Choice "High/High Quality" "%% FoomaticRIPOptionSetting: PrintoutMode=High"
+ Choice "High.Gray/High Quality Grayscale" "%% FoomaticRIPOptionSetting: PrintoutMode=High.Gray"
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 120.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "%% FoomaticRIPOptionSetting: Duplex=DuplexNoTumble"
+ Choice "DuplexTumble/Short Edge (Flip)" "%% FoomaticRIPOptionSetting: Duplex=DuplexTumble"
+ *Choice "None/Off" "%% FoomaticRIPOptionSetting: Duplex=None"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "300BestColorCMYK/300 dpi, Best, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300BestColorCMYK"
+ Choice "300ColorCMYK/300 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYK"
+ Choice "300DraftColorCMYK/300 dpi, Draft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftColorCMYK"
+ Choice "300DraftGrayscaleK/300 dpi, Draft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftGrayscaleK"
+ Choice "300GrayscaleK/300 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300GrayscaleK"
+ Choice "600BestColorCMYK/600 dpi, Best, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600BestColorCMYK"
+ Choice "600GrayscaleK/600 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=600GrayscaleK"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 9.72 36.00 9.72 9.00 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo or 5x7 inch index card" 360.00 504.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "PhotoTearOff/Photo with tear-off tab" 288.00 432.00 9.00 9.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff" "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "A6TearOff/A6 with tear-off tab" 297.00 420.00 9.00 0.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A6TearOff" "%% FoomaticRIPOptionSetting: PageSize=A6TearOff"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "CDDVD120/CD or DVD 120 mm" 360.00 360.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD120" "%% FoomaticRIPOptionSetting: PageSize=CDDVD120"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+ // <%DJ9xx:NoPhotoMode%>
+ {
+ // Large format SuperB paper support
+ CustomMedia "B4JIS/B4 (JIS)" 729.00 1033.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B4JIS" "%% FoomaticRIPOptionSetting: PageSize=B4JIS"
+ CustomMedia "Ledger/Ledger" 792.00 1224.00 14.40 36.00 14.40 9.00 "%% FoomaticRIPOptionSetting: PageSize=Ledger" "%% FoomaticRIPOptionSetting: PageSize=Ledger"
+ CustomMedia "SuperB/Super B" 936.00 1368.00 14.40 36.00 14.40 9.00 "%% FoomaticRIPOptionSetting: PageSize=SuperB" "%% FoomaticRIPOptionSetting: PageSize=SuperB"
+ CustomMedia "w774h1116/8K" 774.00 1116.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w774h1116" "%% FoomaticRIPOptionSetting: PageSize=w774h1116"
+ CustomMedia "A3/A3" 842.00 1190.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A3" "%% FoomaticRIPOptionSetting: PageSize=A3"
+ // <%DJ9xx:NoPhotoMode:LargeFormatSuperB%>
+ }
+} // end DJ9xx but without photo modes
+
+///////// DJ9xx but without photo/hires/best color modes
+{
+ // Set an up-stream hint for applications that we suppport 300/600/1200dpi.
+ Attribute "DefaultResolution" "" "600dpi"
+
+ // Custom page sizes from 1x4in to SuperB
+ HWMargins 18 36 18 9
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 936 1368
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-PSC_750 hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-PSC_750" " -sDeviceManufacturer=&qu&&
+ot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;DESKJET 930&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=300DraftColorCM&&
+YK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft.Gray" "Quality=300DraftGr&&
+ayscaleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=300ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal.Gray" "Quality=300Graysc&&
+aleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High" "Quality=600BestColorCMYK&&
+"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High.Gray" "Quality=600Grayscal&&
+eK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Photo" "Quality=600PhotoCMYK"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=PhotoTearOff" " -dDEVICEWIDTHPOINTS&&
+=288 -dDEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6TearOff" " -dDEVICEWIDTHPOINTS=29&&
+7 -dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD120" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ /////////// Large format paper support
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B4JIS" " -dDEVICEWIDTHPOINTS=729 -d&&
+DEVICEHEIGHTPOINTS=1033"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Ledger" " -dDEVICEWIDTHPOINTS=792 -&&
+dDEVICEHEIGHTPOINTS=1224"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=SuperB" " -dDEVICEWIDTHPOINTS=936 -&&
+dDEVICEHEIGHTPOINTS=1368"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w774h1116" " -dDEVICEWIDTHPOINTS=77&&
+4 -dDEVICEHEIGHTPOINTS=1116"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A3" " -dDEVICEWIDTHPOINTS=842 -dDEV&&
+ICEHEIGHTPOINTS=1190"
+ Attribute "FoomaticRIPOption" "Duplex" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexNoTumble" " -dDuplex=true -dTum&&
+ble=false"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexTumble" " -dDuplex=true -dTumbl&&
+e=true"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=None" " -dDuplex=false"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300BestColorCMYK" " -r300 -sIjsParam&&
+s=Quality:Quality=2,Quality:ColorMode=2,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYK" " -r300 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftColorCMYK" " -r300 -sIjsPara&&
+ms=Quality:Quality=1,Quality:ColorMode=2,Quality:MediaType=0,Quality:P&&
+enSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftGrayscaleK" " -r300 -sIjsPar&&
+ams=Quality:Quality=1,Quality:ColorMode=0,Quality:MediaType=0,Quality:&&
+PenSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300GrayscaleK" " -r300 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300PhotoCMYK" " -r300 -sIjsParams=Qu&&
+ality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600BestColorCMYK" " -r600 -sIjsParam&&
+s=Quality:Quality=2,Quality:ColorMode=2,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600GrayscaleK" " -r600 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600PhotoCMYK" " -r600 -sIjsParams=Qu&&
+ality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenSet&&
+=2"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ Choice "Draft.Gray/Draft Grayscale" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft.Gray"
+ *Choice "Normal/Normal" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "Normal.Gray/Normal Grayscale" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal.Gray"
+ Choice "High/High Quality" "%% FoomaticRIPOptionSetting: PrintoutMode=High"
+ Choice "High.Gray/High Quality Grayscale" "%% FoomaticRIPOptionSetting: PrintoutMode=High.Gray"
+ Choice "Photo/Photo (on photo paper)" "%% FoomaticRIPOptionSetting: PrintoutMode=Photo"
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 120.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "%% FoomaticRIPOptionSetting: Duplex=DuplexNoTumble"
+ Choice "DuplexTumble/Short Edge (Flip)" "%% FoomaticRIPOptionSetting: Duplex=DuplexTumble"
+ *Choice "None/Off" "%% FoomaticRIPOptionSetting: Duplex=None"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "300BestColorCMYK/300 dpi, Best, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300BestColorCMYK"
+ Choice "300ColorCMYK/300 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYK"
+ Choice "300DraftColorCMYK/300 dpi, Draft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftColorCMYK"
+ Choice "300DraftGrayscaleK/300 dpi, Draft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftGrayscaleK"
+ Choice "300GrayscaleK/300 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300GrayscaleK"
+ Choice "300PhotoCMYK/300 dpi, Photo, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=300PhotoCMYK"
+ Choice "600BestColorCMYK/600 dpi, Best, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600BestColorCMYK"
+ Choice "600GrayscaleK/600 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=600GrayscaleK"
+ Choice "600PhotoCMYK/600 dpi, Photo, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=600PhotoCMYK"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 9.72 36.00 9.72 9.00 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo or 5x7 inch index card" 360.00 504.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "PhotoTearOff/Photo with tear-off tab" 288.00 432.00 9.00 9.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff" "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "A6TearOff/A6 with tear-off tab" 297.00 420.00 9.00 0.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A6TearOff" "%% FoomaticRIPOptionSetting: PageSize=A6TearOff"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "CDDVD120/CD or DVD 120 mm" 360.00 360.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD120" "%% FoomaticRIPOptionSetting: PageSize=CDDVD120"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+
+ // Large format SuperB paper support
+ CustomMedia "B4JIS/B4 (JIS)" 729.00 1033.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B4JIS" "%% FoomaticRIPOptionSetting: PageSize=B4JIS"
+ CustomMedia "Ledger/Ledger" 792.00 1224.00 14.40 36.00 14.40 9.00 "%% FoomaticRIPOptionSetting: PageSize=Ledger" "%% FoomaticRIPOptionSetting: PageSize=Ledger"
+ CustomMedia "SuperB/Super B" 936.00 1368.00 14.40 36.00 14.40 9.00 "%% FoomaticRIPOptionSetting: PageSize=SuperB" "%% FoomaticRIPOptionSetting: PageSize=SuperB"
+ CustomMedia "w774h1116/8K" 774.00 1116.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w774h1116" "%% FoomaticRIPOptionSetting: PageSize=w774h1116"
+ CustomMedia "A3/A3" 842.00 1190.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A3" "%% FoomaticRIPOptionSetting: PageSize=A3"
+ // <%DJ9xx:LargeFormatSuperB:NoPhotoBestHiresModes%>
+} // DJ9xx but without photo/hires/best color modes
+
+//////// DJ9xxVIP
+{
+ Attribute "DefaultResolution" "" "1200dpi"
+
+ // Custom page sizes from 1x4in to SuperB
+ HWMargins 18 36 18 9
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 936 1368
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-DeskJet_990C hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-DeskJet_990C" " -sDeviceManufacture&&
+r=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;DESKJET 990&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=300DraftColorCM&&
+YK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft.Gray" "Quality=300DraftGr&&
+ayscaleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=300ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal.Gray" "Quality=300Graysc&&
+aleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High" "Quality=600ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High.Gray" "Quality=600Grayscal&&
+eK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Photo" "Quality=1200PhotoCMYK"
+ Attribute "FoomaticRIPOption" "InputSlot" "enum CmdLine C"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Default" ",PS:MediaPosition=7"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=PhotoTray" ",PS:MediaPosition=6"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Upper" ",PS:MediaPosition=1"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Lower" ",PS:MediaPosition=4"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=CDDVDTray" ",PS:MediaPosition=14"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Envelope" ",PS:MediaPosition=3"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=LargeCapacity" ",PS:MediaPosition=&&
+5"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Manual" ",PS:MediaPosition=2"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=MPTray" ",PS:MediaPosition=8"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=PhotoTearOff" " -dDEVICEWIDTHPOINTS&&
+=288 -dDEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6TearOff" " -dDEVICEWIDTHPOINTS=29&&
+7 -dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD120" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ /////////// Large format paper support
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B4JIS" " -dDEVICEWIDTHPOINTS=729 -d&&
+DEVICEHEIGHTPOINTS=1033"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Ledger" " -dDEVICEWIDTHPOINTS=792 -&&
+dDEVICEHEIGHTPOINTS=1224"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=SuperB" " -dDEVICEWIDTHPOINTS=936 -&&
+dDEVICEHEIGHTPOINTS=1368"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w774h1116" " -dDEVICEWIDTHPOINTS=77&&
+4 -dDEVICEHEIGHTPOINTS=1116"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A3" " -dDEVICEWIDTHPOINTS=842 -dDEV&&
+ICEHEIGHTPOINTS=1190"
+ Attribute "FoomaticRIPOption" "Duplex" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexNoTumble" " -dDuplex=true -dTum&&
+ble=false"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexTumble" " -dDuplex=true -dTumbl&&
+e=true"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=None" " -dDuplex=false"
+ Attribute "FoomaticRIPOption" "DryTime" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Zero" ""
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Five" ",DryTime=5"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Ten" ",DryTime=10"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Fifteen" ",DryTime=15"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Twenty" ",DryTime=20"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=TwentyFive" ",DryTime=25"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Thirty" ",DryTime=30"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYK" " -r300 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftColorCMYK" " -r300 -sIjsPara&&
+ms=Quality:Quality=1,Quality:ColorMode=2,Quality:MediaType=0,Quality:P&&
+enSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftGrayscaleK" " -r300 -sIjs&&
+Params=Quality:Quality=1,Quality:ColorMode=0,Quality:MediaType=0,Quali&&
+ty:PenSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300GrayscaleK" " -r300 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMYK" " -r600 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600GrayscaleK" " -r600 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600PhotoCMYK" " -r600 -sIjsParams=Qu&&
+ality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=1200PhotoCMYK" " -r1200 -sIjsParams=&&
+Quality:Quality=3,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenS&&
+et=2"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ Choice "Draft.Gray/Draft Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft.Gray"
+ *Choice "Normal/Normal (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "Normal.Gray/Normal Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal.Gray"
+ Choice "High/High Quality (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=High"
+ Choice "High.Gray/High Quality Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=High.Gray"
+ Choice "Photo/Photo (on photo paper)" "%% FoomaticRIPOptionSetting: PrintoutMode=Photo"
+ Option "InputSlot/Media Source" PickOne AnySetup 100.0
+ *Choice "Default/Printer default" "%% FoomaticRIPOptionSetting: InputSlot=Default"
+ Choice "PhotoTray/Photo Tray" "%% FoomaticRIPOptionSetting: InputSlot=PhotoTray"
+ Choice "Upper/Upper Tray" "%% FoomaticRIPOptionSetting: InputSlot=Upper"
+ Choice "Lower/Lower Tray" "%% FoomaticRIPOptionSetting: InputSlot=Lower"
+ Choice "CDDVDTray/CD or DVD Tray" "%% FoomaticRIPOptionSetting: InputSlot=CDDVDTray"
+ Choice "Envelope/Envelope Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Envelope"
+ Choice "LargeCapacity/Large Capacity Tray" "%% FoomaticRIPOptionSetting: InputSlot=LargeCapacity"
+ Choice "Manual/Manual Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Manual"
+ Choice "MPTray/Multi Purpose Tray" "%% FoomaticRIPOptionSetting: InputSlot=MPTray"
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 120.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "%% FoomaticRIPOptionSetting: Duplex=DuplexNoTumble"
+ Choice "DuplexTumble/Short Edge (Flip)" "%% FoomaticRIPOptionSetting: Duplex=DuplexTumble"
+ *Choice "None/Off" "%% FoomaticRIPOptionSetting: Duplex=None"
+ Option "DryTime/Additional Dry Time" PickOne AnySetup 120.0
+ *Choice "Zero/Printer Default" "%% FoomaticRIPOptionSetting: DryTime=Zero"
+ Choice "Five/5 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Five"
+ Choice "Ten/10 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Ten"
+ Choice "Fifteen/15 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Fifteen"
+ Choice "Twenty/20 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Twenty"
+ Choice "TwentyFive/25 Seconds" "%% FoomaticRIPOptionSetting: DryTime=TwentyFive"
+ Choice "Thirty/30 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Thirty"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "300ColorCMYK/300 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYK"
+ Choice "300DraftColorCMYK/300 dpi, Draft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftColorCMYK"
+ Choice "300DraftGrayscaleK/300 dpi, Draft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftGrayscaleK"
+ Choice "300GrayscaleK/300 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300GrayscaleK"
+ Choice "600ColorCMYK/600 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMYK"
+ Choice "600GrayscaleK/600 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=600GrayscaleK"
+ Choice "600PhotoCMYK/600 dpi, Photo, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=600PhotoCMYK"
+ Choice "1200PhotoCMYK/1200 dpi, Photo, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=1200PhotoCMYK"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 9.72 36.00 9.72 9.00 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo or 5x7 inch index card" 360.00 504.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "PhotoTearOff/Photo with tear-off tab" 288.00 432.00 9.00 9.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff" "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "A6TearOff/A6 with tear-off tab" 297.00 420.00 9.00 0.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A6TearOff" "%% FoomaticRIPOptionSetting: PageSize=A6TearOff"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "CDDVD120/CD or DVD 120 mm" 360.00 360.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD120" "%% FoomaticRIPOptionSetting: PageSize=CDDVD120"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+ // <%DJ9xxVIP:Normal%>
+ {
+ // Large format SuperB paper support
+ CustomMedia "B4JIS/B4 (JIS)" 729.00 1033.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B4JIS" "%% FoomaticRIPOptionSetting: PageSize=B4JIS"
+ CustomMedia "Ledger/Ledger" 792.00 1224.00 14.40 36.00 14.40 9.00 "%% FoomaticRIPOptionSetting: PageSize=Ledger" "%% FoomaticRIPOptionSetting: PageSize=Ledger"
+ CustomMedia "SuperB/Super B" 936.00 1368.00 14.40 36.00 14.40 9.00 "%% FoomaticRIPOptionSetting: PageSize=SuperB" "%% FoomaticRIPOptionSetting: PageSize=SuperB"
+ CustomMedia "w774h1116/8K" 774.00 1116.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w774h1116" "%% FoomaticRIPOptionSetting: PageSize=w774h1116"
+ CustomMedia "A3/A3" 842.00 1190.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A3" "%% FoomaticRIPOptionSetting: PageSize=A3"
+ // <%DJ9xxVIP:LargeFormatSuperB%>
+ }
+} // end DJ9xxVIP
+
+//////// DJ9xxVIP but without 1200-dpi mode and without paper type sensor
+{
+ Attribute "DefaultResolution" "" "600dpi"
+
+ // Custom page sizes from 1x4in to Legal
+ HWMargins 18 36 18 9
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 8.5in 14in
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-DeskJet_990C hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-DeskJet_990C" " -sDeviceManufacture&&
+r=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;DESKJET 990&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=300DraftColorCM&&
+YK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft.Gray" "Quality=300DraftGr&&
+ayscaleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=300ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal.Gray" "Quality=300Graysc&&
+aleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High" "Quality=600ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High.Gray" "Quality=600Grayscal&&
+eK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Photo" "Quality=600PhotoCMYK"
+ Attribute "FoomaticRIPOption" "InputSlot" "enum CmdLine C"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Default" ",PS:MediaPosition=7"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=PhotoTray" ",PS:MediaPosition=6"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Upper" ",PS:MediaPosition=1"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Lower" ",PS:MediaPosition=4"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=CDDVDTray" ",PS:MediaPosition=14"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Envelope" ",PS:MediaPosition=3"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=LargeCapacity" ",PS:MediaPosition=&&
+5"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Manual" ",PS:MediaPosition=2"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=MPTray" ",PS:MediaPosition=8"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=PhotoTearOff" " -dDEVICEWIDTHPOINTS&&
+=288 -dDEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6TearOff" " -dDEVICEWIDTHPOINTS=29&&
+7 -dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD120" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ Attribute "FoomaticRIPOption" "Duplex" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexNoTumble" " -dDuplex=true -dTum&&
+ble=false"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexTumble" " -dDuplex=true -dTumbl&&
+e=true"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=None" " -dDuplex=false"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYK" " -r300 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftColorCMYK" " -r300 -sIjsPara&&
+ms=Quality:Quality=1,Quality:ColorMode=2,Quality:MediaType=0,Quality:P&&
+enSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftGrayscaleK" " -r300 -sIjs&&
+Params=Quality:Quality=1,Quality:ColorMode=0,Quality:MediaType=0,Quali&&
+ty:PenSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300GrayscaleK" " -r300 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMYK" " -r600 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600GrayscaleK" " -r600 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600PhotoCMYK" " -r600 -sIjsParams=Qu&&
+ality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenSet&&
+=2"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ Choice "Draft.Gray/Draft Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft.Gray"
+ *Choice "Normal/Normal (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "Normal.Gray/Normal Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal.Gray"
+ Choice "High/High Quality (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=High"
+ Choice "High.Gray/High Quality Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=High.Gray"
+ Choice "Photo/Photo (on photo paper)" "%% FoomaticRIPOptionSetting: PrintoutMode=Photo"
+ Option "InputSlot/Media Source" PickOne AnySetup 100.0
+ *Choice "Default/Printer default" "%% FoomaticRIPOptionSetting: InputSlot=Default"
+ Choice "PhotoTray/Photo Tray" "%% FoomaticRIPOptionSetting: InputSlot=PhotoTray"
+ Choice "Upper/Upper Tray" "%% FoomaticRIPOptionSetting: InputSlot=Upper"
+ Choice "Lower/Lower Tray" "%% FoomaticRIPOptionSetting: InputSlot=Lower"
+ Choice "CDDVDTray/CD or DVD Tray" "%% FoomaticRIPOptionSetting: InputSlot=CDDVDTray"
+ Choice "Envelope/Envelope Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Envelope"
+ Choice "LargeCapacity/Large Capacity Tray" "%% FoomaticRIPOptionSetting: InputSlot=LargeCapacity"
+ Choice "Manual/Manual Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Manual"
+ Choice "MPTray/Multi Purpose Tray" "%% FoomaticRIPOptionSetting: InputSlot=MPTray"
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 120.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "%% FoomaticRIPOptionSetting: Duplex=DuplexNoTumble"
+ Choice "DuplexTumble/Short Edge (Flip)" "%% FoomaticRIPOptionSetting: Duplex=DuplexTumble"
+ *Choice "None/Off" "%% FoomaticRIPOptionSetting: Duplex=None"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "300ColorCMYK/300 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYK"
+ Choice "300DraftColorCMYK/300 dpi, Draft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftColorCMYK"
+ Choice "300DraftGrayscaleK/300 dpi, Draft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftGrayscaleK"
+ Choice "300GrayscaleK/300 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300GrayscaleK"
+ Choice "600ColorCMYK/600 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMYK"
+ Choice "600GrayscaleK/600 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=600GrayscaleK"
+ Choice "600PhotoCMYK/600 dpi, Photo, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=600PhotoCMYK"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 9.72 36.00 9.72 9.00 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo or 5x7 inch index card" 360.00 504.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "PhotoTearOff/Photo with tear-off tab" 288.00 432.00 9.00 9.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff" "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "A6TearOff/A6 with tear-off tab" 297.00 420.00 9.00 0.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A6TearOff" "%% FoomaticRIPOptionSetting: PageSize=A6TearOff"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "CDDVD120/CD or DVD 120 mm" 360.00 360.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD120" "%% FoomaticRIPOptionSetting: PageSize=CDDVD120"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+ // <%DJ9xxVIP:No1200dpiNoSensor%>
+} // end DJ9xxVIP but without 1200-dpi mode and without paper type sensor
+
+////////// DJ55xx (a VIP)
+{
+ Attribute "DefaultResolution" "" "1200dpi"
+
+ // Custom page sizes from 1x4in to Legal
+ HWMargins 18 36 18 9
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 8.5in 14in
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-DeskJet_5550 hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-DeskJet_5550" " -sDeviceManufacture&&
+r=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;deskjet 5550&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=300FastDraftCol&&
+orCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft.Gray" "Quality=300FastDra&&
+ftGrayscaleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=300ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal.Gray" "Quality=300Graysc&&
+aleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High" "Quality=600ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High.Gray" "Quality=600Grayscal&&
+eK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Photo" "Quality=1200PhotoCMYKFu&&
+llBleed"
+ Attribute "FoomaticRIPOption" "InputSlot" "enum CmdLine C"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Default" ",PS:MediaPosition=7"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=PhotoTray" ",PS:MediaPosition=6"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Upper" ",PS:MediaPosition=1"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Lower" ",PS:MediaPosition=4"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=CDDVDTray" ",PS:MediaPosition=14"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Envelope" ",PS:MediaPosition=3"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=LargeCapacity" ",PS:MediaPosition=&&
+5"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Manual" ",PS:MediaPosition=2"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=MPTray" ",PS:MediaPosition=8"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=PhotoTearOff" " -dDEVICEWIDTHPOINTS&&
+=288 -dDEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6TearOff" " -dDEVICEWIDTHPOINTS=29&&
+7 -dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD120" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ Attribute "FoomaticRIPOption" "Duplex" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexNoTumble" " -dDuplex=true -dTum&&
+ble=false"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexTumble" " -dDuplex=true -dTumbl&&
+e=true"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=None" " -dDuplex=false"
+ Attribute "FoomaticRIPOption" "DryTime" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Zero" ""
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Five" ",DryTime=5"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Ten" ",DryTime=10"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Fifteen" ",DryTime=15"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Twenty" ",DryTime=20"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=TwentyFive" ",DryTime=25"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Thirty" ",DryTime=30"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYK" " -r300 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYKFullBleed" " -r300 -sIjs&&
+Params=Quality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:FullBleed=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftColorCMYK" " -r300 -sIjsPara&&
+ms=Quality:Quality=1,Quality:ColorMode=2,Quality:MediaType=0,Quality:P&&
+enSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftGrayscaleK" " -r300 -sIjs&&
+Params=Quality:Quality=1,Quality:ColorMode=0,Quality:MediaType=0,Quali&&
+ty:PenSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300FastDraftColorCMYK" " -r300 -sIjs&&
+Params=Quality:Quality=4,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:SpeedMech=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300FastDraftGrayscaleK" " -r300 -&&
+sIjsParams=Quality:Quality=4,Quality:ColorMode=0,Quality:MediaType=0,Q&&
+uality:PenSet=2,Quality:SpeedMech=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300GrayscaleK" " -r300 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMYK" " -r600 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMYKFullBleed" " -r600 -sIjs&&
+Params=Quality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:FullBleed=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600GrayscaleK" " -r600 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=1200PhotoCMYK" " -r1200 -sIjsParams=&&
+Quality:Quality=3,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenS&&
+et=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=1200PhotoCMYKFullBleed" " -r1200 -sI&&
+jsParams=Quality:Quality=3,Quality:ColorMode=2,Quality:MediaType=2,Qua&&
+lity:PenSet=2,Quality:FullBleed=1"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ Choice "Draft.Gray/Draft Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft.Gray"
+ *Choice "Normal/Normal (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "Normal.Gray/Normal Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal.Gray"
+ Choice "High/High Quality (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=High"
+ Choice "High.Gray/High Quality Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=High.Gray"
+ Choice "Photo/Photo (on photo paper)" "%% FoomaticRIPOptionSetting: PrintoutMode=Photo"
+ Option "InputSlot/Media Source" PickOne AnySetup 100.0
+ *Choice "Default/Printer default" "%% FoomaticRIPOptionSetting: InputSlot=Default"
+ Choice "PhotoTray/Photo Tray" "%% FoomaticRIPOptionSetting: InputSlot=PhotoTray"
+ Choice "Upper/Upper Tray" "%% FoomaticRIPOptionSetting: InputSlot=Upper"
+ Choice "Lower/Lower Tray" "%% FoomaticRIPOptionSetting: InputSlot=Lower"
+ Choice "CDDVDTray/CD or DVD Tray" "%% FoomaticRIPOptionSetting: InputSlot=CDDVDTray"
+ Choice "Envelope/Envelope Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Envelope"
+ Choice "LargeCapacity/Large Capacity Tray" "%% FoomaticRIPOptionSetting: InputSlot=LargeCapacity"
+ Choice "Manual/Manual Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Manual"
+ Choice "MPTray/Multi Purpose Tray" "%% FoomaticRIPOptionSetting: InputSlot=MPTray"
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 120.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "%% FoomaticRIPOptionSetting: Duplex=DuplexNoTumble"
+ Choice "DuplexTumble/Short Edge (Flip)" "%% FoomaticRIPOptionSetting: Duplex=DuplexTumble"
+ *Choice "None/Off" "%% FoomaticRIPOptionSetting: Duplex=None"
+ Option "DryTime/Additional Dry Time" PickOne AnySetup 120.0
+ *Choice "Zero/Printer Default" "%% FoomaticRIPOptionSetting: DryTime=Zero"
+ Choice "Five/5 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Five"
+ Choice "Ten/10 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Ten"
+ Choice "Fifteen/15 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Fifteen"
+ Choice "Twenty/20 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Twenty"
+ Choice "TwentyFive/25 Seconds" "%% FoomaticRIPOptionSetting: DryTime=TwentyFive"
+ Choice "Thirty/30 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Thirty"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "300ColorCMYK/300 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYK"
+ Choice "300ColorCMYKFullBleed/300 dpi, Color, Full Bleed, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYKFullBleed"
+ Choice "300DraftColorCMYK/300 dpi, Draft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftColorCMYK"
+ Choice "300DraftGrayscaleK/300 dpi, Draft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftGrayscaleK"
+ Choice "300FastDraftColorCMYK/300 dpi, FastDraft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300FastDraftColorCMYK"
+ Choice "300FastDraftGrayscaleK/300 dpi, FastDraft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300FastDraftGrayscaleK"
+ Choice "300GrayscaleK/300 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300GrayscaleK"
+ Choice "600ColorCMYK/600 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMYK"
+ Choice "600ColorCMYKFullBleed/600 dpi, Color, Full Bleed, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMYKFullBleed"
+ Choice "600GrayscaleK/600 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=600GrayscaleK"
+ Choice "1200PhotoCMYK/1200 dpi, Photo, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=1200PhotoCMYK"
+ Choice "1200PhotoCMYKFullBleed/1200 dpi, Photo, Full Bleed, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=1200PhotoCMYKFullBleed"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 9.72 36.00 9.72 9.00 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo or 5x7 inch index card" 360.00 504.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "PhotoTearOff/Photo with tear-off tab" 288.00 432.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff" "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "A6TearOff/A6 with tear-off tab" 297.00 420.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=A6TearOff" "%% FoomaticRIPOptionSetting: PageSize=A6TearOff"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "CDDVD120/CD or DVD 120 mm" 360.00 360.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD120" "%% FoomaticRIPOptionSetting: PageSize=CDDVD120"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+ // <%DJ55xx:Normal%>
+} // end DJ55xx
+
+/////////////// DJGenericVIP
+{
+ Attribute "DefaultResolution" "" "600dpi"
+
+ // Custom page sizes from 1x4in to SuperB
+ HWMargins 18 36 18 9
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 936 1368
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-DeskJet_5650 hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-DeskJet_5650" " -sDeviceManufacture&&
+r=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;deskjet 5600&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=300FastDraftCol&&
+orCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft.Gray" "Quality=300FastDra&&
+ftGrayscaleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=300ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal.Gray" "Quality=300Graysc&&
+aleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High" "Quality=600ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High.Gray" "Quality=600Grayscal&&
+eK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Photo" "Quality=600PhotoCMYKFu&&
+llBleed"
+ Attribute "FoomaticRIPOption" "InputSlot" "enum CmdLine C"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Default" ",PS:MediaPosition=7"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=PhotoTray" ",PS:MediaPosition=6"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Upper" ",PS:MediaPosition=1"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Lower" ",PS:MediaPosition=4"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=CDDVDTray" ",PS:MediaPosition=14"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Envelope" ",PS:MediaPosition=3"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=LargeCapacity" ",PS:MediaPosition=&&
+5"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Manual" ",PS:MediaPosition=2"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=MPTray" ",PS:MediaPosition=8"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=PhotoTearOff" " -dDEVICEWIDTHPOINTS&&
+=288 -dDEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6TearOff" " -dDEVICEWIDTHPOINTS=29&&
+7 -dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD120" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ /////////// Large format paper support
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B4JIS" " -dDEVICEWIDTHPOINTS=729 -d&&
+DEVICEHEIGHTPOINTS=1033"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Ledger" " -dDEVICEWIDTHPOINTS=792 -&&
+dDEVICEHEIGHTPOINTS=1224"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=SuperB" " -dDEVICEWIDTHPOINTS=936 -&&
+dDEVICEHEIGHTPOINTS=1368"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w774h1116" " -dDEVICEWIDTHPOINTS=77&&
+4 -dDEVICEHEIGHTPOINTS=1116"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A3" " -dDEVICEWIDTHPOINTS=842 -dDEV&&
+ICEHEIGHTPOINTS=1190"
+ Attribute "FoomaticRIPOption" "Duplex" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexNoTumble" " -dDuplex=true -dTum&&
+ble=false"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexTumble" " -dDuplex=true -dTumbl&&
+e=true"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=None" " -dDuplex=false"
+ Attribute "FoomaticRIPOption" "DryTime" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Zero" ""
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Five" ",DryTime=5"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Ten" ",DryTime=10"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Fifteen" ",DryTime=15"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Twenty" ",DryTime=20"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=TwentyFive" ",DryTime=25"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Thirty" ",DryTime=30"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYK" " -r300 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYKFullBleed" " -r300 -sIjs&&
+Params=Quality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:FullBleed=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftColorCMYK" " -r300 -sIjsPara&&
+ms=Quality:Quality=1,Quality:ColorMode=2,Quality:MediaType=0,Quality:P&&
+enSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftGrayscaleK" " -r300 -sIjs&&
+Params=Quality:Quality=1,Quality:ColorMode=0,Quality:MediaType=0,Quali&&
+ty:PenSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300FastDraftColorCMYK" " -r300 -sIjs&&
+Params=Quality:Quality=4,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:SpeedMech=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300FastDraftGrayscaleK" " -r300 -&&
+sIjsParams=Quality:Quality=4,Quality:ColorMode=0,Quality:MediaType=0,Q&&
+uality:PenSet=2,Quality:SpeedMech=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300GrayscaleK" " -r300 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMYK" " -r600 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMYKFullBleed" " -r600 -sIjs&&
+Params=Quality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:FullBleed=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600GrayscaleK" " -r600 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600PhotoCMYK" " -r600 -sIjsParams=&&
+Quality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenS&&
+et=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600PhotoCMYKFullBleed" " -r600 -sI&&
+jsParams=Quality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Qua&&
+lity:PenSet=2,Quality:FullBleed=1"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ Choice "Draft.Gray/Draft Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft.Gray"
+ *Choice "Normal/Normal (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "Normal.Gray/Normal Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal.Gray"
+ Choice "High/High Quality (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=High"
+ Choice "High.Gray/High Quality Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=High.Gray"
+ Choice "Photo/Photo (on photo paper)" "%% FoomaticRIPOptionSetting: PrintoutMode=Photo"
+ Option "InputSlot/Media Source" PickOne AnySetup 100.0
+ *Choice "Default/Printer default" "%% FoomaticRIPOptionSetting: InputSlot=Default"
+ Choice "PhotoTray/Photo Tray" "%% FoomaticRIPOptionSetting: InputSlot=PhotoTray"
+ Choice "Upper/Upper Tray" "%% FoomaticRIPOptionSetting: InputSlot=Upper"
+ Choice "Lower/Lower Tray" "%% FoomaticRIPOptionSetting: InputSlot=Lower"
+ Choice "CDDVDTray/CD or DVD Tray" "%% FoomaticRIPOptionSetting: InputSlot=CDDVDTray"
+ Choice "Envelope/Envelope Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Envelope"
+ Choice "LargeCapacity/Large Capacity Tray" "%% FoomaticRIPOptionSetting: InputSlot=LargeCapacity"
+ Choice "Manual/Manual Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Manual"
+ Choice "MPTray/Multi Purpose Tray" "%% FoomaticRIPOptionSetting: InputSlot=MPTray"
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 120.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "%% FoomaticRIPOptionSetting: Duplex=DuplexNoTumble"
+ Choice "DuplexTumble/Short Edge (Flip)" "%% FoomaticRIPOptionSetting: Duplex=DuplexTumble"
+ *Choice "None/Off" "%% FoomaticRIPOptionSetting: Duplex=None"
+ Option "DryTime/Additional Dry Time" PickOne AnySetup 120.0
+ *Choice "Zero/Printer Default" "%% FoomaticRIPOptionSetting: DryTime=Zero"
+ Choice "Five/5 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Five"
+ Choice "Ten/10 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Ten"
+ Choice "Fifteen/15 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Fifteen"
+ Choice "Twenty/20 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Twenty"
+ Choice "TwentyFive/25 Seconds" "%% FoomaticRIPOptionSetting: DryTime=TwentyFive"
+ Choice "Thirty/30 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Thirty"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "300ColorCMYK/300 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYK"
+ Choice "300ColorCMYKFullBleed/300 dpi, Color, Full Bleed, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYKFullBleed"
+ Choice "300DraftColorCMYK/300 dpi, Draft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftColorCMYK"
+ Choice "300DraftGrayscaleK/300 dpi, Draft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftGrayscaleK"
+ Choice "300FastDraftColorCMYK/300 dpi, FastDraft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300FastDraftColorCMYK"
+ Choice "300FastDraftGrayscaleK/300 dpi, FastDraft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300FastDraftGrayscaleK"
+ Choice "300GrayscaleK/300 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300GrayscaleK"
+ Choice "600ColorCMYK/600 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMYK"
+ Choice "600ColorCMYKFullBleed/600 dpi, Color, Full Bleed, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMYKFullBleed"
+ Choice "600GrayscaleK/600 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=600GrayscaleK"
+ Choice "600PhotoCMYK/600 dpi, Photo, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=600PhotoCMYK"
+ Choice "600PhotoCMYKFullBleed/600 dpi, Photo, Full Bleed, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=600PhotoCMYKFullBleed"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 9.72 36.00 9.72 9.00 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo or 5x7 inch index card" 360.00 504.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "PhotoTearOff/Photo with tear-off tab" 288.00 432.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff" "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "A6TearOff/A6 with tear-off tab" 297.00 420.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=A6TearOff" "%% FoomaticRIPOptionSetting: PageSize=A6TearOff"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "CDDVD120/CD or DVD 120 mm" 360.00 360.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD120" "%% FoomaticRIPOptionSetting: PageSize=CDDVD120"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+ // <%DJGenericVIP:Normal%>
+ // <%DJGenericVIP:NoEvenDuplex%>
+ {
+ // Large format SuperB paper support
+ CustomMedia "B4JIS/B4 (JIS)" 729.00 1033.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B4JIS" "%% FoomaticRIPOptionSetting: PageSize=B4JIS"
+ CustomMedia "Ledger/Ledger" 792.00 1224.00 14.40 36.00 14.40 9.00 "%% FoomaticRIPOptionSetting: PageSize=Ledger" "%% FoomaticRIPOptionSetting: PageSize=Ledger"
+ CustomMedia "SuperB/Super B" 936.00 1368.00 14.40 36.00 14.40 9.00 "%% FoomaticRIPOptionSetting: PageSize=SuperB" "%% FoomaticRIPOptionSetting: PageSize=SuperB"
+ CustomMedia "w774h1116/8K" 774.00 1116.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w774h1116" "%% FoomaticRIPOptionSetting: PageSize=w774h1116"
+ CustomMedia "A3/A3" 842.00 1190.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A3" "%% FoomaticRIPOptionSetting: PageSize=A3"
+ // <%DJGenericVIP:LargeFormatSuperB%>
+ }
+} // end DJGenericVIP
+
+/////////////// DJGenericVIP with NoAutoTray
+{
+ Attribute "DefaultResolution" "" "1200dpi"
+
+ // Custom page sizes from 1x4in to SuperB
+ HWMargins 18 36 18 9
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 936 1368
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-DeskJet_5650 hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-DeskJet_5650" " -sDeviceManufacture&&
+r=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;deskjet 5600&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=300FastDraftCol&&
+orCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft.Gray" "Quality=300FastDra&&
+ftGrayscaleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=300ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal.Gray" "Quality=300Graysc&&
+aleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High" "Quality=600ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High.Gray" "Quality=600Grayscal&&
+eK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Photo" "Quality=1200PhotoCMYKFu&&
+llBleed"
+ Attribute "FoomaticRIPOption" "InputSlot" "enum CmdLine C"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Default" ",PS:MediaPosition=7"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=PhotoTray" ",PS:MediaPosition=6"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Upper" ",PS:MediaPosition=1"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Lower" ",PS:MediaPosition=4"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=CDDVDTray" ",PS:MediaPosition=14"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Envelope" ",PS:MediaPosition=3"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=LargeCapacity" ",PS:MediaPosition=&&
+5"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Manual" ",PS:MediaPosition=2"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=MPTray" ",PS:MediaPosition=8"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=PhotoTearOff" " -dDEVICEWIDTHPOINTS&&
+=288 -dDEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6TearOff" " -dDEVICEWIDTHPOINTS=29&&
+7 -dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD120" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ /////////// Large format paper support
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B4JIS" " -dDEVICEWIDTHPOINTS=729 -d&&
+DEVICEHEIGHTPOINTS=1033"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Ledger" " -dDEVICEWIDTHPOINTS=792 -&&
+dDEVICEHEIGHTPOINTS=1224"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=SuperB" " -dDEVICEWIDTHPOINTS=936 -&&
+dDEVICEHEIGHTPOINTS=1368"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w774h1116" " -dDEVICEWIDTHPOINTS=77&&
+4 -dDEVICEHEIGHTPOINTS=1116"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A3" " -dDEVICEWIDTHPOINTS=842 -dDEV&&
+ICEHEIGHTPOINTS=1190"
+ Attribute "FoomaticRIPOption" "Duplex" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexNoTumble" " -dDuplex=true -dTum&&
+ble=false"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexTumble" " -dDuplex=true -dTumbl&&
+e=true"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=None" " -dDuplex=false"
+ Attribute "FoomaticRIPOption" "DryTime" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Zero" ""
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Five" ",DryTime=5"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Ten" ",DryTime=10"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Fifteen" ",DryTime=15"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Twenty" ",DryTime=20"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=TwentyFive" ",DryTime=25"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Thirty" ",DryTime=30"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYK" " -r300 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYKFullBleed" " -r300 -sIjs&&
+Params=Quality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:FullBleed=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftColorCMYK" " -r300 -sIjsPara&&
+ms=Quality:Quality=1,Quality:ColorMode=2,Quality:MediaType=0,Quality:P&&
+enSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftGrayscaleK" " -r300 -sIjs&&
+Params=Quality:Quality=1,Quality:ColorMode=0,Quality:MediaType=0,Quali&&
+ty:PenSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300FastDraftColorCMYK" " -r300 -sIjs&&
+Params=Quality:Quality=4,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:SpeedMech=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300FastDraftGrayscaleK" " -r300 -&&
+sIjsParams=Quality:Quality=4,Quality:ColorMode=0,Quality:MediaType=0,Q&&
+uality:PenSet=2,Quality:SpeedMech=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300GrayscaleK" " -r300 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMYK" " -r600 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMYKFullBleed" " -r600 -sIjs&&
+Params=Quality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:FullBleed=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600GrayscaleK" " -r600 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=1200PhotoCMYK" " -r1200 -sIjsParams=&&
+Quality:Quality=3,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenS&&
+et=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=1200PhotoCMYKFullBleed" " -r1200 -sI&&
+jsParams=Quality:Quality=3,Quality:ColorMode=2,Quality:MediaType=2,Qua&&
+lity:PenSet=2,Quality:FullBleed=1"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ Choice "Draft.Gray/Draft Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft.Gray"
+ *Choice "Normal/Normal (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "Normal.Gray/Normal Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal.Gray"
+ Choice "High/High Quality (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=High"
+ Choice "High.Gray/High Quality Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=High.Gray"
+ Choice "Photo/Photo (on photo paper)" "%% FoomaticRIPOptionSetting: PrintoutMode=Photo"
+ Option "InputSlot/Media Source" PickOne AnySetup 100.0
+ Choice "PhotoTray/Photo Tray" "%% FoomaticRIPOptionSetting: InputSlot=PhotoTray"
+ *Choice "Upper/Upper Tray" "%% FoomaticRIPOptionSetting: InputSlot=Upper"
+ Choice "Lower/Lower Tray" "%% FoomaticRIPOptionSetting: InputSlot=Lower"
+ Choice "CDDVDTray/CD or DVD Tray" "%% FoomaticRIPOptionSetting: InputSlot=CDDVDTray"
+ Choice "Envelope/Envelope Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Envelope"
+ Choice "LargeCapacity/Large Capacity Tray" "%% FoomaticRIPOptionSetting: InputSlot=LargeCapacity"
+ Choice "Manual/Manual Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Manual"
+ Choice "MPTray/Multi Purpose Tray" "%% FoomaticRIPOptionSetting: InputSlot=MPTray"
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 120.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "%% FoomaticRIPOptionSetting: Duplex=DuplexNoTumble"
+ Choice "DuplexTumble/Short Edge (Flip)" "%% FoomaticRIPOptionSetting: Duplex=DuplexTumble"
+ *Choice "None/Off" "%% FoomaticRIPOptionSetting: Duplex=None"
+ Option "DryTime/Additional Dry Time" PickOne AnySetup 120.0
+ *Choice "Zero/Printer Default" "%% FoomaticRIPOptionSetting: DryTime=Zero"
+ Choice "Five/5 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Five"
+ Choice "Ten/10 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Ten"
+ Choice "Fifteen/15 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Fifteen"
+ Choice "Twenty/20 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Twenty"
+ Choice "TwentyFive/25 Seconds" "%% FoomaticRIPOptionSetting: DryTime=TwentyFive"
+ Choice "Thirty/30 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Thirty"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "300ColorCMYK/300 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYK"
+ Choice "300ColorCMYKFullBleed/300 dpi, Color, Full Bleed, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYKFullBleed"
+ Choice "300DraftColorCMYK/300 dpi, Draft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftColorCMYK"
+ Choice "300DraftGrayscaleK/300 dpi, Draft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftGrayscaleK"
+ Choice "300FastDraftColorCMYK/300 dpi, FastDraft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300FastDraftColorCMYK"
+ Choice "300FastDraftGrayscaleK/300 dpi, FastDraft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300FastDraftGrayscaleK"
+ Choice "300GrayscaleK/300 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300GrayscaleK"
+ Choice "600ColorCMYK/600 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMYK"
+ Choice "600ColorCMYKFullBleed/600 dpi, Color, Full Bleed, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMYKFullBleed"
+ Choice "600GrayscaleK/600 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=600GrayscaleK"
+ Choice "1200PhotoCMYK/1200 dpi, Photo, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=1200PhotoCMYK"
+ Choice "1200PhotoCMYKFullBleed/1200 dpi, Photo, Full Bleed, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=1200PhotoCMYKFullBleed"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 9.72 36.00 9.72 9.00 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo or 5x7 inch index card" 360.00 504.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "PhotoTearOff/Photo with tear-off tab" 288.00 432.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff" "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "A6TearOff/A6 with tear-off tab" 297.00 420.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=A6TearOff" "%% FoomaticRIPOptionSetting: PageSize=A6TearOff"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "CDDVD120/CD or DVD 120 mm" 360.00 360.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD120" "%% FoomaticRIPOptionSetting: PageSize=CDDVD120"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+
+ {
+ // Large format SuperB paper support
+ CustomMedia "B4JIS/B4 (JIS)" 729.00 1033.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B4JIS" "%% FoomaticRIPOptionSetting: PageSize=B4JIS"
+ CustomMedia "Ledger/Ledger" 792.00 1224.00 14.40 36.00 14.40 9.00 "%% FoomaticRIPOptionSetting: PageSize=Ledger" "%% FoomaticRIPOptionSetting: PageSize=Ledger"
+ CustomMedia "SuperB/Super B" 936.00 1368.00 14.40 36.00 14.40 9.00 "%% FoomaticRIPOptionSetting: PageSize=SuperB" "%% FoomaticRIPOptionSetting: PageSize=SuperB"
+ CustomMedia "w774h1116/8K" 774.00 1116.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w774h1116" "%% FoomaticRIPOptionSetting: PageSize=w774h1116"
+ CustomMedia "A3/A3" 842.00 1190.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A3" "%% FoomaticRIPOptionSetting: PageSize=A3"
+ // <%DJGenericVIP:LargeFormatSuperB:NoAutoTray%>
+ }
+} // end DJGenericVIP with NoAutoTray
+
+////////////// OJProKx50 and DJGenericVIP without full bleed
+{
+ Attribute "DefaultResolution" "" "1200dpi"
+
+ // Custom page sizes from 1x4in to SuperB
+ HWMargins 18 36 18 9
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 936 1368
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-Business_Inkjet_1000 hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-Business_Inkjet_1000" " -sDeviceMan&&
+ufacturer=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;Officejet Pro K5400&&
+&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=300FastDraftCol&&
+orCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft.Gray" "Quality=300FastDra&&
+ftGrayscaleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=300ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal.Gray" "Quality=300Graysc&&
+aleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High" "Quality=600ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High.Gray" "Quality=600Grayscal&&
+eK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Photo" "Quality=600PhotoCMYK"
+
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=PhotoBest" "Quality=1200PhotoCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=PhotoNormal" "Quality=600PhotoNormalCMYK"
+
+ Attribute "FoomaticRIPOption" "InputSlot" "enum CmdLine C"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Default" ",PS:MediaPosition=7"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=PhotoTray" ",PS:MediaPosition=6"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Upper" ",PS:MediaPosition=1"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Lower" ",PS:MediaPosition=4"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=CDDVDTray" ",PS:MediaPosition=14"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Envelope" ",PS:MediaPosition=3"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=LargeCapacity" ",PS:MediaPosition=&&
+5"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Manual" ",PS:MediaPosition=2"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=MPTray" ",PS:MediaPosition=8"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=PhotoTearOff" " -dDEVICEWIDTHPOINTS&&
+=288 -dDEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6TearOff" " -dDEVICEWIDTHPOINTS=29&&
+7 -dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD120" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ //////////// Large format paper support
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B4JIS" " -dDEVICEWIDTHPOINTS=729 -d&&
+DEVICEHEIGHTPOINTS=1033"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Ledger" " -dDEVICEWIDTHPOINTS=792 -&&
+dDEVICEHEIGHTPOINTS=1224"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=SuperB" " -dDEVICEWIDTHPOINTS=936 -&&
+dDEVICEHEIGHTPOINTS=1368"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w774h1116" " -dDEVICEWIDTHPOINTS=77&&
+4 -dDEVICEHEIGHTPOINTS=1116"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A3" " -dDEVICEWIDTHPOINTS=842 -dDEV&&
+ICEHEIGHTPOINTS=1190"
+ Attribute "FoomaticRIPOption" "Duplex" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexNoTumble" " -dDuplex=true -dTum&&
+ble=false"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexTumble" " -dDuplex=true -dTumbl&&
+e=true"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=None" " -dDuplex=false"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYK" " -r300 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftColorCMYK" " -r300 -sIjsPara&&
+ms=Quality:Quality=1,Quality:ColorMode=2,Quality:MediaType=0,Quality:P&&
+enSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftGrayscaleK" " -r300 -sIjs&&
+Params=Quality:Quality=1,Quality:ColorMode=0,Quality:MediaType=0,Quali&&
+ty:PenSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300FastDraftColorCMYK" " -r300 -sIjs&&
+Params=Quality:Quality=4,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:SpeedMech=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300FastDraftGrayscaleK" " -r300 -&&
+sIjsParams=Quality:Quality=4,Quality:ColorMode=0,Quality:MediaType=0,Q&&
+uality:PenSet=2,Quality:SpeedMech=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300GrayscaleK" " -r300 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMYK" " -r600 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600GrayscaleK" " -r600 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600PhotoCMYK" " -r600 -sIjsParams=Qu&&
+ality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600PhotoNormalCMYK" " -r600 -sIjsPar&&
+ams=Quality:Quality=0,Quality:ColorMode=2,Quality:MediaType=2,Quality:&&
+PenSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=1200PhotoCMYK" " -r1200 -sIjsParams=&&
+Quality:Quality=3,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenS&&
+et=2"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ Choice "Draft.Gray/Draft Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft.Gray"
+ *Choice "Normal/Normal (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "Normal.Gray/Normal Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal.Gray"
+ Choice "High/High Quality (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=High"
+ Choice "High.Gray/High Quality Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=High.Gray"
+ Choice "Photo/Photo (on photo paper)" "%% FoomaticRIPOptionSetting: PrintoutMode=Photo"
+ Choice "PhotoBest/Best Quality (color on photo paper)" "%% FoomaticRIPOptionSetting: PrintoutMode=PhotoBest"
+ Choice "PhotoNormal/Normal Quality (color on photo paper)" "%% FoomaticRIPOptionSetting: PrintoutMode=PhotoNormal"
+ Option "InputSlot/Media Source" PickOne AnySetup 100.0
+ *Choice "Default/Printer default" "%% FoomaticRIPOptionSetting: InputSlot=Default"
+ Choice "PhotoTray/Photo Tray" "%% FoomaticRIPOptionSetting: InputSlot=PhotoTray"
+ Choice "Upper/Upper Tray" "%% FoomaticRIPOptionSetting: InputSlot=Upper"
+ Choice "Lower/Lower Tray" "%% FoomaticRIPOptionSetting: InputSlot=Lower"
+ Choice "CDDVDTray/CD or DVD Tray" "%% FoomaticRIPOptionSetting: InputSlot=CDDVDTray"
+ Choice "Envelope/Envelope Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Envelope"
+ Choice "LargeCapacity/Large Capacity Tray" "%% FoomaticRIPOptionSetting: InputSlot=LargeCapacity"
+ Choice "Manual/Manual Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Manual"
+ Choice "MPTray/Multi Purpose Tray" "%% FoomaticRIPOptionSetting: InputSlot=MPTray"
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 120.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "%% FoomaticRIPOptionSetting: Duplex=DuplexNoTumble"
+ Choice "DuplexTumble/Short Edge (Flip)" "%% FoomaticRIPOptionSetting: Duplex=DuplexTumble"
+ *Choice "None/Off" "%% FoomaticRIPOptionSetting: Duplex=None"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "300ColorCMYK/300 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYK"
+ Choice "300DraftColorCMYK/300 dpi, Draft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftColorCMYK"
+ Choice "300DraftGrayscaleK/300 dpi, Draft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftGrayscaleK"
+ Choice "300FastDraftColorCMYK/300 dpi, FastDraft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300FastDraftColorCMYK"
+ Choice "300FastDraftGrayscaleK/300 dpi, FastDraft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300FastDraftGrayscaleK"
+ Choice "300GrayscaleK/300 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300GrayscaleK"
+ Choice "600ColorCMYK/600 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMYK"
+ Choice "600GrayscaleK/600 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=600GrayscaleK"
+ Choice "600PhotoCMYK/600 dpi, Photo, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=600PhotoCMYK"
+ Choice "600PhotoNormalCMYK/600 dpi, Color, Black + Color Cartr., Photo Paper, Normal" "%% FoomaticRIPOptionSetting: Quality=600PhotoNormalCMYK"
+ Choice "1200PhotoCMYK/1200 dpi, Photo, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=1200PhotoCMYK"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 9.72 36.00 9.72 9.00 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo or 5x7 inch index card" 360.00 504.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "PhotoTearOff/Photo with tear-off tab" 288.00 432.00 9.00 9.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff" "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "A6TearOff/A6 with tear-off tab" 297.00 420.00 9.00 0.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A6TearOff" "%% FoomaticRIPOptionSetting: PageSize=A6TearOff"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "CDDVD120/CD or DVD 120 mm" 360.00 360.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD120" "%% FoomaticRIPOptionSetting: PageSize=CDDVD120"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+ // <%DJGenericVIP:NoFullBleed%>
+ // <%OJProKx50:NoFullBleed%>
+ {
+ // Large format SuperB paper support
+ CustomMedia "B4JIS/B4 (JIS)" 729.00 1033.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B4JIS" "%% FoomaticRIPOptionSetting: PageSize=B4JIS"
+ CustomMedia "Ledger/Ledger" 792.00 1224.00 14.40 36.00 14.40 9.00 "%% FoomaticRIPOptionSetting: PageSize=Ledger" "%% FoomaticRIPOptionSetting: PageSize=Ledger"
+ CustomMedia "SuperB/Super B" 936.00 1368.00 14.40 36.00 14.40 9.00 "%% FoomaticRIPOptionSetting: PageSize=SuperB" "%% FoomaticRIPOptionSetting: PageSize=SuperB"
+ CustomMedia "w774h1116/8K" 774.00 1116.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w774h1116" "%% FoomaticRIPOptionSetting: PageSize=w774h1116"
+ CustomMedia "A3/A3" 842.00 1190.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A3" "%% FoomaticRIPOptionSetting: PageSize=A3"
+ // <%DJGenericVIP:LargeFormatSuperB:NoFullBleed%>
+ // <%OJProKx50:LargeFormatSuperB:NoFullBleed%>
+ }
+} // end OJProKx50 and DJGenericVIP without full bleed
+
+///////////////// DJ3320
+{
+ Attribute "DefaultResolution" "" "600dpi"
+
+ // Custom page sizes from 1x4in to Legal
+ HWMargins 18 36 18 9
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 8.5in 14in
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-DeskJet_3320 hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-DeskJet_3320" " -sDeviceManufacture&&
+r=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;deskjet 3320&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=300DraftColorCM&&
+Y"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft.Gray" "Quality=300DraftGr&&
+ayscaleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=300ColorCMY"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal.Gray" "Quality=300Graysc&&
+aleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High" "Quality=600ColorCMY"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High.Gray" "Quality=600Grayscal&&
+eK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Photo" "Quality=600PhotoCMY"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=PhotoTearOff" " -dDEVICEWIDTHPOINTS&&
+=288 -dDEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6TearOff" " -dDEVICEWIDTHPOINTS=29&&
+7 -dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD120" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMY" " -r300 -sIjsParams=Qua&&
+lity:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet=&&
+1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYK" " -r300 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftColorCMY" " -r300 -sIjsParam&&
+s=Quality:Quality=1,Quality:ColorMode=2,Quality:MediaType=0,Quality:Pe&&
+nSet=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftColorCMYK" " -r300 -sIjsPara&&
+ms=Quality:Quality=1,Quality:ColorMode=2,Quality:MediaType=0,Quality:P&&
+enSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftGrayscaleK" " -r300 -sIjsPar&&
+ams=Quality:Quality=1,Quality:ColorMode=0,Quality:MediaType=0,Quality:&&
+PenSet=0"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300GrayscaleK" " -r300 -sIjsParams=Q&&
+uality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:PenSe&&
+t=0"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300PhotoCMY" " -r300 -sIjsParams=Qua&&
+lity:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenSet=&&
+1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300PhotoCMYK" " -r300 -sIjsParams=Qu&&
+ality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMY" " -r600 -sIjsParams=Qua&&
+lity:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet=&&
+1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMYK" " -r600 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600GrayscaleK" " -r600 -sIjsParams=Q&&
+uality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:PenSe&&
+t=0"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600PhotoCMY" " -r600 -sIjsParams=Qua&&
+lity:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenSet=&&
+1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600PhotoCMYK" " -r600 -sIjsParams=Qu&&
+ality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenSet&&
+=2"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft (Color cartridge)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ Choice "Draft.Gray/Draft Grayscale (Black cartridge)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft.Gray"
+ *Choice "Normal/Normal (Color cartridge)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "Normal.Gray/Normal Grayscale (Black cartridge)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal.Gray"
+ Choice "High/High Quality (Color cartridge)" "%% FoomaticRIPOptionSetting: PrintoutMode=High"
+ Choice "High.Gray/High Quality Grayscale (Black cartridge)" "%% FoomaticRIPOptionSetting: PrintoutMode=High.Gray"
+ Choice "Photo/Photo (Color cartridge, on photo paper)" "%% FoomaticRIPOptionSetting: PrintoutMode=Photo"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "300ColorCMY/300 dpi, Color, Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMY"
+ Choice "300ColorCMYK/300 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYK"
+ Choice "300DraftColorCMY/300 dpi, Draft, Color, Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftColorCMY"
+ Choice "300DraftColorCMYK/300 dpi, Draft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftColorCMYK"
+ Choice "300DraftGrayscaleK/300 dpi, Draft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftGrayscaleK"
+ Choice "300GrayscaleK/300 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300GrayscaleK"
+ Choice "300PhotoCMY/300 dpi, Photo, Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=300PhotoCMY"
+ Choice "300PhotoCMYK/300 dpi, Photo, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=300PhotoCMYK"
+ Choice "600ColorCMY/600 dpi, Color, Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMY"
+ Choice "600ColorCMYK/600 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMYK"
+ Choice "600GrayscaleK/600 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=600GrayscaleK"
+ Choice "600PhotoCMY/600 dpi, Photo, Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=600PhotoCMY"
+ Choice "600PhotoCMYK/600 dpi, Photo, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=600PhotoCMYK"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 9.72 36.00 9.72 9.00 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo or 5x7 inch index card" 360.00 504.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "PhotoTearOff/Photo with tear-off tab" 288.00 432.00 9.00 9.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff" "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "A6TearOff/A6 with tear-off tab" 297.00 420.00 9.00 0.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A6TearOff" "%% FoomaticRIPOptionSetting: PageSize=A6TearOff"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "CDDVD120/CD or DVD 120 mm" 360.00 360.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD120" "%% FoomaticRIPOptionSetting: PageSize=CDDVD120"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+ // <%DJ3320:Normal%>
+ {
+ CustomMedia "3425-Cover/Cover for HP DeskJet 3425" 612.00 1116.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=3425-Cover" "%% FoomaticRIPOptionSetting: PageSize=3425-Cover"
+ // <%DJ3320:CoverMedia%>
+ }
+} // end DJ3320
+
+//////////////////////// DJ3600
+{
+ Attribute "DefaultResolution" "" "600dpi"
+
+ // Custom page sizes from 1x4in to Legal
+ HWMargins 18 36 18 9
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 8.5in 14in
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-DeskJet_3650 hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-DeskJet_3650" " -sDeviceManufacture&&
+r=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;deskjet 3600&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=300DraftColorCM&&
+Y"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft.Gray" "Quality=300DraftGr&&
+ayscaleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=300ColorCMY"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal.Gray" "Quality=300Graysc&&
+aleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High" "Quality=600ColorCMY"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High.Gray" "Quality=600Grayscal&&
+eK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Photo" "Quality=600PhotoCMYKFul&&
+lBleed"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=PhotoTearOff" " -dDEVICEWIDTHPOINTS&&
+=288 -dDEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6TearOff" " -dDEVICEWIDTHPOINTS=29&&
+7 -dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD120" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMY" " -r300 -sIjsParams=Qua&&
+lity:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet=&&
+1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYK" " -r300 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftColorCMY" " -r300 -sIjsParam&&
+s=Quality:Quality=1,Quality:ColorMode=2,Quality:MediaType=0,Quality:Pe&&
+nSet=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftColorCMYK" " -r300 -sIjsPara&&
+ms=Quality:Quality=1,Quality:ColorMode=2,Quality:MediaType=0,Quality:P&&
+enSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftGrayscaleK" " -r300 -sIjsPar&&
+ams=Quality:Quality=1,Quality:ColorMode=0,Quality:MediaType=0,Quality:&&
+PenSet=0"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300GrayscaleK" " -r300 -sIjsParams=Q&&
+uality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:PenSe&&
+t=0"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300PhotoCMY" " -r300 -sIjsParams=Qua&&
+lity:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenSet=&&
+1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300PhotoCMYK" " -r300 -sIjsParams=Qu&&
+ality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300PhotoCMYKFullBleed" " -r300 -sIjs&&
+Params=Quality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Quali&&
+ty:PenSet=2,Quality:FullBleed=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMY" " -r600 -sIjsParams=Qua&&
+lity:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet=&&
+1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMYK" " -r600 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600GrayscaleK" " -r600 -sIjsParams=Q&&
+uality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:PenSe&&
+t=0"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600PhotoCMY" " -r600 -sIjsParams=Qua&&
+lity:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenSet=&&
+1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600PhotoCMYcmK" " -r600 -sIjsParams=&&
+Quality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenS&&
+et=4"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600PhotoCMYcmKFullBleed" " -r600 -sI&&
+jsParams=Quality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Qua&&
+lity:PenSet=4,Quality:FullBleed=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600PhotoCMYK" " -r600 -sIjsParams=Qu&&
+ality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600PhotoCMYKFullBleed" " -r600 -sIjs&&
+Params=Quality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Quali&&
+ty:PenSet=2,Quality:FullBleed=1"
+ Group "General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft (Color cartridge)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ Choice "Draft.Gray/Draft Grayscale (Black cartridge)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft.Gray"
+ *Choice "Normal/Normal (Color cartridge)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "Normal.Gray/Normal Grayscale (Black cartridge)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal.Gray"
+ Choice "High/High Quality (Color cartridge)" "%% FoomaticRIPOptionSetting: PrintoutMode=High"
+ Choice "High.Gray/High Quality Grayscale (Black cartridge)" "%% FoomaticRIPOptionSetting: PrintoutMode=High.Gray"
+ Choice "Photo/Photo (Color cartridge, on photo paper)" "%% FoomaticRIPOptionSetting: PrintoutMode=Photo"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "300ColorCMY/300 dpi, Color, Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMY"
+ Choice "300ColorCMYK/300 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYK"
+ Choice "300DraftColorCMY/300 dpi, Draft, Color, Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftColorCMY"
+ Choice "300DraftColorCMYK/300 dpi, Draft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftColorCMYK"
+ Choice "300DraftGrayscaleK/300 dpi, Draft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftGrayscaleK"
+ Choice "300GrayscaleK/300 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300GrayscaleK"
+ Choice "300PhotoCMY/300 dpi, Photo, Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=300PhotoCMY"
+ Choice "300PhotoCMYK/300 dpi, Photo, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=300PhotoCMYK"
+ Choice "300PhotoCMYKFullBleed/300 dpi, Photo, Full Bleed, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=300PhotoCMYKFullBleed"
+ Choice "600ColorCMY/600 dpi, Color, Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMY"
+ Choice "600ColorCMYK/600 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMYK"
+ Choice "600GrayscaleK/600 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=600GrayscaleK"
+ Choice "600PhotoCMY/600 dpi, Photo, Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=600PhotoCMY"
+ Choice "600PhotoCMYcmK/600 dpi, Photo, Photo + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=600PhotoCMYcmK"
+ Choice "600PhotoCMYcmKFullBleed/600 dpi, Photo, Full Bleed, Photo + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=600PhotoCMYcmKFullBleed"
+ Choice "600PhotoCMYK/600 dpi, Photo, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=600PhotoCMYK"
+ Choice "600PhotoCMYKFullBleed/600 dpi, Photo, Full Bleed, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=600PhotoCMYKFullBleed"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 9.72 36.00 9.72 9.00 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo or 5x7 inch index card" 360.00 504.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "PhotoTearOff/Photo with tear-off tab" 288.00 432.00 9.00 9.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff" "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "A6TearOff/A6 with tear-off tab" 297.00 420.00 9.00 0.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A6TearOff" "%% FoomaticRIPOptionSetting: PageSize=A6TearOff"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "CDDVD120/CD or DVD 120 mm" 360.00 360.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD120" "%% FoomaticRIPOptionSetting: PageSize=CDDVD120"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+ // <%DJ3600:Normal%>
+} // end DJ3600
+
+////////////////// DJ4100
+{
+ Attribute "DefaultResolution" "" "600dpi"
+
+ // Custom page sizes from 1x4in to Legal
+ HWMargins 18 36 18 9
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 8.5in 14in
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-DeskJet_D4100 hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-DeskJet_D4100" " -sDeviceManufactur&&
+er=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;Deskjet D4100&quot;&&
+"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=600DraftColorCM&&
+Y"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft.Gray" "Quality=600DraftGr&&
+ayscaleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=600ColorCMY"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal.Gray" "Quality=600Graysc&&
+aleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High" "Quality=600ColorCMY"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High.Gray" "Quality=600Grayscal&&
+eK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Photo" "Quality=600PhotoCMYKFul&&
+lBleed"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=PhotoTearOff" " -dDEVICEWIDTHPOINTS&&
+=288 -dDEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6TearOff" " -dDEVICEWIDTHPOINTS=29&&
+7 -dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD120" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMY" " -r600 -sIjsParams=Qua&&
+lity:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet=&&
+1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMYK" " -r600 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600DraftColorCMY" " -r600 -sIjsParam&&
+s=Quality:Quality=1,Quality:ColorMode=2,Quality:MediaType=0,Quality:Pe&&
+nSet=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600DraftColorCMYK" " -r600 -sIjsPara&&
+ms=Quality:Quality=1,Quality:ColorMode=2,Quality:MediaType=0,Quality:P&&
+enSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600DraftGrayscaleK" " -r600 -sIjsPar&&
+ams=Quality:Quality=1,Quality:ColorMode=0,Quality:MediaType=0,Quality:&&
+PenSet=0"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600GrayscaleK" " -r600 -sIjsParams=Q&&
+uality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:PenSe&&
+t=0"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600PhotoCMY" " -r600 -sIjsParams=Qua&&
+lity:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenSet=&&
+1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600PhotoCMYcmK" " -r600 -sIjsParams=&&
+Quality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenS&&
+et=4"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600PhotoCMYcmKFullBleed" " -r600 -sI&&
+jsParams=Quality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Qua&&
+lity:PenSet=4,Quality:FullBleed=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600PhotoCMYK" " -r600 -sIjsParams=Qu&&
+ality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600PhotoCMYKFullBleed" " -r600 -sIjs&&
+Params=Quality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Quali&&
+ty:PenSet=2,Quality:FullBleed=1"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft (Color cartridge)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ Choice "Draft.Gray/Draft Grayscale (Black cartridge)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft.Gray"
+ *Choice "Normal/Normal (Color cartridge)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "Normal.Gray/Normal Grayscale (Black cartridge)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal.Gray"
+ Choice "High/High Quality (Color cartridge)" "%% FoomaticRIPOptionSetting: PrintoutMode=High"
+ Choice "High.Gray/High Quality Grayscale (Black cartridge)" "%% FoomaticRIPOptionSetting: PrintoutMode=High.Gray"
+ Choice "Photo/Photo (Color cartridge, on photo paper)" "%% FoomaticRIPOptionSetting: PrintoutMode=Photo"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "600ColorCMY/600 dpi, Color, Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMY"
+ Choice "600ColorCMYK/600 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMYK"
+ Choice "600DraftColorCMY/600 dpi, Draft, Color, Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600DraftColorCMY"
+ Choice "600DraftColorCMYK/600 dpi, Draft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600DraftColorCMYK"
+ Choice "600DraftGrayscaleK/600 dpi, Draft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=600DraftGrayscaleK"
+ Choice "600GrayscaleK/600 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=600GrayscaleK"
+ Choice "600PhotoCMY/600 dpi, Photo, Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=600PhotoCMY"
+ Choice "600PhotoCMYcmK/600 dpi, Photo, Photo + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=600PhotoCMYcmK"
+ Choice "600PhotoCMYcmKFullBleed/600 dpi, Photo, Full Bleed, Photo + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=600PhotoCMYcmKFullBleed"
+ Choice "600PhotoCMYK/600 dpi, Photo, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=600PhotoCMYK"
+ Choice "600PhotoCMYKFullBleed/600 dpi, Photo, Full Bleed, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=600PhotoCMYKFullBleed"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 9.72 36.00 9.72 9.00 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo or 5x7 inch index card" 360.00 504.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "PhotoTearOff/Photo with tear-off tab" 288.00 432.00 9.00 9.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff" "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "A6TearOff/A6 with tear-off tab" 297.00 420.00 9.00 0.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A6TearOff" "%% FoomaticRIPOptionSetting: PageSize=A6TearOff"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "CDDVD120/CD or DVD 120 mm" 360.00 360.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD120" "%% FoomaticRIPOptionSetting: PageSize=CDDVD120"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+ {
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-DeskJet_D4100" " -sDeviceManufactur&&
+er=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;Deskjet D4100&quot;"
+ // <%DJ4100:Normal%>
+ }
+}
+
+//////////////////// PSP100 4x6, three-sided fullbleed
+{
+ Attribute "DefaultResolution" "" "1200dpi"
+
+ // Custom page sizes from 1x4in to A6
+ HWMargins 0 36 0 0
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 297 420
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-PhotoSmart_P100 hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-PhotoSmart_P100" " -sDeviceManufact&&
+urer=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;PHOTOSMART 100&qu&&
+ot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=300ColorCMYKFu&&
+llBleed"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High" "Quality=600ColorCMYKFull&&
+Bleed"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Photo" "Quality=1200PhotoCMYKFu&&
+llBleed"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=PhotoTearOff" " -dDEVICEWIDTHPOINTS&&
+=288 -dDEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6TearOff" " -dDEVICEWIDTHPOINTS=29&&
+7 -dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMY" " -r300 -sIjsParams=Qua&&
+lity:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet=&&
+1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYFullBleed" " -r300 -sIjsP&&
+arams=Quality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Qualit&&
+y:PenSet=1,Quality:FullBleed=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMY" " -r600 -sIjsParams=Qua&&
+lity:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet=&&
+1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMYFullBleed" " -r600 -sIjsP&&
+arams=Quality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Qualit&&
+y:PenSet=1,Quality:FullBleed=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=1200PhotoCMY" " -r1200 -sIjsParams=Q&&
+uality:Quality=3,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenSe&&
+t=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=1200PhotoCMYFullBleed" " -r1200 -sIj&&
+sParams=Quality:Quality=3,Quality:ColorMode=2,Quality:MediaType=2,Qual&&
+ity:PenSet=1,Quality:FullBleed=1"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Normal/Normal (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "High/High Quality (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=High"
+ *Choice "Photo/Photo (on photo paper)" "%% FoomaticRIPOptionSetting: PrintoutMode=Photo"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "300ColorCMY/300 dpi, Color, Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMY"
+ Choice "300ColorCMYFullBleed/300 dpi, Color, Full Bleed, Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYFullBleed"
+ Choice "600ColorCMY/600 dpi, Color, Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMY"
+ Choice "600ColorCMYFullBleed/600 dpi, Color, Full Bleed, Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMYFullBleed"
+ Choice "1200PhotoCMY/1200 dpi, Photo, Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=1200PhotoCMY"
+ Choice "1200PhotoCMYFullBleed/1200 dpi, Photo, Full Bleed, Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=1200PhotoCMYFullBleed"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ *CustomMedia "PhotoTearOff/Photo with tear-off tab" 288.00 432.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff" "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "A6/A6" 297.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "A6TearOff/A6 with tear-off tab" 297.00 420.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=A6TearOff" "%% FoomaticRIPOptionSetting: PageSize=A6TearOff"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ // <%PSP100:Normal%>
+} // end PSP100 three-sided fullbleed
+
+//////////////// DJGenericVIP 4x6, 4-sided fullbleed
+{
+ Attribute "DefaultResolution" "" "1200dpi"
+
+ // Custom page sizes from 1x4in to A6
+ HWMargins 0 0 0 0
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 297 420
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-PhotoSmart_320 hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-PhotoSmart_320" " -sDeviceManufactu&&
+rer=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;deskjet 5600&quot;&&
+"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=300ColorCMYKFu&&
+llBleed"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High" "Quality=600ColorCMYKFull&&
+Bleed"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Photo" "Quality=1200PhotoCMYKFu&&
+llBleed"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=PhotoTearOff" " -dDEVICEWIDTHPOINTS&&
+=288 -dDEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6TearOff" " -dDEVICEWIDTHPOINTS=29&&
+7 -dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMY" " -r300 -sIjsParams=Qua&&
+lity:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet=&&
+1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYFullBleed" " -r300 -sIjsP&&
+arams=Quality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Qualit&&
+y:PenSet=1,Quality:FullBleed=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMY" " -r600 -sIjsParams=Qua&&
+lity:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet=&&
+1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMYFullBleed" " -r600 -sIjsP&&
+arams=Quality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Qualit&&
+y:PenSet=1,Quality:FullBleed=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=1200PhotoCMY" " -r1200 -sIjsParams=Q&&
+uality:Quality=3,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenSe&&
+t=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=1200PhotoCMYFullBleed" " -r1200 -sIj&&
+sParams=Quality:Quality=3,Quality:ColorMode=2,Quality:MediaType=2,Qual&&
+ity:PenSet=1,Quality:FullBleed=1"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Normal/Normal (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "High/High Quality (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=High"
+ *Choice "Photo/Photo (on photo paper)" "%% FoomaticRIPOptionSetting: PrintoutMode=Photo"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "300ColorCMY/300 dpi, Color, Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMY"
+ Choice "300ColorCMYFullBleed/300 dpi, Color, Full Bleed, Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYFullBleed"
+ Choice "600ColorCMY/600 dpi, Color, Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMY"
+ Choice "600ColorCMYFullBleed/600 dpi, Color, Full Bleed, Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMYFullBleed"
+ Choice "1200PhotoCMY/1200 dpi, Photo, Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=1200PhotoCMY"
+ Choice "1200PhotoCMYFullBleed/1200 dpi, Photo, Full Bleed, Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=1200PhotoCMYFullBleed"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ *CustomMedia "PhotoTearOff/Photo with tear-off tab" 288.00 432.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff" "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "A6/A6" 297.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "A6TearOff/A6 with tear-off tab" 297.00 420.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=A6TearOff" "%% FoomaticRIPOptionSetting: PageSize=A6TearOff"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ // <%DJGenericVIP:4x6FullBleed%>
+} // end DJGenericVIP 4x6, 4-sided fullbleed
+
+//////////////// PSP470 5x7, 4-sided fullbleed
+{
+ Attribute "DefaultResolution" "" "1200dpi"
+
+ // Custom page sizes from 1x4in to 5x7
+ HWMargins 0 0 0 0
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 5in 7in
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-PhotoSmart_470 hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-PhotoSmart_470" " -sDeviceManufactu&&
+rer=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;Photosmart 470&quo&&
+t;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=300ColorCMYKFu&&
+llBleed"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High" "Quality=600ColorCMYKFull&&
+Bleed"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Photo" "Quality=1200PhotoCMYKFu&&
+llBleed"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=PhotoTearOff" " -dDEVICEWIDTHPOINTS&&
+=288 -dDEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6TearOff" " -dDEVICEWIDTHPOINTS=29&&
+7 -dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD120" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMY" " -r300 -sIjsParams=Qua&&
+lity:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet=&&
+1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYFullBleed" " -r300 -sIjsP&&
+arams=Quality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Qualit&&
+y:PenSet=1,Quality:FullBleed=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMY" " -r600 -sIjsParams=Qua&&
+lity:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet=&&
+1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMYFullBleed" " -r600 -sIjsP&&
+arams=Quality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Qualit&&
+y:PenSet=1,Quality:FullBleed=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=1200PhotoCMY" " -r1200 -sIjsParams=Q&&
+uality:Quality=3,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenSe&&
+t=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=1200PhotoCMYFullBleed" " -r1200 -sIj&&
+sParams=Quality:Quality=3,Quality:ColorMode=2,Quality:MediaType=2,Qual&&
+ity:PenSet=1,Quality:FullBleed=1"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Normal/Normal (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "High/High Quality (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=High"
+ *Choice "Photo/Photo (on photo paper)" "%% FoomaticRIPOptionSetting: PrintoutMode=Photo"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "300ColorCMY/300 dpi, Color, Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMY"
+ Choice "300ColorCMYFullBleed/300 dpi, Color, Full Bleed, Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYFullBleed"
+ Choice "600ColorCMY/600 dpi, Color, Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMY"
+ Choice "600ColorCMYFullBleed/600 dpi, Color, Full Bleed, Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMYFullBleed"
+ Choice "1200PhotoCMY/1200 dpi, Photo, Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=1200PhotoCMY"
+ Choice "1200PhotoCMYFullBleed/1200 dpi, Photo, Full Bleed, Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=1200PhotoCMYFullBleed"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo or 5x7 inch index card" 360.00 504.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ *CustomMedia "PhotoTearOff/Photo with tear-off tab" 288.00 432.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff" "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "A6/A6" 297.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "A6TearOff/A6 with tear-off tab" 297.00 420.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=A6TearOff" "%% FoomaticRIPOptionSetting: PageSize=A6TearOff"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "CDDVD120/CD or DVD 120 mm" 360.00 360.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD120" "%% FoomaticRIPOptionSetting: PageSize=CDDVD120"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ // <%PSP470:FullBleed%>
+} // end PSP470 5x7, 4-sided fullbleed
+
+//////////////// QuickConnect 5x7, 4-sided fullbleed
+{
+ Attribute "DefaultResolution" "" "300dpi"
+
+ // Custom page sizes from 1x4in to 5x7
+ HWMargins 0 0 0 0
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 5in 7in
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-PhotoSmart_A530 hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -r300 -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-Photosmart_A53" " -sDeviceManufacture&&
+r=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;Photosmart A530&quot;"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Automatic" " -dDEVICEWIDTHPOINTS=288 -&&
+dDEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=4x6" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=L" " -dDEVICEWIDTHPOINTS=252 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=4x8" " -dDEVICEWIDTHPOINTS=288 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=4x12" " -dDEVICEWIDTHPOINTS=288 -dDE&&
+VICEHEIGHTPOINTS=864"
+ Attribute "FoomaticRIPOption" "MediaType" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "MediaType=Automatic" " -sIjsParams=Quali&&
+ty:MediaType=0"
+ Attribute "FoomaticRIPOptionSetting" "MediaType=APhoto" " -sIjsParams=Qualit&&
+y:MediaType=1"
+ Attribute "FoomaticRIPOptionSetting" "MediaType=PPhoto" " -sIjsParams=Qualit&&
+y:MediaType=2"
+ Attribute "FoomaticRIPOptionSetting" "MediaType=Plain" " -sIjsParams=Qualit&&
+y:MediaType=3"
+ Attribute "FoomaticRIPOptionSetting" "MediaType=OPhoto" " -sIjsParams=Quali&&
+ty:MediaType=4"
+ Attribute "FoomaticRIPOption" "PrintQuality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "PrintQuality=Automatic" ",Quality:Qu&&
+ality=0"
+ Attribute "FoomaticRIPOptionSetting" "PrintQuality=Best" ",Quality:Qual&&
+ity=1"
+ Attribute "FoomaticRIPOptionSetting" "PrintQuality=Normal" ",Quality:Qual&&
+ity=2"
+ Attribute "FoomaticRIPOptionSetting" "PrintQuality=FastNormal" ",Qualit&&
+y:Quality=3"
+ Attribute "FoomaticRIPOption" "Borderless" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Borderless=off" ",Quality:Full&&
+Bleed=0"
+ Attribute "FoomaticRIPOptionSetting" "Borderless=on" ",Quality:Full&&
+Bleed=1"
+ Attribute "FoomaticRIPOption" "PhotoFix" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "PhotoFix=off" ",PhotoFix=0"
+ Attribute "FoomaticRIPOptionSetting" "PhotoFix=on" ",PhotoFix=1"
+ Attribute "FoomaticRIPOption" "RedEye" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "RedEye=off" ",RedEye=0"
+ Attribute "FoomaticRIPOptionSetting" "RedEye=on" ",RedEye=1"
+ Group "General/General"
+ Option "MediaType/Media Type " PickOne AnySetup 105.0
+ *Choice "Automatic/Automatic" "%% FoomaticRIPOptionSetting: MediaType=Automatic"
+ Choice "APhoto/HP Advanced Photo" "%% FoomaticRIPOptionSetting: MediaType=APhoto"
+ Choice "PPhoto/HP Premium Photo" "%% FoomaticRIPOptionSetting: MediaType=PPhoto"
+ Choice "Plain/Plain" "%% FoomaticRIPOptionSetting: MediaType=Plain"
+ Choice "OPhoto/Other Photo" "%% FoomaticRIPOptionSetting: MediaType=OPhoto"
+ Option "PrintQuality/Print Quality " PickOne AnySetup 105.0
+ *Choice "Automatic/Automatic" "%% FoomaticRIPOptionSetting: MediaType=Automatic"
+ Choice "Best/Best" "%% FoomaticRIPOptionSetting: MediaType=Best"
+ Choice "Normal/Normal" "%% FoomaticRIPOptionSetting: MediaType=Normal"
+ Choice "FastNormal/FastNormal" "%% FoomaticRIPOptionSetting: MediaType=FastNormal"
+ Option "Borderless/Borderless Printing" Boolean AnySetup 105.0
+ Choice "Disable/Disable" "%% FoomaticRIPOptionSetting: Borderless=off"
+ *Choice "Enable/Enable" "%% FoomaticRIPOptionSetting: Borderless=on"
+ Group "RLT/HP Real Life Technologies"
+ Option "PhotoFix/Photo Fix" Boolean AnySetup 105.0
+ *Choice "off/Disable" "%% FoomaticRIPOptionSetting: PhotoFix=off"
+ Choice "on/Enable" "%% FoomaticRIPOptionSetting: PhotoFix=on"
+ Option "RedEye/Red Eye Removal" Boolean AnySetup 105.0
+ Choice "off/Disable" "%% FoomaticRIPOptionSetting: RedEye=off"
+ *Choice "on/Enable" "%% FoomaticRIPOptionSetting: RedEye=on"
+ *CustomMedia "Automatic/Automatic" 288.00 432.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Automatic" "%% FoomaticRIPOptionSetting: PageSize=Automatic"
+ CustomMedia "4x6/4x6in, 10x15cm, A6, Hagaki " 288.00 432.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=4x6" "%% FoomaticRIPOptionSetting: PageSize=4x6"
+ CustomMedia "5x7/5x7in, 13x18cm, 2L" 360.00 504.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=5x7" "%% FoomaticRIPOptionSetting: PageSize=5x7"
+ CustomMedia "L/3.5x5in, L" 252.00 360.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=L" "%% FoomaticRIPOptionSetting: PageSize=L"
+ CustomMedia "4x8/4x8in, 10x20cm" 288.00 576.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=4x8" "%% FoomaticRIPOptionSetting: PageSize=4x8"
+ CustomMedia "4x12/4x12in, 10x30cm" 288.00 864.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=4x12" "%% FoomaticRIPOptionSetting: PageSize=4x12"
+ // <%QuickConnect:Normal%>
+} // end QuickConnect, 4-sided fullbleed
+
+///////////////// LJMono
+{
+ Attribute "DefaultResolution" "" "600dpi"
+
+ // Custom page sizes from 1x4in to Ledger
+ HWMargins 18 14.4 18 14.4
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 11in 17in
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-LaserJet_4 hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-LaserJet_4" " -sDeviceManufacturer=&&
+&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;HP LaserJet&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=300DraftGraysca&&
+leK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=300GrayscaleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High" "Quality=600GrayscaleK"
+ Attribute "FoomaticRIPOption" "InputSlot" "enum CmdLine C"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Default" ",PS:MediaPosition=7"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=PhotoTray" ",PS:MediaPosition=6"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Upper" ",PS:MediaPosition=1"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Lower" ",PS:MediaPosition=4"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=CDDVDTray" ",PS:MediaPosition=14"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Envelope" ",PS:MediaPosition=3"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=LargeCapacity" ",PS:MediaPosition=&&
+5"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Manual" ",PS:MediaPosition=2"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=MPTray" ",PS:MediaPosition=8"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD120" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ ////////// Large format paper support
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B4JIS" " -dDEVICEWIDTHPOINTS=729 -d&&
+DEVICEHEIGHTPOINTS=1033"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Ledger" " -dDEVICEWIDTHPOINTS=792 -&&
+dDEVICEHEIGHTPOINTS=1224"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=SuperB" " -dDEVICEWIDTHPOINTS=936 -&&
+dDEVICEHEIGHTPOINTS=1368"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w774h1116" " -dDEVICEWIDTHPOINTS=77&&
+4 -dDEVICEHEIGHTPOINTS=1116"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A3" " -dDEVICEWIDTHPOINTS=842 -dDEV&&
+ICEHEIGHTPOINTS=1190"
+ Attribute "FoomaticRIPOption" "Duplex" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexNoTumble" " -dDuplex=true -dTum&&
+ble=false"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexTumble" " -dDuplex=true -dTumbl&&
+e=true"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=None" " -dDuplex=false"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftGrayscaleK" " -r300 -sIjsPar&&
+ams=Quality:Quality=1,Quality:ColorMode=0,Quality:MediaType=0,Quality:&&
+PenSet=0"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300GrayscaleK" " -r300 -sIjsParams=Q&&
+uality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:PenSe&&
+t=0"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600GrayscaleK" " -r600 -sIjsParams=Q&&
+uality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:PenSe&&
+t=0"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft (Economy)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ *Choice "Normal/Normal" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "High/High Quality" "%% FoomaticRIPOptionSetting: PrintoutMode=High"
+ Option "InputSlot/Media Source" PickOne AnySetup 100.0
+ *Choice "Default/Printer default" "%% FoomaticRIPOptionSetting: InputSlot=Default"
+ Choice "PhotoTray/Photo Tray" "%% FoomaticRIPOptionSetting: InputSlot=PhotoTray"
+ Choice "Upper/Upper Tray" "%% FoomaticRIPOptionSetting: InputSlot=Upper"
+ Choice "Lower/Lower Tray" "%% FoomaticRIPOptionSetting: InputSlot=Lower"
+ Choice "CDDVDTray/CD or DVD Tray" "%% FoomaticRIPOptionSetting: InputSlot=CDDVDTray"
+ Choice "Envelope/Envelope Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Envelope"
+ Choice "LargeCapacity/Large Capacity Tray" "%% FoomaticRIPOptionSetting: InputSlot=LargeCapacity"
+ Choice "Manual/Manual Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Manual"
+ Choice "MPTray/Multi Purpose Tray" "%% FoomaticRIPOptionSetting: InputSlot=MPTray"
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 120.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "%% FoomaticRIPOptionSetting: Duplex=DuplexNoTumble"
+ Choice "DuplexTumble/Short Edge (Flip)" "%% FoomaticRIPOptionSetting: Duplex=DuplexTumble"
+ *Choice "None/Off" "%% FoomaticRIPOptionSetting: Duplex=None"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "300DraftGrayscaleK/300 dpi, Draft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftGrayscaleK"
+ Choice "300GrayscaleK/300 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300GrayscaleK"
+ Choice "600GrayscaleK/600 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=600GrayscaleK"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo or 5x7 inch index card" 360.00 504.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "CDDVD120/CD or DVD 120 mm" 360.00 360.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=CDDVD120" "%% FoomaticRIPOptionSetting: PageSize=CDDVD120"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+ // <%LJMono:Normal%>
+ {
+ // Large format A3 paper support
+ CustomMedia "A3/A3" 842.00 1190.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=A3" "%% FoomaticRIPOptionSetting: PageSize=A3"
+ CustomMedia "B4JIS/B4 (JIS)" 729.00 1033.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=B4JIS" "%% FoomaticRIPOptionSetting: PageSize=B4JIS"
+ CustomMedia "Ledger/Ledger" 792.00 1224.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Ledger" "%% FoomaticRIPOptionSetting: PageSize=Ledger"
+ CustomMedia "w774h1116/8K" 774.00 1116.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=w774h1116" "%% FoomaticRIPOptionSetting: PageSize=w774h1116"
+ // <%LJMono:LargeFormatA3%>
+ }
+} // end LJMono
+
+///////////////// LJMono 300 dpi only
+{
+ Attribute "DefaultResolution" "" "300dpi"
+
+ // Custom page sizes from 1x4in to Legal
+ HWMargins 18 14.4 18 14.4
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 8.5in 14in
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-LaserJet_4L hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-LaserJet_4L" " -sDeviceManufacturer&&
+=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;HP LaserJet&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B 10"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=300DraftGraysc&&
+aleK"
+ Attribute "FoomaticRIPOption" "InputSlot" "enum CmdLine C"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Default" ",PS:MediaPosition=7"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=PhotoTray" ",PS:MediaPosition=6"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Upper" ",PS:MediaPosition=1"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Lower" ",PS:MediaPosition=4"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=CDDVDTray" ",PS:MediaPosition=14"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Envelope" ",PS:MediaPosition=3"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=LargeCapacity" ",PS:MediaPosition=&&
+5"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Manual" ",PS:MediaPosition=2"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=MPTray" ",PS:MediaPosition=8"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD120" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ Attribute "FoomaticRIPOption" "Duplex" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexNoTumble" " -dDuplex=true -dTum&&
+ble=false"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexTumble" " -dDuplex=true -dTumbl&&
+e=true"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=None" " -dDuplex=false"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B 100"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftGrayscaleK" " -r300 -sIjsPar&&
+ams=Quality:Quality=1,Quality:ColorMode=0,Quality:MediaType=0,Quality:&&
+PenSet=0"
+ Group "General/General"
+ Option "InputSlot/Media Source" PickOne AnySetup 100.0
+ *Choice "Default/Printer default" "%% FoomaticRIPOptionSetting: InputSlot=Default"
+ Choice "PhotoTray/Photo Tray" "%% FoomaticRIPOptionSetting: InputSlot=PhotoTray"
+ Choice "Upper/Upper Tray" "%% FoomaticRIPOptionSetting: InputSlot=Upper"
+ Choice "Lower/Lower Tray" "%% FoomaticRIPOptionSetting: InputSlot=Lower"
+ Choice "CDDVDTray/CD or DVD Tray" "%% FoomaticRIPOptionSetting: InputSlot=CDDVDTray"
+ Choice "Envelope/Envelope Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Envelope"
+ Choice "LargeCapacity/Large Capacity Tray" "%% FoomaticRIPOptionSetting: InputSlot=LargeCapacity"
+ Choice "Manual/Manual Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Manual"
+ Choice "MPTray/Multi Purpose Tray" "%% FoomaticRIPOptionSetting: InputSlot=MPTray"
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 120.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "%% FoomaticRIPOptionSetting: Duplex=DuplexNoTumble"
+ Choice "DuplexTumble/Short Edge (Flip)" "%% FoomaticRIPOptionSetting: Duplex=DuplexTumble"
+ *Choice "None/Off" "%% FoomaticRIPOptionSetting: Duplex=None"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo or 5x7 inch index card" 360.00 504.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "CDDVD120/CD or DVD 120 mm" 360.00 360.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=CDDVD120" "%% FoomaticRIPOptionSetting: PageSize=CDDVD120"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+ // <%LJMono:300dpiOnly%>
+} // end LJMono 300dpi only
+
+////////////// LJColor
+{
+ Attribute "DefaultResolution" "" "600dpi"
+
+ // Custom page sizes from 1x4in to SuperB
+ HWMargins 18 14.4 18 14.4
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 936 1368
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-Color_LaserJet_2500 hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-Color_LaserJet_2500" " -sDeviceManu&&
+facturer=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;hp color Lase&&
+rJet&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=150DraftColorCM&&
+YK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft.Gray" "Quality=150DraftGr&&
+ayscaleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=300ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal.Gray" "Quality=300Graysc&&
+aleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High" "Quality=600BestColorCMYK&&
+"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High.Gray" "Quality=600Grayscal&&
+eK"
+ Attribute "FoomaticRIPOption" "InputSlot" "enum CmdLine C"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Default" ",PS:MediaPosition=7"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=PhotoTray" ",PS:MediaPosition=6"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Upper" ",PS:MediaPosition=1"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Lower" ",PS:MediaPosition=4"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=CDDVDTray" ",PS:MediaPosition=14"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Envelope" ",PS:MediaPosition=3"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=LargeCapacity" ",PS:MediaPosition=&&
+5"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Manual" ",PS:MediaPosition=2"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=MPTray" ",PS:MediaPosition=8"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD120" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ ///////// Large format paper support
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B4JIS" " -dDEVICEWIDTHPOINTS=729 -d&&
+DEVICEHEIGHTPOINTS=1033"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Ledger" " -dDEVICEWIDTHPOINTS=792 -&&
+dDEVICEHEIGHTPOINTS=1224"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=SuperB" " -dDEVICEWIDTHPOINTS=936 -&&
+dDEVICEHEIGHTPOINTS=1368"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w774h1116" " -dDEVICEWIDTHPOINTS=77&&
+4 -dDEVICEHEIGHTPOINTS=1116"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A3" " -dDEVICEWIDTHPOINTS=842 -dDEV&&
+ICEHEIGHTPOINTS=1190"
+ Attribute "FoomaticRIPOption" "Duplex" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexNoTumble" " -dDuplex=true -dTum&&
+ble=false"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexTumble" " -dDuplex=true -dTumbl&&
+e=true"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=None" " -dDuplex=false"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=150BestColorCMYK" " -r150 -sIjsParam&&
+s=Quality:Quality=2,Quality:ColorMode=2,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=150ColorCMYK" " -r150 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=150DraftColorCMYK" " -r150 -sIjsPara&&
+ms=Quality:Quality=1,Quality:ColorMode=2,Quality:MediaType=0,Quality:P&&
+enSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=150DraftGrayscaleK" " -r150 -sIjs&&
+Params=Quality:Quality=1,Quality:ColorMode=0,Quality:MediaType=0,Quali&&
+ty:PenSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=150GrayscaleK" " -r150 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300BestColorCMYK" " -r300 -sIjsParam&&
+s=Quality:Quality=2,Quality:ColorMode=2,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYK" " -r300 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300GrayscaleK" " -r300 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600BestColorCMYK" " -r600 -sIjsParam&&
+s=Quality:Quality=2,Quality:ColorMode=2,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600GrayscaleK" " -r600 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ Choice "Draft.Gray/Draft Grayscale" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft.Gray"
+ *Choice "Normal/Normal" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "Normal.Gray/Normal Grayscale" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal.Gray"
+ Choice "High/High Quality" "%% FoomaticRIPOptionSetting: PrintoutMode=High"
+ Choice "High.Gray/High Quality Grayscale" "%% FoomaticRIPOptionSetting: PrintoutMode=High.Gray"
+ Option "InputSlot/Media Source" PickOne AnySetup 100.0
+ *Choice "Default/Printer default" "%% FoomaticRIPOptionSetting: InputSlot=Default"
+ Choice "PhotoTray/Photo Tray" "%% FoomaticRIPOptionSetting: InputSlot=PhotoTray"
+ Choice "Upper/Upper Tray" "%% FoomaticRIPOptionSetting: InputSlot=Upper"
+ Choice "Lower/Lower Tray" "%% FoomaticRIPOptionSetting: InputSlot=Lower"
+ Choice "CDDVDTray/CD or DVD Tray" "%% FoomaticRIPOptionSetting: InputSlot=CDDVDTray"
+ Choice "Envelope/Envelope Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Envelope"
+ Choice "LargeCapacity/Large Capacity Tray" "%% FoomaticRIPOptionSetting: InputSlot=LargeCapacity"
+ Choice "Manual/Manual Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Manual"
+ Choice "MPTray/Multi Purpose Tray" "%% FoomaticRIPOptionSetting: InputSlot=MPTray"
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 120.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "%% FoomaticRIPOptionSetting: Duplex=DuplexNoTumble"
+ Choice "DuplexTumble/Short Edge (Flip)" "%% FoomaticRIPOptionSetting: Duplex=DuplexTumble"
+ *Choice "None/Off" "%% FoomaticRIPOptionSetting: Duplex=None"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "150BestColorCMYK/150 dpi, Best, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=150BestColorCMYK"
+ Choice "150ColorCMYK/150 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=150ColorCMYK"
+ Choice "150DraftColorCMYK/150 dpi, Draft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=150DraftColorCMYK"
+ Choice "150DraftGrayscaleK/150 dpi, Draft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=150DraftGrayscaleK"
+ Choice "150GrayscaleK/150 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=150GrayscaleK"
+ Choice "300BestColorCMYK/300 dpi, Best, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300BestColorCMYK"
+ Choice "300ColorCMYK/300 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYK"
+ Choice "300GrayscaleK/300 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300GrayscaleK"
+ Choice "600BestColorCMYK/600 dpi, Best, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600BestColorCMYK"
+ Choice "600GrayscaleK/600 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=600GrayscaleK"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo or 5x7 inch index card" 360.00 504.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "CDDVD120/CD or DVD 120 mm" 360.00 360.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=CDDVD120" "%% FoomaticRIPOptionSetting: PageSize=CDDVD120"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+ // <%LJColor:Normal%>
+ // <%LJColor:Normal:Advanced%>
+ {
+ // Large format SuperB paper support
+ CustomMedia "B4JIS/B4 (JIS)" 729.00 1033.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B4JIS" "%% FoomaticRIPOptionSetting: PageSize=B4JIS"
+ CustomMedia "Ledger/Ledger" 792.00 1224.00 14.40 36.00 14.40 9.00 "%% FoomaticRIPOptionSetting: PageSize=Ledger" "%% FoomaticRIPOptionSetting: PageSize=Ledger"
+ CustomMedia "SuperB/Super B" 936.00 1368.00 14.40 36.00 14.40 9.00 "%% FoomaticRIPOptionSetting: PageSize=SuperB" "%% FoomaticRIPOptionSetting: PageSize=SuperB"
+ CustomMedia "w774h1116/8K" 774.00 1116.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w774h1116" "%% FoomaticRIPOptionSetting: PageSize=w774h1116"
+ CustomMedia "A3/A3" 842.00 1190.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A3" "%% FoomaticRIPOptionSetting: PageSize=A3"
+ // <%LJColor:LargeFormatSuperB%>
+ }
+ {
+ // Large format A3 paper support
+ CustomMedia "A3/A3" 842.00 1190.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=A3" "%% FoomaticRIPOptionSetting: PageSize=A3"
+ CustomMedia "B4JIS/B4 (JIS)" 729.00 1033.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=B4JIS" "%% FoomaticRIPOptionSetting: PageSize=B4JIS"
+ CustomMedia "Ledger/Ledger" 792.00 1224.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Ledger" "%% FoomaticRIPOptionSetting: PageSize=Ledger"
+ CustomMedia "w774h1116/8K" 774.00 1116.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=w774h1116" "%% FoomaticRIPOptionSetting: PageSize=w774h1116"
+ // <%LJColor:LargeFormatA3%>
+ }
+} // end LJColor
+
+////////////// LJColor 300 dpi max. only
+{
+ Attribute "DefaultResolution" "" "300dpi"
+
+ // Custom page sizes from 1x4in to Ledger
+ HWMargins 18 14.4 18 14.4
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 11in 17in
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-Color_LaserJet_5 hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-Color_LaserJet_5" " -sDeviceManufac&&
+turer=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;hp color LaserJe&&
+t&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=150DraftColorCM&&
+YK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft.Gray" "Quality=150DraftGr&&
+ayscaleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=300ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal.Gray" "Quality=300Graysc&&
+aleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High" "Quality=300BestColorCMYK&&
+"
+ Attribute "FoomaticRIPOption" "InputSlot" "enum CmdLine C"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Default" ",PS:MediaPosition=7"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=PhotoTray" ",PS:MediaPosition=6"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Upper" ",PS:MediaPosition=1"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Lower" ",PS:MediaPosition=4"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=CDDVDTray" ",PS:MediaPosition=14"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Envelope" ",PS:MediaPosition=3"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=LargeCapacity" ",PS:MediaPosition=&&
+5"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Manual" ",PS:MediaPosition=2"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=MPTray" ",PS:MediaPosition=8"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A3" " -dDEVICEWIDTHPOINTS=842 -dDEV&&
+ICEHEIGHTPOINTS=1190"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B4JIS" " -dDEVICEWIDTHPOINTS=729 -d&&
+DEVICEHEIGHTPOINTS=1033"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD120" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Ledger" " -dDEVICEWIDTHPOINTS=792 -&&
+dDEVICEHEIGHTPOINTS=1224"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w774h1116" " -dDEVICEWIDTHPOINTS=77&&
+4 -dDEVICEHEIGHTPOINTS=1116"
+ Attribute "FoomaticRIPOption" "Duplex" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexNoTumble" " -dDuplex=true -dTum&&
+ble=false"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexTumble" " -dDuplex=true -dTumbl&&
+e=true"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=None" " -dDuplex=false"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=150BestColorCMYK" " -r150 -sIjsParam&&
+s=Quality:Quality=2,Quality:ColorMode=2,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=150ColorCMYK" " -r150 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=150DraftColorCMYK" " -r150 -sIjsPara&&
+ms=Quality:Quality=1,Quality:ColorMode=2,Quality:MediaType=0,Quality:P&&
+enSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=150DraftGrayscaleK" " -r150 -sIjs&&
+Params=Quality:Quality=1,Quality:ColorMode=0,Quality:MediaType=0,Quali&&
+ty:PenSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=150GrayscaleK" " -r150 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300BestColorCMYK" " -r300 -sIjsParam&&
+s=Quality:Quality=2,Quality:ColorMode=2,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYK" " -r300 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300GrayscaleK" " -r300 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ Choice "Draft.Gray/Draft Grayscale" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft.Gray"
+ *Choice "Normal/Normal" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "Normal.Gray/Normal Grayscale" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal.Gray"
+ Choice "High/High Quality" "%% FoomaticRIPOptionSetting: PrintoutMode=High"
+ Option "InputSlot/Media Source" PickOne AnySetup 100.0
+ *Choice "Default/Printer default" "%% FoomaticRIPOptionSetting: InputSlot=Default"
+ Choice "PhotoTray/Photo Tray" "%% FoomaticRIPOptionSetting: InputSlot=PhotoTray"
+ Choice "Upper/Upper Tray" "%% FoomaticRIPOptionSetting: InputSlot=Upper"
+ Choice "Lower/Lower Tray" "%% FoomaticRIPOptionSetting: InputSlot=Lower"
+ Choice "CDDVDTray/CD or DVD Tray" "%% FoomaticRIPOptionSetting: InputSlot=CDDVDTray"
+ Choice "Envelope/Envelope Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Envelope"
+ Choice "LargeCapacity/Large Capacity Tray" "%% FoomaticRIPOptionSetting: InputSlot=LargeCapacity"
+ Choice "Manual/Manual Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Manual"
+ Choice "MPTray/Multi Purpose Tray" "%% FoomaticRIPOptionSetting: InputSlot=MPTray"
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 120.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "%% FoomaticRIPOptionSetting: Duplex=DuplexNoTumble"
+ Choice "DuplexTumble/Short Edge (Flip)" "%% FoomaticRIPOptionSetting: Duplex=DuplexTumble"
+ *Choice "None/Off" "%% FoomaticRIPOptionSetting: Duplex=None"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "150BestColorCMYK/150 dpi, Best, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=150BestColorCMYK"
+ Choice "150ColorCMYK/150 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=150ColorCMYK"
+ Choice "150DraftColorCMYK/150 dpi, Draft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=150DraftColorCMYK"
+ Choice "150DraftGrayscaleK/150 dpi, Draft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=150DraftGrayscaleK"
+ Choice "150GrayscaleK/150 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=150GrayscaleK"
+ Choice "300BestColorCMYK/300 dpi, Best, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300BestColorCMYK"
+ Choice "300ColorCMYK/300 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYK"
+ Choice "300GrayscaleK/300 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300GrayscaleK"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo or 5x7 inch index card" 360.00 504.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "CDDVD120/CD or DVD 120 mm" 360.00 360.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=CDDVD120" "%% FoomaticRIPOptionSetting: PageSize=CDDVD120"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+ {
+ // Large format A3 paper support
+ CustomMedia "A3/A3" 842.00 1190.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=A3" "%% FoomaticRIPOptionSetting: PageSize=A3"
+ CustomMedia "B4JIS/B4 (JIS)" 729.00 1033.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=B4JIS" "%% FoomaticRIPOptionSetting: PageSize=B4JIS"
+ CustomMedia "Ledger/Ledger" 792.00 1224.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Ledger" "%% FoomaticRIPOptionSetting: PageSize=Ledger"
+ CustomMedia "w774h1116/8K" 774.00 1116.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=w774h1116" "%% FoomaticRIPOptionSetting: PageSize=w774h1116"
+ // <%LJColor:300dpiOnly:LargeFormatA3%>
+ }
+} // end LJColor 300 dpi max. only
+
+//////////////// LJFastRaster
+{
+ Attribute "DefaultResolution" "" "600dpi"
+
+ // Custom page sizes from 1x4in to Legal
+ HWMargins 18 14.4 18 14.4
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 8.5in 14in
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-LaserJet_1010 hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-LaserJet_1010" " -sDeviceManufactur&&
+er=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;hp LaserJet 1010&qu&&
+ot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=600DraftGraysca&&
+leK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=600GrayscaleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=drvfunctionality" ""
+ Attribute "FoomaticRIPOption" "InputSlot" "enum CmdLine C"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Default" ",PS:MediaPosition=7"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=PhotoTray" ",PS:MediaPosition=6"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Upper" ",PS:MediaPosition=1"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Lower" ",PS:MediaPosition=4"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=CDDVDTray" ",PS:MediaPosition=14"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Envelope" ",PS:MediaPosition=3"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=LargeCapacity" ",PS:MediaPosition=&&
+5"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Manual" ",PS:MediaPosition=2"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=MPTray" ",PS:MediaPosition=8"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD120" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ Attribute "FoomaticRIPOption" "Duplex" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexNoTumble" " -dDuplex=true -dTum&&
+ble=false"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexTumble" " -dDuplex=true -dTumbl&&
+e=true"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=None" " -dDuplex=false"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600DraftGrayscaleK" " -r600 -sIjsPar&&
+ams=Quality:Quality=1,Quality:ColorMode=0,Quality:MediaType=0,Quality:&&
+PenSet=0"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600GrayscaleK" " -r600 -sIjsParams=Q&&
+uality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:PenSe&&
+t=0"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft (Economy)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ *Choice "Normal/Normal" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "drvfunctionality/drvfunctionality" "%% FoomaticRIPOptionSetting: PrintoutMode=drvfunctionality"
+ Option "InputSlot/Media Source" PickOne AnySetup 100.0
+ *Choice "Default/Printer default" "%% FoomaticRIPOptionSetting: InputSlot=Default"
+ Choice "PhotoTray/Photo Tray" "%% FoomaticRIPOptionSetting: InputSlot=PhotoTray"
+ Choice "Upper/Upper Tray" "%% FoomaticRIPOptionSetting: InputSlot=Upper"
+ Choice "Lower/Lower Tray" "%% FoomaticRIPOptionSetting: InputSlot=Lower"
+ Choice "CDDVDTray/CD or DVD Tray" "%% FoomaticRIPOptionSetting: InputSlot=CDDVDTray"
+ Choice "Envelope/Envelope Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Envelope"
+ Choice "LargeCapacity/Large Capacity Tray" "%% FoomaticRIPOptionSetting: InputSlot=LargeCapacity"
+ Choice "Manual/Manual Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Manual"
+ Choice "MPTray/Multi Purpose Tray" "%% FoomaticRIPOptionSetting: InputSlot=MPTray"
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 120.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "%% FoomaticRIPOptionSetting: Duplex=DuplexNoTumble"
+ Choice "DuplexTumble/Short Edge (Flip)" "%% FoomaticRIPOptionSetting: Duplex=DuplexTumble"
+ *Choice "None/Off" "%% FoomaticRIPOptionSetting: Duplex=None"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "600DraftGrayscaleK/600 dpi, Draft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=600DraftGrayscaleK"
+ Choice "600GrayscaleK/600 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=600GrayscaleK"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo or 5x7 inch index card" 360.00 504.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "CDDVD120/CD or DVD 120 mm" 360.00 360.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=CDDVD120" "%% FoomaticRIPOptionSetting: PageSize=CDDVD120"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+ // <%LJFastRaster:Normal%>
+} // end LJFastRaster
+
+///////////////// LJJetReady
+{
+ Attribute "DefaultResolution" "" "600dpi"
+
+ // Custom page sizes from 1x4in to Legal
+ HWMargins 18 14.4 18 14.4
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 8.5in 14in
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-Color_LaserJet_3500 hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-Color_LaserJet_3500" " -sDeviceManu&&
+facturer=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;hp color Lase&&
+rJet 3500&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=600ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal.Gray" "Quality=600Graysc&&
+aleK"
+ Attribute "FoomaticRIPOption" "InputSlot" "enum CmdLine C"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Default" ",PS:MediaPosition=7"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=PhotoTray" ",PS:MediaPosition=6"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Upper" ",PS:MediaPosition=1"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Lower" ",PS:MediaPosition=4"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=CDDVDTray" ",PS:MediaPosition=14"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Envelope" ",PS:MediaPosition=3"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=LargeCapacity" ",PS:MediaPosition=&&
+5"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Manual" ",PS:MediaPosition=2"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=MPTray" ",PS:MediaPosition=8"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD120" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ Attribute "FoomaticRIPOption" "Duplex" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexNoTumble" " -dDuplex=true -dTum&&
+ble=false"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexTumble" " -dDuplex=true -dTumbl&&
+e=true"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=None" " -dDuplex=false"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMYK" " -r600 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600GrayscaleK" " -r600 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ *Choice "Normal/Normal" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "Normal.Gray/Normal Grayscale" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal.Gray"
+ Option "InputSlot/Media Source" PickOne AnySetup 100.0
+ *Choice "Default/Printer default" "%% FoomaticRIPOptionSetting: InputSlot=Default"
+ Choice "PhotoTray/Photo Tray" "%% FoomaticRIPOptionSetting: InputSlot=PhotoTray"
+ Choice "Upper/Upper Tray" "%% FoomaticRIPOptionSetting: InputSlot=Upper"
+ Choice "Lower/Lower Tray" "%% FoomaticRIPOptionSetting: InputSlot=Lower"
+ Choice "CDDVDTray/CD or DVD Tray" "%% FoomaticRIPOptionSetting: InputSlot=CDDVDTray"
+ Choice "Envelope/Envelope Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Envelope"
+ Choice "LargeCapacity/Large Capacity Tray" "%% FoomaticRIPOptionSetting: InputSlot=LargeCapacity"
+ Choice "Manual/Manual Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Manual"
+ Choice "MPTray/Multi Purpose Tray" "%% FoomaticRIPOptionSetting: InputSlot=MPTray"
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 120.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "%% FoomaticRIPOptionSetting: Duplex=DuplexNoTumble"
+ Choice "DuplexTumble/Short Edge (Flip)" "%% FoomaticRIPOptionSetting: Duplex=DuplexTumble"
+ *Choice "None/Off" "%% FoomaticRIPOptionSetting: Duplex=None"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "600ColorCMYK/600 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMYK"
+ Choice "600GrayscaleK/600 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=600GrayscaleK"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo or 5x7 inch index card" 360.00 504.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "CDDVD120/CD or DVD 120 mm" 360.00 360.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=CDDVD120" "%% FoomaticRIPOptionSetting: PageSize=CDDVD120"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+ // <%LJJetReady:Normal%>
+} // end LJJetReady
+
+/////////////// DJ350
+{
+ Attribute "DefaultResolution" "" "300dpi"
+
+ // Custom page sizes from 1x4in to Legal
+ HWMargins 18 48.24 18 9
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 8.5in 14in
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-DeskJet_350C hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-DeskJet_350C" " -sDeviceManufacture&&
+r=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;DESKJET 350&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=300DraftColorCM&&
+Y"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft.Gray" "Quality=300DraftGr&&
+ayscaleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=300ColorCMY"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal.Gray" "Quality=300Graysc&&
+aleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High.Gray" "Quality=600x300Best&&
+GrayscaleK"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=PhotoTearOff" " -dDEVICEWIDTHPOINTS&&
+=288 -dDEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6TearOff" " -dDEVICEWIDTHPOINTS=29&&
+7 -dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD120" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMY" " -r300 -sIjsParams=Qua&&
+lity:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet=&&
+1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftColorCMY" " -r300 -sIjsParam&&
+s=Quality:Quality=1,Quality:ColorMode=2,Quality:MediaType=0,Quality:Pe&&
+nSet=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftGrayscaleK" " -r300 -sIjsPar&&
+ams=Quality:Quality=1,Quality:ColorMode=0,Quality:MediaType=0,Quality:&&
+PenSet=0"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300GrayscaleK" " -r300 -sIjsParams=Q&&
+uality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:PenSe&&
+t=0"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600x300BestGrayscaleK" " -r600x300 -&&
+sIjsParams=Quality:Quality=2,Quality:ColorMode=0,Quality:MediaType=0,Q&&
+uality:PenSet=0"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft (Color cartridge)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ Choice "Draft.Gray/Draft Grayscale (Black cartridge)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft.Gray"
+ *Choice "Normal/Normal (Color cartridge)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "Normal.Gray/Normal Grayscale (Black cartridge)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal.Gray"
+ Choice "High.Gray/High Quality Grayscale (Black cartridge)" "%% FoomaticRIPOptionSetting: PrintoutMode=High.Gray"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "300ColorCMY/300 dpi, Color, Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMY"
+ Choice "300DraftColorCMY/300 dpi, Draft, Color, Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftColorCMY"
+ Choice "300DraftGrayscaleK/300 dpi, Draft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftGrayscaleK"
+ Choice "300GrayscaleK/300 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300GrayscaleK"
+ Choice "600x300BestGrayscaleK/600x300 dpi, Best, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=600x300BestGrayscaleK"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 9.72 48.24 9.72 9.00 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo or 5x7 inch index card" 360.00 504.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "PhotoTearOff/Photo with tear-off tab" 288.00 432.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff" "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "A6TearOff/A6 with tear-off tab" 297.00 420.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A6TearOff" "%% FoomaticRIPOptionSetting: PageSize=A6TearOff"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "CDDVD120/CD or DVD 120 mm" 360.00 360.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD120" "%% FoomaticRIPOptionSetting: PageSize=CDDVD120"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+ // <%DJ350:Normal%>
+}
+
+//////////// DJ540 grayscale only
+{
+ Attribute "DefaultResolution" "" "300dpi"
+
+ // Custom page sizes from 1x4in to Legal
+ HWMargins 18 48.24 18 9
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 8.5in 14in
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-DeskJet_500 hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-DeskJet_500" " -sDeviceManufacturer&&
+=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;DESKJET 540&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=300DraftGraysca&&
+leK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=300GrayscaleK"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=PhotoTearOff" " -dDEVICEWIDTHPOINTS&&
+=288 -dDEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6TearOff" " -dDEVICEWIDTHPOINTS=29&&
+7 -dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD120" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftGrayscaleK" " -r300 -sIjsPar&&
+ams=Quality:Quality=1,Quality:ColorMode=0,Quality:MediaType=0,Quality:&&
+PenSet=0"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300GrayscaleK" " -r300 -sIjsParams=Q&&
+uality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:PenSe&&
+t=0"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ *Choice "Normal/Normal" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "300DraftGrayscaleK/300 dpi, Draft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftGrayscaleK"
+ Choice "300GrayscaleK/300 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300GrayscaleK"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 9.72 48.24 9.72 9.00 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo or 5x7 inch index card" 360.00 504.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "PhotoTearOff/Photo with tear-off tab" 288.00 432.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff" "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "A6TearOff/A6 with tear-off tab" 297.00 420.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A6TearOff" "%% FoomaticRIPOptionSetting: PageSize=A6TearOff"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "CDDVD120/CD or DVD 120 mm" 360.00 360.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD120" "%% FoomaticRIPOptionSetting: PageSize=CDDVD120"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+ // <%DJ540:GrayscaleOnly%>
+} // end DJ540 grayscale only
+
+/////////////// DJ540
+{
+ Attribute "DefaultResolution" "" "300dpi"
+
+ // Custom page sizes from 1x4in to Legal
+ HWMargins 18 48.24 18 9
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 8.5in 14in
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-DeskJet_400 hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-DeskJet_400" " -sDeviceManufacturer&&
+=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;DESKJET 540&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=300DraftColorCM&&
+Y"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft.Gray" "Quality=300DraftGr&&
+ayscaleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=300ColorCMY"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal.Gray" "Quality=300Graysc&&
+aleK"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=PhotoTearOff" " -dDEVICEWIDTHPOINTS&&
+=288 -dDEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6TearOff" " -dDEVICEWIDTHPOINTS=29&&
+7 -dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD120" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMY" " -r300 -sIjsParams=Qua&&
+lity:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet=&&
+1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftColorCMY" " -r300 -sIjsParam&&
+s=Quality:Quality=1,Quality:ColorMode=2,Quality:MediaType=0,Quality:Pe&&
+nSet=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftGrayscaleK" " -r300 -sIjsPar&&
+ams=Quality:Quality=1,Quality:ColorMode=0,Quality:MediaType=0,Quality:&&
+PenSet=0"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300GrayscaleK" " -r300 -sIjsParams=Q&&
+uality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:PenSe&&
+t=0"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft (Color cartridge)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ Choice "Draft.Gray/Draft Grayscale (Black cartridge)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft.Gray"
+ *Choice "Normal/Normal (Color cartridge)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "Normal.Gray/Normal Grayscale (Black cartridge)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal.Gray"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "300ColorCMY/300 dpi, Color, Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMY"
+ Choice "300DraftColorCMY/300 dpi, Draft, Color, Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftColorCMY"
+ Choice "300DraftGrayscaleK/300 dpi, Draft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftGrayscaleK"
+ Choice "300GrayscaleK/300 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300GrayscaleK"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 9.72 48.24 9.72 9.00 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo or 5x7 inch index card" 360.00 504.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "PhotoTearOff/Photo with tear-off tab" 288.00 432.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff" "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "A6TearOff/A6 with tear-off tab" 297.00 420.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A6TearOff" "%% FoomaticRIPOptionSetting: PageSize=A6TearOff"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "CDDVD120/CD or DVD 120 mm" 360.00 360.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD120" "%% FoomaticRIPOptionSetting: PageSize=CDDVD120"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+ // <%DJ540:Normal%>
+} // end DJ540
+
+/////////////// DJ630
+{
+ Attribute "DefaultResolution" "" "300dpi"
+
+ // Custom page sizes from 1x4in to Legal
+ HWMargins 18 48.24 18 9
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 8.5in 14in
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-DeskJet_630C hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-DeskJet_630C" " -sDeviceManufacture&&
+r=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;DESKJET 630&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=300DraftColorCM&&
+Y"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft.Gray" "Quality=300DraftGr&&
+ayscaleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=300ColorCMY"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal.Gray" "Quality=300Graysc&&
+aleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High.Gray" "Quality=600x300Best&&
+GrayscaleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Photo" "Quality=300PhotoCMYcmK"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=PhotoTearOff" " -dDEVICEWIDTHPOINTS&&
+=288 -dDEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6TearOff" " -dDEVICEWIDTHPOINTS=29&&
+7 -dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD120" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMY" " -r300 -sIjsParams=Qua&&
+lity:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet=&&
+1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYK" " -r300 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftColorCMY" " -r300 -sIjsParam&&
+s=Quality:Quality=1,Quality:ColorMode=2,Quality:MediaType=0,Quality:Pe&&
+nSet=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftColorCMYK" " -r300 -sIjsPara&&
+ms=Quality:Quality=1,Quality:ColorMode=2,Quality:MediaType=0,Quality:P&&
+enSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftGrayscaleK" " -r300 -sIjsPar&&
+ams=Quality:Quality=1,Quality:ColorMode=0,Quality:MediaType=0,Quality:&&
+PenSet=0"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300GrayscaleK" " -r300 -sIjsParams=Q&&
+uality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:PenSe&&
+t=0"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300PhotoCMYcmK" " -r300 -sIjsParams=&&
+Quality:Quality=2,Quality:ColorMode=2,Quality:MediaType=1,Quality:PenS&&
+et=4"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600x300BestGrayscaleK" " -r600x300 -&&
+sIjsParams=Quality:Quality=2,Quality:ColorMode=0,Quality:MediaType=0,Q&&
+uality:PenSet=0"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft (Color cartridge)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ Choice "Draft.Gray/Draft Grayscale (Black cartridge)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft.Gray"
+ *Choice "Normal/Normal (Color cartridge)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "Normal.Gray/Normal Grayscale (Black cartridge)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal.Gray"
+ Choice "High.Gray/High Quality Grayscale (Black cartridge)" "%% FoomaticRIPOptionSetting: PrintoutMode=High.Gray"
+ Choice "Photo/Photo (Photo + color cartridge, photo paper)" "%% FoomaticRIPOptionSetting: PrintoutMode=Photo"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "300ColorCMY/300 dpi, Color, Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMY"
+ Choice "300ColorCMYK/300 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYK"
+ Choice "300DraftColorCMY/300 dpi, Draft, Color, Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftColorCMY"
+ Choice "300DraftColorCMYK/300 dpi, Draft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftColorCMYK"
+ Choice "300DraftGrayscaleK/300 dpi, Draft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftGrayscaleK"
+ Choice "300GrayscaleK/300 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300GrayscaleK"
+ Choice "300PhotoCMYcmK/300 dpi, Photo, Photo + Color Cartr., Premium Paper" "%% FoomaticRIPOptionSetting: Quality=300PhotoCMYcmK"
+ Choice "600x300BestGrayscaleK/600x300 dpi, Best, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=600x300BestGrayscaleK"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 9.72 48.24 9.72 9.00 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo or 5x7 inch index card" 360.00 504.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "PhotoTearOff/Photo with tear-off tab" 288.00 432.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff" "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "A6TearOff/A6 with tear-off tab" 297.00 420.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A6TearOff" "%% FoomaticRIPOptionSetting: PageSize=A6TearOff"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "CDDVD120/CD or DVD 120 mm" 360.00 360.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD120" "%% FoomaticRIPOptionSetting: PageSize=CDDVD120"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+ // <%DJ630:Normal%>
+} // end DJ630
+
+/////////////// DJ600 and DJ6xx
+{
+ Attribute "DefaultResolution" "" "300dpi"
+
+ // Custom page sizes from 1x4in to Legal
+ HWMargins 18 48.24 18 9
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 8.5in 14in
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-DeskJet_660C hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=300DraftColorCM&&
+YK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft.Gray" "Quality=300DraftGr&&
+ayscaleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=300ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal.Gray" "Quality=300Graysc&&
+aleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High.Gray" "Quality=600x300Best&&
+GrayscaleK"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=PhotoTearOff" " -dDEVICEWIDTHPOINTS&&
+=288 -dDEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6TearOff" " -dDEVICEWIDTHPOINTS=29&&
+7 -dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD120" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYK" " -r300 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftColorCMYK" " -r300 -sIjsPara&&
+ms=Quality:Quality=1,Quality:ColorMode=2,Quality:MediaType=0,Quality:P&&
+enSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftGrayscaleK" " -r300 -sIjs&&
+Params=Quality:Quality=1,Quality:ColorMode=0,Quality:MediaType=0,Quali&&
+ty:PenSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300GrayscaleK" " -r300 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600x300BestGrayscaleK" " -r600x30&&
+0 -sIjsParams=Quality:Quality=2,Quality:ColorMode=0,Quality:MediaType=&&
+0,Quality:PenSet=2"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ Choice "Draft.Gray/Draft Grayscale" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft.Gray"
+ *Choice "Normal/Normal" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "Normal.Gray/Normal Grayscale" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal.Gray"
+ Choice "High.Gray/High Quality Grayscale" "%% FoomaticRIPOptionSetting: PrintoutMode=High.Gray"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "300ColorCMYK/300 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYK"
+ Choice "300DraftColorCMYK/300 dpi, Draft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftColorCMYK"
+ Choice "300DraftGrayscaleK/300 dpi, Draft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftGrayscaleK"
+ Choice "300GrayscaleK/300 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300GrayscaleK"
+ Choice "600x300BestGrayscaleK/600x300 dpi, Best, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=600x300BestGrayscaleK"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 9.72 48.24 9.72 9.00 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo or 5x7 inch index card" 360.00 504.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "PhotoTearOff/Photo with tear-off tab" 288.00 432.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff" "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "A6TearOff/A6 with tear-off tab" 297.00 420.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A6TearOff" "%% FoomaticRIPOptionSetting: PageSize=A6TearOff"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "CDDVD120/CD or DVD 120 mm" 360.00 360.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD120" "%% FoomaticRIPOptionSetting: PageSize=CDDVD120"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+ {
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-DeskJet_600" " -sDeviceManufacturer&&
+=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;DESKJET 600&quot;"
+ // <%DJ600:Normal%>
+ }
+ {
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-DeskJet_660C" " -sDeviceManufacture&&
+r=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;DESKJET 660&quot;"
+ // <%DJ6xx:Normal%>
+ }
+} // end DJ600 and DJ6xx
+
+///////////// DJ6xxPhoto
+{
+ Attribute "DefaultResolution" "" "300dpi"
+
+ // Custom page sizes from 1x4in to Legal
+ HWMargins 18 48.24 18 9
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 8.5in 14in
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-DeskJet_610C hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-DeskJet_610C" " -sDeviceManufacture&&
+r=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;DESKJET 610&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=300DraftColorCM&&
+YK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft.Gray" "Quality=300DraftGr&&
+ayscaleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=300ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal.Gray" "Quality=300Graysc&&
+aleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High.Gray" "Quality=600x300Best&&
+GrayscaleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Photo" "Quality=300PhotoCMYcmK"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=PhotoTearOff" " -dDEVICEWIDTHPOINTS&&
+=288 -dDEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6TearOff" " -dDEVICEWIDTHPOINTS=29&&
+7 -dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD120" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYK" " -r300 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftColorCMYK" " -r300 -sIjsPara&&
+ms=Quality:Quality=1,Quality:ColorMode=2,Quality:MediaType=0,Quality:P&&
+enSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftGrayscaleK" " -r300 -sIjs&&
+Params=Quality:Quality=1,Quality:ColorMode=0,Quality:MediaType=0,Quali&&
+ty:PenSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300GrayscaleK" " -r300 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300PhotoCMYcmK" " -r300 -sIjsParams=&&
+Quality:Quality=2,Quality:ColorMode=2,Quality:MediaType=1,Quality:PenS&&
+et=4"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600x300BestGrayscaleK" " -r600x30&&
+0 -sIjsParams=Quality:Quality=2,Quality:ColorMode=0,Quality:MediaType=&&
+0,Quality:PenSet=2"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ Choice "Draft.Gray/Draft Grayscale" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft.Gray"
+ *Choice "Normal/Normal" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "Normal.Gray/Normal Grayscale" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal.Gray"
+ Choice "High.Gray/High Quality Grayscale" "%% FoomaticRIPOptionSetting: PrintoutMode=High.Gray"
+ Choice "Photo/Photo (Photo + color cartridge, photo paper)" "%% FoomaticRIPOptionSetting: PrintoutMode=Photo"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "300ColorCMYK/300 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYK"
+ Choice "300DraftColorCMYK/300 dpi, Draft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftColorCMYK"
+ Choice "300DraftGrayscaleK/300 dpi, Draft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftGrayscaleK"
+ Choice "300GrayscaleK/300 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300GrayscaleK"
+ Choice "300PhotoCMYcmK/300 dpi, Photo, Photo + Color Cartr., Premium Paper" "%% FoomaticRIPOptionSetting: Quality=300PhotoCMYcmK"
+ Choice "600x300BestGrayscaleK/600x300 dpi, Best, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=600x300BestGrayscaleK"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 9.72 48.24 9.72 9.00 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo or 5x7 inch index card" 360.00 504.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "PhotoTearOff/Photo with tear-off tab" 288.00 432.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff" "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "A6TearOff/A6 with tear-off tab" 297.00 420.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A6TearOff" "%% FoomaticRIPOptionSetting: PageSize=A6TearOff"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "CDDVD120/CD or DVD 120 mm" 360.00 360.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD120" "%% FoomaticRIPOptionSetting: PageSize=CDDVD120"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 48.24 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+ // <%DJ6xxPhoto:Normal%>
+} // end DJ6xxPhoto
+
+///////////////// DJ8xx
+{
+ Attribute "DefaultResolution" "" "600dpi"
+
+ // Custom page sizes from 1x4in to Legal
+ HWMargins 18 36 18 9
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 8.5in 14in
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-DeskJet_810C hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-DeskJet_810C" " -sDeviceManufacture&&
+r=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;DESKJET 810&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=300DraftColorK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft.Gray" "Quality=300DraftGr&&
+ayscaleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=300ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal.Gray" "Quality=300Graysc&&
+aleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High.Gray" "Quality=600Grayscal&&
+eK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Photo" "Quality=600PhotoCMYK"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=PhotoTearOff" " -dDEVICEWIDTHPOINTS&&
+=288 -dDEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6TearOff" " -dDEVICEWIDTHPOINTS=29&&
+7 -dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD120" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYK" " -r300 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftColorCMYK" " -r300 -sIjsPara&&
+ms=Quality:Quality=1,Quality:ColorMode=2,Quality:MediaType=0,Quality:P&&
+enSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftGrayscaleK" " -r300 -sIjs&&
+Params=Quality:Quality=1,Quality:ColorMode=0,Quality:MediaType=0,Quali&&
+ty:PenSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300GrayscaleK" " -r300 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300PhotoCMYK" " -r300 -sIjsParams=Qu&&
+ality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600GrayscaleK" " -r600 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600PhotoCMYK" " -r600 -sIjsParams=Qu&&
+ality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenSet&&
+=2"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ Choice "Draft.Gray/Draft Grayscale" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft.Gray"
+ *Choice "Normal/Normal" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "Normal.Gray/Normal Grayscale" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal.Gray"
+ Choice "High.Gray/High Quality Grayscale" "%% FoomaticRIPOptionSetting: PrintoutMode=High.Gray"
+ Choice "Photo/Photo (on photo paper)" "%% FoomaticRIPOptionSetting: PrintoutMode=Photo"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "300ColorCMYK/300 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYK"
+ Choice "300DraftColorCMYK/300 dpi, Draft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftColorCMYK"
+ Choice "300DraftGrayscaleK/300 dpi, Draft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftGrayscaleK"
+ Choice "300GrayscaleK/300 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300GrayscaleK"
+ Choice "300PhotoCMYK/300 dpi, Photo, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=300PhotoCMYK"
+ Choice "600GrayscaleK/600 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=600GrayscaleK"
+ Choice "600PhotoCMYK/600 dpi, Photo, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=600PhotoCMYK"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 9.72 36.00 9.72 9.00 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo or 5x7 inch index card" 360.00 504.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "PhotoTearOff/Photo with tear-off tab" 288.00 432.00 9.00 9.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff" "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "A6TearOff/A6 with tear-off tab" 297.00 420.00 9.00 0.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A6TearOff" "%% FoomaticRIPOptionSetting: PageSize=A6TearOff"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "CDDVD120/CD or DVD 120 mm" 360.00 360.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD120" "%% FoomaticRIPOptionSetting: PageSize=CDDVD120"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+ // <%DJ8xx:Normal%>
+} // end DJ8xx
+
+////////////// DJ8x5
+{
+ Attribute "DefaultResolution" "" "600dpi"
+
+ // Custom page sizes from 1x4in to Legal
+ HWMargins 18 36 18 9
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 8.5in 14in
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-DeskJet_825C hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-DeskJet_825C" " -sDeviceManufacture&&
+r=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;DESKJET 825&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=300DraftColorCM&&
+Y"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft.Gray" "Quality=300DraftGr&&
+ayscaleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=300ColorCMY"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal.Gray" "Quality=300Graysc&&
+aleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High.Gray" "Quality=600Grayscal&&
+eK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Photo" "Quality=600PhotoCMY"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=PhotoTearOff" " -dDEVICEWIDTHPOINTS&&
+=288 -dDEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6TearOff" " -dDEVICEWIDTHPOINTS=29&&
+7 -dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD120" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMY" " -r300 -sIjsParams=Qua&&
+lity:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet=&&
+1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYK" " -r300 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftColorCMY" " -r300 -sIjsParam&&
+s=Quality:Quality=1,Quality:ColorMode=2,Quality:MediaType=0,Quality:Pe&&
+nSet=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftColorCMYK" " -r300 -sIjsPara&&
+ms=Quality:Quality=1,Quality:ColorMode=2,Quality:MediaType=0,Quality:P&&
+enSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftGrayscaleK" " -r300 -sIjsPar&&
+ams=Quality:Quality=1,Quality:ColorMode=0,Quality:MediaType=0,Quality:&&
+PenSet=0"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300GrayscaleK" " -r300 -sIjsParams=Q&&
+uality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:PenSe&&
+t=0"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300PhotoCMY" " -r300 -sIjsParams=Qua&&
+lity:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenSet=&&
+1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300PhotoCMYK" " -r300 -sIjsParams=Qu&&
+ality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600GrayscaleK" " -r600 -sIjsParams=Q&&
+uality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:PenSe&&
+t=0"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600PhotoCMY" " -r600 -sIjsParams=Qua&&
+lity:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenSet=&&
+1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600PhotoCMYK" " -r600 -sIjsParams=Qu&&
+ality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenSet&&
+=2"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft (Color cartridge)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ Choice "Draft.Gray/Draft Grayscale (Black cartridge)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft.Gray"
+ *Choice "Normal/Normal (Color cartridge)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "Normal.Gray/Normal Grayscale (Black cartridge)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal.Gray"
+ Choice "High.Gray/High Quality Grayscale (Black cartridge)" "%% FoomaticRIPOptionSetting: PrintoutMode=High.Gray"
+ Choice "Photo/Photo (Color cartridge, on photo paper)" "%% FoomaticRIPOptionSetting: PrintoutMode=Photo"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "300ColorCMY/300 dpi, Color, Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMY"
+ Choice "300ColorCMYK/300 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYK"
+ Choice "300DraftColorCMY/300 dpi, Draft, Color, Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftColorCMY"
+ Choice "300DraftColorCMYK/300 dpi, Draft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftColorCMYK"
+ Choice "300DraftGrayscaleK/300 dpi, Draft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftGrayscaleK"
+ Choice "300GrayscaleK/300 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300GrayscaleK"
+ Choice "300PhotoCMY/300 dpi, Photo, Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=300PhotoCMY"
+ Choice "300PhotoCMYK/300 dpi, Photo, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=300PhotoCMYK"
+ Choice "600GrayscaleK/600 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=600GrayscaleK"
+ Choice "600PhotoCMY/600 dpi, Photo, Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=600PhotoCMY"
+ Choice "600PhotoCMYK/600 dpi, Photo, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=600PhotoCMYK"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 9.72 36.00 9.72 9.00 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo or 5x7 inch index card" 360.00 504.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "PhotoTearOff/Photo with tear-off tab" 288.00 432.00 9.00 9.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff" "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "A6TearOff/A6 with tear-off tab" 297.00 420.00 9.00 0.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A6TearOff" "%% FoomaticRIPOptionSetting: PageSize=A6TearOff"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "CDDVD120/CD or DVD 120 mm" 360.00 360.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD120" "%% FoomaticRIPOptionSetting: PageSize=CDDVD120"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+ // <%DJ8x5:Normal%>
+} // end DJ8x5
+
+///////////////////// DJ850 and DJ890
+{
+ Attribute "DefaultResolution" "" "600dpi"
+
+ // Custom page sizes from 1x4in to Legal
+ HWMargins 18 36 18 9
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 8.5in 14in
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-DeskJet_850C hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-DeskJet_850C" " -sDeviceManufacture&&
+r=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;DESKJET 850&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=300DraftColorCM&&
+YK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft.Gray" "Quality=300DraftGr&&
+ayscaleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=300ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal.Gray" "Quality=300Graysc&&
+aleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High.Gray" "Quality=600Grayscal&&
+eK"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=PhotoTearOff" " -dDEVICEWIDTHPOINTS&&
+=288 -dDEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6TearOff" " -dDEVICEWIDTHPOINTS=29&&
+7 -dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD120" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYK" " -r300 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftColorCMYK" " -r300 -sIjsPara&&
+ms=Quality:Quality=1,Quality:ColorMode=2,Quality:MediaType=0,Quality:P&&
+enSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftGrayscaleK" " -r300 -sIjs&&
+Params=Quality:Quality=1,Quality:ColorMode=0,Quality:MediaType=0,Quali&&
+ty:PenSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300GrayscaleK" " -r300 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600GrayscaleK" " -r600 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ Choice "Draft.Gray/Draft Grayscale" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft.Gray"
+ *Choice "Normal/Normal" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "Normal.Gray/Normal Grayscale" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal.Gray"
+ Choice "High.Gray/High Quality Grayscale" "%% FoomaticRIPOptionSetting: PrintoutMode=High.Gray"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "300ColorCMYK/300 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYK"
+ Choice "300DraftColorCMYK/300 dpi, Draft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftColorCMYK"
+ Choice "300DraftGrayscaleK/300 dpi, Draft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftGrayscaleK"
+ Choice "300GrayscaleK/300 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300GrayscaleK"
+ Choice "600GrayscaleK/600 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=600GrayscaleK"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 9.72 36.00 9.72 9.00 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo or 5x7 inch index card" 360.00 504.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "PhotoTearOff/Photo with tear-off tab" 288.00 432.00 9.00 9.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff" "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "A6TearOff/A6 with tear-off tab" 297.00 420.00 9.00 0.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A6TearOff" "%% FoomaticRIPOptionSetting: PageSize=A6TearOff"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "CDDVD120/CD or DVD 120 mm" 360.00 360.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD120" "%% FoomaticRIPOptionSetting: PageSize=CDDVD120"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+ {
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-DeskJet_850C" " -sDeviceManufacture&&
+r=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;DESKJET 850&quot;"
+ // <%DJ850:Normal%>
+ }
+ {
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-DeskJet_890C" " -sDeviceManufacture&&
+r=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;DESKJET 890&quot;"
+ // <%DJ890:Normal%>
+ }
+} // end DJ850 and DJ890
+
+///////////////////// LJZjsMono (for proprietary plugin)
+{
+ Attribute "DefaultResolution" "" "600dpi"
+
+ // Custom page sizes from 1x4in to Ledger
+ HWMargins 18 14.4 18 14.4
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 11in 17in
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-LaserJet_1018 hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C%D -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-LaserJet_1018" " -sDeviceManufactur&&
+er=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;HP LaserJet 1018&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=600DraftGraysca&&
+leK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=600GrayscaleK"
+ Attribute "FoomaticRIPOption" "MediaType" "enum CmdLine C"
+ Attribute "FoomaticRipOptionSetting" "MediaType=Plain" ",Quality:MediaType=0"
+ Attribute "FoomaticRipOptionSetting" "MediaType=Transparency" ",Quality:MediaType=3"
+ Attribute "FoomaticRipOptionSetting" "MediaType=Photo" ",Quality:MediaType=3"
+ Attribute "FoomaticRIPOption" "InputSlot" "enum CmdLine D"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Default" ",PS:MediaPosition=7"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Manual" ",PS:MediaPosition=2"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600DraftGrayscaleK" " -r600 -sIjsPar&&
+ams=Quality:Quality=1,Quality:ColorMode=0,Quality:PenSet=0"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600GrayscaleK" " -r600 -sIjsParams=Q&&
+uality:Quality=0,Quality:ColorMode=0,Quality:PenSet=0"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft (Economy)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ *Choice "Normal/Normal" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Option "MediaType/Media Type" PickOne AnySetup 10.0
+ *Choice "Plain/Plain Paper" "%% FoomaticRIPOptionSetting: MediaType=Plain"
+ Choice "Transparency/Transparency" "%% FoomaticRIPOptionSetting: MediaType=&&
+Transparency"
+ Choice "Photo/Photo Paper" "%% FoomaticRIPOptionSetting: MediaType=Photo"
+ Option "InputSlot/Media Source" PickOne AnySetup 100.0
+ *Choice "Default/Automatic" "%% FoomaticRIPOptionSetting: InputSlot=Default"
+ Choice "Manual/Manual Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Manual"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Toner Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "600DraftGrayscaleK/600 dpi, Draft, Grayscale, Black Toner" "%% FoomaticRIPOptionSetting: Quality=600DraftGrayscaleK"
+ Choice "600GrayscaleK/600 dpi, Normal, Grayscale, Black Toner" "%% FoomaticRIPOptionSetting: Quality=600GrayscaleK"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo/4x6 inch index card" 288.00 432.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo/5x7 inch index card" 360.00 504.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+ // <%LJZjsMono:Normal%>
+} // end LJZjsMono (for proprietary plugin)
+
+///////////////////// LJZjsMono with No Auto Duplex (for proprietary plugin)
+{
+ Attribute "DefaultResolution" "" "600dpi"
+
+ // Custom page sizes from 1x4in to Ledger
+ HWMargins 18 14.4 18 14.4
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 11in 17in
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-LaserJet_1018 hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C%D -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-LaserJet_1018" " -sDeviceManufactur&&
+er=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;HP LaserJet 1018&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=600DraftGraysca&&
+leK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=600GrayscaleK"
+ Attribute "FoomaticRIPOption" "MediaType" "enum CmdLine C"
+ Attribute "FoomaticRipOptionSetting" "MediaType=Plain" ",Quality:MediaType=0"
+ Attribute "FoomaticRipOptionSetting" "MediaType=Transparency" ",Quality:MediaType=3"
+ Attribute "FoomaticRipOptionSetting" "MediaType=Photo" ",Quality:MediaType=3"
+ Attribute "FoomaticRIPOption" "InputSlot" "enum CmdLine D"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Default" ",PS:MediaPosition=7"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Manual" ",PS:MediaPosition=2"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600DraftGrayscaleK" " -r600 -sIjsPar&&
+ams=Quality:Quality=1,Quality:ColorMode=0,Quality:PenSet=0"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600GrayscaleK" " -r600 -sIjsParams=Q&&
+uality:Quality=0,Quality:ColorMode=0,Quality:PenSet=0"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft (Economy)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ *Choice "Normal/Normal" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Option "MediaType/Media Type" PickOne AnySetup 10.0
+ *Choice "Plain/Plain Paper" "%% FoomaticRIPOptionSetting: MediaType=Plain"
+ Choice "Transparency/Transparency" "%% FoomaticRIPOptionSetting: MediaType=&&
+Transparency"
+ Choice "Photo/Photo Paper" "%% FoomaticRIPOptionSetting: MediaType=Photo"
+ Option "InputSlot/Media Source" PickOne AnySetup 100.0
+ *Choice "Default/Automatic" "%% FoomaticRIPOptionSetting: InputSlot=Default"
+ Choice "Manual/Manual Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Manual"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Toner Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "600DraftGrayscaleK/600 dpi, Draft, Grayscale, Black Toner" "%% FoomaticRIPOptionSetting: Quality=600DraftGrayscaleK"
+ Choice "600GrayscaleK/600 dpi, Normal, Grayscale, Black Toner" "%% FoomaticRIPOptionSetting: Quality=600GrayscaleK"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo/4x6 inch index card" 288.00 432.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo/5x7 inch index card" 360.00 504.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+ // <%LJZjsMono:NoAutoDuplex%>
+} // end LJZjsMono with No Auto Duplex (for proprietary plugin)
+
+///////////////////// LJZjsMono with Auto Duplex (for proprietary plugin)
+{
+ Attribute "DefaultResolution" "" "600dpi"
+
+ // Custom page sizes from 1x4in to Ledger
+ HWMargins 18 14.4 18 14.4
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 11in 17in
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-LaserJet_1018 hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C%D -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-LaserJet_1018" " -sDeviceManufactur&&
+er=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;HP LaserJet 1018&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=600DraftGraysca&&
+leK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=600GrayscaleK"
+ Attribute "FoomaticRIPOption" "MediaType" "enum CmdLine C"
+ Attribute "FoomaticRipOptionSetting" "MediaType=Plain" ",Quality:MediaType=0"
+ Attribute "FoomaticRipOptionSetting" "MediaType=Transparency" ",Quality:MediaType=3"
+ Attribute "FoomaticRipOptionSetting" "MediaType=Photo" ",Quality:MediaType=3"
+ Attribute "FoomaticRIPOption" "InputSlot" "enum CmdLine D"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Default" ",PS:MediaPosition=7"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Manual" ",PS:MediaPosition=2"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600DraftGrayscaleK" " -r600 -sIjsPar&&
+ams=Quality:Quality=1,Quality:ColorMode=0,Quality:PenSet=0"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600GrayscaleK" " -r600 -sIjsParams=Q&&
+uality:Quality=0,Quality:ColorMode=0,Quality:PenSet=0"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft (Economy)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ *Choice "Normal/Normal" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Option "MediaType/Media Type" PickOne AnySetup 10.0
+ *Choice "Plain/Plain Paper" "%% FoomaticRIPOptionSetting: MediaType=Plain"
+ Choice "Transparency/Transparency" "%% FoomaticRIPOptionSetting: MediaType=&&
+Transparency"
+ Choice "Photo/Photo Paper" "%% FoomaticRIPOptionSetting: MediaType=Photo"
+ Option "InputSlot/Media Source" PickOne AnySetup 100.0
+ *Choice "Default/Automatic" "%% FoomaticRIPOptionSetting: InputSlot=Default"
+ Choice "Manual/Manual Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Manual"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Toner Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "600DraftGrayscaleK/600 dpi, Draft, Grayscale, Black Toner" "%% FoomaticRIPOptionSetting: Quality=600DraftGrayscaleK"
+ Choice "600GrayscaleK/600 dpi, Normal, Grayscale, Black Toner" "%% FoomaticRIPOptionSetting: Quality=600GrayscaleK"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo/4x6 inch index card" 288.00 432.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo/5x7 inch index card" 360.00 504.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+ // <%LJZjsMono:Duplex%>
+} // end LJZjsMono with Auto Duplex (for proprietary plugin)
+
+///////////// LJJetReady (for proprietary plugin)
+{
+ Attribute "DefaultResolution" "" "600dpi"
+
+ // Custom page sizes from 1x4in to Ledger
+ HWMargins 18 14.4 18 14.4
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 11in 17in
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-Color_LaserJet_3500 hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-Color_LaserJet_3500" " -sDeviceManu&&
+facturer=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;hp color Lase&&
+rJet 3500&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=NormalColor" "Quality=NormalColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=NormalGray" "Quality=NormalGraysc&&
+aleCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=BestColor" "Quality=BestColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=BestGray" "Quality=BestGraysc&&
+aleCMYK"
+ Attribute "FoomaticRIPOption" "InputSlot" "enum CmdLine C"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Default" ",PS:MediaPosition=7"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=PhotoTray" ",PS:MediaPosition=6"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Upper" ",PS:MediaPosition=1"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Lower" ",PS:MediaPosition=4"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Envelope" ",PS:MediaPosition=3"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=LargeCapacity" ",PS:MediaPosition=&&
+5"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Manual" ",PS:MediaPosition=2"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=MPTray" ",PS:MediaPosition=8"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ Attribute "FoomaticRIPOption" "Duplex" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexNoTumble" " -dDuplex=true -dTum&&
+ble=false"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexTumble" " -dDuplex=true -dTumbl&&
+e=true"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=None" " -dDuplex=false"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=NormalColorCMYK" " -r600 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=NormalGrayscaleCMYK" " -r600 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=BestColorCMYK" " -r600 -sIjsParams=Qu&&
+ality:Quality=2,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=BestGrayscaleCMYK" " -r600 -sIjsParam&&
+s=Quality:Quality=2,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ *Choice "NormalColor/Normal Color" "%% FoomaticRIPOptionSetting: PrintoutMode=NormalColor"
+ Choice "NormalGray/Normal Grayscale" "%% FoomaticRIPOptionSetting: PrintoutMode=NormalGray"
+ Choice "BestColor/Best Color" "%% FoomaticRIPOptionSetting: PrintoutMode=BestColor"
+ Choice "BestGray/Best Grayscale" "%% FoomaticRIPOptionSetting: PrintoutMode=BestGray"
+ Option "InputSlot/Media Source" PickOne AnySetup 100.0
+ *Choice "Default/Printer default" "%% FoomaticRIPOptionSetting: InputSlot=Default"
+ Choice "PhotoTray/Photo Tray" "%% FoomaticRIPOptionSetting: InputSlot=PhotoTray"
+ Choice "Upper/Upper Tray" "%% FoomaticRIPOptionSetting: InputSlot=Upper"
+ Choice "Lower/Lower Tray" "%% FoomaticRIPOptionSetting: InputSlot=Lower"
+ Choice "Envelope/Envelope Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Envelope"
+ Choice "LargeCapacity/Large Capacity Tray" "%% FoomaticRIPOptionSetting: InputSlot=LargeCapacity"
+ Choice "Manual/Manual Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Manual"
+ Choice "MPTray/Multi Purpose Tray" "%% FoomaticRIPOptionSetting: InputSlot=MPTray"
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 120.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "%% FoomaticRIPOptionSetting: Duplex=DuplexNoTumble"
+ Choice "DuplexTumble/Short Edge (Flip)" "%% FoomaticRIPOptionSetting: Duplex=DuplexTumble"
+ *Choice "None/Off" "%% FoomaticRIPOptionSetting: Duplex=None"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "NormalColorCMYK/600 dpi, Normal, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=NormalColorCMYK"
+ Choice "NormalGrayscaleCMYK/600 dpi, Normal, Grayscale, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=NormalGrayscaleCMYK"
+ Choice "BestColorCMYK/600 dpi, Best, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=BestColorCMYK"
+ Choice "BestGrayscaleCMYK/600 dpi, Best, Grayscale, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=BestGrayscaleCMYK"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo/4x6 inch index card" 288.00 432.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo/5x7 inch index card" 360.00 504.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+ // <%LJJetReady:Normal%>
+} // end LJJetReady (for proprietary plugin)
+
+///////////// LJm1005 (for proprietary plugin)
+{
+ Attribute "DefaultResolution" "" "600dpi"
+
+ // Custom page sizes from 1x4in to Ledger
+ HWMargins 18 14.4 18 14.4
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 11in 17in
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-LaserJet_M1005 hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C%D -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-LaserJet_M1005" " -sDeviceManufactur&&
+er=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;HP LaserJet M1005&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=600DraftGraysca&&
+leK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=600GrayscaleK"
+ Attribute "FoomaticRIPOption" "MediaType" "enum CmdLine C"
+ Attribute "FoomaticRipOptionSetting" "MediaType=Plain" ",Quality:MediaType=0"
+ Attribute "FoomaticRipOptionSetting" "MediaType=Transparency" ",Quality:MediaType=3"
+ Attribute "FoomaticRipOptionSetting" "MediaType=Photo" ",Quality:MediaType=3"
+ Attribute "FoomaticRIPOption" "InputSlot" "enum CmdLine D"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Default" ",PS:MediaPosition=7"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Manual" ",PS:MediaPosition=2"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600DraftGrayscaleK" " -r600 -sIjsPar&&
+ams=Quality:Quality=1,Quality:ColorMode=0,Quality:PenSet=0"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600GrayscaleK" " -r600 -sIjsParams=Q&&
+uality:Quality=0,Quality:ColorMode=0,Quality:PenSet=0"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600BestGrayscaleK" " -r600 -sIjsParams=Q&&
+uality:Quality=2,Quality:ColorMode=0,Quality:PenSet=0"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft (Economy)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ *Choice "Normal/Normal" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Option "MediaType/Media Type" PickOne AnySetup 10.0
+ *Choice "Plain/Plain Paper" "%% FoomaticRIPOptionSetting: MediaType=Plain"
+ Choice "Transparency/Transparency" "%% FoomaticRIPOptionSetting: MediaType=&&
+Transparency"
+ Choice "Photo/Photo Paper" "%% FoomaticRIPOptionSetting: MediaType=Photo"
+ Option "InputSlot/Media Source" PickOne AnySetup 100.0
+ *Choice "Default/Automatic" "%% FoomaticRIPOptionSetting: InputSlot=Default"
+ Choice "Manual/Manual Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Manual"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Toner Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "600DraftGrayscaleK/600 dpi, Draft, Grayscale, Black Toner" "%% FoomaticRIPOptionSetting: Quality=600DraftGrayscaleK"
+ Choice "600GrayscaleK/600 dpi, Normal, Grayscale, Black Toner" "%% FoomaticRIPOptionSetting: Quality=600GrayscaleK"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo/4x6 inch index card" 288.00 432.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo/5x7 inch index card" 360.00 504.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+ // <%LJm1005:Normal%>
+} // end LJm1005 (for proprietary plugin)
+
+///////////////////// LJZjsColor (for proprietary plugin)
+{
+ Attribute "DefaultResolution" "" "600dpi"
+
+ // Custom page sizes from 1x4in to Ledger
+ HWMargins 18 14.4 18 14.4
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 11in 17in
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-Color_LaserJet_2600n hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C%D -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-Color_LaserJet_2600n" " -sDeviceManufactur&&
+er=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;HP Color LaserJet 2600n&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=DraftColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft.Gray" "Quality=DraftGrayscaleCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=NormalColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal.Gray" "Quality=NormalGrayscaleCMYK"
+ Attribute "FoomaticRIPOption" "MediaType" "enum CmdLine C"
+ Attribute "FoomaticRipOptionSetting" "MediaType=Plain" ",Quality:MediaType=0"
+ Attribute "FoomaticRipOptionSetting" "MediaType=Transparency" ",Quality:MediaType=3"
+ Attribute "FoomaticRipOptionSetting" "MediaType=Photo" ",Quality:MediaType=3"
+ Attribute "FoomaticRIPOption" "InputSlot" "enum CmdLine D"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Default" ",PS:MediaPosition=7"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Manual" ",PS:MediaPosition=2"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=DraftColorCMYK" " -r600 -sIjsPar&&
+ams=Quality:Quality=1,Quality:ColorMode=2,Quality:PenSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=NormalColorCMYK" " -r600 -sIjsParams=Q&&
+uality:Quality=0,Quality:ColorMode=2,Quality:PenSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=DraftGrayscaleCMYK" " -r600 -sIjsPar&&
+ams=Quality:Quality=1,Quality:ColorMode=0,Quality:PenSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=NormalGrayscaleCMYK" " -r600 -sIjsParams=Q&&
+uality:Quality=0,Quality:ColorMode=0,Quality:PenSet=2"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft Color" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ *Choice "Normal/Normal Color" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "Draft.Gray/Draft Grayscale" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft.Gray"
+ Choice "Normal.Gray/Normal Grayscale" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal.Gray"
+ Option "MediaType/Media Type" PickOne AnySetup 10.0
+ *Choice "Plain/Plain Paper" "%% FoomaticRIPOptionSetting: MediaType=Plain"
+ Choice "Transparency/Transparency" "%% FoomaticRIPOptionSetting: MediaType=&&
+Transparency"
+ Choice "Photo/Photo Paper" "%% FoomaticRIPOptionSetting: MediaType=Photo"
+ Option "InputSlot/Media Source" PickOne AnySetup 100.0
+ *Choice "Default/Automatic" "%% FoomaticRIPOptionSetting: InputSlot=Default"
+ Choice "Manual/Manual Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Manual"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Toner Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "DraftColorCMYK/600 dpi, Draft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=DraftColorCMYK"
+ Choice "NormalColorCMYK/600 dpi, Normal, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=NormalColorCMYK"
+ Choice "DraftGrayscaleCMYK/600 dpi, Draft, Grayscale, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=DraftGrayscaleCMYK"
+ Choice "NormalGrayscaleCMYK/600 dpi, Normal, Grayscale, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=NormalGrayscaleCMYK"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo/4x6 inch index card" 288.00 432.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo/5x7 inch index card" 360.00 504.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+
+ {
+ // <%LJZjsColor:Normal%>
+ }
+ {
+ Attribute "hpLJZjsColorVersion" "" "2"
+ // <%LJZjsColor:Advanced%>
+ }
+} // end LJZjsColor (for proprietary plugin)
+
+///////////// LJP1XXX (for proprietary plugin)
+{
+ Attribute "DefaultResolution" "" "600dpi"
+
+ // Custom page sizes from 1x4in to Ledger
+ HWMargins 18 14.4 18 14.4
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 11in 17in
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-LaserJet_M1005 hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C%D -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-LaserJet_M1005" " -sDeviceManufactur&&
+er=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;HP LaserJet P1005&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=600DraftGraysca&&
+leK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=600GrayscaleK"
+ Attribute "FoomaticRIPOption" "MediaType" "enum CmdLine C"
+ Attribute "FoomaticRipOptionSetting" "MediaType=Plain" ",Quality:MediaType=0"
+ Attribute "FoomaticRipOptionSetting" "MediaType=Transparency" ",Quality:MediaType=3"
+ Attribute "FoomaticRipOptionSetting" "MediaType=Photo" ",Quality:MediaType=3"
+ Attribute "FoomaticRIPOption" "InputSlot" "enum CmdLine D"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Default" ",PS:MediaPosition=7"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Manual" ",PS:MediaPosition=2"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600DraftGrayscaleK" " -r600 -sIjsPar&&
+ams=Quality:Quality=1,Quality:ColorMode=0,Quality:PenSet=0"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600GrayscaleK" " -r600 -sIjsParams=Q&&
+uality:Quality=0,Quality:ColorMode=0,Quality:PenSet=0"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600BestGrayscaleK" " -r600 -sIjsParams=Q&&
+uality:Quality=2,Quality:ColorMode=0,Quality:PenSet=0"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft (Economy)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ *Choice "Normal/Normal" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Option "MediaType/Media Type" PickOne AnySetup 10.0
+ *Choice "Plain/Plain Paper" "%% FoomaticRIPOptionSetting: MediaType=Plain"
+ Choice "Transparency/Transparency" "%% FoomaticRIPOptionSetting: MediaType=&&
+Transparency"
+ Choice "Photo/Photo Paper" "%% FoomaticRIPOptionSetting: MediaType=Photo"
+ Option "InputSlot/Media Source" PickOne AnySetup 100.0
+ *Choice "Default/Automatic" "%% FoomaticRIPOptionSetting: InputSlot=Default"
+ Choice "Manual/Manual Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Manual"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Toner Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "600DraftGrayscaleK/600 dpi, Draft, Grayscale, Black Toner" "%% FoomaticRIPOptionSetting: Quality=600DraftGrayscaleK"
+ Choice "600GrayscaleK/600 dpi, Normal, Grayscale, Black Toner" "%% FoomaticRIPOptionSetting: Quality=600GrayscaleK"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo/4x6 inch index card" 288.00 432.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo/5x7 inch index card" 360.00 504.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 14.40 18.00 14.40 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+ // <%LJP1XXX:Normal%>
+} // end LJP1XXX (for proprietary plugin)
+
+/////////////// Stabler
+{
+ Attribute "DefaultResolution" "" "600dpi"
+
+ // Custom page sizes from 1x4in to SuperB
+ HWMargins 18 36 18 9
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 936 1368
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-DeskJet_5650 hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-DeskJet_5650" " -sDeviceManufacture&&
+r=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;deskjet 5600&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=300FastDraftCol&&
+orCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft.Gray" "Quality=300FastDra&&
+ftGrayscaleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=300ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal.Gray" "Quality=300Graysc&&
+aleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High" "Quality=600ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High.Gray" "Quality=600Grayscal&&
+eK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Photo" "Quality=600PhotoCMYKFu&&
+llBleed"
+ Attribute "FoomaticRIPOption" "InputSlot" "enum CmdLine C"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Default" ",PS:MediaPosition=7"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=PhotoTray" ",PS:MediaPosition=6"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Upper" ",PS:MediaPosition=1"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Lower" ",PS:MediaPosition=4"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=CDDVDTray" ",PS:MediaPosition=14"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Envelope" ",PS:MediaPosition=3"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=LargeCapacity" ",PS:MediaPosition=&&
+5"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Manual" ",PS:MediaPosition=2"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=MPTray" ",PS:MediaPosition=8"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=PhotoTearOff" " -dDEVICEWIDTHPOINTS&&
+=288 -dDEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6TearOff" " -dDEVICEWIDTHPOINTS=29&&
+7 -dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD120" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ /////////// Large format paper support
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B4JIS" " -dDEVICEWIDTHPOINTS=729 -d&&
+DEVICEHEIGHTPOINTS=1033"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Ledger" " -dDEVICEWIDTHPOINTS=792 -&&
+dDEVICEHEIGHTPOINTS=1224"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=SuperB" " -dDEVICEWIDTHPOINTS=936 -&&
+dDEVICEHEIGHTPOINTS=1368"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w774h1116" " -dDEVICEWIDTHPOINTS=77&&
+4 -dDEVICEHEIGHTPOINTS=1116"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A3" " -dDEVICEWIDTHPOINTS=842 -dDEV&&
+ICEHEIGHTPOINTS=1190"
+ Attribute "FoomaticRIPOption" "Duplex" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexNoTumble" " -dDuplex=true -dTum&&
+ble=false"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexTumble" " -dDuplex=true -dTumbl&&
+e=true"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=None" " -dDuplex=false"
+ Attribute "FoomaticRIPOption" "DryTime" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Zero" ""
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Five" ",DryTime=5"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Ten" ",DryTime=10"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Fifteen" ",DryTime=15"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Twenty" ",DryTime=20"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=TwentyFive" ",DryTime=25"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Thirty" ",DryTime=30"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYK" " -r300 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYKFullBleed" " -r300 -sIjs&&
+Params=Quality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:FullBleed=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftColorCMYK" " -r300 -sIjsPara&&
+ms=Quality:Quality=1,Quality:ColorMode=2,Quality:MediaType=0,Quality:P&&
+enSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftGrayscaleK" " -r300 -sIjs&&
+Params=Quality:Quality=1,Quality:ColorMode=0,Quality:MediaType=0,Quali&&
+ty:PenSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300FastDraftColorCMYK" " -r300 -sIjs&&
+Params=Quality:Quality=4,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:SpeedMech=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300FastDraftGrayscaleK" " -r300 -&&
+sIjsParams=Quality:Quality=4,Quality:ColorMode=0,Quality:MediaType=0,Q&&
+uality:PenSet=2,Quality:SpeedMech=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300GrayscaleK" " -r300 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMYK" " -r600 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMYKFullBleed" " -r600 -sIjs&&
+Params=Quality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:FullBleed=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600GrayscaleK" " -r600 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600PhotoCMYK" " -r600 -sIjsParams=&&
+Quality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenS&&
+et=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600PhotoCMYKFullBleed" " -r600 -sI&&
+jsParams=Quality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Qua&&
+lity:PenSet=2,Quality:FullBleed=1"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ Choice "Draft.Gray/Draft Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft.Gray"
+ *Choice "Normal/Normal (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "Normal.Gray/Normal Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal.Gray"
+ Choice "High/High Quality (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=High"
+ Choice "High.Gray/High Quality Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=High.Gray"
+ Choice "Photo/Photo (on photo paper)" "%% FoomaticRIPOptionSetting: PrintoutMode=Photo"
+ Option "InputSlot/Media Source" PickOne AnySetup 100.0
+ *Choice "Default/Printer default" "%% FoomaticRIPOptionSetting: InputSlot=Default"
+ Choice "PhotoTray/Photo Tray" "%% FoomaticRIPOptionSetting: InputSlot=PhotoTray"
+ Choice "Upper/Upper Tray" "%% FoomaticRIPOptionSetting: InputSlot=Upper"
+ Choice "Lower/Lower Tray" "%% FoomaticRIPOptionSetting: InputSlot=Lower"
+ Choice "CDDVDTray/CD or DVD Tray" "%% FoomaticRIPOptionSetting: InputSlot=CDDVDTray"
+ Choice "Envelope/Envelope Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Envelope"
+ Choice "LargeCapacity/Large Capacity Tray" "%% FoomaticRIPOptionSetting: InputSlot=LargeCapacity"
+ Choice "Manual/Manual Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Manual"
+ Choice "MPTray/Multi Purpose Tray" "%% FoomaticRIPOptionSetting: InputSlot=MPTray"
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 120.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "%% FoomaticRIPOptionSetting: Duplex=DuplexNoTumble"
+ Choice "DuplexTumble/Short Edge (Flip)" "%% FoomaticRIPOptionSetting: Duplex=DuplexTumble"
+ *Choice "None/Off" "%% FoomaticRIPOptionSetting: Duplex=None"
+ Option "DryTime/Additional Dry Time" PickOne AnySetup 120.0
+ *Choice "Zero/Printer Default" "%% FoomaticRIPOptionSetting: DryTime=Zero"
+ Choice "Five/5 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Five"
+ Choice "Ten/10 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Ten"
+ Choice "Fifteen/15 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Fifteen"
+ Choice "Twenty/20 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Twenty"
+ Choice "TwentyFive/25 Seconds" "%% FoomaticRIPOptionSetting: DryTime=TwentyFive"
+ Choice "Thirty/30 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Thirty"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "300ColorCMYK/300 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYK"
+ Choice "300ColorCMYKFullBleed/300 dpi, Color, Full Bleed, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYKFullBleed"
+ Choice "300DraftColorCMYK/300 dpi, Draft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftColorCMYK"
+ Choice "300DraftGrayscaleK/300 dpi, Draft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftGrayscaleK"
+ Choice "300FastDraftColorCMYK/300 dpi, FastDraft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300FastDraftColorCMYK"
+ Choice "300FastDraftGrayscaleK/300 dpi, FastDraft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300FastDraftGrayscaleK"
+ Choice "300GrayscaleK/300 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300GrayscaleK"
+ Choice "600ColorCMYK/600 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMYK"
+ Choice "600ColorCMYKFullBleed/600 dpi, Color, Full Bleed, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMYKFullBleed"
+ Choice "600GrayscaleK/600 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=600GrayscaleK"
+ Choice "600PhotoCMYK/600 dpi, Photo, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=600PhotoCMYK"
+ Choice "600PhotoCMYKFullBleed/600 dpi, Photo, Full Bleed, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=600PhotoCMYKFullBleed"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 9.72 36.00 9.72 9.00 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo or 5x7 inch index card" 360.00 504.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "PhotoTearOff/Photo with tear-off tab" 288.00 432.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff" "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "A6TearOff/A6 with tear-off tab" 297.00 420.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=A6TearOff" "%% FoomaticRIPOptionSetting: PageSize=A6TearOff"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "CDDVD120/CD or DVD 120 mm" 360.00 360.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD120" "%% FoomaticRIPOptionSetting: PageSize=CDDVD120"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+ // <%Stabler:Normal%>
+} // end Stabler
+
+////////// StingrayOJ
+{
+ Attribute "DefaultResolution" "" "1200dpi"
+
+ // Custom page sizes from 1x4in to Legal
+ HWMargins 18 36 18 9
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 8.5in 14in
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-DeskJet_5550 hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-DeskJet_5550" " -sDeviceManufacture&&
+r=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;deskjet 5550&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=300FastDraftCol&&
+orCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft.Gray" "Quality=300FastDra&&
+ftGrayscaleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=300ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal.Gray" "Quality=300Graysc&&
+aleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High" "Quality=600ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High.Gray" "Quality=600Grayscal&&
+eK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Photo" "Quality=1200PhotoCMYKFu&&
+llBleed"
+ Attribute "FoomaticRIPOption" "InputSlot" "enum CmdLine C"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Default" ",PS:MediaPosition=7"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=PhotoTray" ",PS:MediaPosition=6"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Upper" ",PS:MediaPosition=1"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Lower" ",PS:MediaPosition=4"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=CDDVDTray" ",PS:MediaPosition=14"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Envelope" ",PS:MediaPosition=3"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=LargeCapacity" ",PS:MediaPosition=&&
+5"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Manual" ",PS:MediaPosition=2"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=MPTray" ",PS:MediaPosition=8"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=PhotoTearOff" " -dDEVICEWIDTHPOINTS&&
+=288 -dDEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6TearOff" " -dDEVICEWIDTHPOINTS=29&&
+7 -dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD120" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ Attribute "FoomaticRIPOption" "Duplex" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexNoTumble" " -dDuplex=true -dTum&&
+ble=false"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexTumble" " -dDuplex=true -dTumbl&&
+e=true"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=None" " -dDuplex=false"
+ Attribute "FoomaticRIPOption" "DryTime" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Zero" ""
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Five" ",DryTime=5"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Ten" ",DryTime=10"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Fifteen" ",DryTime=15"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Twenty" ",DryTime=20"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=TwentyFive" ",DryTime=25"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Thirty" ",DryTime=30"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYK" " -r300 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYKFullBleed" " -r300 -sIjs&&
+Params=Quality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:FullBleed=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftColorCMYK" " -r300 -sIjsPara&&
+ms=Quality:Quality=1,Quality:ColorMode=2,Quality:MediaType=0,Quality:P&&
+enSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftGrayscaleK" " -r300 -sIjs&&
+Params=Quality:Quality=1,Quality:ColorMode=0,Quality:MediaType=0,Quali&&
+ty:PenSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300FastDraftColorCMYK" " -r300 -sIjs&&
+Params=Quality:Quality=4,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:SpeedMech=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300FastDraftGrayscaleK" " -r300 -&&
+sIjsParams=Quality:Quality=4,Quality:ColorMode=0,Quality:MediaType=0,Q&&
+uality:PenSet=2,Quality:SpeedMech=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300GrayscaleK" " -r300 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMYK" " -r600 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMYKFullBleed" " -r600 -sIjs&&
+Params=Quality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:FullBleed=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600GrayscaleK" " -r600 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=1200PhotoCMYK" " -r1200 -sIjsParams=&&
+Quality:Quality=3,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenS&&
+et=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=1200PhotoCMYKFullBleed" " -r1200 -sI&&
+jsParams=Quality:Quality=3,Quality:ColorMode=2,Quality:MediaType=2,Qua&&
+lity:PenSet=2,Quality:FullBleed=1"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ Choice "Draft.Gray/Draft Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft.Gray"
+ *Choice "Normal/Normal (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "Normal.Gray/Normal Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal.Gray"
+ Choice "High/High Quality (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=High"
+ Choice "High.Gray/High Quality Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=High.Gray"
+ Choice "Photo/Photo (on photo paper)" "%% FoomaticRIPOptionSetting: PrintoutMode=Photo"
+ Option "InputSlot/Media Source" PickOne AnySetup 100.0
+ *Choice "Default/Printer default" "%% FoomaticRIPOptionSetting: InputSlot=Default"
+ Choice "PhotoTray/Photo Tray" "%% FoomaticRIPOptionSetting: InputSlot=PhotoTray"
+ Choice "Upper/Upper Tray" "%% FoomaticRIPOptionSetting: InputSlot=Upper"
+ Choice "Lower/Lower Tray" "%% FoomaticRIPOptionSetting: InputSlot=Lower"
+ Choice "CDDVDTray/CD or DVD Tray" "%% FoomaticRIPOptionSetting: InputSlot=CDDVDTray"
+ Choice "Envelope/Envelope Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Envelope"
+ Choice "LargeCapacity/Large Capacity Tray" "%% FoomaticRIPOptionSetting: InputSlot=LargeCapacity"
+ Choice "Manual/Manual Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Manual"
+ Choice "MPTray/Multi Purpose Tray" "%% FoomaticRIPOptionSetting: InputSlot=MPTray"
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 120.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "%% FoomaticRIPOptionSetting: Duplex=DuplexNoTumble"
+ Choice "DuplexTumble/Short Edge (Flip)" "%% FoomaticRIPOptionSetting: Duplex=DuplexTumble"
+ *Choice "None/Off" "%% FoomaticRIPOptionSetting: Duplex=None"
+ Option "DryTime/Additional Dry Time" PickOne AnySetup 120.0
+ *Choice "Zero/Printer Default" "%% FoomaticRIPOptionSetting: DryTime=Zero"
+ Choice "Five/5 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Five"
+ Choice "Ten/10 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Ten"
+ Choice "Fifteen/15 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Fifteen"
+ Choice "Twenty/20 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Twenty"
+ Choice "TwentyFive/25 Seconds" "%% FoomaticRIPOptionSetting: DryTime=TwentyFive"
+ Choice "Thirty/30 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Thirty"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "300ColorCMYK/300 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYK"
+ Choice "300ColorCMYKFullBleed/300 dpi, Color, Full Bleed, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYKFullBleed"
+ Choice "300DraftColorCMYK/300 dpi, Draft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftColorCMYK"
+ Choice "300DraftGrayscaleK/300 dpi, Draft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftGrayscaleK"
+ Choice "300FastDraftColorCMYK/300 dpi, FastDraft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300FastDraftColorCMYK"
+ Choice "300FastDraftGrayscaleK/300 dpi, FastDraft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300FastDraftGrayscaleK"
+ Choice "300GrayscaleK/300 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300GrayscaleK"
+ Choice "600ColorCMYK/600 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMYK"
+ Choice "600ColorCMYKFullBleed/600 dpi, Color, Full Bleed, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMYKFullBleed"
+ Choice "600GrayscaleK/600 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=600GrayscaleK"
+ Choice "1200PhotoCMYK/1200 dpi, Photo, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=1200PhotoCMYK"
+ Choice "1200PhotoCMYKFullBleed/1200 dpi, Photo, Full Bleed, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=1200PhotoCMYKFullBleed"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 9.72 36.00 9.72 9.00 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo or 5x7 inch index card" 360.00 504.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "PhotoTearOff/Photo with tear-off tab" 288.00 432.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff" "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "A6TearOff/A6 with tear-off tab" 297.00 420.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=A6TearOff" "%% FoomaticRIPOptionSetting: PageSize=A6TearOff"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "CDDVD120/CD or DVD 120 mm" 360.00 360.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD120" "%% FoomaticRIPOptionSetting: PageSize=CDDVD120"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+ // <%StingrayOJ:Normal%>
+} // end StingrayOJ
+
+////////// Copperhead
+{
+ Attribute "DefaultResolution" "" "1200dpi"
+
+ // Custom page sizes from 1x4in to Legal
+ HWMargins 18 36 18 9
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 8.5in 14in
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-DeskJet_5550 hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-DeskJet_5550" " -sDeviceManufacture&&
+r=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;deskjet 5550&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=300FastDraftCol&&
+orCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft.Gray" "Quality=300FastDra&&
+ftGrayscaleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=300ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal.Gray" "Quality=300Graysc&&
+aleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High" "Quality=600ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High.Gray" "Quality=600Grayscal&&
+eK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Photo" "Quality=1200PhotoCMYKFu&&
+llBleed"
+ Attribute "FoomaticRIPOption" "InputSlot" "enum CmdLine C"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Default" ",PS:MediaPosition=7"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=PhotoTray" ",PS:MediaPosition=6"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Upper" ",PS:MediaPosition=1"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Lower" ",PS:MediaPosition=4"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=CDDVDTray" ",PS:MediaPosition=14"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Envelope" ",PS:MediaPosition=3"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=LargeCapacity" ",PS:MediaPosition=&&
+5"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Manual" ",PS:MediaPosition=2"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=MPTray" ",PS:MediaPosition=8"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=PhotoTearOff" " -dDEVICEWIDTHPOINTS&&
+=288 -dDEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6TearOff" " -dDEVICEWIDTHPOINTS=29&&
+7 -dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD120" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ Attribute "FoomaticRIPOption" "Duplex" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexNoTumble" " -dDuplex=true -dTum&&
+ble=false"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexTumble" " -dDuplex=true -dTumbl&&
+e=true"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=None" " -dDuplex=false"
+ Attribute "FoomaticRIPOption" "DryTime" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Zero" ""
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Five" ",DryTime=5"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Ten" ",DryTime=10"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Fifteen" ",DryTime=15"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Twenty" ",DryTime=20"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=TwentyFive" ",DryTime=25"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Thirty" ",DryTime=30"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYK" " -r300 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYKFullBleed" " -r300 -sIjs&&
+Params=Quality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:FullBleed=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftColorCMYK" " -r300 -sIjsPara&&
+ms=Quality:Quality=1,Quality:ColorMode=2,Quality:MediaType=0,Quality:P&&
+enSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftGrayscaleK" " -r300 -sIjs&&
+Params=Quality:Quality=1,Quality:ColorMode=0,Quality:MediaType=0,Quali&&
+ty:PenSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300FastDraftColorCMYK" " -r300 -sIjs&&
+Params=Quality:Quality=4,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:SpeedMech=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300FastDraftGrayscaleK" " -r300 -&&
+sIjsParams=Quality:Quality=4,Quality:ColorMode=0,Quality:MediaType=0,Q&&
+uality:PenSet=2,Quality:SpeedMech=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300GrayscaleK" " -r300 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMYK" " -r600 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMYKFullBleed" " -r600 -sIjs&&
+Params=Quality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:FullBleed=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600GrayscaleK" " -r600 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=1200PhotoCMYK" " -r1200 -sIjsParams=&&
+Quality:Quality=3,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenS&&
+et=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=1200PhotoCMYKFullBleed" " -r1200 -sI&&
+jsParams=Quality:Quality=3,Quality:ColorMode=2,Quality:MediaType=2,Qua&&
+lity:PenSet=2,Quality:FullBleed=1"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ Choice "Draft.Gray/Draft Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft.Gray"
+ *Choice "Normal/Normal (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "Normal.Gray/Normal Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal.Gray"
+ Choice "High/High Quality (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=High"
+ Choice "High.Gray/High Quality Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=High.Gray"
+ Choice "Photo/Photo (on photo paper)" "%% FoomaticRIPOptionSetting: PrintoutMode=Photo"
+ Option "InputSlot/Media Source" PickOne AnySetup 100.0
+ *Choice "Default/Printer default" "%% FoomaticRIPOptionSetting: InputSlot=Default"
+ Choice "PhotoTray/Photo Tray" "%% FoomaticRIPOptionSetting: InputSlot=PhotoTray"
+ Choice "Upper/Upper Tray" "%% FoomaticRIPOptionSetting: InputSlot=Upper"
+ Choice "Lower/Lower Tray" "%% FoomaticRIPOptionSetting: InputSlot=Lower"
+ Choice "CDDVDTray/CD or DVD Tray" "%% FoomaticRIPOptionSetting: InputSlot=CDDVDTray"
+ Choice "Envelope/Envelope Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Envelope"
+ Choice "LargeCapacity/Large Capacity Tray" "%% FoomaticRIPOptionSetting: InputSlot=LargeCapacity"
+ Choice "Manual/Manual Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Manual"
+ Choice "MPTray/Multi Purpose Tray" "%% FoomaticRIPOptionSetting: InputSlot=MPTray"
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 120.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "%% FoomaticRIPOptionSetting: Duplex=DuplexNoTumble"
+ Choice "DuplexTumble/Short Edge (Flip)" "%% FoomaticRIPOptionSetting: Duplex=DuplexTumble"
+ *Choice "None/Off" "%% FoomaticRIPOptionSetting: Duplex=None"
+ Option "DryTime/Additional Dry Time" PickOne AnySetup 120.0
+ *Choice "Zero/Printer Default" "%% FoomaticRIPOptionSetting: DryTime=Zero"
+ Choice "Five/5 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Five"
+ Choice "Ten/10 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Ten"
+ Choice "Fifteen/15 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Fifteen"
+ Choice "Twenty/20 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Twenty"
+ Choice "TwentyFive/25 Seconds" "%% FoomaticRIPOptionSetting: DryTime=TwentyFive"
+ Choice "Thirty/30 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Thirty"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "300ColorCMYK/300 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYK"
+ Choice "300ColorCMYKFullBleed/300 dpi, Color, Full Bleed, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYKFullBleed"
+ Choice "300DraftColorCMYK/300 dpi, Draft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftColorCMYK"
+ Choice "300DraftGrayscaleK/300 dpi, Draft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftGrayscaleK"
+ Choice "300FastDraftColorCMYK/300 dpi, FastDraft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300FastDraftColorCMYK"
+ Choice "300FastDraftGrayscaleK/300 dpi, FastDraft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300FastDraftGrayscaleK"
+ Choice "300GrayscaleK/300 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300GrayscaleK"
+ Choice "600ColorCMYK/600 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMYK"
+ Choice "600ColorCMYKFullBleed/600 dpi, Color, Full Bleed, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMYKFullBleed"
+ Choice "600GrayscaleK/600 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=600GrayscaleK"
+ Choice "1200PhotoCMYK/1200 dpi, Photo, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=1200PhotoCMYK"
+ Choice "1200PhotoCMYKFullBleed/1200 dpi, Photo, Full Bleed, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=1200PhotoCMYKFullBleed"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 9.72 36.00 9.72 9.00 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo or 5x7 inch index card" 360.00 504.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "PhotoTearOff/Photo with tear-off tab" 288.00 432.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff" "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "A6TearOff/A6 with tear-off tab" 297.00 420.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=A6TearOff" "%% FoomaticRIPOptionSetting: PageSize=A6TearOff"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "CDDVD120/CD or DVD 120 mm" 360.00 360.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD120" "%% FoomaticRIPOptionSetting: PageSize=CDDVD120"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+ // <%Copperhead:Normal%>
+ // <%Copperhead:AutoDuplex%>
+} // end Copperhead
+
+
+////////// Saipan
+{
+ Attribute "DefaultResolution" "" "1200dpi"
+
+ // Custom page sizes from 1x4in to Legal
+ HWMargins 18 36 18 9
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 8.5in 14in
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-DeskJet_5550 hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-DeskJet_5550" " -sDeviceManufacture&&
+r=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;deskjet 5550&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=300FastDraftCol&&
+orCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft.Gray" "Quality=300FastDra&&
+ftGrayscaleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=300ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal.Gray" "Quality=300Graysc&&
+aleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High" "Quality=600ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High.Gray" "Quality=600Grayscal&&
+eK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Photo" "Quality=1200PhotoCMYKFu&&
+llBleed"
+ Attribute "FoomaticRIPOption" "InputSlot" "enum CmdLine C"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Default" ",PS:MediaPosition=7"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=PhotoTray" ",PS:MediaPosition=6"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Upper" ",PS:MediaPosition=1"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Lower" ",PS:MediaPosition=4"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=CDDVDTray" ",PS:MediaPosition=14"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Envelope" ",PS:MediaPosition=3"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=LargeCapacity" ",PS:MediaPosition=&&
+5"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Manual" ",PS:MediaPosition=2"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=MPTray" ",PS:MediaPosition=8"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=PhotoTearOff" " -dDEVICEWIDTHPOINTS&&
+=288 -dDEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6TearOff" " -dDEVICEWIDTHPOINTS=29&&
+7 -dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD120" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ Attribute "FoomaticRIPOption" "Duplex" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexNoTumble" " -dDuplex=true -dTum&&
+ble=false"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexTumble" " -dDuplex=true -dTumbl&&
+e=true"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=None" " -dDuplex=false"
+ Attribute "FoomaticRIPOption" "DryTime" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Zero" ""
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Five" ",DryTime=5"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Ten" ",DryTime=10"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Fifteen" ",DryTime=15"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Twenty" ",DryTime=20"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=TwentyFive" ",DryTime=25"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Thirty" ",DryTime=30"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYK" " -r300 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYKFullBleed" " -r300 -sIjs&&
+Params=Quality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:FullBleed=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftColorCMYK" " -r300 -sIjsPara&&
+ms=Quality:Quality=1,Quality:ColorMode=2,Quality:MediaType=0,Quality:P&&
+enSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftGrayscaleK" " -r300 -sIjs&&
+Params=Quality:Quality=1,Quality:ColorMode=0,Quality:MediaType=0,Quali&&
+ty:PenSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300FastDraftColorCMYK" " -r300 -sIjs&&
+Params=Quality:Quality=4,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:SpeedMech=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300FastDraftGrayscaleK" " -r300 -&&
+sIjsParams=Quality:Quality=4,Quality:ColorMode=0,Quality:MediaType=0,Q&&
+uality:PenSet=2,Quality:SpeedMech=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300GrayscaleK" " -r300 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMYK" " -r600 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMYKFullBleed" " -r600 -sIjs&&
+Params=Quality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:FullBleed=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600GrayscaleK" " -r600 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=1200PhotoCMYK" " -r1200 -sIjsParams=&&
+Quality:Quality=3,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenS&&
+et=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=1200PhotoCMYKFullBleed" " -r1200 -sI&&
+jsParams=Quality:Quality=3,Quality:ColorMode=2,Quality:MediaType=2,Qua&&
+lity:PenSet=2,Quality:FullBleed=1"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ Choice "Draft.Gray/Draft Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft.Gray"
+ *Choice "Normal/Normal (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "Normal.Gray/Normal Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal.Gray"
+ Choice "High/High Quality (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=High"
+ Choice "High.Gray/High Quality Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=High.Gray"
+ Choice "Photo/Photo (on photo paper)" "%% FoomaticRIPOptionSetting: PrintoutMode=Photo"
+ Option "InputSlot/Media Source" PickOne AnySetup 100.0
+ *Choice "Default/Printer default" "%% FoomaticRIPOptionSetting: InputSlot=Default"
+ Choice "PhotoTray/Photo Tray" "%% FoomaticRIPOptionSetting: InputSlot=PhotoTray"
+ Choice "Upper/Upper Tray" "%% FoomaticRIPOptionSetting: InputSlot=Upper"
+ Choice "Lower/Lower Tray" "%% FoomaticRIPOptionSetting: InputSlot=Lower"
+ Choice "CDDVDTray/CD or DVD Tray" "%% FoomaticRIPOptionSetting: InputSlot=CDDVDTray"
+ Choice "Envelope/Envelope Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Envelope"
+ Choice "LargeCapacity/Large Capacity Tray" "%% FoomaticRIPOptionSetting: InputSlot=LargeCapacity"
+ Choice "Manual/Manual Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Manual"
+ Choice "MPTray/Multi Purpose Tray" "%% FoomaticRIPOptionSetting: InputSlot=MPTray"
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 120.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "%% FoomaticRIPOptionSetting: Duplex=DuplexNoTumble"
+ Choice "DuplexTumble/Short Edge (Flip)" "%% FoomaticRIPOptionSetting: Duplex=DuplexTumble"
+ *Choice "None/Off" "%% FoomaticRIPOptionSetting: Duplex=None"
+ Option "DryTime/Additional Dry Time" PickOne AnySetup 120.0
+ *Choice "Zero/Printer Default" "%% FoomaticRIPOptionSetting: DryTime=Zero"
+ Choice "Five/5 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Five"
+ Choice "Ten/10 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Ten"
+ Choice "Fifteen/15 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Fifteen"
+ Choice "Twenty/20 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Twenty"
+ Choice "TwentyFive/25 Seconds" "%% FoomaticRIPOptionSetting: DryTime=TwentyFive"
+ Choice "Thirty/30 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Thirty"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "300ColorCMYK/300 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYK"
+ Choice "300ColorCMYKFullBleed/300 dpi, Color, Full Bleed, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYKFullBleed"
+ Choice "300DraftColorCMYK/300 dpi, Draft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftColorCMYK"
+ Choice "300DraftGrayscaleK/300 dpi, Draft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftGrayscaleK"
+ Choice "300FastDraftColorCMYK/300 dpi, FastDraft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300FastDraftColorCMYK"
+ Choice "300FastDraftGrayscaleK/300 dpi, FastDraft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300FastDraftGrayscaleK"
+ Choice "300GrayscaleK/300 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300GrayscaleK"
+ Choice "600ColorCMYK/600 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMYK"
+ Choice "600ColorCMYKFullBleed/600 dpi, Color, Full Bleed, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMYKFullBleed"
+ Choice "600GrayscaleK/600 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=600GrayscaleK"
+ Choice "1200PhotoCMYK/1200 dpi, Photo, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=1200PhotoCMYK"
+ Choice "1200PhotoCMYKFullBleed/1200 dpi, Photo, Full Bleed, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=1200PhotoCMYKFullBleed"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 9.72 36.00 9.72 9.00 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo or 5x7 inch index card" 360.00 504.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "PhotoTearOff/Photo with tear-off tab" 288.00 432.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff" "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "A6TearOff/A6 with tear-off tab" 297.00 420.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=A6TearOff" "%% FoomaticRIPOptionSetting: PageSize=A6TearOff"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "CDDVD120/CD or DVD 120 mm" 360.00 360.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD120" "%% FoomaticRIPOptionSetting: PageSize=CDDVD120"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+ // <%Saipan:Normal%>
+ // <%Saipan:AutoDuplex%>
+} // end Saipan
+
+////////// Python11
+{
+ Attribute "DefaultResolution" "" "1200dpi"
+
+ // Custom page sizes from 1x4in to Legal
+ HWMargins 18 36 18 9
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 8.5in 14in
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-DeskJet_5550 hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-DeskJet_5550" " -sDeviceManufacture&&
+r=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;deskjet 5550&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=300FastDraftCol&&
+orCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft.Gray" "Quality=300FastDra&&
+ftGrayscaleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=300ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal.Gray" "Quality=300Graysc&&
+aleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High" "Quality=600ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High.Gray" "Quality=600Grayscal&&
+eK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Photo" "Quality=1200PhotoCMYKFu&&
+llBleed"
+ Attribute "FoomaticRIPOption" "InputSlot" "enum CmdLine C"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Default" ",PS:MediaPosition=7"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=PhotoTray" ",PS:MediaPosition=6"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Upper" ",PS:MediaPosition=1"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Lower" ",PS:MediaPosition=4"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=CDDVDTray" ",PS:MediaPosition=14"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Envelope" ",PS:MediaPosition=3"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=LargeCapacity" ",PS:MediaPosition=&&
+5"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Manual" ",PS:MediaPosition=2"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=MPTray" ",PS:MediaPosition=8"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=PhotoTearOff" " -dDEVICEWIDTHPOINTS&&
+=288 -dDEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6TearOff" " -dDEVICEWIDTHPOINTS=29&&
+7 -dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD120" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ Attribute "FoomaticRIPOption" "Duplex" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexNoTumble" " -dDuplex=true -dTum&&
+ble=false"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexTumble" " -dDuplex=true -dTumbl&&
+e=true"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=None" " -dDuplex=false"
+ Attribute "FoomaticRIPOption" "DryTime" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Zero" ""
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Five" ",DryTime=5"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Ten" ",DryTime=10"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Fifteen" ",DryTime=15"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Twenty" ",DryTime=20"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=TwentyFive" ",DryTime=25"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Thirty" ",DryTime=30"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYK" " -r300 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYKFullBleed" " -r300 -sIjs&&
+Params=Quality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:FullBleed=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftColorCMYK" " -r300 -sIjsPara&&
+ms=Quality:Quality=1,Quality:ColorMode=2,Quality:MediaType=0,Quality:P&&
+enSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftGrayscaleK" " -r300 -sIjs&&
+Params=Quality:Quality=1,Quality:ColorMode=0,Quality:MediaType=0,Quali&&
+ty:PenSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300FastDraftColorCMYK" " -r300 -sIjs&&
+Params=Quality:Quality=4,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:SpeedMech=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300FastDraftGrayscaleK" " -r300 -&&
+sIjsParams=Quality:Quality=4,Quality:ColorMode=0,Quality:MediaType=0,Q&&
+uality:PenSet=2,Quality:SpeedMech=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300GrayscaleK" " -r300 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMYK" " -r600 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMYKFullBleed" " -r600 -sIjs&&
+Params=Quality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:FullBleed=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600GrayscaleK" " -r600 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=1200PhotoCMYK" " -r1200 -sIjsParams=&&
+Quality:Quality=3,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenS&&
+et=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=1200PhotoCMYKFullBleed" " -r1200 -sI&&
+jsParams=Quality:Quality=3,Quality:ColorMode=2,Quality:MediaType=2,Qua&&
+lity:PenSet=2,Quality:FullBleed=1"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ Choice "Draft.Gray/Draft Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft.Gray"
+ *Choice "Normal/Normal (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "Normal.Gray/Normal Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal.Gray"
+ Choice "High/High Quality (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=High"
+ Choice "High.Gray/High Quality Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=High.Gray"
+ Choice "Photo/Photo (on photo paper)" "%% FoomaticRIPOptionSetting: PrintoutMode=Photo"
+ Option "InputSlot/Media Source" PickOne AnySetup 100.0
+ *Choice "Default/Printer default" "%% FoomaticRIPOptionSetting: InputSlot=Default"
+ Choice "PhotoTray/Photo Tray" "%% FoomaticRIPOptionSetting: InputSlot=PhotoTray"
+ Choice "Upper/Upper Tray" "%% FoomaticRIPOptionSetting: InputSlot=Upper"
+ Choice "Lower/Lower Tray" "%% FoomaticRIPOptionSetting: InputSlot=Lower"
+ Choice "CDDVDTray/CD or DVD Tray" "%% FoomaticRIPOptionSetting: InputSlot=CDDVDTray"
+ Choice "Envelope/Envelope Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Envelope"
+ Choice "LargeCapacity/Large Capacity Tray" "%% FoomaticRIPOptionSetting: InputSlot=LargeCapacity"
+ Choice "Manual/Manual Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Manual"
+ Choice "MPTray/Multi Purpose Tray" "%% FoomaticRIPOptionSetting: InputSlot=MPTray"
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 120.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "%% FoomaticRIPOptionSetting: Duplex=DuplexNoTumble"
+ Choice "DuplexTumble/Short Edge (Flip)" "%% FoomaticRIPOptionSetting: Duplex=DuplexTumble"
+ *Choice "None/Off" "%% FoomaticRIPOptionSetting: Duplex=None"
+ Option "DryTime/Additional Dry Time" PickOne AnySetup 120.0
+ *Choice "Zero/Printer Default" "%% FoomaticRIPOptionSetting: DryTime=Zero"
+ Choice "Five/5 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Five"
+ Choice "Ten/10 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Ten"
+ Choice "Fifteen/15 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Fifteen"
+ Choice "Twenty/20 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Twenty"
+ Choice "TwentyFive/25 Seconds" "%% FoomaticRIPOptionSetting: DryTime=TwentyFive"
+ Choice "Thirty/30 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Thirty"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "300ColorCMYK/300 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYK"
+ Choice "300ColorCMYKFullBleed/300 dpi, Color, Full Bleed, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYKFullBleed"
+ Choice "300DraftColorCMYK/300 dpi, Draft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftColorCMYK"
+ Choice "300DraftGrayscaleK/300 dpi, Draft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftGrayscaleK"
+ Choice "300FastDraftColorCMYK/300 dpi, FastDraft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300FastDraftColorCMYK"
+ Choice "300FastDraftGrayscaleK/300 dpi, FastDraft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300FastDraftGrayscaleK"
+ Choice "300GrayscaleK/300 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300GrayscaleK"
+ Choice "600ColorCMYK/600 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMYK"
+ Choice "600ColorCMYKFullBleed/600 dpi, Color, Full Bleed, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMYKFullBleed"
+ Choice "600GrayscaleK/600 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=600GrayscaleK"
+ Choice "1200PhotoCMYK/1200 dpi, Photo, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=1200PhotoCMYK"
+ Choice "1200PhotoCMYKFullBleed/1200 dpi, Photo, Full Bleed, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=1200PhotoCMYKFullBleed"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 9.72 36.00 9.72 9.00 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo or 5x7 inch index card" 360.00 504.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "PhotoTearOff/Photo with tear-off tab" 288.00 432.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff" "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "A6TearOff/A6 with tear-off tab" 297.00 420.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=A6TearOff" "%% FoomaticRIPOptionSetting: PageSize=A6TearOff"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "CDDVD120/CD or DVD 120 mm" 360.00 360.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD120" "%% FoomaticRIPOptionSetting: PageSize=CDDVD120"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+ // <%Python11:Normal%>
+} // end Python11
+
+
+/////////////// ViperPlusVIP
+{
+ Attribute "DefaultResolution" "" "600dpi"
+
+ // Custom page sizes from 1x4in to SuperB
+ HWMargins 18 36 18 9
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 936 1368
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-DeskJet_5650 hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-DeskJet_5650" " -sDeviceManufacture&&
+r=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;deskjet 5600&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=300FastDraftCol&&
+orCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft.Gray" "Quality=300FastDra&&
+ftGrayscaleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=300ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal.Gray" "Quality=300Graysc&&
+aleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High" "Quality=600ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High.Gray" "Quality=600Grayscal&&
+eK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Photo" "Quality=600PhotoCMYKFu&&
+llBleed"
+ Attribute "FoomaticRIPOption" "InputSlot" "enum CmdLine C"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Default" ",PS:MediaPosition=7"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=PhotoTray" ",PS:MediaPosition=6"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Upper" ",PS:MediaPosition=1"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Lower" ",PS:MediaPosition=4"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=CDDVDTray" ",PS:MediaPosition=14"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Envelope" ",PS:MediaPosition=3"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=LargeCapacity" ",PS:MediaPosition=&&
+5"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Manual" ",PS:MediaPosition=2"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=MPTray" ",PS:MediaPosition=8"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=PhotoTearOff" " -dDEVICEWIDTHPOINTS&&
+=288 -dDEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6TearOff" " -dDEVICEWIDTHPOINTS=29&&
+7 -dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD120" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ /////////// Large format paper support
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B4JIS" " -dDEVICEWIDTHPOINTS=729 -d&&
+DEVICEHEIGHTPOINTS=1033"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Ledger" " -dDEVICEWIDTHPOINTS=792 -&&
+dDEVICEHEIGHTPOINTS=1224"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=SuperB" " -dDEVICEWIDTHPOINTS=936 -&&
+dDEVICEHEIGHTPOINTS=1368"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w774h1116" " -dDEVICEWIDTHPOINTS=77&&
+4 -dDEVICEHEIGHTPOINTS=1116"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A3" " -dDEVICEWIDTHPOINTS=842 -dDEV&&
+ICEHEIGHTPOINTS=1190"
+ Attribute "FoomaticRIPOption" "Duplex" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexNoTumble" " -dDuplex=true -dTum&&
+ble=false"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexTumble" " -dDuplex=true -dTumbl&&
+e=true"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=None" " -dDuplex=false"
+ Attribute "FoomaticRIPOption" "DryTime" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Zero" ""
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Five" ",DryTime=5"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Ten" ",DryTime=10"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Fifteen" ",DryTime=15"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Twenty" ",DryTime=20"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=TwentyFive" ",DryTime=25"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Thirty" ",DryTime=30"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYK" " -r300 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYKFullBleed" " -r300 -sIjs&&
+Params=Quality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:FullBleed=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftColorCMYK" " -r300 -sIjsPara&&
+ms=Quality:Quality=1,Quality:ColorMode=2,Quality:MediaType=0,Quality:P&&
+enSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftGrayscaleK" " -r300 -sIjs&&
+Params=Quality:Quality=1,Quality:ColorMode=0,Quality:MediaType=0,Quali&&
+ty:PenSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300FastDraftColorCMYK" " -r300 -sIjs&&
+Params=Quality:Quality=4,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:SpeedMech=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300FastDraftGrayscaleK" " -r300 -&&
+sIjsParams=Quality:Quality=4,Quality:ColorMode=0,Quality:MediaType=0,Q&&
+uality:PenSet=2,Quality:SpeedMech=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300GrayscaleK" " -r300 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMYK" " -r600 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMYKFullBleed" " -r600 -sIjs&&
+Params=Quality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:FullBleed=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600GrayscaleK" " -r600 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600PhotoCMYK" " -r600 -sIjsParams=&&
+Quality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenS&&
+et=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600PhotoCMYKFullBleed" " -r600 -sI&&
+jsParams=Quality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Qua&&
+lity:PenSet=2,Quality:FullBleed=1"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ Choice "Draft.Gray/Draft Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft.Gray"
+ *Choice "Normal/Normal (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "Normal.Gray/Normal Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal.Gray"
+ Choice "High/High Quality (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=High"
+ Choice "High.Gray/High Quality Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=High.Gray"
+ Choice "Photo/Photo (on photo paper)" "%% FoomaticRIPOptionSetting: PrintoutMode=Photo"
+ Option "InputSlot/Media Source" PickOne AnySetup 100.0
+ *Choice "Default/Printer default" "%% FoomaticRIPOptionSetting: InputSlot=Default"
+ Choice "PhotoTray/Photo Tray" "%% FoomaticRIPOptionSetting: InputSlot=PhotoTray"
+ Choice "Upper/Upper Tray" "%% FoomaticRIPOptionSetting: InputSlot=Upper"
+ Choice "Lower/Lower Tray" "%% FoomaticRIPOptionSetting: InputSlot=Lower"
+ Choice "CDDVDTray/CD or DVD Tray" "%% FoomaticRIPOptionSetting: InputSlot=CDDVDTray"
+ Choice "Envelope/Envelope Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Envelope"
+ Choice "LargeCapacity/Large Capacity Tray" "%% FoomaticRIPOptionSetting: InputSlot=LargeCapacity"
+ Choice "Manual/Manual Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Manual"
+ Choice "MPTray/Multi Purpose Tray" "%% FoomaticRIPOptionSetting: InputSlot=MPTray"
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 120.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "%% FoomaticRIPOptionSetting: Duplex=DuplexNoTumble"
+ Choice "DuplexTumble/Short Edge (Flip)" "%% FoomaticRIPOptionSetting: Duplex=DuplexTumble"
+ *Choice "None/Off" "%% FoomaticRIPOptionSetting: Duplex=None"
+ Option "DryTime/Additional Dry Time" PickOne AnySetup 120.0
+ *Choice "Zero/Printer Default" "%% FoomaticRIPOptionSetting: DryTime=Zero"
+ Choice "Five/5 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Five"
+ Choice "Ten/10 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Ten"
+ Choice "Fifteen/15 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Fifteen"
+ Choice "Twenty/20 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Twenty"
+ Choice "TwentyFive/25 Seconds" "%% FoomaticRIPOptionSetting: DryTime=TwentyFive"
+ Choice "Thirty/30 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Thirty"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "300ColorCMYK/300 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYK"
+ Choice "300ColorCMYKFullBleed/300 dpi, Color, Full Bleed, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYKFullBleed"
+ Choice "300DraftColorCMYK/300 dpi, Draft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftColorCMYK"
+ Choice "300DraftGrayscaleK/300 dpi, Draft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftGrayscaleK"
+ Choice "300FastDraftColorCMYK/300 dpi, FastDraft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300FastDraftColorCMYK"
+ Choice "300FastDraftGrayscaleK/300 dpi, FastDraft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300FastDraftGrayscaleK"
+ Choice "300GrayscaleK/300 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300GrayscaleK"
+ Choice "600ColorCMYK/600 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMYK"
+ Choice "600ColorCMYKFullBleed/600 dpi, Color, Full Bleed, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMYKFullBleed"
+ Choice "600GrayscaleK/600 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=600GrayscaleK"
+ Choice "600PhotoCMYK/600 dpi, Photo, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=600PhotoCMYK"
+ Choice "600PhotoCMYKFullBleed/600 dpi, Photo, Full Bleed, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=600PhotoCMYKFullBleed"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 9.72 36.00 9.72 9.00 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo or 5x7 inch index card" 360.00 504.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "PhotoTearOff/Photo with tear-off tab" 288.00 432.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff" "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "A6TearOff/A6 with tear-off tab" 297.00 420.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=A6TearOff" "%% FoomaticRIPOptionSetting: PageSize=A6TearOff"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "CDDVD120/CD or DVD 120 mm" 360.00 360.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD120" "%% FoomaticRIPOptionSetting: PageSize=CDDVD120"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+ // <%ViperPlusVIP:Normal%>
+ // <%ViperPlusVIP:Trim%>
+ // <%Mimas:NoCDDVD%>
+} // end ViperPlusVIP
+
+/////////////// ViperMinusVIP
+{
+ Attribute "DefaultResolution" "" "600dpi"
+
+ // Custom page sizes from 1x4in to SuperB
+ HWMargins 18 36 18 9
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 936 1368
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-DeskJet_5650 hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-DeskJet_5650" " -sDeviceManufacture&&
+r=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;deskjet 5600&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=300FastDraftCol&&
+orCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft.Gray" "Quality=300FastDra&&
+ftGrayscaleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=300ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal.Gray" "Quality=300Graysc&&
+aleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High" "Quality=600ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High.Gray" "Quality=600Grayscal&&
+eK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Photo" "Quality=600PhotoCMYKFu&&
+llBleed"
+ Attribute "FoomaticRIPOption" "InputSlot" "enum CmdLine C"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Default" ",PS:MediaPosition=7"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=PhotoTray" ",PS:MediaPosition=6"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Upper" ",PS:MediaPosition=1"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Lower" ",PS:MediaPosition=4"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=CDDVDTray" ",PS:MediaPosition=14"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Envelope" ",PS:MediaPosition=3"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=LargeCapacity" ",PS:MediaPosition=&&
+5"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Manual" ",PS:MediaPosition=2"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=MPTray" ",PS:MediaPosition=8"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=PhotoTearOff" " -dDEVICEWIDTHPOINTS&&
+=288 -dDEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6TearOff" " -dDEVICEWIDTHPOINTS=29&&
+7 -dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD120" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ /////////// Large format paper support
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B4JIS" " -dDEVICEWIDTHPOINTS=729 -d&&
+DEVICEHEIGHTPOINTS=1033"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Ledger" " -dDEVICEWIDTHPOINTS=792 -&&
+dDEVICEHEIGHTPOINTS=1224"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=SuperB" " -dDEVICEWIDTHPOINTS=936 -&&
+dDEVICEHEIGHTPOINTS=1368"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w774h1116" " -dDEVICEWIDTHPOINTS=77&&
+4 -dDEVICEHEIGHTPOINTS=1116"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A3" " -dDEVICEWIDTHPOINTS=842 -dDEV&&
+ICEHEIGHTPOINTS=1190"
+ Attribute "FoomaticRIPOption" "Duplex" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexNoTumble" " -dDuplex=true -dTum&&
+ble=false"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexTumble" " -dDuplex=true -dTumbl&&
+e=true"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=None" " -dDuplex=false"
+ Attribute "FoomaticRIPOption" "DryTime" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Zero" ""
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Five" ",DryTime=5"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Ten" ",DryTime=10"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Fifteen" ",DryTime=15"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Twenty" ",DryTime=20"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=TwentyFive" ",DryTime=25"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Thirty" ",DryTime=30"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYK" " -r300 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYKFullBleed" " -r300 -sIjs&&
+Params=Quality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:FullBleed=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftColorCMYK" " -r300 -sIjsPara&&
+ms=Quality:Quality=1,Quality:ColorMode=2,Quality:MediaType=0,Quality:P&&
+enSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftGrayscaleK" " -r300 -sIjs&&
+Params=Quality:Quality=1,Quality:ColorMode=0,Quality:MediaType=0,Quali&&
+ty:PenSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300FastDraftColorCMYK" " -r300 -sIjs&&
+Params=Quality:Quality=4,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:SpeedMech=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300FastDraftGrayscaleK" " -r300 -&&
+sIjsParams=Quality:Quality=4,Quality:ColorMode=0,Quality:MediaType=0,Q&&
+uality:PenSet=2,Quality:SpeedMech=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300GrayscaleK" " -r300 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMYK" " -r600 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMYKFullBleed" " -r600 -sIjs&&
+Params=Quality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:FullBleed=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600GrayscaleK" " -r600 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600PhotoCMYK" " -r600 -sIjsParams=&&
+Quality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenS&&
+et=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600PhotoCMYKFullBleed" " -r600 -sI&&
+jsParams=Quality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Qua&&
+lity:PenSet=2,Quality:FullBleed=1"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ Choice "Draft.Gray/Draft Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft.Gray"
+ *Choice "Normal/Normal (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "Normal.Gray/Normal Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal.Gray"
+ Choice "High/High Quality (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=High"
+ Choice "High.Gray/High Quality Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=High.Gray"
+ Choice "Photo/Photo (on photo paper)" "%% FoomaticRIPOptionSetting: PrintoutMode=Photo"
+ Option "InputSlot/Media Source" PickOne AnySetup 100.0
+ *Choice "Default/Printer default" "%% FoomaticRIPOptionSetting: InputSlot=Default"
+ Choice "PhotoTray/Photo Tray" "%% FoomaticRIPOptionSetting: InputSlot=PhotoTray"
+ Choice "Upper/Upper Tray" "%% FoomaticRIPOptionSetting: InputSlot=Upper"
+ Choice "Lower/Lower Tray" "%% FoomaticRIPOptionSetting: InputSlot=Lower"
+ Choice "CDDVDTray/CD or DVD Tray" "%% FoomaticRIPOptionSetting: InputSlot=CDDVDTray"
+ Choice "Envelope/Envelope Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Envelope"
+ Choice "LargeCapacity/Large Capacity Tray" "%% FoomaticRIPOptionSetting: InputSlot=LargeCapacity"
+ Choice "Manual/Manual Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Manual"
+ Choice "MPTray/Multi Purpose Tray" "%% FoomaticRIPOptionSetting: InputSlot=MPTray"
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 120.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "%% FoomaticRIPOptionSetting: Duplex=DuplexNoTumble"
+ Choice "DuplexTumble/Short Edge (Flip)" "%% FoomaticRIPOptionSetting: Duplex=DuplexTumble"
+ *Choice "None/Off" "%% FoomaticRIPOptionSetting: Duplex=None"
+ Option "DryTime/Additional Dry Time" PickOne AnySetup 120.0
+ *Choice "Zero/Printer Default" "%% FoomaticRIPOptionSetting: DryTime=Zero"
+ Choice "Five/5 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Five"
+ Choice "Ten/10 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Ten"
+ Choice "Fifteen/15 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Fifteen"
+ Choice "Twenty/20 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Twenty"
+ Choice "TwentyFive/25 Seconds" "%% FoomaticRIPOptionSetting: DryTime=TwentyFive"
+ Choice "Thirty/30 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Thirty"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "300ColorCMYK/300 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYK"
+ Choice "300ColorCMYKFullBleed/300 dpi, Color, Full Bleed, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYKFullBleed"
+ Choice "300DraftColorCMYK/300 dpi, Draft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftColorCMYK"
+ Choice "300DraftGrayscaleK/300 dpi, Draft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftGrayscaleK"
+ Choice "300FastDraftColorCMYK/300 dpi, FastDraft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300FastDraftColorCMYK"
+ Choice "300FastDraftGrayscaleK/300 dpi, FastDraft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300FastDraftGrayscaleK"
+ Choice "300GrayscaleK/300 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300GrayscaleK"
+ Choice "600ColorCMYK/600 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMYK"
+ Choice "600ColorCMYKFullBleed/600 dpi, Color, Full Bleed, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMYKFullBleed"
+ Choice "600GrayscaleK/600 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=600GrayscaleK"
+ Choice "600PhotoCMYK/600 dpi, Photo, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=600PhotoCMYK"
+ Choice "600PhotoCMYKFullBleed/600 dpi, Photo, Full Bleed, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=600PhotoCMYKFullBleed"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 9.72 36.00 9.72 9.00 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo or 5x7 inch index card" 360.00 504.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "PhotoTearOff/Photo with tear-off tab" 288.00 432.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff" "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "A6TearOff/A6 with tear-off tab" 297.00 420.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=A6TearOff" "%% FoomaticRIPOptionSetting: PageSize=A6TearOff"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "CDDVD120/CD or DVD 120 mm" 360.00 360.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD120" "%% FoomaticRIPOptionSetting: PageSize=CDDVD120"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+ // <%ViperMinusVIP:Normal%>
+} // end ViperMinusVIP
+
+/////////////// ViperPlusTrim
+{
+ Attribute "DefaultResolution" "" "600dpi"
+
+ // Custom page sizes from 1x4in to SuperB
+ HWMargins 18 36 18 9
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 936 1368
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-DeskJet_5650 hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-DeskJet_5650" " -sDeviceManufacture&&
+r=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;deskjet 5600&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=300FastDraftCol&&
+orCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft.Gray" "Quality=300FastDra&&
+ftGrayscaleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=300ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal.Gray" "Quality=300Graysc&&
+aleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High" "Quality=600ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High.Gray" "Quality=600Grayscal&&
+eK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Photo" "Quality=600PhotoCMYKFu&&
+llBleed"
+ Attribute "FoomaticRIPOption" "InputSlot" "enum CmdLine C"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Default" ",PS:MediaPosition=7"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=PhotoTray" ",PS:MediaPosition=6"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Upper" ",PS:MediaPosition=1"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Lower" ",PS:MediaPosition=4"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=CDDVDTray" ",PS:MediaPosition=14"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Envelope" ",PS:MediaPosition=3"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=LargeCapacity" ",PS:MediaPosition=&&
+5"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Manual" ",PS:MediaPosition=2"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=MPTray" ",PS:MediaPosition=8"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=PhotoTearOff" " -dDEVICEWIDTHPOINTS&&
+=288 -dDEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6TearOff" " -dDEVICEWIDTHPOINTS=29&&
+7 -dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD120" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ /////////// Large format paper support
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B4JIS" " -dDEVICEWIDTHPOINTS=729 -d&&
+DEVICEHEIGHTPOINTS=1033"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Ledger" " -dDEVICEWIDTHPOINTS=792 -&&
+dDEVICEHEIGHTPOINTS=1224"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=SuperB" " -dDEVICEWIDTHPOINTS=936 -&&
+dDEVICEHEIGHTPOINTS=1368"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w774h1116" " -dDEVICEWIDTHPOINTS=77&&
+4 -dDEVICEHEIGHTPOINTS=1116"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A3" " -dDEVICEWIDTHPOINTS=842 -dDEV&&
+ICEHEIGHTPOINTS=1190"
+ Attribute "FoomaticRIPOption" "Duplex" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexNoTumble" " -dDuplex=true -dTum&&
+ble=false"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexTumble" " -dDuplex=true -dTumbl&&
+e=true"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=None" " -dDuplex=false"
+ Attribute "FoomaticRIPOption" "DryTime" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Zero" ""
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Five" ",DryTime=5"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Ten" ",DryTime=10"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Fifteen" ",DryTime=15"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Twenty" ",DryTime=20"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=TwentyFive" ",DryTime=25"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Thirty" ",DryTime=30"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYK" " -r300 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYKFullBleed" " -r300 -sIjs&&
+Params=Quality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:FullBleed=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftColorCMYK" " -r300 -sIjsPara&&
+ms=Quality:Quality=1,Quality:ColorMode=2,Quality:MediaType=0,Quality:P&&
+enSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftGrayscaleK" " -r300 -sIjs&&
+Params=Quality:Quality=1,Quality:ColorMode=0,Quality:MediaType=0,Quali&&
+ty:PenSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300FastDraftColorCMYK" " -r300 -sIjs&&
+Params=Quality:Quality=4,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:SpeedMech=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300FastDraftGrayscaleK" " -r300 -&&
+sIjsParams=Quality:Quality=4,Quality:ColorMode=0,Quality:MediaType=0,Q&&
+uality:PenSet=2,Quality:SpeedMech=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300GrayscaleK" " -r300 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMYK" " -r600 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMYKFullBleed" " -r600 -sIjs&&
+Params=Quality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:FullBleed=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600GrayscaleK" " -r600 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600PhotoCMYK" " -r600 -sIjsParams=&&
+Quality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenS&&
+et=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600PhotoCMYKFullBleed" " -r600 -sI&&
+jsParams=Quality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Qua&&
+lity:PenSet=2,Quality:FullBleed=1"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ Choice "Draft.Gray/Draft Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft.Gray"
+ *Choice "Normal/Normal (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "Normal.Gray/Normal Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal.Gray"
+ Choice "High/High Quality (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=High"
+ Choice "High.Gray/High Quality Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=High.Gray"
+ Choice "Photo/Photo (on photo paper)" "%% FoomaticRIPOptionSetting: PrintoutMode=Photo"
+ Option "InputSlot/Media Source" PickOne AnySetup 100.0
+ *Choice "Default/Printer default" "%% FoomaticRIPOptionSetting: InputSlot=Default"
+ Choice "PhotoTray/Photo Tray" "%% FoomaticRIPOptionSetting: InputSlot=PhotoTray"
+ Choice "Upper/Upper Tray" "%% FoomaticRIPOptionSetting: InputSlot=Upper"
+ Choice "Lower/Lower Tray" "%% FoomaticRIPOptionSetting: InputSlot=Lower"
+ Choice "CDDVDTray/CD or DVD Tray" "%% FoomaticRIPOptionSetting: InputSlot=CDDVDTray"
+ Choice "Envelope/Envelope Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Envelope"
+ Choice "LargeCapacity/Large Capacity Tray" "%% FoomaticRIPOptionSetting: InputSlot=LargeCapacity"
+ Choice "Manual/Manual Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Manual"
+ Choice "MPTray/Multi Purpose Tray" "%% FoomaticRIPOptionSetting: InputSlot=MPTray"
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 120.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "%% FoomaticRIPOptionSetting: Duplex=DuplexNoTumble"
+ Choice "DuplexTumble/Short Edge (Flip)" "%% FoomaticRIPOptionSetting: Duplex=DuplexTumble"
+ *Choice "None/Off" "%% FoomaticRIPOptionSetting: Duplex=None"
+ Option "DryTime/Additional Dry Time" PickOne AnySetup 120.0
+ *Choice "Zero/Printer Default" "%% FoomaticRIPOptionSetting: DryTime=Zero"
+ Choice "Five/5 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Five"
+ Choice "Ten/10 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Ten"
+ Choice "Fifteen/15 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Fifteen"
+ Choice "Twenty/20 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Twenty"
+ Choice "TwentyFive/25 Seconds" "%% FoomaticRIPOptionSetting: DryTime=TwentyFive"
+ Choice "Thirty/30 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Thirty"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "300ColorCMYK/300 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYK"
+ Choice "300ColorCMYKFullBleed/300 dpi, Color, Full Bleed, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYKFullBleed"
+ Choice "300DraftColorCMYK/300 dpi, Draft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftColorCMYK"
+ Choice "300DraftGrayscaleK/300 dpi, Draft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftGrayscaleK"
+ Choice "300FastDraftColorCMYK/300 dpi, FastDraft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300FastDraftColorCMYK"
+ Choice "300FastDraftGrayscaleK/300 dpi, FastDraft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300FastDraftGrayscaleK"
+ Choice "300GrayscaleK/300 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300GrayscaleK"
+ Choice "600ColorCMYK/600 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMYK"
+ Choice "600ColorCMYKFullBleed/600 dpi, Color, Full Bleed, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMYKFullBleed"
+ Choice "600GrayscaleK/600 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=600GrayscaleK"
+ Choice "600PhotoCMYK/600 dpi, Photo, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=600PhotoCMYK"
+ Choice "600PhotoCMYKFullBleed/600 dpi, Photo, Full Bleed, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=600PhotoCMYKFullBleed"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 9.72 36.00 9.72 9.00 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo or 5x7 inch index card" 360.00 504.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "PhotoTearOff/Photo with tear-off tab" 288.00 432.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff" "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "A6TearOff/A6 with tear-off tab" 297.00 420.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=A6TearOff" "%% FoomaticRIPOptionSetting: PageSize=A6TearOff"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "CDDVD120/CD or DVD 120 mm" 360.00 360.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD120" "%% FoomaticRIPOptionSetting: PageSize=CDDVD120"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+ // <%ViperPlusTrim:Normal%>
+} // end ViperPlusTrim
+
+/////////////// ViperMinusTrim
+{
+ Attribute "DefaultResolution" "" "600dpi"
+
+ // Custom page sizes from 1x4in to SuperB
+ HWMargins 18 36 18 9
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 936 1368
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-DeskJet_5650 hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-DeskJet_5650" " -sDeviceManufacture&&
+r=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;deskjet 5600&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=300FastDraftCol&&
+orCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft.Gray" "Quality=300FastDra&&
+ftGrayscaleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=300ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal.Gray" "Quality=300Graysc&&
+aleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High" "Quality=600ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High.Gray" "Quality=600Grayscal&&
+eK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Photo" "Quality=600PhotoCMYKFu&&
+llBleed"
+ Attribute "FoomaticRIPOption" "InputSlot" "enum CmdLine C"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Default" ",PS:MediaPosition=7"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=PhotoTray" ",PS:MediaPosition=6"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Upper" ",PS:MediaPosition=1"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Lower" ",PS:MediaPosition=4"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=CDDVDTray" ",PS:MediaPosition=14"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Envelope" ",PS:MediaPosition=3"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=LargeCapacity" ",PS:MediaPosition=&&
+5"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Manual" ",PS:MediaPosition=2"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=MPTray" ",PS:MediaPosition=8"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=PhotoTearOff" " -dDEVICEWIDTHPOINTS&&
+=288 -dDEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6TearOff" " -dDEVICEWIDTHPOINTS=29&&
+7 -dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD120" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ /////////// Large format paper support
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B4JIS" " -dDEVICEWIDTHPOINTS=729 -d&&
+DEVICEHEIGHTPOINTS=1033"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Ledger" " -dDEVICEWIDTHPOINTS=792 -&&
+dDEVICEHEIGHTPOINTS=1224"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=SuperB" " -dDEVICEWIDTHPOINTS=936 -&&
+dDEVICEHEIGHTPOINTS=1368"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w774h1116" " -dDEVICEWIDTHPOINTS=77&&
+4 -dDEVICEHEIGHTPOINTS=1116"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A3" " -dDEVICEWIDTHPOINTS=842 -dDEV&&
+ICEHEIGHTPOINTS=1190"
+ Attribute "FoomaticRIPOption" "Duplex" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexNoTumble" " -dDuplex=true -dTum&&
+ble=false"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexTumble" " -dDuplex=true -dTumbl&&
+e=true"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=None" " -dDuplex=false"
+ Attribute "FoomaticRIPOption" "DryTime" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Zero" ""
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Five" ",DryTime=5"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Ten" ",DryTime=10"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Fifteen" ",DryTime=15"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Twenty" ",DryTime=20"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=TwentyFive" ",DryTime=25"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Thirty" ",DryTime=30"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYK" " -r300 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYKFullBleed" " -r300 -sIjs&&
+Params=Quality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:FullBleed=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftColorCMYK" " -r300 -sIjsPara&&
+ms=Quality:Quality=1,Quality:ColorMode=2,Quality:MediaType=0,Quality:P&&
+enSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftGrayscaleK" " -r300 -sIjs&&
+Params=Quality:Quality=1,Quality:ColorMode=0,Quality:MediaType=0,Quali&&
+ty:PenSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300FastDraftColorCMYK" " -r300 -sIjs&&
+Params=Quality:Quality=4,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:SpeedMech=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300FastDraftGrayscaleK" " -r300 -&&
+sIjsParams=Quality:Quality=4,Quality:ColorMode=0,Quality:MediaType=0,Q&&
+uality:PenSet=2,Quality:SpeedMech=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300GrayscaleK" " -r300 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMYK" " -r600 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMYKFullBleed" " -r600 -sIjs&&
+Params=Quality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:FullBleed=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600GrayscaleK" " -r600 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600PhotoCMYK" " -r600 -sIjsParams=&&
+Quality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenS&&
+et=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600PhotoCMYKFullBleed" " -r600 -sI&&
+jsParams=Quality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Qua&&
+lity:PenSet=2,Quality:FullBleed=1"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ Choice "Draft.Gray/Draft Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft.Gray"
+ *Choice "Normal/Normal (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "Normal.Gray/Normal Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal.Gray"
+ Choice "High/High Quality (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=High"
+ Choice "High.Gray/High Quality Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=High.Gray"
+ Choice "Photo/Photo (on photo paper)" "%% FoomaticRIPOptionSetting: PrintoutMode=Photo"
+ Option "InputSlot/Media Source" PickOne AnySetup 100.0
+ *Choice "Default/Printer default" "%% FoomaticRIPOptionSetting: InputSlot=Default"
+ Choice "PhotoTray/Photo Tray" "%% FoomaticRIPOptionSetting: InputSlot=PhotoTray"
+ Choice "Upper/Upper Tray" "%% FoomaticRIPOptionSetting: InputSlot=Upper"
+ Choice "Lower/Lower Tray" "%% FoomaticRIPOptionSetting: InputSlot=Lower"
+ Choice "CDDVDTray/CD or DVD Tray" "%% FoomaticRIPOptionSetting: InputSlot=CDDVDTray"
+ Choice "Envelope/Envelope Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Envelope"
+ Choice "LargeCapacity/Large Capacity Tray" "%% FoomaticRIPOptionSetting: InputSlot=LargeCapacity"
+ Choice "Manual/Manual Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Manual"
+ Choice "MPTray/Multi Purpose Tray" "%% FoomaticRIPOptionSetting: InputSlot=MPTray"
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 120.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "%% FoomaticRIPOptionSetting: Duplex=DuplexNoTumble"
+ Choice "DuplexTumble/Short Edge (Flip)" "%% FoomaticRIPOptionSetting: Duplex=DuplexTumble"
+ *Choice "None/Off" "%% FoomaticRIPOptionSetting: Duplex=None"
+ Option "DryTime/Additional Dry Time" PickOne AnySetup 120.0
+ *Choice "Zero/Printer Default" "%% FoomaticRIPOptionSetting: DryTime=Zero"
+ Choice "Five/5 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Five"
+ Choice "Ten/10 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Ten"
+ Choice "Fifteen/15 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Fifteen"
+ Choice "Twenty/20 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Twenty"
+ Choice "TwentyFive/25 Seconds" "%% FoomaticRIPOptionSetting: DryTime=TwentyFive"
+ Choice "Thirty/30 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Thirty"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "300ColorCMYK/300 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYK"
+ Choice "300ColorCMYKFullBleed/300 dpi, Color, Full Bleed, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYKFullBleed"
+ Choice "300DraftColorCMYK/300 dpi, Draft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftColorCMYK"
+ Choice "300DraftGrayscaleK/300 dpi, Draft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftGrayscaleK"
+ Choice "300FastDraftColorCMYK/300 dpi, FastDraft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300FastDraftColorCMYK"
+ Choice "300FastDraftGrayscaleK/300 dpi, FastDraft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300FastDraftGrayscaleK"
+ Choice "300GrayscaleK/300 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300GrayscaleK"
+ Choice "600ColorCMYK/600 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMYK"
+ Choice "600ColorCMYKFullBleed/600 dpi, Color, Full Bleed, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMYKFullBleed"
+ Choice "600GrayscaleK/600 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=600GrayscaleK"
+ Choice "600PhotoCMYK/600 dpi, Photo, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=600PhotoCMYK"
+ Choice "600PhotoCMYKFullBleed/600 dpi, Photo, Full Bleed, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=600PhotoCMYKFullBleed"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 9.72 36.00 9.72 9.00 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo or 5x7 inch index card" 360.00 504.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "PhotoTearOff/Photo with tear-off tab" 288.00 432.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff" "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "A6TearOff/A6 with tear-off tab" 297.00 420.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=A6TearOff" "%% FoomaticRIPOptionSetting: PageSize=A6TearOff"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "CDDVD120/CD or DVD 120 mm" 360.00 360.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD120" "%% FoomaticRIPOptionSetting: PageSize=CDDVD120"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+ // <%ViperMinusTrim:Normal%>
+} // end ViperMinusTrim
+
+/////////////// Corbett
+{
+ Attribute "DefaultResolution" "" "600dpi"
+
+ // Custom page sizes from 1x4in to SuperB
+ HWMargins 18 36 18 9
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 936 1368
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-DeskJet_5650 hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-DeskJet_5650" " -sDeviceManufacture&&
+r=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;deskjet 5600&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=300FastDraftCol&&
+orCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft.Gray" "Quality=300FastDra&&
+ftGrayscaleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=300ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal.Gray" "Quality=300Graysc&&
+aleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High" "Quality=600ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High.Gray" "Quality=600Grayscal&&
+eK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Photo" "Quality=600PhotoCMYKFu&&
+llBleed"
+ Attribute "FoomaticRIPOption" "InputSlot" "enum CmdLine C"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Default" ",PS:MediaPosition=7"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=PhotoTray" ",PS:MediaPosition=6"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Upper" ",PS:MediaPosition=1"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Lower" ",PS:MediaPosition=4"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=CDDVDTray" ",PS:MediaPosition=14"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Envelope" ",PS:MediaPosition=3"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=LargeCapacity" ",PS:MediaPosition=&&
+5"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Manual" ",PS:MediaPosition=2"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=MPTray" ",PS:MediaPosition=8"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=PhotoTearOff" " -dDEVICEWIDTHPOINTS&&
+=288 -dDEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6TearOff" " -dDEVICEWIDTHPOINTS=29&&
+7 -dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD120" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ /////////// Large format paper support
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B4JIS" " -dDEVICEWIDTHPOINTS=729 -d&&
+DEVICEHEIGHTPOINTS=1033"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Ledger" " -dDEVICEWIDTHPOINTS=792 -&&
+dDEVICEHEIGHTPOINTS=1224"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=SuperB" " -dDEVICEWIDTHPOINTS=936 -&&
+dDEVICEHEIGHTPOINTS=1368"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w774h1116" " -dDEVICEWIDTHPOINTS=77&&
+4 -dDEVICEHEIGHTPOINTS=1116"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A3" " -dDEVICEWIDTHPOINTS=842 -dDEV&&
+ICEHEIGHTPOINTS=1190"
+ Attribute "FoomaticRIPOption" "Duplex" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexNoTumble" " -dDuplex=true -dTum&&
+ble=false"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexTumble" " -dDuplex=true -dTumbl&&
+e=true"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=None" " -dDuplex=false"
+ Attribute "FoomaticRIPOption" "DryTime" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Zero" ""
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Five" ",DryTime=5"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Ten" ",DryTime=10"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Fifteen" ",DryTime=15"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Twenty" ",DryTime=20"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=TwentyFive" ",DryTime=25"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Thirty" ",DryTime=30"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYK" " -r300 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYKFullBleed" " -r300 -sIjs&&
+Params=Quality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:FullBleed=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftColorCMYK" " -r300 -sIjsPara&&
+ms=Quality:Quality=1,Quality:ColorMode=2,Quality:MediaType=0,Quality:P&&
+enSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftGrayscaleK" " -r300 -sIjs&&
+Params=Quality:Quality=1,Quality:ColorMode=0,Quality:MediaType=0,Quali&&
+ty:PenSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300FastDraftColorCMYK" " -r300 -sIjs&&
+Params=Quality:Quality=4,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:SpeedMech=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300FastDraftGrayscaleK" " -r300 -&&
+sIjsParams=Quality:Quality=4,Quality:ColorMode=0,Quality:MediaType=0,Q&&
+uality:PenSet=2,Quality:SpeedMech=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300GrayscaleK" " -r300 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMYK" " -r600 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMYKFullBleed" " -r600 -sIjs&&
+Params=Quality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:FullBleed=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600GrayscaleK" " -r600 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600PhotoCMYK" " -r600 -sIjsParams=&&
+Quality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenS&&
+et=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600PhotoCMYKFullBleed" " -r600 -sI&&
+jsParams=Quality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Qua&&
+lity:PenSet=2,Quality:FullBleed=1"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ Choice "Draft.Gray/Draft Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft.Gray"
+ *Choice "Normal/Normal (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "Normal.Gray/Normal Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal.Gray"
+ Choice "High/High Quality (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=High"
+ Choice "High.Gray/High Quality Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=High.Gray"
+ Choice "Photo/Photo (on photo paper)" "%% FoomaticRIPOptionSetting: PrintoutMode=Photo"
+ Option "InputSlot/Media Source" PickOne AnySetup 100.0
+ *Choice "Default/Printer default" "%% FoomaticRIPOptionSetting: InputSlot=Default"
+ Choice "PhotoTray/Photo Tray" "%% FoomaticRIPOptionSetting: InputSlot=PhotoTray"
+ Choice "Upper/Upper Tray" "%% FoomaticRIPOptionSetting: InputSlot=Upper"
+ Choice "Lower/Lower Tray" "%% FoomaticRIPOptionSetting: InputSlot=Lower"
+ Choice "CDDVDTray/CD or DVD Tray" "%% FoomaticRIPOptionSetting: InputSlot=CDDVDTray"
+ Choice "Envelope/Envelope Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Envelope"
+ Choice "LargeCapacity/Large Capacity Tray" "%% FoomaticRIPOptionSetting: InputSlot=LargeCapacity"
+ Choice "Manual/Manual Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Manual"
+ Choice "MPTray/Multi Purpose Tray" "%% FoomaticRIPOptionSetting: InputSlot=MPTray"
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 120.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "%% FoomaticRIPOptionSetting: Duplex=DuplexNoTumble"
+ Choice "DuplexTumble/Short Edge (Flip)" "%% FoomaticRIPOptionSetting: Duplex=DuplexTumble"
+ *Choice "None/Off" "%% FoomaticRIPOptionSetting: Duplex=None"
+ Option "DryTime/Additional Dry Time" PickOne AnySetup 120.0
+ *Choice "Zero/Printer Default" "%% FoomaticRIPOptionSetting: DryTime=Zero"
+ Choice "Five/5 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Five"
+ Choice "Ten/10 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Ten"
+ Choice "Fifteen/15 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Fifteen"
+ Choice "Twenty/20 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Twenty"
+ Choice "TwentyFive/25 Seconds" "%% FoomaticRIPOptionSetting: DryTime=TwentyFive"
+ Choice "Thirty/30 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Thirty"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "300ColorCMYK/300 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYK"
+ Choice "300ColorCMYKFullBleed/300 dpi, Color, Full Bleed, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYKFullBleed"
+ Choice "300DraftColorCMYK/300 dpi, Draft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftColorCMYK"
+ Choice "300DraftGrayscaleK/300 dpi, Draft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftGrayscaleK"
+ Choice "300FastDraftColorCMYK/300 dpi, FastDraft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300FastDraftColorCMYK"
+ Choice "300FastDraftGrayscaleK/300 dpi, FastDraft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300FastDraftGrayscaleK"
+ Choice "300GrayscaleK/300 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300GrayscaleK"
+ Choice "600ColorCMYK/600 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMYK"
+ Choice "600ColorCMYKFullBleed/600 dpi, Color, Full Bleed, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMYKFullBleed"
+ Choice "600GrayscaleK/600 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=600GrayscaleK"
+ Choice "600PhotoCMYK/600 dpi, Photo, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=600PhotoCMYK"
+ Choice "600PhotoCMYKFullBleed/600 dpi, Photo, Full Bleed, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=600PhotoCMYKFullBleed"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 9.72 36.00 9.72 9.00 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo or 5x7 inch index card" 360.00 504.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "PhotoTearOff/Photo with tear-off tab" 288.00 432.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff" "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "A6TearOff/A6 with tear-off tab" 297.00 420.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=A6TearOff" "%% FoomaticRIPOptionSetting: PageSize=A6TearOff"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "CDDVD120/CD or DVD 120 mm" 360.00 360.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD120" "%% FoomaticRIPOptionSetting: PageSize=CDDVD120"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+ // <%Corbett:Normal%>
+} // end Corbett
+
+////////// Ampere
+{
+ Attribute "DefaultResolution" "" "1200dpi"
+
+ // Custom page sizes from 1x4in to Legal
+ HWMargins 18 36 18 9
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 8.5in 14in
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-DeskJet_5550 hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-DeskJet_5550" " -sDeviceManufacture&&
+r=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;deskjet 5550&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=300FastDraftCol&&
+orCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft.Gray" "Quality=300FastDra&&
+ftGrayscaleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=300ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal.Gray" "Quality=300Graysc&&
+aleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High" "Quality=600ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High.Gray" "Quality=600Grayscal&&
+eK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Photo" "Quality=1200PhotoCMYKFu&&
+llBleed"
+ Attribute "FoomaticRIPOption" "InputSlot" "enum CmdLine C"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Default" ",PS:MediaPosition=7"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=PhotoTray" ",PS:MediaPosition=6"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Upper" ",PS:MediaPosition=1"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Lower" ",PS:MediaPosition=4"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=CDDVDTray" ",PS:MediaPosition=14"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Envelope" ",PS:MediaPosition=3"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=LargeCapacity" ",PS:MediaPosition=&&
+5"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Manual" ",PS:MediaPosition=2"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=MPTray" ",PS:MediaPosition=8"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=PhotoTearOff" " -dDEVICEWIDTHPOINTS&&
+=288 -dDEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6TearOff" " -dDEVICEWIDTHPOINTS=29&&
+7 -dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD120" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ Attribute "FoomaticRIPOption" "Duplex" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexNoTumble" " -dDuplex=true -dTum&&
+ble=false"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexTumble" " -dDuplex=true -dTumbl&&
+e=true"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=None" " -dDuplex=false"
+ Attribute "FoomaticRIPOption" "DryTime" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Zero" ""
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Five" ",DryTime=5"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Ten" ",DryTime=10"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Fifteen" ",DryTime=15"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Twenty" ",DryTime=20"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=TwentyFive" ",DryTime=25"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Thirty" ",DryTime=30"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYK" " -r300 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYKFullBleed" " -r300 -sIjs&&
+Params=Quality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:FullBleed=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftColorCMYK" " -r300 -sIjsPara&&
+ms=Quality:Quality=1,Quality:ColorMode=2,Quality:MediaType=0,Quality:P&&
+enSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftGrayscaleK" " -r300 -sIjs&&
+Params=Quality:Quality=1,Quality:ColorMode=0,Quality:MediaType=0,Quali&&
+ty:PenSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300FastDraftColorCMYK" " -r300 -sIjs&&
+Params=Quality:Quality=4,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:SpeedMech=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300FastDraftGrayscaleK" " -r300 -&&
+sIjsParams=Quality:Quality=4,Quality:ColorMode=0,Quality:MediaType=0,Q&&
+uality:PenSet=2,Quality:SpeedMech=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300GrayscaleK" " -r300 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMYK" " -r600 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMYKFullBleed" " -r600 -sIjs&&
+Params=Quality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:FullBleed=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600GrayscaleK" " -r600 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=1200PhotoCMYK" " -r1200 -sIjsParams=&&
+Quality:Quality=3,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenS&&
+et=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=1200PhotoCMYKFullBleed" " -r1200 -sI&&
+jsParams=Quality:Quality=3,Quality:ColorMode=2,Quality:MediaType=2,Qua&&
+lity:PenSet=2,Quality:FullBleed=1"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ Choice "Draft.Gray/Draft Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft.Gray"
+ *Choice "Normal/Normal (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "Normal.Gray/Normal Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal.Gray"
+ Choice "High/High Quality (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=High"
+ Choice "High.Gray/High Quality Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=High.Gray"
+ Choice "Photo/Photo (on photo paper)" "%% FoomaticRIPOptionSetting: PrintoutMode=Photo"
+ Option "InputSlot/Media Source" PickOne AnySetup 100.0
+ *Choice "Default/Printer default" "%% FoomaticRIPOptionSetting: InputSlot=Default"
+ Choice "PhotoTray/Photo Tray" "%% FoomaticRIPOptionSetting: InputSlot=PhotoTray"
+ Choice "Upper/Upper Tray" "%% FoomaticRIPOptionSetting: InputSlot=Upper"
+ Choice "Lower/Lower Tray" "%% FoomaticRIPOptionSetting: InputSlot=Lower"
+ Choice "CDDVDTray/CD or DVD Tray" "%% FoomaticRIPOptionSetting: InputSlot=CDDVDTray"
+ Choice "Envelope/Envelope Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Envelope"
+ Choice "LargeCapacity/Large Capacity Tray" "%% FoomaticRIPOptionSetting: InputSlot=LargeCapacity"
+ Choice "Manual/Manual Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Manual"
+ Choice "MPTray/Multi Purpose Tray" "%% FoomaticRIPOptionSetting: InputSlot=MPTray"
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 120.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "%% FoomaticRIPOptionSetting: Duplex=DuplexNoTumble"
+ Choice "DuplexTumble/Short Edge (Flip)" "%% FoomaticRIPOptionSetting: Duplex=DuplexTumble"
+ *Choice "None/Off" "%% FoomaticRIPOptionSetting: Duplex=None"
+ Option "DryTime/Additional Dry Time" PickOne AnySetup 120.0
+ *Choice "Zero/Printer Default" "%% FoomaticRIPOptionSetting: DryTime=Zero"
+ Choice "Five/5 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Five"
+ Choice "Ten/10 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Ten"
+ Choice "Fifteen/15 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Fifteen"
+ Choice "Twenty/20 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Twenty"
+ Choice "TwentyFive/25 Seconds" "%% FoomaticRIPOptionSetting: DryTime=TwentyFive"
+ Choice "Thirty/30 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Thirty"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "300ColorCMYK/300 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYK"
+ Choice "300ColorCMYKFullBleed/300 dpi, Color, Full Bleed, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYKFullBleed"
+ Choice "300DraftColorCMYK/300 dpi, Draft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftColorCMYK"
+ Choice "300DraftGrayscaleK/300 dpi, Draft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftGrayscaleK"
+ Choice "300FastDraftColorCMYK/300 dpi, FastDraft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300FastDraftColorCMYK"
+ Choice "300FastDraftGrayscaleK/300 dpi, FastDraft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300FastDraftGrayscaleK"
+ Choice "300GrayscaleK/300 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300GrayscaleK"
+ Choice "600ColorCMYK/600 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMYK"
+ Choice "600ColorCMYKFullBleed/600 dpi, Color, Full Bleed, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMYKFullBleed"
+ Choice "600GrayscaleK/600 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=600GrayscaleK"
+ Choice "1200PhotoCMYK/1200 dpi, Photo, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=1200PhotoCMYK"
+ Choice "1200PhotoCMYKFullBleed/1200 dpi, Photo, Full Bleed, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=1200PhotoCMYKFullBleed"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 9.72 36.00 9.72 9.00 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo or 5x7 inch index card" 360.00 504.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "PhotoTearOff/Photo with tear-off tab" 288.00 432.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff" "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "A6TearOff/A6 with tear-off tab" 297.00 420.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=A6TearOff" "%% FoomaticRIPOptionSetting: PageSize=A6TearOff"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "CDDVD120/CD or DVD 120 mm" 360.00 360.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD120" "%% FoomaticRIPOptionSetting: PageSize=CDDVD120"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+ // <%Ampere:Normal%>
+} // end Ampere
+
+
+//////// Python and OJ7000
+{
+ Attribute "DefaultResolution" "" "600dpi"
+
+ // Custom page sizes from 1x4in to SuperB
+ HWMargins 18 36 18 9
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 936 1368
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-DeskJet_5650 hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-DeskJet_5650" " -sDeviceManufacture&&
+r=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;deskjet 5600&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=300FastDraftCol&&
+orCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft.Gray" "Quality=300FastDra&&
+ftGrayscaleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=300ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal.Gray" "Quality=300Graysc&&
+aleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High" "Quality=600ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High.Gray" "Quality=600Grayscal&&
+eK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Photo" "Quality=600PhotoCMYKFu&&
+llBleed"
+ Attribute "FoomaticRIPOption" "InputSlot" "enum CmdLine C"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Default" ",PS:MediaPosition=7"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=PhotoTray" ",PS:MediaPosition=6"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Upper" ",PS:MediaPosition=1"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Lower" ",PS:MediaPosition=4"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=CDDVDTray" ",PS:MediaPosition=14"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Envelope" ",PS:MediaPosition=3"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=LargeCapacity" ",PS:MediaPosition=&&
+5"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Manual" ",PS:MediaPosition=2"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=MPTray" ",PS:MediaPosition=8"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=PhotoTearOff" " -dDEVICEWIDTHPOINTS&&
+=288 -dDEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6TearOff" " -dDEVICEWIDTHPOINTS=29&&
+7 -dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD120" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ /////////// Large format paper support
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B4JIS" " -dDEVICEWIDTHPOINTS=729 -d&&
+DEVICEHEIGHTPOINTS=1033"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Ledger" " -dDEVICEWIDTHPOINTS=792 -&&
+dDEVICEHEIGHTPOINTS=1224"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=SuperB" " -dDEVICEWIDTHPOINTS=936 -&&
+dDEVICEHEIGHTPOINTS=1368"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w774h1116" " -dDEVICEWIDTHPOINTS=77&&
+4 -dDEVICEHEIGHTPOINTS=1116"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A3" " -dDEVICEWIDTHPOINTS=842 -dDEV&&
+ICEHEIGHTPOINTS=1190"
+ Attribute "FoomaticRIPOption" "Duplex" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexNoTumble" " -dDuplex=true -dTum&&
+ble=false"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=DuplexTumble" " -dDuplex=true -dTumbl&&
+e=true"
+ Attribute "FoomaticRIPOptionSetting" "Duplex=None" " -dDuplex=false"
+ Attribute "FoomaticRIPOption" "DryTime" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Zero" ""
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Five" ",DryTime=5"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Ten" ",DryTime=10"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Fifteen" ",DryTime=15"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Twenty" ",DryTime=20"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=TwentyFive" ",DryTime=25"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Thirty" ",DryTime=30"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYK" " -r300 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYKFullBleed" " -r300 -sIjs&&
+Params=Quality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:FullBleed=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftColorCMYK" " -r300 -sIjsPara&&
+ms=Quality:Quality=1,Quality:ColorMode=2,Quality:MediaType=0,Quality:P&&
+enSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftGrayscaleK" " -r300 -sIjs&&
+Params=Quality:Quality=1,Quality:ColorMode=0,Quality:MediaType=0,Quali&&
+ty:PenSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300FastDraftColorCMYK" " -r300 -sIjs&&
+Params=Quality:Quality=4,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:SpeedMech=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300FastDraftGrayscaleK" " -r300 -&&
+sIjsParams=Quality:Quality=4,Quality:ColorMode=0,Quality:MediaType=0,Q&&
+uality:PenSet=2,Quality:SpeedMech=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300GrayscaleK" " -r300 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMYK" " -r600 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMYKFullBleed" " -r600 -sIjs&&
+Params=Quality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:FullBleed=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600GrayscaleK" " -r600 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600PhotoCMYK" " -r600 -sIjsParams=&&
+Quality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenS&&
+et=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600PhotoCMYKFullBleed" " -r600 -sI&&
+jsParams=Quality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Qua&&
+lity:PenSet=2,Quality:FullBleed=1"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ Choice "Draft.Gray/Draft Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft.Gray"
+ *Choice "Normal/Normal (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "Normal.Gray/Normal Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal.Gray"
+ Choice "High/High Quality (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=High"
+ Choice "High.Gray/High Quality Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=High.Gray"
+ Choice "Photo/Photo (on photo paper)" "%% FoomaticRIPOptionSetting: PrintoutMode=Photo"
+ Option "InputSlot/Media Source" PickOne AnySetup 100.0
+ *Choice "Default/Printer default" "%% FoomaticRIPOptionSetting: InputSlot=Default"
+ Choice "PhotoTray/Photo Tray" "%% FoomaticRIPOptionSetting: InputSlot=PhotoTray"
+ Choice "Upper/Upper Tray" "%% FoomaticRIPOptionSetting: InputSlot=Upper"
+ Choice "Lower/Lower Tray" "%% FoomaticRIPOptionSetting: InputSlot=Lower"
+ Choice "CDDVDTray/CD or DVD Tray" "%% FoomaticRIPOptionSetting: InputSlot=CDDVDTray"
+ Choice "Envelope/Envelope Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Envelope"
+ Choice "LargeCapacity/Large Capacity Tray" "%% FoomaticRIPOptionSetting: InputSlot=LargeCapacity"
+ Choice "Manual/Manual Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Manual"
+ Choice "MPTray/Multi Purpose Tray" "%% FoomaticRIPOptionSetting: InputSlot=MPTray"
+ Option "Duplex/Double-Sided Printing" PickOne AnySetup 120.0
+ Choice "DuplexNoTumble/Long Edge (Standard)" "%% FoomaticRIPOptionSetting: Duplex=DuplexNoTumble"
+ Choice "DuplexTumble/Short Edge (Flip)" "%% FoomaticRIPOptionSetting: Duplex=DuplexTumble"
+ *Choice "None/Off" "%% FoomaticRIPOptionSetting: Duplex=None"
+ Option "DryTime/Additional Dry Time" PickOne AnySetup 120.0
+ *Choice "Zero/Printer Default" "%% FoomaticRIPOptionSetting: DryTime=Zero"
+ Choice "Five/5 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Five"
+ Choice "Ten/10 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Ten"
+ Choice "Fifteen/15 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Fifteen"
+ Choice "Twenty/20 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Twenty"
+ Choice "TwentyFive/25 Seconds" "%% FoomaticRIPOptionSetting: DryTime=TwentyFive"
+ Choice "Thirty/30 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Thirty"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "300ColorCMYK/300 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYK"
+ Choice "300ColorCMYKFullBleed/300 dpi, Color, Full Bleed, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYKFullBleed"
+ Choice "300DraftColorCMYK/300 dpi, Draft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftColorCMYK"
+ Choice "300DraftGrayscaleK/300 dpi, Draft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftGrayscaleK"
+ Choice "300FastDraftColorCMYK/300 dpi, FastDraft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300FastDraftColorCMYK"
+ Choice "300FastDraftGrayscaleK/300 dpi, FastDraft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300FastDraftGrayscaleK"
+ Choice "300GrayscaleK/300 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300GrayscaleK"
+ Choice "600ColorCMYK/600 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMYK"
+ Choice "600ColorCMYKFullBleed/600 dpi, Color, Full Bleed, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMYKFullBleed"
+ Choice "600GrayscaleK/600 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=600GrayscaleK"
+ Choice "600PhotoCMYK/600 dpi, Photo, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=600PhotoCMYK"
+ Choice "600PhotoCMYKFullBleed/600 dpi, Photo, Full Bleed, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=600PhotoCMYKFullBleed"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 9.72 36.00 9.72 9.00 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo or 5x7 inch index card" 360.00 504.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "PhotoTearOff/Photo with tear-off tab" 288.00 432.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff" "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "A6TearOff/A6 with tear-off tab" 297.00 420.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=A6TearOff" "%% FoomaticRIPOptionSetting: PageSize=A6TearOff"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "CDDVD120/CD or DVD 120 mm" 360.00 360.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD120" "%% FoomaticRIPOptionSetting: PageSize=CDDVD120"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+ // <%Python:NoMaxDPI%>
+ // <%Python:NoCDDVD%>
+ // <%Python:NoCDDVD:NoMaxDPI%>
+ // <%Python:NoAutoDuplex:NoCDDVD%>
+ // <%Python:NoAutoDuplex:NoCDDVD:NoMaxDPI%>
+ // <%Python10:NoCDDVD:NoMaxDPI%>
+ // <%Python10:NoAutoTray%>
+ {
+ // Large format SuperB paper support
+ CustomMedia "B4JIS/B4 (JIS)" 729.00 1033.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B4JIS" "%% FoomaticRIPOptionSetting: PageSize=B4JIS"
+ CustomMedia "Ledger/Ledger" 792.00 1224.00 14.40 36.00 14.40 9.00 "%% FoomaticRIPOptionSetting: PageSize=Ledger" "%% FoomaticRIPOptionSetting: PageSize=Ledger"
+ CustomMedia "SuperB/Super B" 936.00 1368.00 14.40 36.00 14.40 9.00 "%% FoomaticRIPOptionSetting: PageSize=SuperB" "%% FoomaticRIPOptionSetting: PageSize=SuperB"
+ CustomMedia "w774h1116/8K" 774.00 1116.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w774h1116" "%% FoomaticRIPOptionSetting: PageSize=w774h1116"
+ CustomMedia "A3/A3" 842.00 1190.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A3" "%% FoomaticRIPOptionSetting: PageSize=A3"
+ // <%Python:LargeFormatA3:NoAutoDuplex%>
+ // <%Python:LargeFormatA3:NoAutoDuplex:Advanced%>
+ // <%OJ7000:LargeFormatA3%>
+ // <%OJ7000:LargeFormatA3:SmallMargins%>
+ }
+} // End Python and OJ7000
+
+//////// Pyramid
+{
+ Attribute "DefaultResolution" "" "600dpi"
+
+ // Custom page sizes from 1x4in to SuperB
+ HWMargins 18 36 18 9
+ VariablePaperSize Yes
+ MinSize 1in 4in
+ MaxSize 936 1368
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Custom" " -dDEVICEWIDTHPOINTS=0 -dD&&
+EVICEHEIGHTPOINTS=0"
+
+ Attribute "FoomaticIDs" "" "HP-DeskJet_5650 hpijs"
+ Attribute "FoomaticRIPCommandLine" "" "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
+USE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFi&&
+le=- -"
+ Attribute "FoomaticRIPOption" "Model" "enum CmdLine A 100"
+ Attribute "FoomaticRIPOptionSetting" "Model=HP-DeskJet_5650" " -sDeviceManufacture&&
+r=&quot;HEWLETT-PACKARD&quot; -sDeviceModel=&quot;deskjet 5600&quot;"
+ Attribute "FoomaticRIPOption" "PrintoutMode" "enum Composite B"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft" "Quality=300FastDraftCol&&
+orCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Draft.Gray" "Quality=300FastDra&&
+ftGrayscaleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal" "Quality=300ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Normal.Gray" "Quality=300Graysc&&
+aleK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High" "Quality=600ColorCMYK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=High.Gray" "Quality=600Grayscal&&
+eK"
+ Attribute "FoomaticRIPOptionSetting" "PrintoutMode=Photo" "Quality=600PhotoCMYKFu&&
+llBleed"
+ Attribute "FoomaticRIPOption" "InputSlot" "enum CmdLine C"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Default" ",PS:MediaPosition=7"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=PhotoTray" ",PS:MediaPosition=6"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Upper" ",PS:MediaPosition=1"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Lower" ",PS:MediaPosition=4"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=CDDVDTray" ",PS:MediaPosition=14"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Envelope" ",PS:MediaPosition=3"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=LargeCapacity" ",PS:MediaPosition=&&
+5"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=Manual" ",PS:MediaPosition=2"
+ Attribute "FoomaticRIPOptionSetting" "InputSlot=MPTray" ",PS:MediaPosition=8"
+ Attribute "FoomaticRIPOption" "PageSize" "enum CmdLine A"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Letter" " -dDEVICEWIDTHPOINTS=612 -&&
+dDEVICEHEIGHTPOINTS=792"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A4" " -dDEVICEWIDTHPOINTS=595 -dDEV&&
+ICEHEIGHTPOINTS=842"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo" " -dDEVICEWIDTHPOINTS=288 -d&&
+DEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Photo5x7" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=504"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=PhotoTearOff" " -dDEVICEWIDTHPOINTS&&
+=288 -dDEVICEHEIGHTPOINTS=432"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=3x5" " -dDEVICEWIDTHPOINTS=216 -dDE&&
+VICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=5x8" " -dDEVICEWIDTHPOINTS=360 -dDE&&
+VICEHEIGHTPOINTS=576"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A5" " -dDEVICEWIDTHPOINTS=420 -dDEV&&
+ICEHEIGHTPOINTS=595"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6" " -dDEVICEWIDTHPOINTS=297 -dDEV&&
+ICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A6TearOff" " -dDEVICEWIDTHPOINTS=29&&
+7 -dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B5JIS" " -dDEVICEWIDTHPOINTS=516 -d&&
+DEVICEHEIGHTPOINTS=729"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD80" " -dDEVICEWIDTHPOINTS=237 &&
+-dDEVICEHEIGHTPOINTS=237"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=CDDVD120" " -dDEVICEWIDTHPOINTS=360&&
+ -dDEVICEHEIGHTPOINTS=360"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Env10" " -dDEVICEWIDTHPOINTS=297 -d&&
+DEVICEHEIGHTPOINTS=684"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC5" " -dDEVICEWIDTHPOINTS=459 -d&&
+DEVICEHEIGHTPOINTS=649"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvC6" " -dDEVICEWIDTHPOINTS=323 -d&&
+DEVICEHEIGHTPOINTS=459"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvDL" " -dDEVICEWIDTHPOINTS=312 -d&&
+DEVICEHEIGHTPOINTS=624"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvISOB5" " -dDEVICEWIDTHPOINTS=499&&
+ -dDEVICEHEIGHTPOINTS=709"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=EnvMonarch" " -dDEVICEWIDTHPOINTS=2&&
+79 -dDEVICEHEIGHTPOINTS=540"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Executive" " -dDEVICEWIDTHPOINTS=52&&
+2 -dDEVICEHEIGHTPOINTS=756"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=FLSA" " -dDEVICEWIDTHPOINTS=612 -dD&&
+EVICEHEIGHTPOINTS=936"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Hagaki" " -dDEVICEWIDTHPOINTS=283 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Legal" " -dDEVICEWIDTHPOINTS=612 -d&&
+DEVICEHEIGHTPOINTS=1008"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Oufuku" " -dDEVICEWIDTHPOINTS=567 -&&
+dDEVICEHEIGHTPOINTS=420"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w558h774" " -dDEVICEWIDTHPOINTS=558&&
+ -dDEVICEHEIGHTPOINTS=774"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w612h935" " -dDEVICEWIDTHPOINTS=612&&
+ -dDEVICEHEIGHTPOINTS=935"
+ /////////// Large format paper support
+ Attribute "FoomaticRIPOptionSetting" "PageSize=B4JIS" " -dDEVICEWIDTHPOINTS=729 -d&&
+DEVICEHEIGHTPOINTS=1033"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=Ledger" " -dDEVICEWIDTHPOINTS=792 -&&
+dDEVICEHEIGHTPOINTS=1224"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=SuperB" " -dDEVICEWIDTHPOINTS=936 -&&
+dDEVICEHEIGHTPOINTS=1368"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=w774h1116" " -dDEVICEWIDTHPOINTS=77&&
+4 -dDEVICEHEIGHTPOINTS=1116"
+ Attribute "FoomaticRIPOptionSetting" "PageSize=A3" " -dDEVICEWIDTHPOINTS=842 -dDEV&&
+ICEHEIGHTPOINTS=1190"
+ Attribute "FoomaticRIPOption" "DryTime" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Zero" ""
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Five" ",DryTime=5"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Ten" ",DryTime=10"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Fifteen" ",DryTime=15"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Twenty" ",DryTime=20"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=TwentyFive" ",DryTime=25"
+ Attribute "FoomaticRIPOptionSetting" "DryTime=Thirty" ",DryTime=30"
+ Attribute "FoomaticRIPOption" "Quality" "enum CmdLine B"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYK" " -r300 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300ColorCMYKFullBleed" " -r300 -sIjs&&
+Params=Quality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:FullBleed=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftColorCMYK" " -r300 -sIjsPara&&
+ms=Quality:Quality=1,Quality:ColorMode=2,Quality:MediaType=0,Quality:P&&
+enSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300DraftGrayscaleK" " -r300 -sIjs&&
+Params=Quality:Quality=1,Quality:ColorMode=0,Quality:MediaType=0,Quali&&
+ty:PenSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300FastDraftColorCMYK" " -r300 -sIjs&&
+Params=Quality:Quality=4,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:SpeedMech=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300FastDraftGrayscaleK" " -r300 -&&
+sIjsParams=Quality:Quality=4,Quality:ColorMode=0,Quality:MediaType=0,Q&&
+uality:PenSet=2,Quality:SpeedMech=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=300GrayscaleK" " -r300 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMYK" " -r600 -sIjsParams=Qu&&
+ality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quality:PenSet&&
+=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600ColorCMYKFullBleed" " -r600 -sIjs&&
+Params=Quality:Quality=0,Quality:ColorMode=2,Quality:MediaType=0,Quali&&
+ty:PenSet=2,Quality:FullBleed=1"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600GrayscaleK" " -r600 -sIjsParam&&
+s=Quality:Quality=0,Quality:ColorMode=0,Quality:MediaType=0,Quality:Pe&&
+nSet=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600PhotoCMYK" " -r600 -sIjsParams=&&
+Quality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Quality:PenS&&
+et=2"
+ Attribute "FoomaticRIPOptionSetting" "Quality=600PhotoCMYKFullBleed" " -r600 -sI&&
+jsParams=Quality:Quality=2,Quality:ColorMode=2,Quality:MediaType=2,Qua&&
+lity:PenSet=2,Quality:FullBleed=1"
+ Group "General/General"
+ Option "PrintoutMode/Printout Mode" PickOne AnySetup 10.0
+ Choice "Draft/Draft (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft"
+ Choice "Draft.Gray/Draft Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Draft.Gray"
+ *Choice "Normal/Normal (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal"
+ Choice "Normal.Gray/Normal Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=Normal.Gray"
+ Choice "High/High Quality (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=High"
+ Choice "High.Gray/High Quality Grayscale (auto-detect paper type)" "%% FoomaticRIPOptionSetting: PrintoutMode=High.Gray"
+ Choice "Photo/Photo (on photo paper)" "%% FoomaticRIPOptionSetting: PrintoutMode=Photo"
+ Option "InputSlot/Media Source" PickOne AnySetup 100.0
+ *Choice "Default/Printer default" "%% FoomaticRIPOptionSetting: InputSlot=Default"
+ Choice "PhotoTray/Photo Tray" "%% FoomaticRIPOptionSetting: InputSlot=PhotoTray"
+ Choice "Upper/Upper Tray" "%% FoomaticRIPOptionSetting: InputSlot=Upper"
+ Choice "Lower/Lower Tray" "%% FoomaticRIPOptionSetting: InputSlot=Lower"
+ Choice "CDDVDTray/CD or DVD Tray" "%% FoomaticRIPOptionSetting: InputSlot=CDDVDTray"
+ Choice "Envelope/Envelope Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Envelope"
+ Choice "LargeCapacity/Large Capacity Tray" "%% FoomaticRIPOptionSetting: InputSlot=LargeCapacity"
+ Choice "Manual/Manual Feeder" "%% FoomaticRIPOptionSetting: InputSlot=Manual"
+ Choice "MPTray/Multi Purpose Tray" "%% FoomaticRIPOptionSetting: InputSlot=MPTray"
+ Option "DryTime/Additional Dry Time" PickOne AnySetup 120.0
+ *Choice "Zero/Printer Default" "%% FoomaticRIPOptionSetting: DryTime=Zero"
+ Choice "Five/5 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Five"
+ Choice "Ten/10 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Ten"
+ Choice "Fifteen/15 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Fifteen"
+ Choice "Twenty/20 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Twenty"
+ Choice "TwentyFive/25 Seconds" "%% FoomaticRIPOptionSetting: DryTime=TwentyFive"
+ Choice "Thirty/30 Seconds" "%% FoomaticRIPOptionSetting: DryTime=Thirty"
+ Group "PrintoutMode/Printout Mode"
+ Option "Quality/Resolution, Quality, Ink Type, Media Type" PickOne AnySetup 100.0
+ *Choice "FromPrintoutMode/Controlled by 'Printout Mode'" "%% FoomaticRIPOptionSetting: Quality=@PrintoutMode"
+ Choice "300ColorCMYK/300 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYK"
+ Choice "300ColorCMYKFullBleed/300 dpi, Color, Full Bleed, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300ColorCMYKFullBleed"
+ Choice "300DraftColorCMYK/300 dpi, Draft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftColorCMYK"
+ Choice "300DraftGrayscaleK/300 dpi, Draft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300DraftGrayscaleK"
+ Choice "300FastDraftColorCMYK/300 dpi, FastDraft, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=300FastDraftColorCMYK"
+ Choice "300FastDraftGrayscaleK/300 dpi, FastDraft, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300FastDraftGrayscaleK"
+ Choice "300GrayscaleK/300 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=300GrayscaleK"
+ Choice "600ColorCMYK/600 dpi, Color, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMYK"
+ Choice "600ColorCMYKFullBleed/600 dpi, Color, Full Bleed, Black + Color Cartr." "%% FoomaticRIPOptionSetting: Quality=600ColorCMYKFullBleed"
+ Choice "600GrayscaleK/600 dpi, Grayscale, Black Cartr." "%% FoomaticRIPOptionSetting: Quality=600GrayscaleK"
+ Choice "600PhotoCMYK/600 dpi, Photo, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=600PhotoCMYK"
+ Choice "600PhotoCMYKFullBleed/600 dpi, Photo, Full Bleed, Black + Color Cartr., Photo Paper" "%% FoomaticRIPOptionSetting: Quality=600PhotoCMYKFullBleed"
+ *CustomMedia "Letter/Letter" 612.00 792.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Letter" "%% FoomaticRIPOptionSetting: PageSize=Letter"
+ CustomMedia "A4/A4" 595.00 842.00 9.72 36.00 9.72 9.00 "%% FoomaticRIPOptionSetting: PageSize=A4" "%% FoomaticRIPOptionSetting: PageSize=A4"
+ CustomMedia "Photo/Photo or 4x6 inch index card" 288.00 432.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Photo" "%% FoomaticRIPOptionSetting: PageSize=Photo"
+ CustomMedia "Photo5x7/Photo or 5x7 inch index card" 360.00 504.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Photo5x7" "%% FoomaticRIPOptionSetting: PageSize=Photo5x7"
+ CustomMedia "PhotoTearOff/Photo with tear-off tab" 288.00 432.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff" "%% FoomaticRIPOptionSetting: PageSize=PhotoTearOff"
+ CustomMedia "3x5/3x5 inch index card" 216.00 360.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=3x5" "%% FoomaticRIPOptionSetting: PageSize=3x5"
+ CustomMedia "5x8/5x8 inch index card" 360.00 576.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=5x8" "%% FoomaticRIPOptionSetting: PageSize=5x8"
+ CustomMedia "A5/A5" 420.00 595.00 9.00 36.00 9.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=A5" "%% FoomaticRIPOptionSetting: PageSize=A5"
+ CustomMedia "A6/A6" 297.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=A6" "%% FoomaticRIPOptionSetting: PageSize=A6"
+ CustomMedia "A6TearOff/A6 with tear-off tab" 297.00 420.00 0.00 0.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=A6TearOff" "%% FoomaticRIPOptionSetting: PageSize=A6TearOff"
+ CustomMedia "B5JIS/B5 (JIS)" 516.00 729.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=B5JIS" "%% FoomaticRIPOptionSetting: PageSize=B5JIS"
+ CustomMedia "CDDVD80/CD or DVD 80 mm" 237.00 237.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD80" "%% FoomaticRIPOptionSetting: PageSize=CDDVD80"
+ CustomMedia "CDDVD120/CD or DVD 120 mm" 360.00 360.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=CDDVD120" "%% FoomaticRIPOptionSetting: PageSize=CDDVD120"
+ CustomMedia "Env10/Envelope #10" 297.00 684.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Env10" "%% FoomaticRIPOptionSetting: PageSize=Env10"
+ CustomMedia "EnvC5/Envelope C5" 459.00 649.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC5" "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+ CustomMedia "EnvC6/Envelope C6" 323.00 459.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvC6" "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+ CustomMedia "EnvDL/Envelope DL" 312.00 624.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvDL" "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+ CustomMedia "EnvISOB5/Envelope B5" 499.00 709.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5"
+ CustomMedia "EnvMonarch/Envelope Monarch" 279.00 540.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+ CustomMedia "Executive/Executive" 522.00 756.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Executive" "%% FoomaticRIPOptionSetting: PageSize=Executive"
+ CustomMedia "FLSA/American Foolscap" 612.00 936.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=FLSA" "%% FoomaticRIPOptionSetting: PageSize=FLSA"
+ CustomMedia "Hagaki/Hagaki" 283.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Hagaki" "%% FoomaticRIPOptionSetting: PageSize=Hagaki"
+ CustomMedia "Legal/Legal" 612.00 1008.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=Legal" "%% FoomaticRIPOptionSetting: PageSize=Legal"
+ CustomMedia "Oufuku/Oufuku-Hagaki" 567.00 420.00 0.00 36.00 0.00 0.00 "%% FoomaticRIPOptionSetting: PageSize=Oufuku" "%% FoomaticRIPOptionSetting: PageSize=Oufuku"
+ CustomMedia "w558h774/16K" 558.00 774.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w558h774" "%% FoomaticRIPOptionSetting: PageSize=w558h774"
+ CustomMedia "w612h935/Executive (JIS)" 612.00 935.00 18.00 36.00 18.00 9.00 "%% FoomaticRIPOptionSetting: PageSize=w612h935" "%% FoomaticRIPOptionSetting: PageSize=w612h935"
+
+
+ // <%Pyramid:NoAutoDuplex:NoCDDVD%>
+
+
+} // End Pyramid
+
+
+
+} // end Manufacturer "HP"
+
diff --git a/prnt/filters/hpcac b/prnt/filters/hpcac
new file mode 100755
index 0000000..39dc110
--- /dev/null
+++ b/prnt/filters/hpcac
@@ -0,0 +1,450 @@
+#!/usr/bin/perl -W
+use strict;
+use File::Temp qw(tempfile);
+use File::Basename;
+use Sys::Hostname;
+
+#######################################################
+#
+######################################################
+
+my $arg_job = $ARGV[0];
+my $arg_user = $ARGV[1];
+my $arg_title = $ARGV[2];
+my $arg_copies = $ARGV[3];
+my $arg_options = $ARGV[4];
+
+my $progname = basename( $0 );
+
+# Set to 1 to capture the Postscript that you generate to a temp file
+my $capture_postscript = 0;
+
+# Set to 1 to print debug messages to CUPS error log
+my $debug = 0;
+
+my $capture_fh = undef;
+my $capture_filename = undef;
+my $procfile;
+
+#----------------------------------------------------
+
+######################################################
+# Various debug & error subs
+# Error and debugging messages have to go to STDERR
+######################################################
+sub abort_exit
+{
+ my $mesg = shift;
+ print STDERR "ERROR: $progname - $mesg\n";
+ exit( 1 );
+}
+
+sub print_debug
+{
+ return if( ! $debug );
+ my $output = shift;
+ print STDERR "DEBUG: $progname [PID $$] $output\n";
+}
+
+sub print_info
+{
+ my $output = shift;
+ print STDERR "INFO: $progname [PID $$] $output\n";
+}
+
+sub print_warning
+{
+ my $output = shift;
+ print STDERR "WARN: $progname [PID $$] $output\n";
+}
+
+###################################################################
+# Open a temp file to capture the Postscript that I send to the printer.
+# Used for debugging
+###################################################################
+sub open_capture
+{
+ if( $capture_postscript ) {
+ ( $capture_fh, $capture_filename ) =
+ tempfile( "${progname}-$$-capture-XXXXXX", DIR => "/tmp", SUFFIX => ".ps", UNLINK => 0 );
+ if ( !defined $capture_fh ) {
+ # Not a fatal issue
+ print_warning( "Could not open capture file. Will not save Postscript output." );
+ $capture_filename = undef;
+ $capture_postscript = 0;
+ }
+ else {
+ print_info( "Capturing Postscript to '$capture_filename'" );
+ }
+ }
+}
+
+###################################################################
+# Close the debugging capture log
+###################################################################
+sub close_capture
+{
+ if( $capture_postscript && defined $capture_fh ) {
+ close( $capture_fh ) or print_warning( "Could not close capture file '$capture_filename': $!" );
+ }
+}
+
+###################################################################
+# Print out the given line to STDOUT (print data stream)
+# and optionally capture it for debugging.
+###################################################################
+sub emit_line
+{
+ my $line = shift;
+ print $line;
+
+ if( $capture_postscript && $capture_fh ) {
+ print $capture_fh $line;
+ }
+}
+
+###################################################################
+# Get the type of accounting that is used for the printer
+# by looking at the PPD for specific values.
+# Currently only support HPAccountingInfo: 1
+###################################################################
+sub GetHPAccountingType
+{
+ my $ppd = $ENV{"PPD"};
+ if( (! $ppd ) || (! -r $ppd ) ) {
+ return( "NONE", "NONE" );
+ }
+
+ open( PPDFILE, "$ppd" ) or return( "NONE", "NONE" );
+
+ my $accounting_type = "NONE";
+ my $accounting_mode = "NONE";
+ my $ppdline;
+ while( <PPDFILE> ) {
+ $ppdline = $_;
+ if( $ppdline =~ /^\*HPAccountingInfo:\s*(\d*)\s*$/ ) {
+ $accounting_type = "HPAccountingInfo";
+ $accounting_mode = $1;
+ print_debug("HPAccountingInfo found $accounting_mode");
+ }
+ }
+ close( PPDFILE );
+
+ return( $accounting_type, $accounting_mode );
+}
+
+###################################################################
+# The Postscript code containing the accounting info
+# has starting and ending snippets.
+###################################################################
+sub InsertFeatureStart
+{
+ emit_line( "[{\n" );
+}
+
+sub InsertFeatureEnd
+{
+ emit_line( "} stopped cleartomark\n" );
+}
+
+###################################################################
+sub GetUser
+{
+ my $user;
+ if ( $arg_user ) {
+ $user = $arg_user;
+ }
+ else {
+ $user = "nobody";
+ }
+
+ return( $user );
+}
+
+###################################################################
+sub GetJob { }
+
+
+###################################################################
+sub GetTitle { }
+
+###################################################################
+sub GetOptions
+{
+ my %opt_hash = ();
+ my $options = $arg_options;
+ my @opt_array = split( ' ', $options );
+ foreach my $option ( @opt_array ) {
+ my( $name, $value ) = split( /=/, $option, 2 );
+ if ( !$value ) {
+ $value = "";
+ }
+ print_debug( "Option $name='$value'" );
+ $opt_hash{$name} = $value;
+ }
+ return( \%opt_hash );
+}
+
+###################################################################
+# If a UUID wasn't given to us by CUPS, try a few methods
+# to create one ourselves.
+###################################################################
+sub CreateUUID
+{
+ my $uuid_str = "";
+ eval {
+ require Data::UUID;
+ my $ug = new Data::UUID;
+ $uuid_str = $ug->create_str;
+ };
+ if ($@) {
+ $uuid_str = `uuidgen`;
+ $uuid_str =~ s/\r?\n?$//;
+ }
+
+ return( $uuid_str );
+}
+
+###################################################################
+# CUPS passes in an option value that contains a UUID.
+# If it's there, use that and if not, try to create one ourselves
+###################################################################
+sub GetUUID
+{
+ my $uuid = "";
+ my $r_opt_hash = GetOptions();
+ # job-uuid=urn:uuid:018c1dab-3c0c-3edf-6036-1e87af479038
+
+ my $job_uuid = $$r_opt_hash{ "job-uuid" };
+ if ( $job_uuid ) {
+ if ( $job_uuid =~ /urn:uuid:(.*)/ ) {
+ $uuid = $1;
+ print_debug( "UUID in job-uuid=$uuid" );
+ }
+ else {
+ print_debug( "bad job-uuid" );
+ $uuid = CreateUUID();
+ }
+ }
+ else {
+ $uuid = CreateUUID();
+ }
+
+ if ( ! $uuid ) {
+ print_debug( "EPIC FAIL: Could not find nor generate UUID" );
+ }
+
+ return( $uuid );
+}
+
+###################################################################
+# Get the system name
+###################################################################
+sub GetSystem
+{
+ my $system_name = hostname;
+ if( !$system_name ) {
+ $system_name = "unknown-system_name";
+ }
+
+ return( $system_name );
+
+}
+
+###################################################################
+# The domain value is really a Windows domain. Since we're
+# not using this in the Windows environment, we just
+# use the hostname. The value is not used for Color Access Control
+# filtering but it still has to be included in the job accounting info
+###################################################################
+sub GetDomain
+{
+ my $domain = hostname;
+ if( !$domain ) {
+ $domain = "unknown-domain";
+ }
+
+ return( $domain );
+}
+
+###################################################################
+# Gather up all of the information needed for the accounting data
+# to be included in the print stream
+###################################################################
+sub GetHPAccountingInfo
+{
+ my( $jobname, $user, $system, $domain, $date, $uuid, $app, $appexe, $dept );
+
+ $jobname = $arg_job;
+ $user = GetUser();
+ $system = GetSystem();
+ $domain = GetDomain();
+ my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
+ $year += 1900;
+ $mon += 1;
+ # YYYYMMDDhhmmss
+ $date = sprintf( "%s%02d%02d%02d%02d%02d", $year, $mon, $mday, $hour, $min, $sec);
+ $uuid = GetUUID();
+
+ # There is no way to get the name of the application that generated this PS file.
+ # Set it to this as a fallback.
+ $app = "HP Linux Printing";
+ $appexe = "HP Linux Printing";
+
+ $dept = $user;
+
+ return( $jobname, $user, $system, $domain, $date, $uuid, $app, $appexe, $dept );
+}
+
+###################################################################
+# Once the accounting data has been gathered, format it and
+# include it in the print stream.
+###################################################################
+sub InsertHPAccountingInfo
+{
+
+ my ( $accounting_type, $accounting_mode ) = GetHPAccountingType();
+ print_debug( "Accounting Type=$accounting_type\tAccounting Mode=$accounting_mode");
+
+ if( ! ( ($accounting_type eq "HPAccountingInfo") && ($accounting_mode == 1)) ) {
+ print_debug( "Color Access Control not in effect." );
+ return;
+ }
+
+ InsertFeatureStart();
+ my( $jobname, $user, $system, $domain, $date, $uuid, $app, $appexe, $dept ) = GetHPAccountingInfo();
+
+ my $accounting_feature = "";
+ $accounting_feature = "%%BeginFeature: *HPAccountingInfo\n" .
+ " currentpagedevice /StringCodeSet known\n" .
+ " {\n" .
+ " << /StringCodeSet (UTF8) >> setpagedevice\n" .
+ " <<\n" .
+ " /JobName ($jobname)\n" .
+ " /JobAcct1 ($user)\n" .
+ " /JobAcct2 ($system)\n" .
+ " /JobAcct3 ($domain)\n" .
+ " /JobAcct4 ($date)\n" .
+ " /JobAcct5 ($uuid)\n" .
+ " /JobAcct6 ($app)\n" .
+ " /JobAcct7 ($appexe)\n" .
+ " /JobAcct8 ($dept)\n" .
+ " >> setuserparams\n" .
+ " }\n" .
+ " {\n" .
+ " <<\n" .
+ " /JobName ($jobname)\n" .
+ " /JobAcct1 ($user)\n" .
+ " /JobAcct2 ($system)\n" .
+ " /JobAcct3 ($domain)\n" .
+ " /JobAcct4 ($date)\n" .
+ " /JobAcct5 ($uuid)\n" .
+ " /JobAcct6 ($app)\n" .
+ " /JobAcct7 ($appexe)\n" .
+ " /JobAcct8 ($dept)\n" .
+ " >> setuserparams\n" .
+ " } ifelse\n" .
+ "%%EndFeature\n";
+
+ emit_line( $accounting_feature );
+ InsertFeatureEnd();
+}
+
+###################################################################
+# If the print job is from stdin, save a copy
+###################################################################
+sub stdin2file
+{
+ my ( $tmp_fh, $tmp_filename ) =
+ tempfile( "${progname}-$$-stdin-XXXXXX", SUFFIX => ".ps", DIR => "/tmp", UNLINK => 0 );
+ if ( !defined $tmp_fh ) {
+ abort_exit( "Cannot create tempfile '$tmp_filename'" );
+ }
+
+ print_debug( "Copying STDIN to $tmp_filename" );
+ while (<STDIN>)
+ {
+ print $tmp_fh $_;
+ }
+ close $tmp_fh or abort_exit( "Cannot close tempfile '$tmp_filename': $!" );
+ return( $tmp_filename );
+}
+
+###################################################################
+# If the print job is contained in a file, make a copy.
+# A copy is made because the original file could be deleted
+# before this print job is completed.
+###################################################################
+sub copy_file
+{
+ my $from = shift;
+
+ open (FROM, "<$from" ) or abort_exit( "Cannot read '$from': $!" );
+ my ( $tmp_fh, $tmp_filename ) =
+ tempfile( "${progname}-$$-copy-XXXXXX", SUFFIX => ".ps", DIR => "/tmp", UNLINK => 0 );
+ if ( !defined $tmp_fh ) {
+ abort_exit( "Couldn't create temporary file '$tmp_filename'" );
+ }
+
+ print_debug( "Copying $from to $tmp_filename" );
+ while (<FROM>) {
+ print $tmp_fh $_ or abort_exit( "Can't write to tempfile '$tmp_filename': $!" );
+ }
+ close $tmp_fh or abort_exit( "Cannot close tempfile '$tmp_filename': $!" );
+ close FROM;
+ return $tmp_filename;
+}
+
+###################################################################
+# Given the print job, look through it for the right place to
+# insert the accounting info. The document is assumed to be in
+# the Adobe DSC format already and should contain the BeginProlog
+# item. Upstream CUPS filters will have converted the Postscript
+# data into DSC format.
+###################################################################
+sub processfile
+{
+ my $fn = shift;
+ open (PSFILE, "<$fn") or abort_exit( "Cannot open '$fn': $!");
+ while (<PSFILE>)
+ {
+ emit_line( $_ );
+ if( /%%BeginProlog/ ) {
+ InsertHPAccountingInfo();
+ }
+ }
+ close PSFILE;
+}
+
+###################################################################
+# Main
+###################################################################
+
+if ($#ARGV == 4)
+{
+ $procfile = stdin2file();
+}
+elsif ($#ARGV == 5)
+{
+ $procfile = copy_file($ARGV[5]);
+} else {
+ abort_exit( "job-id user title copies options [file]");
+}
+
+for my $i ( 0 .. $#ARGV ) {
+ print_debug( "ARG $i=$ARGV[$i]")
+}
+print_debug("job-id=$arg_job user=$arg_user title=$arg_title copies=$arg_copies $arg_options $procfile");
+
+my ($key, $value);
+foreach $key ( sort keys %ENV) {
+ print_debug("ENV $key=$ENV{$key}");
+}
+
+print_debug( "Processing file");
+open_capture();
+processfile($procfile);
+close_capture();
+
+unlink($procfile) or print STDERR "ERROR: $progname - Couldn't remove '$procfile': $!\n";
+exit 0;
diff --git a/prnt/filters/hplipjs.c b/prnt/filters/hplipjs.c
new file mode 100644
index 0000000..885c29d
--- /dev/null
+++ b/prnt/filters/hplipjs.c
@@ -0,0 +1,303 @@
+/*****************************************************************************\
+ hplipjs.c : HP CUPS filter for PostScript printers
+
+ Copyright (c) 2008, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ NOT LIMITED TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+#include <stdio.h>
+#include <string.h>
+#include <memory.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <cups/cups.h>
+#include <sys/types.h>
+#include <pwd.h>
+
+
+#ifdef TESTING
+FILE *HPFp;
+int HPWrite (int fd, void *pBuffer, int len)
+{
+ fwrite (pBuffer, 1, len, HPFp);
+ return len;
+}
+#else
+#define HPWrite write
+#endif
+
+static char *szJSStrings[] = {"HOLDKEY", "USERNAME", "JOBNAME", "HOLDTYPE", "DUPLICATEJOB"};
+
+void SendJobHoldCommands (char *szJSOptions, int fd)
+{
+ int i, k;
+ int iJS;
+ char *p;
+ char szStr[256];
+ p = strstr (szJSOptions, "HOLD");
+ if (!(strncmp (p+5, "OFF", 3)))
+ return;
+ while (*p && *p != '=')
+ p++;
+ p++;
+ k = 14;
+ memset (szStr, 0, sizeof (szStr));
+ strcpy (szStr, "@PJL SET HOLD=");
+ while (*p && *p > ' ' && k < 254)
+ {
+ szStr[k++] = *p++;
+ }
+ szStr[k] = '\x0A';
+ HPWrite (fd, szStr, strlen (szStr));
+
+ p = szJSOptions;
+ iJS = sizeof (szJSStrings) / sizeof (szJSStrings[0]);
+ for (i = 0; i < iJS; i++)
+ {
+ if ((p = strstr (szJSOptions, szJSStrings[i])))
+ {
+ memset (szStr, 0, sizeof (szStr));
+ sprintf (szStr, "@PJL SET %s=", szJSStrings[i]);
+ while (*p && *p != '=')
+ p++;
+ p++;
+ k = strlen (szStr);
+ if (i < 3)
+ szStr[k++] = '"';
+ while (*p && *p > ' ' && k < 254)
+ {
+ szStr[k] = *p++;
+ if (szStr[k] == '_')
+ szStr[k] = ' ';
+ k++;
+ }
+ if (i < 3)
+ szStr[k++] = '"';
+ szStr[k] = '\x0A';
+ HPWrite (fd, szStr, strlen (szStr));
+ }
+ }
+ return;
+}
+
+void GetOptionStringFromCups (char *pPrinter, int fd, char *user)
+{
+ struct passwd *pwd;
+ char szlpOptionsFile[1024];
+ FILE *fp;
+ char szLine[1024];
+ pwd = getpwnam (user);
+ if (pwd == NULL)
+ {
+ fprintf (stderr, "DEBUG: getpwnam failed for user %s\n", user);
+ return;
+ }
+ sprintf (szlpOptionsFile, "%s/.cups/lpoptions", pwd->pw_dir);
+ fp = fopen (szlpOptionsFile, "r");
+ if (fp == NULL)
+ {
+ fprintf (stderr, "DEBUG: Unable to open lpoptions file %s\n", szlpOptionsFile);
+ return;
+ }
+ while (!feof (fp))
+ {
+ fgets (szLine, 1020, fp);
+ if (strstr (szLine, pPrinter))
+ {
+ fprintf (stderr, "DEBUG: Got %s from lpoptions file\n", szLine);
+ SendJobHoldCommands (szLine + strlen (pPrinter) + 5, fd);
+ break;
+ }
+ }
+ fclose (fp);
+}
+
+#if 0
+void GetOptionStringFromCups (char *pPrinter, int fd)
+{
+ int i, j;
+ int iJS;
+ int num_dests;
+ cups_dest_t *dests;
+ cups_dest_t *dest;
+ char *opt;
+ char *ppdFileName;
+ ppd_file_t *ppdFile;
+ char szJSOptionString[1024];
+
+fprintf (stderr, "DEBUG: In GetOption.... printer = %s, fd = %d\n", pPrinter, fd);
+ ppdFileName = (char *) cupsGetPPD (pPrinter);
+ if (!ppdFileName)
+ {
+fprintf (stderr, "DEBUG: did not get ppdfilename\n");
+ return;
+ }
+fprintf (stderr, "DEBUG: ppdFileName = %s\n", ppdFileName);
+ ppdFile = ppdOpenFile (ppdFileName);
+fprintf (stderr, "DEBUG: ppdFileName = %s\n", ppdFileName);
+ if (ppdFile == NULL)
+ {
+fprintf (stderr, "DEBUG: unable to open ppdfile, %s\n", ppdFileName);
+ return;
+ }
+ num_dests = cupsGetDests (&dests);
+ if (num_dests == 0)
+ {
+fprintf (stderr, "DEBUG: num_dests is zero\n");
+ ppdClose (ppdFile);
+ return;
+ }
+ dest = cupsGetDest (pPrinter, NULL, num_dests, dests);
+ if (dest == NULL)
+ {
+fprintf (stderr, "DEBUG: did not get dest for printer %s\n", pPrinter);
+ ppdClose (ppdFile);
+ return;
+ }
+ ppdMarkDefaults (ppdFile);
+ cupsMarkOptions (ppdFile, dest->num_options, dest->options);
+ iJS = sizeof (szJSStrings) / sizeof (szJSStrings[0]);
+ if ((opt = (char *) cupsGetOption ("HOLD", dest->num_options, dest->options)) == NULL)
+ {
+fprintf (stderr, "DEBUG: did not see HOLD option\nOptions in the list are:\n");
+for (i = 0; i < dest->num_options; i++)
+{
+ fprintf (stderr, "DEBUG: Option = %s : value = %s\n", dest->options[i].name, dest->options[i].value);
+}
+
+ ppdClose (ppdFile);
+ return;
+ }
+ memset (szJSOptionString, 0, sizeof (szJSOptionString));
+ j = sprintf (szJSOptionString, "HOLD=%s", opt);
+ for (i = 0; i < iJS; i++)
+ {
+ if ((opt = (char *) cupsGetOption (szJSStrings[i], dest->num_options, dest->options)))
+ {
+fprintf (stderr, "DEBUG: cupsGetOption returned %s = %s\n", szJSStrings[i], opt);
+ j += sprintf (szJSOptionString + j, " %s=%s", szJSStrings[i], opt);
+ }
+ }
+ ppdClose (ppdFile);
+ cupsFreeDests (num_dests, dests);
+fprintf (stderr, "DEBUG: Calling SendJobHoldCommands with %s\n", szJSOptionString);
+ SendJobHoldCommands (szJSOptionString, fd);
+}
+#endif
+
+int main (int argc, char **argv)
+{
+#ifdef TESTING
+ int i;
+#endif
+ int n;
+ int fd;
+ int Outfd;
+ char pBuffer[260];
+ char *szStartJob = "\x1B%-12345X@PJL JOBNAME=";
+ char *szUEL = "@PJL ENTER LANGUAGE=POSTSCRIPT\x0A";
+ char *szEndJob = "\x1B%-12345X@PJL EOJ\x0A\x1B%-12345X";
+
+/*
+ * Job storage command strings
+ *
+ * @PJL SET HOLD=ON | OFF | STORE | REPRINT
+ * hold in memory, regular job, store to hdd, reprint from memory
+ * @PJL SET HOLDTYPE=PRIVATE | PUBLIC
+ * @PJL SET HOLDKEY=1234
+ * @PJL SET USERNAME="user_name"
+ * @PJL SET JOBNAME="job_name"
+ * @PJL SET DUPLICATEJOB=APPEND | REPLACE
+ */
+
+ setbuf (stderr, NULL);
+ if (argc < 6 || argc > 7)
+ {
+ fprintf (stderr, "ERROR: Uage - %s JobId UserName Title NCopies OptionList [InputFile]\n", *argv);
+ return 1;
+ }
+
+// Doesn't really work
+// cupsSetUser (argv[2]);
+
+#ifdef TESTING
+ for (i = 0; i < argc; i++)
+ {
+ fprintf (stderr, "DEBUG: HPLIPJS: argv[%d] = %s\n", i, argv[i]);
+ }
+
+ HPFp = fopen ("/tmp/output.ps", "w");
+#endif
+ fd = 0; // read from stdin
+ Outfd = 1; // HPWrite to stdout
+ if (argc == 7)
+ {
+ if ((fd = open (argv[6], O_RDONLY)) == -1)
+ {
+ fprintf (stderr, "ERROR: Unable to open input file %s for reading\n", argv[6]);
+ return 1;
+ }
+ }
+
+ HPWrite (Outfd, szStartJob, strlen (szStartJob));
+ sprintf (pBuffer, "hplip-%s\x0A", argv[1]);
+ HPWrite (Outfd, pBuffer, strlen (pBuffer));
+
+/*
+ * Check if job storage option is selected. If so, send the PJL header and
+ * job storage commands.
+ */
+
+ if ((strstr (argv[5], "HOLD")))
+ {
+ fprintf (stderr, "DEBUG: found HOLD option\n");
+ SendJobHoldCommands (argv[5], Outfd);
+ }
+ else
+ {
+ fprintf (stderr, "DEBUG: did not find HOLD option, calling GetOption....\n");
+ GetOptionStringFromCups (argv[0], Outfd, argv[2]);
+ }
+
+ HPWrite (Outfd, szUEL, strlen (szUEL));
+
+ while ((n = read (fd, pBuffer, 256)) > 0)
+ {
+ HPWrite (Outfd, pBuffer, n);
+ }
+
+ HPWrite (Outfd, szEndJob, strlen (szEndJob));
+
+ if (fd != 0)
+ close (fd);
+#ifdef TESTING
+ fclose (HPFp);
+#endif
+ return 0;
+}
+
diff --git a/prnt/hpcups/BreakTables.cpp b/prnt/hpcups/BreakTables.cpp
new file mode 100644
index 0000000..a8300bb
--- /dev/null
+++ b/prnt/hpcups/BreakTables.cpp
@@ -0,0 +1,2370 @@
+/*****************************************************************************\
+ breaks_open.cpp : Open Source Imaging Error Diffusion Tables
+
+ Copyright (c) 1994 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+unsigned char HTBinary_open[1024]=
+{
+ 0 , 0 , 0 , 0 ,
+ 0 , 0 , 0 , 0 ,
+ 0 , 2 , 0 , 0 ,
+ 0 , 3 , 0 , 0 ,
+ 0 , 4 , 0 , 0 ,
+ 0 , 5 , 0 , 0 ,
+ 0 , 6 , 0 , 0 ,
+ 0 , 7 , 0 , 0 ,
+ 0 , 8 , 0 , 0 ,
+ 0 , 9 , 0 , 0 ,
+ 0 , 10 , 0 , 0 ,
+ 0 , 11 , 0 , 0 ,
+ 0 , 12 , 0 , 0 ,
+ 0 , 13 , 0 , 0 ,
+ 0 , 14 , 0 , 0 ,
+ 0 , 15 , 0 , 0 ,
+ 0 , 16 , 0 , 0 ,
+ 0 , 17 , 0 , 0 ,
+ 0 , 18 , 0 , 0 ,
+ 0 , 19 , 0 , 0 ,
+ 0 , 20 , 0 , 0 ,
+ 0 , 21 , 0 , 0 ,
+ 0 , 22 , 0 , 0 ,
+ 0 , 23 , 0 , 0 ,
+ 0 , 24 , 0 , 0 ,
+ 0 , 25 , 0 , 0 ,
+ 0 , 26 , 0 , 0 ,
+ 0 , 27 , 0 , 0 ,
+ 0 , 28 , 0 , 0 ,
+ 0 , 29 , 0 , 0 ,
+ 0 , 30 , 0 , 0 ,
+ 0 , 31 , 0 , 0 ,
+ 0 , 32 , 0 , 0 ,
+ 0 , 33 , 0 , 0 ,
+ 0 , 34 , 0 , 0 ,
+ 0 , 35 , 0 , 0 ,
+ 0 , 36 , 0 , 0 ,
+ 0 , 37 , 0 , 0 ,
+ 0 , 38 , 0 , 0 ,
+ 0 , 39 , 0 , 0 ,
+ 0 , 40 , 0 , 0 ,
+ 0 , 41 , 0 , 0 ,
+ 0 , 42 , 0 , 0 ,
+ 0 , 43 , 0 , 0 ,
+ 0 , 44 , 0 , 0 ,
+ 0 , 45 , 0 , 0 ,
+ 0 , 46 , 0 , 0 ,
+ 0 , 47 , 0 , 0 ,
+ 0 , 48 , 0 , 0 ,
+ 0 , 49 , 0 , 0 ,
+ 0 , 50 , 0 , 0 ,
+ 0 , 51 , 0 , 0 ,
+ 0 , 52 , 0 , 0 ,
+ 0 , 53 , 0 , 0 ,
+ 0 , 54 , 0 , 0 ,
+ 0 , 55 , 0 , 0 ,
+ 0 , 56 , 0 , 0 ,
+ 0 , 57 , 0 , 0 ,
+ 0 , 58 , 0 , 0 ,
+ 0 , 59 , 0 , 0 ,
+ 0 , 60 , 0 , 0 ,
+ 0 , 61 , 0 , 0 ,
+ 0 , 62 , 0 , 0 ,
+ 0 , 63 , 0 , 0 ,
+ 0 , 64 , 0 , 0 ,
+ 0 , 65 , 0 , 0 ,
+ 0 , 66 , 0 , 0 ,
+ 0 , 67 , 0 , 0 ,
+ 0 , 68 , 0 , 0 ,
+ 0 , 69 , 0 , 0 ,
+ 0 , 70 , 0 , 0 ,
+ 0 , 71 , 0 , 0 ,
+ 0 , 72 , 0 , 0 ,
+ 0 , 73 , 0 , 0 ,
+ 0 , 74 , 0 , 0 ,
+ 0 , 75 , 0 , 0 ,
+ 0 , 76 , 0 , 0 ,
+ 0 , 77 , 0 , 0 ,
+ 0 , 78 , 0 , 0 ,
+ 0 , 79 , 0 , 0 ,
+ 0 , 80 , 0 , 0 ,
+ 0 , 81 , 0 , 0 ,
+ 0 , 82 , 0 , 0 ,
+ 0 , 83 , 0 , 0 ,
+ 0 , 84 , 0 , 0 ,
+ 0 , 85 , 0 , 0 ,
+ 0 , 86 , 0 , 0 ,
+ 0 , 87 , 0 , 0 ,
+ 0 , 88 , 0 , 0 ,
+ 0 , 89 , 0 , 0 ,
+ 0 , 90 , 0 , 0 ,
+ 0 , 91 , 0 , 0 ,
+ 0 , 92 , 0 , 0 ,
+ 0 , 93 , 0 , 0 ,
+ 0 , 94 , 0 , 0 ,
+ 0 , 95 , 0 , 0 ,
+ 0 , 96 , 0 , 0 ,
+ 0 , 97 , 0 , 0 ,
+ 0 , 98 , 0 , 0 ,
+ 0 , 99 , 0 , 0 ,
+ 0 , 100 , 0 , 0 ,
+ 0 , 101 , 0 , 0 ,
+ 0 , 102 , 0 , 0 ,
+ 0 , 103 , 0 , 0 ,
+ 0 , 104 , 0 , 0 ,
+ 0 , 105 , 0 , 0 ,
+ 0 , 106 , 0 , 0 ,
+ 0 , 107 , 0 , 0 ,
+ 0 , 108 , 0 , 0 ,
+ 0 , 109 , 0 , 0 ,
+ 0 , 110 , 0 , 0 ,
+ 0 , 111 , 0 , 0 ,
+ 0 , 112 , 0 , 0 ,
+ 0 , 113 , 0 , 0 ,
+ 0 , 114 , 0 , 0 ,
+ 0 , 115 , 0 , 0 ,
+ 0 , 116 , 0 , 0 ,
+ 0 , 117 , 0 , 0 ,
+ 0 , 118 , 0 , 0 ,
+ 0 , 119 , 0 , 0 ,
+ 0 , 120 , 0 , 0 ,
+ 0 , 121 , 0 , 0 ,
+ 0 , 122 , 0 , 0 ,
+ 0 , 123 , 0 , 0 ,
+ 0 , 124 , 0 , 0 ,
+ 0 , 125 , 0 , 0 ,
+ 0 , 126 , 0 , 0 ,
+ 0 , 127 , 0 , 0 ,
+ 0 , 128 , 0 , 0 ,
+ 0 , 129 , 0 , 0 ,
+ 0 , 130 , 0 , 0 ,
+ 0 , 131 , 0 , 0 ,
+ 0 , 132 , 0 , 0 ,
+ 0 , 133 , 0 , 0 ,
+ 0 , 134 , 0 , 0 ,
+ 0 , 135 , 0 , 0 ,
+ 0 , 136 , 0 , 0 ,
+ 0 , 137 , 0 , 0 ,
+ 0 , 138 , 0 , 0 ,
+ 0 , 139 , 0 , 0 ,
+ 0 , 140 , 0 , 0 ,
+ 0 , 141 , 0 , 0 ,
+ 0 , 142 , 0 , 0 ,
+ 0 , 143 , 0 , 0 ,
+ 0 , 144 , 0 , 0 ,
+ 0 , 145 , 0 , 0 ,
+ 0 , 146 , 0 , 0 ,
+ 0 , 147 , 0 , 0 ,
+ 0 , 148 , 0 , 0 ,
+ 0 , 149 , 0 , 0 ,
+ 0 , 150 , 0 , 0 ,
+ 0 , 151 , 0 , 0 ,
+ 0 , 152 , 0 , 0 ,
+ 0 , 153 , 0 , 0 ,
+ 0 , 154 , 0 , 0 ,
+ 0 , 155 , 0 , 0 ,
+ 0 , 156 , 0 , 0 ,
+ 0 , 157 , 0 , 0 ,
+ 0 , 158 , 0 , 0 ,
+ 0 , 159 , 0 , 0 ,
+ 0 , 160 , 0 , 0 ,
+ 0 , 161 , 0 , 0 ,
+ 0 , 162 , 0 , 0 ,
+ 0 , 163 , 0 , 0 ,
+ 0 , 164 , 0 , 0 ,
+ 0 , 165 , 0 , 0 ,
+ 0 , 166 , 0 , 0 ,
+ 0 , 167 , 0 , 0 ,
+ 0 , 168 , 0 , 0 ,
+ 0 , 169 , 0 , 0 ,
+ 0 , 170 , 0 , 0 ,
+ 0 , 171 , 0 , 0 ,
+ 0 , 172 , 0 , 0 ,
+ 0 , 173 , 0 , 0 ,
+ 0 , 174 , 0 , 0 ,
+ 0 , 175 , 0 , 0 ,
+ 0 , 176 , 0 , 0 ,
+ 0 , 177 , 0 , 0 ,
+ 0 , 178 , 0 , 0 ,
+ 0 , 179 , 0 , 0 ,
+ 0 , 180 , 0 , 0 ,
+ 0 , 181 , 0 , 0 ,
+ 0 , 182 , 0 , 0 ,
+ 0 , 183 , 0 , 0 ,
+ 0 , 184 , 0 , 0 ,
+ 0 , 185 , 0 , 0 ,
+ 0 , 186 , 0 , 0 ,
+ 0 , 187 , 0 , 0 ,
+ 0 , 188 , 0 , 0 ,
+ 0 , 189 , 0 , 0 ,
+ 0 , 190 , 0 , 0 ,
+ 0 , 191 , 0 , 0 ,
+ 0 , 192 , 0 , 0 ,
+ 0 , 193 , 0 , 0 ,
+ 0 , 194 , 0 , 0 ,
+ 0 , 195 , 0 , 0 ,
+ 0 , 196 , 0 , 0 ,
+ 0 , 197 , 0 , 0 ,
+ 0 , 198 , 0 , 0 ,
+ 0 , 199 , 0 , 0 ,
+ 0 , 200 , 0 , 0 ,
+ 0 , 201 , 0 , 0 ,
+ 0 , 202 , 0 , 0 ,
+ 0 , 203 , 0 , 0 ,
+ 0 , 204 , 0 , 0 ,
+ 0 , 205 , 0 , 0 ,
+ 0 , 206 , 0 , 0 ,
+ 0 , 207 , 0 , 0 ,
+ 0 , 208 , 0 , 0 ,
+ 0 , 209 , 0 , 0 ,
+ 0 , 210 , 0 , 0 ,
+ 0 , 211 , 0 , 0 ,
+ 0 , 212 , 0 , 0 ,
+ 0 , 213 , 0 , 0 ,
+ 0 , 214 , 0 , 0 ,
+ 0 , 215 , 0 , 0 ,
+ 0 , 216 , 0 , 0 ,
+ 0 , 217 , 0 , 0 ,
+ 0 , 218 , 0 , 0 ,
+ 0 , 219 , 0 , 0 ,
+ 0 , 220 , 0 , 0 ,
+ 0 , 221 , 0 , 0 ,
+ 0 , 222 , 0 , 0 ,
+ 0 , 223 , 0 , 0 ,
+ 0 , 224 , 0 , 0 ,
+ 0 , 225 , 0 , 0 ,
+ 0 , 226 , 0 , 0 ,
+ 0 , 227 , 0 , 0 ,
+ 0 , 228 , 0 , 0 ,
+ 0 , 229 , 0 , 0 ,
+ 0 , 230 , 0 , 0 ,
+ 0 , 231 , 0 , 0 ,
+ 0 , 232 , 0 , 0 ,
+ 0 , 233 , 0 , 0 ,
+ 0 , 234 , 0 , 0 ,
+ 0 , 235 , 0 , 0 ,
+ 0 , 236 , 0 , 0 ,
+ 0 , 237 , 0 , 0 ,
+ 0 , 238 , 0 , 0 ,
+ 0 , 239 , 0 , 0 ,
+ 0 , 240 , 0 , 0 ,
+ 0 , 241 , 0 , 0 ,
+ 0 , 242 , 0 , 0 ,
+ 0 , 243 , 0 , 0 ,
+ 0 , 244 , 0 , 0 ,
+ 0 , 245 , 0 , 0 ,
+ 0 , 246 , 0 , 0 ,
+ 0 , 247 , 0 , 0 ,
+ 0 , 248 , 0 , 0 ,
+ 0 , 249 , 0 , 0 ,
+ 0 , 250 , 0 , 0 ,
+ 0 , 251 , 0 , 0 ,
+ 0 , 252 , 0 , 0 ,
+ 0 , 253 , 0 , 0 ,
+ 0 , 254 , 0 , 0 ,
+ 0 , 254 , 0 , 0
+};
+
+unsigned char HT300x3004level_open[1024]=
+{
+ 0 , 0 , 0 , 0 ,
+ 0 , 0 , 0 , 0 ,
+ 0 , 6 , 0 , 0 ,
+ 0 , 9 , 0 , 0 ,
+ 0 , 12 , 0 , 0 ,
+ 0 , 15 , 0 , 0 ,
+ 0 , 18 , 0 , 0 ,
+ 0 , 21 , 0 , 0 ,
+ 0 , 24 , 0 , 0 ,
+ 0 , 27 , 0 , 0 ,
+ 0 , 30 , 0 , 0 ,
+ 0 , 33 , 0 , 0 ,
+ 0 , 36 , 0 , 0 ,
+ 0 , 39 , 0 , 0 ,
+ 0 , 42 , 0 , 0 ,
+ 0 , 45 , 0 , 0 ,
+ 0 , 48 , 0 , 0 ,
+ 0 , 51 , 0 , 0 ,
+ 0 , 54 , 0 , 0 ,
+ 0 , 57 , 0 , 0 ,
+ 0 , 60 , 0 , 0 ,
+ 0 , 63 , 0 , 0 ,
+ 0 , 66 , 0 , 0 ,
+ 0 , 69 , 0 , 0 ,
+ 0 , 72 , 0 , 0 ,
+ 0 , 75 , 0 , 0 ,
+ 0 , 78 , 0 , 0 ,
+ 0 , 81 , 0 , 0 ,
+ 0 , 84 , 0 , 0 ,
+ 0 , 87 , 0 , 0 ,
+ 0 , 90 , 0 , 0 ,
+ 0 , 93 , 0 , 0 ,
+ 0 , 96 , 0 , 0 ,
+ 0 , 99 , 0 , 0 ,
+ 0 , 102 , 0 , 0 ,
+ 0 , 105 , 0 , 0 ,
+ 0 , 108 , 0 , 0 ,
+ 0 , 111 , 0 , 0 ,
+ 0 , 114 , 0 , 0 ,
+ 0 , 117 , 0 , 0 ,
+ 0 , 120 , 0 , 0 ,
+ 0 , 123 , 0 , 0 ,
+ 0 , 126 , 0 , 0 ,
+ 0 , 129 , 0 , 0 ,
+ 0 , 132 , 0 , 0 ,
+ 0 , 135 , 0 , 0 ,
+ 0 , 138 , 0 , 0 ,
+ 0 , 141 , 0 , 0 ,
+ 0 , 144 , 0 , 0 ,
+ 0 , 147 , 0 , 0 ,
+ 0 , 150 , 0 , 0 ,
+ 0 , 153 , 0 , 0 ,
+ 0 , 156 , 0 , 0 ,
+ 0 , 159 , 0 , 0 ,
+ 0 , 162 , 0 , 0 ,
+ 0 , 165 , 0 , 0 ,
+ 0 , 168 , 0 , 0 ,
+ 0 , 171 , 0 , 0 ,
+ 0 , 174 , 0 , 0 ,
+ 0 , 177 , 0 , 0 ,
+ 0 , 180 , 0 , 0 ,
+ 0 , 183 , 0 , 0 ,
+ 0 , 186 , 0 , 0 ,
+ 0 , 189 , 0 , 0 ,
+ 0 , 192 , 0 , 0 ,
+ 0 , 195 , 0 , 0 ,
+ 0 , 198 , 0 , 0 ,
+ 0 , 201 , 0 , 0 ,
+ 0 , 204 , 0 , 0 ,
+ 0 , 207 , 0 , 0 ,
+ 0 , 210 , 0 , 0 ,
+ 0 , 213 , 0 , 0 ,
+ 0 , 216 , 0 , 0 ,
+ 0 , 219 , 0 , 0 ,
+ 0 , 222 , 0 , 0 ,
+ 0 , 225 , 0 , 0 ,
+ 0 , 228 , 0 , 0 ,
+ 0 , 231 , 0 , 0 ,
+ 0 , 234 , 0 , 0 ,
+ 0 , 237 , 0 , 0 ,
+ 0 , 240 , 0 , 0 ,
+ 0 , 243 , 0 , 0 ,
+ 0 , 246 , 0 , 0 ,
+ 0 , 249 , 0 , 0 ,
+ 0 , 252 , 0 , 0 ,
+ 1 , 0 , 0 , 0 ,
+ 1 , 3 , 0 , 0 ,
+ 1 , 6 , 0 , 0 ,
+ 1 , 9 , 0 , 0 ,
+ 1 , 12 , 0 , 0 ,
+ 1 , 15 , 0 , 0 ,
+ 1 , 18 , 0 , 0 ,
+ 1 , 21 , 0 , 0 ,
+ 1 , 24 , 0 , 0 ,
+ 1 , 27 , 0 , 0 ,
+ 1 , 30 , 0 , 0 ,
+ 1 , 33 , 0 , 0 ,
+ 1 , 36 , 0 , 0 ,
+ 1 , 39 , 0 , 0 ,
+ 1 , 42 , 0 , 0 ,
+ 1 , 45 , 0 , 0 ,
+ 1 , 48 , 0 , 0 ,
+ 1 , 51 , 0 , 0 ,
+ 1 , 54 , 0 , 0 ,
+ 1 , 57 , 0 , 0 ,
+ 1 , 60 , 0 , 0 ,
+ 1 , 63 , 0 , 0 ,
+ 1 , 66 , 0 , 0 ,
+ 1 , 69 , 0 , 0 ,
+ 1 , 72 , 0 , 0 ,
+ 1 , 75 , 0 , 0 ,
+ 1 , 78 , 0 , 0 ,
+ 1 , 81 , 0 , 0 ,
+ 1 , 84 , 0 , 0 ,
+ 1 , 87 , 0 , 0 ,
+ 1 , 90 , 0 , 0 ,
+ 1 , 93 , 0 , 0 ,
+ 1 , 96 , 0 , 0 ,
+ 1 , 99 , 0 , 0 ,
+ 1 , 102 , 0 , 0 ,
+ 1 , 105 , 0 , 0 ,
+ 1 , 108 , 0 , 0 ,
+ 1 , 111 , 0 , 0 ,
+ 1 , 114 , 0 , 0 ,
+ 1 , 117 , 0 , 0 ,
+ 1 , 120 , 0 , 0 ,
+ 1 , 123 , 0 , 0 ,
+ 1 , 126 , 0 , 0 ,
+ 1 , 129 , 0 , 0 ,
+ 1 , 132 , 0 , 0 ,
+ 1 , 135 , 0 , 0 ,
+ 1 , 138 , 0 , 0 ,
+ 1 , 141 , 0 , 0 ,
+ 1 , 144 , 0 , 0 ,
+ 1 , 147 , 0 , 0 ,
+ 1 , 150 , 0 , 0 ,
+ 1 , 153 , 0 , 0 ,
+ 1 , 156 , 0 , 0 ,
+ 1 , 159 , 0 , 0 ,
+ 1 , 162 , 0 , 0 ,
+ 1 , 165 , 0 , 0 ,
+ 1 , 168 , 0 , 0 ,
+ 1 , 171 , 0 , 0 ,
+ 1 , 174 , 0 , 0 ,
+ 1 , 177 , 0 , 0 ,
+ 1 , 180 , 0 , 0 ,
+ 1 , 183 , 0 , 0 ,
+ 1 , 186 , 0 , 0 ,
+ 1 , 189 , 0 , 0 ,
+ 1 , 192 , 0 , 0 ,
+ 1 , 195 , 0 , 0 ,
+ 1 , 198 , 0 , 0 ,
+ 1 , 201 , 0 , 0 ,
+ 1 , 204 , 0 , 0 ,
+ 1 , 207 , 0 , 0 ,
+ 1 , 210 , 0 , 0 ,
+ 1 , 213 , 0 , 0 ,
+ 1 , 216 , 0 , 0 ,
+ 1 , 219 , 0 , 0 ,
+ 1 , 222 , 0 , 0 ,
+ 1 , 225 , 0 , 0 ,
+ 1 , 228 , 0 , 0 ,
+ 1 , 231 , 0 , 0 ,
+ 1 , 234 , 0 , 0 ,
+ 1 , 237 , 0 , 0 ,
+ 1 , 240 , 0 , 0 ,
+ 1 , 243 , 0 , 0 ,
+ 1 , 246 , 0 , 0 ,
+ 1 , 249 , 0 , 0 ,
+ 1 , 252 , 0 , 0 ,
+ 2 , 0 , 0 , 0 ,
+ 2 , 3 , 0 , 0 ,
+ 2 , 6 , 0 , 0 ,
+ 2 , 9 , 0 , 0 ,
+ 2 , 12 , 0 , 0 ,
+ 2 , 15 , 0 , 0 ,
+ 2 , 18 , 0 , 0 ,
+ 2 , 21 , 0 , 0 ,
+ 2 , 24 , 0 , 0 ,
+ 2 , 27 , 0 , 0 ,
+ 2 , 30 , 0 , 0 ,
+ 2 , 33 , 0 , 0 ,
+ 2 , 36 , 0 , 0 ,
+ 2 , 39 , 0 , 0 ,
+ 2 , 42 , 0 , 0 ,
+ 2 , 45 , 0 , 0 ,
+ 2 , 48 , 0 , 0 ,
+ 2 , 51 , 0 , 0 ,
+ 2 , 54 , 0 , 0 ,
+ 2 , 57 , 0 , 0 ,
+ 2 , 60 , 0 , 0 ,
+ 2 , 63 , 0 , 0 ,
+ 2 , 66 , 0 , 0 ,
+ 2 , 69 , 0 , 0 ,
+ 2 , 72 , 0 , 0 ,
+ 2 , 75 , 0 , 0 ,
+ 2 , 78 , 0 , 0 ,
+ 2 , 81 , 0 , 0 ,
+ 2 , 84 , 0 , 0 ,
+ 2 , 87 , 0 , 0 ,
+ 2 , 90 , 0 , 0 ,
+ 2 , 93 , 0 , 0 ,
+ 2 , 96 , 0 , 0 ,
+ 2 , 99 , 0 , 0 ,
+ 2 , 102 , 0 , 0 ,
+ 2 , 105 , 0 , 0 ,
+ 2 , 108 , 0 , 0 ,
+ 2 , 111 , 0 , 0 ,
+ 2 , 114 , 0 , 0 ,
+ 2 , 117 , 0 , 0 ,
+ 2 , 120 , 0 , 0 ,
+ 2 , 123 , 0 , 0 ,
+ 2 , 126 , 0 , 0 ,
+ 2 , 129 , 0 , 0 ,
+ 2 , 132 , 0 , 0 ,
+ 2 , 135 , 0 , 0 ,
+ 2 , 138 , 0 , 0 ,
+ 2 , 141 , 0 , 0 ,
+ 2 , 144 , 0 , 0 ,
+ 2 , 147 , 0 , 0 ,
+ 2 , 150 , 0 , 0 ,
+ 2 , 153 , 0 , 0 ,
+ 2 , 156 , 0 , 0 ,
+ 2 , 159 , 0 , 0 ,
+ 2 , 162 , 0 , 0 ,
+ 2 , 165 , 0 , 0 ,
+ 2 , 168 , 0 , 0 ,
+ 2 , 171 , 0 , 0 ,
+ 2 , 174 , 0 , 0 ,
+ 2 , 177 , 0 , 0 ,
+ 2 , 180 , 0 , 0 ,
+ 2 , 183 , 0 , 0 ,
+ 2 , 186 , 0 , 0 ,
+ 2 , 189 , 0 , 0 ,
+ 2 , 192 , 0 , 0 ,
+ 2 , 195 , 0 , 0 ,
+ 2 , 198 , 0 , 0 ,
+ 2 , 201 , 0 , 0 ,
+ 2 , 204 , 0 , 0 ,
+ 2 , 207 , 0 , 0 ,
+ 2 , 210 , 0 , 0 ,
+ 2 , 213 , 0 , 0 ,
+ 2 , 216 , 0 , 0 ,
+ 2 , 219 , 0 , 0 ,
+ 2 , 222 , 0 , 0 ,
+ 2 , 225 , 0 , 0 ,
+ 2 , 228 , 0 , 0 ,
+ 2 , 231 , 0 , 0 ,
+ 2 , 234 , 0 , 0 ,
+ 2 , 237 , 0 , 0 ,
+ 2 , 240 , 0 , 0 ,
+ 2 , 243 , 0 , 0 ,
+ 2 , 246 , 0 , 0 ,
+ 2 , 249 , 0 , 0 ,
+ 2 , 252 , 0 , 0 ,
+ 2 , 255 , 0 , 0
+};
+
+unsigned char HT600x6004level895_open[1024]=
+{
+ 0 , 0 , 0 , 0 ,
+ 0 , 0 , 0 , 0 ,
+ 0 , 3 , 0 , 0 ,
+ 0 , 3 , 0 , 0 ,
+ 0 , 4 , 0 , 0 ,
+ 0 , 4 , 0 , 0 ,
+ 0 , 4 , 0 , 0 ,
+ 0 , 4 , 0 , 0 ,
+ 0 , 6 , 0 , 0 ,
+ 0 , 6 , 0 , 0 ,
+ 0 , 7 , 0 , 0 ,
+ 0 , 7 , 0 , 0 ,
+ 0 , 9 , 0 , 0 ,
+ 0 , 9 , 0 , 0 ,
+ 0 , 11 , 0 , 0 ,
+ 0 , 11 , 0 , 0 ,
+ 0 , 12 , 0 , 0 ,
+ 0 , 12 , 0 , 0 ,
+ 0 , 14 , 0 , 0 ,
+ 0 , 14 , 0 , 0 ,
+ 0 , 15 , 0 , 0 ,
+ 0 , 15 , 0 , 0 ,
+ 0 , 17 , 0 , 0 ,
+ 0 , 17 , 0 , 0 ,
+ 0 , 19 , 0 , 0 ,
+ 0 , 19 , 0 , 0 ,
+ 0 , 20 , 0 , 0 ,
+ 0 , 20 , 0 , 0 ,
+ 0 , 22 , 0 , 0 ,
+ 0 , 22 , 0 , 0 ,
+ 0 , 23 , 0 , 0 ,
+ 0 , 23 , 0 , 0 ,
+ 0 , 25 , 0 , 0 ,
+ 0 , 25 , 0 , 0 ,
+ 0 , 27 , 0 , 0 ,
+ 0 , 27 , 0 , 0 ,
+ 0 , 28 , 0 , 0 ,
+ 0 , 28 , 0 , 0 ,
+ 0 , 30 , 0 , 0 ,
+ 0 , 30 , 0 , 0 ,
+ 0 , 31 , 0 , 0 ,
+ 0 , 31 , 0 , 0 ,
+ 0 , 33 , 0 , 0 ,
+ 0 , 33 , 0 , 0 ,
+ 0 , 35 , 0 , 0 ,
+ 0 , 35 , 0 , 0 ,
+ 0 , 36 , 0 , 0 ,
+ 0 , 36 , 0 , 0 ,
+ 0 , 38 , 0 , 0 ,
+ 0 , 38 , 0 , 0 ,
+ 0 , 39 , 0 , 0 ,
+ 0 , 39 , 0 , 0 ,
+ 0 , 41 , 0 , 0 ,
+ 0 , 41 , 0 , 0 ,
+ 0 , 43 , 0 , 0 ,
+ 0 , 44 , 0 , 0 ,
+ 0 , 46 , 0 , 0 ,
+ 0 , 47 , 0 , 0 ,
+ 0 , 49 , 0 , 0 ,
+ 0 , 51 , 0 , 0 ,
+ 0 , 52 , 0 , 0 ,
+ 0 , 54 , 0 , 0 ,
+ 0 , 55 , 0 , 0 ,
+ 0 , 57 , 0 , 0 ,
+ 0 , 58 , 0 , 0 ,
+ 0 , 60 , 0 , 0 ,
+ 0 , 62 , 0 , 0 ,
+ 0 , 63 , 0 , 0 ,
+ 0 , 65 , 0 , 0 ,
+ 0 , 66 , 0 , 0 ,
+ 0 , 68 , 0 , 0 ,
+ 0 , 70 , 0 , 0 ,
+ 0 , 71 , 0 , 0 ,
+ 0 , 73 , 0 , 0 ,
+ 0 , 74 , 0 , 0 ,
+ 0 , 78 , 0 , 0 ,
+ 0 , 79 , 0 , 0 ,
+ 0 , 82 , 0 , 0 ,
+ 0 , 84 , 0 , 0 ,
+ 0 , 86 , 0 , 0 ,
+ 0 , 89 , 0 , 0 ,
+ 0 , 90 , 0 , 0 ,
+ 0 , 92 , 0 , 0 ,
+ 0 , 95 , 0 , 0 ,
+ 0 , 97 , 0 , 0 ,
+ 0 , 98 , 0 , 0 ,
+ 0 , 102 , 0 , 0 ,
+ 0 , 103 , 0 , 0 ,
+ 0 , 105 , 0 , 0 ,
+ 0 , 108 , 0 , 0 ,
+ 0 , 109 , 0 , 0 ,
+ 0 , 111 , 0 , 0 ,
+ 0 , 114 , 0 , 0 ,
+ 0 , 116 , 0 , 0 ,
+ 0 , 117 , 0 , 0 ,
+ 0 , 121 , 0 , 0 ,
+ 0 , 122 , 0 , 0 ,
+ 0 , 124 , 0 , 0 ,
+ 0 , 127 , 0 , 0 ,
+ 0 , 129 , 0 , 0 ,
+ 0 , 130 , 0 , 0 ,
+ 0 , 133 , 0 , 0 ,
+ 0 , 135 , 0 , 0 ,
+ 0 , 137 , 0 , 0 ,
+ 0 , 140 , 0 , 0 ,
+ 0 , 141 , 0 , 0 ,
+ 0 , 143 , 0 , 0 ,
+ 0 , 146 , 0 , 0 ,
+ 0 , 148 , 0 , 0 ,
+ 0 , 149 , 0 , 0 ,
+ 0 , 153 , 0 , 0 ,
+ 0 , 154 , 0 , 0 ,
+ 0 , 156 , 0 , 0 ,
+ 0 , 159 , 0 , 0 ,
+ 0 , 160 , 0 , 0 ,
+ 0 , 162 , 0 , 0 ,
+ 0 , 165 , 0 , 0 ,
+ 0 , 167 , 0 , 0 ,
+ 0 , 168 , 0 , 0 ,
+ 0 , 172 , 0 , 0 ,
+ 0 , 173 , 0 , 0 ,
+ 0 , 175 , 0 , 0 ,
+ 0 , 178 , 0 , 0 ,
+ 0 , 180 , 0 , 0 ,
+ 0 , 181 , 0 , 0 ,
+ 0 , 184 , 0 , 0 ,
+ 0 , 186 , 0 , 0 ,
+ 0 , 188 , 0 , 0 ,
+ 0 , 191 , 0 , 0 ,
+ 0 , 192 , 0 , 0 ,
+ 0 , 194 , 0 , 0 ,
+ 0 , 197 , 0 , 0 ,
+ 0 , 199 , 0 , 0 ,
+ 0 , 200 , 0 , 0 ,
+ 0 , 204 , 0 , 0 ,
+ 0 , 205 , 0 , 0 ,
+ 0 , 207 , 0 , 0 ,
+ 0 , 210 , 0 , 0 ,
+ 0 , 211 , 0 , 0 ,
+ 0 , 213 , 0 , 0 ,
+ 0 , 216 , 0 , 0 ,
+ 0 , 218 , 0 , 0 ,
+ 0 , 219 , 0 , 0 ,
+ 0 , 223 , 0 , 0 ,
+ 0 , 224 , 0 , 0 ,
+ 0 , 226 , 0 , 0 ,
+ 0 , 229 , 0 , 0 ,
+ 0 , 231 , 0 , 0 ,
+ 0 , 232 , 0 , 0 ,
+ 0 , 235 , 0 , 0 ,
+ 0 , 237 , 0 , 0 ,
+ 0 , 239 , 0 , 0 ,
+ 0 , 242 , 0 , 0 ,
+ 0 , 243 , 0 , 0 ,
+ 0 , 245 , 0 , 0 ,
+ 0 , 248 , 0 , 0 ,
+ 0 , 250 , 0 , 0 ,
+ 0 , 251 , 0 , 0 ,
+ 0 , 253 , 0 , 0 ,
+ 0 , 255 , 0 , 0 ,
+ 1 , 0 , 0 , 0 ,
+ 1 , 3 , 0 , 0 ,
+ 1 , 6 , 0 , 0 ,
+ 1 , 9 , 0 , 0 ,
+ 1 , 12 , 0 , 0 ,
+ 1 , 15 , 0 , 0 ,
+ 1 , 19 , 0 , 0 ,
+ 1 , 22 , 0 , 0 ,
+ 1 , 25 , 0 , 0 ,
+ 1 , 28 , 0 , 0 ,
+ 1 , 31 , 0 , 0 ,
+ 1 , 35 , 0 , 0 ,
+ 1 , 38 , 0 , 0 ,
+ 1 , 41 , 0 , 0 ,
+ 1 , 44 , 0 , 0 ,
+ 1 , 47 , 0 , 0 ,
+ 1 , 51 , 0 , 0 ,
+ 1 , 54 , 0 , 0 ,
+ 1 , 57 , 0 , 0 ,
+ 1 , 60 , 0 , 0 ,
+ 1 , 63 , 0 , 0 ,
+ 1 , 66 , 0 , 0 ,
+ 1 , 70 , 0 , 0 ,
+ 1 , 73 , 0 , 0 ,
+ 1 , 76 , 0 , 0 ,
+ 1 , 79 , 0 , 0 ,
+ 1 , 82 , 0 , 0 ,
+ 1 , 86 , 0 , 0 ,
+ 1 , 89 , 0 , 0 ,
+ 1 , 92 , 0 , 0 ,
+ 1 , 95 , 0 , 0 ,
+ 1 , 98 , 0 , 0 ,
+ 1 , 102 , 0 , 0 ,
+ 1 , 105 , 0 , 0 ,
+ 1 , 108 , 0 , 0 ,
+ 1 , 111 , 0 , 0 ,
+ 1 , 114 , 0 , 0 ,
+ 1 , 117 , 0 , 0 ,
+ 1 , 121 , 0 , 0 ,
+ 1 , 124 , 0 , 0 ,
+ 1 , 127 , 0 , 0 ,
+ 1 , 130 , 0 , 0 ,
+ 1 , 133 , 0 , 0 ,
+ 1 , 137 , 0 , 0 ,
+ 1 , 140 , 0 , 0 ,
+ 1 , 143 , 0 , 0 ,
+ 1 , 146 , 0 , 0 ,
+ 1 , 149 , 0 , 0 ,
+ 1 , 153 , 0 , 0 ,
+ 1 , 156 , 0 , 0 ,
+ 1 , 159 , 0 , 0 ,
+ 1 , 162 , 0 , 0 ,
+ 1 , 165 , 0 , 0 ,
+ 1 , 168 , 0 , 0 ,
+ 1 , 172 , 0 , 0 ,
+ 1 , 175 , 0 , 0 ,
+ 1 , 178 , 0 , 0 ,
+ 1 , 181 , 0 , 0 ,
+ 1 , 184 , 0 , 0 ,
+ 1 , 188 , 0 , 0 ,
+ 1 , 191 , 0 , 0 ,
+ 1 , 194 , 0 , 0 ,
+ 1 , 197 , 0 , 0 ,
+ 1 , 200 , 0 , 0 ,
+ 1 , 204 , 0 , 0 ,
+ 1 , 207 , 0 , 0 ,
+ 1 , 210 , 0 , 0 ,
+ 1 , 213 , 0 , 0 ,
+ 1 , 216 , 0 , 0 ,
+ 1 , 219 , 0 , 0 ,
+ 1 , 223 , 0 , 0 ,
+ 1 , 226 , 0 , 0 ,
+ 1 , 229 , 0 , 0 ,
+ 1 , 232 , 0 , 0 ,
+ 1 , 235 , 0 , 0 ,
+ 1 , 239 , 0 , 0 ,
+ 1 , 242 , 0 , 0 ,
+ 1 , 245 , 0 , 0 ,
+ 1 , 248 , 0 , 0 ,
+ 1 , 251 , 0 , 0 ,
+ 2 , 0 , 0 , 0 ,
+ 2 , 15 , 0 , 0 ,
+ 2 , 31 , 0 , 0 ,
+ 2 , 47 , 0 , 0 ,
+ 2 , 63 , 0 , 0 ,
+ 2 , 79 , 0 , 0 ,
+ 2 , 95 , 0 , 0 ,
+ 2 , 111 , 0 , 0 ,
+ 2 , 127 , 0 , 0 ,
+ 2 , 143 , 0 , 0 ,
+ 2 , 159 , 0 , 0 ,
+ 2 , 175 , 0 , 0 ,
+ 2 , 191 , 0 , 0 ,
+ 2 , 207 , 0 , 0 ,
+ 2 , 223 , 0 , 0 ,
+ 2 , 239 , 0 , 0
+};
+
+unsigned char HT300x3004level970_open[1024] =
+{
+ 0 , 0 , 255 , 0 ,
+ 0 , 0 , 255 , 0 ,
+ 0 , 6 , 255 , 6 ,
+ 0 , 9 , 255 , 9 ,
+ 0 , 12 , 255 , 12 ,
+ 0 , 15 , 255 , 15 ,
+ 0 , 18 , 255 , 18 ,
+ 0 , 21 , 255 , 21 ,
+ 0 , 24 , 255 , 24 ,
+ 0 , 27 , 255 , 27 ,
+ 0 , 30 , 255 , 30 ,
+ 0 , 33 , 255 , 33 ,
+ 0 , 36 , 255 , 36 ,
+ 0 , 39 , 255 , 39 ,
+ 0 , 42 , 255 , 42 ,
+ 0 , 45 , 255 , 45 ,
+ 0 , 48 , 255 , 48 ,
+ 0 , 51 , 255 , 51 ,
+ 0 , 54 , 255 , 54 ,
+ 0 , 57 , 255 , 57 ,
+ 0 , 60 , 255 , 60 ,
+ 0 , 63 , 255 , 63 ,
+ 0 , 66 , 255 , 66 ,
+ 0 , 69 , 255 , 69 ,
+ 0 , 72 , 255 , 72 ,
+ 0 , 75 , 255 , 75 ,
+ 0 , 78 , 255 , 78 ,
+ 0 , 81 , 255 , 81 ,
+ 0 , 84 , 255 , 84 ,
+ 0 , 87 , 255 , 87 ,
+ 0 , 90 , 255 , 90 ,
+ 0 , 93 , 255 , 93 ,
+ 0 , 96 , 255 , 96 ,
+ 0 , 99 , 255 , 99 ,
+ 0 , 102 , 255 , 102 ,
+ 0 , 105 , 255 , 105 ,
+ 0 , 108 , 255 , 108 ,
+ 0 , 111 , 255 , 111 ,
+ 0 , 114 , 255 , 114 ,
+ 0 , 117 , 255 , 117 ,
+ 0 , 120 , 255 , 120 ,
+ 0 , 123 , 255 , 123 ,
+ 0 , 126 , 255 , 126 ,
+ 0 , 129 , 255 , 129 ,
+ 0 , 132 , 255 , 132 ,
+ 0 , 135 , 255 , 135 ,
+ 0 , 138 , 255 , 138 ,
+ 0 , 141 , 255 , 141 ,
+ 0 , 144 , 255 , 144 ,
+ 0 , 147 , 255 , 147 ,
+ 0 , 150 , 255 , 150 ,
+ 0 , 153 , 255 , 153 ,
+ 0 , 156 , 255 , 156 ,
+ 0 , 159 , 255 , 159 ,
+ 0 , 162 , 255 , 162 ,
+ 0 , 165 , 255 , 165 ,
+ 0 , 168 , 255 , 168 ,
+ 0 , 171 , 255 , 171 ,
+ 0 , 174 , 255 , 174 ,
+ 0 , 177 , 255 , 177 ,
+ 0 , 180 , 255 , 180 ,
+ 0 , 183 , 255 , 183 ,
+ 0 , 186 , 255 , 186 ,
+ 0 , 189 , 255 , 189 ,
+ 0 , 192 , 255 , 192 ,
+ 0 , 195 , 255 , 195 ,
+ 0 , 198 , 255 , 198 ,
+ 0 , 201 , 255 , 201 ,
+ 0 , 204 , 255 , 204 ,
+ 0 , 207 , 255 , 207 ,
+ 0 , 210 , 255 , 210 ,
+ 0 , 213 , 255 , 213 ,
+ 0 , 216 , 255 , 216 ,
+ 0 , 219 , 255 , 219 ,
+ 0 , 222 , 255 , 222 ,
+ 0 , 225 , 255 , 225 ,
+ 0 , 228 , 255 , 228 ,
+ 0 , 231 , 255 , 231 ,
+ 0 , 234 , 255 , 234 ,
+ 0 , 237 , 255 , 237 ,
+ 0 , 240 , 255 , 240 ,
+ 0 , 243 , 255 , 243 ,
+ 0 , 246 , 255 , 246 ,
+ 0 , 249 , 255 , 249 ,
+ 0 , 252 , 255 , 252 ,
+ 1 , 0 , 255 , 0 ,
+ 1 , 3 , 255 , 3 ,
+ 1 , 6 , 255 , 6 ,
+ 1 , 9 , 255 , 9 ,
+ 1 , 12 , 255 , 12 ,
+ 1 , 15 , 255 , 15 ,
+ 1 , 18 , 255 , 18 ,
+ 1 , 21 , 255 , 21 ,
+ 1 , 24 , 255 , 24 ,
+ 1 , 27 , 255 , 27 ,
+ 1 , 30 , 255 , 30 ,
+ 1 , 33 , 255 , 33 ,
+ 1 , 36 , 255 , 36 ,
+ 1 , 39 , 255 , 39 ,
+ 1 , 42 , 255 , 42 ,
+ 1 , 45 , 255 , 45 ,
+ 1 , 48 , 255 , 48 ,
+ 1 , 51 , 255 , 51 ,
+ 1 , 54 , 255 , 54 ,
+ 1 , 57 , 255 , 57 ,
+ 1 , 60 , 255 , 60 ,
+ 1 , 63 , 255 , 63 ,
+ 1 , 66 , 255 , 66 ,
+ 1 , 69 , 255 , 69 ,
+ 1 , 72 , 255 , 72 ,
+ 1 , 75 , 255 , 75 ,
+ 1 , 78 , 255 , 78 ,
+ 1 , 81 , 255 , 81 ,
+ 1 , 84 , 255 , 84 ,
+ 1 , 87 , 255 , 87 ,
+ 1 , 90 , 255 , 90 ,
+ 1 , 93 , 255 , 93 ,
+ 1 , 96 , 255 , 96 ,
+ 1 , 99 , 255 , 99 ,
+ 1 , 102 , 255 , 102 ,
+ 1 , 105 , 255 , 105 ,
+ 1 , 108 , 255 , 108 ,
+ 1 , 111 , 255 , 111 ,
+ 1 , 114 , 255 , 114 ,
+ 1 , 117 , 255 , 117 ,
+ 1 , 120 , 255 , 120 ,
+ 1 , 123 , 255 , 123 ,
+ 1 , 126 , 255 , 126 ,
+ 1 , 129 , 255 , 129 ,
+ 1 , 132 , 255 , 132 ,
+ 1 , 135 , 255 , 135 ,
+ 1 , 138 , 255 , 138 ,
+ 1 , 141 , 255 , 141 ,
+ 1 , 144 , 255 , 144 ,
+ 1 , 147 , 255 , 147 ,
+ 1 , 150 , 255 , 150 ,
+ 1 , 153 , 255 , 153 ,
+ 1 , 156 , 255 , 156 ,
+ 1 , 159 , 255 , 159 ,
+ 1 , 162 , 255 , 162 ,
+ 1 , 165 , 255 , 165 ,
+ 1 , 168 , 255 , 168 ,
+ 1 , 171 , 255 , 171 ,
+ 1 , 174 , 255 , 174 ,
+ 1 , 177 , 255 , 177 ,
+ 1 , 180 , 255 , 180 ,
+ 1 , 183 , 255 , 183 ,
+ 1 , 186 , 255 , 186 ,
+ 1 , 189 , 255 , 189 ,
+ 1 , 192 , 255 , 192 ,
+ 1 , 195 , 255 , 195 ,
+ 1 , 198 , 255 , 198 ,
+ 1 , 201 , 255 , 201 ,
+ 1 , 204 , 255 , 204 ,
+ 1 , 207 , 255 , 207 ,
+ 1 , 210 , 255 , 210 ,
+ 1 , 213 , 255 , 213 ,
+ 1 , 216 , 255 , 216 ,
+ 1 , 219 , 255 , 219 ,
+ 1 , 222 , 255 , 222 ,
+ 1 , 225 , 255 , 225 ,
+ 1 , 228 , 255 , 228 ,
+ 1 , 231 , 255 , 231 ,
+ 1 , 234 , 255 , 234 ,
+ 1 , 237 , 255 , 237 ,
+ 1 , 240 , 255 , 240 ,
+ 1 , 243 , 255 , 243 ,
+ 1 , 246 , 255 , 246 ,
+ 1 , 249 , 255 , 249 ,
+ 1 , 252 , 255 , 252 ,
+ 2 , 0 , 255 , 0 ,
+ 2 , 3 , 255 , 3 ,
+ 2 , 6 , 255 , 6 ,
+ 2 , 9 , 255 , 9 ,
+ 2 , 12 , 255 , 12 ,
+ 2 , 15 , 255 , 15 ,
+ 2 , 18 , 255 , 18 ,
+ 2 , 21 , 255 , 21 ,
+ 2 , 24 , 255 , 24 ,
+ 2 , 27 , 255 , 27 ,
+ 2 , 30 , 255 , 30 ,
+ 2 , 33 , 255 , 33 ,
+ 2 , 36 , 255 , 36 ,
+ 2 , 39 , 255 , 39 ,
+ 2 , 42 , 255 , 42 ,
+ 2 , 45 , 255 , 45 ,
+ 2 , 48 , 255 , 48 ,
+ 2 , 51 , 255 , 51 ,
+ 2 , 54 , 255 , 54 ,
+ 2 , 57 , 255 , 57 ,
+ 2 , 60 , 255 , 60 ,
+ 2 , 63 , 255 , 63 ,
+ 2 , 66 , 255 , 66 ,
+ 2 , 69 , 255 , 69 ,
+ 2 , 72 , 255 , 72 ,
+ 2 , 75 , 255 , 75 ,
+ 2 , 78 , 255 , 78 ,
+ 2 , 81 , 255 , 81 ,
+ 2 , 84 , 255 , 84 ,
+ 2 , 87 , 255 , 87 ,
+ 2 , 90 , 255 , 90 ,
+ 2 , 93 , 255 , 93 ,
+ 2 , 96 , 255 , 96 ,
+ 2 , 99 , 255 , 99 ,
+ 2 , 102 , 255 , 102 ,
+ 2 , 105 , 255 , 105 ,
+ 2 , 108 , 255 , 108 ,
+ 2 , 111 , 255 , 111 ,
+ 2 , 114 , 255 , 114 ,
+ 2 , 117 , 255 , 117 ,
+ 2 , 120 , 255 , 120 ,
+ 2 , 123 , 255 , 123 ,
+ 2 , 126 , 255 , 126 ,
+ 2 , 129 , 255 , 129 ,
+ 2 , 132 , 255 , 132 ,
+ 2 , 135 , 255 , 135 ,
+ 2 , 138 , 255 , 138 ,
+ 2 , 141 , 255 , 141 ,
+ 2 , 144 , 255 , 144 ,
+ 2 , 147 , 255 , 147 ,
+ 2 , 150 , 255 , 150 ,
+ 2 , 153 , 255 , 153 ,
+ 2 , 156 , 255 , 156 ,
+ 2 , 159 , 255 , 159 ,
+ 2 , 162 , 255 , 162 ,
+ 2 , 165 , 255 , 165 ,
+ 2 , 168 , 255 , 168 ,
+ 2 , 171 , 255 , 171 ,
+ 2 , 174 , 255 , 174 ,
+ 2 , 177 , 255 , 177 ,
+ 2 , 180 , 255 , 180 ,
+ 2 , 183 , 255 , 183 ,
+ 2 , 186 , 255 , 186 ,
+ 2 , 189 , 255 , 189 ,
+ 2 , 192 , 255 , 192 ,
+ 2 , 195 , 255 , 195 ,
+ 2 , 198 , 255 , 198 ,
+ 2 , 201 , 255 , 201 ,
+ 2 , 204 , 255 , 204 ,
+ 2 , 207 , 255 , 207 ,
+ 2 , 210 , 255 , 210 ,
+ 2 , 213 , 255 , 213 ,
+ 2 , 216 , 255 , 216 ,
+ 2 , 219 , 255 , 219 ,
+ 2 , 222 , 255 , 222 ,
+ 2 , 225 , 255 , 225 ,
+ 2 , 228 , 255 , 228 ,
+ 2 , 231 , 255 , 231 ,
+ 2 , 234 , 255 , 234 ,
+ 2 , 237 , 255 , 237 ,
+ 2 , 240 , 255 , 240 ,
+ 2 , 243 , 255 , 243 ,
+ 2 , 246 , 255 , 246 ,
+ 2 , 249 , 255 , 249 ,
+ 2 , 252 , 255 , 252 ,
+ 2 , 252 , 255 , 252
+};
+
+unsigned char HT600x6004level970_open[1024] =
+{
+0, 0, 255, 0,
+0, 1, 255, 0,
+0, 3, 255, 0,
+0, 5, 255, 0,
+0, 7, 255, 0,
+0, 9, 255, 0,
+0, 11, 255, 0,
+0, 13, 255, 0,
+0, 15, 255, 0,
+0, 17, 255, 0,
+0, 19, 255, 0,
+0, 21, 255, 0,
+0, 23, 255, 0,
+0, 25, 255, 0,
+0, 27, 255, 0,
+0, 29, 255, 0,
+0, 31, 255, 0,
+0, 33, 255, 0,
+0, 35, 255, 0,
+0, 37, 255, 0,
+0, 39, 255, 0,
+0, 41, 255, 0,
+0, 43, 255, 0,
+0, 45, 255, 0,
+0, 47, 255, 0,
+0, 49, 255, 0,
+0, 51, 255, 0,
+0, 53, 255, 0,
+0, 55, 255, 0,
+0, 57, 255, 0,
+0, 59, 255, 0,
+0, 61, 255, 0,
+0, 63, 255, 0,
+0, 65, 255, 0,
+0, 67, 255, 0,
+0, 69, 255, 0,
+0, 71, 255, 0,
+0, 73, 255, 0,
+0, 75, 255, 0,
+0, 77, 255, 0,
+0, 79, 255, 0,
+0, 81, 255, 0,
+0, 83, 255, 0,
+0, 85, 255, 0,
+0, 87, 255, 0,
+0, 89, 255, 0,
+0, 91, 255, 0,
+0, 93, 255, 0,
+0, 95, 255, 0,
+0, 97, 255, 0,
+0, 99, 255, 0,
+0, 101, 255, 0,
+0, 103, 255, 0,
+0, 105, 255, 0,
+0, 107, 255, 0,
+0, 109, 255, 0,
+0, 111, 255, 0,
+0, 113, 255, 0,
+0, 115, 255, 0,
+0, 117, 255, 0,
+0, 119, 255, 0,
+0, 121, 255, 0,
+0, 123, 255, 0,
+0, 125, 255, 0,
+0, 127, 255, 0,
+0, 129, 255, 0,
+0, 131, 255, 0,
+0, 133, 255, 0,
+0, 135, 255, 0,
+0, 137, 255, 0,
+0, 139, 255, 0,
+0, 141, 255, 0,
+0, 143, 255, 0,
+0, 145, 255, 0,
+0, 147, 255, 0,
+0, 149, 255, 0,
+0, 151, 255, 0,
+0, 153, 255, 0,
+0, 155, 255, 0,
+0, 157, 255, 0,
+0, 159, 255, 0,
+0, 161, 255, 0,
+0, 163, 255, 0,
+0, 165, 255, 0,
+0, 167, 255, 0,
+0, 169, 255, 0,
+0, 171, 255, 0,
+0, 173, 255, 0,
+0, 175, 255, 0,
+0, 177, 255, 0,
+0, 179, 255, 0,
+0, 181, 255, 0,
+0, 183, 255, 0,
+0, 185, 255, 0,
+0, 187, 255, 0,
+0, 189, 255, 0,
+0, 191, 255, 0,
+0, 193, 255, 0,
+0, 195, 255, 0,
+0, 197, 255, 0,
+0, 199, 255, 0,
+0, 201, 255, 0,
+0, 203, 255, 0,
+0, 205, 255, 0,
+0, 207, 255, 0,
+0, 209, 255, 0,
+0, 211, 255, 0,
+0, 213, 255, 0,
+0, 215, 255, 0,
+0, 217, 255, 0,
+0, 219, 255, 0,
+0, 221, 255, 0,
+0, 223, 255, 0,
+0, 225, 255, 0,
+0, 227, 255, 0,
+0, 229, 255, 0,
+0, 231, 255, 0,
+0, 233, 255, 0,
+0, 235, 255, 0,
+0, 237, 255, 0,
+0, 239, 255, 0,
+0, 241, 255, 0,
+0, 243, 255, 0,
+0, 245, 255, 0,
+0, 247, 255, 0,
+0, 249, 255, 0,
+0, 251, 255, 0,
+0, 253, 255, 0,
+0, 255, 255, 0,
+1, 3, 255, 0,
+1, 7, 255, 0,
+1, 11, 255, 0,
+1, 15, 255, 0,
+1, 19, 255, 0,
+1, 23, 255, 0,
+1, 27, 255, 0,
+1, 31, 255, 0,
+1, 35, 255, 0,
+1, 39, 255, 0,
+1, 43, 255, 0,
+1, 47, 255, 0,
+1, 51, 255, 0,
+1, 55, 255, 0,
+1, 59, 255, 0,
+1, 63, 255, 0,
+1, 67, 255, 0,
+1, 71, 255, 0,
+1, 75, 255, 0,
+1, 79, 255, 0,
+1, 83, 255, 0,
+1, 87, 255, 0,
+1, 91, 255, 0,
+1, 95, 255, 0,
+1, 99, 255, 0,
+1, 103, 255, 0,
+1, 107, 255, 0,
+1, 111, 255, 0,
+1, 115, 255, 0,
+1, 119, 255, 0,
+1, 123, 255, 0,
+1, 127, 255, 0,
+1, 131, 255, 0,
+1, 135, 255, 0,
+1, 139, 255, 0,
+1, 143, 255, 0,
+1, 147, 255, 0,
+1, 151, 255, 0,
+1, 155, 255, 0,
+1, 159, 255, 0,
+1, 163, 255, 0,
+1, 167, 255, 0,
+1, 171, 255, 0,
+1, 175, 255, 0,
+1, 179, 255, 0,
+1, 183, 255, 0,
+1, 187, 255, 0,
+1, 191, 255, 0,
+1, 195, 255, 0,
+1, 199, 255, 0,
+1, 203, 255, 0,
+1, 207, 255, 0,
+1, 211, 255, 0,
+1, 215, 255, 0,
+1, 219, 255, 0,
+1, 223, 255, 0,
+1, 227, 255, 0,
+1, 231, 255, 0,
+1, 235, 255, 0,
+1, 239, 255, 0,
+1, 243, 255, 0,
+1, 247, 255, 0,
+1, 251, 255, 0,
+1, 255, 255, 0,
+2, 4, 255, 0,
+2, 8, 255, 0,
+2, 12, 255, 0,
+2, 16, 255, 0,
+2, 20, 255, 0,
+2, 24, 255, 0,
+2, 28, 255, 0,
+2, 32, 255, 0,
+2, 36, 255, 0,
+2, 40, 255, 0,
+2, 44, 255, 0,
+2, 48, 255, 0,
+2, 52, 255, 0,
+2, 56, 255, 0,
+2, 60, 255, 0,
+2, 64, 255, 0,
+2, 68, 255, 0,
+2, 72, 255, 0,
+2, 76, 255, 0,
+2, 80, 255, 0,
+2, 85, 255, 0,
+2, 89, 255, 0,
+2, 93, 255, 0,
+2, 97, 255, 0,
+2, 101, 255, 0,
+2, 105, 255, 0,
+2, 109, 255, 0,
+2, 113, 255, 0,
+2, 117, 255, 0,
+2, 121, 255, 0,
+2, 125, 255, 0,
+2, 129, 255, 0,
+2, 133, 255, 0,
+2, 137, 255, 0,
+2, 141, 255, 0,
+2, 145, 255, 0,
+2, 149, 255, 0,
+2, 153, 255, 0,
+2, 157, 255, 0,
+2, 161, 255, 0,
+2, 165, 255, 0,
+2, 170, 255, 0,
+2, 174, 255, 0,
+2, 178, 255, 0,
+2, 182, 255, 0,
+2, 186, 255, 0,
+2, 190, 255, 0,
+2, 194, 255, 0,
+2, 198, 255, 0,
+2, 202, 255, 0,
+2, 206, 255, 0,
+2, 210, 255, 0,
+2, 214, 255, 0,
+2, 218, 255, 0,
+2, 222, 255, 0,
+2, 226, 255, 0,
+2, 230, 255, 0,
+2, 234, 255, 0,
+2, 238, 255, 0,
+2, 242, 255, 0,
+2, 246, 255, 0,
+2, 250, 255, 0,
+2, 255, 255, 0
+};
+
+unsigned char HT600x6004level3600_open[1024] =
+{
+ 0, 0, 255, 0,
+ 0, 1, 255, 1,
+ 0, 2, 255, 2,
+ 0, 3, 255, 4,
+ 0, 5, 255, 5,
+ 0, 6, 255, 6,
+ 0, 7, 255, 8,
+ 0, 9, 255, 9,
+ 0, 10, 255, 10,
+ 0, 11, 255, 12,
+ 0, 13, 255, 13,
+ 0, 14, 255, 14,
+ 0, 15, 255, 16,
+ 0, 17, 255, 17,
+ 0, 18, 255, 18,
+ 0, 19, 255, 20,
+ 0, 21, 255, 21,
+ 0, 22, 255, 22,
+ 0, 23, 255, 24,
+ 0, 25, 255, 25,
+ 0, 26, 255, 26,
+ 0, 27, 255, 28,
+ 0, 29, 255, 29,
+ 0, 30, 255, 30,
+ 0, 31, 255, 32,
+ 0, 33, 255, 33,
+ 0, 34, 255, 34,
+ 0, 35, 255, 36,
+ 0, 37, 255, 37,
+ 0, 38, 255, 38,
+ 0, 39, 255, 40,
+ 0, 41, 255, 41,
+ 0, 42, 255, 42,
+ 0, 43, 255, 44,
+ 0, 45, 255, 45,
+ 0, 46, 255, 46,
+ 0, 47, 255, 48,
+ 0, 49, 255, 49,
+ 0, 50, 255, 50,
+ 0, 51, 255, 52,
+ 0, 53, 255, 53,
+ 0, 54, 255, 54,
+ 0, 55, 255, 56,
+ 0, 57, 255, 57,
+ 0, 58, 255, 58,
+ 0, 59, 255, 60,
+ 0, 61, 255, 61,
+ 0, 62, 255, 62,
+ 0, 63, 255, 64,
+ 0, 65, 255, 65,
+ 0, 66, 255, 66,
+ 0, 67, 255, 68,
+ 0, 69, 255, 69,
+ 0, 70, 255, 70,
+ 0, 71, 255, 72,
+ 0, 73, 255, 73,
+ 0, 74, 255, 74,
+ 0, 75, 255, 76,
+ 0, 77, 255, 77,
+ 0, 78, 255, 78,
+ 0, 79, 255, 80,
+ 0, 81, 255, 81,
+ 0, 82, 255, 82,
+ 0, 83, 255, 84,
+ 0, 85, 255, 85,
+ 0, 86, 255, 86,
+ 0, 87, 255, 87,
+ 0, 88, 255, 89,
+ 0, 90, 255, 90,
+ 0, 91, 255, 91,
+ 0, 92, 255, 93,
+ 0, 94, 255, 94,
+ 0, 95, 255, 95,
+ 0, 96, 255, 97,
+ 0, 98, 255, 98,
+ 0, 99, 255, 99,
+ 0, 100, 255, 101,
+ 0, 102, 255, 102,
+ 0, 103, 255, 103,
+ 0, 104, 255, 105,
+ 0, 106, 255, 106,
+ 0, 107, 255, 107,
+ 0, 108, 255, 109,
+ 0, 110, 255, 110,
+ 0, 111, 255, 111,
+ 0, 112, 255, 113,
+ 0, 114, 255, 114,
+ 0, 115, 255, 115,
+ 0, 116, 255, 117,
+ 0, 118, 255, 118,
+ 0, 119, 255, 119,
+ 0, 120, 255, 121,
+ 0, 122, 255, 122,
+ 0, 123, 255, 123,
+ 0, 124, 255, 125,
+ 0, 126, 255, 126,
+ 0, 127, 255, 127,
+ 0, 128, 255, 129,
+ 0, 130, 255, 130,
+ 0, 131, 255, 131,
+ 0, 132, 255, 133,
+ 0, 134, 255, 134,
+ 0, 135, 255, 135,
+ 0, 136, 255, 137,
+ 0, 138, 255, 138,
+ 0, 139, 255, 139,
+ 0, 140, 255, 141,
+ 0, 142, 255, 142,
+ 0, 143, 255, 143,
+ 0, 144, 255, 145,
+ 0, 146, 255, 146,
+ 0, 147, 255, 147,
+ 0, 148, 255, 149,
+ 0, 150, 255, 150,
+ 0, 151, 255, 151,
+ 0, 152, 255, 153,
+ 0, 154, 255, 154,
+ 0, 155, 255, 155,
+ 0, 156, 255, 157,
+ 0, 158, 255, 158,
+ 0, 159, 255, 159,
+ 0, 160, 255, 161,
+ 0, 162, 255, 162,
+ 0, 163, 255, 163,
+ 0, 164, 255, 165,
+ 0, 166, 255, 166,
+ 0, 167, 255, 167,
+ 0, 168, 255, 169,
+ 0, 170, 255, 170,
+ 0, 171, 255, 171,
+ 0, 172, 255, 172,
+ 0, 173, 255, 174,
+ 0, 175, 255, 175,
+ 0, 176, 255, 176,
+ 0, 177, 255, 178,
+ 0, 179, 255, 179,
+ 0, 180, 255, 180,
+ 0, 181, 255, 182,
+ 0, 183, 255, 183,
+ 0, 184, 255, 184,
+ 0, 185, 255, 186,
+ 0, 187, 255, 187,
+ 0, 188, 255, 188,
+ 0, 189, 255, 190,
+ 0, 191, 255, 191,
+ 0, 192, 255, 192,
+ 0, 193, 255, 194,
+ 0, 195, 255, 195,
+ 0, 196, 255, 196,
+ 0, 197, 255, 198,
+ 0, 199, 255, 199,
+ 0, 200, 255, 200,
+ 0, 201, 255, 202,
+ 0, 203, 255, 203,
+ 0, 204, 255, 204,
+ 0, 205, 255, 206,
+ 0, 207, 255, 207,
+ 0, 208, 255, 208,
+ 0, 209, 255, 210,
+ 0, 211, 255, 211,
+ 0, 212, 255, 212,
+ 0, 213, 255, 214,
+ 0, 215, 255, 215,
+ 0, 216, 255, 216,
+ 0, 217, 255, 218,
+ 0, 219, 255, 219,
+ 0, 220, 255, 220,
+ 0, 221, 255, 222,
+ 0, 223, 255, 223,
+ 0, 224, 255, 224,
+ 0, 225, 255, 226,
+ 0, 227, 255, 227,
+ 0, 228, 255, 228,
+ 0, 229, 255, 230,
+ 0, 231, 255, 231,
+ 0, 232, 255, 232,
+ 0, 233, 255, 234,
+ 0, 235, 255, 235,
+ 0, 236, 255, 236,
+ 0, 237, 255, 238,
+ 0, 239, 255, 239,
+ 0, 240, 255, 240,
+ 0, 241, 255, 242,
+ 0, 243, 255, 243,
+ 0, 244, 255, 244,
+ 0, 245, 255, 246,
+ 0, 247, 255, 247,
+ 0, 248, 255, 248,
+ 0, 249, 255, 250,
+ 0, 251, 255, 251,
+ 0, 252, 255, 252,
+ 0, 253, 255, 254,
+ 0, 255, 255, 255,
+ 1, 4, 255, 7,
+ 1, 8, 255, 11,
+ 1, 12, 255, 15,
+ 1, 16, 255, 19,
+ 1, 20, 255, 23,
+ 1, 24, 255, 27,
+ 1, 28, 255, 31,
+ 1, 32, 255, 35,
+ 1, 36, 255, 39,
+ 1, 40, 255, 43,
+ 1, 44, 255, 47,
+ 1, 48, 255, 51,
+ 1, 52, 255, 55,
+ 1, 56, 255, 59,
+ 1, 60, 255, 63,
+ 1, 64, 255, 67,
+ 1, 68, 255, 71,
+ 1, 72, 255, 75,
+ 1, 76, 255, 79,
+ 1, 80, 255, 84,
+ 1, 85, 255, 88,
+ 1, 89, 255, 92,
+ 1, 93, 255, 96,
+ 1, 97, 255, 100,
+ 1, 101, 255, 104,
+ 1, 105, 255, 108,
+ 1, 109, 255, 112,
+ 1, 113, 255, 116,
+ 1, 117, 255, 120,
+ 1, 121, 255, 124,
+ 1, 125, 255, 128,
+ 1, 129, 255, 132,
+ 1, 133, 255, 136,
+ 1, 137, 255, 140,
+ 1, 141, 255, 144,
+ 1, 145, 255, 148,
+ 1, 149, 255, 152,
+ 1, 153, 255, 156,
+ 1, 157, 255, 160,
+ 1, 161, 255, 164,
+ 1, 165, 255, 169,
+ 1, 170, 255, 173,
+ 1, 174, 255, 177,
+ 1, 178, 255, 181,
+ 1, 182, 255, 185,
+ 1, 186, 255, 189,
+ 1, 190, 255, 193,
+ 1, 194, 255, 197,
+ 1, 198, 255, 201,
+ 1, 202, 255, 205,
+ 1, 206, 255, 209,
+ 1, 210, 255, 213,
+ 1, 214, 255, 217,
+ 1, 218, 255, 221,
+ 1, 222, 255, 225,
+ 1, 226, 255, 229,
+ 1, 230, 255, 233,
+ 1, 234, 255, 237,
+ 1, 238, 255, 241,
+ 1, 242, 255, 245,
+ 1, 246, 255, 249,
+ 1, 250, 255, 254,
+ 1, 255, 255, 255
+};
+
+unsigned char HT1200x1200x1_PhotoPres970_open[1024] =
+{
+ 0 , 0 , 0 , 0 ,
+ 0 , 0 , 0 , 0 ,
+ 0 , 1 , 0 , 0 ,
+ 0 , 1 , 0 , 0 ,
+ 0 , 2 , 0 , 0 ,
+ 0 , 2 , 0 , 0 ,
+ 0 , 3 , 0 , 0 ,
+ 0 , 3 , 0 , 0 ,
+ 0 , 4 , 0 , 0 ,
+ 0 , 4 , 0 , 0 ,
+ 0 , 5 , 0 , 0 ,
+ 0 , 5 , 0 , 0 ,
+ 0 , 6 , 0 , 0 ,
+ 0 , 6 , 0 , 0 ,
+ 0 , 7 , 0 , 0 ,
+ 0 , 7 , 0 , 0 ,
+ 0 , 8 , 0 , 0 ,
+ 0 , 8 , 0 , 0 ,
+ 0 , 9 , 0 , 0 ,
+ 0 , 9 , 0 , 0 ,
+ 0 , 10 , 0 , 0 ,
+ 0 , 10 , 0 , 0 ,
+ 0 , 11 , 0 , 0 ,
+ 0 , 11 , 0 , 0 ,
+ 0 , 12 , 0 , 0 ,
+ 0 , 12 , 0 , 0 ,
+ 0 , 13 , 0 , 0 ,
+ 0 , 13 , 0 , 0 ,
+ 0 , 14 , 0 , 0 ,
+ 0 , 14 , 0 , 0 ,
+ 0 , 15 , 0 , 0 ,
+ 0 , 15 , 0 , 0 ,
+ 0 , 16 , 0 , 0 ,
+ 0 , 16 , 0 , 0 ,
+ 0 , 17 , 0 , 0 ,
+ 0 , 17 , 0 , 0 ,
+ 0 , 18 , 0 , 0 ,
+ 0 , 18 , 0 , 0 ,
+ 0 , 19 , 0 , 0 ,
+ 0 , 19 , 0 , 0 ,
+ 0 , 20 , 0 , 0 ,
+ 0 , 20 , 0 , 0 ,
+ 0 , 21 , 0 , 0 ,
+ 0 , 21 , 0 , 0 ,
+ 0 , 22 , 0 , 0 ,
+ 0 , 22 , 0 , 0 ,
+ 0 , 23 , 0 , 0 ,
+ 0 , 23 , 0 , 0 ,
+ 0 , 24 , 0 , 0 ,
+ 0 , 24 , 0 , 0 ,
+ 0 , 25 , 0 , 0 ,
+ 0 , 25 , 0 , 0 ,
+ 0 , 26 , 0 , 0 ,
+ 0 , 26 , 0 , 0 ,
+ 0 , 27 , 0 , 0 ,
+ 0 , 27 , 0 , 0 ,
+ 0 , 28 , 0 , 0 ,
+ 0 , 28 , 0 , 0 ,
+ 0 , 29 , 0 , 0 ,
+ 0 , 29 , 0 , 0 ,
+ 0 , 30 , 0 , 0 ,
+ 0 , 30 , 0 , 0 ,
+ 0 , 31 , 0 , 0 ,
+ 0 , 31 , 0 , 0 ,
+ 0 , 32 , 0 , 0 ,
+ 0 , 32 , 0 , 0 ,
+ 0 , 33 , 0 , 0 ,
+ 0 , 33 , 0 , 0 ,
+ 0 , 34 , 0 , 0 ,
+ 0 , 34 , 0 , 0 ,
+ 0 , 35 , 0 , 0 ,
+ 0 , 35 , 0 , 0 ,
+ 0 , 36 , 0 , 0 ,
+ 0 , 36 , 0 , 0 ,
+ 0 , 37 , 0 , 0 ,
+ 0 , 37 , 0 , 0 ,
+ 0 , 38 , 0 , 0 ,
+ 0 , 38 , 0 , 0 ,
+ 0 , 39 , 0 , 0 ,
+ 0 , 39 , 0 , 0 ,
+ 0 , 40 , 0 , 0 ,
+ 0 , 40 , 0 , 0 ,
+ 0 , 41 , 0 , 0 ,
+ 0 , 41 , 0 , 0 ,
+ 0 , 42 , 0 , 0 ,
+ 0 , 42 , 0 , 0 ,
+ 0 , 43 , 0 , 0 ,
+ 0 , 43 , 0 , 0 ,
+ 0 , 44 , 0 , 0 ,
+ 0 , 44 , 0 , 0 ,
+ 0 , 45 , 0 , 0 ,
+ 0 , 45 , 0 , 0 ,
+ 0 , 46 , 0 , 0 ,
+ 0 , 46 , 0 , 0 ,
+ 0 , 47 , 0 , 0 ,
+ 0 , 47 , 0 , 0 ,
+ 0 , 48 , 0 , 0 ,
+ 0 , 48 , 0 , 0 ,
+ 0 , 49 , 0 , 0 ,
+ 0 , 49 , 0 , 0 ,
+ 0 , 50 , 0 , 0 ,
+ 0 , 50 , 0 , 0 ,
+ 0 , 51 , 0 , 0 ,
+ 0 , 51 , 0 , 0 ,
+ 0 , 52 , 0 , 0 ,
+ 0 , 52 , 0 , 0 ,
+ 0 , 53 , 0 , 0 ,
+ 0 , 53 , 0 , 0 ,
+ 0 , 54 , 0 , 0 ,
+ 0 , 54 , 0 , 0 ,
+ 0 , 55 , 0 , 0 ,
+ 0 , 55 , 0 , 0 ,
+ 0 , 56 , 0 , 0 ,
+ 0 , 56 , 0 , 0 ,
+ 0 , 57 , 0 , 0 ,
+ 0 , 57 , 0 , 0 ,
+ 0 , 58 , 0 , 0 ,
+ 0 , 58 , 0 , 0 ,
+ 0 , 59 , 0 , 0 ,
+ 0 , 59 , 0 , 0 ,
+ 0 , 60 , 0 , 0 ,
+ 0 , 60 , 0 , 0 ,
+ 0 , 61 , 0 , 0 ,
+ 0 , 61 , 0 , 0 ,
+ 0 , 62 , 0 , 0 ,
+ 0 , 62 , 0 , 0 ,
+ 0 , 63 , 0 , 0 ,
+ 0 , 63 , 0 , 0 ,
+ 0 , 64 , 0 , 0 ,
+ 0 , 64 , 0 , 0 ,
+ 0 , 65 , 0 , 0 ,
+ 0 , 65 , 0 , 0 ,
+ 0 , 66 , 0 , 0 ,
+ 0 , 66 , 0 , 0 ,
+ 0 , 67 , 0 , 0 ,
+ 0 , 67 , 0 , 0 ,
+ 0 , 68 , 0 , 0 ,
+ 0 , 68 , 0 , 0 ,
+ 0 , 69 , 0 , 0 ,
+ 0 , 69 , 0 , 0 ,
+ 0 , 70 , 0 , 0 ,
+ 0 , 70 , 0 , 0 ,
+ 0 , 71 , 0 , 0 ,
+ 0 , 71 , 0 , 0 ,
+ 0 , 72 , 0 , 0 ,
+ 0 , 72 , 0 , 0 ,
+ 0 , 73 , 0 , 0 ,
+ 0 , 73 , 0 , 0 ,
+ 0 , 74 , 0 , 0 ,
+ 0 , 74 , 0 , 0 ,
+ 0 , 75 , 0 , 0 ,
+ 0 , 75 , 0 , 0 ,
+ 0 , 76 , 0 , 0 ,
+ 0 , 76 , 0 , 0 ,
+ 0 , 77 , 0 , 0 ,
+ 0 , 77 , 0 , 0 ,
+ 0 , 78 , 0 , 0 ,
+ 0 , 78 , 0 , 0 ,
+ 0 , 79 , 0 , 0 ,
+ 0 , 79 , 0 , 0 ,
+ 0 , 80 , 0 , 0 ,
+ 0 , 80 , 0 , 0 ,
+ 0 , 81 , 0 , 0 ,
+ 0 , 81 , 0 , 0 ,
+ 0 , 82 , 0 , 0 ,
+ 0 , 82 , 0 , 0 ,
+ 0 , 83 , 0 , 0 ,
+ 0 , 83 , 0 , 0 ,
+ 0 , 84 , 0 , 0 ,
+ 0 , 84 , 0 , 0 ,
+ 0 , 85 , 0 , 0 ,
+ 0 , 85 , 0 , 0 ,
+ 0 , 86 , 0 , 0 ,
+ 0 , 86 , 0 , 0 ,
+ 0 , 87 , 0 , 0 ,
+ 0 , 87 , 0 , 0 ,
+ 0 , 88 , 0 , 0 ,
+ 0 , 88 , 0 , 0 ,
+ 0 , 89 , 0 , 0 ,
+ 0 , 89 , 0 , 0 ,
+ 0 , 90 , 0 , 0 ,
+ 0 , 90 , 0 , 0 ,
+ 0 , 91 , 0 , 0 ,
+ 0 , 91 , 0 , 0 ,
+ 0 , 92 , 0 , 0 ,
+ 0 , 92 , 0 , 0 ,
+ 0 , 93 , 0 , 0 ,
+ 0 , 93 , 0 , 0 ,
+ 0 , 94 , 0 , 0 ,
+ 0 , 94 , 0 , 0 ,
+ 0 , 95 , 0 , 0 ,
+ 0 , 95 , 0 , 0 ,
+ 0 , 96 , 0 , 0 ,
+ 0 , 96 , 0 , 0 ,
+ 0 , 97 , 0 , 0 ,
+ 0 , 97 , 0 , 0 ,
+ 0 , 98 , 0 , 0 ,
+ 0 , 98 , 0 , 0 ,
+ 0 , 99 , 0 , 0 ,
+ 0 , 99 , 0 , 0 ,
+ 0 , 100 , 0 , 0 ,
+ 0 , 100 , 0 , 0 ,
+ 0 , 101 , 0 , 0 ,
+ 0 , 101 , 0 , 0 ,
+ 0 , 102 , 0 , 0 ,
+ 0 , 102 , 0 , 0 ,
+ 0 , 103 , 0 , 0 ,
+ 0 , 103 , 0 , 0 ,
+ 0 , 104 , 0 , 0 ,
+ 0 , 104 , 0 , 0 ,
+ 0 , 105 , 0 , 0 ,
+ 0 , 105 , 0 , 0 ,
+ 0 , 106 , 0 , 0 ,
+ 0 , 106 , 0 , 0 ,
+ 0 , 107 , 0 , 0 ,
+ 0 , 107 , 0 , 0 ,
+ 0 , 108 , 0 , 0 ,
+ 0 , 108 , 0 , 0 ,
+ 0 , 109 , 0 , 0 ,
+ 0 , 109 , 0 , 0 ,
+ 0 , 110 , 0 , 0 ,
+ 0 , 110 , 0 , 0 ,
+ 0 , 111 , 0 , 0 ,
+ 0 , 111 , 0 , 0 ,
+ 0 , 112 , 0 , 0 ,
+ 0 , 112 , 0 , 0 ,
+ 0 , 113 , 0 , 0 ,
+ 0 , 113 , 0 , 0 ,
+ 0 , 114 , 0 , 0 ,
+ 0 , 114 , 0 , 0 ,
+ 0 , 115 , 0 , 0 ,
+ 0 , 115 , 0 , 0 ,
+ 0 , 116 , 0 , 0 ,
+ 0 , 116 , 0 , 0 ,
+ 0 , 117 , 0 , 0 ,
+ 0 , 117 , 0 , 0 ,
+ 0 , 118 , 0 , 0 ,
+ 0 , 118 , 0 , 0 ,
+ 0 , 119 , 0 , 0 ,
+ 0 , 119 , 0 , 0 ,
+ 0 , 120 , 0 , 0 ,
+ 0 , 120 , 0 , 0 ,
+ 0 , 121 , 0 , 0 ,
+ 0 , 121 , 0 , 0 ,
+ 0 , 122 , 0 , 0 ,
+ 0 , 122 , 0 , 0 ,
+ 0 , 123 , 0 , 0 ,
+ 0 , 123 , 0 , 0 ,
+ 0 , 124 , 0 , 0 ,
+ 0 , 124 , 0 , 0 ,
+ 0 , 125 , 0 , 0 ,
+ 0 , 125 , 0 , 0 ,
+ 0 , 126 , 0 , 0 ,
+ 0 , 126 , 0 , 0 ,
+ 0 , 127 , 0 , 0 ,
+ 0 , 127 , 0 , 0
+};
+
+unsigned char HT600x600x4_Pres970_open[1024] =
+{
+ 0, 0, 255, 0,
+ 0, 1, 255, 2,
+ 0, 3, 255, 3,
+ 0, 4, 255, 5,
+ 0, 6, 255, 6,
+ 0, 7, 255, 8,
+ 0, 9, 255, 10,
+ 0, 11, 255, 11,
+ 0, 12, 255, 13,
+ 0, 14, 255, 14,
+ 0, 15, 255, 16,
+ 0, 17, 255, 18,
+ 0, 19, 255, 19,
+ 0, 20, 255, 21,
+ 0, 22, 255, 22,
+ 0, 23, 255, 24,
+ 0, 25, 255, 26,
+ 0, 27, 255, 27,
+ 0, 28, 255, 29,
+ 0, 30, 255, 30,
+ 0, 31, 255, 32,
+ 0, 33, 255, 34,
+ 0, 35, 255, 35,
+ 0, 36, 255, 37,
+ 0, 38, 255, 38,
+ 0, 39, 255, 40,
+ 0, 41, 255, 42,
+ 0, 43, 255, 43,
+ 0, 44, 255, 45,
+ 0, 46, 255, 46,
+ 0, 47, 255, 48,
+ 0, 49, 255, 50,
+ 0, 51, 255, 51,
+ 0, 52, 255, 53,
+ 0, 54, 255, 54,
+ 0, 55, 255, 56,
+ 0, 57, 255, 57,
+ 0, 58, 255, 59,
+ 0, 60, 255, 61,
+ 0, 62, 255, 62,
+ 0, 63, 255, 64,
+ 0, 65, 255, 65,
+ 0, 66, 255, 67,
+ 0, 68, 255, 69,
+ 0, 70, 255, 70,
+ 0, 71, 255, 72,
+ 0, 73, 255, 73,
+ 0, 74, 255, 75,
+ 0, 76, 255, 77,
+ 0, 78, 255, 78,
+ 0, 79, 255, 80,
+ 0, 81, 255, 81,
+ 0, 82, 255, 83,
+ 0, 84, 255, 85,
+ 0, 86, 255, 86,
+ 0, 87, 255, 88,
+ 0, 89, 255, 89,
+ 0, 90, 255, 91,
+ 0, 92, 255, 93,
+ 0, 94, 255, 94,
+ 0, 95, 255, 96,
+ 0, 97, 255, 97,
+ 0, 98, 255, 99,
+ 0, 100, 255, 101,
+ 0, 102, 255, 102,
+ 0, 103, 255, 104,
+ 0, 105, 255, 105,
+ 0, 106, 255, 107,
+ 0, 108, 255, 108,
+ 0, 109, 255, 110,
+ 0, 111, 255, 112,
+ 0, 113, 255, 113,
+ 0, 114, 255, 115,
+ 0, 116, 255, 116,
+ 0, 117, 255, 118,
+ 0, 119, 255, 120,
+ 0, 121, 255, 121,
+ 0, 122, 255, 123,
+ 0, 124, 255, 124,
+ 0, 125, 255, 126,
+ 0, 127, 255, 128,
+ 0, 129, 255, 129,
+ 0, 130, 255, 131,
+ 0, 132, 255, 132,
+ 0, 133, 255, 134,
+ 0, 135, 255, 136,
+ 0, 137, 255, 137,
+ 0, 138, 255, 139,
+ 0, 140, 255, 140,
+ 0, 141, 255, 142,
+ 0, 143, 255, 144,
+ 0, 145, 255, 145,
+ 0, 146, 255, 147,
+ 0, 148, 255, 148,
+ 0, 149, 255, 150,
+ 0, 151, 255, 152,
+ 0, 153, 255, 153,
+ 0, 154, 255, 155,
+ 0, 156, 255, 156,
+ 0, 157, 255, 158,
+ 0, 159, 255, 159,
+ 0, 160, 255, 161,
+ 0, 162, 255, 163,
+ 0, 164, 255, 164,
+ 0, 165, 255, 166,
+ 0, 167, 255, 167,
+ 0, 168, 255, 169,
+ 0, 170, 255, 171,
+ 0, 172, 255, 172,
+ 0, 173, 255, 174,
+ 0, 175, 255, 175,
+ 0, 176, 255, 177,
+ 0, 178, 255, 179,
+ 0, 180, 255, 180,
+ 0, 181, 255, 182,
+ 0, 183, 255, 183,
+ 0, 184, 255, 185,
+ 0, 186, 255, 187,
+ 0, 188, 255, 188,
+ 0, 189, 255, 190,
+ 0, 191, 255, 191,
+ 0, 192, 255, 193,
+ 0, 194, 255, 195,
+ 0, 196, 255, 196,
+ 0, 197, 255, 198,
+ 0, 199, 255, 199,
+ 0, 200, 255, 201,
+ 0, 202, 255, 203,
+ 0, 204, 255, 204,
+ 0, 205, 255, 206,
+ 0, 207, 255, 207,
+ 0, 208, 255, 209,
+ 0, 210, 255, 210,
+ 0, 211, 255, 212,
+ 0, 213, 255, 214,
+ 0, 215, 255, 215,
+ 0, 216, 255, 217,
+ 0, 218, 255, 218,
+ 0, 219, 255, 220,
+ 0, 221, 255, 222,
+ 0, 223, 255, 223,
+ 0, 224, 255, 225,
+ 0, 226, 255, 226,
+ 0, 227, 255, 228,
+ 0, 229, 255, 230,
+ 0, 231, 255, 231,
+ 0, 232, 255, 233,
+ 0, 234, 255, 234,
+ 0, 235, 255, 236,
+ 0, 237, 255, 238,
+ 0, 239, 255, 239,
+ 0, 240, 255, 241,
+ 0, 242, 255, 242,
+ 0, 243, 255, 244,
+ 0, 245, 255, 246,
+ 0, 247, 255, 247,
+ 0, 248, 255, 249,
+ 0, 250, 255, 250,
+ 0, 251, 255, 252,
+ 0, 253, 255, 254,
+ 0, 255, 255, 255,
+ 1, 3, 255, 6,
+ 1, 7, 255, 10,
+ 1, 11, 255, 14,
+ 1, 15, 255, 18,
+ 1, 19, 255, 22,
+ 1, 23, 255, 26,
+ 1, 27, 255, 30,
+ 1, 31, 255, 34,
+ 1, 35, 255, 38,
+ 1, 39, 255, 42,
+ 1, 43, 255, 46,
+ 1, 47, 255, 50,
+ 1, 51, 255, 54,
+ 1, 55, 255, 58,
+ 1, 59, 255, 62,
+ 1, 63, 255, 66,
+ 1, 67, 255, 70,
+ 1, 71, 255, 74,
+ 1, 75, 255, 78,
+ 1, 79, 255, 82,
+ 1, 83, 255, 86,
+ 1, 87, 255, 90,
+ 1, 91, 255, 94,
+ 1, 95, 255, 98,
+ 1, 99, 255, 102,
+ 1, 103, 255, 106,
+ 1, 107, 255, 110,
+ 1, 111, 255, 114,
+ 1, 115, 255, 118,
+ 1, 119, 255, 122,
+ 1, 123, 255, 126,
+ 1, 127, 255, 130,
+ 1, 131, 255, 134,
+ 1, 135, 255, 138,
+ 1, 139, 255, 142,
+ 1, 143, 255, 146,
+ 1, 147, 255, 150,
+ 1, 151, 255, 154,
+ 1, 155, 255, 158,
+ 1, 159, 255, 162,
+ 1, 163, 255, 166,
+ 1, 167, 255, 170,
+ 1, 171, 255, 174,
+ 1, 175, 255, 178,
+ 1, 179, 255, 182,
+ 1, 183, 255, 186,
+ 1, 187, 255, 190,
+ 1, 191, 255, 194,
+ 1, 195, 255, 198,
+ 1, 199, 255, 202,
+ 1, 203, 255, 206,
+ 1, 207, 255, 210,
+ 1, 211, 255, 214,
+ 1, 215, 255, 218,
+ 1, 219, 255, 222,
+ 1, 223, 255, 226,
+ 1, 227, 255, 230,
+ 1, 231, 255, 234,
+ 1, 235, 255, 238,
+ 1, 239, 255, 242,
+ 1, 243, 255, 246,
+ 1, 247, 255, 250,
+ 1, 251, 255, 254,
+ 1, 255, 255, 255,
+ 2, 8, 255, 15,
+ 2, 16, 255, 23,
+ 2, 24, 255, 31,
+ 2, 32, 255, 40,
+ 2, 41, 255, 48,
+ 2, 49, 255, 56,
+ 2, 57, 255, 64,
+ 2, 65, 255, 73,
+ 2, 74, 255, 81,
+ 2, 82, 255, 89,
+ 2, 90, 255, 97,
+ 2, 98, 255, 105,
+ 2, 106, 255, 114,
+ 2, 115, 255, 122,
+ 2, 123, 255, 130,
+ 2, 131, 255, 138,
+ 2, 139, 255, 147,
+ 2, 148, 255, 155,
+ 2, 156, 255, 163,
+ 2, 164, 255, 171,
+ 2, 172, 255, 179,
+ 2, 180, 255, 188,
+ 2, 189, 255, 196,
+ 2, 197, 255, 204,
+ 2, 205, 255, 212,
+ 2, 213, 255, 221,
+ 2, 222, 255, 229,
+ 2, 230, 255, 237,
+ 2, 238, 255, 245,
+ 2, 246, 255, 254,
+ 2, 255, 255, 255
+};
+
+unsigned char HT1200x1200x1PhotoBest_open[1024] =
+{
+0, 0, 255, 0,
+0, 0, 255, 0,
+0, 2, 255, 2,
+0, 3, 255, 3,
+0, 4, 255, 4,
+0, 5, 255, 5,
+0, 6, 255, 6,
+0, 7, 255, 7,
+0, 8, 255, 8,
+0, 9, 255, 9,
+0, 10, 255, 10,
+0, 11, 255, 11,
+0, 12, 255, 12,
+0, 13, 255, 13,
+0, 14, 255, 14,
+0, 15, 255, 15,
+0, 16, 255, 16,
+0, 17, 255, 17,
+0, 18, 255, 18,
+0, 19, 255, 19,
+0, 20, 255, 20,
+0, 21, 255, 21,
+0, 22, 255, 22,
+0, 23, 255, 23,
+0, 24, 255, 24,
+0, 25, 255, 25,
+0, 26, 255, 26,
+0, 27, 255, 27,
+0, 28, 255, 28,
+0, 29, 255, 29,
+0, 30, 255, 30,
+0, 31, 255, 31,
+0, 32, 255, 32,
+0, 33, 255, 33,
+0, 34, 255, 34,
+0, 35, 255, 35,
+0, 36, 255, 36,
+0, 37, 255, 37,
+0, 38, 255, 38,
+0, 39, 255, 39,
+0, 40, 255, 40,
+0, 41, 255, 41,
+0, 42, 255, 42,
+0, 43, 255, 43,
+0, 44, 255, 44,
+0, 45, 255, 45,
+0, 46, 255, 46,
+0, 47, 255, 47,
+0, 48, 255, 48,
+0, 49, 255, 49,
+0, 50, 255, 50,
+0, 51, 255, 51,
+0, 52, 255, 52,
+0, 53, 255, 53,
+0, 54, 255, 54,
+0, 55, 255, 55,
+0, 56, 255, 56,
+0, 57, 255, 57,
+0, 58, 255, 58,
+0, 59, 255, 59,
+0, 60, 255, 60,
+0, 61, 255, 61,
+0, 62, 255, 62,
+0, 63, 255, 63,
+0, 64, 255, 64,
+0, 65, 255, 65,
+0, 66, 255, 66,
+0, 67, 255, 67,
+0, 68, 255, 68,
+0, 69, 255, 69,
+0, 70, 255, 70,
+0, 71, 255, 71,
+0, 72, 255, 72,
+0, 73, 255, 73,
+0, 74, 255, 74,
+0, 75, 255, 75,
+0, 76, 255, 76,
+0, 77, 255, 77,
+0, 78, 255, 78,
+0, 79, 255, 79,
+0, 80, 255, 80,
+0, 81, 255, 81,
+0, 82, 255, 82,
+0, 83, 255, 83,
+0, 84, 255, 84,
+0, 85, 255, 85,
+0, 86, 255, 86,
+0, 87, 255, 87,
+0, 88, 255, 88,
+0, 89, 255, 89,
+0, 90, 255, 90,
+0, 91, 255, 91,
+0, 92, 255, 92,
+0, 93, 255, 93,
+0, 94, 255, 94,
+0, 95, 255, 95,
+0, 96, 255, 96,
+0, 97, 255, 97,
+0, 98, 255, 98,
+0, 99, 255, 99,
+0, 100, 255, 100,
+0, 101, 255, 101,
+0, 102, 255, 102,
+0, 103, 255, 103,
+0, 104, 255, 104,
+0, 105, 255, 105,
+0, 106, 255, 106,
+0, 107, 255, 107,
+0, 108, 255, 108,
+0, 109, 255, 109,
+0, 110, 255, 110,
+0, 111, 255, 111,
+0, 112, 255, 112,
+0, 113, 255, 113,
+0, 114, 255, 114,
+0, 115, 255, 115,
+0, 116, 255, 116,
+0, 117, 255, 117,
+0, 118, 255, 118,
+0, 119, 255, 119,
+0, 120, 255, 120,
+0, 121, 255, 121,
+0, 122, 255, 122,
+0, 123, 255, 123,
+0, 124, 255, 124,
+0, 125, 255, 125,
+0, 126, 255, 126,
+0, 127, 255, 127,
+0, 128, 255, 128,
+0, 129, 255, 129,
+0, 130, 255, 130,
+0, 131, 255, 131,
+0, 132, 255, 132,
+0, 133, 255, 133,
+0, 134, 255, 134,
+0, 135, 255, 135,
+0, 136, 255, 136,
+0, 137, 255, 137,
+0, 138, 255, 138,
+0, 139, 255, 139,
+0, 140, 255, 140,
+0, 141, 255, 141,
+0, 142, 255, 142,
+0, 143, 255, 143,
+0, 144, 255, 144,
+0, 145, 255, 145,
+0, 146, 255, 146,
+0, 147, 255, 147,
+0, 148, 255, 148,
+0, 149, 255, 149,
+0, 150, 255, 150,
+0, 151, 255, 151,
+0, 152, 255, 152,
+0, 153, 255, 153,
+0, 154, 255, 154,
+0, 155, 255, 155,
+0, 156, 255, 156,
+0, 157, 255, 157,
+0, 158, 255, 158,
+0, 159, 255, 159,
+0, 160, 255, 160,
+0, 161, 255, 161,
+0, 162, 255, 162,
+0, 163, 255, 163,
+0, 164, 255, 164,
+0, 165, 255, 165,
+0, 166, 255, 166,
+0, 167, 255, 167,
+0, 168, 255, 168,
+0, 169, 255, 169,
+0, 170, 255, 170,
+0, 171, 255, 171,
+0, 172, 255, 172,
+0, 173, 255, 173,
+0, 174, 255, 174,
+0, 175, 255, 175,
+0, 176, 255, 176,
+0, 177, 255, 177,
+0, 178, 255, 178,
+0, 179, 255, 179,
+0, 180, 255, 180,
+0, 181, 255, 181,
+0, 182, 255, 182,
+0, 183, 255, 183,
+0, 184, 255, 184,
+0, 185, 255, 185,
+0, 186, 255, 186,
+0, 187, 255, 187,
+0, 188, 255, 188,
+0, 189, 255, 189,
+0, 190, 255, 190,
+0, 191, 255, 191,
+0, 192, 255, 192,
+0, 193, 255, 193,
+0, 194, 255, 194,
+0, 195, 255, 195,
+0, 196, 255, 196,
+0, 197, 255, 197,
+0, 198, 255, 198,
+0, 199, 255, 199,
+0, 200, 255, 200,
+0, 201, 255, 201,
+0, 202, 255, 202,
+0, 203, 255, 203,
+0, 204, 255, 204,
+0, 205, 255, 205,
+0, 206, 255, 206,
+0, 207, 255, 207,
+0, 208, 255, 208,
+0, 209, 255, 209,
+0, 210, 255, 210,
+0, 211, 255, 211,
+0, 212, 255, 212,
+0, 213, 255, 213,
+0, 214, 255, 214,
+0, 215, 255, 215,
+0, 216, 255, 216,
+0, 217, 255, 217,
+0, 218, 255, 218,
+0, 219, 255, 219,
+0, 220, 255, 220,
+0, 221, 255, 221,
+0, 222, 255, 222,
+0, 223, 255, 223,
+0, 224, 255, 224,
+0, 225, 255, 225,
+0, 226, 255, 226,
+0, 227, 255, 227,
+0, 228, 255, 228,
+0, 229, 255, 229,
+0, 230, 255, 230,
+0, 231, 255, 231,
+0, 232, 255, 232,
+0, 233, 255, 233,
+0, 234, 255, 234,
+0, 235, 255, 235,
+0, 236, 255, 236,
+0, 237, 255, 237,
+0, 238, 255, 238,
+0, 239, 255, 239,
+0, 240, 255, 240,
+0, 241, 255, 241,
+0, 242, 255, 242,
+0, 243, 255, 243,
+0, 244, 255, 244,
+0, 245, 255, 245,
+0, 246, 255, 246,
+0, 247, 255, 247,
+0, 248, 255, 248,
+0, 249, 255, 249,
+0, 250, 255, 250,
+0, 251, 255, 251,
+0, 252, 255, 252,
+0, 253, 255, 253,
+0, 254, 255, 254,
+0, 254, 255, 254
+};
+
diff --git a/prnt/hpcups/ColorMaps.h b/prnt/hpcups/ColorMaps.h
new file mode 100644
index 0000000..fab13c9
--- /dev/null
+++ b/prnt/hpcups/ColorMaps.h
@@ -0,0 +1,47 @@
+extern uint32_t ulMapDJ400_K[9 * 9 * 9];
+extern uint32_t ulMapDJ400_CMY[9 * 9 * 9];
+
+extern uint32_t ulMapDJ600_CCM_K[ 9 * 9 * 9 ];
+extern uint32_t ulMapDJ600_CCM_K[ 9 * 9 * 9 ];
+extern uint32_t ulMapDJ600_CCM_CMY[ 9 * 9 * 9 ];
+extern uint32_t ulMapDJ660_CCM_KCMY[ 9 * 9 * 9 ];
+extern uint32_t ulMapDJ690_CMYK[ 9 * 9 * 9 ];
+extern uint32_t ulMapGRAY_K_6x6x1[9 * 9 * 9];
+extern uint32_t ulMapDJ690_ClMlxx[9 * 9 * 9];
+
+extern uint32_t ulMapDJ850_Normal_KCMY[9 * 9 * 9];
+
+extern uint32_t ulMapDJ895_KCMY[ 9 * 9 * 9 ];
+extern uint32_t ulMapDJ895_HB_KCMY[ 9 * 9 * 9 ];
+extern uint32_t ulMapDJ895_Binary_KCMY[ 9 * 9 * 9 ];
+
+extern uint32_t ulMapDJ8x5PlainNormal[ 9 * 9 * 9 ];
+extern uint32_t ulMapDJ8x5Draft[ 9 * 9 * 9 ];
+
+extern uint32_t ulMapDJ970_KCMY[9 * 9 * 9];
+extern uint32_t ulMapDJ970_KCMY_3x3x2[9 * 9 * 9];
+extern uint32_t ulMapDJ970_Gossimer_Normal_KCMY[9 * 9 * 9];
+extern uint32_t ulMapDJ600_CCM_K[9 * 9 * 9];
+extern uint32_t ulMapGRAY_K_6x6x1[9 * 9 * 9];
+extern uint32_t ulMapDJ970_Draft_KCMY[9 * 9 * 9];
+
+extern uint32_t ulMapDJ3320_K_3x3x1[9 * 9 * 9];
+extern uint32_t ulMapDJ3320_K_6x6x1[9 * 9 * 9];
+extern uint32_t ulMapDJ3320_CMY_3x3x1[9 * 9 * 9];
+extern uint32_t ulMapDJ3320_CMY_6x6x1[9 * 9 * 9];
+extern uint32_t ulMapDJ3320_KCMY_3x3x1[9 * 9 * 9];
+extern uint32_t ulMapDJ3320_KCMY_6x6x1[9 * 9 * 9];
+extern uint32_t ulMapDJ970_Gossimer_Normal_KCMY[ 9 * 9 * 9 ];
+
+extern uint32_t ulMapDJ3600_KCMY_6x6x1[9 * 9 * 9];
+extern uint32_t ulMapDJ3600_ClMlxx_6x6x1[9 * 9 * 9];
+extern uint32_t ulMapDJ3600_KCMY_6x6x2[9 * 9 * 9];
+extern uint32_t ulMapDJ3600_ClMlxx_6x6x2[9 * 9 * 9];
+extern uint32_t ulMapDJ3600_KCMY_3x3x1[9 * 9 * 9];
+extern uint32_t ulMapDJ3600_ClMlxx_3x3x1[9 * 9 * 9];
+
+extern unsigned char ucMapDJ4100_KCMY_6x6x1[];
+extern unsigned char ucMapDJ4100_KCMY_Photo_BestV_12x12x1[];
+extern unsigned char ucMapDJ4100_KCMY_Photo_BestA_12x12x1[];
+
+extern unsigned char ucMapDJ4100_KCMY_Photo_BestA_12x12x1[17 * 17 * 17];
diff --git a/prnt/hpcups/ColorMatcher.cpp b/prnt/hpcups/ColorMatcher.cpp
new file mode 100644
index 0000000..c910fdb
--- /dev/null
+++ b/prnt/hpcups/ColorMatcher.cpp
@@ -0,0 +1,463 @@
+/*****************************************************************************\
+ colormatch.cpp : Implimentation for the ColorMatcher class
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+#include "CommonDefinitions.h"
+#include "Processor.h"
+#include "ColorMatcher.h"
+
+ColorMatcher::ColorMatcher
+(
+ ColorMap cm,
+ unsigned int DyeCount,
+ unsigned int iInputWidth
+) : ColorPlaneCount(DyeCount),
+ InputWidth(iInputWidth),
+ cmap(cm)
+{
+ constructor_error = NO_ERROR;
+ ASSERT((cmap.ulMap1 != NULL || cmap.ulMap3 != NULL));
+ StartPlane = K; // most common case
+
+ if (ColorPlaneCount == 3) // CMY pen
+ {
+ StartPlane = C;
+ }
+
+ EndPlane = Y; // most common case
+ if (ColorPlaneCount == 6)
+ {
+ EndPlane = Mlight;
+ }
+ if (ColorPlaneCount == 1)
+ {
+ EndPlane = K;
+ }
+
+ Contone = (BYTE *) new BYTE[InputWidth * ColorPlaneCount];
+ if (Contone == NULL)
+ {
+ goto MemoryError;
+ }
+
+ Restart(); // this zeroes buffers and sets nextraster counter
+
+ return;
+
+MemoryError:
+ constructor_error=ALLOCMEM_ERROR;
+
+ FreeBuffers();
+ return;
+} //ColorMatcher
+
+ColorMatcher::~ColorMatcher()
+{
+ FreeBuffers();
+} //~ColorMatcher
+
+
+void ColorMatcher::Restart()
+// also reset cache when we have one
+{
+ memset(Contone, 0, InputWidth*ColorPlaneCount);
+
+ started = false;
+}
+
+void ColorMatcher::Flush()
+// needed to reset cache
+{
+ if (!started)
+ {
+ return;
+ }
+ Restart();
+}
+
+void ColorMatcher::FreeBuffers()
+{
+ delete [] Contone;
+}
+
+bool ColorMatcher::NextOutputRaster(RASTERDATA &next_raster)
+{
+ if (iRastersReady == 0)
+ return false;
+
+ iRastersReady--;
+ iRastersDelivered++;
+ if (raster.rasterdata[COLORTYPE_COLOR] != NULL)
+ {
+ next_raster.rastersize[COLORTYPE_COLOR] = raster.rastersize[COLORTYPE_COLOR];
+ next_raster.rasterdata[COLORTYPE_COLOR] = Contone;
+ }
+ else
+ {
+ next_raster.rastersize[COLORTYPE_COLOR] = 0;
+ next_raster.rasterdata[COLORTYPE_COLOR] = raster.rasterdata[COLORTYPE_COLOR];
+ }
+ next_raster.rastersize[COLORTYPE_BLACK] = raster.rastersize[COLORTYPE_BLACK];
+ next_raster.rasterdata[COLORTYPE_BLACK] = raster.rasterdata[COLORTYPE_BLACK];
+ return true;
+}
+
+
+unsigned int ColorMatcher::GetMaxOutputWidth()
+{
+ if (myplane == COLORTYPE_COLOR)
+ {
+ if (raster.rasterdata[myplane] == NULL)
+ return 0;
+ else
+ return InputWidth*ColorPlaneCount;
+ }
+ else
+ {
+ return raster.rastersize[myplane];
+ }
+} //GetMaxOutPutWidth
+
+void ColorMatcher::ColorMatch
+(
+ unsigned long width,
+ const uint32_t *map,
+ unsigned char *rgb,
+ unsigned char *kplane,
+ unsigned char *cplane,
+ unsigned char *mplane,
+ unsigned char *yplane
+)
+{
+ static uint32_t prev_red = 255, prev_green = 255, prev_blue = 255;
+ static BYTE bcyan, bmagenta, byellow, bblack;
+
+ uint32_t r;
+ uint32_t g;
+ uint32_t b;
+
+ for (unsigned long i = 0; i < width; i++)
+ {
+ r = *rgb++;
+ g = *rgb++;
+ b = *rgb++;
+
+ if(i == 0 || ( (prev_red != r) || (prev_green != g) || (prev_blue != b) ))
+ {
+ prev_red = r;
+ prev_green = g;
+ prev_blue = b;
+
+ Interpolate(map, (BYTE)r, (BYTE)g,(BYTE)b, &bblack, &bcyan, &bmagenta, &byellow);
+ }
+ if (kplane)
+ *(kplane + i) = bblack;
+ if (cplane)
+ *(cplane + i) = bcyan;
+ if (mplane)
+ *(mplane + i) = bmagenta;
+ if (yplane)
+ *(yplane + i) = byellow;
+
+ }
+
+} //ColorMatch
+
+void ColorMatcher::ColorMatch
+(
+ unsigned long width,
+ const unsigned char *map,
+ unsigned char *rgb,
+ unsigned char *kplane,
+ unsigned char *cplane,
+ unsigned char *mplane,
+ unsigned char *yplane
+)
+{
+ static BYTE prev_red = 255, prev_green = 255, prev_blue = 255;
+ static BYTE bcyan, bmagenta, byellow, bblack;
+
+ BYTE r;
+ BYTE g;
+ BYTE b;
+
+ for (unsigned long i = 0; i < width; i++)
+ {
+ r = *rgb++;
+ g = *rgb++;
+ b = *rgb++;
+ if(i == 0 || ( (prev_red != r) || (prev_green != g) || (prev_blue != b) ))
+ {
+ prev_red = r;
+ prev_green = g;
+ prev_blue = b;
+
+ Interpolate(map, (BYTE)r, (BYTE)g,(BYTE)b, &bblack, &bcyan, &bmagenta, &byellow);
+ }
+ if (kplane)
+ *(kplane + i) = bblack;
+ if (cplane)
+ *(cplane + i) = bcyan;
+ if (mplane)
+ *(mplane + i) = bmagenta;
+ if (yplane)
+ *(yplane + i) = byellow;
+
+ }
+
+} //ColorMatch
+
+uint32_t Packed(unsigned int k,unsigned int c,unsigned int m,unsigned int y)
+{
+ uint32_t p = y;
+ p = p << 8;
+ p += m;
+ p = p << 8;
+ p += c;
+ p = p << 8;
+ p += k;
+ return p;
+} //Packed
+
+
+DRIVER_ERROR ColorMatcher::MakeGrayMap(const uint32_t *colormap, uint32_t* graymap)
+{
+ unsigned long ul_MapPtr;
+ for (unsigned int r = 0; r < 9; r++)
+ {
+ unsigned long ul_RedMapPtr = r * 9 * 9;
+ for (unsigned int g = 0; g < 9; g++)
+ {
+ unsigned long ul_GreenMapPtr = g * 9;
+ for (unsigned int b = 0; b < 9; b++)
+ {
+ unsigned long mapptr = b + (g * 9) + (r * 9 * 9); // get address in map
+ ul_MapPtr = b + ul_GreenMapPtr + ul_RedMapPtr;
+ ASSERT(mapptr == ul_MapPtr);
+ // put r,g,b in monitor range
+ unsigned int oldR = r * 255 >> 3;
+ unsigned int oldG = g * 255 >> 3;
+ unsigned int oldB = b * 255 >> 3;
+
+ // calculate gray equivalence
+ unsigned int gray = ((30 * oldR + 59 * oldG + 11 * oldB + 50) / 100);
+
+ uint32_t *start;
+ start = (uint32_t *)
+ ( ((gray & 0xE0) <<1) + ((gray & 0xE0)>>1) + (gray>>5) +
+ ((gray & 0xE0) >>2) + (gray>>5) + (gray>>5) + colormap);
+
+ BYTE k,c,m,y;
+ Interpolate(start, gray, gray, gray, &k, &c, &m, &y);
+
+ // second interpolate if Clight/Mlight
+
+ *(graymap + mapptr) = Packed(k, c, m, y);
+ }
+ }
+ }
+ return NO_ERROR;
+} //MakeGrayMap
+
+
+bool ColorMatcher::Process(RASTERDATA* pbyInputKRGBRaster)
+{
+ if (pbyInputKRGBRaster == NULL || (pbyInputKRGBRaster->rasterdata[COLORTYPE_BLACK] == NULL && pbyInputKRGBRaster->rasterdata[COLORTYPE_COLOR] == NULL))
+ {
+ Restart();
+ return false; // no output
+ }
+ started=true;
+
+ if (pbyInputKRGBRaster->rasterdata[COLORTYPE_COLOR])
+ {
+ BYTE* buff1 = NULL;
+ BYTE* buff2 = NULL;
+ BYTE* buff3 = NULL;
+ BYTE* buff4 = NULL;
+
+ if (StartPlane == K)
+ {
+ buff1 = Contone;
+ if (EndPlane>K)
+ {
+ buff2 = buff1 + InputWidth;
+ buff3 = buff2 + InputWidth;
+ buff4 = buff3 + InputWidth;
+ }
+ }
+ else
+ {
+ buff2 = Contone;
+ buff3 = buff2 + InputWidth;
+ buff4 = buff3 + InputWidth;
+ }
+
+ if (cmap.ulMap3)
+ {
+ ColorMatch( InputWidth, // ASSUMES ALL INPUTWIDTHS EQUAL
+ (const unsigned char *) cmap.ulMap3,
+ pbyInputKRGBRaster->rasterdata[COLORTYPE_COLOR],
+ buff1,
+ buff2,
+ buff3,
+ buff4
+ );
+ }
+ if (cmap.ulMap1)
+ {
+ // colormatching -- can only handle 4 planes at a time
+ ColorMatch( InputWidth, // ASSUMES ALL INPUTWIDTHS EQUAL
+ (const uint32_t *) cmap.ulMap1,
+ pbyInputKRGBRaster->rasterdata[COLORTYPE_COLOR],
+ buff1,
+ buff2,
+ buff3,
+ buff4
+ );
+ }
+
+ if (EndPlane > Y && cmap.ulMap2)
+ {
+ BYTE* buff5 = buff4 + InputWidth;
+ BYTE* buff6 = buff5 + InputWidth;
+
+ ColorMatch( InputWidth,
+ (const uint32_t *) cmap.ulMap2, // 2nd map is for lighter inks
+ pbyInputKRGBRaster->rasterdata[COLORTYPE_COLOR],
+ NULL, // don't need black again
+ buff5,buff6,
+ NULL // don't need yellow again
+ );
+ }
+ }
+
+ iRastersReady = 1;
+ iRastersDelivered = 0;
+ return true; // one raster in, one raster out
+}
+
+#define INTERPOLATE_5_BITS(a, b, d) a + ( ( ( (long)b - (long)a ) * d) >> 5)
+#define INTERPOLATE_4_BITS(a, b, d) a + ( ( ( (long)b - (long)a ) * d) >> 4)
+
+// Spatial Interpolation
+#define INTERPOLATE_CUBE(r,g,b, cube, DOCALC) \
+ DOCALC( (DOCALC( (DOCALC( cube[0], cube[4], (r))), \
+ (DOCALC( cube[2], cube[6], (r))), (g))), \
+ (DOCALC( (DOCALC( cube[1], cube[5], (r))), \
+ (DOCALC( cube[3], cube[7], (r))), (g))), \
+ (b))
+
+void ColorMatcher::Interpolate
+(
+ const uint32_t *map,
+ BYTE r,
+ BYTE g,
+ BYTE b,
+ BYTE *blackout,
+ BYTE *cyanout,
+ BYTE *magentaout,
+ BYTE *yellowout
+)
+{
+ static int cube_location[] = {0, 1, 9, 10, 81, 82, 90, 91 };
+ const uint32_t *start;
+
+ BYTE cyan[8], magenta[8],yellow[8],black[8];
+ start = (const uint32_t *)
+ (((r & 0xE0) << 1) + ((r & 0xE0) >> 1) + (r >> 5) +
+ ((g & 0xE0) >> 2) + (g >> 5) + (b >> 5) + map);
+
+ uint32_t cValue;
+ for (int j = 0; j < 8; j++)
+ {
+ cValue = *(start + cube_location[j]);
+ cyan[j] = GetCyanValue (cValue);
+ magenta[j] = GetMagentaValue (cValue);
+ yellow[j] = GetYellowValue (cValue);
+ black[j] = GetBlackValue (cValue);
+ }
+
+ ////////////////this is the 8 bit 9cube operation /////////////
+ BYTE diff_red = r & 0x1f;
+ BYTE diff_green = g & 0x1f;
+ BYTE diff_blue = b & 0x1f;
+
+ *cyanout = INTERPOLATE_CUBE(diff_red,diff_green,diff_blue, cyan, INTERPOLATE_5_BITS );
+ *magentaout = INTERPOLATE_CUBE(diff_red,diff_green,diff_blue, magenta, INTERPOLATE_5_BITS );
+ *yellowout = INTERPOLATE_CUBE(diff_red,diff_green,diff_blue, yellow, INTERPOLATE_5_BITS );
+ *blackout = INTERPOLATE_CUBE(diff_red,diff_green,diff_blue, black, INTERPOLATE_5_BITS );
+}
+
+void ColorMatcher::Interpolate
+(
+ const unsigned char *map,
+ BYTE r,
+ BYTE g,
+ BYTE b,
+ BYTE *blackout,
+ BYTE *cyanout,
+ BYTE *magentaout,
+ BYTE *yellowout
+)
+{
+ BYTE cyan[8], magenta[8],yellow[8],black[8];
+
+// static int cube_location[] = {0, 1, 17, 18, 289, 290, 306, 307};
+ static int cube_location[] = {0, 4, 68, 72, 1156, 1160, 1224, 1228};
+ const BYTE *start;
+
+ BYTE *node_ptr;
+
+ start = (const unsigned char *)
+ ((((r & 0xF0) << 4) + ((r & 0xF0) << 1) + (r >> 4) +
+ ((g & 0xF0)) + (g >> 4) + (b >> 4)) * 4 + map);
+
+ // use (start) to determine the surrounding cube values
+ for (int j = 0; j < 8; ++j )
+ {
+ node_ptr = (BYTE *) (start + cube_location[j]);
+ black[j] = *node_ptr++;
+ cyan[j] = *node_ptr++;
+ magenta[j] = *node_ptr++;
+ yellow[j] = *node_ptr;
+ }
+
+
+ // interpolate using the 4 LSBs
+ BYTE diff_red = r & 0x0f;
+ BYTE diff_green = g & 0x0f;
+ BYTE diff_blue = b & 0x0f;
+
+ *cyanout = INTERPOLATE_CUBE(diff_red,diff_green,diff_blue, cyan, INTERPOLATE_4_BITS );
+ *magentaout = INTERPOLATE_CUBE(diff_red,diff_green,diff_blue, magenta, INTERPOLATE_4_BITS );
+ *yellowout = INTERPOLATE_CUBE(diff_red,diff_green,diff_blue, yellow, INTERPOLATE_4_BITS );
+ *blackout = INTERPOLATE_CUBE(diff_red,diff_green,diff_blue, black, INTERPOLATE_4_BITS );
+}
+
diff --git a/prnt/hpcups/ColorMatcher.h b/prnt/hpcups/ColorMatcher.h
new file mode 100644
index 0000000..4113c93
--- /dev/null
+++ b/prnt/hpcups/ColorMatcher.h
@@ -0,0 +1,139 @@
+/*****************************************************************************\
+ colormatch.h : Interface for the ColorMatcher class
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+#ifndef COLORMATCHER_H
+#define COLORMATCHER_H
+
+#define TESTMODE 0
+#define MAP17CUBE 1
+#define OCT_MASK1 0x10
+#define OCT_MASK2 0x8
+#define OCT_MASK3 0x4
+#define OCT_MASK4 0x2
+#define OCT_MASK5 0x1
+
+class ColorMatcher : public Processor
+{
+public:
+ ColorMatcher(ColorMap cm, unsigned int DyeCount,
+ unsigned int iInputWidth);
+ virtual ~ColorMatcher();
+
+ bool Process(RASTERDATA* InputRaster=NULL);
+ void Flush();
+ DRIVER_ERROR constructor_error;
+ void Restart(); // set up for new page or blanks
+
+ // items required by Processor
+ unsigned int GetMaxOutputWidth();
+ bool NextOutputRaster(RASTERDATA &next_raster);
+
+ unsigned int ColorPlaneCount;
+ unsigned int InputWidth; // # of pixels input
+ unsigned int StartPlane; // since planes are ordered KCMY, if no K, this is 1
+ unsigned int EndPlane; // usually Y, could be Mlight
+ unsigned int ResBoost;
+
+ DRIVER_ERROR MakeGrayMap(const uint32_t *colormap, uint32_t* graymap);
+
+private:
+ void FreeBuffers();
+ void ColorMatch(unsigned long width, const uint32_t *map,
+ unsigned char *rgb, unsigned char *kplane,
+ unsigned char *cplane, unsigned char *mplane,
+ unsigned char *yplane);
+ void Interpolate(const uint32_t *map,
+ unsigned char r,unsigned char g,unsigned char b,
+ unsigned char *blackout, unsigned char *cyanout,
+ unsigned char *magentaout, unsigned char *yellowout);
+
+ void ColorMatch(unsigned long width, const unsigned char *map,
+ unsigned char *rgb, unsigned char *kplane,
+ unsigned char *cplane, unsigned char *mplane,
+ unsigned char *yplane);
+ void Interpolate(const unsigned char *map,
+ unsigned char r,unsigned char g,unsigned char b,
+ unsigned char *blackout, unsigned char *cyanout,
+ unsigned char *magentaout, unsigned char *yellowout);
+
+
+ inline unsigned char GetYellowValue(uint32_t cmyk)
+ { return( ((unsigned char)((cmyk)>>24) & 0xFF) ); }
+
+ inline unsigned char GetMagentaValue(uint32_t cmyk)
+ { return( ((unsigned char)((cmyk)>>16) & 0xFF) ); }
+
+ inline unsigned char GetCyanValue(uint32_t cmyk)
+ { return( ((unsigned char)(((int)(cmyk))>>8) & 0xFF) ); }
+
+ inline unsigned char GetBlackValue(uint32_t cmyk)
+ { return( ((unsigned char)(cmyk) & 0xFF) ); }
+
+ bool Forward16PixelsNonWhite(BYTE *inputPtr)
+ {
+// return ((*(uint32_t *)(inputPtr) != 0x0) || (*(((uint32_t *)(inputPtr)) + 1) != 0x0) ||
+// (*(((uint32_t *)(inputPtr)) + 2) != 0x0) || (*(((uint32_t *)(inputPtr)) + 3) != 0x0));
+ for (int i=0; i < 16; i++)
+ {
+ if ((*inputPtr++)!=0)
+ return true;
+ }
+
+ return false;
+ }
+
+ bool Backward16PixelsNonWhite(BYTE *inputPtr)
+ {
+// return ((*(uint32_t *)(inputPtr) != 0x0) || (*(((uint32_t *)(inputPtr)) - 1) != 0x0) ||
+// (*(((uint32_t *)(inputPtr)) - 2) != 0x0) || (*(((uint32_t *)(inputPtr)) - 3) != 0x0));
+ for (int i=0; i < 16; i++)
+ {
+ if ((*inputPtr--)!=0)
+ return true;
+ }
+
+ return false;
+ }
+
+
+ unsigned char* Contone; // containing byte-per-pixel CMYK values
+
+ ColorMap cmap;
+
+// void PixelMultiply(unsigned char* buffer, unsigned int width, unsigned int factor);
+
+ unsigned int PlaneCount(); // tells how many layers (colors,hifipe,multirow)
+
+ bool started;
+
+}; // ColorMatcher
+
+#endif // COLORMATCHER_H
+
diff --git a/prnt/hpcups/CommonDefinitions.h b/prnt/hpcups/CommonDefinitions.h
new file mode 100644
index 0000000..cca7990
--- /dev/null
+++ b/prnt/hpcups/CommonDefinitions.h
@@ -0,0 +1,466 @@
+/*****************************************************************************\
+ CommonDefinitions.h : common header
+
+ Copyright (c) 1996 - 2009, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ Author: Naga Samrat Chowdary Narla,
+\*****************************************************************************/
+
+#ifndef COMMON_DEFINITIONS_H
+#define COMMON_DEFINITIONS_H
+
+#include <stdio.h>
+#include <inttypes.h>
+#include <stdint.h>
+//#include <machine/types.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+#include <cups/cups.h>
+#include <cups/raster.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <syslog.h>
+#include <assert.h>
+#include <time.h>
+#include <sys/timeb.h>
+#include <string.h>
+
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE
+#endif
+
+#define BASIC_LOG 1
+#define SAVE_PCL_FILE 2
+#define SAVE_INPUT_RASTERS 4
+#define SEND_TO_PRINTER_ALSO 8
+
+#define MAX_COLORTYPE 2
+#define NUMBER_PLANES 3
+
+#define ASSERT assert
+
+#define _STRINGIZE(x) #x
+#define STRINGIZE(x) _STRINGIZE(x)
+
+#define dbglog(args...) {syslog(LOG_ERR, __FILE__ " " STRINGIZE(__LINE__) ": " args); \
+fprintf(stderr, __FILE__ " " STRINGIZE(__LINE__) ": " args);}
+
+
+typedef unsigned char BYTE;
+
+#ifndef ABS
+ #define ABS(x) ( ((x)<0) ? -(x) : (x) )
+#endif
+
+#ifndef MIN
+ #define MIN(a,b) (((a)>=(b))?(b):(a))
+#endif
+
+#ifndef MAX
+ #define MAX(a,b) (((a)<=(b))?(b):(a))
+#endif
+
+#ifdef APDK_LITTLE_ENDIAN
+ #define GetRed(x) (((x >> 16) & 0x0FF))
+ #define GetGreen(x) (((x >> 8) & 0x0FF))
+ #define GetBlue(x) ((x & 0x0FF))
+ #else
+ #define GetRed(x) (((x >> 24) & 0x0FF))
+ #define GetGreen(x) (((x >> 16) & 0x0FF))
+ #define GetBlue(x) (((x >> 8) & 0x0FF))
+ #endif
+
+#ifdef BLACK_PEN
+ #undef BLACK_PEN
+#endif
+
+#ifdef NO_ERROR
+ #undef NO_ERROR
+#endif
+
+#define HIBYTE(sVar) (BYTE) ((sVar & 0xFF00) >> 8)
+#define LOBYTE(sVar) (BYTE) ((sVar & 0x00FF))
+#ifndef LOWORD
+ #define LOWORD(l) ((unsigned short) (l))
+#endif
+
+#ifndef HIWORD
+ #define HIWORD(l) ((unsigned short) (((uint32_t) (l) >> 16) & 0xFFFF))
+#endif
+
+#define PCL_BUFFER_SIZE 10000
+
+typedef unsigned short UInt16;
+typedef unsigned long UInt32;
+typedef unsigned char UChar;
+typedef unsigned int Int16;
+typedef long Int32;
+
+typedef struct RASTERDATA
+{
+ int rastersize[MAX_COLORTYPE];
+ BYTE *rasterdata[MAX_COLORTYPE];
+} RASTERDATA;
+
+const int MAXCOLORDEPTH = 3;
+
+const int MAXCOLORPLANES = 6; // current max anticipated, 6 for 690 photopen
+
+const int MAXCOLORROWS = 2; // multiple of high-to-low for mixed-resolution cases
+
+enum HALFTONING_ALGORITHM
+{
+ FED,
+ MATRIX
+};
+
+/*
+ * values of DRIVER_ERROR
+ * Values < 0 are warnings
+ */
+
+typedef enum
+{
+
+// general or system errors
+ NO_ERROR = 0x00, //!< everything okay
+ JOB_CANCELED = 0x01, //!< CANCEL chosen by user
+ SYSTEM_ERROR = 0x02, //!< something bad that should not have happened
+ ALLOCMEM_ERROR = 0x03, //!< failed to allocate memory
+ NO_PRINTER_SELECTED = 0x04, //!< indicates improper calling sequence or unidi
+ INDEX_OUT_OF_RANGE = 0x05, //!< what it says
+ ILLEGAL_RESOLUTION = 0x06, //!< tried to set resolution at unacceptable value
+ NULL_POINTER = 0x07, //!< supplied ptr was null
+ MISSING_PENS = 0x08, //!< one or more printhead/pen missing
+
+// build-related
+// (items either absent from current build, or just bad index from client code)
+ UNSUPPORTED_PRINTER = 0x10, //!< selected printer-type unsupported in build
+ UNSUPPORTED_PEN = 0x11, //!< selected pen-type unsupported
+ GRAPHICS_UNSUPPORTED = 0x13, //!< no graphics allowed in current build
+ ILLEGAL_COORDS = 0x15, //!< bad (x,y) passed to TextOut
+ BAD_INPUT_WIDTH = 0x18, //!< inputwidth is 0 and
+ OUTPUTWIDTH_EXCEEDS_PAGEWIDTH = 0x19, //!< inputwidth exceeds printable width
+ UNSUPPORTED_PRINTMODE = 0x19, //!< requested printmode not available
+
+// I/O related
+ IO_ERROR = 0x20, //!< I/O error communicating with printer
+ BAD_DEVICE_ID = 0x21, //!< bad or garbled device id from printer
+ CONTINUE_FROM_BLOCK = 0x22, //!< continue from blocked state for printers with no buttons
+
+// Runtime related
+ PLUGIN_LIBRARY_MISSING = 0x30, //!< a required plugin (dynamic) library is missing
+
+// WARNINGS
+// convention is that values < 0 can be ignored (at user's peril)
+ WARN_MODE_MISMATCH = -1, //!< printmode selection incompatible with pen, tray, etc.
+ WARN_DUPLEX = -2, //!< duplexer installed; our driver can't use it
+ WARN_LOW_INK_BOTH_PENS= -3, //!< sensor says pens below threshold
+ WARN_LOW_INK_BLACK = -4, //!< sensor says black pen below threshold
+ WARN_LOW_INK_COLOR = -5, //!< sensor says color pen below threshold
+
+ WARN_LOW_INK_PHOTO = -10, //!< sensor says photo pen below threshold
+ WARN_LOW_INK_GREY = -11, //!< sensor says grey pen below threshold
+ WARN_LOW_INK_BLACK_PHOTO = -12, //!< sensor says black and photo pens below threshold
+ WARN_LOW_INK_COLOR_PHOTO = -13, //!< sensor says color and photo pens below threshold
+ WARN_LOW_INK_GREY_PHOTO = -14, //!< sensor says grey and photo pens below threshold
+ WARN_LOW_INK_COLOR_GREY = -15, //!< sensor says color and grey pens below threshold
+ WARN_LOW_INK_COLOR_GREY_PHOTO = -16, //!< sensor says color, photo, and grey pens below threshold
+ WARN_LOW_INK_COLOR_BLACK_PHOTO = -17, //!< sensor says color, photo, and black pens below threshold
+ WARN_LOW_INK_CYAN = -18, //!< sensor says cyan ink below threshold
+ WARN_LOW_INK_MAGENTA = -19, //!< sensor says magenta ink below threshold
+ WARN_LOW_INK_YELLOW = -20, //!< sensor says yellow ink below threshold
+ WARN_LOW_INK_MULTIPLE_PENS = - 21, //!< sensor says more than one pen below threshold
+ WARN_ILLEGAL_PAPERSIZE = -8, //!< papersize illegal for given hardware
+ ILLEGAL_PAPERSIZE = -8,
+ WARN_INVALID_MEDIA_SOURCE = -9, //!< media source tray is invalid
+
+ eCreate_Thread_Error = 128 //! Thread error creating the error....
+} DRIVER_ERROR; //DRIVER_ERROR
+
+enum DUPLEXMODE
+{
+ DUPLEXMODE_NONE,
+ DUPLEXMODE_BOOK,
+ DUPLEXMODE_TABLET
+};
+
+enum ENDIAN_TYPE
+{
+ LITTLEENDIAN,
+ BIGENDIAN
+};
+
+// used to encourage consistent ordering of color planes
+#define PLANE_K 0
+#define PLANE_C 1
+#define PLANE_M 2
+#define PLANE_Y 3
+#define Clight 4
+#define Mlight 5
+#define kWhite 0x00FFFFFE
+
+#define K 0
+#define C 1
+#define M 2
+#define Y 3
+#define Clight 4
+#define Mlight 5
+#define RANDSEED 77
+
+/*
+ * ZJStream related definitions
+ */
+
+typedef uint32_t DWORD;
+typedef unsigned short WORD;
+typedef enum
+{
+ ZJT_START_DOC,
+ ZJT_END_DOC,
+ ZJT_START_PAGE,
+ ZJT_END_PAGE,
+ ZJT_JBIG_BIH,
+ ZJT_JBIG_HID,
+ ZJT_END_JBIG,
+ ZJT_SIGNATURE,
+ ZJT_RAW_IMAGE,
+ ZJT_START_PLANE,
+ ZJT_END_PLANE,
+ ZJT_PAUSE,
+ ZJT_BITMAP
+} CHUNK_TYPE;
+
+typedef enum
+{
+/* 0x00*/ ZJI_PAGECOUNT,
+/* 0x01*/ ZJI_DMCOLLATE,
+/* 0x02*/ ZJI_DMDUPLEX,
+
+/* 0x03*/ ZJI_DMPAPER,
+/* 0x04*/ ZJI_DMCOPIES,
+/* 0x05*/ ZJI_DMDEFAULTSOURCE,
+/* 0x06*/ ZJI_DMMEDIATYPE,
+/* 0x07*/ ZJI_NBIE,
+/* 0x08*/ ZJI_RESOLUTION_X,
+/* 0x09*/ ZJI_RESOLUTION_Y,
+/* 0x0A */ ZJI_OFFSET_X,
+/* 0x0B */ ZJI_OFFSET_Y,
+/* 0x0C */ ZJI_RASTER_X,
+/* 0x0D */ ZJI_RASTER_Y,
+
+/* 0x0E */ ZJI_COLLATE,
+/* 0x0F */ ZJI_QUANTITY,
+
+/* 0x10 */ ZJI_VIDEO_BPP,
+/* 0x11 */ ZJI_VIDEO_X,
+/* 0x12 */ ZJI_VIDEO_Y,
+/* 0x13 */ ZJI_INTERLACE,
+/* 0x14 */ ZJI_PLANE,
+/* 0x15 */ ZJI_PALETTE,
+
+/* 0x16 */ ZJI_RET,
+/* 0x17 */ ZJI_TONER_SAVE,
+
+/* 0x18 */ ZJI_MEDIA_SIZE_X,
+/* 0x19 */ ZJI_MEDIA_SIZE_Y,
+/* 0x1A */ ZJI_MEDIA_SIZE_UNITS,
+
+/* 0x1B */ ZJI_CHROMATIC,
+
+/* 0x63 */ ZJI_PAD = 99,
+
+/* 0x64 */ ZJI_PROMPT,
+
+/* 0x65 */ ZJI_BITMAP_TYPE,
+/* 0x66 */ ZJI_ENCODING_DATA,
+/* 0x67 */ ZJI_END_PLANE,
+
+/* 0x68 */ ZJI_BITMAP_PIXELS,
+/* 0x69 */ ZJI_BITMAP_LINES,
+/* 0x6A */ ZJI_BITMAP_BPP,
+/* 0x6B */ ZJI_BITMAP_STRIDE,
+
+} ZJ_ITEM;
+
+typedef enum
+{
+ RET_OFF = 0,
+ RET_ON,
+ RET_AUTO,
+ RET_LIGHT,
+ RET_MEDIUM,
+ RET_DARK
+} RET_VALUE;
+
+typedef enum
+{
+ ZJIT_UINT32 = 1,
+ ZJIT_INT32,
+ ZJIT_STRING,
+ ZJIT_BYTELUT
+} CHUNK_ITEM_TYPE;
+
+// very frequently used fragments made into macros for readability
+#define CERRCHECK if (constructor_error != NO_ERROR) {dbglog("CERRCHECK fired\n"); return;}
+#define ERRCHECK if (err != NO_ERROR) {dbglog("ERRCHECK fired\n"); return err;}
+#define NEWCHECK(x) if (x==NULL) return ALLOCMEM_ERROR;
+#define CNEWCHECK(x) if (x==NULL) { constructor_error=ALLOCMEM_ERROR; return; }
+
+#define CUSTOM_MEDIA_SIZE 101
+
+#define EVENT_PRINT_FAILED_MISSING_PLUGIN 502
+enum COLORTYPE
+{
+ COLORTYPE_COLOR, // 0
+ COLORTYPE_BLACK, // 1
+ COLORTYPE_BOTH
+};
+
+typedef struct ColorMap_s
+{
+ uint32_t *ulMap1;
+ uint32_t *ulMap2;
+ unsigned char *ulMap3;
+} ColorMap;
+
+enum COMPRESS_MODE
+{
+ COMPRESS_MODE0 = 0,
+ COMPRESS_MODE2 = 2,
+ COMPRESS_MODE9 = 9,
+ COMPRESS_MODE_AUTO = 10,
+ COMPRESS_MODE_JPEG = 11,
+ COMPRESS_MODE_LJ = 12,
+ COMPRESS_MODE_GRAFIT = 16
+};
+
+enum COMPRESSOR_TYPE
+{
+ COMPRESSOR_JPEG_QUICKCONNECT,
+ COMPRESSOR_JPEG_JETREADY,
+ COMPRESSOR_TAOS
+};
+
+const int QTABLE_SIZE = 64;
+// jpeglib.h declares these as UINT16, which is defined as unsigned short in jmorecfg.h
+typedef struct QTableInfo_s
+{
+ DWORD qtable0[QTABLE_SIZE];
+ DWORD qtable1[QTABLE_SIZE];
+ DWORD qtable2[QTABLE_SIZE];
+ unsigned int qFactor;
+} QTableInfo;
+
+typedef struct PrintMode_s
+{
+ const char *name;
+// The resolutions can be different for different planes
+ unsigned int ResolutionX[MAXCOLORPLANES];
+ unsigned int ResolutionY[MAXCOLORPLANES];
+
+ unsigned int ColorDepth[MAXCOLORPLANES];
+ unsigned int dyeCount; // number of inks in the pen(s)
+
+ HALFTONING_ALGORITHM eHT;
+
+ ColorMap cmap;
+
+ unsigned int BaseResX,BaseResY;
+ bool MixedRes;
+
+ const unsigned char* BlackFEDTable;
+ const unsigned char* ColorFEDTable;
+} PrintMode;
+
+typedef struct
+{
+ const char *printer_platform_name;
+ PrintMode *print_modes;
+ int count;
+} PrintModeTable;
+
+typedef struct QualityAttributes_s
+{
+ int media_type;
+ int media_subtype;
+ int print_quality;
+ unsigned int horizontal_resolution;
+ unsigned int vertical_resolution;
+ unsigned int actual_vertical_resolution;
+ char print_mode_name[32];
+} QualityAttributes;
+
+typedef struct MediaAttributes_s
+{
+ int pcl_id;
+ int physical_width;
+ int physical_height;
+ int printable_width;
+ int printable_height;
+ int printable_start_x;
+ int printable_start_y;
+ int horizontal_overspray;
+ int vertical_overspray;
+ int left_overspray;
+ int top_overspray;
+} MediaAttributes;
+
+typedef struct JobAttributes_s
+{
+ int media_source;
+ int color_mode;
+ DUPLEXMODE e_duplex_mode;
+ int print_borderless;
+ int krgb_mode;
+ int mech_offset;
+ QualityAttributes quality_attributes;
+ MediaAttributes media_attributes;
+ int job_id;
+ int page_order;
+ int total_pages;
+ char job_title[128];
+ char user_name[32];
+ char host_name[32];
+ char domain_name[32];
+ char os_name[160];
+ char driver_version[32];
+ char driver_name[128];
+ char printer_name[160];
+ char job_start_time[32];
+ char uuid[64];
+ char printer_platform[32];
+ char printer_language[32];
+ int integer_values[16];
+ int printer_platform_version;
+ int pre_process_raster;
+} JobAttributes;
+
+#endif // COMMON_DEFINITIONS_H
+
diff --git a/prnt/hpcups/Compressor.cpp b/prnt/hpcups/Compressor.cpp
new file mode 100644
index 0000000..7dbb481
--- /dev/null
+++ b/prnt/hpcups/Compressor.cpp
@@ -0,0 +1,75 @@
+/*****************************************************************************\
+ Compressor.cpp : Implementation of Compressor class
+
+ Copyright (c) 1996 - 2009, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+#include "Compressor.h"
+
+Compressor::Compressor (unsigned int RasterSize, bool useseed) : SeedRow(NULL), UseSeedRow(useseed), inputsize(RasterSize), seeded(false)
+{
+ constructor_error = NO_ERROR;
+ iRastersReady = 0;
+
+ originalKData = (BYTE *) new BYTE[RasterSize+1];
+
+ CNEWCHECK(originalKData);
+
+ if (!UseSeedRow)
+ return;
+
+ SeedRow = (BYTE *) new BYTE[RasterSize];
+ CNEWCHECK(SeedRow);
+}
+
+Compressor::~Compressor()
+{
+ if (compressBuf)
+ {
+ delete [] compressBuf;
+ }
+ if (SeedRow)
+ {
+ delete [] SeedRow;
+ }
+ if (originalKData)
+ {
+ delete [] originalKData;
+ }
+}
+
+unsigned int Compressor::GetMaxOutputWidth()
+{
+ if (compressedsize != 0)
+ {
+ return compressedsize;
+ }
+ else
+ {
+ return raster.rastersize[COLORTYPE_COLOR];
+ }
+}
+
diff --git a/prnt/hpcups/Compressor.h b/prnt/hpcups/Compressor.h
new file mode 100644
index 0000000..adc281d
--- /dev/null
+++ b/prnt/hpcups/Compressor.h
@@ -0,0 +1,60 @@
+/*****************************************************************************\
+ Compressor.h : Interface for Compressor class
+
+ Copyright (c) 1996 - 2009, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+#ifndef COMPRESSOR_H
+#define COMPRESSOR_H
+
+#include "Processor.h"
+#include "CommonDefinitions.h"
+
+class Compressor : public Processor
+{
+public:
+ Compressor(unsigned int RasterSize, bool useseed);
+ virtual ~Compressor();
+ virtual bool Process(RASTERDATA* InputRaster=NULL)=0;
+ virtual void Flush() { } // no pending output
+ unsigned int GetMaxOutputWidth();
+ virtual bool NextOutputRaster(RASTERDATA& next_raster)=0;
+ void SetSeedRow(BYTE* seed) { SeedRow = seed; }
+ DRIVER_ERROR constructor_error;
+
+ // buffer is public for use by GraphicsTranslator
+ BYTE* compressBuf; // output buffer
+ BYTE* SeedRow;
+ bool UseSeedRow;
+ BYTE* originalKData;
+ unsigned int compressedsize;
+ unsigned int inputsize;
+ bool seeded;
+}; // Compressor
+
+#endif // COMPRESSOR_H
+
diff --git a/prnt/hpcups/Encapsulator.cpp b/prnt/hpcups/Encapsulator.cpp
new file mode 100644
index 0000000..530fb96
--- /dev/null
+++ b/prnt/hpcups/Encapsulator.cpp
@@ -0,0 +1,283 @@
+/*****************************************************************************\
+ Encapsulator.cpp : Encapsulator class implementation
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+#include "CommonDefinitions.h"
+#include "Encapsulator.h"
+#include "PrinterCommands.h"
+
+Encapsulator::Encapsulator()
+{
+ page_number = 0;
+ pcl_buffer = NULL;
+ cur_pcl_buffer_size = 0;
+ m_pJA = NULL;
+ m_pMA = NULL;
+ m_pQA = NULL;
+}
+Encapsulator::~Encapsulator()
+{
+ if (pcl_buffer) {
+ delete [] pcl_buffer;
+ }
+}
+
+DRIVER_ERROR Encapsulator::StartJob(SystemServices *pSystemServices, JobAttributes *pJA)
+{
+ DRIVER_ERROR err = NO_ERROR;
+
+ m_pSystemServices = pSystemServices;
+
+ m_pJA = pJA;
+ m_pMA = &pJA->media_attributes;
+ m_pQA = &pJA->quality_attributes;
+
+ cur_pcl_buffer_size = PCL_BUFFER_SIZE;
+ pcl_buffer = new BYTE[cur_pcl_buffer_size + 2];
+ if (pcl_buffer == NULL) {
+ return ALLOCMEM_ERROR;
+ }
+ memset(pcl_buffer, 0, cur_pcl_buffer_size);
+ cur_pcl_buffer_ptr = pcl_buffer;
+
+ err = flushPrinterBuffer();
+
+ struct tm *t;
+ time_t long_time;
+ time(&long_time);
+ t = localtime(&long_time);
+
+ addToHeader(Reset, sizeof(Reset));
+ addToHeader(UEL, sizeof(UEL));
+
+// Now add other header info
+
+ if (jobAttrPJLAllowed())
+ {
+ addToHeader("@PJL SET STRINGCODESET=UTF8\012");
+ addToHeader("@PJL COMMENT=\"Job Start Time: %s\"\012", m_pJA->job_start_time);
+ addToHeader("@PJL JOBNAME=\"%s\"\012", m_pJA->job_title);
+ addToHeader("@PJL SET JOBNAME=\"%s\"\012", m_pJA->job_title);
+ addToHeader("@PJL COMMENT=\"%s; %s; %s; %s\"\012",
+ m_pJA->printer_name, m_pJA->os_name, m_pJA->driver_name, m_pJA->driver_version);
+ addToHeader("@PJL COMMENT=\"Username: %s; App Filename: %s; %d-%d-%d\"\012",
+ m_pJA->user_name, m_pJA->job_title, t->tm_mon + 1, t->tm_mday, t->tm_year + 1900);
+ addToHeader("@PJL SET JOBATTR=\"JobAcct1=%s\"\012", m_pJA->user_name);
+ addToHeader("@PJL SET JOBATTR=\"JobAcct2=%s\"\012", m_pJA->host_name);
+ addToHeader("@PJL SET JOBATTR=\"JobAcct3=%s\"\012", m_pJA->domain_name);
+ addToHeader("@PJL SET JOBATTR=\"JobAcct4=%4d%02d%02d%02d%02d%02d\"\012",
+ t->tm_year + 1900, t->tm_mon + 1, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec);
+ addToHeader("@PJL SET JOBATTR=\"JobAcct5=%s\"\012", m_pJA->uuid);
+
+ // Add start of job time stamp to the header
+ addToHeader("@PJL SET TIMESTAMP=%4d%02d%02d%02d%02d%02d\012",
+ t->tm_year + 1900, t->tm_mon + 1, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec);
+ addToHeader("@PJL SET JOBATTR=\"JobAcct6=Spooler Subsystem App\"\012");
+ addToHeader("@PJL SET JOBATTR=\"JobAcct7=\"%s\"\012", m_pJA->job_title);
+ addToHeader("@PJL SET JOBATTR=\"JobAcct8=\"%s\"\012", m_pJA->user_name);
+ addToHeader("@PJL SET JOBATTR=\"JobAcct9=(null)\"\012");
+
+ addToHeader("@PJL SET USERNAME=\"%s\"\012", m_pJA->user_name);
+ }
+
+// Add platform specific PJL here
+ addJobSettings();
+
+ return err;
+}
+
+DRIVER_ERROR Encapsulator::Send(const BYTE *pBuffer, int length)
+{
+ DRIVER_ERROR err;
+// Dont' have any buffer allocated, just send the incoming data to the device
+ if (pcl_buffer == NULL) {
+ return sendBuffer(pBuffer, length);
+ }
+
+// Add the incoming data to the printer data buffer if there is enough room, otherwise, flush the buffer
+
+ if (cur_pcl_buffer_ptr + length > (pcl_buffer + cur_pcl_buffer_size)) {
+ err = sendBuffer(static_cast<const BYTE *>(pcl_buffer), (cur_pcl_buffer_ptr - pcl_buffer));
+ if (err != NO_ERROR)
+ return err;
+ cur_pcl_buffer_ptr = pcl_buffer;
+ }
+
+ if (length < cur_pcl_buffer_size) {
+ memcpy(cur_pcl_buffer_ptr, pBuffer, length);
+ cur_pcl_buffer_ptr += length;
+ }
+ else {
+ err = sendBuffer(pBuffer, length);
+ }
+ return NO_ERROR;
+} // Send
+
+void Encapsulator::addToHeader(const BYTE *command_string, int length)
+{
+ memcpy(cur_pcl_buffer_ptr, command_string, length);
+ cur_pcl_buffer_ptr += length;
+}
+
+void Encapsulator::addToHeader(const char *fmt, ...)
+{
+ va_list args;
+ int n;
+ va_start(args, fmt);
+ int size = cur_pcl_buffer_size - (cur_pcl_buffer_ptr - pcl_buffer);
+
+ n = vsnprintf((char *) cur_pcl_buffer_ptr, size - 1, fmt, args);
+ cur_pcl_buffer_ptr += n;
+ va_end(args);
+}
+
+DRIVER_ERROR Encapsulator::sendBuffer(const BYTE *pBuffer, int length)
+{
+ DRIVER_ERROR err;
+ if (length == 0) {
+ return NO_ERROR;
+ }
+ err = m_pSystemServices->Send(pBuffer, length);
+ return err;
+}
+
+DRIVER_ERROR Encapsulator::Cleanup()
+{
+ DRIVER_ERROR err = NO_ERROR;
+ if (pcl_buffer && cur_pcl_buffer_ptr - pcl_buffer > 0)
+ {
+ err = sendBuffer(static_cast<const BYTE *>(pcl_buffer), (cur_pcl_buffer_ptr - pcl_buffer));
+ }
+ cur_pcl_buffer_ptr = pcl_buffer;
+ return err;
+}
+
+DRIVER_ERROR Encapsulator::FormFeed()
+{
+ DRIVER_ERROR err;
+ err = this->Send((const BYTE *) "\x1B*rC\x0C", 5);
+ if (err == NO_ERROR) {
+ return Cleanup();
+ }
+ return err;
+}
+
+DRIVER_ERROR Encapsulator::SendCAPy(int iOffset)
+{
+ DRIVER_ERROR err = NO_ERROR;
+ char str[12];
+ sprintf(str, "\x1b*b%dY", iOffset);
+ err = this->Send ((const BYTE *) str, strlen(str));
+ return err;
+}
+
+DRIVER_ERROR Encapsulator::EndJob()
+{
+ DRIVER_ERROR err = NO_ERROR;
+ err = m_pSystemServices->Send(Reset, sizeof(Reset));
+ if (err == NO_ERROR)
+ err = m_pSystemServices->Send(UEL, sizeof(UEL));
+ return err;
+}
+
+void Encapsulator::CancelJob()
+{
+ BYTE buffer[4098];
+ memset(buffer, 0x0, sizeof(buffer));
+ memcpy(buffer+4087, "\x1B%-12345X", 9);
+
+// This sequence is good for PCL3 printers. Update this for non-PCL printers.
+
+ m_pSystemServices->Send((const BYTE *) buffer, 4096);
+}
+
+// Used only by LJMono and LJColor
+
+void Encapsulator::sendJobHeader()
+{
+ char szStr[256];
+ int top_margin = 0;
+
+// Set media source, type, size and quality modes.
+// Duplex and portrait mode - <ESC>&l<n>s, <ESC>&l0o
+
+ addToHeader("\033&l%dh%dm%da%ds8c0o0E\033*o%dM", m_pJA->media_source, m_pQA->media_type,
+ m_pMA->pcl_id, m_pJA->e_duplex_mode, m_pQA->print_quality);
+
+ addToHeader("\033&u%dD\033*t%dR\033*r%dS", m_pQA->horizontal_resolution, m_pQA->vertical_resolution, m_pMA->printable_width);
+
+/*
+ * Custom papersize command
+ */
+
+ if (m_pMA->pcl_id == CUSTOM_MEDIA_SIZE) {
+ short sWidth, sHeight;
+ BYTE b1, b2;
+ sWidth = static_cast<short>(m_pMA->physical_width);
+ sHeight = static_cast<short>(m_pMA->physical_height);
+ memcpy (szStr, "\x1B*o5W\x0E\x05\x00\x00\x00\x1B*o5W\x0E\x06\x00\x00\x00", 20);
+ b1 = (BYTE) ((sWidth & 0xFF00) >> 8);
+ b2 = (BYTE) (sWidth & 0xFF);
+ szStr[8] = b1;
+ szStr[9] = b2;
+ b1 = (BYTE) ((sHeight & 0xFF00) >> 8);
+ b2 = (BYTE) (sHeight & 0xFF);
+ szStr[18] = b1;
+ szStr[19] = b2;
+ addToHeader((const BYTE *) szStr, 20);
+ }
+
+ const BYTE *pgrafMode = grafMode2;
+ if (m_pJA->color_mode == 0)
+ {
+ configureRasterData();
+ pgrafMode = grafMode3;
+ }
+
+ addToHeader((const BYTE *) grafStart, sizeof(grafStart));
+ addToHeader((const BYTE *) pgrafMode, 5);
+ addToHeader((const BYTE *) seedSame, sizeof(seedSame));
+
+ top_margin = m_pMA->printable_start_y - ((m_pJA->mech_offset * m_pQA->actual_vertical_resolution)/1000);
+ int left_margin = 0;
+ if (m_pJA->integer_values[1] > 0)
+ {
+ left_margin = ((m_pJA->integer_values[1] * m_pQA->horizontal_resolution) / 100 - m_pMA->printable_width) / 2;
+ }
+ addToHeader("\x1b*p%dx%dY", left_margin, top_margin);
+
+ return;
+}
+
+
+DRIVER_ERROR Encapsulator::preProcessRasterData(cups_raster_t **cups_raster, cups_page_header2_t* firstpage_cups_header, char* pSwapedPagesFileName)
+{
+ dbglog ("DEBUG: Encapsulator::preProcessRasterData.............. \n");
+ return NO_ERROR;
+}
+
diff --git a/prnt/hpcups/Encapsulator.h b/prnt/hpcups/Encapsulator.h
new file mode 100644
index 0000000..50587bc
--- /dev/null
+++ b/prnt/hpcups/Encapsulator.h
@@ -0,0 +1,91 @@
+/*****************************************************************************\
+ Encapsulator.h : Interface for the Encapsulator class
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+#ifndef ENCAPSULATOR_H
+#define ENCAPSULATOR_H
+
+#include "CommonDefinitions.h"
+#include "SystemServices.h"
+#include "Pipeline.h"
+
+class Encapsulator
+{
+public:
+ Encapsulator();
+ virtual ~Encapsulator();
+ virtual DRIVER_ERROR StartJob (SystemServices *pSystemServices, JobAttributes *pJA);
+ virtual DRIVER_ERROR EndJob ();
+ virtual DRIVER_ERROR FormFeed ();
+ virtual DRIVER_ERROR SendCAPy (int iOffset);
+ virtual DRIVER_ERROR Encapsulate (RASTERDATA *InputRaster, bool bLastPlane) = 0;
+ virtual DRIVER_ERROR Send(const BYTE *pBuffer, int length);
+ virtual DRIVER_ERROR StartPage(JobAttributes *pJA) = 0;
+ virtual DRIVER_ERROR Cleanup();
+ virtual DRIVER_ERROR Configure(Pipeline **pipeline) = 0;
+ virtual bool CanSkipRasters() {return true;}
+ virtual void SetLastBand() {}
+ virtual bool UnpackBits() {return true;}
+ virtual void CancelJob();
+ virtual DRIVER_ERROR preProcessRasterData(cups_raster_t **cups_raster, cups_page_header2_t* firstpage_cups_header, char* pSwapedPagesFileName);
+
+protected:
+ void addToHeader(const BYTE *command_string, int length);
+ void addToHeader(const char *fmt, ...);
+ DRIVER_ERROR sendBuffer(const BYTE *pBuffer, int length);
+ virtual DRIVER_ERROR addJobSettings()
+ {
+ cur_pcl_buffer_ptr += sprintf((char *) cur_pcl_buffer_ptr, "@PJL ENTER LANGUAGE=%s\012", m_szLanguage);
+ return NO_ERROR;
+ }
+ virtual DRIVER_ERROR flushPrinterBuffer()
+ {
+ return m_pSystemServices->Send((const BYTE *) pcl_buffer, 10000);
+ }
+ virtual bool jobAttrPJLAllowed() {return false;}
+ virtual bool needPJLHeaders(JobAttributes *pJA)
+ {
+ return true;
+ }
+ virtual void configureRasterData() {}
+ void sendJobHeader();
+
+ SystemServices *m_pSystemServices;
+ int page_number;
+ int cur_pcl_buffer_size;
+ BYTE *pcl_buffer;
+ BYTE *cur_pcl_buffer_ptr;
+ char m_szLanguage[16];
+
+ JobAttributes *m_pJA;
+ MediaAttributes *m_pMA;
+ QualityAttributes *m_pQA;
+};
+#endif // ENCAPSULATOR_H
+
diff --git a/prnt/hpcups/EncapsulatorFactory.cpp b/prnt/hpcups/EncapsulatorFactory.cpp
new file mode 100644
index 0000000..db38796
--- /dev/null
+++ b/prnt/hpcups/EncapsulatorFactory.cpp
@@ -0,0 +1,99 @@
+/*****************************************************************************\
+ EncapsulatorFactory.cpp : Implementation of EncapsulatorFactory class
+
+ Copyright (c) 1996 - 2009, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+#include "CommonDefinitions.h"
+#include "EncapsulatorFactory.h"
+#include "Encapsulator.h"
+#include "Pcl3.h"
+#include "Pcl3Gui.h"
+#include "Pcl3Gui2.h"
+#include "LJMono.h"
+#include "LJColor.h"
+#include "LJFastRaster.h"
+#include "LJZjStream.h"
+#include "LJZxStream.h"
+#include "QuickConnect.h"
+#include "LJJetReady.h"
+#include "Lidil.h"
+#include <string.h>
+
+Encapsulator *EncapsulatorFactory::GetEncapsulator (char *encap_tech)
+{
+ if (encap_tech == NULL) {
+ return NULL;
+ }
+
+ if (!strcmp (encap_tech, "pcl3"))
+ {
+ return new Pcl3();
+ }
+ if (!strcmp (encap_tech, "pcl3gui"))
+ {
+ return new Pcl3Gui();
+ }
+ if (!strcmp (encap_tech, "pcl3gui2"))
+ {
+ return new Pcl3Gui2();
+ }
+ if (!strcmp (encap_tech, "ljmono"))
+ {
+ return new LJMono();
+ }
+ if (!strcmp (encap_tech, "ljcolor"))
+ {
+ return new LJColor();
+ }
+ if (!strcmp (encap_tech, "ljfastraster"))
+ {
+ return new LJFastRaster();
+ }
+ if (!strcmp (encap_tech, "ljzjstream"))
+ {
+ return new LJZjStream();
+ }
+ if (!strcmp (encap_tech, "ljzxstream"))
+ {
+ return new LJZxStream();
+ }
+ if (!strcmp (encap_tech, "quickconnect"))
+ {
+ return new QuickConnect();
+ }
+ if (!strcmp (encap_tech, "ljjetready"))
+ {
+ return new LJJetReady();
+ }
+ if (!strcmp (encap_tech, "lidil"))
+ {
+ return new Lidil();
+ }
+ return NULL;
+}
+
diff --git a/prnt/hpcups/EncapsulatorFactory.h b/prnt/hpcups/EncapsulatorFactory.h
new file mode 100644
index 0000000..bfed3cc
--- /dev/null
+++ b/prnt/hpcups/EncapsulatorFactory.h
@@ -0,0 +1,44 @@
+/*****************************************************************************\
+ EncapsulatorFactory.h : Interface for the EncapsulatorFactory class
+
+ Copyright (c) 1996 - 2009, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+#ifndef ENCAPSULATORFACTORY_H
+#define ENCAPSULATORFACTORY_H
+
+#include "CommonDefinitions.h"
+#include "Pipeline.h"
+#include "Encapsulator.h"
+
+class EncapsulatorFactory
+{
+public:
+ static Encapsulator *GetEncapsulator (char *encap_tech);
+};
+#endif // ENCAPSULATORFACTORY_H
+
diff --git a/prnt/hpcups/ErnieFilter.cpp b/prnt/hpcups/ErnieFilter.cpp
new file mode 100644
index 0000000..c7cf0b6
--- /dev/null
+++ b/prnt/hpcups/ErnieFilter.cpp
@@ -0,0 +1,2037 @@
+////////////////////////////////////////////////////////////////////////////////
+// Copyright (c) 1996 - 2008, Hewlett-Packard Development Company, L.P.
+// All rights reserved.
+//
+// This software is licensed solely for use with HP products. Redistribution
+// and use with HP products in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// - Redistributions of source code must retain the above copyright notice,
+// this list of conditions and the following disclaimer.
+// - Redistributions in binary form must reproduce the above copyright
+// notice, this list of conditions and the following disclaimer in the
+// documentation and/or other materials provided with the distribution.
+// - Neither the name of Hewlett-Packard nor the names of its contributors
+// may be used to endorse or promote products derived from this software
+// without specific prior written permission.
+// - Redistributors making defect corrections to source code grant to
+// Hewlett-Packard the right to use and redistribute such defect
+// corrections.
+//
+// This software contains technology licensed from third parties; use with
+// non-HP products is at your own risk and may require a royalty.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL HEWLETT-PACKARD OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+////////////////////////////////////////////////////////////////////////////////
+
+
+
+// copied from vob \di_research on 10/31/00
+// MODIFICATIONS BY GE:
+// 0. remove Windows header references
+// 1. define assert
+// 2. set iRastersReady, iRastersDelivered in submitrowtofilter
+// 3. (constructor) allocate (and delete in destructor) buffers for m_row_ptrs
+// (instead of setting it to input buffers, since we reuse input buffers)
+// 4. copy data into m_row_ptrs in submitrowtofilter
+
+//#define assert ASSERT
+
+#include "ErnieFilter.h"
+
+
+#if defined(__APPLE__) || defined(__linux)
+#include <math.h>
+#endif
+
+
+#if kGatherStats == 1
+extern int blockStats[];
+#endif
+
+#if ((kMemWritesOptimize != 1) && (kMemWritesOptimize != 0))
+#error "kMemWritesOptimize must be 0 or 1"
+#endif
+
+inline void AverageNRound(bool roundGreenDown, int &rFinal, int &r0, int &r1, int &gFinal, int &g0, int &g1, int &bFinal, int &b0, int &b1);
+inline void AverageNRound(bool roundGreenDown, int &rFinal, int &r0, int &r1, int &gFinal, int &g0, int &g1, int &bFinal, int &b0, int &b1)
+{
+ // By rounding G in the other direction than R and B L* variations are minimized while mathematically alternate rounding is accomplished. EGW 2 Dec. 1999.
+ if (roundGreenDown)
+ {
+ rFinal = (r0 + r1 + 1) / 2;
+ gFinal = (g0 + g1) / 2;
+ bFinal = (b0 + b1 + 1) / 2;
+ }
+ else
+ {
+ rFinal = (r0 + r1) / 2;
+ gFinal = (g0 + g1 + 1) / 2;
+ bFinal = (b0 + b1) / 2;
+ }
+}
+
+
+// Filter1RawRow. To be used to filter an odd row for which we don't have a pair,
+// found at the bottom of bands that aren't divisable by 2. This routine
+// filters its row horizontally forming 4x1 and 2x1 blocks.
+void ErnieFilter::Filter1RawRow(unsigned char *currPtr, int rowWidthInPixels, unsigned int *flagsPtr)
+{
+ ASSERT(currPtr);
+ ASSERT(rowWidthInPixels > 0);
+
+ int R0, G0, B0, R1, G1, B1, lastR, lastG, lastB;
+ const unsigned int maxErrorForFourPixels = m_max_error_for_two_pixels / 2;
+// const unsigned int maxErrorForEightPixels = maxErrorForFourPixels / 2;
+
+// int currPixel, lastPixel;
+ uint32_t currPixel, lastPixel;
+ bool lastPairAveraged = false;
+ bool last2by2Averaged = false;
+
+
+ for (int pixelNum = 0; pixelNum < rowWidthInPixels; pixelNum++)
+ {
+ if ((pixelNum & 0x03) == 0x00) // 0,4,8...
+ {
+ last2by2Averaged = false; // Reinitialize every four columns;
+ }
+
+ currPixel = get4Pixel(currPtr);
+
+ flagsPtr[0] = (e11n|e11s); // Initialize in case nothing is found for this column
+
+ if (isWhite(currPixel))
+ {
+ flagsPtr[0] = eDone;
+#if kGatherStats == 1
+ blockStats[esWhiteFound]++;
+#endif
+ }
+
+ // Currently we bail entirely if there is white. Later we may still do RLE on the non white pixel if one is present.
+ if (flagsPtr[0] == (e11n|e11s))
+ {
+ R1 = GetRed(currPixel);
+ G1 = GetGreen(currPixel);
+ B1 = GetBlue(currPixel);
+
+ // Can only horizontally average every other pixel, much like the 2x2 blocks.
+ if (isOdd(pixelNum))
+ {
+ // do horizontal on current raster
+ lastPixel = get4Pixel(currPtr,-1);
+ lastR = GetRed(lastPixel);
+ lastG = GetGreen(lastPixel);
+ lastB = GetBlue(lastPixel);
+ if ((m_max_error_for_two_pixels >= 3) && (NewDeltaE(lastR, R1, lastG, G1, lastB, B1, m_max_error_for_two_pixels)))
+ {
+ /* - -
+ | | build 2x1
+ - -
+ */
+ int didNotBuild4by1 = true;
+#if kGatherStats == 1
+ blockStats[es21nw]++;
+#endif
+ AverageNRound(isOdd(pixelNum), lastR, lastR, R1, lastG, lastG, G1, lastB, lastB, B1);
+ if ((pixelNum >= 3) && (flagsPtr[-3] & e21nw)) // 4,5,6,7,12,13,14,15,20...
+ {
+ // Look for a 4x1
+ ASSERT(!((flagsPtr[-3] | flagsPtr[-2] | flagsPtr[-1] | flagsPtr[0]) & eTheRest)); // no vertical blocks
+
+ lastPixel = get4Pixel(currPtr,-3);
+ R0 = GetRed(lastPixel);
+ G0 = GetGreen(lastPixel);
+ B0 = GetBlue(lastPixel);
+ if ((maxErrorForFourPixels >= 3) && (NewDeltaE(lastR, R0, lastG, G0, lastB, B0, maxErrorForFourPixels)))
+ {
+ /* - - - -
+ | | build 4x1
+ - - - -
+ */
+#if kGatherStats == 1
+ blockStats[es41ni]++;
+#endif
+ didNotBuild4by1 = false;
+ AverageNRound((pixelNum & 0x04)== 0x04, lastR, lastR, R0, lastG, lastG, G0, lastB, lastB, B0); // 4,5,6,7,12,13,14,15,20...
+
+ if(m_eEndian == LITTLEENDIAN)
+ currPixel = (lastR<<16) + (lastG<<8) + lastB;
+ else if(m_eEndian == BIGENDIAN)
+ currPixel = (lastR<<24) + (lastG<<16) + (lastB<<8);
+
+#if kMemWritesOptimize == 0
+ put4Pixel(currPtr, -3, currPixel);
+ put4Pixel(currPtr, -2, currPixel);
+ put4Pixel(currPtr, -1, currPixel);
+ put4Pixel(currPtr, 0, currPixel);
+#else
+ put4Pixel(currPtr, -3, currPixel);
+#endif
+ flagsPtr[-3] = (flagsPtr[-3] & ~eNorths) | e41ni;
+ flagsPtr[-2] = (flagsPtr[-2] & ~eNorths) | e41n;
+ flagsPtr[-1] = (flagsPtr[-1] & ~eNorths) | e41n;
+ flagsPtr[0] = (flagsPtr[0] & ~eNorths) | e41n;
+ }
+ }
+
+ if (didNotBuild4by1) // Not a 4x1 so output 2x1.
+ {
+ ASSERT(!((flagsPtr[-1] | flagsPtr[0]) & eTheRest)); // no vertical blocks
+
+ if(m_eEndian == LITTLEENDIAN)
+ currPixel = (lastR<<16) + (lastG<<8) + lastB;
+ else if(m_eEndian == BIGENDIAN)
+ currPixel = (lastR<<24) + (lastG<<16) + (lastB<<8);
+
+#if kMemWritesOptimize == 0
+ put4Pixel(currPtr, -1, currPixel);
+ put4Pixel(currPtr, 0, currPixel);
+#else
+ put4Pixel(currPtr, -1, currPixel);
+#endif
+ flagsPtr[-1] = (flagsPtr[-1] & ~eNorths) | e21nw;
+ flagsPtr[0] = (flagsPtr[0] & ~eNorths) | e21ne;
+ }
+ } // If DeltaE... Looking for two by one
+ } // IsOdd(pixelNum)
+ }
+ else // no flag bits set.
+ {
+ lastPairAveraged = false; // EGW Fixes bug on business graphics. 11/24/97
+ }
+
+ currPtr += eBufferedPixelWidthInBytes;
+ flagsPtr++;
+ } // for each pixel...
+}
+
+// Filter2RawRows: Looks filter two raw rows together to form blocks. Vertical
+// blocks are prefered over horizontal ones. The routine will create 1x2 blocks
+// before it will create 4x1's. In total this routine will create 1x2, 2x2, 4x2,
+// 4x1, and 2x1 blocks sizes, with the potential for two seperate 4x1's or 2x1's
+// in the upper and lower rasters.
+void ErnieFilter::Filter2RawRows(unsigned char *currPtr, unsigned char *upPtr, int rowWidthInPixels, unsigned int *flagsPtr)
+{
+ ASSERT(currPtr);
+ ASSERT(upPtr);
+ ASSERT(rowWidthInPixels > 0);
+
+ int R0, G0, B0, R1, G1, B1, lastR, lastG, lastB;
+ const unsigned int maxErrorForFourPixels = m_max_error_for_two_pixels / 2;
+ const unsigned int maxErrorForEightPixels = maxErrorForFourPixels / 2;
+
+// int currPixel, upPixel, lastPixel;
+ uint32_t currPixel, upPixel, lastPixel;
+ bool lastPairAveraged = false;
+ bool last2by2Averaged = false;
+
+ for (int pixelNum = 0; pixelNum < rowWidthInPixels; pixelNum++)
+ {
+ if ((pixelNum & 0x03) == 0x00) // 0,4,8...
+ {
+ last2by2Averaged = false; // Reinitialize every four columns;
+ }
+
+ upPixel = get4Pixel(upPtr);
+ currPixel = get4Pixel(currPtr);
+
+ flagsPtr[0] = (e11n|e11s); // Initialize in case nothing is found for this column
+
+ if (isWhite(upPixel) && isWhite(currPixel)) // both white?
+ {
+ flagsPtr[0] = eDone;
+#if kGatherStats == 1
+ blockStats[esWhiteFound]++;
+#endif
+ }
+
+ // Do vertical average on the current 2 pixel high column
+
+ // Currently we bail entirely if there is white. Later we may still do RLE on the non white pixel if one is present.
+ if (flagsPtr[0] == (e11n|e11s))
+ {
+ R1 = GetRed(currPixel);
+ G1 = GetGreen(currPixel);
+ B1 = GetBlue(currPixel);
+
+ R0 = GetRed(upPixel);
+ G0 = GetGreen(upPixel);
+ B0 = GetBlue(upPixel);
+
+ if ((m_max_error_for_two_pixels >= 3) && (NewDeltaE(R0, R1, G0, G1, B0, B1, m_max_error_for_two_pixels)))
+ {
+ /* _
+ | | build 1x2
+ | |
+ -
+ */
+ ASSERT(flagsPtr[0] == (e11n|e11s));
+ flagsPtr[0] = e12;
+#if kGatherStats == 1
+ blockStats[es12]++;
+#endif
+ R1 = GetRed(currPixel);
+ G1 = GetGreen(currPixel);
+ B1 = GetBlue(currPixel);
+
+ R0 = GetRed(upPixel);
+ G0 = GetGreen(upPixel);
+ B0 = GetBlue(upPixel);
+
+ AverageNRound(isOdd(pixelNum), R1, R1, R0, G1, G1, G0, B1, B1, B0);
+
+ // look for a 2x2 block average on every other column
+ if (isOdd(pixelNum))
+ { // It looks like we are at the end of a 2x2 block
+ if (lastPairAveraged)
+ {
+ // Last pair was averaged so it's ok to try to make a 2x2 block
+ if ((maxErrorForFourPixels >= 3) && (NewDeltaE(lastR, R1, lastG, G1,lastB, B1, maxErrorForFourPixels)))
+ {
+ /* - -
+ | | build 2x2
+ | |
+ - -
+ */
+ ASSERT(flagsPtr[-1] == e12);
+ int didNotBuild4by2 = true;
+#if kGatherStats == 1
+ blockStats[es22w]++;
+#endif
+ flagsPtr[-1] = e22w;
+ flagsPtr[0] = e22e;
+
+ AverageNRound((pixelNum & 0x02) == 0x02, R1, R1, lastR, G1, G1, lastG, B1, B1, lastB); // 2,3,6,7... Alternate between rounding up and down for these 2x2 blocks
+
+ if ((pixelNum & 0x03) == 0x03) // 3,7,11,15... Looking for a 4x2 block to average
+ {
+ if (last2by2Averaged)
+ {
+ /* - - - -
+ | | | | We have two 2x2s.
+ | | | |
+ - - - -
+ */
+
+ lastPixel = get4Pixel(upPtr, -3); // Go back to previous 2x2 block and get the pixel
+ lastR = GetRed(lastPixel);
+ lastG = GetGreen(lastPixel);
+ lastB = GetBlue(lastPixel);
+ if ((maxErrorForEightPixels >= 3) && (NewDeltaE(lastR, R1, lastG, G1,lastB, B1, maxErrorForEightPixels)))
+ {
+
+
+ /* - - - -
+ | | build 4x2.
+ | |
+ - - - -
+ */
+#if kGatherStats == 1
+ blockStats[es42i]++;
+#endif
+ didNotBuild4by2 = false;
+
+ flagsPtr[-3] = e42i;
+ flagsPtr[-2] = flagsPtr[-1] = flagsPtr[0] = e42;
+
+ AverageNRound((pixelNum & 0x04) == 0x04, R1, R1, lastR, G1, G1, lastG, B1, B1, lastB); // 4,5,6,7,12,13,14,15,20... Alternate between rounding up down for these 4x2 blocks
+
+ if(m_eEndian == LITTLEENDIAN)
+ currPixel = (R1<<16) + (G1<<8) + B1;
+ else if(m_eEndian == BIGENDIAN)
+ currPixel = (R1<<24) + (G1<<16) + (B1<<8);
+
+#if kMemWritesOptimize == 0
+ put4Pixel(upPtr, -3, currPixel);
+ put4Pixel(upPtr, -2, currPixel);
+ put4Pixel(upPtr, -1, currPixel);
+ put4Pixel(upPtr, 0, currPixel);
+ put4Pixel(currPtr, -3, currPixel);
+ put4Pixel(currPtr, -2, currPixel);
+ put4Pixel(currPtr, -1, currPixel);
+ put4Pixel(currPtr, 0, currPixel);
+#else
+ put4Pixel(upPtr, -3, currPixel);
+#endif
+ }
+ }
+
+ if (didNotBuild4by2)
+ { // The first 2x2 block of this pair of 2x2 blocks wasn't averaged.
+ /* - - - -
+ |X X| | | not averaged block and averaged 2x2.
+ |X X| | |
+ - - - -
+ */
+
+ last2by2Averaged = true;
+
+ if(m_eEndian == LITTLEENDIAN)
+ currPixel = (R1<<16) + (G1<<8) + B1;
+ else if(m_eEndian == BIGENDIAN)
+ currPixel = (R1<<24) + (G1<<16) + (B1<<8);
+
+#if kMemWritesOptimize == 0
+ put4Pixel(upPtr, -1, currPixel);
+ put4Pixel(upPtr, 0, currPixel);
+ put4Pixel(currPtr, -1, currPixel);
+ put4Pixel(currPtr, 0, currPixel);
+#else
+ put4Pixel(upPtr, -1, currPixel);
+#endif
+ }
+ }
+ else // Not looking for a 4x2 block yet so just output this 2x2 block for now.
+ {
+ /* - - - -
+ | | |? ?| 1st 2x2 and maybe another later.
+ | | |? ?|
+ - - - -
+ */
+
+ last2by2Averaged = true;
+
+ if(m_eEndian == LITTLEENDIAN)
+ currPixel = (R1<<16) + (G1<<8) + B1;
+ else if(m_eEndian == BIGENDIAN)
+ currPixel = (R1<<24) + (G1<<16) + (B1<<8);
+
+#if kMemWritesOptimize == 0
+ put4Pixel(upPtr, -1, currPixel);
+ put4Pixel(upPtr, 0, currPixel);
+ put4Pixel(currPtr, -1, currPixel);
+ put4Pixel(currPtr, 0, currPixel);
+#else
+ put4Pixel(upPtr, -1, currPixel);
+#endif
+ }
+ }
+ else // The two averaged columns are not close enough in Delta E
+ {
+ /* - _
+ | | | | 2 1x2 blocks
+ | | | |
+ - -
+ */
+
+ last2by2Averaged = false;
+
+ if(m_eEndian == LITTLEENDIAN)
+ currPixel = (R1<<16) + (G1<<8) + B1;
+ else if(m_eEndian == BIGENDIAN)
+ currPixel = (R1<<24) + (G1<<16) + (B1<<8);
+
+#if kMemWritesOptimize == 0
+ put4Pixel(upPtr, 0, currPixel);
+ put4Pixel(currPtr, 0, currPixel);
+#else
+ put4Pixel(upPtr,0, currPixel);
+#endif
+ }
+ lastR = R1;
+ lastG = G1;
+ lastB = B1;
+ lastPairAveraged = true;
+ }
+ else // This is the right place for 2x2 averaging but the previous column wasn't averaged
+ {
+ /* -
+ X | | Two non averaged pixels and a 1x2.
+ X | |
+ -
+ */
+ last2by2Averaged = false;
+ lastPairAveraged = true;
+ lastR = R1;
+ lastG = G1;
+ lastB = B1;
+
+ if(m_eEndian == LITTLEENDIAN)
+ currPixel = (R1<<16) + (G1<<8) + B1;
+ else if(m_eEndian == BIGENDIAN)
+ currPixel = (R1<<24) + (G1<<16) + (B1<<8);
+
+#if kMemWritesOptimize == 0
+ put4Pixel(upPtr, 0, currPixel);
+ put4Pixel(currPtr, 0, currPixel);
+#else
+ put4Pixel(upPtr, 0, currPixel);
+#endif
+ }
+ }
+ else // Not on the boundary for a 2x2 block, so just output current averaged 1x2 column
+ {
+ /* -
+ | | ? 1x2
+ | | ?
+ -
+ */
+
+ lastPairAveraged = true;
+ lastR = R1;
+ lastG = G1;
+ lastB = B1;
+
+ if(m_eEndian == LITTLEENDIAN)
+ currPixel = (R1<<16) + (G1<<8) + B1;
+ else if(m_eEndian == BIGENDIAN)
+ currPixel = (R1<<24) + (G1<<16) + (B1<<8);
+
+#if kMemWritesOptimize == 0
+ put4Pixel(upPtr, 0, currPixel);
+ put4Pixel(currPtr, 0, currPixel);
+#else
+ put4Pixel(upPtr, 0, currPixel);
+#endif
+ }
+ }
+ else if (lastPairAveraged)
+ { // This is the case where we can't average current column and the last column was averaged.
+ // Don't do anything if last pair was averaged and this one can't be
+
+ /* -
+ | | X 1x2 averaged block and two non averaged pixels.
+ | | X
+ -
+ */
+
+ lastPairAveraged = false;
+ }
+ else
+ // can't vertically average current column so look for some horizontal averaging as a fallback
+ // Only do it if the last pair wasn't averaged either because we don't want to mess up a vertical averaging
+ // just to create a possible horizontal averaging.
+ {
+ // Can only horizontally average every other pixel, much like the 2x2 blocks.
+ if (isOdd(pixelNum))
+ {
+ // do horizontal averaging on previous raster
+ lastPixel = get4Pixel(upPtr,-1);
+ lastR = GetRed(lastPixel);
+ lastG = GetGreen(lastPixel);
+ lastB = GetBlue(lastPixel);
+ if (((m_max_error_for_two_pixels >= 3)) && (NewDeltaE(lastR, R0, lastG, G0,lastB, B0, m_max_error_for_two_pixels)))
+ {
+ /* - -
+ | | build upper 2x1
+ - -
+ */
+#if kGatherStats == 1
+ blockStats[es21nw]++;
+#endif
+ int didNotBuild4by1 = true;
+
+ AverageNRound(isOdd(pixelNum), lastR, lastR, R0, lastG, lastG, G0, lastB, lastB, B0);
+
+ if ((pixelNum >= 3) && (flagsPtr[-3] & e21nw)) // 4,5,6,7,12,13,14,15,20...
+ {
+ ASSERT(!((flagsPtr[-3] | flagsPtr[-2] | flagsPtr[-1] | flagsPtr[0]) & eTheRest)); // no vertical blocks
+
+ // Attempt an upper 4x1
+ lastPixel = get4Pixel(upPtr,-3);
+ R0 = GetRed(lastPixel);
+ G0 = GetGreen(lastPixel);
+ B0 = GetBlue(lastPixel);
+ if ( (maxErrorForFourPixels >= 3) && (NewDeltaE(lastR, R0, lastG, G0,lastB, B0, maxErrorForFourPixels)))
+ {
+ /* - - - -
+ | | build upper 4x1
+ - - - -
+ */
+#if kGatherStats == 1
+ blockStats[es41ni]++;
+#endif
+ didNotBuild4by1 = false;
+ AverageNRound((pixelNum & 0x04)== 0x04, lastR, lastR, R0, lastG, lastG, G0, lastB, lastB, B0); // 4,5,6,7,12,13,14,15,20...
+
+ if(m_eEndian == LITTLEENDIAN)
+ currPixel = (lastR<<16) + (lastG<<8) + lastB;
+ else if(m_eEndian == BIGENDIAN)
+ currPixel = (lastR<<24) + (lastG<<16) + (lastB<<8);
+
+#if kMemWritesOptimize == 0
+ put4Pixel(upPtr, -3, currPixel);
+ put4Pixel(upPtr, -2, currPixel);
+ put4Pixel(upPtr, -1, currPixel);
+ put4Pixel(upPtr, 0, currPixel);
+#else
+ put4Pixel(upPtr, -3, currPixel);
+#endif
+
+ ASSERT(!((flagsPtr[-3] | flagsPtr[-2] | flagsPtr[-1] | flagsPtr[0]) & eTheRest)); // no vertical blocks
+
+ flagsPtr[-3] = (flagsPtr[-3] & ~eNorths) | e41ni;
+ flagsPtr[-2] = (flagsPtr[-2] & ~eNorths) | e41n;
+ flagsPtr[-1] = (flagsPtr[-1] & ~eNorths) | e41n;
+ flagsPtr[0] = (flagsPtr[0] & ~eNorths) | e41n;
+ }
+ }
+
+ if (didNotBuild4by1) // Not an upper 4x1 so output upper 2x1.
+ {
+ if(m_eEndian == LITTLEENDIAN)
+ currPixel = (lastR<<16) + (lastG<<8) + lastB;
+ else if(m_eEndian == BIGENDIAN)
+ currPixel = (lastR<<24) + (lastG<<16) + (lastB<<8);
+
+#if kMemWritesOptimize == 0
+ put4Pixel(upPtr, -1, currPixel);
+ put4Pixel(upPtr, 0, currPixel);
+#else
+ put4Pixel(upPtr, -1, currPixel);
+#endif
+ ASSERT(!((flagsPtr[-1] | flagsPtr[0]) & eTheRest)); // no vertical blocks
+ flagsPtr[-1] = (flagsPtr[-1] & ~eNorths) | e21nw;
+ flagsPtr[0] = (flagsPtr[0] & ~eNorths) | e21ne;
+ }
+ }
+
+ // do horizontal on current raster
+ lastPixel = get4Pixel(currPtr,-1);
+ lastR = GetRed(lastPixel);
+ lastG = GetGreen(lastPixel);
+ lastB = GetBlue(lastPixel);
+ if ((m_max_error_for_two_pixels >= 3) && (NewDeltaE(lastR, R1, lastG, G1, lastB, B1, m_max_error_for_two_pixels)))
+ {
+ /* - -
+ | | build lower 2x1
+ - -
+ */
+ int didNotBuild4by1 = true;
+#if kGatherStats == 1
+ blockStats[es21sw]++;
+#endif
+ AverageNRound(isOdd(pixelNum), lastR, lastR, R1, lastG, lastG, G1, lastB, lastB, B1);
+ if ((pixelNum >= 3) && (flagsPtr[-3] & e21sw)) // 4,5,6,7,12,13,14,15,20...
+ {
+ // Look for a lower 4x1
+ ASSERT(!((flagsPtr[-3] | flagsPtr[-2] | flagsPtr[-1] | flagsPtr[0]) & eTheRest)); // no vertical blocks
+
+ lastPixel = get4Pixel(currPtr,-3);
+ R0 = GetRed(lastPixel);
+ G0 = GetGreen(lastPixel);
+ B0 = GetBlue(lastPixel);
+ if ((maxErrorForFourPixels >= 3) && (NewDeltaE(lastR, R0, lastG, G0, lastB, B0, maxErrorForFourPixels)))
+ {
+ /* - - - -
+ | | build lower 4x1
+ - - - -
+ */
+#if kGatherStats == 1
+ blockStats[es41si]++;
+#endif
+ didNotBuild4by1 = false;
+ AverageNRound((pixelNum & 0x04)== 0x04, lastR, lastR, R0, lastG, lastG, G0, lastB, lastB, B0); // 4,5,6,7,12,13,14,15,20...
+
+ if(m_eEndian == LITTLEENDIAN)
+ currPixel = (lastR<<16) + (lastG<<8) + lastB;
+ else if(m_eEndian == BIGENDIAN)
+ currPixel = (lastR<<24) + (lastG<<16) + (lastB<<8);
+
+#if kMemWritesOptimize == 0
+ put4Pixel(currPtr, -3, currPixel);
+ put4Pixel(currPtr, -2, currPixel);
+ put4Pixel(currPtr, -1, currPixel);
+ put4Pixel(currPtr, 0, currPixel);
+#else
+ put4Pixel(currPtr, -3, currPixel);
+#endif
+ flagsPtr[-3] = (flagsPtr[-3] & ~eSouths) | e41si;
+ flagsPtr[-2] = (flagsPtr[-2] & ~eSouths) | e41s;
+ flagsPtr[-1] = (flagsPtr[-1] & ~eSouths) | e41s;
+ flagsPtr[0] = (flagsPtr[0] & ~eSouths) | e41s;
+ }
+ }
+
+ if (didNotBuild4by1) // Not a lower 4x1 so output lower 2x1.
+ {
+ ASSERT(!((flagsPtr[-1] | flagsPtr[0]) & eTheRest)); // no vertical blocks
+
+ if(m_eEndian == LITTLEENDIAN)
+ currPixel = (lastR<<16) + (lastG<<8) + lastB;
+ else if(m_eEndian == BIGENDIAN)
+ currPixel = (lastR<<24) + (lastG<<16) + (lastB<<8);
+
+#if kMemWritesOptimize == 0
+ put4Pixel(currPtr, -1, currPixel);
+ put4Pixel(currPtr, 0, currPixel);
+#else
+ put4Pixel(currPtr, -1, currPixel);
+#endif
+
+ flagsPtr[-1] = (flagsPtr[-1] & ~eSouths) | e21sw;
+ flagsPtr[0] = (flagsPtr[0] & ~eSouths) | e21se;
+ }
+ } // If DeltaE... Looking for two by one
+ } // IsOdd(pixelNum)
+ }
+ }
+ else // no flag bits set.
+ {
+ lastPairAveraged = false; // EGW Fixes bug on business graphics. 11/24/97
+ }
+
+ upPtr += eBufferedPixelWidthInBytes;
+ currPtr += eBufferedPixelWidthInBytes;
+ flagsPtr++;
+ } // for each pixel...
+}
+
+// Filter2PairsOfFilteredRows. This routine takes 2 pairs of rows that
+// have been through the Filter2RawRows routine and puts blocks together
+// to make bigger blocks. It prefers taking 2 high blocks and putting
+// them together to make four high blocks, but as a last resort it will
+// take try to take a 1 high blocks from the second and third rasters and
+// create 2 high blocks. The possible block sizes this routine could
+// create are 8x4, 4x4, 2x4, and 1x4, and then with the second and third rasters
+// 4x2, 2x2, and 1x2.
+void ErnieFilter::Filter2PairsOfFilteredRows(unsigned char *row1Ptr, unsigned char *row2Ptr, unsigned char *row3Ptr, unsigned char *row4Ptr)
+{
+ const unsigned int maxErrorForFourPixels = m_max_error_for_two_pixels / 2;
+ const unsigned int maxErrorForEightPixels = maxErrorForFourPixels / 2;
+ const unsigned int maxErrorForSixteenPixels = maxErrorForEightPixels / 2;
+ const unsigned int maxErrorForThirtyTwoPixels = maxErrorForSixteenPixels / 2;
+
+ for (int pixelNum = 0; pixelNum < (m_row_width_in_pixels-3);) // Make sure we have four pixels to work with
+ {
+ int currPixel, upPixel;
+ int R0, G0, B0, R1, G1, B1;
+
+ if ((m_pixel_filtered_flags[0][pixelNum] & e42i) && (m_pixel_filtered_flags[1][pixelNum] & e42i))
+ {
+ /* - - - -
+ | |
+ | |
+ - - - - We have two 4x2s.
+ - - - -
+ | |
+ | |
+ - - - -
+ */
+ ASSERT(m_pixel_filtered_flags[0][pixelNum] == e42i && m_pixel_filtered_flags[0][pixelNum+1] == e42 && m_pixel_filtered_flags[0][pixelNum+2] == e42 && m_pixel_filtered_flags[0][pixelNum+3] == e42);
+ ASSERT(m_pixel_filtered_flags[1][pixelNum] == e42i && m_pixel_filtered_flags[1][pixelNum+1] == e42 && m_pixel_filtered_flags[1][pixelNum+2] == e42 && m_pixel_filtered_flags[1][pixelNum+3] == e42);
+
+ upPixel = get4Pixel(row1Ptr);
+ currPixel = get4Pixel(row3Ptr);
+
+ R1 = GetRed(currPixel);
+ G1 = GetGreen(currPixel);
+ B1 = GetBlue(currPixel);
+
+ R0 = GetRed(upPixel);
+ G0 = GetGreen(upPixel);
+ B0 = GetBlue(upPixel);
+
+ if((maxErrorForSixteenPixels >= 3) &&(NewDeltaE(R1, R0, G1, G0, B1, B0, maxErrorForSixteenPixels)))
+ {
+ /* - - - -
+ | |
+ | | build 4x4
+ | |
+ | |
+ - - - -
+ */
+#if kGatherStats == 1
+ blockStats[es44ni]++;
+#endif
+ AverageNRound((pixelNum & 0x04) == 0x04, R1, R1, R0, G1, G1, G0, B1, B1, B0); // 4,5,6,7,12,13,14,15,20... Alternate between rounding up down
+
+ if(m_eEndian == LITTLEENDIAN)
+ currPixel = (R1<<16) + (G1<<8) + B1;
+ else if(m_eEndian == BIGENDIAN)
+ currPixel = (R1<<24) + (G1<<16) + (B1<<8);
+
+#if kMemWritesOptimize == 0
+ put4Pixel(row1Ptr, 0, currPixel);
+ put4Pixel(row1Ptr, 1, currPixel);
+ put4Pixel(row1Ptr, 2, currPixel);
+ put4Pixel(row1Ptr, 3, currPixel);
+ put4Pixel(row2Ptr, 0, currPixel);
+ put4Pixel(row2Ptr, 1, currPixel);
+ put4Pixel(row2Ptr, 2, currPixel);
+ put4Pixel(row2Ptr, 3, currPixel);
+ put4Pixel(row3Ptr, 0, currPixel);
+ put4Pixel(row3Ptr, 1, currPixel);
+ put4Pixel(row3Ptr, 2, currPixel);
+ put4Pixel(row3Ptr, 3, currPixel);
+ put4Pixel(row4Ptr, 0, currPixel);
+ put4Pixel(row4Ptr, 1, currPixel);
+ put4Pixel(row4Ptr, 2, currPixel);
+ put4Pixel(row4Ptr, 3, currPixel);
+#else
+ put4Pixel(row1Ptr, 0, currPixel);
+#endif
+ row1Ptr += 4*eBufferedPixelWidthInBytes;
+ row2Ptr += 4*eBufferedPixelWidthInBytes;
+ row3Ptr += 4*eBufferedPixelWidthInBytes;
+ row4Ptr += 4*eBufferedPixelWidthInBytes;
+
+ m_pixel_filtered_flags[0][pixelNum] = e44ni;
+ m_pixel_filtered_flags[0][pixelNum+1] = m_pixel_filtered_flags[0][pixelNum+2] = m_pixel_filtered_flags[0][pixelNum+3] = e44n;
+ m_pixel_filtered_flags[1][pixelNum] = e44si;
+ m_pixel_filtered_flags[1][pixelNum+1] = m_pixel_filtered_flags[1][pixelNum+2] = m_pixel_filtered_flags[1][pixelNum+3] = e44s;
+
+ if ((pixelNum >= 4) && (m_pixel_filtered_flags[1][pixelNum-4] & e44si)) // 4,5,6,7,12,13,14,15,20...
+ {
+ /* - - - - - - - -
+ | | | |
+ | | | | We have two 4x4s.
+ | | | |
+ | | | |
+ - - - - - - - -
+ */
+ ASSERT(m_pixel_filtered_flags[0][pixelNum-4] == e44ni && m_pixel_filtered_flags[0][pixelNum-3] == e44n && m_pixel_filtered_flags[0][pixelNum-2] == e44n && m_pixel_filtered_flags[0][pixelNum-1] == e44n);
+ ASSERT(m_pixel_filtered_flags[1][pixelNum-4] == e44si && m_pixel_filtered_flags[1][pixelNum-3] == e44s && m_pixel_filtered_flags[1][pixelNum-2] == e44s && m_pixel_filtered_flags[1][pixelNum-1] == e44s);
+
+ upPixel = get4Pixel(row1Ptr, -8);
+
+ R0 = GetRed(upPixel);
+ G0 = GetGreen(upPixel);
+ B0 = GetBlue(upPixel);
+
+ if( (maxErrorForThirtyTwoPixels >= 3) && (NewDeltaE(R1, R0, G1, G0, B1, B0, maxErrorForThirtyTwoPixels)))
+ {
+ /* - - - - - - - -
+ | |
+ | | build 8x4
+ | |
+ | |
+ - - - - - - - -
+ */
+#if kGatherStats == 1
+ blockStats[es84ni]++;
+#endif
+ AverageNRound((pixelNum & 0x08) == 0x08, R1, R1, R0, G1, G1, G0, B1, B1, B0);
+ if(m_eEndian == LITTLEENDIAN)
+ currPixel = (R1<<16) + (G1<<8) + B1;
+ else if(m_eEndian == BIGENDIAN)
+ currPixel = (R1<<24) + (G1<<16) + (B1<<8);
+
+#if kMemWritesOptimize == 0
+ put4Pixel(row1Ptr, -8, currPixel);
+ put4Pixel(row1Ptr, -7, currPixel);
+ put4Pixel(row1Ptr, -6, currPixel);
+ put4Pixel(row1Ptr, -5, currPixel);
+ put4Pixel(row1Ptr, -4, currPixel);
+ put4Pixel(row1Ptr, -3, currPixel);
+ put4Pixel(row1Ptr, -2, currPixel);
+ put4Pixel(row1Ptr, -1, currPixel);
+ put4Pixel(row2Ptr, -8, currPixel);
+ put4Pixel(row2Ptr, -7, currPixel);
+ put4Pixel(row2Ptr, -6, currPixel);
+ put4Pixel(row2Ptr, -5, currPixel);
+ put4Pixel(row2Ptr, -4, currPixel);
+ put4Pixel(row2Ptr, -3, currPixel);
+ put4Pixel(row2Ptr, -2, currPixel);
+ put4Pixel(row2Ptr, -1, currPixel);
+ put4Pixel(row3Ptr, -8, currPixel);
+ put4Pixel(row3Ptr, -7, currPixel);
+ put4Pixel(row3Ptr, -6, currPixel);
+ put4Pixel(row3Ptr, -5, currPixel);
+ put4Pixel(row3Ptr, -4, currPixel);
+ put4Pixel(row3Ptr, -3, currPixel);
+ put4Pixel(row3Ptr, -2, currPixel);
+ put4Pixel(row3Ptr, -1, currPixel);
+ put4Pixel(row4Ptr, -8, currPixel);
+ put4Pixel(row4Ptr, -7, currPixel);
+ put4Pixel(row4Ptr, -6, currPixel);
+ put4Pixel(row4Ptr, -5, currPixel);
+ put4Pixel(row4Ptr, -4, currPixel);
+ put4Pixel(row4Ptr, -3, currPixel);
+ put4Pixel(row4Ptr, -2, currPixel);
+ put4Pixel(row4Ptr, -1, currPixel);
+#else
+ put4Pixel(row1Ptr, -8, currPixel);
+#endif
+ m_pixel_filtered_flags[0][pixelNum-4] = e84ni;
+ m_pixel_filtered_flags[0][pixelNum-3] = m_pixel_filtered_flags[0][pixelNum-2] = m_pixel_filtered_flags[0][pixelNum-1] = m_pixel_filtered_flags[0][pixelNum] = m_pixel_filtered_flags[0][pixelNum+1] = m_pixel_filtered_flags[0][pixelNum+2] = m_pixel_filtered_flags[0][pixelNum+3] = e84n;
+ m_pixel_filtered_flags[1][pixelNum-4] = e84si;
+ m_pixel_filtered_flags[1][pixelNum-3] = m_pixel_filtered_flags[1][pixelNum-2] = m_pixel_filtered_flags[1][pixelNum-1] = m_pixel_filtered_flags[1][pixelNum] = m_pixel_filtered_flags[1][pixelNum+1] = m_pixel_filtered_flags[1][pixelNum+2] = m_pixel_filtered_flags[1][pixelNum+3] = e84s;
+ }
+ }
+ }
+ else // could not build 4x4 so move forward past the stacked 4x2s.
+ {
+ row1Ptr += 4*eBufferedPixelWidthInBytes;
+ row2Ptr += 4*eBufferedPixelWidthInBytes;
+ row3Ptr += 4*eBufferedPixelWidthInBytes;
+ row4Ptr += 4*eBufferedPixelWidthInBytes;
+ }
+ pixelNum += 4;
+ }
+ else if ((m_pixel_filtered_flags[0][pixelNum] & e22w) && (m_pixel_filtered_flags[1][pixelNum] & e22w))
+ {
+ /* - -
+ | |
+ | |
+ - - we have 2 2x2s.
+ - -
+ | |
+ | |
+ - -
+ */
+ ASSERT(m_pixel_filtered_flags[0][pixelNum] == e22w && m_pixel_filtered_flags[0][pixelNum+1] == e22e);
+ ASSERT(m_pixel_filtered_flags[1][pixelNum] == e22w && m_pixel_filtered_flags[1][pixelNum+1] == e22e);
+
+ upPixel = get4Pixel(row1Ptr);
+ currPixel = get4Pixel(row3Ptr);
+
+ R1 = GetRed(currPixel);
+ G1 = GetGreen(currPixel);
+ B1 = GetBlue(currPixel);
+
+ R0 = GetRed(upPixel);
+ G0 = GetGreen(upPixel);
+ B0 = GetBlue(upPixel);
+
+ if ((maxErrorForEightPixels >= 3) && (NewDeltaE(R1, R0, G1, G0, B1, B0, maxErrorForEightPixels)))
+ {
+ /* - -
+ | |
+ | | build 2x4
+ | |
+ | |
+ - -
+ */
+#if kGatherStats == 1
+ blockStats[es24nw]++;
+#endif
+ AverageNRound((pixelNum & 0x02) == 0x02, R1, R1, R0, G1, G1, G0, B1, B1, B0);
+
+ if(m_eEndian == LITTLEENDIAN)
+ currPixel = (R1<<16) + (G1<<8) + B1;
+ else if(m_eEndian == BIGENDIAN)
+ currPixel = (R1<<24) + (G1<<16) + (B1<<8);
+
+#if kMemWritesOptimize == 0
+ put4Pixel(row1Ptr, 0, currPixel);
+ put4Pixel(row1Ptr, 1, currPixel);
+ put4Pixel(row2Ptr, 0, currPixel);
+ put4Pixel(row2Ptr, 1, currPixel);
+ put4Pixel(row3Ptr, 0, currPixel);
+ put4Pixel(row3Ptr, 1, currPixel);
+ put4Pixel(row4Ptr, 0, currPixel);
+ put4Pixel(row4Ptr, 1, currPixel);
+#else
+ put4Pixel(row1Ptr, 0, currPixel);
+#endif
+ row1Ptr += 2*eBufferedPixelWidthInBytes;
+ row2Ptr += 2*eBufferedPixelWidthInBytes;
+ row3Ptr += 2*eBufferedPixelWidthInBytes;
+ row4Ptr += 2*eBufferedPixelWidthInBytes;
+
+ m_pixel_filtered_flags[0][pixelNum] = e24nw;
+ m_pixel_filtered_flags[0][pixelNum+1] = e24ne;
+ m_pixel_filtered_flags[1][pixelNum] = e24sw;
+ m_pixel_filtered_flags[1][pixelNum+1] = e24se;
+ }
+ else
+ {
+ row1Ptr += 2*eBufferedPixelWidthInBytes;
+ row2Ptr += 2*eBufferedPixelWidthInBytes;
+ row3Ptr += 2*eBufferedPixelWidthInBytes;
+ row4Ptr += 2*eBufferedPixelWidthInBytes;
+ }
+ pixelNum += 2;
+ }
+ else if ((m_pixel_filtered_flags[0][pixelNum] & e12) && (m_pixel_filtered_flags[1][pixelNum] & e12))
+ {
+ /* -
+ | |
+ | |
+ - we have two 1x2s.
+ -
+ | |
+ | |
+ -
+ */
+ ASSERT(m_pixel_filtered_flags[0][pixelNum] == e12);
+ ASSERT(m_pixel_filtered_flags[1][pixelNum] == e12);
+
+ upPixel = get4Pixel(row1Ptr);
+ currPixel = get4Pixel(row3Ptr);
+
+ R1 = GetRed(currPixel);
+ G1 = GetGreen(currPixel);
+ B1 = GetBlue(currPixel);
+
+ R0 = GetRed(upPixel);
+ G0 = GetGreen(upPixel);
+ B0 = GetBlue(upPixel);
+
+ if ((maxErrorForFourPixels >= 3) && (NewDeltaE(R1, R0, G1, G0, B1, B0, maxErrorForFourPixels)))
+ {
+ /* -
+ | |
+ | | build 1x4
+ | |
+ | |
+ -
+ */
+#if kGatherStats == 1
+ blockStats[es14n]++;
+#endif
+ AverageNRound((pixelNum & 0x01) == 0x01, R1, R1, R0, G1, G1, G0, B1, B1, B0);
+
+ if(m_eEndian == LITTLEENDIAN)
+ currPixel = (R1<<16) + (G1<<8) + B1;
+ else if(m_eEndian == BIGENDIAN)
+ currPixel = (R1<<24) + (G1<<16) + (B1<<8);
+
+#if kMemWritesOptimize == 0
+ put4Pixel(row1Ptr, 0, currPixel);
+ put4Pixel(row2Ptr, 0, currPixel);
+ put4Pixel(row3Ptr, 0, currPixel);
+ put4Pixel(row4Ptr, 0, currPixel);
+#else
+ put4Pixel(row1Ptr, 0, currPixel);
+#endif
+ m_pixel_filtered_flags[0][pixelNum] = e14n;
+ m_pixel_filtered_flags[1][pixelNum] = e14s;
+ }
+
+ row1Ptr += eBufferedPixelWidthInBytes;
+ row2Ptr += eBufferedPixelWidthInBytes;
+ row3Ptr += eBufferedPixelWidthInBytes;
+ row4Ptr += eBufferedPixelWidthInBytes;
+
+ pixelNum++;
+ }
+ else if ((m_pixel_filtered_flags[0][pixelNum] & e41si)
+ && (m_pixel_filtered_flags[1][pixelNum] & e41ni))
+ {
+ /* - - - -
+ | |
+ - - - - We have two 4x1s.
+ - - - -
+ | |
+ - - - -
+ */
+
+ upPixel = get4Pixel(row2Ptr);
+ currPixel = get4Pixel(row3Ptr);
+
+ R1 = GetRed(currPixel);
+ G1 = GetGreen(currPixel);
+ B1 = GetBlue(currPixel);
+
+ R0 = GetRed(upPixel);
+ G0 = GetGreen(upPixel);
+ B0 = GetBlue(upPixel);
+
+
+ if ((maxErrorForEightPixels >= 3) && (NewDeltaE(R1, R0, G1, G0, B1, B0, maxErrorForEightPixels)))
+ {
+
+ /* - - - -
+ | | build 4x2.
+ | |
+ - - - -
+ */
+#if kGatherStats == 1
+ blockStats[es42w]++;
+#endif
+ AverageNRound((pixelNum & 0x04) == 0x04, R1, R1, R0, G1, G1, G0, B1, B1, B0);
+
+ if(m_eEndian == LITTLEENDIAN)
+ currPixel = (R1<<16) + (G1<<8) + B1;
+ else if(m_eEndian == BIGENDIAN)
+ currPixel = (R1<<24) + (G1<<16) + (B1<<8);
+
+ // Note we write this block out now and do not delay the writes for the postprocessing step since we do not track this block.
+ put4Pixel(row2Ptr, 0, currPixel);
+ put4Pixel(row2Ptr, 1, currPixel);
+ put4Pixel(row2Ptr, 2, currPixel);
+ put4Pixel(row2Ptr, 3, currPixel);
+ put4Pixel(row3Ptr, 0, currPixel);
+ put4Pixel(row3Ptr, 1, currPixel);
+ put4Pixel(row3Ptr, 2, currPixel);
+ put4Pixel(row3Ptr, 3, currPixel);
+
+ m_pixel_filtered_flags[0][pixelNum] = m_pixel_filtered_flags[0][pixelNum] & ~e41si;
+ m_pixel_filtered_flags[0][pixelNum+1] = m_pixel_filtered_flags[0][pixelNum+1] & ~e41s;
+ m_pixel_filtered_flags[0][pixelNum+2] = m_pixel_filtered_flags[0][pixelNum+1] & ~e41s;
+ m_pixel_filtered_flags[0][pixelNum+3] = m_pixel_filtered_flags[0][pixelNum+1] & ~e41s;
+
+ m_pixel_filtered_flags[1][pixelNum] = m_pixel_filtered_flags[1][pixelNum] & ~e41ni; // Note that we just formed a 2x2 in the middle of the filtered sets of rows (and do not remember it). We then remove the 2x1s that the 2x2 eliminated.
+ m_pixel_filtered_flags[1][pixelNum+1] = m_pixel_filtered_flags[1][pixelNum+1] & ~e41n;
+ m_pixel_filtered_flags[1][pixelNum+2] = m_pixel_filtered_flags[1][pixelNum+1] & ~e41n;
+ m_pixel_filtered_flags[1][pixelNum+3] = m_pixel_filtered_flags[1][pixelNum+1] & ~e41n;
+ }
+ pixelNum += 4;
+
+ row1Ptr += 4*eBufferedPixelWidthInBytes;
+ row2Ptr += 4*eBufferedPixelWidthInBytes;
+ row3Ptr += 4*eBufferedPixelWidthInBytes;
+ row4Ptr += 4*eBufferedPixelWidthInBytes;
+ }
+ else if ((m_pixel_filtered_flags[0][pixelNum] & e21sw)
+ && (m_pixel_filtered_flags[1][pixelNum] & e21nw))
+ {
+ /* - -
+ | |
+ - - We have two 2x1s.
+ - -
+ | |
+ - -
+ */
+ ASSERT(!((m_pixel_filtered_flags[0][pixelNum] & e11s) | (m_pixel_filtered_flags[0][pixelNum+1] & e11s)));
+ ASSERT(!((m_pixel_filtered_flags[1][pixelNum] & e11n) | (m_pixel_filtered_flags[1][pixelNum+1] & e11n)));
+
+ upPixel = get4Pixel(row2Ptr);
+ currPixel = get4Pixel(row3Ptr);
+
+ R1 = GetRed(currPixel);
+ G1 = GetGreen(currPixel);
+ B1 = GetBlue(currPixel);
+
+ R0 = GetRed(upPixel);
+ G0 = GetGreen(upPixel);
+ B0 = GetBlue(upPixel);
+
+ if ((maxErrorForFourPixels >= 3) && (NewDeltaE(R1, R0, G1, G0, B1, B0, maxErrorForFourPixels)))
+ {
+ /* - -
+ | | build 2x2.
+ | |
+ - -
+ */
+#if kGatherStats == 1
+ blockStats[es22w]++;
+#endif
+ AverageNRound((pixelNum & 0x02) == 0x02, R1, R1, R0, G1, G1, G0, B1, B1, B0);
+
+ if(m_eEndian == LITTLEENDIAN)
+ currPixel = (R1<<16) + (G1<<8) + B1;
+ else if(m_eEndian == BIGENDIAN)
+ currPixel = (R1<<24) + (G1<<16) + (B1<<8);
+
+ // Note we write this block out now and do not delay the writes for the postprocessing step since we do not track this block.
+ put4Pixel(row2Ptr, 0, currPixel);
+ put4Pixel(row2Ptr, 1, currPixel);
+ put4Pixel(row3Ptr, 0, currPixel);
+ put4Pixel(row3Ptr, 1, currPixel);
+
+ m_pixel_filtered_flags[0][pixelNum] = m_pixel_filtered_flags[0][pixelNum] & ~e21sw;
+ m_pixel_filtered_flags[0][pixelNum+1] = m_pixel_filtered_flags[0][pixelNum+1] & ~e21se;
+
+ m_pixel_filtered_flags[1][pixelNum] = m_pixel_filtered_flags[1][pixelNum] & ~e21nw; // Note that we just formed a 2x2 in the middle of the filtered sets of rows (and do not remember it). We then remove the 2x1s that the 2x2 eliminated.
+ m_pixel_filtered_flags[1][pixelNum+1] = m_pixel_filtered_flags[1][pixelNum+1] & ~e21ne;
+ }
+
+ pixelNum += 2;
+
+ row1Ptr += 2*eBufferedPixelWidthInBytes;
+ row2Ptr += 2*eBufferedPixelWidthInBytes;
+ row3Ptr += 2*eBufferedPixelWidthInBytes;
+ row4Ptr += 2*eBufferedPixelWidthInBytes;
+ }
+ else if ((m_pixel_filtered_flags[0][pixelNum] & e11s)
+ && (m_pixel_filtered_flags[1][pixelNum] & e11n))
+ {
+ /* -
+ | |
+ - We have two 1x1s.
+ -
+ | |
+ -
+ */
+
+ upPixel = get4Pixel(row2Ptr);
+ currPixel = get4Pixel(row3Ptr);
+
+ R1 = GetRed(currPixel);
+ G1 = GetGreen(currPixel);
+ B1 = GetBlue(currPixel);
+
+ R0 = GetRed(upPixel);
+ G0 = GetGreen(upPixel);
+ B0 = GetBlue(upPixel);
+
+ if ((m_max_error_for_two_pixels >= 3) && (NewDeltaE(R1, R0, G1, G0, B1, B0, m_max_error_for_two_pixels)))
+ {
+ /* -
+ | | build 1x2.
+ | |
+ -
+ */
+#if kGatherStats == 1
+ blockStats[es12w]++;
+#endif
+ AverageNRound(isOdd(pixelNum), R1, R1, R0, G1, G1, G0, B1, B1, B0);
+
+ if(m_eEndian == LITTLEENDIAN)
+ currPixel = (R1<<16) + (G1<<8) + B1;
+ else if(m_eEndian == BIGENDIAN)
+ currPixel = (R1<<24) + (G1<<16) + (B1<<8);
+
+ // Note we write this block out now and do not delay the writes for the postprocessing step since we do not track this block.
+ put4Pixel(row2Ptr, 0, currPixel);
+ put4Pixel(row3Ptr, 0, currPixel);
+
+ m_pixel_filtered_flags[0][pixelNum] = m_pixel_filtered_flags[0][pixelNum] & ~e11s;
+
+ m_pixel_filtered_flags[1][pixelNum] = m_pixel_filtered_flags[1][pixelNum] & ~e11n; // Note that we just formed a 2x2 in the middle of the filtered sets of rows (and do not remember it). We then remove the 2x1s that the 2x2 eliminated.
+ }
+
+ pixelNum += 1;
+
+ row1Ptr += eBufferedPixelWidthInBytes;
+ row2Ptr += eBufferedPixelWidthInBytes;
+ row3Ptr += eBufferedPixelWidthInBytes;
+ row4Ptr += eBufferedPixelWidthInBytes;
+ }
+ else // Do no vertical filtering here.
+ {
+ pixelNum += 1;
+
+ row1Ptr += eBufferedPixelWidthInBytes;
+ row2Ptr += eBufferedPixelWidthInBytes;
+ row3Ptr += eBufferedPixelWidthInBytes;
+ row4Ptr += eBufferedPixelWidthInBytes;
+ }
+ }
+}
+
+// Filter3FilteredRows. This routine only exists for the case of the odd size band
+// with three rasters left over. I'm not sure how much extra benifit we really
+// get from running this, but for now I'm leaving it in. Since Ernie deals with
+// block sizes that are powers of two its rather difficult to filter 3 rows together,
+// about all I've been able to do is look for 1 high blocks in the second and third
+// rasters to put together into 2 high blocks. This routine will create 4x2, 2x2, and
+// 1x2 blocks from those second and third rasters.
+void ErnieFilter::Filter3FilteredRows(unsigned char *row1Ptr, unsigned char *row2Ptr, unsigned char *row3Ptr)
+{
+ const unsigned int maxErrorForFourPixels = m_max_error_for_two_pixels / 2;
+ const unsigned int maxErrorForEightPixels = maxErrorForFourPixels / 2;
+// const unsigned int maxErrorForSixteenPixels = maxErrorForEightPixels / 2;
+// const unsigned int maxErrorForThirtyTwoPixels = maxErrorForSixteenPixels / 2;
+
+ for (int pixelNum = 0; pixelNum < (m_row_width_in_pixels-3);) // Make sure we have four pixels to work with
+ {
+// int currPixel, upPixel;
+ uint32_t currPixel, upPixel;
+ int R0, G0, B0, R1, G1, B1;
+
+ if ((m_pixel_filtered_flags[0][pixelNum] & e41si)
+ && (m_pixel_filtered_flags[1][pixelNum] & e41ni))
+ {
+ /* - - - -
+ | |
+ - - - - We have two 4x1s.
+ - - - -
+ | |
+ - - - -
+ */
+ ASSERT(!((m_pixel_filtered_flags[0][pixelNum] & e11s) | (m_pixel_filtered_flags[0][pixelNum+1] & e11s)));
+ ASSERT(!((m_pixel_filtered_flags[1][pixelNum] & e11n) | (m_pixel_filtered_flags[1][pixelNum+1] & e11n)));
+
+ upPixel = get4Pixel(row2Ptr);
+ currPixel = get4Pixel(row3Ptr);
+
+ R1 = GetRed(currPixel);
+ G1 = GetGreen(currPixel);
+ B1 = GetBlue(currPixel);
+
+ R0 = GetRed(upPixel);
+ G0 = GetGreen(upPixel);
+ B0 = GetBlue(upPixel);
+
+
+ if ((maxErrorForEightPixels >= 3) && (NewDeltaE(R1, R0, G1, G0, B1, B0, maxErrorForEightPixels)))
+ {
+
+ /* - - - -
+ | | build 4x2.
+ | |
+ - - - -
+ */
+#if kGatherStats == 1
+ blockStats[es42w]++;
+#endif
+ AverageNRound((pixelNum & 0x04) == 0x04, R1, R1, R0, G1, G1, G0, B1, B1, B0);
+
+ if(m_eEndian == LITTLEENDIAN)
+ currPixel = (R1<<16) + (G1<<8) + B1;
+ else if(m_eEndian == BIGENDIAN)
+ currPixel = (R1<<24) + (G1<<16) + (B1<<8);
+
+ // Note we write this block out now and do not delay the writes for the postprocessing step since we do not track this block.
+ put4Pixel(row2Ptr, 0, currPixel);
+ put4Pixel(row2Ptr, 1, currPixel);
+ put4Pixel(row2Ptr, 2, currPixel);
+ put4Pixel(row2Ptr, 3, currPixel);
+ put4Pixel(row3Ptr, 0, currPixel);
+ put4Pixel(row3Ptr, 1, currPixel);
+ put4Pixel(row3Ptr, 2, currPixel);
+ put4Pixel(row3Ptr, 3, currPixel);
+
+ m_pixel_filtered_flags[0][pixelNum] = m_pixel_filtered_flags[0][pixelNum] & ~e41si;
+ m_pixel_filtered_flags[0][pixelNum+1] = m_pixel_filtered_flags[0][pixelNum+1] & ~e41s;
+ m_pixel_filtered_flags[0][pixelNum+2] = m_pixel_filtered_flags[0][pixelNum+1] & ~e41s;
+ m_pixel_filtered_flags[0][pixelNum+3] = m_pixel_filtered_flags[0][pixelNum+1] & ~e41s;
+
+ m_pixel_filtered_flags[1][pixelNum] = m_pixel_filtered_flags[1][pixelNum] & ~e41ni; // Note that we just formed a 2x2 in the middle of the filtered sets of rows (and do not remember it). We then remove the 2x1s that the 2x2 eliminated.
+ m_pixel_filtered_flags[1][pixelNum+1] = m_pixel_filtered_flags[1][pixelNum+1] & ~e41n;
+ m_pixel_filtered_flags[1][pixelNum+2] = m_pixel_filtered_flags[1][pixelNum+1] & ~e41n;
+ m_pixel_filtered_flags[1][pixelNum+3] = m_pixel_filtered_flags[1][pixelNum+1] & ~e41n;
+ }
+ pixelNum += 4;
+
+ row1Ptr += 4*eBufferedPixelWidthInBytes;
+ row2Ptr += 4*eBufferedPixelWidthInBytes;
+ row3Ptr += 4*eBufferedPixelWidthInBytes;
+ }
+ else if ((m_pixel_filtered_flags[0][pixelNum] & e21sw)
+ && (m_pixel_filtered_flags[1][pixelNum] & e21nw))
+ {
+ /* - -
+ | |
+ - - We have two 2x1s.
+ - -
+ | |
+ - -
+ */
+ ASSERT(!((m_pixel_filtered_flags[0][pixelNum] & e11s) | (m_pixel_filtered_flags[0][pixelNum+1] & e11s)));
+ ASSERT(!((m_pixel_filtered_flags[1][pixelNum] & e11n) | (m_pixel_filtered_flags[1][pixelNum+1] & e11n)));
+
+ upPixel = get4Pixel(row2Ptr);
+ currPixel = get4Pixel(row3Ptr);
+
+ R1 = GetRed(currPixel);
+ G1 = GetGreen(currPixel);
+ B1 = GetBlue(currPixel);
+
+ R0 = GetRed(upPixel);
+ G0 = GetGreen(upPixel);
+ B0 = GetBlue(upPixel);
+
+ if ((maxErrorForFourPixels >= 3) && (NewDeltaE(R1, R0, G1, G0, B1, B0, maxErrorForFourPixels)))
+ {
+ /* - -
+ | | build 2x2.
+ | |
+ - -
+ */
+#if kGatherStats == 1
+ blockStats[es22w]++;
+#endif
+ AverageNRound((pixelNum & 0x02) == 0x02, R1, R1, R0, G1, G1, G0, B1, B1, B0);
+
+ if(m_eEndian == LITTLEENDIAN)
+ currPixel = (R1<<16) + (G1<<8) + B1;
+ else if(m_eEndian == BIGENDIAN)
+ currPixel = (R1<<24) + (G1<<16) + (B1<<8);
+
+ // Note we write this block out now and do not delay the writes for the postprocessing step since we do not track this block.
+ put4Pixel(row2Ptr, 0, currPixel);
+ put4Pixel(row2Ptr, 1, currPixel);
+ put4Pixel(row3Ptr, 0, currPixel);
+ put4Pixel(row3Ptr, 1, currPixel);
+
+ m_pixel_filtered_flags[0][pixelNum] = m_pixel_filtered_flags[0][pixelNum] & ~e21sw;
+ m_pixel_filtered_flags[0][pixelNum+1] = m_pixel_filtered_flags[0][pixelNum+1] & ~e21se;
+
+ m_pixel_filtered_flags[1][pixelNum] = m_pixel_filtered_flags[1][pixelNum] & ~e21nw; // Note that we just formed a 2x2 in the middle of the filtered sets of rows (and do not remember it). We then remove the 2x1s that the 2x2 eliminated.
+ m_pixel_filtered_flags[1][pixelNum+1] = m_pixel_filtered_flags[1][pixelNum+1] & ~e21ne;
+ }
+
+ pixelNum += 2;
+
+ row1Ptr += 2*eBufferedPixelWidthInBytes;
+ row2Ptr += 2*eBufferedPixelWidthInBytes;
+ row3Ptr += 2*eBufferedPixelWidthInBytes;
+ }
+ else if ((m_pixel_filtered_flags[0][pixelNum] & e11s)
+ && (m_pixel_filtered_flags[1][pixelNum] & e11n))
+ {
+ /* -
+ | |
+ - We have two 1x1s.
+ -
+ | |
+ -
+ */
+
+ upPixel = get4Pixel(row2Ptr);
+ currPixel = get4Pixel(row3Ptr);
+
+ R1 = GetRed(currPixel);
+ G1 = GetGreen(currPixel);
+ B1 = GetBlue(currPixel);
+
+ R0 = GetRed(upPixel);
+ G0 = GetGreen(upPixel);
+ B0 = GetBlue(upPixel);
+
+ if ((m_max_error_for_two_pixels >= 3) && (NewDeltaE(R1, R0, G1, G0, B1, B0, m_max_error_for_two_pixels)))
+ {
+ /* -
+ | | build 1x2.
+ | |
+ -
+ */
+#if kGatherStats == 1
+ blockStats[es12w]++;
+#endif
+ AverageNRound(isOdd(pixelNum), R1, R1, R0, G1, G1, G0, B1, B1, B0);
+
+ if(m_eEndian == LITTLEENDIAN)
+ currPixel = (R1<<16) + (G1<<8) + B1;
+ else if(m_eEndian == BIGENDIAN)
+ currPixel = (R1<<24) + (G1<<16) + (B1<<8);
+
+ // Note we write this block out now and do not delay the writes for the postprocessing step since we do not track this block.
+ put4Pixel(row2Ptr, 0, currPixel);
+ put4Pixel(row3Ptr, 0, currPixel);
+
+ m_pixel_filtered_flags[0][pixelNum] = m_pixel_filtered_flags[0][pixelNum] & ~e11s;
+
+ m_pixel_filtered_flags[1][pixelNum] = m_pixel_filtered_flags[1][pixelNum] & ~e11n; // Note that we just formed a 2x2 in the middle of the filtered sets of rows (and do not remember it). We then remove the 2x1s that the 2x2 eliminated.
+ }
+
+ pixelNum += 1;
+
+ row1Ptr += eBufferedPixelWidthInBytes;
+ row2Ptr += eBufferedPixelWidthInBytes;
+ row3Ptr += eBufferedPixelWidthInBytes;
+ }
+ else // Do no vertical filtering here.
+ {
+ pixelNum += 1;
+
+ row1Ptr += eBufferedPixelWidthInBytes;
+ row2Ptr += eBufferedPixelWidthInBytes;
+ row3Ptr += eBufferedPixelWidthInBytes;
+ }
+ }
+}
+
+#define NEWTEST true
+
+inline bool ErnieFilter::NewDeltaE(int dr0, int dr1, int dg0, int dg1, int db0, int db1, int tolerance)
+{
+ int Y0, Y1, dY, Cr0, Cr1, Cb0, Cb1, dCr, dCb;
+
+ // new Delta E stuff from Jay
+
+ Y0 = 5*dr0 + 9*dg0 + 2*db0;
+ Y1 = 5*dr1 + 9*dg1 + 2*db1;
+
+ dY = ABS(Y0 - Y1) >> 4;
+
+ if(dY > tolerance) {
+ return false;
+ }
+ else
+ {
+ Cr0 = (dr0 << 4) - Y0;
+ Cr1 = (dr1 << 4) - Y1;
+ dCr = ABS(Cr0 - Cr1) >> 5;
+ if(dCr > tolerance)
+ {
+ return false;
+ }
+ else
+ {
+ Cb0 = (db0 << 4) - Y0;
+ Cb1 = (db1 << 4) - Y1;
+ dCb = ABS(Cb0 - Cb1) >> 6;
+ if(dCb > tolerance)
+ {
+ return false;
+ }
+ }
+ }
+ return true;
+}
+
+ErnieFilter::ErnieFilter(int rowWidthInPixels, pixelTypes pixelType, unsigned int maxErrorForTwoPixels)
+{
+ int index;
+ m_input_bytes_per_pixel = 3;
+ ASSERT(rowWidthInPixels > 0);
+ ASSERT(pixelType == eBGRPixelData);
+
+ union
+ {
+ short s;
+ char c[2];
+ } uEndian;
+ uEndian.s = 0x0A0B;
+ m_eEndian = LITTLEENDIAN;
+ if (uEndian.c[0] == 0x0A)
+ m_eEndian = BIGENDIAN;
+
+ m_internal_bytes_per_pixel = 4;
+
+ m_pixel_offsets_index = 0;
+ m_row_width_in_pixels = rowWidthInPixels;
+ m_row_width_in_bytes = m_row_width_in_pixels*m_internal_bytes_per_pixel;
+ m_max_error_for_two_pixels = maxErrorForTwoPixels;
+
+ for (index = 0; index < 4; index++)
+ {
+ m_row_bufs[index] = new uint32_t[rowWidthInPixels];
+ ASSERT(m_row_bufs[index]);
+
+ m_row_ptrs[index] = new unsigned char[rowWidthInPixels*m_input_bytes_per_pixel];
+ ASSERT(m_row_ptrs[index]);
+
+ m_black_row_ptrs[index] = new BYTE[rowWidthInPixels*m_input_bytes_per_pixel];
+ ASSERT(m_black_row_ptrs[index]);
+
+ m_black_raster_sizes[index] = 0;
+ }
+
+ for (index = 0; index < 2; index++)
+ {
+ m_pixel_filtered_flags[index] = new unsigned int[rowWidthInPixels];
+ ASSERT(m_pixel_filtered_flags[index]);
+ }
+
+ // The least compressible image will be all raw pixels. Maximum compressed size is:
+ // full size + a bloat of Cmd byte + 1 VLI byte per 255 pixels rounded up to nearest integer.
+
+ int maxCompressionBufSize = m_row_width_in_bytes + 1 + ((int)ceil((double) MAX((rowWidthInPixels-2)/255, 0)));
+
+ m_compression_out_buf = new unsigned char[maxCompressionBufSize];
+ ASSERT(m_compression_out_buf);
+
+ m_buffered_row_count = 0;
+
+ m_pixel_offsets[0] = 0;
+ m_pixel_offsets[1] = 5;
+ m_pixel_offsets[2] = 2;
+ m_pixel_offsets[3] = 7;
+ m_pixel_offsets[4] = 1;
+ m_pixel_offsets[5] = 4;
+ m_pixel_offsets[6] = 6;
+ m_pixel_offsets[7] = 3;
+
+ m_row_index = 0;
+}
+
+
+ErnieFilter::~ErnieFilter()
+{
+ // Deallocate memory next.
+ int index;
+
+ for (index = 0; index < 4; index++)
+ {
+ delete [] m_row_bufs[index];
+ delete [] m_row_ptrs[index];
+ delete [] m_black_row_ptrs[index];
+ }
+
+ for (index = 0; index < 2; index++)
+ {
+ delete [] m_pixel_filtered_flags[index];
+ }
+
+ delete [] m_compression_out_buf;
+}
+
+void ErnieFilter::writeBufferedRows()
+{
+ int pixelIndex = 0;
+
+ // We just have one lonely raster left. Nothing
+ // we can do but filter it horizontally.
+ if( 1 == m_buffered_row_count)
+ {
+
+ int offset2 = m_pixel_offsets[m_pixel_offsets_index];
+
+ Filter1RawRow( (unsigned char*)(m_row_bufs[0] + offset2),
+ m_row_width_in_pixels - m_pixel_offsets[m_pixel_offsets_index],
+ m_pixel_filtered_flags[0] + m_pixel_offsets[m_pixel_offsets_index]);
+
+
+ unsigned char *rowPtr = m_row_ptrs[0];
+ ASSERT(rowPtr);
+ pixelIndex = 0;
+ do
+ {
+ memcpy(rowPtr, &m_row_bufs[0][pixelIndex], 3);
+ rowPtr += 3;
+ } while (++pixelIndex < m_row_width_in_pixels);
+
+ }
+ // If we've got a pair of rasters in the buffer, that pair
+ // has already been filtered somewhat. So lets just write them
+ // out, some filtering is better than none.
+ else if (2 == m_buffered_row_count)
+ {
+ // Write the two rows back out.
+ int k;
+ for (k = 0; k < 2; k++)
+ {
+ unsigned char *rowPtr = m_row_ptrs[k];
+ ASSERT(rowPtr);
+ pixelIndex = 0;
+ do
+ {
+ memcpy(rowPtr, &m_row_bufs[k][pixelIndex], 3);
+ rowPtr += 3;
+ } while (++pixelIndex < m_row_width_in_pixels);
+ }
+ }
+ // Okay, if we had three rasters in the buffer, the pair
+ // should have already been written out above, so lets
+ // just run the odd raster through Ernie with to
+ // get the horizontal filtering. [Need to look to see
+ // if there's something more we can do with filtering
+ // all three together.]
+ else if (3 == m_buffered_row_count)
+ {
+
+ int offset2 = m_pixel_offsets[m_pixel_offsets_index];
+
+ Filter1RawRow( (unsigned char*)(m_row_bufs[2] + offset2),
+ m_row_width_in_pixels - m_pixel_offsets[m_pixel_offsets_index],
+ m_pixel_filtered_flags[1] + m_pixel_offsets[m_pixel_offsets_index]);
+
+
+ Filter3FilteredRows( (unsigned char*)m_row_bufs[0],
+ (unsigned char*)m_row_bufs[1],
+ (unsigned char*)m_row_bufs[2]);
+
+ int k;
+ for (k = 0; k < 3; k++)
+ {
+ unsigned char *rowPtr = m_row_ptrs[k];
+ ASSERT(rowPtr);
+ pixelIndex = 0;
+ do
+ {
+ memcpy(rowPtr, &m_row_bufs[k][pixelIndex], 3);
+ rowPtr += 3;
+ } while (++pixelIndex < m_row_width_in_pixels);
+ }
+ }
+}
+
+void ErnieFilter::submitRowToFilter(unsigned char *rowPtr)
+{
+ memcpy(m_row_ptrs[m_buffered_row_count], rowPtr, m_row_width_in_pixels*m_input_bytes_per_pixel);
+
+ int pixelIndex = 0;
+ uint32_t *RowPtrDest = m_row_bufs[m_buffered_row_count];
+ BYTE byte1 = 0;
+ BYTE byte2 = 0;
+ BYTE byte3 = 0;
+ do
+ {
+ byte1 = *rowPtr++;
+ byte2 = *rowPtr++;
+ byte3 = *rowPtr++;
+ if(m_eEndian == LITTLEENDIAN)
+ RowPtrDest[pixelIndex] = ((byte3 << 16) | (byte2 << 8) | (byte1)) & 0x00FFFFFF;
+ else if(m_eEndian == BIGENDIAN)
+ RowPtrDest[pixelIndex] = ((byte1 << 24) | (byte2 << 16) | (byte3 << 8)) & 0xFFFFFF00;
+ } while (++pixelIndex < m_row_width_in_pixels);
+
+ m_buffered_row_count++;
+
+ iRastersReady=0;
+ iRastersDelivered=0;
+
+ // Next see about filtering & compression.
+ // NOTE 1: as an optimization only do subsections of the raster at a time to stay in cache.
+ // NOTE 2: Could filter the pixels left of the offset.
+ if (2 == m_buffered_row_count)
+ {
+ int offset2 = m_pixel_offsets[m_pixel_offsets_index];
+
+ Filter2RawRows( (unsigned char*)(m_row_bufs[1] + offset2),
+ (unsigned char*)(m_row_bufs[0] + offset2),
+ m_row_width_in_pixels - m_pixel_offsets[m_pixel_offsets_index],
+ m_pixel_filtered_flags[0] + m_pixel_offsets[m_pixel_offsets_index]);
+ }
+
+ if (4 == m_buffered_row_count)
+ {
+ int offset4 = m_pixel_offsets[m_pixel_offsets_index];
+ Filter2RawRows( (unsigned char*)(m_row_bufs[3] + offset4),
+ (unsigned char*)(m_row_bufs[2] + offset4),
+ m_row_width_in_pixels - m_pixel_offsets[m_pixel_offsets_index],
+ m_pixel_filtered_flags[1] + m_pixel_offsets[m_pixel_offsets_index]);
+
+ Filter2PairsOfFilteredRows( (unsigned char*)m_row_bufs[0],
+ (unsigned char*)m_row_bufs[1],
+ (unsigned char*)m_row_bufs[2],
+ (unsigned char*)m_row_bufs[3]);
+
+#if kMemWritesOptimize == 1
+ // Writing the blocks out on a post processing step in this manner could leave the last 3 rows
+ // unfiltered. This is a trade off we make for simplicity. The resulting loss in compression is small.
+ WriteBlockPixels();
+#endif
+
+ m_pixel_offsets_index = (m_pixel_offsets_index + 1) % 8; // cycle the offset index.
+
+ int k;
+ for (k = 0; k < m_pixel_offsets[m_pixel_offsets_index]; k++) // Clear out the flags that we're offsetting past for this next iteration.
+ {
+ m_pixel_filtered_flags[0][k] = eDone;
+ m_pixel_filtered_flags[1][k] = eDone;
+ }
+
+ // Write the four rows back out.
+ for (k = 0; k < 4; k++)
+ {
+ unsigned char *rowPtr = m_row_ptrs[k];
+ ASSERT(rowPtr);
+ pixelIndex = 0;
+ do
+ {
+ memcpy(rowPtr, &m_row_bufs[k][pixelIndex], m_input_bytes_per_pixel);
+ rowPtr += m_input_bytes_per_pixel;
+ } while (++pixelIndex < m_row_width_in_pixels);
+ }
+
+ m_buffered_row_count = 0;
+ iRastersReady = 4;
+ }
+}
+
+#if kMemWritesOptimize == 1
+/*
+At this point the color for the entire block is stored in the top left
+corner of the block. This routine takes that pixel and smears it into the
+rest of the block.
+*/
+void ErnieFilter::WriteBlockPixels(void)
+{
+ unsigned char *row1Ptr = (unsigned char*)m_row_bufs[0];
+ unsigned char *row2Ptr = (unsigned char*)m_row_bufs[1];
+ unsigned char *row3Ptr = (unsigned char*)m_row_bufs[2];
+ unsigned char *row4Ptr = (unsigned char*)m_row_bufs[3];
+
+ for (int flagSet = 0; flagSet <= 1; flagSet++)
+ {
+ unsigned int *flagsPtr = m_pixel_filtered_flags[0];
+ unsigned char *rowA = (unsigned char*)m_row_bufs[0];
+ unsigned char *rowB = (unsigned char*)m_row_bufs[1];
+
+ if (flagSet == 1)
+ {
+ flagsPtr = m_pixel_filtered_flags[1];
+ rowA = (unsigned char*)m_row_bufs[2];
+ rowB = (unsigned char*)m_row_bufs[3];
+ }
+
+ for (int rowIndex = 0; rowIndex < m_row_width_in_pixels;)
+ {
+ unsigned int currentFlags = flagsPtr[rowIndex];
+
+#ifndef NDEBUG /* only done for debug builds */
+ int numberOfBitsSet = 0;
+ unsigned int currentFlagsCopy = currentFlags & eTopLeftOfBlocks;
+ while (currentFlagsCopy)
+ {
+ if (currentFlagsCopy & 1) numberOfBitsSet++;
+ currentFlagsCopy >>= 1;
+ }
+ ASSERT( (numberOfBitsSet <= 1) ||
+ ((numberOfBitsSet == 2) &&
+ (((currentFlags & eTopLeftOfBlocks) & ~(e21nw|e21sw|e41ni|e41si))==0)));
+#endif
+
+ if (currentFlags & eTopLeftOfBlocks) // Avoids doing a lot of checks if nothing is set.
+ {
+// unsigned int pixel;
+ uint32_t pixel;
+ // The three possible scenerios are:
+ // 1: No top left of block bits are set.
+ // 2: 1 top left block bit is set.
+ // 3: 2 top left block bits are set. They are 21nw and 21sw.
+
+ // Note: Due to possibly having two groups tracked by this flag we require the north checks to occur before the south checks.
+ if (currentFlags & e22w)
+ {
+ pixel = get4Pixel(rowA, rowIndex);
+
+ put4Pixel(rowB, rowIndex, pixel);
+ rowIndex += 1;
+ put4Pixel(rowA, rowIndex, pixel);
+ put4Pixel(rowB, rowIndex, pixel);
+
+ rowIndex += 1;
+ continue;
+ }
+
+ if (currentFlags & e12)
+ {
+ put4Pixel(rowB, rowIndex, get4Pixel(rowA, rowIndex));
+
+ rowIndex += 1;
+ continue;
+ }
+
+ if (currentFlags & e42i)
+ {
+ pixel = get4Pixel(rowA, rowIndex);
+
+ put4Pixel(rowB, rowIndex, pixel);
+
+ rowIndex += 1;
+ put4Pixel(rowA, rowIndex, pixel);
+ put4Pixel(rowB, rowIndex, pixel);
+
+ rowIndex += 1;
+ put4Pixel(rowB, rowIndex, pixel);
+ put4Pixel(rowA, rowIndex, pixel);
+
+ rowIndex += 1;
+ put4Pixel(rowA, rowIndex, pixel);
+ put4Pixel(rowB, rowIndex, pixel);
+
+ rowIndex += 1;
+ continue;
+ }
+
+ if (currentFlags & e84ni)
+ {
+ pixel = get4Pixel(rowA, rowIndex);
+
+ put4Pixel(row2Ptr, rowIndex, pixel);
+ put4Pixel(row3Ptr, rowIndex, pixel);
+ put4Pixel(row4Ptr, rowIndex, pixel);
+
+ rowIndex += 1;
+ put4Pixel(row1Ptr, rowIndex, pixel);
+ put4Pixel(row2Ptr, rowIndex, pixel);
+ put4Pixel(row3Ptr, rowIndex, pixel);
+ put4Pixel(row4Ptr, rowIndex, pixel);
+
+ rowIndex += 1;
+ put4Pixel(row1Ptr, rowIndex, pixel);
+ put4Pixel(row2Ptr, rowIndex, pixel);
+ put4Pixel(row3Ptr, rowIndex, pixel);
+ put4Pixel(row4Ptr, rowIndex, pixel);
+
+ rowIndex += 1;
+ put4Pixel(row1Ptr, rowIndex, pixel);
+ put4Pixel(row2Ptr, rowIndex, pixel);
+ put4Pixel(row3Ptr, rowIndex, pixel);
+ put4Pixel(row4Ptr, rowIndex, pixel);
+
+ rowIndex += 1;
+ put4Pixel(row1Ptr, rowIndex, pixel);
+ put4Pixel(row2Ptr, rowIndex, pixel);
+ put4Pixel(row3Ptr, rowIndex, pixel);
+ put4Pixel(row4Ptr, rowIndex, pixel);
+
+ rowIndex += 1;
+ put4Pixel(row1Ptr, rowIndex, pixel);
+ put4Pixel(row2Ptr, rowIndex, pixel);
+ put4Pixel(row3Ptr, rowIndex, pixel);
+ put4Pixel(row4Ptr, rowIndex, pixel);
+
+ rowIndex += 1;
+ put4Pixel(row1Ptr, rowIndex, pixel);
+ put4Pixel(row2Ptr, rowIndex, pixel);
+ put4Pixel(row3Ptr, rowIndex, pixel);
+ put4Pixel(row4Ptr, rowIndex, pixel);
+
+ rowIndex += 1;
+ put4Pixel(row1Ptr, rowIndex, pixel);
+ put4Pixel(row2Ptr, rowIndex, pixel);
+ put4Pixel(row3Ptr, rowIndex, pixel);
+ put4Pixel(row4Ptr, rowIndex, pixel);
+
+ rowIndex += 1;
+
+ continue;
+ }
+
+ if (currentFlags & e24nw)
+ {
+ pixel = get4Pixel(row1Ptr, rowIndex);
+
+ put4Pixel(row2Ptr, rowIndex, pixel);
+ put4Pixel(row3Ptr, rowIndex, pixel);
+ put4Pixel(row4Ptr, rowIndex, pixel);
+
+ rowIndex += 1;
+ put4Pixel(row1Ptr, rowIndex, pixel);
+ put4Pixel(row2Ptr, rowIndex, pixel);
+ put4Pixel(row3Ptr, rowIndex, pixel);
+ put4Pixel(row4Ptr, rowIndex, pixel);
+
+ rowIndex += 1;
+ continue;
+ }
+
+ if (currentFlags & e44ni)
+ {
+ pixel = get4Pixel(row1Ptr, rowIndex);
+
+ put4Pixel(row2Ptr, rowIndex, pixel);
+ put4Pixel(row3Ptr, rowIndex, pixel);
+ put4Pixel(row4Ptr, rowIndex, pixel);
+
+ rowIndex += 1;
+ put4Pixel(row1Ptr, rowIndex, pixel);
+ put4Pixel(row2Ptr, rowIndex, pixel);
+ put4Pixel(row3Ptr, rowIndex, pixel);
+ put4Pixel(row4Ptr, rowIndex, pixel);
+
+ rowIndex += 1;
+ put4Pixel(row1Ptr, rowIndex, pixel);
+ put4Pixel(row2Ptr, rowIndex, pixel);
+ put4Pixel(row3Ptr, rowIndex, pixel);
+ put4Pixel(row4Ptr, rowIndex, pixel);
+
+ rowIndex += 1;
+ put4Pixel(row1Ptr, rowIndex, pixel);
+ put4Pixel(row2Ptr, rowIndex, pixel);
+ put4Pixel(row3Ptr, rowIndex, pixel);
+ put4Pixel(row4Ptr, rowIndex, pixel);
+
+ rowIndex += 1;
+ continue;
+ }
+
+ if (currentFlags & e14n)
+ {
+ pixel = get4Pixel(row1Ptr, rowIndex);
+
+ put4Pixel(row2Ptr, rowIndex, pixel);
+ put4Pixel(row3Ptr, rowIndex, pixel);
+ put4Pixel(row4Ptr, rowIndex, pixel);
+
+ rowIndex += 1;
+ continue;
+ }
+
+ if (currentFlags & e21nw)
+ {
+ put4Pixel(rowA, rowIndex+1, get4Pixel(rowA, rowIndex));
+
+ if (!(currentFlags & (e21sw|e41si))) // if no south groups
+ {
+ rowIndex += 2;
+ continue;
+ }
+ }
+
+ if (currentFlags & e41ni)
+ {
+ pixel = get4Pixel(rowA, rowIndex);
+
+ put4Pixel(rowA, rowIndex+1, pixel);
+ put4Pixel(rowA, rowIndex+2, pixel);
+ put4Pixel(rowA, rowIndex+3, pixel);
+
+ if (!(currentFlags & (e21sw|e41si))) // if no south groups.
+ {
+ rowIndex += 2;
+ continue;
+ }
+ }
+
+ if (currentFlags & e21sw)
+ {
+ put4Pixel(rowB, rowIndex+1, get4Pixel(rowB, rowIndex));
+
+ rowIndex += 2;
+ continue;
+ }
+
+ if (currentFlags & e41si)
+ {
+ pixel = get4Pixel(rowB, rowIndex);
+
+ put4Pixel(rowB, rowIndex+1, pixel);
+ put4Pixel(rowB, rowIndex+2, pixel);
+ put4Pixel(rowB, rowIndex+3, pixel);
+
+ rowIndex += 2;
+ continue;
+ }
+ }
+ rowIndex += 1;
+ }
+ }
+}
+
+#endif // kMemWritesOptimize
+
+bool ErnieFilter::Process (RASTERDATA* ImageData)
+{
+ if ( ImageData == NULL ||
+ (ImageData->rasterdata[COLORTYPE_COLOR] == NULL && ImageData->rasterdata[COLORTYPE_BLACK] == NULL))
+ {
+ return false;
+ }
+ if (ImageData->rasterdata[COLORTYPE_BLACK])
+ {
+ memcpy(m_black_row_ptrs[m_row_index], ImageData->rasterdata[COLORTYPE_BLACK],
+ (ImageData->rastersize[COLORTYPE_BLACK] + 7) / 8);
+ }
+ m_black_raster_sizes[m_row_index++] = ImageData->rastersize[COLORTYPE_BLACK];
+
+ if (m_row_index == 4)
+ m_row_index = 0;
+ if (ImageData->rasterdata[COLORTYPE_COLOR])
+ {
+ submitRowToFilter(ImageData->rasterdata[COLORTYPE_COLOR]);
+
+ // something ready after 4th time only
+ return (m_buffered_row_count == 0);
+ }
+ iRastersReady = 1;
+ return true;
+} //Process
+
+bool ErnieFilter::NextOutputRaster(RASTERDATA& next_raster)
+{
+ if (iRastersReady == 0){
+ return false;
+ }
+
+ next_raster.rastersize[COLORTYPE_COLOR] = m_row_width_in_pixels * m_input_bytes_per_pixel;
+ next_raster.rasterdata[COLORTYPE_COLOR] = m_row_ptrs[iRastersDelivered];
+ next_raster.rastersize[COLORTYPE_BLACK] = m_black_raster_sizes[iRastersDelivered];
+ if ( m_black_raster_sizes[iRastersDelivered] > 0 ){
+ next_raster.rasterdata[COLORTYPE_BLACK] = m_black_row_ptrs[iRastersDelivered];
+ } else {
+ next_raster.rasterdata[COLORTYPE_BLACK] = NULL;
+ }
+ iRastersReady--;
+ iRastersDelivered++;
+ if (iRastersDelivered == 4) iRastersDelivered = 0;
+ return true;
+} //NextOutputRaster
+
+unsigned int ErnieFilter::GetMaxOutputWidth()
+{
+ return m_row_width_in_pixels * m_input_bytes_per_pixel;
+} //GetMaxOutputWidth
+
+void ErnieFilter::Flush()
+{
+ writeBufferedRows();
+ iRastersDelivered=0;
+ m_pixel_offsets_index = 0;
+ iRastersReady = m_buffered_row_count;
+ m_buffered_row_count = 0;
+ m_row_index = 0;
+} //Flush
+
diff --git a/prnt/hpcups/ErnieFilter.h b/prnt/hpcups/ErnieFilter.h
new file mode 100644
index 0000000..66bdf15
--- /dev/null
+++ b/prnt/hpcups/ErnieFilter.h
@@ -0,0 +1,238 @@
+////////////////////////////////////////////////////////////////////////////////
+// Copyright (c) 1996 - 2008, Hewlett-Packard Development Company, L.P.
+// All rights reserved.
+//
+// This software is licensed solely for use with HP products. Redistribution
+// and use with HP products in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// - Redistributions of source code must retain the above copyright notice,
+// this list of conditions and the following disclaimer.
+// - Redistributions in binary form must reproduce the above copyright
+// notice, this list of conditions and the following disclaimer in the
+// documentation and/or other materials provided with the distribution.
+// - Neither the name of Hewlett-Packard nor the names of its contributors
+// may be used to endorse or promote products derived from this software
+// without specific prior written permission.
+// - Redistributors making defect corrections to source code grant to
+// Hewlett-Packard the right to use and redistribute such defect
+// corrections.
+//
+// This software contains technology licensed from third parties; use with
+// non-HP products is at your own risk and may require a royalty.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL HEWLETT-PACKARD OR ITS
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+////////////////////////////////////////////////////////////////////////////////
+
+
+#ifndef ERNIEFILTER_H
+#define ERNIEFILTER_H
+
+#include "CommonDefinitions.h"
+#include "Processor.h"
+
+
+/* flags that track the block formations use bits which are specified in the
+ following enumeration. The first number is the horizontal block size. The
+ second number is the vertical block size. Then north (upper) or south (lower)
+ and west (left) or east (right) are specified when appropriate. Finally if a
+ location sequence number is needed then it is listed.
+*/
+
+// Slow down the system and gather stats or not.
+#define kGatherStats 0
+#define kDecompressStats 0
+
+enum eBlockType
+{
+ eDone = 0x0,
+ e11n = 0x00000001,
+ e11s = 0x00000002,
+ e12 = 0x00000004,
+ e14n = 0x00000008,
+ e14s = 0x00000010,
+ e21nw = 0x00000020,
+ e21ne = 0x00000040,
+ e21sw = 0x00000080,
+ e21se = 0x00000100,
+ e22w = 0x00000200,
+ e22e = 0x00000400,
+ e24nw = 0x00000800,
+ e24ne = 0x00001000,
+ e24sw = 0x00002000,
+ e24se = 0x00004000,
+ e41ni = 0x00008000,
+ e41n = 0x00010000,
+ e41si = 0x00020000,
+ e41s = 0x00040000,
+ e42i = 0x00080000,
+ e42 = 0x00100000,
+ e44ni = 0x00200000,
+ e44n = 0x00400000,
+ e44si = 0x00800000,
+ e44s = 0x01000000,
+ e84ni = 0x02000000,
+ e84n = 0x04000000,
+ e84si = 0x08000000,
+ e84s = 0x10000000,
+
+ eNorths = e11n | e21nw | e21ne | e41ni | e41n,
+ eSouths = e11s | e21sw | e21se | e41si | e41s,
+ eTheRest = ~(eNorths|eSouths),
+
+ eTopLeftOfBlocks = e12 | e14n | e21nw | e21sw | e22w | e24nw | e41ni | e41si | e42i | e44ni | e84ni
+};
+
+#define isOdd(x) (x & 0x01)
+#define isWhite(x) (((x) & kWhite) == kWhite)
+
+#define kMemWritesOptimize 1 // disables mem write optimizations.
+
+//#ifndef kGatherStats
+//#error "must define kGatherStats. Try including platform.h"
+//#endif
+
+#if kGatherStats == 1
+
+// Used now to track blocks being formed. These enums are only used in gathering
+// statistics for the developer to look at later. These are not critical to the actual
+// functioning of the algorithms.
+
+enum StatisticBlocks
+{
+ es11n = 0,
+ es11s,
+ es12,
+ es14n,
+ es14s,
+ es21nw,
+ es21ne,
+ es21sw,
+ es21se,
+ es22w,
+ es22e,
+ es24nw,
+ es24ne,
+ es24sw,
+ es24se,
+ es41ni,
+ es41n,
+ es41si,
+ es41s,
+ es42i,
+ es42,
+ es44ni,
+ es44n,
+ es44si,
+ es44s,
+ es84ni,
+ es84n,
+ es84si,
+ es84s,
+
+ esDoneStat,
+ esWhiteFound,
+
+ eLastAveragingFlagPosition
+};
+
+#endif
+
+enum pixelTypes
+{
+ eBGRPixelData = 0
+};
+
+class ErnieFilter : public Processor
+{
+public:
+ ErnieFilter(int rowWidthInPixels, pixelTypes pixelType, unsigned int maxErrorForTwoPixels);
+ virtual ~ErnieFilter();
+
+ // Processor interface /////////////////////////////////////
+ bool Process(RASTERDATA* InputRaster=NULL);
+ void Flush();
+ unsigned int GetMaxOutputWidth();
+ bool NextOutputRaster(RASTERDATA& next_raster);
+ /////////////////////////////////////////////////////////////
+
+private:
+ uint32_t *m_row_bufs[4];
+ unsigned char *m_row_ptrs[4];
+ BYTE *m_black_row_ptrs[4];
+ unsigned int m_black_raster_sizes[4];
+ unsigned char *m_compression_out_buf;
+ unsigned int *m_pixel_filtered_flags[2];
+
+ int m_buffered_row_count;
+ int m_pixel_offsets[8];
+ int m_pixel_offsets_index;
+ int m_row_width_in_pixels;
+ int m_row_width_in_bytes;
+ int m_internal_bytes_per_pixel;
+ int m_input_bytes_per_pixel;
+ unsigned int m_max_error_for_two_pixels;
+ int m_row_index;
+
+ void submitRowToFilter(unsigned char *rowPtr);
+ void writeBufferedRows();
+ void Filter1RawRow(unsigned char *currPtr, int rowWidthInPixels, unsigned int *flagsPtr);
+ void Filter2RawRows(unsigned char *currPtr, unsigned char *upPtr, int rowWidthInPixels, unsigned int *flagsPtr);
+ void Filter2PairsOfFilteredRows(unsigned char *row1Ptr, unsigned char *row2Ptr, unsigned char *row3Ptr, unsigned char *row4Ptr);
+ void Filter3FilteredRows(unsigned char *row1Ptr, unsigned char *row2Ptr, unsigned char *row3Ptr);
+ inline unsigned int DeltaE(int dr0, int dr1, int dg0, int dg1, int db0, int db1);
+ inline bool NewDeltaE(int dr0, int dr1, int dg0, int dg1, int db0, int db1, int tolerance);
+ inline unsigned int GradDeltaE(int dr, int dg, int db);
+
+#if kMemWritesOptimize == 1
+ void WriteBlockPixels();
+#endif
+
+ enum
+ {
+ eBufferedPixelWidthInBytes = 4
+ };
+
+ ENDIAN_TYPE m_eEndian;
+
+ inline uint32_t get4Pixel(unsigned char *pixAddress)
+ {
+ #ifdef APDK_LITTLE_ENDIAN
+ return (((unsigned int*)pixAddress)[0]) & kWhite;
+ #else
+ return (((unsigned int*)pixAddress)[0]) & 0xFFFFFF00;
+ #endif
+ }
+
+ inline uint32_t get4Pixel(unsigned char *pixAddress, int pixelOffset)
+ {
+ #ifdef APDK_LITTLE_ENDIAN
+ return *(((unsigned int*)pixAddress)+pixelOffset) & kWhite;
+ #else
+ return *(((unsigned int*)pixAddress)+pixelOffset) & 0xFFFFFF00;
+ #endif
+ }
+
+ inline void put4Pixel(unsigned char *pixAddress, int pixelOffset, uint32_t pixel)
+ {
+ #ifdef APDK_LITTLE_ENDIAN
+ *(((unsigned int*)pixAddress)+pixelOffset) = pixel & kWhite;
+ #else
+ *(((unsigned int*)pixAddress)+pixelOffset) = pixel & 0xFFFFFF00;
+ #endif
+ }
+
+}; // ErnieFilter
+
+#endif // ERNIEFILTER_H
+
diff --git a/prnt/hpcups/HPCupsFilter.cpp b/prnt/hpcups/HPCupsFilter.cpp
new file mode 100644
index 0000000..8cd40c3
--- /dev/null
+++ b/prnt/hpcups/HPCupsFilter.cpp
@@ -0,0 +1,867 @@
+/*****************************************************************************\
+ HPCupsFilter.cpp : Interface for HPCupsFilter class
+
+ Copyright (c) 1996 - 2009, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ Author: Naga Samrat Chowdary Narla, Sanjay Kumar, Amarnath Chitumalla
+\*****************************************************************************/
+
+#include "HPCupsFilter.h"
+#include <signal.h>
+#include <sys/wait.h>
+#include <sys/utsname.h>
+#include <time.h>
+#include <sys/timeb.h>
+
+#define HP_FILE_VERSION_STR "03.09.08.0"
+
+static HPCupsFilter filter;
+int main (int argc, char *argv[])
+{
+ openlog("hpcups", LOG_PID, LOG_DAEMON);
+
+ if (argc < 6 || argc > 7) {
+ dbglog("ERROR: %s job-id user title copies options [file]\n", *argv);
+ return JOB_CANCELED;
+ }
+
+ return filter.StartPrintJob(argc, argv);
+}
+
+void HPCancelJob(int sig)
+{
+ filter.CancelJob();
+ exit(0);
+}
+
+void HPCupsFilter::CreateBMPHeader (int width, int height, int planes, int bpp)
+{
+ memset (&this->bmfh, 0, 14);
+ memset (&this->bmih, 0, 40);
+ bmfh.bfOffBits = 54;
+ bmfh.bfType = 0x4d42;
+ bmfh.bfReserved1 = 0;
+ bmfh.bfReserved2 = 0;
+ bmih.biSize = DBITMAPINFOHEADER;
+ bmih.biWidth = width;
+ bmih.biHeight = -height;
+ bmih.biPlanes = 1;
+ bmih.biBitCount = planes * bpp;
+ bmih.biCompression = 0;
+ bmih.biSizeImage = width * height * planes * bpp / 8;
+ bmih.biClrImportant = 0;
+ bmih.biClrUsed = (planes == 3) ? 0 : 2;
+ bmih.biXPelsPerMeter = 0;
+ bmih.biYPelsPerMeter = 0;
+
+ bmfh.bfOffBits += bmih.biClrUsed * 4;
+ bmfh.bfSize = bmih.biSizeImage + bmfh.bfOffBits;
+}
+
+void HPCupsFilter::WriteBMPHeader (FILE *fp, int width, int height, eRasterType raster_type)
+{
+ if (fp == NULL)
+ {
+ return;
+ }
+ if (raster_type == BLACK_RASTER)
+ {
+ WriteKBMPHeader (fp, width, height);
+ }
+ else
+ {
+ WriteCBMPHeader (fp, width, height);
+ }
+}
+
+void HPCupsFilter::WriteCBMPHeader (FILE *fp, int width, int height)
+{
+ if (fp == NULL)
+ return;
+ adj_c_width = width;
+ if (width % 4)
+ {
+ adj_c_width = (width / 4 + 1) * 4;
+ }
+ color_raster = new BYTE[adj_c_width * 3];
+ memset (color_raster, 0xFF, adj_c_width * 3);
+ CreateBMPHeader(adj_c_width, height, 3, 8);
+ fwrite (&this->bmfh.bfType, 1, sizeof (short), fp);
+ fwrite (&this->bmfh.bfSize, 1, sizeof (int), fp);
+ fwrite (&this->bmfh.bfReserved1, 1, sizeof (short), fp);
+ fwrite (&this->bmfh.bfReserved2, 1, sizeof (short), fp);
+ fwrite (&this->bmfh.bfOffBits, 1, sizeof (int), fp);
+ fwrite (&this->bmih, 1, DBITMAPINFOHEADER, fp);
+}
+
+void HPCupsFilter::WriteKBMPHeader(FILE *fp, int width, int height)
+{
+ BYTE cmap[8];
+ if (fp == NULL)
+ return;
+ adj_k_width = width;
+ if (width % 32)
+ {
+ adj_k_width = (width / 32 + 1) * 32;
+ }
+ CreateBMPHeader(adj_k_width, height, 1, 1);
+ adj_k_width /= 8;
+ black_raster = new BYTE[adj_k_width];
+ memset (black_raster, 0, adj_k_width);
+
+ fwrite (&this->bmfh.bfType, 1, sizeof (short), fp);
+ fwrite (&this->bmfh.bfSize, 1, sizeof (int), fp);
+ fwrite (&this->bmfh.bfReserved1, 1, sizeof (short), fp);
+ fwrite (&this->bmfh.bfReserved2, 1, sizeof (short), fp);
+ fwrite (&this->bmfh.bfOffBits, 1, sizeof (int), fp);
+ fwrite (&this->bmih, 1, DBITMAPINFOHEADER, fp);
+ memset(cmap, 0, sizeof(cmap));
+ cmap[0] = cmap[1] = cmap[2] = cmap[3] = 255;
+ fwrite(cmap, 1, sizeof(cmap), fp);
+}
+
+void HPCupsFilter::WriteBMPRaster (FILE *fp, BYTE *raster, int width, eRasterType raster_type)
+{
+ if (raster_type == BLACK_RASTER)
+ return WriteKBMPRaster (fp, raster, width);
+ else
+ return WriteCBMPRaster (fp, raster, width);
+}
+
+void HPCupsFilter::WriteCBMPRaster (FILE *fp, BYTE *pbyrgb, int width)
+{
+ if (fp == NULL)
+ return;
+ //BYTE c[3];
+ int i;
+ BYTE *p = pbyrgb;
+ BYTE *q = color_raster;
+ if (pbyrgb == NULL)
+ {
+ memset (color_raster, 0xFF, adj_c_width * 3);
+ }
+ else
+ {
+ for (i = 0; i < width; i++) {
+ q[0] = p[2];
+ q[1] = p[1];
+ q[2] = p[0];
+ p += 3;
+ q += 3;
+ }
+ }
+ fwrite (color_raster, 1, adj_c_width * 3, fp);
+}
+
+void HPCupsFilter::WriteKBMPRaster (FILE *fp, BYTE *pbyk, int width)
+{
+ if (fp == NULL)
+ return;
+ if (pbyk == NULL)
+ {
+ memset (black_raster, 0, adj_k_width);
+ }
+ else
+ {
+ memcpy (black_raster, pbyk, width);
+ }
+ fwrite (black_raster, 1, adj_k_width, fp);
+}
+
+HPCupsFilter::HPCupsFilter() : m_pPrinterBuffer(NULL)
+{
+ setbuf (stderr, NULL);
+
+ adj_c_width = 0;
+ adj_k_width = 0;
+ black_raster = NULL;
+ color_raster = NULL;
+}
+
+HPCupsFilter::~HPCupsFilter()
+{
+
+}
+
+void HPCupsFilter::closeFilter ()
+{
+ //! If we printed any pages, end the current job instance.
+ m_Job.Cleanup();
+ cleanup();
+}
+
+void HPCupsFilter::cleanup()
+{
+ if (m_pPrinterBuffer) {
+ delete [] m_pPrinterBuffer;
+ }
+
+ if(m_ppd){
+ ppdClose(m_ppd);
+ m_ppd = NULL;
+ }
+}
+
+void HPCupsFilter::CancelJob()
+{
+ m_Job.CancelJob();
+ cleanup();
+}
+
+DRIVER_ERROR HPCupsFilter::startPage (cups_page_header2_t *cups_header)
+{
+ DRIVER_ERROR err = NO_ERROR;
+ ppd_attr_t *attr;
+ int xoverspray = 120;
+ int yoverspray = 60;
+
+/*
+ * Check for invalid data
+ */
+ if (cups_header->HWResolution[0] == 100 && cups_header->HWResolution[1] == 100)
+ {
+
+/*
+ * Something went wrong, cups is defaulting to 100 dpi.
+ * Some inkjet printers do not support 100 dpi. Return error.
+ */
+
+ dbglog("ERROR: Unsupported resolution\n");
+ return JOB_CANCELED;
+ }
+
+// XOverSpray and YOverSpray are entered as fractional value * 1000
+
+ if (((attr = ppdFindAttr(m_ppd, "HPXOverSpray", NULL)) != NULL) &&
+ (attr && attr->value != NULL)) {
+ xoverspray = atoi(attr->value);
+ }
+ if (((attr = ppdFindAttr(m_ppd, "HPYOverSpray", NULL)) != NULL) &&
+ (attr && attr->value != NULL)) {
+ yoverspray = atoi(attr->value);
+ }
+
+ if (m_iLogLevel & BASIC_LOG) {
+ printCupsHeaderInfo(cups_header);
+ }
+
+ m_JA.quality_attributes.media_type = cups_header->cupsMediaType;
+ m_JA.quality_attributes.print_quality = atoi(cups_header->OutputType);
+ m_JA.quality_attributes.horizontal_resolution = cups_header->HWResolution[0];
+ m_JA.quality_attributes.vertical_resolution = cups_header->HWResolution[1];
+ m_JA.quality_attributes.actual_vertical_resolution = cups_header->HWResolution[1];
+
+// Get the printer's actual resolution, may be different than what is reported
+ char *p;
+ if ((p = strstr (cups_header->OutputType, "_"))) {
+ int x = 0, y = 0;
+ p++;
+ x = atoi(p);
+ while (*p && *p != 'x')
+ p++;
+ if (*p && *p == 'x') {
+ p++;
+ y = atoi(p);
+ }
+// Currently, there is one printer with one printmode that supports lower y-resolution
+ if (y != 0) {
+ m_JA.quality_attributes.actual_vertical_resolution = y;
+ }
+ }
+ m_JA.color_mode = cups_header->cupsRowStep;
+ m_JA.media_source = cups_header->MediaPosition;
+
+ m_JA.print_borderless = (cups_header->ImagingBoundingBox[0] == 0) ? true : false;
+ if (cups_header->Duplex) {
+ m_JA.e_duplex_mode = (cups_header->Tumble == 0) ? DUPLEXMODE_BOOK : DUPLEXMODE_TABLET;
+ }
+ else {
+ m_JA.e_duplex_mode = DUPLEXMODE_NONE;
+ }
+ m_JA.krgb_mode = (cups_header->cupsColorSpace == CUPS_CSPACE_RGBW) ? true : false;
+
+ /*
+ * Cups PageSize dimensions are in PostScript units, which are 72 units to an inch
+ * and is stored as <width, height>
+ * The ImagingBoundingBox is in PostScript units and are stored as <lower_left> <upper_right>
+ * and <0, 0> is at the bottom left
+ * lower_left_x = ImagingBoundingBox[0]
+ * lower_left_y = ImagingBoundingBox[1]
+ * upper_right_x = ImagingBoundingBox[2]
+ * upper_right_y = ImagingBoundingBox[3]
+ * We require <top_left> <bottom_right> values and <0, 0> is top left
+ * So,
+ * PrintableStartX = lower_left_x
+ * PrintableStartY = PhysicalPageHeight - upper_right_y
+ */
+
+ int horz_res = cups_header->HWResolution[0];
+ int vert_res = cups_header->HWResolution[1];
+ m_JA.media_attributes.pcl_id = cups_header->cupsInteger[0];
+ m_JA.media_attributes.physical_width = (cups_header->PageSize[0] * horz_res) / 72;
+ m_JA.media_attributes.physical_height = (cups_header->PageSize[1] * vert_res) / 72;
+ m_JA.media_attributes.printable_width = cups_header->cupsWidth;
+ m_JA.media_attributes.printable_height = cups_header->cupsHeight;
+
+ m_JA.media_attributes.printable_start_x = (cups_header->Margins[0] * horz_res) / 72;
+ m_JA.media_attributes.printable_start_y = ((cups_header->PageSize[1] - cups_header->ImagingBoundingBox[3]) * vert_res) / 72;
+
+ m_JA.media_attributes.horizontal_overspray = (xoverspray * horz_res) / 1000;
+ m_JA.media_attributes.vertical_overspray = (yoverspray * vert_res) / 1000;
+
+ /*
+ * Left and top overspray in dots. We haven't defined ovespray for all classes in the drv.
+ * Hence using default values in the case of older classes.
+ */
+ m_JA.media_attributes.left_overspray = cups_header->cupsReal[0] ? (cups_header->cupsReal[0] * horz_res) : m_JA.media_attributes.horizontal_overspray / 2;
+ m_JA.media_attributes.top_overspray = cups_header->cupsReal[1] ? (cups_header->cupsReal[1] * vert_res) : m_JA.media_attributes.vertical_overspray / 2;
+
+ if (((attr = ppdFindAttr(m_ppd, "HPMechOffset", NULL)) != NULL) &&
+ (attr && attr->value != NULL)) {
+ m_JA.mech_offset = atoi(attr->value);
+ }
+
+// Get printer platform name
+ if (((attr = ppdFindAttr(m_ppd, "hpPrinterPlatform", NULL)) != NULL) && (attr->value != NULL)) {
+
+ strncpy(m_JA.printer_platform, attr->value, sizeof(m_JA.printer_platform)-1);
+
+ if (m_iLogLevel & BASIC_LOG) {
+ dbglog("HPCUPS: found Printer Platform, it is - %s\n", attr->value);
+ }
+
+ if(strcmp(m_JA.printer_platform, "ljzjscolor") == 0){
+ if(((attr = ppdFindAttr(m_ppd, "hpLJZjsColorVersion", NULL)) != NULL) && (attr->value != NULL)){
+ m_JA.printer_platform_version = atoi(attr->value);
+ }
+ }
+ }
+
+//Get Raster Preprocessing status
+ if(((attr = ppdFindAttr(m_ppd, "hpReverseRasterPages", NULL)) != NULL) && (attr->value != NULL)){
+ m_JA.pre_process_raster = atoi(attr->value);
+ }
+
+
+// Get the encapsulation technology from ppd
+
+ if (((attr = ppdFindAttr(m_ppd, "hpPrinterLanguage", NULL)) == NULL) ||
+ (attr && attr->value == NULL)) {
+ dbglog("DEBUG: Bad PPD - hpPrinterLanguage not found\n");
+ ppdClose(m_ppd);
+ m_ppd = NULL;
+ return SYSTEM_ERROR;
+ }
+ strncpy(m_JA.printer_language, attr->value, sizeof(m_JA.printer_language)-1);
+ if (m_iLogLevel & BASIC_LOG) {
+ dbglog("HPCUPS: found Printer Language, it is - %s\n", attr->value);
+ }
+
+// Fill in the other PCL header info
+
+ struct utsname uts_name;
+ uname(&uts_name);
+ strncpy(m_JA.job_title, m_argv[3], sizeof(m_JA.job_title)-1);
+ strncpy(m_JA.user_name, m_argv[2], sizeof(m_JA.user_name)-1);
+ strncpy(m_JA.host_name, uts_name.nodename, sizeof(m_JA.host_name)-1);
+ strncpy(m_JA.os_name, uts_name.sysname, sizeof(m_JA.os_name)-1);
+ getdomainname(m_JA.domain_name, sizeof(m_JA.domain_name) - 1);
+ int i = strlen(m_argv[0]) - 1;
+ while (i >= 0 && m_argv[0][i] != '/') {
+ i--;
+ }
+ snprintf(m_JA.driver_name, sizeof(m_JA.driver_name), "%s; %s", &m_argv[0][i+1], HP_FILE_VERSION_STR);
+ char *ptr = getenv("DEVICE_URI");
+ i = 0;
+ if (ptr) {
+ while (*ptr) {
+ if (*ptr == '%') {
+ ptr += 3;
+ m_JA.printer_name[i++] = ' ';
+ }
+ m_JA.printer_name[i++] = *ptr++;
+ }
+ }
+
+ string strPrinterURI="" ,strPrinterName= "";
+ m_DBusComm.initDBusComm(DBUS_PATH,DBUS_INTERFACE, getenv("DEVICE_URI"), m_JA.printer_name);
+
+ ptr = strstr(m_argv[5], "job-uuid");
+ if (ptr) {
+ strncpy(m_JA.uuid, ptr + strlen("job-uuid=urn:uuid:"), sizeof(m_JA.uuid)-1);
+ }
+
+ for (i = 0; i < 16; i++)
+ m_JA.integer_values[i] = cups_header->cupsInteger[i];
+
+ if (cups_header->cupsString[0]) {
+ strncpy(m_JA.quality_attributes.print_mode_name, &cups_header->cupsString[0][0],
+ sizeof(m_JA.quality_attributes.print_mode_name)-1);
+ }
+ Encapsulator *encap_interface = EncapsulatorFactory::GetEncapsulator(attr->value);
+ if ((err = m_Job.Init(m_pSys, &m_JA, encap_interface)) != NO_ERROR)
+ {
+ if (err == PLUGIN_LIBRARY_MISSING)
+ {
+ fputs ("STATE: +hplip.plugin-error\n", stderr);
+
+ m_DBusComm.sendEvent(EVENT_PRINT_FAILED_MISSING_PLUGIN, "Plugin missing", m_JA.job_id, m_JA.user_name);
+
+ }
+ dbglog ("m_Job initialization failed with error = %d", err);
+ ppdClose(m_ppd);
+ m_ppd = NULL;
+ return err;
+ }
+
+ if (m_iLogLevel & BASIC_LOG) {
+ dbglog("HPCUPS: returning NO_ERROR from startPage\n");
+ }
+
+ m_pPrinterBuffer = new BYTE[cups_header->cupsWidth * 4 + 32];
+
+
+ return NO_ERROR;
+}
+
+int HPCupsFilter::StartPrintJob(int argc, char *argv[])
+{
+ int fd = 0;
+ cups_raster_t *cups_raster;
+ int err = 0;
+
+ memset(&m_JA, 0, sizeof(JobAttributes));
+ struct tm *t;
+ struct timeb tb;
+ time_t long_time;
+ time(&long_time);
+ t = localtime(&long_time);
+ ftime(&tb);
+ strncpy(m_JA.job_start_time, asctime(t), sizeof(m_JA.job_start_time)-1); // returns Fri Jun 5 08:12:16 2009
+ snprintf(m_JA.job_start_time+19, sizeof(m_JA.job_start_time) - 20, ":%d %d", tb.millitm, t->tm_year + 1900); // add milliseconds
+
+ getLogLevel();
+ m_JA.job_id = atoi(argv[1]);
+ FILE *fp;
+ char dFileName[32];
+ memset(dFileName, 0, sizeof(dFileName));
+ m_JA.job_id = atoi(argv[1]);
+ snprintf (dFileName, sizeof(dFileName), "/var/spool/cups/d%05d-001", m_JA.job_id);
+ if ((fp = fopen (dFileName, "r")))
+ {
+ char line[258];
+ for (int i = 0; i < 10; i++)
+ {
+ fgets (line, 256, fp);
+ if (!strncmp (line, "%%Pages:", 8))
+ {
+ sscanf (line+9, "%d", &m_JA.total_pages);
+ break;
+ }
+ }
+ fclose (fp);
+ }
+
+ m_ppd = ppdOpenFile(getenv("PPD"));
+ if (m_ppd == NULL) {
+ dbglog("DEBUG: ppdOpenFile failed for %s\n", getenv("PPD"));
+ return SYSTEM_ERROR;
+ }
+
+ m_argv = argv;
+ if (m_iLogLevel & BASIC_LOG) {
+ for (int i = 0; i < argc; i++) {
+ dbglog("argv[%d] = %s\n", i, argv[i]);
+ }
+ }
+
+ if (argc == 7)
+ {
+ if (m_iLogLevel & BASIC_LOG)
+ {
+ dbglog("Page Stream Data Name: %s\n", argv[6] );
+ }
+ if ((fd = open (argv[6], O_RDONLY)) == -1)
+ {
+ perror("ERROR: Unable to open raster file - ");
+ return 1;
+ }
+ }
+
+ m_pSys = new SystemServices(m_iLogLevel, m_JA.job_id);
+
+/*
+ * When user cancels a print job, the spooler sends SIGTERM signal
+ * to the filter. Must catch this signal to send end job sequence
+ * to the printer.
+ */
+
+ signal(SIGTERM, HPCancelJob);
+
+
+ cups_raster = cupsRasterOpen(fd, CUPS_RASTER_READ);
+
+ if (cups_raster == NULL) {
+ dbglog("cupsRasterOpen failed, fd = %d\n", fd);
+ if (fd != 0) {
+ close(fd);
+ }
+ closeFilter();
+ return 1;
+ }
+
+ if ((err = processRasterData(cups_raster))) {
+ if (fd != 0) {
+ close(fd);
+ }
+ if (m_iLogLevel & BASIC_LOG)
+ dbglog("HPCUPS: processRasterData returned %d, calling closeFilter()", err);
+ closeFilter();
+ cupsRasterClose(cups_raster);
+ return 1;
+ }
+
+ if (fd != 0) {
+ close(fd);
+ }
+ if (m_iLogLevel & BASIC_LOG)
+ dbglog("HPCUPS: StartPrintJob end of job, calling closeFilter()");
+ closeFilter();
+ cupsRasterClose(cups_raster);
+ return 0;
+}
+
+bool HPCupsFilter::isBlankRaster(BYTE *input_raster, cups_page_header2_t *header)
+{
+ int length_in_bytes = (int)header->cupsBytesPerLine;
+ if (input_raster == NULL) {
+ return true;
+ }
+
+ if(header->cupsColorSpace == CUPS_CSPACE_K){
+ if (*input_raster == 0x00 &&
+ !(memcmp(input_raster + 1, input_raster, length_in_bytes - 1))) {
+ return true;
+ }
+ }
+ else{
+ if (*input_raster == 0xFF &&
+ !(memcmp(input_raster + 1, input_raster, length_in_bytes - 1))) {
+ return true;
+ }
+ }
+ return false;
+}
+
+
+int HPCupsFilter::processRasterData(cups_raster_t *cups_raster)
+{
+ FILE *kfp = NULL;
+ FILE *cfp = NULL;
+ BYTE *kRaster = NULL;
+ BYTE *rgbRaster = NULL;
+ int current_page_number = 0;
+ cups_page_header2_t cups_header;
+ DRIVER_ERROR err;
+ int ret_status = 0;
+ char hpPreProcessedRasterFile[] = "/tmp/hplipSwapedPagesXXXXXX"; //temp file needed to store raster data with swaped pages.
+
+ while (cupsRasterReadHeader2(cups_raster, &cups_header))
+ {
+ current_page_number++;
+
+ if (current_page_number == 1) {
+
+ if (startPage(&cups_header) != NO_ERROR) {
+ return JOB_CANCELED;
+ }
+
+ if(m_JA.pre_process_raster) {
+ err = m_Job.preProcessRasterData(&cups_raster, &cups_header, hpPreProcessedRasterFile);
+ if (err != NO_ERROR) {
+ if (m_iLogLevel & BASIC_LOG) {
+ dbglog ("DEBUG: Job::StartPage failed with err = %d\n", err);
+ }
+ ret_status = JOB_CANCELED;
+ break;
+ }
+ }
+
+ if (cups_header.cupsColorSpace == CUPS_CSPACE_RGBW) {
+ rgbRaster = new BYTE[cups_header.cupsWidth * 3];
+ if (rgbRaster == NULL) {
+ return ALLOCMEM_ERROR;
+ }
+ kRaster = new BYTE[cups_header.cupsWidth];
+ if (kRaster == NULL) {
+ delete [] rgbRaster;
+ return ALLOCMEM_ERROR;
+ }
+ memset (kRaster, 0, cups_header.cupsWidth);
+ memset (rgbRaster, 0xFF, cups_header.cupsWidth * 3);
+ }
+ } // current_page_number == 1
+
+ if (cups_header.cupsColorSpace == CUPS_CSPACE_K) {
+ kRaster = m_pPrinterBuffer;
+ rgbRaster = NULL;
+ }
+ else if (cups_header.cupsColorSpace != CUPS_CSPACE_RGBW) {
+ rgbRaster = m_pPrinterBuffer;
+ kRaster = NULL;
+ }
+
+ BYTE *color_raster = NULL;
+ BYTE *black_raster = NULL;
+
+ err = m_Job.StartPage(&m_JA);
+ if (err != NO_ERROR) {
+ if (m_iLogLevel & BASIC_LOG) {
+ dbglog ("DEBUG: Job::StartPage failed with err = %d\n", err);
+ }
+ ret_status = JOB_CANCELED;
+ break;
+ }
+
+ if (m_iLogLevel & SAVE_INPUT_RASTERS)
+ {
+ char szFileName[32];
+ memset(szFileName, 0, sizeof(szFileName));
+ snprintf (szFileName, sizeof(szFileName), "/tmp/hpcupsfilterc_%d.bmp", current_page_number);
+ if (cups_header.cupsColorSpace == CUPS_CSPACE_RGBW ||
+ cups_header.cupsColorSpace == CUPS_CSPACE_RGB)
+ {
+ cfp = fopen (szFileName, "w");
+ chmod (szFileName, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
+ }
+ if (cups_header.cupsColorSpace == CUPS_CSPACE_RGBW ||
+ cups_header.cupsColorSpace == CUPS_CSPACE_K)
+ {
+ szFileName[17] = 'k';
+ kfp = fopen (szFileName, "w");
+ chmod (szFileName, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
+ }
+
+ WriteBMPHeader (cfp, cups_header.cupsWidth, cups_header.cupsHeight, COLOR_RASTER);
+ WriteBMPHeader (kfp, cups_header.cupsWidth, cups_header.cupsHeight, BLACK_RASTER);
+ }
+
+ fprintf(stderr, "PAGE: %d %s\r\n", current_page_number, m_argv[4]);
+ // Iterating through the raster per page
+ for (int y = 0; y < (int) cups_header.cupsHeight; y++) {
+ cupsRasterReadPixels (cups_raster, m_pPrinterBuffer, cups_header.cupsBytesPerLine);
+ color_raster = rgbRaster;
+ black_raster = kRaster;
+
+ if(y == 0 && (0 == strcmp(m_JA.printer_language, "ljmono")) )
+ {
+ //For ljmono, make sure that first line is not a blankRaster line.Otherwise printer
+ //may not skip blank lines before actual data
+ //Need to revisit to crosscheck if it is a firmware issue.
+
+ *m_pPrinterBuffer = 0x01;
+ dbglog("First raster data plane.." );
+ }
+
+ if (this->isBlankRaster((BYTE *) m_pPrinterBuffer, &cups_header)) {
+
+ color_raster = NULL;
+ black_raster = NULL;
+ }
+ extractBlackPixels(&cups_header, black_raster, color_raster);
+ //! Sending Raster bits off to encapsulation
+ err = m_Job.SendRasters (black_raster, color_raster);
+ if (err != NO_ERROR) {
+ break;
+ }
+ WriteBMPRaster (cfp, color_raster, cups_header.cupsWidth, COLOR_RASTER);
+ WriteBMPRaster (kfp, black_raster, cups_header.cupsWidth/8, BLACK_RASTER);
+ }
+ m_Job.NewPage();
+ if (err != NO_ERROR) {
+ break;
+ }
+ }
+
+ //! Remove the old processing band data...
+ if (cups_header.cupsColorSpace == CUPS_CSPACE_RGBW) {
+ delete [] kRaster;
+ delete [] rgbRaster;
+ }
+
+ unlink(hpPreProcessedRasterFile);
+ return ret_status;
+}
+
+void HPCupsFilter::extractBlackPixels(cups_page_header2_t *cups_header, BYTE *kRaster, BYTE *rgbRaster)
+{
+/*
+ * DON'T DO BITPACKING HERE, DO IT IN HALFTONER FOR CMYK PRINTES
+ * AND IN MODE9 FOR RGB PRINTERS
+ */
+
+static BYTE pixel_value[8] = {
+ 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01
+ };
+
+ if (rgbRaster == NULL) {
+ return;
+ }
+
+ if (cups_header->cupsColorSpace == CUPS_CSPACE_RGBW) {
+ int k = 0;
+ BYTE *pIn = m_pPrinterBuffer;
+ BYTE kVal = 0;
+ BYTE white=0;
+ BYTE *rgb = rgbRaster;
+ BYTE *black = kRaster;
+ memset (kRaster, 0, cups_header->cupsWidth);
+
+
+ for (unsigned int i = 0; i < cups_header->cupsWidth; i++) {
+ rgb[0] = *pIn++;
+ rgb[1] = *pIn++;
+ rgb[2] = *pIn++;
+ white = *pIn++;
+
+ if(white == 0)
+ {
+ //If W component is 0 (means black is 1) then no need of having RGB for that pixel.
+ //ghostscript >= 8.71 sends both W and RGB for black pixel(i.e RGBW=(0,0,0,0)).
+ kVal |= pixel_value[k];
+ rgb[0] = 0xFF;
+ rgb[1] = 0xFF;
+ rgb[2] = 0xFF;
+ }
+ else if(white == 0xFF)
+ {
+ kVal |= 0;
+ }
+ else
+ {
+ int cr,cg,cb;
+ cr = rgb[0] - (int)(255 - white);
+ rgb[0] = cr >= 0 ? cr : 0;
+
+ cg = rgb[1] - (int)(255 - white);
+ rgb[1] = cg >= 0 ? cg : 0;
+
+ cb = rgb[2] - (int)(255 - white);
+ rgb[2] = cb >= 0 ? cb : 0;
+ }
+
+ rgb += 3;
+ if (k == 7) {
+ *black++ = kVal;
+ kVal = 0;
+ k = 0;
+ }
+ else {
+ k++;
+ }
+ } // end of for loop
+ *black = kVal;
+
+ } // end of if condition
+}
+
+void HPCupsFilter::printCupsHeaderInfo(cups_page_header2_t *header)
+{
+
+ dbglog ("DEBUG: startPage...\n");
+ dbglog ("DEBUG: MediaClass = \"%s\"\n", header->MediaClass);
+ dbglog ("DEBUG: MediaColor = \"%s\"\n", header->MediaColor);
+ dbglog ("DEBUG: MediaType = \"%s\"\n", header->MediaType);
+ dbglog ("DEBUG: OutputType = \"%s\"\n", header->OutputType);
+ dbglog ("DEBUG: AdvanceDistance = %d\n", header->AdvanceDistance);
+ dbglog ("DEBUG: AdvanceMedia = %d\n", header->AdvanceMedia);
+ dbglog ("DEBUG: Collate = %d\n", header->Collate);
+ dbglog ("DEBUG: CutMedia = %d\n", header->CutMedia);
+ dbglog ("DEBUG: Duplex = %d\n", header->Duplex);
+ dbglog ("DEBUG: HWResolution = [ %d %d ]\n", header->HWResolution[0], header->HWResolution[1]);
+ dbglog ("DEBUG: ImagingBoundingBox = [ %d %d %d %d ]\n",
+ header->ImagingBoundingBox[0], header->ImagingBoundingBox[1],
+ header->ImagingBoundingBox[2], header->ImagingBoundingBox[3]);
+ dbglog ("DEBUG: InsertSheet = %d\n", header->InsertSheet);
+ dbglog ("DEBUG: Jog = %d\n", header->Jog);
+ dbglog ("DEBUG: LeadingEdge = %d\n", header->LeadingEdge);
+ dbglog ("DEBUG: Margins = [ %d %d ]\n", header->Margins[0], header->Margins[1]);
+ dbglog ("DEBUG: ManualFeed = %d\n", header->ManualFeed);
+ dbglog ("DEBUG: MediaPosition = %d\n", header->MediaPosition);
+ dbglog ("DEBUG: MediaWeight = %d\n", header->MediaWeight);
+ dbglog ("DEBUG: MirrorPrint = %d\n", header->MirrorPrint);
+ dbglog ("DEBUG: NegativePrint = %d\n", header->NegativePrint);
+ dbglog ("DEBUG: NumCopies = %d\n", header->NumCopies);
+ dbglog ("DEBUG: Orientation = %d\n", header->Orientation);
+ dbglog ("DEBUG: OutputFaceUp = %d\n", header->OutputFaceUp);
+ dbglog ("DEBUG: PageSize = [ %d %d ]\n", header->PageSize[0], header->PageSize[1]);
+ dbglog ("DEBUG: Separations = %d\n", header->Separations);
+ dbglog ("DEBUG: TraySwitch = %d\n", header->TraySwitch);
+ dbglog ("DEBUG: Tumble = %d\n", header->Tumble);
+ dbglog ("DEBUG: cupsWidth = %d\n", header->cupsWidth);
+ dbglog ("DEBUG: cupsHeight = %d\n", header->cupsHeight);
+ dbglog ("DEBUG: cupsMediaType = %d\n", header->cupsMediaType);
+ dbglog ("DEBUG: cupsRowStep = %d\n", header->cupsRowStep);
+ dbglog ("DEBUG: cupsBitsPerColor = %d\n", header->cupsBitsPerColor);
+ dbglog ("DEBUG: cupsBitsPerPixel = %d\n", header->cupsBitsPerPixel);
+ dbglog ("DEBUG: cupsBytesPerLine = %d\n", header->cupsBytesPerLine);
+ dbglog ("DEBUG: cupsColorOrder = %d\n", header->cupsColorOrder);
+ dbglog ("DEBUG: cupsColorSpace = %d\n", header->cupsColorSpace);
+ dbglog ("DEBUG: cupsCompression = %d\n", header->cupsCompression);
+ dbglog ("DEBUG: cupsPageSizeName = %s\n", header->cupsPageSizeName);
+ dbglog ("DEBUG: cupsInteger0 = %d\n", header->cupsInteger[0]); // max jpeg filesize
+ dbglog ("DEBUG: cupsInteger1 = %d\n", header->cupsInteger[1]); // Red eye removal
+ dbglog ("DEBUG: cupsInteger2 = %d\n", header->cupsInteger[2]); // Photo fix (RLT)
+ dbglog ("DEBUG: cupsString0 = %s\n", header->cupsString[0]); // print_mode_name
+ dbglog ("DEBUG: cupsReal0 = %f\n", header->cupsReal[0]); // Left overspray
+ dbglog ("DEBUG: cupsReal1 = %f\n", header->cupsReal[1]); // Top overspray
+}
+
+void HPCupsFilter::getLogLevel ()
+{
+ FILE *fp;
+ char str[258];
+ char *p;
+ fp = fopen ("/etc/cups/cupsd.conf", "r");
+ if (fp == NULL)
+ return;
+ while (!feof (fp))
+ {
+ if (!fgets (str, 256, fp))
+ {
+ break;
+ }
+ if ((p = strstr (str, "hpLogLevel")))
+ {
+ p += strlen ("hpLogLevel") + 1;
+ m_iLogLevel = atoi (p);
+ break;
+ }
+ }
+ fclose (fp);
+}
+
diff --git a/prnt/hpcups/HPCupsFilter.h b/prnt/hpcups/HPCupsFilter.h
new file mode 100644
index 0000000..0431a7a
--- /dev/null
+++ b/prnt/hpcups/HPCupsFilter.h
@@ -0,0 +1,125 @@
+/*****************************************************************************\
+ HPCupsFilter.h : Interface for HPCupsFilter class
+
+ Copyright (c) 1996 - 2009, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+#ifndef HP_CUPSFILTER_H
+#define HP_CUPSFILTER_H
+
+#include "CommonDefinitions.h"
+#include "SystemServices.h"
+#include "Compressor.h"
+#include "Job.h"
+
+#include "dbuscomm.h"
+
+#define DBITMAPFILEHEADER 14
+#define DBITMAPINFOHEADER 40
+
+enum eRasterType
+{
+ BLACK_RASTER,
+ COLOR_RASTER
+};
+
+typedef struct
+{
+ short bfType;
+ int bfSize;
+ short bfReserved1;
+ short bfReserved2;
+ int bfOffBits;
+} BITMAPFILEHEADER;
+
+typedef struct
+{
+ int biSize;
+ int biWidth;
+ int biHeight;
+ short biPlanes;
+ short biBitCount;
+ int biCompression;
+ int biSizeImage;
+ int biXPelsPerMeter;
+ int biYPelsPerMeter;
+ int biClrUsed;
+ int biClrImportant;
+} BITMAPINFOHEADER;
+
+class HPCupsFilter
+{
+public:
+
+ HPCupsFilter();
+ ~HPCupsFilter();
+ int StartPrintJob(int argc, char *argv[]);
+ void CancelJob();
+ void RemoveStatus();
+
+ void WriteBMPHeader (FILE *fp, int width, int height, eRasterType raster_type);
+ void WriteBMPRaster (FILE *fp, BYTE *raster, int width, eRasterType raster_type);
+
+private:
+
+ BYTE *m_pPrinterBuffer;
+ Job m_Job;
+ SystemServices *m_pSys;
+ int child_pid;
+ char **m_argv;
+ JobAttributes m_JA;
+ ppd_file_t *m_ppd;
+ DBusCommunicator m_DBusComm;
+
+private:
+
+ void closeFilter();
+ void cleanup();
+ void getLogLevel();
+ DRIVER_ERROR startPage (cups_page_header2_t *header);
+ int processRasterData(cups_raster_t *cups_raster);
+ void extractBlackPixels(cups_page_header2_t *cups_header,
+ BYTE *kRaster, BYTE *rgbRaster);
+ void printCupsHeaderInfo(cups_page_header2_t *header);
+ bool isBlankRaster(BYTE *input_raster, cups_page_header2_t *header);
+ int m_iLogLevel;
+
+ void CreateBMPHeader(int width, int height, int planes, int bpp);
+ void WriteCBMPHeader (FILE *fp, int width, int height);
+ void WriteKBMPHeader (FILE *fp, int width, int height);
+ void WriteCBMPRaster (FILE *fp, BYTE *rgb_raster, int width);
+ void WriteKBMPRaster (FILE *fp, BYTE *k_raster, int width);
+ int adj_c_width;
+ int adj_k_width;
+ BYTE *black_raster;
+ BYTE *color_raster;
+ BITMAPFILEHEADER bmfh;
+ BITMAPINFOHEADER bmih;
+};
+
+#endif // HP_CUPSFILTER_H
+
diff --git a/prnt/hpcups/Halftoner.cpp b/prnt/hpcups/Halftoner.cpp
new file mode 100644
index 0000000..b359c6b
--- /dev/null
+++ b/prnt/hpcups/Halftoner.cpp
@@ -0,0 +1,1047 @@
+/*****************************************************************************\
+ Halftoner.cpp : Implimentation for the Halftoner class
+
+ Copyright (c) 1996 - 2009, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+//===========================================================================
+//
+// Filename : halftoner.cpp
+//
+// Module : Open Source Imaging
+//
+// Description : This file contains the constructor and destructor for
+// the Halftoner class, which performs color-matching and
+// halftoning.
+//
+// Detailed Description:
+//
+// The only member functions needed are Process(inputRaster)
+// and Restart (used to skip white space and for new page).
+//
+// Configurability required in Slimhost driver is reflected in the
+// parameters to the constructor:
+// 1. SystemServices encapsulates memory management for platform-independence
+// 2. PrintMode contains info on resolution and other properties
+// 3. iInputWidth tells how many pixels input per plane
+// 4. iNumRows is 1 except for mixed-resolution cases
+// 5. HiResFactor is for boosting base resolution, e.g. 2 if 600 dpi grid
+// (base res assumed to be 300)
+//
+// These structures, together with the variable StartPlane (designating
+// K or C in the fixed ordering KCMY), are accessed by the Translator
+// component of the driver, in order to properly package the data in
+// the printer command language.
+//============================================================================
+
+#include "CommonDefinitions.h"
+#include "Processor.h"
+#include "Halftoner.h"
+
+Halftoner::Halftoner
+(
+ PrintMode* pPM,
+ unsigned int iInputWidth,
+ int iNumRows[],
+ int HiResFactor,
+ bool matrixbased
+) : ColorPlaneCount(pPM->dyeCount),
+ InputWidth(iInputWidth),
+ ResBoost(HiResFactor),
+ nNextRaster(0),
+ fBlackFEDResPtr(pPM->BlackFEDTable),
+ fColorFEDResPtr(pPM->ColorFEDTable),
+ iColor(0),
+ iRow(0),
+ iPlane(0),
+ tempBuffer(NULL),
+ tempBuffer2(NULL),
+ hold_random(0),
+ usematrix(matrixbased)
+{
+ unsigned int i;
+ int j,k,PlaneSize;
+ originalKData = NULL;
+
+ StartPlane = K; // most common case
+
+ if (ColorPlaneCount == 3) // CMY pen
+ {
+ StartPlane=C;
+ NumRows[K] = ColorDepth[K] = OutputWidth[K] = 0;
+ }
+
+ EndPlane=Y; // most common case
+ if (ColorPlaneCount == 6)
+ {
+ EndPlane = Mlight;
+ }
+ if (ColorPlaneCount == 1)
+ {
+ EndPlane = K;
+ }
+
+ AdjustedInputWidth = InputWidth;
+ if (AdjustedInputWidth % 8)
+ {
+ AdjustedInputWidth += 8 - (AdjustedInputWidth % 8);
+ }
+
+ // init arrays
+ for (i = StartPlane; i < (ColorPlaneCount + StartPlane); i++)
+ {
+ ColorDepth[i]= pPM->ColorDepth[i];
+ NumRows[i]=iNumRows[i];
+
+ OutputWidth[i] = AdjustedInputWidth * NumRows[i] * ResBoost;
+ }
+ for (;i < (unsigned)MAXCOLORPLANES; i++)
+ {
+ NumRows[i] = ColorDepth[i] = OutputWidth[i] = 0;
+ }
+
+ oddbits = AdjustedInputWidth - InputWidth;
+ ///////////////////////////////////////////////////////////////////////////
+ for (i=0; i <= Mlight; i++)
+ {
+ ErrBuff[i]=NULL;
+ }
+
+ for (i = StartPlane; i <= EndPlane; i++)
+ {
+ ErrBuff[i] = (short *) new char[((OutputWidth[i] + 2) * sizeof(short))];
+ if (ErrBuff[i] == NULL)
+ {
+ goto MemoryError;
+ }
+ }
+
+ if (OutputWidth[K] > AdjustedInputWidth)
+ // need to expand input data (easier than expanding bit-pixels after) on K row
+ {
+ tempBuffer = (BYTE*) new BYTE[(OutputWidth[K])];
+ if (tempBuffer == NULL)
+ {
+ goto MemoryError;
+ }
+ if (EndPlane > Y)
+ {
+ tempBuffer2 = (BYTE*) new BYTE[(OutputWidth[K])];
+ if (tempBuffer2 == NULL)
+ {
+ goto MemoryError;
+ }
+ }
+ }
+
+ Restart(); // this zeroes buffers and sets nextraster counter
+
+ // allocate output buffers
+ for (i = 0; i < (unsigned)MAXCOLORPLANES; i++)
+ {
+ for (j = 0; j < MAXCOLORROWS; j++)
+ {
+ for (k = 0; k < MAXCOLORDEPTH; k++)
+ {
+ ColorPlane[i][j][k] = NULL;
+ }
+ }
+ }
+
+ for (i=StartPlane; i < (ColorPlaneCount+StartPlane); i++)
+ {
+ for (j=0; j < NumRows[i]; j++)
+ {
+ for (k=0; k < ColorDepth[i]; k++)
+ {
+ PlaneSize= OutputWidth[i]/8 + // doublecheck ... should already be divisble by 8
+ ((OutputWidth[i] % 8)!=0);
+ ColorPlane[i][j][k] = (BYTE*) new BYTE[(PlaneSize)];
+ if (ColorPlane[i][j] == NULL)
+ {
+ goto MemoryError;
+ }
+ memset(ColorPlane[i][j][k], 0, PlaneSize);
+ }
+ }
+ }
+
+ PlaneSize = (OutputWidth[0] + 7) / 8;
+ if (PlaneSize > 0)
+ {
+ originalKData = (BYTE*) new BYTE[(PlaneSize)];
+ if (originalKData == NULL)
+ {
+ goto MemoryError;
+ }
+ memset(originalKData, 0, PlaneSize);
+ }
+ return;
+
+MemoryError:
+
+ FreeBuffers();
+
+ for (i=0; i < ColorPlaneCount; i++)
+ {
+ for (j=0; j < NumRows[i]; j++)
+ {
+ for (k=0; k < ColorDepth[i]; k++)
+ {
+ if (ColorPlane[i][j][k])
+ {
+ delete [] (ColorPlane[i][j][k]);
+ }
+ }
+ }
+ }
+ if (originalKData)
+ {
+ delete [] (originalKData);
+ }
+
+} //Halftoner
+
+
+Halftoner::~Halftoner()
+{
+ FreeBuffers();
+
+ for (int i=0; i < MAXCOLORPLANES; i++)
+ {
+ for (int j=0; j < NumRows[i]; j++)
+ {
+ for (int k=0; k < ColorDepth[i]; k++)
+ {
+ if (ColorPlane[i][j][k])
+ {
+ delete [] (ColorPlane[i][j][k]);
+ }
+ }
+ }
+ }
+ if (originalKData)
+ {
+ delete [] (originalKData);
+ }
+} //~Halftoner
+
+
+void Halftoner::Restart()
+{
+ nNextRaster = 0;
+
+ for (unsigned int i = StartPlane; i <= EndPlane; i++)
+ {
+ memset(ErrBuff[i], 0, (OutputWidth[i]+2) * sizeof(short));
+ }
+
+ started = false;
+} //Restart
+
+
+void Halftoner::Flush()
+{
+ if (!started)
+ {
+ return;
+ }
+ Restart();
+} //Flush
+
+
+void Halftoner::FreeBuffers()
+{
+ for (unsigned int i = StartPlane; i <= EndPlane; i++)
+ {
+ delete [] (ErrBuff[i]);
+ }
+ if (tempBuffer)
+ {
+ delete [] (tempBuffer);
+ }
+ if (tempBuffer2)
+ {
+ delete [] (tempBuffer2);
+ }
+} //FreeBuffers
+
+
+// dumb horizontal doubling (tripling, etc.) for resolution-boost prior to halftoning
+void Halftoner::PixelMultiply(unsigned char* buffer, unsigned int width, unsigned int factor)
+{
+ if (factor == 1)
+ {
+ return;
+ }
+
+ for (int j = (int)(width-1); j >= 0; j--)
+ {
+ unsigned int iOffset = j * factor;
+ for (unsigned int k = 0; k < factor; k++)
+ {
+ buffer[iOffset + k] = buffer[j];
+ }
+ }
+
+} //PixelMultiply
+
+unsigned int Halftoner::getOutputWidth()
+{
+// return size of data in the plane being delivered (depends on iRastersDelivered)
+// (will be used in connection with compression seedrow)
+ unsigned int colorplane, tmp;
+ // figure out which colorplane we're on
+ unsigned int rasterd = iRastersDelivered;
+ // we come after increment of iRastersDelivered
+ if (rasterd > 0)
+ {
+ rasterd--;
+ }
+
+ tmp = (unsigned int)(NumRows[0]*ColorDepth[0]);
+ if (rasterd < tmp)
+ {
+ colorplane = 0;
+ }
+ // have to count up to possible 6th plane;
+ // but we'll save code by assuming sizes of C,M,Y (Cl,Ml) are all same
+ else
+ {
+ colorplane = 1;
+ }
+
+ int temp = (OutputWidth[colorplane] + 7) / 8;
+ return temp;
+} // getOutputWidth
+
+bool Halftoner::NextOutputRaster(RASTERDATA &next_raster)
+{
+ if (iRastersReady == 0)
+ {
+ return false;
+ }
+
+ if (iColor == (ColorPlaneCount+StartPlane))
+ {
+ return false;
+ }
+
+ if (iPlane == ColorDepth[iColor])
+ {
+ iPlane = 0;
+ iRow++;
+ return NextOutputRaster(next_raster);
+ }
+
+ if (iRow == NumRows[iColor])
+ {
+ iRow = 0;
+ iColor++;
+ return NextOutputRaster(next_raster);
+ }
+
+ iRastersDelivered++;
+ iRastersReady--;
+ next_raster.rasterdata[COLORTYPE_COLOR] = ColorPlane[iColor][iRow][iPlane++];
+ next_raster.rastersize[COLORTYPE_COLOR] = getOutputWidth();
+ next_raster.rasterdata[COLORTYPE_BLACK] = raster.rasterdata[COLORTYPE_BLACK];
+ next_raster.rastersize[COLORTYPE_BLACK] = 0;
+ return true;
+} //NextOutputRaster
+
+
+bool Halftoner::LastPlane()
+{
+ return ((iColor == (ColorPlaneCount+StartPlane-1)) &&
+ (iRow == (unsigned int)(NumRows[iColor] - 1)) &&
+ (iPlane == ColorDepth[iColor]) // was pre-incremented
+ );
+} //LastPlane
+
+
+bool Halftoner::FirstPlane()
+{
+ return ((iColor == StartPlane) &&
+ (iRow == 0) &&
+ (iPlane == 1) // was pre-incremented
+ );
+} //FirstPlane
+
+unsigned int Halftoner::GetMaxOutputWidth()
+// This is needed by Configure, since the output-width for Halftoner is variable
+// depending on the colorplane
+{
+ if (myplane == COLORTYPE_COLOR)
+ {
+ unsigned int max=0;
+ for (unsigned int i=StartPlane; i <= EndPlane; i++)
+ {
+ if (OutputWidth[i] > max)
+ {
+ max = OutputWidth[i];
+ }
+ }
+ return (max / 8) + ((max % 8)!=0);
+ }
+ else
+ {
+ return 0;
+ }
+} //GetMaxOutputWidth
+
+
+unsigned int Halftoner::PlaneCount()
+{
+ unsigned int count=0;
+
+ for (int i = 0; i < MAXCOLORPLANES; i++)
+ {
+ count += NumRows[i] * ColorDepth[i];
+ }
+
+ return count;
+} //PlaneCount
+
+
+void Halftoner::CleanOddBits(unsigned int iColor, unsigned int iRow)
+{
+ int index = (OutputWidth[iColor]/8)-1;
+
+ for (int i=0; i < ColorDepth[iColor]; i++)
+ {
+ BYTE lastbyte0 = ColorPlane[iColor][iRow][i][index];
+ lastbyte0 = lastbyte0 >> oddbits;
+ lastbyte0 = lastbyte0 << oddbits;
+ ColorPlane[iColor][iRow][i][index] = lastbyte0;
+ }
+} // CleanOddBits
+
+
+extern unsigned char BayerMatrix[];
+
+bool Halftoner::Process
+(
+ RASTERDATA* pbyInputKRGBRaster
+)
+{
+ unsigned int i;
+ int j, k;
+ if ((pbyInputKRGBRaster == NULL) ||
+ (pbyInputKRGBRaster && pbyInputKRGBRaster->rasterdata[COLORTYPE_COLOR]==NULL && pbyInputKRGBRaster->rasterdata[COLORTYPE_BLACK]==NULL))
+ {
+ Restart();
+ return false; // no output
+ }
+ started=true;
+
+ for (i=StartPlane; i < (ColorPlaneCount+StartPlane); i++)
+ {
+ for (j=0; j < NumRows[i]; j++)
+ {
+ for (k=0; k < ColorDepth[i]; k++)
+ {
+ int PlaneSize= (OutputWidth[i] + 7) / 8;
+ memset(ColorPlane[i][j][k], 0, PlaneSize);
+ }
+ }
+ }
+ if (pbyInputKRGBRaster->rasterdata[COLORTYPE_COLOR])
+ {
+ // increment current raster
+ ++nNextRaster;
+ if ( -1 == nNextRaster )
+ nNextRaster = 0;
+
+ fRasterOdd = ( 1 & nNextRaster ) ? 0 : 1;
+
+ BYTE* input;
+ unsigned int numpix;
+
+ for (i=StartPlane; i <= EndPlane; i++)
+ {
+ if (OutputWidth[i] > AdjustedInputWidth)
+ {
+ memset(tempBuffer, 0, OutputWidth[i]); // clear it out because outwidth might be
+ // > factor*inwidth due to roundoff
+ memcpy(tempBuffer,pbyInputKRGBRaster->rasterdata[COLORTYPE_COLOR],InputWidth);
+ int factor = NumRows[i] * ResBoost;
+ PixelMultiply(tempBuffer, InputWidth, factor);
+ input=tempBuffer;
+ numpix = OutputWidth[i];
+ }
+ else
+ {
+ input=pbyInputKRGBRaster->rasterdata[COLORTYPE_COLOR];
+ numpix = AdjustedInputWidth;
+ }
+
+ fDitherParms[i].fNumPix = numpix;
+ fDitherParms[i].fInput = input;
+ fDitherParms[i].fErr = ErrBuff[i];
+ fDitherParms[i].fErr++; // This is for serpentine
+ fDitherParms[i].fSymmetricFlag = true; // Symmetric only
+ if (i == K)
+ fDitherParms[i].fFEDResPtr = fBlackFEDResPtr;
+ else
+ fDitherParms[i].fFEDResPtr = fColorFEDResPtr;
+ fDitherParms[i].fRasterEvenOrOdd = fRasterOdd;
+ fDitherParms[i].fHifipe = ColorDepth[i]>1;
+
+ // for matrix //////////////
+ if (usematrix)
+ {
+ fDitherParms[i].fSqueezeOffset=0;
+ fDitherParms[i].fMatrixRowSize = BayerMatrix[1];
+ BYTE colorindex = i + 2;
+ if (i>=Y)
+ colorindex = 4;
+ BYTE ditheroffset = BayerMatrix[colorindex];
+ BYTE matrixrowsize = BayerMatrix[1];
+ fDitherParms[i].fDitherCellOffset = ditheroffset;
+ BYTE * matrixptr = (BYTE *)(
+ (((ditheroffset + nNextRaster) % matrixrowsize) * matrixrowsize)
+ + 5 + BayerMatrix);
+
+ fDitherParms[i].fMatrixV1 = matrixptr;
+ }
+
+ ////////////////////////////////////
+
+ for (j=0; j < NumRows[i]; j++)
+ {
+ fDitherParms[i].fOutput1 = ColorPlane[i][j][0];
+ fDitherParms[i].fOutput2 = ColorPlane[i][j][1];
+
+ if (usematrix)
+ {
+ memset(fDitherParms[i].fOutput1, 0, OutputWidth[i]/8);
+ if (fDitherParms[i].fOutput2)
+ memset(fDitherParms[i].fOutput2, 0, OutputWidth[i]/8);
+ HTMATRIXHI_KCMY((THTDitherParmsPtr) fDitherParms, i);
+ }
+ else HTEDiffOpen ((THTDitherParmsPtr) fDitherParms, i);
+
+
+ // cleanup bits at end of row due to input-width not being divisible by 8
+ CleanOddBits(i,j);
+ }
+
+ pbyInputKRGBRaster->rasterdata[COLORTYPE_COLOR] += InputWidth;
+
+ }
+ }
+
+ if (pbyInputKRGBRaster->rasterdata[COLORTYPE_BLACK])
+ {
+ int factor = 1;
+ if (OutputWidth[K] > AdjustedInputWidth)
+ {
+ memset(tempBuffer, 0, OutputWidth[K]);
+ memcpy(tempBuffer,pbyInputKRGBRaster->rasterdata[COLORTYPE_BLACK],pbyInputKRGBRaster->rastersize[COLORTYPE_BLACK]);
+
+ factor = NumRows[K] * ResBoost;
+ PixelMultiply(tempBuffer, pbyInputKRGBRaster->rastersize[COLORTYPE_BLACK], factor);
+ }
+
+ // Convert 8bit per pixel data into 1 bit per pixel data
+ memset(originalKData, 0, (pbyInputKRGBRaster->rastersize[COLORTYPE_BLACK] * factor +7)/8);
+ int curBit = 0x80, curByte = 0;
+ for (int i=0; i<pbyInputKRGBRaster->rastersize[COLORTYPE_BLACK] * factor; i++)
+ {
+ if (OutputWidth[K] > AdjustedInputWidth)
+ {
+ if (tempBuffer[i])
+ {
+ originalKData[curByte] |= curBit;
+ }
+ }
+ else
+ {
+ if (pbyInputKRGBRaster->rasterdata[COLORTYPE_BLACK][i])
+ {
+ originalKData[curByte] |= curBit;
+ }
+ }
+ if (curBit == 0x01)
+ {
+ curByte++;
+ curBit = 0x80;
+ }
+ else
+ {
+ curBit = curBit >> 1;
+ }
+ }
+ for (j=0; j < NumRows[K]; j++)
+ {
+ for (k = 0; k < (pbyInputKRGBRaster->rastersize[COLORTYPE_BLACK] * factor +7)/8; k++)
+ if (ColorPlane[K][j][0])
+ ColorPlane[K][j][0][k] |= originalKData[k];
+ if (ColorPlane[K][j][1])
+ ColorPlane[K][j][1][k] |= originalKData[k];
+ }
+ }
+
+ iColor = StartPlane;
+ iRow = iPlane = 0;
+ iRastersReady = PlaneCount();
+ iRastersDelivered = 0;
+ return true; // one raster in, one raster out
+} //Process
+
+
+void Halftoner::HTEDiffOpen
+(
+ THTDitherParmsPtr ditherParmsPtr,
+ unsigned short count
+)
+{
+
+
+ ditherParms = ditherParmsPtr+count;
+ errPtr = ditherParms->fErr;
+ numLoop = ditherParms->fNumPix;
+ inputPtr = ditherParms->fInput;
+ fedResTbl = ditherParms->fFEDResPtr;
+ symmetricFlag = ditherParms->fSymmetricFlag;
+ doNext8Pixels = true;
+ hifipe = ditherParms->fHifipe;
+ outputPtr1 = ditherParms->fOutput1;
+
+ if (hifipe)
+ {
+ outputPtr1 = ditherParms->fOutput1;
+ outputPtr2 = ditherParms->fOutput2;
+ outputPtr3 = ditherParms->fOutput3;
+ }
+
+ diffusionErrorPtr = errPtr;
+
+ rasterByte1 = 0;
+ rasterByte2 = 0;
+ rasterByte3 = 0;
+
+ if( ditherParms->fRasterEvenOrOdd == 1 )
+ {
+ tmpShortStore = *diffusionErrorPtr;
+
+ *diffusionErrorPtr = 0;
+
+ for (pixelCount = numLoop + 8; (pixelCount -= 8) > 0; )
+ {
+ if (pixelCount > 16) // if next 16 pixels are white, skip 8
+ {
+ doNext8Pixels = Forward16PixelsNonWhite(inputPtr);
+ }
+ else
+ {
+ doNext8Pixels = true;
+ }
+
+ if (doNext8Pixels)
+ {
+ thValue = HPRand();
+ FORWARD_FED( thValue, 0x80 );
+ thValue = HPRand();
+ FORWARD_FED( thValue, 0x40 );
+ thValue = HPRand();
+ FORWARD_FED( thValue, 0x20 );
+ thValue = HPRand();
+ FORWARD_FED( thValue, 0x10 );
+ thValue = HPRand();
+ FORWARD_FED( thValue, 0x08 );
+ thValue = HPRand();
+ FORWARD_FED( thValue, 0x04 );
+ thValue = HPRand();
+ FORWARD_FED( thValue, 0x02 );
+ thValue = HPRand();
+ FORWARD_FED( thValue, 0x01 );
+
+ *outputPtr1++ = rasterByte1;
+ rasterByte1 = 0;
+
+ if (hifipe)
+ {
+ *outputPtr2++ = rasterByte2;
+ rasterByte2 = 0;
+ }
+ }
+ else // Do white space skipping
+ {
+ inputPtr += 8;
+ *outputPtr1++ = 0;
+ if (hifipe)
+ {
+ *outputPtr2++ = 0;
+ }
+ *diffusionErrorPtr++ = 0;
+ *diffusionErrorPtr++ = 0;
+ *diffusionErrorPtr++ = 0;
+ *diffusionErrorPtr++ = 0;
+ *diffusionErrorPtr++ = 0;
+ *diffusionErrorPtr++ = 0;
+ *diffusionErrorPtr++ = 0;
+ *diffusionErrorPtr++ = 0;
+ rasterByte1 = 0;
+ rasterByte2 = 0;
+ tmpShortStore = 0;
+ }
+ } // for pixelCount
+ }
+ else
+ {
+ rasterByte1 = 0;
+ rasterByte2 = 0;
+ inputPtr += ( numLoop-1 );
+ outputPtr1 += ( numLoop/8 - 1 );
+ outputPtr2 += ( numLoop/8 - 1 );
+ diffusionErrorPtr += ( numLoop-1 );
+
+ tmpShortStore = *diffusionErrorPtr;
+
+ *diffusionErrorPtr = 0;
+
+ for (pixelCount = numLoop + 8; (pixelCount -= 8) > 0; )
+ {
+ if (pixelCount > 16) // if next 16 pixels are white, skip 8
+ {
+ doNext8Pixels = Backward16PixelsNonWhite(inputPtr);
+ }
+ else
+ {
+ doNext8Pixels = true;
+ }
+
+ if (doNext8Pixels)
+ {
+ thValue = HPRand();
+ BACKWARD_FED( thValue, 0x01 );
+ thValue = HPRand();
+ BACKWARD_FED( thValue, 0x02 );
+ thValue = HPRand();
+ BACKWARD_FED( thValue, 0x04 );
+ thValue = HPRand();
+ BACKWARD_FED( thValue, 0x08 );
+ thValue = HPRand();
+ BACKWARD_FED( thValue, 0x10 );
+ thValue = HPRand();
+ BACKWARD_FED( thValue, 0x20 );
+ thValue = HPRand();
+ BACKWARD_FED( thValue, 0x40 );
+ thValue = HPRand();
+ BACKWARD_FED( thValue, 0x80 );
+
+ *outputPtr1-- = rasterByte1;
+ rasterByte1 = 0;
+
+ if (hifipe)
+ {
+ *outputPtr2-- = rasterByte2;
+ rasterByte2 = 0;
+ }
+ }
+ else // Do white space skipping
+ {
+ inputPtr -= 8;
+ *outputPtr1-- = 0;
+ if (hifipe)
+ {
+ *outputPtr2-- = 0;
+ }
+ *diffusionErrorPtr-- = 0;
+ *diffusionErrorPtr-- = 0;
+ *diffusionErrorPtr-- = 0;
+ *diffusionErrorPtr-- = 0;
+ *diffusionErrorPtr-- = 0;
+ *diffusionErrorPtr-- = 0;
+ *diffusionErrorPtr-- = 0;
+ *diffusionErrorPtr-- = 0;
+ rasterByte1 = 0;
+ rasterByte2 = 0;
+ tmpShortStore = 0;
+ }
+ }
+ }
+} //HTEDiffOpen
+
+//////////////////////////////////////////////////////////
+void Halftoner::FORWARD_FED
+(
+ short thresholdValue,
+ unsigned int bitMask
+)
+{
+ tone = (*inputPtr++ );
+ fedResPtr = fedResTbl + (tone << 2);
+ level = *fedResPtr++;
+ if (tone != 0)
+ {
+ tone = ( tmpShortStore + (short)(*fedResPtr++) );
+ if (tone >= thresholdValue)
+ {
+ tone -= 255;
+ level++;
+ }
+ switch (level)
+ {
+ case 0:
+ break;
+ case 1:
+ rasterByte1 |= bitMask;
+ break;
+ case 2:
+ rasterByte2 |= bitMask;
+ break;
+ case 3:
+ rasterByte2 |= bitMask; rasterByte1 |= bitMask;
+ break;
+ case 4:
+ rasterByte3 |= bitMask;
+ break;
+ case 5:
+ rasterByte3 |= bitMask; rasterByte1 |= bitMask;
+ break;
+ case 6:
+ rasterByte3 |= bitMask; rasterByte2 |= bitMask;
+ break;
+ case 7:
+ rasterByte3 |= bitMask; rasterByte2 |= bitMask; rasterByte1 |= bitMask;
+ break;
+ }
+ }
+ else
+ {
+ tone = tmpShortStore;
+ }
+ *diffusionErrorPtr++ = tone >> 1;
+ tmpShortStore = *diffusionErrorPtr + (tone - (tone >> 1));
+} //FORWARD_FED
+
+
+void Halftoner::BACKWARD_FED
+(
+ short thresholdValue,
+ unsigned int bitMask
+)
+{
+ tone = (*inputPtr-- );
+ fedResPtr = fedResTbl + (tone << 2);
+ level = *fedResPtr++;
+ if (tone != 0)
+ {
+ tone = ( tmpShortStore + (short)(*fedResPtr++) );
+ if (tone >= thresholdValue)
+ {
+ tone -= 255;
+ level++;
+ }
+ switch (level)
+ {
+ case 0:
+ break;
+ case 1:
+ rasterByte1 |= bitMask;
+ break;
+ case 2:
+ rasterByte2 |= bitMask;
+ break;
+ case 3:
+ rasterByte2 |= bitMask; rasterByte1 |= bitMask;
+ break;
+ case 4:
+ rasterByte3 |= bitMask;
+ break;
+ case 5:
+ rasterByte3 |= bitMask; rasterByte1 |= bitMask;
+ break;
+ case 6:
+ rasterByte3 |= bitMask; rasterByte2 |= bitMask;
+ break;
+ case 7:
+ rasterByte3 |= bitMask; rasterByte2 |= bitMask; rasterByte1 |= bitMask;
+ break;
+ }
+ }
+ else
+ {
+ tone = tmpShortStore;
+ }
+ *diffusionErrorPtr-- = tone >> 1;
+ tmpShortStore = *diffusionErrorPtr + (tone - (tone >> 1));
+
+} // BACKWARD_FED
+
+#define Dither4LevelHiFipe(matrix,bitMask)\
+{\
+ tone = (*inputPtr++ );\
+ fedResPtr = fedResTbl + (tone << 2);\
+ level = *fedResPtr++;\
+ if (*(fedResPtr) >= (BYTE)matrix )\
+ {\
+ level++;\
+ }\
+ switch (level)\
+ {\
+ case 0:\
+ break;\
+ case 1:\
+ rasterByte1 |= bitMask;\
+ break;\
+ case 2:\
+ rasterByte2 |= bitMask;\
+ break;\
+ case 3:\
+ rasterByte2 |= bitMask; rasterByte1 |= bitMask;\
+ break;\
+ case 4:\
+ rasterByte3 |= bitMask;\
+ break;\
+ case 5:\
+ rasterByte3 |= bitMask; rasterByte1 |= bitMask;\
+ break;\
+ case 6:\
+ rasterByte3 |= bitMask; rasterByte2 |= bitMask;\
+ break;\
+ case 7:\
+ rasterByte3 |= bitMask; rasterByte2 |= bitMask; rasterByte1 |= bitMask;\
+ break;\
+ }\
+}
+
+// Each dither matrix has a header of five bytes
+// 1st byte (Size (in bytes) of row in the matrix) - 1
+// 2nd byte Size (in bytes) of row in the matrix
+// 3rd byte Black offset
+// 4th byte Cyan offset
+// 5th byte Magenta offset
+//
+// With matrix actually starting on the 6th Byte.
+//
+// Black, cyan, and magenta are all offset into different
+// locations in the dither matrix. (Yellow uses the same offsets as
+// magenta)
+//
+
+// Ditherparms should be set up as Fed with the following additions
+// ditherParms->fSqueezeOffset = first dirty pixel, if white has been skipped at the beginning of the row
+// ditherParmsPtr->fMatrixRowSize = Byte 2 of the Header
+// ditherParmsPtr->fDitherCellOffset = Black, Cyan, or Magenta Offset respectively
+
+// To select the right row of the matrix for each color
+//
+// ditherParms->fMatrixV1 = ((matrixStart + rasterIndex + DitherCellOffset) % (MatrixRowSize)) * (MatrixRowSize)
+
+DRIVER_ERROR Halftoner::HTMATRIXHI_KCMY (THTDitherParmsPtr ditherParmsPtr,
+ unsigned short count)
+{
+ THTDitherParmsPtr ditherParms = ditherParmsPtr+count;
+ BYTE tone;
+ BYTE rasterByte1,rasterByte2, rasterByte3;
+ BYTE level;
+ short pixelCount;
+
+ unsigned short numLoop = ditherParms->fNumPix;
+ BYTE * inputPtr = ditherParms->fInput;
+ BYTE * outputPtr1;
+ BYTE * outputPtr2;
+ BYTE * outputPtr3;
+
+ BYTE * fedResTbl = (BYTE * )ditherParms->fFEDResPtr;
+ BYTE * fedResPtr;
+
+ BYTE * matrixV = ditherParms->fMatrixV1;
+ BYTE * matrixH;
+ unsigned short index;
+ unsigned short matrixRowSize = ditherParms->fMatrixRowSize;
+
+ rasterByte1 = 0;
+ rasterByte2 = 0;
+ rasterByte3 = 0;
+
+ outputPtr1 = ditherParms->fOutput1;
+ outputPtr2 = ditherParms->fOutput2;
+ outputPtr3 = ditherParms->fOutput3;
+
+ if (!ditherParms->fSymmetricFlag)
+ return SYSTEM_ERROR; // matrixHI_KCMY asymetric not supported
+
+ index = (ditherParms->fDitherCellOffset + ditherParms->fSqueezeOffset) % (matrixRowSize);
+ matrixH = matrixV + index;
+
+ for (pixelCount = numLoop + 8; (pixelCount -= 8) > 0; )
+ {
+ // if we've reached end of matrix we need to reset
+ // our row pointer to the start of the row
+ if ( index == matrixRowSize )
+ {
+ matrixH = matrixV;
+ index = 0;
+ }
+
+ Dither4LevelHiFipe(*matrixH,0x80);
+ matrixH++;
+ Dither4LevelHiFipe(*matrixH,0x40);
+ matrixH++;
+ Dither4LevelHiFipe(*matrixH,0x20);
+ matrixH++;
+ Dither4LevelHiFipe(*matrixH,0x10);
+ matrixH++;
+ Dither4LevelHiFipe(*matrixH,0x08);
+ matrixH++;
+ Dither4LevelHiFipe(*matrixH,0x04);
+ matrixH++;
+ Dither4LevelHiFipe(*matrixH,0x02);
+ matrixH++;
+ Dither4LevelHiFipe(*matrixH,0x01);
+ matrixH++;
+
+ *outputPtr1++ |= rasterByte1;
+ if (outputPtr2)
+ *outputPtr2++ |= rasterByte2;
+ rasterByte1 = 0;
+ rasterByte2 = 0;
+
+ index += 8;
+ }
+ return NO_ERROR;
+}
+
+unsigned char BayerMatrix[] =
+{
+ 0x07, 0x08, 0x00, 0x00, 0x00,
+ 0x2, 0x82, 0x22, 0xa2, 0xa, 0x8a, 0x2a, 0xaa,
+ 0xc2, 0x42, 0xe2, 0x62, 0xca, 0x4a, 0xea, 0x6a,
+ 0x32, 0xb2, 0x12, 0x92, 0x3a, 0xba, 0x1a, 0x9a,
+ 0xf2, 0x72, 0xd2, 0x52, 0xfa, 0x7a, 0xda, 0x5a,
+ 0xe, 0x8e, 0x2e, 0xae, 0x6, 0x86, 0x26, 0xa6,
+ 0xce, 0x4e, 0xee, 0x6e, 0xc6, 0x46, 0xe6, 0x66,
+ 0x3e, 0xbe, 0x1e, 0x9e, 0x36, 0xb6, 0x16, 0x96,
+ 0xfe, 0x7e, 0xde, 0x5e, 0xf6, 0x76, 0xd6, 0x56,
+};
+
diff --git a/prnt/hpcups/Halftoner.h b/prnt/hpcups/Halftoner.h
new file mode 100644
index 0000000..9e67684
--- /dev/null
+++ b/prnt/hpcups/Halftoner.h
@@ -0,0 +1,216 @@
+/*****************************************************************************\
+ Halftoner.h : Interface for the Halftoner class
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#ifndef HALFTONER_H
+#define HALFTONER_H
+
+////////////////////////////////////////////////////////////////////////////
+// UMPQUA
+//
+// Encapsulation of buffers and data needed by Halftoner color-matching and
+// halftoning code.
+
+class Halftoner : public Processor
+{
+public:
+ Halftoner(PrintMode* pPM,
+ unsigned int iInputWidth,
+ int iNumRows[], // for mixed-res cases
+ int HiResFactor, // when base-res is multiple of 300
+ bool matrixbased
+ );
+ virtual ~Halftoner();
+
+ bool Process(RASTERDATA* pbyInputKRGBRaster);
+ void Flush();
+ void Restart(); // set up for new page or blanks
+
+ // items required by Processor
+ unsigned int GetMaxOutputWidth();
+ bool NextOutputRaster(RASTERDATA &next_raster);
+ bool LastPlane();
+ bool FirstPlane();
+ unsigned int PlaneSize()
+ { return OutputWidth[iColor] / 8 + (OutputWidth[iColor] % 8); }
+
+ unsigned int ColorPlaneCount;
+ unsigned int InputWidth; // # of pixels input per colorplane
+ unsigned int OutputWidth[MAXCOLORPLANES]; // # of pixels output per colorplane
+ unsigned char ColorDepth[MAXCOLORPLANES];
+ // how many rows needed relative to base resolution -- all 1 unless mixed-res
+ unsigned char NumRows[MAXCOLORPLANES];
+ // color plane data
+ // for current interface, we must maintain mapping of
+ // 0=K, 1=C, 2=M, 3=Y
+ BYTE* ColorPlane[MAXCOLORPLANES][MAXCOLORROWS][MAXCOLORDEPTH];
+
+ unsigned int StartPlane; // since planes are ordered KCMY, if no K, this is 1
+ unsigned int EndPlane; // usually Y, could be Mlight
+ int ResBoost;
+
+private:
+ void Interpolate(const uint32_t *start,const unsigned long i,
+ unsigned char r,unsigned char g,unsigned char b,
+ unsigned char *blackout, unsigned char *cyanout,
+ unsigned char *magentaout, unsigned char *yellowout, bool);
+ void FreeBuffers();
+
+ bool Forward16PixelsNonWhite(BYTE * inputPtr)
+ {
+// return ((*(uint32_t *)(inputPtr) != 0x0) || (*(((uint32_t *)(inputPtr)) + 1) != 0x0) ||
+// (*(((uint32_t *)(inputPtr)) + 2) != 0x0) || (*(((uint32_t *)(inputPtr)) + 3) != 0x0));
+ for (int i=0; i < 16; i++)
+ {
+ if ((*inputPtr++) != 0)
+ {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ bool Backward16PixelsNonWhite(BYTE * inputPtr)
+ {
+// return ((*(uint32_t *)(inputPtr) != 0x0) || (*(((uint32_t *)(inputPtr)) - 1) != 0x0) ||
+// (*(((uint32_t *)(inputPtr)) - 2) != 0x0) || (*(((uint32_t *)(inputPtr)) - 3) != 0x0));
+ for (int i=0; i < 16; i++)
+ {
+ if ((*inputPtr--) !=0 )
+ {
+ return true;
+ }
+ }
+ return false;
+ }
+ unsigned int getOutputWidth();
+
+ short* ErrBuff[6];
+
+ short nNextRaster;
+
+ short fRasterOdd;
+ const unsigned char* fBlackFEDResPtr;
+ const unsigned char* fColorFEDResPtr;
+
+ unsigned int AdjustedInputWidth; // InputWidth padded to be divisible by 8
+ void PixelMultiply(unsigned char* buffer, unsigned int width, unsigned int factor);
+
+ unsigned int iColor, iRow, iPlane;
+ unsigned int PlaneCount(); // tells how many layers (colors,hifipe,multirow)
+
+ bool started;
+
+ BYTE* tempBuffer;
+ BYTE* tempBuffer2;
+ BYTE* originalKData;
+ unsigned int oddbits;
+ void CleanOddBits(unsigned int iColor, unsigned int iRow);
+
+ uint32_t hold_random;
+ inline BYTE RandomNumber()
+ {
+ hold_random = (hold_random * 214013) + 2531011;
+ return (BYTE)((hold_random >> 16) & 0xFF);
+ } //RandomNumber
+
+
+ typedef struct THTDitherParms
+ {
+ unsigned short fNumPix; // Dirty Pixels to be dithered
+ BYTE * fInput; // Pixel array to dither
+ BYTE * fOutput1; // Output raster binary & hifipe plane 1
+ BYTE * fOutput2; // Output raster hifipe plane 2 (2-bit)
+ BYTE * fOutput3; // Output raster hifipe plane 3 (3-bit)
+
+ const BYTE * fFEDResPtr; // brkpnt table
+
+ short * fErr; // Current error buffer
+ short fRasterEvenOrOdd;// Serpentine (Forward/Backward)
+
+ bool fSymmetricFlag; // Are we symmetric
+
+ bool fHifipe; // Are we doing Hifipe?
+
+ unsigned short fMatrixRowSize;
+ BYTE * fMatrixV1;
+ unsigned short fDitherCellOffset;
+ unsigned short fSqueezeOffset;
+
+ short * fWeightTablePtr; // Error Diffusion threshold table
+ short fOffsetPick; // Random# offset for threshold
+ bool fVerticalExpFlag; // Are we vertically expanding
+ } THTDitherParms, *THTDitherParmsPtr;
+
+ bool usematrix;
+
+ DRIVER_ERROR HTMATRIXHI_KCMY(THTDitherParmsPtr ditherParmsPtr, unsigned short count);
+
+ BYTE HPRand() // normalize to 5..79
+ { BYTE b=RandomNumber() % 74; b+= 5; return b; }
+
+
+ void HTEDiffOpen (THTDitherParmsPtr ditherParmsPtr,
+ unsigned short count);
+
+ THTDitherParms fDitherParms[6];
+
+ THTDitherParmsPtr ditherParms;
+ short tone;
+ short *diffusionErrorPtr;
+ short tmpShortStore;
+ BYTE rasterByte1, rasterByte2, rasterByte3;
+ BYTE level;
+ short pixelCount;
+ short thValue;
+
+ short *errPtr;
+ unsigned short numLoop;
+
+ BYTE *inputPtr;
+ BYTE *outputPtr1;
+ BYTE *outputPtr2;
+ BYTE *outputPtr3;
+
+ const BYTE *fedResTbl;
+ const BYTE *fedResPtr;
+
+ bool symmetricFlag;
+
+ bool doNext8Pixels;
+
+ bool hifipe;
+
+ void BACKWARD_FED(short thresholdValue, unsigned int bitMask);
+ void FORWARD_FED(short thresholdValue, unsigned int bitMask);
+}; // Halftoner
+
+#endif // HALFTONER_H
+
diff --git a/prnt/hpcups/Job.cpp b/prnt/hpcups/Job.cpp
new file mode 100644
index 0000000..9035568
--- /dev/null
+++ b/prnt/hpcups/Job.cpp
@@ -0,0 +1,299 @@
+/*****************************************************************************\
+ Job.cpp : Implementation of Job class
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+#include "Job.h"
+
+Job::Job() :
+ m_pSys(NULL),
+ m_pPipeline(NULL),
+ m_pEncap(NULL),
+ skipcount(0),
+ m_pBlankRaster(NULL),
+ m_pBlackRaster(NULL),
+ m_bDataSent(false),
+ m_iRaster(0),
+ m_iBlanks(0)
+{
+}
+
+DRIVER_ERROR Job::Init(SystemServices *pSystemServices, JobAttributes *job_attrs, Encapsulator *encap_intf)
+{
+ DRIVER_ERROR err = NO_ERROR;
+
+ if (encap_intf == NULL) {
+ return NO_PRINTER_SELECTED;
+ }
+
+ m_pEncap = encap_intf;
+ m_pSys = pSystemServices;
+
+ //m_job_attributes = job_attrs;
+ memcpy(&m_job_attributes, job_attrs, sizeof(m_job_attributes));
+
+ err = m_pEncap->StartJob(m_pSys, &m_job_attributes);
+
+ if (err == NO_ERROR)
+ err = Configure();
+
+// Setup the blank raster used by sendrasters
+ if (err == NO_ERROR)
+ err = setBlankRaster();
+ return err;
+} //Job
+
+/*! Allows the encapsulator to prepare for a new page
+ *
+ */
+
+DRIVER_ERROR Job::StartPage(JobAttributes *job_attrs)
+{
+
+ if (job_attrs) {
+ memcpy(&m_job_attributes, job_attrs, sizeof(m_job_attributes));
+ }
+ return m_pEncap->StartPage(&m_job_attributes);
+}
+
+DRIVER_ERROR Job::Cleanup()
+{
+ // Client isn't required to call NewPage at end of last page, so
+ // we may need to eject a page now.
+ DRIVER_ERROR err = NO_ERROR;
+
+/*
+ * Let the encapsulator cleanup, such as sending previous page if speed mech
+ * is enabled.
+ */
+
+ if (m_pEncap) {
+ err = m_pEncap->Cleanup();
+ }
+
+ if (err != NO_ERROR) {
+ return err;
+ }
+
+ if (m_bDataSent || err != NO_ERROR) {
+ NewPage();
+ }
+
+ // Tell printer that job is over.
+ if (m_pEncap) {
+ m_pEncap->EndJob();
+ }//end if
+ return NO_ERROR;
+}
+
+void Job::CancelJob()
+{
+ if (m_pEncap)
+ m_pEncap->CancelJob();
+}
+
+Job::~Job()
+{
+ if (m_pBlackRaster) {
+ delete [] m_pBlackRaster;
+ }
+
+ if (m_pBlankRaster) {
+ delete [] m_pBlankRaster;
+ }
+
+ Pipeline *p;
+ Pipeline *p2;
+ p = m_pPipeline;
+ while (p)
+ {
+ p2 = p;
+ p = p->next;
+ delete p2->Exec;
+ delete p2;
+ }
+
+ if (m_pEncap) {
+ delete m_pEncap;
+ }
+
+} //~Job
+
+void Job::unpackBits(BYTE *BlackImageData)
+{
+// Convert K from 1-bit raster to 8-bit raster.
+ unsigned char bitflag[] = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01};
+ int width = (m_job_attributes.media_attributes.printable_width + 7) / 8;
+ for (int i = 0; i < width; i++)
+ {
+ for (int j = 0; j < 8; j++)
+ {
+ if (BlackImageData[i] & bitflag[j])
+ m_pBlackRaster[i*8+j] = 1;
+ }
+ }
+}
+
+DRIVER_ERROR Job::SendRasters(BYTE* BlackImageData, BYTE* ColorImageData)
+{
+ DRIVER_ERROR err = NO_ERROR;
+ if (m_pPipeline == NULL) {
+ return SYSTEM_ERROR;
+ }
+
+ if (BlackImageData == NULL && ColorImageData == NULL) {
+ if (m_pEncap->CanSkipRasters()) {
+ skipcount++;
+ return NO_ERROR;
+ }
+ ColorImageData = m_pBlankRaster;
+ }
+
+ if (skipcount > 0) {
+ m_pPipeline->Flush();
+ err = m_pEncap->SendCAPy(skipcount);
+ skipcount = 0;
+ }
+ m_bDataSent = true;
+
+ if (BlackImageData || ColorImageData)
+ {
+ if (BlackImageData)
+ {
+ if (m_pEncap->UnpackBits())
+ {
+ err = setBlackRaster();
+ ERRCHECK;
+ unpackBits(BlackImageData);
+ BlackImageData = m_pBlackRaster;
+ }
+ m_pPipeline->Exec->raster.rastersize[COLORTYPE_BLACK] = m_job_attributes.media_attributes.printable_width;
+ m_pPipeline->Exec->raster.rasterdata[COLORTYPE_BLACK] = BlackImageData;
+ }
+ else
+ {
+ m_pPipeline->Exec->raster.rastersize[COLORTYPE_BLACK] = 0;
+ m_pPipeline->Exec->raster.rasterdata[COLORTYPE_BLACK] = NULL;
+ }
+ if (ColorImageData)
+ {
+ m_pPipeline->Exec->raster.rastersize[COLORTYPE_COLOR] = m_job_attributes.media_attributes.printable_width * 3;
+ m_pPipeline->Exec->raster.rasterdata[COLORTYPE_COLOR] = ColorImageData;
+ }
+ else
+ {
+ m_pPipeline->Exec->raster.rastersize[COLORTYPE_COLOR] = 0;
+ m_pPipeline->Exec->raster.rasterdata[COLORTYPE_COLOR] = NULL;
+ }
+ err = m_pPipeline->Execute(&(m_pPipeline->Exec->raster));
+ }
+
+ return err;
+} // Sendrasters
+
+DRIVER_ERROR Job::NewPage()
+{
+ DRIVER_ERROR err;
+ m_pEncap->SetLastBand();
+
+ if (!m_bDataSent && skipcount > 0) {
+ skipcount = 0;
+ SendRasters(NULL, m_pBlankRaster);
+ }
+ m_pPipeline->Flush();
+ err = m_pEncap->FormFeed();
+ ERRCHECK;
+
+// reset flag used to see if formfeed needed
+ m_bDataSent = false;
+ skipcount = 0;
+
+ return NO_ERROR;
+} // Newpage
+
+DRIVER_ERROR Job::Configure()
+{
+// mode has been set -- now set up rasterwidths and pipeline
+ DRIVER_ERROR err = NO_ERROR;
+ Pipeline *p;
+
+ p = NULL;
+ // Ask Encapsulator to configure itself
+
+ err = m_pEncap->Configure(&m_pPipeline);
+ if (err != NO_ERROR)
+ {
+ return err;
+ }
+
+ // always end pipeline with RasterSender
+ // create RasterSender object
+ RasterSender *pSender;
+ pSender = new RasterSender(m_pEncap);
+
+ p = new Pipeline(pSender);
+
+ if (m_pPipeline) {
+ m_pPipeline->AddPhase(p);
+ }
+ else {
+ m_pPipeline = p;
+ }
+ return NO_ERROR;
+} //Configure
+
+DRIVER_ERROR Job::setBlackRaster()
+{
+ if (!m_pBlackRaster) {
+ m_pBlackRaster = new BYTE[m_job_attributes.media_attributes.printable_width];
+ NEWCHECK(m_pBlackRaster);
+ }
+ memset(m_pBlackRaster, 0, m_job_attributes.media_attributes.printable_width);
+
+ return NO_ERROR;
+} //setBlackRaster
+
+DRIVER_ERROR Job::setBlankRaster()
+{
+ if (m_pBlankRaster) {
+ delete m_pBlankRaster;
+ }
+ size_t size = m_job_attributes.media_attributes.printable_width * 3;
+ m_pBlankRaster = new BYTE[size];
+ NEWCHECK(m_pBlankRaster);
+ memset(m_pBlankRaster, 0xFF, size);
+ return NO_ERROR;
+}
+
+DRIVER_ERROR Job::preProcessRasterData(cups_raster_t **ppcups_raster, cups_page_header2_t* firstpage_cups_header, char* pPreProcessedRasterFile)
+{
+ dbglog ("DEBUG: Job::preProcessRasterData.............. \n");
+ return m_pEncap->preProcessRasterData(ppcups_raster, firstpage_cups_header, pPreProcessedRasterFile);
+}
+
+
diff --git a/prnt/hpcups/Job.h b/prnt/hpcups/Job.h
new file mode 100644
index 0000000..4b30bac
--- /dev/null
+++ b/prnt/hpcups/Job.h
@@ -0,0 +1,76 @@
+/*****************************************************************************\
+ Job.h : Interface for the Job class
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+#ifndef JOB_H
+#define JOB_H
+
+#include "Encapsulator.h"
+#include "Pipeline.h"
+#include "Processor.h"
+#include "EncapsulatorFactory.h"
+#include "Mode9.h"
+#include "Mode10.h"
+#include "RasterSender.h"
+class Job
+{
+public:
+ Job();
+
+ DRIVER_ERROR Init(SystemServices *pSystemServices, JobAttributes *job_attrs, Encapsulator *encap_intf);
+ DRIVER_ERROR Cleanup();
+ virtual ~Job();
+ DRIVER_ERROR SendRasters(BYTE* BlackImageData=(BYTE*)NULL, BYTE* ColorImageData=(BYTE*)NULL);
+ DRIVER_ERROR NewPage();
+ DRIVER_ERROR StartPage(JobAttributes *job_attrs);
+ DRIVER_ERROR preProcessRasterData(cups_raster_t **cups_raster, cups_page_header2_t* firstpage_cups_header, char* pPreProcessedRasterFile);
+ void CancelJob();
+private:
+
+ void unpackBits(BYTE *BlackImageData);
+ JobAttributes m_job_attributes;
+ SystemServices *m_pSys;
+ Pipeline *m_pPipeline;
+ Encapsulator *m_pEncap;
+ unsigned int skipcount;
+ BYTE* m_pBlankRaster;
+ BYTE* m_pBlackRaster;
+ bool m_bDataSent;
+ DRIVER_ERROR Configure();
+ DRIVER_ERROR setBlankRaster();
+ DRIVER_ERROR setBlackRaster();
+ int m_iRaster;
+ int m_iBandNum;
+ int m_iBlanks;
+ int m_resolution_ratio;
+ int m_row_number;
+}; // Job
+
+#endif // JOB_H
+
diff --git a/prnt/hpcups/LJColor.cpp b/prnt/hpcups/LJColor.cpp
new file mode 100644
index 0000000..38f8050
--- /dev/null
+++ b/prnt/hpcups/LJColor.cpp
@@ -0,0 +1,243 @@
+/*****************************************************************************\
+ LJColor.cpp : Implementation of LJColor class
+
+ Copyright (c) 1996 - 2009, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+#include "CommonDefinitions.h"
+#include "LJColor.h"
+#include "ColorMatcher.h"
+#include "Halftoner.h"
+#include "Mode2.h"
+#include "Mode3.h"
+#include "resources.h"
+#include "ColorMaps.h"
+#include "PrinterCommands.h"
+
+LJColor::LJColor() : Encapsulator()
+{
+ memset(&m_PM, 0, sizeof(m_PM));
+ strcpy(m_szLanguage, "PCL");
+}
+
+LJColor::~LJColor()
+{
+}
+
+DRIVER_ERROR LJColor::addJobSettings()
+{
+ cur_pcl_buffer_ptr += sprintf((char *) cur_pcl_buffer_ptr,
+ "@PJL SET PAGEPROTECT=AUTO\012@PJL SET RESOLUTION=%d\012@PJL SET DENSITY=5\012", m_pQA->horizontal_resolution);
+ if (m_pQA->print_quality == -1)
+ {
+ cur_pcl_buffer_ptr += sprintf((char *) cur_pcl_buffer_ptr,
+ "@PJL SET RET=OFF\012@PJL SET ECONOMODE=ON\012");
+ }
+ if (m_pJA->e_duplex_mode != DUPLEXMODE_NONE)
+ {
+ cur_pcl_buffer_ptr += sprintf((char *) cur_pcl_buffer_ptr,
+ "@PJL SET DUPLEX=ON\012@PJL SET BINDING=%s\012",
+ (m_pJA->e_duplex_mode == DUPLEXMODE_BOOK) ? "LONGEDGE" :
+ "SHORTEDGE");
+ }
+ else
+ {
+ addToHeader("@PJL SET DUPLEX=OFF\012", 19);
+ }
+ cur_pcl_buffer_ptr += sprintf((char *) cur_pcl_buffer_ptr, "@PJL ENTER LANGUAGE=PCL\012");
+ sendJobHeader();
+ DRIVER_ERROR err = Cleanup();
+ return err;
+}
+
+DRIVER_ERROR LJColor::Configure(Pipeline **pipeline)
+{
+ Pipeline *p = NULL;
+ Pipeline *head;
+ unsigned int width;
+ head = *pipeline;
+ width = m_pMA->printable_width;
+
+/*
+ * I need a flag in the printmode structure to whether create a CMYGraymap
+ * and set the ulMap1 to it.
+ */
+
+
+// color_mode: 0 - color, 1 - grey_cmy, 2 - grey_k
+
+ m_PM.BaseResX = m_pQA->horizontal_resolution;
+ m_PM.BaseResY = m_pQA->vertical_resolution;
+ if (m_pJA->color_mode != 0)
+ {
+ ColorMatcher *pColorMatcher;
+ Mode2 *pMode2;
+ int iRows[MAXCOLORPLANES];
+ unsigned int uiResBoost;
+ m_PM.dyeCount = 1;
+ m_PM.ColorDepth[0] = 1;
+ m_PM.cmap.ulMap1 = ulMapDJ600_CCM_K;
+ m_PM.eHT = FED;
+ m_PM.BlackFEDTable = HTBinary_open;
+ m_PM.ColorFEDTable = HTBinary_open;
+ m_PM.MixedRes = false;
+
+ for (int i = 0; i < MAXCOLORPLANES; i++)
+ {
+ m_PM.ResolutionX[i] = m_pQA->horizontal_resolution;
+ m_PM.ResolutionY[i] = m_pQA->vertical_resolution;
+ iRows[i] = m_PM.ResolutionX[i] / m_PM.BaseResX;
+ }
+ uiResBoost = m_PM.BaseResX / m_PM.BaseResY;
+ if (uiResBoost == 0)
+ uiResBoost = 1;
+
+ pColorMatcher = new ColorMatcher(m_PM.cmap, m_PM.dyeCount, width);
+ head = new Pipeline(pColorMatcher);
+ m_pHalftoner = new Halftoner (&m_PM, width, iRows, uiResBoost, m_PM.eHT == MATRIX);
+ p = new Pipeline(m_pHalftoner);
+ head->AddPhase(p);
+ pMode2 = new Mode2(width);
+ p = new Pipeline(pMode2);
+ head->AddPhase(p);
+ pMode2->myplane = COLORTYPE_COLOR;
+ }
+ else
+ {
+ m_pMode3 = new Mode3(width * 3);
+ head = new Pipeline(m_pMode3);
+ m_pMode3->myplane = COLORTYPE_COLOR;
+ }
+
+ *pipeline = head;
+ return NO_ERROR;
+}
+
+DRIVER_ERROR LJColor::StartPage(JobAttributes *pJA)
+{
+ m_pJA = pJA;
+ m_pMA = &pJA->media_attributes;
+ m_pQA = &pJA->quality_attributes;
+ page_number++;
+ return NO_ERROR;
+}
+
+DRIVER_ERROR LJColor::FormFeed()
+{
+ DRIVER_ERROR err;
+ err = Cleanup();
+ err = m_pSystemServices->Send((const BYTE *) "\x0C", 1);
+ return err;
+}
+
+DRIVER_ERROR LJColor::EndJob()
+{
+ DRIVER_ERROR err = NO_ERROR;
+ err = Cleanup();
+ err = m_pSystemServices->Send((const BYTE *) "\x1B*rC", 4);
+ err = m_pSystemServices->Send(Reset, sizeof(Reset));
+ if (err == NO_ERROR)
+ err = m_pSystemServices->Send(UEL, sizeof(UEL));
+ return err;
+}
+
+DRIVER_ERROR LJColor::Encapsulate(RASTERDATA *InputRaster, bool bLastPlane)
+{
+ DRIVER_ERROR err = NO_ERROR;
+ char tmpStr[16];
+ int iLen;
+ m_iYPos++;
+ iLen = sprintf (tmpStr, "\x1b*b%uW", InputRaster->rastersize[COLORTYPE_COLOR]);
+ err = this->Send((const BYTE *) tmpStr, iLen);
+ if (err == NO_ERROR && InputRaster->rastersize[COLORTYPE_COLOR] > 0)
+ {
+ err = this->Send(InputRaster->rasterdata[COLORTYPE_COLOR],
+ InputRaster->rastersize[COLORTYPE_COLOR]);
+ }
+
+/*
+ * Printers with low memory (64 MB or less) can run out of memory during decompressing
+ * the image data and will abort the job. To prevent this, restart raster command.
+ * Raghu
+ */
+
+ if (m_pJA->color_mode == 0 &&
+ m_pQA->horizontal_resolution >= 600 &&
+ m_iYPos % 1200 == 0)
+ {
+ // Reset seed our seed row
+ m_pMode3->Flush();
+ err = this->Send ((const BYTE *) "\033*rC\033*r1A\033*b3M", 14);
+ }
+
+ return err;
+}
+
+void LJColor::configureRasterData()
+{
+
+/*
+ * Configure image data - ESC*v#W - # = 6 bytes
+ * 02 - RGB colorspace (00 - Device RGB)
+ * 03 - Direct pixel
+ * 08 - bits per index - ignored for direct pixel
+ * 08, 08, 08 - bits per primary each
+ */
+
+ addToHeader ((const BYTE *) "\033*v6W\00\03\010\010\010\010", 11);
+
+// Continues tone dither
+// Logical operation - 0
+
+ addToHeader ((const BYTE *) "\033*t18J", 6);
+
+/*
+ * Driver Configuration Command - ESC*#W - # = 3 bytes
+ * device id - 6 = color HP LaserJet Printer
+ * func index - 4 = Select Colormap
+ * argument - 2 = Vivid Graphics
+ */
+
+ addToHeader ((const BYTE *) "\033*o3W\06\04\06", 8);
+
+/*
+ * Program color palette entries
+ */
+ addToHeader ((const BYTE *) "\033*v255A\033*v255B\033*v255C\033*v0I", 26);
+ addToHeader ((const BYTE *) "\033*v255A\033*v0B\033*v0C\033*v6I", 22);
+ addToHeader ((const BYTE *) "\033*v0A\033*v255B\033*v0C\033*v5I", 22);
+ addToHeader ((const BYTE *) "\033*v0A\033*v0B\033*v255C\033*v3I", 22);
+ addToHeader ((const BYTE *) "\033*v255A\033*v255B\033*v0C\033*v4I", 24);
+ addToHeader ((const BYTE *) "\033*v255A\033*v0B\033*v255C\033*v2I", 24);
+ addToHeader ((const BYTE *) "\033*v0A\033*v255B\033*v255C\033*v1I", 24);
+ addToHeader ((const BYTE *) "\033*v0A\033*v0B\033*v0C\033*v7I", 20);
+
+// Foreground color
+
+ addToHeader ((const BYTE *) "\033*v7S", 5);
+}
+
diff --git a/prnt/hpcups/LJColor.h b/prnt/hpcups/LJColor.h
new file mode 100644
index 0000000..c1cd39d
--- /dev/null
+++ b/prnt/hpcups/LJColor.h
@@ -0,0 +1,63 @@
+/*****************************************************************************\
+ LJColor.h : Interface for LJColor class
+
+ Copyright (c) 1996 - 2009, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+#ifndef LJCOLOR_H
+#define LJCOLOR_H
+
+#include "CommonDefinitions.h"
+#include "Pipeline.h"
+#include "Encapsulator.h"
+
+class Halftoner;
+class Mode3;
+
+class LJColor: public Encapsulator
+{
+public:
+ LJColor();
+ ~LJColor();
+ DRIVER_ERROR Encapsulate (RASTERDATA *InputRaster, bool bLastPlane);
+ DRIVER_ERROR StartPage(JobAttributes *pJA);
+ DRIVER_ERROR Configure(Pipeline **pipeline);
+ DRIVER_ERROR EndJob();
+ DRIVER_ERROR FormFeed();
+protected:
+ virtual DRIVER_ERROR addJobSettings();
+ void configureRasterData();
+ DRIVER_ERROR flushPrinterBuffer() {return NO_ERROR;}
+private:
+ PrintMode m_PM;
+ Halftoner *m_pHalftoner;
+ Mode3 *m_pMode3;
+ int m_iYPos;
+};
+
+#endif // LJCOLOR_H
+
diff --git a/prnt/hpcups/LJFastRaster.cpp b/prnt/hpcups/LJFastRaster.cpp
new file mode 100644
index 0000000..7a4371a
--- /dev/null
+++ b/prnt/hpcups/LJFastRaster.cpp
@@ -0,0 +1,335 @@
+/*****************************************************************************\
+ LJFastRaster.cpp : Implementation of LJFastRaster class
+
+ Copyright (c) 1996 - 2009, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+#include "CommonDefinitions.h"
+#include "LJFastRaster.h"
+#include "ColorMatcher.h"
+#include "Halftoner.h"
+#include "ModeDeltaPlus.h"
+#include "resources.h"
+#include "ColorMaps.h"
+#include "PrinterCommands.h"
+
+LJFastRaster::LJFastRaster() : Encapsulator()
+{
+ memset(&m_PM, 0, sizeof(m_PM));
+ strcpy(m_szLanguage, "PCLXL");
+ m_pModeDeltaPlus = NULL;
+}
+
+LJFastRaster::~LJFastRaster()
+{
+}
+
+DRIVER_ERROR LJFastRaster::addJobSettings()
+{
+ cur_pcl_buffer_ptr += sprintf((char *) cur_pcl_buffer_ptr,
+ "@PJL SET RESOLUTION=600\012@PJL SET BITSPERPIXEL=1\012@PJL SET TIMEOUT=900\012");
+ cur_pcl_buffer_ptr += sprintf((char *) cur_pcl_buffer_ptr,
+ "@PJL SET PAGEPROTECT=AUTO\012@PJL SET DENSITY=5\012");
+ if (m_pQA->print_quality == -1)
+ {
+ cur_pcl_buffer_ptr += sprintf((char *) cur_pcl_buffer_ptr,
+ "@PJL SET RET=OFF\012@PJL SET ECONOMODE=ON\012");
+ }
+ addToHeader("%s", "@PJL ENTER LANGUAGE=PCLXL\012) HP-PCL XL;2;0;Comment\012");
+ addToHeader(FRBeginSession, sizeof(FRBeginSession));
+ addToHeader(FRVUExtn3, sizeof(FRVUExtn3));
+ addToHeader(FRVendorUniq, sizeof(FRVendorUniq));
+ addToHeader(FROpenDataSource, sizeof(FROpenDataSource));
+ return NO_ERROR;
+}
+
+DRIVER_ERROR LJFastRaster::Configure(Pipeline **pipeline)
+{
+ DRIVER_ERROR err = NO_ERROR;
+ Pipeline *p = NULL;
+ Pipeline *head;
+ unsigned int width;
+ ColorMatcher *pColorMatcher;
+ Halftoner *pHalftoner;
+ int iRows[MAXCOLORPLANES];
+ unsigned int uiResBoost;
+ head = *pipeline;
+
+/*
+ * I need a flag in the printmode structure to whether create a CMYGraymap
+ * and set the ulMap1 to it.
+ */
+
+ m_PM.dyeCount = 1;
+ m_PM.ColorDepth[0] = 1;
+ m_PM.cmap.ulMap1 = ulMapDJ600_CCM_K;
+ m_PM.BaseResX = m_pQA->horizontal_resolution;
+ m_PM.BaseResY = m_pQA->vertical_resolution;
+ m_PM.eHT = FED;
+ m_PM.BlackFEDTable = HTBinary_open;
+ m_PM.ColorFEDTable = HTBinary_open;
+ m_PM.MixedRes = false;
+
+ for (int i = 0; i < MAXCOLORPLANES; i++)
+ {
+ m_PM.ResolutionX[i] = m_pQA->horizontal_resolution;
+ m_PM.ResolutionY[i] = m_pQA->vertical_resolution;
+ iRows[i] = m_PM.ResolutionX[i] / m_PM.BaseResX;
+ }
+ uiResBoost = m_PM.BaseResX / m_PM.BaseResY;
+ if (uiResBoost == 0)
+ uiResBoost = 1;
+
+ width = m_pMA->printable_width;
+
+ pColorMatcher = new ColorMatcher(m_PM.cmap, m_PM.dyeCount, width);
+ head = new Pipeline(pColorMatcher);
+ pHalftoner = new Halftoner (&m_PM, width, iRows, uiResBoost, m_PM.eHT == MATRIX);
+ p = new Pipeline(pHalftoner);
+ head->AddPhase(p);
+ m_pModeDeltaPlus = new ModeDeltaPlus(width);
+ p = new Pipeline(m_pModeDeltaPlus);
+ head->AddPhase(p);
+ m_pModeDeltaPlus->myplane = COLORTYPE_COLOR;
+ err = m_pModeDeltaPlus->Init();
+
+ *pipeline = head;
+ return err;
+}
+
+DRIVER_ERROR LJFastRaster::StartPage(JobAttributes *pJA)
+{
+ DRIVER_ERROR err = NO_ERROR;
+ page_number++;
+
+ m_pJA = pJA;
+ m_pMA = &pJA->media_attributes;
+ m_pQA = &pJA->quality_attributes;
+
+ m_pModeDeltaPlus->NewPage();
+
+/* Orienatation: is FrFeedOrientationSeq[1]. Can take the following values:
+ * Portrait : 0x00
+ * Landscape: : 0x01
+ * Reversed Portrait : 0x02
+ * Reversed Landscape : 0x03
+ * Image Orientataion: 0x04
+ */
+
+ addToHeader(FRFeedOrientation, sizeof(FRFeedOrientation));
+
+// Set media source, type, size and quality modes.
+
+ if (m_pMA->pcl_id == 96) // custom paper size
+ {
+ BYTE szCustomSize[16];
+ union
+ {
+ float fValue;
+ uint32_t uiValue;
+ } LJFUnion;
+ uint32_t uiXsize;
+ uint32_t uiYsize;
+ int k = 0;
+ LJFUnion.fValue = (float) m_pMA->physical_width / m_pQA->horizontal_resolution;
+ uiXsize = LJFUnion.uiValue;
+ LJFUnion.fValue = (float) m_pMA->physical_height / m_pQA->horizontal_resolution;
+ uiYsize = LJFUnion.uiValue;
+ szCustomSize[k++] = 0xD5;
+ szCustomSize[k++] = (BYTE) (uiXsize & 0x000000FF);
+ szCustomSize[k++] = (BYTE) ((uiXsize & 0x0000FF00) >> 8);
+ szCustomSize[k++] = (BYTE) ((uiXsize & 0x00FF0000) >> 16);
+ szCustomSize[k++] = (BYTE) ((uiXsize & 0xFF000000) >> 24);
+ szCustomSize[k++] = (BYTE) (uiYsize & 0x000000FF);
+ szCustomSize[k++] = (BYTE) ((uiYsize & 0x0000FF00) >> 8);
+ szCustomSize[k++] = (BYTE) ((uiYsize & 0x00FF0000) >> 16);
+ szCustomSize[k++] = (BYTE) ((uiYsize & 0xFF000000) >> 24);
+ szCustomSize[k++] = 0xF8;
+ szCustomSize[k++] = 0x2F;
+ addToHeader(szCustomSize, k);
+ addToHeader(FRCustomMediaSize, sizeof(FRCustomMediaSize));
+ }
+ else
+ {
+ memcpy(cur_pcl_buffer_ptr, FRPaperSize, sizeof(FRPaperSize));
+ cur_pcl_buffer_ptr[1] = (BYTE) m_pMA->pcl_id;
+ cur_pcl_buffer_ptr += sizeof(FRPaperSize);
+ }
+
+ addToHeader(FRBeginPage, sizeof(FRBeginPage));
+ err = Cleanup();
+ return err;
+}
+
+DRIVER_ERROR LJFastRaster::SendCAPy(int iOffset)
+{
+ return NO_ERROR;
+}
+
+DRIVER_ERROR LJFastRaster::FormFeed()
+{
+ return sendBuffer(FREndPage, sizeof(FREndPage));
+}
+
+DRIVER_ERROR LJFastRaster::EndJob()
+{
+ DRIVER_ERROR err;
+ addToHeader(FRCloseDataSource, sizeof(FRCloseDataSource));
+ addToHeader(FREndSession, sizeof(FREndSession));
+ addToHeader((const BYTE *) PJLExit, strlen(PJLExit));
+ err = Cleanup();
+ return err;
+}
+
+#define FAST_RASTER_HEADERSIZE 25
+
+typedef enum
+{
+ eDelta32,
+ eDeltaPlus = 24,
+ eFX = 18,
+ eRAW = 2
+} CompressionMethod;
+
+//** Faster Raster Path Header address values
+
+#define BASE_ADDRESS 0
+#define PAGE_NUM_ADDRESS 1
+#define RESOLUTION_ADDRESS_HI 2
+#define RESOLUTION_ADDRESS_LO 3
+#define COMPRESSION_ADDRESS_HI 4
+#define COMPRESSION_ADDRESS_LO 5
+#define COLOR_PLANE_SPECIFIER_ADDRESS 6
+#define COMPRESSION_RATIO 7
+#define PRODUCT_ID 8
+#define IMAGE_SIZE_ADDRESS_HIWORD_HI 12
+#define IMAGE_SIZE_ADDRESS_HIWORD_LO 13
+#define IMAGE_SIZE_ADDRESS_LOWORD_HI 14
+#define IMAGE_SIZE_ADDRESS_LOWORD_LO 15
+#define IMAGE_WIDTH_ADDRESS_HI 16
+#define IMAGE_WIDTH_ADDRESS_LO 17
+#define IMAGE_HEIGTH_ADDRESS_HI 18
+#define IMAGE_HEIGTH_ADDRESS_LO 19
+#define ABS_X_ADDRESS_HI 20
+#define ABS_X_ADDRESS_LO 21
+#define ABS_Y_ADDRESS_HI 22
+#define ABS_Y_ADDRESS_LO 23
+#define BIT_DEPTH_ADDRESS 24
+
+#define eK 3
+DRIVER_ERROR LJFastRaster::Encapsulate (RASTERDATA *InputRaster, bool bLastPlane)
+{
+ BYTE res[64];
+ DRIVER_ERROR err = NO_ERROR;
+
+ //** form FR header
+ unsigned char pucHeader[FAST_RASTER_HEADERSIZE];
+ long lImageWidth = ((m_pMA->printable_width + 7) / 8) * 8;
+ long lResolution = 600;
+ long lBlockOffset = ((m_pModeDeltaPlus->GetCurrentRasterRow() + 127) / 128) * 128 - 128;
+ long lBitDepth = 1;
+ long lBlockHeight = m_pModeDeltaPlus->GetCurrentBlockHeight();
+
+ unsigned short wTemp = LOWORD (lBlockOffset);
+ BYTE byHIByte = 0;
+ BYTE byLOByte = 0;
+
+ memset (pucHeader, 0, FAST_RASTER_HEADERSIZE);
+
+ pucHeader[ABS_X_ADDRESS_HI] = 0;
+ pucHeader[ABS_X_ADDRESS_LO] = 0;
+ pucHeader[ABS_Y_ADDRESS_HI] = HIBYTE (wTemp);
+ pucHeader[ABS_Y_ADDRESS_LO] = LOBYTE (wTemp);
+
+ pucHeader[BASE_ADDRESS] = 0;
+ pucHeader[PAGE_NUM_ADDRESS] = 1;
+
+ wTemp = (unsigned short) (lResolution );
+ byHIByte = HIBYTE (wTemp);
+ byLOByte = LOBYTE (wTemp);
+ pucHeader[RESOLUTION_ADDRESS_HI] = byHIByte;
+ pucHeader[RESOLUTION_ADDRESS_LO] = byLOByte;
+
+ wTemp = m_pModeDeltaPlus->IsCompressed() ? (unsigned short) eDeltaPlus : (unsigned short) eRAW;
+ byHIByte = HIBYTE (wTemp);
+ byLOByte = LOBYTE (wTemp);
+ pucHeader[COMPRESSION_ADDRESS_HI] = byHIByte;
+ pucHeader[COMPRESSION_ADDRESS_LO] = byLOByte;
+
+ pucHeader[COLOR_PLANE_SPECIFIER_ADDRESS] = (BYTE) eK;
+ pucHeader[COMPRESSION_RATIO] = (BYTE) m_pModeDeltaPlus->GetFRatio();
+ wTemp = HIWORD (InputRaster->rastersize[COLORTYPE_COLOR]);
+ byHIByte = HIBYTE (wTemp);
+ byLOByte = LOBYTE (wTemp);
+ pucHeader[IMAGE_SIZE_ADDRESS_HIWORD_HI] = byHIByte;
+ pucHeader[IMAGE_SIZE_ADDRESS_HIWORD_LO] = byLOByte;
+
+ wTemp = LOWORD (InputRaster->rastersize[COLORTYPE_COLOR]);
+ byHIByte = HIBYTE (wTemp);
+ byLOByte = LOBYTE (wTemp);
+ pucHeader[IMAGE_SIZE_ADDRESS_LOWORD_HI] = byHIByte;
+ pucHeader[IMAGE_SIZE_ADDRESS_LOWORD_LO] = byLOByte;
+
+ wTemp = LOWORD (lImageWidth * 8);
+ byHIByte = HIBYTE (wTemp);
+ byLOByte = LOBYTE (wTemp);
+
+ pucHeader[IMAGE_WIDTH_ADDRESS_HI] = byHIByte;
+ pucHeader[IMAGE_WIDTH_ADDRESS_LO] = byLOByte;
+
+ wTemp = LOWORD (lBlockHeight);
+ byHIByte = HIBYTE (wTemp);
+ byLOByte = LOBYTE (wTemp);
+ pucHeader[IMAGE_HEIGTH_ADDRESS_HI] = byHIByte;
+ pucHeader[IMAGE_HEIGTH_ADDRESS_LO] = byLOByte;
+
+ wTemp = LOWORD (lBitDepth);
+ pucHeader[BIT_DEPTH_ADDRESS] = LOBYTE (wTemp);
+
+ unsigned int ulVUDataLength = (int)(InputRaster->rastersize[COLORTYPE_COLOR] + FAST_RASTER_HEADERSIZE);
+
+ err = this->Send (FREnterFRMode, sizeof(FREnterFRMode));
+ ERRCHECK;
+ res[0] = (BYTE) (ulVUDataLength & 0xFF);
+ res[1] = (BYTE) ((ulVUDataLength & 0x0000FF00) >> 8);
+ res[2] = (BYTE) ((ulVUDataLength & 0x00FF0000) >> 16);
+ res[3] = (BYTE) ((ulVUDataLength & 0xFF000000) >> 24);
+ res[4] = 0xF8;
+ res[5] = 0x92;
+ res[6] = 0x46;
+ err = this->Send (res, 7);
+ ERRCHECK;
+
+ //** now embed raster data, header and all
+ err = this->Send (pucHeader, FAST_RASTER_HEADERSIZE);
+ err = Cleanup();
+ if (err == NO_ERROR)
+ err = sendBuffer ((const BYTE *) InputRaster->rasterdata[COLORTYPE_COLOR],
+ InputRaster->rastersize[COLORTYPE_COLOR]);
+ return err;
+}
+
diff --git a/prnt/hpcups/LJFastRaster.h b/prnt/hpcups/LJFastRaster.h
new file mode 100644
index 0000000..ded95fe
--- /dev/null
+++ b/prnt/hpcups/LJFastRaster.h
@@ -0,0 +1,67 @@
+/*****************************************************************************\
+ LJFastRaster.h : Interface for LJFastRaster class
+
+ Copyright (c) 1996 - 2009, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+#ifndef LJFASTRASTER_H
+#define LJFASTRASTER_H
+
+#include "CommonDefinitions.h"
+#include "Pipeline.h"
+#include "Encapsulator.h"
+#include "ModeDeltaPlus.h"
+
+class Halftoner;
+
+class LJFastRaster: public Encapsulator
+{
+public:
+ LJFastRaster();
+ ~LJFastRaster();
+ DRIVER_ERROR Encapsulate (RASTERDATA *InputRaster, bool bLastPlane);
+ DRIVER_ERROR StartPage(JobAttributes *pJA);
+ DRIVER_ERROR Configure(Pipeline **pipeline);
+ DRIVER_ERROR EndJob();
+ DRIVER_ERROR FormFeed();
+ DRIVER_ERROR SendCAPy(int iOffset);
+ bool CanSkipRasters() {return false;}
+ void CancelJob() {}
+ void SetLastBand()
+ {
+ m_pModeDeltaPlus->SetLastBand();
+ }
+protected:
+ virtual DRIVER_ERROR addJobSettings();
+ DRIVER_ERROR flushPrinterBuffer() {return NO_ERROR;}
+private:
+ PrintMode m_PM;
+ ModeDeltaPlus *m_pModeDeltaPlus;
+};
+
+#endif // LJFASTRASTER_H
+
diff --git a/prnt/hpcups/LJJetReady.cpp b/prnt/hpcups/LJJetReady.cpp
new file mode 100644
index 0000000..991279f
--- /dev/null
+++ b/prnt/hpcups/LJJetReady.cpp
@@ -0,0 +1,338 @@
+/*****************************************************************************\
+ LJJetReady.cpp : Implementation of LJJetReady class
+
+ Copyright (c) 1996 - 2009, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+#include "Encapsulator.h"
+#include "ModeJpeg.h"
+#include "LJJetReady.h"
+#include "PrinterCommands.h"
+
+#define MOJAVE_STRIP_HEIGHT 128
+
+LJJetReady::LJJetReady() : Encapsulator()
+{
+ m_eCompressMode = COMPRESS_MODE_JPEG;
+ memset(&m_QTableInfo, 0, sizeof(m_QTableInfo));
+}
+
+LJJetReady::~LJJetReady()
+{
+}
+
+DRIVER_ERROR LJJetReady::addJobSettings()
+{
+ DRIVER_ERROR err;
+ addToHeader("@PJL SET STRINGCODESET=UTF8\012");
+ addToHeader("@PJL SET COPIES=1\012");
+ if (m_pJA->color_mode != 0)
+ {
+ addToHeader("@PJL SET PLANESINUSE=1\012");
+ }
+ if (m_pJA->e_duplex_mode != DUPLEXMODE_NONE)
+ {
+ addToHeader("@PJL SET DUPLEX=ON\012@PJL SET BINDING=%s\012",
+ m_pJA->e_duplex_mode == DUPLEXMODE_BOOK ? "LONGEDGE" : "SHORTEDGE");
+ }
+ addToHeader("@PJL SET RESOLUTION=600\012");
+ addToHeader("@PJL SET TIMEOUT=90\012");
+ addToHeader("@PJL ENTER LANGUAGE=PCLXL\012");
+ addToHeader(") HP-PCL XL;3;0;Comment, PCL-XL JetReady generator\012");
+ addToHeader(JRBeginSessionSeq, (int) sizeof(JRBeginSessionSeq));
+ err = Cleanup();
+ return err;
+}
+
+DRIVER_ERROR LJJetReady::Configure(Pipeline **pipeline)
+{
+ Pipeline *head;
+ ModeJpeg *pModeJpeg;
+ pModeJpeg = new ModeJpeg(((m_pMA->printable_width + 31) / 32) * 32);
+ if (pModeJpeg == NULL)
+ {
+ return ALLOCMEM_ERROR;
+ }
+
+ m_eCompressMode = m_pQA->print_quality == 1 ? COMPRESS_MODE_LJ : COMPRESS_MODE_JPEG;
+ pModeJpeg->myplane = COLORTYPE_COLOR;
+ m_QTableInfo.qFactor = 6;
+ pModeJpeg->Init(m_pJA->color_mode, MOJAVE_STRIP_HEIGHT, &m_eCompressMode, &m_QTableInfo);
+ head = new Pipeline(pModeJpeg);
+ *pipeline = head;
+ return NO_ERROR;
+}
+
+DRIVER_ERROR LJJetReady::StartPage(JobAttributes *pJA)
+{
+ DRIVER_ERROR err;
+ BYTE JRPaperSizeSeq[] = {0xC0, 0x00, 0xF8, 0x25};
+ BYTE szCustomSize[16];
+ m_iStripHeight = 0;
+ if (m_eCompressMode != COMPRESS_MODE_LJ)
+ m_bSendQTable = true;
+ addToHeader((const BYTE *) JRFeedOrientationSeq, sizeof(JRFeedOrientationSeq));
+ if (pJA->media_attributes.pcl_id == 96) // Custom paper size
+ {
+
+ union
+ {
+ float fValue;
+ uint32_t uiValue;
+ } JRCustomPaperSize;
+ uint32_t uiXsize;
+ uint32_t uiYsize;
+ int k = 0;
+
+ // Physical width and height in inches
+ JRCustomPaperSize.fValue = (float) pJA->media_attributes.physical_width / (float) pJA->quality_attributes.horizontal_resolution;
+ uiXsize = JRCustomPaperSize.uiValue;
+ JRCustomPaperSize.fValue = (float) pJA->media_attributes.physical_height / (float) pJA->quality_attributes.vertical_resolution;;
+ uiYsize = JRCustomPaperSize.uiValue;
+ szCustomSize[k++] = 0xD5;
+ szCustomSize[k++] = (BYTE) (uiXsize & 0x000000FF);
+ szCustomSize[k++] = (BYTE) ((uiXsize & 0x0000FF00) >> 8);
+ szCustomSize[k++] = (BYTE) ((uiXsize & 0x00FF0000) >> 16);
+ szCustomSize[k++] = (BYTE) ((uiXsize & 0xFF000000) >> 24);
+ szCustomSize[k++] = (BYTE) (uiYsize & 0x000000FF);
+ szCustomSize[k++] = (BYTE) ((uiYsize & 0x0000FF00) >> 8);
+ szCustomSize[k++] = (BYTE) ((uiYsize & 0x00FF0000) >> 16);
+ szCustomSize[k++] = (BYTE) ((uiYsize & 0xFF000000) >> 24);
+ addToHeader((const BYTE *) szCustomSize, k);
+ addToHeader(JRCustomPaperSizeSeq, sizeof(JRCustomPaperSizeSeq));
+ }
+ else
+ {
+ JRPaperSizeSeq[1] = pJA->media_attributes.pcl_id;
+ addToHeader((const BYTE *) JRPaperSizeSeq, sizeof(JRPaperSizeSeq));
+ }
+ BYTE szPrintableAreaSeq[] = {0xD1, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x74};
+ int iWidth = pJA->media_attributes.printable_width;
+ int iHeight = pJA->media_attributes.printable_height;
+
+// The minimum printable width is 1600 pixels (3 inch * 600 - 200 for margins)
+ if (iWidth < 1600)
+ {
+ iWidth = 1600;
+ }
+// The source width must be a mutiple of 32
+ iWidth = ((iWidth + 31) / 32) * 32;
+ iHeight = ((iHeight + (MOJAVE_STRIP_HEIGHT - 1)) / MOJAVE_STRIP_HEIGHT) * MOJAVE_STRIP_HEIGHT;
+ szPrintableAreaSeq[1] = (BYTE) (iWidth & 0xFF);
+ szPrintableAreaSeq[2] = (BYTE) ((iWidth >> 8) & 0xFF);
+ szPrintableAreaSeq[3] = (BYTE) (iHeight & 0xFF);
+ szPrintableAreaSeq[4] = (BYTE) ((iHeight >> 8) & 0xFF);
+ addToHeader((const BYTE *) szPrintableAreaSeq, sizeof(szPrintableAreaSeq));
+
+ addToHeader(JRBeginPageSeq, sizeof(JRBeginPageSeq));
+
+// Colormode must be 0 - color and 1 - grayscale
+ BYTE szColorModeSeq[] = {0xC0, 0x06, 0xF8, 0x03, 0x6A};
+ szColorModeSeq[1] += pJA->color_mode;
+ addToHeader((const BYTE *) szColorModeSeq, sizeof(szColorModeSeq));
+ err = Cleanup();
+
+ BYTE szStr[16];
+ addToHeader(JRBeginImageSeq, sizeof(JRBeginImageSeq));
+ szStr[0] = (BYTE) (iWidth & 0xFF);
+ szStr[1] = (BYTE) ((iWidth & 0xFF00) >> 8);
+ szStr[2] = 0xF8;
+ szStr[3] = 0x6C;
+ szStr[4] = 0xC1;
+ szStr[5] = (BYTE) (iHeight & 0xFF);
+ szStr[6] = (BYTE) ((iHeight & 0xFF00) >> 8);
+ szStr[7] = 0xF8;
+ szStr[8] = 0x6B;
+ szStr[9] = 0xC1;
+ addToHeader((const BYTE *) szStr, 10);
+ unsigned int uiStripCount = iHeight / MOJAVE_STRIP_HEIGHT;
+ szStr[0] = (BYTE) (uiStripCount & 0xFF);
+ szStr[1] = (BYTE) ((uiStripCount & 0xFF00) >> 8);
+ szStr[2] = 0xF8;
+ szStr[3] = 0x93;
+ szStr[4] = 0xC1;
+ addToHeader((const BYTE *) szStr, 5);
+ const BYTE szStripHeightSeq[] = {0x80, 0x00, 0xF8, 0x94};
+ addToHeader(szStripHeightSeq, sizeof(szStripHeightSeq));
+ szStr[0] = 0xC0;
+ szStr[1] = 0x00;
+ szStr[2] = 0xF8;
+ szStr[3] = 0x97;
+ if (m_pJA->color_mode == 0)
+ {
+ szStr[1] = 0x04;
+ }
+ addToHeader((const BYTE *) szStr, 4);
+// Interleaved Color Enumeration sequence
+ addToHeader(JRICESeq, sizeof(JRICESeq));
+ addToHeader(JRVueVersionTagSeq, sizeof(JRVueVersionTagSeq));
+ BYTE szDataLengthSeq[] = {0xC2, 0x38, 0x03, 0x00, 0x00, 0xF8, 0x92, 0x46};
+ if (m_eCompressMode == COMPRESS_MODE_LJ)
+ {
+ szDataLengthSeq[1] = 0;
+ szDataLengthSeq[2] = 0;
+ }
+ addToHeader(szDataLengthSeq, sizeof(szDataLengthSeq));
+ err = Cleanup();
+ return err;
+}
+
+DRIVER_ERROR LJJetReady::FormFeed()
+{
+ DRIVER_ERROR err;
+ addToHeader(JRVueExtn3Seq, sizeof(JRVueExtn3Seq));
+ addToHeader(JRVueVersionTagSeq, sizeof(JRVueVersionTagSeq));
+ addToHeader(JRVendorUniqueSeq, sizeof(JRVendorUniqueSeq));
+ addToHeader(JREndPageSeq, sizeof(JREndPageSeq));
+ err = Cleanup();
+ return err;
+}
+
+DRIVER_ERROR LJJetReady::EndJob()
+{
+ DRIVER_ERROR err;
+ addToHeader(JREndSessionSeq, sizeof(JREndSessionSeq));
+ addToHeader((const BYTE *) PJLExit, strlen(PJLExit));
+ err = Cleanup();
+ return err;
+}
+
+DRIVER_ERROR LJJetReady::Encapsulate(RASTERDATA *InputRaster, bool bLastPlane)
+{
+ DRIVER_ERROR err;
+ int iJpegHeaderSize = 623;
+ unsigned int ulVuDataLength;
+ BYTE *pDataPtr;
+
+ if (m_eCompressMode != COMPRESS_MODE_LJ)
+ {
+ err = sendJPEGHeaderInfo(InputRaster);
+ }
+
+ if (m_pJA->color_mode != 0 || m_eCompressMode == COMPRESS_MODE_LJ)
+ iJpegHeaderSize = 0;
+
+ if (InputRaster->rasterdata[COLORTYPE_COLOR] == NULL)
+ {
+ return NO_ERROR;
+ }
+
+ ulVuDataLength = InputRaster->rastersize[COLORTYPE_COLOR] - iJpegHeaderSize;
+ pDataPtr = InputRaster->rasterdata[COLORTYPE_COLOR] + iJpegHeaderSize;
+ BYTE szStr[16];
+ szStr[0] = m_iStripHeight & 0xFF;
+ szStr[1] = (m_iStripHeight & 0xFF00) >> 8;
+ m_iStripHeight += MOJAVE_STRIP_HEIGHT;
+ addToHeader(JRReadImageSeq, sizeof(JRReadImageSeq));
+ addToHeader(szStr, 2);
+ addToHeader(JRStripHeightSeq, sizeof(JRStripHeightSeq));
+ addToHeader(JRTextObjectTypeSeq, sizeof(JRTextObjectTypeSeq));
+ addToHeader(JRVueVersionTagSeq, sizeof(JRVueVersionTagSeq));
+ int i = 0;
+ szStr[i++] = 0xC2;
+ ulVuDataLength += 6;
+ szStr[i++] = (BYTE) (ulVuDataLength & 0xFF);
+ szStr[i++] = (BYTE) ((ulVuDataLength & 0x0000FF00) >> 8);
+ szStr[i++] = (BYTE) ((ulVuDataLength & 0x00FF0000) >> 16);
+ szStr[i++] = (BYTE) ((ulVuDataLength & 0xFF000000) >> 24);
+ szStr[i++] = 0xF8;
+ szStr[i++] = 0x92;
+ szStr[i++] = 0x46;
+ if (m_eCompressMode == COMPRESS_MODE_LJ)
+ szStr[i++] = 0x11;
+ else
+ szStr[i++] = 0x21;
+ szStr[i++] = 0x90;
+ ulVuDataLength -= 6;
+ szStr[i++] = (BYTE) (ulVuDataLength & 0xFF);
+ szStr[i++] = (BYTE) ((ulVuDataLength & 0x0000FF00) >> 8);
+ szStr[i++] = (BYTE) ((ulVuDataLength & 0x00FF0000) >> 16);
+ szStr[i++] = (BYTE) ((ulVuDataLength & 0xFF000000) >> 24);
+ addToHeader((const BYTE *) szStr, i);
+ err = Cleanup();
+ if (err == NO_ERROR)
+ err = sendBuffer((const BYTE *) pDataPtr, ulVuDataLength);
+ return err;
+}
+
+void LJJetReady::addQTable(DWORD *qtable)
+{
+ for (int i = 0; i < QTABLE_SIZE; i++)
+ {
+ *cur_pcl_buffer_ptr++ = (BYTE) (qtable[i] & 0xFF);
+ *cur_pcl_buffer_ptr++ = (BYTE) ((qtable[i] >> 8) & 0xFF);
+ *cur_pcl_buffer_ptr++ = 0;
+ *cur_pcl_buffer_ptr++ = 0;
+ }
+}
+
+DRIVER_ERROR LJJetReady::sendJPEGHeaderInfo(RASTERDATA *InputRaster)
+{
+ DRIVER_ERROR err;
+ if (!m_bSendQTable)
+ {
+ return NO_ERROR;
+ }
+ union
+ {
+ short s;
+ BYTE c[2];
+ } endianness;
+ endianness.s = 0x0A0B;
+ err = sendBuffer(JRQTSeq, sizeof(JRQTSeq));
+ if (endianness.c[0] == 0x0B)
+ {
+ err = sendBuffer((const BYTE *) &m_QTableInfo, sizeof(DWORD) * QTABLE_SIZE * 3);
+ }
+ else
+ {
+ addQTable(m_QTableInfo.qtable0);
+ addQTable(m_QTableInfo.qtable1);
+ addQTable(m_QTableInfo.qtable2);
+ err = Cleanup();
+ }
+ m_bSendQTable = false;
+ addToHeader(JRCRSeq, sizeof(JRCRSeq));
+ BYTE szCR3Seq[] = {0x00, 0x00, 0x00, 0x00};
+ if (m_pJA->color_mode != 0)
+ {
+ addToHeader(JRCR1GSeq, sizeof(JRCR1GSeq));
+ }
+ else
+ {
+ addToHeader(JRCR1CSeq, sizeof(JRCR1CSeq));
+ szCR3Seq[0] = 0x01;
+ }
+ addToHeader(szCR3Seq, sizeof(szCR3Seq));
+ for (int i = 0; i < 9; i++)
+ {
+ addToHeader(JRSCSeq[i], 4);
+ }
+ err = Cleanup();
+ return err;
+}
+
diff --git a/prnt/hpcups/LJJetReady.h b/prnt/hpcups/LJJetReady.h
new file mode 100644
index 0000000..2401303
--- /dev/null
+++ b/prnt/hpcups/LJJetReady.h
@@ -0,0 +1,67 @@
+/*****************************************************************************\
+ LJJetReady.h : Interface for LJJetReady class
+
+ Copyright (c) 1996 - 2009, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+#ifndef LJJETREADY_H
+#define LJJETREADY_H
+
+#include "CommonDefinitions.h"
+#include "Pipeline.h"
+#include "Encapsulator.h"
+
+class Halftoner;
+
+class LJJetReady: public Encapsulator
+{
+public:
+ LJJetReady();
+ ~LJJetReady();
+ DRIVER_ERROR Encapsulate (RASTERDATA *InputRaster, bool bLastPlane);
+ DRIVER_ERROR StartPage(JobAttributes *pJA);
+ DRIVER_ERROR Configure(Pipeline **pipeline);
+ DRIVER_ERROR FormFeed ();
+ DRIVER_ERROR SendCAPy (int iOffset) {return NO_ERROR;}
+ DRIVER_ERROR EndJob();
+ bool CanSkipRasters() {return false;}
+ bool UnpackBits() {return false;}
+ void CancelJob() {}
+protected:
+ virtual DRIVER_ERROR addJobSettings();
+ virtual DRIVER_ERROR flushPrinterBuffer() {return NO_ERROR;}
+private:
+ void addQTable(DWORD *qtable);
+ DRIVER_ERROR sendJPEGHeaderInfo(RASTERDATA *InputRaster);
+ bool m_bSendQTable;
+ int m_iStripHeight;
+ COMPRESS_MODE m_eCompressMode;
+ QTableInfo m_QTableInfo;
+};
+
+#endif // LJJETREADY_H
+
diff --git a/prnt/hpcups/LJMono.cpp b/prnt/hpcups/LJMono.cpp
new file mode 100644
index 0000000..b6aebd4
--- /dev/null
+++ b/prnt/hpcups/LJMono.cpp
@@ -0,0 +1,172 @@
+/*****************************************************************************\
+ LJMono.cpp : Implementation of LJMono class
+
+ Copyright (c) 1996 - 2009, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+#include "CommonDefinitions.h"
+#include "LJMono.h"
+#include "ColorMatcher.h"
+#include "Halftoner.h"
+#include "Mode2.h"
+#include "resources.h"
+#include "ColorMaps.h"
+#include "PrinterCommands.h"
+
+LJMono::LJMono() : Encapsulator()
+{
+ memset(&m_PM, 0, sizeof(m_PM));
+ strcpy(m_szLanguage, "PCL");
+}
+
+LJMono::~LJMono()
+{
+}
+
+DRIVER_ERROR LJMono::addJobSettings()
+{
+ cur_pcl_buffer_ptr += sprintf((char *) cur_pcl_buffer_ptr,
+ "@PJL SET PAGEPROTECT=AUTO\012@PJL SET RESOLUTION=%d\012@PJL SET DENSITY=5\012", m_pQA->horizontal_resolution);
+ if (m_pQA->print_quality == -1)
+ {
+ cur_pcl_buffer_ptr += sprintf((char *) cur_pcl_buffer_ptr,
+ "@PJL SET RET=OFF\012@PJL SET ECONOMODE=ON\012");
+ }
+ if (m_pJA->e_duplex_mode != DUPLEXMODE_NONE)
+ {
+ cur_pcl_buffer_ptr += sprintf((char *) cur_pcl_buffer_ptr,
+ "@PJL SET DUPLEX=ON\012@PJL SET BINDING=%s\012",
+ (m_pJA->e_duplex_mode == DUPLEXMODE_BOOK) ? "LONGEDGE" :
+ "SHORTEDGE");
+ }
+ else
+ {
+ addToHeader("@PJL SET DUPLEX=OFF\012", 19);
+ }
+ cur_pcl_buffer_ptr += sprintf((char *) cur_pcl_buffer_ptr, "@PJL ENTER LANGUAGE=%s\012", m_szLanguage);
+ sendJobHeader();
+ DRIVER_ERROR err = Cleanup();
+ return err;
+}
+
+DRIVER_ERROR LJMono::Configure(Pipeline **pipeline)
+{
+ Pipeline *p = NULL;
+ Pipeline *head;
+ unsigned int width;
+ ColorMatcher *pColorMatcher;
+ Mode2 *pMode2;
+ int iRows[MAXCOLORPLANES];
+ unsigned int uiResBoost;
+ head = *pipeline;
+
+/*
+ * I need a flag in the printmode structure to whether create a CMYGraymap
+ * and set the ulMap1 to it.
+ */
+
+ m_PM.dyeCount = 1;
+ m_PM.ColorDepth[0] = 1;
+ m_PM.cmap.ulMap1 = ulMapDJ600_CCM_K;
+ m_PM.BaseResX = m_pQA->horizontal_resolution;
+ m_PM.BaseResY = m_pQA->vertical_resolution;
+ m_PM.eHT = FED;
+ m_PM.BlackFEDTable = HTBinary_open;
+ m_PM.ColorFEDTable = HTBinary_open;
+ m_PM.MixedRes = false;
+
+ for (int i = 0; i < MAXCOLORPLANES; i++)
+ {
+ m_PM.ResolutionX[i] = m_pQA->horizontal_resolution;
+ m_PM.ResolutionY[i] = m_pQA->vertical_resolution;
+ iRows[i] = m_PM.ResolutionX[i] / m_PM.BaseResX;
+ }
+ uiResBoost = m_PM.BaseResX / m_PM.BaseResY;
+ if (uiResBoost == 0)
+ uiResBoost = 1;
+
+ width = m_pMA->printable_width;
+// unsigned int SeedBufferSize = m_pMA->printable_width * 3;
+
+ pColorMatcher = new ColorMatcher(m_PM.cmap, m_PM.dyeCount, width);
+ head = new Pipeline(pColorMatcher);
+ m_pHalftoner = new Halftoner (&m_PM, width, iRows, uiResBoost, m_PM.eHT == MATRIX);
+ p = new Pipeline(m_pHalftoner);
+ head->AddPhase(p);
+ pMode2 = new Mode2(width);
+ p = new Pipeline(pMode2);
+ head->AddPhase(p);
+ pMode2->myplane = COLORTYPE_COLOR;
+
+ *pipeline = head;
+ return NO_ERROR;
+}
+
+DRIVER_ERROR LJMono::StartPage(JobAttributes *pJA)
+{
+ m_pJA = pJA;
+ m_pMA = &pJA->media_attributes;
+ m_pQA = &pJA->quality_attributes;
+ page_number++;
+ return NO_ERROR;
+}
+
+DRIVER_ERROR LJMono::FormFeed()
+{
+ DRIVER_ERROR err;
+ err = Cleanup();
+ err = m_pSystemServices->Send((const BYTE *) "\x0C", 1);
+ return err;
+}
+
+DRIVER_ERROR LJMono::EndJob()
+{
+ DRIVER_ERROR err = NO_ERROR;
+ err = Cleanup();
+ err = m_pSystemServices->Send((const BYTE *) "\x1B*rC", 4);
+ err = m_pSystemServices->Send(Reset, sizeof(Reset));
+ if (err == NO_ERROR)
+ err = m_pSystemServices->Send(UEL, sizeof(UEL));
+ return err;
+}
+
+DRIVER_ERROR LJMono::Encapsulate(RASTERDATA *InputRaster, bool bLastPlane)
+{
+ DRIVER_ERROR err = NO_ERROR;
+ char tmpStr[16];
+ int iLen;
+ BYTE c = m_pHalftoner->LastPlane() ? 'W' : 'V';
+ iLen = sprintf (tmpStr, "\x1b*b%u%c", InputRaster->rastersize[COLORTYPE_COLOR], c);
+ err = this->Send((const BYTE *) tmpStr, iLen);
+ if (err == NO_ERROR && InputRaster->rastersize[COLORTYPE_COLOR] > 0)
+ {
+ err = this->Send(InputRaster->rasterdata[COLORTYPE_COLOR],
+ InputRaster->rastersize[COLORTYPE_COLOR]);
+ }
+ return err;
+}
+
diff --git a/prnt/hpcups/LJMono.h b/prnt/hpcups/LJMono.h
new file mode 100644
index 0000000..a040110
--- /dev/null
+++ b/prnt/hpcups/LJMono.h
@@ -0,0 +1,59 @@
+/*****************************************************************************\
+ LJMono.h : Interface for LJMono class
+
+ Copyright (c) 1996 - 2009, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+#ifndef LJMONO_H
+#define LJMONO_H
+
+#include "CommonDefinitions.h"
+#include "Pipeline.h"
+#include "Encapsulator.h"
+
+class Halftoner;
+
+class LJMono: public Encapsulator
+{
+public:
+ LJMono();
+ ~LJMono();
+ DRIVER_ERROR Encapsulate (RASTERDATA *InputRaster, bool bLastPlane);
+ DRIVER_ERROR StartPage(JobAttributes *pJA);
+ DRIVER_ERROR Configure(Pipeline **pipeline);
+ DRIVER_ERROR EndJob();
+ DRIVER_ERROR FormFeed();
+protected:
+ virtual DRIVER_ERROR addJobSettings();
+ DRIVER_ERROR flushPrinterBuffer() {return NO_ERROR;}
+private:
+ Halftoner *m_pHalftoner;
+ PrintMode m_PM;
+};
+
+#endif // LJMONO_H
+
diff --git a/prnt/hpcups/LJZjStream.cpp b/prnt/hpcups/LJZjStream.cpp
new file mode 100644
index 0000000..35f0cd7
--- /dev/null
+++ b/prnt/hpcups/LJZjStream.cpp
@@ -0,0 +1,841 @@
+/*****************************************************************************\
+ LJZjStream.cpp : Implementation for the LJZjStream class
+
+ Copyright (c) 1996 - 2009, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ Author: Naga Samrat Chowdary Narla,
+\*****************************************************************************/
+
+#include "CommonDefinitions.h"
+#include "Pipeline.h"
+#include "Encapsulator.h"
+#include "ColorMatcher.h"
+#include "Halftoner.h"
+#include "ModeJbig.h"
+#include "resources.h"
+#include "ColorMaps.h"
+#include "PrinterCommands.h"
+#include "LJZjStream.h"
+#include "Utils.h"
+#include "hpjbig_wrapper.h"
+
+#define ZJC_BAND_HEIGHT 100
+
+LJZjStream::LJZjStream () : Encapsulator ()
+{
+ memset(&m_PM, 0, sizeof(m_PM));
+ strcpy(m_szLanguage, "ZJS");
+ m_pModeJbig = NULL;
+ m_bNotSent = true;
+}
+
+LJZjStream::~LJZjStream()
+{
+}
+
+DRIVER_ERROR LJZjStream::addJobSettings()
+{
+ BYTE cItems[3] = {ZJI_DMCOLLATE, ZJI_PAGECOUNT, ZJI_DMDUPLEX};
+ int nItems = 0;
+ addToHeader("%s", "@PJL ENTER LANGUAGE=ZJS\x0AJZJZ");
+ BYTE *p = cur_pcl_buffer_ptr;
+
+ if (m_pJA->e_duplex_mode == DUPLEXMODE_NONE)
+ {
+ p[3] = 52;
+ p[7] = ZJT_START_DOC;
+ p[11] = 3;
+ p[13] = 36 ;
+ nItems = 3;
+ }
+ else
+ {
+ p[3] = 28;
+ p[7] = ZJT_START_DOC;
+ p[11] = 1;
+ p[13] = 12;
+ nItems = 1;
+ }
+
+ p[14] = 'Z';
+ p[15] = 'Z';
+ int i = 16;
+ for (int j = 0; j < nItems; j++)
+ {
+ p[i + 3] = 12;
+ p[i + 5] = cItems[j];
+ p[i + 6] = ZJIT_UINT32;
+ p[i + 11] = j / 2;
+ i += 12;
+ }
+ cur_pcl_buffer_ptr += i;
+ DRIVER_ERROR err = Cleanup();
+ return err;
+}
+
+DRIVER_ERROR LJZjStream::Configure(Pipeline **pipeline)
+{
+ DRIVER_ERROR err;
+ Pipeline *p = NULL;
+ Pipeline *head;
+ unsigned int width;
+ ColorMatcher *pColorMatcher;
+ Halftoner *pHalftoner;
+ int iRows[MAXCOLORPLANES];
+ unsigned int uiResBoost;
+ head = *pipeline;
+
+/*
+ * I need a flag in the printmode structure to whether create a CMYGraymap
+ * and set the ulMap1 to it.
+ */
+
+ m_PM.BaseResX = m_pQA->horizontal_resolution;
+ m_PM.BaseResY = m_pQA->vertical_resolution;
+ m_PM.eHT = FED;
+ m_PM.MixedRes = false;
+ m_PM.BlackFEDTable = HTBinary_open;
+ if (m_pJA->color_mode == 0)
+ {
+ m_PM.cmap.ulMap1 = NULL;
+ m_PM.cmap.ulMap2 = NULL;
+ m_PM.cmap.ulMap3 = ucMapDJ4100_KCMY_Photo_BestA_12x12x1;
+ m_PM.dyeCount = 4;
+ m_PM.ColorFEDTable = HT1200x1200x1PhotoBest_open;
+ }
+ else
+ {
+ m_PM.cmap.ulMap1 = ulMapDJ600_CCM_K;
+ m_PM.dyeCount = 1;
+ m_PM.ColorFEDTable = HTBinary_open;
+ }
+
+ for (int i = 0; i < MAXCOLORPLANES; i++)
+ {
+ m_PM.ColorDepth[i] = 1;
+ m_PM.ResolutionX[i] = m_pQA->horizontal_resolution;
+ m_PM.ResolutionY[i] = m_pQA->vertical_resolution;
+ iRows[i] = m_PM.ResolutionX[i] / m_PM.BaseResX;
+ }
+
+ uiResBoost = m_PM.BaseResX / m_PM.BaseResY;
+ if (uiResBoost == 0)
+ uiResBoost = 1;
+
+ width = m_pMA->printable_width;
+
+ pColorMatcher = new ColorMatcher(m_PM.cmap, m_PM.dyeCount, width);
+ head = new Pipeline(pColorMatcher);
+ pHalftoner = new Halftoner (&m_PM, width, iRows, uiResBoost, m_PM.eHT == MATRIX);
+ p = new Pipeline(pHalftoner);
+ head->AddPhase(p);
+ m_pModeJbig = new ModeJbig(width);
+ p = new Pipeline(m_pModeJbig);
+ head->AddPhase(p);
+ m_pModeJbig->myplane = COLORTYPE_COLOR;
+
+ m_iPlanes = 1;
+ m_iBpp = 1;
+ int height = m_pMA->printable_height;
+ ZJPLATFORM ezj_platform = ZJSTREAM;
+ if (!strcmp(m_pJA->printer_platform, "ljzjscolor"))
+ {
+ m_iBpp = 2;
+ ezj_platform = ZJCOLOR;
+ if (m_pJA->color_mode == 0)
+ {
+ m_iPlanes = 4;
+ }
+ height = ZJC_BAND_HEIGHT;
+
+ if(m_pJA->printer_platform_version == 2)
+ {
+ height = m_pMA->printable_height;
+ ezj_platform = ZJCOLOR2;
+ }
+ }
+ err = m_pModeJbig->Init(height, m_iPlanes, m_iBpp, ezj_platform);
+
+ *pipeline = head;
+ return err;
+}
+
+DRIVER_ERROR LJZjStream::StartPage_ljzjcolor2 (JobAttributes *pJA)
+{
+ DWORD dwNumItems = 13;
+ BYTE szStr[16 + 12 * 13];
+ int i=0;
+
+ i = SendChunkHeader (szStr, 16 + dwNumItems * 12, ZJT_START_PAGE, dwNumItems);
+ i += SendItem (szStr+i, ZJIT_UINT32, ZJI_PLANE, m_iPlanes);
+ i += SendItem (szStr+i, ZJIT_UINT32, ZJI_DMPAPER, m_pMA->pcl_id);
+ i += SendItem (szStr+i, ZJIT_UINT32, ZJI_DMCOPIES, 1);
+ i += SendItem (szStr+i, ZJIT_UINT32, ZJI_DMDEFAULTSOURCE, m_pJA->media_source);
+ i += SendItem (szStr+i, ZJIT_UINT32, ZJI_DMMEDIATYPE, m_pQA->media_type);
+ i += SendItem (szStr+i, ZJIT_UINT32, ZJI_NBIE, m_iPlanes);
+ i += SendItem (szStr+i, ZJIT_UINT32, ZJI_RESOLUTION_X, m_pQA->horizontal_resolution);
+ i += SendItem (szStr+i, ZJIT_UINT32, ZJI_RESOLUTION_Y, m_pQA->vertical_resolution);
+ i += SendItem (szStr+i, ZJIT_UINT32, ZJI_RASTER_X, (((m_pMA->printable_width + 31) / 32) * 32) * m_iBpp);
+ i += SendItem (szStr+i, ZJIT_UINT32, ZJI_RASTER_Y, m_pMA->printable_height);
+ i += SendItem (szStr+i, ZJIT_UINT32, ZJI_VIDEO_BPP, m_iBpp);
+ i += SendItem (szStr+i, ZJIT_UINT32, ZJI_VIDEO_X, (((m_pMA->printable_width + 31) / 32) * 32));
+ i += SendItem (szStr+i, ZJIT_UINT32, ZJI_VIDEO_Y, m_pMA->printable_height);
+ return Send ((const BYTE *) szStr, i);
+}
+
+DRIVER_ERROR LJZjStream::StartPage (JobAttributes *pJA)
+{
+ DRIVER_ERROR err = NO_ERROR;
+ DWORD dwNumItems = 15;
+ BYTE szStr[16 + 16 * 12];
+ int i;
+ int width;
+
+ m_iPlaneNumber = 0;
+ m_iCurRaster = 0;
+ if((strcmp(m_pJA->printer_platform, "ljzjscolor") == 0) && (m_pJA->printer_platform_version == 2))
+ {
+ return StartPage_ljzjcolor2(pJA);
+ }
+
+
+ if (m_pJA->e_duplex_mode == DUPLEXMODE_NONE)
+ {
+ dwNumItems = 14;
+ }
+ else
+ {
+ dwNumItems = 15;
+ }
+
+ width = ((m_pMA->printable_width + 31) / 32) * 32;
+ if (m_pJA->color_mode == 0)
+ dwNumItems++;
+
+ i = 0;
+ i += SendChunkHeader (szStr, 16 + dwNumItems * 12, ZJT_START_PAGE, dwNumItems);
+ if (m_pJA->color_mode == 0)
+ {
+ i += SendItem (szStr+i, ZJIT_UINT32, ZJI_PLANE, m_iPlanes);
+ }
+
+ i += SendItem (szStr+i, ZJIT_UINT32, ZJI_DMCOPIES, 1);
+
+ // Job is duplex
+ if (m_pJA->e_duplex_mode != DUPLEXMODE_NONE)
+ {
+ // Long edge
+ if (m_pJA->e_duplex_mode == DUPLEXMODE_BOOK)
+ {
+ i += SendItem (szStr+i, ZJIT_UINT32, ZJI_DMDUPLEX, 2);
+ }
+ // short edge
+ else
+ {
+ i += SendItem (szStr+i, ZJIT_UINT32, ZJI_DMDUPLEX, 3);
+ }
+ }
+
+ i += SendItem (szStr+i, ZJIT_UINT32, ZJI_DMMEDIATYPE, m_pQA->media_type);
+ i += SendItem (szStr+i, ZJIT_UINT32, ZJI_DMPAPER, m_pMA->pcl_id);
+ i += SendItem (szStr+i, ZJIT_UINT32, ZJI_DMDEFAULTSOURCE, m_pJA->media_source);
+ i += SendItem (szStr+i, ZJIT_UINT32, ZJI_NBIE, m_iPlanes);
+ i += SendItem (szStr+i, ZJIT_UINT32, ZJI_RESOLUTION_X, m_pQA->horizontal_resolution);
+ i += SendItem (szStr+i, ZJIT_UINT32, ZJI_RESOLUTION_Y, m_pQA->vertical_resolution);
+ i += SendItem (szStr+i, ZJIT_UINT32, ZJI_RASTER_X, width * m_iBpp);
+ i += SendItem (szStr+i, ZJIT_UINT32, ZJI_RASTER_Y, m_pMA->printable_height);
+ i += SendItem (szStr+i, ZJIT_UINT32, ZJI_VIDEO_BPP, m_iBpp);
+ i += SendItem (szStr+i, ZJIT_UINT32, ZJI_VIDEO_X, width);
+ i += SendItem (szStr+i, ZJIT_UINT32, ZJI_VIDEO_Y, m_pMA->printable_height);
+ i += SendItem (szStr+i, ZJIT_UINT32, ZJI_RET, RET_ON);
+ i += SendItem (szStr+i, ZJIT_UINT32, ZJI_TONER_SAVE, (m_pQA->print_quality == -1) ? 1 : 0);
+
+ err = sendBuffer ((const BYTE *) szStr, i);
+ return err;
+}
+
+DRIVER_ERROR LJZjStream::sendBlankBands()
+{
+ if (strcmp(m_pJA->printer_platform, "ljzjscolor"))
+ {
+ return NO_ERROR;
+ }
+ if(m_pJA->printer_platform_version == 2)
+ {
+ return NO_ERROR;
+ }
+ DRIVER_ERROR err = NO_ERROR;
+ int remaining_rasters = m_pMA->printable_height - m_iCurRaster;
+ int num_planes = (m_pJA->color_mode == 0) ? 4 : 1;
+ if (remaining_rasters <= 0)
+ {
+ return NO_ERROR;
+ }
+
+ RASTERDATA raster_data;
+ if (remaining_rasters < ZJC_BAND_HEIGHT)
+ {
+ memset(&raster_data, 0, sizeof(raster_data));
+ m_pModeJbig->SetBandHeight(remaining_rasters);
+ for (int k = 0; k < num_planes; k++)
+ {
+ m_pModeJbig->Flush();
+ m_pModeJbig->NextOutputRaster(raster_data);
+ err = Encapsulate(&raster_data, true);
+ if (err != NO_ERROR)
+ return err;
+ }
+ m_pModeJbig->SetBandHeight(ZJC_BAND_HEIGHT);
+ return err;
+ }
+
+ memset(&raster_data, 0, sizeof(raster_data));
+ m_pModeJbig->Process(&raster_data);
+ m_pModeJbig->Flush();
+ m_pModeJbig->NextOutputRaster(raster_data);
+ while (remaining_rasters > 0)
+ {
+ for (int k = 0; k < num_planes; k++)
+ {
+ err = Encapsulate(&raster_data, true);
+ if (err != NO_ERROR)
+ {
+ return err;
+ }
+ }
+ remaining_rasters -= ZJC_BAND_HEIGHT;
+ }
+ if (remaining_rasters <= 0)
+ {
+ return NO_ERROR;
+ }
+
+ memset(&raster_data, 0, sizeof(raster_data));
+ m_pModeJbig->SetBandHeight(remaining_rasters);
+ m_pModeJbig->Process(&raster_data);
+ m_pModeJbig->Flush();
+ m_pModeJbig->NextOutputRaster(raster_data);
+ for (int k = 0; k < num_planes; k++)
+ {
+ err = Encapsulate(&raster_data, true);
+ }
+ m_pModeJbig->SetBandHeight(ZJC_BAND_HEIGHT);
+
+ return err;
+}
+
+DRIVER_ERROR LJZjStream::FormFeed ()
+{
+ DRIVER_ERROR err = NO_ERROR;
+ BYTE szStr[128];
+ int size = 16;
+
+ err = sendBlankBands();
+ if (err != NO_ERROR)
+ return err;
+
+ if(((strcmp(m_pJA->printer_platform, "ljzjscolor") == 0) && (m_pJA->printer_platform_version == 2)) == 0)
+ {
+ SendChunkHeader (szStr, 16, ZJT_END_PAGE, 0);
+ }
+
+ if (!strcmp(m_pJA->printer_platform, "ljzjscolor"))
+ {
+ int i = 0;
+ int iCol = (m_pJA->color_mode == 0) ? 1 : 0;
+
+ memset(szStr, 0, sizeof(szStr));
+ i = SendChunkHeader (szStr, 112, ZJT_END_PAGE, 8);
+ for (int j = 0; j < 8; j++)
+ {
+ i += SendItem (szStr+i, ZJIT_UINT32, 0x8200+j, (j % 4 == 3) ? 1 : iCol);
+ }
+ size = 112;
+ if(m_pJA->printer_platform_version == 2)
+ {
+ return Send ((const BYTE *) szStr, size);
+ }
+ }
+
+ err = sendBuffer ((const BYTE *) szStr, size);
+
+ return err;
+}
+
+DRIVER_ERROR LJZjStream::EndJob()
+{
+ BYTE szStr[16];
+ memset(szStr, 0, sizeof(szStr));
+ szStr[3] = 16;
+ szStr[7] = ZJT_END_DOC;
+ szStr[14] = 'Z';
+ szStr[15] = 'Z';
+ return this->sendBuffer((const BYTE *) szStr, 16);
+}
+
+DRIVER_ERROR LJZjStream::Encapsulate (RASTERDATA *raster, bool bLastPlane)
+{
+if (raster->rasterdata[COLORTYPE_COLOR] == NULL || raster->rastersize[COLORTYPE_COLOR] == 0)
+{
+ return NO_ERROR;
+}
+ if (!strcmp(m_pJA->printer_platform, "ljzjscolor"))
+ {
+ return encapsulateColor(raster);
+ }
+
+ DRIVER_ERROR err = NO_ERROR;
+ BYTE szStr[36];
+ int i = 0;
+ int iTotalSize = raster->rastersize[COLORTYPE_COLOR];
+
+ /* Send JBIG header info */
+
+ i = SendChunkHeader (szStr, 36, ZJT_JBIG_BIH, 0);
+
+ memcpy (szStr + 16, raster->rasterdata[COLORTYPE_COLOR], 20);
+ err = sendBuffer ((const BYTE *) szStr, 36);
+ ERRCHECK;
+
+ iTotalSize -= 20;
+ int iPadCount = 0;
+ if (iTotalSize % 16)
+ {
+ iPadCount = ((iTotalSize / 16 + 1) * 16) - iTotalSize;
+ }
+ int dwTotal = iTotalSize;
+ BYTE *p = raster->rasterdata[COLORTYPE_COLOR] + 20;
+ i = dwTotal / 65536;
+
+ for (int j = 0; j < i; j++)
+ {
+ SendChunkHeader (szStr, 16 + 65536, ZJT_JBIG_HID, 0);
+ err = sendBuffer ((const BYTE *) szStr, 16);
+ ERRCHECK;
+ err = sendBuffer ((const BYTE *) p, 65536);
+ ERRCHECK;
+ dwTotal -= 65536;
+ p += 65536;
+ }
+ i = SendChunkHeader (szStr, 16 + dwTotal + iPadCount, ZJT_JBIG_HID, 0);
+ err = sendBuffer ((const BYTE *) szStr, 16);
+ ERRCHECK;
+ err = sendBuffer ((const BYTE *) p, dwTotal);
+ ERRCHECK;
+ if (iPadCount != 0)
+ {
+ memset (szStr, 0, iPadCount);
+ err = sendBuffer ((const BYTE *) szStr, iPadCount);
+ }
+ i = SendChunkHeader (szStr, 16, ZJT_END_JBIG, 0);
+ if (err == NO_ERROR)
+ err = sendBuffer ((const BYTE *) szStr, 16);
+ err = Cleanup();
+ return err;
+}
+
+DRIVER_ERROR LJZjStream::encapsulateColor2 (RASTERDATA *raster)
+{
+ DRIVER_ERROR err = NO_ERROR;
+ BYTE szStr[256];
+ int i = 0;
+ int plane[] = {3, 2, 1, 4};
+
+ if (m_pJA->color_mode == 0)
+ {
+ i = SendChunkHeader (szStr, 28, ZJT_START_PLANE, 1);
+ i += SendItem (szStr+i, ZJIT_UINT32, ZJI_PLANE, plane[m_iPlaneNumber]);
+ err = Send ((const BYTE *) szStr, i);
+ }
+
+ i=0;
+ i += SendChunkHeader (szStr+i, 36, ZJT_JBIG_BIH, 0);
+ err = Send ((const BYTE *) szStr, i);
+ err = Send ((const BYTE *) raster->rasterdata[COLORTYPE_COLOR], 20);
+
+ BYTE *p = raster->rasterdata[COLORTYPE_COLOR] + 20;
+
+ DWORD dwTotalSize = raster->rastersize[COLORTYPE_COLOR];
+ dwTotalSize -= 20;
+ int iPadCount = 0;
+
+ i = 0;
+ if (dwTotalSize % 4)
+ {
+ iPadCount = ((dwTotalSize / 4 + 1) * 4) - dwTotalSize;
+ }
+
+ DWORD dwMaxChunkSize = 0x10000;
+ DWORD dwCurrentChunkSize = 0;
+ bool bLastChunk = false;
+
+ for(DWORD dwLoopCount = 0; dwLoopCount < dwTotalSize ; dwLoopCount +=dwMaxChunkSize)
+ {
+ memset (szStr, 0, sizeof(szStr));
+ dwCurrentChunkSize = dwMaxChunkSize;
+
+ if(dwLoopCount + dwCurrentChunkSize > dwTotalSize)
+ {
+ dwCurrentChunkSize = dwTotalSize - (dwLoopCount);
+ bLastChunk = true;
+ }
+ if (!bLastChunk)
+ {
+ i = SendChunkHeader (szStr, dwCurrentChunkSize + 16, ZJT_JBIG_HID, 0);
+ }
+ else
+ {
+ i = SendChunkHeader (szStr, dwCurrentChunkSize + 16 + iPadCount, ZJT_JBIG_HID, 0);
+ }
+ err = Send ((const BYTE *) szStr, i);
+ err = Send ((const BYTE *) p, dwCurrentChunkSize);
+ p += dwCurrentChunkSize;
+ }
+ if(iPadCount != 0)
+ {
+ memset (szStr, 0, iPadCount);
+ err = Send ((const BYTE *) szStr, iPadCount);
+ }
+
+ i=0;
+ memset (szStr, 0, sizeof(szStr));
+ i = SendChunkHeader (szStr, 16, ZJT_END_JBIG, 0);
+ if (m_pJA->color_mode == 0)
+ {
+ i += SendChunkHeader (szStr+i, 28, ZJT_END_PLANE, 1);
+ i += SendItem (szStr+i, ZJIT_UINT32, ZJI_PLANE, plane[m_iPlaneNumber]);
+ }
+ err = Send ((const BYTE *) szStr, i);
+
+ if (m_pJA->color_mode == 0)
+ {
+ m_iPlaneNumber++;
+ if (m_iPlaneNumber == 4) m_iPlaneNumber = 0;
+ }
+ return err;
+}
+
+DRIVER_ERROR LJZjStream::encapsulateColor (RASTERDATA *raster)
+{
+ bool bLastStride = true;
+ int kEnd = 2;
+ DRIVER_ERROR err = NO_ERROR;
+ BYTE szStr[256];
+ int i = 0;
+
+ if (m_pJA->printer_platform_version == 2)
+ {
+ return encapsulateColor2(raster);
+ }
+
+ HPLJZjsJbgEncSt *se = (HPLJZjsJbgEncSt *) (raster->rasterdata[COLORTYPE_COLOR] + raster->rastersize[COLORTYPE_COLOR]);
+
+ if (m_pJA->color_mode == 0)
+ {
+ kEnd = 5;
+ }
+ if (m_iPlaneNumber == 0 || m_pJA->color_mode != 0)
+ m_iCurRaster += se->yd;
+ if (m_iCurRaster < m_pMA->printable_height)
+ {
+ bLastStride = false;
+ }
+
+
+/*
+ * Send JBIG header info
+ */
+
+ // Send out the JBIG header if first plane and it hasn't already been sent out yet.
+ if (m_iPlaneNumber == 0 && m_bNotSent)
+ {
+ m_bNotSent = false;
+ i = 0;
+ for (int k = 1; k < kEnd; k++)
+ {
+ i = SendChunkHeader (szStr, 132, ZJT_BITMAP, 8);
+ szStr[13] += 20;
+ i += SendItem (szStr+i, ZJIT_UINT32, ZJI_BITMAP_TYPE, 1);
+ i += SendItem (szStr+i, ZJIT_UINT32, ZJI_BITMAP_PIXELS, se->xd);
+ i += SendItem (szStr+i, ZJIT_UINT32, ZJI_BITMAP_STRIDE, se->xd);
+ i += SendItem (szStr+i, ZJIT_UINT32, ZJI_BITMAP_LINES, se->yd);
+ i += SendItem (szStr+i, ZJIT_UINT32, ZJI_BITMAP_BPP, 1);
+ i += SendItem (szStr+i, ZJIT_UINT32, ZJI_VIDEO_BPP, m_iBpp);
+ i += SendItem (szStr+i, ZJIT_UINT32, ZJI_PLANE,
+ (m_pJA->color_mode == 0) ? k : 4);
+ i += SendItemExtra (szStr+i, ZJIT_BYTELUT, ZJI_ENCODING_DATA, 20, 20);
+ szStr[i++] = se->dl;
+ szStr[i++] = se->d;
+ szStr[i++] = se->planes;
+ szStr[i++] = 0;
+ for (int j = 3; j >= 0; j--)
+ {
+ szStr[i] = (BYTE) ((se->xd >> (8 * j)) & 0xFF);
+ szStr[4+i] = (BYTE) ((se->yd >> (8 * j)) & 0xFF);
+ szStr[8+i] = (BYTE) ((se->l0 >> (8 * j)) & 0xFF);
+ i++;
+ }
+ i += 8;
+
+ szStr[i++] = se->mx;
+ szStr[i++] = se->my;
+ szStr[i++] = se->order;
+ szStr[i++] = se->options;
+ err = sendBuffer ((const BYTE *) szStr, 132);
+ ERRCHECK;
+ }
+ }
+
+ BYTE *p = raster->rasterdata[COLORTYPE_COLOR] + 20;
+ int dwNumItems;
+ int dwSize;
+
+ DWORD dwTotalSize = raster->rastersize[COLORTYPE_COLOR];
+ dwTotalSize -= 20;
+ int iPadCount = 0;
+
+ i = 0;
+ if (dwTotalSize % 4)
+ {
+ iPadCount = ((dwTotalSize / 4 + 1) * 4) - dwTotalSize;
+ }
+
+ dwSize = 16 + dwTotalSize + iPadCount;
+ dwNumItems = 1;
+ if (bLastStride)
+ {
+ dwNumItems = 3;
+ m_bNotSent = true;
+ }
+ dwSize += (dwNumItems * 12);
+ i = SendChunkHeader (szStr, dwSize, ZJT_BITMAP, dwNumItems);
+ i += SendItem (szStr+i, ZJIT_UINT32, ZJI_PLANE, (kEnd == 5) ? m_iPlaneNumber+1 : 4);
+ if (bLastStride)
+ {
+ i += SendItem (szStr+i, ZJIT_UINT32, ZJI_BITMAP_LINES, se->yd);
+ i += SendItem (szStr+i, ZJIT_UINT32, ZJI_END_PLANE, bLastStride);
+ }
+ err = sendBuffer ((const BYTE *) szStr, i);
+ ERRCHECK;
+
+ err = sendBuffer ((const BYTE *) p, dwTotalSize);
+ ERRCHECK;
+ if (iPadCount != 0)
+ {
+ memset (szStr, 0, iPadCount);
+ err = sendBuffer ((const BYTE *) szStr, iPadCount);
+ }
+
+ if (m_pJA->color_mode == 0)
+ {
+ m_iPlaneNumber++;
+ if (m_iPlaneNumber == 4)
+ {
+ m_iPlaneNumber = 0;
+ }
+ }
+ return err;
+}
+
+
+DRIVER_ERROR LJZjStream::preProcessRasterData(cups_raster_t **ppcups_raster, cups_page_header2_t* firstpage_cups_header, char* pSwapedPagesFileName)
+{
+ int current_page_number = 0;
+ int fdEven = -1;
+ int fdOdd = -1;
+ int fdSwaped = -1;
+ int loopcntr = 0;
+ DRIVER_ERROR driver_error = NO_ERROR;
+ cups_page_header2_t cups_header;
+ cups_raster_t *swaped_pages_raster=NULL;
+ cups_raster_t *even_pages_raster=NULL;
+ cups_raster_t *odd_pages_raster = NULL;
+ BYTE* pPageDataBuffer = NULL;
+ char hpEvenPagesFile[] = "/tmp/hplipEvenPagesXXXXXX";
+ char hpOddPagesFile[] = "/tmp/hplipOddPagesXXXXXX";
+
+ if (1 != m_pJA->pre_process_raster || !cups_header.Duplex){
+ return NO_ERROR;
+ }
+
+ dbglog ("DEBUG: Getting Swaped Pages Raster.....\n");
+
+ memcpy(&cups_header, firstpage_cups_header, sizeof(cups_page_header2_t));
+
+ //Create temp files to store odd, even and swaped pages.
+ fdEven = mkstemp (hpEvenPagesFile);
+ fdOdd = mkstemp (hpOddPagesFile);
+ fdSwaped = mkstemp (pSwapedPagesFileName);
+ if (fdEven < 0 || fdOdd < 0 || fdSwaped < 0){
+ dbglog ("ERROR: Unable to open temp output files for writing\n");
+ driver_error = SYSTEM_ERROR;
+ goto bugout;
+ }
+
+ even_pages_raster = cupsRasterOpen(fdEven, CUPS_RASTER_WRITE);
+ odd_pages_raster = cupsRasterOpen(fdOdd, CUPS_RASTER_WRITE);
+ if (even_pages_raster == NULL || odd_pages_raster == NULL) {
+ dbglog("cupsRasterOpen failed for even_pages_raster or odd_pages_raster\n");
+ driver_error = NULL_POINTER;
+ goto bugout;
+ }
+
+ pPageDataBuffer = new BYTE[cups_header.cupsBytesPerLine+1];
+ if (pPageDataBuffer == NULL) {
+ driver_error = ALLOCMEM_ERROR;
+ goto bugout;
+ }
+
+
+ do
+ {
+ current_page_number++;
+ if(current_page_number % 2) {
+ cupsRasterWriteHeader2(odd_pages_raster, &cups_header);
+ }
+ else {
+ cupsRasterWriteHeader2(even_pages_raster, &cups_header);
+ }
+
+ // Iterating through the raster per page
+ for (int y = 0; y < (int) cups_header.cupsHeight; y++) {
+ cupsRasterReadPixels (*ppcups_raster, pPageDataBuffer, cups_header.cupsBytesPerLine);
+ if(current_page_number % 2) {
+ cupsRasterWritePixels (odd_pages_raster, pPageDataBuffer, cups_header.cupsBytesPerLine);
+ }
+ else {
+ cupsRasterWritePixels (even_pages_raster, pPageDataBuffer, cups_header.cupsBytesPerLine);
+ }
+ }
+
+ } while (cupsRasterReadHeader2(*ppcups_raster, &cups_header));
+
+ cupsRasterClose(even_pages_raster);
+ cupsRasterClose(odd_pages_raster);
+
+ //Now read even and odd pages rasters and then put into swaped raster
+ if ((fdEven = open (hpEvenPagesFile, O_RDONLY)) == -1) {
+ perror("ERROR: Unable to open evenpage raster file for reading.");
+ driver_error = SYSTEM_ERROR;
+ goto bugout;
+ }
+
+ if ((fdOdd = open (hpOddPagesFile, O_RDONLY)) == -1){
+ perror("ERROR: Unable to open odd page raster file for writing. ");
+ driver_error = SYSTEM_ERROR;
+ goto bugout;
+ }
+ even_pages_raster = cupsRasterOpen(fdEven, CUPS_RASTER_READ);
+ odd_pages_raster = cupsRasterOpen(fdOdd, CUPS_RASTER_READ);
+ swaped_pages_raster = cupsRasterOpen(fdSwaped, CUPS_RASTER_WRITE);
+
+ if (swaped_pages_raster == NULL || even_pages_raster == NULL || odd_pages_raster == NULL) {
+ dbglog("cupsRasterOpen failed for even_pages_raster or odd_pages_raster or swaped_pages_raster\n");
+ driver_error = NULL_POINTER;
+ goto bugout;
+
+ }
+
+ loopcntr = current_page_number / 2;
+ while (loopcntr--) {
+ if(cupsRasterReadHeader2(even_pages_raster, &cups_header)){
+ cupsRasterWriteHeader2(swaped_pages_raster, &cups_header);
+
+ // Iterating through the raster per line
+ for (int y = 0; y < (int) cups_header.cupsHeight; y++){
+ cupsRasterReadPixels (even_pages_raster, pPageDataBuffer, cups_header.cupsBytesPerLine);
+ cupsRasterWritePixels (swaped_pages_raster, pPageDataBuffer, cups_header.cupsBytesPerLine);
+ }
+ }
+
+ if(cupsRasterReadHeader2(odd_pages_raster, &cups_header)){
+ cupsRasterWriteHeader2(swaped_pages_raster, &cups_header);
+
+ // Iterating through the raster per line
+ for (int y = 0; y < (int) cups_header.cupsHeight; y++) {
+ cupsRasterReadPixels (odd_pages_raster, pPageDataBuffer, cups_header.cupsBytesPerLine);
+ cupsRasterWritePixels (swaped_pages_raster, pPageDataBuffer, cups_header.cupsBytesPerLine);
+ }
+ }
+
+ }
+
+ //Last Page is in odd page file
+ if(current_page_number%2 == 1){
+ cupsRasterReadHeader2(odd_pages_raster, &cups_header);
+ cupsRasterWriteHeader2(swaped_pages_raster, &cups_header);
+
+ // Iterating through the raster per line
+ for (int y = 0; y < (int) cups_header.cupsHeight; y++){
+ cupsRasterReadPixels (odd_pages_raster, pPageDataBuffer, cups_header.cupsBytesPerLine);
+ cupsRasterWritePixels (swaped_pages_raster, pPageDataBuffer, cups_header.cupsBytesPerLine);
+ }
+ }
+
+ cupsRasterClose(even_pages_raster);
+ cupsRasterClose(odd_pages_raster);
+ cupsRasterClose(swaped_pages_raster);
+
+ if(pPageDataBuffer){
+ delete [] pPageDataBuffer;
+ pPageDataBuffer = NULL;
+ }
+
+ //Now send swaped raster file further processing.
+ if ((fdSwaped = open (pSwapedPagesFileName, O_RDONLY)) == -1){
+ perror("ERROR: Unable to open swaped pages raster file - ");
+ driver_error = SYSTEM_ERROR;
+ goto bugout;
+ }
+
+ *ppcups_raster = cupsRasterOpen(fdSwaped, CUPS_RASTER_READ);
+ cupsRasterReadHeader2(*ppcups_raster, &cups_header);
+ memcpy(firstpage_cups_header, &cups_header, sizeof(cups_page_header2_t));
+ unlink(hpEvenPagesFile);
+ unlink(hpOddPagesFile);
+
+ return NO_ERROR; //cups_raster;
+
+bugout:
+ dbglog ("DEBUG:Something went wrong while creating swaped pages raster..\n");
+ if (fdEven > 2)
+ close(fdEven);
+ if (fdOdd > 2)
+ close(fdOdd);
+ if (fdSwaped > 2)
+ close(fdSwaped);
+ //closeFilter();
+
+ if(pPageDataBuffer){
+ delete [] pPageDataBuffer;
+ }
+
+ unlink(hpEvenPagesFile);
+ unlink(hpOddPagesFile);
+ return driver_error;
+}
+
diff --git a/prnt/hpcups/LJZjStream.h b/prnt/hpcups/LJZjStream.h
new file mode 100644
index 0000000..cbdcf29
--- /dev/null
+++ b/prnt/hpcups/LJZjStream.h
@@ -0,0 +1,72 @@
+/*****************************************************************************\
+ LJZjStream.h : Interface for the LJZjStream class
+
+ Copyright (c) 1996 - 2009, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ Author: Naga Samrat Chowdary Narla,
+\*****************************************************************************/
+
+
+#ifndef LJZJSTREAM_H
+#define LJZJSTREAM_H
+
+#include "ModeJbig.h"
+
+class LJZjStream : public Encapsulator
+{
+public:
+ LJZjStream ();
+ ~LJZjStream ();
+ DRIVER_ERROR Encapsulate (RASTERDATA *InputRaster, bool bLastPlane);
+ DRIVER_ERROR StartPage(JobAttributes *pJA);
+ DRIVER_ERROR StartPage_ljzjcolor2(JobAttributes *pJA);
+ DRIVER_ERROR Configure(Pipeline **pipeline);
+ DRIVER_ERROR FormFeed();
+ DRIVER_ERROR EndJob();
+ DRIVER_ERROR SendCAPy(int iOffset) {return NO_ERROR;}
+ DRIVER_ERROR preProcessRasterData(cups_raster_t **cups_raster, cups_page_header2_t* firstpage_cups_header, char* pSwapedPagesFileName);
+ bool CanSkipRasters() {return false;}
+
+protected:
+ DRIVER_ERROR flushPrinterBuffer() {return NO_ERROR;}
+ virtual DRIVER_ERROR addJobSettings();
+private:
+ DRIVER_ERROR encapsulateColor(RASTERDATA *input);
+ DRIVER_ERROR encapsulateColor2(RASTERDATA *input);
+ DRIVER_ERROR EndPage ();
+ DRIVER_ERROR sendBlankBands();
+ PrintMode m_PM;
+ ModeJbig *m_pModeJbig;
+ bool m_bNotSent;
+ int m_iCurRaster;
+ int m_iPlaneNumber;
+ int m_iBpp;
+ int m_iPlanes;
+}; // LJZjStream
+
+#endif // LJZJSTREAM_H
+
diff --git a/prnt/hpcups/LJZxStream.cpp b/prnt/hpcups/LJZxStream.cpp
new file mode 100644
index 0000000..623ca08
--- /dev/null
+++ b/prnt/hpcups/LJZxStream.cpp
@@ -0,0 +1,271 @@
+/*****************************************************************************\
+ LJZxStream.cpp : Implementation for the LJZxStream class
+
+ Copyright (c) 1996 - 2009, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+#include "CommonDefinitions.h"
+#include "Pipeline.h"
+#include "Encapsulator.h"
+#include "ColorMatcher.h"
+#include "Halftoner.h"
+#include "ModeJbig.h"
+#include "resources.h"
+#include "ColorMaps.h"
+#include "PrinterCommands.h"
+#include "LJZxStream.h"
+#include "Utils.h"
+#include "hpjbig_wrapper.h"
+
+LJZxStream::LJZxStream () : Encapsulator ()
+{
+ memset(&m_PM, 0, sizeof(m_PM));
+ strcpy(m_szLanguage, "ZJS");
+ m_pModeJbig = NULL;
+}
+
+LJZxStream::~LJZxStream()
+{
+}
+
+DRIVER_ERROR LJZxStream::addJobSettings()
+{
+ char szStr[256];
+ strcpy (szStr, "\x1B\x25-12345X@PJL JOB\x0D\x0A");
+ strcpy (szStr+strlen (szStr), "@PJL SET JAMRECOVERY=OFF\x0D\x0A");
+ strcpy (szStr+strlen (szStr), "@PJL SET DENSITY=3\x0D\x0A");
+ strcpy (szStr+strlen (szStr), "@PJL SET RET=MEDIUM\x0D\x0A");
+ strcpy (szStr+strlen (szStr), "@PJL SET ECONOMODE=");
+ if (m_pQA->print_quality == -1)
+ {
+ strcpy (szStr+strlen (szStr), "ON\x0D\x0A");
+ }
+ else
+ {
+ strcpy (szStr+strlen (szStr), "OFF\x0D\x0A");
+ }
+ addToHeader ((const BYTE *) szStr, strlen (szStr));
+
+ strcpy (szStr, "\x1B\x25-12345X,XQX");
+ addToHeader ((const BYTE *) szStr, strlen (szStr));
+ memset (szStr, 0x0, 92);
+ szStr[3] = 0x01;
+ szStr[7] = 0x07;
+ int i = 8;
+ i += SendIntItem ((BYTE *) szStr+i, 0x80000000, 0x04, 0x54);
+ i += SendIntItem ((BYTE *) szStr+i, 0x10000005, 0x04, 0x01);
+ i += SendIntItem ((BYTE *) szStr+i, 0x10000001, 0x04, 0x00);
+ i += SendIntItem ((BYTE *) szStr+i, 0x10000002, 0x04, 0x00);
+ i += SendIntItem ((BYTE *) szStr+i, 0x10000000, 0x04, 0x00);
+ i += SendIntItem ((BYTE *) szStr+i, 0x10000003, 0x04, 0x01);
+ i += SendIntItem ((BYTE *) szStr+i, 0x80000001, 0x04, 0xDEADBEEF);
+ addToHeader ((const BYTE *) szStr, i);
+ DRIVER_ERROR err = Cleanup();
+ return err;
+}
+
+DRIVER_ERROR LJZxStream::Configure(Pipeline **pipeline)
+{
+ DRIVER_ERROR err;
+ Pipeline *p = NULL;
+ Pipeline *head;
+ unsigned int width;
+ ColorMatcher *pColorMatcher;
+ Halftoner *pHalftoner;
+ int iRows[MAXCOLORPLANES];
+ unsigned int uiResBoost;
+ head = *pipeline;
+
+/*
+ * I need a flag in the printmode structure to whether create a CMYGraymap
+ * and set the ulMap1 to it.
+ */
+
+ m_PM.dyeCount = 1;
+ m_PM.ColorDepth[0] = 1;
+ m_PM.cmap.ulMap1 = ulMapDJ600_CCM_K;
+ m_PM.BaseResX = m_pQA->horizontal_resolution;
+ m_PM.BaseResY = m_pQA->vertical_resolution;
+ m_PM.eHT = FED;
+ m_PM.BlackFEDTable = HTBinary_open;
+ m_PM.ColorFEDTable = HTBinary_open;
+ m_PM.MixedRes = false;
+
+ for (int i = 0; i < MAXCOLORPLANES; i++)
+ {
+ m_PM.ResolutionX[i] = m_pQA->horizontal_resolution;
+ m_PM.ResolutionY[i] = m_pQA->vertical_resolution;
+ iRows[i] = m_PM.ResolutionX[i] / m_PM.BaseResX;
+ }
+ uiResBoost = m_PM.BaseResX / m_PM.BaseResY;
+ if (uiResBoost == 0)
+ uiResBoost = 1;
+
+ width = m_pMA->printable_width;
+
+ pColorMatcher = new ColorMatcher(m_PM.cmap, m_PM.dyeCount, width);
+ head = new Pipeline(pColorMatcher);
+ pHalftoner = new Halftoner (&m_PM, width, iRows, uiResBoost, m_PM.eHT == MATRIX);
+ p = new Pipeline(pHalftoner);
+ head->AddPhase(p);
+ m_pModeJbig = new ModeJbig(width);
+ p = new Pipeline(m_pModeJbig);
+ head->AddPhase(p);
+ m_pModeJbig->myplane = COLORTYPE_COLOR;
+ err = m_pModeJbig->Init(m_pMA->printable_height, 1, 2, ZXSTREAM);
+
+ *pipeline = head;
+ return err;
+}
+
+DRIVER_ERROR LJZxStream::StartPage (JobAttributes *pJA)
+{
+ DRIVER_ERROR err;
+ BYTE szStr[256];
+ int i;
+ int iOutputResolution = m_pJA->integer_values[1];
+ int width;
+
+ width = ((m_pMA->printable_width + 31) / 32) * 32;
+ if (m_pQA->print_quality == 0)
+ iOutputResolution = m_pQA->vertical_resolution;
+ memset (szStr, 0x0, sizeof (szStr));
+ szStr[3] = 0x03;
+ szStr[7] = 0x0F;
+ err = sendBuffer ((const BYTE *) szStr, 8);
+ i = 0;
+ i += SendIntItem (szStr+i, 0x80000000, 0x04, 0xB4);
+ i += SendIntItem (szStr+i, 0x20000005, 0x04, 0x01);
+ i += SendIntItem (szStr+i, 0x20000006, 0x04, 0x07);
+ i += SendIntItem (szStr+i, 0x20000000, 0x04, 0x01);
+ i += SendIntItem (szStr+i, 0x20000007, 0x04, 0x01);
+ i += SendIntItem (szStr+i, 0x20000008, 0x04, m_pQA->horizontal_resolution);
+ i += SendIntItem (szStr+i, 0x20000009, 0x04, iOutputResolution);
+ i += SendIntItem (szStr+i, 0x2000000D, 0x04, width * 2);
+ i += SendIntItem (szStr+i, 0x2000000E, 0x04, m_pMA->printable_height);
+ i += SendIntItem (szStr+i, 0x2000000A, 0x04, 2);
+ i += SendIntItem (szStr+i, 0x2000000F, 0x04, width);
+ i += SendIntItem (szStr+i, 0x20000010, 0x04, m_pMA->printable_height);
+ i += SendIntItem (szStr+i, 0x20000011, 0x04, 0x01);
+ i += SendIntItem (szStr+i, 0x20000001, 0x04, m_pMA->pcl_id);
+ i += SendIntItem (szStr+i, 0x80000001, 0x04, 0xDEADBEEF);
+ err = sendBuffer ((const BYTE *) szStr, i);
+ return err;
+}
+
+DRIVER_ERROR LJZxStream::FormFeed ()
+{
+ BYTE szStr[16];
+ memset(szStr, 0, sizeof(szStr));
+ szStr[3] = 0x06;
+ szStr[11] = 0x04;
+ return sendBuffer ((const BYTE *) szStr, 16);
+}
+
+DRIVER_ERROR LJZxStream::EndJob()
+{
+ char szStr[64];
+ memset(szStr, 0, sizeof(szStr));
+ szStr[3] = 2;
+ strcpy (szStr+8, "\x1B\x25-12345X@PJL EOJ\x0D\x0A\x1B\x25-12345X");
+ return this->sendBuffer((const BYTE *) szStr, 8 + strlen(szStr+8));
+}
+
+DRIVER_ERROR LJZxStream::Encapsulate (RASTERDATA *raster, bool bLastPlane)
+{
+ DRIVER_ERROR err = NO_ERROR;
+ BYTE szStr[128];
+ int i = 0;
+ HPLJZjsJbgEncSt *se = (HPLJZjsJbgEncSt *) (raster->rasterdata[COLORTYPE_COLOR] + raster->rastersize[COLORTYPE_COLOR]);
+
+/*
+ * Send JBIG header info
+ */
+
+ memset (szStr, 0x0, 128);
+ szStr[3] = 0x05;
+ szStr[7] = 0x04;
+ i = 8;
+ i += SendIntItem (szStr+i, 0x80000000, 0x04, 0x40);
+ i += SendIntItem (szStr+i, 0x40000000, 0x04, 0x00);
+ i += SendIntItem (szStr+i, 0x40000002, 0x14, 0x00);
+ i -= 4;
+ szStr[i++] = se->dl;
+ szStr[i++] = se->d;
+ szStr[i++] = se->planes;
+ szStr[i++] = 0;
+ for (int j = 3; j >= 0; j--)
+ {
+ szStr[i] = (BYTE) ((se->xd >> (8 * j)) & 0xFF);
+ szStr[4+i] = (BYTE) ((se->yd >> (8 * j)) & 0xFF);
+ szStr[8+i] = (BYTE) ((se->l0 >> (8 * j)) & 0xFF);
+ i++;
+ }
+ i = 56;
+ szStr[i++] = se->mx;
+ szStr[i++] = se->my;
+ szStr[i++] = se->order;
+ szStr[i++] = se->options;
+ i += SendIntItem (szStr+i, 0x80000001, 0x04, 0xDEADBEEF);
+
+ BYTE *p = raster->rasterdata[COLORTYPE_COLOR] + 20;
+ int iDataSize = raster->rastersize[COLORTYPE_COLOR] - 20;
+ char szTmpStr[32];
+ memset (szTmpStr, 0x0, 32);
+ szTmpStr[3] = 0x07;
+ szTmpStr[5] = 0x01;
+ szTmpStr[19] = 0x06;
+ szTmpStr[27] = 0x04;
+ while (iDataSize > 65536)
+ {
+ err = sendBuffer ((const BYTE *) szStr, i);
+ ERRCHECK;
+ err = sendBuffer ((const BYTE *) szTmpStr, 8);
+ ERRCHECK;
+ err = sendBuffer ((const BYTE *) p, 65536);
+ ERRCHECK;
+ iDataSize -= 65536;
+ p += 65536;
+// err = sendBuffer ((const BYTE *) szTmpStr+16, 16);
+ }
+ if (iDataSize > 0)
+ {
+ err = sendBuffer ((const BYTE *) szStr, i);
+ ERRCHECK;
+ szTmpStr[5] = (char) ((iDataSize >> 16) & 0xFF);
+ szTmpStr[6] = (char) ((iDataSize >> 8) & 0xFF);
+ szTmpStr[7] = (char) (iDataSize & 0xFF);
+ err = sendBuffer ((const BYTE *) szTmpStr, 8);
+ ERRCHECK;
+ err = sendBuffer ((const BYTE *) p, iDataSize);
+ ERRCHECK;
+// err = sendBuffer ((const BYTE *) szTmpStr+16, 16);
+ }
+
+ return err;
+}
+
diff --git a/prnt/hpcups/LJZxStream.h b/prnt/hpcups/LJZxStream.h
new file mode 100644
index 0000000..bd3399f
--- /dev/null
+++ b/prnt/hpcups/LJZxStream.h
@@ -0,0 +1,64 @@
+/*****************************************************************************\
+ LJZxStream.h : Interface for the LJZxStream class
+
+ Copyright (c) 1996 - 2009, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#ifndef LJZXSTREAM_H
+#define LJZXSTREAM_H
+
+#include "ModeJbig.h"
+
+class LJZxStream : public Encapsulator
+{
+public:
+ LJZxStream ();
+ ~LJZxStream ();
+ DRIVER_ERROR Encapsulate (RASTERDATA *InputRaster, bool bLastPlane);
+ DRIVER_ERROR StartPage(JobAttributes *pJA);
+ DRIVER_ERROR Configure(Pipeline **pipeline);
+ DRIVER_ERROR FormFeed();
+ DRIVER_ERROR EndJob();
+ DRIVER_ERROR SendCAPy(int iOffset) {return NO_ERROR;}
+ bool CanSkipRasters() {return false;}
+ void SetLastBand()
+ {
+ m_pModeJbig->SetLastBand();
+ }
+
+protected:
+ DRIVER_ERROR flushPrinterBuffer() {return NO_ERROR;}
+ virtual DRIVER_ERROR addJobSettings();
+private:
+ DRIVER_ERROR EndPage ();
+ PrintMode m_PM;
+ ModeJbig *m_pModeJbig;
+}; // LJZxStream
+
+#endif // LJZXSTREAM_H
+
diff --git a/prnt/hpcups/Lidil.cpp b/prnt/hpcups/Lidil.cpp
new file mode 100644
index 0000000..2c913e0
--- /dev/null
+++ b/prnt/hpcups/Lidil.cpp
@@ -0,0 +1,1759 @@
+/*****************************************************************************\
+ Lidil.cpp : Implementation of Lidil class
+
+ Copyright (c) 1996 - 2009, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+#include "CommonDefinitions.h"
+#include "Encapsulator.h"
+#include "LidilCompress.h"
+#include "Lidil.h"
+#include "ColorMatcher.h"
+#include "Halftoner.h"
+#include "resources.h"
+#include "ColorMaps.h"
+#include "LidilPrintModes.h"
+#include "PrinterCommands.h"
+
+typedef union
+{
+ Int32 int_value;
+ char char_val[4];
+} Int32Bytes;
+
+typedef union
+{
+ Int16 int_value;
+ char char_val[2];
+} Int16Bytes;
+
+Lidil::Lidil() : Encapsulator()
+{
+ m_pPM = NULL;
+ m_lidil_version = 1;
+ m_iBytesPerSwing = 2;
+ m_iColorPenResolution = 300;
+ m_iBlackPenResolution = 1200;
+ m_iNumBlackNozzles = 400;
+ m_cPrintDirection = PRNDRN_LEFTTORIGHT;
+ m_SwathData = NULL;
+ m_sRefCount = 6;
+ m_iBlankRasters = 0;
+ m_iRasterCount = 0;
+ m_iNextRaster = 0;
+ m_iNextColor = 0;
+ m_iBitDepth = 1;
+ m_bBidirectionalPrintingOn = true;
+ m_cKtoCVertAlign = 12;
+ m_cPtoCVertAlign = 6;
+ m_pLidilCompress = NULL;
+ m_szCompressBuf = NULL;
+ Int16Bytes val;
+ val.int_value = 0x0102;
+ if (val.char_val[0] == 0x01)
+ m_bLittleEndian = false;
+ else
+ m_bLittleEndian = true;
+}
+
+Lidil::~Lidil()
+{
+ if (m_pLidilCompress)
+ delete m_pLidilCompress;
+ if (m_SwathData)
+ delete [] m_SwathData;
+ if (m_szCompressBuf)
+ delete [] m_szCompressBuf;
+}
+
+DRIVER_ERROR Lidil::Configure(Pipeline **pipeline)
+{
+ Pipeline *p = NULL;
+ Pipeline *head;
+ unsigned int width;
+ ColorMatcher *pColorMatcher;
+ int iRows[MAXCOLORPLANES];
+ unsigned int uiResBoost;
+ head = *pipeline;
+
+ if (m_pPM->BaseResX != m_pQA->horizontal_resolution ||
+ m_pPM->BaseResY != m_pQA->vertical_resolution)
+ {
+ dbglog("Requested resolution not supported with requested printmode");
+ return UNSUPPORTED_PRINTMODE;
+ }
+
+ for (int i = 0; i < MAXCOLORPLANES; i++)
+ {
+ iRows[i] = m_pPM->ResolutionX[i] / m_pPM->BaseResX;
+ }
+ uiResBoost = m_pPM->BaseResX / m_pPM->BaseResY;
+ if (uiResBoost == 0)
+ uiResBoost = 1;
+
+ width = m_pMA->printable_width;
+
+ pColorMatcher = new ColorMatcher(m_pPM->cmap, m_pPM->dyeCount, width);
+ head = new Pipeline(pColorMatcher);
+ Halftoner *pHalftoner;
+ pHalftoner = new Halftoner (m_pPM, width, iRows, uiResBoost, m_pPM->eHT == MATRIX);
+ p = new Pipeline(pHalftoner);
+ head->AddPhase(p);
+
+ *pipeline = head;
+ return NO_ERROR;
+}
+
+DRIVER_ERROR Lidil::StartJob(SystemServices *pSystemServices, JobAttributes *pJA)
+{
+ DRIVER_ERROR err = NO_ERROR;
+ m_pSystemServices = pSystemServices;
+
+ m_pJA = pJA;
+ m_pMA = &pJA->media_attributes;
+ m_pQA = &pJA->quality_attributes;
+
+ if (!strcmp(m_pJA->printer_platform, "dj4100"))
+ {
+ m_lidil_version = 2;
+ m_iBytesPerSwing = 4;
+ m_iColorPenResolution = 600;
+ }
+ else if (!strcmp(m_pJA->printer_platform, "dj2600"))
+ {
+ m_lidil_version = 2;
+ m_iBytesPerSwing = 4;
+ m_iColorPenResolution = 600;
+ m_iBlackPenResolution = 600;
+ m_iNumBlackNozzles = 336;
+ }
+ if (m_pQA->print_quality == BEST_QUALITY && m_pQA->media_type == MEDIATYPE_PHOTO)
+ {
+ m_iBitDepth = 2;
+ }
+ cur_pcl_buffer_size = PCL_BUFFER_SIZE;
+ pcl_buffer = new BYTE[cur_pcl_buffer_size + 2];
+ if (pcl_buffer == NULL)
+ {
+ return ALLOCMEM_ERROR;
+ }
+ memset(pcl_buffer, 0, cur_pcl_buffer_size);
+ cur_pcl_buffer_ptr = pcl_buffer;
+
+ if (!selectPrintMode())
+ {
+ dbglog("selectPrintMode failed, PrintMode name = %s", m_pQA->print_mode_name);
+ return UNSUPPORTED_PRINTMODE;
+ }
+
+
+ if (m_pPM->BaseResX != m_pQA->horizontal_resolution ||
+ m_pPM->BaseResY != m_pQA->vertical_resolution)
+ {
+ dbglog("Requested resolution not supported with requested printmode");
+ dbglog(" m_pPM->BaseResX = %d\n",m_pPM->BaseResX);
+ dbglog(" m_pPM->BaseResY = %d\n",m_pPM->BaseResY);
+ dbglog(" m_pQA->horizontal_resolution = %d\n",m_pQA->horizontal_resolution);
+ dbglog(" m_pQA->vertical_resolution = %d\n",m_pQA->vertical_resolution);
+ return UNSUPPORTED_PRINTMODE;
+ }
+
+ m_iVertPosn = (m_pMA->printable_start_y * DEVUNITS_XBOW) / m_pQA->vertical_resolution;
+ m_iLeftMargin = (m_pMA->printable_start_x * DEVUNITS_XBOW) / m_pQA->vertical_resolution;
+ if (m_pJA->print_borderless)
+ {
+ m_iVertPosn = (-m_pMA->vertical_overspray * DEVUNITS_XBOW) / (2 * m_pQA->vertical_resolution);
+ m_iLeftMargin = (-m_pMA->horizontal_overspray * DEVUNITS_XBOW) / (2 * m_pQA->horizontal_resolution);
+ }
+
+ err = allocateSwathBuffers();
+ if (err != NO_ERROR)
+ {
+ dbglog("allocateSwathBuffers failed, err = %d", err);
+ return err;
+ }
+
+ addToHeader(LdlSync, sizeof(LdlSync));
+ cur_pcl_buffer_ptr[SYNC_CMD_OPT_SIZE] = FRAME_SYN;
+ err = m_pSystemServices->Send(pcl_buffer, SYNCSIZE);
+ cur_pcl_buffer_ptr = pcl_buffer;
+ addToHeader(LdlSyncComplete, sizeof(LdlSyncComplete));
+ addToHeader(LdlReset, sizeof(LdlReset));
+ UInt16 mem_needed = SIZEOF_LDLHDR + SIZEOF_LDL_JOB_CMDOPT + SIZEOF_LDLTERM;
+ if (m_lidil_version == 2)
+ {
+ mem_needed += 4;
+ }
+ fillLidilHeader(NULL, eLDLStartJob, mem_needed);
+ *cur_pcl_buffer_ptr++ = OPERATION_STJOB;
+ addInt32(m_pJA->job_id);
+ if (m_lidil_version == 2)
+ addInt32(0);
+ *cur_pcl_buffer_ptr++ = FRAME_SYN;
+ err = Cleanup();
+
+// m_pLidilCompress = new LidilCompress(m_bLittleEndian);
+ return err;
+}
+
+DRIVER_ERROR Lidil::EndJob()
+{
+ DRIVER_ERROR err = NO_ERROR;
+ UInt16 mem_needed = SIZEOF_LDLHDR + SIZEOF_LDL_JOB_CMDOPT + SIZEOF_LDLTERM;
+ Cleanup();
+ memset(pcl_buffer, 0, cur_pcl_buffer_size);
+ fillLidilHeader(NULL, eLDLEndJob, mem_needed);
+ *cur_pcl_buffer_ptr++ = OPERATION_ENDJOB;
+ addInt32(m_pJA->job_id);
+ *cur_pcl_buffer_ptr++ = FRAME_SYN;
+ addToHeader(LdlSync, sizeof(LdlSync));
+ cur_pcl_buffer_ptr += SYNC_CMD_OPT_SIZE;
+ *cur_pcl_buffer_ptr++ = FRAME_SYN;
+ cur_pcl_buffer_ptr = pcl_buffer + SYNCSIZE + mem_needed;
+ addToHeader(LdlSyncComplete, sizeof(LdlSyncComplete));
+ addToHeader(LdlReset, sizeof(LdlReset));
+ err = Cleanup();
+ return err;
+}
+
+void Lidil::CancelJob()
+{
+ UInt16 mem_needed = SIZEOF_LDLHDR + SIZEOF_LDL_JOB_CMDOPT
+ + SIZEOF_LDLTERM;
+ fillLidilHeader (NULL, eLDLControl, mem_needed);
+ addInt32 (m_pJA->job_id);
+ *cur_pcl_buffer_ptr++ = OPERATION_CANCJOB;
+ *cur_pcl_buffer_ptr++ = FRAME_SYN;
+ Cleanup();
+}
+
+DRIVER_ERROR Lidil::StartPage(JobAttributes *pJA)
+{
+ DRIVER_ERROR err = NO_ERROR;
+ m_pJA = pJA;
+ m_pMA = &pJA->media_attributes;
+ m_pQA = &pJA->quality_attributes;
+ UInt32 mem_needed = SIZEOF_LDLHDR + SIZEOF_LDL_LDPAGE_CMDOPT
+ + SIZEOF_LDL_LDPAGE_OPTFLDS
+ + SIZEOF_LDLTERM;
+
+ memset (cur_pcl_buffer_ptr, 0, mem_needed);
+
+ fillLidilHeader (NULL, eLDLLoadPage, (UInt16) mem_needed);
+ *cur_pcl_buffer_ptr++ = m_pQA->media_type;;
+ *cur_pcl_buffer_ptr++ = MEDIASRC_MAINTRAY;
+ *cur_pcl_buffer_ptr++ = MEDIADEST_MAINBIN;
+ *cur_pcl_buffer_ptr++ = m_pQA->print_quality;
+ *cur_pcl_buffer_ptr++ = SPECLOAD_NONE;
+
+ addInt32((Int32) (m_pMA->physical_width * DEVUNITS_XBOW / m_pQA->horizontal_resolution));
+ addInt32((Int32) (m_pMA->physical_height * DEVUNITS_XBOW / m_pQA->vertical_resolution));
+
+ addInt32(MEDIALD_SPEED|NEED_TO_SERVICE_PERIOD|MINTIME_BTW_SWEEP);
+
+ // set up the option fields
+ *cur_pcl_buffer_ptr++ = 4; // MediaLoadSpeed;
+ *cur_pcl_buffer_ptr++ = 0; // NeedToServicePeriod;
+ addInt16 (200); // MinTimeBetweenSweeps
+
+ *cur_pcl_buffer_ptr++ = FRAME_SYN;
+ err = Cleanup ();
+ return err;
+}
+
+DRIVER_ERROR Lidil::SendCAPy(int iOffset)
+{
+ DRIVER_ERROR err = NO_ERROR;
+#if 0
+ if (m_iRasterCount == 0)
+ {
+ m_iBlankRasters += iOffset;
+ return err;
+ }
+#endif
+ int iCount = m_pPM->dyeCount * m_iBitDepth;
+ if (m_iBitDepth == 2 && m_pPM->dyeCount != 6)
+ iCount++;
+
+ RASTERDATA rasterdata;
+ memset(&rasterdata, 0, sizeof(rasterdata));
+ while (iOffset > 0)
+ {
+ for (int i = 0; i < iCount; i++)
+ {
+ err = Encapsulate (&rasterdata, 0);
+ ERRCHECK;
+ }
+ iOffset--;
+ }
+ return err;
+}
+
+DRIVER_ERROR Lidil::FormFeed()
+{
+ DRIVER_ERROR err = NO_ERROR;
+ int icount = 0;
+ int iCurNumRasters = m_iRasterCount;
+ if ((m_pQA->print_quality == DRAFT_QUALITY || m_pQA->vertical_resolution == 300) && m_iRasterCount)
+ icount = 1;
+ else if (m_pQA->print_quality != DRAFT_QUALITY)
+ {
+ icount = 4 * m_iBitDepth;
+ iCurNumRasters = m_sSwathHeight * m_pPM->dyeCount;
+ }
+
+ int i, j, n;
+ n = m_sSwathHeight / (4 * m_iBitDepth);
+
+ n = n * (m_cPassNumber + 1) - m_iNextRaster;
+ for (i = 0; i < (int) m_pPM->dyeCount; i++)
+ {
+ for (j = 0; j < n; j++)
+ memset (m_SwathData[i][m_iNextRaster+j], 0, m_iImageWidth * m_iBitDepth);
+ }
+ m_iNextRaster += n;
+ n = m_sSwathHeight / (4 * m_iBitDepth);
+
+ while (icount)
+ {
+ m_iRasterCount = iCurNumRasters;
+ err = processSwath ();
+ if (err != NO_ERROR)
+ break;
+ icount--;
+ if (m_iNextRaster >= m_sSwathHeight)
+ m_iNextRaster = 0;
+ for (i = 0; i < (int) m_pPM->dyeCount; i++)
+ {
+ for (j = 0; j < n; j++)
+ memset (m_SwathData[i][m_iNextRaster+j], 0, m_iImageWidth * m_iBitDepth);
+ }
+ m_iNextRaster += n;
+ }
+
+ UInt16 mem_needed = SIZEOF_LDLHDR
+ + SIZEOF_LDL_EJPAGE_CMDOPT
+ + SIZEOF_LDL_EJPAGE_OPTFLDS
+ + SIZEOF_LDLTERM;
+
+ fillLidilHeader(NULL, eLDLEjectPage, mem_needed);
+
+ addInt32 (MEDIA_EJSPEED);
+
+ *cur_pcl_buffer_ptr++ = 15;
+ *cur_pcl_buffer_ptr++ = FRAME_SYN;
+ if(err == NO_ERROR)
+ {
+ err = Cleanup();
+ }
+
+ m_sRefCount = 6;
+ m_iBlankRasters = 0;
+ m_iVertPosn = (m_pMA->printable_start_y * DEVUNITS_XBOW) / m_pQA->vertical_resolution;
+ m_iRasterCount = 0;
+ m_iNextRaster = 0;
+ m_iNextColor = 0;
+
+ if (m_pJA->print_borderless)
+ {
+ m_iVertPosn = (int) (-m_pMA->vertical_overspray * DEVUNITS_XBOW) / (2 * m_pQA->vertical_resolution);
+ }
+
+ if (m_pQA->print_quality != DRAFT_QUALITY)
+ m_iRasterCount = (m_sSwathHeight - m_sSwathHeight / 4) * m_pPM->dyeCount;
+
+ if (m_pQA->print_quality == DRAFT_QUALITY && m_pQA->vertical_resolution != 300)
+ {
+ m_iRasterCount = (m_sSwathHeight - m_sSwathHeight / (4*m_iBitDepth)) * m_pPM->dyeCount;
+ m_iVertPosn -= (((m_sSwathHeight - m_sSwathHeight / (4*m_iBitDepth)) * 600 / m_pQA->vertical_resolution) * DEVUNITS_XBOW / 600);
+ }
+ m_cPassNumber = 0;
+
+ if (m_pJA->print_borderless)
+ {
+ if (m_iVertPosn < -850) m_iVertPosn = -850;
+ }
+ else
+ {
+ if (m_iVertPosn < -600) m_iVertPosn = -600;
+ }
+ if (m_iBitDepth == 2)
+ m_iVertPosn += 6;
+
+ for (i = 0; i < (int) m_pPM->dyeCount; i++)
+ {
+ for (int j = 0; j < m_sSwathHeight; j++)
+ {
+ memset (m_SwathData[i][j], 0, m_iImageWidth);
+ }
+ }
+
+ return err;
+}
+
+DRIVER_ERROR Lidil::Encapsulate(RASTERDATA *InputRaster, bool bLastPlane)
+{
+ DRIVER_ERROR err = NO_ERROR;
+ int iPlaneNum = 0;
+ if (m_iBitDepth == 2)
+ {
+ if (m_pPM->dyeCount != 6)
+ {
+ if (m_cPlaneNumber == 0)
+ {
+ m_cPlaneNumber++;
+ return NO_ERROR;
+ }
+ }
+ int iCPlane;
+ if (m_pPM->dyeCount == 6)
+ {
+ iPlaneNum = m_cPlaneNumber % 2;
+ }
+ else
+ {
+ iPlaneNum = (m_cPlaneNumber + 1) % 2;
+ }
+ int iRowNum = (m_iRasterCount / 6) * 2 + iPlaneNum;
+ iRowNum = m_iNextRaster;
+ if (m_pPM->dyeCount == 6)
+ {
+ iCPlane = m_cPlaneNumber / 2;
+ }
+ else
+ {
+ iCPlane = (m_cPlaneNumber - 1) / 2;
+ }
+ if (iPlaneNum == 0)
+ {
+ if (!InputRaster->rasterdata[COLORTYPE_COLOR])
+ {
+ m_bPrevRowWasBlank = true;
+ memset (m_SwathData[iCPlane][iRowNum], 0, m_iImageWidth * 2);
+ }
+ else
+ {
+ m_bPrevRowWasBlank = false;
+ memcpy (m_SwathData[iCPlane][iRowNum], InputRaster->rasterdata[COLORTYPE_COLOR], InputRaster->rastersize[COLORTYPE_COLOR]);
+ }
+ }
+ if (m_pPM->dyeCount == 6)
+ {
+ m_cPlaneNumber = (m_cPlaneNumber + 1) % 12;
+ }
+ else
+ {
+ m_cPlaneNumber = (m_cPlaneNumber + 1) % 8;
+ }
+
+ if (iPlaneNum == 1)
+ {
+ if (InputRaster->rasterdata[COLORTYPE_COLOR] || !m_bPrevRowWasBlank)
+ {
+ applyShingleMask(iCPlane, InputRaster->rasterdata[COLORTYPE_COLOR]);
+ }
+ else
+ {
+ memset (m_SwathData[iCPlane][m_iNextRaster+1], 0, m_iImageWidth * 2);
+ }
+
+ if (m_pPM->dyeCount == 6)
+ {
+ m_cPlaneNumber = m_cPlaneNumber % 12;
+ }
+ else
+ {
+ m_cPlaneNumber = m_cPlaneNumber % 7;
+ }
+ }
+ }
+ else
+ {
+ if (InputRaster->rasterdata[COLORTYPE_COLOR] == NULL)
+ memset (m_SwathData[m_iNextColor][m_iNextRaster], 0, m_iImageWidth);
+ else
+ memcpy (m_SwathData[m_iNextColor][m_iNextRaster], InputRaster->rasterdata[COLORTYPE_COLOR], m_iImageWidth);
+ }
+ m_iRasterCount++;
+ if (m_iBitDepth == 1 || (m_iBitDepth == 2 && iPlaneNum == 1))
+ m_iNextColor++;
+ if (m_iNextColor == (int) m_pPM->dyeCount)
+ {
+ m_iNextColor = 0;
+ if (m_iBitDepth == 2)
+ m_iNextRaster += 2;
+ else
+ m_iNextRaster++;
+ }
+ if (m_iRasterCount < (int) (m_sSwathHeight * m_pPM->dyeCount))
+ return NO_ERROR;
+
+ err = processSwath ();
+
+ if (m_iNextRaster >= m_sSwathHeight)
+ {
+ m_iNextRaster = 0;
+ }
+ return err;
+}
+
+void Lidil::fillLidilHeader(void *pLidilHdr, int Command, UInt16 CmdLen, UInt16 DataLen)
+{
+ memset(cur_pcl_buffer_ptr, 0, SIZEOF_LDLHDR);
+ *cur_pcl_buffer_ptr++ = FRAME_SYN;
+ addInt16(CmdLen);
+ cur_pcl_buffer_ptr += 2;
+ *cur_pcl_buffer_ptr++ = (BYTE) Command;
+ addInt16(m_sRefCount++);
+ addInt16(DataLen);
+}
+
+void Lidil::addInt32(Int32 iVal)
+{
+ Int32Bytes val;
+ val.int_value = iVal;
+ if (m_bLittleEndian)
+ {
+ for (int i = 3; i > -1; i--)
+ *cur_pcl_buffer_ptr++ = val.char_val[i];
+ }
+ else
+ {
+ memcpy(cur_pcl_buffer_ptr, val.char_val, 4);
+ cur_pcl_buffer_ptr += 4;
+ }
+}
+
+void Lidil::addInt16(Int16 iVal)
+{
+ Int16Bytes val;
+ val.int_value = iVal;
+ if (m_bLittleEndian)
+ {
+ *cur_pcl_buffer_ptr++ = val.char_val[1];
+ *cur_pcl_buffer_ptr++ = val.char_val[0];
+ }
+ else
+ {
+ memcpy(cur_pcl_buffer_ptr, val.char_val, 2);
+ cur_pcl_buffer_ptr += 2;
+ }
+}
+
+
+bool Lidil::selectPrintMode(int index)
+{
+ PrintMode *p = lidil_print_modes_table[index].print_modes;
+ int iPMIndex = 0;
+
+ if (!strcmp(m_pJA->printer_platform, "dj4100") || (!strcmp(m_pJA->printer_platform, "dj2600")))
+ {
+ //Encapsulator for Viper Trim class products is not written properly, hence mapping the Index to
+ //old values.
+ iPMIndex = PQ_Cartridge_Map_ViperTrim[m_pJA->integer_values[2]][m_pJA->integer_values[1]];
+ }
+ else
+ {
+ iPMIndex = PQ_Cartridge_Map[m_pJA->integer_values[2]][m_pJA->integer_values[1]];
+ //m_pJA->integer_values[1] is basically cupsInteger1 value given in PPD.
+ //m_pJA->integer_values[2] is basically cupsInteger2 value given in PPD.
+ }
+
+ dbglog("CupeInteger1 = [%d]\n",m_pJA->integer_values[1]);
+ dbglog("CupeInteger2 = [%d]\n",m_pJA->integer_values[2]);
+ dbglog("PrintMode Index = [%d]\n",iPMIndex);
+
+ if( -1 == iPMIndex)
+ {
+ dbglog("Unsupported Cartridge and Print Quality combination..\n");
+ return false;
+ }
+
+ for (int i = 0; i < lidil_print_modes_table[index].count; i++, p++)
+ {
+ if (i == iPMIndex)
+ {
+ dbglog("Print Mode = [%s]\n",p->name);
+ m_pPM = p;
+ return true;
+ }
+ }
+ return false;
+}
+
+/*
+bool Lidil::selectPrintMode(int index)
+{
+ PrintMode *p = lidil_print_modes_table[index].print_modes;
+ for (int i = 0; i < lidil_print_modes_table[index].count; i++, p++)
+ {
+ if (!strcmp(m_pJA->quality_attributes.print_mode_name, p->name))
+ {
+ m_pPM = p;
+ return true;
+ }
+ }
+ return false;
+}*/
+
+
+bool Lidil::selectPrintMode()
+{
+ if (m_pJA->printer_platform[0] == 0)
+ {
+ dbglog("printer_platform is undefined");
+ return false;
+ }
+ for (unsigned int i = 0; i < sizeof(lidil_print_modes_table) / sizeof(lidil_print_modes_table[0]); i++)
+ {
+ if (!strcmp(m_pJA->printer_platform, lidil_print_modes_table[i].printer_platform_name))
+ {
+ return selectPrintMode(i);
+ }
+ }
+ dbglog("Unsupported printer_platform: %s", m_pJA->printer_platform);
+ return false;
+}
+
+DRIVER_ERROR Lidil::loadSweepData (BYTE *imagedata, int imagesize)
+{
+ UInt16 mem_needed = SIZEOF_LDLHDR + SIZEOF_LDL_LDSWPDATA_CMDOPT
+ + SIZEOF_LDLTERM;
+ cur_pcl_buffer_ptr = pcl_buffer;
+ memset (pcl_buffer, 0, mem_needed);
+ if (mem_needed < LDLPACKET_MINSIZE)
+ {
+ memset(pcl_buffer + mem_needed-1, 0xFF, LDLPACKET_MINSIZE - mem_needed);
+ mem_needed = LDLPACKET_MINSIZE;
+ }
+
+ BYTE *compressed_dataptr = imagedata;
+ UInt16 compressed_size = imagesize;
+
+ if (m_pLidilCompress)
+ {
+ m_pLidilCompress->Init ((UInt16 *) (imagedata+16), imagesize);
+ m_pLidilCompress->CompressData ();
+ m_pLidilCompress->GetFrameInfo (&compressed_dataptr, &compressed_size);
+ }
+
+ fillLidilHeader (NULL, eLDLLoadSweepData, mem_needed, compressed_size);
+ addInt16 (imagesize);
+ pcl_buffer[15] = FRAME_SYN;
+
+ memcpy (compressed_dataptr, pcl_buffer, 16);
+ cur_pcl_buffer_ptr = pcl_buffer;
+ return (sendBuffer ((const BYTE *) compressed_dataptr, compressed_size+16));
+}
+
+DRIVER_ERROR Lidil::printSweep (UInt32 SweepSize,
+ bool ColorPresent,
+ bool BlackPresent,
+ bool PhotoPresent,
+ Int32 VerticalPosition,
+ Int32 LeftEdge,
+ Int32 RightEdge,
+ char PrintDirection,
+ Int16 sFirstNozzle,
+ Int16 sLastNozzle)
+{
+ DRIVER_ERROR err;
+ // determine how many colors will be generated
+ UInt16 colorcount = 0;
+ UInt32 uiAffectedColors = 0;
+ if (ColorPresent == true) colorcount += 3;
+ if (BlackPresent == true) colorcount++;
+ if (PhotoPresent == true)
+ {
+ if (ColorPresent == false)
+ colorcount++;
+ else
+ colorcount+=3;
+ }
+
+ UInt16 mem_needed;
+ if (m_lidil_version == 1)
+ {
+ mem_needed = SIZEOF_LDLHDR
+ + SIZEOF_LDL_PRTSWP_CMDOPT
+ + SIZEOF_LDL_PRTSWP_OPTFLDS
+ + SIZEOF_LDL_PRTSWP_COLROPT * colorcount
+ + SIZEOF_LDLTERM;
+
+ if (colorcount != 0)
+ mem_needed += SIZEOF_LDL_COLROPT_ACTIVECOLR;
+ }
+ else
+ {
+ mem_needed = SIZEOF_LDLHDR
+ + SIZEOF_LDL_PRTSWP_CMDOPT + 7
+ + SIZEOF_LDL_PRTSWP_OPTFLDS
+ + SIZEOF_LDL_PRTSWP_COLROPT + 4
+ + SIZEOF_LDLTERM;
+ }
+
+ memset (pcl_buffer, 0, mem_needed);
+ cur_pcl_buffer_ptr = pcl_buffer;
+
+ fillLidilHeader (NULL, eLDLPrintSweep, mem_needed);
+ if (m_lidil_version == 2)
+ {
+ *cur_pcl_buffer_ptr++ = 1; // Version number
+ }
+ addInt32 (SweepSize);
+ addInt32 (VerticalPosition);
+ addInt32 (m_iLeftMargin);
+ if (m_lidil_version == 1)
+ {
+ // LIDIL First Version
+ *cur_pcl_buffer_ptr++ = SWINGFMT_UNCOMPRSS;
+ }
+ else
+ {
+ // LIDIL Second Version
+ *cur_pcl_buffer_ptr++ = 1;
+ }
+ *cur_pcl_buffer_ptr++ = PrintDirection;
+ if (m_lidil_version == 2)
+ {
+ addInt32 (0); // Shingle mask
+ }
+ addInt32 (IPS_CARRSPEED|IPS_INIPRNSPEED|ACCURATEPOSN_NEEDED);
+ // Carriage Speed - 25 for plain, 12 for photo
+ if (m_pQA->print_quality == BEST_QUALITY && m_pQA->media_type == MEDIATYPE_PHOTO)
+ *cur_pcl_buffer_ptr++ = 12;
+ else
+ *cur_pcl_buffer_ptr++ = 25;
+ *cur_pcl_buffer_ptr++ = 4; // Initial Print Speed
+ *cur_pcl_buffer_ptr++ = 1; // Need Accurate Position
+ if (m_lidil_version == 2)
+ {
+ *cur_pcl_buffer_ptr++ = 1; // Number of entries in the sweep
+ }
+
+ // fill in the color information
+ if (colorcount == 0)
+ {
+ *cur_pcl_buffer_ptr++ = NO_ACTIVE_COLORS;
+ *cur_pcl_buffer_ptr++ = FRAME_SYN;
+ // write out the data
+ err = Cleanup();
+ return err;
+ }
+
+ // figure out what are the active colors and fill in the optional color fields.
+
+ UInt16 colrpresent = 0;
+ UInt16 colr_found=0;
+ UInt16 colormask = 0x01;
+ UInt16 offset = eLDLBlack;
+ UInt16 iDataRes;
+ UInt16 iPrintRes;
+ uiAffectedColors = offset;
+ if (BlackPresent == true)
+ {
+ uiAffectedColors = 0x1;
+ }
+ if(BlackPresent == false && PhotoPresent == false)
+ {
+ offset = eLDLCyan;
+ colormask=0x02;
+ uiAffectedColors |= 0x0000000e;
+ }
+ else if (BlackPresent == false && PhotoPresent == true)
+ {
+ if (ColorPresent == true)
+ {
+ offset = eLDLCyan;
+ colormask=0x02;
+ uiAffectedColors |= 0x0000007e;
+ }
+ else
+ {
+ offset = eLDLLoBlack;
+ colormask=0x40;
+ uiAffectedColors |= 0x00000070;
+ }
+ }
+
+ int actv_colr_index = cur_pcl_buffer_ptr - pcl_buffer;
+ int iColorRes = 300;
+ if (m_lidil_version == 1)
+ {
+ cur_pcl_buffer_ptr += 2;
+ }
+ else
+ {
+ iColorRes = 600;
+ }
+ for(UInt16 i = offset; colr_found < colorcount && i < eLDLMaxColor; i++)
+ {
+ colr_found++;
+ colrpresent = colrpresent | colormask;
+
+ if (m_lidil_version == 2)
+ {
+ addInt32 (uiAffectedColors);
+ }
+ addInt32 (LeftEdge);
+ addInt32 (RightEdge);
+ addInt32 (LeftEdge);
+ addInt32 (RightEdge);
+
+ if ((i == 0 && m_lidil_version == 1) || (BlackPresent && m_lidil_version == 2))
+ {
+ iDataRes = 600;
+ iPrintRes = m_iBlackPenResolution;
+ }
+ else
+ {
+ iDataRes = iColorRes; // 300;
+ iPrintRes = iColorRes; // 300;
+ }
+ addInt16 (iDataRes); // Vertical Data Resolution
+ addInt16 (iPrintRes); // Vertical Print Resolution
+
+ if (m_lidil_version == 2)
+ {
+ addInt16 (m_pQA->horizontal_resolution * m_iBitDepth); // Horizontal Data Resolution // Collie
+ }
+ else
+ {
+ addInt16 (m_pQA->horizontal_resolution);
+ }
+
+ if (m_pQA->horizontal_resolution == 300)
+ {
+ addInt16 (600); // Force 2 drop for draft mode.
+ }
+ else
+ {
+ if (m_lidil_version == 2)
+ {
+ addInt16 (m_pQA->horizontal_resolution * m_iBitDepth); // Horizontal Print Resolution // Collie
+ }
+ else
+ {
+ addInt16 (m_pQA->horizontal_resolution);
+ }
+ }
+ addInt16 (sFirstNozzle);
+ if (sLastNozzle == 0)
+ {
+ int iTmp = m_iRasterCount / m_pPM->dyeCount;;
+ if (m_lidil_version == 2)
+ {
+ addInt16 (sFirstNozzle - 1 + ((iTmp * iPrintRes) / (m_pQA->vertical_resolution * m_iBitDepth))); // Collie
+ }
+ else
+ {
+ addInt16 (sFirstNozzle - 1 + ((iTmp * iPrintRes) / (m_pQA->vertical_resolution)));
+ }
+ }
+ else
+ {
+ addInt16 (sLastNozzle);
+ }
+
+ *cur_pcl_buffer_ptr++ = 0; // Vertical Alignment
+ colormask = colormask << 1;
+ if (m_lidil_version == 2)
+ {
+ break;
+ }
+ }
+ // write the active color field
+ if (m_lidil_version == 1)
+ {
+ BYTE *tmp = cur_pcl_buffer_ptr;
+ cur_pcl_buffer_ptr = pcl_buffer + actv_colr_index;
+ addInt16 (colrpresent);
+ cur_pcl_buffer_ptr = tmp;
+ }
+
+ if (m_lidil_version == 2)
+ {
+ *cur_pcl_buffer_ptr++ = 0; // # of entries in the shingle array
+ }
+ *cur_pcl_buffer_ptr++ = FRAME_SYN;
+
+ // write out the data
+ err = Cleanup();
+ return err;
+}
+
+DRIVER_ERROR Lidil::allocateSwathBuffers()
+{
+ int size = m_pMA->printable_width;
+ size = (size + 7) / 8;
+ m_iImageWidth = size;
+ m_ldlCompressData = NULL;
+ if (m_lidil_version == 1)
+ {
+// m_ldlCompressData = new comp_ptrs_t;
+ }
+
+ if (m_iBitDepth == 2)
+ {
+ size *= 2;
+ }
+
+ int iCompressBufSize = (m_iBytesPerSwing / 2) * LDL_MAX_IMAGE_SIZE+20; // additional space for load sweep command
+ m_szCompressBuf = new BYTE[iCompressBufSize];
+ if (m_szCompressBuf == NULL)
+ return ALLOCMEM_ERROR;
+ memset (m_szCompressBuf, 0, iCompressBufSize);
+
+ BYTE *p = NULL;
+ int iSwathBuffSize;
+
+ m_sSwathHeight = SWATH_HEIGHT;
+
+/*
+ * This swath buffer cannot be greater than the number of nozzles - 400 for black
+ * and 100 for color - we can use.
+ */
+
+ int iAdjHeight = (m_iNumBlackNozzles / 32) * 8;
+ if (m_pPM->dyeCount == 1)
+ {
+ m_sSwathHeight = m_sSwathHeight * 4;
+ if ((int) (m_sSwathHeight * 1200 / m_pQA->vertical_resolution) > m_iNumBlackNozzles)
+ m_sSwathHeight = m_pQA->vertical_resolution / 3;
+ }
+ else if (m_pQA->print_quality != DRAFT_QUALITY && m_pQA->vertical_resolution > 300 && m_pPM->dyeCount > 1 && m_iBitDepth == 1) // Collie change
+ {
+ m_sSwathHeight = (m_sSwathHeight / 4) * 4 * 2;
+ if (m_sSwathHeight > 200)
+ m_sSwathHeight = 200;
+ }
+ else if (m_iBitDepth == 2)
+ m_sSwathHeight = iAdjHeight * 4;
+
+ if (m_pQA->print_quality == NORMAL_QUALITY)
+ m_sSwathHeight = iAdjHeight * 2;
+
+ if (m_pQA->print_quality == DRAFT_QUALITY && m_pPM->dyeCount != 1)
+ {
+ m_sSwathHeight *= m_iBytesPerSwing / 2;
+ }
+
+ iSwathBuffSize = m_pPM->dyeCount * sizeof (BYTE *) +
+ m_pPM->dyeCount * m_sSwathHeight * sizeof (BYTE *) +
+ size * m_pPM->dyeCount * m_sSwathHeight;
+ if ((p = new BYTE[iSwathBuffSize]) == NULL)
+ {
+ return ALLOCMEM_ERROR;
+ }
+
+ int i;
+ m_SwathData = (BYTE ***) p;
+ for (i = 0; i < (int) m_pPM->dyeCount; i++)
+ m_SwathData[i] = (BYTE **) (p + sizeof (BYTE *) * m_pPM->dyeCount + i * m_sSwathHeight * sizeof (BYTE *));
+
+ for (i = 0; i < (int) m_pPM->dyeCount; i++)
+ {
+ p = (BYTE *) m_SwathData + sizeof (BYTE *) * m_pPM->dyeCount +
+ m_pPM->dyeCount * m_sSwathHeight * sizeof (BYTE *) +
+ size * m_sSwathHeight * i;
+ for (int j = 0; j < m_sSwathHeight; j++)
+ {
+ memset (p, 0, size);
+ m_SwathData[i][j] = p;
+ p = p + size;
+ }
+ }
+
+ if (m_pQA->print_quality != DRAFT_QUALITY && m_pQA->vertical_resolution != 300)
+ {
+ m_iRasterCount = (m_sSwathHeight - m_sSwathHeight / (4*m_iBitDepth)) * m_pPM->dyeCount;
+ m_iVertPosn -= (((m_sSwathHeight - m_sSwathHeight / (4*m_iBitDepth)) * 600 / m_pQA->vertical_resolution) * DEVUNITS_XBOW / 600);
+ }
+ m_cPassNumber = 0;
+
+ if (m_pJA->print_borderless)
+ {
+ if (m_iVertPosn < -850) m_iVertPosn = -850;
+ }
+ else
+ {
+ if (m_iVertPosn < -600) m_iVertPosn = -600;
+ }
+ if (m_iBitDepth == 2)
+ m_iVertPosn += 6;
+ return NO_ERROR;
+}
+
+unsigned int Lidil::getSwathWidth (int iStart, int iLast, int iWidth)
+{
+ int k;
+ int i, j;
+ for (i = iWidth - 1; i > -1; i--)
+ {
+ for (j = iStart; j < iLast; j++)
+ {
+ for (k = m_iRasterCount / m_pPM->dyeCount-1; k >= 0; k--)
+ {
+
+ if (m_SwathData[j][k][i])
+ {
+ return (i+1);
+ }
+ }
+ }
+ }
+
+ return 0;
+}
+
+DRIVER_ERROR Lidil::processSwath()
+{
+ DRIVER_ERROR err = NO_ERROR;
+ Int16 sCurSwathHeight = m_iRasterCount / m_pPM->dyeCount;
+ m_iVertPosn += ((m_iBlankRasters) * 600 / m_pQA->vertical_resolution) * DEVUNITS_XBOW / 600;
+ m_iBlankRasters = 0;
+
+ bool bColorPresent = true;
+ bool bBlackPresent = true;
+ bool bPhotoPresent = true;
+ short sColorSize = 0;
+ int LeftEdge = 0;
+ BYTE csavMask;
+
+ if (m_pPM->dyeCount == 1)
+ {
+ bColorPresent = false;
+ bPhotoPresent = false;
+ }
+ if (m_pPM->dyeCount == 3)
+ {
+ bBlackPresent = false;
+ bPhotoPresent = false;
+ }
+ if (m_pPM->dyeCount == 6)
+ {
+ bBlackPresent = false;
+ }
+ if (m_pPM->dyeCount == 4)
+ {
+ bPhotoPresent = false;
+ }
+
+ if (!m_bBidirectionalPrintingOn)
+ m_cPrintDirection = PRNDRN_LEFTTORIGHT;
+
+ int iStartRaster = m_cPassNumber % (2 * m_iBitDepth);
+ BYTE mask = 0xFF;
+
+ if (m_lidil_version == 2)
+ {
+ iStartRaster = 0; // Version 2 - REVISIT
+ }
+
+ if (m_pQA->print_quality != DRAFT_QUALITY && m_pQA->vertical_resolution != 300)
+ {
+ if ((m_cPassNumber % (4 * m_iBitDepth)) < (2 * m_iBitDepth))
+ mask = 0xAA;
+ else
+ mask = 0x55;
+ }
+ csavMask = mask;
+
+/*
+ * Check if RefCount is close to overflow of 65k.
+ */
+
+ if (m_sRefCount > 64000)
+ m_sRefCount = 6;
+
+/*
+ * Photo Swath
+ */
+
+ err = processPhotoSwath(bPhotoPresent, bColorPresent, mask);
+ if (err != NO_ERROR)
+ return err;
+
+/*
+ * Color Swath
+ */
+
+ err = processColorSwath(bPhotoPresent, bColorPresent, bBlackPresent, &sColorSize, mask);
+ if (err != NO_ERROR)
+ return err;
+/*
+ * Black Swath
+ */
+
+ err = processBlackSwath(bBlackPresent, bColorPresent, sColorSize, LeftEdge, csavMask);
+
+ m_iRasterCount = 0;
+
+ if (m_pQA->print_quality != DRAFT_QUALITY && m_pQA->vertical_resolution != 300)
+ {
+ m_cPassNumber = (m_cPassNumber + 1) % (4 * m_iBitDepth);
+ m_iVertPosn += ((((sCurSwathHeight/(4 * m_iBitDepth))) * 600 / m_pQA->vertical_resolution) * DEVUNITS_XBOW / 600) / m_iBitDepth;
+ if (m_iBitDepth == 1)
+ {
+ if (m_cPassNumber % 2)
+ m_iVertPosn += 4;
+ else
+ m_iVertPosn -= 4;
+ }
+ else
+ {
+ m_iVertPosn -= 2;
+ if ((m_cPassNumber % 4) == 0)
+ m_iVertPosn += (DEVUNITS_XBOW / m_iColorPenResolution);
+ }
+ m_iRasterCount = (sCurSwathHeight - sCurSwathHeight / (4 * m_iBitDepth)) * m_pPM->dyeCount;
+ }
+ else
+ {
+ m_iVertPosn += ((sCurSwathHeight * 4 * 600) / m_pQA->vertical_resolution);
+
+ }
+
+ return err;
+}
+
+DRIVER_ERROR Lidil::processPhotoSwath(bool bPhotoPresent,
+ bool bColorPresent,
+ BYTE mask)
+{
+ if (!bPhotoPresent)
+ {
+ return NO_ERROR;
+ }
+
+ BYTE csavMask = mask;
+ int iOffset = 0;
+ int i;
+ int j;
+ int n;
+ int count;
+ int size;
+ int start;
+ DRIVER_ERROR err = NO_ERROR;
+ int sCurSwathHeight = m_iRasterCount / m_pPM->dyeCount;
+ unsigned int uiSwathSize;
+ int LeftEdge = 0;
+ int RightEdge;
+ int iStartRaster = 0;
+ int delta;
+ int iColors = 1;
+ int LastColor = 1;
+ int StartColor = 0;
+ int width = m_iImageWidth;
+ if (bColorPresent)
+ {
+ iColors = 6;
+ LastColor = 6;
+ StartColor = 0;
+ if (m_lidil_version != 1)
+ {
+ width *= m_iBitDepth;
+ }
+ }
+ size = getSwathWidth (StartColor, LastColor, width);
+ if (size == 0)
+ return NO_ERROR;
+
+ if (size % m_iBytesPerSwing)
+ size = ((size/m_iBytesPerSwing) + 1) * m_iBytesPerSwing;
+ if (m_lidil_version == 1)
+ {
+ RightEdge = LeftEdge + (size * 8 * 600 / m_pQA->horizontal_resolution - 1 * (600 / m_pQA->vertical_resolution)) *
+ (DEVUNITS_XBOW / 600);
+ }
+ else
+ {
+ RightEdge = LeftEdge + (size * 8 * 600 / m_pQA->horizontal_resolution - 1 * (600 / m_pQA->vertical_resolution)) *
+ (DEVUNITS_XBOW / (600 * m_iBitDepth));
+ }
+ Int16 sLastNozzle;
+ Int16 sFirstNozzle = 1;
+ unsigned int uSweepSize;
+ int jDelta = m_pQA->vertical_resolution / m_iColorPenResolution;
+ jDelta *= m_iBitDepth;
+
+ uiSwathSize = size * iColors * sCurSwathHeight / jDelta;
+
+ uSweepSize = sCurSwathHeight * m_iBytesPerSwing / jDelta;
+ n = LDL_MAX_IMAGE_SIZE / (uSweepSize);
+ count = 0;
+
+ if (m_iBitDepth == 2)
+ iStartRaster = (4 - (iStartRaster+1)) % 4;
+
+ if (m_lidil_version == 2)
+ {
+ iStartRaster = 0; // Collie - REVISIT
+ }
+
+ sLastNozzle = sFirstNozzle - 1 + sCurSwathHeight / jDelta;
+
+ BYTE *cb = m_szCompressBuf + 16; // load sweep command
+ memset (m_szCompressBuf, 0x0, LDL_MAX_IMAGE_SIZE * (m_iBytesPerSwing / 2));
+
+ // 1200 dpi split into two
+ int ib = 0;
+
+ if (m_pQA->vertical_resolution > 300 && m_pQA->print_quality != DRAFT_QUALITY)
+ {
+ iOffset = (sCurSwathHeight / (4 * m_iBitDepth));
+ iOffset = iOffset + iOffset * ((m_cPassNumber) % (4 * m_iBitDepth));
+ }
+
+ BYTE cVertAlign = 0;
+
+ if (bColorPresent)
+ {
+ cVertAlign = m_cPtoCVertAlign;
+ }
+
+ for (ib = 0; ib < (int) m_iBitDepth; ib++)
+ {
+ if (m_cPrintDirection == PRNDRN_RIGHTTOLEFT)
+ {
+ start = size - m_iBytesPerSwing;
+ delta = -m_iBytesPerSwing;
+ }
+ else
+ {
+ start = 0;
+ delta = m_iBytesPerSwing;
+ }
+
+ err = printSweep (uiSwathSize, bColorPresent, false, bPhotoPresent,
+ m_iVertPosn+cVertAlign, LeftEdge, RightEdge, m_cPrintDirection,
+ sFirstNozzle, sLastNozzle);
+ ERRCHECK;
+
+ i = start + ib * m_iImageWidth; // 1200 dpi split into two
+ for (int l = 0; l < size; l += m_iBytesPerSwing) // Collie
+ {
+ for (int k = StartColor+1; k < LastColor; k++)
+ {
+ mask = csavMask;
+ for (j = iOffset + iStartRaster; j < sCurSwathHeight; j += jDelta)
+ {
+ for (int is = 0; is < m_iBytesPerSwing; is++)
+ {
+ *cb++ = m_SwathData[k][j][i+is] & mask;
+ }
+ mask = ~mask;
+ }
+ for (j = iStartRaster; j < iOffset; j += jDelta)
+ {
+ for (int is = 0; is < m_iBytesPerSwing; is++)
+ {
+ *cb++ = m_SwathData[k][j][i+is] & mask;
+ }
+ mask = ~mask;
+ }
+
+ count++;
+ if (count == n)
+ {
+ err = loadSweepData (m_szCompressBuf, (unsigned int) (cb - m_szCompressBuf-16));
+ memset (m_szCompressBuf, 0, LDL_MAX_IMAGE_SIZE * (m_iBytesPerSwing / 2));
+ cb = m_szCompressBuf+16;
+ count = 0;
+ ERRCHECK;
+ }
+ }
+ mask = csavMask;
+ for (j = iOffset + iStartRaster; j < sCurSwathHeight; j += jDelta)
+ {
+ for (int is = 0; is < m_iBytesPerSwing; is++)
+ {
+ *cb++ = m_SwathData[0][j][i + is] & mask;
+ }
+ mask = ~mask;
+ }
+ for (j = iStartRaster; j < iOffset; j += jDelta)
+ {
+ for (int is = 0; is < m_iBytesPerSwing; is++)
+ {
+ *cb++ = m_SwathData[0][j][i + is] & mask;
+ }
+ mask = ~mask;
+ }
+
+ count++;
+ if (count == n)
+ {
+ err = loadSweepData (m_szCompressBuf, (unsigned int) (cb - m_szCompressBuf-16));
+ memset (m_szCompressBuf, 0, LDL_MAX_IMAGE_SIZE * (m_iBytesPerSwing / 2));
+ cb = m_szCompressBuf+16;
+ count = 0;
+ ERRCHECK;
+ }
+ i = i + delta;
+ }
+ if (count != 0)
+ {
+ err = loadSweepData (m_szCompressBuf, (unsigned int) (cb - m_szCompressBuf-16));
+ memset (m_szCompressBuf, 0, LDL_MAX_IMAGE_SIZE * (m_iBytesPerSwing / 2));
+ cb = m_szCompressBuf+16;
+ count = 0;
+ ERRCHECK;
+ }
+
+ if (m_bBidirectionalPrintingOn)
+ m_cPrintDirection = (m_cPrintDirection + 1) % 2;
+
+ if (m_lidil_version == 2) // Collie
+ {
+ break;
+ }
+ LeftEdge += 2;
+ RightEdge += 2;
+
+ } // 1200 dpi split into two - end of for ib = 0 loop
+ return err;
+}
+
+DRIVER_ERROR Lidil::processColorSwath(bool bPhotoPresent,
+ bool bColorPresent,
+ bool bBlackPresent,
+ short *sColorSize,
+ BYTE mask)
+{
+ BYTE csavMask = mask;
+ int iStartRaster = 0;
+ int LeftEdge = 0;
+ int RightEdge;
+ unsigned int start;
+ int size;
+ unsigned int delta;
+ int i;
+ int j;
+ int n;
+ int count;
+ int iOffset = 0;
+ DRIVER_ERROR err = NO_ERROR;
+ int sCurSwathHeight = m_iRasterCount / m_pPM->dyeCount;
+ unsigned int uiSwathSize;
+ if (bPhotoPresent || !bColorPresent)
+ {
+ return NO_ERROR;
+ }
+
+ int iColors = 3;
+ int LastColor = 4;
+ int StartColor = 1;
+ if (!bBlackPresent)
+ {
+ StartColor = 0;
+ LastColor = 3;
+ }
+ if (m_lidil_version == 1)
+ {
+ // 1200 dpi split into two
+ size = getSwathWidth (StartColor, LastColor, m_iImageWidth/* * m_iBitDepth*/);
+ }
+ else
+ {
+ size = getSwathWidth (StartColor, LastColor, m_iImageWidth * m_iBitDepth);
+ }
+ *sColorSize = size;
+ if (size == 0)
+ {
+ return NO_ERROR;
+ }
+
+ if (size % m_iBytesPerSwing)
+ size = ((size / m_iBytesPerSwing) + 1) * m_iBytesPerSwing;
+
+ if (m_lidil_version == 1)
+ {
+ RightEdge = LeftEdge + (size * 8 * 600 / m_pQA->horizontal_resolution - 1 * (600 / m_pQA->vertical_resolution)) *
+ (DEVUNITS_XBOW / 600);
+ }
+ else
+ {
+ RightEdge = LeftEdge + (size * 8 * 600 / m_pQA->horizontal_resolution - 1 * (600 / m_pQA->vertical_resolution)) *
+ (DEVUNITS_XBOW / (600 * m_iBitDepth));
+ }
+ Int16 sLastNozzle;
+ Int16 sFirstNozzle = 1;
+ unsigned int uSweepSize;
+ int jDelta = m_pQA->vertical_resolution / m_iColorPenResolution;
+ jDelta *= m_iBitDepth;
+
+ uiSwathSize = size * iColors * sCurSwathHeight / jDelta;
+
+ uSweepSize = sCurSwathHeight * m_iBytesPerSwing / jDelta;
+ n = LDL_MAX_IMAGE_SIZE / (uSweepSize);
+ count = 0;
+
+ if (m_iBitDepth == 2)
+ {
+ iStartRaster = (4 - (iStartRaster+1)) % 4;
+ if (m_lidil_version == 2)
+ {
+ iStartRaster = m_cPassNumber % (m_iBitDepth);
+ }
+ }
+
+ sLastNozzle = sFirstNozzle - 1 + sCurSwathHeight / jDelta;
+
+ BYTE *cb = m_szCompressBuf + 16; // load sweep command
+ memset (m_szCompressBuf, 0x0, LDL_MAX_IMAGE_SIZE * (m_iBytesPerSwing / 2));
+
+ // 1200 dpi split into two
+ int ib = 0;
+
+ if (m_pQA->vertical_resolution > 300 && m_pQA->print_quality != DRAFT_QUALITY)
+ {
+ iOffset = (sCurSwathHeight / (4 * m_iBitDepth));
+ iOffset = iOffset + iOffset * ((m_cPassNumber) % (4 * m_iBitDepth));
+ }
+
+ for (ib = 0; ib < (int) m_iBitDepth; ib++)
+ {
+ if (m_cPrintDirection == PRNDRN_RIGHTTOLEFT)
+ {
+ start = size - m_iBytesPerSwing;
+ delta = -m_iBytesPerSwing;
+ }
+ else
+ {
+ start = 0;
+ delta = m_iBytesPerSwing;
+ }
+ err = printSweep (uiSwathSize, bColorPresent, false, false,
+ m_iVertPosn, LeftEdge, RightEdge, m_cPrintDirection,
+ sFirstNozzle, sLastNozzle);
+ ERRCHECK;
+
+ i = start + ib * m_iImageWidth; // 1200 dpi split into two
+ for (int l = 0; l < size; l += m_iBytesPerSwing) // Collie
+ {
+ for (int k = StartColor; k < LastColor; k++)
+ {
+ mask = csavMask;
+ for (j = iOffset + iStartRaster; j < sCurSwathHeight; j += jDelta)
+ {
+ for (int is = 0; is < m_iBytesPerSwing; is++)
+ {
+ *cb++ = m_SwathData[k][j][i + is] & mask;
+ }
+ mask = ~mask;
+ }
+ for (j = iStartRaster; j < iOffset; j += jDelta)
+ {
+ for (int is = 0; is < m_iBytesPerSwing; is++)
+ {
+ *cb++ = m_SwathData[k][j][i + is] & mask;
+ }
+ mask = ~mask;
+ }
+
+ count++;
+ if (count == n)
+ {
+ err = loadSweepData (m_szCompressBuf, (unsigned int) (cb - m_szCompressBuf-16));
+ memset (m_szCompressBuf, 0, LDL_MAX_IMAGE_SIZE * (m_iBytesPerSwing / 2));
+
+ cb = m_szCompressBuf+16;
+ count = 0;
+ ERRCHECK;
+ }
+
+ }
+ i = i + delta;
+
+ }
+ if (count != 0)
+ {
+ err = loadSweepData (m_szCompressBuf, (unsigned int) (cb - m_szCompressBuf-16));
+ memset (m_szCompressBuf, 0, LDL_MAX_IMAGE_SIZE * (m_iBytesPerSwing / 2));
+
+ cb = m_szCompressBuf+16;
+ count = 0;
+ ERRCHECK;
+ }
+
+ LeftEdge += 2;
+ RightEdge += 2;
+
+ if (m_bBidirectionalPrintingOn)
+ m_cPrintDirection = (m_cPrintDirection + 1) % 2;
+ if (m_lidil_version == 2) // Collie
+ {
+ break;
+ }
+
+ } // 1200 dpi split into two - end of for ib = 0 loop
+ return err;
+}
+
+DRIVER_ERROR Lidil::processBlackSwath(bool bBlackPresent,
+ bool bColorPresent,
+ short sColorSize,
+ int LeftEdge,
+ BYTE mask)
+{
+ Int32 RightEdge;
+ unsigned int start;
+ unsigned int delta;
+ int i;
+ int j;
+ int n;
+ int count;
+ int iOffset = 0;
+ DRIVER_ERROR err = NO_ERROR;
+ int sCurSwathHeight = m_iRasterCount / m_pPM->dyeCount;
+ unsigned int uiSwathSize;
+
+ if (!bBlackPresent)
+ {
+ return NO_ERROR;
+ }
+ int size = getSwathWidth (0, 1, m_iImageWidth);
+ if (size == 0)
+ return NO_ERROR;
+
+ if (size % m_iBytesPerSwing)
+size = ((size/m_iBytesPerSwing) + 1) * m_iBytesPerSwing;
+
+ RightEdge = LeftEdge + (size * 8 * 600 / m_pQA->horizontal_resolution - 1 * (600 / m_pQA->vertical_resolution)) * DEVUNITS_XBOW/600;
+ if (m_iBitDepth != 2 && ((m_cPassNumber % 2) == 0 || m_pQA->print_quality == DRAFT_QUALITY))
+ {
+ Int16 sLastNozzle = 0;
+ Int16 sFirstNozzle = 1;
+
+ int xDelta = 0;
+ BYTE cVertAlign = 0;
+
+ if (bColorPresent)
+ {
+ cVertAlign = m_cKtoCVertAlign;
+ }
+
+ if (bColorPresent && sColorSize && m_bBidirectionalPrintingOn)
+ m_cPrintDirection = PRNDRN_RIGHTTOLEFT;
+ if (m_cPrintDirection == PRNDRN_RIGHTTOLEFT)
+ {
+ start = size - m_iBytesPerSwing;
+ delta = -m_iBytesPerSwing;
+ }
+ else
+ {
+ start = 0;
+ delta = m_iBytesPerSwing;
+ }
+ if (m_pQA->vertical_resolution == 300)
+ xDelta = m_iBytesPerSwing;
+ uiSwathSize = ((size/m_iBytesPerSwing) * sCurSwathHeight * m_iBytesPerSwing * (600 * m_iBitDepth)/ m_pQA->vertical_resolution);
+
+ if (m_lidil_version == 2 && m_pPM->dyeCount != 1)
+ {
+ sFirstNozzle = 9;
+ }
+
+ err = printSweep (uiSwathSize, false, bBlackPresent, false,
+ (m_iVertPosn + cVertAlign), LeftEdge, RightEdge, m_cPrintDirection, sFirstNozzle, sLastNozzle);
+ ERRCHECK;
+
+ i = start;
+ BYTE *cb = m_szCompressBuf+16;
+ memset (m_szCompressBuf, 0x0, LDL_MAX_IMAGE_SIZE * (m_iBytesPerSwing / 2));
+
+ n = LDL_MAX_IMAGE_SIZE / (sCurSwathHeight * m_iBytesPerSwing * 600 / m_pQA->vertical_resolution);
+ count = 0;
+ iOffset = 0;
+ if (m_pQA->vertical_resolution > 300 && m_pQA->print_quality != DRAFT_QUALITY)
+ {
+ iOffset = sCurSwathHeight / 4;
+ iOffset = iOffset + iOffset * (m_cPassNumber % 4);
+ }
+
+ for (int l = 0; l < size; l += m_iBytesPerSwing) // Collie
+ {
+ for (j = iOffset; j < sCurSwathHeight; j++)
+ {
+ for (int is = 0; is < m_iBytesPerSwing; is++)
+ {
+ *cb++ = m_SwathData[0][j][i + is] & mask;
+ }
+ cb += xDelta;
+ }
+ for (j = 0; j < iOffset; j++)
+ {
+ for (int is = 0; is < m_iBytesPerSwing; is++)
+ {
+ *cb++ = m_SwathData[0][j][i + is] & mask;
+ }
+ cb += xDelta;
+ }
+
+ count++;
+ if (count == n)
+ {
+ err = loadSweepData (m_szCompressBuf, (unsigned int) (cb - m_szCompressBuf-16));
+ memset (m_szCompressBuf, 0, LDL_MAX_IMAGE_SIZE * (m_iBytesPerSwing / 2));
+
+ cb = m_szCompressBuf+16;
+ count = 0;
+ ERRCHECK;
+ }
+ i = i + delta;
+ }
+ if (count != 0)
+ {
+ err = loadSweepData (m_szCompressBuf, (unsigned int) (cb - m_szCompressBuf-16));
+ memset (m_szCompressBuf, 0, LDL_MAX_IMAGE_SIZE * (m_iBytesPerSwing / 2));
+
+ cb = m_szCompressBuf+16;
+ count = 0;
+ ERRCHECK;
+ }
+
+ if (m_bBidirectionalPrintingOn)
+ m_cPrintDirection = (m_cPrintDirection + 1) % 2;
+ }
+ return err;
+}
+
+bool Lidil::isBlankRaster(BYTE *raster, int width)
+{
+ if (*raster == 0 && !memcmp(raster+1, raster, width-1))
+ return true;
+ return false;
+}
+
+void Lidil::applyShingleMask(int iCPlane, BYTE *input)
+{
+ // do the dotmapping here
+ BYTE cbyte1, cbyte2;
+ BYTE c1, c2;
+ int j = 0;
+ BYTE r1b1 = 0;
+ BYTE r1b2 = 0;
+ BYTE r2b1 = 0;
+ BYTE r2b2 = 0;
+ BYTE bitmask[8] = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01};
+
+ // Collie changes
+ int iNextBitPos = m_iImageWidth;
+ int iJIncrement = 1;
+ if (m_lidil_version == 2)
+ {
+ iNextBitPos = 1;
+ iJIncrement = 2;
+ }
+
+ // Previous row
+ memcpy (m_szCompressBuf, m_SwathData[iCPlane][m_iNextRaster], m_iImageWidth);
+
+ static BYTE rand_table[4][4] = {{0, 3, 1, 2},
+ {3, 1, 2, 0},
+ {1, 2, 0, 3},
+ {2, 0, 3, 1}};
+
+ BYTE rt1, rt2;
+ rt1 = m_iNextRaster % 4;
+
+ for (int i = 0; i < m_iImageWidth; i++)
+ {
+ cbyte2 = m_szCompressBuf[i];
+ cbyte1 = (input == NULL) ? 0 : input[i];
+
+// 1200 dpi raster split into 2 600 dpi rasters
+
+ r1b1 = 0;
+ r1b2 = 0;
+ r2b1 = 0;
+ r2b2 = 0;
+
+ for (int ibit = 0; ibit < 8; ibit++)
+ {
+ c1 = (cbyte1 & bitmask[ibit]) ? 1 : 0;
+ c2 = (cbyte2 & bitmask[ibit]) ? 1 : 0;
+ c1 = 2 * c1 + c2;
+
+ rt2 = (i + ibit) % 4;
+ rt2 = rand_table[rt1][rt2];
+
+ if (c1 == 2)
+ {
+ if (rt2 == 0)
+ {
+ r1b1 = r1b1 | (0xff & (cbyte1 & bitmask[ibit]));
+ r2b2 = r2b2 | (0xff & bitmask[ibit]);
+ }
+ else if (rt2 == 1)
+ {
+ r1b2 = r1b2 | (0xff & bitmask[ibit]);
+ r2b1 = r2b1 | (0xff & bitmask[ibit]);
+ }
+
+ else if (rt2 == 2)
+ {
+ r1b1 = r1b1 | (0xff & bitmask[ibit]);
+ r2b1 = r2b1 | (0xff & bitmask[ibit]);
+ }
+ else if (rt2 == 3)
+ {
+ r1b2 = r1b2 | (0xff & bitmask[ibit]);
+ r2b2 = r2b2 | (0xff & bitmask[ibit]);
+ }
+
+ }
+ else if (c1 == 1)
+ {
+ if (rt2 == 0)
+ r1b1 = r1b1 | (0xff & bitmask[ibit]);
+ else if (rt2 == 1)
+ r1b2 = r1b2 | (0xff & bitmask[ibit]);
+ else if (rt2 == 2)
+ r2b1 = r2b1 | (0xff & bitmask[ibit]);
+ else
+ r2b2 = r2b2 | (0xff & bitmask[ibit]);
+
+ }
+ else if (c1 == 3)
+ {
+ r1b1 = r1b1 | (0xff & bitmask[ibit]);
+ r1b2 = r1b2 | (0xff & bitmask[ibit]);
+ r2b1 = r2b1 | (0xff & bitmask[ibit]);
+ r2b2 = r2b2 | (0xff & bitmask[ibit]);
+ }
+ }
+ m_SwathData[iCPlane][m_iNextRaster][j] = r1b1;
+ m_SwathData[iCPlane][m_iNextRaster][j+iNextBitPos] = r1b2;
+ m_SwathData[iCPlane][m_iNextRaster+1][j] = r2b1;
+ m_SwathData[iCPlane][m_iNextRaster+1][j+iNextBitPos] = r2b2;
+
+ j += iJIncrement;
+ }
+}
+
diff --git a/prnt/hpcups/Lidil.h b/prnt/hpcups/Lidil.h
new file mode 100644
index 0000000..77b5e6b
--- /dev/null
+++ b/prnt/hpcups/Lidil.h
@@ -0,0 +1,209 @@
+/*****************************************************************************\
+ Lidil.h : Interface for Lidil class
+
+ Copyright (c) 1996 - 2009, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+#ifndef LIDIL_H
+#define LIDIL_H
+
+class LidilCompress;
+
+#define SWATH_HEIGHT 100
+#define DEVUNITS_XBOW 2400
+
+const int CANCELSIZE = 16;
+const int SYNCSIZE = 2304;
+const int SYNC_CMD_OPT_SIZE = 245;
+
+typedef enum
+{
+ eLDLStartJob = 0,
+ eLDLEndJob = 0,
+ eLDLLoadPage = 1,
+ eLDLEjectPage = 2,
+ eLDLPrintSweep = 3,
+ eLDLLoadSweepData = 4,
+ eLDLQueryPrinter = 5,
+ eLDLComments = 7,
+ eLDLHandlePen = 8,
+ eLDLControl = 12,
+ eLDLDataStreamVersion = 12
+} LDLCMD;
+
+typedef enum
+{
+ eLDLUnknownColor = -1,
+ eLDLBlack,
+ eLDLCyan,
+ eLDLMagenta,
+ eLDLYellow,
+ eLDLLoCyan,
+ eLDLLoMagenta,
+ eLDLLoBlack,
+ eLDLMaxColor
+} COLORENUM;
+
+
+#define LDLPACKET_MINSIZE 16 // define the minimum packet size defined by the protocol
+#define FRAME_SYN '$' // defined the synchronization frame
+#define OPTIMIZED_DELAYLIMIT 0 // defined how many PrintSweep will be sent before the
+ // first LoadSweepData command
+
+#define LDL_MAX_IMAGE_SIZE 2048
+
+#define SIZEOF_LDLHDR 10
+#define SIZEOF_LDLTERM 1
+#define SIZEOF_LDL_JOB_CMDOPT 5
+
+// define possible operation field
+#define OPERATION_STJOB 0
+#define OPERATION_ENDJOB 1
+#define OPERATION_CANCJOB 2
+
+#define SIZEOF_LDL_LDPAGE_CMDOPT 17
+
+// defn for possible option field settings
+#define MEDIATYPE_PLAIN 0 // possible types for mediatype field
+#define MEDIATYPE_PHOTO 3
+
+#define MEDIASRC_MAINTRAY 0 // possible setting for mediasrc
+#define MEDIADEST_MAINBIN 0 // possible setting for mediadest
+
+#define DRAFT_QUALITY -1 // possible setting for quality
+#define NORMAL_QUALITY 0
+#define BEST_QUALITY 1
+#define MAXDPI_QIALITY 2
+
+#define SPECLOAD_NONE 0 // possible setting for specload
+#define SPECLOAD_ENVELOPE 1
+
+#define MEDIALD_SPEED 0x00000001 // bitfield defn for opt_fields
+#define NEED_TO_SERVICE_PERIOD 0x00000002
+#define MINTIME_BTW_SWEEP 0x00000004
+
+#define DEVUNITS_XBOW 2400 // Crossbow device units is 2400 dots per inch
+#define SIZEOF_LDL_LDPAGE_OPTFLDS 4
+#define SIZEOF_LDL_COLROPT_ACTIVECOLR 2
+#define NO_ACTIVE_COLORS 0
+#define SIZEOF_LDL_EJPAGE_CMDOPT 4
+#define MEDIA_EJSPEED 1 // bitfield defn for opt_fields
+#define SIZEOF_LDL_EJPAGE_OPTFLDS 1
+#define SIZEOF_LDL_PRTSWP_CMDOPT 18
+#define SWINGFMT_UNCOMPRSS 0 // define possible swing format
+#define PRNDRN_LEFTTORIGHT 0 // define the possible print direction
+#define PRNDRN_RIGHTTOLEFT 1
+
+#define IPS_CARRSPEED 0x00000001 // bitfield defn for printsweep optional field
+#define IPS_INIPRNSPEED 0x00000002
+#define IPS_MEDIASPEED 0x00000004
+#define PAPER_ACCURACY 0x00000008
+#define ACCURATEPOSN_NEEDED 0x00000010
+#define DRYTIME 0x00000020 // bit 6-31 undefined
+
+#define SIZEOF_LDL_PRTSWP_OPTFLDS 3
+#define SIZEOF_LDL_PRTSWP_COLROPT 29
+#define SIZEOF_LDL_LDSWPDATA_CMDOPT 2
+
+#define OPERATION_CONTINUE 2
+#define DATASTREAMVERSION 3
+#define OPERATION_SPIT_PEN 2
+
+class Lidil: public Encapsulator
+{
+public:
+ Lidil();
+ ~Lidil();
+ DRIVER_ERROR Encapsulate (RASTERDATA *InputRaster, bool bLastPlane);
+ DRIVER_ERROR StartJob(SystemServices *pSystemServices, JobAttributes *pJA);
+ DRIVER_ERROR EndJob();
+ DRIVER_ERROR StartPage(JobAttributes *pJA);
+ DRIVER_ERROR FormFeed();
+ DRIVER_ERROR Configure(Pipeline **pipeline);
+ DRIVER_ERROR SendCAPy (int iOffset);
+ void CancelJob();
+protected:
+ DRIVER_ERROR addJobSettings() {return NO_ERROR;}
+ DRIVER_ERROR flushPrinterBuffer() {return NO_ERROR;}
+private:
+ bool selectPrintMode();
+ bool selectPrintMode(int index);
+ DRIVER_ERROR allocateSwathBuffers();
+ void addInt32(Int32 iVal);
+ void addInt16(Int16 iVal);
+ void fillLidilHeader(void *pLidilHdr, int Command, UInt16 CmdLen, UInt16 DataLen = 0);
+ unsigned int getSwathWidth (int iStart, int iLast, int iWidth);
+ DRIVER_ERROR processSwath();
+ DRIVER_ERROR processBlackSwath(bool bBlackPresent, bool bColorPresent, short sColorSize, int LeftEdge, BYTE mask);
+ DRIVER_ERROR processColorSwath(bool bPhotoPresent, bool bColorPresent, bool bBlackPresent, short *sColorSize, BYTE mask);
+ DRIVER_ERROR processPhotoSwath(bool bPhotoPresent, bool bColorPresent, BYTE mask);
+ bool isBlankRaster(BYTE *raster, int width);
+ void applyShingleMask(int iCPlane, BYTE *input);
+ DRIVER_ERROR loadSweepData (BYTE *imagedata, int imagesize);
+ DRIVER_ERROR printSweep (UInt32 SweepSize,
+ bool ColorPresent,
+ bool BlackPresent,
+ bool PhotoPresent,
+ Int32 VerticalPosition,
+ Int32 LeftEdge,
+ Int32 RightEdge,
+ char PrintDirection,
+ Int16 sFirstNozzle,
+ Int16 sLastNozzle);
+
+ PrintMode *m_pPM;
+ bool m_bBidirectionalPrintingOn;
+ bool m_bPrevRowWasBlank;
+ bool m_bLittleEndian;
+ char m_cPassNumber;
+ char m_cPrintDirection;
+ char m_cKtoCVertAlign;
+ char m_cPtoCVertAlign;
+ char m_cPlaneNumber;
+ UInt16 m_sSwathHeight;
+ UInt16 m_sRefCount;
+ int m_iBitDepth;
+ int m_iNextRaster;
+ int m_iBlankRasters;
+ int m_iVertPosn;
+ int m_iImageWidth;
+ int m_iRasterCount;
+ int m_lidil_version;
+ int m_iBytesPerSwing;
+ int m_iColorPenResolution;
+ int m_iBlackPenResolution;
+ int m_iNumBlackNozzles;
+ int m_iNextColor;
+ int m_iLeftMargin;
+ BYTE *m_ldlCompressData;
+ BYTE *m_szCompressBuf;
+ BYTE ***m_SwathData;
+ LidilCompress *m_pLidilCompress;
+};
+
+#endif // LIDIL_H
+
diff --git a/prnt/hpcups/LidilCompress.cpp b/prnt/hpcups/LidilCompress.cpp
new file mode 100644
index 0000000..2dc8fbf
--- /dev/null
+++ b/prnt/hpcups/LidilCompress.cpp
@@ -0,0 +1,280 @@
+/*****************************************************************************\
+ LidilCompress.cpp : Implementation of LidilCompress class
+
+ Copyright (c) 1996 - 2009, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+#include "CommonDefinitions.h"
+#include "LidilCompress.h"
+
+UInt16 LidilCompress::FlushImage ()
+{
+ UInt16 command;
+ UInt16 wsize;
+ UInt16 bsize;
+ UInt16 *from_ptr;
+ int index;
+
+ wsize = m_image_cnt;
+ bsize = 0;
+
+ if (wsize)
+ {
+ from_ptr = m_image_ptr;
+
+ command = FILL_IMAGE_CMD | (wsize-1);
+
+ index = 0;
+ *m_out_ptr++ = command;
+ for (UInt16 i = 0; i < wsize; i++)
+ {
+ *m_out_ptr++ = *from_ptr++;
+ }
+ bsize = ((m_image_cnt+1) * 2);
+ m_out_cnt += bsize;
+
+ m_image_cnt = 0;
+ }
+
+ return bsize;
+}
+
+UInt16 LidilCompress::FlushCopy (UInt16 value)
+{
+ UInt16 command;
+ UInt16 size;
+
+ size = m_copy_cnt;
+ if (size)
+ {
+ UInt16 *uP = m_out_ptr++;
+ size = 2;
+ if (value == 0)
+ {
+ command = FILL_0000_CMD | (m_copy_cnt-1);
+ }
+ else if (value == 0xFFFF)
+ {
+ command = FILL_FFFF_CMD | (m_copy_cnt-1);
+ }
+ else
+ {
+ command = FILL_NEXT_CMD | (m_copy_cnt-1);
+ *m_out_ptr++ = value;
+ size = 4;
+ }
+
+ *uP = command;
+ m_out_cnt += size;
+ m_copy_cnt = 0;
+ }
+ return size;
+}
+
+void LidilCompress::CompressData (Int16 compressionmode)
+{
+ Int16 i;
+ UInt16 *in_ptr;
+ UInt16 in;
+ UInt16 last=0;
+ UInt16 copy_item;
+ UInt16 data_length;
+
+ LDLCOMPMODE mode = IN_NOT;
+
+
+ m_out_cnt = 0;
+ m_image_cnt = 0;
+ m_copy_cnt = 0;
+
+ m_out_ptr = &m_out_array[8];
+ data_length = m_data_length;
+
+ if ((data_length & 1) != 0)
+ {
+ // ErrorTrap((char *)"Data length is odd.");
+ }
+
+ copy_item = 0;
+ in_ptr = &m_raw_data[0];
+
+ for (i=0; i<data_length; i+=2)
+ {
+ in = *in_ptr;
+
+ switch(mode)
+ {
+ case IN_NOT:
+ {
+ /* default the first entry to 'image' */
+ last = in;
+ m_image_ptr = in_ptr;
+ m_image_cnt = 1;
+ mode = IN_FIRST;
+ break;
+ }
+
+ case IN_FIRST:
+ {
+#if ALLOW_FILL_NEXT_CMD
+ if (last == in)
+#else
+ if ((last == in) && ((in==0xFFFF) || (in == 0)) )
+#endif
+ {
+ mode = IN_COPY;
+ m_copy_cnt = 2;
+ m_image_cnt = 0;
+ copy_item = in;
+ }
+ else
+ {
+ mode = IN_IMAGE;
+ m_image_cnt++;
+ last = in;
+ }
+ break;
+ }
+
+ case IN_COPY:
+ {
+ if (last == in)
+ {
+ m_copy_cnt++;
+ }
+ else
+ {
+ /* revisit - could allow 2 words of copy if the data is
+ 0000 or FFFF */
+
+ /* convert a copy cnt of 2 to an image */
+ UInt16 copy_count = m_copy_cnt;
+
+ if (copy_count <= m_run_length)
+ {
+ if (m_image_cnt == 0)
+ {
+ /* point the pointer to the first element */
+ m_image_ptr = in_ptr - copy_count;
+ }
+ m_image_cnt += (1+copy_count);
+ m_copy_cnt = 0;
+ }
+ else
+ {
+ /* have enough to be a legal copy */
+
+ (void) FlushImage ();
+
+ (void) FlushCopy (copy_item);
+
+ m_image_ptr = in_ptr;
+ m_image_cnt = 1;
+ }
+ mode = IN_IMAGE;
+ last = in;
+ }
+ break;
+ }
+
+ case IN_IMAGE:
+ {
+#if ALLOW_FILL_NEXT_CMD
+ if (last == in)
+#else
+ if ((last == in) && ((in==0xFFFF) || (in == 0)) )
+#endif
+ {
+ m_image_cnt--;
+
+ mode = IN_COPY;
+ copy_item = in;
+ m_copy_cnt = 2;
+ }
+ else /* different */
+ {
+ last = in;
+ m_image_cnt++;
+ }
+ break;
+ }
+
+ default:
+ {
+ break;
+ }
+ }
+ in_ptr++;
+ } /* next data - end of processing */
+
+ /* flush out the remainder */
+
+ switch(mode)
+ {
+ case IN_COPY:
+ {
+ /* have enough to be a legal copy */
+ (void) FlushImage ();
+
+ (void) FlushCopy (copy_item);
+ break;
+ }
+ case IN_IMAGE:
+ case IN_FIRST:
+ {
+ (void) FlushImage ();
+ break;
+ }
+ default:
+ break;
+ }
+
+ if (m_out_cnt > 2048+16)
+ {
+ // ErrorTrap("out cnt too big");
+ // exit (-7);
+ }
+}
+
+bool LidilCompress::GetFrameInfo (BYTE **outdata, UInt16 *data_size)
+{
+ *outdata = (unsigned char *) &m_out_array[0];
+ *data_size = m_out_cnt;
+ return(true);
+}
+
+bool LidilCompress::Init (UInt16 *data, UInt16 datasize)
+{
+ m_image_ptr = data;
+ m_raw_data = data;
+ m_data_length = datasize;
+
+ m_run_length = MAX_RUNLENGTH;
+
+ return(true);
+}
+
diff --git a/prnt/hpcups/LidilCompress.h b/prnt/hpcups/LidilCompress.h
new file mode 100644
index 0000000..f819b46
--- /dev/null
+++ b/prnt/hpcups/LidilCompress.h
@@ -0,0 +1,79 @@
+/*****************************************************************************\
+ LidilCompress.h : Defnition of LidilCompress class
+
+ Copyright (c) 1996 - 2009, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+#ifndef LIDIL_COMPRESS_H
+#define LIDIL_COMPRESS_H
+
+#define ALLOW_FILL_NEXT_CMD 1
+
+#define FILL_0000_CMD 0x1000
+#define FILL_FFFF_CMD 0x2000
+#define FILL_NEXT_CMD 0x3000
+#define FILL_IMAGE_CMD 0x4000
+#define FILL_ODD_CMD 0x5000
+#define FILL_EVEN_CMD 0x6000
+
+#define MAX_HEADER_FRAME_SIZE 512
+#define MAX_DATA_FRAME_SIZE 6048
+#define MAX_RUNLENGTH 5
+
+typedef enum
+{
+ IN_NOT,
+ IN_FIRST,
+ IN_IMAGE,
+ IN_COPY
+} LDLCOMPMODE;
+
+class LidilCompress
+{
+public:
+ LidilCompress (bool bLittleEndian) : m_bLittleEndian(bLittleEndian) {}
+ ~LidilCompress () {}
+ bool Init(UInt16 *data, UInt16 datasize);
+ bool GetFrameInfo(BYTE **outdata, UInt16 *datasize);
+ void CompressData(Int16 compressmode = 1);
+ UInt16 FlushCopy(UInt16 value);
+ UInt16 FlushImage();
+private:
+ UInt16 *m_out_ptr;
+ UInt16 *m_image_ptr; /* image ptr points into the raw data */
+ UInt16 m_out_cnt;
+ UInt16 m_image_cnt;
+ UInt16 m_copy_cnt;
+ UInt16 m_out_array[2048+16];
+ UInt16 *m_raw_data;
+ UInt16 m_run_length; /* minimun run length */
+ UInt16 m_data_length; /* actual data size in record */
+ bool m_bLittleEndian;
+};
+
+#endif // LIDIL_COMPRESS_H
+
diff --git a/prnt/hpcups/LidilPrintModes.h b/prnt/hpcups/LidilPrintModes.h
new file mode 100644
index 0000000..1e92fe5
--- /dev/null
+++ b/prnt/hpcups/LidilPrintModes.h
@@ -0,0 +1,62 @@
+#include "CommonDefinitions.h"
+#include "dj3320PrintModes.h"
+#include "dj4100PrintModes.h"
+
+
+/*PQ_Cartridge_Map contains the PrintMode Index value present in PrintMode Array for all combinations of PQ and Installed Cartridges*/
+/*-1 means the combination is not possible*/
+int PQ_Cartridge_Map[][5]={
+ /*BlackColor*/ /*TriColor*/ /*PhotoColor*/ /*Black+TriColor*/ /*Photo+TriColor*/
+/*Normal Color*/ { 1, 4, 1, 1, 9},
+
+/*Normal Grey*/ { 6, 6, 6, 6, 7},
+
+/*Draft Color*/ { 0, 3, 0, 0, 8},
+
+/*Draft Grey*/ { 5, 5, 5, 5, 5},
+
+/*High Resolution Photo*/ { 2, 2, 2, 2, 10},
+};
+
+int PQ_Cartridge_Map_ViperTrim[][5]={
+ /*BlackColor*/ /*TriColor*/ /*PhotoColor*/ /*Black+TriColor*/ /*Photo+TriColor*/
+/*Normal Color*/ { 4, 4, 4, 4, 4},
+
+/*Normal Grey*/ { 6, 6, 6, 6, 7},
+
+/*Draft Color*/ { 3, 3, 3, 3, 3},
+
+/*Draft Grey*/ { 5, 5, 5, 5, 5},
+
+/*High Resolution Photo*/ { 2, 2, 2, 2, 10},
+};
+
+
+#if 0
+
+/*PQ_Cartridge_Map contains the PrintMode Index value present in PrintMode Array for all combinations of PQ and Installed Cartridges*/
+/*-1 means the combination is not possible*/
+int PQ_Cartridge_Map[][5]={
+ /*BlackColor*/ /*TriColor*/ /*PhotoColor*/ /*Black+TriColor*/ /*Photo+TriColor*/
+/*Normal Color*/ { -1, 4, -1, 1, 9},
+
+/*Normal Grey*/ { 6, -1, 6, 6, 7},
+
+/*Draft Color*/ { -1, 3, -1, 0, 8},
+
+/*Draft Grey*/ { 5, -1, -1, 5, -1},
+
+/*High Resolution Photo*/ { -1, 2, -1, 2, 10},
+};
+
+#endif
+
+
+PrintModeTable lidil_print_modes_table [] =
+{
+ {"dj3320", dj3320PrintModes, sizeof(dj3320PrintModes)/sizeof(PrintMode)},
+ {"dj3600", dj3320PrintModes, sizeof(dj3320PrintModes)/sizeof(PrintMode)},
+ {"dj4100", dj4100PrintModes, sizeof(dj4100PrintModes)/sizeof(PrintMode)},
+ {"dj2600", dj4100PrintModes, sizeof(dj4100PrintModes)/sizeof(PrintMode)}
+};
+
diff --git a/prnt/hpcups/Mode10.cpp b/prnt/hpcups/Mode10.cpp
new file mode 100644
index 0000000..9fa3f65
--- /dev/null
+++ b/prnt/hpcups/Mode10.cpp
@@ -0,0 +1,455 @@
+/*****************************************************************************\
+ Mode10.cpp : Implementation of Mode10 class
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+#include "Mode10.h"
+
+Mode10::Mode10 (unsigned int PlaneSize) : Compressor (PlaneSize, true)
+{
+ if (constructor_error != NO_ERROR) // if error in base constructor
+ {
+ return;
+ }
+
+ union
+ {
+ short s;
+ char c[2];
+ } uEndian;
+ uEndian.s = 0x0A0B;
+ m_eEndian = LITTLEENDIAN;
+ if (uEndian.c[0] == 0x0A)
+ m_eEndian = BIGENDIAN;
+
+ // In the worst case, compression expands data by 50%
+ compressBuf = new BYTE[(PlaneSize + PlaneSize/2)];
+ if (compressBuf == NULL)
+ constructor_error = ALLOCMEM_ERROR;
+
+ memset (SeedRow, 0xFF, PlaneSize);
+} //Mode10
+
+Mode10::~Mode10()
+{ }
+
+void Mode10::Flush ()
+{
+ if (!seeded)
+ {
+ return;
+ }
+ compressedsize = 0;
+ iRastersReady = 0;
+ seeded = false;
+ memset (SeedRow, 0xFF, inputsize);
+} //Flush
+
+inline uint32_t Mode10::get3Pixel (BYTE *pixAddress, int pixelOffset)
+{
+ pixAddress += ((pixelOffset << 1) + pixelOffset); //pixAddress += pixelOffset * 3;
+
+ BYTE r = *(pixAddress);
+ BYTE g = *(pixAddress + 1);
+ BYTE b = *(pixAddress + 2);
+
+ return (kWhite & ((r << 16) | (g << 8) | (b)));
+
+} //get3Pixel
+
+void Mode10::put3Pixel (BYTE *pixAddress, int pixelOffset, uint32_t pixel)
+{
+ pixAddress += ((pixelOffset << 1) + pixelOffset); //pixAddress += pixelOffset * 3;
+
+ unsigned int temp = (pixel & kWhite);
+
+ *(pixAddress) = ((temp >> 16) & 0x000000FF);
+ *(pixAddress + 1) = ((temp >> 8) & 0x000000FF);
+ *(pixAddress + 2) = (temp & 0x000000FF);
+
+} //put3Pixel
+
+
+unsigned short Mode10::ShortDelta (uint32_t lastPixel, uint32_t lastUpperPixel)
+{
+ int dr, dg, db;
+ int result;
+
+ dr = GetRed (lastPixel) - GetRed (lastUpperPixel);
+ dg = GetGreen (lastPixel) - GetGreen (lastUpperPixel);
+ db = GetBlue (lastPixel) - GetBlue (lastUpperPixel);
+
+ if ((dr <= 15) && (dr >= -16) && (dg <= 15) && (dg >= -16) && (db <= 30) && (db >= -32))
+ { // Note db is divided by 2 to double it's range from -16..15 to -32..30
+ result = ((dr << 10) & 0x007C00) | (((dg << 5) & 0x0003E0) | ((db >> 1) & 0x01F) | 0x8000); // set upper bit to signify short delta
+ }
+ else
+ {
+ result = 0; // upper bit is zero to signify delta won't work
+ }
+
+ return (unsigned short) result;
+}
+
+bool Mode10::Process (RASTERDATA *input)
+/****************************************************************************
+Initially written by Elden Wood
+August 1998
+
+Similar to mode 9, though tailored for pixel data.
+For more information see the Bert Compression Format document.
+
+This function compresses a single row per call.
+****************************************************************************/
+{
+ if (input == NULL ||
+ (input->rasterdata[COLORTYPE_COLOR] == NULL && input->rasterdata[COLORTYPE_BLACK] == NULL)) // flushing pipeline
+ {
+ Flush ();
+ return false;
+ }
+
+ if (myplane == COLORTYPE_BLACK || input->rasterdata[COLORTYPE_COLOR]==NULL)
+ {
+ iRastersReady = 1;
+ compressedsize = 0;
+ return true;
+ }
+ unsigned int originalsize = input->rastersize[myplane];
+ unsigned int size = input->rastersize[myplane];
+
+ unsigned char *seedRowPtr = (unsigned char *) SeedRow;
+
+ unsigned char *compressedDataPtr = compressBuf;
+ unsigned char *curRowPtr = (unsigned char *) input->rasterdata[myplane];
+ unsigned int rowWidthInBytes = size;
+ ASSERT(curRowPtr);
+ ASSERT(seedRowPtr);
+ ASSERT(compressedDataPtr);
+ ASSERT(rowWidthInBytes >= BYTES_PER_PIXEL);
+ ASSERT((rowWidthInBytes % BYTES_PER_PIXEL) == 0);
+
+ unsigned char *compressedDataStart = compressedDataPtr;
+ unsigned int lastPixel = (rowWidthInBytes / BYTES_PER_PIXEL) - 1;
+
+ // Setup sentinal value to replace last pixel of curRow. Simplifies future end condition checking.
+ uint32_t realLastPixel = getPixel(curRowPtr, lastPixel);
+
+ uint32_t newLastPixel = realLastPixel;
+ while ((getPixel (curRowPtr, lastPixel - 1) == newLastPixel) ||
+ (getPixel (seedRowPtr, lastPixel) == newLastPixel))
+ {
+ putPixel (curRowPtr, lastPixel, newLastPixel += 0x100); // add one to green.
+ }
+ unsigned int curPixel = 0;
+ unsigned int seedRowPixelCopyCount;
+ unsigned int cachedColor = kWhite;
+
+ do // all pixels in row
+ {
+ unsigned char CMDByte = 0;
+ int replacementCount;
+
+ // Find seedRowPixelCopyCount for upcoming copy
+ seedRowPixelCopyCount = curPixel;
+ while (getPixel (seedRowPtr, curPixel) == getPixel (curRowPtr, curPixel))
+ {
+ curPixel++;
+ }
+
+ seedRowPixelCopyCount = curPixel - seedRowPixelCopyCount;
+ ASSERT (curPixel <= lastPixel);
+
+ int pixelSource = 0;
+
+ if (curPixel == lastPixel) // On last pixel of row. RLE could also leave us on the last pixel of the row from the previous iteration.
+ {
+ putPixel(curRowPtr, lastPixel, realLastPixel);
+
+ if (getPixel(seedRowPtr, curPixel) == realLastPixel)
+ {
+ goto mode10rtn;
+ }
+ else // code last pix as a literal
+ {
+
+ CMDByte = eLiteral;
+ pixelSource = eeNewPixel;
+ replacementCount = 1;
+ curPixel++;
+ }
+ }
+ else // prior to last pixel of row
+ {
+ ASSERT(curPixel < lastPixel);
+
+ replacementCount = curPixel;
+ uint32_t RLERun = getPixel (curRowPtr, curPixel);
+
+ curPixel++; // Adjust for next pixel.
+ while (RLERun == getPixel (curRowPtr, curPixel)) // RLE
+ {
+ curPixel++;
+ }
+ curPixel--; // snap back to current.
+ replacementCount = curPixel - replacementCount;
+ ASSERT(replacementCount >= 0);
+
+ if (replacementCount > 0) // Adjust for total occurance and move to next pixel to do.
+ {
+ curPixel++;
+ replacementCount++;
+
+ if (cachedColor == RLERun)
+ {
+ pixelSource = eeCachedColor;
+ }
+ else if (getPixel (seedRowPtr, curPixel-replacementCount + 1) == RLERun)
+ {
+ pixelSource = eeNEPixel;
+ }
+ else if ((curPixel-replacementCount > 0) &&
+ (getPixel (curRowPtr, curPixel-replacementCount - 1) == RLERun))
+ {
+ pixelSource = eeWPixel;
+ }
+ else
+ {
+ pixelSource = eeNewPixel;
+ cachedColor = RLERun;
+ }
+
+ CMDByte = eRLE; // Set default for later.
+
+ }
+
+ if (curPixel == lastPixel)
+ {
+ ASSERT(replacementCount > 0); // Already found some RLE pixels
+
+ if (realLastPixel == RLERun) // Add to current RLE. Otherwise it'll be part of the literal from the seedrow section above on the next iteration.
+ {
+ putPixel (curRowPtr, lastPixel, realLastPixel);
+ replacementCount++;
+ curPixel++;
+ }
+ }
+
+ if (0 == replacementCount) // no RLE so it's a literal by default.
+ {
+ uint32_t tempPixel = getPixel (curRowPtr, curPixel);
+
+ ASSERT(tempPixel != getPixel (curRowPtr, curPixel + 1)); // not RLE
+ ASSERT(tempPixel != getPixel (seedRowPtr, curPixel)); // not seedrow copy
+
+ CMDByte = eLiteral;
+
+ if (cachedColor == tempPixel)
+ {
+ pixelSource = eeCachedColor;
+
+ }
+ else if (getPixel (seedRowPtr, curPixel + 1) == tempPixel)
+ {
+ pixelSource = eeNEPixel;
+
+ }
+ else if ((curPixel > 0) && (getPixel (curRowPtr, curPixel-1) == tempPixel))
+ {
+ pixelSource = eeWPixel;
+
+ }
+ else
+ {
+
+ pixelSource = eeNewPixel;
+ cachedColor = tempPixel;
+ }
+
+ replacementCount = curPixel;
+ uint32_t cachePixel;
+ uint32_t nextPixel = getPixel (curRowPtr, curPixel+1);
+ do
+ {
+ if (++curPixel == lastPixel)
+ {
+ putPixel (curRowPtr, lastPixel, realLastPixel);
+ curPixel++;
+ break;
+ }
+ cachePixel = nextPixel;
+ }
+ while ((cachePixel != (nextPixel = getPixel (curRowPtr, curPixel+1))) &&
+ (cachePixel != getPixel (seedRowPtr, curPixel)));
+
+ replacementCount = curPixel - replacementCount;
+
+ ASSERT(replacementCount > 0);
+ }
+ }
+
+ //ASSERT(seedRowPixelCopyCount >= 0);
+
+ // Write out compressed data next.
+ if (eLiteral == CMDByte)
+ {
+ ASSERT(replacementCount >= 1);
+
+ replacementCount -= 1; // normalize it
+
+ CMDByte |= pixelSource; // Could put this directly into CMDByte above.
+ CMDByte |= MIN(3, seedRowPixelCopyCount) << 3;
+ CMDByte |= MIN(7, replacementCount);
+
+ *compressedDataPtr++ = CMDByte;
+
+ if (seedRowPixelCopyCount >= 3)
+ {
+ outputVLIBytesConsecutively (seedRowPixelCopyCount - 3, compressedDataPtr);
+ }
+
+ replacementCount += 1; // denormalize it
+
+ int totalReplacementCount = replacementCount;
+ int upwardPixelCount = 1;
+
+ if (eeNewPixel != pixelSource)
+ {
+ replacementCount -= 1; // Do not encode 1st pixel of run since it comes from an alternate location.
+ upwardPixelCount = 2;
+ }
+
+ for ( ; upwardPixelCount <= totalReplacementCount; upwardPixelCount++)
+ {
+ ASSERT(totalReplacementCount >= upwardPixelCount);
+
+ unsigned short compressedPixel = ShortDelta (getPixel (curRowPtr, curPixel - replacementCount),
+ getPixel (seedRowPtr, curPixel - replacementCount));
+ if (compressedPixel)
+ {
+ *compressedDataPtr++ = compressedPixel >> 8;
+ *compressedDataPtr++ = (unsigned char)compressedPixel;
+
+ }
+ else
+ {
+ uint32_t uncompressedPixel = getPixel (curRowPtr, curPixel - replacementCount);
+
+ uncompressedPixel >>= 1; // Lose the lsb of blue and zero out the msb of the 3 bytes.
+
+ *compressedDataPtr++ = (BYTE) (uncompressedPixel >> 16);
+ *compressedDataPtr++ = (BYTE) (uncompressedPixel >> 8);
+ *compressedDataPtr++ = (BYTE) (uncompressedPixel);
+
+ }
+
+ if (((upwardPixelCount-8) % 255) == 0) // See if it's time to spill a single VLI byte.
+ {
+ *compressedDataPtr++ = MIN(255, totalReplacementCount - upwardPixelCount);
+ }
+
+ replacementCount--;
+ }
+ }
+ else // RLE
+ {
+ ASSERT(replacementCount >= 2);
+
+ replacementCount -= 2; // normalize it
+
+ CMDByte |= pixelSource; // Could put this directly into CMDByte above.
+ CMDByte |= MIN(3, seedRowPixelCopyCount) << 3;
+ CMDByte |= MIN(7, replacementCount);
+
+ *compressedDataPtr++ = CMDByte;
+
+ if (seedRowPixelCopyCount >= 3)
+ {
+ outputVLIBytesConsecutively (seedRowPixelCopyCount - 3, compressedDataPtr);
+ }
+
+ replacementCount += 2; // denormalize it
+
+ if (eeNewPixel == pixelSource)
+ {
+ unsigned short compressedPixel = ShortDelta(getPixel (curRowPtr, curPixel - replacementCount),
+ getPixel (seedRowPtr, curPixel - replacementCount));
+ if (compressedPixel)
+ {
+ *compressedDataPtr++ = compressedPixel >> 8;
+ *compressedDataPtr++ = (unsigned char) compressedPixel;
+ }
+ else
+ {
+ uint32_t uncompressedPixel = getPixel (curRowPtr, curPixel - replacementCount);
+
+ uncompressedPixel >>= 1;
+
+ *compressedDataPtr++ = (BYTE) (uncompressedPixel >> 16);
+ *compressedDataPtr++ = (BYTE) (uncompressedPixel >> 8);
+ *compressedDataPtr++ = (BYTE) (uncompressedPixel);
+ }
+ }
+
+ if (replacementCount - 2 >= 7) outputVLIBytesConsecutively (replacementCount - (7+2), compressedDataPtr);
+ }
+ } while (curPixel <= lastPixel);
+mode10rtn:
+ size = static_cast<int>(compressedDataPtr - compressedDataStart); // return # of compressed bytes.
+ compressedsize = size;
+ memcpy (SeedRow, input->rasterdata[myplane], originalsize);
+ seeded = true;
+ iRastersReady = 1;
+ return true;
+} //Process
+
+bool Mode10::NextOutputRaster (RASTERDATA& next_raster)
+{
+ if (iRastersReady == 0)
+ {
+ return false;
+ }
+
+ if (myplane == COLORTYPE_COLOR && compressedsize != 0)
+ {
+ next_raster.rastersize[COLORTYPE_COLOR] = compressedsize;
+ next_raster.rasterdata[COLORTYPE_COLOR] = compressBuf;
+ }
+ else
+ {
+ next_raster.rastersize[COLORTYPE_COLOR] = 0;
+ next_raster.rasterdata[COLORTYPE_COLOR] = raster.rasterdata[COLORTYPE_COLOR];
+ }
+
+ next_raster.rastersize[COLORTYPE_BLACK] = raster.rastersize[COLORTYPE_BLACK];
+ next_raster.rasterdata[COLORTYPE_BLACK] = raster.rasterdata[COLORTYPE_BLACK];
+
+ iRastersReady = 0;
+ return true;
+}
+
diff --git a/prnt/hpcups/Mode10.h b/prnt/hpcups/Mode10.h
new file mode 100644
index 0000000..825925e
--- /dev/null
+++ b/prnt/hpcups/Mode10.h
@@ -0,0 +1,164 @@
+/*****************************************************************************\
+ Mode10.h : Interface for the Mode10 class
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+#ifndef MODE10_H
+#define MODE10_H
+
+#include "CommonDefinitions.h"
+#include "Processor.h"
+#include "Compressor.h"
+
+//#define kUseOldBert 0
+
+#define kBertDecompressPixelSize 3
+
+// Follows are all the masks for the command byte.
+#define kTypeMask 0x80
+#define kTypeShiftAmount 7
+
+#define kCacheLiteralBitsMask 0x60
+#define kCacheLiteralBitsShiftAmount 5
+
+#define kCacheBitsMask 0x60
+#define kCacheBitsShiftAmount 5
+
+#define kRoffMask 0x18
+#define kRoffShiftAmount 3
+
+#define kReplace_countMask 0x07
+
+// Now have the compiler check to make sure none of the masks overlap/underlap bits accidently.
+#if ((kTypeMask | kCacheLiteralBitsMask | kRoffMask | kReplace_countMask) != 255)
+#error "Your mask bits are messed up!"
+#endif
+
+#if ((kTypeMask | kCacheBitsMask | kRoffMask | kReplace_countMask) != 255)
+#error "Your mask bits are messed up!"
+#endif
+
+enum
+{
+ eLiteral = 0,
+ eRLE = 0x80
+};
+
+enum
+{
+ eeNewPixel = 0x0,
+ eeWPixel = 0x20,
+ eeNEPixel = 0x40,
+ eeCachedColor = 0x60
+};
+
+enum
+{
+ eNewColor = 0x0,
+ eWestColor = 0x1,
+ eNorthEastColor = 0x2,
+ eCachedColor = 0x3
+};
+
+// Literal
+#define M10_MAX_OFFSET0 2 /* Largest unscaled value an offset can have before extra byte is needed. */
+#define M10_MAX_COUNT0 6 /* Largest unscaled and unbiased value a count can have before extra byte is needed */
+#define M10_COUNT_START0 1 /* What a count of zero has a value of. */
+
+// RLE
+#define M10_MAX_OFFSET1 2
+#define M10_MAX_COUNT1 6
+#define M10_COUNT_START1 2
+
+#define getPixel get3Pixel
+#define putPixel put3Pixel
+#define BYTES_PER_PIXEL 3
+
+class Mode10 : public Compressor
+{
+ public:
+ Mode10 (unsigned int RasterSize);
+ virtual ~Mode10 ();
+ //!@todo: need to fix this so it remains virtual????
+ //~Mode10();
+ bool Process (RASTERDATA *input);
+ bool NextOutputRaster (RASTERDATA& next_raster);
+ void Flush ();
+
+ private:
+ inline uint32_t get4Pixel (unsigned char *pixAddress, bool bPrint = false)
+ {
+ if (m_eEndian == LITTLEENDIAN)
+ return (((unsigned int*)pixAddress)[0]) & kWhite;
+ else
+ return (((unsigned int*)pixAddress)[0]) & 0xFFFFFF00;
+ }
+
+
+ inline uint32_t get4Pixel (unsigned char *pixAddress, int pixelOffset)
+ {
+ if (m_eEndian == LITTLEENDIAN)
+ return ((unsigned int*)pixAddress)[pixelOffset] & kWhite;
+ else
+ return ((unsigned int*)pixAddress)[pixelOffset] & 0xFFFFFF00;
+ }
+
+
+ inline void put4Pixel (unsigned char *pixAddress, int pixelOffset, uint32_t pixel)
+ {
+ if (m_eEndian == LITTLEENDIAN)
+ (((unsigned int*)pixAddress)[pixelOffset] = pixel & kWhite);
+ else
+ (((unsigned int*)pixAddress)[pixelOffset] = pixel & 0xFFFFFF00);
+ }
+
+
+ inline void outputVLIBytesConsecutively (int number, unsigned char *&compressedDataPtr)
+ {
+ do
+ {
+ *compressedDataPtr++ = MIN(number, 255);
+ if (255 == number)
+ {
+ *compressedDataPtr++ = 0;
+ }
+ number -= MIN(number,255);
+ } while (number);
+ }
+
+
+ void put3Pixel (BYTE* pixAddress, int pixelOffset, uint32_t pixel);
+ inline uint32_t get3Pixel (BYTE* pixAddress, int pixelOffset);
+ unsigned short ShortDelta (uint32_t lastPixel, uint32_t lastUpperPixel);
+ ENDIAN_TYPE m_eEndian;
+
+
+}; // Mode10
+
+#endif // MODE10_H
+
diff --git a/prnt/hpcups/Mode2.cpp b/prnt/hpcups/Mode2.cpp
new file mode 100644
index 0000000..1598025
--- /dev/null
+++ b/prnt/hpcups/Mode2.cpp
@@ -0,0 +1,138 @@
+/*****************************************************************************\
+ Mode2.cpp : implementaiton of Mode2 class
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+#include "CommonDefinitions.h"
+#include "Compressor.h"
+#include "Pipeline.h"
+#include "Mode2.h"
+
+Mode2::Mode2 (unsigned int RasterSize)
+ : Compressor (RasterSize, false)
+{
+ compressBuf = (BYTE *) new BYTE[RasterSize];
+ if (compressBuf == NULL)
+ constructor_error = ALLOCMEM_ERROR;
+}
+
+Mode2::~Mode2()
+{ }
+
+bool Mode2::Process (RASTERDATA* input)
+{
+ BYTE* pDst = compressBuf;
+ int ndstcount = 0;
+
+ if (input==NULL ||
+ (myplane == COLORTYPE_COLOR && input->rasterdata[COLORTYPE_COLOR] == NULL) ||
+ (myplane == COLORTYPE_BLACK && input->rasterdata[COLORTYPE_BLACK] == NULL)) // flushing pipeline
+ {
+ compressedsize=0;
+
+ iRastersReady=0;
+ return false;
+ }
+
+ unsigned int size = input->rastersize[myplane];
+
+ for (unsigned int ni = 0; ni < size;)
+ {
+ if ( ni + 1 < size && input->rasterdata[myplane][ ni ] == input->rasterdata[myplane][ ni + 1 ] )
+ {
+ unsigned int nrepeatcount;
+ for ( ni += 2, nrepeatcount = 1; ni < size && nrepeatcount < 127; ++ni, ++nrepeatcount )
+ {
+ if ( input->rasterdata[myplane][ ni ] != input->rasterdata[myplane][ ni - 1 ] )
+ {
+ break;
+ }
+ }
+ int tmprepeat = 0 - nrepeatcount;
+ BYTE trunc = (BYTE) tmprepeat;
+ pDst[ ndstcount++ ] = trunc;
+ pDst[ ndstcount++ ] = input->rasterdata[myplane][ ni - 1 ];
+ }
+ else
+ {
+ int nliteralcount;
+ int nfirst = ni;
+ for ( ++ni, nliteralcount = 0; ni < size && nliteralcount < 127; ++ni, ++nliteralcount )
+ {
+ if ( input->rasterdata[myplane][ ni ] == input->rasterdata[myplane][ ni - 1 ] )
+ {
+ --ni;
+ --nliteralcount;
+ break;
+ }
+ }
+ pDst[ ndstcount++ ] = (BYTE) nliteralcount;
+ for ( int nj = 0; nj <= nliteralcount; ++nj )
+ {
+ pDst[ ndstcount++ ] = input->rasterdata[myplane][ nfirst++ ];
+ }
+ }
+ }
+
+ size = ndstcount;
+ compressedsize = size;
+ iRastersReady = 1;
+ return true;
+}
+
+bool Mode2::NextOutputRaster(RASTERDATA& next_raster)
+{
+ if (iRastersReady==0){
+ return false;
+ }
+ if (myplane == COLORTYPE_COLOR && compressedsize != 0)
+ {
+ next_raster.rastersize[COLORTYPE_COLOR] = compressedsize;
+ next_raster.rasterdata[COLORTYPE_COLOR] = compressBuf;
+ }
+ else
+ {
+ next_raster.rastersize[COLORTYPE_COLOR] = 0;
+ next_raster.rasterdata[COLORTYPE_COLOR] = raster.rasterdata[COLORTYPE_COLOR];
+ }
+
+ if (myplane == COLORTYPE_BLACK && compressedsize != 0)
+ {
+ next_raster.rastersize[COLORTYPE_BLACK] = compressedsize;
+ next_raster.rasterdata[COLORTYPE_BLACK] = compressBuf;
+ }
+ else
+ {
+ next_raster.rastersize[COLORTYPE_BLACK] = 0;
+ next_raster.rasterdata[COLORTYPE_BLACK] = raster.rasterdata[COLORTYPE_BLACK];
+ }
+
+ iRastersReady=0;
+ return true;
+}
+
diff --git a/prnt/hpcups/Mode2.h b/prnt/hpcups/Mode2.h
new file mode 100644
index 0000000..241acaf
--- /dev/null
+++ b/prnt/hpcups/Mode2.h
@@ -0,0 +1,48 @@
+/*****************************************************************************\
+ Mode2.cpp : implementaiton of Mode2 class
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+#ifndef MODE2_H
+#define MODE2_H
+
+#include "CommonDefinitions.h"
+#include "Processor.h"
+#include "Compressor.h"
+
+class Mode2 : public Compressor
+{
+public:
+ Mode2(unsigned int RasterSize);
+ virtual ~Mode2();
+ bool Process(RASTERDATA *input);
+ bool NextOutputRaster(RASTERDATA& next_raster);
+};
+
+#endif // MODE2_H
+
diff --git a/prnt/hpcups/Mode3.cpp b/prnt/hpcups/Mode3.cpp
new file mode 100644
index 0000000..a6334bf
--- /dev/null
+++ b/prnt/hpcups/Mode3.cpp
@@ -0,0 +1,171 @@
+/*****************************************************************************\
+ Mode3.cpp : Implimentation for the Mode3 class
+
+ Copyright (c) 1996 - 2009, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+#include "CommonDefinitions.h"
+#include "Compressor.h"
+#include "Pipeline.h"
+#include "Mode3.h"
+
+Mode3::Mode3 (unsigned int RasterSize) : Compressor (RasterSize, true)
+{
+ // Worst case is when two rows are completely different
+ // In that case, one command byte is added for every 8 bytes
+ // In the worst case, compression expands data by 50%
+ compressBuf = new BYTE[RasterSize + RasterSize/2];
+ if (compressBuf == NULL)
+ constructor_error = ALLOCMEM_ERROR;
+
+ memset (SeedRow, 0x0, inputsize);
+}
+
+Mode3::~Mode3 ()
+{
+}
+
+void Mode3::Flush ()
+{
+ if (!seeded)
+ return;
+ compressedsize = 0;
+ iRastersReady = 0;
+ seeded = false;
+ memset (SeedRow, 0x0, inputsize);
+}
+
+bool Mode3::Process (RASTERDATA *input)
+{
+ if (input==NULL ||
+ (myplane == COLORTYPE_COLOR && input->rasterdata[COLORTYPE_COLOR] == NULL) ||
+ (myplane == COLORTYPE_BLACK && input->rasterdata[COLORTYPE_BLACK] == NULL)) // flushing pipeline
+ {
+ Flush();
+ return false;
+ }
+ else
+ {
+ seeded = true;
+ }
+
+ unsigned int uOrgSize = input->rastersize[myplane];
+ unsigned int size = input->rastersize[myplane];
+ unsigned int uOffset;
+
+ BYTE *pszSptr = SeedRow;
+ BYTE *pszInPtr = input->rasterdata[myplane];
+ BYTE *pszCurPtr;
+ BYTE ucByteCount;
+ BYTE *pszOutPtr = compressBuf;
+
+ while (size > 0)
+ {
+ uOffset = 0;
+
+ if (seeded)
+ {
+ while ((*pszSptr == *pszInPtr) && (uOffset < size))
+ {
+ pszSptr++;
+ pszInPtr++;
+ uOffset++;
+ }
+ }
+
+ if (uOffset >= size)
+ {
+ break;
+ }
+
+ size -= uOffset;
+
+ pszCurPtr = pszInPtr;
+ ucByteCount = 1;
+ pszSptr++;
+ pszInPtr++;
+ while ((*pszSptr != *pszInPtr) && ucByteCount < size && ucByteCount < 8)
+ {
+ pszSptr++;
+ pszInPtr++;
+ ucByteCount++;
+ }
+ ucByteCount--;
+ if (uOffset < 31)
+ {
+ *pszOutPtr++ = ((ucByteCount << 5) | uOffset);
+ }
+ else
+ {
+ uOffset -= 31;
+ *pszOutPtr++ = ((ucByteCount << 5) | 31);
+
+ while (uOffset >= 255)
+ {
+ *pszOutPtr++ = 255;
+ uOffset -= 255;
+ }
+ *pszOutPtr++ = uOffset;
+ }
+ ucByteCount++;
+ size -= (ucByteCount);
+ memcpy (pszOutPtr, pszCurPtr, ucByteCount);
+ pszOutPtr += ucByteCount;
+ }
+
+ compressedsize = pszOutPtr - compressBuf;
+ memcpy (SeedRow, input->rasterdata[myplane], uOrgSize);
+ seeded = true;
+ iRastersReady = 1;
+ return true;
+}
+
+bool Mode3::NextOutputRaster (RASTERDATA& next_raster)
+{
+ if (iRastersReady == 0)
+ {
+ return false;
+ }
+
+ if (myplane == COLORTYPE_COLOR && compressedsize != 0)
+ {
+ next_raster.rastersize[COLORTYPE_COLOR] = compressedsize;
+ next_raster.rasterdata[COLORTYPE_COLOR] = compressBuf;
+ }
+ else
+ {
+ next_raster.rastersize[COLORTYPE_COLOR] = 0;
+ next_raster.rasterdata[COLORTYPE_COLOR] = raster.rasterdata[COLORTYPE_COLOR];
+ }
+
+ next_raster.rastersize[COLORTYPE_BLACK] = raster.rastersize[COLORTYPE_BLACK];
+ next_raster.rasterdata[COLORTYPE_BLACK] = raster.rasterdata[COLORTYPE_BLACK];
+
+ iRastersReady = 0;
+ return true;
+}
+
diff --git a/prnt/hpcups/Mode3.h b/prnt/hpcups/Mode3.h
new file mode 100644
index 0000000..b5677a4
--- /dev/null
+++ b/prnt/hpcups/Mode3.h
@@ -0,0 +1,49 @@
+/*****************************************************************************\
+ Mode3.cpp : implementaiton of Mode3 class
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+#ifndef MODE3_H
+#define MODE3_H
+
+#include "CommonDefinitions.h"
+#include "Processor.h"
+#include "Compressor.h"
+
+class Mode3 : public Compressor
+{
+public:
+ Mode3(unsigned int RasterSize);
+ virtual ~Mode3();
+ void Flush();
+ bool Process(RASTERDATA *input);
+ bool NextOutputRaster(RASTERDATA& next_raster);
+};
+
+#endif // MODE3_H
+
diff --git a/prnt/hpcups/Mode9.cpp b/prnt/hpcups/Mode9.cpp
new file mode 100644
index 0000000..2fe1e14
--- /dev/null
+++ b/prnt/hpcups/Mode9.cpp
@@ -0,0 +1,455 @@
+/*****************************************************************************\
+ Mode9.cpp : implementaiton of Mode9 class
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+#include "Mode9.h"
+#include "Pipeline.h"
+Mode9::Mode9 (unsigned int RasterSize, bool bPackedBits)
+ : Compressor(RasterSize, true)
+{
+ if (constructor_error != NO_ERROR) // if error in base constructor
+ return;
+
+ // Allocate double the RasterSize to accommodate worst case
+ compressBuf = (BYTE*) new BYTE[RasterSize * 2];
+ if (compressBuf == NULL)
+ constructor_error=ALLOCMEM_ERROR;
+
+ memset(compressBuf, 0, RasterSize * 2);
+ memset(SeedRow,0,RasterSize);
+
+ ResetSeedRow = false;
+ m_bPackedBits = bPackedBits;
+}
+
+Mode9::~Mode9()
+{ }
+
+////////////////////////////////////////////////////////////////////////////
+
+typedef union {
+ unsigned char comchar; /* command byte as char */
+ struct
+ {
+#if defined(APDK_LITTLE_ENDIAN) || defined(LITTLE_ENDIAN_HW)
+ unsigned replace_count:3; /* replace count 1-7, 8=8+next byte */
+ unsigned roff:4; /* relative offset 0-14, 15=15+next byte */
+ unsigned type:1; /* type of replacement: 0=mode0, 1=mode1 */
+#else
+ unsigned type:1; /* type of replacement: 0=mode0, 1=mode1 */
+ unsigned roff:4; /* relative offset 0-14, 15=15+next byte */
+ unsigned replace_count:3; /* replace count 1-7, 8=8+next byte */
+#endif
+ } bitf0;
+ struct
+ {
+#if defined(APDK_LITTLE_ENDIAN) || defined(LITTLE_ENDIAN_HW)
+ unsigned replace_count:5; /* replace count 2-32, 33=33+next byte */
+ unsigned roff:2; /* relative offset 0-2, 3=3+next byte */
+ unsigned type:1; /* type of replacement: 0=mode0, 1=mode1 */
+#else
+ unsigned type:1; /* type of replacement: 0=mode0, 1=mode1 */
+ unsigned roff:2; /* relative offset 0-2, 3=3+next byte */
+ unsigned replace_count:5; /* replace count 2-32, 33=33+next byte */
+#endif
+ } bitf1;
+} Mode9_comtype;
+
+#ifndef MIN
+#define MIN(a,b) (((a)>=(b))?(b):(a))
+#endif
+
+#define kPCLMode9 9
+
+#define MAX_OFFSET0 14 /* Largest unscaled value an offset can have before extra byte is needed. */
+#define OFFSET_START0 0
+#define MAX_COUNT0 6 /* Largest unscaled value a count can have before extra byte is needed */
+#define COUNT_START0 1 /* What a count of zero has a value of. */
+
+#define MAX_OFFSET1 2
+#define OFFSET_START1 0
+#define MAX_COUNT1 30
+#define COUNT_START1 2
+
+//*********************************************************
+// This is based on code that came from Kevin Hudson.
+
+void Mode9::Flush()
+{
+ if (!seeded)
+ return;
+
+ compressedsize=0;
+ iRastersReady=0;
+ seeded = false;
+ memset (SeedRow, 0, inputsize);
+}
+
+bool Mode9::Process(RASTERDATA* input)
+// compresses input data,
+// result in Mode9::compressbuf,
+// updates compressedsize
+{
+ if (input==NULL ||
+ (input->rasterdata[COLORTYPE_COLOR]==NULL && input->rasterdata[COLORTYPE_BLACK]==NULL)) // flushing pipeline
+ {
+ Flush();
+ return false;
+ }
+ else
+ seeded = true;
+
+ if (!ResetSeedRow && input->rasterdata[myplane] == 0)
+ {
+ compressedsize=0;
+ iRastersReady=1;
+ return true;
+ }
+
+ memset(compressBuf, 0, inputsize * 2);
+
+ unsigned int originalsize=input->rastersize[myplane];
+ unsigned int size=input->rastersize[myplane];
+ unsigned int layer;
+
+ // Convert 8 bit per pixel data into 1 bit per pixel data
+ if (myplane == COLORTYPE_BLACK)
+ {
+ if (input->rasterdata[myplane] == 0)
+ {
+ memset(originalKData, 0, inputsize+1);
+ size = originalsize = inputsize;
+ }
+ else
+ {
+ size = originalsize = (input->rastersize[myplane]+7)/8;
+ memset(originalKData, 0, size);
+
+ memcpy(originalKData, input->rasterdata[myplane], size);
+ if (!m_bPackedBits)
+ {
+ int curBit = 0x80, curByte = 0;
+ for (int i=0; i<input->rastersize[myplane]; i++)
+ {
+ if (input->rasterdata[myplane][i])
+ {
+ originalKData[curByte] |= curBit;
+ }
+ if (curBit == 0x01)
+ {
+ curByte++;
+ curBit = 0x80;
+ }
+ else
+ {
+ curBit = curBit >> 1;
+ }
+ }
+ }
+ ResetSeedRow = true;
+ }
+ }
+ if ((myphase) && (myphase->prev)) // if in pipeline, as opposed to autonomous call
+ {
+ layer = myphase->prev->Exec->iRastersDelivered;
+ }
+ else layer = 1;
+
+ if (myplane == COLORTYPE_BLACK)
+ {
+ layer = 1;
+ }
+
+ layer--; // using as offset
+ char *sptr = (char *)(&SeedRow[size*layer]);
+
+ BYTE *nptr;
+ if (myplane == COLORTYPE_BLACK)
+ {
+ nptr = originalKData;
+ }
+ else
+ {
+ nptr = input->rasterdata[myplane];
+ }
+ BYTE *tempPtr;
+ char last_byte;
+ unsigned int offset,byte_count,rem_count;
+ Mode9_comtype command;
+ char* dest= (char*) compressBuf;
+ register char *dptr=dest;
+
+ while ( size > 0 )
+ {
+ offset = 0;
+
+ if (seeded)
+ {
+ /* find a difference between the seed row and this row. */
+ while ((offset < size) && (*sptr++ == *nptr++))
+ {
+ offset++;
+ }
+ sptr--;
+ nptr--;
+ }
+
+ if ( offset >= size ) /* too far to find diff, bail */
+ goto bail;
+
+ size -= offset;
+
+ if ((*nptr != nptr[1]) || (size < 2)) /************ if doing a mode 0 **********/
+ {
+ command.bitf0.type = 0;
+ last_byte = *nptr++; /* keep track of the last_byte */
+ sptr++; /* seed pointer must keep up with nptr */
+ byte_count = 1;
+
+ /* Now find all of the bytes in a row that don't match
+ either a run of mode3 or mode 1. A slight
+ optimization here would be to not jump out of this
+ run of mode 0 for a single mode 3 or two mode 1
+ bytes if we have to jump right back into mode 0,
+ especially if there are already 7 mode 0 bytes here
+ (we've already spent the extra byte for the
+ byte-count) */
+ while ((*sptr++ != *nptr) && (last_byte != *nptr) && (byte_count < size))
+ {
+ byte_count++;
+ last_byte = *nptr++;
+ }
+ sptr--;
+
+ /* Adjust the count if the last_byte == current_byte.
+ Save these bytes for the upcomming run of mode 1. */
+ if ((byte_count < size) && (last_byte == (char)*nptr))
+ {
+ nptr--; /* Now sptr points to first byte in the new run of mode 1. */
+ sptr--;
+ byte_count--;
+ }
+
+ size -= byte_count;
+ /* Now output full command. If offset is over 14 then
+ need optional offset bytes. If byte count is over 7
+ then need optional byte count. */
+
+ if (offset > (MAX_OFFSET0+OFFSET_START0))
+ command.bitf0.roff = MAX_OFFSET0+1;
+ else
+ command.bitf0.roff = offset-OFFSET_START0;
+
+ if (byte_count > (MAX_COUNT0+COUNT_START0))
+ command.bitf0.replace_count = MAX_COUNT0+1;
+ else
+ command.bitf0.replace_count = byte_count-COUNT_START0;
+
+ *dptr++ = command.comchar;
+
+ if (offset > (MAX_OFFSET0+OFFSET_START0))
+ {
+ offset -= (MAX_OFFSET0+OFFSET_START0+1);
+ if (offset == 0)
+ {
+ *dptr++ = 0;
+ }
+ else
+ {
+ while( offset )
+ {
+ *dptr++ = MIN ( offset, 255 );
+
+ if ( offset == 255 )
+ *dptr++ = 0;
+
+ offset -= MIN ( offset, 255 );
+ }
+ }
+ }
+
+ if (byte_count > (MAX_COUNT0+COUNT_START0))
+ {
+ rem_count = byte_count - (MAX_COUNT0+COUNT_START0+1);
+ if (rem_count == 0)
+ *dptr++ = 0;
+ else
+ {
+ while( rem_count )
+ {
+ *dptr++ = MIN ( rem_count, 255 );
+
+ if ( rem_count == 255 )
+ *dptr++ = 0;
+
+ rem_count -= MIN ( rem_count, 255 );
+ }
+ }
+ }
+
+ /* Now output the run of bytes. First set up a pointer to the first source byte. */
+
+ tempPtr = nptr - byte_count;
+ for(;byte_count;byte_count--)
+ {
+ *dptr++ = *tempPtr++;
+ }
+
+ } else /************ If doing a mode 1 *************/
+ {
+ /* mode 1, next two bytes are equal */
+ command.bitf1.type = 1;
+ nptr++;
+ last_byte = *nptr++;
+ byte_count = 2;
+
+ while ((last_byte == *nptr++) && (byte_count < size))
+ {
+ byte_count++;
+ }
+ nptr--;
+ sptr += byte_count;
+ size -= byte_count;
+
+ if (offset > (MAX_OFFSET1+OFFSET_START1))
+ command.bitf1.roff = MAX_OFFSET1+1;
+ else
+ command.bitf1.roff = offset-OFFSET_START1;
+
+ if (byte_count > (MAX_COUNT1+COUNT_START1))
+ command.bitf1.replace_count = MAX_COUNT1+1;
+ else
+ command.bitf1.replace_count = byte_count-COUNT_START1;
+
+ *dptr++ = command.comchar;
+
+ if (offset > (MAX_OFFSET1+OFFSET_START1))
+ {
+ offset -= (MAX_OFFSET1+OFFSET_START1+1);
+ if (offset == 0)
+ {
+ *dptr++ = 0;
+ }
+ else
+ {
+ while( offset )
+ {
+ *dptr++ = MIN ( offset, 255 );
+
+ if ( offset == 255 )
+ *dptr++ = 0;
+
+ offset -= MIN ( offset, 255 );
+ }
+ }
+ } /* if (offset > MAX... */
+
+ if (byte_count > (MAX_COUNT1+COUNT_START1))
+ {
+ rem_count = byte_count - (MAX_COUNT1+COUNT_START1+1);
+ if (rem_count == 0)
+ *dptr++ = 0;
+ else
+ {
+ while( rem_count )
+ {
+ *dptr++ = MIN ( rem_count, 255 );
+
+ if ( rem_count == 255 )
+ *dptr++ = 0;
+
+ rem_count -= MIN ( rem_count, 255 );
+ }
+ }
+ } /* if (byte_count > ... */
+
+ *dptr++ = last_byte; /* Now output the repeated byte. */
+ }
+ } /* while (size > 0) */
+
+bail:
+ size = static_cast<int>((dptr - dest));
+ compressedsize = size;
+ if (myplane == COLORTYPE_BLACK)
+ {
+ memcpy(&(SeedRow[layer*originalsize]), originalKData, originalsize);
+ }
+ else
+ {
+ memcpy(&(SeedRow[layer*originalsize]), input->rasterdata[myplane], originalsize);
+ }
+ seeded = true;
+ iRastersReady=1;
+
+ return true;
+}
+
+bool Mode9::NextOutputRaster(RASTERDATA& next_raster)
+// since we return 1-for-1, just return result first call
+{
+ if (iRastersReady==0){
+ return false;
+ }
+ iRastersReady=0;
+ if (myplane == COLORTYPE_BLACK)
+ {
+ if (compressedsize != 0)
+ {
+ next_raster.rastersize[COLORTYPE_BLACK] = compressedsize;
+ next_raster.rasterdata[COLORTYPE_BLACK] = compressBuf;
+ }
+ else
+ {
+ next_raster.rastersize[COLORTYPE_BLACK] = 0;
+ next_raster.rasterdata[COLORTYPE_BLACK] = raster.rasterdata[COLORTYPE_BLACK];
+ }
+ next_raster.rastersize[COLORTYPE_COLOR] = raster.rastersize[COLORTYPE_COLOR];
+ next_raster.rasterdata[COLORTYPE_COLOR] = raster.rasterdata[COLORTYPE_COLOR];
+ return true;
+ }
+
+ if (myplane == COLORTYPE_COLOR)
+ {
+ if (compressedsize != 0)
+ {
+ next_raster.rastersize[COLORTYPE_COLOR] = compressedsize;
+ next_raster.rasterdata[COLORTYPE_COLOR] = compressBuf;
+ }
+ else
+ {
+ next_raster.rastersize[COLORTYPE_COLOR] = 0;
+ next_raster.rasterdata[COLORTYPE_COLOR] = raster.rasterdata[COLORTYPE_COLOR];
+ }
+ next_raster.rastersize[COLORTYPE_BLACK] = raster.rastersize[COLORTYPE_BLACK];
+ next_raster.rasterdata[COLORTYPE_BLACK] = raster.rasterdata[COLORTYPE_BLACK];
+ }
+
+ return true;
+}
+
diff --git a/prnt/hpcups/Mode9.h b/prnt/hpcups/Mode9.h
new file mode 100644
index 0000000..9c5acbe
--- /dev/null
+++ b/prnt/hpcups/Mode9.h
@@ -0,0 +1,51 @@
+/*****************************************************************************\
+ Mode9.h : Interface for the Mode9 class
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+#ifndef MODE9_H
+#define MODE9_H
+
+#include "CommonDefinitions.h"
+#include "Processor.h"
+#include "Compressor.h"
+
+class Mode9 : public Compressor
+{
+public:
+ Mode9(unsigned int RasterSize, bool bPackedBits = true);
+ virtual ~Mode9();
+ bool Process(RASTERDATA* input);
+ bool NextOutputRaster (RASTERDATA& next_raster);
+ void Flush();
+ bool ResetSeedRow;
+ bool m_bPackedBits;
+}; // Mode9
+
+#endif // MODE9_H
+
diff --git a/prnt/hpcups/ModeDeltaPlus.cpp b/prnt/hpcups/ModeDeltaPlus.cpp
new file mode 100644
index 0000000..325d610
--- /dev/null
+++ b/prnt/hpcups/ModeDeltaPlus.cpp
@@ -0,0 +1,568 @@
+/*****************************************************************************\
+ ModeDeltaPlus.cpp : Implementation of ModeDeltaPlus class
+
+ Copyright (c) 1996 - 2009, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+#include "ModeDeltaPlus.h"
+
+ModeDeltaPlus::ModeDeltaPlus
+(
+ unsigned int PlaneSize
+) :
+ Compressor(PlaneSize, true),
+ pbyInputImageBuffer (NULL),
+ pbySeedRow (NULL),
+ m_bLastBand(false)
+{
+ inputsize = PlaneSize;
+ inputsize = ((inputsize + 7) / 8) * 8;
+ m_lCurrCDRasterRow = 0;
+ m_lPrinterRasterRow = 0;
+ iRastersReady = 0;
+ m_bCompressed = false;
+ m_compressedsize = 0;
+ m_fRatio = 0;
+} // ModeDeltaPlus::ModeDeltaPlus
+
+DRIVER_ERROR ModeDeltaPlus::Init()
+{
+ // allocate a 2X compression buffer..
+ compressBuf = new BYTE[2 * INDY_STRIP_HEIGHT * inputsize];
+ if (compressBuf == NULL)
+ {
+ return ALLOCMEM_ERROR;
+ }
+ memset (compressBuf, 0x00, 2 * INDY_STRIP_HEIGHT * inputsize);
+
+ pbyInputImageBuffer = new BYTE[INDY_STRIP_HEIGHT * inputsize];
+ if (pbyInputImageBuffer == NULL)
+ return ALLOCMEM_ERROR;
+ memset(pbyInputImageBuffer, 0x00, INDY_STRIP_HEIGHT * inputsize);
+
+ pbySeedRow = new BYTE[inputsize];
+ if (pbySeedRow == NULL)
+ {
+ return ALLOCMEM_ERROR;
+ }
+ memset (pbySeedRow, 0, inputsize * sizeof (BYTE));
+ return NO_ERROR;
+}
+
+ModeDeltaPlus::~ModeDeltaPlus ()
+{
+ if (pbyInputImageBuffer)
+ {
+ delete [] pbyInputImageBuffer;
+ pbyInputImageBuffer = NULL;
+ }
+ if (pbySeedRow)
+ {
+ delete [] pbySeedRow;
+ pbySeedRow = NULL;
+ }
+
+} // ModeDeltaPlus::~ModeDeltaPlus
+
+/*
+ * The maximum width of a line, which is limited by the amount of hardware
+ * buffer space allocated to storing the seedrow.
+ */
+#define ROW_LIMIT 7040
+/*
+ * The maximum number of literals in a single command, not counting the first
+ * pixel. This is limited by the hardware buffer used to store a literal
+ * string. For real images, I expect a value of 64 would be a suitable
+ * minimum. The minimum compression ratio will be bounded by this. Note also
+ * that the software does not need any buffer for this, so there need be no
+ * limit at all on a purely software implementation. For the sake of enabling
+ * a hardware implementation, I would strongly recommend leaving it in and set
+ * to some reasonable value (say 1023 or 255).
+ */
+#define LITERAL_LIMIT 511
+
+/* These are set up this way to make it easy to change the predictions. */
+#define LTEST_W col > 0
+#define LVAL_W(col) cur_row[col-1]
+#define LTEST_NW col > 0
+#define LVAL_NW(col) seedrow[col-1]
+#define LTEST_WW col > 1
+#define LVAL_WW(col) cur_row[col-2]
+#define LTEST_NWW col > 1
+#define LVAL_NWW(col) seedrow[col-2]
+#define LTEST_NE (col+1) < row_width
+#define LVAL_NE(col) seedrow[col+1]
+#define LTEST_NEWCOL 1
+#define LVAL_NEWCOL(col) new_color
+#define LTEST_CACHE 1
+#define LVAL_CACHE(col) cache
+
+#define LOC1TEST LTEST_NE
+#define LOC1VAL(col) LVAL_NE(col)
+#define LOC2TEST LTEST_NW
+#define LOC2VAL(col) LVAL_NW(col)
+#define LOC3TEST LTEST_NEWCOL
+#define LOC3VAL(col) LVAL_NEWCOL(col)
+
+#define check(condition) if (!(condition)) return 0
+
+#define write_comp_byte(val) \
+ check(outptr < pastoutmem); \
+ *outptr++ = (BYTE) val;
+
+#define read_byte(val) \
+ check(inmem < pastinmem); \
+ val = *inmem++;
+
+#define encode_count(count, over, mem) \
+ if (count >= over) \
+ { \
+ count -= over; \
+ if (count <= (uint32_t) 253) \
+ { \
+ check(mem < pastoutmem); \
+ *mem++ = (BYTE) count; \
+ } \
+ else if (count <= (uint32_t) (254 + 255) ) \
+ { \
+ check((mem+1) < pastoutmem); \
+ check( count >= 254 ); \
+ check( (count - 254) <= 255 ); \
+ *mem++ = (BYTE) 0xFE; \
+ *mem++ = (BYTE) (count - 254); \
+ } \
+ else \
+ { \
+ check((mem+2) < pastoutmem); \
+ check( count >= 255 ); \
+ check( (count - 255) <= 65535 ); \
+ count -= 255; \
+ *mem++ = (BYTE) 0xFF; \
+ *mem++ = (BYTE) (count >> 8); \
+ *mem++ = (BYTE) (count & 0xFF); \
+ } \
+ }
+#define decode_count(count, over) \
+ if (count >= over) \
+ { \
+ read_byte(inval); \
+ count += (uint32_t) inval; \
+ if (inval == (BYTE) 0xFE) \
+ { \
+ read_byte(inval); \
+ count += (uint32_t) inval; \
+ } \
+ else if (inval == (BYTE) 0xFF) \
+ { \
+ read_byte(inval); \
+ count += (((uint32_t) inval) << 8); \
+ read_byte(inval); \
+ count += (uint32_t) inval; \
+ } \
+ }
+
+#define bytes_for_count(count, over) \
+ ( (count >= 255) ? 3 : (count >= over) ? 1 : 0 )
+
+
+/* The number of bytes we should be greater than to call memset/memcpy */
+#define memutil_thresh 15
+
+BYTE* ModeDeltaPlus::encode_header(BYTE* outptr, const BYTE* pastoutmem, uint32_t isrun, uint32_t location, uint32_t seedrow_count, uint32_t run_count, const BYTE new_color)
+{
+ uint32_t byte;
+
+ check (location < 4);
+ check( (isrun == 0) || (isrun == 1) );
+
+ /* encode "literal" in command byte */
+ byte = (isrun << 7) | (location << 5);
+
+ /* write out number of seedrow bytes to copy */
+ if (seedrow_count > 2)
+ byte |= (0x03 << 3);
+ else
+ byte |= (seedrow_count << 3);
+
+ if (run_count > 6)
+ byte |= 0x07;
+ else
+ byte |= run_count;
+
+ /* write out command byte */
+ write_comp_byte(byte);
+
+ /* macro to write count if it's 3 or more */
+ encode_count( seedrow_count, 3, outptr );
+
+ /* if required, write out color of first pixel */
+ if (location == 0)
+ {
+ write_comp_byte( new_color );
+ }
+
+ /* macro to write count if it's 7 or more */
+ encode_count( run_count, 7, outptr );
+
+ return outptr;
+}
+
+/******************************************************************************/
+/* COMPRESSION */
+/******************************************************************************/
+bool ModeDeltaPlus::compress (BYTE *outmem,
+ uint32_t *outlen,
+ const BYTE *inmem,
+ const uint32_t row_width,
+ const uint32_t inheight,
+ uint32_t horz_ht_dist)
+{
+ register BYTE *outptr = outmem;
+ register uint32_t col;
+ const BYTE *seedrow;
+ uint32_t seedrow_count = 0;
+ uint32_t location = 0;
+ BYTE new_color = (BYTE) 0xFF;
+ const BYTE *cur_row;
+ uint32_t row;
+ const BYTE *pastoutmem = outmem + *outlen;
+ uint32_t do_word_copies;
+ /* Halftone distance must be 1-32 (but allow 0 == 1) */
+ if (horz_ht_dist > 32)
+ {
+ return false;
+ }
+ if (horz_ht_dist < 1)
+ {
+ horz_ht_dist = 1;
+ }
+
+ seedrow = pbySeedRow;
+ do_word_copies = ((row_width % 4) == 0);
+
+ for (row = 0; row < inheight; row++)
+ {
+ cur_row = inmem + (row * row_width);
+
+ col = 0;
+ while (col < row_width)
+ {
+ /* First look for seedrow copy */
+ seedrow_count = 0;
+ if (do_word_copies)
+ {
+ /* Try a fast word-based search */
+ while (((col & 3) != 0) &&
+ (col < row_width) &&
+ (cur_row[col] == seedrow[col]))
+ {
+ seedrow_count++;
+ col++;
+ }
+ if ( (col & 3) == 0)
+ {
+ while (((col+3) < row_width) &&
+ *((const uint32_t*) (cur_row + col)) == *((const uint32_t*) (seedrow + col)))
+ {
+ seedrow_count += 4;
+ col += 4;
+ }
+ }
+ }
+ while ((col < row_width) && (cur_row[col] == seedrow[col]))
+ {
+ seedrow_count++;
+ col++;
+ }
+
+ /* It is possible that we have hit the end of the line already. */
+ if (col == row_width)
+ {
+ /* encode pure seed run as fake run */
+ outptr = encode_header(outptr, pastoutmem, 1 /*run*/, 1 /*location*/, seedrow_count, 0 /*runcount*/, (BYTE) 0 /*color*/);
+ /* exit the while loop for this row */
+ break;
+ }
+ check(col < row_width);
+
+ /* determine the prediction for the current pixel */
+ if ( (LOC1TEST) && (cur_row[col] == LOC1VAL(col)) )
+ location = 1;
+ else if ( (LOC2TEST) && (cur_row[col] == LOC2VAL(col)) )
+ location = 2;
+ else if ( (LOC3TEST) && (cur_row[col] == LOC3VAL(col)) )
+ location = 3;
+ else
+ {
+ location = 0;
+ new_color = cur_row[col];
+ }
+
+
+ /* Look for a run */
+ if (
+ ((col+1) < row_width)
+ &&
+ ((col+1) >= horz_ht_dist)
+ &&
+ (cur_row[col+1-horz_ht_dist] == cur_row[col+1])
+ )
+ {
+ /* We found a run. Determine the length. */
+ uint32_t run_count = 0; /* Actually 2 */
+ col++;
+ while ( ((col+1) < row_width) && (cur_row[col+1-horz_ht_dist] == cur_row[col+1]) )
+ {
+ run_count++;
+ col++;
+ }
+ col++;
+ outptr = encode_header(outptr, pastoutmem, 1 /*run*/, location, seedrow_count, run_count, new_color);
+ }
+
+ else
+
+ /* We didn't find a run. Encode literal(s). */
+ {
+ uint32_t replacement_count = 0; /* Actually 1 */
+ const BYTE* byte_array = cur_row + col + 1;
+ uint32_t i;
+ col++;
+ /*
+ * The (col+1) in this test is used because there is no need to
+ * check for literal breaks if this is the last byte of the row.
+ * Instead we just tack it on to our literal count at the end.
+ */
+ while ( (col+1) < row_width )
+ {
+ /*
+ * All cases that will break with 1 unit saved. This
+ * should be the best breaking spots, since we will always
+ * gain with the break, but never break for no gain. This
+ * leads to longer strings which is good for decomp speed.
+ */
+ if (
+ /* Seedrow ... */
+ (
+ (cur_row[col] == seedrow[col])
+ &&
+ (
+ /* 2 seedrows */
+ (
+ (cur_row[col+1] == seedrow[col+1])
+ )
+ ||
+ /* seedrow and predict */
+ (
+ (cur_row[col+1] == LVAL_NW(col+1))
+ ||
+ (cur_row[col+1] == LVAL_NEWCOL(col+1))
+ )
+ ||
+ (
+ ((col+2) < row_width)
+ &&
+ (
+ /* seedrow and run */
+ (
+ ((col + 2) >= horz_ht_dist) &&
+ (cur_row[col+2-horz_ht_dist] == cur_row[col+2])
+ )
+ ||
+ /* seedrow and northeast predict */
+ (cur_row[col+1] == LVAL_NE(col+1))
+ )
+ )
+ )
+ )
+ ||
+ /* Run ... */
+ (
+ (cur_row[col] != seedrow[col])
+ &&
+ ((col + 1) >= horz_ht_dist)
+ &&
+ (cur_row[col+1-horz_ht_dist] == cur_row[col+1])
+ &&
+ (
+ /* Run of 3 or more */
+ (
+ ((col+2) < row_width)
+ &&
+ ((col + 2) >= horz_ht_dist)
+ &&
+ (cur_row[col+2-horz_ht_dist] == cur_row[col+2])
+ )
+ ||
+ /* Predict first unit of run */
+ (cur_row[col] == LVAL_NE(col))
+ ||
+ (cur_row[col] == LVAL_NW(col))
+ ||
+ (cur_row[col] == LVAL_NEWCOL(col))
+ )
+ )
+ )
+ break;
+
+ /* limited hardware buffer */
+ if (replacement_count >= LITERAL_LIMIT)
+ break;
+
+ /* add another literal to the list */
+ replacement_count++;
+ col++;
+ }
+
+ /* If almost at end of block, just extend the literal by one */
+ if ( (col+1) == row_width ) {
+ replacement_count++;
+ col++;
+ }
+
+ outptr = encode_header(outptr, pastoutmem, 0 /*not run*/, location, seedrow_count, replacement_count, new_color);
+
+ /* Copy bytes from the byte array. If rc was 1, then we will
+ * have encoded a zero in the command byte, so nothing will be
+ * copied here (the 1 indicates the first pixel, which was
+ * written above or was predicted. If rc is between 2 and 7,
+ * then a value between 1 and 6 will have been written in the
+ * command byte, and we will copy it directly. If 8 or more,
+ * then we encode more counts, then finally copy all the values
+ * from byte_array.
+ */
+
+ if (replacement_count > 0)
+ {
+ /* Now insert rc bytes of data from byte_array */
+ if (replacement_count > memutil_thresh)
+ {
+ check( (outptr + replacement_count) <= pastoutmem );
+ memcpy(outptr, byte_array, (size_t) replacement_count);
+ outptr += replacement_count;
+ }
+ else
+ {
+ for (i = 0; i < replacement_count; i++)
+ {
+ write_comp_byte( byte_array[i] );
+ }
+ }
+ }
+ }
+
+ } /* end of column */
+
+ /* save current row as next row's seed row */
+ seedrow = cur_row;
+
+ } /* end of row */
+
+ check( outptr <= pastoutmem );
+ if (outptr > pastoutmem)
+ {
+ /* We're in big trouble -- we wrote PAST the end of their memory! */
+ *outlen = 0;
+ return 0;
+ }
+
+ *outlen = (uint32_t) (outptr - outmem);
+
+ return 1;
+} /* end of deltaplus_compress2 */
+
+
+bool ModeDeltaPlus::Process
+(
+ RASTERDATA* input
+)
+{
+ if (input==NULL ||
+ (input->rasterdata[COLORTYPE_COLOR]==NULL && input->rasterdata[COLORTYPE_BLACK]==NULL)) // flushing pipeline
+ {
+ return false;
+ }
+ if (input->rasterdata[COLORTYPE_COLOR])
+ {
+ if (m_lCurrCDRasterRow < INDY_STRIP_HEIGHT )
+ {
+ //Copy the data to m_SourceBitmap
+ memcpy(pbyInputImageBuffer + m_lCurrCDRasterRow * inputsize, input->rasterdata[COLORTYPE_COLOR], input->rastersize[COLORTYPE_COLOR]);
+ m_lCurrCDRasterRow ++;
+ }
+ if (m_lCurrCDRasterRow == INDY_STRIP_HEIGHT || m_bLastBand)
+ {
+ m_compressedsize = 2 * inputsize * INDY_STRIP_HEIGHT;
+ bool bRet = compress (compressBuf,
+ &m_compressedsize,
+ pbyInputImageBuffer,
+ inputsize,
+ m_lCurrCDRasterRow,
+ 16
+ );
+ if (!bRet)
+ {
+ memcpy (compressBuf, pbyInputImageBuffer, inputsize * INDY_STRIP_HEIGHT);
+ m_compressedsize = inputsize * INDY_STRIP_HEIGHT;
+ }
+ else
+ {
+ m_bCompressed = true;
+ }
+
+ memset(pbyInputImageBuffer, 0x00, inputsize * INDY_STRIP_HEIGHT);
+
+ m_lPrinterRasterRow += m_lCurrCDRasterRow;
+ m_lCurrBlockHeight = m_lCurrCDRasterRow;
+ m_lCurrCDRasterRow = 0;
+ iRastersReady = 1;
+ m_bLastBand = false;
+ }
+ else
+ {
+ return false;
+ }
+ }
+ return true;
+} //Process
+
+bool ModeDeltaPlus::NextOutputRaster(RASTERDATA &next_raster)
+{
+ if (iRastersReady==0)
+ return false;
+
+ next_raster.rastersize[COLORTYPE_COLOR] = m_compressedsize;
+ if (m_compressedsize > 0)
+ {
+ next_raster.rasterdata[COLORTYPE_COLOR] = compressBuf;
+ }
+ next_raster.rastersize[COLORTYPE_BLACK] = 0;
+ next_raster.rasterdata[COLORTYPE_BLACK] = NULL;
+ iRastersReady=0;
+ return true;
+}
+
diff --git a/prnt/hpcups/ModeDeltaPlus.h b/prnt/hpcups/ModeDeltaPlus.h
new file mode 100644
index 0000000..4891394
--- /dev/null
+++ b/prnt/hpcups/ModeDeltaPlus.h
@@ -0,0 +1,97 @@
+/*****************************************************************************\
+ DeltaPlus.h : Interface for the DeltaPlus class
+
+ Copyright (c) 1996 - 2009, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+#ifndef MODE_DELTAPLUS_H
+#define MODE_DELTAPLUS_H
+
+#include "CommonDefinitions.h"
+#include "Processor.h"
+#include "Compressor.h"
+
+#define INDY_STRIP_HEIGHT 128
+
+class ModeDeltaPlus : public Compressor
+{
+public:
+ ModeDeltaPlus(unsigned int RasterSize);
+ virtual ~ModeDeltaPlus();
+ DRIVER_ERROR Init();
+ bool Process(RASTERDATA *input);
+ bool NextOutputRaster(RASTERDATA &next_raster);
+ bool IsCompressed()
+ {
+ return m_bCompressed;
+ }
+ BYTE GetFRatio()
+ {
+ return (BYTE) (m_fRatio + 0.5);
+ }
+ long GetCurrentRasterRow()
+ {
+ return m_lPrinterRasterRow;
+ }
+ long GetCurrentBlockHeight()
+ {
+ return m_lCurrBlockHeight;
+ }
+ void NewPage()
+ {
+ m_lPrinterRasterRow = 0;
+ m_bLastBand = false;
+ }
+ void SetLastBand()
+ {
+ m_bLastBand = true;
+ }
+
+private:
+ bool compress(BYTE *outmem, uint32_t *outlen, const BYTE *inmem,
+ const uint32_t row_width, const uint32_t inheight,
+ uint32_t horz_ht_dist);
+
+ BYTE *encode_header(BYTE *outptr, const BYTE *pastoutmem, uint32_t isrun,
+ uint32_t location, uint32_t seedrow_count, uint32_t run_count,
+ const BYTE new_color);
+
+ BYTE *pbyInputImageBuffer;
+
+ long m_lCurrCDRasterRow; // Current raster index. in PrintNextBand
+ long m_lCurrBlockHeight;
+ long m_lPrinterRasterRow; // Current printer raster row.
+
+ uint32_t m_compressedsize;
+ bool m_bCompressed;
+ float m_fRatio;
+ BYTE *pbySeedRow;
+ bool m_bLastBand;
+}; // ModeDeltaPlus
+
+#endif // MODE_DELTAPLUS_H
+
diff --git a/prnt/hpcups/ModeJbig.cpp b/prnt/hpcups/ModeJbig.cpp
new file mode 100644
index 0000000..d009fef
--- /dev/null
+++ b/prnt/hpcups/ModeJbig.cpp
@@ -0,0 +1,351 @@
+/*****************************************************************************\
+ ModeJbig.cpp : Implementation for the ModeJbig class
+
+ Copyright (c) 1996 - 2009, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ Author: Naga Samrat Chowdary Narla,
+\*****************************************************************************/
+
+#include "CommonDefinitions.h"
+#include "Compressor.h"
+#include "Pipeline.h"
+#include "ModeJbig.h"
+#include "hpjbig_wrapper.h"
+#include <dlfcn.h>
+#include "Utils.h"
+
+extern "C"
+{
+int (*HPLJJBGCompress) (int iWidth, int iHeight, unsigned char **pBuff,
+ HPLJZjcBuff *pOutBuff, HPLJZjsJbgEncSt *pJbgEncSt);
+int (*HPLJSoInit) (int iFlag);
+}
+
+const BYTE ModeJbig::szByte1[256] =
+ {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 42, 42, 42, 42, 42, 42, 42, 42,
+ 42, 42, 42, 42, 42, 42, 42, 42, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+ 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+ 130, 130, 130, 130, 136, 136, 136, 136, 136, 136, 136, 136,
+ 136, 136, 136, 136, 136, 136, 136, 136, 138, 138, 138, 138,
+ 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138,
+ 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+ 160, 160, 160, 160, 162, 162, 162, 162, 162, 162, 162, 162,
+ 162, 162, 162, 162, 162, 162, 162, 162, 168, 168, 168, 168,
+ 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
+ 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
+ 170, 170, 170, 170,
+ };
+const BYTE ModeJbig::szByte2[256] =
+ {
+ 0, 2, 8, 10, 32, 34, 40, 42, 128, 130, 136, 138,
+ 160, 162, 168, 170, 0, 2, 8, 10, 32, 34, 40, 42,
+ 128, 130, 136, 138, 160, 162, 168, 170, 0, 2, 8, 10,
+ 32, 34, 40, 42, 128, 130, 136, 138, 160, 162, 168, 170,
+ 0, 2, 8, 10, 32, 34, 40, 42, 128, 130, 136, 138,
+ 160, 162, 168, 170, 0, 2, 8, 10, 32, 34, 40, 42,
+ 128, 130, 136, 138, 160, 162, 168, 170, 0, 2, 8, 10,
+ 32, 34, 40, 42, 128, 130, 136, 138, 160, 162, 168, 170,
+ 0, 2, 8, 10, 32, 34, 40, 42, 128, 130, 136, 138,
+ 160, 162, 168, 170, 0, 2, 8, 10, 32, 34, 40, 42,
+ 128, 130, 136, 138, 160, 162, 168, 170, 0, 2, 8, 10,
+ 32, 34, 40, 42, 128, 130, 136, 138, 160, 162, 168, 170,
+ 0, 2, 8, 10, 32, 34, 40, 42, 128, 130, 136, 138,
+ 160, 162, 168, 170, 0, 2, 8, 10, 32, 34, 40, 42,
+ 128, 130, 136, 138, 160, 162, 168, 170, 0, 2, 8, 10,
+ 32, 34, 40, 42, 128, 130, 136, 138, 160, 162, 168, 170,
+ 0, 2, 8, 10, 32, 34, 40, 42, 128, 130, 136, 138,
+ 160, 162, 168, 170, 0, 2, 8, 10, 32, 34, 40, 42,
+ 128, 130, 136, 138, 160, 162, 168, 170, 0, 2, 8, 10,
+ 32, 34, 40, 42, 128, 130, 136, 138, 160, 162, 168, 170,
+ 0, 2, 8, 10, 32, 34, 40, 42, 128, 130, 136, 138,
+ 160, 162, 168, 170,
+ };
+
+
+ModeJbig::ModeJbig (unsigned int RasterSize) : Compressor (RasterSize, false)
+{
+ m_hHPLibHandle = 0;
+ m_pszInputRasterData = 0;
+ m_iWidth = ((RasterSize + 31) / 32) * 4;
+ m_iPlaneNumber = 0;
+ m_iCurrentPlane = 0;
+ m_bLastBand = false;
+ for (int i = 0; i < 4; i++)
+ {
+ m_iCurRasterPerPlane[i] = 0;
+ }
+
+ m_iP[0] = 0;
+}
+
+ModeJbig::~ModeJbig()
+{
+ if (m_hHPLibHandle)
+ {
+ dlclose(m_hHPLibHandle);
+ }
+ if (m_pszInputRasterData)
+ {
+ delete [] m_pszInputRasterData;
+ }
+}
+
+DRIVER_ERROR ModeJbig::Init(int iLastRaster, int iPlanes, int iBPP, ZJPLATFORM zj_platform)
+{
+ m_iLastRaster = iLastRaster;
+ m_iOrgHeight = iLastRaster;
+ m_iPlanes = iPlanes;
+ m_iBPP = iBPP;
+ m_ezj_platform = zj_platform;
+
+ m_hHPLibHandle = LoadPlugin ("lj.so");
+ if (m_hHPLibHandle)
+ {
+ dlerror ();
+ *(void **) (&HPLJJBGCompress) = dlsym (m_hHPLibHandle, "hp_encode_bits_to_jbig");
+ *(void **) (&HPLJSoInit) = dlsym (m_hHPLibHandle, "hp_init_lib");
+ if (!HPLJSoInit || (HPLJSoInit && !HPLJSoInit (1)))
+ {
+ return PLUGIN_LIBRARY_MISSING;
+ }
+ }
+ else
+ {
+ return PLUGIN_LIBRARY_MISSING;
+ }
+
+ if (iPlanes == 4)
+ {
+ m_iP[0] = 3;
+ m_iP[1] = 0;
+ m_iP[2] = 1;
+ m_iP[3] = 2;
+ if(zj_platform == ZJCOLOR2)
+ {
+ m_iP[1] = 2;
+ m_iP[3] = 0;
+ }
+ }
+
+ int buffer_size = m_iWidth * m_iLastRaster * m_iPlanes * m_iBPP;
+ m_pszInputRasterData = new BYTE[buffer_size];
+ if (m_pszInputRasterData == NULL)
+ {
+ return ALLOCMEM_ERROR;
+ }
+ compressBuf = new BYTE[m_iWidth * m_iLastRaster * m_iBPP];
+ if (compressBuf == NULL)
+ {
+ return ALLOCMEM_ERROR;
+ }
+ m_pszCurPtr = m_pszInputRasterData;
+ memset(m_pszCurPtr, 0, buffer_size);
+ return NO_ERROR;
+}
+
+void ModeJbig::Flush()
+{
+ if (m_iCurRasterPerPlane[m_iPlaneNumber] > 0)
+ {
+ int height = m_iLastRaster;
+ m_iLastRaster = m_iCurRasterPerPlane[m_iPlaneNumber];
+ if (m_iPlanes == 1) {
+ compress();
+ m_iLastRaster = height;
+ }
+ iRastersReady = 1;
+ }
+}
+
+bool ModeJbig::Process (RASTERDATA* input)
+{
+ if (input==NULL)
+ {
+ compressedsize = 0;
+ iRastersReady = 0;
+ return false;
+ }
+
+ bool bResult = false;
+ switch(m_ezj_platform)
+ {
+ case ZJSTREAM:
+ bResult = processZJStream(input);
+ break;
+ case ZXSTREAM:
+ bResult = processZXStream(input);
+ break;
+ case ZJCOLOR:
+ case ZJCOLOR2:
+ if (m_iPlanes == 1)
+ {
+ bResult = processZXStream(input);
+ break;
+ }
+ bResult = processZJColor(input);
+ break;
+ }
+ if (iRastersReady)
+ {
+ m_iCurRasterPerPlane[m_iPlaneNumber] = 0;
+ m_pszCurPtr = m_pszInputRasterData;
+ }
+ return bResult;
+}
+
+bool ModeJbig::processZJStream(RASTERDATA *input)
+{
+ if (input->rasterdata[COLORTYPE_COLOR])
+ {
+ memcpy(m_pszCurPtr, input->rasterdata[COLORTYPE_COLOR],
+ input->rastersize[COLORTYPE_COLOR]);
+ }
+
+ m_iCurRasterPerPlane[0]++;
+ m_pszCurPtr += m_iWidth;
+
+ if (m_iCurRasterPerPlane[0] == m_iLastRaster)
+ {
+ compress();
+ iRastersReady = 1;
+ return true;
+ }
+ return false;
+}
+
+bool ModeJbig::processZXStream(RASTERDATA *input)
+{
+ if (input->rasterdata[COLORTYPE_COLOR])
+ {
+ for (int i = 0; i < input->rastersize[COLORTYPE_COLOR]; i++)
+ {
+ m_pszCurPtr[i*m_iBPP] = szByte1[input->rasterdata[COLORTYPE_COLOR][i]];
+ m_pszCurPtr[i*m_iBPP+1] = szByte2[input->rasterdata[COLORTYPE_COLOR][i]];
+ m_pszCurPtr[i*m_iBPP] |= (m_pszCurPtr[i*m_iBPP] >> 1);
+ m_pszCurPtr[i*m_iBPP+1] |= (m_pszCurPtr[i*m_iBPP+1] >> 1);
+ }
+ }
+
+ m_iCurRasterPerPlane[0]++;
+ m_pszCurPtr += m_iWidth * m_iBPP;
+ if (m_iCurRasterPerPlane[0] == m_iLastRaster)
+ {
+ compress();
+ iRastersReady = 1;
+ return true;
+ }
+ return false;
+}
+bool ModeJbig::processZJColor(RASTERDATA *input)
+{
+ BYTE *p = m_pszCurPtr + (m_iP[m_iPlaneNumber] * m_iWidth * m_iBPP) * m_iLastRaster;
+ if (input->rasterdata[COLORTYPE_COLOR])
+ {
+ for (int i = 0; i < input->rastersize[COLORTYPE_COLOR]; i++)
+ {
+ p[i*m_iBPP] = szByte1[input->rasterdata[COLORTYPE_COLOR][i]];
+ p[i*m_iBPP+1] = szByte2[input->rasterdata[COLORTYPE_COLOR][i]];
+ p[i*m_iBPP] |= (p[i*m_iBPP] >> 1);
+ p[i*m_iBPP+1] |= (p[i*m_iBPP+1] >> 1);
+ }
+ }
+
+ m_iCurRasterPerPlane[m_iPlaneNumber]++;
+ if (m_iCurRasterPerPlane[m_iPlaneNumber] == m_iLastRaster && m_iPlaneNumber == 3)
+ {
+ iRastersReady = 1;
+ m_pszCurPtr = m_pszInputRasterData;
+ m_iPlaneNumber = 0;
+ return true;
+ }
+ m_iPlaneNumber++;
+ if (m_iPlaneNumber == 4)
+ {
+ m_pszCurPtr += m_iBPP * m_iWidth;
+ m_iPlaneNumber = 0;
+ }
+ return false;
+}
+
+bool ModeJbig::NextOutputRaster(RASTERDATA& next_raster)
+{
+ if (iRastersReady == 0)
+ {
+ return false;
+ }
+
+ if (m_iPlanes == 4)
+ {
+ compress(m_iCurrentPlane++);
+ }
+ next_raster.rastersize[COLORTYPE_COLOR] = compressedsize;
+ next_raster.rasterdata[COLORTYPE_COLOR] = compressBuf;
+ next_raster.rastersize[COLORTYPE_BLACK] = 0;
+ next_raster.rasterdata[COLORTYPE_BLACK] = NULL;
+
+ if (m_iPlanes == 1 || (m_iCurrentPlane == 4))
+ {
+ iRastersReady = 0;
+ m_iCurrentPlane = 0;
+ m_iLastRaster = m_iOrgHeight;
+ }
+ return true;
+}
+
+void ModeJbig::compress (int plane_number)
+{
+ HPLJZjcBuff myBuffer;
+
+ HPLJZjsJbgEncSt se;
+ myBuffer.pszCompressedData = compressBuf;
+ myBuffer.dwTotalSize = 0;
+ BYTE *p = m_pszInputRasterData + (m_iWidth * m_iBPP * m_iLastRaster * plane_number);
+
+ memset (myBuffer.pszCompressedData, 0, m_iWidth * m_iLastRaster * m_iBPP);
+ HPLJJBGCompress (m_iWidth * 8 * m_iBPP, m_iLastRaster, &p, &myBuffer, &se);
+
+ compressedsize = myBuffer.dwTotalSize;
+ memcpy(compressBuf+compressedsize, &se, sizeof(se));
+ iRastersReady = 1;
+ m_iCurRasterPerPlane[plane_number] = 0;
+ m_pszCurPtr = m_pszInputRasterData;
+ int buffer_size = m_iWidth * m_iLastRaster * m_iBPP;
+ memset(p, 0, buffer_size);
+ return;
+}
+
diff --git a/prnt/hpcups/ModeJbig.h b/prnt/hpcups/ModeJbig.h
new file mode 100644
index 0000000..34faf68
--- /dev/null
+++ b/prnt/hpcups/ModeJbig.h
@@ -0,0 +1,99 @@
+/*****************************************************************************\
+ ModeJbig.h : Interface for the ModeJbig class
+
+ Copyright (c) 1996 - 2009, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ Author: Naga Samrat Chowdary Narla,
+\*****************************************************************************/
+
+#ifndef MODE_JBIG_H
+#define MODE_JBIG_H
+
+#include "CommonDefinitions.h"
+#include "Processor.h"
+#include "Compressor.h"
+
+#define INDY_STRIP_HEIGHT 128
+typedef enum
+{
+ ZJSTREAM,
+ ZXSTREAM,
+ ZJCOLOR,
+ ZJCOLOR2
+} ZJPLATFORM;
+
+class ModeJbig : public Compressor
+{
+public:
+ ModeJbig(unsigned int RasterSize);
+ virtual ~ModeJbig();
+ bool Process(RASTERDATA *input);
+ bool NextOutputRaster(RASTERDATA &next_raster);
+ DRIVER_ERROR Init(int height, int num_planes, int bpp, ZJPLATFORM ezj_platform);
+ void NewPage()
+ {
+ m_pszCurPtr = m_pszInputRasterData;
+ if (m_pszCurPtr)
+ memset (m_pszCurPtr, 0, (m_iWidth * m_iLastRaster * m_iPlanes * m_iBPP));
+ }
+ void Flush();
+ void SetBandHeight(int height)
+ {
+ m_iLastRaster = height;
+ }
+ void SetLastBand()
+ {
+ m_bLastBand = true;
+ }
+
+private:
+ void compress(int plane_number = 0);
+ bool processZJStream(RASTERDATA *input);
+ bool processZXStream(RASTERDATA *input);
+ bool processZJColor(RASTERDATA *input);
+
+ static const BYTE szByte1[256];
+ static const BYTE szByte2[256];
+
+ void *m_hHPLibHandle;
+ int m_iWidth;
+ int m_iLastRaster;
+ int m_iOrgHeight;
+ BYTE *m_pszCurPtr;
+ BYTE *m_pszInputRasterData;
+ int m_iPlanes;
+ int m_iBPP;
+ bool m_bLastBand;
+ ZJPLATFORM m_ezj_platform;
+ int m_iP[4];
+ int m_iCurRasterPerPlane[4];
+ int m_iPlaneNumber;
+ int m_iCurrentPlane;
+}; // ModeJbig
+
+#endif // MODE_JBIG_H
+
diff --git a/prnt/hpcups/ModeJpeg.cpp b/prnt/hpcups/ModeJpeg.cpp
new file mode 100644
index 0000000..4949c04
--- /dev/null
+++ b/prnt/hpcups/ModeJpeg.cpp
@@ -0,0 +1,532 @@
+/*****************************************************************************\
+ ModeJpeg.cpp : Jpeg compressor implementation
+
+ Copyright (c) 1996 - 2009, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+#include "CommonDefinitions.h"
+#include <setjmp.h>
+#include "ModeJpeg.h"
+#include <dlfcn.h>
+#include "Utils.h"
+
+#define MAX_JPEG_FILE_SIZE 2097152 // 2 Mgabytes
+
+extern "C"
+{
+ int (*HPLJJRCompress) (BYTE *pCompressedData,
+ uint32_t *pCompressedDataLen,
+ BYTE *InputData,
+ const uint32_t uiLogicalImageWidth,
+ const uint32_t uiLogicalImageHeight);
+}
+
+ModeJpeg::ModeJpeg(unsigned int raster_width) : Compressor (raster_width, false)
+{
+ m_eCompressor = COMPRESSOR_JPEG_QUICKCONNECT;
+ m_iColorMode = 0;
+ m_max_file_size = MAX_JPEG_FILE_SIZE;;
+ compressedsize = 0;
+ m_iRowWidth = (int) raster_width * 3;
+ m_iRowNumber = 0;
+ m_iBandHeight = 0;
+ m_uiGrayscaleOffset = 0;
+ m_pbyInputBuffer = NULL;
+ m_hHPLibHandle = NULL;
+ compressBuf = NULL;
+
+// Don't need originalKData buffer allocate by Compressor, delete it
+ if (originalKData)
+ {
+ delete [] originalKData;
+ originalKData = NULL;
+ }
+}
+
+DRIVER_ERROR ModeJpeg::Init(int max_file_size, int page_height)
+{
+ int buffer_size = m_iRowWidth * (page_height + 2);
+ m_pbyInputBuffer = new BYTE[buffer_size];
+ if (m_pbyInputBuffer == NULL)
+ {
+ return ALLOCMEM_ERROR;
+ }
+ if (max_file_size > 0)
+ {
+ m_max_file_size = (unsigned int) max_file_size;
+ }
+ compressBuf = new BYTE[m_max_file_size];
+ if (compressBuf == NULL)
+ {
+ return ALLOCMEM_ERROR;
+ }
+ m_iBandHeight = page_height;
+ return NO_ERROR;
+}
+
+DRIVER_ERROR ModeJpeg::Init(int color_mode, int band_height, COMPRESS_MODE *eCompressMode, QTableInfo *qtable_info)
+{
+ DRIVER_ERROR err;
+ m_iColorMode = color_mode;
+ m_pQTableInfo = qtable_info;
+ int buf_size = band_height * m_iRowWidth;
+ err = Init(buf_size, band_height);
+ if (err != NO_ERROR)
+ {
+ return err;
+ }
+
+// If plugin is not available or the plugin does not contain Taos compressor, stay with JPEG compression
+ m_eCompressor = COMPRESSOR_JPEG_JETREADY;
+ if (*eCompressMode == COMPRESS_MODE_LJ)
+ {
+ m_hHPLibHandle = LoadPlugin ("lj.so");
+ if (m_hHPLibHandle)
+ {
+ dlerror ();
+ *(void **) (&HPLJJRCompress) = dlsym (m_hHPLibHandle, "HPJetReadyCompress");
+ if (HPLJJRCompress == NULL)
+ {
+ dlclose(m_hHPLibHandle);
+ m_hHPLibHandle = NULL;
+ *eCompressMode = COMPRESS_MODE_JPEG;
+ }
+ else
+ {
+ m_eCompressor = COMPRESSOR_TAOS;
+ }
+ }
+ }
+ return err;
+}
+
+ModeJpeg::~ModeJpeg()
+{
+ if (m_hHPLibHandle)
+ {
+ dlclose(m_hHPLibHandle);
+ }
+ if (m_pbyInputBuffer)
+ {
+ delete [] m_pbyInputBuffer;
+ }
+}
+
+void ModeJpeg::Flush()
+{
+ if (m_iRowNumber > 0)
+ {
+ compress();
+ }
+}
+
+#define RGBTOGRAY(rgb) (BYTE) ((rgb[0] * 30 + rgb[1] * 59 + rgb[2] * 11) / 100)
+void ModeJpeg::rgbToGray(BYTE *rgbData, int iNumBytes)
+{
+ if (m_eCompressor == COMPRESSOR_TAOS)
+ {
+ BYTE *p = m_pbyInputBuffer + (m_iRowNumber * m_iRowWidth);
+ for (int i = 0; i < iNumBytes; i += 3, rgbData += 3)
+ {
+ *p++ = RGBTOGRAY(rgbData);
+ *p++ = 0;
+ *p++ - 0;
+ }
+ return;
+ }
+ BYTE *p = m_pbyInputBuffer + (m_iRowNumber * m_iRowWidth / 3);
+ for (int i = 0; i < iNumBytes; i += 3, rgbData += 3)
+ {
+ *p++ = 255 - RGBTOGRAY(rgbData);
+ }
+}
+
+bool ModeJpeg::Process(RASTERDATA *input)
+{
+ if (input == NULL)
+ {
+ return false;
+ }
+ if (input->rasterdata[COLORTYPE_COLOR])
+ {
+ if (m_iColorMode == 0)
+ {
+ memcpy(m_pbyInputBuffer + (m_iRowNumber * m_iRowWidth), input->rasterdata[COLORTYPE_COLOR],
+ input->rastersize[COLORTYPE_COLOR]);
+ }
+ else
+ {
+ rgbToGray(input->rasterdata[COLORTYPE_COLOR], input->rastersize[COLORTYPE_COLOR]);
+ }
+ }
+ m_iRowNumber++;
+ if (m_iRowNumber == m_iBandHeight)
+ {
+ compress();
+ return true;
+ }
+ return false;
+}
+
+bool ModeJpeg::NextOutputRaster (RASTERDATA &next_raster)
+{
+ if (iRastersReady == 0)
+ {
+ return false;
+ }
+ if (myplane == COLORTYPE_COLOR && compressedsize != 0)
+ {
+ next_raster.rastersize[COLORTYPE_COLOR] = compressedsize - m_uiGrayscaleOffset;
+ next_raster.rasterdata[COLORTYPE_COLOR] = compressBuf + m_uiGrayscaleOffset;
+ }
+ else
+ {
+ next_raster.rastersize[COLORTYPE_COLOR] = 0;
+ next_raster.rasterdata[COLORTYPE_COLOR] = NULL;
+ }
+ next_raster.rastersize[COLORTYPE_BLACK] = 0;
+ next_raster.rasterdata[COLORTYPE_BLACK] = NULL;
+
+ iRastersReady = 0;
+ m_uiGrayscaleOffset = 0;
+ return true;
+}
+
+static void output_buffer_callback (JOCTET *outbuf, BYTE *buffer, int size)
+{
+ ModeJpeg *pModeJpeg = (ModeJpeg *) outbuf;
+ pModeJpeg->StoreJpegData (buffer, size);
+}
+
+void ModeJpeg::StoreJpegData (BYTE *buffer, int iSize)
+{
+ compressedsize += iSize;
+ if (compressedsize < m_max_file_size)
+ {
+ memcpy (compressBuf + compressedsize - iSize, buffer, iSize);
+ }
+ else
+ {
+ compressedsize = m_max_file_size + 1;
+ }
+}
+
+//----------------------------------------------------------------
+// These are "overrides" to the JPEG library error routines
+//----------------------------------------------------------------
+
+static void HPJpeg_error (j_common_ptr cinfo)
+{
+
+}
+
+extern "C"
+{
+ void jpeg_buffer_dest (j_compress_ptr cinfo, JOCTET* outbuff, void* flush_output_buffer_callback);
+ void hp_rgb_ycc_setup (int iFlag);
+}
+
+void ModeJpeg::compress ()
+{
+ switch(m_eCompressor)
+ {
+ case COMPRESSOR_JPEG_QUICKCONNECT:
+ {
+ jpegCompressForQuickConnect();
+ break;
+ }
+ case COMPRESSOR_JPEG_JETREADY:
+ {
+ jpegCompressForJetReady();
+ break;
+ }
+ case COMPRESSOR_TAOS:
+ {
+ taosCompressForJetReady();
+ break;
+ }
+ }
+ m_iRowNumber = 0;
+ iRastersReady = 1;
+ memset(m_pbyInputBuffer, 0xFF, m_iRowWidth * m_iBandHeight);
+}
+
+void ModeJpeg::jpegCompressForQuickConnect()
+{
+ BYTE *p;
+ int iQuality = 100;
+
+/*
+ * Convert the byte buffer to jpg, if converted size is greater than 2MB, delete it and
+ * convert with a higher compression factor.
+ */
+
+ struct jpeg_compress_struct cinfo;
+ struct jpeg_error_mgr jerr;
+ jmp_buf setjmp_buffer;
+
+ bool bRedo;
+
+// Use the standard RGB to YCC table rather than the modified one for JetReady
+
+ hp_rgb_ycc_setup (0);
+ do
+ {
+ bRedo = 0;
+ compressedsize = 0;
+ memset (compressBuf, 0xFF, m_max_file_size);
+ p = m_pbyInputBuffer;
+
+ cinfo.err = jpeg_std_error (&jerr);
+ jerr.error_exit = HPJpeg_error;
+ if (setjmp (setjmp_buffer))
+ {
+ jpeg_destroy_compress (&cinfo);
+ return;
+ }
+
+ jpeg_create_compress (&cinfo);
+ cinfo.in_color_space = JCS_RGB;
+ jpeg_set_defaults (&cinfo);
+ cinfo.image_width = m_iRowWidth / 3;
+ cinfo.image_height = m_iRowNumber;
+ cinfo.input_components = 3;
+ cinfo.data_precision = 8;
+ jpeg_set_quality (&cinfo, iQuality, TRUE);
+ jpeg_buffer_dest (&cinfo, (JOCTET *) this, (void *) (output_buffer_callback));
+ jpeg_start_compress (&cinfo, TRUE);
+ JSAMPROW pRowArray[1];
+ for (int i = 0; i < m_iRowNumber; i++)
+ {
+ pRowArray[0] = (JSAMPROW) p;
+ jpeg_write_scanlines (&cinfo, pRowArray, 1);
+ p += (m_iRowWidth);
+ if (compressedsize > m_max_file_size)
+ {
+ compressedsize = 0;
+ bRedo = 1;
+ }
+ }
+ jpeg_finish_compress (&cinfo);
+ jpeg_destroy_compress (&cinfo);
+ iQuality -= 10;
+ if (iQuality == 0)
+ {
+ compressedsize = 0;
+ return;
+ }
+ } while (bRedo);
+ return;
+}
+
+void ModeJpeg::jpegCompressForJetReady()
+{
+ struct jpeg_compress_struct cinfo;
+ struct jpeg_error_mgr jerr;
+ jmp_buf setjmp_buffer;
+
+
+// Use the modified Mojave CSC table
+ hp_rgb_ycc_setup (1);
+
+ compressedsize = 0;
+ memset (compressBuf, 0xFF, m_max_file_size);
+
+ cinfo.err = jpeg_std_error (&jerr);
+ jerr.error_exit = HPJpeg_error;
+ if (setjmp (setjmp_buffer))
+ {
+ jpeg_destroy_compress (&cinfo);
+ return;
+ }
+
+ jpeg_create_compress (&cinfo);
+ cinfo.in_color_space = (m_iColorMode == 0) ? JCS_RGB : JCS_GRAYSCALE;
+ jpeg_set_defaults (&cinfo);
+ cinfo.image_width = m_iRowWidth / 3;
+ cinfo.image_height = m_iBandHeight;
+ cinfo.input_components = (m_iColorMode == 0) ? 3 : 1;
+ cinfo.data_precision = 8;
+
+ // Create a static quant table here.
+
+ static unsigned int mojave_quant_table1[64] = {
+ 2,3,4,5,5,5,5,5,
+ 3,6,5,8,5,8,5,8,
+ 4,5,5,5,5,5,5,5,
+ 5,8,5,8,5,8,5,8,
+ 5,5,5,5,5,5,5,5,
+ 5,8,5,8,5,8,5,8,
+ 5,5,5,5,5,5,5,5,
+ 5,8,5,8,5,8,5,8
+ };
+
+ //
+ // JetReady specific Q-Tables will be added here. We do the following:
+ // 1. Add three Q-Tables.
+ // 2. Scale the Q-Table elemets with the given scale factor.
+ // 3. Check to see if any of the element in the table is greater than 255
+ // reset that elemet to 255.
+ // 5. There is a specific scaling needed to be done to the first 6
+ // elements in the matrix. This is required to achieve better
+ // compression ratio.
+ // 4. Check to see if any the of the recently modified element is
+ // greater than 255, reset that to 255.
+ //
+ // Please refer to sRGBLaserHostBasedSoftwareERS.doc v9.0 section 5.2.5.3.1.1
+ // for more details.
+ //
+ // [NOTE] These loop needs to be further optimized.
+ //
+ for (int i = 0; i < 3; i++)
+ {
+ // Adding Q-Table.
+
+ jpeg_add_quant_table(&cinfo, i, mojave_quant_table1, 0, FALSE );
+ //
+ // Scaling the Q-Table elements.
+ // Reset the element to 255, if it is greater than 255.
+ //
+
+ for(int j = 1; j < 64; j++)
+ {
+ cinfo.quant_tbl_ptrs[i]->quantval[j] = (UINT16)((mojave_quant_table1[j] * m_pQTableInfo->qFactor) & 0xFF);
+ } // for (int j = 1; j < 64; j++)
+
+ //
+ // Special scaling for first 6 elements in the table.
+ // Reset the specially scaled elements 255, if it is greater than 255.
+ //
+
+ //
+ // 1st component in the table. Unchanged, I need not change anything here.
+ //
+ cinfo.quant_tbl_ptrs[i]->quantval[0] = (UINT16)mojave_quant_table1[0];
+
+ //
+ // 2nd and 3rd components in the zig zag order
+ //
+ // The following dTemp is being used to ceil the vales: e.g 28.5 to 29
+ //
+ double dTemp = mojave_quant_table1[1] * (1 + 0.25 * (m_pQTableInfo->qFactor - 1)) + 0.5;
+ cinfo.quant_tbl_ptrs[i]->quantval[1] = (UINT16)dTemp & 0xFF;
+
+ dTemp = mojave_quant_table1[8] * (1 + 0.25 * (m_pQTableInfo->qFactor - 1)) + 0.5;
+ cinfo.quant_tbl_ptrs[i]->quantval[8] = (UINT16)dTemp & 0xFF;
+
+ //
+ // 4th, 5th and 6th components in the zig zag order
+ //
+ dTemp = mojave_quant_table1[16] * (1 + 0.50 * (m_pQTableInfo->qFactor - 1)) + 0.5;
+ cinfo.quant_tbl_ptrs[i]->quantval[16] = (UINT16)dTemp & 0xFF;
+
+ dTemp = mojave_quant_table1[9] * (1 + 0.50 * (m_pQTableInfo->qFactor - 1)) + 0.5;
+ cinfo.quant_tbl_ptrs[i]->quantval[9] = (UINT16)dTemp & 0xFF;
+
+ dTemp = mojave_quant_table1[2] * (1 + 0.50 * (m_pQTableInfo->qFactor - 1)) + 0.5;
+ cinfo.quant_tbl_ptrs[i]->quantval[2] = (UINT16)dTemp & 0xFF;
+ } // for (i = 0; i < 3; i++)
+
+ // Hard code to use sampling mode 4:4:4
+
+ cinfo.comp_info[0].h_samp_factor = 1;
+ cinfo.comp_info[0].v_samp_factor = 1;
+
+ jpeg_buffer_dest (&cinfo, (JOCTET *) this, (void *) (output_buffer_callback));
+
+ int row_width = m_iRowWidth;
+ if (m_iColorMode != 0)
+ {
+ row_width = m_iRowWidth / 3;
+ cinfo.write_JFIF_header = FALSE;
+ cinfo.write_Adobe_marker = FALSE;
+ jpeg_suppress_tables(&cinfo, TRUE);
+ }
+
+ jpeg_start_compress (&cinfo, TRUE);
+ JSAMPROW pRowArray[1];
+ BYTE *pScanLine = m_pbyInputBuffer;
+ int i;
+ for (i = 0; i < m_iBandHeight; i++)
+ {
+ pRowArray[0] = (JSAMPROW) pScanLine;
+ jpeg_write_scanlines (&cinfo, pRowArray, 1);
+ pScanLine += (row_width);
+ }
+ jpeg_finish_compress (&cinfo);
+
+// Read the quantization table used for this compression
+
+ if (cinfo.quant_tbl_ptrs[0] != NULL)
+ {
+// memcpy(m_pQTableInfo->qtable0, cinfo.quant_tbl_ptrs[0]->quantval, QTABLE_SIZE);
+ for (i = 0; i < QTABLE_SIZE; i++)
+ {
+ m_pQTableInfo->qtable0[i] = cinfo.quant_tbl_ptrs[0]->quantval[i];
+ }
+ }
+ if (cinfo.quant_tbl_ptrs[1] != NULL)
+ {
+// memcpy(m_pQTableInfo->qtable1, cinfo.quant_tbl_ptrs[1]->quantval, QTABLE_SIZE);
+ for (i = 0; i < QTABLE_SIZE; i++)
+ {
+ m_pQTableInfo->qtable1[i] = cinfo.quant_tbl_ptrs[1]->quantval[i];
+ }
+ }
+ if (cinfo.quant_tbl_ptrs[2] != NULL)
+ {
+// memcpy(m_pQTableInfo->qtable2, cinfo.quant_tbl_ptrs[2]->quantval, QTABLE_SIZE);
+ for (i = 0; i < QTABLE_SIZE; i++)
+ {
+ m_pQTableInfo->qtable2[i] = cinfo.quant_tbl_ptrs[2]->quantval[i];
+ }
+ }
+ jpeg_destroy_compress (&cinfo);
+ if (m_iColorMode != 0)
+ {
+ unsigned int l = 0;
+ while (l < compressedsize)
+ {
+ if (compressBuf[l] == 0xFF && compressBuf[l+1] == 0xDA)
+ break;
+ l++;
+ }
+ if (l != compressedsize)
+ {
+ m_uiGrayscaleOffset = l + 10;
+ }
+ }
+}
+
+void ModeJpeg::taosCompressForJetReady()
+{
+ int iRet;
+ int bufSize = m_max_file_size;
+ iRet = HPLJJRCompress(compressBuf, (uint32_t *) &bufSize, m_pbyInputBuffer, m_iRowWidth / 3, m_iBandHeight);
+ compressedsize = (iRet < 0) ? 0 : bufSize;
+}
+
diff --git a/prnt/hpcups/ModeJpeg.h b/prnt/hpcups/ModeJpeg.h
new file mode 100644
index 0000000..31c3005
--- /dev/null
+++ b/prnt/hpcups/ModeJpeg.h
@@ -0,0 +1,72 @@
+/*****************************************************************************\
+ ModeJpeg.h : Jpeg compressor definitions
+
+ Copyright (c) 1996 - 2009, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+#ifndef MODE_JPEG_H
+#define MODE_JPEG_H
+
+#define HAVE_UNSIGNED_SHORT
+#include "Processor.h"
+#include "Compressor.h"
+extern "C"
+{
+#include "jpeglib.h"
+}
+
+class ModeJpeg : public Compressor
+{
+public:
+ ModeJpeg (unsigned int RasterSize);
+ ~ModeJpeg();
+ bool Process (RASTERDATA *input);
+ bool NextOutputRaster (RASTERDATA& next_raster);
+ void Flush ();
+ DRIVER_ERROR Init(int max_file_size, int page_height);
+ DRIVER_ERROR Init(int color_mode, int page_height, COMPRESS_MODE *eCompressMode, QTableInfo *qTableInfo);
+ void StoreJpegData(BYTE *buffer, int size);
+private:
+ void compress();
+ void jpegCompressForQuickConnect();
+ void jpegCompressForJetReady();
+ void taosCompressForJetReady();
+ void rgbToGray(BYTE *rgbData, int iNumBytes);
+ int m_iRowWidth;
+ int m_iRowNumber;
+ int m_iBandHeight;
+ int m_iColorMode;
+ int m_uiGrayscaleOffset;
+ COMPRESSOR_TYPE m_eCompressor;
+ unsigned int m_max_file_size;
+ BYTE *m_pbyInputBuffer;
+ QTableInfo *m_pQTableInfo;
+ void *m_hHPLibHandle;
+};
+
+#endif // MODE_JPEG_H
+
diff --git a/prnt/hpcups/Pcl3.cpp b/prnt/hpcups/Pcl3.cpp
new file mode 100644
index 0000000..bbd72aa
--- /dev/null
+++ b/prnt/hpcups/Pcl3.cpp
@@ -0,0 +1,285 @@
+/*****************************************************************************\
+ Pcl3.cpp : Implementation of Pcl3 class
+
+ Copyright (c) 1996 - 2009, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+#include "CommonDefinitions.h"
+#include "Pcl3.h"
+#include "ColorMatcher.h"
+#include "Halftoner.h"
+#include "Mode9.h"
+#include "resources.h"
+#include "ColorMaps.h"
+#include "PrinterCommands.h"
+#include "Pcl3PrintModes.h"
+
+Pcl3::Pcl3() : Encapsulator()
+{
+ m_pPM = NULL;
+ strcpy(m_szLanguage, "PCL3");
+}
+
+Pcl3::~Pcl3()
+{
+}
+
+DRIVER_ERROR Pcl3::Configure(Pipeline **pipeline)
+{
+ Pipeline *p = NULL;
+ Pipeline *head;
+ unsigned int width;
+ ColorMatcher *pColorMatcher;
+ Mode9 *pMode9;
+ int iRows[MAXCOLORPLANES];
+ unsigned int uiResBoost;
+ head = *pipeline;
+
+/*
+ * I need a flag in the printmode structure to whether create a CMYGraymap
+ * and set the ulMap1 to it.
+ */
+
+ if (!selectPrintMode())
+ {
+ dbglog("selectPrintMode failed, PrintMode name = %s", m_pQA->print_mode_name);
+ return UNSUPPORTED_PRINTMODE;
+ }
+ if (m_pPM->BaseResX != m_pQA->horizontal_resolution ||
+ m_pPM->BaseResY != m_pQA->vertical_resolution)
+ {
+ dbglog("Requested resolution not supported with requested printmode");
+ return UNSUPPORTED_PRINTMODE;
+ }
+
+ for (int i = 0; i < MAXCOLORPLANES; i++)
+ {
+ iRows[i] = m_pPM->ResolutionX[i] / m_pPM->BaseResX;
+ }
+ uiResBoost = m_pPM->BaseResX / m_pPM->BaseResY;
+ if (uiResBoost == 0)
+ uiResBoost = 1;
+
+ width = m_pMA->printable_width;
+// unsigned int SeedBufferSize = m_pMA->printable_width * 3;
+
+ pColorMatcher = new ColorMatcher(m_pPM->cmap, m_pPM->dyeCount, width);
+ head = new Pipeline(pColorMatcher);
+ m_pHalftoner = new Halftoner (m_pPM, width, iRows, uiResBoost, m_pPM->eHT == MATRIX);
+ p = new Pipeline(m_pHalftoner);
+ head->AddPhase(p);
+ pMode9 = new Mode9(width, false);
+ p = new Pipeline(pMode9);
+ head->AddPhase(p);
+ pMode9->myplane = COLORTYPE_COLOR;
+
+ *pipeline = head;
+ return NO_ERROR;
+}
+
+DRIVER_ERROR Pcl3::StartPage(JobAttributes *pJA)
+{
+ DRIVER_ERROR err = NO_ERROR;
+ char szStr[256];
+ int top_margin = 0;
+ page_number++;
+
+// Under windows, pJA address may have changed, re-init here.
+
+ m_pJA = pJA;
+ m_pMA = &pJA->media_attributes;
+ m_pQA = &pJA->quality_attributes;
+
+// Set media source, type, size and quality modes.
+
+ sprintf(szStr, "\033&l%dH\033&l%dM\033&l%dA\033*o%dM", m_pJA->media_source, m_pQA->media_type,
+ m_pMA->pcl_id, m_pQA->print_quality);
+
+// Now add media subtype
+
+ int i = strlen(szStr);
+ memcpy(szStr+i, MediaSubtypeSeq, sizeof(MediaSubtypeSeq));
+ i += sizeof(MediaSubtypeSeq);
+ szStr[i++] = (char) (m_pQA->media_subtype & 0xFFFF) >> 8;
+ szStr[i++] = (char) m_pQA->media_subtype & 0xFF;
+ addToHeader((const BYTE *) szStr, i);
+
+ configureRasterData();
+
+ addToHeader("\033&u%dD\033*t%dR", m_pPM->BaseResX, m_pPM->BaseResY);
+
+ // another command that helps PCLviewer
+ unsigned int width = m_pMA->printable_width;
+ addToHeader("\033*r%dS", width);
+
+/*
+ * Custom papersize command
+ */
+
+ if (m_pMA->pcl_id == CUSTOM_MEDIA_SIZE) {
+ short sWidth, sHeight;
+ BYTE b1, b2;
+ sWidth = static_cast<short>(m_pMA->physical_width);
+ sHeight = static_cast<short>(m_pMA->physical_height);
+ memcpy (szStr, "\x1B*o5W\x0E\x05\x00\x00\x00\x1B*o5W\x0E\x06\x00\x00\x00", 20);
+ b1 = (BYTE) ((sWidth & 0xFF00) >> 8);
+ b2 = (BYTE) (sWidth & 0xFF);
+ szStr[8] = b1;
+ szStr[9] = b2;
+ b1 = (BYTE) ((sHeight & 0xFF00) >> 8);
+ b2 = (BYTE) (sHeight & 0xFF);
+ szStr[18] = b1;
+ szStr[19] = b2;
+ addToHeader((const BYTE *) szStr, 20);
+ }
+
+ if (m_pPM->dyeCount != 3)
+ {
+ addToHeader((const BYTE *) black_extract_off, sizeof(black_extract_off));
+ }
+
+ addToHeader("\x1B&l0L", 5); // perforation skip off
+
+/*
+ * Calculate top margin:
+ * This is given in terms of text line spacing, the smallest available
+ * granularity of which is 48.
+ * There is a starting unprintable distance, which is platform dependent.
+ * So our formula is: marginvalue = granularity * (startY/verticalres - unprintable)
+ */
+
+ top_margin = m_pMA->printable_start_y - ((m_pJA->mech_offset * m_pQA->actual_vertical_resolution)/1000);
+ top_margin = (top_margin * 48) / m_pQA->actual_vertical_resolution;
+ addToHeader("\x1B&l48D", 6); // granularity
+ addToHeader("\x1B&l%dE", top_margin);
+ addToHeader((const BYTE *) grafStart, sizeof(grafStart));
+ addToHeader((const BYTE *) grafMode9, sizeof(grafMode9));
+ addToHeader((const BYTE *) seedSame, sizeof(seedSame));
+
+ addToHeader("\x1b*p0Y", 5);
+
+// Now send media pre-load command
+ addToHeader((const BYTE *) "\033&l-2H", 6);
+
+ err = Cleanup();
+ return err;
+}
+
+DRIVER_ERROR Pcl3::Encapsulate(RASTERDATA *InputRaster, bool bLastPlane)
+{
+ DRIVER_ERROR err = NO_ERROR;
+ char tmpStr[16];
+ int iLen;
+ BYTE c = m_pHalftoner->LastPlane() ? 'W' : 'V';
+ iLen = sprintf (tmpStr, "\x1b*b%u%c", InputRaster->rastersize[COLORTYPE_COLOR], c);
+ err = this->Send((const BYTE *) tmpStr, iLen);
+ if (err == NO_ERROR && InputRaster->rastersize[COLORTYPE_COLOR] > 0)
+ {
+ err = this->Send(InputRaster->rasterdata[COLORTYPE_COLOR],
+ InputRaster->rastersize[COLORTYPE_COLOR]);
+ }
+ return err;
+}
+
+int Pcl3::colorLevels(int color_plane)
+{
+ int bit_depth = m_pPM->ColorDepth[color_plane];
+ int levels = 1;
+ for (int i = 0; i < bit_depth; i++)
+ {
+ levels *= 2;
+ }
+ return levels;
+}
+
+void Pcl3::configureRasterData()
+{
+ if (m_pPM == NULL)
+ {
+ dbglog("configureRasterData: m_pPM is NULL");
+ return;
+ }
+ BYTE *p = cur_pcl_buffer_ptr;
+
+ *p++ = 0x1b;
+ *p++ = '*';
+ *p++ = 'g';
+ p += sprintf((char *) p, "%d", m_pPM->dyeCount * MAXCOLORPLANES + 2);
+ *p++ = 'W';
+ *p++ = 2; // crdFormat
+ *p++ = m_pPM->dyeCount;
+ int start = K;
+ if (m_pPM->dyeCount == 3)
+ start = C;
+
+ int depth;
+ for (unsigned int color = start; color < (start + m_pPM->dyeCount); color++)
+ {
+ *p++ = m_pPM->ResolutionX[color] / 256;
+ *p++ = m_pPM->ResolutionX[color] % 256;
+ *p++ = m_pPM->ResolutionY[color] / 256;
+ *p++ = m_pPM->ResolutionY[color] % 256;
+ depth = colorLevels(color);
+ *p++ = depth / 256;
+ *p++ = depth % 256;
+ }
+
+ cur_pcl_buffer_ptr = p;
+} //configureRasterData
+
+bool Pcl3::selectPrintMode()
+{
+ if (m_pJA->printer_platform[0] == 0)
+ {
+ dbglog("printer_platform is undefined");
+ return false;
+ }
+ for (unsigned int i = 0; i < sizeof(pcl3_print_modes_table) / sizeof(pcl3_print_modes_table[0]); i++)
+ {
+ if (!strcmp(m_pJA->printer_platform, pcl3_print_modes_table[i].printer_platform_name))
+ {
+ return selectPrintMode(i);
+ }
+ }
+ dbglog("Unsupported printer_platform: %s", m_pJA->printer_platform);
+ return false;
+}
+
+bool Pcl3::selectPrintMode(int index)
+{
+ PrintMode *p = pcl3_print_modes_table[index].print_modes;
+ for (int i = 0; i < pcl3_print_modes_table[index].count; i++, p++)
+ {
+ if (!strcmp(m_pJA->quality_attributes.print_mode_name, p->name))
+ {
+ m_pPM = p;
+ return true;
+ }
+ }
+ return false;
+}
+
diff --git a/prnt/hpcups/Pcl3.h b/prnt/hpcups/Pcl3.h
new file mode 100644
index 0000000..fd83aa3
--- /dev/null
+++ b/prnt/hpcups/Pcl3.h
@@ -0,0 +1,62 @@
+/*****************************************************************************\
+ Pcl3G.h : Interface for Pcl3 class
+
+ Copyright (c) 1996 - 2009, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+#ifndef PCL3_H
+#define PCL3_H
+
+#include "CommonDefinitions.h"
+#include "Pipeline.h"
+#include "Encapsulator.h"
+
+class Halftoner;
+
+class Pcl3: public Encapsulator
+{
+public:
+ Pcl3();
+ ~Pcl3();
+ DRIVER_ERROR Encapsulate (RASTERDATA *InputRaster, bool bLastPlane);
+ DRIVER_ERROR StartPage(JobAttributes *pJA);
+ DRIVER_ERROR Configure(Pipeline **pipeline);
+ bool UnpackBits() {return true;}
+protected:
+ DRIVER_ERROR addJobSettings() {return NO_ERROR;}
+private:
+ bool selectPrintMode();
+ bool selectPrintMode(int index);
+ int colorLevels(int color_plane);
+ void configureRasterData ();
+
+ PrintMode *m_pPM;
+ Halftoner *m_pHalftoner;
+};
+
+#endif // PCL3_H
+
diff --git a/prnt/hpcups/Pcl3Gui.cpp b/prnt/hpcups/Pcl3Gui.cpp
new file mode 100644
index 0000000..94c8171
--- /dev/null
+++ b/prnt/hpcups/Pcl3Gui.cpp
@@ -0,0 +1,289 @@
+/*****************************************************************************\
+ Pcl3Gui.cpp : Implementation of Pcl3Gui class
+
+ Copyright (c) 1996 - 2009, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+#include "CommonDefinitions.h"
+#include "Pcl3Gui.h"
+#include "ColorMatcher.h"
+#include "Halftoner.h"
+#include "Mode2.h"
+#include "resources.h"
+#include "ColorMaps.h"
+#include "PrinterCommands.h"
+#include "Pcl3GuiPrintModes.h"
+
+Pcl3Gui::Pcl3Gui() : Encapsulator()
+{
+ m_pPM = NULL;
+ strcpy(m_szLanguage, "PCL3GUI");
+}
+
+Pcl3Gui::~Pcl3Gui()
+{
+}
+
+DRIVER_ERROR Pcl3Gui::Configure(Pipeline **pipeline)
+{
+ Pipeline *p = NULL;
+ Pipeline *head;
+ unsigned int width;
+ ColorMatcher *pColorMatcher;
+ Mode2 *pMode2;
+ int iRows[MAXCOLORPLANES];
+ unsigned int uiResBoost;
+ head = *pipeline;
+
+/*
+ * I need a flag in the printmode structure to whether create a CMYGraymap
+ * and set the ulMap1 to it.
+ */
+
+ if (!selectPrintMode())
+ {
+ dbglog("selectPrintMode failed, PrintMode name = %s", m_pQA->print_mode_name);
+ return UNSUPPORTED_PRINTMODE;
+ }
+ if (m_pPM->BaseResX != m_pQA->horizontal_resolution ||
+ m_pPM->BaseResY != m_pQA->vertical_resolution)
+ {
+ dbglog("Requested resolution not supported with requested printmode");
+ return UNSUPPORTED_PRINTMODE;
+ }
+
+ for (int i = 0; i < MAXCOLORPLANES; i++)
+ {
+ iRows[i] = m_pPM->ResolutionX[i] / m_pPM->BaseResX;
+ }
+ uiResBoost = m_pPM->BaseResX / m_pPM->BaseResY;
+ if (uiResBoost == 0)
+ uiResBoost = 1;
+
+ width = m_pMA->printable_width;
+// unsigned int SeedBufferSize = m_pMA->printable_width * 3;
+
+ pColorMatcher = new ColorMatcher(m_pPM->cmap, m_pPM->dyeCount, width);
+ head = new Pipeline(pColorMatcher);
+
+ m_pHalftoner = new Halftoner (m_pPM, width, iRows, uiResBoost, m_pPM->eHT == MATRIX);
+ p = new Pipeline(m_pHalftoner);
+ head->AddPhase(p);
+
+ pMode2 = new Mode2(width);
+ p = new Pipeline(pMode2);
+ head->AddPhase(p);
+ pMode2->myplane = COLORTYPE_COLOR;
+
+ *pipeline = head;
+ return NO_ERROR;
+}
+
+DRIVER_ERROR Pcl3Gui::StartPage(JobAttributes *pJA)
+{
+ DRIVER_ERROR err = NO_ERROR;
+ char szStr[256];
+ int top_margin = 0;
+ page_number++;
+
+// Under windows, pJA address may have changed, re-init here.
+
+ m_pJA = pJA;
+ m_pMA = &pJA->media_attributes;
+ m_pQA = &pJA->quality_attributes;
+
+// Set media source, type, size and quality modes.
+
+ sprintf(szStr, "\033&l%dH\033&l%dM\033&l%dA\033*o%dM", m_pJA->media_source, m_pQA->media_type,
+ m_pMA->pcl_id, m_pQA->print_quality);
+
+// Now add media subtype
+
+ int i = strlen(szStr);
+ memcpy(szStr+i, MediaSubtypeSeq, sizeof(MediaSubtypeSeq));
+ i += sizeof(MediaSubtypeSeq);
+ szStr[i++] = (char) (m_pQA->media_subtype & 0xFFFF) >> 8;
+ szStr[i++] = (char) m_pQA->media_subtype & 0xFF;
+ addToHeader((const BYTE *) szStr, i);
+
+ if (m_pJA->e_duplex_mode != DUPLEXMODE_NONE) {
+ addToHeader((const BYTE *) EnableDuplex, sizeof(EnableDuplex));
+ }
+
+ configureRasterData();
+
+ if (m_pJA->color_mode != 0) {
+// GrayscaleSeq[9] = m_pJA->color_mode;
+ addToHeader((const BYTE *) GrayscaleSeq, 9);
+ *cur_pcl_buffer_ptr++ = (BYTE) m_pJA->color_mode;
+ }
+
+ if (!m_pPM->MixedRes)
+ {
+ sprintf(szStr,"\033&u%dD", m_pPM->BaseResX);
+ addToHeader((const BYTE *) szStr, strlen(szStr));
+ sprintf(szStr,"\033*t%dR", m_pPM->BaseResY);
+ addToHeader((const BYTE *) szStr, strlen(szStr));
+ }
+
+ // another command that helps PCLviewer
+ unsigned int width = m_pMA->printable_width;
+ sprintf(szStr, "\033*r%dS", width);
+ addToHeader((const BYTE *) szStr, strlen(szStr));
+
+/*
+ * Custom papersize command
+ */
+
+ if (m_pMA->pcl_id == CUSTOM_MEDIA_SIZE) {
+ short sWidth, sHeight;
+ BYTE b1, b2;
+ sWidth = static_cast<short>(m_pMA->physical_width);
+ sHeight = static_cast<short>(m_pMA->physical_height);
+ memcpy (szStr, "\x1B*o5W\x0E\x05\x00\x00\x00\x1B*o5W\x0E\x06\x00\x00\x00", 20);
+ b1 = (BYTE) ((sWidth & 0xFF00) >> 8);
+ b2 = (BYTE) (sWidth & 0xFF);
+ szStr[8] = b1;
+ szStr[9] = b2;
+ b1 = (BYTE) ((sHeight & 0xFF00) >> 8);
+ b2 = (BYTE) (sHeight & 0xFF);
+ szStr[18] = b1;
+ szStr[19] = b2;
+ addToHeader((const BYTE *) szStr, 20);
+ }
+
+ addToHeader((const BYTE *) grafStart, sizeof(grafStart));
+ addToHeader((const BYTE *) grafMode2, sizeof(grafMode2));
+ addToHeader((const BYTE *) seedSame, sizeof(seedSame));
+
+ top_margin = m_pMA->printable_start_y - ((m_pJA->mech_offset * m_pQA->actual_vertical_resolution)/1000);
+ sprintf(szStr, "\x1b*p%dY", top_margin);
+ addToHeader((const BYTE *) szStr, strlen(szStr));
+
+// Now send media pre-load command
+ addToHeader((const BYTE *) "\033&l-2H", 6);
+
+ err = sendBuffer(static_cast<const BYTE *>(pcl_buffer), (cur_pcl_buffer_ptr - pcl_buffer));
+ cur_pcl_buffer_ptr = pcl_buffer;
+ return err;
+}
+
+DRIVER_ERROR Pcl3Gui::Encapsulate(RASTERDATA *InputRaster, bool bLastPlane)
+{
+ DRIVER_ERROR err = NO_ERROR;
+ char tmpStr[16];
+ int iLen;
+ BYTE c = m_pHalftoner->LastPlane() ? 'W' : 'V';
+
+ iLen = sprintf (tmpStr, "\x1b*b%u%c", InputRaster->rastersize[COLORTYPE_COLOR], c);
+ err = this->Send((const BYTE *) tmpStr, iLen);
+ if (err == NO_ERROR && InputRaster->rastersize[COLORTYPE_COLOR] > 0)
+ {
+ err = this->Send(InputRaster->rasterdata[COLORTYPE_COLOR],
+ InputRaster->rastersize[COLORTYPE_COLOR]);
+ }
+ return err;
+}
+
+int Pcl3Gui::colorLevels(int color_plane)
+{
+ int bit_depth = m_pPM->ColorDepth[color_plane];
+ int levels = 1;
+ for (int i = 0; i < bit_depth; i++)
+ {
+ levels *= 2;
+ }
+ return levels;
+}
+
+void Pcl3Gui::configureRasterData()
+{
+ if (m_pPM == NULL)
+ {
+ dbglog("configureRasterData: m_pPM is NULL");
+ return;
+ }
+ BYTE *p = cur_pcl_buffer_ptr;
+
+ *p++ = 0x1b;
+ *p++ = '*';
+ *p++ = 'g';
+ p += sprintf((char *) p, "%d", m_pPM->dyeCount * MAXCOLORPLANES + 2);
+ *p++ = 'W';
+ *p++ = 2; // crdFormat
+ *p++ = m_pPM->dyeCount;
+ int start = K;
+ if (m_pPM->dyeCount == 3)
+ start = C;
+
+ int depth;
+ for (unsigned int color = start; color < (start + m_pPM->dyeCount); color++)
+ {
+ *p++ = m_pPM->ResolutionX[color] / 256;
+ *p++ = m_pPM->ResolutionX[color] % 256;
+ *p++ = m_pPM->ResolutionY[color] / 256;
+ *p++ = m_pPM->ResolutionY[color] % 256;
+ depth = colorLevels(color);
+ *p++ = depth / 256;
+ *p++ = depth % 256;
+ }
+
+ cur_pcl_buffer_ptr = p;
+} //configureRasterData
+
+bool Pcl3Gui::selectPrintMode()
+{
+ if (m_pJA->printer_platform[0] == 0)
+ {
+ dbglog("printer_platform is undefined");
+ return false;
+ }
+ for (unsigned int i = 0; i < sizeof(pcl3_gui_print_modes_table) / sizeof(pcl3_gui_print_modes_table[0]); i++)
+ {
+ if (!strcmp(m_pJA->printer_platform, pcl3_gui_print_modes_table[i].printer_platform_name))
+ {
+ return selectPrintMode(i);
+ }
+ }
+ dbglog("Unsupported printer_platform: %s", m_pJA->printer_platform);
+ return false;
+}
+
+bool Pcl3Gui::selectPrintMode(int index)
+{
+ PrintMode *p = pcl3_gui_print_modes_table[index].print_modes;
+ for (int i = 0; i < pcl3_gui_print_modes_table[index].count; i++, p++)
+ {
+ if (!strcmp(m_pJA->quality_attributes.print_mode_name, p->name))
+ {
+ m_pPM = p;
+ return true;
+ }
+ }
+ return false;
+}
+
diff --git a/prnt/hpcups/Pcl3Gui.h b/prnt/hpcups/Pcl3Gui.h
new file mode 100644
index 0000000..97b5b32
--- /dev/null
+++ b/prnt/hpcups/Pcl3Gui.h
@@ -0,0 +1,68 @@
+/*****************************************************************************\
+ Pcl3Gui.h : Interface for Pcl3Gui class
+
+ Copyright (c) 1996 - 2009, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+#ifndef PCL3GUI_H
+#define PCL3GUI_H
+
+#include "CommonDefinitions.h"
+#include "Pipeline.h"
+#include "Encapsulator.h"
+
+class Halftoner;
+
+class Pcl3Gui: public Encapsulator
+{
+public:
+ Pcl3Gui();
+ ~Pcl3Gui();
+ DRIVER_ERROR Encapsulate (RASTERDATA *InputRaster, bool bLastPlane);
+ DRIVER_ERROR StartPage(JobAttributes *pJA);
+ DRIVER_ERROR Configure(Pipeline **pipeline);
+protected:
+ bool needPJLHeaders(JobAttributes *pJA)
+ {
+ if (!strcmp(m_pJA->printer_platform, "dj970"))
+ {
+ return false;
+ }
+ return true;
+ }
+ void configureRasterData ();
+private:
+ bool selectPrintMode();
+ bool selectPrintMode(int index);
+ int colorLevels(int color_plane);
+
+ PrintMode *m_pPM;
+ Halftoner *m_pHalftoner;
+};
+
+#endif // PCL3GUI_H
+
diff --git a/prnt/hpcups/Pcl3Gui2.cpp b/prnt/hpcups/Pcl3Gui2.cpp
new file mode 100644
index 0000000..b3b7c2e
--- /dev/null
+++ b/prnt/hpcups/Pcl3Gui2.cpp
@@ -0,0 +1,295 @@
+/*****************************************************************************\
+ Pcl3Gui2.cpp : Implementation of Pcl3Gui2 class
+
+ Copyright (c) 1996 - 2009, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+#include "CommonDefinitions.h"
+#include "Pcl3Gui2.h"
+#include "ErnieFilter.h"
+#include "Mode10.h"
+#include "Mode9.h"
+#include "PrinterCommands.h"
+
+Pcl3Gui2::Pcl3Gui2() : Encapsulator()
+{
+ speed_mech_enabled = true;
+ m_run_ernie_filter = true;
+ crd_type = eCrd_both;
+ strcpy(m_szLanguage, "PCL3GUI");
+}
+
+Pcl3Gui2::~Pcl3Gui2()
+{
+}
+
+DRIVER_ERROR Pcl3Gui2::Configure(Pipeline **pipeline)
+{
+ Pipeline *p = NULL;
+ Pipeline *head;
+ unsigned int width;
+ head = *pipeline;
+ if (m_pJA->e_duplex_mode != DUPLEXMODE_NONE ||
+ m_pJA->total_pages < 3) {
+ speed_mech_enabled = false;
+ }
+
+ width = m_pMA->printable_width;;
+ if (m_run_ernie_filter) {
+ ErnieFilter *pErnie;
+
+ // Normal: threshold = (resolution) * (0.0876) - 2
+ int threshold = ((m_pQA->horizontal_resolution * 876) / 10000) - 2;
+
+ pErnie = new ErnieFilter (width, eBGRPixelData, threshold);
+ p = new Pipeline (pErnie);
+ if (head) {
+ head->AddPhase (p);
+ }
+ else {
+ head = p;
+ }
+ }
+
+ if (crd_type != eCrd_black_only) {
+ Mode10 *pMode10;
+ pMode10 = new Mode10 (width * 3);
+ pMode10->myplane = COLORTYPE_COLOR;
+
+ p = new Pipeline (pMode10);
+ if (head) {
+ head->AddPhase (p);
+ }
+ else {
+ head = p;
+ }
+ }
+
+ width = (width + 7) / 8;
+
+ if (width > 0 && crd_type != eCrd_color_only) {
+ Mode9 *pMode9;
+ // VIP black data is 1 bit here
+ pMode9 = new Mode9 (width);
+ pMode9->myplane = COLORTYPE_BLACK;
+ p = new Pipeline (pMode9);
+ if (head) {
+ head->AddPhase (p);
+ }
+ else {
+ head = p;
+ }
+ }
+ *pipeline = head;
+ return NO_ERROR;
+}
+
+DRIVER_ERROR Pcl3Gui2::StartPage(JobAttributes *pJA)
+{
+ DRIVER_ERROR err = NO_ERROR;
+ char szStr[256];
+ int top_margin = 0;
+ page_number++;
+
+// Under windows, pJA address may have changed, re-init here.
+
+ m_pJA = pJA;
+ m_pMA = &pJA->media_attributes;
+ m_pQA = &pJA->quality_attributes;
+
+// Set media source, type, size and quality modes.
+
+ sprintf(szStr, "\033&l%dH\033&l%dM\033&l%dA\033*o%dM", m_pJA->media_source, m_pQA->media_type,
+ m_pMA->pcl_id, m_pQA->print_quality);
+
+// Now add media subtype
+
+ int i = strlen(szStr);
+ memcpy(szStr+i, MediaSubtypeSeq, sizeof(MediaSubtypeSeq));
+ i += sizeof(MediaSubtypeSeq);
+ szStr[i++] = (char) (m_pQA->media_subtype & 0xFFFF) >> 8;
+ szStr[i++] = (char) m_pQA->media_subtype & 0xFF;
+ addToHeader((const BYTE *) szStr, i);
+
+ if (m_pJA->e_duplex_mode != DUPLEXMODE_NONE) {
+ addToHeader((const BYTE *) EnableDuplex, sizeof(EnableDuplex));
+ speed_mech_enabled = false;
+ }
+
+ configureRasterData();
+
+ if (m_pJA->color_mode != 0) {
+// GrayscaleSeq[9] = m_pJA->color_mode;
+ addToHeader((const BYTE *) GrayscaleSeq, 9);
+ *cur_pcl_buffer_ptr++ = (BYTE) m_pJA->color_mode;
+ }
+
+ sprintf(szStr,"\033&u%dD", m_pQA->horizontal_resolution);
+ addToHeader((const BYTE *) szStr, strlen(szStr));
+ sprintf(szStr,"\033*t%dR", m_pQA->actual_vertical_resolution);
+ addToHeader((const BYTE *) szStr, strlen(szStr));
+
+ // another command that helps PCLviewer
+ unsigned int width = m_pMA->printable_width;
+ sprintf(szStr, "\033*r%dS", width);
+ addToHeader((const BYTE *) szStr, strlen(szStr));
+
+/*
+ * Custom papersize command
+ */
+
+ if (m_pMA->pcl_id == CUSTOM_MEDIA_SIZE) {
+ short sWidth, sHeight;
+ BYTE b1, b2;
+ sWidth = static_cast<short>(m_pMA->physical_width);
+ sHeight = static_cast<short>(m_pMA->physical_height);
+ memcpy (szStr, "\x1B*o5W\x0E\x05\x00\x00\x00\x1B*o5W\x0E\x06\x00\x00\x00", 20);
+ b1 = (BYTE) ((sWidth & 0xFF00) >> 8);
+ b2 = (BYTE) (sWidth & 0xFF);
+ szStr[8] = b1;
+ szStr[9] = b2;
+ b1 = (BYTE) ((sHeight & 0xFF00) >> 8);
+ b2 = (BYTE) (sHeight & 0xFF);
+ szStr[18] = b1;
+ szStr[19] = b2;
+ addToHeader((const BYTE *) szStr, 20);
+ }
+
+ if (m_pJA->print_borderless) {
+ BYTE cBuf[4];
+ BYTE TopOverSpraySeq[] = {0x1b, 0x2A, 0x6F, 0x35, 0x57, 0x0E, 0x02, 0x00};
+ // "Esc*o5W 0E 02 00 00 00" Top edge overspray for full-bleed printing
+
+ BYTE LeftOverSpraySeq[] = {0x1b, 0x2A, 0x6F, 0x35, 0x57, 0x0E, 0x01, 0x00};
+ // "Esc*o5W 0E 01 00 00 00" Left edge overspray for full-bleed printing
+
+ cBuf[1] = (m_pMA->top_overspray) & 0xFF;
+ cBuf[0] = (m_pMA->top_overspray) >> 8;
+
+ addToHeader((const BYTE *) TopOverSpraySeq, sizeof(TopOverSpraySeq));
+ addToHeader((const BYTE *) cBuf, 2);
+
+ cBuf[1] = (m_pMA->left_overspray) & 0xFF;
+ cBuf[0] = (m_pMA->left_overspray) >> 8;
+
+ addToHeader((const BYTE *) LeftOverSpraySeq, sizeof(LeftOverSpraySeq));
+ addToHeader((const BYTE *) cBuf, 2);
+ }
+
+// Now send media pre-load command
+ addToHeader((const BYTE *) "\033&l-2H", 6);
+
+// Before sending speed mech commands, send the current buffer to the printer
+ err = sendBuffer(static_cast<const BYTE *>(pcl_buffer), (cur_pcl_buffer_ptr - pcl_buffer));
+ cur_pcl_buffer_ptr = pcl_buffer;
+
+// send speed mech commands
+
+ if (speed_mech_enabled) {
+ addToHeader(speed_mech_cmd, sizeof (speed_mech_cmd));
+ *cur_pcl_buffer_ptr++ = (BYTE) ((m_pJA->total_pages & 0x0000FF00) >> 8);
+ *cur_pcl_buffer_ptr++ = (BYTE) ((m_pJA->total_pages & 0x000000FF));
+ if (page_number < m_pJA->total_pages) {
+ addToHeader(speed_mech_continue, sizeof (speed_mech_continue));
+ }
+ else {
+ addToHeader(speed_mech_end, sizeof (speed_mech_end));
+ }
+ }
+
+ addToHeader((const BYTE *) grafStart, sizeof(grafStart));
+
+ if (!m_pJA->print_borderless) {
+ top_margin = m_pMA->printable_start_y - ((m_pJA->mech_offset * m_pQA->actual_vertical_resolution)/1000);
+ }
+ addToHeader("\x1b*p%dY", top_margin);
+ return err;
+}
+
+DRIVER_ERROR Pcl3Gui2::Encapsulate(RASTERDATA *InputRaster, bool bLastPlane)
+{
+ DRIVER_ERROR err;
+ if (crd_type != eCrd_color_only) {
+ err = encapsulateRaster(InputRaster->rasterdata[COLORTYPE_BLACK], InputRaster->rastersize[COLORTYPE_BLACK], COLORTYPE_BLACK);
+ }
+ if (crd_type != eCrd_black_only) {
+ err = encapsulateRaster(InputRaster->rasterdata[COLORTYPE_COLOR], InputRaster->rastersize[COLORTYPE_COLOR], COLORTYPE_COLOR);
+ }
+ return err;
+}
+
+DRIVER_ERROR Pcl3Gui2::encapsulateRaster(BYTE *raster, unsigned int length, COLORTYPE c_type)
+{
+ DRIVER_ERROR err;
+ char scratch[20];
+ int scratchLen;
+ char c = 'W';
+ if (crd_type == eCrd_color_only) {
+ return NO_ERROR;
+ }
+ if (c_type == COLORTYPE_BLACK && crd_type == eCrd_both) {
+ c = 'V';
+ }
+ scratchLen = sprintf(scratch, "\033*b%u%c", length, c);
+ err = this->Send((const BYTE*) scratch, scratchLen);
+ if (err == NO_ERROR && length > 0)
+ {
+ err = this->Send(raster, length);
+ }
+ return err;
+}
+
+void Pcl3Gui2::configureRasterData()
+{
+ int i;
+ char *p;
+ char sequences[3][64];
+ int seq_sizes[] = {sizeof(crd_sequence_k), sizeof(crd_sequence_color),
+ sizeof(crd_sequence_both)};
+ memcpy(sequences[0], crd_sequence_k, seq_sizes[0]);
+ memcpy(sequences[1], crd_sequence_color, seq_sizes[1]);
+ memcpy(sequences[2], crd_sequence_both, seq_sizes[2]);
+ // First, update the resolution entries. Currently, this assumes K & RGB
+ // resolutions are the same.
+ for (i = 0; i < 3; i++) {
+ p = sequences[i] + 10;
+ *p++ = m_pQA->horizontal_resolution / 256;
+ *p++ = m_pQA->horizontal_resolution % 256;
+ *p++ = m_pQA->vertical_resolution / 256;
+ *p++ = m_pQA->vertical_resolution % 256;
+ }
+ p = &sequences[2][18];
+ *p++ = m_pQA->horizontal_resolution / 256;
+ *p++ = m_pQA->horizontal_resolution % 256;
+ *p++ = m_pQA->vertical_resolution / 256;
+ *p++ = m_pQA->vertical_resolution % 256;
+
+ memcpy(cur_pcl_buffer_ptr, sequences[crd_type], seq_sizes[crd_type]);
+ cur_pcl_buffer_ptr += seq_sizes[crd_type];
+
+} //configureRasterData
+
diff --git a/prnt/hpcups/Pcl3Gui2.h b/prnt/hpcups/Pcl3Gui2.h
new file mode 100644
index 0000000..aae3d6a
--- /dev/null
+++ b/prnt/hpcups/Pcl3Gui2.h
@@ -0,0 +1,68 @@
+/*****************************************************************************\
+ Pcl3Gui2.h : Interface for Pcl3Gui2 class
+
+ Copyright (c) 1996 - 2009, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+#ifndef PCL3GUI2_H
+#define PCL3GUI2_H
+
+#include "CommonDefinitions.h"
+#include "Pipeline.h"
+#include "Encapsulator.h"
+
+typedef enum
+{
+ eCrd_black_only,
+ eCrd_color_only,
+ eCrd_both
+} eCrdType;
+
+class Pcl3Gui2: public Encapsulator
+{
+public:
+ Pcl3Gui2();
+ ~Pcl3Gui2();
+ DRIVER_ERROR Encapsulate (RASTERDATA *InputRaster, bool bLastPlane);
+ DRIVER_ERROR StartPage(JobAttributes *pJA);
+ DRIVER_ERROR Configure(Pipeline **pipeline);
+ bool UnpackBits() {return false;}
+
+protected:
+ virtual bool jobAttrPJLAllowed() {return true;}
+ void configureRasterData ();
+private:
+
+ DRIVER_ERROR encapsulateRaster(BYTE *input_raster, unsigned int num_bytes, COLORTYPE c_type);
+ bool speed_mech_enabled;
+ int page_number;
+ bool m_run_ernie_filter;
+ eCrdType crd_type;
+};
+
+#endif // PCL3GUI2_H
+
diff --git a/prnt/hpcups/Pcl3GuiPrintModes.h b/prnt/hpcups/Pcl3GuiPrintModes.h
new file mode 100644
index 0000000..411c25d
--- /dev/null
+++ b/prnt/hpcups/Pcl3GuiPrintModes.h
@@ -0,0 +1,14 @@
+#include "CommonDefinitions.h"
+#include "dj890PrintModes.h"
+#include "dj895PrintModes.h"
+#include "dj8x5PrintModes.h"
+#include "dj970PrintModes.h"
+
+PrintModeTable pcl3_gui_print_modes_table [] =
+{
+ {"dj890", dj890PrintModes, sizeof(dj890PrintModes)/sizeof(PrintMode)},
+ {"dj895", dj895PrintModes, sizeof(dj895PrintModes)/sizeof(PrintMode)},
+ {"dj8x5", dj8x5PrintModes, sizeof(dj8x5PrintModes)/sizeof(PrintMode)},
+ {"dj970", dj970PrintModes, sizeof(dj970PrintModes)/sizeof(PrintMode)}
+};
+
diff --git a/prnt/hpcups/Pcl3PrintModes.h b/prnt/hpcups/Pcl3PrintModes.h
new file mode 100644
index 0000000..171a802
--- /dev/null
+++ b/prnt/hpcups/Pcl3PrintModes.h
@@ -0,0 +1,20 @@
+#include "CommonDefinitions.h"
+#include "dj400PrintModes.h"
+#include "dj540PrintModes.h"
+#include "dj600PrintModes.h"
+#include "dj630PrintModes.h"
+#include "dj690PrintModes.h"
+#include "apPrintModes.h"
+#include "dj850PrintModes.h"
+
+PrintModeTable pcl3_print_modes_table [] =
+{
+ {"dj400", dj400PrintModes, sizeof(dj400PrintModes)/sizeof(PrintMode)},
+ {"dj540", dj540PrintModes, sizeof(dj540PrintModes)/sizeof(PrintMode)},
+ {"dj600", dj600PrintModes, sizeof(dj600PrintModes)/sizeof(PrintMode)},
+ {"dj630", dj630PrintModes, sizeof(dj630PrintModes)/sizeof(PrintMode)},
+ {"dj690", dj690PrintModes, sizeof(dj690PrintModes)/sizeof(PrintMode)},
+ {"apollo2xxx", apPrintModes, sizeof(apPrintModes)/sizeof(PrintMode)},
+ {"dj850", dj850PrintModes, sizeof(dj850PrintModes)/sizeof(PrintMode)}
+};
+
diff --git a/prnt/hpcups/Pipeline.cpp b/prnt/hpcups/Pipeline.cpp
new file mode 100644
index 0000000..c80c4a1
--- /dev/null
+++ b/prnt/hpcups/Pipeline.cpp
@@ -0,0 +1,108 @@
+/*****************************************************************************\
+ Pipeline.cpp : Implementation of Pipeline class
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+/*
+ * Pipeline.cpp
+ * hpcups
+ *
+ */
+
+#include "Pipeline.h"
+bool Pipeline::NextOutputRaster(RASTERDATA& next_raster)
+{
+ return Exec->NextOutputRaster(next_raster);
+}
+unsigned int Pipeline::GetMaxOutputWidth()
+{
+ return Exec->GetMaxOutputWidth();
+}
+
+///////////////////////////////////////////////////////////
+// Pipeline management
+Pipeline::Pipeline (Processor *E) :
+ next(NULL),
+ prev(NULL) {
+ Exec = E;
+ Exec->myphase = this;
+} //Pipeline
+
+void Pipeline::AddPhase (Pipeline *newp) {
+ Pipeline *p = this;
+ while (p->next) {
+ p = p->next;
+ }
+ p->next = newp;
+ newp->prev = p;
+} //AddPhase
+
+Pipeline::~Pipeline ()
+{
+} //~Pipeline
+
+
+bool Pipeline::Process (RASTERDATA *raster)
+{
+ return Exec->Process (raster);
+} //Process
+
+
+DRIVER_ERROR Pipeline::Execute (RASTERDATA *InputRaster)
+{
+ err = NO_ERROR;
+ if (Process (InputRaster) // true if output ready; may set err
+ && (err == NO_ERROR)) {
+ if (next) {
+ while ( NextOutputRaster( next->Exec->raster ) ) {
+ err = next->Execute(&(next->Exec->raster));
+ ERRCHECK;
+ }
+ }
+ }
+ return err;
+} //Execute
+
+
+DRIVER_ERROR Pipeline::Flush ()
+{
+ err = NO_ERROR;
+
+ Exec->Flush ();
+
+ if (next && (err == NO_ERROR)) {
+ while ( NextOutputRaster( next->Exec->raster ) ) {
+ err = next->Execute(&(next->Exec->raster));
+ ERRCHECK;
+ }
+ // one more to continue flushing downstream
+ err = next->Flush ();
+ }
+ return err;
+} //Flush
+
diff --git a/prnt/hpcups/Pipeline.h b/prnt/hpcups/Pipeline.h
new file mode 100644
index 0000000..73dca0d
--- /dev/null
+++ b/prnt/hpcups/Pipeline.h
@@ -0,0 +1,63 @@
+/*****************************************************************************\
+ Pipeline.h : Interface for the Pipeline class
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+#ifndef PIPELINE_H
+#define PIPELINE_H
+
+#include "CommonDefinitions.h"
+#include "Processor.h"
+
+class Processor;
+
+class Pipeline
+ {
+ public:
+ Pipeline(Processor* E);
+ virtual ~Pipeline();
+
+ void AddPhase(Pipeline* p); // add p at end
+ DRIVER_ERROR Execute(RASTERDATA* InputRaster=NULL); // run pipeline
+ DRIVER_ERROR Flush();
+ bool Process(RASTERDATA* InputRaster=NULL); // call processor for this phase
+ bool NextOutputRaster(RASTERDATA& next_raster);
+ unsigned int GetMaxOutputWidth();
+
+ Pipeline* next;
+ Pipeline* prev;
+
+ Processor* Exec;
+
+ DRIVER_ERROR err;
+
+}; // Pipeline
+
+
+#endif // PIPELINE_H
+
diff --git a/prnt/hpcups/PrinterCommands.h b/prnt/hpcups/PrinterCommands.h
new file mode 100644
index 0000000..fa2fd71
--- /dev/null
+++ b/prnt/hpcups/PrinterCommands.h
@@ -0,0 +1,179 @@
+/*****************************************************************************\
+ PrinterCommands.h : Printer command sequences
+
+ Copyright (c) 1996 - 2009, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+#ifndef PRINTER_COMMANDS_H
+#define PRINTER_COMMANDS_H
+
+const BYTE UEL[] = {0x1b, '%', '-','1','2','3','4','5','X' };
+const BYTE EnterLanguage[] = {'@','P','J','L',' ','E','N','T','E','R',' ',
+ 'L','A','N','G','U','A','G','E','=','P','C','L','3','G','U','I',0x0A};
+const BYTE Reset[] = {0x1b,'E'};
+const char PJLExit[] = "\x1b%-12345X@PJL EOJ\012\x1b%-12345X";
+const BYTE grafStart[5] = {0x1b, '*', 'r', '1', 'A'}; // raster graphics mode
+const BYTE grafMode2[5] = {0x1b, '*', 'b', '2', 'M'}; // Mode2 Compression
+const BYTE grafMode3[5] = {0x1b, '*', 'b', '3', 'M'}; // Mode3 Compression
+const BYTE grafMode9[5] = {0x1b, '*', 'b', '9', 'M'}; // Mode9 Compression
+const BYTE seedSame[5] = {0x1b, '*', 'b', '0', 'S'}; // Reset seed row
+const BYTE GrayscaleSeq[10] = {0x1b, '*', 'o', '5', 'W', 0x0B, 0x01, 0x00, 0x00, 0x02};
+const BYTE MediaSubtypeSeq[8] = {0x1b, 0x2A, 0x6F, 0x35, 0x57, 0x0D, 0x03, 0x00};
+ // "Esc*o5W 0D 03 00 00 00" Media Type Index
+const BYTE EnableDuplex[5] = {0x1b,'&','l', '2', 'S'};
+const BYTE ExtraDryTime[21] = {0x1b, '&', 'b', '1', '6', 'W', 'P', 'M', 'L', ' ',
+ 0x04, 0x00, 0x06, 0x01, 0x04, 0x01, 0x04, 0x01, 0x06,
+ 0x08, 0x01};
+const BYTE crd_sequence_k[18] = {0x1b, 0x2a, 0x67, 0x31, 0x32, 0x57, 0x06, 0x1F, 0x00, 0x01,
+ //Esc * |g |# of bytes |W |frmt |SP |# of cmpnts
+ 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x01, 0x01};
+ //|Horz Res |Vert Rez |compr|orien|bits |planes
+
+const BYTE crd_sequence_color[18] = {0x1b, 0x2a, 0x67, 0x31, 0x32, 0x57, 0x06, 0x07, 0x00, 0x01,
+ // Esc * |g |# of bytes |W |frmt |SP |# of cmpnts
+ 0x00, 0x00, 0x00, 0x00, 0x0a, 0x01, 0x20, 0x01};
+ //|Horz Res |Vert Rez |compr|orien|bits |planes
+
+const BYTE crd_sequence_both[26] = {0x1b, 0x2a, 0x67, 0x32, 0x30, 0x57, 0x06, 0x1F, 0x00, 0x02,
+ // Esc * |g |# of bytes |W |frmt |SP |# of cmpnts
+ /* K */ 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x01, 0x01,
+ //|Horz Res |Vert Rez |compr|orien|bits |planes
+ /* RGB */ 0x00, 0x00, 0x00, 0x00, 0x0a, 0x01, 0x20, 0x01};
+
+const BYTE speed_mech_cmd[8] = {0x1B, '*', 'o', '5', 'W', 0x0D, 0x02, 0x00};
+const BYTE speed_mech_end[10] = {0x1B, '*', 'o', '5', 'W', 0x0D, 0x05, 0x00, 0x00, 0x01};
+const BYTE speed_mech_continue[10] = {0x1B, '*', 'o', '5', 'W', 0x0D, 0x05, 0x00, 0x00, 0x00};
+const BYTE black_extract_off[10] = {0x1B, '*', 'o', '5', 'W', 0x04, 0xC, 0, 0, 0};
+const BYTE FRBeginSession[] = {0xC0, 0x00, 0xF8, 0x86, 0xC0, 0x03, 0xF8, 0x8F, 0xD1, 0x58,
+ 0x02, 0x58, 0x02, 0xF8, 0x89, 0x41};
+const BYTE FRFeedOrientation[] = {0xC0, 0x00 , 0xF8, 0x28 };
+// |fd ori enum| |ori cmd|
+const BYTE FRPaperSize[] = {0xC0, 0x00 ,0xF8, 0x25};
+// |pap siz enum| |pap sz cmd|
+const BYTE FRCustomMediaSize[] = {0xC0, 0x00, 0xF8, 0x30};
+const BYTE FRMedSource[] = {0xC0, 0x00 ,0xF8, 0x26};
+// |Med src enum| |Med src cmd|
+const BYTE FRMedDestination[] = {0xC0, 0x00 ,0xF8 , 0x24};
+// |Med Dest enum| |Med src cmd|
+const BYTE FRBeginPage[] = {0x43, 0xD3, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x2A, 0x75, 0xC0, 0x07,
+ 0xF8, 0x03, 0x6A, 0xC0, 0xCC, 0xF8, 0x2C, 0x7B,
+ 0xD3, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x4C, 0x6B};
+const BYTE FRBeginImage[] = {0xC2, 0x00, 0x40, 0x70, 0x68, 0xF8, 0x91, 0xC1};
+
+const BYTE FRVUverTag[] = {0xC2, 0x00, 0x00, 0x04, 0x00 , 0xF8, 0x95};
+// |endian alignd | |FR_ver_ tag|
+const BYTE FRDataLength[] = {0xC2, 0x86, 0x0A, 0x00, 0x00, 0xF8, 0x92};
+// | VU data length|
+const BYTE FRVendorUniq[] = {0x46};
+const BYTE FRVUExtn3[] = {0xC2, 0x11, 0x20, 0x70, 0x68 ,0xF8, 0x91};
+// |endian alignd FR rd img tag| |VU extensn|
+const BYTE FROpenDataSource[] = {0xC0, 0x00, 0xF8, 0x88, 0xC0, 0x01, 0xF8, 0x82, 0x48};
+const BYTE FREnterFRMode[] = {0xC2, 0x06, 0x20, 0x70,0x68, 0xF8, 0x91, 0xC2};
+const BYTE FREndPage[] = {0x44};
+const BYTE FREndSession[] = {0x42};
+const BYTE FRCloseDataSource[] = {0x49};
+
+const BYTE JRBeginSessionSeq[] = {0xC0, 0x00, 0xF8, 0x86, 0xC0, 0x03, 0xF8, 0x8F, 0xD1, 0x58,
+ 0x02, 0x58, 0x02, 0xF8, 0x89, 0x41};
+const BYTE JRFeedOrientationSeq[] = {0xC0, 0x00, 0xF8, 0x28 };
+// |fd ori enum| |ori cmd|
+const BYTE JRPaperSizeSeq[] = {0xC0, 0x00, 0xF8, 0x25};
+// |pap siz enum| |pap sz cmd|
+const BYTE JRCustomPaperSizeSeq[] = {0xF8, 0x2F, 0xC0, 0x00, 0xF8, 0x30};
+const BYTE JRMediaSourceSeq[] = {0xC0, 0x00, 0xF8, 0x26};
+// |Med src enum| |Med src cmd|
+const BYTE JRMediaDestinationSeq[] = {0xC0, 0x00, 0xF8, 0x24};
+// |Med Dest enum| |Med src cmd|
+const BYTE JRBeginPageSeq[] = {0x43, 0xD3, 0x64, 0x00, 0x64, 0x00, 0xF8, 0x2A, 0x75, 0xD3,
+ 0x00, 0x00, 0x00, 0x00, 0xF8, 0x4C, 0x6B};
+const BYTE JRBeginImageSeq[] = {0xC2, 0x00, 0x40, 0x70, 0x68, 0xF8, 0x91, 0xC1};
+const BYTE JRReadImageSeq[] = {0xC2, 0x01, 0x40, 0x70, 0x68, 0xF8, 0x91, 0xC1};
+const BYTE JRStripHeightSeq[] = {0xF8, 0x6D, 0xC1, 0x80, 0x00, 0xF8, 0x63};
+const BYTE JRTextObjectTypeSeq[] = {0xC0, 0x00, 0xF8, 0x96};
+// Interleaved Color Enumeration for Mojave
+const BYTE JRICESeq[] = {0xC0, 0x00, 0xF8, 0x98};
+
+const BYTE JRVueVersionTagSeq[] = {0xC2, 0x00, 0x00, 0x04, 0x00 , 0xF8, 0x95};
+// |endian alignd | |JR_ver_ tag|
+const BYTE JRDataLengthSeq[] = {0xC2, 0x86, 0x0A, 0x00, 0x00, 0xF8, 0x92};
+// | VU data length|
+const BYTE JRVendorUniqueSeq[] = {0x46};
+const BYTE JRVueExtn3Seq[] = {0xC2, 0x02, 0x40, 0x70, 0x68, 0xF8, 0x91 };
+// |endian alignd JR rd img tag| |VU extensn|
+const BYTE JREndPageSeq[] = {0x44};
+const BYTE JREndSessionSeq[] = {0x42};
+
+const BYTE JRQTSeq[] = {0x00, 0x80, 0x00, 0x03, 0x00, 0x00};
+const BYTE JRCRSeq[] = {0x01, 0x80, 0x2C, 0x00, 0x00, 0x00};
+const BYTE JRCR1GSeq[] = {0x05, 0xE0, 0x00, 0x00};
+const BYTE JRCR1CSeq[] = {0x01, 0xE0, 0x14, 0x66};
+
+const BYTE JRSCSeq[][4] =
+{
+ {
+ 0x00, 0x20, 0x00, 0x00
+ },
+ {
+ 0x00, 0x00, 0x00, 0x00
+ },
+ {
+ 0x00, 0x00, 0x00, 0x00
+ },
+ {
+ 0x00, 0x20, 0x00, 0x00
+ },
+ {
+ 0x00, 0xE0, 0x00, 0x00
+ },
+ {
+ 0x00, 0x00, 0x00, 0x00
+ },
+ {
+ 0x00, 0x20, 0x00, 0x00
+ },
+ {
+ 0x00, 0x00, 0x00, 0x00
+ },
+ {
+ 0x00, 0xE0, 0x00, 0x00
+ }
+};
+
+const BYTE LdlReset[] = {0x24, 0x00, 0x10, 0x00, 0x06, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x24};
+const BYTE LdlSync[] = {0x24, 0x01, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
+ 0x08, 0x00};
+const BYTE LdlSyncComplete[] = {0x24, 0x00, 0x10, 0x00, 0x08, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x24};
+const BYTE LdlContinue[] = {0x24, 0x00, 0x10, 0x00, 0x00, 0x0C, 0x00, 0x00,
+ 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0x24};
+const BYTE LdlPrepareToCancel[] = {0x24, 0x00, 0x10, 0x00, 0x00, 0x0C, 0x00, 0x00,
+ 0x00, 0x00, 0x0A, 0xFF, 0xFF, 0xFF, 0xFF, 0x24};
+
+
+#endif // PRINTER_COMMANDS_H
+
diff --git a/prnt/hpcups/Processor.cpp b/prnt/hpcups/Processor.cpp
new file mode 100644
index 0000000..edb8ab6
--- /dev/null
+++ b/prnt/hpcups/Processor.cpp
@@ -0,0 +1,48 @@
+/*****************************************************************************\
+ Processor.cpp : Implementation of Processor class
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+#include "Processor.h"
+
+Processor::Processor() : iRastersReady(0), iRastersDelivered(0), myphase(NULL), myplane(COLORTYPE_BOTH)
+{
+ for (int i = COLORTYPE_COLOR; i < MAX_COLORTYPE; i++)
+ {
+ raster.rasterdata[i] = NULL;
+ raster.rastersize[i] = 0;
+ }
+} //Processor
+
+
+Processor::~Processor()
+{
+
+} // ~Processor
+
+
diff --git a/prnt/hpcups/Processor.h b/prnt/hpcups/Processor.h
new file mode 100644
index 0000000..4a0a841
--- /dev/null
+++ b/prnt/hpcups/Processor.h
@@ -0,0 +1,54 @@
+/*****************************************************************************\
+ Processor.h : Interface for the Processor class
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+#ifndef PROCESSOR_H
+#define PROCESSOR_H
+
+#include "CommonDefinitions.h"
+class Pipeline;
+class Processor
+{
+public:
+ Processor();
+ virtual ~Processor();
+ //virtual bool Process(BYTE* InputRaster=NULL, unsigned int size=0)=0; // returns TRUE iff output ready
+ virtual bool Process(RASTERDATA *InputRaster=NULL)=0; // returns TRUE iff output ready
+ virtual void Flush()=0; // take any concluding actions based on internal state
+ virtual bool NextOutputRaster(RASTERDATA& next_raster)=0;
+ virtual unsigned int GetMaxOutputWidth() = 0;// in bytes, not pixels
+
+ unsigned int iRastersReady, iRastersDelivered;
+ Pipeline* myphase;
+ COLORTYPE myplane;
+ RASTERDATA raster;
+}; // Processor
+
+#endif // PROCESSOR_H
+
diff --git a/prnt/hpcups/QuickConnect.cpp b/prnt/hpcups/QuickConnect.cpp
new file mode 100644
index 0000000..001e985
--- /dev/null
+++ b/prnt/hpcups/QuickConnect.cpp
@@ -0,0 +1,200 @@
+/*****************************************************************************\
+ QuickConnect.cpp : Implementation of QuickConnect class
+
+ Copyright (c) 1996 - 2009, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+#include "Encapsulator.h"
+#include "QuickConnect.h"
+#include "ModeJpeg.h"
+
+QuickConnect::QuickConnect() : Encapsulator()
+{
+}
+
+QuickConnect::~QuickConnect()
+{
+}
+
+DRIVER_ERROR QuickConnect::StartJob(SystemServices *pSystemServices, JobAttributes *pJA)
+{
+ m_pSystemServices = pSystemServices;
+ m_pJA = pJA;
+ m_pMA = &pJA->media_attributes;
+ m_pQA = &pJA->quality_attributes;
+ return NO_ERROR;
+}
+
+DRIVER_ERROR QuickConnect::Configure(Pipeline **pipeline)
+{
+ Pipeline *head;
+ ModeJpeg *pModeJpeg;
+ pModeJpeg = new ModeJpeg(m_pMA->printable_width);
+ if (pModeJpeg == NULL)
+ {
+ return ALLOCMEM_ERROR;
+ }
+
+// This is the max jpeg file size value
+ pModeJpeg->myplane = COLORTYPE_COLOR;
+ pModeJpeg->Init(m_pJA->integer_values[1], m_pMA->printable_height);
+ head = new Pipeline(pModeJpeg);
+ *pipeline = head;
+ return NO_ERROR;
+}
+
+DRIVER_ERROR QuickConnect::StartPage(JobAttributes *pJA)
+{
+ char szStr[632];
+ DRIVER_ERROR err;
+ const char *szPJLHeader = "\x1B\x45\x1B%-12345X@PJL ENTER LANGUAGE=PHOTOJPEG\012";
+ memset(szStr, 0, 600);
+ err = m_pSystemServices->Send((const BYTE *) szStr, 600);
+ sprintf(szStr, "%s@PJL SET COPIES=%d\012@PJL SET JOBID=%d\012", szPJLHeader, 1, m_pJA->job_id);
+ sprintf(szStr+strlen(szStr),
+ "@PJL SET PAPER=%d\012@PJL SET MEDIATYPE=%d\012@PJL SET PRINTQUALITY=%d\012@PJL SET BORDERLESS=%d\012",
+ m_pMA->pcl_id, m_pQA->media_type, m_pQA->print_quality, m_pJA->integer_values[2]);
+ err = m_pSystemServices->Send((const BYTE *) szStr, strlen(szStr));
+ return err;
+}
+
+DRIVER_ERROR QuickConnect::Encapsulate(RASTERDATA *InputRaster, bool bLastPlane)
+{
+ DRIVER_ERROR err;
+ const char *szPJLEndJob = "\x1B\x45\x1B%-12345X";
+ int header_size = 0;
+ if (InputRaster->rasterdata[COLORTYPE_COLOR] == NULL)
+ {
+ return NO_ERROR;
+ }
+
+ err = sendExifHeader(InputRaster->rasterdata[COLORTYPE_COLOR], &header_size);
+ if (err != NO_ERROR)
+ {
+ return err;
+ }
+ err = m_pSystemServices->Send((const BYTE *) InputRaster->rasterdata[COLORTYPE_COLOR] + header_size,
+ InputRaster->rastersize[COLORTYPE_COLOR] - header_size);
+ if (err == NO_ERROR)
+ {
+ err = m_pSystemServices->Send((const BYTE *) szPJLEndJob, strlen(szPJLEndJob));
+ }
+ return err;
+}
+
+DRIVER_ERROR QuickConnect::sendExifHeader(BYTE *jpeg_buffer, int *header_size)
+{
+ DRIVER_ERROR err;
+ BYTE *pBuffer = jpeg_buffer;
+
+/*
+ * Jpeg APP2 Marker
+ * APP2 Header| Length | Identifier | Version |Number of Tags
+ * -------------------------------------------------------------------------
+ * 0xFF|0xE2 |0x00 | 0x23|0x48|0x50|0x51|0x43|0x00|0x00|0x01|0x00|0x02
+ * Length = No. of Tags * length of tag + length of APP2 marker
+ * -------------------------------------------------------------------------
+ * Tag ID |field Type| Count |Value Offset
+ * -------------------------------------------------------------
+ * 0x00|0x01|0x00|0x03 |0x00|0x00|0x00|0x01|0x00|0x00|0x00|0x01
+ * -------------------------------------------------------------
+ * Field Type 0x0003 stands for short
+ * Count and Value Offset are 4 bytes in TIFF convention.
+ * If the count <=4, Value Offset satisfies. If the count is bigger than 4 bytes,
+ * it will be offset to where data is located.
+ */
+
+ unsigned char App2[] = {"\xFF\xE2\x00\x23\x48\x50\x51\x43\x00\x00\x01\x00\x02"};
+ unsigned char szApp2Markers[2][12];
+ int iNumTags = 0;
+ int iOpts[2];
+
+// Things to set are: PhotoFix, RedEyeRemoval
+
+ iOpts[0] = m_pJA->integer_values[4]; // Red Eye flag
+ iOpts[1] = m_pJA->integer_values[3]; // Photo fix flag
+
+ short skey;
+ unsigned char szTag[] = {"\x00\x01\x00\x03\x00\x00\x00\x01\x00\x00\x00\x01"};
+ unsigned int iVal;
+
+ for (skey = 1; skey <= 2; skey++)
+ {
+ szTag[0] = (BYTE) ((skey & 0xFF) >> 8);
+ szTag[1] = (BYTE) (skey & 0xFF);
+
+ iVal = iOpts[skey];
+ szTag[8] = (BYTE) ((iVal >> 24) & 0xFF);
+ szTag[9] = (BYTE) ((iVal >> 16) & 0xFF);
+ szTag[10] = (BYTE) ((iVal >> 8) & 0xFF);
+ szTag[11] = (BYTE) (iVal & 0xFF);
+ memcpy (szApp2Markers[iNumTags], szTag, 12);
+ iNumTags++;
+
+ skey = (short) iNumTags * 12 + 11;
+ App2[2] = (BYTE) ((skey >> 8) & 0xFF);
+ App2[3] = (BYTE) (skey & 0xFF);
+ App2[11] = (BYTE) ((iNumTags >> 8) & 0xFF);
+ App2[12] = (BYTE) (iNumTags & 0xFF);
+ }
+
+/*
+ * First write the SOI and JFIF header
+ * File structure is:
+ *
+ * BYTE SOI[2]; // 00h Start of Image Marker
+ * BYTE APP0[2]; // 02h Application Use Marker
+ * BYTE Length[2]; // 04h Length of APP0 Field
+ * BYTE Identifier[5]; // 06h "JFIF" (zero terminated) Id String
+ * BYTE Version[2]; // 07h JFIF Format Revision
+ * BYTE Units; // 09h Units used for Resolution
+ * BYTE Xdensity[2]; // 0Ah Horizontal Resolution
+ * BYTE Ydensity[2]; // 0Ch Vertical Resolution
+ * BYTE XThumbnail; // 0Eh Horizontal Pixel Count
+ * BYTE YThumbnail; // 0Fh Vertical Pixel Count
+ */
+
+ short sJFIFHeaderSize = ((((short) pBuffer[4]) << 8) | pBuffer[5]) + 4;
+ err = m_pSystemServices->Send ((const BYTE *) pBuffer, sJFIFHeaderSize);
+ if (err != NO_ERROR)
+ {
+ return err;
+ }
+
+ *header_size = sJFIFHeaderSize;
+
+ if (iNumTags != 0)
+ {
+ err = m_pSystemServices->Send ((const BYTE *) App2, 13);
+ for (int i = 0; i < iNumTags; i++)
+ {
+ err = m_pSystemServices->Send ((const BYTE *) szApp2Markers[i], 12);
+ }
+ }
+ return err;
+}
+
diff --git a/prnt/hpcups/QuickConnect.h b/prnt/hpcups/QuickConnect.h
new file mode 100644
index 0000000..1ff5114
--- /dev/null
+++ b/prnt/hpcups/QuickConnect.h
@@ -0,0 +1,60 @@
+/*****************************************************************************\
+ QuickConnect.h : Interface for Pcl3Gui2 class
+
+ Copyright (c) 1996 - 2009, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+#ifndef QUICK_CONNECT_H
+#define QUICK_CONNECT_H
+
+class QuickConnect: public Encapsulator
+{
+public:
+ QuickConnect();
+ ~QuickConnect();
+ DRIVER_ERROR Encapsulate(RASTERDATA *InputRaster, bool bLastPlane);
+ DRIVER_ERROR StartJob(SystemServices *pSystemServices, JobAttributes *pJA);
+ DRIVER_ERROR StartPage(JobAttributes *pJA);
+ DRIVER_ERROR Configure(Pipeline **pipeline);
+ DRIVER_ERROR SendCAPy(int iOffset) {return NO_ERROR;}
+ DRIVER_ERROR FormFeed() {return NO_ERROR;}
+ DRIVER_ERROR EndJob() {return NO_ERROR;}
+ DRIVER_ERROR Cleanup() {return NO_ERROR;}
+ bool CanSkipRasters() {return false;}
+protected:
+ bool needPJLHeaders(JobAttributes *pJA)
+ {
+ return false;
+ }
+ DRIVER_ERROR addJobSettings() {return NO_ERROR;}
+ DRIVER_ERROR flushPrinterBuffer() {return NO_ERROR;}
+private:
+ DRIVER_ERROR sendExifHeader(BYTE *jpeg_data, int *header_size);
+};
+
+#endif // QUICK_CONNECT_H
+
diff --git a/prnt/hpcups/RasterSender.cpp b/prnt/hpcups/RasterSender.cpp
new file mode 100644
index 0000000..de2ec6d
--- /dev/null
+++ b/prnt/hpcups/RasterSender.cpp
@@ -0,0 +1,54 @@
+/*****************************************************************************\
+ RasterSender.cpp : Implementation of RasterSender class
+
+ Copyright (c) 1996 - 2009, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+#include "RasterSender.h"
+#include "Pipeline.h"
+
+RasterSender::RasterSender (Encapsulator *pEncap)
+{
+ encap = pEncap;
+}
+
+RasterSender::~RasterSender()
+{
+}
+
+////////////////////////////////////////////////////////////////////////
+bool RasterSender::Process (RASTERDATA* InputRaster)
+{
+ DRIVER_ERROR err = NO_ERROR;
+ bool bOutput = false;
+ err = encap->Encapsulate (InputRaster, true);
+ if (err == NO_ERROR)
+ bOutput = true;
+ myphase->err = err;
+ return bOutput;
+}
+
diff --git a/prnt/hpcups/RasterSender.h b/prnt/hpcups/RasterSender.h
new file mode 100644
index 0000000..af43158
--- /dev/null
+++ b/prnt/hpcups/RasterSender.h
@@ -0,0 +1,56 @@
+/*****************************************************************************\
+ RasterSender.h : Interface for the RasterSender class
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+#ifndef RASTERSENDER_H
+#define RASTERSENDER_H
+
+#include "CommonDefinitions.h"
+#include "Processor.h"
+#include "Encapsulator.h"
+
+class RasterSender : public Processor
+{
+public:
+ // installs Header and Connection
+ RasterSender (Encapsulator *pEncap);
+
+ ~RasterSender();
+
+ // processor interface ////////////////////////////////////
+ bool Process(RASTERDATA* InputRaster=NULL);
+ void Flush() { };
+ bool NextOutputRaster(RASTERDATA& next_raster) { return false; } // end of pipeline
+ unsigned int GetMaxOutputWidth() { return 0; } // never called
+private:
+ Encapsulator *encap;
+}; // RasterSender
+
+#endif // RASTERSENDER_H
+
diff --git a/prnt/hpcups/Scaler.cpp b/prnt/hpcups/Scaler.cpp
new file mode 100644
index 0000000..c7038d1
--- /dev/null
+++ b/prnt/hpcups/Scaler.cpp
@@ -0,0 +1,317 @@
+/*****************************************************************************\
+ Scaler.cpp : Implimentation for the Scaler class
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+#include "CommonDefinitions.h"
+#include "Processor.h"
+#include "Scaler.h"
+
+#define MAX_OUTPUT_RASTERS 32
+
+Scaler::Scaler(unsigned int inputwidth, unsigned int numerator,
+ unsigned int denominator, bool bVIP, unsigned int BytesPerPixel,
+ unsigned int iNumInks)
+{
+
+ iInputWidth = inputwidth;
+ rowremainder = remainder;
+ NumInks = iNumInks;
+ vip = bVIP;
+
+ ScaleFactor= (float)numerator / (float)denominator;
+ if (ScaleFactor > (float)MAX_OUTPUT_RASTERS) //
+ {
+ constructor_error = INDEX_OUT_OF_RANGE;
+ return;
+ }
+ int factor = (int)ScaleFactor;
+ float rem = ScaleFactor - (float)factor;
+ rem *= 1000;
+ remainder = (int)rem;
+
+ iOutputWidth = (int) (((float)iInputWidth / (float)denominator) *
+ (float)numerator);
+ iOutputWidth++; // safety measure to protect against roundoff error
+
+ if (numerator == denominator)
+ scaling = false;
+ else scaling = true;
+
+ // ScaleBound=max number of output rows per input row;
+ // i.e., if scale=4.28, then sometimes 5 rows will come out
+
+ int ScaleBound = int(ScaleFactor);
+ if (ScaleFactor > (float) ScaleBound)
+ ScaleBound++;
+
+ // allocate a buffer for one output row
+ int RSBuffSize = (int) (((float)(BytesPerPixel*iOutputWidth)) * ScaleBound );
+ pOutputBuffer[COLORTYPE_COLOR] = (BYTE *) new BYTE[RSBuffSize];
+ if (pOutputBuffer[COLORTYPE_COLOR] == NULL)
+ {
+ constructor_error = ALLOCMEM_ERROR;
+ return;
+ }
+ int BlackBuffSize = (int) (((float) (iOutputWidth)) * ScaleBound );
+ pOutputBuffer[COLORTYPE_BLACK] = (BYTE*) new BYTE[BlackBuffSize];
+ if (pOutputBuffer[COLORTYPE_BLACK] == NULL)
+ {
+ constructor_error = ALLOCMEM_ERROR;
+ return;
+ }
+
+ if (ScaleFactor < 2.0)
+ ReplicateOnly = true;
+ else
+ ReplicateOnly = false;
+
+ if (ScaleFactor > (float) factor)
+ fractional = true;
+ else fractional = false;
+}
+
+Scaler::~Scaler ()
+{
+ for (int i = COLORTYPE_COLOR; i < MAX_COLORTYPE; i++)
+ {
+ if (pOutputBuffer[i])
+ {
+ delete [] pOutputBuffer[i];
+ pOutputBuffer[i] = NULL;
+ }
+ }
+}
+
+unsigned int Scaler::GetMaxOutputWidth()
+{
+ if (myplane == COLORTYPE_COLOR)
+ {
+ return (iOutputWidth-1)*NUMBER_PLANES; // we padded it in case of roundoff error
+ }
+ else
+ {
+ return (iOutputWidth-1); // we padded it in case of roundoff error
+ }
+}
+
+bool Scaler::Process(RASTERDATA* raster_in)
+{
+ iRastersDelivered=0;
+
+ if (raster_in == NULL || (raster_in->rasterdata[COLORTYPE_COLOR] == NULL && raster_in->rasterdata[COLORTYPE_BLACK] == NULL))
+ {
+ rowremainder=remainder;
+ return false;
+ }
+
+ if (!scaling)
+ {
+ // just copy both to output buffer
+ for (int i = COLORTYPE_COLOR; i < MAX_COLORTYPE; i++)
+ {
+ if (raster_in->rasterdata[i])
+ {
+ memcpy(pOutputBuffer[i], raster_in->rasterdata[i], raster_in->rastersize[i]);
+ }
+ }
+ iRastersReady = 1;
+ return true;
+ }
+
+ if (myplane == COLORTYPE_COLOR)
+ {
+ if (raster_in->rasterdata[COLORTYPE_BLACK])
+ {
+ memcpy(pOutputBuffer[COLORTYPE_BLACK], raster_in->rasterdata[COLORTYPE_BLACK], raster_in->rastersize[COLORTYPE_BLACK]);
+ }
+ }
+
+ if (myplane == COLORTYPE_BLACK)
+ {
+ if (raster_in->rasterdata[COLORTYPE_COLOR])
+ {
+ memcpy(pOutputBuffer[COLORTYPE_COLOR], raster_in->rasterdata[COLORTYPE_COLOR], raster_in->rastersize[COLORTYPE_COLOR]);
+ }
+ }
+
+ // multiply row
+ unsigned int ifactor = (unsigned int) (int) ScaleFactor;
+ unsigned int targptr=0;
+ unsigned int sourceptr=0;
+ unsigned int rem = remainder;
+
+ if (myplane == COLORTYPE_COLOR || myplane == COLORTYPE_BOTH)
+ {
+ if (raster_in->rasterdata[COLORTYPE_COLOR])
+ {
+ if (vip) // RGB values interleaved
+ {
+ unsigned int width = iInputWidth*3;
+ for (unsigned int i=0; i < width; i += 3)
+ {
+ unsigned int factor = ifactor;
+ if (rem >= 1000)
+ {
+ factor++;
+ rem -= 1000;
+ }
+ for (unsigned int j=0; j < factor; j++)
+ {
+ pOutputBuffer[COLORTYPE_COLOR][targptr++] = raster_in->rasterdata[COLORTYPE_COLOR][i];
+ pOutputBuffer[COLORTYPE_COLOR][targptr++] = raster_in->rasterdata[COLORTYPE_COLOR][i+1];
+ pOutputBuffer[COLORTYPE_COLOR][targptr++] = raster_in->rasterdata[COLORTYPE_COLOR][i+2];
+ }
+ rem += remainder;
+ }
+ }
+ else // KCMY values NOT interleaved
+ // iInputWidth = bytes per plane
+ for (unsigned int i=0; i < NumInks; i++) // loop over planes
+ {
+ unsigned int planecount=0; // count output bytes for this plane
+ unsigned int src=0; // count input bytes for this plane
+ while ((planecount < iOutputWidth-1) && (src < iInputWidth))
+ {
+ unsigned int factor = ifactor;
+ if (rem >= 1000)
+ {
+ factor++;
+ rem -= 1000;
+ }
+ for (unsigned int j=0; (j < factor) && (planecount < iOutputWidth-1); j++)
+ {
+ pOutputBuffer[COLORTYPE_COLOR][targptr++] = raster_in->rasterdata[COLORTYPE_COLOR][sourceptr];
+ planecount++;
+ }
+ rem += remainder;
+ sourceptr++; src++;
+ }
+ while (planecount < iOutputWidth-1) // fill out odd bytes so all planes are equal
+ {
+ pOutputBuffer[COLORTYPE_COLOR][targptr++] = raster_in->rasterdata[COLORTYPE_COLOR][sourceptr-1];
+ planecount++;
+ }
+
+ }
+ }
+ }
+
+ ifactor = (unsigned int) (int) ScaleFactor;
+ targptr=0;
+ sourceptr=0;
+ rem = remainder;
+
+ if (myplane == COLORTYPE_BLACK || myplane == COLORTYPE_BOTH)
+ {
+ if (raster_in->rasterdata[COLORTYPE_BLACK])
+ {
+ // K values NOT interleaved
+ // iInputWidth = bytes per plane
+ unsigned int planecount=0; // count output bytes for this plane
+ unsigned int src=0; // count input bytes for this plane
+ while ((planecount < iOutputWidth-1) && (src < iInputWidth))
+ {
+ unsigned int factor = ifactor;
+ if (rem >= 1000)
+ {
+ factor++;
+ rem -= 1000;
+ }
+ for (unsigned int j=0; (j < factor) && (planecount < iOutputWidth-1); j++)
+ {
+ pOutputBuffer[COLORTYPE_BLACK][targptr++] = raster_in->rasterdata[COLORTYPE_BLACK][sourceptr];
+ planecount++;
+ }
+ rem += remainder;
+ sourceptr++; src++;
+ }
+ while (planecount < iOutputWidth-1) // fill out odd bytes so all planes are equal
+ {
+ pOutputBuffer[COLORTYPE_BLACK][targptr++] = raster_in->rasterdata[COLORTYPE_BLACK][sourceptr-1];
+ planecount++;
+ }
+ }
+ }
+
+ unsigned int factor = ifactor;
+ if (rowremainder >= 1000)
+ {
+ factor++;
+ rowremainder -= 1000;
+ }
+ if (myplane == COLORTYPE_BLACK && raster_in->rasterdata[COLORTYPE_COLOR])
+ iRastersReady = 1;
+ else
+ iRastersReady=factor;
+ iRastersDelivered=0;
+ rowremainder += remainder;
+ return true;
+}
+
+bool Scaler::NextOutputRaster(RASTERDATA &next_raster)
+{
+ if (iRastersReady == 0)
+ return false;
+
+ if (myplane == COLORTYPE_BLACK)
+ {
+ if (raster.rasterdata[COLORTYPE_BLACK] == NULL)
+ iRastersReady = 1;
+ }
+ if (myplane == COLORTYPE_COLOR)
+ {
+ iRastersReady--;
+ iRastersDelivered++;
+ }
+ bool bval = false;
+ if (raster.rastersize[COLORTYPE_BLACK] > 0)
+ {
+ next_raster.rastersize[COLORTYPE_BLACK] = raster.rastersize[COLORTYPE_BLACK];
+ next_raster.rasterdata[COLORTYPE_BLACK] = pOutputBuffer[COLORTYPE_BLACK];
+ bval = true;
+ }
+ else
+ {
+ next_raster.rastersize[COLORTYPE_BLACK] = 0;
+ next_raster.rasterdata[COLORTYPE_BLACK] = NULL;
+ }
+ if (raster.rastersize[COLORTYPE_COLOR] > 0)
+ {
+ next_raster.rastersize[COLORTYPE_COLOR] = raster.rastersize[COLORTYPE_COLOR];
+ next_raster.rasterdata[COLORTYPE_COLOR] = pOutputBuffer[COLORTYPE_COLOR];
+ bval = true;
+ }
+ else
+ {
+ next_raster.rastersize[COLORTYPE_COLOR] = 0;
+ next_raster.rasterdata[COLORTYPE_COLOR] = NULL;
+ }
+ return bval;
+}
+
diff --git a/prnt/hpcups/Scaler.h b/prnt/hpcups/Scaler.h
new file mode 100644
index 0000000..1f121af
--- /dev/null
+++ b/prnt/hpcups/Scaler.h
@@ -0,0 +1,39 @@
+
+#ifndef SCALER_H
+#define SCALER_H
+
+#include "CommonDefinitions.h"
+#include "Processor.h"
+
+class Scaler : public Processor
+{
+public:
+ Scaler(unsigned int inputwidth, unsigned int numerator,
+ unsigned int denominator, bool bVIP, unsigned int BytesPerPixel,
+ unsigned int iNumInks);
+ virtual ~Scaler();
+ bool Process(RASTERDATA* InputRaster);
+ virtual void Flush() { Process(NULL); }
+
+ float ScaleFactor;
+ unsigned int remainder;
+
+ unsigned int GetMaxOutputWidth();
+ bool NextOutputRaster(RASTERDATA &next_raster);
+
+private:
+
+ bool scaling; // false iff ScaleFactor==1.0
+ bool ReplicateOnly; // true iff 1<ScaleFactor<2
+
+ unsigned int iOutputWidth;
+ unsigned int iInputWidth;
+ BYTE *pOutputBuffer[MAX_COLORTYPE];
+ bool fractional;
+ unsigned int rowremainder;
+ unsigned int NumInks;
+ bool vip;
+ DRIVER_ERROR constructor_error;
+};
+#endif // SCALER_H
+
diff --git a/prnt/hpcups/SystemServices.cpp b/prnt/hpcups/SystemServices.cpp
new file mode 100644
index 0000000..d85afc0
--- /dev/null
+++ b/prnt/hpcups/SystemServices.cpp
@@ -0,0 +1,67 @@
+/*****************************************************************************\
+ SystemServices.cpp : Implementation of SystemServices class
+
+ Copyright (c) 1996 - 2009, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+#include "CommonDefinitions.h"
+#include "SystemServices.h"
+
+SystemServices::SystemServices(int iLogLevel, int job_id) : m_iLogLevel(iLogLevel)
+{
+ m_fp = NULL;
+ if (iLogLevel & SAVE_PCL_FILE)
+ {
+ char fname[32];
+ sprintf(fname, "/tmp/hpcups_job%d.out", job_id);
+ m_fp = fopen(fname, "w");
+ chmod(fname, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
+ }
+}
+
+SystemServices::~SystemServices()
+{
+ if (m_fp)
+ {
+ fclose (m_fp);
+ }
+}
+
+DRIVER_ERROR SystemServices::Send(const BYTE *pData, int iLength)
+{
+ if (m_fp)
+ {
+ fwrite (pData, 1, iLength, m_fp);
+ if (!(m_iLogLevel & SEND_TO_PRINTER_ALSO))
+ {
+ return NO_ERROR;
+ }
+ }
+ write (STDOUT_FILENO, pData, iLength);
+ return NO_ERROR;
+}
+
diff --git a/prnt/hpcups/SystemServices.h b/prnt/hpcups/SystemServices.h
new file mode 100644
index 0000000..3abc19f
--- /dev/null
+++ b/prnt/hpcups/SystemServices.h
@@ -0,0 +1,46 @@
+/*****************************************************************************\
+ SystemServices.h : interface for SystemServices class
+
+ Copyright (c) 1996 - 2009, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+#ifndef SYSTEM_SERVICES_H
+#define SYSTEM_SERVICES_H
+
+class SystemServices
+{
+public:
+ SystemServices(int iLogLevel, int job_id);
+ ~SystemServices();
+ DRIVER_ERROR Send(const BYTE *pData, int iLength);
+private:
+ int m_iLogLevel;
+ FILE *m_fp;
+};
+
+#endif // SYSTEM_SERVICES_H
+
diff --git a/prnt/hpcups/Utils.cpp b/prnt/hpcups/Utils.cpp
new file mode 100644
index 0000000..d3eec48
--- /dev/null
+++ b/prnt/hpcups/Utils.cpp
@@ -0,0 +1,133 @@
+/*****************************************************************************\
+ Utils.cpp : implementaiton of utility functions
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+#include "CommonDefinitions.h"
+#include <dlfcn.h>
+
+void *LoadPlugin (const char *szPluginName)
+{
+ FILE *fp;
+ char szLine[256];
+ int i;
+ void *ptemp = NULL;
+ char *p = NULL;
+ int bFound = 0;
+ if ((fp = fopen ("/etc/hp/hplip.conf", "r")) == NULL)
+ {
+ return NULL;
+ }
+ while (!feof (fp))
+ {
+ if (!fgets (szLine, 256, fp))
+ {
+ break;
+ }
+ if (!bFound && strncmp (szLine, "[dirs]", 6))
+ continue;
+ bFound = 1;
+ if (szLine[0] < ' ')
+ break;
+ if (!strncmp (szLine, "home", 4))
+ {
+ i = strlen (szLine);
+ while (i > 0 && szLine[i] < ' ')
+ szLine[i--] = '\0';
+ p = szLine + 4;
+ while (*p && *p != '/')
+ p++;
+ sprintf (p+strlen (p), "/prnt/plugins/%s", szPluginName);
+ ptemp = dlopen (p, RTLD_LAZY);
+ }
+ }
+ fclose (fp);
+ return ptemp;
+}
+
+int SendChunkHeader (BYTE *szStr, DWORD dwSize, DWORD dwChunkType, DWORD dwNumItems)
+{
+ for (int j = 3, i = 0; j >= 0; j--)
+ {
+ szStr[i] = (BYTE) ((dwSize >> (8 * (j))) & 0xFF);
+ szStr[4+i] = (BYTE) ((dwChunkType >> (8 * (j))) & 0xFF);
+ szStr[8+i] = (BYTE) ((dwNumItems >> (8 * (j))) & 0xFF);
+ i++;
+ }
+
+ szStr[12] = (BYTE) (((dwNumItems * 12) & 0xFF00) >> 8);
+ szStr[13] = (BYTE) (((dwNumItems * 12) & 0x00FF));
+
+ szStr[14] = 'Z';
+ szStr[15] = 'Z';
+ return 16;
+}
+
+int SendItemExtra (BYTE *szStr, BYTE cType, WORD wItem, DWORD dwValue, DWORD dwExtra)
+{
+ int i, j;
+ dwExtra += 12;
+ for (j = 3, i = 0; j >= 0; j--)
+ {
+ szStr[i++] = (BYTE) ((dwExtra >> (8 * (j))) & 0xFF);
+ }
+ szStr[i++] = (BYTE) ((wItem & 0xFF00) >> 8);
+ szStr[i++] = (BYTE) ((wItem & 0x00FF));
+ szStr[i++] = (BYTE) cType;
+ szStr[i++] = 0;
+ for (j = 3; j >= 0; j--)
+ {
+ szStr[i++] = (BYTE) ((dwValue >> (8 * (j))) & 0xFF);
+ }
+ return i;
+}
+
+int SendItem (BYTE *szStr, BYTE cType, WORD wItem, DWORD dwValue)
+{
+ return SendItemExtra (szStr, cType, wItem, dwValue, 0);
+}
+
+int SendIntItem (BYTE *szStr, int iItem, int iItemType, int iItemValue)
+{
+ int i = 0;
+ int j;
+ for (j = 3; j >= 0; j--)
+ {
+ szStr[i++] = (BYTE) ((iItem >> (8 * (j))) & 0xFF);
+ }
+ for (j = 3; j >= 0; j--)
+ {
+ szStr[i++] = (BYTE) ((iItemType >> (8 * (j))) & 0xFF);
+ }
+ for (j = 3; j >= 0; j--)
+ {
+ szStr[i++] = (BYTE) ((iItemValue >> (8 * (j))) & 0xFF);
+ }
+ return i;
+}
+
diff --git a/prnt/hpcups/Utils.h b/prnt/hpcups/Utils.h
new file mode 100644
index 0000000..c19bd4e
--- /dev/null
+++ b/prnt/hpcups/Utils.h
@@ -0,0 +1,36 @@
+/*****************************************************************************\
+ Utils.cpp : implementaiton of utility functions
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+int SendChunkHeader (BYTE *szStr, DWORD dwSize, DWORD dwChunkType, DWORD dwNumItems);
+int SendItem (BYTE *szStr, BYTE cType, WORD wItem, DWORD dwValue);
+int SendItemExtra (BYTE *szStr, BYTE cType, WORD wItem, DWORD dwValue, DWORD dwExtra);
+int SendIntItem (BYTE *szStr, int iItem, int iItemType, int iItemValue);
+void *LoadPlugin (const char *szPluginName);
+
diff --git a/prnt/hpcups/apPrintModes.h b/prnt/hpcups/apPrintModes.h
new file mode 100644
index 0000000..0a8368e
--- /dev/null
+++ b/prnt/hpcups/apPrintModes.h
@@ -0,0 +1,68 @@
+PrintMode apPrintModes[] =
+{
+ {
+ "PlainNormalColor",
+ {300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300},
+ {1, 1, 1, 1, 1, 1}, 4, FED,
+ {ulMapDJ660_CCM_KCMY, NULL, NULL},
+ 300, 300, false, HTBinary_open, HTBinary_open
+ },
+ {
+ "PlainNormalColorCMY",
+ {300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300},
+ {1, 1, 1, 1, 1, 1}, 3, FED,
+ {ulMapDJ600_CCM_CMY, NULL, NULL},
+ 300, 300, false, HTBinary_open, HTBinary_open
+ },
+ {
+ "PhotoNormalColor",
+ {600, 600, 600, 600, 600, 600},
+ {600, 600, 600, 600, 600, 600},
+ {1, 1, 1, 1, 1, 1}, 6, FED,
+ {ulMapDJ690_CMYK, ulMapDJ690_ClMlxx, NULL},
+ 600, 600, false, HTBinary_open, HTBinary_open
+ },
+ {
+ "PlainNormalGrayK",
+ {300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300},
+ {1, 1, 1, 1, 1, 1}, 1, FED,
+ {ulMapDJ600_CCM_K, NULL, NULL},
+ 300, 300, false, HTBinary_open, HTBinary_open
+ },
+ {
+ "PlainDraftGrayK",
+ {300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300},
+ {1, 1, 1, 1, 1, 1}, 1, FED,
+ {ulMapDJ600_CCM_K, NULL, NULL},
+ 300, 300, false, HTBinary_open, HTBinary_open
+ },
+ {
+ "PlainDraftColor",
+ {300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300},
+ {1, 1, 1, 1, 1, 1}, 4, MATRIX,
+ {ulMapDJ660_CCM_KCMY, NULL, NULL},
+ 300, 300, false, HTBinary_open, HTBinary_open
+ },
+ {
+ "PlainDraftColorCMY",
+ {300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300},
+ {1, 1, 1, 1, 1, 1}, 3, FED,
+ {ulMapDJ600_CCM_CMY, NULL, NULL},
+ 300, 300, false, HTBinary_open, HTBinary_open
+ },
+ {
+ "PlainBestGrayK",
+ {600, 300, 300, 300, 300, 300},
+ {600, 300, 300, 300, 300, 300},
+ {1, 1, 1, 1, 1, 1}, 1, FED,
+ {ulMapDJ600_CCM_K, NULL, NULL},
+ 600, 600, true, HTBinary_open, HTBinary_open
+ }
+};
+
diff --git a/prnt/hpcups/dbuscomm.cpp b/prnt/hpcups/dbuscomm.cpp
new file mode 100644
index 0000000..dc41960
--- /dev/null
+++ b/prnt/hpcups/dbuscomm.cpp
@@ -0,0 +1,143 @@
+/*****************************************************************************\
+ dbuscomm.cpp : Interface for DBusCommunicator class
+
+ Copyright (c) 1996 - 2011, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ Author: Amarnath Chitumalla
+\*****************************************************************************/
+
+#include "dbuscomm.h"
+
+DBusCommunicator::DBusCommunicator()
+{
+ m_strPrinterURI = "";
+ m_strPrinterName = "";
+#ifdef HAVE_DBUS
+ m_DbusConnPtr = NULL;
+#endif
+}
+/*
+*
+*
+*/
+
+
+bool DBusCommunicator::initDBusComm(string strDbusPath/*=""*/,string strInterfaceName/*=""*/,
+ string strPrinterURI/*=""*/, string strPrinterName/*= ""*/, int iJobId/*=0*/, string strUser/*=""*/)
+{
+#ifdef HAVE_DBUS
+ DBusError objError;
+ DBusError * pDBusError=&objError;
+
+ m_strPrinterURI = strPrinterURI;
+ m_strPrinterName = strPrinterName;
+ m_strDbusInterface = strInterfaceName;
+ m_strDbusPath = strDbusPath;
+ m_strUser = strUser;
+ m_iJobId = iJobId;
+
+ dbus_error_init(pDBusError);
+ m_DbusConnPtr = dbus_bus_get(DBUS_BUS_SYSTEM, pDBusError);
+ if(dbus_error_is_set(pDBusError))
+ {
+ dbglog("Error: dBus Connection Error (%s)!\n", pDBusError->message);
+ dbus_error_free(pDBusError);
+ }
+
+ if(m_DbusConnPtr == NULL)
+ {
+ dbglog("Error: dBus Connection Error (%s)!\n", pDBusError->message);
+ return false;
+ }
+#endif
+ return true;
+}
+
+bool DBusCommunicator::sendEvent(string strDbusPath,string strInterfaceName, string strDeviceURI, string strPrinterName, int iEvent,
+ string strTitle/*=""*/, int iJobId/*=0*/, string strUser/*=""*/)
+{
+#ifdef HAVE_DBUS
+
+ if(NULL == m_DbusConnPtr )
+ {
+ dbglog("Error: dBus connection ptr is NULL.\n");
+ return false;
+ }
+ if(true == strDbusPath.empty() || true == strInterfaceName.empty() || 0 == iEvent)
+ {
+ dbglog("Error: dBus service Name can't be empty. DBus Path(%s) DBus Interface (%s) Event(%d)!\n",
+ strDbusPath.c_str(), strInterfaceName.c_str(), iEvent);
+ return false;
+ }
+ DBusMessage * msg = dbus_message_new_signal(strDbusPath.c_str(), strInterfaceName.c_str(), "Event");
+ if (NULL == msg)
+ {
+ dbglog("Error: dBus dbus_message_new_signal returned error. DBus Interface (%s) Event(%d)!\n", strInterfaceName.c_str(), iEvent);
+ return false;
+ }
+
+ if (NULL == msg)
+ {
+ dbglog("dbus message is NULL!\n");
+ return false;
+ }
+ const char * stURI=strDeviceURI.c_str();
+ const char * stPRNTNM=strPrinterName.c_str();
+ const char * stUSR=strUser.c_str();
+ const char * stTtl=strTitle.c_str();
+
+ dbus_message_append_args(msg,
+ DBUS_TYPE_STRING, &stURI,
+ DBUS_TYPE_STRING, &stPRNTNM,
+ DBUS_TYPE_UINT32, &iEvent,
+ DBUS_TYPE_STRING, &stUSR,
+ DBUS_TYPE_UINT32, &iJobId,
+ DBUS_TYPE_STRING, &stTtl,
+ DBUS_TYPE_INVALID);
+
+ if (!dbus_connection_send(m_DbusConnPtr , msg, NULL))
+ {
+ dbglog("dbus message send failed!\n");
+ return false;
+ }
+
+ dbus_connection_flush(m_DbusConnPtr );
+ dbus_message_unref(msg);
+
+#endif
+ return true;
+
+}
+
+bool DBusCommunicator::sendEvent(int iEvent, string strTitle/*=""*/, int iJobId/*=0*/,string strUser/*=""*/)
+{
+ return sendEvent(m_strDbusPath, m_strDbusInterface, m_strPrinterURI, m_strPrinterName, iEvent, strTitle, iJobId,strUser);
+}
+
+DBusCommunicator::~DBusCommunicator()
+{
+
+}
diff --git a/prnt/hpcups/dbuscomm.h b/prnt/hpcups/dbuscomm.h
new file mode 100644
index 0000000..9932473
--- /dev/null
+++ b/prnt/hpcups/dbuscomm.h
@@ -0,0 +1,81 @@
+/*****************************************************************************\
+ dbuscomm.h : Interface for DBusCommunicator class
+
+ Copyright (c) 1996 - 2011, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+#ifndef __DBUSCOMM_H__
+#define __DBUSCOMM_H__
+
+# include <string>
+#include "CommonDefinitions.h"
+#include "hpmud.h"
+#include <pwd.h>
+
+#ifdef HAVE_DBUS
+ #include <dbus/dbus.h>
+ #define DBUS_INTERFACE "com.hplip.StatusService"
+ #define DBUS_PATH "/"
+#else
+#define DBUS_INTERFACE ""
+#define DBUS_PATH ""
+#endif
+
+
+using namespace std;
+
+/* //DBusBusType
+ DBUS_BUS_SESSION //The login session bus.
+ DBUS_BUS_SYSTEM //The systemwide bus.
+ DBUS_BUS_STARTER //The bus that started us, if any.
+*/
+
+class DBusCommunicator
+{
+ private:
+ string m_strPrinterURI;
+ string m_strPrinterName;
+#ifdef HAVE_DBUS
+ DBusConnection *m_DbusConnPtr;
+#endif
+ string m_strDbusInterface;
+ string m_strDbusPath;
+ string m_strUser;
+ int m_iJobId;
+
+
+ public:
+ DBusCommunicator();
+ bool initDBusComm(string strDbusPath="",string strInterfaceName="", string strPrinterURI="", string strPrinterName = "",int iJobId=0, string strUser="");
+ bool sendEvent(int iEvent, string strTitle="", int iJobId=0, string strUser="");
+ bool sendEvent(string strDbusPath,string strInterfaceName, string strPrinterURI, string strPrinterName, int event, string strTitle="",int iJobId=0, string strUser="");
+ ~DBusCommunicator();
+};
+
+
+#endif // __DBUSCOMM_H__
+
diff --git a/prnt/hpcups/dj3320ColorMaps.cpp b/prnt/hpcups/dj3320ColorMaps.cpp
new file mode 100644
index 0000000..a51782a
--- /dev/null
+++ b/prnt/hpcups/dj3320ColorMaps.cpp
@@ -0,0 +1,799 @@
+/*****************************************************************************\
+ dj3320ColorMaps.cpp : Implimentation for the DJ3320 color maps
+
+ Copyright (c) 1996 - 2009, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary formsUL, with or without
+ modificationUL, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ noticeUL, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ noticeUL, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ \***************************************************************************/
+
+#include "CommonDefinitions.h"
+
+// 300x300x1, K - Plain, Draft, Grey
+uint32_t ulMapDJ3320_K_3x3x1[] =
+{
+ 255UL, 255UL, 247UL, 224UL, 197UL, 177UL,
+ 167UL, 161UL, 157UL, 171UL, 165UL, 161UL,
+ 156UL, 152UL, 148UL, 146UL, 142UL, 139UL,
+ 147UL, 144UL, 141UL, 137UL, 134UL, 131UL,
+ 128UL, 125UL, 122UL, 130UL, 127UL, 124UL,
+ 120UL, 117UL, 113UL, 111UL, 107UL, 105UL,
+ 112UL, 110UL, 106UL, 104UL, 100UL, 98UL,
+ 95UL, 93UL, 90UL, 96UL, 94UL, 91UL,
+ 89UL, 86UL, 84UL, 81UL, 79UL, 76UL,
+ 83UL, 80UL, 77UL, 75UL, 72UL, 70UL,
+ 68UL, 66UL, 63UL, 69UL, 67UL, 64UL,
+ 62UL, 60UL, 58UL, 55UL, 53UL, 51UL,
+ 57UL, 55UL, 53UL, 50UL, 49UL, 46UL,
+ 45UL, 42UL, 40UL, 231UL, 203UL, 184UL,
+ 168UL, 164UL, 159UL, 155UL, 150UL, 147UL,
+ 157UL, 153UL, 149UL, 146UL, 143UL, 140UL,
+ 136UL, 134UL, 130UL, 139UL, 135UL, 133UL,
+ 129UL, 126UL, 123UL, 120UL, 116UL, 112UL,
+ 122UL, 118UL, 115UL, 112UL, 109UL, 105UL,
+ 103UL, 100UL, 97UL, 105UL, 101UL, 99UL,
+ 96UL, 93UL, 91UL, 88UL, 85UL, 83UL,
+ 90UL, 87UL, 85UL, 82UL, 80UL, 77UL,
+ 75UL, 72UL, 70UL, 76UL, 74UL, 71UL,
+ 69UL, 66UL, 64UL, 62UL, 59UL, 57UL,
+ 63UL, 61UL, 58UL, 57UL, 54UL, 52UL,
+ 50UL, 48UL, 46UL, 51UL, 49UL, 47UL,
+ 45UL, 43UL, 41UL, 39UL, 37UL, 35UL,
+ 169UL, 165UL, 160UL, 156UL, 151UL, 148UL,
+ 145UL, 142UL, 138UL, 147UL, 144UL, 141UL,
+ 137UL, 134UL, 131UL, 128UL, 125UL, 122UL,
+ 130UL, 127UL, 124UL, 120UL, 117UL, 113UL,
+ 111UL, 107UL, 105UL, 112UL, 110UL, 106UL,
+ 104UL, 100UL, 98UL, 95UL, 93UL, 90UL,
+ 96UL, 94UL, 91UL, 89UL, 86UL, 84UL,
+ 81UL, 79UL, 76UL, 83UL, 80UL, 77UL,
+ 75UL, 72UL, 70UL, 68UL, 66UL, 63UL,
+ 69UL, 67UL, 64UL, 62UL, 60UL, 58UL,
+ 55UL, 53UL, 51UL, 57UL, 55UL, 53UL,
+ 50UL, 49UL, 46UL, 45UL, 42UL, 40UL,
+ 46UL, 44UL, 42UL, 40UL, 38UL, 36UL,
+ 34UL, 32UL, 30UL, 156UL, 152UL, 149UL,
+ 146UL, 143UL, 139UL, 135UL, 133UL, 129UL,
+ 138UL, 135UL, 132UL, 129UL, 125UL, 123UL,
+ 119UL, 116UL, 112UL, 121UL, 118UL, 114UL,
+ 112UL, 108UL, 105UL, 102UL, 100UL, 96UL,
+ 104UL, 101UL, 99UL, 96UL, 93UL, 91UL,
+ 88UL, 85UL, 83UL, 90UL, 87UL, 85UL,
+ 82UL, 80UL, 77UL, 75UL, 72UL, 70UL,
+ 76UL, 73UL, 71UL, 68UL, 66UL, 64UL,
+ 62UL, 59UL, 57UL, 63UL, 60UL, 58UL,
+ 56UL, 54UL, 51UL, 50UL, 47UL, 46UL,
+ 51UL, 49UL, 47UL, 45UL, 43UL, 41UL,
+ 39UL, 37UL, 35UL, 40UL, 39UL, 36UL,
+ 35UL, 32UL, 31UL, 29UL, 27UL, 25UL,
+ 146UL, 143UL, 140UL, 136UL, 134UL, 130UL,
+ 127UL, 124UL, 121UL, 130UL, 126UL, 124UL,
+ 120UL, 117UL, 113UL, 111UL, 107UL, 105UL,
+ 112UL, 109UL, 106UL, 103UL, 100UL, 97UL,
+ 95UL, 92UL, 90UL, 96UL, 93UL, 91UL,
+ 88UL, 86UL, 83UL, 81UL, 78UL, 76UL,
+ 83UL, 80UL, 77UL, 75UL, 72UL, 70UL,
+ 68UL, 65UL, 63UL, 69UL, 67UL, 64UL,
+ 62UL, 60UL, 58UL, 55UL, 53UL, 51UL,
+ 57UL, 55UL, 52UL, 50UL, 48UL, 46UL,
+ 44UL, 42UL, 40UL, 45UL, 44UL, 41UL,
+ 40UL, 37UL, 36UL, 34UL, 32UL, 30UL,
+ 35UL, 33UL, 31UL, 29UL, 27UL, 25UL,
+ 23UL, 21UL, 19UL, 137UL, 134UL, 131UL,
+ 128UL, 125UL, 122UL, 118UL, 115UL, 112UL,
+ 121UL, 118UL, 114UL, 112UL, 108UL, 105UL,
+ 102UL, 99UL, 96UL, 104UL, 101UL, 98UL,
+ 96UL, 93UL, 91UL, 88UL, 85UL, 83UL,
+ 89UL, 87UL, 84UL, 82UL, 79UL, 77UL,
+ 74UL, 72UL, 69UL, 75UL, 73UL, 70UL,
+ 68UL, 66UL, 64UL, 61UL, 59UL, 57UL,
+ 62UL, 60UL, 58UL, 56UL, 54UL, 51UL,
+ 49UL, 47UL, 45UL, 51UL, 49UL, 47UL,
+ 45UL, 43UL, 41UL, 39UL, 37UL, 35UL,
+ 40UL, 38UL, 36UL, 34UL, 32UL, 30UL,
+ 29UL, 26UL, 25UL, 30UL, 27UL, 26UL,
+ 24UL, 22UL, 20UL, 18UL, 16UL, 14UL,
+ 129UL, 125UL, 123UL, 119UL, 116UL, 112UL,
+ 110UL, 106UL, 104UL, 112UL, 109UL, 105UL,
+ 103UL, 100UL, 97UL, 94UL, 92UL, 89UL,
+ 96UL, 93UL, 91UL, 88UL, 86UL, 83UL,
+ 81UL, 78UL, 75UL, 83UL, 80UL, 77UL,
+ 75UL, 72UL, 70UL, 68UL, 65UL, 63UL,
+ 69UL, 66UL, 64UL, 62UL, 60UL, 57UL,
+ 55UL, 53UL, 51UL, 57UL, 54UL, 52UL,
+ 50UL, 48UL, 46UL, 44UL, 42UL, 40UL,
+ 45UL, 44UL, 41UL, 40UL, 37UL, 36UL,
+ 34UL, 31UL, 30UL, 35UL, 33UL, 31UL,
+ 29UL, 27UL, 25UL, 23UL, 21UL, 19UL,
+ 24UL, 23UL, 20UL, 18UL, 16UL, 14UL,
+ 12UL, 10UL, 8UL, 120UL, 117UL, 113UL,
+ 111UL, 107UL, 105UL, 101UL, 99UL, 96UL,
+ 104UL, 100UL, 98UL, 95UL, 93UL, 90UL,
+ 88UL, 85UL, 83UL, 89UL, 87UL, 84UL,
+ 81UL, 79UL, 76UL, 74UL, 71UL, 69UL,
+ 75UL, 73UL, 70UL, 68UL, 66UL, 64UL,
+ 61UL, 59UL, 57UL, 62UL, 60UL, 58UL,
+ 56UL, 53UL, 51UL, 49UL, 47UL, 45UL,
+ 50UL, 49UL, 46UL, 45UL, 42UL, 41UL,
+ 39UL, 37UL, 35UL, 40UL, 38UL, 36UL,
+ 34UL, 32UL, 30UL, 28UL, 26UL, 24UL,
+ 30UL, 27UL, 26UL, 24UL, 22UL, 20UL,
+ 18UL, 16UL, 13UL, 19UL, 17UL, 15UL,
+ 13UL, 11UL, 8UL, 7UL, 4UL, 2UL,
+ 111UL, 108UL, 105UL, 102UL, 100UL, 96UL,
+ 93UL, 91UL, 88UL, 96UL, 93UL, 91UL,
+ 88UL, 85UL, 83UL, 80UL, 78UL, 75UL,
+ 82UL, 80UL, 77UL, 75UL, 72UL, 70UL,
+ 67UL, 65UL, 62UL, 68UL, 66UL, 64UL,
+ 62UL, 59UL, 57UL, 55UL, 53UL, 50UL,
+ 57UL, 54UL, 52UL, 50UL, 48UL, 46UL,
+ 44UL, 42UL, 40UL, 45UL, 43UL, 41UL,
+ 39UL, 37UL, 35UL, 34UL, 31UL, 30UL,
+ 35UL, 32UL, 31UL, 29UL, 27UL, 25UL,
+ 23UL, 21UL, 19UL, 24UL, 23UL, 20UL,
+ 18UL, 16UL, 14UL, 12UL, 10UL, 8UL,
+ 13UL, 11UL, 9UL, 7UL, 5UL, 3UL,
+ 1UL, 0UL, 0UL,
+};
+
+// 600x600x1, K - Plain, Normal, Grey
+
+uint32_t ulMapDJ3320_K_6x6x1[] =
+{
+ 255UL, 238UL, 218UL, 204UL, 189UL, 181UL,
+ 171UL, 161UL, 154UL, 178UL, 168UL, 161UL,
+ 153UL, 148UL, 141UL, 136UL, 130UL, 127UL,
+ 140UL, 133UL, 129UL, 124UL, 121UL, 116UL,
+ 113UL, 109UL, 106UL, 115UL, 112UL, 108UL,
+ 104UL, 101UL, 97UL, 95UL, 91UL, 89UL,
+ 96UL, 94UL, 90UL, 88UL, 85UL, 82UL,
+ 79UL, 77UL, 74UL, 81UL, 78UL, 76UL,
+ 73UL, 71UL, 69UL, 66UL, 65UL, 62UL,
+ 67UL, 66UL, 63UL, 62UL, 59UL, 57UL,
+ 55UL, 54UL, 51UL, 56UL, 55UL, 52UL,
+ 51UL, 49UL, 47UL, 45UL, 44UL, 42UL,
+ 47UL, 45UL, 43UL, 41UL, 40UL, 38UL,
+ 37UL, 35UL, 33UL, 209UL, 191UL, 184UL,
+ 173UL, 166UL, 156UL, 151UL, 144UL, 140UL,
+ 154UL, 149UL, 143UL, 138UL, 132UL, 128UL,
+ 123UL, 120UL, 115UL, 127UL, 122UL, 119UL,
+ 114UL, 111UL, 107UL, 104UL, 100UL, 96UL,
+ 106UL, 102UL, 99UL, 95UL, 93UL, 90UL,
+ 87UL, 84UL, 81UL, 89UL, 85UL, 83UL,
+ 80UL, 78UL, 75UL, 73UL, 70UL, 68UL,
+ 74UL, 71UL, 69UL, 67UL, 65UL, 63UL,
+ 61UL, 59UL, 57UL, 62UL, 60UL, 58UL,
+ 56UL, 54UL, 52UL, 50UL, 48UL, 47UL,
+ 51UL, 50UL, 48UL, 46UL, 44UL, 43UL,
+ 41UL, 39UL, 38UL, 42UL, 40UL, 38UL,
+ 37UL, 35UL, 34UL, 32UL, 31UL, 29UL,
+ 176UL, 168UL, 159UL, 153UL, 146UL, 141UL,
+ 135UL, 130UL, 125UL, 140UL, 133UL, 129UL,
+ 124UL, 121UL, 116UL, 113UL, 109UL, 106UL,
+ 115UL, 112UL, 108UL, 104UL, 101UL, 97UL,
+ 95UL, 91UL, 89UL, 96UL, 94UL, 90UL,
+ 88UL, 85UL, 82UL, 79UL, 77UL, 74UL,
+ 81UL, 78UL, 76UL, 73UL, 71UL, 69UL,
+ 66UL, 65UL, 62UL, 67UL, 66UL, 63UL,
+ 62UL, 59UL, 57UL, 55UL, 54UL, 51UL,
+ 56UL, 55UL, 52UL, 51UL, 49UL, 47UL,
+ 45UL, 44UL, 42UL, 47UL, 45UL, 43UL,
+ 41UL, 40UL, 38UL, 37UL, 35UL, 33UL,
+ 38UL, 36UL, 34UL, 32UL, 31UL, 29UL,
+ 28UL, 26UL, 25UL, 153UL, 148UL, 143UL,
+ 136UL, 132UL, 127UL, 122UL, 119UL, 114UL,
+ 125UL, 122UL, 118UL, 114UL, 110UL, 107UL,
+ 103UL, 100UL, 96UL, 105UL, 102UL, 98UL,
+ 95UL, 92UL, 90UL, 86UL, 84UL, 81UL,
+ 88UL, 85UL, 83UL, 80UL, 77UL, 75UL,
+ 72UL, 70UL, 67UL, 74UL, 71UL, 69UL,
+ 67UL, 65UL, 63UL, 61UL, 59UL, 57UL,
+ 62UL, 60UL, 58UL, 56UL, 54UL, 52UL,
+ 50UL, 48UL, 47UL, 51UL, 49UL, 48UL,
+ 46UL, 44UL, 42UL, 41UL, 39UL, 38UL,
+ 42UL, 40UL, 38UL, 37UL, 35UL, 33UL,
+ 32UL, 30UL, 29UL, 33UL, 31UL, 30UL,
+ 28UL, 27UL, 25UL, 24UL, 22UL, 21UL,
+ 138UL, 132UL, 128UL, 123UL, 120UL, 115UL,
+ 112UL, 108UL, 105UL, 115UL, 111UL, 108UL,
+ 104UL, 101UL, 97UL, 95UL, 91UL, 89UL,
+ 96UL, 93UL, 90UL, 87UL, 85UL, 81UL,
+ 79UL, 76UL, 74UL, 81UL, 78UL, 76UL,
+ 73UL, 71UL, 68UL, 66UL, 64UL, 62UL,
+ 67UL, 66UL, 63UL, 62UL, 59UL, 57UL,
+ 55UL, 53UL, 51UL, 56UL, 55UL, 52UL,
+ 51UL, 49UL, 47UL, 45UL, 44UL, 42UL,
+ 46UL, 45UL, 43UL, 41UL, 39UL, 38UL,
+ 36UL, 35UL, 33UL, 37UL, 36UL, 34UL,
+ 32UL, 31UL, 29UL, 28UL, 26UL, 25UL,
+ 28UL, 27UL, 26UL, 24UL, 22UL, 21UL,
+ 19UL, 18UL, 16UL, 124UL, 121UL, 116UL,
+ 113UL, 109UL, 106UL, 102UL, 99UL, 95UL,
+ 105UL, 102UL, 98UL, 95UL, 92UL, 90UL,
+ 86UL, 83UL, 81UL, 88UL, 85UL, 82UL,
+ 80UL, 77UL, 75UL, 72UL, 70UL, 67UL,
+ 73UL, 71UL, 69UL, 67UL, 65UL, 63UL,
+ 60UL, 59UL, 56UL, 62UL, 60UL, 57UL,
+ 56UL, 54UL, 52UL, 50UL, 48UL, 46UL,
+ 51UL, 49UL, 48UL, 46UL, 44UL, 42UL,
+ 40UL, 39UL, 37UL, 42UL, 40UL, 38UL,
+ 37UL, 35UL, 33UL, 32UL, 30UL, 29UL,
+ 33UL, 31UL, 30UL, 28UL, 27UL, 25UL,
+ 24UL, 22UL, 21UL, 25UL, 23UL, 22UL,
+ 20UL, 19UL, 17UL, 16UL, 14UL, 12UL,
+ 114UL, 110UL, 107UL, 103UL, 100UL, 96UL,
+ 94UL, 90UL, 88UL, 95UL, 93UL, 90UL,
+ 87UL, 84UL, 81UL, 78UL, 76UL, 73UL,
+ 81UL, 78UL, 76UL, 73UL, 71UL, 68UL,
+ 66UL, 64UL, 62UL, 67UL, 65UL, 63UL,
+ 61UL, 59UL, 57UL, 55UL, 53UL, 51UL,
+ 56UL, 54UL, 52UL, 50UL, 49UL, 47UL,
+ 45UL, 43UL, 42UL, 46UL, 44UL, 43UL,
+ 41UL, 39UL, 38UL, 36UL, 34UL, 33UL,
+ 37UL, 36UL, 34UL, 32UL, 31UL, 29UL,
+ 28UL, 26UL, 25UL, 28UL, 27UL, 25UL,
+ 24UL, 22UL, 21UL, 19UL, 18UL, 16UL,
+ 20UL, 19UL, 17UL, 16UL, 14UL, 13UL,
+ 11UL, 10UL, 8UL, 104UL, 101UL, 97UL,
+ 95UL, 91UL, 89UL, 85UL, 83UL, 80UL,
+ 88UL, 85UL, 82UL, 79UL, 77UL, 74UL,
+ 72UL, 69UL, 67UL, 73UL, 71UL, 69UL,
+ 66UL, 65UL, 62UL, 60UL, 58UL, 56UL,
+ 62UL, 60UL, 57UL, 56UL, 54UL, 52UL,
+ 50UL, 48UL, 46UL, 51UL, 49UL, 47UL,
+ 46UL, 44UL, 42UL, 40UL, 39UL, 37UL,
+ 41UL, 40UL, 38UL, 37UL, 35UL, 33UL,
+ 31UL, 30UL, 28UL, 32UL, 31UL, 29UL,
+ 28UL, 26UL, 25UL, 23UL, 22UL, 20UL,
+ 25UL, 23UL, 22UL, 20UL, 19UL, 17UL,
+ 16UL, 14UL, 12UL, 16UL, 15UL, 13UL,
+ 12UL, 10UL, 9UL, 7UL, 6UL, 4UL,
+ 95UL, 92UL, 90UL, 86UL, 84UL, 81UL,
+ 78UL, 76UL, 73UL, 80UL, 78UL, 75UL,
+ 73UL, 70UL, 68UL, 66UL, 64UL, 62UL,
+ 67UL, 65UL, 63UL, 61UL, 59UL, 57UL,
+ 55UL, 53UL, 51UL, 56UL, 54UL, 52UL,
+ 50UL, 48UL, 47UL, 45UL, 43UL, 41UL,
+ 46UL, 44UL, 43UL, 41UL, 39UL, 38UL,
+ 36UL, 34UL, 33UL, 37UL, 35UL, 34UL,
+ 32UL, 31UL, 29UL, 28UL, 26UL, 25UL,
+ 28UL, 27UL, 25UL, 24UL, 22UL, 21UL,
+ 19UL, 18UL, 16UL, 20UL, 19UL, 17UL,
+ 16UL, 14UL, 12UL, 11UL, 9UL, 8UL,
+ 12UL, 11UL, 9UL, 8UL, 6UL, 5UL,
+ 3UL, 2UL, 0UL,
+};
+
+// 300x300x1, CMY - Plain Draft, Color Pen Only
+
+uint32_t ulMapDJ3320_CMY_3x3x1[ 9 * 9 * 9 ] =
+{
+4294967040UL, 4294967040UL, 2499804928UL, 1073741568UL, 619577088UL, 383844096UL,
+ 198573824UL, 63766272UL, 12975872UL, 4292869888UL, 4293394176UL, 2381905664UL,
+ 838074112UL, 535494400UL, 350093056UL, 164888320UL, 30080768UL, 12779264UL,
+4285398784UL, 4285660928UL, 2961506048UL, 966983424UL, 246087424UL, 79036160UL,
+ 62717696UL, 29032192UL, 11730688UL, 4282184960UL, 4282318592UL, 4282842880UL,
+1833565952UL, 744423168UL, 259391232UL, 126025472UL, 59244288UL, 9043712UL,
+4280872960UL, 4280811264UL, 4280614656UL, 3626434304UL, 1311768320UL, 523894528UL,
+ 240123648UL, 106888960UL, 6618880UL, 4280217600UL, 4280089344UL, 4279566080UL,
+4279566080UL, 2300313344UL, 958725888UL, 388497152UL, 121044736UL, 4652800UL,
+4279495424UL, 4279366912UL, 4278976256UL, 4278517504UL, 3071082240UL, 1494482688UL,
+ 555155200UL, 203030272UL, 2883328UL, 4278838528UL, 4278710016UL, 4278517504UL,
+4278714112UL, 3439787776UL, 2047147776UL, 1040973568UL, 235667200UL, 982784UL,
+4278250752UL, 4278250752UL, 4278250752UL, 4278249728UL, 3439389952UL, 2298540800UL,
+1359018752UL, 604045056UL, 65280UL, 4294960384UL, 1325354752UL, 704642816UL,
+ 134217472UL, 134217472UL, 117440256UL, 83033856UL, 48234240UL, 13303552UL,
+4293254400UL, 4294967040UL, 2515271424UL, 517013248UL, 63110912UL, 12254976UL,
+ 11730688UL, 11206400UL, 11075328UL, 4285195008UL, 4286447360UL, 2727345920UL,
+ 881655552UL, 210894592UL, 9961216UL, 10157824UL, 10157824UL, 10551040UL,
+4282050560UL, 4281597696UL, 4013752064UL, 1631911680UL, 458358528UL, 73531136UL,
+ 7339776UL, 7995136UL, 8781568UL, 4280740352UL, 4280220928UL, 4280221440UL,
+2770599680UL, 1059520256UL, 322043648UL, 54722304UL, 5373696UL, 6225664UL,
+4280019456UL, 4279169024UL, 4279365632UL, 3574595328UL, 1813118720UL, 739573504UL,
+ 203161344UL, 19726080UL, 4194048UL, 4279231488UL, 4278510336UL, 4278640384UL,
+3892834304UL, 2399600384UL, 1242169088UL, 521076480UL, 101646080UL, 2096896UL,
+4278640640UL, 4278241792UL, 4278242304UL, 4076918016UL, 2801853184UL, 1711336192UL,
+ 855895296UL, 235008512UL, 524032UL, 4278246656UL, 4278240512UL, 4278241280UL,
+4278241280UL, 3070281728UL, 2046873600UL, 1191237632UL, 520148992UL, 55040UL,
+4294930944UL, 4127145472UL, 872370432UL, 385862656UL, 218103552UL, 134217472UL,
+ 83230464UL, 65339136UL, 13631232UL, 4294603520UL, 4294941696UL, 2281675776UL,
+ 385861376UL, 15790592UL, 14417664UL, 13172480UL, 12254976UL, 11927296UL,
+4285692160UL, 4286680320UL, 2307498496UL, 1418377216UL, 193460224UL, 9043712UL,
+ 9109248UL, 9240320UL, 9109248UL, 4282296832UL, 4282370048UL, 3628255744UL,
+1633073664UL, 509011968UL, 23065856UL, 7140608UL, 7732992UL, 8388352UL,
+4280599552UL, 4280405760UL, 4280079616UL, 2368003328UL, 824438784UL, 238155776UL,
+ 4516608UL, 5437184UL, 6487808UL, 4279749888UL, 4279225344UL, 4279026176UL,
+2937046272UL, 1494344192UL, 605287680UL, 119337472UL, 3140864UL, 4321792UL,
+4279029504UL, 4278437632UL, 4278236928UL, 3255022592UL, 2030290944UL, 1057281792UL,
+ 335798272UL, 51177984UL, 2417152UL, 4278505216UL, 4278236416UL, 4278232832UL,
+3607144960UL, 2432742400UL, 1543553536UL, 788644864UL, 201377536UL, 514816UL,
+4278239232UL, 4278235648UL, 4278233088UL, 3925911552UL, 2751506944UL, 1895870208UL,
+1174450688UL, 503362048UL, 43520UL, 4294915840UL, 4294910720UL, 1778329344UL,
+ 520043520UL, 385846272UL, 218087424UL, 133881856UL, 65599488UL, 13892352UL,
+4294653440UL, 4294915584UL, 2147432960UL, 469717248UL, 16744960UL, 15707136UL,
+ 14338560UL, 13098240UL, 12580608UL, 4288300800UL, 4288694784UL, 2946258432UL,
+1453483776UL, 162692352UL, 11836672UL, 11187200UL, 10536704UL, 10280192UL,
+4282798336UL, 4283326208UL, 3075891456UL, 1499032064UL, 912028928UL, 56599040UL,
+ 6795776UL, 7193600UL, 7330560UL, 4280711680UL, 4280713472UL, 4280714240UL,
+2301330432UL, 976647936UL, 204971008UL, 4827136UL, 5750016UL, 6477568UL,
+4279539968UL, 4279342080UL, 4279340032UL, 2987364864UL, 1461097472UL, 504799744UL,
+ 52540672UL, 3652864UL, 4706048UL, 4278823424UL, 4278492160UL, 4278422784UL,
+3171191040UL, 1896320768UL, 1057595136UL, 319202560UL, 18067456UL, 2864384UL,
+4278496768UL, 4278228224UL, 4278226176UL, 3422587136UL, 2264960000UL, 1459655680UL,
+ 771987968UL, 184654848UL, 829184UL, 4278230784UL, 4278228224UL, 4278226688UL,
+3623913984UL, 2566949888UL, 1895860736UL, 1241549824UL, 520131072UL, 35840UL,
+4294908928UL, 4294905344UL, 3170831872UL, 352260352UL, 520042240UL, 301950464UL,
+ 167610624UL, 82813952UL, 14726144UL, 4294447872UL, 4294577920UL, 3120503040UL,
+ 654253056UL, 33502720UL, 16277760UL, 14909696UL, 14129664UL, 14004736UL,
+4288945920UL, 4289142528UL, 3031048448UL, 1237462016UL, 164051200UL, 12409344UL,
+ 11892480UL, 11899392UL, 11578368UL, 4283706368UL, 4284100864UL, 3579981568UL,
+1734491648UL, 879510528UL, 75322880UL, 8678656UL, 8684800UL, 8495616UL,
+4281022976UL, 4281220864UL, 4281286144UL, 1949778176UL, 976897792UL, 524243456UL,
+ 21655296UL, 5406464UL, 5872640UL, 4279655168UL, 4279654144UL, 4279718912UL,
+3038205696UL, 1494964736UL, 606163456UL, 69824768UL, 4097024UL, 4889600UL,
+4279007488UL, 4278676480UL, 4278673664UL, 3171507968UL, 1896441344UL, 974022400UL,
+ 286026752UL, 1672960UL, 3249408UL, 4278616576UL, 4278219776UL, 4278283264UL,
+3489753344UL, 2181261056UL, 1375955200UL, 822504448UL, 151090432UL, 1146624UL,
+4278221824UL, 4278219776UL, 4278219264UL, 3758125568UL, 2483056384UL, 1828743680UL,
+1275094784UL, 587230976UL, 28928UL, 4294906112UL, 4294903552UL, 4127133440UL,
+1509888768UL, 486480896UL, 335489792UL, 201280000UL, 116613632UL, 14841088UL,
+4294577664UL, 4294772992UL, 3690923776UL, 1375668992UL, 67047680UL, 16722688UL,
+ 15354368UL, 14311680UL, 13988352UL, 4289989632UL, 4289005056UL, 3131836160UL,
+1724387584UL, 299045632UL, 13249280UL, 12339456UL, 12214016UL, 12415488UL,
+4284683264UL, 4284617728UL, 3664385024UL, 1835996672UL, 780213760UL, 59320064UL,
+ 9192960UL, 9526272UL, 9729792UL, 4281737472UL, 4281999616UL, 4281999104UL,
+2185502976UL, 1095181312UL, 558509056UL, 56245760UL, 6706944UL, 7107072UL,
+4280036352UL, 4279971584UL, 4279970048UL, 2820548352UL, 1327704320UL, 606350336UL,
+ 321664768UL, 20731648UL, 4813312UL, 4279322368UL, 4278993920UL, 4279123456UL,
+3289332736UL, 1947155968UL, 907424768UL, 336869120UL, 18831104UL, 3566592UL,
+4278670336UL, 4278275584UL, 4278274560UL, 3439544576UL, 2181449984UL, 1275480320UL,
+ 789006592UL, 117657344UL, 1465856UL, 4278212864UL, 4278212352UL, 4278211584UL,
+3623900672UL, 2533381632UL, 1577078528UL, 1174423808UL, 654331648UL, 21504UL,
+4294904064UL, 4294902528UL, 4294904576UL, 2331970560UL, 973017856UL, 352261120UL,
+ 218045440UL, 133707264UL, 15026432UL, 4294444800UL, 4294639872UL, 4026466304UL,
+2113864448UL, 654248192UL, 16715520UL, 15671552UL, 14497536UL, 14108416UL,
+4290774528UL, 4290380800UL, 3753640192UL, 2110390528UL, 702152960UL, 14093312UL,
+ 12853504UL, 12531456UL, 12732672UL, 4286319616UL, 4284743680UL, 3547136000UL,
+2105345792UL, 1066142720UL, 160499456UL, 9707008UL, 9909760UL, 10438400UL,
+4282848000UL, 4282519040UL, 3796241408UL, 2185890816UL, 1145966080UL, 525997056UL,
+ 56761088UL, 7156736UL, 7949312UL, 4280358656UL, 4280227328UL, 4280685568UL,
+2401965568UL, 1378751488UL, 691082240UL, 338959104UL, 21376768UL, 5523968UL,
+4279442176UL, 4279115264UL, 4279180288UL, 3071351552UL, 1863523072UL, 907417344UL,
+ 370546944UL, 203499264UL, 3229440UL, 4278989056UL, 4278595072UL, 4278594560UL,
+3355913216UL, 2231971328UL, 1309224448UL, 688661504UL, 151462912UL, 1786880UL,
+4278204160UL, 4278203904UL, 4278203904UL, 3439343104UL, 2432710400UL, 1493186048UL,
+ 922758912UL, 637546240UL, 13824UL, 4294902784UL, 4294902784UL, 4294903296UL,
+2818508288UL, 1476331776UL, 754912768UL, 218040576UL, 117116416UL, 15409920UL,
+4294246656UL, 4293722112UL, 4159897600UL, 2515861504UL, 1291452416UL, 301465856UL,
+ 15665920UL, 14816256UL, 14360832UL, 4291101696UL, 4290576384UL, 3988717568UL,
+2462384128UL, 1422917632UL, 399704064UL, 13437184UL, 12850176UL, 12919040UL,
+4286907904UL, 4286709760UL, 4085711104UL, 2408186112UL, 1502740736UL, 731513600UL,
+ 27001856UL, 10097408UL, 10625280UL, 4283500800UL, 4282777600UL, 3578396672UL,
+2303983616UL, 1280770048UL, 912656128UL, 241829376UL, 7409920UL, 8332288UL,
+4281010432UL, 4281273088UL, 3710649344UL, 2452685824UL, 1446249216UL, 691601664UL,
+ 457575168UL, 21761536UL, 6039040UL, 4279634944UL, 4279438336UL, 3608546304UL,
+2484866048UL, 1495141376UL, 1042483456UL, 388039680UL, 153356544UL, 3809536UL,
+4278782976UL, 4278456064UL, 4278587136UL, 3204845056UL, 1997082112UL, 1242107392UL,
+ 688655360UL, 151587584UL, 1646848UL, 4278196480UL, 4278196224UL, 4143978240UL,
+3355449600UL, 2365593856UL, 1509956352UL, 872421632UL, 469767680UL, 7936UL,
+4294901760UL, 4294901760UL, 4294639616UL, 3321495552UL, 2230779904UL, 1240793088UL,
+ 653590528UL, 267583488UL, 15925248UL, 4293918720UL, 4293591040UL, 4209442816UL,
+2833448960UL, 1843724288UL, 920977408UL, 400687104UL, 81723392UL, 14483456UL,
+4290707456UL, 4290707456UL, 4039114752UL, 2764308480UL, 1925513216UL, 1204224000UL,
+ 432275456UL, 29622272UL, 12713984UL, 4287168512UL, 4287168512UL, 4287758336UL,
+2627010560UL, 1922498560UL, 1385824256UL, 664731648UL, 77725696UL, 10616832UL,
+4284219392UL, 4284088320UL, 4200660992UL, 2993291264UL, 1684865024UL, 1366228992UL,
+ 863305728UL, 209453056UL, 8192000UL, 4281794560UL, 4281729024UL, 3980328960UL,
+2571370496UL, 1715732480UL, 977338368UL, 827195392UL, 374931456UL, 6160384UL,
+4280025088UL, 4279631872UL, 4146003968UL, 2535718912UL, 1630076928UL, 1042874368UL,
+ 606666752UL, 422838272UL, 3932160UL, 4278845440UL, 4278255616UL, 4278452224UL,
+3490250752UL, 1627980032UL, 1040974592UL, 470548480UL, 320077824UL, 2293760UL,
+4278190080UL, 4278190080UL, 3892314112UL, 3036676096UL, 2181038080UL, 1442840576UL,
+ 771751936UL, 335544320UL, 0UL,
+};
+
+// 300x300x1, KCMY - Plain Draft, Both Pens
+
+uint32_t ulMapDJ3320_KCMY_3x3x1[ 9 * 9 * 9 ] =
+{
+1330601906UL, 13500224UL, 12582697UL, 12386074UL, 12254995UL, 12254990UL,
+ 12254986UL, 12386053UL, 12451584UL, 4280614716UL, 184614723UL, 10288939UL,
+ 12255003UL, 12386067UL, 12254990UL, 12254986UL, 12386053UL, 12123904UL,
+4281269534UL, 4279566124UL, 184614710UL, 6618912UL, 9568021UL, 10682126UL,
+ 11206410UL, 11403012UL, 11206400UL, 4281138958UL, 4280090387UL, 3842047776UL,
+ 251723559UL, 3473177UL, 6618893UL, 8060677UL, 9043714UL, 8912640UL,
+4280941063UL, 4280549129UL, 4278648595UL, 2768305944UL, 335609628UL, 1638165UL,
+ 4325131UL, 157482753UL, 6749952UL, 4280741633UL, 4280613378UL, 4279369479UL,
+4278255375UL, 2080440081UL, 335609621UL, 655120UL, 53214983UL, 4849408UL,
+4280084224UL, 4280021504UL, 4279697152UL, 4278451974UL, 3523346184UL, 1510211337UL,
+ 318897931UL, 67895045UL, 2752256UL, 4279165696UL, 4279168256UL, 4278714112UL,
+4278714112UL, 4228316928UL, 2450128641UL, 1141636866UL, 319553280UL, 982784UL,
+4278250752UL, 4278251264UL, 4278252032UL, 4278253568UL, 3741384448UL, 2566979328UL,
+1577123584UL, 721485568UL, 65280UL, 4294903620UL, 16717634UL, 16776996UL,
+ 67108627UL, 33554187UL, 15990535UL, 15073028UL, 14352129UL, 13172480UL,
+4284972085UL, 2240126303UL, 1071513390UL, 46989077UL, 13172493UL, 29687559UL,
+ 12910338UL, 12648192UL, 11599616UL, 4282571287UL, 4281270055UL, 2508062496UL,
+ 327024407UL, 127598349UL, 162397954UL, 28180224UL, 11206400UL, 10878720UL,
+4281593867UL, 4280549135UL, 3928096534UL, 890961689UL, 256311056UL, 242089732UL,
+ 75104000UL, 8191744UL, 8716032UL, 4281135110UL, 4280549124UL, 4280549129UL,
+2819948301UL, 789905168UL, 254410507UL, 256835328UL, 22347520UL, 6291200UL,
+4280739584UL, 4279890688UL, 4280090368UL, 4145544963UL, 2031222537UL, 722730761UL,
+ 371326723UL, 103808768UL, 4194048UL, 4280017664UL, 4278970880UL, 4279167488UL,
+4279172864UL, 2903506688UL, 1578434304UL, 655687424UL, 152043264UL, 2031360UL,
+4279164672UL, 4278311424UL, 4278311168UL, 4278444544UL, 3171155712UL, 1963261696UL,
+ 990183168UL, 319028992UL, 458496UL, 4278247424UL, 4278242304UL, 4278243328UL,
+4278243840UL, 3305168640UL, 2231432448UL, 1359019776UL, 604045056UL, 65280UL,
+4294904113UL, 3187605553UL, 16718636UL, 16764692UL, 16776969UL, 16776960UL,
+ 33554178UL, 116784896UL, 13631232UL, 4292296993UL, 4294655551UL, 1375700775UL,
+ 67104783UL, 16776960UL, 16776960UL, 15990528UL, 14221056UL, 12451584UL,
+4285889803UL, 4287600921UL, 3402297099UL, 1689646345UL, 380632832UL, 27655936UL,
+ 10682112UL, 10551040UL, 10157824UL, 4283021060UL, 4282567943UL, 4283627275UL,
+2037181193UL, 728563458UL, 208797440UL, 7667456UL, 8388352UL, 9043712UL,
+4281650946UL, 4281261313UL, 4280743684UL, 2855271171UL, 1110441734UL, 473956096UL,
+ 105512704UL, 5701376UL, 6487808UL, 4280800512UL, 4280014848UL, 4279557888UL,
+3441025792UL, 1897725696UL, 824114944UL, 254017280UL, 53608192UL, 4325120UL,
+4279882496UL, 4278964736UL, 4278439680UL, 3657942784UL, 2265571840UL, 1275919616UL,
+ 520945408UL, 101842688UL, 2359040UL, 4278964736UL, 4278305792UL, 4278236928UL,
+3842224640UL, 2617361664UL, 1711529984UL, 923070464UL, 251918848UL, 524032UL,
+4278241792UL, 4278237184UL, 4278234880UL, 4076908288UL, 2936059648UL, 2046870528UL,
+1275123456UL, 520152832UL, 57088UL, 4294904859UL, 4294902044UL, 872349728UL,
+ 16719385UL, 16751625UL, 16773888UL, 100663043UL, 167771904UL, 15204096UL,
+4294910995UL, 4294903326UL, 1660888088UL, 117397264UL, 33535744UL, 16771072UL,
+ 16776960UL, 16252672UL, 13696768UL, 4289353221UL, 4290531848UL, 4040718602UL,
+1843235338UL, 468165888UL, 14404608UL, 13625856UL, 12647680UL, 11861760UL,
+4284245504UL, 4284905729UL, 4068445956UL, 2038009602UL, 1232575488UL, 74244096UL,
+ 7335680UL, 7731968UL, 8191744UL, 4281829888UL, 4281635328UL, 4281768960UL,
+2805637120UL, 1330222080UL, 390512384UL, 21810176UL, 6087936UL, 6814464UL,
+4280591616UL, 4280067072UL, 4279999744UL, 3491211008UL, 1763683584UL, 723501568UL,
+ 153539328UL, 3660544UL, 4646144UL, 4279742976UL, 4279150336UL, 4278819328UL,
+3490419712UL, 2097979392UL, 1175368960UL, 470795264UL, 102223104UL, 2936832UL,
+4278826752UL, 4278428160UL, 4278293760UL, 3573779456UL, 2349043968UL, 1543741184UL,
+ 872854528UL, 201570048UL, 968448UL, 4278234368UL, 4278230272UL, 4278227968UL,
+3741355264UL, 2634060032UL, 1996526080UL, 1308663040UL, 553692928UL, 43520UL,
+4294906637UL, 4294902546UL, 2902392851UL, 16713236UL, 16720653UL, 16743425UL,
+ 167751682UL, 167756800UL, 16238336UL, 4294909450UL, 4294904077UL, 3405713677UL,
+ 352263180UL, 117394432UL, 16745472UL, 16754688UL, 16761344UL, 15188480UL,
+4291245826UL, 4292293378UL, 4092082434UL, 1593654278UL, 486495232UL, 15889408UL,
+ 14718208UL, 14201856UL, 13421056UL, 4284955648UL, 4285940736UL, 4286662144UL,
+2508150272UL, 1317690880UL, 160591104UL, 10062336UL, 10267904UL, 9821440UL,
+4282009088UL, 4281879552UL, 4282470145UL, 2454344704UL, 1246386688UL, 726557696UL,
+ 21988608UL, 22518272UL, 6209536UL, 4280509952UL, 4280181248UL, 4280180992UL,
+3609290496UL, 1763929088UL, 791568640UL, 120356608UL, 3970048UL, 4896512UL,
+4279532544UL, 4279203072UL, 4279004160UL, 3608111616UL, 2131652352UL, 1091662848UL,
+ 370244864UL, 18585856UL, 3253248UL, 4278684928UL, 4278484224UL, 4278416384UL,
+3674631424UL, 2298767872UL, 1443131648UL, 872840448UL, 151224576UL, 1281280UL,
+4278225920UL, 4278223360UL, 4278221312UL, 3892343808UL, 2533388544UL, 1862298880UL,
+1325428992UL, 637567488UL, 33280UL, 4294906885UL, 4294902539UL, 4261347341UL,
+ 989790221UL, 16717321UL, 16720901UL, 167730946UL, 201292800UL, 16746240UL,
+4294908930UL, 4294906115UL, 4294904838UL, 1526664966UL, 201271040UL, 16725504UL,
+ 16736768UL, 16742912UL, 16416512UL, 4291239424UL, 4292679424UL, 4075297024UL,
+2281186048UL, 536815360UL, 33502976UL, 15751680UL, 15168512UL, 14385664UL,
+4285539072UL, 4286391296UL, 4287047168UL, 2375100672UL, 1067462400UL, 212153856UL,
+ 10637824UL, 10973696UL, 11505408UL, 4282264320UL, 4282263808UL, 4282656512UL,
+2723229184UL, 1414804480UL, 777665536UL, 107104768UL, 7432704UL, 7640320UL,
+4280561408UL, 4280235008UL, 4280364800UL, 3257348352UL, 1546532352UL, 791624192UL,
+ 372457728UL, 20866816UL, 4623616UL, 4279454208UL, 4279191296UL, 4279321600UL,
+3658760704UL, 2215855104UL, 1008154880UL, 387399168UL, 18964224UL, 3373312UL,
+4278672896UL, 4278473728UL, 4278604032UL, 3741797888UL, 2349288448UL, 1309231616UL,
+ 856248064UL, 117854464UL, 1532928UL, 4278215168UL, 4278214400UL, 4278212864UL,
+3942668032UL, 2634045184UL, 1627410944UL, 1224756224UL, 687888128UL, 23552UL,
+4294907392UL, 4294903556UL, 4294901766UL, 2516516870UL, 335479049UL, 67048964UL,
+ 117383426UL, 167723520UL, 16734464UL, 4294906624UL, 4294904576UL, 4294904832UL,
+2650737664UL, 603918080UL, 16718080UL, 16722176UL, 16730368UL, 16732672UL,
+4291760384UL, 4292677120UL, 4125756160UL, 2599751168UL, 939463424UL, 33494784UL,
+ 16722688UL, 15942144UL, 15225088UL, 4286386944UL, 4286516736UL, 4286909952UL,
+2442597120UL, 1286018816UL, 330307072UL, 11806208UL, 11812608UL, 12408320UL,
+4282849024UL, 4282848768UL, 4283307520UL, 2690062080UL, 1415452928UL, 661200640UL,
+ 107946752UL, 8141312UL, 8869632UL, 4280687616UL, 4280490752UL, 4281014784UL,
+2754682368UL, 1580473088UL, 825629440UL, 423239424UL, 21771776UL, 5724416UL,
+4279508224UL, 4279312640UL, 4279443712UL, 3356892928UL, 1997938432UL, 974593024UL,
+ 370547712UL, 237252864UL, 2906624UL, 4278793728UL, 4278464768UL, 4278595328UL,
+3741921024UL, 2399875328UL, 1376465664UL, 722217216UL, 151725568UL, 1787392UL,
+4278205440UL, 4278204928UL, 4278204672UL, 3976214784UL, 2634037760UL, 1577072896UL,
+ 973091072UL, 654324480UL, 14592UL, 4294904576UL, 4294904064UL, 4294901764UL,
+3640591362UL, 1610550017UL, 520031744UL, 134156032UL, 117379328UL, 16721664UL,
+4294903552UL, 4294902016UL, 4294901760UL, 3053387776UL, 1258225920UL, 117375744UL,
+ 16716544UL, 16718592UL, 16721408UL, 4292281856UL, 4292871168UL, 4159112192UL,
+2867659776UL, 1509884928UL, 385811968UL, 16716032UL, 16718592UL, 16065536UL,
+4287170048UL, 4287366656UL, 4287890944UL, 2493318912UL, 1588004608UL, 834079744UL,
+ 62916352UL, 12719872UL, 13116416UL, 4283369728UL, 4283303424UL, 4283565568UL,
+2623144960UL, 1331627776UL, 963776000UL, 326700032UL, 8655616UL, 9708544UL,
+4281208064UL, 4281207808UL, 4281601536UL, 2822311424UL, 1597770752UL, 876547072UL,
+ 507973888UL, 22286080UL, 6563584UL, 4279504384UL, 4279505152UL, 4028174080UL,
+2719747840UL, 1629425408UL, 1042484992UL, 522652672UL, 237702912UL, 4137984UL,
+4278783744UL, 4278588160UL, 4278652416UL, 3439791872UL, 2131300096UL, 1275793664UL,
+ 688656128UL, 185273856UL, 1453568UL, 4278197248UL, 4278196992UL, 4278196480UL,
+4026538240UL, 2684361472UL, 1627397120UL, 973085440UL, 503322368UL, 7936UL,
+4294901760UL, 4294901760UL, 4294901760UL, 4211015680UL, 2768175104UL, 1375666176UL,
+ 620691456UL, 201261056UL, 16711680UL, 4294901760UL, 4294901760UL, 4294901760UL,
+3305046016UL, 1996423168UL, 872349696UL, 268369920UL, 16711680UL, 16711680UL,
+4292476928UL, 4292476928UL, 3857121280UL, 2917597184UL, 2012151808UL, 1207435264UL,
+ 351993856UL, 16580608UL, 16580608UL, 4287758336UL, 4287692800UL, 4288479232UL,
+2460745728UL, 1840185344UL, 1387593728UL, 667025408UL, 63569920UL, 13565952UL,
+4284219392UL, 4284088320UL, 4284743680UL, 3077636096UL, 1551171584UL, 1316552704UL,
+ 880934912UL, 244121600UL, 9764864UL, 4281597952UL, 4281532416UL, 4282253312UL,
+2688679936UL, 1682178048UL, 877002752UL, 793837568UL, 391708672UL, 6684672UL,
+4279828480UL, 4279435264UL, 4280156160UL, 2636055552UL, 1646658560UL, 1042678016UL,
+ 472580096UL, 456720384UL, 4325376UL, 4278779904UL, 4278321152UL, 4278452224UL,
+3674800128UL, 1628112384UL, 1175389696UL, 638780416UL, 286720000UL, 2359296UL,
+4278190080UL, 4278190080UL, 4278190080UL, 3288334336UL, 2298478592UL, 1509949440UL,
+ 822083584UL, 369098752UL, 0UL,
+};
+
+// 600x600x1, CMY - Plain Normal, Color Pen Only
+
+uint32_t ulMapDJ3320_CMY_6x6x1[ 9 * 9 * 9 ] =
+{
+4294967040UL, 2969566976UL, 1492844288UL, 886243072UL, 583073536UL, 347143936UL,
+ 178716416UL, 44367616UL, 11075328UL, 4292280064UL, 3166895872UL, 1455881984UL,
+ 785055488UL, 482148096UL, 280035072UL, 111607552UL, 11075328UL, 10551040UL,
+4285464320UL, 4285857536UL, 1717501696UL, 812973824UL, 344391424UL, 110034688UL,
+ 43974400UL, 9895680UL, 9895680UL, 4282449664UL, 4282449664UL, 3896704768UL,
+1279065856UL, 541261568UL, 207814400UL, 107544320UL, 6881024UL, 7143168UL,
+4281006592UL, 4280745728UL, 4280745728UL, 2687041280UL, 1110638336UL, 439418624UL,
+ 171769600UL, 72023808UL, 5570304UL, 4279691776UL, 4279566080UL, 4279172864UL,
+3759210240UL, 1780023040UL, 673251072UL, 270466816UL, 103481088UL, 3997440UL,
+4278902272UL, 4278775296UL, 4278517504UL, 3859218176UL, 2148073216UL, 1074593536UL,
+ 370343680UL, 169148160UL, 2424576UL, 4278507520UL, 4278378496UL, 4278382080UL,
+3926058496UL, 2550329344UL, 1476722432UL, 671416064UL, 168492800UL, 1113856UL,
+4278247424UL, 4278246912UL, 4278246400UL, 4026587136UL, 2885737472UL, 1811998208UL,
+1107359744UL, 503381760UL, 65280UL, 4294959616UL, 2634007552UL, 1325399808UL,
+ 620756736UL, 218103552UL, 82378496UL, 14352128UL, 13434624UL, 12779264UL,
+4291092480UL, 4294967040UL, 2499477248UL, 988872448UL, 316079872UL, 80019200UL,
+ 12386048UL, 11599616UL, 10682112UL, 4285464320UL, 4286119680UL, 2929524480UL,
+1318518528UL, 546504448UL, 177274624UL, 9240320UL, 9240320UL, 9502464UL,
+4282447360UL, 4282056448UL, 4064870144UL, 1716846336UL, 777715456UL, 274661120UL,
+ 39911168UL, 6618880UL, 7012096UL, 4280872448UL, 4280352512UL, 4280483584UL,
+2351628032UL, 1144192768UL, 439549696UL, 138215168UL, 4652800UL, 5177088UL,
+4279689216UL, 4279037440UL, 4279169024UL, 3121807104UL, 1578434304UL, 706543360UL,
+ 270597888UL, 36241152UL, 3473152UL, 4278768640UL, 4278376448UL, 4278507008UL,
+3255229440UL, 1946610176UL, 1007351808UL, 437189632UL, 135331584UL, 2031360UL,
+4278373888UL, 4278237696UL, 4278237696UL, 3321937920UL, 2147534848UL, 1342230528UL,
+ 637720576UL, 201646080UL, 720640UL, 4278242816UL, 4278237184UL, 4278237696UL,
+3623926272UL, 2550184960UL, 1644216832UL, 973131264UL, 402707968UL, 56832UL,
+4294931968UL, 3573511168UL, 1224696832UL, 452972544UL, 83885824UL, 83885824UL,
+ 48955136UL, 13696768UL, 12779264UL, 4294934016UL, 4294944768UL, 2499783168UL,
+ 922736128UL, 184549120UL, 14483200UL, 13041408UL, 12123904UL, 11075328UL,
+4284773376UL, 4287800320UL, 2963450880UL, 1788658176UL, 546629120UL, 109641472UL,
+ 8716032UL, 8716032UL, 8584960UL, 4282427904UL, 4282564096UL, 4132490240UL,
+1952757760UL, 777964032UL, 274652160UL, 39905792UL, 6881024UL, 7274240UL,
+4280729600UL, 4280470016UL, 4280473600UL, 2385168384UL, 1077071872UL, 406246400UL,
+ 104649728UL, 4644352UL, 5307392UL, 4279549952UL, 4279158272UL, 4279156736UL,
+2786245120UL, 1444464128UL, 639420928UL, 237161984UL, 36361216UL, 3595264UL,
+4278763008UL, 4278500352UL, 4278366208UL, 2919671808UL, 1778955264UL, 906674176UL,
+ 403489280UL, 135581184UL, 2149888UL, 4278369280UL, 4278233088UL, 4227898880UL,
+3019939328UL, 1979753472UL, 1275244032UL, 637711360UL, 201635840UL, 838144UL,
+4278237184UL, 4278232576UL, 4093680640UL, 3187710976UL, 2214632960UL, 1509990400UL,
+ 906012672UL, 369142784UL, 43008UL, 4294918656UL, 4294917632UL, 1224684032UL,
+ 419378176UL, 150964736UL, 117426176UL, 82235392UL, 47505408UL, 13037568UL,
+4294920192UL, 4294919168UL, 2231324160UL, 855597056UL, 184519168UL, 15643136UL,
+ 14077440UL, 12770816UL, 11726848UL, 4287646720UL, 4289745920UL, 2863558656UL,
+1790342144UL, 581991936UL, 44340736UL, 10400768UL, 9881600UL, 9888768UL,
+4282140672UL, 4282536448UL, 3730992640UL, 1851942400UL, 1147432960UL, 241209344UL,
+ 39888896UL, 6864896UL, 6872576UL, 4280577536UL, 4280448000UL, 4280975872UL,
+2519758336UL, 1211919360UL, 440172544UL, 105026048UL, 4894208UL, 5687808UL,
+4279667712UL, 4279406592UL, 4279534592UL, 2887025152UL, 1444707840UL, 639665152UL,
+ 203723264UL, 36610048UL, 3847168UL, 4278884352UL, 4278620672UL, 4278617088UL,
+2819127808UL, 1644854272UL, 906789888UL, 403736576UL, 102274048UL, 2400256UL,
+4278361088UL, 4278224896UL, 4278222848UL, 2818733568UL, 1812231680UL, 1208253440UL,
+ 604275712UL, 201754624UL, 1085952UL, 4278228992UL, 4278225408UL, 4160782848UL,
+2818603520UL, 1979742720UL, 1476425216UL, 939556352UL, 402686976UL, 33280UL,
+4294912512UL, 4294910976UL, 2365529600UL, 251597824UL, 150939648UL, 184508416UL,
+ 116685312UL, 48140800UL, 13674496UL, 4294323712UL, 4294910976UL, 2935956992UL,
+ 822029312UL, 184497664UL, 16735232UL, 14711296UL, 13275648UL, 12494848UL,
+4289342464UL, 4290783232UL, 3502254080UL, 1456092672UL, 549732352UL, 45635072UL,
+ 11562496UL, 11045376UL, 10790912UL, 4282919424UL, 4283837440UL, 4033360384UL,
+1751663616UL, 1148078080UL, 309219840UL, 7365120UL, 7633408UL, 7775232UL,
+4280430080UL, 4280431616UL, 4281351680UL, 2285650432UL, 1212170752UL, 641878528UL,
+ 105144320UL, 38564864UL, 5412864UL, 4279388672UL, 4279390720UL, 4279652352UL,
+3021754368UL, 1512066560UL, 774261760UL, 237656576UL, 3304960UL, 4230656UL,
+4278740480UL, 4278739968UL, 4278868992UL, 3020707840UL, 1712216064UL, 907171328UL,
+ 403987456UL, 68971520UL, 2653696UL, 4278349312UL, 4278217216UL, 4278346752UL,
+2953075712UL, 1812224000UL, 1174689792UL, 637951488UL, 201876480UL, 1338368UL,
+4278219776UL, 4278218240UL, 4227885568UL, 2986370048UL, 1845518336UL, 1409309696UL,
+ 973102080UL, 436233216UL, 25600UL, 4294908416UL, 4294906880UL, 3573485568UL,
+ 788466176UL, 184488960UL, 184492032UL, 83836928UL, 48912896UL, 14446080UL,
+4293793792UL, 4294904320UL, 3539931136UL, 1258229760UL, 150935040UL, 16721408UL,
+ 15353344UL, 13523968UL, 13134848UL, 4289206272UL, 4290383872UL, 3737260032UL,
+1656754688UL, 517348352UL, 46671872UL, 12207104UL, 11819520UL, 11561472UL,
+4283701248UL, 4284880896UL, 3932953088UL, 1853103104UL, 913974272UL, 276703744UL,
+ 8141824UL, 8541184UL, 8809984UL, 4280556032UL, 4281212928UL, 3996917760UL,
+2084839936UL, 977677312UL, 709504000UL, 206452736UL, 5656064UL, 6187520UL,
+4279376896UL, 4279510016UL, 4279903744UL, 2988582912UL, 1478896128UL, 707274752UL,
+ 405417984UL, 36850176UL, 4221440UL, 4278859264UL, 4278860288UL, 4278989824UL,
+3121493504UL, 1779578368UL, 840314368UL, 437793280UL, 102778368UL, 2908160UL,
+4278471168UL, 4278339072UL, 4278469632UL, 3053732352UL, 1845903360UL, 1107704320UL,
+ 638073856UL, 201998848UL, 1462784UL, 4278211584UL, 4278211072UL, 4227878400UL,
+3087026688UL, 1946175488UL, 1207976960UL, 905986048UL, 469779968UL, 18944UL,
+4294904832UL, 4294903808UL, 4177463296UL, 1761544192UL, 520030208UL, 117378560UL,
+ 117380096UL, 83832320UL, 15091200UL, 4293135360UL, 4294903296UL, 3640591360UL,
+1828652032UL, 419366400UL, 16716288UL, 16523264UL, 14037504UL, 13517824UL,
+4289465344UL, 4289988608UL, 3736469504UL, 1925187072UL, 684591616UL, 80744960UL,
+ 12853760UL, 12071424UL, 11944448UL, 4284484608UL, 4285008384UL, 3765176320UL,
+1953892352UL, 1014894592UL, 344462336UL, 8788992UL, 9056256UL, 9716736UL,
+4281208320UL, 4281995264UL, 3728871424UL, 2118651904UL, 1112412160UL, 575936512UL,
+ 173415424UL, 6040576UL, 6964224UL, 4279373824UL, 4280030720UL, 4280292352UL,
+2217088000UL, 1244403200UL, 573185024UL, 405806080UL, 104475136UL, 4604928UL,
+4278850048UL, 4278983680UL, 4279114240UL, 3121748480UL, 1813256704UL, 873994752UL,
+ 404101120UL, 270541824UL, 2769408UL, 4278461440UL, 4278461952UL, 4278461440UL,
+3087410176UL, 1913005568UL, 1141384192UL, 537665536UL, 235807232UL, 1587712UL,
+4278202368UL, 4278202368UL, 4026544128UL, 3053465600UL, 1946169344UL, 1207971840UL,
+ 704653824UL, 469772800UL, 12288UL, 4294706176UL, 4294902272UL, 3875472384UL,
+2197750784UL, 1124008960UL, 352257024UL, 117376512UL, 50268672UL, 16720384UL,
+4292609024UL, 4293525504UL, 3605659648UL, 2096365568UL, 989790208UL, 218038784UL,
+ 15993856UL, 15078912UL, 14163968UL, 4289594368UL, 4289724928UL, 3467771904UL,
+2092433408UL, 1187381760UL, 315228672UL, 12848128UL, 12588032UL, 12197888UL,
+4285531648UL, 4285400064UL, 3631350784UL, 2054553600UL, 1283458048UL, 612894208UL,
+ 110233600UL, 9310720UL, 9838592UL, 4282386432UL, 4282122752UL, 3594650112UL,
+2118647808UL, 1145962496UL, 710411776UL, 274729472UL, 6557696UL, 7217664UL,
+4280027648UL, 4280420864UL, 3324380672UL, 2116683776UL, 1244661248UL, 607127040UL,
+ 372771840UL, 104861696UL, 4989952UL, 4278979584UL, 4279110656UL, 4279372800UL,
+2887125504UL, 1343753216UL, 706481152UL, 303697408UL, 237113344UL, 2892288UL,
+4278454784UL, 4278455808UL, 4278586880UL, 2986741248UL, 1913130496UL, 1141509632UL,
+ 537660928UL, 201984512UL, 1449984UL, 4278195712UL, 4278195712UL, 4093646336UL,
+3019905024UL, 1946163200UL, 1207966208UL, 637540352UL, 335549952UL, 7680UL,
+4294901760UL, 4294901760UL, 4244111360UL, 3036413952UL, 1862205440UL, 1056899072UL,
+ 520028160UL, 218038272UL, 16711680UL, 4292608000UL, 4291690496UL, 3603824640UL,
+2396258304UL, 1524498432UL, 719716352UL, 283770880UL, 49152000UL, 15597568UL,
+4289462272UL, 4289069056UL, 3400007680UL, 2225995776UL, 1555300352UL, 918028288UL,
+ 314179584UL, 12451840UL, 12582912UL, 4285792256UL, 4285530112UL, 3497394176UL,
+2088370176UL, 1551892480UL, 1082392576UL, 478806016UL, 76808192UL, 9961472UL,
+4283039744UL, 4282908672UL, 3595436032UL, 2287206400UL, 1246887936UL, 1012531200UL,
+ 643956736UL, 174587904UL, 7208960UL, 4280942592UL, 4280811520UL, 3459252224UL,
+2083913728UL, 1379139584UL, 708050944UL, 607911936UL, 239468544UL, 5111808UL,
+4279631872UL, 4279369728UL, 3726114816UL, 2250244096UL, 1310457856UL, 706609152UL,
+ 270532608UL, 270925824UL, 3014656UL, 4278714368UL, 4278452224UL, 4278452224UL,
+2819227648UL, 1678639104UL, 738984448UL, 336331776UL, 68157440UL, 1835008UL,
+4278190080UL, 4278190080UL, 3456106496UL, 2483027968UL, 1744830464UL, 1174405120UL,
+ 637534208UL, 268435456UL, 0UL,
+};
+
+// 600x600x1, KCMY - Plain Normal, Both Pens
+
+uint32_t ulMapDJ3320_KCMY_6x6x1[ 9 * 9 * 9 ] =
+{
+1413633791UL, 77528918UL, 78053164UL, 44105496UL, 44105488UL, 43974410UL,
+ 43974404UL, 10682114UL, 11075328UL, 4279697248UL, 303628118UL, 108461864UL,
+ 43974422UL, 44105486UL, 44105480UL, 10551044UL, 11075328UL, 10551040UL,
+4279821356UL, 4161863474UL, 302710570UL, 71892758UL, 41090826UL, 9109250UL,
+ 10419970UL, 9895680UL, 9895680UL, 4279821844UL, 4279303960UL, 2919825182UL,
+ 403373850UL, 69664526UL, 140443394UL, 107544320UL, 6881024UL, 7143168UL,
+4279690762UL, 4279435018UL, 4278648592UL, 2114387730UL, 504299282UL, 136249098UL,
+ 171769600UL, 72023808UL, 5570304UL, 4279559682UL, 4279435010UL, 4278779652UL,
+3590782726UL, 1577910022UL, 504692486UL, 270466816UL, 103481088UL, 3997440UL,
+4278902272UL, 4278775296UL, 4278517504UL, 3859218176UL, 2148073216UL, 1074593536UL,
+ 370343680UL, 169148160UL, 2424576UL, 4278507520UL, 4278378496UL, 4278382080UL,
+3926058496UL, 2550329344UL, 1476722432UL, 671416064UL, 168492800UL, 1113856UL,
+4278247424UL, 4278246912UL, 4278246400UL, 4026587136UL, 2885737472UL, 1811998208UL,
+1107359744UL, 503381760UL, 65280UL, 4294907494UL, 218051656UL, 83885862UL,
+ 50331410UL, 50331398UL, 15007490UL, 14352128UL, 13434624UL, 12779264UL,
+4281486922UL, 1514822238UL, 680450102UL, 214236950UL, 80281352UL, 12648194UL,
+ 12386048UL, 11599616UL, 10682112UL, 4280333352UL, 4280338476UL, 1110491190UL,
+ 543751960UL, 310705928UL, 177274624UL, 9240320UL, 9240320UL, 9502464UL,
+4280078356UL, 4279692818UL, 3222732568UL, 807337756UL, 373489420UL, 274661120UL,
+ 39911168UL, 6618880UL, 7012096UL, 4279819784UL, 4279563270UL, 4279566088UL,
+1947401996UL, 706412302UL, 338493188UL, 138215168UL, 4652800UL, 5177088UL,
+4279557634UL, 4279037440UL, 4279169024UL, 3121807104UL, 1578434304UL, 706543360UL,
+ 270597888UL, 36241152UL, 3473152UL, 4278768640UL, 4278376448UL, 4278507008UL,
+3255229440UL, 1946610176UL, 1007351808UL, 437189632UL, 135331584UL, 2031360UL,
+4278373888UL, 4278237696UL, 4278237696UL, 3321937920UL, 2147534848UL, 1342230528UL,
+ 637720576UL, 201646080UL, 720640UL, 4278242816UL, 4278237184UL, 4278237696UL,
+3623926272UL, 2550184960UL, 1644216832UL, 973131264UL, 402707968UL, 56832UL,
+4294906418UL, 1862209076UL, 150938144UL, 50313228UL, 16776962UL, 16776962UL,
+ 48955136UL, 13696768UL, 12779264UL, 4289471022UL, 2829594174UL, 785400884UL,
+ 352302608UL, 184549120UL, 14483200UL, 13041408UL, 12123904UL, 11075328UL,
+4281746456UL, 4283062820UL, 1717068326UL, 1182178834UL, 546629120UL, 109641472UL,
+ 8716032UL, 8716032UL, 8584960UL, 4280848908UL, 4280853518UL, 3492455956UL,
+1413781008UL, 744278018UL, 274652160UL, 39905792UL, 6881024UL, 7274240UL,
+4280466434UL, 4280206850UL, 4280210434UL, 2351482370UL, 1009700354UL, 406246400UL,
+ 104649728UL, 4644352UL, 5307392UL, 4279549952UL, 4279158272UL, 4279156736UL,
+2786245120UL, 1444464128UL, 639420928UL, 237161984UL, 36361216UL, 3595264UL,
+4278763008UL, 4278500352UL, 4278366208UL, 2919671808UL, 1778955264UL, 906674176UL,
+ 403489280UL, 135581184UL, 2149888UL, 4278369280UL, 4278233088UL, 4227898880UL,
+3019939328UL, 1979753472UL, 1275244032UL, 637711360UL, 201635840UL, 838144UL,
+4278237184UL, 4278232576UL, 4093680640UL, 3187710976UL, 2214632960UL, 1509990400UL,
+ 906012672UL, 369142784UL, 43008UL, 4294906392UL, 4294904346UL, 520029718UL,
+ 50273804UL, 16745476UL, 117426176UL, 82235392UL, 47505408UL, 13037568UL,
+4292090392UL, 4294905882UL, 1392450074UL, 318717968UL, 184519168UL, 15643136UL,
+ 14077440UL, 12770816UL, 11726848UL, 4285672976UL, 4286982678UL, 2156152342UL,
+1217679890UL, 581991936UL, 44340736UL, 10400768UL, 9881600UL, 9888768UL,
+4282009090UL, 4282273282UL, 3259520014UL, 1851942400UL, 1147432960UL, 241209344UL,
+ 39888896UL, 6864896UL, 6872576UL, 4280577536UL, 4280448000UL, 4280975872UL,
+2519758336UL, 1211919360UL, 440172544UL, 105026048UL, 4894208UL, 5687808UL,
+4279667712UL, 4279406592UL, 4279534592UL, 2887025152UL, 1444707840UL, 639665152UL,
+ 203723264UL, 36610048UL, 3847168UL, 4278884352UL, 4278620672UL, 4278617088UL,
+2819127808UL, 1644854272UL, 906789888UL, 403736576UL, 102274048UL, 2400256UL,
+4278361088UL, 4278224896UL, 4278222848UL, 2818733568UL, 1812231680UL, 1208253440UL,
+ 604275712UL, 201754624UL, 1085952UL, 4278228992UL, 4278225408UL, 4160782848UL,
+2818603520UL, 1979742720UL, 1476425216UL, 939556352UL, 402686976UL, 33280UL,
+4294905868UL, 4294903822UL, 1929315342UL, 50268166UL, 117384706UL, 184508416UL,
+ 116685312UL, 48140800UL, 13674496UL, 4292876300UL, 4294905866UL, 2566852620UL,
+ 553589258UL, 184497664UL, 16735232UL, 14711296UL, 13275648UL, 12494848UL,
+4288947716UL, 4290520066UL, 3468699650UL, 1355034628UL, 549732352UL, 45635072UL,
+ 11562496UL, 11045376UL, 10790912UL, 4282919424UL, 4283837440UL, 4033360384UL,
+1751663616UL, 1148078080UL, 309219840UL, 7365120UL, 7633408UL, 7775232UL,
+4280430080UL, 4280431616UL, 4281351680UL, 2285650432UL, 1212170752UL, 641878528UL,
+ 105144320UL, 38564864UL, 5412864UL, 4279388672UL, 4279390720UL, 4279652352UL,
+3021754368UL, 1512066560UL, 774261760UL, 237656576UL, 3304960UL, 4230656UL,
+4278740480UL, 4278739968UL, 4278868992UL, 3020707840UL, 1712216064UL, 907171328UL,
+ 403987456UL, 68971520UL, 2653696UL, 4278349312UL, 4278217216UL, 4278346752UL,
+2953075712UL, 1812224000UL, 1174689792UL, 637951488UL, 201876480UL, 1338368UL,
+4278219776UL, 4278218240UL, 4227885568UL, 2986370048UL, 1845518336UL, 1409309696UL,
+ 973102080UL, 436233216UL, 25600UL, 4294905860UL, 4294904326UL, 3372155910UL,
+ 754911234UL, 184488960UL, 184492032UL, 83836928UL, 48912896UL, 14446080UL,
+4293530626UL, 4294904322UL, 3472820740UL, 1258229760UL, 150935040UL, 16721408UL,
+ 15353344UL, 13523968UL, 13134848UL, 4289206272UL, 4290383872UL, 3737260032UL,
+1656754688UL, 517348352UL, 46671872UL, 12207104UL, 11819520UL, 11561472UL,
+4283701248UL, 4284880896UL, 3932953088UL, 1853103104UL, 913974272UL, 276703744UL,
+ 8141824UL, 8541184UL, 8809984UL, 4280556032UL, 4281212928UL, 3996917760UL,
+2084839936UL, 977677312UL, 709504000UL, 206452736UL, 5656064UL, 6187520UL,
+4279376896UL, 4279510016UL, 4279903744UL, 2988582912UL, 1478896128UL, 707274752UL,
+ 405417984UL, 36850176UL, 4221440UL, 4278859264UL, 4278860288UL, 4278989824UL,
+3121493504UL, 1779578368UL, 840314368UL, 437793280UL, 102778368UL, 2908160UL,
+4278471168UL, 4278339072UL, 4278469632UL, 3053732352UL, 1845903360UL, 1107704320UL,
+ 638073856UL, 201998848UL, 1462784UL, 4278211584UL, 4278211072UL, 4227878400UL,
+3087026688UL, 1946175488UL, 1207976960UL, 905986048UL, 469779968UL, 18944UL,
+4294904832UL, 4294903808UL, 4177463298UL, 1761544192UL, 520030208UL, 117378560UL,
+ 117380096UL, 83832320UL, 15091200UL, 4293135360UL, 4294903296UL, 3640591360UL,
+1828652032UL, 419366400UL, 16716288UL, 16523264UL, 14037504UL, 13517824UL,
+4289465344UL, 4289988608UL, 3736469504UL, 1925187072UL, 684591616UL, 80744960UL,
+ 12853760UL, 12071424UL, 11944448UL, 4284484608UL, 4285008384UL, 3765176320UL,
+1953892352UL, 1014894592UL, 344462336UL, 8788992UL, 9056256UL, 9716736UL,
+4281208320UL, 4281995264UL, 3728871424UL, 2118651904UL, 1112412160UL, 575936512UL,
+ 173415424UL, 6040576UL, 6964224UL, 4279373824UL, 4279899650UL, 4280292352UL,
+2217088000UL, 1244403200UL, 573185024UL, 405806080UL, 104475136UL, 4604928UL,
+4278850048UL, 4278983680UL, 4279114240UL, 3121748480UL, 1813256704UL, 873994752UL,
+ 404101120UL, 270541824UL, 2769408UL, 4278461440UL, 4278461952UL, 4278461440UL,
+3087410176UL, 1913005568UL, 1141384192UL, 537665536UL, 235807232UL, 1587712UL,
+4278202368UL, 4278202368UL, 4026544128UL, 3053465600UL, 1946169344UL, 1207971840UL,
+ 704653824UL, 469772800UL, 12288UL, 4294706176UL, 4294902272UL, 3875472384UL,
+2197750784UL, 1124008960UL, 352257024UL, 117376512UL, 50268672UL, 16720384UL,
+4292609024UL, 4293525504UL, 3605659648UL, 2096365568UL, 989790208UL, 218038784UL,
+ 15993856UL, 15078912UL, 14163968UL, 4289594368UL, 4289724928UL, 3467771904UL,
+2092433408UL, 1187381760UL, 315228672UL, 12848128UL, 12588032UL, 12197888UL,
+4285531648UL, 4285400064UL, 3631350784UL, 2054553600UL, 1283458048UL, 612894208UL,
+ 110233600UL, 9310720UL, 9838592UL, 4282386432UL, 4282122752UL, 3594650112UL,
+2118647808UL, 1145962496UL, 710411776UL, 274729472UL, 6557696UL, 7217664UL,
+4280027648UL, 4280420864UL, 3324380672UL, 2116683776UL, 1244661248UL, 607127040UL,
+ 372771840UL, 104861696UL, 4989952UL, 4278979584UL, 4279110656UL, 4279372800UL,
+2887125504UL, 1343753216UL, 706481152UL, 303697408UL, 237113344UL, 2892288UL,
+4278454784UL, 4278455808UL, 4278586880UL, 2986741248UL, 1913130496UL, 1141509632UL,
+ 537660928UL, 201984512UL, 1449984UL, 4278195712UL, 4278195712UL, 4093646336UL,
+3019905024UL, 1946163200UL, 1207966208UL, 637540352UL, 335549952UL, 7680UL,
+4294901760UL, 4294901760UL, 4244111360UL, 3036413952UL, 1862205440UL, 1056899072UL,
+ 520028160UL, 218038272UL, 16711680UL, 4292608000UL, 4291690496UL, 3603824640UL,
+2396258304UL, 1524498432UL, 719716352UL, 283770880UL, 49152000UL, 15597568UL,
+4289462272UL, 4289069056UL, 3400007680UL, 2225995776UL, 1555300352UL, 918028288UL,
+ 314179584UL, 12451840UL, 12582912UL, 4285792256UL, 4285530112UL, 3497394176UL,
+2088370176UL, 1551892480UL, 1082392576UL, 478806016UL, 76808192UL, 9961472UL,
+4283039744UL, 4282908672UL, 3595436032UL, 2287206400UL, 1246887936UL, 1012531200UL,
+ 643956736UL, 174587904UL, 7208960UL, 4280942592UL, 4280811520UL, 3459252224UL,
+2083913728UL, 1379139584UL, 708050944UL, 607911936UL, 239468544UL, 5111808UL,
+4279631872UL, 4279369728UL, 3726114816UL, 2250244096UL, 1310457856UL, 706609152UL,
+ 270532608UL, 270925824UL, 3014656UL, 4278714368UL, 4278452224UL, 4278452224UL,
+2819227648UL, 1678639104UL, 738984448UL, 336331776UL, 68157440UL, 1835008UL,
+4278190080UL, 4278190080UL, 3456106496UL, 2483027968UL, 1744830464UL, 1174405120UL,
+ 637534208UL, 268435456UL, 0UL,
+};
+
diff --git a/prnt/hpcups/dj3320PrintModes.h b/prnt/hpcups/dj3320PrintModes.h
new file mode 100644
index 0000000..582b594
--- /dev/null
+++ b/prnt/hpcups/dj3320PrintModes.h
@@ -0,0 +1,103 @@
+PrintMode dj3320PrintModes[] =
+{
+ // Both pens - Plain/Draft
+ {
+ "PlainDraftKColor",
+ {300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300},
+ {1, 1, 1, 1, 1, 1}, 4, FED,
+ {ulMapDJ3320_KCMY_3x3x1, NULL, NULL},
+ 300, 300, false, HTBinary_open, HTBinary_open
+ },
+ // Both Pens - Plain/Normal Color
+ {
+ "PlainNormalKColor",
+ {600, 600, 600, 600, 600, 600},
+ {600, 600, 600, 600, 600, 600},
+ {1, 1, 1, 1, 1, 1}, 4, FED,
+ {ulMapDJ3320_KCMY_6x6x1, NULL, NULL},
+ 600, 600, false, HTBinary_open, HTBinary_open
+ },
+ // Both pens or Color pen only- photo paper/best
+ {
+ "PhotoBest",
+ {600, 600, 600, 600, 600, 600},
+ {600, 600, 600, 600, 600, 600},
+ {1, 2, 2, 2, 2, 2}, 4, FED,
+ {ulMapDJ970_Gossimer_Normal_KCMY, NULL, NULL},
+ 600, 600, false, HTBinary_open, HT600x6004level970_open
+ },
+ // color pen only - Plain/Draft
+ {
+ "PlainDraftColor",
+ {300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300},
+ {1, 1, 1, 1, 1, 1}, 3, FED,
+ {ulMapDJ3320_CMY_3x3x1, NULL, NULL},
+ 300, 300, false, HTBinary_open, HTBinary_open
+ },
+ // Color Pen only - Plain/Normal Color
+ {
+ "PlainNormalColor",
+ {600, 600, 600, 600, 600, 600},
+ {600, 600, 600, 600, 600, 600},
+ {1, 1, 1, 1, 1, 1}, 3, FED,
+ {ulMapDJ3320_CMY_6x6x1, NULL, NULL},
+ 600, 600, false, HTBinary_open, HTBinary_open
+ },
+ // Black pen only or both pens - Plain/Draft
+ {
+ "PlainDraftGrayK",
+ {300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300},
+ {1, 1, 1, 1, 1, 1}, 1, FED,
+ {ulMapDJ3320_K_3x3x1, NULL, NULL},
+ 300, 300, false, HTBinary_open, HTBinary_open
+ },
+ // Black pen only or Photo Pen only or both pens - Plain/Normal Gray
+ {
+ "PlainNormalGrayK",
+ {600, 600, 600, 600, 600, 600},
+ {600, 600, 600, 600, 600, 600},
+ {1, 1, 1, 1, 1, 1}, 1, FED,
+ {ulMapDJ3320_K_6x6x1, NULL, NULL},
+ 600, 600, false, HTBinary_open, HTBinary_open
+ },
+ // Color and Photo pen - Plain/Normal - Gray
+ {
+ "PlainGrayPhotoColor",
+ {600, 600, 600, 600, 600, 600},
+ {600, 600, 600, 600, 600, 600},
+ {1, 1, 1, 1, 1, 1}, 1, FED,
+ {ulMapDJ3320_K_6x6x1, ulMapDJ3600_ClMlxx_6x6x1, NULL},
+ 600, 600, false, HTBinary_open, HTBinary_open
+ },
+ // Color and Photo pen - Plain/Draft - color
+ {
+ "PlainDraftColorPhoto",
+ {300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300},
+ {1, 1, 1, 1, 1, 1}, 6, FED,
+ {ulMapDJ3320_KCMY_3x3x1, ulMapDJ3600_ClMlxx_3x3x1, NULL},
+ 300, 300, false, HTBinary_open, HTBinary_open
+ },
+ // Color and Photo pen - Plain/Normal - color
+ {
+ "PlainNormalColorPhoto",
+ {600, 600, 600, 600, 600, 600},
+ {600, 600, 600, 600, 600, 600},
+ {1, 1, 1, 1, 1, 1}, 6, FED,
+ {ulMapDJ3320_K_6x6x1, ulMapDJ3600_ClMlxx_6x6x1, NULL},
+ 600, 600, false, HTBinary_open, HTBinary_open
+ },
+ // Color and Photo pen - photo/best - color
+ {
+ "PhotoBestPhotoColor",
+ {600, 600, 600, 600, 600, 600},
+ {600, 600, 600, 600, 600, 600},
+ {2, 2, 2, 2, 2, 2}, 6, FED,
+ {ulMapDJ3600_KCMY_6x6x2, ulMapDJ3600_ClMlxx_6x6x2, NULL},
+ 600, 600, false, HTBinary_open, HTBinary_open
+ }
+};
+
diff --git a/prnt/hpcups/dj3600ColorMaps.cpp b/prnt/hpcups/dj3600ColorMaps.cpp
new file mode 100644
index 0000000..23a82a2
--- /dev/null
+++ b/prnt/hpcups/dj3600ColorMaps.cpp
@@ -0,0 +1,802 @@
+/*****************************************************************************\
+ dj3600ColorMaps.cpp : Implimentation for the DJ3600 color maps
+
+ Copyright (c) 1996 - 2009, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ \***************************************************************************/
+
+#include "CommonDefinitions.h"
+
+// 600x600x1, KCMY - Plain Normal, MLC Both
+
+uint32_t ulMapDJ3600_KCMY_6x6x1[ 9 * 9 * 9 ] =
+{
+3503343871UL, 2379407530UL, 1338176353UL, 698938928UL, 446166815UL, 311162901UL,
+ 193132557UL, 91879429UL, 7403520UL, 3999964546UL, 2759781530UL, 1235874648UL,
+ 631371308UL, 429258525UL, 294320148UL, 176289804UL, 74971140UL, 7141376UL,
+3996614467UL, 3695036491UL, 1732834647UL, 744355636UL, 376502042UL, 242546704UL,
+ 141686793UL, 57407491UL, 6420480UL, 3961749547UL, 3945178158UL, 3173837109UL,
+1093532471UL, 505608740UL, 239335697UL, 71891205UL, 38531842UL, 4777472UL,
+3961028126UL, 3944322079UL, 3759852831UL, 2434527520UL, 706345758UL, 387447579UL,
+ 152958987UL, 69723652UL, 2345472UL, 3960568341UL, 3960572437UL, 3893476373UL,
+3289377554UL, 1594816272UL, 420478481UL, 252706066UL, 67433989UL, 50176UL,
+3960173838UL, 3960242702UL, 3909856269UL, 3607616520UL, 2349264135UL, 1023866375UL,
+ 269089547UL, 101120007UL, 50176UL, 3959844615UL, 3943070215UL, 3926236166UL,
+3775055107UL, 2785266179UL, 1493421316UL, 654560772UL, 168089349UL, 50944UL,
+3942676480UL, 3892345344UL, 3724574720UL, 3405809920UL, 2684391936UL, 1728092672UL,
+ 989896448UL, 419472640UL, 41984UL, 3938409846UL, 1777809479UL, 719700274UL,
+ 265413906UL, 113242887UL, 78312964UL, 26474241UL, 42465026UL, 7597568UL,
+4099756906UL, 3130956215UL, 1570223961UL, 428925723UL, 159509771UL, 41151746UL,
+ 6743040UL, 6215936UL, 6018560UL, 4029963327UL, 3644760395UL, 1782421067UL,
+ 575062561UL, 257082638UL, 89245445UL, 5162752UL, 5162752UL, 5624576UL,
+3995102759UL, 3894320676UL, 2652743204UL, 975619374UL, 370263572UL, 153272840UL,
+ 36422146UL, 3260672UL, 4049664UL, 3977670940UL, 3859972117UL, 3188485391UL,
+1779476755UL, 638694420UL, 285979662UL, 84128516UL, 368128UL, 1485824UL,
+3960434963UL, 3825888268UL, 3305592585UL, 2315745034UL, 1242012169UL, 453550859UL,
+ 201761544UL, 33657602UL, 38656UL, 3960106252UL, 3758447622UL, 3322169094UL,
+2718127620UL, 1711501317UL, 906197252UL, 302287366UL, 100897027UL, 38656UL,
+3959777286UL, 3657518081UL, 3355523073UL, 2734764801UL, 2013350401UL, 1258379777UL,
+ 587291137UL, 167863553UL, 40704UL, 3825228288UL, 3556784896UL, 3439344384UL,
+3053467392UL, 2248162048UL, 1493191424UL, 855657984UL, 369118976UL, 17920UL,
+3921752382UL, 3102352688UL, 670965543UL, 149451274UL, 147700489UL, 96322565UL,
+ 60541443UL, 42256898UL, 7258112UL, 3985386811UL, 3702734672UL, 1538472522UL,
+ 330521618UL, 10190080UL, 8687360UL, 7445504UL, 6529536UL, 6075392UL,
+4231344960UL, 3157142584UL, 1545279776UL, 943204887UL, 205414664UL, 20805889UL,
+ 3964160UL, 4032000UL, 3837696UL, 4045286692UL, 3894363174UL, 2467113488UL,
+ 973409798UL, 369441287UL, 118703875UL, 1724672UL, 2450944UL, 3113472UL,
+4011019287UL, 3859893269UL, 3171563020UL, 1459887621UL, 537207045UL, 235091204UL,
+ 67188481UL, 19968UL, 1077504UL, 3977074448UL, 3809102860UL, 3020168197UL,
+1560282369UL, 922816514UL, 335614466UL, 134288641UL, 33632769UL, 20736UL,
+3976747530UL, 3724821765UL, 2885750530UL, 1744830464UL, 1056964608UL, 587202560UL,
+ 184549376UL, 83893249UL, 11520UL, 3959642372UL, 3590337024UL, 2684354560UL,
+1946157056UL, 1325400064UL, 822083584UL, 419430400UL, 117440512UL, 13312UL,
+3707780608UL, 3472891904UL, 2717908992UL, 2130706432UL, 1560281088UL, 1040187392UL,
+ 603979776UL, 285213184UL, 0UL, 3921681442UL, 3638301978UL, 1207570452UL,
+ 251399441UL, 165093385UL, 112809990UL, 77490948UL, 42365442UL, 7170048UL,
+3953203487UL, 3719895071UL, 1488459293UL, 331156752UL, 44895746UL, 9254656UL,
+ 7818496UL, 6838016UL, 6250496UL, 4031061542UL, 3729530664UL, 2100235536UL,
+ 925305099UL, 206570244UL, 5311232UL, 5186304UL, 4994816UL, 4737024UL,
+4246740775UL, 3626312750UL, 1946683146UL, 838860800UL, 587202560UL, 67502080UL,
+ 1050624UL, 1448704UL, 1782784UL, 4078113303UL, 3826389270UL, 2986936587UL,
+1459617792UL, 654311424UL, 201326592UL, 33554432UL, 2304UL, 599296UL,
+4027262733UL, 3758691083UL, 2936275973UL, 1761607680UL, 989855744UL, 385875968UL,
+ 100663296UL, 16777216UL, 3840UL, 4010227975UL, 3624146437UL, 2936078594UL,
+1845493760UL, 1174405120UL, 704643072UL, 218103808UL, 50331648UL, 0UL,
+3842191108UL, 3456174337UL, 2868903936UL, 2030043136UL, 1358954496UL, 973078528UL,
+ 520093696UL, 117440512UL, 0UL, 3439331584UL, 3305111552UL, 2885681152UL,
+2231369728UL, 1610612736UL, 1241513984UL, 771751936UL, 335544320UL, 0UL,
+3921285141UL, 3755084815UL, 2230520075UL, 351997200UL, 166266890UL, 147064327UL,
+ 94702084UL, 42409730UL, 7546624UL, 3936620050UL, 3652061708UL, 2125990413UL,
+ 448465936UL, 44892418UL, 8847360UL, 7864320UL, 7081984UL, 6692352UL,
+3998551827UL, 3629387282UL, 2016741128UL, 791741960UL, 205259267UL, 4325376UL,
+ 4718592UL, 4980736UL, 5051136UL, 4111667992UL, 3406893334UL, 2130903812UL,
+1056964608UL, 570425344UL, 67108864UL, 458752UL, 1638400UL, 2293760UL,
+3977581594UL, 3608351512UL, 2768700937UL, 1208091139UL, 603979776UL, 335544320UL,
+ 33554432UL, 33554432UL, 0UL, 3993766927UL, 3658091020UL, 2835612420UL,
+1694564609UL, 922746880UL, 402653184UL, 83886080UL, 0UL, 0UL,
+3859220233UL, 3523544070UL, 2785083649UL, 1694498816UL, 1107296256UL, 654311424UL,
+ 167772160UL, 33554432UL, 0UL, 3607298820UL, 3389063425UL, 2734686208UL,
+1895825408UL, 1207959552UL, 855638016UL, 486539264UL, 83886080UL, 0UL,
+3321888768UL, 3154116608UL, 2701131776UL, 2097152000UL, 1375731712UL, 1107296256UL,
+ 754974720UL, 385875968UL, 0UL, 3921087246UL, 3838511114UL, 3052143621UL,
+ 904922117UL, 198969611UL, 114099206UL, 94241540UL, 58786306UL, 7405568UL,
+3936356363UL, 3584165384UL, 2427192583UL, 917636102UL, 94962435UL, 9109504UL,
+ 7208960UL, 6291456UL, 6029312UL, 3965519882UL, 3528590599UL, 1932591619UL,
+1094189829UL, 238158596UL, 3276800UL, 3342336UL, 3670016UL, 4325376UL,
+4028107276UL, 3339192074UL, 1929379841UL, 1040187392UL, 452984832UL, 83886080UL,
+ 0UL, 458752UL, 1572864UL, 4111273232UL, 3591047949UL, 2600665861UL,
+1157627904UL, 704643072UL, 352321536UL, 67108864UL, 0UL, 0UL,
+3372878091UL, 3658091020UL, 3003253251UL, 1510015234UL, 855703809UL, 385875968UL,
+ 184549376UL, 0UL, 0UL, 3439724039UL, 3372549125UL, 2701197570UL,
+1744830465UL, 1157627904UL, 654311424UL, 234881024UL, 33554432UL, 0UL,
+3254911491UL, 3221291266UL, 2617245696UL, 1828716544UL, 1207959552UL, 771751936UL,
+ 503316480UL, 83886080UL, 0UL, 2986344448UL, 2835349504UL, 2415919104UL,
+1946157056UL, 1358954496UL, 872415232UL, 704643072UL, 419430400UL, 0UL,
+3920693001UL, 3888448518UL, 3285910019UL, 1658323715UL, 416481795UL, 63504899UL,
+ 95748868UL, 58917122UL, 6619136UL, 3936158982UL, 3600548355UL, 2627404290UL,
+1352663297UL, 362349059UL, 8847360UL, 7274496UL, 5570560UL, 4980736UL,
+3966042884UL, 3579708164UL, 2403533058UL, 1346109698UL, 472973570UL, 19333120UL,
+ 2293760UL, 2555904UL, 2883584UL, 3978888197UL, 3221422852UL, 1828716544UL,
+1107296256UL, 620756992UL, 100663296UL, 0UL, 0UL, 327680UL,
+3691448073UL, 3020096259UL, 2013331713UL, 1174405120UL, 788529152UL, 335544320UL,
+ 50331648UL, 0UL, 0UL, 4010280970UL, 3506832647UL, 2466316546UL,
+1342177281UL, 939524096UL, 503316480UL, 201326592UL, 16777216UL, 0UL,
+3909617417UL, 3288465922UL, 2415919105UL, 1560281088UL, 1157627904UL, 671088640UL,
+ 218103808UL, 134217728UL, 0UL, 3103850753UL, 2902458369UL, 2382364672UL,
+1744830464UL, 1241513984UL, 805306368UL, 385875968UL, 117440512UL, 0UL,
+2600468480UL, 2466250752UL, 2231369728UL, 1795162112UL, 1342177280UL, 855638016UL,
+ 520093696UL, 385875968UL, 0UL, 3920298756UL, 3904766466UL, 3318284546UL,
+1992753410UL, 968557058UL, 313786626UL, 111018756UL, 43254017UL, 7143424UL,
+3935895810UL, 3566206976UL, 2726690816UL, 1636237312UL, 780402688UL, 125042945UL,
+ 6488064UL, 5111808UL, 4194304UL, 3915972866UL, 3546218496UL, 2571501568UL,
+1681522689UL, 809172993UL, 170524673UL, 1966080UL, 1572864UL, 1703936UL,
+3693740546UL, 3458203906UL, 2047148032UL, 1258291200UL, 855638016UL, 301989888UL,
+ 16777216UL, 0UL, 0UL, 3506635523UL, 2885746945UL, 2030043136UL,
+1207959552UL, 754974720UL, 536870912UL, 83886080UL, 0UL, 0UL,
+3674407683UL, 3154182402UL, 2046886145UL, 1308622848UL, 872415232UL, 486539264UL,
+ 201326592UL, 16777216UL, 0UL, 3254845697UL, 2617311233UL, 2030043136UL,
+1392508928UL, 1023410176UL, 620756992UL, 234881024UL, 117440512UL, 0UL,
+3657498882UL, 2868903936UL, 2097152000UL, 1577058304UL, 1241513984UL, 822083584UL,
+ 369098752UL, 83886080UL, 0UL, 2197815296UL, 2113929216UL, 1912602624UL,
+1644167168UL, 1325400064UL, 855638016UL, 486539264UL, 268435456UL, 0UL,
+3920625664UL, 3769696256UL, 3283353600UL, 2342846464UL, 1553530880UL, 831389696UL,
+ 411566080UL, 159383552UL, 7995392UL, 3767205888UL, 3431137280UL, 2793144320UL,
+1920270336UL, 1198587904UL, 526843904UL, 173277184UL, 4587520UL, 3932160UL,
+3596156928UL, 3428253696UL, 2655453184UL, 2134769664UL, 1178075136UL, 590020608UL,
+ 135921664UL, 1179648UL, 720896UL, 3374186496UL, 3290103808UL, 2299592704UL,
+1610612736UL, 1291845632UL, 587202560UL, 218103808UL, 0UL, 0UL,
+3238002688UL, 3204448256UL, 2516582400UL, 1677721600UL, 1342177280UL, 989855744UL,
+ 402653184UL, 33554432UL, 0UL, 2734686208UL, 2734686208UL, 2130706432UL,
+1342177280UL, 838860800UL, 654311424UL, 486539264UL, 117440512UL, 0UL,
+2298478592UL, 2264924160UL, 2080374784UL, 1426063360UL, 989855744UL, 536870912UL,
+ 335544320UL, 201326592UL, 0UL, 2046820352UL, 2030043136UL, 1996488704UL,
+1644167168UL, 1023410176UL, 654311424UL, 285212672UL, 167772160UL, 0UL,
+1912602624UL, 1879048192UL, 1677721600UL, 1442840576UL, 1124073472UL, 771751936UL,
+ 452984832UL, 218103808UL, 0UL,
+};
+
+// 600x600x1UL, ClMlxx - Plain NormalUL, MLC Both
+
+uint32_t ulMapDJ3600_ClMlxx_6x6x1[ 9 * 9 * 9 ] =
+{
+ 0UL, 591872UL, 393216UL, 1441792UL, 2097152UL, 2424832UL,
+ 2818048UL, 3211264UL, 3604480UL, 2816UL, 0UL, 1179648UL,
+ 1638400UL, 2162688UL, 2490368UL, 2883584UL, 3276800UL, 3735552UL,
+ 13568UL, 1188608UL, 0UL, 3801088UL, 3538944UL, 3407872UL,
+ 3538944UL, 3801088UL, 4194304UL, 16128UL, 10752UL, 66560UL,
+ 0UL, 6029312UL, 5177344UL, 5177344UL, 5376256UL, 6168064UL,
+ 17664UL, 14336UL, 202240UL, 0UL, 768UL, 4587520UL,
+ 6881792UL, 7675392UL, 9195264UL, 19200UL, 16640UL, 7936UL,
+ 0UL, 0UL, 0UL, 2752512UL, 7210496UL, 10314240UL,
+ 20480UL, 18432UL, 11520UL, 1792UL, 3072UL, 2816UL,
+ 2560UL, 1773312UL, 6912000UL, 22016UL, 19968UL, 14592UL,
+ 9472UL, 153344UL, 158720UL, 230144UL, 226048UL, 2658560UL,
+ 20736UL, 22272UL, 26880UL, 36608UL, 42240UL, 45312UL,
+ 48128UL, 49664UL, 51456UL, 720896UL, 0UL, 7936UL,
+ 2560UL, 459776UL, 1376768UL, 2228736UL, 2687488UL, 4002048UL,
+ 2752512UL, 9208064UL, 6579968UL, 3482112UL, 3412480UL, 3936512UL,
+ 4989184UL, 5911552UL, 6174976UL, 18176UL, 2312448UL, 10067968UL,
+ 8019200UL, 7362560UL, 7165184UL, 7165184UL, 7230720UL, 6569472UL,
+ 19200UL, 210688UL, 3639296UL, 3637504UL, 9264896UL, 9266176UL,
+ 8741376UL, 8480000UL, 7949824UL, 19712UL, 152320UL, 3193600UL,
+ 2334208UL, 2732032UL, 6393600UL, 9730560UL, 10192128UL, 9598976UL,
+ 20736UL, 223232UL, 1620992UL, 2014976UL, 1619968UL, 1884160UL,
+ 3978496UL, 7055872UL, 9278464UL, 22016UL, 163840UL, 770816UL,
+ 1230848UL, 1034240UL, 1035520UL, 1363200UL, 2344960UL, 4896000UL,
+ 23040UL, 104704UL, 247296UL, 513024UL, 381440UL, 316416UL,
+ 383744UL, 383744UL, 1295360UL, 30976UL, 45568UL, 49152UL,
+ 52992UL, 54784UL, 55040UL, 56320UL, 57600UL, 59136UL,
+ 1441792UL, 393472UL, 0UL, 348928UL, 1657856UL, 2773248UL,
+ 3755264UL, 4738560UL, 5726976UL, 3407872UL, 3806976UL, 9464576UL,
+ 4494592UL, 4361216UL, 4884224UL, 5603840UL, 6192640UL, 6516992UL,
+ 851968UL, 11767296UL, 15654144UL, 12505088UL, 8434688UL, 7773952UL,
+ 7773184UL, 7771648UL, 7900672UL, 28672UL, 487936UL, 9427200UL,
+ 12972544UL, 11848192UL, 10011392UL, 9288448UL, 8826112UL, 8361984UL,
+ 25600UL, 358656UL, 3001088UL, 5761280UL, 6680576UL, 8246784UL,
+ 9358080UL, 10076160UL, 9676544UL, 24832UL, 229888UL, 1627904UL,
+ 3011328UL, 3011328UL, 3536896UL, 4713472UL, 6870272UL, 9028352UL,
+ 24832UL, 169216UL, 515328UL, 1305856UL, 1438720UL, 1440512UL,
+ 1834496UL, 2682368UL, 4840704UL, 25600UL, 46080UL, 189696UL,
+ 518400UL, 519424UL, 522240UL, 523264UL, 654848UL, 1108224UL,
+ 40704UL, 50944UL, 58112UL, 60160UL, 60672UL, 62464UL,
+ 64000UL, 64512UL, 64256UL, 1703936UL, 459008UL, 0UL,
+ 334592UL, 2202624UL, 3708416UL, 4560128UL, 5150720UL, 5940224UL,
+ 3145728UL, 3999744UL, 9643264UL, 7760640UL, 4701952UL, 5551360UL,
+ 5943296UL, 6270720UL, 6466560UL, 6488064UL, 8720896UL, 14914560UL,
+ 15054080UL, 10273792UL, 7392256UL, 7521792UL, 7389440UL, 7323136UL,
+ 3072UL, 3224064UL, 13088000UL, 13809920UL, 13682944UL, 10147328UL,
+ 8508928UL, 8834816UL, 9094912UL, 30720UL, 560128UL, 4637184UL,
+ 8441600UL, 10471424UL, 8638208UL, 8639488UL, 8771584UL, 9751296UL,
+ 32512UL, 372736UL, 2608384UL, 3329792UL, 3985152UL, 4773120UL,
+ 5167616UL, 6151680UL, 7854592UL, 30464UL, 310016UL, 1101824UL,
+ 1624320UL, 1887232UL, 1889280UL, 2676992UL, 3268096UL, 4709888UL,
+ 16880640UL, 118528UL, 381184UL, 575744UL, 707328UL, 774144UL,
+ 776192UL, 1104384UL, 1632000UL, 52992UL, 54272UL, 53760UL,
+ 51968UL, 52736UL, 52736UL, 55296UL, 57344UL, 54784UL,
+ 2162688UL, 852224UL, 0UL, 655616UL, 3155200UL, 5087744UL,
+ 5161216UL, 6012928UL, 6537216UL, 3211264UL, 5440768UL, 8916992UL,
+ 11606528UL, 9526528UL, 8104704UL, 6801152UL, 6735872UL, 6931712UL,
+ 6356992UL, 9702656UL, 14500352UL, 15354880UL, 13921024UL, 11837696UL,
+ 9879552UL, 7851264UL, 7522816UL, 6684672UL, 11412224UL, 14182144UL,
+ 14452736UL, 14454272UL, 13734912UL, 12891648UL, 11126528UL, 8311808UL,
+ 596224UL, 2305024UL, 6775040UL, 9731584UL, 10387456UL, 9603584UL,
+ 9284096UL, 10469120UL, 9883136UL, 158464UL, 880896UL, 3115776UL,
+ 4167424UL, 4691968UL, 6065664UL, 5677312UL, 6731008UL, 8505856UL,
+ 171520UL, 566784UL, 1417984UL, 2006528UL, 2007040UL, 2269952UL,
+ 3257088UL, 3455744UL, 5620992UL, 311040UL, 180224UL, 504064UL,
+ 763392UL, 826880UL, 762368UL, 896768UL, 1358336UL, 2342144UL,
+ 49920UL, 47616UL, 47104UL, 45312UL, 43008UL, 41472UL,
+ 44544UL, 48128UL, 43776UL, 2490368UL, 1245184UL, 196608UL,
+ 1769472UL, 6163968UL, 8071936UL, 9206016UL, 8432640UL, 8305920UL,
+ 3473408UL, 6620416UL, 9504768UL, 11799040UL, 12328448UL, 12273152UL,
+ 11044096UL, 10200832UL, 9549824UL, 6291456UL, 10881024UL, 14556416UL,
+ 14886144UL, 15412224UL, 14240000UL, 13140224UL, 12165376UL, 10729472UL,
+ 9109504UL, 13440512UL, 14957312UL, 14697472UL, 15157248UL, 14829568UL,
+ 14119168UL, 13605120UL, 12238080UL, 3997952UL, 5705984UL, 9582336UL,
+ 10702592UL, 11096576UL, 11294720UL, 10840576UL, 11766784UL, 11648512UL,
+ 2634496UL, 1189632UL, 3555584UL, 5000960UL, 5852672UL, 5590016UL,
+ 6642944UL, 6586112UL, 8170240UL, 1204992UL, 1073408UL, 1729024UL,
+ 2188800UL, 2451456UL, 3168000UL, 3760896UL, 3898112UL, 5346048UL,
+ 752896UL, 424960UL, 555008UL, 751360UL, 946944UL, 1010688UL,
+ 1011712UL, 1669376UL, 2590976UL, 35840UL, 34560UL, 33792UL,
+ 33536UL, 33024UL, 29696UL, 28928UL, 32768UL, 30464UL,
+ 2818048UL, 1507328UL, 2293760UL, 4849920UL, 7995904UL, 10030592UL,
+ 12000256UL, 12081664UL, 11567616UL, 3670016UL, 6750720UL, 10420992UL,
+ 11928064UL, 13109248UL, 13311232UL, 13317888UL, 13001984UL, 12680448UL,
+ 6094848UL, 9896448UL, 13765632UL, 14552832UL, 15405568UL, 15342592UL,
+ 14891264UL, 14049792UL, 13465856UL, 8781824UL, 14224128UL, 15145216UL,
+ 15409408UL, 15345152UL, 15671808UL, 14954240UL, 14766848UL, 14381568UL,
+ 8587008UL, 10098944UL, 11216640UL, 11414784UL, 11349248UL, 12595712UL,
+ 12267776UL, 12538624UL, 13073408UL, 1901312UL, 3281152UL, 5317632UL,
+ 6172160UL, 6892544UL, 7024128UL, 8598272UL, 8276224UL, 8943360UL,
+ 334336UL, 1648896UL, 2371584UL, 2699520UL, 2895616UL, 3091456UL,
+ 2959616UL, 4669184UL, 5204480UL, 935936UL, 672768UL, 803584UL,
+ 869120UL, 999936UL, 1064960UL, 1389824UL, 1785088UL, 2907648UL,
+ 21248UL, 20992UL, 20736UL, 21248UL, 20992UL, 19968UL,
+ 17152UL, 18688UL, 20224UL, 3145728UL, 1966080UL, 5177344UL,
+ 7471360UL, 10682880UL, 12518400UL, 13174784UL, 13177600UL, 13253888UL,
+ 3932160UL, 7733248UL, 11403264UL, 12648448UL, 13303808UL, 14091008UL,
+ 14096128UL, 14361344UL, 14235904UL, 6291456UL, 10158080UL, 13566720UL,
+ 14353408UL, 14877440UL, 15730432UL, 15603200UL, 15539968UL, 15152640UL,
+ 11337984UL, 13107712UL, 15599872UL, 15601152UL, 15666688UL, 15928832UL,
+ 15602176UL, 15342848UL, 15348224UL, 12059904UL, 11864576UL, 12062464UL,
+ 11997952UL, 11801600UL, 12850688UL, 13375232UL, 13179904UL, 13646592UL,
+ 5767936UL, 6228992UL, 6689792UL, 7083520UL, 7476736UL, 7410944UL,
+ 9704960UL, 9443072UL, 10499840UL, 2232064UL, 2692864UL, 2955264UL,
+ 3348992UL, 3479552UL, 3675648UL, 4396288UL, 5183744UL, 6829824UL,
+ 201728UL, 661760UL, 989696UL, 1120512UL, 1185536UL, 1251072UL,
+ 1315840UL, 1249536UL, 2766592UL, 9216UL, 9216UL, 9216UL,
+ 9472UL, 9728UL, 9984UL, 9472UL, 8704UL, 12032UL,
+ 2949120UL, 4259840UL, 7995392UL, 10223616UL, 11927552UL, 13041664UL,
+ 13500416UL, 13828096UL, 14024704UL, 6160384UL, 9568256UL, 11927552UL,
+ 12976128UL, 13500416UL, 14155776UL, 14745600UL, 15073792UL, 15400960UL,
+ 10092544UL, 11665408UL, 13500416UL, 14024704UL, 14745600UL, 15400960UL,
+ 16056320UL, 16189184UL, 16449536UL, 13434880UL, 13762560UL, 15073280UL,
+ 15597568UL, 15597568UL, 15990784UL, 15925248UL, 15664896UL, 15597568UL,
+ 13107200UL, 13172736UL, 13631488UL, 13697024UL, 12910592UL, 13238272UL,
+ 13697024UL, 13631488UL, 13500416UL, 7995392UL, 7798784UL, 8912896UL,
+ 7668480UL, 7799808UL, 8127232UL, 9699328UL, 10289152UL, 10354688UL,
+ 3735552UL, 3145728UL, 3997696UL, 3737600UL, 3999744UL, 4130048UL,
+ 4719360UL, 5767168UL, 6160384UL, 1376256UL, 851968UL, 786432UL,
+ 1048576UL, 1312512UL, 1443584UL, 1573888UL, 2228224UL, 3473408UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL,
+};
+
+
+// 600x600x2, KCMY - Photo Best, MLC Both
+
+uint32_t ulMapDJ3600_KCMY_6x6x2[ 9 * 9 * 9 ] =
+{
+3317360895UL, 3587571711UL, 2630745874UL, 1166933778UL, 558432009UL, 202374912UL,
+ 65280UL, 65280UL, 61952UL, 4286697175UL, 3867868899UL, 2478505755UL,
+1064697618UL, 456589062UL, 100925184UL, 65280UL, 65280UL, 61440UL,
+4281391953UL, 4281401169UL, 3306553118UL, 1259536131UL, 402718464UL, 151060224UL,
+ 50393088UL, 55296UL, 53760UL, 4278248192UL, 4278253824UL, 3892379392UL,
+2164324864UL, 805371648UL, 352378880UL, 151031040UL, 50361600UL, 29952UL,
+4278247168UL, 4278251264UL, 4261474048UL, 3070286848UL, 1359007232UL, 553701632UL,
+ 151021056UL, 100671744UL, 6912UL, 4278243072UL, 4278245632UL, 4278243840UL,
+3338707456UL, 1912639488UL, 755006976UL, 251682048UL, 100670208UL, 0UL,
+4278240000UL, 4278242304UL, 4278241792UL, 3456139520UL, 2516603136UL, 1308634368UL,
+ 402660864UL, 151000320UL, 0UL, 4278234624UL, 4278237696UL, 4278239488UL,
+3842018560UL, 3170913792UL, 1962946560UL, 905976576UL, 150996480UL, 0UL,
+4278230784UL, 4278229248UL, 4278226944UL, 4009786112UL, 3288358144UL, 2617264128UL,
+1560292608UL, 704649216UL, 768UL, 4293301959UL, 4127165121UL, 1979703064UL,
+ 618921734UL, 113377027UL, 58064640UL, 51576576UL, 64000UL, 58880UL,
+4289820069UL, 3583816940UL, 3234785331UL, 1067056917UL, 357105414UL, 51183360UL,
+ 65280UL, 65280UL, 55296UL, 4281384273UL, 4281589076UL, 3290944563UL,
+1510796291UL, 553713152UL, 100727808UL, 59392UL, 55296UL, 50432UL,
+4278245120UL, 4278248960UL, 3674265856UL, 2113983488UL, 855693056UL, 251705856UL,
+ 39936UL, 29184UL, 18432UL, 4278244352UL, 4278241792UL, 3842027008UL,
+2717948160UL, 1258328832UL, 503352576UL, 151008768UL, 3840UL, 0UL,
+4278239488UL, 4278224640UL, 4009778432UL, 3238022656UL, 1811953152UL, 754985472UL,
+ 251666688UL, 50331648UL, 0UL, 4278223104UL, 4278204672UL, 4026538752UL,
+3355448576UL, 2365591296UL, 1258292736UL, 452984832UL, 100663296UL, 0UL,
+4278211584UL, 4278191616UL, 4026531840UL, 3523215360UL, 2919235584UL, 1761607680UL,
+ 855638016UL, 251658240UL, 0UL, 4278201600UL, 4278190080UL, 4076863488UL,
+3674210304UL, 3271557120UL, 2365587456UL, 1409286144UL, 603979776UL, 0UL,
+4294257206UL, 4160689435UL, 2029977600UL, 318706944UL, 165107459UL, 109928451UL,
+ 52914432UL, 33792UL, 36096UL, 4291571001UL, 4292429923UL, 3319802398UL,
+1070667779UL, 211758339UL, 5331456UL, 1410816UL, 38400UL, 39168UL,
+4283510076UL, 4148707162UL, 3023844942UL, 1764377103UL, 553671936UL, 50363904UL,
+ 34560UL, 33024UL, 31488UL, 4278222336UL, 4278225408UL, 3472906752UL,
+2063611392UL, 855649536UL, 251665920UL, 7680UL, 8448UL, 13056UL,
+4278226176UL, 4278213888UL, 3707773184UL, 2516587776UL, 1207964160UL, 452987904UL,
+ 100663296UL, 0UL, 0UL, 4278209280UL, 4278196224UL, 3707764736UL,
+3019898880UL, 1711276032UL, 754974720UL, 251658240UL, 50331648UL, 0UL,
+4278195456UL, 4278190080UL, 3808428032UL, 3271557120UL, 2164260864UL, 1258291200UL,
+ 503316480UL, 100663296UL, 0UL, 4278192384UL, 4278190080UL, 3808428032UL,
+3388997632UL, 2667577344UL, 1660944384UL, 855638016UL, 251658240UL, 0UL,
+4278190080UL, 4278190080UL, 3791650816UL, 3472883712UL, 3070230528UL, 2063597568UL,
+1358954496UL, 553648128UL, 0UL, 4294705152UL, 4294901760UL, 1878982656UL,
+ 620691456UL, 166264832UL, 161611776UL, 56033280UL, 3145728UL, 1376256UL,
+4291887104UL, 4292871689UL, 3186360320UL, 1172307968UL, 213975040UL, 7667712UL,
+ 4325376UL, 1769472UL, 768UL, 4287628035UL, 4285857792UL, 3378118656UL,
+1968635904UL, 556793856UL, 983040UL, 196608UL, 0UL, 0UL,
+4279369728UL, 4278190080UL, 3305111552UL, 1862270976UL, 1207959552UL, 251658240UL,
+ 0UL, 0UL, 1536UL, 4278193152UL, 4278190080UL, 3640655872UL,
+2516582400UL, 1358954496UL, 503316480UL, 100663296UL, 0UL, 0UL,
+4278190080UL, 4278190080UL, 3707764736UL, 3070230528UL, 1711276032UL, 754974720UL,
+ 251658240UL, 0UL, 0UL, 4278190080UL, 4278190080UL, 3791650816UL,
+3254779904UL, 2113929216UL, 1258291200UL, 503316480UL, 100663296UL, 0UL,
+4278190080UL, 4278190080UL, 3808428032UL, 3321888768UL, 2466250752UL, 1660944384UL,
+ 855638016UL, 251658240UL, 0UL, 4278190080UL, 4261412864UL, 3741319168UL,
+3355443200UL, 2768240640UL, 2063597568UL, 1409286144UL, 553648128UL, 0UL,
+4294705152UL, 4294901760UL, 2382299136UL, 620691456UL, 67043328UL, 113704960UL,
+ 58982400UL, 56623104UL, 3735552UL, 4291166208UL, 4291559424UL, 3320381440UL,
+1122369536UL, 265551872UL, 10616832UL, 6094848UL, 2752512UL, 1376256UL,
+4285267968UL, 4284284928UL, 3528720384UL, 1818427392UL, 660013056UL, 53084160UL,
+ 1179648UL, 196608UL, 0UL, 4278386688UL, 4261412864UL, 3456106496UL,
+2264924160UL, 1207959552UL, 301989888UL, 0UL, 0UL, 0UL,
+4278190080UL, 4278190080UL, 3640655872UL, 2466250752UL, 1358954496UL, 754974720UL,
+ 100663296UL, 0UL, 0UL, 4278190080UL, 4278190080UL, 3791650816UL,
+3170893824UL, 1761607680UL, 905969664UL, 251658240UL, 0UL, 0UL,
+4278190080UL, 4278190080UL, 3808428032UL, 3254779904UL, 2063597568UL, 1157627904UL,
+ 503316480UL, 50331648UL, 0UL, 4278190080UL, 4278190080UL, 3808428032UL,
+3305111552UL, 2164260864UL, 1560281088UL, 754974720UL, 251658240UL, 0UL,
+4278190080UL, 4278190080UL, 3758096384UL, 3338665984UL, 2415919104UL, 1862270976UL,
+1358954496UL, 553648128UL, 0UL, 4294377472UL, 4294901760UL, 2935947264UL,
+ 822018048UL, 67043328UL, 16646144UL, 63242240UL, 9633792UL, 6684672UL,
+4291887104UL, 4289986560UL, 3386900480UL, 1525022720UL, 316211200UL, 12910592UL,
+ 8060928UL, 4915200UL, 3145728UL, 4284481536UL, 4282712064UL, 3560308736UL,
+2670919680UL, 710737920UL, 105578496UL, 2359296UL, 983040UL, 196608UL,
+4278190080UL, 4076863488UL, 3422552064UL, 2516582400UL, 1107296256UL, 352321536UL,
+ 0UL, 0UL, 0UL, 4278190080UL, 4278190080UL, 3489660928UL,
+2516582400UL, 1509949440UL, 855638016UL, 150994944UL, 0UL, 0UL,
+4278190080UL, 4278190080UL, 3758096384UL, 3120562176UL, 1761607680UL, 855638016UL,
+ 452984832UL, 0UL, 0UL, 4278190080UL, 4278190080UL, 3909091328UL,
+3305111552UL, 2113929216UL, 1107296256UL, 553648128UL, 50331648UL, 0UL,
+4278190080UL, 4278190080UL, 3925868544UL, 3355443200UL, 2315255808UL, 1409286144UL,
+ 805306368UL, 251658240UL, 0UL, 4278190080UL, 4278190080UL, 3892314112UL,
+3405774848UL, 2466250752UL, 1560281088UL, 1258291200UL, 553648128UL, 0UL,
+4293525504UL, 4294901760UL, 3456040960UL, 1526661120UL, 268369920UL, 16711680UL,
+ 16187392UL, 63373312UL, 9830400UL, 4291624960UL, 4291690496UL, 3419865088UL,
+1977745408UL, 517341184UL, 13041664UL, 11403264UL, 7077888UL, 5308416UL,
+4284284928UL, 4284088320UL, 3525378048UL, 2270429184UL, 912457728UL, 156303360UL,
+ 3932160UL, 2162688UL, 1376256UL, 4278190080UL, 3959422976UL, 3422552064UL,
+2617245696UL, 1207959552UL, 452984832UL, 0UL, 0UL, 0UL,
+4278190080UL, 3758096384UL, 3405774848UL, 2566914048UL, 1711276032UL, 704643072UL,
+ 201326592UL, 0UL, 0UL, 4278190080UL, 4278190080UL, 3674210304UL,
+2566914048UL, 1660944384UL, 956301312UL, 553648128UL, 50331648UL, 0UL,
+4278190080UL, 4278190080UL, 3892314112UL, 3288334336UL, 2063597568UL, 1157627904UL,
+ 503316480UL, 301989888UL, 0UL, 4278190080UL, 4278190080UL, 4110417920UL,
+3489660928UL, 2516582400UL, 1409286144UL, 654311424UL, 251658240UL, 0UL,
+4278190080UL, 4278190080UL, 4194304000UL, 3573547008UL, 2768240640UL, 1610612736UL,
+ 956301312UL, 603979776UL, 0UL, 4293263360UL, 4294574080UL, 3607035904UL,
+2382299136UL, 771686400UL, 117374976UL, 16711680UL, 16318464UL, 13238272UL,
+4291297280UL, 4291166208UL, 3419013120UL, 2328952832UL, 1020329984UL, 164298752UL,
+ 11993088UL, 10027008UL, 7864320UL, 4284088320UL, 4284284928UL, 3376742400UL,
+2270035968UL, 1364852736UL, 407764992UL, 4325376UL, 3735552UL, 2752512UL,
+4278190080UL, 4143972352UL, 3439329280UL, 2617245696UL, 1409286144UL, 704643072UL,
+ 100663296UL, 0UL, 0UL, 4278190080UL, 3640655872UL, 3372220416UL,
+2566914048UL, 1711276032UL, 855638016UL, 352321536UL, 0UL, 0UL,
+4278190080UL, 4278190080UL, 3271557120UL, 2466250752UL, 1660944384UL, 956301312UL,
+ 503316480UL, 100663296UL, 0UL, 4278190080UL, 4278190080UL, 3791650816UL,
+3170893824UL, 1560281088UL, 905969664UL, 503316480UL, 301989888UL, 0UL,
+4278190080UL, 4278190080UL, 3909091328UL, 3305111552UL, 2164260864UL, 1308622848UL,
+ 704643072UL, 201326592UL, 0UL, 4278190080UL, 4278190080UL, 4278190080UL,
+3640655872UL, 2919235584UL, 1660944384UL, 855638016UL, 553648128UL, 0UL,
+4293525504UL, 4293853184UL, 3858366464UL, 3321823232UL, 2281635840UL, 1124007936UL,
+ 519962624UL, 167641088UL, 16384000UL, 4291297280UL, 3936485376UL, 3350265856UL,
+2579824640UL, 1674117120UL, 667418624UL, 113573888UL, 12648448UL, 12648448UL,
+4284284928UL, 4031250432UL, 3240951808UL, 2268856320UL, 1715994624UL, 1011548160UL,
+ 206045184UL, 4521984UL, 4718592UL, 4278190080UL, 3976200192UL, 3355443200UL,
+2264924160UL, 1610612736UL, 1207959552UL, 503316480UL, 50331648UL, 0UL,
+4278190080UL, 4278190080UL, 3456106496UL, 2667577344UL, 1761607680UL, 1207959552UL,
+ 704643072UL, 150994944UL, 0UL, 4278190080UL, 4278190080UL, 3573547008UL,
+2516582400UL, 1761607680UL, 1056964608UL, 704643072UL, 301989888UL, 0UL,
+4278190080UL, 4278190080UL, 3758096384UL, 3120562176UL, 1610612736UL, 1056964608UL,
+ 553648128UL, 301989888UL, 0UL, 4278190080UL, 4278190080UL, 3841982464UL,
+3271557120UL, 2113929216UL, 855638016UL, 603979776UL, 251658240UL, 0UL,
+4278190080UL, 4278190080UL, 3523215360UL, 2818572288UL, 1912602624UL, 1358954496UL,
+ 905969664UL, 402653184UL, 0UL,
+};
+
+// 600x600x2, ClMlxx - Photo Best, MLC Both
+
+uint32_t ulMapDJ3600_ClMlxx_6x6x2[ 9 * 9 * 9 ] =
+{
+ 0UL, 983040UL, 6291456UL, 13762560UL, 16711680UL, 16711680UL,
+ 16719360UL, 16750080UL, 16768256UL, 12619776UL, 13383936UL, 11403264UL,
+ 14614528UL, 16711680UL, 16711680UL, 16726272UL, 16761344UL, 16768768UL,
+ 15098624UL, 15478016UL, 16728576UL, 16715520UL, 16714752UL, 16740096UL,
+ 16769024UL, 16776192UL, 16776960UL, 15808768UL, 15803392UL, 16736256UL,
+ 16758528UL, 16741632UL, 16772864UL, 16776960UL, 16776960UL, 16776960UL,
+ 12807168UL, 12407808UL, 13156352UL, 14084608UL, 14417664UL, 14089984UL,
+ 14352128UL, 14876416UL, 15662848UL, 5357824UL, 4174080UL, 4973568UL,
+ 7732992UL, 8322816UL, 8912640UL, 9305856UL, 12779264UL, 13893376UL,
+ 1824768UL, 1232384UL, 1436672UL, 2621184UL, 3800832UL, 3407616UL,
+ 3604224UL, 6946560UL, 11075328UL, 846336UL, 648192UL, 652544UL,
+ 1048320UL, 2227968UL, 2031360UL, 1834752UL, 1441536UL, 5766912UL,
+ 62208UL, 64768UL, 65280UL, 65280UL, 65280UL, 65280UL,
+ 65280UL, 65280UL, 65280UL, 2804224UL, 57344UL, 50176UL,
+ 2378496UL, 9057024UL, 15160320UL, 16750080UL, 16765696UL, 16771328UL,
+ 10475008UL, 13349888UL, 11640576UL, 14903552UL, 16726272UL, 16724736UL,
+ 16738560UL, 16763904UL, 16776192UL, 15180288UL, 16017664UL, 16757760UL,
+ 16760832UL, 16761856UL, 16765440UL, 16771840UL, 16776192UL, 16776960UL,
+ 15879680UL, 15746304UL, 16763136UL, 16768768UL, 16772608UL, 16776960UL,
+ 16776960UL, 16776960UL, 16776960UL, 12683776UL, 12764672UL, 13172224UL,
+ 13827840UL, 13762304UL, 13827840UL, 14089984UL, 14417664UL, 14876416UL,
+ 4576512UL, 5570304UL, 6553344UL, 7143168UL, 7732992UL, 7929600UL,
+ 9109248UL, 11075328UL, 13172480UL, 1048320UL, 1048320UL, 2031360UL,
+ 2424576UL, 3211008UL, 3211008UL, 3211008UL, 4980480UL, 9109248UL,
+ 851712UL, 65280UL, 65280UL, 65280UL, 458496UL, 655104UL,
+ 655104UL, 851712UL, 3800832UL, 65280UL, 65280UL, 65280UL,
+ 65280UL, 65280UL, 65280UL, 65280UL, 65280UL, 65280UL,
+ 2025984UL, 458496UL, 65280UL, 2031360UL, 11075328UL, 15859456UL,
+ 16776960UL, 16776960UL, 16776960UL, 6942208UL, 8122112UL, 12254976UL,
+ 13238016UL, 15400704UL, 16776960UL, 16776960UL, 16776960UL, 16776960UL,
+ 14019840UL, 16380672UL, 16773376UL, 16776960UL, 16776960UL, 16776960UL,
+ 16776960UL, 16776960UL, 16776960UL, 16297472UL, 16761856UL, 16775168UL,
+ 16776960UL, 16776960UL, 16776960UL, 16776960UL, 16776960UL, 16776960UL,
+ 13030400UL, 12975872UL, 13172480UL, 13631232UL, 13500160UL, 13696768UL,
+ 13958912UL, 14417664UL, 14941952UL, 5570304UL, 5963520UL, 7339776UL,
+ 7929600UL, 7929600UL, 7732992UL, 9109248UL, 11468544UL, 13106944UL,
+ 1244928UL, 1638144UL, 2424576UL, 3014400UL, 3014400UL, 3211008UL,
+ 3407616UL, 5766912UL, 9109248UL, 458496UL, 65280UL, 65280UL,
+ 458496UL, 458496UL, 655104UL, 851712UL, 1048320UL, 3800832UL,
+ 65280UL, 65280UL, 65280UL, 65280UL, 65280UL, 65280UL,
+ 65280UL, 65280UL, 65280UL, 2024704UL, 844800UL, 1631232UL,
+ 1633536UL, 13369088UL, 16776960UL, 16776960UL, 16776960UL, 16776960UL,
+ 5372160UL, 3798528UL, 13434624UL, 14745344UL, 16645888UL, 16776960UL,
+ 16776960UL, 16776960UL, 16776960UL, 10287616UL, 15138048UL, 16776960UL,
+ 16776960UL, 16776960UL, 16776960UL, 16776960UL, 16776960UL, 16776960UL,
+ 15266816UL, 16776960UL, 16776960UL, 16775680UL, 16776960UL, 16776960UL,
+ 16776960UL, 16776960UL, 16580352UL, 13369088UL, 13434624UL, 13958912UL,
+ 14024448UL, 14155008UL, 14024448UL, 14089984UL, 14745344UL, 15138560UL,
+ 6946560UL, 7143168UL, 8322816UL, 8322816UL, 8912640UL, 8912640UL,
+ 9895680UL, 12058368UL, 13238016UL, 1834752UL, 2621184UL, 3211008UL,
+ 3604224UL, 3800832UL, 3800832UL, 4194048UL, 6553344UL, 9895680UL,
+ 655104UL, 65280UL, 458496UL, 851712UL, 1048320UL, 1048320UL,
+ 1244928UL, 1441536UL, 4587264UL, 65280UL, 65280UL, 65280UL,
+ 65280UL, 65280UL, 65280UL, 65280UL, 65280UL, 63232UL,
+ 3782400UL, 1219584UL, 2006784UL, 4963584UL, 8506624UL, 16774400UL,
+ 16776960UL, 16776960UL, 16776960UL, 11651584UL, 12700160UL, 14796288UL,
+ 15911424UL, 16766976UL, 16774912UL, 16776960UL, 16776960UL, 16776960UL,
+ 15453952UL, 16764416UL, 16763904UL, 16765440UL, 16767488UL, 16772864UL,
+ 16776960UL, 16776960UL, 16776960UL, 16765440UL, 16764160UL, 16764160UL,
+ 16767232UL, 16765952UL, 16769536UL, 16775168UL, 16776960UL, 16776960UL,
+ 14144256UL, 14145792UL, 14603520UL, 14734336UL, 14470912UL, 14408448UL,
+ 14217728UL, 14810880UL, 14941952UL, 8319488UL, 9105920UL, 10087680UL,
+ 10086144UL, 9888000UL, 10081536UL, 10676736UL, 12450304UL, 13565696UL,
+ 2424576UL, 3407616UL, 4389376UL, 4779520UL, 4385536UL, 4972800UL,
+ 4775936UL, 6746880UL, 10091264UL, 655104UL, 458496UL, 851712UL,
+ 1438976UL, 1436928UL, 1435904UL, 1434112UL, 1630720UL, 5171712UL,
+ 65280UL, 65280UL, 65280UL, 65024UL, 62720UL, 60416UL,
+ 59136UL, 58368UL, 54784UL, 5923584UL, 2572032UL, 3949824UL,
+ 7495680UL, 13534976UL, 14788608UL, 16767744UL, 16774656UL, 16776960UL,
+ 12740864UL, 15236608UL, 16279808UL, 16675328UL, 16746240UL, 16760064UL,
+ 16767744UL, 16773888UL, 16776960UL, 16742400UL, 16748544UL, 16746240UL,
+ 16745472UL, 16747776UL, 16758528UL, 16766720UL, 16772864UL, 16776960UL,
+ 16749312UL, 16749312UL, 16747776UL, 16747008UL, 16749312UL, 16755456UL,
+ 16764160UL, 16770048UL, 16776960UL, 14592000UL, 15181824UL, 15501824UL,
+ 15307520UL, 14656000UL, 15178752UL, 15582208UL, 15784448UL, 15988992UL,
+ 10461696UL, 10665216UL, 10857984UL, 11248896UL, 10854144UL, 10062336UL,
+ 11056896UL, 12047104UL, 13300480UL, 3592192UL, 4772864UL, 5558016UL,
+ 5556992UL, 5359104UL, 5745408UL, 5545728UL, 6736640UL, 9691904UL,
+ 649216UL, 1041408UL, 1629184UL, 1824000UL, 1822208UL, 1819648UL,
+ 2013696UL, 2406912UL, 5164288UL, 64256UL, 63488UL, 60160UL,
+ 56832UL, 54528UL, 51968UL, 49664UL, 48384UL, 43008UL,
+ 9252096UL, 7671552UL, 10229760UL, 9054720UL, 12596736UL, 14838784UL,
+ 15632896UL, 16763648UL, 16769024UL, 13707008UL, 15477248UL, 16720896UL,
+ 16723200UL, 16726272UL, 16737024UL, 16750080UL, 16762880UL, 16767744UL,
+ 16725504UL, 16727808UL, 16730880UL, 16728576UL, 16730112UL, 16733184UL,
+ 16749312UL, 16762112UL, 16766208UL, 16731648UL, 16733184UL, 16732416UL,
+ 16730880UL, 16730880UL, 16732416UL, 16742400UL, 16759296UL, 16765696UL,
+ 15555840UL, 15815680UL, 15749376UL, 15618304UL, 15420160UL, 16275200UL,
+ 16673792UL, 16754688UL, 16764672UL, 11627520UL, 12019968UL, 12606720UL,
+ 12734720UL, 12211968UL, 11426304UL, 12212736UL, 13273600UL, 13682176UL,
+ 5332224UL, 5928960UL, 6124032UL, 6120960UL, 5922048UL, 5724672UL,
+ 5327616UL, 7307520UL, 8306688UL, 1024512UL, 1421568UL, 2009856UL,
+ 2400000UL, 2397696UL, 2195712UL, 2778624UL, 2777856UL, 4958208UL,
+ 52992UL, 52224UL, 50944UL, 49920UL, 46848UL, 39936UL,
+ 30720UL, 31488UL, 27648UL, 11013888UL, 11012352UL, 13373184UL,
+ 11802624UL, 10819584UL, 13840384UL, 15358464UL, 15886592UL, 16756992UL,
+ 14484992UL, 16713216UL, 16712448UL, 16713984UL, 16715520UL, 16719360UL,
+ 16732416UL, 16740096UL, 16751616UL, 16714752UL, 16716288UL, 16717056UL,
+ 16716288UL, 16717056UL, 16718592UL, 16728576UL, 16737792UL, 16747008UL,
+ 16718592UL, 16720128UL, 16719360UL, 16719360UL, 16718592UL, 16720128UL,
+ 16720128UL, 16733184UL, 16745472UL, 16590592UL, 16000000UL, 15868928UL,
+ 15737856UL, 15541248UL, 16720128UL, 16721664UL, 16727808UL, 16743168UL,
+ 12924416UL, 13120256UL, 13050880UL, 12986880UL, 12790272UL, 12723968UL,
+ 13313792UL, 13644544UL, 14643712UL, 6698496UL, 6699264UL, 7287552UL,
+ 7679232UL, 7087872UL, 6892032UL, 6498816UL, 7680000UL, 10641408UL,
+ 1779456UL, 2376192UL, 2571264UL, 2568960UL, 2567424UL, 2566656UL,
+ 2566656UL, 2170368UL, 3952896UL, 29952UL, 29184UL, 25344UL,
+ 23040UL, 21504UL, 18432UL, 16896UL, 15360UL, 15360UL,
+ 10420224UL, 13434880UL, 14551296UL, 14619136UL, 14818816UL, 15410944UL,
+ 15806464UL, 16070144UL, 16205056UL, 14614528UL, 16711680UL, 16711680UL,
+ 16711680UL, 16711680UL, 16713984UL, 16715520UL, 16721664UL, 16723200UL,
+ 16711680UL, 16711680UL, 16711680UL, 16711680UL, 16711680UL, 16711680UL,
+ 16711680UL, 16719360UL, 16718592UL, 16711680UL, 16711680UL, 16711680UL,
+ 16711680UL, 16711680UL, 16711680UL, 16711680UL, 16713984UL, 16716288UL,
+ 16711680UL, 16711680UL, 16711680UL, 16711680UL, 15533568UL, 16711680UL,
+ 16711680UL, 16711680UL, 16715520UL, 14024704UL, 13959168UL, 14221312UL,
+ 13437184UL, 13175808UL, 12651520UL, 13631488UL, 14352384UL, 14485760UL,
+ 7864320UL, 7274496UL, 8847360UL, 10027008UL, 8063232UL, 8064000UL,
+ 7080960UL, 9633792UL, 9830400UL, 2555904UL, 2555904UL, 2949120UL,
+ 3538944UL, 3932160UL, 3541248UL, 3345408UL, 3145728UL, 4915200UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL,
+};
+
+
+// 300x300x1, KCMY - Plain Draft, MLC Both
+
+uint32_t ulMapDJ3600_KCMY_3x3x1[ 9 * 9 * 9 ] =
+{
+4294967040UL, 4294967040UL, 4294967040UL, 4294967040UL, 2801794816UL, 1862270720UL,
+1157627648UL, 486080256UL, 16056064UL, 4294967040UL, 4294967040UL, 4294967040UL,
+4009754368UL, 2600468224UL, 1795161856UL, 1090518784UL, 418709248UL, 15531776UL,
+4294967040UL, 4294967040UL, 4294967040UL, 4294967040UL, 2264923904UL, 1291845376UL,
+ 720699136UL, 249233152UL, 14483200UL, 4290576128UL, 4291624704UL, 4294967040UL,
+4294967040UL, 3841982208UL, 1591017216UL, 717029120UL, 346881792UL, 11468544UL,
+4286643968UL, 4287168256UL, 4287692544UL, 4288741120UL, 4206952192UL, 2931752704UL,
+1251278592UL, 444399360UL, 8716032UL, 4284022528UL, 4283891456UL, 4283629312UL,
+4282711808UL, 4284153600UL, 2557542144UL, 1920270080UL, 744292096UL, 6356736UL,
+4281925376UL, 4281532160UL, 4280745728UL, 4279566080UL, 4279959296UL, 2418474752UL,
+1345781504UL, 808779520UL, 3735296UL, 4279959296UL, 4279828224UL, 4279041792UL,
+4278648576UL, 4278779648UL, 2819292928UL, 1410268928UL, 638910208UL, 1376000UL,
+4278255360UL, 4278255360UL, 4278255360UL, 4278255360UL, 4278255360UL, 3288399616UL,
+1946222336UL, 838926080UL, 65280UL, 4294967040UL, 4294967040UL, 4294967040UL,
+1962934016UL, 1157627648UL, 687865600UL, 452984576UL, 150798080UL, 16776960UL,
+4294967040UL, 4294967040UL, 4294967040UL, 2399141632UL, 1124073216UL, 183303936UL,
+ 13958912UL, 13041408UL, 12517120UL, 4294967040UL, 4294967040UL, 4294967040UL,
+1825636096UL, 717291264UL, 280690432UL, 11468544UL, 11337472UL, 11599616UL,
+4289920768UL, 4288347904UL, 4286906112UL, 3264413440UL, 1115488000UL, 444792576UL,
+ 42139392UL, 9109248UL, 9633536UL, 4286643968UL, 4283760384UL, 4281794304UL,
+3963420416UL, 1749483264UL, 810483456UL, 240582400UL, 6487808UL, 7274240UL,
+4284022528UL, 4280876800UL, 4280090368UL, 4280090368UL, 2451635968UL, 1076297472UL,
+ 539950848UL, 104529664UL, 5046016UL, 4281794304UL, 4279172864UL, 4279041792UL,
+4279041792UL, 3188522752UL, 1678704384UL, 672202496UL, 270073600UL, 2555648UL,
+4279959296UL, 4278253568UL, 4278384128UL, 4278386432UL, 3523411712UL, 2147680000UL,
+1074069248UL, 335871744UL, 458496UL, 4278255360UL, 4278250496UL, 4278251008UL,
+4278253568UL, 3791716096UL, 2617310976UL, 1543569152UL, 671153920UL, 65280UL,
+4294967040UL, 4294959616UL, 4294966784UL, 1627389696UL, 1023409920UL, 653721344UL,
+ 284491520UL, 183828224UL, 16776960UL, 4294967040UL, 4294967040UL, 4294967040UL,
+1022689024UL, 49610496UL, 16056064UL, 15793920UL, 14483200UL, 13958912UL,
+4294967040UL, 4294967040UL, 3938373632UL, 2260790784UL, 447676160UL, 10944256UL,
+ 10682112UL, 10682112UL, 10419968UL, 4289658624UL, 4288610048UL, 4284676096UL,
+2490687488UL, 846397184UL, 175570688UL, 8191744UL, 8978176UL, 9502464UL,
+4286381824UL, 4284546816UL, 4281270016UL, 3157589760UL, 1346174720UL, 507969280UL,
+ 72548096UL, 6356736UL, 7405312UL, 4284022528UL, 4281007872UL, 4279559168UL,
+3625511936UL, 1981611776UL, 908001024UL, 338231040UL, 3735296UL, 5046016UL,
+4281794304UL, 4279169536UL, 4278508032UL, 3960002560UL, 2517167616UL, 1343028992UL,
+ 537722624UL, 202964736UL, 2817792UL, 4279828224UL, 4278378496UL, 4278242816UL,
+4261466624UL, 3019955712UL, 1912664576UL, 973274880UL, 268631808UL, 851712UL,
+4278255360UL, 4278245888UL, 4278240768UL, 4278242816UL, 3321943552UL, 2315312640UL,
+1442902528UL, 570490624UL, 65280UL, 4294939136UL, 4294933504UL, 4294939648UL,
+3271535616UL, 1056957952UL, 586481408UL, 250937088UL, 116719360UL, 16776960UL,
+4294937600UL, 4294930432UL, 3909052928UL, 1190558208UL, 150255104UL, 16048640UL,
+ 16056064UL, 16056064UL, 15007488UL, 4294943744UL, 4294940160UL, 4073224192UL,
+2296154624UL, 417374208UL, 14073856UL, 13163520UL, 12514304UL, 11992832UL,
+4289769984UL, 4290034688UL, 4286087680UL, 2289598976UL, 1316788224UL, 74629632UL,
+ 7918592UL, 8185856UL, 8322816UL, 4286371328UL, 4285321216UL, 4281902080UL,
+3057426432UL, 1447858688UL, 373995008UL, 5555712UL, 6609920UL, 7271936UL,
+4283753984UL, 4281387008UL, 4280068608UL, 3658918912UL, 1880926720UL, 773897216UL,
+ 137024512UL, 4118528UL, 5171712UL, 4281788928UL, 4279549952UL, 4278889472UL,
+3758662656UL, 2316085760UL, 1242348032UL, 437045248UL, 102553600UL, 3331584UL,
+4279820800UL, 4278501376UL, 4278234112UL, 3993019392UL, 2717951488UL, 1811984384UL,
+ 906150912UL, 235063808UL, 1366528UL, 4278248960UL, 4278239232UL, 4278234624UL,
+4227900416UL, 3053496832UL, 2281744896UL, 1543548928UL, 637585408UL, 47616UL,
+4294924288UL, 4294918656UL, 4294918656UL, 2566875648UL, 1828680192UL, 754951168UL,
+ 250922496UL, 116710400UL, 16773632UL, 4294919680UL, 4294189056UL, 4294191104UL,
+1324627968UL, 317999616UL, 16024064UL, 16034304UL, 16040448UL, 16045568UL,
+4294200832UL, 4292358656UL, 4074518016UL, 1861499904UL, 452218368UL, 15626752UL,
+ 14455296UL, 14201856UL, 13814272UL, 4288965120UL, 4286071808UL, 4286071296UL,
+2256294912UL, 1384930304UL, 144075264UL, 10258432UL, 10396160UL, 9879552UL,
+4286480896UL, 4285562368UL, 4282405376UL, 2756466176UL, 1448237056UL, 710175232UL,
+ 5801984UL, 6330368UL, 6600192UL, 4283735552UL, 4281893376UL, 4280315392UL,
+3894308864UL, 1948675584UL, 909142016UL, 103974400UL, 4496384UL, 5551616UL,
+4281510400UL, 4279536128UL, 4279008256UL, 3926685184UL, 2349627392UL, 1242593280UL,
+ 437553152UL, 1875968UL, 3714048UL, 4279809024UL, 4278621696UL, 4278486528UL,
+4060249088UL, 2550298624UL, 1678014976UL, 939820544UL, 201625600UL, 1482240UL,
+4278237184UL, 4278231040UL, 4278226944UL, 4278224896UL, 2818605056UL, 2080406016UL,
+1476426752UL, 671126016UL, 36864UL, 4294915584UL, 4294912000UL, 4294908928UL,
+2566860288UL, 1358906368UL, 822036480UL, 452228608UL, 116690944UL, 16754688UL,
+4294914560UL, 4294186496UL, 4294184960UL, 1995707392UL, 452206080UL, 16003584UL,
+ 16016384UL, 16023040UL, 16028160UL, 4294914560UL, 4291957248UL, 4007006720UL,
+2297698816UL, 687087616UL, 16004096UL, 15752192UL, 14972416UL, 14978048UL,
+4289084928UL, 4286324224UL, 4286717440UL, 2290755072UL, 1050946048UL, 145502720UL,
+ 11162112UL, 11300864UL, 11308032UL, 4285682176UL, 4284365824UL, 4283313152UL,
+2656185344UL, 1381380096UL, 845167104UL, 74075648UL, 7629312UL, 8162304UL,
+4283718144UL, 4282010624UL, 4280694272UL, 3794286080UL, 1848653312UL, 842020352UL,
+ 406209536UL, 4614656UL, 5540352UL, 4281363968UL, 4279653376UL, 4279127040UL,
+4161817600UL, 2450542592UL, 1209547776UL, 471353344UL, 2516992UL, 3833856UL,
+4279663104UL, 4278609920UL, 4278476800UL, 4261698560UL, 2651085824UL, 1543787008UL,
+ 872698880UL, 168320512UL, 1733120UL, 4278224384UL, 4278220288UL, 4278218240UL,
+4278217216UL, 2885706752UL, 1744854016UL, 1342198784UL, 738223104UL, 25088UL,
+4294910464UL, 4294906880UL, 4294184448UL, 3539931648UL, 1358895616UL, 452926464UL,
+ 419375616UL, 183782912UL, 16740352UL, 4294909952UL, 4294182912UL, 4294181376UL,
+2901672448UL, 854853632UL, 15995904UL, 16001024UL, 16009728UL, 16014848UL,
+4294908928UL, 4293790720UL, 4293526528UL, 2733900800UL, 1022625280UL, 83104256UL,
+ 16001024UL, 16008704UL, 16013312UL, 4289602048UL, 4286580224UL, 4287235584UL,
+2694581248UL, 1387008000UL, 381556224UL, 12460544UL, 12206080UL, 12474368UL,
+4285672448UL, 4283307008UL, 4283568640UL, 2690126336UL, 1415451648UL, 711989760UL,
+ 108535808UL, 8403968UL, 9067520UL, 4282922496UL, 4281870336UL, 4281211392UL,
+2754615808UL, 1681135616UL, 842668032UL, 541204480UL, 5126144UL, 6315008UL,
+4281481216UL, 4279642112UL, 4279508992UL, 4162068480UL, 2417500160UL, 1243225088UL,
+ 437918720UL, 237383680UL, 3560448UL, 4279517696UL, 4278729216UL, 4278596608UL,
+4278596608UL, 2818979328UL, 1644573696UL, 738863104UL, 235678720UL, 1856000UL,
+4278211072UL, 4278209024UL, 4278207488UL, 4278207488UL, 2952806912UL, 1778401280UL,
+1006646784UL, 704657920UL, 15360UL, 4294906368UL, 4294312960UL, 4294182400UL,
+4176741888UL, 2197030912UL, 821955072UL, 218041856UL, 83103744UL, 16725504UL,
+4294839808UL, 4294180864UL, 4294180864UL, 3371433984UL, 1693712384UL, 351535104UL,
+ 15994368UL, 15997440UL, 16002048UL, 4294839808UL, 4293918720UL, 4293394432UL,
+3069313024UL, 1827930112UL, 552861696UL, 15993856UL, 15997440UL, 16001024UL,
+4289990656UL, 4289070080UL, 4289200640UL, 2896560640UL, 1890976256UL, 918684672UL,
+ 114296832UL, 13506048UL, 13772800UL, 4285797376UL, 4283695104UL, 4283826176UL,
+2724200448UL, 1449132032UL, 1047922688UL, 411437568UL, 9441792UL, 10233856UL,
+4282784256UL, 4281994752UL, 4164027904UL, 2822243840UL, 1648100864UL, 775947264UL,
+ 542247424UL, 39325696UL, 6958080UL, 4280818688UL, 4279504896UL, 4229303808UL,
+2887388672UL, 1780222976UL, 1008601600UL, 438438400UL, 271323136UL, 4073472UL,
+4279507456UL, 4278719488UL, 4278587904UL, 4261810176UL, 2751991808UL, 1678381056UL,
+ 738856448UL, 168430080UL, 1845248UL, 4278199808UL, 4278198272UL, 4278197248UL,
+4278197248UL, 3321896448UL, 2013274624UL, 1140859392UL, 469768704UL, 8704UL,
+4294901760UL, 4294901760UL, 4294901760UL, 4294901760UL, 3607035904UL, 1996423168UL,
+ 956235776UL, 385810432UL, 16711680UL, 4294901760UL, 4294180864UL, 4294180864UL,
+3706978304UL, 2499018752UL, 1223950336UL, 485752832UL, 83099648UL, 15990784UL,
+4294901760UL, 4293787648UL, 4293394432UL, 3337486336UL, 2465464320UL, 1593049088UL,
+ 552861696UL, 49545216UL, 15990784UL, 4291821568UL, 4289724416UL, 4289986560UL,
+3064725504UL, 2360868864UL, 1723858944UL, 852492288UL, 114950144UL, 14417920UL,
+4287234048UL, 4285923328UL, 4286054400UL, 3598581760UL, 1987969024UL, 1619263488UL,
+1049624576UL, 345899008UL, 10616832UL, 4283564032UL, 4282777600UL, 4283564032UL,
+3025010688UL, 1917452288UL, 1112145920UL, 978714624UL, 442892288UL, 7340032UL,
+4280942592UL, 4280025088UL, 4280811520UL, 2854354944UL, 1814167552UL, 1009123328UL,
+ 640417792UL, 473825280UL, 4456448UL, 4279107584UL, 4278583296UL, 4278452224UL,
+4278976512UL, 1946944512UL, 1141637632UL, 672399360UL, 336986112UL, 2490368UL,
+4278190080UL, 4278190080UL, 4278190080UL, 3791650816UL, 2684354560UL, 1879048192UL,
+1140850688UL, 436207616UL, 0UL,
+};
+
+// 300x300x1, ClMlxx - Plain Draft, MLC Both
+
+uint32_t ulMapDJ3600_ClMlxx_3x3x1[ 9 * 9 * 9 ] =
+{
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL,
+};
+
diff --git a/prnt/hpcups/dj400ColorMaps.cpp b/prnt/hpcups/dj400ColorMaps.cpp
new file mode 100644
index 0000000..b8e3a19
--- /dev/null
+++ b/prnt/hpcups/dj400ColorMaps.cpp
@@ -0,0 +1,203 @@
+/*****************************************************************************\
+ dj400ColorMaps.cpp : Color maps for DJ400
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+#include "CommonDefinitions.h"
+
+uint32_t ulMapDJ400_K[ 9 * 9 * 9 ]=
+// DJ400_K
+ {
+ 200UL, 117UL, 116UL, 113UL, 108UL, 101UL, 94UL, 86UL, 79UL,
+ 114UL, 114UL, 112UL, 109UL, 104UL, 99UL, 91UL, 84UL, 77UL,
+ 100UL, 100UL, 99UL, 96UL, 92UL, 87UL, 83UL, 77UL, 70UL,
+ 81UL, 81UL, 80UL, 78UL, 76UL, 72UL, 68UL, 62UL, 57UL,
+ 57UL, 57UL, 57UL, 56UL, 55UL, 53UL, 51UL, 49UL, 47UL,
+ 45UL, 44UL, 44UL, 44UL, 43UL, 42UL, 41UL, 40UL, 38UL,
+ 32UL, 32UL, 32UL, 32UL, 32UL, 31UL, 30UL, 29UL, 27UL,
+ 21UL, 21UL, 21UL, 21UL, 21UL, 20UL, 19UL, 18UL, 17UL,
+ 11UL, 11UL, 11UL, 10UL, 10UL, 10UL, 9UL, 9UL, 8UL,
+ 116UL, 116UL, 115UL, 112UL, 107UL, 100UL, 93UL, 85UL, 79UL,
+ 113UL, 113UL, 111UL, 108UL, 103UL, 98UL, 90UL, 84UL, 77UL,
+ 100UL, 99UL, 98UL, 95UL, 91UL, 87UL, 83UL, 76UL, 69UL,
+ 80UL, 80UL, 79UL, 78UL, 75UL, 72UL, 68UL, 61UL, 56UL,
+ 57UL, 57UL, 57UL, 56UL, 55UL, 53UL, 51UL, 49UL, 47UL,
+ 44UL, 44UL, 44UL, 44UL, 43UL, 42UL, 41UL, 39UL, 37UL,
+ 32UL, 32UL, 32UL, 32UL, 32UL, 31UL, 30UL, 28UL, 27UL,
+ 21UL, 21UL, 21UL, 21UL, 20UL, 20UL, 19UL, 18UL, 17UL,
+ 11UL, 11UL, 11UL, 10UL, 10UL, 9UL, 9UL, 9UL, 8UL,
+ 112UL, 112UL, 110UL, 107UL, 103UL, 97UL, 90UL, 84UL, 76UL,
+ 109UL, 108UL, 107UL, 104UL, 100UL, 94UL, 88UL, 82UL, 75UL,
+ 96UL, 96UL, 94UL, 92UL, 88UL, 84UL, 80UL, 74UL, 68UL,
+ 78UL, 78UL, 77UL, 75UL, 73UL, 70UL, 66UL, 59UL, 55UL,
+ 56UL, 56UL, 56UL, 55UL, 54UL, 52UL, 50UL, 48UL, 46UL,
+ 44UL, 44UL, 43UL, 43UL, 42UL, 41UL, 40UL, 39UL, 37UL,
+ 32UL, 32UL, 32UL, 32UL, 31UL, 30UL, 29UL, 28UL, 27UL,
+ 21UL, 21UL, 21UL, 20UL, 20UL, 19UL, 19UL, 18UL, 17UL,
+ 10UL, 10UL, 10UL, 10UL, 10UL, 9UL, 9UL, 8UL, 8UL,
+ 103UL, 103UL, 102UL, 100UL, 95UL, 90UL, 84UL, 79UL, 72UL,
+ 100UL, 100UL, 99UL, 97UL, 92UL, 88UL, 83UL, 77UL, 70UL,
+ 89UL, 89UL, 88UL, 86UL, 84UL, 80UL, 76UL, 70UL, 63UL,
+ 73UL, 73UL, 72UL, 71UL, 69UL, 66UL, 60UL, 56UL, 53UL,
+ 54UL, 54UL, 53UL, 53UL, 51UL, 50UL, 49UL, 47UL, 45UL,
+ 42UL, 42UL, 42UL, 42UL, 41UL, 40UL, 39UL, 38UL, 36UL,
+ 31UL, 31UL, 31UL, 30UL, 30UL, 29UL, 28UL, 27UL, 26UL,
+ 20UL, 20UL, 20UL, 20UL, 19UL, 19UL, 18UL, 17UL, 16UL,
+ 10UL, 10UL, 10UL, 9UL, 9UL, 9UL, 9UL, 8UL, 8UL,
+ 91UL, 91UL, 90UL, 88UL, 85UL, 83UL, 78UL, 72UL, 65UL,
+ 89UL, 89UL, 88UL, 86UL, 84UL, 81UL, 76UL, 70UL, 63UL,
+ 82UL, 81UL, 81UL, 79UL, 76UL, 73UL, 68UL, 63UL, 57UL,
+ 67UL, 67UL, 66UL, 64UL, 61UL, 58UL, 56UL, 53UL, 50UL,
+ 51UL, 50UL, 50UL, 50UL, 49UL, 48UL, 47UL, 45UL, 43UL,
+ 40UL, 40UL, 40UL, 40UL, 39UL, 38UL, 37UL, 36UL, 34UL,
+ 29UL, 29UL, 29UL, 29UL, 28UL, 28UL, 27UL, 26UL, 24UL,
+ 19UL, 19UL, 19UL, 18UL, 18UL, 18UL, 17UL, 16UL, 15UL,
+ 9UL, 9UL, 9UL, 9UL, 9UL, 8UL, 8UL, 8UL, 7UL,
+ 81UL, 80UL, 80UL, 78UL, 75UL, 72UL, 68UL, 62UL, 56UL,
+ 79UL, 78UL, 78UL, 76UL, 74UL, 70UL, 67UL, 59UL, 56UL,
+ 71UL, 71UL, 70UL, 69UL, 67UL, 63UL, 58UL, 56UL, 52UL,
+ 57UL, 57UL, 57UL, 56UL, 55UL, 53UL, 51UL, 49UL, 47UL,
+ 48UL, 48UL, 47UL, 47UL, 46UL, 45UL, 44UL, 42UL, 40UL,
+ 38UL, 38UL, 38UL, 37UL, 37UL, 36UL, 34UL, 33UL, 32UL,
+ 27UL, 27UL, 27UL, 27UL, 26UL, 26UL, 25UL, 24UL, 23UL,
+ 17UL, 17UL, 17UL, 17UL, 16UL, 16UL, 15UL, 15UL, 14UL,
+ 8UL, 8UL, 8UL, 8UL, 8UL, 8UL, 8UL, 7UL, 7UL,
+ 68UL, 68UL, 67UL, 65UL, 62UL, 59UL, 56UL, 53UL, 50UL,
+ 66UL, 66UL, 65UL, 63UL, 60UL, 58UL, 56UL, 52UL, 50UL,
+ 58UL, 58UL, 58UL, 57UL, 56UL, 54UL, 51UL, 49UL, 48UL,
+ 51UL, 51UL, 50UL, 50UL, 49UL, 48UL, 47UL, 45UL, 43UL,
+ 43UL, 43UL, 43UL, 43UL, 42UL, 41UL, 40UL, 38UL, 37UL,
+ 34UL, 34UL, 34UL, 34UL, 33UL, 32UL, 31UL, 30UL, 29UL,
+ 25UL, 25UL, 24UL, 24UL, 24UL, 23UL, 23UL, 22UL, 20UL,
+ 15UL, 15UL, 15UL, 15UL, 15UL, 14UL, 14UL, 13UL, 12UL,
+ 8UL, 8UL, 8UL, 7UL, 7UL, 7UL, 7UL, 7UL, 7UL,
+ 54UL, 54UL, 54UL, 53UL, 52UL, 50UL, 49UL, 47UL, 45UL,
+ 53UL, 53UL, 53UL, 52UL, 51UL, 50UL, 48UL, 47UL, 45UL,
+ 50UL, 50UL, 50UL, 49UL, 48UL, 48UL, 46UL, 44UL, 42UL,
+ 46UL, 46UL, 45UL, 45UL, 44UL, 43UL, 42UL, 40UL, 38UL,
+ 39UL, 39UL, 39UL, 38UL, 38UL, 37UL, 35UL, 34UL, 32UL,
+ 30UL, 30UL, 30UL, 30UL, 29UL, 29UL, 28UL, 27UL, 25UL,
+ 22UL, 22UL, 22UL, 21UL, 21UL, 20UL, 19UL, 19UL, 17UL,
+ 13UL, 13UL, 13UL, 13UL, 12UL, 12UL, 11UL, 10UL, 9UL,
+ 7UL, 7UL, 7UL, 7UL, 7UL, 7UL, 6UL, 6UL, 6UL,
+ 47UL, 47UL, 46UL, 46UL, 45UL, 44UL, 43UL, 41UL, 39UL,
+ 46UL, 46UL, 46UL, 45UL, 45UL, 44UL, 42UL, 40UL, 39UL,
+ 44UL, 44UL, 44UL, 43UL, 42UL, 41UL, 40UL, 39UL, 37UL,
+ 40UL, 40UL, 40UL, 39UL, 38UL, 38UL, 36UL, 35UL, 33UL,
+ 33UL, 33UL, 33UL, 33UL, 32UL, 32UL, 31UL, 29UL, 28UL,
+ 26UL, 26UL, 26UL, 26UL, 25UL, 24UL, 24UL, 23UL, 22UL,
+ 18UL, 18UL, 18UL, 18UL, 17UL, 17UL, 16UL, 15UL, 15UL,
+ 10UL, 10UL, 10UL, 10UL, 9UL, 9UL, 9UL, 8UL, 8UL,
+ 6UL, 6UL, 6UL, 6UL, 6UL, 6UL, 5UL, 5UL, 0
+ };
+unsigned long ulMapDJ400_CMY[ 9 * 9 * 9 ]=
+ // DJ400_CMY
+ {
+ 3033033472UL, 2142592512UL, 1689278976UL, 1235967232UL, 849175296UL, 545942272UL, 326726144UL, 174816000UL, 6063616UL,
+ 3347731712UL, 2257149952UL, 1653892352UL, 1184065536UL, 797273344UL, 511079680UL, 325680384UL, 156927488UL, 5082624UL,
+ 3361952256UL, 2540068864UL, 1701340672UL, 1164800768UL, 778663680UL, 509509376UL, 307332352UL, 122064640UL, 4232960UL,
+ 3191886592UL, 2621923072UL, 1783131392UL, 1162376448UL, 759725312UL, 474055680UL, 255495168UL, 104175360UL, 3317504UL,
+ 2988921856UL, 2486001920UL, 1747938304UL, 1143961856UL, 690716160UL, 439126272UL, 237605120UL, 86416640UL, 2466816UL,
+ 2853656832UL, 2317051648UL, 1696429056UL, 1126072320UL, 723289856UL, 421170432UL, 236557824UL, 85631488UL, 1812224UL,
+ 2819318272UL, 2282647552UL, 1678736896UL, 1141934336UL, 739217408UL, 454006272UL, 218995456UL, 84911616UL, 1289472UL,
+ 2869193984UL, 2282061056UL, 1694927872UL, 1158058752UL, 772184832UL, 470196736UL, 268805888UL, 84258048UL, 701696UL,
+ 2969598208UL, 2264958976UL, 1694537216UL, 1208000000UL, 838903040UL, 553692160UL, 318813184UL, 134265344UL, 48640UL,
+ 3384753408UL, 2495429888UL, 1740324096UL, 1203456512UL, 800346368UL, 548035328UL, 329016576UL, 159936256UL, 7632896UL,
+ 3514842112UL, 2257605888UL, 1905609728UL, 1469533184UL, 1016090368UL, 679826432UL, 410606336UL, 208298496UL, 6123520UL,
+ 3529129728UL, 2607498496UL, 1802129152UL, 1366250496UL, 1030705920UL, 677992960UL, 425484032UL, 223503872UL, 4748288UL,
+ 3325706240UL, 2605270272UL, 1967934720UL, 1364153856UL, 1012029952UL, 676225024UL, 407332096UL, 205417216UL, 3767552UL,
+ 3139780864UL, 2419016960UL, 1899186944UL, 1362580480UL, 943217408UL, 641229568UL, 372467968UL, 170815488UL, 2851328UL,
+ 3038070272UL, 2317109248UL, 1797214208UL, 1310873600UL, 908353536UL, 572810752UL, 354774528UL, 153121792UL, 1999872UL,
+ 3054128640UL, 2249149952UL, 1729123840UL, 1276272128UL, 890529280UL, 588606208UL, 320171776UL, 152401408UL, 1410560UL,
+ 3137558528UL, 2164610048UL, 1644518656UL, 1258644992UL, 906456064UL, 604532736UL, 336163840UL, 118061056UL, 756224UL,
+ 3154141440UL, 2164284416UL, 1593860352UL, 1258318080UL, 956330752UL, 654342144UL, 385907968UL, 167805952UL, 36864UL,
+ 3485149696UL, 2613324544UL, 1791372544UL, 1170681856UL, 784611840UL, 532562176UL, 330779904UL, 145381888UL, 9593856UL,
+ 3632671488UL, 2744465152UL, 2107259136UL, 1503278848UL, 1016413440UL, 680280064UL, 411256320UL, 225988352UL, 7166976UL,
+ 3629459968UL, 2725000704UL, 1852588544UL, 1466908416UL, 1097810176UL, 745292544UL, 459425536UL, 240733184UL, 5396736UL,
+ 3426168320UL, 2638754816UL, 2051815936UL, 1397507072UL, 1045383168UL, 726550272UL, 441011200UL, 239292672UL, 4153344UL,
+ 3257085952UL, 2536388096UL, 1983068672UL, 1395933440UL, 976635648UL, 691620352UL, 422924288UL, 204559616UL, 3106304UL,
+ 3205772032UL, 2468099840UL, 1897872128UL, 1394688256UL, 1008944896UL, 639912960UL, 405099264UL, 170023424UL, 2189824UL,
+ 3272292096UL, 2416851712UL, 1812938496UL, 1360020736UL, 991120640UL, 655708672UL, 353654272UL, 135617280UL, 1403648UL,
+ 3372433152UL, 2365865984UL, 1728267008UL, 1258375168UL, 956518400UL, 637883904UL, 352803072UL, 101080320UL, 748288UL,
+ 3321907200UL, 2348828160UL, 1694516992UL, 1275087104UL, 1006653696UL, 721443072UL, 436231168UL, 201351424UL, 27648UL,
+ 3501530368UL, 2663783936UL, 1842093824UL, 1204494592UL, 768091136UL, 499591680UL, 298136064UL, 130235904UL, 11618816UL,
+ 3682868480UL, 2760910336UL, 2090346752UL, 1503275520UL, 999959040UL, 647245824UL, 395129600UL, 193214976UL, 8472064UL,
+ 3646299392UL, 2775197696UL, 2121280768UL, 1584541696UL, 1098067712UL, 745616384UL, 459748608UL, 241252864UL, 6177792UL,
+ 3459652864UL, 2655528704UL, 2085432832UL, 1330395904UL, 1045313536UL, 760232192UL, 491534336UL, 256392192UL, 4408320UL,
+ 3340902656UL, 2569873152UL, 2050108672UL, 1463038464UL, 993277696UL, 708393728UL, 456473344UL, 255082240UL, 3361536UL,
+ 3323208704UL, 2568694528UL, 1998532096UL, 1461727488UL, 1025652480UL, 690240256UL, 438582784UL, 220480512UL, 2380288UL,
+ 3389662976UL, 2584685824UL, 1947217920UL, 1460745216UL, 1058224128UL, 722746624UL, 420757504UL, 185943808UL, 1528576UL,
+ 3523423232UL, 2584031488UL, 1879323648UL, 1375877120UL, 1023621888UL, 721764352UL, 403129344UL, 134694656UL, 742144UL,
+ 3456119552UL, 2550150912UL, 1879062784UL, 1392523776UL, 1073757696UL, 788546304UL, 503334400UL, 234900224UL, 21248UL,
+ 3534689024UL, 2613253120UL, 1791694080UL, 1154028800UL, 734467584UL, 449321216UL, 264969728UL, 114107904UL, 13185536UL,
+ 3648787200UL, 2726959616UL, 2023037952UL, 1453137408UL, 983375616UL, 630792192UL, 378741760UL, 176891904UL, 9580800UL,
+ 3646034944UL, 2791644160UL, 2121080832UL, 1584603648UL, 1131815680UL, 729097216UL, 443492096UL, 208153344UL, 7025152UL,
+ 3560248320UL, 2739150080UL, 2135826944UL, 1582310912UL, 1112615168UL, 760424704UL, 491924224UL, 256716288UL, 4993792UL,
+ 3441497088UL, 2603358976UL, 2083594496UL, 1547052288UL, 993472256UL, 742010112UL, 490221056UL, 271986432UL, 3552512UL,
+ 3407025920UL, 2652577536UL, 2099258112UL, 1545676288UL, 1092823296UL, 673393664UL, 438579200UL, 254095872UL, 2505728UL,
+ 3540654592UL, 2702123264UL, 2098275584UL, 1544759296UL, 1108617984UL, 739520000UL, 437530624UL, 202716416UL, 1523712UL,
+ 3758300672UL, 2785420032UL, 2030446336UL, 1510222336UL, 1107635456UL, 772091904UL, 453391104UL, 168244736UL, 672000UL,
+ 3640665088UL, 2751473664UL, 2046831360UL, 1526738432UL, 1157640448UL, 838873856UL, 570439424UL, 285227264UL, 16384UL,
+ 3601533696UL, 2613251072UL, 1741491200UL, 1120734208UL, 717818880UL, 432540672UL, 231608320UL, 97916416UL, 14295040UL,
+ 3732278016UL, 2709852416UL, 1989088000UL, 1419252736UL, 949753088UL, 630854656UL, 362223104UL, 160766208UL, 10493440UL,
+ 3763211264UL, 2841645568UL, 2103973376UL, 1534072832UL, 1081546752UL, 729225216UL, 427104768UL, 191765504UL, 7676160UL,
+ 3744730112UL, 2839614208UL, 2186024960UL, 1582308096UL, 1146362880UL, 777395200UL, 492182528UL, 240328448UL, 5645312UL,
+ 3659599104UL, 2771194624UL, 2184452096UL, 1597446912UL, 1127882496UL, 758915072UL, 490414080UL, 272179968UL, 4007168UL,
+ 3591572480UL, 2719748608UL, 2166429696UL, 1596070400UL, 1092820480UL, 656744960UL, 438706944UL, 271066112UL, 2697216UL,
+ 3708424192UL, 2819560960UL, 2215778816UL, 1662262528UL, 1159012352UL, 739648000UL, 437527040UL, 236398080UL, 1649920UL,
+ 3976401920UL, 2953189376UL, 2215058176UL, 1644568320UL, 1174872320UL, 805708544UL, 503850240UL, 218638080UL, 667136UL,
+ 3925874688UL, 3019906048UL, 2248154624UL, 1677730304UL, 1241523200UL, 905979392UL, 603990016UL, 318777856UL, 12032UL,
+ 3702457600UL, 2647393536UL, 1725302016UL, 1104741632UL, 718669056UL, 433325568UL, 232064256UL, 65079808UL, 15274496UL,
+ 3849651456UL, 2726496768UL, 1955465984UL, 1385761536UL, 949947136UL, 647957248UL, 379390720UL, 178064640UL, 11211264UL,
+ 3964339456UL, 2975664640UL, 2120551680UL, 1517227520UL, 1081609728UL, 746262272UL, 444206592UL, 209063680UL, 8196864UL,
+ 4013098496UL, 3040938752UL, 2253000192UL, 1615925248UL, 1180111104UL, 827986432UL, 509219328UL, 240718336UL, 6231296UL,
+ 3978429952UL, 3056405248UL, 2352221952UL, 1681461504UL, 1195054080UL, 809309696UL, 524162304UL, 272504320UL, 4462336UL,
+ 3927180544UL, 3021802240UL, 2367950592UL, 1697059328UL, 1193874688UL, 740824832UL, 455677696UL, 271325440UL, 3086592UL,
+ 3943237120UL, 3004172800UL, 2350058752UL, 1729433856UL, 1209471744UL, 739710208UL, 387389184UL, 253368576UL, 1842176UL,
+ 4110617344UL, 3137735936UL, 2399670272UL, 1778979328UL, 1258952192UL, 839456512UL, 520755200UL, 235543040UL, 794112UL,
+ 4143976192UL, 3271561472UL, 2449478400UL, 1828721920UL, 1325406208UL, 956307968UL, 637541120UL, 335551232UL, 7936UL,
+ 3820355840UL, 2748907520UL, 1776812032UL, 1156448256UL, 770441216UL, 485031936UL, 249888768UL, 49021184UL, 16058368UL,
+ 3983999232UL, 2777023232UL, 1972700160UL, 1403061248UL, 984089600UL, 665519104UL, 413795328UL, 195757056UL, 12257024UL,
+ 4081844480UL, 3126658048UL, 2187789568UL, 1584596224UL, 1132267008UL, 796919296UL, 511772160UL, 260113664UL, 9111296UL,
+ 4130668800UL, 3275949056UL, 2454324736UL, 1767048960UL, 1247545088UL, 878774272UL, 576980992UL, 274990848UL, 6948608UL,
+ 4163043584UL, 3324969984UL, 2587297280UL, 1866139392UL, 1312819712UL, 910363392UL, 608570112UL, 306645504UL, 5048576UL,
+ 4162322944UL, 3357475840UL, 2653292288UL, 1948911616UL, 1378683392UL, 892144640UL, 573508864UL, 288361216UL, 3607296UL,
+ 4178379264UL, 3356689408UL, 2652309248UL, 1981417472UL, 1411123968UL, 907807744UL, 521932288UL, 253627648UL, 2231552UL,
+ 4211343872UL, 3355902976UL, 2601059840UL, 1930037248UL, 1393297664UL, 906758656UL, 554437376UL, 235802112UL, 986624UL,
+ 4227860224UL, 3489662720UL, 2684356608UL, 2046822656UL, 1493175040UL, 1040190720UL, 671092224UL, 352325120UL, 3840UL,
+ 3870818304UL, 2849505280UL, 1961689088UL, 1307836416UL, 888471552UL, 619642880UL, 367984640UL, 184025088UL, 16711680UL,
+ 4001234944UL, 3096772608UL, 2242772992UL, 1555890176UL, 1086521344UL, 734396416UL, 482869248UL, 248119296UL, 13303808UL,
+ 4099014656UL, 3446079488UL, 2541289472UL, 1804009472UL, 1251147776UL, 865730560UL, 580714496UL, 312279040UL, 10420224UL,
+ 4147707904UL, 3695706112UL, 2891251712UL, 2053111808UL, 1433010176UL, 1014038528UL, 678821888UL, 360185856UL, 8060928UL,
+ 4180213760UL, 3878813696UL, 3158114304UL, 2319777792UL, 1632305152UL, 1112604672UL, 727187456UL, 375062528UL, 6029312UL,
+ 4196139008UL, 3995271168UL, 3257532416UL, 2469396480UL, 1765081088UL, 1194917888UL, 758906880UL, 373227520UL, 4325376UL,
+ 4229038080UL, 3977576448UL, 3273261056UL, 2552168448UL, 1847721984UL, 1277427712UL, 790953984UL, 388431872UL, 2752512UL,
+ 4245159936UL, 3960078336UL, 3222077440UL, 2500788224UL, 1829765120UL, 1259470848UL, 806486016UL, 387055616UL, 1376256UL,
+ 4278190080UL, 3774873600UL, 3103784960UL, 2382364672UL, 1744830464UL, 1241513984UL, 805306368UL, 419430400UL, 0
+ };
+
diff --git a/prnt/hpcups/dj400PrintModes.h b/prnt/hpcups/dj400PrintModes.h
new file mode 100644
index 0000000..6a0a6ee
--- /dev/null
+++ b/prnt/hpcups/dj400PrintModes.h
@@ -0,0 +1,20 @@
+PrintMode dj400PrintModes[] =
+{
+ {
+ "PlainNormalColor",
+ {300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300},
+ {1, 1, 1, 1, 1, 1}, 3, FED,
+ {ulMapDJ400_CMY, NULL, NULL},
+ 300, 300, false, HTBinary_open, HTBinary_open
+ },
+ {
+ "PlainNormalGray",
+ {300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300},
+ {1, 1, 1, 1, 1, 1}, 1, FED,
+ {ulMapDJ400_K, NULL, NULL},
+ 300, 300, false, HTBinary_open, HTBinary_open
+ }
+};
+
diff --git a/prnt/hpcups/dj4100ColorMaps.cpp b/prnt/hpcups/dj4100ColorMaps.cpp
new file mode 100644
index 0000000..33cd309
--- /dev/null
+++ b/prnt/hpcups/dj4100ColorMaps.cpp
@@ -0,0 +1,3569 @@
+/*****************************************************************************\
+ dj4100_cmap.cpp : Implimentation for the DJ4100 color maps
+
+ Copyright (c) 1996 - 2006, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\***************************************************************************/
+
+#include "CommonDefinitions.h"
+
+
+// 600x600x1, KCMY - Plain Normal
+
+unsigned char ucMapDJ4100_KCMY_6x6x1[] =
+{
+ 195, 37, 28, 16, 151, 131, 67, 9, 110, 219, 103, 2, 94, 238, 102, 0, 76, 243, 93, 0, 60, 245, 90, 0, 49, 246, 89, 0,
+ 42, 247, 86, 0, 35, 248, 84, 0, 30, 249, 81, 0, 25, 250, 79, 0, 21, 250, 78, 0, 17, 251, 77, 0, 12, 252, 74, 0,
+ 8, 253, 72, 0, 4, 254, 71, 0, 0, 255, 70, 0, 148, 130, 14, 114, 99, 232, 30, 0, 102, 236, 109, 0, 87, 240, 103, 0,
+ 68, 244, 102, 0, 55, 246, 97, 0, 47, 246, 95, 0, 40, 247, 91, 0, 34, 248, 87, 0, 29, 249, 84, 0, 25, 250, 81, 0,
+ 21, 250, 80, 0, 17, 251, 78, 0, 13, 252, 76, 0, 9, 253, 73, 0, 5, 254, 71, 0, 0, 254, 69, 0, 101, 222, 1, 210,
+ 98, 220, 1, 117, 83, 237, 30, 0, 77, 241, 68, 0, 63, 244, 90, 0, 53, 246, 96, 0, 44, 247, 96, 0, 38, 248, 93, 0,
+ 32, 248, 89, 0, 28, 249, 86, 0, 24, 250, 84, 0, 20, 250, 81, 0, 17, 251, 80, 0, 13, 252, 77, 0, 9, 253, 74, 0,
+ 5, 253, 71, 0, 0, 253, 68, 0, 85, 224, 0, 211, 81, 227, 0, 145, 76, 233, 0, 54, 67, 239, 22, 0, 56, 243, 52, 0,
+ 45, 246, 68, 0, 38, 247, 78, 0, 33, 248, 82, 0, 29, 249, 83, 0, 25, 250, 84, 0, 22, 250, 84, 0, 18, 251, 82, 0,
+ 15, 252, 79, 0, 11, 252, 76, 0, 8, 253, 72, 0, 4, 254, 70, 0, 0, 253, 66, 0, 66, 224, 1, 218, 64, 227, 0, 178,
+ 61, 233, 0, 114, 59, 237, 0, 40, 52, 243, 16, 0, 41, 246, 35, 0, 33, 248, 49, 0, 28, 249, 58, 0, 24, 250, 64, 0,
+ 21, 250, 68, 0, 18, 251, 72, 0, 16, 251, 72, 0, 12, 252, 71, 0, 9, 253, 69, 0, 6, 253, 67, 0, 3, 254, 65, 0,
+ 0, 250, 62, 0, 49, 226, 0, 228, 49, 226, 1, 200, 45, 233, 0, 152, 43, 237, 0, 88, 43, 242, 0, 30, 38, 246, 11, 0,
+ 30, 248, 24, 0, 25, 249, 35, 0, 20, 250, 45, 0, 17, 251, 52, 0, 15, 252, 57, 0, 12, 252, 59, 0, 10, 253, 60, 0,
+ 7, 253, 60, 0, 4, 253, 60, 0, 1, 251, 59, 0, 0, 240, 56, 0, 36, 227, 0, 237, 36, 225, 1, 217, 33, 232, 0, 183,
+ 32, 236, 0, 129, 31, 241, 0, 71, 31, 245, 0, 26, 28, 248, 7, 0, 23, 249, 16, 0, 19, 250, 25, 0, 15, 251, 34, 0,
+ 12, 252, 42, 0, 9, 252, 47, 0, 6, 252, 50, 0, 4, 249, 51, 0, 2, 245, 52, 0, 0, 238, 53, 2, 0, 225, 50, 0,
+ 26, 226, 1, 246, 27, 227, 0, 234, 26, 228, 0, 208, 24, 234, 0, 164, 23, 239, 0, 108, 23, 244, 0, 60, 23, 247, 0, 22,
+ 21, 250, 3, 0, 17, 251, 11, 0, 14, 252, 19, 0, 10, 252, 27, 0, 6, 250, 37, 3, 1, 242, 46, 8, 0, 233, 48, 7,
+ 0, 224, 47, 5, 0, 217, 46, 2, 0, 209, 44, 0, 17, 220, 4, 249, 18, 227, 2, 246, 19, 227, 1, 228, 17, 233, 0, 194,
+ 16, 237, 0, 144, 16, 241, 0, 93, 16, 245, 0, 51, 16, 249, 0, 21, 15, 251, 1, 0, 12, 252, 7, 0, 9, 251, 16, 2,
+ 4, 247, 27, 7, 0, 234, 36, 10, 0, 223, 38, 7, 0, 213, 39, 4, 0, 204, 39, 2, 0, 196, 38, 0, 10, 214, 7, 249,
+ 10, 220, 5, 249, 12, 228, 2, 241, 12, 230, 1, 214, 10, 234, 1, 177, 9, 237, 3, 127, 10, 242, 3, 81, 11, 247, 0, 45,
+ 11, 250, 0, 20, 11, 252, 0, 0, 6, 247, 11, 6, 1, 242, 20, 10, 0, 230, 25, 9, 0, 220, 28, 6, 0, 210, 30, 4,
+ 0, 199, 32, 2, 0, 188, 32, 0, 5, 212, 9, 250, 5, 216, 7, 250, 7, 224, 4, 247, 9, 228, 1, 227, 8, 233, 0, 199,
+ 7, 235, 2, 158, 7, 239, 3, 112, 8, 245, 1, 71, 9, 249, 0, 40, 9, 251, 0, 18, 9, 253, 0, 0, 1, 243, 14, 10,
+ 0, 230, 17, 8, 0, 219, 20, 5, 0, 209, 23, 3, 0, 198, 25, 2, 0, 186, 26, 0, 2, 212, 10, 250, 3, 215, 8, 250,
+ 4, 221, 5, 249, 7, 228, 1, 241, 7, 231, 0, 216, 7, 234, 0, 184, 6, 237, 2, 142, 6, 242, 2, 98, 7, 247, 0, 63,
+ 7, 250, 0, 36, 8, 251, 0, 17, 8, 253, 0, 0, 0, 240, 13, 10, 0, 224, 14, 6, 0, 211, 16, 3, 0, 199, 19, 1,
+ 0, 186, 21, 0, 1, 213, 9, 250, 1, 215, 7, 250, 3, 219, 5, 250, 5, 226, 1, 248, 6, 229, 0, 230, 5, 233, 0, 205,
+ 5, 234, 0, 167, 6, 238, 0, 123, 6, 244, 0, 85, 6, 248, 0, 56, 6, 250, 0, 34, 6, 252, 0, 16, 6, 253, 0, 0,
+ 0, 237, 11, 7, 0, 218, 12, 3, 0, 202, 14, 1, 0, 189, 16, 0, 1, 215, 6, 250, 2, 217, 5, 250, 2, 219, 3, 250,
+ 4, 224, 0, 249, 4, 229, 0, 242, 4, 231, 0, 218, 4, 233, 0, 189, 4, 236, 0, 149, 4, 240, 0, 109, 4, 245, 0, 77,
+ 4, 249, 0, 51, 4, 251, 0, 31, 4, 252, 0, 15, 5, 254, 0, 0, 0, 233, 9, 5, 0, 212, 10, 2, 0, 194, 12, 0,
+ 1, 217, 3, 250, 2, 218, 2, 250, 2, 220, 1, 250, 3, 223, 0, 250, 2, 228, 0, 247, 3, 229, 0, 227, 2, 231, 0, 204,
+ 3, 233, 0, 172, 3, 237, 0, 133, 3, 242, 0, 99, 3, 247, 0, 70, 3, 249, 0, 47, 3, 251, 0, 29, 3, 253, 0, 14,
+ 3, 254, 0, 0, 0, 228, 7, 2, 0, 204, 8, 0, 1, 220, 0, 250, 2, 220, 0, 250, 2, 220, 0, 250, 1, 222, 0, 250,
+ 1, 225, 0, 247, 1, 226, 0, 232, 1, 228, 0, 213, 1, 230, 0, 188, 1, 234, 0, 156, 1, 239, 0, 120, 1, 243, 0, 90,
+ 1, 247, 0, 65, 1, 250, 0, 44, 1, 252, 0, 28, 1, 253, 0, 14, 2, 255, 0, 0, 0, 224, 5, 0, 0, 221, 0, 250,
+ 0, 221, 0, 250, 0, 221, 0, 250, 0, 221, 0, 250, 0, 221, 0, 244, 0, 222, 0, 234, 0, 224, 0, 219, 0, 227, 0, 200,
+ 0, 230, 0, 175, 0, 235, 0, 142, 0, 240, 0, 110, 0, 243, 0, 83, 0, 247, 0, 60, 0, 249, 0, 42, 0, 251, 0, 27,
+ 0, 254, 0, 14, 0, 255, 0, 0, 170, 27, 82, 59, 147, 60, 128, 8, 114, 177, 177, 2, 92, 230, 175, 2, 76, 237, 152, 2,
+ 59, 243, 141, 1, 49, 248, 135, 0, 40, 249, 128, 0, 32, 250, 124, 0, 28, 250, 115, 0, 24, 250, 106, 0, 19, 251, 99, 0,
+ 15, 252, 93, 0, 11, 252, 86, 0, 7, 253, 80, 0, 3, 253, 76, 0, 0, 249, 72, 0, 149, 27, 14, 130, 146, 49, 33, 18,
+ 93, 238, 108, 0, 79, 239, 118, 1, 68, 245, 117, 0, 61, 246, 114, 0, 52, 247, 107, 0, 43, 247, 101, 0, 35, 248, 95, 0,
+ 29, 249, 88, 0, 24, 250, 84, 0, 19, 251, 81, 0, 15, 252, 78, 0, 11, 252, 74, 0, 7, 253, 72, 0, 3, 253, 70, 0,
+ 0, 241, 66, 0, 105, 173, 2, 232, 100, 224, 0, 209, 91, 185, 11, 13, 73, 235, 69, 1, 62, 244, 91, 0, 54, 246, 96, 0,
+ 46, 247, 94, 0, 39, 247, 90, 0, 32, 248, 85, 0, 27, 249, 81, 0, 23, 250, 78, 0, 18, 251, 76, 0, 14, 252, 74, 0,
+ 10, 253, 72, 0, 6, 253, 70, 0, 3, 253, 69, 0, 0, 243, 67, 0, 81, 210, 2, 240, 80, 219, 2, 196, 74, 224, 2, 95,
+ 72, 219, 5, 8, 56, 238, 42, 2, 46, 245, 64, 0, 38, 247, 73, 0, 32, 248, 78, 0, 27, 249, 79, 0, 23, 250, 78, 0,
+ 20, 251, 77, 0, 16, 251, 75, 0, 12, 252, 73, 0, 9, 253, 71, 0, 5, 254, 70, 0, 2, 253, 68, 0, 0, 242, 65, 0,
+ 60, 221, 2, 243, 62, 223, 1, 217, 58, 231, 0, 155, 56, 228, 3, 74, 55, 222, 5, 14, 43, 241, 25, 1, 33, 247, 43, 0,
+ 28, 249, 54, 0, 24, 250, 60, 0, 20, 250, 64, 0, 16, 251, 67, 0, 13, 252, 68, 0, 10, 253, 67, 0, 7, 253, 66, 0,
+ 4, 254, 66, 0, 1, 252, 64, 0, 0, 238, 61, 0, 44, 225, 1, 242, 46, 225, 1, 229, 44, 229, 0, 188, 41, 235, 0, 124,
+ 40, 236, 1, 57, 39, 241, 1, 13, 33, 247, 13, 0, 26, 249, 28, 0, 20, 250, 40, 0, 17, 251, 47, 0, 13, 252, 52, 0,
+ 11, 252, 55, 0, 8, 253, 56, 0, 5, 254, 58, 0, 2, 253, 58, 0, 0, 247, 57, 0, 0, 229, 55, 0, 32, 226, 1, 246,
+ 33, 227, 1, 238, 34, 226, 1, 211, 31, 234, 0, 163, 29, 239, 0, 100, 29, 243, 0, 47, 29, 246, 0, 14, 26, 248, 5, 0,
+ 20, 250, 18, 0, 15, 251, 29, 0, 11, 252, 37, 0, 8, 253, 43, 0, 5, 254, 46, 0, 2, 253, 49, 0, 1, 249, 50, 0,
+ 0, 235, 50, 0, 0, 217, 50, 0, 24, 221, 3, 249, 24, 227, 1, 246, 26, 227, 1, 229, 23, 232, 0, 193, 22, 237, 0, 139,
+ 22, 242, 0, 84, 21, 246, 0, 42, 21, 248, 0, 16, 21, 249, 1, 1, 15, 250, 12, 0, 10, 252, 22, 1, 6, 252, 30, 0,
+ 3, 249, 36, 0, 1, 243, 40, 0, 0, 231, 42, 1, 0, 218, 42, 0, 0, 206, 44, 0, 16, 214, 7, 249, 17, 222, 4, 249,
+ 17, 228, 1, 242, 18, 228, 1, 217, 16, 234, 0, 176, 15, 240, 0, 120, 15, 244, 0, 72, 15, 247, 0, 37, 14, 249, 0, 18,
+ 13, 248, 2, 6, 9, 249, 11, 4, 5, 249, 19, 4, 1, 241, 28, 5, 0, 229, 32, 3, 0, 216, 34, 1, 0, 205, 35, 0,
+ 0, 193, 38, 0, 7, 207, 11, 250, 9, 215, 7, 250, 10, 224, 3, 248, 12, 228, 1, 229, 10, 233, 0, 199, 9, 237, 0, 153,
+ 9, 242, 0, 103, 9, 246, 1, 63, 8, 247, 2, 36, 8, 249, 2, 19, 6, 244, 7, 13, 1, 241, 16, 13, 0, 236, 20, 9,
+ 0, 225, 23, 4, 0, 212, 25, 1, 0, 198, 28, 0, 0, 181, 32, 0, 4, 205, 10, 250, 2, 209, 10, 250, 3, 217, 7, 250,
+ 7, 228, 0, 243, 6, 231, 0, 217, 5, 235, 0, 183, 5, 239, 0, 134, 5, 241, 0, 87, 4, 243, 2, 55, 3, 243, 4, 34,
+ 3, 244, 4, 19, 0, 236, 11, 17, 0, 229, 13, 10, 0, 220, 15, 5, 0, 211, 18, 1, 0, 197, 22, 0, 0, 179, 26, 0,
+ 2, 204, 10, 250, 0, 207, 8, 250, 0, 213, 6, 250, 3, 224, 0, 249, 3, 229, 0, 233, 2, 233, 0, 205, 2, 233, 0, 161,
+ 3, 233, 0, 110, 2, 236, 2, 74, 1, 237, 4, 50, 1, 238, 5, 31, 1, 239, 5, 19, 0, 228, 7, 12, 0, 217, 9, 6,
+ 0, 208, 12, 2, 0, 197, 16, 0, 0, 180, 21, 0, 0, 205, 10, 250, 0, 207, 4, 250, 0, 212, 3, 250, 1, 219, 0, 248,
+ 1, 223, 0, 236, 1, 225, 0, 211, 1, 225, 0, 177, 0, 227, 1, 132, 0, 229, 2, 94, 0, 231, 3, 65, 0, 231, 4, 42,
+ 0, 234, 3, 27, 0, 235, 3, 15, 0, 221, 5, 8, 0, 208, 7, 4, 0, 197, 10, 1, 0, 182, 16, 0, 0, 206, 7, 250,
+ 0, 207, 2, 249, 0, 209, 1, 246, 0, 211, 1, 241, 0, 214, 0, 230, 0, 214, 1, 209, 0, 214, 1, 183, 0, 218, 1, 145,
+ 0, 221, 1, 107, 0, 225, 1, 78, 0, 227, 2, 55, 0, 228, 2, 36, 0, 231, 1, 22, 0, 230, 1, 11, 0, 215, 4, 5,
+ 0, 200, 6, 2, 0, 186, 11, 0, 0, 209, 5, 250, 0, 203, 1, 242, 0, 203, 0, 237, 0, 204, 0, 232, 0, 206, 0, 224,
+ 0, 205, 0, 208, 0, 206, 0, 186, 0, 210, 0, 155, 0, 214, 0, 121, 0, 218, 0, 92, 0, 222, 0, 67, 0, 224, 1, 47,
+ 0, 226, 0, 31, 0, 228, 0, 18, 0, 226, 1, 8, 0, 209, 4, 3, 0, 194, 8, 0, 0, 211, 2, 250, 0, 201, 0, 237,
+ 0, 199, 0, 231, 0, 200, 0, 227, 0, 201, 0, 220, 0, 200, 0, 207, 0, 201, 0, 189, 0, 204, 0, 164, 0, 209, 0, 134,
+ 0, 213, 0, 105, 0, 218, 0, 80, 0, 221, 0, 60, 0, 223, 0, 41, 0, 226, 0, 27, 0, 228, 0, 15, 0, 225, 1, 5,
+ 0, 208, 6, 0, 0, 214, 0, 250, 0, 207, 0, 229, 0, 207, 0, 228, 0, 207, 0, 225, 0, 207, 0, 220, 0, 207, 0, 210,
+ 0, 207, 0, 195, 0, 209, 0, 175, 0, 214, 0, 149, 0, 218, 0, 121, 0, 224, 0, 95, 0, 229, 0, 72, 0, 231, 0, 54,
+ 0, 234, 0, 36, 0, 236, 0, 23, 0, 237, 0, 12, 0, 239, 0, 0, 145, 17, 135, 102, 131, 12, 166, 60, 101, 79, 222, 0,
+ 89, 147, 211, 0, 71, 193, 198, 1, 53, 222, 192, 2, 42, 242, 185, 3, 37, 243, 168, 2, 29, 249, 155, 1, 25, 251, 145, 0,
+ 22, 251, 130, 0, 18, 251, 117, 0, 14, 252, 106, 0, 9, 253, 97, 0, 5, 253, 88, 0, 2, 250, 81, 0, 0, 240, 74, 0,
+ 132, 13, 84, 167, 118, 26, 128, 92, 92, 123, 164, 6, 71, 196, 178, 5, 59, 236, 179, 3, 53, 241, 169, 2, 44, 246, 155, 1,
+ 36, 250, 140, 0, 30, 250, 127, 0, 25, 250, 117, 0, 20, 251, 108, 0, 16, 251, 100, 0, 12, 252, 92, 0, 8, 253, 85, 0,
+ 4, 254, 80, 0, 1, 251, 76, 0, 0, 232, 69, 0, 104, 14, 1, 239, 101, 24, 12, 186, 83, 65, 40, 24, 65, 189, 84, 11,
+ 51, 238, 105, 3, 44, 246, 107, 1, 38, 248, 103, 0, 32, 249, 97, 0, 27, 249, 91, 0, 22, 250, 86, 0, 18, 251, 83, 0,
+ 14, 252, 79, 0, 10, 253, 76, 0, 6, 253, 73, 0, 3, 253, 71, 0, 1, 249, 69, 0, 0, 227, 62, 0, 79, 114, 7, 248,
+ 76, 143, 8, 228, 70, 157, 19, 120, 69, 145, 24, 26, 50, 211, 57, 11, 39, 243, 71, 2, 32, 248, 78, 0, 27, 249, 78, 0,
+ 23, 250, 77, 0, 19, 251, 76, 0, 15, 251, 74, 0, 12, 252, 72, 0, 8, 253, 70, 0, 5, 254, 69, 0, 2, 253, 68, 0,
+ 0, 245, 66, 0, 0, 225, 62, 0, 57, 166, 10, 248, 57, 197, 6, 242, 56, 209, 6, 194, 52, 191, 14, 95, 51, 168, 21, 28,
+ 40, 219, 37, 10, 29, 245, 48, 1, 24, 249, 58, 0, 19, 251, 64, 0, 15, 251, 68, 0, 11, 252, 69, 0, 8, 253, 69, 0,
+ 5, 254, 68, 0, 3, 253, 68, 0, 1, 249, 66, 0, 0, 237, 63, 0, 0, 220, 59, 0, 41, 197, 8, 248, 42, 213, 4, 245,
+ 43, 223, 2, 224, 39, 227, 3, 155, 38, 209, 13, 75, 39, 207, 11, 23, 31, 240, 16, 2, 23, 247, 30, 1, 18, 250, 42, 0,
+ 13, 251, 50, 0, 10, 253, 54, 0, 7, 253, 57, 0, 4, 253, 59, 0, 1, 251, 60, 0, 0, 243, 58, 0, 0, 231, 56, 0,
+ 0, 214, 55, 0, 29, 209, 7, 248, 30, 218, 4, 247, 31, 225, 1, 237, 29, 231, 0, 191, 28, 234, 1, 120, 28, 235, 2, 57,
+ 27, 240, 2, 20, 25, 245, 6, 2, 18, 248, 20, 1, 12, 250, 31, 2, 8, 251, 40, 2, 5, 252, 44, 0, 2, 252, 48, 0,
+ 0, 247, 50, 0, 0, 234, 50, 0, 0, 220, 49, 0, 0, 207, 50, 0, 21, 209, 8, 249, 22, 216, 5, 249, 23, 226, 1, 245,
+ 24, 227, 1, 214, 21, 235, 0, 161, 20, 239, 0, 96, 20, 242, 1, 49, 20, 244, 1, 21, 18, 243, 4, 5, 13, 245, 15, 3,
+ 6, 246, 28, 7, 2, 243, 36, 7, 0, 239, 40, 5, 0, 233, 41, 1, 0, 220, 41, 0, 0, 210, 42, 0, 0, 200, 44, 0,
+ 13, 204, 11, 249, 14, 212, 8, 249, 16, 223, 3, 248, 17, 227, 1, 230, 15, 233, 0, 193, 14, 237, 0, 135, 14, 239, 1, 80,
+ 14, 241, 2, 43, 13, 241, 3, 23, 10, 239, 9, 13, 4, 238, 18, 13, 0, 238, 27, 12, 0, 229, 29, 6, 0, 219, 31, 2,
+ 0, 209, 33, 0, 0, 200, 35, 0, 0, 187, 38, 0, 5, 201, 15, 250, 6, 207, 12, 250, 8, 217, 7, 249, 10, 228, 2, 240,
+ 10, 231, 0, 211, 8, 235, 1, 168, 7, 238, 4, 114, 6, 239, 7, 73, 6, 238, 8, 44, 5, 239, 9, 27, 3, 234, 12, 18,
+ 1, 231, 17, 14, 0, 227, 20, 8, 0, 217, 22, 3, 0, 205, 25, 0, 0, 191, 28, 0, 0, 172, 31, 0, 1, 198, 14, 250,
+ 3, 203, 10, 250, 1, 211, 10, 250, 5, 225, 1, 248, 6, 229, 0, 226, 4, 233, 0, 193, 4, 233, 1, 140, 1, 233, 7, 97,
+ 0, 234, 10, 65, 0, 233, 10, 42, 0, 235, 9, 27, 0, 228, 11, 18, 0, 221, 12, 10, 0, 215, 14, 4, 0, 205, 17, 1,
+ 0, 189, 21, 0, 0, 168, 25, 0, 0, 196, 13, 250, 0, 200, 8, 250, 0, 209, 5, 250, 2, 220, 0, 249, 1, 228, 0, 239,
+ 1, 229, 0, 209, 1, 225, 1, 161, 0, 224, 3, 112, 0, 225, 4, 77, 0, 226, 5, 52, 0, 227, 5, 33, 0, 229, 4, 20,
+ 0, 219, 6, 12, 0, 211, 8, 6, 0, 202, 11, 2, 0, 190, 15, 0, 0, 170, 20, 0, 0, 196, 11, 250, 0, 199, 4, 250,
+ 0, 206, 1, 248, 0, 210, 0, 239, 0, 212, 0, 225, 0, 211, 0, 202, 0, 211, 0, 168, 0, 214, 0, 126, 0, 217, 1, 91,
+ 0, 219, 1, 63, 0, 218, 2, 41, 0, 222, 2, 26, 0, 222, 1, 15, 0, 211, 4, 8, 0, 200, 5, 3, 0, 190, 9, 1,
+ 0, 174, 15, 0, 0, 197, 8, 250, 0, 197, 1, 248, 0, 195, 0, 236, 0, 196, 0, 225, 0, 197, 0, 212, 0, 195, 0, 193,
+ 0, 196, 0, 167, 0, 200, 0, 133, 0, 204, 0, 101, 0, 209, 0, 74, 0, 211, 0, 53, 0, 213, 0, 34, 0, 215, 0, 22,
+ 0, 214, 0, 11, 0, 202, 2, 5, 0, 191, 5, 2, 0, 178, 11, 0, 0, 200, 5, 250, 0, 192, 0, 241, 0, 182, 0, 224,
+ 0, 182, 0, 213, 0, 182, 0, 203, 0, 182, 0, 187, 0, 183, 0, 165, 0, 188, 0, 136, 0, 192, 0, 108, 0, 197, 0, 84,
+ 0, 202, 0, 62, 0, 204, 0, 43, 0, 207, 0, 29, 0, 209, 0, 18, 0, 207, 0, 9, 0, 195, 2, 3, 0, 184, 8, 0,
+ 0, 202, 2, 250, 0, 188, 0, 234, 0, 175, 0, 212, 0, 173, 0, 201, 0, 173, 0, 193, 0, 173, 0, 181, 0, 175, 0, 162,
+ 0, 180, 0, 138, 0, 185, 0, 114, 0, 190, 0, 92, 0, 196, 0, 71, 0, 199, 0, 53, 0, 202, 0, 36, 0, 204, 0, 25,
+ 0, 206, 0, 14, 0, 204, 1, 5, 0, 195, 6, 0, 0, 205, 0, 251, 0, 199, 0, 230, 0, 190, 0, 208, 0, 190, 0, 204,
+ 0, 190, 0, 197, 0, 189, 0, 188, 0, 189, 0, 173, 0, 192, 0, 152, 0, 197, 0, 128, 0, 202, 0, 105, 0, 208, 0, 84,
+ 0, 213, 0, 65, 0, 215, 0, 49, 0, 218, 0, 33, 0, 221, 0, 21, 0, 222, 0, 10, 0, 224, 0, 0, 100, 0, 225, 205,
+ 100, 1, 225, 135, 93, 1, 235, 24, 80, 51, 233, 0, 62, 117, 223, 0, 45, 162, 215, 0, 35, 190, 210, 0, 28, 213, 201, 2,
+ 20, 232, 194, 4, 14, 247, 188, 5, 13, 249, 168, 3, 10, 250, 149, 3, 7, 250, 131, 3, 5, 250, 114, 1, 3, 246, 101, 0,
+ 0, 239, 89, 2, 0, 229, 78, 0, 100, 5, 137, 225, 91, 19, 169, 155, 86, 24, 165, 41, 70, 75, 215, 3, 50, 164, 213, 0,
+ 41, 205, 203, 1, 33, 228, 197, 1, 23, 246, 193, 4, 21, 246, 176, 3, 16, 252, 159, 0, 13, 252, 142, 0, 10, 253, 127, 0,
+ 7, 253, 112, 0, 4, 253, 101, 0, 1, 250, 91, 0, 0, 240, 81, 0, 0, 222, 73, 0, 88, 13, 48, 221, 85, 26, 70, 173,
+ 76, 53, 77, 76, 64, 86, 115, 22, 38, 183, 169, 13, 25, 229, 179, 10, 22, 243, 176, 4, 18, 249, 163, 2, 15, 251, 147, 1,
+ 13, 252, 133, 0, 10, 252, 119, 1, 7, 252, 108, 1, 4, 252, 98, 0, 1, 251, 90, 0, 0, 243, 81, 0, 0, 232, 74, 0,
+ 0, 215, 68, 0, 71, 37, 21, 250, 71, 42, 24, 223, 63, 74, 41, 115, 61, 74, 45, 37, 42, 161, 78, 27, 28, 226, 94, 13,
+ 23, 244, 94, 2, 19, 247, 92, 1, 16, 249, 88, 1, 12, 250, 85, 2, 9, 251, 81, 2, 6, 251, 77, 2, 4, 251, 73, 0,
+ 1, 250, 71, 0, 0, 240, 68, 0, 0, 227, 63, 0, 0, 211, 58, 0, 50, 104, 25, 249, 52, 120, 21, 245, 49, 135, 24, 196,
+ 48, 134, 30, 107, 48, 124, 35, 40, 33, 185, 57, 25, 24, 227, 62, 7, 18, 244, 70, 1, 12, 250, 72, 2, 9, 252, 70, 0,
+ 7, 253, 69, 0, 4, 254, 69, 0, 2, 251, 68, 0, 0, 244, 65, 0, 0, 232, 62, 0, 0, 219, 59, 0, 0, 205, 57, 0,
+ 35, 147, 23, 249, 38, 167, 16, 249, 39, 185, 11, 241, 37, 195, 12, 182, 33, 172, 27, 95, 34, 153, 32, 41, 27, 196, 39, 19,
+ 19, 228, 45, 6, 13, 239, 51, 2, 6, 247, 60, 6, 5, 250, 59, 0, 2, 250, 62, 0, 0, 242, 62, 0, 0, 230, 60, 0,
+ 0, 220, 57, 0, 0, 210, 55, 0, 0, 199, 54, 0, 25, 173, 19, 249, 28, 189, 13, 249, 28, 202, 9, 247, 29, 220, 4, 226,
+ 24, 216, 12, 147, 25, 190, 20, 73, 24, 190, 22, 34, 19, 220, 23, 13, 13, 232, 32, 7, 7, 235, 42, 8, 0, 239, 53, 13,
+ 0, 240, 51, 5, 0, 236, 51, 1, 0, 224, 51, 0, 0, 213, 50, 0, 0, 204, 50, 0, 0, 193, 50, 0, 17, 188, 17, 249,
+ 19, 197, 13, 249, 20, 207, 9, 249, 21, 225, 2, 241, 19, 228, 3, 189, 19, 220, 6, 110, 19, 216, 8, 56, 17, 221, 11, 28,
+ 11, 228, 19, 16, 7, 231, 27, 12, 2, 229, 36, 12, 0, 225, 40, 9, 0, 222, 41, 3, 0, 215, 41, 0, 0, 207, 43, 0,
+ 0, 199, 44, 0, 0, 187, 45, 0, 9, 191, 18, 250, 11, 198, 15, 250, 12, 206, 10, 249, 14, 223, 4, 246, 14, 228, 2, 211,
+ 13, 225, 3, 147, 11, 223, 8, 92, 9, 224, 13, 55, 8, 227, 15, 33, 4, 227, 21, 23, 2, 226, 25, 16, 0, 222, 28, 11,
+ 0, 214, 30, 5, 0, 207, 32, 1, 0, 199, 34, 0, 0, 190, 36, 0, 0, 177, 39, 0, 2, 189, 20, 250, 3, 195, 18, 250,
+ 5, 204, 13, 250, 7, 219, 6, 247, 9, 226, 3, 223, 5, 225, 8, 179, 6, 221, 8, 119, 5, 222, 10, 77, 3, 224, 15, 52,
+ 2, 225, 15, 33, 0, 222, 19, 24, 0, 218, 19, 14, 0, 214, 20, 7, 0, 206, 22, 2, 0, 194, 26, 0, 0, 181, 29, 0,
+ 0, 163, 31, 0, 0, 187, 16, 250, 0, 192, 15, 250, 2, 201, 10, 250, 1, 214, 7, 249, 4, 226, 0, 237, 2, 224, 5, 199,
+ 0, 219, 10, 145, 0, 219, 11, 100, 0, 220, 12, 68, 0, 220, 12, 44, 0, 221, 11, 28, 0, 215, 11, 18, 0, 209, 13, 10,
+ 0, 204, 15, 4, 0, 195, 17, 0, 0, 178, 22, 0, 0, 155, 25, 0, 0, 186, 13, 250, 0, 188, 9, 250, 0, 198, 6, 250,
+ 0, 210, 3, 248, 0, 220, 0, 240, 0, 219, 1, 208, 0, 211, 3, 159, 0, 210, 4, 112, 0, 212, 5, 79, 0, 213, 6, 53,
+ 0, 214, 6, 33, 0, 216, 5, 21, 0, 208, 6, 13, 0, 200, 8, 7, 0, 194, 10, 2, 0, 179, 15, 0, 0, 157, 20, 0,
+ 0, 185, 10, 250, 0, 186, 5, 251, 0, 194, 1, 248, 0, 197, 0, 235, 0, 199, 0, 219, 0, 198, 0, 196, 0, 196, 0, 163,
+ 0, 199, 0, 123, 0, 202, 1, 90, 0, 204, 1, 63, 0, 205, 2, 41, 0, 208, 1, 26, 0, 209, 1, 16, 0, 199, 3, 9,
+ 0, 191, 5, 3, 0, 181, 8, 0, 0, 162, 15, 0, 0, 185, 8, 251, 0, 183, 2, 249, 0, 180, 0, 237, 0, 175, 0, 218,
+ 0, 175, 0, 201, 0, 175, 0, 182, 0, 177, 0, 156, 0, 182, 0, 125, 0, 186, 0, 96, 0, 190, 0, 71, 0, 194, 0, 51,
+ 0, 197, 0, 33, 0, 199, 0, 21, 0, 198, 0, 12, 0, 190, 1, 5, 0, 181, 3, 1, 0, 167, 10, 0, 0, 187, 6, 251,
+ 0, 179, 1, 244, 0, 168, 0, 224, 0, 158, 0, 199, 0, 157, 0, 183, 0, 159, 0, 166, 0, 162, 0, 144, 0, 166, 0, 122,
+ 0, 171, 0, 99, 0, 176, 0, 78, 0, 181, 0, 59, 0, 185, 0, 41, 0, 188, 0, 28, 0, 190, 0, 18, 0, 189, 0, 9,
+ 0, 181, 1, 3, 0, 173, 7, 0, 0, 191, 3, 251, 0, 176, 0, 237, 0, 161, 0, 211, 0, 149, 0, 185, 0, 148, 0, 170,
+ 0, 150, 0, 156, 0, 153, 0, 139, 0, 156, 0, 121, 0, 161, 0, 102, 0, 166, 0, 83, 0, 172, 0, 65, 0, 177, 0, 49,
+ 0, 181, 0, 34, 0, 184, 0, 24, 0, 186, 0, 14, 0, 185, 1, 6, 0, 182, 6, 0, 0, 195, 0, 251, 0, 187, 0, 232,
+ 0, 179, 0, 211, 0, 169, 0, 185, 0, 169, 0, 177, 0, 170, 0, 166, 0, 172, 0, 152, 0, 175, 0, 133, 0, 179, 0, 113,
+ 0, 184, 0, 95, 0, 190, 0, 76, 0, 196, 0, 59, 0, 200, 0, 44, 0, 203, 0, 30, 0, 206, 0, 19, 0, 207, 0, 8,
+ 0, 208, 0, 0, 87, 1, 225, 206, 85, 1, 227, 162, 78, 0, 236, 91, 73, 0, 243, 9, 61, 35, 239, 0, 42, 89, 230, 0,
+ 29, 125, 224, 0, 21, 159, 217, 0, 14, 187, 208, 3, 8, 212, 198, 8, 3, 226, 185, 14, 0, 228, 171, 14, 0, 227, 149, 11,
+ 0, 226, 129, 8, 0, 223, 112, 5, 0, 219, 97, 2, 0, 213, 84, 0, 80, 4, 182, 240, 77, 6, 209, 219, 71, 11, 204, 126,
+ 65, 7, 225, 18, 45, 77, 229, 2, 32, 129, 222, 0, 24, 170, 216, 0, 17, 198, 210, 0, 11, 220, 203, 1, 6, 236, 196, 3,
+ 4, 245, 182, 0, 2, 246, 163, 0, 1, 242, 136, 0, 0, 236, 117, 1, 0, 230, 100, 0, 0, 221, 87, 0, 0, 208, 80, 0,
+ 72, 12, 101, 249, 74, 16, 112, 223, 70, 46, 97, 111, 59, 41, 134, 50, 38, 92, 190, 17, 24, 145, 207, 7, 15, 187, 208, 2,
+ 8, 214, 203, 4, 3, 233, 193, 4, 2, 244, 183, 0, 1, 242, 160, 0, 0, 239, 137, 1, 0, 234, 116, 0, 0, 228, 101, 0,
+ 0, 221, 88, 0, 0, 213, 79, 0, 0, 200, 74, 0, 57, 34, 61, 229, 64, 29, 58, 225, 61, 51, 65, 140, 51, 66, 75, 75,
+ 39, 93, 104, 37, 15, 166, 151, 40, 2, 209, 163, 35, 0, 223, 161, 21, 0, 228, 147, 9, 0, 234, 135, 3, 0, 232, 118, 2,
+ 0, 230, 103, 1, 0, 224, 91, 1, 0, 218, 82, 0, 0, 212, 76, 0, 0, 205, 70, 0, 0, 193, 66, 0, 40, 60, 45, 250,
+ 43, 72, 39, 242, 41, 80, 47, 183, 41, 81, 49, 101, 38, 85, 52, 52, 20, 153, 86, 54, 13, 196, 90, 28, 5, 224, 97, 21,
+ 4, 234, 87, 11, 2, 243, 82, 5, 2, 244, 74, 0, 1, 242, 71, 0, 0, 232, 67, 0, 0, 220, 63, 0, 0, 210, 60, 0,
+ 0, 201, 58, 0, 0, 189, 54, 0, 25, 108, 42, 250, 31, 115, 35, 249, 32, 119, 34, 239, 31, 126, 36, 179, 26, 134, 47, 113,
+ 26, 131, 51, 64, 15, 171, 68, 47, 5, 208, 76, 35, 0, 222, 79, 26, 1, 226, 71, 13, 0, 231, 65, 6, 0, 230, 61, 1,
+ 0, 220, 59, 0, 0, 211, 56, 0, 0, 202, 55, 0, 0, 194, 54, 0, 0, 182, 53, 0, 16, 137, 37, 250, 22, 149, 29, 249,
+ 23, 160, 25, 249, 24, 176, 20, 234, 19, 179, 30, 166, 16, 165, 42, 102, 13, 158, 51, 67, 6, 190, 59, 48, 3, 210, 58, 28,
+ 0, 215, 59, 20, 0, 217, 55, 11, 0, 216, 53, 3, 0, 210, 52, 0, 0, 201, 52, 0, 0, 192, 51, 0, 0, 184, 51, 0,
+ 0, 172, 50, 0, 10, 159, 32, 250, 14, 169, 26, 250, 15, 178, 21, 249, 16, 195, 15, 246, 13, 204, 18, 205, 13, 192, 23, 130,
+ 7, 181, 40, 90, 4, 189, 45, 63, 1, 209, 45, 41, 0, 213, 44, 26, 0, 210, 44, 15, 0, 208, 43, 7, 0, 205, 43, 2,
+ 0, 198, 43, 0, 0, 189, 44, 0, 0, 179, 44, 0, 0, 166, 44, 0, 3, 168, 30, 250, 6, 178, 26, 250, 7, 186, 21, 250,
+ 8, 198, 15, 248, 8, 212, 14, 227, 6, 207, 20, 169, 4, 202, 26, 113, 0, 204, 34, 78, 0, 209, 33, 51, 1, 210, 30, 29,
+ 0, 210, 31, 18, 0, 204, 32, 10, 0, 198, 33, 5, 0, 193, 34, 1, 0, 183, 36, 0, 0, 171, 37, 0, 0, 159, 38, 0,
+ 0, 172, 25, 250, 1, 179, 22, 250, 2, 187, 20, 250, 2, 199, 16, 249, 3, 214, 11, 235, 2, 209, 16, 191, 0, 205, 20, 137,
+ 0, 205, 22, 92, 0, 206, 23, 60, 0, 209, 22, 38, 0, 206, 21, 24, 0, 203, 21, 14, 0, 198, 22, 6, 0, 191, 24, 1,
+ 0, 178, 27, 0, 0, 163, 29, 0, 0, 149, 31, 0, 0, 170, 16, 251, 0, 175, 16, 250, 0, 184, 15, 250, 0, 197, 11, 250,
+ 0, 211, 7, 244, 0, 207, 10, 202, 0, 201, 12, 150, 0, 200, 13, 104, 0, 201, 13, 70, 0, 203, 14, 46, 0, 204, 13, 29,
+ 0, 199, 14, 18, 0, 195, 14, 10, 0, 191, 16, 4, 0, 180, 18, 0, 0, 160, 22, 0, 0, 140, 25, 0, 0, 170, 12, 251,
+ 0, 171, 10, 251, 0, 180, 8, 251, 0, 194, 5, 250, 0, 205, 1, 242, 0, 200, 3, 205, 0, 193, 5, 159, 0, 191, 6, 114,
+ 0, 193, 7, 80, 0, 196, 7, 55, 0, 198, 8, 34, 0, 199, 7, 22, 0, 192, 8, 13, 0, 187, 9, 7, 0, 182, 11, 2,
+ 0, 164, 15, 0, 0, 141, 20, 0, 0, 170, 9, 251, 0, 168, 5, 251, 0, 175, 2, 250, 0, 181, 1, 240, 0, 183, 0, 222,
+ 0, 182, 0, 195, 0, 180, 1, 161, 0, 181, 2, 122, 0, 184, 2, 90, 0, 187, 2, 64, 0, 188, 3, 42, 0, 192, 2, 27,
+ 0, 194, 2, 16, 0, 185, 4, 9, 0, 178, 5, 4, 0, 167, 8, 0, 0, 146, 14, 0, 0, 170, 7, 251, 0, 166, 2, 251,
+ 0, 166, 0, 242, 0, 160, 0, 221, 0, 155, 0, 195, 0, 156, 0, 171, 0, 159, 0, 146, 0, 162, 0, 119, 0, 166, 0, 93,
+ 0, 171, 0, 69, 0, 176, 0, 50, 0, 179, 0, 33, 0, 182, 0, 21, 0, 182, 0, 12, 0, 175, 1, 6, 0, 166, 3, 1,
+ 0, 153, 10, 0, 0, 171, 5, 251, 0, 163, 1, 247, 0, 154, 0, 228, 0, 143, 0, 200, 0, 137, 0, 171, 0, 138, 0, 149,
+ 0, 140, 0, 131, 0, 142, 0, 113, 0, 147, 0, 94, 0, 152, 0, 74, 0, 158, 0, 58, 0, 162, 0, 40, 0, 166, 0, 28,
+ 0, 168, 0, 18, 0, 168, 0, 10, 0, 163, 1, 3, 0, 159, 7, 0, 0, 174, 3, 251, 0, 161, 0, 240, 0, 148, 0, 213,
+ 0, 135, 0, 185, 0, 129, 0, 155, 0, 129, 0, 137, 0, 131, 0, 123, 0, 133, 0, 108, 0, 136, 0, 94, 0, 141, 0, 79,
+ 0, 147, 0, 63, 0, 152, 0, 48, 0, 156, 0, 34, 0, 160, 0, 24, 0, 162, 0, 15, 0, 162, 0, 7, 0, 167, 5, 0,
+ 0, 180, 0, 251, 0, 173, 0, 235, 0, 165, 0, 215, 0, 156, 0, 191, 0, 150, 0, 160, 0, 152, 0, 147, 0, 154, 0, 134,
+ 0, 156, 0, 119, 0, 160, 0, 104, 0, 164, 0, 89, 0, 171, 0, 71, 0, 177, 0, 56, 0, 183, 0, 40, 0, 186, 0, 28,
+ 0, 190, 0, 18, 0, 192, 0, 7, 0, 193, 0, 0, 71, 1, 225, 219, 69, 1, 226, 190, 62, 0, 235, 140, 58, 0, 242, 55,
+ 54, 3, 246, 0, 43, 27, 243, 0, 27, 67, 236, 0, 17, 101, 228, 1, 12, 131, 213, 3, 7, 163, 200, 8, 3, 184, 189, 12,
+ 0, 196, 177, 13, 0, 197, 155, 9, 0, 199, 138, 7, 0, 201, 122, 4, 0, 198, 107, 2, 0, 194, 93, 0, 63, 5, 195, 244,
+ 64, 3, 219, 236, 59, 3, 222, 178, 52, 3, 235, 74, 44, 23, 240, 1, 30, 63, 236, 0, 19, 102, 229, 0, 11, 141, 222, 1,
+ 5, 172, 215, 0, 2, 192, 203, 0, 0, 203, 184, 2, 0, 206, 162, 1, 0, 206, 140, 1, 0, 205, 123, 1, 0, 202, 108, 0,
+ 0, 197, 95, 0, 0, 187, 87, 0, 51, 18, 135, 249, 74, 7, 142, 248, 51, 23, 163, 198, 45, 29, 171, 103, 42, 31, 191, 14,
+ 26, 70, 215, 6, 15, 112, 215, 3, 3, 160, 209, 9, 1, 182, 202, 1, 0, 194, 184, 0, 0, 199, 160, 0, 0, 202, 139, 0,
+ 0, 201, 123, 0, 0, 199, 108, 0, 0, 195, 96, 0, 0, 190, 86, 0, 0, 180, 80, 0, 40, 40, 93, 228, 55, 22, 104, 249,
+ 41, 41, 106, 204, 38, 57, 103, 115, 35, 56, 125, 63, 26, 73, 159, 29, 7, 134, 180, 29, 0, 168, 179, 21, 0, 179, 164, 6,
+ 0, 188, 145, 0, 0, 192, 130, 0, 0, 193, 114, 0, 0, 191, 102, 0, 0, 188, 92, 0, 0, 185, 83, 0, 0, 181, 76, 0,
+ 0, 170, 73, 0, 28, 55, 71, 243, 36, 48, 65, 247, 32, 57, 75, 211, 32, 67, 74, 128, 24, 88, 88, 99, 18, 98, 106, 65,
+ 0, 154, 134, 57, 0, 170, 128, 27, 0, 181, 119, 12, 0, 188, 109, 3, 0, 190, 98, 1, 0, 188, 88, 0, 0, 185, 81, 0,
+ 0, 181, 75, 0, 0, 178, 70, 0, 0, 172, 66, 0, 0, 161, 62, 0, 10, 82, 67, 250, 22, 77, 57, 250, 23, 78, 56, 241,
+ 24, 78, 55, 158, 25, 84, 53, 103, 7, 126, 87, 100, 0, 153, 97, 79, 0, 175, 90, 42, 0, 190, 82, 23, 0, 198, 74, 11,
+ 0, 203, 66, 3, 0, 201, 62, 0, 0, 196, 59, 0, 0, 189, 57, 0, 0, 181, 55, 0, 0, 172, 53, 0, 0, 162, 49, 0,
+ 1, 110, 60, 250, 12, 116, 50, 250, 14, 118, 47, 248, 15, 124, 46, 226, 6, 137, 60, 178, 3, 146, 68, 132, 1, 148, 75, 97,
+ 0, 160, 75, 62, 0, 177, 67, 31, 0, 186, 62, 17, 0, 190, 58, 7, 0, 193, 54, 1, 0, 188, 52, 0, 0, 180, 51, 0,
+ 0, 171, 50, 0, 0, 161, 49, 0, 0, 150, 47, 0, 0, 125, 48, 250, 3, 139, 46, 250, 6, 145, 40, 250, 6, 155, 37, 247,
+ 5, 166, 40, 216, 2, 169, 47, 159, 0, 155, 55, 109, 0, 148, 59, 77, 0, 162, 55, 47, 0, 179, 50, 24, 0, 184, 48, 13,
+ 0, 185, 46, 6, 0, 182, 45, 1, 0, 172, 45, 0, 0, 160, 45, 0, 0, 151, 44, 0, 0, 143, 44, 0, 0, 135, 38, 250,
+ 0, 151, 37, 250, 0, 157, 35, 250, 2, 166, 30, 249, 0, 180, 31, 234, 0, 179, 34, 181, 0, 172, 36, 124, 0, 159, 42, 84,
+ 0, 162, 41, 56, 0, 182, 38, 33, 0, 185, 36, 19, 0, 180, 35, 10, 0, 178, 35, 4, 0, 170, 36, 0, 0, 157, 36, 0,
+ 0, 146, 37, 0, 0, 138, 38, 0, 0, 146, 26, 251, 0, 154, 25, 251, 0, 161, 24, 250, 0, 172, 23, 250, 0, 186, 20, 243,
+ 0, 183, 21, 197, 0, 176, 22, 139, 0, 175, 24, 95, 0, 179, 26, 64, 0, 185, 26, 42, 0, 185, 25, 24, 0, 182, 25, 14,
+ 0, 178, 25, 6, 0, 168, 26, 1, 0, 152, 28, 0, 0, 141, 29, 0, 0, 133, 32, 0, 0, 147, 17, 251, 0, 153, 17, 251,
+ 0, 160, 16, 251, 0, 172, 14, 251, 0, 187, 11, 246, 0, 179, 12, 205, 0, 173, 14, 151, 0, 173, 15, 106, 0, 177, 16, 73,
+ 0, 181, 17, 49, 0, 183, 17, 31, 0, 180, 16, 19, 0, 177, 17, 10, 0, 171, 18, 3, 0, 156, 20, 0, 0, 138, 23, 0,
+ 0, 127, 26, 0, 0, 148, 11, 251, 0, 150, 10, 251, 0, 158, 9, 251, 0, 169, 7, 251, 0, 179, 4, 242, 0, 172, 5, 205,
+ 0, 167, 7, 157, 0, 166, 8, 114, 0, 170, 9, 82, 0, 175, 10, 57, 0, 177, 10, 37, 0, 180, 9, 23, 0, 173, 9, 14,
+ 0, 168, 10, 7, 0, 161, 12, 2, 0, 142, 16, 0, 0, 126, 20, 0, 0, 151, 8, 251, 0, 149, 5, 252, 0, 154, 3, 251,
+ 0, 162, 1, 247, 0, 165, 1, 229, 0, 160, 1, 195, 0, 158, 2, 155, 0, 158, 3, 119, 0, 161, 3, 90, 0, 165, 4, 65,
+ 0, 168, 4, 43, 0, 173, 4, 28, 0, 175, 3, 18, 0, 165, 5, 10, 0, 158, 6, 4, 0, 147, 9, 1, 0, 130, 15, 0,
+ 0, 154, 6, 251, 0, 148, 2, 251, 0, 147, 0, 245, 0, 145, 0, 226, 0, 140, 0, 200, 0, 138, 0, 169, 0, 140, 0, 140,
+ 0, 142, 0, 115, 0, 146, 0, 93, 0, 151, 0, 69, 0, 156, 0, 51, 0, 160, 0, 34, 0, 163, 0, 22, 0, 162, 0, 13,
+ 0, 155, 2, 7, 0, 147, 3, 2, 0, 136, 10, 0, 0, 156, 4, 251, 0, 145, 0, 247, 0, 138, 0, 229, 0, 130, 0, 204,
+ 0, 124, 0, 175, 0, 121, 0, 142, 0, 122, 0, 121, 0, 124, 0, 105, 0, 127, 0, 90, 0, 132, 0, 72, 0, 136, 0, 57,
+ 0, 140, 0, 41, 0, 144, 0, 28, 0, 146, 0, 19, 0, 146, 0, 11, 0, 142, 1, 4, 0, 142, 6, 0, 0, 158, 2, 251,
+ 0, 144, 0, 239, 0, 132, 0, 215, 0, 123, 0, 189, 0, 117, 0, 157, 0, 112, 0, 126, 0, 112, 0, 109, 0, 114, 0, 98,
+ 0, 117, 0, 88, 0, 121, 0, 74, 0, 125, 0, 61, 0, 129, 0, 47, 0, 133, 0, 34, 0, 136, 0, 24, 0, 138, 0, 15,
+ 0, 139, 0, 8, 0, 150, 4, 0, 0, 162, 0, 251, 0, 155, 0, 235, 0, 149, 0, 217, 0, 142, 0, 196, 0, 136, 0, 168,
+ 0, 133, 0, 134, 0, 134, 0, 120, 0, 136, 0, 108, 0, 138, 0, 97, 0, 142, 0, 86, 0, 148, 0, 71, 0, 155, 0, 56,
+ 0, 162, 0, 41, 0, 167, 0, 28, 0, 172, 0, 17, 0, 174, 0, 7, 0, 175, 0, 0, 55, 0, 226, 234, 54, 1, 225, 206,
+ 49, 0, 233, 171, 44, 0, 240, 99, 41, 0, 246, 28, 35, 6, 248, 0, 28, 23, 246, 0, 15, 56, 238, 1, 7, 88, 222, 7,
+ 5, 113, 206, 10, 2, 137, 195, 12, 0, 153, 182, 12, 0, 158, 162, 8, 0, 167, 145, 5, 0, 173, 130, 3, 0, 174, 117, 2,
+ 0, 172, 104, 0, 49, 6, 202, 246, 49, 4, 216, 241, 48, 2, 223, 210, 41, 1, 236, 132, 37, 2, 244, 20, 27, 25, 243, 1,
+ 17, 53, 240, 0, 7, 86, 234, 1, 2, 116, 225, 0, 0, 139, 207, 2, 0, 152, 188, 1, 0, 160, 166, 1, 0, 168, 144, 1,
+ 0, 173, 128, 0, 0, 175, 116, 0, 0, 173, 106, 0, 0, 166, 98, 0, 42, 16, 163, 249, 43, 12, 179, 248, 41, 6, 208, 248,
+ 35, 13, 211, 161, 33, 14, 213, 43, 26, 31, 217, 8, 15, 60, 220, 4, 0, 104, 215, 14, 0, 122, 209, 2, 0, 137, 190, 0,
+ 0, 148, 168, 0, 0, 157, 145, 0, 0, 166, 128, 0, 0, 169, 115, 0, 0, 170, 105, 0, 0, 166, 95, 0, 0, 157, 89, 0,
+ 37, 30, 119, 249, 39, 25, 130, 249, 32, 24, 149, 249, 28, 43, 145, 171, 24, 49, 160, 104, 24, 42, 166, 41, 7, 85, 187, 32,
+ 0, 111, 188, 22, 0, 122, 177, 7, 0, 133, 160, 1, 0, 143, 140, 0, 0, 152, 121, 0, 0, 159, 110, 0, 0, 161, 100, 0,
+ 0, 160, 91, 0, 0, 157, 83, 0, 0, 147, 80, 0, 20, 53, 95, 241, 28, 46, 90, 250, 26, 44, 100, 250, 22, 58, 101, 181,
+ 17, 80, 105, 130, 10, 86, 129, 93, 1, 106, 149, 59, 0, 114, 147, 29, 0, 122, 138, 12, 0, 132, 125, 2, 0, 140, 109, 0,
+ 0, 146, 100, 0, 0, 149, 91, 0, 0, 150, 84, 0, 0, 149, 77, 0, 0, 147, 72, 0, 0, 138, 69, 0, 3, 72, 83, 249,
+ 15, 66, 73, 250, 16, 65, 75, 245, 15, 70, 79, 195, 4, 95, 94, 159, 0, 114, 104, 125, 0, 112, 107, 82, 0, 115, 104, 41,
+ 0, 124, 95, 18, 0, 135, 90, 8, 0, 143, 84, 1, 0, 146, 78, 0, 0, 146, 73, 0, 0, 145, 68, 0, 0, 142, 63, 0,
+ 0, 139, 60, 0, 0, 132, 57, 0, 0, 80, 65, 250, 2, 99, 68, 250, 5, 98, 66, 250, 1, 101, 71, 239, 8, 87, 60, 157,
+ 1, 111, 76, 128, 0, 107, 74, 87, 0, 116, 74, 58, 0, 134, 70, 31, 0, 148, 65, 16, 0, 158, 59, 6, 0, 163, 55, 1,
+ 0, 159, 53, 0, 0, 153, 51, 0, 0, 145, 49, 0, 0, 139, 47, 0, 0, 134, 44, 0, 0, 93, 49, 251, 0, 109, 53, 250,
+ 0, 114, 53, 250, 0, 117, 52, 247, 0, 117, 53, 208, 0, 121, 57, 152, 0, 117, 58, 106, 0, 115, 60, 75, 0, 122, 57, 46,
+ 0, 137, 52, 24, 0, 145, 50, 11, 0, 149, 47, 4, 0, 148, 45, 0, 0, 143, 45, 0, 0, 136, 44, 0, 0, 130, 43, 0,
+ 0, 124, 42, 0, 0, 103, 38, 251, 0, 116, 38, 251, 0, 122, 38, 251, 0, 128, 37, 250, 0, 137, 36, 239, 0, 136, 39, 180,
+ 0, 129, 39, 123, 0, 121, 43, 84, 0, 115, 46, 59, 0, 128, 43, 35, 0, 141, 39, 18, 0, 143, 38, 9, 0, 144, 37, 3,
+ 0, 139, 37, 0, 0, 130, 38, 0, 0, 124, 39, 0, 0, 119, 39, 0, 0, 113, 28, 251, 0, 118, 27, 251, 0, 124, 26, 251,
+ 0, 134, 25, 251, 0, 148, 23, 246, 0, 142, 24, 196, 0, 133, 25, 137, 0, 134, 28, 94, 0, 127, 33, 64, 0, 130, 33, 43,
+ 0, 142, 29, 24, 0, 145, 27, 13, 0, 142, 27, 6, 0, 138, 28, 1, 0, 129, 30, 0, 0, 121, 31, 0, 0, 116, 33, 0,
+ 0, 117, 18, 252, 0, 120, 18, 252, 0, 127, 18, 251, 0, 139, 16, 251, 0, 152, 14, 246, 0, 144, 15, 203, 0, 135, 16, 148,
+ 0, 136, 18, 104, 0, 138, 19, 72, 0, 140, 20, 49, 0, 145, 19, 31, 0, 146, 18, 18, 0, 145, 19, 9, 0, 140, 20, 3,
+ 0, 130, 22, 0, 0, 118, 25, 0, 0, 113, 27, 0, 0, 120, 12, 252, 0, 122, 11, 252, 0, 129, 10, 252, 0, 140, 9, 251,
+ 0, 148, 7, 241, 0, 141, 8, 203, 0, 135, 9, 154, 0, 134, 10, 112, 0, 138, 11, 82, 0, 142, 11, 57, 0, 146, 12, 38,
+ 0, 149, 11, 24, 0, 144, 11, 14, 0, 141, 12, 6, 0, 136, 13, 1, 0, 121, 17, 0, 0, 110, 22, 0, 0, 126, 8, 252,
+ 0, 124, 6, 252, 0, 129, 4, 252, 0, 136, 3, 249, 0, 140, 2, 232, 0, 135, 3, 196, 0, 132, 3, 153, 0, 131, 4, 115,
+ 0, 134, 5, 89, 0, 138, 5, 65, 0, 141, 5, 44, 0, 146, 6, 30, 0, 149, 5, 19, 0, 140, 6, 10, 0, 135, 7, 4,
+ 0, 126, 10, 0, 0, 113, 16, 0, 0, 132, 6, 252, 0, 127, 2, 252, 0, 128, 1, 248, 0, 127, 0, 232, 0, 125, 0, 208,
+ 0, 123, 0, 178, 0, 122, 0, 140, 0, 124, 0, 112, 0, 127, 1, 91, 0, 130, 1, 70, 0, 134, 1, 52, 0, 137, 1, 35,
+ 0, 141, 1, 23, 0, 142, 1, 14, 0, 134, 2, 7, 0, 129, 3, 1, 0, 118, 11, 0, 0, 138, 4, 252, 0, 127, 0, 248,
+ 0, 121, 0, 231, 0, 115, 0, 208, 0, 111, 0, 181, 0, 108, 0, 149, 0, 106, 0, 118, 0, 108, 0, 100, 0, 111, 0, 86,
+ 0, 114, 0, 70, 0, 117, 0, 56, 0, 121, 0, 40, 0, 124, 0, 28, 0, 126, 0, 19, 0, 126, 0, 11, 0, 124, 1, 4,
+ 0, 124, 7, 0, 0, 141, 2, 252, 0, 127, 0, 239, 0, 117, 0, 216, 0, 110, 0, 192, 0, 105, 0, 163, 0, 100, 0, 130,
+ 0, 97, 0, 103, 0, 99, 0, 90, 0, 101, 0, 81, 0, 103, 0, 70, 0, 106, 0, 59, 0, 109, 0, 46, 0, 112, 0, 33,
+ 0, 115, 0, 24, 0, 117, 0, 15, 0, 118, 0, 8, 0, 130, 4, 0, 0, 145, 0, 252, 0, 137, 0, 235, 0, 131, 0, 217,
+ 0, 126, 0, 199, 0, 123, 0, 175, 0, 120, 0, 141, 0, 117, 0, 110, 0, 119, 0, 98, 0, 121, 0, 90, 0, 123, 0, 82,
+ 0, 127, 0, 71, 0, 133, 0, 56, 0, 139, 0, 41, 0, 145, 0, 29, 0, 150, 0, 17, 0, 152, 0, 7, 0, 155, 0, 0,
+ 42, 0, 227, 242, 41, 1, 225, 218, 37, 0, 232, 190, 33, 0, 237, 138, 30, 0, 244, 64, 28, 0, 249, 15, 24, 8, 250, 0,
+ 18, 21, 248, 0, 6, 51, 238, 4, 0, 80, 218, 13, 0, 96, 201, 12, 0, 109, 187, 9, 0, 119, 170, 7, 0, 130, 155, 4,
+ 0, 138, 142, 3, 0, 143, 127, 1, 0, 147, 113, 0, 38, 7, 202, 248, 38, 5, 211, 244, 36, 2, 223, 226, 31, 0, 234, 171,
+ 27, 0, 244, 58, 26, 2, 248, 3, 16, 27, 245, 1, 7, 49, 241, 2, 1, 71, 232, 0, 0, 90, 210, 1, 0, 104, 192, 1,
+ 0, 117, 172, 1, 0, 127, 153, 1, 0, 134, 138, 0, 0, 139, 124, 0, 0, 141, 111, 0, 0, 138, 105, 0, 32, 16, 176, 249,
+ 33, 14, 180, 249, 31, 7, 204, 249, 28, 6, 223, 196, 24, 7, 225, 81, 22, 15, 220, 21, 13, 36, 223, 9, 3, 62, 220, 12,
+ 0, 76, 215, 2, 0, 92, 196, 0, 0, 105, 174, 0, 0, 117, 155, 0, 0, 127, 139, 0, 0, 133, 123, 0, 0, 135, 110, 0,
+ 0, 136, 101, 0, 0, 130, 97, 0, 24, 32, 138, 249, 25, 29, 144, 249, 24, 23, 163, 249, 21, 21, 186, 223, 17, 31, 189, 142,
+ 18, 28, 184, 63, 8, 54, 193, 33, 0, 73, 195, 24, 0, 80, 188, 8, 0, 93, 172, 1, 0, 105, 151, 0, 0, 115, 134, 0,
+ 0, 123, 119, 0, 0, 128, 106, 0, 0, 130, 95, 0, 0, 131, 88, 0, 0, 122, 86, 0, 17, 48, 111, 250, 20, 46, 109, 250,
+ 17, 44, 120, 250, 13, 44, 139, 229, 6, 69, 146, 176, 5, 70, 152, 113, 4, 68, 160, 55, 0, 76, 161, 34, 0, 84, 152, 14,
+ 0, 94, 140, 3, 0, 103, 125, 0, 0, 111, 111, 0, 0, 116, 98, 0, 0, 121, 88, 0, 0, 124, 82, 0, 0, 125, 77, 0,
+ 0, 118, 75, 0, 0, 66, 94, 250, 9, 65, 91, 250, 8, 64, 95, 250, 7, 60, 104, 249, 0, 80, 111, 189, 0, 87, 108, 129,
+ 0, 81, 114, 87, 0, 75, 119, 48, 0, 87, 113, 23, 0, 95, 105, 9, 0, 101, 96, 1, 0, 106, 86, 0, 0, 110, 80, 0,
+ 0, 115, 74, 0, 0, 117, 70, 0, 0, 117, 65, 0, 0, 112, 63, 0, 0, 62, 66, 251, 0, 72, 75, 250, 0, 73, 77, 250,
+ 3, 69, 76, 238, 0, 73, 79, 187, 0, 85, 81, 127, 0, 82, 80, 90, 0, 82, 83, 61, 0, 89, 78, 30, 0, 96, 74, 13,
+ 0, 105, 72, 4, 0, 111, 68, 0, 0, 112, 64, 0, 0, 113, 60, 0, 0, 112, 56, 0, 0, 111, 54, 0, 0, 107, 52, 0,
+ 0, 65, 51, 251, 0, 72, 57, 251, 0, 75, 57, 251, 0, 75, 57, 246, 6, 63, 46, 186, 0, 84, 61, 136, 0, 87, 61, 100,
+ 0, 87, 60, 72, 0, 91, 59, 44, 0, 103, 56, 23, 0, 115, 52, 10, 0, 123, 49, 3, 0, 123, 47, 0, 0, 120, 45, 0,
+ 0, 116, 44, 0, 0, 112, 42, 0, 0, 109, 39, 0, 0, 75, 40, 252, 0, 86, 40, 251, 0, 89, 39, 251, 0, 92, 39, 251,
+ 0, 92, 38, 236, 0, 94, 44, 163, 0, 93, 45, 114, 0, 90, 45, 80, 0, 90, 47, 57, 0, 96, 46, 35, 0, 109, 43, 18,
+ 0, 115, 41, 7, 0, 117, 40, 1, 0, 113, 39, 0, 0, 109, 39, 0, 0, 106, 38, 0, 0, 102, 37, 0, 0, 84, 29, 252,
+ 0, 92, 28, 252, 0, 95, 27, 252, 0, 100, 27, 252, 0, 105, 25, 245, 0, 105, 28, 193, 0, 100, 30, 135, 0, 99, 30, 92,
+ 0, 96, 35, 64, 0, 92, 37, 45, 0, 102, 35, 28, 0, 114, 32, 12, 0, 115, 31, 5, 0, 113, 31, 1, 0, 107, 32, 0,
+ 0, 102, 33, 0, 0, 99, 33, 0, 0, 91, 20, 252, 0, 96, 19, 252, 0, 99, 19, 252, 0, 106, 18, 251, 0, 112, 17, 244,
+ 0, 110, 18, 201, 0, 104, 18, 149, 0, 104, 20, 102, 0, 107, 22, 72, 0, 100, 25, 51, 0, 102, 25, 34, 0, 116, 22, 18,
+ 0, 118, 22, 8, 0, 115, 23, 2, 0, 108, 24, 0, 0, 101, 26, 0, 0, 98, 28, 0, 0, 96, 12, 252, 0, 99, 12, 252,
+ 0, 104, 12, 252, 0, 110, 11, 251, 0, 115, 10, 239, 0, 111, 11, 203, 0, 108, 11, 157, 0, 106, 11, 110, 0, 111, 13, 81,
+ 0, 113, 14, 56, 0, 115, 14, 39, 0, 119, 14, 24, 0, 118, 13, 13, 0, 117, 14, 5, 0, 112, 16, 1, 0, 101, 19, 0,
+ 0, 97, 23, 0, 0, 102, 8, 252, 0, 102, 6, 252, 0, 106, 6, 252, 0, 111, 5, 250, 0, 114, 5, 232, 0, 111, 5, 199,
+ 0, 109, 5, 157, 0, 105, 6, 113, 0, 109, 7, 87, 0, 113, 7, 64, 0, 116, 7, 45, 0, 119, 7, 30, 0, 121, 7, 19,
+ 0, 116, 7, 9, 0, 115, 8, 3, 0, 106, 12, 0, 0, 98, 17, 0, 0, 110, 6, 252, 0, 106, 3, 252, 0, 108, 1, 250,
+ 0, 109, 1, 239, 0, 108, 1, 217, 0, 107, 1, 188, 0, 106, 1, 150, 0, 103, 1, 111, 0, 106, 2, 88, 0, 109, 2, 69,
+ 0, 112, 2, 52, 0, 115, 2, 35, 0, 118, 2, 24, 0, 120, 2, 14, 0, 115, 3, 6, 0, 111, 4, 1, 0, 102, 12, 0,
+ 0, 117, 4, 252, 0, 109, 1, 249, 0, 105, 0, 235, 0, 100, 0, 213, 0, 97, 0, 189, 0, 96, 0, 159, 0, 95, 0, 126,
+ 0, 93, 0, 98, 0, 96, 0, 82, 0, 98, 0, 69, 0, 101, 0, 56, 0, 104, 0, 40, 0, 106, 0, 29, 0, 108, 0, 19,
+ 0, 108, 0, 11, 0, 107, 1, 4, 0, 106, 7, 0, 0, 122, 2, 252, 0, 111, 0, 240, 0, 103, 0, 218, 0, 97, 0, 195,
+ 0, 92, 0, 168, 0, 90, 0, 137, 0, 87, 0, 107, 0, 85, 0, 86, 0, 87, 0, 74, 0, 88, 0, 67, 0, 91, 0, 58,
+ 0, 93, 0, 45, 0, 96, 0, 33, 0, 98, 0, 24, 0, 100, 0, 15, 0, 101, 0, 8, 0, 112, 5, 0, 0, 127, 0, 252,
+ 0, 121, 0, 237, 0, 115, 0, 219, 0, 111, 0, 201, 0, 108, 0, 181, 0, 107, 0, 150, 0, 104, 0, 116, 0, 103, 0, 91,
+ 0, 105, 0, 82, 0, 106, 0, 76, 0, 108, 0, 69, 0, 112, 0, 56, 0, 118, 0, 41, 0, 123, 0, 29, 0, 128, 0, 18,
+ 0, 130, 0, 7, 0, 133, 0, 0, 31, 1, 226, 247, 30, 1, 227, 230, 29, 1, 229, 205, 25, 0, 235, 167, 22, 0, 242, 103,
+ 20, 0, 248, 41, 20, 0, 251, 7, 16, 10, 250, 0, 12, 19, 249, 0, 4, 42, 238, 1, 0, 64, 216, 7, 0, 78, 198, 7,
+ 0, 91, 184, 6, 0, 101, 168, 4, 0, 110, 154, 2, 0, 118, 140, 1, 0, 124, 127, 0, 28, 9, 199, 249, 27, 7, 209, 247,
+ 27, 3, 224, 239, 25, 0, 232, 196, 21, 0, 242, 98, 19, 1, 248, 30, 17, 8, 250, 1, 8, 28, 246, 2, 2, 43, 241, 0,
+ 0, 58, 218, 1, 0, 72, 196, 1, 0, 85, 180, 1, 0, 95, 162, 0, 0, 104, 147, 0, 0, 111, 135, 0, 0, 117, 125, 0,
+ 0, 117, 119, 0, 24, 18, 177, 249, 24, 18, 180, 249, 23, 9, 205, 249, 23, 4, 222, 216, 18, 3, 230, 114, 17, 7, 227, 45,
+ 13, 17, 231, 10, 3, 41, 227, 12, 0, 48, 226, 3, 0, 61, 203, 0, 0, 74, 182, 0, 0, 87, 163, 0, 0, 96, 146, 0,
+ 0, 104, 133, 0, 0, 109, 121, 0, 0, 112, 112, 0, 0, 110, 108, 0, 17, 31, 152, 250, 18, 30, 154, 249, 16, 25, 170, 249,
+ 16, 14, 202, 240, 11, 23, 202, 171, 11, 23, 198, 95, 6, 37, 200, 43, 0, 51, 200, 27, 0, 53, 196, 10, 0, 63, 183, 1,
+ 0, 75, 162, 0, 0, 86, 142, 0, 0, 95, 128, 0, 0, 101, 116, 0, 0, 105, 105, 0, 0, 106, 95, 0, 0, 103, 94, 0,
+ 7, 50, 125, 250, 11, 46, 127, 250, 9, 42, 138, 250, 7, 36, 155, 250, 0, 50, 160, 201, 0, 53, 162, 132, 0, 54, 167, 69,
+ 0, 54, 168, 36, 0, 57, 164, 17, 0, 65, 154, 4, 0, 74, 135, 0, 0, 84, 119, 0, 0, 91, 107, 0, 0, 96, 95, 0,
+ 0, 100, 86, 0, 0, 104, 80, 0, 0, 101, 79, 0, 0, 55, 100, 250, 4, 61, 103, 250, 2, 60, 112, 250, 2, 52, 122, 250,
+ 0, 51, 120, 202, 0, 60, 110, 134, 0, 61, 116, 92, 0, 55, 123, 53, 0, 60, 122, 25, 0, 66, 116, 10, 0, 73, 107, 1,
+ 0, 80, 95, 0, 0, 88, 86, 0, 0, 94, 80, 0, 0, 98, 74, 0, 0, 100, 70, 0, 0, 99, 68, 0, 0, 51, 72, 251,
+ 0, 60, 80, 251, 0, 61, 83, 251, 0, 56, 85, 246, 0, 53, 84, 201, 0, 63, 81, 126, 0, 69, 80, 94, 0, 63, 88, 65,
+ 0, 64, 89, 33, 0, 69, 87, 17, 0, 74, 83, 5, 0, 82, 77, 0, 0, 88, 71, 0, 0, 92, 66, 0, 0, 94, 62, 0,
+ 0, 95, 59, 0, 0, 93, 57, 0, 0, 49, 51, 252, 0, 55, 57, 251, 0, 56, 59, 251, 1, 54, 58, 243, 1, 50, 58, 202,
+ 0, 63, 63, 137, 0, 66, 63, 95, 0, 66, 65, 70, 0, 68, 66, 44, 0, 72, 65, 22, 0, 79, 61, 9, 0, 87, 60, 1,
+ 0, 90, 56, 0, 0, 91, 53, 0, 0, 91, 51, 0, 0, 91, 49, 0, 0, 89, 47, 0, 0, 51, 41, 252, 0, 59, 40, 252,
+ 0, 62, 40, 252, 0, 62, 40, 251, 0, 57, 39, 227, 0, 70, 47, 158, 0, 68, 48, 103, 0, 69, 48, 78, 0, 72, 50, 59,
+ 0, 73, 47, 33, 0, 84, 45, 16, 0, 93, 44, 6, 0, 97, 41, 1, 0, 96, 40, 0, 0, 94, 39, 0, 0, 92, 37, 0,
+ 0, 90, 34, 0, 0, 61, 30, 252, 0, 66, 29, 252, 0, 67, 28, 252, 0, 69, 27, 252, 0, 70, 28, 240, 0, 75, 32, 189,
+ 0, 73, 36, 125, 0, 73, 36, 88, 0, 74, 36, 64, 0, 74, 38, 44, 0, 80, 37, 27, 0, 89, 35, 12, 0, 93, 34, 4,
+ 0, 93, 34, 0, 0, 89, 34, 0, 0, 86, 33, 0, 0, 84, 32, 0, 0, 68, 21, 253, 0, 72, 20, 253, 0, 73, 19, 253,
+ 0, 77, 19, 252, 0, 81, 19, 242, 0, 81, 21, 199, 0, 82, 24, 149, 0, 81, 24, 103, 0, 81, 24, 71, 0, 78, 27, 50,
+ 0, 75, 29, 35, 0, 85, 28, 20, 0, 93, 26, 7, 0, 94, 26, 1, 0, 90, 26, 0, 0, 85, 27, 0, 0, 83, 28, 0,
+ 0, 72, 14, 253, 0, 76, 13, 253, 0, 80, 13, 253, 0, 84, 12, 252, 0, 88, 12, 238, 0, 86, 13, 201, 0, 85, 15, 159,
+ 0, 85, 15, 114, 0, 84, 14, 79, 0, 86, 16, 56, 0, 82, 20, 41, 0, 84, 19, 26, 0, 94, 17, 12, 0, 97, 17, 4,
+ 0, 93, 19, 0, 0, 85, 21, 0, 0, 83, 23, 0, 0, 79, 8, 253, 0, 81, 7, 253, 0, 85, 7, 253, 0, 89, 6, 251,
+ 0, 90, 6, 231, 0, 89, 7, 198, 0, 88, 8, 160, 0, 86, 8, 117, 0, 86, 8, 84, 0, 89, 9, 62, 0, 92, 10, 45,
+ 0, 93, 10, 31, 0, 96, 10, 18, 0, 97, 9, 8, 0, 97, 10, 2, 0, 88, 14, 0, 0, 83, 18, 0, 0, 88, 5, 253,
+ 0, 87, 3, 253, 0, 88, 2, 252, 0, 90, 2, 243, 0, 89, 2, 219, 0, 88, 2, 191, 0, 87, 3, 155, 0, 86, 3, 116,
+ 0, 86, 3, 87, 0, 90, 3, 68, 0, 93, 3, 52, 0, 96, 4, 36, 0, 98, 4, 24, 0, 100, 3, 14, 0, 97, 3, 5,
+ 0, 93, 6, 1, 0, 87, 13, 0, 0, 97, 3, 253, 0, 92, 1, 251, 0, 89, 0, 240, 0, 86, 0, 221, 0, 85, 0, 198,
+ 0, 83, 0, 170, 0, 82, 0, 137, 0, 82, 0, 105, 0, 81, 0, 82, 0, 84, 0, 67, 0, 87, 0, 56, 0, 90, 0, 41,
+ 0, 92, 0, 29, 0, 94, 0, 19, 0, 94, 0, 11, 0, 93, 1, 3, 0, 92, 8, 0, 0, 104, 2, 253, 0, 95, 0, 242,
+ 0, 89, 0, 223, 0, 85, 0, 201, 0, 81, 0, 176, 0, 78, 0, 144, 0, 77, 0, 114, 0, 74, 0, 90, 0, 73, 0, 72,
+ 0, 75, 0, 63, 0, 76, 0, 56, 0, 79, 0, 45, 0, 82, 0, 33, 0, 84, 0, 24, 0, 85, 0, 15, 0, 87, 0, 7,
+ 0, 97, 5, 0, 0, 111, 0, 253, 0, 105, 0, 238, 0, 100, 0, 222, 0, 96, 0, 206, 0, 94, 0, 186, 0, 92, 0, 157,
+ 0, 91, 0, 124, 0, 89, 0, 96, 0, 89, 0, 76, 0, 91, 0, 69, 0, 92, 0, 65, 0, 95, 0, 55, 0, 99, 0, 41,
+ 0, 104, 0, 29, 0, 107, 0, 18, 0, 110, 0, 7, 0, 113, 0, 0, 22, 3, 222, 249, 22, 1, 227, 240, 23, 1, 227, 218,
+ 19, 0, 234, 190, 17, 0, 239, 138, 15, 0, 246, 72, 15, 0, 250, 26, 16, 0, 252, 2, 12, 9, 251, 0, 9, 17, 250, 0,
+ 3, 36, 239, 0, 0, 55, 217, 4, 0, 67, 198, 4, 0, 78, 184, 3, 0, 88, 169, 2, 0, 97, 154, 1, 0, 104, 140, 0,
+ 20, 11, 202, 249, 20, 9, 207, 249, 20, 4, 221, 245, 20, 1, 228, 215, 15, 0, 239, 128, 12, 2, 245, 62, 14, 1, 250, 14,
+ 9, 12, 250, 1, 3, 26, 246, 0, 0, 37, 227, 2, 0, 48, 206, 0, 0, 61, 187, 0, 0, 71, 172, 0, 0, 81, 157, 0,
+ 0, 89, 144, 0, 0, 96, 134, 0, 0, 99, 130, 0, 15, 20, 180, 249, 16, 18, 185, 249, 17, 11, 203, 249, 16, 4, 223, 231,
+ 12, 4, 229, 140, 11, 6, 228, 75, 10, 9, 234, 24, 4, 23, 236, 11, 0, 31, 232, 3, 0, 37, 211, 0, 0, 51, 190, 0,
+ 0, 63, 172, 0, 0, 72, 155, 0, 0, 80, 140, 0, 0, 87, 128, 0, 0, 92, 119, 0, 0, 93, 118, 0, 3, 40, 152, 250,
+ 9, 32, 159, 250, 8, 26, 174, 250, 11, 11, 206, 250, 5, 24, 205, 193, 0, 34, 202, 135, 0, 33, 203, 74, 0, 33, 205, 41,
+ 0, 35, 202, 12, 0, 39, 192, 1, 0, 52, 173, 0, 0, 64, 152, 0, 0, 72, 135, 0, 0, 79, 122, 0, 0, 84, 111, 0,
+ 0, 88, 102, 0, 0, 87, 103, 0, 0, 45, 127, 250, 1, 48, 138, 250, 4, 41, 143, 250, 1, 30, 160, 250, 0, 34, 163, 200,
+ 0, 34, 162, 146, 0, 35, 167, 87, 0, 37, 171, 51, 0, 40, 169, 20, 0, 43, 164, 6, 0, 54, 148, 0, 0, 64, 128, 0,
+ 0, 70, 113, 0, 0, 75, 102, 0, 0, 80, 93, 0, 0, 84, 87, 0, 0, 83, 88, 0, 0, 44, 102, 251, 0, 49, 109, 251,
+ 0, 44, 113, 251, 0, 39, 123, 251, 0, 37, 125, 205, 0, 38, 118, 138, 0, 40, 121, 101, 0, 41, 126, 60, 0, 43, 129, 27,
+ 0, 46, 128, 12, 0, 54, 120, 2, 0, 62, 105, 0, 0, 68, 93, 0, 0, 73, 86, 0, 0, 79, 80, 0, 0, 83, 75, 0,
+ 0, 84, 74, 0, 0, 42, 77, 252, 0, 45, 82, 251, 0, 44, 86, 251, 0, 40, 89, 244, 0, 41, 88, 198, 0, 41, 87, 138,
+ 0, 50, 84, 96, 0, 49, 92, 69, 0, 46, 97, 36, 0, 49, 98, 19, 0, 54, 93, 6, 0, 61, 86, 1, 0, 68, 78, 0,
+ 0, 73, 73, 0, 0, 77, 67, 0, 0, 81, 62, 0, 0, 83, 61, 0, 0, 41, 56, 252, 0, 43, 60, 252, 0, 43, 62, 251,
+ 0, 41, 64, 243, 0, 43, 65, 201, 0, 44, 65, 146, 0, 49, 65, 93, 0, 52, 67, 73, 0, 50, 71, 49, 0, 48, 76, 28,
+ 0, 57, 72, 11, 0, 63, 69, 2, 0, 68, 64, 0, 0, 72, 59, 0, 0, 75, 55, 0, 0, 77, 53, 0, 0, 79, 51, 0,
+ 0, 40, 40, 252, 0, 44, 40, 252, 0, 44, 41, 252, 1, 40, 42, 243, 1, 42, 44, 206, 0, 47, 49, 160, 0, 49, 50, 104,
+ 0, 53, 52, 76, 0, 52, 54, 56, 0, 52, 55, 35, 0, 60, 53, 16, 0, 66, 51, 5, 0, 70, 50, 0, 0, 72, 47, 0,
+ 0, 73, 45, 0, 0, 73, 43, 0, 0, 75, 40, 0, 0, 40, 32, 253, 0, 46, 30, 253, 0, 46, 29, 253, 0, 42, 31, 251,
+ 1, 41, 30, 227, 0, 52, 36, 184, 0, 50, 38, 120, 0, 52, 39, 80, 0, 54, 39, 63, 0, 57, 40, 48, 0, 61, 39, 25,
+ 0, 70, 38, 11, 0, 75, 36, 3, 0, 76, 35, 0, 0, 75, 33, 0, 0, 73, 32, 0, 0, 73, 29, 0, 0, 48, 22, 253,
+ 0, 51, 21, 253, 0, 51, 20, 253, 0, 52, 20, 251, 0, 53, 20, 233, 0, 59, 24, 196, 0, 59, 26, 147, 0, 59, 28, 96,
+ 0, 58, 28, 69, 0, 59, 29, 50, 0, 60, 30, 34, 0, 66, 30, 19, 0, 73, 28, 7, 0, 76, 27, 1, 0, 72, 28, 0,
+ 0, 70, 28, 0, 0, 69, 27, 0, 0, 52, 15, 253, 0, 56, 14, 253, 0, 57, 14, 253, 0, 59, 13, 251, 0, 61, 14, 230,
+ 0, 64, 16, 198, 0, 65, 17, 158, 0, 65, 18, 114, 0, 64, 18, 80, 0, 60, 20, 54, 0, 59, 23, 40, 0, 61, 23, 26,
+ 0, 69, 22, 14, 0, 77, 20, 3, 0, 74, 21, 0, 0, 70, 23, 0, 0, 69, 24, 0, 0, 56, 9, 253, 0, 60, 8, 253,
+ 0, 63, 8, 253, 0, 66, 8, 250, 0, 68, 9, 226, 0, 68, 9, 196, 0, 69, 10, 160, 0, 68, 10, 119, 0, 67, 11, 85,
+ 0, 64, 13, 58, 0, 65, 14, 45, 0, 67, 15, 32, 0, 70, 14, 19, 0, 79, 12, 8, 0, 80, 13, 1, 0, 72, 16, 0,
+ 0, 69, 19, 0, 0, 65, 5, 253, 0, 66, 4, 253, 0, 68, 3, 252, 0, 70, 3, 244, 0, 69, 4, 218, 0, 70, 4, 192,
+ 0, 69, 5, 158, 0, 69, 5, 121, 0, 69, 5, 91, 0, 70, 5, 66, 0, 73, 5, 51, 0, 77, 5, 37, 0, 79, 6, 24,
+ 0, 81, 5, 13, 0, 80, 5, 4, 0, 76, 8, 0, 0, 72, 14, 0, 0, 76, 3, 253, 0, 74, 1, 252, 0, 73, 0, 246,
+ 0, 72, 0, 229, 0, 70, 0, 208, 0, 69, 1, 182, 0, 68, 1, 149, 0, 69, 0, 117, 0, 69, 0, 88, 0, 69, 0, 68,
+ 0, 72, 0, 55, 0, 76, 0, 42, 0, 78, 0, 29, 0, 80, 0, 19, 0, 81, 0, 9, 0, 79, 1, 2, 0, 77, 9, 0,
+ 0, 85, 2, 253, 0, 80, 0, 245, 0, 76, 0, 228, 0, 72, 0, 208, 0, 69, 0, 186, 0, 66, 0, 152, 0, 65, 0, 122,
+ 0, 65, 0, 96, 0, 63, 0, 74, 0, 63, 0, 61, 0, 65, 0, 53, 0, 67, 0, 44, 0, 69, 0, 33, 0, 71, 0, 24,
+ 0, 72, 0, 15, 0, 73, 0, 7, 0, 82, 5, 0, 0, 93, 0, 253, 0, 90, 0, 241, 0, 86, 0, 227, 0, 83, 0, 211,
+ 0, 81, 0, 192, 0, 79, 0, 165, 0, 78, 0, 132, 0, 77, 0, 103, 0, 76, 0, 80, 0, 76, 0, 64, 0, 78, 0, 59,
+ 0, 79, 0, 53, 0, 83, 0, 42, 0, 87, 0, 30, 0, 90, 0, 19, 0, 94, 0, 8, 0, 95, 0, 0, 15, 6, 217, 249,
+ 15, 3, 225, 247, 16, 1, 227, 227, 13, 0, 233, 203, 12, 0, 237, 163, 10, 0, 243, 103, 11, 0, 249, 47, 12, 0, 252, 16,
+ 13, 0, 253, 0, 9, 9, 252, 0, 7, 15, 251, 0, 2, 32, 240, 0, 0, 47, 217, 2, 0, 58, 198, 2, 0, 68, 183, 1,
+ 0, 77, 168, 0, 0, 86, 153, 0, 13, 10, 206, 249, 13, 11, 205, 249, 13, 7, 217, 247, 14, 2, 226, 226, 9, 1, 237, 154,
+ 7, 2, 242, 91, 6, 5, 245, 39, 7, 5, 248, 8, 4, 14, 243, 1, 0, 25, 232, 2, 0, 31, 214, 1, 0, 41, 199, 0,
+ 0, 52, 183, 0, 0, 62, 169, 0, 0, 70, 157, 0, 0, 77, 145, 0, 0, 81, 142, 0, 8, 18, 191, 250, 9, 19, 189, 250,
+ 10, 13, 201, 250, 10, 7, 222, 240, 5, 10, 226, 167, 3, 13, 223, 104, 4, 14, 225, 51, 2, 17, 230, 20, 0, 23, 225, 9,
+ 0, 25, 214, 1, 0, 32, 199, 0, 0, 43, 180, 0, 0, 54, 164, 0, 0, 63, 150, 0, 0, 69, 136, 0, 0, 73, 127, 0,
+ 0, 75, 128, 0, 0, 32, 159, 250, 2, 30, 163, 250, 2, 26, 178, 250, 4, 14, 203, 250, 2, 20, 203, 203, 0, 23, 199, 147,
+ 0, 23, 200, 89, 0, 23, 204, 49, 0, 24, 203, 15, 0, 26, 199, 2, 0, 33, 183, 0, 0, 45, 162, 0, 0, 55, 143, 0,
+ 0, 63, 129, 0, 0, 67, 118, 0, 0, 71, 110, 0, 0, 71, 113, 0, 0, 33, 127, 251, 0, 36, 135, 251, 0, 33, 145, 250,
+ 0, 23, 166, 250, 0, 25, 162, 201, 0, 24, 157, 151, 0, 24, 169, 94, 0, 26, 172, 57, 0, 27, 175, 21, 0, 29, 172, 7,
+ 0, 35, 160, 1, 0, 46, 138, 0, 0, 56, 122, 0, 0, 61, 110, 0, 0, 65, 100, 0, 0, 68, 93, 0, 0, 68, 97, 0,
+ 0, 33, 101, 251, 0, 35, 107, 251, 0, 33, 113, 251, 0, 26, 122, 251, 0, 26, 120, 203, 0, 26, 125, 147, 0, 29, 119, 105,
+ 0, 29, 127, 65, 0, 30, 133, 31, 0, 32, 135, 14, 0, 36, 132, 3, 0, 46, 116, 0, 0, 54, 102, 0, 0, 59, 92, 0,
+ 0, 63, 85, 0, 0, 67, 81, 0, 0, 67, 83, 0, 0, 34, 79, 252, 0, 35, 83, 252, 0, 33, 86, 252, 0, 28, 90, 247,
+ 0, 29, 90, 201, 0, 29, 91, 144, 0, 32, 91, 102, 0, 34, 99, 74, 0, 34, 104, 41, 0, 34, 105, 21, 0, 37, 104, 8,
+ 0, 45, 95, 1, 0, 52, 85, 0, 0, 58, 78, 0, 0, 63, 72, 0, 0, 67, 68, 0, 0, 68, 68, 0, 0, 33, 59, 252,
+ 0, 34, 62, 252, 0, 32, 63, 251, 0, 29, 65, 236, 0, 31, 66, 197, 0, 34, 69, 144, 0, 34, 70, 102, 0, 40, 69, 74,
+ 0, 39, 75, 53, 0, 34, 80, 32, 0, 39, 80, 13, 0, 45, 77, 3, 0, 52, 70, 0, 0, 58, 64, 0, 0, 62, 59, 0,
+ 0, 66, 56, 0, 0, 69, 55, 0, 0, 33, 44, 253, 0, 34, 43, 253, 0, 33, 44, 251, 0, 29, 46, 234, 0, 35, 51, 191,
+ 0, 35, 51, 144, 0, 36, 52, 103, 0, 41, 53, 72, 0, 43, 54, 57, 0, 39, 58, 39, 0, 43, 60, 18, 0, 47, 60, 6,
+ 0, 52, 57, 1, 0, 57, 52, 0, 0, 61, 49, 0, 0, 63, 46, 0, 0, 66, 44, 0, 0, 31, 31, 253, 0, 34, 31, 253,
+ 0, 33, 30, 253, 1, 30, 32, 243, 1, 35, 36, 208, 0, 35, 38, 172, 0, 36, 39, 120, 0, 40, 40, 80, 0, 42, 41, 60,
+ 0, 41, 43, 46, 0, 44, 44, 25, 0, 50, 44, 11, 0, 55, 42, 2, 0, 58, 40, 0, 0, 59, 38, 0, 0, 60, 36, 0,
+ 0, 62, 34, 0, 0, 31, 23, 253, 0, 35, 22, 253, 0, 35, 21, 253, 0, 35, 21, 251, 0, 37, 22, 226, 0, 41, 25, 190,
+ 0, 39, 26, 142, 0, 42, 29, 93, 0, 43, 30, 64, 0, 43, 31, 50, 0, 42, 30, 37, 0, 51, 32, 18, 0, 58, 30, 6,
+ 0, 61, 29, 0, 0, 60, 28, 0, 0, 59, 27, 0, 0, 59, 24, 0, 0, 37, 16, 253, 0, 40, 15, 253, 0, 41, 15, 253,
+ 0, 42, 15, 252, 0, 42, 15, 231, 0, 48, 18, 200, 0, 47, 19, 159, 0, 48, 20, 114, 0, 48, 22, 76, 0, 45, 23, 54,
+ 0, 46, 23, 39, 0, 50, 24, 25, 0, 55, 24, 12, 0, 61, 22, 3, 0, 60, 22, 0, 0, 57, 23, 0, 0, 56, 23, 0,
+ 0, 41, 10, 254, 0, 44, 9, 254, 0, 47, 9, 254, 0, 48, 9, 250, 0, 51, 10, 227, 0, 52, 10, 199, 0, 53, 12, 163,
+ 0, 53, 11, 121, 0, 53, 13, 87, 0, 50, 16, 59, 0, 48, 17, 43, 0, 50, 17, 31, 0, 52, 17, 19, 0, 58, 17, 9,
+ 0, 62, 16, 1, 0, 58, 17, 0, 0, 57, 19, 0, 0, 47, 6, 254, 0, 50, 5, 254, 0, 52, 4, 253, 0, 54, 5, 242,
+ 0, 55, 5, 219, 0, 56, 5, 194, 0, 56, 6, 161, 0, 56, 6, 124, 0, 57, 6, 93, 0, 56, 7, 68, 0, 54, 9, 48,
+ 0, 55, 9, 37, 0, 57, 10, 25, 0, 58, 9, 14, 0, 65, 8, 4, 0, 61, 10, 0, 0, 59, 14, 0, 0, 56, 4, 254,
+ 0, 57, 1, 253, 0, 57, 1, 250, 0, 58, 1, 232, 0, 57, 1, 211, 0, 58, 1, 186, 0, 57, 1, 154, 0, 57, 1, 122,
+ 0, 58, 1, 94, 0, 58, 1, 70, 0, 59, 2, 54, 0, 61, 2, 42, 0, 63, 2, 29, 0, 65, 2, 19, 0, 67, 1, 8,
+ 0, 65, 2, 1, 0, 63, 9, 0, 0, 65, 2, 253, 0, 63, 0, 246, 0, 61, 0, 230, 0, 60, 0, 209, 0, 59, 0, 188,
+ 0, 57, 0, 158, 0, 56, 0, 127, 0, 56, 0, 101, 0, 55, 0, 79, 0, 54, 0, 63, 0, 55, 0, 51, 0, 56, 0, 42,
+ 0, 58, 0, 33, 0, 59, 0, 23, 0, 60, 0, 15, 0, 62, 0, 7, 0, 68, 5, 0, 0, 75, 0, 253, 0, 72, 0, 245,
+ 0, 70, 0, 233, 0, 69, 0, 219, 0, 67, 0, 201, 0, 66, 0, 175, 0, 64, 0, 139, 0, 64, 0, 109, 0, 64, 0, 85,
+ 0, 63, 0, 67, 0, 64, 0, 54, 0, 65, 0, 49, 0, 67, 0, 42, 0, 71, 0, 30, 0, 74, 0, 20, 0, 78, 0, 9,
+ 0, 80, 0, 0, 7, 9, 211, 250, 7, 6, 219, 248, 9, 2, 227, 233, 8, 0, 232, 211, 8, 0, 236, 181, 7, 0, 241, 130,
+ 8, 0, 247, 72, 9, 0, 250, 32, 10, 0, 252, 11, 10, 1, 253, 0, 7, 9, 252, 0, 6, 13, 251, 0, 1, 28, 238, 0,
+ 0, 40, 216, 1, 0, 50, 196, 0, 0, 60, 182, 0, 0, 70, 167, 0, 5, 12, 205, 250, 6, 13, 203, 250, 6, 9, 213, 249,
+ 8, 4, 226, 235, 6, 0, 236, 175, 4, 0, 239, 111, 3, 3, 239, 62, 3, 4, 243, 24, 1, 13, 238, 11, 0, 17, 234, 4,
+ 0, 21, 222, 1, 0, 26, 209, 1, 0, 35, 195, 0, 0, 45, 180, 0, 0, 54, 168, 0, 0, 62, 158, 0, 0, 66, 156, 0,
+ 2, 19, 193, 250, 3, 20, 190, 250, 4, 14, 202, 250, 4, 10, 219, 241, 2, 8, 224, 180, 0, 13, 220, 122, 0, 13, 220, 73,
+ 0, 13, 225, 34, 0, 14, 220, 14, 0, 16, 215, 3, 0, 21, 205, 0, 0, 28, 192, 0, 0, 36, 175, 0, 0, 47, 160, 0,
+ 0, 56, 147, 0, 0, 60, 138, 0, 0, 63, 142, 0, 0, 23, 166, 250, 0, 24, 167, 250, 1, 20, 181, 250, 1, 13, 197, 247,
+ 0, 15, 200, 209, 0, 14, 197, 158, 0, 14, 201, 101, 0, 14, 203, 57, 0, 15, 204, 19, 0, 17, 201, 4, 0, 23, 190, 0,
+ 0, 29, 173, 0, 0, 39, 153, 0, 0, 48, 137, 0, 0, 54, 127, 0, 0, 59, 119, 0, 0, 60, 126, 0, 0, 23, 131, 251,
+ 0, 25, 135, 251, 0, 21, 146, 251, 0, 15, 162, 251, 0, 15, 157, 201, 0, 15, 157, 155, 0, 15, 177, 102, 0, 16, 181, 63,
+ 0, 17, 181, 25, 0, 19, 180, 8, 0, 23, 169, 1, 0, 31, 150, 0, 0, 40, 131, 0, 0, 47, 118, 0, 0, 52, 108, 0,
+ 0, 56, 101, 0, 0, 57, 109, 0, 0, 24, 101, 252, 0, 25, 106, 252, 0, 22, 112, 252, 0, 18, 122, 252, 0, 19, 117, 200,
+ 0, 14, 128, 156, 0, 20, 121, 109, 0, 20, 131, 73, 0, 21, 139, 35, 0, 21, 140, 15, 0, 24, 139, 4, 0, 31, 127, 0,
+ 0, 39, 111, 0, 0, 45, 100, 0, 0, 51, 92, 0, 0, 55, 86, 0, 0, 55, 92, 0, 0, 25, 80, 252, 0, 25, 83, 252,
+ 0, 22, 85, 252, 0, 20, 89, 246, 0, 21, 91, 197, 0, 18, 92, 150, 0, 22, 91, 103, 0, 23, 100, 78, 0, 24, 107, 44,
+ 0, 24, 109, 23, 0, 25, 109, 9, 0, 30, 105, 1, 0, 37, 94, 0, 0, 44, 84, 0, 0, 50, 77, 0, 0, 54, 73, 0,
+ 0, 54, 77, 0, 0, 25, 62, 253, 0, 24, 63, 253, 0, 22, 65, 253, 0, 21, 66, 233, 0, 24, 67, 194, 0, 25, 71, 146,
+ 0, 25, 72, 104, 0, 24, 74, 79, 0, 25, 80, 55, 0, 25, 84, 36, 0, 26, 85, 15, 0, 29, 86, 4, 0, 36, 78, 0,
+ 0, 43, 70, 0, 0, 49, 64, 0, 0, 53, 60, 0, 0, 54, 63, 0, 0, 25, 47, 253, 0, 24, 48, 253, 0, 23, 48, 249,
+ 0, 25, 50, 222, 0, 27, 53, 192, 0, 26, 53, 143, 0, 26, 54, 104, 0, 28, 58, 77, 0, 31, 54, 55, 0, 30, 60, 42,
+ 0, 29, 65, 21, 0, 31, 66, 9, 0, 36, 63, 1, 0, 43, 57, 0, 0, 48, 53, 0, 0, 52, 50, 0, 0, 55, 50, 0,
+ 0, 25, 34, 253, 0, 23, 35, 253, 0, 23, 35, 250, 0, 23, 36, 230, 0, 29, 40, 197, 0, 26, 39, 166, 0, 27, 41, 112,
+ 0, 28, 37, 77, 0, 31, 42, 57, 0, 32, 44, 46, 0, 30, 48, 31, 0, 32, 49, 19, 0, 39, 47, 8, 0, 43, 46, 1,
+ 0, 47, 42, 0, 0, 50, 39, 0, 0, 53, 38, 0, 0, 23, 23, 253, 0, 25, 22, 254, 0, 25, 22, 253, 0, 27, 23, 244,
+ 0, 31, 26, 215, 0, 27, 28, 179, 0, 26, 30, 131, 0, 28, 32, 93, 0, 30, 31, 61, 0, 32, 34, 47, 0, 32, 36, 36,
+ 0, 34, 37, 22, 0, 41, 34, 10, 0, 45, 33, 1, 0, 46, 32, 0, 0, 47, 30, 0, 0, 49, 29, 0, 0, 23, 17, 254,
+ 0, 26, 16, 254, 0, 27, 16, 254, 0, 28, 16, 251, 0, 30, 17, 228, 0, 30, 20, 199, 0, 27, 20, 157, 0, 29, 21, 110,
+ 0, 31, 22, 71, 0, 31, 23, 50, 0, 33, 24, 39, 0, 35, 24, 30, 0, 42, 24, 12, 0, 47, 24, 2, 0, 48, 23, 0,
+ 0, 47, 22, 0, 0, 46, 20, 0, 0, 27, 11, 254, 0, 30, 11, 254, 0, 32, 10, 254, 0, 34, 10, 251, 0, 37, 12, 229,
+ 0, 37, 12, 201, 0, 36, 12, 164, 0, 36, 13, 122, 0, 38, 15, 89, 0, 38, 16, 59, 0, 37, 18, 43, 0, 38, 18, 30,
+ 0, 41, 18, 17, 0, 45, 18, 7, 0, 48, 17, 1, 0, 46, 18, 0, 0, 46, 18, 0, 0, 34, 7, 254, 0, 35, 6, 254,
+ 0, 37, 6, 253, 0, 39, 6, 245, 0, 41, 7, 222, 0, 43, 7, 198, 0, 42, 7, 166, 0, 42, 7, 127, 0, 43, 8, 96,
+ 0, 44, 8, 70, 0, 42, 11, 49, 0, 40, 12, 34, 0, 42, 12, 23, 0, 42, 12, 13, 0, 47, 12, 5, 0, 47, 12, 0,
+ 0, 47, 14, 0, 0, 41, 4, 254, 0, 42, 2, 253, 0, 42, 2, 250, 0, 44, 2, 232, 0, 45, 2, 211, 0, 46, 2, 190,
+ 0, 45, 2, 157, 0, 46, 2, 124, 0, 47, 2, 96, 0, 47, 2, 72, 0, 47, 3, 55, 0, 45, 5, 39, 0, 46, 5, 29,
+ 0, 47, 5, 18, 0, 47, 5, 8, 0, 50, 5, 1, 0, 50, 10, 0, 0, 49, 2, 254, 0, 49, 0, 245, 0, 49, 0, 231,
+ 0, 48, 0, 209, 0, 48, 0, 187, 0, 47, 0, 161, 0, 46, 0, 129, 0, 46, 0, 104, 0, 46, 0, 83, 0, 46, 0, 66,
+ 0, 46, 0, 52, 0, 46, 0, 40, 0, 48, 1, 32, 0, 49, 1, 23, 0, 49, 1, 14, 0, 50, 1, 5, 0, 55, 5, 0,
+ 0, 58, 0, 254, 0, 57, 0, 246, 0, 56, 0, 236, 0, 56, 0, 223, 0, 55, 0, 205, 0, 55, 0, 179, 0, 54, 0, 143,
+ 0, 53, 0, 113, 0, 53, 0, 89, 0, 53, 0, 69, 0, 53, 0, 56, 0, 53, 0, 45, 0, 55, 0, 40, 0, 57, 0, 31,
+ 0, 60, 0, 20, 0, 62, 0, 9, 0, 65, 0, 0, 2, 10, 207, 250, 1, 9, 214, 249, 6, 0, 228, 241, 6, 0, 231, 219,
+ 5, 0, 235, 194, 5, 0, 239, 154, 5, 0, 244, 100, 6, 0, 249, 53, 7, 0, 251, 25, 8, 0, 253, 9, 8, 0, 254, 0,
+ 6, 7, 253, 0, 4, 11, 252, 0, 1, 25, 237, 0, 0, 35, 214, 0, 0, 45, 195, 0, 0, 55, 181, 0, 2, 10, 201, 250,
+ 1, 10, 208, 250, 4, 1, 224, 247, 3, 0, 230, 225, 2, 0, 234, 189, 2, 0, 234, 131, 2, 0, 234, 83, 1, 3, 236, 44,
+ 0, 8, 235, 22, 0, 12, 232, 9, 0, 13, 227, 2, 0, 17, 217, 1, 0, 22, 208, 1, 0, 30, 195, 0, 0, 38, 180, 0,
+ 0, 47, 170, 0, 0, 52, 170, 0, 0, 14, 191, 250, 1, 12, 197, 250, 0, 8, 212, 248, 3, 0, 222, 227, 1, 3, 222, 189,
+ 0, 5, 217, 134, 0, 6, 216, 84, 0, 6, 218, 46, 0, 7, 219, 21, 0, 9, 215, 7, 0, 13, 210, 1, 0, 19, 200, 0,
+ 0, 24, 189, 0, 0, 32, 173, 0, 0, 41, 158, 0, 0, 47, 150, 0, 0, 49, 156, 0, 0, 15, 165, 251, 0, 15, 173, 251,
+ 0, 12, 189, 250, 0, 8, 197, 246, 0, 7, 197, 212, 0, 7, 195, 166, 0, 7, 201, 93, 0, 7, 203, 53, 0, 8, 204, 24,
+ 0, 9, 203, 7, 0, 14, 195, 0, 0, 20, 181, 0, 0, 26, 165, 0, 0, 34, 148, 0, 0, 40, 137, 0, 0, 46, 130, 0,
+ 0, 47, 139, 0, 0, 16, 133, 251, 0, 16, 139, 251, 0, 13, 150, 251, 0, 9, 158, 247, 0, 7, 152, 203, 0, 8, 159, 159,
+ 0, 8, 180, 95, 0, 9, 183, 59, 0, 9, 183, 28, 0, 10, 184, 10, 0, 14, 177, 1, 0, 21, 157, 0, 0, 27, 141, 0,
+ 0, 33, 128, 0, 0, 39, 118, 0, 0, 45, 111, 0, 0, 46, 121, 0, 0, 17, 104, 252, 0, 18, 106, 252, 0, 15, 112, 252,
+ 0, 11, 122, 251, 0, 11, 116, 200, 0, 8, 126, 156, 0, 12, 127, 111, 0, 12, 132, 77, 0, 13, 140, 40, 0, 13, 144, 19,
+ 0, 15, 144, 6, 0, 20, 135, 1, 0, 26, 122, 0, 0, 32, 109, 0, 0, 38, 99, 0, 0, 43, 93, 0, 0, 43, 103, 0,
+ 0, 18, 80, 252, 0, 18, 82, 252, 0, 16, 84, 252, 0, 14, 89, 240, 0, 14, 90, 193, 0, 11, 92, 153, 0, 13, 92, 106,
+ 0, 15, 100, 80, 0, 15, 108, 48, 0, 15, 111, 27, 0, 15, 113, 11, 0, 19, 113, 2, 0, 25, 103, 0, 0, 31, 92, 0,
+ 0, 37, 84, 0, 0, 42, 79, 0, 0, 42, 87, 0, 0, 19, 63, 253, 0, 17, 63, 253, 0, 16, 65, 253, 0, 16, 65, 226,
+ 0, 16, 68, 190, 0, 16, 72, 147, 0, 17, 74, 105, 0, 15, 75, 81, 0, 16, 81, 60, 0, 16, 87, 39, 0, 17, 89, 17,
+ 0, 18, 92, 5, 0, 23, 87, 0, 0, 30, 77, 0, 0, 36, 69, 0, 0, 41, 65, 0, 0, 40, 72, 0, 0, 19, 48, 253,
+ 0, 18, 49, 253, 0, 17, 49, 248, 0, 20, 51, 217, 0, 21, 54, 188, 0, 18, 55, 144, 0, 19, 56, 107, 0, 20, 60, 79,
+ 0, 20, 61, 58, 0, 19, 66, 44, 0, 19, 70, 23, 0, 19, 72, 9, 0, 23, 71, 2, 0, 30, 63, 0, 0, 36, 57, 0,
+ 0, 39, 54, 0, 0, 40, 58, 0, 0, 19, 35, 253, 0, 18, 36, 252, 0, 17, 37, 242, 0, 20, 39, 218, 0, 21, 41, 190,
+ 0, 19, 40, 148, 0, 20, 44, 109, 0, 21, 44, 78, 0, 22, 47, 59, 0, 25, 47, 47, 0, 23, 50, 34, 0, 22, 52, 22,
+ 0, 26, 52, 10, 0, 31, 51, 1, 0, 35, 47, 0, 0, 38, 44, 0, 0, 40, 45, 0, 0, 18, 25, 254, 0, 19, 24, 254,
+ 0, 19, 24, 251, 0, 22, 26, 232, 0, 23, 28, 204, 0, 20, 31, 168, 0, 21, 31, 108, 0, 21, 30, 79, 0, 22, 33, 58,
+ 0, 25, 37, 45, 0, 26, 38, 34, 0, 25, 39, 25, 0, 28, 39, 14, 0, 31, 39, 4, 0, 34, 36, 0, 0, 37, 33, 0,
+ 0, 40, 33, 0, 0, 17, 17, 254, 0, 19, 17, 254, 0, 20, 17, 253, 0, 22, 18, 243, 0, 26, 20, 217, 0, 20, 22, 182,
+ 0, 19, 23, 146, 0, 21, 24, 101, 0, 22, 24, 70, 0, 24, 26, 49, 0, 26, 28, 37, 0, 25, 29, 29, 0, 29, 27, 15,
+ 0, 32, 27, 5, 0, 35, 26, 0, 0, 36, 24, 0, 0, 38, 24, 0, 0, 17, 13, 254, 0, 20, 12, 254, 0, 21, 11, 254,
+ 0, 23, 11, 251, 0, 26, 13, 227, 0, 25, 13, 198, 0, 23, 13, 162, 0, 22, 14, 119, 0, 23, 15, 86, 0, 25, 17, 57,
+ 0, 26, 18, 40, 0, 26, 19, 30, 0, 27, 19, 23, 0, 33, 18, 7, 0, 36, 18, 1, 0, 36, 17, 0, 0, 35, 16, 0,
+ 0, 22, 8, 254, 0, 24, 7, 254, 0, 25, 6, 254, 0, 26, 6, 251, 0, 30, 8, 227, 0, 29, 8, 202, 0, 28, 8, 170,
+ 0, 27, 8, 129, 0, 29, 9, 97, 0, 30, 10, 71, 0, 30, 11, 49, 0, 29, 13, 34, 0, 31, 13, 23, 0, 33, 12, 11,
+ 0, 36, 13, 3, 0, 36, 13, 0, 0, 36, 13, 0, 0, 28, 5, 254, 0, 29, 3, 254, 0, 30, 2, 252, 0, 30, 2, 243,
+ 0, 32, 3, 217, 0, 32, 3, 196, 0, 32, 3, 166, 0, 32, 3, 127, 0, 34, 3, 98, 0, 35, 4, 74, 0, 35, 4, 57,
+ 0, 33, 6, 39, 0, 33, 7, 26, 0, 33, 7, 17, 0, 34, 7, 7, 0, 36, 7, 1, 0, 38, 10, 0, 0, 35, 2, 254,
+ 0, 35, 0, 249, 0, 35, 0, 240, 0, 35, 0, 224, 0, 35, 0, 194, 0, 36, 0, 167, 0, 35, 0, 137, 0, 35, 0, 108,
+ 0, 36, 0, 87, 0, 37, 0, 69, 0, 37, 0, 55, 0, 37, 1, 42, 0, 37, 1, 30, 0, 38, 1, 22, 0, 38, 1, 12,
+ 0, 38, 1, 3, 0, 42, 5, 0, 0, 43, 0, 254, 0, 42, 0, 247, 0, 42, 0, 239, 0, 42, 0, 228, 0, 43, 0, 211,
+ 0, 43, 0, 181, 0, 42, 0, 148, 0, 42, 0, 117, 0, 43, 0, 92, 0, 43, 0, 71, 0, 43, 0, 57, 0, 43, 0, 46,
+ 0, 43, 0, 37, 0, 45, 0, 31, 0, 47, 0, 21, 0, 49, 0, 10, 0, 50, 0, 0, 0, 9, 207, 250, 0, 7, 213, 250,
+ 4, 0, 227, 247, 4, 0, 230, 227, 3, 0, 234, 205, 4, 0, 237, 172, 4, 0, 242, 123, 4, 0, 247, 74, 4, 0, 250, 41,
+ 6, 0, 252, 20, 6, 0, 253, 8, 6, 0, 254, 0, 4, 6, 253, 0, 3, 9, 253, 0, 0, 22, 235, 0, 0, 31, 213, 0,
+ 0, 40, 194, 0, 0, 9, 200, 250, 0, 6, 207, 250, 2, 0, 221, 249, 1, 0, 225, 228, 0, 0, 225, 195, 0, 1, 224, 144,
+ 0, 1, 227, 100, 0, 1, 231, 62, 0, 3, 233, 32, 0, 6, 230, 17, 0, 8, 228, 7, 0, 10, 223, 2, 0, 14, 216, 1,
+ 0, 18, 208, 1, 0, 25, 197, 0, 0, 33, 184, 0, 0, 37, 184, 0, 0, 10, 189, 250, 0, 7, 195, 250, 0, 3, 210, 247,
+ 0, 1, 214, 223, 0, 0, 212, 190, 0, 0, 207, 138, 0, 0, 211, 93, 0, 1, 214, 60, 0, 2, 216, 31, 0, 4, 215, 13,
+ 0, 6, 212, 3, 0, 11, 205, 0, 0, 16, 196, 0, 0, 21, 187, 0, 0, 28, 173, 0, 0, 33, 164, 0, 0, 36, 171, 0,
+ 0, 10, 164, 251, 0, 8, 169, 251, 0, 5, 186, 250, 0, 3, 192, 241, 0, 2, 191, 210, 0, 1, 191, 166, 0, 1, 199, 96,
+ 0, 1, 200, 61, 0, 2, 202, 32, 0, 3, 203, 13, 0, 6, 200, 2, 0, 13, 188, 0, 0, 18, 175, 0, 0, 23, 162, 0,
+ 0, 28, 151, 0, 0, 33, 142, 0, 0, 34, 155, 0, 0, 12, 135, 252, 0, 10, 138, 252, 0, 7, 149, 251, 0, 4, 155, 244,
+ 0, 3, 154, 202, 0, 2, 158, 159, 0, 1, 179, 95, 0, 2, 182, 63, 0, 3, 182, 36, 0, 3, 185, 16, 0, 5, 183, 3,
+ 0, 11, 168, 0, 0, 17, 152, 0, 0, 22, 139, 0, 0, 27, 129, 0, 0, 33, 121, 0, 0, 34, 136, 0, 0, 13, 106, 252,
+ 0, 12, 106, 252, 0, 10, 112, 252, 0, 7, 120, 241, 0, 5, 120, 200, 0, 4, 123, 156, 0, 5, 125, 111, 0, 6, 130, 82,
+ 0, 6, 139, 47, 0, 6, 145, 25, 0, 6, 148, 10, 0, 9, 144, 1, 0, 16, 131, 0, 0, 21, 119, 0, 0, 27, 108, 0,
+ 0, 32, 101, 0, 0, 33, 116, 0, 0, 13, 82, 253, 0, 12, 82, 253, 0, 10, 86, 251, 0, 9, 90, 234, 0, 8, 92, 197,
+ 0, 5, 94, 158, 0, 6, 92, 105, 0, 8, 98, 83, 0, 8, 107, 54, 0, 8, 113, 32, 0, 8, 116, 16, 0, 9, 117, 4,
+ 0, 14, 110, 0, 0, 20, 101, 0, 0, 27, 91, 0, 0, 32, 85, 0, 0, 32, 97, 0, 0, 14, 63, 253, 0, 12, 63, 253,
+ 0, 10, 64, 253, 0, 11, 65, 224, 0, 10, 68, 192, 0, 10, 71, 149, 0, 10, 73, 107, 0, 9, 76, 83, 0, 9, 82, 64,
+ 0, 8, 89, 44, 0, 9, 93, 22, 0, 9, 95, 7, 0, 13, 93, 1, 0, 19, 85, 0, 0, 26, 76, 0, 0, 31, 70, 0,
+ 0, 31, 81, 0, 0, 14, 49, 253, 0, 12, 49, 253, 0, 11, 50, 246, 0, 12, 52, 215, 0, 14, 55, 186, 0, 11, 56, 145,
+ 0, 12, 58, 109, 0, 12, 61, 81, 0, 12, 62, 61, 0, 10, 69, 47, 0, 10, 74, 26, 0, 9, 76, 11, 0, 12, 77, 1,
+ 0, 18, 70, 0, 0, 26, 62, 0, 0, 30, 58, 0, 0, 30, 65, 0, 0, 14, 36, 253, 0, 13, 37, 253, 0, 13, 38, 244,
+ 0, 14, 41, 214, 0, 15, 43, 186, 0, 13, 43, 144, 0, 14, 45, 109, 0, 14, 48, 81, 0, 14, 50, 62, 0, 14, 52, 47,
+ 0, 13, 55, 34, 0, 12, 58, 22, 0, 13, 60, 6, 0, 19, 57, 1, 0, 25, 51, 0, 0, 29, 48, 0, 0, 30, 53, 0,
+ 0, 13, 26, 254, 0, 14, 25, 254, 0, 14, 26, 250, 0, 15, 29, 218, 0, 14, 32, 186, 0, 13, 33, 166, 0, 14, 33, 109,
+ 0, 15, 35, 82, 0, 14, 40, 63, 0, 16, 39, 46, 0, 19, 39, 35, 0, 17, 42, 26, 0, 16, 44, 13, 0, 20, 45, 5,
+ 0, 25, 41, 0, 0, 29, 38, 0, 0, 29, 42, 0, 0, 13, 19, 254, 0, 14, 18, 254, 0, 15, 18, 253, 0, 17, 21, 235,
+ 0, 15, 23, 200, 0, 14, 24, 170, 0, 13, 24, 129, 0, 15, 26, 92, 0, 16, 26, 65, 0, 17, 28, 48, 0, 20, 31, 37,
+ 0, 20, 32, 28, 0, 18, 33, 19, 0, 19, 34, 10, 0, 25, 32, 1, 0, 28, 29, 0, 0, 29, 30, 0, 0, 13, 13, 254,
+ 0, 14, 12, 254, 0, 15, 12, 254, 0, 17, 13, 247, 0, 19, 14, 217, 0, 17, 15, 189, 0, 15, 15, 154, 0, 14, 18, 112,
+ 0, 15, 19, 79, 0, 17, 20, 56, 0, 19, 21, 39, 0, 20, 22, 27, 0, 19, 23, 20, 0, 21, 23, 10, 0, 25, 22, 1,
+ 0, 27, 20, 0, 0, 28, 20, 0, 0, 12, 9, 254, 0, 15, 8, 254, 0, 16, 7, 254, 0, 17, 7, 251, 0, 20, 8, 228,
+ 0, 19, 9, 201, 0, 17, 9, 170, 0, 13, 10, 130, 0, 15, 11, 94, 0, 16, 11, 68, 0, 18, 12, 46, 0, 19, 14, 31,
+ 0, 20, 14, 21, 0, 20, 14, 17, 0, 26, 14, 2, 0, 27, 13, 0, 0, 26, 12, 0, 0, 18, 5, 254, 0, 19, 4, 254,
+ 0, 20, 3, 254, 0, 20, 3, 249, 0, 22, 4, 229, 0, 22, 4, 204, 0, 22, 4, 176, 0, 21, 5, 136, 0, 22, 5, 102,
+ 0, 22, 5, 77, 0, 24, 6, 58, 0, 24, 7, 39, 0, 23, 8, 25, 0, 24, 8, 17, 0, 25, 8, 6, 0, 27, 8, 1,
+ 0, 27, 9, 0, 0, 24, 2, 254, 0, 25, 1, 252, 0, 24, 0, 246, 0, 25, 0, 236, 0, 25, 0, 219, 0, 25, 0, 191,
+ 0, 25, 0, 158, 0, 26, 0, 125, 0, 26, 1, 98, 0, 27, 1, 77, 0, 28, 1, 60, 0, 29, 1, 46, 0, 27, 2, 31,
+ 0, 29, 2, 21, 0, 29, 2, 11, 0, 29, 2, 2, 0, 31, 5, 0, 0, 30, 0, 254, 0, 30, 0, 248, 0, 30, 0, 241,
+ 0, 30, 0, 233, 0, 30, 0, 219, 0, 30, 0, 187, 0, 31, 0, 153, 0, 31, 0, 122, 0, 31, 0, 96, 0, 32, 0, 75,
+ 0, 32, 0, 60, 0, 32, 0, 48, 0, 32, 0, 37, 0, 33, 0, 29, 0, 35, 0, 21, 0, 36, 0, 11, 0, 37, 0, 0,
+ 0, 6, 210, 250, 0, 5, 213, 250, 2, 0, 224, 248, 2, 0, 230, 231, 1, 0, 233, 211, 2, 0, 236, 184, 2, 0, 240, 144,
+ 2, 0, 245, 96, 2, 0, 249, 59, 3, 0, 251, 33, 4, 0, 253, 18, 4, 0, 254, 8, 4, 0, 254, 0, 3, 4, 254, 0,
+ 2, 6, 253, 0, 0, 18, 234, 0, 0, 28, 212, 0, 0, 6, 200, 250, 0, 3, 206, 250, 0, 1, 215, 244, 0, 0, 215, 221,
+ 0, 0, 215, 195, 0, 0, 213, 148, 0, 0, 218, 109, 0, 0, 223, 76, 0, 1, 227, 46, 0, 1, 230, 25, 0, 3, 229, 13,
+ 0, 5, 227, 4, 0, 7, 222, 1, 0, 10, 216, 0, 0, 14, 211, 0, 0, 21, 202, 0, 0, 25, 201, 0, 0, 7, 186, 251,
+ 0, 4, 192, 250, 0, 0, 200, 237, 0, 0, 199, 207, 0, 0, 198, 183, 0, 0, 199, 135, 0, 0, 203, 99, 0, 0, 207, 70,
+ 0, 0, 210, 43, 0, 0, 213, 21, 0, 2, 213, 9, 0, 5, 210, 1, 0, 10, 203, 0, 0, 14, 196, 0, 0, 17, 189, 0,
+ 0, 22, 182, 0, 0, 24, 190, 0, 0, 7, 163, 251, 0, 4, 165, 251, 0, 1, 177, 241, 0, 0, 177, 206, 0, 0, 177, 170,
+ 0, 0, 183, 130, 0, 0, 191, 92, 0, 0, 192, 66, 0, 0, 194, 44, 0, 0, 198, 23, 0, 1, 199, 8, 0, 4, 195, 1,
+ 0, 9, 186, 0, 0, 13, 177, 0, 0, 17, 167, 0, 0, 22, 159, 0, 0, 24, 175, 0, 0, 7, 136, 252, 0, 5, 138, 252,
+ 0, 2, 147, 247, 0, 1, 149, 214, 0, 0, 149, 166, 0, 0, 154, 131, 0, 0, 170, 93, 0, 0, 173, 66, 0, 0, 176, 45,
+ 0, 0, 178, 25, 0, 0, 182, 10, 0, 3, 178, 1, 0, 8, 164, 0, 0, 12, 152, 0, 0, 16, 142, 0, 0, 22, 134, 0,
+ 0, 23, 155, 0, 0, 8, 108, 252, 0, 7, 109, 252, 0, 4, 116, 249, 0, 3, 119, 220, 0, 2, 121, 180, 0, 0, 120, 145,
+ 0, 1, 121, 109, 0, 1, 127, 85, 0, 1, 137, 54, 0, 1, 143, 31, 0, 1, 149, 15, 0, 1, 150, 3, 0, 7, 139, 0,
+ 0, 12, 128, 0, 0, 16, 119, 0, 0, 22, 112, 0, 0, 23, 132, 0, 0, 8, 84, 253, 0, 7, 85, 253, 0, 5, 89, 250,
+ 0, 5, 91, 223, 0, 3, 94, 189, 0, 1, 95, 153, 0, 1, 92, 106, 0, 2, 98, 85, 0, 2, 106, 59, 0, 2, 113, 38,
+ 0, 2, 118, 21, 0, 2, 121, 8, 0, 5, 117, 1, 0, 11, 107, 0, 0, 16, 99, 0, 0, 22, 93, 0, 0, 22, 110, 0,
+ 0, 9, 64, 253, 0, 7, 64, 253, 0, 5, 65, 248, 0, 5, 66, 222, 0, 5, 69, 191, 0, 4, 71, 151, 0, 3, 73, 107,
+ 0, 3, 77, 84, 0, 3, 82, 65, 0, 2, 89, 49, 0, 3, 95, 26, 0, 3, 98, 12, 0, 4, 98, 1, 0, 10, 90, 0,
+ 0, 16, 82, 0, 0, 22, 77, 0, 0, 22, 91, 0, 0, 9, 50, 253, 0, 7, 50, 253, 0, 5, 51, 243, 0, 5, 52, 213,
+ 0, 6, 55, 184, 0, 5, 57, 144, 0, 5, 58, 108, 0, 5, 61, 83, 0, 6, 62, 63, 0, 4, 69, 51, 0, 3, 77, 30,
+ 0, 3, 79, 16, 0, 3, 80, 3, 0, 9, 75, 0, 0, 15, 68, 0, 0, 21, 63, 0, 0, 21, 74, 0, 0, 9, 38, 253,
+ 0, 7, 38, 253, 0, 7, 39, 245, 0, 8, 41, 210, 0, 8, 43, 180, 0, 7, 44, 140, 0, 7, 46, 109, 0, 7, 49, 84,
+ 0, 8, 51, 63, 0, 7, 54, 48, 0, 5, 58, 36, 0, 4, 62, 25, 0, 4, 65, 8, 0, 8, 62, 0, 0, 15, 56, 0,
+ 0, 21, 52, 0, 0, 21, 60, 0, 0, 9, 27, 254, 0, 9, 27, 254, 0, 9, 27, 250, 0, 8, 31, 213, 0, 8, 33, 170,
+ 0, 8, 33, 138, 0, 8, 36, 107, 0, 9, 37, 83, 0, 7, 41, 64, 0, 9, 40, 47, 0, 10, 41, 36, 0, 8, 46, 26,
+ 0, 7, 50, 14, 0, 8, 51, 2, 0, 15, 46, 0, 0, 21, 42, 0, 0, 21, 49, 0, 0, 9, 20, 254, 0, 10, 19, 254,
+ 0, 10, 20, 251, 0, 11, 23, 224, 0, 9, 25, 187, 0, 8, 26, 160, 0, 8, 26, 124, 0, 9, 28, 89, 0, 9, 30, 64,
+ 0, 10, 30, 47, 0, 13, 33, 36, 0, 14, 33, 27, 0, 12, 36, 20, 0, 10, 37, 10, 0, 14, 37, 1, 0, 20, 33, 0,
+ 0, 20, 38, 0, 0, 9, 15, 254, 0, 10, 13, 254, 0, 10, 13, 253, 0, 14, 15, 241, 0, 12, 16, 213, 0, 11, 17, 179,
+ 0, 8, 17, 146, 0, 8, 20, 102, 0, 11, 21, 65, 0, 12, 22, 48, 0, 13, 23, 37, 0, 15, 25, 26, 0, 16, 25, 19,
+ 0, 14, 26, 13, 0, 16, 27, 4, 0, 19, 25, 0, 0, 19, 27, 0, 0, 8, 10, 254, 0, 10, 8, 254, 0, 10, 8, 254,
+ 0, 11, 8, 248, 0, 14, 10, 223, 0, 12, 10, 192, 0, 9, 10, 157, 0, 6, 13, 116, 0, 8, 14, 84, 0, 10, 15, 62,
+ 0, 12, 15, 44, 0, 14, 17, 30, 0, 15, 17, 20, 0, 13, 18, 15, 0, 16, 18, 5, 0, 18, 16, 0, 0, 19, 17, 0,
+ 0, 8, 6, 255, 0, 10, 4, 255, 0, 11, 4, 254, 0, 11, 3, 250, 0, 14, 5, 230, 0, 12, 5, 205, 0, 11, 5, 176,
+ 0, 10, 6, 134, 0, 11, 6, 100, 0, 11, 6, 75, 0, 13, 7, 56, 0, 14, 8, 37, 0, 14, 9, 23, 0, 14, 9, 16,
+ 0, 14, 10, 12, 0, 18, 9, 0, 0, 17, 8, 0, 0, 14, 3, 255, 0, 15, 1, 254, 0, 15, 1, 251, 0, 15, 0, 245,
+ 0, 15, 1, 231, 0, 15, 1, 209, 0, 15, 1, 180, 0, 15, 1, 141, 0, 16, 2, 107, 0, 16, 2, 83, 0, 17, 2, 63,
+ 0, 18, 2, 47, 0, 18, 3, 31, 0, 18, 3, 21, 0, 21, 2, 11, 0, 20, 3, 0, 0, 20, 5, 0, 0, 20, 0, 255,
+ 0, 20, 0, 249, 0, 20, 0, 243, 0, 20, 0, 236, 0, 20, 0, 227, 0, 20, 0, 205, 0, 21, 0, 169, 0, 21, 0, 136,
+ 0, 21, 0, 105, 0, 22, 0, 81, 0, 22, 0, 62, 0, 23, 0, 49, 0, 23, 0, 38, 0, 23, 0, 28, 0, 24, 0, 21,
+ 0, 25, 0, 11, 0, 25, 0, 0, 0, 3, 213, 250, 0, 2, 215, 250, 1, 0, 221, 247, 1, 0, 225, 231, 0, 0, 228, 213,
+ 0, 0, 232, 191, 1, 0, 237, 160, 0, 0, 241, 117, 1, 0, 246, 79, 1, 0, 249, 49, 2, 0, 252, 29, 2, 0, 253, 17,
+ 2, 0, 254, 9, 2, 0, 254, 2, 2, 1, 254, 0, 1, 3, 254, 0, 0, 15, 234, 0, 0, 3, 201, 250, 0, 1, 206, 247,
+ 0, 0, 207, 235, 0, 0, 207, 213, 0, 0, 207, 192, 0, 0, 206, 156, 0, 0, 211, 119, 0, 0, 217, 90, 0, 0, 222, 63,
+ 0, 0, 227, 37, 0, 1, 229, 22, 0, 1, 230, 12, 0, 2, 229, 4, 0, 5, 224, 1, 0, 7, 220, 1, 0, 10, 216, 0,
+ 0, 12, 217, 0, 0, 4, 184, 251, 0, 1, 189, 246, 0, 0, 188, 220, 0, 0, 186, 195, 0, 0, 185, 174, 0, 0, 188, 139,
+ 0, 0, 197, 104, 0, 0, 201, 77, 0, 0, 204, 57, 0, 0, 208, 34, 0, 0, 211, 19, 0, 0, 212, 9, 0, 2, 211, 2,
+ 0, 5, 206, 1, 0, 8, 202, 0, 0, 10, 199, 0, 0, 12, 207, 0, 0, 3, 161, 251, 0, 1, 163, 248, 0, 0, 163, 223,
+ 0, 0, 161, 185, 0, 0, 161, 152, 0, 0, 167, 131, 0, 0, 180, 100, 0, 0, 184, 75, 0, 0, 188, 55, 0, 0, 191, 34,
+ 0, 0, 195, 19, 0, 0, 197, 8, 0, 2, 195, 1, 0, 5, 189, 0, 0, 8, 183, 0, 0, 11, 179, 0, 0, 12, 195, 0,
+ 0, 3, 136, 252, 0, 2, 138, 249, 0, 0, 139, 230, 0, 0, 136, 191, 0, 0, 137, 142, 0, 0, 139, 118, 0, 1, 145, 98,
+ 0, 1, 151, 76, 0, 0, 164, 56, 0, 0, 168, 36, 0, 0, 173, 21, 0, 0, 177, 9, 0, 1, 175, 2, 0, 5, 165, 0,
+ 0, 8, 156, 0, 0, 11, 152, 0, 0, 11, 178, 0, 0, 4, 110, 252, 0, 3, 111, 251, 0, 1, 116, 240, 0, 0, 115, 204,
+ 0, 0, 116, 159, 0, 0, 114, 128, 0, 0, 113, 106, 0, 0, 118, 89, 0, 0, 128, 61, 0, 0, 134, 41, 0, 0, 140, 26,
+ 0, 0, 145, 13, 0, 1, 146, 3, 0, 5, 139, 0, 0, 8, 131, 0, 0, 12, 127, 0, 0, 11, 154, 0, 0, 4, 86, 253,
+ 0, 3, 87, 252, 0, 1, 91, 246, 0, 1, 91, 216, 0, 0, 93, 178, 0, 0, 93, 139, 0, 0, 92, 101, 0, 0, 96, 83,
+ 0, 0, 103, 61, 0, 0, 107, 45, 0, 0, 113, 29, 0, 0, 117, 17, 0, 1, 119, 6, 0, 4, 114, 1, 0, 8, 108, 0,
+ 0, 12, 105, 0, 0, 11, 128, 0, 0, 4, 65, 253, 0, 3, 65, 253, 0, 1, 66, 245, 0, 1, 68, 221, 0, 1, 71, 190,
+ 0, 0, 73, 147, 0, 0, 75, 107, 0, 0, 77, 82, 0, 0, 80, 65, 0, 0, 86, 53, 0, 0, 93, 33, 0, 0, 96, 20,
+ 0, 0, 98, 8, 0, 3, 95, 1, 0, 8, 89, 0, 0, 12, 86, 0, 0, 11, 105, 0, 0, 5, 51, 254, 0, 3, 51, 252,
+ 0, 1, 53, 241, 0, 1, 54, 217, 0, 1, 57, 190, 0, 1, 59, 151, 0, 1, 61, 114, 0, 0, 62, 84, 0, 0, 62, 64,
+ 0, 0, 68, 51, 0, 0, 76, 34, 0, 0, 78, 23, 0, 0, 80, 11, 0, 2, 79, 1, 0, 7, 73, 0, 0, 12, 71, 0,
+ 0, 11, 85, 0, 0, 5, 39, 254, 0, 3, 39, 253, 0, 2, 40, 243, 0, 2, 43, 215, 0, 2, 45, 188, 0, 1, 46, 150,
+ 0, 1, 48, 114, 0, 1, 50, 88, 0, 2, 51, 65, 0, 0, 55, 51, 0, 1, 59, 38, 0, 0, 62, 28, 0, 0, 65, 14,
+ 0, 1, 66, 3, 0, 7, 61, 0, 0, 12, 58, 0, 0, 11, 69, 0, 0, 4, 28, 254, 0, 5, 28, 254, 0, 4, 29, 250,
+ 0, 3, 32, 219, 0, 3, 35, 185, 0, 2, 36, 144, 0, 3, 38, 106, 0, 3, 39, 85, 0, 1, 41, 65, 0, 3, 42, 49,
+ 0, 3, 44, 35, 0, 1, 50, 28, 0, 1, 53, 16, 0, 1, 54, 5, 0, 6, 50, 1, 0, 12, 47, 0, 0, 11, 56, 0,
+ 0, 5, 21, 254, 0, 5, 21, 254, 0, 5, 21, 252, 0, 4, 24, 228, 0, 4, 26, 196, 0, 3, 28, 158, 0, 3, 29, 121,
+ 0, 3, 30, 91, 0, 3, 30, 65, 0, 1, 32, 49, 0, 6, 33, 36, 0, 4, 36, 28, 0, 3, 40, 19, 0, 2, 42, 11,
+ 0, 5, 40, 1, 0, 11, 38, 0, 0, 11, 44, 0, 0, 5, 15, 254, 0, 5, 14, 254, 0, 5, 14, 253, 0, 8, 16, 239,
+ 0, 7, 18, 211, 0, 6, 19, 172, 0, 2, 19, 136, 0, 2, 22, 97, 0, 4, 23, 67, 0, 3, 24, 51, 0, 6, 25, 37,
+ 0, 7, 27, 27, 0, 10, 27, 18, 0, 7, 30, 13, 0, 6, 30, 4, 0, 10, 30, 0, 0, 10, 34, 0, 0, 4, 10, 255,
+ 0, 5, 9, 254, 0, 5, 9, 253, 0, 7, 10, 243, 0, 7, 11, 220, 0, 6, 12, 190, 0, 3, 12, 145, 0, 1, 15, 105,
+ 0, 2, 16, 77, 0, 4, 17, 56, 0, 5, 18, 40, 0, 7, 19, 31, 0, 9, 19, 20, 0, 8, 21, 14, 0, 5, 22, 6,
+ 0, 7, 22, 1, 0, 10, 24, 0, 0, 4, 6, 255, 0, 5, 4, 254, 0, 5, 4, 253, 0, 5, 4, 247, 0, 8, 6, 227,
+ 0, 6, 6, 201, 0, 5, 7, 160, 0, 4, 7, 121, 0, 4, 8, 89, 0, 3, 10, 67, 0, 5, 11, 49, 0, 6, 11, 35,
+ 0, 8, 12, 23, 0, 8, 13, 14, 0, 6, 15, 4, 0, 8, 14, 0, 0, 9, 14, 0, 0, 4, 3, 255, 0, 6, 1, 254,
+ 0, 6, 1, 253, 0, 6, 1, 250, 0, 6, 1, 235, 0, 6, 2, 211, 0, 6, 2, 182, 0, 6, 2, 138, 0, 5, 2, 103,
+ 0, 3, 3, 78, 0, 4, 3, 58, 0, 6, 4, 42, 0, 7, 4, 27, 0, 8, 5, 18, 0, 10, 4, 10, 0, 7, 5, 6,
+ 0, 8, 4, 0, 0, 10, 0, 255, 0, 10, 0, 250, 0, 10, 0, 246, 0, 10, 0, 241, 0, 10, 0, 235, 0, 10, 0, 219,
+ 0, 10, 0, 191, 0, 10, 0, 154, 0, 10, 0, 116, 0, 10, 0, 88, 0, 11, 0, 66, 0, 12, 0, 50, 0, 13, 0, 37,
+ 0, 12, 0, 27, 0, 12, 0, 18, 0, 12, 0, 10, 0, 13, 0, 0, 0, 0, 216, 250, 0, 0, 216, 247, 0, 0, 217, 239,
+ 0, 0, 218, 227, 0, 0, 221, 211, 0, 0, 224, 191, 0, 0, 228, 165, 0, 0, 233, 134, 0, 0, 239, 100, 0, 0, 244, 68,
+ 0, 0, 248, 44, 0, 0, 250, 28, 0, 0, 252, 18, 0, 0, 254, 10, 0, 0, 254, 5, 0, 0, 255, 2, 0, 0, 255, 0,
+ 0, 0, 203, 251, 0, 0, 203, 227, 0, 0, 203, 218, 0, 0, 203, 204, 0, 0, 205, 188, 0, 0, 207, 164, 0, 0, 210, 138,
+ 0, 0, 217, 113, 0, 0, 223, 89, 0, 0, 228, 61, 0, 0, 233, 38, 0, 0, 236, 26, 0, 0, 238, 17, 0, 0, 239, 10,
+ 0, 0, 240, 5, 0, 0, 240, 2, 0, 0, 240, 0, 0, 0, 185, 251, 0, 0, 187, 230, 0, 0, 186, 202, 0, 0, 186, 187,
+ 0, 0, 187, 165, 0, 0, 194, 138, 0, 0, 198, 117, 0, 0, 203, 98, 0, 0, 207, 78, 0, 0, 212, 55, 0, 0, 217, 35,
+ 0, 0, 220, 24, 0, 0, 222, 16, 0, 0, 223, 9, 0, 0, 224, 5, 0, 0, 224, 3, 0, 0, 225, 0, 0, 0, 161, 252,
+ 0, 0, 162, 233, 0, 0, 163, 207, 0, 0, 165, 171, 0, 0, 167, 148, 0, 0, 176, 125, 0, 0, 187, 113, 0, 0, 190, 95,
+ 0, 0, 194, 72, 0, 0, 197, 51, 0, 0, 202, 33, 0, 0, 206, 22, 0, 0, 208, 14, 0, 0, 209, 8, 0, 0, 210, 4,
+ 0, 0, 210, 2, 0, 0, 211, 0, 0, 0, 136, 252, 0, 0, 138, 236, 0, 0, 139, 211, 0, 0, 139, 178, 0, 0, 144, 135,
+ 0, 0, 145, 111, 0, 0, 164, 109, 0, 0, 172, 98, 0, 0, 175, 77, 0, 0, 179, 53, 0, 0, 184, 35, 0, 0, 189, 22,
+ 0, 0, 193, 13, 0, 0, 194, 7, 0, 0, 195, 3, 0, 0, 196, 1, 0, 0, 196, 0, 0, 0, 111, 253, 0, 0, 114, 239,
+ 0, 0, 115, 217, 0, 0, 117, 188, 0, 0, 120, 147, 0, 0, 124, 105, 0, 0, 128, 95, 0, 0, 131, 85, 0, 0, 136, 72,
+ 0, 0, 143, 55, 0, 0, 154, 40, 0, 0, 163, 26, 0, 0, 170, 15, 0, 0, 174, 7, 0, 0, 176, 3, 0, 0, 177, 1,
+ 0, 0, 177, 0, 0, 0, 87, 253, 0, 0, 90, 243, 0, 0, 92, 225, 0, 0, 95, 198, 0, 0, 99, 163, 0, 0, 101, 118,
+ 0, 0, 104, 86, 0, 0, 106, 78, 0, 0, 109, 69, 0, 0, 115, 57, 0, 0, 123, 43, 0, 0, 130, 30, 0, 0, 137, 19,
+ 0, 0, 142, 9, 0, 0, 145, 4, 0, 0, 147, 2, 0, 0, 150, 0, 0, 0, 67, 254, 0, 0, 68, 248, 0, 0, 71, 233,
+ 0, 0, 74, 208, 0, 0, 78, 177, 0, 0, 82, 134, 0, 0, 85, 98, 0, 0, 87, 75, 0, 0, 90, 67, 0, 0, 94, 58,
+ 0, 0, 99, 45, 0, 0, 104, 33, 0, 0, 109, 22, 0, 0, 114, 12, 0, 0, 118, 5, 0, 0, 120, 2, 0, 0, 123, 0,
+ 0, 0, 52, 254, 0, 0, 53, 250, 0, 0, 56, 237, 0, 0, 58, 215, 0, 0, 61, 188, 0, 0, 64, 147, 0, 0, 67, 110,
+ 0, 0, 70, 84, 0, 0, 72, 63, 0, 0, 76, 56, 0, 0, 80, 46, 0, 0, 85, 34, 0, 0, 89, 25, 0, 0, 93, 15,
+ 0, 0, 96, 7, 0, 0, 98, 2, 0, 0, 100, 0, 0, 0, 40, 254, 0, 0, 40, 251, 0, 0, 42, 241, 0, 0, 45, 219,
+ 0, 0, 49, 193, 0, 0, 52, 156, 0, 0, 54, 118, 0, 0, 56, 88, 0, 0, 58, 66, 0, 0, 62, 50, 0, 0, 64, 44,
+ 0, 0, 67, 36, 0, 0, 71, 25, 0, 0, 74, 16, 0, 0, 77, 8, 0, 0, 79, 3, 0, 0, 81, 0, 0, 0, 30, 254,
+ 0, 0, 30, 254, 0, 0, 31, 248, 0, 0, 34, 224, 0, 0, 38, 195, 0, 0, 41, 152, 0, 0, 41, 103, 0, 0, 42, 83,
+ 0, 0, 46, 68, 0, 0, 46, 49, 0, 0, 52, 40, 0, 0, 54, 35, 0, 0, 57, 26, 0, 0, 60, 18, 0, 0, 62, 10,
+ 0, 0, 64, 3, 0, 0, 66, 0, 0, 0, 22, 255, 0, 0, 22, 252, 0, 0, 23, 250, 0, 0, 24, 238, 0, 0, 28, 205,
+ 0, 0, 31, 158, 0, 0, 33, 115, 0, 0, 34, 88, 0, 0, 36, 67, 0, 0, 37, 51, 0, 0, 37, 38, 0, 0, 42, 32,
+ 0, 0, 45, 27, 0, 0, 47, 21, 0, 0, 49, 11, 0, 0, 51, 4, 0, 0, 53, 0, 0, 0, 16, 255, 0, 0, 15, 250,
+ 0, 0, 16, 246, 0, 0, 17, 238, 0, 0, 19, 213, 0, 0, 22, 177, 0, 0, 24, 123, 0, 0, 26, 91, 0, 0, 27, 67,
+ 0, 0, 29, 51, 0, 0, 29, 41, 0, 0, 30, 33, 0, 0, 33, 25, 0, 0, 36, 20, 0, 0, 38, 11, 0, 0, 39, 5,
+ 0, 0, 41, 0, 0, 0, 10, 255, 0, 0, 10, 250, 0, 0, 10, 245, 0, 0, 11, 237, 0, 0, 12, 216, 0, 0, 14, 182,
+ 0, 0, 16, 122, 0, 0, 18, 86, 0, 0, 19, 67, 0, 0, 20, 50, 0, 0, 21, 41, 0, 0, 22, 35, 0, 0, 23, 27,
+ 0, 0, 26, 20, 0, 0, 28, 13, 0, 0, 29, 8, 0, 0, 30, 0, 0, 0, 6, 255, 0, 0, 6, 250, 0, 0, 6, 246,
+ 0, 0, 6, 241, 0, 0, 7, 225, 0, 0, 8, 198, 0, 0, 9, 153, 0, 0, 11, 101, 0, 0, 12, 73, 0, 0, 13, 52,
+ 0, 0, 14, 39, 0, 0, 14, 33, 0, 0, 15, 29, 0, 0, 16, 23, 0, 0, 18, 14, 0, 0, 19, 8, 0, 0, 20, 0,
+ 0, 0, 2, 255, 0, 0, 2, 251, 0, 0, 2, 247, 0, 0, 2, 243, 0, 0, 3, 235, 0, 0, 4, 211, 0, 0, 4, 174,
+ 0, 0, 5, 114, 0, 0, 6, 81, 0, 0, 7, 55, 0, 0, 8, 42, 0, 0, 7, 34, 0, 0, 8, 26, 0, 0, 8, 21,
+ 0, 0, 8, 16, 0, 0, 9, 7, 0, 0, 10, 0, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255,
+ 0, 0, 0, 248, 0, 0, 0, 225, 0, 0, 0, 191, 0, 0, 0, 151, 0, 0, 0, 114, 0, 0, 0, 87, 0, 0, 0, 66,
+ 0, 0, 0, 49, 0, 0, 0, 35, 0, 0, 0, 23, 0, 0, 0, 14, 0, 0, 0, 7, 0, 0, 0, 0
+};
+
+// Photo Best (Vail)
+unsigned char ucMapDJ4100_KCMY_Photo_BestV_12x12x1[] =
+{
+ 200, 110, 60, 64, 177, 141, 74, 53, 155, 171, 87, 41, 133, 199, 99, 31, 112, 227, 111, 21, 102, 232, 109, 21, 83, 244, 112, 19,
+ 64, 247, 114, 21, 45, 247, 114, 24, 27, 247, 115, 25, 17, 247, 112, 21, 12, 248, 107, 15, 8, 248, 104, 11, 6, 248, 102, 8,
+ 3, 248, 100, 5, 1, 248, 99, 2, 0, 248, 98, 0, 178, 136, 53, 100, 176, 144, 53, 56, 152, 175, 96, 39, 135, 197, 102, 31,
+ 113, 226, 115, 21, 102, 231, 114, 21, 84, 242, 114, 19, 65, 247, 118, 20, 47, 247, 117, 23, 29, 247, 117, 24, 18, 247, 114, 22,
+ 13, 247, 110, 16, 9, 248, 106, 11, 5, 248, 103, 7, 2, 247, 101, 3, 1, 245, 100, 1, 0, 243, 100, 0, 155, 162, 47, 135,
+ 153, 168, 46, 119, 152, 177, 46, 58, 127, 210, 74, 33, 102, 233, 103, 22, 83, 240, 118, 19, 69, 246, 120, 19, 54, 246, 120, 21,
+ 37, 247, 120, 23, 22, 247, 119, 23, 15, 247, 113, 17, 10, 247, 109, 12, 6, 247, 105, 8, 3, 246, 103, 3, 1, 244, 102, 1,
+ 0, 240, 102, 0, 0, 237, 101, 0, 118, 186, 40, 197, 118, 202, 37, 181, 122, 205, 37, 120, 103, 238, 33, 51, 90, 243, 67, 29,
+ 73, 238, 97, 30, 56, 241, 112, 28, 37, 243, 118, 26, 21, 245, 120, 23, 13, 246, 114, 15, 7, 246, 109, 9, 4, 245, 106, 5,
+ 2, 242, 105, 3, 1, 239, 105, 1, 0, 236, 104, 0, 0, 233, 103, 0, 0, 229, 101, 0, 92, 197, 38, 230, 93, 211, 35, 216,
+ 96, 211, 37, 168, 92, 224, 37, 110, 82, 231, 43, 58, 68, 231, 68, 46, 49, 233, 93, 44, 31, 235, 105, 38, 17, 237, 109, 31,
+ 11, 237, 105, 19, 4, 236, 106, 14, 1, 235, 106, 10, 0, 232, 105, 7, 0, 230, 104, 3, 0, 226, 102, 1, 0, 222, 100, 0,
+ 0, 218, 99, 0, 72, 203, 39, 229, 70, 213, 37, 223, 71, 211, 42, 191, 70, 211, 45, 152, 64, 216, 49, 108, 55, 219, 61, 73,
+ 39, 225, 78, 62, 24, 225, 92, 54, 14, 227, 97, 41, 9, 226, 97, 28, 4, 224, 99, 22, 3, 222, 99, 16, 0, 220, 100, 13,
+ 0, 218, 99, 9, 0, 214, 98, 5, 0, 211, 96, 3, 0, 208, 94, 0, 49, 204, 42, 229, 47, 210, 41, 226, 44, 212, 47, 207,
+ 44, 208, 52, 177, 43, 207, 55, 144, 38, 211, 60, 109, 24, 215, 76, 84, 13, 218, 84, 70, 9, 219, 86, 54, 6, 218, 86, 36,
+ 2, 215, 89, 27, 0, 212, 92, 24, 0, 209, 93, 19, 0, 207, 93, 14, 0, 204, 91, 9, 0, 202, 89, 4, 0, 200, 87, 0,
+ 24, 202, 46, 230, 22, 207, 45, 227, 19, 207, 50, 214, 17, 204, 57, 190, 19, 199, 61, 161, 18, 200, 65, 135, 12, 205, 69, 105,
+ 1, 211, 82, 87, 0, 211, 79, 69, 0, 211, 77, 50, 0, 211, 77, 34, 0, 209, 79, 23, 0, 204, 83, 19, 0, 199, 84, 15,
+ 0, 195, 84, 10, 0, 193, 82, 5, 0, 190, 80, 0, 4, 201, 43, 231, 3, 205, 41, 229, 2, 206, 43, 217, 0, 201, 51, 195,
+ 0, 197, 59, 175, 0, 195, 63, 155, 0, 198, 64, 128, 0, 203, 63, 96, 0, 208, 60, 64, 0, 207, 60, 49, 0, 207, 61, 36,
+ 0, 207, 63, 25, 0, 204, 68, 18, 0, 198, 73, 14, 0, 191, 75, 10, 0, 186, 74, 5, 0, 181, 73, 0, 1, 202, 27, 234,
+ 0, 205, 23, 232, 0, 203, 25, 219, 0, 198, 32, 197, 0, 195, 38, 177, 0, 194, 43, 157, 0, 195, 45, 135, 0, 198, 44, 108,
+ 0, 201, 44, 79, 0, 207, 38, 44, 0, 206, 43, 35, 0, 205, 49, 29, 0, 203, 53, 20, 0, 199, 57, 13, 0, 192, 62, 9,
+ 0, 184, 64, 4, 0, 177, 65, 0, 0, 201, 18, 234, 0, 203, 15, 233, 0, 203, 14, 224, 0, 198, 19, 203, 0, 194, 24, 183,
+ 0, 192, 29, 162, 0, 192, 32, 143, 0, 193, 32, 120, 0, 195, 32, 95, 0, 200, 29, 65, 0, 206, 24, 31, 0, 204, 32, 26,
+ 0, 202, 38, 21, 0, 199, 42, 14, 0, 194, 46, 9, 0, 187, 51, 4, 0, 179, 54, 0, 0, 199, 14, 235, 0, 201, 12, 234,
+ 0, 203, 10, 228, 0, 200, 12, 211, 0, 195, 16, 192, 0, 192, 20, 173, 0, 191, 23, 153, 0, 191, 24, 133, 0, 193, 23, 110,
+ 0, 196, 22, 84, 0, 200, 19, 54, 0, 204, 17, 22, 0, 202, 24, 19, 0, 198, 29, 14, 0, 195, 32, 9, 0, 189, 36, 4,
+ 0, 182, 41, 0, 0, 198, 11, 235, 0, 199, 9, 234, 0, 200, 7, 230, 0, 199, 8, 216, 0, 196, 11, 199, 0, 193, 13, 182,
+ 0, 191, 16, 163, 0, 191, 19, 145, 0, 192, 18, 124, 0, 194, 16, 101, 0, 197, 14, 74, 0, 200, 13, 46, 0, 204, 12, 17,
+ 0, 199, 18, 13, 0, 194, 21, 9, 0, 189, 24, 4, 0, 184, 27, 0, 0, 196, 8, 234, 0, 197, 6, 234, 0, 198, 5, 230,
+ 0, 197, 6, 219, 0, 195, 7, 204, 0, 192, 9, 188, 0, 191, 11, 172, 0, 190, 13, 155, 0, 191, 14, 136, 0, 193, 13, 115,
+ 0, 195, 11, 92, 0, 197, 10, 67, 0, 200, 9, 40, 0, 203, 8, 12, 0, 196, 12, 8, 0, 189, 14, 4, 0, 184, 16, 0,
+ 0, 194, 5, 234, 0, 195, 4, 234, 0, 195, 3, 230, 0, 195, 4, 221, 0, 194, 5, 209, 0, 191, 6, 194, 0, 190, 7, 179,
+ 0, 190, 9, 163, 0, 190, 10, 145, 0, 191, 10, 126, 0, 193, 8, 105, 0, 195, 7, 83, 0, 197, 6, 60, 0, 199, 5, 35,
+ 0, 202, 5, 8, 0, 193, 8, 4, 0, 185, 9, 0, 0, 193, 3, 234, 0, 193, 2, 233, 0, 193, 1, 230, 0, 192, 2, 223,
+ 0, 192, 2, 212, 0, 191, 3, 199, 0, 189, 3, 185, 0, 189, 4, 170, 0, 189, 5, 153, 0, 190, 5, 136, 0, 191, 5, 116,
+ 0, 193, 4, 96, 0, 194, 3, 75, 0, 196, 3, 53, 0, 198, 2, 29, 0, 201, 2, 4, 0, 191, 4, 0, 0, 191, 0, 234,
+ 0, 191, 0, 232, 0, 191, 0, 229, 0, 190, 0, 223, 0, 190, 0, 215, 0, 189, 0, 203, 0, 188, 0, 190, 0, 188, 0, 176,
+ 0, 189, 0, 160, 0, 190, 0, 144, 0, 190, 0, 126, 0, 191, 0, 107, 0, 192, 0, 88, 0, 193, 0, 68, 0, 194, 0, 47,
+ 0, 196, 0, 25, 0, 200, 0, 0, 182, 96, 89, 88, 165, 101, 121, 50, 143, 140, 144, 36, 95, 201, 190, 13, 48, 225, 196, 9,
+ 35, 233, 189, 10, 52, 223, 164, 26, 39, 221, 151, 32, 22, 228, 146, 25, 13, 231, 137, 16, 6, 234, 131, 12, 3, 238, 126, 9,
+ 3, 240, 118, 4, 2, 241, 113, 2, 1, 242, 109, 1, 0, 243, 106, 0, 0, 244, 103, 0, 172, 110, 60, 114, 177, 112, 61, 66,
+ 144, 173, 91, 41, 110, 220, 123, 22, 90, 227, 137, 20, 72, 238, 136, 19, 61, 241, 126, 22, 45, 242, 124, 24, 28, 243, 124, 24,
+ 17, 244, 119, 19, 8, 245, 112, 11, 4, 245, 107, 4, 1, 242, 106, 1, 1, 239, 105, 1, 0, 237, 105, 0, 0, 235, 105, 0,
+ 0, 238, 100, 0, 143, 149, 50, 160, 152, 162, 47, 142, 147, 177, 45, 85, 120, 207, 79, 35, 96, 224, 105, 27, 73, 238, 115, 25,
+ 57, 243, 119, 23, 42, 245, 119, 24, 27, 246, 119, 24, 16, 246, 114, 19, 8, 246, 108, 10, 3, 246, 104, 3, 1, 243, 104, 1,
+ 0, 238, 104, 0, 0, 234, 105, 0, 0, 231, 105, 0, 0, 233, 102, 0, 114, 173, 43, 208, 114, 193, 39, 202, 112, 209, 36, 167,
+ 117, 201, 41, 79, 96, 220, 60, 38, 72, 227, 98, 38, 51, 231, 115, 35, 34, 235, 120, 32, 21, 238, 120, 26, 12, 240, 113, 17,
+ 4, 241, 109, 10, 1, 241, 105, 2, 0, 237, 105, 0, 0, 232, 105, 0, 0, 228, 105, 0, 0, 225, 104, 0, 0, 225, 102, 0,
+ 92, 181, 42, 233, 91, 198, 38, 228, 88, 216, 35, 209, 96, 197, 43, 133, 89, 202, 48, 81, 72, 218, 65, 53, 48, 222, 95, 52,
+ 30, 225, 107, 45, 17, 229, 110, 35, 10, 230, 106, 21, 1, 232, 106, 13, 0, 232, 104, 3, 0, 228, 103, 1, 0, 223, 103, 0,
+ 0, 219, 102, 0, 0, 217, 101, 0, 0, 216, 99, 0, 70, 195, 42, 231, 68, 202, 40, 229, 64, 216, 38, 221, 66, 208, 46, 175,
+ 62, 206, 52, 132, 58, 211, 58, 91, 42, 214, 78, 72, 24, 214, 95, 63, 15, 217, 99, 49, 9, 221, 97, 32, 3, 223, 96, 21,
+ 0, 223, 96, 10, 0, 221, 95, 3, 0, 216, 95, 1, 0, 212, 95, 0, 0, 209, 95, 0, 0, 207, 94, 0, 46, 197, 44, 231,
+ 45, 203, 43, 229, 42, 211, 42, 224, 39, 208, 51, 197, 39, 204, 56, 161, 38, 203, 61, 127, 29, 205, 72, 98, 14, 207, 86, 83,
+ 8, 209, 90, 65, 5, 210, 89, 46, 3, 211, 88, 30, 0, 211, 88, 20, 0, 211, 87, 10, 0, 209, 86, 4, 0, 206, 87, 1,
+ 0, 202, 87, 0, 0, 199, 88, 0, 22, 197, 48, 231, 20, 201, 47, 230, 18, 206, 47, 226, 14, 205, 54, 205, 12, 198, 62, 178,
+ 14, 196, 66, 149, 8, 198, 74, 125, 5, 201, 78, 100, 2, 204, 80, 80, 0, 205, 79, 60, 0, 206, 76, 39, 0, 204, 78, 25,
+ 0, 202, 79, 15, 0, 200, 79, 8, 0, 198, 79, 3, 0, 194, 79, 1, 0, 190, 81, 0, 4, 198, 42, 232, 4, 201, 41, 232,
+ 3, 203, 39, 227, 0, 203, 45, 208, 0, 196, 54, 185, 0, 193, 60, 163, 0, 194, 64, 140, 0, 196, 65, 111, 0, 198, 64, 85,
+ 0, 200, 62, 65, 0, 201, 61, 45, 0, 202, 62, 29, 0, 199, 65, 17, 0, 195, 68, 10, 0, 191, 70, 5, 0, 186, 71, 1,
+ 0, 180, 73, 0, 0, 199, 25, 235, 0, 200, 25, 233, 0, 200, 25, 224, 0, 196, 30, 205, 0, 193, 37, 185, 0, 191, 42, 165,
+ 0, 191, 46, 144, 0, 192, 47, 119, 0, 193, 49, 94, 0, 196, 47, 70, 0, 198, 46, 51, 0, 199, 48, 36, 0, 199, 49, 23,
+ 0, 195, 53, 12, 0, 189, 58, 6, 0, 182, 61, 2, 0, 175, 64, 0, 0, 198, 17, 235, 0, 195, 13, 228, 0, 195, 14, 220,
+ 0, 192, 18, 206, 0, 188, 23, 188, 0, 187, 27, 168, 0, 186, 31, 148, 0, 187, 33, 128, 0, 188, 34, 104, 0, 190, 34, 80,
+ 0, 194, 31, 56, 0, 196, 32, 39, 0, 196, 35, 28, 0, 195, 37, 17, 0, 191, 41, 8, 0, 184, 47, 3, 0, 174, 53, 0,
+ 0, 197, 13, 235, 0, 191, 7, 225, 0, 190, 7, 217, 0, 189, 9, 206, 0, 185, 12, 191, 0, 184, 15, 174, 0, 183, 19, 154,
+ 0, 183, 21, 135, 0, 183, 23, 114, 0, 186, 22, 91, 0, 188, 21, 68, 0, 192, 20, 44, 0, 193, 23, 31, 0, 192, 25, 21,
+ 0, 190, 28, 12, 0, 186, 32, 5, 0, 178, 39, 0, 0, 195, 10, 235, 0, 187, 3, 223, 0, 186, 2, 216, 0, 185, 3, 206,
+ 0, 183, 6, 194, 0, 183, 7, 179, 0, 182, 10, 161, 0, 181, 13, 143, 0, 181, 14, 124, 0, 183, 14, 102, 0, 185, 13, 80,
+ 0, 188, 12, 56, 0, 191, 12, 34, 0, 189, 15, 23, 0, 187, 17, 15, 0, 184, 20, 7, 0, 180, 26, 0, 0, 194, 7, 235,
+ 0, 184, 1, 220, 0, 182, 1, 213, 0, 181, 1, 206, 0, 181, 2, 195, 0, 181, 3, 183, 0, 180, 4, 167, 0, 179, 6, 150,
+ 0, 180, 8, 133, 0, 180, 8, 113, 0, 183, 7, 91, 0, 184, 6, 69, 0, 187, 6, 46, 0, 188, 6, 25, 0, 185, 9, 15,
+ 0, 182, 10, 8, 0, 178, 14, 0, 0, 192, 5, 235, 0, 181, 1, 218, 0, 178, 0, 212, 0, 178, 0, 205, 0, 178, 0, 196,
+ 0, 178, 1, 185, 0, 178, 1, 171, 0, 178, 2, 156, 0, 178, 4, 140, 0, 179, 4, 122, 0, 181, 4, 102, 0, 183, 3, 82,
+ 0, 184, 2, 60, 0, 186, 2, 38, 0, 187, 3, 18, 0, 182, 5, 8, 0, 178, 7, 0, 0, 191, 2, 234, 0, 179, 0, 218,
+ 0, 177, 0, 212, 0, 177, 0, 206, 0, 176, 0, 198, 0, 177, 0, 188, 0, 177, 0, 175, 0, 177, 0, 161, 0, 178, 1, 146,
+ 0, 178, 1, 130, 0, 180, 1, 111, 0, 181, 1, 93, 0, 182, 0, 73, 0, 183, 0, 52, 0, 185, 0, 31, 0, 186, 1, 11,
+ 0, 181, 5, 0, 0, 189, 0, 234, 0, 180, 0, 217, 0, 180, 0, 214, 0, 180, 0, 208, 0, 179, 0, 201, 0, 180, 0, 191,
+ 0, 180, 0, 179, 0, 180, 0, 166, 0, 180, 0, 152, 0, 181, 0, 136, 0, 182, 0, 119, 0, 183, 0, 101, 0, 183, 0, 84,
+ 0, 184, 0, 65, 0, 185, 0, 43, 0, 187, 0, 22, 0, 189, 0, 0, 165, 82, 118, 113, 155, 74, 140, 88, 136, 86, 173, 40,
+ 111, 121, 191, 29, 83, 172, 190, 25, 61, 196, 183, 30, 48, 195, 172, 43, 25, 203, 164, 47, 13, 208, 156, 34, 4, 215, 150, 25,
+ 4, 219, 141, 14, 0, 224, 137, 12, 0, 229, 131, 7, 1, 232, 123, 3, 1, 235, 117, 1, 0, 236, 113, 0, 0, 238, 109, 0,
+ 161, 86, 94, 131, 155, 90, 103, 109, 138, 107, 133, 48, 106, 160, 164, 30, 81, 195, 163, 31, 55, 209, 161, 40, 36, 213, 155, 39,
+ 23, 217, 150, 33, 13, 222, 143, 22, 4, 226, 137, 13, 0, 228, 131, 5, 0, 228, 125, 1, 0, 227, 120, 0, 0, 226, 116, 0,
+ 0, 225, 113, 0, 0, 226, 110, 0, 0, 232, 107, 0, 146, 108, 60, 163, 146, 112, 60, 147, 144, 114, 62, 68, 114, 169, 101, 45,
+ 89, 193, 114, 41, 64, 211, 124, 43, 44, 224, 128, 37, 29, 231, 127, 31, 18, 235, 122, 25, 10, 237, 115, 14, 2, 238, 112, 7,
+ 1, 237, 108, 1, 0, 232, 107, 0, 0, 227, 106, 0, 0, 224, 106, 0, 0, 221, 105, 0, 0, 225, 102, 0, 114, 141, 52, 212,
+ 114, 154, 49, 203, 115, 162, 49, 159, 116, 160, 54, 84, 98, 178, 77, 52, 67, 202, 108, 52, 45, 213, 121, 49, 30, 222, 122, 41,
+ 18, 227, 120, 32, 11, 230, 114, 21, 3, 232, 110, 14, 1, 233, 106, 3, 0, 228, 105, 0, 0, 223, 105, 0, 0, 219, 104, 0,
+ 0, 216, 104, 0, 0, 218, 102, 0, 90, 156, 49, 238, 90, 171, 45, 233, 88, 184, 45, 208, 93, 173, 51, 135, 92, 170, 59, 85,
+ 72, 186, 82, 66, 44, 204, 106, 63, 26, 210, 115, 55, 15, 214, 117, 42, 9, 215, 113, 28, 1, 218, 111, 19, 0, 220, 107, 6,
+ 0, 218, 104, 0, 0, 213, 104, 0, 0, 211, 103, 0, 0, 209, 102, 0, 0, 211, 100, 0, 68, 179, 47, 234, 66, 187, 45, 232,
+ 62, 198, 45, 222, 62, 193, 55, 176, 63, 185, 64, 131, 61, 184, 70, 96, 39, 198, 89, 81, 22, 204, 101, 69, 13, 206, 104, 53,
+ 7, 210, 102, 38, 0, 212, 102, 25, 0, 213, 99, 10, 0, 211, 97, 1, 0, 208, 97, 0, 0, 205, 97, 0, 0, 203, 96, 0,
+ 0, 204, 95, 0, 44, 187, 48, 233, 42, 193, 46, 231, 40, 200, 46, 227, 35, 200, 57, 198, 35, 194, 64, 163, 35, 192, 69, 131,
+ 28, 195, 77, 103, 14, 200, 90, 86, 8, 202, 92, 67, 4, 203, 93, 50, 2, 204, 91, 33, 0, 206, 89, 18, 0, 206, 86, 6,
+ 0, 204, 86, 1, 0, 200, 87, 0, 0, 198, 88, 0, 0, 196, 88, 0, 20, 191, 51, 232, 18, 195, 50, 231, 16, 200, 48, 228,
+ 13, 198, 55, 206, 9, 193, 66, 179, 8, 191, 72, 154, 3, 192, 81, 135, 0, 195, 85, 110, 0, 198, 83, 85, 0, 199, 80, 63,
+ 0, 200, 79, 41, 0, 199, 79, 25, 0, 198, 78, 13, 0, 197, 77, 4, 0, 194, 78, 1, 0, 191, 79, 0, 0, 188, 81, 0,
+ 5, 193, 43, 234, 4, 196, 41, 233, 3, 200, 40, 226, 0, 199, 46, 208, 0, 192, 54, 185, 0, 190, 61, 164, 0, 189, 65, 143,
+ 0, 191, 67, 115, 0, 193, 65, 89, 0, 195, 65, 69, 0, 195, 64, 49, 0, 196, 64, 31, 0, 194, 66, 17, 0, 190, 68, 8,
+ 0, 187, 69, 2, 0, 183, 71, 0, 0, 179, 74, 0, 0, 194, 26, 236, 0, 195, 26, 231, 0, 194, 28, 219, 0, 193, 33, 205,
+ 0, 189, 39, 187, 0, 188, 44, 167, 0, 188, 47, 145, 0, 188, 49, 122, 0, 188, 52, 98, 0, 190, 51, 76, 0, 191, 49, 56,
+ 0, 193, 49, 39, 0, 192, 50, 23, 0, 189, 53, 11, 0, 184, 57, 4, 0, 179, 60, 1, 0, 172, 64, 0, 0, 193, 16, 236,
+ 0, 191, 14, 227, 0, 188, 18, 215, 0, 185, 22, 202, 0, 183, 25, 187, 0, 183, 29, 169, 0, 182, 33, 150, 0, 183, 35, 129,
+ 0, 183, 37, 107, 0, 185, 37, 84, 0, 187, 35, 63, 0, 189, 35, 45, 0, 190, 35, 31, 0, 189, 37, 18, 0, 186, 41, 8,
+ 0, 180, 46, 2, 0, 170, 52, 0, 0, 193, 12, 235, 0, 186, 7, 224, 0, 183, 8, 211, 0, 181, 10, 201, 0, 179, 13, 189,
+ 0, 179, 16, 173, 0, 178, 19, 154, 0, 177, 22, 135, 0, 178, 24, 115, 0, 179, 25, 94, 0, 182, 24, 72, 0, 185, 23, 51,
+ 0, 186, 23, 36, 0, 186, 25, 23, 0, 185, 27, 13, 0, 181, 31, 5, 0, 172, 39, 0, 0, 192, 9, 235, 0, 183, 2, 221,
+ 0, 178, 2, 208, 0, 176, 3, 199, 0, 176, 4, 189, 0, 176, 6, 176, 0, 175, 8, 159, 0, 175, 11, 141, 0, 175, 13, 123,
+ 0, 176, 14, 102, 0, 178, 14, 81, 0, 180, 13, 60, 0, 183, 12, 39, 0, 182, 15, 27, 0, 180, 16, 16, 0, 178, 18, 7,
+ 0, 174, 25, 0, 0, 191, 7, 235, 0, 179, 1, 217, 0, 173, 0, 203, 0, 172, 0, 196, 0, 172, 0, 188, 0, 173, 1, 177,
+ 0, 173, 2, 163, 0, 172, 4, 147, 0, 173, 5, 130, 0, 173, 6, 111, 0, 175, 6, 91, 0, 176, 6, 70, 0, 178, 6, 49,
+ 0, 180, 5, 29, 0, 177, 8, 18, 0, 175, 9, 9, 0, 173, 14, 0, 0, 190, 4, 235, 0, 176, 0, 215, 0, 168, 0, 199,
+ 0, 167, 0, 193, 0, 168, 0, 186, 0, 169, 0, 176, 0, 169, 0, 164, 0, 169, 0, 151, 0, 170, 1, 135, 0, 171, 2, 118,
+ 0, 172, 2, 99, 0, 173, 1, 80, 0, 174, 1, 60, 0, 176, 1, 39, 0, 176, 1, 20, 0, 173, 3, 10, 0, 171, 7, 0,
+ 0, 188, 2, 235, 0, 174, 0, 214, 0, 166, 0, 197, 0, 164, 0, 191, 0, 165, 0, 184, 0, 166, 0, 176, 0, 166, 0, 165,
+ 0, 166, 0, 152, 0, 167, 0, 138, 0, 168, 0, 123, 0, 169, 0, 106, 0, 170, 0, 89, 0, 170, 0, 71, 0, 171, 0, 51,
+ 0, 172, 0, 31, 0, 172, 1, 13, 0, 171, 5, 0, 0, 187, 0, 235, 0, 178, 0, 217, 0, 169, 0, 199, 0, 169, 0, 195,
+ 0, 169, 0, 188, 0, 170, 0, 180, 0, 170, 0, 169, 0, 170, 0, 158, 0, 171, 0, 144, 0, 171, 0, 129, 0, 173, 0, 113,
+ 0, 174, 0, 96, 0, 174, 0, 80, 0, 175, 0, 61, 0, 175, 0, 40, 0, 176, 0, 19, 0, 178, 0, 0, 136, 61, 156, 163,
+ 130, 56, 173, 146, 122, 53, 193, 74, 96, 60, 228, 34, 83, 112, 204, 36, 64, 150, 184, 43, 43, 167, 179, 48, 23, 180, 171, 48,
+ 8, 190, 166, 39, 1, 198, 160, 30, 0, 202, 152, 19, 0, 207, 145, 14, 0, 212, 138, 10, 0, 217, 132, 6, 0, 222, 127, 3,
+ 0, 226, 121, 1, 0, 228, 117, 0, 136, 69, 127, 170, 134, 73, 133, 149, 128, 73, 149, 89, 102, 84, 190, 41, 78, 140, 179, 41,
+ 51, 172, 171, 52, 28, 185, 167, 53, 12, 196, 164, 44, 3, 202, 157, 32, 0, 205, 150, 15, 0, 208, 141, 3, 0, 209, 134, 1,
+ 0, 211, 128, 1, 0, 212, 124, 1, 0, 214, 120, 0, 0, 217, 117, 0, 0, 221, 113, 0, 132, 80, 87, 181, 131, 83, 92, 160,
+ 124, 93, 99, 113, 108, 104, 131, 55, 80, 144, 146, 56, 48, 181, 153, 66, 22, 194, 155, 60, 12, 200, 151, 44, 5, 204, 144, 33,
+ 0, 208, 139, 19, 0, 210, 131, 4, 0, 211, 125, 0, 0, 210, 121, 0, 0, 209, 117, 0, 0, 209, 114, 0, 0, 209, 112, 0,
+ 0, 215, 109, 0, 103, 98, 63, 240, 111, 99, 65, 203, 115, 108, 66, 145, 114, 116, 68, 72, 86, 153, 101, 67, 57, 182, 121, 71,
+ 33, 195, 128, 64, 20, 204, 130, 51, 13, 210, 125, 37, 5, 215, 120, 26, 0, 219, 114, 13, 0, 220, 109, 2, 0, 216, 107, 0,
+ 0, 212, 106, 0, 0, 209, 105, 0, 0, 207, 104, 0, 0, 211, 101, 0, 87, 129, 57, 243, 87, 134, 57, 227, 89, 140, 59, 186,
+ 89, 147, 63, 138, 87, 145, 71, 91, 64, 168, 97, 81, 35, 188, 116, 76, 19, 197, 123, 63, 13, 203, 119, 46, 5, 207, 116, 35,
+ 0, 210, 112, 23, 0, 211, 106, 8, 0, 210, 104, 1, 0, 207, 102, 0, 0, 204, 102, 0, 0, 202, 101, 0, 0, 204, 100, 0,
+ 66, 162, 52, 237, 64, 168, 51, 234, 62, 172, 54, 215, 61, 174, 64, 177, 60, 166, 76, 135, 57, 162, 84, 105, 36, 180, 101, 92,
+ 19, 193, 109, 74, 12, 197, 109, 56, 5, 199, 108, 41, 1, 202, 105, 27, 0, 203, 102, 11, 0, 202, 100, 1, 0, 199, 99, 0,
+ 0, 197, 98, 0, 0, 196, 98, 0, 0, 197, 97, 0, 42, 174, 53, 235, 40, 180, 52, 234, 38, 184, 52, 224, 34, 184, 63, 195,
+ 29, 182, 75, 165, 31, 175, 83, 135, 25, 177, 89, 112, 12, 189, 95, 90, 7, 193, 97, 70, 4, 194, 96, 51, 0, 197, 94, 34,
+ 0, 198, 91, 17, 0, 198, 89, 4, 0, 195, 89, 0, 0, 192, 90, 0, 0, 190, 90, 0, 0, 191, 90, 0, 18, 181, 55, 234,
+ 16, 185, 54, 233, 15, 189, 53, 226, 13, 187, 59, 203, 5, 185, 73, 179, 6, 183, 77, 156, 9, 183, 78, 130, 3, 186, 85, 108,
+ 0, 190, 86, 86, 0, 191, 84, 64, 0, 191, 82, 43, 0, 191, 80, 25, 0, 192, 79, 10, 0, 191, 78, 2, 0, 188, 80, 0,
+ 0, 185, 81, 0, 0, 183, 82, 0, 5, 185, 45, 236, 5, 189, 42, 234, 3, 192, 44, 224, 0, 191, 50, 205, 0, 184, 58, 185,
+ 0, 183, 64, 165, 0, 183, 67, 143, 0, 184, 69, 117, 0, 186, 69, 91, 0, 188, 68, 71, 0, 189, 66, 50, 0, 188, 67, 32,
+ 0, 186, 67, 17, 0, 184, 68, 6, 0, 181, 70, 1, 0, 178, 72, 0, 0, 176, 74, 0, 0, 186, 27, 237, 0, 187, 28, 231,
+ 0, 188, 33, 218, 0, 185, 37, 203, 0, 182, 42, 187, 0, 182, 47, 167, 0, 182, 50, 146, 0, 182, 52, 123, 0, 181, 55, 99,
+ 0, 183, 54, 78, 0, 184, 53, 59, 0, 185, 53, 41, 0, 184, 53, 24, 0, 181, 55, 11, 0, 178, 58, 3, 0, 173, 60, 0,
+ 0, 168, 64, 0, 0, 186, 16, 236, 0, 184, 16, 228, 0, 181, 21, 213, 0, 178, 26, 199, 0, 177, 29, 186, 0, 178, 32, 169,
+ 0, 177, 35, 150, 0, 178, 37, 130, 0, 177, 40, 109, 0, 179, 41, 87, 0, 181, 39, 67, 0, 182, 38, 49, 0, 183, 38, 33,
+ 0, 181, 40, 18, 0, 178, 42, 7, 0, 173, 46, 1, 0, 165, 52, 0, 0, 187, 12, 236, 0, 181, 8, 224, 0, 178, 9, 210,
+ 0, 173, 13, 197, 0, 173, 15, 186, 0, 173, 18, 171, 0, 172, 21, 154, 0, 171, 24, 136, 0, 172, 26, 116, 0, 173, 27, 96,
+ 0, 175, 27, 75, 0, 178, 26, 56, 0, 179, 25, 39, 0, 179, 25, 25, 0, 178, 27, 13, 0, 174, 30, 4, 0, 165, 39, 0,
+ 0, 187, 9, 236, 0, 178, 3, 221, 0, 173, 3, 207, 0, 169, 4, 195, 0, 169, 5, 186, 0, 169, 6, 173, 0, 168, 9, 158,
+ 0, 168, 11, 141, 0, 169, 13, 122, 0, 170, 14, 103, 0, 171, 15, 83, 0, 172, 14, 63, 0, 175, 13, 43, 0, 175, 14, 29,
+ 0, 174, 15, 17, 0, 172, 17, 7, 0, 167, 25, 0, 0, 186, 6, 235, 0, 175, 1, 217, 0, 168, 0, 202, 0, 164, 0, 190,
+ 0, 164, 0, 182, 0, 165, 1, 172, 0, 165, 1, 160, 0, 165, 3, 145, 0, 165, 4, 128, 0, 166, 5, 109, 0, 167, 5, 91,
+ 0, 168, 5, 71, 0, 169, 5, 51, 0, 171, 4, 32, 0, 168, 6, 19, 0, 168, 7, 9, 0, 165, 14, 0, 0, 186, 3, 235,
+ 0, 172, 0, 215, 0, 164, 0, 197, 0, 158, 0, 183, 0, 158, 0, 175, 0, 158, 0, 166, 0, 159, 0, 156, 0, 159, 0, 144,
+ 0, 160, 0, 129, 0, 161, 0, 113, 0, 162, 1, 96, 0, 163, 0, 79, 0, 163, 0, 60, 0, 164, 0, 40, 0, 164, 1, 23,
+ 0, 163, 2, 11, 0, 162, 7, 0, 0, 185, 1, 235, 0, 171, 0, 214, 0, 161, 0, 195, 0, 154, 0, 178, 0, 154, 0, 170,
+ 0, 154, 0, 163, 0, 154, 0, 154, 0, 155, 0, 143, 0, 155, 0, 130, 0, 156, 0, 115, 0, 157, 0, 100, 0, 157, 0, 85,
+ 0, 157, 0, 69, 0, 158, 0, 50, 0, 158, 0, 32, 0, 159, 1, 15, 0, 160, 5, 0, 0, 184, 0, 233, 0, 175, 0, 217,
+ 0, 166, 0, 199, 0, 158, 0, 182, 0, 159, 0, 176, 0, 159, 0, 169, 0, 160, 0, 159, 0, 160, 0, 149, 0, 160, 0, 136,
+ 0, 161, 0, 122, 0, 161, 0, 106, 0, 162, 0, 91, 0, 162, 0, 76, 0, 162, 0, 58, 0, 163, 0, 37, 0, 163, 0, 17,
+ 0, 166, 0, 0, 99, 35, 205, 222, 97, 35, 211, 213, 102, 45, 202, 142, 90, 49, 216, 71, 76, 74, 213, 48, 58, 115, 197, 51,
+ 39, 141, 188, 53, 22, 158, 178, 50, 10, 168, 173, 38, 2, 178, 167, 29, 0, 184, 159, 20, 0, 190, 152, 14, 0, 195, 146, 10,
+ 0, 201, 141, 7, 0, 205, 135, 4, 0, 210, 131, 2, 0, 214, 126, 0, 104, 46, 172, 219, 103, 49, 174, 202, 103, 58, 173, 156,
+ 94, 62, 188, 67, 75, 103, 185, 52, 50, 139, 179, 58, 29, 157, 174, 57, 14, 170, 171, 45, 1, 182, 166, 34, 0, 186, 157, 14,
+ 0, 190, 149, 3, 0, 194, 141, 1, 0, 197, 136, 1, 0, 200, 131, 1, 0, 202, 126, 0, 0, 205, 123, 0, 0, 209, 121, 0,
+ 108, 62, 128, 206, 108, 69, 125, 187, 108, 78, 124, 151, 98, 83, 142, 89, 77, 107, 156, 64, 49, 144, 163, 69, 24, 163, 164, 63,
+ 11, 175, 162, 50, 0, 185, 156, 38, 0, 188, 149, 17, 0, 191, 142, 2, 0, 194, 135, 0, 0, 195, 130, 0, 0, 197, 125, 0,
+ 0, 198, 121, 0, 0, 200, 118, 0, 0, 204, 117, 0, 96, 71, 86, 236, 99, 78, 88, 204, 101, 91, 91, 153, 93, 102, 104, 117,
+ 80, 114, 120, 78, 47, 149, 144, 84, 18, 172, 149, 76, 6, 182, 148, 59, 2, 187, 143, 40, 0, 190, 137, 23, 0, 193, 131, 6,
+ 0, 195, 125, 1, 0, 195, 120, 0, 0, 195, 116, 0, 0, 195, 113, 0, 0, 195, 111, 0, 0, 199, 109, 0, 80, 97, 69, 250,
+ 82, 107, 69, 211, 84, 111, 73, 161, 82, 118, 78, 133, 76, 128, 87, 96, 45, 154, 118, 102, 21, 174, 126, 88, 13, 185, 126, 68,
+ 7, 192, 123, 50, 0, 197, 119, 37, 0, 199, 113, 19, 0, 201, 108, 6, 0, 200, 105, 0, 0, 197, 103, 0, 0, 195, 102, 0,
+ 0, 193, 101, 0, 0, 196, 98, 0, 63, 135, 62, 243, 62, 141, 61, 236, 62, 141, 68, 196, 58, 142, 77, 167, 50, 148, 89, 143,
+ 42, 151, 99, 119, 24, 166, 111, 102, 13, 180, 116, 79, 9, 186, 114, 59, 3, 190, 111, 43, 0, 193, 107, 28, 0, 194, 103, 12,
+ 0, 194, 100, 1, 0, 192, 98, 0, 0, 189, 98, 0, 0, 187, 97, 0, 0, 190, 96, 0, 39, 156, 60, 239, 37, 162, 59, 237,
+ 36, 163, 62, 219, 32, 163, 71, 189, 25, 165, 83, 166, 21, 162, 93, 142, 16, 160, 100, 121, 8, 172, 104, 98, 6, 182, 102, 72,
+ 2, 185, 101, 53, 0, 185, 99, 35, 0, 187, 96, 18, 0, 187, 93, 4, 0, 185, 92, 0, 0, 183, 92, 0, 0, 181, 92, 0,
+ 0, 183, 92, 0, 16, 167, 60, 238, 16, 172, 57, 235, 16, 172, 58, 222, 13, 171, 66, 199, 6, 173, 76, 177, 2, 172, 84, 156,
+ 1, 168, 91, 135, 0, 169, 94, 114, 0, 177, 91, 87, 0, 179, 89, 65, 0, 181, 86, 43, 0, 181, 84, 25, 0, 182, 82, 9,
+ 0, 182, 81, 1, 0, 178, 82, 0, 0, 176, 83, 0, 0, 176, 84, 0, 4, 174, 48, 239, 4, 178, 47, 235, 2, 181, 49, 219,
+ 1, 176, 55, 201, 0, 174, 62, 182, 0, 174, 67, 162, 0, 174, 71, 142, 0, 173, 73, 118, 0, 176, 74, 93, 0, 179, 72, 72,
+ 0, 180, 70, 51, 0, 178, 71, 33, 0, 177, 70, 16, 0, 177, 70, 4, 0, 174, 71, 0, 0, 171, 73, 0, 0, 170, 74, 0,
+ 0, 175, 30, 239, 0, 177, 32, 231, 0, 178, 37, 216, 0, 174, 43, 201, 0, 173, 46, 185, 0, 173, 50, 166, 0, 173, 53, 147,
+ 0, 173, 56, 125, 0, 174, 58, 100, 0, 176, 57, 79, 0, 177, 55, 60, 0, 176, 56, 41, 0, 175, 56, 24, 0, 173, 57, 10,
+ 0, 170, 59, 1, 0, 166, 61, 0, 0, 164, 64, 0, 0, 176, 17, 237, 0, 175, 18, 226, 0, 172, 24, 212, 0, 169, 30, 198,
+ 0, 170, 31, 185, 0, 170, 34, 169, 0, 170, 37, 151, 0, 170, 40, 131, 0, 170, 42, 110, 0, 171, 43, 88, 0, 173, 41, 69,
+ 0, 173, 40, 50, 0, 173, 41, 33, 0, 172, 41, 18, 0, 169, 43, 5, 0, 164, 47, 0, 0, 158, 53, 0, 0, 178, 11, 237,
+ 0, 173, 9, 223, 0, 170, 12, 209, 0, 166, 16, 196, 0, 166, 18, 184, 0, 165, 20, 170, 0, 164, 23, 154, 0, 165, 25, 136,
+ 0, 165, 27, 117, 0, 166, 28, 97, 0, 168, 28, 77, 0, 170, 28, 58, 0, 170, 27, 40, 0, 171, 26, 25, 0, 169, 28, 12,
+ 0, 165, 31, 2, 0, 156, 40, 0, 0, 179, 8, 236, 0, 171, 4, 220, 0, 167, 4, 206, 0, 163, 6, 194, 0, 162, 7, 182,
+ 0, 161, 8, 170, 0, 161, 11, 156, 0, 161, 12, 140, 0, 161, 14, 122, 0, 163, 15, 103, 0, 163, 16, 84, 0, 164, 15, 66,
+ 0, 166, 15, 46, 0, 166, 14, 31, 0, 165, 15, 17, 0, 163, 17, 6, 0, 157, 26, 0, 0, 180, 5, 236, 0, 169, 1, 217,
+ 0, 163, 1, 203, 0, 159, 0, 190, 0, 156, 1, 176, 0, 156, 1, 166, 0, 157, 1, 155, 0, 157, 2, 142, 0, 157, 4, 125,
+ 0, 158, 4, 107, 0, 159, 5, 90, 0, 159, 5, 72, 0, 160, 5, 52, 0, 162, 4, 34, 0, 159, 6, 21, 0, 159, 7, 9,
+ 0, 156, 15, 0, 0, 180, 3, 235, 0, 167, 0, 214, 0, 160, 0, 198, 0, 153, 0, 181, 0, 148, 0, 166, 0, 148, 0, 158,
+ 0, 149, 0, 148, 0, 149, 0, 137, 0, 150, 0, 124, 0, 150, 0, 109, 0, 151, 0, 93, 0, 152, 0, 78, 0, 152, 0, 60,
+ 0, 153, 0, 41, 0, 153, 0, 24, 0, 153, 1, 12, 0, 153, 7, 0, 0, 180, 1, 234, 0, 167, 0, 213, 0, 157, 0, 194,
+ 0, 149, 0, 176, 0, 143, 0, 160, 0, 142, 0, 152, 0, 143, 0, 144, 0, 143, 0, 134, 0, 144, 0, 122, 0, 144, 0, 109,
+ 0, 144, 0, 95, 0, 145, 0, 82, 0, 145, 0, 67, 0, 145, 0, 49, 0, 145, 0, 32, 0, 146, 0, 16, 0, 149, 5, 0,
+ 0, 179, 0, 233, 0, 171, 0, 217, 0, 163, 0, 200, 0, 155, 0, 182, 0, 147, 0, 164, 0, 147, 0, 157, 0, 148, 0, 149,
+ 0, 148, 0, 139, 0, 148, 0, 127, 0, 148, 0, 114, 0, 149, 0, 101, 0, 149, 0, 88, 0, 149, 0, 73, 0, 149, 0, 55,
+ 0, 149, 0, 35, 0, 150, 0, 15, 0, 153, 0, 0, 85, 37, 202, 225, 81, 37, 208, 221, 78, 43, 208, 189, 70, 50, 212, 123,
+ 63, 62, 212, 79, 45, 85, 207, 68, 31, 113, 196, 64, 18, 133, 186, 56, 10, 145, 179, 39, 1, 158, 172, 29, 0, 166, 165, 21,
+ 0, 173, 160, 15, 0, 179, 153, 11, 0, 185, 148, 7, 0, 190, 143, 5, 0, 194, 138, 2, 0, 199, 134, 0, 87, 45, 175, 229,
+ 84, 45, 184, 219, 80, 56, 185, 189, 75, 63, 187, 123, 67, 76, 189, 73, 45, 107, 188, 70, 27, 131, 182, 64, 15, 146, 177, 50,
+ 2, 161, 171, 36, 0, 166, 165, 15, 0, 170, 156, 3, 0, 175, 148, 1, 0, 180, 142, 1, 0, 185, 137, 1, 0, 189, 134, 0,
+ 0, 193, 131, 0, 0, 196, 130, 0, 89, 59, 140, 216, 86, 61, 145, 209, 89, 78, 136, 155, 78, 83, 152, 128, 68, 90, 162, 86,
+ 46, 116, 170, 78, 24, 140, 171, 70, 12, 152, 167, 55, 2, 164, 162, 39, 0, 168, 157, 17, 0, 171, 149, 2, 0, 176, 141, 0,
+ 0, 180, 135, 0, 0, 183, 131, 0, 0, 186, 127, 0, 0, 188, 124, 0, 0, 192, 124, 0, 84, 69, 113, 224, 82, 71, 120, 211,
+ 82, 87, 117, 161, 75, 99, 121, 137, 65, 103, 138, 108, 47, 119, 150, 95, 20, 146, 157, 79, 10, 156, 155, 61, 1, 166, 152, 45,
+ 0, 168, 147, 22, 0, 172, 140, 5, 0, 175, 134, 0, 0, 178, 129, 0, 0, 180, 124, 0, 0, 182, 121, 0, 0, 183, 118, 0,
+ 0, 187, 117, 0, 74, 82, 86, 232, 73, 87, 90, 209, 70, 100, 96, 167, 65, 110, 103, 144, 51, 122, 118, 132, 40, 128, 128, 111,
+ 14, 149, 140, 93, 6, 160, 139, 72, 0, 167, 136, 51, 0, 171, 132, 28, 0, 174, 127, 12, 0, 176, 122, 2, 0, 178, 118, 0,
+ 0, 178, 114, 0, 0, 178, 111, 0, 0, 178, 109, 0, 0, 183, 107, 0, 52, 104, 76, 250, 54, 107, 78, 233, 51, 116, 85, 193,
+ 44, 125, 96, 159, 37, 134, 103, 144, 26, 143, 110, 124, 9, 153, 120, 110, 6, 165, 120, 83, 3, 174, 117, 63, 0, 179, 113, 44,
+ 0, 181, 108, 24, 0, 183, 104, 9, 0, 184, 101, 1, 0, 182, 98, 0, 0, 179, 97, 0, 0, 177, 96, 0, 0, 181, 93, 0,
+ 31, 133, 72, 244, 31, 137, 70, 240, 31, 140, 74, 218, 26, 141, 85, 182, 20, 146, 92, 162, 13, 149, 100, 144, 7, 149, 106, 125,
+ 3, 156, 108, 101, 1, 166, 108, 77, 2, 172, 104, 54, 0, 174, 101, 35, 0, 176, 98, 18, 0, 178, 94, 4, 0, 176, 93, 0,
+ 0, 174, 91, 0, 0, 172, 91, 0, 0, 174, 90, 0, 13, 150, 65, 242, 13, 154, 63, 238, 15, 153, 64, 222, 13, 152, 71, 195,
+ 7, 156, 80, 175, 0, 159, 88, 156, 0, 154, 94, 134, 0, 151, 97, 115, 0, 159, 96, 91, 0, 168, 92, 65, 0, 169, 89, 43,
+ 0, 170, 87, 25, 0, 172, 85, 9, 0, 171, 84, 1, 0, 168, 84, 0, 0, 166, 83, 0, 0, 167, 84, 0, 2, 159, 53, 242,
+ 2, 163, 52, 234, 0, 164, 54, 217, 0, 161, 62, 200, 0, 162, 66, 181, 0, 162, 70, 161, 0, 162, 74, 140, 0, 155, 79, 118,
+ 0, 157, 80, 97, 0, 165, 76, 72, 0, 167, 75, 52, 0, 167, 74, 32, 0, 168, 73, 16, 0, 168, 72, 3, 0, 165, 73, 0,
+ 0, 162, 74, 0, 0, 162, 74, 0, 0, 160, 34, 238, 0, 163, 35, 228, 0, 163, 41, 217, 0, 160, 47, 200, 0, 161, 50, 184,
+ 0, 163, 53, 167, 0, 165, 57, 147, 0, 164, 59, 125, 0, 162, 61, 102, 0, 165, 60, 80, 0, 167, 58, 60, 0, 166, 58, 41,
+ 0, 165, 59, 23, 0, 164, 59, 8, 0, 161, 61, 1, 0, 158, 63, 0, 0, 157, 65, 0, 0, 162, 20, 235, 0, 163, 20, 224,
+ 0, 159, 27, 212, 0, 158, 33, 198, 0, 160, 35, 184, 0, 160, 37, 169, 0, 160, 40, 151, 0, 161, 42, 132, 0, 161, 44, 110,
+ 0, 162, 45, 89, 0, 164, 44, 69, 0, 163, 43, 50, 0, 163, 43, 33, 0, 161, 44, 17, 0, 159, 45, 4, 0, 155, 49, 0,
+ 0, 151, 54, 0, 0, 166, 12, 236, 0, 163, 10, 221, 0, 159, 15, 209, 0, 157, 19, 196, 0, 157, 21, 184, 0, 156, 22, 170,
+ 0, 156, 25, 153, 0, 157, 26, 136, 0, 157, 28, 117, 0, 158, 30, 97, 0, 159, 30, 77, 0, 161, 29, 59, 0, 160, 29, 41,
+ 0, 160, 28, 25, 0, 158, 30, 10, 0, 153, 34, 1, 0, 147, 42, 0, 0, 170, 7, 236, 0, 163, 4, 218, 0, 158, 6, 206,
+ 0, 155, 8, 194, 0, 154, 9, 182, 0, 154, 10, 169, 0, 153, 11, 155, 0, 153, 13, 139, 0, 154, 15, 121, 0, 155, 16, 102,
+ 0, 155, 16, 84, 0, 156, 16, 66, 0, 157, 16, 48, 0, 156, 16, 32, 0, 155, 16, 17, 0, 152, 19, 5, 0, 145, 29, 0,
+ 0, 172, 5, 236, 0, 162, 1, 216, 0, 156, 1, 203, 0, 153, 1, 191, 0, 150, 1, 177, 0, 148, 1, 163, 0, 149, 1, 152,
+ 0, 149, 3, 138, 0, 149, 4, 123, 0, 150, 5, 105, 0, 150, 5, 89, 0, 150, 6, 72, 0, 151, 6, 54, 0, 151, 6, 36,
+ 0, 150, 7, 21, 0, 150, 7, 9, 0, 145, 16, 0, 0, 173, 3, 235, 0, 161, 0, 213, 0, 154, 0, 198, 0, 148, 0, 182,
+ 0, 143, 0, 166, 0, 139, 0, 152, 0, 139, 0, 142, 0, 140, 0, 132, 0, 140, 0, 120, 0, 141, 0, 105, 0, 142, 0, 91,
+ 0, 142, 1, 76, 0, 143, 0, 60, 0, 143, 0, 41, 0, 143, 1, 26, 0, 143, 1, 12, 0, 142, 8, 0, 0, 173, 1, 233,
+ 0, 161, 0, 212, 0, 152, 0, 194, 0, 145, 0, 176, 0, 138, 0, 159, 0, 132, 0, 144, 0, 131, 0, 135, 0, 132, 0, 126,
+ 0, 132, 0, 115, 0, 132, 0, 103, 0, 132, 0, 91, 0, 133, 0, 79, 0, 133, 0, 65, 0, 133, 0, 47, 0, 133, 0, 31,
+ 0, 134, 0, 17, 0, 138, 5, 0, 0, 173, 0, 232, 0, 166, 0, 217, 0, 158, 0, 200, 0, 150, 0, 182, 0, 143, 0, 164,
+ 0, 134, 0, 145, 0, 134, 0, 138, 0, 135, 0, 129, 0, 135, 0, 118, 0, 135, 0, 108, 0, 135, 0, 96, 0, 135, 0, 84,
+ 0, 135, 0, 71, 0, 135, 0, 53, 0, 135, 0, 32, 0, 137, 0, 14, 0, 140, 0, 0, 67, 41, 198, 227, 62, 40, 206, 224,
+ 54, 47, 209, 210, 50, 53, 208, 160, 43, 61, 211, 113, 31, 77, 208, 87, 16, 95, 202, 81, 11, 108, 192, 64, 8, 121, 184, 43,
+ 1, 135, 177, 29, 0, 145, 171, 20, 0, 155, 166, 14, 0, 163, 161, 11, 0, 169, 155, 8, 0, 174, 149, 5, 0, 179, 145, 2,
+ 0, 183, 141, 0, 69, 47, 177, 229, 65, 49, 181, 225, 58, 60, 181, 202, 49, 69, 187, 166, 45, 75, 191, 113, 32, 94, 187, 92,
+ 18, 110, 187, 76, 11, 122, 182, 56, 2, 137, 174, 39, 0, 144, 170, 18, 0, 151, 163, 3, 0, 158, 155, 1, 0, 163, 148, 1,
+ 0, 168, 142, 1, 0, 172, 139, 0, 0, 177, 137, 0, 0, 180, 136, 0, 70, 59, 157, 218, 66, 62, 157, 212, 60, 73, 158, 188,
+ 47, 85, 167, 167, 44, 87, 173, 121, 32, 101, 174, 97, 17, 118, 176, 79, 11, 129, 172, 59, 4, 140, 166, 40, 0, 147, 163, 20,
+ 0, 153, 156, 2, 0, 159, 147, 0, 0, 163, 140, 0, 0, 167, 135, 0, 0, 171, 132, 0, 0, 174, 130, 0, 0, 177, 131, 0,
+ 65, 71, 133, 214, 62, 74, 135, 206, 58, 83, 140, 184, 52, 99, 140, 158, 42, 104, 150, 138, 34, 107, 158, 112, 16, 125, 163, 87,
+ 9, 135, 160, 66, 0, 147, 155, 51, 0, 149, 152, 25, 0, 154, 147, 4, 0, 158, 139, 0, 0, 162, 132, 0, 0, 165, 128, 0,
+ 0, 168, 125, 0, 0, 170, 122, 0, 0, 173, 123, 0, 60, 82, 113, 212, 59, 86, 115, 197, 53, 94, 120, 183, 46, 109, 124, 159,
+ 36, 120, 129, 148, 27, 120, 138, 123, 12, 131, 146, 98, 6, 138, 146, 75, 2, 145, 142, 55, 0, 150, 140, 30, 0, 153, 135, 10,
+ 0, 157, 129, 1, 0, 160, 124, 0, 0, 162, 120, 0, 0, 164, 116, 0, 0, 165, 114, 0, 0, 169, 114, 0, 41, 94, 93, 231,
+ 39, 101, 97, 209, 34, 108, 104, 192, 29, 118, 111, 168, 24, 125, 115, 150, 12, 132, 122, 135, 6, 135, 128, 113, 3, 139, 129, 85,
+ 0, 149, 125, 64, 0, 152, 122, 38, 0, 155, 119, 16, 0, 158, 116, 3, 0, 161, 111, 0, 0, 161, 108, 0, 0, 161, 105, 0,
+ 0, 161, 103, 0, 0, 165, 102, 0, 20, 114, 83, 250, 22, 119, 81, 235, 20, 122, 87, 214, 16, 125, 96, 179, 14, 130, 101, 153,
+ 7, 134, 105, 140, 0, 140, 110, 122, 1, 142, 110, 101, 0, 152, 108, 76, 0, 157, 104, 53, 0, 160, 101, 32, 0, 164, 98, 14,
+ 0, 166, 94, 2, 0, 165, 92, 0, 0, 163, 90, 0, 0, 161, 89, 0, 0, 165, 85, 0, 6, 134, 73, 247, 8, 136, 72, 239,
+ 10, 135, 72, 220, 7, 135, 79, 194, 3, 139, 88, 168, 2, 139, 91, 149, 0, 141, 94, 131, 0, 140, 97, 113, 0, 143, 97, 89,
+ 0, 152, 94, 65, 0, 155, 91, 43, 0, 157, 89, 24, 0, 159, 86, 8, 0, 159, 84, 1, 0, 157, 83, 0, 0, 156, 82, 0,
+ 0, 157, 81, 0, 0, 141, 57, 245, 0, 146, 58, 234, 1, 145, 60, 220, 0, 145, 66, 200, 0, 147, 71, 182, 0, 148, 74, 160,
+ 0, 148, 76, 139, 0, 143, 82, 118, 0, 140, 84, 99, 0, 146, 82, 77, 0, 152, 78, 53, 0, 154, 77, 32, 0, 156, 75, 15,
+ 0, 156, 74, 2, 0, 153, 74, 0, 0, 151, 74, 0, 0, 151, 74, 0, 0, 143, 38, 239, 0, 148, 40, 227, 0, 147, 44, 216,
+ 0, 146, 50, 200, 0, 149, 54, 186, 0, 152, 57, 168, 0, 152, 60, 148, 0, 151, 62, 126, 0, 143, 67, 104, 0, 144, 67, 84,
+ 0, 152, 63, 61, 0, 154, 62, 40, 0, 154, 62, 22, 0, 153, 62, 8, 0, 151, 63, 1, 0, 148, 64, 0, 0, 147, 65, 0,
+ 0, 146, 24, 235, 0, 148, 25, 222, 0, 147, 30, 211, 0, 146, 35, 198, 0, 148, 38, 185, 0, 149, 40, 170, 0, 150, 43, 152,
+ 0, 150, 44, 132, 0, 149, 46, 110, 0, 149, 49, 89, 0, 151, 48, 70, 0, 152, 46, 50, 0, 152, 47, 32, 0, 151, 48, 15,
+ 0, 148, 48, 3, 0, 144, 51, 0, 0, 141, 55, 0, 0, 151, 15, 234, 0, 150, 14, 219, 0, 148, 18, 208, 0, 146, 22, 196,
+ 0, 147, 24, 184, 0, 146, 26, 170, 0, 146, 26, 153, 0, 147, 28, 135, 0, 147, 30, 116, 0, 147, 31, 96, 0, 149, 32, 77,
+ 0, 150, 32, 59, 0, 150, 31, 40, 0, 149, 32, 24, 0, 146, 33, 9, 0, 143, 36, 1, 0, 136, 43, 0, 0, 156, 9, 234,
+ 0, 152, 6, 217, 0, 148, 9, 205, 0, 146, 10, 195, 0, 145, 12, 182, 0, 144, 12, 169, 0, 144, 13, 154, 0, 144, 15, 137,
+ 0, 145, 16, 120, 0, 145, 17, 101, 0, 146, 18, 84, 0, 146, 18, 66, 0, 147, 18, 47, 0, 146, 18, 31, 0, 145, 19, 16,
+ 0, 142, 21, 4, 0, 134, 31, 0, 0, 160, 5, 234, 0, 153, 2, 215, 0, 148, 3, 203, 0, 145, 2, 192, 0, 143, 2, 179,
+ 0, 141, 2, 164, 0, 140, 3, 150, 0, 139, 4, 136, 0, 140, 6, 121, 0, 140, 6, 104, 0, 141, 7, 88, 0, 141, 7, 72,
+ 0, 141, 7, 53, 0, 142, 7, 36, 0, 140, 8, 21, 0, 140, 8, 9, 0, 133, 18, 0, 0, 163, 3, 233, 0, 153, 0, 212,
+ 0, 147, 0, 198, 0, 142, 0, 184, 0, 137, 0, 168, 0, 132, 0, 153, 0, 130, 0, 139, 0, 130, 0, 128, 0, 131, 0, 116,
+ 0, 131, 0, 102, 0, 132, 1, 89, 0, 133, 1, 75, 0, 133, 1, 59, 0, 133, 1, 41, 0, 133, 1, 26, 0, 133, 1, 13,
+ 0, 130, 9, 0, 0, 165, 1, 232, 0, 154, 0, 211, 0, 146, 0, 194, 0, 139, 0, 177, 0, 132, 0, 160, 0, 125, 0, 143,
+ 0, 120, 0, 126, 0, 119, 0, 116, 0, 120, 0, 107, 0, 120, 0, 97, 0, 121, 0, 87, 0, 121, 0, 76, 0, 121, 0, 62,
+ 0, 121, 0, 46, 0, 121, 0, 31, 0, 122, 0, 17, 0, 124, 5, 0, 0, 166, 0, 231, 0, 159, 0, 216, 0, 152, 0, 200,
+ 0, 145, 0, 183, 0, 138, 0, 165, 0, 129, 0, 146, 0, 118, 0, 124, 0, 119, 0, 116, 0, 119, 0, 106, 0, 119, 0, 98,
+ 0, 119, 0, 89, 0, 119, 0, 79, 0, 120, 0, 67, 0, 119, 0, 50, 0, 120, 0, 30, 0, 121, 0, 12, 0, 122, 0, 0,
+ 45, 44, 196, 229, 40, 44, 202, 227, 33, 50, 205, 215, 27, 56, 204, 181, 24, 60, 207, 139, 12, 78, 204, 113, 0, 91, 199, 98,
+ 0, 90, 198, 76, 1, 96, 189, 50, 0, 107, 182, 29, 0, 121, 177, 16, 0, 133, 172, 12, 0, 144, 167, 9, 0, 152, 162, 7,
+ 0, 158, 157, 4, 0, 164, 153, 2, 0, 168, 148, 0, 48, 51, 179, 230, 45, 51, 182, 227, 37, 61, 184, 208, 26, 71, 187, 184,
+ 25, 72, 191, 138, 15, 86, 191, 110, 2, 100, 188, 93, 0, 103, 185, 70, 1, 110, 179, 41, 0, 118, 174, 19, 0, 127, 168, 3,
+ 0, 137, 161, 1, 0, 146, 155, 1, 0, 152, 149, 1, 0, 157, 145, 0, 0, 162, 142, 0, 0, 164, 142, 0, 46, 64, 158, 221,
+ 42, 66, 160, 216, 34, 77, 162, 195, 23, 84, 171, 181, 21, 83, 178, 142, 16, 92, 180, 113, 3, 107, 179, 95, 4, 108, 177, 69,
+ 3, 116, 172, 44, 0, 124, 167, 23, 0, 131, 162, 4, 0, 139, 154, 0, 0, 146, 146, 0, 0, 152, 141, 0, 0, 156, 136, 0,
+ 0, 159, 134, 0, 0, 161, 135, 0, 39, 75, 143, 213, 36, 78, 145, 207, 31, 84, 147, 193, 22, 92, 152, 177, 16, 99, 159, 158,
+ 15, 100, 164, 129, 4, 114, 166, 103, 1, 116, 164, 79, 0, 123, 160, 52, 0, 127, 157, 28, 0, 133, 153, 8, 0, 140, 145, 1,
+ 0, 146, 138, 0, 0, 150, 132, 0, 0, 153, 127, 0, 0, 156, 125, 0, 0, 158, 127, 0, 30, 85, 129, 212, 30, 88, 130, 204,
+ 28, 91, 133, 191, 20, 99, 137, 175, 16, 114, 137, 154, 11, 112, 145, 134, 3, 118, 150, 110, 1, 120, 151, 85, 1, 124, 147, 58,
+ 0, 130, 144, 36, 0, 134, 141, 14, 0, 140, 135, 1, 0, 144, 128, 0, 0, 147, 122, 0, 0, 150, 119, 0, 0, 152, 116, 0,
+ 0, 156, 117, 0, 22, 92, 112, 227, 19, 96, 115, 208, 19, 99, 119, 193, 18, 104, 124, 179, 9, 116, 125, 155, 0, 125, 129, 142,
+ 0, 123, 132, 122, 0, 121, 136, 96, 0, 127, 132, 68, 0, 132, 130, 43, 0, 135, 127, 19, 0, 139, 122, 2, 0, 142, 117, 0,
+ 0, 144, 112, 0, 0, 146, 109, 0, 0, 147, 107, 0, 0, 152, 106, 0, 10, 102, 93, 246, 9, 107, 99, 220, 11, 105, 101, 199,
+ 10, 107, 104, 180, 6, 115, 109, 156, 0, 122, 112, 140, 0, 124, 114, 125, 0, 123, 117, 104, 0, 129, 115, 75, 0, 132, 111, 51,
+ 0, 136, 109, 27, 0, 140, 107, 7, 0, 142, 103, 1, 0, 143, 100, 0, 0, 143, 97, 0, 0, 144, 95, 0, 0, 147, 93, 0,
+ 0, 112, 79, 250, 0, 111, 83, 239, 1, 111, 87, 220, 5, 110, 86, 194, 1, 115, 93, 166, 0, 120, 95, 142, 0, 123, 96, 128,
+ 0, 129, 97, 107, 0, 129, 98, 86, 0, 134, 94, 63, 0, 139, 91, 41, 0, 143, 89, 21, 0, 146, 86, 6, 0, 147, 84, 0,
+ 0, 146, 82, 0, 0, 145, 80, 0, 0, 147, 76, 0, 0, 118, 59, 246, 0, 122, 61, 234, 0, 123, 65, 220, 0, 123, 69, 200,
+ 0, 126, 74, 181, 0, 127, 79, 153, 0, 128, 81, 134, 0, 128, 83, 116, 0, 127, 85, 97, 0, 130, 83, 76, 0, 136, 80, 53,
+ 0, 139, 78, 32, 0, 141, 77, 14, 0, 142, 76, 2, 0, 140, 75, 0, 0, 139, 73, 0, 0, 140, 72, 0, 0, 123, 42, 240,
+ 0, 128, 44, 228, 0, 129, 49, 214, 0, 129, 54, 199, 0, 133, 57, 185, 0, 136, 61, 167, 0, 136, 63, 146, 0, 134, 65, 125,
+ 0, 128, 69, 104, 0, 125, 72, 85, 0, 131, 69, 65, 0, 137, 66, 41, 0, 139, 65, 21, 0, 140, 65, 7, 0, 138, 64, 1,
+ 0, 136, 64, 0, 0, 134, 64, 0, 0, 127, 29, 235, 0, 131, 30, 222, 0, 132, 35, 209, 0, 133, 38, 197, 0, 135, 41, 185,
+ 0, 138, 44, 170, 0, 138, 46, 153, 0, 138, 47, 132, 0, 136, 50, 111, 0, 130, 55, 90, 0, 130, 55, 72, 0, 137, 51, 50,
+ 0, 139, 51, 30, 0, 138, 52, 13, 0, 137, 52, 2, 0, 133, 53, 0, 0, 130, 55, 0, 0, 134, 18, 233, 0, 135, 18, 217,
+ 0, 134, 22, 206, 0, 134, 25, 196, 0, 135, 27, 184, 0, 135, 29, 169, 0, 135, 30, 153, 0, 135, 31, 135, 0, 135, 32, 116,
+ 0, 135, 34, 96, 0, 135, 36, 77, 0, 137, 35, 59, 0, 138, 34, 39, 0, 137, 35, 23, 0, 135, 36, 8, 0, 131, 38, 1,
+ 0, 125, 44, 0, 0, 140, 10, 233, 0, 139, 9, 214, 0, 136, 11, 203, 0, 135, 13, 194, 0, 134, 14, 182, 0, 134, 16, 168,
+ 0, 134, 16, 153, 0, 133, 17, 136, 0, 133, 18, 118, 0, 133, 19, 100, 0, 134, 20, 83, 0, 135, 21, 65, 0, 135, 21, 47,
+ 0, 136, 21, 30, 0, 135, 21, 15, 0, 131, 23, 3, 0, 121, 32, 0, 0, 146, 6, 232, 0, 141, 3, 213, 0, 137, 4, 202,
+ 0, 135, 4, 192, 0, 133, 4, 179, 0, 131, 5, 165, 0, 130, 5, 150, 0, 129, 6, 134, 0, 130, 7, 119, 0, 130, 8, 102,
+ 0, 130, 8, 87, 0, 131, 9, 71, 0, 131, 9, 53, 0, 132, 9, 36, 0, 131, 9, 21, 0, 129, 10, 8, 0, 119, 20, 0,
+ 0, 150, 3, 231, 0, 144, 1, 211, 0, 138, 0, 199, 0, 133, 0, 186, 0, 129, 0, 170, 0, 125, 0, 154, 0, 122, 0, 139,
+ 0, 121, 0, 125, 0, 121, 1, 113, 0, 122, 1, 100, 0, 123, 1, 88, 0, 124, 1, 74, 0, 124, 1, 58, 0, 124, 1, 41,
+ 0, 124, 1, 25, 0, 123, 1, 12, 0, 116, 9, 0, 0, 154, 1, 231, 0, 146, 0, 210, 0, 138, 0, 194, 0, 131, 0, 178,
+ 0, 125, 0, 161, 0, 118, 0, 143, 0, 112, 0, 125, 0, 108, 0, 109, 0, 108, 0, 100, 0, 109, 0, 92, 0, 109, 0, 83,
+ 0, 110, 0, 73, 0, 110, 0, 60, 0, 110, 0, 44, 0, 109, 0, 30, 0, 109, 0, 17, 0, 109, 4, 0, 0, 157, 0, 230,
+ 0, 151, 0, 216, 0, 144, 0, 201, 0, 138, 0, 184, 0, 131, 0, 166, 0, 122, 0, 146, 0, 112, 0, 124, 0, 101, 0, 102,
+ 0, 102, 0, 94, 0, 102, 0, 88, 0, 102, 0, 81, 0, 102, 0, 73, 0, 103, 0, 61, 0, 102, 0, 46, 0, 102, 0, 28,
+ 0, 103, 0, 11, 0, 104, 0, 0, 21, 48, 196, 230, 18, 48, 200, 228, 11, 53, 202, 217, 6, 59, 201, 192, 2, 64, 201, 165,
+ 0, 70, 199, 129, 0, 70, 198, 97, 0, 70, 198, 73, 0, 69, 196, 52, 0, 81, 188, 30, 0, 95, 183, 14, 0, 110, 179, 7,
+ 0, 123, 173, 7, 0, 133, 168, 6, 0, 141, 164, 4, 0, 148, 160, 2, 0, 154, 155, 0, 26, 54, 181, 231, 24, 55, 183, 229,
+ 18, 62, 182, 209, 3, 74, 186, 191, 0, 77, 190, 163, 0, 82, 189, 128, 0, 82, 188, 95, 0, 84, 186, 71, 0, 86, 183, 47,
+ 0, 94, 178, 23, 0, 103, 173, 3, 0, 115, 165, 1, 0, 126, 159, 1, 0, 134, 155, 1, 0, 141, 151, 0, 0, 147, 148, 0,
+ 0, 150, 149, 0, 26, 64, 164, 221, 24, 66, 165, 216, 19, 73, 166, 199, 7, 79, 172, 185, 4, 79, 180, 157, 2, 85, 181, 130,
+ 0, 89, 179, 99, 0, 91, 178, 76, 0, 94, 175, 51, 0, 99, 171, 25, 0, 107, 166, 4, 0, 118, 158, 0, 0, 127, 152, 0,
+ 0, 134, 147, 0, 0, 140, 142, 0, 0, 144, 139, 0, 0, 147, 141, 0, 22, 72, 150, 215, 20, 74, 150, 209, 17, 78, 153, 196,
+ 6, 86, 160, 183, 0, 91, 164, 167, 0, 92, 167, 144, 0, 95, 168, 108, 0, 96, 167, 81, 0, 98, 165, 56, 0, 104, 162, 31,
+ 0, 111, 157, 9, 0, 120, 151, 1, 0, 128, 144, 0, 0, 134, 138, 0, 0, 139, 133, 0, 0, 142, 130, 0, 0, 144, 133, 0,
+ 17, 79, 136, 212, 16, 81, 136, 206, 13, 85, 138, 193, 5, 92, 144, 181, 1, 96, 146, 165, 0, 98, 150, 146, 0, 99, 153, 114,
+ 0, 101, 154, 88, 0, 103, 152, 63, 0, 108, 150, 38, 0, 114, 146, 16, 0, 121, 141, 1, 0, 128, 134, 0, 0, 132, 128, 0,
+ 0, 136, 122, 0, 0, 139, 119, 0, 0, 142, 120, 0, 11, 82, 121, 226, 12, 87, 124, 205, 9, 91, 127, 190, 5, 96, 129, 178,
+ 0, 100, 132, 162, 0, 109, 131, 144, 0, 107, 134, 124, 0, 103, 138, 100, 0, 107, 138, 70, 0, 112, 136, 46, 0, 117, 133, 23,
+ 0, 121, 129, 4, 0, 126, 123, 0, 0, 130, 116, 0, 0, 132, 111, 0, 0, 135, 109, 0, 0, 139, 109, 0, 1, 89, 103, 243,
+ 1, 94, 109, 213, 2, 96, 110, 190, 2, 98, 113, 178, 0, 102, 116, 162, 0, 109, 115, 139, 0, 113, 114, 127, 0, 110, 119, 107,
+ 0, 111, 121, 77, 0, 113, 120, 54, 0, 118, 118, 31, 0, 121, 115, 9, 0, 124, 109, 1, 0, 126, 104, 0, 0, 128, 101, 0,
+ 0, 130, 98, 0, 0, 134, 97, 0, 0, 91, 80, 247, 3, 91, 84, 217, 0, 95, 91, 202, 0, 97, 95, 187, 0, 100, 98, 167,
+ 0, 106, 100, 143, 0, 109, 100, 126, 0, 111, 102, 109, 0, 112, 104, 86, 0, 113, 102, 63, 0, 118, 98, 39, 0, 122, 96, 17,
+ 0, 124, 94, 2, 0, 126, 91, 0, 0, 127, 88, 0, 0, 127, 85, 0, 0, 130, 83, 0, 0, 91, 61, 247, 0, 97, 65, 231,
+ 0, 100, 69, 214, 0, 100, 73, 198, 0, 103, 76, 178, 0, 106, 81, 150, 0, 110, 83, 127, 0, 111, 84, 112, 0, 114, 85, 94,
+ 0, 113, 84, 74, 0, 120, 81, 51, 0, 124, 79, 29, 0, 127, 77, 11, 0, 129, 75, 1, 0, 129, 73, 0, 0, 128, 71, 0,
+ 0, 130, 67, 0, 0, 99, 45, 241, 0, 105, 48, 228, 0, 106, 53, 213, 0, 107, 57, 199, 0, 109, 60, 183, 0, 111, 64, 163,
+ 0, 113, 68, 137, 0, 113, 69, 120, 0, 112, 71, 102, 0, 111, 73, 83, 0, 115, 70, 64, 0, 121, 68, 40, 0, 124, 67, 20,
+ 0, 126, 66, 5, 0, 125, 65, 0, 0, 122, 64, 0, 0, 121, 62, 0, 0, 106, 32, 235, 0, 111, 34, 222, 0, 112, 39, 209,
+ 0, 114, 42, 197, 0, 116, 44, 185, 0, 119, 48, 170, 0, 121, 50, 151, 0, 120, 51, 131, 0, 119, 53, 110, 0, 113, 57, 89,
+ 0, 110, 59, 73, 0, 116, 57, 54, 0, 123, 54, 29, 0, 124, 54, 11, 0, 124, 53, 1, 0, 120, 54, 0, 0, 116, 54, 0,
+ 0, 115, 21, 232, 0, 116, 22, 218, 0, 117, 25, 205, 0, 118, 28, 196, 0, 119, 30, 184, 0, 121, 32, 170, 0, 122, 34, 154,
+ 0, 122, 35, 135, 0, 121, 36, 114, 0, 119, 38, 95, 0, 114, 43, 78, 0, 115, 43, 62, 0, 122, 39, 39, 0, 124, 39, 20,
+ 0, 122, 40, 6, 0, 118, 41, 1, 0, 112, 43, 0, 0, 123, 13, 232, 0, 123, 11, 214, 0, 122, 13, 203, 0, 121, 15, 194,
+ 0, 120, 17, 182, 0, 121, 18, 169, 0, 120, 19, 153, 0, 120, 20, 136, 0, 120, 21, 116, 0, 119, 23, 98, 0, 119, 24, 82,
+ 0, 120, 25, 65, 0, 122, 24, 47, 0, 124, 24, 29, 0, 123, 24, 14, 0, 118, 26, 2, 0, 107, 33, 0, 0, 130, 7, 230,
+ 0, 128, 4, 211, 0, 125, 5, 201, 0, 123, 6, 191, 0, 121, 6, 180, 0, 119, 7, 165, 0, 118, 7, 150, 0, 118, 8, 134,
+ 0, 118, 8, 117, 0, 119, 9, 101, 0, 119, 10, 86, 0, 120, 10, 70, 0, 120, 11, 52, 0, 121, 11, 36, 0, 121, 11, 20,
+ 0, 118, 12, 7, 0, 104, 21, 0, 0, 136, 4, 229, 0, 131, 1, 210, 0, 127, 1, 198, 0, 123, 0, 186, 0, 119, 0, 172,
+ 0, 115, 1, 156, 0, 113, 1, 141, 0, 112, 1, 126, 0, 112, 1, 111, 0, 113, 1, 98, 0, 113, 1, 87, 0, 115, 1, 73,
+ 0, 115, 1, 57, 0, 114, 2, 40, 0, 115, 1, 25, 0, 113, 2, 11, 0, 102, 10, 0, 0, 141, 2, 229, 0, 135, 0, 209,
+ 0, 128, 0, 193, 0, 122, 0, 177, 0, 115, 0, 161, 0, 109, 0, 143, 0, 104, 0, 126, 0, 100, 0, 109, 0, 98, 0, 96,
+ 0, 98, 0, 88, 0, 99, 0, 80, 0, 100, 0, 70, 0, 100, 0, 58, 0, 100, 0, 43, 0, 99, 0, 29, 0, 98, 0, 17,
+ 0, 94, 4, 0, 0, 146, 0, 229, 0, 140, 0, 216, 0, 135, 0, 201, 0, 129, 0, 185, 0, 122, 0, 166, 0, 113, 0, 146,
+ 0, 104, 0, 125, 0, 95, 0, 102, 0, 87, 0, 84, 0, 85, 0, 77, 0, 85, 0, 71, 0, 85, 0, 64, 0, 86, 0, 55,
+ 0, 86, 0, 43, 0, 86, 0, 27, 0, 86, 0, 11, 0, 88, 0, 0, 5, 45, 197, 232, 4, 42, 201, 230, 1, 44, 203, 218,
+ 0, 48, 199, 197, 0, 49, 197, 170, 0, 51, 197, 136, 0, 52, 198, 102, 0, 52, 198, 75, 0, 52, 196, 52, 0, 54, 196, 36,
+ 0, 70, 191, 19, 0, 86, 186, 6, 0, 100, 180, 2, 0, 113, 174, 3, 0, 123, 169, 3, 0, 131, 165, 2, 0, 138, 161, 0,
+ 8, 51, 184, 235, 6, 52, 184, 231, 0, 59, 186, 210, 0, 59, 183, 192, 0, 58, 188, 163, 0, 60, 188, 133, 0, 63, 188, 99,
+ 0, 66, 187, 74, 0, 68, 184, 50, 0, 71, 182, 29, 0, 80, 177, 9, 0, 93, 170, 1, 0, 105, 164, 0, 0, 115, 159, 0,
+ 0, 124, 156, 0, 0, 131, 153, 0, 0, 135, 154, 0, 8, 55, 174, 235, 7, 60, 169, 219, 2, 70, 166, 199, 0, 68, 172, 186,
+ 0, 64, 180, 161, 0, 66, 181, 135, 0, 69, 180, 102, 0, 72, 179, 78, 0, 75, 176, 54, 0, 78, 174, 32, 0, 84, 170, 10,
+ 0, 96, 162, 1, 0, 107, 155, 0, 0, 116, 151, 0, 0, 123, 147, 0, 0, 129, 145, 0, 0, 132, 147, 0, 5, 60, 161, 230,
+ 6, 64, 153, 214, 0, 73, 157, 197, 0, 74, 159, 183, 0, 75, 164, 168, 0, 76, 167, 148, 0, 78, 168, 120, 0, 77, 168, 91,
+ 0, 80, 167, 61, 0, 83, 165, 37, 0, 89, 162, 14, 0, 98, 155, 1, 0, 109, 148, 0, 0, 117, 142, 0, 0, 122, 138, 0,
+ 0, 127, 135, 0, 0, 129, 138, 0, 4, 66, 144, 228, 3, 71, 142, 210, 0, 77, 144, 194, 0, 79, 145, 180, 0, 82, 148, 165,
+ 0, 83, 151, 150, 0, 83, 153, 126, 0, 83, 154, 98, 0, 86, 155, 66, 0, 88, 154, 42, 0, 93, 151, 19, 0, 100, 146, 2,
+ 0, 109, 139, 0, 0, 116, 133, 0, 0, 121, 128, 0, 0, 125, 124, 0, 0, 127, 126, 0, 0, 72, 129, 233, 0, 78, 131, 209,
+ 1, 82, 132, 192, 0, 83, 132, 179, 0, 85, 135, 165, 0, 88, 136, 148, 0, 87, 137, 130, 0, 87, 140, 103, 0, 91, 141, 72,
+ 0, 92, 140, 49, 0, 97, 138, 25, 0, 102, 135, 6, 0, 109, 129, 0, 0, 114, 122, 0, 0, 118, 116, 0, 0, 122, 112, 0,
+ 0, 125, 113, 0, 0, 72, 107, 240, 0, 79, 112, 207, 0, 84, 114, 187, 0, 86, 117, 176, 0, 88, 119, 161, 0, 90, 121, 143,
+ 0, 97, 117, 128, 0, 94, 121, 109, 0, 94, 125, 79, 0, 94, 126, 57, 0, 99, 124, 34, 0, 104, 121, 14, 0, 108, 116, 1,
+ 0, 112, 110, 0, 0, 115, 104, 0, 0, 118, 100, 0, 0, 122, 99, 0, 0, 75, 85, 238, 0, 78, 92, 210, 0, 82, 96, 195,
+ 0, 83, 101, 181, 0, 87, 103, 164, 0, 89, 104, 144, 0, 95, 103, 125, 0, 98, 103, 111, 0, 96, 107, 91, 0, 93, 110, 68,
+ 0, 99, 107, 42, 0, 104, 105, 20, 0, 106, 101, 2, 0, 109, 96, 0, 0, 112, 91, 0, 0, 114, 88, 0, 0, 117, 86, 0,
+ 0, 76, 65, 242, 0, 80, 69, 225, 0, 82, 73, 207, 0, 82, 80, 190, 0, 84, 84, 171, 0, 88, 86, 151, 0, 93, 87, 128,
+ 0, 95, 88, 110, 0, 95, 89, 93, 0, 94, 91, 74, 0, 100, 87, 50, 0, 104, 85, 27, 0, 106, 83, 7, 0, 109, 81, 0,
+ 0, 110, 78, 0, 0, 110, 76, 0, 0, 112, 72, 0, 0, 76, 48, 242, 0, 82, 51, 227, 0, 83, 56, 212, 0, 82, 62, 197,
+ 0, 85, 65, 179, 0, 88, 69, 160, 0, 93, 71, 134, 0, 94, 73, 113, 0, 95, 72, 98, 0, 97, 71, 82, 0, 99, 71, 61,
+ 0, 105, 68, 37, 0, 109, 67, 17, 0, 111, 65, 3, 0, 111, 63, 0, 0, 110, 62, 0, 0, 112, 58, 0, 0, 85, 35, 236,
+ 0, 89, 37, 223, 0, 91, 41, 210, 0, 93, 44, 197, 0, 95, 47, 184, 0, 95, 51, 168, 0, 98, 54, 147, 0, 99, 56, 122,
+ 0, 98, 57, 105, 0, 97, 58, 88, 0, 96, 60, 71, 0, 101, 58, 52, 0, 106, 56, 28, 0, 109, 55, 10, 0, 108, 54, 1,
+ 0, 106, 54, 0, 0, 104, 52, 0, 0, 94, 24, 231, 0, 96, 26, 217, 0, 97, 28, 206, 0, 100, 30, 195, 0, 101, 32, 184,
+ 0, 103, 35, 171, 0, 104, 37, 154, 0, 105, 38, 134, 0, 103, 40, 112, 0, 98, 44, 92, 0, 95, 48, 77, 0, 96, 48, 62,
+ 0, 102, 44, 42, 0, 108, 42, 19, 0, 107, 42, 4, 0, 104, 42, 0, 0, 100, 43, 0, 0, 104, 15, 229, 0, 104, 15, 214,
+ 0, 104, 16, 204, 0, 104, 17, 193, 0, 105, 19, 183, 0, 106, 21, 170, 0, 106, 22, 154, 0, 106, 24, 136, 0, 105, 25, 116,
+ 0, 100, 29, 94, 0, 99, 31, 79, 0, 100, 32, 65, 0, 102, 31, 49, 0, 109, 27, 28, 0, 109, 27, 11, 0, 104, 29, 1,
+ 0, 96, 33, 0, 0, 112, 8, 229, 0, 111, 6, 213, 0, 110, 7, 202, 0, 109, 7, 192, 0, 107, 8, 180, 0, 106, 9, 166,
+ 0, 105, 10, 151, 0, 105, 11, 135, 0, 105, 11, 118, 0, 105, 11, 99, 0, 105, 13, 84, 0, 105, 14, 69, 0, 105, 14, 52,
+ 0, 107, 14, 35, 0, 109, 13, 19, 0, 105, 15, 5, 0, 93, 22, 0, 0, 119, 4, 228, 0, 117, 2, 209, 0, 114, 1, 199,
+ 0, 111, 1, 187, 0, 107, 1, 173, 0, 104, 1, 159, 0, 102, 1, 145, 0, 102, 1, 129, 0, 102, 1, 113, 0, 102, 1, 97,
+ 0, 102, 2, 85, 0, 103, 2, 72, 0, 103, 3, 56, 0, 103, 3, 39, 0, 103, 3, 24, 0, 102, 4, 10, 0, 90, 12, 0,
+ 0, 126, 2, 227, 0, 122, 0, 207, 0, 117, 0, 191, 0, 111, 0, 176, 0, 105, 0, 160, 0, 99, 0, 144, 0, 95, 0, 127,
+ 0, 92, 0, 111, 0, 90, 0, 96, 0, 89, 0, 85, 0, 89, 0, 76, 0, 90, 0, 67, 0, 90, 0, 56, 0, 90, 0, 43,
+ 0, 90, 0, 29, 0, 89, 1, 16, 0, 84, 5, 0, 0, 133, 0, 228, 0, 128, 0, 215, 0, 123, 0, 200, 0, 117, 0, 185,
+ 0, 111, 0, 167, 0, 104, 0, 146, 0, 96, 0, 125, 0, 87, 0, 103, 0, 78, 0, 83, 0, 77, 0, 73, 0, 77, 0, 67,
+ 0, 77, 0, 61, 0, 77, 0, 53, 0, 77, 0, 42, 0, 77, 0, 28, 0, 77, 0, 11, 0, 77, 0, 0, 2, 32, 197, 235,
+ 1, 30, 200, 233, 1, 29, 201, 221, 0, 34, 198, 200, 0, 35, 196, 175, 0, 37, 196, 145, 0, 38, 196, 111, 0, 39, 199, 83,
+ 0, 40, 200, 59, 0, 41, 199, 39, 0, 43, 200, 26, 0, 61, 193, 12, 0, 77, 187, 3, 0, 92, 180, 0, 0, 103, 174, 0,
+ 0, 114, 170, 1, 0, 122, 166, 0, 1, 35, 190, 236, 2, 39, 185, 234, 0, 44, 182, 212, 0, 45, 182, 194, 0, 42, 186, 164,
+ 0, 44, 187, 139, 0, 46, 186, 106, 0, 48, 187, 79, 0, 50, 185, 55, 0, 53, 184, 35, 0, 56, 182, 16, 0, 69, 176, 3,
+ 0, 84, 169, 0, 0, 96, 163, 0, 0, 105, 160, 0, 0, 114, 157, 0, 0, 119, 159, 0, 1, 39, 182, 238, 1, 46, 173, 225,
+ 0, 57, 165, 199, 0, 53, 170, 187, 0, 49, 178, 161, 0, 50, 179, 140, 0, 51, 178, 109, 0, 55, 179, 82, 0, 57, 176, 58,
+ 0, 60, 175, 37, 0, 63, 173, 17, 0, 73, 168, 2, 0, 86, 160, 0, 0, 97, 154, 0, 0, 106, 150, 0, 0, 112, 149, 0,
+ 0, 116, 152, 0, 1, 43, 168, 239, 0, 52, 160, 222, 0, 59, 153, 195, 0, 59, 158, 184, 0, 62, 162, 167, 0, 62, 164, 149,
+ 0, 63, 165, 127, 0, 61, 167, 99, 0, 64, 167, 66, 0, 67, 166, 43, 0, 69, 165, 21, 0, 76, 159, 2, 0, 88, 151, 0,
+ 0, 99, 145, 0, 0, 105, 142, 0, 0, 111, 140, 0, 0, 113, 143, 0, 0, 48, 151, 239, 0, 56, 145, 217, 0, 64, 143, 195,
+ 0, 65, 145, 182, 0, 68, 149, 164, 0, 71, 150, 149, 0, 72, 150, 132, 0, 68, 154, 104, 0, 71, 156, 69, 0, 72, 155, 46,
+ 0, 74, 154, 24, 0, 79, 150, 3, 0, 90, 142, 0, 0, 98, 136, 0, 0, 104, 132, 0, 0, 109, 129, 0, 0, 112, 132, 0,
+ 0, 52, 132, 238, 0, 61, 131, 211, 0, 67, 131, 191, 0, 68, 133, 181, 0, 72, 138, 164, 0, 74, 138, 147, 0, 75, 138, 130,
+ 0, 72, 141, 108, 0, 75, 143, 75, 0, 76, 143, 51, 0, 77, 142, 28, 0, 82, 139, 8, 0, 90, 133, 1, 0, 97, 126, 0,
+ 0, 103, 121, 0, 0, 108, 117, 0, 0, 110, 119, 0, 0, 56, 111, 239, 0, 64, 115, 206, 0, 71, 118, 186, 0, 73, 119, 175,
+ 0, 74, 121, 161, 0, 76, 123, 145, 0, 76, 122, 129, 0, 75, 125, 111, 0, 77, 128, 81, 0, 78, 129, 60, 0, 79, 128, 37,
+ 0, 84, 126, 15, 0, 89, 121, 2, 0, 96, 115, 0, 0, 101, 109, 0, 0, 105, 104, 0, 0, 108, 104, 0, 0, 59, 90, 237,
+ 0, 64, 97, 208, 0, 68, 100, 192, 0, 71, 104, 177, 0, 75, 105, 159, 0, 76, 106, 143, 0, 77, 106, 128, 0, 83, 104, 113,
+ 0, 81, 108, 93, 0, 77, 112, 71, 0, 81, 111, 45, 0, 86, 109, 23, 0, 89, 106, 5, 0, 94, 101, 0, 0, 98, 95, 0,
+ 0, 101, 91, 0, 0, 104, 88, 0, 0, 61, 71, 238, 0, 66, 75, 215, 0, 68, 80, 201, 0, 70, 86, 182, 0, 75, 88, 158,
+ 0, 76, 89, 143, 0, 78, 89, 128, 0, 82, 89, 109, 0, 84, 89, 96, 0, 81, 93, 76, 0, 83, 93, 51, 0, 86, 92, 29,
+ 0, 89, 90, 9, 0, 92, 86, 1, 0, 95, 81, 0, 0, 97, 78, 0, 0, 98, 75, 0, 0, 63, 52, 238, 0, 67, 57, 220,
+ 0, 69, 61, 206, 0, 68, 68, 190, 0, 71, 72, 172, 0, 74, 74, 154, 0, 76, 75, 135, 0, 79, 75, 113, 0, 81, 75, 96,
+ 0, 81, 75, 79, 0, 83, 75, 60, 0, 86, 74, 37, 0, 90, 70, 17, 0, 92, 70, 2, 0, 94, 68, 0, 0, 94, 65, 0,
+ 0, 95, 63, 0, 0, 62, 37, 236, 0, 69, 41, 222, 0, 72, 45, 209, 0, 74, 47, 196, 0, 77, 50, 180, 0, 78, 54, 163,
+ 0, 80, 56, 145, 0, 81, 58, 120, 0, 82, 60, 99, 0, 81, 60, 85, 0, 82, 58, 71, 0, 85, 58, 49, 0, 91, 56, 25,
+ 0, 94, 55, 7, 0, 94, 53, 0, 0, 94, 51, 0, 0, 95, 48, 0, 0, 73, 26, 232, 0, 76, 28, 218, 0, 78, 31, 207,
+ 0, 82, 32, 196, 0, 84, 35, 183, 0, 83, 39, 169, 0, 85, 40, 153, 0, 85, 42, 133, 0, 84, 45, 108, 0, 82, 48, 89,
+ 0, 81, 48, 75, 0, 83, 48, 59, 0, 87, 46, 39, 0, 92, 43, 17, 0, 93, 43, 2, 0, 90, 43, 0, 0, 88, 42, 0,
+ 0, 84, 17, 228, 0, 85, 18, 213, 0, 86, 19, 204, 0, 87, 20, 194, 0, 88, 22, 183, 0, 89, 24, 170, 0, 90, 25, 155,
+ 0, 91, 27, 138, 0, 90, 29, 116, 0, 86, 32, 94, 0, 82, 35, 77, 0, 82, 36, 64, 0, 84, 35, 49, 0, 88, 32, 30,
+ 0, 92, 30, 9, 0, 90, 31, 1, 0, 85, 33, 0, 0, 93, 10, 226, 0, 93, 9, 212, 0, 93, 9, 202, 0, 92, 9, 192,
+ 0, 92, 10, 180, 0, 92, 12, 166, 0, 92, 13, 152, 0, 92, 14, 136, 0, 92, 14, 118, 0, 91, 15, 99, 0, 86, 19, 80,
+ 0, 86, 20, 66, 0, 85, 21, 52, 0, 87, 20, 36, 0, 94, 16, 17, 0, 92, 17, 3, 0, 82, 23, 0, 0, 101, 5, 226,
+ 0, 100, 3, 210, 0, 98, 2, 200, 0, 96, 1, 189, 0, 94, 2, 176, 0, 92, 2, 161, 0, 91, 3, 145, 0, 90, 3, 130,
+ 0, 90, 3, 115, 0, 90, 3, 98, 0, 89, 4, 82, 0, 89, 5, 69, 0, 89, 6, 55, 0, 89, 6, 39, 0, 91, 5, 23,
+ 0, 91, 5, 9, 0, 79, 13, 0, 0, 109, 2, 225, 0, 107, 0, 207, 0, 102, 0, 192, 0, 98, 0, 177, 0, 94, 0, 161,
+ 0, 90, 0, 145, 0, 86, 0, 129, 0, 84, 0, 113, 0, 82, 0, 99, 0, 80, 0, 85, 0, 80, 0, 75, 0, 81, 0, 65,
+ 0, 82, 0, 55, 0, 82, 0, 42, 0, 82, 0, 29, 0, 81, 1, 15, 0, 75, 5, 0, 0, 117, 0, 226, 0, 114, 0, 213,
+ 0, 109, 0, 199, 0, 104, 0, 184, 0, 99, 0, 167, 0, 93, 0, 147, 0, 87, 0, 126, 0, 79, 0, 105, 0, 71, 0, 85,
+ 0, 69, 0, 74, 0, 69, 0, 65, 0, 69, 0, 59, 0, 69, 0, 51, 0, 69, 0, 41, 0, 69, 0, 28, 0, 69, 0, 13,
+ 0, 69, 0, 0, 0, 24, 197, 236, 0, 22, 200, 234, 0, 20, 202, 225, 0, 23, 199, 204, 0, 25, 197, 179, 0, 26, 196, 152,
+ 0, 28, 196, 124, 0, 28, 200, 93, 0, 29, 202, 66, 0, 31, 202, 46, 0, 32, 203, 29, 0, 33, 203, 18, 0, 53, 195, 8,
+ 0, 70, 188, 2, 0, 85, 181, 0, 0, 96, 175, 0, 0, 106, 171, 0, 0, 25, 191, 237, 0, 26, 184, 234, 0, 28, 182, 218,
+ 0, 28, 182, 197, 0, 26, 186, 167, 0, 28, 186, 145, 0, 30, 187, 118, 0, 32, 188, 87, 0, 35, 187, 61, 0, 37, 185, 40,
+ 0, 40, 185, 23, 0, 44, 182, 8, 0, 59, 175, 1, 0, 75, 169, 0, 0, 87, 164, 0, 0, 97, 162, 0, 0, 102, 163, 0,
+ 0, 27, 182, 238, 0, 30, 173, 230, 0, 35, 168, 207, 0, 34, 171, 190, 0, 31, 176, 163, 0, 33, 177, 144, 0, 34, 178, 119,
+ 0, 37, 178, 89, 0, 41, 177, 63, 0, 43, 175, 42, 0, 45, 175, 24, 0, 49, 172, 7, 0, 63, 165, 1, 0, 78, 159, 0,
+ 0, 89, 154, 0, 0, 95, 152, 0, 0, 99, 156, 0, 0, 29, 170, 239, 0, 33, 161, 226, 0, 39, 157, 203, 0, 42, 157, 186,
+ 0, 43, 159, 167, 0, 43, 161, 152, 0, 43, 164, 132, 0, 42, 167, 104, 0, 47, 167, 70, 0, 49, 165, 46, 0, 51, 165, 26,
+ 0, 54, 163, 7, 0, 68, 155, 0, 0, 80, 149, 0, 0, 88, 145, 0, 0, 94, 142, 0, 0, 97, 147, 0, 0, 33, 153, 239,
+ 0, 37, 148, 223, 0, 43, 146, 200, 0, 47, 146, 182, 0, 52, 147, 161, 0, 51, 149, 150, 0, 50, 152, 133, 0, 49, 155, 109,
+ 0, 53, 157, 74, 0, 54, 155, 50, 0, 56, 155, 29, 0, 59, 153, 8, 0, 70, 146, 1, 0, 79, 139, 0, 0, 87, 135, 0,
+ 0, 93, 132, 0, 0, 95, 137, 0, 0, 37, 135, 238, 0, 43, 133, 214, 0, 50, 132, 194, 0, 53, 134, 179, 0, 55, 136, 160,
+ 0, 56, 138, 148, 0, 56, 139, 133, 0, 54, 142, 114, 0, 57, 145, 79, 0, 59, 144, 56, 0, 61, 143, 33, 0, 63, 142, 12,
+ 0, 70, 137, 1, 0, 79, 129, 0, 0, 86, 124, 0, 0, 92, 120, 0, 0, 94, 124, 0, 0, 42, 116, 237, 0, 49, 116, 205,
+ 0, 56, 118, 186, 0, 58, 121, 176, 0, 59, 123, 161, 0, 60, 125, 144, 0, 60, 123, 129, 0, 57, 127, 113, 0, 60, 131, 85,
+ 0, 62, 131, 64, 0, 63, 130, 41, 0, 65, 129, 18, 0, 69, 125, 2, 0, 78, 118, 0, 0, 85, 111, 0, 0, 90, 107, 0,
+ 0, 92, 109, 0, 0, 45, 95, 236, 0, 51, 100, 204, 0, 56, 103, 187, 0, 58, 105, 173, 0, 61, 106, 158, 0, 62, 107, 143,
+ 0, 63, 108, 129, 0, 61, 109, 113, 0, 62, 112, 95, 0, 62, 114, 75, 0, 64, 114, 48, 0, 67, 113, 26, 0, 70, 111, 6,
+ 0, 77, 105, 0, 0, 83, 98, 0, 0, 88, 93, 0, 0, 89, 92, 0, 0, 48, 77, 234, 0, 52, 84, 205, 0, 56, 86, 189,
+ 0, 58, 89, 174, 0, 61, 90, 156, 0, 63, 91, 142, 0, 64, 91, 128, 0, 65, 92, 112, 0, 72, 90, 94, 0, 68, 94, 78,
+ 0, 66, 96, 53, 0, 68, 96, 34, 0, 71, 94, 13, 0, 76, 90, 1, 0, 82, 85, 0, 0, 85, 80, 0, 0, 85, 77, 0,
+ 0, 50, 59, 233, 0, 52, 67, 209, 0, 54, 70, 196, 0, 56, 73, 183, 0, 58, 76, 167, 0, 61, 78, 147, 0, 63, 77, 131,
+ 0, 65, 78, 114, 0, 70, 77, 94, 0, 69, 76, 81, 0, 67, 79, 64, 0, 68, 79, 48, 0, 73, 76, 29, 0, 76, 75, 3,
+ 0, 79, 71, 0, 0, 81, 67, 0, 0, 82, 65, 0, 0, 51, 42, 233, 0, 55, 46, 215, 0, 58, 49, 204, 0, 61, 51, 192,
+ 0, 62, 55, 176, 0, 59, 61, 159, 0, 61, 63, 139, 0, 63, 64, 120, 0, 67, 64, 97, 0, 68, 63, 83, 0, 67, 63, 68,
+ 0, 67, 63, 53, 0, 73, 60, 33, 0, 76, 58, 8, 0, 78, 57, 0, 0, 79, 55, 0, 0, 79, 53, 0, 0, 49, 29, 231,
+ 0, 57, 32, 216, 0, 60, 34, 206, 0, 64, 35, 195, 0, 65, 37, 182, 0, 60, 43, 166, 0, 61, 45, 148, 0, 63, 47, 130,
+ 0, 65, 49, 105, 0, 66, 49, 86, 0, 67, 48, 74, 0, 70, 46, 60, 0, 72, 46, 37, 0, 76, 44, 14, 0, 78, 42, 1,
+ 0, 78, 41, 0, 0, 78, 38, 0, 0, 62, 19, 229, 0, 66, 21, 214, 0, 68, 21, 205, 0, 70, 22, 195, 0, 71, 24, 183,
+ 0, 72, 26, 170, 0, 73, 28, 155, 0, 73, 30, 138, 0, 73, 31, 117, 0, 72, 34, 93, 0, 69, 36, 76, 0, 69, 36, 63,
+ 0, 70, 35, 46, 0, 73, 34, 27, 0, 77, 32, 7, 0, 76, 32, 0, 0, 73, 32, 0, 0, 73, 11, 225, 0, 74, 12, 211,
+ 0, 75, 12, 202, 0, 76, 12, 193, 0, 77, 13, 181, 0, 77, 14, 167, 0, 77, 15, 153, 0, 77, 17, 138, 0, 77, 17, 120,
+ 0, 77, 18, 99, 0, 72, 22, 79, 0, 68, 24, 64, 0, 68, 25, 51, 0, 69, 24, 36, 0, 74, 22, 18, 0, 76, 20, 2,
+ 0, 70, 24, 0, 0, 83, 6, 224, 0, 82, 5, 209, 0, 82, 4, 201, 0, 81, 4, 191, 0, 80, 4, 178, 0, 79, 5, 162,
+ 0, 78, 5, 147, 0, 78, 6, 132, 0, 78, 6, 116, 0, 77, 6, 99, 0, 75, 7, 82, 0, 72, 10, 66, 0, 72, 12, 53,
+ 0, 71, 12, 40, 0, 73, 11, 25, 0, 77, 8, 8, 0, 68, 14, 0, 0, 91, 2, 223, 0, 90, 1, 208, 0, 88, 0, 196,
+ 0, 85, 0, 182, 0, 82, 0, 166, 0, 79, 0, 149, 0, 76, 0, 133, 0, 74, 0, 117, 0, 73, 0, 102, 0, 71, 0, 88,
+ 0, 71, 1, 76, 0, 71, 1, 64, 0, 71, 1, 53, 0, 72, 1, 41, 0, 72, 1, 28, 0, 72, 1, 14, 0, 65, 5, 0,
+ 0, 100, 0, 224, 0, 97, 0, 213, 0, 94, 0, 200, 0, 91, 0, 186, 0, 87, 0, 170, 0, 82, 0, 150, 0, 77, 0, 129,
+ 0, 70, 0, 106, 0, 63, 0, 86, 0, 61, 0, 75, 0, 61, 0, 66, 0, 60, 0, 58, 0, 60, 0, 51, 0, 60, 0, 41,
+ 0, 60, 0, 29, 0, 60, 0, 14, 0, 60, 0, 0, 0, 16, 196, 235, 0, 14, 199, 235, 0, 12, 202, 230, 0, 14, 199, 207,
+ 0, 15, 197, 184, 0, 17, 196, 159, 0, 19, 197, 131, 0, 19, 199, 103, 0, 20, 202, 75, 0, 22, 203, 53, 0, 23, 205, 35,
+ 0, 24, 205, 20, 0, 25, 205, 12, 0, 45, 196, 4, 0, 62, 188, 0, 0, 78, 182, 0, 0, 90, 176, 0, 0, 17, 190, 236,
+ 0, 15, 185, 224, 0, 14, 184, 210, 0, 13, 185, 190, 0, 13, 186, 168, 0, 15, 186, 150, 0, 17, 188, 125, 0, 18, 189, 95,
+ 0, 21, 189, 68, 0, 24, 187, 47, 0, 27, 187, 29, 0, 29, 185, 14, 0, 34, 183, 3, 0, 51, 176, 0, 0, 68, 170, 0,
+ 0, 79, 166, 0, 0, 86, 168, 0, 0, 19, 182, 237, 0, 17, 176, 223, 0, 18, 173, 202, 0, 17, 174, 185, 0, 17, 176, 164,
+ 0, 18, 176, 147, 0, 20, 178, 124, 0, 21, 180, 96, 0, 26, 178, 69, 0, 29, 176, 48, 0, 31, 176, 29, 0, 33, 174, 13,
+ 0, 39, 172, 2, 0, 55, 164, 0, 0, 70, 158, 0, 0, 78, 156, 0, 0, 83, 160, 0, 0, 20, 170, 238, 0, 19, 164, 222,
+ 0, 22, 161, 202, 0, 25, 158, 188, 0, 27, 158, 169, 0, 26, 161, 152, 0, 25, 165, 128, 0, 26, 169, 101, 0, 31, 167, 72,
+ 0, 34, 166, 50, 0, 35, 166, 28, 0, 38, 164, 10, 0, 45, 160, 1, 0, 60, 153, 0, 0, 70, 148, 0, 0, 77, 146, 0,
+ 0, 81, 151, 0, 0, 22, 154, 239, 0, 22, 151, 224, 0, 26, 149, 203, 0, 31, 148, 186, 0, 36, 146, 163, 0, 33, 148, 150,
+ 0, 30, 154, 129, 0, 31, 156, 106, 0, 35, 156, 76, 0, 38, 155, 54, 0, 40, 154, 32, 0, 42, 154, 12, 0, 48, 150, 1,
+ 0, 59, 143, 0, 0, 69, 138, 0, 0, 76, 135, 0, 0, 78, 140, 0, 0, 26, 137, 236, 0, 28, 134, 217, 0, 32, 134, 197,
+ 0, 37, 136, 181, 0, 40, 135, 161, 0, 39, 136, 147, 0, 38, 138, 133, 0, 37, 141, 116, 0, 39, 145, 84, 0, 42, 144, 60,
+ 0, 43, 142, 38, 0, 45, 142, 18, 0, 48, 140, 2, 0, 58, 133, 0, 0, 68, 127, 0, 0, 76, 123, 0, 0, 77, 128, 0,
+ 0, 29, 119, 235, 0, 35, 118, 205, 0, 42, 119, 185, 0, 42, 120, 175, 0, 43, 123, 161, 0, 44, 124, 143, 0, 45, 122, 130,
+ 0, 42, 127, 115, 0, 42, 131, 90, 0, 45, 131, 67, 0, 46, 130, 44, 0, 47, 129, 24, 0, 49, 128, 5, 0, 58, 122, 0,
+ 0, 68, 114, 0, 0, 74, 110, 0, 0, 75, 113, 0, 0, 33, 98, 234, 0, 39, 103, 201, 0, 44, 103, 180, 0, 45, 105, 171,
+ 0, 46, 107, 158, 0, 48, 107, 143, 0, 49, 109, 130, 0, 46, 110, 114, 0, 45, 113, 98, 0, 45, 115, 78, 0, 47, 115, 51,
+ 0, 48, 114, 29, 0, 50, 114, 9, 0, 57, 109, 1, 0, 67, 101, 0, 0, 73, 95, 0, 0, 73, 96, 0, 0, 35, 81, 233,
+ 0, 40, 87, 198, 0, 46, 88, 175, 0, 46, 90, 167, 0, 47, 92, 155, 0, 48, 92, 142, 0, 50, 93, 128, 0, 50, 94, 113,
+ 0, 50, 94, 97, 0, 49, 97, 80, 0, 49, 98, 56, 0, 50, 98, 36, 0, 52, 98, 16, 0, 57, 95, 1, 0, 66, 88, 0,
+ 0, 71, 83, 0, 0, 70, 81, 0, 0, 38, 64, 229, 0, 40, 72, 202, 0, 43, 75, 188, 0, 44, 76, 177, 0, 45, 78, 164,
+ 0, 47, 79, 145, 0, 50, 80, 128, 0, 51, 80, 114, 0, 52, 80, 96, 0, 57, 77, 82, 0, 54, 80, 67, 0, 53, 81, 52,
+ 0, 57, 80, 31, 0, 58, 80, 5, 0, 64, 75, 0, 0, 69, 70, 0, 0, 68, 68, 0, 0, 40, 47, 228, 0, 43, 52, 211,
+ 0, 45, 54, 201, 0, 46, 57, 190, 0, 46, 60, 175, 0, 45, 65, 153, 0, 49, 67, 128, 0, 51, 67, 112, 0, 53, 67, 96,
+ 0, 56, 64, 81, 0, 57, 63, 70, 0, 55, 65, 56, 0, 59, 63, 40, 0, 59, 63, 18, 0, 63, 61, 2, 0, 66, 57, 0,
+ 0, 65, 56, 0, 0, 39, 32, 228, 0, 44, 36, 211, 0, 47, 37, 202, 0, 48, 38, 192, 0, 49, 42, 179, 0, 44, 49, 162,
+ 0, 46, 51, 142, 0, 48, 52, 125, 0, 50, 52, 104, 0, 53, 52, 84, 0, 54, 50, 71, 0, 54, 50, 55, 0, 56, 50, 40,
+ 0, 58, 48, 21, 0, 61, 46, 3, 0, 63, 44, 0, 0, 63, 43, 0, 0, 39, 22, 227, 0, 45, 24, 212, 0, 48, 24, 204,
+ 0, 50, 24, 195, 0, 52, 26, 183, 0, 52, 28, 168, 0, 53, 30, 152, 0, 53, 32, 135, 0, 53, 34, 115, 0, 55, 35, 92,
+ 0, 55, 35, 75, 0, 54, 35, 61, 0, 55, 34, 48, 0, 57, 34, 24, 0, 61, 33, 4, 0, 62, 31, 0, 0, 63, 29, 0,
+ 0, 52, 13, 225, 0, 54, 14, 212, 0, 56, 13, 204, 0, 58, 13, 195, 0, 59, 14, 184, 0, 59, 16, 169, 0, 59, 17, 154,
+ 0, 59, 19, 139, 0, 59, 20, 121, 0, 60, 21, 100, 0, 58, 23, 79, 0, 55, 25, 63, 0, 54, 25, 49, 0, 56, 25, 33,
+ 0, 59, 23, 15, 0, 61, 22, 2, 0, 58, 22, 0, 0, 63, 7, 223, 0, 64, 6, 209, 0, 65, 5, 201, 0, 65, 5, 192,
+ 0, 64, 6, 180, 0, 64, 7, 165, 0, 63, 7, 149, 0, 63, 8, 135, 0, 64, 8, 119, 0, 64, 8, 100, 0, 62, 9, 83,
+ 0, 58, 13, 66, 0, 55, 15, 50, 0, 55, 15, 38, 0, 56, 14, 25, 0, 59, 12, 9, 0, 56, 14, 0, 0, 73, 3, 222,
+ 0, 73, 1, 209, 0, 71, 1, 199, 0, 70, 0, 188, 0, 68, 0, 174, 0, 66, 1, 158, 0, 65, 1, 140, 0, 63, 1, 123,
+ 0, 62, 1, 107, 0, 61, 1, 93, 0, 61, 1, 80, 0, 60, 1, 66, 0, 58, 4, 52, 0, 58, 4, 40, 0, 57, 4, 28,
+ 0, 58, 4, 14, 0, 54, 6, 0, 0, 82, 0, 222, 0, 80, 0, 213, 0, 78, 0, 202, 0, 76, 0, 190, 0, 73, 0, 175,
+ 0, 70, 0, 156, 0, 66, 0, 134, 0, 60, 0, 110, 0, 53, 0, 88, 0, 52, 0, 77, 0, 51, 0, 67, 0, 51, 0, 59,
+ 0, 50, 0, 51, 0, 50, 0, 41, 0, 51, 0, 30, 0, 51, 0, 16, 0, 50, 0, 0, 0, 10, 194, 235, 0, 8, 196, 234,
+ 0, 6, 200, 230, 0, 6, 198, 210, 0, 7, 196, 187, 0, 9, 196, 164, 0, 10, 197, 138, 0, 12, 199, 114, 0, 13, 201, 87,
+ 0, 14, 203, 61, 0, 15, 205, 41, 0, 16, 206, 26, 0, 17, 207, 13, 0, 17, 207, 6, 0, 38, 198, 2, 0, 56, 189, 0,
+ 0, 71, 182, 0, 0, 11, 189, 236, 0, 7, 184, 222, 0, 6, 183, 209, 0, 5, 184, 190, 0, 4, 185, 169, 0, 6, 185, 152,
+ 0, 8, 186, 130, 0, 8, 190, 105, 0, 11, 190, 77, 0, 13, 189, 53, 0, 16, 188, 36, 0, 18, 188, 20, 0, 20, 187, 8,
+ 0, 26, 184, 2, 0, 42, 177, 0, 0, 59, 172, 0, 0, 68, 174, 0, 0, 12, 181, 237, 0, 9, 175, 221, 0, 8, 172, 201,
+ 0, 8, 173, 185, 0, 7, 174, 165, 0, 8, 175, 149, 0, 10, 176, 130, 0, 9, 182, 106, 0, 12, 181, 77, 0, 16, 178, 53,
+ 0, 19, 177, 35, 0, 21, 176, 17, 0, 23, 175, 4, 0, 33, 170, 0, 0, 47, 164, 0, 0, 59, 161, 0, 0, 65, 166, 0,
+ 0, 13, 169, 238, 0, 11, 164, 221, 0, 11, 161, 202, 0, 13, 159, 189, 0, 13, 159, 171, 0, 13, 161, 154, 0, 13, 165, 130,
+ 0, 12, 170, 107, 0, 15, 169, 79, 0, 19, 167, 55, 0, 21, 166, 34, 0, 23, 166, 14, 0, 27, 163, 2, 0, 38, 158, 0,
+ 0, 48, 153, 0, 0, 58, 150, 0, 0, 63, 156, 0, 0, 14, 155, 239, 0, 13, 152, 223, 0, 14, 150, 203, 0, 16, 147, 189,
+ 0, 18, 147, 169, 0, 16, 149, 153, 0, 15, 154, 130, 0, 16, 156, 110, 0, 18, 156, 83, 0, 22, 155, 59, 0, 24, 154, 38,
+ 0, 25, 154, 17, 0, 28, 153, 3, 0, 37, 147, 0, 0, 47, 142, 0, 0, 58, 139, 0, 0, 61, 145, 0, 0, 17, 138, 236,
+ 0, 17, 135, 221, 0, 19, 135, 202, 0, 20, 135, 186, 0, 21, 137, 168, 0, 22, 138, 151, 0, 23, 138, 134, 0, 21, 140, 118,
+ 0, 22, 144, 89, 0, 25, 144, 64, 0, 27, 142, 44, 0, 28, 142, 24, 0, 29, 141, 7, 0, 37, 136, 1, 0, 47, 130, 0,
+ 0, 57, 126, 0, 0, 58, 132, 0, 0, 19, 121, 232, 0, 22, 119, 211, 0, 23, 120, 195, 0, 24, 122, 182, 0, 25, 124, 167,
+ 0, 28, 125, 147, 0, 31, 122, 130, 0, 27, 126, 116, 0, 26, 131, 93, 0, 28, 131, 70, 0, 29, 130, 49, 0, 30, 129, 29,
+ 0, 31, 129, 11, 0, 37, 126, 1, 0, 48, 118, 0, 0, 57, 112, 0, 0, 57, 117, 0, 0, 22, 101, 231, 0, 25, 104, 203,
+ 0, 29, 106, 186, 0, 29, 107, 176, 0, 30, 109, 162, 0, 31, 110, 146, 0, 35, 111, 131, 0, 33, 110, 115, 0, 31, 113, 99,
+ 0, 30, 115, 82, 0, 31, 116, 55, 0, 31, 115, 33, 0, 32, 115, 14, 0, 37, 113, 1, 0, 48, 105, 0, 0, 56, 98, 0,
+ 0, 54, 100, 0, 0, 24, 84, 231, 0, 28, 89, 197, 0, 33, 90, 175, 0, 34, 91, 167, 0, 34, 93, 157, 0, 34, 94, 143,
+ 0, 36, 95, 129, 0, 36, 95, 113, 0, 37, 95, 97, 0, 33, 98, 83, 0, 33, 100, 59, 0, 33, 100, 39, 0, 34, 100, 19,
+ 0, 37, 99, 2, 0, 48, 92, 0, 0, 55, 86, 0, 0, 52, 85, 0, 0, 26, 68, 227, 0, 28, 74, 202, 0, 30, 77, 187,
+ 0, 31, 79, 173, 0, 34, 79, 160, 0, 35, 81, 145, 0, 37, 82, 128, 0, 38, 82, 113, 0, 38, 81, 96, 0, 37, 82, 84,
+ 0, 36, 83, 67, 0, 34, 85, 51, 0, 37, 85, 26, 0, 39, 84, 6, 0, 47, 79, 0, 0, 53, 73, 0, 0, 51, 73, 0,
+ 0, 29, 52, 224, 0, 31, 56, 210, 0, 31, 59, 200, 0, 30, 64, 182, 0, 33, 66, 165, 0, 35, 66, 146, 0, 36, 68, 128,
+ 0, 38, 69, 112, 0, 40, 69, 96, 0, 40, 68, 82, 0, 45, 65, 69, 0, 41, 68, 55, 0, 42, 68, 37, 0, 42, 67, 20,
+ 0, 46, 65, 3, 0, 52, 61, 0, 0, 49, 60, 0, 0, 30, 37, 223, 0, 32, 40, 210, 0, 33, 41, 202, 0, 30, 46, 189,
+ 0, 31, 50, 174, 0, 32, 52, 157, 0, 34, 54, 138, 0, 34, 56, 120, 0, 38, 55, 98, 0, 40, 56, 84, 0, 43, 53, 70,
+ 0, 42, 53, 57, 0, 40, 54, 43, 0, 40, 54, 29, 0, 45, 51, 9, 0, 50, 47, 1, 0, 48, 47, 0, 0, 30, 23, 223,
+ 0, 32, 26, 209, 0, 34, 26, 201, 0, 35, 27, 192, 0, 36, 29, 180, 0, 37, 32, 166, 0, 37, 35, 148, 0, 34, 40, 130,
+ 0, 35, 41, 109, 0, 38, 41, 91, 0, 41, 39, 72, 0, 40, 39, 58, 0, 39, 39, 42, 0, 40, 39, 28, 0, 45, 35, 11,
+ 0, 48, 34, 1, 0, 46, 33, 0, 0, 29, 15, 223, 0, 34, 16, 210, 0, 37, 15, 203, 0, 39, 15, 195, 0, 39, 16, 184,
+ 0, 39, 18, 170, 0, 39, 20, 154, 0, 34, 24, 138, 0, 35, 25, 119, 0, 38, 24, 100, 0, 40, 24, 79, 0, 40, 25, 62,
+ 0, 40, 25, 48, 0, 41, 24, 36, 0, 44, 23, 14, 0, 46, 23, 2, 0, 47, 20, 0, 0, 41, 8, 222, 0, 43, 8, 210,
+ 0, 45, 6, 203, 0, 45, 6, 196, 0, 45, 7, 185, 0, 45, 8, 171, 0, 45, 9, 154, 0, 45, 10, 139, 0, 45, 10, 122,
+ 0, 46, 11, 103, 0, 47, 11, 84, 0, 45, 13, 65, 0, 42, 15, 50, 0, 42, 16, 37, 0, 44, 15, 22, 0, 46, 14, 7,
+ 0, 44, 14, 0, 0, 52, 3, 220, 0, 53, 2, 209, 0, 53, 1, 201, 0, 52, 1, 192, 0, 51, 1, 181, 0, 50, 1, 166,
+ 0, 49, 1, 148, 0, 48, 1, 131, 0, 48, 1, 113, 0, 48, 1, 97, 0, 49, 1, 83, 0, 49, 2, 69, 0, 45, 5, 53,
+ 0, 45, 5, 39, 0, 46, 5, 27, 0, 46, 5, 13, 0, 43, 6, 0, 0, 63, 0, 220, 0, 61, 0, 212, 0, 60, 0, 203,
+ 0, 59, 0, 192, 0, 57, 0, 179, 0, 55, 0, 161, 0, 52, 0, 139, 0, 47, 0, 114, 0, 42, 0, 91, 0, 42, 0, 79,
+ 0, 41, 0, 69, 0, 41, 0, 60, 0, 40, 0, 52, 0, 40, 0, 43, 0, 41, 0, 31, 0, 41, 0, 17, 0, 40, 0, 0,
+ 0, 6, 192, 235, 0, 4, 194, 233, 0, 3, 195, 226, 0, 3, 195, 209, 0, 4, 194, 189, 0, 4, 195, 168, 0, 4, 197, 145,
+ 0, 6, 198, 122, 0, 7, 200, 96, 0, 8, 202, 70, 0, 9, 204, 49, 0, 10, 206, 32, 0, 10, 207, 17, 0, 10, 209, 7,
+ 0, 11, 209, 3, 0, 31, 199, 0, 0, 49, 190, 0, 0, 6, 187, 235, 0, 2, 181, 222, 0, 1, 181, 208, 0, 1, 181, 190,
+ 0, 1, 183, 170, 0, 1, 184, 154, 0, 1, 185, 134, 0, 2, 190, 111, 0, 3, 190, 87, 0, 6, 190, 61, 0, 8, 189, 42,
+ 0, 9, 189, 26, 0, 11, 189, 13, 0, 13, 188, 4, 0, 19, 185, 1, 0, 35, 180, 0, 0, 45, 182, 0, 0, 6, 180, 236,
+ 0, 4, 173, 220, 0, 2, 170, 199, 0, 2, 171, 184, 0, 1, 173, 166, 0, 1, 174, 149, 0, 2, 175, 132, 0, 2, 181, 111,
+ 0, 3, 182, 86, 0, 6, 180, 60, 0, 9, 178, 40, 0, 11, 177, 23, 0, 12, 177, 8, 0, 17, 174, 1, 0, 26, 170, 0,
+ 0, 35, 168, 0, 0, 42, 173, 0, 0, 7, 169, 237, 0, 5, 163, 220, 0, 4, 161, 200, 0, 3, 160, 182, 0, 3, 161, 164,
+ 0, 3, 163, 148, 0, 3, 164, 131, 0, 3, 168, 112, 0, 4, 171, 89, 0, 7, 169, 63, 0, 9, 167, 41, 0, 10, 166, 22,
+ 0, 12, 166, 7, 0, 17, 163, 1, 0, 26, 158, 0, 0, 36, 156, 0, 0, 40, 162, 0, 0, 8, 155, 237, 0, 6, 152, 222,
+ 0, 6, 151, 202, 0, 5, 151, 185, 0, 4, 151, 164, 0, 4, 152, 147, 0, 5, 154, 130, 0, 5, 155, 113, 0, 5, 158, 91,
+ 0, 8, 156, 66, 0, 10, 154, 45, 0, 11, 154, 25, 0, 12, 154, 8, 0, 16, 152, 1, 0, 26, 146, 0, 0, 36, 144, 0,
+ 0, 39, 150, 0, 0, 9, 139, 235, 0, 8, 138, 222, 0, 8, 138, 203, 0, 8, 139, 187, 0, 7, 139, 168, 0, 8, 138, 153,
+ 0, 9, 137, 136, 0, 8, 140, 120, 0, 8, 143, 94, 0, 10, 143, 70, 0, 12, 142, 49, 0, 12, 142, 29, 0, 13, 142, 10,
+ 0, 17, 140, 1, 0, 28, 134, 0, 0, 37, 130, 0, 0, 37, 137, 0, 0, 12, 121, 231, 0, 11, 121, 217, 0, 11, 123, 202,
+ 0, 10, 125, 187, 0, 10, 127, 170, 0, 13, 126, 152, 0, 17, 122, 131, 0, 13, 125, 117, 0, 11, 130, 95, 0, 12, 130, 76,
+ 0, 13, 130, 54, 0, 14, 130, 34, 0, 15, 130, 14, 0, 18, 128, 1, 0, 29, 121, 0, 0, 38, 116, 0, 0, 36, 122, 0,
+ 0, 14, 103, 228, 0, 14, 105, 206, 0, 15, 106, 191, 0, 15, 108, 180, 0, 15, 111, 167, 0, 18, 113, 148, 0, 21, 111, 132,
+ 0, 19, 110, 115, 0, 17, 113, 100, 0, 15, 115, 85, 0, 15, 116, 60, 0, 16, 116, 39, 0, 16, 117, 18, 0, 18, 115, 2,
+ 0, 30, 108, 0, 0, 38, 102, 0, 0, 35, 105, 0, 0, 15, 86, 227, 0, 17, 90, 198, 0, 20, 92, 176, 0, 21, 93, 168,
+ 0, 21, 94, 159, 0, 21, 95, 146, 0, 22, 96, 131, 0, 23, 97, 115, 0, 23, 95, 97, 0, 19, 99, 85, 0, 17, 101, 64,
+ 0, 17, 102, 44, 0, 18, 102, 23, 0, 20, 101, 5, 0, 30, 95, 0, 0, 38, 89, 0, 0, 34, 88, 0, 0, 16, 71, 225,
+ 0, 17, 76, 202, 0, 19, 79, 187, 0, 20, 81, 170, 0, 23, 81, 155, 0, 23, 82, 144, 0, 24, 82, 129, 0, 25, 83, 113,
+ 0, 25, 83, 97, 0, 23, 83, 84, 0, 21, 85, 70, 0, 19, 87, 53, 0, 20, 88, 28, 0, 21, 87, 8, 0, 29, 82, 1,
+ 0, 38, 76, 0, 0, 33, 76, 0, 0, 17, 56, 222, 0, 19, 59, 210, 0, 20, 61, 200, 0, 20, 67, 176, 0, 24, 68, 151,
+ 0, 24, 69, 141, 0, 24, 70, 129, 0, 26, 71, 112, 0, 27, 71, 96, 0, 27, 70, 83, 0, 26, 69, 70, 0, 23, 72, 54,
+ 0, 22, 73, 34, 0, 23, 73, 14, 0, 29, 69, 2, 0, 37, 64, 0, 0, 33, 65, 0, 0, 19, 41, 220, 0, 21, 43, 210,
+ 0, 21, 45, 202, 0, 19, 51, 185, 0, 20, 54, 166, 0, 21, 56, 151, 0, 22, 57, 136, 0, 23, 58, 117, 0, 26, 57, 96,
+ 0, 28, 58, 83, 0, 28, 57, 69, 0, 31, 54, 56, 0, 27, 56, 42, 0, 26, 57, 28, 0, 30, 55, 10, 0, 35, 51, 1,
+ 0, 32, 52, 0, 0, 19, 28, 220, 0, 21, 29, 210, 0, 22, 30, 203, 0, 22, 32, 193, 0, 23, 34, 180, 0, 23, 38, 166,
+ 0, 23, 40, 147, 0, 22, 43, 124, 0, 25, 44, 98, 0, 27, 43, 84, 0, 28, 44, 71, 0, 30, 41, 55, 0, 29, 41, 45,
+ 0, 28, 42, 31, 0, 32, 40, 17, 0, 32, 39, 2, 0, 31, 39, 0, 0, 20, 17, 219, 0, 22, 17, 207, 0, 23, 17, 200,
+ 0, 24, 18, 191, 0, 24, 20, 180, 0, 24, 22, 167, 0, 24, 24, 151, 0, 20, 29, 133, 0, 23, 30, 112, 0, 24, 30, 95,
+ 0, 26, 29, 78, 0, 28, 28, 59, 0, 29, 27, 44, 0, 28, 28, 30, 0, 30, 27, 17, 0, 31, 26, 2, 0, 31, 25, 0,
+ 0, 19, 10, 219, 0, 23, 9, 209, 0, 25, 8, 202, 0, 26, 8, 194, 0, 26, 8, 184, 0, 26, 9, 171, 0, 26, 11, 155,
+ 0, 27, 12, 139, 0, 27, 12, 122, 0, 27, 13, 104, 0, 28, 13, 86, 0, 29, 14, 64, 0, 28, 15, 47, 0, 28, 15, 35,
+ 0, 27, 15, 24, 0, 31, 14, 2, 0, 32, 13, 0, 0, 31, 4, 219, 0, 32, 3, 210, 0, 32, 2, 203, 0, 32, 1, 196,
+ 0, 32, 1, 186, 0, 31, 2, 172, 0, 31, 2, 155, 0, 31, 3, 137, 0, 30, 3, 119, 0, 30, 4, 103, 0, 32, 4, 87,
+ 0, 33, 4, 70, 0, 31, 6, 53, 0, 31, 6, 39, 0, 34, 6, 25, 0, 33, 6, 9, 0, 31, 7, 0, 0, 42, 0, 218,
+ 0, 41, 0, 211, 0, 40, 0, 203, 0, 39, 0, 194, 0, 39, 0, 182, 0, 37, 0, 166, 0, 36, 0, 146, 0, 33, 0, 122,
+ 0, 30, 0, 99, 0, 30, 0, 85, 0, 30, 0, 74, 0, 30, 0, 63, 0, 29, 0, 54, 0, 29, 0, 45, 0, 30, 0, 35,
+ 0, 30, 0, 19, 0, 30, 0, 0, 0, 3, 190, 235, 0, 2, 191, 232, 0, 1, 192, 223, 0, 1, 191, 208, 0, 2, 191, 190,
+ 0, 2, 193, 172, 0, 2, 194, 151, 0, 2, 196, 130, 0, 2, 198, 107, 0, 4, 200, 81, 0, 4, 203, 58, 0, 4, 205, 39,
+ 0, 5, 207, 23, 0, 5, 208, 11, 0, 5, 210, 3, 0, 5, 210, 1, 0, 25, 199, 0, 0, 2, 185, 235, 0, 0, 179, 219,
+ 0, 0, 178, 206, 0, 0, 178, 190, 0, 0, 180, 173, 0, 0, 181, 156, 0, 0, 183, 140, 0, 0, 187, 118, 0, 0, 189, 96,
+ 0, 1, 190, 71, 0, 2, 190, 50, 0, 3, 191, 33, 0, 4, 191, 18, 0, 5, 192, 8, 0, 7, 191, 2, 0, 14, 188, 1,
+ 0, 20, 190, 0, 0, 2, 178, 235, 0, 1, 172, 218, 0, 0, 167, 196, 0, 0, 168, 182, 0, 0, 169, 165, 0, 0, 171, 151,
+ 0, 0, 172, 135, 0, 0, 177, 115, 0, 0, 180, 95, 0, 1, 180, 72, 0, 1, 180, 50, 0, 3, 179, 33, 0, 3, 179, 18,
+ 0, 4, 179, 7, 0, 7, 178, 2, 0, 14, 174, 1, 0, 17, 180, 0, 0, 3, 168, 235, 0, 1, 163, 219, 0, 0, 160, 197,
+ 0, 0, 159, 177, 0, 0, 159, 161, 0, 0, 161, 147, 0, 0, 162, 131, 0, 0, 165, 115, 0, 0, 169, 97, 0, 1, 169, 74,
+ 0, 1, 168, 51, 0, 1, 168, 32, 0, 2, 167, 17, 0, 3, 167, 6, 0, 7, 165, 2, 0, 16, 161, 1, 0, 15, 170, 0,
+ 0, 3, 155, 234, 0, 2, 153, 220, 0, 1, 151, 200, 0, 0, 150, 181, 0, 0, 150, 160, 0, 0, 150, 145, 0, 0, 152, 130,
+ 0, 0, 153, 115, 0, 0, 156, 97, 0, 1, 157, 76, 0, 1, 156, 54, 0, 1, 155, 33, 0, 1, 155, 16, 0, 2, 155, 4,
+ 0, 8, 152, 2, 0, 17, 148, 1, 0, 13, 157, 0, 0, 4, 140, 232, 0, 3, 139, 220, 0, 2, 139, 202, 0, 1, 139, 186,
+ 0, 0, 139, 165, 0, 1, 137, 151, 0, 1, 138, 136, 0, 1, 139, 121, 0, 1, 142, 98, 0, 1, 142, 79, 0, 1, 142, 58,
+ 0, 1, 142, 37, 0, 1, 143, 16, 0, 3, 144, 3, 0, 10, 139, 1, 0, 19, 135, 1, 0, 13, 144, 0, 0, 5, 123, 229,
+ 0, 4, 123, 218, 0, 3, 125, 203, 0, 2, 126, 188, 0, 1, 127, 170, 0, 2, 126, 153, 0, 2, 126, 134, 0, 1, 126, 118,
+ 0, 1, 128, 97, 0, 1, 129, 82, 0, 1, 129, 62, 0, 1, 130, 41, 0, 2, 130, 20, 0, 4, 131, 3, 0, 12, 125, 1,
+ 0, 21, 120, 1, 0, 13, 128, 0, 0, 6, 105, 227, 0, 5, 106, 210, 0, 5, 107, 197, 0, 5, 110, 185, 0, 4, 112, 170,
+ 0, 4, 113, 153, 0, 5, 114, 135, 0, 4, 112, 117, 0, 4, 112, 100, 0, 3, 113, 88, 0, 2, 115, 66, 0, 2, 116, 46,
+ 0, 3, 115, 24, 0, 5, 116, 6, 0, 13, 110, 1, 0, 21, 104, 1, 0, 14, 110, 0, 0, 7, 88, 225, 0, 7, 91, 204,
+ 0, 7, 93, 190, 0, 7, 95, 178, 0, 7, 97, 166, 0, 7, 98, 152, 0, 7, 99, 135, 0, 8, 99, 117, 0, 10, 95, 97,
+ 0, 6, 99, 85, 0, 4, 101, 67, 0, 4, 102, 50, 0, 4, 102, 29, 0, 6, 102, 9, 0, 14, 97, 2, 0, 22, 91, 1,
+ 0, 15, 92, 0, 0, 8, 73, 224, 0, 7, 78, 206, 0, 8, 79, 194, 0, 8, 82, 179, 0, 8, 85, 164, 0, 9, 85, 150,
+ 0, 10, 85, 134, 0, 11, 86, 116, 0, 13, 84, 97, 0, 10, 84, 84, 0, 8, 86, 71, 0, 6, 88, 57, 0, 6, 89, 34,
+ 0, 7, 88, 13, 0, 13, 84, 2, 0, 21, 79, 1, 0, 15, 80, 0, 0, 8, 58, 221, 0, 9, 62, 211, 0, 9, 64, 201,
+ 0, 8, 69, 182, 0, 9, 72, 162, 0, 11, 71, 145, 0, 12, 71, 129, 0, 14, 71, 112, 0, 15, 72, 97, 0, 15, 71, 82,
+ 0, 14, 70, 70, 0, 10, 74, 56, 0, 8, 76, 36, 0, 8, 76, 17, 0, 12, 73, 3, 0, 21, 67, 1, 0, 16, 68, 0,
+ 0, 9, 44, 219, 0, 11, 46, 211, 0, 11, 48, 202, 0, 8, 53, 187, 0, 8, 58, 169, 0, 9, 59, 151, 0, 11, 60, 135,
+ 0, 11, 60, 117, 0, 16, 59, 97, 0, 16, 60, 83, 0, 16, 58, 70, 0, 13, 59, 56, 0, 12, 61, 41, 0, 9, 62, 27,
+ 0, 12, 60, 6, 0, 20, 55, 1, 0, 16, 55, 0, 0, 9, 31, 218, 0, 11, 31, 210, 0, 12, 33, 203, 0, 11, 36, 193,
+ 0, 12, 39, 181, 0, 12, 42, 164, 0, 12, 44, 145, 0, 11, 47, 121, 0, 15, 46, 98, 0, 16, 45, 83, 0, 18, 46, 71,
+ 0, 18, 44, 55, 0, 20, 42, 41, 0, 16, 44, 30, 0, 16, 45, 14, 0, 17, 44, 2, 0, 15, 44, 0, 0, 9, 19, 217,
+ 0, 11, 19, 209, 0, 12, 20, 202, 0, 11, 22, 194, 0, 11, 24, 183, 0, 12, 26, 169, 0, 12, 29, 151, 0, 9, 33, 130,
+ 0, 12, 33, 107, 0, 13, 33, 88, 0, 16, 33, 73, 0, 17, 32, 58, 0, 20, 30, 42, 0, 16, 31, 30, 0, 13, 34, 18,
+ 0, 13, 34, 4, 0, 15, 32, 0, 0, 9, 11, 217, 0, 12, 10, 206, 0, 12, 10, 197, 0, 12, 11, 189, 0, 12, 12, 178,
+ 0, 12, 14, 166, 0, 12, 15, 151, 0, 12, 16, 137, 0, 13, 17, 119, 0, 11, 21, 99, 0, 13, 20, 81, 0, 14, 19, 63,
+ 0, 15, 19, 44, 0, 16, 18, 31, 0, 14, 21, 13, 0, 13, 21, 2, 0, 15, 19, 0, 0, 9, 5, 217, 0, 13, 3, 208,
+ 0, 13, 3, 200, 0, 13, 3, 192, 0, 13, 3, 183, 0, 13, 4, 170, 0, 13, 4, 156, 0, 14, 4, 141, 0, 13, 5, 124,
+ 0, 9, 9, 106, 0, 11, 8, 88, 0, 13, 7, 71, 0, 14, 7, 50, 0, 14, 7, 37, 0, 17, 5, 25, 0, 13, 7, 12,
+ 0, 16, 6, 0, 0, 21, 0, 217, 0, 20, 0, 211, 0, 18, 0, 204, 0, 18, 0, 197, 0, 17, 0, 187, 0, 17, 0, 174,
+ 0, 16, 0, 158, 0, 15, 0, 139, 0, 14, 0, 117, 0, 15, 0, 98, 0, 16, 0, 84, 0, 16, 0, 70, 0, 16, 0, 55,
+ 0, 16, 0, 44, 0, 17, 0, 33, 0, 15, 0, 17, 0, 15, 0, 0, 0, 0, 189, 235, 0, 0, 189, 229, 0, 0, 188, 219,
+ 0, 0, 188, 206, 0, 0, 188, 190, 0, 0, 190, 174, 0, 0, 191, 157, 0, 0, 193, 138, 0, 0, 195, 116, 0, 0, 198, 92,
+ 0, 0, 201, 68, 0, 0, 203, 48, 0, 0, 205, 31, 0, 0, 207, 17, 0, 0, 209, 7, 0, 0, 210, 1, 0, 0, 210, 0,
+ 0, 0, 183, 234, 0, 0, 179, 211, 0, 0, 178, 201, 0, 0, 179, 190, 0, 0, 180, 178, 0, 0, 181, 164, 0, 0, 182, 150,
+ 0, 0, 185, 131, 0, 0, 189, 112, 0, 0, 190, 88, 0, 0, 192, 65, 0, 0, 193, 48, 0, 0, 195, 34, 0, 0, 196, 21,
+ 0, 0, 197, 14, 0, 0, 198, 9, 0, 0, 199, 0, 0, 0, 176, 233, 0, 0, 173, 212, 0, 0, 169, 191, 0, 0, 169, 180,
+ 0, 0, 171, 167, 0, 0, 172, 156, 0, 0, 173, 143, 0, 0, 176, 127, 0, 0, 181, 108, 0, 0, 182, 86, 0, 0, 183, 64,
+ 0, 0, 184, 49, 0, 0, 184, 36, 0, 0, 185, 25, 0, 0, 186, 19, 0, 0, 186, 14, 0, 0, 187, 0, 0, 0, 166, 232,
+ 0, 0, 164, 213, 0, 0, 162, 193, 0, 0, 160, 173, 0, 0, 161, 160, 0, 0, 162, 149, 0, 0, 163, 138, 0, 0, 165, 123,
+ 0, 0, 170, 106, 0, 0, 172, 87, 0, 0, 172, 67, 0, 0, 172, 50, 0, 0, 172, 36, 0, 0, 173, 26, 0, 0, 173, 20,
+ 0, 0, 173, 15, 0, 0, 174, 0, 0, 0, 155, 231, 0, 0, 154, 213, 0, 0, 153, 195, 0, 0, 152, 177, 0, 0, 151, 156,
+ 0, 0, 152, 144, 0, 0, 153, 132, 0, 0, 154, 119, 0, 0, 157, 106, 0, 0, 159, 90, 0, 0, 159, 71, 0, 0, 159, 52,
+ 0, 0, 159, 35, 0, 0, 159, 25, 0, 0, 159, 19, 0, 0, 159, 15, 0, 0, 160, 0, 0, 0, 140, 229, 0, 0, 142, 214,
+ 0, 0, 142, 198, 0, 0, 142, 182, 0, 0, 141, 162, 0, 0, 140, 140, 0, 0, 141, 128, 0, 0, 141, 117, 0, 0, 142, 105,
+ 0, 0, 143, 92, 0, 0, 144, 75, 0, 0, 143, 56, 0, 0, 144, 37, 0, 0, 145, 24, 0, 0, 145, 17, 0, 0, 145, 14,
+ 0, 0, 147, 0, 0, 0, 124, 227, 0, 0, 126, 215, 0, 0, 128, 201, 0, 0, 129, 186, 0, 0, 130, 167, 0, 0, 129, 147,
+ 0, 0, 127, 125, 0, 0, 127, 113, 0, 0, 127, 102, 0, 0, 128, 92, 0, 0, 128, 77, 0, 0, 129, 60, 0, 0, 130, 41,
+ 0, 0, 130, 25, 0, 0, 130, 16, 0, 0, 130, 12, 0, 0, 131, 0, 0, 0, 106, 225, 0, 0, 109, 215, 0, 0, 111, 202,
+ 0, 0, 114, 189, 0, 0, 116, 170, 0, 0, 117, 152, 0, 0, 116, 130, 0, 0, 112, 111, 0, 0, 112, 100, 0, 0, 112, 90,
+ 0, 0, 112, 77, 0, 0, 113, 61, 0, 0, 113, 44, 0, 0, 113, 27, 0, 0, 113, 15, 0, 0, 112, 9, 0, 0, 113, 0,
+ 0, 0, 90, 223, 0, 0, 93, 213, 0, 0, 95, 202, 0, 0, 98, 190, 0, 0, 102, 172, 0, 0, 103, 155, 0, 0, 103, 135,
+ 0, 0, 100, 115, 0, 0, 96, 94, 0, 0, 96, 85, 0, 0, 97, 74, 0, 0, 97, 61, 0, 0, 97, 46, 0, 0, 97, 29,
+ 0, 0, 96, 16, 0, 0, 95, 8, 0, 0, 96, 0, 0, 0, 76, 222, 0, 0, 79, 212, 0, 0, 80, 202, 0, 0, 85, 189,
+ 0, 0, 89, 170, 0, 0, 89, 152, 0, 0, 87, 131, 0, 0, 84, 112, 0, 0, 85, 94, 0, 0, 85, 81, 0, 0, 84, 72,
+ 0, 0, 85, 62, 0, 0, 86, 46, 0, 0, 86, 31, 0, 0, 85, 17, 0, 0, 84, 8, 0, 0, 83, 0, 0, 0, 61, 220,
+ 0, 0, 64, 211, 0, 0, 66, 202, 0, 0, 71, 190, 0, 0, 75, 170, 0, 0, 76, 147, 0, 0, 70, 118, 0, 0, 69, 103,
+ 0, 0, 72, 94, 0, 0, 70, 78, 0, 0, 69, 65, 0, 0, 73, 59, 0, 0, 75, 46, 0, 0, 75, 32, 0, 0, 74, 18,
+ 0, 0, 72, 8, 0, 0, 71, 0, 0, 0, 46, 219, 0, 0, 48, 211, 0, 0, 50, 202, 0, 0, 54, 192, 0, 0, 60, 175,
+ 0, 0, 64, 152, 0, 0, 64, 132, 0, 0, 63, 110, 0, 0, 61, 93, 0, 0, 59, 78, 0, 0, 58, 65, 0, 0, 58, 55,
+ 0, 0, 61, 46, 0, 0, 62, 35, 0, 0, 62, 19, 0, 0, 60, 8, 0, 0, 59, 0, 0, 0, 33, 217, 0, 0, 34, 211,
+ 0, 0, 35, 204, 0, 0, 38, 195, 0, 0, 43, 181, 0, 0, 48, 162, 0, 0, 50, 141, 0, 0, 51, 117, 0, 0, 51, 96,
+ 0, 0, 49, 79, 0, 0, 47, 66, 0, 0, 44, 51, 0, 0, 42, 40, 0, 0, 48, 33, 0, 0, 49, 20, 0, 0, 49, 9,
+ 0, 0, 48, 0, 0, 0, 21, 217, 0, 0, 21, 211, 0, 0, 22, 205, 0, 0, 24, 196, 0, 0, 28, 185, 0, 0, 31, 170,
+ 0, 0, 34, 149, 0, 0, 37, 125, 0, 0, 38, 103, 0, 0, 38, 85, 0, 0, 35, 67, 0, 0, 34, 54, 0, 0, 31, 40,
+ 0, 0, 32, 31, 0, 0, 36, 24, 0, 0, 37, 14, 0, 0, 36, 0, 0, 0, 11, 216, 0, 0, 11, 211, 0, 0, 12, 204,
+ 0, 0, 13, 195, 0, 0, 16, 185, 0, 0, 18, 171, 0, 0, 21, 155, 0, 0, 23, 137, 0, 0, 24, 115, 0, 0, 26, 90,
+ 0, 0, 25, 74, 0, 0, 24, 58, 0, 0, 23, 43, 0, 0, 21, 32, 0, 0, 23, 25, 0, 0, 25, 15, 0, 0, 24, 0,
+ 0, 0, 4, 216, 0, 0, 5, 205, 0, 0, 7, 194, 0, 0, 8, 184, 0, 0, 9, 174, 0, 0, 11, 160, 0, 0, 12, 148,
+ 0, 0, 12, 136, 0, 0, 13, 116, 0, 0, 15, 90, 0, 0, 15, 76, 0, 0, 14, 64, 0, 0, 14, 50, 0, 0, 13, 37,
+ 0, 0, 12, 23, 0, 0, 12, 13, 0, 0, 12, 0, 0, 0, 0, 216, 0, 0, 0, 209, 0, 0, 0, 203, 0, 0, 0, 196,
+ 0, 0, 0, 186, 0, 0, 0, 174, 0, 0, 0, 160, 0, 0, 0, 146, 0, 0, 0, 130, 0, 0, 0, 112, 0, 0, 0, 93,
+ 0, 0, 0, 75, 0, 0, 0, 58, 0, 0, 0, 43, 0, 0, 0, 29, 0, 0, 0, 15, 0, 0, 0, 0
+};
+
+// Photo Best (Archie)
+unsigned char ucMapDJ4100_KCMY_Photo_BestA_12x12x1[] =
+{
+ 0, 228, 219, 240, 0, 229, 215, 224, 0, 229, 211, 207, 0, 234, 204, 190, 0, 239, 194, 171, 0, 244, 186, 154, 0, 246, 177, 135,
+ 0, 248, 165, 110, 0, 249, 153, 81, 0, 251, 141, 50, 0, 250, 131, 23, 0, 246, 126, 7, 0, 241, 126, 2, 0, 237, 128, 2,
+ 0, 232, 129, 2, 0, 228, 130, 1, 0, 224, 130, 0, 0, 221, 200, 240, 0, 234, 197, 218, 0, 237, 201, 198, 0, 237, 194, 177,
+ 0, 242, 188, 158, 0, 245, 182, 143, 0, 246, 173, 126, 0, 248, 163, 105, 0, 249, 152, 77, 0, 251, 141, 49, 0, 251, 130, 22,
+ 0, 247, 124, 4, 0, 238, 126, 0, 0, 231, 128, 0, 0, 225, 130, 0, 0, 221, 131, 0, 0, 218, 130, 0, 0, 214, 180, 239,
+ 0, 225, 178, 227, 0, 241, 175, 197, 0, 241, 178, 173, 0, 245, 173, 146, 0, 246, 169, 124, 0, 247, 163, 104, 0, 247, 155, 82,
+ 0, 248, 146, 58, 0, 249, 137, 34, 0, 247, 129, 13, 0, 240, 127, 3, 0, 230, 130, 2, 0, 224, 131, 1, 0, 218, 131, 1,
+ 0, 215, 130, 0, 0, 214, 128, 0, 0, 214, 157, 239, 0, 219, 155, 225, 0, 228, 156, 203, 0, 239, 155, 175, 0, 243, 154, 146,
+ 0, 241, 152, 119, 0, 240, 149, 95, 0, 236, 146, 75, 0, 233, 143, 53, 0, 231, 139, 33, 0, 227, 136, 18, 0, 221, 134, 10,
+ 0, 216, 133, 7, 0, 214, 131, 4, 0, 212, 129, 2, 0, 211, 127, 1, 0, 210, 124, 0, 0, 212, 132, 241, 0, 216, 129, 232,
+ 0, 219, 133, 209, 0, 224, 136, 184, 0, 233, 133, 153, 0, 231, 134, 125, 0, 229, 135, 99, 0, 222, 136, 79, 0, 218, 136, 60,
+ 0, 216, 134, 42, 0, 214, 132, 27, 0, 211, 130, 18, 0, 209, 128, 12, 0, 208, 126, 8, 0, 206, 124, 5, 0, 205, 121, 2,
+ 0, 204, 118, 0, 0, 211, 108, 243, 0, 216, 104, 237, 0, 216, 108, 216, 0, 218, 115, 193, 0, 221, 116, 165, 0, 224, 115, 132,
+ 0, 220, 119, 108, 0, 216, 121, 84, 0, 214, 122, 63, 0, 211, 122, 46, 0, 208, 122, 33, 0, 206, 120, 24, 0, 204, 119, 17,
+ 0, 202, 118, 12, 0, 200, 116, 7, 0, 199, 113, 3, 0, 197, 111, 0, 0, 211, 85, 245, 0, 216, 80, 241, 0, 216, 84, 224,
+ 0, 215, 91, 200, 0, 213, 99, 175, 0, 214, 101, 146, 0, 215, 100, 114, 0, 214, 102, 91, 0, 212, 103, 68, 0, 208, 106, 49,
+ 0, 205, 108, 35, 0, 201, 109, 26, 0, 199, 110, 21, 0, 197, 109, 15, 0, 194, 107, 10, 0, 192, 104, 5, 0, 190, 102, 0,
+ 0, 210, 62, 246, 0, 214, 57, 243, 0, 214, 62, 228, 0, 212, 70, 207, 0, 210, 78, 183, 0, 210, 82, 157, 0, 210, 84, 128,
+ 0, 210, 85, 97, 0, 210, 84, 75, 0, 207, 86, 54, 0, 202, 91, 39, 0, 198, 95, 28, 0, 194, 98, 21, 0, 191, 99, 16,
+ 0, 188, 97, 11, 0, 185, 95, 5, 0, 182, 92, 0, 0, 207, 39, 247, 0, 209, 37, 244, 0, 208, 42, 230, 0, 207, 51, 210,
+ 0, 205, 58, 188, 0, 204, 65, 165, 0, 204, 68, 140, 0, 205, 68, 110, 0, 206, 67, 78, 0, 204, 68, 59, 0, 200, 73, 43,
+ 0, 196, 79, 31, 0, 191, 84, 23, 0, 187, 86, 16, 0, 183, 86, 11, 0, 178, 85, 5, 0, 174, 82, 0, 0, 203, 21, 245,
+ 0, 204, 21, 240, 0, 203, 25, 228, 0, 201, 33, 210, 0, 200, 38, 191, 0, 198, 46, 170, 0, 198, 51, 148, 0, 198, 53, 123,
+ 0, 199, 52, 93, 0, 202, 49, 61, 0, 198, 55, 46, 0, 194, 62, 35, 0, 189, 68, 26, 0, 184, 73, 18, 0, 179, 75, 11,
+ 0, 173, 74, 5, 0, 167, 72, 0, 0, 198, 12, 240, 0, 197, 12, 234, 0, 196, 15, 224, 0, 194, 22, 209, 0, 194, 26, 192,
+ 0, 192, 31, 174, 0, 191, 36, 154, 0, 191, 39, 133, 0, 191, 40, 107, 0, 194, 39, 78, 0, 198, 37, 48, 0, 192, 45, 37,
+ 0, 188, 52, 28, 0, 183, 58, 20, 0, 177, 61, 13, 0, 170, 63, 6, 0, 163, 63, 0, 0, 195, 9, 237, 0, 194, 9, 232,
+ 0, 193, 11, 223, 0, 191, 16, 210, 0, 189, 18, 195, 0, 188, 21, 178, 0, 186, 25, 159, 0, 185, 28, 141, 0, 185, 31, 119,
+ 0, 187, 32, 94, 0, 189, 30, 67, 0, 193, 29, 39, 0, 188, 37, 30, 0, 182, 42, 21, 0, 176, 47, 13, 0, 169, 50, 6,
+ 0, 162, 53, 0, 0, 192, 7, 235, 0, 191, 7, 231, 0, 190, 9, 224, 0, 189, 12, 212, 0, 187, 14, 199, 0, 185, 15, 183,
+ 0, 183, 18, 166, 0, 182, 20, 148, 0, 181, 23, 130, 0, 181, 25, 108, 0, 183, 24, 83, 0, 185, 23, 57, 0, 187, 23, 31,
+ 0, 183, 29, 22, 0, 177, 33, 14, 0, 170, 37, 7, 0, 162, 40, 0, 0, 189, 5, 233, 0, 189, 5, 229, 0, 188, 6, 223,
+ 0, 186, 8, 214, 0, 185, 10, 202, 0, 183, 11, 188, 0, 182, 12, 172, 0, 180, 14, 155, 0, 178, 16, 138, 0, 178, 18, 118,
+ 0, 178, 18, 96, 0, 178, 17, 73, 0, 180, 17, 48, 0, 181, 17, 23, 0, 176, 21, 15, 0, 170, 24, 7, 0, 163, 27, 0,
+ 0, 187, 3, 230, 0, 186, 4, 228, 0, 185, 4, 223, 0, 184, 5, 215, 0, 183, 7, 204, 0, 181, 7, 192, 0, 180, 8, 177,
+ 0, 178, 9, 162, 0, 176, 10, 145, 0, 175, 11, 127, 0, 175, 12, 107, 0, 174, 11, 86, 0, 174, 11, 63, 0, 175, 11, 39,
+ 0, 175, 11, 15, 0, 169, 13, 7, 0, 163, 15, 0, 0, 184, 2, 228, 0, 184, 2, 226, 0, 183, 2, 222, 0, 182, 2, 215,
+ 0, 181, 4, 206, 0, 180, 4, 195, 0, 178, 4, 182, 0, 177, 4, 167, 0, 175, 5, 152, 0, 174, 5, 135, 0, 173, 6, 116,
+ 0, 172, 6, 97, 0, 171, 5, 76, 0, 170, 5, 54, 0, 169, 5, 31, 0, 168, 5, 6, 0, 162, 6, 0, 0, 181, 0, 226,
+ 0, 181, 0, 224, 0, 180, 0, 220, 0, 180, 0, 215, 0, 179, 0, 207, 0, 178, 0, 197, 0, 177, 0, 186, 0, 175, 0, 172,
+ 0, 174, 0, 158, 0, 173, 0, 142, 0, 172, 0, 125, 0, 170, 0, 107, 0, 169, 0, 88, 0, 167, 0, 68, 0, 166, 0, 46,
+ 0, 164, 0, 23, 0, 162, 0, 0, 0, 215, 215, 240, 0, 214, 226, 217, 0, 218, 218, 196, 0, 218, 217, 188, 0, 222, 209, 164,
+ 0, 223, 199, 124, 0, 225, 187, 96, 0, 227, 176, 74, 0, 231, 167, 49, 0, 233, 158, 27, 0, 230, 149, 11, 0, 224, 145, 3,
+ 0, 223, 142, 1, 0, 223, 140, 1, 0, 221, 137, 0, 0, 221, 135, 0, 0, 220, 134, 0, 0, 210, 198, 243, 0, 217, 205, 226,
+ 0, 225, 198, 189, 0, 234, 186, 161, 0, 239, 180, 142, 0, 241, 174, 123, 0, 243, 166, 103, 0, 246, 156, 79, 0, 247, 145, 56,
+ 0, 248, 135, 33, 0, 247, 126, 13, 0, 242, 121, 1, 0, 233, 125, 0, 0, 226, 127, 0, 0, 220, 128, 0, 0, 217, 129, 0,
+ 0, 215, 130, 0, 0, 208, 179, 241, 0, 217, 174, 236, 0, 224, 178, 203, 0, 229, 176, 168, 0, 238, 171, 135, 0, 245, 163, 110,
+ 0, 249, 154, 89, 0, 250, 145, 68, 0, 251, 136, 46, 0, 252, 126, 25, 0, 250, 119, 8, 0, 242, 119, 1, 0, 230, 124, 0,
+ 0, 220, 126, 0, 0, 215, 127, 0, 0, 213, 126, 0, 0, 211, 128, 0, 0, 207, 155, 242, 0, 213, 151, 236, 0, 217, 153, 211,
+ 0, 221, 160, 183, 0, 224, 157, 150, 0, 234, 150, 113, 0, 241, 143, 80, 0, 245, 135, 50, 0, 249, 126, 24, 0, 247, 119, 7,
+ 0, 239, 121, 2, 0, 227, 124, 1, 0, 218, 126, 1, 0, 213, 126, 0, 0, 211, 124, 0, 0, 209, 124, 0, 0, 207, 125, 0,
+ 0, 205, 132, 244, 0, 211, 127, 240, 0, 215, 126, 221, 0, 215, 136, 192, 0, 217, 139, 163, 0, 223, 136, 128, 0, 228, 133, 94,
+ 0, 232, 127, 63, 0, 235, 120, 34, 0, 236, 113, 10, 0, 226, 118, 3, 0, 216, 122, 1, 0, 211, 122, 1, 0, 208, 120, 1,
+ 0, 206, 119, 0, 0, 204, 118, 0, 0, 202, 119, 0, 0, 206, 108, 245, 0, 210, 104, 243, 0, 215, 101, 231, 0, 215, 109, 202,
+ 0, 215, 115, 174, 0, 216, 118, 143, 0, 216, 118, 112, 0, 217, 117, 81, 0, 218, 115, 52, 0, 220, 111, 27, 0, 218, 109, 9,
+ 0, 212, 111, 3, 0, 208, 111, 1, 0, 204, 111, 1, 0, 201, 111, 1, 0, 199, 110, 0, 0, 196, 111, 0, 0, 206, 86, 246,
+ 0, 209, 83, 245, 0, 214, 80, 235, 0, 213, 86, 211, 0, 212, 94, 184, 0, 212, 98, 155, 0, 212, 99, 126, 0, 213, 99, 97,
+ 0, 213, 98, 68, 0, 212, 98, 41, 0, 211, 98, 20, 0, 208, 98, 6, 0, 204, 99, 2, 0, 200, 100, 1, 0, 196, 101, 1,
+ 0, 193, 101, 0, 0, 189, 103, 0, 0, 205, 64, 247, 0, 207, 61, 246, 0, 211, 58, 239, 0, 209, 67, 217, 0, 208, 74, 192,
+ 0, 208, 79, 165, 0, 208, 81, 137, 0, 209, 81, 109, 0, 210, 81, 82, 0, 209, 80, 55, 0, 207, 83, 32, 0, 204, 85, 14,
+ 0, 200, 86, 4, 0, 195, 89, 1, 0, 190, 90, 1, 0, 187, 91, 0, 0, 182, 93, 0, 0, 203, 41, 247, 0, 204, 39, 247,
+ 0, 207, 36, 242, 0, 206, 44, 221, 0, 205, 52, 198, 0, 204, 60, 173, 0, 204, 63, 148, 0, 204, 64, 120, 0, 205, 64, 92,
+ 0, 205, 64, 67, 0, 203, 65, 44, 0, 200, 69, 25, 0, 196, 74, 10, 0, 190, 77, 3, 0, 185, 79, 1, 0, 179, 80, 0,
+ 0, 172, 82, 0, 0, 199, 21, 246, 0, 201, 20, 246, 0, 203, 18, 241, 0, 202, 25, 223, 0, 201, 32, 201, 0, 199, 39, 179,
+ 0, 199, 44, 156, 0, 199, 47, 131, 0, 200, 47, 103, 0, 201, 46, 76, 0, 201, 48, 54, 0, 198, 52, 34, 0, 193, 57, 18,
+ 0, 188, 63, 8, 0, 181, 68, 2, 0, 173, 70, 0, 0, 164, 71, 0, 0, 194, 12, 240, 0, 197, 5, 243, 0, 198, 6, 237,
+ 0, 197, 11, 222, 0, 195, 19, 203, 0, 194, 24, 183, 0, 193, 28, 162, 0, 193, 32, 140, 0, 193, 34, 114, 0, 194, 33, 88,
+ 0, 196, 31, 62, 0, 196, 35, 43, 0, 192, 40, 27, 0, 186, 47, 14, 0, 179, 53, 5, 0, 170, 58, 1, 0, 159, 63, 0,
+ 0, 191, 9, 237, 0, 191, 2, 235, 0, 191, 1, 230, 0, 191, 3, 219, 0, 190, 8, 203, 0, 188, 12, 186, 0, 187, 16, 166,
+ 0, 187, 19, 146, 0, 186, 22, 124, 0, 187, 23, 99, 0, 188, 22, 74, 0, 190, 21, 50, 0, 190, 26, 34, 0, 186, 31, 20,
+ 0, 179, 37, 9, 0, 170, 44, 3, 0, 157, 51, 0, 0, 189, 7, 235, 0, 185, 1, 228, 0, 185, 1, 223, 0, 185, 1, 214,
+ 0, 185, 2, 203, 0, 184, 5, 188, 0, 182, 7, 170, 0, 181, 10, 151, 0, 181, 12, 132, 0, 180, 14, 110, 0, 181, 14, 86,
+ 0, 182, 14, 62, 0, 184, 14, 39, 0, 183, 19, 25, 0, 179, 23, 14, 0, 171, 29, 5, 0, 158, 38, 0, 0, 187, 5, 233,
+ 0, 181, 1, 223, 0, 180, 1, 218, 0, 180, 1, 210, 0, 179, 1, 201, 0, 179, 1, 188, 0, 178, 2, 173, 0, 177, 4, 156,
+ 0, 176, 5, 138, 0, 175, 7, 118, 0, 175, 8, 97, 0, 175, 7, 74, 0, 176, 7, 51, 0, 176, 8, 29, 0, 174, 12, 17,
+ 0, 169, 16, 7, 0, 159, 25, 0, 0, 184, 3, 231, 0, 177, 1, 220, 0, 176, 0, 214, 0, 176, 0, 208, 0, 175, 1, 199,
+ 0, 174, 1, 188, 0, 174, 1, 175, 0, 173, 1, 159, 0, 172, 1, 143, 0, 170, 2, 125, 0, 170, 3, 105, 0, 169, 3, 85,
+ 0, 169, 3, 63, 0, 169, 3, 41, 0, 168, 3, 20, 0, 165, 7, 9, 0, 157, 14, 0, 0, 182, 2, 229, 0, 175, 0, 218,
+ 0, 173, 0, 212, 0, 173, 0, 207, 0, 172, 0, 199, 0, 171, 0, 189, 0, 170, 0, 176, 0, 169, 0, 162, 0, 168, 0, 147,
+ 0, 166, 1, 130, 0, 165, 1, 112, 0, 164, 1, 94, 0, 163, 1, 75, 0, 162, 1, 53, 0, 161, 1, 32, 0, 160, 1, 13,
+ 0, 155, 5, 0, 0, 180, 0, 226, 0, 175, 0, 215, 0, 175, 0, 213, 0, 174, 0, 208, 0, 173, 0, 200, 0, 172, 0, 191,
+ 0, 171, 0, 179, 0, 169, 0, 166, 0, 168, 0, 151, 0, 166, 0, 136, 0, 165, 0, 119, 0, 163, 0, 102, 0, 161, 0, 84,
+ 0, 160, 0, 65, 0, 158, 0, 43, 0, 157, 0, 22, 0, 155, 0, 0, 0, 201, 212, 240, 0, 198, 225, 232, 0, 199, 233, 194,
+ 0, 203, 226, 177, 0, 205, 218, 148, 0, 203, 211, 106, 0, 204, 200, 82, 0, 206, 188, 63, 0, 210, 178, 44, 0, 213, 169, 26,
+ 0, 213, 159, 13, 0, 212, 153, 5, 0, 213, 149, 3, 0, 214, 146, 3, 0, 215, 143, 2, 0, 215, 140, 1, 0, 215, 138, 0,
+ 0, 197, 194, 246, 0, 204, 219, 238, 0, 199, 218, 185, 0, 206, 207, 152, 0, 209, 198, 118, 0, 213, 187, 86, 0, 220, 177, 53,
+ 0, 228, 168, 22, 0, 230, 158, 11, 0, 227, 150, 5, 0, 222, 145, 2, 0, 218, 141, 0, 0, 215, 139, 0, 0, 213, 136, 0,
+ 0, 212, 134, 0, 0, 212, 133, 0, 0, 211, 134, 0, 0, 192, 176, 247, 0, 196, 177, 237, 0, 197, 181, 202, 0, 203, 176, 166,
+ 0, 213, 170, 132, 0, 227, 163, 99, 0, 237, 151, 66, 0, 243, 141, 39, 0, 245, 131, 20, 0, 244, 123, 5, 0, 237, 123, 1,
+ 0, 228, 126, 0, 0, 218, 128, 0, 0, 213, 127, 0, 0, 211, 126, 0, 0, 209, 125, 0, 0, 208, 127, 0, 0, 195, 154, 246,
+ 0, 199, 152, 241, 0, 200, 156, 213, 0, 202, 162, 184, 0, 205, 160, 150, 0, 212, 156, 115, 0, 218, 149, 81, 0, 228, 140, 49,
+ 0, 238, 129, 20, 0, 238, 122, 2, 0, 229, 124, 0, 0, 219, 125, 0, 0, 213, 125, 0, 0, 210, 123, 0, 0, 207, 122, 0,
+ 0, 205, 122, 0, 0, 204, 124, 0, 0, 196, 133, 247, 0, 201, 129, 244, 0, 202, 131, 225, 0, 202, 138, 194, 0, 203, 144, 166,
+ 0, 207, 142, 133, 0, 211, 138, 97, 0, 214, 134, 66, 0, 218, 129, 36, 0, 219, 124, 10, 0, 215, 123, 1, 0, 210, 123, 0,
+ 0, 207, 121, 0, 0, 204, 120, 0, 0, 202, 118, 0, 0, 200, 118, 0, 0, 199, 120, 0, 0, 198, 110, 247, 0, 202, 107, 246,
+ 0, 204, 106, 234, 0, 203, 113, 204, 0, 202, 121, 175, 0, 204, 123, 146, 0, 207, 121, 114, 0, 209, 120, 82, 0, 211, 118, 52,
+ 0, 212, 114, 25, 0, 212, 111, 4, 0, 207, 111, 0, 0, 203, 112, 0, 0, 200, 111, 0, 0, 197, 111, 0, 0, 195, 110, 0,
+ 0, 193, 112, 0, 0, 198, 88, 247, 0, 201, 85, 246, 0, 205, 84, 237, 0, 204, 90, 213, 0, 203, 96, 186, 0, 204, 100, 157,
+ 0, 205, 101, 128, 0, 206, 101, 98, 0, 207, 100, 68, 0, 207, 100, 41, 0, 207, 99, 17, 0, 205, 97, 2, 0, 200, 99, 0,
+ 0, 196, 100, 0, 0, 193, 101, 0, 0, 190, 101, 0, 0, 187, 103, 0, 0, 198, 66, 248, 0, 201, 64, 247, 0, 204, 61, 240,
+ 0, 203, 69, 219, 0, 202, 75, 194, 0, 202, 79, 167, 0, 203, 81, 139, 0, 204, 82, 111, 0, 204, 82, 84, 0, 203, 82, 56,
+ 0, 202, 84, 32, 0, 200, 84, 11, 0, 196, 85, 1, 0, 191, 88, 0, 0, 187, 90, 0, 0, 184, 91, 0, 0, 179, 93, 0,
+ 0, 197, 44, 248, 0, 199, 40, 248, 0, 202, 38, 243, 0, 202, 45, 223, 0, 201, 53, 200, 0, 199, 60, 175, 0, 199, 64, 150,
+ 0, 200, 65, 122, 0, 200, 65, 96, 0, 200, 65, 70, 0, 199, 66, 45, 0, 197, 68, 24, 0, 193, 72, 7, 0, 187, 75, 1,
+ 0, 181, 78, 0, 0, 176, 79, 0, 0, 169, 82, 0, 0, 193, 24, 247, 0, 196, 21, 247, 0, 199, 20, 242, 0, 199, 26, 226,
+ 0, 197, 34, 204, 0, 196, 39, 182, 0, 196, 45, 159, 0, 196, 47, 134, 0, 196, 48, 106, 0, 197, 48, 81, 0, 198, 47, 56,
+ 0, 195, 51, 35, 0, 191, 55, 16, 0, 185, 61, 4, 0, 177, 66, 0, 0, 168, 69, 0, 0, 160, 70, 0, 0, 189, 13, 241,
+ 0, 193, 5, 245, 0, 195, 7, 239, 0, 194, 11, 225, 0, 193, 20, 206, 0, 192, 24, 186, 0, 191, 28, 165, 0, 191, 32, 142,
+ 0, 191, 34, 117, 0, 192, 34, 91, 0, 193, 32, 66, 0, 194, 33, 45, 0, 191, 37, 26, 0, 184, 44, 11, 0, 176, 50, 2,
+ 0, 165, 56, 0, 0, 155, 61, 0, 0, 187, 10, 238, 0, 187, 1, 236, 0, 188, 0, 231, 0, 189, 2, 222, 0, 188, 7, 206,
+ 0, 187, 11, 188, 0, 186, 15, 169, 0, 185, 18, 148, 0, 185, 20, 126, 0, 185, 21, 101, 0, 186, 21, 77, 0, 187, 20, 53,
+ 0, 188, 23, 35, 0, 185, 28, 19, 0, 177, 34, 7, 0, 166, 41, 1, 0, 152, 50, 0, 0, 185, 7, 236, 0, 181, 1, 228,
+ 0, 180, 0, 220, 0, 181, 0, 212, 0, 181, 1, 202, 0, 181, 2, 188, 0, 180, 5, 171, 0, 180, 7, 153, 0, 179, 9, 133,
+ 0, 178, 11, 111, 0, 178, 11, 87, 0, 179, 11, 64, 0, 180, 11, 41, 0, 179, 15, 25, 0, 175, 19, 13, 0, 168, 25, 3,
+ 0, 152, 37, 0, 0, 183, 5, 233, 0, 177, 0, 222, 0, 174, 0, 212, 0, 174, 0, 205, 0, 174, 0, 197, 0, 174, 0, 185,
+ 0, 174, 0, 171, 0, 173, 1, 155, 0, 173, 2, 137, 0, 172, 3, 117, 0, 171, 4, 96, 0, 171, 4, 74, 0, 172, 4, 52,
+ 0, 172, 4, 30, 0, 169, 8, 17, 0, 165, 12, 6, 0, 153, 24, 0, 0, 182, 3, 231, 0, 173, 0, 218, 0, 169, 0, 206,
+ 0, 168, 0, 200, 0, 168, 0, 192, 0, 167, 0, 182, 0, 167, 0, 169, 0, 166, 0, 155, 0, 165, 0, 138, 0, 164, 0, 121,
+ 0, 163, 0, 103, 0, 163, 0, 84, 0, 163, 0, 63, 0, 162, 0, 41, 0, 161, 1, 22, 0, 159, 4, 9, 0, 151, 13, 0,
+ 0, 180, 2, 229, 0, 171, 0, 215, 0, 165, 0, 202, 0, 164, 0, 195, 0, 163, 0, 188, 0, 162, 0, 179, 0, 161, 0, 167,
+ 0, 160, 0, 154, 0, 159, 0, 139, 0, 157, 0, 124, 0, 156, 0, 107, 0, 155, 0, 90, 0, 154, 0, 72, 0, 154, 0, 52,
+ 0, 153, 0, 32, 0, 151, 1, 14, 0, 148, 5, 0, 0, 177, 0, 227, 0, 173, 0, 216, 0, 167, 0, 203, 0, 167, 0, 198,
+ 0, 166, 0, 192, 0, 165, 0, 183, 0, 164, 0, 172, 0, 163, 0, 159, 0, 161, 0, 145, 0, 159, 0, 130, 0, 157, 0, 113,
+ 0, 155, 0, 97, 0, 154, 0, 80, 0, 152, 0, 61, 0, 151, 0, 40, 0, 149, 0, 20, 0, 147, 0, 0, 0, 185, 211, 239,
+ 0, 178, 224, 219, 0, 177, 239, 188, 0, 178, 240, 155, 0, 178, 229, 123, 0, 180, 219, 91, 0, 185, 207, 72, 0, 189, 196, 55,
+ 0, 194, 185, 40, 0, 197, 176, 25, 0, 199, 167, 13, 0, 201, 160, 7, 0, 204, 155, 5, 0, 207, 151, 4, 0, 208, 147, 2,
+ 0, 210, 144, 1, 0, 210, 141, 0, 0, 184, 193, 245, 0, 181, 207, 230, 0, 178, 216, 196, 0, 178, 222, 156, 0, 183, 212, 112,
+ 0, 189, 202, 78, 0, 193, 194, 44, 0, 198, 184, 14, 0, 202, 173, 4, 0, 204, 164, 2, 0, 204, 156, 1, 0, 204, 150, 1,
+ 0, 204, 145, 0, 0, 205, 141, 0, 0, 206, 139, 0, 0, 207, 137, 0, 0, 207, 137, 0, 0, 180, 177, 247, 0, 182, 183, 235,
+ 0, 181, 184, 204, 0, 180, 191, 171, 0, 187, 187, 130, 0, 193, 181, 93, 0, 198, 172, 58, 0, 203, 164, 24, 0, 206, 153, 5,
+ 0, 208, 145, 0, 0, 207, 142, 0, 0, 206, 140, 0, 0, 204, 137, 0, 0, 203, 134, 0, 0, 203, 132, 0, 0, 203, 130, 0,
+ 0, 203, 132, 0, 0, 176, 158, 252, 0, 179, 159, 240, 0, 183, 163, 214, 0, 182, 162, 184, 0, 188, 160, 148, 0, 195, 156, 114,
+ 0, 202, 150, 81, 0, 208, 144, 47, 0, 213, 136, 19, 0, 216, 130, 2, 0, 212, 128, 0, 0, 209, 127, 0, 0, 206, 125, 0,
+ 0, 204, 123, 0, 0, 201, 121, 0, 0, 200, 120, 0, 0, 200, 122, 0, 0, 180, 135, 250, 0, 186, 134, 246, 0, 187, 139, 223,
+ 0, 187, 142, 194, 0, 189, 146, 165, 0, 193, 145, 133, 0, 198, 141, 98, 0, 202, 136, 65, 0, 206, 132, 35, 0, 209, 126, 10,
+ 0, 208, 123, 1, 0, 205, 121, 0, 0, 203, 119, 0, 0, 200, 118, 0, 0, 197, 116, 0, 0, 196, 116, 0, 0, 194, 119, 0,
+ 0, 186, 112, 249, 0, 190, 110, 248, 0, 191, 112, 233, 0, 190, 120, 205, 0, 190, 125, 176, 0, 191, 129, 148, 0, 196, 128, 117,
+ 0, 199, 124, 82, 0, 202, 121, 52, 0, 203, 118, 24, 0, 203, 114, 3, 0, 200, 114, 0, 0, 196, 113, 0, 0, 194, 112, 0,
+ 0, 191, 111, 0, 0, 190, 111, 0, 0, 189, 113, 0, 0, 187, 91, 249, 0, 190, 88, 248, 0, 193, 88, 239, 0, 193, 95, 214,
+ 0, 192, 100, 187, 0, 191, 106, 158, 0, 193, 108, 130, 0, 196, 106, 99, 0, 198, 105, 68, 0, 199, 104, 39, 0, 200, 101, 15,
+ 0, 198, 100, 2, 0, 194, 101, 0, 0, 190, 102, 0, 0, 187, 102, 0, 0, 185, 102, 0, 0, 182, 105, 0, 0, 188, 70, 249,
+ 0, 192, 66, 248, 0, 195, 65, 240, 0, 194, 72, 219, 0, 193, 77, 195, 0, 193, 82, 168, 0, 194, 85, 141, 0, 195, 86, 113,
+ 0, 195, 86, 85, 0, 195, 87, 56, 0, 195, 87, 30, 0, 194, 85, 8, 0, 190, 87, 1, 0, 186, 89, 0, 0, 182, 90, 0,
+ 0, 179, 91, 0, 0, 175, 94, 0, 0, 188, 48, 249, 0, 191, 44, 248, 0, 194, 43, 242, 0, 194, 50, 223, 0, 193, 57, 200,
+ 0, 191, 62, 176, 0, 192, 66, 150, 0, 193, 68, 124, 0, 193, 68, 98, 0, 193, 68, 71, 0, 192, 69, 45, 0, 190, 71, 21,
+ 0, 187, 73, 4, 0, 181, 75, 0, 0, 175, 78, 0, 0, 170, 79, 0, 0, 165, 82, 0, 0, 186, 27, 247, 0, 190, 23, 247,
+ 0, 192, 24, 241, 0, 192, 31, 225, 0, 192, 38, 205, 0, 191, 42, 183, 0, 190, 47, 159, 0, 190, 50, 134, 0, 190, 51, 108,
+ 0, 191, 50, 83, 0, 191, 49, 57, 0, 189, 53, 34, 0, 185, 56, 14, 0, 179, 61, 2, 0, 170, 66, 0, 0, 162, 68, 0,
+ 0, 155, 70, 0, 0, 182, 15, 242, 0, 188, 8, 245, 0, 189, 10, 238, 0, 189, 14, 225, 0, 188, 22, 207, 0, 188, 25, 187,
+ 0, 187, 30, 166, 0, 187, 33, 144, 0, 186, 35, 119, 0, 187, 35, 93, 0, 188, 34, 68, 0, 189, 34, 45, 0, 186, 38, 25,
+ 0, 179, 43, 9, 0, 170, 49, 1, 0, 159, 56, 0, 0, 149, 61, 0, 0, 181, 11, 239, 0, 183, 1, 237, 0, 184, 1, 232,
+ 0, 185, 3, 222, 0, 184, 9, 207, 0, 183, 12, 190, 0, 183, 15, 171, 0, 182, 18, 150, 0, 182, 20, 128, 0, 182, 21, 103,
+ 0, 182, 21, 79, 0, 183, 20, 55, 0, 184, 23, 35, 0, 180, 26, 18, 0, 172, 32, 5, 0, 159, 40, 0, 0, 146, 49, 0,
+ 0, 180, 8, 236, 0, 177, 1, 228, 0, 176, 0, 220, 0, 177, 0, 212, 0, 177, 1, 202, 0, 177, 2, 189, 0, 177, 5, 172,
+ 0, 176, 7, 154, 0, 176, 8, 134, 0, 175, 10, 111, 0, 175, 10, 88, 0, 175, 10, 65, 0, 176, 10, 42, 0, 174, 13, 25,
+ 0, 171, 17, 11, 0, 162, 23, 2, 0, 146, 36, 0, 0, 179, 6, 234, 0, 173, 0, 222, 0, 170, 0, 212, 0, 168, 0, 201,
+ 0, 167, 0, 193, 0, 168, 0, 182, 0, 168, 0, 169, 0, 168, 1, 154, 0, 168, 1, 137, 0, 168, 1, 117, 0, 167, 2, 96,
+ 0, 167, 2, 74, 0, 167, 2, 52, 0, 166, 2, 31, 0, 164, 5, 16, 0, 160, 10, 5, 0, 146, 23, 0, 0, 178, 4, 232,
+ 0, 169, 0, 217, 0, 164, 0, 205, 0, 160, 0, 192, 0, 159, 0, 184, 0, 159, 0, 174, 0, 159, 0, 163, 0, 158, 0, 149,
+ 0, 157, 0, 134, 0, 156, 0, 117, 0, 156, 0, 100, 0, 155, 0, 82, 0, 155, 0, 62, 0, 155, 0, 41, 0, 153, 0, 23,
+ 0, 152, 3, 9, 0, 144, 12, 0, 0, 176, 2, 229, 0, 167, 0, 215, 0, 160, 0, 200, 0, 155, 0, 186, 0, 154, 0, 178,
+ 0, 153, 0, 170, 0, 152, 0, 159, 0, 151, 0, 147, 0, 150, 0, 133, 0, 148, 0, 118, 0, 147, 0, 102, 0, 146, 0, 87,
+ 0, 145, 0, 70, 0, 145, 0, 50, 0, 143, 0, 32, 0, 142, 1, 15, 0, 140, 5, 0, 0, 175, 0, 227, 0, 170, 0, 216,
+ 0, 164, 0, 203, 0, 159, 0, 189, 0, 159, 0, 183, 0, 158, 0, 175, 0, 157, 0, 164, 0, 155, 0, 152, 0, 154, 0, 139,
+ 0, 151, 0, 124, 0, 149, 0, 108, 0, 147, 0, 93, 0, 146, 0, 76, 0, 144, 0, 58, 0, 143, 0, 38, 0, 140, 0, 19,
+ 0, 138, 0, 0, 0, 164, 213, 238, 0, 155, 229, 214, 0, 151, 244, 184, 0, 150, 252, 144, 0, 148, 242, 111, 0, 151, 230, 79,
+ 0, 161, 215, 59, 0, 169, 202, 44, 0, 177, 191, 34, 0, 182, 182, 21, 0, 185, 174, 11, 0, 189, 167, 7, 0, 193, 161, 6,
+ 0, 197, 157, 5, 0, 200, 153, 3, 0, 202, 149, 2, 0, 203, 145, 0, 0, 164, 195, 245, 0, 159, 203, 228, 0, 159, 213, 199,
+ 0, 157, 226, 163, 0, 157, 222, 112, 0, 163, 212, 75, 0, 170, 202, 41, 0, 175, 192, 11, 0, 181, 180, 3, 0, 186, 171, 2,
+ 0, 189, 163, 1, 0, 191, 156, 1, 0, 193, 151, 1, 0, 195, 147, 0, 0, 197, 143, 0, 0, 199, 141, 0, 0, 200, 141, 0,
+ 0, 165, 180, 244, 0, 165, 182, 238, 0, 168, 185, 204, 0, 163, 192, 177, 0, 163, 195, 133, 0, 168, 192, 94, 0, 173, 187, 56,
+ 0, 178, 180, 20, 0, 182, 170, 2, 0, 186, 162, 0, 0, 188, 156, 0, 0, 190, 150, 0, 0, 191, 144, 0, 0, 192, 140, 0,
+ 0, 193, 137, 0, 0, 195, 135, 0, 0, 195, 136, 0, 0, 162, 162, 248, 0, 164, 163, 236, 0, 168, 167, 210, 0, 165, 166, 185,
+ 0, 166, 172, 150, 0, 170, 170, 112, 0, 176, 165, 76, 0, 182, 160, 41, 0, 185, 153, 10, 0, 188, 146, 1, 0, 190, 141, 0,
+ 0, 191, 136, 0, 0, 191, 132, 0, 0, 190, 129, 0, 0, 190, 126, 0, 0, 190, 125, 0, 0, 191, 127, 0, 0, 157, 139, 254,
+ 0, 165, 138, 244, 0, 167, 144, 218, 0, 167, 145, 194, 0, 168, 147, 168, 0, 174, 146, 132, 0, 182, 141, 96, 0, 189, 136, 63,
+ 0, 195, 132, 31, 0, 198, 125, 7, 0, 198, 121, 0, 0, 197, 119, 0, 0, 194, 118, 0, 0, 192, 116, 0, 0, 190, 115, 0,
+ 0, 189, 114, 0, 0, 189, 116, 0, 0, 166, 116, 252, 0, 170, 114, 249, 0, 172, 119, 230, 0, 172, 126, 203, 0, 174, 129, 177,
+ 0, 177, 133, 148, 0, 181, 132, 117, 0, 186, 127, 82, 0, 190, 125, 49, 0, 193, 120, 20, 0, 195, 115, 3, 0, 193, 114, 0,
+ 0, 190, 112, 0, 0, 188, 111, 0, 0, 186, 110, 0, 0, 184, 109, 0, 0, 183, 112, 0, 0, 170, 95, 251, 0, 176, 91, 250,
+ 0, 177, 93, 238, 0, 178, 102, 212, 0, 178, 106, 188, 0, 178, 111, 160, 0, 179, 115, 132, 0, 184, 114, 102, 0, 187, 111, 68,
+ 0, 189, 108, 38, 0, 191, 104, 13, 0, 188, 103, 1, 0, 185, 104, 0, 0, 182, 104, 0, 0, 178, 103, 0, 0, 176, 102, 0,
+ 0, 175, 105, 0, 0, 173, 74, 250, 0, 178, 70, 249, 0, 181, 71, 241, 0, 181, 78, 219, 0, 180, 83, 196, 0, 180, 86, 169,
+ 0, 179, 91, 142, 0, 181, 94, 115, 0, 183, 91, 84, 0, 186, 91, 55, 0, 187, 90, 28, 0, 186, 88, 6, 0, 182, 89, 0,
+ 0, 177, 91, 0, 0, 173, 91, 0, 0, 169, 91, 0, 0, 167, 94, 0, 0, 175, 52, 249, 0, 180, 48, 248, 0, 183, 49, 241,
+ 0, 183, 56, 223, 0, 181, 63, 201, 0, 181, 65, 177, 0, 182, 69, 151, 0, 182, 72, 124, 0, 183, 72, 98, 0, 183, 72, 71,
+ 0, 183, 73, 43, 0, 182, 74, 19, 0, 179, 74, 3, 0, 173, 76, 0, 0, 167, 78, 0, 0, 162, 79, 0, 0, 158, 83, 0,
+ 0, 175, 32, 248, 0, 180, 27, 247, 0, 182, 30, 240, 0, 183, 37, 224, 0, 183, 43, 204, 0, 182, 45, 183, 0, 181, 50, 160,
+ 0, 182, 53, 134, 0, 182, 55, 109, 0, 182, 54, 83, 0, 182, 55, 58, 0, 180, 56, 33, 0, 176, 58, 13, 0, 170, 62, 2,
+ 0, 161, 66, 0, 0, 155, 67, 0, 0, 149, 70, 0, 0, 173, 18, 243, 0, 179, 12, 244, 0, 180, 15, 237, 0, 181, 19, 224,
+ 0, 181, 25, 207, 0, 181, 29, 188, 0, 180, 33, 167, 0, 180, 36, 144, 0, 180, 38, 119, 0, 180, 38, 94, 0, 181, 37, 70,
+ 0, 181, 38, 46, 0, 177, 40, 25, 0, 171, 44, 7, 0, 161, 50, 1, 0, 151, 55, 0, 0, 143, 59, 0, 0, 173, 12, 239,
+ 0, 176, 3, 238, 0, 177, 3, 232, 0, 177, 6, 222, 0, 177, 11, 206, 0, 177, 14, 190, 0, 177, 18, 171, 0, 176, 20, 151,
+ 0, 176, 22, 128, 0, 175, 23, 104, 0, 175, 22, 79, 0, 176, 22, 56, 0, 177, 24, 35, 0, 173, 27, 17, 0, 164, 31, 3,
+ 0, 151, 40, 0, 0, 140, 48, 0, 0, 174, 9, 237, 0, 172, 1, 229, 0, 171, 0, 222, 0, 171, 0, 214, 0, 172, 1, 203,
+ 0, 172, 3, 189, 0, 171, 6, 172, 0, 171, 8, 154, 0, 170, 9, 134, 0, 169, 10, 112, 0, 169, 11, 89, 0, 169, 10, 66,
+ 0, 170, 10, 43, 0, 169, 12, 25, 0, 165, 16, 10, 0, 154, 23, 1, 0, 139, 35, 0, 0, 174, 6, 234, 0, 168, 1, 222,
+ 0, 165, 0, 212, 0, 162, 0, 201, 0, 161, 0, 190, 0, 161, 0, 179, 0, 161, 0, 167, 0, 162, 1, 152, 0, 162, 1, 135,
+ 0, 162, 1, 116, 0, 161, 1, 96, 0, 161, 1, 74, 0, 161, 1, 52, 0, 160, 1, 31, 0, 158, 4, 16, 0, 154, 9, 4,
+ 0, 139, 22, 0, 0, 173, 4, 232, 0, 165, 0, 217, 0, 160, 0, 204, 0, 155, 0, 191, 0, 151, 0, 177, 0, 151, 0, 168,
+ 0, 150, 0, 157, 0, 150, 0, 145, 0, 150, 0, 131, 0, 149, 0, 115, 0, 148, 0, 98, 0, 147, 0, 80, 0, 147, 0, 61,
+ 0, 147, 0, 41, 0, 145, 0, 23, 0, 144, 2, 10, 0, 136, 12, 0, 0, 172, 2, 230, 0, 163, 0, 214, 0, 156, 0, 200,
+ 0, 150, 0, 184, 0, 145, 0, 170, 0, 144, 0, 161, 0, 143, 0, 151, 0, 142, 0, 140, 0, 141, 0, 127, 0, 139, 0, 113,
+ 0, 138, 0, 99, 0, 137, 0, 83, 0, 136, 0, 67, 0, 135, 0, 49, 0, 134, 0, 32, 0, 133, 1, 16, 0, 132, 5, 0,
+ 0, 171, 0, 228, 0, 166, 0, 216, 0, 160, 0, 203, 0, 155, 0, 189, 0, 149, 0, 174, 0, 149, 0, 166, 0, 148, 0, 157,
+ 0, 147, 0, 145, 0, 145, 0, 132, 0, 143, 0, 119, 0, 141, 0, 104, 0, 138, 0, 89, 0, 137, 0, 73, 0, 135, 0, 55,
+ 0, 134, 0, 35, 0, 131, 0, 17, 0, 129, 0, 0, 0, 137, 213, 240, 0, 125, 230, 212, 0, 121, 243, 183, 0, 121, 251, 140,
+ 0, 121, 245, 101, 0, 121, 239, 70, 0, 130, 224, 44, 0, 143, 210, 27, 0, 156, 198, 23, 0, 165, 189, 15, 0, 171, 180, 9,
+ 0, 177, 173, 6, 0, 181, 168, 6, 0, 185, 163, 5, 0, 189, 158, 4, 0, 192, 155, 2, 0, 194, 151, 0, 0, 143, 193, 246,
+ 0, 135, 202, 231, 0, 133, 214, 201, 0, 133, 224, 168, 0, 133, 224, 118, 0, 135, 218, 77, 0, 141, 210, 37, 0, 151, 199, 7,
+ 0, 161, 187, 2, 0, 168, 177, 1, 0, 173, 169, 1, 0, 176, 162, 1, 0, 180, 156, 1, 0, 183, 152, 1, 0, 186, 149, 0,
+ 0, 188, 146, 0, 0, 190, 146, 0, 0, 148, 179, 245, 0, 142, 183, 242, 0, 147, 188, 205, 0, 144, 193, 182, 0, 142, 199, 142,
+ 0, 143, 197, 101, 0, 149, 194, 57, 0, 156, 188, 20, 0, 163, 178, 2, 0, 168, 169, 0, 0, 172, 161, 0, 0, 175, 155, 0,
+ 0, 177, 149, 0, 0, 180, 145, 0, 0, 182, 142, 0, 0, 184, 139, 0, 0, 186, 140, 0, 0, 146, 160, 246, 0, 145, 164, 237,
+ 0, 150, 170, 213, 0, 149, 170, 187, 0, 146, 177, 159, 0, 144, 179, 123, 0, 152, 175, 79, 0, 159, 171, 42, 0, 163, 165, 9,
+ 0, 167, 158, 0, 0, 170, 151, 0, 0, 173, 146, 0, 0, 175, 141, 0, 0, 177, 137, 0, 0, 178, 133, 0, 0, 179, 131, 0,
+ 0, 181, 133, 0, 0, 143, 141, 244, 0, 144, 141, 237, 0, 149, 147, 214, 0, 151, 150, 190, 0, 150, 154, 169, 0, 149, 157, 137,
+ 0, 156, 152, 95, 0, 161, 150, 60, 0, 166, 146, 26, 0, 170, 140, 4, 0, 173, 135, 0, 0, 174, 131, 0, 0, 175, 127, 0,
+ 0, 175, 124, 0, 0, 175, 121, 0, 0, 175, 119, 0, 0, 177, 122, 0, 0, 139, 120, 254, 0, 143, 120, 249, 0, 146, 125, 225,
+ 0, 148, 130, 198, 0, 150, 132, 176, 0, 153, 132, 152, 0, 159, 130, 114, 0, 166, 126, 79, 0, 175, 124, 47, 0, 181, 118, 18,
+ 0, 183, 113, 2, 0, 182, 111, 0, 0, 181, 109, 0, 0, 179, 108, 0, 0, 176, 106, 0, 0, 174, 106, 0, 0, 175, 107, 0,
+ 0, 148, 98, 253, 0, 153, 96, 252, 0, 155, 99, 240, 0, 156, 108, 210, 0, 157, 112, 186, 0, 159, 114, 161, 0, 161, 117, 132,
+ 0, 165, 115, 100, 0, 170, 113, 67, 0, 175, 111, 35, 0, 178, 108, 9, 0, 177, 105, 0, 0, 174, 103, 0, 0, 172, 102, 0,
+ 0, 168, 100, 0, 0, 166, 99, 0, 0, 166, 102, 0, 0, 154, 78, 252, 0, 159, 75, 251, 0, 162, 76, 242, 0, 163, 83, 220,
+ 0, 164, 89, 196, 0, 163, 91, 171, 0, 162, 94, 142, 0, 163, 99, 116, 0, 167, 97, 86, 0, 172, 96, 54, 0, 173, 94, 25,
+ 0, 174, 91, 4, 0, 169, 91, 0, 0, 164, 91, 0, 0, 160, 91, 0, 0, 158, 90, 0, 0, 157, 93, 0, 0, 158, 57, 250,
+ 0, 164, 53, 249, 0, 166, 55, 242, 0, 167, 62, 223, 0, 167, 68, 202, 0, 168, 70, 179, 0, 168, 72, 152, 0, 166, 77, 125,
+ 0, 166, 76, 98, 0, 169, 75, 69, 0, 169, 77, 42, 0, 170, 76, 17, 0, 168, 75, 2, 0, 161, 77, 0, 0, 155, 78, 0,
+ 0, 152, 79, 0, 0, 150, 81, 0, 0, 161, 37, 249, 0, 167, 33, 248, 0, 169, 36, 239, 0, 169, 43, 224, 0, 170, 48, 203,
+ 0, 169, 51, 183, 0, 170, 54, 160, 0, 170, 57, 135, 0, 170, 58, 109, 0, 169, 57, 82, 0, 169, 59, 56, 0, 167, 60, 31,
+ 0, 164, 61, 11, 0, 159, 64, 1, 0, 151, 65, 0, 0, 146, 66, 0, 0, 143, 69, 0, 0, 161, 21, 245, 0, 168, 16, 244,
+ 0, 169, 20, 236, 0, 170, 25, 223, 0, 170, 31, 206, 0, 170, 33, 187, 0, 169, 36, 165, 0, 169, 39, 143, 0, 169, 41, 118,
+ 0, 168, 41, 93, 0, 168, 41, 69, 0, 167, 43, 45, 0, 164, 43, 23, 0, 159, 46, 5, 0, 150, 51, 0, 0, 142, 55, 0,
+ 0, 137, 58, 0, 0, 163, 14, 241, 0, 167, 6, 238, 0, 168, 7, 232, 0, 168, 10, 221, 0, 168, 15, 206, 0, 168, 18, 189,
+ 0, 167, 21, 170, 0, 167, 23, 150, 0, 166, 25, 127, 0, 166, 25, 103, 0, 165, 25, 79, 0, 165, 25, 56, 0, 166, 27, 35,
+ 0, 162, 29, 16, 0, 154, 33, 2, 0, 141, 40, 0, 0, 133, 46, 0, 0, 165, 10, 238, 0, 165, 1, 231, 0, 164, 1, 224,
+ 0, 164, 1, 215, 0, 164, 3, 203, 0, 163, 4, 188, 0, 163, 7, 171, 0, 163, 9, 153, 0, 163, 10, 133, 0, 162, 11, 111,
+ 0, 161, 11, 88, 0, 161, 11, 66, 0, 162, 11, 44, 0, 161, 13, 25, 0, 155, 16, 9, 0, 144, 23, 1, 0, 132, 34, 0,
+ 0, 166, 7, 235, 0, 162, 1, 222, 0, 159, 0, 213, 0, 157, 0, 203, 0, 155, 0, 190, 0, 154, 0, 177, 0, 154, 0, 165,
+ 0, 154, 1, 150, 0, 155, 1, 133, 0, 154, 1, 115, 0, 154, 1, 95, 0, 154, 1, 74, 0, 153, 1, 52, 0, 153, 1, 32,
+ 0, 150, 4, 15, 0, 145, 8, 3, 0, 132, 22, 0, 0, 167, 4, 233, 0, 160, 0, 217, 0, 154, 0, 205, 0, 149, 0, 191,
+ 0, 145, 0, 177, 0, 143, 0, 164, 0, 142, 0, 153, 0, 142, 0, 141, 0, 142, 0, 128, 0, 141, 0, 113, 0, 140, 0, 96,
+ 0, 140, 0, 79, 0, 139, 0, 60, 0, 139, 0, 41, 0, 137, 0, 24, 0, 136, 2, 10, 0, 129, 11, 0, 0, 167, 2, 231,
+ 0, 158, 0, 214, 0, 151, 0, 199, 0, 145, 0, 184, 0, 139, 0, 168, 0, 134, 0, 153, 0, 133, 0, 143, 0, 133, 0, 133,
+ 0, 132, 0, 122, 0, 130, 0, 109, 0, 129, 0, 95, 0, 128, 0, 81, 0, 127, 0, 65, 0, 126, 0, 47, 0, 125, 0, 31,
+ 0, 123, 1, 16, 0, 123, 5, 0, 0, 166, 0, 228, 0, 161, 0, 217, 0, 155, 0, 204, 0, 150, 0, 189, 0, 145, 0, 174,
+ 0, 139, 0, 157, 0, 138, 0, 149, 0, 137, 0, 138, 0, 136, 0, 126, 0, 133, 0, 114, 0, 131, 0, 101, 0, 129, 0, 87,
+ 0, 127, 0, 71, 0, 126, 0, 53, 0, 125, 0, 33, 0, 122, 0, 16, 0, 119, 0, 0, 0, 108, 214, 242, 0, 97, 232, 212,
+ 0, 93, 243, 185, 0, 93, 248, 148, 0, 97, 246, 104, 0, 98, 238, 66, 0, 98, 233, 35, 0, 111, 218, 11, 0, 130, 204, 10,
+ 0, 144, 195, 8, 0, 155, 187, 6, 0, 163, 180, 4, 0, 169, 175, 4, 0, 173, 169, 4, 0, 177, 164, 4, 0, 180, 160, 2,
+ 0, 183, 156, 0, 0, 121, 193, 248, 0, 113, 203, 235, 0, 111, 211, 205, 0, 110, 218, 177, 0, 112, 220, 128, 0, 112, 218, 85,
+ 0, 114, 214, 42, 0, 123, 205, 6, 0, 138, 193, 1, 0, 149, 183, 1, 0, 157, 174, 1, 0, 162, 167, 0, 0, 166, 161, 0,
+ 0, 170, 157, 0, 0, 173, 153, 0, 0, 176, 151, 0, 0, 179, 151, 0, 0, 127, 177, 251, 0, 123, 183, 244, 0, 126, 190, 206,
+ 0, 122, 194, 186, 0, 121, 198, 148, 0, 121, 200, 110, 0, 123, 197, 66, 0, 130, 193, 24, 0, 141, 185, 2, 0, 150, 175, 0,
+ 0, 156, 167, 0, 0, 161, 159, 0, 0, 164, 153, 0, 0, 166, 149, 0, 0, 169, 145, 0, 0, 171, 143, 0, 0, 174, 145, 0,
+ 0, 128, 158, 251, 0, 128, 158, 250, 0, 130, 169, 213, 0, 131, 173, 188, 0, 130, 177, 164, 0, 126, 183, 132, 0, 129, 180, 85,
+ 0, 135, 176, 45, 0, 142, 172, 12, 0, 149, 165, 1, 0, 155, 157, 0, 0, 158, 150, 0, 0, 160, 144, 0, 0, 162, 140, 0,
+ 0, 165, 136, 0, 0, 167, 134, 0, 0, 169, 136, 0, 0, 130, 145, 233, 0, 131, 144, 231, 0, 132, 149, 210, 0, 136, 151, 189,
+ 0, 138, 156, 168, 0, 133, 161, 144, 0, 134, 161, 101, 0, 138, 158, 63, 0, 143, 155, 27, 0, 148, 151, 3, 0, 153, 144, 0,
+ 0, 155, 139, 0, 0, 157, 134, 0, 0, 159, 130, 0, 0, 161, 126, 0, 0, 162, 124, 0, 0, 164, 127, 0, 0, 124, 125, 244,
+ 0, 127, 124, 237, 0, 130, 128, 217, 0, 134, 132, 193, 0, 137, 135, 172, 0, 135, 138, 153, 0, 136, 140, 116, 0, 140, 137, 79,
+ 0, 146, 135, 45, 0, 150, 131, 14, 0, 154, 127, 1, 0, 155, 123, 0, 0, 157, 119, 0, 0, 157, 115, 0, 0, 157, 113, 0,
+ 0, 157, 111, 0, 0, 159, 114, 0, 0, 124, 102, 254, 0, 129, 101, 250, 0, 131, 104, 235, 0, 134, 111, 207, 0, 136, 115, 180,
+ 0, 137, 117, 159, 0, 138, 113, 132, 0, 143, 113, 96, 0, 150, 112, 65, 0, 156, 109, 33, 0, 161, 106, 6, 0, 162, 103, 0,
+ 0, 161, 101, 0, 0, 159, 99, 0, 0, 157, 97, 0, 0, 155, 96, 0, 0, 158, 96, 0, 0, 132, 81, 253, 0, 136, 79, 252,
+ 0, 138, 81, 242, 0, 141, 88, 219, 0, 141, 94, 193, 0, 142, 97, 169, 0, 144, 95, 141, 0, 145, 97, 112, 0, 148, 97, 83,
+ 0, 152, 97, 52, 0, 155, 95, 23, 0, 157, 90, 3, 0, 155, 90, 0, 0, 152, 90, 0, 0, 149, 89, 0, 0, 148, 88, 0,
+ 0, 148, 90, 0, 0, 138, 61, 251, 0, 144, 58, 251, 0, 146, 60, 243, 0, 148, 68, 223, 0, 149, 74, 202, 0, 151, 76, 179,
+ 0, 151, 75, 153, 0, 149, 80, 125, 0, 148, 81, 98, 0, 150, 81, 70, 0, 152, 80, 40, 0, 154, 77, 16, 0, 152, 76, 2,
+ 0, 147, 77, 0, 0, 144, 76, 0, 0, 142, 77, 0, 0, 142, 80, 0, 0, 143, 41, 250, 0, 149, 38, 249, 0, 151, 41, 239,
+ 0, 152, 48, 223, 0, 154, 54, 203, 0, 156, 57, 184, 0, 156, 59, 162, 0, 155, 61, 137, 0, 153, 64, 109, 0, 152, 64, 83,
+ 0, 153, 63, 56, 0, 152, 62, 30, 0, 151, 63, 9, 0, 146, 64, 1, 0, 141, 63, 0, 0, 137, 63, 0, 0, 136, 65, 0,
+ 0, 146, 24, 248, 0, 152, 21, 246, 0, 154, 25, 236, 0, 156, 31, 221, 0, 156, 36, 204, 0, 156, 39, 186, 0, 156, 42, 166,
+ 0, 156, 43, 143, 0, 155, 45, 119, 0, 154, 45, 93, 0, 154, 45, 69, 0, 153, 46, 44, 0, 151, 46, 20, 0, 147, 49, 4,
+ 0, 139, 52, 0, 0, 133, 53, 0, 0, 130, 55, 0, 0, 149, 15, 243, 0, 154, 9, 240, 0, 156, 11, 232, 0, 156, 16, 220,
+ 0, 156, 20, 205, 0, 156, 22, 188, 0, 155, 24, 169, 0, 155, 26, 148, 0, 154, 28, 126, 0, 154, 28, 102, 0, 152, 28, 79,
+ 0, 152, 29, 55, 0, 151, 31, 33, 0, 148, 31, 14, 0, 141, 35, 2, 0, 131, 39, 0, 0, 125, 45, 0, 0, 153, 10, 240,
+ 0, 155, 2, 233, 0, 155, 2, 225, 0, 155, 4, 216, 0, 154, 7, 203, 0, 154, 8, 187, 0, 153, 9, 170, 0, 153, 11, 151,
+ 0, 152, 12, 131, 0, 151, 13, 109, 0, 150, 13, 87, 0, 150, 14, 66, 0, 149, 14, 43, 0, 148, 17, 24, 0, 143, 19, 7,
+ 0, 134, 24, 1, 0, 122, 34, 0, 0, 156, 7, 237, 0, 154, 1, 224, 0, 152, 0, 215, 0, 150, 0, 205, 0, 148, 1, 193,
+ 0, 147, 1, 179, 0, 146, 1, 165, 0, 146, 1, 149, 0, 146, 1, 132, 0, 145, 2, 113, 0, 145, 2, 93, 0, 144, 3, 73,
+ 0, 144, 3, 52, 0, 143, 3, 31, 0, 141, 6, 14, 0, 136, 9, 2, 0, 122, 22, 0, 0, 158, 5, 234, 0, 153, 0, 217,
+ 0, 148, 0, 205, 0, 143, 0, 192, 0, 139, 0, 178, 0, 136, 0, 164, 0, 134, 0, 150, 0, 133, 0, 138, 0, 133, 0, 125,
+ 0, 132, 0, 110, 0, 132, 0, 94, 0, 131, 0, 77, 0, 131, 0, 59, 0, 130, 0, 40, 0, 129, 0, 23, 0, 127, 3, 9,
+ 0, 120, 12, 0, 0, 160, 2, 232, 0, 152, 0, 214, 0, 145, 0, 199, 0, 139, 0, 184, 0, 133, 0, 168, 0, 128, 0, 151,
+ 0, 124, 0, 137, 0, 123, 0, 127, 0, 122, 0, 116, 0, 121, 0, 105, 0, 120, 0, 92, 0, 119, 0, 78, 0, 118, 0, 63,
+ 0, 117, 0, 46, 0, 116, 0, 30, 0, 114, 1, 15, 0, 114, 5, 0, 0, 160, 0, 229, 0, 155, 0, 218, 0, 149, 0, 205,
+ 0, 144, 0, 190, 0, 139, 0, 174, 0, 133, 0, 157, 0, 127, 0, 139, 0, 126, 0, 130, 0, 125, 0, 119, 0, 123, 0, 109,
+ 0, 121, 0, 97, 0, 119, 0, 84, 0, 117, 0, 69, 0, 116, 0, 51, 0, 114, 0, 32, 0, 112, 0, 15, 0, 109, 0, 0,
+ 0, 79, 219, 242, 0, 70, 235, 210, 0, 67, 244, 183, 0, 67, 248, 151, 0, 69, 245, 109, 0, 74, 242, 66, 0, 77, 234, 32,
+ 0, 81, 227, 9, 0, 101, 212, 2, 0, 120, 201, 2, 0, 135, 194, 2, 0, 146, 187, 2, 0, 154, 182, 2, 0, 161, 176, 3,
+ 0, 165, 171, 2, 0, 169, 166, 2, 0, 172, 162, 0, 0, 97, 194, 248, 0, 90, 202, 239, 0, 90, 207, 209, 0, 88, 215, 182,
+ 0, 89, 219, 138, 0, 93, 216, 100, 0, 94, 214, 55, 0, 97, 210, 12, 0, 112, 198, 1, 0, 128, 187, 0, 0, 139, 179, 0,
+ 0, 147, 173, 0, 0, 153, 167, 0, 0, 157, 162, 0, 0, 161, 158, 0, 0, 165, 155, 0, 0, 167, 156, 0, 0, 103, 179, 250,
+ 0, 99, 181, 247, 0, 104, 189, 208, 0, 101, 194, 189, 0, 100, 199, 155, 0, 102, 200, 118, 0, 103, 199, 78, 0, 106, 195, 37,
+ 0, 116, 189, 4, 0, 129, 179, 0, 0, 139, 171, 0, 0, 145, 164, 0, 0, 150, 158, 0, 0, 154, 153, 0, 0, 157, 149, 0,
+ 0, 159, 147, 0, 0, 162, 149, 0, 0, 108, 158, 252, 0, 106, 160, 249, 0, 110, 171, 217, 0, 108, 175, 190, 0, 108, 178, 168,
+ 0, 108, 182, 138, 0, 109, 184, 94, 0, 111, 181, 53, 0, 119, 177, 15, 0, 129, 169, 1, 0, 137, 161, 0, 0, 143, 154, 0,
+ 0, 147, 149, 0, 0, 150, 144, 0, 0, 152, 139, 0, 0, 154, 137, 0, 0, 157, 140, 0, 0, 111, 149, 234, 0, 113, 148, 232,
+ 0, 115, 151, 217, 0, 116, 154, 192, 0, 119, 157, 169, 0, 116, 161, 147, 0, 114, 167, 110, 0, 116, 164, 71, 0, 121, 160, 31,
+ 0, 129, 155, 3, 0, 136, 148, 0, 0, 140, 142, 0, 0, 143, 137, 0, 0, 146, 133, 0, 0, 148, 128, 0, 0, 150, 126, 0,
+ 0, 152, 129, 0, 0, 108, 128, 245, 0, 113, 128, 234, 0, 115, 133, 214, 0, 117, 135, 193, 0, 121, 135, 172, 0, 121, 140, 153,
+ 0, 117, 145, 127, 0, 116, 146, 90, 0, 124, 143, 48, 0, 129, 138, 14, 0, 134, 133, 1, 0, 137, 128, 0, 0, 140, 124, 0,
+ 0, 142, 120, 0, 0, 143, 116, 0, 0, 144, 114, 0, 0, 146, 117, 0, 0, 109, 105, 254, 0, 110, 108, 241, 0, 113, 113, 219,
+ 0, 116, 117, 198, 0, 120, 118, 175, 0, 122, 118, 153, 0, 121, 120, 132, 0, 120, 123, 101, 0, 128, 123, 63, 0, 133, 120, 29,
+ 0, 136, 115, 4, 0, 138, 112, 0, 0, 139, 108, 0, 0, 140, 105, 0, 0, 140, 102, 0, 0, 140, 100, 0, 0, 142, 102, 0,
+ 0, 108, 85, 254, 0, 109, 87, 251, 0, 112, 90, 236, 0, 115, 96, 214, 0, 119, 100, 189, 0, 121, 101, 162, 0, 123, 99, 140,
+ 0, 125, 96, 115, 0, 131, 100, 80, 0, 136, 98, 48, 0, 140, 94, 20, 0, 143, 90, 3, 0, 142, 89, 0, 0, 141, 87, 0,
+ 0, 140, 85, 0, 0, 139, 83, 0, 0, 142, 82, 0, 0, 116, 66, 253, 0, 120, 63, 252, 0, 123, 65, 243, 0, 125, 73, 223,
+ 0, 127, 79, 200, 0, 129, 81, 174, 0, 130, 81, 150, 0, 132, 82, 124, 0, 132, 84, 96, 0, 134, 84, 67, 0, 137, 81, 38,
+ 0, 140, 77, 13, 0, 139, 75, 1, 0, 136, 76, 0, 0, 135, 74, 0, 0, 133, 73, 0, 0, 134, 75, 0, 0, 123, 46, 251,
+ 0, 128, 43, 250, 0, 130, 46, 241, 0, 132, 53, 224, 0, 135, 59, 204, 0, 138, 62, 184, 0, 138, 64, 162, 0, 138, 65, 136,
+ 0, 136, 67, 108, 0, 135, 69, 82, 0, 136, 68, 56, 0, 137, 65, 28, 0, 137, 62, 7, 0, 134, 61, 0, 0, 130, 60, 0,
+ 0, 128, 60, 0, 0, 127, 64, 0, 0, 128, 28, 250, 0, 134, 26, 247, 0, 136, 30, 236, 0, 138, 36, 220, 0, 140, 40, 203,
+ 0, 141, 44, 186, 0, 142, 47, 167, 0, 141, 48, 145, 0, 141, 49, 120, 0, 138, 51, 94, 0, 138, 52, 69, 0, 139, 50, 42,
+ 0, 137, 48, 18, 0, 134, 49, 2, 0, 128, 51, 0, 0, 123, 53, 0, 0, 121, 54, 0, 0, 133, 17, 245, 0, 138, 13, 242,
+ 0, 141, 15, 232, 0, 142, 21, 218, 0, 142, 24, 203, 0, 142, 27, 186, 0, 142, 29, 168, 0, 141, 30, 147, 0, 140, 31, 125,
+ 0, 140, 32, 101, 0, 139, 32, 78, 0, 139, 33, 54, 0, 138, 34, 32, 0, 135, 34, 12, 0, 128, 36, 1, 0, 120, 40, 0,
+ 0, 115, 45, 0, 0, 139, 11, 241, 0, 141, 4, 235, 0, 142, 5, 227, 0, 143, 8, 215, 0, 143, 11, 202, 0, 142, 12, 186,
+ 0, 141, 13, 169, 0, 140, 14, 150, 0, 139, 16, 129, 0, 139, 16, 108, 0, 138, 17, 86, 0, 137, 17, 64, 0, 137, 18, 42,
+ 0, 135, 21, 23, 0, 132, 20, 6, 0, 122, 26, 0, 0, 111, 34, 0, 0, 144, 8, 239, 0, 143, 1, 227, 0, 142, 0, 218,
+ 0, 141, 1, 208, 0, 140, 1, 196, 0, 139, 1, 182, 0, 137, 2, 166, 0, 136, 2, 149, 0, 135, 3, 131, 0, 135, 4, 111,
+ 0, 134, 5, 91, 0, 133, 5, 72, 0, 133, 6, 51, 0, 132, 6, 31, 0, 131, 8, 14, 0, 124, 11, 2, 0, 111, 23, 0,
+ 0, 148, 5, 236, 0, 144, 0, 219, 0, 140, 0, 207, 0, 136, 0, 193, 0, 132, 0, 179, 0, 129, 0, 165, 0, 126, 0, 150,
+ 0, 124, 0, 135, 0, 124, 0, 122, 0, 123, 0, 107, 0, 123, 0, 92, 0, 123, 0, 75, 0, 122, 0, 57, 0, 122, 0, 39,
+ 0, 120, 0, 22, 0, 119, 3, 8, 0, 110, 12, 0, 0, 151, 2, 233, 0, 145, 0, 215, 0, 138, 0, 200, 0, 132, 0, 184,
+ 0, 126, 0, 167, 0, 121, 0, 151, 0, 116, 0, 136, 0, 113, 0, 122, 0, 112, 0, 111, 0, 112, 0, 100, 0, 111, 0, 89,
+ 0, 110, 0, 76, 0, 109, 0, 61, 0, 108, 0, 44, 0, 107, 0, 29, 0, 105, 1, 15, 0, 104, 5, 0, 0, 153, 0, 231,
+ 0, 148, 0, 219, 0, 143, 0, 207, 0, 137, 0, 191, 0, 132, 0, 174, 0, 126, 0, 156, 0, 120, 0, 138, 0, 114, 0, 121,
+ 0, 113, 0, 111, 0, 112, 0, 102, 0, 110, 0, 93, 0, 108, 0, 81, 0, 106, 0, 67, 0, 105, 0, 50, 0, 104, 0, 31,
+ 0, 101, 0, 14, 0, 99, 0, 0, 0, 49, 227, 241, 0, 41, 239, 213, 0, 41, 245, 184, 0, 42, 247, 157, 0, 46, 244, 125,
+ 0, 54, 240, 83, 0, 61, 236, 45, 0, 65, 230, 15, 0, 72, 224, 0, 0, 94, 210, 0, 0, 113, 200, 0, 0, 127, 193, 0,
+ 0, 137, 187, 0, 0, 146, 182, 1, 0, 153, 177, 1, 0, 158, 172, 1, 0, 162, 167, 0, 0, 73, 197, 248, 0, 68, 202, 240,
+ 0, 70, 204, 212, 0, 68, 211, 186, 0, 67, 219, 147, 0, 73, 214, 111, 0, 77, 214, 72, 0, 76, 213, 23, 0, 85, 204, 1,
+ 0, 103, 192, 0, 0, 118, 183, 0, 0, 129, 176, 0, 0, 138, 171, 0, 0, 144, 167, 0, 0, 149, 163, 0, 0, 153, 160, 0,
+ 0, 157, 161, 0, 0, 80, 180, 250, 0, 81, 183, 246, 0, 83, 192, 214, 0, 81, 194, 191, 0, 79, 200, 158, 0, 82, 201, 126,
+ 0, 84, 201, 89, 0, 85, 198, 47, 0, 90, 195, 9, 0, 105, 184, 0, 0, 119, 174, 0, 0, 128, 166, 0, 0, 135, 160, 0,
+ 0, 141, 157, 0, 0, 145, 154, 0, 0, 148, 151, 0, 0, 151, 154, 0, 0, 88, 160, 252, 0, 86, 161, 251, 0, 89, 172, 217,
+ 0, 90, 180, 193, 0, 89, 181, 171, 0, 89, 184, 145, 0, 91, 186, 104, 0, 91, 185, 65, 0, 94, 181, 25, 0, 106, 174, 2,
+ 0, 118, 164, 0, 0, 127, 156, 0, 0, 133, 150, 0, 0, 137, 146, 0, 0, 140, 142, 0, 0, 143, 140, 0, 0, 146, 144, 0,
+ 0, 90, 148, 248, 0, 94, 147, 242, 0, 95, 151, 222, 0, 96, 157, 195, 0, 98, 159, 171, 0, 97, 163, 151, 0, 97, 168, 116,
+ 0, 96, 169, 80, 0, 98, 166, 39, 0, 106, 161, 5, 0, 117, 152, 0, 0, 124, 144, 0, 0, 129, 138, 0, 0, 133, 133, 0,
+ 0, 136, 130, 0, 0, 138, 128, 0, 0, 141, 132, 0, 0, 91, 131, 248, 0, 96, 134, 230, 0, 99, 138, 213, 0, 101, 138, 195,
+ 0, 102, 140, 174, 0, 104, 140, 152, 0, 103, 144, 128, 0, 99, 148, 97, 0, 103, 148, 54, 0, 109, 144, 18, 0, 116, 138, 1,
+ 0, 122, 131, 0, 0, 127, 125, 0, 0, 130, 121, 0, 0, 132, 117, 0, 0, 135, 115, 0, 0, 137, 118, 0, 0, 94, 107, 254,
+ 0, 96, 113, 235, 0, 101, 118, 210, 0, 103, 121, 193, 0, 105, 124, 176, 0, 107, 120, 152, 0, 109, 123, 132, 0, 104, 127, 107,
+ 0, 107, 129, 67, 0, 112, 127, 31, 0, 116, 123, 4, 0, 121, 117, 0, 0, 125, 112, 0, 0, 127, 108, 0, 0, 129, 104, 0,
+ 0, 130, 102, 0, 0, 132, 104, 0, 0, 93, 88, 255, 0, 94, 93, 243, 0, 97, 98, 224, 0, 100, 102, 205, 0, 103, 104, 183,
+ 0, 107, 103, 157, 0, 109, 102, 135, 0, 108, 106, 115, 0, 111, 108, 81, 0, 115, 109, 47, 0, 119, 104, 16, 0, 123, 100, 2,
+ 0, 124, 96, 0, 0, 125, 92, 0, 0, 126, 89, 0, 0, 126, 87, 0, 0, 128, 88, 0, 0, 91, 70, 254, 0, 97, 68, 251,
+ 0, 100, 72, 240, 0, 103, 78, 220, 0, 105, 82, 197, 0, 109, 84, 171, 0, 111, 84, 144, 0, 112, 85, 124, 0, 113, 86, 101,
+ 0, 118, 87, 65, 0, 123, 82, 34, 0, 126, 77, 9, 0, 127, 74, 1, 0, 126, 72, 0, 0, 125, 70, 0, 0, 124, 69, 0,
+ 0, 126, 67, 0, 0, 100, 51, 253, 0, 105, 48, 252, 0, 108, 50, 243, 0, 110, 58, 225, 0, 113, 64, 203, 0, 115, 67, 181,
+ 0, 116, 68, 155, 0, 117, 69, 132, 0, 118, 70, 108, 0, 120, 71, 80, 0, 121, 70, 53, 0, 123, 65, 25, 0, 124, 60, 4,
+ 0, 122, 61, 0, 0, 119, 61, 0, 0, 118, 61, 0, 0, 118, 62, 0, 0, 108, 32, 251, 0, 112, 31, 249, 0, 115, 34, 238,
+ 0, 118, 40, 222, 0, 121, 45, 204, 0, 123, 48, 186, 0, 124, 51, 165, 0, 124, 52, 143, 0, 124, 53, 119, 0, 122, 54, 92,
+ 0, 122, 57, 68, 0, 122, 54, 42, 0, 122, 50, 16, 0, 120, 50, 2, 0, 116, 51, 0, 0, 113, 51, 0, 0, 112, 53, 0,
+ 0, 114, 18, 247, 0, 120, 16, 244, 0, 123, 19, 234, 0, 125, 25, 219, 0, 126, 29, 203, 0, 127, 32, 186, 0, 127, 33, 167,
+ 0, 126, 34, 147, 0, 125, 35, 125, 0, 124, 36, 101, 0, 122, 38, 78, 0, 123, 40, 55, 0, 124, 37, 30, 0, 121, 36, 9,
+ 0, 115, 38, 1, 0, 109, 41, 0, 0, 106, 45, 0, 0, 123, 12, 243, 0, 125, 6, 238, 0, 128, 7, 229, 0, 129, 12, 216,
+ 0, 129, 14, 201, 0, 129, 16, 186, 0, 128, 17, 168, 0, 126, 19, 149, 0, 125, 20, 129, 0, 125, 20, 108, 0, 124, 21, 86,
+ 0, 123, 21, 63, 0, 124, 22, 41, 0, 123, 23, 20, 0, 119, 22, 4, 0, 110, 28, 0, 0, 101, 34, 0, 0, 130, 8, 240,
+ 0, 130, 1, 231, 0, 130, 1, 221, 0, 130, 2, 210, 0, 129, 3, 197, 0, 128, 3, 183, 0, 126, 4, 166, 0, 124, 5, 148,
+ 0, 123, 5, 129, 0, 123, 6, 110, 0, 122, 7, 91, 0, 122, 8, 71, 0, 121, 8, 49, 0, 121, 8, 29, 0, 120, 11, 13,
+ 0, 112, 13, 1, 0, 100, 24, 0, 0, 136, 5, 238, 0, 134, 0, 221, 0, 131, 0, 208, 0, 127, 0, 194, 0, 123, 0, 180,
+ 0, 120, 0, 166, 0, 118, 0, 151, 0, 115, 0, 136, 0, 114, 0, 120, 0, 114, 0, 105, 0, 114, 1, 90, 0, 113, 1, 74,
+ 0, 113, 1, 55, 0, 113, 1, 37, 0, 111, 1, 20, 0, 110, 4, 7, 0, 99, 13, 0, 0, 141, 3, 235, 0, 136, 0, 216,
+ 0, 130, 0, 199, 0, 124, 0, 183, 0, 118, 0, 167, 0, 113, 0, 151, 0, 109, 0, 136, 0, 105, 0, 121, 0, 103, 0, 107,
+ 0, 102, 0, 96, 0, 101, 0, 85, 0, 101, 0, 72, 0, 100, 0, 58, 0, 99, 0, 42, 0, 98, 0, 27, 0, 96, 1, 14,
+ 0, 94, 5, 0, 0, 144, 0, 232, 0, 139, 0, 221, 0, 135, 0, 208, 0, 129, 0, 192, 0, 124, 0, 173, 0, 118, 0, 155,
+ 0, 112, 0, 137, 0, 106, 0, 120, 0, 101, 0, 103, 0, 99, 0, 95, 0, 98, 0, 86, 0, 96, 0, 76, 0, 95, 0, 63,
+ 0, 93, 0, 47, 0, 92, 0, 30, 0, 90, 0, 13, 0, 88, 0, 0, 0, 25, 228, 235, 0, 19, 238, 213, 0, 18, 244, 183,
+ 0, 21, 246, 158, 0, 26, 243, 133, 0, 34, 241, 97, 0, 44, 240, 55, 0, 51, 235, 22, 0, 57, 230, 3, 0, 67, 222, 0,
+ 0, 89, 210, 0, 0, 107, 200, 0, 0, 120, 193, 0, 0, 130, 187, 0, 0, 138, 182, 0, 0, 145, 177, 0, 0, 151, 173, 0,
+ 0, 51, 200, 246, 0, 48, 202, 241, 0, 50, 203, 213, 0, 48, 211, 188, 0, 45, 220, 151, 0, 51, 216, 121, 0, 58, 212, 84,
+ 0, 62, 211, 45, 0, 64, 208, 8, 0, 77, 198, 0, 0, 95, 188, 0, 0, 110, 180, 0, 0, 121, 174, 0, 0, 129, 169, 0,
+ 0, 136, 166, 0, 0, 142, 165, 0, 0, 146, 166, 0, 0, 61, 182, 250, 0, 60, 182, 248, 0, 65, 189, 216, 0, 61, 192, 193,
+ 0, 58, 200, 160, 0, 61, 201, 133, 0, 66, 200, 97, 0, 68, 198, 61, 0, 69, 196, 21, 0, 79, 189, 2, 0, 96, 178, 0,
+ 0, 109, 169, 0, 0, 119, 163, 0, 0, 126, 158, 0, 0, 132, 155, 0, 0, 136, 154, 0, 0, 140, 157, 0, 0, 68, 163, 251,
+ 0, 67, 165, 251, 0, 72, 175, 220, 0, 71, 181, 195, 0, 70, 182, 172, 0, 71, 184, 151, 0, 72, 185, 120, 0, 71, 187, 86,
+ 0, 74, 184, 35, 0, 80, 179, 4, 0, 96, 168, 0, 0, 108, 159, 0, 0, 117, 152, 0, 0, 123, 147, 0, 0, 127, 143, 0,
+ 0, 131, 141, 0, 0, 134, 147, 0, 0, 73, 145, 251, 0, 75, 143, 252, 0, 77, 157, 226, 0, 78, 163, 201, 0, 81, 163, 173,
+ 0, 80, 166, 155, 0, 80, 167, 128, 0, 79, 170, 98, 0, 81, 168, 48, 0, 83, 165, 11, 0, 96, 157, 1, 0, 107, 148, 0,
+ 0, 115, 141, 0, 0, 119, 135, 0, 0, 124, 131, 0, 0, 127, 129, 0, 0, 129, 134, 0, 0, 74, 130, 252, 0, 78, 137, 240,
+ 0, 83, 138, 216, 0, 85, 141, 204, 0, 85, 146, 181, 0, 85, 144, 152, 0, 86, 147, 133, 0, 84, 149, 105, 0, 85, 151, 61,
+ 0, 87, 149, 24, 0, 96, 143, 2, 0, 106, 136, 0, 0, 112, 129, 0, 0, 117, 124, 0, 0, 121, 119, 0, 0, 124, 117, 0,
+ 0, 126, 120, 0, 0, 77, 109, 254, 0, 81, 117, 235, 0, 85, 124, 212, 0, 87, 126, 196, 0, 88, 126, 180, 0, 89, 128, 158,
+ 0, 93, 126, 133, 0, 90, 129, 111, 0, 88, 133, 74, 0, 89, 132, 37, 0, 95, 128, 5, 0, 105, 122, 0, 0, 111, 116, 0,
+ 0, 115, 111, 0, 0, 118, 107, 0, 0, 121, 104, 0, 0, 123, 106, 0, 0, 78, 89, 254, 0, 81, 96, 238, 0, 85, 102, 220,
+ 0, 88, 106, 204, 0, 90, 108, 183, 0, 91, 110, 160, 0, 94, 108, 140, 0, 94, 109, 116, 0, 90, 113, 89, 0, 89, 116, 56,
+ 0, 98, 111, 18, 0, 105, 107, 1, 0, 109, 102, 0, 0, 112, 98, 0, 0, 114, 94, 0, 0, 116, 91, 0, 0, 118, 91, 0,
+ 0, 76, 72, 255, 0, 81, 73, 248, 0, 84, 77, 234, 0, 84, 86, 214, 0, 88, 90, 191, 0, 91, 91, 169, 0, 94, 90, 143,
+ 0, 97, 91, 122, 0, 93, 93, 98, 0, 93, 95, 68, 0, 101, 91, 31, 0, 105, 88, 6, 0, 108, 84, 0, 0, 109, 81, 0,
+ 0, 110, 77, 0, 0, 110, 75, 0, 0, 112, 74, 0, 0, 75, 56, 254, 0, 82, 53, 252, 0, 84, 56, 241, 0, 83, 65, 223,
+ 0, 87, 70, 201, 0, 90, 71, 179, 0, 93, 71, 152, 0, 96, 73, 129, 0, 98, 74, 109, 0, 99, 74, 87, 0, 104, 71, 49,
+ 0, 107, 66, 19, 0, 109, 64, 2, 0, 109, 62, 0, 0, 108, 61, 0, 0, 107, 59, 0, 0, 109, 57, 0, 0, 84, 38, 253,
+ 0, 89, 36, 251, 0, 92, 38, 240, 0, 95, 44, 224, 0, 99, 49, 205, 0, 101, 53, 185, 0, 102, 54, 162, 0, 103, 56, 138,
+ 0, 103, 57, 116, 0, 104, 59, 93, 0, 105, 61, 66, 0, 106, 55, 38, 0, 108, 51, 13, 0, 107, 49, 1, 0, 104, 51, 0,
+ 0, 101, 51, 0, 0, 101, 52, 0, 0, 93, 22, 250, 0, 98, 20, 247, 0, 102, 23, 237, 0, 104, 29, 220, 0, 106, 33, 204,
+ 0, 108, 36, 187, 0, 109, 37, 167, 0, 109, 38, 145, 0, 108, 40, 124, 0, 106, 42, 101, 0, 105, 43, 77, 0, 107, 46, 54,
+ 0, 107, 41, 29, 0, 107, 38, 6, 0, 102, 40, 0, 0, 98, 41, 0, 0, 96, 43, 0, 0, 103, 12, 245, 0, 107, 8, 241,
+ 0, 110, 10, 232, 0, 111, 16, 217, 0, 112, 18, 202, 0, 113, 20, 185, 0, 113, 21, 168, 0, 112, 22, 148, 0, 110, 23, 128,
+ 0, 108, 26, 106, 0, 107, 26, 85, 0, 107, 27, 63, 0, 109, 28, 41, 0, 110, 26, 18, 0, 105, 26, 2, 0, 97, 30, 0,
+ 0, 91, 34, 0, 0, 114, 8, 242, 0, 115, 2, 234, 0, 115, 2, 225, 0, 116, 5, 212, 0, 115, 6, 198, 0, 115, 6, 182,
+ 0, 113, 8, 165, 0, 112, 8, 147, 0, 111, 9, 129, 0, 110, 10, 110, 0, 110, 10, 91, 0, 109, 10, 70, 0, 109, 11, 48,
+ 0, 109, 11, 28, 0, 108, 13, 10, 0, 99, 16, 1, 0, 88, 25, 0, 0, 122, 5, 239, 0, 121, 1, 225, 0, 119, 0, 211,
+ 0, 116, 0, 196, 0, 113, 0, 182, 0, 111, 0, 168, 0, 108, 1, 153, 0, 106, 1, 138, 0, 105, 1, 122, 0, 104, 1, 105,
+ 0, 104, 1, 90, 0, 104, 1, 73, 0, 104, 1, 54, 0, 103, 1, 35, 0, 102, 1, 18, 0, 100, 4, 4, 0, 87, 14, 0,
+ 0, 129, 3, 236, 0, 125, 0, 217, 0, 120, 0, 200, 0, 115, 0, 183, 0, 109, 0, 166, 0, 104, 0, 151, 0, 100, 0, 136,
+ 0, 97, 0, 121, 0, 94, 0, 106, 0, 92, 0, 93, 0, 91, 0, 82, 0, 91, 0, 69, 0, 90, 0, 55, 0, 90, 0, 40,
+ 0, 88, 0, 26, 0, 87, 1, 13, 0, 83, 6, 0, 0, 134, 0, 234, 0, 130, 0, 221, 0, 125, 0, 208, 0, 120, 0, 192,
+ 0, 115, 0, 173, 0, 109, 0, 155, 0, 103, 0, 137, 0, 97, 0, 119, 0, 92, 0, 102, 0, 86, 0, 85, 0, 85, 0, 78,
+ 0, 84, 0, 69, 0, 83, 0, 58, 0, 81, 0, 44, 0, 80, 0, 28, 0, 78, 0, 13, 0, 76, 0, 0, 0, 14, 224, 227,
+ 0, 9, 231, 211, 0, 7, 239, 184, 0, 8, 242, 160, 0, 12, 243, 137, 0, 18, 243, 107, 0, 27, 243, 65, 0, 37, 240, 29,
+ 0, 45, 235, 8, 0, 53, 227, 0, 0, 63, 222, 0, 0, 83, 210, 0, 0, 100, 200, 0, 0, 113, 193, 0, 0, 124, 187, 0,
+ 0, 132, 182, 0, 0, 139, 178, 0, 0, 28, 202, 240, 0, 29, 202, 239, 0, 32, 202, 213, 0, 30, 210, 191, 0, 26, 220, 154,
+ 0, 31, 217, 128, 0, 39, 214, 94, 0, 46, 212, 57, 0, 49, 209, 25, 0, 56, 204, 3, 0, 70, 194, 0, 0, 87, 185, 0,
+ 0, 102, 178, 0, 0, 113, 173, 0, 0, 121, 169, 0, 0, 128, 167, 0, 0, 133, 169, 0, 0, 37, 186, 246, 0, 42, 183, 246,
+ 0, 47, 186, 216, 0, 42, 192, 194, 0, 39, 202, 162, 0, 42, 202, 137, 0, 45, 200, 106, 0, 50, 198, 69, 0, 53, 196, 33,
+ 0, 57, 193, 4, 0, 71, 183, 0, 0, 88, 173, 0, 0, 101, 166, 0, 0, 111, 161, 0, 0, 118, 158, 0, 0, 123, 156, 0,
+ 0, 128, 160, 0, 0, 48, 167, 249, 0, 50, 166, 247, 0, 53, 171, 221, 0, 52, 178, 195, 0, 51, 180, 173, 0, 53, 182, 153,
+ 0, 55, 183, 127, 0, 55, 185, 95, 0, 58, 184, 44, 0, 60, 182, 8, 0, 72, 172, 0, 0, 88, 162, 0, 0, 100, 155, 0,
+ 0, 108, 150, 0, 0, 114, 146, 0, 0, 118, 144, 0, 0, 122, 149, 0, 0, 57, 146, 251, 0, 57, 147, 249, 0, 58, 156, 228,
+ 0, 61, 164, 202, 0, 62, 164, 174, 0, 64, 166, 155, 0, 66, 166, 134, 0, 63, 169, 104, 0, 65, 169, 57, 0, 66, 167, 19,
+ 0, 74, 161, 1, 0, 88, 151, 0, 0, 98, 143, 0, 0, 105, 138, 0, 0, 110, 134, 0, 0, 114, 132, 0, 0, 117, 137, 0,
+ 0, 59, 130, 252, 0, 61, 132, 246, 0, 66, 142, 227, 0, 67, 148, 209, 0, 67, 151, 186, 0, 69, 149, 154, 0, 70, 150, 135,
+ 0, 68, 152, 109, 0, 70, 154, 67, 0, 70, 152, 30, 0, 75, 148, 3, 0, 88, 139, 0, 0, 96, 131, 0, 0, 103, 126, 0,
+ 0, 108, 122, 0, 0, 112, 119, 0, 0, 114, 124, 0, 0, 60, 113, 253, 0, 64, 118, 237, 0, 70, 127, 213, 0, 72, 129, 201,
+ 0, 74, 130, 185, 0, 74, 135, 163, 0, 74, 131, 134, 0, 72, 133, 114, 0, 73, 136, 79, 0, 72, 137, 45, 0, 74, 134, 11,
+ 0, 86, 125, 1, 0, 95, 119, 0, 0, 101, 113, 0, 0, 105, 109, 0, 0, 109, 106, 0, 0, 111, 110, 0, 0, 63, 92, 254,
+ 0, 66, 98, 238, 0, 70, 105, 219, 0, 72, 112, 202, 0, 75, 115, 182, 0, 77, 115, 163, 0, 78, 116, 141, 0, 79, 111, 116,
+ 0, 76, 114, 94, 0, 72, 120, 65, 0, 76, 116, 24, 0, 84, 111, 2, 0, 93, 105, 0, 0, 98, 100, 0, 0, 102, 95, 0,
+ 0, 105, 92, 0, 0, 107, 94, 0, 0, 63, 74, 254, 0, 67, 76, 243, 0, 71, 82, 227, 0, 72, 90, 206, 0, 78, 91, 180,
+ 0, 80, 94, 164, 0, 80, 93, 139, 0, 82, 95, 123, 0, 81, 94, 97, 0, 77, 99, 74, 0, 79, 97, 35, 0, 84, 93, 6,
+ 0, 90, 89, 0, 0, 95, 84, 0, 0, 97, 80, 0, 0, 98, 76, 0, 0, 100, 76, 0, 0, 61, 58, 254, 0, 66, 59, 246,
+ 0, 69, 63, 233, 0, 69, 71, 214, 0, 72, 74, 194, 0, 75, 76, 176, 0, 77, 77, 152, 0, 82, 78, 128, 0, 83, 78, 106,
+ 0, 80, 82, 84, 0, 82, 80, 49, 0, 84, 75, 18, 0, 89, 72, 2, 0, 91, 68, 0, 0, 92, 65, 0, 0, 92, 63, 0,
+ 0, 93, 62, 0, 0, 59, 43, 254, 0, 67, 41, 250, 0, 71, 43, 238, 0, 74, 49, 221, 0, 78, 52, 203, 0, 79, 55, 183,
+ 0, 80, 57, 161, 0, 83, 59, 136, 0, 85, 61, 113, 0, 84, 62, 94, 0, 84, 63, 74, 0, 88, 56, 34, 0, 92, 53, 9,
+ 0, 92, 51, 0, 0, 91, 50, 0, 0, 91, 49, 0, 0, 91, 46, 0, 0, 70, 26, 253, 0, 75, 24, 250, 0, 80, 26, 240,
+ 0, 83, 33, 222, 0, 85, 37, 205, 0, 86, 40, 187, 0, 88, 41, 167, 0, 89, 42, 145, 0, 89, 45, 121, 0, 87, 47, 100,
+ 0, 88, 46, 78, 0, 90, 47, 51, 0, 91, 42, 24, 0, 92, 40, 4, 0, 90, 40, 0, 0, 87, 40, 0, 0, 84, 40, 0,
+ 0, 80, 13, 249, 0, 85, 12, 245, 0, 89, 14, 234, 0, 91, 20, 219, 0, 93, 23, 203, 0, 94, 25, 187, 0, 95, 25, 168,
+ 0, 95, 26, 148, 0, 94, 27, 127, 0, 91, 30, 105, 0, 90, 30, 83, 0, 90, 30, 61, 0, 92, 32, 39, 0, 93, 29, 17,
+ 0, 90, 29, 2, 0, 85, 31, 0, 0, 80, 33, 0, 0, 93, 8, 245, 0, 96, 3, 237, 0, 97, 4, 228, 0, 98, 8, 215,
+ 0, 99, 9, 200, 0, 99, 10, 183, 0, 98, 11, 165, 0, 97, 12, 147, 0, 97, 12, 129, 0, 96, 13, 110, 0, 94, 15, 89,
+ 0, 93, 15, 69, 0, 93, 16, 48, 0, 95, 17, 28, 0, 94, 16, 8, 0, 86, 19, 1, 0, 76, 25, 0, 0, 105, 5, 241,
+ 0, 105, 1, 229, 0, 104, 0, 217, 0, 102, 1, 203, 0, 101, 1, 188, 0, 100, 1, 173, 0, 98, 1, 157, 0, 96, 1, 141,
+ 0, 95, 1, 125, 0, 94, 1, 108, 0, 93, 2, 90, 0, 93, 2, 73, 0, 93, 3, 54, 0, 92, 3, 34, 0, 93, 3, 16,
+ 0, 88, 6, 3, 0, 74, 15, 0, 0, 115, 2, 238, 0, 112, 0, 221, 0, 108, 0, 204, 0, 104, 0, 186, 0, 99, 0, 168,
+ 0, 95, 0, 151, 0, 92, 0, 136, 0, 88, 0, 122, 0, 86, 0, 107, 0, 83, 0, 93, 0, 82, 0, 79, 0, 81, 0, 67,
+ 0, 81, 0, 53, 0, 80, 0, 38, 0, 79, 0, 24, 0, 78, 1, 12, 0, 70, 6, 0, 0, 121, 0, 236, 0, 118, 0, 224,
+ 0, 114, 0, 211, 0, 110, 0, 193, 0, 105, 0, 174, 0, 99, 0, 155, 0, 94, 0, 136, 0, 88, 0, 119, 0, 83, 0, 100,
+ 0, 77, 0, 84, 0, 72, 0, 69, 0, 70, 0, 61, 0, 69, 0, 52, 0, 68, 0, 40, 0, 67, 0, 27, 0, 65, 0, 13,
+ 0, 64, 0, 0, 0, 9, 222, 219, 0, 6, 228, 209, 0, 5, 233, 189, 0, 5, 238, 166, 0, 8, 240, 145, 0, 12, 241, 119,
+ 0, 17, 242, 83, 0, 27, 241, 44, 0, 35, 238, 17, 0, 43, 233, 4, 0, 51, 226, 0, 0, 58, 221, 0, 0, 78, 210, 0,
+ 0, 94, 200, 0, 0, 107, 193, 0, 0, 117, 187, 0, 0, 126, 181, 0, 0, 17, 200, 229, 0, 15, 202, 234, 0, 15, 204, 214,
+ 0, 15, 210, 193, 0, 12, 218, 158, 0, 16, 218, 131, 0, 23, 215, 106, 0, 30, 212, 68, 0, 36, 211, 35, 0, 41, 208, 9,
+ 0, 51, 200, 1, 0, 64, 192, 0, 0, 80, 183, 0, 0, 95, 177, 0, 0, 105, 173, 0, 0, 114, 171, 0, 0, 120, 173, 0,
+ 0, 24, 185, 238, 0, 24, 184, 243, 0, 24, 190, 219, 0, 23, 196, 195, 0, 21, 203, 165, 0, 24, 203, 140, 0, 27, 201, 115,
+ 0, 33, 200, 79, 0, 38, 198, 41, 0, 42, 195, 11, 0, 52, 188, 1, 0, 65, 179, 0, 0, 81, 170, 0, 0, 94, 164, 0,
+ 0, 103, 161, 0, 0, 109, 159, 0, 0, 115, 164, 0, 0, 33, 168, 245, 0, 33, 167, 246, 0, 33, 173, 225, 0, 32, 180, 198,
+ 0, 33, 182, 175, 0, 35, 184, 156, 0, 35, 185, 133, 0, 37, 185, 101, 0, 42, 184, 53, 0, 45, 182, 19, 0, 54, 176, 1,
+ 0, 67, 166, 0, 0, 81, 158, 0, 0, 92, 152, 0, 0, 99, 148, 0, 0, 105, 147, 0, 0, 109, 153, 0, 0, 42, 148, 249,
+ 0, 40, 149, 249, 0, 39, 156, 231, 0, 41, 165, 205, 0, 43, 165, 175, 0, 43, 166, 157, 0, 44, 169, 136, 0, 44, 171, 109,
+ 0, 48, 171, 64, 0, 50, 170, 28, 0, 55, 164, 2, 0, 68, 154, 0, 0, 81, 145, 0, 0, 90, 139, 0, 0, 96, 135, 0,
+ 0, 101, 133, 0, 0, 104, 140, 0, 0, 46, 131, 251, 0, 46, 131, 248, 0, 47, 136, 232, 0, 48, 149, 210, 0, 48, 155, 188,
+ 0, 50, 152, 156, 0, 50, 153, 138, 0, 50, 156, 114, 0, 52, 155, 73, 0, 53, 155, 38, 0, 55, 152, 5, 0, 68, 143, 0,
+ 0, 79, 133, 0, 0, 87, 127, 0, 0, 94, 122, 0, 0, 99, 120, 0, 0, 100, 126, 0, 0, 46, 115, 252, 0, 49, 119, 238,
+ 0, 53, 128, 218, 0, 54, 133, 208, 0, 55, 137, 192, 0, 57, 140, 166, 0, 56, 135, 136, 0, 55, 138, 117, 0, 56, 138, 83,
+ 0, 57, 140, 51, 0, 57, 138, 17, 0, 65, 131, 1, 0, 77, 121, 0, 0, 85, 114, 0, 0, 91, 109, 0, 0, 96, 107, 0,
+ 0, 97, 111, 0, 0, 48, 97, 253, 0, 51, 103, 235, 0, 55, 114, 214, 0, 57, 116, 199, 0, 60, 118, 183, 0, 62, 117, 167,
+ 0, 61, 119, 142, 0, 61, 116, 119, 0, 59, 117, 97, 0, 57, 120, 71, 0, 58, 121, 31, 0, 61, 117, 4, 0, 73, 108, 0,
+ 0, 82, 101, 0, 0, 88, 95, 0, 0, 92, 92, 0, 0, 93, 95, 0, 0, 51, 77, 253, 0, 53, 83, 235, 0, 57, 90, 217,
+ 0, 60, 93, 202, 0, 62, 95, 182, 0, 63, 98, 162, 0, 66, 98, 143, 0, 66, 100, 125, 0, 66, 97, 98, 0, 62, 100, 78,
+ 0, 60, 103, 43, 0, 61, 99, 12, 0, 71, 92, 1, 0, 79, 86, 0, 0, 84, 81, 0, 0, 86, 78, 0, 0, 87, 78, 0,
+ 0, 50, 61, 253, 0, 50, 68, 235, 0, 54, 73, 219, 0, 57, 76, 207, 0, 60, 78, 191, 0, 64, 79, 173, 0, 66, 81, 151,
+ 0, 68, 82, 129, 0, 69, 82, 106, 0, 66, 83, 85, 0, 62, 87, 60, 0, 60, 84, 30, 0, 68, 78, 4, 0, 76, 72, 0,
+ 0, 79, 68, 0, 0, 80, 65, 0, 0, 81, 64, 0, 0, 47, 45, 254, 0, 52, 46, 244, 0, 55, 49, 231, 0, 59, 54, 214,
+ 0, 61, 57, 200, 0, 60, 63, 183, 0, 63, 65, 158, 0, 66, 66, 136, 0, 69, 67, 111, 0, 69, 67, 90, 0, 65, 68, 67,
+ 0, 64, 66, 39, 0, 71, 61, 10, 0, 74, 57, 1, 0, 76, 55, 0, 0, 76, 52, 0, 0, 76, 51, 0, 0, 44, 31, 254,
+ 0, 53, 29, 249, 0, 57, 32, 237, 0, 61, 37, 219, 0, 63, 39, 203, 0, 60, 43, 187, 0, 62, 47, 166, 0, 65, 48, 145,
+ 0, 67, 49, 120, 0, 70, 51, 98, 0, 70, 50, 78, 0, 70, 48, 59, 0, 73, 43, 21, 0, 76, 41, 2, 0, 76, 39, 0,
+ 0, 76, 38, 0, 0, 75, 37, 0, 0, 55, 16, 253, 0, 62, 15, 249, 0, 67, 17, 239, 0, 70, 22, 222, 0, 72, 25, 204,
+ 0, 73, 27, 188, 0, 74, 29, 169, 0, 74, 30, 149, 0, 74, 31, 127, 0, 74, 33, 104, 0, 72, 33, 83, 0, 73, 32, 61,
+ 0, 76, 33, 36, 0, 76, 31, 13, 0, 76, 30, 1, 0, 73, 30, 0, 0, 69, 31, 0, 0, 70, 9, 249, 0, 73, 5, 243,
+ 0, 76, 7, 232, 0, 79, 11, 218, 0, 79, 13, 202, 0, 80, 14, 185, 0, 80, 15, 168, 0, 80, 16, 149, 0, 81, 16, 129,
+ 0, 80, 17, 109, 0, 78, 19, 88, 0, 75, 19, 67, 0, 76, 19, 46, 0, 78, 21, 26, 0, 78, 19, 7, 0, 72, 21, 0,
+ 0, 64, 24, 0, 0, 84, 5, 245, 0, 85, 1, 235, 0, 86, 1, 224, 0, 85, 2, 211, 0, 85, 3, 196, 0, 84, 3, 179,
+ 0, 83, 4, 160, 0, 83, 4, 142, 0, 83, 4, 126, 0, 82, 4, 109, 0, 80, 5, 91, 0, 79, 6, 72, 0, 78, 7, 53,
+ 0, 78, 7, 33, 0, 79, 7, 15, 0, 74, 9, 2, 0, 62, 16, 0, 0, 96, 2, 241, 0, 95, 0, 225, 0, 93, 0, 211,
+ 0, 90, 0, 194, 0, 87, 0, 176, 0, 84, 0, 157, 0, 81, 0, 139, 0, 79, 0, 123, 0, 76, 0, 108, 0, 74, 0, 94,
+ 0, 72, 0, 79, 0, 71, 0, 65, 0, 71, 1, 52, 0, 70, 1, 36, 0, 69, 0, 22, 0, 68, 2, 10, 0, 58, 7, 0,
+ 0, 106, 0, 238, 0, 103, 0, 227, 0, 100, 0, 215, 0, 97, 0, 199, 0, 93, 0, 178, 0, 88, 0, 157, 0, 83, 0, 137,
+ 0, 78, 0, 118, 0, 72, 0, 98, 0, 67, 0, 82, 0, 61, 0, 66, 0, 58, 0, 55, 0, 57, 0, 46, 0, 56, 0, 36,
+ 0, 55, 0, 25, 0, 54, 0, 13, 0, 53, 0, 0, 0, 6, 221, 212, 0, 5, 224, 207, 0, 5, 228, 194, 0, 5, 232, 172,
+ 0, 6, 235, 153, 0, 9, 236, 132, 0, 13, 238, 104, 0, 20, 239, 66, 0, 28, 238, 34, 0, 35, 235, 13, 0, 41, 231, 3,
+ 0, 48, 225, 0, 0, 53, 221, 0, 0, 72, 210, 0, 0, 88, 200, 0, 0, 101, 193, 0, 0, 111, 186, 0, 0, 12, 199, 220,
+ 0, 4, 206, 216, 0, 2, 210, 201, 0, 3, 213, 182, 0, 5, 215, 162, 0, 8, 215, 138, 0, 12, 214, 115, 0, 18, 213, 82,
+ 0, 24, 212, 46, 0, 30, 210, 19, 0, 36, 205, 3, 0, 47, 198, 0, 0, 57, 190, 0, 0, 74, 183, 0, 0, 88, 178, 0,
+ 0, 99, 175, 0, 0, 106, 177, 0, 0, 16, 183, 229, 0, 8, 190, 228, 0, 6, 198, 205, 0, 6, 201, 183, 0, 8, 202, 165,
+ 0, 10, 203, 144, 0, 13, 203, 119, 0, 18, 201, 88, 0, 24, 199, 52, 0, 29, 197, 21, 0, 36, 192, 2, 0, 48, 184, 0,
+ 0, 59, 176, 0, 0, 74, 168, 0, 0, 87, 163, 0, 0, 94, 162, 0, 0, 100, 167, 0, 0, 22, 167, 237, 0, 17, 171, 238,
+ 0, 14, 179, 217, 0, 15, 182, 197, 0, 17, 182, 177, 0, 17, 186, 158, 0, 18, 189, 126, 0, 21, 188, 97, 0, 27, 185, 60,
+ 0, 31, 185, 28, 0, 37, 180, 3, 0, 50, 171, 0, 0, 61, 162, 0, 0, 75, 155, 0, 0, 83, 151, 0, 0, 90, 149, 0,
+ 0, 95, 156, 0, 0, 28, 150, 244, 0, 24, 152, 246, 0, 22, 158, 228, 0, 24, 163, 203, 0, 25, 163, 174, 0, 24, 169, 158,
+ 0, 24, 174, 131, 0, 26, 173, 106, 0, 31, 171, 70, 0, 34, 171, 37, 0, 37, 168, 7, 0, 50, 158, 0, 0, 62, 149, 0,
+ 0, 73, 142, 0, 0, 81, 137, 0, 0, 87, 135, 0, 0, 90, 143, 0, 0, 34, 131, 249, 0, 32, 131, 248, 0, 31, 137, 231,
+ 0, 30, 146, 206, 0, 30, 153, 185, 0, 31, 152, 156, 0, 31, 155, 139, 0, 31, 156, 118, 0, 34, 156, 79, 0, 37, 156, 47,
+ 0, 38, 156, 15, 0, 48, 147, 1, 0, 60, 138, 0, 0, 70, 129, 0, 0, 79, 123, 0, 0, 85, 121, 0, 0, 86, 128, 0,
+ 0, 34, 116, 251, 0, 35, 119, 239, 0, 38, 124, 221, 0, 39, 129, 208, 0, 37, 138, 190, 0, 37, 142, 166, 0, 38, 137, 137,
+ 0, 37, 139, 119, 0, 38, 140, 88, 0, 39, 140, 57, 0, 40, 141, 26, 0, 44, 136, 3, 0, 56, 127, 0, 0, 67, 117, 0,
+ 0, 76, 109, 0, 0, 82, 106, 0, 0, 82, 112, 0, 0, 34, 100, 251, 0, 37, 106, 231, 0, 41, 113, 211, 0, 41, 117, 201,
+ 0, 43, 119, 188, 0, 45, 122, 171, 0, 44, 124, 145, 0, 43, 120, 119, 0, 42, 121, 100, 0, 41, 122, 74, 0, 43, 125, 37,
+ 0, 42, 122, 7, 0, 53, 113, 0, 0, 65, 102, 0, 0, 73, 95, 0, 0, 78, 91, 0, 0, 78, 95, 0, 0, 38, 80, 252,
+ 0, 40, 89, 228, 0, 45, 94, 209, 0, 45, 98, 197, 0, 46, 99, 180, 0, 47, 102, 165, 0, 50, 100, 147, 0, 49, 103, 126,
+ 0, 48, 100, 101, 0, 45, 102, 80, 0, 45, 105, 48, 0, 44, 104, 18, 0, 50, 97, 1, 0, 62, 89, 0, 0, 69, 83, 0,
+ 0, 73, 78, 0, 0, 73, 79, 0, 0, 40, 62, 253, 0, 40, 71, 231, 0, 43, 76, 215, 0, 45, 78, 204, 0, 46, 81, 190,
+ 0, 49, 83, 171, 0, 50, 85, 146, 0, 53, 86, 129, 0, 52, 86, 106, 0, 53, 83, 84, 0, 48, 85, 63, 0, 46, 89, 38,
+ 0, 49, 83, 7, 0, 59, 76, 0, 0, 66, 70, 0, 0, 69, 66, 0, 0, 68, 66, 0, 0, 37, 47, 253, 0, 41, 52, 237,
+ 0, 43, 55, 224, 0, 45, 59, 209, 0, 46, 62, 196, 0, 47, 66, 174, 0, 53, 68, 146, 0, 54, 69, 131, 0, 54, 70, 106,
+ 0, 56, 69, 87, 0, 53, 67, 65, 0, 50, 71, 45, 0, 53, 67, 16, 0, 58, 62, 1, 0, 63, 58, 0, 0, 65, 54, 0,
+ 0, 64, 54, 0, 0, 33, 33, 255, 0, 39, 35, 242, 0, 43, 37, 229, 0, 45, 41, 213, 0, 47, 43, 198, 0, 45, 50, 183,
+ 0, 48, 52, 162, 0, 50, 53, 141, 0, 52, 54, 118, 0, 55, 54, 94, 0, 55, 52, 74, 0, 51, 54, 51, 0, 53, 52, 23,
+ 0, 57, 48, 3, 0, 61, 44, 0, 0, 61, 42, 0, 0, 60, 41, 0, 0, 31, 21, 255, 0, 40, 19, 247, 0, 45, 21, 237,
+ 0, 48, 25, 220, 0, 50, 27, 202, 0, 51, 30, 187, 0, 53, 32, 169, 0, 53, 34, 149, 0, 54, 35, 127, 0, 56, 36, 103,
+ 0, 57, 35, 80, 0, 55, 35, 62, 0, 54, 35, 45, 0, 58, 32, 10, 0, 60, 30, 1, 0, 60, 29, 0, 0, 58, 28, 0,
+ 0, 45, 11, 253, 0, 49, 8, 247, 0, 54, 9, 238, 0, 57, 13, 223, 0, 58, 15, 207, 0, 59, 16, 190, 0, 60, 18, 172,
+ 0, 59, 20, 153, 0, 61, 21, 131, 0, 61, 21, 110, 0, 60, 22, 88, 0, 59, 22, 67, 0, 60, 21, 46, 0, 62, 22, 23,
+ 0, 62, 21, 4, 0, 58, 22, 0, 0, 54, 23, 0, 0, 61, 5, 250, 0, 62, 1, 241, 0, 64, 1, 231, 0, 65, 4, 216,
+ 0, 65, 5, 201, 0, 66, 6, 185, 0, 66, 7, 165, 0, 66, 7, 146, 0, 67, 7, 128, 0, 66, 8, 109, 0, 65, 8, 91,
+ 0, 63, 9, 71, 0, 62, 10, 51, 0, 63, 9, 32, 0, 64, 11, 14, 0, 59, 12, 2, 0, 51, 16, 0, 0, 75, 2, 245,
+ 0, 75, 0, 231, 0, 74, 0, 219, 0, 72, 0, 202, 0, 71, 0, 186, 0, 70, 0, 168, 0, 68, 1, 148, 0, 67, 1, 128,
+ 0, 65, 1, 110, 0, 63, 1, 95, 0, 62, 1, 80, 0, 61, 1, 66, 0, 60, 1, 51, 0, 60, 1, 36, 0, 59, 1, 21,
+ 0, 58, 3, 8, 0, 48, 7, 0, 0, 88, 0, 241, 0, 85, 0, 232, 0, 83, 0, 221, 0, 81, 0, 206, 0, 78, 0, 186,
+ 0, 75, 0, 164, 0, 71, 0, 141, 0, 66, 0, 119, 0, 61, 0, 96, 0, 55, 0, 78, 0, 51, 0, 65, 0, 48, 0, 53,
+ 0, 47, 0, 45, 0, 47, 0, 35, 0, 47, 0, 25, 0, 46, 0, 13, 0, 43, 0, 0, 0, 4, 219, 208, 0, 4, 221, 205,
+ 0, 4, 223, 195, 0, 4, 227, 176, 0, 5, 230, 159, 0, 8, 231, 141, 0, 11, 233, 119, 0, 15, 235, 88, 0, 22, 235, 54,
+ 0, 29, 234, 28, 0, 34, 232, 11, 0, 39, 228, 3, 0, 44, 224, 0, 0, 48, 221, 0, 0, 67, 210, 0, 0, 82, 200, 0,
+ 0, 95, 192, 0, 0, 9, 199, 214, 0, 1, 204, 208, 0, 0, 207, 196, 0, 0, 209, 180, 0, 1, 211, 165, 0, 3, 212, 146,
+ 0, 6, 213, 122, 0, 9, 213, 96, 0, 15, 213, 61, 0, 20, 211, 31, 0, 25, 209, 10, 0, 34, 203, 1, 0, 43, 197, 0,
+ 0, 52, 191, 0, 0, 67, 184, 0, 0, 81, 180, 0, 0, 89, 182, 0, 0, 10, 183, 221, 0, 2, 190, 218, 0, 1, 196, 199,
+ 0, 0, 199, 179, 0, 1, 200, 165, 0, 2, 201, 148, 0, 4, 202, 123, 0, 7, 202, 98, 0, 12, 201, 64, 0, 17, 199, 31,
+ 0, 23, 196, 7, 0, 35, 189, 0, 0, 45, 181, 0, 0, 54, 175, 0, 0, 68, 168, 0, 0, 78, 165, 0, 0, 84, 172, 0,
+ 0, 15, 167, 229, 0, 7, 171, 229, 0, 4, 180, 210, 0, 3, 183, 194, 0, 3, 184, 176, 0, 5, 186, 159, 0, 5, 190, 129,
+ 0, 7, 190, 103, 0, 12, 188, 71, 0, 17, 186, 37, 0, 22, 184, 9, 0, 35, 175, 0, 0, 46, 167, 0, 0, 55, 160, 0,
+ 0, 66, 155, 0, 0, 74, 151, 0, 0, 79, 159, 0, 0, 19, 151, 236, 0, 14, 153, 238, 0, 10, 160, 221, 0, 9, 164, 202,
+ 0, 8, 167, 176, 0, 8, 171, 158, 0, 9, 175, 133, 0, 10, 175, 110, 0, 13, 172, 79, 0, 18, 171, 47, 0, 22, 171, 17,
+ 0, 31, 163, 1, 0, 44, 154, 0, 0, 53, 147, 0, 0, 63, 141, 0, 0, 72, 137, 0, 0, 75, 146, 0, 0, 24, 132, 244,
+ 0, 20, 132, 246, 0, 17, 138, 230, 0, 15, 146, 207, 0, 14, 151, 182, 0, 14, 153, 158, 0, 15, 154, 139, 0, 15, 155, 120,
+ 0, 17, 155, 86, 0, 20, 155, 55, 0, 23, 156, 25, 0, 27, 151, 3, 0, 41, 143, 0, 0, 51, 135, 0, 0, 61, 127, 0,
+ 0, 70, 122, 0, 0, 71, 131, 0, 0, 25, 116, 248, 0, 23, 117, 242, 0, 23, 121, 229, 0, 22, 129, 210, 0, 20, 135, 189,
+ 0, 19, 141, 165, 0, 21, 137, 137, 0, 20, 139, 120, 0, 20, 140, 91, 0, 22, 140, 63, 0, 23, 141, 34, 0, 24, 140, 6,
+ 0, 37, 132, 0, 0, 48, 123, 0, 0, 59, 112, 0, 0, 67, 106, 0, 0, 67, 115, 0, 0, 25, 102, 247, 0, 24, 106, 231,
+ 0, 25, 111, 214, 0, 26, 113, 203, 0, 27, 117, 192, 0, 27, 122, 171, 0, 26, 124, 144, 0, 27, 122, 120, 0, 25, 123, 101,
+ 0, 25, 124, 79, 0, 26, 124, 44, 0, 26, 126, 15, 0, 34, 118, 1, 0, 46, 107, 0, 0, 57, 97, 0, 0, 64, 91, 0,
+ 0, 63, 95, 0, 0, 26, 85, 250, 0, 26, 92, 226, 0, 28, 97, 204, 0, 29, 99, 195, 0, 30, 101, 182, 0, 32, 102, 167,
+ 0, 32, 103, 150, 0, 32, 106, 126, 0, 32, 102, 100, 0, 29, 104, 83, 0, 29, 105, 52, 0, 28, 109, 25, 0, 31, 102, 2,
+ 0, 44, 92, 0, 0, 54, 85, 0, 0, 60, 79, 0, 0, 58, 80, 0, 0, 29, 65, 252, 0, 28, 73, 230, 0, 30, 78, 213,
+ 0, 32, 82, 201, 0, 32, 85, 187, 0, 33, 86, 165, 0, 35, 87, 147, 0, 37, 87, 131, 0, 36, 88, 106, 0, 36, 87, 85,
+ 0, 33, 88, 64, 0, 29, 91, 42, 0, 31, 89, 9, 0, 42, 80, 0, 0, 52, 72, 0, 0, 57, 67, 0, 0, 55, 67, 0,
+ 0, 29, 49, 253, 0, 32, 53, 236, 0, 33, 57, 223, 0, 30, 64, 205, 0, 33, 67, 189, 0, 36, 69, 169, 0, 38, 69, 143,
+ 0, 38, 72, 130, 0, 39, 71, 106, 0, 40, 72, 87, 0, 40, 69, 65, 0, 35, 72, 47, 0, 35, 73, 20, 0, 39, 68, 2,
+ 0, 49, 60, 0, 0, 54, 56, 0, 0, 52, 56, 0, 0, 26, 36, 254, 0, 29, 39, 238, 0, 31, 43, 223, 0, 28, 49, 207,
+ 0, 30, 52, 190, 0, 33, 54, 174, 0, 35, 55, 156, 0, 37, 55, 134, 0, 40, 56, 115, 0, 41, 57, 92, 0, 43, 54, 72,
+ 0, 38, 55, 52, 0, 37, 58, 31, 0, 35, 56, 9, 0, 46, 48, 1, 0, 50, 44, 0, 0, 47, 44, 0, 0, 24, 24, 255,
+ 0, 28, 24, 239, 0, 31, 27, 224, 0, 33, 31, 211, 0, 35, 33, 195, 0, 36, 36, 181, 0, 37, 37, 164, 0, 34, 41, 146,
+ 0, 36, 42, 123, 0, 39, 41, 99, 0, 42, 39, 76, 0, 40, 39, 57, 0, 38, 42, 36, 0, 37, 41, 13, 0, 44, 36, 1,
+ 0, 46, 33, 0, 0, 44, 33, 0, 0, 21, 14, 255, 0, 28, 12, 244, 0, 33, 13, 234, 0, 36, 15, 220, 0, 37, 18, 205,
+ 0, 38, 20, 188, 0, 39, 22, 171, 0, 35, 26, 155, 0, 37, 27, 132, 0, 39, 26, 108, 0, 41, 26, 85, 0, 42, 24, 64,
+ 0, 42, 24, 46, 0, 39, 25, 33, 0, 44, 21, 4, 0, 44, 21, 0, 0, 43, 21, 0, 0, 37, 7, 253, 0, 39, 3, 245,
+ 0, 41, 3, 237, 0, 42, 5, 224, 0, 43, 7, 209, 0, 44, 8, 194, 0, 45, 9, 174, 0, 45, 11, 154, 0, 46, 11, 133,
+ 0, 46, 12, 112, 0, 47, 12, 91, 0, 46, 12, 71, 0, 46, 12, 51, 0, 48, 12, 33, 0, 49, 14, 13, 0, 45, 13, 1,
+ 0, 40, 15, 0, 0, 52, 3, 249, 0, 52, 0, 238, 0, 51, 0, 227, 0, 51, 0, 215, 0, 51, 1, 199, 0, 51, 1, 183,
+ 0, 50, 1, 163, 0, 50, 1, 141, 0, 50, 1, 121, 0, 49, 1, 101, 0, 49, 1, 84, 0, 49, 1, 69, 0, 48, 2, 53,
+ 0, 49, 1, 36, 0, 50, 2, 20, 0, 49, 4, 5, 0, 39, 8, 0, 0, 67, 0, 244, 0, 64, 0, 236, 0, 62, 0, 228,
+ 0, 61, 0, 215, 0, 60, 0, 195, 0, 58, 0, 174, 0, 55, 0, 149, 0, 52, 0, 123, 0, 47, 0, 95, 0, 43, 0, 76,
+ 0, 41, 0, 64, 0, 39, 0, 53, 0, 38, 0, 45, 0, 38, 0, 36, 0, 38, 0, 26, 0, 38, 0, 14, 0, 35, 0, 0,
+ 0, 3, 216, 204, 0, 3, 217, 202, 0, 3, 219, 195, 0, 4, 222, 180, 0, 5, 224, 164, 0, 7, 226, 149, 0, 10, 227, 130,
+ 0, 13, 229, 107, 0, 18, 231, 76, 0, 24, 231, 48, 0, 29, 231, 26, 0, 33, 229, 11, 0, 37, 226, 4, 0, 40, 222, 0,
+ 0, 44, 220, 0, 0, 61, 209, 0, 0, 76, 200, 0, 0, 6, 199, 209, 0, 1, 201, 203, 0, 0, 203, 194, 0, 0, 206, 178,
+ 0, 0, 207, 166, 0, 1, 209, 151, 0, 2, 211, 130, 0, 4, 211, 106, 0, 8, 212, 75, 0, 14, 212, 44, 0, 18, 211, 20,
+ 0, 23, 208, 4, 0, 32, 202, 1, 0, 39, 197, 0, 0, 46, 192, 0, 0, 61, 187, 0, 0, 71, 189, 0, 0, 7, 183, 215,
+ 0, 1, 188, 209, 0, 0, 192, 194, 0, 0, 195, 175, 0, 0, 197, 162, 0, 0, 198, 148, 0, 0, 199, 130, 0, 1, 200, 105,
+ 0, 3, 201, 76, 0, 8, 200, 41, 0, 12, 199, 16, 0, 20, 194, 2, 0, 32, 187, 0, 0, 40, 180, 0, 0, 47, 175, 0,
+ 0, 57, 172, 0, 0, 65, 178, 0, 0, 10, 168, 222, 0, 3, 172, 220, 0, 0, 178, 202, 0, 0, 182, 178, 0, 0, 184, 160,
+ 0, 0, 186, 148, 0, 0, 187, 131, 0, 0, 188, 109, 0, 1, 188, 83, 0, 5, 187, 50, 0, 9, 186, 20, 0, 16, 181, 2,
+ 0, 29, 173, 0, 0, 38, 166, 0, 0, 45, 161, 0, 0, 55, 157, 0, 0, 61, 166, 0, 0, 12, 152, 227, 0, 6, 155, 229,
+ 0, 2, 161, 212, 0, 1, 166, 188, 0, 1, 170, 162, 0, 1, 172, 147, 0, 1, 173, 132, 0, 1, 174, 113, 0, 1, 173, 88,
+ 0, 4, 172, 58, 0, 7, 171, 27, 0, 12, 168, 4, 0, 26, 159, 0, 0, 36, 153, 0, 0, 43, 147, 0, 0, 54, 143, 0,
+ 0, 57, 152, 0, 0, 15, 134, 234, 0, 11, 135, 237, 0, 7, 141, 222, 0, 4, 149, 199, 0, 2, 154, 173, 0, 1, 154, 152,
+ 0, 2, 154, 137, 0, 2, 155, 121, 0, 3, 156, 92, 0, 5, 155, 63, 0, 7, 155, 34, 0, 10, 154, 8, 0, 22, 146, 0,
+ 0, 33, 139, 0, 0, 42, 133, 0, 0, 52, 127, 0, 0, 54, 137, 0, 0, 17, 117, 241, 0, 15, 116, 242, 0, 12, 121, 230,
+ 0, 9, 130, 209, 0, 7, 136, 184, 0, 5, 137, 161, 0, 5, 136, 137, 0, 5, 138, 119, 0, 6, 139, 93, 0, 7, 139, 70,
+ 0, 8, 138, 42, 0, 10, 139, 15, 0, 18, 133, 1, 0, 31, 125, 0, 0, 41, 116, 0, 0, 51, 109, 0, 0, 50, 119, 0,
+ 0, 16, 104, 241, 0, 14, 105, 231, 0, 13, 109, 218, 0, 13, 112, 206, 0, 12, 116, 191, 0, 10, 121, 170, 0, 10, 126, 145,
+ 0, 10, 122, 118, 0, 10, 122, 101, 0, 10, 123, 82, 0, 11, 123, 50, 0, 11, 124, 24, 0, 16, 120, 3, 0, 30, 109, 0,
+ 0, 40, 100, 0, 0, 49, 93, 0, 0, 47, 98, 0, 0, 17, 89, 244, 0, 14, 94, 224, 0, 15, 97, 204, 0, 15, 98, 194,
+ 0, 15, 100, 183, 0, 17, 102, 170, 0, 16, 104, 150, 0, 16, 106, 126, 0, 16, 104, 101, 0, 14, 106, 84, 0, 14, 106, 57,
+ 0, 13, 107, 33, 0, 14, 107, 6, 0, 28, 95, 0, 0, 39, 87, 0, 0, 46, 80, 0, 0, 44, 81, 0, 0, 18, 69, 248,
+ 0, 16, 76, 230, 0, 17, 81, 213, 0, 18, 85, 195, 0, 18, 86, 179, 0, 19, 88, 163, 0, 20, 88, 148, 0, 22, 88, 132,
+ 0, 21, 89, 105, 0, 20, 90, 85, 0, 18, 90, 67, 0, 15, 92, 46, 0, 16, 94, 15, 0, 25, 83, 1, 0, 37, 75, 0,
+ 0, 44, 69, 0, 0, 42, 69, 0, 0, 20, 51, 251, 0, 22, 53, 240, 0, 21, 59, 225, 0, 19, 67, 200, 0, 22, 70, 182,
+ 0, 23, 72, 165, 0, 22, 74, 146, 0, 24, 74, 130, 0, 25, 74, 112, 0, 25, 74, 87, 0, 24, 73, 67, 0, 20, 75, 48,
+ 0, 18, 78, 23, 0, 21, 73, 3, 0, 34, 64, 0, 0, 42, 58, 0, 0, 39, 58, 0, 0, 19, 38, 252, 0, 20, 41, 235,
+ 0, 21, 46, 220, 0, 18, 52, 202, 0, 20, 55, 185, 0, 22, 57, 172, 0, 23, 58, 155, 0, 25, 58, 133, 0, 26, 59, 110,
+ 0, 27, 59, 91, 0, 27, 58, 72, 0, 27, 57, 51, 0, 22, 60, 33, 0, 20, 62, 13, 0, 32, 52, 1, 0, 39, 47, 0,
+ 0, 36, 47, 0, 0, 17, 27, 253, 0, 19, 29, 235, 0, 20, 33, 219, 0, 21, 36, 204, 0, 22, 38, 191, 0, 23, 41, 177,
+ 0, 24, 43, 162, 0, 22, 45, 139, 0, 27, 44, 112, 0, 28, 43, 92, 0, 29, 44, 74, 0, 29, 42, 54, 0, 27, 43, 38,
+ 0, 24, 46, 19, 0, 30, 40, 2, 0, 34, 36, 0, 0, 31, 36, 0, 0, 16, 16, 255, 0, 18, 18, 233, 0, 20, 21, 218,
+ 0, 22, 23, 204, 0, 23, 25, 192, 0, 24, 26, 178, 0, 24, 28, 163, 0, 20, 31, 146, 0, 23, 31, 124, 0, 24, 31, 101,
+ 0, 26, 30, 80, 0, 28, 28, 59, 0, 29, 28, 42, 0, 25, 32, 25, 0, 28, 29, 4, 0, 31, 25, 0, 0, 29, 25, 0,
+ 0, 14, 9, 255, 0, 19, 7, 242, 0, 21, 7, 231, 0, 23, 8, 220, 0, 24, 11, 206, 0, 25, 12, 190, 0, 26, 13, 170,
+ 0, 26, 14, 152, 0, 28, 14, 133, 0, 28, 15, 112, 0, 29, 15, 90, 0, 30, 14, 68, 0, 30, 15, 48, 0, 30, 16, 33,
+ 0, 27, 17, 22, 0, 31, 14, 0, 0, 29, 13, 0, 0, 29, 3, 253, 0, 30, 1, 244, 0, 29, 0, 235, 0, 28, 1, 225,
+ 0, 28, 2, 211, 0, 29, 2, 195, 0, 30, 2, 176, 0, 30, 3, 153, 0, 31, 3, 132, 0, 31, 4, 110, 0, 32, 4, 91,
+ 0, 33, 3, 72, 0, 33, 4, 54, 0, 33, 4, 37, 0, 38, 3, 20, 0, 36, 4, 0, 0, 29, 8, 0, 0, 45, 0, 248,
+ 0, 42, 0, 241, 0, 40, 0, 234, 0, 39, 0, 224, 0, 38, 0, 206, 0, 37, 0, 185, 0, 36, 0, 161, 0, 35, 0, 134,
+ 0, 32, 0, 101, 0, 30, 0, 81, 0, 29, 0, 66, 0, 28, 0, 55, 0, 28, 0, 46, 0, 28, 0, 37, 0, 28, 0, 28,
+ 0, 29, 0, 15, 0, 27, 0, 0, 0, 1, 213, 201, 0, 2, 214, 199, 0, 2, 215, 193, 0, 4, 217, 181, 0, 5, 219, 168,
+ 0, 7, 220, 155, 0, 9, 222, 139, 0, 12, 223, 120, 0, 16, 225, 96, 0, 21, 227, 70, 0, 25, 228, 46, 0, 29, 228, 26,
+ 0, 32, 226, 13, 0, 35, 224, 6, 0, 37, 222, 2, 0, 39, 220, 0, 0, 56, 209, 0, 0, 3, 198, 205, 0, 0, 200, 199,
+ 0, 0, 201, 190, 0, 0, 203, 177, 0, 0, 205, 167, 0, 1, 207, 154, 0, 1, 208, 137, 0, 2, 210, 115, 0, 5, 211, 90,
+ 0, 10, 211, 62, 0, 14, 211, 37, 0, 19, 210, 18, 0, 23, 208, 6, 0, 30, 203, 3, 0, 35, 199, 1, 0, 40, 196, 1,
+ 0, 48, 197, 0, 0, 3, 183, 209, 0, 0, 186, 203, 0, 0, 189, 186, 0, 0, 192, 171, 0, 0, 194, 159, 0, 0, 195, 148,
+ 0, 0, 196, 134, 0, 0, 197, 114, 0, 0, 199, 89, 0, 2, 200, 58, 0, 4, 201, 29, 0, 8, 200, 9, 0, 16, 194, 3,
+ 0, 25, 188, 1, 0, 31, 184, 1, 0, 36, 181, 0, 0, 43, 187, 0, 0, 5, 168, 215, 0, 1, 172, 210, 0, 0, 176, 193,
+ 0, 0, 179, 169, 0, 0, 181, 152, 0, 0, 183, 143, 0, 0, 183, 131, 0, 0, 184, 116, 0, 0, 185, 93, 0, 0, 186, 65,
+ 0, 1, 186, 33, 0, 3, 186, 10, 0, 11, 181, 2, 0, 21, 174, 0, 0, 28, 168, 0, 0, 34, 166, 0, 0, 38, 174, 0,
+ 0, 6, 153, 220, 0, 2, 156, 219, 0, 0, 161, 201, 0, 0, 165, 177, 0, 0, 167, 152, 0, 0, 168, 138, 0, 0, 169, 128,
+ 0, 0, 169, 115, 0, 0, 169, 95, 0, 0, 169, 71, 0, 1, 170, 41, 0, 2, 170, 14, 0, 10, 165, 2, 0, 20, 158, 0,
+ 0, 28, 153, 0, 0, 33, 150, 0, 0, 35, 160, 0, 0, 7, 135, 226, 0, 4, 138, 226, 0, 1, 144, 211, 0, 0, 149, 188,
+ 0, 0, 152, 162, 0, 0, 151, 142, 0, 0, 150, 130, 0, 0, 151, 119, 0, 0, 152, 95, 0, 0, 152, 73, 0, 1, 152, 48,
+ 0, 1, 152, 20, 0, 8, 149, 3, 0, 19, 142, 0, 0, 27, 137, 0, 0, 32, 134, 0, 0, 33, 143, 0, 0, 9, 117, 233,
+ 0, 7, 118, 234, 0, 4, 124, 223, 0, 1, 131, 202, 0, 1, 136, 175, 0, 0, 136, 152, 0, 0, 134, 128, 0, 0, 135, 113,
+ 0, 0, 136, 93, 0, 1, 135, 76, 0, 1, 135, 53, 0, 1, 136, 27, 0, 5, 135, 5, 0, 17, 127, 0, 0, 27, 120, 0,
+ 0, 32, 115, 0, 0, 31, 124, 0, 0, 8, 104, 234, 0, 6, 106, 229, 0, 4, 109, 219, 0, 3, 113, 207, 0, 2, 117, 188,
+ 0, 1, 120, 164, 0, 1, 123, 138, 0, 1, 120, 113, 0, 1, 120, 99, 0, 1, 120, 84, 0, 1, 120, 57, 0, 1, 120, 33,
+ 0, 3, 120, 9, 0, 15, 111, 2, 0, 26, 102, 0, 0, 32, 96, 0, 0, 29, 102, 0, 0, 8, 91, 237, 0, 5, 95, 224,
+ 0, 4, 97, 211, 0, 4, 99, 200, 0, 3, 101, 188, 0, 3, 103, 172, 0, 2, 106, 149, 0, 0, 109, 127, 0, 1, 104, 100,
+ 0, 2, 105, 83, 0, 1, 106, 58, 0, 1, 105, 38, 0, 2, 105, 15, 0, 13, 98, 3, 0, 24, 89, 0, 0, 31, 82, 0,
+ 0, 27, 84, 0, 0, 9, 74, 241, 0, 6, 79, 230, 0, 5, 84, 215, 0, 5, 86, 199, 0, 5, 88, 184, 0, 5, 90, 170,
+ 0, 6, 90, 155, 0, 6, 91, 134, 0, 6, 91, 106, 0, 5, 91, 83, 0, 4, 91, 67, 0, 2, 92, 49, 0, 2, 92, 22,
+ 0, 9, 88, 4, 0, 22, 78, 0, 0, 29, 71, 0, 0, 26, 72, 0, 0, 10, 54, 246, 0, 11, 56, 239, 0, 10, 61, 227,
+ 0, 7, 70, 204, 0, 7, 74, 185, 0, 7, 76, 167, 0, 9, 75, 143, 0, 10, 76, 131, 0, 12, 75, 112, 0, 11, 77, 87,
+ 0, 11, 75, 68, 0, 7, 78, 50, 0, 4, 79, 26, 0, 5, 79, 6, 0, 19, 68, 1, 0, 27, 61, 0, 0, 25, 61, 0,
+ 0, 10, 39, 249, 0, 12, 41, 238, 0, 12, 46, 224, 0, 9, 54, 205, 0, 9, 57, 188, 0, 9, 60, 173, 0, 11, 61, 154,
+ 0, 11, 63, 133, 0, 13, 62, 110, 0, 14, 61, 93, 0, 13, 61, 71, 0, 11, 62, 51, 0, 8, 63, 34, 0, 5, 65, 17,
+ 0, 17, 58, 3, 0, 26, 50, 0, 0, 23, 49, 0, 0, 9, 29, 249, 0, 10, 34, 229, 0, 10, 38, 214, 0, 10, 40, 202,
+ 0, 11, 41, 190, 0, 12, 43, 176, 0, 13, 45, 162, 0, 12, 47, 137, 0, 15, 46, 111, 0, 15, 47, 92, 0, 16, 47, 75,
+ 0, 16, 46, 54, 0, 16, 45, 35, 0, 11, 49, 21, 0, 15, 46, 4, 0, 21, 40, 0, 0, 20, 39, 0, 0, 8, 18, 253,
+ 0, 10, 24, 226, 0, 10, 28, 210, 0, 10, 29, 199, 0, 10, 30, 187, 0, 11, 31, 174, 0, 11, 32, 161, 0, 8, 35, 139,
+ 0, 11, 34, 115, 0, 13, 34, 95, 0, 16, 32, 76, 0, 16, 32, 59, 0, 17, 32, 40, 0, 12, 35, 24, 0, 11, 37, 8,
+ 0, 15, 32, 2, 0, 16, 29, 0, 0, 8, 10, 255, 0, 10, 16, 224, 0, 10, 18, 208, 0, 10, 18, 197, 0, 11, 19, 186,
+ 0, 11, 19, 173, 0, 12, 19, 160, 0, 12, 19, 143, 0, 13, 20, 122, 0, 10, 22, 103, 0, 12, 21, 82, 0, 14, 20, 63,
+ 0, 15, 20, 43, 0, 15, 20, 27, 0, 11, 23, 9, 0, 16, 21, 0, 0, 14, 19, 0, 0, 7, 4, 255, 0, 11, 4, 242,
+ 0, 11, 4, 231, 0, 11, 4, 219, 0, 11, 5, 204, 0, 11, 5, 188, 0, 12, 5, 172, 0, 13, 6, 149, 0, 13, 7, 129,
+ 0, 10, 10, 109, 0, 11, 9, 89, 0, 14, 8, 71, 0, 15, 8, 51, 0, 15, 8, 35, 0, 18, 6, 22, 0, 13, 8, 11,
+ 0, 14, 7, 0, 0, 22, 0, 251, 0, 20, 0, 247, 0, 18, 0, 241, 0, 16, 0, 232, 0, 15, 0, 217, 0, 14, 0, 198,
+ 0, 14, 0, 179, 0, 14, 0, 155, 0, 15, 0, 119, 0, 15, 0, 97, 0, 15, 0, 78, 0, 15, 0, 61, 0, 16, 0, 49,
+ 0, 15, 0, 37, 0, 15, 0, 26, 0, 14, 0, 14, 0, 13, 0, 0, 0, 0, 211, 197, 0, 0, 210, 195, 0, 2, 211, 190,
+ 0, 3, 212, 180, 0, 5, 213, 170, 0, 7, 214, 159, 0, 9, 215, 146, 0, 12, 217, 131, 0, 15, 218, 113, 0, 19, 221, 92,
+ 0, 23, 222, 69, 0, 27, 223, 48, 0, 30, 223, 31, 0, 32, 222, 18, 0, 33, 221, 9, 0, 33, 221, 4, 0, 33, 220, 0,
+ 0, 0, 196, 201, 0, 0, 202, 186, 0, 0, 203, 180, 0, 0, 204, 171, 0, 0, 206, 161, 0, 0, 207, 151, 0, 2, 209, 141,
+ 0, 4, 209, 126, 0, 7, 210, 109, 0, 11, 211, 87, 0, 16, 211, 65, 0, 20, 211, 48, 0, 24, 211, 34, 0, 26, 210, 23,
+ 0, 27, 208, 14, 0, 26, 207, 7, 0, 22, 205, 0, 0, 0, 182, 205, 0, 0, 188, 192, 0, 0, 194, 173, 0, 0, 195, 164,
+ 0, 0, 197, 153, 0, 0, 198, 145, 0, 0, 199, 135, 0, 0, 199, 121, 0, 0, 200, 103, 0, 2, 203, 80, 0, 6, 203, 56,
+ 0, 10, 203, 39, 0, 14, 202, 25, 0, 16, 201, 14, 0, 17, 199, 7, 0, 17, 198, 2, 0, 16, 195, 0, 0, 0, 169, 208,
+ 0, 0, 174, 199, 0, 0, 179, 182, 0, 0, 183, 159, 0, 0, 185, 146, 0, 0, 186, 137, 0, 0, 187, 129, 0, 0, 187, 118,
+ 0, 0, 188, 102, 0, 0, 190, 80, 0, 0, 191, 54, 0, 2, 192, 32, 0, 4, 192, 17, 0, 6, 191, 6, 0, 9, 188, 1,
+ 0, 11, 185, 0, 0, 11, 184, 0, 0, 0, 154, 212, 0, 0, 159, 204, 0, 0, 164, 189, 0, 0, 168, 168, 0, 0, 171, 142,
+ 0, 0, 172, 131, 0, 0, 172, 122, 0, 0, 173, 113, 0, 0, 173, 101, 0, 0, 173, 85, 0, 0, 174, 64, 0, 0, 176, 38,
+ 0, 0, 176, 16, 0, 1, 175, 3, 0, 6, 171, 0, 0, 9, 169, 0, 0, 9, 167, 0, 0, 0, 137, 217, 0, 0, 142, 210,
+ 0, 0, 148, 197, 0, 0, 152, 177, 0, 0, 154, 152, 0, 0, 155, 123, 0, 0, 155, 114, 0, 0, 155, 107, 0, 0, 155, 98,
+ 0, 0, 155, 86, 0, 0, 155, 68, 0, 0, 156, 45, 0, 0, 157, 20, 0, 0, 156, 3, 0, 6, 152, 0, 0, 8, 150, 0,
+ 0, 8, 149, 0, 0, 0, 120, 222, 0, 0, 124, 218, 0, 0, 130, 206, 0, 0, 135, 188, 0, 0, 138, 164, 0, 0, 139, 136,
+ 0, 0, 137, 107, 0, 0, 137, 100, 0, 0, 136, 93, 0, 0, 136, 83, 0, 0, 135, 69, 0, 0, 136, 50, 0, 0, 136, 27,
+ 0, 0, 136, 6, 0, 4, 133, 0, 0, 8, 131, 0, 0, 7, 129, 0, 0, 0, 105, 226, 0, 0, 108, 220, 0, 0, 113, 211,
+ 0, 0, 117, 199, 0, 0, 121, 177, 0, 0, 124, 151, 0, 0, 122, 121, 0, 0, 119, 94, 0, 0, 119, 89, 0, 0, 118, 81,
+ 0, 0, 117, 67, 0, 0, 117, 50, 0, 0, 116, 31, 0, 0, 116, 12, 0, 4, 114, 2, 0, 7, 110, 0, 0, 7, 108, 0,
+ 0, 0, 92, 229, 0, 0, 96, 219, 0, 0, 99, 210, 0, 0, 101, 200, 0, 0, 104, 185, 0, 0, 108, 164, 0, 0, 108, 137,
+ 0, 0, 105, 108, 0, 0, 101, 79, 0, 0, 101, 75, 0, 0, 100, 64, 0, 0, 99, 50, 0, 0, 98, 34, 0, 0, 97, 17,
+ 0, 2, 96, 4, 0, 6, 91, 0, 0, 7, 90, 0, 0, 0, 78, 233, 0, 0, 82, 225, 0, 0, 85, 214, 0, 0, 88, 201,
+ 0, 0, 90, 186, 0, 0, 93, 168, 0, 0, 93, 146, 0, 0, 92, 124, 0, 0, 89, 88, 0, 0, 89, 69, 0, 0, 88, 63,
+ 0, 0, 88, 53, 0, 0, 87, 36, 0, 0, 86, 21, 0, 0, 84, 6, 0, 4, 80, 0, 0, 8, 76, 0, 0, 0, 59, 239,
+ 0, 0, 60, 235, 0, 0, 66, 225, 0, 0, 73, 207, 0, 0, 77, 188, 0, 0, 79, 166, 0, 0, 72, 134, 0, 0, 73, 120,
+ 0, 0, 75, 98, 0, 0, 75, 73, 0, 0, 77, 59, 0, 0, 76, 52, 0, 0, 76, 37, 0, 0, 75, 24, 0, 0, 73, 9,
+ 0, 4, 70, 1, 0, 8, 65, 0, 0, 0, 41, 244, 0, 0, 43, 234, 0, 0, 48, 222, 0, 0, 54, 207, 0, 0, 60, 191,
+ 0, 0, 65, 169, 0, 0, 64, 145, 0, 0, 63, 124, 0, 0, 60, 95, 0, 0, 59, 80, 0, 0, 62, 61, 0, 0, 64, 48,
+ 0, 0, 63, 39, 0, 0, 62, 28, 0, 0, 61, 11, 0, 2, 60, 1, 0, 8, 54, 0, 0, 0, 28, 247, 0, 0, 33, 232,
+ 0, 0, 37, 220, 0, 0, 40, 205, 0, 0, 43, 189, 0, 0, 46, 172, 0, 0, 49, 155, 0, 0, 50, 130, 0, 0, 48, 95,
+ 0, 0, 46, 78, 0, 0, 46, 67, 0, 0, 46, 46, 0, 0, 49, 35, 0, 0, 50, 27, 0, 0, 49, 14, 0, 1, 48, 3,
+ 0, 6, 43, 0, 0, 0, 19, 250, 0, 0, 31, 215, 0, 0, 34, 203, 0, 0, 35, 193, 0, 0, 35, 181, 0, 0, 35, 171,
+ 0, 0, 35, 157, 0, 0, 37, 134, 0, 0, 36, 104, 0, 0, 34, 82, 0, 0, 34, 64, 0, 0, 33, 52, 0, 0, 33, 35,
+ 0, 0, 37, 27, 0, 0, 37, 18, 0, 0, 36, 9, 0, 3, 33, 0, 0, 0, 11, 252, 0, 0, 23, 210, 0, 0, 26, 197,
+ 0, 0, 26, 188, 0, 0, 26, 178, 0, 0, 25, 167, 0, 0, 24, 155, 0, 0, 25, 137, 0, 0, 24, 111, 0, 0, 25, 85,
+ 0, 0, 24, 67, 0, 0, 22, 52, 0, 0, 22, 38, 0, 0, 22, 27, 0, 0, 25, 18, 0, 0, 25, 11, 0, 0, 24, 0,
+ 0, 0, 4, 255, 0, 0, 16, 210, 0, 0, 19, 194, 0, 0, 18, 182, 0, 0, 17, 170, 0, 0, 15, 160, 0, 0, 14, 148,
+ 0, 0, 13, 131, 0, 0, 13, 104, 0, 0, 14, 81, 0, 0, 14, 67, 0, 0, 13, 56, 0, 0, 13, 43, 0, 0, 13, 30,
+ 0, 0, 12, 17, 0, 0, 13, 9, 0, 0, 12, 0, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 251, 0, 0, 0, 236,
+ 0, 0, 0, 215, 0, 0, 0, 196, 0, 0, 0, 177, 0, 0, 0, 150, 0, 0, 0, 118, 0, 0, 0, 96, 0, 0, 0, 82,
+ 0, 0, 0, 67, 0, 0, 0, 51, 0, 0, 0, 35, 0, 0, 0, 19, 0, 0, 0, 10, 0, 0, 0, 0
+};
+
+// Acapulco Best KCMY RGB
+unsigned char ucMapDJ4100_KCMY_BestA_12x12x1[] =
+{
+ 0, 226, 237, 232, 0, 229, 225, 208, 0, 231, 213, 185, 0, 233, 201, 161, 0, 235, 196, 136, 0, 239, 192, 116, 0, 244, 187, 103,
+ 0, 246, 181, 89, 0, 247, 171, 73, 0, 249, 161, 56, 0, 250, 152, 38, 0, 251, 143, 20, 0, 251, 136, 6, 0, 250, 131, 0,
+ 0, 251, 129, 0, 0, 252, 127, 0, 0, 252, 125, 0, 0, 219, 211, 234, 0, 230, 219, 224, 0, 232, 209, 189, 0, 232, 192, 159,
+ 0, 235, 190, 128, 0, 242, 185, 103, 0, 245, 182, 91, 0, 247, 174, 77, 0, 248, 165, 63, 0, 249, 157, 47, 0, 250, 149, 30,
+ 0, 251, 141, 14, 0, 250, 135, 2, 0, 249, 132, 0, 0, 248, 131, 0, 0, 248, 129, 0, 0, 247, 127, 0, 0, 212, 186, 237,
+ 0, 220, 194, 234, 0, 234, 200, 216, 0, 232, 185, 171, 0, 232, 179, 134, 0, 237, 177, 104, 0, 242, 171, 82, 0, 247, 163, 62,
+ 0, 248, 157, 47, 0, 249, 150, 32, 0, 249, 143, 18, 0, 248, 137, 6, 0, 245, 134, 0, 0, 244, 133, 0, 0, 243, 132, 0,
+ 0, 242, 130, 0, 0, 242, 128, 0, 0, 209, 171, 239, 0, 213, 173, 235, 0, 218, 169, 216, 0, 226, 170, 186, 0, 228, 164, 147,
+ 0, 230, 161, 114, 0, 234, 158, 88, 0, 239, 153, 63, 0, 240, 149, 44, 0, 239, 145, 30, 0, 239, 141, 17, 0, 239, 136, 7,
+ 0, 236, 134, 1, 0, 233, 132, 0, 0, 233, 131, 0, 0, 233, 129, 0, 0, 232, 127, 0, 0, 206, 153, 241, 0, 210, 152, 238,
+ 0, 214, 149, 220, 0, 218, 150, 191, 0, 221, 149, 161, 0, 225, 145, 128, 0, 226, 143, 100, 0, 229, 140, 74, 0, 229, 138, 55,
+ 0, 226, 137, 42, 0, 225, 136, 29, 0, 224, 134, 18, 0, 223, 132, 9, 0, 222, 131, 5, 0, 221, 129, 3, 0, 220, 127, 1,
+ 0, 220, 124, 0, 0, 206, 129, 243, 0, 210, 125, 240, 0, 212, 126, 224, 0, 211, 129, 195, 0, 212, 132, 168, 0, 215, 130, 138,
+ 0, 218, 129, 112, 0, 221, 127, 85, 0, 220, 126, 64, 0, 217, 127, 50, 0, 215, 127, 39, 0, 214, 126, 28, 0, 214, 125, 17,
+ 0, 213, 123, 11, 0, 212, 122, 7, 0, 211, 120, 3, 0, 210, 118, 0, 0, 207, 103, 245, 0, 210, 100, 243, 0, 211, 102, 228,
+ 0, 207, 107, 199, 0, 208, 113, 175, 0, 210, 114, 150, 0, 212, 113, 119, 0, 214, 113, 96, 0, 215, 111, 73, 0, 213, 113, 55,
+ 0, 211, 114, 42, 0, 209, 115, 32, 0, 208, 115, 22, 0, 207, 114, 15, 0, 206, 113, 9, 0, 205, 112, 4, 0, 204, 110, 0,
+ 0, 207, 79, 246, 0, 209, 76, 244, 0, 210, 78, 233, 0, 206, 87, 206, 0, 205, 93, 183, 0, 206, 95, 160, 0, 208, 97, 132,
+ 0, 209, 96, 101, 0, 212, 96, 81, 0, 212, 95, 61, 0, 210, 98, 45, 0, 207, 102, 34, 0, 204, 104, 24, 0, 202, 104, 17,
+ 0, 200, 104, 11, 0, 199, 102, 5, 0, 197, 101, 0, 0, 206, 57, 247, 0, 208, 54, 246, 0, 210, 55, 238, 0, 205, 65, 213,
+ 0, 203, 73, 189, 0, 204, 77, 168, 0, 205, 79, 144, 0, 206, 80, 115, 0, 206, 80, 86, 0, 208, 80, 68, 0, 209, 81, 50,
+ 0, 206, 85, 37, 0, 203, 89, 26, 0, 199, 93, 18, 0, 196, 94, 12, 0, 193, 93, 6, 0, 191, 92, 0, 0, 203, 37, 247,
+ 0, 206, 34, 247, 0, 208, 32, 243, 0, 206, 42, 222, 0, 201, 52, 195, 0, 201, 58, 174, 0, 201, 62, 153, 0, 202, 63, 128,
+ 0, 202, 64, 99, 0, 202, 64, 71, 0, 204, 65, 55, 0, 205, 68, 41, 0, 203, 73, 29, 0, 199, 78, 20, 0, 194, 81, 12,
+ 0, 190, 82, 6, 0, 187, 82, 0, 0, 200, 22, 247, 0, 202, 18, 246, 0, 203, 17, 241, 0, 203, 22, 226, 0, 201, 34, 202,
+ 0, 199, 39, 181, 0, 198, 44, 161, 0, 198, 47, 139, 0, 199, 48, 113, 0, 199, 49, 85, 0, 199, 51, 59, 0, 201, 54, 45,
+ 0, 201, 57, 33, 0, 199, 62, 23, 0, 194, 67, 14, 0, 189, 71, 7, 0, 185, 73, 0, 0, 198, 15, 247, 0, 199, 12, 246,
+ 0, 200, 11, 239, 0, 199, 13, 226, 0, 197, 22, 205, 0, 196, 26, 186, 0, 195, 31, 167, 0, 195, 35, 148, 0, 195, 37, 126,
+ 0, 197, 38, 101, 0, 198, 39, 75, 0, 197, 41, 48, 0, 198, 43, 36, 0, 197, 46, 25, 0, 194, 52, 15, 0, 189, 57, 7,
+ 0, 185, 62, 0, 0, 196, 11, 247, 0, 197, 9, 246, 0, 198, 8, 240, 0, 197, 10, 228, 0, 195, 16, 209, 0, 193, 18, 191,
+ 0, 193, 22, 174, 0, 193, 26, 156, 0, 192, 29, 138, 0, 193, 31, 115, 0, 195, 31, 91, 0, 196, 31, 66, 0, 196, 32, 38,
+ 0, 195, 34, 27, 0, 193, 38, 17, 0, 189, 43, 8, 0, 185, 48, 0, 0, 195, 8, 247, 0, 196, 6, 246, 0, 196, 5, 241,
+ 0, 195, 6, 230, 0, 194, 9, 214, 0, 192, 13, 197, 0, 191, 15, 180, 0, 191, 18, 164, 0, 190, 21, 147, 0, 191, 22, 127,
+ 0, 192, 23, 105, 0, 193, 23, 81, 0, 194, 23, 55, 0, 194, 23, 27, 0, 191, 26, 17, 0, 188, 30, 8, 0, 185, 35, 0,
+ 0, 193, 6, 247, 0, 194, 4, 246, 0, 194, 3, 241, 0, 193, 4, 231, 0, 193, 5, 218, 0, 191, 8, 202, 0, 190, 9, 186,
+ 0, 190, 11, 170, 0, 189, 13, 154, 0, 189, 14, 137, 0, 189, 15, 116, 0, 190, 15, 94, 0, 191, 14, 71, 0, 192, 14, 45,
+ 0, 192, 15, 17, 0, 188, 18, 8, 0, 185, 22, 0, 0, 192, 3, 246, 0, 192, 2, 245, 0, 192, 2, 241, 0, 192, 2, 232,
+ 0, 191, 2, 221, 0, 190, 4, 206, 0, 189, 4, 192, 0, 189, 5, 177, 0, 188, 6, 162, 0, 188, 7, 145, 0, 188, 7, 126,
+ 0, 188, 7, 106, 0, 189, 7, 84, 0, 189, 6, 61, 0, 190, 7, 35, 0, 190, 7, 8, 0, 185, 10, 0, 0, 190, 0, 246,
+ 0, 190, 0, 244, 0, 190, 0, 239, 0, 189, 0, 232, 0, 189, 0, 222, 0, 188, 0, 209, 0, 188, 0, 196, 0, 187, 0, 183,
+ 0, 187, 0, 168, 0, 187, 0, 152, 0, 187, 0, 135, 0, 187, 0, 116, 0, 187, 0, 96, 0, 187, 0, 75, 0, 187, 0, 51,
+ 0, 187, 0, 27, 0, 187, 0, 0, 0, 209, 226, 235, 0, 198, 241, 212, 0, 215, 219, 180, 0, 212, 212, 156, 0, 212, 206, 125,
+ 0, 218, 201, 99, 0, 225, 195, 78, 0, 228, 185, 58, 0, 231, 175, 44, 0, 233, 168, 34, 0, 235, 160, 22, 0, 238, 153, 9,
+ 0, 238, 147, 2, 0, 241, 142, 0, 0, 244, 138, 0, 0, 245, 134, 0, 0, 247, 131, 0, 0, 209, 213, 238, 0, 214, 217, 231,
+ 0, 216, 218, 200, 0, 220, 200, 158, 0, 226, 193, 122, 0, 235, 182, 93, 0, 241, 176, 70, 0, 244, 168, 55, 0, 245, 161, 42,
+ 0, 247, 153, 29, 0, 248, 146, 17, 0, 248, 139, 5, 0, 246, 135, 0, 0, 243, 133, 0, 0, 242, 132, 0, 0, 242, 131, 0,
+ 0, 240, 130, 0, 0, 201, 188, 241, 0, 205, 189, 239, 0, 216, 198, 228, 0, 217, 179, 170, 0, 222, 178, 133, 0, 230, 175, 102,
+ 0, 238, 168, 74, 0, 244, 160, 51, 0, 248, 152, 33, 0, 250, 145, 19, 0, 250, 138, 7, 0, 248, 134, 1, 0, 243, 132, 0,
+ 0, 239, 131, 0, 0, 237, 131, 0, 0, 236, 130, 0, 0, 235, 130, 0, 0, 202, 171, 241, 0, 206, 170, 240, 0, 212, 168, 226,
+ 0, 213, 167, 188, 0, 216, 164, 151, 0, 221, 161, 117, 0, 227, 157, 86, 0, 233, 153, 58, 0, 238, 146, 35, 0, 243, 139, 15,
+ 0, 244, 133, 3, 0, 240, 131, 0, 0, 235, 131, 0, 0, 231, 130, 0, 0, 228, 130, 0, 0, 227, 129, 0, 0, 227, 129, 0,
+ 0, 202, 151, 243, 0, 206, 147, 241, 0, 211, 143, 231, 0, 210, 145, 196, 0, 211, 148, 166, 0, 215, 144, 132, 0, 217, 142, 101,
+ 0, 223, 139, 74, 0, 228, 136, 49, 0, 232, 131, 27, 0, 234, 127, 8, 0, 230, 126, 2, 0, 225, 127, 1, 0, 221, 127, 0,
+ 0, 218, 126, 0, 0, 217, 126, 0, 0, 217, 126, 0, 0, 203, 127, 245, 0, 206, 123, 244, 0, 211, 119, 237, 0, 209, 122, 204,
+ 0, 208, 129, 175, 0, 211, 129, 146, 0, 213, 128, 117, 0, 216, 126, 88, 0, 217, 125, 64, 0, 221, 123, 43, 0, 224, 119, 23,
+ 0, 223, 116, 7, 0, 219, 117, 2, 0, 215, 118, 1, 0, 212, 118, 1, 0, 211, 118, 0, 0, 210, 119, 0, 0, 203, 102, 246,
+ 0, 206, 100, 245, 0, 210, 95, 241, 0, 209, 100, 215, 0, 207, 107, 185, 0, 208, 111, 158, 0, 210, 111, 129, 0, 212, 111, 102,
+ 0, 214, 109, 76, 0, 214, 110, 54, 0, 214, 109, 36, 0, 214, 108, 19, 0, 213, 106, 7, 0, 211, 107, 2, 0, 208, 108, 1,
+ 0, 206, 109, 0, 0, 203, 110, 0, 0, 204, 78, 246, 0, 205, 76, 246, 0, 209, 73, 243, 0, 207, 79, 222, 0, 204, 88, 192,
+ 0, 205, 91, 168, 0, 207, 93, 142, 0, 209, 94, 113, 0, 211, 93, 88, 0, 212, 93, 65, 0, 210, 95, 45, 0, 209, 96, 27,
+ 0, 208, 95, 13, 0, 206, 96, 4, 0, 203, 97, 1, 0, 200, 99, 0, 0, 197, 101, 0, 0, 203, 57, 247, 0, 204, 56, 247,
+ 0, 207, 52, 245, 0, 207, 56, 228, 0, 202, 67, 199, 0, 202, 73, 176, 0, 204, 76, 152, 0, 204, 77, 125, 0, 206, 77, 98,
+ 0, 207, 77, 75, 0, 208, 78, 55, 0, 207, 80, 36, 0, 205, 83, 20, 0, 203, 84, 8, 0, 199, 86, 2, 0, 195, 88, 1,
+ 0, 190, 92, 0, 0, 200, 36, 248, 0, 201, 36, 248, 0, 204, 33, 246, 0, 205, 36, 235, 0, 201, 50, 206, 0, 200, 55, 183,
+ 0, 200, 59, 160, 0, 200, 61, 136, 0, 201, 62, 108, 0, 202, 62, 84, 0, 203, 62, 64, 0, 204, 63, 45, 0, 203, 67, 28,
+ 0, 200, 71, 14, 0, 196, 75, 6, 0, 191, 78, 1, 0, 185, 82, 0, 0, 197, 21, 247, 0, 198, 22, 247, 0, 200, 19, 246,
+ 0, 202, 18, 237, 0, 200, 31, 212, 0, 198, 36, 190, 0, 197, 42, 168, 0, 197, 45, 146, 0, 197, 47, 121, 0, 198, 47, 95,
+ 0, 199, 47, 72, 0, 200, 48, 53, 0, 200, 51, 35, 0, 198, 55, 21, 0, 195, 61, 10, 0, 190, 66, 3, 0, 183, 72, 0,
+ 0, 195, 15, 247, 0, 195, 10, 247, 0, 197, 7, 245, 0, 198, 7, 236, 0, 196, 16, 215, 0, 195, 23, 194, 0, 194, 28, 174,
+ 0, 194, 31, 154, 0, 194, 33, 132, 0, 195, 34, 107, 0, 196, 35, 83, 0, 196, 35, 61, 0, 197, 37, 42, 0, 196, 40, 27,
+ 0, 193, 45, 14, 0, 189, 52, 5, 0, 181, 61, 0, 0, 194, 11, 247, 0, 193, 3, 246, 0, 193, 1, 242, 0, 194, 2, 233,
+ 0, 193, 7, 214, 0, 192, 12, 196, 0, 191, 16, 178, 0, 190, 19, 160, 0, 190, 22, 140, 0, 191, 25, 119, 0, 192, 25, 95,
+ 0, 193, 25, 72, 0, 193, 25, 48, 0, 193, 28, 31, 0, 191, 31, 18, 0, 188, 37, 7, 0, 181, 47, 0, 0, 193, 8, 247,
+ 0, 189, 1, 241, 0, 189, 0, 237, 0, 190, 1, 229, 0, 190, 2, 215, 0, 189, 5, 199, 0, 188, 8, 182, 0, 187, 11, 165,
+ 0, 187, 13, 147, 0, 187, 15, 128, 0, 188, 16, 106, 0, 189, 15, 83, 0, 190, 15, 59, 0, 191, 15, 36, 0, 189, 19, 21,
+ 0, 186, 25, 10, 0, 182, 34, 0, 0, 192, 5, 247, 0, 187, 1, 238, 0, 186, 0, 233, 0, 187, 0, 226, 0, 187, 1, 215,
+ 0, 187, 1, 202, 0, 186, 3, 186, 0, 185, 4, 170, 0, 185, 6, 153, 0, 185, 7, 136, 0, 185, 8, 116, 0, 186, 8, 94,
+ 0, 186, 7, 72, 0, 187, 7, 47, 0, 188, 7, 24, 0, 185, 12, 11, 0, 180, 22, 0, 0, 190, 3, 246, 0, 185, 0, 237,
+ 0, 184, 0, 232, 0, 185, 0, 225, 0, 185, 0, 216, 0, 184, 0, 203, 0, 184, 1, 189, 0, 184, 1, 174, 0, 183, 1, 159,
+ 0, 183, 2, 142, 0, 183, 2, 124, 0, 183, 2, 104, 0, 184, 2, 83, 0, 184, 2, 60, 0, 185, 1, 37, 0, 184, 2, 14,
+ 0, 179, 9, 0, 0, 189, 0, 246, 0, 186, 0, 235, 0, 186, 0, 232, 0, 186, 0, 226, 0, 186, 0, 217, 0, 186, 0, 205,
+ 0, 184, 0, 192, 0, 184, 0, 178, 0, 183, 0, 164, 0, 183, 0, 148, 0, 183, 0, 131, 0, 183, 0, 112, 0, 182, 0, 93,
+ 0, 182, 0, 72, 0, 182, 0, 48, 0, 182, 0, 25, 0, 181, 0, 0, 0, 192, 215, 238, 0, 175, 233, 228, 0, 169, 246, 192,
+ 0, 193, 225, 156, 0, 197, 213, 122, 0, 201, 207, 95, 0, 206, 200, 73, 0, 209, 192, 53, 0, 212, 182, 40, 0, 214, 173, 32,
+ 0, 217, 165, 25, 0, 219, 157, 15, 0, 223, 151, 7, 0, 229, 148, 3, 0, 233, 144, 0, 0, 238, 141, 0, 0, 240, 138, 0,
+ 0, 192, 204, 242, 0, 196, 211, 239, 0, 194, 220, 200, 0, 201, 207, 157, 0, 204, 200, 119, 0, 208, 194, 89, 0, 213, 185, 64,
+ 0, 217, 175, 43, 0, 224, 168, 21, 0, 228, 159, 7, 0, 230, 153, 4, 0, 230, 148, 2, 0, 229, 145, 1, 0, 229, 142, 0,
+ 0, 231, 140, 0, 0, 232, 137, 0, 0, 234, 136, 0, 0, 192, 189, 244, 0, 197, 189, 243, 0, 198, 181, 210, 0, 201, 184, 168,
+ 0, 205, 181, 134, 0, 211, 176, 103, 0, 219, 168, 77, 0, 226, 162, 53, 0, 233, 156, 29, 0, 239, 147, 9, 0, 239, 141, 1,
+ 0, 237, 138, 0, 0, 233, 137, 0, 0, 230, 135, 0, 0, 227, 134, 0, 0, 226, 133, 0, 0, 227, 132, 0, 0, 195, 169, 244,
+ 0, 197, 168, 240, 0, 199, 167, 219, 0, 199, 165, 185, 0, 203, 163, 150, 0, 207, 161, 118, 0, 212, 159, 90, 0, 218, 154, 64,
+ 0, 224, 150, 41, 0, 230, 144, 18, 0, 233, 137, 2, 0, 230, 135, 0, 0, 226, 134, 0, 0, 223, 133, 0, 0, 220, 131, 0,
+ 0, 218, 130, 0, 0, 219, 131, 0, 0, 196, 147, 245, 0, 199, 145, 243, 0, 201, 144, 230, 0, 198, 144, 192, 0, 200, 148, 165,
+ 0, 203, 145, 133, 0, 207, 143, 103, 0, 210, 141, 77, 0, 214, 139, 53, 0, 217, 136, 31, 0, 221, 132, 9, 0, 219, 130, 1,
+ 0, 217, 129, 0, 0, 215, 128, 0, 0, 213, 127, 0, 0, 213, 126, 0, 0, 213, 127, 0, 0, 198, 126, 246, 0, 201, 122, 245,
+ 0, 204, 119, 238, 0, 200, 124, 203, 0, 200, 129, 175, 0, 202, 130, 148, 0, 206, 129, 118, 0, 208, 128, 90, 0, 210, 127, 66,
+ 0, 212, 125, 43, 0, 214, 121, 22, 0, 215, 119, 5, 0, 213, 119, 0, 0, 211, 119, 0, 0, 209, 119, 0, 0, 208, 119, 0,
+ 0, 207, 120, 0, 0, 199, 102, 247, 0, 201, 99, 246, 0, 205, 95, 243, 0, 203, 102, 216, 0, 201, 108, 185, 0, 202, 111, 159,
+ 0, 204, 112, 131, 0, 206, 112, 103, 0, 207, 111, 77, 0, 208, 112, 55, 0, 209, 110, 35, 0, 210, 108, 15, 0, 210, 106, 3,
+ 0, 208, 107, 0, 0, 205, 109, 0, 0, 203, 109, 0, 0, 201, 111, 0, 0, 199, 79, 247, 0, 201, 76, 247, 0, 204, 73, 245,
+ 0, 203, 79, 224, 0, 200, 87, 193, 0, 201, 91, 169, 0, 202, 93, 143, 0, 204, 94, 116, 0, 206, 94, 90, 0, 206, 94, 67,
+ 0, 206, 96, 45, 0, 206, 96, 25, 0, 205, 95, 9, 0, 204, 95, 1, 0, 201, 97, 0, 0, 198, 99, 0, 0, 195, 101, 0,
+ 0, 198, 58, 248, 0, 200, 57, 248, 0, 203, 53, 246, 0, 203, 57, 230, 0, 199, 68, 201, 0, 199, 72, 178, 0, 200, 76, 154,
+ 0, 201, 77, 128, 0, 202, 77, 101, 0, 203, 78, 78, 0, 204, 79, 57, 0, 203, 81, 37, 0, 202, 82, 18, 0, 200, 83, 5,
+ 0, 196, 85, 0, 0, 193, 88, 0, 0, 189, 92, 0, 0, 196, 37, 248, 0, 197, 37, 248, 0, 200, 35, 247, 0, 202, 38, 235,
+ 0, 198, 51, 207, 0, 196, 55, 185, 0, 197, 59, 163, 0, 197, 61, 139, 0, 198, 62, 112, 0, 199, 62, 87, 0, 200, 63, 66,
+ 0, 201, 64, 47, 0, 200, 66, 27, 0, 197, 70, 12, 0, 194, 74, 3, 0, 189, 77, 0, 0, 183, 82, 0, 0, 193, 22, 247,
+ 0, 194, 23, 247, 0, 197, 21, 247, 0, 199, 21, 238, 0, 197, 32, 214, 0, 195, 38, 192, 0, 194, 42, 171, 0, 194, 46, 149,
+ 0, 195, 47, 124, 0, 196, 48, 98, 0, 196, 48, 76, 0, 197, 48, 55, 0, 197, 50, 36, 0, 195, 54, 20, 0, 192, 59, 7,
+ 0, 187, 65, 1, 0, 179, 72, 0, 0, 192, 15, 247, 0, 192, 10, 247, 0, 194, 8, 245, 0, 196, 9, 237, 0, 194, 17, 218,
+ 0, 193, 23, 197, 0, 192, 28, 176, 0, 191, 31, 156, 0, 192, 33, 134, 0, 192, 35, 110, 0, 193, 35, 86, 0, 193, 35, 64,
+ 0, 193, 36, 44, 0, 193, 38, 27, 0, 190, 43, 13, 0, 186, 50, 3, 0, 178, 60, 0, 0, 191, 11, 247, 0, 189, 2, 245,
+ 0, 190, 1, 240, 0, 191, 1, 232, 0, 190, 7, 216, 0, 189, 12, 198, 0, 189, 16, 180, 0, 188, 18, 161, 0, 188, 21, 142,
+ 0, 188, 23, 120, 0, 189, 24, 96, 0, 189, 24, 74, 0, 190, 24, 51, 0, 190, 26, 33, 0, 188, 30, 18, 0, 185, 35, 6,
+ 0, 177, 46, 0, 0, 190, 8, 247, 0, 186, 1, 241, 0, 185, 0, 232, 0, 186, 0, 224, 0, 187, 2, 213, 0, 186, 4, 198,
+ 0, 185, 6, 182, 0, 184, 9, 165, 0, 184, 10, 147, 0, 184, 12, 128, 0, 185, 13, 106, 0, 186, 13, 83, 0, 186, 13, 61,
+ 0, 187, 13, 38, 0, 186, 16, 22, 0, 183, 22, 9, 0, 177, 33, 0, 0, 189, 5, 247, 0, 184, 0, 237, 0, 182, 0, 226,
+ 0, 182, 0, 219, 0, 183, 0, 210, 0, 183, 0, 198, 0, 182, 1, 184, 0, 182, 2, 168, 0, 181, 3, 152, 0, 181, 4, 134,
+ 0, 181, 5, 115, 0, 182, 5, 93, 0, 182, 5, 71, 0, 183, 4, 48, 0, 183, 5, 26, 0, 181, 10, 11, 0, 176, 21, 0,
+ 0, 188, 3, 247, 0, 182, 0, 235, 0, 179, 0, 223, 0, 179, 0, 216, 0, 180, 0, 208, 0, 179, 0, 197, 0, 178, 0, 184,
+ 0, 178, 0, 170, 0, 177, 0, 155, 0, 177, 0, 138, 0, 177, 1, 121, 0, 178, 1, 102, 0, 178, 1, 81, 0, 178, 0, 59,
+ 0, 178, 0, 37, 0, 177, 2, 15, 0, 174, 9, 0, 0, 187, 0, 247, 0, 184, 0, 235, 0, 182, 0, 223, 0, 182, 0, 219,
+ 0, 182, 0, 211, 0, 182, 0, 200, 0, 181, 0, 187, 0, 180, 0, 173, 0, 179, 0, 159, 0, 178, 0, 143, 0, 177, 0, 127,
+ 0, 177, 0, 109, 0, 176, 0, 90, 0, 176, 0, 69, 0, 176, 0, 46, 0, 176, 0, 23, 0, 175, 0, 0, 0, 185, 216, 237,
+ 0, 180, 221, 227, 0, 176, 234, 199, 0, 172, 240, 159, 0, 179, 220, 120, 0, 184, 212, 92, 0, 190, 204, 70, 0, 194, 197, 49,
+ 0, 198, 189, 36, 0, 201, 182, 27, 0, 205, 173, 20, 0, 208, 163, 12, 0, 211, 156, 6, 0, 215, 151, 4, 0, 219, 149, 4,
+ 0, 224, 147, 2, 0, 229, 144, 0, 0, 186, 203, 242, 0, 185, 209, 234, 0, 182, 212, 202, 0, 183, 213, 162, 0, 186, 206, 120,
+ 0, 190, 199, 89, 0, 196, 193, 62, 0, 200, 187, 39, 0, 204, 180, 18, 0, 208, 169, 4, 0, 211, 159, 2, 0, 212, 152, 1,
+ 0, 213, 148, 0, 0, 214, 145, 0, 0, 216, 143, 0, 0, 220, 141, 0, 0, 223, 141, 0, 0, 186, 189, 245, 0, 186, 191, 238,
+ 0, 183, 181, 204, 0, 185, 187, 169, 0, 188, 185, 133, 0, 193, 183, 101, 0, 198, 179, 74, 0, 202, 173, 50, 0, 206, 165, 29,
+ 0, 210, 155, 7, 0, 212, 148, 0, 0, 213, 146, 0, 0, 213, 143, 0, 0, 213, 140, 0, 0, 214, 138, 0, 0, 214, 136, 0,
+ 0, 216, 136, 0, 0, 183, 167, 249, 0, 185, 168, 233, 0, 185, 166, 210, 0, 189, 165, 193, 0, 190, 165, 148, 0, 194, 164, 116,
+ 0, 199, 160, 90, 0, 204, 156, 65, 0, 209, 152, 42, 0, 212, 145, 20, 0, 216, 140, 3, 0, 215, 137, 0, 0, 214, 135, 0,
+ 0, 213, 133, 0, 0, 212, 132, 0, 0, 211, 130, 0, 0, 214, 130, 0, 0, 186, 146, 249, 0, 188, 145, 242, 0, 188, 149, 222,
+ 0, 187, 146, 192, 0, 189, 147, 163, 0, 193, 147, 133, 0, 197, 147, 103, 0, 200, 145, 77, 0, 205, 143, 53, 0, 208, 138, 32,
+ 0, 211, 134, 11, 0, 212, 131, 1, 0, 210, 129, 0, 0, 209, 128, 0, 0, 208, 127, 0, 0, 207, 126, 0, 0, 208, 126, 0,
+ 0, 189, 125, 249, 0, 192, 122, 247, 0, 193, 124, 234, 0, 190, 128, 201, 0, 189, 130, 174, 0, 191, 133, 148, 0, 195, 132, 119,
+ 0, 198, 131, 91, 0, 201, 129, 67, 0, 204, 128, 43, 0, 206, 125, 20, 0, 208, 122, 3, 0, 206, 122, 0, 0, 204, 121, 0,
+ 0, 203, 120, 0, 0, 203, 120, 0, 0, 203, 121, 0, 0, 191, 102, 248, 0, 194, 99, 248, 0, 197, 98, 243, 0, 194, 105, 214,
+ 0, 192, 109, 184, 0, 192, 115, 158, 0, 193, 116, 132, 0, 198, 115, 104, 0, 199, 115, 79, 0, 200, 114, 56, 0, 203, 112, 34,
+ 0, 205, 109, 13, 0, 204, 109, 1, 0, 201, 110, 0, 0, 199, 111, 0, 0, 198, 111, 0, 0, 198, 112, 0, 0, 192, 80, 248,
+ 0, 195, 77, 248, 0, 198, 75, 245, 0, 196, 83, 222, 0, 193, 89, 193, 0, 193, 93, 168, 0, 194, 96, 144, 0, 196, 97, 116,
+ 0, 198, 97, 91, 0, 199, 97, 67, 0, 199, 99, 45, 0, 200, 98, 24, 0, 201, 96, 7, 0, 199, 97, 0, 0, 196, 99, 0,
+ 0, 194, 100, 0, 0, 192, 102, 0, 0, 192, 60, 249, 0, 194, 58, 248, 0, 197, 55, 246, 0, 196, 62, 227, 0, 193, 71, 201,
+ 0, 193, 74, 178, 0, 194, 77, 155, 0, 195, 79, 129, 0, 196, 79, 102, 0, 197, 80, 79, 0, 197, 82, 57, 0, 197, 84, 36,
+ 0, 197, 83, 16, 0, 195, 84, 2, 0, 192, 87, 0, 0, 189, 90, 0, 0, 186, 93, 0, 0, 190, 40, 248, 0, 192, 38, 248,
+ 0, 195, 37, 247, 0, 196, 42, 233, 0, 193, 53, 207, 0, 191, 56, 185, 0, 192, 60, 164, 0, 193, 63, 140, 0, 193, 64, 114,
+ 0, 194, 64, 89, 0, 195, 65, 68, 0, 195, 67, 47, 0, 194, 68, 26, 0, 192, 72, 10, 0, 189, 74, 1, 0, 184, 78, 0,
+ 0, 180, 82, 0, 0, 188, 23, 248, 0, 190, 23, 247, 0, 193, 22, 247, 0, 194, 25, 237, 0, 192, 35, 213, 0, 191, 40, 193,
+ 0, 190, 44, 171, 0, 191, 46, 150, 0, 191, 48, 125, 0, 192, 49, 100, 0, 192, 49, 77, 0, 192, 50, 56, 0, 192, 52, 36,
+ 0, 191, 55, 18, 0, 188, 60, 5, 0, 182, 66, 0, 0, 175, 71, 0, 0, 187, 16, 247, 0, 188, 11, 247, 0, 190, 9, 246,
+ 0, 191, 12, 236, 0, 190, 21, 216, 0, 189, 26, 196, 0, 188, 30, 177, 0, 188, 32, 157, 0, 188, 34, 135, 0, 188, 36, 112,
+ 0, 189, 36, 88, 0, 189, 36, 66, 0, 189, 37, 45, 0, 189, 39, 27, 0, 186, 43, 11, 0, 181, 50, 1, 0, 173, 60, 0,
+ 0, 187, 11, 247, 0, 186, 3, 246, 0, 186, 1, 240, 0, 187, 3, 231, 0, 186, 9, 215, 0, 186, 14, 198, 0, 185, 17, 181,
+ 0, 185, 19, 162, 0, 184, 22, 143, 0, 185, 24, 121, 0, 185, 25, 98, 0, 185, 25, 76, 0, 186, 25, 53, 0, 185, 26, 34,
+ 0, 184, 29, 17, 0, 181, 35, 5, 0, 172, 46, 0, 0, 186, 8, 247, 0, 183, 1, 241, 0, 182, 0, 232, 0, 182, 0, 222,
+ 0, 182, 3, 211, 0, 182, 5, 198, 0, 182, 6, 182, 0, 181, 8, 166, 0, 181, 10, 148, 0, 181, 11, 128, 0, 181, 13, 107,
+ 0, 182, 13, 84, 0, 182, 12, 62, 0, 182, 12, 40, 0, 181, 15, 22, 0, 179, 20, 8, 0, 172, 32, 0, 0, 186, 5, 247,
+ 0, 181, 0, 236, 0, 178, 0, 225, 0, 177, 0, 213, 0, 177, 0, 205, 0, 177, 0, 194, 0, 177, 1, 181, 0, 177, 1, 166,
+ 0, 176, 2, 150, 0, 176, 3, 133, 0, 176, 3, 113, 0, 177, 4, 93, 0, 177, 3, 71, 0, 178, 3, 48, 0, 178, 3, 26,
+ 0, 176, 7, 11, 0, 171, 20, 0, 0, 185, 3, 247, 0, 180, 0, 235, 0, 176, 0, 221, 0, 173, 0, 208, 0, 173, 0, 200,
+ 0, 173, 0, 191, 0, 173, 0, 179, 0, 172, 0, 165, 0, 171, 0, 150, 0, 170, 0, 134, 0, 170, 0, 117, 0, 170, 0, 99,
+ 0, 170, 0, 79, 0, 170, 0, 58, 0, 170, 0, 37, 0, 170, 1, 17, 0, 168, 9, 0, 0, 184, 0, 247, 0, 182, 0, 235,
+ 0, 179, 0, 224, 0, 177, 0, 211, 0, 177, 0, 204, 0, 177, 0, 195, 0, 176, 0, 183, 0, 175, 0, 169, 0, 173, 0, 155,
+ 0, 172, 0, 140, 0, 171, 0, 123, 0, 171, 0, 106, 0, 170, 0, 87, 0, 169, 0, 67, 0, 169, 0, 44, 0, 169, 0, 22,
+ 0, 168, 0, 0, 0, 171, 216, 237, 0, 167, 222, 227, 0, 164, 231, 203, 0, 162, 239, 166, 0, 158, 232, 122, 0, 164, 220, 91,
+ 0, 171, 210, 67, 0, 176, 202, 47, 0, 182, 193, 35, 0, 187, 187, 25, 0, 192, 180, 16, 0, 196, 171, 8, 0, 200, 164, 4,
+ 0, 204, 158, 4, 0, 208, 153, 3, 0, 211, 149, 2, 0, 215, 147, 0, 0, 173, 203, 240, 0, 171, 203, 223, 0, 170, 207, 199,
+ 0, 169, 212, 168, 0, 167, 211, 125, 0, 171, 206, 90, 0, 177, 199, 61, 0, 182, 192, 39, 0, 187, 186, 16, 0, 193, 177, 3,
+ 0, 197, 168, 1, 0, 200, 160, 1, 0, 203, 154, 0, 0, 205, 149, 0, 0, 207, 146, 0, 0, 210, 144, 0, 0, 211, 144, 0,
+ 0, 178, 188, 233, 0, 177, 183, 219, 0, 172, 182, 194, 0, 171, 186, 173, 0, 171, 189, 138, 0, 174, 187, 104, 0, 180, 184, 76,
+ 0, 185, 181, 50, 0, 189, 175, 25, 0, 194, 167, 3, 0, 197, 159, 0, 0, 200, 153, 0, 0, 202, 149, 0, 0, 203, 145, 0,
+ 0, 204, 141, 0, 0, 206, 139, 0, 0, 208, 139, 0, 0, 174, 168, 240, 0, 174, 166, 220, 0, 172, 164, 200, 0, 171, 165, 182,
+ 0, 173, 170, 151, 0, 177, 170, 116, 0, 181, 168, 88, 0, 187, 166, 63, 0, 190, 162, 38, 0, 194, 155, 14, 0, 198, 148, 1,
+ 0, 199, 144, 0, 0, 201, 140, 0, 0, 201, 137, 0, 0, 202, 135, 0, 0, 202, 134, 0, 0, 204, 134, 0, 0, 171, 146, 252,
+ 0, 174, 148, 233, 0, 173, 148, 206, 0, 172, 148, 188, 0, 177, 148, 171, 0, 179, 150, 132, 0, 184, 150, 102, 0, 189, 148, 77,
+ 0, 194, 146, 52, 0, 198, 141, 27, 0, 201, 135, 7, 0, 202, 132, 0, 0, 202, 130, 0, 0, 201, 129, 0, 0, 201, 127, 0,
+ 0, 200, 126, 0, 0, 202, 126, 0, 0, 175, 125, 251, 0, 178, 125, 245, 0, 177, 130, 218, 0, 176, 132, 195, 0, 176, 132, 173,
+ 0, 179, 134, 147, 0, 183, 135, 118, 0, 187, 134, 91, 0, 190, 133, 67, 0, 194, 132, 42, 0, 197, 128, 18, 0, 199, 124, 2,
+ 0, 199, 123, 0, 0, 197, 122, 0, 0, 196, 121, 0, 0, 196, 120, 0, 0, 197, 121, 0, 0, 178, 104, 250, 0, 183, 101, 249,
+ 0, 183, 104, 236, 0, 182, 111, 207, 0, 180, 114, 182, 0, 179, 118, 157, 0, 181, 121, 132, 0, 185, 120, 107, 0, 188, 119, 80,
+ 0, 191, 118, 56, 0, 194, 116, 32, 0, 196, 114, 10, 0, 195, 113, 1, 0, 194, 113, 0, 0, 192, 113, 0, 0, 191, 113, 0,
+ 0, 192, 114, 0, 0, 181, 82, 250, 0, 185, 79, 249, 0, 187, 80, 243, 0, 185, 88, 217, 0, 183, 93, 191, 0, 182, 97, 167,
+ 0, 182, 101, 144, 0, 184, 103, 117, 0, 188, 102, 92, 0, 189, 102, 68, 0, 190, 102, 45, 0, 193, 101, 22, 0, 194, 99, 4,
+ 0, 192, 100, 0, 0, 189, 101, 0, 0, 187, 102, 0, 0, 187, 104, 0, 0, 182, 62, 250, 0, 186, 59, 249, 0, 188, 59, 245,
+ 0, 187, 68, 224, 0, 185, 75, 200, 0, 184, 76, 177, 0, 185, 81, 155, 0, 185, 83, 130, 0, 187, 83, 103, 0, 189, 84, 79,
+ 0, 189, 86, 57, 0, 189, 87, 34, 0, 190, 86, 13, 0, 189, 87, 2, 0, 186, 89, 0, 0, 183, 91, 0, 0, 182, 93, 0,
+ 0, 182, 43, 249, 0, 185, 40, 248, 0, 187, 40, 246, 0, 187, 48, 230, 0, 186, 57, 205, 0, 185, 60, 185, 0, 185, 63, 164,
+ 0, 186, 65, 141, 0, 186, 67, 115, 0, 187, 67, 90, 0, 188, 68, 68, 0, 188, 70, 46, 0, 187, 72, 25, 0, 186, 74, 8,
+ 0, 183, 76, 1, 0, 179, 79, 0, 0, 176, 82, 0, 0, 180, 26, 248, 0, 184, 24, 248, 0, 186, 25, 246, 0, 186, 30, 233,
+ 0, 185, 41, 210, 0, 185, 43, 192, 0, 184, 46, 171, 0, 185, 48, 150, 0, 185, 50, 126, 0, 185, 52, 101, 0, 185, 52, 78,
+ 0, 186, 54, 57, 0, 186, 55, 36, 0, 185, 57, 17, 0, 182, 62, 3, 0, 176, 67, 0, 0, 170, 71, 0, 0, 180, 16, 248,
+ 0, 182, 12, 247, 0, 184, 12, 245, 0, 184, 16, 233, 0, 183, 25, 213, 0, 183, 29, 195, 0, 182, 32, 176, 0, 182, 34, 157,
+ 0, 182, 36, 136, 0, 183, 38, 113, 0, 183, 39, 89, 0, 183, 39, 68, 0, 183, 40, 46, 0, 183, 41, 26, 0, 180, 45, 9,
+ 0, 175, 51, 1, 0, 167, 60, 0, 0, 181, 11, 247, 0, 181, 3, 246, 0, 181, 3, 240, 0, 182, 6, 230, 0, 181, 13, 212,
+ 0, 180, 16, 196, 0, 180, 19, 180, 0, 180, 21, 162, 0, 179, 24, 143, 0, 180, 26, 122, 0, 180, 27, 99, 0, 180, 27, 77,
+ 0, 180, 26, 55, 0, 180, 28, 35, 0, 179, 30, 16, 0, 175, 34, 3, 0, 166, 45, 0, 0, 182, 8, 247, 0, 179, 1, 241,
+ 0, 178, 0, 233, 0, 177, 1, 222, 0, 177, 4, 208, 0, 176, 6, 196, 0, 177, 7, 181, 0, 176, 9, 165, 0, 176, 11, 147,
+ 0, 176, 12, 128, 0, 176, 13, 107, 0, 176, 13, 85, 0, 176, 13, 63, 0, 177, 12, 40, 0, 176, 15, 22, 0, 174, 19, 7,
+ 0, 166, 32, 0, 0, 182, 5, 247, 0, 177, 0, 236, 0, 175, 0, 226, 0, 173, 0, 213, 0, 171, 0, 200, 0, 171, 0, 190,
+ 0, 172, 1, 178, 0, 171, 1, 165, 0, 171, 1, 149, 0, 171, 1, 132, 0, 171, 2, 113, 0, 171, 2, 92, 0, 171, 2, 70,
+ 0, 172, 1, 47, 0, 172, 2, 27, 0, 170, 6, 11, 0, 164, 20, 0, 0, 182, 3, 247, 0, 176, 0, 234, 0, 172, 0, 221,
+ 0, 169, 0, 206, 0, 166, 0, 193, 0, 165, 0, 184, 0, 166, 0, 173, 0, 165, 0, 160, 0, 164, 0, 147, 0, 163, 0, 132,
+ 0, 162, 0, 115, 0, 162, 0, 97, 0, 162, 0, 78, 0, 162, 0, 57, 0, 163, 0, 37, 0, 162, 1, 17, 0, 161, 9, 0,
+ 0, 181, 0, 247, 0, 178, 0, 236, 0, 176, 0, 225, 0, 174, 0, 211, 0, 170, 0, 197, 0, 170, 0, 189, 0, 170, 0, 178,
+ 0, 169, 0, 165, 0, 167, 0, 151, 0, 165, 0, 136, 0, 164, 0, 121, 0, 163, 0, 104, 0, 162, 0, 85, 0, 162, 0, 65,
+ 0, 162, 0, 42, 0, 161, 0, 21, 0, 160, 0, 0, 0, 149, 217, 237, 0, 143, 225, 228, 0, 142, 231, 207, 0, 141, 235, 171,
+ 0, 140, 235, 128, 0, 138, 230, 90, 0, 146, 220, 62, 0, 155, 209, 42, 0, 164, 200, 30, 0, 171, 192, 22, 0, 178, 185, 16,
+ 0, 183, 178, 8, 0, 189, 172, 4, 0, 194, 166, 3, 0, 198, 161, 2, 0, 201, 156, 2, 0, 204, 152, 0, 0, 151, 203, 241,
+ 0, 150, 202, 221, 0, 153, 207, 199, 0, 153, 211, 173, 0, 152, 213, 136, 0, 150, 213, 94, 0, 156, 207, 61, 0, 162, 199, 37,
+ 0, 169, 192, 14, 0, 175, 183, 3, 0, 181, 175, 1, 0, 187, 168, 1, 0, 190, 161, 0, 0, 193, 156, 0, 0, 197, 152, 0,
+ 0, 200, 149, 0, 0, 202, 148, 0, 0, 155, 185, 242, 0, 155, 182, 219, 0, 159, 183, 193, 0, 158, 187, 177, 0, 156, 192, 147,
+ 0, 156, 194, 110, 0, 161, 191, 77, 0, 166, 188, 49, 0, 171, 182, 23, 0, 177, 175, 3, 0, 182, 167, 0, 0, 187, 160, 0,
+ 0, 190, 155, 0, 0, 192, 150, 0, 0, 195, 147, 0, 0, 197, 144, 0, 0, 199, 144, 0, 0, 157, 164, 227, 0, 157, 164, 216,
+ 0, 158, 164, 199, 0, 159, 166, 180, 0, 158, 173, 157, 0, 159, 176, 122, 0, 163, 175, 91, 0, 169, 172, 65, 0, 173, 169, 38,
+ 0, 177, 164, 13, 0, 182, 158, 1, 0, 186, 153, 0, 0, 188, 148, 0, 0, 190, 144, 0, 0, 192, 141, 0, 0, 193, 138, 0,
+ 0, 195, 138, 0, 0, 159, 150, 239, 0, 161, 150, 224, 0, 160, 149, 200, 0, 160, 149, 182, 0, 159, 153, 163, 0, 161, 157, 135,
+ 0, 165, 158, 102, 0, 170, 157, 76, 0, 175, 155, 50, 0, 178, 152, 23, 0, 182, 146, 3, 0, 185, 142, 0, 0, 187, 138, 0,
+ 0, 188, 135, 0, 0, 189, 132, 0, 0, 190, 130, 0, 0, 192, 130, 0, 0, 156, 127, 253, 0, 161, 130, 237, 0, 161, 133, 209,
+ 0, 160, 134, 188, 0, 160, 135, 171, 0, 163, 134, 154, 0, 167, 137, 118, 0, 172, 138, 90, 0, 177, 137, 66, 0, 182, 136, 40,
+ 0, 186, 132, 14, 0, 188, 127, 2, 0, 188, 125, 0, 0, 188, 123, 0, 0, 188, 121, 0, 0, 188, 120, 0, 0, 190, 120, 0,
+ 0, 162, 106, 252, 0, 165, 105, 249, 0, 166, 110, 232, 0, 165, 117, 201, 0, 164, 119, 179, 0, 165, 120, 157, 0, 168, 123, 132,
+ 0, 171, 123, 106, 0, 176, 123, 81, 0, 180, 123, 55, 0, 183, 121, 29, 0, 185, 118, 8, 0, 185, 116, 1, 0, 184, 115, 0,
+ 0, 184, 114, 0, 0, 183, 113, 0, 0, 185, 114, 0, 0, 166, 86, 251, 0, 171, 83, 250, 0, 172, 86, 241, 0, 171, 94, 213,
+ 0, 170, 98, 189, 0, 169, 101, 166, 0, 169, 105, 143, 0, 169, 107, 118, 0, 174, 107, 95, 0, 178, 107, 70, 0, 180, 107, 44,
+ 0, 183, 105, 20, 0, 184, 103, 3, 0, 182, 104, 0, 0, 180, 104, 0, 0, 179, 104, 0, 0, 180, 105, 0, 0, 169, 66, 250,
+ 0, 173, 62, 249, 0, 175, 64, 242, 0, 175, 72, 221, 0, 173, 78, 198, 0, 173, 82, 176, 0, 173, 85, 154, 0, 172, 88, 130,
+ 0, 173, 89, 105, 0, 178, 89, 81, 0, 179, 90, 57, 0, 180, 90, 33, 0, 181, 90, 11, 0, 180, 90, 1, 0, 178, 91, 0,
+ 0, 176, 92, 0, 0, 176, 94, 0, 0, 170, 46, 249, 0, 174, 43, 249, 0, 176, 45, 242, 0, 177, 53, 226, 0, 175, 61, 203,
+ 0, 175, 64, 184, 0, 175, 67, 163, 0, 176, 69, 142, 0, 176, 71, 116, 0, 177, 71, 91, 0, 178, 72, 69, 0, 178, 74, 45,
+ 0, 178, 75, 23, 0, 178, 75, 5, 0, 175, 77, 0, 0, 172, 80, 0, 0, 170, 83, 0, 0, 170, 29, 249, 0, 175, 27, 248,
+ 0, 176, 30, 242, 0, 176, 36, 228, 0, 176, 45, 207, 0, 175, 47, 190, 0, 175, 50, 171, 0, 176, 53, 150, 0, 176, 55, 127,
+ 0, 176, 56, 102, 0, 177, 56, 79, 0, 177, 57, 57, 0, 177, 58, 35, 0, 176, 59, 14, 0, 174, 64, 2, 0, 168, 68, 0,
+ 0, 165, 71, 0, 0, 172, 17, 248, 0, 175, 14, 247, 0, 176, 16, 242, 0, 176, 21, 230, 0, 175, 30, 210, 0, 174, 32, 194,
+ 0, 174, 35, 175, 0, 175, 37, 156, 0, 175, 39, 136, 0, 176, 40, 113, 0, 176, 41, 90, 0, 176, 41, 68, 0, 176, 42, 45,
+ 0, 175, 43, 25, 0, 173, 46, 7, 0, 167, 52, 1, 0, 161, 61, 0, 0, 174, 12, 248, 0, 175, 5, 245, 0, 175, 6, 238,
+ 0, 174, 10, 227, 0, 173, 17, 210, 0, 173, 18, 195, 0, 173, 21, 179, 0, 173, 23, 161, 0, 173, 25, 142, 0, 173, 27, 121,
+ 0, 173, 28, 99, 0, 173, 28, 77, 0, 173, 27, 55, 0, 173, 28, 34, 0, 172, 30, 15, 0, 168, 35, 2, 0, 158, 46, 0,
+ 0, 175, 8, 247, 0, 174, 1, 241, 0, 173, 1, 233, 0, 172, 2, 222, 0, 170, 6, 208, 0, 170, 6, 194, 0, 170, 8, 180,
+ 0, 170, 10, 164, 0, 169, 11, 146, 0, 169, 12, 127, 0, 169, 13, 107, 0, 169, 14, 85, 0, 170, 13, 63, 0, 170, 12, 41,
+ 0, 169, 15, 22, 0, 167, 18, 6, 0, 158, 32, 0, 0, 176, 5, 247, 0, 172, 0, 236, 0, 170, 0, 225, 0, 168, 0, 213,
+ 0, 165, 0, 200, 0, 164, 0, 188, 0, 165, 1, 177, 0, 165, 1, 163, 0, 165, 1, 148, 0, 164, 1, 131, 0, 164, 1, 112,
+ 0, 164, 2, 91, 0, 165, 1, 70, 0, 165, 1, 47, 0, 165, 1, 27, 0, 164, 5, 11, 0, 157, 20, 0, 0, 177, 3, 247,
+ 0, 172, 0, 233, 0, 168, 0, 220, 0, 164, 0, 206, 0, 160, 0, 192, 0, 158, 0, 178, 0, 158, 0, 168, 0, 157, 0, 157,
+ 0, 157, 0, 144, 0, 155, 0, 129, 0, 155, 0, 113, 0, 155, 0, 96, 0, 154, 0, 77, 0, 155, 0, 56, 0, 155, 0, 37,
+ 0, 154, 1, 18, 0, 154, 9, 0, 0, 177, 0, 247, 0, 174, 0, 236, 0, 171, 0, 225, 0, 169, 0, 211, 0, 166, 0, 197,
+ 0, 162, 0, 182, 0, 163, 0, 172, 0, 162, 0, 161, 0, 160, 0, 148, 0, 158, 0, 134, 0, 156, 0, 119, 0, 155, 0, 103,
+ 0, 154, 0, 85, 0, 154, 0, 64, 0, 154, 0, 41, 0, 153, 0, 20, 0, 152, 0, 0, 0, 125, 218, 239, 0, 120, 228, 228,
+ 0, 120, 231, 206, 0, 121, 231, 176, 0, 123, 232, 135, 0, 121, 229, 95, 0, 118, 227, 62, 0, 129, 216, 38, 0, 140, 207, 19,
+ 0, 152, 199, 14, 0, 162, 191, 11, 0, 170, 184, 8, 0, 176, 178, 5, 0, 182, 173, 3, 0, 187, 169, 2, 0, 191, 164, 1,
+ 0, 194, 159, 0, 0, 132, 203, 237, 0, 131, 203, 219, 0, 133, 207, 199, 0, 134, 209, 178, 0, 135, 210, 145, 0, 134, 211, 105,
+ 0, 133, 210, 68, 0, 139, 206, 36, 0, 148, 199, 10, 0, 157, 191, 2, 0, 165, 182, 1, 0, 172, 174, 1, 0, 177, 167, 0,
+ 0, 182, 162, 0, 0, 185, 159, 0, 0, 189, 156, 0, 0, 191, 155, 0, 0, 138, 185, 235, 0, 138, 184, 217, 0, 142, 185, 194,
+ 0, 141, 189, 178, 0, 140, 193, 154, 0, 140, 195, 119, 0, 140, 196, 84, 0, 145, 195, 49, 0, 152, 191, 21, 0, 159, 183, 2,
+ 0, 167, 175, 0, 0, 172, 167, 0, 0, 177, 161, 0, 0, 180, 157, 0, 0, 183, 153, 0, 0, 186, 150, 0, 0, 189, 150, 0,
+ 0, 143, 167, 227, 0, 144, 166, 220, 0, 143, 168, 199, 0, 146, 171, 178, 0, 145, 175, 159, 0, 144, 178, 129, 0, 144, 181, 96,
+ 0, 149, 179, 67, 0, 155, 176, 40, 0, 161, 172, 12, 0, 167, 166, 1, 0, 172, 159, 0, 0, 175, 154, 0, 0, 178, 150, 0,
+ 0, 181, 146, 0, 0, 183, 144, 0, 0, 186, 145, 0, 0, 145, 150, 219, 0, 147, 151, 208, 0, 146, 152, 197, 0, 148, 151, 180,
+ 0, 148, 155, 160, 0, 146, 160, 140, 0, 146, 164, 108, 0, 152, 163, 79, 0, 157, 162, 52, 0, 161, 160, 23, 0, 166, 155, 2,
+ 0, 170, 150, 0, 0, 173, 145, 0, 0, 176, 142, 0, 0, 178, 138, 0, 0, 180, 136, 0, 0, 182, 137, 0, 0, 143, 133, 232,
+ 0, 147, 135, 220, 0, 147, 135, 204, 0, 148, 136, 185, 0, 148, 138, 167, 0, 147, 141, 151, 0, 149, 145, 120, 0, 154, 146, 91,
+ 0, 158, 145, 66, 0, 163, 144, 36, 0, 166, 141, 10, 0, 170, 137, 1, 0, 172, 134, 0, 0, 174, 131, 0, 0, 175, 128, 0,
+ 0, 176, 126, 0, 0, 179, 127, 0, 0, 141, 109, 253, 0, 147, 111, 242, 0, 148, 115, 224, 0, 148, 119, 197, 0, 148, 121, 174,
+ 0, 148, 123, 157, 0, 152, 123, 139, 0, 155, 125, 105, 0, 161, 126, 79, 0, 166, 125, 52, 0, 170, 124, 25, 0, 173, 121, 4,
+ 0, 174, 119, 0, 0, 174, 117, 0, 0, 174, 115, 0, 0, 175, 114, 0, 0, 178, 112, 0, 0, 148, 89, 252, 0, 151, 88, 250,
+ 0, 154, 92, 238, 0, 154, 100, 210, 0, 153, 104, 186, 0, 153, 107, 166, 0, 153, 106, 144, 0, 155, 108, 119, 0, 160, 110, 94,
+ 0, 164, 110, 68, 0, 168, 110, 41, 0, 171, 108, 16, 0, 171, 105, 2, 0, 171, 104, 0, 0, 171, 104, 0, 0, 171, 103, 0,
+ 0, 172, 104, 0, 0, 152, 70, 251, 0, 156, 67, 250, 0, 159, 69, 242, 0, 160, 77, 222, 0, 159, 83, 197, 0, 159, 87, 176,
+ 0, 158, 88, 154, 0, 158, 91, 131, 0, 157, 93, 106, 0, 162, 95, 83, 0, 166, 94, 56, 0, 168, 94, 31, 0, 170, 92, 9,
+ 0, 170, 92, 1, 0, 168, 92, 0, 0, 167, 93, 0, 0, 168, 94, 0, 0, 155, 51, 250, 0, 160, 48, 249, 0, 162, 50, 242,
+ 0, 163, 58, 225, 0, 163, 65, 203, 0, 163, 68, 184, 0, 162, 71, 163, 0, 162, 73, 142, 0, 161, 75, 118, 0, 162, 76, 93,
+ 0, 166, 76, 69, 0, 167, 78, 44, 0, 168, 78, 20, 0, 169, 77, 3, 0, 166, 79, 0, 0, 164, 81, 0, 0, 164, 83, 0,
+ 0, 157, 33, 249, 0, 163, 30, 248, 0, 164, 34, 241, 0, 165, 41, 227, 0, 164, 49, 207, 0, 164, 51, 190, 0, 164, 55, 170,
+ 0, 163, 56, 150, 0, 164, 58, 127, 0, 165, 58, 102, 0, 166, 59, 79, 0, 166, 60, 55, 0, 166, 61, 33, 0, 166, 63, 12,
+ 0, 164, 66, 1, 0, 160, 68, 0, 0, 158, 71, 0, 0, 160, 19, 249, 0, 164, 16, 248, 0, 166, 19, 241, 0, 166, 24, 229,
+ 0, 165, 33, 209, 0, 164, 36, 193, 0, 164, 38, 175, 0, 164, 40, 156, 0, 165, 41, 136, 0, 166, 42, 112, 0, 166, 43, 89,
+ 0, 166, 43, 67, 0, 167, 44, 43, 0, 166, 46, 22, 0, 164, 48, 5, 0, 158, 55, 0, 0, 153, 61, 0, 0, 163, 13, 248,
+ 0, 166, 6, 245, 0, 166, 8, 238, 0, 166, 12, 227, 0, 165, 19, 210, 0, 164, 21, 195, 0, 163, 23, 178, 0, 163, 25, 160,
+ 0, 164, 26, 141, 0, 164, 27, 120, 0, 164, 28, 98, 0, 164, 29, 76, 0, 165, 28, 54, 0, 165, 30, 32, 0, 164, 31, 13,
+ 0, 159, 37, 1, 0, 150, 48, 0, 0, 167, 9, 248, 0, 166, 1, 242, 0, 165, 1, 234, 0, 165, 3, 223, 0, 163, 7, 208,
+ 0, 162, 8, 194, 0, 162, 9, 179, 0, 162, 11, 163, 0, 162, 12, 146, 0, 161, 13, 127, 0, 161, 14, 106, 0, 161, 15, 84,
+ 0, 162, 14, 63, 0, 162, 14, 41, 0, 162, 16, 21, 0, 160, 19, 5, 0, 149, 33, 0, 0, 169, 5, 248, 0, 166, 0, 235,
+ 0, 164, 0, 225, 0, 161, 0, 214, 0, 159, 1, 201, 0, 158, 1, 189, 0, 157, 1, 175, 0, 158, 1, 162, 0, 158, 1, 147,
+ 0, 157, 1, 130, 0, 157, 1, 111, 0, 157, 2, 91, 0, 157, 2, 70, 0, 158, 1, 47, 0, 158, 1, 27, 0, 157, 6, 10,
+ 0, 149, 21, 0, 0, 171, 3, 247, 0, 166, 0, 232, 0, 162, 0, 219, 0, 158, 0, 206, 0, 155, 0, 192, 0, 152, 0, 178,
+ 0, 150, 0, 164, 0, 149, 0, 154, 0, 149, 0, 141, 0, 148, 0, 127, 0, 147, 0, 112, 0, 147, 0, 95, 0, 147, 0, 76,
+ 0, 147, 0, 56, 0, 147, 0, 36, 0, 146, 1, 18, 0, 145, 10, 0, 0, 172, 0, 247, 0, 169, 0, 236, 0, 166, 0, 224,
+ 0, 163, 0, 211, 0, 160, 0, 197, 0, 157, 0, 181, 0, 153, 0, 166, 0, 153, 0, 156, 0, 152, 0, 144, 0, 150, 0, 132,
+ 0, 148, 0, 118, 0, 146, 0, 103, 0, 145, 0, 85, 0, 145, 0, 64, 0, 145, 0, 41, 0, 145, 0, 19, 0, 142, 0, 0,
+ 0, 104, 218, 241, 0, 100, 226, 227, 0, 102, 227, 203, 0, 103, 226, 178, 0, 107, 226, 145, 0, 106, 226, 103, 0, 103, 224, 69,
+ 0, 99, 224, 38, 0, 112, 214, 13, 0, 128, 204, 7, 0, 143, 198, 5, 0, 154, 192, 5, 0, 162, 186, 4, 0, 169, 180, 3,
+ 0, 175, 175, 3, 0, 179, 171, 1, 0, 183, 167, 0, 0, 113, 201, 233, 0, 113, 200, 217, 0, 114, 203, 197, 0, 115, 206, 178,
+ 0, 116, 207, 152, 0, 118, 206, 116, 0, 116, 208, 81, 0, 115, 210, 43, 0, 123, 204, 13, 0, 136, 196, 1, 0, 148, 188, 0,
+ 0, 157, 181, 1, 0, 164, 175, 0, 0, 169, 169, 0, 0, 174, 165, 0, 0, 178, 162, 0, 0, 180, 162, 0, 0, 124, 181, 222,
+ 0, 122, 182, 214, 0, 124, 185, 194, 0, 122, 190, 178, 0, 121, 193, 159, 0, 123, 195, 127, 0, 123, 196, 94, 0, 123, 196, 60,
+ 0, 129, 194, 27, 0, 139, 189, 3, 0, 149, 182, 0, 0, 157, 175, 0, 0, 163, 168, 0, 0, 168, 163, 0, 0, 172, 159, 0,
+ 0, 175, 156, 0, 0, 177, 157, 0, 0, 128, 163, 232, 0, 127, 165, 221, 0, 126, 168, 198, 0, 126, 175, 179, 0, 127, 177, 161,
+ 0, 128, 180, 135, 0, 127, 184, 103, 0, 128, 183, 73, 0, 134, 182, 42, 0, 142, 180, 11, 0, 150, 174, 1, 0, 157, 166, 0,
+ 0, 162, 160, 0, 0, 166, 155, 0, 0, 169, 151, 0, 0, 172, 149, 0, 0, 174, 150, 0, 0, 130, 149, 218, 0, 131, 150, 212,
+ 0, 132, 152, 201, 0, 131, 154, 182, 0, 134, 158, 159, 0, 132, 162, 144, 0, 130, 168, 114, 0, 131, 169, 83, 0, 137, 168, 54,
+ 0, 143, 166, 24, 0, 150, 163, 3, 0, 156, 157, 0, 0, 160, 151, 0, 0, 163, 147, 0, 0, 166, 143, 0, 0, 169, 140, 0,
+ 0, 171, 142, 0, 0, 129, 134, 227, 0, 134, 135, 216, 0, 134, 137, 200, 0, 133, 139, 184, 0, 136, 140, 168, 0, 135, 143, 150,
+ 0, 133, 149, 126, 0, 135, 151, 96, 0, 140, 151, 68, 0, 145, 151, 37, 0, 149, 149, 9, 0, 154, 145, 0, 0, 158, 141, 0,
+ 0, 161, 137, 0, 0, 163, 134, 0, 0, 165, 131, 0, 0, 168, 132, 0, 0, 128, 115, 244, 0, 131, 117, 227, 0, 133, 120, 205,
+ 0, 134, 122, 188, 0, 136, 125, 170, 0, 136, 126, 154, 0, 134, 128, 136, 0, 137, 131, 107, 0, 142, 133, 79, 0, 146, 133, 50,
+ 0, 150, 133, 22, 0, 154, 130, 3, 0, 156, 127, 0, 0, 159, 124, 0, 0, 160, 122, 0, 0, 162, 120, 0, 0, 165, 120, 0,
+ 0, 125, 92, 253, 0, 131, 95, 242, 0, 134, 101, 222, 0, 135, 104, 202, 0, 135, 107, 180, 0, 136, 109, 159, 0, 136, 110, 143,
+ 0, 139, 109, 127, 0, 144, 113, 94, 0, 149, 113, 66, 0, 153, 112, 37, 0, 157, 111, 13, 0, 159, 109, 1, 0, 160, 107, 0,
+ 0, 161, 106, 0, 0, 161, 104, 0, 0, 165, 103, 0, 0, 133, 73, 252, 0, 137, 72, 250, 0, 139, 77, 238, 0, 141, 83, 219,
+ 0, 142, 88, 196, 0, 142, 92, 173, 0, 142, 93, 154, 0, 142, 94, 133, 0, 144, 96, 107, 0, 148, 98, 81, 0, 152, 98, 54,
+ 0, 156, 96, 27, 0, 158, 93, 5, 0, 158, 93, 0, 0, 157, 93, 0, 0, 157, 93, 0, 0, 159, 93, 0, 0, 138, 55, 251,
+ 0, 142, 53, 250, 0, 145, 56, 241, 0, 147, 63, 225, 0, 148, 70, 203, 0, 148, 73, 183, 0, 148, 75, 163, 0, 147, 76, 143,
+ 0, 146, 79, 118, 0, 146, 81, 94, 0, 150, 82, 70, 0, 154, 82, 42, 0, 156, 80, 18, 0, 157, 79, 2, 0, 155, 80, 0,
+ 0, 154, 81, 0, 0, 155, 83, 0, 0, 142, 37, 250, 0, 146, 35, 249, 0, 149, 38, 240, 0, 151, 45, 226, 0, 151, 53, 207,
+ 0, 151, 56, 189, 0, 150, 60, 170, 0, 149, 61, 150, 0, 149, 62, 127, 0, 149, 64, 103, 0, 150, 65, 79, 0, 153, 64, 55,
+ 0, 155, 64, 30, 0, 155, 66, 9, 0, 153, 67, 1, 0, 151, 69, 0, 0, 150, 71, 0, 0, 145, 21, 249, 0, 151, 19, 248,
+ 0, 153, 22, 240, 0, 153, 29, 226, 0, 153, 37, 208, 0, 153, 39, 193, 0, 152, 42, 175, 0, 152, 43, 156, 0, 152, 45, 135,
+ 0, 152, 45, 112, 0, 153, 46, 88, 0, 154, 47, 66, 0, 154, 48, 42, 0, 154, 48, 20, 0, 153, 51, 3, 0, 148, 57, 0,
+ 0, 145, 61, 0, 0, 150, 13, 249, 0, 154, 8, 245, 0, 155, 10, 238, 0, 155, 14, 227, 0, 154, 22, 210, 0, 153, 24, 194,
+ 0, 153, 26, 177, 0, 152, 27, 160, 0, 152, 28, 141, 0, 153, 29, 120, 0, 154, 30, 98, 0, 154, 30, 75, 0, 155, 30, 52,
+ 0, 155, 32, 30, 0, 153, 33, 11, 0, 148, 39, 1, 0, 140, 49, 0, 0, 156, 9, 248, 0, 157, 2, 242, 0, 157, 2, 235,
+ 0, 156, 4, 223, 0, 154, 9, 208, 0, 153, 10, 194, 0, 153, 11, 179, 0, 152, 12, 163, 0, 152, 13, 146, 0, 152, 14, 126,
+ 0, 152, 15, 105, 0, 152, 15, 84, 0, 153, 15, 62, 0, 154, 15, 40, 0, 154, 17, 19, 0, 150, 21, 3, 0, 138, 34, 0,
+ 0, 160, 6, 248, 0, 158, 1, 236, 0, 156, 0, 226, 0, 154, 0, 214, 0, 152, 1, 202, 0, 151, 1, 190, 0, 150, 1, 176,
+ 0, 149, 1, 162, 0, 150, 1, 147, 0, 149, 1, 130, 0, 149, 2, 111, 0, 149, 2, 91, 0, 149, 2, 70, 0, 150, 2, 47,
+ 0, 150, 2, 27, 0, 149, 7, 9, 0, 138, 21, 0, 0, 163, 3, 248, 0, 159, 0, 232, 0, 156, 0, 219, 0, 152, 0, 205,
+ 0, 148, 0, 192, 0, 145, 0, 179, 0, 143, 0, 165, 0, 141, 0, 151, 0, 140, 0, 139, 0, 139, 0, 125, 0, 138, 0, 110,
+ 0, 137, 0, 93, 0, 137, 0, 75, 0, 137, 0, 55, 0, 137, 0, 36, 0, 136, 1, 18, 0, 134, 10, 0, 0, 165, 0, 248,
+ 0, 162, 0, 236, 0, 159, 0, 224, 0, 156, 0, 211, 0, 153, 0, 197, 0, 150, 0, 182, 0, 147, 0, 166, 0, 142, 0, 152,
+ 0, 142, 0, 142, 0, 141, 0, 130, 0, 138, 0, 116, 0, 136, 0, 101, 0, 134, 0, 84, 0, 134, 0, 64, 0, 134, 0, 41,
+ 0, 133, 0, 18, 0, 131, 0, 0, 0, 81, 219, 243, 0, 74, 228, 233, 0, 76, 228, 204, 0, 80, 227, 181, 0, 85, 226, 155,
+ 0, 87, 224, 115, 0, 87, 223, 78, 0, 84, 223, 44, 0, 82, 223, 16, 0, 99, 213, 3, 0, 119, 203, 2, 0, 135, 197, 1,
+ 0, 146, 192, 1, 0, 155, 188, 2, 0, 162, 183, 2, 0, 167, 178, 1, 0, 172, 174, 0, 0, 91, 203, 235, 0, 92, 201, 221,
+ 0, 95, 201, 197, 0, 96, 204, 179, 0, 96, 207, 158, 0, 100, 205, 125, 0, 101, 205, 91, 0, 97, 210, 53, 0, 97, 209, 20,
+ 0, 111, 201, 2, 0, 127, 192, 0, 0, 139, 186, 0, 0, 148, 181, 0, 0, 156, 176, 0, 0, 162, 172, 0, 0, 167, 168, 0,
+ 0, 170, 169, 0, 0, 103, 183, 223, 0, 102, 184, 217, 0, 106, 185, 195, 0, 103, 189, 179, 0, 102, 193, 162, 0, 105, 195, 133,
+ 0, 106, 196, 100, 0, 106, 196, 70, 0, 106, 197, 36, 0, 115, 193, 7, 0, 129, 185, 0, 0, 140, 180, 0, 0, 148, 174, 0,
+ 0, 155, 169, 0, 0, 160, 165, 0, 0, 164, 162, 0, 0, 167, 163, 0, 0, 108, 168, 231, 0, 108, 169, 222, 0, 109, 172, 200,
+ 0, 108, 176, 179, 0, 109, 179, 163, 0, 110, 182, 140, 0, 111, 184, 108, 0, 110, 185, 79, 0, 112, 185, 49, 0, 119, 182, 19,
+ 0, 130, 177, 2, 0, 141, 172, 0, 0, 148, 167, 0, 0, 153, 161, 0, 0, 157, 157, 0, 0, 161, 154, 0, 0, 163, 156, 0,
+ 0, 113, 151, 226, 0, 114, 150, 221, 0, 114, 152, 205, 0, 113, 156, 184, 0, 114, 162, 162, 0, 115, 165, 147, 0, 115, 170, 119,
+ 0, 114, 172, 89, 0, 116, 172, 59, 0, 122, 170, 29, 0, 131, 167, 3, 0, 140, 163, 0, 0, 146, 158, 0, 0, 151, 153, 0,
+ 0, 155, 148, 0, 0, 158, 145, 0, 0, 161, 147, 0, 0, 112, 137, 231, 0, 116, 140, 217, 0, 117, 138, 199, 0, 118, 140, 185,
+ 0, 117, 143, 169, 0, 120, 146, 149, 0, 119, 150, 130, 0, 118, 155, 101, 0, 119, 157, 72, 0, 124, 156, 40, 0, 131, 154, 11,
+ 0, 138, 151, 1, 0, 144, 147, 0, 0, 148, 142, 0, 0, 152, 138, 0, 0, 155, 135, 0, 0, 158, 137, 0, 0, 113, 116, 242,
+ 0, 118, 120, 220, 0, 122, 122, 196, 0, 122, 125, 184, 0, 120, 128, 169, 0, 122, 127, 153, 0, 122, 130, 135, 0, 120, 136, 112,
+ 0, 122, 140, 83, 0, 126, 139, 53, 0, 131, 138, 23, 0, 136, 137, 3, 0, 141, 134, 0, 0, 145, 130, 0, 0, 148, 127, 0,
+ 0, 151, 125, 0, 0, 155, 125, 0, 0, 113, 98, 245, 0, 117, 102, 227, 0, 119, 105, 208, 0, 119, 108, 192, 0, 120, 110, 175,
+ 0, 122, 112, 157, 0, 122, 113, 141, 0, 121, 118, 124, 0, 124, 121, 94, 0, 128, 121, 65, 0, 133, 120, 36, 0, 137, 119, 10,
+ 0, 141, 117, 1, 0, 144, 115, 0, 0, 146, 113, 0, 0, 148, 111, 0, 0, 152, 111, 0, 0, 109, 76, 253, 0, 116, 78, 245,
+ 0, 119, 82, 232, 0, 121, 89, 210, 0, 121, 92, 190, 0, 122, 95, 168, 0, 122, 95, 148, 0, 123, 97, 132, 0, 127, 97, 114,
+ 0, 131, 101, 79, 0, 135, 101, 50, 0, 141, 99, 23, 0, 144, 98, 3, 0, 146, 97, 0, 0, 146, 95, 0, 0, 147, 94, 0,
+ 0, 151, 92, 0, 0, 117, 59, 252, 0, 121, 57, 251, 0, 124, 60, 241, 0, 126, 69, 221, 0, 128, 74, 201, 0, 129, 77, 182,
+ 0, 129, 80, 160, 0, 129, 81, 141, 0, 130, 82, 119, 0, 132, 84, 92, 0, 135, 85, 67, 0, 139, 85, 39, 0, 143, 82, 14,
+ 0, 144, 80, 2, 0, 144, 81, 0, 0, 143, 81, 0, 0, 145, 82, 0, 0, 123, 41, 251, 0, 127, 40, 250, 0, 130, 43, 241,
+ 0, 132, 49, 225, 0, 135, 57, 207, 0, 135, 61, 189, 0, 135, 64, 170, 0, 134, 64, 150, 0, 134, 66, 128, 0, 134, 67, 103,
+ 0, 134, 69, 79, 0, 137, 70, 55, 0, 141, 69, 28, 0, 143, 67, 6, 0, 142, 66, 0, 0, 140, 67, 0, 0, 140, 69, 0,
+ 0, 127, 25, 250, 0, 132, 23, 248, 0, 135, 26, 240, 0, 137, 34, 225, 0, 139, 41, 208, 0, 139, 43, 193, 0, 138, 47, 174,
+ 0, 137, 48, 156, 0, 136, 50, 136, 0, 136, 50, 112, 0, 136, 52, 88, 0, 137, 53, 66, 0, 140, 52, 41, 0, 142, 52, 17,
+ 0, 141, 55, 2, 0, 137, 57, 0, 0, 135, 59, 0, 0, 133, 14, 250, 0, 138, 11, 246, 0, 141, 13, 238, 0, 142, 18, 226,
+ 0, 142, 25, 208, 0, 141, 27, 193, 0, 140, 30, 177, 0, 139, 31, 160, 0, 139, 32, 141, 0, 140, 32, 120, 0, 140, 33, 98,
+ 0, 141, 33, 75, 0, 142, 34, 51, 0, 143, 35, 28, 0, 141, 36, 9, 0, 136, 41, 1, 0, 130, 48, 0, 0, 142, 9, 249,
+ 0, 144, 3, 243, 0, 145, 3, 235, 0, 145, 7, 223, 0, 143, 11, 207, 0, 143, 13, 193, 0, 142, 14, 178, 0, 141, 15, 162,
+ 0, 141, 15, 145, 0, 141, 16, 126, 0, 141, 16, 105, 0, 142, 17, 83, 0, 142, 17, 61, 0, 143, 17, 38, 0, 143, 19, 17,
+ 0, 139, 23, 2, 0, 127, 34, 0, 0, 149, 6, 249, 0, 148, 1, 237, 0, 147, 0, 227, 0, 145, 0, 216, 0, 144, 1, 204,
+ 0, 142, 2, 192, 0, 141, 2, 177, 0, 140, 2, 162, 0, 140, 2, 146, 0, 139, 3, 129, 0, 139, 3, 110, 0, 139, 3, 90,
+ 0, 138, 4, 69, 0, 139, 4, 47, 0, 140, 3, 26, 0, 138, 8, 8, 0, 127, 21, 0, 0, 153, 3, 248, 0, 151, 0, 232,
+ 0, 148, 0, 219, 0, 144, 0, 206, 0, 140, 0, 192, 0, 137, 0, 179, 0, 134, 0, 165, 0, 131, 0, 150, 0, 129, 0, 136,
+ 0, 128, 0, 122, 0, 127, 0, 107, 0, 127, 0, 91, 0, 126, 0, 73, 0, 126, 0, 54, 0, 126, 0, 35, 0, 125, 2, 17,
+ 0, 122, 10, 0, 0, 157, 0, 248, 0, 154, 0, 237, 0, 151, 0, 225, 0, 149, 0, 211, 0, 145, 0, 197, 0, 142, 0, 182,
+ 0, 139, 0, 166, 0, 134, 0, 151, 0, 129, 0, 136, 0, 127, 0, 126, 0, 125, 0, 112, 0, 123, 0, 98, 0, 122, 0, 82,
+ 0, 121, 0, 63, 0, 120, 0, 41, 0, 119, 0, 18, 0, 118, 0, 0, 0, 58, 221, 244, 0, 54, 227, 237, 0, 54, 229, 207,
+ 0, 58, 229, 183, 0, 62, 228, 160, 0, 66, 226, 126, 0, 70, 226, 87, 0, 69, 227, 49, 0, 68, 226, 20, 0, 71, 224, 3,
+ 0, 92, 212, 0, 0, 113, 204, 0, 0, 128, 197, 0, 0, 139, 193, 0, 0, 147, 188, 0, 0, 154, 184, 0, 0, 161, 180, 0,
+ 0, 67, 206, 244, 0, 69, 205, 232, 0, 75, 200, 200, 0, 76, 205, 182, 0, 75, 208, 162, 0, 80, 206, 136, 0, 84, 205, 100,
+ 0, 84, 207, 69, 0, 82, 209, 35, 0, 84, 207, 5, 0, 102, 198, 0, 0, 118, 189, 0, 0, 131, 184, 0, 0, 141, 181, 0,
+ 0, 148, 178, 0, 0, 154, 175, 0, 0, 158, 175, 0, 0, 76, 192, 244, 0, 77, 191, 235, 0, 86, 184, 197, 0, 84, 190, 181,
+ 0, 83, 195, 165, 0, 86, 196, 141, 0, 89, 196, 107, 0, 90, 196, 78, 0, 89, 197, 48, 0, 91, 197, 17, 0, 104, 190, 1,
+ 0, 120, 182, 0, 0, 131, 177, 0, 0, 140, 174, 0, 0, 147, 171, 0, 0, 152, 168, 0, 0, 156, 169, 0, 0, 84, 173, 248,
+ 0, 86, 171, 229, 0, 89, 172, 202, 0, 90, 175, 183, 0, 91, 179, 165, 0, 93, 181, 146, 0, 95, 183, 116, 0, 95, 184, 85,
+ 0, 94, 186, 58, 0, 96, 186, 28, 0, 107, 182, 3, 0, 120, 175, 0, 0, 131, 169, 0, 0, 139, 166, 0, 0, 145, 163, 0,
+ 0, 149, 160, 0, 0, 153, 163, 0, 0, 90, 151, 248, 0, 92, 152, 233, 0, 95, 156, 208, 0, 95, 159, 187, 0, 97, 163, 163,
+ 0, 99, 166, 150, 0, 100, 168, 125, 0, 100, 171, 94, 0, 99, 174, 67, 0, 100, 174, 36, 0, 108, 171, 6, 0, 121, 165, 0,
+ 0, 130, 160, 0, 0, 137, 156, 0, 0, 142, 153, 0, 0, 146, 151, 0, 0, 149, 154, 0, 0, 92, 136, 245, 0, 96, 138, 223,
+ 0, 100, 140, 205, 0, 101, 141, 193, 0, 100, 145, 172, 0, 101, 150, 152, 0, 104, 152, 135, 0, 104, 156, 106, 0, 102, 160, 78,
+ 0, 103, 161, 46, 0, 110, 158, 13, 0, 120, 154, 1, 0, 128, 149, 0, 0, 134, 145, 0, 0, 139, 142, 0, 0, 143, 140, 0,
+ 0, 147, 143, 0, 0, 95, 119, 246, 0, 99, 123, 222, 0, 104, 128, 200, 0, 103, 128, 187, 0, 105, 131, 176, 0, 103, 131, 158,
+ 0, 107, 134, 137, 0, 107, 138, 117, 0, 105, 144, 88, 0, 106, 145, 57, 0, 111, 144, 25, 0, 118, 142, 3, 0, 125, 137, 0,
+ 0, 131, 133, 0, 0, 135, 130, 0, 0, 139, 127, 0, 0, 144, 130, 0, 0, 97, 102, 243, 0, 102, 105, 223, 0, 105, 108, 207,
+ 0, 106, 110, 192, 0, 106, 113, 177, 0, 107, 117, 162, 0, 108, 115, 144, 0, 108, 120, 126, 0, 107, 126, 100, 0, 109, 128, 69,
+ 0, 113, 127, 37, 0, 118, 125, 10, 0, 124, 122, 1, 0, 129, 118, 0, 0, 133, 116, 0, 0, 136, 114, 0, 0, 141, 115, 0,
+ 0, 96, 83, 247, 0, 101, 85, 236, 0, 103, 88, 221, 0, 105, 93, 199, 0, 105, 96, 181, 0, 106, 98, 164, 0, 108, 99, 146,
+ 0, 109, 101, 129, 0, 108, 106, 108, 0, 111, 108, 80, 0, 115, 108, 50, 0, 120, 105, 21, 0, 124, 105, 2, 0, 128, 102, 0,
+ 0, 131, 100, 0, 0, 133, 98, 0, 0, 137, 98, 0, 0, 93, 62, 254, 0, 99, 62, 247, 0, 103, 66, 235, 0, 106, 74, 212,
+ 0, 108, 77, 193, 0, 108, 81, 175, 0, 109, 82, 155, 0, 110, 83, 135, 0, 111, 84, 117, 0, 112, 85, 97, 0, 117, 88, 65,
+ 0, 123, 87, 35, 0, 128, 84, 10, 0, 130, 82, 1, 0, 131, 82, 0, 0, 132, 81, 0, 0, 135, 79, 0, 0, 102, 45, 252,
+ 0, 106, 44, 250, 0, 109, 47, 241, 0, 112, 54, 225, 0, 114, 60, 206, 0, 115, 64, 188, 0, 116, 67, 169, 0, 116, 68, 148,
+ 0, 116, 70, 127, 0, 117, 70, 103, 0, 118, 72, 77, 0, 121, 73, 52, 0, 126, 70, 24, 0, 130, 64, 4, 0, 129, 66, 0,
+ 0, 128, 67, 0, 0, 129, 68, 0, 0, 108, 29, 251, 0, 112, 28, 249, 0, 115, 30, 241, 0, 118, 38, 226, 0, 120, 45, 209,
+ 0, 121, 47, 194, 0, 121, 51, 175, 0, 121, 52, 156, 0, 120, 54, 136, 0, 119, 56, 111, 0, 120, 56, 88, 0, 121, 58, 65,
+ 0, 124, 57, 40, 0, 128, 55, 15, 0, 127, 55, 1, 0, 124, 56, 0, 0, 124, 57, 0, 0, 113, 15, 251, 0, 118, 14, 246,
+ 0, 121, 17, 239, 0, 123, 23, 224, 0, 125, 30, 208, 0, 125, 32, 193, 0, 125, 34, 177, 0, 124, 35, 160, 0, 123, 37, 142,
+ 0, 121, 39, 119, 0, 122, 39, 97, 0, 123, 40, 75, 0, 124, 41, 52, 0, 127, 39, 27, 0, 128, 39, 6, 0, 123, 43, 0,
+ 0, 119, 49, 0, 0, 123, 9, 250, 0, 125, 5, 244, 0, 127, 6, 235, 0, 129, 10, 223, 0, 128, 15, 206, 0, 127, 16, 191,
+ 0, 126, 18, 176, 0, 126, 19, 160, 0, 126, 19, 144, 0, 125, 20, 125, 0, 126, 20, 105, 0, 127, 21, 83, 0, 127, 21, 61,
+ 0, 129, 21, 37, 0, 129, 23, 15, 0, 125, 26, 2, 0, 115, 36, 0, 0, 133, 6, 249, 0, 134, 1, 239, 0, 134, 1, 229,
+ 0, 133, 1, 217, 0, 131, 3, 203, 0, 129, 4, 190, 0, 128, 5, 175, 0, 127, 5, 160, 0, 126, 5, 144, 0, 125, 5, 127,
+ 0, 125, 5, 109, 0, 125, 6, 89, 0, 125, 6, 68, 0, 126, 6, 46, 0, 127, 6, 25, 0, 125, 9, 7, 0, 114, 23, 0,
+ 0, 141, 3, 249, 0, 140, 0, 233, 0, 137, 0, 220, 0, 134, 0, 206, 0, 130, 0, 192, 0, 127, 0, 178, 0, 123, 0, 164,
+ 0, 121, 0, 149, 0, 118, 0, 134, 0, 116, 0, 119, 0, 115, 0, 104, 0, 115, 0, 89, 0, 115, 0, 72, 0, 114, 0, 53,
+ 0, 114, 0, 34, 0, 113, 2, 16, 0, 110, 11, 0, 0, 147, 0, 248, 0, 144, 0, 238, 0, 142, 0, 226, 0, 139, 0, 213,
+ 0, 136, 0, 197, 0, 132, 0, 181, 0, 128, 0, 165, 0, 123, 0, 148, 0, 118, 0, 133, 0, 112, 0, 118, 0, 110, 0, 107,
+ 0, 109, 0, 94, 0, 108, 0, 79, 0, 107, 0, 61, 0, 106, 0, 41, 0, 105, 0, 18, 0, 104, 0, 0, 0, 41, 223, 245,
+ 0, 37, 227, 239, 0, 35, 233, 214, 0, 39, 234, 188, 0, 44, 233, 165, 0, 48, 233, 134, 0, 52, 233, 94, 0, 55, 234, 54,
+ 0, 59, 230, 29, 0, 60, 228, 7, 0, 65, 224, 0, 0, 87, 213, 0, 0, 107, 204, 0, 0, 121, 198, 0, 0, 133, 193, 0,
+ 0, 142, 190, 0, 0, 149, 186, 0, 0, 48, 207, 247, 0, 50, 206, 236, 0, 57, 200, 204, 0, 56, 207, 186, 0, 55, 211, 164,
+ 0, 60, 210, 142, 0, 65, 208, 110, 0, 69, 207, 78, 0, 70, 208, 49, 0, 67, 211, 13, 0, 75, 205, 0, 0, 94, 196, 0,
+ 0, 110, 188, 0, 0, 123, 184, 0, 0, 133, 181, 0, 0, 141, 180, 0, 0, 146, 181, 0, 0, 56, 193, 248, 0, 58, 192, 239,
+ 0, 67, 185, 201, 0, 66, 191, 185, 0, 64, 196, 167, 0, 67, 197, 146, 0, 71, 197, 117, 0, 74, 197, 85, 0, 74, 198, 58,
+ 0, 74, 199, 27, 0, 78, 196, 4, 0, 95, 187, 0, 0, 111, 180, 0, 0, 123, 176, 0, 0, 132, 173, 0, 0, 139, 172, 0,
+ 0, 144, 175, 0, 0, 65, 175, 250, 0, 66, 175, 241, 0, 73, 174, 205, 0, 72, 176, 186, 0, 73, 179, 167, 0, 76, 181, 149,
+ 0, 78, 182, 124, 0, 80, 184, 93, 0, 79, 187, 65, 0, 79, 188, 35, 0, 81, 187, 7, 0, 97, 179, 1, 0, 112, 172, 0,
+ 0, 122, 167, 0, 0, 129, 165, 0, 0, 136, 163, 0, 0, 140, 168, 0, 0, 73, 152, 251, 0, 73, 156, 243, 0, 78, 158, 210,
+ 0, 78, 161, 190, 0, 80, 162, 167, 0, 83, 164, 151, 0, 86, 165, 132, 0, 85, 169, 102, 0, 84, 174, 74, 0, 83, 175, 44,
+ 0, 86, 175, 12, 0, 99, 169, 1, 0, 112, 163, 0, 0, 120, 158, 0, 0, 127, 155, 0, 0, 133, 153, 0, 0, 136, 158, 0,
+ 0, 76, 136, 251, 0, 79, 139, 234, 0, 83, 142, 213, 0, 82, 145, 196, 0, 82, 148, 175, 0, 84, 151, 152, 0, 87, 152, 136,
+ 0, 88, 156, 111, 0, 87, 161, 83, 0, 87, 162, 53, 0, 89, 161, 20, 0, 99, 158, 2, 0, 110, 153, 0, 0, 118, 148, 0,
+ 0, 124, 144, 0, 0, 130, 142, 0, 0, 133, 147, 0, 0, 77, 121, 250, 0, 82, 126, 226, 0, 86, 129, 204, 0, 87, 130, 192,
+ 0, 87, 131, 180, 0, 87, 135, 160, 0, 88, 139, 140, 0, 89, 142, 120, 0, 89, 146, 93, 0, 89, 149, 64, 0, 90, 148, 32,
+ 0, 97, 147, 4, 0, 107, 142, 0, 0, 115, 137, 0, 0, 122, 132, 0, 0, 127, 129, 0, 0, 131, 133, 0, 0, 81, 104, 247,
+ 0, 85, 108, 227, 0, 87, 112, 210, 0, 89, 116, 194, 0, 89, 118, 177, 0, 90, 119, 163, 0, 89, 122, 146, 0, 93, 125, 124,
+ 0, 93, 128, 103, 0, 91, 133, 74, 0, 92, 133, 41, 0, 97, 131, 11, 0, 106, 128, 1, 0, 113, 123, 0, 0, 119, 119, 0,
+ 0, 124, 116, 0, 0, 128, 118, 0, 0, 82, 87, 246, 0, 86, 89, 232, 0, 88, 93, 217, 0, 90, 97, 197, 0, 93, 99, 177,
+ 0, 92, 101, 164, 0, 92, 105, 147, 0, 94, 106, 130, 0, 96, 108, 108, 0, 94, 114, 83, 0, 93, 117, 53, 0, 99, 113, 22,
+ 0, 105, 112, 2, 0, 112, 108, 0, 0, 117, 105, 0, 0, 120, 102, 0, 0, 125, 102, 0, 0, 79, 69, 248, 0, 84, 71, 238,
+ 0, 87, 74, 225, 0, 90, 78, 205, 0, 91, 81, 187, 0, 91, 85, 173, 0, 91, 86, 155, 0, 94, 88, 135, 0, 94, 89, 114,
+ 0, 92, 94, 92, 0, 96, 96, 65, 0, 102, 94, 34, 0, 107, 92, 9, 0, 112, 91, 1, 0, 115, 89, 0, 0, 117, 87, 0,
+ 0, 121, 86, 0, 0, 76, 49, 254, 0, 83, 49, 247, 0, 87, 52, 237, 0, 90, 59, 220, 0, 92, 64, 203, 0, 94, 66, 186,
+ 0, 94, 69, 167, 0, 95, 70, 146, 0, 96, 72, 122, 0, 96, 74, 103, 0, 95, 74, 84, 0, 103, 75, 49, 0, 110, 72, 20,
+ 0, 113, 71, 2, 0, 115, 70, 0, 0, 115, 70, 0, 0, 118, 68, 0, 0, 85, 33, 253, 0, 90, 32, 250, 0, 94, 35, 241,
+ 0, 97, 41, 227, 0, 99, 47, 209, 0, 101, 50, 193, 0, 102, 54, 175, 0, 102, 56, 156, 0, 102, 58, 133, 0, 101, 59, 110,
+ 0, 102, 59, 88, 0, 104, 60, 63, 0, 109, 58, 37, 0, 113, 55, 12, 0, 113, 56, 1, 0, 111, 59, 0, 0, 111, 60, 0,
+ 0, 93, 18, 251, 0, 98, 17, 249, 0, 101, 20, 241, 0, 104, 26, 227, 0, 106, 33, 210, 0, 107, 35, 195, 0, 108, 38, 178,
+ 0, 108, 39, 161, 0, 108, 40, 142, 0, 106, 43, 119, 0, 105, 44, 96, 0, 107, 44, 74, 0, 108, 46, 50, 0, 111, 44, 26,
+ 0, 113, 43, 4, 0, 109, 46, 0, 0, 106, 48, 0, 0, 103, 10, 250, 0, 105, 7, 245, 0, 108, 9, 236, 0, 110, 13, 224,
+ 0, 110, 19, 207, 0, 110, 20, 192, 0, 111, 23, 177, 0, 111, 23, 161, 0, 111, 24, 145, 0, 110, 25, 126, 0, 109, 27, 104,
+ 0, 109, 27, 83, 0, 110, 27, 61, 0, 112, 29, 37, 0, 114, 27, 14, 0, 111, 30, 1, 0, 102, 36, 0, 0, 114, 6, 250,
+ 0, 114, 2, 242, 0, 114, 2, 232, 0, 114, 4, 218, 0, 113, 6, 203, 0, 113, 7, 188, 0, 112, 8, 173, 0, 112, 8, 158,
+ 0, 111, 8, 142, 0, 110, 8, 126, 0, 110, 9, 108, 0, 110, 9, 89, 0, 111, 9, 68, 0, 111, 9, 45, 0, 113, 10, 23,
+ 0, 112, 12, 5, 0, 100, 24, 0, 0, 124, 3, 249, 0, 123, 0, 236, 0, 121, 0, 223, 0, 119, 0, 209, 0, 116, 1, 193,
+ 0, 114, 1, 179, 0, 111, 1, 164, 0, 109, 1, 149, 0, 106, 1, 134, 0, 104, 1, 118, 0, 102, 1, 103, 0, 103, 1, 88,
+ 0, 103, 1, 71, 0, 103, 1, 52, 0, 102, 1, 33, 0, 102, 3, 14, 0, 97, 12, 0, 0, 133, 0, 249, 0, 130, 0, 239,
+ 0, 128, 0, 228, 0, 126, 0, 214, 0, 123, 0, 198, 0, 119, 0, 181, 0, 115, 0, 164, 0, 110, 0, 147, 0, 105, 0, 130,
+ 0, 100, 0, 114, 0, 95, 0, 100, 0, 94, 0, 89, 0, 93, 0, 75, 0, 92, 0, 58, 0, 92, 0, 39, 0, 91, 0, 18,
+ 0, 90, 0, 0, 0, 32, 224, 245, 0, 30, 229, 243, 0, 23, 238, 229, 0, 22, 242, 196, 0, 29, 240, 168, 0, 34, 239, 139,
+ 0, 39, 239, 104, 0, 44, 239, 61, 0, 48, 237, 32, 0, 50, 234, 11, 0, 54, 229, 2, 0, 60, 224, 0, 0, 82, 214, 0,
+ 0, 101, 205, 0, 0, 115, 199, 0, 0, 126, 193, 0, 0, 136, 190, 0, 0, 34, 207, 247, 0, 34, 207, 238, 0, 39, 204, 211,
+ 0, 38, 209, 191, 0, 38, 213, 168, 0, 42, 214, 145, 0, 46, 212, 119, 0, 53, 210, 86, 0, 56, 210, 58, 0, 56, 211, 30,
+ 0, 57, 210, 5, 0, 68, 204, 0, 0, 86, 195, 0, 0, 103, 189, 0, 0, 116, 184, 0, 0, 126, 182, 0, 0, 132, 184, 0,
+ 0, 40, 193, 248, 0, 39, 194, 242, 0, 45, 191, 209, 0, 46, 193, 188, 0, 46, 197, 169, 0, 49, 198, 148, 0, 52, 198, 125,
+ 0, 56, 198, 94, 0, 59, 199, 65, 0, 60, 200, 37, 0, 59, 200, 10, 0, 69, 194, 1, 0, 87, 186, 0, 0, 103, 179, 0,
+ 0, 115, 176, 0, 0, 123, 174, 0, 0, 129, 177, 0, 0, 48, 176, 249, 0, 47, 177, 245, 0, 49, 179, 219, 0, 51, 179, 192,
+ 0, 54, 181, 170, 0, 56, 184, 153, 0, 58, 185, 131, 0, 61, 186, 101, 0, 63, 188, 71, 0, 63, 189, 42, 0, 63, 190, 12,
+ 0, 72, 185, 1, 0, 90, 176, 0, 0, 104, 170, 0, 0, 113, 167, 0, 0, 120, 165, 0, 0, 126, 170, 0, 0, 58, 156, 251,
+ 0, 55, 158, 248, 0, 55, 163, 226, 0, 58, 164, 196, 0, 61, 163, 168, 0, 63, 167, 153, 0, 64, 169, 134, 0, 66, 172, 109,
+ 0, 68, 175, 80, 0, 68, 177, 51, 0, 68, 177, 18, 0, 76, 174, 1, 0, 91, 166, 0, 0, 102, 161, 0, 0, 111, 158, 0,
+ 0, 118, 156, 0, 0, 122, 161, 0, 0, 63, 136, 252, 0, 62, 138, 245, 0, 64, 145, 222, 0, 64, 148, 200, 0, 65, 150, 177,
+ 0, 67, 153, 154, 0, 69, 155, 139, 0, 69, 158, 117, 0, 71, 162, 90, 0, 72, 164, 62, 0, 72, 164, 28, 0, 76, 162, 3,
+ 0, 89, 156, 0, 0, 100, 152, 0, 0, 108, 148, 0, 0, 115, 145, 0, 0, 119, 151, 0, 0, 62, 122, 251, 0, 66, 126, 232,
+ 0, 70, 131, 209, 0, 72, 133, 198, 0, 71, 135, 184, 0, 71, 139, 162, 0, 71, 141, 138, 0, 71, 145, 121, 0, 73, 148, 96,
+ 0, 74, 151, 69, 0, 73, 151, 38, 0, 75, 150, 7, 0, 87, 146, 0, 0, 98, 140, 0, 0, 106, 136, 0, 0, 113, 133, 0,
+ 0, 116, 138, 0, 0, 64, 106, 248, 0, 68, 111, 228, 0, 71, 118, 207, 0, 73, 119, 194, 0, 74, 121, 181, 0, 75, 122, 168,
+ 0, 75, 128, 146, 0, 73, 130, 124, 0, 75, 132, 103, 0, 76, 136, 78, 0, 74, 139, 48, 0, 75, 137, 17, 0, 85, 133, 1,
+ 0, 96, 128, 0, 0, 104, 123, 0, 0, 111, 120, 0, 0, 114, 124, 0, 0, 67, 88, 247, 0, 73, 93, 230, 0, 75, 97, 212,
+ 0, 76, 100, 197, 0, 77, 104, 181, 0, 76, 107, 166, 0, 77, 108, 150, 0, 77, 111, 132, 0, 79, 113, 106, 0, 78, 117, 87,
+ 0, 75, 124, 58, 0, 77, 122, 27, 0, 84, 119, 3, 0, 94, 114, 0, 0, 102, 109, 0, 0, 108, 106, 0, 0, 111, 108, 0,
+ 0, 66, 72, 246, 0, 72, 78, 229, 0, 74, 81, 215, 0, 75, 83, 202, 0, 76, 86, 188, 0, 79, 88, 173, 0, 78, 90, 155,
+ 0, 79, 94, 137, 0, 80, 94, 117, 0, 79, 97, 94, 0, 78, 102, 69, 0, 80, 102, 41, 0, 86, 100, 14, 0, 93, 97, 1,
+ 0, 99, 93, 0, 0, 104, 91, 0, 0, 107, 92, 0, 0, 63, 55, 249, 0, 68, 56, 238, 0, 71, 60, 227, 0, 74, 65, 212,
+ 0, 75, 67, 199, 0, 77, 70, 181, 0, 78, 74, 161, 0, 78, 76, 142, 0, 80, 77, 120, 0, 79, 79, 100, 0, 78, 82, 77,
+ 0, 82, 82, 52, 0, 88, 81, 23, 0, 93, 79, 2, 0, 97, 77, 0, 0, 100, 75, 0, 0, 103, 75, 0, 0, 59, 36, 254,
+ 0, 67, 36, 247, 0, 71, 40, 237, 0, 75, 45, 223, 0, 77, 50, 207, 0, 79, 53, 190, 0, 80, 57, 172, 0, 81, 58, 153,
+ 0, 81, 60, 130, 0, 81, 62, 107, 0, 81, 62, 88, 0, 80, 62, 71, 0, 89, 60, 34, 0, 95, 61, 7, 0, 97, 61, 0,
+ 0, 98, 61, 0, 0, 99, 59, 0, 0, 69, 21, 253, 0, 75, 20, 250, 0, 79, 22, 243, 0, 82, 29, 228, 0, 84, 35, 211,
+ 0, 85, 37, 196, 0, 85, 40, 180, 0, 86, 42, 161, 0, 87, 43, 142, 0, 87, 45, 118, 0, 86, 46, 96, 0, 88, 46, 75,
+ 0, 90, 47, 48, 0, 94, 44, 22, 0, 96, 44, 3, 0, 95, 46, 0, 0, 93, 48, 0, 0, 82, 12, 252, 0, 84, 9, 248,
+ 0, 87, 10, 241, 0, 90, 14, 229, 0, 90, 21, 211, 0, 91, 23, 196, 0, 91, 25, 180, 0, 92, 26, 163, 0, 93, 27, 146,
+ 0, 93, 28, 126, 0, 91, 30, 104, 0, 91, 30, 82, 0, 92, 30, 60, 0, 93, 32, 35, 0, 96, 30, 13, 0, 94, 32, 1,
+ 0, 88, 36, 0, 0, 93, 6, 251, 0, 94, 2, 244, 0, 94, 3, 235, 0, 95, 5, 222, 0, 95, 9, 207, 0, 95, 9, 192,
+ 0, 96, 11, 176, 0, 96, 11, 160, 0, 96, 11, 144, 0, 95, 12, 127, 0, 95, 12, 109, 0, 93, 14, 88, 0, 94, 14, 68,
+ 0, 95, 14, 45, 0, 96, 15, 22, 0, 97, 16, 3, 0, 85, 24, 0, 0, 105, 3, 250, 0, 104, 0, 238, 0, 102, 0, 227,
+ 0, 101, 0, 214, 0, 100, 1, 200, 0, 99, 1, 184, 0, 98, 1, 168, 0, 96, 1, 151, 0, 94, 1, 135, 0, 93, 1, 120,
+ 0, 91, 1, 104, 0, 90, 1, 87, 0, 91, 1, 71, 0, 91, 1, 51, 0, 91, 1, 31, 0, 90, 3, 12, 0, 81, 12, 0,
+ 0, 115, 0, 250, 0, 112, 0, 241, 0, 110, 0, 231, 0, 109, 0, 217, 0, 107, 0, 201, 0, 104, 0, 184, 0, 101, 0, 165,
+ 0, 97, 0, 146, 0, 92, 0, 129, 0, 88, 0, 112, 0, 83, 0, 97, 0, 78, 0, 82, 0, 77, 0, 71, 0, 77, 0, 56,
+ 0, 77, 0, 37, 0, 76, 0, 18, 0, 75, 0, 0, 0, 26, 226, 245, 0, 26, 229, 244, 0, 20, 236, 236, 0, 14, 244, 202,
+ 0, 17, 244, 172, 0, 21, 245, 145, 0, 25, 244, 112, 0, 30, 244, 69, 0, 37, 244, 34, 0, 42, 238, 14, 0, 47, 234, 5,
+ 0, 51, 228, 0, 0, 56, 224, 0, 0, 77, 215, 0, 0, 95, 206, 0, 0, 109, 199, 0, 0, 120, 194, 0, 0, 26, 208, 247,
+ 0, 23, 209, 238, 0, 26, 207, 214, 0, 25, 212, 194, 0, 24, 216, 172, 0, 27, 217, 149, 0, 31, 215, 124, 0, 37, 214, 95,
+ 0, 43, 213, 64, 0, 46, 213, 41, 0, 46, 212, 14, 0, 50, 209, 1, 0, 61, 203, 0, 0, 79, 196, 0, 0, 95, 190, 0,
+ 0, 108, 186, 0, 0, 117, 187, 0, 0, 27, 192, 248, 0, 24, 195, 243, 0, 27, 196, 212, 0, 29, 197, 189, 0, 31, 199, 172,
+ 0, 33, 200, 152, 0, 36, 201, 130, 0, 40, 201, 103, 0, 44, 201, 72, 0, 47, 201, 44, 0, 47, 201, 18, 0, 51, 199, 2,
+ 0, 62, 193, 0, 0, 80, 185, 0, 0, 96, 180, 0, 0, 106, 178, 0, 0, 113, 181, 0, 0, 33, 176, 249, 0, 31, 178, 247,
+ 0, 30, 183, 226, 0, 33, 183, 193, 0, 36, 183, 170, 0, 38, 187, 154, 0, 39, 189, 133, 0, 42, 190, 108, 0, 46, 190, 77,
+ 0, 48, 192, 48, 0, 49, 191, 19, 0, 54, 190, 1, 0, 66, 183, 0, 0, 83, 175, 0, 0, 94, 170, 0, 0, 104, 169, 0,
+ 0, 110, 174, 0, 0, 42, 158, 250, 0, 39, 160, 249, 0, 37, 166, 234, 0, 39, 167, 200, 0, 42, 166, 170, 0, 42, 172, 155,
+ 0, 43, 176, 138, 0, 45, 178, 116, 0, 49, 178, 86, 0, 51, 180, 57, 0, 52, 181, 26, 0, 55, 180, 2, 0, 68, 172, 0,
+ 0, 81, 165, 0, 0, 92, 161, 0, 0, 101, 159, 0, 0, 106, 165, 0, 0, 49, 138, 251, 0, 46, 139, 248, 0, 45, 146, 232,
+ 0, 46, 151, 205, 0, 46, 154, 180, 0, 46, 158, 155, 0, 47, 160, 140, 0, 49, 163, 121, 0, 51, 166, 95, 0, 53, 167, 68,
+ 0, 53, 169, 37, 0, 54, 169, 6, 0, 66, 162, 0, 0, 79, 155, 0, 0, 90, 150, 0, 0, 99, 148, 0, 0, 102, 155, 0,
+ 0, 49, 122, 251, 0, 50, 125, 239, 0, 54, 131, 218, 0, 54, 135, 204, 0, 52, 139, 186, 0, 52, 142, 164, 0, 52, 144, 140,
+ 0, 52, 149, 124, 0, 52, 153, 102, 0, 54, 154, 75, 0, 55, 157, 45, 0, 54, 156, 14, 0, 63, 151, 1, 0, 77, 144, 0,
+ 0, 89, 139, 0, 0, 97, 137, 0, 0, 99, 143, 0, 0, 49, 108, 250, 0, 52, 112, 230, 0, 57, 119, 208, 0, 57, 121, 198,
+ 0, 57, 123, 186, 0, 57, 126, 172, 0, 56, 131, 148, 0, 54, 135, 125, 0, 56, 137, 106, 0, 57, 139, 81, 0, 56, 144, 53,
+ 0, 55, 143, 23, 0, 60, 140, 2, 0, 76, 132, 0, 0, 87, 127, 0, 0, 95, 124, 0, 0, 98, 129, 0, 0, 52, 90, 250,
+ 0, 57, 95, 228, 0, 60, 101, 205, 0, 59, 105, 196, 0, 59, 108, 183, 0, 60, 110, 169, 0, 61, 111, 155, 0, 60, 116, 132,
+ 0, 59, 117, 108, 0, 59, 121, 88, 0, 57, 127, 64, 0, 56, 129, 32, 0, 59, 128, 5, 0, 74, 119, 0, 0, 85, 113, 0,
+ 0, 92, 110, 0, 0, 96, 114, 0, 0, 53, 73, 247, 0, 59, 78, 230, 0, 61, 83, 214, 0, 61, 85, 203, 0, 61, 89, 191,
+ 0, 62, 92, 175, 0, 62, 95, 154, 0, 64, 97, 137, 0, 63, 99, 118, 0, 62, 100, 92, 0, 63, 103, 73, 0, 61, 108, 46,
+ 0, 62, 108, 18, 0, 73, 103, 1, 0, 83, 98, 0, 0, 89, 94, 0, 0, 92, 97, 0, 0, 51, 58, 246, 0, 54, 62, 233,
+ 0, 56, 66, 222, 0, 58, 70, 210, 0, 59, 72, 197, 0, 62, 75, 178, 0, 66, 77, 155, 0, 65, 79, 139, 0, 65, 81, 121,
+ 0, 66, 82, 99, 0, 65, 83, 79, 0, 64, 87, 56, 0, 65, 88, 29, 0, 72, 86, 3, 0, 80, 82, 0, 0, 86, 79, 0,
+ 0, 88, 80, 0, 0, 47, 42, 250, 0, 53, 43, 238, 0, 56, 47, 228, 0, 58, 52, 215, 0, 59, 55, 202, 0, 61, 58, 184,
+ 0, 63, 61, 166, 0, 64, 63, 148, 0, 64, 65, 129, 0, 65, 66, 105, 0, 64, 67, 85, 0, 62, 69, 63, 0, 66, 69, 36,
+ 0, 73, 68, 9, 0, 79, 66, 1, 0, 82, 65, 0, 0, 83, 65, 0, 0, 44, 26, 254, 0, 53, 25, 247, 0, 57, 26, 239,
+ 0, 59, 33, 225, 0, 61, 37, 209, 0, 62, 39, 195, 0, 63, 42, 180, 0, 65, 44, 162, 0, 66, 46, 142, 0, 66, 48, 117,
+ 0, 66, 49, 94, 0, 66, 48, 75, 0, 65, 48, 57, 0, 74, 46, 19, 0, 79, 47, 2, 0, 80, 47, 0, 0, 80, 47, 0,
+ 0, 58, 15, 253, 0, 61, 12, 249, 0, 65, 12, 242, 0, 68, 15, 231, 0, 68, 23, 212, 0, 68, 24, 198, 0, 69, 27, 183,
+ 0, 70, 28, 166, 0, 71, 29, 147, 0, 72, 30, 126, 0, 72, 32, 103, 0, 71, 33, 82, 0, 73, 32, 59, 0, 75, 33, 33,
+ 0, 79, 32, 9, 0, 78, 32, 1, 0, 75, 34, 0, 0, 72, 8, 252, 0, 73, 4, 246, 0, 74, 3, 240, 0, 75, 6, 228,
+ 0, 75, 10, 212, 0, 75, 11, 198, 0, 76, 13, 181, 0, 76, 13, 165, 0, 77, 14, 147, 0, 78, 14, 129, 0, 78, 15, 110,
+ 0, 76, 16, 88, 0, 76, 17, 67, 0, 77, 17, 44, 0, 78, 19, 20, 0, 79, 19, 2, 0, 70, 24, 0, 0, 84, 3, 251,
+ 0, 84, 1, 241, 0, 83, 0, 231, 0, 82, 0, 220, 0, 81, 1, 207, 0, 81, 1, 193, 0, 81, 2, 176, 0, 80, 1, 158,
+ 0, 80, 1, 140, 0, 79, 1, 124, 0, 79, 1, 108, 0, 78, 2, 90, 0, 77, 2, 71, 0, 77, 2, 51, 0, 78, 2, 29,
+ 0, 77, 4, 9, 0, 67, 12, 0, 0, 96, 0, 251, 0, 93, 0, 242, 0, 92, 0, 232, 0, 91, 0, 220, 0, 89, 0, 205,
+ 0, 88, 0, 188, 0, 85, 0, 169, 0, 82, 0, 148, 0, 78, 0, 128, 0, 74, 0, 111, 0, 70, 0, 95, 0, 66, 0, 79,
+ 0, 63, 0, 67, 0, 62, 0, 54, 0, 62, 0, 37, 0, 62, 0, 18, 0, 61, 0, 0, 0, 20, 229, 245, 0, 21, 230, 245,
+ 0, 18, 234, 239, 0, 10, 242, 207, 0, 12, 244, 177, 0, 16, 243, 153, 0, 20, 243, 125, 0, 25, 243, 91, 0, 30, 243, 52,
+ 0, 36, 241, 25, 0, 41, 236, 12, 0, 45, 232, 5, 0, 48, 227, 0, 0, 52, 225, 0, 0, 72, 215, 0, 0, 89, 207, 0,
+ 0, 103, 200, 0, 0, 20, 209, 246, 0, 15, 208, 235, 0, 19, 207, 212, 0, 18, 211, 194, 0, 14, 217, 177, 0, 16, 218, 156,
+ 0, 18, 219, 130, 0, 23, 218, 104, 0, 29, 216, 72, 0, 35, 215, 47, 0, 39, 213, 28, 0, 40, 213, 7, 0, 45, 208, 0,
+ 0, 54, 203, 0, 0, 72, 197, 0, 0, 88, 192, 0, 0, 98, 193, 0, 0, 20, 192, 247, 0, 14, 196, 242, 0, 16, 197, 210,
+ 0, 17, 199, 188, 0, 18, 201, 173, 0, 19, 203, 156, 0, 22, 203, 134, 0, 26, 203, 112, 0, 30, 203, 82, 0, 35, 204, 53,
+ 0, 37, 205, 28, 0, 38, 203, 4, 0, 47, 198, 0, 0, 57, 192, 0, 0, 74, 186, 0, 0, 86, 183, 0, 0, 94, 187, 0,
+ 0, 23, 176, 248, 0, 19, 179, 246, 0, 16, 184, 226, 0, 17, 186, 193, 0, 18, 188, 171, 0, 20, 190, 157, 0, 22, 192, 137,
+ 0, 26, 192, 116, 0, 30, 192, 88, 0, 34, 194, 58, 0, 36, 195, 28, 0, 38, 193, 4, 0, 49, 188, 0, 0, 60, 182, 0,
+ 0, 73, 176, 0, 0, 84, 173, 0, 0, 91, 179, 0, 0, 29, 159, 249, 0, 25, 160, 248, 0, 22, 166, 233, 0, 21, 170, 200,
+ 0, 21, 172, 172, 0, 21, 177, 156, 0, 23, 180, 140, 0, 26, 180, 120, 0, 29, 181, 94, 0, 33, 182, 65, 0, 35, 185, 35,
+ 0, 36, 184, 7, 0, 46, 179, 0, 0, 58, 172, 0, 0, 71, 166, 0, 0, 83, 162, 0, 0, 88, 170, 0, 0, 35, 140, 250,
+ 0, 32, 141, 249, 0, 28, 146, 236, 0, 27, 153, 207, 0, 25, 157, 181, 0, 24, 160, 156, 0, 27, 163, 140, 0, 29, 165, 123,
+ 0, 30, 168, 101, 0, 33, 170, 73, 0, 35, 173, 45, 0, 35, 174, 15, 0, 43, 169, 1, 0, 55, 162, 0, 0, 70, 155, 0,
+ 0, 81, 151, 0, 0, 85, 159, 0, 0, 37, 124, 251, 0, 36, 125, 245, 0, 35, 129, 232, 0, 33, 136, 212, 0, 31, 143, 191,
+ 0, 31, 147, 169, 0, 32, 147, 139, 0, 32, 151, 125, 0, 32, 155, 106, 0, 34, 157, 79, 0, 35, 160, 52, 0, 35, 162, 22,
+ 0, 40, 159, 2, 0, 53, 152, 0, 0, 69, 143, 0, 0, 80, 139, 0, 0, 82, 148, 0, 0, 36, 109, 251, 0, 37, 112, 235,
+ 0, 38, 117, 216, 0, 39, 122, 206, 0, 39, 127, 195, 0, 37, 131, 175, 0, 37, 135, 150, 0, 36, 137, 126, 0, 37, 140, 108,
+ 0, 37, 143, 86, 0, 36, 146, 60, 0, 35, 150, 29, 0, 37, 148, 4, 0, 52, 140, 0, 0, 68, 131, 0, 0, 79, 127, 0,
+ 0, 80, 134, 0, 0, 37, 92, 250, 0, 40, 98, 228, 0, 42, 105, 205, 0, 42, 108, 198, 0, 42, 110, 184, 0, 43, 113, 173,
+ 0, 43, 116, 159, 0, 41, 120, 134, 0, 41, 120, 108, 0, 40, 124, 92, 0, 39, 129, 68, 0, 37, 134, 39, 0, 37, 135, 9,
+ 0, 50, 128, 1, 0, 66, 119, 0, 0, 77, 114, 0, 0, 78, 120, 0, 0, 40, 74, 249, 0, 43, 78, 234, 0, 44, 84, 216,
+ 0, 45, 89, 204, 0, 44, 93, 191, 0, 44, 96, 171, 0, 45, 98, 157, 0, 47, 99, 139, 0, 44, 103, 119, 0, 43, 103, 94,
+ 0, 44, 106, 74, 0, 42, 111, 49, 0, 40, 115, 19, 0, 49, 111, 2, 0, 64, 102, 0, 0, 74, 98, 0, 0, 75, 103, 0,
+ 0, 41, 59, 248, 0, 43, 62, 236, 0, 44, 65, 225, 0, 45, 71, 209, 0, 47, 75, 194, 0, 49, 78, 177, 0, 49, 81, 158,
+ 0, 48, 83, 141, 0, 49, 84, 124, 0, 47, 86, 101, 0, 49, 85, 78, 0, 47, 89, 58, 0, 43, 94, 32, 0, 47, 93, 5,
+ 0, 62, 86, 0, 0, 70, 83, 0, 0, 71, 85, 0, 0, 38, 45, 248, 0, 41, 49, 233, 0, 42, 52, 223, 0, 43, 57, 209,
+ 0, 44, 61, 196, 0, 46, 64, 180, 0, 48, 65, 165, 0, 50, 66, 146, 0, 51, 68, 129, 0, 50, 69, 107, 0, 50, 70, 86,
+ 0, 48, 70, 65, 0, 48, 74, 41, 0, 50, 73, 15, 0, 59, 71, 1, 0, 67, 68, 0, 0, 67, 69, 0, 0, 35, 31, 252,
+ 0, 39, 33, 236, 0, 42, 35, 226, 0, 44, 39, 214, 0, 45, 41, 200, 0, 45, 45, 188, 0, 46, 48, 174, 0, 48, 50, 156,
+ 0, 49, 52, 135, 0, 50, 53, 114, 0, 50, 54, 91, 0, 49, 54, 71, 0, 47, 56, 46, 0, 52, 55, 21, 0, 59, 53, 2,
+ 0, 63, 51, 0, 0, 63, 52, 0, 0, 32, 18, 254, 0, 39, 16, 246, 0, 43, 17, 238, 0, 45, 20, 227, 0, 46, 25, 210,
+ 0, 46, 27, 196, 0, 47, 29, 182, 0, 49, 30, 164, 0, 49, 32, 144, 0, 50, 33, 124, 0, 51, 35, 100, 0, 52, 35, 78,
+ 0, 51, 35, 59, 0, 48, 37, 42, 0, 59, 33, 6, 0, 61, 34, 0, 0, 61, 36, 0, 0, 47, 10, 253, 0, 49, 6, 248,
+ 0, 51, 5, 241, 0, 52, 7, 231, 0, 52, 13, 214, 0, 51, 14, 199, 0, 52, 15, 184, 0, 53, 16, 167, 0, 54, 17, 149,
+ 0, 55, 18, 130, 0, 56, 18, 109, 0, 56, 19, 87, 0, 56, 20, 66, 0, 58, 19, 43, 0, 60, 21, 17, 0, 61, 21, 2,
+ 0, 56, 24, 0, 0, 62, 4, 252, 0, 62, 1, 245, 0, 61, 0, 236, 0, 60, 1, 227, 0, 60, 3, 214, 0, 60, 3, 199,
+ 0, 60, 3, 183, 0, 60, 4, 164, 0, 60, 4, 146, 0, 61, 4, 128, 0, 62, 4, 109, 0, 61, 4, 91, 0, 60, 5, 71,
+ 0, 61, 4, 50, 0, 63, 4, 28, 0, 62, 6, 6, 0, 53, 13, 0, 0, 75, 0, 252, 0, 73, 0, 243, 0, 72, 0, 235,
+ 0, 71, 0, 224, 0, 70, 0, 210, 0, 69, 0, 194, 0, 67, 0, 174, 0, 65, 0, 152, 0, 62, 0, 129, 0, 59, 0, 110,
+ 0, 56, 0, 93, 0, 53, 0, 77, 0, 50, 0, 64, 0, 49, 0, 52, 0, 49, 0, 38, 0, 50, 0, 20, 0, 48, 0, 0,
+ 0, 14, 230, 245, 0, 14, 231, 245, 0, 12, 235, 239, 0, 8, 239, 208, 0, 10, 240, 181, 0, 14, 240, 159, 0, 17, 240, 137,
+ 0, 21, 240, 109, 0, 26, 239, 73, 0, 32, 240, 41, 0, 36, 238, 22, 0, 40, 234, 12, 0, 43, 231, 5, 0, 45, 227, 0,
+ 0, 48, 225, 0, 0, 67, 216, 0, 0, 84, 207, 0, 0, 13, 211, 246, 0, 10, 208, 231, 0, 12, 207, 211, 0, 12, 211, 194,
+ 0, 8, 217, 180, 0, 9, 219, 161, 0, 11, 219, 137, 0, 15, 220, 111, 0, 20, 219, 84, 0, 28, 216, 57, 0, 33, 214, 39,
+ 0, 36, 213, 24, 0, 37, 212, 6, 0, 41, 209, 0, 0, 49, 205, 0, 0, 66, 200, 0, 0, 78, 199, 0, 0, 13, 194, 247,
+ 0, 7, 197, 240, 0, 7, 198, 209, 0, 8, 200, 187, 0, 9, 203, 173, 0, 9, 205, 158, 0, 11, 206, 139, 0, 13, 206, 116,
+ 0, 17, 205, 91, 0, 23, 205, 62, 0, 27, 205, 38, 0, 29, 204, 17, 0, 35, 202, 3, 0, 42, 198, 0, 0, 51, 194, 0,
+ 0, 63, 190, 0, 0, 73, 193, 0, 0, 15, 177, 248, 0, 10, 180, 245, 0, 6, 186, 221, 0, 5, 189, 189, 0, 5, 192, 168,
+ 0, 6, 194, 157, 0, 8, 195, 140, 0, 11, 194, 120, 0, 14, 193, 97, 0, 18, 194, 69, 0, 21, 195, 40, 0, 23, 196, 15,
+ 0, 30, 193, 2, 0, 40, 188, 0, 0, 49, 184, 0, 0, 61, 180, 0, 0, 70, 186, 0, 0, 18, 159, 249, 0, 15, 161, 247,
+ 0, 10, 167, 230, 0, 8, 173, 198, 0, 5, 178, 170, 0, 5, 181, 155, 0, 6, 182, 141, 0, 9, 181, 123, 0, 12, 181, 102,
+ 0, 15, 182, 76, 0, 18, 184, 47, 0, 20, 186, 19, 0, 25, 183, 2, 0, 37, 179, 0, 0, 46, 175, 0, 0, 60, 169, 0,
+ 0, 67, 177, 0, 0, 22, 140, 250, 0, 20, 142, 249, 0, 15, 147, 237, 0, 12, 156, 207, 0, 9, 161, 179, 0, 7, 164, 154,
+ 0, 8, 164, 139, 0, 10, 166, 124, 0, 12, 168, 106, 0, 14, 169, 80, 0, 16, 171, 54, 0, 17, 174, 27, 0, 20, 173, 3,
+ 0, 33, 169, 0, 0, 45, 163, 0, 0, 59, 157, 0, 0, 64, 166, 0, 0, 25, 123, 251, 0, 24, 123, 249, 0, 20, 128, 241,
+ 0, 17, 137, 216, 0, 13, 143, 190, 0, 11, 146, 163, 0, 11, 145, 138, 0, 12, 150, 124, 0, 13, 153, 107, 0, 14, 156, 85,
+ 0, 15, 158, 61, 0, 15, 161, 33, 0, 17, 161, 6, 0, 32, 157, 0, 0, 45, 151, 0, 0, 59, 145, 0, 0, 62, 154, 0,
+ 0, 24, 109, 251, 0, 23, 111, 239, 0, 22, 115, 225, 0, 21, 121, 211, 0, 20, 126, 195, 0, 17, 132, 174, 0, 17, 135, 152,
+ 0, 14, 135, 124, 0, 16, 138, 108, 0, 16, 141, 89, 0, 16, 145, 67, 0, 16, 147, 40, 0, 16, 149, 11, 0, 30, 145, 1,
+ 0, 45, 139, 0, 0, 59, 133, 0, 0, 61, 141, 0, 0, 24, 94, 251, 0, 24, 98, 231, 0, 24, 103, 205, 0, 24, 106, 197,
+ 0, 25, 112, 189, 0, 26, 116, 179, 0, 24, 120, 160, 0, 22, 123, 135, 0, 22, 122, 110, 0, 21, 126, 92, 0, 19, 129, 73,
+ 0, 18, 132, 48, 0, 17, 135, 18, 0, 27, 132, 1, 0, 44, 126, 0, 0, 58, 119, 0, 0, 59, 127, 0, 0, 25, 76, 251,
+ 0, 27, 80, 236, 0, 27, 86, 216, 0, 27, 91, 199, 0, 27, 96, 187, 0, 28, 97, 170, 0, 28, 101, 160, 0, 29, 102, 144,
+ 0, 26, 106, 120, 0, 23, 106, 93, 0, 24, 109, 76, 0, 23, 112, 53, 0, 20, 118, 26, 0, 25, 116, 3, 0, 42, 108, 0,
+ 0, 56, 101, 0, 0, 57, 109, 0, 0, 27, 59, 251, 0, 29, 61, 241, 0, 29, 65, 229, 0, 31, 73, 206, 0, 34, 78, 187,
+ 0, 32, 82, 176, 0, 31, 84, 159, 0, 31, 86, 143, 0, 33, 87, 128, 0, 30, 88, 101, 0, 29, 88, 79, 0, 28, 92, 59,
+ 0, 23, 98, 36, 0, 24, 99, 7, 0, 40, 91, 0, 0, 53, 86, 0, 0, 54, 89, 0, 0, 26, 46, 250, 0, 29, 50, 234,
+ 0, 29, 53, 222, 0, 30, 58, 207, 0, 31, 63, 193, 0, 32, 66, 181, 0, 32, 68, 166, 0, 34, 69, 146, 0, 34, 72, 128,
+ 0, 34, 72, 108, 0, 32, 73, 85, 0, 32, 73, 64, 0, 31, 76, 43, 0, 30, 79, 17, 0, 38, 76, 1, 0, 50, 70, 0,
+ 0, 49, 72, 0, 0, 24, 34, 251, 0, 27, 39, 230, 0, 28, 42, 218, 0, 29, 45, 206, 0, 29, 47, 195, 0, 29, 50, 184,
+ 0, 30, 53, 171, 0, 33, 54, 152, 0, 37, 54, 128, 0, 38, 55, 111, 0, 35, 58, 90, 0, 36, 57, 70, 0, 32, 57, 51,
+ 0, 33, 61, 24, 0, 36, 60, 2, 0, 47, 55, 0, 0, 45, 56, 0, 0, 22, 22, 254, 0, 25, 25, 232, 0, 27, 27, 219,
+ 0, 29, 29, 207, 0, 29, 32, 197, 0, 30, 33, 186, 0, 31, 36, 174, 0, 32, 37, 158, 0, 34, 38, 139, 0, 34, 39, 121,
+ 0, 35, 40, 99, 0, 35, 40, 76, 0, 34, 41, 55, 0, 31, 44, 31, 0, 36, 42, 6, 0, 44, 39, 0, 0, 43, 41, 0,
+ 0, 21, 12, 255, 0, 27, 11, 243, 0, 29, 10, 234, 0, 30, 11, 224, 0, 30, 15, 210, 0, 30, 16, 196, 0, 31, 18, 181,
+ 0, 32, 19, 166, 0, 33, 19, 149, 0, 34, 20, 131, 0, 35, 21, 110, 0, 35, 22, 86, 0, 36, 23, 63, 0, 36, 23, 45,
+ 0, 32, 26, 29, 0, 42, 24, 0, 0, 41, 26, 0, 0, 37, 5, 253, 0, 38, 2, 248, 0, 37, 1, 241, 0, 36, 2, 231,
+ 0, 36, 5, 217, 0, 36, 6, 201, 0, 36, 6, 185, 0, 37, 7, 167, 0, 37, 7, 149, 0, 38, 7, 130, 0, 39, 7, 111,
+ 0, 40, 7, 91, 0, 40, 8, 70, 0, 41, 7, 50, 0, 48, 5, 28, 0, 47, 6, 0, 0, 39, 15, 0, 0, 52, 0, 253,
+ 0, 50, 0, 247, 0, 48, 0, 240, 0, 47, 0, 231, 0, 46, 0, 219, 0, 45, 0, 203, 0, 44, 0, 184, 0, 43, 0, 161,
+ 0, 42, 0, 135, 0, 41, 0, 114, 0, 40, 0, 96, 0, 38, 0, 77, 0, 36, 0, 63, 0, 35, 0, 51, 0, 35, 0, 37,
+ 0, 37, 0, 23, 0, 35, 0, 0, 0, 7, 231, 244, 0, 7, 232, 244, 0, 6, 234, 237, 0, 7, 236, 208, 0, 9, 236, 185,
+ 0, 12, 236, 166, 0, 16, 236, 146, 0, 19, 236, 122, 0, 23, 236, 95, 0, 28, 236, 65, 0, 33, 237, 39, 0, 36, 235, 22,
+ 0, 39, 232, 13, 0, 41, 229, 5, 0, 42, 227, 1, 0, 44, 226, 0, 0, 62, 216, 0, 0, 7, 213, 246, 0, 5, 209, 226,
+ 0, 7, 209, 209, 0, 7, 213, 194, 0, 4, 218, 180, 0, 5, 219, 165, 0, 8, 219, 146, 0, 11, 220, 121, 0, 16, 219, 97,
+ 0, 22, 218, 71, 0, 29, 215, 50, 0, 33, 214, 37, 0, 36, 212, 23, 0, 36, 212, 7, 0, 38, 210, 2, 0, 44, 208, 1,
+ 0, 54, 206, 0, 0, 7, 196, 246, 0, 2, 199, 235, 0, 1, 199, 202, 0, 1, 202, 183, 0, 2, 204, 170, 0, 2, 206, 159,
+ 0, 3, 208, 143, 0, 5, 208, 122, 0, 8, 208, 98, 0, 13, 208, 73, 0, 19, 206, 50, 0, 23, 206, 32, 0, 25, 205, 16,
+ 0, 28, 203, 4, 0, 34, 200, 2, 0, 40, 198, 2, 0, 47, 196, 0, 0, 7, 178, 247, 0, 4, 182, 241, 0, 1, 187, 209,
+ 0, 0, 189, 180, 0, 0, 192, 163, 0, 1, 194, 154, 0, 1, 196, 141, 0, 1, 196, 124, 0, 2, 197, 102, 0, 4, 198, 76,
+ 0, 9, 198, 49, 0, 12, 198, 26, 0, 14, 198, 8, 0, 22, 194, 2, 0, 30, 191, 1, 0, 37, 189, 1, 0, 44, 193, 0,
+ 0, 8, 160, 248, 0, 6, 163, 245, 0, 3, 170, 221, 0, 1, 175, 191, 0, 0, 177, 164, 0, 0, 180, 149, 0, 0, 182, 139,
+ 0, 1, 182, 126, 0, 1, 182, 107, 0, 2, 183, 84, 0, 4, 184, 58, 0, 6, 186, 31, 0, 8, 187, 8, 0, 17, 184, 2,
+ 0, 27, 181, 0, 0, 35, 179, 0, 0, 41, 186, 0, 0, 10, 140, 249, 0, 9, 143, 247, 0, 5, 150, 231, 0, 2, 159, 201,
+ 0, 1, 162, 172, 0, 0, 163, 147, 0, 1, 164, 135, 0, 1, 166, 125, 0, 1, 167, 109, 0, 1, 169, 89, 0, 2, 171, 65,
+ 0, 2, 173, 38, 0, 4, 175, 11, 0, 14, 172, 2, 0, 25, 169, 0, 0, 34, 167, 0, 0, 38, 176, 0, 0, 13, 122, 250,
+ 0, 13, 124, 249, 0, 9, 130, 239, 0, 4, 139, 211, 0, 2, 146, 184, 0, 1, 147, 157, 0, 1, 146, 133, 0, 1, 149, 121,
+ 0, 1, 152, 108, 0, 1, 154, 91, 0, 1, 157, 70, 0, 1, 159, 45, 0, 2, 161, 17, 0, 12, 159, 3, 0, 25, 156, 0,
+ 0, 35, 155, 0, 0, 36, 164, 0, 0, 13, 108, 251, 0, 12, 110, 242, 0, 10, 114, 233, 0, 7, 120, 216, 0, 5, 127, 194,
+ 0, 3, 131, 169, 0, 2, 134, 144, 0, 1, 134, 120, 0, 2, 135, 107, 0, 1, 138, 92, 0, 1, 142, 74, 0, 1, 144, 51,
+ 0, 2, 147, 24, 0, 9, 147, 4, 0, 24, 143, 1, 0, 35, 141, 0, 0, 36, 150, 0, 0, 12, 94, 251, 0, 11, 98, 236,
+ 0, 10, 104, 216, 0, 9, 107, 205, 0, 8, 111, 194, 0, 7, 115, 178, 0, 5, 120, 158, 0, 0, 124, 135, 0, 2, 120, 109,
+ 0, 3, 123, 92, 0, 2, 127, 76, 0, 2, 129, 55, 0, 2, 131, 30, 0, 6, 134, 5, 0, 23, 129, 1, 0, 35, 126, 0,
+ 0, 35, 135, 0, 0, 12, 78, 251, 0, 12, 82, 240, 0, 11, 89, 221, 0, 11, 93, 204, 0, 10, 96, 191, 0, 9, 101, 178,
+ 0, 9, 105, 168, 0, 9, 105, 144, 0, 6, 109, 122, 0, 4, 109, 94, 0, 6, 110, 77, 0, 6, 113, 57, 0, 3, 116, 36,
+ 0, 5, 118, 9, 0, 21, 112, 2, 0, 34, 108, 0, 0, 34, 116, 0, 0, 14, 60, 252, 0, 15, 62, 244, 0, 14, 67, 231,
+ 0, 14, 77, 209, 0, 13, 81, 191, 0, 12, 85, 178, 0, 13, 87, 162, 0, 15, 88, 147, 0, 15, 90, 132, 0, 11, 92, 103,
+ 0, 10, 92, 77, 0, 9, 95, 61, 0, 5, 99, 41, 0, 5, 102, 15, 0, 19, 96, 2, 0, 33, 90, 0, 0, 33, 95, 0,
+ 0, 15, 45, 252, 0, 16, 47, 241, 0, 16, 51, 229, 0, 16, 59, 210, 0, 15, 64, 195, 0, 16, 69, 182, 0, 16, 71, 168,
+ 0, 16, 73, 149, 0, 17, 75, 130, 0, 18, 75, 113, 0, 14, 77, 85, 0, 11, 78, 64, 0, 12, 80, 44, 0, 10, 83, 20,
+ 0, 17, 81, 3, 0, 30, 74, 0, 0, 29, 76, 0, 0, 12, 35, 251, 0, 13, 41, 229, 0, 14, 45, 215, 0, 14, 47, 204,
+ 0, 14, 49, 194, 0, 15, 52, 184, 0, 16, 55, 172, 0, 19, 57, 153, 0, 22, 57, 132, 0, 20, 60, 113, 0, 20, 61, 92,
+ 0, 17, 62, 70, 0, 17, 60, 45, 0, 14, 64, 27, 0, 13, 67, 5, 0, 26, 59, 1, 0, 25, 60, 0, 0, 12, 24, 253,
+ 0, 13, 32, 222, 0, 13, 36, 208, 0, 13, 36, 198, 0, 13, 37, 190, 0, 14, 38, 180, 0, 15, 40, 169, 0, 17, 42, 155,
+ 0, 18, 43, 138, 0, 21, 44, 120, 0, 22, 43, 98, 0, 20, 45, 77, 0, 19, 43, 53, 0, 16, 46, 31, 0, 15, 49, 9,
+ 0, 25, 44, 2, 0, 23, 45, 0, 0, 11, 13, 255, 0, 13, 21, 221, 0, 13, 22, 207, 0, 13, 22, 198, 0, 13, 23, 190,
+ 0, 14, 23, 180, 0, 14, 24, 170, 0, 15, 25, 158, 0, 16, 26, 144, 0, 17, 27, 127, 0, 18, 27, 104, 0, 19, 27, 82,
+ 0, 20, 27, 58, 0, 20, 28, 39, 0, 20, 31, 13, 0, 27, 28, 0, 0, 23, 31, 0, 0, 10, 6, 255, 0, 15, 6, 240,
+ 0, 14, 5, 231, 0, 14, 5, 220, 0, 15, 7, 207, 0, 15, 7, 194, 0, 15, 8, 180, 0, 15, 8, 165, 0, 16, 9, 148,
+ 0, 17, 9, 130, 0, 18, 9, 110, 0, 19, 10, 89, 0, 19, 11, 66, 0, 21, 11, 46, 0, 24, 10, 28, 0, 18, 14, 16,
+ 0, 21, 13, 0, 0, 26, 0, 254, 0, 24, 0, 249, 0, 22, 0, 244, 0, 20, 0, 233, 0, 19, 0, 219, 0, 18, 0, 204,
+ 0, 17, 0, 187, 0, 17, 0, 169, 0, 19, 0, 148, 0, 20, 0, 130, 0, 21, 0, 111, 0, 21, 0, 88, 0, 20, 0, 68,
+ 0, 20, 0, 52, 0, 21, 0, 38, 0, 18, 0, 19, 0, 17, 0, 0, 0, 0, 232, 245, 0, 0, 231, 238, 0, 3, 231, 225,
+ 0, 6, 231, 205, 0, 9, 231, 187, 0, 12, 231, 171, 0, 15, 231, 154, 0, 18, 231, 134, 0, 22, 232, 112, 0, 26, 232, 88,
+ 0, 30, 233, 62, 0, 34, 233, 40, 0, 36, 232, 26, 0, 38, 229, 15, 0, 39, 228, 8, 0, 39, 227, 3, 0, 40, 226, 0,
+ 0, 0, 215, 245, 0, 0, 209, 203, 0, 5, 211, 196, 0, 5, 216, 186, 0, 5, 219, 173, 0, 7, 220, 163, 0, 9, 220, 150,
+ 0, 12, 221, 132, 0, 17, 221, 113, 0, 21, 221, 91, 0, 27, 220, 69, 0, 32, 219, 52, 0, 35, 218, 42, 0, 37, 216, 32,
+ 0, 36, 216, 19, 0, 34, 217, 9, 0, 27, 211, 0, 0, 0, 198, 246, 0, 0, 200, 211, 0, 0, 201, 183, 0, 0, 205, 174,
+ 0, 0, 207, 163, 0, 2, 210, 154, 0, 4, 210, 143, 0, 6, 211, 129, 0, 10, 211, 112, 0, 14, 210, 91, 0, 20, 210, 71,
+ 0, 26, 209, 56, 0, 29, 208, 45, 0, 32, 207, 35, 0, 31, 207, 24, 0, 28, 206, 14, 0, 16, 198, 0, 0, 0, 180, 247,
+ 0, 0, 187, 224, 0, 0, 191, 197, 0, 0, 193, 170, 0, 0, 196, 158, 0, 0, 198, 148, 0, 0, 199, 138, 0, 0, 200, 126,
+ 0, 2, 202, 110, 0, 3, 203, 88, 0, 8, 203, 67, 0, 14, 203, 50, 0, 17, 202, 36, 0, 20, 202, 25, 0, 20, 202, 14,
+ 0, 18, 201, 8, 0, 11, 195, 0, 0, 0, 160, 248, 0, 0, 169, 232, 0, 0, 176, 207, 0, 0, 179, 182, 0, 0, 181, 154,
+ 0, 0, 183, 143, 0, 0, 185, 135, 0, 0, 186, 125, 0, 0, 187, 112, 0, 0, 189, 96, 0, 1, 191, 75, 0, 4, 193, 51,
+ 0, 6, 194, 30, 0, 7, 195, 15, 0, 8, 195, 5, 0, 9, 195, 1, 0, 8, 193, 0, 0, 0, 140, 249, 0, 0, 148, 238,
+ 0, 0, 157, 214, 0, 0, 163, 191, 0, 0, 166, 166, 0, 0, 166, 137, 0, 0, 168, 129, 0, 0, 170, 122, 0, 0, 171, 113,
+ 0, 0, 172, 101, 0, 0, 174, 84, 0, 0, 176, 62, 0, 1, 180, 37, 0, 1, 182, 17, 0, 1, 183, 4, 0, 2, 183, 0,
+ 0, 3, 184, 0, 0, 0, 121, 250, 0, 0, 126, 246, 0, 0, 135, 229, 0, 0, 144, 201, 0, 0, 149, 175, 0, 0, 151, 149,
+ 0, 0, 149, 120, 0, 0, 152, 115, 0, 0, 153, 109, 0, 0, 155, 100, 0, 0, 158, 86, 0, 0, 161, 68, 0, 0, 164, 45,
+ 0, 0, 167, 22, 0, 0, 169, 6, 0, 0, 169, 0, 0, 0, 171, 0, 0, 0, 106, 250, 0, 0, 109, 249, 0, 0, 116, 238,
+ 0, 0, 125, 211, 0, 0, 131, 186, 0, 0, 135, 161, 0, 0, 135, 133, 0, 0, 132, 105, 0, 0, 135, 102, 0, 0, 138, 96,
+ 0, 0, 141, 85, 0, 0, 144, 70, 0, 0, 147, 51, 0, 0, 150, 28, 0, 0, 153, 10, 0, 0, 154, 1, 0, 0, 156, 0,
+ 0, 0, 93, 251, 0, 0, 98, 241, 0, 0, 106, 222, 0, 0, 111, 207, 0, 0, 115, 192, 0, 0, 119, 172, 0, 0, 122, 149,
+ 0, 0, 120, 120, 0, 0, 116, 92, 0, 0, 120, 89, 0, 0, 123, 82, 0, 0, 126, 70, 0, 0, 130, 54, 0, 0, 133, 34,
+ 0, 0, 136, 15, 0, 0, 138, 2, 0, 0, 140, 0, 0, 0, 79, 251, 0, 0, 84, 242, 0, 0, 92, 222, 0, 0, 97, 206,
+ 0, 0, 101, 192, 0, 0, 104, 175, 0, 0, 108, 158, 0, 0, 110, 138, 0, 0, 106, 105, 0, 0, 105, 83, 0, 0, 107, 78,
+ 0, 0, 110, 68, 0, 0, 112, 53, 0, 0, 115, 36, 0, 0, 118, 18, 0, 0, 120, 3, 0, 3, 122, 0, 0, 0, 62, 252,
+ 0, 0, 65, 242, 0, 0, 72, 228, 0, 0, 81, 210, 0, 0, 86, 193, 0, 0, 89, 174, 0, 0, 86, 151, 0, 0, 87, 136,
+ 0, 0, 95, 127, 0, 0, 91, 92, 0, 0, 92, 73, 0, 0, 94, 66, 0, 0, 96, 53, 0, 0, 98, 38, 0, 0, 100, 20,
+ 0, 0, 101, 5, 0, 4, 102, 0, 0, 0, 45, 253, 0, 0, 47, 240, 0, 0, 54, 227, 0, 0, 63, 210, 0, 0, 70, 195,
+ 0, 0, 75, 178, 0, 0, 76, 161, 0, 0, 74, 138, 0, 0, 77, 125, 0, 0, 73, 102, 0, 0, 81, 83, 0, 0, 78, 62,
+ 0, 0, 80, 52, 0, 0, 81, 39, 0, 0, 82, 22, 0, 0, 83, 7, 0, 3, 83, 0, 0, 0, 33, 254, 0, 0, 38, 237,
+ 0, 0, 43, 224, 0, 0, 48, 209, 0, 0, 51, 194, 0, 0, 57, 181, 0, 0, 60, 167, 0, 0, 61, 146, 0, 0, 62, 125,
+ 0, 0, 59, 103, 0, 0, 61, 90, 0, 0, 62, 66, 0, 0, 63, 50, 0, 0, 65, 38, 0, 0, 66, 24, 0, 0, 66, 10,
+ 0, 0, 66, 0, 0, 0, 23, 254, 0, 0, 37, 215, 0, 0, 40, 202, 0, 0, 42, 193, 0, 0, 42, 184, 0, 0, 43, 176,
+ 0, 0, 44, 167, 0, 0, 45, 151, 0, 0, 46, 133, 0, 0, 45, 111, 0, 0, 46, 91, 0, 0, 45, 71, 0, 0, 48, 55,
+ 0, 0, 47, 37, 0, 0, 49, 26, 0, 0, 50, 13, 0, 0, 50, 0, 0, 0, 14, 254, 0, 0, 30, 204, 0, 0, 32, 192,
+ 0, 0, 32, 185, 0, 0, 31, 177, 0, 0, 31, 169, 0, 0, 30, 159, 0, 0, 31, 146, 0, 0, 32, 133, 0, 0, 32, 120,
+ 0, 0, 31, 94, 0, 0, 28, 73, 0, 0, 32, 60, 0, 0, 33, 44, 0, 0, 33, 27, 0, 0, 37, 16, 0, 0, 35, 0,
+ 0, 0, 6, 255, 0, 0, 21, 201, 0, 0, 22, 190, 0, 0, 21, 182, 0, 0, 19, 174, 0, 0, 18, 166, 0, 0, 18, 157,
+ 0, 0, 18, 146, 0, 0, 18, 132, 0, 0, 18, 120, 0, 0, 18, 102, 0, 0, 17, 85, 0, 0, 18, 67, 0, 0, 18, 48,
+ 0, 0, 19, 30, 0, 0, 16, 13, 0, 0, 17, 0, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 248, 0, 0, 0, 231,
+ 0, 0, 0, 214, 0, 0, 0, 199, 0, 0, 0, 186, 0, 0, 0, 169, 0, 0, 0, 150, 0, 0, 0, 133, 0, 0, 0, 117,
+ 0, 0, 0, 97, 0, 0, 0, 76, 0, 0, 0, 55, 0, 0, 0, 33, 0, 0, 0, 17, 0, 0, 0, 0
+};
+
+// Scottie Best
+unsigned char ucMapDJ4100_KCMY_BestS_12x12x1[] =
+{
+ 223, 94, 45, 21, 203, 106, 59, 20, 184, 119, 73, 19, 153, 162, 96, 11, 122, 201, 120, 6, 96, 227, 135, 2, 86, 233, 139, 0,
+ 71, 238, 144, 0, 48, 240, 149, 0, 31, 243, 151, 0, 23, 245, 153, 0, 19, 245, 153, 0, 16, 246, 155, 0, 11, 246, 155, 0,
+ 8, 247, 155, 0, 3, 248, 157, 0, 0, 248, 159, 0, 189, 104, 34, 76, 197, 118, 36, 26, 159, 135, 75, 18, 130, 179, 104, 10,
+ 99, 226, 136, 2, 92, 232, 143, 1, 82, 236, 142, 0, 68, 238, 145, 0, 47, 240, 149, 0, 27, 244, 152, 0, 17, 245, 154, 0,
+ 9, 246, 154, 0, 7, 246, 155, 0, 4, 246, 156, 0, 2, 245, 158, 0, 0, 245, 158, 0, 0, 244, 159, 0, 152, 114, 21, 132,
+ 142, 126, 40, 78, 171, 142, 28, 30, 130, 186, 75, 8, 97, 220, 110, 3, 88, 223, 129, 3, 74, 231, 141, 2, 56, 237, 146, 1,
+ 36, 240, 151, 0, 21, 243, 153, 0, 13, 243, 155, 1, 8, 241, 155, 1, 5, 240, 156, 0, 3, 239, 156, 0, 1, 239, 157, 0,
+ 0, 239, 157, 0, 0, 238, 157, 0, 134, 141, 15, 163, 134, 146, 28, 118, 133, 163, 21, 84, 143, 170, 17, 9, 95, 224, 75, 1,
+ 86, 224, 105, 2, 73, 228, 126, 2, 54, 232, 137, 2, 36, 236, 144, 3, 21, 237, 150, 4, 14, 236, 153, 5, 9, 233, 154, 5,
+ 6, 232, 155, 4, 3, 231, 156, 2, 1, 231, 155, 0, 0, 232, 155, 0, 0, 232, 154, 0, 102, 181, 4, 218, 109, 181, 16, 170,
+ 106, 190, 12, 132, 104, 205, 6, 84, 104, 211, 11, 1, 86, 227, 69, 0, 74, 226, 99, 3, 57, 228, 119, 4, 40, 229, 132, 5,
+ 26, 229, 141, 7, 18, 228, 145, 8, 12, 228, 148, 8, 8, 226, 150, 6, 5, 225, 151, 4, 2, 224, 151, 1, 0, 223, 151, 0,
+ 0, 223, 150, 0, 86, 197, 0, 238, 91, 202, 7, 208, 92, 204, 6, 175, 92, 212, 3, 134, 90, 219, 0, 69, 86, 226, 12, 0,
+ 77, 223, 61, 2, 60, 224, 92, 5, 43, 223, 112, 8, 29, 223, 126, 9, 22, 221, 135, 11, 15, 221, 140, 10, 10, 219, 142, 9,
+ 6, 218, 143, 6, 3, 217, 145, 4, 1, 215, 145, 1, 0, 214, 144, 0, 76, 205, 0, 239, 78, 208, 4, 221, 79, 207, 5, 198,
+ 80, 209, 4, 163, 80, 215, 3, 119, 80, 219, 2, 62, 77, 228, 9, 0, 64, 225, 54, 3, 47, 223, 86, 7, 30, 221, 107, 9,
+ 21, 217, 122, 12, 17, 214, 131, 13, 11, 212, 135, 12, 8, 209, 136, 9, 4, 208, 137, 5, 1, 207, 137, 1, 0, 205, 138, 0,
+ 63, 207, 0, 240, 64, 209, 3, 229, 66, 209, 4, 213, 70, 211, 4, 189, 71, 215, 3, 156, 71, 218, 2, 114, 70, 223, 1, 56,
+ 66, 230, 6, 0, 52, 225, 47, 4, 36, 221, 80, 9, 21, 217, 102, 11, 15, 212, 116, 12, 10, 207, 125, 12, 8, 204, 127, 10,
+ 5, 201, 129, 8, 2, 199, 129, 3, 0, 198, 127, 0, 51, 207, 1, 240, 52, 208, 3, 233, 54, 209, 5, 220, 56, 208, 6, 201,
+ 59, 212, 4, 180, 60, 217, 2, 150, 61, 220, 2, 107, 59, 225, 1, 57, 53, 229, 3, 1, 39, 224, 43, 6, 24, 219, 75, 9,
+ 14, 214, 95, 9, 9, 207, 107, 9, 8, 202, 115, 8, 5, 198, 119, 7, 2, 195, 119, 4, 0, 192, 118, 0, 40, 207, 2, 241,
+ 41, 209, 3, 237, 42, 209, 5, 225, 44, 208, 6, 211, 45, 209, 6, 193, 45, 213, 5, 168, 47, 214, 6, 141, 45, 218, 4, 104,
+ 42, 224, 3, 56, 37, 230, 4, 5, 26, 224, 36, 7, 17, 218, 67, 8, 10, 211, 87, 7, 7, 204, 100, 6, 4, 199, 106, 5,
+ 2, 194, 109, 2, 0, 190, 110, 0, 27, 205, 4, 241, 27, 206, 5, 238, 28, 206, 7, 229, 30, 207, 9, 216, 30, 207, 8, 201,
+ 30, 211, 8, 184, 31, 212, 8, 159, 31, 215, 7, 136, 29, 219, 6, 100, 26, 225, 4, 56, 24, 232, 4, 8, 17, 223, 33, 6,
+ 12, 217, 60, 6, 8, 208, 80, 5, 4, 202, 93, 3, 2, 196, 99, 1, 0, 190, 102, 0, 17, 204, 6, 241, 17, 204, 7, 238,
+ 18, 204, 8, 230, 20, 204, 9, 220, 20, 206, 9, 207, 21, 208, 9, 193, 22, 211, 9, 176, 22, 213, 8, 153, 21, 216, 6, 131,
+ 18, 222, 4, 95, 17, 228, 2, 53, 17, 236, 3, 8, 14, 225, 30, 5, 9, 216, 55, 4, 5, 207, 75, 3, 2, 200, 86, 1,
+ 0, 193, 93, 0, 8, 203, 8, 241, 9, 204, 9, 238, 10, 204, 9, 232, 12, 205, 9, 223, 13, 206, 9, 214, 13, 207, 9, 201,
+ 14, 209, 8, 188, 14, 211, 7, 167, 14, 214, 6, 149, 14, 218, 4, 123, 14, 224, 2, 90, 14, 231, 1, 50, 13, 238, 3, 9,
+ 10, 226, 28, 4, 6, 216, 52, 3, 2, 206, 70, 1, 0, 198, 80, 0, 2, 202, 9, 243, 3, 202, 9, 239, 5, 203, 9, 234,
+ 8, 205, 9, 226, 9, 206, 9, 218, 9, 207, 7, 208, 9, 209, 7, 196, 9, 211, 5, 181, 10, 213, 5, 163, 10, 216, 4, 144,
+ 10, 221, 2, 116, 10, 227, 1, 86, 10, 233, 1, 46, 9, 238, 2, 6, 8, 225, 28, 4, 3, 215, 50, 1, 0, 205, 68, 0,
+ 0, 202, 7, 244, 0, 201, 7, 241, 0, 202, 8, 238, 3, 204, 8, 230, 6, 206, 9, 221, 7, 207, 7, 212, 7, 208, 5, 202,
+ 7, 211, 4, 191, 7, 212, 4, 176, 8, 214, 3, 158, 8, 217, 2, 138, 8, 222, 1, 110, 7, 227, 1, 80, 7, 232, 1, 43,
+ 7, 239, 4, 7, 4, 225, 26, 1, 0, 214, 49, 0, 0, 203, 3, 244, 0, 203, 3, 243, 0, 203, 3, 239, 0, 203, 3, 236,
+ 2, 205, 4, 226, 3, 206, 4, 218, 3, 207, 2, 208, 3, 208, 2, 198, 3, 211, 2, 187, 3, 212, 1, 171, 3, 215, 1, 153,
+ 3, 218, 1, 133, 3, 222, 0, 104, 3, 227, 0, 75, 3, 232, 0, 39, 2, 238, 0, 2, 0, 223, 26, 0, 0, 204, 0, 244,
+ 0, 204, 0, 243, 0, 204, 0, 240, 0, 204, 0, 237, 0, 204, 0, 231, 0, 204, 0, 224, 0, 205, 0, 215, 0, 207, 0, 205,
+ 0, 208, 0, 194, 0, 211, 0, 182, 0, 213, 0, 166, 0, 215, 0, 148, 0, 218, 0, 126, 0, 222, 0, 100, 0, 226, 0, 71,
+ 0, 231, 0, 36, 0, 238, 0, 0, 190, 72, 75, 72, 194, 75, 84, 17, 172, 97, 104, 13, 129, 145, 148, 8, 102, 179, 165, 5,
+ 91, 196, 161, 6, 75, 213, 165, 6, 55, 221, 168, 7, 33, 226, 171, 8, 15, 230, 173, 8, 11, 233, 172, 6, 9, 236, 168, 4,
+ 6, 238, 166, 2, 3, 239, 164, 0, 1, 243, 164, 0, 0, 244, 163, 0, 0, 245, 162, 0, 190, 71, 34, 74, 151, 97, 54, 31,
+ 139, 130, 82, 24, 121, 178, 107, 12, 97, 216, 139, 5, 82, 226, 147, 3, 69, 231, 150, 2, 52, 234, 152, 2, 36, 237, 154, 2,
+ 20, 238, 156, 3, 10, 239, 158, 1, 4, 240, 158, 0, 1, 240, 159, 0, 0, 239, 159, 0, 0, 239, 158, 0, 0, 239, 158, 0,
+ 0, 240, 158, 0, 151, 95, 21, 135, 170, 119, 27, 102, 146, 118, 44, 32, 126, 162, 84, 15, 100, 199, 115, 9, 82, 216, 134, 6,
+ 67, 227, 142, 3, 51, 232, 147, 3, 36, 236, 150, 3, 21, 238, 152, 3, 10, 239, 154, 2, 2, 239, 156, 0, 0, 238, 157, 0,
+ 0, 237, 156, 0, 0, 234, 156, 0, 0, 234, 156, 0, 0, 236, 156, 0, 135, 123, 15, 161, 136, 151, 17, 153, 126, 162, 23, 104,
+ 136, 143, 33, 26, 110, 177, 78, 12, 84, 208, 113, 7, 68, 220, 131, 6, 51, 225, 141, 6, 35, 228, 147, 7, 20, 231, 151, 7,
+ 10, 232, 154, 6, 3, 232, 155, 1, 0, 230, 155, 0, 0, 228, 155, 0, 0, 228, 154, 0, 0, 227, 154, 0, 0, 229, 154, 0,
+ 104, 165, 5, 214, 98, 188, 4, 220, 108, 181, 16, 150, 116, 159, 26, 84, 121, 154, 29, 19, 92, 200, 74, 8, 75, 213, 102, 7,
+ 58, 219, 122, 8, 40, 222, 134, 9, 25, 224, 143, 9, 13, 226, 148, 9, 5, 225, 151, 4, 1, 224, 151, 0, 0, 221, 151, 0,
+ 0, 220, 151, 0, 0, 220, 151, 0, 0, 222, 151, 0, 87, 182, 0, 239, 88, 190, 1, 230, 92, 194, 10, 189, 94, 191, 12, 140,
+ 95, 191, 13, 80, 99, 187, 17, 12, 80, 203, 60, 9, 62, 211, 93, 9, 45, 215, 113, 10, 29, 218, 129, 12, 17, 219, 138, 11,
+ 9, 219, 141, 7, 3, 218, 143, 3, 0, 216, 145, 0, 0, 214, 145, 0, 0, 213, 145, 0, 0, 213, 145, 0, 76, 197, 0, 239,
+ 76, 200, 2, 232, 80, 198, 9, 200, 82, 195, 11, 166, 82, 198, 10, 132, 82, 197, 12, 74, 86, 197, 13, 16, 68, 207, 53, 9,
+ 52, 212, 86, 10, 33, 212, 109, 14, 20, 212, 123, 14, 11, 212, 132, 12, 6, 211, 135, 7, 2, 209, 136, 2, 0, 208, 137, 0,
+ 0, 207, 137, 0, 0, 206, 138, 0, 63, 199, 1, 240, 63, 201, 2, 237, 65, 201, 7, 217, 69, 200, 9, 190, 72, 202, 9, 162,
+ 72, 202, 9, 126, 73, 202, 10, 75, 74, 201, 12, 18, 59, 207, 47, 10, 41, 209, 80, 13, 24, 209, 102, 14, 13, 207, 116, 13,
+ 8, 205, 123, 9, 4, 204, 126, 6, 1, 202, 127, 1, 0, 200, 127, 0, 0, 199, 129, 0, 51, 201, 2, 240, 51, 201, 3, 238,
+ 53, 201, 6, 224, 56, 200, 9, 203, 58, 201, 9, 184, 61, 203, 9, 154, 62, 204, 9, 118, 61, 205, 10, 75, 62, 203, 13, 24,
+ 46, 207, 43, 12, 28, 207, 75, 15, 16, 206, 94, 12, 9, 204, 105, 9, 5, 201, 112, 6, 2, 198, 116, 3, 0, 195, 118, 0,
+ 0, 192, 118, 0, 40, 203, 3, 241, 41, 202, 4, 238, 42, 201, 6, 229, 44, 201, 9, 213, 45, 200, 10, 194, 46, 202, 10, 173,
+ 48, 202, 11, 146, 48, 202, 12, 110, 47, 205, 13, 71, 46, 205, 15, 25, 34, 208, 41, 14, 21, 207, 68, 13, 11, 204, 86, 9,
+ 6, 201, 97, 5, 2, 198, 104, 3, 0, 193, 107, 0, 0, 189, 109, 0, 27, 202, 5, 243, 28, 200, 6, 239, 29, 199, 8, 231,
+ 30, 199, 10, 219, 31, 200, 12, 203, 32, 201, 12, 188, 33, 202, 12, 165, 36, 202, 13, 140, 35, 204, 13, 107, 34, 206, 13, 68,
+ 33, 206, 16, 24, 25, 206, 37, 13, 16, 206, 61, 9, 9, 203, 77, 6, 3, 199, 89, 2, 0, 194, 95, 0, 0, 188, 100, 0,
+ 16, 200, 8, 241, 17, 198, 9, 238, 18, 198, 9, 232, 20, 198, 11, 221, 22, 199, 13, 208, 22, 200, 14, 195, 23, 201, 13, 179,
+ 24, 202, 12, 155, 23, 204, 11, 135, 23, 206, 11, 102, 23, 208, 10, 63, 25, 209, 14, 25, 17, 206, 34, 12, 10, 204, 54, 7,
+ 5, 201, 71, 4, 1, 196, 82, 1, 0, 189, 90, 0, 7, 201, 9, 241, 9, 198, 9, 238, 10, 198, 10, 233, 12, 198, 12, 225,
+ 14, 199, 13, 214, 15, 200, 15, 201, 14, 200, 12, 189, 15, 202, 10, 168, 16, 203, 9, 150, 16, 205, 9, 126, 16, 207, 8, 94,
+ 17, 211, 8, 58, 17, 213, 14, 23, 12, 208, 32, 10, 7, 204, 50, 5, 2, 199, 66, 1, 0, 193, 78, 0, 2, 200, 9, 243,
+ 3, 198, 9, 238, 5, 198, 9, 233, 8, 200, 9, 225, 9, 200, 9, 217, 9, 199, 9, 206, 9, 200, 9, 195, 9, 201, 8, 181,
+ 9, 202, 7, 162, 9, 204, 6, 143, 10, 207, 6, 118, 11, 209, 5, 87, 11, 214, 6, 52, 13, 216, 12, 21, 9, 209, 29, 8,
+ 3, 203, 46, 2, 0, 198, 66, 0, 0, 200, 7, 244, 0, 196, 7, 239, 0, 196, 7, 234, 3, 198, 8, 228, 5, 199, 9, 219,
+ 6, 199, 8, 211, 6, 200, 7, 201, 5, 201, 6, 189, 6, 202, 5, 173, 6, 203, 4, 156, 7, 205, 4, 136, 7, 209, 3, 110,
+ 7, 213, 3, 82, 7, 217, 4, 46, 9, 219, 9, 16, 4, 209, 27, 4, 0, 203, 50, 0, 0, 201, 3, 244, 0, 197, 2, 239,
+ 0, 196, 2, 236, 0, 197, 3, 231, 2, 198, 3, 223, 2, 199, 4, 215, 3, 199, 2, 205, 3, 200, 2, 195, 3, 201, 2, 184,
+ 3, 203, 2, 167, 3, 205, 1, 150, 3, 208, 1, 130, 3, 211, 1, 104, 3, 215, 0, 74, 3, 219, 1, 39, 6, 221, 8, 10,
+ 0, 211, 31, 0, 0, 202, 0, 244, 0, 198, 0, 236, 0, 198, 0, 233, 0, 199, 0, 230, 0, 199, 0, 225, 0, 199, 0, 218,
+ 0, 200, 0, 209, 0, 201, 0, 199, 0, 202, 0, 189, 0, 204, 0, 177, 0, 206, 0, 159, 0, 208, 0, 142, 0, 211, 0, 120,
+ 0, 214, 0, 94, 0, 218, 0, 62, 0, 223, 0, 29, 0, 228, 0, 0, 156, 47, 102, 123, 151, 56, 114, 93, 164, 53, 123, 20,
+ 118, 102, 173, 5, 97, 143, 182, 3, 84, 173, 177, 4, 70, 192, 176, 5, 50, 203, 178, 5, 28, 212, 180, 7, 14, 217, 180, 8,
+ 9, 222, 179, 7, 7, 226, 177, 8, 5, 229, 175, 6, 2, 232, 172, 3, 1, 234, 168, 0, 0, 238, 167, 0, 0, 239, 165, 0,
+ 156, 46, 75, 126, 144, 78, 82, 69, 138, 89, 98, 21, 114, 137, 136, 12, 93, 178, 154, 9, 78, 196, 161, 8, 62, 208, 165, 8,
+ 44, 217, 168, 9, 26, 221, 172, 9, 13, 225, 173, 9, 4, 225, 172, 5, 0, 226, 170, 1, 0, 227, 167, 0, 0, 229, 164, 0,
+ 0, 230, 163, 0, 0, 232, 161, 0, 0, 234, 161, 0, 155, 46, 23, 127, 171, 76, 28, 100, 132, 98, 57, 36, 120, 136, 91, 24,
+ 96, 180, 123, 15, 82, 200, 136, 10, 65, 215, 144, 8, 48, 222, 149, 7, 34, 227, 151, 7, 20, 229, 155, 8, 9, 231, 157, 6,
+ 1, 231, 158, 1, 0, 230, 157, 0, 0, 229, 157, 0, 0, 228, 156, 0, 0, 227, 155, 0, 0, 230, 155, 0, 137, 89, 16, 158,
+ 138, 110, 18, 150, 132, 121, 40, 84, 126, 119, 48, 28, 104, 153, 89, 21, 84, 189, 114, 13, 67, 205, 133, 10, 51, 216, 141, 9,
+ 36, 221, 145, 9, 23, 224, 151, 10, 11, 227, 153, 8, 3, 227, 154, 2, 0, 226, 154, 0, 0, 224, 153, 0, 0, 223, 153, 0,
+ 0, 222, 153, 0, 0, 224, 153, 0, 108, 135, 7, 205, 102, 151, 6, 211, 116, 147, 26, 134, 112, 142, 36, 84, 110, 135, 43, 26,
+ 90, 171, 79, 17, 73, 197, 107, 12, 57, 207, 126, 11, 40, 214, 137, 12, 24, 217, 146, 14, 11, 219, 151, 10, 3, 219, 152, 3,
+ 0, 218, 151, 0, 0, 216, 151, 0, 0, 215, 151, 0, 0, 215, 151, 0, 0, 217, 151, 0, 88, 158, 0, 239, 88, 164, 1, 233,
+ 93, 171, 14, 186, 94, 171, 22, 137, 94, 159, 27, 77, 99, 154, 32, 20, 78, 187, 69, 15, 62, 200, 98, 14, 45, 206, 118, 15,
+ 29, 211, 132, 16, 15, 213, 141, 14, 5, 214, 143, 7, 0, 213, 145, 1, 0, 211, 145, 0, 0, 209, 145, 0, 0, 208, 145, 0,
+ 0, 211, 145, 0, 76, 179, 1, 240, 76, 187, 2, 234, 80, 184, 11, 199, 84, 182, 17, 163, 82, 184, 17, 129, 82, 181, 20, 78,
+ 87, 178, 22, 20, 67, 196, 60, 14, 51, 200, 92, 16, 33, 203, 113, 17, 19, 206, 126, 17, 9, 207, 133, 10, 3, 207, 135, 4,
+ 0, 207, 137, 0, 0, 205, 137, 0, 0, 203, 137, 0, 0, 204, 138, 0, 64, 189, 2, 240, 63, 190, 3, 237, 65, 190, 8, 216,
+ 69, 190, 14, 187, 71, 192, 14, 162, 73, 192, 14, 129, 72, 192, 16, 77, 73, 190, 18, 23, 58, 196, 53, 15, 40, 200, 86, 17,
+ 24, 202, 105, 17, 13, 202, 116, 14, 6, 202, 123, 8, 1, 201, 126, 2, 0, 200, 126, 0, 0, 198, 127, 0, 0, 198, 129, 0,
+ 51, 192, 4, 241, 51, 193, 5, 238, 52, 193, 8, 224, 56, 192, 12, 203, 58, 193, 14, 182, 61, 195, 13, 155, 62, 195, 14, 120,
+ 61, 195, 16, 79, 62, 192, 19, 29, 47, 197, 49, 17, 29, 200, 79, 17, 16, 201, 95, 15, 8, 200, 106, 9, 3, 198, 112, 4,
+ 0, 196, 115, 0, 0, 193, 116, 0, 0, 191, 118, 0, 40, 195, 4, 241, 41, 194, 5, 238, 42, 194, 8, 228, 44, 194, 11, 213,
+ 45, 195, 14, 194, 46, 195, 14, 175, 47, 196, 15, 148, 49, 194, 17, 114, 48, 195, 17, 75, 49, 194, 20, 28, 36, 199, 45, 17,
+ 21, 200, 70, 16, 11, 199, 86, 10, 5, 197, 96, 5, 1, 194, 102, 1, 0, 190, 106, 0, 0, 187, 107, 0, 27, 196, 6, 243,
+ 28, 195, 7, 239, 29, 194, 9, 230, 30, 195, 11, 218, 31, 195, 14, 203, 32, 196, 16, 188, 33, 197, 16, 166, 36, 196, 17, 141,
+ 36, 197, 17, 109, 36, 197, 17, 71, 36, 196, 22, 27, 26, 199, 41, 17, 16, 199, 61, 12, 9, 198, 77, 7, 2, 194, 87, 2,
+ 0, 190, 93, 0, 0, 184, 98, 0, 16, 196, 9, 243, 17, 195, 9, 238, 19, 195, 11, 231, 21, 196, 13, 220, 22, 195, 15, 208,
+ 23, 195, 17, 195, 24, 196, 17, 179, 24, 197, 15, 156, 25, 197, 15, 136, 25, 198, 15, 102, 25, 199, 15, 65, 26, 200, 19, 28,
+ 18, 199, 36, 16, 11, 198, 54, 9, 5, 196, 70, 4, 0, 192, 79, 0, 0, 184, 88, 0, 7, 198, 10, 241, 9, 195, 11, 238,
+ 10, 195, 12, 232, 12, 195, 13, 223, 13, 195, 16, 213, 15, 195, 17, 200, 15, 195, 15, 189, 16, 196, 14, 170, 17, 197, 13, 151,
+ 16, 198, 12, 126, 17, 200, 11, 95, 18, 200, 11, 59, 18, 202, 17, 27, 13, 200, 33, 14, 6, 197, 49, 6, 1, 193, 64, 1,
+ 0, 188, 76, 0, 2, 198, 9, 243, 4, 195, 9, 238, 6, 196, 10, 231, 8, 196, 11, 223, 8, 195, 12, 216, 9, 195, 13, 204,
+ 9, 195, 12, 194, 9, 195, 9, 180, 9, 196, 9, 161, 10, 197, 9, 142, 10, 199, 8, 116, 11, 200, 8, 87, 12, 202, 9, 53,
+ 11, 205, 15, 23, 8, 201, 29, 9, 2, 196, 45, 2, 0, 190, 64, 0, 0, 197, 7, 244, 0, 194, 7, 238, 1, 194, 7, 231,
+ 4, 194, 8, 224, 5, 195, 9, 217, 5, 194, 8, 208, 5, 194, 7, 198, 4, 194, 6, 187, 5, 195, 5, 171, 5, 197, 5, 153,
+ 6, 197, 4, 133, 7, 199, 4, 107, 7, 201, 4, 79, 8, 205, 6, 45, 8, 207, 12, 17, 3, 200, 26, 4, 0, 194, 48, 0,
+ 0, 199, 3, 244, 0, 194, 2, 238, 0, 192, 2, 231, 0, 192, 2, 225, 0, 192, 2, 220, 1, 193, 3, 211, 2, 194, 3, 202,
+ 1, 194, 2, 191, 1, 194, 2, 179, 2, 196, 1, 163, 2, 197, 1, 145, 2, 199, 1, 125, 2, 201, 1, 100, 3, 204, 1, 69,
+ 3, 207, 2, 36, 4, 209, 8, 9, 0, 200, 31, 0, 0, 200, 0, 244, 0, 196, 0, 237, 0, 192, 0, 227, 0, 193, 0, 224,
+ 0, 193, 0, 219, 0, 194, 0, 213, 0, 195, 0, 204, 0, 195, 0, 195, 0, 196, 0, 184, 0, 197, 0, 171, 0, 199, 0, 154,
+ 0, 201, 0, 137, 0, 203, 0, 114, 0, 206, 0, 89, 0, 209, 0, 54, 0, 214, 0, 22, 0, 219, 0, 0, 139, 33, 139, 156,
+ 131, 36, 151, 123, 131, 30, 165, 50, 105, 50, 201, 2, 93, 109, 195, 2, 80, 148, 188, 3, 66, 170, 186, 4, 47, 186, 187, 4,
+ 27, 192, 188, 6, 14, 200, 187, 6, 10, 206, 184, 6, 8, 213, 182, 5, 6, 216, 180, 5, 3, 220, 177, 4, 1, 225, 175, 2,
+ 0, 228, 172, 0, 0, 231, 170, 0, 142, 36, 102, 150, 137, 62, 104, 100, 133, 63, 110, 49, 116, 82, 142, 13, 90, 141, 166, 8,
+ 75, 168, 172, 6, 58, 187, 177, 6, 40, 195, 179, 7, 22, 200, 181, 8, 11, 206, 181, 7, 2, 209, 180, 1, 0, 213, 177, 0,
+ 0, 215, 173, 0, 0, 218, 170, 0, 0, 221, 167, 0, 0, 224, 165, 0, 0, 226, 165, 0, 141, 37, 62, 148, 136, 59, 75, 108,
+ 127, 79, 86, 73, 118, 86, 100, 24, 92, 141, 140, 15, 76, 171, 152, 11, 60, 189, 159, 11, 42, 199, 165, 11, 26, 205, 168, 12,
+ 14, 209, 171, 13, 5, 213, 171, 5, 0, 213, 167, 0, 0, 214, 165, 0, 0, 215, 163, 0, 0, 216, 162, 0, 0, 218, 159, 0,
+ 0, 221, 159, 0, 140, 34, 17, 157, 140, 49, 24, 136, 127, 84, 49, 77, 110, 100, 61, 42, 98, 134, 95, 27, 82, 170, 120, 20,
+ 66, 192, 135, 16, 50, 204, 142, 15, 36, 211, 149, 15, 21, 216, 153, 15, 10, 219, 155, 11, 3, 219, 155, 3, 0, 218, 154, 0,
+ 0, 216, 153, 0, 0, 215, 152, 0, 0, 214, 152, 0, 0, 218, 151, 0, 118, 82, 9, 192, 113, 99, 18, 165, 112, 106, 32, 126,
+ 107, 118, 44, 87, 105, 118, 54, 35, 87, 151, 88, 27, 70, 181, 113, 20, 55, 194, 132, 17, 39, 202, 141, 17, 25, 208, 146, 17,
+ 12, 213, 150, 14, 3, 214, 151, 5, 0, 213, 151, 0, 0, 211, 150, 0, 0, 209, 149, 0, 0, 208, 149, 0, 0, 212, 150, 0,
+ 93, 118, 1, 231, 93, 125, 3, 225, 96, 138, 17, 179, 95, 147, 29, 135, 93, 141, 39, 84, 96, 131, 46, 32, 77, 162, 80, 26,
+ 59, 188, 105, 20, 43, 196, 123, 20, 27, 202, 135, 20, 13, 205, 142, 17, 4, 207, 144, 7, 0, 206, 145, 0, 0, 204, 145, 0,
+ 0, 203, 144, 0, 0, 203, 143, 0, 0, 205, 144, 0, 78, 153, 2, 240, 77, 158, 2, 237, 82, 159, 12, 200, 84, 167, 21, 162,
+ 82, 164, 26, 129, 82, 155, 33, 80, 86, 150, 37, 27, 65, 180, 72, 21, 49, 190, 99, 21, 33, 195, 116, 22, 19, 200, 127, 20,
+ 8, 202, 134, 11, 2, 203, 135, 2, 0, 201, 136, 0, 0, 200, 136, 0, 0, 199, 136, 0, 0, 200, 137, 0, 65, 168, 4, 240,
+ 65, 173, 5, 237, 67, 175, 9, 215, 69, 179, 17, 187, 71, 180, 20, 159, 72, 180, 21, 129, 71, 176, 25, 80, 73, 173, 27, 26,
+ 56, 187, 63, 20, 38, 192, 91, 22, 24, 195, 107, 21, 12, 197, 118, 16, 4, 198, 123, 7, 0, 198, 126, 0, 0, 196, 126, 0,
+ 0, 194, 126, 0, 0, 195, 127, 0, 52, 179, 5, 241, 52, 179, 6, 238, 53, 180, 9, 223, 56, 184, 14, 201, 59, 184, 18, 181,
+ 60, 184, 19, 155, 61, 184, 20, 121, 60, 184, 22, 79, 62, 180, 26, 29, 45, 189, 57, 21, 28, 193, 82, 21, 16, 195, 98, 17,
+ 7, 194, 107, 9, 2, 193, 112, 2, 0, 192, 114, 0, 0, 190, 116, 0, 0, 189, 118, 0, 40, 186, 6, 241, 41, 184, 7, 238,
+ 42, 186, 9, 227, 44, 188, 13, 211, 45, 188, 17, 194, 45, 188, 18, 175, 46, 189, 19, 148, 48, 187, 21, 115, 48, 187, 22, 75,
+ 49, 186, 26, 31, 35, 190, 50, 22, 21, 193, 74, 18, 10, 193, 87, 10, 4, 192, 97, 4, 0, 190, 102, 0, 0, 187, 105, 0,
+ 0, 184, 107, 0, 28, 189, 8, 243, 29, 189, 9, 239, 30, 189, 10, 230, 31, 190, 13, 218, 32, 190, 16, 204, 33, 190, 18, 189,
+ 33, 191, 18, 167, 35, 190, 19, 142, 36, 190, 20, 110, 36, 189, 21, 74, 36, 189, 26, 33, 26, 192, 45, 20, 15, 192, 63, 14,
+ 8, 192, 78, 7, 1, 189, 87, 1, 0, 184, 93, 0, 0, 180, 97, 0, 16, 192, 10, 243, 17, 190, 11, 238, 19, 191, 12, 230,
+ 21, 191, 14, 219, 22, 190, 17, 208, 23, 190, 19, 195, 24, 191, 19, 179, 24, 192, 18, 157, 25, 191, 18, 136, 26, 191, 18, 104,
+ 26, 191, 19, 68, 27, 193, 24, 33, 18, 193, 38, 18, 10, 192, 56, 9, 4, 190, 70, 3, 0, 187, 78, 0, 0, 179, 86, 0,
+ 6, 193, 12, 241, 9, 191, 13, 238, 10, 190, 14, 231, 12, 190, 16, 222, 14, 189, 17, 212, 15, 190, 18, 200, 15, 189, 17, 189,
+ 16, 191, 16, 170, 16, 191, 15, 151, 17, 192, 15, 127, 17, 192, 15, 97, 19, 193, 15, 63, 20, 195, 22, 32, 13, 194, 35, 16,
+ 6, 190, 49, 6, 0, 187, 62, 0, 0, 180, 75, 0, 3, 195, 9, 243, 2, 192, 12, 238, 5, 192, 13, 230, 8, 191, 15, 222,
+ 8, 190, 15, 214, 9, 190, 14, 203, 9, 190, 13, 193, 9, 190, 11, 179, 9, 191, 10, 161, 9, 191, 10, 141, 10, 192, 9, 118,
+ 12, 192, 9, 88, 12, 195, 10, 55, 11, 197, 17, 26, 6, 194, 28, 10, 2, 189, 43, 2, 0, 182, 62, 0, 0, 194, 8, 244,
+ 0, 191, 8, 238, 2, 191, 9, 230, 4, 191, 9, 221, 4, 190, 9, 214, 5, 189, 8, 205, 4, 189, 7, 196, 4, 189, 6, 184,
+ 4, 189, 6, 168, 5, 190, 6, 151, 6, 190, 5, 132, 6, 191, 5, 106, 7, 193, 5, 78, 7, 196, 7, 45, 5, 198, 11, 19,
+ 3, 191, 25, 4, 0, 186, 46, 0, 0, 196, 3, 244, 0, 191, 3, 238, 0, 189, 2, 230, 0, 189, 2, 221, 0, 188, 2, 215,
+ 1, 188, 2, 206, 1, 188, 2, 198, 1, 188, 1, 188, 1, 188, 1, 175, 1, 189, 1, 158, 1, 190, 1, 141, 1, 191, 1, 120,
+ 1, 192, 0, 96, 2, 195, 1, 66, 2, 197, 2, 34, 2, 199, 7, 11, 0, 191, 29, 0, 0, 197, 0, 245, 0, 194, 0, 237,
+ 0, 190, 0, 228, 0, 187, 0, 217, 0, 188, 0, 213, 0, 188, 0, 206, 0, 189, 0, 199, 0, 189, 0, 190, 0, 189, 0, 179,
+ 0, 189, 0, 165, 0, 191, 0, 149, 0, 193, 0, 132, 0, 194, 0, 109, 0, 197, 0, 84, 0, 200, 0, 48, 0, 203, 0, 17,
+ 0, 207, 0, 0, 102, 9, 190, 214, 105, 21, 182, 154, 104, 17, 191, 92, 100, 16, 202, 5, 88, 56, 213, 1, 79, 107, 198, 3,
+ 65, 141, 194, 3, 47, 159, 192, 4, 28, 173, 191, 6, 15, 184, 190, 5, 10, 191, 189, 5, 9, 199, 187, 5, 6, 203, 184, 4,
+ 4, 208, 182, 3, 2, 212, 180, 1, 0, 216, 178, 0, 0, 220, 175, 0, 112, 18, 148, 193, 126, 51, 120, 123, 120, 53, 127, 89,
+ 119, 49, 139, 27, 91, 98, 173, 9, 75, 137, 181, 6, 60, 159, 184, 6, 41, 173, 184, 7, 23, 184, 186, 8, 11, 190, 186, 6,
+ 2, 195, 184, 1, 0, 199, 181, 0, 0, 203, 178, 0, 0, 206, 175, 0, 0, 209, 172, 0, 0, 213, 170, 0, 0, 216, 170, 0,
+ 120, 44, 96, 142, 115, 52, 93, 129, 115, 69, 100, 93, 112, 64, 113, 49, 92, 95, 146, 16, 76, 140, 159, 11, 60, 162, 167, 10,
+ 41, 177, 173, 10, 25, 186, 177, 11, 12, 191, 179, 9, 3, 196, 178, 2, 0, 199, 175, 0, 0, 201, 171, 0, 0, 204, 168, 0,
+ 0, 206, 165, 0, 0, 208, 164, 0, 0, 212, 164, 0, 116, 35, 65, 163, 114, 51, 67, 136, 110, 70, 77, 102, 109, 82, 84, 71,
+ 98, 93, 102, 27, 79, 133, 135, 20, 63, 161, 148, 17, 45, 177, 156, 17, 29, 187, 162, 17, 16, 193, 166, 14, 5, 198, 167, 8,
+ 0, 200, 165, 1, 0, 201, 162, 0, 0, 202, 159, 0, 0, 202, 157, 0, 0, 203, 155, 0, 0, 207, 156, 0, 115, 26, 9, 198,
+ 114, 58, 26, 148, 110, 80, 45, 104, 104, 92, 56, 79, 95, 102, 65, 50, 84, 130, 93, 36, 68, 162, 116, 28, 53, 181, 133, 25,
+ 36, 192, 141, 25, 23, 200, 146, 24, 9, 204, 151, 16, 2, 205, 150, 5, 0, 204, 150, 0, 0, 203, 148, 0, 0, 202, 146, 0,
+ 0, 201, 146, 0, 0, 205, 145, 0, 98, 78, 5, 222, 98, 84, 9, 207, 100, 104, 27, 152, 94, 112, 38, 123, 92, 118, 50, 86,
+ 92, 116, 58, 44, 75, 145, 88, 36, 57, 170, 110, 29, 40, 184, 127, 28, 27, 192, 136, 26, 14, 198, 141, 20, 4, 201, 143, 9,
+ 0, 201, 143, 0, 0, 199, 142, 0, 0, 198, 141, 0, 0, 197, 141, 0, 0, 200, 142, 0, 80, 108, 1, 241, 80, 118, 3, 238,
+ 82, 139, 14, 200, 82, 142, 25, 161, 82, 146, 34, 131, 80, 138, 45, 87, 84, 129, 52, 42, 65, 155, 80, 34, 46, 176, 104, 29,
+ 30, 187, 119, 28, 17, 192, 129, 24, 7, 196, 135, 12, 0, 196, 136, 2, 0, 195, 136, 0, 0, 193, 135, 0, 0, 192, 135, 0,
+ 0, 195, 136, 0, 68, 144, 4, 241, 68, 148, 6, 237, 69, 154, 12, 214, 70, 161, 19, 186, 71, 162, 26, 157, 71, 159, 31, 126,
+ 71, 149, 40, 82, 75, 146, 44, 37, 54, 170, 72, 29, 36, 182, 95, 27, 22, 188, 109, 25, 10, 191, 119, 17, 3, 192, 125, 6,
+ 0, 192, 126, 0, 0, 190, 126, 0, 0, 189, 126, 0, 0, 190, 127, 0, 53, 162, 7, 241, 53, 163, 8, 237, 55, 166, 11, 222,
+ 57, 171, 17, 199, 58, 170, 22, 178, 59, 171, 26, 153, 59, 168, 28, 121, 59, 165, 32, 80, 62, 163, 36, 34, 44, 179, 64, 27,
+ 26, 186, 86, 26, 15, 188, 100, 20, 7, 188, 108, 9, 1, 189, 112, 1, 0, 188, 114, 0, 0, 186, 115, 0, 0, 186, 116, 0,
+ 41, 175, 9, 241, 41, 173, 9, 238, 43, 175, 12, 227, 45, 177, 16, 209, 45, 177, 19, 193, 46, 178, 24, 173, 46, 178, 26, 148,
+ 47, 176, 26, 118, 47, 176, 28, 77, 49, 173, 32, 36, 33, 182, 56, 26, 19, 186, 77, 21, 9, 186, 90, 12, 3, 187, 98, 4,
+ 0, 184, 102, 0, 0, 181, 105, 0, 0, 180, 106, 0, 29, 182, 10, 243, 30, 181, 11, 239, 31, 181, 12, 230, 32, 184, 15, 218,
+ 33, 184, 17, 203, 33, 184, 21, 189, 34, 184, 24, 167, 35, 184, 25, 143, 36, 181, 25, 110, 36, 181, 26, 76, 36, 180, 31, 38,
+ 25, 184, 48, 23, 13, 184, 66, 15, 6, 184, 79, 6, 0, 184, 88, 0, 0, 178, 93, 0, 0, 175, 95, 0, 17, 187, 12, 243,
+ 18, 184, 13, 238, 20, 186, 14, 230, 22, 186, 16, 220, 23, 186, 18, 207, 24, 186, 21, 194, 25, 186, 24, 179, 25, 186, 22, 158,
+ 26, 184, 22, 137, 26, 184, 22, 105, 26, 184, 23, 71, 27, 186, 28, 36, 17, 186, 42, 20, 9, 184, 57, 9, 2, 184, 70, 3,
+ 0, 178, 78, 0, 0, 172, 84, 0, 6, 189, 15, 243, 9, 187, 15, 238, 11, 187, 16, 231, 13, 186, 17, 221, 14, 186, 17, 211,
+ 15, 184, 18, 199, 16, 184, 21, 188, 16, 184, 20, 168, 17, 186, 18, 151, 17, 184, 18, 127, 17, 184, 18, 98, 19, 186, 18, 65,
+ 20, 189, 25, 35, 12, 188, 36, 17, 5, 182, 50, 6, 0, 179, 62, 0, 0, 171, 72, 0, 1, 190, 13, 243, 2, 189, 16, 238,
+ 4, 188, 17, 230, 7, 187, 17, 222, 8, 186, 15, 212, 9, 184, 14, 202, 8, 184, 15, 192, 9, 184, 13, 179, 9, 186, 13, 161,
+ 9, 184, 12, 141, 10, 184, 11, 116, 11, 184, 11, 88, 12, 187, 13, 57, 11, 190, 19, 30, 6, 187, 29, 12, 1, 180, 43, 2,
+ 0, 172, 60, 0, 0, 191, 9, 244, 0, 189, 9, 238, 2, 188, 9, 230, 4, 187, 9, 221, 4, 184, 9, 212, 3, 182, 7, 204,
+ 3, 184, 8, 195, 3, 184, 7, 184, 4, 184, 7, 168, 4, 184, 6, 151, 5, 184, 6, 131, 6, 184, 5, 105, 6, 186, 6, 77,
+ 6, 189, 8, 45, 4, 190, 11, 20, 1, 184, 24, 5, 0, 175, 45, 0, 0, 192, 4, 244, 0, 189, 4, 238, 0, 187, 3, 230,
+ 0, 184, 2, 221, 1, 182, 2, 211, 0, 180, 1, 203, 0, 180, 1, 194, 0, 181, 2, 186, 0, 181, 1, 172, 0, 181, 1, 156,
+ 1, 181, 1, 140, 1, 182, 1, 119, 1, 184, 1, 94, 1, 186, 1, 64, 1, 189, 1, 32, 1, 189, 6, 11, 0, 179, 28, 0,
+ 0, 193, 0, 245, 0, 190, 0, 238, 0, 188, 0, 228, 0, 184, 0, 218, 0, 178, 0, 205, 0, 179, 0, 199, 0, 179, 0, 192,
+ 0, 179, 0, 184, 0, 180, 0, 172, 0, 180, 0, 158, 0, 181, 0, 144, 0, 182, 0, 126, 0, 184, 0, 104, 0, 187, 0, 79,
+ 0, 189, 0, 44, 0, 191, 0, 14, 0, 194, 0, 0, 93, 9, 198, 216, 94, 13, 196, 182, 93, 12, 201, 139, 90, 9, 209, 68,
+ 89, 15, 212, 3, 77, 52, 211, 3, 65, 97, 202, 4, 48, 132, 197, 5, 29, 150, 194, 6, 15, 164, 194, 5, 11, 176, 192, 4,
+ 9, 184, 190, 4, 7, 190, 189, 3, 4, 196, 187, 3, 2, 201, 184, 1, 1, 204, 181, 0, 0, 208, 180, 0, 95, 10, 168, 215,
+ 106, 32, 152, 164, 105, 38, 151, 129, 100, 34, 163, 78, 94, 46, 171, 10, 78, 89, 184, 8, 62, 123, 186, 8, 45, 146, 187, 8,
+ 26, 159, 188, 9, 12, 172, 189, 6, 3, 181, 188, 1, 0, 188, 186, 0, 0, 191, 182, 0, 0, 195, 179, 0, 0, 198, 177, 0,
+ 0, 202, 175, 0, 0, 205, 175, 0, 105, 24, 119, 184, 108, 36, 121, 156, 107, 56, 119, 118, 100, 52, 133, 86, 97, 52, 144, 17,
+ 79, 92, 162, 13, 63, 129, 171, 11, 45, 149, 176, 11, 27, 162, 179, 12, 14, 175, 181, 9, 4, 182, 182, 3, 0, 188, 179, 0,
+ 0, 190, 176, 0, 0, 193, 172, 0, 0, 196, 168, 0, 0, 199, 167, 0, 0, 202, 168, 0, 102, 22, 92, 192, 100, 34, 94, 168,
+ 100, 53, 102, 131, 100, 70, 100, 95, 93, 66, 114, 54, 82, 80, 137, 22, 64, 126, 152, 18, 47, 151, 159, 17, 30, 163, 165, 17,
+ 16, 175, 171, 13, 6, 182, 173, 6, 0, 187, 171, 0, 0, 189, 167, 0, 0, 191, 164, 0, 0, 193, 161, 0, 0, 194, 159, 0,
+ 0, 198, 161, 0, 98, 18, 48, 204, 100, 38, 62, 167, 99, 58, 71, 133, 94, 76, 78, 100, 92, 86, 86, 76, 86, 90, 98, 37,
+ 66, 130, 127, 28, 50, 151, 142, 25, 33, 165, 150, 24, 18, 177, 156, 20, 8, 182, 159, 10, 0, 188, 159, 1, 0, 189, 156, 0,
+ 0, 189, 153, 0, 0, 189, 151, 0, 0, 190, 149, 0, 0, 194, 150, 0, 92, 20, 1, 238, 97, 33, 16, 196, 102, 68, 40, 135,
+ 94, 84, 55, 102, 88, 93, 62, 79, 80, 105, 69, 59, 70, 127, 93, 45, 52, 154, 114, 37, 37, 171, 129, 36, 25, 184, 136, 32,
+ 11, 190, 142, 23, 3, 193, 143, 9, 0, 193, 141, 0, 0, 192, 140, 0, 0, 191, 139, 0, 0, 190, 138, 0, 0, 193, 137, 0,
+ 82, 74, 3, 243, 82, 80, 6, 233, 86, 97, 18, 194, 82, 107, 35, 151, 78, 113, 45, 123, 77, 116, 55, 90, 79, 115, 63, 54,
+ 61, 141, 87, 46, 42, 163, 107, 39, 26, 176, 122, 35, 15, 184, 131, 27, 6, 189, 135, 15, 1, 189, 135, 2, 0, 189, 134, 0,
+ 0, 188, 133, 0, 0, 187, 132, 0, 0, 189, 133, 0, 70, 121, 6, 241, 70, 126, 8, 234, 72, 133, 14, 213, 73, 141, 23, 182,
+ 71, 141, 31, 154, 70, 140, 41, 125, 68, 134, 52, 89, 70, 127, 59, 53, 53, 150, 80, 42, 33, 170, 100, 36, 18, 179, 113, 29,
+ 8, 184, 121, 20, 2, 186, 126, 7, 0, 184, 126, 0, 0, 182, 126, 0, 0, 181, 125, 0, 0, 184, 126, 0, 55, 147, 9, 241,
+ 55, 150, 10, 234, 56, 151, 14, 219, 58, 154, 19, 198, 59, 155, 25, 177, 58, 153, 32, 153, 59, 152, 39, 121, 57, 144, 46, 84,
+ 60, 143, 50, 46, 40, 164, 72, 36, 24, 176, 92, 31, 13, 179, 102, 23, 5, 181, 110, 11, 0, 182, 113, 1, 0, 180, 114, 0,
+ 0, 178, 114, 0, 0, 179, 115, 0, 42, 158, 11, 241, 42, 159, 12, 237, 44, 159, 15, 226, 45, 161, 18, 208, 46, 164, 22, 192,
+ 46, 163, 27, 172, 47, 163, 34, 147, 46, 162, 36, 118, 45, 159, 36, 80, 47, 159, 41, 41, 29, 170, 63, 32, 17, 177, 80, 24,
+ 7, 179, 93, 16, 2, 178, 99, 3, 0, 177, 102, 0, 0, 173, 104, 0, 0, 175, 106, 0, 30, 170, 12, 243, 31, 168, 14, 237,
+ 32, 168, 16, 227, 33, 171, 17, 216, 34, 172, 20, 202, 34, 172, 25, 187, 35, 171, 30, 165, 34, 171, 31, 143, 35, 170, 31, 112,
+ 35, 168, 32, 78, 36, 170, 37, 43, 22, 175, 54, 26, 11, 176, 70, 16, 3, 177, 82, 8, 0, 175, 88, 0, 0, 168, 92, 0,
+ 0, 167, 94, 0, 17, 178, 15, 243, 19, 177, 15, 238, 20, 177, 17, 231, 22, 177, 18, 221, 23, 178, 20, 208, 23, 177, 24, 194,
+ 25, 176, 27, 178, 26, 177, 27, 158, 25, 176, 26, 138, 25, 175, 26, 106, 26, 173, 27, 74, 26, 177, 34, 40, 14, 178, 45, 21,
+ 5, 177, 62, 12, 1, 173, 71, 1, 0, 167, 78, 0, 0, 164, 82, 0, 7, 182, 17, 243, 9, 180, 17, 238, 11, 180, 18, 231,
+ 13, 180, 19, 221, 14, 179, 21, 209, 14, 177, 22, 198, 16, 177, 24, 186, 16, 178, 24, 168, 16, 177, 22, 151, 17, 177, 21, 129,
+ 17, 176, 20, 98, 19, 177, 21, 66, 19, 181, 28, 37, 9, 179, 38, 18, 2, 173, 51, 6, 0, 167, 61, 0, 0, 162, 69, 0,
+ 0, 184, 17, 243, 2, 182, 17, 238, 5, 181, 17, 231, 7, 180, 17, 222, 7, 178, 16, 213, 7, 176, 14, 202, 8, 177, 15, 191,
+ 8, 177, 16, 178, 9, 177, 15, 161, 9, 176, 15, 141, 10, 176, 14, 116, 11, 176, 13, 88, 12, 178, 15, 58, 10, 182, 21, 33,
+ 3, 178, 31, 14, 0, 170, 42, 1, 0, 161, 56, 0, 0, 187, 11, 244, 0, 184, 11, 238, 2, 182, 11, 230, 4, 181, 10, 221,
+ 3, 179, 9, 213, 2, 176, 7, 203, 2, 176, 8, 193, 3, 176, 8, 182, 3, 176, 8, 167, 4, 175, 8, 149, 5, 173, 7, 130,
+ 6, 173, 7, 104, 7, 175, 7, 76, 6, 178, 10, 46, 3, 181, 13, 23, 1, 173, 23, 6, 0, 162, 42, 0, 0, 189, 5, 244,
+ 0, 184, 4, 238, 0, 181, 3, 230, 0, 179, 2, 221, 0, 177, 2, 211, 0, 172, 1, 200, 0, 172, 1, 191, 0, 172, 1, 182,
+ 0, 172, 1, 168, 0, 171, 1, 153, 1, 172, 1, 138, 1, 172, 1, 116, 1, 172, 1, 93, 1, 175, 2, 63, 1, 177, 2, 31,
+ 1, 177, 6, 10, 0, 165, 26, 0, 0, 189, 0, 244, 0, 187, 0, 238, 0, 182, 0, 228, 0, 178, 0, 218, 0, 173, 0, 205,
+ 0, 167, 0, 193, 0, 167, 0, 187, 0, 168, 0, 178, 0, 168, 0, 166, 0, 168, 0, 153, 0, 168, 0, 141, 0, 170, 0, 125,
+ 0, 170, 0, 102, 0, 173, 0, 76, 0, 176, 0, 40, 0, 178, 0, 11, 0, 179, 0, 0, 80, 9, 201, 216, 80, 9, 203, 197,
+ 82, 9, 204, 166, 79, 7, 213, 116, 79, 9, 215, 48, 77, 18, 213, 4, 63, 48, 213, 3, 48, 94, 204, 5, 31, 125, 199, 6,
+ 17, 144, 197, 5, 10, 158, 196, 3, 9, 167, 194, 3, 7, 177, 192, 2, 5, 184, 189, 2, 3, 189, 188, 1, 1, 193, 186, 0,
+ 0, 197, 184, 0, 86, 12, 179, 214, 88, 23, 172, 189, 89, 28, 170, 157, 86, 25, 180, 122, 86, 26, 184, 45, 80, 49, 187, 9,
+ 62, 86, 193, 8, 45, 116, 191, 8, 27, 140, 191, 9, 15, 153, 191, 7, 5, 164, 190, 2, 0, 173, 189, 0, 0, 179, 186, 0,
+ 0, 184, 182, 0, 0, 188, 180, 0, 0, 191, 179, 0, 0, 194, 179, 0, 92, 19, 141, 197, 93, 31, 147, 173, 90, 40, 145, 151,
+ 87, 39, 152, 125, 84, 37, 161, 60, 82, 51, 162, 15, 63, 90, 178, 12, 47, 121, 180, 12, 29, 142, 182, 12, 17, 155, 184, 9,
+ 6, 166, 184, 4, 0, 173, 182, 0, 0, 178, 179, 0, 0, 182, 176, 0, 0, 186, 173, 0, 0, 189, 171, 0, 0, 192, 172, 0,
+ 92, 21, 112, 195, 93, 30, 118, 179, 89, 40, 126, 156, 87, 55, 126, 127, 84, 56, 131, 91, 82, 52, 141, 43, 67, 89, 155, 19,
+ 51, 123, 162, 17, 33, 143, 167, 17, 17, 156, 172, 14, 7, 165, 176, 7, 0, 173, 176, 0, 0, 177, 171, 0, 0, 180, 167, 0,
+ 0, 184, 164, 0, 0, 186, 162, 0, 0, 189, 164, 0, 88, 24, 84, 197, 90, 34, 92, 179, 89, 41, 100, 161, 86, 62, 99, 125,
+ 84, 77, 95, 95, 80, 75, 108, 62, 69, 93, 131, 29, 52, 126, 144, 25, 34, 144, 152, 24, 19, 157, 159, 19, 8, 165, 163, 10,
+ 1, 171, 165, 1, 0, 175, 161, 0, 0, 177, 158, 0, 0, 179, 155, 0, 0, 181, 152, 0, 0, 184, 154, 0, 87, 20, 47, 213,
+ 88, 31, 54, 192, 89, 45, 67, 165, 86, 67, 75, 130, 80, 82, 80, 100, 76, 91, 87, 80, 72, 97, 98, 45, 52, 125, 123, 36,
+ 36, 146, 136, 33, 20, 158, 144, 27, 9, 167, 150, 17, 2, 172, 151, 4, 0, 175, 149, 0, 0, 176, 146, 0, 0, 176, 143, 0,
+ 0, 177, 141, 0, 0, 181, 142, 0, 80, 36, 6, 243, 82, 50, 14, 221, 84, 64, 26, 189, 82, 80, 45, 143, 75, 93, 60, 104,
+ 75, 93, 62, 82, 70, 108, 73, 66, 57, 123, 93, 55, 38, 149, 112, 46, 23, 164, 126, 40, 11, 175, 132, 31, 3, 180, 135, 17,
+ 0, 181, 134, 2, 0, 180, 132, 0, 0, 178, 130, 0, 0, 178, 129, 0, 0, 180, 126, 0, 72, 80, 8, 243, 73, 87, 11, 232,
+ 74, 99, 18, 208, 73, 106, 29, 179, 68, 109, 43, 146, 67, 110, 50, 115, 64, 114, 60, 91, 64, 115, 69, 65, 47, 137, 87, 56,
+ 28, 156, 105, 45, 14, 167, 118, 36, 5, 175, 123, 24, 1, 177, 125, 7, 0, 176, 125, 0, 0, 175, 123, 0, 0, 173, 121, 0,
+ 0, 175, 122, 0, 59, 118, 10, 241, 59, 123, 13, 232, 59, 129, 17, 218, 59, 135, 24, 196, 58, 134, 31, 176, 57, 135, 38, 150,
+ 57, 136, 46, 121, 53, 132, 59, 93, 55, 126, 64, 64, 39, 145, 80, 50, 19, 162, 97, 38, 9, 168, 106, 26, 1, 175, 113, 15,
+ 0, 172, 113, 0, 0, 170, 113, 0, 0, 167, 113, 0, 0, 168, 113, 0, 45, 141, 13, 243, 45, 143, 15, 233, 45, 146, 18, 222,
+ 46, 148, 22, 206, 46, 148, 26, 190, 46, 148, 32, 171, 46, 149, 38, 146, 45, 149, 45, 119, 44, 141, 51, 87, 46, 142, 55, 55,
+ 26, 157, 72, 40, 14, 165, 86, 28, 5, 170, 96, 18, 0, 170, 102, 6, 0, 167, 102, 0, 0, 164, 102, 0, 0, 164, 104, 0,
+ 31, 155, 16, 243, 32, 156, 17, 236, 33, 156, 19, 226, 34, 158, 22, 214, 34, 157, 25, 200, 34, 157, 29, 186, 34, 157, 35, 162,
+ 33, 159, 38, 144, 33, 157, 38, 113, 33, 155, 40, 80, 36, 157, 45, 47, 20, 163, 60, 31, 9, 166, 75, 17, 0, 170, 87, 12,
+ 0, 165, 89, 0, 0, 159, 91, 0, 0, 159, 93, 0, 18, 166, 17, 243, 20, 166, 18, 238, 21, 166, 19, 230, 23, 166, 21, 220,
+ 23, 165, 24, 208, 23, 164, 27, 194, 25, 165, 31, 176, 25, 165, 35, 156, 23, 164, 32, 137, 23, 164, 31, 107, 24, 162, 31, 75,
+ 24, 166, 38, 44, 12, 166, 48, 23, 0, 170, 67, 17, 0, 164, 73, 2, 0, 158, 77, 0, 0, 155, 80, 0, 8, 173, 19, 243,
+ 9, 172, 20, 238, 12, 171, 20, 231, 13, 171, 22, 221, 14, 170, 25, 209, 14, 167, 24, 198, 15, 167, 25, 184, 16, 168, 28, 168,
+ 15, 167, 26, 151, 15, 166, 25, 129, 16, 166, 23, 98, 17, 166, 24, 68, 15, 172, 31, 40, 6, 168, 40, 19, 0, 164, 53, 8,
+ 0, 157, 60, 0, 0, 152, 66, 0, 3, 178, 17, 243, 3, 175, 17, 238, 4, 173, 18, 231, 6, 171, 18, 222, 7, 170, 17, 213,
+ 7, 167, 16, 201, 8, 168, 17, 189, 7, 168, 19, 178, 8, 167, 19, 161, 8, 166, 18, 141, 9, 165, 17, 115, 11, 164, 16, 88,
+ 11, 167, 17, 59, 9, 172, 24, 35, 0, 168, 33, 17, 0, 159, 41, 1, 0, 151, 52, 0, 0, 180, 14, 244, 0, 177, 12, 238,
+ 2, 176, 11, 230, 3, 173, 10, 222, 3, 171, 9, 213, 2, 166, 8, 202, 3, 166, 8, 191, 2, 167, 10, 181, 3, 166, 10, 166,
+ 3, 164, 10, 148, 4, 164, 10, 130, 3, 165, 11, 106, 2, 166, 12, 80, 2, 170, 13, 51, 1, 171, 16, 26, 0, 163, 23, 8,
+ 0, 151, 37, 0, 0, 182, 7, 244, 0, 178, 5, 238, 0, 176, 3, 230, 0, 172, 2, 221, 0, 170, 2, 212, 0, 165, 1, 200,
+ 0, 163, 1, 189, 0, 163, 2, 179, 0, 163, 2, 166, 0, 162, 2, 151, 1, 161, 2, 136, 1, 161, 1, 113, 1, 161, 1, 91,
+ 1, 163, 2, 62, 0, 165, 4, 33, 0, 165, 7, 12, 0, 151, 22, 0, 0, 184, 0, 243, 0, 180, 0, 237, 0, 177, 0, 228,
+ 0, 172, 0, 218, 0, 167, 0, 206, 0, 162, 0, 193, 0, 157, 0, 178, 0, 157, 0, 170, 0, 157, 0, 159, 0, 157, 0, 149,
+ 0, 157, 0, 137, 0, 156, 0, 120, 0, 156, 0, 100, 0, 158, 0, 75, 0, 159, 0, 39, 0, 161, 0, 10, 0, 161, 0, 0,
+ 69, 9, 204, 218, 69, 9, 205, 203, 70, 9, 206, 184, 67, 6, 214, 150, 65, 7, 217, 95, 64, 9, 217, 38, 60, 20, 217, 5,
+ 47, 45, 215, 5, 33, 87, 206, 6, 19, 115, 202, 6, 12, 139, 200, 4, 8, 151, 198, 2, 6, 161, 195, 2, 4, 170, 193, 1,
+ 2, 177, 191, 1, 1, 182, 189, 0, 0, 188, 187, 0, 75, 10, 184, 219, 76, 17, 181, 204, 76, 23, 181, 180, 74, 21, 187, 152,
+ 72, 20, 193, 94, 70, 23, 194, 33, 62, 45, 194, 9, 48, 77, 196, 9, 31, 107, 194, 9, 17, 132, 194, 7, 7, 147, 193, 3,
+ 0, 156, 191, 0, 0, 163, 188, 0, 0, 170, 186, 0, 0, 176, 184, 0, 0, 180, 181, 0, 0, 184, 182, 0, 80, 19, 152, 201,
+ 82, 26, 153, 189, 80, 33, 155, 170, 75, 32, 165, 151, 72, 29, 176, 104, 70, 32, 177, 47, 65, 50, 178, 14, 51, 84, 184, 13,
+ 33, 113, 186, 12, 18, 136, 188, 9, 8, 148, 187, 4, 0, 157, 186, 0, 0, 163, 181, 0, 0, 168, 179, 0, 0, 173, 177, 0,
+ 0, 178, 175, 0, 0, 181, 177, 0, 79, 21, 135, 202, 80, 27, 136, 189, 80, 35, 139, 170, 76, 42, 143, 152, 74, 45, 148, 126,
+ 70, 43, 154, 82, 71, 51, 153, 21, 54, 86, 165, 18, 36, 114, 172, 17, 20, 137, 176, 14, 9, 149, 177, 9, 1, 157, 178, 1,
+ 0, 163, 175, 0, 0, 167, 170, 0, 0, 171, 167, 0, 0, 175, 165, 0, 0, 178, 168, 0, 79, 22, 107, 205, 80, 28, 109, 191,
+ 79, 36, 118, 175, 76, 47, 123, 151, 76, 65, 114, 119, 72, 64, 125, 92, 71, 63, 132, 36, 55, 89, 147, 26, 38, 118, 154, 24,
+ 23, 138, 159, 20, 10, 149, 164, 12, 2, 156, 167, 2, 0, 161, 164, 0, 0, 164, 159, 0, 0, 167, 157, 0, 0, 170, 155, 0,
+ 0, 175, 157, 0, 79, 20, 79, 215, 80, 28, 86, 198, 79, 39, 93, 179, 76, 50, 97, 155, 74, 68, 98, 122, 70, 80, 99, 100,
+ 65, 77, 109, 69, 59, 84, 123, 38, 39, 119, 139, 33, 23, 139, 147, 27, 10, 148, 152, 17, 2, 155, 155, 4, 0, 159, 153, 0,
+ 0, 161, 150, 0, 0, 163, 147, 0, 0, 165, 145, 0, 0, 170, 146, 0, 77, 15, 30, 234, 78, 26, 45, 212, 80, 39, 60, 188,
+ 77, 53, 72, 161, 69, 75, 79, 130, 66, 84, 80, 102, 62, 94, 90, 86, 61, 93, 96, 54, 38, 122, 119, 44, 22, 141, 133, 36,
+ 10, 150, 139, 26, 2, 157, 142, 12, 0, 159, 141, 0, 0, 159, 138, 0, 0, 161, 135, 0, 0, 161, 132, 0, 0, 165, 132, 0,
+ 71, 45, 13, 243, 72, 43, 22, 224, 72, 52, 32, 200, 71, 70, 45, 168, 62, 87, 63, 135, 66, 86, 62, 104, 62, 94, 68, 89,
+ 59, 110, 75, 72, 43, 121, 93, 63, 24, 143, 110, 52, 9, 158, 121, 41, 2, 164, 125, 25, 0, 165, 125, 8, 0, 165, 121, 0,
+ 0, 164, 119, 0, 0, 162, 116, 0, 0, 164, 113, 0, 60, 90, 14, 243, 60, 95, 17, 230, 60, 97, 23, 216, 59, 104, 31, 195,
+ 56, 106, 40, 173, 55, 109, 48, 139, 53, 110, 54, 112, 50, 113, 65, 93, 49, 115, 73, 74, 31, 135, 89, 65, 14, 151, 104, 48,
+ 4, 159, 112, 35, 0, 163, 115, 17, 0, 161, 113, 1, 0, 159, 110, 0, 0, 158, 109, 0, 0, 158, 108, 0, 46, 118, 17, 243,
+ 46, 122, 19, 231, 46, 123, 23, 220, 46, 126, 28, 204, 46, 130, 33, 189, 45, 131, 38, 167, 45, 132, 45, 142, 44, 134, 53, 118,
+ 38, 130, 63, 95, 40, 126, 68, 72, 23, 141, 80, 57, 11, 154, 92, 36, 2, 159, 100, 22, 0, 159, 102, 6, 0, 157, 102, 0,
+ 0, 155, 100, 0, 0, 154, 100, 0, 32, 139, 20, 243, 32, 140, 22, 233, 33, 140, 25, 224, 34, 141, 27, 212, 35, 142, 30, 199,
+ 35, 143, 34, 184, 35, 145, 38, 159, 33, 147, 44, 142, 30, 146, 48, 116, 28, 139, 53, 89, 30, 141, 58, 61, 17, 151, 69, 41,
+ 2, 159, 84, 31, 0, 159, 88, 12, 0, 155, 89, 0, 0, 152, 90, 0, 0, 151, 90, 0, 17, 151, 23, 243, 19, 152, 24, 237,
+ 21, 151, 25, 228, 22, 152, 26, 217, 23, 152, 29, 205, 23, 152, 32, 192, 24, 153, 34, 175, 23, 153, 37, 156, 20, 154, 38, 138,
+ 19, 151, 38, 109, 22, 150, 39, 79, 21, 153, 45, 50, 9, 156, 58, 33, 0, 158, 69, 17, 0, 155, 73, 1, 0, 150, 76, 0,
+ 0, 146, 78, 0, 6, 161, 25, 244, 9, 161, 25, 237, 11, 161, 26, 229, 13, 159, 26, 220, 14, 159, 26, 209, 14, 158, 26, 198,
+ 15, 158, 27, 184, 15, 157, 30, 167, 12, 158, 32, 152, 12, 156, 30, 130, 14, 154, 28, 99, 16, 154, 30, 70, 12, 159, 36, 45,
+ 2, 159, 45, 25, 0, 155, 53, 7, 0, 148, 59, 0, 0, 142, 64, 0, 0, 167, 23, 244, 1, 165, 21, 238, 3, 163, 21, 231,
+ 7, 162, 20, 222, 7, 159, 19, 213, 7, 159, 17, 201, 8, 159, 19, 189, 8, 158, 22, 176, 6, 158, 24, 161, 7, 157, 23, 141,
+ 8, 155, 22, 116, 8, 156, 21, 91, 7, 158, 25, 65, 4, 162, 29, 40, 0, 158, 34, 17, 0, 149, 40, 1, 0, 141, 48, 0,
+ 0, 171, 16, 244, 0, 168, 13, 238, 2, 166, 12, 230, 3, 164, 11, 222, 3, 162, 10, 213, 2, 159, 9, 203, 2, 159, 10, 192,
+ 1, 159, 12, 181, 1, 158, 14, 166, 0, 158, 14, 150, 1, 158, 14, 133, 0, 157, 14, 108, 0, 158, 14, 82, 0, 159, 15, 52,
+ 0, 161, 17, 26, 0, 152, 21, 6, 0, 139, 34, 0, 0, 175, 8, 244, 0, 171, 5, 238, 0, 167, 4, 230, 0, 164, 3, 222,
+ 1, 162, 3, 212, 0, 159, 2, 201, 0, 157, 2, 189, 0, 155, 2, 176, 0, 153, 2, 161, 0, 153, 3, 149, 0, 152, 4, 134,
+ 0, 152, 3, 113, 0, 152, 3, 92, 0, 153, 3, 64, 0, 153, 4, 33, 0, 153, 6, 11, 0, 138, 19, 0, 0, 177, 0, 243,
+ 0, 173, 0, 237, 0, 170, 0, 228, 0, 165, 0, 218, 0, 161, 0, 207, 0, 157, 0, 194, 0, 151, 0, 180, 0, 144, 0, 159,
+ 0, 144, 0, 150, 0, 143, 0, 141, 0, 143, 0, 130, 0, 142, 0, 114, 0, 141, 0, 96, 0, 143, 0, 74, 0, 144, 0, 39,
+ 0, 144, 0, 10, 0, 143, 0, 0, 57, 8, 207, 221, 57, 8, 207, 211, 57, 8, 208, 194, 55, 7, 213, 171, 53, 6, 217, 135,
+ 50, 8, 219, 80, 49, 9, 220, 34, 45, 18, 217, 6, 32, 40, 217, 7, 20, 79, 207, 6, 14, 108, 204, 4, 9, 131, 202, 2,
+ 6, 145, 199, 1, 4, 154, 196, 1, 2, 162, 194, 0, 0, 170, 191, 0, 0, 176, 189, 0, 63, 10, 189, 221, 64, 16, 187, 208,
+ 65, 20, 186, 191, 62, 18, 191, 171, 59, 16, 199, 133, 57, 18, 200, 78, 57, 23, 196, 30, 48, 41, 196, 11, 33, 72, 198, 11,
+ 18, 102, 198, 8, 9, 123, 196, 3, 1, 140, 194, 0, 0, 149, 190, 0, 0, 155, 188, 0, 0, 162, 186, 0, 0, 167, 184, 0,
+ 0, 172, 186, 0, 70, 17, 166, 209, 70, 21, 166, 200, 68, 28, 165, 184, 65, 28, 173, 167, 61, 25, 184, 137, 59, 26, 186, 91,
+ 59, 30, 182, 39, 53, 46, 182, 16, 36, 78, 189, 14, 21, 106, 190, 10, 9, 127, 189, 6, 1, 141, 188, 0, 0, 149, 184, 0,
+ 0, 155, 181, 0, 0, 161, 179, 0, 0, 165, 177, 0, 0, 168, 179, 0, 71, 17, 147, 211, 70, 23, 149, 199, 67, 30, 151, 186,
+ 66, 36, 154, 167, 63, 37, 159, 148, 60, 36, 164, 113, 59, 39, 165, 58, 59, 48, 162, 22, 39, 80, 173, 18, 24, 108, 179, 15,
+ 11, 130, 180, 9, 3, 141, 179, 2, 0, 150, 177, 0, 0, 154, 172, 0, 0, 158, 168, 0, 0, 162, 167, 0, 0, 165, 171, 0,
+ 71, 21, 126, 208, 71, 26, 127, 199, 67, 33, 134, 186, 65, 41, 138, 166, 64, 49, 139, 148, 61, 51, 142, 121, 58, 51, 147, 71,
+ 61, 57, 144, 29, 41, 86, 156, 25, 25, 112, 163, 21, 13, 131, 166, 13, 4, 141, 167, 4, 0, 149, 166, 0, 0, 152, 161, 0,
+ 0, 155, 158, 0, 0, 158, 156, 0, 0, 162, 159, 0, 69, 19, 104, 220, 70, 28, 107, 201, 68, 37, 110, 186, 65, 45, 114, 166,
+ 63, 54, 119, 148, 62, 69, 115, 120, 57, 69, 123, 93, 55, 66, 131, 57, 41, 91, 141, 34, 26, 115, 149, 28, 14, 131, 153, 19,
+ 5, 141, 156, 7, 0, 147, 155, 0, 0, 150, 151, 0, 0, 152, 148, 0, 0, 155, 146, 0, 0, 159, 147, 0, 69, 17, 70, 233,
+ 70, 30, 80, 206, 68, 43, 89, 184, 65, 51, 93, 166, 61, 60, 97, 151, 60, 75, 98, 118, 57, 84, 98, 102, 53, 82, 107, 75,
+ 43, 96, 121, 45, 25, 116, 134, 36, 12, 131, 141, 26, 3, 141, 145, 13, 0, 145, 145, 0, 0, 148, 141, 0, 0, 149, 138, 0,
+ 0, 151, 135, 0, 0, 154, 135, 0, 67, 20, 32, 239, 67, 28, 48, 222, 66, 41, 60, 200, 62, 54, 70, 181, 57, 68, 79, 156,
+ 56, 76, 79, 127, 53, 86, 82, 104, 48, 98, 91, 89, 46, 100, 97, 62, 25, 118, 115, 49, 10, 136, 127, 36, 3, 143, 131, 20,
+ 0, 146, 131, 3, 0, 147, 127, 0, 0, 148, 123, 0, 0, 149, 120, 0, 0, 151, 118, 0, 56, 52, 22, 244, 57, 62, 26, 228,
+ 57, 68, 33, 214, 55, 77, 42, 194, 50, 84, 53, 170, 54, 86, 57, 134, 56, 87, 59, 102, 50, 97, 71, 92, 40, 110, 79, 80,
+ 25, 120, 96, 71, 9, 141, 109, 56, 2, 149, 113, 37, 0, 151, 112, 13, 0, 151, 110, 0, 0, 151, 107, 0, 0, 150, 105, 0,
+ 0, 150, 100, 0, 45, 89, 24, 243, 44, 94, 26, 233, 43, 97, 31, 223, 43, 100, 37, 207, 42, 104, 42, 191, 42, 106, 47, 166,
+ 44, 106, 51, 132, 43, 109, 58, 109, 34, 113, 69, 98, 32, 115, 76, 82, 14, 132, 90, 71, 1, 147, 100, 51, 0, 150, 104, 26,
+ 0, 149, 102, 3, 0, 147, 100, 0, 0, 145, 98, 0, 0, 144, 95, 0, 31, 114, 26, 243, 31, 119, 27, 236, 31, 120, 30, 226,
+ 33, 122, 34, 214, 33, 125, 36, 199, 34, 126, 40, 184, 35, 129, 43, 158, 33, 130, 46, 138, 26, 133, 56, 120, 21, 127, 64, 97,
+ 22, 126, 72, 77, 8, 139, 82, 63, 1, 146, 88, 36, 0, 149, 89, 11, 0, 146, 88, 0, 0, 142, 88, 0, 0, 140, 87, 0,
+ 16, 136, 30, 244, 17, 138, 30, 237, 18, 138, 31, 229, 20, 139, 33, 218, 22, 140, 34, 205, 23, 141, 36, 191, 24, 141, 37, 173,
+ 23, 141, 38, 155, 18, 142, 45, 140, 16, 140, 48, 113, 14, 135, 56, 90, 13, 138, 61, 67, 0, 148, 71, 47, 0, 149, 73, 19,
+ 0, 145, 74, 1, 0, 141, 75, 0, 0, 136, 75, 0, 2, 149, 33, 244, 5, 150, 32, 238, 8, 150, 32, 230, 9, 149, 32, 221,
+ 12, 148, 31, 209, 14, 147, 29, 197, 16, 147, 30, 182, 15, 145, 32, 164, 11, 146, 36, 151, 9, 146, 38, 131, 8, 145, 40, 105,
+ 9, 144, 42, 79, 7, 148, 46, 52, 0, 149, 53, 31, 0, 145, 54, 6, 0, 139, 58, 0, 0, 132, 61, 0, 0, 155, 26, 244,
+ 1, 154, 23, 238, 3, 153, 23, 231, 6, 152, 22, 223, 7, 151, 21, 213, 8, 149, 20, 200, 9, 149, 21, 188, 7, 149, 25, 176,
+ 4, 149, 28, 161, 3, 149, 29, 144, 2, 149, 29, 123, 4, 148, 28, 95, 5, 147, 29, 67, 2, 150, 34, 41, 0, 146, 36, 15,
+ 0, 139, 40, 0, 0, 127, 45, 0, 0, 159, 17, 244, 0, 159, 14, 238, 2, 157, 13, 230, 2, 155, 13, 223, 2, 154, 12, 215,
+ 1, 152, 12, 204, 1, 151, 13, 193, 0, 151, 14, 181, 0, 149, 15, 165, 0, 149, 15, 149, 1, 148, 15, 131, 1, 147, 15, 106,
+ 0, 149, 16, 82, 0, 150, 17, 53, 0, 151, 18, 26, 0, 141, 21, 4, 0, 125, 31, 0, 0, 165, 9, 244, 0, 162, 5, 238,
+ 0, 159, 4, 230, 0, 157, 3, 222, 1, 154, 4, 212, 0, 151, 3, 201, 0, 150, 3, 190, 0, 147, 3, 177, 0, 145, 3, 159,
+ 0, 144, 4, 146, 0, 143, 4, 131, 0, 142, 4, 110, 0, 142, 3, 89, 0, 144, 4, 62, 0, 143, 4, 32, 0, 142, 6, 9,
+ 0, 120, 17, 0, 0, 167, 0, 243, 0, 165, 0, 238, 0, 162, 0, 229, 0, 158, 0, 219, 0, 154, 0, 207, 0, 150, 0, 194,
+ 0, 144, 0, 180, 0, 138, 0, 159, 0, 132, 0, 141, 0, 130, 0, 131, 0, 127, 0, 120, 0, 126, 0, 107, 0, 126, 0, 92,
+ 0, 127, 0, 70, 0, 127, 0, 39, 0, 126, 0, 11, 0, 125, 0, 0, 45, 8, 208, 222, 45, 8, 208, 213, 45, 8, 209, 200,
+ 43, 7, 213, 184, 40, 6, 217, 155, 37, 7, 219, 113, 35, 9, 220, 71, 32, 11, 219, 33, 31, 17, 217, 9, 22, 33, 218, 6,
+ 16, 73, 212, 4, 10, 102, 206, 3, 6, 125, 203, 1, 3, 139, 200, 1, 2, 149, 197, 0, 0, 156, 194, 0, 0, 163, 192, 0,
+ 48, 9, 195, 226, 50, 13, 191, 218, 52, 18, 190, 200, 49, 17, 195, 184, 45, 14, 203, 153, 44, 16, 203, 114, 44, 18, 202, 70,
+ 42, 22, 199, 33, 36, 38, 197, 13, 23, 63, 199, 9, 12, 91, 196, 6, 4, 113, 196, 1, 0, 131, 193, 0, 0, 141, 190, 0,
+ 0, 149, 189, 0, 0, 155, 187, 0, 0, 159, 188, 0, 51, 12, 179, 224, 56, 17, 173, 213, 58, 25, 173, 194, 52, 25, 181, 182,
+ 47, 21, 190, 154, 46, 22, 191, 125, 46, 25, 190, 79, 45, 29, 187, 42, 40, 44, 184, 17, 26, 70, 189, 14, 13, 96, 189, 8,
+ 3, 118, 189, 1, 0, 133, 187, 0, 0, 142, 184, 0, 0, 149, 181, 0, 0, 153, 179, 0, 0, 157, 181, 0, 54, 14, 161, 224,
+ 58, 19, 159, 212, 59, 26, 159, 193, 55, 32, 163, 181, 51, 33, 167, 163, 49, 34, 171, 141, 47, 34, 173, 105, 45, 35, 175, 70,
+ 44, 49, 170, 23, 27, 76, 177, 17, 15, 100, 180, 10, 5, 120, 180, 3, 0, 134, 179, 0, 0, 142, 175, 0, 0, 147, 171, 0,
+ 0, 151, 168, 0, 0, 153, 173, 0, 55, 17, 144, 223, 57, 23, 143, 209, 58, 29, 145, 194, 58, 36, 148, 179, 53, 44, 148, 159,
+ 51, 45, 151, 143, 49, 45, 153, 112, 47, 45, 155, 76, 45, 59, 154, 29, 27, 82, 163, 23, 15, 104, 167, 14, 6, 122, 170, 5,
+ 0, 134, 168, 0, 0, 141, 163, 0, 0, 144, 159, 0, 0, 148, 158, 0, 0, 151, 161, 0, 55, 18, 123, 228, 54, 27, 126, 211,
+ 55, 35, 127, 194, 56, 40, 131, 178, 53, 47, 133, 159, 49, 57, 135, 143, 47, 58, 138, 125, 45, 57, 141, 86, 45, 66, 140, 38,
+ 27, 87, 150, 29, 15, 106, 155, 18, 7, 123, 157, 8, 0, 133, 157, 0, 0, 139, 153, 0, 0, 141, 150, 0, 0, 145, 147, 0,
+ 0, 148, 150, 0, 57, 19, 98, 233, 56, 31, 104, 211, 54, 40, 109, 192, 53, 46, 110, 177, 51, 53, 113, 159, 51, 60, 119, 144,
+ 49, 75, 112, 118, 45, 74, 119, 93, 45, 76, 123, 51, 28, 91, 136, 38, 15, 107, 142, 25, 5, 123, 147, 16, 0, 131, 147, 1,
+ 0, 136, 143, 0, 0, 139, 139, 0, 0, 141, 136, 0, 0, 145, 137, 0, 57, 22, 69, 238, 55, 33, 80, 219, 53, 42, 87, 201,
+ 50, 50, 93, 186, 48, 59, 95, 164, 47, 66, 98, 147, 46, 77, 98, 120, 39, 87, 102, 105, 37, 84, 106, 79, 33, 90, 116, 52,
+ 15, 110, 129, 36, 5, 126, 135, 23, 0, 131, 136, 5, 0, 134, 132, 0, 0, 137, 127, 0, 0, 139, 123, 0, 0, 141, 121, 0,
+ 53, 30, 38, 240, 53, 40, 44, 223, 49, 47, 52, 213, 45, 56, 72, 196, 43, 67, 79, 177, 44, 71, 79, 152, 43, 76, 80, 123,
+ 36, 87, 86, 106, 29, 97, 93, 95, 27, 98, 99, 71, 11, 116, 113, 51, 2, 130, 120, 35, 0, 133, 120, 11, 0, 134, 115, 0,
+ 0, 135, 110, 0, 0, 136, 108, 0, 0, 136, 104, 0, 40, 63, 34, 244, 39, 72, 36, 233, 37, 75, 42, 224, 36, 73, 54, 206,
+ 34, 82, 65, 182, 42, 76, 58, 157, 47, 77, 57, 126, 43, 88, 65, 104, 33, 98, 75, 97, 21, 110, 82, 91, 6, 121, 98, 77,
+ 0, 133, 102, 51, 0, 137, 100, 23, 0, 138, 98, 2, 0, 138, 95, 0, 0, 136, 93, 0, 0, 137, 89, 0, 28, 93, 35, 244,
+ 28, 99, 36, 236, 28, 100, 38, 226, 29, 102, 43, 215, 28, 102, 46, 200, 29, 102, 49, 184, 34, 102, 47, 155, 36, 105, 52, 125,
+ 22, 110, 64, 115, 16, 114, 74, 104, 10, 116, 82, 91, 4, 126, 87, 70, 0, 135, 90, 37, 0, 137, 88, 9, 0, 135, 86, 0,
+ 0, 132, 84, 0, 0, 130, 82, 0, 14, 116, 37, 244, 16, 121, 37, 237, 17, 122, 37, 229, 19, 123, 39, 219, 20, 123, 40, 206,
+ 23, 122, 41, 192, 25, 122, 41, 173, 24, 123, 41, 152, 16, 126, 50, 139, 8, 123, 64, 121, 4, 121, 73, 104, 2, 125, 75, 86,
+ 0, 130, 75, 55, 0, 135, 75, 21, 0, 134, 74, 1, 0, 129, 74, 0, 0, 126, 74, 0, 2, 134, 37, 244, 5, 136, 35, 238,
+ 6, 135, 36, 231, 9, 135, 35, 222, 12, 134, 35, 211, 15, 133, 33, 197, 17, 134, 33, 181, 13, 134, 36, 166, 9, 134, 40, 151,
+ 2, 131, 52, 134, 0, 131, 56, 113, 0, 130, 57, 90, 0, 133, 59, 66, 0, 136, 57, 32, 0, 134, 55, 4, 0, 126, 58, 0,
+ 0, 120, 60, 0, 0, 142, 28, 244, 1, 142, 25, 238, 3, 142, 25, 231, 6, 141, 25, 222, 7, 140, 25, 212, 6, 139, 25, 201,
+ 7, 139, 26, 188, 7, 138, 27, 173, 5, 137, 29, 157, 1, 138, 35, 143, 0, 138, 36, 123, 0, 137, 36, 100, 0, 137, 37, 73,
+ 0, 139, 38, 43, 0, 135, 37, 15, 0, 126, 41, 0, 0, 116, 45, 0, 0, 149, 18, 245, 0, 149, 16, 238, 1, 148, 15, 232,
+ 2, 145, 14, 224, 2, 143, 14, 215, 2, 141, 14, 203, 1, 140, 15, 191, 0, 140, 17, 181, 0, 140, 17, 164, 0, 138, 18, 147,
+ 0, 138, 19, 129, 0, 137, 19, 107, 0, 137, 19, 82, 0, 137, 20, 51, 0, 138, 21, 26, 0, 129, 22, 2, 0, 114, 30, 0,
+ 0, 154, 9, 245, 0, 153, 6, 238, 0, 151, 5, 231, 0, 149, 5, 223, 0, 146, 5, 214, 0, 142, 4, 202, 0, 140, 4, 190,
+ 0, 138, 4, 177, 0, 136, 4, 159, 0, 134, 5, 144, 0, 133, 4, 129, 0, 132, 5, 109, 0, 132, 4, 88, 0, 133, 5, 61,
+ 0, 132, 5, 31, 0, 132, 7, 8, 0, 110, 16, 0, 0, 158, 0, 241, 0, 157, 0, 238, 0, 154, 0, 229, 0, 151, 0, 220,
+ 0, 147, 0, 208, 0, 141, 0, 195, 0, 136, 0, 180, 0, 130, 0, 159, 0, 121, 0, 141, 0, 119, 0, 126, 0, 118, 0, 115,
+ 0, 115, 0, 104, 0, 114, 0, 89, 0, 115, 0, 70, 0, 114, 0, 41, 0, 113, 0, 13, 0, 110, 0, 0, 32, 8, 208, 221,
+ 33, 8, 209, 214, 32, 8, 211, 203, 30, 6, 215, 189, 28, 5, 218, 168, 26, 6, 220, 139, 25, 6, 222, 98, 24, 8, 222, 62,
+ 24, 9, 221, 29, 24, 14, 221, 9, 16, 27, 222, 5, 12, 67, 215, 3, 8, 96, 208, 2, 4, 116, 204, 1, 1, 133, 201, 0,
+ 0, 143, 197, 0, 0, 151, 195, 0, 33, 10, 201, 225, 36, 12, 195, 221, 39, 17, 193, 206, 36, 16, 197, 192, 32, 13, 205, 165,
+ 30, 15, 205, 141, 29, 15, 205, 102, 28, 17, 204, 67, 29, 21, 200, 35, 26, 33, 198, 15, 16, 51, 199, 9, 7, 84, 198, 3,
+ 1, 104, 196, 0, 0, 122, 192, 0, 0, 135, 190, 0, 0, 142, 189, 0, 0, 148, 190, 0, 35, 12, 191, 227, 40, 15, 184, 220,
+ 44, 24, 178, 200, 39, 24, 186, 192, 34, 20, 193, 166, 32, 21, 194, 145, 31, 22, 193, 110, 31, 24, 191, 77, 31, 27, 189, 44,
+ 29, 40, 187, 19, 17, 59, 189, 11, 7, 87, 189, 4, 0, 107, 189, 0, 0, 123, 186, 0, 0, 135, 184, 0, 0, 141, 181, 0,
+ 0, 145, 184, 0, 37, 13, 177, 230, 42, 17, 170, 220, 44, 26, 166, 200, 41, 30, 168, 189, 38, 32, 172, 176, 36, 33, 175, 155,
+ 34, 32, 176, 133, 33, 31, 178, 99, 33, 36, 176, 47, 30, 49, 176, 22, 18, 69, 180, 14, 8, 93, 180, 5, 0, 110, 180, 0,
+ 0, 125, 176, 0, 0, 133, 173, 0, 0, 139, 171, 0, 0, 142, 176, 0, 39, 17, 158, 231, 43, 21, 153, 219, 45, 28, 154, 200,
+ 43, 35, 154, 187, 41, 41, 154, 171, 40, 45, 154, 153, 38, 45, 156, 135, 36, 41, 161, 102, 35, 44, 161, 52, 30, 59, 162, 27,
+ 17, 77, 167, 17, 8, 98, 170, 6, 0, 113, 170, 0, 0, 123, 164, 0, 0, 131, 161, 0, 0, 137, 159, 0, 0, 140, 163, 0,
+ 42, 18, 141, 233, 45, 25, 141, 218, 50, 30, 141, 200, 45, 38, 141, 186, 42, 45, 142, 170, 39, 52, 143, 154, 38, 53, 145, 139,
+ 36, 49, 149, 107, 34, 51, 150, 62, 30, 65, 150, 34, 17, 82, 156, 20, 8, 100, 158, 8, 0, 112, 159, 0, 0, 121, 154, 0,
+ 0, 127, 151, 0, 0, 133, 148, 0, 0, 137, 151, 0, 42, 22, 118, 236, 44, 30, 120, 217, 46, 36, 123, 199, 45, 42, 126, 187,
+ 41, 48, 126, 171, 37, 55, 130, 155, 36, 63, 134, 142, 34, 61, 135, 114, 32, 61, 136, 75, 33, 72, 136, 45, 17, 84, 144, 27,
+ 5, 102, 149, 16, 1, 110, 148, 1, 0, 119, 145, 0, 0, 126, 141, 0, 0, 130, 138, 0, 0, 134, 139, 0, 42, 27, 96, 237,
+ 41, 35, 102, 220, 41, 41, 105, 205, 40, 47, 108, 190, 37, 55, 110, 172, 37, 59, 112, 156, 36, 65, 116, 141, 33, 80, 110, 119,
+ 29, 75, 115, 95, 31, 75, 120, 65, 18, 90, 131, 37, 5, 105, 137, 24, 0, 113, 139, 9, 0, 118, 135, 0, 0, 123, 130, 0,
+ 0, 126, 126, 0, 0, 129, 125, 0, 41, 33, 72, 238, 41, 39, 75, 228, 38, 45, 82, 216, 36, 54, 92, 197, 34, 61, 95, 175,
+ 34, 63, 95, 156, 32, 68, 95, 139, 29, 80, 98, 119, 22, 90, 100, 108, 23, 86, 104, 80, 15, 95, 115, 51, 6, 107, 122, 34,
+ 0, 114, 126, 14, 0, 116, 121, 0, 0, 121, 116, 0, 0, 123, 110, 0, 0, 123, 108, 0, 35, 44, 48, 241, 34, 51, 52, 230,
+ 31, 58, 61, 221, 27, 64, 76, 206, 27, 67, 80, 189, 32, 65, 78, 168, 30, 68, 78, 149, 25, 82, 82, 126, 19, 92, 87, 110,
+ 13, 99, 93, 97, 8, 104, 100, 76, 0, 112, 107, 50, 0, 116, 107, 23, 0, 118, 104, 1, 0, 119, 100, 0, 0, 119, 95, 0,
+ 0, 120, 92, 0, 22, 74, 47, 244, 22, 79, 48, 236, 22, 82, 51, 226, 22, 86, 57, 213, 24, 84, 58, 197, 31, 76, 52, 176,
+ 39, 74, 48, 147, 39, 84, 55, 120, 25, 93, 67, 106, 13, 100, 78, 104, 0, 109, 84, 100, 0, 110, 91, 72, 0, 119, 88, 34,
+ 0, 121, 84, 4, 0, 121, 82, 0, 0, 120, 80, 0, 0, 120, 76, 0, 10, 99, 48, 244, 11, 102, 47, 238, 12, 104, 48, 230,
+ 14, 104, 49, 220, 17, 102, 48, 207, 22, 97, 46, 190, 27, 96, 44, 166, 20, 102, 49, 152, 1, 107, 65, 143, 6, 102, 70, 116,
+ 4, 105, 75, 102, 0, 110, 79, 86, 0, 114, 77, 54, 0, 119, 75, 17, 0, 119, 72, 0, 0, 115, 71, 0, 0, 113, 69, 0,
+ 0, 115, 45, 244, 2, 119, 43, 238, 5, 119, 42, 231, 9, 118, 40, 223, 12, 115, 39, 212, 15, 114, 37, 197, 17, 114, 36, 181,
+ 14, 115, 38, 166, 3, 119, 46, 157, 4, 114, 57, 130, 0, 110, 65, 110, 0, 110, 66, 92, 0, 110, 66, 70, 0, 114, 61, 36,
+ 0, 118, 56, 4, 0, 113, 57, 0, 0, 109, 58, 0, 0, 126, 32, 245, 1, 126, 28, 238, 3, 126, 28, 230, 7, 126, 28, 221,
+ 7, 125, 29, 212, 5, 125, 30, 203, 4, 126, 32, 192, 0, 126, 34, 182, 0, 126, 35, 163, 0, 123, 37, 144, 0, 116, 43, 119,
+ 0, 114, 44, 97, 0, 114, 44, 75, 0, 118, 45, 46, 0, 119, 39, 13, 0, 113, 41, 0, 0, 106, 44, 0, 0, 134, 21, 245,
+ 0, 136, 18, 238, 0, 135, 17, 232, 0, 133, 19, 225, 0, 132, 19, 217, 0, 130, 19, 205, 0, 129, 20, 192, 0, 127, 20, 179,
+ 0, 127, 20, 162, 0, 125, 21, 145, 0, 122, 23, 126, 0, 121, 23, 104, 0, 121, 23, 80, 0, 121, 23, 51, 0, 123, 23, 24,
+ 0, 115, 23, 1, 0, 104, 30, 0, 0, 142, 10, 245, 0, 141, 7, 239, 0, 140, 6, 232, 0, 137, 6, 224, 0, 135, 6, 214,
+ 0, 131, 6, 202, 0, 129, 6, 189, 0, 126, 6, 176, 0, 125, 7, 158, 0, 122, 6, 142, 0, 121, 6, 126, 0, 120, 6, 107,
+ 0, 120, 6, 87, 0, 120, 6, 60, 0, 120, 6, 30, 0, 119, 7, 6, 0, 102, 16, 0, 0, 147, 0, 241, 0, 146, 0, 239,
+ 0, 144, 0, 231, 0, 141, 0, 221, 0, 137, 0, 209, 0, 132, 0, 196, 0, 126, 0, 180, 0, 118, 0, 159, 0, 110, 0, 141,
+ 0, 108, 0, 126, 0, 107, 0, 110, 0, 105, 0, 102, 0, 104, 0, 87, 0, 104, 0, 69, 0, 104, 0, 43, 0, 102, 0, 16,
+ 0, 100, 0, 0, 22, 8, 211, 221, 22, 8, 211, 215, 21, 8, 212, 205, 20, 6, 216, 194, 19, 5, 219, 180, 19, 4, 221, 155,
+ 18, 4, 223, 125, 18, 5, 225, 87, 18, 5, 225, 54, 18, 8, 226, 26, 18, 12, 226, 7, 12, 24, 226, 4, 9, 62, 218, 2,
+ 5, 91, 211, 1, 2, 110, 205, 0, 0, 126, 201, 0, 0, 138, 197, 0, 21, 10, 204, 225, 25, 12, 200, 224, 26, 15, 199, 213,
+ 24, 14, 202, 198, 22, 12, 206, 176, 22, 12, 207, 154, 20, 11, 208, 126, 20, 12, 208, 89, 20, 14, 205, 60, 20, 18, 202, 35,
+ 19, 27, 200, 17, 10, 43, 201, 8, 3, 73, 200, 1, 0, 97, 196, 0, 0, 112, 192, 0, 0, 126, 190, 0, 0, 135, 192, 0,
+ 22, 12, 196, 228, 26, 14, 190, 225, 28, 19, 189, 211, 26, 21, 191, 198, 24, 18, 196, 176, 23, 17, 197, 157, 21, 17, 197, 134,
+ 21, 18, 196, 99, 22, 20, 193, 69, 22, 25, 191, 40, 20, 37, 189, 21, 10, 50, 191, 9, 2, 76, 191, 1, 0, 99, 188, 0,
+ 0, 114, 184, 0, 0, 125, 182, 0, 0, 132, 187, 0, 23, 15, 184, 231, 26, 17, 178, 226, 29, 23, 177, 212, 28, 27, 177, 198,
+ 27, 30, 178, 184, 26, 29, 180, 166, 24, 27, 182, 149, 21, 24, 184, 120, 24, 26, 181, 72, 25, 34, 179, 39, 20, 47, 180, 20,
+ 10, 61, 182, 9, 1, 84, 182, 0, 0, 102, 177, 0, 0, 113, 173, 0, 0, 122, 172, 0, 0, 129, 177, 0, 26, 18, 167, 232,
+ 27, 21, 164, 225, 29, 26, 164, 211, 29, 32, 162, 196, 30, 39, 159, 179, 29, 42, 161, 164, 26, 38, 165, 149, 23, 33, 168, 125,
+ 24, 33, 168, 75, 26, 41, 166, 42, 19, 56, 168, 22, 9, 70, 172, 9, 0, 89, 172, 0, 0, 102, 165, 0, 0, 112, 162, 0,
+ 0, 120, 159, 0, 0, 125, 165, 0, 27, 22, 151, 233, 29, 26, 151, 222, 29, 32, 150, 206, 29, 36, 151, 193, 29, 42, 151, 180,
+ 28, 48, 150, 163, 26, 48, 151, 150, 24, 41, 156, 130, 24, 40, 156, 82, 25, 46, 154, 48, 18, 60, 157, 26, 9, 75, 159, 11,
+ 1, 90, 161, 1, 0, 102, 156, 0, 0, 110, 151, 0, 0, 116, 149, 0, 0, 121, 152, 0, 26, 26, 135, 236, 28, 33, 136, 218,
+ 29, 39, 135, 200, 29, 43, 136, 191, 28, 46, 138, 179, 26, 50, 139, 163, 26, 56, 141, 151, 22, 49, 145, 135, 22, 47, 145, 93,
+ 24, 52, 142, 60, 18, 65, 145, 34, 8, 78, 150, 17, 2, 89, 150, 3, 0, 100, 146, 0, 0, 108, 141, 0, 0, 115, 139, 0,
+ 0, 118, 141, 0, 26, 32, 116, 237, 26, 38, 120, 220, 26, 44, 121, 205, 26, 47, 122, 192, 26, 51, 123, 180, 26, 54, 126, 165,
+ 25, 57, 127, 151, 20, 63, 130, 138, 19, 60, 129, 110, 21, 59, 130, 82, 17, 72, 133, 46, 3, 86, 141, 31, 0, 93, 141, 10,
+ 0, 100, 137, 0, 0, 107, 132, 0, 0, 113, 126, 0, 0, 114, 126, 0, 26, 38, 96, 238, 25, 44, 102, 223, 26, 47, 105, 211,
+ 25, 52, 108, 196, 25, 54, 108, 181, 26, 55, 107, 165, 24, 59, 106, 148, 19, 67, 110, 135, 15, 79, 109, 119, 14, 75, 112, 96,
+ 15, 79, 118, 62, 3, 89, 126, 43, 0, 95, 127, 18, 0, 100, 125, 0, 0, 106, 120, 0, 0, 110, 114, 0, 0, 109, 110, 0,
+ 23, 46, 77, 240, 21, 51, 86, 229, 21, 55, 89, 219, 21, 57, 93, 206, 23, 57, 92, 189, 26, 56, 91, 166, 21, 61, 93, 152,
+ 20, 70, 95, 137, 10, 82, 98, 122, 6, 88, 100, 109, 8, 86, 104, 84, 1, 91, 110, 68, 0, 99, 109, 41, 0, 100, 110, 4,
+ 0, 104, 104, 0, 0, 106, 99, 0, 0, 105, 96, 0, 15, 60, 62, 243, 17, 64, 63, 233, 17, 67, 65, 221, 19, 69, 70, 207,
+ 23, 65, 70, 193, 19, 60, 75, 184, 9, 67, 80, 175, 3, 75, 84, 158, 2, 84, 87, 135, 1, 93, 90, 115, 0, 94, 92, 97,
+ 0, 94, 94, 79, 0, 99, 93, 46, 0, 100, 90, 7, 0, 102, 86, 0, 0, 104, 82, 0, 0, 102, 79, 0, 1, 84, 64, 244,
+ 4, 88, 62, 237, 7, 87, 59, 228, 12, 84, 55, 217, 18, 76, 51, 200, 30, 61, 48, 175, 28, 65, 51, 159, 32, 72, 52, 140,
+ 18, 82, 64, 125, 0, 91, 76, 119, 0, 94, 78, 104, 0, 96, 75, 88, 0, 97, 76, 52, 0, 102, 72, 13, 0, 104, 68, 0,
+ 0, 104, 66, 0, 0, 102, 62, 0, 0, 97, 49, 244, 1, 100, 47, 238, 4, 100, 46, 232, 8, 100, 45, 222, 13, 96, 43, 207,
+ 12, 91, 43, 197, 9, 93, 45, 187, 0, 95, 51, 179, 0, 98, 55, 155, 0, 99, 62, 131, 0, 96, 66, 107, 0, 95, 66, 90,
+ 0, 95, 65, 66, 0, 98, 61, 32, 0, 102, 56, 4, 0, 100, 55, 0, 0, 98, 54, 0, 0, 106, 36, 245, 0, 108, 34, 239,
+ 2, 109, 33, 232, 4, 109, 33, 224, 5, 107, 33, 215, 4, 104, 34, 205, 2, 105, 36, 195, 0, 106, 37, 184, 0, 106, 36, 164,
+ 0, 107, 39, 143, 0, 100, 45, 116, 0, 94, 49, 93, 0, 93, 48, 72, 0, 94, 47, 47, 0, 99, 44, 17, 0, 100, 42, 1,
+ 0, 94, 43, 0, 0, 114, 23, 245, 0, 116, 20, 239, 0, 116, 19, 233, 0, 115, 20, 226, 0, 113, 22, 217, 0, 110, 23, 205,
+ 0, 110, 23, 192, 0, 110, 23, 179, 0, 110, 22, 162, 0, 109, 23, 145, 0, 106, 25, 125, 0, 100, 29, 99, 0, 99, 28, 76,
+ 0, 100, 28, 52, 0, 102, 28, 26, 0, 102, 25, 1, 0, 93, 29, 0, 0, 125, 12, 245, 0, 126, 9, 239, 0, 125, 7, 233,
+ 0, 122, 7, 225, 0, 120, 8, 215, 0, 116, 8, 202, 0, 114, 9, 189, 0, 110, 8, 175, 0, 109, 8, 157, 0, 108, 8, 141,
+ 0, 107, 8, 125, 0, 106, 8, 104, 0, 104, 8, 84, 0, 104, 8, 59, 0, 105, 8, 29, 0, 104, 8, 5, 0, 91, 15, 0,
+ 0, 132, 0, 240, 0, 132, 0, 239, 0, 130, 0, 234, 0, 126, 0, 225, 0, 123, 0, 213, 0, 119, 0, 198, 0, 112, 0, 181,
+ 0, 105, 0, 159, 0, 99, 0, 141, 0, 97, 0, 126, 0, 96, 0, 110, 0, 95, 0, 99, 0, 94, 0, 86, 0, 94, 0, 68,
+ 0, 93, 0, 44, 0, 92, 0, 18, 0, 90, 0, 0, 15, 7, 213, 223, 15, 7, 213, 218, 16, 6, 214, 209, 15, 5, 217, 200,
+ 14, 3, 220, 189, 14, 2, 222, 167, 14, 2, 225, 144, 14, 2, 227, 110, 15, 2, 228, 78, 15, 3, 229, 47, 15, 6, 230, 22,
+ 14, 12, 231, 5, 9, 20, 230, 2, 5, 56, 220, 1, 3, 84, 212, 0, 0, 104, 205, 0, 0, 119, 200, 0, 14, 10, 207, 225,
+ 15, 11, 205, 221, 15, 11, 206, 211, 14, 11, 208, 196, 13, 9, 209, 182, 13, 9, 209, 165, 13, 8, 211, 145, 13, 8, 212, 112,
+ 14, 9, 209, 82, 15, 11, 207, 56, 14, 16, 205, 35, 14, 25, 202, 19, 7, 34, 204, 7, 0, 62, 202, 0, 0, 87, 196, 0,
+ 0, 104, 193, 0, 0, 114, 194, 0, 12, 12, 199, 228, 14, 14, 198, 224, 17, 17, 198, 213, 16, 17, 199, 197, 14, 14, 200, 184,
+ 14, 14, 199, 167, 14, 12, 200, 149, 14, 12, 200, 119, 15, 14, 197, 87, 15, 16, 195, 61, 15, 20, 193, 36, 12, 29, 194, 17,
+ 5, 41, 194, 6, 0, 68, 191, 0, 0, 91, 187, 0, 0, 104, 184, 0, 0, 110, 188, 0, 13, 16, 189, 231, 14, 17, 188, 226,
+ 16, 20, 188, 215, 17, 25, 184, 204, 17, 26, 184, 191, 15, 23, 186, 177, 14, 18, 189, 154, 14, 17, 189, 127, 16, 18, 187, 90,
+ 17, 21, 184, 60, 17, 30, 184, 34, 11, 39, 184, 15, 3, 51, 186, 3, 0, 75, 181, 0, 0, 92, 176, 0, 0, 102, 172, 0,
+ 0, 108, 178, 0, 14, 19, 175, 233, 16, 21, 175, 227, 17, 25, 175, 216, 17, 30, 168, 202, 19, 38, 162, 184, 18, 35, 168, 175,
+ 16, 26, 175, 154, 15, 24, 177, 133, 17, 24, 175, 93, 17, 26, 172, 62, 18, 37, 171, 36, 10, 46, 175, 16, 3, 59, 175, 2,
+ 0, 77, 170, 0, 0, 92, 164, 0, 0, 102, 161, 0, 0, 106, 166, 0, 15, 24, 159, 234, 17, 27, 157, 225, 18, 31, 155, 213,
+ 18, 35, 154, 199, 18, 37, 152, 186, 19, 41, 154, 171, 17, 38, 158, 159, 15, 33, 161, 142, 16, 30, 161, 100, 17, 31, 159, 68,
+ 17, 41, 159, 42, 11, 51, 162, 21, 4, 63, 163, 5, 0, 77, 159, 0, 0, 91, 153, 0, 0, 100, 150, 0, 0, 104, 154, 0,
+ 14, 29, 146, 236, 17, 34, 144, 221, 20, 39, 141, 205, 20, 41, 142, 196, 18, 42, 144, 186, 18, 43, 145, 171, 16, 46, 146, 159,
+ 13, 40, 150, 145, 14, 36, 151, 110, 17, 37, 148, 77, 15, 45, 149, 48, 9, 55, 151, 27, 0, 68, 154, 11, 0, 77, 150, 0,
+ 0, 91, 142, 0, 0, 100, 140, 0, 0, 100, 142, 0, 13, 36, 132, 237, 15, 40, 133, 219, 17, 43, 131, 204, 18, 43, 132, 196,
+ 18, 44, 132, 186, 17, 44, 133, 172, 16, 47, 134, 157, 12, 51, 137, 146, 12, 47, 138, 126, 14, 45, 137, 95, 13, 50, 137, 60,
+ 7, 60, 141, 36, 0, 70, 143, 17, 0, 78, 139, 0, 0, 91, 133, 0, 0, 99, 127, 0, 0, 98, 129, 0, 11, 43, 115, 238,
+ 13, 45, 118, 219, 16, 47, 115, 202, 17, 45, 116, 195, 17, 45, 118, 187, 18, 47, 118, 173, 17, 51, 120, 158, 12, 59, 122, 144,
+ 7, 62, 122, 131, 7, 59, 125, 109, 8, 60, 126, 76, 2, 68, 130, 52, 0, 74, 130, 25, 0, 78, 126, 1, 0, 90, 121, 0,
+ 0, 96, 115, 0, 0, 94, 113, 0, 9, 50, 99, 240, 9, 53, 104, 225, 13, 50, 102, 213, 15, 48, 102, 202, 17, 47, 102, 190,
+ 17, 48, 102, 172, 10, 57, 104, 159, 7, 63, 108, 148, 1, 69, 110, 136, 0, 76, 107, 119, 0, 75, 110, 98, 0, 75, 112, 79,
+ 0, 79, 110, 46, 0, 80, 110, 7, 0, 88, 106, 0, 0, 93, 102, 0, 0, 91, 99, 0, 3, 63, 86, 243, 6, 64, 84, 233,
+ 9, 62, 84, 224, 13, 56, 84, 213, 17, 51, 84, 195, 13, 53, 88, 180, 7, 60, 92, 163, 9, 67, 91, 144, 4, 73, 95, 133,
+ 0, 82, 95, 116, 0, 84, 93, 100, 0, 80, 95, 86, 0, 84, 94, 59, 0, 84, 93, 25, 0, 87, 90, 2, 0, 90, 86, 0,
+ 0, 87, 84, 0, 0, 69, 70, 244, 5, 68, 66, 233, 10, 65, 62, 222, 17, 59, 60, 208, 15, 56, 63, 200, 0, 60, 77, 202,
+ 0, 63, 78, 186, 0, 66, 79, 165, 0, 72, 80, 144, 0, 78, 80, 120, 0, 80, 80, 100, 0, 77, 80, 88, 0, 80, 79, 61,
+ 0, 84, 76, 27, 0, 86, 72, 2, 0, 87, 68, 0, 0, 86, 67, 0, 0, 73, 51, 245, 0, 78, 51, 238, 4, 79, 49, 228,
+ 5, 77, 49, 220, 0, 73, 50, 218, 2, 65, 46, 205, 5, 64, 44, 189, 12, 63, 43, 164, 10, 68, 47, 145, 3, 79, 59, 126,
+ 0, 80, 64, 104, 0, 78, 64, 88, 0, 79, 61, 74, 0, 82, 60, 32, 0, 86, 54, 3, 0, 86, 52, 0, 0, 86, 48, 0,
+ 0, 86, 36, 245, 0, 88, 36, 238, 0, 90, 36, 233, 0, 90, 38, 226, 0, 88, 38, 217, 0, 84, 38, 206, 0, 84, 39, 194,
+ 0, 82, 40, 180, 0, 82, 40, 161, 0, 87, 43, 141, 0, 84, 46, 113, 0, 78, 47, 89, 0, 79, 47, 71, 0, 80, 45, 45,
+ 0, 82, 43, 14, 0, 84, 40, 0, 0, 80, 40, 0, 0, 95, 25, 246, 0, 96, 21, 239, 0, 96, 21, 233, 0, 96, 22, 226,
+ 0, 95, 23, 217, 0, 93, 24, 205, 0, 93, 25, 193, 0, 93, 25, 180, 0, 94, 26, 163, 0, 93, 26, 145, 0, 91, 26, 125,
+ 0, 84, 29, 96, 0, 80, 31, 73, 0, 80, 31, 51, 0, 82, 30, 27, 0, 84, 26, 2, 0, 78, 28, 0, 0, 104, 13, 245,
+ 0, 105, 9, 239, 0, 104, 9, 234, 0, 104, 8, 226, 0, 102, 9, 216, 0, 99, 9, 203, 0, 98, 9, 190, 0, 96, 9, 176,
+ 0, 95, 9, 158, 0, 94, 9, 142, 0, 93, 9, 126, 0, 92, 9, 104, 0, 86, 13, 79, 0, 84, 13, 56, 0, 86, 14, 32,
+ 0, 86, 13, 8, 0, 77, 14, 0, 0, 110, 0, 239, 0, 110, 0, 239, 0, 110, 0, 236, 0, 108, 0, 226, 0, 106, 0, 215,
+ 0, 102, 0, 200, 0, 98, 0, 184, 0, 93, 0, 161, 0, 86, 0, 141, 0, 84, 0, 126, 0, 84, 0, 110, 0, 84, 0, 99,
+ 0, 82, 0, 84, 0, 82, 0, 67, 0, 80, 0, 45, 0, 79, 0, 21, 0, 77, 0, 0, 11, 5, 215, 222, 12, 5, 215, 218,
+ 11, 3, 217, 212, 11, 2, 219, 203, 10, 1, 222, 192, 10, 1, 223, 177, 9, 0, 225, 155, 10, 0, 227, 131, 11, 1, 228, 99,
+ 11, 2, 229, 70, 11, 3, 231, 42, 12, 5, 232, 18, 11, 9, 233, 4, 7, 17, 232, 3, 4, 47, 221, 1, 1, 76, 212, 0,
+ 0, 97, 205, 0, 9, 9, 209, 225, 10, 11, 206, 220, 10, 9, 207, 213, 9, 8, 209, 199, 9, 7, 209, 189, 9, 7, 209, 175,
+ 9, 6, 212, 155, 9, 5, 212, 133, 9, 5, 212, 100, 9, 6, 211, 75, 9, 8, 208, 51, 9, 11, 207, 33, 9, 17, 205, 18,
+ 5, 26, 205, 6, 0, 50, 202, 0, 0, 78, 198, 0, 0, 93, 198, 0, 9, 11, 202, 228, 9, 12, 200, 223, 9, 12, 200, 214,
+ 9, 11, 201, 200, 9, 9, 201, 189, 8, 8, 200, 175, 8, 8, 201, 157, 8, 8, 200, 137, 9, 9, 200, 104, 9, 9, 198, 79,
+ 9, 11, 197, 53, 9, 15, 196, 29, 7, 21, 196, 12, 1, 32, 195, 1, 0, 58, 191, 0, 0, 77, 189, 0, 0, 89, 191, 0,
+ 7, 15, 192, 231, 8, 17, 190, 225, 9, 17, 190, 217, 10, 20, 189, 207, 9, 18, 188, 195, 8, 14, 189, 184, 8, 11, 190, 161,
+ 9, 10, 190, 141, 9, 10, 190, 109, 10, 12, 189, 80, 10, 16, 188, 50, 9, 21, 188, 25, 4, 28, 188, 9, 0, 42, 186, 0,
+ 0, 62, 181, 0, 0, 78, 177, 0, 0, 87, 181, 0, 7, 18, 181, 234, 7, 19, 179, 229, 9, 21, 179, 219, 9, 23, 177, 208,
+ 9, 22, 176, 196, 9, 19, 178, 184, 8, 17, 180, 163, 9, 16, 179, 144, 9, 15, 179, 113, 11, 15, 177, 82, 11, 19, 176, 53,
+ 9, 26, 178, 29, 4, 33, 178, 10, 0, 45, 175, 0, 0, 63, 168, 0, 0, 79, 164, 0, 0, 86, 168, 0, 6, 25, 166, 236,
+ 7, 27, 163, 227, 9, 27, 162, 218, 9, 26, 162, 207, 9, 25, 163, 195, 9, 27, 163, 184, 9, 26, 163, 168, 9, 22, 165, 151,
+ 9, 19, 166, 119, 9, 19, 164, 86, 10, 23, 163, 60, 9, 30, 164, 36, 4, 37, 166, 16, 0, 46, 163, 1, 0, 65, 157, 0,
+ 0, 80, 152, 0, 0, 84, 156, 0, 6, 28, 153, 237, 8, 29, 151, 225, 9, 31, 150, 214, 10, 29, 150, 204, 9, 27, 151, 194,
+ 9, 32, 149, 178, 9, 36, 149, 163, 7, 30, 152, 151, 8, 24, 154, 126, 9, 23, 152, 92, 9, 28, 151, 66, 7, 36, 153, 43,
+ 3, 41, 155, 20, 0, 48, 153, 2, 0, 67, 146, 0, 0, 80, 141, 0, 0, 82, 143, 0, 3, 36, 141, 238, 8, 34, 139, 222,
+ 9, 34, 137, 209, 10, 33, 138, 201, 11, 34, 139, 191, 10, 36, 140, 179, 9, 40, 141, 164, 6, 41, 141, 151, 5, 37, 142, 138,
+ 5, 36, 143, 114, 4, 38, 142, 80, 4, 41, 143, 51, 0, 46, 146, 28, 0, 50, 143, 3, 0, 68, 135, 0, 0, 80, 127, 0,
+ 0, 79, 130, 0, 1, 41, 129, 238, 9, 36, 126, 219, 11, 36, 123, 202, 10, 35, 125, 196, 12, 36, 123, 186, 10, 38, 125, 173,
+ 9, 42, 126, 161, 4, 47, 129, 151, 2, 49, 127, 137, 4, 44, 130, 118, 3, 45, 131, 89, 0, 48, 133, 65, 0, 50, 133, 34,
+ 0, 52, 131, 5, 0, 68, 122, 0, 0, 78, 115, 0, 0, 75, 113, 0, 1, 45, 112, 239, 7, 39, 110, 224, 9, 38, 109, 211,
+ 8, 39, 112, 202, 9, 41, 113, 193, 7, 44, 114, 184, 8, 47, 114, 167, 4, 52, 116, 151, 0, 56, 114, 138, 0, 52, 114, 123,
+ 0, 52, 115, 102, 0, 50, 116, 80, 0, 54, 118, 43, 0, 55, 114, 10, 0, 67, 107, 0, 0, 76, 102, 0, 0, 73, 100, 0,
+ 0, 50, 96, 241, 4, 48, 93, 232, 7, 45, 93, 223, 6, 43, 98, 211, 5, 45, 100, 198, 2, 49, 100, 184, 0, 54, 102, 168,
+ 0, 58, 102, 153, 0, 61, 102, 139, 0, 58, 100, 121, 0, 65, 96, 100, 0, 59, 98, 84, 0, 61, 100, 58, 0, 61, 97, 30,
+ 0, 68, 93, 3, 0, 75, 89, 0, 0, 71, 88, 0, 0, 54, 79, 244, 0, 53, 75, 238, 0, 51, 77, 231, 2, 45, 82, 219,
+ 0, 45, 84, 209, 0, 47, 86, 194, 0, 52, 86, 177, 0, 54, 86, 157, 0, 60, 86, 140, 0, 60, 86, 123, 0, 64, 80, 99,
+ 0, 62, 80, 84, 0, 60, 82, 68, 0, 61, 82, 45, 0, 66, 78, 9, 0, 72, 73, 0, 0, 68, 73, 0, 0, 54, 57, 245,
+ 4, 52, 51, 234, 8, 50, 47, 225, 8, 45, 47, 219, 4, 45, 50, 213, 0, 50, 59, 202, 0, 53, 62, 189, 0, 49, 68, 171,
+ 0, 53, 68, 149, 0, 57, 68, 130, 0, 61, 67, 102, 0, 61, 65, 82, 0, 59, 65, 68, 0, 60, 64, 43, 0, 67, 59, 9,
+ 0, 70, 55, 0, 0, 67, 53, 0, 0, 56, 37, 246, 0, 62, 36, 238, 0, 62, 36, 233, 0, 59, 35, 226, 0, 55, 33, 218,
+ 0, 52, 34, 206, 6, 51, 35, 188, 17, 48, 39, 161, 9, 50, 44, 151, 1, 57, 47, 140, 0, 61, 49, 113, 0, 60, 47, 86,
+ 0, 61, 46, 69, 0, 63, 45, 58, 0, 66, 41, 10, 0, 67, 38, 0, 0, 66, 35, 0, 0, 72, 25, 246, 0, 74, 22, 238,
+ 0, 74, 22, 233, 0, 73, 22, 226, 0, 71, 23, 217, 0, 69, 23, 206, 0, 68, 24, 194, 0, 68, 26, 182, 0, 70, 26, 164,
+ 0, 72, 26, 146, 0, 71, 27, 125, 0, 66, 28, 94, 0, 62, 31, 71, 0, 65, 31, 52, 0, 67, 29, 25, 0, 66, 26, 1,
+ 0, 62, 26, 0, 0, 84, 14, 245, 0, 86, 10, 239, 0, 86, 9, 234, 0, 84, 9, 227, 0, 82, 9, 217, 0, 80, 10, 205,
+ 0, 79, 10, 193, 0, 77, 10, 179, 0, 77, 11, 161, 0, 75, 11, 144, 0, 75, 10, 126, 0, 74, 10, 104, 0, 69, 14, 78,
+ 0, 68, 13, 54, 0, 72, 13, 30, 0, 71, 13, 6, 0, 60, 14, 0, 0, 91, 0, 238, 0, 92, 0, 238, 0, 91, 0, 236,
+ 0, 90, 0, 227, 0, 87, 0, 216, 0, 84, 0, 202, 0, 80, 0, 188, 0, 76, 0, 167, 0, 71, 0, 145, 0, 70, 0, 130,
+ 0, 69, 0, 112, 0, 69, 0, 99, 0, 68, 0, 84, 0, 66, 0, 67, 0, 66, 0, 45, 0, 65, 0, 23, 0, 61, 0, 0,
+ 8, 3, 218, 224, 8, 3, 218, 219, 8, 2, 220, 213, 7, 1, 222, 204, 7, 0, 224, 195, 6, 0, 224, 184, 6, 0, 226, 164,
+ 7, 0, 227, 145, 7, 0, 229, 116, 7, 1, 230, 87, 8, 1, 231, 62, 8, 2, 232, 37, 8, 4, 234, 17, 9, 9, 233, 6,
+ 5, 13, 233, 3, 2, 40, 222, 0, 0, 70, 214, 0, 6, 5, 213, 228, 6, 8, 209, 221, 6, 6, 209, 213, 5, 4, 213, 202,
+ 4, 3, 213, 192, 4, 3, 213, 180, 4, 3, 213, 163, 4, 2, 213, 145, 5, 2, 213, 116, 6, 3, 213, 90, 6, 4, 212, 68,
+ 6, 6, 211, 46, 5, 8, 209, 30, 5, 10, 208, 17, 3, 17, 207, 5, 0, 41, 204, 0, 0, 63, 205, 0, 3, 10, 204, 230,
+ 5, 10, 201, 224, 5, 9, 201, 213, 5, 6, 202, 202, 4, 5, 202, 192, 4, 4, 201, 180, 4, 4, 201, 164, 4, 4, 201, 147,
+ 4, 4, 201, 122, 5, 4, 200, 94, 5, 5, 199, 71, 5, 7, 198, 45, 4, 9, 198, 26, 3, 14, 198, 9, 1, 25, 195, 1,
+ 0, 41, 194, 0, 0, 56, 196, 0, 3, 9, 195, 233, 4, 10, 193, 226, 5, 12, 192, 216, 5, 10, 192, 204, 3, 7, 192, 193,
+ 3, 5, 191, 181, 3, 5, 191, 165, 3, 4, 190, 149, 4, 4, 191, 126, 5, 5, 190, 97, 5, 7, 190, 70, 5, 9, 189, 45,
+ 4, 11, 189, 23, 2, 16, 189, 9, 0, 30, 186, 0, 0, 45, 182, 0, 0, 54, 188, 0, 1, 16, 184, 236, 4, 16, 184, 228,
+ 5, 14, 182, 219, 4, 11, 184, 207, 3, 9, 184, 194, 3, 8, 182, 184, 3, 8, 181, 167, 3, 8, 181, 151, 4, 7, 181, 130,
+ 5, 7, 181, 100, 6, 9, 180, 73, 5, 10, 179, 46, 3, 13, 180, 25, 2, 17, 178, 9, 0, 33, 173, 0, 0, 48, 170, 0,
+ 0, 54, 176, 0, 2, 18, 172, 237, 3, 17, 171, 230, 4, 16, 170, 221, 4, 13, 171, 211, 3, 11, 172, 198, 3, 13, 170, 189,
+ 3, 14, 167, 175, 3, 11, 168, 159, 4, 9, 170, 134, 6, 9, 170, 104, 5, 9, 167, 76, 3, 14, 167, 52, 2, 17, 168, 30,
+ 0, 21, 167, 10, 0, 36, 161, 0, 0, 51, 156, 0, 0, 54, 162, 0, 1, 22, 159, 238, 2, 19, 157, 230, 4, 17, 157, 221,
+ 4, 15, 157, 211, 3, 13, 158, 199, 3, 17, 156, 188, 2, 23, 152, 170, 2, 17, 156, 158, 2, 14, 158, 138, 2, 14, 159, 113,
+ 0, 17, 159, 87, 0, 18, 158, 60, 1, 20, 157, 33, 0, 25, 156, 11, 0, 39, 150, 0, 0, 55, 143, 0, 0, 55, 148, 0,
+ 1, 25, 147, 238, 4, 21, 144, 226, 5, 20, 142, 215, 4, 19, 143, 207, 3, 19, 144, 197, 3, 21, 142, 184, 3, 25, 141, 167,
+ 2, 25, 143, 155, 1, 22, 145, 142, 1, 19, 146, 126, 1, 19, 146, 91, 0, 21, 146, 65, 0, 25, 147, 37, 0, 27, 145, 12,
+ 0, 41, 139, 0, 0, 56, 131, 0, 0, 54, 133, 0, 1, 28, 134, 238, 3, 26, 132, 222, 2, 26, 129, 206, 2, 28, 130, 201,
+ 3, 30, 131, 193, 3, 32, 132, 182, 1, 34, 134, 170, 0, 36, 132, 153, 0, 36, 131, 140, 0, 29, 134, 126, 0, 26, 135, 100,
+ 0, 27, 134, 75, 0, 28, 134, 43, 0, 30, 133, 15, 0, 41, 126, 0, 0, 55, 116, 0, 0, 51, 115, 0, 0, 31, 118, 239,
+ 2, 27, 118, 225, 3, 28, 118, 213, 2, 28, 118, 201, 2, 32, 118, 191, 1, 36, 119, 181, 0, 37, 120, 168, 0, 40, 121, 153,
+ 0, 40, 118, 139, 0, 36, 116, 123, 0, 33, 119, 106, 0, 30, 119, 86, 0, 30, 119, 49, 0, 33, 118, 18, 0, 41, 110, 1,
+ 0, 54, 104, 0, 0, 50, 102, 0, 0, 35, 102, 240, 1, 34, 100, 232, 1, 33, 102, 225, 0, 30, 104, 209, 0, 34, 104, 193,
+ 0, 37, 106, 184, 0, 38, 105, 170, 0, 40, 106, 155, 0, 41, 108, 141, 0, 41, 100, 121, 0, 40, 100, 104, 0, 36, 102, 84,
+ 0, 33, 102, 55, 0, 36, 104, 26, 0, 41, 98, 2, 0, 53, 91, 0, 0, 48, 91, 0, 0, 36, 84, 243, 0, 37, 84, 237,
+ 0, 36, 84, 230, 0, 31, 90, 215, 0, 31, 91, 201, 0, 33, 91, 190, 0, 35, 90, 176, 0, 36, 91, 156, 0, 39, 88, 139,
+ 0, 42, 87, 122, 0, 42, 86, 102, 0, 45, 80, 82, 0, 40, 84, 65, 0, 39, 86, 45, 0, 43, 82, 13, 0, 52, 77, 0,
+ 0, 47, 77, 0, 0, 38, 67, 244, 0, 38, 64, 238, 0, 36, 63, 232, 0, 35, 64, 223, 0, 34, 66, 212, 0, 36, 70, 200,
+ 0, 36, 72, 187, 0, 35, 75, 164, 0, 37, 74, 140, 0, 40, 71, 122, 0, 42, 70, 102, 0, 46, 64, 77, 0, 46, 63, 62,
+ 0, 44, 67, 49, 0, 45, 65, 20, 0, 49, 61, 1, 0, 45, 61, 0, 0, 37, 45, 245, 5, 37, 38, 233, 5, 34, 36, 228,
+ 7, 32, 35, 220, 3, 29, 36, 214, 0, 30, 40, 205, 0, 35, 47, 191, 0, 30, 53, 175, 0, 35, 55, 153, 0, 36, 53, 136,
+ 0, 38, 52, 110, 0, 43, 49, 84, 0, 45, 48, 64, 0, 44, 49, 53, 0, 47, 47, 23, 0, 46, 42, 1, 0, 45, 40, 0,
+ 0, 39, 26, 247, 0, 43, 21, 239, 0, 41, 19, 234, 0, 38, 17, 227, 0, 35, 17, 219, 0, 32, 17, 207, 1, 34, 19, 195,
+ 2, 36, 22, 180, 0, 40, 26, 164, 0, 44, 28, 145, 0, 45, 29, 125, 0, 45, 30, 93, 0, 45, 31, 68, 0, 47, 33, 54,
+ 0, 44, 30, 41, 0, 46, 24, 0, 0, 45, 22, 0, 0, 56, 14, 246, 0, 58, 11, 239, 0, 57, 9, 234, 0, 55, 9, 227,
+ 0, 53, 9, 218, 0, 51, 10, 207, 0, 51, 10, 196, 0, 50, 11, 184, 0, 51, 12, 165, 0, 49, 13, 148, 0, 49, 12, 129,
+ 0, 49, 12, 104, 0, 45, 14, 76, 0, 47, 15, 56, 0, 52, 11, 32, 0, 49, 13, 0, 0, 40, 15, 0, 0, 66, 0, 238,
+ 0, 65, 0, 236, 0, 63, 0, 232, 0, 62, 0, 226, 0, 60, 0, 217, 0, 58, 0, 206, 0, 57, 0, 193, 0, 54, 0, 177,
+ 0, 50, 0, 154, 0, 49, 0, 138, 0, 49, 0, 119, 0, 48, 0, 100, 0, 48, 0, 84, 0, 46, 0, 65, 0, 45, 0, 45,
+ 0, 45, 0, 25, 0, 44, 0, 0, 3, 0, 222, 230, 3, 0, 222, 225, 3, 0, 222, 218, 3, 0, 224, 208, 3, 0, 225, 200,
+ 3, 0, 225, 189, 2, 0, 227, 175, 3, 0, 228, 157, 3, 0, 229, 136, 3, 0, 230, 106, 3, 0, 232, 80, 3, 0, 233, 56,
+ 3, 0, 234, 34, 3, 1, 236, 17, 4, 3, 236, 6, 2, 4, 236, 0, 0, 34, 224, 0, 2, 0, 217, 233, 2, 0, 213, 225,
+ 2, 0, 213, 217, 1, 0, 215, 205, 1, 0, 215, 196, 0, 0, 215, 186, 0, 0, 215, 171, 0, 0, 215, 154, 1, 0, 215, 134,
+ 1, 0, 215, 106, 2, 0, 215, 82, 2, 1, 215, 61, 2, 2, 214, 43, 2, 3, 213, 28, 2, 5, 212, 17, 1, 11, 212, 3,
+ 0, 25, 214, 0, 0, 2, 207, 234, 1, 3, 204, 227, 1, 2, 203, 216, 0, 0, 204, 204, 0, 0, 204, 195, 0, 0, 203, 184,
+ 0, 0, 203, 171, 0, 0, 203, 154, 0, 0, 202, 137, 0, 0, 202, 110, 1, 1, 201, 89, 1, 1, 201, 68, 1, 1, 201, 47,
+ 1, 2, 200, 30, 2, 5, 199, 18, 1, 13, 198, 4, 0, 17, 203, 0, 0, 4, 197, 236, 1, 4, 195, 229, 1, 3, 194, 218,
+ 0, 1, 193, 204, 0, 1, 193, 194, 0, 0, 192, 184, 0, 0, 191, 171, 0, 0, 191, 155, 0, 0, 191, 140, 0, 0, 192, 114,
+ 0, 0, 192, 89, 1, 1, 192, 66, 1, 1, 191, 45, 0, 2, 190, 27, 1, 6, 189, 14, 1, 17, 187, 3, 0, 17, 194, 0,
+ 0, 8, 187, 236, 1, 8, 186, 230, 1, 6, 186, 219, 1, 2, 184, 206, 0, 1, 184, 194, 0, 0, 184, 184, 0, 0, 182, 171,
+ 0, 0, 182, 155, 0, 0, 182, 140, 0, 0, 184, 115, 0, 0, 184, 91, 0, 1, 182, 65, 1, 2, 181, 42, 0, 3, 180, 24,
+ 1, 7, 179, 10, 0, 22, 175, 3, 0, 17, 182, 0, 0, 10, 176, 237, 1, 9, 175, 231, 1, 7, 175, 221, 1, 4, 175, 209,
+ 0, 2, 173, 197, 0, 3, 171, 189, 0, 2, 170, 176, 0, 1, 170, 162, 0, 0, 171, 141, 0, 0, 172, 119, 0, 1, 172, 94,
+ 0, 1, 171, 68, 0, 3, 170, 41, 0, 3, 167, 20, 0, 9, 166, 7, 0, 26, 159, 3, 0, 18, 167, 0, 0, 11, 162, 238,
+ 1, 9, 162, 231, 2, 9, 161, 222, 1, 6, 162, 211, 0, 3, 162, 200, 0, 4, 159, 189, 0, 5, 158, 176, 0, 2, 159, 161,
+ 0, 1, 159, 141, 0, 1, 159, 125, 0, 1, 159, 99, 0, 2, 159, 73, 0, 5, 158, 44, 0, 6, 156, 19, 0, 13, 153, 4,
+ 0, 30, 148, 2, 0, 21, 152, 0, 0, 14, 151, 238, 0, 11, 151, 230, 0, 10, 150, 222, 0, 8, 150, 212, 0, 7, 149, 201,
+ 0, 7, 149, 189, 0, 8, 148, 176, 0, 8, 147, 159, 0, 7, 147, 145, 0, 5, 148, 133, 0, 5, 148, 104, 0, 5, 147, 77,
+ 0, 6, 146, 47, 0, 8, 145, 20, 0, 16, 142, 4, 0, 31, 136, 1, 0, 24, 138, 0, 0, 16, 139, 238, 0, 13, 138, 227,
+ 0, 11, 137, 218, 0, 9, 137, 209, 0, 9, 137, 199, 0, 10, 137, 189, 0, 10, 137, 175, 0, 10, 134, 156, 0, 16, 132, 140,
+ 0, 9, 135, 127, 0, 7, 137, 104, 0, 7, 134, 80, 0, 8, 134, 51, 0, 9, 133, 23, 0, 17, 131, 4, 0, 31, 121, 1,
+ 0, 25, 121, 0, 0, 17, 123, 239, 0, 15, 125, 230, 0, 13, 125, 220, 0, 11, 125, 209, 0, 12, 123, 198, 0, 14, 123, 187,
+ 0, 17, 123, 171, 0, 18, 125, 155, 0, 18, 119, 139, 0, 16, 119, 122, 0, 13, 121, 108, 0, 10, 120, 91, 0, 9, 119, 57,
+ 0, 11, 119, 26, 0, 17, 116, 5, 0, 30, 107, 1, 0, 25, 107, 0, 0, 18, 106, 240, 0, 17, 105, 234, 0, 16, 106, 226,
+ 0, 12, 108, 212, 0, 14, 108, 197, 0, 17, 107, 184, 0, 21, 107, 166, 0, 23, 107, 153, 0, 18, 105, 140, 0, 22, 104, 120,
+ 0, 22, 102, 104, 0, 16, 105, 89, 0, 12, 104, 60, 0, 12, 105, 31, 0, 17, 104, 6, 0, 30, 95, 0, 0, 25, 95, 0,
+ 0, 19, 90, 241, 0, 20, 89, 236, 0, 18, 90, 228, 0, 13, 93, 215, 0, 13, 93, 202, 0, 15, 93, 189, 0, 17, 93, 176,
+ 0, 20, 93, 157, 0, 19, 90, 140, 0, 22, 91, 123, 0, 24, 89, 102, 0, 20, 89, 84, 0, 17, 89, 65, 0, 13, 90, 42,
+ 0, 18, 91, 10, 0, 29, 82, 0, 0, 25, 82, 0, 0, 20, 74, 243, 0, 21, 71, 237, 0, 20, 71, 230, 0, 18, 73, 222,
+ 0, 17, 75, 211, 0, 17, 76, 199, 0, 17, 76, 186, 0, 17, 78, 162, 0, 18, 75, 140, 0, 22, 75, 123, 0, 24, 75, 104,
+ 0, 26, 72, 82, 0, 29, 68, 56, 0, 23, 71, 45, 0, 25, 75, 23, 0, 26, 68, 2, 0, 24, 67, 0, 0, 21, 53, 244,
+ 0, 21, 49, 238, 0, 19, 49, 232, 0, 18, 49, 225, 0, 17, 50, 215, 0, 17, 52, 203, 0, 17, 55, 190, 0, 15, 60, 170,
+ 0, 16, 60, 149, 0, 17, 60, 131, 0, 20, 58, 106, 0, 24, 56, 86, 0, 32, 49, 60, 0, 26, 51, 45, 0, 24, 56, 28,
+ 0, 22, 54, 5, 0, 23, 47, 0, 0, 20, 32, 245, 2, 20, 26, 238, 2, 19, 25, 231, 1, 17, 25, 225, 0, 14, 26, 218,
+ 0, 12, 26, 207, 0, 13, 26, 195, 0, 16, 30, 179, 0, 19, 34, 157, 0, 15, 37, 140, 0, 17, 36, 116, 0, 20, 36, 93,
+ 0, 24, 34, 64, 0, 27, 34, 43, 0, 23, 37, 22, 0, 23, 32, 0, 0, 23, 28, 0, 0, 21, 15, 244, 0, 24, 11, 238,
+ 0, 23, 9, 231, 0, 22, 9, 224, 1, 19, 9, 215, 1, 18, 9, 204, 1, 18, 9, 193, 0, 19, 9, 181, 0, 22, 13, 164,
+ 0, 17, 17, 148, 0, 18, 17, 129, 0, 22, 17, 105, 0, 24, 17, 76, 0, 27, 17, 52, 0, 26, 14, 23, 0, 20, 14, 19,
+ 0, 22, 11, 0, 0, 34, 0, 236, 0, 32, 0, 234, 0, 30, 0, 230, 0, 28, 0, 225, 0, 26, 0, 217, 0, 25, 0, 206,
+ 0, 25, 0, 195, 0, 25, 0, 184, 0, 25, 0, 165, 0, 25, 0, 148, 0, 25, 0, 129, 0, 26, 0, 108, 0, 26, 0, 87,
+ 0, 25, 0, 63, 0, 24, 0, 40, 0, 22, 0, 23, 0, 21, 0, 0, 0, 0, 224, 233, 0, 0, 224, 229, 0, 0, 225, 224,
+ 0, 0, 226, 215, 0, 0, 225, 205, 0, 0, 226, 195, 0, 0, 227, 184, 0, 0, 227, 168, 0, 0, 228, 151, 0, 0, 229, 127,
+ 0, 0, 231, 100, 0, 0, 232, 76, 0, 0, 233, 54, 0, 0, 236, 34, 0, 0, 236, 17, 0, 0, 237, 7, 0, 0, 238, 0,
+ 0, 0, 217, 233, 0, 0, 216, 224, 0, 0, 217, 218, 0, 0, 217, 208, 0, 0, 217, 200, 0, 0, 216, 192, 0, 0, 217, 181,
+ 0, 0, 217, 167, 0, 0, 217, 151, 0, 0, 218, 129, 0, 0, 219, 104, 0, 0, 220, 84, 0, 0, 220, 66, 0, 0, 220, 50,
+ 0, 0, 220, 37, 0, 0, 221, 26, 0, 0, 221, 0, 0, 0, 207, 233, 0, 0, 207, 225, 0, 0, 206, 213, 0, 0, 206, 204,
+ 0, 0, 206, 196, 0, 0, 205, 189, 0, 0, 205, 180, 0, 0, 205, 165, 0, 0, 205, 151, 0, 0, 205, 131, 0, 0, 206, 108,
+ 0, 0, 206, 91, 0, 0, 206, 75, 0, 0, 206, 62, 0, 0, 205, 50, 0, 0, 205, 38, 0, 0, 206, 0, 0, 0, 197, 233,
+ 0, 0, 199, 227, 0, 0, 197, 216, 0, 0, 195, 201, 0, 0, 194, 193, 0, 0, 194, 187, 0, 0, 193, 177, 0, 0, 193, 164,
+ 0, 0, 193, 150, 0, 0, 194, 132, 0, 0, 195, 109, 0, 0, 195, 92, 0, 0, 195, 75, 0, 0, 195, 60, 0, 0, 195, 48,
+ 0, 0, 195, 36, 0, 0, 194, 0, 0, 0, 188, 233, 0, 0, 189, 229, 0, 0, 189, 219, 0, 0, 187, 204, 0, 0, 184, 191,
+ 0, 0, 184, 182, 0, 0, 184, 173, 0, 0, 184, 161, 0, 0, 184, 148, 0, 0, 184, 133, 0, 0, 186, 112, 0, 0, 186, 91,
+ 0, 0, 186, 71, 0, 0, 186, 54, 0, 0, 186, 43, 0, 0, 184, 33, 0, 0, 182, 0, 0, 0, 176, 233, 0, 0, 178, 230,
+ 0, 0, 178, 221, 0, 0, 177, 207, 0, 0, 175, 194, 0, 0, 173, 181, 0, 0, 173, 171, 0, 0, 172, 159, 0, 0, 172, 148,
+ 0, 0, 172, 135, 0, 0, 173, 114, 0, 0, 175, 93, 0, 0, 173, 70, 0, 0, 172, 50, 0, 0, 172, 38, 0, 0, 171, 28,
+ 0, 0, 167, 0, 0, 0, 163, 233, 0, 0, 166, 231, 0, 0, 166, 222, 0, 0, 165, 209, 0, 0, 164, 197, 0, 0, 163, 184,
+ 0, 0, 162, 170, 0, 0, 162, 158, 0, 0, 161, 149, 0, 0, 159, 137, 0, 0, 159, 118, 0, 0, 161, 97, 0, 0, 159, 72,
+ 0, 0, 158, 47, 0, 0, 157, 33, 0, 0, 156, 22, 0, 0, 153, 0, 0, 0, 151, 233, 0, 0, 153, 232, 0, 0, 154, 224,
+ 0, 0, 154, 212, 0, 0, 153, 199, 0, 0, 153, 189, 0, 0, 153, 175, 0, 0, 151, 157, 0, 0, 151, 149, 0, 0, 149, 137,
+ 0, 0, 147, 118, 0, 0, 147, 96, 0, 0, 145, 74, 0, 0, 144, 47, 0, 0, 143, 29, 0, 0, 141, 17, 0, 0, 140, 0,
+ 0, 0, 140, 233, 0, 0, 140, 230, 0, 0, 141, 224, 0, 0, 142, 215, 0, 0, 142, 201, 0, 0, 141, 189, 0, 0, 141, 176,
+ 0, 0, 141, 159, 0, 0, 139, 141, 0, 0, 138, 132, 0, 0, 136, 115, 0, 0, 133, 96, 0, 0, 130, 74, 0, 0, 129, 49,
+ 0, 0, 127, 29, 0, 0, 126, 14, 0, 0, 125, 0, 0, 0, 125, 233, 0, 0, 125, 229, 0, 0, 126, 225, 0, 0, 129, 216,
+ 0, 0, 130, 202, 0, 0, 127, 189, 0, 0, 123, 168, 0, 0, 121, 151, 0, 0, 122, 137, 0, 0, 127, 126, 0, 0, 123, 112,
+ 0, 0, 122, 99, 0, 0, 118, 75, 0, 0, 115, 51, 0, 0, 114, 30, 0, 0, 113, 13, 0, 0, 110, 0, 0, 0, 106, 233,
+ 0, 0, 106, 228, 0, 0, 108, 224, 0, 0, 110, 216, 0, 0, 112, 202, 0, 0, 109, 184, 0, 0, 100, 151, 0, 0, 100, 141,
+ 0, 0, 108, 137, 0, 0, 104, 114, 0, 0, 100, 96, 0, 0, 106, 93, 0, 0, 104, 74, 0, 0, 102, 51, 0, 0, 102, 29,
+ 0, 0, 100, 12, 0, 0, 100, 0, 0, 0, 90, 233, 0, 0, 90, 229, 0, 0, 92, 224, 0, 0, 93, 216, 0, 0, 97, 205,
+ 0, 0, 97, 189, 0, 0, 95, 170, 0, 0, 94, 151, 0, 0, 93, 134, 0, 0, 93, 120, 0, 0, 87, 95, 0, 0, 89, 82,
+ 0, 0, 91, 74, 0, 0, 90, 55, 0, 0, 89, 30, 0, 0, 88, 12, 0, 0, 87, 0, 0, 0, 73, 233, 0, 0, 73, 230,
+ 0, 0, 74, 225, 0, 0, 76, 218, 0, 0, 80, 208, 0, 0, 80, 195, 0, 0, 82, 180, 0, 0, 82, 158, 0, 0, 80, 138,
+ 0, 0, 78, 119, 0, 0, 75, 99, 0, 0, 69, 75, 0, 0, 69, 61, 0, 0, 75, 50, 0, 0, 75, 29, 0, 0, 75, 13,
+ 0, 0, 74, 0, 0, 0, 53, 233, 0, 0, 54, 231, 0, 0, 55, 227, 0, 0, 58, 222, 0, 0, 60, 214, 0, 0, 62, 201,
+ 0, 0, 62, 187, 0, 0, 64, 164, 0, 0, 63, 144, 0, 0, 64, 126, 0, 0, 57, 98, 0, 0, 57, 80, 0, 0, 50, 55,
+ 0, 0, 54, 43, 0, 0, 57, 31, 0, 0, 57, 18, 0, 0, 56, 0, 0, 0, 34, 233, 0, 0, 34, 232, 0, 0, 35, 228,
+ 0, 0, 36, 223, 0, 0, 37, 215, 0, 0, 39, 204, 0, 0, 39, 191, 0, 0, 40, 173, 0, 0, 41, 153, 0, 0, 44, 129,
+ 0, 0, 43, 107, 0, 0, 39, 86, 0, 0, 36, 61, 0, 0, 31, 38, 0, 0, 35, 24, 0, 0, 38, 17, 0, 0, 37, 0,
+ 0, 0, 16, 233, 0, 0, 16, 232, 0, 0, 16, 229, 0, 0, 17, 224, 0, 0, 18, 216, 0, 0, 19, 204, 0, 0, 19, 191,
+ 0, 0, 18, 175, 0, 0, 19, 154, 0, 0, 21, 129, 0, 0, 20, 109, 0, 0, 19, 93, 0, 0, 19, 75, 0, 0, 18, 49,
+ 0, 0, 18, 23, 0, 0, 17, 11, 0, 0, 18, 0, 0, 0, 0, 234, 0, 0, 0, 230, 0, 0, 0, 226, 0, 0, 0, 221,
+ 0, 0, 0, 213, 0, 0, 0, 202, 0, 0, 0, 192, 0, 0, 0, 179, 0, 0, 0, 163, 0, 0, 0, 147, 0, 0, 0, 130,
+ 0, 0, 0, 106, 0, 0, 0, 84, 0, 0, 0, 56, 0, 0, 0, 29, 0, 0, 0, 14, 0, 0, 0, 0
+};
+
diff --git a/prnt/hpcups/dj4100PrintModes.h b/prnt/hpcups/dj4100PrintModes.h
new file mode 100644
index 0000000..01ebc85
--- /dev/null
+++ b/prnt/hpcups/dj4100PrintModes.h
@@ -0,0 +1,103 @@
+PrintMode dj4100PrintModes[] =
+{
+ // Both pens - Plain/Draft
+ {
+ "PlainDraftKColor",
+ {600, 600, 600, 600, 600, 600},
+ {600, 600, 600, 600, 600, 600},
+ {1, 1, 1, 1, 1, 1}, 4, FED,
+ {ulMapDJ3320_KCMY_3x3x1, NULL, NULL},
+ 600, 600, false, HTBinary_open, HTBinary_open
+ },
+ // Both Pens - Plain/Normal Color
+ {
+ "PlainNormalKColor",
+ {600, 600, 600, 600, 600, 600},
+ {600, 600, 600, 600, 600, 600},
+ {1, 1, 1, 1, 1, 1}, 4, FED,
+ {NULL, NULL, ucMapDJ4100_KCMY_6x6x1},
+ 600, 600, false, HTBinary_open, HTBinary_open
+ },
+ // Both pens or Color pen only- photo paper/best
+ {
+ "PhotoBest",
+ {600, 600, 600, 600, 600, 600},
+ {600, 600, 600, 600, 600, 600},
+ {1, 2, 2, 2, 2, 2}, 4, FED,
+ {NULL, NULL, ucMapDJ4100_KCMY_Photo_BestA_12x12x1},
+ 600, 600, false, HTBinary_open, HT1200x1200x1PhotoBest_open
+ },
+ // color pen only - Plain/Draft
+ {
+ "PlainDraftColor",
+ {600, 600, 600, 600, 600, 600},
+ {600, 600, 600, 600, 600, 600},
+ {1, 1, 1, 1, 1, 1}, 3, FED,
+ {ulMapDJ3320_CMY_3x3x1, NULL, NULL},
+ 600, 600, false, HTBinary_open, HTBinary_open
+ },
+ // Color Pen only - Plain/Normal Color
+ {
+ "PlainNormalColor",
+ {600, 600, 600, 600, 600, 600},
+ {600, 600, 600, 600, 600, 600},
+ {1, 1, 1, 1, 1, 1}, 3, FED,
+ {ulMapDJ3320_CMY_6x6x1, NULL, NULL},
+ 600, 600, false, HTBinary_open, HTBinary_open
+ },
+ // Black pen only or both pens - Plain/Draft
+ {
+ "PlainDraftGrayK",
+ {600, 600, 600, 600, 600, 600},
+ {600, 600, 600, 600, 600, 600},
+ {1, 1, 1, 1, 1, 1}, 1, FED,
+ {ulMapDJ3320_K_3x3x1, NULL, NULL},
+ 600, 600, false, HTBinary_open, HTBinary_open
+ },
+ // Black pen only or Photo Pen only or both pens - Plain/Normal Gray
+ {
+ "PlainNormalGrayK",
+ {600, 600, 600, 600, 600, 600},
+ {600, 600, 600, 600, 600, 600},
+ {1, 1, 1, 1, 1, 1}, 1, FED,
+ {ulMapDJ3320_K_6x6x1, NULL, NULL},
+ 600, 600, false, HTBinary_open, HTBinary_open
+ },
+ // Color and Photo pen - Plain/Normal - Gray
+ {
+ "PlainNormalPhotoGrayK",
+ {600, 600, 600, 600, 600, 600},
+ {600, 600, 600, 600, 600, 600},
+ {1, 1, 1, 1, 1, 1}, 1, FED,
+ {ulMapDJ3320_K_6x6x1, ulMapDJ3600_ClMlxx_6x6x1, NULL},
+ 600, 600, false, HTBinary_open, HTBinary_open
+ },
+ // Color and Photo pen - Plain/Draft - color
+ {
+ "PlainDraftPhotoColor",
+ {600, 600, 600, 600, 600, 600},
+ {600, 600, 600, 600, 600, 600},
+ {1, 1, 1, 1, 1, 1}, 6, FED,
+ {ulMapDJ3320_KCMY_3x3x1, ulMapDJ3600_ClMlxx_3x3x1, NULL},
+ 600, 600, false, HTBinary_open, HTBinary_open
+ },
+ // Color and Photo pen - Plain/Normal - color
+ {
+ "PlainNormalPhotoColor",
+ {600, 600, 600, 600, 600, 600},
+ {600, 600, 600, 600, 600, 600},
+ {1, 1, 1, 1, 1, 1}, 6, FED,
+ {ulMapDJ3320_K_6x6x1, ulMapDJ3600_ClMlxx_6x6x1, NULL},
+ 600, 600, false, HTBinary_open, HTBinary_open
+ },
+ // Color and Photo pen - photo/best - color
+ {
+ "PhotoBestPhotoColor",
+ {600, 600, 600, 600, 600, 600},
+ {600, 600, 600, 600, 600, 600},
+ {2, 2, 2, 2, 2, 2}, 6, FED,
+ {ulMapDJ3600_KCMY_6x6x2, ulMapDJ3600_ClMlxx_6x6x2, NULL},
+ 600, 600, false, HTBinary_open, HTBinary_open
+ }
+};
+
diff --git a/prnt/hpcups/dj540PrintModes.h b/prnt/hpcups/dj540PrintModes.h
new file mode 100644
index 0000000..aaabf72
--- /dev/null
+++ b/prnt/hpcups/dj540PrintModes.h
@@ -0,0 +1,36 @@
+PrintMode dj540PrintModes[] =
+{
+ {
+ "PlainDraftColor",
+ {300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300},
+ {1, 1, 1, 1, 1, 1}, 3, FED,
+ {ulMapDJ600_CCM_CMY, NULL, NULL},
+ 300, 300, false, HTBinary_open, HTBinary_open
+ },
+ {
+ "PlainDraftGrayK",
+ {300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300},
+ {1, 1, 1, 1, 1, 1}, 1, FED,
+ {ulMapDJ600_CCM_K, NULL, NULL},
+ 300, 300, false, HTBinary_open, HTBinary_open
+ },
+ {
+ "PlainNormalColor",
+ {300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300},
+ {1, 1, 1, 1, 1, 1}, 3, FED,
+ {ulMapDJ600_CCM_CMY, NULL, NULL},
+ 300, 300, false, HTBinary_open, HTBinary_open
+ },
+ {
+ "PlainNormalGrayK",
+ {300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300},
+ {1, 1, 1, 1, 1, 1}, 1, FED,
+ {ulMapDJ600_CCM_K, NULL, NULL},
+ 300, 300, false, HTBinary_open, HTBinary_open
+ }
+};
+
diff --git a/prnt/hpcups/dj600ColorMaps.cpp b/prnt/hpcups/dj600ColorMaps.cpp
new file mode 100644
index 0000000..91b7cf9
--- /dev/null
+++ b/prnt/hpcups/dj600ColorMaps.cpp
@@ -0,0 +1,542 @@
+/*****************************************************************************\
+ dj600ColorMaps.cpp : Color maps for the DJ600
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#include "CommonDefinitions.h"
+
+uint32_t ulMapDJ600_CCM_K[ 9 * 9 * 9 ]=
+// DJ600_CCM_K
+ {
+ 226UL, 137UL, 135UL, 132UL, 128UL, 122UL, 111UL, 98UL, 90UL,
+ 133UL, 133UL, 132UL, 130UL, 125UL, 118UL, 107UL, 96UL, 88UL,
+ 120UL, 120UL, 118UL, 114UL, 109UL, 101UL, 95UL, 88UL, 80UL,
+ 92UL, 92UL, 91UL, 89UL, 87UL, 83UL, 79UL, 73UL, 69UL,
+ 69UL, 69UL, 69UL, 68UL, 67UL, 66UL, 63UL, 61UL, 59UL,
+ 55UL, 55UL, 55UL, 55UL, 54UL, 53UL, 51UL, 49UL, 47UL,
+ 41UL, 41UL, 40UL, 40UL, 39UL, 38UL, 37UL, 35UL, 33UL,
+ 25UL, 25UL, 25UL, 25UL, 24UL, 23UL, 22UL, 21UL, 19UL,
+ 11UL, 11UL, 11UL, 11UL, 11UL, 10UL, 10UL, 10UL, 9UL,
+ 136UL, 136UL, 134UL, 132UL, 127UL, 121UL, 110UL, 98UL, 90UL,
+ 132UL, 132UL, 132UL, 129UL, 124UL, 116UL, 106UL, 95UL, 88UL,
+ 119UL, 118UL, 116UL, 113UL, 107UL, 100UL, 94UL, 88UL, 80UL,
+ 92UL, 91UL, 90UL, 89UL, 87UL, 83UL, 78UL, 73UL, 68UL,
+ 69UL, 69UL, 69UL, 68UL, 67UL, 66UL, 63UL, 61UL, 58UL,
+ 55UL, 55UL, 55UL, 54UL, 54UL, 53UL, 51UL, 49UL, 47UL,
+ 40UL, 40UL, 40UL, 40UL, 39UL, 38UL, 36UL, 35UL, 33UL,
+ 25UL, 25UL, 25UL, 24UL, 23UL, 23UL, 22UL, 21UL, 19UL,
+ 11UL, 11UL, 11UL, 11UL, 10UL, 10UL, 10UL, 10UL, 9UL,
+ 132UL, 132UL, 131UL, 128UL, 124UL, 115UL, 105UL, 95UL, 88UL,
+ 129UL, 129UL, 127UL, 124UL, 120UL, 112UL, 101UL, 94UL, 86UL,
+ 114UL, 113UL, 112UL, 108UL, 103UL, 96UL, 92UL, 86UL, 78UL,
+ 89UL, 89UL, 88UL, 87UL, 84UL, 80UL, 76UL, 72UL, 67UL,
+ 68UL, 68UL, 68UL, 67UL, 66UL, 64UL, 62UL, 60UL, 58UL,
+ 55UL, 55UL, 54UL, 54UL, 53UL, 52UL, 50UL, 48UL, 46UL,
+ 40UL, 40UL, 40UL, 39UL, 39UL, 37UL, 36UL, 34UL, 33UL,
+ 25UL, 25UL, 24UL, 23UL, 23UL, 22UL, 21UL, 20UL, 19UL,
+ 11UL, 11UL, 11UL, 11UL, 10UL, 10UL, 10UL, 10UL, 9UL,
+ 124UL, 124UL, 123UL, 119UL, 113UL, 105UL, 97UL, 90UL, 83UL,
+ 121UL, 120UL, 118UL, 114UL, 109UL, 102UL, 95UL, 88UL, 81UL,
+ 104UL, 103UL, 102UL, 98UL, 95UL, 92UL, 87UL, 80UL, 74UL,
+ 84UL, 84UL, 83UL, 82UL, 80UL, 76UL, 73UL, 69UL, 66UL,
+ 66UL, 66UL, 66UL, 65UL, 64UL, 62UL, 61UL, 59UL, 56UL,
+ 53UL, 53UL, 53UL, 52UL, 52UL, 50UL, 49UL, 47UL, 45UL,
+ 39UL, 39UL, 38UL, 37UL, 37UL, 36UL, 35UL, 33UL, 31UL,
+ 23UL, 23UL, 23UL, 23UL, 22UL, 21UL, 20UL, 19UL, 18UL,
+ 10UL, 10UL, 10UL, 10UL, 10UL, 10UL, 10UL, 9UL, 9UL,
+ 108UL, 107UL, 105UL, 103UL, 98UL, 94UL, 88UL, 83UL, 76UL,
+ 104UL, 104UL, 102UL, 99UL, 95UL, 92UL, 87UL, 81UL, 74UL,
+ 93UL, 93UL, 92UL, 90UL, 88UL, 84UL, 80UL, 74UL, 69UL,
+ 77UL, 77UL, 76UL, 75UL, 73UL, 71UL, 68UL, 66UL, 62UL,
+ 63UL, 63UL, 62UL, 62UL, 61UL, 60UL, 58UL, 56UL, 54UL,
+ 51UL, 50UL, 50UL, 50UL, 49UL, 48UL, 47UL, 45UL, 43UL,
+ 36UL, 36UL, 36UL, 36UL, 35UL, 34UL, 33UL, 31UL, 29UL,
+ 22UL, 22UL, 21UL, 21UL, 21UL, 20UL, 19UL, 18UL, 16UL,
+ 10UL, 10UL, 10UL, 10UL, 10UL, 10UL, 9UL, 9UL, 9UL,
+ 92UL, 92UL, 91UL, 89UL, 87UL, 83UL, 79UL, 73UL, 69UL,
+ 90UL, 89UL, 89UL, 88UL, 85UL, 81UL, 77UL, 72UL, 68UL,
+ 82UL, 82UL, 81UL, 80UL, 77UL, 74UL, 71UL, 68UL, 64UL,
+ 69UL, 69UL, 69UL, 68UL, 67UL, 66UL, 63UL, 61UL, 59UL,
+ 59UL, 59UL, 59UL, 58UL, 57UL, 56UL, 54UL, 53UL, 50UL,
+ 48UL, 48UL, 47UL, 47UL, 46UL, 45UL, 43UL, 41UL, 39UL,
+ 34UL, 34UL, 33UL, 33UL, 32UL, 31UL, 30UL, 28UL, 27UL,
+ 20UL, 20UL, 19UL, 19UL, 19UL, 18UL, 17UL, 16UL, 14UL,
+ 10UL, 9UL, 9UL, 9UL, 9UL, 9UL, 9UL, 9UL, 8UL,
+ 78UL, 78UL, 77UL, 75UL, 73UL, 71UL, 68UL, 66UL, 62UL,
+ 76UL, 76UL, 75UL, 74UL, 73UL, 70UL, 68UL, 65UL, 62UL,
+ 70UL, 70UL, 70UL, 69UL, 68UL, 66UL, 64UL, 62UL, 59UL,
+ 63UL, 63UL, 63UL, 62UL, 61UL, 60UL, 58UL, 56UL, 54UL,
+ 54UL, 54UL, 54UL, 53UL, 53UL, 52UL, 50UL, 48UL, 46UL,
+ 43UL, 43UL, 43UL, 42UL, 41UL, 40UL, 39UL, 37UL, 35UL,
+ 30UL, 30UL, 30UL, 29UL, 29UL, 28UL, 27UL, 25UL, 23UL,
+ 17UL, 17UL, 16UL, 16UL, 16UL, 15UL, 14UL, 13UL, 11UL,
+ 9UL, 9UL, 9UL, 9UL, 9UL, 8UL, 8UL, 7UL, 7UL,
+ 66UL, 66UL, 66UL, 65UL, 64UL, 63UL, 61UL, 59UL, 56UL,
+ 66UL, 66UL, 65UL, 64UL, 63UL, 62UL, 60UL, 58UL, 55UL,
+ 62UL, 62UL, 62UL, 61UL, 60UL, 59UL, 58UL, 55UL, 53UL,
+ 56UL, 56UL, 56UL, 56UL, 55UL, 54UL, 52UL, 50UL, 48UL,
+ 49UL, 49UL, 48UL, 48UL, 47UL, 46UL, 44UL, 43UL, 40UL,
+ 37UL, 37UL, 37UL, 37UL, 36UL, 35UL, 34UL, 33UL, 30UL,
+ 26UL, 26UL, 25UL, 25UL, 25UL, 23UL, 22UL, 21UL, 20UL,
+ 13UL, 13UL, 13UL, 12UL, 12UL, 11UL, 11UL, 11UL, 10UL,
+ 7UL, 7UL, 7UL, 7UL, 7UL, 7UL, 7UL, 7UL, 6UL,
+ 58UL, 58UL, 58UL, 57UL, 56UL, 55UL, 53UL, 52UL, 49UL,
+ 58UL, 57UL, 57UL, 56UL, 55UL, 54UL, 53UL, 51UL, 49UL,
+ 55UL, 55UL, 54UL, 54UL, 53UL, 52UL, 50UL, 49UL, 46UL,
+ 50UL, 50UL, 49UL, 49UL, 48UL, 47UL, 45UL, 44UL, 41UL,
+ 42UL, 42UL, 41UL, 41UL, 40UL, 39UL, 38UL, 36UL, 34UL,
+ 32UL, 32UL, 31UL, 31UL, 30UL, 30UL, 28UL, 27UL, 25UL,
+ 21UL, 21UL, 21UL, 20UL, 20UL, 19UL, 18UL, 17UL, 15UL,
+ 10UL, 10UL, 10UL, 10UL, 10UL, 10UL, 10UL, 9UL, 9UL,
+ 6UL, 6UL, 6UL, 6UL, 6UL, 6UL, 6UL, 6UL, 0
+ };
+uint32_t ulMapDJ600_CCM_CMY[ 9 * 9 * 9 ]=
+ // DJ600_CCM_CMY
+ {
+ 3789676800UL, 2159472384UL, 1369304832UL, 831057920UL, 443871744UL, 191099648UL, 39120640UL, 4910336UL, 4585216UL,
+ 3699167488UL, 2137910016UL, 1332802048UL, 761852160UL, 408810240UL, 156103424UL, 21295104UL, 4253440UL, 3929600UL,
+ 3494949376UL, 2403977216UL, 1313134080UL, 725868032UL, 373351936UL, 138080256UL, 20313344UL, 3468032UL, 3339008UL,
+ 3308362240UL, 2486086656UL, 1479195392UL, 723895552UL, 371774208UL, 170517248UL, 36236288UL, 2746112UL, 2747904UL,
+ 3206385408UL, 2417728256UL, 1645915136UL, 957921280UL, 471253760UL, 219795200UL, 52158464UL, 2024704UL, 2222592UL,
+ 3138358784UL, 2416875520UL, 1745725184UL, 1124971008UL, 655080192UL, 286049024UL, 101634816UL, 1237504UL, 1632256UL,
+ 3087372544UL, 2432997888UL, 1812244736UL, 1241755904UL, 805550592UL, 436453120UL, 151243264UL, 17291520UL, 1106432UL,
+ 2952827392UL, 2348848384UL, 1811980544UL, 1291888128UL, 939569152UL, 587248896UL, 302038016UL, 67225856UL, 579584UL,
+ 2835387136UL, 2332071936UL, 1828756992UL, 1358995968UL, 1023452928UL, 738242304UL, 469808896UL, 218153216UL, 53248UL,
+ 4092890368UL, 3118959616UL, 1893638400UL, 1104588544UL, 499235328UL, 178898688UL, 26462464UL, 8503296UL, 7259136UL,
+ 4001661696UL, 2155905024UL, 1670552320UL, 1066312192UL, 612410368UL, 292463872UL, 90351360UL, 5743360UL, 5354752UL,
+ 3612442112UL, 2472181504UL, 1616546048UL, 1029477120UL, 626563072UL, 323984640UL, 105292544UL, 4301568UL, 4239616UL,
+ 3459346944UL, 2520282624UL, 1731755264UL, 1010271744UL, 607751680UL, 339384064UL, 137797632UL, 3449856UL, 3453440UL,
+ 3273419264UL, 2468507392UL, 1814263808UL, 1176796672UL, 656704256UL, 371756288UL, 170432768UL, 19374592UL, 2798336UL,
+ 3272567808UL, 2467524352UL, 1846834688UL, 1293253120UL, 806780672UL, 404193536UL, 186224128UL, 52140800UL, 2011904UL,
+ 3271913216UL, 2449960704UL, 1862759424UL, 1376352768UL, 940211968UL, 537690624UL, 218924032UL, 51418112UL, 1355264UL,
+ 3170923264UL, 2365616128UL, 1845523200UL, 1409317632UL, 1023508736UL, 671319296UL, 352552448UL, 84249600UL, 698112UL,
+ 3036707328UL, 2365617408UL, 1879078912UL, 1476427264UL, 1124107264UL, 822119680UL, 520131072UL, 251696384UL, 40448UL,
+ 3991889152UL, 3304284928UL, 2280153856UL, 1407741184UL, 736064768UL, 231570688UL, 12618240UL, 11374080UL, 9539072UL,
+ 3952630272UL, 2627495168UL, 1905878784UL, 1285254656UL, 747859968UL, 344354560UL, 108754176UL, 7437056UL, 7112704UL,
+ 3679670272UL, 2472499712UL, 1616928768UL, 1164404992UL, 727936000UL, 391998720UL, 139817728UL, 5208064UL, 5276416UL,
+ 3660795136UL, 2570737408UL, 1832803072UL, 1144872960UL, 725575424UL, 423652352UL, 171864576UL, 3962880UL, 4096768UL,
+ 3558689024UL, 2586072320UL, 1931958528UL, 1327979264UL, 791175424UL, 439052288UL, 187461376UL, 19691008UL, 3310336UL,
+ 3507505920UL, 2601801216UL, 1964333568UL, 1444371456UL, 924344320UL, 505045504UL, 236742912UL, 52392448UL, 2457856UL,
+ 3523629056UL, 2617857536UL, 1963481600UL, 1477074176UL, 1040933120UL, 621634304UL, 286156288UL, 85093888UL, 1605376UL,
+ 3439351040UL, 2566936832UL, 1895848192UL, 1476418560UL, 1107321088UL, 738288896UL, 385967616UL, 134572544UL, 752640UL,
+ 3254804480UL, 2483052288UL, 1929403904UL, 1560305664UL, 1224762624UL, 905996544UL, 570452992UL, 285241088UL, 30720UL,
+ 3924050432UL, 3203088384UL, 2229485568UL, 1305885696UL, 701841920UL, 265570304UL, 30233088UL, 12475392UL, 11428608UL,
+ 3969464832UL, 2745255168UL, 2057455872UL, 1335576576UL, 815483648UL, 412503040UL, 126767616UL, 8673536UL, 8479488UL,
+ 3848025344UL, 2657632256UL, 1852655616UL, 1248676352UL, 812535296UL, 443109120UL, 157504000UL, 6182912UL, 6185472UL,
+ 3711053824UL, 2537175296UL, 1849769984UL, 1145324544UL, 793266688UL, 474435328UL, 189092608UL, 4479232UL, 4612864UL,
+ 3659280384UL, 2602842624UL, 1982414848UL, 1395343872UL, 841762304UL, 506350336UL, 221270016UL, 19945472UL, 3564288UL,
+ 3675271936UL, 2652191744UL, 2065121792UL, 1494762496UL, 1008289280UL, 572213248UL, 270421248UL, 69293568UL, 2647040UL,
+ 3708237312UL, 2752134912UL, 2081047552UL, 1544176896UL, 1108035584UL, 688670976UL, 353258240UL, 101864192UL, 1664000UL,
+ 3724622848UL, 2751546112UL, 2063615744UL, 1543522048UL, 1157646336UL, 805390848UL, 436292608UL, 168054784UL, 680960UL,
+ 3422569728UL, 2617264384UL, 2030062336UL, 1610632192UL, 1258310656UL, 956321536UL, 637554688UL, 335565568UL, 23552UL,
+ 3956942848UL, 3118802688UL, 2145593088UL, 1322853632UL, 718414848UL, 299182336UL, 30683136UL, 12990976UL, 12402944UL,
+ 4019397376UL, 2795384064UL, 2074488832UL, 1419718656UL, 848965632UL, 463221504UL, 161035776UL, 9321472UL, 9323776UL,
+ 3999211264UL, 2792106496UL, 1987326208UL, 1366504192UL, 846279936UL, 477312768UL, 175061504UL, 6897152UL, 6965248UL,
+ 3895991296UL, 2722244352UL, 2018192896UL, 1330459136UL, 843985920UL, 508573952UL, 223230976UL, 4931584UL, 5130240UL,
+ 3659275008UL, 2636522752UL, 2032937728UL, 1395601152UL, 808464384UL, 540292608UL, 271923712UL, 20332544UL, 3819520UL,
+ 3658555136UL, 2736203520UL, 2132422144UL, 1545286144UL, 1025258496UL, 605893888UL, 304101632UL, 69353472UL, 2705664UL,
+ 3775406848UL, 2869701376UL, 2181902592UL, 1628255232UL, 1141716480UL, 739128832UL, 370096128UL, 101858816UL, 1722880UL,
+ 3858835456UL, 2936221696UL, 2181116672UL, 1644246784UL, 1191261952UL, 838940672UL, 486684928UL, 184826880UL, 674304UL,
+ 3623890688UL, 2818585856UL, 2147498496UL, 1660960000UL, 1275083776UL, 973093888UL, 671104512UL, 369115136UL, 17920UL,
+ 3956413952UL, 3034584320UL, 2078414080UL, 1339954432UL, 785847296UL, 349508352UL, 47585280UL, 13443584UL, 12986624UL,
+ 4002288640UL, 2845382912UL, 2090998784UL, 1486888192UL, 949820672UL, 479927552UL, 161226752UL, 9774336UL, 9776896UL,
+ 4015853824UL, 2960005632UL, 2071272704UL, 1467424512UL, 947265792UL, 494215680UL, 192291840UL, 7415552UL, 7549696UL,
+ 3996848128UL, 2907248896UL, 2152799488UL, 1448354304UL, 945169408UL, 542516736UL, 240592896UL, 22358784UL, 5649408UL,
+ 3810660352UL, 2838370048UL, 2201230336UL, 1513562112UL, 943203328UL, 557458944UL, 289220608UL, 37563392UL, 4142080UL,
+ 3759280384UL, 2769819392UL, 2166103040UL, 1545412096UL, 1008673280UL, 572662272UL, 321201664UL, 86387456UL, 2896896UL,
+ 3808957696UL, 2920094208UL, 2265915136UL, 1678713344UL, 1141842944UL, 739255296UL, 386999552UL, 135538944UL, 1782784UL,
+ 3942717440UL, 3036945920UL, 2315592192UL, 1728325120UL, 1208100352UL, 855778816UL, 520365824UL, 218442240UL, 668672UL,
+ 3841990400UL, 3003130880UL, 2281711616UL, 1728064512UL, 1308634624UL, 989867520UL, 671100160UL, 385887744UL, 13056UL,
+ 3939174656UL, 3034580992UL, 2095319040UL, 1407518720UL, 870254592UL, 416941824UL, 81200640UL, 13570304UL, 13441536UL,
+ 4001957888UL, 2861960448UL, 2107576064UL, 1537412864UL, 1017253632UL, 580914944UL, 194842368UL, 10163456UL, 10231296UL,
+ 4015720448UL, 3010268672UL, 2104823808UL, 1517949184UL, 1048187136UL, 595137024UL, 225972992UL, 7739136UL, 7872768UL,
+ 4013754112UL, 3075149312UL, 2253721600UL, 1549406976UL, 1046156288UL, 609948928UL, 257693184UL, 22812928UL, 6169088UL,
+ 3978758144UL, 3073576192UL, 2335838208UL, 1597903616UL, 1044256256UL, 608179968UL, 289478656UL, 37951744UL, 4596480UL,
+ 3944089600UL, 3038579968UL, 2334396416UL, 1663439360UL, 1076302848UL, 640161536UL, 321525760UL, 86776576UL, 3219968UL,
+ 3909683200UL, 3020819712UL, 2349994240UL, 1712526080UL, 1158878208UL, 722736384UL, 370546176UL, 135862784UL, 1974784UL,
+ 3993046272UL, 3104117248UL, 2433160192UL, 1795560960UL, 1275468032UL, 872814848UL, 520558848UL, 218634752UL, 794624UL,
+ 3959427840UL, 3154122240UL, 2415925248UL, 1828723712UL, 1342185216UL, 1006641152UL, 687873792UL, 385883904UL, 8704UL,
+ 3972661760UL, 3084779520UL, 2196045824UL, 1524957184UL, 1021444096UL, 601882624UL, 249364480UL, 47579904UL, 13831168UL,
+ 4018667520UL, 2945909760UL, 2208498944UL, 1655244032UL, 1152058624UL, 732693760UL, 329778432UL, 44303872UL, 10686208UL,
+ 4032561152UL, 3094086656UL, 2239169792UL, 1669334272UL, 1182991872UL, 746718720UL, 360711936UL, 41814272UL, 8065536UL,
+ 4030726144UL, 3226338304UL, 2388198912UL, 1667172096UL, 1164117760UL, 744818688UL, 375719936UL, 40110592UL, 6492928UL,
+ 4029350144UL, 3275162880UL, 2453603840UL, 1749288704UL, 1145374976UL, 726075904UL, 357042688UL, 55118592UL, 4985856UL,
+ 4011524352UL, 3273852160UL, 2519270912UL, 1798047744UL, 1194264576UL, 724503040UL, 372312576UL, 87166208UL, 3609600UL,
+ 4010672384UL, 3272869120UL, 2568488960UL, 1880754176UL, 1260062976UL, 807078400UL, 421202688UL, 119409920UL, 2298624UL,
+ 4026729216UL, 3255240192UL, 2550728704UL, 1913260288UL, 1326057984UL, 889784832UL, 503974400UL, 185273088UL, 1052928UL,
+ 4009756928UL, 3288336896UL, 2583694080UL, 1962937600UL, 1459621632UL, 1056968960UL, 704647680UL, 369103104UL, 4608UL,
+ 4040097792UL, 3236167680UL, 2465136640UL, 1827536896UL, 1307246592UL, 904396800UL, 551878656UL, 266403840UL, 14221312UL,
+ 4035969024UL, 3366453248UL, 2579103744UL, 1891631104UL, 1354956800UL, 952172544UL, 566034432UL, 263651328UL, 11141120UL,
+ 4033019904UL, 3396730880UL, 2592473088UL, 1905328128UL, 1402404864UL, 999751680UL, 580255744UL, 261160960UL, 8716288UL,
+ 4031184896UL, 3461611520UL, 2657222656UL, 1936457728UL, 1383071744UL, 980615168UL, 561250304UL, 225574912UL, 6946816UL,
+ 4029874176UL, 3527147520UL, 2739273728UL, 2051932160UL, 1397751808UL, 945029120UL, 542441472UL, 206897152UL, 5505024UL,
+ 4028891136UL, 3609788416UL, 2855272448UL, 2151022592UL, 1429864448UL, 943390720UL, 524025856UL, 188547072UL, 4063232UL,
+ 4028039168UL, 3743023104UL, 3055484928UL, 2283929600UL, 1545863168UL, 1009057792UL, 539230208UL, 203751424UL, 2752512UL,
+ 4027252736UL, 3792502784UL, 3155099648UL, 2400190464UL, 1729232896UL, 1142030336UL, 655491072UL, 252837888UL, 1376256UL,
+ 4026531840UL, 3573547008UL, 2952790016UL, 2281701376UL, 1694498816UL, 1191182336UL, 754974720UL, 369098752UL, 0
+ };
+
+uint32_t ulMapDJ660_CCM_KCMY[ 9 * 9 * 9 ]=
+ {
+ 422720226UL, 142187374UL, 94354238UL, 62442785UL, 45668877UL, 27648516UL, 8972032UL, 7335680UL, 5895424UL,
+2519110233UL, 807846483UL, 391693109UL, 260029471UL, 143570703UL, 42776580UL, 8501760UL, 7782400UL, 6539520UL,
+3072173868UL, 1881129514UL, 841465387UL, 524792087UL, 358391818UL, 174364420UL, 40408577UL, 6920704UL, 6530560UL,
+3407591425UL, 2551891200UL, 1612695808UL, 824489479UL, 506699268UL, 306153730UL, 105283329UL, 5144320UL, 5737216UL,
+3289364224UL, 2584592128UL, 1829749504UL, 1142143232UL, 639280640UL, 405048832UL, 204241920UL, 53835264UL, 4290816UL,
+2970005760UL, 2449717248UL, 1862580992UL, 1325905408UL, 856467712UL, 487757568UL, 270041856UL, 119436800UL, 2650624UL,
+2583865856UL, 2214636288UL, 1811983360UL, 1392618240UL, 973382656UL, 621320448UL, 336235520UL, 152010496UL, 1405952UL,
+2197856768UL, 1996530176UL, 1711316992UL, 1375772160UL, 1040226048UL, 721654784UL, 436506368UL, 184846592UL, 622592UL,
+1879088896UL, 1778424576UL, 1593874176UL, 1342214912UL, 1073778688UL, 788565504UL, 536907264UL, 268472320UL, 37120UL,
+2191458944UL, 130097257UL, 63659581UL, 30835745UL, 30318351UL, 28684549UL, 9946880UL, 8574976UL, 7855360UL,
+2351640941UL, 1230197602UL, 763002927UL, 394890269UL, 193893645UL, 59415555UL, 8365312UL, 7515392UL, 6534656UL,
+2938266166UL, 2184740132UL, 1212123679UL, 760318735UL, 459048710UL, 173835267UL, 22906624UL, 6065408UL, 5544192UL,
+3273752070UL, 2552530688UL, 1730711808UL, 1043106817UL, 641040129UL, 373061120UL, 104886784UL, 4355584UL, 4489984UL,
+3155526144UL, 2501084160UL, 1846774528UL, 1242990592UL, 807173632UL, 488796928UL, 220555776UL, 53111296UL, 3305728UL,
+2970190592UL, 2399567872UL, 1829078016UL, 1342538496UL, 940211456UL, 588280832UL, 286354176UL, 102065408UL, 1992448UL,
+2802024960UL, 2231400192UL, 1795192832UL, 1375762944UL, 1023440896UL, 721712640UL, 436629248UL, 168257792UL, 813056UL,
+2583724288UL, 2097182464UL, 1744860672UL, 1409316864UL, 1124104448UL, 822113792UL, 520122624UL, 251686400UL, 225024UL,
+2315289088UL, 1996520960UL, 1694530816UL, 1392540928UL, 1124105216UL, 872446720UL, 620787968UL, 352352768UL, 31744UL,
+2813265494UL, 886309456UL, 47912514UL, 31343650UL, 47801870UL, 30114052UL, 11901184UL, 10791936UL, 9878016UL,
+2858360649UL, 1938110261UL, 764624176UL, 429676569UL, 211511561UL, 43283459UL, 9142784UL, 8359936UL, 7380736UL,
+2788045111UL, 2135115815UL, 1701143808UL, 1080584704UL, 577202944UL, 224619520UL, 6057728UL, 5864704UL, 5343744UL,
+3056161036UL, 2435668741UL, 1815635456UL, 1195009792UL, 725443840UL, 373187328UL, 104752128UL, 3894016UL, 3831552UL,
+2988071680UL, 2400804096UL, 1847354112UL, 1293771776UL, 857694464UL, 488791552UL, 220486400UL, 52715264UL, 2582272UL,
+2920177152UL, 2332777728UL, 1829330688UL, 1359503616UL, 973824256UL, 621763840UL, 269506560UL, 118642944UL, 1335040UL,
+2886099200UL, 2265144064UL, 1778407680UL, 1392532480UL, 1073766144UL, 755195648UL, 453270272UL, 184834304UL, 482560UL,
+2852218112UL, 2197838848UL, 1811963136UL, 1476419840UL, 1191208192UL, 889218048UL, 587227392UL, 302014208UL, 25088UL,
+2717935872UL, 2231395840UL, 1811965440UL, 1476421888UL, 1191209984UL, 939551744UL, 687892736UL, 402679808UL, 27136UL,
+3249604153UL, 1708524086UL, 585171507UL, 48370214UL, 31601680UL, 14372868UL, 13461760UL, 12680448UL, 11702272UL,
+3195409712UL, 2224038185UL, 1083974180UL, 396241692UL, 178339850UL, 43994626UL, 10051072UL, 9596416UL, 8880128UL,
+3007980834UL, 2337813271UL, 1785678080UL, 1081100800UL, 561007616UL, 191713280UL, 6706688UL, 6514176UL, 6124544UL,
+2838245394UL, 2301901833UL, 1799440128UL, 1128481536UL, 742672896UL, 356862976UL, 105075200UL, 4217344UL, 4024320UL,
+2871016960UL, 2300592640UL, 1797474304UL, 1311000576UL, 874990080UL, 505956608UL, 220744448UL, 52842752UL, 2382848UL,
+2836546048UL, 2249147648UL, 1779386112UL, 1359956224UL, 974146048UL, 605243648UL, 320030720UL, 101862400UL, 1135360UL,
+2903066112UL, 2214872320UL, 1778665216UL, 1426278656UL, 1090735104UL, 755256320UL, 436488960UL, 184830720UL, 282368UL,
+3003337216UL, 2264942592UL, 1862290176UL, 1526747136UL, 1191203584UL, 889213696UL, 604000512UL, 318787840UL, 21248UL,
+3070251008UL, 2432716800UL, 1929400832UL, 1577080320UL, 1258314496UL, 989879296UL, 738220800UL, 436230400UL, 22784UL,
+3568109346UL, 2262106917UL, 1122173220UL, 367395105UL, 31854613UL, 15083526UL, 14368512UL, 13717760UL, 13067776UL,
+3447722013UL, 2459112987UL, 1369380887UL, 547296537UL, 195174925UL, 44445699UL, 10698496UL, 10439936UL, 10182144UL,
+3143179283UL, 2439259148UL, 1785868800UL, 1098199552UL, 561329152UL, 192231424UL, 7487232UL, 7621632UL, 7428352UL,
+2856002824UL, 2302618117UL, 1766339072UL, 1212887808UL, 726479872UL, 340670208UL, 89013504UL, 5064192UL, 4871424UL,
+2770675968UL, 2217095168UL, 1730819072UL, 1261188352UL, 842150400UL, 489698816UL, 204552704UL, 53363200UL, 2968832UL,
+2752916736UL, 2165649920UL, 1712731648UL, 1310078464UL, 957822464UL, 605632256UL, 303642624UL, 102251776UL, 1394176UL,
+2886480128UL, 2198352896UL, 1728526080UL, 1376139264UL, 1040595200UL, 721893888UL, 436746752UL, 185023232UL, 475392UL,
+3104126208UL, 2298623744UL, 1828731392UL, 1476410624UL, 1157644288UL, 855654656UL, 570441728UL, 285229056UL, 17408UL,
+3338680832UL, 2550152192UL, 1996505088UL, 1610630400UL, 1308641536UL, 1006652416UL, 754994176UL, 436226816UL, 18944UL,
+3752199442UL, 2714829590UL, 1608712727UL, 786891031UL, 266863123UL, 15403531UL, 15080962UL, 14429952UL, 13975808UL,
+3565226513UL, 2610105871UL, 1587482636UL, 832573198UL, 228527886UL, 44439813UL, 11020288UL, 11023360UL, 11091712UL,
+3160347149UL, 2439583495UL, 1769086464UL, 1114971648UL, 527834880UL, 175710720UL, 8006144UL, 8336896UL, 8536320UL,
+2789414919UL, 2235964420UL, 1749885184UL, 1213211136UL, 726868480UL, 324412160UL, 89664000UL, 5976832UL, 6111488UL,
+2670533632UL, 2150506752UL, 1680941824UL, 1261642752UL, 859251456UL, 473506816UL, 188360704UL, 3747328UL, 3947264UL,
+2702777344UL, 2082087680UL, 1629168896UL, 1260135936UL, 924722432UL, 572662272UL, 287385088UL, 86060032UL, 2176512UL,
+2886606592UL, 2114724864UL, 1644898048UL, 1292577024UL, 990652416UL, 688727808UL, 386803968UL, 151857920UL, 930304UL,
+3171230464UL, 2265130496UL, 1711286016UL, 1375742464UL, 1090530304UL, 839003904UL, 553857024UL, 268644352UL, 209664UL,
+3540002560UL, 2583702016UL, 1962946304UL, 1610625792UL, 1308636928UL, 1023425024UL, 738212608UL, 436222720UL, 14848UL,
+3819438857UL, 3083666187UL, 2028077070UL, 1189478414UL, 652804109UL, 250413065UL, 15598599UL, 15144192UL, 14820608UL,
+3632465161UL, 2693924616UL, 1738344454UL, 1050674951UL, 530646791UL, 94635528UL, 27923458UL, 11411200UL, 11806464UL,
+3143895559UL, 2439646467UL, 1735462912UL, 1131745024UL, 611847936UL, 209326336UL, 8198144UL, 8791040UL, 9382656UL,
+2689011205UL, 2185891842UL, 1716523520UL, 1196626432UL, 743903488UL, 307827200UL, 73341184UL, 6627840UL, 7154944UL,
+2587038208UL, 2067010560UL, 1647711488UL, 1228477952UL, 842863872UL, 440341504UL, 155326208UL, 4529664UL, 4926208UL,
+2635993600UL, 2015368960UL, 1579161344UL, 1210259200UL, 874780160UL, 539497984UL, 254351104UL, 69934080UL, 3090176UL,
+2869890816UL, 2081429504UL, 1578113536UL, 1242569216UL, 957422080UL, 655563008UL, 387389184UL, 135666432UL, 1581568UL,
+3238466560UL, 2248480768UL, 1677990656UL, 1325669632UL, 1040457216UL, 772087296UL, 503717120UL, 235282176UL, 533248UL,
+3724548096UL, 2617252608UL, 1895833344UL, 1526735616UL, 1241523712UL, 973088768UL, 704653312UL, 402663424UL, 10240UL,
+3754033155UL, 3252158469UL, 2414215174UL, 1625948167UL, 1089339398UL, 653393924UL, 301334531UL, 15925254UL, 15732736UL,
+3616342532UL, 2777940483UL, 1872626178UL, 1252262146UL, 765985026UL, 380240130UL, 44958469UL, 11668480UL, 12325888UL,
+3144155907UL, 2439775233UL, 1718682624UL, 1165427712UL, 695993088UL, 310313984UL, 58918914UL, 9114112UL, 9770752UL,
+2672559362UL, 2186151169UL, 1699939840UL, 1196885248UL, 760939776UL, 375391488UL, 90507776UL, 7082496UL, 7608320UL,
+2486700288UL, 2017003520UL, 1614481664UL, 1212024832UL, 843122432UL, 474285824UL, 155781376UL, 5050112UL, 5641984UL,
+2552498432UL, 1965361920UL, 1546062336UL, 1193806592UL, 858393088UL, 539822336UL, 254806528UL, 53808640UL, 3872000UL,
+2819885312UL, 2064911360UL, 1561660672UL, 1192627200UL, 890702848UL, 605621248UL, 337316608UL, 119409920UL, 2298624UL,
+3288794880UL, 2282097664UL, 1644563968UL, 1241911040UL, 939986944UL, 688393984UL, 436866560UL, 185273088UL, 921856UL,
+3875539712UL, 2701135104UL, 1879052032UL, 1409290752UL, 1107301376UL, 855643392UL, 620762368UL, 335549440UL, 5376UL,
+3539009536UL, 3170041856UL, 2666856448UL, 2096496640UL, 1559756800UL, 1090125824UL, 721158144UL, 352124928UL, 16711680UL,
+3433627648UL, 2795896832UL, 2125332480UL, 1572143104UL, 1119551488UL, 750780416UL, 432275456UL, 180748288UL, 13041664UL,
+3111387136UL, 2507407360UL, 1887109120UL, 1350828032UL, 931725312UL, 563019776UL, 278200320UL, 77070336UL, 10158080UL,
+2689794048UL, 2253717504UL, 1784283136UL, 1314914304UL, 895811584UL, 527106048UL, 258998272UL, 58064896UL, 8126464UL,
+2436694016UL, 2050949120UL, 1665204224UL, 1279524864UL, 910753792UL, 575537152UL, 273874944UL, 72941568UL, 6291456UL,
+2469003264UL, 1948975104UL, 1579941888UL, 1227816960UL, 909115392UL, 607453184UL, 322568192UL, 104792064UL, 4653056UL,
+2803433472UL, 2098790400UL, 1595539456UL, 1192951808UL, 874315776UL, 606011392UL, 371326976UL, 153550848UL, 3080192UL,
+3339386880UL, 2416508928UL, 1711931392UL, 1242169344UL, 889978880UL, 621608960UL, 403636224UL, 185729024UL, 1507328UL,
+4026531840UL, 2936012800UL, 2030043136UL, 1409286144UL, 1006632960UL, 704643072UL, 469762048UL, 234881024UL, 0
+ };
+
+uint32_t ulMapDJ690_CMYK[ 9 * 9 * 9 ]=
+// DJ690_CMYK
+ {
+ 337848575UL, 37838470UL, 155209268UL, 137905152UL, 36454656UL, 2310144UL,
+ 2179072UL, 2051072UL, 1733120UL, 2013280119UL, 385897321UL, 303379741UL,
+ 270610688UL, 102772224UL, 1844992UL, 1911552UL, 1847296UL, 1784832UL,
+2080387626UL, 1157643294UL, 452996881UL, 335555072UL, 202384384UL, 50991872UL,
+ 2304UL, 922880UL, 1319680UL, 2164273408UL, 1409300992UL, 721433088UL,
+ 385886976UL, 268444928UL, 151000832UL, 16777216UL, 0UL, 2048UL,
+2147495424UL, 1426075648UL, 838872576UL, 520104192UL, 301999872UL, 201335040UL,
+ 83889408UL, 0UL, 0UL, 2231381504UL, 1459629056UL, 922756864UL,
+ 603988736UL, 402662656UL, 234889984UL, 134224640UL, 33554432UL, 0UL,
+2365598720UL, 1711286528UL, 1023417856UL, 687873280UL, 469770240UL, 318775552UL,
+ 151002624UL, 67112448UL, 0UL, 2147492608UL, 1660951808UL, 1040191744UL,
+ 738202112UL, 520098560UL, 352326656UL, 234888192UL, 83891968UL, 512UL,
+1744833536UL, 1493176064UL, 1056967168UL, 771754240UL, 570427136UL, 402655744UL,
+ 285216512UL, 151000832UL, 5120UL, 1867382908UL, 242679926UL, 273556510UL,
+ 171977984UL, 37040896UL, 2963456UL, 2375168UL, 2380544UL, 2060288UL,
+2399142003UL, 336202819UL, 371005455UL, 287581184UL, 102769152UL, 1314048UL,
+ 1381120UL, 1515264UL, 1388032UL, 2214599729UL, 1107302927UL, 520100352UL,
+ 352328704UL, 219160320UL, 50333952UL, 0UL, 2560UL, 6144UL,
+2063606016UL, 1090527232UL, 671096832UL, 419437824UL, 285219584UL, 150998528UL,
+ 16777216UL, 0UL, 1024UL, 1677729536UL, 1056971776UL, 738204416UL,
+ 520100352UL, 352328448UL, 201331968UL, 83886080UL, 0UL, 0UL,
+1694504960UL, 1073743872UL, 771753728UL, 553649920UL, 419432704UL, 268439296UL,
+ 134219264UL, 33554432UL, 0UL, 1761611520UL, 1040187392UL, 822083584UL,
+ 620756992UL, 436207616UL, 301989888UL, 184549376UL, 67108864UL, 0UL,
+1979714048UL, 1073741824UL, 855638016UL, 687865856UL, 486539264UL, 352321536UL,
+ 234881024UL, 83886080UL, 0UL, 2214593536UL, 1275068416UL, 939524096UL,
+ 738197504UL, 553648128UL, 402653184UL, 268435456UL, 150994944UL, 0UL,
+2102263844UL, 1063190564UL, 391119377UL, 239537664UL, 54595584UL, 3940096UL,
+ 3616512UL, 3753984UL, 3105792UL, 2284060719UL, 1159987223UL, 421789697UL,
+ 321327616UL, 119671296UL, 1638400UL, 1572864UL, 1838080UL, 2041600UL,
+1962934313UL, 956301324UL, 402653184UL, 369889024UL, 236065536UL, 50331648UL,
+ 0UL, 0UL, 2560UL, 1543507718UL, 1040191232UL, 687870208UL,
+ 419434496UL, 285217280UL, 150995968UL, 16777216UL, 0UL, 0UL,
+1426067200UL, 1040190976UL, 738201344UL, 536874496UL, 369102592UL, 218106112UL,
+ 83886080UL, 0UL, 0UL, 1509949952UL, 1040187392UL, 788529152UL,
+ 587202560UL, 419430400UL, 285212672UL, 134217728UL, 33554432UL, 0UL,
+1644167168UL, 1023410176UL, 805306368UL, 637534208UL, 469762048UL, 318767104UL,
+ 184549376UL, 67108864UL, 0UL, 1946157056UL, 1056964608UL, 872415232UL,
+ 687865856UL, 520093696UL, 352321536UL, 234881024UL, 117440512UL, 0UL,
+2801795072UL, 1325400064UL, 939524096UL, 771751936UL, 553648128UL, 419430400UL,
+ 301989888UL, 184549376UL, 0UL, 2286419968UL, 1263140864UL, 608436224UL,
+ 290062336UL, 88997888UL, 4784128UL, 4720384UL, 4793600UL, 4932352UL,
+2452488192UL, 1126694912UL, 606535680UL, 338167040UL, 153354240UL, 2031616UL,
+ 1900544UL, 2031616UL, 2624768UL, 2014248971UL, 1074659328UL, 655294464UL,
+ 370344448UL, 235930880UL, 50331648UL, 0UL, 0UL, 786432UL,
+1308622848UL, 922746880UL, 654311424UL, 385875968UL, 285215232UL, 150994944UL,
+ 16777216UL, 0UL, 0UL, 1308623360UL, 1023411456UL, 771753728UL,
+ 536873216UL, 352323840UL, 201327104UL, 83886080UL, 0UL, 0UL,
+1392508928UL, 1023410176UL, 805306368UL, 587202560UL, 419430400UL, 268435456UL,
+ 134217728UL, 33554432UL, 0UL, 1577058304UL, 1040187392UL, 822083584UL,
+ 637534208UL, 503316480UL, 352321536UL, 184549376UL, 50331648UL, 0UL,
+1912602624UL, 1073741824UL, 889192448UL, 738197504UL, 587202560UL, 436207616UL,
+ 251658240UL, 100663296UL, 0UL, 3154116608UL, 1325400064UL, 973078528UL,
+ 788529152UL, 620756992UL, 469762048UL, 318767104UL, 201326592UL, 0UL,
+2185035776UL, 1245380608UL, 674693120UL, 407109632UL, 139132928UL, 5177344UL,
+ 5373952UL, 5636096UL, 6294784UL, 2435710976UL, 1059454976UL, 623050752UL,
+ 354680832UL, 153485312UL, 1966080UL, 1900544UL, 2228224UL, 3080192UL,
+1963982848UL, 1057816576UL, 672071680UL, 420478976UL, 218955776UL, 50331648UL,
+ 0UL, 786432UL, 1310720UL, 1426063360UL, 1006632960UL, 704643072UL,
+ 419430400UL, 285213184UL, 167772160UL, 16777216UL, 0UL, 0UL,
+1275068416UL, 1006632960UL, 738197504UL, 536870912UL, 335544320UL, 201326592UL,
+ 83886080UL, 0UL, 0UL, 1342177280UL, 1006632960UL, 805306368UL,
+ 603979776UL, 419430400UL, 234881024UL, 134217728UL, 16777216UL, 0UL,
+1543503872UL, 1056964608UL, 822083584UL, 637534208UL, 469762048UL, 318767104UL,
+ 150994944UL, 50331648UL, 0UL, 1895825408UL, 1107296256UL, 922746880UL,
+ 771751936UL, 637534208UL, 469762048UL, 285212672UL, 117440512UL, 0UL,
+3288334336UL, 1392508928UL, 1023410176UL, 855638016UL, 704643072UL, 553648128UL,
+ 385875968UL, 218103808UL, 0UL, 2033516544UL, 1160642560UL, 792068096UL,
+ 541261824UL, 256376832UL, 39124992UL, 5701632UL, 6029312UL, 6684672UL,
+2166882304UL, 1008533504UL, 622526464UL, 387710976UL, 169541632UL, 18808832UL,
+ 1835008UL, 2031616UL, 3276800UL, 1812594688UL, 1023410176UL, 603979776UL,
+ 402653184UL, 218103808UL, 50331648UL, 0UL, 0UL, 1310720UL,
+1526726656UL, 1023410176UL, 721420288UL, 452984832UL, 301989888UL, 150994944UL,
+ 16777216UL, 0UL, 0UL, 1375731712UL, 1006632960UL, 754974720UL,
+ 553648128UL, 335544320UL, 201326592UL, 83886080UL, 0UL, 0UL,
+1325400064UL, 989855744UL, 788529152UL, 603979776UL, 419430400UL, 251658240UL,
+ 134217728UL, 16777216UL, 0UL, 1476395008UL, 1056964608UL, 838860800UL,
+ 654311424UL, 503316480UL, 318767104UL, 150994944UL, 50331648UL, 0UL,
+1895825408UL, 1124073472UL, 939524096UL, 754974720UL, 620756992UL, 469762048UL,
+ 285212672UL, 100663296UL, 0UL, 3355443200UL, 1459617792UL, 1006632960UL,
+ 855638016UL, 721420288UL, 603979776UL, 419430400UL, 251658240UL, 0UL,
+2050097152UL, 1345191936UL, 942800896UL, 675479552UL, 408027136UL, 123404288UL,
+ 5963776UL, 6422528UL, 6881280UL, 1948385280UL, 890437632UL, 605290496UL,
+ 404094976UL, 236453888UL, 51904512UL, 1572864UL, 2162688UL, 3407872UL,
+1795162112UL, 956301312UL, 553648128UL, 369098752UL, 218103808UL, 67108864UL,
+ 0UL, 0UL, 1245184UL, 1644167168UL, 1023410176UL, 721420288UL,
+ 469762048UL, 318767104UL, 167772160UL, 16777216UL, 0UL, 0UL,
+1577058304UL, 1040187392UL, 788529152UL, 570425344UL, 385875968UL, 234881024UL,
+ 83886080UL, 0UL, 0UL, 1509949440UL, 1056964608UL, 838860800UL,
+ 637534208UL, 452984832UL, 251658240UL, 117440512UL, 16777216UL, 0UL,
+1509949440UL, 1073741824UL, 838860800UL, 671088640UL, 503316480UL, 318767104UL,
+ 167772160UL, 33554432UL, 0UL, 1895825408UL, 1124073472UL, 922746880UL,
+ 754974720UL, 587202560UL, 436207616UL, 268435456UL, 33554432UL, 0UL,
+3388997632UL, 1526726656UL, 1006632960UL, 838860800UL, 671088640UL, 553648128UL,
+ 419430400UL, 251658240UL, 0UL, 2016280576UL, 1664221184UL, 1346240512UL,
+ 995360768UL, 643629056UL, 341704704UL, 140705792UL, 23134208UL, 6881280UL,
+2132803584UL, 856489984UL, 621805568UL, 454426624UL, 286982144UL, 102432768UL,
+ 1441792UL, 1900544UL, 3538944UL, 2063597568UL, 905969664UL, 536870912UL,
+ 385875968UL, 234881024UL, 117440512UL, 0UL, 655360UL, 1179648UL,
+1979711488UL, 1023410176UL, 687865856UL, 452984832UL, 318767104UL, 167772160UL,
+ 33554432UL, 0UL, 0UL, 1962934272UL, 1107296256UL, 822083584UL,
+ 603979776UL, 402653184UL, 251658240UL, 67108864UL, 0UL, 0UL,
+1929379840UL, 1140850688UL, 872415232UL, 654311424UL, 469762048UL, 268435456UL,
+ 117440512UL, 0UL, 0UL, 1895825408UL, 1157627904UL, 905969664UL,
+ 704643072UL, 503316480UL, 335544320UL, 150994944UL, 33554432UL, 0UL,
+2030043136UL, 1174405120UL, 922746880UL, 754974720UL, 553648128UL, 385875968UL,
+ 218103808UL, 67108864UL, 0UL, 3439329280UL, 1577058304UL, 1006632960UL,
+ 822083584UL, 637534208UL, 503316480UL, 352321536UL, 201326592UL, 0UL,
+1865285632UL, 2033319936UL, 2017591296UL, 1700331520UL, 1164181504UL, 711131136UL,
+ 459538432UL, 225116160UL, 6291456UL, 2199322624UL, 1108738048UL, 773455872UL,
+ 623509504UL, 455999488UL, 305201152UL, 154402816UL, 36700160UL, 3014656UL,
+2667577344UL, 1090519040UL, 570425344UL, 402653184UL, 251658240UL, 117440512UL,
+ 16777216UL, 0UL, 0UL, 2969567232UL, 1191182336UL, 704643072UL,
+ 436207616UL, 285212672UL, 167772160UL, 33554432UL, 0UL, 0UL,
+3170893824UL, 1342177280UL, 889192448UL, 620756992UL, 402653184UL, 251658240UL,
+ 83886080UL, 0UL, 0UL, 3271557120UL, 1442840576UL, 973078528UL,
+ 738197504UL, 520093696UL, 335544320UL, 167772160UL, 0UL, 0UL,
+3355443200UL, 1509949440UL, 1006632960UL, 805306368UL, 570425344UL, 402653184UL,
+ 201326592UL, 50331648UL, 0UL, 3422552064UL, 1560281088UL, 1040187392UL,
+ 822083584UL, 620756992UL, 436207616UL, 251658240UL, 83886080UL, 0UL,
+3489660928UL, 1711276032UL, 1073741824UL, 805306368UL, 620756992UL, 436207616UL,
+ 285212672UL, 134217728UL, 0
+};
+uint32_t ulMapDJ690_ClMlxx[ 9 * 9 * 9 ]=
+// DJ690_ClMlxx
+{
+ 0UL, 988160UL, 2242048UL, 4611328UL, 5341952UL, 5871616UL,
+ 5937408UL, 5671424UL, 5528064UL, 2036480UL, 3948288UL, 6779392UL,
+ 5597696UL, 5207040UL, 7057152UL, 6992128UL, 6860800UL, 6332928UL,
+ 5190656UL, 6178560UL, 7304448UL, 8222208UL, 5007616UL, 7057408UL,
+ 10153472UL, 8443904UL, 7652352UL, 6115072UL, 6113792UL, 5529088UL,
+ 5990656UL, 5662720UL, 5736704UL, 6872064UL, 8580864UL, 9892096UL,
+ 3887360UL, 3366400UL, 3042816UL, 3501568UL, 3960320UL, 3829504UL,
+ 4171008UL, 4903680UL, 6808832UL, 2249728UL, 1731840UL, 1478400UL,
+ 1543424UL, 2260480UL, 2718720UL, 2589184UL, 2808576UL, 3855616UL,
+ 1072384UL, 688384UL, 441088UL, 373248UL, 761344UL, 1412608UL,
+ 1609472UL, 1619712UL, 2152960UL, 292864UL, 41472UL, 57344UL,
+ 55040UL, 53760UL, 312576UL, 632832UL, 767744UL, 915712UL,
+ 49408UL, 51712UL, 60160UL, 60928UL, 60416UL, 58624UL,
+ 55808UL, 53760UL, 58880UL, 597248UL, 2176256UL, 3496192UL,
+ 4875520UL, 5734656UL, 5935360UL, 6002944UL, 5275136UL, 5069568UL,
+ 2632192UL, 6326784UL, 8163328UL, 5664256UL, 5601792UL, 8573952UL,
+ 8310272UL, 7783168UL, 7124480UL, 4866560UL, 7764992UL, 9082624UL,
+ 8289280UL, 4941568UL, 8307456UL, 9697792UL, 10087680UL, 9951232UL,
+ 6381312UL, 5529344UL, 5137152UL, 5598464UL, 5333760UL, 5541888UL,
+ 5949440UL, 7397376UL, 8321024UL, 3956224UL, 3171328UL, 2780416UL,
+ 2912512UL, 3370240UL, 3238912UL, 3649536UL, 4045312UL, 5167616UL,
+ 2454272UL, 1678592UL, 1224192UL, 1289984UL, 1614080UL, 2002176UL,
+ 1742592UL, 2468352UL, 3326464UL, 1414144UL, 638464UL, 313344UL,
+ 248832UL, 312576UL, 638720UL, 964608UL, 828928UL, 1686016UL,
+ 698624UL, 48128UL, 50944UL, 53248UL, 51712UL, 50944UL,
+ 180992UL, 244992UL, 312576UL, 47616UL, 51968UL, 57856UL,
+ 59904UL, 58624UL, 57856UL, 56576UL, 59904UL, 60672UL,
+ 1727488UL, 2906112UL, 4613888UL, 5140480UL, 6131712UL, 6264320UL,
+ 5933824UL, 4749312UL, 4219392UL, 4279296UL, 6452992UL, 9082880UL,
+ 5795328UL, 6720768UL, 8898048UL, 9032448UL, 8373760UL, 7123200UL,
+ 5988352UL, 9147392UL, 10662656UL, 6847488UL, 5269504UL, 9155584UL,
+ 10146304UL, 10415616UL, 10022400UL, 5990656UL, 6189312UL, 5926400UL,
+ 5795840UL, 5398528UL, 5737472UL, 6072320UL, 6800640UL, 6939904UL,
+ 3960064UL, 3566336UL, 3171584UL, 3042048UL, 3237632UL, 3174656UL,
+ 3705600UL, 3777536UL, 4246016UL, 2462464UL, 2003200UL, 1607936UL,
+ 1411840UL, 1477632UL, 1675520UL, 1606144UL, 2328832UL, 2861568UL,
+ 1481216UL, 953088UL, 491520UL, 231680UL, 166144UL, 427264UL,
+ 754176UL, 818432UL, 1350144UL, 762112UL, 167424UL, 37120UL,
+ 40192UL, 39424UL, 41472UL, 38144UL, 102144UL, 39424UL,
+ 40960UL, 41216UL, 43008UL, 47616UL, 49152UL, 48384UL,
+ 47616UL, 46336UL, 44800UL, 3890176UL, 5201152UL, 6052864UL,
+ 5790208UL, 5993216UL, 6591488UL, 6333440UL, 5473536UL, 4156416UL,
+ 6186240UL, 6449408UL, 7105024UL, 5988352UL, 7304448UL, 8817664UL,
+ 9019392UL, 8763136UL, 7780352UL, 7496192UL, 8024832UL, 7042304UL,
+ 6647808UL, 6646016UL, 9928704UL, 10855168UL, 11451392UL, 9688320UL,
+ 6910208UL, 6714368UL, 6649600UL, 6913792UL, 5724416UL, 6256640UL,
+ 6782464UL, 7249152UL, 7520768UL, 4091904UL, 4025088UL, 3825408UL,
+ 3691776UL, 3560192UL, 3828992UL, 4027648UL, 3899136UL, 4235264UL,
+ 2716672UL, 2388224UL, 2125312UL, 1862912UL, 1798912UL, 1929728UL,
+ 2125056UL, 2256896UL, 2590464UL, 1602304UL, 1141760UL, 813056UL,
+ 550144UL, 419840UL, 485888UL, 813824UL, 748032UL, 1144064UL,
+ 751104UL, 224768UL, 26624UL, 28416UL, 29184UL, 30720UL,
+ 29184UL, 93952UL, 29184UL, 30976UL, 30976UL, 31232UL,
+ 33792UL, 35328UL, 37376UL, 37376UL, 35328UL, 33280UL,
+ 5782272UL, 6700800UL, 7356416UL, 6242048UL, 7091968UL, 7228160UL,
+ 6385408UL, 5869056UL, 4821504UL, 6505728UL, 6833920UL, 7620352UL,
+ 6965248UL, 7688960UL, 9918976UL, 9662720UL, 8816640UL, 8036096UL,
+ 9129984UL, 8474880UL, 7295232UL, 7426816UL, 8082944UL, 10640128UL,
+ 11301376UL, 10258688UL, 9608704UL, 8344832UL, 7755264UL, 7558656UL,
+ 7099648UL, 6901504UL, 6772736UL, 7364608UL, 8221184UL, 9344256UL,
+ 4344576UL, 4345344UL, 4214272UL, 4083456UL, 4412928UL, 4413696UL,
+ 4546048UL, 4349952UL, 4880384UL, 2839808UL, 2643200UL, 2511360UL,
+ 2381056UL, 2316288UL, 2249984UL, 2578688UL, 2448384UL, 2649344UL,
+ 1660928UL, 1266688UL, 1135104UL, 1069824UL, 938752UL, 873984UL,
+ 1005312UL, 1005056UL, 1138688UL, 742912UL, 283904UL, 152320UL,
+ 21504UL, 21504UL, 23808UL, 23040UL, 87808UL, 23040UL,
+ 23040UL, 23808UL, 23040UL, 24832UL, 25600UL, 27904UL,
+ 28416UL, 27136UL, 25856UL, 7480832UL, 8333056UL, 8923648UL,
+ 7088640UL, 7545600UL, 8199168UL, 7091200UL, 6246144UL, 5269760UL,
+ 8137984UL, 8989952UL, 9907712UL, 9318144UL, 9972736UL, 10435328UL,
+ 10635264UL, 9984768UL, 8416512UL, 11154688UL, 11744768UL, 11220480UL,
+ 11220736UL, 10957824UL, 11091456UL, 11424256UL, 12344576UL, 10185728UL,
+ 8731392UL, 8207104UL, 8076032UL, 7813376UL, 7813632UL, 7355392UL,
+ 7947776UL, 8738560UL, 10119680UL, 5126912UL, 5192704UL, 5060864UL,
+ 5192192UL, 5257216UL, 4930304UL, 5063424UL, 5130752UL, 5987584UL,
+ 2962432UL, 2831616UL, 2765568UL, 2765824UL, 2634752UL, 2832384UL,
+ 3096576UL, 3163904UL, 3298560UL, 1784576UL, 1457408UL, 1392128UL,
+ 1392384UL, 1457664UL, 1392128UL, 1326336UL, 1392384UL, 1658880UL,
+ 801792UL, 409600UL, 343808UL, 212992UL, 278272UL, 147712UL,
+ 148224UL, 213504UL, 18176UL, 16128UL, 17920UL, 17664UL,
+ 17920UL, 18688UL, 20224UL, 21760UL, 21760UL, 20480UL,
+ 9245952UL, 10163712UL, 10098944UL, 8133120UL, 7410688UL, 8325632UL,
+ 8850176UL, 7087104UL, 5977344UL, 10164736UL, 11933696UL, 12130304UL,
+ 11606272UL, 11409664UL, 12262656UL, 12070656UL, 10501632UL, 9191680UL,
+ 13836288UL, 12918784UL, 12263168UL, 12263424UL, 11673344UL, 11739648UL,
+ 11811328UL, 12601088UL, 11028992UL, 9315584UL, 8529152UL, 8332288UL,
+ 7938560UL, 8004096UL, 7675392UL, 8334848UL, 9256960UL, 10571008UL,
+ 5973248UL, 5645824UL, 5580288UL, 5514240UL, 5448960UL, 5580032UL,
+ 5449728UL, 5911040UL, 6767872UL, 3810304UL, 3614464UL, 3679744UL,
+ 3482880UL, 3679744UL, 3614208UL, 3613952UL, 3682048UL, 4209920UL,
+ 1777408UL, 1646080UL, 1580544UL, 1646336UL, 1712128UL, 1646848UL,
+ 1910272UL, 1911552UL, 2374144UL, 862208UL, 600320UL, 535552UL,
+ 469760UL, 469760UL, 469248UL, 469504UL, 403456UL, 668160UL,
+ 10496UL, 11520UL, 12544UL, 12544UL, 12544UL, 12800UL,
+ 14336UL, 15616UL, 14336UL, 10946304UL, 11077376UL, 10160896UL,
+ 8325888UL, 7013888UL, 7602176UL, 8060928UL, 8586240UL, 7410432UL,
+ 11799552UL, 14288896UL, 14157824UL, 13240832UL, 12716544UL, 13043712UL,
+ 14028544UL, 12133888UL, 10102784UL, 14880512UL, 13307392UL, 12520192UL,
+ 13176320UL, 12848640UL, 13176320UL, 12980992UL, 11677440UL, 12071680UL,
+ 10293504UL, 8851712UL, 8589312UL, 8589056UL, 8458240UL, 8523520UL,
+ 8983296UL, 9775616UL, 11024384UL, 6492928UL, 5968640UL, 5968640UL,
+ 5968896UL, 5968640UL, 6099968UL, 5968128UL, 6562048UL, 7417088UL,
+ 4198656UL, 3871232UL, 4002304UL, 4002816UL, 4068352UL, 4199424UL,
+ 4068096UL, 4266240UL, 4663296UL, 2494464UL, 2232832UL, 2167552UL,
+ 2167808UL, 2167808UL, 2167808UL, 2429696UL, 2429952UL, 3023360UL,
+ 790016UL, 658432UL, 660480UL, 658432UL, 658432UL, 658432UL,
+ 658688UL, 856576UL, 1252608UL, 5376UL, 6144UL, 6400UL,
+ 7168UL, 7168UL, 6656UL, 5888UL, 7424UL, 7424UL,
+ 11599872UL, 11272192UL, 10092544UL, 7995392UL, 6619136UL, 6750208UL,
+ 6946816UL, 6946816UL, 8912896UL, 14155776UL, 15073280UL, 14090240UL,
+ 11796480UL, 11206656UL, 11075584UL, 11599872UL, 12582912UL, 12910592UL,
+ 16646144UL, 15335424UL, 15335424UL, 15532032UL, 15466496UL, 15663104UL,
+ 16580608UL, 16711680UL, 16711680UL, 11993088UL, 10027008UL, 10027008UL,
+ 10158080UL, 9961472UL, 10027008UL, 10616832UL, 11337728UL, 12124160UL,
+ 7471104UL, 6553600UL, 6553600UL, 6619136UL, 6946816UL, 6619136UL,
+ 6750208UL, 7471104UL, 8388608UL, 4718592UL, 4390912UL, 4521984UL,
+ 4587520UL, 4784128UL, 5177344UL, 4784128UL, 4718592UL, 5636096UL,
+ 3014656UL, 2752512UL, 2686976UL, 2883584UL, 2818048UL, 3080192UL,
+ 3276800UL, 3080192UL, 3670016UL, 1441792UL, 1179648UL, 1114112UL,
+ 1048576UL, 1048576UL, 1179648UL, 1376256UL, 1638400UL, 1966080UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL,
+};
+
diff --git a/prnt/hpcups/dj600PrintModes.h b/prnt/hpcups/dj600PrintModes.h
new file mode 100644
index 0000000..1003b23
--- /dev/null
+++ b/prnt/hpcups/dj600PrintModes.h
@@ -0,0 +1,44 @@
+PrintMode dj600PrintModes[] =
+{
+ {
+ "PlainDraftColor",
+ {300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300},
+ {1, 1, 1, 1, 1, 1}, 3, FED,
+ {ulMapDJ600_CCM_CMY, NULL, NULL},
+ 300, 300, false, HTBinary_open, HTBinary_open
+ },
+ {
+ "PlainDraftGrayK",
+ {300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300},
+ {1, 1, 1, 1, 1, 1}, 1, FED,
+ {ulMapDJ600_CCM_K, NULL, NULL},
+ 300, 300, false, HTBinary_open, HTBinary_open
+ },
+ {
+ "PlainNormalColor",
+ {300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300},
+ {1, 1, 1, 1, 1, 1}, 3, FED,
+ {ulMapDJ600_CCM_CMY, NULL, NULL},
+ 300, 300, false, HTBinary_open, HTBinary_open
+ },
+ {
+ "PlainNormalGrayK",
+ {300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300},
+ {1, 1, 1, 1, 1, 1}, 1, FED,
+ {ulMapDJ600_CCM_K, NULL, NULL},
+ 300, 300, false, HTBinary_open, HTBinary_open
+ },
+ {
+ "PlainBestGrayK",
+ {600, 600, 600, 600, 600, 600},
+ {600, 600, 600, 600, 600, 600},
+ {1, 1, 1, 1, 1, 1}, 1, FED,
+ {ulMapDJ600_CCM_K, NULL, NULL},
+ 600, 600, false, HTBinary_open, HTBinary_open
+ }
+};
+
diff --git a/prnt/hpcups/dj630PrintModes.h b/prnt/hpcups/dj630PrintModes.h
new file mode 100644
index 0000000..812717a
--- /dev/null
+++ b/prnt/hpcups/dj630PrintModes.h
@@ -0,0 +1,68 @@
+PrintMode dj630PrintModes[] =
+{
+ {
+ "PlainDraftColor",
+ {300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300},
+ {1, 1, 1, 1, 1, 1}, 4, MATRIX,
+ {ulMapDJ660_CCM_KCMY, NULL, NULL},
+ 300, 300, false, HTBinary_open, HTBinary_open
+ },
+ {
+ "PlainDraftColorCMY",
+ {300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300},
+ {1, 1, 1, 1, 1, 1}, 3, MATRIX,
+ {ulMapDJ660_CCM_KCMY, NULL, NULL},
+ 300, 300, false, HTBinary_open, HTBinary_open
+ },
+ {
+ "PlainDraftGrayK",
+ {300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300},
+ {1, 1, 1, 1, 1, 1}, 1, FED,
+ {ulMapDJ600_CCM_K, NULL, NULL},
+ 300, 300, false, HTBinary_open, HTBinary_open
+ },
+ {
+ "PlainBestGrayK",
+ {600, 300, 300, 300, 300, 300},
+ {600, 300, 300, 300, 300, 300},
+ {1, 1, 1, 1, 1, 1}, 1, FED,
+ {ulMapDJ600_CCM_K, NULL, NULL},
+ 300, 300, true, HTBinary_open, HTBinary_open
+ },
+ {
+ "PlainNormalColorCMY",
+ {300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300},
+ {1, 1, 1, 1, 1, 1}, 3, FED,
+ {ulMapDJ600_CCM_CMY, NULL, NULL},
+ 300, 300, false, HTBinary_open, HTBinary_open
+ },
+ {
+ "PlainNormalGrayK",
+ {300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300},
+ {1, 1, 1, 1, 1, 1}, 1, FED,
+ {ulMapDJ600_CCM_K, NULL, NULL},
+ 300, 300, false, HTBinary_open, HTBinary_open
+ },
+ {
+ "PlainNormalColor",
+ {300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300},
+ {1, 1, 1, 1, 1, 1}, 4, FED,
+ {ulMapDJ660_CCM_KCMY, NULL, NULL},
+ 300, 300, false, HTBinary_open, HTBinary_open
+ },
+ {
+ "PhotoBestColor",
+ {600, 600, 600, 600, 600, 600},
+ {600, 600, 600, 600, 600, 600},
+ {1, 1, 1, 1, 1, 1}, 6, FED,
+ {ulMapDJ690_CMYK, ulMapDJ690_ClMlxx, NULL},
+ 600, 600, false, HTBinary_open, HTBinary_open
+ }
+};
+
diff --git a/prnt/hpcups/dj690PrintModes.h b/prnt/hpcups/dj690PrintModes.h
new file mode 100644
index 0000000..16e603c
--- /dev/null
+++ b/prnt/hpcups/dj690PrintModes.h
@@ -0,0 +1,52 @@
+PrintMode dj690PrintModes[] =
+{
+ {
+ "PlainDraftColor",
+ {300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300},
+ {1, 1, 1, 1, 1, 1}, 4, MATRIX,
+ {ulMapDJ660_CCM_KCMY, NULL, NULL},
+ 300, 300, false, HTBinary_open, HTBinary_open
+ },
+ {
+ "PlainDraftGrayK",
+ {300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300},
+ {1, 1, 1, 1, 1, 1}, 1, FED,
+ {ulMapDJ600_CCM_K, NULL, NULL},
+ 300, 300, false, HTBinary_open, HTBinary_open
+ },
+ {
+ "PlainNormalColor",
+ {300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300},
+ {1, 1, 1, 1, 1, 1}, 4, FED,
+ {ulMapDJ660_CCM_KCMY, NULL, NULL},
+ 300, 300, false, HTBinary_open, HTBinary_open
+ },
+ {
+ "PlainNormalGrayK",
+ {300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300},
+ {1, 1, 1, 1, 1, 1}, 1, FED,
+ {ulMapDJ600_CCM_K, NULL, NULL},
+ 300, 300, false, HTBinary_open, HTBinary_open
+ },
+ {
+ "PlainBestGrayK",
+ {600, 600, 600, 600, 600, 600},
+ {600, 600, 600, 600, 600, 600},
+ {1, 1, 1, 1, 1, 1}, 1, FED,
+ {ulMapDJ600_CCM_K, NULL, NULL},
+ 600, 600, false, HTBinary_open, HTBinary_open
+ },
+ {
+ "PhotoBestColor",
+ {600, 600, 600, 600, 600, 600},
+ {600, 600, 600, 600, 600, 600},
+ {1, 1, 1, 1, 1, 1}, 6, FED,
+ {ulMapDJ690_CMYK, ulMapDJ690_ClMlxx, NULL},
+ 600, 600, false, HTBinary_open, HTBinary_open
+ }
+};
+
diff --git a/prnt/hpcups/dj850PrintModes.h b/prnt/hpcups/dj850PrintModes.h
new file mode 100644
index 0000000..6402aff
--- /dev/null
+++ b/prnt/hpcups/dj850PrintModes.h
@@ -0,0 +1,36 @@
+PrintMode dj850PrintModes[] =
+{
+ {
+ "PlainDraftColor",
+ {300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300},
+ {1, 1, 1, 1, 1, 1}, 4, FED,
+ {ulMapDJ850_Normal_KCMY, NULL, NULL},
+ 300, 300, false, HTBinary_open, HTBinary_open
+ },
+ {
+ "PlainDraftGrayK",
+ {300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300},
+ {1, 1, 1, 1, 1, 1}, 1, FED,
+ {ulMapDJ600_CCM_K, NULL, NULL},
+ 300, 300, false, HTBinary_open, HTBinary_open
+ },
+ {
+ "PlainNormalColor",
+ {600, 300, 300, 300, 300, 300},
+ {600, 300, 300, 300, 300, 300},
+ {1, 2, 2, 2, 2, 2}, 4, FED,
+ {ulMapDJ850_Normal_KCMY, NULL, NULL},
+ 300, 300, true, HTBinary_open, HT300x3004level_open
+ },
+ {
+ "PlainNormalGrayK",
+ {600, 300, 300, 300, 300, 300},
+ {600, 300, 300, 300, 300, 300},
+ {1, 1, 1, 1, 1, 1}, 1, FED,
+ {ulMapGRAY_K_6x6x1, NULL, NULL},
+ 300, 300, true, HTBinary_open, HTBinary_open
+ }
+};
+
diff --git a/prnt/hpcups/dj890PrintModes.h b/prnt/hpcups/dj890PrintModes.h
new file mode 100644
index 0000000..b453206
--- /dev/null
+++ b/prnt/hpcups/dj890PrintModes.h
@@ -0,0 +1,36 @@
+PrintMode dj890PrintModes[] =
+{
+ {
+ "PlainDraftColor",
+ {300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300},
+ {1, 1, 1, 1, 1, 1}, 4, FED,
+ {ulMapDJ895_Binary_KCMY, NULL, NULL},
+ 300, 300, false, HTBinary_open, HTBinary_open
+ },
+ {
+ "PlainDraftGrayK",
+ {300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300},
+ {1, 1, 1, 1, 1, 1}, 1, FED,
+ {ulMapDJ600_CCM_K, NULL, NULL},
+ 300, 300, false, HTBinary_open, HTBinary_open
+ },
+ {
+ "PlainNormalColor",
+ {600, 300, 300, 300, 300, 300},
+ {600, 300, 300, 300, 300, 300},
+ {1, 1, 1, 1, 1, 1}, 4, FED,
+ {ulMapDJ895_KCMY, NULL, NULL},
+ 300, 300, true, HTBinary_open, HT300x3004level_open
+ },
+ {
+ "PlainNormalGrayK",
+ {600, 300, 300, 300, 300, 300},
+ {600, 300, 300, 300, 300, 300},
+ {1, 1, 1, 1, 1, 1}, 1, FED,
+ {ulMapGRAY_K_6x6x1, NULL, NULL},
+ 300, 300, true, HTBinary_open, HTBinary_open
+ }
+};
+
diff --git a/prnt/hpcups/dj895PrintModes.h b/prnt/hpcups/dj895PrintModes.h
new file mode 100644
index 0000000..db9cc23
--- /dev/null
+++ b/prnt/hpcups/dj895PrintModes.h
@@ -0,0 +1,44 @@
+PrintMode dj895PrintModes[] =
+{
+ {
+ "PlainDraftColor",
+ {300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300},
+ {1, 1, 1, 1, 1, 1}, 4, FED,
+ {ulMapDJ895_Binary_KCMY, NULL, NULL},
+ 300, 300, false, HTBinary_open, HTBinary_open
+ },
+ {
+ "PlainDraftGrayK",
+ {300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300},
+ {1, 1, 1, 1, 1, 1}, 1, FED,
+ {ulMapDJ600_CCM_K, NULL, NULL},
+ 300, 300, false, HTBinary_open, HTBinary_open
+ },
+ {
+ "PlainNormalColor",
+ {600, 300, 300, 300, 300, 300},
+ {600, 300, 300, 300, 300, 300},
+ {1, 1, 1, 1, 1, 1}, 4, FED,
+ {ulMapDJ895_KCMY, NULL, NULL},
+ 300, 300, true, HTBinary_open, HT300x3004level_open
+ },
+ {
+ "PlainNormalGrayK",
+ {600, 300, 300, 300, 300, 300},
+ {600, 300, 300, 300, 300, 300},
+ {1, 1, 1, 1, 1, 1}, 1, FED,
+ {ulMapGRAY_K_6x6x1, NULL, NULL},
+ 300, 300, true, HTBinary_open, HTBinary_open
+ },
+ {
+ "PhotoBestColor",
+ {600, 600, 600, 600, 600, 600},
+ {600, 600, 600, 600, 600, 600},
+ {1, 2, 2, 2, 2, 2}, 4, FED,
+ {ulMapDJ895_HB_KCMY, NULL, NULL},
+ 600, 600, false, HTBinary_open, HT600x6004level895_open
+ }
+};
+
diff --git a/prnt/hpcups/dj8x5PrintModes.h b/prnt/hpcups/dj8x5PrintModes.h
new file mode 100644
index 0000000..590ca3f
--- /dev/null
+++ b/prnt/hpcups/dj8x5PrintModes.h
@@ -0,0 +1,69 @@
+// Supports Deskjet 825 and Deskjet 845 printers
+PrintMode dj8x5PrintModes[] =
+{
+ {
+ "PlainDraftColor",
+ {300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300},
+ {1, 1, 1, 1, 1, 1}, 4, FED,
+ {ulMapDJ895_Binary_KCMY, NULL, NULL},
+ 300, 300, false, HTBinary_open, HTBinary_open
+ },
+ {
+ "PlainDraftGrayK",
+ {300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300},
+ {1, 1, 1, 1, 1, 1}, 1, FED,
+ {ulMapDJ600_CCM_K, NULL, NULL},
+ 300, 300, false, HTBinary_open, HTBinary_open
+ },
+ {
+ "PlainNormalColor",
+ {600, 300, 300, 300, 300, 300},
+ {600, 300, 300, 300, 300, 300},
+ {1, 1, 1, 1, 1, 1}, 4, FED,
+ {ulMapDJ895_KCMY, NULL, NULL},
+ 300, 300, true, HTBinary_open, HT300x3004level_open
+ },
+ {
+ "PlainNormalGrayK",
+ {600, 300, 300, 300, 300, 300},
+ {600, 300, 300, 300, 300, 300},
+ {1, 1, 1, 1, 1, 1}, 1, FED,
+ {ulMapGRAY_K_6x6x1, NULL, NULL},
+ 300, 300, false, HTBinary_open, HTBinary_open
+ },
+ {
+ "PlainNormalCMY",
+ {600, 300, 300, 300, 300, 300},
+ {600, 300, 300, 300, 300, 300},
+ {1, 2, 2, 2, 2, 2}, 3, FED,
+ {ulMapDJ8x5PlainNormal, NULL, NULL},
+ 300, 300, true, HTBinary_open, HT300x3004level_open
+ },
+ {
+ "PhotoBestColor",
+ {600, 600, 600, 600, 600, 600},
+ {600, 600, 600, 600, 600, 600},
+ {1, 2, 2, 2, 2, 2}, 4, FED,
+ {ulMapDJ895_HB_KCMY, NULL, NULL},
+ 300, 300, false, HTBinary_open, HT600x6004level895_open
+ },
+ {
+ "PhotoBestCMY",
+ {600, 600, 600, 600, 600, 600},
+ {600, 600, 600, 600, 600, 600},
+ {1, 2, 2, 2, 2, 2}, 3, FED,
+ {ulMapDJ895_HB_KCMY, NULL, NULL},
+ 300, 300, false, HTBinary_open, HT600x6004level895_open
+ },
+ {
+ "PlainDraftCMY",
+ {300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300},
+ {1, 1, 1, 1, 1, 1}, 3, FED,
+ {ulMapDJ8x5Draft, NULL, NULL},
+ 300, 300, false, HTBinary_open, HTBinary_open
+ }
+};
+
diff --git a/prnt/hpcups/dj8xxColorMaps.cpp b/prnt/hpcups/dj8xxColorMaps.cpp
new file mode 100644
index 0000000..4d71174
--- /dev/null
+++ b/prnt/hpcups/dj8xxColorMaps.cpp
@@ -0,0 +1,747 @@
+/*****************************************************************************\
+ dj8xxColorMaps.cpp : Color maps for DJ850/855,870, 895, 825/845, 890
+
+ Copyright (c) 1996 - 2009, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+#include "CommonDefinitions.h"
+
+uint32_t ulMapDJ850_Normal_KCMY[ 9*9*9 ]=
+{
+1263225855UL, 12238176UL, 12629804UL, 13018654UL, 12694544UL, 11909632UL,
+ 10659840UL, 8955392UL, 6992896UL, 3087054194UL, 151053696UL, 6344002UL,
+ 9549090UL, 10727177UL, 10460416UL, 9736448UL, 9078528UL, 7899136UL,
+3288373052UL, 1879098177UL, 319208266UL, 2856756UL, 4950554UL, 6194948UL,
+ 6914304UL, 7502848UL, 7568128UL, 3372255013UL, 2667623458UL, 1258336554UL,
+ 218339638UL, 1212970UL, 2652433UL, 4029184UL, 5143552UL, 5995520UL,
+3540027412UL, 3070273808UL, 2013313045UL, 906012700UL, 151031338UL, 819489UL,
+ 1800202UL, 2978560UL, 4028416UL, 3640691978UL, 3338709252UL, 2566961664UL,
+1476442629UL, 654353681UL, 100699422UL, 491796UL, 1275908UL, 2257408UL,
+3590361856UL, 3321928704UL, 2483067904UL, 1728094720UL, 1006674432UL, 453023497UL,
+ 67144466UL, 427016UL, 1080064UL, 3540028672UL, 3170929920UL, 2365622016UL,
+1778421760UL, 1157664256UL, 671125504UL, 318804997UL, 50368008UL, 427776UL,
+3422586112UL, 2868936448UL, 2315288064UL, 1828750592UL, 1258324480UL, 822116864UL,
+ 520130048UL, 251696128UL, 38656UL, 2327904398UL, 15214693UL, 14771766UL,
+ 14449440UL, 13604369UL, 12297472UL, 11117312UL, 9348608UL, 7386880UL,
+2835814548UL, 505290396UL, 108031044UL, 60460574UL, 10723333UL, 9867264UL,
+ 8683776UL, 8290560UL, 6981376UL, 3271575886UL, 1510363734UL, 201547106UL,
+ 2779452UL, 4618269UL, 5604356UL, 6126336UL, 6322944UL, 5997824UL,
+3338687537UL, 2181259313UL, 1023437877UL, 218129981UL, 1074733UL, 2583569UL,
+ 3633664UL, 4356352UL, 4555008UL, 3472906782UL, 2566940189UL, 1560310301UL,
+ 771780640UL, 201353768UL, 484896UL, 1598984UL, 2583040UL, 3241216UL,
+3741343760UL, 2818598668UL, 1929408518UL, 1207989512UL, 620784908UL, 218130708UL,
+ 26384UL, 1009408UL, 1797120UL, 3925894916UL, 2919261952UL, 2113956096UL,
+1409314048UL, 905997568UL, 520121600UL, 218131461UL, 26880UL, 619264UL,
+4026559744UL, 2734711040UL, 2080399616UL, 1476421120UL, 1006659328UL, 704669952UL,
+ 419458304UL, 167800576UL, 30208UL, 3976228096UL, 2868931584UL, 2214620160UL,
+1610641408UL, 1124102144UL, 805335552UL, 553678848UL, 318798848UL, 33280UL,
+2730688596UL, 720830540UL, 16718132UL, 16729624UL, 15623173UL, 13398784UL,
+ 12289280UL, 11244544UL, 9281536UL, 3192390501UL, 1012795246UL, 59449934UL,
+ 11094818UL, 11494405UL, 10118912UL, 9266944UL, 8744192UL, 7697152UL,
+2819034461UL, 1308888178UL, 149UL, 3355457UL, 5196832UL, 6118660UL,
+ 6119424UL, 6187520UL, 5732352UL, 2835556922UL, 1761619265UL, 822095945UL,
+ 100678220UL, 1656112UL, 2839569UL, 3760128UL, 4024832UL, 3831040UL,
+2986358565UL, 2080389417UL, 1358970921UL, 721439014UL, 167790122UL, 674590UL,
+ 1659142UL, 2251264UL, 2582272UL, 3221241624UL, 2281717525UL, 1677739537UL,
+1107316493UL, 604000524UL, 218123280UL, 20750UL, 874240UL, 1466368UL,
+3523233036UL, 2533377540UL, 1828734976UL, 1308642816UL, 872436224UL, 520114432UL,
+ 218124032UL, 21760UL, 418816UL, 4127215360UL, 2667595776UL, 1929399040UL,
+1426084096UL, 1006654464UL, 704664576UL, 419452672UL, 167794432UL, 24576UL,
+4278210816UL, 2986365440UL, 2130728192UL, 1509971968UL, 1073765632UL, 771775744UL,
+ 553672192UL, 318792448UL, 27136UL, 3149594669UL, 1692467256UL, 369033261UL,
+ 16717077UL, 16724224UL, 15024128UL, 13586176UL, 12411136UL, 11433472UL,
+3596877886UL, 1836975165UL, 412287810UL, 11083301UL, 11875336UL, 10632960UL,
+ 9652224UL, 9326336UL, 9067264UL, 3122922309UL, 1781007185UL, 506331229UL,
+ 4591430UL, 6302496UL, 7355652UL, 7096320UL, 6967040UL, 6575872UL,
+2617510212UL, 1610614609UL, 771753054UL, 110UL, 2171185UL, 3421201UL,
+ 4146688UL, 4412416UL, 4349184UL, 2684558380UL, 1879055921UL, 1258299700UL,
+ 620765750UL, 100674100UL, 1061661UL, 1982216UL, 2443264UL, 2445824UL,
+2969576732UL, 2164271133UL, 1577069850UL, 1023422742UL, 570439956UL, 167786774UL,
+ 408080UL, 1065472UL, 1265408UL, 3338677520UL, 2332044812UL, 1761620741UL,
+1308637440UL, 872431360UL, 520110080UL, 201341956UL, 16132UL, 283136UL,
+3841995781UL, 2583704576UL, 1962948352UL, 1426079488UL, 1023427328UL, 721438208UL,
+ 419448320UL, 167789312UL, 18688UL, 4278204928UL, 3019913728UL, 2164276992UL,
+1560299008UL, 1107314944UL, 805326336UL, 570445312UL, 318787072UL, 20992UL,
+3283157026UL, 2295136294UL, 1039204384UL, 184483866UL, 16715013UL, 16720128UL,
+ 15216128UL, 14039296UL, 13191168UL, 3698524201UL, 2273837861UL, 966393897UL,
+ 111280172UL, 11868170UL, 11019520UL, 10104832UL, 9844480UL, 9911552UL,
+3644588076UL, 2269446194UL, 1028325432UL, 224067641UL, 6885920UL, 7481092UL,
+ 7484160UL, 7682304UL, 7749376UL, 2971140913UL, 2031681593UL, 1176240190UL,
+ 371327042UL, 3148340UL, 4333841UL, 4731648UL, 5192192UL, 5194496UL,
+2617443889UL, 1778386490UL, 1124074557UL, 553648962UL, 76UL, 1579296UL,
+ 2566152UL, 3028736UL, 3162112UL, 2818577184UL, 2063602978UL, 1459623969UL,
+ 956307745UL, 503323424UL, 117448480UL, 796434UL, 1388544UL, 1588224UL,
+3170900754UL, 2264931856UL, 1677730060UL, 1224746249UL, 822093832UL, 469773576UL,
+ 151006474UL, 208389UL, 473600UL, 3791659270UL, 2483037184UL, 1912612608UL,
+1459629312UL, 1023422720UL, 721433600UL, 419444480UL, 167785472UL, 14080UL,
+4278200064UL, 2885691136UL, 2214603520UL, 1660957440UL, 1174419712UL, 855653376UL,
+ 570441728UL, 352337920UL, 16896UL, 3349479445UL, 2780889109UL, 1692663828UL,
+ 771686417UL, 167706634UL, 16714240UL, 16586752UL, 15408896UL, 14821120UL,
+3749052442UL, 2542403605UL, 1369047065UL, 513998872UL, 10878998UL, 11080960UL,
+ 10624000UL, 10232832UL, 10692352UL, 3930652700UL, 2521890849UL, 1331298338UL,
+ 577372193UL, 7143457UL, 7738628UL, 7872768UL, 8071168UL, 8268544UL,
+3391423265UL, 2334654501UL, 1462763560UL, 725155880UL, 155189286UL, 4919056UL,
+ 5381888UL, 5777408UL, 6106624UL, 2920218661UL, 2064384045UL, 1360003117UL,
+ 806748205UL, 253296684UL, 2361632UL, 3217672UL, 3745536UL, 3944448UL,
+2768240677UL, 1962935337UL, 1308623913UL, 855639081UL, 452984874UL, 46UL,
+ 1184533UL, 1842944UL, 2239232UL, 3070233878UL, 2181042197UL, 1577063185UL,
+1124078353UL, 771757330UL, 402658836UL, 100669716UL, 466694UL, 862720UL,
+3741324550UL, 2466256900UL, 1828722944UL, 1358961664UL, 1023418112UL, 704651776UL,
+ 402662656UL, 151004160UL, 11008UL, 4278196480UL, 2734693120UL, 2080381952UL,
+1677730048UL, 1224746752UL, 872426240UL, 570437632UL, 352334080UL, 13056UL,
+3483369481UL, 3048538117UL, 2228420616UL, 1391919110UL, 687800320UL, 184483840UL,
+ 16712704UL, 16387840UL, 15734016UL, 3799711756UL, 2727149577UL, 1637613576UL,
+ 883228678UL, 312868870UL, 11011072UL, 10489856UL, 10426368UL, 11278592UL,
+4082368528UL, 2673344529UL, 1533083664UL, 879886348UL, 326303756UL, 7537670UL,
+ 8065792UL, 8460544UL, 8723200UL, 3845193748UL, 2570321942UL, 1664745493UL,
+ 927137810UL, 424411153UL, 5177358UL, 5771776UL, 6363392UL, 6757888UL,
+3474653205UL, 2367225882UL, 1629356057UL, 1025769496UL, 506069014UL, 120586262UL,
+ 3738629UL, 4331520UL, 4726528UL, 3171680281UL, 2215182368UL, 1510604830UL,
+1024262172UL, 604962844UL, 202506268UL, 1771026UL, 2429696UL, 2956800UL,
+3120562201UL, 2164261913UL, 1526727704UL, 1056965654UL, 671089689UL, 369098780UL,
+ 33UL, 855816UL, 1448704UL, 3640658441UL, 2382368009UL, 1728057093UL,
+1258295301UL, 905973765UL, 620761605UL, 318771206UL, 67113734UL, 400384UL,
+4278194176UL, 2734690816UL, 1912607488UL, 1459623168UL, 1207965696UL, 922753792UL,
+ 603986944UL, 318775040UL, 9472UL, 3550609408UL, 3283025920UL, 2798059520UL,
+2128871424UL, 1442775040UL, 822018048UL, 335478784UL, 16711680UL, 16713472UL,
+3883466752UL, 2995650560UL, 2023489536UL, 1235353600UL, 665583616UL, 263061504UL,
+ 10878976UL, 10488832UL, 11603200UL, 4200005637UL, 2824929280UL, 1785331712UL,
+1115160576UL, 578551808UL, 209584128UL, 8127488UL, 8457984UL, 8917504UL,
+4281794568UL, 2788950022UL, 1883439109UL, 1112276992UL, 626327552UL, 257359872UL,
+ 6095616UL, 6557696UL, 6951680UL, 4079026185UL, 2736914442UL, 1881669641UL,
+1227882502UL, 708182021UL, 322764804UL, 4194304UL, 4787456UL, 5182720UL,
+3977445385UL, 2618490893UL, 1880489996UL, 1259929609UL, 807272457UL, 421658633UL,
+ 103219208UL, 3016960UL, 3543552UL, 3741909002UL, 2433089553UL, 1762066446UL,
+1225326605UL, 805961741UL, 470614030UL, 151977998UL, 1573893UL, 1970176UL,
+3875536905UL, 2382365450UL, 1728054281UL, 1224737801UL, 822084361UL, 553648906UL,
+ 301989901UL, 18UL, 789760UL, 4278191872UL, 2919237888UL, 1929382400UL,
+1358957568UL, 1023413504UL, 771755776UL, 520097536UL, 251662080UL, 4864UL,
+3500539904UL, 3450535936UL, 3149398016UL, 2748448768UL, 2179465216UL, 1593769984UL,
+1023344640UL, 486473728UL, 16711680UL, 3934126080UL, 2978414592UL, 2174156800UL,
+1587478528UL, 1085145088UL, 716636160UL, 381550592UL, 113311744UL, 12779520UL,
+4283957248UL, 2942369792UL, 1835794432UL, 1232797696UL, 814022656UL, 461897728UL,
+ 176881664UL, 9240576UL, 9633792UL, 4282122240UL, 3024093184UL, 2068512768UL,
+1213464576UL, 777912320UL, 425787392UL, 124125184UL, 7077888UL, 7864320UL,
+4280745984UL, 2938765312UL, 2133852160UL, 1429798912UL, 859766784UL, 507904000UL,
+ 206241792UL, 5505024UL, 6160384UL, 4279828480UL, 2870673408UL, 2082340864UL,
+1428291584UL, 958922752UL, 573374464UL, 271777792UL, 3735552UL, 4521984UL,
+4279238656UL, 3020947456UL, 2115108864UL, 1427439616UL, 1008074752UL, 655949824UL,
+ 320602112UL, 69337088UL, 2949120UL, 4278648832UL, 3121020928UL, 2164719616UL,
+1426522112UL, 973668352UL, 654966784UL, 369885184UL, 151846912UL, 1572864UL,
+4278190080UL, 3187671040UL, 2113929216UL, 1459617792UL, 1006632960UL, 704643072UL,
+ 452984832UL, 218103808UL, 0UL
+};
+
+uint32_t ulMapDJ895_HB_KCMY[ 9*9*9 ]=
+{
+4074819328UL, 2530213376UL, 1420754432UL, 764542464UL, 477822464UL, 258866688UL,
+ 124255744UL, 23264768UL, 6422016UL, 4268472064UL, 2576481792UL, 1451818496UL,
+ 696188416UL, 325975552UL, 90635776UL, 23199232UL, 6422016UL, 5963264UL,
+4265913856UL, 3410541056UL, 1582748416UL, 861327104UL, 391568128UL, 38991616UL,
+ 5499136UL, 5495552UL, 5432320UL, 4264013312UL, 3760827392UL, 2117316096UL,
+1094299136UL, 540849920UL, 138000128UL, 3845120UL, 4172800UL, 4302592UL,
+4263027968UL, 3541736704UL, 2367658752UL, 1428464896UL, 690402304UL, 304528896UL,
+ 19510272UL, 2989312UL, 3182848UL, 4262173952UL, 3540884224UL, 2568132864UL,
+1729534208UL, 1008117504UL, 437634048UL, 102284800UL, 2073088UL, 2395392UL,
+4144206848UL, 3540292608UL, 2634584320UL, 1930137856UL, 1309382912UL, 705408000UL,
+ 218677504UL, 17740032UL, 1606912UL, 3758130432UL, 3405810176UL, 2768406528UL,
+2114159872UL, 1510246912UL, 973444096UL, 503491584UL, 67226368UL, 756992UL,
+3355473152UL, 3187702272UL, 2634052352UL, 1761632000UL, 1308645376UL, 855659520UL,
+ 570449664UL, 318803200UL, 42752UL, 4275270912UL, 2650705152UL, 1241425664UL,
+ 499696640UL, 178647552UL, 9436672UL, 8060416UL, 7601664UL, 6749696UL,
+4270030336UL, 2643103488UL, 1452253696UL, 813809152UL, 376560384UL, 40304128UL,
+ 6422016UL, 6022144UL, 5886720UL, 4266102016UL, 3360591616UL, 1868010496UL,
+1012306944UL, 509124608UL, 123055616UL, 5286912UL, 5351680UL, 5286912UL,
+4264200192UL, 3190783488UL, 1966374400UL, 1178043136UL, 624659712UL, 221876480UL,
+ 3840256UL, 4036096UL, 4300032UL, 4263020544UL, 2971367936UL, 2115991296UL,
+1394768896UL, 757433600UL, 354781184UL, 36080896UL, 2852096UL, 3114240UL,
+4228614144UL, 2886564352UL, 2198829568UL, 1527936768UL, 957643776UL, 471172352UL,
+ 135692544UL, 1866752UL, 2257664UL, 3825369344UL, 2801954048UL, 2198040320UL,
+1594191104UL, 1124626688UL, 638153984UL, 235502080UL, 17659136UL, 1469696UL,
+3288363264UL, 2566939136UL, 2197840384UL, 1728079360UL, 1291872000UL, 805398784UL,
+ 436301056UL, 84047104UL, 681728UL, 3070257408UL, 2566938112UL, 2315280128UL,
+1862295808UL, 1442865408UL, 1040212224UL, 654336512UL, 302016768UL, 29440UL,
+4276114944UL, 2852018688UL, 1375623680UL, 618949888UL, 196379904UL, 10328832UL,
+ 9547264UL, 8769280UL, 7599872UL, 4270939648UL, 3130285312UL, 1654807040UL,
+ 848390400UL, 394623488UL, 24807424UL, 7180544UL, 6922240UL, 6400256UL,
+4266875392UL, 3545716992UL, 1969055232UL, 1012295424UL, 525826560UL, 122849280UL,
+ 5148416UL, 5148928UL, 5083392UL, 4264386304UL, 3123863296UL, 1966366464UL,
+1194877440UL, 658270976UL, 238711552UL, 3833344UL, 3965184UL, 4098048UL,
+4263142912UL, 2887605760UL, 2115984896UL, 1377984768UL, 757360384UL, 354707200UL,
+ 36007168UL, 2781440UL, 3110144UL, 3909905152UL, 2769117440UL, 2081251072UL,
+1427136256UL, 890461952UL, 454254848UL, 135553536UL, 1662720UL, 2187776UL,
+3540150528UL, 2684443904UL, 2080463104UL, 1493326336UL, 1023695360UL, 604396032UL,
+ 218586368UL, 17521920UL, 1334016UL, 3019923200UL, 2432717824UL, 2046841600UL,
+1560302592UL, 1174426880UL, 738219008UL, 402675456UL, 67197440UL, 611840UL,
+2885704192UL, 2399163136UL, 2046841088UL, 1677742592UL, 1325421056UL, 973099520UL,
+ 637555456UL, 302011392UL, 22528UL, 4276369664UL, 3036429312UL, 1543388928UL,
+ 788414720UL, 281760256UL, 28205568UL, 10056960UL, 9538816UL, 8493824UL,
+4271128064UL, 3079750656UL, 1737901312UL, 1049905152UL, 462246656UL, 42294016UL,
+ 8153344UL, 7435520UL, 6585344UL, 4267065600UL, 3076080896UL, 1834501632UL,
+1096501248UL, 526274304UL, 106780160UL, 5922304UL, 5794048UL, 5336320UL,
+4264771584UL, 3073918464UL, 2000242432UL, 1262439424UL, 692015360UL, 255612672UL,
+ 20668160UL, 3892736UL, 4025088UL, 4263332096UL, 2887731200UL, 2116110592UL,
+1411664640UL, 791039744UL, 371609344UL, 36131840UL, 2840832UL, 3104512UL,
+3758968832UL, 2769177088UL, 2047756544UL, 1410353664UL, 890456832UL, 454315008UL,
+ 135614208UL, 1724928UL, 2249984UL, 3355661056UL, 2634173184UL, 2046969856UL,
+1459832832UL, 973359360UL, 587614464UL, 235359232UL, 17517824UL, 1330688UL,
+2919256320UL, 2399159808UL, 1929397248UL, 1476412672UL, 1090536704UL, 721437952UL,
+ 402671616UL, 67193344UL, 542976UL, 2768260608UL, 2365605632UL, 1929397248UL,
+1560298496UL, 1224754176UL, 905986816UL, 603997184UL, 302007808UL, 18176UL,
+4275249664UL, 3202622464UL, 1810704128UL, 1005726208UL, 552152064UL, 113523712UL,
+ 10965248UL, 10183680UL, 9072384UL, 4270794240UL, 2928290048UL, 1905536256UL,
+1167339776UL, 630797056UL, 143735808UL, 8932864UL, 7689728UL, 7299328UL,
+4267321856UL, 2925210880UL, 1901932288UL, 1214329344UL, 644297984UL, 157694720UL,
+ 6375168UL, 5984256UL, 5789440UL, 4231605504UL, 2805739264UL, 1967075328UL,
+1346581248UL, 709309696UL, 239483136UL, 4538880UL, 4540928UL, 4477184UL,
+4263586560UL, 2888052480UL, 2166764032UL, 1462252544UL, 841560832UL, 388577536UL,
+ 53034752UL, 2836224UL, 3099904UL, 3977261568UL, 2802921728UL, 2115056128UL,
+1427321856UL, 907359232UL, 487995136UL, 135805440UL, 1851392UL, 2246400UL,
+3355785472UL, 2600744448UL, 2047096064UL, 1443116032UL, 956642304UL, 587675392UL,
+ 235419904UL, 17579264UL, 1327104UL, 3019915264UL, 2365601792UL, 1929393664UL,
+1459631360UL, 1056978176UL, 704656640UL, 385890304UL, 67188992UL, 473600UL,
+2684370944UL, 2231384576UL, 1862285056UL, 1493186048UL, 1157641984UL, 838874368UL,
+ 587216128UL, 302003712UL, 14592UL, 4275508224UL, 3488158976UL, 2130122240UL,
+1190599168UL, 704060672UL, 368517120UL, 63450368UL, 11289344UL, 10180096UL,
+4271117824UL, 2978814208UL, 2089884416UL, 1251221248UL, 714678528UL, 379265792UL,
+ 43068672UL, 8601344UL, 8015616UL, 4267645440UL, 2891848704UL, 2002853376UL,
+1298210560UL, 711533056UL, 325788672UL, 23538944UL, 6438144UL, 6244352UL,
+3913162240UL, 2772377344UL, 1967267840UL, 1346576896UL, 776479744UL, 340403200UL,
+ 21769216UL, 4929536UL, 4800512UL, 3542491136UL, 2636587264UL, 1999184384UL,
+1395335936UL, 841688064UL, 405742592UL, 36710656UL, 3354880UL, 3422464UL,
+4145356288UL, 2836734208UL, 2115379712UL, 1427514112UL, 957883392UL, 538649088UL,
+ 135997696UL, 1978112UL, 2373376UL, 3909624832UL, 2768708352UL, 2080777216UL,
+1443243008UL, 973546496UL, 604579328UL, 235612416UL, 929024UL, 1389056UL,
+3472960256UL, 2566924288UL, 1895835392UL, 1442850560UL, 1056974592UL, 687876096UL,
+ 369109248UL, 67185152UL, 535808UL, 2768252928UL, 2231381248UL, 1795173120UL,
+1459628544UL, 1157638912UL, 788539648UL, 553658624UL, 268445952UL, 11008UL,
+4275243520UL, 3841395200UL, 2415790592UL, 1342049024UL, 704515584UL, 385748736UL,
+ 167646208UL, 32318464UL, 11613952UL, 4271246080UL, 3079605248UL, 2173766912UL,
+1436094208UL, 765268480UL, 463606784UL, 228595200UL, 26485760UL, 9057536UL,
+4267970048UL, 2892041984UL, 1935609344UL, 1399066624UL, 761991936UL, 376247296UL,
+ 107812352UL, 7152640UL, 6763520UL, 3829666048UL, 2722304512UL, 1967395328UL,
+1346704128UL, 826938368UL, 407573760UL, 89069056UL, 5186304UL, 5189632UL,
+3542750208UL, 2603160576UL, 1965757440UL, 1361908992UL, 858658048UL, 472978944UL,
+ 104208384UL, 3744256UL, 3812352UL, 3608745216UL, 2484671744UL, 1830360320UL,
+1343821056UL, 924587520UL, 538842624UL, 153229312UL, 2366976UL, 2697216UL,
+4262138624UL, 2768901120UL, 1997149440UL, 1443566848UL, 1007359488UL, 621549568UL,
+ 336598528UL, 1187072UL, 1582336UL, 4261550080UL, 2717980416UL, 1962940416UL,
+1459624192UL, 1073748480UL, 687872512UL, 352393728UL, 50470144UL, 663808UL,
+3238010880UL, 2315263744UL, 1761615616UL, 1426071552UL, 1124081664UL, 771759616UL,
+ 503324160UL, 251665920UL, 8192UL, 4274521088UL, 4278059520UL, 2851996160UL,
+1576927488UL, 670957824UL, 285082368UL, 83756032UL, 33425664UL, 15865856UL,
+4271571968UL, 3079734016UL, 2325283584UL, 1604453376UL, 900269312UL, 531171328UL,
+ 313395456UL, 178719744UL, 9836032UL, 4268557568UL, 2892367104UL, 2087060480UL,
+1500185600UL, 930153728UL, 477300736UL, 192350208UL, 58002176UL, 7412480UL,
+4148758016UL, 2806384384UL, 2001143296UL, 1397294592UL, 944571904UL, 474875904UL,
+ 139593728UL, 5508096UL, 5380864UL, 3677161728UL, 2603354368UL, 1932331008UL,
+1362036736UL, 892340224UL, 523503616UL, 137955328UL, 3869952UL, 4201472UL,
+3759934208UL, 2518354688UL, 1830488576UL, 1327302912UL, 908003840UL, 555813376UL,
+ 186911232UL, 2756352UL, 2956032UL, 3909946368UL, 2399931136UL, 1728842496UL,
+1326254848UL, 940444416UL, 605096704UL, 269748992UL, 1576448UL, 1906688UL,
+4261677312UL, 2801993984UL, 1996622336UL, 1476528896UL, 1073875712UL, 687999744UL,
+ 369363968UL, 134613504UL, 791552UL, 4261416448UL, 2600472320UL, 1862275072UL,
+1426067968UL, 1124078336UL, 754979584UL, 486543872UL, 234885376UL, 4608UL,
+4275503104UL, 4277600256UL, 3204317184UL, 1946025984UL, 1040056320UL, 486408192UL,
+ 184418304UL, 83755008UL, 16646144UL, 4271243264UL, 3365142528UL, 2610757632UL,
+1974206464UL, 1253703680UL, 617545728UL, 349110272UL, 231407616UL, 12648448UL,
+4268687360UL, 3026780160UL, 2238382080UL, 1651310592UL, 1182072832UL, 612237312UL,
+ 327221248UL, 176226304UL, 8126464UL, 3829989376UL, 2840133632UL, 2118778880UL,
+1481375744UL, 1078853632UL, 609288192UL, 240517120UL, 72941568UL, 5832704UL,
+3073048576UL, 2687303680UL, 1999568896UL, 1395720192UL, 959578112UL, 607518720UL,
+ 238747648UL, 21037056UL, 4718592UL, 2719350784UL, 2316959744UL, 1797062656UL,
+1344143360UL, 908132352UL, 572653568UL, 254148608UL, 19595264UL, 3473408UL,
+2567307264UL, 1963458560UL, 1561001984UL, 1259143168UL, 923795456UL, 605224960UL,
+ 286654464UL, 18481152UL, 2359296UL, 3288334336UL, 2281766912UL, 1627521024UL,
+1275199488UL, 922943488UL, 604307456UL, 352780288UL, 50987008UL, 1179648UL,
+4261412864UL, 3019898880UL, 2080374784UL, 1560281088UL, 1207959552UL, 838860800UL,
+ 536870912UL, 234881024UL, 0
+};
+
+uint32_t ulMapDJ895_Binary_KCMY[ 9*9*9 ]=
+{
+1819176648UL, 64158794UL, 80805158UL, 80215318UL, 62389519UL, 61406730UL,
+ 60292615UL, 42401028UL, 7601920UL, 4230922301UL, 571406681UL, 160889651UL,
+ 113048859UL, 62717200UL, 45415944UL, 27917573UL, 10419457UL, 9238272UL,
+4248940557UL, 3743081259UL, 790296119UL, 325515810UL, 127007505UL, 27196678UL,
+ 10483712UL, 10286592UL, 9628672UL, 4248283651UL, 4214473229UL, 2871125529UL,
+1077076501UL, 592700938UL, 275180291UL, 7331584UL, 8312576UL, 8770816UL,
+4247430912UL, 4247433730UL, 3978417159UL, 2317998598UL, 1111022339UL, 524081152UL,
+ 172217600UL, 5293312UL, 6668032UL, 4263158272UL, 4246448128UL, 4195927810UL,
+3021655296UL, 1747244032UL, 858642176UL, 338350592UL, 53332736UL, 4176640UL,
+4245529856UL, 4245661184UL, 4195203328UL, 3406608128UL, 2181939712UL, 1108266752UL,
+ 488232192UL, 135910656UL, 2344448UL, 4278233344UL, 4194346240UL, 4160794112UL,
+3691491584UL, 2701570560UL, 1661192448UL, 772069888UL, 286188288UL, 1039104UL,
+4278236928UL, 4278234368UL, 4278234624UL, 3842026752UL, 3070273792UL, 2214639616UL,
+1325453056UL, 604038400UL, 65280UL, 3422292824UL, 570249275UL, 234730018UL,
+ 117300502UL, 133429773UL, 64748809UL, 13040645UL, 11859712UL, 9952512UL,
+4252725022UL, 1819700817UL, 315878447UL, 131267353UL, 63241741UL, 45481478UL,
+ 11140354UL, 9961216UL, 8514560UL, 4233722368UL, 4031032611UL, 1430764332UL,
+ 713808663UL, 178123020UL, 27261699UL, 10089728UL, 9497600UL, 8577280UL,
+4248534272UL, 4231900167UL, 3427192076UL, 1565246476UL, 862178052UL, 309054976UL,
+ 7195648UL, 8047360UL, 8178944UL, 4280780288UL, 4247430912UL, 3911826179UL,
+2469969152UL, 1380369664UL, 625064704UL, 172013056UL, 5156608UL, 6468864UL,
+4279732480UL, 4245854464UL, 3994202112UL, 2719262208UL, 1545120512UL, 706719232UL,
+ 304261888UL, 2598400UL, 3974656UL, 4245326336UL, 4194341376UL, 3791690496UL,
+2868942592UL, 1980079616UL, 1024042752UL, 437168128UL, 101885440UL, 2204672UL,
+4278225408UL, 3724576256UL, 3372254720UL, 2868938752UL, 2281736960UL, 1442878976UL,
+ 738239232UL, 201566976UL, 961024UL, 4278227968UL, 3422586112UL, 3204482304UL,
+2936047360UL, 2516617216UL, 1912639232UL, 1191223040UL, 587248128UL, 47616UL,
+4143384622UL, 1761417770UL, 570245662UL, 285052180UL, 100517646UL, 65927685UL,
+ 15659008UL, 13556992UL, 11649792UL, 4255794442UL, 3117885236UL, 619931177UL,
+ 251246867UL, 183889409UL, 14611712UL, 13038080UL, 11658752UL, 9819648UL,
+4250947840UL, 4152519951UL, 2223998487UL, 1539817476UL, 565827328UL, 10543872UL,
+ 9888000UL, 9035264UL, 7918848UL, 4248655360UL, 4249843456UL, 3360984842UL,
+2222566402UL, 930062592UL, 258780928UL, 7255808UL, 7716608UL, 7455488UL,
+4264058368UL, 4247484160UL, 3727922432UL, 2335476992UL, 1211929344UL, 557683456UL,
+ 121673472UL, 5152000UL, 6138112UL, 4279920640UL, 4262820096UL, 3641935104UL,
+2534834944UL, 1578993664UL, 757041664UL, 304252928UL, 2657280UL, 4035584UL,
+4278807552UL, 4194333696UL, 3489691904UL, 2583721728UL, 1795586560UL, 990347520UL,
+ 420250624UL, 85034496UL, 2132224UL, 4278219008UL, 3691014144UL, 3036703744UL,
+2566942464UL, 2013294848UL, 1308652800UL, 704676096UL, 184583424UL, 755712UL,
+4194334208UL, 3338692864UL, 2868931840UL, 2566942720UL, 2181066752UL, 1694527744UL,
+1107328000UL, 570461184UL, 36608UL, 4259653128UL, 2868776476UL, 1190993687UL,
+ 587021071UL, 217936651UL, 33203202UL, 15841280UL, 14333184UL, 12625664UL,
+4273417220UL, 3891139612UL, 1442324508UL, 502942735UL, 133794818UL, 15248640UL,
+ 14334976UL, 13419264UL, 11713280UL, 4269093632UL, 4221780741UL, 3100072454UL,
+1304584967UL, 415074560UL, 11444992UL, 11319552UL, 10601216UL, 9486080UL,
+4265819136UL, 4250684928UL, 3480444418UL, 1954444800UL, 913862912UL, 292718592UL,
+ 7248640UL, 7515648UL, 7255296UL, 4247405312UL, 4247801344UL, 3711721984UL,
+2403362048UL, 1296262912UL, 574975488UL, 105150208UL, 5212160UL, 5806592UL,
+4263201280UL, 4263203328UL, 3709623808UL, 2552128512UL, 1579180800UL, 790914560UL,
+ 287729920UL, 2912512UL, 4161280UL, 4245310976UL, 4228207872UL, 3489682688UL,
+2550422784UL, 1745378816UL, 1007378688UL, 420373760UL, 68315136UL, 2191872UL,
+4278211584UL, 3825226240UL, 3103806464UL, 2499828736UL, 1929403904UL, 1308646912UL,
+ 687891200UL, 167798016UL, 682752UL, 4160772864UL, 3405795840UL, 2885703424UL,
+2449497600UL, 2097176832UL, 1610637568UL, 1073767168UL, 553675776UL, 28160UL,
+4276100357UL, 3590196752UL, 1912410896UL, 972890377UL, 519910147UL, 49830913UL,
+ 15697664UL, 14455808UL, 13077504UL, 4257226242UL, 4159906309UL, 2264535568UL,
+ 955917063UL, 318322689UL, 15294720UL, 14451968UL, 13932288UL, 12818688UL,
+4287243264UL, 4256376834UL, 3403102720UL, 1607350274UL, 617432320UL, 12148224UL,
+ 12288512UL, 12163584UL, 11313920UL, 4283377152UL, 4268043520UL, 3582212864UL,
+2004891648UL, 897729280UL, 243160832UL, 8483840UL, 8752896UL, 8429056UL,
+4264307712UL, 4265096192UL, 3695459841UL, 2387099392UL, 1196049920UL, 558648576UL,
+ 88759296UL, 5469440UL, 5802496UL, 4280169472UL, 4263459072UL, 3659611904UL,
+2569158912UL, 1596409088UL, 824788992UL, 288050432UL, 3233792UL, 4222208UL,
+4245371648UL, 4228463872UL, 3590995712UL, 2634694912UL, 1762477056UL, 1024476672UL,
+ 454183424UL, 68439296UL, 2448128UL, 4278206208UL, 3909106944UL, 3238018560UL,
+2566931200UL, 1912621056UL, 1275086848UL, 687885056UL, 184569088UL, 742400UL,
+4043326464UL, 3372236288UL, 2902475008UL, 2499823360UL, 2063618048UL, 1560301824UL,
+1090539776UL, 570447104UL, 22016UL, 4275835907UL, 4043119616UL, 2784892929UL,
+1375606275UL, 654187008UL, 184294912UL, 15746304UL, 14379264UL, 13202688UL,
+4274394113UL, 4227209216UL, 3053196800UL, 1375344384UL, 402265856UL, 15737600UL,
+ 14305536UL, 13790208UL, 12941568UL, 4271446016UL, 4223538689UL, 3234600704UL,
+1707743744UL, 684662528UL, 63252480UL, 12668160UL, 12545024UL, 12024832UL,
+4284291584UL, 4268891136UL, 3448184064UL, 2038897664UL, 948707584UL, 260909824UL,
+ 9258496UL, 9987840UL, 9993984UL, 4281867264UL, 4265615360UL, 3628737280UL,
+2370708224UL, 1330915328UL, 542519040UL, 55852544UL, 6576640UL, 7042048UL,
+4280427008UL, 4247004160UL, 3643155456UL, 2502436096UL, 1563240960UL, 741222912UL,
+ 271660032UL, 3556608UL, 4480768UL, 4279182848UL, 4212074240UL, 3507431424UL,
+2601462272UL, 1746021376UL, 1007955712UL, 454373888UL, 51852800UL, 2705664UL,
+4278201344UL, 3942656768UL, 3238013696UL, 2583702528UL, 1912614912UL, 1174417920UL,
+ 620770048UL, 151008256UL, 868352UL, 3724555008UL, 3221237504UL, 2818584320UL,
+2449486592UL, 2030057728UL, 1543519744UL, 1056980992UL, 570441984UL, 16896UL,
+4258860033UL, 4160293632UL, 3170699520UL, 1660750336UL, 738069248UL, 201198336UL,
+ 16256768UL, 14824960UL, 13522176UL, 4257745665UL, 4226745857UL, 3220308480UL,
+1609499648UL, 535758592UL, 15403264UL, 14752256UL, 13843200UL, 13261056UL,
+4255321344UL, 4173399296UL, 3082880256UL, 1841497856UL, 751176192UL, 79956480UL,
+ 12853248UL, 12795904UL, 12475136UL, 4251717120UL, 4219341568UL, 3213428736UL,
+2055866880UL, 1016007936UL, 261426944UL, 10166016UL, 10698496UL, 10705408UL,
+4282454272UL, 4249227520UL, 3477868032UL, 2337542144UL, 1331368192UL, 576591360UL,
+ 73473536UL, 7486464UL, 8279552UL, 4280685824UL, 4230419968UL, 3525972992UL,
+2519602176UL, 1580537344UL, 825628672UL, 255401472UL, 4337920UL, 5458688UL,
+4279637504UL, 4212528640UL, 3423737088UL, 2584942080UL, 1746343424UL, 957945344UL,
+ 505355520UL, 35529472UL, 3095296UL, 4194309888UL, 3959429376UL, 3271563520UL,
+2566920704UL, 1845500416UL, 1174674944UL, 637870080UL, 218571008UL, 1191424UL,
+3573555968UL, 3103793408UL, 2734694656UL, 2365596160UL, 1962943744UL, 1476405248UL,
+ 989867008UL, 536882176UL, 11776UL, 4208197632UL, 4227006464UL, 3489595392UL,
+2113536000UL, 955777024UL, 419169024UL, 50135552UL, 16059136UL, 14298112UL,
+4291166208UL, 3973513216UL, 3151429632UL, 2044329984UL, 903675904UL, 266272768UL,
+ 14616064UL, 14160384UL, 13512448UL, 4289003520UL, 3836936192UL, 2930966528UL,
+2109145088UL, 1018953728UL, 314572800UL, 12649984UL, 12916480UL, 12793088UL,
+4201906176UL, 3900702720UL, 2978611200UL, 2139881472UL, 1217462272UL, 429260800UL,
+ 10159104UL, 11148032UL, 11417600UL, 4249355008UL, 4081647616UL, 3209887744UL,
+2254045184UL, 1365114880UL, 627311104UL, 74056704UL, 8198912UL, 8992768UL,
+4247389696UL, 4180346112UL, 3425633280UL, 2486436864UL, 1631192064UL, 842925568UL,
+ 272631808UL, 4986880UL, 6305024UL, 4279634432UL, 4145482496UL, 3356952576UL,
+2585331456UL, 1780287488UL, 1008732416UL, 472124416UL, 2363392UL, 3746560UL,
+4245097216UL, 4043770880UL, 3338996224UL, 2634353408UL, 1913064192UL, 1191709696UL,
+ 621481216UL, 370546176UL, 1646080UL, 3825209856UL, 3338670592UL, 2868908800UL,
+2365592320UL, 1946162176UL, 1426068480UL, 939529728UL, 503322368UL, 6400UL,
+4293197824UL, 4226744320UL, 3639410688UL, 2582380544UL, 1475215360UL, 753991680UL,
+ 318111744UL, 100204544UL, 16711680UL, 4223860736UL, 3602972672UL, 3049521152UL,
+2362048512UL, 1406140416UL, 684982272UL, 265814016UL, 14352384UL, 14417920UL,
+4020436992UL, 3483893760UL, 2896822272UL, 2309947392UL, 1488191488UL, 733544448UL,
+ 280756224UL, 12713984UL, 13041664UL, 3799646208UL, 3431137280UL, 2878078976UL,
+2291204096UL, 1586757632UL, 832176128UL, 312279040UL, 10878976UL, 11665408UL,
+3763470336UL, 3394633728UL, 2908749824UL, 2288648192UL, 1651310592UL, 963706880UL,
+ 360054784UL, 8323072UL, 9634560UL, 3912433664UL, 3442802688UL, 2956591104UL,
+2403467264UL, 1766326272UL, 1078722560UL, 474873856UL, 5505024UL, 7013632UL,
+4162584576UL, 3692888064UL, 3005218816UL, 2418212864UL, 1881604096UL, 1194065920UL,
+ 590348288UL, 120782848UL, 4457216UL, 4278779904UL, 3959422976UL, 3255238656UL,
+2617769984UL, 1980366848UL, 1292828672UL, 672202752UL, 236126208UL, 2228224UL,
+4278190080UL, 3657433088UL, 3120562176UL, 2634022912UL, 2030043136UL, 1493172224UL,
+ 905969664UL, 402653184UL, 0
+};
+
+uint32_t ulMapDJ895_KCMY[ 9*9*9 ]=
+{
+1819176703UL, 79494215UL, 112983330UL, 79035667UL, 78183948UL, 60489224UL, 59571718UL, 42007811UL, 7405312UL,
+4230922555UL, 655358293UL, 176553263UL, 128253208UL, 61209869UL, 60751368UL, 26606852UL, 9305345UL, 8650496UL,
+4248940299UL, 3776766759UL, 756415798UL, 308083743UL, 142671120UL, 59440646UL, 9239553UL, 9109248UL, 8779520UL,
+4248086274UL, 4214276619UL, 2786390812UL, 942206231UL, 491516427UL, 224131588UL, 6616320UL, 7399168UL, 7857664UL,
+4264010752UL, 4247302401UL, 4011647240UL, 2148919051UL, 993059843UL, 507241472UL, 138274048UL, 4837888UL, 5950720UL,
+4262961664UL, 4246251520UL, 4229221122UL, 3239632384UL, 1763828224UL, 723902208UL, 304536064UL, 2674688UL, 3916800UL,
+4278952960UL, 4245530112UL, 4245339136UL, 3641362432UL, 2265566208UL, 1108008960UL, 437574912UL, 119069440UL, 2280192UL,
+4278233600UL, 4211122944UL, 4278235392UL, 3825252352UL, 2785196032UL, 1677774080UL, 738253824UL, 302835968UL, 1039616UL,
+4278236928UL, 4278234112UL, 4278234368UL, 3942690560UL, 3204492544UL, 2281749504UL, 1359008000UL, 620816128UL, 65280UL,
+3422292824UL, 536567352UL, 217763358UL, 133298706UL, 47578636UL, 46333448UL, 11795717UL, 11009281UL, 9365504UL,
+4252790811UL, 1819700817UL, 230487086UL, 112721175UL, 61734412UL, 60882438UL, 9829634UL, 9043712UL, 7992832UL,
+4233393664UL, 4064522015UL, 1346225965UL, 528017689UL, 126482957UL, 25951492UL, 8978176UL, 8648448UL, 7924992UL,
+4248074240UL, 4231703558UL, 3409695758UL, 1430441485UL, 811653892UL, 308602880UL, 6545664UL, 7133696UL, 7395840UL,
+4263805952UL, 4264010752UL, 4028613125UL, 2553530624UL, 1245367297UL, 524010752UL, 54051840UL, 4767488UL, 5883136UL,
+4279601152UL, 4245789184UL, 4161583616UL, 2886710016UL, 1544795648UL, 689813504UL, 253801216UL, 2600448UL, 3780608UL,
+4245129216UL, 4211118848UL, 3942687488UL, 3036717056UL, 2013308416UL, 1023652608UL, 369865216UL, 68201984UL, 2205952UL,
+4278225408UL, 3791685632UL, 3456142080UL, 3003157760UL, 2365624576UL, 1509989376UL, 755018496UL, 167817216UL, 897024UL,
+4278227456UL, 3456141056UL, 3288369152UL, 3019933952UL, 2617281536UL, 1979749120UL, 1224778496UL, 587248896UL, 48640UL,
+4143384622UL, 1744640554UL, 519916828UL, 184397586UL, 50262795UL, 64486664UL, 14285826UL, 12842496UL, 10868224UL,
+4255729162UL, 3084330804UL, 569604134UL, 251059983UL, 98368262UL, 13040899UL, 11861760UL, 10745856UL, 9232896UL,
+4250816512UL, 4135742478UL, 2223998487UL, 1253754887UL, 228518406UL, 9499904UL, 8974336UL, 8383744UL, 7593472UL,
+4248392704UL, 4249515008UL, 3461321226UL, 2172105475UL, 879538176UL, 191088128UL, 6606080UL, 7000064UL, 6868992UL,
+4280572928UL, 4264064512UL, 3928660994UL, 2402325760UL, 1195023616UL, 490381056UL, 54176256UL, 4829184UL, 5683456UL,
+4279723264UL, 4262689024UL, 3926823168UL, 2702347776UL, 1629131520UL, 723292928UL, 253662208UL, 2594816UL, 3842560UL,
+4278676224UL, 4278220032UL, 3674242816UL, 2785051136UL, 1845527040UL, 990088448UL, 403214336UL, 34442752UL, 2069504UL,
+4278219264UL, 3741346560UL, 3120591104UL, 2701161984UL, 2147514624UL, 1426095872UL, 755010048UL, 184585728UL, 692224UL,
+4278220544UL, 3439356672UL, 2952818944UL, 2667607552UL, 2298509056UL, 1795193088UL, 1157661440UL, 587239936UL, 37632UL,
+4259653128UL, 2868776476UL, 1174216726UL, 519914253UL, 134125065UL, 16439296UL, 15459328UL, 13752320UL, 11977728UL,
+4273417220UL, 3891139612UL, 1375215645UL, 418995213UL, 49524481UL, 14866176UL, 13754624UL, 12442880UL, 10931968UL,
+4269093120UL, 4221780741UL, 3066452487UL, 1153592327UL, 280338688UL, 10863360UL, 10408704UL, 9688832UL, 8900864UL,
+4265753600UL, 4250487808UL, 3530710787UL, 1954444800UL, 813005824UL, 174693632UL, 6993152UL, 7062272UL, 6931456UL,
+4280828416UL, 4247604224UL, 3946407424UL, 2470209280UL, 1262513408UL, 507607040UL, 54495744UL, 4955392UL, 5549056UL,
+4263135488UL, 4263006720UL, 4028065024UL, 2686019584UL, 1629382400UL, 773942784UL, 253850368UL, 2851072UL, 3969280UL,
+4245245184UL, 4211101952UL, 3842006784UL, 2701156864UL, 1829069568UL, 1023961088UL, 403467008UL, 814336UL, 2195200UL,
+4278211840UL, 3892335360UL, 3238024960UL, 2617270528UL, 2046846208UL, 1392534784UL, 721447424UL, 184577536UL, 684544UL,
+4160773120UL, 3506459648UL, 3003144704UL, 2566939392UL, 2181064448UL, 1694524928UL, 1124100608UL, 570455040UL, 29696UL,
+4276100357UL, 3573419536UL, 1895633680UL, 939336200UL, 452802307UL, 16152576UL, 15248896UL, 14072320UL, 12693248UL,
+4257226242UL, 4159906309UL, 2281312784UL, 905585670UL, 217727746UL, 15105792UL, 14331392UL, 13745920UL, 12433664UL,
+4287243264UL, 4256376834UL, 3403102720UL, 1557018882UL, 449465600UL, 12156160UL, 12298752UL, 11779072UL, 10665472UL,
+4283377152UL, 4268043520UL, 3582212864UL, 1988114432UL, 797067776UL, 142174720UL, 8163072UL, 8431872UL, 8107264UL,
+4264307712UL, 4265030400UL, 3745725441UL, 2420391680UL, 1196049920UL, 491344896UL, 38169088UL, 5277952UL, 5676800UL,
+4263261184UL, 4263393280UL, 3827318784UL, 2703311360UL, 1646610176UL, 807947008UL, 220681216UL, 3237376UL, 4160768UL,
+4245371392UL, 4245110016UL, 3876012288UL, 2835956992UL, 1879722240UL, 1057835776UL, 420433920UL, 34690304UL, 2385920UL,
+4278206208UL, 3959438848UL, 3372236800UL, 2701149696UL, 2046840064UL, 1375751936UL, 721441024UL, 184570880UL, 744448UL,
+4076880896UL, 3456122880UL, 3019916032UL, 2634042112UL, 2181059840UL, 1660966656UL, 1157650176UL, 587225856UL, 23808UL,
+4275835907UL, 4043119616UL, 2784892929UL, 1358829315UL, 603855360UL, 150741248UL, 15621120UL, 14257152UL, 12949760UL,
+4274394113UL, 4227209216UL, 3069974272UL, 1375344384UL, 335157248UL, 15411712UL, 14508800UL, 14062848UL, 13083392UL,
+4271446016UL, 4223538689UL, 3234600704UL, 1690966528UL, 550379520UL, 12791808UL, 12872192UL, 12949248UL, 12297984UL,
+4284291584UL, 4268891136UL, 3448184064UL, 2038897664UL, 898441472UL, 160182784UL, 9593344UL, 10258944UL, 9870848UL,
+4265024512UL, 4265484288UL, 3628671744UL, 2370708224UL, 1330915328UL, 458502656UL, 5458688UL, 6451456UL, 6785536UL,
+4280427008UL, 4263715584UL, 3727172864UL, 2552701952UL, 1580018176UL, 758065920UL, 237976064UL, 3625472UL, 4484608UL,
+4245628160UL, 4245563136UL, 3708758272UL, 2735614720UL, 1863331328UL, 1041445376UL, 437531904UL, 35077376UL, 2708224UL,
+4278201344UL, 3992988672UL, 3355454464UL, 2717920768UL, 2063610624UL, 1308636928UL, 687879936UL, 167786752UL, 869888UL,
+3774886912UL, 3288346624UL, 2919247872UL, 2566927616UL, 2181053440UL, 1660961536UL, 1140868096UL, 603997696UL, 18176UL,
+4258860033UL, 4160293632UL, 3170699520UL, 1660750336UL, 738069504UL, 201198336UL, 16192256UL, 14632192UL, 13398784UL,
+4257745665UL, 4226745857UL, 3220308480UL, 1609499648UL, 519046912UL, 15404032UL, 14622976UL, 14045184UL, 13400832UL,
+4255321344UL, 4173399296UL, 3082880256UL, 1841497856UL, 734464512UL, 63245568UL, 12986368UL, 13195264UL, 12812800UL,
+4251717120UL, 4219341568UL, 3213428736UL, 2055866880UL, 1016073472UL, 261492480UL, 10496256UL, 11098624UL, 11239936UL,
+4248834304UL, 4249227520UL, 3477868032UL, 2337542144UL, 1331368192UL, 526325248UL, 6497280UL, 7885312UL, 8549376UL,
+4280685824UL, 4247196672UL, 3542750208UL, 2536379136UL, 1614091776UL, 808916992UL, 205005312UL, 4472320UL, 5463552UL,
+4279637504UL, 4229240832UL, 3490911488UL, 2635339520UL, 1779897856UL, 974723328UL, 505355520UL, 1910528UL, 3097600UL,
+4194310144UL, 4060092672UL, 3405781504UL, 2684361472UL, 1962941440UL, 1241652992UL, 654582016UL, 184951552UL, 1192960UL,
+3590333184UL, 3154125056UL, 2818580992UL, 2466259712UL, 2080384512UL, 1593846528UL, 1073753856UL, 570437632UL, 12800UL,
+4208197632UL, 4227006464UL, 3506110464UL, 2113470464UL, 955777024UL, 402457344UL, 33358080UL, 15994112UL, 14235904UL,
+4291166208UL, 3956736000UL, 3151429632UL, 2044329984UL, 903675904UL, 249626624UL, 14485504UL, 14096128UL, 13712896UL,
+4289003520UL, 3836936192UL, 2947678208UL, 2109079552UL, 1035796480UL, 281018368UL, 12716544UL, 13114880UL, 13190656UL,
+4201906176UL, 3900702720UL, 2978611200UL, 2139881472UL, 1217462272UL, 412418048UL, 10356992UL, 11543296UL, 12013056UL,
+4249355008UL, 4081647616UL, 3209887744UL, 2254045184UL, 1365114880UL, 610533888UL, 74187776UL, 8725504UL, 9588224UL,
+4247389696UL, 4180346112UL, 3425633280UL, 2486436864UL, 1631192064UL, 842925568UL, 222365696UL, 5447936UL, 6702592UL,
+4279634432UL, 4145482496UL, 3373664256UL, 2585331456UL, 1797064704UL, 1025509632UL, 472124416UL, 2561536UL, 3945984UL,
+4278651648UL, 4077259776UL, 3355707904UL, 2667908096UL, 1963395840UL, 1225263872UL, 638193152UL, 370546176UL, 1713152UL,
+3858764288UL, 3321893376UL, 2868908800UL, 2432701184UL, 2013271552UL, 1526732288UL, 1006639104UL, 520100096UL, 7168UL,
+4293197824UL, 4293918720UL, 3673292800UL, 2616262656UL, 1492058112UL, 770834432UL, 334888960UL, 100335616UL, 16711680UL,
+4223860736UL, 3602972672UL, 3066298368UL, 2395668480UL, 1422917632UL, 684982272UL, 249036800UL, 14352384UL, 14417920UL,
+4020436992UL, 3517448192UL, 2896822272UL, 2309947392UL, 1488191488UL, 716767232UL, 247267328UL, 12779520UL, 13107200UL,
+3799646208UL, 3431137280UL, 2878078976UL, 2291204096UL, 1586757632UL, 832176128UL, 262012928UL, 11010048UL, 11863296UL,
+3763470336UL, 3394633728UL, 2891972608UL, 2288648192UL, 1651310592UL, 963706880UL, 343343104UL, 8650752UL, 10160896UL,
+3912433664UL, 3442802688UL, 2956591104UL, 2403467264UL, 1766326272UL, 1078722560UL, 474939392UL, 5767168UL, 7539712UL,
+4162584576UL, 3692888064UL, 3005218816UL, 2418212864UL, 1881604096UL, 1210843136UL, 590348288UL, 104071168UL, 4786688UL,
+4278779904UL, 3959422976UL, 3255238656UL, 2617769984UL, 1980366848UL, 1292828672UL, 688979968UL, 219348992UL, 2293760UL,
+4278190080UL, 3657433088UL, 3137339392UL, 2650800128UL, 2080374784UL, 1509949440UL, 922746880UL, 419430400UL, 0
+ }; //"Thu Aug 27 02:33:34 PM"
+
+uint32_t ulMapDJ8x5Draft[ 9 * 9 * 9 ] =
+{
+4294967040UL, 3034836992UL, 2094464768UL, 1439104512UL, 867696128UL, 582024704UL,
+ 312933888UL, 94633472UL, 10551040UL, 4289449216UL, 3469671936UL, 2093612544UL,
+1287847424UL, 716373504UL, 346684928UL, 195559168UL, 27459072UL, 10484992UL,
+4268873216UL, 3834046464UL, 2290873088UL, 1267724032UL, 613875200UL, 160890368UL,
+ 26803712UL, 26803712UL, 9960960UL, 4266904576UL, 4267370752UL, 3026120448UL,
+1616965888UL, 795474688UL, 225704960UL, 24836352UL, 25360896UL, 8780288UL,
+4264934400UL, 4265267712UL, 3443514880UL, 2135023616UL, 1094903296UL, 474869248UL,
+ 22737664UL, 23522560UL, 7270144UL, 4263686656UL, 4246913280UL, 3676818176UL,
+2502677504UL, 1630330112UL, 724361472UL, 188345344UL, 21619712UL, 5760000UL,
+4262636288UL, 4262704384UL, 3793140736UL, 2769993216UL, 1998310656UL, 1226434816UL,
+ 387512832UL, 19394816UL, 4120576UL, 4261783552UL, 4261850368UL, 3859525376UL,
+3020796928UL, 2215557632UL, 1695341824UL, 873133312UL, 151715584UL, 2156288UL,
+4278230528UL, 4244676864UL, 3741358592UL, 3103824128UL, 2298518784UL, 1711320320UL,
+1325455360UL, 604040960UL, 65280UL, 4160200192UL, 2818485760UL, 1744750848UL,
+ 956104192UL, 366869760UL, 147455488UL, 29163008UL, 28376320UL, 11009280UL,
+4273584384UL, 3284386560UL, 2042811904UL, 1135996416UL, 430439168UL, 27459328UL,
+ 26604544UL, 26143744UL, 9234176UL, 4269058816UL, 3917791232UL, 2357640448UL,
+1334362112UL, 663143936UL, 42392832UL, 25615872UL, 25615872UL, 8773888UL,
+4283413504UL, 3797201152UL, 2640033024UL, 1700772864UL, 879085568UL, 308924928UL,
+ 23976704UL, 24369920UL, 7921664UL, 4264931840UL, 3828789760UL, 2956831744UL,
+1916711424UL, 1161803776UL, 524730368UL, 55428608UL, 5817856UL, 6542336UL,
+4280265472UL, 4062030592UL, 3173165312UL, 2200479488UL, 1445506048UL, 791261696UL,
+ 271628288UL, 20757248UL, 4964864UL, 4262241024UL, 3976961280UL, 3289357568UL,
+2383715072UL, 1729536000UL, 1041671424UL, 471248384UL, 35501568UL, 3456512UL,
+4261518848UL, 3674246400UL, 3288436224UL, 2550435840UL, 1963495936UL, 1359452928UL,
+ 721920256UL, 201764864UL, 1620992UL, 4127232000UL, 3355476224UL, 3170927872UL,
+2734721280UL, 2181073920UL, 1694537216UL, 1140891904UL, 553691648UL, 16890880UL,
+4278022656UL, 3422451200UL, 2029942784UL, 922653184UL, 182366720UL, 13814528UL,
+ 29679616UL, 28697600UL, 11332096UL, 4274286848UL, 3688530688UL, 2128250368UL,
+1103925760UL, 398306048UL, 29015040UL, 27706624UL, 26855680UL, 9490176UL,
+4271544832UL, 3751516160UL, 2560137216UL, 1452123136UL, 696365056UL, 25018368UL,
+ 8243200UL, 25085184UL, 8242176UL, 4266887168UL, 4183726592UL, 2892207616UL,
+1818532096UL, 929471232UL, 292070656UL, 7122688UL, 7516928UL, 7583232UL,
+4265123840UL, 3812268544UL, 3040711168UL, 2017629184UL, 1245944320UL, 558341376UL,
+ 38510848UL, 22653184UL, 6402048UL, 4263485440UL, 3844054016UL, 3089273856UL,
+2250740224UL, 1512740096UL, 858429440UL, 271620864UL, 20751104UL, 4826368UL,
+4262303488UL, 3708522240UL, 3037431808UL, 2282718976UL, 1679067392UL, 1058376960UL,
+ 504729600UL, 35494656UL, 3318272UL, 4278292224UL, 3422650112UL, 2885712896UL,
+2332130816UL, 1778614016UL, 1241744128UL, 705005824UL, 184913920UL, 1546752UL,
+3590356480UL, 3070260480UL, 2600497152UL, 2315285760UL, 1929410304UL, 1526758144UL,
+1040220160UL, 520128256UL, 36864UL, 4277355264UL, 3690873856UL, 2197770752UL,
+1308511488UL, 367881984UL, 32278784UL, 30059264UL, 29736192UL, 12176640UL,
+4275392768UL, 3890565888UL, 2312591872UL, 1406624000UL, 517107200UL, 29656064UL,
+ 28548608UL, 11315712UL, 10596864UL, 4270676224UL, 4037107968UL, 2694734592UL,
+1554016000UL, 714699776UL, 60392704UL, 9933824UL, 9477632UL, 8955392UL,
+4284966656UL, 3714606848UL, 2707908352UL, 1768515840UL, 1013546240UL, 358910976UL,
+ 23501568UL, 6988544UL, 6988288UL, 4265305856UL, 4215238144UL, 2890034688UL,
+1866689024UL, 1229286912UL, 558330880UL, 38502912UL, 5803520UL, 6198528UL,
+4213408512UL, 3710023936UL, 2804116480UL, 1982229504UL, 1361800448UL, 824931072UL,
+ 271613184UL, 3966208UL, 4688128UL, 4128081664UL, 3524099072UL, 2852876288UL,
+2131717376UL, 1511222016UL, 957705472UL, 471168256UL, 18710272UL, 3245056UL,
+3942677760UL, 3221319424UL, 2701224448UL, 2181065216UL, 1677814016UL, 1141073920UL,
+ 637759232UL, 184841472UL, 1408768UL, 3338694912UL, 2902484992UL, 2449498624UL,
+2164286208UL, 1795188224UL, 1375757568UL, 973170944UL, 486567168UL, 29440UL,
+4227734784UL, 3606979072UL, 2566793472UL, 1509897984UL, 788410112UL, 15227392UL,
+ 14709504UL, 30706688UL, 12559872UL, 4275383040UL, 3773114368UL, 2565222400UL,
+1557806336UL, 819218176UL, 64116224UL, 29649664UL, 28412160UL, 11245568UL,
+4272698880UL, 3719249408UL, 2897297920UL, 1806976768UL, 968444928UL, 179066112UL,
+ 27290624UL, 26902784UL, 9866496UL, 4285088256UL, 4151527424UL, 2994096896UL,
+2021150464UL, 1098535168UL, 343694080UL, 7890688UL, 7697152UL, 7699968UL,
+4249899008UL, 3729871872UL, 3109115136UL, 2152748288UL, 1381126656UL, 642735872UL,
+ 71787776UL, 5074944UL, 5537024UL, 4264186880UL, 4046018304UL, 3173799680UL,
+2133677824UL, 1429165312UL, 858740736UL, 288578816UL, 20604160UL, 4352512UL,
+4279329536UL, 3708837376UL, 2937084160UL, 2165331712UL, 1544770816UL, 974542592UL,
+ 488070144UL, 1860608UL, 2976000UL, 3791677696UL, 3271581440UL, 2801818368UL,
+2181060608UL, 1661032192UL, 1124161024UL, 604198656UL, 167993088UL, 1337088UL,
+3271582208UL, 2969590528UL, 2466272512UL, 2130793728UL, 1761629952UL, 1342199040UL,
+ 922768384UL, 486562560UL, 24320UL, 4277930240UL, 3841853952UL, 2935886080UL,
+1778325760UL, 1023287808UL, 436148480UL, 33244416UL, 14377984UL, 13990912UL,
+4293788928UL, 3840804352UL, 2917666304UL, 1709447680UL, 937501184UL, 366488320UL,
+ 30230784UL, 29777152UL, 12087296UL, 4288943872UL, 4038202880UL, 2813204992UL,
+1806246400UL, 1051207936UL, 447558144UL, 28328704UL, 27679232UL, 10448896UL,
+4285997312UL, 3799524864UL, 2775984640UL, 1920413184UL, 1199124480UL, 545273088UL,
+ 25510912UL, 25517312UL, 8546560UL, 4283642624UL, 3696440064UL, 2824222464UL,
+2086222080UL, 1465465088UL, 710753280UL, 56574976UL, 6640640UL, 6512128UL,
+4248385792UL, 3711516160UL, 3157802752UL, 2369273600UL, 1631142144UL, 1010580480UL,
+ 339298816UL, 20599296UL, 4152320UL, 4246290944UL, 4028056320UL, 3189129472UL,
+2283225600UL, 1612267520UL, 1025130240UL, 504971776UL, 18827520UL, 3035904UL,
+4261563904UL, 3640740096UL, 2969650688UL, 2248229888UL, 1677804288UL, 1141063936UL,
+ 604258560UL, 168053248UL, 1331712UL, 3439415552UL, 2986429184UL, 2516600576UL,
+2114012416UL, 1728071168UL, 1325417472UL, 905986560UL, 469780224UL, 19968UL,
+4294508544UL, 4076732672UL, 3372089856UL, 2298414336UL, 1325337600UL, 603851776UL,
+ 117311232UL, 32782848UL, 14441216UL, 4209574144UL, 3789816064UL, 3169124608UL,
+2246836480UL, 1189545984UL, 535367168UL, 65017856UL, 29900032UL, 13193984UL,
+4272948480UL, 3938517248UL, 3065839872UL, 2126578176UL, 1203244288UL, 565318400UL,
+ 28319232UL, 11352064UL, 11423488UL, 4270327808UL, 3750102784UL, 2927823360UL,
+2021723904UL, 1317147392UL, 646256640UL, 125967872UL, 25572864UL, 9195264UL,
+4267186176UL, 3797489152UL, 2891520000UL, 2035948288UL, 1448680960UL, 828186368UL,
+ 224404224UL, 23738624UL, 7556352UL, 4231865088UL, 3392741888UL, 2721719040UL,
+2084316416UL, 1513956096UL, 1010771200UL, 356722944UL, 4666624UL, 5325824UL,
+4263584000UL, 3726714880UL, 3173067008UL, 2367695104UL, 1780689664UL, 1143024384UL,
+ 640034304UL, 2175744UL, 2965760UL, 4262015488UL, 3959762944UL, 3271896832UL,
+2365926912UL, 1694772224UL, 1158032128UL, 621160960UL, 185020160UL, 1456128UL,
+3607116288UL, 2986358016UL, 2499818496UL, 2097231104UL, 1694577920UL, 1308635904UL,
+ 838872576UL, 452997120UL, 14080UL, 4260691968UL, 4194107648UL, 3607035904UL,
+2784887040UL, 1811873792UL, 1040057088UL, 452920064UL, 16711936UL, 16068352UL,
+4007657728UL, 3654811904UL, 3235578112UL, 2514157568UL, 1692598272UL, 887291904UL,
+ 300155136UL, 31198720UL, 13447680UL, 4207018240UL, 3821076736UL, 3166765312UL,
+2378039296UL, 1707343872UL, 834797824UL, 230818048UL, 28644352UL, 11415296UL,
+4186636288UL, 3632857088UL, 3146842112UL, 2241003776UL, 1586495744UL, 797835520UL,
+ 194249216UL, 26022400UL, 8923904UL, 3865968896UL, 3530162176UL, 2892300288UL,
+2170683392UL, 1549861888UL, 912459264UL, 359139328UL, 6755072UL, 7023872UL,
+4265937920UL, 3561097984UL, 2856388864UL, 2118257408UL, 1547832320UL, 1061293568UL,
+ 474353152UL, 21698048UL, 5648128UL, 4264105216UL, 3324450048UL, 2703561216UL,
+2099647232UL, 1613239296UL, 1126699776UL, 640291328UL, 19731968UL, 3614976UL,
+4262399744UL, 3624736000UL, 3054244864UL, 2315982080UL, 1745688320UL, 1208817152UL,
+ 738989824UL, 269488128UL, 1516800UL, 3842056448UL, 3154124800UL, 2583699200UL,
+2130713856UL, 1660952320UL, 1275141888UL, 822090752UL, 452992512UL, 8448UL,
+4294377472UL, 4277993472UL, 3841851392UL, 3187539968UL, 2331770880UL, 1492975616UL,
+ 922550272UL, 452853760UL, 16711680UL, 3889758208UL, 3654680576UL, 3319332864UL,
+2866479104UL, 2195980288UL, 1390804992UL, 820379648UL, 367394816UL, 15007744UL,
+4005691392UL, 3770548224UL, 3267428352UL, 2596274176UL, 2110062592UL, 1304821760UL,
+ 734265344UL, 247988224UL, 12713984UL, 3868000256UL, 3532455936UL, 3248095232UL,
+2375680000UL, 1838678016UL, 1251409920UL, 664141824UL, 195035136UL, 10027008UL,
+3446734848UL, 3228499968UL, 2809004032UL, 2339373056UL, 1768751104UL, 1298989056UL,
+ 661651456UL, 158597120UL, 7405568UL, 3679256576UL, 3360424192UL, 2840396032UL,
+2219638784UL, 1632174080UL, 1162346496UL, 659226624UL, 156237824UL, 5373952UL,
+4214226944UL, 3475832832UL, 2821521408UL, 2150432768UL, 1630339072UL, 1160577024UL,
+ 707461120UL, 187891712UL, 3932160UL, 4094624000UL, 3624861952UL, 2735603712UL,
+2081489152UL, 1578106880UL, 1125122048UL, 705757184UL, 286523392UL, 1966080UL,
+4278190080UL, 2919301376UL, 2499870976UL, 2113929216UL, 1728119040UL, 1224736768UL,
+ 922746880UL, 520093696UL, 0
+};
+
+uint32_t ulMapDJ8x5PlainNormal[9 * 9 * 9] =
+{
+4294967040UL, 2681863936UL, 1723662080UL, 1286209280UL, 1033699072UL, 831782656UL,
+ 630062848UL, 377552640UL, 7077632UL, 4289394944UL, 3250716416UL, 1940848384UL,
+1352793856UL, 999554816UL, 730595072UL, 528744192UL, 360447744UL, 6484992UL,
+4284473856UL, 3564568320UL, 2475949824UL, 1619721984UL, 1082326784UL, 695795456UL,
+ 409992960UL, 225050368UL, 5961984UL, 4281847296UL, 3946771968UL, 2824666880UL,
+2038038272UL, 1399848704UL, 811859712UL, 257031936UL, 72154880UL, 4913152UL,
+4280337408UL, 4196592384UL, 3375365888UL, 2236350208UL, 1718025984UL, 1197342464UL,
+ 457441024UL, 3470336UL, 3729152UL, 4279484416UL, 4279556864UL, 3843227392UL,
+2619473664UL, 1765539584UL, 1482227456UL, 893910784UL, 170521600UL, 2677248UL,
+4278893056UL, 4278897664UL, 4093701376UL, 3087466240UL, 1930755840UL, 1429208832UL,
+1280114432UL, 422181120UL, 1824768UL, 4278235136UL, 4278238464UL, 4160804352UL,
+3355501056UL, 2281761792UL, 1376253696UL, 1042218752UL, 943259392UL, 974848UL,
+4278233088UL, 4278235648UL, 3976248320UL, 3338716672UL, 2583744256UL, 1711331584UL,
+ 973136384UL, 436266240UL, 65280UL, 4110406144UL, 2634009088UL, 1391848192UL,
+ 937426688UL, 734461696UL, 615644928UL, 513736448UL, 378339072UL, 7206912UL,
+4290824704UL, 3621509376UL, 1875640064UL, 1236532992UL, 882835200UL, 630324992UL,
+ 428080896UL, 225902336UL, 6813696UL, 4284791040UL, 3766348032UL, 2493117696UL,
+1553071872UL, 965017344UL, 544866048UL, 258801408UL, 6553344UL, 6026240UL,
+4281905408UL, 4148093696UL, 2891379456UL, 1936717056UL, 1298988800UL, 610008832UL,
+ 71958272UL, 4846592UL, 4975360UL, 4280397312UL, 4280538112UL, 3391483904UL,
+2084236800UL, 1448014080UL, 927791360UL, 154202624UL, 3333120UL, 3791360UL,
+4279414016UL, 4279224320UL, 3674924800UL, 2366825472UL, 1360979968UL, 706929664UL,
+ 236840192UL, 1954304UL, 2542080UL, 4278692352UL, 4194350592UL, 3691039232UL,
+2617298432UL, 1543558400UL, 789108992UL, 269079296UL, 773120UL, 1622784UL,
+4278232064UL, 3774913280UL, 3355485696UL, 2684399360UL, 1828762880UL, 1090568448UL,
+ 520144640UL, 100713728UL, 835584UL, 4076901376UL, 3523250944UL, 3221262848UL,
+2751503360UL, 2097193472UL, 1426107392UL, 872463104UL, 402702848UL, 50432UL,
+4060054784UL, 2734657280UL, 1493143808UL, 822070528UL, 452062976UL, 383319808UL,
+ 330891008UL, 211615488UL, 8255744UL, 4291788544UL, 3353781760UL, 1609677312UL,
+ 670359808UL, 333379584UL, 247398144UL, 144834304UL, 8714496UL, 7467008UL,
+4286677248UL, 3969559040UL, 2442827008UL, 1168235008UL, 613479680UL, 259848960UL,
+ 74381568UL, 6615040UL, 6217728UL, 4282417664UL, 4182551040UL, 2823467776UL,
+1465630720UL, 727374848UL, 156167936UL, 4974592UL, 5168640UL, 5101056UL,
+4280650752UL, 4280854272UL, 3340811520UL, 1865007104UL, 825017344UL, 254333696UL,
+ 2872064UL, 3591424UL, 3983872UL, 4279537920UL, 4279346688UL, 3540826624UL,
+2198780672UL, 1125302016UL, 403685632UL, 51562496UL, 1949184UL, 2604032UL,
+4278686464UL, 4160788992UL, 3405816576UL, 2365630976UL, 1392553984UL, 704690176UL,
+ 218412800UL, 701184UL, 1552128UL, 4278226176UL, 3640689408UL, 3103820032UL,
+2466288640UL, 1660983552UL, 1040228608UL, 503359488UL, 117483520UL, 697088UL,
+3825237248UL, 3338696192UL, 2936043520UL, 2449506560UL, 1845528064UL, 1291881216UL,
+ 805344512UL, 385916416UL, 39936UL, 4110371584UL, 2986300160UL, 1577016576UL,
+ 889153024UL, 402628352UL, 16765440UL, 14477824UL, 12252160UL, 9956352UL,
+4292430592UL, 3572784640UL, 1777297920UL, 737835520UL, 116958976UL, 14732288UL,
+ 12901632UL, 10673664UL, 8772096UL, 4287844864UL, 4055196672UL, 2259116544UL,
+ 867532032UL, 179740928UL, 11058688UL, 9882368UL, 8637952UL, 7391744UL,
+4283519232UL, 4284771328UL, 2975821824UL, 1465539328UL, 509779456UL, 72859136UL,
+ 5621760UL, 5621248UL, 5488384UL, 4280966400UL, 4281233152UL, 3392045056UL,
+1848411136UL, 707562496UL, 238003200UL, 3453440UL, 3978752UL, 4240896UL,
+4279659520UL, 4279663104UL, 3507782912UL, 2182318336UL, 1108709120UL, 437557248UL,
+ 1550080UL, 2204672UL, 2926336UL, 4278744064UL, 4160780032UL, 3405806336UL,
+2332066816UL, 1359186688UL, 671387904UL, 201692928UL, 825344UL, 1611776UL,
+4211110656UL, 3607128320UL, 3070258176UL, 2365617664UL, 1593867264UL, 989888768UL,
+ 469796608UL, 100698112UL, 625152UL, 3674236416UL, 3238027520UL, 2868929280UL,
+2365614592UL, 1778413312UL, 1207987968UL, 771782144UL, 369130752UL, 31488UL,
+4227803648UL, 3355389952UL, 1828665344UL, 922697472UL, 469713664UL, 83849984UL,
+ 15508736UL, 13614848UL, 11650304UL, 4292815104UL, 3774821376UL, 2079931136UL,
+ 788021248UL, 201018368UL, 15234304UL, 13803520UL, 12498432UL, 10467328UL,
+4288491264UL, 4123211520UL, 2579379200UL, 934885632UL, 231099904UL, 12350208UL,
+ 11572736UL, 10265856UL, 8759808UL, 4284233216UL, 4285808640UL, 2977381632UL,
+1433485312UL, 561796864UL, 58289920UL, 7834112UL, 7444992UL, 6659584UL,
+4281678080UL, 4282073856UL, 3325379072UL, 1882737664UL, 1145391104UL, 306016256UL,
+ 3966208UL, 4429312UL, 4494592UL, 4280107776UL, 4280109568UL, 3491254016UL,
+2233095168UL, 1193237760UL, 505309184UL, 69105152UL, 2654208UL, 3180800UL,
+4278931200UL, 4278735616UL, 3439809792UL, 2366134272UL, 1359568384UL, 722101760UL,
+ 235498496UL, 1078272UL, 1800960UL, 4177548288UL, 3657453056UL, 3053473536UL,
+2382386432UL, 1560304384UL, 922771200UL, 453010688UL, 67134976UL, 748544UL,
+3573567488UL, 3187690240UL, 2818592000UL, 2332054016UL, 1744853248UL, 1174428416UL,
+ 738221056UL, 369123840UL, 24832UL, 4294907648UL, 3607042560UL, 2264866304UL,
+1023353856UL, 486483456UL, 201271296UL, 16077824UL, 14450432UL, 12818944UL,
+4293138688UL, 3909032448UL, 2482969600UL, 922362112UL, 217719040UL, 15740928UL,
+ 14571520UL, 13204480UL, 11636992UL, 4289273088UL, 4190903296UL, 2815367424UL,
+1204165376UL, 298196992UL, 12923904UL, 12409088UL, 11236864UL, 9864448UL,
+4285080064UL, 4202570752UL, 2995003392UL, 1635853312UL, 612641024UL, 92944128UL,
+ 9065472UL, 8613120UL, 7699200UL, 4282197504UL, 4165150720UL, 3057722112UL,
+1883712256UL, 978138112UL, 323894272UL, 5131264UL, 5465088UL, 5337088UL,
+4280559872UL, 4280626176UL, 3340445184UL, 2233544448UL, 1244150016UL, 791556096UL,
+ 69683712UL, 2972928UL, 3368960UL, 4279316224UL, 4279251456UL, 3456840192UL,
+2399942144UL, 1410284288UL, 739197440UL, 235751424UL, 1331968UL, 2055680UL,
+4177540096UL, 3808441600UL, 3103798784UL, 2365602304UL, 1526742272UL, 889209088UL,
+ 419448064UL, 18688UL, 873728UL, 3456121600UL, 3087022336UL, 2701146624UL,
+2214607872UL, 1644183296UL, 1124090624UL, 687883264UL, 369117184UL, 18688UL,
+4294380544UL, 3825142784UL, 2768178688UL, 1325338880UL, 570364928UL, 218043648UL,
+ 16389120UL, 15547904UL, 13919232UL, 4293135360UL, 3992913920UL, 2835286016UL,
+1241450752UL, 267848704UL, 15733504UL, 14885632UL, 13976320UL, 12869888UL,
+4289793536UL, 4174252288UL, 2949842432UL, 1506740224UL, 398920448UL, 12981248UL,
+ 12658688UL, 12338432UL, 11099392UL, 4285796608UL, 4186247424UL, 2995457536UL,
+1753878528UL, 747377408UL, 143529984UL, 9578752UL, 9651200UL, 8804352UL,
+4282717696UL, 4131984896UL, 3058307840UL, 1934628608UL, 1062607616UL, 374742528UL,
+ 5974016UL, 6438912UL, 6181120UL, 4280884224UL, 3928299264UL, 2988709120UL,
+2083199744UL, 1261444864UL, 556868096UL, 103885056UL, 3685120UL, 4016384UL,
+4279638784UL, 4195621632UL, 3389986816UL, 2400394496UL, 1461002752UL, 789915904UL,
+ 488381952UL, 1651968UL, 2245376UL, 4278525440UL, 4076871168UL, 3288341760UL,
+2365595648UL, 1476403712UL, 855647744UL, 385886976UL, 12544UL, 932352UL,
+3506447616UL, 2986353664UL, 2600477952UL, 2080384768UL, 1577069056UL, 1090530560UL,
+ 637546240UL, 352334336UL, 13312UL, 4293591040UL, 4026204160UL, 3154051072UL,
+1862206720UL, 788465664UL, 318703616UL, 100599808UL, 16321792UL, 15150848UL,
+4292804608UL, 4025286656UL, 3052339200UL, 1794113536UL, 569376768UL, 15532032UL,
+ 14814208UL, 14358272UL, 13775104UL, 4289921024UL, 3904962560UL, 2982477824UL,
+1858535424UL, 700907520UL, 12910592UL, 12652032UL, 12590080UL, 12137216UL,
+4286382080UL, 3984850944UL, 2928279552UL, 1837957120UL, 898629632UL, 227673088UL,
+ 9834240UL, 10034688UL, 9778432UL, 4283107328UL, 4014802432UL, 3025208832UL,
+1918174720UL, 1113131008UL, 458885632UL, 6098176UL, 6889472UL, 7156992UL,
+4281142528UL, 3794471424UL, 2955610368UL, 2050034432UL, 1261767936UL, 641142784UL,
+ 137826816UL, 4202496UL, 4600320UL, 4279898368UL, 3692235264UL, 2970946304UL,
+2149125632UL, 1377505536UL, 807211520UL, 253498112UL, 2039040UL, 2567168UL,
+4278783488UL, 4043771136UL, 3322219776UL, 2466648064UL, 1611076096UL, 939988480UL,
+ 436607232UL, 168430592UL, 1123584UL, 3841987072UL, 3087012608UL, 2600473600UL,
+2113934848UL, 1560287488UL, 1073748736UL, 637541632UL, 335552256UL, 8192UL,
+4292411392UL, 4142923776UL, 3455778816UL, 2399076352UL, 1224671232UL, 553582592UL,
+ 251592704UL, 16711680UL, 16711680UL, 3972530176UL, 3653959680UL, 3168141312UL,
+2279211008UL, 1189150720UL, 450953216UL, 149094400UL, 14745600UL, 14417920UL,
+3802660864UL, 3433889792UL, 2947809280UL, 2193096704UL, 1254031360UL, 465436672UL,
+ 96468992UL, 12517376UL, 12517376UL, 3783065600UL, 3431137280UL, 2861301760UL,
+2106589184UL, 1301544960UL, 546635776UL, 93716480UL, 10158080UL, 10289152UL,
+3914334208UL, 3411083264UL, 2824339456UL, 2019426304UL, 1298202624UL, 644022272UL,
+ 140705792UL, 6881280UL, 7602176UL, 4197449728UL, 3593469952UL, 2788294656UL,
+2016804864UL, 1278869504UL, 708509696UL, 222035968UL, 4325376UL, 5177344UL,
+4011327488UL, 3591897088UL, 2870542336UL, 2098987008UL, 1360855040UL, 756940800UL,
+ 287244288UL, 2424832UL, 3080192UL, 3976658944UL, 3607560192UL, 3003580416UL,
+2215116800UL, 1476919296UL, 856227840UL, 420085760UL, 851968UL, 1376256UL,
+4278190080UL, 3472883712UL, 2734686208UL, 2164260864UL, 1677721600UL, 1157627904UL,
+ 721420288UL, 301989888UL, 0
+};
+
diff --git a/prnt/hpcups/dj970ColorMaps.cpp b/prnt/hpcups/dj970ColorMaps.cpp
new file mode 100644
index 0000000..33b1a09
--- /dev/null
+++ b/prnt/hpcups/dj970ColorMaps.cpp
@@ -0,0 +1,624 @@
+/*****************************************************************************\
+ dj970_maps.cpp : Color maps for DJ970
+
+ Copyright (c) 1996 - 2001UL, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+#include "CommonDefinitions.h"
+
+// 600x600x1, K - Plain, Normal, Grey
+
+uint32_t ulMapGRAY_K_6x6x1[] =
+{
+ 255UL, 238UL, 218UL, 204UL, 189UL, 181UL, 171UL, 161UL, 154UL,
+ 178UL, 168UL, 161UL, 153UL, 148UL, 141UL, 136UL, 130UL, 127UL,
+ 140UL, 133UL, 129UL, 124UL, 121UL, 116UL, 113UL, 109UL, 106UL,
+ 115UL, 112UL, 108UL, 104UL, 101UL, 97UL, 95UL, 91UL, 89UL,
+ 96UL, 94UL, 90UL, 88UL, 85UL, 82UL, 79UL, 77UL, 74UL,
+ 81UL, 78UL, 76UL, 73UL, 71UL, 69UL, 66UL, 65UL, 62UL,
+ 67UL, 66UL, 63UL, 62UL, 59UL, 57UL, 55UL, 54UL, 51UL,
+ 56UL, 55UL, 52UL, 51UL, 49UL, 47UL, 45UL, 44UL, 42UL,
+ 47UL, 45UL, 43UL, 41UL, 40UL, 38UL, 37UL, 35UL, 33UL,
+ 209UL, 191UL, 184UL, 173UL, 166UL, 156UL, 151UL, 144UL, 140UL,
+ 154UL, 149UL, 143UL, 138UL, 132UL, 128UL, 123UL, 120UL, 115UL,
+ 127UL, 122UL, 119UL, 114UL, 111UL, 107UL, 104UL, 100UL, 96UL,
+ 106UL, 102UL, 99UL, 95UL, 93UL, 90UL, 87UL, 84UL, 81UL,
+ 89UL, 85UL, 83UL, 80UL, 78UL, 75UL, 73UL, 70UL, 68UL,
+ 74UL, 71UL, 69UL, 67UL, 65UL, 63UL, 61UL, 59UL, 57UL,
+ 62UL, 60UL, 58UL, 56UL, 54UL, 52UL, 50UL, 48UL, 47UL,
+ 51UL, 50UL, 48UL, 46UL, 44UL, 43UL, 41UL, 39UL, 38UL,
+ 42UL, 40UL, 38UL, 37UL, 35UL, 34UL, 32UL, 31UL, 29UL,
+ 176UL, 168UL, 159UL, 153UL, 146UL, 141UL, 135UL, 130UL, 125UL,
+ 140UL, 133UL, 129UL, 124UL, 121UL, 116UL, 113UL, 109UL, 106UL,
+ 115UL, 112UL, 108UL, 104UL, 101UL, 97UL, 95UL, 91UL, 89UL,
+ 96UL, 94UL, 90UL, 88UL, 85UL, 82UL, 79UL, 77UL, 74UL,
+ 81UL, 78UL, 76UL, 73UL, 71UL, 69UL, 66UL, 65UL, 62UL,
+ 67UL, 66UL, 63UL, 62UL, 59UL, 57UL, 55UL, 54UL, 51UL,
+ 56UL, 55UL, 52UL, 51UL, 49UL, 47UL, 45UL, 44UL, 42UL,
+ 47UL, 45UL, 43UL, 41UL, 40UL, 38UL, 37UL, 35UL, 33UL,
+ 38UL, 36UL, 34UL, 32UL, 31UL, 29UL, 28UL, 26UL, 25UL,
+ 153UL, 148UL, 143UL, 136UL, 132UL, 127UL, 122UL, 119UL, 114UL,
+ 125UL, 122UL, 118UL, 114UL, 110UL, 107UL, 103UL, 100UL, 96UL,
+ 105UL, 102UL, 98UL, 95UL, 92UL, 90UL, 86UL, 84UL, 81UL,
+ 88UL, 85UL, 83UL, 80UL, 77UL, 75UL, 72UL, 70UL, 67UL,
+ 74UL, 71UL, 69UL, 67UL, 65UL, 63UL, 61UL, 59UL, 57UL,
+ 62UL, 60UL, 58UL, 56UL, 54UL, 52UL, 50UL, 48UL, 47UL,
+ 51UL, 49UL, 48UL, 46UL, 44UL, 42UL, 41UL, 39UL, 38UL,
+ 42UL, 40UL, 38UL, 37UL, 35UL, 33UL, 32UL, 30UL, 29UL,
+ 33UL, 31UL, 30UL, 28UL, 27UL, 25UL, 24UL, 22UL, 21UL,
+ 138UL, 132UL, 128UL, 123UL, 120UL, 115UL, 112UL, 108UL, 105UL,
+ 115UL, 111UL, 108UL, 104UL, 101UL, 97UL, 95UL, 91UL, 89UL,
+ 96UL, 93UL, 90UL, 87UL, 85UL, 81UL, 79UL, 76UL, 74UL,
+ 81UL, 78UL, 76UL, 73UL, 71UL, 68UL, 66UL, 64UL, 62UL,
+ 67UL, 66UL, 63UL, 62UL, 59UL, 57UL, 55UL, 53UL, 51UL,
+ 56UL, 55UL, 52UL, 51UL, 49UL, 47UL, 45UL, 44UL, 42UL,
+ 46UL, 45UL, 43UL, 41UL, 39UL, 38UL, 36UL, 35UL, 33UL,
+ 37UL, 36UL, 34UL, 32UL, 31UL, 29UL, 28UL, 26UL, 25UL,
+ 28UL, 27UL, 26UL, 24UL, 22UL, 21UL, 19UL, 18UL, 16UL,
+ 124UL, 121UL, 116UL, 113UL, 109UL, 106UL, 102UL, 99UL, 95UL,
+ 105UL, 102UL, 98UL, 95UL, 92UL, 90UL, 86UL, 83UL, 81UL,
+ 88UL, 85UL, 82UL, 80UL, 77UL, 75UL, 72UL, 70UL, 67UL,
+ 73UL, 71UL, 69UL, 67UL, 65UL, 63UL, 60UL, 59UL, 56UL,
+ 62UL, 60UL, 57UL, 56UL, 54UL, 52UL, 50UL, 48UL, 46UL,
+ 51UL, 49UL, 48UL, 46UL, 44UL, 42UL, 40UL, 39UL, 37UL,
+ 42UL, 40UL, 38UL, 37UL, 35UL, 33UL, 32UL, 30UL, 29UL,
+ 33UL, 31UL, 30UL, 28UL, 27UL, 25UL, 24UL, 22UL, 21UL,
+ 25UL, 23UL, 22UL, 20UL, 19UL, 17UL, 16UL, 14UL, 12UL,
+ 114UL, 110UL, 107UL, 103UL, 100UL, 96UL, 94UL, 90UL, 88UL,
+ 95UL, 93UL, 90UL, 87UL, 84UL, 81UL, 78UL, 76UL, 73UL,
+ 81UL, 78UL, 76UL, 73UL, 71UL, 68UL, 66UL, 64UL, 62UL,
+ 67UL, 65UL, 63UL, 61UL, 59UL, 57UL, 55UL, 53UL, 51UL,
+ 56UL, 54UL, 52UL, 50UL, 49UL, 47UL, 45UL, 43UL, 42UL,
+ 46UL, 44UL, 43UL, 41UL, 39UL, 38UL, 36UL, 34UL, 33UL,
+ 37UL, 36UL, 34UL, 32UL, 31UL, 29UL, 28UL, 26UL, 25UL,
+ 28UL, 27UL, 25UL, 24UL, 22UL, 21UL, 19UL, 18UL, 16UL,
+ 20UL, 19UL, 17UL, 16UL, 14UL, 13UL, 11UL, 10UL, 8UL,
+ 104UL, 101UL, 97UL, 95UL, 91UL, 89UL, 85UL, 83UL, 80UL,
+ 88UL, 85UL, 82UL, 79UL, 77UL, 74UL, 72UL, 69UL, 67UL,
+ 73UL, 71UL, 69UL, 66UL, 65UL, 62UL, 60UL, 58UL, 56UL,
+ 62UL, 60UL, 57UL, 56UL, 54UL, 52UL, 50UL, 48UL, 46UL,
+ 51UL, 49UL, 47UL, 46UL, 44UL, 42UL, 40UL, 39UL, 37UL,
+ 41UL, 40UL, 38UL, 37UL, 35UL, 33UL, 31UL, 30UL, 28UL,
+ 32UL, 31UL, 29UL, 28UL, 26UL, 25UL, 23UL, 22UL, 20UL,
+ 25UL, 23UL, 22UL, 20UL, 19UL, 17UL, 16UL, 14UL, 12UL,
+ 16UL, 15UL, 13UL, 12UL, 10UL, 9UL, 7UL, 6UL, 4UL,
+ 95UL, 92UL, 90UL, 86UL, 84UL, 81UL, 78UL, 76UL, 73UL,
+ 80UL, 78UL, 75UL, 73UL, 70UL, 68UL, 66UL, 64UL, 62UL,
+ 67UL, 65UL, 63UL, 61UL, 59UL, 57UL, 55UL, 53UL, 51UL,
+ 56UL, 54UL, 52UL, 50UL, 48UL, 47UL, 45UL, 43UL, 41UL,
+ 46UL, 44UL, 43UL, 41UL, 39UL, 38UL, 36UL, 34UL, 33UL,
+ 37UL, 35UL, 34UL, 32UL, 31UL, 29UL, 28UL, 26UL, 25UL,
+ 28UL, 27UL, 25UL, 24UL, 22UL, 21UL, 19UL, 18UL, 16UL,
+ 20UL, 19UL, 17UL, 16UL, 14UL, 12UL, 11UL, 9UL, 8UL,
+ 12UL, 11UL, 9UL, 8UL, 6UL, 5UL, 3UL, 2UL, 0UL
+};
+
+uint32_t ulMapDJ970_KCMY[ 9*9*9 ]=
+{
+ 673723135UL, 26007371UL, 9756717UL, 10020638UL, 10022677UL, 10153743UL,
+ 10285066UL, 10416133UL, 9169408UL, 3405886809UL, 59743UL, 23980849UL,
+ 9366812UL, 10153744UL, 10285066UL, 10153990UL, 10087424UL, 9169408UL,
+3858807091UL, 2197868343UL, 60220UL, 4714015UL, 7270155UL, 8646656UL,
+ 8579328UL, 8382208UL, 7791360UL, 3875584801UL, 3187785766UL, 1660999718UL,
+ 60710UL, 36498447UL, 4646144UL, 5166848UL, 5624832UL, 5886976UL,
+3875585303UL, 3573661210UL, 2667629594UL, 1208016666UL, 319808529UL, 304931585UL,
+ 3000832UL, 3652608UL, 4176384UL, 3892820492UL, 3758145040UL, 3187721745UL,
+2197869329UL, 939582223UL, 387244805UL, 152818688UL, 2341120UL, 2927872UL,
+3909859588UL, 3892624647UL, 3472998923UL, 2835401737UL, 1728109064UL, 957341698UL,
+ 336716032UL, 1099008UL, 1944832UL, 3909661952UL, 3909269763UL, 3741368579UL,
+3238053891UL, 2516635904UL, 1375786499UL, 688380160UL, 56064UL, 1031168UL,
+3925912832UL, 3909136896UL, 3691033856UL, 3355490816UL, 2717957120UL, 1778432512UL,
+ 973126144UL, 436259072UL, 54784UL, 3183805035UL, 13972558UL, 11965228UL,
+ 11449373UL, 10995222UL, 27643922UL, 27514893UL, 27451400UL, 9560832UL,
+4015155266UL, 1835890539UL, 211079218UL, 26991389UL, 27255056UL, 27321354UL,
+ 10087171UL, 9168128UL, 8249088UL, 3928464674UL, 3004413502UL, 809093171UL,
+ 308797461UL, 109046276UL, 8512768UL, 8118528UL, 7658752UL, 7133184UL,
+3910708498UL, 3523329062UL, 2165818909UL, 993775120UL, 575525632UL, 4378368UL,
+ 5164288UL, 5623040UL, 5753856UL, 3910513160UL, 3892624145UL, 2919613972UL,
+1730004745UL, 892520192UL, 288014592UL, 2864640UL, 3649536UL, 4240640UL,
+3910120707UL, 3892689928UL, 3305161995UL, 2349777670UL, 1276887296UL, 505330688UL,
+ 119058688UL, 2204416UL, 2859264UL, 3909923840UL, 3909138435UL, 3523263488UL,
+2802367488UL, 1661777152UL, 823047168UL, 252687104UL, 958464UL, 1873408UL,
+3925912576UL, 3691030016UL, 3338708224UL, 2801837312UL, 1912644608UL, 1057007104UL,
+ 520136448UL, 84257792UL, 956928UL, 3724581888UL, 3506475520UL, 3254817536UL,
+2852164608UL, 2214631936UL, 1493213184UL, 855680256UL, 385919744UL, 44544UL,
+3805020222UL, 904134721UL, 14429742UL, 12876059UL, 12034579UL, 11580943UL,
+ 11387914UL, 11128584UL, 10082048UL, 3935974696UL, 2377526339UL, 381966891UL,
+ 12422935UL, 11841035UL, 11517956UL, 10734848UL, 9752576UL, 8441856UL,
+4017191173UL, 3663951909UL, 2509611275UL, 1100725504UL, 226741760UL, 7917824UL,
+ 7590144UL, 7129856UL, 6668800UL, 3980299776UL, 3895762190UL, 3075845379UL,
+1583263232UL, 559065856UL, 4698880UL, 5421824UL, 5684224UL, 5618176UL,
+3961691136UL, 3927877891UL, 3375083778UL, 1932502272UL, 875864832UL, 271360256UL,
+ 3056128UL, 3909376UL, 4369408UL, 3943867136UL, 3926765056UL, 3474239744UL,
+2300093184UL, 1176083200UL, 538810368UL, 102274048UL, 2199808UL, 2921984UL,
+3943081472UL, 3791692800UL, 3305152000UL, 2433193984UL, 1443467776UL, 738889472UL,
+ 286100736UL, 886016UL, 1737216UL, 3875577088UL, 3439363584UL, 3120596736UL,
+2516616704UL, 1660978688UL, 973113088UL, 453019136UL, 33280UL, 883456UL,
+3573581056UL, 3271587328UL, 2986374144UL, 2499834880UL, 1862301440UL, 1291876864UL,
+ 805339648UL, 352355328UL, 33792UL, 3838771235UL, 2229010470UL, 233504809UL,
+ 14755610UL, 13525519UL, 12553738UL, 12035848UL, 11647238UL, 10798848UL,
+3904054036UL, 3200782122UL, 1003559969UL, 131218706UL, 13266692UL, 12162304UL,
+ 11511808UL, 10859264UL, 10009088UL, 4002237696UL, 3801629204UL, 2762892800UL,
+1152083712UL, 194999040UL, 9931776UL, 9608448UL, 8889856UL, 7842560UL,
+4098708736UL, 3999230464UL, 3127209220UL, 1583244288UL, 609975040UL, 5149696UL,
+ 5547520UL, 5679872UL, 5548032UL, 4062537728UL, 3978851584UL, 3106761472UL,
+1882548992UL, 926511360UL, 288454400UL, 3375616UL, 4101120UL, 4364800UL,
+4027612672UL, 3943597056UL, 3222631168UL, 2132504320UL, 1159557120UL, 538996992UL,
+ 102461696UL, 2389760UL, 2982400UL, 3942679808UL, 3707795968UL, 3120589824UL,
+2315808768UL, 1393257984UL, 722234368UL, 286157568UL, 944384UL, 1797120UL,
+3741350656UL, 3321914624UL, 2952815360UL, 2365613824UL, 1543530240UL, 922772736UL,
+ 436233472UL, 24832UL, 812032UL, 3472911104UL, 3137363200UL, 2785040896UL,
+2281724672UL, 1660967680UL, 1157651968UL, 738222592UL, 335569664UL, 25088UL,
+3838836756UL, 2899836951UL, 1189412888UL, 15597591UL, 15015690UL, 13914373UL,
+ 13007875UL, 12360194UL, 11578624UL, 3904642310UL, 3503097879UL, 1725237778UL,
+ 601694217UL, 81081089UL, 12932864UL, 12089088UL, 11308032UL, 10787840UL,
+3969395712UL, 3853397762UL, 2779723008UL, 1269511680UL, 346766080UL, 10637312UL,
+ 10185984UL, 9666560UL, 8948992UL, 4099617792UL, 3882433280UL, 2875668992UL,
+1617574912UL, 661537024UL, 6703360UL, 7300096UL, 7436032UL, 6914048UL,
+4163778304UL, 3945872896UL, 3107536896UL, 1966948864UL, 1061110784UL, 322653952UL,
+ 3824896UL, 4420096UL, 4553728UL, 4128524288UL, 3977595904UL, 3122152448UL,
+2082292736UL, 1176585984UL, 589516032UL, 102715136UL, 2579200UL, 3172608UL,
+4110440960UL, 3674230016UL, 3037153536UL, 2181711872UL, 1376668672UL, 739200512UL,
+ 269504512UL, 1134336UL, 1922048UL, 3741342208UL, 3254799360UL, 2835367936UL,
+2197833216UL, 1442859008UL, 889211648UL, 419449600UL, 18688UL, 806144UL,
+3422573824UL, 3019917824UL, 2650817792UL, 2113946880UL, 1560299264UL, 1107315200UL,
+ 721439488UL, 352341248UL, 18944UL, 3855353864UL, 3235184653UL, 2011168781UL,
+ 585826314UL, 15468551UL, 15145472UL, 14304000UL, 13461760UL, 12749312UL,
+3904640001UL, 3671001096UL, 2463697669UL, 936907522UL, 232003840UL, 13181952UL,
+ 12534272UL, 11886336UL, 11237120UL, 3969652992UL, 3853391872UL, 2846693888UL,
+1353390848UL, 481238528UL, 11084800UL, 10895616UL, 10377216UL, 9660928UL,
+4083424768UL, 3815579136UL, 2825527296UL, 1634542080UL, 779232256UL, 158607360UL,
+ 7945472UL, 8147200UL, 7757824UL, 4164428544UL, 3694667008UL, 2822513920UL,
+1849763328UL, 994387968UL, 340339456UL, 4929536UL, 5655808UL, 5724672UL,
+4212793856UL, 3894158848UL, 3072403712UL, 2082810624UL, 1227304192UL, 656878080UL,
+ 103167232UL, 2900736UL, 3494144UL, 4178063104UL, 3825806848UL, 3087739904UL,
+2181901824UL, 1326395392UL, 772944896UL, 303183104UL, 1259264UL, 1982976UL,
+3909106176UL, 3372233216UL, 2818584576UL, 2147495936UL, 1392521216UL, 855650816UL,
+ 419443712UL, 13824UL, 866560UL, 3456122368UL, 2969581568UL, 2566927616UL,
+2080388096UL, 1543517440UL, 1073755648UL, 687880192UL, 352335872UL, 14080UL,
+3872000258UL, 3453223175UL, 2648440837UL, 1290141699UL, 351076352UL, 15534080UL,
+ 15339776UL, 14169344UL, 13785600UL, 3904572160UL, 3754754051UL, 2832334848UL,
+1288699904UL, 348979200UL, 13175552UL, 12851712UL, 12399616UL, 12079104UL,
+3953003520UL, 3853125120UL, 2745171968UL, 1453786624UL, 581568768UL, 10881536UL,
+ 11214080UL, 11089152UL, 10570240UL, 4067102464UL, 3798797824UL, 2825456896UL,
+1651314176UL, 829624320UL, 259723520UL, 8330240UL, 8729344UL, 8537344UL,
+4047377920UL, 3577419008UL, 2789151744UL, 1816335616UL, 1011291392UL, 458102272UL,
+ 5183744UL, 6041600UL, 6308608UL, 4011989504UL, 3542227456UL, 2720208896UL,
+1898452992UL, 1160452096UL, 623843328UL, 120593408UL, 3680768UL, 4209152UL,
+4245624064UL, 3792771584UL, 3021019392UL, 2182355712UL, 1360403712UL, 823598848UL,
+ 404232704UL, 1582080UL, 2240256UL, 4110425088UL, 3539998976UL, 2902464768UL,
+2181044736UL, 1375738624UL, 805313280UL, 436216064UL, 8448UL, 927744UL,
+3674220288UL, 3103794176UL, 2617254912UL, 2046829824UL, 1476404480UL, 1023419648UL,
+ 654321408UL, 335554304UL, 9472UL, 3888645121UL, 3637772291UL, 3050897410UL,
+1977745408UL, 854196224UL, 233701376UL, 15400960UL, 15141632UL, 14494464UL,
+3904438272UL, 3653238784UL, 2864578560UL, 1774321664UL, 801570816UL, 214433792UL,
+ 12977920UL, 12849664UL, 12658944UL, 3969646592UL, 3667853312UL, 2795241472UL,
+1721892864UL, 849870848UL, 229179392UL, 11142912UL, 11343104UL, 11282688UL,
+3983212544UL, 3664314368UL, 2808545280UL, 1684733952UL, 913440768UL, 309854208UL,
+ 8390144UL, 9180672UL, 9251072UL, 3980331008UL, 3476751616UL, 2688155648UL,
+1715404800UL, 943915008UL, 491520000UL, 5373952UL, 6166016UL, 6760704UL,
+3794145024UL, 3324185600UL, 2619672832UL, 1831471360UL, 1127024896UL, 607127808UL,
+ 204802304UL, 3871744UL, 4531200UL, 3944157696UL, 3440643840UL, 2736000256UL,
+1897270272UL, 1226312704UL, 739838976UL, 320604672UL, 2035968UL, 2694912UL,
+4161145600UL, 3607497728UL, 2936343552UL, 2164657152UL, 1443302912UL, 872877824UL,
+ 503845120UL, 185273344UL, 1055488UL, 3976205056UL, 3305115904UL, 2701136384UL,
+2080379648UL, 1509954816UL, 989861120UL, 587207936UL, 318772992UL, 5888UL,
+3738435584UL, 3621060608UL, 3218210816UL, 2497183744UL, 1441071104UL, 720044032UL,
+ 300810240UL, 15728640UL, 15728640UL, 3904307200UL, 3434151936UL, 2914320384UL,
+2176581632UL, 1287979008UL, 633995264UL, 248250368UL, 13500416UL, 13565952UL,
+3852009472UL, 3348234240UL, 2727608320UL, 1973157888UL, 1252327424UL, 631963648UL,
+ 229507072UL, 11468800UL, 11730944UL, 3664314368UL, 3261333504UL, 2691235840UL,
+1852768256UL, 1215758336UL, 662568960UL, 226820096UL, 9175040UL, 9830400UL,
+3611230208UL, 3158245376UL, 2588082176UL, 1850212352UL, 1179516928UL, 710082560UL,
+ 274202624UL, 6160384UL, 7208960UL, 3659857920UL, 3173384192UL, 2502492160UL,
+1798111232UL, 1160839168UL, 691208192UL, 322306048UL, 3932160UL, 4849664UL,
+3507486720UL, 3037790208UL, 2467561472UL, 1763115008UL, 1159331840UL, 706412544UL,
+ 354287616UL, 2293760UL, 3080192UL, 3741581312UL, 3288662016UL, 2667970560UL,
+1896284160UL, 1225261056UL, 755564544UL, 436928512UL, 118423552UL, 1572864UL,
+4278190080UL, 3472883712UL, 2818572288UL, 2097152000UL, 1493172224UL, 1006632960UL,
+ 620756992UL, 335544320UL, 0UL,
+ };
+
+uint32_t ulMapDJ970_KCMY_3x3x2[ 9*9*9 ]=
+{
+1920105215UL, 60881733UL, 10551078UL, 10288922UL, 10223378UL, 9895694UL,
+ 9895690UL, 10157829UL, 10157824UL, 4278246736UL, 65363UL, 8388394UL,
+ 9895705UL, 9961232UL, 9895691UL, 10092296UL, 10092292UL, 10157824UL,
+4278966312UL, 2818631985UL, 65334UL, 6291229UL, 8257294UL, 9109254UL,
+ 10223360UL, 9699072UL, 9633536UL, 4279751190UL, 3791969570UL, 2231430434UL,
+ 65318UL, 4259603UL, 6553347UL, 7533568UL, 7859712UL, 8055296UL,
+4280339978UL, 4278246676UL, 3187729943UL, 1761669401UL, 65305UL, 2883338UL,
+ 5041408UL, 6084608UL, 6608128UL, 4280732161UL, 4278246669UL, 3674398992UL,
+2717968655UL, 1459680272UL, 65295UL, 2095363UL, 4183808UL, 5098496UL,
+4279552258UL, 4279162627UL, 4043431433UL, 3271615752UL, 2315316489UL, 1191245065UL,
+ 50396937UL, 1828864UL, 3525632UL, 4278830848UL, 4278767360UL, 4278245632UL,
+3707822336UL, 2936072195UL, 1996549891UL, 1006696195UL, 65283UL, 1759488UL,
+4278237952UL, 4278239744UL, 4110469632UL, 3674263296UL, 3254835200UL, 2516638720UL,
+1644223744UL, 822144768UL, 65280UL, 3706389867UL, 16138823UL, 64936234UL,
+ 31323927UL, 46595346UL, 11992843UL, 11337480UL, 11337476UL, 11009792UL,
+4287273261UL, 2189593947UL, 10813229UL, 10747673UL, 10485519UL, 10354441UL,
+ 10485509UL, 10551040UL, 9696256UL, 4283283480UL, 3641890107UL, 657252153UL,
+ 57604636UL, 9109259UL, 9961219UL, 10026752UL, 9697280UL, 9039360UL,
+4282106121UL, 4278900765UL, 2517100065UL, 774168097UL, 172879376UL, 6747648UL,
+ 7727616UL, 8054272UL, 8052992UL, 4281516545UL, 4279293453UL, 3355501844UL,
+1946870037UL, 858381071UL, 524541952UL, 5101568UL, 6082560UL, 6672640UL,
+4280532992UL, 4279293187UL, 3791773706UL, 2869551879UL, 1813699845UL, 858380291UL,
+ 237622272UL, 3917568UL, 4964864UL, 4279354112UL, 4278767104UL, 4110473728UL,
+3238059010UL, 2383206400UL, 1477891328UL, 555275008UL, 1492992UL, 3324672UL,
+4278238464UL, 4127243776UL, 3774923264UL, 3288384512UL, 2634073344UL, 1828767744UL,
+1057475328UL, 235392768UL, 1556736UL, 4060131584UL, 3808472320UL, 3607147264UL,
+3288380928UL, 2835396864UL, 2248196352UL, 1543555072UL, 738249984UL, 53504UL,
+4293787704UL, 1291452479UL, 16138023UL, 15184662UL, 31578384UL, 81393413UL,
+ 13827840UL, 12910336UL, 12451584UL, 4289880862UL, 2848079424UL, 350061354UL,
+ 15058449UL, 31451141UL, 13826304UL, 12645632UL, 11464192UL, 10412032UL,
+4287139584UL, 4085422877UL, 2307494948UL, 949800976UL, 243856386UL, 11138816UL,
+ 10219520UL, 9627136UL, 9099264UL, 4283998720UL, 4283741450UL, 3058153496UL,
+1515567640UL, 863227650UL, 7657728UL, 7984896UL, 8181248UL, 8114944UL,
+4281773568UL, 4281907968UL, 3677079305UL, 2284831499UL, 1380369157UL, 541837568UL,
+ 5425152UL, 6342912UL, 6867712UL, 4280267008UL, 4279876608UL, 3960655874UL,
+2955134465UL, 1932051456UL, 976142592UL, 220970752UL, 3979520UL, 5159424UL,
+4278957056UL, 4278237696UL, 3909141504UL, 3104358144UL, 2248981760UL, 1393737472UL,
+ 538294784UL, 1487616UL, 3124736UL, 4278235392UL, 3842025984UL, 3556814592UL,
+3103830272UL, 2449519104UL, 1744877056UL, 906016512UL, 184595968UL, 1420032UL,
+3858801664UL, 3573587456UL, 3372261376UL, 3053494784UL, 2550178816UL, 2046863616UL,
+1459663360UL, 687911936UL, 46080UL, 4293006619UL, 2918449187UL, 385744936UL,
+ 16266776UL, 15374604UL, 15057667UL, 14802432UL, 13559552UL, 12314112UL,
+4290923277UL, 3957592103UL, 1138761255UL, 65824019UL, 15312642UL, 14534144UL,
+ 13619968UL, 12637696UL, 11522816UL, 4288179200UL, 4205668878UL, 2611569687UL,
+1085699858UL, 281126656UL, 12303104UL, 11913216UL, 11258880UL, 10340864UL,
+4284640000UL, 4285956864UL, 3430714118UL, 2273809152UL, 1166453760UL, 158907392UL,
+ 8504832UL, 8439808UL, 8242176UL, 4282089728UL, 4282552576UL, 3679493632UL,
+2690162944UL, 1633461760UL, 593078528UL, 5944320UL, 6732288UL, 7060992UL,
+4280325632UL, 4280196864UL, 3760366848UL, 2922292736UL, 1966187520UL, 1060480256UL,
+ 221423360UL, 4368640UL, 5419008UL, 4278886144UL, 4278231296UL, 3640696832UL,
+3037701120UL, 2215879936UL, 1410704128UL, 555196416UL, 1612800UL, 3251456UL,
+4144013056UL, 3707802624UL, 3422590208UL, 3019938304UL, 2348850176UL, 1694539520UL,
+ 889233152UL, 117479424UL, 1348608UL, 3724579328UL, 3489696256UL, 3238037760UL,
+2936048896UL, 2449510400UL, 1946194432UL, 1426102272UL, 671127808UL, 38400UL,
+4292615945UL, 3538944278UL, 1878523928UL, 16647962UL, 16330251UL, 15566339UL,
+ 15249664UL, 14403072UL, 13421824UL, 4291180801UL, 4192668434UL, 2246838038UL,
+ 300881686UL, 15948544UL, 14715392UL, 13937152UL, 13417472UL, 12435712UL,
+4288825344UL, 4290465028UL, 3149939976UL, 1539196173UL, 566847232UL, 12748032UL,
+ 12625408UL, 12235776UL, 11384576UL, 4285617152UL, 4286734080UL, 3499386880UL,
+2459265792UL, 1251635200UL, 9927936UL, 10459904UL, 10332672UL, 9743872UL,
+4282666752UL, 4283392256UL, 3663424256UL, 2774692096UL, 1768518144UL, 677610240UL,
+ 6394880UL, 7054848UL, 7318016UL, 4280575744UL, 4280643328UL, 3727324416UL,
+2872342272UL, 2034007040UL, 1128235264UL, 221938944UL, 4887040UL, 5742080UL,
+4279073024UL, 4278680832UL, 3658120448UL, 2953870080UL, 2216328960UL, 1461486080UL,
+ 572294144UL, 1934592UL, 3508992UL, 4177559808UL, 3674241536UL, 3389028608UL,
+2969598464UL, 2332065024UL, 1644199424UL, 906002688UL, 100695040UL, 1343744UL,
+3623910656UL, 3389027840UL, 3187700736UL, 2868933888UL, 2399172864UL, 1895856384UL,
+1409318144UL, 721453312UL, 31488UL, 4292222976UL, 3807248909UL, 2700345356UL,
+1123745804UL, 16649227UL, 16458243UL, 15757824UL, 14785024UL, 14070272UL,
+4291175424UL, 4226027779UL, 2918383626UL, 1374620934UL, 149889537UL, 15090688UL,
+ 14184960UL, 13537792UL, 13018880UL, 4289341696UL, 4290521088UL, 3418891777UL,
+2093493248UL, 818557952UL, 12993536UL, 12742912UL, 12553984UL, 12099840UL,
+4286263808UL, 4287051264UL, 3516152576UL, 2476228608UL, 1453212416UL, 279005696UL,
+ 11037952UL, 11176704UL, 10721280UL, 4283579648UL, 4284171008UL, 3479586560UL,
+2708098048UL, 1836011264UL, 745689856UL, 7758592UL, 8617728UL, 8556032UL,
+4281153280UL, 4281287936UL, 3694545408UL, 2940162048UL, 2084918528UL, 1280070144UL,
+ 272982784UL, 5076224UL, 5998080UL, 4279454720UL, 4279259648UL, 3725808896UL,
+2971096832UL, 2182895616UL, 1495424512UL, 572678912UL, 2319872UL, 3764992UL,
+4278214400UL, 3791674880UL, 3372244224UL, 2936036864UL, 2248170496UL, 1694983168UL,
+ 956720384UL, 134242816UL, 1533952UL, 3590350336UL, 3321914112UL, 3070255360UL,
+2785042688UL, 2365612800UL, 1862296832UL, 1342203392UL, 704669696UL, 25856UL,
+4291827200UL, 4075356422UL, 3169976325UL, 1945632774UL, 687669253UL, 16583939UL,
+ 16521216UL, 15293952UL, 14517248UL, 4291105792UL, 4292675840UL, 3371237376UL,
+2012151808UL, 518586368UL, 14882304UL, 14496000UL, 13786624UL, 13270528UL,
+4289664512UL, 4290514432UL, 3401449472UL, 2277968128UL, 1086852608UL, 12849920UL,
+ 12990464UL, 12804096UL, 12418048UL, 4286978560UL, 4287764224UL, 3516273920UL,
+2509903872UL, 1537153536UL, 480517632UL, 11220480UL, 11492864UL, 11368960UL,
+4284163072UL, 4284490240UL, 3496419840UL, 2674729984UL, 1853040384UL, 947398912UL,
+ 8007680UL, 9067008UL, 9532416UL, 4281739776UL, 4080544256UL, 3460114944UL,
+2756127744UL, 2051878400UL, 1330721024UL, 307443200UL, 6114816UL, 6907392UL,
+4280034048UL, 4279839488UL, 3625659648UL, 2988454144UL, 2200187648UL, 1512519168UL,
+ 757936384UL, 2835968UL, 3889408UL, 4278596864UL, 4110431232UL, 3523228928UL,
+2969581056UL, 2214606592UL, 1644575744UL, 990659584UL, 168445440UL, 1592576UL,
+3741336832UL, 3389014784UL, 3070247936UL, 2684372480UL, 2298497024UL, 1828735232UL,
+1308642048UL, 654330624UL, 18688UL, 4291628544UL, 4142202880UL, 3521970176UL,
+2599682048UL, 1492779008UL, 519897088UL, 16647424UL, 16584704UL, 15289088UL,
+4291037184UL, 4292280320UL, 3470589952UL, 2547843072UL, 1457520640UL, 400424960UL,
+ 14290176UL, 14098176UL, 13913088UL, 4290119424UL, 4290772992UL, 3418161152UL,
+2562785280UL, 1589903360UL, 465960960UL, 12979712UL, 13051136UL, 12865024UL,
+4287367168UL, 4287889408UL, 3466067968UL, 2593718272UL, 1738539008UL, 648085504UL,
+ 11012608UL, 11610112UL, 11619840UL, 4284484864UL, 4200728320UL, 3462989312UL,
+2658206976UL, 1869940480UL, 1065027840UL, 159320576UL, 9054208UL, 9850624UL,
+4282193152UL, 4013691648UL, 3376549632UL, 2722828032UL, 2001735680UL, 1347621120UL,
+ 441979392UL, 6366208UL, 7227392UL, 4280294400UL, 3961395456UL, 3374322944UL,
+2737181952UL, 2100040960UL, 1479611904UL, 724834048UL, 3612160UL, 4536832UL,
+4278915328UL, 4060550400UL, 3506902272UL, 2970228736UL, 2349537536UL, 1661868800UL,
+ 974068992UL, 336860416UL, 1912576UL, 4076872192UL, 3456115200UL, 3087016704UL,
+2717918464UL, 2248157440UL, 1778395648UL, 1207970048UL, 587213824UL, 11264UL,
+4293459968UL, 4293787648UL, 3773825024UL, 3035824128UL, 2096562176UL, 1308229632UL,
+ 587005952UL, 167641088UL, 16711680UL, 4291035136UL, 4022730752UL, 3469869056UL,
+2882797568UL, 2027487232UL, 1222443008UL, 501022720UL, 14483456UL, 14548992UL,
+4290314240UL, 3903848448UL, 3350659072UL, 2797404160UL, 2059468800UL, 1204027392UL,
+ 449183744UL, 13041664UL, 13172736UL, 4153344000UL, 3733913600UL, 3348496384UL,
+2761687040UL, 2091122688UL, 1319567360UL, 480903168UL, 11468800UL, 11927552UL,
+4066770944UL, 3630759936UL, 3295608832UL, 2725773312UL, 2054881280UL, 1417740288UL,
+ 562233344UL, 9109504UL, 9961472UL, 4282449920UL, 3762421760UL, 3242786816UL,
+2639265792UL, 2052587520UL, 1448804352UL, 710868992UL, 6488064UL, 7405568UL,
+3944218624UL, 3592290304UL, 3206742016UL, 2636906496UL, 2066808832UL, 1479868416UL,
+ 792133632UL, 121372672UL, 5046272UL, 3976200192UL, 3590324224UL, 3238330368UL,
+2752118784UL, 2114846720UL, 1527906304UL, 924123136UL, 253296640UL, 2490368UL,
+4278190080UL, 3657433088UL, 3254779904UL, 2818572288UL, 2298478592UL, 1795162112UL,
+1224736768UL, 603979776UL, 0UL,
+};
+
+uint32_t ulMapDJ970_Gossimer_Normal_KCMY[ 9*9*9 ]=
+{
+3351632640UL, 2545805056UL, 1604580608UL, 982710016UL, 646379776UL, 343603456UL,
+ 158529792UL, 6945024UL, 6813952UL, 3951407872UL, 2543246848UL, 1821825536UL,
+ 831126272UL, 343537920UL, 124843776UL, 7010048UL, 6877440UL, 6744832UL,
+4116689152UL, 3446196736UL, 1835912448UL, 1097779456UL, 358863872UL, 6018304UL,
+ 6540544UL, 6671616UL, 6540544UL, 4114591232UL, 3947086592UL, 2706096640UL,
+1246349568UL, 642302976UL, 88260864UL, 4829952UL, 5157376UL, 5486336UL,
+4113345536UL, 4012686592UL, 3056777984UL, 2050081024UL, 774753024UL, 321766912UL,
+ 3256832UL, 3842560UL, 4103936UL, 4078807808UL, 4011636480UL, 3273701888UL,
+2468656896UL, 1478476800UL, 471453696UL, 119390720UL, 2794752UL, 3315712UL,
+4044531456UL, 3977294592UL, 3440555776UL, 2736304384UL, 1981330432UL, 1058195456UL,
+ 269210368UL, 1292544UL, 2399232UL, 4043809792UL, 4010257408UL, 3523850240UL,
+2920197120UL, 2316414208UL, 1561376000UL, 755485440UL, 67163392UL, 1289728UL,
+4076903680UL, 3808468480UL, 3355482880UL, 2801832704UL, 2231406080UL, 1644203776UL,
+ 973118720UL, 503365376UL, 52224UL, 3737164032UL, 2414321408UL, 1121105152UL,
+ 398182656UL, 10607872UL, 9496320UL, 8778496UL, 8189184UL, 7534336UL,
+4186805760UL, 2711663104UL, 1990112000UL, 932235520UL, 259776768UL, 7268608UL,
+ 7200256UL, 7262976UL, 7131136UL, 4284259072UL, 3379471616UL, 2272503552UL,
+1232382720UL, 476953088UL, 6603008UL, 6668544UL, 6668544UL, 6603008UL,
+4181368832UL, 3544622848UL, 2588713472UL, 1515038208UL, 726378240UL, 155625728UL,
+ 4893184UL, 5352704UL, 5616128UL, 4146372864UL, 3643516160UL, 2838601728UL,
+1983029248UL, 942842368UL, 372285696UL, 3185664UL, 3708672UL, 4102912UL,
+4078215424UL, 3625492992UL, 2971507968UL, 2250283520UL, 1327471872UL, 572432640UL,
+ 119381248UL, 2527232UL, 3116032UL, 4077560320UL, 3591085568UL, 3071252992UL,
+2417071872UL, 1712559872UL, 907058432UL, 269459456UL, 1217536UL, 2132736UL,
+3909131008UL, 3489699072UL, 3104084992UL, 2533790208UL, 1980273152UL, 1225363968UL,
+ 621190144UL, 84188672UL, 1216512UL, 3808465920UL, 3489697792UL, 3187708160UL,
+2684391424UL, 2164296704UL, 1526761984UL, 889228800UL, 436248832UL, 41472UL,
+3888412160UL, 2631563008UL, 1339844864UL, 399216128UL, 12100096UL, 11121664UL,
+ 10141696UL, 9358592UL, 8706304UL, 4288117504UL, 3064168704UL, 1990820352UL,
+ 866487552UL, 194746368UL, 9742592UL, 9155328UL, 8567040UL, 7978496UL,
+4283521280UL, 3295969024UL, 2122091008UL, 1283034880UL, 527473920UL, 6596864UL,
+ 6729984UL, 6664960UL, 6533120UL, 4281826048UL, 3309666560UL, 2538505728UL,
+1548781824UL, 760188160UL, 189371392UL, 5151488UL, 5611520UL, 5678080UL,
+4213410304UL, 3358230016UL, 2721155072UL, 1899202560UL, 942770944UL, 372280320UL,
+ 3181056UL, 3837440UL, 4297984UL, 4178808320UL, 3373696768UL, 2820442112UL,
+2132706816UL, 1260291584UL, 555582720UL, 119309056UL, 2457344UL, 3047168UL,
+4144468480UL, 3356133376UL, 2869659136UL, 2265809920UL, 1544454656UL, 839746048UL,
+ 286032640UL, 1145600UL, 1996544UL, 3724577792UL, 3288368128UL, 2902491904UL,
+2415952896UL, 1795457536UL, 1090879232UL, 536904448UL, 32512UL, 1079296UL,
+3623913216UL, 3271589888UL, 2952823040UL, 2550170112UL, 2046853376UL, 1409318144UL,
+ 855670016UL, 385908992UL, 33024UL, 4022356992UL, 2848934912UL, 1741574400UL,
+ 785336320UL, 96562432UL, 11963136UL, 11181056UL, 10266368UL, 9745408UL,
+3952694016UL, 3047315456UL, 2124831488UL, 1118330368UL, 279145472UL, 10388224UL,
+ 10130432UL, 9477376UL, 8823808UL, 3698415872UL, 3094960896UL, 2306760192UL,
+1317233152UL, 478374400UL, 8419328UL, 8620800UL, 8230144UL, 7575808UL,
+3980742912UL, 3243072512UL, 2522111232UL, 1532650496UL, 777415680UL, 206535168UL,
+ 5343744UL, 5608192UL, 5673984UL, 4112867840UL, 3257688320UL, 2586796288UL,
+1848993280UL, 942958336UL, 389311232UL, 3436800UL, 4030208UL, 4491264UL,
+3776212736UL, 3222759424UL, 2652464384UL, 2048813056UL, 1209952000UL, 572352512UL,
+ 119302144UL, 2517504UL, 3175424UL, 3725097216UL, 3238620416UL, 2735302912UL,
+2232314624UL, 1477339648UL, 806250496UL, 286025472UL, 1074432UL, 1925888UL,
+3556800512UL, 3170921472UL, 2768267776UL, 2298505984UL, 1694526208UL, 1023436544UL,
+ 486565120UL, 25344UL, 942080UL, 3523246080UL, 3154144256UL, 2768267520UL,
+2449501184UL, 1929407744UL, 1342204672UL, 822110208UL, 369124864UL, 25088UL,
+3853987072UL, 2982686464UL, 1925853696UL, 1086862848UL, 482881792UL, 12473344UL,
+ 11761664UL, 11045632UL, 10327808UL, 3751359232UL, 3013686272UL, 2175154176UL,
+1252473600UL, 581385472UL, 10571776UL, 10383616UL, 9994752UL, 9538816UL,
+3598006528UL, 3061594880UL, 2306948352UL, 1417953024UL, 663175168UL, 8604416UL,
+ 8939776UL, 8944640UL, 8487936UL, 3444522240UL, 2991799808UL, 2388213760UL,
+1616724224UL, 794837760UL, 157239296UL, 6774528UL, 7172608UL, 6912768UL,
+3727570688UL, 3224452352UL, 2603892480UL, 1849180416UL, 943210752UL, 406407936UL,
+ 3626496UL, 4221696UL, 4617216UL, 3944104960UL, 3222881024UL, 2602189824UL,
+1914520832UL, 1210140672UL, 555829248UL, 102779648UL, 2774528UL, 3368192UL,
+3674886912UL, 3121236992UL, 2617854208UL, 2047559936UL, 1410354176UL, 789596672UL,
+ 252594688UL, 1199104UL, 1987072UL, 3556793856UL, 3019919872UL, 2617265408UL,
+2164280320UL, 1610829824UL, 973098240UL, 453003008UL, 17664UL, 870912UL,
+3405800448UL, 2969589504UL, 2583711744UL, 2248167424UL, 1845515776UL, 1224758016UL,
+ 788548864UL, 369117440UL, 17920UL, 3853850880UL, 3166837248UL, 2160729088UL,
+1154162432UL, 634003968UL, 281551360UL, 12468992UL, 11757312UL, 11107840UL,
+3751353344UL, 3013417984UL, 2242060288UL, 1302799360UL, 682108160UL, 245901568UL,
+ 10699008UL, 10313728UL, 9991424UL, 3547931136UL, 3061719808UL, 2307073024UL,
+1502029568UL, 763963648UL, 210446848UL, 9125632UL, 9198336UL, 8874752UL,
+3344049664UL, 2991990528UL, 2371627008UL, 1616849408UL, 878914048UL, 291843072UL,
+ 7027712UL, 7558144UL, 7430656UL, 3291884288UL, 2939562496UL, 2402888192UL,
+1748839168UL, 1044458240UL, 423701760UL, 4338432UL, 5130240UL, 5461504UL,
+3592299776UL, 3206424576UL, 2652908032UL, 1965239296UL, 1227173120UL, 606350080UL,
+ 136721408UL, 2834176UL, 3428096UL, 3876401152UL, 3188534784UL, 2668441344UL,
+2014130176UL, 1309618176UL, 789721856UL, 286339840UL, 1390080UL, 2113280UL,
+3640670976UL, 3036689664UL, 2566927616UL, 2046833664UL, 1409298944UL, 923022848UL,
+ 486749440UL, 12288UL, 931584UL, 3405793024UL, 2852142592UL, 2466265856UL,
+2063612160UL, 1644181760UL, 1157643008UL, 721434880UL, 352335104UL, 12800UL,
+3987999744UL, 3401780224UL, 2396064512UL, 1154878464UL, 534122240UL, 282268160UL,
+ 147724544UL, 12662272UL, 12212480UL, 3818458624UL, 3080457472UL, 2342653696UL,
+1453723904UL, 732500736UL, 346625536UL, 111680000UL, 10827008UL, 10572288UL,
+3581678080UL, 3045069056UL, 2307002624UL, 1552356096UL, 797578496UL, 294393344UL,
+ 9181952UL, 9450752UL, 9325824UL, 3361150464UL, 2975405056UL, 2371752960UL,
+1617040896UL, 929437440UL, 359143424UL, 7150336UL, 7681280UL, 7817472UL,
+3224967680UL, 2872645632UL, 2386302976UL, 1715476736UL, 1010964992UL, 507779584UL,
+ 4462592UL, 5385984UL, 5849088UL, 3240369152UL, 2921536256UL, 2401573376UL,
+1781013248UL, 1126898432UL, 640489728UL, 153951232UL, 3352576UL, 3880448UL,
+3574798336UL, 3172014080UL, 2668698112UL, 2048072448UL, 1309940736UL, 806690048UL,
+ 370547200UL, 1647616UL, 2174976UL, 3909426944UL, 3171098112UL, 2634029824UL,
+2046827520UL, 1358961920UL, 805313536UL, 470098432UL, 67379200UL, 1058560UL,
+3590335232UL, 2986354688UL, 2449483776UL, 1979721472UL, 1493182464UL, 1006642944UL,
+ 654321408UL, 318776832UL, 8704UL, 3987800832UL, 3619946496UL, 2714828800UL,
+1507524608UL, 517931008UL, 15269888UL, 14616064UL, 14289920UL, 13314816UL,
+4086891520UL, 3113877504UL, 2493448192UL, 1671757824UL, 833356800UL, 397215232UL,
+ 162334976UL, 95030784UL, 11413760UL, 3648980480UL, 3078684672UL, 2340487168UL,
+1669857280UL, 915145984UL, 395183616UL, 93193728UL, 9506816UL, 9906688UL,
+3394963456UL, 2992572160UL, 2405631488UL, 1667565056UL, 979961344UL, 443287296UL,
+ 74319872UL, 7738368UL, 8203264UL, 3275492352UL, 2856061440UL, 2352875520UL,
+1681983488UL, 1011025920UL, 558237952UL, 122291968UL, 5444608UL, 6105344UL,
+3223916800UL, 2804420096UL, 2317945600UL, 1730874112UL, 1110248192UL, 640617216UL,
+ 170920704UL, 3543808UL, 4006912UL, 3340243200UL, 2971012864UL, 2467696128UL,
+1813449984UL, 1159269376UL, 739904512UL, 320604416UL, 1970176UL, 2497792UL,
+3809020416UL, 3188197632UL, 2684815360UL, 2080836608UL, 1426525440UL, 872877568UL,
+ 503779072UL, 168364800UL, 1186048UL, 4143977472UL, 3238007296UL, 2650804992UL,
+2080379904UL, 1526732288UL, 973084160UL, 587207680UL, 318772992UL, 5376UL,
+3954376704UL, 3888250880UL, 3167879168UL, 2145189888UL, 988348416UL, 385548288UL,
+ 67043328UL, 16711680UL, 16711680UL, 4086824960UL, 3197632512UL, 2778791936UL,
+2192244736UL, 1286864896UL, 616235008UL, 331153408UL, 213843968UL, 12386304UL,
+3716153344UL, 3045064704UL, 2491613184UL, 2005532672UL, 1284505600UL, 630456320UL,
+ 311754752UL, 144048128UL, 9895936UL, 3412131840UL, 2975989760UL, 2422538240UL,
+1852440576UL, 1215168512UL, 661782528UL, 259260416UL, 7733248UL, 8060928UL,
+3225354240UL, 2856255488UL, 2369912832UL, 1766260736UL, 1145700352UL, 692912128UL,
+ 256901120UL, 5570560UL, 6160384UL, 3324510208UL, 2854879232UL, 2284584960UL,
+1731067904UL, 1110507520UL, 674299904UL, 322174976UL, 3604480UL, 4194304UL,
+3323068416UL, 2819948544UL, 2283274240UL, 1696202752UL, 1109131264UL, 723320832UL,
+ 371130368UL, 2162688UL, 2686976UL, 3624140800UL, 3121086464UL, 2533883904UL,
+1913192448UL, 1208614912UL, 738918400UL, 470614016UL, 152109056UL, 1441792UL,
+4244635648UL, 3053453312UL, 2600468480UL, 2097152000UL, 1543503872UL, 1006632960UL,
+ 587202560UL, 301989888UL, 0
+};
+
+uint32_t ulMapDJ970_Draft_KCMY[ 9*9*9 ]=
+{
+1802205183UL, 22740362UL, 5832524UL, 5635892UL, 5570340UL, 5308188UL,
+ 5308180UL, 5504778UL, 5504768UL, 4278239136UL, 65446UL, 4194132UL,
+ 5308210UL, 5373728UL, 5308182UL, 5504784UL, 5504776UL, 5504768UL,
+4278498896UL, 1862336354UL, 65388UL, 2621242UL, 4128540UL, 4718348UL,
+ 5570304UL, 5177088UL, 5111552UL, 4278758188UL, 4278317636UL, 1291910980UL,
+ 65356UL, 1638182UL, 2817798UL, 3866368UL, 4325120UL, 4652288UL,
+4279018260UL, 4278239016UL, 2717974318UL, 872480562UL, 65330UL, 1113876UL,
+ 2162432UL, 3407616UL, 4128512UL, 4279147522UL, 4278239002UL, 4009819936UL,
+1778450206UL, 604045088UL, 65310UL, 851206UL, 2227968UL, 3079936UL,
+4278688260UL, 4278563846UL, 4278244882UL, 2936078096UL, 1375797010UL, 469827346UL,
+ 16842514UL, 851712UL, 2096896UL, 4278425088UL, 4278428928UL, 4278237184UL,
+4093705984UL, 2097217286UL, 1073806598UL, 385941254UL, 65286UL, 917248UL,
+4278222592UL, 4278226176UL, 4278232832UL, 4244692736UL, 3288399616UL, 1812004608UL,
+ 922812160UL, 335609088UL, 65280UL, 3724477142UL, 16718478UL, 33550676UL,
+ 13303598UL, 9830180UL, 7798550UL, 6553360UL, 6553352UL, 6160128UL,
+4282864474UL, 2206438326UL, 6029146UL, 5963570UL, 5766942UL, 5701394UL,
+ 5766922UL, 5832448UL, 5570304UL, 4280056368UL, 4278842230UL, 320208754UL,
+ 20249912UL, 4718358UL, 5373702UL, 5439232UL, 5439232UL, 5308160UL,
+4279667474UL, 4278433338UL, 1644429122UL, 370278210UL, 69271328UL, 3145472UL,
+ 4324608UL, 4783872UL, 5046016UL, 4279405826UL, 4278628890UL, 3137404712UL,
+1174732586UL, 420805918UL, 237043456UL, 2686720UL, 3735296UL, 4390656UL,
+4279077120UL, 4278628358UL, 4278253844UL, 2047147790UL, 1091370762UL, 437649158UL,
+ 118947584UL, 2490112UL, 3342080UL, 4278619648UL, 4278428416UL, 4278241024UL,
+3120627460UL, 1745288960UL, 822869760UL, 302907136UL, 917248UL, 2490112UL,
+4278223616UL, 4278226432UL, 4278235904UL, 4278255360UL, 2499870464UL, 1392574208UL,
+ 637861632UL, 134545152UL, 1048320UL, 4278220544UL, 4278222592UL, 4278230528UL,
+4278243072UL, 3170957056UL, 2097217280UL, 1040252672UL, 419495680UL, 65280UL,
+4292804720UL, 503119998UL, 16718158UL, 16746540UL, 16771616UL, 29556490UL,
+ 11271936UL, 9502464UL, 8650496UL, 4285475388UL, 2885626240UL, 167729236UL,
+ 16758306UL, 15335178UL, 11664640UL, 9699072UL, 7732992UL, 7339776UL,
+4282796800UL, 4282866746UL, 2374868552UL, 528613152UL, 88866564UL, 6618880UL,
+ 6225664UL, 6225664UL, 6618880UL, 4280441088UL, 4280251412UL, 3962958640UL,
+1195375408UL, 492044036UL, 5046016UL, 5504768UL, 5766912UL, 5832448UL,
+4279527168UL, 4279598848UL, 4246063890UL, 2082471702UL, 909049610UL, 321847040UL,
+ 3407616UL, 4390656UL, 4914944UL, 4278938880UL, 4278812928UL, 4278698244UL,
+3071737090UL, 1595604736UL, 656408320UL, 153026304UL, 3012352UL, 3865344UL,
+4278481408UL, 4278222336UL, 4278233856UL, 3892707072UL, 2215182080UL, 973930240UL,
+ 403700480UL, 1106176UL, 2346496UL, 4278217984UL, 4278220032UL, 4278228992UL,
+4144027904UL, 2600525056UL, 1543564288UL, 671150080UL, 134278144UL, 1032960UL,
+4278218496UL, 4278221824UL, 4278227200UL, 3959468800UL, 2751510016UL, 1996537088UL,
+1107352832UL, 503374848UL, 58368UL, 4291364662UL, 1845428294UL, 150929488UL,
+ 16717104UL, 16605464UL, 16756486UL, 16774656UL, 12975872UL, 10223360UL,
+4287437850UL, 4293789518UL, 553586254UL, 33501734UL, 16739844UL, 16761856UL,
+ 15924992UL, 12844800UL, 10157824UL, 4283576576UL, 4251463964UL, 2830980654UL,
+ 820802084UL, 184527360UL, 16776960UL, 12779264UL, 10223360UL, 9240320UL,
+4280889344UL, 4281876992UL, 4284576524UL, 2324339712UL, 864667136UL, 108199680UL,
+ 7339264UL, 7077632UL, 7143168UL, 4279648512UL, 4279782656UL, 4247287040UL,
+2957291776UL, 1363851520UL, 440777984UL, 4711424UL, 5896960UL, 6094592UL,
+4278996992UL, 4278933248UL, 4279268864UL, 3458382080UL, 1864676864UL, 791131904UL,
+ 153467392UL, 3259648UL, 4052224UL, 4278408960UL, 4278212864UL, 4278221056UL,
+3893081600UL, 2249111296UL, 1057993728UL, 403812352UL, 1223168UL, 2403072UL,
+4278213632UL, 4278216960UL, 4278222592UL, 3825248000UL, 2449517056UL, 1459662336UL,
+ 654355968UL, 83928064UL, 1023488UL, 4278216192UL, 4278217984UL, 4278223104UL,
+3523252992UL, 2600507392UL, 1845533440UL, 1057006592UL, 503358720UL, 41216UL,
+4290644754UL, 3221159980UL, 905904176UL, 16712244UL, 16584982UL, 16731654UL,
+ 16744960UL, 16631808UL, 16514816UL, 4287894786UL, 4258923556UL, 1325335340UL,
+ 134023468UL, 16721664UL, 16735232UL, 16747264UL, 16764416UL, 15793920UL,
+4284029696UL, 4286520328UL, 3976146960UL, 1174352154UL, 352274944UL, 16742912UL,
+ 16755456UL, 16507904UL, 13299712UL, 4281671424UL, 4282459904UL, 4286072320UL,
+2610913280UL, 933718016UL, 10648320UL, 11446272UL, 11255552UL, 10407424UL,
+4279835904UL, 4280101120UL, 4281418240UL, 3075696896UL, 1566403328UL, 508855296UL,
+ 5348864UL, 6338816UL, 6733568UL, 4279053568UL, 4279055104UL, 4279519488UL,
+3274142208UL, 1965914624UL, 841974016UL, 153847552UL, 3644160UL, 4369664UL,
+4278467328UL, 4278337024UL, 4278539264UL, 3574364160UL, 2249424384UL, 1108706048UL,
+ 420840960UL, 1410816UL, 2592768UL, 4244652800UL, 4244656128UL, 4278214656UL,
+3640686336UL, 2415950592UL, 1392540928UL, 671121664UL, 67140096UL, 1016064UL,
+4278212096UL, 4278213632UL, 4278216960UL, 3271585536UL, 2516612352UL, 1761637632UL,
+1056996096UL, 536903936UL, 30720UL, 4289858560UL, 3841916954UL, 1610547224UL,
+ 436011032UL, 16712726UL, 16583942UL, 16727040UL, 16738816UL, 16751872UL,
+4287892736UL, 4258334214UL, 1862205460UL, 587007244UL, 66915842UL, 16719616UL,
+ 16730624UL, 16742400UL, 16621568UL, 4284419840UL, 4286648064UL, 4294186498UL,
+1727994624UL, 503258880UL, 16591616UL, 16736000UL, 16747776UL, 15970560UL,
+4282126848UL, 4282717184UL, 4285997312UL, 2628005888UL, 1101869568UL, 212940544UL,
+ 12346112UL, 12554240UL, 11838464UL, 4280161792UL, 4280555776UL, 4282656768UL,
+2975807744UL, 1667644160UL, 560676352UL, 7427072UL, 8683008UL, 8623360UL,
+4279243776UL, 4279310592UL, 4279969024UL, 3526310912UL, 2050178816UL, 960052480UL,
+ 204690432UL, 3763968UL, 4753664UL, 4278656000UL, 4278590976UL, 4278790400UL,
+3641786880UL, 2199208960UL, 1159286016UL, 421090304UL, 1726720UL, 2780160UL,
+4278200064UL, 4278202368UL, 4278205952UL, 3523235072UL, 2298497536UL, 1459967488UL,
+ 704927488UL, 100684544UL, 1137664UL, 4278206208UL, 4244654080UL, 4026552576UL,
+3103805696UL, 2466272256UL, 1711298304UL, 1006655744UL, 520117248UL, 22272UL,
+4289136640UL, 4293591052UL, 2399076362UL, 973013004UL, 268369930UL, 16712710UL,
+ 16713984UL, 16723200UL, 16734464UL, 4287760128UL, 4290708224UL, 2835283968UL,
+1090322432UL, 234815488UL, 16714240UL, 16717824UL, 16726272UL, 16737792UL,
+4285073408UL, 4286645504UL, 4292411392UL, 1979647232UL, 687802368UL, 16714752UL,
+ 16589824UL, 16729856UL, 16741888UL, 4282648832UL, 4283238400UL, 4286122752UL,
+2678526464UL, 1219367680UL, 364254720UL, 12789760UL, 13782272UL, 13268736UL,
+4280552704UL, 4280814592UL, 4282716928UL, 2925730560UL, 1701584128UL, 712252928UL,
+ 7808000UL, 9389824UL, 10055168UL, 4279504640UL, 4279636224UL, 4280489984UL,
+3056935168UL, 2000232960UL, 993797120UL, 222177280UL, 4930048UL, 6117632UL,
+4278848768UL, 4278784000UL, 4279113472UL, 3709346816UL, 2216371712UL, 1193093120UL,
+ 555820032UL, 2110464UL, 2901248UL, 4278326016UL, 4278195200UL, 4278197504UL,
+3640666112UL, 2248157440UL, 1392782592UL, 738800384UL, 117912576UL, 1194240UL,
+4278198528UL, 4278200576UL, 4026544896UL, 2952803328UL, 2365601280UL, 1660958208UL,
+ 973092864UL, 486553600UL, 13824UL, 4288742656UL, 4292608000UL, 3254714368UL,
+1526661120UL, 603783168UL, 201261056UL, 16711936UL, 16713216UL, 16720128UL,
+4287628032UL, 4289986560UL, 3640590336UL, 1828651008UL, 721354752UL, 201261056UL,
+ 16713216UL, 16715776UL, 16722176UL, 4285923840UL, 4287168512UL, 4292018176UL,
+2533294080UL, 1140785152UL, 301793280UL, 16582912UL, 16717568UL, 16724736UL,
+4282974976UL, 4283367424UL, 4286513152UL, 2812608512UL, 1521483776UL, 481361920UL,
+ 12322560UL, 14228992UL, 14236160UL, 4280812544UL, 4247454208UL, 4282909440UL,
+2909340416UL, 1718551808UL, 796395008UL, 108922624UL, 9379328UL, 10566400UL,
+4279633664UL, 4246276096UL, 4280813824UL, 3006794496UL, 1916537856UL, 1010699264UL,
+ 323226880UL, 5315328UL, 6632960UL, 4278979072UL, 4279044608UL, 4279438592UL,
+3021737728UL, 2065764096UL, 1143214080UL, 539431168UL, 2692608UL, 3353344UL,
+4278453760UL, 4278323200UL, 4278389504UL, 3641119232UL, 2450002432UL, 1409946624UL,
+ 722146560UL, 252645120UL, 1385216UL, 4278193408UL, 4278194944UL, 4076870144UL,
+3003128576UL, 2298486272UL, 1593843456UL, 905977344UL, 436216064UL, 8448UL,
+4292214784UL, 4292804608UL, 3707699200UL, 2097086464UL, 1090453504UL, 503119872UL,
+ 218038272UL, 67043328UL, 16711680UL, 4287627264UL, 4255580160UL, 4076797952UL,
+2399076352UL, 1358888960UL, 603914240UL, 251592704UL, 16711680UL, 16711680UL,
+4286316544UL, 4286578688UL, 4291493888UL, 3019833344UL, 1845428224UL, 788463616UL,
+ 285016064UL, 16711680UL, 16711680UL, 4283367424UL, 4284678144UL, 4287102976UL,
+3064594432UL, 2058747904UL, 985268224UL, 364838912UL, 13762560UL, 15466496UL,
+4281401344UL, 4282449920UL, 4284088320UL, 3010723840UL, 2004353024UL, 1065418752UL,
+ 411303936UL, 9437184UL, 10747904UL, 4279762944UL, 4280221696UL, 4281466880UL,
+2872836096UL, 2000945152UL, 1095237632UL, 525205504UL, 5505024UL, 6881280UL,
+4278845440UL, 4279238656UL, 4279762944UL, 2871066624UL, 2015625216UL, 1143406592UL,
+ 589889536UL, 86835200UL, 3735552UL, 4278190080UL, 4278190080UL, 4278386688UL,
+3053912064UL, 2097807360UL, 1208811520UL, 688848896UL, 185729024UL, 1835008UL,
+4278190080UL, 4278190080UL, 4278190080UL, 3154116608UL, 2365587456UL, 1610612736UL,
+ 905969664UL, 452984832UL, 0UL,
+};
+
+
diff --git a/prnt/hpcups/dj970PrintModes.h b/prnt/hpcups/dj970PrintModes.h
new file mode 100644
index 0000000..3d81f2f
--- /dev/null
+++ b/prnt/hpcups/dj970PrintModes.h
@@ -0,0 +1,60 @@
+PrintMode dj970PrintModes[] =
+{
+ {
+ "PlainDraftColor",
+ {300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300},
+ {1, 1, 1, 1, 1, 1}, 4, FED,
+ {ulMapDJ970_Draft_KCMY, NULL, NULL},
+ 300, 300, false, HTBinary_open, HTBinary_open
+ },
+ {
+ "PlainDraftGrayK",
+ {300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300},
+ {1, 1, 1, 1, 1, 1}, 1, FED,
+ {ulMapDJ600_CCM_K, NULL, NULL},
+ 300, 300, false, HTBinary_open, HTBinary_open
+ },
+ {
+ "PlainNormalColor",
+ {600, 300, 300, 300, 300, 300},
+ {600, 300, 300, 300, 300, 300},
+ {1, 2, 2, 2, 2, 2}, 4, FED,
+ {ulMapDJ970_KCMY_3x3x2, NULL, NULL},
+ 300, 300, true, HTBinary_open, HT300x3004level970_open
+ },
+ {
+ "PlainNormalGrayK",
+ {600, 300, 300, 300, 300, 300},
+ {600, 300, 300, 300, 300, 300},
+ {1, 1, 1, 1, 1, 1}, 1, FED,
+ {ulMapGRAY_K_6x6x1, NULL, NULL},
+ 600, 600, false, HTBinary_open, HTBinary_open
+ },
+ {
+ "PlainBestColor",
+ {600, 600, 600, 600, 600, 600},
+ {600, 600, 600, 600, 600, 600},
+ {1, 2, 2, 2, 2, 2}, 4, FED,
+ {ulMapDJ970_KCMY, NULL, NULL},
+ 600, 600, false, HTBinary_open, HT600x600x4_Pres970_open
+ },
+ {
+ "PhotoBestColor",
+ {600, 600, 600, 600, 600, 600},
+ {600, 600, 600, 600, 600, 600},
+ {1, 2, 2, 2, 2, 2}, 4, FED,
+ {ulMapDJ970_Gossimer_Normal_KCMY, NULL, NULL},
+ 600, 600, false, HTBinary_open, HT600x6004level970_open
+ },
+ {
+ "PhotoMaxDpiColor",
+ {1200, 1200, 1200, 1200, 1200, 1200},
+ {1200, 1200, 1200, 1200, 1200, 1200},
+ {1, 1, 1, 1, 1, 1}, 4, FED,
+ {ulMapDJ970_Gossimer_Normal_KCMY, NULL, NULL},
+ 1200, 1200, false, HTBinary_open, HT1200x1200x1_PhotoPres970_open
+ }
+};
+
diff --git a/prnt/hpcups/hpjbig_wrapper.h b/prnt/hpcups/hpjbig_wrapper.h
new file mode 100644
index 0000000..230e298
--- /dev/null
+++ b/prnt/hpcups/hpjbig_wrapper.h
@@ -0,0 +1,49 @@
+/*****************************************************************************\
+ hpjbig_wrapper.h : header file for hpjbig_wrapper.c
+
+ Copyright (c) 1996 - 2007, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+typedef struct
+{
+ unsigned char *pszCompressedData;
+ unsigned long dwTotalSize;
+} HPLJZjcBuff;
+
+typedef struct
+{
+ unsigned long xd;
+ unsigned long yd;
+ unsigned long l0;
+ unsigned int mx;
+ unsigned int my;
+ int order;
+ int planes;
+ int dl;
+ int d;
+ int options;
+} HPLJZjsJbgEncSt;
diff --git a/prnt/hpcups/jccolor.c b/prnt/hpcups/jccolor.c
new file mode 100644
index 0000000..7cc8906
--- /dev/null
+++ b/prnt/hpcups/jccolor.c
@@ -0,0 +1,533 @@
+/*
+ * jccolor.c
+ *
+ * Copyright (C) 1991-1996, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains input colorspace conversion routines.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+
+//#define USE_MOJAVE_CSC
+
+/* Private subobject */
+
+typedef struct {
+ struct jpeg_color_converter pub; /* public fields */
+
+ /* Private state for RGB->YCC conversion */
+ INT32 * rgb_ycc_tab; /* => table for RGB to YCbCr conversion */
+} my_color_converter;
+
+typedef my_color_converter * my_cconvert_ptr;
+
+
+/**************** RGB -> YCbCr conversion: most common case **************/
+
+/*
+ * YCbCr is defined per CCIR 601-1, except that Cb and Cr are
+ * normalized to the range 0..MAXJSAMPLE rather than -0.5 .. 0.5.
+ * The conversion equations to be implemented are therefore
+ * Y = 0.29900 * R + 0.58700 * G + 0.11400 * B
+ * Cb = -0.16874 * R - 0.33126 * G + 0.50000 * B + CENTERJSAMPLE
+ * Cr = 0.50000 * R - 0.41869 * G - 0.08131 * B + CENTERJSAMPLE
+ *
+ * NOTE:
+ * The CSC was changed to the values below as per the Mojave
+ * specification. These values are enabled by the compile time flag
+ * USE_MOJAVE_CSC defined below.
+ *
+ * Y = 0.50000 * R + 0.00000 * G + 0.00000 * B
+ * Cb = 0.50000 * R - 0.50000 * G + 0.00000 * B + CENTERJSAMPLE
+ * Cr = 0.50000 * R + 0.00000 * G - 0.50000 * B + CENTERJSAMPLE
+ *
+ * (These numbers are derived from TIFF 6.0 section 21, dated 3-June-92.)
+ * Note: older versions of the IJG code used a zero offset of MAXJSAMPLE/2,
+ * rather than CENTERJSAMPLE, for Cb and Cr. This gave equal positive and
+ * negative swings for Cb/Cr, but meant that grayscale values (Cb=Cr=0)
+ * were not represented exactly. Now we sacrifice exact representation of
+ * maximum red and maximum blue in order to get exact grayscales.
+ *
+ * To avoid floating-point arithmetic, we represent the fractional constants
+ * as integers scaled up by 2^16 (about 4 digits precision); we have to divide
+ * the products by 2^16, with appropriate rounding, to get the correct answer.
+ *
+ * For even more speed, we avoid doing any multiplications in the inner loop
+ * by precalculating the constants times R,G,B for all possible values.
+ * For 8-bit JSAMPLEs this is very reasonable (only 256 entries per table);
+ * for 12-bit samples it is still acceptable. It's not very reasonable for
+ * 16-bit samples, but if you want lossless storage you shouldn't be changing
+ * colorspace anyway.
+ * The CENTERJSAMPLE offsets and the rounding fudge-factor of 0.5 are included
+ * in the tables to save adding them separately in the inner loop.
+ */
+
+#define SCALEBITS 16 /* speediest right-shift on some machines */
+#define CBCR_OFFSET ((INT32) CENTERJSAMPLE << SCALEBITS)
+#define ONE_HALF ((INT32) 1 << (SCALEBITS-1))
+#define FIX(x) ((INT32) ((x) * (1L<<SCALEBITS) + 0.5))
+
+/* We allocate one big table and divide it up into eight parts, instead of
+ * doing eight alloc_small requests. This lets us use a single table base
+ * address, which can be held in a register in the inner loops on many
+ * machines (more than can hold all eight addresses, anyway).
+ */
+
+int iUseMojaveCsc = 1;
+
+int R_Y_OFF; /* offset to R => Y section */
+int G_Y_OFF; /* offset to G => Y section */
+int B_Y_OFF; /* offset to B => Y section */
+int R_CB_OFF; /* R=>Y, R=>Cb are the same */
+int G_CB_OFF; /* offset to G => Cb section */
+int B_CB_OFF; /* G=>Y, B=>Cb are the same */
+int R_CR_OFF; /* R=>Y, R=>Cr are the same */
+int G_CR_OFF; /* G=>Y, G=>Cr are the same */
+int B_CR_OFF; /* G=>Cb, B=>Cr are the same */
+int TABLE_SIZE;
+
+void hp_rgb_ycc_setup (int iFlag)
+{
+ iUseMojaveCsc = iFlag;
+ if (iUseMojaveCsc)
+ {
+ R_Y_OFF = 0; /* offset to R => Y section */
+ G_Y_OFF = (1*(MAXJSAMPLE+1)); /* offset to G => Y section */
+ B_Y_OFF = (2*(MAXJSAMPLE+1)); /* offset to B => Y section */
+ R_CB_OFF = R_Y_OFF; /* R=>Y, R=>Cb are the same */
+ G_CB_OFF = (3*(MAXJSAMPLE+1)); /* offset to G => Cb section */
+ B_CB_OFF = G_Y_OFF; /* G=>Y, B=>Cb are the same */
+ R_CR_OFF = R_Y_OFF; /* R=>Y, R=>Cr are the same */
+ G_CR_OFF = G_Y_OFF; /* G=>Y, G=>Cr are the same */
+ B_CR_OFF = G_CB_OFF; /* G=>Cb, B=>Cr are the same */
+ TABLE_SIZE = (4*(MAXJSAMPLE+1));
+ }
+ else
+ {
+ R_Y_OFF = 0; /* offset to R => Y section */
+ G_Y_OFF = (1*(MAXJSAMPLE+1)); /* offset to G => Y section */
+ B_Y_OFF= (2*(MAXJSAMPLE+1)); /* etc. */
+ R_CB_OFF= (3*(MAXJSAMPLE+1));
+ G_CB_OFF= (4*(MAXJSAMPLE+1));
+ B_CB_OFF= (5*(MAXJSAMPLE+1));
+ R_CR_OFF= B_CB_OFF; /* B=>Cb, R=>Cr are the same */
+ G_CR_OFF= (6*(MAXJSAMPLE+1));
+ B_CR_OFF= (7*(MAXJSAMPLE+1));
+ TABLE_SIZE =(8*(MAXJSAMPLE+1));
+ }
+}
+
+/*
+ * Initialize for RGB->YCC colorspace conversion.
+ */
+
+METHODDEF(void)
+rgb_ycc_start (j_compress_ptr cinfo)
+{
+ my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
+ INT32 * rgb_ycc_tab;
+ INT32 i;
+
+ /* Allocate and fill in the conversion tables. */
+ cconvert->rgb_ycc_tab = rgb_ycc_tab = (INT32 *)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ (TABLE_SIZE * SIZEOF(INT32)));
+
+ for (i = 0; i <= MAXJSAMPLE; i++)
+ {
+ if (iUseMojaveCsc)
+ {
+ rgb_ycc_tab[i+R_Y_OFF] = FIX(0.50000) * i;
+ rgb_ycc_tab[i+G_Y_OFF] = FIX(0.00000) * i;
+ rgb_ycc_tab[i+B_Y_OFF] = FIX(0.00000) * i + ONE_HALF;
+ /* R=>Y and R=>Cb tables are the same
+ rgb_ycc_tab[i+R_CB_OFF] = (FIX(0.50000)) * i;
+ */
+ rgb_ycc_tab[i+G_CB_OFF] = (-FIX(0.50000)) * i + CBCR_OFFSET + ONE_HALF-1;
+ /* We use a rounding fudge-factor of 0.5-epsilon for Cb and Cr.
+ * This ensures that the maximum output will round to MAXJSAMPLE
+ * not MAXJSAMPLE+1, and thus that we don't have to range-limit.
+ */
+ /* G=>Y and B=>Cb tables are the same
+ rgb_ycc_tab[i+B_CB_OFF] = FIX(0.00000) * i;
+ */
+ /* R=>Y and R=>Cr tables are the same
+ rgb_ycc_tab[i+R_CR_OFF] = FIX(0.50000) * i;
+ */
+ /* G=>Y and G=>Cr tables are the same
+ rgb_ycc_tab[i+G_CR_OFF] = (-FIX(0.00000)) * i;
+ */
+ /* G=>Cb and B=>Cr tables are the same
+ rgb_ycc_tab[i+B_CR_OFF] = (-FIX(0.50000)) * i + CBCR_OFFSET + ONE_HALF-1;
+ */
+ }
+ else
+ {
+ rgb_ycc_tab[i+R_Y_OFF] = FIX(0.29900) * i;
+ rgb_ycc_tab[i+G_Y_OFF] = FIX(0.58700) * i;
+ rgb_ycc_tab[i+B_Y_OFF] = FIX(0.11400) * i + ONE_HALF;
+ rgb_ycc_tab[i+R_CB_OFF] = (-FIX(0.16874)) * i;
+ rgb_ycc_tab[i+G_CB_OFF] = (-FIX(0.33126)) * i;
+ /* We use a rounding fudge-factor of 0.5-epsilon for Cb and Cr.
+ * This ensures that the maximum output will round to MAXJSAMPLE
+ * not MAXJSAMPLE+1, and thus that we don't have to range-limit.
+ */
+ rgb_ycc_tab[i+B_CB_OFF] = FIX(0.50000) * i + CBCR_OFFSET + ONE_HALF-1;
+ /* B=>Cb and R=>Cr tables are the same
+ rgb_ycc_tab[i+R_CR_OFF] = FIX(0.50000) * i + CBCR_OFFSET + ONE_HALF-1;
+ */
+ rgb_ycc_tab[i+G_CR_OFF] = (-FIX(0.41869)) * i;
+ rgb_ycc_tab[i+B_CR_OFF] = (-FIX(0.08131)) * i;
+ }
+ }
+}
+
+
+/*
+ * Convert some rows of samples to the JPEG colorspace.
+ *
+ * Note that we change from the application's interleaved-pixel format
+ * to our internal noninterleaved, one-plane-per-component format.
+ * The input buffer is therefore three times as wide as the output buffer.
+ *
+ * A starting row offset is provided only for the output buffer. The caller
+ * can easily adjust the passed input_buf value to accommodate any row
+ * offset required on that side.
+ */
+
+METHODDEF(void)
+rgb_ycc_convert (j_compress_ptr cinfo,
+ JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
+ JDIMENSION output_row, int num_rows)
+{
+ my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
+ register int r, g, b;
+ register INT32 * ctab = cconvert->rgb_ycc_tab;
+ register JSAMPROW inptr;
+ register JSAMPROW outptr0, outptr1, outptr2;
+ register JDIMENSION col;
+ JDIMENSION num_cols = cinfo->image_width;
+
+ while (--num_rows >= 0) {
+ inptr = *input_buf++;
+ outptr0 = output_buf[0][output_row];
+ outptr1 = output_buf[1][output_row];
+ outptr2 = output_buf[2][output_row];
+ output_row++;
+ for (col = 0; col < num_cols; col++) {
+ r = GETJSAMPLE(inptr[RGB_RED]);
+ g = GETJSAMPLE(inptr[RGB_GREEN]);
+ b = GETJSAMPLE(inptr[RGB_BLUE]);
+ inptr += RGB_PIXELSIZE;
+ /* If the inputs are 0..MAXJSAMPLE, the outputs of these equations
+ * must be too; we do not need an explicit range-limiting operation.
+ * Hence the value being shifted is never negative, and we don't
+ * need the general RIGHT_SHIFT macro.
+ */
+ /* Y */
+ outptr0[col] = (JSAMPLE)
+ ((ctab[r+R_Y_OFF] + ctab[g+G_Y_OFF] + ctab[b+B_Y_OFF])
+ >> SCALEBITS);
+ /* Cb */
+ outptr1[col] = (JSAMPLE)
+ ((ctab[r+R_CB_OFF] + ctab[g+G_CB_OFF] + ctab[b+B_CB_OFF])
+ >> SCALEBITS);
+ /* Cr */
+ outptr2[col] = (JSAMPLE)
+ ((ctab[r+R_CR_OFF] + ctab[g+G_CR_OFF] + ctab[b+B_CR_OFF])
+ >> SCALEBITS);
+ }
+ }
+}
+
+
+/**************** Cases other than RGB -> YCbCr **************/
+
+
+/*
+ * Convert some rows of samples to the JPEG colorspace.
+ * This version handles RGB->grayscale conversion, which is the same
+ * as the RGB->Y portion of RGB->YCbCr.
+ * We assume rgb_ycc_start has been called (we only use the Y tables).
+ */
+
+METHODDEF(void)
+rgb_gray_convert (j_compress_ptr cinfo,
+ JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
+ JDIMENSION output_row, int num_rows)
+{
+ my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
+ register int r, g, b;
+ register INT32 * ctab = cconvert->rgb_ycc_tab;
+ register JSAMPROW inptr;
+ register JSAMPROW outptr;
+ register JDIMENSION col;
+ JDIMENSION num_cols = cinfo->image_width;
+
+ while (--num_rows >= 0) {
+ inptr = *input_buf++;
+ outptr = output_buf[0][output_row];
+ output_row++;
+ for (col = 0; col < num_cols; col++) {
+ r = GETJSAMPLE(inptr[RGB_RED]);
+ g = GETJSAMPLE(inptr[RGB_GREEN]);
+ b = GETJSAMPLE(inptr[RGB_BLUE]);
+ inptr += RGB_PIXELSIZE;
+ /* Y */
+ outptr[col] = (JSAMPLE)
+ ((ctab[r+R_Y_OFF] + ctab[g+G_Y_OFF] + ctab[b+B_Y_OFF])
+ >> SCALEBITS);
+ }
+ }
+}
+
+
+/*
+ * Convert some rows of samples to the JPEG colorspace.
+ * This version handles Adobe-style CMYK->YCCK conversion,
+ * where we convert R=1-C, G=1-M, and B=1-Y to YCbCr using the same
+ * conversion as above, while passing K (black) unchanged.
+ * We assume rgb_ycc_start has been called.
+ */
+
+METHODDEF(void)
+cmyk_ycck_convert (j_compress_ptr cinfo,
+ JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
+ JDIMENSION output_row, int num_rows)
+{
+ my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
+ register int r, g, b;
+ register INT32 * ctab = cconvert->rgb_ycc_tab;
+ register JSAMPROW inptr;
+ register JSAMPROW outptr0, outptr1, outptr2, outptr3;
+ register JDIMENSION col;
+ JDIMENSION num_cols = cinfo->image_width;
+
+ while (--num_rows >= 0) {
+ inptr = *input_buf++;
+ outptr0 = output_buf[0][output_row];
+ outptr1 = output_buf[1][output_row];
+ outptr2 = output_buf[2][output_row];
+ outptr3 = output_buf[3][output_row];
+ output_row++;
+ for (col = 0; col < num_cols; col++) {
+ r = MAXJSAMPLE - GETJSAMPLE(inptr[0]);
+ g = MAXJSAMPLE - GETJSAMPLE(inptr[1]);
+ b = MAXJSAMPLE - GETJSAMPLE(inptr[2]);
+ /* K passes through as-is */
+ outptr3[col] = inptr[3]; /* don't need GETJSAMPLE here */
+ inptr += 4;
+ /* If the inputs are 0..MAXJSAMPLE, the outputs of these equations
+ * must be too; we do not need an explicit range-limiting operation.
+ * Hence the value being shifted is never negative, and we don't
+ * need the general RIGHT_SHIFT macro.
+ */
+ /* Y */
+ outptr0[col] = (JSAMPLE)
+ ((ctab[r+R_Y_OFF] + ctab[g+G_Y_OFF] + ctab[b+B_Y_OFF])
+ >> SCALEBITS);
+ /* Cb */
+ outptr1[col] = (JSAMPLE)
+ ((ctab[r+R_CB_OFF] + ctab[g+G_CB_OFF] + ctab[b+B_CB_OFF])
+ >> SCALEBITS);
+ /* Cr */
+ outptr2[col] = (JSAMPLE)
+ ((ctab[r+R_CR_OFF] + ctab[g+G_CR_OFF] + ctab[b+B_CR_OFF])
+ >> SCALEBITS);
+ }
+ }
+}
+
+
+/*
+ * Convert some rows of samples to the JPEG colorspace.
+ * This version handles grayscale output with no conversion.
+ * The source can be either plain grayscale or YCbCr (since Y == gray).
+ */
+
+METHODDEF(void)
+grayscale_convert (j_compress_ptr cinfo,
+ JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
+ JDIMENSION output_row, int num_rows)
+{
+ register JSAMPROW inptr;
+ register JSAMPROW outptr;
+ register JDIMENSION col;
+ JDIMENSION num_cols = cinfo->image_width;
+ int instride = cinfo->input_components;
+
+ while (--num_rows >= 0) {
+ inptr = *input_buf++;
+ outptr = output_buf[0][output_row];
+ output_row++;
+ for (col = 0; col < num_cols; col++) {
+ outptr[col] = inptr[0]; /* don't need GETJSAMPLE() here */
+ inptr += instride;
+ }
+ }
+}
+
+
+/*
+ * Convert some rows of samples to the JPEG colorspace.
+ * This version handles multi-component colorspaces without conversion.
+ * We assume input_components == num_components.
+ */
+
+METHODDEF(void)
+null_convert (j_compress_ptr cinfo,
+ JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
+ JDIMENSION output_row, int num_rows)
+{
+ register JSAMPROW inptr;
+ register JSAMPROW outptr;
+ register JDIMENSION col;
+ register int ci;
+ int nc = cinfo->num_components;
+ JDIMENSION num_cols = cinfo->image_width;
+
+ while (--num_rows >= 0) {
+ /* It seems fastest to make a separate pass for each component. */
+ for (ci = 0; ci < nc; ci++) {
+ inptr = *input_buf;
+ outptr = output_buf[ci][output_row];
+ for (col = 0; col < num_cols; col++) {
+ outptr[col] = inptr[ci]; /* don't need GETJSAMPLE() here */
+ inptr += nc;
+ }
+ }
+ input_buf++;
+ output_row++;
+ }
+}
+
+
+/*
+ * Empty method for start_pass.
+ */
+
+METHODDEF(void)
+null_method (j_compress_ptr cinfo)
+{
+ /* no work needed */
+}
+
+
+/*
+ * Module initialization routine for input colorspace conversion.
+ */
+
+GLOBAL(void)
+jinit_color_converter (j_compress_ptr cinfo)
+{
+ my_cconvert_ptr cconvert;
+
+ cconvert = (my_cconvert_ptr)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ SIZEOF(my_color_converter));
+ cinfo->cconvert = (struct jpeg_color_converter *) cconvert;
+ /* set start_pass to null method until we find out differently */
+ cconvert->pub.start_pass = null_method;
+
+ /* Make sure input_components agrees with in_color_space */
+ switch (cinfo->in_color_space) {
+ case JCS_GRAYSCALE:
+ if (cinfo->input_components != 1)
+ ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);
+ break;
+
+ case JCS_RGB:
+#if RGB_PIXELSIZE != 3
+ if (cinfo->input_components != RGB_PIXELSIZE)
+ ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);
+ break;
+#endif /* else share code with YCbCr */
+
+ case JCS_YCbCr:
+ if (cinfo->input_components != 3)
+ ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);
+ break;
+
+ case JCS_CMYK:
+ case JCS_YCCK:
+ if (cinfo->input_components != 4)
+ ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);
+ break;
+
+ default: /* JCS_UNKNOWN can be anything */
+ if (cinfo->input_components < 1)
+ ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);
+ break;
+ }
+
+ /* Check num_components, set conversion method based on requested space */
+ switch (cinfo->jpeg_color_space) {
+ case JCS_GRAYSCALE:
+ if (cinfo->num_components != 1)
+ ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
+ if (cinfo->in_color_space == JCS_GRAYSCALE)
+ cconvert->pub.color_convert = grayscale_convert;
+ else if (cinfo->in_color_space == JCS_RGB) {
+ cconvert->pub.start_pass = rgb_ycc_start;
+ cconvert->pub.color_convert = rgb_gray_convert;
+ } else if (cinfo->in_color_space == JCS_YCbCr)
+ cconvert->pub.color_convert = grayscale_convert;
+ else
+ ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
+ break;
+
+ case JCS_RGB:
+ if (cinfo->num_components != 3)
+ ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
+ if (cinfo->in_color_space == JCS_RGB && RGB_PIXELSIZE == 3)
+ cconvert->pub.color_convert = null_convert;
+ else
+ ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
+ break;
+
+ case JCS_YCbCr:
+ if (cinfo->num_components != 3)
+ ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
+ if (cinfo->in_color_space == JCS_RGB) {
+ cconvert->pub.start_pass = rgb_ycc_start;
+ cconvert->pub.color_convert = rgb_ycc_convert;
+ } else if (cinfo->in_color_space == JCS_YCbCr)
+ cconvert->pub.color_convert = null_convert;
+ else
+ ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
+ break;
+
+ case JCS_CMYK:
+ if (cinfo->num_components != 4)
+ ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
+ if (cinfo->in_color_space == JCS_CMYK)
+ cconvert->pub.color_convert = null_convert;
+ else
+ ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
+ break;
+
+ case JCS_YCCK:
+ if (cinfo->num_components != 4)
+ ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
+ if (cinfo->in_color_space == JCS_CMYK) {
+ cconvert->pub.start_pass = rgb_ycc_start;
+ cconvert->pub.color_convert = cmyk_ycck_convert;
+ } else if (cinfo->in_color_space == JCS_YCCK)
+ cconvert->pub.color_convert = null_convert;
+ else
+ ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
+ break;
+
+ default: /* allow null conversion of JCS_UNKNOWN */
+ if (cinfo->jpeg_color_space != cinfo->in_color_space ||
+ cinfo->num_components != cinfo->input_components)
+ ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
+ cconvert->pub.color_convert = null_convert;
+ break;
+ }
+}
+
diff --git a/prnt/hpcups/jdatadbf.c b/prnt/hpcups/jdatadbf.c
new file mode 100644
index 0000000..03ee26c
--- /dev/null
+++ b/prnt/hpcups/jdatadbf.c
@@ -0,0 +1,173 @@
+/*
+ * jdatadbf.c
+ *
+ * Copyright (C) 2001, Dorian Goldstein, Thomas G. Lane.
+ *
+ * This file contains compression data destination routines for the case of
+ * This file is identicle with IJG's built in destination file manager in
+ * every respect but 1... instead fo emmiting data to a file
+ * it facilitates definition of a callback function.
+ */
+
+/* this is not a core library module, so it doesn't define JPEG_INTERNALS */
+#include "jinclude.h"
+#include "jpeglib.h"
+#include "jerror.h"
+
+
+/* Expanded data destination object for stdio output */
+
+typedef struct {
+ struct jpeg_destination_mgr pub; /* public fields */
+
+ JOCTET * outbuff; // target output buffer
+ JOCTET * buffer; // start of internal buffer
+ UINT16 size_outbuff; // current size of target output buffer
+ JMETHOD (void, flush_output_buffer_callback, (JOCTET *outbuf, JOCTET* buffer, size_t size));
+} my_destination_mgr;
+
+typedef my_destination_mgr * my_dest_ptr;
+
+#define OUTPUT_BUF_SIZE 4096 /* choose an efficiently fwrite'able size */
+
+
+/*
+ * Initialize destination --- called by jpeg_start_compress
+ * before any data is actually written.
+ */
+
+METHODDEF(void)
+init_destination (j_compress_ptr cinfo)
+{
+ my_dest_ptr dest = (my_dest_ptr) cinfo->dest;
+
+ /* Allocate the output buffer --- it will be released when done with image */
+ dest->buffer = (JOCTET *)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ OUTPUT_BUF_SIZE * SIZEOF(JOCTET));
+
+ dest->pub.next_output_byte = dest->buffer;
+ dest->pub.free_in_buffer = OUTPUT_BUF_SIZE;
+}
+
+
+/*
+ * Empty the output buffer --- called whenever buffer fills up.
+ *
+ * In typical applications, this should write the entire output buffer
+ * (ignoring the current state of next_output_byte & free_in_buffer),
+ * reset the pointer & count to the start of the buffer, and return TRUE
+ * indicating that the buffer has been dumped.
+ *
+ * In applications that need to be able to suspend compression due to output
+ * overrun, a FALSE return indicates that the buffer cannot be emptied now.
+ * In this situation, the compressor will return to its caller (possibly with
+ * an indication that it has not accepted all the supplied scanlines). The
+ * application should resume compression after it has made more room in the
+ * output buffer. Note that there are substantial restrictions on the use of
+ * suspension --- see the documentation.
+ *
+ * When suspending, the compressor will back up to a convenient restart point
+ * (typically the start of the current MCU). next_output_byte & free_in_buffer
+ * indicate where the restart point will be if the current call returns FALSE.
+ * Data beyond this point will be regenerated after resumption, so do not
+ * write it out when emptying the buffer externally.
+ */
+
+METHODDEF(boolean)
+empty_output_buffer (j_compress_ptr cinfo)
+{
+ my_dest_ptr dest = (my_dest_ptr) cinfo->dest;
+
+// DG Temp if (dest->flush_output_buffer_callback == NULL) {
+// DG Temp if (dest->outbuff) {
+// DG Temp MEMCOPY(dest->outbuff + dest->size_outbuff, dest->buffer, OUTPUT_BUF_SIZE);
+// DG Temp dest->size_outbuff += OUTPUT_BUF_SIZE;
+// DG Temp }
+// DG Temp } else {
+// DG Temp (*dest->flush_output_buffer_callback)(dest->buffer, OUTPUT_BUF_SIZE);
+// DG Temp }
+
+ (*dest->flush_output_buffer_callback)(dest->outbuff, dest->buffer, OUTPUT_BUF_SIZE);
+
+
+ dest->pub.next_output_byte = dest->buffer;
+ dest->pub.free_in_buffer = OUTPUT_BUF_SIZE;
+
+ return TRUE;
+}
+
+
+/*
+ * Terminate destination --- called by jpeg_finish_compress
+ * after all data has been written. Usually needs to flush buffer.
+ *
+ * NB: *not* called by jpeg_abort or jpeg_destroy; surrounding
+ * application must deal with any cleanup that should happen even
+ * for error exit.
+ */
+
+METHODDEF(void)
+term_destination (j_compress_ptr cinfo)
+{
+ my_dest_ptr dest = (my_dest_ptr) cinfo->dest;
+ size_t datacount = OUTPUT_BUF_SIZE - dest->pub.free_in_buffer;
+
+ /* Write any data remaining in the buffer */
+ if (datacount > 0) {
+// DG Temp if (dest->flush_output_buffer_callback == NULL) {
+// DG Temp if (dest->outbuff) {
+// DG Temp MEMCOPY(dest->outbuff + dest->size_outbuff, dest->buffer, datacount);
+// DG Temp dest->size_outbuff += datacount;
+// DG Temp }
+// DG Temp } else {
+// DG Temp (*dest->flush_output_buffer_callback)(dest->buffer, datacount);
+// DG Temp }
+
+ (*dest->flush_output_buffer_callback)(dest->outbuff, dest->buffer, datacount);
+ }
+}
+
+
+/*
+ * Prepare for output to a stdio stream.
+ * The caller must have already opened the stream, and is responsible
+ * for closing it after finishing compression.
+ */
+
+GLOBAL(void)
+jpeg_buffer_dest (j_compress_ptr cinfo, JOCTET* outbuff, void* flush_output_buffer_callback)
+{
+ my_dest_ptr dest;
+
+ /* The destination object is made permanent so that multiple JPEG images
+ * can be written to the same file without re-executing jpeg_stdio_dest.
+ * This makes it dangerous to use this manager and a different destination
+ * manager serially with the same JPEG object, because their private object
+ * sizes may be different. Caveat programmer.
+ */
+ if (cinfo->dest == NULL) { /* first time for this JPEG object? */
+ cinfo->dest = (struct jpeg_destination_mgr *)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
+ SIZEOF(my_destination_mgr));
+ }
+
+ dest = (my_dest_ptr) cinfo->dest;
+ dest->pub.init_destination = init_destination;
+ dest->pub.empty_output_buffer = empty_output_buffer;
+ dest->pub.term_destination = term_destination;
+
+ dest->outbuff = outbuff;
+ dest->size_outbuff = 0;
+ dest->flush_output_buffer_callback = flush_output_buffer_callback;
+//(*dest->flush_output_buffer_callback)(-1 , -1);
+}
+
+GLOBAL(long)
+jpeg_buffer_size_dest (j_compress_ptr cinfo)
+{
+ my_dest_ptr dest = (my_dest_ptr) cinfo->dest;
+
+ return dest->size_outbuff;
+}
+
diff --git a/prnt/hpcups/jinclude.h b/prnt/hpcups/jinclude.h
new file mode 100644
index 0000000..0a4f151
--- /dev/null
+++ b/prnt/hpcups/jinclude.h
@@ -0,0 +1,91 @@
+/*
+ * jinclude.h
+ *
+ * Copyright (C) 1991-1994, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file exists to provide a single place to fix any problems with
+ * including the wrong system include files. (Common problems are taken
+ * care of by the standard jconfig symbols, but on really weird systems
+ * you may have to edit this file.)
+ *
+ * NOTE: this file is NOT intended to be included by applications using the
+ * JPEG library. Most applications need only include jpeglib.h.
+ */
+
+
+/* Include auto-config file to find out which system include files we need. */
+
+#include "jconfig.h" /* auto configuration options */
+#define JCONFIG_INCLUDED /* so that jpeglib.h doesn't do it again */
+
+/*
+ * We need the NULL macro and size_t typedef.
+ * On an ANSI-conforming system it is sufficient to include <stddef.h>.
+ * Otherwise, we get them from <stdlib.h> or <stdio.h>; we may have to
+ * pull in <sys/types.h> as well.
+ * Note that the core JPEG library does not require <stdio.h>;
+ * only the default error handler and data source/destination modules do.
+ * But we must pull it in because of the references to FILE in jpeglib.h.
+ * You can remove those references if you want to compile without <stdio.h>.
+ */
+
+#ifdef HAVE_STDDEF_H
+#include <stddef.h>
+#endif
+
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+
+#ifdef NEED_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+
+#include <stdio.h>
+
+/*
+ * We need memory copying and zeroing functions, plus strncpy().
+ * ANSI and System V implementations declare these in <string.h>.
+ * BSD doesn't have the mem() functions, but it does have bcopy()/bzero().
+ * Some systems may declare memset and memcpy in <memory.h>.
+ *
+ * NOTE: we assume the size parameters to these functions are of type size_t.
+ * Change the casts in these macros if not!
+ */
+
+#ifdef NEED_BSD_STRINGS
+
+#include <strings.h>
+#define MEMZERO(target,size) bzero((void *)(target), (size_t)(size))
+#define MEMCOPY(dest,src,size) bcopy((const void *)(src), (void *)(dest), (size_t)(size))
+
+#else /* not BSD, assume ANSI/SysV string lib */
+
+#include <string.h>
+#define MEMZERO(target,size) memset((void *)(target), 0, (size_t)(size))
+#define MEMCOPY(dest,src,size) memcpy((void *)(dest), (const void *)(src), (size_t)(size))
+
+#endif
+
+/*
+ * In ANSI C, and indeed any rational implementation, size_t is also the
+ * type returned by sizeof(). However, it seems there are some irrational
+ * implementations out there, in which sizeof() returns an int even though
+ * size_t is defined as long or unsigned long. To ensure consistent results
+ * we always use this SIZEOF() macro in place of using sizeof() directly.
+ */
+
+#define SIZEOF(object) ((size_t) sizeof(object))
+
+/*
+ * The modules that use fread() and fwrite() always invoke them through
+ * these macros. On some systems you may need to twiddle the argument casts.
+ * CAUTION: argument order is different from underlying functions!
+ */
+
+#define JFREAD(file,buf,sizeofbuf) \
+ ((size_t) fread((void *) (buf), (size_t) 1, (size_t) (sizeofbuf), (file)))
+#define JFWRITE(file,buf,sizeofbuf) \
+ ((size_t) fwrite((const void *) (buf), (size_t) 1, (size_t) (sizeofbuf), (file)))
diff --git a/prnt/hpcups/resources.h b/prnt/hpcups/resources.h
new file mode 100644
index 0000000..ee8f660
--- /dev/null
+++ b/prnt/hpcups/resources.h
@@ -0,0 +1,51 @@
+/*****************************************************************************\
+ resources.h : externs for open source imaging
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+extern unsigned char HTBinary_open[1024];
+extern unsigned char HT300x3004level_open[1024];
+extern unsigned char HT600x6004level895_open[1024];
+
+extern unsigned char HTBinary_prop[1024];
+extern unsigned char HT300x3004level_prop[1024];
+extern unsigned char HT600x6004level895_prop[1024];
+
+extern unsigned char HT600x6004level970_open[1024];
+extern unsigned char HT600x6004level970_prop[1024];
+
+extern unsigned char HT600x6004level3600_open[1024];
+
+extern unsigned char HT1200x1200x1_PhotoPres970_open[1024];
+extern unsigned char HT600x600x4_Pres970_open[1024];
+
+extern unsigned char HT300x3004level970_open[1024];
+extern unsigned char HT1200x1200x1PhotoBest_open[1024];
+
+extern BYTE *GetHT12x12x1_4100_Photo_Best ();
+
diff --git a/prnt/hpijs/PrinterProperties.cpp b/prnt/hpijs/PrinterProperties.cpp
new file mode 100644
index 0000000..9dcf072
--- /dev/null
+++ b/prnt/hpijs/PrinterProperties.cpp
@@ -0,0 +1,182 @@
+/*****************************************************************************\
+ Copyright (c) 2002 - 2006, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+#include "header.h"
+
+#include "PrinterProperties.h"
+#include "models.h"
+
+PlatformServices::PlatformServices () : SystemServices ()
+{
+}
+
+PlatformServices::~PlatformServices ()
+{
+}
+
+float PlatformServices::power (float x, float y)
+{
+ return float (pow (x, y));
+}
+
+BYTE * PlatformServices::AllocMem (int iMemSize)
+{
+ return (BYTE *) malloc (iMemSize);
+}
+
+void PlatformServices::FreeMem (BYTE *pMem)
+{
+ free (pMem);
+}
+
+DWORD PlatformServices::GetSystemTickCount (void)
+{
+ return 0;
+}
+
+DRIVER_ERROR PlatformServices::BusyWait (DWORD msec)
+{
+ return NO_ERROR;
+}
+
+void PlatformServices::DisplayPrinterStatus (DISPLAY_STATUS ePrinterStatus)
+{
+}
+
+DRIVER_ERROR PlatformServices::ReadDeviceID (BYTE *strID, int iSize)
+{
+ DRIVER_ERROR eResult = IO_ERROR;
+ return eResult;
+}
+
+BOOL PlatformServices::GetStatusInfo (BYTE *bStatReg)
+{
+ BOOL bStatus = FALSE;
+ return bStatus;
+}
+
+DRIVER_ERROR PlatformServices::FromDevice (BYTE *pReadBuff, DWORD *wReadCount)
+{
+ return NO_ERROR;
+}
+
+DRIVER_ERROR PlatformServices::ToDevice (const BYTE *pBuffer, DWORD *dwCount)
+{
+ *dwCount = 0;
+ return NO_ERROR;
+}
+
+BOOL CreatePrinterProperties ()
+{
+ pSys = new PlatformServices ();
+ pSys->IOMode.bDevID = FALSE;
+ pSys->IOMode.bStatus = FALSE;
+ pPC = new PrintContext (pSys);
+ iLastPrinter = MAX_PRINTER_TYPE;
+ return TRUE;
+}
+
+int GetPrinterProperties (PrinterProperties *pPrinterProperties)
+{
+ BOOL bResult = TRUE;
+ int i;
+ DRIVER_ERROR err;
+ if (pPrinterProperties == NULL)
+ {
+ return FALSE;
+ }
+ if (pSys == NULL)
+ {
+ bResult = CreatePrinterProperties ();
+ if (bResult == FALSE)
+ {
+ return (int) bResult;
+ }
+ }
+
+ while (1)
+ {
+ iCurrentPrinter++;
+ if (iCurrentPrinter == iLastPrinter)
+ {
+ if (pPC)
+ {
+ delete pPC;
+ }
+ if (pSys)
+ {
+ delete pSys;
+ }
+ return FALSE;
+ }
+ err = pPC->SelectDevice ((PRINTER_TYPE) iCurrentPrinter);
+ if (err != NO_ERROR)
+ {
+ if (iCurrentPrinter < iLastPrinter)
+ {
+ continue;
+ }
+ delete pPC;
+ delete pSys;
+ return FALSE;
+ }
+ strcpy (pPrinterProperties->szClassName, ModelName[iCurrentPrinter]);
+ for (i = 0; i < (int) (sizeof (PaperSizeInfoData) / sizeof (PaperSizeInfo)); i++)
+ {
+ err = pPC->SetPaperSize (PaperSizeInfoData[i].iPaperSize, 0);
+ if (err == WARN_ILLEGAL_PAPERSIZE)
+ {
+ continue;
+ }
+ strcpy (pPrinterProperties->szPaperSize, PaperSizeInfoData[i].szName);
+ pPrinterProperties->fPhysicalWidth = pPC->PhysicalPageSizeX ();
+ pPrinterProperties->fPhysicalHeight = pPC->PhysicalPageSizeY ();
+ pPrinterProperties->fPrintableWidth = pPC->PrintableWidth ();
+ pPrinterProperties->fPrintableHeight = pPC->PrintableHeight ();
+ pPrinterProperties->fTopLeftX = pPC->PrintableStartX ();
+ pPrinterProperties->fTopLeftY = pPC->PrintableStartY ();
+
+ fprintf (stdout, "%s,%s,%.4f,%.4f,%.4f,%.4f,%.4f,%.4f\n",
+ pPrinterProperties->szClassName,
+ pPrinterProperties->szPaperSize,
+ pPrinterProperties->fPhysicalWidth,
+ pPrinterProperties->fPhysicalHeight,
+ pPrinterProperties->fTopLeftX,
+ pPrinterProperties->fTopLeftY,
+ pPrinterProperties->fPrintableWidth,
+ pPrinterProperties->fPrintableHeight);
+
+ }
+ }
+}
+
+int main ()
+{
+ PrinterProperties pPrProp;
+ GetPrinterProperties (&pPrProp);
+ return 0;
+}
diff --git a/prnt/hpijs/PrinterProperties.h b/prnt/hpijs/PrinterProperties.h
new file mode 100644
index 0000000..83a4947
--- /dev/null
+++ b/prnt/hpijs/PrinterProperties.h
@@ -0,0 +1,130 @@
+/*****************************************************************************\
+ Copyright (c) 2002 - 2006, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+#include <stdio.h>
+
+#include "hpprintapi.h"
+
+APDK_USING_NAMESPACE
+
+class PlatformServices : public SystemServices
+{
+public:
+ PlatformServices ();
+ ~PlatformServices ();
+ void DisplayPrinterStatus (DISPLAY_STATUS ePrinterStatus);
+ DRIVER_ERROR BusyWait (DWORD msec);
+ DRIVER_ERROR ReadDeviceID (BYTE *strID, int iSize);
+ BYTE *AllocMem (int iMemSize);
+ void FreeMem (BYTE* pMem);
+ BOOL GetStatusInfo (BYTE *bStatReg);
+ DRIVER_ERROR ToDevice (const BYTE *pBuffer, DWORD *dwCount);
+ DRIVER_ERROR FromDevice (BYTE *pReadBuff, DWORD *wReadCount);
+ DWORD GetSystemTickCount (void);
+ float power (float x, float y);
+};
+
+typedef struct
+{
+ PAPER_SIZE iPaperSize;
+ const char *szName;
+} PaperSizeInfo;
+
+PaperSizeInfo PaperSizeInfoData[] =
+{
+ {LETTER, "Letter"},
+ {LEGAL, "Legal"},
+ {EXECUTIVE, "Executive"},
+ {A3, "A3"},
+ {A4, "A4"},
+ {A5, "A5"},
+ {A6, "A6"},
+ {PHOTO_SIZE, "Photo"},
+ {PHOTO_5x7, "5x7"},
+ {B4, "B4"},
+ {B5, "B5"},
+ {OUFUKU, "Oufuku-Hagaki"},
+ {HAGAKI, "Hagaki"},
+ {SUPERB_SIZE, "Super B"},
+ {FLSA, "Flsa"},
+ {ENVELOPE_NO_10, "Number 10 Envelope"},
+ {ENVELOPE_A2, "A2 Envelope"},
+ {ENVELOPE_C6, "C6 Envelope"},
+ {ENVELOPE_DL, "DL Envelope"},
+ {ENVELOPE_JPN3, "Japanese Envelope #3"},
+ {ENVELOPE_JPN4, "Japanese Envelope #4"}
+};
+
+typedef struct
+{
+ char szClassName[16];
+ char szPaperSize[32];
+ float fPhysicalWidth;
+ float fPhysicalHeight;
+ float fPrintableWidth;
+ float fPrintableHeight;
+ float fTopLeftX;
+ float fTopLeftY;
+} PrinterProperties;
+
+PlatformServices *pSys = NULL;
+PrintContext *pPC = NULL;
+BOOL CreatePrinterProperties ();
+int iCurrentPrinter = UNSUPPORTED;
+int iPrinterClasses[MAX_PRINTER_TYPE];
+int iLastPrinter = 0;
+
+#if 0
+char *szPaperSizeNames[] =
+{
+ "Letter",
+ "A4",
+ "Legal"
+ "4x6 with tear-off tab",
+ "A6",
+ "4x6 Index Card",
+ "B4",
+ "B5",
+ "Oufuku-Hagaki",
+ "Hagaki",
+ "A6 with tear-off tab",
+ "A3",
+ "A5",
+ "Ledger",
+ "Super B",
+ "Executive",
+ "Flsa",
+ "CUSTOM_SIZE",
+ "Number 10 Envelope",
+ "A2 Envelope",
+ "C6 Envelope",
+ "DL Envelope",
+ "Japanese Envelope #3",
+ "Japanese Envelope #4",
+ "5x7"
+};
+#endif
diff --git a/prnt/hpijs/README_LIBJPG b/prnt/hpijs/README_LIBJPG
new file mode 100644
index 0000000..3e02b97
--- /dev/null
+++ b/prnt/hpijs/README_LIBJPG
@@ -0,0 +1,396 @@
+The Independent JPEG Group's JPEG software
+==========================================
+
+README for release 6b of 27-Mar-1998
+====================================
+
+This distribution contains the sixth public release of the Independent JPEG
+Group's free JPEG software. You are welcome to redistribute this software and
+to use it for any purpose, subject to the conditions under LEGAL ISSUES, below.
+
+Serious users of this software (particularly those incorporating it into
+larger programs) should contact IJG at jpeg-info@uunet.uu.net to be added to
+our electronic mailing list. Mailing list members are notified of updates
+and have a chance to participate in technical discussions, etc.
+
+This software is the work of Tom Lane, Philip Gladstone, Jim Boucher,
+Lee Crocker, Julian Minguillon, Luis Ortiz, George Phillips, Davide Rossi,
+Guido Vollbeding, Ge' Weijers, and other members of the Independent JPEG
+Group.
+
+IJG is not affiliated with the official ISO JPEG standards committee.
+
+
+DOCUMENTATION ROADMAP
+=====================
+
+This file contains the following sections:
+
+OVERVIEW General description of JPEG and the IJG software.
+LEGAL ISSUES Copyright, lack of warranty, terms of distribution.
+REFERENCES Where to learn more about JPEG.
+ARCHIVE LOCATIONS Where to find newer versions of this software.
+RELATED SOFTWARE Other stuff you should get.
+FILE FORMAT WARS Software *not* to get.
+TO DO Plans for future IJG releases.
+
+Other documentation files in the distribution are:
+
+User documentation:
+ install.doc How to configure and install the IJG software.
+ usage.doc Usage instructions for cjpeg, djpeg, jpegtran,
+ rdjpgcom, and wrjpgcom.
+ *.1 Unix-style man pages for programs (same info as usage.doc).
+ wizard.doc Advanced usage instructions for JPEG wizards only.
+ change.log Version-to-version change highlights.
+Programmer and internal documentation:
+ libjpeg.doc How to use the JPEG library in your own programs.
+ example.c Sample code for calling the JPEG library.
+ structure.doc Overview of the JPEG library's internal structure.
+ filelist.doc Road map of IJG files.
+ coderules.doc Coding style rules --- please read if you contribute code.
+
+Please read at least the files install.doc and usage.doc. Useful information
+can also be found in the JPEG FAQ (Frequently Asked Questions) article. See
+ARCHIVE LOCATIONS below to find out where to obtain the FAQ article.
+
+If you want to understand how the JPEG code works, we suggest reading one or
+more of the REFERENCES, then looking at the documentation files (in roughly
+the order listed) before diving into the code.
+
+
+OVERVIEW
+========
+
+This package contains C software to implement JPEG image compression and
+decompression. JPEG (pronounced "jay-peg") is a standardized compression
+method for full-color and gray-scale images. JPEG is intended for compressing
+"real-world" scenes; line drawings, cartoons and other non-realistic images
+are not its strong suit. JPEG is lossy, meaning that the output image is not
+exactly identical to the input image. Hence you must not use JPEG if you
+have to have identical output bits. However, on typical photographic images,
+very good compression levels can be obtained with no visible change, and
+remarkably high compression levels are possible if you can tolerate a
+low-quality image. For more details, see the references, or just experiment
+with various compression settings.
+
+This software implements JPEG baseline, extended-sequential, and progressive
+compression processes. Provision is made for supporting all variants of these
+processes, although some uncommon parameter settings aren't implemented yet.
+For legal reasons, we are not distributing code for the arithmetic-coding
+variants of JPEG; see LEGAL ISSUES. We have made no provision for supporting
+the hierarchical or lossless processes defined in the standard.
+
+We provide a set of library routines for reading and writing JPEG image files,
+plus two sample applications "cjpeg" and "djpeg", which use the library to
+perform conversion between JPEG and some other popular image file formats.
+The library is intended to be reused in other applications.
+
+In order to support file conversion and viewing software, we have included
+considerable functionality beyond the bare JPEG coding/decoding capability;
+for example, the color quantization modules are not strictly part of JPEG
+decoding, but they are essential for output to colormapped file formats or
+colormapped displays. These extra functions can be compiled out of the
+library if not required for a particular application. We have also included
+"jpegtran", a utility for lossless transcoding between different JPEG
+processes, and "rdjpgcom" and "wrjpgcom", two simple applications for
+inserting and extracting textual comments in JFIF files.
+
+The emphasis in designing this software has been on achieving portability and
+flexibility, while also making it fast enough to be useful. In particular,
+the software is not intended to be read as a tutorial on JPEG. (See the
+REFERENCES section for introductory material.) Rather, it is intended to
+be reliable, portable, industrial-strength code. We do not claim to have
+achieved that goal in every aspect of the software, but we strive for it.
+
+We welcome the use of this software as a component of commercial products.
+No royalty is required, but we do ask for an acknowledgement in product
+documentation, as described under LEGAL ISSUES.
+
+
+LEGAL ISSUES
+============
+
+In plain English:
+
+1. We don't promise that this software works. (But if you find any bugs,
+ please let us know!)
+2. You can use this software for whatever you want. You don't have to pay us.
+3. You may not pretend that you wrote this software. If you use it in a
+ program, you must acknowledge somewhere in your documentation that
+ you've used the IJG code.
+
+In legalese:
+
+The authors make NO WARRANTY or representation, either express or implied,
+with respect to this software, its quality, accuracy, merchantability, or
+fitness for a particular purpose. This software is provided "AS IS", and you,
+its user, assume the entire risk as to its quality and accuracy.
+
+This software is copyright (C) 1991-1998, Thomas G. Lane.
+All Rights Reserved except as specified below.
+
+Permission is hereby granted to use, copy, modify, and distribute this
+software (or portions thereof) for any purpose, without fee, subject to these
+conditions:
+(1) If any part of the source code for this software is distributed, then this
+README file must be included, with this copyright and no-warranty notice
+unaltered; and any additions, deletions, or changes to the original files
+must be clearly indicated in accompanying documentation.
+(2) If only executable code is distributed, then the accompanying
+documentation must state that "this software is based in part on the work of
+the Independent JPEG Group".
+(3) Permission for use of this software is granted only if the user accepts
+full responsibility for any undesirable consequences; the authors accept
+NO LIABILITY for damages of any kind.
+
+These conditions apply to any software derived from or based on the IJG code,
+not just to the unmodified library. If you use our work, you ought to
+acknowledge us.
+
+Permission is NOT granted for the use of any IJG author's name or company name
+in advertising or publicity relating to this software or products derived from
+it. This software may be referred to only as "the Independent JPEG Group's
+software".
+
+We specifically permit and encourage the use of this software as the basis of
+commercial products, provided that all warranty or liability claims are
+assumed by the product vendor.
+
+
+ansi2knr.c is included in this distribution by permission of L. Peter Deutsch,
+sole proprietor of its copyright holder, Aladdin Enterprises of Menlo Park, CA.
+ansi2knr.c is NOT covered by the above copyright and conditions, but instead
+by the usual distribution terms of the Free Software Foundation; principally,
+that you must include source code if you redistribute it. (See the file
+ansi2knr.c for full details.) However, since ansi2knr.c is not needed as part
+of any program generated from the IJG code, this does not limit you more than
+the foregoing paragraphs do.
+
+The Unix configuration script "configure" was produced with GNU Autoconf.
+It is copyright by the Free Software Foundation but is freely distributable.
+The same holds for its supporting scripts (config.guess, config.sub,
+ltconfig, ltmain.sh). Another support script, install-sh, is copyright
+by M.I.T. but is also freely distributable.
+
+It appears that the arithmetic coding option of the JPEG spec is covered by
+patents owned by IBM, AT&T, and Mitsubishi. Hence arithmetic coding cannot
+legally be used without obtaining one or more licenses. For this reason,
+support for arithmetic coding has been removed from the free JPEG software.
+(Since arithmetic coding provides only a marginal gain over the unpatented
+Huffman mode, it is unlikely that very many implementations will support it.)
+So far as we are aware, there are no patent restrictions on the remaining
+code.
+
+The IJG distribution formerly included code to read and write GIF files.
+To avoid entanglement with the Unisys LZW patent, GIF reading support has
+been removed altogether, and the GIF writer has been simplified to produce
+"uncompressed GIFs". This technique does not use the LZW algorithm; the
+resulting GIF files are larger than usual, but are readable by all standard
+GIF decoders.
+
+We are required to state that
+ "The Graphics Interchange Format(c) is the Copyright property of
+ CompuServe Incorporated. GIF(sm) is a Service Mark property of
+ CompuServe Incorporated."
+
+
+REFERENCES
+==========
+
+We highly recommend reading one or more of these references before trying to
+understand the innards of the JPEG software.
+
+The best short technical introduction to the JPEG compression algorithm is
+ Wallace, Gregory K. "The JPEG Still Picture Compression Standard",
+ Communications of the ACM, April 1991 (vol. 34 no. 4), pp. 30-44.
+(Adjacent articles in that issue discuss MPEG motion picture compression,
+applications of JPEG, and related topics.) If you don't have the CACM issue
+handy, a PostScript file containing a revised version of Wallace's article is
+available at ftp://ftp.uu.net/graphics/jpeg/wallace.ps.gz. The file (actually
+a preprint for an article that appeared in IEEE Trans. Consumer Electronics)
+omits the sample images that appeared in CACM, but it includes corrections
+and some added material. Note: the Wallace article is copyright ACM and IEEE,
+and it may not be used for commercial purposes.
+
+A somewhat less technical, more leisurely introduction to JPEG can be found in
+"The Data Compression Book" by Mark Nelson and Jean-loup Gailly, published by
+M&T Books (New York), 2nd ed. 1996, ISBN 1-55851-434-1. This book provides
+good explanations and example C code for a multitude of compression methods
+including JPEG. It is an excellent source if you are comfortable reading C
+code but don't know much about data compression in general. The book's JPEG
+sample code is far from industrial-strength, but when you are ready to look
+at a full implementation, you've got one here...
+
+The best full description of JPEG is the textbook "JPEG Still Image Data
+Compression Standard" by William B. Pennebaker and Joan L. Mitchell, published
+by Van Nostrand Reinhold, 1993, ISBN 0-442-01272-1. Price US$59.95, 638 pp.
+The book includes the complete text of the ISO JPEG standards (DIS 10918-1
+and draft DIS 10918-2). This is by far the most complete exposition of JPEG
+in existence, and we highly recommend it.
+
+The JPEG standard itself is not available electronically; you must order a
+paper copy through ISO or ITU. (Unless you feel a need to own a certified
+official copy, we recommend buying the Pennebaker and Mitchell book instead;
+it's much cheaper and includes a great deal of useful explanatory material.)
+In the USA, copies of the standard may be ordered from ANSI Sales at (212)
+642-4900, or from Global Engineering Documents at (800) 854-7179. (ANSI
+doesn't take credit card orders, but Global does.) It's not cheap: as of
+1992, ANSI was charging $95 for Part 1 and $47 for Part 2, plus 7%
+shipping/handling. The standard is divided into two parts, Part 1 being the
+actual specification, while Part 2 covers compliance testing methods. Part 1
+is titled "Digital Compression and Coding of Continuous-tone Still Images,
+Part 1: Requirements and guidelines" and has document numbers ISO/IEC IS
+10918-1, ITU-T T.81. Part 2 is titled "Digital Compression and Coding of
+Continuous-tone Still Images, Part 2: Compliance testing" and has document
+numbers ISO/IEC IS 10918-2, ITU-T T.83.
+
+Some extensions to the original JPEG standard are defined in JPEG Part 3,
+a newer ISO standard numbered ISO/IEC IS 10918-3 and ITU-T T.84. IJG
+currently does not support any Part 3 extensions.
+
+The JPEG standard does not specify all details of an interchangeable file
+format. For the omitted details we follow the "JFIF" conventions, revision
+1.02. A copy of the JFIF spec is available from:
+ Literature Department
+ C-Cube Microsystems, Inc.
+ 1778 McCarthy Blvd.
+ Milpitas, CA 95035
+ phone (408) 944-6300, fax (408) 944-6314
+A PostScript version of this document is available by FTP at
+ftp://ftp.uu.net/graphics/jpeg/jfif.ps.gz. There is also a plain text
+version at ftp://ftp.uu.net/graphics/jpeg/jfif.txt.gz, but it is missing
+the figures.
+
+The TIFF 6.0 file format specification can be obtained by FTP from
+ftp://ftp.sgi.com/graphics/tiff/TIFF6.ps.gz. The JPEG incorporation scheme
+found in the TIFF 6.0 spec of 3-June-92 has a number of serious problems.
+IJG does not recommend use of the TIFF 6.0 design (TIFF Compression tag 6).
+Instead, we recommend the JPEG design proposed by TIFF Technical Note #2
+(Compression tag 7). Copies of this Note can be obtained from ftp.sgi.com or
+from ftp://ftp.uu.net/graphics/jpeg/. It is expected that the next revision
+of the TIFF spec will replace the 6.0 JPEG design with the Note's design.
+Although IJG's own code does not support TIFF/JPEG, the free libtiff library
+uses our library to implement TIFF/JPEG per the Note. libtiff is available
+from ftp://ftp.sgi.com/graphics/tiff/.
+
+
+ARCHIVE LOCATIONS
+=================
+
+The "official" archive site for this software is ftp.uu.net (Internet
+address 192.48.96.9). The most recent released version can always be found
+there in directory graphics/jpeg. This particular version will be archived
+as ftp://ftp.uu.net/graphics/jpeg/jpegsrc.v6b.tar.gz. If you don't have
+direct Internet access, UUNET's archives are also available via UUCP; contact
+help@uunet.uu.net for information on retrieving files that way.
+
+Numerous Internet sites maintain copies of the UUNET files. However, only
+ftp.uu.net is guaranteed to have the latest official version.
+
+You can also obtain this software in DOS-compatible "zip" archive format from
+the SimTel archives (ftp://ftp.simtel.net/pub/simtelnet/msdos/graphics/), or
+on CompuServe in the Graphics Support forum (GO CIS:GRAPHSUP), library 12
+"JPEG Tools". Again, these versions may sometimes lag behind the ftp.uu.net
+release.
+
+The JPEG FAQ (Frequently Asked Questions) article is a useful source of
+general information about JPEG. It is updated constantly and therefore is
+not included in this distribution. The FAQ is posted every two weeks to
+Usenet newsgroups comp.graphics.misc, news.answers, and other groups.
+It is available on the World Wide Web at http://www.faqs.org/faqs/jpeg-faq/
+and other news.answers archive sites, including the official news.answers
+archive at rtfm.mit.edu: ftp://rtfm.mit.edu/pub/usenet/news.answers/jpeg-faq/.
+If you don't have Web or FTP access, send e-mail to mail-server@rtfm.mit.edu
+with body
+ send usenet/news.answers/jpeg-faq/part1
+ send usenet/news.answers/jpeg-faq/part2
+
+
+RELATED SOFTWARE
+================
+
+Numerous viewing and image manipulation programs now support JPEG. (Quite a
+few of them use this library to do so.) The JPEG FAQ described above lists
+some of the more popular free and shareware viewers, and tells where to
+obtain them on Internet.
+
+If you are on a Unix machine, we highly recommend Jef Poskanzer's free
+PBMPLUS software, which provides many useful operations on PPM-format image
+files. In particular, it can convert PPM images to and from a wide range of
+other formats, thus making cjpeg/djpeg considerably more useful. The latest
+version is distributed by the NetPBM group, and is available from numerous
+sites, notably ftp://wuarchive.wustl.edu/graphics/graphics/packages/NetPBM/.
+Unfortunately PBMPLUS/NETPBM is not nearly as portable as the IJG software is;
+you are likely to have difficulty making it work on any non-Unix machine.
+
+A different free JPEG implementation, written by the PVRG group at Stanford,
+is available from ftp://havefun.stanford.edu/pub/jpeg/. This program
+is designed for research and experimentation rather than production use;
+it is slower, harder to use, and less portable than the IJG code, but it
+is easier to read and modify. Also, the PVRG code supports lossless JPEG,
+which we do not. (On the other hand, it doesn't do progressive JPEG.)
+
+
+FILE FORMAT WARS
+================
+
+Some JPEG programs produce files that are not compatible with our library.
+The root of the problem is that the ISO JPEG committee failed to specify a
+concrete file format. Some vendors "filled in the blanks" on their own,
+creating proprietary formats that no one else could read. (For example, none
+of the early commercial JPEG implementations for the Macintosh were able to
+exchange compressed files.)
+
+The file format we have adopted is called JFIF (see REFERENCES). This format
+has been agreed to by a number of major commercial JPEG vendors, and it has
+become the de facto standard. JFIF is a minimal or "low end" representation.
+We recommend the use of TIFF/JPEG (TIFF revision 6.0 as modified by TIFF
+Technical Note #2) for "high end" applications that need to record a lot of
+additional data about an image. TIFF/JPEG is fairly new and not yet widely
+supported, unfortunately.
+
+The upcoming JPEG Part 3 standard defines a file format called SPIFF.
+SPIFF is interoperable with JFIF, in the sense that most JFIF decoders should
+be able to read the most common variant of SPIFF. SPIFF has some technical
+advantages over JFIF, but its major claim to fame is simply that it is an
+official standard rather than an informal one. At this point it is unclear
+whether SPIFF will supersede JFIF or whether JFIF will remain the de-facto
+standard. IJG intends to support SPIFF once the standard is frozen, but we
+have not decided whether it should become our default output format or not.
+(In any case, our decoder will remain capable of reading JFIF indefinitely.)
+
+Various proprietary file formats incorporating JPEG compression also exist.
+We have little or no sympathy for the existence of these formats. Indeed,
+one of the original reasons for developing this free software was to help
+force convergence on common, open format standards for JPEG files. Don't
+use a proprietary file format!
+
+
+TO DO
+=====
+
+The major thrust for v7 will probably be improvement of visual quality.
+The current method for scaling the quantization tables is known not to be
+very good at low Q values. We also intend to investigate block boundary
+smoothing, "poor man's variable quantization", and other means of improving
+quality-vs-file-size performance without sacrificing compatibility.
+
+In future versions, we are considering supporting some of the upcoming JPEG
+Part 3 extensions --- principally, variable quantization and the SPIFF file
+format.
+
+As always, speeding things up is of great interest.
+
+Please send bug reports, offers of help, etc. to jpeg-info@uunet.uu.net.
+
+==============================================================================
+
+HP APDK uses the JPEG library. HP APDK does not distribute the source code
+for this library in entirety. Developers are required to download the source
+code for this library themselves. However, HP APDK includes the following two
+files in the distribution:
+ - jdatadbf.c
+ - jccolor.c
+jdatadbf.c is unmodified and distributed as is
+in jccolor.c, the values of CSC table are modified
diff --git a/prnt/hpijs/apollo21xx.cpp b/prnt/hpijs/apollo21xx.cpp
new file mode 100644
index 0000000..7724336
--- /dev/null
+++ b/prnt/hpijs/apollo21xx.cpp
@@ -0,0 +1,101 @@
+/*****************************************************************************\
+ apollo21xx.cpp : Implimentation for the Apollo21xx class
+
+ Copyright (c) 2000, 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+#ifdef APDK_APOLLO21XX
+
+#include "header.h"
+#include "apollo2xxx.h"
+#include "apollo21xx.h"
+#include "printerproxy.h"
+
+APDK_BEGIN_NAMESPACE
+
+//! Constructor for Apollo21xx
+/*!
+******************************************************************************/
+Apollo21xx::Apollo21xx(SystemServices* pSS, BOOL proto)
+ : Apollo2xxx(pSS,proto)
+{
+ // set ePen to COLOR in all cases
+ ePen=COLOR_PEN; // matches default mode
+ // because of firmware bug, we make COLOR the default
+ PrintMode* pm = pMode[DEFAULTMODE_INDEX];
+ pMode[DEFAULTMODE_INDEX] = pMode[SPECIALMODE_INDEX];
+ pMode[SPECIALMODE_INDEX] = pm;
+}
+
+DRIVER_ERROR Apollo21xx::ParsePenInfo(PEN_TYPE& ePen, BOOL QueryPrinter)
+// firmware always reports BOTH_PENS
+// so we will act like it is a color pen only
+{
+ ePen=COLOR_PEN;
+ return NO_ERROR;
+}
+
+Header21xx::Header21xx(Printer* p,PrintContext* pc)
+ : Header(p,pc)
+{ }
+
+Header* Apollo21xx::SelectHeader(PrintContext* pc)
+{
+ return new Header21xx(this,pc);
+}
+
+DRIVER_ERROR Header21xx::Send()
+{ DRIVER_ERROR err;
+
+ StartSend();
+
+ // the 2100 always reports two pens, AND mishandles CMY unless you send
+ // BlackExtractOff
+
+ err = thePrinter->Send((const BYTE*)BlackExtractOff,
+ sizeof(BlackExtractOff)); // just pertains to 2-pen
+ ERRCHECK;
+
+ err = ConfigureRasterData();
+ ERRCHECK;
+
+ if (ResolutionY[0] == 600)
+ {
+ char uom[10];
+ sprintf(uom,"%c%c%c%d%c",ESC,'&','u',thePrintMode->ResolutionY[K],'D');
+ err=thePrinter->Send((const BYTE*)uom, 7 );
+ ERRCHECK;
+ }
+
+ err=Graphics(); // start raster graphics and set compression mode
+
+return err;
+}
+
+APDK_END_NAMESPACE
+
+#endif //APDK_APOLLO21XX
diff --git a/prnt/hpijs/apollo21xx.h b/prnt/hpijs/apollo21xx.h
new file mode 100644
index 0000000..6c13b47
--- /dev/null
+++ b/prnt/hpijs/apollo21xx.h
@@ -0,0 +1,68 @@
+/*****************************************************************************\
+ apollo21xx.h : Interface for the Apollo21xx class
+
+ Copyright (c) 2000, 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#ifndef APDK_APOLLO21xx_H
+#define APDK_APOLLO21xx_H
+
+APDK_BEGIN_NAMESPACE
+
+/*!
+\internal
+*/
+class Apollo21xx : public Apollo2xxx
+{
+public:
+ Apollo21xx(SystemServices* pSS, BOOL proto=FALSE);
+ Header* SelectHeader(PrintContext* pc);
+ virtual DRIVER_ERROR ParsePenInfo(PEN_TYPE& ePen, BOOL QueryPrinter=TRUE);
+
+}; //Apollo21xx
+
+#ifdef APDK_APOLLO21XX
+//! Apollo21xxProxy
+/*!
+******************************************************************************/
+class Apollo21xxProxy : public PrinterProxy
+{
+public:
+ Apollo21xxProxy() : PrinterProxy(
+ "AP21xx", // family name
+ "P-2000U\0" // Apollo P2000U
+ ) {m_iPrinterType = eAP21xx;}
+ inline Printer* CreatePrinter(SystemServices* pSS) const { return new Apollo21xx(pSS); }
+ inline PRINTER_TYPE GetPrinterType() const { return eAP21xx;}
+ inline unsigned int GetModelBit() const { return 0x2000;}
+};
+#endif
+
+APDK_END_NAMESPACE
+
+#endif // APDK_APOLLO21xx_H
diff --git a/prnt/hpijs/apollo2560.cpp b/prnt/hpijs/apollo2560.cpp
new file mode 100644
index 0000000..a76c5dd
--- /dev/null
+++ b/prnt/hpijs/apollo2560.cpp
@@ -0,0 +1,53 @@
+/*****************************************************************************\
+ apollo2560.cpp : Implimentation for the Apollo2560 class
+
+ Copyright (c) 2000, 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#ifdef APDK_APOLLO2560
+
+#include "header.h"
+#include "apollo2xxx.h"
+#include "apollo2560.h"
+#include "printerproxy.h"
+
+APDK_BEGIN_NAMESPACE
+
+Apollo2560::Apollo2560(SystemServices* pSS, BOOL proto)
+ : Apollo2xxx(pSS,proto)
+// for 2500/2600
+// set CMY default for unidi
+{
+ PrintMode* pm = pMode[DEFAULTMODE_INDEX];
+ pMode[DEFAULTMODE_INDEX] = pMode[SPECIALMODE_INDEX];
+ pMode[SPECIALMODE_INDEX] = pm;
+}
+
+APDK_END_NAMESPACE
+
+#endif //APDK_APOLLO2560
diff --git a/prnt/hpijs/apollo2560.h b/prnt/hpijs/apollo2560.h
new file mode 100644
index 0000000..add781b
--- /dev/null
+++ b/prnt/hpijs/apollo2560.h
@@ -0,0 +1,66 @@
+/*****************************************************************************\
+ apollo2560.h : Interface for the Apollo2560 class
+
+ Copyright (c) 2000, 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#ifndef APDK_APOLLO2560_H
+#define APDK_APOLLO2560_H
+
+APDK_BEGIN_NAMESPACE
+
+/*!
+\internal
+*/
+class Apollo2560 : public Apollo2xxx
+{
+public:
+ Apollo2560(SystemServices* pSS, BOOL proto=FALSE);
+
+}; //Apollo2560
+
+#ifdef APDK_APOLLO2560
+//! Apollo2560Proxy
+/*!
+******************************************************************************/
+class Apollo2560Proxy : public PrinterProxy
+{
+public:
+ Apollo2560Proxy() : PrinterProxy(
+ "AP2560", // family name
+ "APOLLO P2500/2600\0" // Apollo P2500 & P2600
+ ) {m_iPrinterType = eAP2560;}
+ inline Printer* CreatePrinter(SystemServices* pSS) const { return new Apollo2560(pSS); }
+ inline PRINTER_TYPE GetPrinterType() const { return eAP2560;}
+ inline unsigned int GetModelBit() const { return 0x1000;}
+};
+#endif
+
+APDK_END_NAMESPACE
+
+#endif //APDK_APOLLO2560_H
diff --git a/prnt/hpijs/apollo2xxx.cpp b/prnt/hpijs/apollo2xxx.cpp
new file mode 100644
index 0000000..51727a2
--- /dev/null
+++ b/prnt/hpijs/apollo2xxx.cpp
@@ -0,0 +1,304 @@
+/*****************************************************************************\
+ apollo2xxx.cpp : Implimentation for the Apollo2xxx class
+
+ Copyright (c) 2000, 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#ifdef APDK_APOLLO2XXX
+
+#include "header.h"
+#include "apollo2xxx.h"
+#include "printerproxy.h"
+
+APDK_BEGIN_NAMESPACE
+
+extern uint32_t ulMapDJ690_CMYK[ 9 * 9 * 9 ];
+extern uint32_t ulMapDJ690_ClMlxx[ 9 * 9 * 9 ];
+extern uint32_t ulMapDJ660_CCM_KCMY[ 9 * 9 * 9 ];
+extern uint32_t ulMapDJ600_CCM_K[ 9 * 9 * 9 ];
+extern uint32_t ulMapDJ600_CCM_CMY[ 9 * 9 * 9 ];
+
+Apollo2xxx::Apollo2xxx(SystemServices* pSS, BOOL proto)
+ : Printer(pSS, NUM_DJ6XX_FONTS,proto)
+{
+
+ if ((!proto) && (IOMode.bDevID))
+ {
+ constructor_error = VerifyPenInfo();
+ CERRCHECK;
+ }
+ else ePen=BOTH_PENS; // matches default mode
+
+ CMYMap = ulMapDJ600_CCM_CMY; // used in Mode2xxxColor
+
+ pMode[DEFAULTMODE_INDEX] = new PrintMode(ulMapDJ660_CCM_KCMY); // normal color kcmy
+ pMode[SPECIALMODE_INDEX] = new Mode2xxxColor(); // normal color cmy
+ pMode[SPECIALMODE_INDEX+1] = new Mode2xxxPhoto(); // photo
+ pMode[GRAYMODE_INDEX] = new GrayMode2xxx(); // normal gray k
+#ifdef APDK_EXTENDED_MEDIASIZE
+ pMode[SPECIALMODE_INDEX+2] = new Mode2xxxDraftGrayK();
+ pMode[SPECIALMODE_INDEX+3] = new Mode2xxxDraftColorKCMY();
+ pMode[SPECIALMODE_INDEX+4] = new Mode2xxxDraftColorCMY();
+ pMode[SPECIALMODE_INDEX+5] = new Mode2xxxBestGrayK();
+ ModeCount=8;
+#else
+ ModeCount = 4;
+#endif
+
+ DBG1("AP2xxx created\n");
+
+}
+
+DRIVER_ERROR Apollo2xxx::VerifyPenInfo()
+{
+ DRIVER_ERROR err=NO_ERROR;
+
+ if(IOMode.bDevID == FALSE)
+ return err;
+
+ err = ParsePenInfo(ePen);
+ ERRCHECK;
+
+ // check for the normal case
+ if (ePen == BOTH_PENS || ePen == MDL_BOTH || ePen == COLOR_PEN || ePen == BLACK_PEN)
+ return NO_ERROR;
+
+DBG1("Apollo2xxx::VerifyPenInfo(): ePen is not BOTH_PENS, MDL_BOTH, COLOR_PEN, or BLACK_PEN\n");
+
+ // the 2100 printers require the color pen OR the black pen to be installed, so trap
+ // on any pen type that does not include either the color pen or black pen
+ while ( (ePen != BOTH_PENS) && (ePen != MDL_BOTH) && (ePen != COLOR_PEN) && (ePen != BLACK_PEN))
+ {
+DBG1("Apollo2xxx::VerifyPenInfo(): in while loop\n");
+
+ switch (ePen)
+ {
+ case MDL_PEN:
+ // photopen installed, need to install color pen
+ pSS->DisplayPrinterStatus(DISPLAY_NO_COLOR_PEN);
+ break;
+ case NO_PEN:
+ // neither pen installed
+ default:
+ pSS->DisplayPrinterStatus(DISPLAY_NO_PENS);
+ break;
+ }
+
+ if (pSS->BusyWait(500) == JOB_CANCELED)
+ return JOB_CANCELED;
+
+ err = ParsePenInfo(ePen);
+ ERRCHECK;
+ }
+
+ pSS->DisplayPrinterStatus(DISPLAY_PRINTING);
+
+ return NO_ERROR;
+
+}
+
+DRIVER_ERROR Apollo2xxx::ParsePenInfo(PEN_TYPE& ePen, BOOL QueryPrinter)
+{
+ char* str;
+ DRIVER_ERROR err = SetPenInfo(str, QueryPrinter);
+ ERRCHECK;
+
+ if (*str != '$')
+ {
+ return BAD_DEVICE_ID;
+ }
+
+ str++; // skip $
+ // parse penID
+ PEN_TYPE temp_pen1;
+ // check pen1, assume it is black or MDL, pen2 is color
+ switch (str[0])
+ {
+ // check for MDL in case someone wedged one in there
+ case 'M': temp_pen1 = MDL_PEN; break; // (M)ulti-Dye load pen
+ case 'C': temp_pen1 = BLACK_PEN; break; // (C)andide black
+ default: temp_pen1 = NO_PEN; break;
+ }
+
+ // now check pen2
+
+ int i = 2;
+ while(i < DevIDBuffSize && str[i]!='$') i++; // handles variable length penIDs
+
+ if (i == DevIDBuffSize)
+ {
+ return BAD_DEVICE_ID;
+ }
+
+ i++;
+
+ if(str[i]=='R') // we have the (R)obinhood color pen,
+ // check what pen1 was
+ {
+ if (temp_pen1 == BLACK_PEN)
+ ePen = BOTH_PENS;
+ else
+ {
+ if (temp_pen1 == MDL_PEN)
+ ePen = MDL_BOTH;
+ else
+ ePen = COLOR_PEN;
+ }
+ }
+ else // no color pen, just set what pen1 was
+ ePen = temp_pen1;
+
+ return NO_ERROR;
+}
+
+
+Mode2xxxPhoto::Mode2xxxPhoto()
+// print mode for photo pen
+: PrintMode(ulMapDJ690_CMYK,ulMapDJ690_ClMlxx)
+{
+ dyeCount=6;
+ medium = mediaSpecial;
+ theQuality = qualityNormal;
+
+ pmQuality=QUALITY_BEST;
+ pmMediaType=MEDIA_PREMIUM;
+
+
+ BaseResX = 600;
+ for (int i=0; i < 6; i++)
+ ResolutionX[i]=600;
+
+ CompatiblePens[0] = MDL_BOTH;
+
+// strcpy(ModeName, "Photo");
+
+}
+
+Mode2xxxColor::Mode2xxxColor()
+: PrintMode(ulMapDJ600_CCM_CMY)
+{
+ dyeCount=3;
+ CompatiblePens[0] = COLOR_PEN; // only color pen allowed
+
+// strcpy(ModeName, "Color");
+}
+
+GrayMode2xxx::GrayMode2xxx()
+// print mode for photo pen
+: PrintMode( ulMapDJ600_CCM_K )
+{
+ CompatiblePens[1] = MDL_BOTH;
+
+ pmColor=GREY_K;
+ dyeCount=1;
+
+}
+
+#ifdef APDK_EXTENDED_MEDIASIZE
+Mode2xxxDraftColorKCMY::Mode2xxxDraftColorKCMY()
+: PrintMode( ulMapDJ660_CCM_KCMY )
+{
+ theQuality = qualityDraft;
+ Config.eHT = MATRIX;
+ pmQuality = QUALITY_DRAFT;
+}
+
+Mode2xxxDraftGrayK::Mode2xxxDraftGrayK()
+: PrintMode(ulMapDJ600_CCM_K)
+{
+ CompatiblePens[1] = MDL_BOTH;
+ pmColor=GREY_K;
+ dyeCount=1;
+ theQuality = qualityDraft;
+ pmQuality = QUALITY_DRAFT;
+}
+
+Mode2xxxDraftColorCMY::Mode2xxxDraftColorCMY()
+: PrintMode( ulMapDJ600_CCM_CMY )
+{
+ dyeCount=3;
+ CompatiblePens[0] = COLOR_PEN; // only color pen allowed
+ theQuality = qualityDraft;
+ pmQuality = QUALITY_DRAFT;
+}
+
+Mode2xxxBestGrayK::Mode2xxxBestGrayK()
+: GrayMode(ulMapDJ600_CCM_K)
+{
+ theQuality = qualityPresentation;
+ pmQuality = QUALITY_BEST;
+ BaseResX = BaseResY = 600;
+ ResolutionX[0] = ResolutionY[0] = 600;
+}
+#endif // APDK_EXTENDED_MEDIASIZE
+
+Header2xxx::Header2xxx(Printer* p,PrintContext* pc)
+ : Header(p,pc)
+{ }
+
+
+Header* Apollo2xxx::SelectHeader(PrintContext* pc)
+{
+ return new Header2xxx(this,pc);
+}
+
+DRIVER_ERROR Header2xxx::Send()
+{ DRIVER_ERROR err;
+
+ StartSend();
+
+ // don't disable black extraction if we are in the color pen only mode
+ // since the printer may actually have both pens so we want the printer
+ // to print the K with the K pen if it actually has one
+
+ if (thePrintMode->dyeCount != 3)
+ {
+ err = thePrinter->Send((const BYTE*)BlackExtractOff,
+ sizeof(BlackExtractOff));
+ ERRCHECK;
+ }
+
+ err = ConfigureRasterData();
+ ERRCHECK;
+
+ if (ResolutionY[0] == 600)
+ {
+ char uom[10];
+ sprintf(uom,"%c%c%c%d%c",ESC,'&','u',thePrintMode->ResolutionY[K],'D');
+ err=thePrinter->Send((const BYTE*)uom, 7 );
+ ERRCHECK;
+ }
+
+ err=Graphics(); // start raster graphics and set compression mode
+
+return err;
+}
+
+APDK_END_NAMESPACE
+
+#endif //APDK_APOLLO2XXX
diff --git a/prnt/hpijs/apollo2xxx.h b/prnt/hpijs/apollo2xxx.h
new file mode 100644
index 0000000..3e40bb3
--- /dev/null
+++ b/prnt/hpijs/apollo2xxx.h
@@ -0,0 +1,136 @@
+/*****************************************************************************\
+ apollo2xxx.h : Interface for the Apollo2xxx class
+
+ Copyright (c) 2000, 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#ifndef APDK_APOLLO2xxx_H
+#define APDK_APOLLO2xxx_H
+
+APDK_BEGIN_NAMESPACE
+/*!
+\internal
+*/
+class Apollo2xxx : public Printer
+{
+public:
+ Apollo2xxx(SystemServices* pSS, BOOL proto=FALSE);
+
+ Header* SelectHeader(PrintContext* pc);
+ virtual DRIVER_ERROR VerifyPenInfo();
+ virtual DRIVER_ERROR ParsePenInfo(PEN_TYPE& ePen, BOOL QueryPrinter=TRUE);
+ virtual BOOL GetMargins (PAPER_SIZE ps, float *fMargins)
+ {
+ if (ps == A4)
+ fMargins[0] = (float) 0.135;
+ else
+ fMargins[0] = (float) 0.25; // Left Margin
+ fMargins[1] = fMargins[0]; // Right Margin
+ fMargins[2] = (float) 0.125; // Top Margin
+ fMargins[3] = (float) 0.67; // Bottom Margin
+ return TRUE;
+ }
+
+#ifdef APDK_HP_UX
+protected:
+ virtual Apollo2xxx & operator = (Printer &rhs)
+ {
+ return *this;
+ }
+#endif
+
+}; //Apollo2xxx
+
+
+class Mode2xxxPhoto : public PrintMode
+{
+public:
+ Mode2xxxPhoto();
+}; //Mode2xxxPhoto
+
+
+class Mode2xxxColor : public PrintMode
+{
+public:
+ Mode2xxxColor();
+
+}; //Mode2xxxColor
+
+
+class GrayMode2xxx : public PrintMode
+{
+public:
+ GrayMode2xxx();
+}; //GrayMode2xxx
+
+#ifdef APDK_EXTENDED_MEDIASIZE
+class Mode2xxxDraftGrayK : public PrintMode
+{
+public:
+ Mode2xxxDraftGrayK();
+}; //Mode2xxxDraftGrayK
+
+class Mode2xxxDraftColorKCMY : public PrintMode
+{
+public:
+ Mode2xxxDraftColorKCMY();
+}; //Mode2xxxDraftKCMYColor
+
+class Mode2xxxDraftColorCMY : public PrintMode
+{
+public:
+ Mode2xxxDraftColorCMY();
+}; //Mode2xxxDraftCMYColor
+
+class Mode2xxxBestGrayK : public GrayMode
+{
+public:
+ Mode2xxxBestGrayK();
+}; //Mode2xxxBestGrayK
+#endif // APDK_EXTENDED_MEDIASIZE
+
+#ifdef APDK_APOLLO2XXX
+//! Apollo2xxxProxy
+/*!
+******************************************************************************/
+class Apollo2xxxProxy : public PrinterProxy
+{
+public:
+ Apollo2xxxProxy() : PrinterProxy(
+ "AP2xxx", // family name
+ "APOLLO P-22\0" // Apollo P-22xx series
+ ) {m_iPrinterType = eAP2xxx;}
+ inline Printer* CreatePrinter(SystemServices* pSS) const { return new Apollo2xxx(pSS); }
+ inline PRINTER_TYPE GetPrinterType() const { return eAP2xxx;}
+ inline unsigned int GetModelBit() const { return 0x4000;}
+};
+#endif
+
+APDK_END_NAMESPACE
+
+#endif //APDK_APOLLO2xx_H
diff --git a/prnt/hpijs/breaks_open.cpp b/prnt/hpijs/breaks_open.cpp
new file mode 100644
index 0000000..fbd37f8
--- /dev/null
+++ b/prnt/hpijs/breaks_open.cpp
@@ -0,0 +1,2386 @@
+/*****************************************************************************\
+ breaks_open.cpp : Open Source Imaging Error Diffusion Tables
+
+ Copyright (c) 1994 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+#include "config.h"
+#include "resources.h"
+
+APDK_BEGIN_NAMESPACE
+
+const unsigned char HTBinary_open[1024]=
+{
+ 0 , 0 , 0 , 0 ,
+ 0 , 0 , 0 , 0 ,
+ 0 , 2 , 0 , 0 ,
+ 0 , 3 , 0 , 0 ,
+ 0 , 4 , 0 , 0 ,
+ 0 , 5 , 0 , 0 ,
+ 0 , 6 , 0 , 0 ,
+ 0 , 7 , 0 , 0 ,
+ 0 , 8 , 0 , 0 ,
+ 0 , 9 , 0 , 0 ,
+ 0 , 10 , 0 , 0 ,
+ 0 , 11 , 0 , 0 ,
+ 0 , 12 , 0 , 0 ,
+ 0 , 13 , 0 , 0 ,
+ 0 , 14 , 0 , 0 ,
+ 0 , 15 , 0 , 0 ,
+ 0 , 16 , 0 , 0 ,
+ 0 , 17 , 0 , 0 ,
+ 0 , 18 , 0 , 0 ,
+ 0 , 19 , 0 , 0 ,
+ 0 , 20 , 0 , 0 ,
+ 0 , 21 , 0 , 0 ,
+ 0 , 22 , 0 , 0 ,
+ 0 , 23 , 0 , 0 ,
+ 0 , 24 , 0 , 0 ,
+ 0 , 25 , 0 , 0 ,
+ 0 , 26 , 0 , 0 ,
+ 0 , 27 , 0 , 0 ,
+ 0 , 28 , 0 , 0 ,
+ 0 , 29 , 0 , 0 ,
+ 0 , 30 , 0 , 0 ,
+ 0 , 31 , 0 , 0 ,
+ 0 , 32 , 0 , 0 ,
+ 0 , 33 , 0 , 0 ,
+ 0 , 34 , 0 , 0 ,
+ 0 , 35 , 0 , 0 ,
+ 0 , 36 , 0 , 0 ,
+ 0 , 37 , 0 , 0 ,
+ 0 , 38 , 0 , 0 ,
+ 0 , 39 , 0 , 0 ,
+ 0 , 40 , 0 , 0 ,
+ 0 , 41 , 0 , 0 ,
+ 0 , 42 , 0 , 0 ,
+ 0 , 43 , 0 , 0 ,
+ 0 , 44 , 0 , 0 ,
+ 0 , 45 , 0 , 0 ,
+ 0 , 46 , 0 , 0 ,
+ 0 , 47 , 0 , 0 ,
+ 0 , 48 , 0 , 0 ,
+ 0 , 49 , 0 , 0 ,
+ 0 , 50 , 0 , 0 ,
+ 0 , 51 , 0 , 0 ,
+ 0 , 52 , 0 , 0 ,
+ 0 , 53 , 0 , 0 ,
+ 0 , 54 , 0 , 0 ,
+ 0 , 55 , 0 , 0 ,
+ 0 , 56 , 0 , 0 ,
+ 0 , 57 , 0 , 0 ,
+ 0 , 58 , 0 , 0 ,
+ 0 , 59 , 0 , 0 ,
+ 0 , 60 , 0 , 0 ,
+ 0 , 61 , 0 , 0 ,
+ 0 , 62 , 0 , 0 ,
+ 0 , 63 , 0 , 0 ,
+ 0 , 64 , 0 , 0 ,
+ 0 , 65 , 0 , 0 ,
+ 0 , 66 , 0 , 0 ,
+ 0 , 67 , 0 , 0 ,
+ 0 , 68 , 0 , 0 ,
+ 0 , 69 , 0 , 0 ,
+ 0 , 70 , 0 , 0 ,
+ 0 , 71 , 0 , 0 ,
+ 0 , 72 , 0 , 0 ,
+ 0 , 73 , 0 , 0 ,
+ 0 , 74 , 0 , 0 ,
+ 0 , 75 , 0 , 0 ,
+ 0 , 76 , 0 , 0 ,
+ 0 , 77 , 0 , 0 ,
+ 0 , 78 , 0 , 0 ,
+ 0 , 79 , 0 , 0 ,
+ 0 , 80 , 0 , 0 ,
+ 0 , 81 , 0 , 0 ,
+ 0 , 82 , 0 , 0 ,
+ 0 , 83 , 0 , 0 ,
+ 0 , 84 , 0 , 0 ,
+ 0 , 85 , 0 , 0 ,
+ 0 , 86 , 0 , 0 ,
+ 0 , 87 , 0 , 0 ,
+ 0 , 88 , 0 , 0 ,
+ 0 , 89 , 0 , 0 ,
+ 0 , 90 , 0 , 0 ,
+ 0 , 91 , 0 , 0 ,
+ 0 , 92 , 0 , 0 ,
+ 0 , 93 , 0 , 0 ,
+ 0 , 94 , 0 , 0 ,
+ 0 , 95 , 0 , 0 ,
+ 0 , 96 , 0 , 0 ,
+ 0 , 97 , 0 , 0 ,
+ 0 , 98 , 0 , 0 ,
+ 0 , 99 , 0 , 0 ,
+ 0 , 100 , 0 , 0 ,
+ 0 , 101 , 0 , 0 ,
+ 0 , 102 , 0 , 0 ,
+ 0 , 103 , 0 , 0 ,
+ 0 , 104 , 0 , 0 ,
+ 0 , 105 , 0 , 0 ,
+ 0 , 106 , 0 , 0 ,
+ 0 , 107 , 0 , 0 ,
+ 0 , 108 , 0 , 0 ,
+ 0 , 109 , 0 , 0 ,
+ 0 , 110 , 0 , 0 ,
+ 0 , 111 , 0 , 0 ,
+ 0 , 112 , 0 , 0 ,
+ 0 , 113 , 0 , 0 ,
+ 0 , 114 , 0 , 0 ,
+ 0 , 115 , 0 , 0 ,
+ 0 , 116 , 0 , 0 ,
+ 0 , 117 , 0 , 0 ,
+ 0 , 118 , 0 , 0 ,
+ 0 , 119 , 0 , 0 ,
+ 0 , 120 , 0 , 0 ,
+ 0 , 121 , 0 , 0 ,
+ 0 , 122 , 0 , 0 ,
+ 0 , 123 , 0 , 0 ,
+ 0 , 124 , 0 , 0 ,
+ 0 , 125 , 0 , 0 ,
+ 0 , 126 , 0 , 0 ,
+ 0 , 127 , 0 , 0 ,
+ 0 , 128 , 0 , 0 ,
+ 0 , 129 , 0 , 0 ,
+ 0 , 130 , 0 , 0 ,
+ 0 , 131 , 0 , 0 ,
+ 0 , 132 , 0 , 0 ,
+ 0 , 133 , 0 , 0 ,
+ 0 , 134 , 0 , 0 ,
+ 0 , 135 , 0 , 0 ,
+ 0 , 136 , 0 , 0 ,
+ 0 , 137 , 0 , 0 ,
+ 0 , 138 , 0 , 0 ,
+ 0 , 139 , 0 , 0 ,
+ 0 , 140 , 0 , 0 ,
+ 0 , 141 , 0 , 0 ,
+ 0 , 142 , 0 , 0 ,
+ 0 , 143 , 0 , 0 ,
+ 0 , 144 , 0 , 0 ,
+ 0 , 145 , 0 , 0 ,
+ 0 , 146 , 0 , 0 ,
+ 0 , 147 , 0 , 0 ,
+ 0 , 148 , 0 , 0 ,
+ 0 , 149 , 0 , 0 ,
+ 0 , 150 , 0 , 0 ,
+ 0 , 151 , 0 , 0 ,
+ 0 , 152 , 0 , 0 ,
+ 0 , 153 , 0 , 0 ,
+ 0 , 154 , 0 , 0 ,
+ 0 , 155 , 0 , 0 ,
+ 0 , 156 , 0 , 0 ,
+ 0 , 157 , 0 , 0 ,
+ 0 , 158 , 0 , 0 ,
+ 0 , 159 , 0 , 0 ,
+ 0 , 160 , 0 , 0 ,
+ 0 , 161 , 0 , 0 ,
+ 0 , 162 , 0 , 0 ,
+ 0 , 163 , 0 , 0 ,
+ 0 , 164 , 0 , 0 ,
+ 0 , 165 , 0 , 0 ,
+ 0 , 166 , 0 , 0 ,
+ 0 , 167 , 0 , 0 ,
+ 0 , 168 , 0 , 0 ,
+ 0 , 169 , 0 , 0 ,
+ 0 , 170 , 0 , 0 ,
+ 0 , 171 , 0 , 0 ,
+ 0 , 172 , 0 , 0 ,
+ 0 , 173 , 0 , 0 ,
+ 0 , 174 , 0 , 0 ,
+ 0 , 175 , 0 , 0 ,
+ 0 , 176 , 0 , 0 ,
+ 0 , 177 , 0 , 0 ,
+ 0 , 178 , 0 , 0 ,
+ 0 , 179 , 0 , 0 ,
+ 0 , 180 , 0 , 0 ,
+ 0 , 181 , 0 , 0 ,
+ 0 , 182 , 0 , 0 ,
+ 0 , 183 , 0 , 0 ,
+ 0 , 184 , 0 , 0 ,
+ 0 , 185 , 0 , 0 ,
+ 0 , 186 , 0 , 0 ,
+ 0 , 187 , 0 , 0 ,
+ 0 , 188 , 0 , 0 ,
+ 0 , 189 , 0 , 0 ,
+ 0 , 190 , 0 , 0 ,
+ 0 , 191 , 0 , 0 ,
+ 0 , 192 , 0 , 0 ,
+ 0 , 193 , 0 , 0 ,
+ 0 , 194 , 0 , 0 ,
+ 0 , 195 , 0 , 0 ,
+ 0 , 196 , 0 , 0 ,
+ 0 , 197 , 0 , 0 ,
+ 0 , 198 , 0 , 0 ,
+ 0 , 199 , 0 , 0 ,
+ 0 , 200 , 0 , 0 ,
+ 0 , 201 , 0 , 0 ,
+ 0 , 202 , 0 , 0 ,
+ 0 , 203 , 0 , 0 ,
+ 0 , 204 , 0 , 0 ,
+ 0 , 205 , 0 , 0 ,
+ 0 , 206 , 0 , 0 ,
+ 0 , 207 , 0 , 0 ,
+ 0 , 208 , 0 , 0 ,
+ 0 , 209 , 0 , 0 ,
+ 0 , 210 , 0 , 0 ,
+ 0 , 211 , 0 , 0 ,
+ 0 , 212 , 0 , 0 ,
+ 0 , 213 , 0 , 0 ,
+ 0 , 214 , 0 , 0 ,
+ 0 , 215 , 0 , 0 ,
+ 0 , 216 , 0 , 0 ,
+ 0 , 217 , 0 , 0 ,
+ 0 , 218 , 0 , 0 ,
+ 0 , 219 , 0 , 0 ,
+ 0 , 220 , 0 , 0 ,
+ 0 , 221 , 0 , 0 ,
+ 0 , 222 , 0 , 0 ,
+ 0 , 223 , 0 , 0 ,
+ 0 , 224 , 0 , 0 ,
+ 0 , 225 , 0 , 0 ,
+ 0 , 226 , 0 , 0 ,
+ 0 , 227 , 0 , 0 ,
+ 0 , 228 , 0 , 0 ,
+ 0 , 229 , 0 , 0 ,
+ 0 , 230 , 0 , 0 ,
+ 0 , 231 , 0 , 0 ,
+ 0 , 232 , 0 , 0 ,
+ 0 , 233 , 0 , 0 ,
+ 0 , 234 , 0 , 0 ,
+ 0 , 235 , 0 , 0 ,
+ 0 , 236 , 0 , 0 ,
+ 0 , 237 , 0 , 0 ,
+ 0 , 238 , 0 , 0 ,
+ 0 , 239 , 0 , 0 ,
+ 0 , 240 , 0 , 0 ,
+ 0 , 241 , 0 , 0 ,
+ 0 , 242 , 0 , 0 ,
+ 0 , 243 , 0 , 0 ,
+ 0 , 244 , 0 , 0 ,
+ 0 , 245 , 0 , 0 ,
+ 0 , 246 , 0 , 0 ,
+ 0 , 247 , 0 , 0 ,
+ 0 , 248 , 0 , 0 ,
+ 0 , 249 , 0 , 0 ,
+ 0 , 250 , 0 , 0 ,
+ 0 , 251 , 0 , 0 ,
+ 0 , 252 , 0 , 0 ,
+ 0 , 253 , 0 , 0 ,
+ 0 , 254 , 0 , 0 ,
+ 0 , 254 , 0 , 0
+};
+
+const unsigned char HT300x3004level_open[1024]=
+{
+ 0 , 0 , 0 , 0 ,
+ 0 , 0 , 0 , 0 ,
+ 0 , 6 , 0 , 0 ,
+ 0 , 9 , 0 , 0 ,
+ 0 , 12 , 0 , 0 ,
+ 0 , 15 , 0 , 0 ,
+ 0 , 18 , 0 , 0 ,
+ 0 , 21 , 0 , 0 ,
+ 0 , 24 , 0 , 0 ,
+ 0 , 27 , 0 , 0 ,
+ 0 , 30 , 0 , 0 ,
+ 0 , 33 , 0 , 0 ,
+ 0 , 36 , 0 , 0 ,
+ 0 , 39 , 0 , 0 ,
+ 0 , 42 , 0 , 0 ,
+ 0 , 45 , 0 , 0 ,
+ 0 , 48 , 0 , 0 ,
+ 0 , 51 , 0 , 0 ,
+ 0 , 54 , 0 , 0 ,
+ 0 , 57 , 0 , 0 ,
+ 0 , 60 , 0 , 0 ,
+ 0 , 63 , 0 , 0 ,
+ 0 , 66 , 0 , 0 ,
+ 0 , 69 , 0 , 0 ,
+ 0 , 72 , 0 , 0 ,
+ 0 , 75 , 0 , 0 ,
+ 0 , 78 , 0 , 0 ,
+ 0 , 81 , 0 , 0 ,
+ 0 , 84 , 0 , 0 ,
+ 0 , 87 , 0 , 0 ,
+ 0 , 90 , 0 , 0 ,
+ 0 , 93 , 0 , 0 ,
+ 0 , 96 , 0 , 0 ,
+ 0 , 99 , 0 , 0 ,
+ 0 , 102 , 0 , 0 ,
+ 0 , 105 , 0 , 0 ,
+ 0 , 108 , 0 , 0 ,
+ 0 , 111 , 0 , 0 ,
+ 0 , 114 , 0 , 0 ,
+ 0 , 117 , 0 , 0 ,
+ 0 , 120 , 0 , 0 ,
+ 0 , 123 , 0 , 0 ,
+ 0 , 126 , 0 , 0 ,
+ 0 , 129 , 0 , 0 ,
+ 0 , 132 , 0 , 0 ,
+ 0 , 135 , 0 , 0 ,
+ 0 , 138 , 0 , 0 ,
+ 0 , 141 , 0 , 0 ,
+ 0 , 144 , 0 , 0 ,
+ 0 , 147 , 0 , 0 ,
+ 0 , 150 , 0 , 0 ,
+ 0 , 153 , 0 , 0 ,
+ 0 , 156 , 0 , 0 ,
+ 0 , 159 , 0 , 0 ,
+ 0 , 162 , 0 , 0 ,
+ 0 , 165 , 0 , 0 ,
+ 0 , 168 , 0 , 0 ,
+ 0 , 171 , 0 , 0 ,
+ 0 , 174 , 0 , 0 ,
+ 0 , 177 , 0 , 0 ,
+ 0 , 180 , 0 , 0 ,
+ 0 , 183 , 0 , 0 ,
+ 0 , 186 , 0 , 0 ,
+ 0 , 189 , 0 , 0 ,
+ 0 , 192 , 0 , 0 ,
+ 0 , 195 , 0 , 0 ,
+ 0 , 198 , 0 , 0 ,
+ 0 , 201 , 0 , 0 ,
+ 0 , 204 , 0 , 0 ,
+ 0 , 207 , 0 , 0 ,
+ 0 , 210 , 0 , 0 ,
+ 0 , 213 , 0 , 0 ,
+ 0 , 216 , 0 , 0 ,
+ 0 , 219 , 0 , 0 ,
+ 0 , 222 , 0 , 0 ,
+ 0 , 225 , 0 , 0 ,
+ 0 , 228 , 0 , 0 ,
+ 0 , 231 , 0 , 0 ,
+ 0 , 234 , 0 , 0 ,
+ 0 , 237 , 0 , 0 ,
+ 0 , 240 , 0 , 0 ,
+ 0 , 243 , 0 , 0 ,
+ 0 , 246 , 0 , 0 ,
+ 0 , 249 , 0 , 0 ,
+ 0 , 252 , 0 , 0 ,
+ 1 , 0 , 0 , 0 ,
+ 1 , 3 , 0 , 0 ,
+ 1 , 6 , 0 , 0 ,
+ 1 , 9 , 0 , 0 ,
+ 1 , 12 , 0 , 0 ,
+ 1 , 15 , 0 , 0 ,
+ 1 , 18 , 0 , 0 ,
+ 1 , 21 , 0 , 0 ,
+ 1 , 24 , 0 , 0 ,
+ 1 , 27 , 0 , 0 ,
+ 1 , 30 , 0 , 0 ,
+ 1 , 33 , 0 , 0 ,
+ 1 , 36 , 0 , 0 ,
+ 1 , 39 , 0 , 0 ,
+ 1 , 42 , 0 , 0 ,
+ 1 , 45 , 0 , 0 ,
+ 1 , 48 , 0 , 0 ,
+ 1 , 51 , 0 , 0 ,
+ 1 , 54 , 0 , 0 ,
+ 1 , 57 , 0 , 0 ,
+ 1 , 60 , 0 , 0 ,
+ 1 , 63 , 0 , 0 ,
+ 1 , 66 , 0 , 0 ,
+ 1 , 69 , 0 , 0 ,
+ 1 , 72 , 0 , 0 ,
+ 1 , 75 , 0 , 0 ,
+ 1 , 78 , 0 , 0 ,
+ 1 , 81 , 0 , 0 ,
+ 1 , 84 , 0 , 0 ,
+ 1 , 87 , 0 , 0 ,
+ 1 , 90 , 0 , 0 ,
+ 1 , 93 , 0 , 0 ,
+ 1 , 96 , 0 , 0 ,
+ 1 , 99 , 0 , 0 ,
+ 1 , 102 , 0 , 0 ,
+ 1 , 105 , 0 , 0 ,
+ 1 , 108 , 0 , 0 ,
+ 1 , 111 , 0 , 0 ,
+ 1 , 114 , 0 , 0 ,
+ 1 , 117 , 0 , 0 ,
+ 1 , 120 , 0 , 0 ,
+ 1 , 123 , 0 , 0 ,
+ 1 , 126 , 0 , 0 ,
+ 1 , 129 , 0 , 0 ,
+ 1 , 132 , 0 , 0 ,
+ 1 , 135 , 0 , 0 ,
+ 1 , 138 , 0 , 0 ,
+ 1 , 141 , 0 , 0 ,
+ 1 , 144 , 0 , 0 ,
+ 1 , 147 , 0 , 0 ,
+ 1 , 150 , 0 , 0 ,
+ 1 , 153 , 0 , 0 ,
+ 1 , 156 , 0 , 0 ,
+ 1 , 159 , 0 , 0 ,
+ 1 , 162 , 0 , 0 ,
+ 1 , 165 , 0 , 0 ,
+ 1 , 168 , 0 , 0 ,
+ 1 , 171 , 0 , 0 ,
+ 1 , 174 , 0 , 0 ,
+ 1 , 177 , 0 , 0 ,
+ 1 , 180 , 0 , 0 ,
+ 1 , 183 , 0 , 0 ,
+ 1 , 186 , 0 , 0 ,
+ 1 , 189 , 0 , 0 ,
+ 1 , 192 , 0 , 0 ,
+ 1 , 195 , 0 , 0 ,
+ 1 , 198 , 0 , 0 ,
+ 1 , 201 , 0 , 0 ,
+ 1 , 204 , 0 , 0 ,
+ 1 , 207 , 0 , 0 ,
+ 1 , 210 , 0 , 0 ,
+ 1 , 213 , 0 , 0 ,
+ 1 , 216 , 0 , 0 ,
+ 1 , 219 , 0 , 0 ,
+ 1 , 222 , 0 , 0 ,
+ 1 , 225 , 0 , 0 ,
+ 1 , 228 , 0 , 0 ,
+ 1 , 231 , 0 , 0 ,
+ 1 , 234 , 0 , 0 ,
+ 1 , 237 , 0 , 0 ,
+ 1 , 240 , 0 , 0 ,
+ 1 , 243 , 0 , 0 ,
+ 1 , 246 , 0 , 0 ,
+ 1 , 249 , 0 , 0 ,
+ 1 , 252 , 0 , 0 ,
+ 2 , 0 , 0 , 0 ,
+ 2 , 3 , 0 , 0 ,
+ 2 , 6 , 0 , 0 ,
+ 2 , 9 , 0 , 0 ,
+ 2 , 12 , 0 , 0 ,
+ 2 , 15 , 0 , 0 ,
+ 2 , 18 , 0 , 0 ,
+ 2 , 21 , 0 , 0 ,
+ 2 , 24 , 0 , 0 ,
+ 2 , 27 , 0 , 0 ,
+ 2 , 30 , 0 , 0 ,
+ 2 , 33 , 0 , 0 ,
+ 2 , 36 , 0 , 0 ,
+ 2 , 39 , 0 , 0 ,
+ 2 , 42 , 0 , 0 ,
+ 2 , 45 , 0 , 0 ,
+ 2 , 48 , 0 , 0 ,
+ 2 , 51 , 0 , 0 ,
+ 2 , 54 , 0 , 0 ,
+ 2 , 57 , 0 , 0 ,
+ 2 , 60 , 0 , 0 ,
+ 2 , 63 , 0 , 0 ,
+ 2 , 66 , 0 , 0 ,
+ 2 , 69 , 0 , 0 ,
+ 2 , 72 , 0 , 0 ,
+ 2 , 75 , 0 , 0 ,
+ 2 , 78 , 0 , 0 ,
+ 2 , 81 , 0 , 0 ,
+ 2 , 84 , 0 , 0 ,
+ 2 , 87 , 0 , 0 ,
+ 2 , 90 , 0 , 0 ,
+ 2 , 93 , 0 , 0 ,
+ 2 , 96 , 0 , 0 ,
+ 2 , 99 , 0 , 0 ,
+ 2 , 102 , 0 , 0 ,
+ 2 , 105 , 0 , 0 ,
+ 2 , 108 , 0 , 0 ,
+ 2 , 111 , 0 , 0 ,
+ 2 , 114 , 0 , 0 ,
+ 2 , 117 , 0 , 0 ,
+ 2 , 120 , 0 , 0 ,
+ 2 , 123 , 0 , 0 ,
+ 2 , 126 , 0 , 0 ,
+ 2 , 129 , 0 , 0 ,
+ 2 , 132 , 0 , 0 ,
+ 2 , 135 , 0 , 0 ,
+ 2 , 138 , 0 , 0 ,
+ 2 , 141 , 0 , 0 ,
+ 2 , 144 , 0 , 0 ,
+ 2 , 147 , 0 , 0 ,
+ 2 , 150 , 0 , 0 ,
+ 2 , 153 , 0 , 0 ,
+ 2 , 156 , 0 , 0 ,
+ 2 , 159 , 0 , 0 ,
+ 2 , 162 , 0 , 0 ,
+ 2 , 165 , 0 , 0 ,
+ 2 , 168 , 0 , 0 ,
+ 2 , 171 , 0 , 0 ,
+ 2 , 174 , 0 , 0 ,
+ 2 , 177 , 0 , 0 ,
+ 2 , 180 , 0 , 0 ,
+ 2 , 183 , 0 , 0 ,
+ 2 , 186 , 0 , 0 ,
+ 2 , 189 , 0 , 0 ,
+ 2 , 192 , 0 , 0 ,
+ 2 , 195 , 0 , 0 ,
+ 2 , 198 , 0 , 0 ,
+ 2 , 201 , 0 , 0 ,
+ 2 , 204 , 0 , 0 ,
+ 2 , 207 , 0 , 0 ,
+ 2 , 210 , 0 , 0 ,
+ 2 , 213 , 0 , 0 ,
+ 2 , 216 , 0 , 0 ,
+ 2 , 219 , 0 , 0 ,
+ 2 , 222 , 0 , 0 ,
+ 2 , 225 , 0 , 0 ,
+ 2 , 228 , 0 , 0 ,
+ 2 , 231 , 0 , 0 ,
+ 2 , 234 , 0 , 0 ,
+ 2 , 237 , 0 , 0 ,
+ 2 , 240 , 0 , 0 ,
+ 2 , 243 , 0 , 0 ,
+ 2 , 246 , 0 , 0 ,
+ 2 , 249 , 0 , 0 ,
+ 2 , 252 , 0 , 0 ,
+ 2 , 255 , 0 , 0
+};
+
+const unsigned char HT600x6004level895_open[1024]=
+{
+ 0 , 0 , 0 , 0 ,
+ 0 , 0 , 0 , 0 ,
+ 0 , 3 , 0 , 0 ,
+ 0 , 3 , 0 , 0 ,
+ 0 , 4 , 0 , 0 ,
+ 0 , 4 , 0 , 0 ,
+ 0 , 4 , 0 , 0 ,
+ 0 , 4 , 0 , 0 ,
+ 0 , 6 , 0 , 0 ,
+ 0 , 6 , 0 , 0 ,
+ 0 , 7 , 0 , 0 ,
+ 0 , 7 , 0 , 0 ,
+ 0 , 9 , 0 , 0 ,
+ 0 , 9 , 0 , 0 ,
+ 0 , 11 , 0 , 0 ,
+ 0 , 11 , 0 , 0 ,
+ 0 , 12 , 0 , 0 ,
+ 0 , 12 , 0 , 0 ,
+ 0 , 14 , 0 , 0 ,
+ 0 , 14 , 0 , 0 ,
+ 0 , 15 , 0 , 0 ,
+ 0 , 15 , 0 , 0 ,
+ 0 , 17 , 0 , 0 ,
+ 0 , 17 , 0 , 0 ,
+ 0 , 19 , 0 , 0 ,
+ 0 , 19 , 0 , 0 ,
+ 0 , 20 , 0 , 0 ,
+ 0 , 20 , 0 , 0 ,
+ 0 , 22 , 0 , 0 ,
+ 0 , 22 , 0 , 0 ,
+ 0 , 23 , 0 , 0 ,
+ 0 , 23 , 0 , 0 ,
+ 0 , 25 , 0 , 0 ,
+ 0 , 25 , 0 , 0 ,
+ 0 , 27 , 0 , 0 ,
+ 0 , 27 , 0 , 0 ,
+ 0 , 28 , 0 , 0 ,
+ 0 , 28 , 0 , 0 ,
+ 0 , 30 , 0 , 0 ,
+ 0 , 30 , 0 , 0 ,
+ 0 , 31 , 0 , 0 ,
+ 0 , 31 , 0 , 0 ,
+ 0 , 33 , 0 , 0 ,
+ 0 , 33 , 0 , 0 ,
+ 0 , 35 , 0 , 0 ,
+ 0 , 35 , 0 , 0 ,
+ 0 , 36 , 0 , 0 ,
+ 0 , 36 , 0 , 0 ,
+ 0 , 38 , 0 , 0 ,
+ 0 , 38 , 0 , 0 ,
+ 0 , 39 , 0 , 0 ,
+ 0 , 39 , 0 , 0 ,
+ 0 , 41 , 0 , 0 ,
+ 0 , 41 , 0 , 0 ,
+ 0 , 43 , 0 , 0 ,
+ 0 , 44 , 0 , 0 ,
+ 0 , 46 , 0 , 0 ,
+ 0 , 47 , 0 , 0 ,
+ 0 , 49 , 0 , 0 ,
+ 0 , 51 , 0 , 0 ,
+ 0 , 52 , 0 , 0 ,
+ 0 , 54 , 0 , 0 ,
+ 0 , 55 , 0 , 0 ,
+ 0 , 57 , 0 , 0 ,
+ 0 , 58 , 0 , 0 ,
+ 0 , 60 , 0 , 0 ,
+ 0 , 62 , 0 , 0 ,
+ 0 , 63 , 0 , 0 ,
+ 0 , 65 , 0 , 0 ,
+ 0 , 66 , 0 , 0 ,
+ 0 , 68 , 0 , 0 ,
+ 0 , 70 , 0 , 0 ,
+ 0 , 71 , 0 , 0 ,
+ 0 , 73 , 0 , 0 ,
+ 0 , 74 , 0 , 0 ,
+ 0 , 78 , 0 , 0 ,
+ 0 , 79 , 0 , 0 ,
+ 0 , 82 , 0 , 0 ,
+ 0 , 84 , 0 , 0 ,
+ 0 , 86 , 0 , 0 ,
+ 0 , 89 , 0 , 0 ,
+ 0 , 90 , 0 , 0 ,
+ 0 , 92 , 0 , 0 ,
+ 0 , 95 , 0 , 0 ,
+ 0 , 97 , 0 , 0 ,
+ 0 , 98 , 0 , 0 ,
+ 0 , 102 , 0 , 0 ,
+ 0 , 103 , 0 , 0 ,
+ 0 , 105 , 0 , 0 ,
+ 0 , 108 , 0 , 0 ,
+ 0 , 109 , 0 , 0 ,
+ 0 , 111 , 0 , 0 ,
+ 0 , 114 , 0 , 0 ,
+ 0 , 116 , 0 , 0 ,
+ 0 , 117 , 0 , 0 ,
+ 0 , 121 , 0 , 0 ,
+ 0 , 122 , 0 , 0 ,
+ 0 , 124 , 0 , 0 ,
+ 0 , 127 , 0 , 0 ,
+ 0 , 129 , 0 , 0 ,
+ 0 , 130 , 0 , 0 ,
+ 0 , 133 , 0 , 0 ,
+ 0 , 135 , 0 , 0 ,
+ 0 , 137 , 0 , 0 ,
+ 0 , 140 , 0 , 0 ,
+ 0 , 141 , 0 , 0 ,
+ 0 , 143 , 0 , 0 ,
+ 0 , 146 , 0 , 0 ,
+ 0 , 148 , 0 , 0 ,
+ 0 , 149 , 0 , 0 ,
+ 0 , 153 , 0 , 0 ,
+ 0 , 154 , 0 , 0 ,
+ 0 , 156 , 0 , 0 ,
+ 0 , 159 , 0 , 0 ,
+ 0 , 160 , 0 , 0 ,
+ 0 , 162 , 0 , 0 ,
+ 0 , 165 , 0 , 0 ,
+ 0 , 167 , 0 , 0 ,
+ 0 , 168 , 0 , 0 ,
+ 0 , 172 , 0 , 0 ,
+ 0 , 173 , 0 , 0 ,
+ 0 , 175 , 0 , 0 ,
+ 0 , 178 , 0 , 0 ,
+ 0 , 180 , 0 , 0 ,
+ 0 , 181 , 0 , 0 ,
+ 0 , 184 , 0 , 0 ,
+ 0 , 186 , 0 , 0 ,
+ 0 , 188 , 0 , 0 ,
+ 0 , 191 , 0 , 0 ,
+ 0 , 192 , 0 , 0 ,
+ 0 , 194 , 0 , 0 ,
+ 0 , 197 , 0 , 0 ,
+ 0 , 199 , 0 , 0 ,
+ 0 , 200 , 0 , 0 ,
+ 0 , 204 , 0 , 0 ,
+ 0 , 205 , 0 , 0 ,
+ 0 , 207 , 0 , 0 ,
+ 0 , 210 , 0 , 0 ,
+ 0 , 211 , 0 , 0 ,
+ 0 , 213 , 0 , 0 ,
+ 0 , 216 , 0 , 0 ,
+ 0 , 218 , 0 , 0 ,
+ 0 , 219 , 0 , 0 ,
+ 0 , 223 , 0 , 0 ,
+ 0 , 224 , 0 , 0 ,
+ 0 , 226 , 0 , 0 ,
+ 0 , 229 , 0 , 0 ,
+ 0 , 231 , 0 , 0 ,
+ 0 , 232 , 0 , 0 ,
+ 0 , 235 , 0 , 0 ,
+ 0 , 237 , 0 , 0 ,
+ 0 , 239 , 0 , 0 ,
+ 0 , 242 , 0 , 0 ,
+ 0 , 243 , 0 , 0 ,
+ 0 , 245 , 0 , 0 ,
+ 0 , 248 , 0 , 0 ,
+ 0 , 250 , 0 , 0 ,
+ 0 , 251 , 0 , 0 ,
+ 0 , 253 , 0 , 0 ,
+ 0 , 255 , 0 , 0 ,
+ 1 , 0 , 0 , 0 ,
+ 1 , 3 , 0 , 0 ,
+ 1 , 6 , 0 , 0 ,
+ 1 , 9 , 0 , 0 ,
+ 1 , 12 , 0 , 0 ,
+ 1 , 15 , 0 , 0 ,
+ 1 , 19 , 0 , 0 ,
+ 1 , 22 , 0 , 0 ,
+ 1 , 25 , 0 , 0 ,
+ 1 , 28 , 0 , 0 ,
+ 1 , 31 , 0 , 0 ,
+ 1 , 35 , 0 , 0 ,
+ 1 , 38 , 0 , 0 ,
+ 1 , 41 , 0 , 0 ,
+ 1 , 44 , 0 , 0 ,
+ 1 , 47 , 0 , 0 ,
+ 1 , 51 , 0 , 0 ,
+ 1 , 54 , 0 , 0 ,
+ 1 , 57 , 0 , 0 ,
+ 1 , 60 , 0 , 0 ,
+ 1 , 63 , 0 , 0 ,
+ 1 , 66 , 0 , 0 ,
+ 1 , 70 , 0 , 0 ,
+ 1 , 73 , 0 , 0 ,
+ 1 , 76 , 0 , 0 ,
+ 1 , 79 , 0 , 0 ,
+ 1 , 82 , 0 , 0 ,
+ 1 , 86 , 0 , 0 ,
+ 1 , 89 , 0 , 0 ,
+ 1 , 92 , 0 , 0 ,
+ 1 , 95 , 0 , 0 ,
+ 1 , 98 , 0 , 0 ,
+ 1 , 102 , 0 , 0 ,
+ 1 , 105 , 0 , 0 ,
+ 1 , 108 , 0 , 0 ,
+ 1 , 111 , 0 , 0 ,
+ 1 , 114 , 0 , 0 ,
+ 1 , 117 , 0 , 0 ,
+ 1 , 121 , 0 , 0 ,
+ 1 , 124 , 0 , 0 ,
+ 1 , 127 , 0 , 0 ,
+ 1 , 130 , 0 , 0 ,
+ 1 , 133 , 0 , 0 ,
+ 1 , 137 , 0 , 0 ,
+ 1 , 140 , 0 , 0 ,
+ 1 , 143 , 0 , 0 ,
+ 1 , 146 , 0 , 0 ,
+ 1 , 149 , 0 , 0 ,
+ 1 , 153 , 0 , 0 ,
+ 1 , 156 , 0 , 0 ,
+ 1 , 159 , 0 , 0 ,
+ 1 , 162 , 0 , 0 ,
+ 1 , 165 , 0 , 0 ,
+ 1 , 168 , 0 , 0 ,
+ 1 , 172 , 0 , 0 ,
+ 1 , 175 , 0 , 0 ,
+ 1 , 178 , 0 , 0 ,
+ 1 , 181 , 0 , 0 ,
+ 1 , 184 , 0 , 0 ,
+ 1 , 188 , 0 , 0 ,
+ 1 , 191 , 0 , 0 ,
+ 1 , 194 , 0 , 0 ,
+ 1 , 197 , 0 , 0 ,
+ 1 , 200 , 0 , 0 ,
+ 1 , 204 , 0 , 0 ,
+ 1 , 207 , 0 , 0 ,
+ 1 , 210 , 0 , 0 ,
+ 1 , 213 , 0 , 0 ,
+ 1 , 216 , 0 , 0 ,
+ 1 , 219 , 0 , 0 ,
+ 1 , 223 , 0 , 0 ,
+ 1 , 226 , 0 , 0 ,
+ 1 , 229 , 0 , 0 ,
+ 1 , 232 , 0 , 0 ,
+ 1 , 235 , 0 , 0 ,
+ 1 , 239 , 0 , 0 ,
+ 1 , 242 , 0 , 0 ,
+ 1 , 245 , 0 , 0 ,
+ 1 , 248 , 0 , 0 ,
+ 1 , 251 , 0 , 0 ,
+ 2 , 0 , 0 , 0 ,
+ 2 , 15 , 0 , 0 ,
+ 2 , 31 , 0 , 0 ,
+ 2 , 47 , 0 , 0 ,
+ 2 , 63 , 0 , 0 ,
+ 2 , 79 , 0 , 0 ,
+ 2 , 95 , 0 , 0 ,
+ 2 , 111 , 0 , 0 ,
+ 2 , 127 , 0 , 0 ,
+ 2 , 143 , 0 , 0 ,
+ 2 , 159 , 0 , 0 ,
+ 2 , 175 , 0 , 0 ,
+ 2 , 191 , 0 , 0 ,
+ 2 , 207 , 0 , 0 ,
+ 2 , 223 , 0 , 0 ,
+ 2 , 239 , 0 , 0
+};
+
+const unsigned char HT300x3004level970_open[1024]=
+
+{
+ 0 , 0 , 255 , 0 ,
+ 0 , 0 , 255 , 0 ,
+ 0 , 6 , 255 , 6 ,
+ 0 , 9 , 255 , 9 ,
+ 0 , 12 , 255 , 12 ,
+ 0 , 15 , 255 , 15 ,
+ 0 , 18 , 255 , 18 ,
+ 0 , 21 , 255 , 21 ,
+ 0 , 24 , 255 , 24 ,
+ 0 , 27 , 255 , 27 ,
+ 0 , 30 , 255 , 30 ,
+ 0 , 33 , 255 , 33 ,
+ 0 , 36 , 255 , 36 ,
+ 0 , 39 , 255 , 39 ,
+ 0 , 42 , 255 , 42 ,
+ 0 , 45 , 255 , 45 ,
+ 0 , 48 , 255 , 48 ,
+ 0 , 51 , 255 , 51 ,
+ 0 , 54 , 255 , 54 ,
+ 0 , 57 , 255 , 57 ,
+ 0 , 60 , 255 , 60 ,
+ 0 , 63 , 255 , 63 ,
+ 0 , 66 , 255 , 66 ,
+ 0 , 69 , 255 , 69 ,
+ 0 , 72 , 255 , 72 ,
+ 0 , 75 , 255 , 75 ,
+ 0 , 78 , 255 , 78 ,
+ 0 , 81 , 255 , 81 ,
+ 0 , 84 , 255 , 84 ,
+ 0 , 87 , 255 , 87 ,
+ 0 , 90 , 255 , 90 ,
+ 0 , 93 , 255 , 93 ,
+ 0 , 96 , 255 , 96 ,
+ 0 , 99 , 255 , 99 ,
+ 0 , 102 , 255 , 102 ,
+ 0 , 105 , 255 , 105 ,
+ 0 , 108 , 255 , 108 ,
+ 0 , 111 , 255 , 111 ,
+ 0 , 114 , 255 , 114 ,
+ 0 , 117 , 255 , 117 ,
+ 0 , 120 , 255 , 120 ,
+ 0 , 123 , 255 , 123 ,
+ 0 , 126 , 255 , 126 ,
+ 0 , 129 , 255 , 129 ,
+ 0 , 132 , 255 , 132 ,
+ 0 , 135 , 255 , 135 ,
+ 0 , 138 , 255 , 138 ,
+ 0 , 141 , 255 , 141 ,
+ 0 , 144 , 255 , 144 ,
+ 0 , 147 , 255 , 147 ,
+ 0 , 150 , 255 , 150 ,
+ 0 , 153 , 255 , 153 ,
+ 0 , 156 , 255 , 156 ,
+ 0 , 159 , 255 , 159 ,
+ 0 , 162 , 255 , 162 ,
+ 0 , 165 , 255 , 165 ,
+ 0 , 168 , 255 , 168 ,
+ 0 , 171 , 255 , 171 ,
+ 0 , 174 , 255 , 174 ,
+ 0 , 177 , 255 , 177 ,
+ 0 , 180 , 255 , 180 ,
+ 0 , 183 , 255 , 183 ,
+ 0 , 186 , 255 , 186 ,
+ 0 , 189 , 255 , 189 ,
+ 0 , 192 , 255 , 192 ,
+ 0 , 195 , 255 , 195 ,
+ 0 , 198 , 255 , 198 ,
+ 0 , 201 , 255 , 201 ,
+ 0 , 204 , 255 , 204 ,
+ 0 , 207 , 255 , 207 ,
+ 0 , 210 , 255 , 210 ,
+ 0 , 213 , 255 , 213 ,
+ 0 , 216 , 255 , 216 ,
+ 0 , 219 , 255 , 219 ,
+ 0 , 222 , 255 , 222 ,
+ 0 , 225 , 255 , 225 ,
+ 0 , 228 , 255 , 228 ,
+ 0 , 231 , 255 , 231 ,
+ 0 , 234 , 255 , 234 ,
+ 0 , 237 , 255 , 237 ,
+ 0 , 240 , 255 , 240 ,
+ 0 , 243 , 255 , 243 ,
+ 0 , 246 , 255 , 246 ,
+ 0 , 249 , 255 , 249 ,
+ 0 , 252 , 255 , 252 ,
+ 1 , 0 , 255 , 0 ,
+ 1 , 3 , 255 , 3 ,
+ 1 , 6 , 255 , 6 ,
+ 1 , 9 , 255 , 9 ,
+ 1 , 12 , 255 , 12 ,
+ 1 , 15 , 255 , 15 ,
+ 1 , 18 , 255 , 18 ,
+ 1 , 21 , 255 , 21 ,
+ 1 , 24 , 255 , 24 ,
+ 1 , 27 , 255 , 27 ,
+ 1 , 30 , 255 , 30 ,
+ 1 , 33 , 255 , 33 ,
+ 1 , 36 , 255 , 36 ,
+ 1 , 39 , 255 , 39 ,
+ 1 , 42 , 255 , 42 ,
+ 1 , 45 , 255 , 45 ,
+ 1 , 48 , 255 , 48 ,
+ 1 , 51 , 255 , 51 ,
+ 1 , 54 , 255 , 54 ,
+ 1 , 57 , 255 , 57 ,
+ 1 , 60 , 255 , 60 ,
+ 1 , 63 , 255 , 63 ,
+ 1 , 66 , 255 , 66 ,
+ 1 , 69 , 255 , 69 ,
+ 1 , 72 , 255 , 72 ,
+ 1 , 75 , 255 , 75 ,
+ 1 , 78 , 255 , 78 ,
+ 1 , 81 , 255 , 81 ,
+ 1 , 84 , 255 , 84 ,
+ 1 , 87 , 255 , 87 ,
+ 1 , 90 , 255 , 90 ,
+ 1 , 93 , 255 , 93 ,
+ 1 , 96 , 255 , 96 ,
+ 1 , 99 , 255 , 99 ,
+ 1 , 102 , 255 , 102 ,
+ 1 , 105 , 255 , 105 ,
+ 1 , 108 , 255 , 108 ,
+ 1 , 111 , 255 , 111 ,
+ 1 , 114 , 255 , 114 ,
+ 1 , 117 , 255 , 117 ,
+ 1 , 120 , 255 , 120 ,
+ 1 , 123 , 255 , 123 ,
+ 1 , 126 , 255 , 126 ,
+ 1 , 129 , 255 , 129 ,
+ 1 , 132 , 255 , 132 ,
+ 1 , 135 , 255 , 135 ,
+ 1 , 138 , 255 , 138 ,
+ 1 , 141 , 255 , 141 ,
+ 1 , 144 , 255 , 144 ,
+ 1 , 147 , 255 , 147 ,
+ 1 , 150 , 255 , 150 ,
+ 1 , 153 , 255 , 153 ,
+ 1 , 156 , 255 , 156 ,
+ 1 , 159 , 255 , 159 ,
+ 1 , 162 , 255 , 162 ,
+ 1 , 165 , 255 , 165 ,
+ 1 , 168 , 255 , 168 ,
+ 1 , 171 , 255 , 171 ,
+ 1 , 174 , 255 , 174 ,
+ 1 , 177 , 255 , 177 ,
+ 1 , 180 , 255 , 180 ,
+ 1 , 183 , 255 , 183 ,
+ 1 , 186 , 255 , 186 ,
+ 1 , 189 , 255 , 189 ,
+ 1 , 192 , 255 , 192 ,
+ 1 , 195 , 255 , 195 ,
+ 1 , 198 , 255 , 198 ,
+ 1 , 201 , 255 , 201 ,
+ 1 , 204 , 255 , 204 ,
+ 1 , 207 , 255 , 207 ,
+ 1 , 210 , 255 , 210 ,
+ 1 , 213 , 255 , 213 ,
+ 1 , 216 , 255 , 216 ,
+ 1 , 219 , 255 , 219 ,
+ 1 , 222 , 255 , 222 ,
+ 1 , 225 , 255 , 225 ,
+ 1 , 228 , 255 , 228 ,
+ 1 , 231 , 255 , 231 ,
+ 1 , 234 , 255 , 234 ,
+ 1 , 237 , 255 , 237 ,
+ 1 , 240 , 255 , 240 ,
+ 1 , 243 , 255 , 243 ,
+ 1 , 246 , 255 , 246 ,
+ 1 , 249 , 255 , 249 ,
+ 1 , 252 , 255 , 252 ,
+ 2 , 0 , 255 , 0 ,
+ 2 , 3 , 255 , 3 ,
+ 2 , 6 , 255 , 6 ,
+ 2 , 9 , 255 , 9 ,
+ 2 , 12 , 255 , 12 ,
+ 2 , 15 , 255 , 15 ,
+ 2 , 18 , 255 , 18 ,
+ 2 , 21 , 255 , 21 ,
+ 2 , 24 , 255 , 24 ,
+ 2 , 27 , 255 , 27 ,
+ 2 , 30 , 255 , 30 ,
+ 2 , 33 , 255 , 33 ,
+ 2 , 36 , 255 , 36 ,
+ 2 , 39 , 255 , 39 ,
+ 2 , 42 , 255 , 42 ,
+ 2 , 45 , 255 , 45 ,
+ 2 , 48 , 255 , 48 ,
+ 2 , 51 , 255 , 51 ,
+ 2 , 54 , 255 , 54 ,
+ 2 , 57 , 255 , 57 ,
+ 2 , 60 , 255 , 60 ,
+ 2 , 63 , 255 , 63 ,
+ 2 , 66 , 255 , 66 ,
+ 2 , 69 , 255 , 69 ,
+ 2 , 72 , 255 , 72 ,
+ 2 , 75 , 255 , 75 ,
+ 2 , 78 , 255 , 78 ,
+ 2 , 81 , 255 , 81 ,
+ 2 , 84 , 255 , 84 ,
+ 2 , 87 , 255 , 87 ,
+ 2 , 90 , 255 , 90 ,
+ 2 , 93 , 255 , 93 ,
+ 2 , 96 , 255 , 96 ,
+ 2 , 99 , 255 , 99 ,
+ 2 , 102 , 255 , 102 ,
+ 2 , 105 , 255 , 105 ,
+ 2 , 108 , 255 , 108 ,
+ 2 , 111 , 255 , 111 ,
+ 2 , 114 , 255 , 114 ,
+ 2 , 117 , 255 , 117 ,
+ 2 , 120 , 255 , 120 ,
+ 2 , 123 , 255 , 123 ,
+ 2 , 126 , 255 , 126 ,
+ 2 , 129 , 255 , 129 ,
+ 2 , 132 , 255 , 132 ,
+ 2 , 135 , 255 , 135 ,
+ 2 , 138 , 255 , 138 ,
+ 2 , 141 , 255 , 141 ,
+ 2 , 144 , 255 , 144 ,
+ 2 , 147 , 255 , 147 ,
+ 2 , 150 , 255 , 150 ,
+ 2 , 153 , 255 , 153 ,
+ 2 , 156 , 255 , 156 ,
+ 2 , 159 , 255 , 159 ,
+ 2 , 162 , 255 , 162 ,
+ 2 , 165 , 255 , 165 ,
+ 2 , 168 , 255 , 168 ,
+ 2 , 171 , 255 , 171 ,
+ 2 , 174 , 255 , 174 ,
+ 2 , 177 , 255 , 177 ,
+ 2 , 180 , 255 , 180 ,
+ 2 , 183 , 255 , 183 ,
+ 2 , 186 , 255 , 186 ,
+ 2 , 189 , 255 , 189 ,
+ 2 , 192 , 255 , 192 ,
+ 2 , 195 , 255 , 195 ,
+ 2 , 198 , 255 , 198 ,
+ 2 , 201 , 255 , 201 ,
+ 2 , 204 , 255 , 204 ,
+ 2 , 207 , 255 , 207 ,
+ 2 , 210 , 255 , 210 ,
+ 2 , 213 , 255 , 213 ,
+ 2 , 216 , 255 , 216 ,
+ 2 , 219 , 255 , 219 ,
+ 2 , 222 , 255 , 222 ,
+ 2 , 225 , 255 , 225 ,
+ 2 , 228 , 255 , 228 ,
+ 2 , 231 , 255 , 231 ,
+ 2 , 234 , 255 , 234 ,
+ 2 , 237 , 255 , 237 ,
+ 2 , 240 , 255 , 240 ,
+ 2 , 243 , 255 , 243 ,
+ 2 , 246 , 255 , 246 ,
+ 2 , 249 , 255 , 249 ,
+ 2 , 252 , 255 , 252 ,
+ 2 , 252 , 255 , 252
+};
+
+const unsigned char HT600x6004level970_open[1024]=
+
+{
+0, 0, 255, 0,
+0, 1, 255, 0,
+0, 3, 255, 0,
+0, 5, 255, 0,
+0, 7, 255, 0,
+0, 9, 255, 0,
+0, 11, 255, 0,
+0, 13, 255, 0,
+0, 15, 255, 0,
+0, 17, 255, 0,
+0, 19, 255, 0,
+0, 21, 255, 0,
+0, 23, 255, 0,
+0, 25, 255, 0,
+0, 27, 255, 0,
+0, 29, 255, 0,
+0, 31, 255, 0,
+0, 33, 255, 0,
+0, 35, 255, 0,
+0, 37, 255, 0,
+0, 39, 255, 0,
+0, 41, 255, 0,
+0, 43, 255, 0,
+0, 45, 255, 0,
+0, 47, 255, 0,
+0, 49, 255, 0,
+0, 51, 255, 0,
+0, 53, 255, 0,
+0, 55, 255, 0,
+0, 57, 255, 0,
+0, 59, 255, 0,
+0, 61, 255, 0,
+0, 63, 255, 0,
+0, 65, 255, 0,
+0, 67, 255, 0,
+0, 69, 255, 0,
+0, 71, 255, 0,
+0, 73, 255, 0,
+0, 75, 255, 0,
+0, 77, 255, 0,
+0, 79, 255, 0,
+0, 81, 255, 0,
+0, 83, 255, 0,
+0, 85, 255, 0,
+0, 87, 255, 0,
+0, 89, 255, 0,
+0, 91, 255, 0,
+0, 93, 255, 0,
+0, 95, 255, 0,
+0, 97, 255, 0,
+0, 99, 255, 0,
+0, 101, 255, 0,
+0, 103, 255, 0,
+0, 105, 255, 0,
+0, 107, 255, 0,
+0, 109, 255, 0,
+0, 111, 255, 0,
+0, 113, 255, 0,
+0, 115, 255, 0,
+0, 117, 255, 0,
+0, 119, 255, 0,
+0, 121, 255, 0,
+0, 123, 255, 0,
+0, 125, 255, 0,
+0, 127, 255, 0,
+0, 129, 255, 0,
+0, 131, 255, 0,
+0, 133, 255, 0,
+0, 135, 255, 0,
+0, 137, 255, 0,
+0, 139, 255, 0,
+0, 141, 255, 0,
+0, 143, 255, 0,
+0, 145, 255, 0,
+0, 147, 255, 0,
+0, 149, 255, 0,
+0, 151, 255, 0,
+0, 153, 255, 0,
+0, 155, 255, 0,
+0, 157, 255, 0,
+0, 159, 255, 0,
+0, 161, 255, 0,
+0, 163, 255, 0,
+0, 165, 255, 0,
+0, 167, 255, 0,
+0, 169, 255, 0,
+0, 171, 255, 0,
+0, 173, 255, 0,
+0, 175, 255, 0,
+0, 177, 255, 0,
+0, 179, 255, 0,
+0, 181, 255, 0,
+0, 183, 255, 0,
+0, 185, 255, 0,
+0, 187, 255, 0,
+0, 189, 255, 0,
+0, 191, 255, 0,
+0, 193, 255, 0,
+0, 195, 255, 0,
+0, 197, 255, 0,
+0, 199, 255, 0,
+0, 201, 255, 0,
+0, 203, 255, 0,
+0, 205, 255, 0,
+0, 207, 255, 0,
+0, 209, 255, 0,
+0, 211, 255, 0,
+0, 213, 255, 0,
+0, 215, 255, 0,
+0, 217, 255, 0,
+0, 219, 255, 0,
+0, 221, 255, 0,
+0, 223, 255, 0,
+0, 225, 255, 0,
+0, 227, 255, 0,
+0, 229, 255, 0,
+0, 231, 255, 0,
+0, 233, 255, 0,
+0, 235, 255, 0,
+0, 237, 255, 0,
+0, 239, 255, 0,
+0, 241, 255, 0,
+0, 243, 255, 0,
+0, 245, 255, 0,
+0, 247, 255, 0,
+0, 249, 255, 0,
+0, 251, 255, 0,
+0, 253, 255, 0,
+0, 255, 255, 0,
+1, 3, 255, 0,
+1, 7, 255, 0,
+1, 11, 255, 0,
+1, 15, 255, 0,
+1, 19, 255, 0,
+1, 23, 255, 0,
+1, 27, 255, 0,
+1, 31, 255, 0,
+1, 35, 255, 0,
+1, 39, 255, 0,
+1, 43, 255, 0,
+1, 47, 255, 0,
+1, 51, 255, 0,
+1, 55, 255, 0,
+1, 59, 255, 0,
+1, 63, 255, 0,
+1, 67, 255, 0,
+1, 71, 255, 0,
+1, 75, 255, 0,
+1, 79, 255, 0,
+1, 83, 255, 0,
+1, 87, 255, 0,
+1, 91, 255, 0,
+1, 95, 255, 0,
+1, 99, 255, 0,
+1, 103, 255, 0,
+1, 107, 255, 0,
+1, 111, 255, 0,
+1, 115, 255, 0,
+1, 119, 255, 0,
+1, 123, 255, 0,
+1, 127, 255, 0,
+1, 131, 255, 0,
+1, 135, 255, 0,
+1, 139, 255, 0,
+1, 143, 255, 0,
+1, 147, 255, 0,
+1, 151, 255, 0,
+1, 155, 255, 0,
+1, 159, 255, 0,
+1, 163, 255, 0,
+1, 167, 255, 0,
+1, 171, 255, 0,
+1, 175, 255, 0,
+1, 179, 255, 0,
+1, 183, 255, 0,
+1, 187, 255, 0,
+1, 191, 255, 0,
+1, 195, 255, 0,
+1, 199, 255, 0,
+1, 203, 255, 0,
+1, 207, 255, 0,
+1, 211, 255, 0,
+1, 215, 255, 0,
+1, 219, 255, 0,
+1, 223, 255, 0,
+1, 227, 255, 0,
+1, 231, 255, 0,
+1, 235, 255, 0,
+1, 239, 255, 0,
+1, 243, 255, 0,
+1, 247, 255, 0,
+1, 251, 255, 0,
+1, 255, 255, 0,
+2, 4, 255, 0,
+2, 8, 255, 0,
+2, 12, 255, 0,
+2, 16, 255, 0,
+2, 20, 255, 0,
+2, 24, 255, 0,
+2, 28, 255, 0,
+2, 32, 255, 0,
+2, 36, 255, 0,
+2, 40, 255, 0,
+2, 44, 255, 0,
+2, 48, 255, 0,
+2, 52, 255, 0,
+2, 56, 255, 0,
+2, 60, 255, 0,
+2, 64, 255, 0,
+2, 68, 255, 0,
+2, 72, 255, 0,
+2, 76, 255, 0,
+2, 80, 255, 0,
+2, 85, 255, 0,
+2, 89, 255, 0,
+2, 93, 255, 0,
+2, 97, 255, 0,
+2, 101, 255, 0,
+2, 105, 255, 0,
+2, 109, 255, 0,
+2, 113, 255, 0,
+2, 117, 255, 0,
+2, 121, 255, 0,
+2, 125, 255, 0,
+2, 129, 255, 0,
+2, 133, 255, 0,
+2, 137, 255, 0,
+2, 141, 255, 0,
+2, 145, 255, 0,
+2, 149, 255, 0,
+2, 153, 255, 0,
+2, 157, 255, 0,
+2, 161, 255, 0,
+2, 165, 255, 0,
+2, 170, 255, 0,
+2, 174, 255, 0,
+2, 178, 255, 0,
+2, 182, 255, 0,
+2, 186, 255, 0,
+2, 190, 255, 0,
+2, 194, 255, 0,
+2, 198, 255, 0,
+2, 202, 255, 0,
+2, 206, 255, 0,
+2, 210, 255, 0,
+2, 214, 255, 0,
+2, 218, 255, 0,
+2, 222, 255, 0,
+2, 226, 255, 0,
+2, 230, 255, 0,
+2, 234, 255, 0,
+2, 238, 255, 0,
+2, 242, 255, 0,
+2, 246, 255, 0,
+2, 250, 255, 0,
+2, 255, 255, 0
+};
+
+const unsigned char HT600x6004level3600_open[1024]=
+ {
+ 0, 0, 255, 0,
+ 0, 1, 255, 1,
+ 0, 2, 255, 2,
+ 0, 3, 255, 4,
+ 0, 5, 255, 5,
+ 0, 6, 255, 6,
+ 0, 7, 255, 8,
+ 0, 9, 255, 9,
+ 0, 10, 255, 10,
+ 0, 11, 255, 12,
+ 0, 13, 255, 13,
+ 0, 14, 255, 14,
+ 0, 15, 255, 16,
+ 0, 17, 255, 17,
+ 0, 18, 255, 18,
+ 0, 19, 255, 20,
+ 0, 21, 255, 21,
+ 0, 22, 255, 22,
+ 0, 23, 255, 24,
+ 0, 25, 255, 25,
+ 0, 26, 255, 26,
+ 0, 27, 255, 28,
+ 0, 29, 255, 29,
+ 0, 30, 255, 30,
+ 0, 31, 255, 32,
+ 0, 33, 255, 33,
+ 0, 34, 255, 34,
+ 0, 35, 255, 36,
+ 0, 37, 255, 37,
+ 0, 38, 255, 38,
+ 0, 39, 255, 40,
+ 0, 41, 255, 41,
+ 0, 42, 255, 42,
+ 0, 43, 255, 44,
+ 0, 45, 255, 45,
+ 0, 46, 255, 46,
+ 0, 47, 255, 48,
+ 0, 49, 255, 49,
+ 0, 50, 255, 50,
+ 0, 51, 255, 52,
+ 0, 53, 255, 53,
+ 0, 54, 255, 54,
+ 0, 55, 255, 56,
+ 0, 57, 255, 57,
+ 0, 58, 255, 58,
+ 0, 59, 255, 60,
+ 0, 61, 255, 61,
+ 0, 62, 255, 62,
+ 0, 63, 255, 64,
+ 0, 65, 255, 65,
+ 0, 66, 255, 66,
+ 0, 67, 255, 68,
+ 0, 69, 255, 69,
+ 0, 70, 255, 70,
+ 0, 71, 255, 72,
+ 0, 73, 255, 73,
+ 0, 74, 255, 74,
+ 0, 75, 255, 76,
+ 0, 77, 255, 77,
+ 0, 78, 255, 78,
+ 0, 79, 255, 80,
+ 0, 81, 255, 81,
+ 0, 82, 255, 82,
+ 0, 83, 255, 84,
+ 0, 85, 255, 85,
+ 0, 86, 255, 86,
+ 0, 87, 255, 87,
+ 0, 88, 255, 89,
+ 0, 90, 255, 90,
+ 0, 91, 255, 91,
+ 0, 92, 255, 93,
+ 0, 94, 255, 94,
+ 0, 95, 255, 95,
+ 0, 96, 255, 97,
+ 0, 98, 255, 98,
+ 0, 99, 255, 99,
+ 0, 100, 255, 101,
+ 0, 102, 255, 102,
+ 0, 103, 255, 103,
+ 0, 104, 255, 105,
+ 0, 106, 255, 106,
+ 0, 107, 255, 107,
+ 0, 108, 255, 109,
+ 0, 110, 255, 110,
+ 0, 111, 255, 111,
+ 0, 112, 255, 113,
+ 0, 114, 255, 114,
+ 0, 115, 255, 115,
+ 0, 116, 255, 117,
+ 0, 118, 255, 118,
+ 0, 119, 255, 119,
+ 0, 120, 255, 121,
+ 0, 122, 255, 122,
+ 0, 123, 255, 123,
+ 0, 124, 255, 125,
+ 0, 126, 255, 126,
+ 0, 127, 255, 127,
+ 0, 128, 255, 129,
+ 0, 130, 255, 130,
+ 0, 131, 255, 131,
+ 0, 132, 255, 133,
+ 0, 134, 255, 134,
+ 0, 135, 255, 135,
+ 0, 136, 255, 137,
+ 0, 138, 255, 138,
+ 0, 139, 255, 139,
+ 0, 140, 255, 141,
+ 0, 142, 255, 142,
+ 0, 143, 255, 143,
+ 0, 144, 255, 145,
+ 0, 146, 255, 146,
+ 0, 147, 255, 147,
+ 0, 148, 255, 149,
+ 0, 150, 255, 150,
+ 0, 151, 255, 151,
+ 0, 152, 255, 153,
+ 0, 154, 255, 154,
+ 0, 155, 255, 155,
+ 0, 156, 255, 157,
+ 0, 158, 255, 158,
+ 0, 159, 255, 159,
+ 0, 160, 255, 161,
+ 0, 162, 255, 162,
+ 0, 163, 255, 163,
+ 0, 164, 255, 165,
+ 0, 166, 255, 166,
+ 0, 167, 255, 167,
+ 0, 168, 255, 169,
+ 0, 170, 255, 170,
+ 0, 171, 255, 171,
+ 0, 172, 255, 172,
+ 0, 173, 255, 174,
+ 0, 175, 255, 175,
+ 0, 176, 255, 176,
+ 0, 177, 255, 178,
+ 0, 179, 255, 179,
+ 0, 180, 255, 180,
+ 0, 181, 255, 182,
+ 0, 183, 255, 183,
+ 0, 184, 255, 184,
+ 0, 185, 255, 186,
+ 0, 187, 255, 187,
+ 0, 188, 255, 188,
+ 0, 189, 255, 190,
+ 0, 191, 255, 191,
+ 0, 192, 255, 192,
+ 0, 193, 255, 194,
+ 0, 195, 255, 195,
+ 0, 196, 255, 196,
+ 0, 197, 255, 198,
+ 0, 199, 255, 199,
+ 0, 200, 255, 200,
+ 0, 201, 255, 202,
+ 0, 203, 255, 203,
+ 0, 204, 255, 204,
+ 0, 205, 255, 206,
+ 0, 207, 255, 207,
+ 0, 208, 255, 208,
+ 0, 209, 255, 210,
+ 0, 211, 255, 211,
+ 0, 212, 255, 212,
+ 0, 213, 255, 214,
+ 0, 215, 255, 215,
+ 0, 216, 255, 216,
+ 0, 217, 255, 218,
+ 0, 219, 255, 219,
+ 0, 220, 255, 220,
+ 0, 221, 255, 222,
+ 0, 223, 255, 223,
+ 0, 224, 255, 224,
+ 0, 225, 255, 226,
+ 0, 227, 255, 227,
+ 0, 228, 255, 228,
+ 0, 229, 255, 230,
+ 0, 231, 255, 231,
+ 0, 232, 255, 232,
+ 0, 233, 255, 234,
+ 0, 235, 255, 235,
+ 0, 236, 255, 236,
+ 0, 237, 255, 238,
+ 0, 239, 255, 239,
+ 0, 240, 255, 240,
+ 0, 241, 255, 242,
+ 0, 243, 255, 243,
+ 0, 244, 255, 244,
+ 0, 245, 255, 246,
+ 0, 247, 255, 247,
+ 0, 248, 255, 248,
+ 0, 249, 255, 250,
+ 0, 251, 255, 251,
+ 0, 252, 255, 252,
+ 0, 253, 255, 254,
+ 0, 255, 255, 255,
+ 1, 4, 255, 7,
+ 1, 8, 255, 11,
+ 1, 12, 255, 15,
+ 1, 16, 255, 19,
+ 1, 20, 255, 23,
+ 1, 24, 255, 27,
+ 1, 28, 255, 31,
+ 1, 32, 255, 35,
+ 1, 36, 255, 39,
+ 1, 40, 255, 43,
+ 1, 44, 255, 47,
+ 1, 48, 255, 51,
+ 1, 52, 255, 55,
+ 1, 56, 255, 59,
+ 1, 60, 255, 63,
+ 1, 64, 255, 67,
+ 1, 68, 255, 71,
+ 1, 72, 255, 75,
+ 1, 76, 255, 79,
+ 1, 80, 255, 84,
+ 1, 85, 255, 88,
+ 1, 89, 255, 92,
+ 1, 93, 255, 96,
+ 1, 97, 255, 100,
+ 1, 101, 255, 104,
+ 1, 105, 255, 108,
+ 1, 109, 255, 112,
+ 1, 113, 255, 116,
+ 1, 117, 255, 120,
+ 1, 121, 255, 124,
+ 1, 125, 255, 128,
+ 1, 129, 255, 132,
+ 1, 133, 255, 136,
+ 1, 137, 255, 140,
+ 1, 141, 255, 144,
+ 1, 145, 255, 148,
+ 1, 149, 255, 152,
+ 1, 153, 255, 156,
+ 1, 157, 255, 160,
+ 1, 161, 255, 164,
+ 1, 165, 255, 169,
+ 1, 170, 255, 173,
+ 1, 174, 255, 177,
+ 1, 178, 255, 181,
+ 1, 182, 255, 185,
+ 1, 186, 255, 189,
+ 1, 190, 255, 193,
+ 1, 194, 255, 197,
+ 1, 198, 255, 201,
+ 1, 202, 255, 205,
+ 1, 206, 255, 209,
+ 1, 210, 255, 213,
+ 1, 214, 255, 217,
+ 1, 218, 255, 221,
+ 1, 222, 255, 225,
+ 1, 226, 255, 229,
+ 1, 230, 255, 233,
+ 1, 234, 255, 237,
+ 1, 238, 255, 241,
+ 1, 242, 255, 245,
+ 1, 246, 255, 249,
+ 1, 250, 255, 254,
+ 1, 255, 255, 255
+ };
+
+#ifdef APDK_EXTENDED_MEDIASIZE
+
+ // 2001.07.09 mrb: Added for photo glossy mode of DJ970
+ const unsigned char HT1200x1200x1_PhotoPres970_open[1024]=
+ {
+ 0 , 0 , 0 , 0 ,
+ 0 , 0 , 0 , 0 ,
+ 0 , 1 , 0 , 0 ,
+ 0 , 1 , 0 , 0 ,
+ 0 , 2 , 0 , 0 ,
+ 0 , 2 , 0 , 0 ,
+ 0 , 3 , 0 , 0 ,
+ 0 , 3 , 0 , 0 ,
+ 0 , 4 , 0 , 0 ,
+ 0 , 4 , 0 , 0 ,
+ 0 , 5 , 0 , 0 ,
+ 0 , 5 , 0 , 0 ,
+ 0 , 6 , 0 , 0 ,
+ 0 , 6 , 0 , 0 ,
+ 0 , 7 , 0 , 0 ,
+ 0 , 7 , 0 , 0 ,
+ 0 , 8 , 0 , 0 ,
+ 0 , 8 , 0 , 0 ,
+ 0 , 9 , 0 , 0 ,
+ 0 , 9 , 0 , 0 ,
+ 0 , 10 , 0 , 0 ,
+ 0 , 10 , 0 , 0 ,
+ 0 , 11 , 0 , 0 ,
+ 0 , 11 , 0 , 0 ,
+ 0 , 12 , 0 , 0 ,
+ 0 , 12 , 0 , 0 ,
+ 0 , 13 , 0 , 0 ,
+ 0 , 13 , 0 , 0 ,
+ 0 , 14 , 0 , 0 ,
+ 0 , 14 , 0 , 0 ,
+ 0 , 15 , 0 , 0 ,
+ 0 , 15 , 0 , 0 ,
+ 0 , 16 , 0 , 0 ,
+ 0 , 16 , 0 , 0 ,
+ 0 , 17 , 0 , 0 ,
+ 0 , 17 , 0 , 0 ,
+ 0 , 18 , 0 , 0 ,
+ 0 , 18 , 0 , 0 ,
+ 0 , 19 , 0 , 0 ,
+ 0 , 19 , 0 , 0 ,
+ 0 , 20 , 0 , 0 ,
+ 0 , 20 , 0 , 0 ,
+ 0 , 21 , 0 , 0 ,
+ 0 , 21 , 0 , 0 ,
+ 0 , 22 , 0 , 0 ,
+ 0 , 22 , 0 , 0 ,
+ 0 , 23 , 0 , 0 ,
+ 0 , 23 , 0 , 0 ,
+ 0 , 24 , 0 , 0 ,
+ 0 , 24 , 0 , 0 ,
+ 0 , 25 , 0 , 0 ,
+ 0 , 25 , 0 , 0 ,
+ 0 , 26 , 0 , 0 ,
+ 0 , 26 , 0 , 0 ,
+ 0 , 27 , 0 , 0 ,
+ 0 , 27 , 0 , 0 ,
+ 0 , 28 , 0 , 0 ,
+ 0 , 28 , 0 , 0 ,
+ 0 , 29 , 0 , 0 ,
+ 0 , 29 , 0 , 0 ,
+ 0 , 30 , 0 , 0 ,
+ 0 , 30 , 0 , 0 ,
+ 0 , 31 , 0 , 0 ,
+ 0 , 31 , 0 , 0 ,
+ 0 , 32 , 0 , 0 ,
+ 0 , 32 , 0 , 0 ,
+ 0 , 33 , 0 , 0 ,
+ 0 , 33 , 0 , 0 ,
+ 0 , 34 , 0 , 0 ,
+ 0 , 34 , 0 , 0 ,
+ 0 , 35 , 0 , 0 ,
+ 0 , 35 , 0 , 0 ,
+ 0 , 36 , 0 , 0 ,
+ 0 , 36 , 0 , 0 ,
+ 0 , 37 , 0 , 0 ,
+ 0 , 37 , 0 , 0 ,
+ 0 , 38 , 0 , 0 ,
+ 0 , 38 , 0 , 0 ,
+ 0 , 39 , 0 , 0 ,
+ 0 , 39 , 0 , 0 ,
+ 0 , 40 , 0 , 0 ,
+ 0 , 40 , 0 , 0 ,
+ 0 , 41 , 0 , 0 ,
+ 0 , 41 , 0 , 0 ,
+ 0 , 42 , 0 , 0 ,
+ 0 , 42 , 0 , 0 ,
+ 0 , 43 , 0 , 0 ,
+ 0 , 43 , 0 , 0 ,
+ 0 , 44 , 0 , 0 ,
+ 0 , 44 , 0 , 0 ,
+ 0 , 45 , 0 , 0 ,
+ 0 , 45 , 0 , 0 ,
+ 0 , 46 , 0 , 0 ,
+ 0 , 46 , 0 , 0 ,
+ 0 , 47 , 0 , 0 ,
+ 0 , 47 , 0 , 0 ,
+ 0 , 48 , 0 , 0 ,
+ 0 , 48 , 0 , 0 ,
+ 0 , 49 , 0 , 0 ,
+ 0 , 49 , 0 , 0 ,
+ 0 , 50 , 0 , 0 ,
+ 0 , 50 , 0 , 0 ,
+ 0 , 51 , 0 , 0 ,
+ 0 , 51 , 0 , 0 ,
+ 0 , 52 , 0 , 0 ,
+ 0 , 52 , 0 , 0 ,
+ 0 , 53 , 0 , 0 ,
+ 0 , 53 , 0 , 0 ,
+ 0 , 54 , 0 , 0 ,
+ 0 , 54 , 0 , 0 ,
+ 0 , 55 , 0 , 0 ,
+ 0 , 55 , 0 , 0 ,
+ 0 , 56 , 0 , 0 ,
+ 0 , 56 , 0 , 0 ,
+ 0 , 57 , 0 , 0 ,
+ 0 , 57 , 0 , 0 ,
+ 0 , 58 , 0 , 0 ,
+ 0 , 58 , 0 , 0 ,
+ 0 , 59 , 0 , 0 ,
+ 0 , 59 , 0 , 0 ,
+ 0 , 60 , 0 , 0 ,
+ 0 , 60 , 0 , 0 ,
+ 0 , 61 , 0 , 0 ,
+ 0 , 61 , 0 , 0 ,
+ 0 , 62 , 0 , 0 ,
+ 0 , 62 , 0 , 0 ,
+ 0 , 63 , 0 , 0 ,
+ 0 , 63 , 0 , 0 ,
+ 0 , 64 , 0 , 0 ,
+ 0 , 64 , 0 , 0 ,
+ 0 , 65 , 0 , 0 ,
+ 0 , 65 , 0 , 0 ,
+ 0 , 66 , 0 , 0 ,
+ 0 , 66 , 0 , 0 ,
+ 0 , 67 , 0 , 0 ,
+ 0 , 67 , 0 , 0 ,
+ 0 , 68 , 0 , 0 ,
+ 0 , 68 , 0 , 0 ,
+ 0 , 69 , 0 , 0 ,
+ 0 , 69 , 0 , 0 ,
+ 0 , 70 , 0 , 0 ,
+ 0 , 70 , 0 , 0 ,
+ 0 , 71 , 0 , 0 ,
+ 0 , 71 , 0 , 0 ,
+ 0 , 72 , 0 , 0 ,
+ 0 , 72 , 0 , 0 ,
+ 0 , 73 , 0 , 0 ,
+ 0 , 73 , 0 , 0 ,
+ 0 , 74 , 0 , 0 ,
+ 0 , 74 , 0 , 0 ,
+ 0 , 75 , 0 , 0 ,
+ 0 , 75 , 0 , 0 ,
+ 0 , 76 , 0 , 0 ,
+ 0 , 76 , 0 , 0 ,
+ 0 , 77 , 0 , 0 ,
+ 0 , 77 , 0 , 0 ,
+ 0 , 78 , 0 , 0 ,
+ 0 , 78 , 0 , 0 ,
+ 0 , 79 , 0 , 0 ,
+ 0 , 79 , 0 , 0 ,
+ 0 , 80 , 0 , 0 ,
+ 0 , 80 , 0 , 0 ,
+ 0 , 81 , 0 , 0 ,
+ 0 , 81 , 0 , 0 ,
+ 0 , 82 , 0 , 0 ,
+ 0 , 82 , 0 , 0 ,
+ 0 , 83 , 0 , 0 ,
+ 0 , 83 , 0 , 0 ,
+ 0 , 84 , 0 , 0 ,
+ 0 , 84 , 0 , 0 ,
+ 0 , 85 , 0 , 0 ,
+ 0 , 85 , 0 , 0 ,
+ 0 , 86 , 0 , 0 ,
+ 0 , 86 , 0 , 0 ,
+ 0 , 87 , 0 , 0 ,
+ 0 , 87 , 0 , 0 ,
+ 0 , 88 , 0 , 0 ,
+ 0 , 88 , 0 , 0 ,
+ 0 , 89 , 0 , 0 ,
+ 0 , 89 , 0 , 0 ,
+ 0 , 90 , 0 , 0 ,
+ 0 , 90 , 0 , 0 ,
+ 0 , 91 , 0 , 0 ,
+ 0 , 91 , 0 , 0 ,
+ 0 , 92 , 0 , 0 ,
+ 0 , 92 , 0 , 0 ,
+ 0 , 93 , 0 , 0 ,
+ 0 , 93 , 0 , 0 ,
+ 0 , 94 , 0 , 0 ,
+ 0 , 94 , 0 , 0 ,
+ 0 , 95 , 0 , 0 ,
+ 0 , 95 , 0 , 0 ,
+ 0 , 96 , 0 , 0 ,
+ 0 , 96 , 0 , 0 ,
+ 0 , 97 , 0 , 0 ,
+ 0 , 97 , 0 , 0 ,
+ 0 , 98 , 0 , 0 ,
+ 0 , 98 , 0 , 0 ,
+ 0 , 99 , 0 , 0 ,
+ 0 , 99 , 0 , 0 ,
+ 0 , 100 , 0 , 0 ,
+ 0 , 100 , 0 , 0 ,
+ 0 , 101 , 0 , 0 ,
+ 0 , 101 , 0 , 0 ,
+ 0 , 102 , 0 , 0 ,
+ 0 , 102 , 0 , 0 ,
+ 0 , 103 , 0 , 0 ,
+ 0 , 103 , 0 , 0 ,
+ 0 , 104 , 0 , 0 ,
+ 0 , 104 , 0 , 0 ,
+ 0 , 105 , 0 , 0 ,
+ 0 , 105 , 0 , 0 ,
+ 0 , 106 , 0 , 0 ,
+ 0 , 106 , 0 , 0 ,
+ 0 , 107 , 0 , 0 ,
+ 0 , 107 , 0 , 0 ,
+ 0 , 108 , 0 , 0 ,
+ 0 , 108 , 0 , 0 ,
+ 0 , 109 , 0 , 0 ,
+ 0 , 109 , 0 , 0 ,
+ 0 , 110 , 0 , 0 ,
+ 0 , 110 , 0 , 0 ,
+ 0 , 111 , 0 , 0 ,
+ 0 , 111 , 0 , 0 ,
+ 0 , 112 , 0 , 0 ,
+ 0 , 112 , 0 , 0 ,
+ 0 , 113 , 0 , 0 ,
+ 0 , 113 , 0 , 0 ,
+ 0 , 114 , 0 , 0 ,
+ 0 , 114 , 0 , 0 ,
+ 0 , 115 , 0 , 0 ,
+ 0 , 115 , 0 , 0 ,
+ 0 , 116 , 0 , 0 ,
+ 0 , 116 , 0 , 0 ,
+ 0 , 117 , 0 , 0 ,
+ 0 , 117 , 0 , 0 ,
+ 0 , 118 , 0 , 0 ,
+ 0 , 118 , 0 , 0 ,
+ 0 , 119 , 0 , 0 ,
+ 0 , 119 , 0 , 0 ,
+ 0 , 120 , 0 , 0 ,
+ 0 , 120 , 0 , 0 ,
+ 0 , 121 , 0 , 0 ,
+ 0 , 121 , 0 , 0 ,
+ 0 , 122 , 0 , 0 ,
+ 0 , 122 , 0 , 0 ,
+ 0 , 123 , 0 , 0 ,
+ 0 , 123 , 0 , 0 ,
+ 0 , 124 , 0 , 0 ,
+ 0 , 124 , 0 , 0 ,
+ 0 , 125 , 0 , 0 ,
+ 0 , 125 , 0 , 0 ,
+ 0 , 126 , 0 , 0 ,
+ 0 , 126 , 0 , 0 ,
+ 0 , 127 , 0 , 0 ,
+ 0 , 127 , 0 , 0
+ };
+
+ // 2001.07.09 mrb: Added for presentation mode of DJ970
+ const unsigned char HT600x600x4_Pres970_open[1024]=
+ {
+ 0, 0, 255, 0,
+ 0, 1, 255, 2,
+ 0, 3, 255, 3,
+ 0, 4, 255, 5,
+ 0, 6, 255, 6,
+ 0, 7, 255, 8,
+ 0, 9, 255, 10,
+ 0, 11, 255, 11,
+ 0, 12, 255, 13,
+ 0, 14, 255, 14,
+ 0, 15, 255, 16,
+ 0, 17, 255, 18,
+ 0, 19, 255, 19,
+ 0, 20, 255, 21,
+ 0, 22, 255, 22,
+ 0, 23, 255, 24,
+ 0, 25, 255, 26,
+ 0, 27, 255, 27,
+ 0, 28, 255, 29,
+ 0, 30, 255, 30,
+ 0, 31, 255, 32,
+ 0, 33, 255, 34,
+ 0, 35, 255, 35,
+ 0, 36, 255, 37,
+ 0, 38, 255, 38,
+ 0, 39, 255, 40,
+ 0, 41, 255, 42,
+ 0, 43, 255, 43,
+ 0, 44, 255, 45,
+ 0, 46, 255, 46,
+ 0, 47, 255, 48,
+ 0, 49, 255, 50,
+ 0, 51, 255, 51,
+ 0, 52, 255, 53,
+ 0, 54, 255, 54,
+ 0, 55, 255, 56,
+ 0, 57, 255, 57,
+ 0, 58, 255, 59,
+ 0, 60, 255, 61,
+ 0, 62, 255, 62,
+ 0, 63, 255, 64,
+ 0, 65, 255, 65,
+ 0, 66, 255, 67,
+ 0, 68, 255, 69,
+ 0, 70, 255, 70,
+ 0, 71, 255, 72,
+ 0, 73, 255, 73,
+ 0, 74, 255, 75,
+ 0, 76, 255, 77,
+ 0, 78, 255, 78,
+ 0, 79, 255, 80,
+ 0, 81, 255, 81,
+ 0, 82, 255, 83,
+ 0, 84, 255, 85,
+ 0, 86, 255, 86,
+ 0, 87, 255, 88,
+ 0, 89, 255, 89,
+ 0, 90, 255, 91,
+ 0, 92, 255, 93,
+ 0, 94, 255, 94,
+ 0, 95, 255, 96,
+ 0, 97, 255, 97,
+ 0, 98, 255, 99,
+ 0, 100, 255, 101,
+ 0, 102, 255, 102,
+ 0, 103, 255, 104,
+ 0, 105, 255, 105,
+ 0, 106, 255, 107,
+ 0, 108, 255, 108,
+ 0, 109, 255, 110,
+ 0, 111, 255, 112,
+ 0, 113, 255, 113,
+ 0, 114, 255, 115,
+ 0, 116, 255, 116,
+ 0, 117, 255, 118,
+ 0, 119, 255, 120,
+ 0, 121, 255, 121,
+ 0, 122, 255, 123,
+ 0, 124, 255, 124,
+ 0, 125, 255, 126,
+ 0, 127, 255, 128,
+ 0, 129, 255, 129,
+ 0, 130, 255, 131,
+ 0, 132, 255, 132,
+ 0, 133, 255, 134,
+ 0, 135, 255, 136,
+ 0, 137, 255, 137,
+ 0, 138, 255, 139,
+ 0, 140, 255, 140,
+ 0, 141, 255, 142,
+ 0, 143, 255, 144,
+ 0, 145, 255, 145,
+ 0, 146, 255, 147,
+ 0, 148, 255, 148,
+ 0, 149, 255, 150,
+ 0, 151, 255, 152,
+ 0, 153, 255, 153,
+ 0, 154, 255, 155,
+ 0, 156, 255, 156,
+ 0, 157, 255, 158,
+ 0, 159, 255, 159,
+ 0, 160, 255, 161,
+ 0, 162, 255, 163,
+ 0, 164, 255, 164,
+ 0, 165, 255, 166,
+ 0, 167, 255, 167,
+ 0, 168, 255, 169,
+ 0, 170, 255, 171,
+ 0, 172, 255, 172,
+ 0, 173, 255, 174,
+ 0, 175, 255, 175,
+ 0, 176, 255, 177,
+ 0, 178, 255, 179,
+ 0, 180, 255, 180,
+ 0, 181, 255, 182,
+ 0, 183, 255, 183,
+ 0, 184, 255, 185,
+ 0, 186, 255, 187,
+ 0, 188, 255, 188,
+ 0, 189, 255, 190,
+ 0, 191, 255, 191,
+ 0, 192, 255, 193,
+ 0, 194, 255, 195,
+ 0, 196, 255, 196,
+ 0, 197, 255, 198,
+ 0, 199, 255, 199,
+ 0, 200, 255, 201,
+ 0, 202, 255, 203,
+ 0, 204, 255, 204,
+ 0, 205, 255, 206,
+ 0, 207, 255, 207,
+ 0, 208, 255, 209,
+ 0, 210, 255, 210,
+ 0, 211, 255, 212,
+ 0, 213, 255, 214,
+ 0, 215, 255, 215,
+ 0, 216, 255, 217,
+ 0, 218, 255, 218,
+ 0, 219, 255, 220,
+ 0, 221, 255, 222,
+ 0, 223, 255, 223,
+ 0, 224, 255, 225,
+ 0, 226, 255, 226,
+ 0, 227, 255, 228,
+ 0, 229, 255, 230,
+ 0, 231, 255, 231,
+ 0, 232, 255, 233,
+ 0, 234, 255, 234,
+ 0, 235, 255, 236,
+ 0, 237, 255, 238,
+ 0, 239, 255, 239,
+ 0, 240, 255, 241,
+ 0, 242, 255, 242,
+ 0, 243, 255, 244,
+ 0, 245, 255, 246,
+ 0, 247, 255, 247,
+ 0, 248, 255, 249,
+ 0, 250, 255, 250,
+ 0, 251, 255, 252,
+ 0, 253, 255, 254,
+ 0, 255, 255, 255,
+ 1, 3, 255, 6,
+ 1, 7, 255, 10,
+ 1, 11, 255, 14,
+ 1, 15, 255, 18,
+ 1, 19, 255, 22,
+ 1, 23, 255, 26,
+ 1, 27, 255, 30,
+ 1, 31, 255, 34,
+ 1, 35, 255, 38,
+ 1, 39, 255, 42,
+ 1, 43, 255, 46,
+ 1, 47, 255, 50,
+ 1, 51, 255, 54,
+ 1, 55, 255, 58,
+ 1, 59, 255, 62,
+ 1, 63, 255, 66,
+ 1, 67, 255, 70,
+ 1, 71, 255, 74,
+ 1, 75, 255, 78,
+ 1, 79, 255, 82,
+ 1, 83, 255, 86,
+ 1, 87, 255, 90,
+ 1, 91, 255, 94,
+ 1, 95, 255, 98,
+ 1, 99, 255, 102,
+ 1, 103, 255, 106,
+ 1, 107, 255, 110,
+ 1, 111, 255, 114,
+ 1, 115, 255, 118,
+ 1, 119, 255, 122,
+ 1, 123, 255, 126,
+ 1, 127, 255, 130,
+ 1, 131, 255, 134,
+ 1, 135, 255, 138,
+ 1, 139, 255, 142,
+ 1, 143, 255, 146,
+ 1, 147, 255, 150,
+ 1, 151, 255, 154,
+ 1, 155, 255, 158,
+ 1, 159, 255, 162,
+ 1, 163, 255, 166,
+ 1, 167, 255, 170,
+ 1, 171, 255, 174,
+ 1, 175, 255, 178,
+ 1, 179, 255, 182,
+ 1, 183, 255, 186,
+ 1, 187, 255, 190,
+ 1, 191, 255, 194,
+ 1, 195, 255, 198,
+ 1, 199, 255, 202,
+ 1, 203, 255, 206,
+ 1, 207, 255, 210,
+ 1, 211, 255, 214,
+ 1, 215, 255, 218,
+ 1, 219, 255, 222,
+ 1, 223, 255, 226,
+ 1, 227, 255, 230,
+ 1, 231, 255, 234,
+ 1, 235, 255, 238,
+ 1, 239, 255, 242,
+ 1, 243, 255, 246,
+ 1, 247, 255, 250,
+ 1, 251, 255, 254,
+ 1, 255, 255, 255,
+ 2, 8, 255, 15,
+ 2, 16, 255, 23,
+ 2, 24, 255, 31,
+ 2, 32, 255, 40,
+ 2, 41, 255, 48,
+ 2, 49, 255, 56,
+ 2, 57, 255, 64,
+ 2, 65, 255, 73,
+ 2, 74, 255, 81,
+ 2, 82, 255, 89,
+ 2, 90, 255, 97,
+ 2, 98, 255, 105,
+ 2, 106, 255, 114,
+ 2, 115, 255, 122,
+ 2, 123, 255, 130,
+ 2, 131, 255, 138,
+ 2, 139, 255, 147,
+ 2, 148, 255, 155,
+ 2, 156, 255, 163,
+ 2, 164, 255, 171,
+ 2, 172, 255, 179,
+ 2, 180, 255, 188,
+ 2, 189, 255, 196,
+ 2, 197, 255, 204,
+ 2, 205, 255, 212,
+ 2, 213, 255, 221,
+ 2, 222, 255, 229,
+ 2, 230, 255, 237,
+ 2, 238, 255, 245,
+ 2, 246, 255, 254,
+ 2, 255, 255, 255
+};
+#endif // APDK_EXTENDED_MEDIASIZE
+
+#ifdef APDK_DJ3320
+const unsigned char HT1200x1200x1PhotoBest_open[1024] =
+{
+0, 0, 255, 0,
+0, 0, 255, 0,
+0, 2, 255, 2,
+0, 3, 255, 3,
+0, 4, 255, 4,
+0, 5, 255, 5,
+0, 6, 255, 6,
+0, 7, 255, 7,
+0, 8, 255, 8,
+0, 9, 255, 9,
+0, 10, 255, 10,
+0, 11, 255, 11,
+0, 12, 255, 12,
+0, 13, 255, 13,
+0, 14, 255, 14,
+0, 15, 255, 15,
+0, 16, 255, 16,
+0, 17, 255, 17,
+0, 18, 255, 18,
+0, 19, 255, 19,
+0, 20, 255, 20,
+0, 21, 255, 21,
+0, 22, 255, 22,
+0, 23, 255, 23,
+0, 24, 255, 24,
+0, 25, 255, 25,
+0, 26, 255, 26,
+0, 27, 255, 27,
+0, 28, 255, 28,
+0, 29, 255, 29,
+0, 30, 255, 30,
+0, 31, 255, 31,
+0, 32, 255, 32,
+0, 33, 255, 33,
+0, 34, 255, 34,
+0, 35, 255, 35,
+0, 36, 255, 36,
+0, 37, 255, 37,
+0, 38, 255, 38,
+0, 39, 255, 39,
+0, 40, 255, 40,
+0, 41, 255, 41,
+0, 42, 255, 42,
+0, 43, 255, 43,
+0, 44, 255, 44,
+0, 45, 255, 45,
+0, 46, 255, 46,
+0, 47, 255, 47,
+0, 48, 255, 48,
+0, 49, 255, 49,
+0, 50, 255, 50,
+0, 51, 255, 51,
+0, 52, 255, 52,
+0, 53, 255, 53,
+0, 54, 255, 54,
+0, 55, 255, 55,
+0, 56, 255, 56,
+0, 57, 255, 57,
+0, 58, 255, 58,
+0, 59, 255, 59,
+0, 60, 255, 60,
+0, 61, 255, 61,
+0, 62, 255, 62,
+0, 63, 255, 63,
+0, 64, 255, 64,
+0, 65, 255, 65,
+0, 66, 255, 66,
+0, 67, 255, 67,
+0, 68, 255, 68,
+0, 69, 255, 69,
+0, 70, 255, 70,
+0, 71, 255, 71,
+0, 72, 255, 72,
+0, 73, 255, 73,
+0, 74, 255, 74,
+0, 75, 255, 75,
+0, 76, 255, 76,
+0, 77, 255, 77,
+0, 78, 255, 78,
+0, 79, 255, 79,
+0, 80, 255, 80,
+0, 81, 255, 81,
+0, 82, 255, 82,
+0, 83, 255, 83,
+0, 84, 255, 84,
+0, 85, 255, 85,
+0, 86, 255, 86,
+0, 87, 255, 87,
+0, 88, 255, 88,
+0, 89, 255, 89,
+0, 90, 255, 90,
+0, 91, 255, 91,
+0, 92, 255, 92,
+0, 93, 255, 93,
+0, 94, 255, 94,
+0, 95, 255, 95,
+0, 96, 255, 96,
+0, 97, 255, 97,
+0, 98, 255, 98,
+0, 99, 255, 99,
+0, 100, 255, 100,
+0, 101, 255, 101,
+0, 102, 255, 102,
+0, 103, 255, 103,
+0, 104, 255, 104,
+0, 105, 255, 105,
+0, 106, 255, 106,
+0, 107, 255, 107,
+0, 108, 255, 108,
+0, 109, 255, 109,
+0, 110, 255, 110,
+0, 111, 255, 111,
+0, 112, 255, 112,
+0, 113, 255, 113,
+0, 114, 255, 114,
+0, 115, 255, 115,
+0, 116, 255, 116,
+0, 117, 255, 117,
+0, 118, 255, 118,
+0, 119, 255, 119,
+0, 120, 255, 120,
+0, 121, 255, 121,
+0, 122, 255, 122,
+0, 123, 255, 123,
+0, 124, 255, 124,
+0, 125, 255, 125,
+0, 126, 255, 126,
+0, 127, 255, 127,
+0, 128, 255, 128,
+0, 129, 255, 129,
+0, 130, 255, 130,
+0, 131, 255, 131,
+0, 132, 255, 132,
+0, 133, 255, 133,
+0, 134, 255, 134,
+0, 135, 255, 135,
+0, 136, 255, 136,
+0, 137, 255, 137,
+0, 138, 255, 138,
+0, 139, 255, 139,
+0, 140, 255, 140,
+0, 141, 255, 141,
+0, 142, 255, 142,
+0, 143, 255, 143,
+0, 144, 255, 144,
+0, 145, 255, 145,
+0, 146, 255, 146,
+0, 147, 255, 147,
+0, 148, 255, 148,
+0, 149, 255, 149,
+0, 150, 255, 150,
+0, 151, 255, 151,
+0, 152, 255, 152,
+0, 153, 255, 153,
+0, 154, 255, 154,
+0, 155, 255, 155,
+0, 156, 255, 156,
+0, 157, 255, 157,
+0, 158, 255, 158,
+0, 159, 255, 159,
+0, 160, 255, 160,
+0, 161, 255, 161,
+0, 162, 255, 162,
+0, 163, 255, 163,
+0, 164, 255, 164,
+0, 165, 255, 165,
+0, 166, 255, 166,
+0, 167, 255, 167,
+0, 168, 255, 168,
+0, 169, 255, 169,
+0, 170, 255, 170,
+0, 171, 255, 171,
+0, 172, 255, 172,
+0, 173, 255, 173,
+0, 174, 255, 174,
+0, 175, 255, 175,
+0, 176, 255, 176,
+0, 177, 255, 177,
+0, 178, 255, 178,
+0, 179, 255, 179,
+0, 180, 255, 180,
+0, 181, 255, 181,
+0, 182, 255, 182,
+0, 183, 255, 183,
+0, 184, 255, 184,
+0, 185, 255, 185,
+0, 186, 255, 186,
+0, 187, 255, 187,
+0, 188, 255, 188,
+0, 189, 255, 189,
+0, 190, 255, 190,
+0, 191, 255, 191,
+0, 192, 255, 192,
+0, 193, 255, 193,
+0, 194, 255, 194,
+0, 195, 255, 195,
+0, 196, 255, 196,
+0, 197, 255, 197,
+0, 198, 255, 198,
+0, 199, 255, 199,
+0, 200, 255, 200,
+0, 201, 255, 201,
+0, 202, 255, 202,
+0, 203, 255, 203,
+0, 204, 255, 204,
+0, 205, 255, 205,
+0, 206, 255, 206,
+0, 207, 255, 207,
+0, 208, 255, 208,
+0, 209, 255, 209,
+0, 210, 255, 210,
+0, 211, 255, 211,
+0, 212, 255, 212,
+0, 213, 255, 213,
+0, 214, 255, 214,
+0, 215, 255, 215,
+0, 216, 255, 216,
+0, 217, 255, 217,
+0, 218, 255, 218,
+0, 219, 255, 219,
+0, 220, 255, 220,
+0, 221, 255, 221,
+0, 222, 255, 222,
+0, 223, 255, 223,
+0, 224, 255, 224,
+0, 225, 255, 225,
+0, 226, 255, 226,
+0, 227, 255, 227,
+0, 228, 255, 228,
+0, 229, 255, 229,
+0, 230, 255, 230,
+0, 231, 255, 231,
+0, 232, 255, 232,
+0, 233, 255, 233,
+0, 234, 255, 234,
+0, 235, 255, 235,
+0, 236, 255, 236,
+0, 237, 255, 237,
+0, 238, 255, 238,
+0, 239, 255, 239,
+0, 240, 255, 240,
+0, 241, 255, 241,
+0, 242, 255, 242,
+0, 243, 255, 243,
+0, 244, 255, 244,
+0, 245, 255, 245,
+0, 246, 255, 246,
+0, 247, 255, 247,
+0, 248, 255, 248,
+0, 249, 255, 249,
+0, 250, 255, 250,
+0, 251, 255, 251,
+0, 252, 255, 252,
+0, 253, 255, 253,
+0, 254, 255, 254,
+0, 254, 255, 254
+};
+
+#endif // APDK_DJ3320
+
+APDK_END_NAMESPACE
diff --git a/prnt/hpijs/bug.h b/prnt/hpijs/bug.h
new file mode 100644
index 0000000..1caf238
--- /dev/null
+++ b/prnt/hpijs/bug.h
@@ -0,0 +1,65 @@
+/************************************************************************************\
+
+ bug.h - debug support
+
+ (c) 2009 Copyright Hewlett-Packard Development Company, LP
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ NOT LIMITED TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+\************************************************************************************/
+
+#ifndef _BUG_H
+#define _BUG_H
+
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE
+#endif
+
+#define ADDITIONAL_LOG 1
+#define SAVE_PCL_FILE 2
+#define SAVE_INPUT_RASTERS 4
+#define SEND_TO_PRINTER 8
+
+#include <syslog.h>
+#include <stdio.h>
+
+#define _STRINGIZE(x) #x
+#define STRINGIZE(x) _STRINGIZE(x)
+
+#define BUG(args...) {syslog(LOG_ERR, __FILE__ " " STRINGIZE(__LINE__) ": " args); \
+fprintf(stderr, __FILE__ " " STRINGIZE(__LINE__) ": " args);}
+
+#define DBG_DUMP(data, size) sysdump((data), (size))
+#if 1
+ #define DBG6(args...) DBG(6, __FILE__ " " STRINGIZE(__LINE__) ": " args)
+ #define DBG8(args...) DBG(8, __FILE__ " " STRINGIZE(__LINE__) ": " args)
+ #define DBG_SZ(args...) DBG(6, args)
+#else
+ #define DBG6(args...) syslog(LOG_INFO, __FILE__ " " STRINGIZE(__LINE__) ": " args)
+ #define DBG8(args...) syslog(LOG_INFO, __FILE__ " " STRINGIZE(__LINE__) ": " args)
+ #define DBG_SZ(args...) syslog(LOG_INFO, args)
+#endif
+
+#endif /* _BUG_H */
diff --git a/prnt/hpijs/capture.cpp b/prnt/hpijs/capture.cpp
new file mode 100644
index 0000000..afca47f
--- /dev/null
+++ b/prnt/hpijs/capture.cpp
@@ -0,0 +1,285 @@
+/*****************************************************************************\
+ capture.cpp : Implimentation for capturing functions
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#ifdef APDK_CAPTURE
+#include "header.h"
+#include "script.h"
+
+APDK_BEGIN_NAMESPACE
+
+//////////////////////////////////////////////////////////////
+// Capture functions belonging to API
+
+
+void PrintContext::Capture_PrintContext(unsigned int InputPixelsPerRow,
+ unsigned int OutputPixelsPerRow,
+ PAPER_SIZE ps,
+ IO_MODE IOMode)
+{
+
+ if (! pSS->Capturing)
+ return;
+
+ Scripter *pS = pSS->pScripter;
+
+ pS->PutDebugToken(tokPrintContext);
+ pS->PutDebugInt(InputPixelsPerRow);
+ pS->PutDebugInt(OutputPixelsPerRow);
+ pS->PutDebugByte(ps);
+ pS->PutDebugByte(IOMode.bDevID);
+ pS->PutDebugByte(IOMode.bStatus);
+ if (!IOMode.bDevID)
+ return;
+
+ // need to simulate bidi, remember model and pens
+ pS->PutDebugString((const char*)pSS->strModel,strlen(pSS->strModel));
+ pS->PutDebugString((const char*)pSS->strPens,strlen(pSS->strPens));
+
+}
+
+
+void PrintContext::Capture_RealizeFont(const unsigned int ptr,
+ const unsigned int index,
+ const BYTE bSize,
+ const TEXTCOLOR eColor,
+ const BOOL bBold,
+ const BOOL bItalic,
+ const BOOL bUnderline)
+{
+
+ if (! pSS->Capturing)
+ return;
+
+ Scripter *pS = pSS->pScripter;
+
+ pS->PutDebugToken(tokRealizeFont);
+ pS->PutDebugInt(ptr);
+ pS->PutDebugByte(index);
+ pS->PutDebugByte(bSize);
+ pS->PutDebugByte(eColor);
+ pS->PutDebugByte(bBold);
+ pS->PutDebugByte(bItalic);
+ pS->PutDebugByte(bUnderline);
+
+}
+
+void PrintContext::Capture_SetPixelsPerRow(unsigned int InputPixelsPerRow,
+ unsigned int OutputPixelsPerRow)
+{
+
+ if (! pSS->Capturing)
+ return;
+
+ Scripter *pS = pSS->pScripter;
+
+ pS->PutDebugToken(tokSetPixelsPerRow);
+ pS->PutDebugInt(InputPixelsPerRow);
+ pS->PutDebugInt(OutputPixelsPerRow);
+}
+
+void PrintContext::Capture_SetInputResolution(unsigned int Res)
+{
+
+ if (! pSS->Capturing)
+ return;
+
+ Scripter *pS = pSS->pScripter;
+
+ pS->PutDebugToken(tokSetRes);
+ pS->PutDebugInt(Res);
+
+}
+
+
+void PrintContext::Capture_SelectDevice(const PRINTER_TYPE Model)
+{
+
+ if (! pSS->Capturing)
+ return;
+
+ Scripter *pS = pSS->pScripter;
+
+ pS->PutDebugToken(tokSelectDevice);
+ pS->PutDebugByte(Model);
+
+}
+
+
+void PrintContext::Capture_SelectDevice(const char* szDevIdString)
+{
+ if (! pSS->Capturing)
+ return;
+
+ Scripter *pS = pSS->pScripter;
+
+ pS->PutDebugToken(tokSelectDevice);
+ pS->PutDebugString(szDevIdString, strlen(szDevIdString));
+}
+
+
+void PrintContext::Capture_SelectPrintMode(unsigned int modenum)
+{
+
+ if (! pSS->Capturing)
+ return;
+
+ Scripter *pS = pSS->pScripter;
+
+ pS->PutDebugToken(tokSelectPrintMode);
+ pS->PutDebugByte(modenum);
+}
+
+void PrintContext::Capture_SetPaperSize(PAPER_SIZE ps, BOOL bFullBleed)
+{
+
+ if (! pSS->Capturing)
+ return;
+
+ Scripter *pS = pSS->pScripter;
+
+ pS->PutDebugToken(tokSetPaperSize);
+ pS->PutDebugByte(ps);
+ pS->PutDebugByte (bFullBleed);
+}
+
+
+
+
+void Job::Capture_Job(PrintContext* pPC)
+{
+
+ if (! thePrintContext->pSS->Capturing)
+ return;
+
+ Scripter *pS = thePrintContext->pSS->pScripter;
+
+ pS->PutDebugToken(tokJob);
+
+}
+
+void Job::Capture_SendRasters(BYTE* BlackImageData, BYTE* ColorImageData)
+{
+
+ if (! thePrintContext->pSS->Capturing)
+ return;
+
+ Scripter *pS = thePrintContext->pSS->pScripter;
+
+ pS->PutDebugToken(tokSendRasters);
+ unsigned int len=0;
+ if (BlackImageData != NULL)
+ len= (thePrintContext->InputWidth/8) + (thePrintContext->InputWidth%8);
+ pS->PutDebugStream(BlackImageData, len);
+ len = 0;
+ if (ColorImageData != NULL)
+ len= thePrintContext->OutputWidth*3;
+ pS->PutDebugStream(ColorImageData, len);
+
+}
+
+#if defined(APDK_FONTS_NEEDED)
+void Job::Capture_TextOut(const char* pTextString,
+ unsigned int iLenString,
+ const Font& font,
+ unsigned int iAbsX,
+ unsigned int iAbsY)
+{
+ SystemServices* pSS = thePrintContext->pSS;
+
+ if (! pSS->Capturing)
+ return;
+
+ Scripter *pS = pSS->pScripter;
+
+ pS->PutDebugToken(tokTextOut);
+ pS->PutDebugInt((int)&font);
+ pS->PutDebugString(pTextString,iLenString);
+ pS->PutDebugInt(iAbsX);
+ pS->PutDebugInt(iAbsY);
+}
+#endif
+
+void Job::Capture_NewPage()
+{
+ SystemServices* pSS = thePrintContext->pSS;
+ if (! pSS->Capturing)
+ return;
+
+ Scripter *pS = pSS->pScripter;
+
+ pS->PutDebugToken(tokNewPage);
+
+}
+
+
+void Job::Capture_dJob()
+{
+ SystemServices* pSS = thePrintContext->pSS;
+ if (! pSS->Capturing)
+ return;
+
+ Scripter *pS = pSS->pScripter;
+
+ pS->PutDebugToken(tokdJob);
+
+}
+
+#if defined(APDK_FONTS_NEEDED)
+void Font::Capture_dFont(const unsigned int ptr)
+{
+
+ if (internal)
+ return;
+ if (! pSS->Capturing)
+ return;
+
+ Scripter *pS = pSS->pScripter;
+
+ pS->PutDebugToken(tokdFont);
+ pS->PutDebugInt(ptr);
+}
+#endif
+
+void PrintContext::Capture_dPrintContext()
+{
+
+ if (! pSS->Capturing)
+ return;
+
+ Scripter *pS = pSS->pScripter;
+
+ pS->PutDebugToken(tokdPrintContext);
+
+}
+
+APDK_END_NAMESPACE
+
+#endif
diff --git a/prnt/hpijs/colormatch.cpp b/prnt/hpijs/colormatch.cpp
new file mode 100644
index 0000000..0c98b77
--- /dev/null
+++ b/prnt/hpijs/colormatch.cpp
@@ -0,0 +1,401 @@
+/*****************************************************************************\
+ colormatch.cpp : Implimentation for the ColorMatcher class
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+#include "header.h"
+#include "hptypes.h"
+#include "colormatch.h"
+
+APDK_BEGIN_NAMESPACE
+
+ColorMatcher::ColorMatcher
+(
+ SystemServices* pSys,
+ ColorMap cm,
+ unsigned int DyeCount,
+ unsigned int iInputWidth
+) : ColorPlaneCount(DyeCount),
+ InputWidth(iInputWidth),
+ pSS(pSys),
+ cmap(cm)
+{
+ constructor_error = NO_ERROR;
+ ASSERT(cmap.ulMap1 != NULL || cmap.ulMap3 != NULL);
+
+ StartPlane = K; // most common case
+
+ if (ColorPlaneCount == 3) // CMY pen
+ {
+ StartPlane = C;
+ }
+
+ EndPlane = Y; // most common case
+ if (ColorPlaneCount == 6)
+ {
+ EndPlane = Mlight;
+ }
+ if (ColorPlaneCount == 1)
+ {
+ EndPlane = K;
+ }
+
+ Contone = (BYTE*)pSS->AllocMem(InputWidth*ColorPlaneCount);
+ if (Contone == NULL)
+ {
+ goto MemoryError;
+ }
+
+ Restart(); // this zeroes buffers and sets nextraster counter
+
+ return;
+
+MemoryError:
+ constructor_error=ALLOCMEM_ERROR;
+
+ FreeBuffers();
+ return;
+} //ColorMatcher
+
+ColorMatcher::~ColorMatcher()
+{
+ DBG1("destroying ColorMatcher \n");
+
+ FreeBuffers();
+} //~ColorMatcher
+
+
+void ColorMatcher::Restart()
+// also reset cache when we have one
+{
+ memset(Contone, 0, InputWidth*ColorPlaneCount);
+
+ started = FALSE;
+}
+
+void ColorMatcher::Flush()
+// needed to reset cache
+{
+ if (!started)
+ {
+ return;
+ }
+ Restart();
+}
+
+void ColorMatcher::FreeBuffers()
+{
+ pSS->FreeMemory(Contone);
+}
+
+
+BYTE* ColorMatcher::NextOutputRaster(COLORTYPE rastercolor)
+{
+ if (iRastersReady == 0)
+ {
+ return NULL;
+ }
+
+ if (rastercolor == COLORTYPE_COLOR)
+ {
+ iRastersReady--; iRastersDelivered++;
+ }
+
+ if (rastercolor == COLORTYPE_COLOR)
+ {
+ if (raster.rasterdata[rastercolor] == NULL)
+ return NULL;
+ else
+ return Contone;
+ }
+ else
+ {
+ return raster.rasterdata[rastercolor];
+ }
+} //NextOutputRaster
+
+
+unsigned int ColorMatcher::GetOutputWidth(COLORTYPE rastercolor)
+{
+ if (rastercolor == COLORTYPE_COLOR)
+ {
+ if (raster.rasterdata[rastercolor] == NULL)
+ return 0;
+ else
+ return InputWidth*ColorPlaneCount;
+ }
+ else
+ {
+ return raster.rastersize[rastercolor];
+ }
+} //GetOutputWidth
+
+
+unsigned int ColorMatcher::GetMaxOutputWidth(COLORTYPE rastercolor)
+{
+ if (rastercolor == COLORTYPE_COLOR)
+ {
+ if (raster.rasterdata[rastercolor] == NULL)
+ return 0;
+ else
+ return InputWidth*ColorPlaneCount;
+ }
+ else
+ {
+ return raster.rastersize[rastercolor];
+ }
+} //GetMaxOutPutWidth
+
+
+//////////////////////////////////////////////////////////////////////////////
+
+void ColorMatcher::ColorMatch
+(
+ unsigned long width,
+ const uint32_t *map,
+ unsigned char *rgb,
+ unsigned char *kplane,
+ unsigned char *cplane,
+ unsigned char *mplane,
+ unsigned char *yplane
+)
+{
+ static uint32_t prev_red = 255, prev_green = 255, prev_blue = 255;
+ static BYTE bcyan, bmagenta, byellow, bblack;
+
+ uint32_t r;
+ uint32_t g;
+ uint32_t b;
+
+ for (unsigned long i = 0; i < width; i++)
+ {
+ r = *rgb++;
+ g = *rgb++;
+ b = *rgb++;
+
+ if(i == 0 || ( (prev_red != r) || (prev_green != g) || (prev_blue != b) ))
+ {
+ prev_red = r;
+ prev_green = g;
+ prev_blue = b;
+
+ Interpolate(map, (BYTE)r, (BYTE)g,(BYTE)b, &bblack, &bcyan, &bmagenta, &byellow);
+ }
+ if (kplane)
+ *(kplane + i) = bblack;
+ if (cplane)
+ *(cplane + i) = bcyan;
+ if (mplane)
+ *(mplane + i) = bmagenta;
+ if (yplane)
+ *(yplane + i) = byellow;
+
+ }
+
+} //ColorMatch
+
+#ifdef APDK_DJ3320
+void ColorMatcher::ColorMatch
+(
+ unsigned long width,
+ const unsigned char *map,
+ unsigned char *rgb,
+ unsigned char *kplane,
+ unsigned char *cplane,
+ unsigned char *mplane,
+ unsigned char *yplane
+)
+{
+ static BYTE prev_red = 255, prev_green = 255, prev_blue = 255;
+ static BYTE bcyan, bmagenta, byellow, bblack;
+
+ BYTE r;
+ BYTE g;
+ BYTE b;
+
+ for (unsigned long i = 0; i < width; i++)
+ {
+ r = *rgb++;
+ g = *rgb++;
+ b = *rgb++;
+ if(i == 0 || ( (prev_red != r) || (prev_green != g) || (prev_blue != b) ))
+ {
+ prev_red = r;
+ prev_green = g;
+ prev_blue = b;
+
+ Interpolate(map, (BYTE)r, (BYTE)g,(BYTE)b, &bblack, &bcyan, &bmagenta, &byellow);
+ }
+ if (kplane)
+ *(kplane + i) = bblack;
+ if (cplane)
+ *(cplane + i) = bcyan;
+ if (mplane)
+ *(mplane + i) = bmagenta;
+ if (yplane)
+ *(yplane + i) = byellow;
+
+ }
+
+} //ColorMatch
+#endif
+
+uint32_t Packed(unsigned int k,unsigned int c,unsigned int m,unsigned int y)
+{
+ uint32_t p = y;
+ p = p << 8;
+ p += m;
+ p = p << 8;
+ p += c;
+ p = p << 8;
+ p += k;
+ return p;
+} //Packed
+
+
+DRIVER_ERROR ColorMatcher::MakeGrayMap(const uint32_t *colormap, uint32_t* graymap)
+{
+ unsigned long ul_MapPtr;
+ for (unsigned int r = 0; r < 9; r++)
+ {
+ unsigned long ul_RedMapPtr = r * 9 * 9;
+ for (unsigned int g = 0; g < 9; g++)
+ {
+ unsigned long ul_GreenMapPtr = g * 9;
+ for (unsigned int b = 0; b < 9; b++)
+ {
+ unsigned long mapptr = b + (g * 9) + (r * 9 * 9); // get address in map
+ ul_MapPtr = b + ul_GreenMapPtr + ul_RedMapPtr;
+ ASSERT(mapptr == ul_MapPtr);
+ // put r,g,b in monitor range
+ unsigned int oldR = r * 255 >> 3;
+ unsigned int oldG = g * 255 >> 3;
+ unsigned int oldB = b * 255 >> 3;
+
+ // calculate gray equivalence
+ unsigned int gray = ((30 * oldR + 59 * oldG + 11 * oldB + 50) / 100);
+
+ uint32_t *start;
+ start = (uint32_t *)
+ ( ((gray & 0xE0) <<1) + ((gray & 0xE0)>>1) + (gray>>5) +
+ ((gray & 0xE0) >>2) + (gray>>5) + (gray>>5) + colormap);
+
+ BYTE k,c,m,y;
+ Interpolate(start, gray, gray, gray, &k, &c, &m, &y);
+
+ // second interpolate if Clight/Mlight
+
+ *(graymap + mapptr) = Packed(k, c, m, y);
+ }
+ }
+ }
+ return NO_ERROR;
+} //MakeGrayMap
+
+
+BOOL ColorMatcher::Process(RASTERDATA* pbyInputKRGBRaster)
+{
+ if (pbyInputKRGBRaster == NULL || (pbyInputKRGBRaster->rasterdata[COLORTYPE_BLACK] == NULL && pbyInputKRGBRaster->rasterdata[COLORTYPE_COLOR] == NULL))
+ {
+ Restart();
+ return FALSE; // no output
+ }
+ started=TRUE;
+
+ if (pbyInputKRGBRaster->rasterdata[COLORTYPE_COLOR])
+ {
+ BYTE* buff1 = NULL;
+ BYTE* buff2 = NULL;
+ BYTE* buff3 = NULL;
+ BYTE* buff4 = NULL;
+
+ if (StartPlane==K)
+ {
+ buff1 = Contone;
+ if (EndPlane>K)
+ {
+ buff2 = buff1 + InputWidth;
+ buff3 = buff2 + InputWidth;
+ buff4 = buff3 + InputWidth;
+ }
+ }
+ else
+ {
+ buff2 = Contone;
+ buff3 = buff2 + InputWidth;
+ buff4 = buff3 + InputWidth;
+ }
+
+#ifdef APDK_DJ3320
+ if (cmap.ulMap3)
+ {
+ ColorMatch( InputWidth, // ASSUMES ALL INPUTWIDTHS EQUAL
+ cmap.ulMap3,
+ pbyInputKRGBRaster->rasterdata[COLORTYPE_COLOR],
+ buff1,
+ buff2,
+ buff3,
+ buff4
+ );
+ }
+#endif
+ if (cmap.ulMap1)
+ {
+ // colormatching -- can only handle 4 planes at a time
+ ColorMatch( InputWidth, // ASSUMES ALL INPUTWIDTHS EQUAL
+ cmap.ulMap1,
+ pbyInputKRGBRaster->rasterdata[COLORTYPE_COLOR],
+ buff1,
+ buff2,
+ buff3,
+ buff4
+ );
+ }
+
+ if (EndPlane > Y && cmap.ulMap2)
+ {
+ BYTE* buff5 = buff4 + InputWidth;
+ BYTE* buff6 = buff5 + InputWidth;
+
+ ColorMatch( InputWidth,
+ cmap.ulMap2, // 2nd map is for lighter inks
+ pbyInputKRGBRaster->rasterdata[COLORTYPE_COLOR],
+ NULL, // don't need black again
+ buff5,buff6,
+ NULL // don't need yellow again
+ );
+ }
+ }
+
+ iRastersReady = 1;
+ iRastersDelivered = 0;
+ return TRUE; // one raster in, one raster out
+}
+
+APDK_END_NAMESPACE
+
diff --git a/prnt/hpijs/colormatch.h b/prnt/hpijs/colormatch.h
new file mode 100644
index 0000000..d58fc1f
--- /dev/null
+++ b/prnt/hpijs/colormatch.h
@@ -0,0 +1,156 @@
+/*****************************************************************************\
+ colormatch.h : Interface for the ColorMatcher class
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#ifndef APDK_COLORMATCH_H
+#define APDK_COLORMATCH_H
+
+#define TESTMODE 0
+#define MAP17CUBE 1
+#define OCT_MASK1 0x10
+#define OCT_MASK2 0x8
+#define OCT_MASK3 0x4
+#define OCT_MASK4 0x2
+#define OCT_MASK5 0x1
+
+APDK_BEGIN_NAMESPACE
+
+/*!
+\internal
+*/
+class ColorMatcher : public Processor
+{
+public:
+ ColorMatcher(SystemServices* pSys,
+ ColorMap cm,unsigned int DyeCount,
+ unsigned int iInputWidth);
+ virtual ~ColorMatcher();
+
+ //virtual BOOL Process(BYTE* pbyInputRGBRaster=NULL, unsigned int size=0);
+ virtual BOOL Process(RASTERDATA* InputRaster=NULL);
+ virtual void Flush();
+
+ DRIVER_ERROR constructor_error;
+
+ virtual void Restart(); // set up for new page or blanks
+
+ // items required by Processor
+ unsigned int GetOutputWidth(COLORTYPE rastercolor);
+ unsigned int GetMaxOutputWidth(COLORTYPE rastercolor);
+ BYTE* NextOutputRaster(COLORTYPE rastercolor);
+
+ unsigned int ColorPlaneCount;
+ unsigned int InputWidth; // # of pixels input
+ unsigned int StartPlane; // since planes are ordered KCMY, if no K, this is 1
+ unsigned int EndPlane; // usually Y, could be Mlight
+ unsigned int ResBoost;
+
+ DRIVER_ERROR MakeGrayMap(const uint32_t *colormap, uint32_t* graymap);
+
+protected:
+
+ SystemServices* pSS; // needed for memory management
+
+ void FreeBuffers();
+ void ColorMatch( unsigned long width, const uint32_t *map, unsigned char *rgb,
+ unsigned char *kplane, unsigned char *cplane, unsigned char *mplane,
+ unsigned char *yplane );
+ // open/proprietary differ in this routine
+ virtual void Interpolate(const uint32_t *map,
+ unsigned char r,unsigned char g,unsigned char b,
+ unsigned char *blackout, unsigned char *cyanout,
+ unsigned char *magentaout, unsigned char *yellowout)=0;
+
+#ifdef APDK_DJ3320
+ void ColorMatch( unsigned long width, const unsigned char *map, unsigned char *rgb,
+ unsigned char *kplane, unsigned char *cplane, unsigned char *mplane,
+ unsigned char *yplane );
+ // open/proprietary differ in this routine
+ virtual void Interpolate(const unsigned char *map,
+ unsigned char r,unsigned char g,unsigned char b,
+ unsigned char *blackout, unsigned char *cyanout,
+ unsigned char *magentaout, unsigned char *yellowout)=0;
+#endif
+
+
+ inline unsigned char GetYellowValue(uint32_t cmyk)
+ { return( ((unsigned char)((cmyk)>>24) & 0xFF) ); }
+
+ inline unsigned char GetMagentaValue(uint32_t cmyk)
+ { return( ((unsigned char)((cmyk)>>16) & 0xFF) ); }
+
+ inline unsigned char GetCyanValue(uint32_t cmyk)
+ { return( ((unsigned char)(((int)(cmyk))>>8) & 0xFF) ); }
+
+ inline unsigned char GetBlackValue(uint32_t cmyk)
+ { return( ((unsigned char)(cmyk) & 0xFF) ); }
+
+ HPBool Forward16PixelsNonWhite(HPBytePtr inputPtr)
+ {
+// return ((*(HPUInt32Ptr)(inputPtr) != 0x0) || (*(((HPUInt32Ptr)(inputPtr)) + 1) != 0x0) ||
+// (*(((HPUInt32Ptr)(inputPtr)) + 2) != 0x0) || (*(((HPUInt32Ptr)(inputPtr)) + 3) != 0x0));
+ for (int i=0; i < 16; i++)
+ {
+ if ((*inputPtr++)!=0)
+ return TRUE;
+ }
+
+ return FALSE;
+ }
+
+ HPBool Backward16PixelsNonWhite(HPBytePtr inputPtr)
+ {
+// return ((*(HPUInt32Ptr)(inputPtr) != 0x0) || (*(((HPUInt32Ptr)(inputPtr)) - 1) != 0x0) ||
+// (*(((HPUInt32Ptr)(inputPtr)) - 2) != 0x0) || (*(((HPUInt32Ptr)(inputPtr)) - 3) != 0x0));
+ for (int i=0; i < 16; i++)
+ {
+ if ((*inputPtr--)!=0)
+ return TRUE;
+ }
+
+ return FALSE;
+ }
+
+
+ unsigned char* Contone; // containing byte-per-pixel CMYK values
+
+ ColorMap cmap;
+
+// void PixelMultiply(unsigned char* buffer, unsigned int width, unsigned int factor);
+
+ unsigned int PlaneCount(); // tells how many layers (colors,hifipe,multirow)
+
+ BOOL started;
+
+}; //ColorMatcher
+
+APDK_END_NAMESPACE
+
+#endif //APDK_COLORMATCH_H
diff --git a/prnt/hpijs/colormatcher_open.cpp b/prnt/hpijs/colormatcher_open.cpp
new file mode 100644
index 0000000..bcb18d5
--- /dev/null
+++ b/prnt/hpijs/colormatcher_open.cpp
@@ -0,0 +1,184 @@
+/*****************************************************************************\
+ colormatcher_open.cpp : Implimentation for the ColorMatcher_Open class
+
+ Copyright (c) 1996 - 2002, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+#include "header.h"
+#include "hptypes.h"
+#include "colormatch.h"
+
+#include "colormatcher_open.h"
+#define INTERPOLATE_5_BITS(a, b, d) a + ( ( ( (long)b - (long)a ) * d) >> 5)
+#define INTERPOLATE_4_BITS(a, b, d) a + ( ( ( (long)b - (long)a ) * d) >> 4)
+
+// Spatial Interpolation
+#define INTERPOLATE_CUBE(r,g,b, cube, DOCALC) \
+ DOCALC( (DOCALC( (DOCALC( cube[0], cube[4], (r))), \
+ (DOCALC( cube[2], cube[6], (r))), (g))), \
+ (DOCALC( (DOCALC( cube[1], cube[5], (r))), \
+ (DOCALC( cube[3], cube[7], (r))), (g))), \
+ (b))
+
+APDK_BEGIN_NAMESPACE
+
+ColorMatcher_Open::ColorMatcher_Open
+(
+ SystemServices* pSys,
+ ColorMap cm,
+ unsigned int DyeCount,
+ unsigned int iInputWidth
+) : ColorMatcher(pSys,cm, DyeCount,iInputWidth)
+{ }
+
+ColorMatcher_Open::~ColorMatcher_Open()
+{ }
+
+
+//#define DOCALC(a, b, d) a + ( ( ( (long)b - (long)a ) * d) >> 5)
+
+/*
+BYTE DOCALC(BYTE a, BYTE b, BYTE d)
+{
+ return a + ( ( ( (long)b - (long)a ) * d) >> 5);
+}
+
+BYTE NewCalc(BYTE color[8], BYTE diff_red, BYTE diff_green, BYTE diff_blue)
+{
+ int dr32 = diff_red - 32;
+ int dg32 = diff_green - 32;
+ int db32 = diff_blue - 32;
+
+ int x;
+ x = -(color[0] * db32 * dg32 * dr32 + color[1] * diff_blue * (32 - diff_red) * dg32 +
+ color[2] * diff_green * (32 - diff_red) * db32 + color[3] * diff_blue * diff_green * dr32 -
+ diff_red * (color[4] * db32 * dg32 + color[5] * diff_blue * (32 - diff_green) -
+ diff_green * (color[6] * db32 - color[7] * diff_blue))) >> 15;
+ return x;
+}
+*/
+
+void ColorMatcher_Open::Interpolate
+(
+ const uint32_t *map,
+ BYTE r,
+ BYTE g,
+ BYTE b,
+ BYTE *blackout,
+ BYTE *cyanout,
+ BYTE *magentaout,
+ BYTE *yellowout
+)
+{
+ static int cube_location[] = {0, 1, 9, 10, 81, 82, 90, 91 };
+ const uint32_t *start;
+
+#ifdef _WIN32_WCE
+ long cyan[8], magenta[8],yellow[8],black[8];
+#else
+ BYTE cyan[8], magenta[8],yellow[8],black[8];
+#endif
+ start = (const uint32_t *)
+ (((r & 0xE0) << 1) + ((r & 0xE0) >> 1) + (r >> 5) +
+ ((g & 0xE0) >> 2) + (g >> 5) + (b >> 5) + map);
+
+ uint32_t cValue;
+ for (int j = 0; j < 8; j++)
+ {
+ cValue = *(start + cube_location[j]);
+ cyan[j] = GetCyanValue (cValue);
+ magenta[j] = GetMagentaValue (cValue);
+ yellow[j] = GetYellowValue (cValue);
+ black[j] = GetBlackValue (cValue);
+ }
+
+ ////////////////this is the 8 bit 9cube operation /////////////
+ BYTE diff_red = r & 0x1f;
+ BYTE diff_green = g & 0x1f;
+ BYTE diff_blue = b & 0x1f;
+
+ *cyanout = INTERPOLATE_CUBE(diff_red,diff_green,diff_blue, cyan, INTERPOLATE_5_BITS );
+ *magentaout = INTERPOLATE_CUBE(diff_red,diff_green,diff_blue, magenta, INTERPOLATE_5_BITS );
+ *yellowout = INTERPOLATE_CUBE(diff_red,diff_green,diff_blue, yellow, INTERPOLATE_5_BITS );
+ *blackout = INTERPOLATE_CUBE(diff_red,diff_green,diff_blue, black, INTERPOLATE_5_BITS );
+}
+
+#ifdef APDK_DJ3320
+
+void ColorMatcher_Open::Interpolate
+(
+ const unsigned char *map,
+ BYTE r,
+ BYTE g,
+ BYTE b,
+ BYTE *blackout,
+ BYTE *cyanout,
+ BYTE *magentaout,
+ BYTE *yellowout
+)
+{
+#ifdef _WIN32_WCE
+ long cyan[8], magenta[8],yellow[8],black[8];
+#else
+ BYTE cyan[8], magenta[8],yellow[8],black[8];
+#endif
+
+// static int cube_location[] = {0, 1, 17, 18, 289, 290, 306, 307};
+ static int cube_location[] = {0, 4, 68, 72, 1156, 1160, 1224, 1228};
+ const BYTE *start;
+
+ BYTE *node_ptr;
+
+ start = (const unsigned char *)
+ ((((r & 0xF0) << 4) + ((r & 0xF0) << 1) + (r >> 4) +
+ ((g & 0xF0)) + (g >> 4) + (b >> 4)) * 4 + map);
+
+ // use (start) to determine the surrounding cube values
+ for (int j = 0; j < 8; ++j )
+ {
+ node_ptr = (BYTE *) (start + cube_location[j]);
+ black[j] = *node_ptr++;
+ cyan[j] = *node_ptr++;
+ magenta[j] = *node_ptr++;
+ yellow[j] = *node_ptr;
+ }
+
+
+ // interpolate using the 4 LSBs
+ BYTE diff_red = r & 0x0f;
+ BYTE diff_green = g & 0x0f;
+ BYTE diff_blue = b & 0x0f;
+
+ *cyanout = INTERPOLATE_CUBE(diff_red,diff_green,diff_blue, cyan, INTERPOLATE_4_BITS );
+ *magentaout = INTERPOLATE_CUBE(diff_red,diff_green,diff_blue, magenta, INTERPOLATE_4_BITS );
+ *yellowout = INTERPOLATE_CUBE(diff_red,diff_green,diff_blue, yellow, INTERPOLATE_4_BITS );
+ *blackout = INTERPOLATE_CUBE(diff_red,diff_green,diff_blue, black, INTERPOLATE_4_BITS );
+}
+
+#endif
+
+APDK_END_NAMESPACE
diff --git a/prnt/hpijs/colormatcher_open.h b/prnt/hpijs/colormatcher_open.h
new file mode 100644
index 0000000..ec8c42d
--- /dev/null
+++ b/prnt/hpijs/colormatcher_open.h
@@ -0,0 +1,62 @@
+/*****************************************************************************\
+ colormatcher_open.h : Interface for the ColorMatcher_Open class
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#ifndef APDK_COLORMATCHER_OPEN_H
+#define APDK_COLORMATCHER_OPEN_H
+
+APDK_BEGIN_NAMESPACE
+
+class ColorMatcher_Open : public ColorMatcher
+{
+public:
+ ColorMatcher_Open(SystemServices* pSys,
+ ColorMap cm,unsigned int DyeCount,
+ unsigned int iInputWidth);
+ virtual ~ColorMatcher_Open();
+
+protected:
+
+ void Interpolate(const uint32_t *map,
+ unsigned char r,unsigned char g,unsigned char b,
+ unsigned char *blackout, unsigned char *cyanout,
+ unsigned char *magentaout, unsigned char *yellowout);
+
+ void Interpolate(const unsigned char *map,
+ unsigned char r,unsigned char g,unsigned char b,
+ unsigned char *blackout, unsigned char *cyanout,
+ unsigned char *magentaout, unsigned char *yellowout);
+
+
+}; //ColorMatcher_Open
+
+APDK_END_NAMESPACE
+
+#endif //APDK_COLORMATCHER_OPEN_H
diff --git a/prnt/hpijs/compression.cpp b/prnt/hpijs/compression.cpp
new file mode 100644
index 0000000..7ccc5f7
--- /dev/null
+++ b/prnt/hpijs/compression.cpp
@@ -0,0 +1,690 @@
+/*****************************************************************************\
+ compression.cpp : Implimentation for the Compressor class
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#include "header.h"
+
+APDK_BEGIN_NAMESPACE
+
+Compressor::Compressor(SystemServices* pSys, unsigned int RasterSize, BOOL useseed)
+ : pSS(pSys), SeedRow(NULL), UseSeedRow(useseed), inputsize(RasterSize), seeded(FALSE)
+{
+ constructor_error=NO_ERROR;
+ iRastersReady=0;
+
+ originalKData=pSS->AllocMem(RasterSize);
+ CNEWCHECK(originalKData);
+
+ if (!UseSeedRow)
+ return;
+
+ SeedRow=pSS->AllocMem(RasterSize);
+ CNEWCHECK(SeedRow);
+}
+
+Compressor::~Compressor()
+{
+ if (compressBuf)
+ pSS->FreeMem (compressBuf);
+ if (SeedRow)
+ pSS->FreeMem (SeedRow);
+ if (originalKData)
+ pSS->FreeMem (originalKData);
+}
+
+unsigned int Compressor::GetOutputWidth(COLORTYPE color)
+// since we return 1-for-1, just return result first call
+{
+ if (myplane == color)
+ {
+ return compressedsize;
+ }
+ else
+ {
+ return raster.rastersize[color];
+ }
+}
+
+
+BYTE* Compressor::NextOutputRaster(COLORTYPE color)
+// since we return 1-for-1, just return result first call
+{
+ if (iRastersReady==0)
+ return (BYTE*)NULL;
+ if (color == COLORTYPE_COLOR)
+ {
+ iRastersReady=0;
+ }
+ if (myplane == color)
+ {
+ if (raster.rasterdata[color] == NULL)
+ if (compressedsize != 0 && myplane == COLORTYPE_BLACK)
+ return compressBuf;
+ else
+ return NULL;
+ else
+ return compressBuf;
+ }
+ else
+ {
+ return raster.rasterdata[color];
+ }
+}
+
+Mode9::Mode9 (SystemServices* pSys,unsigned int RasterSize, BOOL bVIPPrinter)
+ : Compressor(pSys,RasterSize, TRUE)
+{
+ if (constructor_error != NO_ERROR) // if error in base constructor
+ return;
+
+ // Allocate double the RasterSize to accommodate worst case
+ compressBuf = (BYTE*)pSS->AllocMem(RasterSize * 2);
+ if (compressBuf == NULL)
+ constructor_error=ALLOCMEM_ERROR;
+
+ memset(compressBuf, 0, RasterSize * 2);
+ memset(SeedRow,0,RasterSize);
+
+ ResetSeedRow = FALSE;
+ m_bVIPPrinter = bVIPPrinter;
+}
+
+Mode9::~Mode9()
+{ }
+
+////////////////////////////////////////////////////////////////////////////
+
+typedef union {
+ unsigned char comchar; /* command byte as char */
+ struct
+ {
+#if defined(APDK_LITTLE_ENDIAN) || defined(LITTLE_ENDIAN_HW)
+ unsigned replace_count:3; /* replace count 1-7, 8=8+next byte */
+ unsigned roff:4; /* relative offset 0-14, 15=15+next byte */
+ unsigned type:1; /* type of replacement: 0=mode0, 1=mode1 */
+#else
+ unsigned type:1; /* type of replacement: 0=mode0, 1=mode1 */
+ unsigned roff:4; /* relative offset 0-14, 15=15+next byte */
+ unsigned replace_count:3; /* replace count 1-7, 8=8+next byte */
+#endif
+ } bitf0;
+ struct
+ {
+#if defined(APDK_LITTLE_ENDIAN) || defined(LITTLE_ENDIAN_HW)
+ unsigned replace_count:5; /* replace count 2-32, 33=33+next byte */
+ unsigned roff:2; /* relative offset 0-2, 3=3+next byte */
+ unsigned type:1; /* type of replacement: 0=mode0, 1=mode1 */
+#else
+ unsigned type:1; /* type of replacement: 0=mode0, 1=mode1 */
+ unsigned roff:2; /* relative offset 0-2, 3=3+next byte */
+ unsigned replace_count:5; /* replace count 2-32, 33=33+next byte */
+#endif
+ } bitf1;
+} Mode9_comtype;
+
+#ifndef MIN
+#define MIN(a,b) (((a)>=(b))?(b):(a))
+#endif
+
+#define kPCLMode9 9
+
+#define MAX_OFFSET0 14 /* Largest unscaled value an offset can have before extra byte is needed. */
+#define OFFSET_START0 0
+#define MAX_COUNT0 6 /* Largest unscaled value a count can have before extra byte is needed */
+#define COUNT_START0 1 /* What a count of zero has a value of. */
+
+#define MAX_OFFSET1 2
+#define OFFSET_START1 0
+#define MAX_COUNT1 30
+#define COUNT_START1 2
+
+//*********************************************************
+// This is based on code that came from Kevin Hudson.
+
+void Mode9::Flush()
+{
+ if (!seeded)
+ return;
+
+ compressedsize=0;
+
+ iRastersReady=0;
+ seeded=FALSE;
+}
+
+BOOL Mode9::Process(RASTERDATA* input)
+// compresses input data,
+// result in Mode9::compressbuf,
+// updates compressedsize
+{
+ if (input==NULL ||
+ (input->rasterdata[COLORTYPE_COLOR]==NULL && input->rasterdata[COLORTYPE_BLACK]==NULL)) // flushing pipeline
+ {
+ Flush();
+ return FALSE;
+ }
+ else seeded = TRUE;
+
+ if (!ResetSeedRow && input->rasterdata[myplane] == 0)
+ {
+ compressedsize=0;
+ iRastersReady=1;
+ return TRUE;
+ }
+
+ memset(compressBuf, 0, inputsize * 2);
+
+ unsigned int originalsize=input->rastersize[myplane];
+ unsigned int size=input->rastersize[myplane];
+ unsigned int layer;
+
+ // Convert 8 bit per pixel data into 1 bit per pixel data
+ if (myplane == COLORTYPE_BLACK)
+ {
+ if (input->rasterdata[myplane] == 0)
+ {
+ memset(originalKData, 0, inputsize);
+ size = originalsize = inputsize;
+ }
+ else
+ {
+ size = originalsize = (input->rastersize[myplane]+7)/8;
+ memset(originalKData, 0, size);
+
+ int curBit = 0x80, curByte = 0;
+ for (int i=0; i<input->rastersize[myplane]; i++)
+ {
+ if (input->rasterdata[myplane][i])
+ {
+ originalKData[curByte] |= curBit;
+ }
+ if (curBit == 0x01)
+ {
+ curByte++;
+ curBit = 0x80;
+ }
+ else
+ {
+ curBit = curBit >> 1;
+ }
+ }
+ ResetSeedRow = TRUE;
+ }
+ }
+ if ((myphase) && (myphase->prev)) // if in pipeline, as opposed to autonomous call
+ {
+ layer = myphase->prev->Exec->iRastersDelivered;
+ }
+ else layer = 1;
+
+ if (myplane == COLORTYPE_BLACK)
+ {
+ layer = 1;
+ }
+
+ layer--; // using as offset
+ char *sptr = (char *)(&SeedRow[size*layer]);
+
+ BYTE *nptr;
+ if (myplane == COLORTYPE_BLACK)
+ {
+ nptr = originalKData;
+ }
+ else
+ {
+ nptr = input->rasterdata[myplane];
+ }
+ BYTE *tempPtr;
+ char last_byte;
+ unsigned int offset,byte_count,rem_count;
+ Mode9_comtype command;
+ char* dest= (char*) compressBuf;
+ register char *dptr=dest;
+
+ while ( size > 0 )
+ {
+ offset = 0;
+
+/*
+ * If we are here because we are doing KRGB processing, don't offset off of
+ * the seedrow because seedrow here and one setup with mode10 may be out of sync,
+ * causing artifacts in the output.
+ */
+
+ if (seeded && !m_bVIPPrinter)
+ {
+ /* find a difference between the seed row and this row. */
+ while ((*sptr++ == *nptr++) && (offset < size) )
+ {
+ offset++;
+ }
+ sptr--;
+ nptr--;
+ }
+
+ if ( offset >= size ) /* too far to find diff, bail */
+ goto bail;
+
+ size -= offset;
+
+ if ((*nptr != nptr[1]) || (size < 2)) /************ if doing a mode 0 **********/
+ {
+ command.bitf0.type = 0;
+ last_byte = *nptr++; /* keep track of the last_byte */
+ sptr++; /* seed pointer must keep up with nptr */
+ byte_count = 1;
+
+ /* Now find all of the bytes in a row that don't match
+ either a run of mode3 or mode 1. A slight
+ optimization here would be to not jump out of this
+ run of mode 0 for a single mode 3 or two mode 1
+ bytes if we have to jump right back into mode 0,
+ especially if there are already 7 mode 0 bytes here
+ (we've already spent the extra byte for the
+ byte-count) */
+ while ((*sptr++ != *nptr) && (last_byte != *nptr) && (byte_count < size))
+ {
+ byte_count++;
+ last_byte = *nptr++;
+ }
+ sptr--;
+
+ /* Adjust the count if the last_byte == current_byte.
+ Save these bytes for the upcomming run of mode 1. */
+ if ((byte_count < size) && (last_byte == (char)*nptr))
+ {
+ nptr--; /* Now sptr points to first byte in the new run of mode 1. */
+ sptr--;
+ byte_count--;
+ }
+
+ size -= byte_count;
+ /* Now output full command. If offset is over 14 then
+ need optional offset bytes. If byte count is over 7
+ then need optional byte count. */
+
+ if (offset > (MAX_OFFSET0+OFFSET_START0))
+ command.bitf0.roff = MAX_OFFSET0+1;
+ else
+ command.bitf0.roff = offset-OFFSET_START0;
+
+ if (byte_count > (MAX_COUNT0+COUNT_START0))
+ command.bitf0.replace_count = MAX_COUNT0+1;
+ else
+ command.bitf0.replace_count = byte_count-COUNT_START0;
+
+ *dptr++ = command.comchar;
+
+ if (offset > (MAX_OFFSET0+OFFSET_START0))
+ {
+ offset -= (MAX_OFFSET0+OFFSET_START0+1);
+ if (offset == 0)
+ {
+ *dptr++ = 0;
+ }
+ else
+ {
+ while( offset )
+ {
+ *dptr++ = MIN ( offset, 255 );
+
+ if ( offset == 255 )
+ *dptr++ = 0;
+
+ offset -= MIN ( offset, 255 );
+ }
+ }
+ }
+
+ if (byte_count > (MAX_COUNT0+COUNT_START0))
+ {
+ rem_count = byte_count - (MAX_COUNT0+COUNT_START0+1);
+ if (rem_count == 0)
+ *dptr++ = 0;
+ else
+ {
+ while( rem_count )
+ {
+ *dptr++ = MIN ( rem_count, 255 );
+
+ if ( rem_count == 255 )
+ *dptr++ = 0;
+
+ rem_count -= MIN ( rem_count, 255 );
+ }
+ }
+ }
+
+ /* Now output the run of bytes. First set up a pointer to the first source byte. */
+
+ tempPtr = nptr - byte_count;
+ for(;byte_count;byte_count--)
+ {
+ *dptr++ = *tempPtr++;
+ }
+
+ } else /************ If doing a mode 1 *************/
+ {
+ /* mode 1, next two bytes are equal */
+ command.bitf1.type = 1;
+ nptr++;
+ last_byte = *nptr++;
+ byte_count = 2;
+
+ while ((last_byte == *nptr++) && (byte_count < size))
+ {
+ byte_count++;
+ }
+ nptr--;
+ sptr += byte_count;
+ size -= byte_count;
+
+ if (offset > (MAX_OFFSET1+OFFSET_START1))
+ command.bitf1.roff = MAX_OFFSET1+1;
+ else
+ command.bitf1.roff = offset-OFFSET_START1;
+
+ if (byte_count > (MAX_COUNT1+COUNT_START1))
+ command.bitf1.replace_count = MAX_COUNT1+1;
+ else
+ command.bitf1.replace_count = byte_count-COUNT_START1;
+
+ *dptr++ = command.comchar;
+
+ if (offset > (MAX_OFFSET1+OFFSET_START1))
+ {
+ offset -= (MAX_OFFSET1+OFFSET_START1+1);
+ if (offset == 0)
+ {
+ *dptr++ = 0;
+ }
+ else
+ {
+ while( offset )
+ {
+ *dptr++ = MIN ( offset, 255 );
+
+ if ( offset == 255 )
+ *dptr++ = 0;
+
+ offset -= MIN ( offset, 255 );
+ }
+ }
+ } /* if (offset > MAX... */
+
+ if (byte_count > (MAX_COUNT1+COUNT_START1))
+ {
+ rem_count = byte_count - (MAX_COUNT1+COUNT_START1+1);
+ if (rem_count == 0)
+ *dptr++ = 0;
+ else
+ {
+ while( rem_count )
+ {
+ *dptr++ = MIN ( rem_count, 255 );
+
+ if ( rem_count == 255 )
+ *dptr++ = 0;
+
+ rem_count -= MIN ( rem_count, 255 );
+ }
+ }
+ } /* if (byte_count > ... */
+
+ *dptr++ = last_byte; /* Now output the repeated byte. */
+ }
+ } /* while (size > 0) */
+
+bail:
+ size = ( dptr - dest );
+ compressedsize = size;
+ if (myplane == COLORTYPE_BLACK)
+ {
+ memcpy(&(SeedRow[layer*originalsize]), originalKData, originalsize);
+ }
+ else
+ {
+ memcpy(&(SeedRow[layer*originalsize]), input->rasterdata[myplane], originalsize);
+ }
+ seeded = TRUE;
+ iRastersReady=1;
+
+ return TRUE;
+}
+
+/*
+ * Only 8xx, 8x5, 9xx, ljmono and ljcolor use Mode2
+ */
+
+#if defined(APDK_DJ8xx)|| defined(APDK_DJ9xx) || defined(APDK_LJMONO) || defined(APDK_LJCOLOR)
+
+
+Mode2::Mode2 (SystemServices* pSys, unsigned int RasterSize)
+ : Compressor (pSys, RasterSize, FALSE)
+{
+ compressBuf = (BYTE*)pSS->AllocMem(RasterSize );
+ if (compressBuf == NULL)
+ constructor_error=ALLOCMEM_ERROR;
+}
+
+Mode2::~Mode2()
+{ }
+
+BOOL Mode2::Process (RASTERDATA* input)
+// mode 2 compression code from Kevin Hudson
+{
+ BYTE* pDst = compressBuf;
+ int ndstcount = 0;
+
+ if (input==NULL ||
+ (myplane == COLORTYPE_COLOR && input->rasterdata[COLORTYPE_COLOR] == NULL) ||
+ (myplane == COLORTYPE_BLACK && input->rasterdata[COLORTYPE_BLACK] == NULL)) // flushing pipeline
+ {
+ compressedsize=0;
+
+ iRastersReady=0;
+ return FALSE;
+ }
+
+ unsigned int size = input->rastersize[myplane];
+ for (unsigned int ni = 0; ni < size;)
+ {
+ if ( ni + 1 < size && input->rasterdata[myplane][ ni ] == input->rasterdata[myplane][ ni + 1 ] )
+ {
+ unsigned int nrepeatcount;
+ for ( ni += 2, nrepeatcount = 1; ni < size && nrepeatcount < 127; ++ni, ++nrepeatcount )
+ {
+ if ( input->rasterdata[myplane][ ni ] != input->rasterdata[myplane][ ni - 1 ] )
+ {
+ break;
+ }
+ }
+ int tmprepeat = 0 - nrepeatcount;
+ BYTE trunc = (BYTE) tmprepeat;
+ pDst[ ndstcount++ ] = trunc;
+ pDst[ ndstcount++ ] = input->rasterdata[myplane][ ni - 1 ];
+ }
+ else
+ {
+ int nliteralcount;
+ int nfirst = ni;
+ for ( ++ni, nliteralcount = 0; ni < size && nliteralcount < 127; ++ni, ++nliteralcount )
+ {
+ if ( input->rasterdata[myplane][ ni ] == input->rasterdata[myplane][ ni - 1 ] )
+ {
+ --ni;
+ --nliteralcount;
+ break;
+ }
+ }
+ pDst[ ndstcount++ ] = (BYTE) nliteralcount;
+ for ( int nj = 0; nj <= nliteralcount; ++nj )
+ {
+ pDst[ ndstcount++ ] = input->rasterdata[myplane][ nfirst++ ];
+ }
+ }
+ }
+
+ size = ndstcount;
+ compressedsize = size;
+ iRastersReady = 1;
+ return TRUE;
+}
+#endif // if 8xx, 9xx, ljmono, ljcolor
+
+#ifdef APDK_LJCOLOR
+/*
+ * Mode 3 (Delta Row Compression)
+ * Raghu Cauligi
+ */
+
+Mode3::Mode3 (SystemServices* pSys, Printer *pPrinter, unsigned int RasterSize)
+ : Compressor (pSys, RasterSize, TRUE)
+{
+ // Worst case is when two rows are completely different
+ // In that case, one command byte is added for every 8 bytes
+ // In the worst case, compression expands data by 50%
+ compressBuf = (BYTE*)pSS->AllocMem(RasterSize + RasterSize/2);
+ if (compressBuf == NULL)
+ constructor_error=ALLOCMEM_ERROR;
+
+ memset (SeedRow, 0x0, inputsize);
+ m_pPrinter = pPrinter;
+}
+
+Mode3::~Mode3 ()
+{
+
+}
+
+void Mode3::Flush ()
+{
+ if (!seeded)
+ return;
+ compressedsize=0;
+ iRastersReady = 0;
+ seeded = FALSE;
+ memset (SeedRow, 0x0, inputsize);
+ m_pPrinter->Send ((const BYTE *) "\033*b0Y", 5);
+
+}
+
+BOOL Mode3::Process (RASTERDATA *input)
+{
+ if (input==NULL ||
+ (myplane == COLORTYPE_COLOR && input->rasterdata[COLORTYPE_COLOR] == NULL) ||
+ (myplane == COLORTYPE_BLACK && input->rasterdata[COLORTYPE_BLACK] == NULL)) // flushing pipeline
+ {
+ Flush();
+ return FALSE;
+ }
+ else
+ {
+ seeded = TRUE;
+ }
+
+ unsigned int uOrgSize = input->rastersize[myplane];
+ unsigned int size = input->rastersize[myplane];
+ unsigned int uOffset;
+
+ BYTE *pszSptr = SeedRow;
+ BYTE *pszInPtr = input->rasterdata[myplane];
+ BYTE *pszCurPtr;
+ BYTE ucByteCount;
+ BYTE *pszOutPtr = compressBuf;
+
+ while (size > 0)
+ {
+ uOffset = 0;
+
+ if (seeded)
+ {
+ while ((*pszSptr == *pszInPtr) && (uOffset < size))
+ {
+ pszSptr++;
+ pszInPtr++;
+ uOffset++;
+ }
+ }
+
+ if (uOffset >= size)
+ {
+ break;
+ }
+
+ size -= uOffset;
+
+ pszCurPtr = pszInPtr;
+ ucByteCount = 1;
+ pszSptr++;
+ pszInPtr++;
+ while ((*pszSptr != *pszInPtr) && ucByteCount < size && ucByteCount < 8)
+ {
+ pszSptr++;
+ pszInPtr++;
+ ucByteCount++;
+ }
+ ucByteCount--;
+ if (uOffset < 31)
+ {
+ *pszOutPtr++ = ((ucByteCount << 5) | uOffset);
+ }
+ else
+ {
+ uOffset -= 31;
+ *pszOutPtr++ = ((ucByteCount << 5) | 31);
+
+ while (uOffset >= 255)
+ {
+ *pszOutPtr++ = 255;
+ uOffset -= 255;
+ }
+ *pszOutPtr++ = uOffset;
+ }
+ ucByteCount++;
+ size -= (ucByteCount);
+ memcpy (pszOutPtr, pszCurPtr, ucByteCount);
+ pszOutPtr += ucByteCount;
+ }
+
+ compressedsize = pszOutPtr - compressBuf;
+ memcpy (SeedRow, input->rasterdata[myplane], uOrgSize);
+ seeded = TRUE;
+ iRastersReady = 1;
+ return TRUE;
+
+// Mode 3
+}
+
+#endif // APDK_LJCOLOR
+APDK_END_NAMESPACE
+
+////////////////////////////////////////////////////////////////////
+
diff --git a/prnt/hpijs/compression.h b/prnt/hpijs/compression.h
new file mode 100644
index 0000000..499a36a
--- /dev/null
+++ b/prnt/hpijs/compression.h
@@ -0,0 +1,119 @@
+/*****************************************************************************\
+ compression.h : Interface for BertCompress and BertUncompress
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#ifndef APDK_COMPRESSION_H
+#define APDK_COMPRESSION_H
+
+APDK_BEGIN_NAMESPACE
+
+#define kUseOldBert 0
+
+
+#define kBertDecompressPixelSize 3
+
+// Follows are all the masks for the command byte.
+#define kTypeMask 0x80
+#define kTypeShiftAmount 7
+
+#define kCacheLiteralBitsMask 0x60
+#define kCacheLiteralBitsShiftAmount 5
+
+#define kCacheBitsMask 0x60
+#define kCacheBitsShiftAmount 5
+
+#define kRoffMask 0x18
+#define kRoffShiftAmount 3
+
+#define kReplace_countMask 0x07
+
+// Now have the compiler check to make sure none of the masks overlap/underlap bits accidently.
+#if ((kTypeMask | kCacheLiteralBitsMask | kRoffMask | kReplace_countMask) != 255)
+#error "Your mask bits are messed up!"
+#endif
+
+#if ((kTypeMask | kCacheBitsMask | kRoffMask | kReplace_countMask) != 255)
+#error "Your mask bits are messed up!"
+#endif
+
+
+enum
+{
+ eLiteral = 0,
+ eRLE = 0x80
+};
+
+enum
+{
+ eeNewPixel = 0x0,
+ eeWPixel = 0x20,
+ eeNEPixel = 0x40,
+ eeCachedColor = 0x60,
+};
+
+enum
+{
+ eNewColor = 0x0,
+ eWestColor = 0x1,
+ eNorthEastColor = 0x2,
+ eCachedColor = 0x3
+};
+
+
+// Literal
+#define M10_MAX_OFFSET0 2 /* Largest unscaled value an offset can have before extra byte is needed. */
+#define M10_MAX_COUNT0 6 /* Largest unscaled and unbiased value a count can have before extra byte is needed */
+#define M10_COUNT_START0 1 /* What a count of zero has a value of. */
+
+// RLE
+#define M10_MAX_OFFSET1 2
+#define M10_MAX_COUNT1 6
+#define M10_COUNT_START1 2
+
+//int BertCompress(unsigned char *currentRow, int byteCount, unsigned char *dest, unsigned char *seed, int pixelSizeInBytes);
+int BertCompress(unsigned char *currentRow, unsigned char *seed, unsigned char *dest, int byteCount, int pixelSizeInBytes);
+unsigned int decodeDataToPixel(const unsigned char *compressedDataPtr, int *CBI, const unsigned char *seedRowPtr, const int curPixel, int pixelSizeInBytes);
+void BertUncompress(const unsigned char *compressedDataPtr,
+ unsigned char *seedRowPtr,
+ int numberOfCompressedBytes,
+ int pixelSizeInBytes,
+ int rowWidthInBytes,
+ int *firstPixelThatChanged,
+ int *lastPixelThatChanged);
+/*unsigned int BertUncompress(const unsigned char *inPtr,
+ int ulInputBytes,
+ int ulOutputBytes,
+ unsigned char *ulSeedPtr,
+ unsigned char *ulOutPtr);
+*/
+
+APDK_END_NAMESPACE
+
+#endif //APDK_COMPRESSION_H
diff --git a/prnt/hpijs/config.h b/prnt/hpijs/config.h
new file mode 100644
index 0000000..7fe03be
--- /dev/null
+++ b/prnt/hpijs/config.h
@@ -0,0 +1,397 @@
+/*****************************************************************************\
+ config.h : configuration include header
+
+ Copyright (c) 1996 - 2002, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+/* Do NOT edit this file. Commenting or uncommenting the macro #defines below
+will not change the build options!
+*/
+
+/*! \addtogroup build_options Build Options
+This exists primarily as documentation of build options. All build options are
+documented here. The actual #defines are only included if documentation is being built.
+One can read though this file or the documentation to determine which options to include
+as input to the build process. config.h also sets up internal macros for
+including /excluding code based on compiler and defined public macros.
+\since Version 3.00.01
+@{
+*/
+
+#ifndef APDK_CONFIG_H
+#define APDK_CONFIG_H
+
+#ifdef APDK_INTERNAL_CREATE_DOCUMENTATION
+
+/*! \addtogroup font_options Font Options
+Define one or more of the font directive to enable device fonts.
+These need to be defined to support hardware fonts in the printer. Enabling fonts
+is NOT recommended, however if ASCII text needs to be sent to the printer then define
+the font(s) needed. Only define the fonts that will be used, each font that is enabled
+will make the code size larger. See \ref devfonts for more information about fonts or
+PrintContext::RealizeFont() to create a font.
+@{
+*/
+
+#define APDK_CGTIMES //!< Include support for CGTimes font - see \ref devfonts
+
+#define APDK_COURIER //!< Include support for Courier font - see \ref devfonts
+
+#define APDK_LTRGOTHIC //!< Include support for Letter Gothic font - see \ref devfonts
+
+#define APDK_UNIVERS //!< Include support for Universe font - see \ref devfonts
+
+/*! @} */ //end of Font Options group
+
+
+/*!
+Define this if build is for a little endian processor
+\since Version 2.3.0
+*/
+#define APDK_LITTLE_ENDIAN
+
+
+/*!
+Compiles in code that allows for auto duplex on printers that support a duplexer.
+On most inkjet printers, when the duplexer refeeds the paper, the back side will be
+rotated 180 degrees with respect to the front side, resulting in tabelt mode duplexing
+(stapled on the short edge). To print duplexed in booklet mode (stapled on the long edge),
+the application must rotate the whole page image by 180 degrees before sending the rasters.
+Call PrintContext::RoateteImageForBackPage () to determine if the selected printer needs
+back page rotated.
+*/
+#define APDK_AUTODUPLEX
+
+/*!
+Compiles in code that allows for additional media size for large resource system
+\since Version 3.6.0
+*/
+#define APDK_EXTENDED_MEDIASIZE
+
+
+/*!
+This makes several changes to the code path to ensure maximum speed:
+\li First, speed optimization forces the use of matrix half toning instead of what the print mode
+requests. Typically matrix is used for draft modes because it is faster and not as good
+of quality. Speed optimization uses matrix for all print modes.
+\li Second, speed optimization forces the use of open color matching instead of proprietary
+color matching. Open is faster and not as good. Proprietary color matching is not included
+in the open source code.
+\li Third, it forces the use of open scaling which is quicker and not as good as proprietary
+scaling. Proprietary scaling is not include in the open source code.
+\since Version 2.4.0
+*/
+#define APDK_OPTIMIZE_FOR_SPEED
+
+
+/*!
+By default color filtering (Ernie code) is turned off. Color filtering
+helps with RLE compression (Bert) when sending data to the printer. Color filtering is
+only used with VIP printers and should only be turned on when the DJ9xxVIP family of printers
+is supported. Turning on color filtering will help in the situation where there is
+high CPU resources available and low I/O bandwidth. Color filtering reduces the amount of
+data sent to the printer by matching colors so that RLE compression is more effective. If
+CPU resources a low do not turn on color filtering.
+\note APDK_VIP_COLORFILTERING has no effect unless \ref APDK_DJ9xxVIP is also defined.
+\since Version 3.00.00
+*/
+#define APDK_VIP_COLORFILTERING
+
+
+/*!
+By default all APDK classes, types, variables, etc... belong to the apdk namespace.
+This minimizes the conflicts when integrating with existing code. The code that calls the APDK
+driver code should include the line "using namespace APDK_NAMESPACE;". If there are specific
+conflicts with other names then the name should be specifically specified (i.e.
+APDK_NAMESPACE::DRIVER_ERROR or APDK_NAMESPACE::Job, etc...). Define APDK_NO_NAMESPACE to
+eliminate the namespace definitions and all APDK names will be placed in the global namespace.
+\since Version 3.00.01
+*/
+#define APDK_NO_NAMESPACE
+
+
+/*!
+For embedded devices the APDK defaults to lower (normal) resolution print modes.
+This facilitates sending less data on lower end (low bandwidth / low CPU) devices.
+On VIP printers this data is scaled up internally so the print quality is good.
+For high end devices or OSs, such as Linux, defining APDK_HIGH_RES_MODES will cause
+some VIP printer modes to send higher resolution data to the printer. This will
+cause higher CPU utilization and use more I/O bandwidth. However, results could
+be better if the input data is truly more then 300 DPI. If the input data is not
+significantly higher then 300 DIP then turning on APDK_HIGH_RES_MODES will unncessarily
+burn CPU cycles and I/O bandwidth.
+\note Currently this only effects VIP printers.
+\since Version 3.00.02
+*/
+#define APDK_HIGH_RES_MODES
+
+
+/*!
+This turns on output buffering. Without buffering the APDK sends out each byte
+as it is ready. With buffer send on the APDK buffers up output data and sends it to the
+printer when the buffer is full. To set the size of the buffer set the
+SystemServicesa::iSendBufferSize variable in your derived SystemServices and define this
+directive. The default buffer size, if not specified, is 4096 bytes.
+*/
+#define APDK_BUFFER_SEND
+
+
+/*
+Usage Log: What does this do guys?
+*/
+
+// #define APDK_USAGE_LOG
+
+
+/*!
+Turn on capturing utility for debugging. This creates script files that document
+order of calls and state of APDK and PCL output.
+*/
+#define APDK_CAPTURE
+
+
+/*
+Prototype: Do NOT define APDK_PROTO. It is for internal use only and facilitates testing
+with HP's test harness. The APDK will not successfully compile with APDK_PROTO defined.
+*/
+
+//#define APDK_PROTO
+
+
+/*! \addtogroup printer_options Printer Options
+Printer families: Define one or more of these to support printer families.
+@{
+*/
+
+/* Do NOT enable DJ400 or DJ540 - they are not supported, only legacy,
+unsupported code exists for these two printers.
+*/
+
+/*!
+Enable support for Apollo P-2200 and the Deskjet 656.
+*/
+#define APDK_APOLLO2XXX
+
+/*!
+enables support for the Apollo P-2100.
+*/
+#define APDK_APOLLO21XX
+
+/*!
+Enables support for the Apollo P-2500 and P-2600.
+*/
+#define APDK_APOLLO2560
+
+/*!
+Enables support for the Deskjet 350.
+*/
+#define APDK_DJ350
+
+/*
+Do NOT define this - the 400 is not supported
+Enables support for the Deskjet 400.
+*/
+//#define APDK_DJ400
+
+/*
+Do NOT define this - the 540 is not supported
+Enables support for the Deskjet 540.
+*/
+//#define APDK_DJ540
+
+/*!
+Enables support for the Deskjet 600.
+*/
+#define APDK_DJ600
+
+/*!
+Enables support for the Deskjet 630.
+*/
+#define APDK_DJ630
+
+/*!
+Enables support for the Deskjet 660, 670, 680, 6xx, e-printer.
+*/
+#define APDK_DJ6xx
+
+/*!
+Enables support for the Deskjet 610, 640, 690
+*/
+#define APDK_DJ6xxPhoto
+
+/*!
+Enables support for the Deskjet 810, 830, 840, 880, 895, 1125.
+*/
+#define APDK_DJ8xx
+
+/*!
+Enables support for the Deskjet 825, 845.
+APDK_DJ8xx must also be defined
+*/
+#define APDK_DJ8x5
+
+/*!
+Enables support for the Deskjet 920, 930, 94x, 950, 970, 1220, 3816, 3820,
+PhotoSmart P1000, P1100.
+*/
+#define APDK_DJ9xx
+
+/*!
+Enables support for the Deskjet 450, 960, 980, 990, 995, 6122, 6127,
+PhotoSmart 1115, 1215, 1218, 1315
+CP 1160, CP 1700
+hp business inkjet 2200 series, hp business inkjet 1100
+OfficeJet Pro K550, OfficeJet Pro K850 - Note: these two are in OJProKx50 class
+*/
+#define APDK_DJ9xxVIP
+
+/*!
+Enables support for
+deskjet 5550, 5551 - Note: these two printers are in DJ55xx class
+PhotoSmart 7150, 7350, 7550.
+APDK_DJ9xxVIP must also be defined
+*/
+#define APDK_DJGENERICVIP
+
+/*!
+Enables support for the PhotoSmart 100, 130, 230, 240.
+APDK_DJ9xxVIP must also be defined
+*/
+#define APDK_PSP100
+
+/*!
+Enables support for the non-hostbased Monochrome LaserJets.
+*/
+#define APDK_LJMONO
+
+/*!
+Enables support for the non-hostbased Color LaserJets.
+*/
+#define APDK_LJCOLOR
+
+/*!
+Enables support for the JetReady host based Color LaserJets.
+*/
+#define APDK_LJJETREADY
+
+/*!
+Enables support for the FastRaster host based LaserJets.
+*/
+#define APDK_LJFASTRASTER
+
+/*!
+Enables support for LaserJet 1000, 1005, 1018, 1020
+*/
+#define APDK_LJZJS_MONO
+
+/*!
+Enables support for the hp and non-hp Postscript Printers
+*/
+#define APDK_PSCRIPT
+
+/*!
+Enables support for DJ 3300, 3400, 3500, 3740 family, psc 1100 series, psc 1200 series, officejet 4100 and 4200.
+*/
+#define APDK_DJ3320
+
+/*!
+Enables support for DJ 3600, 3840 family, psc 1300 series, and officejet 5500 series.
+*/
+#define APDK_DJ3600
+
+/*!
+Enables support for specific Linux resolution requirements for 600 Series
+*/
+#define APDK_LINUX
+
+/*!
+Enables printer ready data compression for DJ3320 and DJ3600 class of printers. This
+is beneficial where I/O bandwidth is low. May reduce performance on devices
+that have low power CPUs.
+*/
+#define APDK_LDL_COMPRESS
+
+/*! @} */ //end of Printer Options group
+/*! @} */ //end of Build Options group
+
+/*!
+Enables support for HP-UX specific declarations
+*/
+
+#define APDK_HP_UX
+
+#endif //APDK_INTERNAL_CREATE_DOCUMENTATION
+/*
+Now set up some stuff to make it easy in the main code and ensure conflicting
+directives are not active. Don't play with stuff beyond this point in the file.
+*/
+
+// Don't allow Ernie ColorFiltering if the VIP family printers are not being built.
+// ColorFiltering is only useful for DJ9xxVIP and will just take up code space if
+// that printer family is not defined.
+#if !defined(APDK_DJ9xxVIP) && defined(APDK_VIP_COLORFILTERING)
+ #undef APDK_VIP_COLORFILTERING
+#endif
+
+
+// This is make the #ifdefs in the code more readable since we need to know if any of the
+// fonts are defined in a number of places. If we ever add any other fonts to a printer
+// then we can define it here rather then edit the #ifdefs all over the code base.
+#if defined(APDK_CGTIMES) || defined(APDK_COURIER) || defined(APDK_LTRGOTHIC) || defined(APDK_UNIVERS)
+ #define APDK_FONTS_NEEDED
+#else
+ #undef APDK_FONTS_NEEDED
+#endif
+
+/*!
+\namespace apdk
+All classes, types, global variables, functions, etc... are in the apdk namespace to avoid
+collision with existing code the APDK is integrated with.
+\since version 3.00.01
+*/
+// This will put all enums, typedefs, structs, classes, etc... in the apdk name space if
+// APDK_NO_NAMESPACE is not defined.
+#if !defined(APDK_NO_NAMESPACE)
+ #define APDK_NAMESPACE apdk
+ #define APDK_BEGIN_NAMESPACE namespace APDK_NAMESPACE {
+ #define APDK_END_NAMESPACE } //namespace apdk
+ #define APDK_USING_NAMESPACE using namespace APDK_NAMESPACE;
+#else
+ #define APDK_NAMESPACE
+ #define APDK_BEGIN_NAMESPACE
+ #define APDK_END_NAMESPACE
+ #define APDK_USING_NAMESPACE
+#endif
+
+/*!
+This define is useful for autoconf users who create "auto-include.h" on-the-fly. For example autoconf
+can automatically determine the appropriate header file for uint32_t (ie: by storing "#include <stdint.h>"
+in "auto-include.h").
+*/
+//#define APDK_AUTO_INCLUDE
+
+#endif //APDK_CONFIG_H
diff --git a/prnt/hpijs/context.h b/prnt/hpijs/context.h
new file mode 100644
index 0000000..fa07a6f
--- /dev/null
+++ b/prnt/hpijs/context.h
@@ -0,0 +1,421 @@
+/*****************************************************************************\
+ context.h : Interface/Implimentation for the PrintContext class
+
+ Copyright (c) 1996 - 2008, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#ifndef APDK_PRINTCONTEXT_H
+#define APDK_PRINTCONTEXT_H
+
+#define MEDIASIZE_PCL 0
+typedef struct
+{
+ int pcl_id;
+ float fPhysicalWidth;
+ float fPhysicalHeight;
+ float fPrintableWidth;
+ float fPrintableHeight;
+ float fPrintableStartX;
+ float fPrintableStartY;
+} MediaAttributes;
+typedef struct
+{
+ MediaAttributes media_attributes;
+} JobAttributes;
+
+#include "printerfactory.h"
+
+APDK_BEGIN_NAMESPACE
+
+class PrintMode;
+class Pipeline;
+class Compressor;
+class Header;
+class Printer;
+class ModeSet;
+
+//PrintContext
+//! Allows setting options of a print job based on specific device
+/*! \class PrintContext context.h "hpprintapi.h"
+This object serves two purposes. First, it encapsulates knowledge about all
+devices supported in available driver components. It can be queried at runtime
+to determine capabilities of the attached device. Second, it allows for
+setting optional parameters of a print job, such as media size and margins,
+use of color and data-resolution, etc.
+
+The PrintContext is the second item created in the driver calling sequence,
+following SystemServices. It provides the interface for inquiring about
+supported devices, and for setting all optional properties of the imaging
+pipeline as determined by given devices.
+
+\sa Job SystemServices
+******************************************************************************/
+class PrintContext
+{
+friend class Job; // access to private (non-instrumented) versions of routines
+friend class Header; // access to private (non-instrumented) versions of routines
+friend class RasterSender; // access to current printmode
+friend class HeaderDJ990; // to use GUITopMargin
+friend class Header895;
+friend class Tester;
+friend class Header850;
+friend class LDLEncap;
+public:
+ PrintContext(SystemServices *pSysServ,
+ unsigned int InputPixelsPerRow=0,
+ unsigned int OutputPixelsPerRow=0,
+ PAPER_SIZE ps = LETTER,
+ QUALITY_MODE eQuality = QUALITY_NORMAL,
+ MEDIATYPE eMedia = MEDIA_PLAIN,
+ COLORMODE eColorMode = COLOR,
+ BOOL bDeviceText = FALSE);
+
+ virtual ~PrintContext();
+
+ DRIVER_ERROR constructor_error;
+
+
+ void Flush(int FlushSize); // used in connection with SendPrinterReadyData
+
+ // used when constructor couldn't instantiate printer (no DevID) -- instantiate now
+ DRIVER_ERROR SelectDevice(const PRINTER_TYPE Model);
+ DRIVER_ERROR SelectDevice(const char* szDeviceIDString);
+
+ unsigned int GetModeCount();
+ DRIVER_ERROR SelectPrintMode(const unsigned int index);
+ DRIVER_ERROR SelectPrintMode(
+ QUALITY_MODE eQuality = QUALITY_NORMAL,
+ MEDIATYPE eMedia = MEDIA_PLAIN,
+ COLORMODE eColorMode = COLOR,
+ BOOL bDeviceText = FALSE
+ );
+ DRIVER_ERROR SetPenSet(PEN_TYPE ePen);
+
+ // need to seriously consider the future of this method. Returning the index of the
+ // current print mode may not always work and certainly won't in the future with
+ // more dynamic print modes. - JLM
+ /*!
+ \deprecated
+ Retrieves an index of the currently selected print mode.
+ */
+ unsigned int CurrentPrintMode();
+
+ // obsolete function retained for compatibility
+ /*!
+ \deprecated
+ Returns the identifying string for the currently selected print mode.
+ This method now returns an empty string for every print mode.
+ */
+ const char *GetModeName ()
+ {
+ return ("");
+ }
+
+ DRIVER_ERROR GetPrintModeSettings(
+ QUALITY_MODE& eQuality,
+ MEDIATYPE& eMedia,
+ COLORMODE& eColorMode,
+ BOOL& bDeviceText
+ );
+
+ PRINTER_TYPE SelectedDevice();
+
+
+#if defined(APDK_FONTS_NEEDED)
+ ReferenceFont* EnumFont(int& iCurrIdx);
+ // { return thePrinter->EnumFont(iCurrIdx); }
+ virtual Font* RealizeFont(const int index,const BYTE bSize,
+ const TEXTCOLOR eColor=BLACK_TEXT,
+ const BOOL bBold=FALSE,const BOOL bItalic=FALSE,
+ const BOOL bUnderline=FALSE);
+ // { return thePrinter->RealizeFont(eFont,bSize,eColor,
+ // bBold,bItalic,bUnderline); }
+#endif
+ // return the enum for the next model(UNSUPPORTED when finished)
+ PRINTER_TYPE EnumDevices(FAMILY_HANDLE& familyHandle) const;
+
+ // PerformPrinterFunction (clean pen, etc.)
+ // this is the preferred function to call
+ DRIVER_ERROR PerformPrinterFunction(PRINTER_FUNC eFunc);
+
+ DRIVER_ERROR PagesPrinted(unsigned int& count);
+ ///////////////////////////////////////////////////////////////////////
+ // routines to change settings
+ DRIVER_ERROR SetPaperSize(PAPER_SIZE ps, BOOL bFullBleed = FALSE);
+ // these are dependent on printer model in use, thus can err
+ DRIVER_ERROR SetPixelsPerRow(unsigned int InputPixelsPerRow,
+ unsigned int OutputPixelsPerRow=0);
+ //
+ // routines to query selections ///////////////////////////////////////
+
+ //! Returns TRUE if printer has been selected.
+ BOOL PrinterSelected() { return !(thePrinter==NULL); }
+
+ //! Returns TRUE if the selected printer (and the current build) provides font support.
+ BOOL PrinterFontsAvailable(); // return FALSE if no printer
+
+ //! Returns TRUE if the selected printer (and the current build) provides separate 1 bit balck channel
+ BOOL SupportSeparateBlack();
+
+ //!Returns the width as set by SetPixelsPerRow.
+ unsigned int InputPixelsPerRow() { return InputWidth; }
+
+ //! Returns the current setting for output width.
+ unsigned int OutputPixelsPerRow() { return OutputWidth; }
+
+ //! Returns the currently set paper size.
+ PAPER_SIZE GetPaperSize();
+
+ //! Returns TRUE if a photo tray is present in printer.
+ BOOL PhotoTrayPresent(BOOL bQueryPrinter);
+
+ //!Returns current state of phototray, one of UNKNOWN, DISENGAGED or ENGAGED.
+
+ PHOTOTRAY_STATE PhotoTrayEngaged (BOOL bQueryPrinter);
+
+ //! Returns TRUE if a hagaki feed is present in printer.
+ BOOL HagakiFeedPresent(BOOL bQueryPrinter);
+
+#ifdef APDK_AUTODUPLEX
+ //!Returns TRUE if duplexer and hagaki feed (combined) unit is present in printer.
+
+ BOOL HagakiFeedDuplexerPresent(BOOL bQueryPrinter);
+#endif
+
+ const char* PrinterModel();
+ const char* PrintertypeToString(PRINTER_TYPE pt); // returns string for use in UI
+
+ unsigned int EffectiveResolutionX(); // res we need in current mode
+ unsigned int EffectiveResolutionY(); // res we need in current mode
+
+ // get settings pertaining to the printer
+ // note:these return zero if no printer selected
+ // all results in inches
+ float PrintableWidth();
+ float PrintableHeight();
+ float PhysicalPageSizeX();
+ float PhysicalPageSizeY();
+ float PrintableStartX();
+ float PrintableStartY();
+
+ // SPECIAL API -- NOT TO BE USED IN CONNECTION WITH JOB
+ DRIVER_ERROR SendPrinterReadyData(BYTE* stream, unsigned int size);
+
+ DeviceRegistry* DR; // unprotected for replay system
+
+ DRIVER_ERROR SetMediaSource(MediaSource num);
+
+ // GetMediaSource
+ //! Return input media source bin
+ /*!
+ Used to get the bin number from which media will be loaded by the printer. This
+ is relevant for those printers that have multiple input bins. All other printers
+ will ignore the bin number. The typical bin numbers are
+ 1 - Upper Tray
+ 4 - Lower Tray
+ 7 - Auto Select
+ Any value between 1 and 50 is valid where there are more than 2 trays.
+ *****************************************************************************
+ */
+ MediaSource GetMediaSource() { return m_MediaSource; }
+
+ void SetMediaSubtype (int iMediaSubtype)
+ {
+ m_iMediaSubtype = iMediaSubtype;
+ }
+ int GetMediaSubtype ()
+ {
+ return m_iMediaSubtype;
+ }
+ void SetMechOffset (int iMechOffset)
+ {
+ m_iMechOffset = iMechOffset;
+ }
+
+ // needed for testing
+// PEN_TYPE GetCompatiblePen(unsigned int num); // get CompatiblePens of Printer
+
+#ifdef APDK_AUTODUPLEX
+ //! Set two-sided printing option.
+ /*! This has no effect on printers that do not support an automatic duplexer mechanism.
+ Two sided-printing option can be one of
+ DUPLEXMODE_NONE - one sided printing
+ DUPLEXMODE_TABLET - binding on short edge
+ DUPLEXMODE_BOOK - binding on long edge
+ *****************************************************************************
+ */
+ BOOL SelectDuplexPrinting (DUPLEXMODE duplexmode);
+
+ //! Returns current setting for two-sided printing option
+ DUPLEXMODE QueryDuplexMode ();
+
+ //! Does back page needs to be rotated?
+ /*! When automatic two-sided printing is enabled for long edge binging, application may have to
+ rotate the back page by 180 degrees.
+ *****************************************************************************
+ */
+ BOOL RotateImageForBackPage ();
+#endif
+
+#ifdef APDK_EXTENDED_MEDIASIZE
+ BOOL SetCustomSize (float width, float height);
+#endif
+ unsigned int GetCurrentDyeCount();
+ PEN_TYPE GetDefaultPenSet();
+ PEN_TYPE GetInstalledPens();
+
+ void ResetIOMode (BOOL bDevID, BOOL bStatus);
+
+ //! Get number of copies to print
+ int GetCopyCount ()
+ {
+ return m_iCopyCount;
+ }
+
+ //! Set number of copies to print.
+ /*! Copy count has no effect on printers that do not support this feature.
+ Typically, most LaserJet printers support multiple copies, whereas, Inkjets do not.
+ *****************************************************************************
+ */
+ void SetCopyCount (int iNumCopies)
+ {
+ m_iCopyCount = iNumCopies;
+ }
+ DRIVER_ERROR SetPrinterHint (PRINTER_HINT eHint, int iValue);
+
+ //! Returns TRUE if borderless printing is enabled, FALSE otherwise
+ BOOL IsBorderless () { return bDoFullBleed; }
+
+ //! SetMediaType
+ /*! Typically, media type is bound to a print mode and is set when a printmode is
+ selected. This is because the mediatype, printmode combination affects colormatching
+ and requires a different colormap data. Some printers do colormatching in firmware
+ and may support multiple mediatypes for a selected printmode.
+ Returns NO_ERROR if requested mediatype is supported for the selected printmode, otherwise
+ returns WARN_PRINTMODE_MISMATCH and the mediatype remains unchanged in the printmode.
+ *****************************************************************************
+ */
+ DRIVER_ERROR SetMediaType (MEDIATYPE eMediaType);
+ int GetJobAttributes (int getWhat);
+ void SetJobAttributes (JobAttributes *pJA);
+
+private:
+
+ SystemServices* pSS;
+ Printer* thePrinter;
+ PrintMode* CurrentMode;
+// unsigned int CurrentModeIndex;
+
+ unsigned int PageWidth; // pixel width of printable area
+ unsigned int InputWidth;
+ unsigned int OutputWidth; // after scaling
+ PAPER_SIZE thePaperSize;
+ BOOL UsePageWidth;
+
+ //!\internal
+ struct PaperSizeMetrics
+ {
+ // all values are in inches
+ float fPhysicalPageX;
+ float fPhysicalPageY;
+ float fPrintablePageX;
+ float fPrintablePageY;
+ float fPrintableStartY;
+ };
+ static const PaperSizeMetrics PSM[MAX_PAPER_SIZE]; // the size of this struct is directly related to the PAPER_SIZE enum
+
+ // internal versions of public functions
+ float printablewidth();
+ float printableheight();
+ unsigned int printerunitsY();
+
+ DRIVER_ERROR QualitySieve(ModeSet*& Modes, QUALITY_MODE& eQuality);
+ DRIVER_ERROR SetCompGrayMode(PrintMode*& resPM);
+ BOOL ModeAgreesWithHardware(BOOL QueryPrinter);
+
+ DRIVER_ERROR setpixelsperrow(unsigned int InputPixelsPerRow,
+ unsigned int OutputPixelsPerRow);
+ DRIVER_ERROR selectprintmode(const unsigned int index);
+
+ BOOL MadeCompGrayMode;
+
+ BOOL bDoFullBleed;
+ BOOL InputIsPageWidth;
+
+ // code savers
+ //DRIVER_ERROR SetMode(unsigned int ModeIndex);
+ DRIVER_ERROR SelectDefaultMode();
+ unsigned int GUITopMargin();
+/*
+ // we take the hard unprintable top to be .04 (see define in Header.cpp)
+ // so here start out at 1/3"-.04" = 88 if dpi=300
+ { return 88 * (EffectiveResolutionY() / 300); }
+*/
+
+ MEDIATYPE m_mtReqMediaType; // for use by Header - Malibu defect
+ MEDIATYPE m_eMediaType;
+
+#ifdef APDK_AUTODUPLEX
+ DUPLEXMODE DuplexMode;
+#endif
+
+#ifdef APDK_EXTENDED_MEDIASIZE
+ float CustomWidth; // custom physical page width
+ float CustomHeight; // custom physical page height
+#endif
+
+ MediaSource m_MediaSource;
+
+ JobAttributes *m_job_attributes;
+
+#ifdef APDK_CAPTURE
+ void Capture_PrintContext(unsigned int InputPixelsPerRow, unsigned int OutputPixelsPerRow,
+ PAPER_SIZE ps,IO_MODE IOMode);
+ void Capture_SelectDevice(const PRINTER_TYPE Model);
+ void Capture_SelectDevice(const char* szDevIdString);
+ void Capture_SelectPrintMode(unsigned int modenum);
+ void Capture_SetPaperSize(PAPER_SIZE ps, BOOL bFullBleed);
+ void Capture_RealizeFont(const unsigned int ptr,const unsigned int index,const BYTE bSize,
+ const TEXTCOLOR eColor=BLACK_TEXT,
+ const BOOL bBold=FALSE,const BOOL bItalic=FALSE,
+ const BOOL bUnderline=FALSE);
+ void Capture_SetPixelsPerRow(unsigned int InputPixelsPerRow,unsigned int OutputPixelsPerRow);
+ void Capture_SetInputResolution(unsigned int Res);
+ void Capture_dPrintContext();
+
+#endif
+
+ int m_iCopyCount;
+
+ int m_iMediaSubtype;
+ int m_iMechOffset;
+}; //PrintContext
+
+APDK_END_NAMESPACE
+
+#endif //APDK_PRINTCONTEXT_H
diff --git a/prnt/hpijs/context2.cpp b/prnt/hpijs/context2.cpp
new file mode 100644
index 0000000..92a0089
--- /dev/null
+++ b/prnt/hpijs/context2.cpp
@@ -0,0 +1,2141 @@
+/*****************************************************************************\
+ context.cpp : Implimentation for the PrintContext class
+
+ Copyright (c) 1996 - 2008, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+// PrintContext
+
+#include "header.h"
+#include "pmselect.h"
+#include "printerfactory.h"
+
+#include "halftoner.h"
+#include "colormatch.h"
+//#include "bug.h"
+
+APDK_BEGIN_NAMESPACE
+extern ColorMatcher* Create_ColorMatcher
+(
+ SystemServices* pSys,
+ ColorMap cm,
+ unsigned int DyeCount,
+ unsigned int iInputWidth
+);
+APDK_END_NAMESPACE
+
+APDK_BEGIN_NAMESPACE
+
+extern PAPER_SIZE MediaSizeToPaper(MediaSize msize);
+extern MediaSize PaperToMediaSize(PAPER_SIZE psize);
+
+// this array is directly linked to PAPER_SIZE enum
+// note: fPrintablePageY is related to fPrintableStartY to allow for a 2/3" bottom margin.
+// If fPrintableStartY is altered, fPrintablePageY should be correspondingly updated.
+//
+// Changed PrintableStartY from 1/3" to 1/8". Also changed PrintablePageY to allow
+// a 1/2" bottom margin. Note, on the 6xx series bottom margin is .46" for black and .587"
+// for color. So, for 6xx series color printing to within 1/2" bottom margin is not guaranteed. des
+const PrintContext::PaperSizeMetrics PrintContext::PSM[MAX_PAPER_SIZE] =
+{
+ //PhysicalPageX, PhysicalPageY, PrintablePageX, PrintablePageY, PrintableStartY
+ // LETTER
+ {
+ (float)8.5, (float)11.0, (float)8.0, (float)10.375, (float)0.125
+ },
+
+ // A4 = 210 x 297mm = 8.27 x 11.69 in.
+ {
+ (float)8.27, (float)11.69, (float)8.0, (float)11.065, (float)0.125
+ },
+
+ // LEGAL
+ {
+ (float)8.5, (float)14.0, (float)8.0, (float)13.375, (float)0.125
+ },
+
+ // PHOTO_SIZE
+ // Corresponds to 4x6" photo paper used in the 9xx series photo tray.
+ // The apparent 1/8" bottom margin is allowed because of a pull-off tab on the media.
+ {
+ (float)4.0, (float)6.0, (float)3.75, (float)5.75, (float)0.125
+ },
+
+ // A6 = 105mm x 148mm = 4.13 x 5.83 in.
+ // postcards -- dimensions are half A4
+ {
+ (float)4.13, (float)5.83, (float)3.88, (float)5.205, (float)0.125
+ },
+
+ // CARD_4x6 - 4x6 index card/photo without tear-off tab
+ {
+ (float)4.0, (float)6.0, (float)3.75, (float)5.375, (float)0.125
+ },
+
+ // B4 = 257 x 364 mm. = 10.126 x 14.342 in.
+ {
+ (float)10.126, (float)14.342, (float)9.626, (float)13.717, (float)0.125
+ },
+
+ // B5 = 182 x 257 mm. = 7.17 x 10.126 in.
+ {
+ (float)7.17, (float)10.126, (float)6.67, (float)9.5, (float)0.125
+ },
+
+ // OUFUKU Oufuku-Hagaki = 148 x 200 mm = 5.83 x 7.87 in.
+ {
+ (float)5.83, (float)7.87, (float)5.33, (float)7.37, (float)0.125
+ },
+
+ // HAGAKI = 100 x 148mm = 3.94 x 5.83 in.
+ {
+ (float)3.94, (float)5.83, (float)3.69, (float)5.58, (float)0.125
+ },
+
+ // A6_WITH_TEAR_OFF_TAB = 105mm x 148mm = 4.13 x 5.83 in.
+ {
+ (float)4.13, (float)5.83, (float)3.88, (float)5.705, (float)0.125
+ },
+#ifdef APDK_EXTENDED_MEDIASIZE
+ // A3 = 294mm x 419.8mm = 11.69 x 16.53 in.
+ {
+ (float)11.69, (float)16.53, (float)11.29, (float)15.905, (float)0.125
+ },
+
+ // A5 = 148mm x 210mm = 5.83 x 8.27 in.
+ {
+ (float)5.83, (float)8.27, (float)5.58, (float)7.645, (float)0.125
+ },
+
+ // LEDGER = 11 x 17 in.
+ {
+ (float)11.00, (float)17.00, (float)10.6, (float)16.375, (float)0.125
+ },
+
+ // SUPERB = 13 x 19 in.
+ {
+ (float)13.00, (float)19.00, (float)12.6, (float)18.375, (float)0.125
+ },
+
+ // EXECUTIVE = 7.25 x 10.5 in.
+ {
+ (float)7.25, (float)10.5, (float)6.75, (float)9.875, (float)0.125
+ },
+
+ // FLSA = 8.5 x 13 in.
+ {
+ (float)8.5, (float)13, (float)8.00, (float)12.375, (float)0.125
+ },
+
+ // CUSTOM_SIZE
+ {
+ (float)0.0, (float)0.0, (float)0.0, (float)0.0, (float)0.125
+ },
+
+ // No. 10 Envelope (4.12 x 9.5 in.)
+ {
+ (float)4.12, (float)9.5, (float)3.875, (float)8.875, (float)0.125
+ },
+
+ // A2 Envelope (4.37 x 5.75 in.)
+ {
+ (float)4.37, (float)5.75, (float)4.12, (float)5.125, (float)0.125
+ },
+
+ // C6 Envelope (114 x 162 mm)
+ {
+ (float)4.49, (float)6.38, (float)4.24, (float)5.755, (float)0.125
+ },
+
+ // DL Envelope (110 x 220 mm)
+ {
+ (float)4.33, (float)8.66, (float)4.08, (float)8.035, (float)0.125
+ },
+
+ // Japanese Envelope #3 (120 x 235 mm)
+ {
+ (float)4.72, (float)9.25, (float)4.47, (float)8.625, (float)0.125
+ },
+
+ // Japanese Envelope #4 (90 x 205 mm)
+ {
+ (float)3.54, (float)8.07, (float)3.29, (float)7.445, (float)0.125
+ },
+
+#endif // APDK_EXTENDED_MEDIASIZE
+
+ // PHOTO_5x7 = 5in x 7in = 127 mm x 177.8 mm
+ {
+ (float) 5.0, (float) 7.0, (float) 4.75, (float) 6.375, (float) 0.125
+ },
+ // CDDVD_80 = 80 mm (3 inch) CD/DVD
+ {
+ (float) 3.3, (float) 3.3, (float) 3.3, (float) 3.3, (float) 0.0
+ },
+ // CDDVD_120 = 120 mm (5 inch) CD/DVD
+ {
+ (float) 5.0, (float) 5.0, (float) 5.0, (float) 5.0, (float) 0.0
+ }
+
+#ifdef APDK_EXTENDED_MEDIASIZE
+ // PHOTO_4x8 - 4x8 panorama photo
+ ,{
+ (float) 4.0, (float) 6.0, (float) 3.75, (float) 7.75, (float) 0.125
+ },
+
+ // PHOTO_4x12 - 4x12 panorama photo
+ {
+ (float) 4.0, (float) 12.0, (float) 3.75, (float) 11.75, (float) 0.125
+ },
+ // L - Japanese Card, 3.5 x 5 in
+ {
+ (float) 3.5, (float) 5.0, (float) 3.25, (float) 4.75, (float) 0.125
+ }
+#endif // APDK_EXTENDED_MEDIASIZE
+
+}; //PSM
+
+
+//PrintContext::PrintContext
+//! Construct a context for the print device
+/*!
+In the normal case where bidirectional communication was established by
+SystemServices, successful construction results in instantiation of the
+proper Printer class; otherwise client will have to complete the process
+with a subsequent call to SelectDevice. The next two parameters are optional.
+In the case where InputPixelsPerRow has the default setting of zero, the value
+of printablewith will be used. If the desired print mode is known in advance,
+(i.e. The user won't be selecting a print mode at any point) and the image
+size is also known, then the print mode can be selected at during construction.
+The reason why the last four parameters were added was because if InputPixelsPerRow
+and OutputPixelsPerRow were in a resolution greater than 300 dpi, it might
+cause the constructor to set constructor_error to ILLEGAL_COORDS. The constructor
+checks to see if the OutputPixelsPerRow will fit on the default print mode's
+page width (via a call to SelectPrintMode where the real check is done),
+and if it doesn't fit, the error was given even if it was still a legal output size in
+the resolution. Using the last four parameters will ensure that the image
+size is checked using the proper print mode.
+******************************************************************************/
+PrintContext::PrintContext
+(
+ SystemServices * pSysServ, //!< Your previously created SystemServices
+ unsigned int InputPixelsPerRow, //!< Input pixel witdth per row (do not exceed pagewidth * resolution)
+ unsigned int OutputPixelsPerRow, //!< Usually set to 0 (zero) for scaling up to pagewidth
+ PAPER_SIZE ps, //!< Paper size that will be used
+ QUALITY_MODE eQuality, //!< Quality of output: DRAFT, NORMAL, BEST (default NORMAL)
+ MEDIATYPE eMedia, //!< Media type: PLAIN, PREMIUM, PHOTO (default PLAIN)
+ COLORMODE eColorMode, //!< Color Mode: GREY_K, GREY_CMY, COLOR (default COLOR)
+ BOOL bDeviceText //!< Support Device Text: TRUE, FALSE (dafault FALSE)
+) :
+ constructor_error(NO_ERROR),
+ pSS(pSysServ),
+ thePrinter((Printer*)NULL),
+ CurrentMode((PrintMode*)NULL),
+ InputWidth(InputPixelsPerRow),
+ OutputWidth(OutputPixelsPerRow),
+ thePaperSize(ps),
+ MadeCompGrayMode(FALSE)
+#ifdef APDK_AUTODUPLEX
+ , DuplexMode(DUPLEXMODE_NONE)
+#endif
+#ifdef APDK_EXTENDED_MEDIASIZE
+ , CustomWidth(0.0),
+ CustomHeight(0.0)
+#endif
+
+{
+#ifdef APDK_CAPTURE
+ Capture_PrintContext(InputPixelsPerRow,OutputPixelsPerRow,ps,pSS->IOMode);
+#endif
+
+ DR = pSS->DR;
+
+ m_job_attributes = NULL;
+ bDoFullBleed = FALSE;
+
+ UsePageWidth = (OutputPixelsPerRow == 0); // flag to set width to width of page
+ InputIsPageWidth = (InputPixelsPerRow == 0); // InputWidth defaults to current page width
+
+ m_mtReqMediaType = eMedia; // for use by Header - Malibu defect
+
+ m_MediaSource = sourceTrayAuto;
+
+ m_iCopyCount = 1;
+
+ if (!pSS->IOMode.bDevID) // SystemServices couldn't establish good DevID
+ {
+ // changed - DWK & JLM setpixelsperrow always returns NO_ERROR when CurrentMode
+ // is NULL - which it always is at this point.
+ //constructor_error = setpixelsperrow(InputWidth,OutputWidth);
+
+ return; // leave in incomplete state - constructor_error = NO_ERROR
+ }
+
+ if ( (constructor_error = DR->SelectDevice(pSS->strModel,&(pSS->VIPVersion),pSS->strPens,pSS)) != NO_ERROR)
+ {
+ if (constructor_error == UNSUPPORTED_PRINTER)
+ {
+ pSS->DisplayPrinterStatus(DISPLAY_PRINTER_NOT_SUPPORTED);
+ //wait to read message
+ while (pSS->BusyWait(500) != JOB_CANCELED)
+ {; // nothing.....
+ }
+ return;
+ }
+ else
+ {
+ DBG1("PrintContext - error in SelectDevice\n");
+ return;
+ }
+ }
+
+ // Device selected... now instantiate a printer object
+ if ( (constructor_error = DR->InstantiatePrinter(thePrinter,pSS)) != NO_ERROR)
+ {
+ DBG1("PrintContext - error in InstantiatePrinter\n");
+ return;
+ }
+
+
+ pSS->AdjustIO(thePrinter->IOMode);
+
+ //at this point, papersize has already been set. However, if there is a manditory papersize
+ //(like one enforced by a photo tray) we need to check to see if the size the user
+ //wants is smaller than or equal to the papersize that is manditory. DWK
+ PAPER_SIZE mandatoryPS = thePrinter->MandatoryPaperSize();
+ if (mandatoryPS != UNSUPPORTED_SIZE)
+ {
+ if ((PSM[mandatoryPS].fPhysicalPageX < PSM[thePaperSize].fPhysicalPageX))
+ {
+ // they asked for a paper size larger then the mandatory size
+ thePaperSize = mandatoryPS; //set the papersize to the manditory size -DWK
+ } //end if
+
+ }//end if
+
+ thePrinter->SetPMIndices();
+
+ constructor_error = SelectPrintMode(eQuality, eMedia, eColorMode, bDeviceText);
+
+ CERRCHECK;
+
+ constructor_error = thePrinter->CheckInkLevel();
+} //PrintContext
+
+
+
+//CurrentPrintMode
+//! Returns the current print mode index
+/*!
+******************************************************************************/
+unsigned int PrintContext::CurrentPrintMode()
+{
+ ASSERT(CurrentMode); // It can't be NULL
+ if (CurrentMode != NULL)
+ {
+ return CurrentMode->myIndex;
+ }
+ else
+ {
+ return 0; // will be confused with Mode 0
+ }
+} //CurrentPrintMode
+
+/*
+DRIVER_ERROR PrintContext::SetMode(unsigned int ModeIndex)
+{
+ if (ModeIndex>=GetModeCount())
+ return INDEX_OUT_OF_RANGE;
+
+ CurrentModeIndex=ModeIndex;
+ CurrentMode = thePrinter->GetMode(ModeIndex);
+ if (CurrentMode==NULL)
+ return SYSTEM_ERROR;
+
+ return NO_ERROR;
+}
+*/
+
+
+//SelectDefaultMode
+//! Selects the default print mode for the printer
+/*!
+
+\return DRIVER_ERROR
+
+\sa SelectPrintMode
+******************************************************************************/
+DRIVER_ERROR PrintContext::SelectDefaultMode()
+{
+// return SelectPrintMode(QUALITY_NORMAL, MEDIA_PLAIN, COLOR, FALSE);
+ DRIVER_ERROR err = SelectPrintMode (QUALITY_NORMAL, MEDIA_PLAIN, COLOR, FALSE);
+ if (err == WARN_MODE_MISMATCH)
+ {
+ QUALITY_MODE eq;
+ MEDIATYPE em;
+ BOOL bText;
+ COLORMODE eColorMode = COLOR;
+ GetPrintModeSettings (eq, em, eColorMode, bText);
+ if (eColorMode == GREY_K)
+ err = NO_ERROR;
+ }
+ return err;
+} //SelectDefaultMode
+
+
+//SelectPrintMode
+//!Select a print mode based on independent parameters
+/*!
+Select a print mode base on Quality, Media, ColorMode, and support of
+DeviceText. Method may change parameters depending on what the printer
+supports.
+\sa GetPrintModeSettings
+******************************************************************************/
+DRIVER_ERROR PrintContext::SelectPrintMode
+(
+ QUALITY_MODE eQuality, //!< Quality of output: DRAFT, NORMAL, BEST
+ MEDIATYPE eMedia, //!< Media type: PLAIN, PREMIUM, PHOTO
+ COLORMODE eColorMode, //!< Color Mode: GREY_K, GREY_CMY, COLOR
+ BOOL bDeviceText //!< Support Device Text: TRUE, FALSE
+
+)
+{
+ if (thePrinter == NULL)
+ {
+ return NO_PRINTER_SELECTED;
+ }
+
+ // variables of printmode container class
+ ModeSet* Modes;
+ ModeSet* tempModeSet;
+ ModeSet* oldModeSet;
+
+ // save so we can return warning if any changed
+ QUALITY_MODE requestedQuality = eQuality;
+ MEDIATYPE requestedMedia = eMedia;
+ COLORMODE requestedColor = eColorMode;
+ BOOL requestedText = bDeviceText;
+
+ PEN_TYPE pens;
+ DRIVER_ERROR err;
+ PrintMode* tmpPM = NULL;
+
+// This is for use by Header - full-bleed and autodetect defect in Malibu
+
+ m_mtReqMediaType = eMedia;
+
+// cleanup in case of repeated calls to SPM using same PC
+// might have extra compgraymode hanging around
+ if (MadeCompGrayMode)
+ {
+ pSS->FreeMem((BYTE*)CurrentMode->cmap.ulMap1);
+ delete CurrentMode;
+ CurrentMode = NULL;
+ MadeCompGrayMode = FALSE;
+ }
+
+// initialize list of possible modes based on Printer
+ Modes = new ModeSet;
+ unsigned int mc = thePrinter->GetModeCount();
+ for (unsigned int i = 0; i < mc; i++)
+ {
+ if (Modes->Append(thePrinter->GetMode(i)))
+ {
+ return ALLOCMEM_ERROR;
+ }
+ }
+
+ pens = thePrinter->ActualPens(); // either set through bidi or explicitly
+
+ if (pens == NO_PEN) // unidi and no penset call
+ {
+ thePrinter->SetPens(thePrinter->DefaultPenSet());
+ }
+
+ tempModeSet = Modes->PenCompatibleSubset(pens);
+
+ if (tempModeSet == NULL)
+ {
+ return ALLOCMEM_ERROR;
+ }
+
+ if (tempModeSet->IsEmpty()) // should never get here
+ {
+ delete Modes;
+ delete tempModeSet;
+ ASSERT(0); // If we should never get here then assert when debugging
+ return SYSTEM_ERROR;
+ }
+ else // we found modes for the specified penset
+ {
+ delete Modes;
+ Modes = tempModeSet;
+ }
+
+ // colormode adjustment
+ if (pens == BLACK_PEN || pens == MDL_PEN)
+ {
+ eColorMode = GREY_K;
+ }
+ else if ((pens == COLOR_PEN) && (eColorMode == GREY_K))
+ {
+ eColorMode = GREY_CMY;
+ }
+
+ tempModeSet = Modes->ColorCompatibleSubset(eColorMode);
+
+ if (tempModeSet == NULL)
+ {
+ return ALLOCMEM_ERROR;
+ }
+
+ if (tempModeSet->IsEmpty())
+ {
+ delete tempModeSet;
+ // may be lacking GREY_CMY
+ if (eColorMode == GREY_CMY)
+ {
+ if (thePrinter->CMYMap != NULL)
+ {
+ err=SetCompGrayMode(tmpPM); // tmpPM points to new map
+ ERRCHECK; // possible memory leak ???
+ Modes->Append(tmpPM);
+ }
+ else // can't do it without a CMYMap, so change colormode
+ if (pens == BLACK_PEN)
+ {
+ eColorMode = GREY_K;
+ }
+ else
+ {
+ eColorMode = COLOR;
+ }
+ }
+ else
+ {
+ return SYSTEM_ERROR;
+ }
+ tempModeSet = Modes->ColorCompatibleSubset(eColorMode);
+
+ if (tempModeSet == NULL)
+ {
+ return ALLOCMEM_ERROR;
+ }
+ }
+
+ delete Modes;
+ if(tempModeSet->IsEmpty())
+ {
+ delete tempModeSet;
+ return SYSTEM_ERROR;
+ }
+
+ Modes = tempModeSet;
+ tempModeSet = NULL;
+
+ // set is nonempty because every printer has virtual
+ // black and composite-black modes in addition to some kind of color
+
+ /// note: this order accords with the decision that text-support trumps quality;
+ /// to make quality trump fonts, move quality-selection code here
+
+ // rule out gui-only if devicetext requested
+ if (bDeviceText)
+ {
+ tempModeSet = Modes->FontCapableSubset();
+ if (tempModeSet == NULL)
+ {
+ return ALLOCMEM_ERROR;
+ }
+
+ if (tempModeSet->IsEmpty())
+ {
+ delete tempModeSet;
+ tempModeSet = NULL;
+ bDeviceText = FALSE; // change value of reference parameter
+ }
+ else // we found font-capable modes
+ {
+ delete Modes;
+ Modes = tempModeSet;
+ tempModeSet = NULL;
+ }
+ }
+
+ // find best fit for quality setting
+ // 1. look for exact match
+ // 2. if not, look for normal
+ // 3. if not, use anything
+
+ oldModeSet = new ModeSet(Modes); // remember in case of media mismatch
+ if (oldModeSet == NULL)
+ {
+ return ALLOCMEM_ERROR;
+ }
+
+ // find best fit for quality
+ err = QualitySieve(Modes, eQuality); // this changes Modes list
+ ERRCHECK;
+
+ // check compatibility of quality and media
+ // note: this implementation assumes media trumps quality
+ // to make quality trump media, then don't let mediatest whittle down to nothing
+
+ tempModeSet = Modes->MediaSubset(eMedia);
+ if (tempModeSet == NULL)
+ {
+ return ALLOCMEM_ERROR;
+ }
+ if (tempModeSet->IsEmpty())
+ { // try changing quality to fit media
+ delete tempModeSet;
+ // we are retrieving oldModeSet, saved before quality sieve
+ tempModeSet = oldModeSet->MediaSubset(eMedia);
+ if (tempModeSet == NULL)
+ {
+ return ALLOCMEM_ERROR;
+ }
+ if (tempModeSet->IsEmpty())
+ // there was never a mode that matched media, so change media
+ {
+ delete tempModeSet;
+ eMedia = Modes->HeadPrintMode()->GetMediaType();
+ }
+ else // we found modes with the specified mediatype
+ {
+ eQuality = tempModeSet->HeadPrintMode()->GetQualityMode();
+ delete Modes;
+ Modes = tempModeSet;
+ // but now we may have to apply quality test again
+ if (Modes->Size() > 1)
+ {
+ err = QualitySieve(Modes,eQuality); // changes modes
+ ERRCHECK;
+ }
+ }
+ }
+ else // we found modes with specified mediatype
+ {
+ delete Modes;
+ Modes = tempModeSet;
+ }
+
+ delete oldModeSet;
+ // because there are no printers having multiple modes with
+ // all 4 parameters the same, we are down to a single result
+ // (check this!)
+ if (Modes->Size() != 1)
+ {
+ ASSERT(0); // this is is not supposed to happen
+ return SYSTEM_ERROR;
+ }
+
+ CurrentMode = Modes->HeadPrintMode();
+ if (CurrentMode == tmpPM)
+ {
+ MadeCompGrayMode=TRUE; // remember to delete it in PC destructor
+ }
+
+ delete Modes;
+
+ //need to make sure that print context checks to see if size of image is ok for paper we want to use DWK
+
+ unsigned int iRasterWidth = InputIsPageWidth ? 0 : InputWidth;
+ err = setpixelsperrow(iRasterWidth, OutputWidth);
+ if(err != NO_ERROR)
+ {
+ return err;
+ }//end if
+
+ // return warning if any of the first 3 params changed,
+ // or if text was requested but not available
+
+ if ((requestedColor != eColorMode) ||
+ (((requestedMedia != eMedia) ||
+ (requestedQuality != eQuality)) && CurrentMode->medium != mediaAuto) ||
+ (requestedText && !bDeviceText))
+ {
+ return WARN_MODE_MISMATCH;
+ }
+
+ return NO_ERROR;
+} //SelectPrintMode
+
+
+//GetPrintModeSettings
+//! Returns pointer to print mode settings
+/*!
+Used to determine the currently selected print mode. Print mode could be
+different then requested values in SelectePrintMode because the printer may
+not be able to support the requested combination. In that case the
+PrintContext will make an intelegent choice about changing the print mode.
+This method can be used to determin the differences between the requested mode
+and the selected mode.
+******************************************************************************/
+DRIVER_ERROR PrintContext::GetPrintModeSettings
+(
+ QUALITY_MODE& eQuality, //!< Quality of output: DRAFT, NORMAL, BEST
+ MEDIATYPE& eMedia, //!< Media type: PLAIN, PREMIUM, PHOTO
+ COLORMODE& eColorMode, //!< Color Mode: GREY_K, GREY_CMY, COLOR
+ BOOL& bDeviceText //!< Support Device Text: TRUE, FALSE
+)
+{
+ if (CurrentMode == NULL)
+ {
+ return SYSTEM_ERROR;
+ }
+ else
+ {
+ CurrentMode->GetValues(eQuality, eMedia, eColorMode, bDeviceText);
+ }
+ return NO_ERROR;
+} //GetPrintModeSettings
+
+
+/*!
+Sets the pen set to be used (much match what is actually in the printer).
+For use in uni-di mode.
+*/
+DRIVER_ERROR PrintContext::SetPenSet
+(
+ PEN_TYPE ePen
+)
+{
+ if (thePrinter == NULL)
+ {
+ return NO_PRINTER_SELECTED;
+ }
+ return thePrinter->SetPens(ePen);
+} //SetPenSet
+
+
+BOOL PrintContext::ModeAgreesWithHardware
+(
+ BOOL QueryPrinter
+)
+// no check for null printer
+{
+ BOOL agree = FALSE;
+ PEN_TYPE ePen;
+/*
+ This should not be nessesarry any more. Each printer class now has a
+ DefaultPenSet method that sets the pens to what the printer is shipped
+ with for the unidi case. If that method has been called (which it should
+ be in the unidi case then ModeAgreesWithHardware will work properly.
+
+ Dave S. discovered this does not work yet so we must leave this here until
+ another version and we are sure it works for unidi mode. - JLM
+*/
+ if (pSS->IOMode.bDevID == FALSE)
+ {
+ return TRUE;
+ }
+
+ if (thePrinter->ParsePenInfo(ePen,QueryPrinter) == NO_ERROR)
+ {
+
+ for (int i = 0; i < MAX_COMPATIBLE_PENS; i++)
+ {
+ if (ePen == CurrentMode->CompatiblePens[i])
+ {
+ agree = TRUE;
+ }
+ }
+ }
+
+ return agree;
+} //ModeAgreesWithHardware
+
+
+BOOL PrintContext::PhotoTrayPresent
+(
+ BOOL bQueryPrinter
+)
+{
+ if (thePrinter == NULL)
+ {
+ return FALSE;
+ }
+ else
+ {
+ return thePrinter->PhotoTrayPresent (bQueryPrinter);
+ }
+} //PhotoTrayPresent
+
+//! Return current status of PhotoTray - can be UNKNOWN, ENGAGED or DISENGAGED
+/*!
+******************************************************************************/
+
+PHOTOTRAY_STATE PrintContext::PhotoTrayEngaged
+(
+ BOOL bQueryPrinter
+)
+{
+ if (thePrinter == NULL)
+ {
+ return DISENGAGED;
+ }
+ else
+ {
+ return thePrinter->PhotoTrayEngaged (bQueryPrinter);
+ }
+} //PhotoTrayEngaged
+
+
+//! Returns TRUE if a hagaki feed is present in printer.
+BOOL PrintContext::HagakiFeedPresent(BOOL bQueryPrinter)
+{
+ if (thePrinter == NULL)
+ {
+ return FALSE;
+ }
+ else
+ {
+ return thePrinter->HagakiFeedPresent(bQueryPrinter);
+ }
+}
+
+#ifdef APDK_AUTODUPLEX
+//!Returns TRUE if duplexer and hagaki feed (combined) unit is present in printer.
+BOOL PrintContext::HagakiFeedDuplexerPresent(BOOL bQueryPrinter)
+{
+ if (thePrinter == NULL)
+ {
+ return FALSE;
+ }
+ else
+ {
+ return thePrinter->HagakiFeedDuplexerPresent(bQueryPrinter);
+ }
+}
+#endif
+
+//~PrintContext
+//! Destroy the print device context
+/*!
+******************************************************************************/
+PrintContext::~PrintContext()
+{
+#ifdef APDK_CAPTURE
+Capture_dPrintContext();
+#endif
+DBG1("deleting PrintContext\n");
+
+ if (thePrinter)
+ {
+ delete thePrinter;
+ }
+
+ if (MadeCompGrayMode)
+ {
+ pSS->FreeMem((BYTE*)CurrentMode->cmap.ulMap1);
+ delete CurrentMode;
+ }
+ if (m_job_attributes)
+ {
+ delete [] m_job_attributes;
+ }
+} //~PrintContext
+
+
+///////////////////////////////////////////////////////////////////////
+// Functions to report on device-dependent properties.
+// Note that mixed-case versions of function names are used
+// for the client API; lower-case versions are for calls
+// made by the driver itself, to avoid the APDK_CAPTURE instrumentation.
+///////////////////////////////////////////////////////////////////////
+
+//! Retrieves information about the physical width of the currently selected paper size.
+float PrintContext::PhysicalPageSizeX() // returned in inches
+{
+ if (m_job_attributes)
+ {
+ return m_job_attributes->media_attributes.fPhysicalWidth;
+ }
+
+ if (thePrinter == NULL)
+ {
+ return 0.0;
+ }
+
+ float xOverSpray, yOverSpray;
+ FullbleedType fbType;
+#ifdef APDK_EXTENDED_MEDIASIZE
+ float PhysicalPageX = (thePaperSize == CUSTOM_SIZE) ? CustomWidth : PSM[thePaperSize].fPhysicalPageX;
+#else
+ float PhysicalPageX = PSM[thePaperSize].fPhysicalPageX;
+#endif
+
+ if (bDoFullBleed && (thePrinter->FullBleedCapable (thePaperSize, &fbType, &xOverSpray, &yOverSpray)))
+ {
+ return (PhysicalPageX + xOverSpray);
+ }
+
+ return PhysicalPageX;
+} //PhysicalPageSizeX
+
+
+//! Retrieves information about the physical height of the currently selected paper size.
+float PrintContext::PhysicalPageSizeY() // returned in inches
+{
+ if (m_job_attributes)
+ {
+ return m_job_attributes->media_attributes.fPhysicalHeight;
+ }
+
+ if (thePrinter == NULL)
+ {
+ return 0.0;
+ }
+
+ float xOverSpray, yOverSpray;
+ FullbleedType fbType;
+
+#ifdef APDK_EXTENDED_MEDIASIZE
+ float PhysicalPageY = (thePaperSize == CUSTOM_SIZE) ? CustomHeight : PSM[thePaperSize].fPhysicalPageY;
+#else
+ float PhysicalPageY = PSM[thePaperSize].fPhysicalPageY;
+#endif
+
+ if (bDoFullBleed && (thePrinter->FullBleedCapable (thePaperSize, &fbType, &xOverSpray, &yOverSpray)))
+ {
+ return (PhysicalPageY + yOverSpray);
+ }
+
+ return PhysicalPageY;
+} //PhysicalPageSizeY
+
+
+//! Returns width of printable region in inches.
+float PrintContext::PrintableWidth() // returned in inches
+// for external use
+{
+ return printablewidth();
+} //PrintableWidth
+
+/////////////////////////////////////////////////////////////////////
+// NOTE ON RESOLUTIONS: These functions access ResolutionX[C],
+// where C is the conventional index for Cyan. The assumption
+// is that Res[C]=Res[M]=Res[Y], AND that Res[K]>=Res[C]
+/////////////////////////////////////////////////////////////////////
+
+float PrintContext::printablewidth()
+// for internal use
+{
+ if (m_job_attributes)
+ {
+ return m_job_attributes->media_attributes.fPrintableWidth;
+ }
+
+ if (thePrinter == NULL)
+ {
+ return 0.0;
+ }
+
+ float xOverSpray, yOverSpray;
+ FullbleedType fbType;
+
+#ifdef APDK_EXTENDED_MEDIASIZE
+ float PhysicalPageX = (thePaperSize == CUSTOM_SIZE) ? CustomWidth : PSM[thePaperSize].fPhysicalPageX;
+ float PrintablePageX = (thePaperSize == CUSTOM_SIZE) ? CustomWidth - (float) (0.25+0.25) : PSM[thePaperSize].fPrintablePageX;
+#else
+ float PhysicalPageX = PSM[thePaperSize].fPhysicalPageX;
+ float PrintablePageX = PSM[thePaperSize].fPrintablePageX;
+#endif
+
+ if (bDoFullBleed && (thePrinter->FullBleedCapable (thePaperSize, &fbType, &xOverSpray, &yOverSpray)))
+ {
+ return (PhysicalPageX + xOverSpray);
+ }
+
+ float fMargins[4]; // Left, Right, Top, Bottom margin values
+
+ if (!(thePrinter->GetMargins (thePaperSize, fMargins)))
+ {
+ return PrintablePageX;
+ }
+ return (PhysicalPageX - (fMargins[0] + fMargins[1]));
+} //printablewidth
+
+
+//! Returns height of printable region in inches.
+float PrintContext::PrintableHeight() // returned in inches
+// for external use
+{
+ return printableheight();
+} //PrintableHeight
+
+
+float PrintContext::printableheight()
+// for internal use
+{
+ if (m_job_attributes)
+ {
+ return m_job_attributes->media_attributes.fPrintableHeight;
+ }
+
+ if (thePrinter == NULL)
+ {
+ return 0.0;
+ }
+
+/*
+ * Full bleed printing will be possible only on 3 sides for those media
+ * that do not have a tear-off tab. Currently, 4x6 and A6 are the only two
+ * media sizes that can have tear-off tab. So, for all the media that do not
+ * have a tear-off tab at the bottom, physical height is unaltered, but printable
+ * height is less by bottom margin.
+ * 1/22/03 SY.
+ * Starting from MalibuPlus, 4-edge full bleed is possible for most media. A check
+ * for 4-edge full bleed capability is needed.
+ */
+
+ float xOverSpray, yOverSpray;
+ FullbleedType fbType;
+#ifdef APDK_EXTENDED_MEDIASIZE
+ float PhysicalPageY = (thePaperSize == CUSTOM_SIZE) ? CustomHeight : PSM[thePaperSize].fPhysicalPageY;
+ float PrintablePageY = (thePaperSize == CUSTOM_SIZE) ? CustomHeight - (float) (0.125+0.5) : PSM[thePaperSize].fPrintablePageY;
+#else
+ float PhysicalPageY = PSM[thePaperSize].fPhysicalPageY;
+ float PrintablePageY = PSM[thePaperSize].fPrintablePageY;
+#endif
+
+ if (bDoFullBleed && (thePrinter->FullBleedCapable (thePaperSize, &fbType, &xOverSpray, &yOverSpray)))
+ {
+ if (fbType == fullbleed3EdgeAllMedia ||
+ fbType == fullbleed3EdgeNonPhotoMedia ||
+ fbType == fullbleed3EdgePhotoMedia)
+ return (PhysicalPageY - (float) 0.5);
+ else if (fbType == fullbleed4EdgePhotoMedia ||
+ fbType == fullbleed4EdgeNonPhotoMedia ||
+ fbType == fullbleed4EdgeAllMedia)
+ return (PhysicalPageY + yOverSpray);
+ else
+ return (PhysicalPageY - (float) 0.5);
+ }
+
+/*
+ * REVISIT:
+ * The paper size metrics table assumes a bottom margin of 0.5 inch.
+ * But bottom margin on 6xx based printers is a little larger, ~0.58 inch.
+ * We should do per-printer get bottom margin/left margin to adjust printable height
+ * and printable width.
+ *
+ * (Note, a 0.67 inch bottom margin is now in GetMargins() for 6xx based printers. des)
+ */
+
+ float fMargins[4]; // Left, Right, Top, Bottom margin values
+
+ if (!(thePrinter->GetMargins (thePaperSize, fMargins)))
+ {
+ return PrintablePageY;
+ }
+ return (PhysicalPageY - (fMargins[2] + fMargins[3]));
+} //printableheight
+
+
+//! Returns the left margin or distance from the top edge of the page.
+float PrintContext::PrintableStartX() // returned in inches
+{
+ if (m_job_attributes)
+ {
+ return m_job_attributes->media_attributes.fPrintableStartX;
+ }
+
+ if (thePrinter==NULL)
+ {
+ return 0;
+ }
+
+ float xOverSpray, yOverSpray;
+ FullbleedType fbType;
+ if (bDoFullBleed && (thePrinter->FullBleedCapable (thePaperSize, &fbType, &xOverSpray, &yOverSpray)))
+ {
+ return (0.0);
+ }
+
+ float fMargins[4]; // Left, Right, Top, Bottom margin values
+
+ if ((thePrinter->GetMargins (thePaperSize, fMargins)))
+ {
+ return (fMargins[0]);
+ }
+
+ // this return value centers the printable page horizontally on the physical page
+#ifdef APDK_EXTENDED_MEDIASIZE
+ float physwidth = (thePaperSize == CUSTOM_SIZE) ? CustomWidth : PSM[thePaperSize].fPhysicalPageX;
+#else
+ float physwidth = PSM[thePaperSize].fPhysicalPageX;
+#endif
+ float printable = printablewidth (); // PSM[ thePaperSize ].fPrintablePageX;
+ return ((physwidth - printable) / (float)2.0 );
+} //PrintableStartX
+
+
+//! Returns the top margin or distance from the top edge of the page.
+float PrintContext::PrintableStartY() // returned in inches
+{
+ if (m_job_attributes)
+ {
+ return m_job_attributes->media_attributes.fPrintableStartY;
+ }
+
+ if (thePrinter == NULL)
+ {
+ return 0;
+ }
+
+ float xOverSpray, yOverSpray;
+ FullbleedType fbType;
+
+ if (bDoFullBleed && (thePrinter->FullBleedCapable (thePaperSize, &fbType, &xOverSpray, &yOverSpray)))
+ {
+ return (0.0);
+ }
+
+ float fMargins[4]; // Left, Right, Top, Bottom margin values
+
+ if ((thePrinter->GetMargins (thePaperSize, fMargins)))
+ {
+ return (fMargins[2]);
+ }
+
+ return PSM[ thePaperSize ].fPrintableStartY;
+} //PrintableStartY
+
+
+unsigned int PrintContext::printerunitsY()
+// internal version
+{
+ if (thePrinter == NULL)
+ {
+ return 0;
+ }
+ return CurrentMode->ResolutionY[C];
+} //printerunitsY
+
+
+/*!
+Used outside the context of a Job, to perform functions such as pen cleaning.
+*/
+DRIVER_ERROR PrintContext::PerformPrinterFunction
+(
+ PRINTER_FUNC eFunc
+)
+{
+
+ if (thePrinter == NULL)
+ {
+ return NO_PRINTER_SELECTED;
+ }
+
+ if (eFunc == CLEAN_PEN)
+ {
+ thePrinter->Flush();
+ return thePrinter->CleanPen();
+ }
+
+ DBG1("PerformPrinterFunction: Unknown function\n");
+ return UNSUPPORTED_FUNCTION;
+
+} //PerformPrinterFunction
+
+/*!
+Returns the enum for the next supported model. This method is used when
+bi-directional communication is missing, or for dynamic querying of the
+properties of a given build. This method is presumably called within a loop,
+which will exit when the return value equals UNSUPPORTED. Passing this return
+value to SelectDevice will instantiate this printer object and therefore allow
+further querying of the printer’s capabilities through other methods in
+PrintContext.
+\param familyHandle Caller starts at null; reference variable is incremented
+automatically for next call.
+\return A value matching an element of the enum PRINTER_TYPE, which can then
+be passed to other methods such as SelectDevice.
+*/
+PRINTER_TYPE PrintContext::EnumDevices
+(
+ FAMILY_HANDLE& familyHandle
+) const
+{
+ return pPFI->EnumDevices(familyHandle);
+} //EnumDevices
+
+BOOL PrintContext::PrinterFontsAvailable()
+{
+#if defined(APDK_FONTS_NEEDED)
+ if (thePrinter == NULL)
+ {
+ return SYSTEM_ERROR; // called too soon
+ }
+ // if a printer exists, so does a printmode; but check anyway
+ if (CurrentMode == NULL)
+ {
+ return SYSTEM_ERROR;
+ }
+ return CurrentMode->bFontCapable;
+#else
+ return FALSE;
+#endif
+} //PrinterFontsAvailable
+
+
+/*! Used by client when SystemServices couldn't get DevID.
+This is the place where printer gets instantiated for unidi
+******************************************************************************/
+DRIVER_ERROR PrintContext::SelectDevice
+(
+ const PRINTER_TYPE Model
+)
+{
+#ifdef APDK_CAPTURE
+Capture_SelectDevice(Model);
+#endif
+ DRIVER_ERROR err;
+
+ if (thePrinter) // if printer exists due to bidi or previous call
+ {
+ delete thePrinter;
+ thePrinter = NULL;
+ }
+
+ err = DR->SelectDevice(Model);
+ ERRCHECK;
+
+ if ( (err = DR->InstantiatePrinter(thePrinter,pSS)) != NO_ERROR)
+ {
+ DBG1("PrintContext - error in InstantiatePrinter\n");
+ return err;
+ }
+
+ const char* model;
+ if (strlen(pSS->strModel) > 0) // if bidi so strModel got set in SS
+ {
+ model = pSS->strModel;
+ }
+ else
+ {
+ model = PrintertypeToString(Model); // at least give something
+ }
+
+ pSS->AdjustIO(thePrinter->IOMode, model);
+
+ PAPER_SIZE ps = thePrinter->MandatoryPaperSize();
+ if (ps != UNSUPPORTED_SIZE)
+ {
+ if ((PSM[ps].fPhysicalPageX < PSM[thePaperSize].fPhysicalPageX))
+ {
+ thePaperSize = ps;
+ }
+ }//end if (p != UNSUPPORTED_SIZE)
+
+ if ((err = SelectDefaultMode()) == NO_ERROR)
+ {
+ unsigned int iRasterWidth = InputIsPageWidth ? 0 : InputWidth;
+ err = setpixelsperrow(iRasterWidth, OutputWidth);
+
+ }//end if((err = SelectDefaultMode()) == NO_ERROR)
+
+ thePrinter->SetPMIndices();
+
+ return err;
+} //SelectDevice
+
+
+//SelectDevice
+//!Select device type using device id string returned from printer.
+/*! \internal
+Used by client when SystemServices couldn't get DevID.
+This is the place where printer gets instantiated for unidi.
+This allows a remote system to select a device based on the device ID
+string it has when the APDK cannot communicate with the device. I.E.
+remote rendering.
+\todo Not implemented yet
+******************************************************************************/
+DRIVER_ERROR PrintContext::SelectDevice
+(
+ const char* szDeviceId
+)
+{
+ ASSERT(szDeviceId);
+#ifdef APDK_CAPTURE
+ Capture_SelectDevice(szDeviceId);
+#endif
+
+ DRIVER_ERROR err;
+
+ if (thePrinter) // if printer exists due to bidi or previous call
+ {
+ delete thePrinter;
+ thePrinter = NULL;
+ }
+
+ FAMILY_HANDLE familyHandle = pPFI->FindDevIdMatch(szDeviceId);
+ if (familyHandle == NULL)
+ {
+ return UNSUPPORTED_PRINTER;
+ }
+ if(0 == strnlen((const char *)pSS->strDevID, DevIDBuffSize))
+ {
+ strncpy((char *)pSS->strDevID,szDeviceId,DevIDBuffSize);
+ }
+ thePrinter = pPFI->CreatePrinter (pSS, familyHandle);
+ if (thePrinter->constructor_error != NO_ERROR)
+ {
+ return thePrinter->constructor_error;
+ }
+
+ const char* model = pPFI->GetFamilyName (familyHandle);
+
+ pSS->AdjustIO (thePrinter->IOMode, model);
+
+ PAPER_SIZE ps = thePrinter->MandatoryPaperSize ();
+ if (ps != UNSUPPORTED_SIZE)
+ {
+ if ((PSM[ps].fPhysicalPageX < PSM[thePaperSize].fPhysicalPageX))
+ {
+ thePaperSize = ps;
+ }
+ }//end if (p != UNSUPPORTED_SIZE)
+
+ if ((err = SelectDefaultMode()) == NO_ERROR)
+ {
+ unsigned int iRasterWidth = InputIsPageWidth ? 0 : InputWidth;
+ err = setpixelsperrow(iRasterWidth, OutputWidth);
+
+ }//end if((err = SelectDefaultMode()) == NO_ERROR)
+
+ thePrinter->SetPMIndices();
+
+ return err;
+} //SelectDevice
+
+
+///////////////////////////////////////////////////////////////////////////
+DRIVER_ERROR PrintContext::setpixelsperrow
+(
+ unsigned int InputPixelsPerRow,
+ unsigned int OutputPixelsPerRow
+)
+// internal version without printer check
+{
+ unsigned int baseres;
+ float printwidth;
+
+ if (CurrentMode == NULL)
+ {
+ return NO_ERROR;
+ }
+
+ baseres = CurrentMode->BaseResX;
+ int ResBoost = CurrentMode->BaseResX / CurrentMode->BaseResY;
+
+ if (ResBoost == 0)
+ {
+ ResBoost = 1;
+ }
+ baseres /= ResBoost; // account for expansion for asymmetrical modes (x!=y)
+
+ printwidth = printablewidth();
+
+ PageWidth = (unsigned int)(int)((float)baseres * printwidth + 0.5);
+
+ if (InputPixelsPerRow == 0)
+ {
+ if (UsePageWidth)
+ {
+ InputPixelsPerRow = PageWidth; // by convention
+ }
+ else
+ {
+ return BAD_INPUT_WIDTH;
+ }
+ }
+
+ if (UsePageWidth)
+ {
+ OutputPixelsPerRow = PageWidth; // by convention
+ }
+
+ if (OutputPixelsPerRow > PageWidth)
+ {
+ return OUTPUTWIDTH_EXCEEDS_PAGEWIDTH;
+ }
+ if (InputPixelsPerRow > OutputPixelsPerRow)
+ {
+ return UNSUPPORTED_SCALING; // no downscaling
+ }
+
+ // new value is legal
+ InputWidth = InputPixelsPerRow;
+ OutputWidth = OutputPixelsPerRow;
+
+/*
+ * Adjust OutputWidth to avoid fractional scaling.
+ */
+
+ int iScaleFactor = (int) (((float) OutputWidth / (float) InputWidth) + 0.02);
+ int iDiff = OutputWidth - InputWidth * iScaleFactor;
+ if (iDiff > 0 && iDiff < ((12 * (int) baseres) / 300))
+ {
+ OutputWidth = InputWidth * iScaleFactor;
+ if (OutputWidth > PageWidth)
+ {
+ OutputWidth = PageWidth;
+ }
+ }
+
+ return NO_ERROR;
+} //setpixelsperrow
+
+
+/*!
+Sets the width of all rows on the page.
+*/
+DRIVER_ERROR PrintContext::SetPixelsPerRow
+(
+ unsigned int InputPixelsPerRow,
+ unsigned int OutputPixelsPerRow
+)
+// set new in/out width
+{
+#ifdef APDK_CAPTURE
+ Capture_SetPixelsPerRow(InputPixelsPerRow, OutputPixelsPerRow);
+#endif
+ if (thePrinter == NULL)
+ {
+ return NO_PRINTER_SELECTED;
+ }
+
+ return setpixelsperrow(InputPixelsPerRow, OutputPixelsPerRow);
+} //SetPixelsPerRow
+
+
+//! Returns the horizontal printer resolution to be used for currently selected print mode.
+unsigned int PrintContext::EffectiveResolutionX()
+{
+ if (CurrentMode == NULL)
+ {
+ return 0;
+ }
+
+ return CurrentMode->BaseResX;
+} //EffectiveResolutionX
+
+
+//! Returns the vertical printer resolution to be used for currently selected print mode.
+unsigned int PrintContext::EffectiveResolutionY()
+{
+ if (CurrentMode == NULL)
+ {
+ return 0;
+ }
+
+ return CurrentMode->BaseResY;
+} //EffectiveResolutionY
+
+
+//!\brief Returns number of supported print modes for the select printer model.
+/*!
+\deprecated
+This method will return the number of print modes. The device must support
+(and should return a value of) at least two print modes, gray and normal.
+The general convention for interpretation of the indices is:
+\li 0 = GrayMode - rendering for black pen
+\li 1 = the \i basic mode for this printer, usually targeting plain paper and normal quality
+\li 2,3... = special modes that may be available for this printer
+\note Do not count on mode counts or mode indexes.
+\see SelectPrintMode()
+*/
+unsigned int PrintContext::GetModeCount()
+{
+ if (thePrinter == NULL)
+ {
+ return 0;
+ }
+
+ return thePrinter->GetModeCount();
+} //GetModeCount
+
+
+DRIVER_ERROR PrintContext::selectprintmode
+(
+ const unsigned int index
+)
+{
+ DRIVER_ERROR error = NO_ERROR;
+
+ if (thePrinter == NULL)
+ {
+ return NO_PRINTER_SELECTED;
+ }
+
+ unsigned int count = GetModeCount();
+ if (index > (count-1))
+ {
+ return INDEX_OUT_OF_RANGE;
+ }
+
+ CurrentMode= thePrinter->GetMode(index);
+// CurrentModeIndex = index;
+
+ error = setpixelsperrow(InputWidth,OutputWidth);
+
+ if (error != NO_ERROR) // could be caused by changing to lower-res mode
+ {
+
+ error = setpixelsperrow(0,0); // try again with default
+ }
+
+ if (error > NO_ERROR)
+ {
+ return error;
+ }
+
+ if (!ModeAgreesWithHardware(FALSE))
+ {
+ return WARN_MODE_MISMATCH;
+ }
+ // notice that requested mode is set even if it is wrong for the pen
+
+ return error;
+} //selectprintmode
+
+
+/*!
+\deprecated
+Chooses amongst available print modes. Index of zero is grayscale, index of 1
+is default mode. Use the new SelectePrintMode interface.
+*/
+DRIVER_ERROR PrintContext::SelectPrintMode
+(
+ const unsigned int index
+)
+{
+#ifdef APDK_CAPTURE
+ Capture_SelectPrintMode(index);
+#endif
+ return selectprintmode(index);
+} //SelectPrintMode
+
+
+//! Sets or changes the target paper size for a print job.
+/*!
+This method sets the target paper size to be used by the print job. This
+would have already been set during PrintContext construction, but may be reset
+using this function as long as the job object itself has not yet been created.
+\see PAPER_SIZE for supported paper sizes.
+*/
+DRIVER_ERROR PrintContext::SetPaperSize (PAPER_SIZE ps, BOOL bFullBleed)
+{
+#ifdef APDK_CAPTURE
+ Capture_SetPaperSize(ps, bFullBleed);
+#endif
+
+ DRIVER_ERROR err;
+ if (thePrinter == NULL)
+ {
+ return NO_PRINTER_SELECTED;
+ }
+
+ // Version 3.0.1 logic for allowing mandatory paper size or smaller
+ PAPER_SIZE psMandatoryPS;
+ DRIVER_ERROR psError = NO_ERROR;
+ if ((psMandatoryPS = thePrinter->MandatoryPaperSize()) != UNSUPPORTED_SIZE)
+ {
+#ifdef APDK_EXTENDED_MEDIASIZE
+ float ReqPhysWidth = (ps == CUSTOM_SIZE) ? CustomWidth : PSM[ps].fPhysicalPageX;
+#else
+ float ReqPhysWidth = PSM[ps].fPhysicalPageX;
+#endif
+ if ((ReqPhysWidth > PSM[psMandatoryPS].fPhysicalPageX))
+ // only use the page width. We are not so concerned about the height.
+ // if we use both then we have a problem with paper sizes that shorter,
+ // but wider or taller and narrower - example A6 and PHOTO. If you set
+ // one then the other is invalid of both dimentions are checked. JLM
+// || (PSM[ps].fPhysicalPageY > PSM[thePaperSize].fPhysicalPageY))
+ {
+ // they asked for a paper size larger then the mandatory size
+// return ILLEGAL_PAPERSIZE;
+/*
+ * This is not really an error, but a warning. App may call here again
+ * with a different paper size if they don't like what we forced it to.
+ */
+
+ ps = psMandatoryPS;
+ psError = WARN_ILLEGAL_PAPERSIZE;
+ }
+ }
+ // in all other cases allow the change - even if it is the same
+ thePaperSize = ps;
+
+ bDoFullBleed = bFullBleed;
+
+ unsigned int iRasterWidth = InputIsPageWidth ? 0 : InputWidth;
+ err = setpixelsperrow (iRasterWidth, OutputWidth);
+
+/*
+ * If we forced the requested papersize to the mandatory papersize, return a warning
+ */
+
+ if (err == NO_ERROR && psError != NO_ERROR)
+ {
+ return WARN_ILLEGAL_PAPERSIZE;
+ }
+
+/*
+ * App is requesting full-bleed printing
+ */
+
+ if (err == NO_ERROR && bFullBleed)
+ {
+ float x;
+ FullbleedType fbType;
+
+// Does this printer support full-bleed printing
+
+ if (!(thePrinter->FullBleedCapable (ps, &fbType, &x, &x)))
+ return WARN_FULL_BLEED_UNSUPPORTED;
+
+// Media with tear-off tab can do full-bleed on all 4 sides
+ if (fbType == fullbleedNotSupported)
+ {
+ return WARN_FULL_BLEED_UNSUPPORTED;
+ }
+ else if (fbType == fullbleed3EdgeAllMedia)
+ {
+ return WARN_FULL_BLEED_3SIDES;
+ }
+ else if (fbType == fullbleed3EdgeNonPhotoMedia) // Treat non photo case as all media
+ {
+ return WARN_FULL_BLEED_3SIDES;
+ }
+ else if (fbType == fullbleed3EdgePhotoMedia)
+ {
+ return WARN_FULL_BLEED_3SIDES_PHOTOPAPER_ONLY;
+ }
+ else if (fbType == fullbleed4EdgePhotoMedia)
+ {
+ return WARN_FULL_BLEED_PHOTOPAPER_ONLY;
+ }
+ else if (fbType == fullbleed4EdgeAllMedia)
+ {
+ return NO_ERROR;
+ }
+ else if (fbType == fullbleed4EdgeNonPhotoMedia) // Treat non photo case as all media
+ {
+ return NO_ERROR;
+ }
+ }
+
+ return err;
+} //SetPaperSize
+
+
+PAPER_SIZE PrintContext::GetPaperSize()
+{
+ return thePaperSize;
+} //GetPaperSize
+
+
+/*!
+This method returns the currently selected device. A device is selected
+implicitly in the constructor if bi-directional communication is working.
+SelectDevice() is used with unidirectional communication, or to override the
+implicit selection.
+\return PRINTER_TYPE Returns UNSUPPORTED if no Printer has been selected,
+either implicitly or explicitly.
+*/
+PRINTER_TYPE PrintContext::SelectedDevice()
+{
+ if (thePrinter == NULL)
+ {
+ return UNSUPPORTED;
+ }
+ return (PRINTER_TYPE)DR->device;
+} //SelectedDevice
+
+
+/*!
+Returns the model portion of the firmware ID string from the printer.
+*/
+const char* PrintContext::PrinterModel()
+{
+ if ((pSS == NULL) || (thePrinter == NULL))
+ {
+ return (const char*)NULL;
+ }
+
+ return pSS->strModel;
+} //PrinterModel
+
+
+/*!
+Returns a string representing the printer model family signified by the parameter.
+*/
+const char* PrintContext::PrintertypeToString
+(
+ PRINTER_TYPE pt
+)
+{
+ return ModelName[pt];
+} //PrintertypeToString
+
+
+/*!
+Used outside the context of a job.
+For use when pre-formatted data is available from an external source.
+*/
+DRIVER_ERROR PrintContext::SendPrinterReadyData
+(
+ BYTE* stream,
+ unsigned int size
+)
+{
+ if (stream == NULL)
+ {
+ return NULL_POINTER;
+ }
+
+ if (thePrinter == NULL)
+ {
+ return NO_PRINTER_SELECTED;
+ }
+
+ return thePrinter->Send(stream, size);
+} //SendPrinterReadyData
+
+
+/*!
+Used outside the context of a job.
+Flushes data in the printer's input buffer to prepare for new data stream.
+*/
+void PrintContext::Flush
+(
+ int FlushSize
+)
+{
+ if(thePrinter != NULL)
+ {
+ thePrinter->Flush(FlushSize);
+ }
+} //Flush
+
+
+/*!
+\internal
+Returns number of pages the device has printed. Not for this job, but from
+firmware counts in the printer. Only supported on printers that keep track of
+pages printed. Default is to return UNSUPPORTED_FUNCTION.
+*/
+DRIVER_ERROR PrintContext::PagesPrinted
+(
+ unsigned int& count
+)
+{
+ if (thePrinter == NULL)
+ {
+ return NO_PRINTER_SELECTED; // matches result when printer doesn't keep counter
+ }
+
+ return thePrinter->PagesPrinted(count);
+} //PagesPrinted
+
+/*!
+This is the method for use to check if the printer support a separate 1 bit black channel
+*/
+BOOL PrintContext::SupportSeparateBlack()
+{
+ if (thePrinter == NULL || CurrentMode == NULL)
+ {
+ return FALSE;
+ }
+ else
+ {
+ if (CurrentMode->dyeCount == 3 || CurrentMode->dyeCount == 6)
+ {
+ return FALSE;
+ }
+ else
+ {
+ return thePrinter->SupportSeparateBlack (CurrentMode);
+ }
+ }
+}
+
+#ifdef APDK_AUTODUPLEX
+
+/*!
+Request a duplexing mode if supported in current printer in current mode.
+*/
+BOOL PrintContext::SelectDuplexPrinting
+(
+ DUPLEXMODE duplexmode
+)
+{
+ if (thePrinter == NULL || CurrentMode == NULL)
+ {
+ return FALSE;
+ }
+ if (!CurrentMode->bDuplexCapable)
+ {
+ return FALSE;
+ }
+ CurrentMode->SetDuplexMode (duplexmode);
+ return TRUE;
+} //SelectDuplexPrinting
+
+
+/*!
+Determine what duplexing mode is currently selected.
+*/
+DUPLEXMODE PrintContext::QueryDuplexMode ()
+{
+ if (thePrinter == NULL || CurrentMode == NULL)
+ {
+ return DUPLEXMODE_NONE;
+ }
+ return CurrentMode->QueryDuplexMode ();
+} //QueryDuplexMode
+
+/*!
+Determine if the selected printer requires rasters to be rotated by 180 degrees
+for printing on the back side in a duplex job.
+*/
+BOOL PrintContext::RotateImageForBackPage ()
+{
+ if (thePrinter == NULL)
+ return TRUE;
+ return thePrinter->RotateImageForBackPage ();
+}
+
+#endif
+
+#ifdef APDK_EXTENDED_MEDIASIZE
+
+/*!
+Set custom paper size physical width and height in inches. Used with custom paper size only.
+*/
+BOOL PrintContext::SetCustomSize (float width, float height)
+{
+ CustomWidth=width;
+ CustomHeight=height;
+ return NO_ERROR;
+}
+
+#endif //APDK_EXTENDED_MEDIASIZE
+
+
+unsigned int PrintContext::GUITopMargin()
+{
+ // we take the hard unprintable top to be .04 (see define in Header.cpp)
+ // so here start out at 1/3"-.04" = 88 if dpi=300
+ //
+ // Changed 1/3" top margin to 1/8", 1/8"-.04" = 25.5 if dpi=300. des
+
+ // symmetrical top and bottom margin of 0.5 inch in duplex mode
+#ifdef APDK_AUTODUPLEX
+ if (CurrentMode->QueryDuplexMode () != DUPLEXMODE_NONE)
+ {
+ return 138 * (EffectiveResolutionY() / 300); /* .5" */
+ }
+#endif
+ return 26 * (EffectiveResolutionY() / 300);
+} //GUITopMargin
+
+/*
+PEN_TYPE PrintContext::GetCompatiblePen
+(
+ unsigned int num
+)
+{
+ if ((thePrinter == NULL) || (num >= MAX_COMPATIBLE_PENS))
+ {
+ return DUMMY_PEN;
+ }
+
+ return thePrinter->CompatiblePens[num];
+} //GetCompatiblePen
+*/
+
+DRIVER_ERROR PrintContext::QualitySieve
+(
+ ModeSet*& Modes,
+ QUALITY_MODE& eQuality
+)
+{
+ ModeSet* tempModeSet = Modes->QualitySubset(eQuality);
+ if (tempModeSet == NULL)
+ {
+ return ALLOCMEM_ERROR;
+ }
+
+ if (tempModeSet->IsEmpty()) // failed #1
+ {
+ delete tempModeSet;
+ eQuality = QUALITY_NORMAL; // change requested quality
+ tempModeSet = Modes->QualitySubset(eQuality);
+
+ if (tempModeSet == NULL)
+ {
+ return ALLOCMEM_ERROR;
+ }
+
+ if (tempModeSet->IsEmpty()) // failed #2 -- just get something
+ {
+ delete tempModeSet;
+ tempModeSet = Modes->Head();
+
+ if (tempModeSet == NULL)
+ {
+ return ALLOCMEM_ERROR;
+ }
+
+ if (tempModeSet->IsEmpty())
+ {
+ delete tempModeSet;
+ return SYSTEM_ERROR;
+ }
+
+ eQuality = tempModeSet->HeadPrintMode()->GetQualityMode();
+ }
+ }
+
+ delete Modes;
+ Modes=tempModeSet;
+ return NO_ERROR;
+} //QualitySieve
+
+
+DRIVER_ERROR PrintContext::SetCompGrayMode
+(
+ PrintMode*& resPM
+)
+{
+ DRIVER_ERROR err;
+ ColorMatcher* pColorMatcher;
+ uint32_t* graymap = (uint32_t*)pSS->AllocMem(sizeof(uint32_t)*9*9*9);
+
+ if (graymap==NULL)
+ {
+ return ALLOCMEM_ERROR;
+ }
+
+ ColorMap cm;
+ cm.ulMap1 = thePrinter->CMYMap;
+
+ if (cm.ulMap1==NULL)
+ {
+ return SYSTEM_ERROR;
+ }
+ cm.ulMap2 = NULL;
+ cm.ulMap3 = NULL;
+
+ PEN_TYPE pen = thePrinter->ActualPens();
+ unsigned int numinks;
+
+ if (pen == COLOR_PEN)
+ {
+ numinks = 3;
+ }
+ else
+ {
+ numinks = 4; // even for MDL_BOTH, 4 is still enough
+ }
+
+ pColorMatcher = Create_ColorMatcher(pSS, cm,numinks, OutputWidth);
+
+ err = pColorMatcher->MakeGrayMap(thePrinter->CMYMap, graymap);
+ delete pColorMatcher;
+ pColorMatcher = NULL;
+
+ ERRCHECK; // possible return here
+
+ if (pen == COLOR_PEN)
+ {
+ resPM = new CMYGrayMode(graymap);
+ }
+ else
+ {
+ resPM = new KCMYGrayMode(graymap);
+ }
+
+ if (resPM == NULL)
+ {
+ return ALLOCMEM_ERROR;
+ }
+// resPM->myIndex = MAX_PRINTMODES;
+
+ if (pen == COLOR_PEN)
+ {
+ resPM->bFontCapable = FALSE;
+ }
+
+ // make myIndex the last one in the list
+ resPM->myIndex = thePrinter->GetModeCount();
+/*
+ * [K]CMYGrayMode sets all resolution to 300 and quality to normal.
+ * Some printers, eg., DJ970, is 600 dpi in black and has bitdepth of 2.
+ * So, we cannot use normal mode for these printers and must set quality to
+ * draft.
+ * This is also true for 8x5 in one pen mode.
+ * Anyway, here, pen is both_pens or color_pen only.
+ */
+
+ PrintMode *pPM = thePrinter->GetMode (DEFAULTMODE_INDEX);
+
+// if (pen != COLOR_PEN && pPM->ResolutionX[K] != 300)
+ if (pPM->ResolutionX[K] != 300)
+ {
+ resPM->theQuality = qualityDraft;
+ resPM->pmQuality = QUALITY_DRAFT;
+ }
+
+/*
+ * Some printers do not use any data compression. Ex. DJ3320
+ * So, turn off the bCompress flag in such cases.
+ */
+
+ resPM->Config.bCompress = pPM->Config.bCompress;
+
+
+#ifdef APDK_AUTODUPLEX
+ resPM->bDuplexCapable = thePrinter->bDuplexCapable;
+#endif
+
+ return NO_ERROR;
+} //SetCompGrayMode
+
+// SetMediaSource
+//! Select input media source bin
+/*!
+Used to set the bin number from which media will be loaded by the printer. This
+is relevant for those printers that have multiple input bins. All other printers
+will ignore the bin number. The typical bin numbers are
+ 1 - Upper Tray
+ 4 - Lower Tray
+ 5 - Duplexer Hagaki Feed
+ 7 - Auto Select
+Any value between 1 and 50 is valid where there are more than 2 trays.
+******************************************************************************/
+
+DRIVER_ERROR PrintContext::SetMediaSource
+(
+ MediaSource num //!< Bin Number
+)
+{
+ if ((num > sourceTrayMax) || (num < sourceTrayMin))
+ return WARN_INVALID_MEDIA_SOURCE;
+ m_MediaSource = num;
+
+ if (thePrinter != NULL)
+ {
+ BOOL bQueryHagakiTray = TRUE;
+ if (num == sourceDuplexerNHagakiFeed && !thePrinter->HagakiFeedPresent(bQueryHagakiTray))
+ {
+ m_MediaSource = sourceTrayAuto;
+ }
+ }
+ return NO_ERROR;
+}
+
+unsigned int PrintContext::GetCurrentDyeCount()
+{
+ return CurrentMode->dyeCount;
+}
+
+PEN_TYPE PrintContext::GetDefaultPenSet()
+{
+ if (thePrinter==NULL)
+ return NO_PEN;
+ return thePrinter->DefaultPenSet();
+}
+
+PEN_TYPE PrintContext::GetInstalledPens()
+{
+ if(!thePrinter)
+ return NO_PEN;
+ return thePrinter->ePen;
+}
+
+void PrintContext::ResetIOMode (BOOL bDevID, BOOL bStatus)
+{
+ if (thePrinter)
+ {
+ thePrinter->IOMode.bDevID = bDevID;
+ thePrinter->IOMode.bStatus = bStatus;
+ thePrinter->bCheckForCancelButton = bDevID;
+ }
+}
+
+DRIVER_ERROR PrintContext::SetPrinterHint (PRINTER_HINT eHint, int iValue)
+{
+ if (thePrinter)
+ {
+ return thePrinter->SetHint (eHint, iValue);
+ }
+ return NO_PRINTER_SELECTED;
+}
+
+DRIVER_ERROR PrintContext::SetMediaType (MEDIATYPE eMediaType)
+{
+ if (CurrentMode == NULL)
+ return NO_PRINTER_SELECTED;
+ return CurrentMode->SetMediaType (eMediaType);
+}
+
+void PrintContext::SetJobAttributes (JobAttributes *pJA)
+{
+ if (m_job_attributes == NULL)
+ {
+ m_job_attributes = (JobAttributes *) new BYTE[sizeof (JobAttributes)];
+ }
+ if (m_job_attributes == NULL)
+ {
+ return;
+ }
+
+ memcpy(m_job_attributes, pJA, sizeof(JobAttributes));
+ InputWidth = (int) (pJA->media_attributes.fPrintableWidth * EffectiveResolutionX ());
+ OutputWidth = InputWidth;
+//BUG("CurrentPrintMode=%d\n", CurrentPrintMode());
+//BUG("fPrintableWidth=%0.5g EffectiveResolutionX=%d\n", pJA->media_attributes.fPrintableWidth, EffectiveResolutionX());
+//BUG("InputWidth=%d OutputWidth=%d\n", InputWidth, OutputWidth);
+}
+
+int PrintContext::GetJobAttributes (int getWhat)
+{
+ if (m_job_attributes == NULL)
+ return -1;
+
+ if (getWhat == MEDIASIZE_PCL)
+ return m_job_attributes->media_attributes.pcl_id;
+ return -1;
+}
+
+APDK_END_NAMESPACE
+
diff --git a/prnt/hpijs/create_so.cpp b/prnt/hpijs/create_so.cpp
new file mode 100644
index 0000000..295292b
--- /dev/null
+++ b/prnt/hpijs/create_so.cpp
@@ -0,0 +1,50 @@
+/*****************************************************************************\
+ create_so.cpp : Open Source Imaging Create Scaler implimentation
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#include "header.h"
+#include "scaler_open.h"
+
+APDK_BEGIN_NAMESPACE
+
+Scaler* Create_Scaler
+(
+ SystemServices* pSys,
+ int inputwidth,
+ int numerator,
+ int denominator,
+ BOOL vip,
+ unsigned int iNumInks
+)
+{
+ return new Scaler_Open(pSys,inputwidth,numerator,denominator,vip,iNumInks);
+}
+
+APDK_END_NAMESPACE
diff --git a/prnt/hpijs/creator.cpp b/prnt/hpijs/creator.cpp
new file mode 100644
index 0000000..fe6f2ba
--- /dev/null
+++ b/prnt/hpijs/creator.cpp
@@ -0,0 +1,108 @@
+/*****************************************************************************\
+ creator.cpp : Open Source Imaging Halftoner and ColorMatcher Creation
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#include "header.h"
+#include "resources.h"
+
+#include "hptypes.h"
+#include "colormatch.h"
+#include "colormatcher_open.h"
+#include "halftoner.h"
+#include "halftoner_open.h"
+
+APDK_BEGIN_NAMESPACE
+
+// routine to return generic ColorMatcher to Job
+ColorMatcher* Create_ColorMatcher
+(
+ SystemServices* pSys,
+ ColorMap cm,
+ unsigned int DyeCount,
+ unsigned int iInputWidth
+)
+{
+ return new ColorMatcher_Open(pSys,cm,DyeCount,iInputWidth);
+}
+
+// routine to return generic Halftoner to Job
+Halftoner* Create_Halftoner
+(
+ SystemServices* pSys,
+ PrintMode* pPM,
+ unsigned int iInputWidth,
+ unsigned int iNumRows[],
+ unsigned int HiResFactor,
+ BOOL usematrix
+)
+{
+ return new Halftoner_Open(pSys,pPM,iInputWidth, iNumRows,HiResFactor,usematrix);
+}
+
+BYTE* GetHT3x3_4()
+{
+ return (BYTE*)HT300x3004level_open;
+}
+
+BYTE* GetHT6x6_4()
+{
+ return (BYTE*)HT600x6004level895_open;
+}
+
+BYTE* GetHTBinary()
+{
+ return (BYTE*)HTBinary_open;
+}
+
+BYTE* GetHT6x6_4_970()
+{
+ return (BYTE*)HT600x6004level970_open;
+}
+
+#ifdef APDK_DJ3320
+BYTE *GetHT12x12x1_4100_Photo_Best ()
+{
+ return (BYTE *) HT1200x1200x1PhotoBest_open;
+}
+#endif // APDK_DJ3320
+
+// functions to identify versions of system
+BOOL ProprietaryImaging()
+{
+ return FALSE;
+}
+
+BOOL ProprietaryScaling()
+{
+ return FALSE;
+}
+
+APDK_END_NAMESPACE
+
diff --git a/prnt/hpijs/debug.h b/prnt/hpijs/debug.h
new file mode 100644
index 0000000..e31ab47
--- /dev/null
+++ b/prnt/hpijs/debug.h
@@ -0,0 +1,82 @@
+/*****************************************************************************\
+ debug.h : Interface for debuging support
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#ifndef DEBUG_H
+#define DEBUG_H
+
+#include <assert.h>
+
+#define NO_DEBUG 0x00
+#define DBG_ASSERT 0x01 // 0001
+#define DBG_LVL1 0x02 // 0010
+#define DBG_DFLT (DBG_ASSERT | DBG_LVL1) // 0011
+#define PUMP 0x04 // 0100
+#define HARNESS 0x08 // 1000
+
+#ifndef ASSERT // System may already have ASSERT handling
+ // ANSI C/C++ defines assert(...) as a macro that will check the expression in the
+ // debugging version and compile to (void)0 in the release version so we will just
+ // define the ALL CAPS version of ASSERT for ourselves.
+ #define ASSERT(EXP) assert(EXP)
+#endif
+
+#ifndef DBG1 // this allows for a different implementation elsewhere (ie platform.h)
+ #if defined(DEBUG) && (DBG_MASK & DBG_LVL1)
+ #define DBG1(STUFF) printf(STUFF)
+ #else
+ #define DBG1(_STUFF) (void(0))
+ #endif
+#endif
+
+#ifndef TRACE
+ #if defined(DEBUG) && (DBG_MASK & DBF_LVL1)
+ #define TRACE printf
+ #else
+ #if defined(__GNUC__)
+ #define TRACE(args...) ((void)0)
+ #else
+ #define TRACE 1 ? 0 : printf
+ #endif
+ #endif
+#endif
+
+#if defined(DEBUG) && (DBG_MASK & PUMP)
+ #define USAGE_LOG
+ #define NULL_IO
+#endif
+
+#if defined(DEBUG) && (DBG_MASK & HARNESS)
+ #define APDK_CAPTURE
+#endif
+
+#endif //DEBUG_H
+
+
diff --git a/prnt/hpijs/dj3320.cpp b/prnt/hpijs/dj3320.cpp
new file mode 100644
index 0000000..d945161
--- /dev/null
+++ b/prnt/hpijs/dj3320.cpp
@@ -0,0 +1,3930 @@
+/*****************************************************************************\
+ dj3320.cpp : Implimentation for the DJ3320 class
+
+ Copyright (c) 2001 - 2006, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\***************************************************************************/
+
+#ifdef APDK_DJ3320
+
+#include "header.h"
+#include "io_defs.h"
+#include "dj3320.h"
+#include "resources.h"
+#include "printerproxy.h"
+
+APDK_BEGIN_NAMESPACE
+extern BYTE* GetHT3x3_4();
+extern BYTE* GetHT6x6_4_970();
+APDK_END_NAMESPACE
+
+APDK_BEGIN_NAMESPACE
+
+extern uint32_t ulMapDJ3320_K_3x3x1[9 * 9 * 9];
+extern uint32_t ulMapDJ3320_K_6x6x1[9 * 9 * 9];
+extern uint32_t ulMapDJ3320_CMY_3x3x1[9 * 9 * 9];
+extern uint32_t ulMapDJ3320_CMY_6x6x1[9 * 9 * 9];
+extern uint32_t ulMapDJ3320_KCMY_3x3x1[9 * 9 * 9];
+extern uint32_t ulMapDJ3320_KCMY_6x6x1[9 * 9 * 9];
+extern uint32_t ulMapDJ970_Gossimer_Normal_KCMY[ 9 * 9 * 9 ];
+
+extern uint32_t ulMapDJ3600_KCMY_6x6x1[9 * 9 * 9];
+extern uint32_t ulMapDJ3600_ClMlxx_6x6x1[9 * 9 * 9];
+extern uint32_t ulMapDJ3600_KCMY_6x6x2[9 * 9 * 9];
+extern uint32_t ulMapDJ3600_ClMlxx_6x6x2[9 * 9 * 9];
+extern uint32_t ulMapDJ3600_KCMY_3x3x1[9 * 9 * 9];
+extern uint32_t ulMapDJ3600_ClMlxx_3x3x1[9 * 9 * 9];
+
+extern void AsciiHexToBinary(BYTE* dest, char* src, int count);
+
+#define NULL 0
+//#define DBG1(str)
+//#define DBG2(str, i) {}
+//#define DBG3(str, i, j) {}
+
+DJ3320::DJ3320 (SystemServices* pSS, BOOL proto)
+: Printer(pSS,NUM_DJ6XX_FONTS,proto), m_dsCurrentStatus(DISPLAY_PRINTING)
+{
+
+ pLDLEncap = NULL;
+ m_iBytesPerSwing = 2;
+ m_iLdlVersion = 1;
+ m_iColorPenResolution = 300;
+ m_iBlackPenResolution = 1200;
+ m_iNumBlackNozzles = 400;
+
+ if (IOMode.bDevID)
+ {
+ bCheckForCancelButton = TRUE;
+ constructor_error = VerifyPenInfo ();
+ CERRCHECK;
+// pSS->GetVertAlignFromDevice();
+ }
+ else
+ ePen = BOTH_PENS; // matches default mode
+ CMYMap = ulMapDJ3320_CMY_3x3x1;
+ InitPrintModes ();
+
+ if (pSendBuffer)
+ {
+ pSS->FreeMem (pSendBuffer);
+ }
+ pSendBuffer = pSS->AllocMem (iBuffSize);
+ CNEWCHECK (pSendBuffer);
+}
+
+void DJ3320::InitPrintModes ()
+{
+ if (ePen == BLACK_PEN || ePen == MDL_PEN)
+ {
+ pMode[GRAYMODE_INDEX] = new DJ3320KDraftMode ();
+ pMode[DEFAULTMODE_INDEX] = new DJ3320GrayMode (ePen);
+ ModeCount = 2;
+ }
+ else if (ePen == BOTH_PENS)
+ {
+ pMode[GRAYMODE_INDEX] = new DJ3320GrayMode (ePen);
+ pMode[DEFAULTMODE_INDEX] = new DJ3320NormalMode (ePen);
+ pMode[SPECIALMODE_INDEX] = new DJ3320PhotoMode ();
+ pMode[SPECIALMODE_INDEX+1] = new DJ3320KDraftMode ();
+ pMode[SPECIALMODE_INDEX+2] = new DJ3320DraftMode (ePen);
+ ModeCount = 5;
+ }
+ else if (ePen == MDL_BOTH)
+ {
+ pMode[GRAYMODE_INDEX] = new DJ3320GrayMode (ePen);
+ pMode[DEFAULTMODE_INDEX] = new DJ3600MDLNormalMode ();
+ pMode[SPECIALMODE_INDEX] = new DJ3320KDraftMode ();
+ pMode[SPECIALMODE_INDEX+1] = new DJ3600MDLDraftMode ();
+ pMode[SPECIALMODE_INDEX+2] = new DJ3600MDLPhotoMode ();
+ ModeCount = 5;
+ }
+ else
+ {
+ pMode[DEFAULTMODE_INDEX] = new DJ3320NormalMode (ePen);
+ pMode[SPECIALMODE_INDEX] = new DJ3320PhotoMode ();
+ pMode[GRAYMODE_INDEX] = new DJ3320DraftMode (ePen);
+ ModeCount = 3;
+ }
+}
+
+DRIVER_ERROR DJ3320::SetPens (PEN_TYPE eNewPen)
+{
+ if (eNewPen == ePen)
+ {
+ return NO_ERROR;
+ }
+ ASSERT (eNewPen <= MAX_PEN_TYPE);
+ if (eNewPen > MAX_PEN_TYPE)
+ {
+ return UNSUPPORTED_PEN;
+ }
+
+ for (int i = 0; i < (int) ModeCount; i++)
+ {
+ if (pMode[i])
+ {
+ delete pMode[i];
+ pMode[i] = NULL;
+ }
+ }
+ ePen = eNewPen;
+ InitPrintModes ();
+ AdjustResolution ();
+
+ return NO_ERROR;
+} //SetPens
+
+DJ3320::~DJ3320 ()
+{
+ if (ePen == COLOR_PEN && pMode[GRAYMODE_INDEX])
+ {
+ delete pMode[GRAYMODE_INDEX];
+ pMode[GRAYMODE_INDEX] = NULL;
+ }
+ if (pLDLEncap)
+ delete pLDLEncap;
+ if (pSendBuffer)
+ pSS->FreeMem ((BYTE *) pSendBuffer);
+ pSendBuffer = NULL;
+}
+
+DJ3320GrayMode::DJ3320GrayMode (PEN_TYPE ePen) : PrintMode (ulMapDJ3320_K_6x6x1)
+{
+ if (ePen == MDL_BOTH)
+ {
+ cmap.ulMap2 = ulMapDJ3600_ClMlxx_6x6x1;
+ }
+
+ ColorDepth[K] = 1;
+ dyeCount = 1;
+ pmColor = GREY_K;
+ CompatiblePens[1] = BLACK_PEN;
+ CompatiblePens[2] = MDL_BOTH;
+ CompatiblePens[3] = MDL_PEN;
+
+ ResolutionX[0] = 600;
+ ResolutionY[0] = 600;
+
+ BaseResX = 600;
+ BaseResY = 600;
+
+ MixedRes = FALSE;
+ bFontCapable = FALSE;
+ Config.bCompress = FALSE;
+}
+
+DJ3320KDraftMode::DJ3320KDraftMode () : GrayMode (ulMapDJ3320_K_3x3x1)
+{
+ bFontCapable = FALSE;
+ Config.bCompress = FALSE;
+ theQuality = qualityDraft;
+ pmQuality = QUALITY_DRAFT;
+ CompatiblePens[2] = MDL_BOTH;
+ CompatiblePens[3] = MDL_PEN;
+}
+
+DJ3320DraftMode::DJ3320DraftMode (PEN_TYPE ePen)
+: PrintMode (ulMapDJ3320_KCMY_3x3x1)
+{
+
+ if (ePen == COLOR_PEN)
+ {
+ CompatiblePens[1] = ePen;
+ cmap.ulMap1 = ulMapDJ3320_CMY_3x3x1;
+ dyeCount = 3;
+ }
+
+ for (int i = 0; i < 4; i++)
+ {
+ ColorDepth[i] = 1;
+
+ ResolutionX[i] = 300;
+ ResolutionY[i] = 300;
+ }
+ MixedRes = FALSE;
+ BaseResX = 300;
+ BaseResY = 300;
+ bFontCapable = FALSE;
+ pmQuality = QUALITY_DRAFT;
+ Config.bCompress = FALSE;
+
+// strcpy(ModeName, "Draft");
+}
+
+DJ3320NormalMode::DJ3320NormalMode (PEN_TYPE ePen)
+: PrintMode (ulMapDJ3320_KCMY_6x6x1)
+{
+
+ if (ePen == COLOR_PEN)
+ {
+ CompatiblePens[1] = ePen;
+ cmap.ulMap1 = ulMapDJ3320_CMY_6x6x1;
+ dyeCount = 3;
+ }
+
+ for (int i = 0; i < 4; i++)
+ {
+ ColorDepth[i] = 1;
+
+ ResolutionX[i] = 600;
+ ResolutionY[i] = 600;
+ }
+
+ BaseResX = 600;
+ BaseResY = 600;
+ MixedRes = FALSE;
+
+ bFontCapable = FALSE;
+ Config.bCompress = FALSE;
+
+// strcpy(ModeName, "Normal");
+}
+
+DJ3320PhotoMode::DJ3320PhotoMode ()
+: PrintMode (ulMapDJ970_Gossimer_Normal_KCMY)
+{
+
+ for (int i = 0; i < 4; i++)
+ {
+ ColorDepth[i] = 2;
+
+ ResolutionX[i] = 600;
+ ResolutionY[i] = 600;
+ }
+ ColorDepth[0] = 1;
+ CompatiblePens[1] = COLOR_PEN;
+
+ BaseResX = 600;
+ BaseResY = 600;
+ MixedRes = FALSE;
+
+ ColorFEDTable = GetHT6x6_4_970 ();
+
+ bFontCapable = FALSE;
+
+ pmQuality = QUALITY_BEST;
+ pmMediaType = MEDIA_PHOTO;
+
+ medium = mediaGlossy;
+ theQuality = qualityPresentation;
+
+ Config.bCompress = FALSE;
+}
+
+
+//
+// Plain Normal Print Mode for Photo and Color Pen
+//
+DJ3600MDLNormalMode::DJ3600MDLNormalMode()
+: PrintMode( ulMapDJ3600_KCMY_6x6x1, ulMapDJ3600_ClMlxx_6x6x1 )
+{
+ dyeCount=6;
+ CompatiblePens[0] = MDL_BOTH;
+
+ for (int i = 0; i < 6; i++)
+ {
+ ColorDepth[i] = 1;
+
+ ResolutionX[i] = 600;
+ ResolutionY[i] = 600;
+ }
+
+ BaseResX = 600;
+ BaseResY = 600;
+ MixedRes = FALSE;
+
+ bFontCapable = FALSE;
+ Config.bCompress = FALSE;
+}
+
+//
+// Photo Best Print Mode for Photo and Color Pen
+//
+DJ3600MDLPhotoMode::DJ3600MDLPhotoMode()
+: PrintMode( ulMapDJ3600_KCMY_6x6x2, ulMapDJ3600_ClMlxx_6x6x2 )
+{
+ dyeCount=6;
+ CompatiblePens[0] = MDL_BOTH;
+
+ for (int i = 0; i < 6; i++)
+ {
+ ColorDepth[i] = 2;
+
+ ResolutionX[i] = 600;
+ ResolutionY[i] = 600;
+ }
+
+ BaseResX = 600;
+ BaseResY = 600;
+ MixedRes = FALSE;
+
+
+ ColorFEDTable = (BYTE*) HT600x6004level3600_open;
+
+ bFontCapable = FALSE;
+
+ pmQuality = QUALITY_BEST;
+ pmMediaType = MEDIA_PHOTO;
+
+ medium = mediaGlossy;
+ theQuality = qualityPresentation;
+ Config.bCompress = FALSE;
+}
+
+//
+// Draft Mode for Photo and Color Pen
+//
+DJ3600MDLDraftMode::DJ3600MDLDraftMode()
+: PrintMode( ulMapDJ3600_KCMY_3x3x1, ulMapDJ3600_ClMlxx_3x3x1 )
+{
+ dyeCount=6;
+ CompatiblePens[0] = MDL_BOTH;
+
+ for (int i = 0; i < 6; i++)
+ {
+ ColorDepth[i] = 1;
+
+ ResolutionX[i] = 300;
+ ResolutionY[i] = 300;
+ }
+
+ BaseResX = 300;
+ BaseResY = 300;
+ MixedRes = FALSE;
+
+ bFontCapable = FALSE;
+ pmQuality = QUALITY_DRAFT;
+ Config.bCompress = FALSE;
+}
+
+DRIVER_ERROR DJ3320::Encapsulate (const RASTERDATA *pRasterData, BOOL bLastPlane)
+{
+ return pLDLEncap->Encapsulate (pRasterData->rasterdata[COLORTYPE_COLOR], pRasterData->rastersize[COLORTYPE_COLOR], bLastPlane);
+}
+
+Header* DJ3320::SelectHeader(PrintContext* pc)
+{
+ pLDLEncap = new LDLEncap (this, pSS, pc);
+ if (pLDLEncap)
+ pLDLEncap->AllocateSwathBuffer ((pc->OutputPixelsPerRow ()) / 8 + 2);
+ if (pLDLEncap->constructor_error != NO_ERROR)
+ return NULL;
+
+ return new Header3320 (this,pc);
+}
+
+/*
+ * Author: Don Castrapel
+ */
+
+DISPLAY_STATUS DJ3320::ParseError (BYTE byStatusReg)
+{
+ DRIVER_ERROR err = NO_ERROR;
+ BYTE byDevIDBuffer[DevIDBuffSize];
+ char *pcStr = NULL;
+ BYTE byStatus1, byStatus2;
+
+ memset(byDevIDBuffer, 0, sizeof(byDevIDBuffer));
+ byStatus1 = byStatus2 = 0;
+
+ if (IOMode.bDevID)
+ {
+ // If a bi-di cable was plugged in and everything was OK, let's see if it's still
+ // plugged in and everything is OK
+ err = pSS->GetDeviceID (byDevIDBuffer, DevIDBuffSize, TRUE);
+ if (err)
+ {
+ // job was bi-di but now something's messed up, probably cable unplugged
+ m_dsCurrentStatus = DISPLAY_COMM_PROBLEM;
+ return DISPLAY_COMM_PROBLEM;
+ }
+ }
+
+ if (IOMode.bStatus)
+ {
+ if(pLDLEncap->bNewStatus)
+ {
+ pLDLEncap->bNewStatus = FALSE;
+
+ // First 10 bytes of m_pbyReadBuff are packet header. Status query from printer has $S:
+ if ((pcStr = (char *) strstr((const char*)pLDLEncap->byStatusBuff + 10, "$S:")) == NULL)
+ {
+ m_dsCurrentStatus = DISPLAY_COMM_PROBLEM;
+ return DISPLAY_COMM_PROBLEM;
+ }
+
+ // Point to first byte of Feature State. Skip 3 bytes for "$S:", 2 for version
+ pcStr += 5;
+ byStatus1 = *pcStr;
+
+ if (byStatus1 == '9')
+ {
+ iTotal_SLOW_POLL_Count = 0;
+ m_dsCurrentStatus = DISPLAY_TOP_COVER_OPEN;
+ return DISPLAY_TOP_COVER_OPEN;
+ }
+
+ // Point to Printer State. Skip 14-byte Feature State
+ pcStr += 14;
+ byStatus1 = *pcStr++;
+ byStatus2 = *pcStr++;
+
+ // In any of the cases where we know what's wrong, reset the slow poll count, which we're
+ // using as a "we know what's going on" variable, to 0 since we do know what's going on
+ if ((byStatus1 == '0') && (byStatus2 == '5'))
+ {
+ // 05 = CNCL state
+ iTotal_SLOW_POLL_Count = 0;
+ m_dsCurrentStatus = DISPLAY_PRINTING_CANCELED;
+ return DISPLAY_PRINTING_CANCELED;
+ }
+ if ((byStatus1 == '0') && (byStatus2 == '9'))
+ {
+ // 09 = OOP state
+ iTotal_SLOW_POLL_Count = 0;
+ m_dsCurrentStatus = DISPLAY_OUT_OF_PAPER_NEED_CONTINUE;
+ return DISPLAY_OUT_OF_PAPER_NEED_CONTINUE;
+ }
+ if ((byStatus1 == '0') && (byStatus2 == 'E'))
+ {
+ // 0E = Paper jam
+ iTotal_SLOW_POLL_Count = 0;
+ m_dsCurrentStatus = DISPLAY_ERROR_TRAP;
+ return DISPLAY_ERROR_TRAP;
+ }
+ if ((byStatus1 == '0') && (byStatus2 == 'F'))
+ {
+ // 0F = Carriage stall
+ iTotal_SLOW_POLL_Count = 0;
+ m_dsCurrentStatus = DISPLAY_ERROR_TRAP;
+ return DISPLAY_ERROR_TRAP;
+ }
+ if ((byStatus1 == '1') && (byStatus2 == '0'))
+ {
+ // 10 = Paper stall
+ iTotal_SLOW_POLL_Count = 0;
+ m_dsCurrentStatus = DISPLAY_ERROR_TRAP;
+ return DISPLAY_ERROR_TRAP;
+ }
+
+ // No problem detectable from status string. Set default condition
+ m_dsCurrentStatus = DISPLAY_PRINTING;
+ }
+
+ // VerifyPenInfo will handle prompting the user if this is a problem
+ err = VerifyPenInfo();
+ if(err)
+ // VerifyPenInfo returned an error, which can only happen when ToDevice
+ // or GetDeviceID returns an error. Either way, it's BAD_DEVICE_ID or
+ // IO_ERROR, both unrecoverable. This is probably due to the printer
+ // being turned off during printing
+ return DISPLAY_COMM_PROBLEM;
+ }
+
+ // Don't know what the problem is. Increment wait count. i_Total_SLOW_POLL_Count
+ // really has no meaning for the DJ3320, but since it's a printer class variable
+ // and it's not used for the DJ3320 we'll use it here rather than create another
+ // printer class variable
+ iTotal_SLOW_POLL_Count++;
+
+ // If we've exceeded our wait time and we still don't know what's wrong, return
+ // a communication problem
+ if(iTotal_SLOW_POLL_Count >= ERROR_WAIT)
+ return DISPLAY_BUSY;
+ else
+ return m_dsCurrentStatus;
+}
+
+/*
+ * Author: Don Castrapel
+ */
+
+DRIVER_ERROR DJ3320::Send (const BYTE* pWriteBuff, DWORD dwWriteCount)
+{
+ DRIVER_ERROR err = NO_ERROR;
+ DISPLAY_STATUS eDisplayStatus = DISPLAY_PRINTING;
+ DWORD dwResidual = 0;
+ DWORD dwPrevResidual = 0;
+ const BYTE *pWritePos = NULL;
+ BYTE byPacketType = 0;
+ BYTE byCommandNumber = 0;
+ BYTE byCommandNumberOriginal = 0;
+ BYTE byCreditWaitCount = 0;
+ BYTE byCreditWaitCountOriginal = 0;
+ BYTE byIOWaitCount = 0;
+ BOOL bUpdateState = FALSE;
+ BOOL bCreditForCommand = FALSE;
+ BOOL bFlush = FALSE;
+ BOOL bOriginalRequest = TRUE;
+
+ // DJ3400 doesn't use a staus reg, but we need one for the call to ParseError
+ BYTE byStatusReg = 0;
+
+ // Buffering variables
+ DWORD BytesToWrite = dwWriteCount;
+ DWORD BytesToWriteOriginal = dwWriteCount;
+ const BYTE *pWriteBuffOriginal = pWriteBuff;
+ const BYTE *pBuffer = pWriteBuff;
+ DWORD dwWriteCountOriginal = dwWriteCount;
+ DWORD dwSendSize = dwWriteCount;
+
+ // Retry, query, and cancel variables
+ BOOL bPrinterCancelButton = FALSE;
+ BOOL bCanceling = FALSE;
+ BOOL bCanceled = FALSE;
+
+////////////////////////////////////////////////////////////////
+#ifdef NULL_IO
+ // test imaging speed independent of printer I/O, will not
+ // send any data to the device
+ return NO_ERROR;
+#endif
+////////////////////////////////////////////////////////////////
+
+ if (!IOMode.bDevID)
+ {
+ return pSS->ToDevice (pWriteBuff, &dwSendSize);
+ }
+
+ if (ErrorTerminationState)
+ {
+ // Don't try any more I/O if we previously terminated in an error state
+ return JOB_CANCELED;
+ }
+
+ // If EndJob is TRUE we don't want to return. The Job destructor is the only place that sets this
+ // boolean and we have to flush the buffer if EndJob is TRUE.
+ if (!EndJob)
+ {
+ if (dwWriteCount == 0)
+ // Don't bother processing an empty Send call
+ return NO_ERROR;
+
+ // Get Packet Type. If Packet Type is a command, buffer it if buffering is turned on. If it's
+ // a different Packet Type, send it directly to the printer
+ byPacketType = pWriteBuff[PACKET_TYPE_BYTE];
+
+ // Get Command Number if packet is a command. If it is then we need to check for credit
+ // before we send the command
+ if(!byPacketType)
+ {
+ byCommandNumber = pWriteBuff[COMMAND_NUMBER_BYTE];
+ byCommandNumberOriginal = pWriteBuff[COMMAND_NUMBER_BYTE];
+ }
+ }
+ else
+ {
+ // Just flush whatever is in the buffer
+ bFlush = TRUE;
+ }
+
+ do
+ {
+ // If it's a command, check to see if we have credit for it. If it's a special packet type,
+ // we'll just send it directly to the printer
+ if(!bCreditForCommand)
+ {
+ // Could be first time through do loop or could have not had credit and had to check. We'll
+ // always get here since we don't change bCreditForCommand until here.
+ if (!byPacketType)
+ {
+ // Check to see if we have credit for this command
+ if (pLDLEncap->piCreditCount[byCommandNumber] > 0)
+ {
+ pLDLEncap->piCreditCount[byCommandNumber]--;
+ bCreditForCommand = TRUE;
+ byCreditWaitCount = 0;
+ }
+ else
+ {
+ byCreditWaitCount++;
+
+ bUpdateState = pLDLEncap->UpdateState (FALSE);
+ if(bUpdateState)
+ {
+ pSS->BusyWait(0);
+ // Rechecking here will save us a trip through the do loop
+ if (pLDLEncap->piCreditCount[byCommandNumber] > 0)
+ {
+ pLDLEncap->piCreditCount[byCommandNumber]--;
+ bCreditForCommand = TRUE;
+ byCreditWaitCount = 0;
+ }
+ }
+ }
+ }
+ else
+ {
+ // Special packet types get a free pass
+ bCreditForCommand = TRUE;
+ }
+ } // if(!bCreditForCommand)
+
+ // If we don't have credit for the current command we don't want to put it in the
+ // buffer. If, however, we have exceeded our credit wait limit and we need to check
+ // for an error, we have to flush what's in our buffer
+ if (bCreditForCommand || bFlush)
+ {
+ if (bCreditForCommand)
+ {
+ // We should bypass the buffering for a large Send, but don't lose what may
+ // already be buffered
+ if ((BytesToWrite >= (DWORD) iBuffSize) && (iCurrBuffSize == 0))
+ {
+ pBuffer = pWriteBuff + (dwWriteCount - BytesToWrite);
+ dwSendSize = BytesToWrite;
+ BytesToWrite = 0; // This is checked for at the end of the outer loop
+ }
+ else // We will buffer this data
+ {
+ // If it'll fit then just copy everything to the buffer
+ if (BytesToWrite <= (DWORD) iBuffSize - iCurrBuffSize)
+ {
+ memcpy ((void*) (pSendBuffer + iCurrBuffSize),
+ (void*) (pWriteBuff + (dwWriteCount - BytesToWrite)),
+ BytesToWrite);
+ iCurrBuffSize += BytesToWrite;
+ BytesToWrite = 0;
+ }
+ else // Copy what we can into the buffer, we'll get the rest later
+ {
+ memcpy ((void*) (pSendBuffer + iCurrBuffSize),
+ (void*) (pWriteBuff + (dwWriteCount - BytesToWrite)),
+ iBuffSize - iCurrBuffSize);
+ BytesToWrite -= (iBuffSize - iCurrBuffSize);
+ iCurrBuffSize = iBuffSize;
+ }
+ }
+
+ // If this wasn't the original request, like a query, continue, prepare to
+ // cancel, or cancel command, flush the buffer immediately
+ if(!bOriginalRequest)
+ {
+ bFlush = TRUE;
+ }
+ } // if (bCreditForCommand)
+
+ // If the buffer is now full (ready-to-send) or if we're at the end of the job, or
+ // if the Packet Type is not a command then send what we have in the buffer.
+ // otherwise just break (the buffer isn't ready to send)
+ if ((EndJob == FALSE) && (iCurrBuffSize != iBuffSize) && (!byPacketType) && (!bFlush) )
+ {
+ // We're not ready to send yet. Break out of do loop
+ break;
+ }
+ else // Send this buffered data
+ {
+ if (bFlush)
+ {
+ bFlush = FALSE;
+ }
+ pBuffer = pSendBuffer;
+ dwSendSize = iCurrBuffSize;
+ }
+
+ // Initialize our 'residual' to the full send size
+ dwResidual = dwSendSize;
+
+ // Code to check to see if user has pressed cancel button. DJ3320 front panel button, if
+ // pressed during normal printing, will initiate a cancel in the printer. This will cause the
+ // printer to just throw away data but not notify the host. We have to do that here if we
+ // detect a cancel
+ if(bCheckForCancelButton && (ulBytesSentSinceCancelCheck >= CANCEL_BUTTON_CHECK_THRESHOLD))
+ {
+ ulBytesSentSinceCancelCheck = 0;
+
+ if(ParseError(byStatusReg) == DISPLAY_PRINTING_CANCELED)
+ bPrinterCancelButton = TRUE;
+ }
+
+ // If we have nothing to send, we need to bail to avoid spurious dialogs
+ // at the end of the ::send function. I'd prefer a solution where we don't
+ // bail from a while loop but in practice this shouldn't have any ill effects.
+ if (dwResidual <= 0)
+ {
+ return NO_ERROR;
+ }
+
+ // While still data to send in this request
+ while (dwResidual > 0)
+ {
+ // WritePort overwrites request count, need to save
+ dwPrevResidual = dwResidual;
+
+ pWritePos = (const BYTE *) &(pBuffer[dwSendSize - dwResidual]);
+ err = pSS->ToDevice (pWritePos, &dwResidual);
+
+ if(err)
+ {
+ ErrorTerminationState = TRUE;
+ return err;
+ }
+
+ // No more data to send this time
+ if (dwResidual == 0)
+ {
+ // For USB printer class drivers that have buffering we need to flush the buffer.
+ // If we are sending a special packet type and can't wait for a full buffer we have
+ // to flush
+ err = pSS->FlushIO ();
+ if (err)
+ {
+ ErrorTerminationState = TRUE;
+ return err;
+ }
+ // We successfully sent the entire non-original request, so reset to original
+ // request
+ if(!bOriginalRequest && !bCanceled)
+ {
+ pWriteBuff = pWriteBuffOriginal;
+ dwWriteCount = dwWriteCountOriginal;
+ BytesToWrite = BytesToWriteOriginal;
+ byCommandNumber = byCommandNumberOriginal;
+ bOriginalRequest = TRUE;
+ bCreditForCommand = FALSE;
+ byCreditWaitCount = byCreditWaitCountOriginal;
+ // We have to give the printer some time to update its status and send us a
+ // new status packet
+ pSS->BusyWait(500);
+ }
+ else
+ {
+ if(bOriginalRequest)
+ {
+ byIOWaitCount = 0;
+ }
+
+ iTotal_SLOW_POLL_Count = 0;
+ }
+
+ break; // Out of while loop
+ }
+ else
+ {
+ if (dwPrevResidual == dwResidual)
+ {
+ // The I/O didn't take any data, increment count
+ byIOWaitCount++;
+ }
+ else
+ {
+ // The I/O took some data, although not the full request
+ if(bOriginalRequest)
+ byIOWaitCount = 0;
+ }
+ }
+
+ // If I/O hasn't finished after our timeout limit, we have to bail.
+ if (byIOWaitCount >= IO_WAIT)
+ {
+ ErrorTerminationState = TRUE;
+ pSS->DisplayPrinterStatus (DISPLAY_COMM_PROBLEM);
+ return IO_ERROR;
+ }
+
+ // Check for user cancel each time through loop
+ if (pSS->BusyWait ((DWORD)0) == JOB_CANCELED)
+ {
+ pSS->DisplayPrinterStatus (DISPLAY_PRINTING_CANCELED);
+ }
+
+ } // while (residual > 0)
+
+ iCurrBuffSize = 0;
+
+ } // if(bCreditForCommand || bFlush)
+ else
+ {
+ // If we can't get credit and we've exceeded our wait limit, check for an error
+ if (byCreditWaitCount >= CREDIT_WAIT)
+ {
+ if(!bOriginalRequest)
+ {
+ // Something is wrong but we don't know what it is and we can't get credit
+ // to Query, Continue, Prepare to Cancel, or Cancel, so we have to bail
+ ErrorTerminationState = TRUE;
+ return JOB_CANCELED;
+ }
+ // Flush our internal buffer so that we can send command such as query or continue
+ if (iCurrBuffSize)
+ {
+ bFlush = TRUE;
+ }
+ else
+ {
+ // See if we can find out what's wrong
+ eDisplayStatus = ParseError(byStatusReg);
+
+ // For recoverable cases such as out of paper or top cover open, we just want to
+ // display the error and break. For non-recoverable cases we'll wait for the
+ // user to cancel the job and return.
+
+ // If the user terminated in an error state we have to send the CancelJob,
+ // unless the error state is a condition that would prevent a paper eject, such
+ // as paper jam or error trap. In those cases we'll just return, since the
+ // user has to power cycle the printer before he can continue
+ switch (eDisplayStatus)
+ {
+ case DISPLAY_PRINTING_CANCELED:
+ // User canceled in an error condition, break from here and let check
+ // for cancel at end of do loop send Cancel Job to printer
+ pSS->DisplayPrinterStatus (eDisplayStatus);
+ ErrorTerminationState = TRUE;
+
+ break;
+
+ case DISPLAY_ERROR_TRAP:
+ case DISPLAY_COMM_PROBLEM:
+ // These are unrecoverable cases. Don't let any more of this job be sent
+ // to the printer. We can't even eject the page at the end of the job
+
+ ErrorTerminationState = TRUE;
+ pSS->DisplayPrinterStatus (eDisplayStatus);
+
+ // Wait for user to cancel the job, otherwise they might miss the
+ // error message
+ while (pSS->BusyWait ((DWORD) 500) != JOB_CANCELED)
+ {
+ // nothing....
+ ;
+ }
+
+ return IO_ERROR;
+
+ case DISPLAY_TOP_COVER_OPEN:
+ pSS->DisplayPrinterStatus(DISPLAY_TOP_COVER_OPEN);
+
+ err = NO_ERROR;
+
+ // Wait for top cover to close or user to cancel
+ while(eDisplayStatus == DISPLAY_TOP_COVER_OPEN && !err)
+ {
+ err = pSS->BusyWait((DWORD)500);
+ if(err == JOB_CANCELED)
+ {
+ ErrorTerminationState = TRUE;
+ }
+
+ if(!err)
+ {
+ bUpdateState = pLDLEncap->UpdateState(FALSE);
+ if(bUpdateState)
+ {
+ eDisplayStatus = ParseError(byStatusReg);
+
+ // Need to check for cancel here, because we could miss it if the
+ // user presses cancel button then lifts lid or something
+ if(eDisplayStatus == DISPLAY_PRINTING_CANCELED)
+ {
+ ErrorTerminationState = TRUE;
+ bPrinterCancelButton = TRUE;
+ }
+ }
+ }
+ } // while(eDisplayStatus == DISPLAY_TOP_COVER_OPEN && !err)
+
+ if(!err && !bPrinterCancelButton)
+ {
+ pSS->DisplayPrinterStatus(DISPLAY_PRINTING);
+
+ // Give the printer some time to come back online
+ if(pSS->BusyWait((DWORD)1000) == JOB_CANCELED)
+ {
+ ErrorTerminationState = TRUE;
+ }
+ }
+
+ break;
+
+ case DISPLAY_OUT_OF_PAPER_NEED_CONTINUE:
+ pSS->DisplayPrinterStatus (DISPLAY_OUT_OF_PAPER_NEED_CONTINUE);
+
+ err = NO_ERROR;
+
+ // Wait for user to add more paper and press resume button on printer or
+ // select CONTINUE button from host's error dialog
+ while(eDisplayStatus == DISPLAY_OUT_OF_PAPER_NEED_CONTINUE && !err)
+ {
+ err = pSS->BusyWait((DWORD)500);
+
+ if (err == JOB_CANCELED)
+ {
+ ErrorTerminationState = TRUE;
+ }
+ else if(err == CONTINUE_FROM_BLOCK)
+ {
+ // Setup CONTINUE command
+ pWriteBuff = byContinue;
+ dwWriteCount = sizeof(byContinue);
+ BytesToWrite = sizeof(byContinue);
+ byCommandNumber = COMMAND_CONTINUE;
+ bOriginalRequest = FALSE;
+ bCreditForCommand = FALSE;
+ byCreditWaitCountOriginal = byCreditWaitCount;
+ byCreditWaitCount = 0;
+ }
+ else
+ {
+ bUpdateState = pLDLEncap->UpdateState(FALSE);
+ if(bUpdateState)
+ {
+ eDisplayStatus = ParseError(byStatusReg);
+
+ // Need to check for cancel here, because we could miss it if the
+ // user presses cancel button then lifts lid or something
+ if(eDisplayStatus == DISPLAY_PRINTING_CANCELED)
+ {
+ ErrorTerminationState = TRUE;
+ bPrinterCancelButton = TRUE;
+ }
+ }
+ }
+ } // while(eDisplayStatus == DISPLAY_OUT_OF_PAPER_NEED_CONTINUE && !err)
+
+ if(!err && !bPrinterCancelButton)
+ {
+ pSS->DisplayPrinterStatus(DISPLAY_PRINTING);
+ }
+
+ break;
+
+ case DISPLAY_BUSY:
+ pSS->DisplayPrinterStatus(DISPLAY_BUSY);
+
+ if (pSS->BusyWait ((DWORD) 5000) == JOB_CANCELED)
+ {
+ ErrorTerminationState = TRUE;
+ }
+
+ break;
+
+ // Other cases need no special handling, display the error and try to continue
+ default:
+ pSS->DisplayPrinterStatus (eDisplayStatus);
+
+ if (pSS->BusyWait ((DWORD) 500) == JOB_CANCELED)
+ {
+ ErrorTerminationState = TRUE;
+ }
+
+ break;
+ } // switch(eDisplayStatus)
+ } // else(iCurrBuffSize)
+ } // if(byCreditWaitCount >= CREDIT_WAIT)
+ } // else(bCreditForCommand || bFlush)
+
+ if (pSS->BusyWait ((DWORD)0) == JOB_CANCELED || bPrinterCancelButton)
+ {
+ pSS->DisplayPrinterStatus(DISPLAY_PRINTING_CANCELED);
+
+ // If there is anything waiting in the buffer, send it. I/O may have had a full buffer and
+ // may not have been able to buffer the full request for which we had credit, so if there
+ // are still BytesToWrite and we have credit for the current command, we have to buffer
+ // those and send them if we didn't terminate in an error condition.
+
+ // Another possibility is that we don't have credit for the current command. In that case
+ // we don't want to wait for BytesToWrite to be 0 or we'll be in a deadlock. We'll never
+ // get credit for the command and thus BytesToWrite will never be 0.
+
+ // We can only terminate in an error condition if we didn't have credit for the original
+ // command, so in that case we only have to flush what's in the buffer and not worry about
+ // the remaining BytesToWrite.
+
+ // After we check for these conditions we can send the Prepare to Cancel and Cancel
+ // Job commands
+ if( (iCurrBuffSize || (BytesToWrite && bCreditForCommand && !ErrorTerminationState) ) &&
+ !(bCanceling || bCanceled) )
+ {
+ bFlush = TRUE;
+ }
+ else if(!bCanceling)
+ {
+ pWriteBuff = byPrepareToCancel;
+ dwWriteCount = sizeof(byPrepareToCancel);
+ BytesToWrite = sizeof(byPrepareToCancel);
+ byCommandNumber = COMMAND_PREPARE_TO_CANCEL;
+ bOriginalRequest = FALSE;
+ bCreditForCommand = FALSE;
+ byCreditWaitCount = 0;
+ bCanceling = TRUE;
+ }
+ else if(!bCanceled)
+ {
+ // pWriteBuff will only be equal to byPrepareToCancel when we've setup the Prepare to
+ // Cancel command but haven't yet sent it to the printer
+ if(pWriteBuff != byPrepareToCancel)
+ {
+ pWriteBuff = pLDLEncap->pbyCancel;
+ dwWriteCount = sizeof(pLDLEncap->pbyCancel);
+ BytesToWrite = sizeof(pLDLEncap->pbyCancel);
+ byCommandNumber = COMMAND_CANCEL;
+ bOriginalRequest = FALSE;
+ bCreditForCommand = FALSE;
+ byCreditWaitCount = 0;
+ bCanceled = TRUE;
+ }
+ }
+ }
+ } while (BytesToWrite > 0);
+
+ if (bCanceled)
+ {
+ // Ensure that display still says we're cancelling
+ pSS->DisplayPrinterStatus(DISPLAY_PRINTING_CANCELED);
+ ErrorTerminationState = TRUE;
+ return JOB_CANCELED;
+ }
+ else
+ {
+ // Ensure any error message has been cleared
+ pSS->DisplayPrinterStatus (DISPLAY_PRINTING);
+ if (bCheckForCancelButton)
+ {
+ ulBytesSentSinceCancelCheck += dwWriteCount;
+ }
+ return NO_ERROR;
+ }
+}
+
+DRIVER_ERROR DJ3320::ParsePenInfo (PEN_TYPE& ePen, BOOL QueryPrinter)
+{
+
+ char *str;
+ int num_pens = 0;
+
+ DRIVER_ERROR err = SetPenInfo (str, QueryPrinter);
+ ERRCHECK;
+
+ // the first byte indicates how many pens are supported
+ if ((str[0] >= '0') && (str[0] <= '9'))
+ {
+ num_pens = str[0] - '0';
+ }
+ else if ((str[0] >= 'A') && (str[0] <= 'F'))
+ {
+ num_pens = 10 + (str[0] - 'A');
+ }
+ else
+ {
+ return BAD_DEVICE_ID;
+ }
+
+ if ((int) strlen (str) < (num_pens * 8))
+ {
+ return BAD_DEVICE_ID;
+ }
+
+ char *p = str + 1;
+ BYTE penInfoBits[4];
+/*
+ * Pen Type Info
+ *
+ Bit 31 (1 bit)
+
+ 1 if these fields describe a print head
+ 0 otherwise
+ Bit 30 (1 bit)
+
+ 1 if these fields describe an ink supply
+ 0 otherwise
+
+ Bits 29 .. 24 (6 bits) describes the pen/supply type:
+
+ 0 = none
+ 1 = black
+ 2 = CMY
+ 3 = KCM
+ 4 = Cyan
+ 5 = Meganta
+ 6 = Yellow
+ 7 = Cyan - low dye load
+ 8 = Magenta - low dye load
+ 9 = Yellow - low dye load (may never be used, but reserve space anyway) [def added Jun 3, 2002]
+ 10 = gGK - two shades of grey plus black; g=light grey, G=medium Grey, K=black [added Sep 12, 02]
+ 11 .. 62 = reserved for future use
+ 63=Unknown
+ */
+ ePen = NO_PEN;
+
+ for (int i = 0; i < num_pens; i++, p += 8)
+ {
+ AsciiHexToBinary (penInfoBits, p, 8);
+ if ((penInfoBits[1] & 0xf8) == 0xf8)
+ {
+// The high 5 bits in the 3rd and 4th nibble (second byte) identify the
+// installed pen. If all 5 bits are on, user has installed an incompatible pen.
+ return UNSUPPORTED_PEN;
+ }
+ if ((penInfoBits[0] & 0x80) != 0x80) // if Bit 31 is 0, this is not a pen
+ {
+ continue;
+ }
+ BYTE penColor = penInfoBits[0] & 0x3F;
+ switch (penColor)
+ {
+ case 0:
+ {
+ break;
+ }
+ case 1:
+ ePen = BLACK_PEN;
+ break;
+ case 2:
+ {
+ if (ePen == BLACK_PEN)
+ {
+ ePen = BOTH_PENS;
+ }
+ else if (ePen == MDL_PEN)
+ {
+ ePen = MDL_BOTH;
+ }
+ else
+ {
+ ePen = COLOR_PEN;
+ }
+ break;
+ }
+ case 3:
+ if (ePen == BLACK_PEN)
+ {
+ ePen = MDL_AND_BLACK_PENS;
+ }
+ else if (ePen == COLOR_PEN)
+ {
+ ePen = MDL_BOTH;
+ }
+ else if (ePen == BOTH_PENS)
+ {
+ ePen = MDL_BLACK_AND_COLOR_PENS;
+ }
+ else
+ {
+ ePen = MDL_PEN;
+ }
+ break;
+ case 4: // cyan pen
+ case 5: // magenta pen
+ case 6: // yellow pen
+ case 7: // low dye load cyan pen
+ case 8: // low dye load magenta pen
+ case 9: // low dye load yellow pen
+ if (ePen == BLACK_PEN || ePen == BOTH_PENS)
+ {
+ ePen = BOTH_PENS;
+ }
+ else
+ {
+ ePen = COLOR_PEN;
+ }
+ break;
+ default:
+ ePen = UNKNOWN_PEN;
+ }
+ }
+
+ return NO_ERROR;
+}
+
+DRIVER_ERROR DJ3320::VerifyPenInfo()
+{
+
+ DRIVER_ERROR err = NO_ERROR;
+
+ if(IOMode.bDevID == FALSE)
+ return err;
+
+ ePen = NO_PEN;
+
+ err = ParsePenInfo(ePen);
+ ERRCHECK;
+
+ while (ePen == NO_PEN)
+ {
+ err = ParsePenInfo (ePen);
+ ERRCHECK;
+ if (ePen == NO_PEN)
+ {
+ pSS->DisplayPrinterStatus (DISPLAY_NO_PENS);
+ if (pSS->BusyWait (500) == JOB_CANCELED)
+ return JOB_CANCELED;
+ }
+
+ }
+
+ pSS->DisplayPrinterStatus (DISPLAY_PRINTING);
+
+ return NO_ERROR;
+}
+
+DRIVER_ERROR DJ3320::CheckInkLevel()
+{
+ DRIVER_ERROR err;
+ char* pStr;
+
+ BYTE bDevIDBuff[DevIDBuffSize];
+
+ if (!IOMode.bDevID)
+ {
+ return NO_ERROR;
+ }
+
+ err = pSS->GetDeviceID(bDevIDBuff, DevIDBuffSize, TRUE);
+ if (err!=NO_ERROR)
+ {
+ return NO_ERROR;
+ }
+
+ if ( (pStr=(char *)strstr((const char*)bDevIDBuff+2,";S:")) == NULL )
+ {
+ return NO_ERROR;
+ }
+
+ pStr += 21;
+ int numPens = 0;
+ if (*pStr > '0' && *pStr < '9')
+ {
+ numPens = *pStr - '0';
+ }
+ else if (*pStr > 'A' && *pStr < 'F')
+ {
+ numPens = *pStr - 'A';
+ }
+ else if (*pStr > 'a' && *pStr < 'f')
+ {
+ numPens = *pStr - 'a';
+ }
+
+ pStr++;
+
+ BYTE penInfoBits[4];
+ BYTE blackink = 0;
+ BYTE colorink = 0;
+ BYTE photoink = 0;
+ BYTE greyink = 0;
+ for (int i = 0; i < numPens; i++, pStr += 8)
+ {
+ AsciiHexToBinary (penInfoBits, pStr, 8);
+
+ if ((penInfoBits[0] & 0x80) != 0x80) // if Bit 31 is 0, this is not a pen
+ {
+ continue;
+ }
+ int penColor = penInfoBits[0] & 0x3F;
+ switch (penColor)
+ {
+ case 1:
+ blackink = penInfoBits[1] & 0x7;
+ break;
+ case 2:
+ colorink = penInfoBits[1] & 0x7;
+ break;
+ case 3:
+ photoink = penInfoBits[1] & 0x7;
+ break;
+ case 10:
+ greyink = penInfoBits[1] & 0x7;
+ break;
+ case 4:
+ case 5:
+ case 6:
+ case 7:
+ case 8:
+ case 9:
+ colorink = penInfoBits[1] & 0x7; // REVISIT: these are C, M, Y respectively
+ break;
+ default:
+ break;
+ }
+ }
+ if (blackink < 2 && colorink < 2 && photoink < 2 && greyink < 2)
+ {
+ return NO_ERROR;
+ }
+ else if (blackink > 1 && colorink > 1 && photoink > 1)
+ {
+ return WARN_LOW_INK_COLOR_BLACK_PHOTO;
+ }
+ else if (greyink > 1 && colorink > 1 && photoink > 1)
+ {
+ return WARN_LOW_INK_COLOR_GREY_PHOTO;
+ }
+ else if (blackink > 1 && colorink > 1)
+ {
+ return WARN_LOW_INK_BOTH_PENS;
+ }
+ else if (blackink > 1 && photoink > 1)
+ {
+ return WARN_LOW_INK_BLACK_PHOTO;
+ }
+ else if (greyink > 1 && colorink > 1)
+ {
+ return WARN_LOW_INK_COLOR_GREY;
+ }
+ else if (greyink > 1 && photoink > 1)
+ {
+ return WARN_LOW_INK_GREY_PHOTO;
+ }
+ else if (colorink > 1 && photoink > 1)
+ {
+ return WARN_LOW_INK_COLOR_PHOTO;
+ }
+ else if (blackink > 1)
+ {
+ return WARN_LOW_INK_BLACK;
+ }
+ else if (colorink > 1)
+ {
+ return WARN_LOW_INK_COLOR;
+ }
+ else if (photoink > 1)
+ {
+ return WARN_LOW_INK_PHOTO;
+ }
+ else if (greyink > 1)
+ {
+ return WARN_LOW_INK_GREY;
+ }
+ else if (colorink > 1)
+ {
+ return WARN_LOW_INK_COLOR;
+ }
+ else
+ {
+ return NO_ERROR;
+ }
+} //CheckInkLevel
+
+
+DRIVER_ERROR DJ3320::SkipRasters (int nBlankRasters)
+{
+ return (pLDLEncap->SetVerticalSkip (nBlankRasters));
+}
+
+DRIVER_ERROR DJ3320::CleanPen()
+{
+ return pLDLEncap->CleanPen ();
+}
+
+DRIVER_ERROR DJ3320::Flush (int FlushSize)
+{
+ pLDLEncap->Flush ();
+ return NO_ERROR;
+}
+
+Header3320::Header3320 (Printer* p,PrintContext* pc)
+ : Header(p,pc)
+{
+
+}
+
+DRIVER_ERROR Header3320::FormFeed ()
+{
+ return (((DJ3320 *) thePrinter)->pLDLEncap->EndPage ());
+}
+
+DRIVER_ERROR Header3320::EndJob()
+{
+ ((DJ3320 *) thePrinter)->pLDLEncap->EndJob ();
+ return NO_ERROR;
+}
+
+DRIVER_ERROR Header3320::Send ()
+{
+
+ DJ3320 *pXBow = (DJ3320 *) thePrinter;
+
+ return (pXBow->pLDLEncap->StartJob ());
+
+}
+
+DRIVER_ERROR Header3320::SendCAPy (unsigned int iAbsY)
+{
+ return NO_ERROR;
+}
+
+LDLEncap::LDLEncap (DJ3320 *pPrinter, SystemServices *pSys, PrintContext *pc)
+{
+
+ constructor_error = NO_ERROR;
+ piCreditCount = NULL;
+ m_pSys = pSys;
+ pPrinterXBow = pPrinter;
+ m_iXResolution = pc->EffectiveResolutionX ();
+ m_iYResolution = pc->EffectiveResolutionY ();
+ m_pthisPC = pc;
+ m_cPrintDirection = PRNDRN_LEFTTORIGHT;
+ m_SwathData = NULL;
+ m_sRefCount = 6;
+ m_iBlankRasters = 0;
+ m_iRasterCount = 0;
+ m_iVertPosn = (int) (m_pthisPC->PrintableStartY () * DEVUNITS_XBOW);
+ m_iNumColors = 4;
+ m_iLeftMargin = (int) (m_pthisPC->PrintableStartX () * DEVUNITS_XBOW);
+
+ ////////////////////////////////////////////////////////////////////////////////////
+ float fXOverSpray = 0.0;
+ float fYOverSpray = 0.0;
+ float fLeftOverSpray = 0.0;
+ float fTopOverSpray = 0.0;
+ FullbleedType fbType;
+ if (m_pthisPC->bDoFullBleed &&
+ pPrinterXBow->FullBleedCapable (m_pthisPC->thePaperSize,
+ &fbType,
+ &fXOverSpray, &fYOverSpray,
+ &fLeftOverSpray, &fTopOverSpray))
+ {
+
+ /*
+ * To get the printer to do fullbleed printing, move the vertical postion
+ * to cover the overspary. Overspray is needed to take care of
+ * skew during paper pick. These values may be mech dependent.
+ * Currently, supported only on PhotoSmart 100, Malibu. DJ3600 supports
+ * fullbleed printing also. The current values for overspray are
+ * 0.059 inch for top, bottom and left edges and 0.079 for right edge.
+ */
+ m_iVertPosn = (int) (-fTopOverSpray * DEVUNITS_XBOW);
+ m_iLeftMargin = (int) (-fLeftOverSpray * DEVUNITS_XBOW);
+ }
+
+ m_bStartPageNotSent = TRUE;
+
+ m_iNextRaster = 0;
+ m_iNextColor = 0;
+
+ m_iBitDepth = 1;
+ m_cPlaneNumber = 0;
+ m_cPrintQuality = (BYTE) QUALITY_NORMAL;
+ m_cMediaType = (BYTE) MEDIA_PLAIN;
+
+ BYTE cm = COLOR;
+ QUALITY_MODE cqm;
+ MEDIATYPE cmt;
+ COLORMODE ccm;
+ BOOL cdt;
+ DRIVER_ERROR err = m_pthisPC->GetPrintModeSettings (cqm, cmt, ccm, cdt);
+ if (err == NO_ERROR)
+ {
+ if (cqm == QUALITY_BEST && cmt == MEDIA_PHOTO)
+ m_iBitDepth = 2;
+ m_cPrintQuality = (BYTE) cqm;
+ m_cMediaType = (BYTE) cmt;
+ cm = (BYTE) ccm;
+ }
+
+ if (pPrinterXBow->ePen == BLACK_PEN || pPrinterXBow->ePen == MDL_PEN || cm == GREY_K)
+ m_iNumColors = 1;
+ else if (pPrinterXBow->ePen == COLOR_PEN || cm == GREY_CMY)
+ m_iNumColors = 3;
+ else if (pPrinterXBow->ePen == BOTH_PENS && m_iBitDepth == 2)
+ m_iNumColors = 3;
+ else if (pPrinterXBow->ePen == MDL_BOTH)
+ m_iNumColors = 6;
+
+ m_bBidirectionalPrintingOn = TRUE; //FALSE;
+
+ UInt16 mem_needed = SIZEOF_LDLHDR
+ + SIZEOF_LDL_PRTSWP_CMDOPT
+ + SIZEOF_LDL_PRTSWP_OPTFLDS
+ + 6 * SIZEOF_LDL_PRTSWP_COLROPT
+ + SIZEOF_LDL_COLROPT_ACTIVECOLR
+ + SIZEOF_LDLTERM;
+ m_szCmdBuf = new BYTE[mem_needed];
+ CNEWCHECK (m_szCmdBuf);
+
+ m_bLittleEndian = TRUE;
+ {
+ union
+ {
+ short a;
+ char b[2];
+ }c;
+ c.a = 0x1234;
+ if (c.b[0] == 0x12)
+ m_bLittleEndian = FALSE;
+ }
+
+ m_szCmdBuf[0] = FRAME_SYN;
+ m_szCmdBuf[1] = 0;
+ m_szCmdBuf[3] = 0;
+ m_szCmdBuf[4] = 0;
+ m_szCmdBuf[5] = 0;
+ m_szCmdBuf[6] = 0;
+ m_szCmdBuf[8] = 0;
+
+ // Pacing and status handling data
+ bNewStatus = FALSE;
+ memset(byStatusBuff, 0, sizeof(byStatusBuff));
+
+ m_pbyPacketBuff = NULL;
+ m_pbyPacketBuff = pSys->AllocMem (MAX_PACKET_READ_SIZE);
+ CNEWCHECK (m_pbyPacketBuff);
+
+ m_dwPacketBuffSize = MAX_PACKET_READ_SIZE;
+
+ // Setup Sync command
+ pbySync = m_pSys->AllocMem(SYNCSIZE);
+ CNEWCHECK(pbySync);
+
+ memset(pbySync, 0, SYNCSIZE);
+ memcpy(pbySync, bySync, sizeof(bySync));
+ memset((pbySync + sizeof(bySync)), 0, SYNC_CMD_OPT_SIZE);
+ pbySync[sizeof(bySync) + SYNC_CMD_OPT_SIZE] = FRAME_SYN;
+ memset((pbySync + sizeof(bySync) + SYNC_CMD_OPT_SIZE + sizeof(FRAME_SYN)), 0, LDL_MAX_IMAGE_SIZE);
+
+/*
+ * Alignment Values.
+ * Currently, only Black to Color Vertical Alignment value is used.
+ * This value should really be obtained by running the pen alignment test.
+ * A value of 12 device units seems to be a good default.
+ */
+ BYTE cVertAlign = 0;
+ if (pPrinterXBow->ePen == BOTH_PENS)
+ {
+ if (pSys->GetVerticalAlignmentValue(&cVertAlign))
+ {
+ m_cKtoCVertAlign = cVertAlign;
+ }
+ else
+ {
+ m_cKtoCVertAlign = 12;
+ }
+ }
+ else if (pPrinterXBow->ePen == MDL_BOTH)
+ {
+ if (pSys->GetVerticalAlignmentValue(&cVertAlign))
+ {
+ m_cPtoCVertAlign = cVertAlign;
+ }
+ else
+ {
+ m_cPtoCVertAlign = 6;
+ }
+ }
+ else
+ {
+ m_cKtoCVertAlign = 12;
+ m_cPtoCVertAlign = 6;
+ }
+}
+
+void LDLEncap::AllocateSwathBuffer (unsigned int RasterSize)
+{
+ int size = RasterSize;
+ size = (size / 8 + 1) * 8;
+ m_iImageWidth = size;
+
+ constructor_error = NO_ERROR;
+ m_ldlCompressData = NULL;
+
+#ifdef APDK_LDL_COMPRESS
+ if (pPrinterXBow->m_iLdlVersion == 1)
+ {
+ m_ldlCompressData = new comp_ptrs_t;
+ }
+#endif
+
+ if (m_iBitDepth == 2)
+ {
+ size *= 2;
+ }
+
+ int iSwings = pPrinterXBow->m_iBytesPerSwing / 2;
+ int iCompressBufSize = iSwings * LDL_MAX_IMAGE_SIZE+20; // additional space for load sweep command
+ m_szCompressBuf = new BYTE[iCompressBufSize];
+ CNEWCHECK (iCompressBufSize);
+ memset (m_szCompressBuf, 0, iCompressBufSize);
+
+ BYTE *p = NULL;
+ int iSwathBuffSize;
+
+ m_sSwathHeight = SWATH_HEIGHT;
+
+ /*
+ * This swath buffer cannot be greater than the number of nozzles - 400 for black
+ * and 100 for color - we can use.
+ */
+
+ int iAdjHeight = (pPrinterXBow->m_iNumBlackNozzles / 32) * 8;
+ if (pPrinterXBow->ePen == BLACK_PEN)
+ {
+ m_sSwathHeight = m_sSwathHeight * 4;
+ if (m_sSwathHeight * 1200 / m_iYResolution > pPrinterXBow->m_iNumBlackNozzles)
+ m_sSwathHeight = m_iYResolution / 3;
+ }
+ else if (m_cPrintQuality != QUALITY_DRAFT && m_iYResolution > 300 && m_iNumColors > 1 && m_iBitDepth == 1) // Collie change
+ {
+ m_sSwathHeight = (m_sSwathHeight / 4) * 4 * 2;
+ if (m_sSwathHeight > 200)
+ m_sSwathHeight = 200;
+ }
+
+ else if (m_iBitDepth == 2)
+ m_sSwathHeight = iAdjHeight * 4;
+
+ if (m_cPrintQuality == QUALITY_NORMAL)
+ m_sSwathHeight = iAdjHeight * 2;
+
+ if (m_cPrintQuality == QUALITY_DRAFT && pPrinterXBow->ePen != BLACK_PEN)
+ {
+ m_sSwathHeight *= iSwings;
+ }
+
+ while (m_sSwathHeight > 16)
+ {
+ iSwathBuffSize = m_iNumColors * sizeof (BYTE *) +
+ m_iNumColors * m_sSwathHeight * sizeof (BYTE *) +
+ size * m_iNumColors * m_sSwathHeight;
+ if ((p = m_pSys->AllocMem(iSwathBuffSize)) == NULL)
+ {
+ m_sSwathHeight = (m_sSwathHeight / 16) * 8;
+ continue;
+ }
+ break;
+ }
+ if (m_sSwathHeight < 16)
+ {
+ m_sSwathHeight = 16;
+ iSwathBuffSize = m_iNumColors * sizeof (BYTE *) +
+ m_iNumColors * m_sSwathHeight * sizeof (BYTE *) +
+ size * m_iNumColors * m_sSwathHeight;
+ p = m_pSys->AllocMem(iSwathBuffSize);
+ CNEWCHECK (p);
+ }
+
+ int i;
+ m_SwathData = (BYTE ***) p;
+ for (i = 0; i < m_iNumColors; i++)
+ m_SwathData[i] = (BYTE **) (p + sizeof (BYTE *) * m_iNumColors + i * m_sSwathHeight * sizeof (BYTE *));
+
+ for (i = 0; i < m_iNumColors; i++)
+ {
+ p = (BYTE *) m_SwathData + sizeof (BYTE *) * m_iNumColors +
+ m_iNumColors * m_sSwathHeight * sizeof (BYTE *) +
+ size * m_sSwathHeight * i;
+ for (int j = 0; j < m_sSwathHeight; j++)
+ {
+ memset (p, 0, size);
+ m_SwathData[i][j] = p;
+ p = p + size;
+ }
+ }
+
+ if (m_cPrintQuality != QUALITY_DRAFT && m_iYResolution != 300)
+ {
+ m_iRasterCount = (m_sSwathHeight - m_sSwathHeight / (4*m_iBitDepth)) * m_iNumColors;
+ m_iVertPosn -= (((m_sSwathHeight - m_sSwathHeight / (4*m_iBitDepth)) * 600 / m_iYResolution) * DEVUNITS_XBOW / 600);
+ }
+ m_cPassNumber = 0;
+
+ float fXOverSpray = 0.0;
+ float fYOverSpray = 0.0;
+ float fLeftOverSpray = 0.0;
+ float fTopOverSpray = 0.0;
+ FullbleedType fbType;
+ if (m_pthisPC->bDoFullBleed &&
+ pPrinterXBow->FullBleedCapable (m_pthisPC->thePaperSize,
+ &fbType,
+ &fXOverSpray, &fYOverSpray,
+ &fLeftOverSpray, &fTopOverSpray))
+ {
+ if (m_iVertPosn < -850) m_iVertPosn = -850;
+ }
+ else
+ {
+ if (m_iVertPosn < -600) m_iVertPosn = -600;
+ }
+ if (m_iBitDepth == 2)
+ m_iVertPosn += 6;
+}
+
+unsigned int LDLEncap::GetSwathWidth (int iStart, int iLast, int iWidth)
+{
+ int k;
+ int i, j;
+ for (i = iWidth - 1 /*sizeof (long)*/; i > -1; i--)
+ {
+ for (j = iStart; j < iLast; j++)
+ {
+ for (k = m_iRasterCount / m_iNumColors-1; k >= 0; k--)
+ {
+
+ if (m_SwathData[j][k][i])
+ {
+ return (i+1);
+ }
+ }
+ }
+ }
+
+ return 0;
+}
+
+void LDLEncap::Flush ()
+{
+// if (m_iRasterCount)
+// Process (NULL, 0);
+}
+
+DRIVER_ERROR LDLEncap::SetVerticalSkip (int nBlankRasters)
+{
+ DRIVER_ERROR err = NO_ERROR;
+#if 0
+ if (m_iRasterCount == 0)
+ {
+ m_iBlankRasters += nBlankRasters;
+ return err;
+ }
+#endif
+ int iCount = m_iNumColors * m_iBitDepth;
+ if (m_iBitDepth == 2 && m_iNumColors != 6)
+ iCount++;
+
+ while (nBlankRasters > 0)
+ {
+ for (int i = 0; i < iCount; i++)
+ {
+ err = Encapsulate (NULL, m_iImageWidth, 0);
+ ERRCHECK;
+ }
+ nBlankRasters--;
+ }
+ return err;
+}
+
+BOOL LDLEncap::IsBlankRaster (BYTE *raster, int width)
+{
+ while (width > 0)
+ {
+ if (*raster)
+ return FALSE;
+ width--;
+ }
+ return FALSE;
+}
+
+DRIVER_ERROR LDLEncap::Encapsulate (const BYTE *input, DWORD size, BOOL bLastPlane)
+{
+ DRIVER_ERROR err = NO_ERROR;
+ int iPlaneNum = 0;
+ if (size > (DWORD) m_iImageWidth)
+ size = m_iImageWidth;
+ if (m_iBitDepth == 2)
+ {
+ if (m_iNumColors != 6)
+ {
+ if (m_cPlaneNumber == 0)
+ {
+ m_cPlaneNumber++;
+ return NO_ERROR;
+ }
+ }
+ int iCPlane;
+ if (m_iNumColors == 6)
+ {
+ iPlaneNum = m_cPlaneNumber % 2;
+ }
+ else
+ {
+ iPlaneNum = (m_cPlaneNumber + 1) % 2;
+ }
+ int iRowNum = (m_iRasterCount / 6) * 2 + iPlaneNum;
+ iRowNum = m_iNextRaster;
+ if (m_iNumColors == 6)
+ {
+ iCPlane = m_cPlaneNumber / 2;
+ }
+ else
+ {
+ iCPlane = (m_cPlaneNumber - 1) / 2;
+ }
+ if (iPlaneNum == 0)
+ {
+ if (!input)
+ memset (m_SwathData[iCPlane][iRowNum], 0, m_iImageWidth * 2);
+ else
+ memcpy (m_SwathData[iCPlane][iRowNum], input, size);
+ }
+ if (m_iNumColors == 6)
+ {
+ m_cPlaneNumber = (m_cPlaneNumber + 1) % 12;
+ }
+ else
+ {
+ m_cPlaneNumber = (m_cPlaneNumber + 1) % 8;
+ }
+
+ if (iPlaneNum == 1)
+ {
+ // do the dotmapping here
+ BYTE cbyte1, cbyte2;
+ BYTE c1, c2;
+ int j = 0;
+ BYTE r1b1 = 0;
+ BYTE r1b2 = 0;
+ BYTE r2b1 = 0;
+ BYTE r2b2 = 0;
+ BYTE bitmask[8] = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01};
+
+ // Collie changes
+ int iNextBitPos = m_iImageWidth;
+ int iJIncrement = 1;
+ if (pPrinterXBow->m_iLdlVersion == 2)
+ {
+ iNextBitPos = 1;
+ iJIncrement = 2;
+ }
+
+ memcpy (m_szCompressBuf, m_SwathData[iCPlane][m_iNextRaster], size);
+
+ static BYTE rand_table[4][4] = {{0, 3, 1, 2},
+ {3, 1, 2, 0},
+ {1, 2, 0, 3},
+ {2, 0, 3, 1}};
+
+ BYTE rt1, rt2;
+ rt1 = iRowNum % 4;
+
+ for (unsigned int i = 0; i < size; i++)
+ {
+ cbyte2 = m_szCompressBuf[i];
+ cbyte1 = (input == NULL) ? 0 : input[i];
+
+// 1200 dpi raster split into 2 600 dpi rasters
+
+ r1b1 = 0;
+ r1b2 = 0;
+ r2b1 = 0;
+ r2b2 = 0;
+
+ for (int ibit = 0; ibit < 8; ibit++)
+ {
+ c1 = (cbyte1 & bitmask[ibit]) ? 1 : 0;
+ c2 = (cbyte2 & bitmask[ibit]) ? 1 : 0;
+ c1 = 2 * c1 + c2;
+
+ rt2 = (i + ibit) % 4;
+ rt2 = rand_table[rt1][rt2];
+
+ if (c1 == 2)
+ {
+ if (rt2 == 0)
+ {
+ r1b1 = r1b1 | (0xff & (cbyte1 & bitmask[ibit]));
+ r2b2 = r2b2 | (0xff & bitmask[ibit]);
+ }
+ else if (rt2 == 1)
+ {
+ r1b2 = r1b2 | (0xff & bitmask[ibit]);
+ r2b1 = r2b1 | (0xff & bitmask[ibit]);
+ }
+
+ else if (rt2 == 2)
+ {
+ r1b1 = r1b1 | (0xff & bitmask[ibit]);
+ r2b1 = r2b1 | (0xff & bitmask[ibit]);
+ }
+ else if (rt2 == 3)
+ {
+ r1b2 = r1b2 | (0xff & bitmask[ibit]);
+ r2b2 = r2b2 | (0xff & bitmask[ibit]);
+ }
+
+ }
+ else if (c1 == 1)
+ {
+ if (rt2 == 0)
+ r1b1 = r1b1 | (0xff & bitmask[ibit]);
+ else if (rt2 == 1)
+ r1b2 = r1b2 | (0xff & bitmask[ibit]);
+ else if (rt2 == 2)
+ r2b1 = r2b1 | (0xff & bitmask[ibit]);
+ else
+ r2b2 = r2b2 | (0xff & bitmask[ibit]);
+
+ }
+ else if (c1 == 3)
+ {
+ r1b1 = r1b1 | (0xff & bitmask[ibit]);
+ r1b2 = r1b2 | (0xff & bitmask[ibit]);
+ r2b1 = r2b1 | (0xff & bitmask[ibit]);
+ r2b2 = r2b2 | (0xff & bitmask[ibit]);
+ }
+ }
+ m_SwathData[iCPlane][m_iNextRaster][j] = r1b1;
+ m_SwathData[iCPlane][m_iNextRaster][j+iNextBitPos] = r1b2;
+ m_SwathData[iCPlane][m_iNextRaster+1][j] = r2b1;
+ m_SwathData[iCPlane][m_iNextRaster+1][j+iNextBitPos] = r2b2;
+
+ j += iJIncrement;
+ }
+
+ if (m_iNumColors == 6)
+ {
+ m_cPlaneNumber = m_cPlaneNumber % 12;
+ }
+ else
+ {
+ m_cPlaneNumber = m_cPlaneNumber % 7;
+ }
+ }
+ }
+ else
+ {
+ if (!input || size == 0)
+ memset (m_SwathData[m_iNextColor][m_iNextRaster], 0, m_iImageWidth);
+ else
+ memcpy (m_SwathData[m_iNextColor][m_iNextRaster], input, size);
+ }
+ m_iRasterCount++;
+ if (m_iBitDepth == 1 || (m_iBitDepth == 2 && iPlaneNum == 1))
+ m_iNextColor++;
+ if (m_iNextColor == m_iNumColors)
+ {
+ m_iNextColor = 0;
+ if (m_iBitDepth == 2)
+ m_iNextRaster += 2;
+ else
+ m_iNextRaster++;
+ }
+ if (m_iRasterCount < m_sSwathHeight * m_iNumColors)
+ return NO_ERROR;
+
+ if (m_bStartPageNotSent)
+ {
+ err = StartPage ();
+ if (err != NO_ERROR)
+ return err;
+ }
+
+ err = ProcessSwath (size);
+
+ if (m_iNextRaster >= m_sSwathHeight)
+ {
+ m_iNextRaster = 0;
+ }
+ return err;
+}
+
+DRIVER_ERROR LDLEncap::ProcessSwath (int iCurRasterSize)
+{
+
+ DRIVER_ERROR err = NO_ERROR;
+ unsigned int start = 0;
+ int size = 0;
+ Int32 iVertPosn;
+ Int16 sCurSwathHeight = m_iRasterCount / m_iNumColors;
+ Int32 LeftEdge = 0;
+ int i;
+ m_iVertPosn += ((m_iBlankRasters) * 600 / m_iYResolution) * DEVUNITS_XBOW / 600;
+ m_iBlankRasters = 0;
+
+ iVertPosn = m_iVertPosn;
+
+ BOOL bColorPresent = TRUE;
+ BOOL bBlackPresent = TRUE;
+ BOOL bPhotoPresent = TRUE;
+ short sColorSize = 0;
+
+ int StartColor = 0;
+ int LastColor = 1;
+ Int32 RightEdge;
+ int delta = 2;
+ int iColors = 0;
+ UInt32 uiSwathSize = 0;
+
+ int iSwings = pPrinterXBow->m_iBytesPerSwing;
+
+ if (m_iNumColors == 1)
+ {
+ bColorPresent = 0;
+ bPhotoPresent = 0;
+/*
+ if (pPrinterXBow->ePen == BLACK_PEN)
+ bPhotoPresent = 0;
+ else
+ bBlackPresent = 0;
+ */
+ }
+ if (m_iNumColors == 3)
+ {
+ bBlackPresent = 0;
+ bPhotoPresent = 0;
+ }
+ if (m_iNumColors == 6)
+ {
+ bBlackPresent = 0;
+ }
+ if (m_iNumColors == 4)
+ {
+ bPhotoPresent = 0;
+ }
+
+ if (!m_bBidirectionalPrintingOn)
+ m_cPrintDirection = PRNDRN_LEFTTORIGHT;
+
+ Int16 j;
+ int n;
+ int count;
+ int iStartRaster = m_cPassNumber % (2 * m_iBitDepth);
+ BYTE mask = 0xFF;
+
+ if (pPrinterXBow->m_iLdlVersion == 2)
+ {
+ iStartRaster = 0; // Version 2 - REVISIT
+ }
+
+ if (m_cPrintQuality != QUALITY_DRAFT && m_iYResolution != 300)
+ {
+ if ((m_cPassNumber % (4 * m_iBitDepth)) < (2 * m_iBitDepth))
+ mask = 0xAA;
+ else
+ mask = 0x55;
+ }
+
+/*
+ * Photo Swath
+ */
+
+ BYTE csavMask = mask;
+
+ Int16 iOffset = 0;
+
+ if (m_sRefCount > 64000)
+ m_sRefCount = 6;
+
+ if (bPhotoPresent)
+ {
+ if (bColorPresent)
+ {
+ iColors = 6;
+ LastColor = 6;
+ StartColor = 0;
+ if (pPrinterXBow->m_iLdlVersion == 1)
+ {
+ // 1200 dpi split into two
+ size = GetSwathWidth (StartColor, LastColor, iCurRasterSize/* * m_iBitDepth*/);
+ }
+ else
+ {
+ size = GetSwathWidth (StartColor, LastColor, iCurRasterSize * m_iBitDepth);
+ }
+ }
+ else
+ {
+ iColors = 1;
+ LastColor = 1;
+ StartColor = 0;
+ // 1200 dpi split into two
+ size = GetSwathWidth (StartColor, LastColor, iCurRasterSize/* * m_iBitDepth*/);
+ }
+ }
+
+ if (bPhotoPresent && size)
+ {
+ if (size % iSwings)
+ size = ((size/iSwings) + 1) * iSwings;
+ if (pPrinterXBow->m_iLdlVersion == 1)
+ {
+ RightEdge = LeftEdge + (size * 8 * 600 / m_iXResolution - 1 * (600 / m_iYResolution)) *
+ (DEVUNITS_XBOW / 600);
+ }
+ else
+ {
+ RightEdge = LeftEdge + (size * 8 * 600 / m_iXResolution - 1 * (600 / m_iYResolution)) *
+ (DEVUNITS_XBOW / (600 * m_iBitDepth));
+ }
+ Int16 sLastNozzle;
+ Int16 sFirstNozzle = 1;
+ unsigned int uSweepSize;
+ int jDelta = m_iYResolution / pPrinterXBow->m_iColorPenResolution;
+ jDelta *= m_iBitDepth;
+
+ uiSwathSize = size * iColors * sCurSwathHeight / jDelta;
+
+ uSweepSize = sCurSwathHeight * iSwings / jDelta;
+ n = LDL_MAX_IMAGE_SIZE / (uSweepSize);
+ count = 0;
+
+ if (m_iBitDepth == 2)
+ iStartRaster = (4 - (iStartRaster+1)) % 4;
+
+ if (pPrinterXBow->m_iLdlVersion == 2)
+ {
+ iStartRaster = 0; // Collie - REVISIT
+ }
+
+ sLastNozzle = sFirstNozzle - 1 + sCurSwathHeight / jDelta;
+
+ BYTE *cb = m_szCompressBuf + 16; // load sweep command
+ memset (m_szCompressBuf, 0x0, LDL_MAX_IMAGE_SIZE * (iSwings / 2));
+
+
+ // 1200 dpi split into two
+ int ib = 0;
+
+ if (m_iYResolution > 300 && m_cPrintQuality != QUALITY_DRAFT)
+ {
+ iOffset = (sCurSwathHeight / (4 * m_iBitDepth));
+ iOffset = iOffset + iOffset * ((m_cPassNumber) % (4 * m_iBitDepth));
+ }
+
+ BYTE cVertAlign = 0;
+
+ if (bColorPresent)
+ {
+ cVertAlign = m_cPtoCVertAlign;
+ }
+
+ for (ib = 0; ib < (int) m_iBitDepth; ib++)
+ {
+ if (m_cPrintDirection == PRNDRN_RIGHTTOLEFT)
+ {
+ start = size - iSwings;
+ delta = -iSwings;
+ }
+ else
+ {
+ start = 0;
+ delta = iSwings;
+ }
+
+ err = PrintSweep (uiSwathSize, bColorPresent, FALSE, bPhotoPresent,
+ iVertPosn+cVertAlign, LeftEdge, RightEdge, m_cPrintDirection,
+ sFirstNozzle, sLastNozzle);
+ ERRCHECK;
+
+ i = start + ib * m_iImageWidth; // 1200 dpi split into two
+ for (int l = 0; l < size; l += iSwings) // Collie
+ {
+ for (int k = StartColor+1; k < LastColor; k++)
+ {
+ mask = csavMask;
+ for (j = iOffset + iStartRaster; j < sCurSwathHeight; j += jDelta)
+ {
+ for (int is = 0; is < iSwings; is++)
+ {
+ *cb++ = m_SwathData[k][j][i+is] & mask;
+ }
+ mask = ~mask;
+ }
+ for (j = iStartRaster; j < iOffset; j += jDelta)
+ {
+ for (int is = 0; is < iSwings; is++)
+ {
+ *cb++ = m_SwathData[k][j][i+is] & mask;
+ }
+ mask = ~mask;
+ }
+
+ count++;
+ if (count == n)
+ {
+ err = LoadSweepData (m_szCompressBuf, (unsigned int) (cb - m_szCompressBuf-16));
+ memset (m_szCompressBuf, 0, LDL_MAX_IMAGE_SIZE * (iSwings / 2));
+ cb = m_szCompressBuf+16;
+ count = 0;
+ ERRCHECK;
+ }
+ }
+ mask = csavMask;
+ for (j = iOffset + iStartRaster; j < sCurSwathHeight; j += jDelta)
+ {
+ for (int is = 0; is < iSwings; is++)
+ {
+ *cb++ = m_SwathData[0][j][i + is] & mask;
+ }
+ mask = ~mask;
+ }
+ for (j = iStartRaster; j < iOffset; j += jDelta)
+ {
+ for (int is = 0; is < iSwings; is++)
+ {
+ *cb++ = m_SwathData[0][j][i + is] & mask;
+ }
+ mask = ~mask;
+ }
+
+ count++;
+ if (count == n)
+ {
+ err = LoadSweepData (m_szCompressBuf, (unsigned int) (cb - m_szCompressBuf-16));
+ memset (m_szCompressBuf, 0, LDL_MAX_IMAGE_SIZE * (iSwings / 2));
+ cb = m_szCompressBuf+16;
+ count = 0;
+ ERRCHECK;
+ }
+ i = i + delta;
+ }
+ if (count != 0)
+ {
+ err = LoadSweepData (m_szCompressBuf, (unsigned int) (cb - m_szCompressBuf-16));
+ memset (m_szCompressBuf, 0, LDL_MAX_IMAGE_SIZE * (iSwings / 2));
+ cb = m_szCompressBuf+16;
+ count = 0;
+ ERRCHECK;
+ }
+
+ if (m_bBidirectionalPrintingOn)
+ m_cPrintDirection = (m_cPrintDirection + 1) % 2;
+
+ if (pPrinterXBow->m_iLdlVersion == 2) // Collie
+ {
+ break;
+ }
+ LeftEdge += 2;
+ RightEdge += 2;
+
+ } // 1200 dpi split into two - end of for ib = 0 loop
+
+ }
+
+/*
+ * Color Swath
+ */
+ if (!bPhotoPresent && bColorPresent)
+ {
+ iColors = 3;
+ LastColor = 4;
+ StartColor = 1;
+ if (!bBlackPresent)
+ {
+ StartColor = 0;
+ LastColor = 3;
+ }
+ if (pPrinterXBow->m_iLdlVersion == 1)
+ {
+ // 1200 dpi split into two
+ size = GetSwathWidth (StartColor, LastColor, iCurRasterSize/* * m_iBitDepth*/);
+ }
+ else
+ {
+ size = GetSwathWidth (StartColor, LastColor, iCurRasterSize * m_iBitDepth);
+ }
+ sColorSize = size;
+ }
+/*
+ * Check if RefCount is close to overflow of 65k.
+ */
+
+ if (!bPhotoPresent && bColorPresent && size)
+ {
+ if (size % iSwings)
+ size = ((size / iSwings) + 1) * iSwings;
+
+ if (pPrinterXBow->m_iLdlVersion == 1)
+ {
+ RightEdge = LeftEdge + (size * 8 * 600 / m_iXResolution - 1 * (600 / m_iYResolution)) *
+ (DEVUNITS_XBOW / 600);
+ }
+ else
+ {
+ RightEdge = LeftEdge + (size * 8 * 600 / m_iXResolution - 1 * (600 / m_iYResolution)) *
+ (DEVUNITS_XBOW / (600 * m_iBitDepth));
+ }
+ Int16 sLastNozzle;
+ Int16 sFirstNozzle = 1;
+ unsigned int uSweepSize;
+ int jDelta = m_iYResolution / pPrinterXBow->m_iColorPenResolution;
+ jDelta *= m_iBitDepth;
+
+ uiSwathSize = size * iColors * sCurSwathHeight / jDelta;
+
+ uSweepSize = sCurSwathHeight * iSwings / jDelta;
+ n = LDL_MAX_IMAGE_SIZE / (uSweepSize);
+ count = 0;
+
+ if (m_iBitDepth == 2)
+ {
+ iStartRaster = (4 - (iStartRaster+1)) % 4;
+ if (pPrinterXBow->m_iLdlVersion == 2)
+ {
+ iStartRaster = m_cPassNumber % (m_iBitDepth);
+ }
+ }
+
+ sLastNozzle = sFirstNozzle - 1 + sCurSwathHeight / jDelta;
+
+ BYTE *cb = m_szCompressBuf + 16; // load sweep command
+ memset (m_szCompressBuf, 0x0, LDL_MAX_IMAGE_SIZE * (iSwings / 2));
+
+
+ // 1200 dpi split into two
+ int ib = 0;
+
+ if (m_iYResolution > 300 && m_cPrintQuality != QUALITY_DRAFT)
+ {
+ iOffset = (sCurSwathHeight / (4 * m_iBitDepth));
+ iOffset = iOffset + iOffset * ((m_cPassNumber) % (4 * m_iBitDepth));
+ }
+
+ for (ib = 0; ib < (int) m_iBitDepth; ib++)
+ {
+ if (m_cPrintDirection == PRNDRN_RIGHTTOLEFT)
+ {
+ start = size - iSwings;
+ delta = -iSwings;
+ }
+ else
+ {
+ start = 0;
+ delta = iSwings;
+ }
+ err = PrintSweep (uiSwathSize, bColorPresent, FALSE, FALSE,
+ iVertPosn, LeftEdge, RightEdge, m_cPrintDirection,
+ sFirstNozzle, sLastNozzle);
+ ERRCHECK;
+
+ i = start + ib * m_iImageWidth; // 1200 dpi split into two
+ for (int l = 0; l < size; l += iSwings) // Collie
+ {
+ for (int k = StartColor; k < LastColor; k++)
+ {
+ mask = csavMask;
+ for (j = iOffset + iStartRaster; j < sCurSwathHeight; j += jDelta)
+ {
+ for (int is = 0; is < iSwings; is++)
+ {
+ *cb++ = m_SwathData[k][j][i + is] & mask;
+ }
+ mask = ~mask;
+ }
+ for (j = iStartRaster; j < iOffset; j += jDelta)
+ {
+ for (int is = 0; is < iSwings; is++)
+ {
+ *cb++ = m_SwathData[k][j][i + is] & mask;
+ }
+ mask = ~mask;
+ }
+
+ count++;
+ if (count == n)
+ {
+ err = LoadSweepData (m_szCompressBuf, (unsigned int) (cb - m_szCompressBuf-16));
+ memset (m_szCompressBuf, 0, LDL_MAX_IMAGE_SIZE * (iSwings / 2));
+
+ cb = m_szCompressBuf+16;
+ count = 0;
+ ERRCHECK;
+ }
+
+ }
+ i = i + delta;
+
+ }
+ if (count != 0)
+ {
+ err = LoadSweepData (m_szCompressBuf, (unsigned int) (cb - m_szCompressBuf-16));
+ memset (m_szCompressBuf, 0, LDL_MAX_IMAGE_SIZE * (iSwings / 2));
+
+ cb = m_szCompressBuf+16;
+ count = 0;
+ ERRCHECK;
+ }
+
+ LeftEdge += 2;
+ RightEdge += 2;
+
+ if (m_bBidirectionalPrintingOn)
+ m_cPrintDirection = (m_cPrintDirection + 1) % 2;
+ if (pPrinterXBow->m_iLdlVersion == 2) // Collie
+ {
+ break;
+ }
+
+ } // 1200 dpi split into two - end of for ib = 0 loop
+ }
+
+/*
+ * Black Swath
+ */
+
+ size = 0;
+ if (bBlackPresent)
+ size = GetSwathWidth (0, 1, iCurRasterSize);
+
+ if (size % iSwings)
+ size = ((size/iSwings) + 1) * iSwings;
+
+ RightEdge = LeftEdge + (size * 8 * 600 / m_iXResolution - 1 * (600 / m_iYResolution)) * DEVUNITS_XBOW/600;
+
+ if (bBlackPresent && size && m_iBitDepth != 2 &&
+ ((m_cPassNumber % 2) == 0 || m_cPrintQuality == QUALITY_DRAFT))
+ {
+ Int16 sLastNozzle = 0;
+ Int16 sFirstNozzle = 1;
+
+ int xDelta = 0;
+ BYTE cVertAlign = 0;
+
+ if (bColorPresent)
+ {
+ cVertAlign = m_cKtoCVertAlign;
+ }
+
+ if (bColorPresent && sColorSize && m_bBidirectionalPrintingOn)
+ m_cPrintDirection = PRNDRN_RIGHTTOLEFT;
+ if (m_cPrintDirection == PRNDRN_RIGHTTOLEFT)
+ {
+ start = size - iSwings;
+ delta = -iSwings;
+ }
+ else
+ {
+ start = 0;
+ delta = iSwings;
+ }
+ if (m_iYResolution == 300)
+ xDelta = iSwings;
+ uiSwathSize = ((size/iSwings) * sCurSwathHeight * iSwings * (600 * m_iBitDepth)/ m_iYResolution);
+
+ if (pPrinterXBow->m_iLdlVersion == 2 && m_iNumColors != 1)
+ {
+ sFirstNozzle = 9;
+ }
+
+ err = PrintSweep (uiSwathSize, FALSE, bBlackPresent, FALSE,
+ (iVertPosn + cVertAlign), LeftEdge, RightEdge, m_cPrintDirection, sFirstNozzle, sLastNozzle);
+
+ ERRCHECK;
+
+ i = start;
+ BYTE *cb = m_szCompressBuf+16;
+ memset (m_szCompressBuf, 0x0, LDL_MAX_IMAGE_SIZE * (iSwings / 2));
+
+ n = LDL_MAX_IMAGE_SIZE / (sCurSwathHeight * iSwings * 600 / m_iYResolution);
+ count = 0;
+
+ iOffset = 0;
+ if (m_iYResolution > 300 && m_cPrintQuality != QUALITY_DRAFT)
+ {
+ iOffset = sCurSwathHeight / 4;
+ iOffset = iOffset + iOffset * (m_cPassNumber % 4);
+ }
+
+ for (int l = 0; l < size; l += iSwings) // Collie
+ {
+ for (j = iOffset; j < sCurSwathHeight; j++)
+ {
+ for (int is = 0; is < iSwings; is++)
+ {
+ *cb++ = m_SwathData[0][j][i + is] & mask;
+ }
+ cb += xDelta;
+ }
+ for (j = 0; j < iOffset; j++)
+ {
+ for (int is = 0; is < iSwings; is++)
+ {
+ *cb++ = m_SwathData[0][j][i + is] & mask;
+ }
+ cb += xDelta;
+ }
+
+ count++;
+ if (count == n)
+ {
+ err = LoadSweepData (m_szCompressBuf, (unsigned int) (cb - m_szCompressBuf-16));
+ memset (m_szCompressBuf, 0, LDL_MAX_IMAGE_SIZE * (iSwings / 2));
+
+ cb = m_szCompressBuf+16;
+ count = 0;
+ ERRCHECK;
+ }
+ i = i + delta;
+ }
+ if (count != 0)
+ {
+ err = LoadSweepData (m_szCompressBuf, (unsigned int) (cb - m_szCompressBuf-16));
+ memset (m_szCompressBuf, 0, LDL_MAX_IMAGE_SIZE * (iSwings / 2));
+
+ cb = m_szCompressBuf+16;
+ count = 0;
+ ERRCHECK;
+ }
+
+ if (m_bBidirectionalPrintingOn)
+ m_cPrintDirection = (m_cPrintDirection + 1) % 2;
+ }
+
+ m_iRasterCount = 0;
+
+ if (m_cPrintQuality != QUALITY_DRAFT && m_iYResolution != 300)
+ {
+ m_cPassNumber = (m_cPassNumber + 1) % (4 * m_iBitDepth);
+ m_iVertPosn += ((((sCurSwathHeight/(4 * m_iBitDepth))) * 600 / m_iYResolution) * DEVUNITS_XBOW / 600) / m_iBitDepth;
+ if (m_iBitDepth == 1)
+ {
+ if (m_cPassNumber % 2)
+ m_iVertPosn += 4;
+ else
+ m_iVertPosn -= 4;
+ }
+ else
+ {
+ m_iVertPosn -= 2;
+ if ((m_cPassNumber % 4) == 0)
+ m_iVertPosn += (DEVUNITS_XBOW / pPrinterXBow->m_iColorPenResolution);
+ }
+ m_iRasterCount = (sCurSwathHeight - sCurSwathHeight / (4 * m_iBitDepth)) * m_iNumColors;
+ }
+ else
+ {
+ m_iVertPosn += ((sCurSwathHeight * 4 * 600) / m_iYResolution);
+
+ }
+
+ return err;
+}
+
+void LDLEncap::FillLidilHeader (void *pLidilHdr, int Command,
+ UInt16 CmdLen, UInt16 DataLen = 0)
+{
+
+ int index = 1;
+ m_szCmdBuf[0] = FRAME_SYN;
+ WRITE16 (CmdLen);
+ m_szCmdBuf[5] = (BYTE) Command;
+ index = 6;
+ WRITE16(m_sRefCount++);
+ index = 8;
+ WRITE16 (DataLen);
+
+}
+
+DRIVER_ERROR LDLEncap::PrintSweep (UInt32 SweepSize,
+ BOOL ColorPresent,
+ BOOL BlackPresent,
+ BOOL PhotoPresent,
+ Int32 VerticalPosition,
+ Int32 LeftEdge,
+ Int32 RightEdge,
+ char PrintDirection,
+ Int16 sFirstNozzle,
+ Int16 sLastNozzle)
+{
+ // determine how many colors will be generated
+ UInt16 colorcount = 0;
+ UInt32 uiAffectedColors = 0;
+ if (ColorPresent == TRUE) colorcount += 3;
+ if (BlackPresent == TRUE) colorcount++;
+ if (PhotoPresent == TRUE)
+ {
+ if (ColorPresent == FALSE)
+ colorcount++;
+ else
+ colorcount+=3;
+ }
+
+ UInt16 mem_needed;
+ if (pPrinterXBow->m_iLdlVersion == 1)
+ {
+ mem_needed = SIZEOF_LDLHDR
+ + SIZEOF_LDL_PRTSWP_CMDOPT
+ + SIZEOF_LDL_PRTSWP_OPTFLDS
+ + SIZEOF_LDL_PRTSWP_COLROPT * colorcount
+ + SIZEOF_LDLTERM;
+
+ if (colorcount != 0)
+ mem_needed += SIZEOF_LDL_COLROPT_ACTIVECOLR;
+ }
+ else
+ {
+ mem_needed = SIZEOF_LDLHDR
+ + SIZEOF_LDL_PRTSWP_CMDOPT + 7
+ + SIZEOF_LDL_PRTSWP_OPTFLDS
+ + SIZEOF_LDL_PRTSWP_COLROPT + 4
+ + SIZEOF_LDLTERM;
+ }
+
+ memset (m_szCmdBuf, 0, mem_needed);
+
+ FillLidilHeader (NULL, eLDLPrintSweep, mem_needed);
+
+ int index = SIZEOF_LDLHDR;
+ if (pPrinterXBow->m_iLdlVersion == 2)
+ {
+ m_szCmdBuf[index++] = 1; // Version number
+ }
+ WRITE32 (SweepSize);
+ WRITE32 (VerticalPosition);
+ WRITE32 (m_iLeftMargin);
+ if (pPrinterXBow->m_iLdlVersion == 1)
+ {
+ // LIDIL First Version
+ m_szCmdBuf[index++] = SWINGFMT_UNCOMPRSS;
+ }
+ else
+ {
+ // LIDIL Second Version
+ m_szCmdBuf[index++] = 1;
+ }
+ m_szCmdBuf[index++] = PrintDirection;
+ if (pPrinterXBow->m_iLdlVersion == 2)
+ {
+ WRITE32 (0); // Shingle mask
+ }
+ WRITE32 (IPS_CARRSPEED|IPS_INIPRNSPEED|ACCURATEPOSN_NEEDED);
+ // Carriage Speed - 25 for plain, 12 for photo
+ if (m_cPrintQuality == QUALITY_BEST && m_cMediaType == MEDIA_PHOTO)
+ m_szCmdBuf[index++] = 12;
+ else
+ m_szCmdBuf[index++] = 25;
+ m_szCmdBuf[index++] = 4; // Initial Print Speed
+ m_szCmdBuf[index++] = 1; // Need Accurate Position
+ if (pPrinterXBow->m_iLdlVersion == 2)
+ {
+ m_szCmdBuf[index++] = 1; // Number of entries in the sweep
+ }
+
+ // fill in the color information
+ if(colorcount == 0)
+ {
+ m_szCmdBuf[index++] = NO_ACTIVE_COLORS;
+ m_szCmdBuf[index++] = FRAME_SYN;
+ mem_needed = index;
+ }
+ else
+ {
+ // figure out what are the active colors and fill in the optional color fields.
+
+ UInt16 colrpresent = 0;
+ UInt16 colr_found=0;
+ UInt16 colormask = 0x01;
+ UInt16 offset = eLDLBlack;
+ UInt16 iDataRes;
+ UInt16 iPrintRes;
+ uiAffectedColors = offset;
+ if (BlackPresent == TRUE)
+ {
+ uiAffectedColors = 0x1;
+ }
+ if(BlackPresent == FALSE && PhotoPresent == FALSE)
+ {
+ offset = eLDLCyan;
+ colormask=0x02;
+ uiAffectedColors |= 0x0000000e;
+ }
+ else if (BlackPresent == FALSE && PhotoPresent == TRUE)
+ {
+ if (ColorPresent == TRUE)
+ {
+ offset = eLDLCyan;
+ colormask=0x02;
+ uiAffectedColors |= 0x0000007e;
+ }
+ else
+ {
+ offset = eLDLLoBlack;
+ colormask=0x40;
+ uiAffectedColors |= 0x00000070;
+ }
+ }
+
+ int actv_colr_index = index;
+ int iColorRes = 300;
+ if (pPrinterXBow->m_iLdlVersion == 1)
+ {
+ index += 2;
+ }
+ else
+ {
+ iColorRes = 600;
+ }
+ for(UInt16 i = offset; colr_found < colorcount && i < eLDLMaxColor; i++)
+ {
+ colr_found++;
+ colrpresent = colrpresent | colormask;
+
+ if (pPrinterXBow->m_iLdlVersion == 2)
+ {
+ WRITE32 (uiAffectedColors);
+ }
+ WRITE32 (LeftEdge);
+ WRITE32 (RightEdge);
+ WRITE32 (LeftEdge);
+ WRITE32 (RightEdge);
+
+ if ((i == 0 && pPrinterXBow->m_iLdlVersion == 1) || (BlackPresent && pPrinterXBow->m_iLdlVersion == 2))
+ {
+ iDataRes = 600;
+ iPrintRes = pPrinterXBow->m_iBlackPenResolution;
+ }
+ else
+ {
+ iDataRes = iColorRes; // 300;
+ iPrintRes = iColorRes; // 300;
+ }
+ WRITE16 (iDataRes); // Vertical Data Resolution
+ WRITE16 (iPrintRes); // Vertical Print Resolution
+
+ if (pPrinterXBow->m_iLdlVersion == 2)
+ {
+ WRITE16 (m_iXResolution * m_iBitDepth); // Horizontal Data Resolution // Collie
+ }
+ else
+ {
+ WRITE16 (m_iXResolution);
+ }
+
+ if (m_iXResolution == 300)
+ {
+ WRITE16 (600); // Force 2 drop for draft mode.
+ }
+ else
+ {
+ if (pPrinterXBow->m_iLdlVersion == 2)
+ {
+ WRITE16 (m_iXResolution * m_iBitDepth); // Horizontal Print Resolution // Collie
+ }
+ else
+ {
+ WRITE16 (m_iXResolution);
+ }
+ }
+ WRITE16 (sFirstNozzle);
+ if (sLastNozzle == 0)
+ {
+ int iTmp = m_iRasterCount / m_iNumColors;
+ if (pPrinterXBow->m_iLdlVersion == 2)
+ {
+ WRITE16 (sFirstNozzle - 1 + ((iTmp * iPrintRes) / (m_iYResolution * m_iBitDepth))); // Collie
+ }
+ else
+ {
+ WRITE16 (sFirstNozzle - 1 + ((iTmp * iPrintRes) / (m_iYResolution)))
+ }
+ }
+ else
+ {
+ WRITE16 (sLastNozzle);
+ }
+
+ m_szCmdBuf[index++] = 0; // Vertical Alignment
+ colormask = colormask << 1;
+ if (pPrinterXBow->m_iLdlVersion == 2)
+ {
+ break;
+ }
+
+ }
+ // write the active color field
+ mem_needed = index;
+ if (pPrinterXBow->m_iLdlVersion == 1)
+ {
+ index = actv_colr_index;
+ WRITE16 (colrpresent);
+ index = mem_needed;
+ }
+
+ if (pPrinterXBow->m_iLdlVersion == 2)
+ {
+ m_szCmdBuf[index++] = 0; // # of entries in the shingle array
+ }
+ m_szCmdBuf[index++] = FRAME_SYN;
+ mem_needed = index;
+ }
+
+ // write out the data
+ return (pPrinterXBow->Send (m_szCmdBuf, (DWORD) mem_needed));
+}
+
+
+DRIVER_ERROR LDLEncap::LoadSweepData (BYTE *imagedata, int imagesize)
+{
+ UInt16 mem_needed = SIZEOF_LDLHDR + SIZEOF_LDL_LDSWPDATA_CMDOPT
+ + SIZEOF_LDLTERM;
+ UInt16 diff=0;
+ if(mem_needed < LDLPACKET_MINSIZE)
+ {
+ diff = LDLPACKET_MINSIZE - mem_needed;
+ mem_needed = LDLPACKET_MINSIZE;
+ }
+ memset (m_szCmdBuf, 0, mem_needed);
+
+ BYTE *compressed_dataptr = imagedata;
+ UInt16 compressed_size = imagesize;
+
+#ifdef APDK_LDL_COMPRESS
+ if (m_ldlCompressData)
+ {
+ m_ldlCompressData->Init ((UInt16 *) (imagedata+16), imagesize);
+ CompressData ();
+ GetFrameInfo (&compressed_dataptr, &compressed_size);
+ }
+#endif
+
+ FillLidilHeader (NULL, eLDLLoadSweepData, mem_needed, compressed_size);
+
+ int index = SIZEOF_LDLHDR;
+ WRITE16 (imagesize);
+
+ if(diff)
+ {
+ memset (m_szCmdBuf+index, 0xFF, diff);
+ index += diff;
+ }
+ m_szCmdBuf[index++] = FRAME_SYN;
+
+ memcpy (compressed_dataptr, m_szCmdBuf, 16);
+ return (pPrinterXBow->Send (compressed_dataptr, (DWORD) compressed_size+16));
+}
+
+LDLEncap::~LDLEncap ()
+{
+ if (m_SwathData)
+ // Camera change - allocation is now AllocMem instead of new
+ // delete [] (BYTE *) m_SwathData;
+ m_pSys->FreeMem ((BYTE *) m_SwathData);
+ if (m_szCmdBuf)
+ delete [] m_szCmdBuf;
+ if (m_szCompressBuf)
+ delete [] m_szCompressBuf;
+ if (piCreditCount)
+ m_pSys->FreeMem ((BYTE *) piCreditCount);
+ if (m_pbyPacketBuff)
+ m_pSys->FreeMem ((BYTE *) m_pbyPacketBuff);
+ if (pbySync)
+ m_pSys->FreeMem ((BYTE *) pbySync);
+#ifdef APDK_LDL_COMPRESS
+ if (m_ldlCompressData)
+ {
+ delete m_ldlCompressData;
+ m_ldlCompressData = NULL;
+ }
+#endif
+}
+
+DRIVER_ERROR LDLEncap::StartJob ()
+{
+ DRIVER_ERROR err = NO_ERROR;
+ BYTE *pby = NULL;
+ BYTE by = 0;
+ BOOL bCreditInitialized = FALSE;
+ WORD wCreditWaitCount = 0;
+
+ // Send Sync packet
+ err = pPrinterXBow->Send (pbySync, (DWORD) SYNCSIZE);
+ if(err)
+ {
+ return err;
+ }
+
+ // Send Sync Complete packet
+ err = pPrinterXBow->Send (bySyncComplete, (DWORD) sizeof (bySyncComplete));
+ if(err)
+ {
+ return err;
+ }
+
+ // Send Reset LIDIL packet
+ err = pPrinterXBow->Send (byResetLIDIL, (DWORD) sizeof (byResetLIDIL));
+ if(err)
+ {
+ return err;
+ }
+
+ if (pPrinterXBow->IOMode.bDevID)
+ {
+ // Enable pacing, get credit packet and update credit count
+ err = pPrinterXBow->Send (byEnablePacing, (DWORD) sizeof (byEnablePacing));
+ if (err)
+ {
+ return err;
+ }
+
+ while (!bCreditInitialized && wCreditWaitCount++ < CREDIT_WAIT)
+ {
+ bCreditInitialized = UpdateState (TRUE);
+ }
+
+ if (!bCreditInitialized)
+ {
+ return SYSTEM_ERROR;
+ }
+ else
+ {
+ // Send Enable On Change status packet. We don't have to worry about flushing the buffer,
+ // because the ::Send logic will do that for us. If we run out of credit for a command, the
+ // first thing that we do is flush the buffer. If we haven't already sent the EOCQuery, it
+ // will get sent then.
+ err = pPrinterXBow->Send (byEOCStatusQuery, (DWORD) sizeof (byEOCStatusQuery));
+ if (err)
+ {
+ return err;
+ }
+ }
+
+ // Setup Cancel command. It would be nice to do this in the LDLEncap constructor, but we have
+ // to know the JobID before we can setup the cancel command.
+ memcpy (pbyCancel, byPrepareToCancel, sizeof (byPrepareToCancel));
+ pbyCancel[COMMAND_NUMBER_BYTE] = 0x00;
+ pbyCancel[COMMAND_OPT_BYTE] = 0x02;
+
+ pby = (BYTE*) &pPrinterXBow->pLDLEncap;
+ if(m_bLittleEndian)
+ {
+ // Go to last byte of pLDLEncap in memory, since system is little endian
+ pby += sizeof (pPrinterXBow->pLDLEncap) - 1;
+ }
+
+ for(by = 0; by < sizeof(pPrinterXBow->pLDLEncap); by++)
+ {
+ if(m_bLittleEndian)
+ pbyCancel[by + COMMAND_OPT_BYTE + 1] = *pby--;
+ else
+ pbyCancel[by + COMMAND_OPT_BYTE + 1] = *pby++;
+ }
+
+ // Setup Query command
+// memcpy(byQuery, byEnableResponses, sizeof(byEnableResponses));
+// memcpy(byQuery + sizeof(byEnableResponses), byStatusQuery, sizeof(byStatusQuery));
+// memcpy(byQuery + (sizeof(byEnableResponses) + sizeof(byStatusQuery)),
+// byDisableResponses, sizeof(byDisableResponses));
+ }
+
+ UInt16 mem_needed = SIZEOF_LDLHDR + SIZEOF_LDL_JOB_CMDOPT + SIZEOF_LDLTERM;
+ if (pPrinterXBow->m_iLdlVersion == 2)
+ {
+ mem_needed += 4;
+ }
+
+ FillLidilHeader (NULL, eLDLStartJob, mem_needed);
+
+ // write in the job id
+ int index = SIZEOF_LDLHDR;
+ m_szCmdBuf[index++] = OPERATION_STJOB;
+ if (pPrinterXBow->IOMode.bDevID)
+ {
+ WRITE32 ((UInt32) this);
+ }
+ else
+ {
+ WRITE32 ((UInt32) 0xbadfad); // for deterministic testing, des
+ }
+
+ if (pPrinterXBow->m_iLdlVersion == 2)
+ {
+ WRITE32 (0); // Shingle Mask option
+ }
+
+ // add in sync frame.
+ m_szCmdBuf[index++] = FRAME_SYN;
+
+ // fill in the job header and write out the generated data
+ err = pPrinterXBow->Send (m_szCmdBuf, (DWORD) mem_needed);
+ ERRCHECK;
+
+ err = StartPage ();
+ ERRCHECK;
+
+#if 0
+ /*
+ * Query printer if pens are aligned when both pens are present.
+ * If so, set Bi-Directional printing on.
+ * If m_bBierectionalPrintingOn is already set or current mode is
+ * PhotoBest, don't query for pen alignment.
+ */
+ if (m_bBidirectionalPrintingOn || m_cPrintQuality == QUALITY_NORMAL)
+ return NO_ERROR;
+
+ mem_needed = SIZEOF_LDLHDR + 2 + SIZEOF_LDLTERM;
+ memset (m_szCmdBuf, 0, LDLPACKET_MINSIZE);
+ for (index = mem_needed; index < LDLPACKET_MINSIZE; index++)
+ m_szCmdBuf[index] = 0xFF;
+ if (mem_needed < LDLPACKET_MINSIZE)
+ mem_needed = LDLPACKET_MINSIZE;
+ FillLidilHeader (NULL, eLDLQueryPrinter, mem_needed);
+ index = SIZEOF_LDLHDR;
+ m_szCmdBuf[index++] = 3; // Pen Alignment - is this the right command?
+ m_szCmdBuf[index++] = 0; // Query - Immediate response
+ m_szCmdBuf[mem_needed-1] = FRAME_SYN;
+ pPrinterXBow->Send (m_szCmdBuf, (DWORD) mem_needed);
+
+ index = 0;
+ if ((pSS->FromDevice ((char *) m_szCmdBuf, (WORD *) &index)) == NO_ERROR)
+ {
+// what am I looking for here?
+ index = SIZEOF_LDLHDR + 1;
+// 2 bytes for color alignment, however, bits 7-15 are not used at present
+ BYTE bColor = m_szCmdBuf[index] & 0x7F;
+ if ((bColor & 0x0F) == 0x0F || // bits 0 - 3 represent KCMY
+ (bColor & 0x7E) == 0x7E) // bits 4 - 6 represent cmk
+ m_bBidirectionalPrintingOn = TRUE;
+ }
+#endif
+
+ return err;
+}
+
+
+DRIVER_ERROR LDLEncap::EndJob ()
+{
+ DRIVER_ERROR err = NO_ERROR;
+
+ UInt16 mem_needed = SIZEOF_LDLHDR + SIZEOF_LDL_JOB_CMDOPT + SIZEOF_LDLTERM;
+
+ FillLidilHeader (NULL, eLDLEndJob, mem_needed);
+
+ int index = SIZEOF_LDLHDR;
+ m_szCmdBuf[index++] = OPERATION_ENDJOB;
+ if (pPrinterXBow->IOMode.bDevID)
+ {
+ WRITE32 ((UInt32) this);
+ }
+ else
+ {
+ WRITE32 ((UInt32) 0xbadfad); // for deterministic testing, des
+ }
+
+ m_szCmdBuf[index++] = FRAME_SYN;
+
+ err = pPrinterXBow->Send (m_szCmdBuf, (DWORD) mem_needed);
+ if(err)
+ {
+ return err;
+ }
+
+ // Send Sync packet
+ err = pPrinterXBow->Send (pbySync, SYNCSIZE);
+ if(err)
+ {
+ return err;
+ }
+
+ // Send Sync Complete packet
+ err = pPrinterXBow->Send (bySyncComplete, (DWORD) sizeof (bySyncComplete));
+ if(err)
+ {
+ return err;
+ }
+
+ // Send Reset LIDIL packet
+ err = pPrinterXBow->Send (byResetLIDIL, (DWORD) sizeof (byResetLIDIL));
+ if(err)
+ {
+ return err;
+ }
+
+ return NO_ERROR;
+}
+
+DRIVER_ERROR LDLEncap::StartPage ()
+{
+
+ //figure out how much memory we needed
+ UInt16 colorcount = 0; //m_iNumColors;
+ UInt32 mem_needed = SIZEOF_LDLHDR + SIZEOF_LDL_LDPAGE_CMDOPT
+ + SIZEOF_LDL_LDPAGE_OPTFLDS
+ + SIZEOF_LDLTERM;
+
+ memset (m_szCmdBuf, 0, mem_needed);
+
+ FillLidilHeader (NULL, eLDLLoadPage, (UInt16) mem_needed);
+
+ char mediatype = MEDIATYPE_PLAIN;
+ BYTE quality = (BYTE) QUALITYLEVEL_NORMAL;
+ if (m_cPrintQuality == QUALITY_BEST && m_cMediaType == MEDIA_PHOTO)
+ {
+ mediatype = MEDIATYPE_PHOTO;
+ quality = (BYTE) QUALITYLEVEL_BEST;
+ }
+ else if (m_cPrintQuality == QUALITY_DRAFT)
+ quality = (BYTE) QUALITYLEVEL_DRAFT;
+
+ int index = SIZEOF_LDLHDR;
+ m_szCmdBuf[index++] = mediatype;
+ m_szCmdBuf[index++] = MEDIASRC_MAINTRAY;
+ m_szCmdBuf[index++] = MEDIADEST_MAINBIN;
+ m_szCmdBuf[index++] = quality; //PrintQuality;
+ m_szCmdBuf[index++] = SPECLOAD_NONE;
+
+ Int32 iVal;
+ iVal = (Int32) (m_pthisPC->PhysicalPageSizeX () * 1000);
+ WRITE32 ((iVal * DEVUNITS_XBOW) / 1000);
+ iVal = (Int32) (m_pthisPC->PhysicalPageSizeY () * 1000);
+ WRITE32 ((iVal * DEVUNITS_XBOW) / 1000);
+
+ WRITE32 (MEDIALD_SPEED|NEED_TO_SERVICE_PERIOD|MINTIME_BTW_SWEEP);
+
+ // set up the option fields
+ m_szCmdBuf[index++] = 4; // MediaLoadSpeed;
+ m_szCmdBuf[index++] = 0; // NeedToServicePeriod;
+ WRITE16 (200); // MinTimeBetweenSweeps
+
+ if (colorcount == 0)
+ {
+ m_szCmdBuf[index++] = FRAME_SYN;
+ }
+
+ m_bStartPageNotSent = FALSE;
+ // write out the data
+ return (pPrinterXBow->Send (m_szCmdBuf, (DWORD) mem_needed));
+}
+
+DRIVER_ERROR LDLEncap::Continue ()
+{
+
+ UInt16 mem_needed = SIZEOF_LDLHDR + 1
+ + SIZEOF_LDLTERM;
+ int index;
+ memset (m_szCmdBuf, 0, LDLPACKET_MINSIZE);
+ for (index = mem_needed; index < LDLPACKET_MINSIZE; index++)
+ m_szCmdBuf[index] = 0xFF;
+ if (mem_needed < LDLPACKET_MINSIZE)
+ mem_needed = LDLPACKET_MINSIZE;
+ FillLidilHeader (NULL, eLDLControl, mem_needed);
+ index = SIZEOF_LDLHDR;
+ m_szCmdBuf[index] = OPERATION_CONTINUE;
+ m_szCmdBuf[mem_needed-1] = FRAME_SYN;
+ return (pPrinterXBow->Send (m_szCmdBuf, (DWORD) mem_needed));
+}
+
+void LDLEncap::Cancel ()
+{
+
+ UInt16 mem_needed = SIZEOF_LDLHDR + SIZEOF_LDL_JOB_CMDOPT
+ + SIZEOF_LDLTERM;
+ int index;
+ memset (m_szCmdBuf, 0, LDLPACKET_MINSIZE);
+ for (index = mem_needed; index < LDLPACKET_MINSIZE; index++)
+ m_szCmdBuf[index] = 0xFF;
+ if (mem_needed < LDLPACKET_MINSIZE)
+ mem_needed = LDLPACKET_MINSIZE;
+ FillLidilHeader (NULL, eLDLControl, mem_needed);
+ index = SIZEOF_LDLHDR;
+ WRITE32 ((UInt32) this);
+ m_szCmdBuf[index] = OPERATION_CANCJOB;
+ m_szCmdBuf[mem_needed-1] = FRAME_SYN;
+ pPrinterXBow->Send (m_szCmdBuf, (DWORD) mem_needed);
+}
+
+DRIVER_ERROR LDLEncap::CleanPen ()
+{
+
+ UInt16 mem_needed = SIZEOF_LDLHDR + 1 + 2
+ + SIZEOF_LDLTERM;
+ int index;
+ short sNumSpits = 32;
+ memset (m_szCmdBuf, 0, LDLPACKET_MINSIZE);
+ for (index = mem_needed; index < LDLPACKET_MINSIZE; index++)
+ m_szCmdBuf[index] = 0xFF;
+ if (mem_needed < LDLPACKET_MINSIZE)
+ mem_needed = LDLPACKET_MINSIZE;
+ FillLidilHeader (NULL, eLDLHandlePen, mem_needed);
+ index = SIZEOF_LDLHDR;
+ m_szCmdBuf[index++] = OPERATION_SPIT_PEN;
+ WRITE16 (sNumSpits);
+ m_szCmdBuf[mem_needed-1] = FRAME_SYN;
+ pPrinterXBow->Send (m_szCmdBuf, (DWORD) mem_needed);
+
+ return NO_ERROR;
+}
+
+DRIVER_ERROR LDLEncap::EndPage ()
+{
+
+ DRIVER_ERROR err = NO_ERROR;
+ int icount = 0;
+ int iCurNumRasters = m_iRasterCount;
+ if ((m_cPrintQuality == QUALITY_DRAFT || m_iYResolution == 300) && m_iRasterCount)
+ icount = 1;
+ else if (m_cPrintQuality != QUALITY_DRAFT)
+ {
+ icount = 4 * m_iBitDepth;
+ iCurNumRasters = m_sSwathHeight * m_iNumColors;
+ }
+
+ int i, j, n;
+ n = m_sSwathHeight / (4 * m_iBitDepth);
+
+ n = n * (m_cPassNumber + 1) - m_iNextRaster;
+ for (i = 0; i < m_iNumColors; i++)
+ {
+ for (j = 0; j < n; j++)
+ memset (m_SwathData[i][m_iNextRaster+j], 0, m_iImageWidth * m_iBitDepth);
+ }
+ m_iNextRaster += n;
+ n = m_sSwathHeight / (4 * m_iBitDepth);
+
+ while (icount)
+ {
+ m_iRasterCount = iCurNumRasters;
+ err = ProcessSwath (m_iImageWidth);
+ if (err != NO_ERROR)
+ break;
+ icount--;
+ if (m_iNextRaster >= m_sSwathHeight)
+ m_iNextRaster = 0;
+ for (i = 0; i < m_iNumColors; i++)
+ {
+ for (j = 0; j < n; j++)
+ memset (m_SwathData[i][m_iNextRaster+j], 0, m_iImageWidth * m_iBitDepth);
+ }
+ m_iNextRaster += n;
+ }
+
+ UInt16 mem_needed = SIZEOF_LDLHDR
+ + SIZEOF_LDL_EJPAGE_CMDOPT
+ + SIZEOF_LDL_EJPAGE_OPTFLDS
+ + SIZEOF_LDLTERM;
+
+ memset (m_szCmdBuf, 0, mem_needed);
+ FillLidilHeader(NULL, eLDLEjectPage, mem_needed);
+
+ int index = SIZEOF_LDLHDR;
+ WRITE32 (MEDIA_EJSPEED);
+
+ m_szCmdBuf[index++] = 15;
+ m_szCmdBuf[index++] = FRAME_SYN;
+
+ if(err == NO_ERROR)
+ {
+ err = pPrinterXBow->Send (m_szCmdBuf, (DWORD) mem_needed);
+ }
+
+ m_sRefCount = 6;
+ m_iBlankRasters = 0;
+ m_iVertPosn = (int) (m_pthisPC->PrintableStartY () * DEVUNITS_XBOW);
+ m_iRasterCount = 0;
+ m_iNextRaster = 0;
+ m_iNextColor = 0;
+
+ float fXOverSpray = 0.0;
+ float fYOverSpray = 0.0;
+ float fLeftOverSpray = 0.0;
+ float fTopOverSpray = 0.0;
+ FullbleedType fbType;
+ if (m_pthisPC->bDoFullBleed &&
+ pPrinterXBow->FullBleedCapable (m_pthisPC->thePaperSize,
+ &fbType,
+ &fXOverSpray, &fYOverSpray,
+ &fLeftOverSpray, &fTopOverSpray))
+ {
+
+ /*
+ * To get the printer to do fullbleed printing, move the vertical postion
+ * to cover the overspary. Overspray is needed to take care of
+ * skew during paper pick. These values may be mech dependent.
+ * Currently, supported only on PhotoSmart 100, Malibu. DJ3600 supports
+ * fullbleed printing also. The current values for overspray are
+ * 0.059 inch for top, bottom and left edges and 0.079 for right edge.
+ */
+ m_iVertPosn = (int) (-fTopOverSpray * DEVUNITS_XBOW);
+ }
+
+ if (/*m_iYResolution != 300*/m_cPrintQuality != QUALITY_DRAFT)
+ m_iRasterCount = (m_sSwathHeight - m_sSwathHeight / 4) * m_iNumColors;
+
+ m_bStartPageNotSent = TRUE;
+
+ if (m_cPrintQuality != QUALITY_DRAFT && m_iYResolution != 300)
+ {
+ m_iRasterCount = (m_sSwathHeight - m_sSwathHeight / (4*m_iBitDepth)) * m_iNumColors;
+ m_iVertPosn -= (((m_sSwathHeight - m_sSwathHeight / (4*m_iBitDepth)) * 600 / m_iYResolution) * DEVUNITS_XBOW / 600);
+ }
+ m_cPassNumber = 0;
+
+ if (m_pthisPC->bDoFullBleed &&
+ pPrinterXBow->FullBleedCapable (m_pthisPC->thePaperSize,
+ &fbType,
+ &fXOverSpray, &fYOverSpray,
+ &fLeftOverSpray, &fTopOverSpray))
+ {
+ if (m_iVertPosn < -850) m_iVertPosn = -850;
+ }
+ else
+ {
+ if (m_iVertPosn < -600) m_iVertPosn = -600;
+ }
+ if (m_iBitDepth == 2)
+ m_iVertPosn += 6;
+
+ for (i = 0; i < m_iNumColors; i++)
+ {
+ for (int j = 0; j < m_sSwathHeight; j++)
+ {
+ memset (m_SwathData[i][j], 0, m_iImageWidth);
+ }
+ }
+
+ return (err);
+}
+
+// This routine dynamically allocates memory in which to read bytes from the port. We allocate
+// memory in MAX_PACKET_READ_SIZE chunks, which we set in ldlencap.h to 256 bytes. The minimum
+// read size is the size of a printer packet, which is 64 bytes. We shouldn't have to read more
+// than 256 bytes from the port since we only are getting credit and status. Developers may want
+// to increase or decrease the MAX_PACKET_READ_SIZE for their particular system based upon whether
+// memory is easier to get statically or dynamically. For instance, a system with a lot of static
+// memory may want to increase MAX_PACKET_READ_SIZE to 4096 to minimize reads. A system with
+// limited static memory may want to allocate memory in smaller chunks, so 256 may be better. The
+// developer may reduce the MAX_PACKET_READ_SIZE to as little as 64 if desired, but it must always
+// be a multiple of 64.
+
+/*
+ * Author: Don Castrapel
+ */
+
+BOOL LDLEncap::GetPackets(DWORD &dwBytesRead)
+{
+ DRIVER_ERROR err = NO_ERROR;
+ DWORD dwReadSize = 0;
+ WORD wPacketWaitCount = 0;
+ BYTE *pbyPacketBuff = NULL;
+
+ dwBytesRead = 0;
+
+ if(m_pbyPacketBuff)
+ {
+ // If we've had to reallocate the packet read buffer because it was too small to hold a read,
+ // let's deallocate it and start with the original size. This will prevent us hanging onto
+ // what could be a large chunk of memory while also not performing multiple allocs and deallocs
+ // in the normal case where the buffer holds the entire read
+ if(m_dwPacketBuffSize != MAX_PACKET_READ_SIZE)
+ {
+ m_pSys->FreeMem ((BYTE *) m_pbyPacketBuff);
+ m_pbyPacketBuff = NULL;
+ m_dwPacketBuffSize = 0;
+ }
+ else
+ memset(m_pbyPacketBuff, 0, MAX_PACKET_READ_SIZE);
+ }
+
+ // Wait for packets
+ while(!dwBytesRead && wPacketWaitCount++ < PACKET_WAIT)
+ {
+ if(m_pSys->BusyWait((DWORD)100) == JOB_CANCELED)
+ {
+ return FALSE;
+ }
+
+ dwReadSize = MAX_PACKET_READ_SIZE;
+
+ do
+ {
+ // If we've done a read but it was not a multiple of MAX_PACKET_READ_SIZE, then we
+ // didn't read the full request size last time. That means that we read some bytes
+ // but that the printer didn't have any more to send
+ if(dwBytesRead % MAX_PACKET_READ_SIZE)
+ {
+ break; // Out of do loop
+ }
+
+ // FromDevice resets dwReadSize to the number of bytes read from the port
+ dwReadSize = MAX_PACKET_READ_SIZE;
+
+ if(!m_pbyPacketBuff)
+ {
+ // First read, allocate buffer to hold data
+ m_pbyPacketBuff = m_pSys->AllocMem(MAX_PACKET_READ_SIZE);
+ if(!m_pbyPacketBuff)
+ {
+ return FALSE;
+ }
+ memset(m_pbyPacketBuff, 0, MAX_PACKET_READ_SIZE);
+ m_dwPacketBuffSize = MAX_PACKET_READ_SIZE;
+ }
+ else if(dwBytesRead)
+ {
+ // We've already read some bytes, so allocate a temporary buffer to store
+ // what we've read so far. We'll copy what we've read into the temporary buffer,
+ // delete the original buffer, reallocate a new buffer MAX_PACKET_READ_SIZE
+ // bytes larger, read the temporary buffer back into the newly reallocated
+ // buffer, then delete the temporary buffer
+ pbyPacketBuff = m_pSys->AllocMem(dwBytesRead + MAX_PACKET_READ_SIZE);
+ if(!pbyPacketBuff)
+ {
+ return FALSE;
+ }
+ m_dwPacketBuffSize += MAX_PACKET_READ_SIZE;
+ memset(pbyPacketBuff, 0, m_dwPacketBuffSize);
+
+ memcpy(pbyPacketBuff, m_pbyPacketBuff, dwBytesRead);
+ if(m_pbyPacketBuff)
+ {
+ m_pSys->FreeMem((BYTE *)m_pbyPacketBuff);
+ m_pbyPacketBuff = NULL;
+ }
+
+ m_pbyPacketBuff = pbyPacketBuff;
+ }
+
+ err = m_pSys->FromDevice((m_pbyPacketBuff + dwBytesRead), &dwReadSize);
+ if(err)
+ {
+ return FALSE;
+ }
+ dwBytesRead += dwReadSize;
+ } while(!err && dwReadSize);
+ } // while(!dwBytesRead && wPacketWaitCount++ < PACKET_WAIT)
+
+ if(!dwBytesRead)
+ {
+ // No data to read from port
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+/*
+ * Author: Don Castrapel
+ */
+
+BOOL LDLEncap::UpdateState(BOOL bInitialize)
+{
+// DRIVER_ERROR err = NO_ERROR;
+ BOOL bPacketsReceived = FALSE;
+ BOOL bUpdatedState = FALSE;
+ BYTE byPacketType = 0;
+ BYTE byCommandNumber = 0;
+ WORD wCommandLength = 0;
+ WORD wDataLength = 0;
+ WORD wReferenceNumber = 0;
+ DWORD dwBytesRead = 0;
+ DWORD dwBytesProcessed = 0;
+ BYTE by = 0;
+
+ // Read packets from port
+ bPacketsReceived = GetPackets(dwBytesRead);
+ if(!bPacketsReceived)
+ {
+ return FALSE;
+ }
+
+ while(dwBytesProcessed < dwBytesRead)
+ {
+ if(m_pbyPacketBuff[dwBytesProcessed] != '$')
+ {
+ return FALSE;
+ }
+
+ // Get packet type and command number, command length, data length
+ byPacketType = m_pbyPacketBuff[PACKET_TYPE_BYTE + dwBytesProcessed];
+ byCommandNumber = m_pbyPacketBuff[COMMAND_NUMBER_BYTE + dwBytesProcessed];
+ wCommandLength = (m_pbyPacketBuff[COMMAND_LENGTH_BYTE + dwBytesProcessed] << 8) |
+ m_pbyPacketBuff[COMMAND_LENGTH_BYTE + 1 + dwBytesProcessed];
+ wDataLength = (m_pbyPacketBuff[DATA_LENGTH_BYTE + dwBytesProcessed] << 8) |
+ m_pbyPacketBuff[DATA_LENGTH_BYTE + 1 + dwBytesProcessed];
+ wReferenceNumber = (m_pbyPacketBuff[REFERENCE_NUMBER_BYTE + dwBytesProcessed] << 8) |
+ m_pbyPacketBuff[REFERENCE_NUMBER_BYTE + 1 + dwBytesProcessed];
+
+ // We should only get packet type 16 (Response, Command Executed), packet type
+ // 24 (Response, Auto), packet type 32 (Absolute Credit) or packet type 33
+ // (Incremental Credit).
+
+ // For credit packets, we'll update the credit. Credit for each command number starts at
+ // byte 12, or m_pbyPacketBuff[11]. Credit is a 2-byte signed value, so we have to multiply
+ // the loop counter by 2 to get the right array index. A byPacketType of 32 indicates
+ // absolute credit, while a byPacketType value of 33 indicates incremental credit.
+
+ // For a command executed packet, we'll switch again and do the appropriate thing based upon
+ // the command number for which the printer generated the response packet
+ switch(byPacketType)
+ {
+ case ABSOLUTE_CREDIT:
+ if(bInitialize)
+ {
+ // Get number of commands to allocate memory for CreditCount buffer.
+ // Byte 11(byReadBuff[10])
+ byNumberOfCommands = m_pbyPacketBuff[NUMBER_OF_COMMANDS_BYTE];
+
+ if(piCreditCount)
+ {
+ m_pSys->FreeMem((BYTE*)piCreditCount);
+ }
+ piCreditCount =
+ (short int *)(m_pSys->AllocMem(sizeof(short int) * byNumberOfCommands));
+ if(!piCreditCount)
+ {
+ return FALSE;
+ }
+ memset(piCreditCount, 0, (sizeof(short int) * byNumberOfCommands));
+ }
+
+ for(by = 0; by < byNumberOfCommands; by++)
+ {
+ piCreditCount[by] = (m_pbyPacketBuff[by * 2 + CREDIT_BYTE + dwBytesProcessed] << 8) |
+ (m_pbyPacketBuff[by * 2 + CREDIT_BYTE + 1 + dwBytesProcessed]);
+ }
+
+ bUpdatedState = TRUE;
+
+ break;
+
+ case INCREMENTAL_CREDIT:
+ if(bInitialize)
+ {
+ // If we're initializing we must wait for an absolute credit packet
+ break;
+ }
+
+ for(by = 0; by < byNumberOfCommands; by++)
+ {
+ piCreditCount[by] += (m_pbyPacketBuff[by * 2 + CREDIT_BYTE + dwBytesProcessed] << 8) |
+ (m_pbyPacketBuff[by * 2 + CREDIT_BYTE + 1 + dwBytesProcessed]);
+ }
+
+ bUpdatedState = TRUE;
+
+ break;
+
+/* case RESPONSE_COMMAND_EXECUTED:
+ if(bInitialize)
+ {
+ // If we're initializing we must wait for an absolute credit packet
+ return FALSE;
+ }
+
+ // We should only get command number 5, which is the Query command
+ switch(byCommandNumber)
+ {
+ case COMMAND_QUERY:
+ // Copy status into LDLEncap's status buffer
+ memcpy(byStatusBuff, (m_pbyPacketBuff + dwBytesProcessed),
+ (wCommandLength + wDataLength));
+ bNewStatus = TRUE;
+
+ break;
+
+ default:
+ break;
+ } // switch(byCommandNumber)
+
+ break;*/
+
+ case RESPONSE_AUTO:
+ if(bInitialize)
+ {
+ // If we're initializing we must wait for an absolute credit packet
+ break;
+ }
+
+ // We should only get reference number 1, which is what I set up for the
+ // EOCStatusQuery command
+ switch(wReferenceNumber)
+ {
+ case AUTO_RESPONSE_STATUS:
+
+ // Copy status into LDLEncap's status buffer
+ memcpy(byStatusBuff, (m_pbyPacketBuff + dwBytesProcessed),
+ (wCommandLength + wDataLength));
+ bNewStatus = TRUE;
+ bUpdatedState = TRUE;
+
+ break;
+
+ default:
+
+ break;
+ } // switch(wReferenceNumber)
+
+ break;
+
+ default:
+ if(bInitialize)
+ {
+ // If we're initializing we must wait for an absolute credit packet
+ break;
+ }
+
+ break;
+
+ } // switch(byPacketType)
+
+ dwBytesProcessed += (DWORD)(wCommandLength + wDataLength);
+ } // while(dwBytesProcessed < dwBytesRead)
+
+ return bUpdatedState;
+}
+
+#ifdef APDK_LDL_COMPRESS
+
+/*
+ * Compression Related
+ * Mark Lund
+ */
+
+
+///////////////////////////////////////////////////////////////////////
+// Flush_Image
+///////////////////////////////////////////////////////////////////////
+
+UInt16 LDLEncap::FlushImage ()
+{
+ UInt16 command;
+ UInt16 wsize;
+ UInt16 bsize;
+ UInt16 *from_ptr;
+ int index;
+
+ wsize = m_ldlCompressData->image_cnt;
+ bsize = 0;
+
+ if (wsize)
+ {
+ from_ptr = m_ldlCompressData->image_ptr;
+
+ command = FILL_IMAGE_CMD | (wsize-1);
+
+ index = 0;
+ WRITE16(command);
+ if (m_bLittleEndian)
+ {
+ *m_ldlCompressData->out_ptr++ = (((UInt16) m_szCmdBuf[1]) << 8) | m_szCmdBuf[0];
+ }
+ else
+ {
+ *m_ldlCompressData->out_ptr++ = command;
+ }
+/*
+ memcpy (m_ldlCompressData->out_ptr, from_ptr, sizeof (UInt16) * wsize);
+ m_ldlCompressData->out_ptr += wsize;
+*/
+ for (UInt16 i = 0; i < wsize; i++)
+ {
+ *m_ldlCompressData->out_ptr++ = *from_ptr++;
+ }
+ bsize = ((m_ldlCompressData->image_cnt+1) * 2);
+ m_ldlCompressData->out_cnt += bsize;
+
+ m_ldlCompressData->image_cnt = 0;
+ }
+
+ return bsize;
+}
+
+///////////////////////////////////////////////////////////////////////
+// Flush_Copy
+///////////////////////////////////////////////////////////////////////
+UInt16 LDLEncap::FlushCopy (UInt16 value)
+{
+ UInt16 command;
+ UInt16 size;
+
+ int index;
+
+ size = m_ldlCompressData->copy_cnt;
+
+ if (size)
+ {
+ UInt16 *uP = m_ldlCompressData->out_ptr++;
+ size = 2;
+ if (value == 0)
+ {
+ command = FILL_0000_CMD | (m_ldlCompressData->copy_cnt-1);
+ }
+ else if (value == 0xFFFF)
+ {
+ command = FILL_FFFF_CMD | (m_ldlCompressData->copy_cnt-1);
+ }
+ else
+ {
+ command = FILL_NEXT_CMD | (m_ldlCompressData->copy_cnt-1);
+// index = 0;
+// WRITE16 (value);
+ *m_ldlCompressData->out_ptr++ = value;
+// *m_ldlCompressData->out_ptr++ = (((UInt16) m_szCmdBuf[1]) << 8) | m_szCmdBuf[0];
+ size = 4;
+ }
+
+ index = 0;
+ WRITE16(command);
+ if (m_bLittleEndian)
+ {
+ *uP = (((UInt16) m_szCmdBuf[1]) << 8) | m_szCmdBuf[0];
+ }
+ else
+ {
+ *uP = command;
+ }
+
+ m_ldlCompressData->out_cnt += size;
+ m_ldlCompressData->copy_cnt = 0;
+ }
+ return size;
+}
+
+///////////////////////////////////////////////////////////////////////
+// Compress_Data
+///////////////////////////////////////////////////////////////////////
+void LDLEncap::CompressData (Int16 compressionmode)
+{
+ Int16 i;
+ UInt16 *in_ptr;
+ UInt16 in;
+ UInt16 last=0;
+ UInt16 copy_item;
+ UInt16 data_length;
+
+ LDLCOMPMODE mode = IN_NOT;
+
+
+ m_ldlCompressData->out_cnt = 0;
+ m_ldlCompressData->image_cnt = 0;
+ m_ldlCompressData->copy_cnt = 0;
+
+ m_ldlCompressData->out_ptr = &m_ldlCompressData->out_array[8];
+ data_length = m_ldlCompressData->data_length;
+
+ if ((data_length & 1) != 0)
+ {
+ // ErrorTrap((char *)"Data length is odd.");
+ }
+
+ copy_item = 0;
+ in_ptr = &m_ldlCompressData->raw_data[0];
+
+ for (i=0; i<data_length; i+=2)
+ {
+ in = *in_ptr;
+
+ switch(mode)
+ {
+ case IN_NOT:
+ {
+ /* default the first entry to 'image' */
+ last = in;
+ m_ldlCompressData->image_ptr = in_ptr;
+ m_ldlCompressData->image_cnt = 1;
+ mode = IN_FIRST;
+ break;
+ }
+
+ case IN_FIRST:
+ {
+#if ALLOW_FILL_NEXT_CMD
+ if (last == in)
+#else
+ if ((last == in) && ((in==0xFFFF) || (in == 0)) )
+#endif
+ {
+ mode = IN_COPY;
+ m_ldlCompressData->copy_cnt = 2;
+ m_ldlCompressData->image_cnt = 0;
+ copy_item = in;
+ }
+ else
+ {
+ mode = IN_IMAGE;
+ m_ldlCompressData->image_cnt++;
+ last = in;
+ }
+ break;
+ }
+
+ case IN_COPY:
+ {
+ if (last == in)
+ {
+ m_ldlCompressData->copy_cnt++;
+ }
+ else
+ {
+ /* revisit - could allow 2 words of copy if the data is
+ 0000 or FFFF */
+
+ /* convert a copy cnt of 2 to an image */
+ UInt16 copy_count = m_ldlCompressData->copy_cnt;
+
+ if (copy_count <= m_ldlCompressData->run_length)
+ {
+ if (m_ldlCompressData->image_cnt == 0)
+ {
+ /* point the pointer to the first element */
+ m_ldlCompressData->image_ptr = in_ptr - copy_count;
+ }
+ m_ldlCompressData->image_cnt += (1+copy_count);
+ m_ldlCompressData->copy_cnt = 0;
+ }
+ else
+ {
+ /* have enough to be a legal copy */
+
+ (void) FlushImage ();
+
+ (void) FlushCopy (copy_item);
+
+ m_ldlCompressData->image_ptr = in_ptr;
+ m_ldlCompressData->image_cnt = 1;
+ }
+ mode = IN_IMAGE;
+ last = in;
+ }
+ break;
+ }
+
+ case IN_IMAGE:
+ {
+#if ALLOW_FILL_NEXT_CMD
+ if (last == in)
+#else
+ if ((last == in) && ((in==0xFFFF) || (in == 0)) )
+#endif
+ {
+ m_ldlCompressData->image_cnt--;
+
+ mode = IN_COPY;
+ copy_item = in;
+ m_ldlCompressData->copy_cnt = 2;
+ }
+ else /* different */
+ {
+ last = in;
+ m_ldlCompressData->image_cnt++;
+ }
+ break;
+ }
+
+ default:
+ {
+ break;
+ }
+ }
+ in_ptr++;
+ } /* next data - end of processing */
+
+ /* flush out the remainder */
+
+ switch(mode)
+ {
+ case IN_COPY:
+ {
+ /* have enough to be a legal copy */
+ (void) FlushImage ();
+
+ (void) FlushCopy (copy_item);
+ break;
+ }
+ case IN_IMAGE:
+ case IN_FIRST:
+ {
+ (void) FlushImage ();
+ break;
+ }
+ default:
+ break;
+ }
+
+ if (m_ldlCompressData->out_cnt > 2048+16)
+ {
+ // ErrorTrap("out cnt too big");
+ // exit (-7);
+ }
+}
+
+/////////////////////////////////////////////////////////////////////////////////
+//GetFrameInfo
+/////////////////////////////////////////////////////////////////////////////////
+BOOL LDLEncap::GetFrameInfo (BYTE **outdata, UInt16 *data_size)
+{
+ *outdata = (unsigned char *) &m_ldlCompressData->out_array[0];
+ *data_size = m_ldlCompressData->out_cnt;
+ return(TRUE);
+}
+
+/////////////////////////////////////////////////////////////////////////////////
+//Init: to init/reinit the data structure.
+/////////////////////////////////////////////////////////////////////////////////
+BOOL comp_ptrs_t::Init (UInt16 *data, UInt16 datasize)
+{
+ image_ptr = data;
+ raw_data = data;
+ data_length = datasize;
+
+ run_length = MAX_RUNLENGTH;
+ display = 0;
+
+ return(TRUE);
+}
+#endif // APDK_LDL_COMPRESS
+
+APDK_END_NAMESPACE
+
+#endif // APDK_DJ3320
diff --git a/prnt/hpijs/dj3320.h b/prnt/hpijs/dj3320.h
new file mode 100644
index 0000000..05182a2
--- /dev/null
+++ b/prnt/hpijs/dj3320.h
@@ -0,0 +1,406 @@
+/*****************************************************************************\
+ DJ3320.h : Interface for the DJ3320 class
+
+ Copyright (c) 2001 - 2002, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ \***************************************************************************/
+
+/*
+ * Author: Raghothama Cauligi
+ */
+
+#ifndef APDK_DJ3320_H
+#define APDK_DJ3320_H
+
+#include "config.h"
+
+APDK_BEGIN_NAMESPACE
+
+#include "ldlencap.h"
+
+class LDLEncap;
+
+class DJ3320 : public Printer
+{
+public:
+ DJ3320 (SystemServices* pSS, BOOL proto = FALSE);
+
+ virtual ~DJ3320 ();
+
+ Header* SelectHeader(PrintContext* pc);
+ virtual DRIVER_ERROR Send (const BYTE *pWriteBuff, DWORD dwWriteLen);
+
+#ifdef APDK_HP_UX
+ virtual DRIVER_ERROR Send (const BYTE *pWriteBuff)
+ {
+ return Send (pWriteBuff, strlen ((const char *) pWriteBuff));
+ }
+#endif
+
+ virtual DRIVER_ERROR Encapsulate (const RASTERDATA *pRasterData, BOOL bLastPlane);
+ DRIVER_ERROR VerifyPenInfo ();
+ virtual DRIVER_ERROR ParsePenInfo (PEN_TYPE& ePen, BOOL QueryPrinter = TRUE);
+ virtual DRIVER_ERROR SkipRasters (int nBlankRasters);
+ virtual DRIVER_ERROR CleanPen ();
+ virtual DRIVER_ERROR Flush (int FlushSize);
+ DRIVER_ERROR SetPens (PEN_TYPE eNewPen);
+ virtual DRIVER_ERROR CheckInkLevel();
+
+ DISPLAY_STATUS ParseError (BYTE byStatusReg);
+
+ inline virtual BOOL SupportSeparateBlack (PrintMode *pCurrentMode)
+ {
+ if (pCurrentMode->ColorDepth[1] == 2)
+ {
+ return FALSE;
+ }
+ return TRUE;
+ }
+
+
+ LDLEncap *pLDLEncap;
+ int m_iBytesPerSwing;
+ int m_iLdlVersion;
+ int m_iColorPenResolution;
+ int m_iBlackPenResolution;
+ int m_iNumBlackNozzles;
+
+protected:
+ DISPLAY_STATUS m_dsCurrentStatus;
+ virtual void InitPrintModes ();
+ virtual void AdjustResolution ()
+ {
+ return;
+ }
+
+#ifdef APDK_HP_UX
+protected:
+ virtual DJ3320& operator = (Printer& rhs)
+ {
+ return *this;
+ }
+#endif
+
+};
+
+class DJ3320GrayMode : public PrintMode
+{
+public:
+ DJ3320GrayMode (PEN_TYPE ePen);
+};
+
+class DJ3320KDraftMode : public GrayMode
+{
+public:
+ DJ3320KDraftMode ();
+};
+
+class DJ3320DraftMode : public PrintMode
+{
+public:
+ DJ3320DraftMode (PEN_TYPE ePen);
+
+};
+
+class DJ3320NormalMode : public PrintMode
+{
+public:
+ DJ3320NormalMode (PEN_TYPE ePen);
+
+};
+
+class DJ3320PhotoMode : public PrintMode
+{
+public:
+ DJ3320PhotoMode ();
+};
+
+class DJ3600MDLNormalMode : public PrintMode
+{
+public:
+ DJ3600MDLNormalMode ();
+};
+
+
+class DJ3600MDLDraftMode : public PrintMode
+{
+public:
+ DJ3600MDLDraftMode ();
+
+};
+
+class DJ3600MDLPhotoMode : public PrintMode
+{
+public:
+ DJ3600MDLPhotoMode ();
+
+};
+
+#if defined (APDK_DJ3320)
+
+//! DJ3320Proxy
+/*!
+******************************************************************************/
+class DJ3320Proxy : public PrinterProxy
+{
+public:
+ DJ3320Proxy() : PrinterProxy(
+ "DJ3320", // family name
+ "deskjet 3320\0"
+ "deskjet 3325\0"
+ "deskjet 3420\0"
+ "deskjet 3425\0"
+ "deskjet 3500\0"
+ "deskjet 3528\0"
+ "deskjet 3535\0"
+ "Deskjet 3740\0"
+ "Deskjet 3920\0"
+ "Deskjet 3940\0"
+ "Deskjet 3900\0"
+ "Deskjet D1360\0"
+ "Deskjet d14\0"
+ "Deskjet D15\0"
+ "Deskjet F22\0"
+#ifdef APDK_MLC_PRINTER
+ "psc 1100\0"
+ "psc 1200\0"
+ "officejet 4100\0"
+ "officejet 4105\0"
+#endif
+ "Officejet 43\0"
+ "officejet 4115\0"
+ "officejet 5500\0"
+ "psc 11\0"
+ "psc 12\0"
+ "psc 13\0"
+ "psc 16\0"
+ ) {m_iPrinterType = eDJ3320;}
+ inline Printer* CreatePrinter(SystemServices* pSS) const { return new DJ3320(pSS); }
+ inline PRINTER_TYPE GetPrinterType() const { return eDJ3320;}
+ inline unsigned int GetModelBit() const { return 0x100;}
+};
+
+#endif
+
+#define SWATH_HEIGHT 100 // Number of color nozzles to be used
+
+#ifdef APDK_LDL_COMPRESS
+
+/************************************************************/
+/* Compression Classes */
+/* */
+/************************************************************/
+
+#define ALLOW_FILL_NEXT_CMD 1
+
+#define FILL_0000_CMD 0x1000
+#define FILL_FFFF_CMD 0x2000
+#define FILL_NEXT_CMD 0x3000
+#define FILL_IMAGE_CMD 0x4000
+#define FILL_ODD_CMD 0x5000
+#define FILL_EVEN_CMD 0x6000
+
+#define MAX_HEADER_FRAME_SIZE 512
+#define MAX_DATA_FRAME_SIZE 6048
+#define MAX_RUNLENGTH 5
+
+typedef enum
+{
+ IN_NOT,
+ IN_FIRST,
+ IN_IMAGE,
+ IN_COPY
+} LDLCOMPMODE;
+
+class comp_ptrs_t
+{
+public:
+ comp_ptrs_t (UInt16 *data,UInt16 datasize):image_ptr(data),raw_data(data),
+ data_length(datasize){};
+ comp_ptrs_t () {};
+ ~comp_ptrs_t () {};
+
+public:
+ BOOL Init(UInt16 *data, UInt16 datasize);
+ UInt16 *out_ptr, *image_ptr; /* image ptr points into the raw data */
+ UInt16 out_cnt, image_cnt, copy_cnt;
+ UInt16 out_array[2048+16];
+ UInt16 *raw_data;
+ UInt16 input_size;
+
+ UInt16 compress;
+ UInt16 display;
+ UInt16 run_length; /* minimun run length */
+
+ UInt16 data_length; /* actual data size in record */
+ UInt16 image_bytes; /* uncompressed size */
+ UInt16 command_number;
+ UInt16 data_type;
+};
+#endif // APDK_LDL_COMPRESS
+
+class LDLEncap //: public Compressor
+{
+public:
+ LDLEncap (DJ3320 *pPrinter, SystemServices *pSys, PrintContext *pc);
+ DRIVER_ERROR Encapsulate (const BYTE* input, DWORD size, BOOL bLastPlane);
+ ~LDLEncap ();
+
+ DRIVER_ERROR StartJob ();
+ DRIVER_ERROR EndPage ();
+ DRIVER_ERROR EndJob ();
+ DRIVER_ERROR Continue ();
+ DRIVER_ERROR CleanPen ();
+ void Cancel ();
+ void Flush ();
+ DRIVER_ERROR SetVerticalSkip (int nBlankRasters);
+ void AllocateSwathBuffer (unsigned int RasterSize);
+
+ BOOL UpdateState (BOOL bInitialize);
+
+ DJ3320 *pPrinterXBow;
+ DRIVER_ERROR constructor_error;
+
+ short int *piCreditCount;
+ BYTE byNumberOfCommands;
+ BYTE byStatusBuff[DevIDBuffSize];
+ BOOL bNewStatus;
+// BYTE byQuery[QUERYSIZE];
+ BYTE pbyCancel[CANCELSIZE];
+ BYTE *pbySync;
+
+private:
+ DRIVER_ERROR StartPage ();
+
+ SystemServices *m_pSys;
+ int m_iRasterCount;
+ int m_iImageWidth;
+ int m_iXResolution;
+ int m_iYResolution;
+ UInt16 m_sRefCount;
+ int m_iNumColors;
+ char m_cPrintDirection;
+ BYTE *m_szCmdBuf;
+ BOOL m_bLittleEndian;
+ PrintContext *m_pthisPC;
+ BYTE ***m_SwathData;
+ short m_sSwathHeight;
+ int m_iBlankRasters;
+ int m_iVertPosn;
+ int m_iLeftMargin;
+ BOOL m_bBidirectionalPrintingOn;
+ Int16 m_iBitDepth;
+ BYTE m_cPassNumber;
+ BYTE m_cPlaneNumber;
+ BYTE m_cPrintQuality;
+ BYTE m_cMediaType;
+ BYTE *m_szCompressBuf;
+ int m_iNextRaster;
+ int m_iNextColor;
+
+ BOOL m_bStartPageNotSent;
+
+ UInt16 m_uVal16;
+ UInt32 m_uVal32;
+ BYTE *m_cByte;
+ BYTE *m_pbyPacketBuff;
+ DWORD m_dwPacketBuffSize;
+
+/*
+ * Pen Alignment Values.
+ */
+
+ BYTE m_cKtoCVertAlign;
+ BYTE m_cPtoCVertAlign;
+
+ DRIVER_ERROR PrintSweep (UInt32 SweepSize,
+ BOOL ColorPresent,
+ BOOL BlackPresent,
+ BOOL PhotoPresent,
+ Int32 VerticalPosition,
+ Int32 LeftEdge,
+ Int32 RightEdge,
+ char PrintDirection,
+ Int16 sFirstNozzle,
+ Int16 sLastNozzle = 0);
+ DRIVER_ERROR LoadSweepData (BYTE *dataPtr, int imagesize);
+ void FillLidilHeader (void *pLidilHdr, int Command,
+ UInt16 CmdLen, UInt16 DataLen);
+ unsigned int GetSwathWidth (int iFirst, int iLast, int iWidth);
+ BOOL IsBlankRaster (BYTE *input, int iWidth);
+ DRIVER_ERROR ProcessSwath (int iCurRasterWidth);
+
+ BOOL GetPackets (DWORD &dwBytesRead);
+
+#ifdef APDK_LDL_COMPRESS
+/*
+ * Compression Related
+ */
+
+ BOOL GetFrameInfo (BYTE **outdata, UInt16 *datasize);
+ void CompressData (Int16 compressmode = 1);
+
+ UInt16 FlushCopy (UInt16 value);
+ UInt16 FlushImage ();
+
+ comp_ptrs_t *m_ldlCompressData;
+#endif // APDK_LDL_COMPRESS
+
+};
+
+#define WRITE16(value) \
+ m_uVal16 = value; \
+ m_cByte = (BYTE *) &m_uVal16; \
+ if (m_bLittleEndian) \
+ { \
+ m_szCmdBuf[index++] = m_cByte[1]; \
+ m_szCmdBuf[index++] = m_cByte[0]; \
+ } \
+ else \
+ { \
+ memcpy (m_szCmdBuf+index, m_cByte, 2); \
+ index += 2; \
+ }
+
+#define WRITE32(value) \
+ m_uVal32 = value; \
+ m_cByte = (BYTE *) &m_uVal32; \
+ if (m_bLittleEndian) \
+ { \
+ m_szCmdBuf[index++] = m_cByte[3]; \
+ m_szCmdBuf[index++] = m_cByte[2]; \
+ m_szCmdBuf[index++] = m_cByte[1]; \
+ m_szCmdBuf[index++] = m_cByte[0]; \
+ } \
+ else \
+ { \
+ memcpy (m_szCmdBuf+index, m_cByte, 4); \
+ index += 4; \
+ }
+
+APDK_END_NAMESPACE
+
+#endif //APDK_DJ3320_H
diff --git a/prnt/hpijs/dj3320_cmap.cpp b/prnt/hpijs/dj3320_cmap.cpp
new file mode 100644
index 0000000..4892ea7
--- /dev/null
+++ b/prnt/hpijs/dj3320_cmap.cpp
@@ -0,0 +1,809 @@
+/*****************************************************************************\
+ dj3320_cmap.cpp : Implimentation for the DJ3320 color maps
+
+ Copyright (c) 1996 - 2003UL, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary formsUL, with or without
+ modificationUL, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ noticeUL, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ noticeUL, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ \***************************************************************************/
+
+
+#ifdef APDK_DJ3320
+
+#include "config.h"
+
+#include "global_types.h"
+
+APDK_BEGIN_NAMESPACE
+
+// 300x300x1, K - Plain, Draft, Grey
+uint32_t ulMapDJ3320_K_3x3x1[] =
+{
+ 255UL, 255UL, 247UL, 224UL, 197UL, 177UL,
+ 167UL, 161UL, 157UL, 171UL, 165UL, 161UL,
+ 156UL, 152UL, 148UL, 146UL, 142UL, 139UL,
+ 147UL, 144UL, 141UL, 137UL, 134UL, 131UL,
+ 128UL, 125UL, 122UL, 130UL, 127UL, 124UL,
+ 120UL, 117UL, 113UL, 111UL, 107UL, 105UL,
+ 112UL, 110UL, 106UL, 104UL, 100UL, 98UL,
+ 95UL, 93UL, 90UL, 96UL, 94UL, 91UL,
+ 89UL, 86UL, 84UL, 81UL, 79UL, 76UL,
+ 83UL, 80UL, 77UL, 75UL, 72UL, 70UL,
+ 68UL, 66UL, 63UL, 69UL, 67UL, 64UL,
+ 62UL, 60UL, 58UL, 55UL, 53UL, 51UL,
+ 57UL, 55UL, 53UL, 50UL, 49UL, 46UL,
+ 45UL, 42UL, 40UL, 231UL, 203UL, 184UL,
+ 168UL, 164UL, 159UL, 155UL, 150UL, 147UL,
+ 157UL, 153UL, 149UL, 146UL, 143UL, 140UL,
+ 136UL, 134UL, 130UL, 139UL, 135UL, 133UL,
+ 129UL, 126UL, 123UL, 120UL, 116UL, 112UL,
+ 122UL, 118UL, 115UL, 112UL, 109UL, 105UL,
+ 103UL, 100UL, 97UL, 105UL, 101UL, 99UL,
+ 96UL, 93UL, 91UL, 88UL, 85UL, 83UL,
+ 90UL, 87UL, 85UL, 82UL, 80UL, 77UL,
+ 75UL, 72UL, 70UL, 76UL, 74UL, 71UL,
+ 69UL, 66UL, 64UL, 62UL, 59UL, 57UL,
+ 63UL, 61UL, 58UL, 57UL, 54UL, 52UL,
+ 50UL, 48UL, 46UL, 51UL, 49UL, 47UL,
+ 45UL, 43UL, 41UL, 39UL, 37UL, 35UL,
+ 169UL, 165UL, 160UL, 156UL, 151UL, 148UL,
+ 145UL, 142UL, 138UL, 147UL, 144UL, 141UL,
+ 137UL, 134UL, 131UL, 128UL, 125UL, 122UL,
+ 130UL, 127UL, 124UL, 120UL, 117UL, 113UL,
+ 111UL, 107UL, 105UL, 112UL, 110UL, 106UL,
+ 104UL, 100UL, 98UL, 95UL, 93UL, 90UL,
+ 96UL, 94UL, 91UL, 89UL, 86UL, 84UL,
+ 81UL, 79UL, 76UL, 83UL, 80UL, 77UL,
+ 75UL, 72UL, 70UL, 68UL, 66UL, 63UL,
+ 69UL, 67UL, 64UL, 62UL, 60UL, 58UL,
+ 55UL, 53UL, 51UL, 57UL, 55UL, 53UL,
+ 50UL, 49UL, 46UL, 45UL, 42UL, 40UL,
+ 46UL, 44UL, 42UL, 40UL, 38UL, 36UL,
+ 34UL, 32UL, 30UL, 156UL, 152UL, 149UL,
+ 146UL, 143UL, 139UL, 135UL, 133UL, 129UL,
+ 138UL, 135UL, 132UL, 129UL, 125UL, 123UL,
+ 119UL, 116UL, 112UL, 121UL, 118UL, 114UL,
+ 112UL, 108UL, 105UL, 102UL, 100UL, 96UL,
+ 104UL, 101UL, 99UL, 96UL, 93UL, 91UL,
+ 88UL, 85UL, 83UL, 90UL, 87UL, 85UL,
+ 82UL, 80UL, 77UL, 75UL, 72UL, 70UL,
+ 76UL, 73UL, 71UL, 68UL, 66UL, 64UL,
+ 62UL, 59UL, 57UL, 63UL, 60UL, 58UL,
+ 56UL, 54UL, 51UL, 50UL, 47UL, 46UL,
+ 51UL, 49UL, 47UL, 45UL, 43UL, 41UL,
+ 39UL, 37UL, 35UL, 40UL, 39UL, 36UL,
+ 35UL, 32UL, 31UL, 29UL, 27UL, 25UL,
+ 146UL, 143UL, 140UL, 136UL, 134UL, 130UL,
+ 127UL, 124UL, 121UL, 130UL, 126UL, 124UL,
+ 120UL, 117UL, 113UL, 111UL, 107UL, 105UL,
+ 112UL, 109UL, 106UL, 103UL, 100UL, 97UL,
+ 95UL, 92UL, 90UL, 96UL, 93UL, 91UL,
+ 88UL, 86UL, 83UL, 81UL, 78UL, 76UL,
+ 83UL, 80UL, 77UL, 75UL, 72UL, 70UL,
+ 68UL, 65UL, 63UL, 69UL, 67UL, 64UL,
+ 62UL, 60UL, 58UL, 55UL, 53UL, 51UL,
+ 57UL, 55UL, 52UL, 50UL, 48UL, 46UL,
+ 44UL, 42UL, 40UL, 45UL, 44UL, 41UL,
+ 40UL, 37UL, 36UL, 34UL, 32UL, 30UL,
+ 35UL, 33UL, 31UL, 29UL, 27UL, 25UL,
+ 23UL, 21UL, 19UL, 137UL, 134UL, 131UL,
+ 128UL, 125UL, 122UL, 118UL, 115UL, 112UL,
+ 121UL, 118UL, 114UL, 112UL, 108UL, 105UL,
+ 102UL, 99UL, 96UL, 104UL, 101UL, 98UL,
+ 96UL, 93UL, 91UL, 88UL, 85UL, 83UL,
+ 89UL, 87UL, 84UL, 82UL, 79UL, 77UL,
+ 74UL, 72UL, 69UL, 75UL, 73UL, 70UL,
+ 68UL, 66UL, 64UL, 61UL, 59UL, 57UL,
+ 62UL, 60UL, 58UL, 56UL, 54UL, 51UL,
+ 49UL, 47UL, 45UL, 51UL, 49UL, 47UL,
+ 45UL, 43UL, 41UL, 39UL, 37UL, 35UL,
+ 40UL, 38UL, 36UL, 34UL, 32UL, 30UL,
+ 29UL, 26UL, 25UL, 30UL, 27UL, 26UL,
+ 24UL, 22UL, 20UL, 18UL, 16UL, 14UL,
+ 129UL, 125UL, 123UL, 119UL, 116UL, 112UL,
+ 110UL, 106UL, 104UL, 112UL, 109UL, 105UL,
+ 103UL, 100UL, 97UL, 94UL, 92UL, 89UL,
+ 96UL, 93UL, 91UL, 88UL, 86UL, 83UL,
+ 81UL, 78UL, 75UL, 83UL, 80UL, 77UL,
+ 75UL, 72UL, 70UL, 68UL, 65UL, 63UL,
+ 69UL, 66UL, 64UL, 62UL, 60UL, 57UL,
+ 55UL, 53UL, 51UL, 57UL, 54UL, 52UL,
+ 50UL, 48UL, 46UL, 44UL, 42UL, 40UL,
+ 45UL, 44UL, 41UL, 40UL, 37UL, 36UL,
+ 34UL, 31UL, 30UL, 35UL, 33UL, 31UL,
+ 29UL, 27UL, 25UL, 23UL, 21UL, 19UL,
+ 24UL, 23UL, 20UL, 18UL, 16UL, 14UL,
+ 12UL, 10UL, 8UL, 120UL, 117UL, 113UL,
+ 111UL, 107UL, 105UL, 101UL, 99UL, 96UL,
+ 104UL, 100UL, 98UL, 95UL, 93UL, 90UL,
+ 88UL, 85UL, 83UL, 89UL, 87UL, 84UL,
+ 81UL, 79UL, 76UL, 74UL, 71UL, 69UL,
+ 75UL, 73UL, 70UL, 68UL, 66UL, 64UL,
+ 61UL, 59UL, 57UL, 62UL, 60UL, 58UL,
+ 56UL, 53UL, 51UL, 49UL, 47UL, 45UL,
+ 50UL, 49UL, 46UL, 45UL, 42UL, 41UL,
+ 39UL, 37UL, 35UL, 40UL, 38UL, 36UL,
+ 34UL, 32UL, 30UL, 28UL, 26UL, 24UL,
+ 30UL, 27UL, 26UL, 24UL, 22UL, 20UL,
+ 18UL, 16UL, 13UL, 19UL, 17UL, 15UL,
+ 13UL, 11UL, 8UL, 7UL, 4UL, 2UL,
+ 111UL, 108UL, 105UL, 102UL, 100UL, 96UL,
+ 93UL, 91UL, 88UL, 96UL, 93UL, 91UL,
+ 88UL, 85UL, 83UL, 80UL, 78UL, 75UL,
+ 82UL, 80UL, 77UL, 75UL, 72UL, 70UL,
+ 67UL, 65UL, 62UL, 68UL, 66UL, 64UL,
+ 62UL, 59UL, 57UL, 55UL, 53UL, 50UL,
+ 57UL, 54UL, 52UL, 50UL, 48UL, 46UL,
+ 44UL, 42UL, 40UL, 45UL, 43UL, 41UL,
+ 39UL, 37UL, 35UL, 34UL, 31UL, 30UL,
+ 35UL, 32UL, 31UL, 29UL, 27UL, 25UL,
+ 23UL, 21UL, 19UL, 24UL, 23UL, 20UL,
+ 18UL, 16UL, 14UL, 12UL, 10UL, 8UL,
+ 13UL, 11UL, 9UL, 7UL, 5UL, 3UL,
+ 1UL, 0UL, 0UL,
+};
+
+// 600x600x1, K - Plain, Normal, Grey
+
+uint32_t ulMapDJ3320_K_6x6x1[] =
+{
+ 255UL, 238UL, 218UL, 204UL, 189UL, 181UL,
+ 171UL, 161UL, 154UL, 178UL, 168UL, 161UL,
+ 153UL, 148UL, 141UL, 136UL, 130UL, 127UL,
+ 140UL, 133UL, 129UL, 124UL, 121UL, 116UL,
+ 113UL, 109UL, 106UL, 115UL, 112UL, 108UL,
+ 104UL, 101UL, 97UL, 95UL, 91UL, 89UL,
+ 96UL, 94UL, 90UL, 88UL, 85UL, 82UL,
+ 79UL, 77UL, 74UL, 81UL, 78UL, 76UL,
+ 73UL, 71UL, 69UL, 66UL, 65UL, 62UL,
+ 67UL, 66UL, 63UL, 62UL, 59UL, 57UL,
+ 55UL, 54UL, 51UL, 56UL, 55UL, 52UL,
+ 51UL, 49UL, 47UL, 45UL, 44UL, 42UL,
+ 47UL, 45UL, 43UL, 41UL, 40UL, 38UL,
+ 37UL, 35UL, 33UL, 209UL, 191UL, 184UL,
+ 173UL, 166UL, 156UL, 151UL, 144UL, 140UL,
+ 154UL, 149UL, 143UL, 138UL, 132UL, 128UL,
+ 123UL, 120UL, 115UL, 127UL, 122UL, 119UL,
+ 114UL, 111UL, 107UL, 104UL, 100UL, 96UL,
+ 106UL, 102UL, 99UL, 95UL, 93UL, 90UL,
+ 87UL, 84UL, 81UL, 89UL, 85UL, 83UL,
+ 80UL, 78UL, 75UL, 73UL, 70UL, 68UL,
+ 74UL, 71UL, 69UL, 67UL, 65UL, 63UL,
+ 61UL, 59UL, 57UL, 62UL, 60UL, 58UL,
+ 56UL, 54UL, 52UL, 50UL, 48UL, 47UL,
+ 51UL, 50UL, 48UL, 46UL, 44UL, 43UL,
+ 41UL, 39UL, 38UL, 42UL, 40UL, 38UL,
+ 37UL, 35UL, 34UL, 32UL, 31UL, 29UL,
+ 176UL, 168UL, 159UL, 153UL, 146UL, 141UL,
+ 135UL, 130UL, 125UL, 140UL, 133UL, 129UL,
+ 124UL, 121UL, 116UL, 113UL, 109UL, 106UL,
+ 115UL, 112UL, 108UL, 104UL, 101UL, 97UL,
+ 95UL, 91UL, 89UL, 96UL, 94UL, 90UL,
+ 88UL, 85UL, 82UL, 79UL, 77UL, 74UL,
+ 81UL, 78UL, 76UL, 73UL, 71UL, 69UL,
+ 66UL, 65UL, 62UL, 67UL, 66UL, 63UL,
+ 62UL, 59UL, 57UL, 55UL, 54UL, 51UL,
+ 56UL, 55UL, 52UL, 51UL, 49UL, 47UL,
+ 45UL, 44UL, 42UL, 47UL, 45UL, 43UL,
+ 41UL, 40UL, 38UL, 37UL, 35UL, 33UL,
+ 38UL, 36UL, 34UL, 32UL, 31UL, 29UL,
+ 28UL, 26UL, 25UL, 153UL, 148UL, 143UL,
+ 136UL, 132UL, 127UL, 122UL, 119UL, 114UL,
+ 125UL, 122UL, 118UL, 114UL, 110UL, 107UL,
+ 103UL, 100UL, 96UL, 105UL, 102UL, 98UL,
+ 95UL, 92UL, 90UL, 86UL, 84UL, 81UL,
+ 88UL, 85UL, 83UL, 80UL, 77UL, 75UL,
+ 72UL, 70UL, 67UL, 74UL, 71UL, 69UL,
+ 67UL, 65UL, 63UL, 61UL, 59UL, 57UL,
+ 62UL, 60UL, 58UL, 56UL, 54UL, 52UL,
+ 50UL, 48UL, 47UL, 51UL, 49UL, 48UL,
+ 46UL, 44UL, 42UL, 41UL, 39UL, 38UL,
+ 42UL, 40UL, 38UL, 37UL, 35UL, 33UL,
+ 32UL, 30UL, 29UL, 33UL, 31UL, 30UL,
+ 28UL, 27UL, 25UL, 24UL, 22UL, 21UL,
+ 138UL, 132UL, 128UL, 123UL, 120UL, 115UL,
+ 112UL, 108UL, 105UL, 115UL, 111UL, 108UL,
+ 104UL, 101UL, 97UL, 95UL, 91UL, 89UL,
+ 96UL, 93UL, 90UL, 87UL, 85UL, 81UL,
+ 79UL, 76UL, 74UL, 81UL, 78UL, 76UL,
+ 73UL, 71UL, 68UL, 66UL, 64UL, 62UL,
+ 67UL, 66UL, 63UL, 62UL, 59UL, 57UL,
+ 55UL, 53UL, 51UL, 56UL, 55UL, 52UL,
+ 51UL, 49UL, 47UL, 45UL, 44UL, 42UL,
+ 46UL, 45UL, 43UL, 41UL, 39UL, 38UL,
+ 36UL, 35UL, 33UL, 37UL, 36UL, 34UL,
+ 32UL, 31UL, 29UL, 28UL, 26UL, 25UL,
+ 28UL, 27UL, 26UL, 24UL, 22UL, 21UL,
+ 19UL, 18UL, 16UL, 124UL, 121UL, 116UL,
+ 113UL, 109UL, 106UL, 102UL, 99UL, 95UL,
+ 105UL, 102UL, 98UL, 95UL, 92UL, 90UL,
+ 86UL, 83UL, 81UL, 88UL, 85UL, 82UL,
+ 80UL, 77UL, 75UL, 72UL, 70UL, 67UL,
+ 73UL, 71UL, 69UL, 67UL, 65UL, 63UL,
+ 60UL, 59UL, 56UL, 62UL, 60UL, 57UL,
+ 56UL, 54UL, 52UL, 50UL, 48UL, 46UL,
+ 51UL, 49UL, 48UL, 46UL, 44UL, 42UL,
+ 40UL, 39UL, 37UL, 42UL, 40UL, 38UL,
+ 37UL, 35UL, 33UL, 32UL, 30UL, 29UL,
+ 33UL, 31UL, 30UL, 28UL, 27UL, 25UL,
+ 24UL, 22UL, 21UL, 25UL, 23UL, 22UL,
+ 20UL, 19UL, 17UL, 16UL, 14UL, 12UL,
+ 114UL, 110UL, 107UL, 103UL, 100UL, 96UL,
+ 94UL, 90UL, 88UL, 95UL, 93UL, 90UL,
+ 87UL, 84UL, 81UL, 78UL, 76UL, 73UL,
+ 81UL, 78UL, 76UL, 73UL, 71UL, 68UL,
+ 66UL, 64UL, 62UL, 67UL, 65UL, 63UL,
+ 61UL, 59UL, 57UL, 55UL, 53UL, 51UL,
+ 56UL, 54UL, 52UL, 50UL, 49UL, 47UL,
+ 45UL, 43UL, 42UL, 46UL, 44UL, 43UL,
+ 41UL, 39UL, 38UL, 36UL, 34UL, 33UL,
+ 37UL, 36UL, 34UL, 32UL, 31UL, 29UL,
+ 28UL, 26UL, 25UL, 28UL, 27UL, 25UL,
+ 24UL, 22UL, 21UL, 19UL, 18UL, 16UL,
+ 20UL, 19UL, 17UL, 16UL, 14UL, 13UL,
+ 11UL, 10UL, 8UL, 104UL, 101UL, 97UL,
+ 95UL, 91UL, 89UL, 85UL, 83UL, 80UL,
+ 88UL, 85UL, 82UL, 79UL, 77UL, 74UL,
+ 72UL, 69UL, 67UL, 73UL, 71UL, 69UL,
+ 66UL, 65UL, 62UL, 60UL, 58UL, 56UL,
+ 62UL, 60UL, 57UL, 56UL, 54UL, 52UL,
+ 50UL, 48UL, 46UL, 51UL, 49UL, 47UL,
+ 46UL, 44UL, 42UL, 40UL, 39UL, 37UL,
+ 41UL, 40UL, 38UL, 37UL, 35UL, 33UL,
+ 31UL, 30UL, 28UL, 32UL, 31UL, 29UL,
+ 28UL, 26UL, 25UL, 23UL, 22UL, 20UL,
+ 25UL, 23UL, 22UL, 20UL, 19UL, 17UL,
+ 16UL, 14UL, 12UL, 16UL, 15UL, 13UL,
+ 12UL, 10UL, 9UL, 7UL, 6UL, 4UL,
+ 95UL, 92UL, 90UL, 86UL, 84UL, 81UL,
+ 78UL, 76UL, 73UL, 80UL, 78UL, 75UL,
+ 73UL, 70UL, 68UL, 66UL, 64UL, 62UL,
+ 67UL, 65UL, 63UL, 61UL, 59UL, 57UL,
+ 55UL, 53UL, 51UL, 56UL, 54UL, 52UL,
+ 50UL, 48UL, 47UL, 45UL, 43UL, 41UL,
+ 46UL, 44UL, 43UL, 41UL, 39UL, 38UL,
+ 36UL, 34UL, 33UL, 37UL, 35UL, 34UL,
+ 32UL, 31UL, 29UL, 28UL, 26UL, 25UL,
+ 28UL, 27UL, 25UL, 24UL, 22UL, 21UL,
+ 19UL, 18UL, 16UL, 20UL, 19UL, 17UL,
+ 16UL, 14UL, 12UL, 11UL, 9UL, 8UL,
+ 12UL, 11UL, 9UL, 8UL, 6UL, 5UL,
+ 3UL, 2UL, 0UL,
+};
+
+// 300x300x1, CMY - Plain Draft, Color Pen Only
+
+uint32_t ulMapDJ3320_CMY_3x3x1[ 9 * 9 * 9 ] =
+{
+4294967040UL, 4294967040UL, 2499804928UL, 1073741568UL, 619577088UL, 383844096UL,
+ 198573824UL, 63766272UL, 12975872UL, 4292869888UL, 4293394176UL, 2381905664UL,
+ 838074112UL, 535494400UL, 350093056UL, 164888320UL, 30080768UL, 12779264UL,
+4285398784UL, 4285660928UL, 2961506048UL, 966983424UL, 246087424UL, 79036160UL,
+ 62717696UL, 29032192UL, 11730688UL, 4282184960UL, 4282318592UL, 4282842880UL,
+1833565952UL, 744423168UL, 259391232UL, 126025472UL, 59244288UL, 9043712UL,
+4280872960UL, 4280811264UL, 4280614656UL, 3626434304UL, 1311768320UL, 523894528UL,
+ 240123648UL, 106888960UL, 6618880UL, 4280217600UL, 4280089344UL, 4279566080UL,
+4279566080UL, 2300313344UL, 958725888UL, 388497152UL, 121044736UL, 4652800UL,
+4279495424UL, 4279366912UL, 4278976256UL, 4278517504UL, 3071082240UL, 1494482688UL,
+ 555155200UL, 203030272UL, 2883328UL, 4278838528UL, 4278710016UL, 4278517504UL,
+4278714112UL, 3439787776UL, 2047147776UL, 1040973568UL, 235667200UL, 982784UL,
+4278250752UL, 4278250752UL, 4278250752UL, 4278249728UL, 3439389952UL, 2298540800UL,
+1359018752UL, 604045056UL, 65280UL, 4294960384UL, 1325354752UL, 704642816UL,
+ 134217472UL, 134217472UL, 117440256UL, 83033856UL, 48234240UL, 13303552UL,
+4293254400UL, 4294967040UL, 2515271424UL, 517013248UL, 63110912UL, 12254976UL,
+ 11730688UL, 11206400UL, 11075328UL, 4285195008UL, 4286447360UL, 2727345920UL,
+ 881655552UL, 210894592UL, 9961216UL, 10157824UL, 10157824UL, 10551040UL,
+4282050560UL, 4281597696UL, 4013752064UL, 1631911680UL, 458358528UL, 73531136UL,
+ 7339776UL, 7995136UL, 8781568UL, 4280740352UL, 4280220928UL, 4280221440UL,
+2770599680UL, 1059520256UL, 322043648UL, 54722304UL, 5373696UL, 6225664UL,
+4280019456UL, 4279169024UL, 4279365632UL, 3574595328UL, 1813118720UL, 739573504UL,
+ 203161344UL, 19726080UL, 4194048UL, 4279231488UL, 4278510336UL, 4278640384UL,
+3892834304UL, 2399600384UL, 1242169088UL, 521076480UL, 101646080UL, 2096896UL,
+4278640640UL, 4278241792UL, 4278242304UL, 4076918016UL, 2801853184UL, 1711336192UL,
+ 855895296UL, 235008512UL, 524032UL, 4278246656UL, 4278240512UL, 4278241280UL,
+4278241280UL, 3070281728UL, 2046873600UL, 1191237632UL, 520148992UL, 55040UL,
+4294930944UL, 4127145472UL, 872370432UL, 385862656UL, 218103552UL, 134217472UL,
+ 83230464UL, 65339136UL, 13631232UL, 4294603520UL, 4294941696UL, 2281675776UL,
+ 385861376UL, 15790592UL, 14417664UL, 13172480UL, 12254976UL, 11927296UL,
+4285692160UL, 4286680320UL, 2307498496UL, 1418377216UL, 193460224UL, 9043712UL,
+ 9109248UL, 9240320UL, 9109248UL, 4282296832UL, 4282370048UL, 3628255744UL,
+1633073664UL, 509011968UL, 23065856UL, 7140608UL, 7732992UL, 8388352UL,
+4280599552UL, 4280405760UL, 4280079616UL, 2368003328UL, 824438784UL, 238155776UL,
+ 4516608UL, 5437184UL, 6487808UL, 4279749888UL, 4279225344UL, 4279026176UL,
+2937046272UL, 1494344192UL, 605287680UL, 119337472UL, 3140864UL, 4321792UL,
+4279029504UL, 4278437632UL, 4278236928UL, 3255022592UL, 2030290944UL, 1057281792UL,
+ 335798272UL, 51177984UL, 2417152UL, 4278505216UL, 4278236416UL, 4278232832UL,
+3607144960UL, 2432742400UL, 1543553536UL, 788644864UL, 201377536UL, 514816UL,
+4278239232UL, 4278235648UL, 4278233088UL, 3925911552UL, 2751506944UL, 1895870208UL,
+1174450688UL, 503362048UL, 43520UL, 4294915840UL, 4294910720UL, 1778329344UL,
+ 520043520UL, 385846272UL, 218087424UL, 133881856UL, 65599488UL, 13892352UL,
+4294653440UL, 4294915584UL, 2147432960UL, 469717248UL, 16744960UL, 15707136UL,
+ 14338560UL, 13098240UL, 12580608UL, 4288300800UL, 4288694784UL, 2946258432UL,
+1453483776UL, 162692352UL, 11836672UL, 11187200UL, 10536704UL, 10280192UL,
+4282798336UL, 4283326208UL, 3075891456UL, 1499032064UL, 912028928UL, 56599040UL,
+ 6795776UL, 7193600UL, 7330560UL, 4280711680UL, 4280713472UL, 4280714240UL,
+2301330432UL, 976647936UL, 204971008UL, 4827136UL, 5750016UL, 6477568UL,
+4279539968UL, 4279342080UL, 4279340032UL, 2987364864UL, 1461097472UL, 504799744UL,
+ 52540672UL, 3652864UL, 4706048UL, 4278823424UL, 4278492160UL, 4278422784UL,
+3171191040UL, 1896320768UL, 1057595136UL, 319202560UL, 18067456UL, 2864384UL,
+4278496768UL, 4278228224UL, 4278226176UL, 3422587136UL, 2264960000UL, 1459655680UL,
+ 771987968UL, 184654848UL, 829184UL, 4278230784UL, 4278228224UL, 4278226688UL,
+3623913984UL, 2566949888UL, 1895860736UL, 1241549824UL, 520131072UL, 35840UL,
+4294908928UL, 4294905344UL, 3170831872UL, 352260352UL, 520042240UL, 301950464UL,
+ 167610624UL, 82813952UL, 14726144UL, 4294447872UL, 4294577920UL, 3120503040UL,
+ 654253056UL, 33502720UL, 16277760UL, 14909696UL, 14129664UL, 14004736UL,
+4288945920UL, 4289142528UL, 3031048448UL, 1237462016UL, 164051200UL, 12409344UL,
+ 11892480UL, 11899392UL, 11578368UL, 4283706368UL, 4284100864UL, 3579981568UL,
+1734491648UL, 879510528UL, 75322880UL, 8678656UL, 8684800UL, 8495616UL,
+4281022976UL, 4281220864UL, 4281286144UL, 1949778176UL, 976897792UL, 524243456UL,
+ 21655296UL, 5406464UL, 5872640UL, 4279655168UL, 4279654144UL, 4279718912UL,
+3038205696UL, 1494964736UL, 606163456UL, 69824768UL, 4097024UL, 4889600UL,
+4279007488UL, 4278676480UL, 4278673664UL, 3171507968UL, 1896441344UL, 974022400UL,
+ 286026752UL, 1672960UL, 3249408UL, 4278616576UL, 4278219776UL, 4278283264UL,
+3489753344UL, 2181261056UL, 1375955200UL, 822504448UL, 151090432UL, 1146624UL,
+4278221824UL, 4278219776UL, 4278219264UL, 3758125568UL, 2483056384UL, 1828743680UL,
+1275094784UL, 587230976UL, 28928UL, 4294906112UL, 4294903552UL, 4127133440UL,
+1509888768UL, 486480896UL, 335489792UL, 201280000UL, 116613632UL, 14841088UL,
+4294577664UL, 4294772992UL, 3690923776UL, 1375668992UL, 67047680UL, 16722688UL,
+ 15354368UL, 14311680UL, 13988352UL, 4289989632UL, 4289005056UL, 3131836160UL,
+1724387584UL, 299045632UL, 13249280UL, 12339456UL, 12214016UL, 12415488UL,
+4284683264UL, 4284617728UL, 3664385024UL, 1835996672UL, 780213760UL, 59320064UL,
+ 9192960UL, 9526272UL, 9729792UL, 4281737472UL, 4281999616UL, 4281999104UL,
+2185502976UL, 1095181312UL, 558509056UL, 56245760UL, 6706944UL, 7107072UL,
+4280036352UL, 4279971584UL, 4279970048UL, 2820548352UL, 1327704320UL, 606350336UL,
+ 321664768UL, 20731648UL, 4813312UL, 4279322368UL, 4278993920UL, 4279123456UL,
+3289332736UL, 1947155968UL, 907424768UL, 336869120UL, 18831104UL, 3566592UL,
+4278670336UL, 4278275584UL, 4278274560UL, 3439544576UL, 2181449984UL, 1275480320UL,
+ 789006592UL, 117657344UL, 1465856UL, 4278212864UL, 4278212352UL, 4278211584UL,
+3623900672UL, 2533381632UL, 1577078528UL, 1174423808UL, 654331648UL, 21504UL,
+4294904064UL, 4294902528UL, 4294904576UL, 2331970560UL, 973017856UL, 352261120UL,
+ 218045440UL, 133707264UL, 15026432UL, 4294444800UL, 4294639872UL, 4026466304UL,
+2113864448UL, 654248192UL, 16715520UL, 15671552UL, 14497536UL, 14108416UL,
+4290774528UL, 4290380800UL, 3753640192UL, 2110390528UL, 702152960UL, 14093312UL,
+ 12853504UL, 12531456UL, 12732672UL, 4286319616UL, 4284743680UL, 3547136000UL,
+2105345792UL, 1066142720UL, 160499456UL, 9707008UL, 9909760UL, 10438400UL,
+4282848000UL, 4282519040UL, 3796241408UL, 2185890816UL, 1145966080UL, 525997056UL,
+ 56761088UL, 7156736UL, 7949312UL, 4280358656UL, 4280227328UL, 4280685568UL,
+2401965568UL, 1378751488UL, 691082240UL, 338959104UL, 21376768UL, 5523968UL,
+4279442176UL, 4279115264UL, 4279180288UL, 3071351552UL, 1863523072UL, 907417344UL,
+ 370546944UL, 203499264UL, 3229440UL, 4278989056UL, 4278595072UL, 4278594560UL,
+3355913216UL, 2231971328UL, 1309224448UL, 688661504UL, 151462912UL, 1786880UL,
+4278204160UL, 4278203904UL, 4278203904UL, 3439343104UL, 2432710400UL, 1493186048UL,
+ 922758912UL, 637546240UL, 13824UL, 4294902784UL, 4294902784UL, 4294903296UL,
+2818508288UL, 1476331776UL, 754912768UL, 218040576UL, 117116416UL, 15409920UL,
+4294246656UL, 4293722112UL, 4159897600UL, 2515861504UL, 1291452416UL, 301465856UL,
+ 15665920UL, 14816256UL, 14360832UL, 4291101696UL, 4290576384UL, 3988717568UL,
+2462384128UL, 1422917632UL, 399704064UL, 13437184UL, 12850176UL, 12919040UL,
+4286907904UL, 4286709760UL, 4085711104UL, 2408186112UL, 1502740736UL, 731513600UL,
+ 27001856UL, 10097408UL, 10625280UL, 4283500800UL, 4282777600UL, 3578396672UL,
+2303983616UL, 1280770048UL, 912656128UL, 241829376UL, 7409920UL, 8332288UL,
+4281010432UL, 4281273088UL, 3710649344UL, 2452685824UL, 1446249216UL, 691601664UL,
+ 457575168UL, 21761536UL, 6039040UL, 4279634944UL, 4279438336UL, 3608546304UL,
+2484866048UL, 1495141376UL, 1042483456UL, 388039680UL, 153356544UL, 3809536UL,
+4278782976UL, 4278456064UL, 4278587136UL, 3204845056UL, 1997082112UL, 1242107392UL,
+ 688655360UL, 151587584UL, 1646848UL, 4278196480UL, 4278196224UL, 4143978240UL,
+3355449600UL, 2365593856UL, 1509956352UL, 872421632UL, 469767680UL, 7936UL,
+4294901760UL, 4294901760UL, 4294639616UL, 3321495552UL, 2230779904UL, 1240793088UL,
+ 653590528UL, 267583488UL, 15925248UL, 4293918720UL, 4293591040UL, 4209442816UL,
+2833448960UL, 1843724288UL, 920977408UL, 400687104UL, 81723392UL, 14483456UL,
+4290707456UL, 4290707456UL, 4039114752UL, 2764308480UL, 1925513216UL, 1204224000UL,
+ 432275456UL, 29622272UL, 12713984UL, 4287168512UL, 4287168512UL, 4287758336UL,
+2627010560UL, 1922498560UL, 1385824256UL, 664731648UL, 77725696UL, 10616832UL,
+4284219392UL, 4284088320UL, 4200660992UL, 2993291264UL, 1684865024UL, 1366228992UL,
+ 863305728UL, 209453056UL, 8192000UL, 4281794560UL, 4281729024UL, 3980328960UL,
+2571370496UL, 1715732480UL, 977338368UL, 827195392UL, 374931456UL, 6160384UL,
+4280025088UL, 4279631872UL, 4146003968UL, 2535718912UL, 1630076928UL, 1042874368UL,
+ 606666752UL, 422838272UL, 3932160UL, 4278845440UL, 4278255616UL, 4278452224UL,
+3490250752UL, 1627980032UL, 1040974592UL, 470548480UL, 320077824UL, 2293760UL,
+4278190080UL, 4278190080UL, 3892314112UL, 3036676096UL, 2181038080UL, 1442840576UL,
+ 771751936UL, 335544320UL, 0UL,
+};
+
+// 300x300x1, KCMY - Plain Draft, Both Pens
+
+uint32_t ulMapDJ3320_KCMY_3x3x1[ 9 * 9 * 9 ] =
+{
+1330601906UL, 13500224UL, 12582697UL, 12386074UL, 12254995UL, 12254990UL,
+ 12254986UL, 12386053UL, 12451584UL, 4280614716UL, 184614723UL, 10288939UL,
+ 12255003UL, 12386067UL, 12254990UL, 12254986UL, 12386053UL, 12123904UL,
+4281269534UL, 4279566124UL, 184614710UL, 6618912UL, 9568021UL, 10682126UL,
+ 11206410UL, 11403012UL, 11206400UL, 4281138958UL, 4280090387UL, 3842047776UL,
+ 251723559UL, 3473177UL, 6618893UL, 8060677UL, 9043714UL, 8912640UL,
+4280941063UL, 4280549129UL, 4278648595UL, 2768305944UL, 335609628UL, 1638165UL,
+ 4325131UL, 157482753UL, 6749952UL, 4280741633UL, 4280613378UL, 4279369479UL,
+4278255375UL, 2080440081UL, 335609621UL, 655120UL, 53214983UL, 4849408UL,
+4280084224UL, 4280021504UL, 4279697152UL, 4278451974UL, 3523346184UL, 1510211337UL,
+ 318897931UL, 67895045UL, 2752256UL, 4279165696UL, 4279168256UL, 4278714112UL,
+4278714112UL, 4228316928UL, 2450128641UL, 1141636866UL, 319553280UL, 982784UL,
+4278250752UL, 4278251264UL, 4278252032UL, 4278253568UL, 3741384448UL, 2566979328UL,
+1577123584UL, 721485568UL, 65280UL, 4294903620UL, 16717634UL, 16776996UL,
+ 67108627UL, 33554187UL, 15990535UL, 15073028UL, 14352129UL, 13172480UL,
+4284972085UL, 2240126303UL, 1071513390UL, 46989077UL, 13172493UL, 29687559UL,
+ 12910338UL, 12648192UL, 11599616UL, 4282571287UL, 4281270055UL, 2508062496UL,
+ 327024407UL, 127598349UL, 162397954UL, 28180224UL, 11206400UL, 10878720UL,
+4281593867UL, 4280549135UL, 3928096534UL, 890961689UL, 256311056UL, 242089732UL,
+ 75104000UL, 8191744UL, 8716032UL, 4281135110UL, 4280549124UL, 4280549129UL,
+2819948301UL, 789905168UL, 254410507UL, 256835328UL, 22347520UL, 6291200UL,
+4280739584UL, 4279890688UL, 4280090368UL, 4145544963UL, 2031222537UL, 722730761UL,
+ 371326723UL, 103808768UL, 4194048UL, 4280017664UL, 4278970880UL, 4279167488UL,
+4279172864UL, 2903506688UL, 1578434304UL, 655687424UL, 152043264UL, 2031360UL,
+4279164672UL, 4278311424UL, 4278311168UL, 4278444544UL, 3171155712UL, 1963261696UL,
+ 990183168UL, 319028992UL, 458496UL, 4278247424UL, 4278242304UL, 4278243328UL,
+4278243840UL, 3305168640UL, 2231432448UL, 1359019776UL, 604045056UL, 65280UL,
+4294904113UL, 3187605553UL, 16718636UL, 16764692UL, 16776969UL, 16776960UL,
+ 33554178UL, 116784896UL, 13631232UL, 4292296993UL, 4294655551UL, 1375700775UL,
+ 67104783UL, 16776960UL, 16776960UL, 15990528UL, 14221056UL, 12451584UL,
+4285889803UL, 4287600921UL, 3402297099UL, 1689646345UL, 380632832UL, 27655936UL,
+ 10682112UL, 10551040UL, 10157824UL, 4283021060UL, 4282567943UL, 4283627275UL,
+2037181193UL, 728563458UL, 208797440UL, 7667456UL, 8388352UL, 9043712UL,
+4281650946UL, 4281261313UL, 4280743684UL, 2855271171UL, 1110441734UL, 473956096UL,
+ 105512704UL, 5701376UL, 6487808UL, 4280800512UL, 4280014848UL, 4279557888UL,
+3441025792UL, 1897725696UL, 824114944UL, 254017280UL, 53608192UL, 4325120UL,
+4279882496UL, 4278964736UL, 4278439680UL, 3657942784UL, 2265571840UL, 1275919616UL,
+ 520945408UL, 101842688UL, 2359040UL, 4278964736UL, 4278305792UL, 4278236928UL,
+3842224640UL, 2617361664UL, 1711529984UL, 923070464UL, 251918848UL, 524032UL,
+4278241792UL, 4278237184UL, 4278234880UL, 4076908288UL, 2936059648UL, 2046870528UL,
+1275123456UL, 520152832UL, 57088UL, 4294904859UL, 4294902044UL, 872349728UL,
+ 16719385UL, 16751625UL, 16773888UL, 100663043UL, 167771904UL, 15204096UL,
+4294910995UL, 4294903326UL, 1660888088UL, 117397264UL, 33535744UL, 16771072UL,
+ 16776960UL, 16252672UL, 13696768UL, 4289353221UL, 4290531848UL, 4040718602UL,
+1843235338UL, 468165888UL, 14404608UL, 13625856UL, 12647680UL, 11861760UL,
+4284245504UL, 4284905729UL, 4068445956UL, 2038009602UL, 1232575488UL, 74244096UL,
+ 7335680UL, 7731968UL, 8191744UL, 4281829888UL, 4281635328UL, 4281768960UL,
+2805637120UL, 1330222080UL, 390512384UL, 21810176UL, 6087936UL, 6814464UL,
+4280591616UL, 4280067072UL, 4279999744UL, 3491211008UL, 1763683584UL, 723501568UL,
+ 153539328UL, 3660544UL, 4646144UL, 4279742976UL, 4279150336UL, 4278819328UL,
+3490419712UL, 2097979392UL, 1175368960UL, 470795264UL, 102223104UL, 2936832UL,
+4278826752UL, 4278428160UL, 4278293760UL, 3573779456UL, 2349043968UL, 1543741184UL,
+ 872854528UL, 201570048UL, 968448UL, 4278234368UL, 4278230272UL, 4278227968UL,
+3741355264UL, 2634060032UL, 1996526080UL, 1308663040UL, 553692928UL, 43520UL,
+4294906637UL, 4294902546UL, 2902392851UL, 16713236UL, 16720653UL, 16743425UL,
+ 167751682UL, 167756800UL, 16238336UL, 4294909450UL, 4294904077UL, 3405713677UL,
+ 352263180UL, 117394432UL, 16745472UL, 16754688UL, 16761344UL, 15188480UL,
+4291245826UL, 4292293378UL, 4092082434UL, 1593654278UL, 486495232UL, 15889408UL,
+ 14718208UL, 14201856UL, 13421056UL, 4284955648UL, 4285940736UL, 4286662144UL,
+2508150272UL, 1317690880UL, 160591104UL, 10062336UL, 10267904UL, 9821440UL,
+4282009088UL, 4281879552UL, 4282470145UL, 2454344704UL, 1246386688UL, 726557696UL,
+ 21988608UL, 22518272UL, 6209536UL, 4280509952UL, 4280181248UL, 4280180992UL,
+3609290496UL, 1763929088UL, 791568640UL, 120356608UL, 3970048UL, 4896512UL,
+4279532544UL, 4279203072UL, 4279004160UL, 3608111616UL, 2131652352UL, 1091662848UL,
+ 370244864UL, 18585856UL, 3253248UL, 4278684928UL, 4278484224UL, 4278416384UL,
+3674631424UL, 2298767872UL, 1443131648UL, 872840448UL, 151224576UL, 1281280UL,
+4278225920UL, 4278223360UL, 4278221312UL, 3892343808UL, 2533388544UL, 1862298880UL,
+1325428992UL, 637567488UL, 33280UL, 4294906885UL, 4294902539UL, 4261347341UL,
+ 989790221UL, 16717321UL, 16720901UL, 167730946UL, 201292800UL, 16746240UL,
+4294908930UL, 4294906115UL, 4294904838UL, 1526664966UL, 201271040UL, 16725504UL,
+ 16736768UL, 16742912UL, 16416512UL, 4291239424UL, 4292679424UL, 4075297024UL,
+2281186048UL, 536815360UL, 33502976UL, 15751680UL, 15168512UL, 14385664UL,
+4285539072UL, 4286391296UL, 4287047168UL, 2375100672UL, 1067462400UL, 212153856UL,
+ 10637824UL, 10973696UL, 11505408UL, 4282264320UL, 4282263808UL, 4282656512UL,
+2723229184UL, 1414804480UL, 777665536UL, 107104768UL, 7432704UL, 7640320UL,
+4280561408UL, 4280235008UL, 4280364800UL, 3257348352UL, 1546532352UL, 791624192UL,
+ 372457728UL, 20866816UL, 4623616UL, 4279454208UL, 4279191296UL, 4279321600UL,
+3658760704UL, 2215855104UL, 1008154880UL, 387399168UL, 18964224UL, 3373312UL,
+4278672896UL, 4278473728UL, 4278604032UL, 3741797888UL, 2349288448UL, 1309231616UL,
+ 856248064UL, 117854464UL, 1532928UL, 4278215168UL, 4278214400UL, 4278212864UL,
+3942668032UL, 2634045184UL, 1627410944UL, 1224756224UL, 687888128UL, 23552UL,
+4294907392UL, 4294903556UL, 4294901766UL, 2516516870UL, 335479049UL, 67048964UL,
+ 117383426UL, 167723520UL, 16734464UL, 4294906624UL, 4294904576UL, 4294904832UL,
+2650737664UL, 603918080UL, 16718080UL, 16722176UL, 16730368UL, 16732672UL,
+4291760384UL, 4292677120UL, 4125756160UL, 2599751168UL, 939463424UL, 33494784UL,
+ 16722688UL, 15942144UL, 15225088UL, 4286386944UL, 4286516736UL, 4286909952UL,
+2442597120UL, 1286018816UL, 330307072UL, 11806208UL, 11812608UL, 12408320UL,
+4282849024UL, 4282848768UL, 4283307520UL, 2690062080UL, 1415452928UL, 661200640UL,
+ 107946752UL, 8141312UL, 8869632UL, 4280687616UL, 4280490752UL, 4281014784UL,
+2754682368UL, 1580473088UL, 825629440UL, 423239424UL, 21771776UL, 5724416UL,
+4279508224UL, 4279312640UL, 4279443712UL, 3356892928UL, 1997938432UL, 974593024UL,
+ 370547712UL, 237252864UL, 2906624UL, 4278793728UL, 4278464768UL, 4278595328UL,
+3741921024UL, 2399875328UL, 1376465664UL, 722217216UL, 151725568UL, 1787392UL,
+4278205440UL, 4278204928UL, 4278204672UL, 3976214784UL, 2634037760UL, 1577072896UL,
+ 973091072UL, 654324480UL, 14592UL, 4294904576UL, 4294904064UL, 4294901764UL,
+3640591362UL, 1610550017UL, 520031744UL, 134156032UL, 117379328UL, 16721664UL,
+4294903552UL, 4294902016UL, 4294901760UL, 3053387776UL, 1258225920UL, 117375744UL,
+ 16716544UL, 16718592UL, 16721408UL, 4292281856UL, 4292871168UL, 4159112192UL,
+2867659776UL, 1509884928UL, 385811968UL, 16716032UL, 16718592UL, 16065536UL,
+4287170048UL, 4287366656UL, 4287890944UL, 2493318912UL, 1588004608UL, 834079744UL,
+ 62916352UL, 12719872UL, 13116416UL, 4283369728UL, 4283303424UL, 4283565568UL,
+2623144960UL, 1331627776UL, 963776000UL, 326700032UL, 8655616UL, 9708544UL,
+4281208064UL, 4281207808UL, 4281601536UL, 2822311424UL, 1597770752UL, 876547072UL,
+ 507973888UL, 22286080UL, 6563584UL, 4279504384UL, 4279505152UL, 4028174080UL,
+2719747840UL, 1629425408UL, 1042484992UL, 522652672UL, 237702912UL, 4137984UL,
+4278783744UL, 4278588160UL, 4278652416UL, 3439791872UL, 2131300096UL, 1275793664UL,
+ 688656128UL, 185273856UL, 1453568UL, 4278197248UL, 4278196992UL, 4278196480UL,
+4026538240UL, 2684361472UL, 1627397120UL, 973085440UL, 503322368UL, 7936UL,
+4294901760UL, 4294901760UL, 4294901760UL, 4211015680UL, 2768175104UL, 1375666176UL,
+ 620691456UL, 201261056UL, 16711680UL, 4294901760UL, 4294901760UL, 4294901760UL,
+3305046016UL, 1996423168UL, 872349696UL, 268369920UL, 16711680UL, 16711680UL,
+4292476928UL, 4292476928UL, 3857121280UL, 2917597184UL, 2012151808UL, 1207435264UL,
+ 351993856UL, 16580608UL, 16580608UL, 4287758336UL, 4287692800UL, 4288479232UL,
+2460745728UL, 1840185344UL, 1387593728UL, 667025408UL, 63569920UL, 13565952UL,
+4284219392UL, 4284088320UL, 4284743680UL, 3077636096UL, 1551171584UL, 1316552704UL,
+ 880934912UL, 244121600UL, 9764864UL, 4281597952UL, 4281532416UL, 4282253312UL,
+2688679936UL, 1682178048UL, 877002752UL, 793837568UL, 391708672UL, 6684672UL,
+4279828480UL, 4279435264UL, 4280156160UL, 2636055552UL, 1646658560UL, 1042678016UL,
+ 472580096UL, 456720384UL, 4325376UL, 4278779904UL, 4278321152UL, 4278452224UL,
+3674800128UL, 1628112384UL, 1175389696UL, 638780416UL, 286720000UL, 2359296UL,
+4278190080UL, 4278190080UL, 4278190080UL, 3288334336UL, 2298478592UL, 1509949440UL,
+ 822083584UL, 369098752UL, 0UL,
+};
+
+// 600x600x1, CMY - Plain Normal, Color Pen Only
+
+uint32_t ulMapDJ3320_CMY_6x6x1[ 9 * 9 * 9 ] =
+{
+4294967040UL, 2969566976UL, 1492844288UL, 886243072UL, 583073536UL, 347143936UL,
+ 178716416UL, 44367616UL, 11075328UL, 4292280064UL, 3166895872UL, 1455881984UL,
+ 785055488UL, 482148096UL, 280035072UL, 111607552UL, 11075328UL, 10551040UL,
+4285464320UL, 4285857536UL, 1717501696UL, 812973824UL, 344391424UL, 110034688UL,
+ 43974400UL, 9895680UL, 9895680UL, 4282449664UL, 4282449664UL, 3896704768UL,
+1279065856UL, 541261568UL, 207814400UL, 107544320UL, 6881024UL, 7143168UL,
+4281006592UL, 4280745728UL, 4280745728UL, 2687041280UL, 1110638336UL, 439418624UL,
+ 171769600UL, 72023808UL, 5570304UL, 4279691776UL, 4279566080UL, 4279172864UL,
+3759210240UL, 1780023040UL, 673251072UL, 270466816UL, 103481088UL, 3997440UL,
+4278902272UL, 4278775296UL, 4278517504UL, 3859218176UL, 2148073216UL, 1074593536UL,
+ 370343680UL, 169148160UL, 2424576UL, 4278507520UL, 4278378496UL, 4278382080UL,
+3926058496UL, 2550329344UL, 1476722432UL, 671416064UL, 168492800UL, 1113856UL,
+4278247424UL, 4278246912UL, 4278246400UL, 4026587136UL, 2885737472UL, 1811998208UL,
+1107359744UL, 503381760UL, 65280UL, 4294959616UL, 2634007552UL, 1325399808UL,
+ 620756736UL, 218103552UL, 82378496UL, 14352128UL, 13434624UL, 12779264UL,
+4291092480UL, 4294967040UL, 2499477248UL, 988872448UL, 316079872UL, 80019200UL,
+ 12386048UL, 11599616UL, 10682112UL, 4285464320UL, 4286119680UL, 2929524480UL,
+1318518528UL, 546504448UL, 177274624UL, 9240320UL, 9240320UL, 9502464UL,
+4282447360UL, 4282056448UL, 4064870144UL, 1716846336UL, 777715456UL, 274661120UL,
+ 39911168UL, 6618880UL, 7012096UL, 4280872448UL, 4280352512UL, 4280483584UL,
+2351628032UL, 1144192768UL, 439549696UL, 138215168UL, 4652800UL, 5177088UL,
+4279689216UL, 4279037440UL, 4279169024UL, 3121807104UL, 1578434304UL, 706543360UL,
+ 270597888UL, 36241152UL, 3473152UL, 4278768640UL, 4278376448UL, 4278507008UL,
+3255229440UL, 1946610176UL, 1007351808UL, 437189632UL, 135331584UL, 2031360UL,
+4278373888UL, 4278237696UL, 4278237696UL, 3321937920UL, 2147534848UL, 1342230528UL,
+ 637720576UL, 201646080UL, 720640UL, 4278242816UL, 4278237184UL, 4278237696UL,
+3623926272UL, 2550184960UL, 1644216832UL, 973131264UL, 402707968UL, 56832UL,
+4294931968UL, 3573511168UL, 1224696832UL, 452972544UL, 83885824UL, 83885824UL,
+ 48955136UL, 13696768UL, 12779264UL, 4294934016UL, 4294944768UL, 2499783168UL,
+ 922736128UL, 184549120UL, 14483200UL, 13041408UL, 12123904UL, 11075328UL,
+4284773376UL, 4287800320UL, 2963450880UL, 1788658176UL, 546629120UL, 109641472UL,
+ 8716032UL, 8716032UL, 8584960UL, 4282427904UL, 4282564096UL, 4132490240UL,
+1952757760UL, 777964032UL, 274652160UL, 39905792UL, 6881024UL, 7274240UL,
+4280729600UL, 4280470016UL, 4280473600UL, 2385168384UL, 1077071872UL, 406246400UL,
+ 104649728UL, 4644352UL, 5307392UL, 4279549952UL, 4279158272UL, 4279156736UL,
+2786245120UL, 1444464128UL, 639420928UL, 237161984UL, 36361216UL, 3595264UL,
+4278763008UL, 4278500352UL, 4278366208UL, 2919671808UL, 1778955264UL, 906674176UL,
+ 403489280UL, 135581184UL, 2149888UL, 4278369280UL, 4278233088UL, 4227898880UL,
+3019939328UL, 1979753472UL, 1275244032UL, 637711360UL, 201635840UL, 838144UL,
+4278237184UL, 4278232576UL, 4093680640UL, 3187710976UL, 2214632960UL, 1509990400UL,
+ 906012672UL, 369142784UL, 43008UL, 4294918656UL, 4294917632UL, 1224684032UL,
+ 419378176UL, 150964736UL, 117426176UL, 82235392UL, 47505408UL, 13037568UL,
+4294920192UL, 4294919168UL, 2231324160UL, 855597056UL, 184519168UL, 15643136UL,
+ 14077440UL, 12770816UL, 11726848UL, 4287646720UL, 4289745920UL, 2863558656UL,
+1790342144UL, 581991936UL, 44340736UL, 10400768UL, 9881600UL, 9888768UL,
+4282140672UL, 4282536448UL, 3730992640UL, 1851942400UL, 1147432960UL, 241209344UL,
+ 39888896UL, 6864896UL, 6872576UL, 4280577536UL, 4280448000UL, 4280975872UL,
+2519758336UL, 1211919360UL, 440172544UL, 105026048UL, 4894208UL, 5687808UL,
+4279667712UL, 4279406592UL, 4279534592UL, 2887025152UL, 1444707840UL, 639665152UL,
+ 203723264UL, 36610048UL, 3847168UL, 4278884352UL, 4278620672UL, 4278617088UL,
+2819127808UL, 1644854272UL, 906789888UL, 403736576UL, 102274048UL, 2400256UL,
+4278361088UL, 4278224896UL, 4278222848UL, 2818733568UL, 1812231680UL, 1208253440UL,
+ 604275712UL, 201754624UL, 1085952UL, 4278228992UL, 4278225408UL, 4160782848UL,
+2818603520UL, 1979742720UL, 1476425216UL, 939556352UL, 402686976UL, 33280UL,
+4294912512UL, 4294910976UL, 2365529600UL, 251597824UL, 150939648UL, 184508416UL,
+ 116685312UL, 48140800UL, 13674496UL, 4294323712UL, 4294910976UL, 2935956992UL,
+ 822029312UL, 184497664UL, 16735232UL, 14711296UL, 13275648UL, 12494848UL,
+4289342464UL, 4290783232UL, 3502254080UL, 1456092672UL, 549732352UL, 45635072UL,
+ 11562496UL, 11045376UL, 10790912UL, 4282919424UL, 4283837440UL, 4033360384UL,
+1751663616UL, 1148078080UL, 309219840UL, 7365120UL, 7633408UL, 7775232UL,
+4280430080UL, 4280431616UL, 4281351680UL, 2285650432UL, 1212170752UL, 641878528UL,
+ 105144320UL, 38564864UL, 5412864UL, 4279388672UL, 4279390720UL, 4279652352UL,
+3021754368UL, 1512066560UL, 774261760UL, 237656576UL, 3304960UL, 4230656UL,
+4278740480UL, 4278739968UL, 4278868992UL, 3020707840UL, 1712216064UL, 907171328UL,
+ 403987456UL, 68971520UL, 2653696UL, 4278349312UL, 4278217216UL, 4278346752UL,
+2953075712UL, 1812224000UL, 1174689792UL, 637951488UL, 201876480UL, 1338368UL,
+4278219776UL, 4278218240UL, 4227885568UL, 2986370048UL, 1845518336UL, 1409309696UL,
+ 973102080UL, 436233216UL, 25600UL, 4294908416UL, 4294906880UL, 3573485568UL,
+ 788466176UL, 184488960UL, 184492032UL, 83836928UL, 48912896UL, 14446080UL,
+4293793792UL, 4294904320UL, 3539931136UL, 1258229760UL, 150935040UL, 16721408UL,
+ 15353344UL, 13523968UL, 13134848UL, 4289206272UL, 4290383872UL, 3737260032UL,
+1656754688UL, 517348352UL, 46671872UL, 12207104UL, 11819520UL, 11561472UL,
+4283701248UL, 4284880896UL, 3932953088UL, 1853103104UL, 913974272UL, 276703744UL,
+ 8141824UL, 8541184UL, 8809984UL, 4280556032UL, 4281212928UL, 3996917760UL,
+2084839936UL, 977677312UL, 709504000UL, 206452736UL, 5656064UL, 6187520UL,
+4279376896UL, 4279510016UL, 4279903744UL, 2988582912UL, 1478896128UL, 707274752UL,
+ 405417984UL, 36850176UL, 4221440UL, 4278859264UL, 4278860288UL, 4278989824UL,
+3121493504UL, 1779578368UL, 840314368UL, 437793280UL, 102778368UL, 2908160UL,
+4278471168UL, 4278339072UL, 4278469632UL, 3053732352UL, 1845903360UL, 1107704320UL,
+ 638073856UL, 201998848UL, 1462784UL, 4278211584UL, 4278211072UL, 4227878400UL,
+3087026688UL, 1946175488UL, 1207976960UL, 905986048UL, 469779968UL, 18944UL,
+4294904832UL, 4294903808UL, 4177463296UL, 1761544192UL, 520030208UL, 117378560UL,
+ 117380096UL, 83832320UL, 15091200UL, 4293135360UL, 4294903296UL, 3640591360UL,
+1828652032UL, 419366400UL, 16716288UL, 16523264UL, 14037504UL, 13517824UL,
+4289465344UL, 4289988608UL, 3736469504UL, 1925187072UL, 684591616UL, 80744960UL,
+ 12853760UL, 12071424UL, 11944448UL, 4284484608UL, 4285008384UL, 3765176320UL,
+1953892352UL, 1014894592UL, 344462336UL, 8788992UL, 9056256UL, 9716736UL,
+4281208320UL, 4281995264UL, 3728871424UL, 2118651904UL, 1112412160UL, 575936512UL,
+ 173415424UL, 6040576UL, 6964224UL, 4279373824UL, 4280030720UL, 4280292352UL,
+2217088000UL, 1244403200UL, 573185024UL, 405806080UL, 104475136UL, 4604928UL,
+4278850048UL, 4278983680UL, 4279114240UL, 3121748480UL, 1813256704UL, 873994752UL,
+ 404101120UL, 270541824UL, 2769408UL, 4278461440UL, 4278461952UL, 4278461440UL,
+3087410176UL, 1913005568UL, 1141384192UL, 537665536UL, 235807232UL, 1587712UL,
+4278202368UL, 4278202368UL, 4026544128UL, 3053465600UL, 1946169344UL, 1207971840UL,
+ 704653824UL, 469772800UL, 12288UL, 4294706176UL, 4294902272UL, 3875472384UL,
+2197750784UL, 1124008960UL, 352257024UL, 117376512UL, 50268672UL, 16720384UL,
+4292609024UL, 4293525504UL, 3605659648UL, 2096365568UL, 989790208UL, 218038784UL,
+ 15993856UL, 15078912UL, 14163968UL, 4289594368UL, 4289724928UL, 3467771904UL,
+2092433408UL, 1187381760UL, 315228672UL, 12848128UL, 12588032UL, 12197888UL,
+4285531648UL, 4285400064UL, 3631350784UL, 2054553600UL, 1283458048UL, 612894208UL,
+ 110233600UL, 9310720UL, 9838592UL, 4282386432UL, 4282122752UL, 3594650112UL,
+2118647808UL, 1145962496UL, 710411776UL, 274729472UL, 6557696UL, 7217664UL,
+4280027648UL, 4280420864UL, 3324380672UL, 2116683776UL, 1244661248UL, 607127040UL,
+ 372771840UL, 104861696UL, 4989952UL, 4278979584UL, 4279110656UL, 4279372800UL,
+2887125504UL, 1343753216UL, 706481152UL, 303697408UL, 237113344UL, 2892288UL,
+4278454784UL, 4278455808UL, 4278586880UL, 2986741248UL, 1913130496UL, 1141509632UL,
+ 537660928UL, 201984512UL, 1449984UL, 4278195712UL, 4278195712UL, 4093646336UL,
+3019905024UL, 1946163200UL, 1207966208UL, 637540352UL, 335549952UL, 7680UL,
+4294901760UL, 4294901760UL, 4244111360UL, 3036413952UL, 1862205440UL, 1056899072UL,
+ 520028160UL, 218038272UL, 16711680UL, 4292608000UL, 4291690496UL, 3603824640UL,
+2396258304UL, 1524498432UL, 719716352UL, 283770880UL, 49152000UL, 15597568UL,
+4289462272UL, 4289069056UL, 3400007680UL, 2225995776UL, 1555300352UL, 918028288UL,
+ 314179584UL, 12451840UL, 12582912UL, 4285792256UL, 4285530112UL, 3497394176UL,
+2088370176UL, 1551892480UL, 1082392576UL, 478806016UL, 76808192UL, 9961472UL,
+4283039744UL, 4282908672UL, 3595436032UL, 2287206400UL, 1246887936UL, 1012531200UL,
+ 643956736UL, 174587904UL, 7208960UL, 4280942592UL, 4280811520UL, 3459252224UL,
+2083913728UL, 1379139584UL, 708050944UL, 607911936UL, 239468544UL, 5111808UL,
+4279631872UL, 4279369728UL, 3726114816UL, 2250244096UL, 1310457856UL, 706609152UL,
+ 270532608UL, 270925824UL, 3014656UL, 4278714368UL, 4278452224UL, 4278452224UL,
+2819227648UL, 1678639104UL, 738984448UL, 336331776UL, 68157440UL, 1835008UL,
+4278190080UL, 4278190080UL, 3456106496UL, 2483027968UL, 1744830464UL, 1174405120UL,
+ 637534208UL, 268435456UL, 0UL,
+};
+
+// 600x600x1, KCMY - Plain Normal, Both Pens
+
+uint32_t ulMapDJ3320_KCMY_6x6x1[ 9 * 9 * 9 ] =
+{
+1413633791UL, 77528918UL, 78053164UL, 44105496UL, 44105488UL, 43974410UL,
+ 43974404UL, 10682114UL, 11075328UL, 4279697248UL, 303628118UL, 108461864UL,
+ 43974422UL, 44105486UL, 44105480UL, 10551044UL, 11075328UL, 10551040UL,
+4279821356UL, 4161863474UL, 302710570UL, 71892758UL, 41090826UL, 9109250UL,
+ 10419970UL, 9895680UL, 9895680UL, 4279821844UL, 4279303960UL, 2919825182UL,
+ 403373850UL, 69664526UL, 140443394UL, 107544320UL, 6881024UL, 7143168UL,
+4279690762UL, 4279435018UL, 4278648592UL, 2114387730UL, 504299282UL, 136249098UL,
+ 171769600UL, 72023808UL, 5570304UL, 4279559682UL, 4279435010UL, 4278779652UL,
+3590782726UL, 1577910022UL, 504692486UL, 270466816UL, 103481088UL, 3997440UL,
+4278902272UL, 4278775296UL, 4278517504UL, 3859218176UL, 2148073216UL, 1074593536UL,
+ 370343680UL, 169148160UL, 2424576UL, 4278507520UL, 4278378496UL, 4278382080UL,
+3926058496UL, 2550329344UL, 1476722432UL, 671416064UL, 168492800UL, 1113856UL,
+4278247424UL, 4278246912UL, 4278246400UL, 4026587136UL, 2885737472UL, 1811998208UL,
+1107359744UL, 503381760UL, 65280UL, 4294907494UL, 218051656UL, 83885862UL,
+ 50331410UL, 50331398UL, 15007490UL, 14352128UL, 13434624UL, 12779264UL,
+4281486922UL, 1514822238UL, 680450102UL, 214236950UL, 80281352UL, 12648194UL,
+ 12386048UL, 11599616UL, 10682112UL, 4280333352UL, 4280338476UL, 1110491190UL,
+ 543751960UL, 310705928UL, 177274624UL, 9240320UL, 9240320UL, 9502464UL,
+4280078356UL, 4279692818UL, 3222732568UL, 807337756UL, 373489420UL, 274661120UL,
+ 39911168UL, 6618880UL, 7012096UL, 4279819784UL, 4279563270UL, 4279566088UL,
+1947401996UL, 706412302UL, 338493188UL, 138215168UL, 4652800UL, 5177088UL,
+4279557634UL, 4279037440UL, 4279169024UL, 3121807104UL, 1578434304UL, 706543360UL,
+ 270597888UL, 36241152UL, 3473152UL, 4278768640UL, 4278376448UL, 4278507008UL,
+3255229440UL, 1946610176UL, 1007351808UL, 437189632UL, 135331584UL, 2031360UL,
+4278373888UL, 4278237696UL, 4278237696UL, 3321937920UL, 2147534848UL, 1342230528UL,
+ 637720576UL, 201646080UL, 720640UL, 4278242816UL, 4278237184UL, 4278237696UL,
+3623926272UL, 2550184960UL, 1644216832UL, 973131264UL, 402707968UL, 56832UL,
+4294906418UL, 1862209076UL, 150938144UL, 50313228UL, 16776962UL, 16776962UL,
+ 48955136UL, 13696768UL, 12779264UL, 4289471022UL, 2829594174UL, 785400884UL,
+ 352302608UL, 184549120UL, 14483200UL, 13041408UL, 12123904UL, 11075328UL,
+4281746456UL, 4283062820UL, 1717068326UL, 1182178834UL, 546629120UL, 109641472UL,
+ 8716032UL, 8716032UL, 8584960UL, 4280848908UL, 4280853518UL, 3492455956UL,
+1413781008UL, 744278018UL, 274652160UL, 39905792UL, 6881024UL, 7274240UL,
+4280466434UL, 4280206850UL, 4280210434UL, 2351482370UL, 1009700354UL, 406246400UL,
+ 104649728UL, 4644352UL, 5307392UL, 4279549952UL, 4279158272UL, 4279156736UL,
+2786245120UL, 1444464128UL, 639420928UL, 237161984UL, 36361216UL, 3595264UL,
+4278763008UL, 4278500352UL, 4278366208UL, 2919671808UL, 1778955264UL, 906674176UL,
+ 403489280UL, 135581184UL, 2149888UL, 4278369280UL, 4278233088UL, 4227898880UL,
+3019939328UL, 1979753472UL, 1275244032UL, 637711360UL, 201635840UL, 838144UL,
+4278237184UL, 4278232576UL, 4093680640UL, 3187710976UL, 2214632960UL, 1509990400UL,
+ 906012672UL, 369142784UL, 43008UL, 4294906392UL, 4294904346UL, 520029718UL,
+ 50273804UL, 16745476UL, 117426176UL, 82235392UL, 47505408UL, 13037568UL,
+4292090392UL, 4294905882UL, 1392450074UL, 318717968UL, 184519168UL, 15643136UL,
+ 14077440UL, 12770816UL, 11726848UL, 4285672976UL, 4286982678UL, 2156152342UL,
+1217679890UL, 581991936UL, 44340736UL, 10400768UL, 9881600UL, 9888768UL,
+4282009090UL, 4282273282UL, 3259520014UL, 1851942400UL, 1147432960UL, 241209344UL,
+ 39888896UL, 6864896UL, 6872576UL, 4280577536UL, 4280448000UL, 4280975872UL,
+2519758336UL, 1211919360UL, 440172544UL, 105026048UL, 4894208UL, 5687808UL,
+4279667712UL, 4279406592UL, 4279534592UL, 2887025152UL, 1444707840UL, 639665152UL,
+ 203723264UL, 36610048UL, 3847168UL, 4278884352UL, 4278620672UL, 4278617088UL,
+2819127808UL, 1644854272UL, 906789888UL, 403736576UL, 102274048UL, 2400256UL,
+4278361088UL, 4278224896UL, 4278222848UL, 2818733568UL, 1812231680UL, 1208253440UL,
+ 604275712UL, 201754624UL, 1085952UL, 4278228992UL, 4278225408UL, 4160782848UL,
+2818603520UL, 1979742720UL, 1476425216UL, 939556352UL, 402686976UL, 33280UL,
+4294905868UL, 4294903822UL, 1929315342UL, 50268166UL, 117384706UL, 184508416UL,
+ 116685312UL, 48140800UL, 13674496UL, 4292876300UL, 4294905866UL, 2566852620UL,
+ 553589258UL, 184497664UL, 16735232UL, 14711296UL, 13275648UL, 12494848UL,
+4288947716UL, 4290520066UL, 3468699650UL, 1355034628UL, 549732352UL, 45635072UL,
+ 11562496UL, 11045376UL, 10790912UL, 4282919424UL, 4283837440UL, 4033360384UL,
+1751663616UL, 1148078080UL, 309219840UL, 7365120UL, 7633408UL, 7775232UL,
+4280430080UL, 4280431616UL, 4281351680UL, 2285650432UL, 1212170752UL, 641878528UL,
+ 105144320UL, 38564864UL, 5412864UL, 4279388672UL, 4279390720UL, 4279652352UL,
+3021754368UL, 1512066560UL, 774261760UL, 237656576UL, 3304960UL, 4230656UL,
+4278740480UL, 4278739968UL, 4278868992UL, 3020707840UL, 1712216064UL, 907171328UL,
+ 403987456UL, 68971520UL, 2653696UL, 4278349312UL, 4278217216UL, 4278346752UL,
+2953075712UL, 1812224000UL, 1174689792UL, 637951488UL, 201876480UL, 1338368UL,
+4278219776UL, 4278218240UL, 4227885568UL, 2986370048UL, 1845518336UL, 1409309696UL,
+ 973102080UL, 436233216UL, 25600UL, 4294905860UL, 4294904326UL, 3372155910UL,
+ 754911234UL, 184488960UL, 184492032UL, 83836928UL, 48912896UL, 14446080UL,
+4293530626UL, 4294904322UL, 3472820740UL, 1258229760UL, 150935040UL, 16721408UL,
+ 15353344UL, 13523968UL, 13134848UL, 4289206272UL, 4290383872UL, 3737260032UL,
+1656754688UL, 517348352UL, 46671872UL, 12207104UL, 11819520UL, 11561472UL,
+4283701248UL, 4284880896UL, 3932953088UL, 1853103104UL, 913974272UL, 276703744UL,
+ 8141824UL, 8541184UL, 8809984UL, 4280556032UL, 4281212928UL, 3996917760UL,
+2084839936UL, 977677312UL, 709504000UL, 206452736UL, 5656064UL, 6187520UL,
+4279376896UL, 4279510016UL, 4279903744UL, 2988582912UL, 1478896128UL, 707274752UL,
+ 405417984UL, 36850176UL, 4221440UL, 4278859264UL, 4278860288UL, 4278989824UL,
+3121493504UL, 1779578368UL, 840314368UL, 437793280UL, 102778368UL, 2908160UL,
+4278471168UL, 4278339072UL, 4278469632UL, 3053732352UL, 1845903360UL, 1107704320UL,
+ 638073856UL, 201998848UL, 1462784UL, 4278211584UL, 4278211072UL, 4227878400UL,
+3087026688UL, 1946175488UL, 1207976960UL, 905986048UL, 469779968UL, 18944UL,
+4294904832UL, 4294903808UL, 4177463298UL, 1761544192UL, 520030208UL, 117378560UL,
+ 117380096UL, 83832320UL, 15091200UL, 4293135360UL, 4294903296UL, 3640591360UL,
+1828652032UL, 419366400UL, 16716288UL, 16523264UL, 14037504UL, 13517824UL,
+4289465344UL, 4289988608UL, 3736469504UL, 1925187072UL, 684591616UL, 80744960UL,
+ 12853760UL, 12071424UL, 11944448UL, 4284484608UL, 4285008384UL, 3765176320UL,
+1953892352UL, 1014894592UL, 344462336UL, 8788992UL, 9056256UL, 9716736UL,
+4281208320UL, 4281995264UL, 3728871424UL, 2118651904UL, 1112412160UL, 575936512UL,
+ 173415424UL, 6040576UL, 6964224UL, 4279373824UL, 4279899650UL, 4280292352UL,
+2217088000UL, 1244403200UL, 573185024UL, 405806080UL, 104475136UL, 4604928UL,
+4278850048UL, 4278983680UL, 4279114240UL, 3121748480UL, 1813256704UL, 873994752UL,
+ 404101120UL, 270541824UL, 2769408UL, 4278461440UL, 4278461952UL, 4278461440UL,
+3087410176UL, 1913005568UL, 1141384192UL, 537665536UL, 235807232UL, 1587712UL,
+4278202368UL, 4278202368UL, 4026544128UL, 3053465600UL, 1946169344UL, 1207971840UL,
+ 704653824UL, 469772800UL, 12288UL, 4294706176UL, 4294902272UL, 3875472384UL,
+2197750784UL, 1124008960UL, 352257024UL, 117376512UL, 50268672UL, 16720384UL,
+4292609024UL, 4293525504UL, 3605659648UL, 2096365568UL, 989790208UL, 218038784UL,
+ 15993856UL, 15078912UL, 14163968UL, 4289594368UL, 4289724928UL, 3467771904UL,
+2092433408UL, 1187381760UL, 315228672UL, 12848128UL, 12588032UL, 12197888UL,
+4285531648UL, 4285400064UL, 3631350784UL, 2054553600UL, 1283458048UL, 612894208UL,
+ 110233600UL, 9310720UL, 9838592UL, 4282386432UL, 4282122752UL, 3594650112UL,
+2118647808UL, 1145962496UL, 710411776UL, 274729472UL, 6557696UL, 7217664UL,
+4280027648UL, 4280420864UL, 3324380672UL, 2116683776UL, 1244661248UL, 607127040UL,
+ 372771840UL, 104861696UL, 4989952UL, 4278979584UL, 4279110656UL, 4279372800UL,
+2887125504UL, 1343753216UL, 706481152UL, 303697408UL, 237113344UL, 2892288UL,
+4278454784UL, 4278455808UL, 4278586880UL, 2986741248UL, 1913130496UL, 1141509632UL,
+ 537660928UL, 201984512UL, 1449984UL, 4278195712UL, 4278195712UL, 4093646336UL,
+3019905024UL, 1946163200UL, 1207966208UL, 637540352UL, 335549952UL, 7680UL,
+4294901760UL, 4294901760UL, 4244111360UL, 3036413952UL, 1862205440UL, 1056899072UL,
+ 520028160UL, 218038272UL, 16711680UL, 4292608000UL, 4291690496UL, 3603824640UL,
+2396258304UL, 1524498432UL, 719716352UL, 283770880UL, 49152000UL, 15597568UL,
+4289462272UL, 4289069056UL, 3400007680UL, 2225995776UL, 1555300352UL, 918028288UL,
+ 314179584UL, 12451840UL, 12582912UL, 4285792256UL, 4285530112UL, 3497394176UL,
+2088370176UL, 1551892480UL, 1082392576UL, 478806016UL, 76808192UL, 9961472UL,
+4283039744UL, 4282908672UL, 3595436032UL, 2287206400UL, 1246887936UL, 1012531200UL,
+ 643956736UL, 174587904UL, 7208960UL, 4280942592UL, 4280811520UL, 3459252224UL,
+2083913728UL, 1379139584UL, 708050944UL, 607911936UL, 239468544UL, 5111808UL,
+4279631872UL, 4279369728UL, 3726114816UL, 2250244096UL, 1310457856UL, 706609152UL,
+ 270532608UL, 270925824UL, 3014656UL, 4278714368UL, 4278452224UL, 4278452224UL,
+2819227648UL, 1678639104UL, 738984448UL, 336331776UL, 68157440UL, 1835008UL,
+4278190080UL, 4278190080UL, 3456106496UL, 2483027968UL, 1744830464UL, 1174405120UL,
+ 637534208UL, 268435456UL, 0UL,
+};
+
+APDK_END_NAMESPACE
+
+#endif
diff --git a/prnt/hpijs/dj350.cpp b/prnt/hpijs/dj350.cpp
new file mode 100644
index 0000000..4f1a75e
--- /dev/null
+++ b/prnt/hpijs/dj350.cpp
@@ -0,0 +1,133 @@
+/*****************************************************************************\
+ dj350.cpp : Implimentation for the DJ350 class
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#ifdef APDK_DJ350
+
+#include "header.h"
+#include "dj6xx.h"
+#include "dj600.h"
+#include "dj350.h"
+#include "printerproxy.h"
+
+APDK_BEGIN_NAMESPACE
+
+extern uint32_t ulMapDJ600_CCM_CMY[ 9 * 9 * 9 ];
+extern uint32_t ulMapDJ600_CCM_K[ 9 * 9 * 9 ];
+
+DJ350::DJ350(SystemServices* pSS, int numfonts, BOOL proto)
+ : DJ600 (pSS, proto)
+{
+ CMYMap = ulMapDJ600_CCM_CMY;
+// pMode[SPECIALMODE_INDEX] = new Mode350KPhoto (ulMapDJ600_CCM_K);
+// pMode[SPECIALMODE_INDEX] = new Mode350CPhoto (CMYMap);
+
+#ifdef APDK_EXTENDED_MEDIASIZE
+ ModeCount = 5;
+#else
+ ModeCount = 2;
+#endif
+
+ DBG1("DJ350 created\n");
+}
+
+#if 0
+Mode350KPhoto::Mode350KPhoto (uint32_t *map)
+ : PrintMode (map)
+{
+ theQuality = qualityPresentation;
+ dyeCount = 1;
+ BaseResX = 600;
+ BaseResY = 600;
+ ResolutionX[0] = 600;
+ ResolutionY[0] = 600;
+ CompatiblePens[0] = BLACK_PEN;
+// medium = mediaGlossy;
+ MixedRes = FALSE;
+// strcpy (ModeName, "BlackBest");
+}
+
+Mode350CPhoto::Mode350CPhoto (uint32_t *map)
+ : PrintMode (map)
+{
+ theQuality = qualityPresentation;
+ dyeCount = 3;
+
+ CompatiblePens[0] = COLOR_PEN; // only thing allowed
+// MixedRes = TRUE;
+ medium = mediaSpecial;
+
+// strcpy(ModeName, "ColorPhoto");
+}
+#endif
+
+Header350::Header350 (Printer *p, PrintContext* pc) : Header (p, pc)
+{ }
+
+DRIVER_ERROR Header350::Send ()
+{
+ DRIVER_ERROR err;
+
+ StartSend ();
+
+ if (dyeCount == 3 || ResolutionY[0] == 600) // color pen
+ {
+ err = ConfigureRasterData ();
+ ERRCHECK;
+ }
+ else // black pen
+ {
+ err = Simple (); // set color mode and resolution
+ ERRCHECK;
+ }
+
+
+ if (ResolutionY[0] == 600)
+ {
+ char uom[10];
+ sprintf(uom,"%c%c%c%d%c",ESC,'&','u',thePrintMode->ResolutionY[K],'D');
+ err=thePrinter->Send((const BYTE*)uom, 7 );
+ ERRCHECK;
+ }
+
+
+ err = Graphics(); // start raster graphics and set compression mode
+
+ return err;
+}
+
+Header* DJ350::SelectHeader (PrintContext *pc)
+{
+ return new Header350 (this, pc);
+}
+
+APDK_END_NAMESPACE
+
+#endif //APDK_DJ350
diff --git a/prnt/hpijs/dj350.h b/prnt/hpijs/dj350.h
new file mode 100644
index 0000000..9eae97a
--- /dev/null
+++ b/prnt/hpijs/dj350.h
@@ -0,0 +1,72 @@
+/*****************************************************************************\
+ dj350.h : Interface for the DJ350 class
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#ifndef DJ350_H
+#define DJ350_H
+
+APDK_BEGIN_NAMESPACE
+
+//extern char *ModelString[MAX_ID_STRING];
+
+/*!
+\internal
+*/
+class DJ350 : public DJ600 // Printer
+{
+public:
+ DJ350(SystemServices* pSS,int numfonts=0, BOOL proto=FALSE);
+
+ virtual Header* SelectHeader(PrintContext* pc);
+
+}; //DJ350
+
+#ifdef APDK_DJ350
+//! DJ350Proxy
+/*!
+******************************************************************************/
+class DJ350Proxy : public PrinterProxy
+{
+public:
+ DJ350Proxy() : PrinterProxy(
+ "DJ350", // family name
+ "DESKJET 350\0" // DeskJet 350
+#ifdef APDK_MLC_PRINTER
+#endif
+ ) {m_iPrinterType = eDJ350;}
+ inline Printer* CreatePrinter(SystemServices* pSS) const { return new DJ350(pSS); }
+ inline PRINTER_TYPE GetPrinterType() const { return eDJ350;}
+ inline unsigned int GetModelBit() const { return 0x800;}
+};
+#endif
+
+APDK_END_NAMESPACE
+
+#endif
diff --git a/prnt/hpijs/dj3600.cpp b/prnt/hpijs/dj3600.cpp
new file mode 100644
index 0000000..3667714
--- /dev/null
+++ b/prnt/hpijs/dj3600.cpp
@@ -0,0 +1,148 @@
+/*****************************************************************************\
+ dj3600.cpp : Implimentation for the DJ3600 class
+
+ Copyright (c) 2003-2003, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#if defined(APDK_DJ3600) && defined (APDK_DJ3320)
+
+#include "header.h"
+#include "dj3320.h"
+#include "dj3600.h"
+#include "printerproxy.h"
+
+APDK_BEGIN_NAMESPACE
+
+DJ3600::DJ3600 (SystemServices* pSS, BOOL proto)
+ : DJ3320 (pSS, proto)
+{
+}
+
+/*
+* byte 13 - indicates full bleed (to every edge of paper) is supported if
+* the modifier bit in the lowest position is "set".
+*
+
+* 0000b or 0h = Unimplemented, or not specified.
+* 0001b or 1h = Full bleed (4 edge) printing supported on photo quality papers; this field is a modifier upon the bits in byte 12. That is, if this bit is set, it implies that the "max print width supported" values and smaller widths, ALL support full bleed, 4 edge, printing on photo quality paper.
+* 0010b or 2h = Full bleed (4 edge) printing supported on non-photo papers (e.g. plain, bond, etc.); this field is a modifier upon the bits in byte 12. If this bit is set, it implies that the "max print width supported" values and smaller widths, all support full bleed, 4 edge, printing on non-photo paper.
+* nn00b = The "nn" bits are reserved for future definitions
+*/
+
+BOOL DJ3600::FullBleedCapable (PAPER_SIZE ps, FullbleedType *fbType, float *xOverSpray, float *yOverSpray,
+ float *fLeftOverSpray, float *fTopOverSpray)
+{
+ BYTE sDevIdStr[DevIDBuffSize];
+ char *pStr;
+ if (pSS->IOMode.bDevID && (pSS->GetDeviceID (sDevIdStr, DevIDBuffSize, FALSE)) == NO_ERROR)
+ {
+ if ((pStr = strstr ((char *) sDevIdStr, ";S:")))
+ {
+ char byte13 = pStr[18];
+ short value = (byte13 >= '0' && byte13 <= '9') ? byte13 - '0' :
+ ((byte13 >= 'A' && byte13 <= 'F') ? byte13 - 'A' + 10 :
+ ((byte13 >= 'a' && byte13 <= 'f') ? byte13 - 'a' + 10 : -1));
+ switch (ps)
+ {
+ case PHOTO_SIZE:
+ case A6:
+ case CARD_4x6:
+ case OUFUKU:
+ case HAGAKI:
+ case A6_WITH_TEAR_OFF_TAB:
+ {
+ *xOverSpray = (float) 0.216;
+ *yOverSpray = (float) 0.174;
+
+ if (fLeftOverSpray)
+ *fLeftOverSpray = (float) 0.098;
+ if (fTopOverSpray)
+ *fTopOverSpray = (float) 0.070;
+
+ if (ps == PHOTO_SIZE || ps == A6_WITH_TEAR_OFF_TAB)
+ *fbType = fullbleed4EdgeAllMedia;
+ else if ((value != -1) && ((value & 0x03) == 0x03))
+ *fbType = fullbleed4EdgeAllMedia;
+ else if ((value != -1) && ((value & 0x01) == 0x01))
+ *fbType = fullbleed4EdgePhotoMedia;
+ else if ((value != -1) && ((value & 0x02) == 0x02))
+ *fbType = fullbleed4EdgeNonPhotoMedia;
+ else
+ *fbType = fullbleed3EdgeAllMedia;
+
+ return TRUE;
+ }
+ default:
+ break;
+ }
+ }
+ }
+ else
+ {
+ switch (ps)
+ {
+ case PHOTO_SIZE:
+ case A6:
+ case CARD_4x6:
+ case OUFUKU:
+ case HAGAKI:
+ case A6_WITH_TEAR_OFF_TAB:
+ {
+ *xOverSpray = (float) 0.216;
+ *yOverSpray = (float) 0.174;
+
+ if (fLeftOverSpray)
+ *fLeftOverSpray = (float) 0.098;
+ if (fTopOverSpray)
+ *fTopOverSpray = (float) 0.070;
+
+ if (ps == PHOTO_SIZE || ps == A6_WITH_TEAR_OFF_TAB)
+ *fbType = fullbleed4EdgeAllMedia;
+ else
+ *fbType = fullbleed3EdgeAllMedia;
+
+ return TRUE;
+ }
+ default:
+ break;
+ }
+ }
+ *xOverSpray = (float) 0;
+ *yOverSpray = (float) 0;
+ if (fLeftOverSpray)
+ *fLeftOverSpray = (float) 0;
+ if (fTopOverSpray)
+ *fTopOverSpray = (float) 0;
+ *fbType = fullbleedNotSupported;
+ return FALSE;
+}
+
+
+APDK_END_NAMESPACE
+
+#endif // defined(APDK_DJ3600) && defined (APDK_DJ3320)
diff --git a/prnt/hpijs/dj3600.h b/prnt/hpijs/dj3600.h
new file mode 100644
index 0000000..cad77ea
--- /dev/null
+++ b/prnt/hpijs/dj3600.h
@@ -0,0 +1,91 @@
+/*****************************************************************************\
+ dj3600.h : Interface for the DJ3600 printer class
+
+ Copyright (c) 2003 - 2003, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#ifndef APDK_DJ3600_H
+#define APDK_DJ3600_H
+
+APDK_BEGIN_NAMESPACE
+
+//DJ3600
+//!
+/*!
+\internal
+******************************************************************************/
+class DJ3600 : public DJ3320
+{
+public:
+ DJ3600 (SystemServices* pSS, BOOL proto = FALSE);
+ virtual BOOL FullBleedCapable (PAPER_SIZE ps, FullbleedType *fbType, float *xOverSpray, float *yOverSpray,
+ float *fLeftOverSpray, float *fTopOverSpray);
+}; //DJ3600
+
+
+#if defined(APDK_DJ3600) && defined (APDK_DJ3320)
+//! DJ3600Proxy
+/*!
+******************************************************************************/
+class DJ3600Proxy : public PrinterProxy
+{
+public:
+ DJ3600Proxy() : PrinterProxy(
+ "DJ3600", // family name
+ "deskjet 3600\0" // DeskJet 3600
+ "Deskjet 3740\0"
+ "Deskjet 3745\0"
+ "Deskjet 3840\0"
+ "Deskjet 3845\0"
+ "Deskjet F300\0"
+ "Deskjet D2360\0"
+ "Deskjet D24\0"
+ "Deskjet F41\0"
+ "officejet 4200\0"
+ "910\0"
+ "HP 910\0"
+ "915\0"
+ "HP 915\0"
+#ifdef APDK_MLC_PRINTER
+ "Officejet 4300\0"
+ "officejet 5500\0"
+ "Officejet 5600\0"
+ "psc 1300\0"
+ "psc 1310\0"
+ "PSC 1400\0"
+#endif
+ ) {m_iPrinterType = eDJ3600;}
+ inline Printer* CreatePrinter(SystemServices* pSS) const { return new DJ3600(pSS); }
+ inline PRINTER_TYPE GetPrinterType() const { return eDJ3600;}
+ inline unsigned int GetModelBit() const { return 0x2;}
+};
+#endif
+
+APDK_END_NAMESPACE
+
+#endif // APDK_DJ3600_H
diff --git a/prnt/hpijs/dj3600_cmap.cpp b/prnt/hpijs/dj3600_cmap.cpp
new file mode 100644
index 0000000..769f9ad
--- /dev/null
+++ b/prnt/hpijs/dj3600_cmap.cpp
@@ -0,0 +1,811 @@
+/*****************************************************************************\
+ dj3320_cmap.cpp : Implimentation for the DJ3600 color maps
+
+ Copyright (c) 1996 - 2003, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ \***************************************************************************/
+
+
+#ifdef APDK_DJ3600
+
+#include "config.h"
+
+#include "global_types.h"
+
+APDK_BEGIN_NAMESPACE
+
+// 600x600x1, KCMY - Plain Normal, MLC Both
+
+uint32_t ulMapDJ3600_KCMY_6x6x1[ 9 * 9 * 9 ] =
+{
+3503343871UL, 2379407530UL, 1338176353UL, 698938928UL, 446166815UL, 311162901UL,
+ 193132557UL, 91879429UL, 7403520UL, 3999964546UL, 2759781530UL, 1235874648UL,
+ 631371308UL, 429258525UL, 294320148UL, 176289804UL, 74971140UL, 7141376UL,
+3996614467UL, 3695036491UL, 1732834647UL, 744355636UL, 376502042UL, 242546704UL,
+ 141686793UL, 57407491UL, 6420480UL, 3961749547UL, 3945178158UL, 3173837109UL,
+1093532471UL, 505608740UL, 239335697UL, 71891205UL, 38531842UL, 4777472UL,
+3961028126UL, 3944322079UL, 3759852831UL, 2434527520UL, 706345758UL, 387447579UL,
+ 152958987UL, 69723652UL, 2345472UL, 3960568341UL, 3960572437UL, 3893476373UL,
+3289377554UL, 1594816272UL, 420478481UL, 252706066UL, 67433989UL, 50176UL,
+3960173838UL, 3960242702UL, 3909856269UL, 3607616520UL, 2349264135UL, 1023866375UL,
+ 269089547UL, 101120007UL, 50176UL, 3959844615UL, 3943070215UL, 3926236166UL,
+3775055107UL, 2785266179UL, 1493421316UL, 654560772UL, 168089349UL, 50944UL,
+3942676480UL, 3892345344UL, 3724574720UL, 3405809920UL, 2684391936UL, 1728092672UL,
+ 989896448UL, 419472640UL, 41984UL, 3938409846UL, 1777809479UL, 719700274UL,
+ 265413906UL, 113242887UL, 78312964UL, 26474241UL, 42465026UL, 7597568UL,
+4099756906UL, 3130956215UL, 1570223961UL, 428925723UL, 159509771UL, 41151746UL,
+ 6743040UL, 6215936UL, 6018560UL, 4029963327UL, 3644760395UL, 1782421067UL,
+ 575062561UL, 257082638UL, 89245445UL, 5162752UL, 5162752UL, 5624576UL,
+3995102759UL, 3894320676UL, 2652743204UL, 975619374UL, 370263572UL, 153272840UL,
+ 36422146UL, 3260672UL, 4049664UL, 3977670940UL, 3859972117UL, 3188485391UL,
+1779476755UL, 638694420UL, 285979662UL, 84128516UL, 368128UL, 1485824UL,
+3960434963UL, 3825888268UL, 3305592585UL, 2315745034UL, 1242012169UL, 453550859UL,
+ 201761544UL, 33657602UL, 38656UL, 3960106252UL, 3758447622UL, 3322169094UL,
+2718127620UL, 1711501317UL, 906197252UL, 302287366UL, 100897027UL, 38656UL,
+3959777286UL, 3657518081UL, 3355523073UL, 2734764801UL, 2013350401UL, 1258379777UL,
+ 587291137UL, 167863553UL, 40704UL, 3825228288UL, 3556784896UL, 3439344384UL,
+3053467392UL, 2248162048UL, 1493191424UL, 855657984UL, 369118976UL, 17920UL,
+3921752382UL, 3102352688UL, 670965543UL, 149451274UL, 147700489UL, 96322565UL,
+ 60541443UL, 42256898UL, 7258112UL, 3985386811UL, 3702734672UL, 1538472522UL,
+ 330521618UL, 10190080UL, 8687360UL, 7445504UL, 6529536UL, 6075392UL,
+4231344960UL, 3157142584UL, 1545279776UL, 943204887UL, 205414664UL, 20805889UL,
+ 3964160UL, 4032000UL, 3837696UL, 4045286692UL, 3894363174UL, 2467113488UL,
+ 973409798UL, 369441287UL, 118703875UL, 1724672UL, 2450944UL, 3113472UL,
+4011019287UL, 3859893269UL, 3171563020UL, 1459887621UL, 537207045UL, 235091204UL,
+ 67188481UL, 19968UL, 1077504UL, 3977074448UL, 3809102860UL, 3020168197UL,
+1560282369UL, 922816514UL, 335614466UL, 134288641UL, 33632769UL, 20736UL,
+3976747530UL, 3724821765UL, 2885750530UL, 1744830464UL, 1056964608UL, 587202560UL,
+ 184549376UL, 83893249UL, 11520UL, 3959642372UL, 3590337024UL, 2684354560UL,
+1946157056UL, 1325400064UL, 822083584UL, 419430400UL, 117440512UL, 13312UL,
+3707780608UL, 3472891904UL, 2717908992UL, 2130706432UL, 1560281088UL, 1040187392UL,
+ 603979776UL, 285213184UL, 0UL, 3921681442UL, 3638301978UL, 1207570452UL,
+ 251399441UL, 165093385UL, 112809990UL, 77490948UL, 42365442UL, 7170048UL,
+3953203487UL, 3719895071UL, 1488459293UL, 331156752UL, 44895746UL, 9254656UL,
+ 7818496UL, 6838016UL, 6250496UL, 4031061542UL, 3729530664UL, 2100235536UL,
+ 925305099UL, 206570244UL, 5311232UL, 5186304UL, 4994816UL, 4737024UL,
+4246740775UL, 3626312750UL, 1946683146UL, 838860800UL, 587202560UL, 67502080UL,
+ 1050624UL, 1448704UL, 1782784UL, 4078113303UL, 3826389270UL, 2986936587UL,
+1459617792UL, 654311424UL, 201326592UL, 33554432UL, 2304UL, 599296UL,
+4027262733UL, 3758691083UL, 2936275973UL, 1761607680UL, 989855744UL, 385875968UL,
+ 100663296UL, 16777216UL, 3840UL, 4010227975UL, 3624146437UL, 2936078594UL,
+1845493760UL, 1174405120UL, 704643072UL, 218103808UL, 50331648UL, 0UL,
+3842191108UL, 3456174337UL, 2868903936UL, 2030043136UL, 1358954496UL, 973078528UL,
+ 520093696UL, 117440512UL, 0UL, 3439331584UL, 3305111552UL, 2885681152UL,
+2231369728UL, 1610612736UL, 1241513984UL, 771751936UL, 335544320UL, 0UL,
+3921285141UL, 3755084815UL, 2230520075UL, 351997200UL, 166266890UL, 147064327UL,
+ 94702084UL, 42409730UL, 7546624UL, 3936620050UL, 3652061708UL, 2125990413UL,
+ 448465936UL, 44892418UL, 8847360UL, 7864320UL, 7081984UL, 6692352UL,
+3998551827UL, 3629387282UL, 2016741128UL, 791741960UL, 205259267UL, 4325376UL,
+ 4718592UL, 4980736UL, 5051136UL, 4111667992UL, 3406893334UL, 2130903812UL,
+1056964608UL, 570425344UL, 67108864UL, 458752UL, 1638400UL, 2293760UL,
+3977581594UL, 3608351512UL, 2768700937UL, 1208091139UL, 603979776UL, 335544320UL,
+ 33554432UL, 33554432UL, 0UL, 3993766927UL, 3658091020UL, 2835612420UL,
+1694564609UL, 922746880UL, 402653184UL, 83886080UL, 0UL, 0UL,
+3859220233UL, 3523544070UL, 2785083649UL, 1694498816UL, 1107296256UL, 654311424UL,
+ 167772160UL, 33554432UL, 0UL, 3607298820UL, 3389063425UL, 2734686208UL,
+1895825408UL, 1207959552UL, 855638016UL, 486539264UL, 83886080UL, 0UL,
+3321888768UL, 3154116608UL, 2701131776UL, 2097152000UL, 1375731712UL, 1107296256UL,
+ 754974720UL, 385875968UL, 0UL, 3921087246UL, 3838511114UL, 3052143621UL,
+ 904922117UL, 198969611UL, 114099206UL, 94241540UL, 58786306UL, 7405568UL,
+3936356363UL, 3584165384UL, 2427192583UL, 917636102UL, 94962435UL, 9109504UL,
+ 7208960UL, 6291456UL, 6029312UL, 3965519882UL, 3528590599UL, 1932591619UL,
+1094189829UL, 238158596UL, 3276800UL, 3342336UL, 3670016UL, 4325376UL,
+4028107276UL, 3339192074UL, 1929379841UL, 1040187392UL, 452984832UL, 83886080UL,
+ 0UL, 458752UL, 1572864UL, 4111273232UL, 3591047949UL, 2600665861UL,
+1157627904UL, 704643072UL, 352321536UL, 67108864UL, 0UL, 0UL,
+3372878091UL, 3658091020UL, 3003253251UL, 1510015234UL, 855703809UL, 385875968UL,
+ 184549376UL, 0UL, 0UL, 3439724039UL, 3372549125UL, 2701197570UL,
+1744830465UL, 1157627904UL, 654311424UL, 234881024UL, 33554432UL, 0UL,
+3254911491UL, 3221291266UL, 2617245696UL, 1828716544UL, 1207959552UL, 771751936UL,
+ 503316480UL, 83886080UL, 0UL, 2986344448UL, 2835349504UL, 2415919104UL,
+1946157056UL, 1358954496UL, 872415232UL, 704643072UL, 419430400UL, 0UL,
+3920693001UL, 3888448518UL, 3285910019UL, 1658323715UL, 416481795UL, 63504899UL,
+ 95748868UL, 58917122UL, 6619136UL, 3936158982UL, 3600548355UL, 2627404290UL,
+1352663297UL, 362349059UL, 8847360UL, 7274496UL, 5570560UL, 4980736UL,
+3966042884UL, 3579708164UL, 2403533058UL, 1346109698UL, 472973570UL, 19333120UL,
+ 2293760UL, 2555904UL, 2883584UL, 3978888197UL, 3221422852UL, 1828716544UL,
+1107296256UL, 620756992UL, 100663296UL, 0UL, 0UL, 327680UL,
+3691448073UL, 3020096259UL, 2013331713UL, 1174405120UL, 788529152UL, 335544320UL,
+ 50331648UL, 0UL, 0UL, 4010280970UL, 3506832647UL, 2466316546UL,
+1342177281UL, 939524096UL, 503316480UL, 201326592UL, 16777216UL, 0UL,
+3909617417UL, 3288465922UL, 2415919105UL, 1560281088UL, 1157627904UL, 671088640UL,
+ 218103808UL, 134217728UL, 0UL, 3103850753UL, 2902458369UL, 2382364672UL,
+1744830464UL, 1241513984UL, 805306368UL, 385875968UL, 117440512UL, 0UL,
+2600468480UL, 2466250752UL, 2231369728UL, 1795162112UL, 1342177280UL, 855638016UL,
+ 520093696UL, 385875968UL, 0UL, 3920298756UL, 3904766466UL, 3318284546UL,
+1992753410UL, 968557058UL, 313786626UL, 111018756UL, 43254017UL, 7143424UL,
+3935895810UL, 3566206976UL, 2726690816UL, 1636237312UL, 780402688UL, 125042945UL,
+ 6488064UL, 5111808UL, 4194304UL, 3915972866UL, 3546218496UL, 2571501568UL,
+1681522689UL, 809172993UL, 170524673UL, 1966080UL, 1572864UL, 1703936UL,
+3693740546UL, 3458203906UL, 2047148032UL, 1258291200UL, 855638016UL, 301989888UL,
+ 16777216UL, 0UL, 0UL, 3506635523UL, 2885746945UL, 2030043136UL,
+1207959552UL, 754974720UL, 536870912UL, 83886080UL, 0UL, 0UL,
+3674407683UL, 3154182402UL, 2046886145UL, 1308622848UL, 872415232UL, 486539264UL,
+ 201326592UL, 16777216UL, 0UL, 3254845697UL, 2617311233UL, 2030043136UL,
+1392508928UL, 1023410176UL, 620756992UL, 234881024UL, 117440512UL, 0UL,
+3657498882UL, 2868903936UL, 2097152000UL, 1577058304UL, 1241513984UL, 822083584UL,
+ 369098752UL, 83886080UL, 0UL, 2197815296UL, 2113929216UL, 1912602624UL,
+1644167168UL, 1325400064UL, 855638016UL, 486539264UL, 268435456UL, 0UL,
+3920625664UL, 3769696256UL, 3283353600UL, 2342846464UL, 1553530880UL, 831389696UL,
+ 411566080UL, 159383552UL, 7995392UL, 3767205888UL, 3431137280UL, 2793144320UL,
+1920270336UL, 1198587904UL, 526843904UL, 173277184UL, 4587520UL, 3932160UL,
+3596156928UL, 3428253696UL, 2655453184UL, 2134769664UL, 1178075136UL, 590020608UL,
+ 135921664UL, 1179648UL, 720896UL, 3374186496UL, 3290103808UL, 2299592704UL,
+1610612736UL, 1291845632UL, 587202560UL, 218103808UL, 0UL, 0UL,
+3238002688UL, 3204448256UL, 2516582400UL, 1677721600UL, 1342177280UL, 989855744UL,
+ 402653184UL, 33554432UL, 0UL, 2734686208UL, 2734686208UL, 2130706432UL,
+1342177280UL, 838860800UL, 654311424UL, 486539264UL, 117440512UL, 0UL,
+2298478592UL, 2264924160UL, 2080374784UL, 1426063360UL, 989855744UL, 536870912UL,
+ 335544320UL, 201326592UL, 0UL, 2046820352UL, 2030043136UL, 1996488704UL,
+1644167168UL, 1023410176UL, 654311424UL, 285212672UL, 167772160UL, 0UL,
+1912602624UL, 1879048192UL, 1677721600UL, 1442840576UL, 1124073472UL, 771751936UL,
+ 452984832UL, 218103808UL, 0UL,
+};
+
+// 600x600x1UL, ClMlxx - Plain NormalUL, MLC Both
+
+uint32_t ulMapDJ3600_ClMlxx_6x6x1[ 9 * 9 * 9 ] =
+{
+ 0UL, 591872UL, 393216UL, 1441792UL, 2097152UL, 2424832UL,
+ 2818048UL, 3211264UL, 3604480UL, 2816UL, 0UL, 1179648UL,
+ 1638400UL, 2162688UL, 2490368UL, 2883584UL, 3276800UL, 3735552UL,
+ 13568UL, 1188608UL, 0UL, 3801088UL, 3538944UL, 3407872UL,
+ 3538944UL, 3801088UL, 4194304UL, 16128UL, 10752UL, 66560UL,
+ 0UL, 6029312UL, 5177344UL, 5177344UL, 5376256UL, 6168064UL,
+ 17664UL, 14336UL, 202240UL, 0UL, 768UL, 4587520UL,
+ 6881792UL, 7675392UL, 9195264UL, 19200UL, 16640UL, 7936UL,
+ 0UL, 0UL, 0UL, 2752512UL, 7210496UL, 10314240UL,
+ 20480UL, 18432UL, 11520UL, 1792UL, 3072UL, 2816UL,
+ 2560UL, 1773312UL, 6912000UL, 22016UL, 19968UL, 14592UL,
+ 9472UL, 153344UL, 158720UL, 230144UL, 226048UL, 2658560UL,
+ 20736UL, 22272UL, 26880UL, 36608UL, 42240UL, 45312UL,
+ 48128UL, 49664UL, 51456UL, 720896UL, 0UL, 7936UL,
+ 2560UL, 459776UL, 1376768UL, 2228736UL, 2687488UL, 4002048UL,
+ 2752512UL, 9208064UL, 6579968UL, 3482112UL, 3412480UL, 3936512UL,
+ 4989184UL, 5911552UL, 6174976UL, 18176UL, 2312448UL, 10067968UL,
+ 8019200UL, 7362560UL, 7165184UL, 7165184UL, 7230720UL, 6569472UL,
+ 19200UL, 210688UL, 3639296UL, 3637504UL, 9264896UL, 9266176UL,
+ 8741376UL, 8480000UL, 7949824UL, 19712UL, 152320UL, 3193600UL,
+ 2334208UL, 2732032UL, 6393600UL, 9730560UL, 10192128UL, 9598976UL,
+ 20736UL, 223232UL, 1620992UL, 2014976UL, 1619968UL, 1884160UL,
+ 3978496UL, 7055872UL, 9278464UL, 22016UL, 163840UL, 770816UL,
+ 1230848UL, 1034240UL, 1035520UL, 1363200UL, 2344960UL, 4896000UL,
+ 23040UL, 104704UL, 247296UL, 513024UL, 381440UL, 316416UL,
+ 383744UL, 383744UL, 1295360UL, 30976UL, 45568UL, 49152UL,
+ 52992UL, 54784UL, 55040UL, 56320UL, 57600UL, 59136UL,
+ 1441792UL, 393472UL, 0UL, 348928UL, 1657856UL, 2773248UL,
+ 3755264UL, 4738560UL, 5726976UL, 3407872UL, 3806976UL, 9464576UL,
+ 4494592UL, 4361216UL, 4884224UL, 5603840UL, 6192640UL, 6516992UL,
+ 851968UL, 11767296UL, 15654144UL, 12505088UL, 8434688UL, 7773952UL,
+ 7773184UL, 7771648UL, 7900672UL, 28672UL, 487936UL, 9427200UL,
+ 12972544UL, 11848192UL, 10011392UL, 9288448UL, 8826112UL, 8361984UL,
+ 25600UL, 358656UL, 3001088UL, 5761280UL, 6680576UL, 8246784UL,
+ 9358080UL, 10076160UL, 9676544UL, 24832UL, 229888UL, 1627904UL,
+ 3011328UL, 3011328UL, 3536896UL, 4713472UL, 6870272UL, 9028352UL,
+ 24832UL, 169216UL, 515328UL, 1305856UL, 1438720UL, 1440512UL,
+ 1834496UL, 2682368UL, 4840704UL, 25600UL, 46080UL, 189696UL,
+ 518400UL, 519424UL, 522240UL, 523264UL, 654848UL, 1108224UL,
+ 40704UL, 50944UL, 58112UL, 60160UL, 60672UL, 62464UL,
+ 64000UL, 64512UL, 64256UL, 1703936UL, 459008UL, 0UL,
+ 334592UL, 2202624UL, 3708416UL, 4560128UL, 5150720UL, 5940224UL,
+ 3145728UL, 3999744UL, 9643264UL, 7760640UL, 4701952UL, 5551360UL,
+ 5943296UL, 6270720UL, 6466560UL, 6488064UL, 8720896UL, 14914560UL,
+ 15054080UL, 10273792UL, 7392256UL, 7521792UL, 7389440UL, 7323136UL,
+ 3072UL, 3224064UL, 13088000UL, 13809920UL, 13682944UL, 10147328UL,
+ 8508928UL, 8834816UL, 9094912UL, 30720UL, 560128UL, 4637184UL,
+ 8441600UL, 10471424UL, 8638208UL, 8639488UL, 8771584UL, 9751296UL,
+ 32512UL, 372736UL, 2608384UL, 3329792UL, 3985152UL, 4773120UL,
+ 5167616UL, 6151680UL, 7854592UL, 30464UL, 310016UL, 1101824UL,
+ 1624320UL, 1887232UL, 1889280UL, 2676992UL, 3268096UL, 4709888UL,
+ 16880640UL, 118528UL, 381184UL, 575744UL, 707328UL, 774144UL,
+ 776192UL, 1104384UL, 1632000UL, 52992UL, 54272UL, 53760UL,
+ 51968UL, 52736UL, 52736UL, 55296UL, 57344UL, 54784UL,
+ 2162688UL, 852224UL, 0UL, 655616UL, 3155200UL, 5087744UL,
+ 5161216UL, 6012928UL, 6537216UL, 3211264UL, 5440768UL, 8916992UL,
+ 11606528UL, 9526528UL, 8104704UL, 6801152UL, 6735872UL, 6931712UL,
+ 6356992UL, 9702656UL, 14500352UL, 15354880UL, 13921024UL, 11837696UL,
+ 9879552UL, 7851264UL, 7522816UL, 6684672UL, 11412224UL, 14182144UL,
+ 14452736UL, 14454272UL, 13734912UL, 12891648UL, 11126528UL, 8311808UL,
+ 596224UL, 2305024UL, 6775040UL, 9731584UL, 10387456UL, 9603584UL,
+ 9284096UL, 10469120UL, 9883136UL, 158464UL, 880896UL, 3115776UL,
+ 4167424UL, 4691968UL, 6065664UL, 5677312UL, 6731008UL, 8505856UL,
+ 171520UL, 566784UL, 1417984UL, 2006528UL, 2007040UL, 2269952UL,
+ 3257088UL, 3455744UL, 5620992UL, 311040UL, 180224UL, 504064UL,
+ 763392UL, 826880UL, 762368UL, 896768UL, 1358336UL, 2342144UL,
+ 49920UL, 47616UL, 47104UL, 45312UL, 43008UL, 41472UL,
+ 44544UL, 48128UL, 43776UL, 2490368UL, 1245184UL, 196608UL,
+ 1769472UL, 6163968UL, 8071936UL, 9206016UL, 8432640UL, 8305920UL,
+ 3473408UL, 6620416UL, 9504768UL, 11799040UL, 12328448UL, 12273152UL,
+ 11044096UL, 10200832UL, 9549824UL, 6291456UL, 10881024UL, 14556416UL,
+ 14886144UL, 15412224UL, 14240000UL, 13140224UL, 12165376UL, 10729472UL,
+ 9109504UL, 13440512UL, 14957312UL, 14697472UL, 15157248UL, 14829568UL,
+ 14119168UL, 13605120UL, 12238080UL, 3997952UL, 5705984UL, 9582336UL,
+ 10702592UL, 11096576UL, 11294720UL, 10840576UL, 11766784UL, 11648512UL,
+ 2634496UL, 1189632UL, 3555584UL, 5000960UL, 5852672UL, 5590016UL,
+ 6642944UL, 6586112UL, 8170240UL, 1204992UL, 1073408UL, 1729024UL,
+ 2188800UL, 2451456UL, 3168000UL, 3760896UL, 3898112UL, 5346048UL,
+ 752896UL, 424960UL, 555008UL, 751360UL, 946944UL, 1010688UL,
+ 1011712UL, 1669376UL, 2590976UL, 35840UL, 34560UL, 33792UL,
+ 33536UL, 33024UL, 29696UL, 28928UL, 32768UL, 30464UL,
+ 2818048UL, 1507328UL, 2293760UL, 4849920UL, 7995904UL, 10030592UL,
+ 12000256UL, 12081664UL, 11567616UL, 3670016UL, 6750720UL, 10420992UL,
+ 11928064UL, 13109248UL, 13311232UL, 13317888UL, 13001984UL, 12680448UL,
+ 6094848UL, 9896448UL, 13765632UL, 14552832UL, 15405568UL, 15342592UL,
+ 14891264UL, 14049792UL, 13465856UL, 8781824UL, 14224128UL, 15145216UL,
+ 15409408UL, 15345152UL, 15671808UL, 14954240UL, 14766848UL, 14381568UL,
+ 8587008UL, 10098944UL, 11216640UL, 11414784UL, 11349248UL, 12595712UL,
+ 12267776UL, 12538624UL, 13073408UL, 1901312UL, 3281152UL, 5317632UL,
+ 6172160UL, 6892544UL, 7024128UL, 8598272UL, 8276224UL, 8943360UL,
+ 334336UL, 1648896UL, 2371584UL, 2699520UL, 2895616UL, 3091456UL,
+ 2959616UL, 4669184UL, 5204480UL, 935936UL, 672768UL, 803584UL,
+ 869120UL, 999936UL, 1064960UL, 1389824UL, 1785088UL, 2907648UL,
+ 21248UL, 20992UL, 20736UL, 21248UL, 20992UL, 19968UL,
+ 17152UL, 18688UL, 20224UL, 3145728UL, 1966080UL, 5177344UL,
+ 7471360UL, 10682880UL, 12518400UL, 13174784UL, 13177600UL, 13253888UL,
+ 3932160UL, 7733248UL, 11403264UL, 12648448UL, 13303808UL, 14091008UL,
+ 14096128UL, 14361344UL, 14235904UL, 6291456UL, 10158080UL, 13566720UL,
+ 14353408UL, 14877440UL, 15730432UL, 15603200UL, 15539968UL, 15152640UL,
+ 11337984UL, 13107712UL, 15599872UL, 15601152UL, 15666688UL, 15928832UL,
+ 15602176UL, 15342848UL, 15348224UL, 12059904UL, 11864576UL, 12062464UL,
+ 11997952UL, 11801600UL, 12850688UL, 13375232UL, 13179904UL, 13646592UL,
+ 5767936UL, 6228992UL, 6689792UL, 7083520UL, 7476736UL, 7410944UL,
+ 9704960UL, 9443072UL, 10499840UL, 2232064UL, 2692864UL, 2955264UL,
+ 3348992UL, 3479552UL, 3675648UL, 4396288UL, 5183744UL, 6829824UL,
+ 201728UL, 661760UL, 989696UL, 1120512UL, 1185536UL, 1251072UL,
+ 1315840UL, 1249536UL, 2766592UL, 9216UL, 9216UL, 9216UL,
+ 9472UL, 9728UL, 9984UL, 9472UL, 8704UL, 12032UL,
+ 2949120UL, 4259840UL, 7995392UL, 10223616UL, 11927552UL, 13041664UL,
+ 13500416UL, 13828096UL, 14024704UL, 6160384UL, 9568256UL, 11927552UL,
+ 12976128UL, 13500416UL, 14155776UL, 14745600UL, 15073792UL, 15400960UL,
+ 10092544UL, 11665408UL, 13500416UL, 14024704UL, 14745600UL, 15400960UL,
+ 16056320UL, 16189184UL, 16449536UL, 13434880UL, 13762560UL, 15073280UL,
+ 15597568UL, 15597568UL, 15990784UL, 15925248UL, 15664896UL, 15597568UL,
+ 13107200UL, 13172736UL, 13631488UL, 13697024UL, 12910592UL, 13238272UL,
+ 13697024UL, 13631488UL, 13500416UL, 7995392UL, 7798784UL, 8912896UL,
+ 7668480UL, 7799808UL, 8127232UL, 9699328UL, 10289152UL, 10354688UL,
+ 3735552UL, 3145728UL, 3997696UL, 3737600UL, 3999744UL, 4130048UL,
+ 4719360UL, 5767168UL, 6160384UL, 1376256UL, 851968UL, 786432UL,
+ 1048576UL, 1312512UL, 1443584UL, 1573888UL, 2228224UL, 3473408UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL,
+};
+
+
+// 600x600x2, KCMY - Photo Best, MLC Both
+
+uint32_t ulMapDJ3600_KCMY_6x6x2[ 9 * 9 * 9 ] =
+{
+3317360895UL, 3587571711UL, 2630745874UL, 1166933778UL, 558432009UL, 202374912UL,
+ 65280UL, 65280UL, 61952UL, 4286697175UL, 3867868899UL, 2478505755UL,
+1064697618UL, 456589062UL, 100925184UL, 65280UL, 65280UL, 61440UL,
+4281391953UL, 4281401169UL, 3306553118UL, 1259536131UL, 402718464UL, 151060224UL,
+ 50393088UL, 55296UL, 53760UL, 4278248192UL, 4278253824UL, 3892379392UL,
+2164324864UL, 805371648UL, 352378880UL, 151031040UL, 50361600UL, 29952UL,
+4278247168UL, 4278251264UL, 4261474048UL, 3070286848UL, 1359007232UL, 553701632UL,
+ 151021056UL, 100671744UL, 6912UL, 4278243072UL, 4278245632UL, 4278243840UL,
+3338707456UL, 1912639488UL, 755006976UL, 251682048UL, 100670208UL, 0UL,
+4278240000UL, 4278242304UL, 4278241792UL, 3456139520UL, 2516603136UL, 1308634368UL,
+ 402660864UL, 151000320UL, 0UL, 4278234624UL, 4278237696UL, 4278239488UL,
+3842018560UL, 3170913792UL, 1962946560UL, 905976576UL, 150996480UL, 0UL,
+4278230784UL, 4278229248UL, 4278226944UL, 4009786112UL, 3288358144UL, 2617264128UL,
+1560292608UL, 704649216UL, 768UL, 4293301959UL, 4127165121UL, 1979703064UL,
+ 618921734UL, 113377027UL, 58064640UL, 51576576UL, 64000UL, 58880UL,
+4289820069UL, 3583816940UL, 3234785331UL, 1067056917UL, 357105414UL, 51183360UL,
+ 65280UL, 65280UL, 55296UL, 4281384273UL, 4281589076UL, 3290944563UL,
+1510796291UL, 553713152UL, 100727808UL, 59392UL, 55296UL, 50432UL,
+4278245120UL, 4278248960UL, 3674265856UL, 2113983488UL, 855693056UL, 251705856UL,
+ 39936UL, 29184UL, 18432UL, 4278244352UL, 4278241792UL, 3842027008UL,
+2717948160UL, 1258328832UL, 503352576UL, 151008768UL, 3840UL, 0UL,
+4278239488UL, 4278224640UL, 4009778432UL, 3238022656UL, 1811953152UL, 754985472UL,
+ 251666688UL, 50331648UL, 0UL, 4278223104UL, 4278204672UL, 4026538752UL,
+3355448576UL, 2365591296UL, 1258292736UL, 452984832UL, 100663296UL, 0UL,
+4278211584UL, 4278191616UL, 4026531840UL, 3523215360UL, 2919235584UL, 1761607680UL,
+ 855638016UL, 251658240UL, 0UL, 4278201600UL, 4278190080UL, 4076863488UL,
+3674210304UL, 3271557120UL, 2365587456UL, 1409286144UL, 603979776UL, 0UL,
+4294257206UL, 4160689435UL, 2029977600UL, 318706944UL, 165107459UL, 109928451UL,
+ 52914432UL, 33792UL, 36096UL, 4291571001UL, 4292429923UL, 3319802398UL,
+1070667779UL, 211758339UL, 5331456UL, 1410816UL, 38400UL, 39168UL,
+4283510076UL, 4148707162UL, 3023844942UL, 1764377103UL, 553671936UL, 50363904UL,
+ 34560UL, 33024UL, 31488UL, 4278222336UL, 4278225408UL, 3472906752UL,
+2063611392UL, 855649536UL, 251665920UL, 7680UL, 8448UL, 13056UL,
+4278226176UL, 4278213888UL, 3707773184UL, 2516587776UL, 1207964160UL, 452987904UL,
+ 100663296UL, 0UL, 0UL, 4278209280UL, 4278196224UL, 3707764736UL,
+3019898880UL, 1711276032UL, 754974720UL, 251658240UL, 50331648UL, 0UL,
+4278195456UL, 4278190080UL, 3808428032UL, 3271557120UL, 2164260864UL, 1258291200UL,
+ 503316480UL, 100663296UL, 0UL, 4278192384UL, 4278190080UL, 3808428032UL,
+3388997632UL, 2667577344UL, 1660944384UL, 855638016UL, 251658240UL, 0UL,
+4278190080UL, 4278190080UL, 3791650816UL, 3472883712UL, 3070230528UL, 2063597568UL,
+1358954496UL, 553648128UL, 0UL, 4294705152UL, 4294901760UL, 1878982656UL,
+ 620691456UL, 166264832UL, 161611776UL, 56033280UL, 3145728UL, 1376256UL,
+4291887104UL, 4292871689UL, 3186360320UL, 1172307968UL, 213975040UL, 7667712UL,
+ 4325376UL, 1769472UL, 768UL, 4287628035UL, 4285857792UL, 3378118656UL,
+1968635904UL, 556793856UL, 983040UL, 196608UL, 0UL, 0UL,
+4279369728UL, 4278190080UL, 3305111552UL, 1862270976UL, 1207959552UL, 251658240UL,
+ 0UL, 0UL, 1536UL, 4278193152UL, 4278190080UL, 3640655872UL,
+2516582400UL, 1358954496UL, 503316480UL, 100663296UL, 0UL, 0UL,
+4278190080UL, 4278190080UL, 3707764736UL, 3070230528UL, 1711276032UL, 754974720UL,
+ 251658240UL, 0UL, 0UL, 4278190080UL, 4278190080UL, 3791650816UL,
+3254779904UL, 2113929216UL, 1258291200UL, 503316480UL, 100663296UL, 0UL,
+4278190080UL, 4278190080UL, 3808428032UL, 3321888768UL, 2466250752UL, 1660944384UL,
+ 855638016UL, 251658240UL, 0UL, 4278190080UL, 4261412864UL, 3741319168UL,
+3355443200UL, 2768240640UL, 2063597568UL, 1409286144UL, 553648128UL, 0UL,
+4294705152UL, 4294901760UL, 2382299136UL, 620691456UL, 67043328UL, 113704960UL,
+ 58982400UL, 56623104UL, 3735552UL, 4291166208UL, 4291559424UL, 3320381440UL,
+1122369536UL, 265551872UL, 10616832UL, 6094848UL, 2752512UL, 1376256UL,
+4285267968UL, 4284284928UL, 3528720384UL, 1818427392UL, 660013056UL, 53084160UL,
+ 1179648UL, 196608UL, 0UL, 4278386688UL, 4261412864UL, 3456106496UL,
+2264924160UL, 1207959552UL, 301989888UL, 0UL, 0UL, 0UL,
+4278190080UL, 4278190080UL, 3640655872UL, 2466250752UL, 1358954496UL, 754974720UL,
+ 100663296UL, 0UL, 0UL, 4278190080UL, 4278190080UL, 3791650816UL,
+3170893824UL, 1761607680UL, 905969664UL, 251658240UL, 0UL, 0UL,
+4278190080UL, 4278190080UL, 3808428032UL, 3254779904UL, 2063597568UL, 1157627904UL,
+ 503316480UL, 50331648UL, 0UL, 4278190080UL, 4278190080UL, 3808428032UL,
+3305111552UL, 2164260864UL, 1560281088UL, 754974720UL, 251658240UL, 0UL,
+4278190080UL, 4278190080UL, 3758096384UL, 3338665984UL, 2415919104UL, 1862270976UL,
+1358954496UL, 553648128UL, 0UL, 4294377472UL, 4294901760UL, 2935947264UL,
+ 822018048UL, 67043328UL, 16646144UL, 63242240UL, 9633792UL, 6684672UL,
+4291887104UL, 4289986560UL, 3386900480UL, 1525022720UL, 316211200UL, 12910592UL,
+ 8060928UL, 4915200UL, 3145728UL, 4284481536UL, 4282712064UL, 3560308736UL,
+2670919680UL, 710737920UL, 105578496UL, 2359296UL, 983040UL, 196608UL,
+4278190080UL, 4076863488UL, 3422552064UL, 2516582400UL, 1107296256UL, 352321536UL,
+ 0UL, 0UL, 0UL, 4278190080UL, 4278190080UL, 3489660928UL,
+2516582400UL, 1509949440UL, 855638016UL, 150994944UL, 0UL, 0UL,
+4278190080UL, 4278190080UL, 3758096384UL, 3120562176UL, 1761607680UL, 855638016UL,
+ 452984832UL, 0UL, 0UL, 4278190080UL, 4278190080UL, 3909091328UL,
+3305111552UL, 2113929216UL, 1107296256UL, 553648128UL, 50331648UL, 0UL,
+4278190080UL, 4278190080UL, 3925868544UL, 3355443200UL, 2315255808UL, 1409286144UL,
+ 805306368UL, 251658240UL, 0UL, 4278190080UL, 4278190080UL, 3892314112UL,
+3405774848UL, 2466250752UL, 1560281088UL, 1258291200UL, 553648128UL, 0UL,
+4293525504UL, 4294901760UL, 3456040960UL, 1526661120UL, 268369920UL, 16711680UL,
+ 16187392UL, 63373312UL, 9830400UL, 4291624960UL, 4291690496UL, 3419865088UL,
+1977745408UL, 517341184UL, 13041664UL, 11403264UL, 7077888UL, 5308416UL,
+4284284928UL, 4284088320UL, 3525378048UL, 2270429184UL, 912457728UL, 156303360UL,
+ 3932160UL, 2162688UL, 1376256UL, 4278190080UL, 3959422976UL, 3422552064UL,
+2617245696UL, 1207959552UL, 452984832UL, 0UL, 0UL, 0UL,
+4278190080UL, 3758096384UL, 3405774848UL, 2566914048UL, 1711276032UL, 704643072UL,
+ 201326592UL, 0UL, 0UL, 4278190080UL, 4278190080UL, 3674210304UL,
+2566914048UL, 1660944384UL, 956301312UL, 553648128UL, 50331648UL, 0UL,
+4278190080UL, 4278190080UL, 3892314112UL, 3288334336UL, 2063597568UL, 1157627904UL,
+ 503316480UL, 301989888UL, 0UL, 4278190080UL, 4278190080UL, 4110417920UL,
+3489660928UL, 2516582400UL, 1409286144UL, 654311424UL, 251658240UL, 0UL,
+4278190080UL, 4278190080UL, 4194304000UL, 3573547008UL, 2768240640UL, 1610612736UL,
+ 956301312UL, 603979776UL, 0UL, 4293263360UL, 4294574080UL, 3607035904UL,
+2382299136UL, 771686400UL, 117374976UL, 16711680UL, 16318464UL, 13238272UL,
+4291297280UL, 4291166208UL, 3419013120UL, 2328952832UL, 1020329984UL, 164298752UL,
+ 11993088UL, 10027008UL, 7864320UL, 4284088320UL, 4284284928UL, 3376742400UL,
+2270035968UL, 1364852736UL, 407764992UL, 4325376UL, 3735552UL, 2752512UL,
+4278190080UL, 4143972352UL, 3439329280UL, 2617245696UL, 1409286144UL, 704643072UL,
+ 100663296UL, 0UL, 0UL, 4278190080UL, 3640655872UL, 3372220416UL,
+2566914048UL, 1711276032UL, 855638016UL, 352321536UL, 0UL, 0UL,
+4278190080UL, 4278190080UL, 3271557120UL, 2466250752UL, 1660944384UL, 956301312UL,
+ 503316480UL, 100663296UL, 0UL, 4278190080UL, 4278190080UL, 3791650816UL,
+3170893824UL, 1560281088UL, 905969664UL, 503316480UL, 301989888UL, 0UL,
+4278190080UL, 4278190080UL, 3909091328UL, 3305111552UL, 2164260864UL, 1308622848UL,
+ 704643072UL, 201326592UL, 0UL, 4278190080UL, 4278190080UL, 4278190080UL,
+3640655872UL, 2919235584UL, 1660944384UL, 855638016UL, 553648128UL, 0UL,
+4293525504UL, 4293853184UL, 3858366464UL, 3321823232UL, 2281635840UL, 1124007936UL,
+ 519962624UL, 167641088UL, 16384000UL, 4291297280UL, 3936485376UL, 3350265856UL,
+2579824640UL, 1674117120UL, 667418624UL, 113573888UL, 12648448UL, 12648448UL,
+4284284928UL, 4031250432UL, 3240951808UL, 2268856320UL, 1715994624UL, 1011548160UL,
+ 206045184UL, 4521984UL, 4718592UL, 4278190080UL, 3976200192UL, 3355443200UL,
+2264924160UL, 1610612736UL, 1207959552UL, 503316480UL, 50331648UL, 0UL,
+4278190080UL, 4278190080UL, 3456106496UL, 2667577344UL, 1761607680UL, 1207959552UL,
+ 704643072UL, 150994944UL, 0UL, 4278190080UL, 4278190080UL, 3573547008UL,
+2516582400UL, 1761607680UL, 1056964608UL, 704643072UL, 301989888UL, 0UL,
+4278190080UL, 4278190080UL, 3758096384UL, 3120562176UL, 1610612736UL, 1056964608UL,
+ 553648128UL, 301989888UL, 0UL, 4278190080UL, 4278190080UL, 3841982464UL,
+3271557120UL, 2113929216UL, 855638016UL, 603979776UL, 251658240UL, 0UL,
+4278190080UL, 4278190080UL, 3523215360UL, 2818572288UL, 1912602624UL, 1358954496UL,
+ 905969664UL, 402653184UL, 0UL,
+};
+
+// 600x600x2, ClMlxx - Photo Best, MLC Both
+
+uint32_t ulMapDJ3600_ClMlxx_6x6x2[ 9 * 9 * 9 ] =
+{
+ 0UL, 983040UL, 6291456UL, 13762560UL, 16711680UL, 16711680UL,
+ 16719360UL, 16750080UL, 16768256UL, 12619776UL, 13383936UL, 11403264UL,
+ 14614528UL, 16711680UL, 16711680UL, 16726272UL, 16761344UL, 16768768UL,
+ 15098624UL, 15478016UL, 16728576UL, 16715520UL, 16714752UL, 16740096UL,
+ 16769024UL, 16776192UL, 16776960UL, 15808768UL, 15803392UL, 16736256UL,
+ 16758528UL, 16741632UL, 16772864UL, 16776960UL, 16776960UL, 16776960UL,
+ 12807168UL, 12407808UL, 13156352UL, 14084608UL, 14417664UL, 14089984UL,
+ 14352128UL, 14876416UL, 15662848UL, 5357824UL, 4174080UL, 4973568UL,
+ 7732992UL, 8322816UL, 8912640UL, 9305856UL, 12779264UL, 13893376UL,
+ 1824768UL, 1232384UL, 1436672UL, 2621184UL, 3800832UL, 3407616UL,
+ 3604224UL, 6946560UL, 11075328UL, 846336UL, 648192UL, 652544UL,
+ 1048320UL, 2227968UL, 2031360UL, 1834752UL, 1441536UL, 5766912UL,
+ 62208UL, 64768UL, 65280UL, 65280UL, 65280UL, 65280UL,
+ 65280UL, 65280UL, 65280UL, 2804224UL, 57344UL, 50176UL,
+ 2378496UL, 9057024UL, 15160320UL, 16750080UL, 16765696UL, 16771328UL,
+ 10475008UL, 13349888UL, 11640576UL, 14903552UL, 16726272UL, 16724736UL,
+ 16738560UL, 16763904UL, 16776192UL, 15180288UL, 16017664UL, 16757760UL,
+ 16760832UL, 16761856UL, 16765440UL, 16771840UL, 16776192UL, 16776960UL,
+ 15879680UL, 15746304UL, 16763136UL, 16768768UL, 16772608UL, 16776960UL,
+ 16776960UL, 16776960UL, 16776960UL, 12683776UL, 12764672UL, 13172224UL,
+ 13827840UL, 13762304UL, 13827840UL, 14089984UL, 14417664UL, 14876416UL,
+ 4576512UL, 5570304UL, 6553344UL, 7143168UL, 7732992UL, 7929600UL,
+ 9109248UL, 11075328UL, 13172480UL, 1048320UL, 1048320UL, 2031360UL,
+ 2424576UL, 3211008UL, 3211008UL, 3211008UL, 4980480UL, 9109248UL,
+ 851712UL, 65280UL, 65280UL, 65280UL, 458496UL, 655104UL,
+ 655104UL, 851712UL, 3800832UL, 65280UL, 65280UL, 65280UL,
+ 65280UL, 65280UL, 65280UL, 65280UL, 65280UL, 65280UL,
+ 2025984UL, 458496UL, 65280UL, 2031360UL, 11075328UL, 15859456UL,
+ 16776960UL, 16776960UL, 16776960UL, 6942208UL, 8122112UL, 12254976UL,
+ 13238016UL, 15400704UL, 16776960UL, 16776960UL, 16776960UL, 16776960UL,
+ 14019840UL, 16380672UL, 16773376UL, 16776960UL, 16776960UL, 16776960UL,
+ 16776960UL, 16776960UL, 16776960UL, 16297472UL, 16761856UL, 16775168UL,
+ 16776960UL, 16776960UL, 16776960UL, 16776960UL, 16776960UL, 16776960UL,
+ 13030400UL, 12975872UL, 13172480UL, 13631232UL, 13500160UL, 13696768UL,
+ 13958912UL, 14417664UL, 14941952UL, 5570304UL, 5963520UL, 7339776UL,
+ 7929600UL, 7929600UL, 7732992UL, 9109248UL, 11468544UL, 13106944UL,
+ 1244928UL, 1638144UL, 2424576UL, 3014400UL, 3014400UL, 3211008UL,
+ 3407616UL, 5766912UL, 9109248UL, 458496UL, 65280UL, 65280UL,
+ 458496UL, 458496UL, 655104UL, 851712UL, 1048320UL, 3800832UL,
+ 65280UL, 65280UL, 65280UL, 65280UL, 65280UL, 65280UL,
+ 65280UL, 65280UL, 65280UL, 2024704UL, 844800UL, 1631232UL,
+ 1633536UL, 13369088UL, 16776960UL, 16776960UL, 16776960UL, 16776960UL,
+ 5372160UL, 3798528UL, 13434624UL, 14745344UL, 16645888UL, 16776960UL,
+ 16776960UL, 16776960UL, 16776960UL, 10287616UL, 15138048UL, 16776960UL,
+ 16776960UL, 16776960UL, 16776960UL, 16776960UL, 16776960UL, 16776960UL,
+ 15266816UL, 16776960UL, 16776960UL, 16775680UL, 16776960UL, 16776960UL,
+ 16776960UL, 16776960UL, 16580352UL, 13369088UL, 13434624UL, 13958912UL,
+ 14024448UL, 14155008UL, 14024448UL, 14089984UL, 14745344UL, 15138560UL,
+ 6946560UL, 7143168UL, 8322816UL, 8322816UL, 8912640UL, 8912640UL,
+ 9895680UL, 12058368UL, 13238016UL, 1834752UL, 2621184UL, 3211008UL,
+ 3604224UL, 3800832UL, 3800832UL, 4194048UL, 6553344UL, 9895680UL,
+ 655104UL, 65280UL, 458496UL, 851712UL, 1048320UL, 1048320UL,
+ 1244928UL, 1441536UL, 4587264UL, 65280UL, 65280UL, 65280UL,
+ 65280UL, 65280UL, 65280UL, 65280UL, 65280UL, 63232UL,
+ 3782400UL, 1219584UL, 2006784UL, 4963584UL, 8506624UL, 16774400UL,
+ 16776960UL, 16776960UL, 16776960UL, 11651584UL, 12700160UL, 14796288UL,
+ 15911424UL, 16766976UL, 16774912UL, 16776960UL, 16776960UL, 16776960UL,
+ 15453952UL, 16764416UL, 16763904UL, 16765440UL, 16767488UL, 16772864UL,
+ 16776960UL, 16776960UL, 16776960UL, 16765440UL, 16764160UL, 16764160UL,
+ 16767232UL, 16765952UL, 16769536UL, 16775168UL, 16776960UL, 16776960UL,
+ 14144256UL, 14145792UL, 14603520UL, 14734336UL, 14470912UL, 14408448UL,
+ 14217728UL, 14810880UL, 14941952UL, 8319488UL, 9105920UL, 10087680UL,
+ 10086144UL, 9888000UL, 10081536UL, 10676736UL, 12450304UL, 13565696UL,
+ 2424576UL, 3407616UL, 4389376UL, 4779520UL, 4385536UL, 4972800UL,
+ 4775936UL, 6746880UL, 10091264UL, 655104UL, 458496UL, 851712UL,
+ 1438976UL, 1436928UL, 1435904UL, 1434112UL, 1630720UL, 5171712UL,
+ 65280UL, 65280UL, 65280UL, 65024UL, 62720UL, 60416UL,
+ 59136UL, 58368UL, 54784UL, 5923584UL, 2572032UL, 3949824UL,
+ 7495680UL, 13534976UL, 14788608UL, 16767744UL, 16774656UL, 16776960UL,
+ 12740864UL, 15236608UL, 16279808UL, 16675328UL, 16746240UL, 16760064UL,
+ 16767744UL, 16773888UL, 16776960UL, 16742400UL, 16748544UL, 16746240UL,
+ 16745472UL, 16747776UL, 16758528UL, 16766720UL, 16772864UL, 16776960UL,
+ 16749312UL, 16749312UL, 16747776UL, 16747008UL, 16749312UL, 16755456UL,
+ 16764160UL, 16770048UL, 16776960UL, 14592000UL, 15181824UL, 15501824UL,
+ 15307520UL, 14656000UL, 15178752UL, 15582208UL, 15784448UL, 15988992UL,
+ 10461696UL, 10665216UL, 10857984UL, 11248896UL, 10854144UL, 10062336UL,
+ 11056896UL, 12047104UL, 13300480UL, 3592192UL, 4772864UL, 5558016UL,
+ 5556992UL, 5359104UL, 5745408UL, 5545728UL, 6736640UL, 9691904UL,
+ 649216UL, 1041408UL, 1629184UL, 1824000UL, 1822208UL, 1819648UL,
+ 2013696UL, 2406912UL, 5164288UL, 64256UL, 63488UL, 60160UL,
+ 56832UL, 54528UL, 51968UL, 49664UL, 48384UL, 43008UL,
+ 9252096UL, 7671552UL, 10229760UL, 9054720UL, 12596736UL, 14838784UL,
+ 15632896UL, 16763648UL, 16769024UL, 13707008UL, 15477248UL, 16720896UL,
+ 16723200UL, 16726272UL, 16737024UL, 16750080UL, 16762880UL, 16767744UL,
+ 16725504UL, 16727808UL, 16730880UL, 16728576UL, 16730112UL, 16733184UL,
+ 16749312UL, 16762112UL, 16766208UL, 16731648UL, 16733184UL, 16732416UL,
+ 16730880UL, 16730880UL, 16732416UL, 16742400UL, 16759296UL, 16765696UL,
+ 15555840UL, 15815680UL, 15749376UL, 15618304UL, 15420160UL, 16275200UL,
+ 16673792UL, 16754688UL, 16764672UL, 11627520UL, 12019968UL, 12606720UL,
+ 12734720UL, 12211968UL, 11426304UL, 12212736UL, 13273600UL, 13682176UL,
+ 5332224UL, 5928960UL, 6124032UL, 6120960UL, 5922048UL, 5724672UL,
+ 5327616UL, 7307520UL, 8306688UL, 1024512UL, 1421568UL, 2009856UL,
+ 2400000UL, 2397696UL, 2195712UL, 2778624UL, 2777856UL, 4958208UL,
+ 52992UL, 52224UL, 50944UL, 49920UL, 46848UL, 39936UL,
+ 30720UL, 31488UL, 27648UL, 11013888UL, 11012352UL, 13373184UL,
+ 11802624UL, 10819584UL, 13840384UL, 15358464UL, 15886592UL, 16756992UL,
+ 14484992UL, 16713216UL, 16712448UL, 16713984UL, 16715520UL, 16719360UL,
+ 16732416UL, 16740096UL, 16751616UL, 16714752UL, 16716288UL, 16717056UL,
+ 16716288UL, 16717056UL, 16718592UL, 16728576UL, 16737792UL, 16747008UL,
+ 16718592UL, 16720128UL, 16719360UL, 16719360UL, 16718592UL, 16720128UL,
+ 16720128UL, 16733184UL, 16745472UL, 16590592UL, 16000000UL, 15868928UL,
+ 15737856UL, 15541248UL, 16720128UL, 16721664UL, 16727808UL, 16743168UL,
+ 12924416UL, 13120256UL, 13050880UL, 12986880UL, 12790272UL, 12723968UL,
+ 13313792UL, 13644544UL, 14643712UL, 6698496UL, 6699264UL, 7287552UL,
+ 7679232UL, 7087872UL, 6892032UL, 6498816UL, 7680000UL, 10641408UL,
+ 1779456UL, 2376192UL, 2571264UL, 2568960UL, 2567424UL, 2566656UL,
+ 2566656UL, 2170368UL, 3952896UL, 29952UL, 29184UL, 25344UL,
+ 23040UL, 21504UL, 18432UL, 16896UL, 15360UL, 15360UL,
+ 10420224UL, 13434880UL, 14551296UL, 14619136UL, 14818816UL, 15410944UL,
+ 15806464UL, 16070144UL, 16205056UL, 14614528UL, 16711680UL, 16711680UL,
+ 16711680UL, 16711680UL, 16713984UL, 16715520UL, 16721664UL, 16723200UL,
+ 16711680UL, 16711680UL, 16711680UL, 16711680UL, 16711680UL, 16711680UL,
+ 16711680UL, 16719360UL, 16718592UL, 16711680UL, 16711680UL, 16711680UL,
+ 16711680UL, 16711680UL, 16711680UL, 16711680UL, 16713984UL, 16716288UL,
+ 16711680UL, 16711680UL, 16711680UL, 16711680UL, 15533568UL, 16711680UL,
+ 16711680UL, 16711680UL, 16715520UL, 14024704UL, 13959168UL, 14221312UL,
+ 13437184UL, 13175808UL, 12651520UL, 13631488UL, 14352384UL, 14485760UL,
+ 7864320UL, 7274496UL, 8847360UL, 10027008UL, 8063232UL, 8064000UL,
+ 7080960UL, 9633792UL, 9830400UL, 2555904UL, 2555904UL, 2949120UL,
+ 3538944UL, 3932160UL, 3541248UL, 3345408UL, 3145728UL, 4915200UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL,
+};
+
+
+// 300x300x1, KCMY - Plain Draft, MLC Both
+
+uint32_t ulMapDJ3600_KCMY_3x3x1[ 9 * 9 * 9 ] =
+{
+4294967040UL, 4294967040UL, 4294967040UL, 4294967040UL, 2801794816UL, 1862270720UL,
+1157627648UL, 486080256UL, 16056064UL, 4294967040UL, 4294967040UL, 4294967040UL,
+4009754368UL, 2600468224UL, 1795161856UL, 1090518784UL, 418709248UL, 15531776UL,
+4294967040UL, 4294967040UL, 4294967040UL, 4294967040UL, 2264923904UL, 1291845376UL,
+ 720699136UL, 249233152UL, 14483200UL, 4290576128UL, 4291624704UL, 4294967040UL,
+4294967040UL, 3841982208UL, 1591017216UL, 717029120UL, 346881792UL, 11468544UL,
+4286643968UL, 4287168256UL, 4287692544UL, 4288741120UL, 4206952192UL, 2931752704UL,
+1251278592UL, 444399360UL, 8716032UL, 4284022528UL, 4283891456UL, 4283629312UL,
+4282711808UL, 4284153600UL, 2557542144UL, 1920270080UL, 744292096UL, 6356736UL,
+4281925376UL, 4281532160UL, 4280745728UL, 4279566080UL, 4279959296UL, 2418474752UL,
+1345781504UL, 808779520UL, 3735296UL, 4279959296UL, 4279828224UL, 4279041792UL,
+4278648576UL, 4278779648UL, 2819292928UL, 1410268928UL, 638910208UL, 1376000UL,
+4278255360UL, 4278255360UL, 4278255360UL, 4278255360UL, 4278255360UL, 3288399616UL,
+1946222336UL, 838926080UL, 65280UL, 4294967040UL, 4294967040UL, 4294967040UL,
+1962934016UL, 1157627648UL, 687865600UL, 452984576UL, 150798080UL, 16776960UL,
+4294967040UL, 4294967040UL, 4294967040UL, 2399141632UL, 1124073216UL, 183303936UL,
+ 13958912UL, 13041408UL, 12517120UL, 4294967040UL, 4294967040UL, 4294967040UL,
+1825636096UL, 717291264UL, 280690432UL, 11468544UL, 11337472UL, 11599616UL,
+4289920768UL, 4288347904UL, 4286906112UL, 3264413440UL, 1115488000UL, 444792576UL,
+ 42139392UL, 9109248UL, 9633536UL, 4286643968UL, 4283760384UL, 4281794304UL,
+3963420416UL, 1749483264UL, 810483456UL, 240582400UL, 6487808UL, 7274240UL,
+4284022528UL, 4280876800UL, 4280090368UL, 4280090368UL, 2451635968UL, 1076297472UL,
+ 539950848UL, 104529664UL, 5046016UL, 4281794304UL, 4279172864UL, 4279041792UL,
+4279041792UL, 3188522752UL, 1678704384UL, 672202496UL, 270073600UL, 2555648UL,
+4279959296UL, 4278253568UL, 4278384128UL, 4278386432UL, 3523411712UL, 2147680000UL,
+1074069248UL, 335871744UL, 458496UL, 4278255360UL, 4278250496UL, 4278251008UL,
+4278253568UL, 3791716096UL, 2617310976UL, 1543569152UL, 671153920UL, 65280UL,
+4294967040UL, 4294959616UL, 4294966784UL, 1627389696UL, 1023409920UL, 653721344UL,
+ 284491520UL, 183828224UL, 16776960UL, 4294967040UL, 4294967040UL, 4294967040UL,
+1022689024UL, 49610496UL, 16056064UL, 15793920UL, 14483200UL, 13958912UL,
+4294967040UL, 4294967040UL, 3938373632UL, 2260790784UL, 447676160UL, 10944256UL,
+ 10682112UL, 10682112UL, 10419968UL, 4289658624UL, 4288610048UL, 4284676096UL,
+2490687488UL, 846397184UL, 175570688UL, 8191744UL, 8978176UL, 9502464UL,
+4286381824UL, 4284546816UL, 4281270016UL, 3157589760UL, 1346174720UL, 507969280UL,
+ 72548096UL, 6356736UL, 7405312UL, 4284022528UL, 4281007872UL, 4279559168UL,
+3625511936UL, 1981611776UL, 908001024UL, 338231040UL, 3735296UL, 5046016UL,
+4281794304UL, 4279169536UL, 4278508032UL, 3960002560UL, 2517167616UL, 1343028992UL,
+ 537722624UL, 202964736UL, 2817792UL, 4279828224UL, 4278378496UL, 4278242816UL,
+4261466624UL, 3019955712UL, 1912664576UL, 973274880UL, 268631808UL, 851712UL,
+4278255360UL, 4278245888UL, 4278240768UL, 4278242816UL, 3321943552UL, 2315312640UL,
+1442902528UL, 570490624UL, 65280UL, 4294939136UL, 4294933504UL, 4294939648UL,
+3271535616UL, 1056957952UL, 586481408UL, 250937088UL, 116719360UL, 16776960UL,
+4294937600UL, 4294930432UL, 3909052928UL, 1190558208UL, 150255104UL, 16048640UL,
+ 16056064UL, 16056064UL, 15007488UL, 4294943744UL, 4294940160UL, 4073224192UL,
+2296154624UL, 417374208UL, 14073856UL, 13163520UL, 12514304UL, 11992832UL,
+4289769984UL, 4290034688UL, 4286087680UL, 2289598976UL, 1316788224UL, 74629632UL,
+ 7918592UL, 8185856UL, 8322816UL, 4286371328UL, 4285321216UL, 4281902080UL,
+3057426432UL, 1447858688UL, 373995008UL, 5555712UL, 6609920UL, 7271936UL,
+4283753984UL, 4281387008UL, 4280068608UL, 3658918912UL, 1880926720UL, 773897216UL,
+ 137024512UL, 4118528UL, 5171712UL, 4281788928UL, 4279549952UL, 4278889472UL,
+3758662656UL, 2316085760UL, 1242348032UL, 437045248UL, 102553600UL, 3331584UL,
+4279820800UL, 4278501376UL, 4278234112UL, 3993019392UL, 2717951488UL, 1811984384UL,
+ 906150912UL, 235063808UL, 1366528UL, 4278248960UL, 4278239232UL, 4278234624UL,
+4227900416UL, 3053496832UL, 2281744896UL, 1543548928UL, 637585408UL, 47616UL,
+4294924288UL, 4294918656UL, 4294918656UL, 2566875648UL, 1828680192UL, 754951168UL,
+ 250922496UL, 116710400UL, 16773632UL, 4294919680UL, 4294189056UL, 4294191104UL,
+1324627968UL, 317999616UL, 16024064UL, 16034304UL, 16040448UL, 16045568UL,
+4294200832UL, 4292358656UL, 4074518016UL, 1861499904UL, 452218368UL, 15626752UL,
+ 14455296UL, 14201856UL, 13814272UL, 4288965120UL, 4286071808UL, 4286071296UL,
+2256294912UL, 1384930304UL, 144075264UL, 10258432UL, 10396160UL, 9879552UL,
+4286480896UL, 4285562368UL, 4282405376UL, 2756466176UL, 1448237056UL, 710175232UL,
+ 5801984UL, 6330368UL, 6600192UL, 4283735552UL, 4281893376UL, 4280315392UL,
+3894308864UL, 1948675584UL, 909142016UL, 103974400UL, 4496384UL, 5551616UL,
+4281510400UL, 4279536128UL, 4279008256UL, 3926685184UL, 2349627392UL, 1242593280UL,
+ 437553152UL, 1875968UL, 3714048UL, 4279809024UL, 4278621696UL, 4278486528UL,
+4060249088UL, 2550298624UL, 1678014976UL, 939820544UL, 201625600UL, 1482240UL,
+4278237184UL, 4278231040UL, 4278226944UL, 4278224896UL, 2818605056UL, 2080406016UL,
+1476426752UL, 671126016UL, 36864UL, 4294915584UL, 4294912000UL, 4294908928UL,
+2566860288UL, 1358906368UL, 822036480UL, 452228608UL, 116690944UL, 16754688UL,
+4294914560UL, 4294186496UL, 4294184960UL, 1995707392UL, 452206080UL, 16003584UL,
+ 16016384UL, 16023040UL, 16028160UL, 4294914560UL, 4291957248UL, 4007006720UL,
+2297698816UL, 687087616UL, 16004096UL, 15752192UL, 14972416UL, 14978048UL,
+4289084928UL, 4286324224UL, 4286717440UL, 2290755072UL, 1050946048UL, 145502720UL,
+ 11162112UL, 11300864UL, 11308032UL, 4285682176UL, 4284365824UL, 4283313152UL,
+2656185344UL, 1381380096UL, 845167104UL, 74075648UL, 7629312UL, 8162304UL,
+4283718144UL, 4282010624UL, 4280694272UL, 3794286080UL, 1848653312UL, 842020352UL,
+ 406209536UL, 4614656UL, 5540352UL, 4281363968UL, 4279653376UL, 4279127040UL,
+4161817600UL, 2450542592UL, 1209547776UL, 471353344UL, 2516992UL, 3833856UL,
+4279663104UL, 4278609920UL, 4278476800UL, 4261698560UL, 2651085824UL, 1543787008UL,
+ 872698880UL, 168320512UL, 1733120UL, 4278224384UL, 4278220288UL, 4278218240UL,
+4278217216UL, 2885706752UL, 1744854016UL, 1342198784UL, 738223104UL, 25088UL,
+4294910464UL, 4294906880UL, 4294184448UL, 3539931648UL, 1358895616UL, 452926464UL,
+ 419375616UL, 183782912UL, 16740352UL, 4294909952UL, 4294182912UL, 4294181376UL,
+2901672448UL, 854853632UL, 15995904UL, 16001024UL, 16009728UL, 16014848UL,
+4294908928UL, 4293790720UL, 4293526528UL, 2733900800UL, 1022625280UL, 83104256UL,
+ 16001024UL, 16008704UL, 16013312UL, 4289602048UL, 4286580224UL, 4287235584UL,
+2694581248UL, 1387008000UL, 381556224UL, 12460544UL, 12206080UL, 12474368UL,
+4285672448UL, 4283307008UL, 4283568640UL, 2690126336UL, 1415451648UL, 711989760UL,
+ 108535808UL, 8403968UL, 9067520UL, 4282922496UL, 4281870336UL, 4281211392UL,
+2754615808UL, 1681135616UL, 842668032UL, 541204480UL, 5126144UL, 6315008UL,
+4281481216UL, 4279642112UL, 4279508992UL, 4162068480UL, 2417500160UL, 1243225088UL,
+ 437918720UL, 237383680UL, 3560448UL, 4279517696UL, 4278729216UL, 4278596608UL,
+4278596608UL, 2818979328UL, 1644573696UL, 738863104UL, 235678720UL, 1856000UL,
+4278211072UL, 4278209024UL, 4278207488UL, 4278207488UL, 2952806912UL, 1778401280UL,
+1006646784UL, 704657920UL, 15360UL, 4294906368UL, 4294312960UL, 4294182400UL,
+4176741888UL, 2197030912UL, 821955072UL, 218041856UL, 83103744UL, 16725504UL,
+4294839808UL, 4294180864UL, 4294180864UL, 3371433984UL, 1693712384UL, 351535104UL,
+ 15994368UL, 15997440UL, 16002048UL, 4294839808UL, 4293918720UL, 4293394432UL,
+3069313024UL, 1827930112UL, 552861696UL, 15993856UL, 15997440UL, 16001024UL,
+4289990656UL, 4289070080UL, 4289200640UL, 2896560640UL, 1890976256UL, 918684672UL,
+ 114296832UL, 13506048UL, 13772800UL, 4285797376UL, 4283695104UL, 4283826176UL,
+2724200448UL, 1449132032UL, 1047922688UL, 411437568UL, 9441792UL, 10233856UL,
+4282784256UL, 4281994752UL, 4164027904UL, 2822243840UL, 1648100864UL, 775947264UL,
+ 542247424UL, 39325696UL, 6958080UL, 4280818688UL, 4279504896UL, 4229303808UL,
+2887388672UL, 1780222976UL, 1008601600UL, 438438400UL, 271323136UL, 4073472UL,
+4279507456UL, 4278719488UL, 4278587904UL, 4261810176UL, 2751991808UL, 1678381056UL,
+ 738856448UL, 168430080UL, 1845248UL, 4278199808UL, 4278198272UL, 4278197248UL,
+4278197248UL, 3321896448UL, 2013274624UL, 1140859392UL, 469768704UL, 8704UL,
+4294901760UL, 4294901760UL, 4294901760UL, 4294901760UL, 3607035904UL, 1996423168UL,
+ 956235776UL, 385810432UL, 16711680UL, 4294901760UL, 4294180864UL, 4294180864UL,
+3706978304UL, 2499018752UL, 1223950336UL, 485752832UL, 83099648UL, 15990784UL,
+4294901760UL, 4293787648UL, 4293394432UL, 3337486336UL, 2465464320UL, 1593049088UL,
+ 552861696UL, 49545216UL, 15990784UL, 4291821568UL, 4289724416UL, 4289986560UL,
+3064725504UL, 2360868864UL, 1723858944UL, 852492288UL, 114950144UL, 14417920UL,
+4287234048UL, 4285923328UL, 4286054400UL, 3598581760UL, 1987969024UL, 1619263488UL,
+1049624576UL, 345899008UL, 10616832UL, 4283564032UL, 4282777600UL, 4283564032UL,
+3025010688UL, 1917452288UL, 1112145920UL, 978714624UL, 442892288UL, 7340032UL,
+4280942592UL, 4280025088UL, 4280811520UL, 2854354944UL, 1814167552UL, 1009123328UL,
+ 640417792UL, 473825280UL, 4456448UL, 4279107584UL, 4278583296UL, 4278452224UL,
+4278976512UL, 1946944512UL, 1141637632UL, 672399360UL, 336986112UL, 2490368UL,
+4278190080UL, 4278190080UL, 4278190080UL, 3791650816UL, 2684354560UL, 1879048192UL,
+1140850688UL, 436207616UL, 0UL,
+};
+
+// 300x300x1, ClMlxx - Plain Draft, MLC Both
+
+uint32_t ulMapDJ3600_ClMlxx_3x3x1[ 9 * 9 * 9 ] =
+{
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL,
+};
+APDK_END_NAMESPACE
+
+#endif
diff --git a/prnt/hpijs/dj400.h b/prnt/hpijs/dj400.h
new file mode 100644
index 0000000..85ae28f
--- /dev/null
+++ b/prnt/hpijs/dj400.h
@@ -0,0 +1,115 @@
+/*****************************************************************************\
+ dj400.h : Interface for the DJ400 class
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#ifndef APDK_DJ400_H
+#define APDK_DJ400_H
+
+APDK_BEGIN_NAMESPACE
+
+/*!
+\internal
+*/
+class DJ400 : public Printer
+{
+public:
+ DJ400(SystemServices* pSS,BOOL proto=FALSE);
+
+#if defined(APDK_FONTS_NEEDED)
+ Font* RealizeFont(const int index,const BYTE bSize,
+ const TEXTCOLOR eColor=BLACK_TEXT,
+ const BOOL bBold=FALSE,const BOOL bItalic=FALSE,
+ const BOOL bUnderline=FALSE);
+#endif
+ Header* SelectHeader(PrintContext* pc);
+ DRIVER_ERROR VerifyPenInfo();
+ virtual DRIVER_ERROR ParsePenInfo(PEN_TYPE& ePen, BOOL QueryPrinter=TRUE);
+ BOOL TopCoverOpen(BYTE status_reg);
+ DRIVER_ERROR CleanPen();
+ virtual DISPLAY_STATUS ParseError(BYTE status_reg);
+ virtual PEN_TYPE DefaultPenSet();
+ virtual BOOL GetMargins (PAPER_SIZE ps, float *fMargins)
+ {
+ if (ps == A4)
+ fMargins[0] = (float) 0.135;
+ else
+ fMargins[0] = (float) 0.25; // Left Margin
+ fMargins[1] = fMargins[0]; // Right Margin
+ fMargins[2] = (float) 0.125; // Top Margin
+ fMargins[3] = (float) 0.67; // Bottom Margin
+ return TRUE;
+ }
+
+protected:
+
+#ifdef APDK_HP_UX
+ virtual DJ400& operator = (Printer& rhs)
+ {
+ return *this;
+ }
+#endif
+
+ virtual DRIVER_ERROR GetC32Status(BYTE *pStatusString, int *pLen);
+ unsigned long last_C32_status; /* XXX unused? */
+
+}; //DJ400
+
+
+class Mode400 : public PrintMode
+{
+public:
+ Mode400();
+
+}; //Mode400
+
+#ifdef APDK_DJ400
+
+//! DJ400Proxy
+/*!
+******************************************************************************/
+class DJ400Proxy : public PrinterProxy
+{
+public:
+ DJ400Proxy() : PrinterProxy(
+ "DJ400", // family name
+ "HP DeskJet 4\0" // DeskJet 4xx Series
+#ifdef APDK_MLC_PRINTER
+#endif
+ ) {m_iPrinterType = eDJ400;}
+ inline Printer* CreatePrinter(SystemServices* pSS) const { return new DJ400(pSS); }
+ inline PRINTER_TYPE GetPrinterType() const { return eDJ400;}
+ inline unsigned int GetModelBit() const { return 0x800000;}
+};
+
+#endif
+
+APDK_END_NAMESPACE
+
+#endif //APDK_DJ400_H
diff --git a/prnt/hpijs/dj4100.h b/prnt/hpijs/dj4100.h
new file mode 100644
index 0000000..895265c
--- /dev/null
+++ b/prnt/hpijs/dj4100.h
@@ -0,0 +1,115 @@
+/*****************************************************************************\
+ dj4100.h : Interface for the DJ4100 printer class
+
+ Copyright (c) 2003 - 2006, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#ifndef APDK_DJ4100_H
+#define APDK_DJ4100_H
+#if defined(APDK_DJ3600) && defined (APDK_DJ3320)
+
+APDK_BEGIN_NAMESPACE
+extern unsigned char ucMapDJ4100_KCMY_6x6x1[];
+extern unsigned char ucMapDJ4100_KCMY_Photo_BestV_12x12x1[];
+extern unsigned char ucMapDJ4100_KCMY_Photo_BestA_12x12x1[];
+extern BYTE *GetHT12x12x1_4100_Photo_Best ();
+//DJ4100
+//!
+/*!
+\internal
+******************************************************************************/
+class DJ4100 : public DJ3600
+{
+public:
+ DJ4100 (SystemServices* pSS, BOOL proto = FALSE) : DJ3600 (pSS, proto)
+ {
+ m_iBytesPerSwing = 4;
+ m_iLdlVersion = 2;
+ m_iColorPenResolution = 600;
+ AdjustResolution ();
+ if (ePen == BOTH_PENS)
+ {
+ pMode[DEFAULTMODE_INDEX]->cmap.ulMap1 =
+ pMode[DEFAULTMODE_INDEX]->cmap.ulMap2 = NULL;
+ pMode[DEFAULTMODE_INDEX]->cmap.ulMap3 = (unsigned char *) ucMapDJ4100_KCMY_6x6x1;
+
+ pMode[SPECIALMODE_INDEX]->cmap.ulMap1 =
+ pMode[SPECIALMODE_INDEX]->cmap.ulMap2 = NULL;
+ pMode[SPECIALMODE_INDEX]->cmap.ulMap3 = (unsigned char *) ucMapDJ4100_KCMY_Photo_BestA_12x12x1;
+ pMode[SPECIALMODE_INDEX]->ColorFEDTable = GetHT12x12x1_4100_Photo_Best ();
+ }
+ }
+ virtual void AdjustResolution ()
+ {
+ for (int i = 0; i < (int) ModeCount; i++)
+ {
+ if (pMode[i] && pMode[i]->ResolutionX[0] == 300)
+ {
+ for (int j = 0; j < 4; j++)
+ {
+ pMode[i]->ResolutionX[j] =
+ pMode[i]->ResolutionY[j] = 600;
+ }
+ pMode[i]->BaseResX =
+ pMode[i]->BaseResY = 600;
+ }
+ }
+
+ }
+}; //DJ4100
+
+
+#if defined(APDK_DJ3600) && defined (APDK_DJ3320)
+//! DJ4100Proxy
+/*!
+******************************************************************************/
+class DJ4100Proxy : public PrinterProxy
+{
+public:
+ DJ4100Proxy() : PrinterProxy(
+ "DJ4100", // family name
+ "Deskjet D4100\0" // DeskJet 4100
+ "Deskjet D4160\0"
+ "Deskjet D42\0"
+ "Deskjet D43\0"
+ "Deskjet D16\0"
+ "Deskjet D26\0"
+ "Deskjet Ink Advant K109\0"
+ "Deskjet Ink Advant K209\0"
+ ) {m_iPrinterType = eDJ4100;}
+ inline Printer* CreatePrinter(SystemServices* pSS) const { return new DJ4100(pSS); }
+ inline PRINTER_TYPE GetPrinterType() const { return eDJ4100;}
+ inline unsigned int GetModelBit() const { return 0x2;}
+};
+#endif
+
+APDK_END_NAMESPACE
+
+#endif // defined(APDK_DJ3600) && defined (APDK_DJ3320)
+
+#endif // APDK_DJ4100_H
diff --git a/prnt/hpijs/dj4100_cmap.cpp b/prnt/hpijs/dj4100_cmap.cpp
new file mode 100644
index 0000000..1404c69
--- /dev/null
+++ b/prnt/hpijs/dj4100_cmap.cpp
@@ -0,0 +1,3579 @@
+/*****************************************************************************\
+ dj4100_cmap.cpp : Implimentation for the DJ4100 color maps
+
+ Copyright (c) 1996 - 2006, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ \***************************************************************************/
+
+
+#ifdef APDK_DJ3600
+
+#include "config.h"
+
+#include "global_types.h"
+
+APDK_BEGIN_NAMESPACE
+
+// 600x600x1, KCMY - Plain Normal
+
+unsigned char ucMapDJ4100_KCMY_6x6x1[] =
+{
+ 195, 37, 28, 16, 151, 131, 67, 9, 110, 219, 103, 2, 94, 238, 102, 0, 76, 243, 93, 0, 60, 245, 90, 0, 49, 246, 89, 0,
+ 42, 247, 86, 0, 35, 248, 84, 0, 30, 249, 81, 0, 25, 250, 79, 0, 21, 250, 78, 0, 17, 251, 77, 0, 12, 252, 74, 0,
+ 8, 253, 72, 0, 4, 254, 71, 0, 0, 255, 70, 0, 148, 130, 14, 114, 99, 232, 30, 0, 102, 236, 109, 0, 87, 240, 103, 0,
+ 68, 244, 102, 0, 55, 246, 97, 0, 47, 246, 95, 0, 40, 247, 91, 0, 34, 248, 87, 0, 29, 249, 84, 0, 25, 250, 81, 0,
+ 21, 250, 80, 0, 17, 251, 78, 0, 13, 252, 76, 0, 9, 253, 73, 0, 5, 254, 71, 0, 0, 254, 69, 0, 101, 222, 1, 210,
+ 98, 220, 1, 117, 83, 237, 30, 0, 77, 241, 68, 0, 63, 244, 90, 0, 53, 246, 96, 0, 44, 247, 96, 0, 38, 248, 93, 0,
+ 32, 248, 89, 0, 28, 249, 86, 0, 24, 250, 84, 0, 20, 250, 81, 0, 17, 251, 80, 0, 13, 252, 77, 0, 9, 253, 74, 0,
+ 5, 253, 71, 0, 0, 253, 68, 0, 85, 224, 0, 211, 81, 227, 0, 145, 76, 233, 0, 54, 67, 239, 22, 0, 56, 243, 52, 0,
+ 45, 246, 68, 0, 38, 247, 78, 0, 33, 248, 82, 0, 29, 249, 83, 0, 25, 250, 84, 0, 22, 250, 84, 0, 18, 251, 82, 0,
+ 15, 252, 79, 0, 11, 252, 76, 0, 8, 253, 72, 0, 4, 254, 70, 0, 0, 253, 66, 0, 66, 224, 1, 218, 64, 227, 0, 178,
+ 61, 233, 0, 114, 59, 237, 0, 40, 52, 243, 16, 0, 41, 246, 35, 0, 33, 248, 49, 0, 28, 249, 58, 0, 24, 250, 64, 0,
+ 21, 250, 68, 0, 18, 251, 72, 0, 16, 251, 72, 0, 12, 252, 71, 0, 9, 253, 69, 0, 6, 253, 67, 0, 3, 254, 65, 0,
+ 0, 250, 62, 0, 49, 226, 0, 228, 49, 226, 1, 200, 45, 233, 0, 152, 43, 237, 0, 88, 43, 242, 0, 30, 38, 246, 11, 0,
+ 30, 248, 24, 0, 25, 249, 35, 0, 20, 250, 45, 0, 17, 251, 52, 0, 15, 252, 57, 0, 12, 252, 59, 0, 10, 253, 60, 0,
+ 7, 253, 60, 0, 4, 253, 60, 0, 1, 251, 59, 0, 0, 240, 56, 0, 36, 227, 0, 237, 36, 225, 1, 217, 33, 232, 0, 183,
+ 32, 236, 0, 129, 31, 241, 0, 71, 31, 245, 0, 26, 28, 248, 7, 0, 23, 249, 16, 0, 19, 250, 25, 0, 15, 251, 34, 0,
+ 12, 252, 42, 0, 9, 252, 47, 0, 6, 252, 50, 0, 4, 249, 51, 0, 2, 245, 52, 0, 0, 238, 53, 2, 0, 225, 50, 0,
+ 26, 226, 1, 246, 27, 227, 0, 234, 26, 228, 0, 208, 24, 234, 0, 164, 23, 239, 0, 108, 23, 244, 0, 60, 23, 247, 0, 22,
+ 21, 250, 3, 0, 17, 251, 11, 0, 14, 252, 19, 0, 10, 252, 27, 0, 6, 250, 37, 3, 1, 242, 46, 8, 0, 233, 48, 7,
+ 0, 224, 47, 5, 0, 217, 46, 2, 0, 209, 44, 0, 17, 220, 4, 249, 18, 227, 2, 246, 19, 227, 1, 228, 17, 233, 0, 194,
+ 16, 237, 0, 144, 16, 241, 0, 93, 16, 245, 0, 51, 16, 249, 0, 21, 15, 251, 1, 0, 12, 252, 7, 0, 9, 251, 16, 2,
+ 4, 247, 27, 7, 0, 234, 36, 10, 0, 223, 38, 7, 0, 213, 39, 4, 0, 204, 39, 2, 0, 196, 38, 0, 10, 214, 7, 249,
+ 10, 220, 5, 249, 12, 228, 2, 241, 12, 230, 1, 214, 10, 234, 1, 177, 9, 237, 3, 127, 10, 242, 3, 81, 11, 247, 0, 45,
+ 11, 250, 0, 20, 11, 252, 0, 0, 6, 247, 11, 6, 1, 242, 20, 10, 0, 230, 25, 9, 0, 220, 28, 6, 0, 210, 30, 4,
+ 0, 199, 32, 2, 0, 188, 32, 0, 5, 212, 9, 250, 5, 216, 7, 250, 7, 224, 4, 247, 9, 228, 1, 227, 8, 233, 0, 199,
+ 7, 235, 2, 158, 7, 239, 3, 112, 8, 245, 1, 71, 9, 249, 0, 40, 9, 251, 0, 18, 9, 253, 0, 0, 1, 243, 14, 10,
+ 0, 230, 17, 8, 0, 219, 20, 5, 0, 209, 23, 3, 0, 198, 25, 2, 0, 186, 26, 0, 2, 212, 10, 250, 3, 215, 8, 250,
+ 4, 221, 5, 249, 7, 228, 1, 241, 7, 231, 0, 216, 7, 234, 0, 184, 6, 237, 2, 142, 6, 242, 2, 98, 7, 247, 0, 63,
+ 7, 250, 0, 36, 8, 251, 0, 17, 8, 253, 0, 0, 0, 240, 13, 10, 0, 224, 14, 6, 0, 211, 16, 3, 0, 199, 19, 1,
+ 0, 186, 21, 0, 1, 213, 9, 250, 1, 215, 7, 250, 3, 219, 5, 250, 5, 226, 1, 248, 6, 229, 0, 230, 5, 233, 0, 205,
+ 5, 234, 0, 167, 6, 238, 0, 123, 6, 244, 0, 85, 6, 248, 0, 56, 6, 250, 0, 34, 6, 252, 0, 16, 6, 253, 0, 0,
+ 0, 237, 11, 7, 0, 218, 12, 3, 0, 202, 14, 1, 0, 189, 16, 0, 1, 215, 6, 250, 2, 217, 5, 250, 2, 219, 3, 250,
+ 4, 224, 0, 249, 4, 229, 0, 242, 4, 231, 0, 218, 4, 233, 0, 189, 4, 236, 0, 149, 4, 240, 0, 109, 4, 245, 0, 77,
+ 4, 249, 0, 51, 4, 251, 0, 31, 4, 252, 0, 15, 5, 254, 0, 0, 0, 233, 9, 5, 0, 212, 10, 2, 0, 194, 12, 0,
+ 1, 217, 3, 250, 2, 218, 2, 250, 2, 220, 1, 250, 3, 223, 0, 250, 2, 228, 0, 247, 3, 229, 0, 227, 2, 231, 0, 204,
+ 3, 233, 0, 172, 3, 237, 0, 133, 3, 242, 0, 99, 3, 247, 0, 70, 3, 249, 0, 47, 3, 251, 0, 29, 3, 253, 0, 14,
+ 3, 254, 0, 0, 0, 228, 7, 2, 0, 204, 8, 0, 1, 220, 0, 250, 2, 220, 0, 250, 2, 220, 0, 250, 1, 222, 0, 250,
+ 1, 225, 0, 247, 1, 226, 0, 232, 1, 228, 0, 213, 1, 230, 0, 188, 1, 234, 0, 156, 1, 239, 0, 120, 1, 243, 0, 90,
+ 1, 247, 0, 65, 1, 250, 0, 44, 1, 252, 0, 28, 1, 253, 0, 14, 2, 255, 0, 0, 0, 224, 5, 0, 0, 221, 0, 250,
+ 0, 221, 0, 250, 0, 221, 0, 250, 0, 221, 0, 250, 0, 221, 0, 244, 0, 222, 0, 234, 0, 224, 0, 219, 0, 227, 0, 200,
+ 0, 230, 0, 175, 0, 235, 0, 142, 0, 240, 0, 110, 0, 243, 0, 83, 0, 247, 0, 60, 0, 249, 0, 42, 0, 251, 0, 27,
+ 0, 254, 0, 14, 0, 255, 0, 0, 170, 27, 82, 59, 147, 60, 128, 8, 114, 177, 177, 2, 92, 230, 175, 2, 76, 237, 152, 2,
+ 59, 243, 141, 1, 49, 248, 135, 0, 40, 249, 128, 0, 32, 250, 124, 0, 28, 250, 115, 0, 24, 250, 106, 0, 19, 251, 99, 0,
+ 15, 252, 93, 0, 11, 252, 86, 0, 7, 253, 80, 0, 3, 253, 76, 0, 0, 249, 72, 0, 149, 27, 14, 130, 146, 49, 33, 18,
+ 93, 238, 108, 0, 79, 239, 118, 1, 68, 245, 117, 0, 61, 246, 114, 0, 52, 247, 107, 0, 43, 247, 101, 0, 35, 248, 95, 0,
+ 29, 249, 88, 0, 24, 250, 84, 0, 19, 251, 81, 0, 15, 252, 78, 0, 11, 252, 74, 0, 7, 253, 72, 0, 3, 253, 70, 0,
+ 0, 241, 66, 0, 105, 173, 2, 232, 100, 224, 0, 209, 91, 185, 11, 13, 73, 235, 69, 1, 62, 244, 91, 0, 54, 246, 96, 0,
+ 46, 247, 94, 0, 39, 247, 90, 0, 32, 248, 85, 0, 27, 249, 81, 0, 23, 250, 78, 0, 18, 251, 76, 0, 14, 252, 74, 0,
+ 10, 253, 72, 0, 6, 253, 70, 0, 3, 253, 69, 0, 0, 243, 67, 0, 81, 210, 2, 240, 80, 219, 2, 196, 74, 224, 2, 95,
+ 72, 219, 5, 8, 56, 238, 42, 2, 46, 245, 64, 0, 38, 247, 73, 0, 32, 248, 78, 0, 27, 249, 79, 0, 23, 250, 78, 0,
+ 20, 251, 77, 0, 16, 251, 75, 0, 12, 252, 73, 0, 9, 253, 71, 0, 5, 254, 70, 0, 2, 253, 68, 0, 0, 242, 65, 0,
+ 60, 221, 2, 243, 62, 223, 1, 217, 58, 231, 0, 155, 56, 228, 3, 74, 55, 222, 5, 14, 43, 241, 25, 1, 33, 247, 43, 0,
+ 28, 249, 54, 0, 24, 250, 60, 0, 20, 250, 64, 0, 16, 251, 67, 0, 13, 252, 68, 0, 10, 253, 67, 0, 7, 253, 66, 0,
+ 4, 254, 66, 0, 1, 252, 64, 0, 0, 238, 61, 0, 44, 225, 1, 242, 46, 225, 1, 229, 44, 229, 0, 188, 41, 235, 0, 124,
+ 40, 236, 1, 57, 39, 241, 1, 13, 33, 247, 13, 0, 26, 249, 28, 0, 20, 250, 40, 0, 17, 251, 47, 0, 13, 252, 52, 0,
+ 11, 252, 55, 0, 8, 253, 56, 0, 5, 254, 58, 0, 2, 253, 58, 0, 0, 247, 57, 0, 0, 229, 55, 0, 32, 226, 1, 246,
+ 33, 227, 1, 238, 34, 226, 1, 211, 31, 234, 0, 163, 29, 239, 0, 100, 29, 243, 0, 47, 29, 246, 0, 14, 26, 248, 5, 0,
+ 20, 250, 18, 0, 15, 251, 29, 0, 11, 252, 37, 0, 8, 253, 43, 0, 5, 254, 46, 0, 2, 253, 49, 0, 1, 249, 50, 0,
+ 0, 235, 50, 0, 0, 217, 50, 0, 24, 221, 3, 249, 24, 227, 1, 246, 26, 227, 1, 229, 23, 232, 0, 193, 22, 237, 0, 139,
+ 22, 242, 0, 84, 21, 246, 0, 42, 21, 248, 0, 16, 21, 249, 1, 1, 15, 250, 12, 0, 10, 252, 22, 1, 6, 252, 30, 0,
+ 3, 249, 36, 0, 1, 243, 40, 0, 0, 231, 42, 1, 0, 218, 42, 0, 0, 206, 44, 0, 16, 214, 7, 249, 17, 222, 4, 249,
+ 17, 228, 1, 242, 18, 228, 1, 217, 16, 234, 0, 176, 15, 240, 0, 120, 15, 244, 0, 72, 15, 247, 0, 37, 14, 249, 0, 18,
+ 13, 248, 2, 6, 9, 249, 11, 4, 5, 249, 19, 4, 1, 241, 28, 5, 0, 229, 32, 3, 0, 216, 34, 1, 0, 205, 35, 0,
+ 0, 193, 38, 0, 7, 207, 11, 250, 9, 215, 7, 250, 10, 224, 3, 248, 12, 228, 1, 229, 10, 233, 0, 199, 9, 237, 0, 153,
+ 9, 242, 0, 103, 9, 246, 1, 63, 8, 247, 2, 36, 8, 249, 2, 19, 6, 244, 7, 13, 1, 241, 16, 13, 0, 236, 20, 9,
+ 0, 225, 23, 4, 0, 212, 25, 1, 0, 198, 28, 0, 0, 181, 32, 0, 4, 205, 10, 250, 2, 209, 10, 250, 3, 217, 7, 250,
+ 7, 228, 0, 243, 6, 231, 0, 217, 5, 235, 0, 183, 5, 239, 0, 134, 5, 241, 0, 87, 4, 243, 2, 55, 3, 243, 4, 34,
+ 3, 244, 4, 19, 0, 236, 11, 17, 0, 229, 13, 10, 0, 220, 15, 5, 0, 211, 18, 1, 0, 197, 22, 0, 0, 179, 26, 0,
+ 2, 204, 10, 250, 0, 207, 8, 250, 0, 213, 6, 250, 3, 224, 0, 249, 3, 229, 0, 233, 2, 233, 0, 205, 2, 233, 0, 161,
+ 3, 233, 0, 110, 2, 236, 2, 74, 1, 237, 4, 50, 1, 238, 5, 31, 1, 239, 5, 19, 0, 228, 7, 12, 0, 217, 9, 6,
+ 0, 208, 12, 2, 0, 197, 16, 0, 0, 180, 21, 0, 0, 205, 10, 250, 0, 207, 4, 250, 0, 212, 3, 250, 1, 219, 0, 248,
+ 1, 223, 0, 236, 1, 225, 0, 211, 1, 225, 0, 177, 0, 227, 1, 132, 0, 229, 2, 94, 0, 231, 3, 65, 0, 231, 4, 42,
+ 0, 234, 3, 27, 0, 235, 3, 15, 0, 221, 5, 8, 0, 208, 7, 4, 0, 197, 10, 1, 0, 182, 16, 0, 0, 206, 7, 250,
+ 0, 207, 2, 249, 0, 209, 1, 246, 0, 211, 1, 241, 0, 214, 0, 230, 0, 214, 1, 209, 0, 214, 1, 183, 0, 218, 1, 145,
+ 0, 221, 1, 107, 0, 225, 1, 78, 0, 227, 2, 55, 0, 228, 2, 36, 0, 231, 1, 22, 0, 230, 1, 11, 0, 215, 4, 5,
+ 0, 200, 6, 2, 0, 186, 11, 0, 0, 209, 5, 250, 0, 203, 1, 242, 0, 203, 0, 237, 0, 204, 0, 232, 0, 206, 0, 224,
+ 0, 205, 0, 208, 0, 206, 0, 186, 0, 210, 0, 155, 0, 214, 0, 121, 0, 218, 0, 92, 0, 222, 0, 67, 0, 224, 1, 47,
+ 0, 226, 0, 31, 0, 228, 0, 18, 0, 226, 1, 8, 0, 209, 4, 3, 0, 194, 8, 0, 0, 211, 2, 250, 0, 201, 0, 237,
+ 0, 199, 0, 231, 0, 200, 0, 227, 0, 201, 0, 220, 0, 200, 0, 207, 0, 201, 0, 189, 0, 204, 0, 164, 0, 209, 0, 134,
+ 0, 213, 0, 105, 0, 218, 0, 80, 0, 221, 0, 60, 0, 223, 0, 41, 0, 226, 0, 27, 0, 228, 0, 15, 0, 225, 1, 5,
+ 0, 208, 6, 0, 0, 214, 0, 250, 0, 207, 0, 229, 0, 207, 0, 228, 0, 207, 0, 225, 0, 207, 0, 220, 0, 207, 0, 210,
+ 0, 207, 0, 195, 0, 209, 0, 175, 0, 214, 0, 149, 0, 218, 0, 121, 0, 224, 0, 95, 0, 229, 0, 72, 0, 231, 0, 54,
+ 0, 234, 0, 36, 0, 236, 0, 23, 0, 237, 0, 12, 0, 239, 0, 0, 145, 17, 135, 102, 131, 12, 166, 60, 101, 79, 222, 0,
+ 89, 147, 211, 0, 71, 193, 198, 1, 53, 222, 192, 2, 42, 242, 185, 3, 37, 243, 168, 2, 29, 249, 155, 1, 25, 251, 145, 0,
+ 22, 251, 130, 0, 18, 251, 117, 0, 14, 252, 106, 0, 9, 253, 97, 0, 5, 253, 88, 0, 2, 250, 81, 0, 0, 240, 74, 0,
+ 132, 13, 84, 167, 118, 26, 128, 92, 92, 123, 164, 6, 71, 196, 178, 5, 59, 236, 179, 3, 53, 241, 169, 2, 44, 246, 155, 1,
+ 36, 250, 140, 0, 30, 250, 127, 0, 25, 250, 117, 0, 20, 251, 108, 0, 16, 251, 100, 0, 12, 252, 92, 0, 8, 253, 85, 0,
+ 4, 254, 80, 0, 1, 251, 76, 0, 0, 232, 69, 0, 104, 14, 1, 239, 101, 24, 12, 186, 83, 65, 40, 24, 65, 189, 84, 11,
+ 51, 238, 105, 3, 44, 246, 107, 1, 38, 248, 103, 0, 32, 249, 97, 0, 27, 249, 91, 0, 22, 250, 86, 0, 18, 251, 83, 0,
+ 14, 252, 79, 0, 10, 253, 76, 0, 6, 253, 73, 0, 3, 253, 71, 0, 1, 249, 69, 0, 0, 227, 62, 0, 79, 114, 7, 248,
+ 76, 143, 8, 228, 70, 157, 19, 120, 69, 145, 24, 26, 50, 211, 57, 11, 39, 243, 71, 2, 32, 248, 78, 0, 27, 249, 78, 0,
+ 23, 250, 77, 0, 19, 251, 76, 0, 15, 251, 74, 0, 12, 252, 72, 0, 8, 253, 70, 0, 5, 254, 69, 0, 2, 253, 68, 0,
+ 0, 245, 66, 0, 0, 225, 62, 0, 57, 166, 10, 248, 57, 197, 6, 242, 56, 209, 6, 194, 52, 191, 14, 95, 51, 168, 21, 28,
+ 40, 219, 37, 10, 29, 245, 48, 1, 24, 249, 58, 0, 19, 251, 64, 0, 15, 251, 68, 0, 11, 252, 69, 0, 8, 253, 69, 0,
+ 5, 254, 68, 0, 3, 253, 68, 0, 1, 249, 66, 0, 0, 237, 63, 0, 0, 220, 59, 0, 41, 197, 8, 248, 42, 213, 4, 245,
+ 43, 223, 2, 224, 39, 227, 3, 155, 38, 209, 13, 75, 39, 207, 11, 23, 31, 240, 16, 2, 23, 247, 30, 1, 18, 250, 42, 0,
+ 13, 251, 50, 0, 10, 253, 54, 0, 7, 253, 57, 0, 4, 253, 59, 0, 1, 251, 60, 0, 0, 243, 58, 0, 0, 231, 56, 0,
+ 0, 214, 55, 0, 29, 209, 7, 248, 30, 218, 4, 247, 31, 225, 1, 237, 29, 231, 0, 191, 28, 234, 1, 120, 28, 235, 2, 57,
+ 27, 240, 2, 20, 25, 245, 6, 2, 18, 248, 20, 1, 12, 250, 31, 2, 8, 251, 40, 2, 5, 252, 44, 0, 2, 252, 48, 0,
+ 0, 247, 50, 0, 0, 234, 50, 0, 0, 220, 49, 0, 0, 207, 50, 0, 21, 209, 8, 249, 22, 216, 5, 249, 23, 226, 1, 245,
+ 24, 227, 1, 214, 21, 235, 0, 161, 20, 239, 0, 96, 20, 242, 1, 49, 20, 244, 1, 21, 18, 243, 4, 5, 13, 245, 15, 3,
+ 6, 246, 28, 7, 2, 243, 36, 7, 0, 239, 40, 5, 0, 233, 41, 1, 0, 220, 41, 0, 0, 210, 42, 0, 0, 200, 44, 0,
+ 13, 204, 11, 249, 14, 212, 8, 249, 16, 223, 3, 248, 17, 227, 1, 230, 15, 233, 0, 193, 14, 237, 0, 135, 14, 239, 1, 80,
+ 14, 241, 2, 43, 13, 241, 3, 23, 10, 239, 9, 13, 4, 238, 18, 13, 0, 238, 27, 12, 0, 229, 29, 6, 0, 219, 31, 2,
+ 0, 209, 33, 0, 0, 200, 35, 0, 0, 187, 38, 0, 5, 201, 15, 250, 6, 207, 12, 250, 8, 217, 7, 249, 10, 228, 2, 240,
+ 10, 231, 0, 211, 8, 235, 1, 168, 7, 238, 4, 114, 6, 239, 7, 73, 6, 238, 8, 44, 5, 239, 9, 27, 3, 234, 12, 18,
+ 1, 231, 17, 14, 0, 227, 20, 8, 0, 217, 22, 3, 0, 205, 25, 0, 0, 191, 28, 0, 0, 172, 31, 0, 1, 198, 14, 250,
+ 3, 203, 10, 250, 1, 211, 10, 250, 5, 225, 1, 248, 6, 229, 0, 226, 4, 233, 0, 193, 4, 233, 1, 140, 1, 233, 7, 97,
+ 0, 234, 10, 65, 0, 233, 10, 42, 0, 235, 9, 27, 0, 228, 11, 18, 0, 221, 12, 10, 0, 215, 14, 4, 0, 205, 17, 1,
+ 0, 189, 21, 0, 0, 168, 25, 0, 0, 196, 13, 250, 0, 200, 8, 250, 0, 209, 5, 250, 2, 220, 0, 249, 1, 228, 0, 239,
+ 1, 229, 0, 209, 1, 225, 1, 161, 0, 224, 3, 112, 0, 225, 4, 77, 0, 226, 5, 52, 0, 227, 5, 33, 0, 229, 4, 20,
+ 0, 219, 6, 12, 0, 211, 8, 6, 0, 202, 11, 2, 0, 190, 15, 0, 0, 170, 20, 0, 0, 196, 11, 250, 0, 199, 4, 250,
+ 0, 206, 1, 248, 0, 210, 0, 239, 0, 212, 0, 225, 0, 211, 0, 202, 0, 211, 0, 168, 0, 214, 0, 126, 0, 217, 1, 91,
+ 0, 219, 1, 63, 0, 218, 2, 41, 0, 222, 2, 26, 0, 222, 1, 15, 0, 211, 4, 8, 0, 200, 5, 3, 0, 190, 9, 1,
+ 0, 174, 15, 0, 0, 197, 8, 250, 0, 197, 1, 248, 0, 195, 0, 236, 0, 196, 0, 225, 0, 197, 0, 212, 0, 195, 0, 193,
+ 0, 196, 0, 167, 0, 200, 0, 133, 0, 204, 0, 101, 0, 209, 0, 74, 0, 211, 0, 53, 0, 213, 0, 34, 0, 215, 0, 22,
+ 0, 214, 0, 11, 0, 202, 2, 5, 0, 191, 5, 2, 0, 178, 11, 0, 0, 200, 5, 250, 0, 192, 0, 241, 0, 182, 0, 224,
+ 0, 182, 0, 213, 0, 182, 0, 203, 0, 182, 0, 187, 0, 183, 0, 165, 0, 188, 0, 136, 0, 192, 0, 108, 0, 197, 0, 84,
+ 0, 202, 0, 62, 0, 204, 0, 43, 0, 207, 0, 29, 0, 209, 0, 18, 0, 207, 0, 9, 0, 195, 2, 3, 0, 184, 8, 0,
+ 0, 202, 2, 250, 0, 188, 0, 234, 0, 175, 0, 212, 0, 173, 0, 201, 0, 173, 0, 193, 0, 173, 0, 181, 0, 175, 0, 162,
+ 0, 180, 0, 138, 0, 185, 0, 114, 0, 190, 0, 92, 0, 196, 0, 71, 0, 199, 0, 53, 0, 202, 0, 36, 0, 204, 0, 25,
+ 0, 206, 0, 14, 0, 204, 1, 5, 0, 195, 6, 0, 0, 205, 0, 251, 0, 199, 0, 230, 0, 190, 0, 208, 0, 190, 0, 204,
+ 0, 190, 0, 197, 0, 189, 0, 188, 0, 189, 0, 173, 0, 192, 0, 152, 0, 197, 0, 128, 0, 202, 0, 105, 0, 208, 0, 84,
+ 0, 213, 0, 65, 0, 215, 0, 49, 0, 218, 0, 33, 0, 221, 0, 21, 0, 222, 0, 10, 0, 224, 0, 0, 100, 0, 225, 205,
+ 100, 1, 225, 135, 93, 1, 235, 24, 80, 51, 233, 0, 62, 117, 223, 0, 45, 162, 215, 0, 35, 190, 210, 0, 28, 213, 201, 2,
+ 20, 232, 194, 4, 14, 247, 188, 5, 13, 249, 168, 3, 10, 250, 149, 3, 7, 250, 131, 3, 5, 250, 114, 1, 3, 246, 101, 0,
+ 0, 239, 89, 2, 0, 229, 78, 0, 100, 5, 137, 225, 91, 19, 169, 155, 86, 24, 165, 41, 70, 75, 215, 3, 50, 164, 213, 0,
+ 41, 205, 203, 1, 33, 228, 197, 1, 23, 246, 193, 4, 21, 246, 176, 3, 16, 252, 159, 0, 13, 252, 142, 0, 10, 253, 127, 0,
+ 7, 253, 112, 0, 4, 253, 101, 0, 1, 250, 91, 0, 0, 240, 81, 0, 0, 222, 73, 0, 88, 13, 48, 221, 85, 26, 70, 173,
+ 76, 53, 77, 76, 64, 86, 115, 22, 38, 183, 169, 13, 25, 229, 179, 10, 22, 243, 176, 4, 18, 249, 163, 2, 15, 251, 147, 1,
+ 13, 252, 133, 0, 10, 252, 119, 1, 7, 252, 108, 1, 4, 252, 98, 0, 1, 251, 90, 0, 0, 243, 81, 0, 0, 232, 74, 0,
+ 0, 215, 68, 0, 71, 37, 21, 250, 71, 42, 24, 223, 63, 74, 41, 115, 61, 74, 45, 37, 42, 161, 78, 27, 28, 226, 94, 13,
+ 23, 244, 94, 2, 19, 247, 92, 1, 16, 249, 88, 1, 12, 250, 85, 2, 9, 251, 81, 2, 6, 251, 77, 2, 4, 251, 73, 0,
+ 1, 250, 71, 0, 0, 240, 68, 0, 0, 227, 63, 0, 0, 211, 58, 0, 50, 104, 25, 249, 52, 120, 21, 245, 49, 135, 24, 196,
+ 48, 134, 30, 107, 48, 124, 35, 40, 33, 185, 57, 25, 24, 227, 62, 7, 18, 244, 70, 1, 12, 250, 72, 2, 9, 252, 70, 0,
+ 7, 253, 69, 0, 4, 254, 69, 0, 2, 251, 68, 0, 0, 244, 65, 0, 0, 232, 62, 0, 0, 219, 59, 0, 0, 205, 57, 0,
+ 35, 147, 23, 249, 38, 167, 16, 249, 39, 185, 11, 241, 37, 195, 12, 182, 33, 172, 27, 95, 34, 153, 32, 41, 27, 196, 39, 19,
+ 19, 228, 45, 6, 13, 239, 51, 2, 6, 247, 60, 6, 5, 250, 59, 0, 2, 250, 62, 0, 0, 242, 62, 0, 0, 230, 60, 0,
+ 0, 220, 57, 0, 0, 210, 55, 0, 0, 199, 54, 0, 25, 173, 19, 249, 28, 189, 13, 249, 28, 202, 9, 247, 29, 220, 4, 226,
+ 24, 216, 12, 147, 25, 190, 20, 73, 24, 190, 22, 34, 19, 220, 23, 13, 13, 232, 32, 7, 7, 235, 42, 8, 0, 239, 53, 13,
+ 0, 240, 51, 5, 0, 236, 51, 1, 0, 224, 51, 0, 0, 213, 50, 0, 0, 204, 50, 0, 0, 193, 50, 0, 17, 188, 17, 249,
+ 19, 197, 13, 249, 20, 207, 9, 249, 21, 225, 2, 241, 19, 228, 3, 189, 19, 220, 6, 110, 19, 216, 8, 56, 17, 221, 11, 28,
+ 11, 228, 19, 16, 7, 231, 27, 12, 2, 229, 36, 12, 0, 225, 40, 9, 0, 222, 41, 3, 0, 215, 41, 0, 0, 207, 43, 0,
+ 0, 199, 44, 0, 0, 187, 45, 0, 9, 191, 18, 250, 11, 198, 15, 250, 12, 206, 10, 249, 14, 223, 4, 246, 14, 228, 2, 211,
+ 13, 225, 3, 147, 11, 223, 8, 92, 9, 224, 13, 55, 8, 227, 15, 33, 4, 227, 21, 23, 2, 226, 25, 16, 0, 222, 28, 11,
+ 0, 214, 30, 5, 0, 207, 32, 1, 0, 199, 34, 0, 0, 190, 36, 0, 0, 177, 39, 0, 2, 189, 20, 250, 3, 195, 18, 250,
+ 5, 204, 13, 250, 7, 219, 6, 247, 9, 226, 3, 223, 5, 225, 8, 179, 6, 221, 8, 119, 5, 222, 10, 77, 3, 224, 15, 52,
+ 2, 225, 15, 33, 0, 222, 19, 24, 0, 218, 19, 14, 0, 214, 20, 7, 0, 206, 22, 2, 0, 194, 26, 0, 0, 181, 29, 0,
+ 0, 163, 31, 0, 0, 187, 16, 250, 0, 192, 15, 250, 2, 201, 10, 250, 1, 214, 7, 249, 4, 226, 0, 237, 2, 224, 5, 199,
+ 0, 219, 10, 145, 0, 219, 11, 100, 0, 220, 12, 68, 0, 220, 12, 44, 0, 221, 11, 28, 0, 215, 11, 18, 0, 209, 13, 10,
+ 0, 204, 15, 4, 0, 195, 17, 0, 0, 178, 22, 0, 0, 155, 25, 0, 0, 186, 13, 250, 0, 188, 9, 250, 0, 198, 6, 250,
+ 0, 210, 3, 248, 0, 220, 0, 240, 0, 219, 1, 208, 0, 211, 3, 159, 0, 210, 4, 112, 0, 212, 5, 79, 0, 213, 6, 53,
+ 0, 214, 6, 33, 0, 216, 5, 21, 0, 208, 6, 13, 0, 200, 8, 7, 0, 194, 10, 2, 0, 179, 15, 0, 0, 157, 20, 0,
+ 0, 185, 10, 250, 0, 186, 5, 251, 0, 194, 1, 248, 0, 197, 0, 235, 0, 199, 0, 219, 0, 198, 0, 196, 0, 196, 0, 163,
+ 0, 199, 0, 123, 0, 202, 1, 90, 0, 204, 1, 63, 0, 205, 2, 41, 0, 208, 1, 26, 0, 209, 1, 16, 0, 199, 3, 9,
+ 0, 191, 5, 3, 0, 181, 8, 0, 0, 162, 15, 0, 0, 185, 8, 251, 0, 183, 2, 249, 0, 180, 0, 237, 0, 175, 0, 218,
+ 0, 175, 0, 201, 0, 175, 0, 182, 0, 177, 0, 156, 0, 182, 0, 125, 0, 186, 0, 96, 0, 190, 0, 71, 0, 194, 0, 51,
+ 0, 197, 0, 33, 0, 199, 0, 21, 0, 198, 0, 12, 0, 190, 1, 5, 0, 181, 3, 1, 0, 167, 10, 0, 0, 187, 6, 251,
+ 0, 179, 1, 244, 0, 168, 0, 224, 0, 158, 0, 199, 0, 157, 0, 183, 0, 159, 0, 166, 0, 162, 0, 144, 0, 166, 0, 122,
+ 0, 171, 0, 99, 0, 176, 0, 78, 0, 181, 0, 59, 0, 185, 0, 41, 0, 188, 0, 28, 0, 190, 0, 18, 0, 189, 0, 9,
+ 0, 181, 1, 3, 0, 173, 7, 0, 0, 191, 3, 251, 0, 176, 0, 237, 0, 161, 0, 211, 0, 149, 0, 185, 0, 148, 0, 170,
+ 0, 150, 0, 156, 0, 153, 0, 139, 0, 156, 0, 121, 0, 161, 0, 102, 0, 166, 0, 83, 0, 172, 0, 65, 0, 177, 0, 49,
+ 0, 181, 0, 34, 0, 184, 0, 24, 0, 186, 0, 14, 0, 185, 1, 6, 0, 182, 6, 0, 0, 195, 0, 251, 0, 187, 0, 232,
+ 0, 179, 0, 211, 0, 169, 0, 185, 0, 169, 0, 177, 0, 170, 0, 166, 0, 172, 0, 152, 0, 175, 0, 133, 0, 179, 0, 113,
+ 0, 184, 0, 95, 0, 190, 0, 76, 0, 196, 0, 59, 0, 200, 0, 44, 0, 203, 0, 30, 0, 206, 0, 19, 0, 207, 0, 8,
+ 0, 208, 0, 0, 87, 1, 225, 206, 85, 1, 227, 162, 78, 0, 236, 91, 73, 0, 243, 9, 61, 35, 239, 0, 42, 89, 230, 0,
+ 29, 125, 224, 0, 21, 159, 217, 0, 14, 187, 208, 3, 8, 212, 198, 8, 3, 226, 185, 14, 0, 228, 171, 14, 0, 227, 149, 11,
+ 0, 226, 129, 8, 0, 223, 112, 5, 0, 219, 97, 2, 0, 213, 84, 0, 80, 4, 182, 240, 77, 6, 209, 219, 71, 11, 204, 126,
+ 65, 7, 225, 18, 45, 77, 229, 2, 32, 129, 222, 0, 24, 170, 216, 0, 17, 198, 210, 0, 11, 220, 203, 1, 6, 236, 196, 3,
+ 4, 245, 182, 0, 2, 246, 163, 0, 1, 242, 136, 0, 0, 236, 117, 1, 0, 230, 100, 0, 0, 221, 87, 0, 0, 208, 80, 0,
+ 72, 12, 101, 249, 74, 16, 112, 223, 70, 46, 97, 111, 59, 41, 134, 50, 38, 92, 190, 17, 24, 145, 207, 7, 15, 187, 208, 2,
+ 8, 214, 203, 4, 3, 233, 193, 4, 2, 244, 183, 0, 1, 242, 160, 0, 0, 239, 137, 1, 0, 234, 116, 0, 0, 228, 101, 0,
+ 0, 221, 88, 0, 0, 213, 79, 0, 0, 200, 74, 0, 57, 34, 61, 229, 64, 29, 58, 225, 61, 51, 65, 140, 51, 66, 75, 75,
+ 39, 93, 104, 37, 15, 166, 151, 40, 2, 209, 163, 35, 0, 223, 161, 21, 0, 228, 147, 9, 0, 234, 135, 3, 0, 232, 118, 2,
+ 0, 230, 103, 1, 0, 224, 91, 1, 0, 218, 82, 0, 0, 212, 76, 0, 0, 205, 70, 0, 0, 193, 66, 0, 40, 60, 45, 250,
+ 43, 72, 39, 242, 41, 80, 47, 183, 41, 81, 49, 101, 38, 85, 52, 52, 20, 153, 86, 54, 13, 196, 90, 28, 5, 224, 97, 21,
+ 4, 234, 87, 11, 2, 243, 82, 5, 2, 244, 74, 0, 1, 242, 71, 0, 0, 232, 67, 0, 0, 220, 63, 0, 0, 210, 60, 0,
+ 0, 201, 58, 0, 0, 189, 54, 0, 25, 108, 42, 250, 31, 115, 35, 249, 32, 119, 34, 239, 31, 126, 36, 179, 26, 134, 47, 113,
+ 26, 131, 51, 64, 15, 171, 68, 47, 5, 208, 76, 35, 0, 222, 79, 26, 1, 226, 71, 13, 0, 231, 65, 6, 0, 230, 61, 1,
+ 0, 220, 59, 0, 0, 211, 56, 0, 0, 202, 55, 0, 0, 194, 54, 0, 0, 182, 53, 0, 16, 137, 37, 250, 22, 149, 29, 249,
+ 23, 160, 25, 249, 24, 176, 20, 234, 19, 179, 30, 166, 16, 165, 42, 102, 13, 158, 51, 67, 6, 190, 59, 48, 3, 210, 58, 28,
+ 0, 215, 59, 20, 0, 217, 55, 11, 0, 216, 53, 3, 0, 210, 52, 0, 0, 201, 52, 0, 0, 192, 51, 0, 0, 184, 51, 0,
+ 0, 172, 50, 0, 10, 159, 32, 250, 14, 169, 26, 250, 15, 178, 21, 249, 16, 195, 15, 246, 13, 204, 18, 205, 13, 192, 23, 130,
+ 7, 181, 40, 90, 4, 189, 45, 63, 1, 209, 45, 41, 0, 213, 44, 26, 0, 210, 44, 15, 0, 208, 43, 7, 0, 205, 43, 2,
+ 0, 198, 43, 0, 0, 189, 44, 0, 0, 179, 44, 0, 0, 166, 44, 0, 3, 168, 30, 250, 6, 178, 26, 250, 7, 186, 21, 250,
+ 8, 198, 15, 248, 8, 212, 14, 227, 6, 207, 20, 169, 4, 202, 26, 113, 0, 204, 34, 78, 0, 209, 33, 51, 1, 210, 30, 29,
+ 0, 210, 31, 18, 0, 204, 32, 10, 0, 198, 33, 5, 0, 193, 34, 1, 0, 183, 36, 0, 0, 171, 37, 0, 0, 159, 38, 0,
+ 0, 172, 25, 250, 1, 179, 22, 250, 2, 187, 20, 250, 2, 199, 16, 249, 3, 214, 11, 235, 2, 209, 16, 191, 0, 205, 20, 137,
+ 0, 205, 22, 92, 0, 206, 23, 60, 0, 209, 22, 38, 0, 206, 21, 24, 0, 203, 21, 14, 0, 198, 22, 6, 0, 191, 24, 1,
+ 0, 178, 27, 0, 0, 163, 29, 0, 0, 149, 31, 0, 0, 170, 16, 251, 0, 175, 16, 250, 0, 184, 15, 250, 0, 197, 11, 250,
+ 0, 211, 7, 244, 0, 207, 10, 202, 0, 201, 12, 150, 0, 200, 13, 104, 0, 201, 13, 70, 0, 203, 14, 46, 0, 204, 13, 29,
+ 0, 199, 14, 18, 0, 195, 14, 10, 0, 191, 16, 4, 0, 180, 18, 0, 0, 160, 22, 0, 0, 140, 25, 0, 0, 170, 12, 251,
+ 0, 171, 10, 251, 0, 180, 8, 251, 0, 194, 5, 250, 0, 205, 1, 242, 0, 200, 3, 205, 0, 193, 5, 159, 0, 191, 6, 114,
+ 0, 193, 7, 80, 0, 196, 7, 55, 0, 198, 8, 34, 0, 199, 7, 22, 0, 192, 8, 13, 0, 187, 9, 7, 0, 182, 11, 2,
+ 0, 164, 15, 0, 0, 141, 20, 0, 0, 170, 9, 251, 0, 168, 5, 251, 0, 175, 2, 250, 0, 181, 1, 240, 0, 183, 0, 222,
+ 0, 182, 0, 195, 0, 180, 1, 161, 0, 181, 2, 122, 0, 184, 2, 90, 0, 187, 2, 64, 0, 188, 3, 42, 0, 192, 2, 27,
+ 0, 194, 2, 16, 0, 185, 4, 9, 0, 178, 5, 4, 0, 167, 8, 0, 0, 146, 14, 0, 0, 170, 7, 251, 0, 166, 2, 251,
+ 0, 166, 0, 242, 0, 160, 0, 221, 0, 155, 0, 195, 0, 156, 0, 171, 0, 159, 0, 146, 0, 162, 0, 119, 0, 166, 0, 93,
+ 0, 171, 0, 69, 0, 176, 0, 50, 0, 179, 0, 33, 0, 182, 0, 21, 0, 182, 0, 12, 0, 175, 1, 6, 0, 166, 3, 1,
+ 0, 153, 10, 0, 0, 171, 5, 251, 0, 163, 1, 247, 0, 154, 0, 228, 0, 143, 0, 200, 0, 137, 0, 171, 0, 138, 0, 149,
+ 0, 140, 0, 131, 0, 142, 0, 113, 0, 147, 0, 94, 0, 152, 0, 74, 0, 158, 0, 58, 0, 162, 0, 40, 0, 166, 0, 28,
+ 0, 168, 0, 18, 0, 168, 0, 10, 0, 163, 1, 3, 0, 159, 7, 0, 0, 174, 3, 251, 0, 161, 0, 240, 0, 148, 0, 213,
+ 0, 135, 0, 185, 0, 129, 0, 155, 0, 129, 0, 137, 0, 131, 0, 123, 0, 133, 0, 108, 0, 136, 0, 94, 0, 141, 0, 79,
+ 0, 147, 0, 63, 0, 152, 0, 48, 0, 156, 0, 34, 0, 160, 0, 24, 0, 162, 0, 15, 0, 162, 0, 7, 0, 167, 5, 0,
+ 0, 180, 0, 251, 0, 173, 0, 235, 0, 165, 0, 215, 0, 156, 0, 191, 0, 150, 0, 160, 0, 152, 0, 147, 0, 154, 0, 134,
+ 0, 156, 0, 119, 0, 160, 0, 104, 0, 164, 0, 89, 0, 171, 0, 71, 0, 177, 0, 56, 0, 183, 0, 40, 0, 186, 0, 28,
+ 0, 190, 0, 18, 0, 192, 0, 7, 0, 193, 0, 0, 71, 1, 225, 219, 69, 1, 226, 190, 62, 0, 235, 140, 58, 0, 242, 55,
+ 54, 3, 246, 0, 43, 27, 243, 0, 27, 67, 236, 0, 17, 101, 228, 1, 12, 131, 213, 3, 7, 163, 200, 8, 3, 184, 189, 12,
+ 0, 196, 177, 13, 0, 197, 155, 9, 0, 199, 138, 7, 0, 201, 122, 4, 0, 198, 107, 2, 0, 194, 93, 0, 63, 5, 195, 244,
+ 64, 3, 219, 236, 59, 3, 222, 178, 52, 3, 235, 74, 44, 23, 240, 1, 30, 63, 236, 0, 19, 102, 229, 0, 11, 141, 222, 1,
+ 5, 172, 215, 0, 2, 192, 203, 0, 0, 203, 184, 2, 0, 206, 162, 1, 0, 206, 140, 1, 0, 205, 123, 1, 0, 202, 108, 0,
+ 0, 197, 95, 0, 0, 187, 87, 0, 51, 18, 135, 249, 74, 7, 142, 248, 51, 23, 163, 198, 45, 29, 171, 103, 42, 31, 191, 14,
+ 26, 70, 215, 6, 15, 112, 215, 3, 3, 160, 209, 9, 1, 182, 202, 1, 0, 194, 184, 0, 0, 199, 160, 0, 0, 202, 139, 0,
+ 0, 201, 123, 0, 0, 199, 108, 0, 0, 195, 96, 0, 0, 190, 86, 0, 0, 180, 80, 0, 40, 40, 93, 228, 55, 22, 104, 249,
+ 41, 41, 106, 204, 38, 57, 103, 115, 35, 56, 125, 63, 26, 73, 159, 29, 7, 134, 180, 29, 0, 168, 179, 21, 0, 179, 164, 6,
+ 0, 188, 145, 0, 0, 192, 130, 0, 0, 193, 114, 0, 0, 191, 102, 0, 0, 188, 92, 0, 0, 185, 83, 0, 0, 181, 76, 0,
+ 0, 170, 73, 0, 28, 55, 71, 243, 36, 48, 65, 247, 32, 57, 75, 211, 32, 67, 74, 128, 24, 88, 88, 99, 18, 98, 106, 65,
+ 0, 154, 134, 57, 0, 170, 128, 27, 0, 181, 119, 12, 0, 188, 109, 3, 0, 190, 98, 1, 0, 188, 88, 0, 0, 185, 81, 0,
+ 0, 181, 75, 0, 0, 178, 70, 0, 0, 172, 66, 0, 0, 161, 62, 0, 10, 82, 67, 250, 22, 77, 57, 250, 23, 78, 56, 241,
+ 24, 78, 55, 158, 25, 84, 53, 103, 7, 126, 87, 100, 0, 153, 97, 79, 0, 175, 90, 42, 0, 190, 82, 23, 0, 198, 74, 11,
+ 0, 203, 66, 3, 0, 201, 62, 0, 0, 196, 59, 0, 0, 189, 57, 0, 0, 181, 55, 0, 0, 172, 53, 0, 0, 162, 49, 0,
+ 1, 110, 60, 250, 12, 116, 50, 250, 14, 118, 47, 248, 15, 124, 46, 226, 6, 137, 60, 178, 3, 146, 68, 132, 1, 148, 75, 97,
+ 0, 160, 75, 62, 0, 177, 67, 31, 0, 186, 62, 17, 0, 190, 58, 7, 0, 193, 54, 1, 0, 188, 52, 0, 0, 180, 51, 0,
+ 0, 171, 50, 0, 0, 161, 49, 0, 0, 150, 47, 0, 0, 125, 48, 250, 3, 139, 46, 250, 6, 145, 40, 250, 6, 155, 37, 247,
+ 5, 166, 40, 216, 2, 169, 47, 159, 0, 155, 55, 109, 0, 148, 59, 77, 0, 162, 55, 47, 0, 179, 50, 24, 0, 184, 48, 13,
+ 0, 185, 46, 6, 0, 182, 45, 1, 0, 172, 45, 0, 0, 160, 45, 0, 0, 151, 44, 0, 0, 143, 44, 0, 0, 135, 38, 250,
+ 0, 151, 37, 250, 0, 157, 35, 250, 2, 166, 30, 249, 0, 180, 31, 234, 0, 179, 34, 181, 0, 172, 36, 124, 0, 159, 42, 84,
+ 0, 162, 41, 56, 0, 182, 38, 33, 0, 185, 36, 19, 0, 180, 35, 10, 0, 178, 35, 4, 0, 170, 36, 0, 0, 157, 36, 0,
+ 0, 146, 37, 0, 0, 138, 38, 0, 0, 146, 26, 251, 0, 154, 25, 251, 0, 161, 24, 250, 0, 172, 23, 250, 0, 186, 20, 243,
+ 0, 183, 21, 197, 0, 176, 22, 139, 0, 175, 24, 95, 0, 179, 26, 64, 0, 185, 26, 42, 0, 185, 25, 24, 0, 182, 25, 14,
+ 0, 178, 25, 6, 0, 168, 26, 1, 0, 152, 28, 0, 0, 141, 29, 0, 0, 133, 32, 0, 0, 147, 17, 251, 0, 153, 17, 251,
+ 0, 160, 16, 251, 0, 172, 14, 251, 0, 187, 11, 246, 0, 179, 12, 205, 0, 173, 14, 151, 0, 173, 15, 106, 0, 177, 16, 73,
+ 0, 181, 17, 49, 0, 183, 17, 31, 0, 180, 16, 19, 0, 177, 17, 10, 0, 171, 18, 3, 0, 156, 20, 0, 0, 138, 23, 0,
+ 0, 127, 26, 0, 0, 148, 11, 251, 0, 150, 10, 251, 0, 158, 9, 251, 0, 169, 7, 251, 0, 179, 4, 242, 0, 172, 5, 205,
+ 0, 167, 7, 157, 0, 166, 8, 114, 0, 170, 9, 82, 0, 175, 10, 57, 0, 177, 10, 37, 0, 180, 9, 23, 0, 173, 9, 14,
+ 0, 168, 10, 7, 0, 161, 12, 2, 0, 142, 16, 0, 0, 126, 20, 0, 0, 151, 8, 251, 0, 149, 5, 252, 0, 154, 3, 251,
+ 0, 162, 1, 247, 0, 165, 1, 229, 0, 160, 1, 195, 0, 158, 2, 155, 0, 158, 3, 119, 0, 161, 3, 90, 0, 165, 4, 65,
+ 0, 168, 4, 43, 0, 173, 4, 28, 0, 175, 3, 18, 0, 165, 5, 10, 0, 158, 6, 4, 0, 147, 9, 1, 0, 130, 15, 0,
+ 0, 154, 6, 251, 0, 148, 2, 251, 0, 147, 0, 245, 0, 145, 0, 226, 0, 140, 0, 200, 0, 138, 0, 169, 0, 140, 0, 140,
+ 0, 142, 0, 115, 0, 146, 0, 93, 0, 151, 0, 69, 0, 156, 0, 51, 0, 160, 0, 34, 0, 163, 0, 22, 0, 162, 0, 13,
+ 0, 155, 2, 7, 0, 147, 3, 2, 0, 136, 10, 0, 0, 156, 4, 251, 0, 145, 0, 247, 0, 138, 0, 229, 0, 130, 0, 204,
+ 0, 124, 0, 175, 0, 121, 0, 142, 0, 122, 0, 121, 0, 124, 0, 105, 0, 127, 0, 90, 0, 132, 0, 72, 0, 136, 0, 57,
+ 0, 140, 0, 41, 0, 144, 0, 28, 0, 146, 0, 19, 0, 146, 0, 11, 0, 142, 1, 4, 0, 142, 6, 0, 0, 158, 2, 251,
+ 0, 144, 0, 239, 0, 132, 0, 215, 0, 123, 0, 189, 0, 117, 0, 157, 0, 112, 0, 126, 0, 112, 0, 109, 0, 114, 0, 98,
+ 0, 117, 0, 88, 0, 121, 0, 74, 0, 125, 0, 61, 0, 129, 0, 47, 0, 133, 0, 34, 0, 136, 0, 24, 0, 138, 0, 15,
+ 0, 139, 0, 8, 0, 150, 4, 0, 0, 162, 0, 251, 0, 155, 0, 235, 0, 149, 0, 217, 0, 142, 0, 196, 0, 136, 0, 168,
+ 0, 133, 0, 134, 0, 134, 0, 120, 0, 136, 0, 108, 0, 138, 0, 97, 0, 142, 0, 86, 0, 148, 0, 71, 0, 155, 0, 56,
+ 0, 162, 0, 41, 0, 167, 0, 28, 0, 172, 0, 17, 0, 174, 0, 7, 0, 175, 0, 0, 55, 0, 226, 234, 54, 1, 225, 206,
+ 49, 0, 233, 171, 44, 0, 240, 99, 41, 0, 246, 28, 35, 6, 248, 0, 28, 23, 246, 0, 15, 56, 238, 1, 7, 88, 222, 7,
+ 5, 113, 206, 10, 2, 137, 195, 12, 0, 153, 182, 12, 0, 158, 162, 8, 0, 167, 145, 5, 0, 173, 130, 3, 0, 174, 117, 2,
+ 0, 172, 104, 0, 49, 6, 202, 246, 49, 4, 216, 241, 48, 2, 223, 210, 41, 1, 236, 132, 37, 2, 244, 20, 27, 25, 243, 1,
+ 17, 53, 240, 0, 7, 86, 234, 1, 2, 116, 225, 0, 0, 139, 207, 2, 0, 152, 188, 1, 0, 160, 166, 1, 0, 168, 144, 1,
+ 0, 173, 128, 0, 0, 175, 116, 0, 0, 173, 106, 0, 0, 166, 98, 0, 42, 16, 163, 249, 43, 12, 179, 248, 41, 6, 208, 248,
+ 35, 13, 211, 161, 33, 14, 213, 43, 26, 31, 217, 8, 15, 60, 220, 4, 0, 104, 215, 14, 0, 122, 209, 2, 0, 137, 190, 0,
+ 0, 148, 168, 0, 0, 157, 145, 0, 0, 166, 128, 0, 0, 169, 115, 0, 0, 170, 105, 0, 0, 166, 95, 0, 0, 157, 89, 0,
+ 37, 30, 119, 249, 39, 25, 130, 249, 32, 24, 149, 249, 28, 43, 145, 171, 24, 49, 160, 104, 24, 42, 166, 41, 7, 85, 187, 32,
+ 0, 111, 188, 22, 0, 122, 177, 7, 0, 133, 160, 1, 0, 143, 140, 0, 0, 152, 121, 0, 0, 159, 110, 0, 0, 161, 100, 0,
+ 0, 160, 91, 0, 0, 157, 83, 0, 0, 147, 80, 0, 20, 53, 95, 241, 28, 46, 90, 250, 26, 44, 100, 250, 22, 58, 101, 181,
+ 17, 80, 105, 130, 10, 86, 129, 93, 1, 106, 149, 59, 0, 114, 147, 29, 0, 122, 138, 12, 0, 132, 125, 2, 0, 140, 109, 0,
+ 0, 146, 100, 0, 0, 149, 91, 0, 0, 150, 84, 0, 0, 149, 77, 0, 0, 147, 72, 0, 0, 138, 69, 0, 3, 72, 83, 249,
+ 15, 66, 73, 250, 16, 65, 75, 245, 15, 70, 79, 195, 4, 95, 94, 159, 0, 114, 104, 125, 0, 112, 107, 82, 0, 115, 104, 41,
+ 0, 124, 95, 18, 0, 135, 90, 8, 0, 143, 84, 1, 0, 146, 78, 0, 0, 146, 73, 0, 0, 145, 68, 0, 0, 142, 63, 0,
+ 0, 139, 60, 0, 0, 132, 57, 0, 0, 80, 65, 250, 2, 99, 68, 250, 5, 98, 66, 250, 1, 101, 71, 239, 8, 87, 60, 157,
+ 1, 111, 76, 128, 0, 107, 74, 87, 0, 116, 74, 58, 0, 134, 70, 31, 0, 148, 65, 16, 0, 158, 59, 6, 0, 163, 55, 1,
+ 0, 159, 53, 0, 0, 153, 51, 0, 0, 145, 49, 0, 0, 139, 47, 0, 0, 134, 44, 0, 0, 93, 49, 251, 0, 109, 53, 250,
+ 0, 114, 53, 250, 0, 117, 52, 247, 0, 117, 53, 208, 0, 121, 57, 152, 0, 117, 58, 106, 0, 115, 60, 75, 0, 122, 57, 46,
+ 0, 137, 52, 24, 0, 145, 50, 11, 0, 149, 47, 4, 0, 148, 45, 0, 0, 143, 45, 0, 0, 136, 44, 0, 0, 130, 43, 0,
+ 0, 124, 42, 0, 0, 103, 38, 251, 0, 116, 38, 251, 0, 122, 38, 251, 0, 128, 37, 250, 0, 137, 36, 239, 0, 136, 39, 180,
+ 0, 129, 39, 123, 0, 121, 43, 84, 0, 115, 46, 59, 0, 128, 43, 35, 0, 141, 39, 18, 0, 143, 38, 9, 0, 144, 37, 3,
+ 0, 139, 37, 0, 0, 130, 38, 0, 0, 124, 39, 0, 0, 119, 39, 0, 0, 113, 28, 251, 0, 118, 27, 251, 0, 124, 26, 251,
+ 0, 134, 25, 251, 0, 148, 23, 246, 0, 142, 24, 196, 0, 133, 25, 137, 0, 134, 28, 94, 0, 127, 33, 64, 0, 130, 33, 43,
+ 0, 142, 29, 24, 0, 145, 27, 13, 0, 142, 27, 6, 0, 138, 28, 1, 0, 129, 30, 0, 0, 121, 31, 0, 0, 116, 33, 0,
+ 0, 117, 18, 252, 0, 120, 18, 252, 0, 127, 18, 251, 0, 139, 16, 251, 0, 152, 14, 246, 0, 144, 15, 203, 0, 135, 16, 148,
+ 0, 136, 18, 104, 0, 138, 19, 72, 0, 140, 20, 49, 0, 145, 19, 31, 0, 146, 18, 18, 0, 145, 19, 9, 0, 140, 20, 3,
+ 0, 130, 22, 0, 0, 118, 25, 0, 0, 113, 27, 0, 0, 120, 12, 252, 0, 122, 11, 252, 0, 129, 10, 252, 0, 140, 9, 251,
+ 0, 148, 7, 241, 0, 141, 8, 203, 0, 135, 9, 154, 0, 134, 10, 112, 0, 138, 11, 82, 0, 142, 11, 57, 0, 146, 12, 38,
+ 0, 149, 11, 24, 0, 144, 11, 14, 0, 141, 12, 6, 0, 136, 13, 1, 0, 121, 17, 0, 0, 110, 22, 0, 0, 126, 8, 252,
+ 0, 124, 6, 252, 0, 129, 4, 252, 0, 136, 3, 249, 0, 140, 2, 232, 0, 135, 3, 196, 0, 132, 3, 153, 0, 131, 4, 115,
+ 0, 134, 5, 89, 0, 138, 5, 65, 0, 141, 5, 44, 0, 146, 6, 30, 0, 149, 5, 19, 0, 140, 6, 10, 0, 135, 7, 4,
+ 0, 126, 10, 0, 0, 113, 16, 0, 0, 132, 6, 252, 0, 127, 2, 252, 0, 128, 1, 248, 0, 127, 0, 232, 0, 125, 0, 208,
+ 0, 123, 0, 178, 0, 122, 0, 140, 0, 124, 0, 112, 0, 127, 1, 91, 0, 130, 1, 70, 0, 134, 1, 52, 0, 137, 1, 35,
+ 0, 141, 1, 23, 0, 142, 1, 14, 0, 134, 2, 7, 0, 129, 3, 1, 0, 118, 11, 0, 0, 138, 4, 252, 0, 127, 0, 248,
+ 0, 121, 0, 231, 0, 115, 0, 208, 0, 111, 0, 181, 0, 108, 0, 149, 0, 106, 0, 118, 0, 108, 0, 100, 0, 111, 0, 86,
+ 0, 114, 0, 70, 0, 117, 0, 56, 0, 121, 0, 40, 0, 124, 0, 28, 0, 126, 0, 19, 0, 126, 0, 11, 0, 124, 1, 4,
+ 0, 124, 7, 0, 0, 141, 2, 252, 0, 127, 0, 239, 0, 117, 0, 216, 0, 110, 0, 192, 0, 105, 0, 163, 0, 100, 0, 130,
+ 0, 97, 0, 103, 0, 99, 0, 90, 0, 101, 0, 81, 0, 103, 0, 70, 0, 106, 0, 59, 0, 109, 0, 46, 0, 112, 0, 33,
+ 0, 115, 0, 24, 0, 117, 0, 15, 0, 118, 0, 8, 0, 130, 4, 0, 0, 145, 0, 252, 0, 137, 0, 235, 0, 131, 0, 217,
+ 0, 126, 0, 199, 0, 123, 0, 175, 0, 120, 0, 141, 0, 117, 0, 110, 0, 119, 0, 98, 0, 121, 0, 90, 0, 123, 0, 82,
+ 0, 127, 0, 71, 0, 133, 0, 56, 0, 139, 0, 41, 0, 145, 0, 29, 0, 150, 0, 17, 0, 152, 0, 7, 0, 155, 0, 0,
+ 42, 0, 227, 242, 41, 1, 225, 218, 37, 0, 232, 190, 33, 0, 237, 138, 30, 0, 244, 64, 28, 0, 249, 15, 24, 8, 250, 0,
+ 18, 21, 248, 0, 6, 51, 238, 4, 0, 80, 218, 13, 0, 96, 201, 12, 0, 109, 187, 9, 0, 119, 170, 7, 0, 130, 155, 4,
+ 0, 138, 142, 3, 0, 143, 127, 1, 0, 147, 113, 0, 38, 7, 202, 248, 38, 5, 211, 244, 36, 2, 223, 226, 31, 0, 234, 171,
+ 27, 0, 244, 58, 26, 2, 248, 3, 16, 27, 245, 1, 7, 49, 241, 2, 1, 71, 232, 0, 0, 90, 210, 1, 0, 104, 192, 1,
+ 0, 117, 172, 1, 0, 127, 153, 1, 0, 134, 138, 0, 0, 139, 124, 0, 0, 141, 111, 0, 0, 138, 105, 0, 32, 16, 176, 249,
+ 33, 14, 180, 249, 31, 7, 204, 249, 28, 6, 223, 196, 24, 7, 225, 81, 22, 15, 220, 21, 13, 36, 223, 9, 3, 62, 220, 12,
+ 0, 76, 215, 2, 0, 92, 196, 0, 0, 105, 174, 0, 0, 117, 155, 0, 0, 127, 139, 0, 0, 133, 123, 0, 0, 135, 110, 0,
+ 0, 136, 101, 0, 0, 130, 97, 0, 24, 32, 138, 249, 25, 29, 144, 249, 24, 23, 163, 249, 21, 21, 186, 223, 17, 31, 189, 142,
+ 18, 28, 184, 63, 8, 54, 193, 33, 0, 73, 195, 24, 0, 80, 188, 8, 0, 93, 172, 1, 0, 105, 151, 0, 0, 115, 134, 0,
+ 0, 123, 119, 0, 0, 128, 106, 0, 0, 130, 95, 0, 0, 131, 88, 0, 0, 122, 86, 0, 17, 48, 111, 250, 20, 46, 109, 250,
+ 17, 44, 120, 250, 13, 44, 139, 229, 6, 69, 146, 176, 5, 70, 152, 113, 4, 68, 160, 55, 0, 76, 161, 34, 0, 84, 152, 14,
+ 0, 94, 140, 3, 0, 103, 125, 0, 0, 111, 111, 0, 0, 116, 98, 0, 0, 121, 88, 0, 0, 124, 82, 0, 0, 125, 77, 0,
+ 0, 118, 75, 0, 0, 66, 94, 250, 9, 65, 91, 250, 8, 64, 95, 250, 7, 60, 104, 249, 0, 80, 111, 189, 0, 87, 108, 129,
+ 0, 81, 114, 87, 0, 75, 119, 48, 0, 87, 113, 23, 0, 95, 105, 9, 0, 101, 96, 1, 0, 106, 86, 0, 0, 110, 80, 0,
+ 0, 115, 74, 0, 0, 117, 70, 0, 0, 117, 65, 0, 0, 112, 63, 0, 0, 62, 66, 251, 0, 72, 75, 250, 0, 73, 77, 250,
+ 3, 69, 76, 238, 0, 73, 79, 187, 0, 85, 81, 127, 0, 82, 80, 90, 0, 82, 83, 61, 0, 89, 78, 30, 0, 96, 74, 13,
+ 0, 105, 72, 4, 0, 111, 68, 0, 0, 112, 64, 0, 0, 113, 60, 0, 0, 112, 56, 0, 0, 111, 54, 0, 0, 107, 52, 0,
+ 0, 65, 51, 251, 0, 72, 57, 251, 0, 75, 57, 251, 0, 75, 57, 246, 6, 63, 46, 186, 0, 84, 61, 136, 0, 87, 61, 100,
+ 0, 87, 60, 72, 0, 91, 59, 44, 0, 103, 56, 23, 0, 115, 52, 10, 0, 123, 49, 3, 0, 123, 47, 0, 0, 120, 45, 0,
+ 0, 116, 44, 0, 0, 112, 42, 0, 0, 109, 39, 0, 0, 75, 40, 252, 0, 86, 40, 251, 0, 89, 39, 251, 0, 92, 39, 251,
+ 0, 92, 38, 236, 0, 94, 44, 163, 0, 93, 45, 114, 0, 90, 45, 80, 0, 90, 47, 57, 0, 96, 46, 35, 0, 109, 43, 18,
+ 0, 115, 41, 7, 0, 117, 40, 1, 0, 113, 39, 0, 0, 109, 39, 0, 0, 106, 38, 0, 0, 102, 37, 0, 0, 84, 29, 252,
+ 0, 92, 28, 252, 0, 95, 27, 252, 0, 100, 27, 252, 0, 105, 25, 245, 0, 105, 28, 193, 0, 100, 30, 135, 0, 99, 30, 92,
+ 0, 96, 35, 64, 0, 92, 37, 45, 0, 102, 35, 28, 0, 114, 32, 12, 0, 115, 31, 5, 0, 113, 31, 1, 0, 107, 32, 0,
+ 0, 102, 33, 0, 0, 99, 33, 0, 0, 91, 20, 252, 0, 96, 19, 252, 0, 99, 19, 252, 0, 106, 18, 251, 0, 112, 17, 244,
+ 0, 110, 18, 201, 0, 104, 18, 149, 0, 104, 20, 102, 0, 107, 22, 72, 0, 100, 25, 51, 0, 102, 25, 34, 0, 116, 22, 18,
+ 0, 118, 22, 8, 0, 115, 23, 2, 0, 108, 24, 0, 0, 101, 26, 0, 0, 98, 28, 0, 0, 96, 12, 252, 0, 99, 12, 252,
+ 0, 104, 12, 252, 0, 110, 11, 251, 0, 115, 10, 239, 0, 111, 11, 203, 0, 108, 11, 157, 0, 106, 11, 110, 0, 111, 13, 81,
+ 0, 113, 14, 56, 0, 115, 14, 39, 0, 119, 14, 24, 0, 118, 13, 13, 0, 117, 14, 5, 0, 112, 16, 1, 0, 101, 19, 0,
+ 0, 97, 23, 0, 0, 102, 8, 252, 0, 102, 6, 252, 0, 106, 6, 252, 0, 111, 5, 250, 0, 114, 5, 232, 0, 111, 5, 199,
+ 0, 109, 5, 157, 0, 105, 6, 113, 0, 109, 7, 87, 0, 113, 7, 64, 0, 116, 7, 45, 0, 119, 7, 30, 0, 121, 7, 19,
+ 0, 116, 7, 9, 0, 115, 8, 3, 0, 106, 12, 0, 0, 98, 17, 0, 0, 110, 6, 252, 0, 106, 3, 252, 0, 108, 1, 250,
+ 0, 109, 1, 239, 0, 108, 1, 217, 0, 107, 1, 188, 0, 106, 1, 150, 0, 103, 1, 111, 0, 106, 2, 88, 0, 109, 2, 69,
+ 0, 112, 2, 52, 0, 115, 2, 35, 0, 118, 2, 24, 0, 120, 2, 14, 0, 115, 3, 6, 0, 111, 4, 1, 0, 102, 12, 0,
+ 0, 117, 4, 252, 0, 109, 1, 249, 0, 105, 0, 235, 0, 100, 0, 213, 0, 97, 0, 189, 0, 96, 0, 159, 0, 95, 0, 126,
+ 0, 93, 0, 98, 0, 96, 0, 82, 0, 98, 0, 69, 0, 101, 0, 56, 0, 104, 0, 40, 0, 106, 0, 29, 0, 108, 0, 19,
+ 0, 108, 0, 11, 0, 107, 1, 4, 0, 106, 7, 0, 0, 122, 2, 252, 0, 111, 0, 240, 0, 103, 0, 218, 0, 97, 0, 195,
+ 0, 92, 0, 168, 0, 90, 0, 137, 0, 87, 0, 107, 0, 85, 0, 86, 0, 87, 0, 74, 0, 88, 0, 67, 0, 91, 0, 58,
+ 0, 93, 0, 45, 0, 96, 0, 33, 0, 98, 0, 24, 0, 100, 0, 15, 0, 101, 0, 8, 0, 112, 5, 0, 0, 127, 0, 252,
+ 0, 121, 0, 237, 0, 115, 0, 219, 0, 111, 0, 201, 0, 108, 0, 181, 0, 107, 0, 150, 0, 104, 0, 116, 0, 103, 0, 91,
+ 0, 105, 0, 82, 0, 106, 0, 76, 0, 108, 0, 69, 0, 112, 0, 56, 0, 118, 0, 41, 0, 123, 0, 29, 0, 128, 0, 18,
+ 0, 130, 0, 7, 0, 133, 0, 0, 31, 1, 226, 247, 30, 1, 227, 230, 29, 1, 229, 205, 25, 0, 235, 167, 22, 0, 242, 103,
+ 20, 0, 248, 41, 20, 0, 251, 7, 16, 10, 250, 0, 12, 19, 249, 0, 4, 42, 238, 1, 0, 64, 216, 7, 0, 78, 198, 7,
+ 0, 91, 184, 6, 0, 101, 168, 4, 0, 110, 154, 2, 0, 118, 140, 1, 0, 124, 127, 0, 28, 9, 199, 249, 27, 7, 209, 247,
+ 27, 3, 224, 239, 25, 0, 232, 196, 21, 0, 242, 98, 19, 1, 248, 30, 17, 8, 250, 1, 8, 28, 246, 2, 2, 43, 241, 0,
+ 0, 58, 218, 1, 0, 72, 196, 1, 0, 85, 180, 1, 0, 95, 162, 0, 0, 104, 147, 0, 0, 111, 135, 0, 0, 117, 125, 0,
+ 0, 117, 119, 0, 24, 18, 177, 249, 24, 18, 180, 249, 23, 9, 205, 249, 23, 4, 222, 216, 18, 3, 230, 114, 17, 7, 227, 45,
+ 13, 17, 231, 10, 3, 41, 227, 12, 0, 48, 226, 3, 0, 61, 203, 0, 0, 74, 182, 0, 0, 87, 163, 0, 0, 96, 146, 0,
+ 0, 104, 133, 0, 0, 109, 121, 0, 0, 112, 112, 0, 0, 110, 108, 0, 17, 31, 152, 250, 18, 30, 154, 249, 16, 25, 170, 249,
+ 16, 14, 202, 240, 11, 23, 202, 171, 11, 23, 198, 95, 6, 37, 200, 43, 0, 51, 200, 27, 0, 53, 196, 10, 0, 63, 183, 1,
+ 0, 75, 162, 0, 0, 86, 142, 0, 0, 95, 128, 0, 0, 101, 116, 0, 0, 105, 105, 0, 0, 106, 95, 0, 0, 103, 94, 0,
+ 7, 50, 125, 250, 11, 46, 127, 250, 9, 42, 138, 250, 7, 36, 155, 250, 0, 50, 160, 201, 0, 53, 162, 132, 0, 54, 167, 69,
+ 0, 54, 168, 36, 0, 57, 164, 17, 0, 65, 154, 4, 0, 74, 135, 0, 0, 84, 119, 0, 0, 91, 107, 0, 0, 96, 95, 0,
+ 0, 100, 86, 0, 0, 104, 80, 0, 0, 101, 79, 0, 0, 55, 100, 250, 4, 61, 103, 250, 2, 60, 112, 250, 2, 52, 122, 250,
+ 0, 51, 120, 202, 0, 60, 110, 134, 0, 61, 116, 92, 0, 55, 123, 53, 0, 60, 122, 25, 0, 66, 116, 10, 0, 73, 107, 1,
+ 0, 80, 95, 0, 0, 88, 86, 0, 0, 94, 80, 0, 0, 98, 74, 0, 0, 100, 70, 0, 0, 99, 68, 0, 0, 51, 72, 251,
+ 0, 60, 80, 251, 0, 61, 83, 251, 0, 56, 85, 246, 0, 53, 84, 201, 0, 63, 81, 126, 0, 69, 80, 94, 0, 63, 88, 65,
+ 0, 64, 89, 33, 0, 69, 87, 17, 0, 74, 83, 5, 0, 82, 77, 0, 0, 88, 71, 0, 0, 92, 66, 0, 0, 94, 62, 0,
+ 0, 95, 59, 0, 0, 93, 57, 0, 0, 49, 51, 252, 0, 55, 57, 251, 0, 56, 59, 251, 1, 54, 58, 243, 1, 50, 58, 202,
+ 0, 63, 63, 137, 0, 66, 63, 95, 0, 66, 65, 70, 0, 68, 66, 44, 0, 72, 65, 22, 0, 79, 61, 9, 0, 87, 60, 1,
+ 0, 90, 56, 0, 0, 91, 53, 0, 0, 91, 51, 0, 0, 91, 49, 0, 0, 89, 47, 0, 0, 51, 41, 252, 0, 59, 40, 252,
+ 0, 62, 40, 252, 0, 62, 40, 251, 0, 57, 39, 227, 0, 70, 47, 158, 0, 68, 48, 103, 0, 69, 48, 78, 0, 72, 50, 59,
+ 0, 73, 47, 33, 0, 84, 45, 16, 0, 93, 44, 6, 0, 97, 41, 1, 0, 96, 40, 0, 0, 94, 39, 0, 0, 92, 37, 0,
+ 0, 90, 34, 0, 0, 61, 30, 252, 0, 66, 29, 252, 0, 67, 28, 252, 0, 69, 27, 252, 0, 70, 28, 240, 0, 75, 32, 189,
+ 0, 73, 36, 125, 0, 73, 36, 88, 0, 74, 36, 64, 0, 74, 38, 44, 0, 80, 37, 27, 0, 89, 35, 12, 0, 93, 34, 4,
+ 0, 93, 34, 0, 0, 89, 34, 0, 0, 86, 33, 0, 0, 84, 32, 0, 0, 68, 21, 253, 0, 72, 20, 253, 0, 73, 19, 253,
+ 0, 77, 19, 252, 0, 81, 19, 242, 0, 81, 21, 199, 0, 82, 24, 149, 0, 81, 24, 103, 0, 81, 24, 71, 0, 78, 27, 50,
+ 0, 75, 29, 35, 0, 85, 28, 20, 0, 93, 26, 7, 0, 94, 26, 1, 0, 90, 26, 0, 0, 85, 27, 0, 0, 83, 28, 0,
+ 0, 72, 14, 253, 0, 76, 13, 253, 0, 80, 13, 253, 0, 84, 12, 252, 0, 88, 12, 238, 0, 86, 13, 201, 0, 85, 15, 159,
+ 0, 85, 15, 114, 0, 84, 14, 79, 0, 86, 16, 56, 0, 82, 20, 41, 0, 84, 19, 26, 0, 94, 17, 12, 0, 97, 17, 4,
+ 0, 93, 19, 0, 0, 85, 21, 0, 0, 83, 23, 0, 0, 79, 8, 253, 0, 81, 7, 253, 0, 85, 7, 253, 0, 89, 6, 251,
+ 0, 90, 6, 231, 0, 89, 7, 198, 0, 88, 8, 160, 0, 86, 8, 117, 0, 86, 8, 84, 0, 89, 9, 62, 0, 92, 10, 45,
+ 0, 93, 10, 31, 0, 96, 10, 18, 0, 97, 9, 8, 0, 97, 10, 2, 0, 88, 14, 0, 0, 83, 18, 0, 0, 88, 5, 253,
+ 0, 87, 3, 253, 0, 88, 2, 252, 0, 90, 2, 243, 0, 89, 2, 219, 0, 88, 2, 191, 0, 87, 3, 155, 0, 86, 3, 116,
+ 0, 86, 3, 87, 0, 90, 3, 68, 0, 93, 3, 52, 0, 96, 4, 36, 0, 98, 4, 24, 0, 100, 3, 14, 0, 97, 3, 5,
+ 0, 93, 6, 1, 0, 87, 13, 0, 0, 97, 3, 253, 0, 92, 1, 251, 0, 89, 0, 240, 0, 86, 0, 221, 0, 85, 0, 198,
+ 0, 83, 0, 170, 0, 82, 0, 137, 0, 82, 0, 105, 0, 81, 0, 82, 0, 84, 0, 67, 0, 87, 0, 56, 0, 90, 0, 41,
+ 0, 92, 0, 29, 0, 94, 0, 19, 0, 94, 0, 11, 0, 93, 1, 3, 0, 92, 8, 0, 0, 104, 2, 253, 0, 95, 0, 242,
+ 0, 89, 0, 223, 0, 85, 0, 201, 0, 81, 0, 176, 0, 78, 0, 144, 0, 77, 0, 114, 0, 74, 0, 90, 0, 73, 0, 72,
+ 0, 75, 0, 63, 0, 76, 0, 56, 0, 79, 0, 45, 0, 82, 0, 33, 0, 84, 0, 24, 0, 85, 0, 15, 0, 87, 0, 7,
+ 0, 97, 5, 0, 0, 111, 0, 253, 0, 105, 0, 238, 0, 100, 0, 222, 0, 96, 0, 206, 0, 94, 0, 186, 0, 92, 0, 157,
+ 0, 91, 0, 124, 0, 89, 0, 96, 0, 89, 0, 76, 0, 91, 0, 69, 0, 92, 0, 65, 0, 95, 0, 55, 0, 99, 0, 41,
+ 0, 104, 0, 29, 0, 107, 0, 18, 0, 110, 0, 7, 0, 113, 0, 0, 22, 3, 222, 249, 22, 1, 227, 240, 23, 1, 227, 218,
+ 19, 0, 234, 190, 17, 0, 239, 138, 15, 0, 246, 72, 15, 0, 250, 26, 16, 0, 252, 2, 12, 9, 251, 0, 9, 17, 250, 0,
+ 3, 36, 239, 0, 0, 55, 217, 4, 0, 67, 198, 4, 0, 78, 184, 3, 0, 88, 169, 2, 0, 97, 154, 1, 0, 104, 140, 0,
+ 20, 11, 202, 249, 20, 9, 207, 249, 20, 4, 221, 245, 20, 1, 228, 215, 15, 0, 239, 128, 12, 2, 245, 62, 14, 1, 250, 14,
+ 9, 12, 250, 1, 3, 26, 246, 0, 0, 37, 227, 2, 0, 48, 206, 0, 0, 61, 187, 0, 0, 71, 172, 0, 0, 81, 157, 0,
+ 0, 89, 144, 0, 0, 96, 134, 0, 0, 99, 130, 0, 15, 20, 180, 249, 16, 18, 185, 249, 17, 11, 203, 249, 16, 4, 223, 231,
+ 12, 4, 229, 140, 11, 6, 228, 75, 10, 9, 234, 24, 4, 23, 236, 11, 0, 31, 232, 3, 0, 37, 211, 0, 0, 51, 190, 0,
+ 0, 63, 172, 0, 0, 72, 155, 0, 0, 80, 140, 0, 0, 87, 128, 0, 0, 92, 119, 0, 0, 93, 118, 0, 3, 40, 152, 250,
+ 9, 32, 159, 250, 8, 26, 174, 250, 11, 11, 206, 250, 5, 24, 205, 193, 0, 34, 202, 135, 0, 33, 203, 74, 0, 33, 205, 41,
+ 0, 35, 202, 12, 0, 39, 192, 1, 0, 52, 173, 0, 0, 64, 152, 0, 0, 72, 135, 0, 0, 79, 122, 0, 0, 84, 111, 0,
+ 0, 88, 102, 0, 0, 87, 103, 0, 0, 45, 127, 250, 1, 48, 138, 250, 4, 41, 143, 250, 1, 30, 160, 250, 0, 34, 163, 200,
+ 0, 34, 162, 146, 0, 35, 167, 87, 0, 37, 171, 51, 0, 40, 169, 20, 0, 43, 164, 6, 0, 54, 148, 0, 0, 64, 128, 0,
+ 0, 70, 113, 0, 0, 75, 102, 0, 0, 80, 93, 0, 0, 84, 87, 0, 0, 83, 88, 0, 0, 44, 102, 251, 0, 49, 109, 251,
+ 0, 44, 113, 251, 0, 39, 123, 251, 0, 37, 125, 205, 0, 38, 118, 138, 0, 40, 121, 101, 0, 41, 126, 60, 0, 43, 129, 27,
+ 0, 46, 128, 12, 0, 54, 120, 2, 0, 62, 105, 0, 0, 68, 93, 0, 0, 73, 86, 0, 0, 79, 80, 0, 0, 83, 75, 0,
+ 0, 84, 74, 0, 0, 42, 77, 252, 0, 45, 82, 251, 0, 44, 86, 251, 0, 40, 89, 244, 0, 41, 88, 198, 0, 41, 87, 138,
+ 0, 50, 84, 96, 0, 49, 92, 69, 0, 46, 97, 36, 0, 49, 98, 19, 0, 54, 93, 6, 0, 61, 86, 1, 0, 68, 78, 0,
+ 0, 73, 73, 0, 0, 77, 67, 0, 0, 81, 62, 0, 0, 83, 61, 0, 0, 41, 56, 252, 0, 43, 60, 252, 0, 43, 62, 251,
+ 0, 41, 64, 243, 0, 43, 65, 201, 0, 44, 65, 146, 0, 49, 65, 93, 0, 52, 67, 73, 0, 50, 71, 49, 0, 48, 76, 28,
+ 0, 57, 72, 11, 0, 63, 69, 2, 0, 68, 64, 0, 0, 72, 59, 0, 0, 75, 55, 0, 0, 77, 53, 0, 0, 79, 51, 0,
+ 0, 40, 40, 252, 0, 44, 40, 252, 0, 44, 41, 252, 1, 40, 42, 243, 1, 42, 44, 206, 0, 47, 49, 160, 0, 49, 50, 104,
+ 0, 53, 52, 76, 0, 52, 54, 56, 0, 52, 55, 35, 0, 60, 53, 16, 0, 66, 51, 5, 0, 70, 50, 0, 0, 72, 47, 0,
+ 0, 73, 45, 0, 0, 73, 43, 0, 0, 75, 40, 0, 0, 40, 32, 253, 0, 46, 30, 253, 0, 46, 29, 253, 0, 42, 31, 251,
+ 1, 41, 30, 227, 0, 52, 36, 184, 0, 50, 38, 120, 0, 52, 39, 80, 0, 54, 39, 63, 0, 57, 40, 48, 0, 61, 39, 25,
+ 0, 70, 38, 11, 0, 75, 36, 3, 0, 76, 35, 0, 0, 75, 33, 0, 0, 73, 32, 0, 0, 73, 29, 0, 0, 48, 22, 253,
+ 0, 51, 21, 253, 0, 51, 20, 253, 0, 52, 20, 251, 0, 53, 20, 233, 0, 59, 24, 196, 0, 59, 26, 147, 0, 59, 28, 96,
+ 0, 58, 28, 69, 0, 59, 29, 50, 0, 60, 30, 34, 0, 66, 30, 19, 0, 73, 28, 7, 0, 76, 27, 1, 0, 72, 28, 0,
+ 0, 70, 28, 0, 0, 69, 27, 0, 0, 52, 15, 253, 0, 56, 14, 253, 0, 57, 14, 253, 0, 59, 13, 251, 0, 61, 14, 230,
+ 0, 64, 16, 198, 0, 65, 17, 158, 0, 65, 18, 114, 0, 64, 18, 80, 0, 60, 20, 54, 0, 59, 23, 40, 0, 61, 23, 26,
+ 0, 69, 22, 14, 0, 77, 20, 3, 0, 74, 21, 0, 0, 70, 23, 0, 0, 69, 24, 0, 0, 56, 9, 253, 0, 60, 8, 253,
+ 0, 63, 8, 253, 0, 66, 8, 250, 0, 68, 9, 226, 0, 68, 9, 196, 0, 69, 10, 160, 0, 68, 10, 119, 0, 67, 11, 85,
+ 0, 64, 13, 58, 0, 65, 14, 45, 0, 67, 15, 32, 0, 70, 14, 19, 0, 79, 12, 8, 0, 80, 13, 1, 0, 72, 16, 0,
+ 0, 69, 19, 0, 0, 65, 5, 253, 0, 66, 4, 253, 0, 68, 3, 252, 0, 70, 3, 244, 0, 69, 4, 218, 0, 70, 4, 192,
+ 0, 69, 5, 158, 0, 69, 5, 121, 0, 69, 5, 91, 0, 70, 5, 66, 0, 73, 5, 51, 0, 77, 5, 37, 0, 79, 6, 24,
+ 0, 81, 5, 13, 0, 80, 5, 4, 0, 76, 8, 0, 0, 72, 14, 0, 0, 76, 3, 253, 0, 74, 1, 252, 0, 73, 0, 246,
+ 0, 72, 0, 229, 0, 70, 0, 208, 0, 69, 1, 182, 0, 68, 1, 149, 0, 69, 0, 117, 0, 69, 0, 88, 0, 69, 0, 68,
+ 0, 72, 0, 55, 0, 76, 0, 42, 0, 78, 0, 29, 0, 80, 0, 19, 0, 81, 0, 9, 0, 79, 1, 2, 0, 77, 9, 0,
+ 0, 85, 2, 253, 0, 80, 0, 245, 0, 76, 0, 228, 0, 72, 0, 208, 0, 69, 0, 186, 0, 66, 0, 152, 0, 65, 0, 122,
+ 0, 65, 0, 96, 0, 63, 0, 74, 0, 63, 0, 61, 0, 65, 0, 53, 0, 67, 0, 44, 0, 69, 0, 33, 0, 71, 0, 24,
+ 0, 72, 0, 15, 0, 73, 0, 7, 0, 82, 5, 0, 0, 93, 0, 253, 0, 90, 0, 241, 0, 86, 0, 227, 0, 83, 0, 211,
+ 0, 81, 0, 192, 0, 79, 0, 165, 0, 78, 0, 132, 0, 77, 0, 103, 0, 76, 0, 80, 0, 76, 0, 64, 0, 78, 0, 59,
+ 0, 79, 0, 53, 0, 83, 0, 42, 0, 87, 0, 30, 0, 90, 0, 19, 0, 94, 0, 8, 0, 95, 0, 0, 15, 6, 217, 249,
+ 15, 3, 225, 247, 16, 1, 227, 227, 13, 0, 233, 203, 12, 0, 237, 163, 10, 0, 243, 103, 11, 0, 249, 47, 12, 0, 252, 16,
+ 13, 0, 253, 0, 9, 9, 252, 0, 7, 15, 251, 0, 2, 32, 240, 0, 0, 47, 217, 2, 0, 58, 198, 2, 0, 68, 183, 1,
+ 0, 77, 168, 0, 0, 86, 153, 0, 13, 10, 206, 249, 13, 11, 205, 249, 13, 7, 217, 247, 14, 2, 226, 226, 9, 1, 237, 154,
+ 7, 2, 242, 91, 6, 5, 245, 39, 7, 5, 248, 8, 4, 14, 243, 1, 0, 25, 232, 2, 0, 31, 214, 1, 0, 41, 199, 0,
+ 0, 52, 183, 0, 0, 62, 169, 0, 0, 70, 157, 0, 0, 77, 145, 0, 0, 81, 142, 0, 8, 18, 191, 250, 9, 19, 189, 250,
+ 10, 13, 201, 250, 10, 7, 222, 240, 5, 10, 226, 167, 3, 13, 223, 104, 4, 14, 225, 51, 2, 17, 230, 20, 0, 23, 225, 9,
+ 0, 25, 214, 1, 0, 32, 199, 0, 0, 43, 180, 0, 0, 54, 164, 0, 0, 63, 150, 0, 0, 69, 136, 0, 0, 73, 127, 0,
+ 0, 75, 128, 0, 0, 32, 159, 250, 2, 30, 163, 250, 2, 26, 178, 250, 4, 14, 203, 250, 2, 20, 203, 203, 0, 23, 199, 147,
+ 0, 23, 200, 89, 0, 23, 204, 49, 0, 24, 203, 15, 0, 26, 199, 2, 0, 33, 183, 0, 0, 45, 162, 0, 0, 55, 143, 0,
+ 0, 63, 129, 0, 0, 67, 118, 0, 0, 71, 110, 0, 0, 71, 113, 0, 0, 33, 127, 251, 0, 36, 135, 251, 0, 33, 145, 250,
+ 0, 23, 166, 250, 0, 25, 162, 201, 0, 24, 157, 151, 0, 24, 169, 94, 0, 26, 172, 57, 0, 27, 175, 21, 0, 29, 172, 7,
+ 0, 35, 160, 1, 0, 46, 138, 0, 0, 56, 122, 0, 0, 61, 110, 0, 0, 65, 100, 0, 0, 68, 93, 0, 0, 68, 97, 0,
+ 0, 33, 101, 251, 0, 35, 107, 251, 0, 33, 113, 251, 0, 26, 122, 251, 0, 26, 120, 203, 0, 26, 125, 147, 0, 29, 119, 105,
+ 0, 29, 127, 65, 0, 30, 133, 31, 0, 32, 135, 14, 0, 36, 132, 3, 0, 46, 116, 0, 0, 54, 102, 0, 0, 59, 92, 0,
+ 0, 63, 85, 0, 0, 67, 81, 0, 0, 67, 83, 0, 0, 34, 79, 252, 0, 35, 83, 252, 0, 33, 86, 252, 0, 28, 90, 247,
+ 0, 29, 90, 201, 0, 29, 91, 144, 0, 32, 91, 102, 0, 34, 99, 74, 0, 34, 104, 41, 0, 34, 105, 21, 0, 37, 104, 8,
+ 0, 45, 95, 1, 0, 52, 85, 0, 0, 58, 78, 0, 0, 63, 72, 0, 0, 67, 68, 0, 0, 68, 68, 0, 0, 33, 59, 252,
+ 0, 34, 62, 252, 0, 32, 63, 251, 0, 29, 65, 236, 0, 31, 66, 197, 0, 34, 69, 144, 0, 34, 70, 102, 0, 40, 69, 74,
+ 0, 39, 75, 53, 0, 34, 80, 32, 0, 39, 80, 13, 0, 45, 77, 3, 0, 52, 70, 0, 0, 58, 64, 0, 0, 62, 59, 0,
+ 0, 66, 56, 0, 0, 69, 55, 0, 0, 33, 44, 253, 0, 34, 43, 253, 0, 33, 44, 251, 0, 29, 46, 234, 0, 35, 51, 191,
+ 0, 35, 51, 144, 0, 36, 52, 103, 0, 41, 53, 72, 0, 43, 54, 57, 0, 39, 58, 39, 0, 43, 60, 18, 0, 47, 60, 6,
+ 0, 52, 57, 1, 0, 57, 52, 0, 0, 61, 49, 0, 0, 63, 46, 0, 0, 66, 44, 0, 0, 31, 31, 253, 0, 34, 31, 253,
+ 0, 33, 30, 253, 1, 30, 32, 243, 1, 35, 36, 208, 0, 35, 38, 172, 0, 36, 39, 120, 0, 40, 40, 80, 0, 42, 41, 60,
+ 0, 41, 43, 46, 0, 44, 44, 25, 0, 50, 44, 11, 0, 55, 42, 2, 0, 58, 40, 0, 0, 59, 38, 0, 0, 60, 36, 0,
+ 0, 62, 34, 0, 0, 31, 23, 253, 0, 35, 22, 253, 0, 35, 21, 253, 0, 35, 21, 251, 0, 37, 22, 226, 0, 41, 25, 190,
+ 0, 39, 26, 142, 0, 42, 29, 93, 0, 43, 30, 64, 0, 43, 31, 50, 0, 42, 30, 37, 0, 51, 32, 18, 0, 58, 30, 6,
+ 0, 61, 29, 0, 0, 60, 28, 0, 0, 59, 27, 0, 0, 59, 24, 0, 0, 37, 16, 253, 0, 40, 15, 253, 0, 41, 15, 253,
+ 0, 42, 15, 252, 0, 42, 15, 231, 0, 48, 18, 200, 0, 47, 19, 159, 0, 48, 20, 114, 0, 48, 22, 76, 0, 45, 23, 54,
+ 0, 46, 23, 39, 0, 50, 24, 25, 0, 55, 24, 12, 0, 61, 22, 3, 0, 60, 22, 0, 0, 57, 23, 0, 0, 56, 23, 0,
+ 0, 41, 10, 254, 0, 44, 9, 254, 0, 47, 9, 254, 0, 48, 9, 250, 0, 51, 10, 227, 0, 52, 10, 199, 0, 53, 12, 163,
+ 0, 53, 11, 121, 0, 53, 13, 87, 0, 50, 16, 59, 0, 48, 17, 43, 0, 50, 17, 31, 0, 52, 17, 19, 0, 58, 17, 9,
+ 0, 62, 16, 1, 0, 58, 17, 0, 0, 57, 19, 0, 0, 47, 6, 254, 0, 50, 5, 254, 0, 52, 4, 253, 0, 54, 5, 242,
+ 0, 55, 5, 219, 0, 56, 5, 194, 0, 56, 6, 161, 0, 56, 6, 124, 0, 57, 6, 93, 0, 56, 7, 68, 0, 54, 9, 48,
+ 0, 55, 9, 37, 0, 57, 10, 25, 0, 58, 9, 14, 0, 65, 8, 4, 0, 61, 10, 0, 0, 59, 14, 0, 0, 56, 4, 254,
+ 0, 57, 1, 253, 0, 57, 1, 250, 0, 58, 1, 232, 0, 57, 1, 211, 0, 58, 1, 186, 0, 57, 1, 154, 0, 57, 1, 122,
+ 0, 58, 1, 94, 0, 58, 1, 70, 0, 59, 2, 54, 0, 61, 2, 42, 0, 63, 2, 29, 0, 65, 2, 19, 0, 67, 1, 8,
+ 0, 65, 2, 1, 0, 63, 9, 0, 0, 65, 2, 253, 0, 63, 0, 246, 0, 61, 0, 230, 0, 60, 0, 209, 0, 59, 0, 188,
+ 0, 57, 0, 158, 0, 56, 0, 127, 0, 56, 0, 101, 0, 55, 0, 79, 0, 54, 0, 63, 0, 55, 0, 51, 0, 56, 0, 42,
+ 0, 58, 0, 33, 0, 59, 0, 23, 0, 60, 0, 15, 0, 62, 0, 7, 0, 68, 5, 0, 0, 75, 0, 253, 0, 72, 0, 245,
+ 0, 70, 0, 233, 0, 69, 0, 219, 0, 67, 0, 201, 0, 66, 0, 175, 0, 64, 0, 139, 0, 64, 0, 109, 0, 64, 0, 85,
+ 0, 63, 0, 67, 0, 64, 0, 54, 0, 65, 0, 49, 0, 67, 0, 42, 0, 71, 0, 30, 0, 74, 0, 20, 0, 78, 0, 9,
+ 0, 80, 0, 0, 7, 9, 211, 250, 7, 6, 219, 248, 9, 2, 227, 233, 8, 0, 232, 211, 8, 0, 236, 181, 7, 0, 241, 130,
+ 8, 0, 247, 72, 9, 0, 250, 32, 10, 0, 252, 11, 10, 1, 253, 0, 7, 9, 252, 0, 6, 13, 251, 0, 1, 28, 238, 0,
+ 0, 40, 216, 1, 0, 50, 196, 0, 0, 60, 182, 0, 0, 70, 167, 0, 5, 12, 205, 250, 6, 13, 203, 250, 6, 9, 213, 249,
+ 8, 4, 226, 235, 6, 0, 236, 175, 4, 0, 239, 111, 3, 3, 239, 62, 3, 4, 243, 24, 1, 13, 238, 11, 0, 17, 234, 4,
+ 0, 21, 222, 1, 0, 26, 209, 1, 0, 35, 195, 0, 0, 45, 180, 0, 0, 54, 168, 0, 0, 62, 158, 0, 0, 66, 156, 0,
+ 2, 19, 193, 250, 3, 20, 190, 250, 4, 14, 202, 250, 4, 10, 219, 241, 2, 8, 224, 180, 0, 13, 220, 122, 0, 13, 220, 73,
+ 0, 13, 225, 34, 0, 14, 220, 14, 0, 16, 215, 3, 0, 21, 205, 0, 0, 28, 192, 0, 0, 36, 175, 0, 0, 47, 160, 0,
+ 0, 56, 147, 0, 0, 60, 138, 0, 0, 63, 142, 0, 0, 23, 166, 250, 0, 24, 167, 250, 1, 20, 181, 250, 1, 13, 197, 247,
+ 0, 15, 200, 209, 0, 14, 197, 158, 0, 14, 201, 101, 0, 14, 203, 57, 0, 15, 204, 19, 0, 17, 201, 4, 0, 23, 190, 0,
+ 0, 29, 173, 0, 0, 39, 153, 0, 0, 48, 137, 0, 0, 54, 127, 0, 0, 59, 119, 0, 0, 60, 126, 0, 0, 23, 131, 251,
+ 0, 25, 135, 251, 0, 21, 146, 251, 0, 15, 162, 251, 0, 15, 157, 201, 0, 15, 157, 155, 0, 15, 177, 102, 0, 16, 181, 63,
+ 0, 17, 181, 25, 0, 19, 180, 8, 0, 23, 169, 1, 0, 31, 150, 0, 0, 40, 131, 0, 0, 47, 118, 0, 0, 52, 108, 0,
+ 0, 56, 101, 0, 0, 57, 109, 0, 0, 24, 101, 252, 0, 25, 106, 252, 0, 22, 112, 252, 0, 18, 122, 252, 0, 19, 117, 200,
+ 0, 14, 128, 156, 0, 20, 121, 109, 0, 20, 131, 73, 0, 21, 139, 35, 0, 21, 140, 15, 0, 24, 139, 4, 0, 31, 127, 0,
+ 0, 39, 111, 0, 0, 45, 100, 0, 0, 51, 92, 0, 0, 55, 86, 0, 0, 55, 92, 0, 0, 25, 80, 252, 0, 25, 83, 252,
+ 0, 22, 85, 252, 0, 20, 89, 246, 0, 21, 91, 197, 0, 18, 92, 150, 0, 22, 91, 103, 0, 23, 100, 78, 0, 24, 107, 44,
+ 0, 24, 109, 23, 0, 25, 109, 9, 0, 30, 105, 1, 0, 37, 94, 0, 0, 44, 84, 0, 0, 50, 77, 0, 0, 54, 73, 0,
+ 0, 54, 77, 0, 0, 25, 62, 253, 0, 24, 63, 253, 0, 22, 65, 253, 0, 21, 66, 233, 0, 24, 67, 194, 0, 25, 71, 146,
+ 0, 25, 72, 104, 0, 24, 74, 79, 0, 25, 80, 55, 0, 25, 84, 36, 0, 26, 85, 15, 0, 29, 86, 4, 0, 36, 78, 0,
+ 0, 43, 70, 0, 0, 49, 64, 0, 0, 53, 60, 0, 0, 54, 63, 0, 0, 25, 47, 253, 0, 24, 48, 253, 0, 23, 48, 249,
+ 0, 25, 50, 222, 0, 27, 53, 192, 0, 26, 53, 143, 0, 26, 54, 104, 0, 28, 58, 77, 0, 31, 54, 55, 0, 30, 60, 42,
+ 0, 29, 65, 21, 0, 31, 66, 9, 0, 36, 63, 1, 0, 43, 57, 0, 0, 48, 53, 0, 0, 52, 50, 0, 0, 55, 50, 0,
+ 0, 25, 34, 253, 0, 23, 35, 253, 0, 23, 35, 250, 0, 23, 36, 230, 0, 29, 40, 197, 0, 26, 39, 166, 0, 27, 41, 112,
+ 0, 28, 37, 77, 0, 31, 42, 57, 0, 32, 44, 46, 0, 30, 48, 31, 0, 32, 49, 19, 0, 39, 47, 8, 0, 43, 46, 1,
+ 0, 47, 42, 0, 0, 50, 39, 0, 0, 53, 38, 0, 0, 23, 23, 253, 0, 25, 22, 254, 0, 25, 22, 253, 0, 27, 23, 244,
+ 0, 31, 26, 215, 0, 27, 28, 179, 0, 26, 30, 131, 0, 28, 32, 93, 0, 30, 31, 61, 0, 32, 34, 47, 0, 32, 36, 36,
+ 0, 34, 37, 22, 0, 41, 34, 10, 0, 45, 33, 1, 0, 46, 32, 0, 0, 47, 30, 0, 0, 49, 29, 0, 0, 23, 17, 254,
+ 0, 26, 16, 254, 0, 27, 16, 254, 0, 28, 16, 251, 0, 30, 17, 228, 0, 30, 20, 199, 0, 27, 20, 157, 0, 29, 21, 110,
+ 0, 31, 22, 71, 0, 31, 23, 50, 0, 33, 24, 39, 0, 35, 24, 30, 0, 42, 24, 12, 0, 47, 24, 2, 0, 48, 23, 0,
+ 0, 47, 22, 0, 0, 46, 20, 0, 0, 27, 11, 254, 0, 30, 11, 254, 0, 32, 10, 254, 0, 34, 10, 251, 0, 37, 12, 229,
+ 0, 37, 12, 201, 0, 36, 12, 164, 0, 36, 13, 122, 0, 38, 15, 89, 0, 38, 16, 59, 0, 37, 18, 43, 0, 38, 18, 30,
+ 0, 41, 18, 17, 0, 45, 18, 7, 0, 48, 17, 1, 0, 46, 18, 0, 0, 46, 18, 0, 0, 34, 7, 254, 0, 35, 6, 254,
+ 0, 37, 6, 253, 0, 39, 6, 245, 0, 41, 7, 222, 0, 43, 7, 198, 0, 42, 7, 166, 0, 42, 7, 127, 0, 43, 8, 96,
+ 0, 44, 8, 70, 0, 42, 11, 49, 0, 40, 12, 34, 0, 42, 12, 23, 0, 42, 12, 13, 0, 47, 12, 5, 0, 47, 12, 0,
+ 0, 47, 14, 0, 0, 41, 4, 254, 0, 42, 2, 253, 0, 42, 2, 250, 0, 44, 2, 232, 0, 45, 2, 211, 0, 46, 2, 190,
+ 0, 45, 2, 157, 0, 46, 2, 124, 0, 47, 2, 96, 0, 47, 2, 72, 0, 47, 3, 55, 0, 45, 5, 39, 0, 46, 5, 29,
+ 0, 47, 5, 18, 0, 47, 5, 8, 0, 50, 5, 1, 0, 50, 10, 0, 0, 49, 2, 254, 0, 49, 0, 245, 0, 49, 0, 231,
+ 0, 48, 0, 209, 0, 48, 0, 187, 0, 47, 0, 161, 0, 46, 0, 129, 0, 46, 0, 104, 0, 46, 0, 83, 0, 46, 0, 66,
+ 0, 46, 0, 52, 0, 46, 0, 40, 0, 48, 1, 32, 0, 49, 1, 23, 0, 49, 1, 14, 0, 50, 1, 5, 0, 55, 5, 0,
+ 0, 58, 0, 254, 0, 57, 0, 246, 0, 56, 0, 236, 0, 56, 0, 223, 0, 55, 0, 205, 0, 55, 0, 179, 0, 54, 0, 143,
+ 0, 53, 0, 113, 0, 53, 0, 89, 0, 53, 0, 69, 0, 53, 0, 56, 0, 53, 0, 45, 0, 55, 0, 40, 0, 57, 0, 31,
+ 0, 60, 0, 20, 0, 62, 0, 9, 0, 65, 0, 0, 2, 10, 207, 250, 1, 9, 214, 249, 6, 0, 228, 241, 6, 0, 231, 219,
+ 5, 0, 235, 194, 5, 0, 239, 154, 5, 0, 244, 100, 6, 0, 249, 53, 7, 0, 251, 25, 8, 0, 253, 9, 8, 0, 254, 0,
+ 6, 7, 253, 0, 4, 11, 252, 0, 1, 25, 237, 0, 0, 35, 214, 0, 0, 45, 195, 0, 0, 55, 181, 0, 2, 10, 201, 250,
+ 1, 10, 208, 250, 4, 1, 224, 247, 3, 0, 230, 225, 2, 0, 234, 189, 2, 0, 234, 131, 2, 0, 234, 83, 1, 3, 236, 44,
+ 0, 8, 235, 22, 0, 12, 232, 9, 0, 13, 227, 2, 0, 17, 217, 1, 0, 22, 208, 1, 0, 30, 195, 0, 0, 38, 180, 0,
+ 0, 47, 170, 0, 0, 52, 170, 0, 0, 14, 191, 250, 1, 12, 197, 250, 0, 8, 212, 248, 3, 0, 222, 227, 1, 3, 222, 189,
+ 0, 5, 217, 134, 0, 6, 216, 84, 0, 6, 218, 46, 0, 7, 219, 21, 0, 9, 215, 7, 0, 13, 210, 1, 0, 19, 200, 0,
+ 0, 24, 189, 0, 0, 32, 173, 0, 0, 41, 158, 0, 0, 47, 150, 0, 0, 49, 156, 0, 0, 15, 165, 251, 0, 15, 173, 251,
+ 0, 12, 189, 250, 0, 8, 197, 246, 0, 7, 197, 212, 0, 7, 195, 166, 0, 7, 201, 93, 0, 7, 203, 53, 0, 8, 204, 24,
+ 0, 9, 203, 7, 0, 14, 195, 0, 0, 20, 181, 0, 0, 26, 165, 0, 0, 34, 148, 0, 0, 40, 137, 0, 0, 46, 130, 0,
+ 0, 47, 139, 0, 0, 16, 133, 251, 0, 16, 139, 251, 0, 13, 150, 251, 0, 9, 158, 247, 0, 7, 152, 203, 0, 8, 159, 159,
+ 0, 8, 180, 95, 0, 9, 183, 59, 0, 9, 183, 28, 0, 10, 184, 10, 0, 14, 177, 1, 0, 21, 157, 0, 0, 27, 141, 0,
+ 0, 33, 128, 0, 0, 39, 118, 0, 0, 45, 111, 0, 0, 46, 121, 0, 0, 17, 104, 252, 0, 18, 106, 252, 0, 15, 112, 252,
+ 0, 11, 122, 251, 0, 11, 116, 200, 0, 8, 126, 156, 0, 12, 127, 111, 0, 12, 132, 77, 0, 13, 140, 40, 0, 13, 144, 19,
+ 0, 15, 144, 6, 0, 20, 135, 1, 0, 26, 122, 0, 0, 32, 109, 0, 0, 38, 99, 0, 0, 43, 93, 0, 0, 43, 103, 0,
+ 0, 18, 80, 252, 0, 18, 82, 252, 0, 16, 84, 252, 0, 14, 89, 240, 0, 14, 90, 193, 0, 11, 92, 153, 0, 13, 92, 106,
+ 0, 15, 100, 80, 0, 15, 108, 48, 0, 15, 111, 27, 0, 15, 113, 11, 0, 19, 113, 2, 0, 25, 103, 0, 0, 31, 92, 0,
+ 0, 37, 84, 0, 0, 42, 79, 0, 0, 42, 87, 0, 0, 19, 63, 253, 0, 17, 63, 253, 0, 16, 65, 253, 0, 16, 65, 226,
+ 0, 16, 68, 190, 0, 16, 72, 147, 0, 17, 74, 105, 0, 15, 75, 81, 0, 16, 81, 60, 0, 16, 87, 39, 0, 17, 89, 17,
+ 0, 18, 92, 5, 0, 23, 87, 0, 0, 30, 77, 0, 0, 36, 69, 0, 0, 41, 65, 0, 0, 40, 72, 0, 0, 19, 48, 253,
+ 0, 18, 49, 253, 0, 17, 49, 248, 0, 20, 51, 217, 0, 21, 54, 188, 0, 18, 55, 144, 0, 19, 56, 107, 0, 20, 60, 79,
+ 0, 20, 61, 58, 0, 19, 66, 44, 0, 19, 70, 23, 0, 19, 72, 9, 0, 23, 71, 2, 0, 30, 63, 0, 0, 36, 57, 0,
+ 0, 39, 54, 0, 0, 40, 58, 0, 0, 19, 35, 253, 0, 18, 36, 252, 0, 17, 37, 242, 0, 20, 39, 218, 0, 21, 41, 190,
+ 0, 19, 40, 148, 0, 20, 44, 109, 0, 21, 44, 78, 0, 22, 47, 59, 0, 25, 47, 47, 0, 23, 50, 34, 0, 22, 52, 22,
+ 0, 26, 52, 10, 0, 31, 51, 1, 0, 35, 47, 0, 0, 38, 44, 0, 0, 40, 45, 0, 0, 18, 25, 254, 0, 19, 24, 254,
+ 0, 19, 24, 251, 0, 22, 26, 232, 0, 23, 28, 204, 0, 20, 31, 168, 0, 21, 31, 108, 0, 21, 30, 79, 0, 22, 33, 58,
+ 0, 25, 37, 45, 0, 26, 38, 34, 0, 25, 39, 25, 0, 28, 39, 14, 0, 31, 39, 4, 0, 34, 36, 0, 0, 37, 33, 0,
+ 0, 40, 33, 0, 0, 17, 17, 254, 0, 19, 17, 254, 0, 20, 17, 253, 0, 22, 18, 243, 0, 26, 20, 217, 0, 20, 22, 182,
+ 0, 19, 23, 146, 0, 21, 24, 101, 0, 22, 24, 70, 0, 24, 26, 49, 0, 26, 28, 37, 0, 25, 29, 29, 0, 29, 27, 15,
+ 0, 32, 27, 5, 0, 35, 26, 0, 0, 36, 24, 0, 0, 38, 24, 0, 0, 17, 13, 254, 0, 20, 12, 254, 0, 21, 11, 254,
+ 0, 23, 11, 251, 0, 26, 13, 227, 0, 25, 13, 198, 0, 23, 13, 162, 0, 22, 14, 119, 0, 23, 15, 86, 0, 25, 17, 57,
+ 0, 26, 18, 40, 0, 26, 19, 30, 0, 27, 19, 23, 0, 33, 18, 7, 0, 36, 18, 1, 0, 36, 17, 0, 0, 35, 16, 0,
+ 0, 22, 8, 254, 0, 24, 7, 254, 0, 25, 6, 254, 0, 26, 6, 251, 0, 30, 8, 227, 0, 29, 8, 202, 0, 28, 8, 170,
+ 0, 27, 8, 129, 0, 29, 9, 97, 0, 30, 10, 71, 0, 30, 11, 49, 0, 29, 13, 34, 0, 31, 13, 23, 0, 33, 12, 11,
+ 0, 36, 13, 3, 0, 36, 13, 0, 0, 36, 13, 0, 0, 28, 5, 254, 0, 29, 3, 254, 0, 30, 2, 252, 0, 30, 2, 243,
+ 0, 32, 3, 217, 0, 32, 3, 196, 0, 32, 3, 166, 0, 32, 3, 127, 0, 34, 3, 98, 0, 35, 4, 74, 0, 35, 4, 57,
+ 0, 33, 6, 39, 0, 33, 7, 26, 0, 33, 7, 17, 0, 34, 7, 7, 0, 36, 7, 1, 0, 38, 10, 0, 0, 35, 2, 254,
+ 0, 35, 0, 249, 0, 35, 0, 240, 0, 35, 0, 224, 0, 35, 0, 194, 0, 36, 0, 167, 0, 35, 0, 137, 0, 35, 0, 108,
+ 0, 36, 0, 87, 0, 37, 0, 69, 0, 37, 0, 55, 0, 37, 1, 42, 0, 37, 1, 30, 0, 38, 1, 22, 0, 38, 1, 12,
+ 0, 38, 1, 3, 0, 42, 5, 0, 0, 43, 0, 254, 0, 42, 0, 247, 0, 42, 0, 239, 0, 42, 0, 228, 0, 43, 0, 211,
+ 0, 43, 0, 181, 0, 42, 0, 148, 0, 42, 0, 117, 0, 43, 0, 92, 0, 43, 0, 71, 0, 43, 0, 57, 0, 43, 0, 46,
+ 0, 43, 0, 37, 0, 45, 0, 31, 0, 47, 0, 21, 0, 49, 0, 10, 0, 50, 0, 0, 0, 9, 207, 250, 0, 7, 213, 250,
+ 4, 0, 227, 247, 4, 0, 230, 227, 3, 0, 234, 205, 4, 0, 237, 172, 4, 0, 242, 123, 4, 0, 247, 74, 4, 0, 250, 41,
+ 6, 0, 252, 20, 6, 0, 253, 8, 6, 0, 254, 0, 4, 6, 253, 0, 3, 9, 253, 0, 0, 22, 235, 0, 0, 31, 213, 0,
+ 0, 40, 194, 0, 0, 9, 200, 250, 0, 6, 207, 250, 2, 0, 221, 249, 1, 0, 225, 228, 0, 0, 225, 195, 0, 1, 224, 144,
+ 0, 1, 227, 100, 0, 1, 231, 62, 0, 3, 233, 32, 0, 6, 230, 17, 0, 8, 228, 7, 0, 10, 223, 2, 0, 14, 216, 1,
+ 0, 18, 208, 1, 0, 25, 197, 0, 0, 33, 184, 0, 0, 37, 184, 0, 0, 10, 189, 250, 0, 7, 195, 250, 0, 3, 210, 247,
+ 0, 1, 214, 223, 0, 0, 212, 190, 0, 0, 207, 138, 0, 0, 211, 93, 0, 1, 214, 60, 0, 2, 216, 31, 0, 4, 215, 13,
+ 0, 6, 212, 3, 0, 11, 205, 0, 0, 16, 196, 0, 0, 21, 187, 0, 0, 28, 173, 0, 0, 33, 164, 0, 0, 36, 171, 0,
+ 0, 10, 164, 251, 0, 8, 169, 251, 0, 5, 186, 250, 0, 3, 192, 241, 0, 2, 191, 210, 0, 1, 191, 166, 0, 1, 199, 96,
+ 0, 1, 200, 61, 0, 2, 202, 32, 0, 3, 203, 13, 0, 6, 200, 2, 0, 13, 188, 0, 0, 18, 175, 0, 0, 23, 162, 0,
+ 0, 28, 151, 0, 0, 33, 142, 0, 0, 34, 155, 0, 0, 12, 135, 252, 0, 10, 138, 252, 0, 7, 149, 251, 0, 4, 155, 244,
+ 0, 3, 154, 202, 0, 2, 158, 159, 0, 1, 179, 95, 0, 2, 182, 63, 0, 3, 182, 36, 0, 3, 185, 16, 0, 5, 183, 3,
+ 0, 11, 168, 0, 0, 17, 152, 0, 0, 22, 139, 0, 0, 27, 129, 0, 0, 33, 121, 0, 0, 34, 136, 0, 0, 13, 106, 252,
+ 0, 12, 106, 252, 0, 10, 112, 252, 0, 7, 120, 241, 0, 5, 120, 200, 0, 4, 123, 156, 0, 5, 125, 111, 0, 6, 130, 82,
+ 0, 6, 139, 47, 0, 6, 145, 25, 0, 6, 148, 10, 0, 9, 144, 1, 0, 16, 131, 0, 0, 21, 119, 0, 0, 27, 108, 0,
+ 0, 32, 101, 0, 0, 33, 116, 0, 0, 13, 82, 253, 0, 12, 82, 253, 0, 10, 86, 251, 0, 9, 90, 234, 0, 8, 92, 197,
+ 0, 5, 94, 158, 0, 6, 92, 105, 0, 8, 98, 83, 0, 8, 107, 54, 0, 8, 113, 32, 0, 8, 116, 16, 0, 9, 117, 4,
+ 0, 14, 110, 0, 0, 20, 101, 0, 0, 27, 91, 0, 0, 32, 85, 0, 0, 32, 97, 0, 0, 14, 63, 253, 0, 12, 63, 253,
+ 0, 10, 64, 253, 0, 11, 65, 224, 0, 10, 68, 192, 0, 10, 71, 149, 0, 10, 73, 107, 0, 9, 76, 83, 0, 9, 82, 64,
+ 0, 8, 89, 44, 0, 9, 93, 22, 0, 9, 95, 7, 0, 13, 93, 1, 0, 19, 85, 0, 0, 26, 76, 0, 0, 31, 70, 0,
+ 0, 31, 81, 0, 0, 14, 49, 253, 0, 12, 49, 253, 0, 11, 50, 246, 0, 12, 52, 215, 0, 14, 55, 186, 0, 11, 56, 145,
+ 0, 12, 58, 109, 0, 12, 61, 81, 0, 12, 62, 61, 0, 10, 69, 47, 0, 10, 74, 26, 0, 9, 76, 11, 0, 12, 77, 1,
+ 0, 18, 70, 0, 0, 26, 62, 0, 0, 30, 58, 0, 0, 30, 65, 0, 0, 14, 36, 253, 0, 13, 37, 253, 0, 13, 38, 244,
+ 0, 14, 41, 214, 0, 15, 43, 186, 0, 13, 43, 144, 0, 14, 45, 109, 0, 14, 48, 81, 0, 14, 50, 62, 0, 14, 52, 47,
+ 0, 13, 55, 34, 0, 12, 58, 22, 0, 13, 60, 6, 0, 19, 57, 1, 0, 25, 51, 0, 0, 29, 48, 0, 0, 30, 53, 0,
+ 0, 13, 26, 254, 0, 14, 25, 254, 0, 14, 26, 250, 0, 15, 29, 218, 0, 14, 32, 186, 0, 13, 33, 166, 0, 14, 33, 109,
+ 0, 15, 35, 82, 0, 14, 40, 63, 0, 16, 39, 46, 0, 19, 39, 35, 0, 17, 42, 26, 0, 16, 44, 13, 0, 20, 45, 5,
+ 0, 25, 41, 0, 0, 29, 38, 0, 0, 29, 42, 0, 0, 13, 19, 254, 0, 14, 18, 254, 0, 15, 18, 253, 0, 17, 21, 235,
+ 0, 15, 23, 200, 0, 14, 24, 170, 0, 13, 24, 129, 0, 15, 26, 92, 0, 16, 26, 65, 0, 17, 28, 48, 0, 20, 31, 37,
+ 0, 20, 32, 28, 0, 18, 33, 19, 0, 19, 34, 10, 0, 25, 32, 1, 0, 28, 29, 0, 0, 29, 30, 0, 0, 13, 13, 254,
+ 0, 14, 12, 254, 0, 15, 12, 254, 0, 17, 13, 247, 0, 19, 14, 217, 0, 17, 15, 189, 0, 15, 15, 154, 0, 14, 18, 112,
+ 0, 15, 19, 79, 0, 17, 20, 56, 0, 19, 21, 39, 0, 20, 22, 27, 0, 19, 23, 20, 0, 21, 23, 10, 0, 25, 22, 1,
+ 0, 27, 20, 0, 0, 28, 20, 0, 0, 12, 9, 254, 0, 15, 8, 254, 0, 16, 7, 254, 0, 17, 7, 251, 0, 20, 8, 228,
+ 0, 19, 9, 201, 0, 17, 9, 170, 0, 13, 10, 130, 0, 15, 11, 94, 0, 16, 11, 68, 0, 18, 12, 46, 0, 19, 14, 31,
+ 0, 20, 14, 21, 0, 20, 14, 17, 0, 26, 14, 2, 0, 27, 13, 0, 0, 26, 12, 0, 0, 18, 5, 254, 0, 19, 4, 254,
+ 0, 20, 3, 254, 0, 20, 3, 249, 0, 22, 4, 229, 0, 22, 4, 204, 0, 22, 4, 176, 0, 21, 5, 136, 0, 22, 5, 102,
+ 0, 22, 5, 77, 0, 24, 6, 58, 0, 24, 7, 39, 0, 23, 8, 25, 0, 24, 8, 17, 0, 25, 8, 6, 0, 27, 8, 1,
+ 0, 27, 9, 0, 0, 24, 2, 254, 0, 25, 1, 252, 0, 24, 0, 246, 0, 25, 0, 236, 0, 25, 0, 219, 0, 25, 0, 191,
+ 0, 25, 0, 158, 0, 26, 0, 125, 0, 26, 1, 98, 0, 27, 1, 77, 0, 28, 1, 60, 0, 29, 1, 46, 0, 27, 2, 31,
+ 0, 29, 2, 21, 0, 29, 2, 11, 0, 29, 2, 2, 0, 31, 5, 0, 0, 30, 0, 254, 0, 30, 0, 248, 0, 30, 0, 241,
+ 0, 30, 0, 233, 0, 30, 0, 219, 0, 30, 0, 187, 0, 31, 0, 153, 0, 31, 0, 122, 0, 31, 0, 96, 0, 32, 0, 75,
+ 0, 32, 0, 60, 0, 32, 0, 48, 0, 32, 0, 37, 0, 33, 0, 29, 0, 35, 0, 21, 0, 36, 0, 11, 0, 37, 0, 0,
+ 0, 6, 210, 250, 0, 5, 213, 250, 2, 0, 224, 248, 2, 0, 230, 231, 1, 0, 233, 211, 2, 0, 236, 184, 2, 0, 240, 144,
+ 2, 0, 245, 96, 2, 0, 249, 59, 3, 0, 251, 33, 4, 0, 253, 18, 4, 0, 254, 8, 4, 0, 254, 0, 3, 4, 254, 0,
+ 2, 6, 253, 0, 0, 18, 234, 0, 0, 28, 212, 0, 0, 6, 200, 250, 0, 3, 206, 250, 0, 1, 215, 244, 0, 0, 215, 221,
+ 0, 0, 215, 195, 0, 0, 213, 148, 0, 0, 218, 109, 0, 0, 223, 76, 0, 1, 227, 46, 0, 1, 230, 25, 0, 3, 229, 13,
+ 0, 5, 227, 4, 0, 7, 222, 1, 0, 10, 216, 0, 0, 14, 211, 0, 0, 21, 202, 0, 0, 25, 201, 0, 0, 7, 186, 251,
+ 0, 4, 192, 250, 0, 0, 200, 237, 0, 0, 199, 207, 0, 0, 198, 183, 0, 0, 199, 135, 0, 0, 203, 99, 0, 0, 207, 70,
+ 0, 0, 210, 43, 0, 0, 213, 21, 0, 2, 213, 9, 0, 5, 210, 1, 0, 10, 203, 0, 0, 14, 196, 0, 0, 17, 189, 0,
+ 0, 22, 182, 0, 0, 24, 190, 0, 0, 7, 163, 251, 0, 4, 165, 251, 0, 1, 177, 241, 0, 0, 177, 206, 0, 0, 177, 170,
+ 0, 0, 183, 130, 0, 0, 191, 92, 0, 0, 192, 66, 0, 0, 194, 44, 0, 0, 198, 23, 0, 1, 199, 8, 0, 4, 195, 1,
+ 0, 9, 186, 0, 0, 13, 177, 0, 0, 17, 167, 0, 0, 22, 159, 0, 0, 24, 175, 0, 0, 7, 136, 252, 0, 5, 138, 252,
+ 0, 2, 147, 247, 0, 1, 149, 214, 0, 0, 149, 166, 0, 0, 154, 131, 0, 0, 170, 93, 0, 0, 173, 66, 0, 0, 176, 45,
+ 0, 0, 178, 25, 0, 0, 182, 10, 0, 3, 178, 1, 0, 8, 164, 0, 0, 12, 152, 0, 0, 16, 142, 0, 0, 22, 134, 0,
+ 0, 23, 155, 0, 0, 8, 108, 252, 0, 7, 109, 252, 0, 4, 116, 249, 0, 3, 119, 220, 0, 2, 121, 180, 0, 0, 120, 145,
+ 0, 1, 121, 109, 0, 1, 127, 85, 0, 1, 137, 54, 0, 1, 143, 31, 0, 1, 149, 15, 0, 1, 150, 3, 0, 7, 139, 0,
+ 0, 12, 128, 0, 0, 16, 119, 0, 0, 22, 112, 0, 0, 23, 132, 0, 0, 8, 84, 253, 0, 7, 85, 253, 0, 5, 89, 250,
+ 0, 5, 91, 223, 0, 3, 94, 189, 0, 1, 95, 153, 0, 1, 92, 106, 0, 2, 98, 85, 0, 2, 106, 59, 0, 2, 113, 38,
+ 0, 2, 118, 21, 0, 2, 121, 8, 0, 5, 117, 1, 0, 11, 107, 0, 0, 16, 99, 0, 0, 22, 93, 0, 0, 22, 110, 0,
+ 0, 9, 64, 253, 0, 7, 64, 253, 0, 5, 65, 248, 0, 5, 66, 222, 0, 5, 69, 191, 0, 4, 71, 151, 0, 3, 73, 107,
+ 0, 3, 77, 84, 0, 3, 82, 65, 0, 2, 89, 49, 0, 3, 95, 26, 0, 3, 98, 12, 0, 4, 98, 1, 0, 10, 90, 0,
+ 0, 16, 82, 0, 0, 22, 77, 0, 0, 22, 91, 0, 0, 9, 50, 253, 0, 7, 50, 253, 0, 5, 51, 243, 0, 5, 52, 213,
+ 0, 6, 55, 184, 0, 5, 57, 144, 0, 5, 58, 108, 0, 5, 61, 83, 0, 6, 62, 63, 0, 4, 69, 51, 0, 3, 77, 30,
+ 0, 3, 79, 16, 0, 3, 80, 3, 0, 9, 75, 0, 0, 15, 68, 0, 0, 21, 63, 0, 0, 21, 74, 0, 0, 9, 38, 253,
+ 0, 7, 38, 253, 0, 7, 39, 245, 0, 8, 41, 210, 0, 8, 43, 180, 0, 7, 44, 140, 0, 7, 46, 109, 0, 7, 49, 84,
+ 0, 8, 51, 63, 0, 7, 54, 48, 0, 5, 58, 36, 0, 4, 62, 25, 0, 4, 65, 8, 0, 8, 62, 0, 0, 15, 56, 0,
+ 0, 21, 52, 0, 0, 21, 60, 0, 0, 9, 27, 254, 0, 9, 27, 254, 0, 9, 27, 250, 0, 8, 31, 213, 0, 8, 33, 170,
+ 0, 8, 33, 138, 0, 8, 36, 107, 0, 9, 37, 83, 0, 7, 41, 64, 0, 9, 40, 47, 0, 10, 41, 36, 0, 8, 46, 26,
+ 0, 7, 50, 14, 0, 8, 51, 2, 0, 15, 46, 0, 0, 21, 42, 0, 0, 21, 49, 0, 0, 9, 20, 254, 0, 10, 19, 254,
+ 0, 10, 20, 251, 0, 11, 23, 224, 0, 9, 25, 187, 0, 8, 26, 160, 0, 8, 26, 124, 0, 9, 28, 89, 0, 9, 30, 64,
+ 0, 10, 30, 47, 0, 13, 33, 36, 0, 14, 33, 27, 0, 12, 36, 20, 0, 10, 37, 10, 0, 14, 37, 1, 0, 20, 33, 0,
+ 0, 20, 38, 0, 0, 9, 15, 254, 0, 10, 13, 254, 0, 10, 13, 253, 0, 14, 15, 241, 0, 12, 16, 213, 0, 11, 17, 179,
+ 0, 8, 17, 146, 0, 8, 20, 102, 0, 11, 21, 65, 0, 12, 22, 48, 0, 13, 23, 37, 0, 15, 25, 26, 0, 16, 25, 19,
+ 0, 14, 26, 13, 0, 16, 27, 4, 0, 19, 25, 0, 0, 19, 27, 0, 0, 8, 10, 254, 0, 10, 8, 254, 0, 10, 8, 254,
+ 0, 11, 8, 248, 0, 14, 10, 223, 0, 12, 10, 192, 0, 9, 10, 157, 0, 6, 13, 116, 0, 8, 14, 84, 0, 10, 15, 62,
+ 0, 12, 15, 44, 0, 14, 17, 30, 0, 15, 17, 20, 0, 13, 18, 15, 0, 16, 18, 5, 0, 18, 16, 0, 0, 19, 17, 0,
+ 0, 8, 6, 255, 0, 10, 4, 255, 0, 11, 4, 254, 0, 11, 3, 250, 0, 14, 5, 230, 0, 12, 5, 205, 0, 11, 5, 176,
+ 0, 10, 6, 134, 0, 11, 6, 100, 0, 11, 6, 75, 0, 13, 7, 56, 0, 14, 8, 37, 0, 14, 9, 23, 0, 14, 9, 16,
+ 0, 14, 10, 12, 0, 18, 9, 0, 0, 17, 8, 0, 0, 14, 3, 255, 0, 15, 1, 254, 0, 15, 1, 251, 0, 15, 0, 245,
+ 0, 15, 1, 231, 0, 15, 1, 209, 0, 15, 1, 180, 0, 15, 1, 141, 0, 16, 2, 107, 0, 16, 2, 83, 0, 17, 2, 63,
+ 0, 18, 2, 47, 0, 18, 3, 31, 0, 18, 3, 21, 0, 21, 2, 11, 0, 20, 3, 0, 0, 20, 5, 0, 0, 20, 0, 255,
+ 0, 20, 0, 249, 0, 20, 0, 243, 0, 20, 0, 236, 0, 20, 0, 227, 0, 20, 0, 205, 0, 21, 0, 169, 0, 21, 0, 136,
+ 0, 21, 0, 105, 0, 22, 0, 81, 0, 22, 0, 62, 0, 23, 0, 49, 0, 23, 0, 38, 0, 23, 0, 28, 0, 24, 0, 21,
+ 0, 25, 0, 11, 0, 25, 0, 0, 0, 3, 213, 250, 0, 2, 215, 250, 1, 0, 221, 247, 1, 0, 225, 231, 0, 0, 228, 213,
+ 0, 0, 232, 191, 1, 0, 237, 160, 0, 0, 241, 117, 1, 0, 246, 79, 1, 0, 249, 49, 2, 0, 252, 29, 2, 0, 253, 17,
+ 2, 0, 254, 9, 2, 0, 254, 2, 2, 1, 254, 0, 1, 3, 254, 0, 0, 15, 234, 0, 0, 3, 201, 250, 0, 1, 206, 247,
+ 0, 0, 207, 235, 0, 0, 207, 213, 0, 0, 207, 192, 0, 0, 206, 156, 0, 0, 211, 119, 0, 0, 217, 90, 0, 0, 222, 63,
+ 0, 0, 227, 37, 0, 1, 229, 22, 0, 1, 230, 12, 0, 2, 229, 4, 0, 5, 224, 1, 0, 7, 220, 1, 0, 10, 216, 0,
+ 0, 12, 217, 0, 0, 4, 184, 251, 0, 1, 189, 246, 0, 0, 188, 220, 0, 0, 186, 195, 0, 0, 185, 174, 0, 0, 188, 139,
+ 0, 0, 197, 104, 0, 0, 201, 77, 0, 0, 204, 57, 0, 0, 208, 34, 0, 0, 211, 19, 0, 0, 212, 9, 0, 2, 211, 2,
+ 0, 5, 206, 1, 0, 8, 202, 0, 0, 10, 199, 0, 0, 12, 207, 0, 0, 3, 161, 251, 0, 1, 163, 248, 0, 0, 163, 223,
+ 0, 0, 161, 185, 0, 0, 161, 152, 0, 0, 167, 131, 0, 0, 180, 100, 0, 0, 184, 75, 0, 0, 188, 55, 0, 0, 191, 34,
+ 0, 0, 195, 19, 0, 0, 197, 8, 0, 2, 195, 1, 0, 5, 189, 0, 0, 8, 183, 0, 0, 11, 179, 0, 0, 12, 195, 0,
+ 0, 3, 136, 252, 0, 2, 138, 249, 0, 0, 139, 230, 0, 0, 136, 191, 0, 0, 137, 142, 0, 0, 139, 118, 0, 1, 145, 98,
+ 0, 1, 151, 76, 0, 0, 164, 56, 0, 0, 168, 36, 0, 0, 173, 21, 0, 0, 177, 9, 0, 1, 175, 2, 0, 5, 165, 0,
+ 0, 8, 156, 0, 0, 11, 152, 0, 0, 11, 178, 0, 0, 4, 110, 252, 0, 3, 111, 251, 0, 1, 116, 240, 0, 0, 115, 204,
+ 0, 0, 116, 159, 0, 0, 114, 128, 0, 0, 113, 106, 0, 0, 118, 89, 0, 0, 128, 61, 0, 0, 134, 41, 0, 0, 140, 26,
+ 0, 0, 145, 13, 0, 1, 146, 3, 0, 5, 139, 0, 0, 8, 131, 0, 0, 12, 127, 0, 0, 11, 154, 0, 0, 4, 86, 253,
+ 0, 3, 87, 252, 0, 1, 91, 246, 0, 1, 91, 216, 0, 0, 93, 178, 0, 0, 93, 139, 0, 0, 92, 101, 0, 0, 96, 83,
+ 0, 0, 103, 61, 0, 0, 107, 45, 0, 0, 113, 29, 0, 0, 117, 17, 0, 1, 119, 6, 0, 4, 114, 1, 0, 8, 108, 0,
+ 0, 12, 105, 0, 0, 11, 128, 0, 0, 4, 65, 253, 0, 3, 65, 253, 0, 1, 66, 245, 0, 1, 68, 221, 0, 1, 71, 190,
+ 0, 0, 73, 147, 0, 0, 75, 107, 0, 0, 77, 82, 0, 0, 80, 65, 0, 0, 86, 53, 0, 0, 93, 33, 0, 0, 96, 20,
+ 0, 0, 98, 8, 0, 3, 95, 1, 0, 8, 89, 0, 0, 12, 86, 0, 0, 11, 105, 0, 0, 5, 51, 254, 0, 3, 51, 252,
+ 0, 1, 53, 241, 0, 1, 54, 217, 0, 1, 57, 190, 0, 1, 59, 151, 0, 1, 61, 114, 0, 0, 62, 84, 0, 0, 62, 64,
+ 0, 0, 68, 51, 0, 0, 76, 34, 0, 0, 78, 23, 0, 0, 80, 11, 0, 2, 79, 1, 0, 7, 73, 0, 0, 12, 71, 0,
+ 0, 11, 85, 0, 0, 5, 39, 254, 0, 3, 39, 253, 0, 2, 40, 243, 0, 2, 43, 215, 0, 2, 45, 188, 0, 1, 46, 150,
+ 0, 1, 48, 114, 0, 1, 50, 88, 0, 2, 51, 65, 0, 0, 55, 51, 0, 1, 59, 38, 0, 0, 62, 28, 0, 0, 65, 14,
+ 0, 1, 66, 3, 0, 7, 61, 0, 0, 12, 58, 0, 0, 11, 69, 0, 0, 4, 28, 254, 0, 5, 28, 254, 0, 4, 29, 250,
+ 0, 3, 32, 219, 0, 3, 35, 185, 0, 2, 36, 144, 0, 3, 38, 106, 0, 3, 39, 85, 0, 1, 41, 65, 0, 3, 42, 49,
+ 0, 3, 44, 35, 0, 1, 50, 28, 0, 1, 53, 16, 0, 1, 54, 5, 0, 6, 50, 1, 0, 12, 47, 0, 0, 11, 56, 0,
+ 0, 5, 21, 254, 0, 5, 21, 254, 0, 5, 21, 252, 0, 4, 24, 228, 0, 4, 26, 196, 0, 3, 28, 158, 0, 3, 29, 121,
+ 0, 3, 30, 91, 0, 3, 30, 65, 0, 1, 32, 49, 0, 6, 33, 36, 0, 4, 36, 28, 0, 3, 40, 19, 0, 2, 42, 11,
+ 0, 5, 40, 1, 0, 11, 38, 0, 0, 11, 44, 0, 0, 5, 15, 254, 0, 5, 14, 254, 0, 5, 14, 253, 0, 8, 16, 239,
+ 0, 7, 18, 211, 0, 6, 19, 172, 0, 2, 19, 136, 0, 2, 22, 97, 0, 4, 23, 67, 0, 3, 24, 51, 0, 6, 25, 37,
+ 0, 7, 27, 27, 0, 10, 27, 18, 0, 7, 30, 13, 0, 6, 30, 4, 0, 10, 30, 0, 0, 10, 34, 0, 0, 4, 10, 255,
+ 0, 5, 9, 254, 0, 5, 9, 253, 0, 7, 10, 243, 0, 7, 11, 220, 0, 6, 12, 190, 0, 3, 12, 145, 0, 1, 15, 105,
+ 0, 2, 16, 77, 0, 4, 17, 56, 0, 5, 18, 40, 0, 7, 19, 31, 0, 9, 19, 20, 0, 8, 21, 14, 0, 5, 22, 6,
+ 0, 7, 22, 1, 0, 10, 24, 0, 0, 4, 6, 255, 0, 5, 4, 254, 0, 5, 4, 253, 0, 5, 4, 247, 0, 8, 6, 227,
+ 0, 6, 6, 201, 0, 5, 7, 160, 0, 4, 7, 121, 0, 4, 8, 89, 0, 3, 10, 67, 0, 5, 11, 49, 0, 6, 11, 35,
+ 0, 8, 12, 23, 0, 8, 13, 14, 0, 6, 15, 4, 0, 8, 14, 0, 0, 9, 14, 0, 0, 4, 3, 255, 0, 6, 1, 254,
+ 0, 6, 1, 253, 0, 6, 1, 250, 0, 6, 1, 235, 0, 6, 2, 211, 0, 6, 2, 182, 0, 6, 2, 138, 0, 5, 2, 103,
+ 0, 3, 3, 78, 0, 4, 3, 58, 0, 6, 4, 42, 0, 7, 4, 27, 0, 8, 5, 18, 0, 10, 4, 10, 0, 7, 5, 6,
+ 0, 8, 4, 0, 0, 10, 0, 255, 0, 10, 0, 250, 0, 10, 0, 246, 0, 10, 0, 241, 0, 10, 0, 235, 0, 10, 0, 219,
+ 0, 10, 0, 191, 0, 10, 0, 154, 0, 10, 0, 116, 0, 10, 0, 88, 0, 11, 0, 66, 0, 12, 0, 50, 0, 13, 0, 37,
+ 0, 12, 0, 27, 0, 12, 0, 18, 0, 12, 0, 10, 0, 13, 0, 0, 0, 0, 216, 250, 0, 0, 216, 247, 0, 0, 217, 239,
+ 0, 0, 218, 227, 0, 0, 221, 211, 0, 0, 224, 191, 0, 0, 228, 165, 0, 0, 233, 134, 0, 0, 239, 100, 0, 0, 244, 68,
+ 0, 0, 248, 44, 0, 0, 250, 28, 0, 0, 252, 18, 0, 0, 254, 10, 0, 0, 254, 5, 0, 0, 255, 2, 0, 0, 255, 0,
+ 0, 0, 203, 251, 0, 0, 203, 227, 0, 0, 203, 218, 0, 0, 203, 204, 0, 0, 205, 188, 0, 0, 207, 164, 0, 0, 210, 138,
+ 0, 0, 217, 113, 0, 0, 223, 89, 0, 0, 228, 61, 0, 0, 233, 38, 0, 0, 236, 26, 0, 0, 238, 17, 0, 0, 239, 10,
+ 0, 0, 240, 5, 0, 0, 240, 2, 0, 0, 240, 0, 0, 0, 185, 251, 0, 0, 187, 230, 0, 0, 186, 202, 0, 0, 186, 187,
+ 0, 0, 187, 165, 0, 0, 194, 138, 0, 0, 198, 117, 0, 0, 203, 98, 0, 0, 207, 78, 0, 0, 212, 55, 0, 0, 217, 35,
+ 0, 0, 220, 24, 0, 0, 222, 16, 0, 0, 223, 9, 0, 0, 224, 5, 0, 0, 224, 3, 0, 0, 225, 0, 0, 0, 161, 252,
+ 0, 0, 162, 233, 0, 0, 163, 207, 0, 0, 165, 171, 0, 0, 167, 148, 0, 0, 176, 125, 0, 0, 187, 113, 0, 0, 190, 95,
+ 0, 0, 194, 72, 0, 0, 197, 51, 0, 0, 202, 33, 0, 0, 206, 22, 0, 0, 208, 14, 0, 0, 209, 8, 0, 0, 210, 4,
+ 0, 0, 210, 2, 0, 0, 211, 0, 0, 0, 136, 252, 0, 0, 138, 236, 0, 0, 139, 211, 0, 0, 139, 178, 0, 0, 144, 135,
+ 0, 0, 145, 111, 0, 0, 164, 109, 0, 0, 172, 98, 0, 0, 175, 77, 0, 0, 179, 53, 0, 0, 184, 35, 0, 0, 189, 22,
+ 0, 0, 193, 13, 0, 0, 194, 7, 0, 0, 195, 3, 0, 0, 196, 1, 0, 0, 196, 0, 0, 0, 111, 253, 0, 0, 114, 239,
+ 0, 0, 115, 217, 0, 0, 117, 188, 0, 0, 120, 147, 0, 0, 124, 105, 0, 0, 128, 95, 0, 0, 131, 85, 0, 0, 136, 72,
+ 0, 0, 143, 55, 0, 0, 154, 40, 0, 0, 163, 26, 0, 0, 170, 15, 0, 0, 174, 7, 0, 0, 176, 3, 0, 0, 177, 1,
+ 0, 0, 177, 0, 0, 0, 87, 253, 0, 0, 90, 243, 0, 0, 92, 225, 0, 0, 95, 198, 0, 0, 99, 163, 0, 0, 101, 118,
+ 0, 0, 104, 86, 0, 0, 106, 78, 0, 0, 109, 69, 0, 0, 115, 57, 0, 0, 123, 43, 0, 0, 130, 30, 0, 0, 137, 19,
+ 0, 0, 142, 9, 0, 0, 145, 4, 0, 0, 147, 2, 0, 0, 150, 0, 0, 0, 67, 254, 0, 0, 68, 248, 0, 0, 71, 233,
+ 0, 0, 74, 208, 0, 0, 78, 177, 0, 0, 82, 134, 0, 0, 85, 98, 0, 0, 87, 75, 0, 0, 90, 67, 0, 0, 94, 58,
+ 0, 0, 99, 45, 0, 0, 104, 33, 0, 0, 109, 22, 0, 0, 114, 12, 0, 0, 118, 5, 0, 0, 120, 2, 0, 0, 123, 0,
+ 0, 0, 52, 254, 0, 0, 53, 250, 0, 0, 56, 237, 0, 0, 58, 215, 0, 0, 61, 188, 0, 0, 64, 147, 0, 0, 67, 110,
+ 0, 0, 70, 84, 0, 0, 72, 63, 0, 0, 76, 56, 0, 0, 80, 46, 0, 0, 85, 34, 0, 0, 89, 25, 0, 0, 93, 15,
+ 0, 0, 96, 7, 0, 0, 98, 2, 0, 0, 100, 0, 0, 0, 40, 254, 0, 0, 40, 251, 0, 0, 42, 241, 0, 0, 45, 219,
+ 0, 0, 49, 193, 0, 0, 52, 156, 0, 0, 54, 118, 0, 0, 56, 88, 0, 0, 58, 66, 0, 0, 62, 50, 0, 0, 64, 44,
+ 0, 0, 67, 36, 0, 0, 71, 25, 0, 0, 74, 16, 0, 0, 77, 8, 0, 0, 79, 3, 0, 0, 81, 0, 0, 0, 30, 254,
+ 0, 0, 30, 254, 0, 0, 31, 248, 0, 0, 34, 224, 0, 0, 38, 195, 0, 0, 41, 152, 0, 0, 41, 103, 0, 0, 42, 83,
+ 0, 0, 46, 68, 0, 0, 46, 49, 0, 0, 52, 40, 0, 0, 54, 35, 0, 0, 57, 26, 0, 0, 60, 18, 0, 0, 62, 10,
+ 0, 0, 64, 3, 0, 0, 66, 0, 0, 0, 22, 255, 0, 0, 22, 252, 0, 0, 23, 250, 0, 0, 24, 238, 0, 0, 28, 205,
+ 0, 0, 31, 158, 0, 0, 33, 115, 0, 0, 34, 88, 0, 0, 36, 67, 0, 0, 37, 51, 0, 0, 37, 38, 0, 0, 42, 32,
+ 0, 0, 45, 27, 0, 0, 47, 21, 0, 0, 49, 11, 0, 0, 51, 4, 0, 0, 53, 0, 0, 0, 16, 255, 0, 0, 15, 250,
+ 0, 0, 16, 246, 0, 0, 17, 238, 0, 0, 19, 213, 0, 0, 22, 177, 0, 0, 24, 123, 0, 0, 26, 91, 0, 0, 27, 67,
+ 0, 0, 29, 51, 0, 0, 29, 41, 0, 0, 30, 33, 0, 0, 33, 25, 0, 0, 36, 20, 0, 0, 38, 11, 0, 0, 39, 5,
+ 0, 0, 41, 0, 0, 0, 10, 255, 0, 0, 10, 250, 0, 0, 10, 245, 0, 0, 11, 237, 0, 0, 12, 216, 0, 0, 14, 182,
+ 0, 0, 16, 122, 0, 0, 18, 86, 0, 0, 19, 67, 0, 0, 20, 50, 0, 0, 21, 41, 0, 0, 22, 35, 0, 0, 23, 27,
+ 0, 0, 26, 20, 0, 0, 28, 13, 0, 0, 29, 8, 0, 0, 30, 0, 0, 0, 6, 255, 0, 0, 6, 250, 0, 0, 6, 246,
+ 0, 0, 6, 241, 0, 0, 7, 225, 0, 0, 8, 198, 0, 0, 9, 153, 0, 0, 11, 101, 0, 0, 12, 73, 0, 0, 13, 52,
+ 0, 0, 14, 39, 0, 0, 14, 33, 0, 0, 15, 29, 0, 0, 16, 23, 0, 0, 18, 14, 0, 0, 19, 8, 0, 0, 20, 0,
+ 0, 0, 2, 255, 0, 0, 2, 251, 0, 0, 2, 247, 0, 0, 2, 243, 0, 0, 3, 235, 0, 0, 4, 211, 0, 0, 4, 174,
+ 0, 0, 5, 114, 0, 0, 6, 81, 0, 0, 7, 55, 0, 0, 8, 42, 0, 0, 7, 34, 0, 0, 8, 26, 0, 0, 8, 21,
+ 0, 0, 8, 16, 0, 0, 9, 7, 0, 0, 10, 0, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255,
+ 0, 0, 0, 248, 0, 0, 0, 225, 0, 0, 0, 191, 0, 0, 0, 151, 0, 0, 0, 114, 0, 0, 0, 87, 0, 0, 0, 66,
+ 0, 0, 0, 49, 0, 0, 0, 35, 0, 0, 0, 23, 0, 0, 0, 14, 0, 0, 0, 7, 0, 0, 0, 0
+};
+
+// Photo Best (Vail)
+unsigned char ucMapDJ4100_KCMY_Photo_BestV_12x12x1[] =
+{
+ 200, 110, 60, 64, 177, 141, 74, 53, 155, 171, 87, 41, 133, 199, 99, 31, 112, 227, 111, 21, 102, 232, 109, 21, 83, 244, 112, 19,
+ 64, 247, 114, 21, 45, 247, 114, 24, 27, 247, 115, 25, 17, 247, 112, 21, 12, 248, 107, 15, 8, 248, 104, 11, 6, 248, 102, 8,
+ 3, 248, 100, 5, 1, 248, 99, 2, 0, 248, 98, 0, 178, 136, 53, 100, 176, 144, 53, 56, 152, 175, 96, 39, 135, 197, 102, 31,
+ 113, 226, 115, 21, 102, 231, 114, 21, 84, 242, 114, 19, 65, 247, 118, 20, 47, 247, 117, 23, 29, 247, 117, 24, 18, 247, 114, 22,
+ 13, 247, 110, 16, 9, 248, 106, 11, 5, 248, 103, 7, 2, 247, 101, 3, 1, 245, 100, 1, 0, 243, 100, 0, 155, 162, 47, 135,
+ 153, 168, 46, 119, 152, 177, 46, 58, 127, 210, 74, 33, 102, 233, 103, 22, 83, 240, 118, 19, 69, 246, 120, 19, 54, 246, 120, 21,
+ 37, 247, 120, 23, 22, 247, 119, 23, 15, 247, 113, 17, 10, 247, 109, 12, 6, 247, 105, 8, 3, 246, 103, 3, 1, 244, 102, 1,
+ 0, 240, 102, 0, 0, 237, 101, 0, 118, 186, 40, 197, 118, 202, 37, 181, 122, 205, 37, 120, 103, 238, 33, 51, 90, 243, 67, 29,
+ 73, 238, 97, 30, 56, 241, 112, 28, 37, 243, 118, 26, 21, 245, 120, 23, 13, 246, 114, 15, 7, 246, 109, 9, 4, 245, 106, 5,
+ 2, 242, 105, 3, 1, 239, 105, 1, 0, 236, 104, 0, 0, 233, 103, 0, 0, 229, 101, 0, 92, 197, 38, 230, 93, 211, 35, 216,
+ 96, 211, 37, 168, 92, 224, 37, 110, 82, 231, 43, 58, 68, 231, 68, 46, 49, 233, 93, 44, 31, 235, 105, 38, 17, 237, 109, 31,
+ 11, 237, 105, 19, 4, 236, 106, 14, 1, 235, 106, 10, 0, 232, 105, 7, 0, 230, 104, 3, 0, 226, 102, 1, 0, 222, 100, 0,
+ 0, 218, 99, 0, 72, 203, 39, 229, 70, 213, 37, 223, 71, 211, 42, 191, 70, 211, 45, 152, 64, 216, 49, 108, 55, 219, 61, 73,
+ 39, 225, 78, 62, 24, 225, 92, 54, 14, 227, 97, 41, 9, 226, 97, 28, 4, 224, 99, 22, 3, 222, 99, 16, 0, 220, 100, 13,
+ 0, 218, 99, 9, 0, 214, 98, 5, 0, 211, 96, 3, 0, 208, 94, 0, 49, 204, 42, 229, 47, 210, 41, 226, 44, 212, 47, 207,
+ 44, 208, 52, 177, 43, 207, 55, 144, 38, 211, 60, 109, 24, 215, 76, 84, 13, 218, 84, 70, 9, 219, 86, 54, 6, 218, 86, 36,
+ 2, 215, 89, 27, 0, 212, 92, 24, 0, 209, 93, 19, 0, 207, 93, 14, 0, 204, 91, 9, 0, 202, 89, 4, 0, 200, 87, 0,
+ 24, 202, 46, 230, 22, 207, 45, 227, 19, 207, 50, 214, 17, 204, 57, 190, 19, 199, 61, 161, 18, 200, 65, 135, 12, 205, 69, 105,
+ 1, 211, 82, 87, 0, 211, 79, 69, 0, 211, 77, 50, 0, 211, 77, 34, 0, 209, 79, 23, 0, 204, 83, 19, 0, 199, 84, 15,
+ 0, 195, 84, 10, 0, 193, 82, 5, 0, 190, 80, 0, 4, 201, 43, 231, 3, 205, 41, 229, 2, 206, 43, 217, 0, 201, 51, 195,
+ 0, 197, 59, 175, 0, 195, 63, 155, 0, 198, 64, 128, 0, 203, 63, 96, 0, 208, 60, 64, 0, 207, 60, 49, 0, 207, 61, 36,
+ 0, 207, 63, 25, 0, 204, 68, 18, 0, 198, 73, 14, 0, 191, 75, 10, 0, 186, 74, 5, 0, 181, 73, 0, 1, 202, 27, 234,
+ 0, 205, 23, 232, 0, 203, 25, 219, 0, 198, 32, 197, 0, 195, 38, 177, 0, 194, 43, 157, 0, 195, 45, 135, 0, 198, 44, 108,
+ 0, 201, 44, 79, 0, 207, 38, 44, 0, 206, 43, 35, 0, 205, 49, 29, 0, 203, 53, 20, 0, 199, 57, 13, 0, 192, 62, 9,
+ 0, 184, 64, 4, 0, 177, 65, 0, 0, 201, 18, 234, 0, 203, 15, 233, 0, 203, 14, 224, 0, 198, 19, 203, 0, 194, 24, 183,
+ 0, 192, 29, 162, 0, 192, 32, 143, 0, 193, 32, 120, 0, 195, 32, 95, 0, 200, 29, 65, 0, 206, 24, 31, 0, 204, 32, 26,
+ 0, 202, 38, 21, 0, 199, 42, 14, 0, 194, 46, 9, 0, 187, 51, 4, 0, 179, 54, 0, 0, 199, 14, 235, 0, 201, 12, 234,
+ 0, 203, 10, 228, 0, 200, 12, 211, 0, 195, 16, 192, 0, 192, 20, 173, 0, 191, 23, 153, 0, 191, 24, 133, 0, 193, 23, 110,
+ 0, 196, 22, 84, 0, 200, 19, 54, 0, 204, 17, 22, 0, 202, 24, 19, 0, 198, 29, 14, 0, 195, 32, 9, 0, 189, 36, 4,
+ 0, 182, 41, 0, 0, 198, 11, 235, 0, 199, 9, 234, 0, 200, 7, 230, 0, 199, 8, 216, 0, 196, 11, 199, 0, 193, 13, 182,
+ 0, 191, 16, 163, 0, 191, 19, 145, 0, 192, 18, 124, 0, 194, 16, 101, 0, 197, 14, 74, 0, 200, 13, 46, 0, 204, 12, 17,
+ 0, 199, 18, 13, 0, 194, 21, 9, 0, 189, 24, 4, 0, 184, 27, 0, 0, 196, 8, 234, 0, 197, 6, 234, 0, 198, 5, 230,
+ 0, 197, 6, 219, 0, 195, 7, 204, 0, 192, 9, 188, 0, 191, 11, 172, 0, 190, 13, 155, 0, 191, 14, 136, 0, 193, 13, 115,
+ 0, 195, 11, 92, 0, 197, 10, 67, 0, 200, 9, 40, 0, 203, 8, 12, 0, 196, 12, 8, 0, 189, 14, 4, 0, 184, 16, 0,
+ 0, 194, 5, 234, 0, 195, 4, 234, 0, 195, 3, 230, 0, 195, 4, 221, 0, 194, 5, 209, 0, 191, 6, 194, 0, 190, 7, 179,
+ 0, 190, 9, 163, 0, 190, 10, 145, 0, 191, 10, 126, 0, 193, 8, 105, 0, 195, 7, 83, 0, 197, 6, 60, 0, 199, 5, 35,
+ 0, 202, 5, 8, 0, 193, 8, 4, 0, 185, 9, 0, 0, 193, 3, 234, 0, 193, 2, 233, 0, 193, 1, 230, 0, 192, 2, 223,
+ 0, 192, 2, 212, 0, 191, 3, 199, 0, 189, 3, 185, 0, 189, 4, 170, 0, 189, 5, 153, 0, 190, 5, 136, 0, 191, 5, 116,
+ 0, 193, 4, 96, 0, 194, 3, 75, 0, 196, 3, 53, 0, 198, 2, 29, 0, 201, 2, 4, 0, 191, 4, 0, 0, 191, 0, 234,
+ 0, 191, 0, 232, 0, 191, 0, 229, 0, 190, 0, 223, 0, 190, 0, 215, 0, 189, 0, 203, 0, 188, 0, 190, 0, 188, 0, 176,
+ 0, 189, 0, 160, 0, 190, 0, 144, 0, 190, 0, 126, 0, 191, 0, 107, 0, 192, 0, 88, 0, 193, 0, 68, 0, 194, 0, 47,
+ 0, 196, 0, 25, 0, 200, 0, 0, 182, 96, 89, 88, 165, 101, 121, 50, 143, 140, 144, 36, 95, 201, 190, 13, 48, 225, 196, 9,
+ 35, 233, 189, 10, 52, 223, 164, 26, 39, 221, 151, 32, 22, 228, 146, 25, 13, 231, 137, 16, 6, 234, 131, 12, 3, 238, 126, 9,
+ 3, 240, 118, 4, 2, 241, 113, 2, 1, 242, 109, 1, 0, 243, 106, 0, 0, 244, 103, 0, 172, 110, 60, 114, 177, 112, 61, 66,
+ 144, 173, 91, 41, 110, 220, 123, 22, 90, 227, 137, 20, 72, 238, 136, 19, 61, 241, 126, 22, 45, 242, 124, 24, 28, 243, 124, 24,
+ 17, 244, 119, 19, 8, 245, 112, 11, 4, 245, 107, 4, 1, 242, 106, 1, 1, 239, 105, 1, 0, 237, 105, 0, 0, 235, 105, 0,
+ 0, 238, 100, 0, 143, 149, 50, 160, 152, 162, 47, 142, 147, 177, 45, 85, 120, 207, 79, 35, 96, 224, 105, 27, 73, 238, 115, 25,
+ 57, 243, 119, 23, 42, 245, 119, 24, 27, 246, 119, 24, 16, 246, 114, 19, 8, 246, 108, 10, 3, 246, 104, 3, 1, 243, 104, 1,
+ 0, 238, 104, 0, 0, 234, 105, 0, 0, 231, 105, 0, 0, 233, 102, 0, 114, 173, 43, 208, 114, 193, 39, 202, 112, 209, 36, 167,
+ 117, 201, 41, 79, 96, 220, 60, 38, 72, 227, 98, 38, 51, 231, 115, 35, 34, 235, 120, 32, 21, 238, 120, 26, 12, 240, 113, 17,
+ 4, 241, 109, 10, 1, 241, 105, 2, 0, 237, 105, 0, 0, 232, 105, 0, 0, 228, 105, 0, 0, 225, 104, 0, 0, 225, 102, 0,
+ 92, 181, 42, 233, 91, 198, 38, 228, 88, 216, 35, 209, 96, 197, 43, 133, 89, 202, 48, 81, 72, 218, 65, 53, 48, 222, 95, 52,
+ 30, 225, 107, 45, 17, 229, 110, 35, 10, 230, 106, 21, 1, 232, 106, 13, 0, 232, 104, 3, 0, 228, 103, 1, 0, 223, 103, 0,
+ 0, 219, 102, 0, 0, 217, 101, 0, 0, 216, 99, 0, 70, 195, 42, 231, 68, 202, 40, 229, 64, 216, 38, 221, 66, 208, 46, 175,
+ 62, 206, 52, 132, 58, 211, 58, 91, 42, 214, 78, 72, 24, 214, 95, 63, 15, 217, 99, 49, 9, 221, 97, 32, 3, 223, 96, 21,
+ 0, 223, 96, 10, 0, 221, 95, 3, 0, 216, 95, 1, 0, 212, 95, 0, 0, 209, 95, 0, 0, 207, 94, 0, 46, 197, 44, 231,
+ 45, 203, 43, 229, 42, 211, 42, 224, 39, 208, 51, 197, 39, 204, 56, 161, 38, 203, 61, 127, 29, 205, 72, 98, 14, 207, 86, 83,
+ 8, 209, 90, 65, 5, 210, 89, 46, 3, 211, 88, 30, 0, 211, 88, 20, 0, 211, 87, 10, 0, 209, 86, 4, 0, 206, 87, 1,
+ 0, 202, 87, 0, 0, 199, 88, 0, 22, 197, 48, 231, 20, 201, 47, 230, 18, 206, 47, 226, 14, 205, 54, 205, 12, 198, 62, 178,
+ 14, 196, 66, 149, 8, 198, 74, 125, 5, 201, 78, 100, 2, 204, 80, 80, 0, 205, 79, 60, 0, 206, 76, 39, 0, 204, 78, 25,
+ 0, 202, 79, 15, 0, 200, 79, 8, 0, 198, 79, 3, 0, 194, 79, 1, 0, 190, 81, 0, 4, 198, 42, 232, 4, 201, 41, 232,
+ 3, 203, 39, 227, 0, 203, 45, 208, 0, 196, 54, 185, 0, 193, 60, 163, 0, 194, 64, 140, 0, 196, 65, 111, 0, 198, 64, 85,
+ 0, 200, 62, 65, 0, 201, 61, 45, 0, 202, 62, 29, 0, 199, 65, 17, 0, 195, 68, 10, 0, 191, 70, 5, 0, 186, 71, 1,
+ 0, 180, 73, 0, 0, 199, 25, 235, 0, 200, 25, 233, 0, 200, 25, 224, 0, 196, 30, 205, 0, 193, 37, 185, 0, 191, 42, 165,
+ 0, 191, 46, 144, 0, 192, 47, 119, 0, 193, 49, 94, 0, 196, 47, 70, 0, 198, 46, 51, 0, 199, 48, 36, 0, 199, 49, 23,
+ 0, 195, 53, 12, 0, 189, 58, 6, 0, 182, 61, 2, 0, 175, 64, 0, 0, 198, 17, 235, 0, 195, 13, 228, 0, 195, 14, 220,
+ 0, 192, 18, 206, 0, 188, 23, 188, 0, 187, 27, 168, 0, 186, 31, 148, 0, 187, 33, 128, 0, 188, 34, 104, 0, 190, 34, 80,
+ 0, 194, 31, 56, 0, 196, 32, 39, 0, 196, 35, 28, 0, 195, 37, 17, 0, 191, 41, 8, 0, 184, 47, 3, 0, 174, 53, 0,
+ 0, 197, 13, 235, 0, 191, 7, 225, 0, 190, 7, 217, 0, 189, 9, 206, 0, 185, 12, 191, 0, 184, 15, 174, 0, 183, 19, 154,
+ 0, 183, 21, 135, 0, 183, 23, 114, 0, 186, 22, 91, 0, 188, 21, 68, 0, 192, 20, 44, 0, 193, 23, 31, 0, 192, 25, 21,
+ 0, 190, 28, 12, 0, 186, 32, 5, 0, 178, 39, 0, 0, 195, 10, 235, 0, 187, 3, 223, 0, 186, 2, 216, 0, 185, 3, 206,
+ 0, 183, 6, 194, 0, 183, 7, 179, 0, 182, 10, 161, 0, 181, 13, 143, 0, 181, 14, 124, 0, 183, 14, 102, 0, 185, 13, 80,
+ 0, 188, 12, 56, 0, 191, 12, 34, 0, 189, 15, 23, 0, 187, 17, 15, 0, 184, 20, 7, 0, 180, 26, 0, 0, 194, 7, 235,
+ 0, 184, 1, 220, 0, 182, 1, 213, 0, 181, 1, 206, 0, 181, 2, 195, 0, 181, 3, 183, 0, 180, 4, 167, 0, 179, 6, 150,
+ 0, 180, 8, 133, 0, 180, 8, 113, 0, 183, 7, 91, 0, 184, 6, 69, 0, 187, 6, 46, 0, 188, 6, 25, 0, 185, 9, 15,
+ 0, 182, 10, 8, 0, 178, 14, 0, 0, 192, 5, 235, 0, 181, 1, 218, 0, 178, 0, 212, 0, 178, 0, 205, 0, 178, 0, 196,
+ 0, 178, 1, 185, 0, 178, 1, 171, 0, 178, 2, 156, 0, 178, 4, 140, 0, 179, 4, 122, 0, 181, 4, 102, 0, 183, 3, 82,
+ 0, 184, 2, 60, 0, 186, 2, 38, 0, 187, 3, 18, 0, 182, 5, 8, 0, 178, 7, 0, 0, 191, 2, 234, 0, 179, 0, 218,
+ 0, 177, 0, 212, 0, 177, 0, 206, 0, 176, 0, 198, 0, 177, 0, 188, 0, 177, 0, 175, 0, 177, 0, 161, 0, 178, 1, 146,
+ 0, 178, 1, 130, 0, 180, 1, 111, 0, 181, 1, 93, 0, 182, 0, 73, 0, 183, 0, 52, 0, 185, 0, 31, 0, 186, 1, 11,
+ 0, 181, 5, 0, 0, 189, 0, 234, 0, 180, 0, 217, 0, 180, 0, 214, 0, 180, 0, 208, 0, 179, 0, 201, 0, 180, 0, 191,
+ 0, 180, 0, 179, 0, 180, 0, 166, 0, 180, 0, 152, 0, 181, 0, 136, 0, 182, 0, 119, 0, 183, 0, 101, 0, 183, 0, 84,
+ 0, 184, 0, 65, 0, 185, 0, 43, 0, 187, 0, 22, 0, 189, 0, 0, 165, 82, 118, 113, 155, 74, 140, 88, 136, 86, 173, 40,
+ 111, 121, 191, 29, 83, 172, 190, 25, 61, 196, 183, 30, 48, 195, 172, 43, 25, 203, 164, 47, 13, 208, 156, 34, 4, 215, 150, 25,
+ 4, 219, 141, 14, 0, 224, 137, 12, 0, 229, 131, 7, 1, 232, 123, 3, 1, 235, 117, 1, 0, 236, 113, 0, 0, 238, 109, 0,
+ 161, 86, 94, 131, 155, 90, 103, 109, 138, 107, 133, 48, 106, 160, 164, 30, 81, 195, 163, 31, 55, 209, 161, 40, 36, 213, 155, 39,
+ 23, 217, 150, 33, 13, 222, 143, 22, 4, 226, 137, 13, 0, 228, 131, 5, 0, 228, 125, 1, 0, 227, 120, 0, 0, 226, 116, 0,
+ 0, 225, 113, 0, 0, 226, 110, 0, 0, 232, 107, 0, 146, 108, 60, 163, 146, 112, 60, 147, 144, 114, 62, 68, 114, 169, 101, 45,
+ 89, 193, 114, 41, 64, 211, 124, 43, 44, 224, 128, 37, 29, 231, 127, 31, 18, 235, 122, 25, 10, 237, 115, 14, 2, 238, 112, 7,
+ 1, 237, 108, 1, 0, 232, 107, 0, 0, 227, 106, 0, 0, 224, 106, 0, 0, 221, 105, 0, 0, 225, 102, 0, 114, 141, 52, 212,
+ 114, 154, 49, 203, 115, 162, 49, 159, 116, 160, 54, 84, 98, 178, 77, 52, 67, 202, 108, 52, 45, 213, 121, 49, 30, 222, 122, 41,
+ 18, 227, 120, 32, 11, 230, 114, 21, 3, 232, 110, 14, 1, 233, 106, 3, 0, 228, 105, 0, 0, 223, 105, 0, 0, 219, 104, 0,
+ 0, 216, 104, 0, 0, 218, 102, 0, 90, 156, 49, 238, 90, 171, 45, 233, 88, 184, 45, 208, 93, 173, 51, 135, 92, 170, 59, 85,
+ 72, 186, 82, 66, 44, 204, 106, 63, 26, 210, 115, 55, 15, 214, 117, 42, 9, 215, 113, 28, 1, 218, 111, 19, 0, 220, 107, 6,
+ 0, 218, 104, 0, 0, 213, 104, 0, 0, 211, 103, 0, 0, 209, 102, 0, 0, 211, 100, 0, 68, 179, 47, 234, 66, 187, 45, 232,
+ 62, 198, 45, 222, 62, 193, 55, 176, 63, 185, 64, 131, 61, 184, 70, 96, 39, 198, 89, 81, 22, 204, 101, 69, 13, 206, 104, 53,
+ 7, 210, 102, 38, 0, 212, 102, 25, 0, 213, 99, 10, 0, 211, 97, 1, 0, 208, 97, 0, 0, 205, 97, 0, 0, 203, 96, 0,
+ 0, 204, 95, 0, 44, 187, 48, 233, 42, 193, 46, 231, 40, 200, 46, 227, 35, 200, 57, 198, 35, 194, 64, 163, 35, 192, 69, 131,
+ 28, 195, 77, 103, 14, 200, 90, 86, 8, 202, 92, 67, 4, 203, 93, 50, 2, 204, 91, 33, 0, 206, 89, 18, 0, 206, 86, 6,
+ 0, 204, 86, 1, 0, 200, 87, 0, 0, 198, 88, 0, 0, 196, 88, 0, 20, 191, 51, 232, 18, 195, 50, 231, 16, 200, 48, 228,
+ 13, 198, 55, 206, 9, 193, 66, 179, 8, 191, 72, 154, 3, 192, 81, 135, 0, 195, 85, 110, 0, 198, 83, 85, 0, 199, 80, 63,
+ 0, 200, 79, 41, 0, 199, 79, 25, 0, 198, 78, 13, 0, 197, 77, 4, 0, 194, 78, 1, 0, 191, 79, 0, 0, 188, 81, 0,
+ 5, 193, 43, 234, 4, 196, 41, 233, 3, 200, 40, 226, 0, 199, 46, 208, 0, 192, 54, 185, 0, 190, 61, 164, 0, 189, 65, 143,
+ 0, 191, 67, 115, 0, 193, 65, 89, 0, 195, 65, 69, 0, 195, 64, 49, 0, 196, 64, 31, 0, 194, 66, 17, 0, 190, 68, 8,
+ 0, 187, 69, 2, 0, 183, 71, 0, 0, 179, 74, 0, 0, 194, 26, 236, 0, 195, 26, 231, 0, 194, 28, 219, 0, 193, 33, 205,
+ 0, 189, 39, 187, 0, 188, 44, 167, 0, 188, 47, 145, 0, 188, 49, 122, 0, 188, 52, 98, 0, 190, 51, 76, 0, 191, 49, 56,
+ 0, 193, 49, 39, 0, 192, 50, 23, 0, 189, 53, 11, 0, 184, 57, 4, 0, 179, 60, 1, 0, 172, 64, 0, 0, 193, 16, 236,
+ 0, 191, 14, 227, 0, 188, 18, 215, 0, 185, 22, 202, 0, 183, 25, 187, 0, 183, 29, 169, 0, 182, 33, 150, 0, 183, 35, 129,
+ 0, 183, 37, 107, 0, 185, 37, 84, 0, 187, 35, 63, 0, 189, 35, 45, 0, 190, 35, 31, 0, 189, 37, 18, 0, 186, 41, 8,
+ 0, 180, 46, 2, 0, 170, 52, 0, 0, 193, 12, 235, 0, 186, 7, 224, 0, 183, 8, 211, 0, 181, 10, 201, 0, 179, 13, 189,
+ 0, 179, 16, 173, 0, 178, 19, 154, 0, 177, 22, 135, 0, 178, 24, 115, 0, 179, 25, 94, 0, 182, 24, 72, 0, 185, 23, 51,
+ 0, 186, 23, 36, 0, 186, 25, 23, 0, 185, 27, 13, 0, 181, 31, 5, 0, 172, 39, 0, 0, 192, 9, 235, 0, 183, 2, 221,
+ 0, 178, 2, 208, 0, 176, 3, 199, 0, 176, 4, 189, 0, 176, 6, 176, 0, 175, 8, 159, 0, 175, 11, 141, 0, 175, 13, 123,
+ 0, 176, 14, 102, 0, 178, 14, 81, 0, 180, 13, 60, 0, 183, 12, 39, 0, 182, 15, 27, 0, 180, 16, 16, 0, 178, 18, 7,
+ 0, 174, 25, 0, 0, 191, 7, 235, 0, 179, 1, 217, 0, 173, 0, 203, 0, 172, 0, 196, 0, 172, 0, 188, 0, 173, 1, 177,
+ 0, 173, 2, 163, 0, 172, 4, 147, 0, 173, 5, 130, 0, 173, 6, 111, 0, 175, 6, 91, 0, 176, 6, 70, 0, 178, 6, 49,
+ 0, 180, 5, 29, 0, 177, 8, 18, 0, 175, 9, 9, 0, 173, 14, 0, 0, 190, 4, 235, 0, 176, 0, 215, 0, 168, 0, 199,
+ 0, 167, 0, 193, 0, 168, 0, 186, 0, 169, 0, 176, 0, 169, 0, 164, 0, 169, 0, 151, 0, 170, 1, 135, 0, 171, 2, 118,
+ 0, 172, 2, 99, 0, 173, 1, 80, 0, 174, 1, 60, 0, 176, 1, 39, 0, 176, 1, 20, 0, 173, 3, 10, 0, 171, 7, 0,
+ 0, 188, 2, 235, 0, 174, 0, 214, 0, 166, 0, 197, 0, 164, 0, 191, 0, 165, 0, 184, 0, 166, 0, 176, 0, 166, 0, 165,
+ 0, 166, 0, 152, 0, 167, 0, 138, 0, 168, 0, 123, 0, 169, 0, 106, 0, 170, 0, 89, 0, 170, 0, 71, 0, 171, 0, 51,
+ 0, 172, 0, 31, 0, 172, 1, 13, 0, 171, 5, 0, 0, 187, 0, 235, 0, 178, 0, 217, 0, 169, 0, 199, 0, 169, 0, 195,
+ 0, 169, 0, 188, 0, 170, 0, 180, 0, 170, 0, 169, 0, 170, 0, 158, 0, 171, 0, 144, 0, 171, 0, 129, 0, 173, 0, 113,
+ 0, 174, 0, 96, 0, 174, 0, 80, 0, 175, 0, 61, 0, 175, 0, 40, 0, 176, 0, 19, 0, 178, 0, 0, 136, 61, 156, 163,
+ 130, 56, 173, 146, 122, 53, 193, 74, 96, 60, 228, 34, 83, 112, 204, 36, 64, 150, 184, 43, 43, 167, 179, 48, 23, 180, 171, 48,
+ 8, 190, 166, 39, 1, 198, 160, 30, 0, 202, 152, 19, 0, 207, 145, 14, 0, 212, 138, 10, 0, 217, 132, 6, 0, 222, 127, 3,
+ 0, 226, 121, 1, 0, 228, 117, 0, 136, 69, 127, 170, 134, 73, 133, 149, 128, 73, 149, 89, 102, 84, 190, 41, 78, 140, 179, 41,
+ 51, 172, 171, 52, 28, 185, 167, 53, 12, 196, 164, 44, 3, 202, 157, 32, 0, 205, 150, 15, 0, 208, 141, 3, 0, 209, 134, 1,
+ 0, 211, 128, 1, 0, 212, 124, 1, 0, 214, 120, 0, 0, 217, 117, 0, 0, 221, 113, 0, 132, 80, 87, 181, 131, 83, 92, 160,
+ 124, 93, 99, 113, 108, 104, 131, 55, 80, 144, 146, 56, 48, 181, 153, 66, 22, 194, 155, 60, 12, 200, 151, 44, 5, 204, 144, 33,
+ 0, 208, 139, 19, 0, 210, 131, 4, 0, 211, 125, 0, 0, 210, 121, 0, 0, 209, 117, 0, 0, 209, 114, 0, 0, 209, 112, 0,
+ 0, 215, 109, 0, 103, 98, 63, 240, 111, 99, 65, 203, 115, 108, 66, 145, 114, 116, 68, 72, 86, 153, 101, 67, 57, 182, 121, 71,
+ 33, 195, 128, 64, 20, 204, 130, 51, 13, 210, 125, 37, 5, 215, 120, 26, 0, 219, 114, 13, 0, 220, 109, 2, 0, 216, 107, 0,
+ 0, 212, 106, 0, 0, 209, 105, 0, 0, 207, 104, 0, 0, 211, 101, 0, 87, 129, 57, 243, 87, 134, 57, 227, 89, 140, 59, 186,
+ 89, 147, 63, 138, 87, 145, 71, 91, 64, 168, 97, 81, 35, 188, 116, 76, 19, 197, 123, 63, 13, 203, 119, 46, 5, 207, 116, 35,
+ 0, 210, 112, 23, 0, 211, 106, 8, 0, 210, 104, 1, 0, 207, 102, 0, 0, 204, 102, 0, 0, 202, 101, 0, 0, 204, 100, 0,
+ 66, 162, 52, 237, 64, 168, 51, 234, 62, 172, 54, 215, 61, 174, 64, 177, 60, 166, 76, 135, 57, 162, 84, 105, 36, 180, 101, 92,
+ 19, 193, 109, 74, 12, 197, 109, 56, 5, 199, 108, 41, 1, 202, 105, 27, 0, 203, 102, 11, 0, 202, 100, 1, 0, 199, 99, 0,
+ 0, 197, 98, 0, 0, 196, 98, 0, 0, 197, 97, 0, 42, 174, 53, 235, 40, 180, 52, 234, 38, 184, 52, 224, 34, 184, 63, 195,
+ 29, 182, 75, 165, 31, 175, 83, 135, 25, 177, 89, 112, 12, 189, 95, 90, 7, 193, 97, 70, 4, 194, 96, 51, 0, 197, 94, 34,
+ 0, 198, 91, 17, 0, 198, 89, 4, 0, 195, 89, 0, 0, 192, 90, 0, 0, 190, 90, 0, 0, 191, 90, 0, 18, 181, 55, 234,
+ 16, 185, 54, 233, 15, 189, 53, 226, 13, 187, 59, 203, 5, 185, 73, 179, 6, 183, 77, 156, 9, 183, 78, 130, 3, 186, 85, 108,
+ 0, 190, 86, 86, 0, 191, 84, 64, 0, 191, 82, 43, 0, 191, 80, 25, 0, 192, 79, 10, 0, 191, 78, 2, 0, 188, 80, 0,
+ 0, 185, 81, 0, 0, 183, 82, 0, 5, 185, 45, 236, 5, 189, 42, 234, 3, 192, 44, 224, 0, 191, 50, 205, 0, 184, 58, 185,
+ 0, 183, 64, 165, 0, 183, 67, 143, 0, 184, 69, 117, 0, 186, 69, 91, 0, 188, 68, 71, 0, 189, 66, 50, 0, 188, 67, 32,
+ 0, 186, 67, 17, 0, 184, 68, 6, 0, 181, 70, 1, 0, 178, 72, 0, 0, 176, 74, 0, 0, 186, 27, 237, 0, 187, 28, 231,
+ 0, 188, 33, 218, 0, 185, 37, 203, 0, 182, 42, 187, 0, 182, 47, 167, 0, 182, 50, 146, 0, 182, 52, 123, 0, 181, 55, 99,
+ 0, 183, 54, 78, 0, 184, 53, 59, 0, 185, 53, 41, 0, 184, 53, 24, 0, 181, 55, 11, 0, 178, 58, 3, 0, 173, 60, 0,
+ 0, 168, 64, 0, 0, 186, 16, 236, 0, 184, 16, 228, 0, 181, 21, 213, 0, 178, 26, 199, 0, 177, 29, 186, 0, 178, 32, 169,
+ 0, 177, 35, 150, 0, 178, 37, 130, 0, 177, 40, 109, 0, 179, 41, 87, 0, 181, 39, 67, 0, 182, 38, 49, 0, 183, 38, 33,
+ 0, 181, 40, 18, 0, 178, 42, 7, 0, 173, 46, 1, 0, 165, 52, 0, 0, 187, 12, 236, 0, 181, 8, 224, 0, 178, 9, 210,
+ 0, 173, 13, 197, 0, 173, 15, 186, 0, 173, 18, 171, 0, 172, 21, 154, 0, 171, 24, 136, 0, 172, 26, 116, 0, 173, 27, 96,
+ 0, 175, 27, 75, 0, 178, 26, 56, 0, 179, 25, 39, 0, 179, 25, 25, 0, 178, 27, 13, 0, 174, 30, 4, 0, 165, 39, 0,
+ 0, 187, 9, 236, 0, 178, 3, 221, 0, 173, 3, 207, 0, 169, 4, 195, 0, 169, 5, 186, 0, 169, 6, 173, 0, 168, 9, 158,
+ 0, 168, 11, 141, 0, 169, 13, 122, 0, 170, 14, 103, 0, 171, 15, 83, 0, 172, 14, 63, 0, 175, 13, 43, 0, 175, 14, 29,
+ 0, 174, 15, 17, 0, 172, 17, 7, 0, 167, 25, 0, 0, 186, 6, 235, 0, 175, 1, 217, 0, 168, 0, 202, 0, 164, 0, 190,
+ 0, 164, 0, 182, 0, 165, 1, 172, 0, 165, 1, 160, 0, 165, 3, 145, 0, 165, 4, 128, 0, 166, 5, 109, 0, 167, 5, 91,
+ 0, 168, 5, 71, 0, 169, 5, 51, 0, 171, 4, 32, 0, 168, 6, 19, 0, 168, 7, 9, 0, 165, 14, 0, 0, 186, 3, 235,
+ 0, 172, 0, 215, 0, 164, 0, 197, 0, 158, 0, 183, 0, 158, 0, 175, 0, 158, 0, 166, 0, 159, 0, 156, 0, 159, 0, 144,
+ 0, 160, 0, 129, 0, 161, 0, 113, 0, 162, 1, 96, 0, 163, 0, 79, 0, 163, 0, 60, 0, 164, 0, 40, 0, 164, 1, 23,
+ 0, 163, 2, 11, 0, 162, 7, 0, 0, 185, 1, 235, 0, 171, 0, 214, 0, 161, 0, 195, 0, 154, 0, 178, 0, 154, 0, 170,
+ 0, 154, 0, 163, 0, 154, 0, 154, 0, 155, 0, 143, 0, 155, 0, 130, 0, 156, 0, 115, 0, 157, 0, 100, 0, 157, 0, 85,
+ 0, 157, 0, 69, 0, 158, 0, 50, 0, 158, 0, 32, 0, 159, 1, 15, 0, 160, 5, 0, 0, 184, 0, 233, 0, 175, 0, 217,
+ 0, 166, 0, 199, 0, 158, 0, 182, 0, 159, 0, 176, 0, 159, 0, 169, 0, 160, 0, 159, 0, 160, 0, 149, 0, 160, 0, 136,
+ 0, 161, 0, 122, 0, 161, 0, 106, 0, 162, 0, 91, 0, 162, 0, 76, 0, 162, 0, 58, 0, 163, 0, 37, 0, 163, 0, 17,
+ 0, 166, 0, 0, 99, 35, 205, 222, 97, 35, 211, 213, 102, 45, 202, 142, 90, 49, 216, 71, 76, 74, 213, 48, 58, 115, 197, 51,
+ 39, 141, 188, 53, 22, 158, 178, 50, 10, 168, 173, 38, 2, 178, 167, 29, 0, 184, 159, 20, 0, 190, 152, 14, 0, 195, 146, 10,
+ 0, 201, 141, 7, 0, 205, 135, 4, 0, 210, 131, 2, 0, 214, 126, 0, 104, 46, 172, 219, 103, 49, 174, 202, 103, 58, 173, 156,
+ 94, 62, 188, 67, 75, 103, 185, 52, 50, 139, 179, 58, 29, 157, 174, 57, 14, 170, 171, 45, 1, 182, 166, 34, 0, 186, 157, 14,
+ 0, 190, 149, 3, 0, 194, 141, 1, 0, 197, 136, 1, 0, 200, 131, 1, 0, 202, 126, 0, 0, 205, 123, 0, 0, 209, 121, 0,
+ 108, 62, 128, 206, 108, 69, 125, 187, 108, 78, 124, 151, 98, 83, 142, 89, 77, 107, 156, 64, 49, 144, 163, 69, 24, 163, 164, 63,
+ 11, 175, 162, 50, 0, 185, 156, 38, 0, 188, 149, 17, 0, 191, 142, 2, 0, 194, 135, 0, 0, 195, 130, 0, 0, 197, 125, 0,
+ 0, 198, 121, 0, 0, 200, 118, 0, 0, 204, 117, 0, 96, 71, 86, 236, 99, 78, 88, 204, 101, 91, 91, 153, 93, 102, 104, 117,
+ 80, 114, 120, 78, 47, 149, 144, 84, 18, 172, 149, 76, 6, 182, 148, 59, 2, 187, 143, 40, 0, 190, 137, 23, 0, 193, 131, 6,
+ 0, 195, 125, 1, 0, 195, 120, 0, 0, 195, 116, 0, 0, 195, 113, 0, 0, 195, 111, 0, 0, 199, 109, 0, 80, 97, 69, 250,
+ 82, 107, 69, 211, 84, 111, 73, 161, 82, 118, 78, 133, 76, 128, 87, 96, 45, 154, 118, 102, 21, 174, 126, 88, 13, 185, 126, 68,
+ 7, 192, 123, 50, 0, 197, 119, 37, 0, 199, 113, 19, 0, 201, 108, 6, 0, 200, 105, 0, 0, 197, 103, 0, 0, 195, 102, 0,
+ 0, 193, 101, 0, 0, 196, 98, 0, 63, 135, 62, 243, 62, 141, 61, 236, 62, 141, 68, 196, 58, 142, 77, 167, 50, 148, 89, 143,
+ 42, 151, 99, 119, 24, 166, 111, 102, 13, 180, 116, 79, 9, 186, 114, 59, 3, 190, 111, 43, 0, 193, 107, 28, 0, 194, 103, 12,
+ 0, 194, 100, 1, 0, 192, 98, 0, 0, 189, 98, 0, 0, 187, 97, 0, 0, 190, 96, 0, 39, 156, 60, 239, 37, 162, 59, 237,
+ 36, 163, 62, 219, 32, 163, 71, 189, 25, 165, 83, 166, 21, 162, 93, 142, 16, 160, 100, 121, 8, 172, 104, 98, 6, 182, 102, 72,
+ 2, 185, 101, 53, 0, 185, 99, 35, 0, 187, 96, 18, 0, 187, 93, 4, 0, 185, 92, 0, 0, 183, 92, 0, 0, 181, 92, 0,
+ 0, 183, 92, 0, 16, 167, 60, 238, 16, 172, 57, 235, 16, 172, 58, 222, 13, 171, 66, 199, 6, 173, 76, 177, 2, 172, 84, 156,
+ 1, 168, 91, 135, 0, 169, 94, 114, 0, 177, 91, 87, 0, 179, 89, 65, 0, 181, 86, 43, 0, 181, 84, 25, 0, 182, 82, 9,
+ 0, 182, 81, 1, 0, 178, 82, 0, 0, 176, 83, 0, 0, 176, 84, 0, 4, 174, 48, 239, 4, 178, 47, 235, 2, 181, 49, 219,
+ 1, 176, 55, 201, 0, 174, 62, 182, 0, 174, 67, 162, 0, 174, 71, 142, 0, 173, 73, 118, 0, 176, 74, 93, 0, 179, 72, 72,
+ 0, 180, 70, 51, 0, 178, 71, 33, 0, 177, 70, 16, 0, 177, 70, 4, 0, 174, 71, 0, 0, 171, 73, 0, 0, 170, 74, 0,
+ 0, 175, 30, 239, 0, 177, 32, 231, 0, 178, 37, 216, 0, 174, 43, 201, 0, 173, 46, 185, 0, 173, 50, 166, 0, 173, 53, 147,
+ 0, 173, 56, 125, 0, 174, 58, 100, 0, 176, 57, 79, 0, 177, 55, 60, 0, 176, 56, 41, 0, 175, 56, 24, 0, 173, 57, 10,
+ 0, 170, 59, 1, 0, 166, 61, 0, 0, 164, 64, 0, 0, 176, 17, 237, 0, 175, 18, 226, 0, 172, 24, 212, 0, 169, 30, 198,
+ 0, 170, 31, 185, 0, 170, 34, 169, 0, 170, 37, 151, 0, 170, 40, 131, 0, 170, 42, 110, 0, 171, 43, 88, 0, 173, 41, 69,
+ 0, 173, 40, 50, 0, 173, 41, 33, 0, 172, 41, 18, 0, 169, 43, 5, 0, 164, 47, 0, 0, 158, 53, 0, 0, 178, 11, 237,
+ 0, 173, 9, 223, 0, 170, 12, 209, 0, 166, 16, 196, 0, 166, 18, 184, 0, 165, 20, 170, 0, 164, 23, 154, 0, 165, 25, 136,
+ 0, 165, 27, 117, 0, 166, 28, 97, 0, 168, 28, 77, 0, 170, 28, 58, 0, 170, 27, 40, 0, 171, 26, 25, 0, 169, 28, 12,
+ 0, 165, 31, 2, 0, 156, 40, 0, 0, 179, 8, 236, 0, 171, 4, 220, 0, 167, 4, 206, 0, 163, 6, 194, 0, 162, 7, 182,
+ 0, 161, 8, 170, 0, 161, 11, 156, 0, 161, 12, 140, 0, 161, 14, 122, 0, 163, 15, 103, 0, 163, 16, 84, 0, 164, 15, 66,
+ 0, 166, 15, 46, 0, 166, 14, 31, 0, 165, 15, 17, 0, 163, 17, 6, 0, 157, 26, 0, 0, 180, 5, 236, 0, 169, 1, 217,
+ 0, 163, 1, 203, 0, 159, 0, 190, 0, 156, 1, 176, 0, 156, 1, 166, 0, 157, 1, 155, 0, 157, 2, 142, 0, 157, 4, 125,
+ 0, 158, 4, 107, 0, 159, 5, 90, 0, 159, 5, 72, 0, 160, 5, 52, 0, 162, 4, 34, 0, 159, 6, 21, 0, 159, 7, 9,
+ 0, 156, 15, 0, 0, 180, 3, 235, 0, 167, 0, 214, 0, 160, 0, 198, 0, 153, 0, 181, 0, 148, 0, 166, 0, 148, 0, 158,
+ 0, 149, 0, 148, 0, 149, 0, 137, 0, 150, 0, 124, 0, 150, 0, 109, 0, 151, 0, 93, 0, 152, 0, 78, 0, 152, 0, 60,
+ 0, 153, 0, 41, 0, 153, 0, 24, 0, 153, 1, 12, 0, 153, 7, 0, 0, 180, 1, 234, 0, 167, 0, 213, 0, 157, 0, 194,
+ 0, 149, 0, 176, 0, 143, 0, 160, 0, 142, 0, 152, 0, 143, 0, 144, 0, 143, 0, 134, 0, 144, 0, 122, 0, 144, 0, 109,
+ 0, 144, 0, 95, 0, 145, 0, 82, 0, 145, 0, 67, 0, 145, 0, 49, 0, 145, 0, 32, 0, 146, 0, 16, 0, 149, 5, 0,
+ 0, 179, 0, 233, 0, 171, 0, 217, 0, 163, 0, 200, 0, 155, 0, 182, 0, 147, 0, 164, 0, 147, 0, 157, 0, 148, 0, 149,
+ 0, 148, 0, 139, 0, 148, 0, 127, 0, 148, 0, 114, 0, 149, 0, 101, 0, 149, 0, 88, 0, 149, 0, 73, 0, 149, 0, 55,
+ 0, 149, 0, 35, 0, 150, 0, 15, 0, 153, 0, 0, 85, 37, 202, 225, 81, 37, 208, 221, 78, 43, 208, 189, 70, 50, 212, 123,
+ 63, 62, 212, 79, 45, 85, 207, 68, 31, 113, 196, 64, 18, 133, 186, 56, 10, 145, 179, 39, 1, 158, 172, 29, 0, 166, 165, 21,
+ 0, 173, 160, 15, 0, 179, 153, 11, 0, 185, 148, 7, 0, 190, 143, 5, 0, 194, 138, 2, 0, 199, 134, 0, 87, 45, 175, 229,
+ 84, 45, 184, 219, 80, 56, 185, 189, 75, 63, 187, 123, 67, 76, 189, 73, 45, 107, 188, 70, 27, 131, 182, 64, 15, 146, 177, 50,
+ 2, 161, 171, 36, 0, 166, 165, 15, 0, 170, 156, 3, 0, 175, 148, 1, 0, 180, 142, 1, 0, 185, 137, 1, 0, 189, 134, 0,
+ 0, 193, 131, 0, 0, 196, 130, 0, 89, 59, 140, 216, 86, 61, 145, 209, 89, 78, 136, 155, 78, 83, 152, 128, 68, 90, 162, 86,
+ 46, 116, 170, 78, 24, 140, 171, 70, 12, 152, 167, 55, 2, 164, 162, 39, 0, 168, 157, 17, 0, 171, 149, 2, 0, 176, 141, 0,
+ 0, 180, 135, 0, 0, 183, 131, 0, 0, 186, 127, 0, 0, 188, 124, 0, 0, 192, 124, 0, 84, 69, 113, 224, 82, 71, 120, 211,
+ 82, 87, 117, 161, 75, 99, 121, 137, 65, 103, 138, 108, 47, 119, 150, 95, 20, 146, 157, 79, 10, 156, 155, 61, 1, 166, 152, 45,
+ 0, 168, 147, 22, 0, 172, 140, 5, 0, 175, 134, 0, 0, 178, 129, 0, 0, 180, 124, 0, 0, 182, 121, 0, 0, 183, 118, 0,
+ 0, 187, 117, 0, 74, 82, 86, 232, 73, 87, 90, 209, 70, 100, 96, 167, 65, 110, 103, 144, 51, 122, 118, 132, 40, 128, 128, 111,
+ 14, 149, 140, 93, 6, 160, 139, 72, 0, 167, 136, 51, 0, 171, 132, 28, 0, 174, 127, 12, 0, 176, 122, 2, 0, 178, 118, 0,
+ 0, 178, 114, 0, 0, 178, 111, 0, 0, 178, 109, 0, 0, 183, 107, 0, 52, 104, 76, 250, 54, 107, 78, 233, 51, 116, 85, 193,
+ 44, 125, 96, 159, 37, 134, 103, 144, 26, 143, 110, 124, 9, 153, 120, 110, 6, 165, 120, 83, 3, 174, 117, 63, 0, 179, 113, 44,
+ 0, 181, 108, 24, 0, 183, 104, 9, 0, 184, 101, 1, 0, 182, 98, 0, 0, 179, 97, 0, 0, 177, 96, 0, 0, 181, 93, 0,
+ 31, 133, 72, 244, 31, 137, 70, 240, 31, 140, 74, 218, 26, 141, 85, 182, 20, 146, 92, 162, 13, 149, 100, 144, 7, 149, 106, 125,
+ 3, 156, 108, 101, 1, 166, 108, 77, 2, 172, 104, 54, 0, 174, 101, 35, 0, 176, 98, 18, 0, 178, 94, 4, 0, 176, 93, 0,
+ 0, 174, 91, 0, 0, 172, 91, 0, 0, 174, 90, 0, 13, 150, 65, 242, 13, 154, 63, 238, 15, 153, 64, 222, 13, 152, 71, 195,
+ 7, 156, 80, 175, 0, 159, 88, 156, 0, 154, 94, 134, 0, 151, 97, 115, 0, 159, 96, 91, 0, 168, 92, 65, 0, 169, 89, 43,
+ 0, 170, 87, 25, 0, 172, 85, 9, 0, 171, 84, 1, 0, 168, 84, 0, 0, 166, 83, 0, 0, 167, 84, 0, 2, 159, 53, 242,
+ 2, 163, 52, 234, 0, 164, 54, 217, 0, 161, 62, 200, 0, 162, 66, 181, 0, 162, 70, 161, 0, 162, 74, 140, 0, 155, 79, 118,
+ 0, 157, 80, 97, 0, 165, 76, 72, 0, 167, 75, 52, 0, 167, 74, 32, 0, 168, 73, 16, 0, 168, 72, 3, 0, 165, 73, 0,
+ 0, 162, 74, 0, 0, 162, 74, 0, 0, 160, 34, 238, 0, 163, 35, 228, 0, 163, 41, 217, 0, 160, 47, 200, 0, 161, 50, 184,
+ 0, 163, 53, 167, 0, 165, 57, 147, 0, 164, 59, 125, 0, 162, 61, 102, 0, 165, 60, 80, 0, 167, 58, 60, 0, 166, 58, 41,
+ 0, 165, 59, 23, 0, 164, 59, 8, 0, 161, 61, 1, 0, 158, 63, 0, 0, 157, 65, 0, 0, 162, 20, 235, 0, 163, 20, 224,
+ 0, 159, 27, 212, 0, 158, 33, 198, 0, 160, 35, 184, 0, 160, 37, 169, 0, 160, 40, 151, 0, 161, 42, 132, 0, 161, 44, 110,
+ 0, 162, 45, 89, 0, 164, 44, 69, 0, 163, 43, 50, 0, 163, 43, 33, 0, 161, 44, 17, 0, 159, 45, 4, 0, 155, 49, 0,
+ 0, 151, 54, 0, 0, 166, 12, 236, 0, 163, 10, 221, 0, 159, 15, 209, 0, 157, 19, 196, 0, 157, 21, 184, 0, 156, 22, 170,
+ 0, 156, 25, 153, 0, 157, 26, 136, 0, 157, 28, 117, 0, 158, 30, 97, 0, 159, 30, 77, 0, 161, 29, 59, 0, 160, 29, 41,
+ 0, 160, 28, 25, 0, 158, 30, 10, 0, 153, 34, 1, 0, 147, 42, 0, 0, 170, 7, 236, 0, 163, 4, 218, 0, 158, 6, 206,
+ 0, 155, 8, 194, 0, 154, 9, 182, 0, 154, 10, 169, 0, 153, 11, 155, 0, 153, 13, 139, 0, 154, 15, 121, 0, 155, 16, 102,
+ 0, 155, 16, 84, 0, 156, 16, 66, 0, 157, 16, 48, 0, 156, 16, 32, 0, 155, 16, 17, 0, 152, 19, 5, 0, 145, 29, 0,
+ 0, 172, 5, 236, 0, 162, 1, 216, 0, 156, 1, 203, 0, 153, 1, 191, 0, 150, 1, 177, 0, 148, 1, 163, 0, 149, 1, 152,
+ 0, 149, 3, 138, 0, 149, 4, 123, 0, 150, 5, 105, 0, 150, 5, 89, 0, 150, 6, 72, 0, 151, 6, 54, 0, 151, 6, 36,
+ 0, 150, 7, 21, 0, 150, 7, 9, 0, 145, 16, 0, 0, 173, 3, 235, 0, 161, 0, 213, 0, 154, 0, 198, 0, 148, 0, 182,
+ 0, 143, 0, 166, 0, 139, 0, 152, 0, 139, 0, 142, 0, 140, 0, 132, 0, 140, 0, 120, 0, 141, 0, 105, 0, 142, 0, 91,
+ 0, 142, 1, 76, 0, 143, 0, 60, 0, 143, 0, 41, 0, 143, 1, 26, 0, 143, 1, 12, 0, 142, 8, 0, 0, 173, 1, 233,
+ 0, 161, 0, 212, 0, 152, 0, 194, 0, 145, 0, 176, 0, 138, 0, 159, 0, 132, 0, 144, 0, 131, 0, 135, 0, 132, 0, 126,
+ 0, 132, 0, 115, 0, 132, 0, 103, 0, 132, 0, 91, 0, 133, 0, 79, 0, 133, 0, 65, 0, 133, 0, 47, 0, 133, 0, 31,
+ 0, 134, 0, 17, 0, 138, 5, 0, 0, 173, 0, 232, 0, 166, 0, 217, 0, 158, 0, 200, 0, 150, 0, 182, 0, 143, 0, 164,
+ 0, 134, 0, 145, 0, 134, 0, 138, 0, 135, 0, 129, 0, 135, 0, 118, 0, 135, 0, 108, 0, 135, 0, 96, 0, 135, 0, 84,
+ 0, 135, 0, 71, 0, 135, 0, 53, 0, 135, 0, 32, 0, 137, 0, 14, 0, 140, 0, 0, 67, 41, 198, 227, 62, 40, 206, 224,
+ 54, 47, 209, 210, 50, 53, 208, 160, 43, 61, 211, 113, 31, 77, 208, 87, 16, 95, 202, 81, 11, 108, 192, 64, 8, 121, 184, 43,
+ 1, 135, 177, 29, 0, 145, 171, 20, 0, 155, 166, 14, 0, 163, 161, 11, 0, 169, 155, 8, 0, 174, 149, 5, 0, 179, 145, 2,
+ 0, 183, 141, 0, 69, 47, 177, 229, 65, 49, 181, 225, 58, 60, 181, 202, 49, 69, 187, 166, 45, 75, 191, 113, 32, 94, 187, 92,
+ 18, 110, 187, 76, 11, 122, 182, 56, 2, 137, 174, 39, 0, 144, 170, 18, 0, 151, 163, 3, 0, 158, 155, 1, 0, 163, 148, 1,
+ 0, 168, 142, 1, 0, 172, 139, 0, 0, 177, 137, 0, 0, 180, 136, 0, 70, 59, 157, 218, 66, 62, 157, 212, 60, 73, 158, 188,
+ 47, 85, 167, 167, 44, 87, 173, 121, 32, 101, 174, 97, 17, 118, 176, 79, 11, 129, 172, 59, 4, 140, 166, 40, 0, 147, 163, 20,
+ 0, 153, 156, 2, 0, 159, 147, 0, 0, 163, 140, 0, 0, 167, 135, 0, 0, 171, 132, 0, 0, 174, 130, 0, 0, 177, 131, 0,
+ 65, 71, 133, 214, 62, 74, 135, 206, 58, 83, 140, 184, 52, 99, 140, 158, 42, 104, 150, 138, 34, 107, 158, 112, 16, 125, 163, 87,
+ 9, 135, 160, 66, 0, 147, 155, 51, 0, 149, 152, 25, 0, 154, 147, 4, 0, 158, 139, 0, 0, 162, 132, 0, 0, 165, 128, 0,
+ 0, 168, 125, 0, 0, 170, 122, 0, 0, 173, 123, 0, 60, 82, 113, 212, 59, 86, 115, 197, 53, 94, 120, 183, 46, 109, 124, 159,
+ 36, 120, 129, 148, 27, 120, 138, 123, 12, 131, 146, 98, 6, 138, 146, 75, 2, 145, 142, 55, 0, 150, 140, 30, 0, 153, 135, 10,
+ 0, 157, 129, 1, 0, 160, 124, 0, 0, 162, 120, 0, 0, 164, 116, 0, 0, 165, 114, 0, 0, 169, 114, 0, 41, 94, 93, 231,
+ 39, 101, 97, 209, 34, 108, 104, 192, 29, 118, 111, 168, 24, 125, 115, 150, 12, 132, 122, 135, 6, 135, 128, 113, 3, 139, 129, 85,
+ 0, 149, 125, 64, 0, 152, 122, 38, 0, 155, 119, 16, 0, 158, 116, 3, 0, 161, 111, 0, 0, 161, 108, 0, 0, 161, 105, 0,
+ 0, 161, 103, 0, 0, 165, 102, 0, 20, 114, 83, 250, 22, 119, 81, 235, 20, 122, 87, 214, 16, 125, 96, 179, 14, 130, 101, 153,
+ 7, 134, 105, 140, 0, 140, 110, 122, 1, 142, 110, 101, 0, 152, 108, 76, 0, 157, 104, 53, 0, 160, 101, 32, 0, 164, 98, 14,
+ 0, 166, 94, 2, 0, 165, 92, 0, 0, 163, 90, 0, 0, 161, 89, 0, 0, 165, 85, 0, 6, 134, 73, 247, 8, 136, 72, 239,
+ 10, 135, 72, 220, 7, 135, 79, 194, 3, 139, 88, 168, 2, 139, 91, 149, 0, 141, 94, 131, 0, 140, 97, 113, 0, 143, 97, 89,
+ 0, 152, 94, 65, 0, 155, 91, 43, 0, 157, 89, 24, 0, 159, 86, 8, 0, 159, 84, 1, 0, 157, 83, 0, 0, 156, 82, 0,
+ 0, 157, 81, 0, 0, 141, 57, 245, 0, 146, 58, 234, 1, 145, 60, 220, 0, 145, 66, 200, 0, 147, 71, 182, 0, 148, 74, 160,
+ 0, 148, 76, 139, 0, 143, 82, 118, 0, 140, 84, 99, 0, 146, 82, 77, 0, 152, 78, 53, 0, 154, 77, 32, 0, 156, 75, 15,
+ 0, 156, 74, 2, 0, 153, 74, 0, 0, 151, 74, 0, 0, 151, 74, 0, 0, 143, 38, 239, 0, 148, 40, 227, 0, 147, 44, 216,
+ 0, 146, 50, 200, 0, 149, 54, 186, 0, 152, 57, 168, 0, 152, 60, 148, 0, 151, 62, 126, 0, 143, 67, 104, 0, 144, 67, 84,
+ 0, 152, 63, 61, 0, 154, 62, 40, 0, 154, 62, 22, 0, 153, 62, 8, 0, 151, 63, 1, 0, 148, 64, 0, 0, 147, 65, 0,
+ 0, 146, 24, 235, 0, 148, 25, 222, 0, 147, 30, 211, 0, 146, 35, 198, 0, 148, 38, 185, 0, 149, 40, 170, 0, 150, 43, 152,
+ 0, 150, 44, 132, 0, 149, 46, 110, 0, 149, 49, 89, 0, 151, 48, 70, 0, 152, 46, 50, 0, 152, 47, 32, 0, 151, 48, 15,
+ 0, 148, 48, 3, 0, 144, 51, 0, 0, 141, 55, 0, 0, 151, 15, 234, 0, 150, 14, 219, 0, 148, 18, 208, 0, 146, 22, 196,
+ 0, 147, 24, 184, 0, 146, 26, 170, 0, 146, 26, 153, 0, 147, 28, 135, 0, 147, 30, 116, 0, 147, 31, 96, 0, 149, 32, 77,
+ 0, 150, 32, 59, 0, 150, 31, 40, 0, 149, 32, 24, 0, 146, 33, 9, 0, 143, 36, 1, 0, 136, 43, 0, 0, 156, 9, 234,
+ 0, 152, 6, 217, 0, 148, 9, 205, 0, 146, 10, 195, 0, 145, 12, 182, 0, 144, 12, 169, 0, 144, 13, 154, 0, 144, 15, 137,
+ 0, 145, 16, 120, 0, 145, 17, 101, 0, 146, 18, 84, 0, 146, 18, 66, 0, 147, 18, 47, 0, 146, 18, 31, 0, 145, 19, 16,
+ 0, 142, 21, 4, 0, 134, 31, 0, 0, 160, 5, 234, 0, 153, 2, 215, 0, 148, 3, 203, 0, 145, 2, 192, 0, 143, 2, 179,
+ 0, 141, 2, 164, 0, 140, 3, 150, 0, 139, 4, 136, 0, 140, 6, 121, 0, 140, 6, 104, 0, 141, 7, 88, 0, 141, 7, 72,
+ 0, 141, 7, 53, 0, 142, 7, 36, 0, 140, 8, 21, 0, 140, 8, 9, 0, 133, 18, 0, 0, 163, 3, 233, 0, 153, 0, 212,
+ 0, 147, 0, 198, 0, 142, 0, 184, 0, 137, 0, 168, 0, 132, 0, 153, 0, 130, 0, 139, 0, 130, 0, 128, 0, 131, 0, 116,
+ 0, 131, 0, 102, 0, 132, 1, 89, 0, 133, 1, 75, 0, 133, 1, 59, 0, 133, 1, 41, 0, 133, 1, 26, 0, 133, 1, 13,
+ 0, 130, 9, 0, 0, 165, 1, 232, 0, 154, 0, 211, 0, 146, 0, 194, 0, 139, 0, 177, 0, 132, 0, 160, 0, 125, 0, 143,
+ 0, 120, 0, 126, 0, 119, 0, 116, 0, 120, 0, 107, 0, 120, 0, 97, 0, 121, 0, 87, 0, 121, 0, 76, 0, 121, 0, 62,
+ 0, 121, 0, 46, 0, 121, 0, 31, 0, 122, 0, 17, 0, 124, 5, 0, 0, 166, 0, 231, 0, 159, 0, 216, 0, 152, 0, 200,
+ 0, 145, 0, 183, 0, 138, 0, 165, 0, 129, 0, 146, 0, 118, 0, 124, 0, 119, 0, 116, 0, 119, 0, 106, 0, 119, 0, 98,
+ 0, 119, 0, 89, 0, 119, 0, 79, 0, 120, 0, 67, 0, 119, 0, 50, 0, 120, 0, 30, 0, 121, 0, 12, 0, 122, 0, 0,
+ 45, 44, 196, 229, 40, 44, 202, 227, 33, 50, 205, 215, 27, 56, 204, 181, 24, 60, 207, 139, 12, 78, 204, 113, 0, 91, 199, 98,
+ 0, 90, 198, 76, 1, 96, 189, 50, 0, 107, 182, 29, 0, 121, 177, 16, 0, 133, 172, 12, 0, 144, 167, 9, 0, 152, 162, 7,
+ 0, 158, 157, 4, 0, 164, 153, 2, 0, 168, 148, 0, 48, 51, 179, 230, 45, 51, 182, 227, 37, 61, 184, 208, 26, 71, 187, 184,
+ 25, 72, 191, 138, 15, 86, 191, 110, 2, 100, 188, 93, 0, 103, 185, 70, 1, 110, 179, 41, 0, 118, 174, 19, 0, 127, 168, 3,
+ 0, 137, 161, 1, 0, 146, 155, 1, 0, 152, 149, 1, 0, 157, 145, 0, 0, 162, 142, 0, 0, 164, 142, 0, 46, 64, 158, 221,
+ 42, 66, 160, 216, 34, 77, 162, 195, 23, 84, 171, 181, 21, 83, 178, 142, 16, 92, 180, 113, 3, 107, 179, 95, 4, 108, 177, 69,
+ 3, 116, 172, 44, 0, 124, 167, 23, 0, 131, 162, 4, 0, 139, 154, 0, 0, 146, 146, 0, 0, 152, 141, 0, 0, 156, 136, 0,
+ 0, 159, 134, 0, 0, 161, 135, 0, 39, 75, 143, 213, 36, 78, 145, 207, 31, 84, 147, 193, 22, 92, 152, 177, 16, 99, 159, 158,
+ 15, 100, 164, 129, 4, 114, 166, 103, 1, 116, 164, 79, 0, 123, 160, 52, 0, 127, 157, 28, 0, 133, 153, 8, 0, 140, 145, 1,
+ 0, 146, 138, 0, 0, 150, 132, 0, 0, 153, 127, 0, 0, 156, 125, 0, 0, 158, 127, 0, 30, 85, 129, 212, 30, 88, 130, 204,
+ 28, 91, 133, 191, 20, 99, 137, 175, 16, 114, 137, 154, 11, 112, 145, 134, 3, 118, 150, 110, 1, 120, 151, 85, 1, 124, 147, 58,
+ 0, 130, 144, 36, 0, 134, 141, 14, 0, 140, 135, 1, 0, 144, 128, 0, 0, 147, 122, 0, 0, 150, 119, 0, 0, 152, 116, 0,
+ 0, 156, 117, 0, 22, 92, 112, 227, 19, 96, 115, 208, 19, 99, 119, 193, 18, 104, 124, 179, 9, 116, 125, 155, 0, 125, 129, 142,
+ 0, 123, 132, 122, 0, 121, 136, 96, 0, 127, 132, 68, 0, 132, 130, 43, 0, 135, 127, 19, 0, 139, 122, 2, 0, 142, 117, 0,
+ 0, 144, 112, 0, 0, 146, 109, 0, 0, 147, 107, 0, 0, 152, 106, 0, 10, 102, 93, 246, 9, 107, 99, 220, 11, 105, 101, 199,
+ 10, 107, 104, 180, 6, 115, 109, 156, 0, 122, 112, 140, 0, 124, 114, 125, 0, 123, 117, 104, 0, 129, 115, 75, 0, 132, 111, 51,
+ 0, 136, 109, 27, 0, 140, 107, 7, 0, 142, 103, 1, 0, 143, 100, 0, 0, 143, 97, 0, 0, 144, 95, 0, 0, 147, 93, 0,
+ 0, 112, 79, 250, 0, 111, 83, 239, 1, 111, 87, 220, 5, 110, 86, 194, 1, 115, 93, 166, 0, 120, 95, 142, 0, 123, 96, 128,
+ 0, 129, 97, 107, 0, 129, 98, 86, 0, 134, 94, 63, 0, 139, 91, 41, 0, 143, 89, 21, 0, 146, 86, 6, 0, 147, 84, 0,
+ 0, 146, 82, 0, 0, 145, 80, 0, 0, 147, 76, 0, 0, 118, 59, 246, 0, 122, 61, 234, 0, 123, 65, 220, 0, 123, 69, 200,
+ 0, 126, 74, 181, 0, 127, 79, 153, 0, 128, 81, 134, 0, 128, 83, 116, 0, 127, 85, 97, 0, 130, 83, 76, 0, 136, 80, 53,
+ 0, 139, 78, 32, 0, 141, 77, 14, 0, 142, 76, 2, 0, 140, 75, 0, 0, 139, 73, 0, 0, 140, 72, 0, 0, 123, 42, 240,
+ 0, 128, 44, 228, 0, 129, 49, 214, 0, 129, 54, 199, 0, 133, 57, 185, 0, 136, 61, 167, 0, 136, 63, 146, 0, 134, 65, 125,
+ 0, 128, 69, 104, 0, 125, 72, 85, 0, 131, 69, 65, 0, 137, 66, 41, 0, 139, 65, 21, 0, 140, 65, 7, 0, 138, 64, 1,
+ 0, 136, 64, 0, 0, 134, 64, 0, 0, 127, 29, 235, 0, 131, 30, 222, 0, 132, 35, 209, 0, 133, 38, 197, 0, 135, 41, 185,
+ 0, 138, 44, 170, 0, 138, 46, 153, 0, 138, 47, 132, 0, 136, 50, 111, 0, 130, 55, 90, 0, 130, 55, 72, 0, 137, 51, 50,
+ 0, 139, 51, 30, 0, 138, 52, 13, 0, 137, 52, 2, 0, 133, 53, 0, 0, 130, 55, 0, 0, 134, 18, 233, 0, 135, 18, 217,
+ 0, 134, 22, 206, 0, 134, 25, 196, 0, 135, 27, 184, 0, 135, 29, 169, 0, 135, 30, 153, 0, 135, 31, 135, 0, 135, 32, 116,
+ 0, 135, 34, 96, 0, 135, 36, 77, 0, 137, 35, 59, 0, 138, 34, 39, 0, 137, 35, 23, 0, 135, 36, 8, 0, 131, 38, 1,
+ 0, 125, 44, 0, 0, 140, 10, 233, 0, 139, 9, 214, 0, 136, 11, 203, 0, 135, 13, 194, 0, 134, 14, 182, 0, 134, 16, 168,
+ 0, 134, 16, 153, 0, 133, 17, 136, 0, 133, 18, 118, 0, 133, 19, 100, 0, 134, 20, 83, 0, 135, 21, 65, 0, 135, 21, 47,
+ 0, 136, 21, 30, 0, 135, 21, 15, 0, 131, 23, 3, 0, 121, 32, 0, 0, 146, 6, 232, 0, 141, 3, 213, 0, 137, 4, 202,
+ 0, 135, 4, 192, 0, 133, 4, 179, 0, 131, 5, 165, 0, 130, 5, 150, 0, 129, 6, 134, 0, 130, 7, 119, 0, 130, 8, 102,
+ 0, 130, 8, 87, 0, 131, 9, 71, 0, 131, 9, 53, 0, 132, 9, 36, 0, 131, 9, 21, 0, 129, 10, 8, 0, 119, 20, 0,
+ 0, 150, 3, 231, 0, 144, 1, 211, 0, 138, 0, 199, 0, 133, 0, 186, 0, 129, 0, 170, 0, 125, 0, 154, 0, 122, 0, 139,
+ 0, 121, 0, 125, 0, 121, 1, 113, 0, 122, 1, 100, 0, 123, 1, 88, 0, 124, 1, 74, 0, 124, 1, 58, 0, 124, 1, 41,
+ 0, 124, 1, 25, 0, 123, 1, 12, 0, 116, 9, 0, 0, 154, 1, 231, 0, 146, 0, 210, 0, 138, 0, 194, 0, 131, 0, 178,
+ 0, 125, 0, 161, 0, 118, 0, 143, 0, 112, 0, 125, 0, 108, 0, 109, 0, 108, 0, 100, 0, 109, 0, 92, 0, 109, 0, 83,
+ 0, 110, 0, 73, 0, 110, 0, 60, 0, 110, 0, 44, 0, 109, 0, 30, 0, 109, 0, 17, 0, 109, 4, 0, 0, 157, 0, 230,
+ 0, 151, 0, 216, 0, 144, 0, 201, 0, 138, 0, 184, 0, 131, 0, 166, 0, 122, 0, 146, 0, 112, 0, 124, 0, 101, 0, 102,
+ 0, 102, 0, 94, 0, 102, 0, 88, 0, 102, 0, 81, 0, 102, 0, 73, 0, 103, 0, 61, 0, 102, 0, 46, 0, 102, 0, 28,
+ 0, 103, 0, 11, 0, 104, 0, 0, 21, 48, 196, 230, 18, 48, 200, 228, 11, 53, 202, 217, 6, 59, 201, 192, 2, 64, 201, 165,
+ 0, 70, 199, 129, 0, 70, 198, 97, 0, 70, 198, 73, 0, 69, 196, 52, 0, 81, 188, 30, 0, 95, 183, 14, 0, 110, 179, 7,
+ 0, 123, 173, 7, 0, 133, 168, 6, 0, 141, 164, 4, 0, 148, 160, 2, 0, 154, 155, 0, 26, 54, 181, 231, 24, 55, 183, 229,
+ 18, 62, 182, 209, 3, 74, 186, 191, 0, 77, 190, 163, 0, 82, 189, 128, 0, 82, 188, 95, 0, 84, 186, 71, 0, 86, 183, 47,
+ 0, 94, 178, 23, 0, 103, 173, 3, 0, 115, 165, 1, 0, 126, 159, 1, 0, 134, 155, 1, 0, 141, 151, 0, 0, 147, 148, 0,
+ 0, 150, 149, 0, 26, 64, 164, 221, 24, 66, 165, 216, 19, 73, 166, 199, 7, 79, 172, 185, 4, 79, 180, 157, 2, 85, 181, 130,
+ 0, 89, 179, 99, 0, 91, 178, 76, 0, 94, 175, 51, 0, 99, 171, 25, 0, 107, 166, 4, 0, 118, 158, 0, 0, 127, 152, 0,
+ 0, 134, 147, 0, 0, 140, 142, 0, 0, 144, 139, 0, 0, 147, 141, 0, 22, 72, 150, 215, 20, 74, 150, 209, 17, 78, 153, 196,
+ 6, 86, 160, 183, 0, 91, 164, 167, 0, 92, 167, 144, 0, 95, 168, 108, 0, 96, 167, 81, 0, 98, 165, 56, 0, 104, 162, 31,
+ 0, 111, 157, 9, 0, 120, 151, 1, 0, 128, 144, 0, 0, 134, 138, 0, 0, 139, 133, 0, 0, 142, 130, 0, 0, 144, 133, 0,
+ 17, 79, 136, 212, 16, 81, 136, 206, 13, 85, 138, 193, 5, 92, 144, 181, 1, 96, 146, 165, 0, 98, 150, 146, 0, 99, 153, 114,
+ 0, 101, 154, 88, 0, 103, 152, 63, 0, 108, 150, 38, 0, 114, 146, 16, 0, 121, 141, 1, 0, 128, 134, 0, 0, 132, 128, 0,
+ 0, 136, 122, 0, 0, 139, 119, 0, 0, 142, 120, 0, 11, 82, 121, 226, 12, 87, 124, 205, 9, 91, 127, 190, 5, 96, 129, 178,
+ 0, 100, 132, 162, 0, 109, 131, 144, 0, 107, 134, 124, 0, 103, 138, 100, 0, 107, 138, 70, 0, 112, 136, 46, 0, 117, 133, 23,
+ 0, 121, 129, 4, 0, 126, 123, 0, 0, 130, 116, 0, 0, 132, 111, 0, 0, 135, 109, 0, 0, 139, 109, 0, 1, 89, 103, 243,
+ 1, 94, 109, 213, 2, 96, 110, 190, 2, 98, 113, 178, 0, 102, 116, 162, 0, 109, 115, 139, 0, 113, 114, 127, 0, 110, 119, 107,
+ 0, 111, 121, 77, 0, 113, 120, 54, 0, 118, 118, 31, 0, 121, 115, 9, 0, 124, 109, 1, 0, 126, 104, 0, 0, 128, 101, 0,
+ 0, 130, 98, 0, 0, 134, 97, 0, 0, 91, 80, 247, 3, 91, 84, 217, 0, 95, 91, 202, 0, 97, 95, 187, 0, 100, 98, 167,
+ 0, 106, 100, 143, 0, 109, 100, 126, 0, 111, 102, 109, 0, 112, 104, 86, 0, 113, 102, 63, 0, 118, 98, 39, 0, 122, 96, 17,
+ 0, 124, 94, 2, 0, 126, 91, 0, 0, 127, 88, 0, 0, 127, 85, 0, 0, 130, 83, 0, 0, 91, 61, 247, 0, 97, 65, 231,
+ 0, 100, 69, 214, 0, 100, 73, 198, 0, 103, 76, 178, 0, 106, 81, 150, 0, 110, 83, 127, 0, 111, 84, 112, 0, 114, 85, 94,
+ 0, 113, 84, 74, 0, 120, 81, 51, 0, 124, 79, 29, 0, 127, 77, 11, 0, 129, 75, 1, 0, 129, 73, 0, 0, 128, 71, 0,
+ 0, 130, 67, 0, 0, 99, 45, 241, 0, 105, 48, 228, 0, 106, 53, 213, 0, 107, 57, 199, 0, 109, 60, 183, 0, 111, 64, 163,
+ 0, 113, 68, 137, 0, 113, 69, 120, 0, 112, 71, 102, 0, 111, 73, 83, 0, 115, 70, 64, 0, 121, 68, 40, 0, 124, 67, 20,
+ 0, 126, 66, 5, 0, 125, 65, 0, 0, 122, 64, 0, 0, 121, 62, 0, 0, 106, 32, 235, 0, 111, 34, 222, 0, 112, 39, 209,
+ 0, 114, 42, 197, 0, 116, 44, 185, 0, 119, 48, 170, 0, 121, 50, 151, 0, 120, 51, 131, 0, 119, 53, 110, 0, 113, 57, 89,
+ 0, 110, 59, 73, 0, 116, 57, 54, 0, 123, 54, 29, 0, 124, 54, 11, 0, 124, 53, 1, 0, 120, 54, 0, 0, 116, 54, 0,
+ 0, 115, 21, 232, 0, 116, 22, 218, 0, 117, 25, 205, 0, 118, 28, 196, 0, 119, 30, 184, 0, 121, 32, 170, 0, 122, 34, 154,
+ 0, 122, 35, 135, 0, 121, 36, 114, 0, 119, 38, 95, 0, 114, 43, 78, 0, 115, 43, 62, 0, 122, 39, 39, 0, 124, 39, 20,
+ 0, 122, 40, 6, 0, 118, 41, 1, 0, 112, 43, 0, 0, 123, 13, 232, 0, 123, 11, 214, 0, 122, 13, 203, 0, 121, 15, 194,
+ 0, 120, 17, 182, 0, 121, 18, 169, 0, 120, 19, 153, 0, 120, 20, 136, 0, 120, 21, 116, 0, 119, 23, 98, 0, 119, 24, 82,
+ 0, 120, 25, 65, 0, 122, 24, 47, 0, 124, 24, 29, 0, 123, 24, 14, 0, 118, 26, 2, 0, 107, 33, 0, 0, 130, 7, 230,
+ 0, 128, 4, 211, 0, 125, 5, 201, 0, 123, 6, 191, 0, 121, 6, 180, 0, 119, 7, 165, 0, 118, 7, 150, 0, 118, 8, 134,
+ 0, 118, 8, 117, 0, 119, 9, 101, 0, 119, 10, 86, 0, 120, 10, 70, 0, 120, 11, 52, 0, 121, 11, 36, 0, 121, 11, 20,
+ 0, 118, 12, 7, 0, 104, 21, 0, 0, 136, 4, 229, 0, 131, 1, 210, 0, 127, 1, 198, 0, 123, 0, 186, 0, 119, 0, 172,
+ 0, 115, 1, 156, 0, 113, 1, 141, 0, 112, 1, 126, 0, 112, 1, 111, 0, 113, 1, 98, 0, 113, 1, 87, 0, 115, 1, 73,
+ 0, 115, 1, 57, 0, 114, 2, 40, 0, 115, 1, 25, 0, 113, 2, 11, 0, 102, 10, 0, 0, 141, 2, 229, 0, 135, 0, 209,
+ 0, 128, 0, 193, 0, 122, 0, 177, 0, 115, 0, 161, 0, 109, 0, 143, 0, 104, 0, 126, 0, 100, 0, 109, 0, 98, 0, 96,
+ 0, 98, 0, 88, 0, 99, 0, 80, 0, 100, 0, 70, 0, 100, 0, 58, 0, 100, 0, 43, 0, 99, 0, 29, 0, 98, 0, 17,
+ 0, 94, 4, 0, 0, 146, 0, 229, 0, 140, 0, 216, 0, 135, 0, 201, 0, 129, 0, 185, 0, 122, 0, 166, 0, 113, 0, 146,
+ 0, 104, 0, 125, 0, 95, 0, 102, 0, 87, 0, 84, 0, 85, 0, 77, 0, 85, 0, 71, 0, 85, 0, 64, 0, 86, 0, 55,
+ 0, 86, 0, 43, 0, 86, 0, 27, 0, 86, 0, 11, 0, 88, 0, 0, 5, 45, 197, 232, 4, 42, 201, 230, 1, 44, 203, 218,
+ 0, 48, 199, 197, 0, 49, 197, 170, 0, 51, 197, 136, 0, 52, 198, 102, 0, 52, 198, 75, 0, 52, 196, 52, 0, 54, 196, 36,
+ 0, 70, 191, 19, 0, 86, 186, 6, 0, 100, 180, 2, 0, 113, 174, 3, 0, 123, 169, 3, 0, 131, 165, 2, 0, 138, 161, 0,
+ 8, 51, 184, 235, 6, 52, 184, 231, 0, 59, 186, 210, 0, 59, 183, 192, 0, 58, 188, 163, 0, 60, 188, 133, 0, 63, 188, 99,
+ 0, 66, 187, 74, 0, 68, 184, 50, 0, 71, 182, 29, 0, 80, 177, 9, 0, 93, 170, 1, 0, 105, 164, 0, 0, 115, 159, 0,
+ 0, 124, 156, 0, 0, 131, 153, 0, 0, 135, 154, 0, 8, 55, 174, 235, 7, 60, 169, 219, 2, 70, 166, 199, 0, 68, 172, 186,
+ 0, 64, 180, 161, 0, 66, 181, 135, 0, 69, 180, 102, 0, 72, 179, 78, 0, 75, 176, 54, 0, 78, 174, 32, 0, 84, 170, 10,
+ 0, 96, 162, 1, 0, 107, 155, 0, 0, 116, 151, 0, 0, 123, 147, 0, 0, 129, 145, 0, 0, 132, 147, 0, 5, 60, 161, 230,
+ 6, 64, 153, 214, 0, 73, 157, 197, 0, 74, 159, 183, 0, 75, 164, 168, 0, 76, 167, 148, 0, 78, 168, 120, 0, 77, 168, 91,
+ 0, 80, 167, 61, 0, 83, 165, 37, 0, 89, 162, 14, 0, 98, 155, 1, 0, 109, 148, 0, 0, 117, 142, 0, 0, 122, 138, 0,
+ 0, 127, 135, 0, 0, 129, 138, 0, 4, 66, 144, 228, 3, 71, 142, 210, 0, 77, 144, 194, 0, 79, 145, 180, 0, 82, 148, 165,
+ 0, 83, 151, 150, 0, 83, 153, 126, 0, 83, 154, 98, 0, 86, 155, 66, 0, 88, 154, 42, 0, 93, 151, 19, 0, 100, 146, 2,
+ 0, 109, 139, 0, 0, 116, 133, 0, 0, 121, 128, 0, 0, 125, 124, 0, 0, 127, 126, 0, 0, 72, 129, 233, 0, 78, 131, 209,
+ 1, 82, 132, 192, 0, 83, 132, 179, 0, 85, 135, 165, 0, 88, 136, 148, 0, 87, 137, 130, 0, 87, 140, 103, 0, 91, 141, 72,
+ 0, 92, 140, 49, 0, 97, 138, 25, 0, 102, 135, 6, 0, 109, 129, 0, 0, 114, 122, 0, 0, 118, 116, 0, 0, 122, 112, 0,
+ 0, 125, 113, 0, 0, 72, 107, 240, 0, 79, 112, 207, 0, 84, 114, 187, 0, 86, 117, 176, 0, 88, 119, 161, 0, 90, 121, 143,
+ 0, 97, 117, 128, 0, 94, 121, 109, 0, 94, 125, 79, 0, 94, 126, 57, 0, 99, 124, 34, 0, 104, 121, 14, 0, 108, 116, 1,
+ 0, 112, 110, 0, 0, 115, 104, 0, 0, 118, 100, 0, 0, 122, 99, 0, 0, 75, 85, 238, 0, 78, 92, 210, 0, 82, 96, 195,
+ 0, 83, 101, 181, 0, 87, 103, 164, 0, 89, 104, 144, 0, 95, 103, 125, 0, 98, 103, 111, 0, 96, 107, 91, 0, 93, 110, 68,
+ 0, 99, 107, 42, 0, 104, 105, 20, 0, 106, 101, 2, 0, 109, 96, 0, 0, 112, 91, 0, 0, 114, 88, 0, 0, 117, 86, 0,
+ 0, 76, 65, 242, 0, 80, 69, 225, 0, 82, 73, 207, 0, 82, 80, 190, 0, 84, 84, 171, 0, 88, 86, 151, 0, 93, 87, 128,
+ 0, 95, 88, 110, 0, 95, 89, 93, 0, 94, 91, 74, 0, 100, 87, 50, 0, 104, 85, 27, 0, 106, 83, 7, 0, 109, 81, 0,
+ 0, 110, 78, 0, 0, 110, 76, 0, 0, 112, 72, 0, 0, 76, 48, 242, 0, 82, 51, 227, 0, 83, 56, 212, 0, 82, 62, 197,
+ 0, 85, 65, 179, 0, 88, 69, 160, 0, 93, 71, 134, 0, 94, 73, 113, 0, 95, 72, 98, 0, 97, 71, 82, 0, 99, 71, 61,
+ 0, 105, 68, 37, 0, 109, 67, 17, 0, 111, 65, 3, 0, 111, 63, 0, 0, 110, 62, 0, 0, 112, 58, 0, 0, 85, 35, 236,
+ 0, 89, 37, 223, 0, 91, 41, 210, 0, 93, 44, 197, 0, 95, 47, 184, 0, 95, 51, 168, 0, 98, 54, 147, 0, 99, 56, 122,
+ 0, 98, 57, 105, 0, 97, 58, 88, 0, 96, 60, 71, 0, 101, 58, 52, 0, 106, 56, 28, 0, 109, 55, 10, 0, 108, 54, 1,
+ 0, 106, 54, 0, 0, 104, 52, 0, 0, 94, 24, 231, 0, 96, 26, 217, 0, 97, 28, 206, 0, 100, 30, 195, 0, 101, 32, 184,
+ 0, 103, 35, 171, 0, 104, 37, 154, 0, 105, 38, 134, 0, 103, 40, 112, 0, 98, 44, 92, 0, 95, 48, 77, 0, 96, 48, 62,
+ 0, 102, 44, 42, 0, 108, 42, 19, 0, 107, 42, 4, 0, 104, 42, 0, 0, 100, 43, 0, 0, 104, 15, 229, 0, 104, 15, 214,
+ 0, 104, 16, 204, 0, 104, 17, 193, 0, 105, 19, 183, 0, 106, 21, 170, 0, 106, 22, 154, 0, 106, 24, 136, 0, 105, 25, 116,
+ 0, 100, 29, 94, 0, 99, 31, 79, 0, 100, 32, 65, 0, 102, 31, 49, 0, 109, 27, 28, 0, 109, 27, 11, 0, 104, 29, 1,
+ 0, 96, 33, 0, 0, 112, 8, 229, 0, 111, 6, 213, 0, 110, 7, 202, 0, 109, 7, 192, 0, 107, 8, 180, 0, 106, 9, 166,
+ 0, 105, 10, 151, 0, 105, 11, 135, 0, 105, 11, 118, 0, 105, 11, 99, 0, 105, 13, 84, 0, 105, 14, 69, 0, 105, 14, 52,
+ 0, 107, 14, 35, 0, 109, 13, 19, 0, 105, 15, 5, 0, 93, 22, 0, 0, 119, 4, 228, 0, 117, 2, 209, 0, 114, 1, 199,
+ 0, 111, 1, 187, 0, 107, 1, 173, 0, 104, 1, 159, 0, 102, 1, 145, 0, 102, 1, 129, 0, 102, 1, 113, 0, 102, 1, 97,
+ 0, 102, 2, 85, 0, 103, 2, 72, 0, 103, 3, 56, 0, 103, 3, 39, 0, 103, 3, 24, 0, 102, 4, 10, 0, 90, 12, 0,
+ 0, 126, 2, 227, 0, 122, 0, 207, 0, 117, 0, 191, 0, 111, 0, 176, 0, 105, 0, 160, 0, 99, 0, 144, 0, 95, 0, 127,
+ 0, 92, 0, 111, 0, 90, 0, 96, 0, 89, 0, 85, 0, 89, 0, 76, 0, 90, 0, 67, 0, 90, 0, 56, 0, 90, 0, 43,
+ 0, 90, 0, 29, 0, 89, 1, 16, 0, 84, 5, 0, 0, 133, 0, 228, 0, 128, 0, 215, 0, 123, 0, 200, 0, 117, 0, 185,
+ 0, 111, 0, 167, 0, 104, 0, 146, 0, 96, 0, 125, 0, 87, 0, 103, 0, 78, 0, 83, 0, 77, 0, 73, 0, 77, 0, 67,
+ 0, 77, 0, 61, 0, 77, 0, 53, 0, 77, 0, 42, 0, 77, 0, 28, 0, 77, 0, 11, 0, 77, 0, 0, 2, 32, 197, 235,
+ 1, 30, 200, 233, 1, 29, 201, 221, 0, 34, 198, 200, 0, 35, 196, 175, 0, 37, 196, 145, 0, 38, 196, 111, 0, 39, 199, 83,
+ 0, 40, 200, 59, 0, 41, 199, 39, 0, 43, 200, 26, 0, 61, 193, 12, 0, 77, 187, 3, 0, 92, 180, 0, 0, 103, 174, 0,
+ 0, 114, 170, 1, 0, 122, 166, 0, 1, 35, 190, 236, 2, 39, 185, 234, 0, 44, 182, 212, 0, 45, 182, 194, 0, 42, 186, 164,
+ 0, 44, 187, 139, 0, 46, 186, 106, 0, 48, 187, 79, 0, 50, 185, 55, 0, 53, 184, 35, 0, 56, 182, 16, 0, 69, 176, 3,
+ 0, 84, 169, 0, 0, 96, 163, 0, 0, 105, 160, 0, 0, 114, 157, 0, 0, 119, 159, 0, 1, 39, 182, 238, 1, 46, 173, 225,
+ 0, 57, 165, 199, 0, 53, 170, 187, 0, 49, 178, 161, 0, 50, 179, 140, 0, 51, 178, 109, 0, 55, 179, 82, 0, 57, 176, 58,
+ 0, 60, 175, 37, 0, 63, 173, 17, 0, 73, 168, 2, 0, 86, 160, 0, 0, 97, 154, 0, 0, 106, 150, 0, 0, 112, 149, 0,
+ 0, 116, 152, 0, 1, 43, 168, 239, 0, 52, 160, 222, 0, 59, 153, 195, 0, 59, 158, 184, 0, 62, 162, 167, 0, 62, 164, 149,
+ 0, 63, 165, 127, 0, 61, 167, 99, 0, 64, 167, 66, 0, 67, 166, 43, 0, 69, 165, 21, 0, 76, 159, 2, 0, 88, 151, 0,
+ 0, 99, 145, 0, 0, 105, 142, 0, 0, 111, 140, 0, 0, 113, 143, 0, 0, 48, 151, 239, 0, 56, 145, 217, 0, 64, 143, 195,
+ 0, 65, 145, 182, 0, 68, 149, 164, 0, 71, 150, 149, 0, 72, 150, 132, 0, 68, 154, 104, 0, 71, 156, 69, 0, 72, 155, 46,
+ 0, 74, 154, 24, 0, 79, 150, 3, 0, 90, 142, 0, 0, 98, 136, 0, 0, 104, 132, 0, 0, 109, 129, 0, 0, 112, 132, 0,
+ 0, 52, 132, 238, 0, 61, 131, 211, 0, 67, 131, 191, 0, 68, 133, 181, 0, 72, 138, 164, 0, 74, 138, 147, 0, 75, 138, 130,
+ 0, 72, 141, 108, 0, 75, 143, 75, 0, 76, 143, 51, 0, 77, 142, 28, 0, 82, 139, 8, 0, 90, 133, 1, 0, 97, 126, 0,
+ 0, 103, 121, 0, 0, 108, 117, 0, 0, 110, 119, 0, 0, 56, 111, 239, 0, 64, 115, 206, 0, 71, 118, 186, 0, 73, 119, 175,
+ 0, 74, 121, 161, 0, 76, 123, 145, 0, 76, 122, 129, 0, 75, 125, 111, 0, 77, 128, 81, 0, 78, 129, 60, 0, 79, 128, 37,
+ 0, 84, 126, 15, 0, 89, 121, 2, 0, 96, 115, 0, 0, 101, 109, 0, 0, 105, 104, 0, 0, 108, 104, 0, 0, 59, 90, 237,
+ 0, 64, 97, 208, 0, 68, 100, 192, 0, 71, 104, 177, 0, 75, 105, 159, 0, 76, 106, 143, 0, 77, 106, 128, 0, 83, 104, 113,
+ 0, 81, 108, 93, 0, 77, 112, 71, 0, 81, 111, 45, 0, 86, 109, 23, 0, 89, 106, 5, 0, 94, 101, 0, 0, 98, 95, 0,
+ 0, 101, 91, 0, 0, 104, 88, 0, 0, 61, 71, 238, 0, 66, 75, 215, 0, 68, 80, 201, 0, 70, 86, 182, 0, 75, 88, 158,
+ 0, 76, 89, 143, 0, 78, 89, 128, 0, 82, 89, 109, 0, 84, 89, 96, 0, 81, 93, 76, 0, 83, 93, 51, 0, 86, 92, 29,
+ 0, 89, 90, 9, 0, 92, 86, 1, 0, 95, 81, 0, 0, 97, 78, 0, 0, 98, 75, 0, 0, 63, 52, 238, 0, 67, 57, 220,
+ 0, 69, 61, 206, 0, 68, 68, 190, 0, 71, 72, 172, 0, 74, 74, 154, 0, 76, 75, 135, 0, 79, 75, 113, 0, 81, 75, 96,
+ 0, 81, 75, 79, 0, 83, 75, 60, 0, 86, 74, 37, 0, 90, 70, 17, 0, 92, 70, 2, 0, 94, 68, 0, 0, 94, 65, 0,
+ 0, 95, 63, 0, 0, 62, 37, 236, 0, 69, 41, 222, 0, 72, 45, 209, 0, 74, 47, 196, 0, 77, 50, 180, 0, 78, 54, 163,
+ 0, 80, 56, 145, 0, 81, 58, 120, 0, 82, 60, 99, 0, 81, 60, 85, 0, 82, 58, 71, 0, 85, 58, 49, 0, 91, 56, 25,
+ 0, 94, 55, 7, 0, 94, 53, 0, 0, 94, 51, 0, 0, 95, 48, 0, 0, 73, 26, 232, 0, 76, 28, 218, 0, 78, 31, 207,
+ 0, 82, 32, 196, 0, 84, 35, 183, 0, 83, 39, 169, 0, 85, 40, 153, 0, 85, 42, 133, 0, 84, 45, 108, 0, 82, 48, 89,
+ 0, 81, 48, 75, 0, 83, 48, 59, 0, 87, 46, 39, 0, 92, 43, 17, 0, 93, 43, 2, 0, 90, 43, 0, 0, 88, 42, 0,
+ 0, 84, 17, 228, 0, 85, 18, 213, 0, 86, 19, 204, 0, 87, 20, 194, 0, 88, 22, 183, 0, 89, 24, 170, 0, 90, 25, 155,
+ 0, 91, 27, 138, 0, 90, 29, 116, 0, 86, 32, 94, 0, 82, 35, 77, 0, 82, 36, 64, 0, 84, 35, 49, 0, 88, 32, 30,
+ 0, 92, 30, 9, 0, 90, 31, 1, 0, 85, 33, 0, 0, 93, 10, 226, 0, 93, 9, 212, 0, 93, 9, 202, 0, 92, 9, 192,
+ 0, 92, 10, 180, 0, 92, 12, 166, 0, 92, 13, 152, 0, 92, 14, 136, 0, 92, 14, 118, 0, 91, 15, 99, 0, 86, 19, 80,
+ 0, 86, 20, 66, 0, 85, 21, 52, 0, 87, 20, 36, 0, 94, 16, 17, 0, 92, 17, 3, 0, 82, 23, 0, 0, 101, 5, 226,
+ 0, 100, 3, 210, 0, 98, 2, 200, 0, 96, 1, 189, 0, 94, 2, 176, 0, 92, 2, 161, 0, 91, 3, 145, 0, 90, 3, 130,
+ 0, 90, 3, 115, 0, 90, 3, 98, 0, 89, 4, 82, 0, 89, 5, 69, 0, 89, 6, 55, 0, 89, 6, 39, 0, 91, 5, 23,
+ 0, 91, 5, 9, 0, 79, 13, 0, 0, 109, 2, 225, 0, 107, 0, 207, 0, 102, 0, 192, 0, 98, 0, 177, 0, 94, 0, 161,
+ 0, 90, 0, 145, 0, 86, 0, 129, 0, 84, 0, 113, 0, 82, 0, 99, 0, 80, 0, 85, 0, 80, 0, 75, 0, 81, 0, 65,
+ 0, 82, 0, 55, 0, 82, 0, 42, 0, 82, 0, 29, 0, 81, 1, 15, 0, 75, 5, 0, 0, 117, 0, 226, 0, 114, 0, 213,
+ 0, 109, 0, 199, 0, 104, 0, 184, 0, 99, 0, 167, 0, 93, 0, 147, 0, 87, 0, 126, 0, 79, 0, 105, 0, 71, 0, 85,
+ 0, 69, 0, 74, 0, 69, 0, 65, 0, 69, 0, 59, 0, 69, 0, 51, 0, 69, 0, 41, 0, 69, 0, 28, 0, 69, 0, 13,
+ 0, 69, 0, 0, 0, 24, 197, 236, 0, 22, 200, 234, 0, 20, 202, 225, 0, 23, 199, 204, 0, 25, 197, 179, 0, 26, 196, 152,
+ 0, 28, 196, 124, 0, 28, 200, 93, 0, 29, 202, 66, 0, 31, 202, 46, 0, 32, 203, 29, 0, 33, 203, 18, 0, 53, 195, 8,
+ 0, 70, 188, 2, 0, 85, 181, 0, 0, 96, 175, 0, 0, 106, 171, 0, 0, 25, 191, 237, 0, 26, 184, 234, 0, 28, 182, 218,
+ 0, 28, 182, 197, 0, 26, 186, 167, 0, 28, 186, 145, 0, 30, 187, 118, 0, 32, 188, 87, 0, 35, 187, 61, 0, 37, 185, 40,
+ 0, 40, 185, 23, 0, 44, 182, 8, 0, 59, 175, 1, 0, 75, 169, 0, 0, 87, 164, 0, 0, 97, 162, 0, 0, 102, 163, 0,
+ 0, 27, 182, 238, 0, 30, 173, 230, 0, 35, 168, 207, 0, 34, 171, 190, 0, 31, 176, 163, 0, 33, 177, 144, 0, 34, 178, 119,
+ 0, 37, 178, 89, 0, 41, 177, 63, 0, 43, 175, 42, 0, 45, 175, 24, 0, 49, 172, 7, 0, 63, 165, 1, 0, 78, 159, 0,
+ 0, 89, 154, 0, 0, 95, 152, 0, 0, 99, 156, 0, 0, 29, 170, 239, 0, 33, 161, 226, 0, 39, 157, 203, 0, 42, 157, 186,
+ 0, 43, 159, 167, 0, 43, 161, 152, 0, 43, 164, 132, 0, 42, 167, 104, 0, 47, 167, 70, 0, 49, 165, 46, 0, 51, 165, 26,
+ 0, 54, 163, 7, 0, 68, 155, 0, 0, 80, 149, 0, 0, 88, 145, 0, 0, 94, 142, 0, 0, 97, 147, 0, 0, 33, 153, 239,
+ 0, 37, 148, 223, 0, 43, 146, 200, 0, 47, 146, 182, 0, 52, 147, 161, 0, 51, 149, 150, 0, 50, 152, 133, 0, 49, 155, 109,
+ 0, 53, 157, 74, 0, 54, 155, 50, 0, 56, 155, 29, 0, 59, 153, 8, 0, 70, 146, 1, 0, 79, 139, 0, 0, 87, 135, 0,
+ 0, 93, 132, 0, 0, 95, 137, 0, 0, 37, 135, 238, 0, 43, 133, 214, 0, 50, 132, 194, 0, 53, 134, 179, 0, 55, 136, 160,
+ 0, 56, 138, 148, 0, 56, 139, 133, 0, 54, 142, 114, 0, 57, 145, 79, 0, 59, 144, 56, 0, 61, 143, 33, 0, 63, 142, 12,
+ 0, 70, 137, 1, 0, 79, 129, 0, 0, 86, 124, 0, 0, 92, 120, 0, 0, 94, 124, 0, 0, 42, 116, 237, 0, 49, 116, 205,
+ 0, 56, 118, 186, 0, 58, 121, 176, 0, 59, 123, 161, 0, 60, 125, 144, 0, 60, 123, 129, 0, 57, 127, 113, 0, 60, 131, 85,
+ 0, 62, 131, 64, 0, 63, 130, 41, 0, 65, 129, 18, 0, 69, 125, 2, 0, 78, 118, 0, 0, 85, 111, 0, 0, 90, 107, 0,
+ 0, 92, 109, 0, 0, 45, 95, 236, 0, 51, 100, 204, 0, 56, 103, 187, 0, 58, 105, 173, 0, 61, 106, 158, 0, 62, 107, 143,
+ 0, 63, 108, 129, 0, 61, 109, 113, 0, 62, 112, 95, 0, 62, 114, 75, 0, 64, 114, 48, 0, 67, 113, 26, 0, 70, 111, 6,
+ 0, 77, 105, 0, 0, 83, 98, 0, 0, 88, 93, 0, 0, 89, 92, 0, 0, 48, 77, 234, 0, 52, 84, 205, 0, 56, 86, 189,
+ 0, 58, 89, 174, 0, 61, 90, 156, 0, 63, 91, 142, 0, 64, 91, 128, 0, 65, 92, 112, 0, 72, 90, 94, 0, 68, 94, 78,
+ 0, 66, 96, 53, 0, 68, 96, 34, 0, 71, 94, 13, 0, 76, 90, 1, 0, 82, 85, 0, 0, 85, 80, 0, 0, 85, 77, 0,
+ 0, 50, 59, 233, 0, 52, 67, 209, 0, 54, 70, 196, 0, 56, 73, 183, 0, 58, 76, 167, 0, 61, 78, 147, 0, 63, 77, 131,
+ 0, 65, 78, 114, 0, 70, 77, 94, 0, 69, 76, 81, 0, 67, 79, 64, 0, 68, 79, 48, 0, 73, 76, 29, 0, 76, 75, 3,
+ 0, 79, 71, 0, 0, 81, 67, 0, 0, 82, 65, 0, 0, 51, 42, 233, 0, 55, 46, 215, 0, 58, 49, 204, 0, 61, 51, 192,
+ 0, 62, 55, 176, 0, 59, 61, 159, 0, 61, 63, 139, 0, 63, 64, 120, 0, 67, 64, 97, 0, 68, 63, 83, 0, 67, 63, 68,
+ 0, 67, 63, 53, 0, 73, 60, 33, 0, 76, 58, 8, 0, 78, 57, 0, 0, 79, 55, 0, 0, 79, 53, 0, 0, 49, 29, 231,
+ 0, 57, 32, 216, 0, 60, 34, 206, 0, 64, 35, 195, 0, 65, 37, 182, 0, 60, 43, 166, 0, 61, 45, 148, 0, 63, 47, 130,
+ 0, 65, 49, 105, 0, 66, 49, 86, 0, 67, 48, 74, 0, 70, 46, 60, 0, 72, 46, 37, 0, 76, 44, 14, 0, 78, 42, 1,
+ 0, 78, 41, 0, 0, 78, 38, 0, 0, 62, 19, 229, 0, 66, 21, 214, 0, 68, 21, 205, 0, 70, 22, 195, 0, 71, 24, 183,
+ 0, 72, 26, 170, 0, 73, 28, 155, 0, 73, 30, 138, 0, 73, 31, 117, 0, 72, 34, 93, 0, 69, 36, 76, 0, 69, 36, 63,
+ 0, 70, 35, 46, 0, 73, 34, 27, 0, 77, 32, 7, 0, 76, 32, 0, 0, 73, 32, 0, 0, 73, 11, 225, 0, 74, 12, 211,
+ 0, 75, 12, 202, 0, 76, 12, 193, 0, 77, 13, 181, 0, 77, 14, 167, 0, 77, 15, 153, 0, 77, 17, 138, 0, 77, 17, 120,
+ 0, 77, 18, 99, 0, 72, 22, 79, 0, 68, 24, 64, 0, 68, 25, 51, 0, 69, 24, 36, 0, 74, 22, 18, 0, 76, 20, 2,
+ 0, 70, 24, 0, 0, 83, 6, 224, 0, 82, 5, 209, 0, 82, 4, 201, 0, 81, 4, 191, 0, 80, 4, 178, 0, 79, 5, 162,
+ 0, 78, 5, 147, 0, 78, 6, 132, 0, 78, 6, 116, 0, 77, 6, 99, 0, 75, 7, 82, 0, 72, 10, 66, 0, 72, 12, 53,
+ 0, 71, 12, 40, 0, 73, 11, 25, 0, 77, 8, 8, 0, 68, 14, 0, 0, 91, 2, 223, 0, 90, 1, 208, 0, 88, 0, 196,
+ 0, 85, 0, 182, 0, 82, 0, 166, 0, 79, 0, 149, 0, 76, 0, 133, 0, 74, 0, 117, 0, 73, 0, 102, 0, 71, 0, 88,
+ 0, 71, 1, 76, 0, 71, 1, 64, 0, 71, 1, 53, 0, 72, 1, 41, 0, 72, 1, 28, 0, 72, 1, 14, 0, 65, 5, 0,
+ 0, 100, 0, 224, 0, 97, 0, 213, 0, 94, 0, 200, 0, 91, 0, 186, 0, 87, 0, 170, 0, 82, 0, 150, 0, 77, 0, 129,
+ 0, 70, 0, 106, 0, 63, 0, 86, 0, 61, 0, 75, 0, 61, 0, 66, 0, 60, 0, 58, 0, 60, 0, 51, 0, 60, 0, 41,
+ 0, 60, 0, 29, 0, 60, 0, 14, 0, 60, 0, 0, 0, 16, 196, 235, 0, 14, 199, 235, 0, 12, 202, 230, 0, 14, 199, 207,
+ 0, 15, 197, 184, 0, 17, 196, 159, 0, 19, 197, 131, 0, 19, 199, 103, 0, 20, 202, 75, 0, 22, 203, 53, 0, 23, 205, 35,
+ 0, 24, 205, 20, 0, 25, 205, 12, 0, 45, 196, 4, 0, 62, 188, 0, 0, 78, 182, 0, 0, 90, 176, 0, 0, 17, 190, 236,
+ 0, 15, 185, 224, 0, 14, 184, 210, 0, 13, 185, 190, 0, 13, 186, 168, 0, 15, 186, 150, 0, 17, 188, 125, 0, 18, 189, 95,
+ 0, 21, 189, 68, 0, 24, 187, 47, 0, 27, 187, 29, 0, 29, 185, 14, 0, 34, 183, 3, 0, 51, 176, 0, 0, 68, 170, 0,
+ 0, 79, 166, 0, 0, 86, 168, 0, 0, 19, 182, 237, 0, 17, 176, 223, 0, 18, 173, 202, 0, 17, 174, 185, 0, 17, 176, 164,
+ 0, 18, 176, 147, 0, 20, 178, 124, 0, 21, 180, 96, 0, 26, 178, 69, 0, 29, 176, 48, 0, 31, 176, 29, 0, 33, 174, 13,
+ 0, 39, 172, 2, 0, 55, 164, 0, 0, 70, 158, 0, 0, 78, 156, 0, 0, 83, 160, 0, 0, 20, 170, 238, 0, 19, 164, 222,
+ 0, 22, 161, 202, 0, 25, 158, 188, 0, 27, 158, 169, 0, 26, 161, 152, 0, 25, 165, 128, 0, 26, 169, 101, 0, 31, 167, 72,
+ 0, 34, 166, 50, 0, 35, 166, 28, 0, 38, 164, 10, 0, 45, 160, 1, 0, 60, 153, 0, 0, 70, 148, 0, 0, 77, 146, 0,
+ 0, 81, 151, 0, 0, 22, 154, 239, 0, 22, 151, 224, 0, 26, 149, 203, 0, 31, 148, 186, 0, 36, 146, 163, 0, 33, 148, 150,
+ 0, 30, 154, 129, 0, 31, 156, 106, 0, 35, 156, 76, 0, 38, 155, 54, 0, 40, 154, 32, 0, 42, 154, 12, 0, 48, 150, 1,
+ 0, 59, 143, 0, 0, 69, 138, 0, 0, 76, 135, 0, 0, 78, 140, 0, 0, 26, 137, 236, 0, 28, 134, 217, 0, 32, 134, 197,
+ 0, 37, 136, 181, 0, 40, 135, 161, 0, 39, 136, 147, 0, 38, 138, 133, 0, 37, 141, 116, 0, 39, 145, 84, 0, 42, 144, 60,
+ 0, 43, 142, 38, 0, 45, 142, 18, 0, 48, 140, 2, 0, 58, 133, 0, 0, 68, 127, 0, 0, 76, 123, 0, 0, 77, 128, 0,
+ 0, 29, 119, 235, 0, 35, 118, 205, 0, 42, 119, 185, 0, 42, 120, 175, 0, 43, 123, 161, 0, 44, 124, 143, 0, 45, 122, 130,
+ 0, 42, 127, 115, 0, 42, 131, 90, 0, 45, 131, 67, 0, 46, 130, 44, 0, 47, 129, 24, 0, 49, 128, 5, 0, 58, 122, 0,
+ 0, 68, 114, 0, 0, 74, 110, 0, 0, 75, 113, 0, 0, 33, 98, 234, 0, 39, 103, 201, 0, 44, 103, 180, 0, 45, 105, 171,
+ 0, 46, 107, 158, 0, 48, 107, 143, 0, 49, 109, 130, 0, 46, 110, 114, 0, 45, 113, 98, 0, 45, 115, 78, 0, 47, 115, 51,
+ 0, 48, 114, 29, 0, 50, 114, 9, 0, 57, 109, 1, 0, 67, 101, 0, 0, 73, 95, 0, 0, 73, 96, 0, 0, 35, 81, 233,
+ 0, 40, 87, 198, 0, 46, 88, 175, 0, 46, 90, 167, 0, 47, 92, 155, 0, 48, 92, 142, 0, 50, 93, 128, 0, 50, 94, 113,
+ 0, 50, 94, 97, 0, 49, 97, 80, 0, 49, 98, 56, 0, 50, 98, 36, 0, 52, 98, 16, 0, 57, 95, 1, 0, 66, 88, 0,
+ 0, 71, 83, 0, 0, 70, 81, 0, 0, 38, 64, 229, 0, 40, 72, 202, 0, 43, 75, 188, 0, 44, 76, 177, 0, 45, 78, 164,
+ 0, 47, 79, 145, 0, 50, 80, 128, 0, 51, 80, 114, 0, 52, 80, 96, 0, 57, 77, 82, 0, 54, 80, 67, 0, 53, 81, 52,
+ 0, 57, 80, 31, 0, 58, 80, 5, 0, 64, 75, 0, 0, 69, 70, 0, 0, 68, 68, 0, 0, 40, 47, 228, 0, 43, 52, 211,
+ 0, 45, 54, 201, 0, 46, 57, 190, 0, 46, 60, 175, 0, 45, 65, 153, 0, 49, 67, 128, 0, 51, 67, 112, 0, 53, 67, 96,
+ 0, 56, 64, 81, 0, 57, 63, 70, 0, 55, 65, 56, 0, 59, 63, 40, 0, 59, 63, 18, 0, 63, 61, 2, 0, 66, 57, 0,
+ 0, 65, 56, 0, 0, 39, 32, 228, 0, 44, 36, 211, 0, 47, 37, 202, 0, 48, 38, 192, 0, 49, 42, 179, 0, 44, 49, 162,
+ 0, 46, 51, 142, 0, 48, 52, 125, 0, 50, 52, 104, 0, 53, 52, 84, 0, 54, 50, 71, 0, 54, 50, 55, 0, 56, 50, 40,
+ 0, 58, 48, 21, 0, 61, 46, 3, 0, 63, 44, 0, 0, 63, 43, 0, 0, 39, 22, 227, 0, 45, 24, 212, 0, 48, 24, 204,
+ 0, 50, 24, 195, 0, 52, 26, 183, 0, 52, 28, 168, 0, 53, 30, 152, 0, 53, 32, 135, 0, 53, 34, 115, 0, 55, 35, 92,
+ 0, 55, 35, 75, 0, 54, 35, 61, 0, 55, 34, 48, 0, 57, 34, 24, 0, 61, 33, 4, 0, 62, 31, 0, 0, 63, 29, 0,
+ 0, 52, 13, 225, 0, 54, 14, 212, 0, 56, 13, 204, 0, 58, 13, 195, 0, 59, 14, 184, 0, 59, 16, 169, 0, 59, 17, 154,
+ 0, 59, 19, 139, 0, 59, 20, 121, 0, 60, 21, 100, 0, 58, 23, 79, 0, 55, 25, 63, 0, 54, 25, 49, 0, 56, 25, 33,
+ 0, 59, 23, 15, 0, 61, 22, 2, 0, 58, 22, 0, 0, 63, 7, 223, 0, 64, 6, 209, 0, 65, 5, 201, 0, 65, 5, 192,
+ 0, 64, 6, 180, 0, 64, 7, 165, 0, 63, 7, 149, 0, 63, 8, 135, 0, 64, 8, 119, 0, 64, 8, 100, 0, 62, 9, 83,
+ 0, 58, 13, 66, 0, 55, 15, 50, 0, 55, 15, 38, 0, 56, 14, 25, 0, 59, 12, 9, 0, 56, 14, 0, 0, 73, 3, 222,
+ 0, 73, 1, 209, 0, 71, 1, 199, 0, 70, 0, 188, 0, 68, 0, 174, 0, 66, 1, 158, 0, 65, 1, 140, 0, 63, 1, 123,
+ 0, 62, 1, 107, 0, 61, 1, 93, 0, 61, 1, 80, 0, 60, 1, 66, 0, 58, 4, 52, 0, 58, 4, 40, 0, 57, 4, 28,
+ 0, 58, 4, 14, 0, 54, 6, 0, 0, 82, 0, 222, 0, 80, 0, 213, 0, 78, 0, 202, 0, 76, 0, 190, 0, 73, 0, 175,
+ 0, 70, 0, 156, 0, 66, 0, 134, 0, 60, 0, 110, 0, 53, 0, 88, 0, 52, 0, 77, 0, 51, 0, 67, 0, 51, 0, 59,
+ 0, 50, 0, 51, 0, 50, 0, 41, 0, 51, 0, 30, 0, 51, 0, 16, 0, 50, 0, 0, 0, 10, 194, 235, 0, 8, 196, 234,
+ 0, 6, 200, 230, 0, 6, 198, 210, 0, 7, 196, 187, 0, 9, 196, 164, 0, 10, 197, 138, 0, 12, 199, 114, 0, 13, 201, 87,
+ 0, 14, 203, 61, 0, 15, 205, 41, 0, 16, 206, 26, 0, 17, 207, 13, 0, 17, 207, 6, 0, 38, 198, 2, 0, 56, 189, 0,
+ 0, 71, 182, 0, 0, 11, 189, 236, 0, 7, 184, 222, 0, 6, 183, 209, 0, 5, 184, 190, 0, 4, 185, 169, 0, 6, 185, 152,
+ 0, 8, 186, 130, 0, 8, 190, 105, 0, 11, 190, 77, 0, 13, 189, 53, 0, 16, 188, 36, 0, 18, 188, 20, 0, 20, 187, 8,
+ 0, 26, 184, 2, 0, 42, 177, 0, 0, 59, 172, 0, 0, 68, 174, 0, 0, 12, 181, 237, 0, 9, 175, 221, 0, 8, 172, 201,
+ 0, 8, 173, 185, 0, 7, 174, 165, 0, 8, 175, 149, 0, 10, 176, 130, 0, 9, 182, 106, 0, 12, 181, 77, 0, 16, 178, 53,
+ 0, 19, 177, 35, 0, 21, 176, 17, 0, 23, 175, 4, 0, 33, 170, 0, 0, 47, 164, 0, 0, 59, 161, 0, 0, 65, 166, 0,
+ 0, 13, 169, 238, 0, 11, 164, 221, 0, 11, 161, 202, 0, 13, 159, 189, 0, 13, 159, 171, 0, 13, 161, 154, 0, 13, 165, 130,
+ 0, 12, 170, 107, 0, 15, 169, 79, 0, 19, 167, 55, 0, 21, 166, 34, 0, 23, 166, 14, 0, 27, 163, 2, 0, 38, 158, 0,
+ 0, 48, 153, 0, 0, 58, 150, 0, 0, 63, 156, 0, 0, 14, 155, 239, 0, 13, 152, 223, 0, 14, 150, 203, 0, 16, 147, 189,
+ 0, 18, 147, 169, 0, 16, 149, 153, 0, 15, 154, 130, 0, 16, 156, 110, 0, 18, 156, 83, 0, 22, 155, 59, 0, 24, 154, 38,
+ 0, 25, 154, 17, 0, 28, 153, 3, 0, 37, 147, 0, 0, 47, 142, 0, 0, 58, 139, 0, 0, 61, 145, 0, 0, 17, 138, 236,
+ 0, 17, 135, 221, 0, 19, 135, 202, 0, 20, 135, 186, 0, 21, 137, 168, 0, 22, 138, 151, 0, 23, 138, 134, 0, 21, 140, 118,
+ 0, 22, 144, 89, 0, 25, 144, 64, 0, 27, 142, 44, 0, 28, 142, 24, 0, 29, 141, 7, 0, 37, 136, 1, 0, 47, 130, 0,
+ 0, 57, 126, 0, 0, 58, 132, 0, 0, 19, 121, 232, 0, 22, 119, 211, 0, 23, 120, 195, 0, 24, 122, 182, 0, 25, 124, 167,
+ 0, 28, 125, 147, 0, 31, 122, 130, 0, 27, 126, 116, 0, 26, 131, 93, 0, 28, 131, 70, 0, 29, 130, 49, 0, 30, 129, 29,
+ 0, 31, 129, 11, 0, 37, 126, 1, 0, 48, 118, 0, 0, 57, 112, 0, 0, 57, 117, 0, 0, 22, 101, 231, 0, 25, 104, 203,
+ 0, 29, 106, 186, 0, 29, 107, 176, 0, 30, 109, 162, 0, 31, 110, 146, 0, 35, 111, 131, 0, 33, 110, 115, 0, 31, 113, 99,
+ 0, 30, 115, 82, 0, 31, 116, 55, 0, 31, 115, 33, 0, 32, 115, 14, 0, 37, 113, 1, 0, 48, 105, 0, 0, 56, 98, 0,
+ 0, 54, 100, 0, 0, 24, 84, 231, 0, 28, 89, 197, 0, 33, 90, 175, 0, 34, 91, 167, 0, 34, 93, 157, 0, 34, 94, 143,
+ 0, 36, 95, 129, 0, 36, 95, 113, 0, 37, 95, 97, 0, 33, 98, 83, 0, 33, 100, 59, 0, 33, 100, 39, 0, 34, 100, 19,
+ 0, 37, 99, 2, 0, 48, 92, 0, 0, 55, 86, 0, 0, 52, 85, 0, 0, 26, 68, 227, 0, 28, 74, 202, 0, 30, 77, 187,
+ 0, 31, 79, 173, 0, 34, 79, 160, 0, 35, 81, 145, 0, 37, 82, 128, 0, 38, 82, 113, 0, 38, 81, 96, 0, 37, 82, 84,
+ 0, 36, 83, 67, 0, 34, 85, 51, 0, 37, 85, 26, 0, 39, 84, 6, 0, 47, 79, 0, 0, 53, 73, 0, 0, 51, 73, 0,
+ 0, 29, 52, 224, 0, 31, 56, 210, 0, 31, 59, 200, 0, 30, 64, 182, 0, 33, 66, 165, 0, 35, 66, 146, 0, 36, 68, 128,
+ 0, 38, 69, 112, 0, 40, 69, 96, 0, 40, 68, 82, 0, 45, 65, 69, 0, 41, 68, 55, 0, 42, 68, 37, 0, 42, 67, 20,
+ 0, 46, 65, 3, 0, 52, 61, 0, 0, 49, 60, 0, 0, 30, 37, 223, 0, 32, 40, 210, 0, 33, 41, 202, 0, 30, 46, 189,
+ 0, 31, 50, 174, 0, 32, 52, 157, 0, 34, 54, 138, 0, 34, 56, 120, 0, 38, 55, 98, 0, 40, 56, 84, 0, 43, 53, 70,
+ 0, 42, 53, 57, 0, 40, 54, 43, 0, 40, 54, 29, 0, 45, 51, 9, 0, 50, 47, 1, 0, 48, 47, 0, 0, 30, 23, 223,
+ 0, 32, 26, 209, 0, 34, 26, 201, 0, 35, 27, 192, 0, 36, 29, 180, 0, 37, 32, 166, 0, 37, 35, 148, 0, 34, 40, 130,
+ 0, 35, 41, 109, 0, 38, 41, 91, 0, 41, 39, 72, 0, 40, 39, 58, 0, 39, 39, 42, 0, 40, 39, 28, 0, 45, 35, 11,
+ 0, 48, 34, 1, 0, 46, 33, 0, 0, 29, 15, 223, 0, 34, 16, 210, 0, 37, 15, 203, 0, 39, 15, 195, 0, 39, 16, 184,
+ 0, 39, 18, 170, 0, 39, 20, 154, 0, 34, 24, 138, 0, 35, 25, 119, 0, 38, 24, 100, 0, 40, 24, 79, 0, 40, 25, 62,
+ 0, 40, 25, 48, 0, 41, 24, 36, 0, 44, 23, 14, 0, 46, 23, 2, 0, 47, 20, 0, 0, 41, 8, 222, 0, 43, 8, 210,
+ 0, 45, 6, 203, 0, 45, 6, 196, 0, 45, 7, 185, 0, 45, 8, 171, 0, 45, 9, 154, 0, 45, 10, 139, 0, 45, 10, 122,
+ 0, 46, 11, 103, 0, 47, 11, 84, 0, 45, 13, 65, 0, 42, 15, 50, 0, 42, 16, 37, 0, 44, 15, 22, 0, 46, 14, 7,
+ 0, 44, 14, 0, 0, 52, 3, 220, 0, 53, 2, 209, 0, 53, 1, 201, 0, 52, 1, 192, 0, 51, 1, 181, 0, 50, 1, 166,
+ 0, 49, 1, 148, 0, 48, 1, 131, 0, 48, 1, 113, 0, 48, 1, 97, 0, 49, 1, 83, 0, 49, 2, 69, 0, 45, 5, 53,
+ 0, 45, 5, 39, 0, 46, 5, 27, 0, 46, 5, 13, 0, 43, 6, 0, 0, 63, 0, 220, 0, 61, 0, 212, 0, 60, 0, 203,
+ 0, 59, 0, 192, 0, 57, 0, 179, 0, 55, 0, 161, 0, 52, 0, 139, 0, 47, 0, 114, 0, 42, 0, 91, 0, 42, 0, 79,
+ 0, 41, 0, 69, 0, 41, 0, 60, 0, 40, 0, 52, 0, 40, 0, 43, 0, 41, 0, 31, 0, 41, 0, 17, 0, 40, 0, 0,
+ 0, 6, 192, 235, 0, 4, 194, 233, 0, 3, 195, 226, 0, 3, 195, 209, 0, 4, 194, 189, 0, 4, 195, 168, 0, 4, 197, 145,
+ 0, 6, 198, 122, 0, 7, 200, 96, 0, 8, 202, 70, 0, 9, 204, 49, 0, 10, 206, 32, 0, 10, 207, 17, 0, 10, 209, 7,
+ 0, 11, 209, 3, 0, 31, 199, 0, 0, 49, 190, 0, 0, 6, 187, 235, 0, 2, 181, 222, 0, 1, 181, 208, 0, 1, 181, 190,
+ 0, 1, 183, 170, 0, 1, 184, 154, 0, 1, 185, 134, 0, 2, 190, 111, 0, 3, 190, 87, 0, 6, 190, 61, 0, 8, 189, 42,
+ 0, 9, 189, 26, 0, 11, 189, 13, 0, 13, 188, 4, 0, 19, 185, 1, 0, 35, 180, 0, 0, 45, 182, 0, 0, 6, 180, 236,
+ 0, 4, 173, 220, 0, 2, 170, 199, 0, 2, 171, 184, 0, 1, 173, 166, 0, 1, 174, 149, 0, 2, 175, 132, 0, 2, 181, 111,
+ 0, 3, 182, 86, 0, 6, 180, 60, 0, 9, 178, 40, 0, 11, 177, 23, 0, 12, 177, 8, 0, 17, 174, 1, 0, 26, 170, 0,
+ 0, 35, 168, 0, 0, 42, 173, 0, 0, 7, 169, 237, 0, 5, 163, 220, 0, 4, 161, 200, 0, 3, 160, 182, 0, 3, 161, 164,
+ 0, 3, 163, 148, 0, 3, 164, 131, 0, 3, 168, 112, 0, 4, 171, 89, 0, 7, 169, 63, 0, 9, 167, 41, 0, 10, 166, 22,
+ 0, 12, 166, 7, 0, 17, 163, 1, 0, 26, 158, 0, 0, 36, 156, 0, 0, 40, 162, 0, 0, 8, 155, 237, 0, 6, 152, 222,
+ 0, 6, 151, 202, 0, 5, 151, 185, 0, 4, 151, 164, 0, 4, 152, 147, 0, 5, 154, 130, 0, 5, 155, 113, 0, 5, 158, 91,
+ 0, 8, 156, 66, 0, 10, 154, 45, 0, 11, 154, 25, 0, 12, 154, 8, 0, 16, 152, 1, 0, 26, 146, 0, 0, 36, 144, 0,
+ 0, 39, 150, 0, 0, 9, 139, 235, 0, 8, 138, 222, 0, 8, 138, 203, 0, 8, 139, 187, 0, 7, 139, 168, 0, 8, 138, 153,
+ 0, 9, 137, 136, 0, 8, 140, 120, 0, 8, 143, 94, 0, 10, 143, 70, 0, 12, 142, 49, 0, 12, 142, 29, 0, 13, 142, 10,
+ 0, 17, 140, 1, 0, 28, 134, 0, 0, 37, 130, 0, 0, 37, 137, 0, 0, 12, 121, 231, 0, 11, 121, 217, 0, 11, 123, 202,
+ 0, 10, 125, 187, 0, 10, 127, 170, 0, 13, 126, 152, 0, 17, 122, 131, 0, 13, 125, 117, 0, 11, 130, 95, 0, 12, 130, 76,
+ 0, 13, 130, 54, 0, 14, 130, 34, 0, 15, 130, 14, 0, 18, 128, 1, 0, 29, 121, 0, 0, 38, 116, 0, 0, 36, 122, 0,
+ 0, 14, 103, 228, 0, 14, 105, 206, 0, 15, 106, 191, 0, 15, 108, 180, 0, 15, 111, 167, 0, 18, 113, 148, 0, 21, 111, 132,
+ 0, 19, 110, 115, 0, 17, 113, 100, 0, 15, 115, 85, 0, 15, 116, 60, 0, 16, 116, 39, 0, 16, 117, 18, 0, 18, 115, 2,
+ 0, 30, 108, 0, 0, 38, 102, 0, 0, 35, 105, 0, 0, 15, 86, 227, 0, 17, 90, 198, 0, 20, 92, 176, 0, 21, 93, 168,
+ 0, 21, 94, 159, 0, 21, 95, 146, 0, 22, 96, 131, 0, 23, 97, 115, 0, 23, 95, 97, 0, 19, 99, 85, 0, 17, 101, 64,
+ 0, 17, 102, 44, 0, 18, 102, 23, 0, 20, 101, 5, 0, 30, 95, 0, 0, 38, 89, 0, 0, 34, 88, 0, 0, 16, 71, 225,
+ 0, 17, 76, 202, 0, 19, 79, 187, 0, 20, 81, 170, 0, 23, 81, 155, 0, 23, 82, 144, 0, 24, 82, 129, 0, 25, 83, 113,
+ 0, 25, 83, 97, 0, 23, 83, 84, 0, 21, 85, 70, 0, 19, 87, 53, 0, 20, 88, 28, 0, 21, 87, 8, 0, 29, 82, 1,
+ 0, 38, 76, 0, 0, 33, 76, 0, 0, 17, 56, 222, 0, 19, 59, 210, 0, 20, 61, 200, 0, 20, 67, 176, 0, 24, 68, 151,
+ 0, 24, 69, 141, 0, 24, 70, 129, 0, 26, 71, 112, 0, 27, 71, 96, 0, 27, 70, 83, 0, 26, 69, 70, 0, 23, 72, 54,
+ 0, 22, 73, 34, 0, 23, 73, 14, 0, 29, 69, 2, 0, 37, 64, 0, 0, 33, 65, 0, 0, 19, 41, 220, 0, 21, 43, 210,
+ 0, 21, 45, 202, 0, 19, 51, 185, 0, 20, 54, 166, 0, 21, 56, 151, 0, 22, 57, 136, 0, 23, 58, 117, 0, 26, 57, 96,
+ 0, 28, 58, 83, 0, 28, 57, 69, 0, 31, 54, 56, 0, 27, 56, 42, 0, 26, 57, 28, 0, 30, 55, 10, 0, 35, 51, 1,
+ 0, 32, 52, 0, 0, 19, 28, 220, 0, 21, 29, 210, 0, 22, 30, 203, 0, 22, 32, 193, 0, 23, 34, 180, 0, 23, 38, 166,
+ 0, 23, 40, 147, 0, 22, 43, 124, 0, 25, 44, 98, 0, 27, 43, 84, 0, 28, 44, 71, 0, 30, 41, 55, 0, 29, 41, 45,
+ 0, 28, 42, 31, 0, 32, 40, 17, 0, 32, 39, 2, 0, 31, 39, 0, 0, 20, 17, 219, 0, 22, 17, 207, 0, 23, 17, 200,
+ 0, 24, 18, 191, 0, 24, 20, 180, 0, 24, 22, 167, 0, 24, 24, 151, 0, 20, 29, 133, 0, 23, 30, 112, 0, 24, 30, 95,
+ 0, 26, 29, 78, 0, 28, 28, 59, 0, 29, 27, 44, 0, 28, 28, 30, 0, 30, 27, 17, 0, 31, 26, 2, 0, 31, 25, 0,
+ 0, 19, 10, 219, 0, 23, 9, 209, 0, 25, 8, 202, 0, 26, 8, 194, 0, 26, 8, 184, 0, 26, 9, 171, 0, 26, 11, 155,
+ 0, 27, 12, 139, 0, 27, 12, 122, 0, 27, 13, 104, 0, 28, 13, 86, 0, 29, 14, 64, 0, 28, 15, 47, 0, 28, 15, 35,
+ 0, 27, 15, 24, 0, 31, 14, 2, 0, 32, 13, 0, 0, 31, 4, 219, 0, 32, 3, 210, 0, 32, 2, 203, 0, 32, 1, 196,
+ 0, 32, 1, 186, 0, 31, 2, 172, 0, 31, 2, 155, 0, 31, 3, 137, 0, 30, 3, 119, 0, 30, 4, 103, 0, 32, 4, 87,
+ 0, 33, 4, 70, 0, 31, 6, 53, 0, 31, 6, 39, 0, 34, 6, 25, 0, 33, 6, 9, 0, 31, 7, 0, 0, 42, 0, 218,
+ 0, 41, 0, 211, 0, 40, 0, 203, 0, 39, 0, 194, 0, 39, 0, 182, 0, 37, 0, 166, 0, 36, 0, 146, 0, 33, 0, 122,
+ 0, 30, 0, 99, 0, 30, 0, 85, 0, 30, 0, 74, 0, 30, 0, 63, 0, 29, 0, 54, 0, 29, 0, 45, 0, 30, 0, 35,
+ 0, 30, 0, 19, 0, 30, 0, 0, 0, 3, 190, 235, 0, 2, 191, 232, 0, 1, 192, 223, 0, 1, 191, 208, 0, 2, 191, 190,
+ 0, 2, 193, 172, 0, 2, 194, 151, 0, 2, 196, 130, 0, 2, 198, 107, 0, 4, 200, 81, 0, 4, 203, 58, 0, 4, 205, 39,
+ 0, 5, 207, 23, 0, 5, 208, 11, 0, 5, 210, 3, 0, 5, 210, 1, 0, 25, 199, 0, 0, 2, 185, 235, 0, 0, 179, 219,
+ 0, 0, 178, 206, 0, 0, 178, 190, 0, 0, 180, 173, 0, 0, 181, 156, 0, 0, 183, 140, 0, 0, 187, 118, 0, 0, 189, 96,
+ 0, 1, 190, 71, 0, 2, 190, 50, 0, 3, 191, 33, 0, 4, 191, 18, 0, 5, 192, 8, 0, 7, 191, 2, 0, 14, 188, 1,
+ 0, 20, 190, 0, 0, 2, 178, 235, 0, 1, 172, 218, 0, 0, 167, 196, 0, 0, 168, 182, 0, 0, 169, 165, 0, 0, 171, 151,
+ 0, 0, 172, 135, 0, 0, 177, 115, 0, 0, 180, 95, 0, 1, 180, 72, 0, 1, 180, 50, 0, 3, 179, 33, 0, 3, 179, 18,
+ 0, 4, 179, 7, 0, 7, 178, 2, 0, 14, 174, 1, 0, 17, 180, 0, 0, 3, 168, 235, 0, 1, 163, 219, 0, 0, 160, 197,
+ 0, 0, 159, 177, 0, 0, 159, 161, 0, 0, 161, 147, 0, 0, 162, 131, 0, 0, 165, 115, 0, 0, 169, 97, 0, 1, 169, 74,
+ 0, 1, 168, 51, 0, 1, 168, 32, 0, 2, 167, 17, 0, 3, 167, 6, 0, 7, 165, 2, 0, 16, 161, 1, 0, 15, 170, 0,
+ 0, 3, 155, 234, 0, 2, 153, 220, 0, 1, 151, 200, 0, 0, 150, 181, 0, 0, 150, 160, 0, 0, 150, 145, 0, 0, 152, 130,
+ 0, 0, 153, 115, 0, 0, 156, 97, 0, 1, 157, 76, 0, 1, 156, 54, 0, 1, 155, 33, 0, 1, 155, 16, 0, 2, 155, 4,
+ 0, 8, 152, 2, 0, 17, 148, 1, 0, 13, 157, 0, 0, 4, 140, 232, 0, 3, 139, 220, 0, 2, 139, 202, 0, 1, 139, 186,
+ 0, 0, 139, 165, 0, 1, 137, 151, 0, 1, 138, 136, 0, 1, 139, 121, 0, 1, 142, 98, 0, 1, 142, 79, 0, 1, 142, 58,
+ 0, 1, 142, 37, 0, 1, 143, 16, 0, 3, 144, 3, 0, 10, 139, 1, 0, 19, 135, 1, 0, 13, 144, 0, 0, 5, 123, 229,
+ 0, 4, 123, 218, 0, 3, 125, 203, 0, 2, 126, 188, 0, 1, 127, 170, 0, 2, 126, 153, 0, 2, 126, 134, 0, 1, 126, 118,
+ 0, 1, 128, 97, 0, 1, 129, 82, 0, 1, 129, 62, 0, 1, 130, 41, 0, 2, 130, 20, 0, 4, 131, 3, 0, 12, 125, 1,
+ 0, 21, 120, 1, 0, 13, 128, 0, 0, 6, 105, 227, 0, 5, 106, 210, 0, 5, 107, 197, 0, 5, 110, 185, 0, 4, 112, 170,
+ 0, 4, 113, 153, 0, 5, 114, 135, 0, 4, 112, 117, 0, 4, 112, 100, 0, 3, 113, 88, 0, 2, 115, 66, 0, 2, 116, 46,
+ 0, 3, 115, 24, 0, 5, 116, 6, 0, 13, 110, 1, 0, 21, 104, 1, 0, 14, 110, 0, 0, 7, 88, 225, 0, 7, 91, 204,
+ 0, 7, 93, 190, 0, 7, 95, 178, 0, 7, 97, 166, 0, 7, 98, 152, 0, 7, 99, 135, 0, 8, 99, 117, 0, 10, 95, 97,
+ 0, 6, 99, 85, 0, 4, 101, 67, 0, 4, 102, 50, 0, 4, 102, 29, 0, 6, 102, 9, 0, 14, 97, 2, 0, 22, 91, 1,
+ 0, 15, 92, 0, 0, 8, 73, 224, 0, 7, 78, 206, 0, 8, 79, 194, 0, 8, 82, 179, 0, 8, 85, 164, 0, 9, 85, 150,
+ 0, 10, 85, 134, 0, 11, 86, 116, 0, 13, 84, 97, 0, 10, 84, 84, 0, 8, 86, 71, 0, 6, 88, 57, 0, 6, 89, 34,
+ 0, 7, 88, 13, 0, 13, 84, 2, 0, 21, 79, 1, 0, 15, 80, 0, 0, 8, 58, 221, 0, 9, 62, 211, 0, 9, 64, 201,
+ 0, 8, 69, 182, 0, 9, 72, 162, 0, 11, 71, 145, 0, 12, 71, 129, 0, 14, 71, 112, 0, 15, 72, 97, 0, 15, 71, 82,
+ 0, 14, 70, 70, 0, 10, 74, 56, 0, 8, 76, 36, 0, 8, 76, 17, 0, 12, 73, 3, 0, 21, 67, 1, 0, 16, 68, 0,
+ 0, 9, 44, 219, 0, 11, 46, 211, 0, 11, 48, 202, 0, 8, 53, 187, 0, 8, 58, 169, 0, 9, 59, 151, 0, 11, 60, 135,
+ 0, 11, 60, 117, 0, 16, 59, 97, 0, 16, 60, 83, 0, 16, 58, 70, 0, 13, 59, 56, 0, 12, 61, 41, 0, 9, 62, 27,
+ 0, 12, 60, 6, 0, 20, 55, 1, 0, 16, 55, 0, 0, 9, 31, 218, 0, 11, 31, 210, 0, 12, 33, 203, 0, 11, 36, 193,
+ 0, 12, 39, 181, 0, 12, 42, 164, 0, 12, 44, 145, 0, 11, 47, 121, 0, 15, 46, 98, 0, 16, 45, 83, 0, 18, 46, 71,
+ 0, 18, 44, 55, 0, 20, 42, 41, 0, 16, 44, 30, 0, 16, 45, 14, 0, 17, 44, 2, 0, 15, 44, 0, 0, 9, 19, 217,
+ 0, 11, 19, 209, 0, 12, 20, 202, 0, 11, 22, 194, 0, 11, 24, 183, 0, 12, 26, 169, 0, 12, 29, 151, 0, 9, 33, 130,
+ 0, 12, 33, 107, 0, 13, 33, 88, 0, 16, 33, 73, 0, 17, 32, 58, 0, 20, 30, 42, 0, 16, 31, 30, 0, 13, 34, 18,
+ 0, 13, 34, 4, 0, 15, 32, 0, 0, 9, 11, 217, 0, 12, 10, 206, 0, 12, 10, 197, 0, 12, 11, 189, 0, 12, 12, 178,
+ 0, 12, 14, 166, 0, 12, 15, 151, 0, 12, 16, 137, 0, 13, 17, 119, 0, 11, 21, 99, 0, 13, 20, 81, 0, 14, 19, 63,
+ 0, 15, 19, 44, 0, 16, 18, 31, 0, 14, 21, 13, 0, 13, 21, 2, 0, 15, 19, 0, 0, 9, 5, 217, 0, 13, 3, 208,
+ 0, 13, 3, 200, 0, 13, 3, 192, 0, 13, 3, 183, 0, 13, 4, 170, 0, 13, 4, 156, 0, 14, 4, 141, 0, 13, 5, 124,
+ 0, 9, 9, 106, 0, 11, 8, 88, 0, 13, 7, 71, 0, 14, 7, 50, 0, 14, 7, 37, 0, 17, 5, 25, 0, 13, 7, 12,
+ 0, 16, 6, 0, 0, 21, 0, 217, 0, 20, 0, 211, 0, 18, 0, 204, 0, 18, 0, 197, 0, 17, 0, 187, 0, 17, 0, 174,
+ 0, 16, 0, 158, 0, 15, 0, 139, 0, 14, 0, 117, 0, 15, 0, 98, 0, 16, 0, 84, 0, 16, 0, 70, 0, 16, 0, 55,
+ 0, 16, 0, 44, 0, 17, 0, 33, 0, 15, 0, 17, 0, 15, 0, 0, 0, 0, 189, 235, 0, 0, 189, 229, 0, 0, 188, 219,
+ 0, 0, 188, 206, 0, 0, 188, 190, 0, 0, 190, 174, 0, 0, 191, 157, 0, 0, 193, 138, 0, 0, 195, 116, 0, 0, 198, 92,
+ 0, 0, 201, 68, 0, 0, 203, 48, 0, 0, 205, 31, 0, 0, 207, 17, 0, 0, 209, 7, 0, 0, 210, 1, 0, 0, 210, 0,
+ 0, 0, 183, 234, 0, 0, 179, 211, 0, 0, 178, 201, 0, 0, 179, 190, 0, 0, 180, 178, 0, 0, 181, 164, 0, 0, 182, 150,
+ 0, 0, 185, 131, 0, 0, 189, 112, 0, 0, 190, 88, 0, 0, 192, 65, 0, 0, 193, 48, 0, 0, 195, 34, 0, 0, 196, 21,
+ 0, 0, 197, 14, 0, 0, 198, 9, 0, 0, 199, 0, 0, 0, 176, 233, 0, 0, 173, 212, 0, 0, 169, 191, 0, 0, 169, 180,
+ 0, 0, 171, 167, 0, 0, 172, 156, 0, 0, 173, 143, 0, 0, 176, 127, 0, 0, 181, 108, 0, 0, 182, 86, 0, 0, 183, 64,
+ 0, 0, 184, 49, 0, 0, 184, 36, 0, 0, 185, 25, 0, 0, 186, 19, 0, 0, 186, 14, 0, 0, 187, 0, 0, 0, 166, 232,
+ 0, 0, 164, 213, 0, 0, 162, 193, 0, 0, 160, 173, 0, 0, 161, 160, 0, 0, 162, 149, 0, 0, 163, 138, 0, 0, 165, 123,
+ 0, 0, 170, 106, 0, 0, 172, 87, 0, 0, 172, 67, 0, 0, 172, 50, 0, 0, 172, 36, 0, 0, 173, 26, 0, 0, 173, 20,
+ 0, 0, 173, 15, 0, 0, 174, 0, 0, 0, 155, 231, 0, 0, 154, 213, 0, 0, 153, 195, 0, 0, 152, 177, 0, 0, 151, 156,
+ 0, 0, 152, 144, 0, 0, 153, 132, 0, 0, 154, 119, 0, 0, 157, 106, 0, 0, 159, 90, 0, 0, 159, 71, 0, 0, 159, 52,
+ 0, 0, 159, 35, 0, 0, 159, 25, 0, 0, 159, 19, 0, 0, 159, 15, 0, 0, 160, 0, 0, 0, 140, 229, 0, 0, 142, 214,
+ 0, 0, 142, 198, 0, 0, 142, 182, 0, 0, 141, 162, 0, 0, 140, 140, 0, 0, 141, 128, 0, 0, 141, 117, 0, 0, 142, 105,
+ 0, 0, 143, 92, 0, 0, 144, 75, 0, 0, 143, 56, 0, 0, 144, 37, 0, 0, 145, 24, 0, 0, 145, 17, 0, 0, 145, 14,
+ 0, 0, 147, 0, 0, 0, 124, 227, 0, 0, 126, 215, 0, 0, 128, 201, 0, 0, 129, 186, 0, 0, 130, 167, 0, 0, 129, 147,
+ 0, 0, 127, 125, 0, 0, 127, 113, 0, 0, 127, 102, 0, 0, 128, 92, 0, 0, 128, 77, 0, 0, 129, 60, 0, 0, 130, 41,
+ 0, 0, 130, 25, 0, 0, 130, 16, 0, 0, 130, 12, 0, 0, 131, 0, 0, 0, 106, 225, 0, 0, 109, 215, 0, 0, 111, 202,
+ 0, 0, 114, 189, 0, 0, 116, 170, 0, 0, 117, 152, 0, 0, 116, 130, 0, 0, 112, 111, 0, 0, 112, 100, 0, 0, 112, 90,
+ 0, 0, 112, 77, 0, 0, 113, 61, 0, 0, 113, 44, 0, 0, 113, 27, 0, 0, 113, 15, 0, 0, 112, 9, 0, 0, 113, 0,
+ 0, 0, 90, 223, 0, 0, 93, 213, 0, 0, 95, 202, 0, 0, 98, 190, 0, 0, 102, 172, 0, 0, 103, 155, 0, 0, 103, 135,
+ 0, 0, 100, 115, 0, 0, 96, 94, 0, 0, 96, 85, 0, 0, 97, 74, 0, 0, 97, 61, 0, 0, 97, 46, 0, 0, 97, 29,
+ 0, 0, 96, 16, 0, 0, 95, 8, 0, 0, 96, 0, 0, 0, 76, 222, 0, 0, 79, 212, 0, 0, 80, 202, 0, 0, 85, 189,
+ 0, 0, 89, 170, 0, 0, 89, 152, 0, 0, 87, 131, 0, 0, 84, 112, 0, 0, 85, 94, 0, 0, 85, 81, 0, 0, 84, 72,
+ 0, 0, 85, 62, 0, 0, 86, 46, 0, 0, 86, 31, 0, 0, 85, 17, 0, 0, 84, 8, 0, 0, 83, 0, 0, 0, 61, 220,
+ 0, 0, 64, 211, 0, 0, 66, 202, 0, 0, 71, 190, 0, 0, 75, 170, 0, 0, 76, 147, 0, 0, 70, 118, 0, 0, 69, 103,
+ 0, 0, 72, 94, 0, 0, 70, 78, 0, 0, 69, 65, 0, 0, 73, 59, 0, 0, 75, 46, 0, 0, 75, 32, 0, 0, 74, 18,
+ 0, 0, 72, 8, 0, 0, 71, 0, 0, 0, 46, 219, 0, 0, 48, 211, 0, 0, 50, 202, 0, 0, 54, 192, 0, 0, 60, 175,
+ 0, 0, 64, 152, 0, 0, 64, 132, 0, 0, 63, 110, 0, 0, 61, 93, 0, 0, 59, 78, 0, 0, 58, 65, 0, 0, 58, 55,
+ 0, 0, 61, 46, 0, 0, 62, 35, 0, 0, 62, 19, 0, 0, 60, 8, 0, 0, 59, 0, 0, 0, 33, 217, 0, 0, 34, 211,
+ 0, 0, 35, 204, 0, 0, 38, 195, 0, 0, 43, 181, 0, 0, 48, 162, 0, 0, 50, 141, 0, 0, 51, 117, 0, 0, 51, 96,
+ 0, 0, 49, 79, 0, 0, 47, 66, 0, 0, 44, 51, 0, 0, 42, 40, 0, 0, 48, 33, 0, 0, 49, 20, 0, 0, 49, 9,
+ 0, 0, 48, 0, 0, 0, 21, 217, 0, 0, 21, 211, 0, 0, 22, 205, 0, 0, 24, 196, 0, 0, 28, 185, 0, 0, 31, 170,
+ 0, 0, 34, 149, 0, 0, 37, 125, 0, 0, 38, 103, 0, 0, 38, 85, 0, 0, 35, 67, 0, 0, 34, 54, 0, 0, 31, 40,
+ 0, 0, 32, 31, 0, 0, 36, 24, 0, 0, 37, 14, 0, 0, 36, 0, 0, 0, 11, 216, 0, 0, 11, 211, 0, 0, 12, 204,
+ 0, 0, 13, 195, 0, 0, 16, 185, 0, 0, 18, 171, 0, 0, 21, 155, 0, 0, 23, 137, 0, 0, 24, 115, 0, 0, 26, 90,
+ 0, 0, 25, 74, 0, 0, 24, 58, 0, 0, 23, 43, 0, 0, 21, 32, 0, 0, 23, 25, 0, 0, 25, 15, 0, 0, 24, 0,
+ 0, 0, 4, 216, 0, 0, 5, 205, 0, 0, 7, 194, 0, 0, 8, 184, 0, 0, 9, 174, 0, 0, 11, 160, 0, 0, 12, 148,
+ 0, 0, 12, 136, 0, 0, 13, 116, 0, 0, 15, 90, 0, 0, 15, 76, 0, 0, 14, 64, 0, 0, 14, 50, 0, 0, 13, 37,
+ 0, 0, 12, 23, 0, 0, 12, 13, 0, 0, 12, 0, 0, 0, 0, 216, 0, 0, 0, 209, 0, 0, 0, 203, 0, 0, 0, 196,
+ 0, 0, 0, 186, 0, 0, 0, 174, 0, 0, 0, 160, 0, 0, 0, 146, 0, 0, 0, 130, 0, 0, 0, 112, 0, 0, 0, 93,
+ 0, 0, 0, 75, 0, 0, 0, 58, 0, 0, 0, 43, 0, 0, 0, 29, 0, 0, 0, 15, 0, 0, 0, 0
+};
+
+// Photo Best (Archie)
+unsigned char ucMapDJ4100_KCMY_Photo_BestA_12x12x1[] =
+{
+ 0, 228, 219, 240, 0, 229, 215, 224, 0, 229, 211, 207, 0, 234, 204, 190, 0, 239, 194, 171, 0, 244, 186, 154, 0, 246, 177, 135,
+ 0, 248, 165, 110, 0, 249, 153, 81, 0, 251, 141, 50, 0, 250, 131, 23, 0, 246, 126, 7, 0, 241, 126, 2, 0, 237, 128, 2,
+ 0, 232, 129, 2, 0, 228, 130, 1, 0, 224, 130, 0, 0, 221, 200, 240, 0, 234, 197, 218, 0, 237, 201, 198, 0, 237, 194, 177,
+ 0, 242, 188, 158, 0, 245, 182, 143, 0, 246, 173, 126, 0, 248, 163, 105, 0, 249, 152, 77, 0, 251, 141, 49, 0, 251, 130, 22,
+ 0, 247, 124, 4, 0, 238, 126, 0, 0, 231, 128, 0, 0, 225, 130, 0, 0, 221, 131, 0, 0, 218, 130, 0, 0, 214, 180, 239,
+ 0, 225, 178, 227, 0, 241, 175, 197, 0, 241, 178, 173, 0, 245, 173, 146, 0, 246, 169, 124, 0, 247, 163, 104, 0, 247, 155, 82,
+ 0, 248, 146, 58, 0, 249, 137, 34, 0, 247, 129, 13, 0, 240, 127, 3, 0, 230, 130, 2, 0, 224, 131, 1, 0, 218, 131, 1,
+ 0, 215, 130, 0, 0, 214, 128, 0, 0, 214, 157, 239, 0, 219, 155, 225, 0, 228, 156, 203, 0, 239, 155, 175, 0, 243, 154, 146,
+ 0, 241, 152, 119, 0, 240, 149, 95, 0, 236, 146, 75, 0, 233, 143, 53, 0, 231, 139, 33, 0, 227, 136, 18, 0, 221, 134, 10,
+ 0, 216, 133, 7, 0, 214, 131, 4, 0, 212, 129, 2, 0, 211, 127, 1, 0, 210, 124, 0, 0, 212, 132, 241, 0, 216, 129, 232,
+ 0, 219, 133, 209, 0, 224, 136, 184, 0, 233, 133, 153, 0, 231, 134, 125, 0, 229, 135, 99, 0, 222, 136, 79, 0, 218, 136, 60,
+ 0, 216, 134, 42, 0, 214, 132, 27, 0, 211, 130, 18, 0, 209, 128, 12, 0, 208, 126, 8, 0, 206, 124, 5, 0, 205, 121, 2,
+ 0, 204, 118, 0, 0, 211, 108, 243, 0, 216, 104, 237, 0, 216, 108, 216, 0, 218, 115, 193, 0, 221, 116, 165, 0, 224, 115, 132,
+ 0, 220, 119, 108, 0, 216, 121, 84, 0, 214, 122, 63, 0, 211, 122, 46, 0, 208, 122, 33, 0, 206, 120, 24, 0, 204, 119, 17,
+ 0, 202, 118, 12, 0, 200, 116, 7, 0, 199, 113, 3, 0, 197, 111, 0, 0, 211, 85, 245, 0, 216, 80, 241, 0, 216, 84, 224,
+ 0, 215, 91, 200, 0, 213, 99, 175, 0, 214, 101, 146, 0, 215, 100, 114, 0, 214, 102, 91, 0, 212, 103, 68, 0, 208, 106, 49,
+ 0, 205, 108, 35, 0, 201, 109, 26, 0, 199, 110, 21, 0, 197, 109, 15, 0, 194, 107, 10, 0, 192, 104, 5, 0, 190, 102, 0,
+ 0, 210, 62, 246, 0, 214, 57, 243, 0, 214, 62, 228, 0, 212, 70, 207, 0, 210, 78, 183, 0, 210, 82, 157, 0, 210, 84, 128,
+ 0, 210, 85, 97, 0, 210, 84, 75, 0, 207, 86, 54, 0, 202, 91, 39, 0, 198, 95, 28, 0, 194, 98, 21, 0, 191, 99, 16,
+ 0, 188, 97, 11, 0, 185, 95, 5, 0, 182, 92, 0, 0, 207, 39, 247, 0, 209, 37, 244, 0, 208, 42, 230, 0, 207, 51, 210,
+ 0, 205, 58, 188, 0, 204, 65, 165, 0, 204, 68, 140, 0, 205, 68, 110, 0, 206, 67, 78, 0, 204, 68, 59, 0, 200, 73, 43,
+ 0, 196, 79, 31, 0, 191, 84, 23, 0, 187, 86, 16, 0, 183, 86, 11, 0, 178, 85, 5, 0, 174, 82, 0, 0, 203, 21, 245,
+ 0, 204, 21, 240, 0, 203, 25, 228, 0, 201, 33, 210, 0, 200, 38, 191, 0, 198, 46, 170, 0, 198, 51, 148, 0, 198, 53, 123,
+ 0, 199, 52, 93, 0, 202, 49, 61, 0, 198, 55, 46, 0, 194, 62, 35, 0, 189, 68, 26, 0, 184, 73, 18, 0, 179, 75, 11,
+ 0, 173, 74, 5, 0, 167, 72, 0, 0, 198, 12, 240, 0, 197, 12, 234, 0, 196, 15, 224, 0, 194, 22, 209, 0, 194, 26, 192,
+ 0, 192, 31, 174, 0, 191, 36, 154, 0, 191, 39, 133, 0, 191, 40, 107, 0, 194, 39, 78, 0, 198, 37, 48, 0, 192, 45, 37,
+ 0, 188, 52, 28, 0, 183, 58, 20, 0, 177, 61, 13, 0, 170, 63, 6, 0, 163, 63, 0, 0, 195, 9, 237, 0, 194, 9, 232,
+ 0, 193, 11, 223, 0, 191, 16, 210, 0, 189, 18, 195, 0, 188, 21, 178, 0, 186, 25, 159, 0, 185, 28, 141, 0, 185, 31, 119,
+ 0, 187, 32, 94, 0, 189, 30, 67, 0, 193, 29, 39, 0, 188, 37, 30, 0, 182, 42, 21, 0, 176, 47, 13, 0, 169, 50, 6,
+ 0, 162, 53, 0, 0, 192, 7, 235, 0, 191, 7, 231, 0, 190, 9, 224, 0, 189, 12, 212, 0, 187, 14, 199, 0, 185, 15, 183,
+ 0, 183, 18, 166, 0, 182, 20, 148, 0, 181, 23, 130, 0, 181, 25, 108, 0, 183, 24, 83, 0, 185, 23, 57, 0, 187, 23, 31,
+ 0, 183, 29, 22, 0, 177, 33, 14, 0, 170, 37, 7, 0, 162, 40, 0, 0, 189, 5, 233, 0, 189, 5, 229, 0, 188, 6, 223,
+ 0, 186, 8, 214, 0, 185, 10, 202, 0, 183, 11, 188, 0, 182, 12, 172, 0, 180, 14, 155, 0, 178, 16, 138, 0, 178, 18, 118,
+ 0, 178, 18, 96, 0, 178, 17, 73, 0, 180, 17, 48, 0, 181, 17, 23, 0, 176, 21, 15, 0, 170, 24, 7, 0, 163, 27, 0,
+ 0, 187, 3, 230, 0, 186, 4, 228, 0, 185, 4, 223, 0, 184, 5, 215, 0, 183, 7, 204, 0, 181, 7, 192, 0, 180, 8, 177,
+ 0, 178, 9, 162, 0, 176, 10, 145, 0, 175, 11, 127, 0, 175, 12, 107, 0, 174, 11, 86, 0, 174, 11, 63, 0, 175, 11, 39,
+ 0, 175, 11, 15, 0, 169, 13, 7, 0, 163, 15, 0, 0, 184, 2, 228, 0, 184, 2, 226, 0, 183, 2, 222, 0, 182, 2, 215,
+ 0, 181, 4, 206, 0, 180, 4, 195, 0, 178, 4, 182, 0, 177, 4, 167, 0, 175, 5, 152, 0, 174, 5, 135, 0, 173, 6, 116,
+ 0, 172, 6, 97, 0, 171, 5, 76, 0, 170, 5, 54, 0, 169, 5, 31, 0, 168, 5, 6, 0, 162, 6, 0, 0, 181, 0, 226,
+ 0, 181, 0, 224, 0, 180, 0, 220, 0, 180, 0, 215, 0, 179, 0, 207, 0, 178, 0, 197, 0, 177, 0, 186, 0, 175, 0, 172,
+ 0, 174, 0, 158, 0, 173, 0, 142, 0, 172, 0, 125, 0, 170, 0, 107, 0, 169, 0, 88, 0, 167, 0, 68, 0, 166, 0, 46,
+ 0, 164, 0, 23, 0, 162, 0, 0, 0, 215, 215, 240, 0, 214, 226, 217, 0, 218, 218, 196, 0, 218, 217, 188, 0, 222, 209, 164,
+ 0, 223, 199, 124, 0, 225, 187, 96, 0, 227, 176, 74, 0, 231, 167, 49, 0, 233, 158, 27, 0, 230, 149, 11, 0, 224, 145, 3,
+ 0, 223, 142, 1, 0, 223, 140, 1, 0, 221, 137, 0, 0, 221, 135, 0, 0, 220, 134, 0, 0, 210, 198, 243, 0, 217, 205, 226,
+ 0, 225, 198, 189, 0, 234, 186, 161, 0, 239, 180, 142, 0, 241, 174, 123, 0, 243, 166, 103, 0, 246, 156, 79, 0, 247, 145, 56,
+ 0, 248, 135, 33, 0, 247, 126, 13, 0, 242, 121, 1, 0, 233, 125, 0, 0, 226, 127, 0, 0, 220, 128, 0, 0, 217, 129, 0,
+ 0, 215, 130, 0, 0, 208, 179, 241, 0, 217, 174, 236, 0, 224, 178, 203, 0, 229, 176, 168, 0, 238, 171, 135, 0, 245, 163, 110,
+ 0, 249, 154, 89, 0, 250, 145, 68, 0, 251, 136, 46, 0, 252, 126, 25, 0, 250, 119, 8, 0, 242, 119, 1, 0, 230, 124, 0,
+ 0, 220, 126, 0, 0, 215, 127, 0, 0, 213, 126, 0, 0, 211, 128, 0, 0, 207, 155, 242, 0, 213, 151, 236, 0, 217, 153, 211,
+ 0, 221, 160, 183, 0, 224, 157, 150, 0, 234, 150, 113, 0, 241, 143, 80, 0, 245, 135, 50, 0, 249, 126, 24, 0, 247, 119, 7,
+ 0, 239, 121, 2, 0, 227, 124, 1, 0, 218, 126, 1, 0, 213, 126, 0, 0, 211, 124, 0, 0, 209, 124, 0, 0, 207, 125, 0,
+ 0, 205, 132, 244, 0, 211, 127, 240, 0, 215, 126, 221, 0, 215, 136, 192, 0, 217, 139, 163, 0, 223, 136, 128, 0, 228, 133, 94,
+ 0, 232, 127, 63, 0, 235, 120, 34, 0, 236, 113, 10, 0, 226, 118, 3, 0, 216, 122, 1, 0, 211, 122, 1, 0, 208, 120, 1,
+ 0, 206, 119, 0, 0, 204, 118, 0, 0, 202, 119, 0, 0, 206, 108, 245, 0, 210, 104, 243, 0, 215, 101, 231, 0, 215, 109, 202,
+ 0, 215, 115, 174, 0, 216, 118, 143, 0, 216, 118, 112, 0, 217, 117, 81, 0, 218, 115, 52, 0, 220, 111, 27, 0, 218, 109, 9,
+ 0, 212, 111, 3, 0, 208, 111, 1, 0, 204, 111, 1, 0, 201, 111, 1, 0, 199, 110, 0, 0, 196, 111, 0, 0, 206, 86, 246,
+ 0, 209, 83, 245, 0, 214, 80, 235, 0, 213, 86, 211, 0, 212, 94, 184, 0, 212, 98, 155, 0, 212, 99, 126, 0, 213, 99, 97,
+ 0, 213, 98, 68, 0, 212, 98, 41, 0, 211, 98, 20, 0, 208, 98, 6, 0, 204, 99, 2, 0, 200, 100, 1, 0, 196, 101, 1,
+ 0, 193, 101, 0, 0, 189, 103, 0, 0, 205, 64, 247, 0, 207, 61, 246, 0, 211, 58, 239, 0, 209, 67, 217, 0, 208, 74, 192,
+ 0, 208, 79, 165, 0, 208, 81, 137, 0, 209, 81, 109, 0, 210, 81, 82, 0, 209, 80, 55, 0, 207, 83, 32, 0, 204, 85, 14,
+ 0, 200, 86, 4, 0, 195, 89, 1, 0, 190, 90, 1, 0, 187, 91, 0, 0, 182, 93, 0, 0, 203, 41, 247, 0, 204, 39, 247,
+ 0, 207, 36, 242, 0, 206, 44, 221, 0, 205, 52, 198, 0, 204, 60, 173, 0, 204, 63, 148, 0, 204, 64, 120, 0, 205, 64, 92,
+ 0, 205, 64, 67, 0, 203, 65, 44, 0, 200, 69, 25, 0, 196, 74, 10, 0, 190, 77, 3, 0, 185, 79, 1, 0, 179, 80, 0,
+ 0, 172, 82, 0, 0, 199, 21, 246, 0, 201, 20, 246, 0, 203, 18, 241, 0, 202, 25, 223, 0, 201, 32, 201, 0, 199, 39, 179,
+ 0, 199, 44, 156, 0, 199, 47, 131, 0, 200, 47, 103, 0, 201, 46, 76, 0, 201, 48, 54, 0, 198, 52, 34, 0, 193, 57, 18,
+ 0, 188, 63, 8, 0, 181, 68, 2, 0, 173, 70, 0, 0, 164, 71, 0, 0, 194, 12, 240, 0, 197, 5, 243, 0, 198, 6, 237,
+ 0, 197, 11, 222, 0, 195, 19, 203, 0, 194, 24, 183, 0, 193, 28, 162, 0, 193, 32, 140, 0, 193, 34, 114, 0, 194, 33, 88,
+ 0, 196, 31, 62, 0, 196, 35, 43, 0, 192, 40, 27, 0, 186, 47, 14, 0, 179, 53, 5, 0, 170, 58, 1, 0, 159, 63, 0,
+ 0, 191, 9, 237, 0, 191, 2, 235, 0, 191, 1, 230, 0, 191, 3, 219, 0, 190, 8, 203, 0, 188, 12, 186, 0, 187, 16, 166,
+ 0, 187, 19, 146, 0, 186, 22, 124, 0, 187, 23, 99, 0, 188, 22, 74, 0, 190, 21, 50, 0, 190, 26, 34, 0, 186, 31, 20,
+ 0, 179, 37, 9, 0, 170, 44, 3, 0, 157, 51, 0, 0, 189, 7, 235, 0, 185, 1, 228, 0, 185, 1, 223, 0, 185, 1, 214,
+ 0, 185, 2, 203, 0, 184, 5, 188, 0, 182, 7, 170, 0, 181, 10, 151, 0, 181, 12, 132, 0, 180, 14, 110, 0, 181, 14, 86,
+ 0, 182, 14, 62, 0, 184, 14, 39, 0, 183, 19, 25, 0, 179, 23, 14, 0, 171, 29, 5, 0, 158, 38, 0, 0, 187, 5, 233,
+ 0, 181, 1, 223, 0, 180, 1, 218, 0, 180, 1, 210, 0, 179, 1, 201, 0, 179, 1, 188, 0, 178, 2, 173, 0, 177, 4, 156,
+ 0, 176, 5, 138, 0, 175, 7, 118, 0, 175, 8, 97, 0, 175, 7, 74, 0, 176, 7, 51, 0, 176, 8, 29, 0, 174, 12, 17,
+ 0, 169, 16, 7, 0, 159, 25, 0, 0, 184, 3, 231, 0, 177, 1, 220, 0, 176, 0, 214, 0, 176, 0, 208, 0, 175, 1, 199,
+ 0, 174, 1, 188, 0, 174, 1, 175, 0, 173, 1, 159, 0, 172, 1, 143, 0, 170, 2, 125, 0, 170, 3, 105, 0, 169, 3, 85,
+ 0, 169, 3, 63, 0, 169, 3, 41, 0, 168, 3, 20, 0, 165, 7, 9, 0, 157, 14, 0, 0, 182, 2, 229, 0, 175, 0, 218,
+ 0, 173, 0, 212, 0, 173, 0, 207, 0, 172, 0, 199, 0, 171, 0, 189, 0, 170, 0, 176, 0, 169, 0, 162, 0, 168, 0, 147,
+ 0, 166, 1, 130, 0, 165, 1, 112, 0, 164, 1, 94, 0, 163, 1, 75, 0, 162, 1, 53, 0, 161, 1, 32, 0, 160, 1, 13,
+ 0, 155, 5, 0, 0, 180, 0, 226, 0, 175, 0, 215, 0, 175, 0, 213, 0, 174, 0, 208, 0, 173, 0, 200, 0, 172, 0, 191,
+ 0, 171, 0, 179, 0, 169, 0, 166, 0, 168, 0, 151, 0, 166, 0, 136, 0, 165, 0, 119, 0, 163, 0, 102, 0, 161, 0, 84,
+ 0, 160, 0, 65, 0, 158, 0, 43, 0, 157, 0, 22, 0, 155, 0, 0, 0, 201, 212, 240, 0, 198, 225, 232, 0, 199, 233, 194,
+ 0, 203, 226, 177, 0, 205, 218, 148, 0, 203, 211, 106, 0, 204, 200, 82, 0, 206, 188, 63, 0, 210, 178, 44, 0, 213, 169, 26,
+ 0, 213, 159, 13, 0, 212, 153, 5, 0, 213, 149, 3, 0, 214, 146, 3, 0, 215, 143, 2, 0, 215, 140, 1, 0, 215, 138, 0,
+ 0, 197, 194, 246, 0, 204, 219, 238, 0, 199, 218, 185, 0, 206, 207, 152, 0, 209, 198, 118, 0, 213, 187, 86, 0, 220, 177, 53,
+ 0, 228, 168, 22, 0, 230, 158, 11, 0, 227, 150, 5, 0, 222, 145, 2, 0, 218, 141, 0, 0, 215, 139, 0, 0, 213, 136, 0,
+ 0, 212, 134, 0, 0, 212, 133, 0, 0, 211, 134, 0, 0, 192, 176, 247, 0, 196, 177, 237, 0, 197, 181, 202, 0, 203, 176, 166,
+ 0, 213, 170, 132, 0, 227, 163, 99, 0, 237, 151, 66, 0, 243, 141, 39, 0, 245, 131, 20, 0, 244, 123, 5, 0, 237, 123, 1,
+ 0, 228, 126, 0, 0, 218, 128, 0, 0, 213, 127, 0, 0, 211, 126, 0, 0, 209, 125, 0, 0, 208, 127, 0, 0, 195, 154, 246,
+ 0, 199, 152, 241, 0, 200, 156, 213, 0, 202, 162, 184, 0, 205, 160, 150, 0, 212, 156, 115, 0, 218, 149, 81, 0, 228, 140, 49,
+ 0, 238, 129, 20, 0, 238, 122, 2, 0, 229, 124, 0, 0, 219, 125, 0, 0, 213, 125, 0, 0, 210, 123, 0, 0, 207, 122, 0,
+ 0, 205, 122, 0, 0, 204, 124, 0, 0, 196, 133, 247, 0, 201, 129, 244, 0, 202, 131, 225, 0, 202, 138, 194, 0, 203, 144, 166,
+ 0, 207, 142, 133, 0, 211, 138, 97, 0, 214, 134, 66, 0, 218, 129, 36, 0, 219, 124, 10, 0, 215, 123, 1, 0, 210, 123, 0,
+ 0, 207, 121, 0, 0, 204, 120, 0, 0, 202, 118, 0, 0, 200, 118, 0, 0, 199, 120, 0, 0, 198, 110, 247, 0, 202, 107, 246,
+ 0, 204, 106, 234, 0, 203, 113, 204, 0, 202, 121, 175, 0, 204, 123, 146, 0, 207, 121, 114, 0, 209, 120, 82, 0, 211, 118, 52,
+ 0, 212, 114, 25, 0, 212, 111, 4, 0, 207, 111, 0, 0, 203, 112, 0, 0, 200, 111, 0, 0, 197, 111, 0, 0, 195, 110, 0,
+ 0, 193, 112, 0, 0, 198, 88, 247, 0, 201, 85, 246, 0, 205, 84, 237, 0, 204, 90, 213, 0, 203, 96, 186, 0, 204, 100, 157,
+ 0, 205, 101, 128, 0, 206, 101, 98, 0, 207, 100, 68, 0, 207, 100, 41, 0, 207, 99, 17, 0, 205, 97, 2, 0, 200, 99, 0,
+ 0, 196, 100, 0, 0, 193, 101, 0, 0, 190, 101, 0, 0, 187, 103, 0, 0, 198, 66, 248, 0, 201, 64, 247, 0, 204, 61, 240,
+ 0, 203, 69, 219, 0, 202, 75, 194, 0, 202, 79, 167, 0, 203, 81, 139, 0, 204, 82, 111, 0, 204, 82, 84, 0, 203, 82, 56,
+ 0, 202, 84, 32, 0, 200, 84, 11, 0, 196, 85, 1, 0, 191, 88, 0, 0, 187, 90, 0, 0, 184, 91, 0, 0, 179, 93, 0,
+ 0, 197, 44, 248, 0, 199, 40, 248, 0, 202, 38, 243, 0, 202, 45, 223, 0, 201, 53, 200, 0, 199, 60, 175, 0, 199, 64, 150,
+ 0, 200, 65, 122, 0, 200, 65, 96, 0, 200, 65, 70, 0, 199, 66, 45, 0, 197, 68, 24, 0, 193, 72, 7, 0, 187, 75, 1,
+ 0, 181, 78, 0, 0, 176, 79, 0, 0, 169, 82, 0, 0, 193, 24, 247, 0, 196, 21, 247, 0, 199, 20, 242, 0, 199, 26, 226,
+ 0, 197, 34, 204, 0, 196, 39, 182, 0, 196, 45, 159, 0, 196, 47, 134, 0, 196, 48, 106, 0, 197, 48, 81, 0, 198, 47, 56,
+ 0, 195, 51, 35, 0, 191, 55, 16, 0, 185, 61, 4, 0, 177, 66, 0, 0, 168, 69, 0, 0, 160, 70, 0, 0, 189, 13, 241,
+ 0, 193, 5, 245, 0, 195, 7, 239, 0, 194, 11, 225, 0, 193, 20, 206, 0, 192, 24, 186, 0, 191, 28, 165, 0, 191, 32, 142,
+ 0, 191, 34, 117, 0, 192, 34, 91, 0, 193, 32, 66, 0, 194, 33, 45, 0, 191, 37, 26, 0, 184, 44, 11, 0, 176, 50, 2,
+ 0, 165, 56, 0, 0, 155, 61, 0, 0, 187, 10, 238, 0, 187, 1, 236, 0, 188, 0, 231, 0, 189, 2, 222, 0, 188, 7, 206,
+ 0, 187, 11, 188, 0, 186, 15, 169, 0, 185, 18, 148, 0, 185, 20, 126, 0, 185, 21, 101, 0, 186, 21, 77, 0, 187, 20, 53,
+ 0, 188, 23, 35, 0, 185, 28, 19, 0, 177, 34, 7, 0, 166, 41, 1, 0, 152, 50, 0, 0, 185, 7, 236, 0, 181, 1, 228,
+ 0, 180, 0, 220, 0, 181, 0, 212, 0, 181, 1, 202, 0, 181, 2, 188, 0, 180, 5, 171, 0, 180, 7, 153, 0, 179, 9, 133,
+ 0, 178, 11, 111, 0, 178, 11, 87, 0, 179, 11, 64, 0, 180, 11, 41, 0, 179, 15, 25, 0, 175, 19, 13, 0, 168, 25, 3,
+ 0, 152, 37, 0, 0, 183, 5, 233, 0, 177, 0, 222, 0, 174, 0, 212, 0, 174, 0, 205, 0, 174, 0, 197, 0, 174, 0, 185,
+ 0, 174, 0, 171, 0, 173, 1, 155, 0, 173, 2, 137, 0, 172, 3, 117, 0, 171, 4, 96, 0, 171, 4, 74, 0, 172, 4, 52,
+ 0, 172, 4, 30, 0, 169, 8, 17, 0, 165, 12, 6, 0, 153, 24, 0, 0, 182, 3, 231, 0, 173, 0, 218, 0, 169, 0, 206,
+ 0, 168, 0, 200, 0, 168, 0, 192, 0, 167, 0, 182, 0, 167, 0, 169, 0, 166, 0, 155, 0, 165, 0, 138, 0, 164, 0, 121,
+ 0, 163, 0, 103, 0, 163, 0, 84, 0, 163, 0, 63, 0, 162, 0, 41, 0, 161, 1, 22, 0, 159, 4, 9, 0, 151, 13, 0,
+ 0, 180, 2, 229, 0, 171, 0, 215, 0, 165, 0, 202, 0, 164, 0, 195, 0, 163, 0, 188, 0, 162, 0, 179, 0, 161, 0, 167,
+ 0, 160, 0, 154, 0, 159, 0, 139, 0, 157, 0, 124, 0, 156, 0, 107, 0, 155, 0, 90, 0, 154, 0, 72, 0, 154, 0, 52,
+ 0, 153, 0, 32, 0, 151, 1, 14, 0, 148, 5, 0, 0, 177, 0, 227, 0, 173, 0, 216, 0, 167, 0, 203, 0, 167, 0, 198,
+ 0, 166, 0, 192, 0, 165, 0, 183, 0, 164, 0, 172, 0, 163, 0, 159, 0, 161, 0, 145, 0, 159, 0, 130, 0, 157, 0, 113,
+ 0, 155, 0, 97, 0, 154, 0, 80, 0, 152, 0, 61, 0, 151, 0, 40, 0, 149, 0, 20, 0, 147, 0, 0, 0, 185, 211, 239,
+ 0, 178, 224, 219, 0, 177, 239, 188, 0, 178, 240, 155, 0, 178, 229, 123, 0, 180, 219, 91, 0, 185, 207, 72, 0, 189, 196, 55,
+ 0, 194, 185, 40, 0, 197, 176, 25, 0, 199, 167, 13, 0, 201, 160, 7, 0, 204, 155, 5, 0, 207, 151, 4, 0, 208, 147, 2,
+ 0, 210, 144, 1, 0, 210, 141, 0, 0, 184, 193, 245, 0, 181, 207, 230, 0, 178, 216, 196, 0, 178, 222, 156, 0, 183, 212, 112,
+ 0, 189, 202, 78, 0, 193, 194, 44, 0, 198, 184, 14, 0, 202, 173, 4, 0, 204, 164, 2, 0, 204, 156, 1, 0, 204, 150, 1,
+ 0, 204, 145, 0, 0, 205, 141, 0, 0, 206, 139, 0, 0, 207, 137, 0, 0, 207, 137, 0, 0, 180, 177, 247, 0, 182, 183, 235,
+ 0, 181, 184, 204, 0, 180, 191, 171, 0, 187, 187, 130, 0, 193, 181, 93, 0, 198, 172, 58, 0, 203, 164, 24, 0, 206, 153, 5,
+ 0, 208, 145, 0, 0, 207, 142, 0, 0, 206, 140, 0, 0, 204, 137, 0, 0, 203, 134, 0, 0, 203, 132, 0, 0, 203, 130, 0,
+ 0, 203, 132, 0, 0, 176, 158, 252, 0, 179, 159, 240, 0, 183, 163, 214, 0, 182, 162, 184, 0, 188, 160, 148, 0, 195, 156, 114,
+ 0, 202, 150, 81, 0, 208, 144, 47, 0, 213, 136, 19, 0, 216, 130, 2, 0, 212, 128, 0, 0, 209, 127, 0, 0, 206, 125, 0,
+ 0, 204, 123, 0, 0, 201, 121, 0, 0, 200, 120, 0, 0, 200, 122, 0, 0, 180, 135, 250, 0, 186, 134, 246, 0, 187, 139, 223,
+ 0, 187, 142, 194, 0, 189, 146, 165, 0, 193, 145, 133, 0, 198, 141, 98, 0, 202, 136, 65, 0, 206, 132, 35, 0, 209, 126, 10,
+ 0, 208, 123, 1, 0, 205, 121, 0, 0, 203, 119, 0, 0, 200, 118, 0, 0, 197, 116, 0, 0, 196, 116, 0, 0, 194, 119, 0,
+ 0, 186, 112, 249, 0, 190, 110, 248, 0, 191, 112, 233, 0, 190, 120, 205, 0, 190, 125, 176, 0, 191, 129, 148, 0, 196, 128, 117,
+ 0, 199, 124, 82, 0, 202, 121, 52, 0, 203, 118, 24, 0, 203, 114, 3, 0, 200, 114, 0, 0, 196, 113, 0, 0, 194, 112, 0,
+ 0, 191, 111, 0, 0, 190, 111, 0, 0, 189, 113, 0, 0, 187, 91, 249, 0, 190, 88, 248, 0, 193, 88, 239, 0, 193, 95, 214,
+ 0, 192, 100, 187, 0, 191, 106, 158, 0, 193, 108, 130, 0, 196, 106, 99, 0, 198, 105, 68, 0, 199, 104, 39, 0, 200, 101, 15,
+ 0, 198, 100, 2, 0, 194, 101, 0, 0, 190, 102, 0, 0, 187, 102, 0, 0, 185, 102, 0, 0, 182, 105, 0, 0, 188, 70, 249,
+ 0, 192, 66, 248, 0, 195, 65, 240, 0, 194, 72, 219, 0, 193, 77, 195, 0, 193, 82, 168, 0, 194, 85, 141, 0, 195, 86, 113,
+ 0, 195, 86, 85, 0, 195, 87, 56, 0, 195, 87, 30, 0, 194, 85, 8, 0, 190, 87, 1, 0, 186, 89, 0, 0, 182, 90, 0,
+ 0, 179, 91, 0, 0, 175, 94, 0, 0, 188, 48, 249, 0, 191, 44, 248, 0, 194, 43, 242, 0, 194, 50, 223, 0, 193, 57, 200,
+ 0, 191, 62, 176, 0, 192, 66, 150, 0, 193, 68, 124, 0, 193, 68, 98, 0, 193, 68, 71, 0, 192, 69, 45, 0, 190, 71, 21,
+ 0, 187, 73, 4, 0, 181, 75, 0, 0, 175, 78, 0, 0, 170, 79, 0, 0, 165, 82, 0, 0, 186, 27, 247, 0, 190, 23, 247,
+ 0, 192, 24, 241, 0, 192, 31, 225, 0, 192, 38, 205, 0, 191, 42, 183, 0, 190, 47, 159, 0, 190, 50, 134, 0, 190, 51, 108,
+ 0, 191, 50, 83, 0, 191, 49, 57, 0, 189, 53, 34, 0, 185, 56, 14, 0, 179, 61, 2, 0, 170, 66, 0, 0, 162, 68, 0,
+ 0, 155, 70, 0, 0, 182, 15, 242, 0, 188, 8, 245, 0, 189, 10, 238, 0, 189, 14, 225, 0, 188, 22, 207, 0, 188, 25, 187,
+ 0, 187, 30, 166, 0, 187, 33, 144, 0, 186, 35, 119, 0, 187, 35, 93, 0, 188, 34, 68, 0, 189, 34, 45, 0, 186, 38, 25,
+ 0, 179, 43, 9, 0, 170, 49, 1, 0, 159, 56, 0, 0, 149, 61, 0, 0, 181, 11, 239, 0, 183, 1, 237, 0, 184, 1, 232,
+ 0, 185, 3, 222, 0, 184, 9, 207, 0, 183, 12, 190, 0, 183, 15, 171, 0, 182, 18, 150, 0, 182, 20, 128, 0, 182, 21, 103,
+ 0, 182, 21, 79, 0, 183, 20, 55, 0, 184, 23, 35, 0, 180, 26, 18, 0, 172, 32, 5, 0, 159, 40, 0, 0, 146, 49, 0,
+ 0, 180, 8, 236, 0, 177, 1, 228, 0, 176, 0, 220, 0, 177, 0, 212, 0, 177, 1, 202, 0, 177, 2, 189, 0, 177, 5, 172,
+ 0, 176, 7, 154, 0, 176, 8, 134, 0, 175, 10, 111, 0, 175, 10, 88, 0, 175, 10, 65, 0, 176, 10, 42, 0, 174, 13, 25,
+ 0, 171, 17, 11, 0, 162, 23, 2, 0, 146, 36, 0, 0, 179, 6, 234, 0, 173, 0, 222, 0, 170, 0, 212, 0, 168, 0, 201,
+ 0, 167, 0, 193, 0, 168, 0, 182, 0, 168, 0, 169, 0, 168, 1, 154, 0, 168, 1, 137, 0, 168, 1, 117, 0, 167, 2, 96,
+ 0, 167, 2, 74, 0, 167, 2, 52, 0, 166, 2, 31, 0, 164, 5, 16, 0, 160, 10, 5, 0, 146, 23, 0, 0, 178, 4, 232,
+ 0, 169, 0, 217, 0, 164, 0, 205, 0, 160, 0, 192, 0, 159, 0, 184, 0, 159, 0, 174, 0, 159, 0, 163, 0, 158, 0, 149,
+ 0, 157, 0, 134, 0, 156, 0, 117, 0, 156, 0, 100, 0, 155, 0, 82, 0, 155, 0, 62, 0, 155, 0, 41, 0, 153, 0, 23,
+ 0, 152, 3, 9, 0, 144, 12, 0, 0, 176, 2, 229, 0, 167, 0, 215, 0, 160, 0, 200, 0, 155, 0, 186, 0, 154, 0, 178,
+ 0, 153, 0, 170, 0, 152, 0, 159, 0, 151, 0, 147, 0, 150, 0, 133, 0, 148, 0, 118, 0, 147, 0, 102, 0, 146, 0, 87,
+ 0, 145, 0, 70, 0, 145, 0, 50, 0, 143, 0, 32, 0, 142, 1, 15, 0, 140, 5, 0, 0, 175, 0, 227, 0, 170, 0, 216,
+ 0, 164, 0, 203, 0, 159, 0, 189, 0, 159, 0, 183, 0, 158, 0, 175, 0, 157, 0, 164, 0, 155, 0, 152, 0, 154, 0, 139,
+ 0, 151, 0, 124, 0, 149, 0, 108, 0, 147, 0, 93, 0, 146, 0, 76, 0, 144, 0, 58, 0, 143, 0, 38, 0, 140, 0, 19,
+ 0, 138, 0, 0, 0, 164, 213, 238, 0, 155, 229, 214, 0, 151, 244, 184, 0, 150, 252, 144, 0, 148, 242, 111, 0, 151, 230, 79,
+ 0, 161, 215, 59, 0, 169, 202, 44, 0, 177, 191, 34, 0, 182, 182, 21, 0, 185, 174, 11, 0, 189, 167, 7, 0, 193, 161, 6,
+ 0, 197, 157, 5, 0, 200, 153, 3, 0, 202, 149, 2, 0, 203, 145, 0, 0, 164, 195, 245, 0, 159, 203, 228, 0, 159, 213, 199,
+ 0, 157, 226, 163, 0, 157, 222, 112, 0, 163, 212, 75, 0, 170, 202, 41, 0, 175, 192, 11, 0, 181, 180, 3, 0, 186, 171, 2,
+ 0, 189, 163, 1, 0, 191, 156, 1, 0, 193, 151, 1, 0, 195, 147, 0, 0, 197, 143, 0, 0, 199, 141, 0, 0, 200, 141, 0,
+ 0, 165, 180, 244, 0, 165, 182, 238, 0, 168, 185, 204, 0, 163, 192, 177, 0, 163, 195, 133, 0, 168, 192, 94, 0, 173, 187, 56,
+ 0, 178, 180, 20, 0, 182, 170, 2, 0, 186, 162, 0, 0, 188, 156, 0, 0, 190, 150, 0, 0, 191, 144, 0, 0, 192, 140, 0,
+ 0, 193, 137, 0, 0, 195, 135, 0, 0, 195, 136, 0, 0, 162, 162, 248, 0, 164, 163, 236, 0, 168, 167, 210, 0, 165, 166, 185,
+ 0, 166, 172, 150, 0, 170, 170, 112, 0, 176, 165, 76, 0, 182, 160, 41, 0, 185, 153, 10, 0, 188, 146, 1, 0, 190, 141, 0,
+ 0, 191, 136, 0, 0, 191, 132, 0, 0, 190, 129, 0, 0, 190, 126, 0, 0, 190, 125, 0, 0, 191, 127, 0, 0, 157, 139, 254,
+ 0, 165, 138, 244, 0, 167, 144, 218, 0, 167, 145, 194, 0, 168, 147, 168, 0, 174, 146, 132, 0, 182, 141, 96, 0, 189, 136, 63,
+ 0, 195, 132, 31, 0, 198, 125, 7, 0, 198, 121, 0, 0, 197, 119, 0, 0, 194, 118, 0, 0, 192, 116, 0, 0, 190, 115, 0,
+ 0, 189, 114, 0, 0, 189, 116, 0, 0, 166, 116, 252, 0, 170, 114, 249, 0, 172, 119, 230, 0, 172, 126, 203, 0, 174, 129, 177,
+ 0, 177, 133, 148, 0, 181, 132, 117, 0, 186, 127, 82, 0, 190, 125, 49, 0, 193, 120, 20, 0, 195, 115, 3, 0, 193, 114, 0,
+ 0, 190, 112, 0, 0, 188, 111, 0, 0, 186, 110, 0, 0, 184, 109, 0, 0, 183, 112, 0, 0, 170, 95, 251, 0, 176, 91, 250,
+ 0, 177, 93, 238, 0, 178, 102, 212, 0, 178, 106, 188, 0, 178, 111, 160, 0, 179, 115, 132, 0, 184, 114, 102, 0, 187, 111, 68,
+ 0, 189, 108, 38, 0, 191, 104, 13, 0, 188, 103, 1, 0, 185, 104, 0, 0, 182, 104, 0, 0, 178, 103, 0, 0, 176, 102, 0,
+ 0, 175, 105, 0, 0, 173, 74, 250, 0, 178, 70, 249, 0, 181, 71, 241, 0, 181, 78, 219, 0, 180, 83, 196, 0, 180, 86, 169,
+ 0, 179, 91, 142, 0, 181, 94, 115, 0, 183, 91, 84, 0, 186, 91, 55, 0, 187, 90, 28, 0, 186, 88, 6, 0, 182, 89, 0,
+ 0, 177, 91, 0, 0, 173, 91, 0, 0, 169, 91, 0, 0, 167, 94, 0, 0, 175, 52, 249, 0, 180, 48, 248, 0, 183, 49, 241,
+ 0, 183, 56, 223, 0, 181, 63, 201, 0, 181, 65, 177, 0, 182, 69, 151, 0, 182, 72, 124, 0, 183, 72, 98, 0, 183, 72, 71,
+ 0, 183, 73, 43, 0, 182, 74, 19, 0, 179, 74, 3, 0, 173, 76, 0, 0, 167, 78, 0, 0, 162, 79, 0, 0, 158, 83, 0,
+ 0, 175, 32, 248, 0, 180, 27, 247, 0, 182, 30, 240, 0, 183, 37, 224, 0, 183, 43, 204, 0, 182, 45, 183, 0, 181, 50, 160,
+ 0, 182, 53, 134, 0, 182, 55, 109, 0, 182, 54, 83, 0, 182, 55, 58, 0, 180, 56, 33, 0, 176, 58, 13, 0, 170, 62, 2,
+ 0, 161, 66, 0, 0, 155, 67, 0, 0, 149, 70, 0, 0, 173, 18, 243, 0, 179, 12, 244, 0, 180, 15, 237, 0, 181, 19, 224,
+ 0, 181, 25, 207, 0, 181, 29, 188, 0, 180, 33, 167, 0, 180, 36, 144, 0, 180, 38, 119, 0, 180, 38, 94, 0, 181, 37, 70,
+ 0, 181, 38, 46, 0, 177, 40, 25, 0, 171, 44, 7, 0, 161, 50, 1, 0, 151, 55, 0, 0, 143, 59, 0, 0, 173, 12, 239,
+ 0, 176, 3, 238, 0, 177, 3, 232, 0, 177, 6, 222, 0, 177, 11, 206, 0, 177, 14, 190, 0, 177, 18, 171, 0, 176, 20, 151,
+ 0, 176, 22, 128, 0, 175, 23, 104, 0, 175, 22, 79, 0, 176, 22, 56, 0, 177, 24, 35, 0, 173, 27, 17, 0, 164, 31, 3,
+ 0, 151, 40, 0, 0, 140, 48, 0, 0, 174, 9, 237, 0, 172, 1, 229, 0, 171, 0, 222, 0, 171, 0, 214, 0, 172, 1, 203,
+ 0, 172, 3, 189, 0, 171, 6, 172, 0, 171, 8, 154, 0, 170, 9, 134, 0, 169, 10, 112, 0, 169, 11, 89, 0, 169, 10, 66,
+ 0, 170, 10, 43, 0, 169, 12, 25, 0, 165, 16, 10, 0, 154, 23, 1, 0, 139, 35, 0, 0, 174, 6, 234, 0, 168, 1, 222,
+ 0, 165, 0, 212, 0, 162, 0, 201, 0, 161, 0, 190, 0, 161, 0, 179, 0, 161, 0, 167, 0, 162, 1, 152, 0, 162, 1, 135,
+ 0, 162, 1, 116, 0, 161, 1, 96, 0, 161, 1, 74, 0, 161, 1, 52, 0, 160, 1, 31, 0, 158, 4, 16, 0, 154, 9, 4,
+ 0, 139, 22, 0, 0, 173, 4, 232, 0, 165, 0, 217, 0, 160, 0, 204, 0, 155, 0, 191, 0, 151, 0, 177, 0, 151, 0, 168,
+ 0, 150, 0, 157, 0, 150, 0, 145, 0, 150, 0, 131, 0, 149, 0, 115, 0, 148, 0, 98, 0, 147, 0, 80, 0, 147, 0, 61,
+ 0, 147, 0, 41, 0, 145, 0, 23, 0, 144, 2, 10, 0, 136, 12, 0, 0, 172, 2, 230, 0, 163, 0, 214, 0, 156, 0, 200,
+ 0, 150, 0, 184, 0, 145, 0, 170, 0, 144, 0, 161, 0, 143, 0, 151, 0, 142, 0, 140, 0, 141, 0, 127, 0, 139, 0, 113,
+ 0, 138, 0, 99, 0, 137, 0, 83, 0, 136, 0, 67, 0, 135, 0, 49, 0, 134, 0, 32, 0, 133, 1, 16, 0, 132, 5, 0,
+ 0, 171, 0, 228, 0, 166, 0, 216, 0, 160, 0, 203, 0, 155, 0, 189, 0, 149, 0, 174, 0, 149, 0, 166, 0, 148, 0, 157,
+ 0, 147, 0, 145, 0, 145, 0, 132, 0, 143, 0, 119, 0, 141, 0, 104, 0, 138, 0, 89, 0, 137, 0, 73, 0, 135, 0, 55,
+ 0, 134, 0, 35, 0, 131, 0, 17, 0, 129, 0, 0, 0, 137, 213, 240, 0, 125, 230, 212, 0, 121, 243, 183, 0, 121, 251, 140,
+ 0, 121, 245, 101, 0, 121, 239, 70, 0, 130, 224, 44, 0, 143, 210, 27, 0, 156, 198, 23, 0, 165, 189, 15, 0, 171, 180, 9,
+ 0, 177, 173, 6, 0, 181, 168, 6, 0, 185, 163, 5, 0, 189, 158, 4, 0, 192, 155, 2, 0, 194, 151, 0, 0, 143, 193, 246,
+ 0, 135, 202, 231, 0, 133, 214, 201, 0, 133, 224, 168, 0, 133, 224, 118, 0, 135, 218, 77, 0, 141, 210, 37, 0, 151, 199, 7,
+ 0, 161, 187, 2, 0, 168, 177, 1, 0, 173, 169, 1, 0, 176, 162, 1, 0, 180, 156, 1, 0, 183, 152, 1, 0, 186, 149, 0,
+ 0, 188, 146, 0, 0, 190, 146, 0, 0, 148, 179, 245, 0, 142, 183, 242, 0, 147, 188, 205, 0, 144, 193, 182, 0, 142, 199, 142,
+ 0, 143, 197, 101, 0, 149, 194, 57, 0, 156, 188, 20, 0, 163, 178, 2, 0, 168, 169, 0, 0, 172, 161, 0, 0, 175, 155, 0,
+ 0, 177, 149, 0, 0, 180, 145, 0, 0, 182, 142, 0, 0, 184, 139, 0, 0, 186, 140, 0, 0, 146, 160, 246, 0, 145, 164, 237,
+ 0, 150, 170, 213, 0, 149, 170, 187, 0, 146, 177, 159, 0, 144, 179, 123, 0, 152, 175, 79, 0, 159, 171, 42, 0, 163, 165, 9,
+ 0, 167, 158, 0, 0, 170, 151, 0, 0, 173, 146, 0, 0, 175, 141, 0, 0, 177, 137, 0, 0, 178, 133, 0, 0, 179, 131, 0,
+ 0, 181, 133, 0, 0, 143, 141, 244, 0, 144, 141, 237, 0, 149, 147, 214, 0, 151, 150, 190, 0, 150, 154, 169, 0, 149, 157, 137,
+ 0, 156, 152, 95, 0, 161, 150, 60, 0, 166, 146, 26, 0, 170, 140, 4, 0, 173, 135, 0, 0, 174, 131, 0, 0, 175, 127, 0,
+ 0, 175, 124, 0, 0, 175, 121, 0, 0, 175, 119, 0, 0, 177, 122, 0, 0, 139, 120, 254, 0, 143, 120, 249, 0, 146, 125, 225,
+ 0, 148, 130, 198, 0, 150, 132, 176, 0, 153, 132, 152, 0, 159, 130, 114, 0, 166, 126, 79, 0, 175, 124, 47, 0, 181, 118, 18,
+ 0, 183, 113, 2, 0, 182, 111, 0, 0, 181, 109, 0, 0, 179, 108, 0, 0, 176, 106, 0, 0, 174, 106, 0, 0, 175, 107, 0,
+ 0, 148, 98, 253, 0, 153, 96, 252, 0, 155, 99, 240, 0, 156, 108, 210, 0, 157, 112, 186, 0, 159, 114, 161, 0, 161, 117, 132,
+ 0, 165, 115, 100, 0, 170, 113, 67, 0, 175, 111, 35, 0, 178, 108, 9, 0, 177, 105, 0, 0, 174, 103, 0, 0, 172, 102, 0,
+ 0, 168, 100, 0, 0, 166, 99, 0, 0, 166, 102, 0, 0, 154, 78, 252, 0, 159, 75, 251, 0, 162, 76, 242, 0, 163, 83, 220,
+ 0, 164, 89, 196, 0, 163, 91, 171, 0, 162, 94, 142, 0, 163, 99, 116, 0, 167, 97, 86, 0, 172, 96, 54, 0, 173, 94, 25,
+ 0, 174, 91, 4, 0, 169, 91, 0, 0, 164, 91, 0, 0, 160, 91, 0, 0, 158, 90, 0, 0, 157, 93, 0, 0, 158, 57, 250,
+ 0, 164, 53, 249, 0, 166, 55, 242, 0, 167, 62, 223, 0, 167, 68, 202, 0, 168, 70, 179, 0, 168, 72, 152, 0, 166, 77, 125,
+ 0, 166, 76, 98, 0, 169, 75, 69, 0, 169, 77, 42, 0, 170, 76, 17, 0, 168, 75, 2, 0, 161, 77, 0, 0, 155, 78, 0,
+ 0, 152, 79, 0, 0, 150, 81, 0, 0, 161, 37, 249, 0, 167, 33, 248, 0, 169, 36, 239, 0, 169, 43, 224, 0, 170, 48, 203,
+ 0, 169, 51, 183, 0, 170, 54, 160, 0, 170, 57, 135, 0, 170, 58, 109, 0, 169, 57, 82, 0, 169, 59, 56, 0, 167, 60, 31,
+ 0, 164, 61, 11, 0, 159, 64, 1, 0, 151, 65, 0, 0, 146, 66, 0, 0, 143, 69, 0, 0, 161, 21, 245, 0, 168, 16, 244,
+ 0, 169, 20, 236, 0, 170, 25, 223, 0, 170, 31, 206, 0, 170, 33, 187, 0, 169, 36, 165, 0, 169, 39, 143, 0, 169, 41, 118,
+ 0, 168, 41, 93, 0, 168, 41, 69, 0, 167, 43, 45, 0, 164, 43, 23, 0, 159, 46, 5, 0, 150, 51, 0, 0, 142, 55, 0,
+ 0, 137, 58, 0, 0, 163, 14, 241, 0, 167, 6, 238, 0, 168, 7, 232, 0, 168, 10, 221, 0, 168, 15, 206, 0, 168, 18, 189,
+ 0, 167, 21, 170, 0, 167, 23, 150, 0, 166, 25, 127, 0, 166, 25, 103, 0, 165, 25, 79, 0, 165, 25, 56, 0, 166, 27, 35,
+ 0, 162, 29, 16, 0, 154, 33, 2, 0, 141, 40, 0, 0, 133, 46, 0, 0, 165, 10, 238, 0, 165, 1, 231, 0, 164, 1, 224,
+ 0, 164, 1, 215, 0, 164, 3, 203, 0, 163, 4, 188, 0, 163, 7, 171, 0, 163, 9, 153, 0, 163, 10, 133, 0, 162, 11, 111,
+ 0, 161, 11, 88, 0, 161, 11, 66, 0, 162, 11, 44, 0, 161, 13, 25, 0, 155, 16, 9, 0, 144, 23, 1, 0, 132, 34, 0,
+ 0, 166, 7, 235, 0, 162, 1, 222, 0, 159, 0, 213, 0, 157, 0, 203, 0, 155, 0, 190, 0, 154, 0, 177, 0, 154, 0, 165,
+ 0, 154, 1, 150, 0, 155, 1, 133, 0, 154, 1, 115, 0, 154, 1, 95, 0, 154, 1, 74, 0, 153, 1, 52, 0, 153, 1, 32,
+ 0, 150, 4, 15, 0, 145, 8, 3, 0, 132, 22, 0, 0, 167, 4, 233, 0, 160, 0, 217, 0, 154, 0, 205, 0, 149, 0, 191,
+ 0, 145, 0, 177, 0, 143, 0, 164, 0, 142, 0, 153, 0, 142, 0, 141, 0, 142, 0, 128, 0, 141, 0, 113, 0, 140, 0, 96,
+ 0, 140, 0, 79, 0, 139, 0, 60, 0, 139, 0, 41, 0, 137, 0, 24, 0, 136, 2, 10, 0, 129, 11, 0, 0, 167, 2, 231,
+ 0, 158, 0, 214, 0, 151, 0, 199, 0, 145, 0, 184, 0, 139, 0, 168, 0, 134, 0, 153, 0, 133, 0, 143, 0, 133, 0, 133,
+ 0, 132, 0, 122, 0, 130, 0, 109, 0, 129, 0, 95, 0, 128, 0, 81, 0, 127, 0, 65, 0, 126, 0, 47, 0, 125, 0, 31,
+ 0, 123, 1, 16, 0, 123, 5, 0, 0, 166, 0, 228, 0, 161, 0, 217, 0, 155, 0, 204, 0, 150, 0, 189, 0, 145, 0, 174,
+ 0, 139, 0, 157, 0, 138, 0, 149, 0, 137, 0, 138, 0, 136, 0, 126, 0, 133, 0, 114, 0, 131, 0, 101, 0, 129, 0, 87,
+ 0, 127, 0, 71, 0, 126, 0, 53, 0, 125, 0, 33, 0, 122, 0, 16, 0, 119, 0, 0, 0, 108, 214, 242, 0, 97, 232, 212,
+ 0, 93, 243, 185, 0, 93, 248, 148, 0, 97, 246, 104, 0, 98, 238, 66, 0, 98, 233, 35, 0, 111, 218, 11, 0, 130, 204, 10,
+ 0, 144, 195, 8, 0, 155, 187, 6, 0, 163, 180, 4, 0, 169, 175, 4, 0, 173, 169, 4, 0, 177, 164, 4, 0, 180, 160, 2,
+ 0, 183, 156, 0, 0, 121, 193, 248, 0, 113, 203, 235, 0, 111, 211, 205, 0, 110, 218, 177, 0, 112, 220, 128, 0, 112, 218, 85,
+ 0, 114, 214, 42, 0, 123, 205, 6, 0, 138, 193, 1, 0, 149, 183, 1, 0, 157, 174, 1, 0, 162, 167, 0, 0, 166, 161, 0,
+ 0, 170, 157, 0, 0, 173, 153, 0, 0, 176, 151, 0, 0, 179, 151, 0, 0, 127, 177, 251, 0, 123, 183, 244, 0, 126, 190, 206,
+ 0, 122, 194, 186, 0, 121, 198, 148, 0, 121, 200, 110, 0, 123, 197, 66, 0, 130, 193, 24, 0, 141, 185, 2, 0, 150, 175, 0,
+ 0, 156, 167, 0, 0, 161, 159, 0, 0, 164, 153, 0, 0, 166, 149, 0, 0, 169, 145, 0, 0, 171, 143, 0, 0, 174, 145, 0,
+ 0, 128, 158, 251, 0, 128, 158, 250, 0, 130, 169, 213, 0, 131, 173, 188, 0, 130, 177, 164, 0, 126, 183, 132, 0, 129, 180, 85,
+ 0, 135, 176, 45, 0, 142, 172, 12, 0, 149, 165, 1, 0, 155, 157, 0, 0, 158, 150, 0, 0, 160, 144, 0, 0, 162, 140, 0,
+ 0, 165, 136, 0, 0, 167, 134, 0, 0, 169, 136, 0, 0, 130, 145, 233, 0, 131, 144, 231, 0, 132, 149, 210, 0, 136, 151, 189,
+ 0, 138, 156, 168, 0, 133, 161, 144, 0, 134, 161, 101, 0, 138, 158, 63, 0, 143, 155, 27, 0, 148, 151, 3, 0, 153, 144, 0,
+ 0, 155, 139, 0, 0, 157, 134, 0, 0, 159, 130, 0, 0, 161, 126, 0, 0, 162, 124, 0, 0, 164, 127, 0, 0, 124, 125, 244,
+ 0, 127, 124, 237, 0, 130, 128, 217, 0, 134, 132, 193, 0, 137, 135, 172, 0, 135, 138, 153, 0, 136, 140, 116, 0, 140, 137, 79,
+ 0, 146, 135, 45, 0, 150, 131, 14, 0, 154, 127, 1, 0, 155, 123, 0, 0, 157, 119, 0, 0, 157, 115, 0, 0, 157, 113, 0,
+ 0, 157, 111, 0, 0, 159, 114, 0, 0, 124, 102, 254, 0, 129, 101, 250, 0, 131, 104, 235, 0, 134, 111, 207, 0, 136, 115, 180,
+ 0, 137, 117, 159, 0, 138, 113, 132, 0, 143, 113, 96, 0, 150, 112, 65, 0, 156, 109, 33, 0, 161, 106, 6, 0, 162, 103, 0,
+ 0, 161, 101, 0, 0, 159, 99, 0, 0, 157, 97, 0, 0, 155, 96, 0, 0, 158, 96, 0, 0, 132, 81, 253, 0, 136, 79, 252,
+ 0, 138, 81, 242, 0, 141, 88, 219, 0, 141, 94, 193, 0, 142, 97, 169, 0, 144, 95, 141, 0, 145, 97, 112, 0, 148, 97, 83,
+ 0, 152, 97, 52, 0, 155, 95, 23, 0, 157, 90, 3, 0, 155, 90, 0, 0, 152, 90, 0, 0, 149, 89, 0, 0, 148, 88, 0,
+ 0, 148, 90, 0, 0, 138, 61, 251, 0, 144, 58, 251, 0, 146, 60, 243, 0, 148, 68, 223, 0, 149, 74, 202, 0, 151, 76, 179,
+ 0, 151, 75, 153, 0, 149, 80, 125, 0, 148, 81, 98, 0, 150, 81, 70, 0, 152, 80, 40, 0, 154, 77, 16, 0, 152, 76, 2,
+ 0, 147, 77, 0, 0, 144, 76, 0, 0, 142, 77, 0, 0, 142, 80, 0, 0, 143, 41, 250, 0, 149, 38, 249, 0, 151, 41, 239,
+ 0, 152, 48, 223, 0, 154, 54, 203, 0, 156, 57, 184, 0, 156, 59, 162, 0, 155, 61, 137, 0, 153, 64, 109, 0, 152, 64, 83,
+ 0, 153, 63, 56, 0, 152, 62, 30, 0, 151, 63, 9, 0, 146, 64, 1, 0, 141, 63, 0, 0, 137, 63, 0, 0, 136, 65, 0,
+ 0, 146, 24, 248, 0, 152, 21, 246, 0, 154, 25, 236, 0, 156, 31, 221, 0, 156, 36, 204, 0, 156, 39, 186, 0, 156, 42, 166,
+ 0, 156, 43, 143, 0, 155, 45, 119, 0, 154, 45, 93, 0, 154, 45, 69, 0, 153, 46, 44, 0, 151, 46, 20, 0, 147, 49, 4,
+ 0, 139, 52, 0, 0, 133, 53, 0, 0, 130, 55, 0, 0, 149, 15, 243, 0, 154, 9, 240, 0, 156, 11, 232, 0, 156, 16, 220,
+ 0, 156, 20, 205, 0, 156, 22, 188, 0, 155, 24, 169, 0, 155, 26, 148, 0, 154, 28, 126, 0, 154, 28, 102, 0, 152, 28, 79,
+ 0, 152, 29, 55, 0, 151, 31, 33, 0, 148, 31, 14, 0, 141, 35, 2, 0, 131, 39, 0, 0, 125, 45, 0, 0, 153, 10, 240,
+ 0, 155, 2, 233, 0, 155, 2, 225, 0, 155, 4, 216, 0, 154, 7, 203, 0, 154, 8, 187, 0, 153, 9, 170, 0, 153, 11, 151,
+ 0, 152, 12, 131, 0, 151, 13, 109, 0, 150, 13, 87, 0, 150, 14, 66, 0, 149, 14, 43, 0, 148, 17, 24, 0, 143, 19, 7,
+ 0, 134, 24, 1, 0, 122, 34, 0, 0, 156, 7, 237, 0, 154, 1, 224, 0, 152, 0, 215, 0, 150, 0, 205, 0, 148, 1, 193,
+ 0, 147, 1, 179, 0, 146, 1, 165, 0, 146, 1, 149, 0, 146, 1, 132, 0, 145, 2, 113, 0, 145, 2, 93, 0, 144, 3, 73,
+ 0, 144, 3, 52, 0, 143, 3, 31, 0, 141, 6, 14, 0, 136, 9, 2, 0, 122, 22, 0, 0, 158, 5, 234, 0, 153, 0, 217,
+ 0, 148, 0, 205, 0, 143, 0, 192, 0, 139, 0, 178, 0, 136, 0, 164, 0, 134, 0, 150, 0, 133, 0, 138, 0, 133, 0, 125,
+ 0, 132, 0, 110, 0, 132, 0, 94, 0, 131, 0, 77, 0, 131, 0, 59, 0, 130, 0, 40, 0, 129, 0, 23, 0, 127, 3, 9,
+ 0, 120, 12, 0, 0, 160, 2, 232, 0, 152, 0, 214, 0, 145, 0, 199, 0, 139, 0, 184, 0, 133, 0, 168, 0, 128, 0, 151,
+ 0, 124, 0, 137, 0, 123, 0, 127, 0, 122, 0, 116, 0, 121, 0, 105, 0, 120, 0, 92, 0, 119, 0, 78, 0, 118, 0, 63,
+ 0, 117, 0, 46, 0, 116, 0, 30, 0, 114, 1, 15, 0, 114, 5, 0, 0, 160, 0, 229, 0, 155, 0, 218, 0, 149, 0, 205,
+ 0, 144, 0, 190, 0, 139, 0, 174, 0, 133, 0, 157, 0, 127, 0, 139, 0, 126, 0, 130, 0, 125, 0, 119, 0, 123, 0, 109,
+ 0, 121, 0, 97, 0, 119, 0, 84, 0, 117, 0, 69, 0, 116, 0, 51, 0, 114, 0, 32, 0, 112, 0, 15, 0, 109, 0, 0,
+ 0, 79, 219, 242, 0, 70, 235, 210, 0, 67, 244, 183, 0, 67, 248, 151, 0, 69, 245, 109, 0, 74, 242, 66, 0, 77, 234, 32,
+ 0, 81, 227, 9, 0, 101, 212, 2, 0, 120, 201, 2, 0, 135, 194, 2, 0, 146, 187, 2, 0, 154, 182, 2, 0, 161, 176, 3,
+ 0, 165, 171, 2, 0, 169, 166, 2, 0, 172, 162, 0, 0, 97, 194, 248, 0, 90, 202, 239, 0, 90, 207, 209, 0, 88, 215, 182,
+ 0, 89, 219, 138, 0, 93, 216, 100, 0, 94, 214, 55, 0, 97, 210, 12, 0, 112, 198, 1, 0, 128, 187, 0, 0, 139, 179, 0,
+ 0, 147, 173, 0, 0, 153, 167, 0, 0, 157, 162, 0, 0, 161, 158, 0, 0, 165, 155, 0, 0, 167, 156, 0, 0, 103, 179, 250,
+ 0, 99, 181, 247, 0, 104, 189, 208, 0, 101, 194, 189, 0, 100, 199, 155, 0, 102, 200, 118, 0, 103, 199, 78, 0, 106, 195, 37,
+ 0, 116, 189, 4, 0, 129, 179, 0, 0, 139, 171, 0, 0, 145, 164, 0, 0, 150, 158, 0, 0, 154, 153, 0, 0, 157, 149, 0,
+ 0, 159, 147, 0, 0, 162, 149, 0, 0, 108, 158, 252, 0, 106, 160, 249, 0, 110, 171, 217, 0, 108, 175, 190, 0, 108, 178, 168,
+ 0, 108, 182, 138, 0, 109, 184, 94, 0, 111, 181, 53, 0, 119, 177, 15, 0, 129, 169, 1, 0, 137, 161, 0, 0, 143, 154, 0,
+ 0, 147, 149, 0, 0, 150, 144, 0, 0, 152, 139, 0, 0, 154, 137, 0, 0, 157, 140, 0, 0, 111, 149, 234, 0, 113, 148, 232,
+ 0, 115, 151, 217, 0, 116, 154, 192, 0, 119, 157, 169, 0, 116, 161, 147, 0, 114, 167, 110, 0, 116, 164, 71, 0, 121, 160, 31,
+ 0, 129, 155, 3, 0, 136, 148, 0, 0, 140, 142, 0, 0, 143, 137, 0, 0, 146, 133, 0, 0, 148, 128, 0, 0, 150, 126, 0,
+ 0, 152, 129, 0, 0, 108, 128, 245, 0, 113, 128, 234, 0, 115, 133, 214, 0, 117, 135, 193, 0, 121, 135, 172, 0, 121, 140, 153,
+ 0, 117, 145, 127, 0, 116, 146, 90, 0, 124, 143, 48, 0, 129, 138, 14, 0, 134, 133, 1, 0, 137, 128, 0, 0, 140, 124, 0,
+ 0, 142, 120, 0, 0, 143, 116, 0, 0, 144, 114, 0, 0, 146, 117, 0, 0, 109, 105, 254, 0, 110, 108, 241, 0, 113, 113, 219,
+ 0, 116, 117, 198, 0, 120, 118, 175, 0, 122, 118, 153, 0, 121, 120, 132, 0, 120, 123, 101, 0, 128, 123, 63, 0, 133, 120, 29,
+ 0, 136, 115, 4, 0, 138, 112, 0, 0, 139, 108, 0, 0, 140, 105, 0, 0, 140, 102, 0, 0, 140, 100, 0, 0, 142, 102, 0,
+ 0, 108, 85, 254, 0, 109, 87, 251, 0, 112, 90, 236, 0, 115, 96, 214, 0, 119, 100, 189, 0, 121, 101, 162, 0, 123, 99, 140,
+ 0, 125, 96, 115, 0, 131, 100, 80, 0, 136, 98, 48, 0, 140, 94, 20, 0, 143, 90, 3, 0, 142, 89, 0, 0, 141, 87, 0,
+ 0, 140, 85, 0, 0, 139, 83, 0, 0, 142, 82, 0, 0, 116, 66, 253, 0, 120, 63, 252, 0, 123, 65, 243, 0, 125, 73, 223,
+ 0, 127, 79, 200, 0, 129, 81, 174, 0, 130, 81, 150, 0, 132, 82, 124, 0, 132, 84, 96, 0, 134, 84, 67, 0, 137, 81, 38,
+ 0, 140, 77, 13, 0, 139, 75, 1, 0, 136, 76, 0, 0, 135, 74, 0, 0, 133, 73, 0, 0, 134, 75, 0, 0, 123, 46, 251,
+ 0, 128, 43, 250, 0, 130, 46, 241, 0, 132, 53, 224, 0, 135, 59, 204, 0, 138, 62, 184, 0, 138, 64, 162, 0, 138, 65, 136,
+ 0, 136, 67, 108, 0, 135, 69, 82, 0, 136, 68, 56, 0, 137, 65, 28, 0, 137, 62, 7, 0, 134, 61, 0, 0, 130, 60, 0,
+ 0, 128, 60, 0, 0, 127, 64, 0, 0, 128, 28, 250, 0, 134, 26, 247, 0, 136, 30, 236, 0, 138, 36, 220, 0, 140, 40, 203,
+ 0, 141, 44, 186, 0, 142, 47, 167, 0, 141, 48, 145, 0, 141, 49, 120, 0, 138, 51, 94, 0, 138, 52, 69, 0, 139, 50, 42,
+ 0, 137, 48, 18, 0, 134, 49, 2, 0, 128, 51, 0, 0, 123, 53, 0, 0, 121, 54, 0, 0, 133, 17, 245, 0, 138, 13, 242,
+ 0, 141, 15, 232, 0, 142, 21, 218, 0, 142, 24, 203, 0, 142, 27, 186, 0, 142, 29, 168, 0, 141, 30, 147, 0, 140, 31, 125,
+ 0, 140, 32, 101, 0, 139, 32, 78, 0, 139, 33, 54, 0, 138, 34, 32, 0, 135, 34, 12, 0, 128, 36, 1, 0, 120, 40, 0,
+ 0, 115, 45, 0, 0, 139, 11, 241, 0, 141, 4, 235, 0, 142, 5, 227, 0, 143, 8, 215, 0, 143, 11, 202, 0, 142, 12, 186,
+ 0, 141, 13, 169, 0, 140, 14, 150, 0, 139, 16, 129, 0, 139, 16, 108, 0, 138, 17, 86, 0, 137, 17, 64, 0, 137, 18, 42,
+ 0, 135, 21, 23, 0, 132, 20, 6, 0, 122, 26, 0, 0, 111, 34, 0, 0, 144, 8, 239, 0, 143, 1, 227, 0, 142, 0, 218,
+ 0, 141, 1, 208, 0, 140, 1, 196, 0, 139, 1, 182, 0, 137, 2, 166, 0, 136, 2, 149, 0, 135, 3, 131, 0, 135, 4, 111,
+ 0, 134, 5, 91, 0, 133, 5, 72, 0, 133, 6, 51, 0, 132, 6, 31, 0, 131, 8, 14, 0, 124, 11, 2, 0, 111, 23, 0,
+ 0, 148, 5, 236, 0, 144, 0, 219, 0, 140, 0, 207, 0, 136, 0, 193, 0, 132, 0, 179, 0, 129, 0, 165, 0, 126, 0, 150,
+ 0, 124, 0, 135, 0, 124, 0, 122, 0, 123, 0, 107, 0, 123, 0, 92, 0, 123, 0, 75, 0, 122, 0, 57, 0, 122, 0, 39,
+ 0, 120, 0, 22, 0, 119, 3, 8, 0, 110, 12, 0, 0, 151, 2, 233, 0, 145, 0, 215, 0, 138, 0, 200, 0, 132, 0, 184,
+ 0, 126, 0, 167, 0, 121, 0, 151, 0, 116, 0, 136, 0, 113, 0, 122, 0, 112, 0, 111, 0, 112, 0, 100, 0, 111, 0, 89,
+ 0, 110, 0, 76, 0, 109, 0, 61, 0, 108, 0, 44, 0, 107, 0, 29, 0, 105, 1, 15, 0, 104, 5, 0, 0, 153, 0, 231,
+ 0, 148, 0, 219, 0, 143, 0, 207, 0, 137, 0, 191, 0, 132, 0, 174, 0, 126, 0, 156, 0, 120, 0, 138, 0, 114, 0, 121,
+ 0, 113, 0, 111, 0, 112, 0, 102, 0, 110, 0, 93, 0, 108, 0, 81, 0, 106, 0, 67, 0, 105, 0, 50, 0, 104, 0, 31,
+ 0, 101, 0, 14, 0, 99, 0, 0, 0, 49, 227, 241, 0, 41, 239, 213, 0, 41, 245, 184, 0, 42, 247, 157, 0, 46, 244, 125,
+ 0, 54, 240, 83, 0, 61, 236, 45, 0, 65, 230, 15, 0, 72, 224, 0, 0, 94, 210, 0, 0, 113, 200, 0, 0, 127, 193, 0,
+ 0, 137, 187, 0, 0, 146, 182, 1, 0, 153, 177, 1, 0, 158, 172, 1, 0, 162, 167, 0, 0, 73, 197, 248, 0, 68, 202, 240,
+ 0, 70, 204, 212, 0, 68, 211, 186, 0, 67, 219, 147, 0, 73, 214, 111, 0, 77, 214, 72, 0, 76, 213, 23, 0, 85, 204, 1,
+ 0, 103, 192, 0, 0, 118, 183, 0, 0, 129, 176, 0, 0, 138, 171, 0, 0, 144, 167, 0, 0, 149, 163, 0, 0, 153, 160, 0,
+ 0, 157, 161, 0, 0, 80, 180, 250, 0, 81, 183, 246, 0, 83, 192, 214, 0, 81, 194, 191, 0, 79, 200, 158, 0, 82, 201, 126,
+ 0, 84, 201, 89, 0, 85, 198, 47, 0, 90, 195, 9, 0, 105, 184, 0, 0, 119, 174, 0, 0, 128, 166, 0, 0, 135, 160, 0,
+ 0, 141, 157, 0, 0, 145, 154, 0, 0, 148, 151, 0, 0, 151, 154, 0, 0, 88, 160, 252, 0, 86, 161, 251, 0, 89, 172, 217,
+ 0, 90, 180, 193, 0, 89, 181, 171, 0, 89, 184, 145, 0, 91, 186, 104, 0, 91, 185, 65, 0, 94, 181, 25, 0, 106, 174, 2,
+ 0, 118, 164, 0, 0, 127, 156, 0, 0, 133, 150, 0, 0, 137, 146, 0, 0, 140, 142, 0, 0, 143, 140, 0, 0, 146, 144, 0,
+ 0, 90, 148, 248, 0, 94, 147, 242, 0, 95, 151, 222, 0, 96, 157, 195, 0, 98, 159, 171, 0, 97, 163, 151, 0, 97, 168, 116,
+ 0, 96, 169, 80, 0, 98, 166, 39, 0, 106, 161, 5, 0, 117, 152, 0, 0, 124, 144, 0, 0, 129, 138, 0, 0, 133, 133, 0,
+ 0, 136, 130, 0, 0, 138, 128, 0, 0, 141, 132, 0, 0, 91, 131, 248, 0, 96, 134, 230, 0, 99, 138, 213, 0, 101, 138, 195,
+ 0, 102, 140, 174, 0, 104, 140, 152, 0, 103, 144, 128, 0, 99, 148, 97, 0, 103, 148, 54, 0, 109, 144, 18, 0, 116, 138, 1,
+ 0, 122, 131, 0, 0, 127, 125, 0, 0, 130, 121, 0, 0, 132, 117, 0, 0, 135, 115, 0, 0, 137, 118, 0, 0, 94, 107, 254,
+ 0, 96, 113, 235, 0, 101, 118, 210, 0, 103, 121, 193, 0, 105, 124, 176, 0, 107, 120, 152, 0, 109, 123, 132, 0, 104, 127, 107,
+ 0, 107, 129, 67, 0, 112, 127, 31, 0, 116, 123, 4, 0, 121, 117, 0, 0, 125, 112, 0, 0, 127, 108, 0, 0, 129, 104, 0,
+ 0, 130, 102, 0, 0, 132, 104, 0, 0, 93, 88, 255, 0, 94, 93, 243, 0, 97, 98, 224, 0, 100, 102, 205, 0, 103, 104, 183,
+ 0, 107, 103, 157, 0, 109, 102, 135, 0, 108, 106, 115, 0, 111, 108, 81, 0, 115, 109, 47, 0, 119, 104, 16, 0, 123, 100, 2,
+ 0, 124, 96, 0, 0, 125, 92, 0, 0, 126, 89, 0, 0, 126, 87, 0, 0, 128, 88, 0, 0, 91, 70, 254, 0, 97, 68, 251,
+ 0, 100, 72, 240, 0, 103, 78, 220, 0, 105, 82, 197, 0, 109, 84, 171, 0, 111, 84, 144, 0, 112, 85, 124, 0, 113, 86, 101,
+ 0, 118, 87, 65, 0, 123, 82, 34, 0, 126, 77, 9, 0, 127, 74, 1, 0, 126, 72, 0, 0, 125, 70, 0, 0, 124, 69, 0,
+ 0, 126, 67, 0, 0, 100, 51, 253, 0, 105, 48, 252, 0, 108, 50, 243, 0, 110, 58, 225, 0, 113, 64, 203, 0, 115, 67, 181,
+ 0, 116, 68, 155, 0, 117, 69, 132, 0, 118, 70, 108, 0, 120, 71, 80, 0, 121, 70, 53, 0, 123, 65, 25, 0, 124, 60, 4,
+ 0, 122, 61, 0, 0, 119, 61, 0, 0, 118, 61, 0, 0, 118, 62, 0, 0, 108, 32, 251, 0, 112, 31, 249, 0, 115, 34, 238,
+ 0, 118, 40, 222, 0, 121, 45, 204, 0, 123, 48, 186, 0, 124, 51, 165, 0, 124, 52, 143, 0, 124, 53, 119, 0, 122, 54, 92,
+ 0, 122, 57, 68, 0, 122, 54, 42, 0, 122, 50, 16, 0, 120, 50, 2, 0, 116, 51, 0, 0, 113, 51, 0, 0, 112, 53, 0,
+ 0, 114, 18, 247, 0, 120, 16, 244, 0, 123, 19, 234, 0, 125, 25, 219, 0, 126, 29, 203, 0, 127, 32, 186, 0, 127, 33, 167,
+ 0, 126, 34, 147, 0, 125, 35, 125, 0, 124, 36, 101, 0, 122, 38, 78, 0, 123, 40, 55, 0, 124, 37, 30, 0, 121, 36, 9,
+ 0, 115, 38, 1, 0, 109, 41, 0, 0, 106, 45, 0, 0, 123, 12, 243, 0, 125, 6, 238, 0, 128, 7, 229, 0, 129, 12, 216,
+ 0, 129, 14, 201, 0, 129, 16, 186, 0, 128, 17, 168, 0, 126, 19, 149, 0, 125, 20, 129, 0, 125, 20, 108, 0, 124, 21, 86,
+ 0, 123, 21, 63, 0, 124, 22, 41, 0, 123, 23, 20, 0, 119, 22, 4, 0, 110, 28, 0, 0, 101, 34, 0, 0, 130, 8, 240,
+ 0, 130, 1, 231, 0, 130, 1, 221, 0, 130, 2, 210, 0, 129, 3, 197, 0, 128, 3, 183, 0, 126, 4, 166, 0, 124, 5, 148,
+ 0, 123, 5, 129, 0, 123, 6, 110, 0, 122, 7, 91, 0, 122, 8, 71, 0, 121, 8, 49, 0, 121, 8, 29, 0, 120, 11, 13,
+ 0, 112, 13, 1, 0, 100, 24, 0, 0, 136, 5, 238, 0, 134, 0, 221, 0, 131, 0, 208, 0, 127, 0, 194, 0, 123, 0, 180,
+ 0, 120, 0, 166, 0, 118, 0, 151, 0, 115, 0, 136, 0, 114, 0, 120, 0, 114, 0, 105, 0, 114, 1, 90, 0, 113, 1, 74,
+ 0, 113, 1, 55, 0, 113, 1, 37, 0, 111, 1, 20, 0, 110, 4, 7, 0, 99, 13, 0, 0, 141, 3, 235, 0, 136, 0, 216,
+ 0, 130, 0, 199, 0, 124, 0, 183, 0, 118, 0, 167, 0, 113, 0, 151, 0, 109, 0, 136, 0, 105, 0, 121, 0, 103, 0, 107,
+ 0, 102, 0, 96, 0, 101, 0, 85, 0, 101, 0, 72, 0, 100, 0, 58, 0, 99, 0, 42, 0, 98, 0, 27, 0, 96, 1, 14,
+ 0, 94, 5, 0, 0, 144, 0, 232, 0, 139, 0, 221, 0, 135, 0, 208, 0, 129, 0, 192, 0, 124, 0, 173, 0, 118, 0, 155,
+ 0, 112, 0, 137, 0, 106, 0, 120, 0, 101, 0, 103, 0, 99, 0, 95, 0, 98, 0, 86, 0, 96, 0, 76, 0, 95, 0, 63,
+ 0, 93, 0, 47, 0, 92, 0, 30, 0, 90, 0, 13, 0, 88, 0, 0, 0, 25, 228, 235, 0, 19, 238, 213, 0, 18, 244, 183,
+ 0, 21, 246, 158, 0, 26, 243, 133, 0, 34, 241, 97, 0, 44, 240, 55, 0, 51, 235, 22, 0, 57, 230, 3, 0, 67, 222, 0,
+ 0, 89, 210, 0, 0, 107, 200, 0, 0, 120, 193, 0, 0, 130, 187, 0, 0, 138, 182, 0, 0, 145, 177, 0, 0, 151, 173, 0,
+ 0, 51, 200, 246, 0, 48, 202, 241, 0, 50, 203, 213, 0, 48, 211, 188, 0, 45, 220, 151, 0, 51, 216, 121, 0, 58, 212, 84,
+ 0, 62, 211, 45, 0, 64, 208, 8, 0, 77, 198, 0, 0, 95, 188, 0, 0, 110, 180, 0, 0, 121, 174, 0, 0, 129, 169, 0,
+ 0, 136, 166, 0, 0, 142, 165, 0, 0, 146, 166, 0, 0, 61, 182, 250, 0, 60, 182, 248, 0, 65, 189, 216, 0, 61, 192, 193,
+ 0, 58, 200, 160, 0, 61, 201, 133, 0, 66, 200, 97, 0, 68, 198, 61, 0, 69, 196, 21, 0, 79, 189, 2, 0, 96, 178, 0,
+ 0, 109, 169, 0, 0, 119, 163, 0, 0, 126, 158, 0, 0, 132, 155, 0, 0, 136, 154, 0, 0, 140, 157, 0, 0, 68, 163, 251,
+ 0, 67, 165, 251, 0, 72, 175, 220, 0, 71, 181, 195, 0, 70, 182, 172, 0, 71, 184, 151, 0, 72, 185, 120, 0, 71, 187, 86,
+ 0, 74, 184, 35, 0, 80, 179, 4, 0, 96, 168, 0, 0, 108, 159, 0, 0, 117, 152, 0, 0, 123, 147, 0, 0, 127, 143, 0,
+ 0, 131, 141, 0, 0, 134, 147, 0, 0, 73, 145, 251, 0, 75, 143, 252, 0, 77, 157, 226, 0, 78, 163, 201, 0, 81, 163, 173,
+ 0, 80, 166, 155, 0, 80, 167, 128, 0, 79, 170, 98, 0, 81, 168, 48, 0, 83, 165, 11, 0, 96, 157, 1, 0, 107, 148, 0,
+ 0, 115, 141, 0, 0, 119, 135, 0, 0, 124, 131, 0, 0, 127, 129, 0, 0, 129, 134, 0, 0, 74, 130, 252, 0, 78, 137, 240,
+ 0, 83, 138, 216, 0, 85, 141, 204, 0, 85, 146, 181, 0, 85, 144, 152, 0, 86, 147, 133, 0, 84, 149, 105, 0, 85, 151, 61,
+ 0, 87, 149, 24, 0, 96, 143, 2, 0, 106, 136, 0, 0, 112, 129, 0, 0, 117, 124, 0, 0, 121, 119, 0, 0, 124, 117, 0,
+ 0, 126, 120, 0, 0, 77, 109, 254, 0, 81, 117, 235, 0, 85, 124, 212, 0, 87, 126, 196, 0, 88, 126, 180, 0, 89, 128, 158,
+ 0, 93, 126, 133, 0, 90, 129, 111, 0, 88, 133, 74, 0, 89, 132, 37, 0, 95, 128, 5, 0, 105, 122, 0, 0, 111, 116, 0,
+ 0, 115, 111, 0, 0, 118, 107, 0, 0, 121, 104, 0, 0, 123, 106, 0, 0, 78, 89, 254, 0, 81, 96, 238, 0, 85, 102, 220,
+ 0, 88, 106, 204, 0, 90, 108, 183, 0, 91, 110, 160, 0, 94, 108, 140, 0, 94, 109, 116, 0, 90, 113, 89, 0, 89, 116, 56,
+ 0, 98, 111, 18, 0, 105, 107, 1, 0, 109, 102, 0, 0, 112, 98, 0, 0, 114, 94, 0, 0, 116, 91, 0, 0, 118, 91, 0,
+ 0, 76, 72, 255, 0, 81, 73, 248, 0, 84, 77, 234, 0, 84, 86, 214, 0, 88, 90, 191, 0, 91, 91, 169, 0, 94, 90, 143,
+ 0, 97, 91, 122, 0, 93, 93, 98, 0, 93, 95, 68, 0, 101, 91, 31, 0, 105, 88, 6, 0, 108, 84, 0, 0, 109, 81, 0,
+ 0, 110, 77, 0, 0, 110, 75, 0, 0, 112, 74, 0, 0, 75, 56, 254, 0, 82, 53, 252, 0, 84, 56, 241, 0, 83, 65, 223,
+ 0, 87, 70, 201, 0, 90, 71, 179, 0, 93, 71, 152, 0, 96, 73, 129, 0, 98, 74, 109, 0, 99, 74, 87, 0, 104, 71, 49,
+ 0, 107, 66, 19, 0, 109, 64, 2, 0, 109, 62, 0, 0, 108, 61, 0, 0, 107, 59, 0, 0, 109, 57, 0, 0, 84, 38, 253,
+ 0, 89, 36, 251, 0, 92, 38, 240, 0, 95, 44, 224, 0, 99, 49, 205, 0, 101, 53, 185, 0, 102, 54, 162, 0, 103, 56, 138,
+ 0, 103, 57, 116, 0, 104, 59, 93, 0, 105, 61, 66, 0, 106, 55, 38, 0, 108, 51, 13, 0, 107, 49, 1, 0, 104, 51, 0,
+ 0, 101, 51, 0, 0, 101, 52, 0, 0, 93, 22, 250, 0, 98, 20, 247, 0, 102, 23, 237, 0, 104, 29, 220, 0, 106, 33, 204,
+ 0, 108, 36, 187, 0, 109, 37, 167, 0, 109, 38, 145, 0, 108, 40, 124, 0, 106, 42, 101, 0, 105, 43, 77, 0, 107, 46, 54,
+ 0, 107, 41, 29, 0, 107, 38, 6, 0, 102, 40, 0, 0, 98, 41, 0, 0, 96, 43, 0, 0, 103, 12, 245, 0, 107, 8, 241,
+ 0, 110, 10, 232, 0, 111, 16, 217, 0, 112, 18, 202, 0, 113, 20, 185, 0, 113, 21, 168, 0, 112, 22, 148, 0, 110, 23, 128,
+ 0, 108, 26, 106, 0, 107, 26, 85, 0, 107, 27, 63, 0, 109, 28, 41, 0, 110, 26, 18, 0, 105, 26, 2, 0, 97, 30, 0,
+ 0, 91, 34, 0, 0, 114, 8, 242, 0, 115, 2, 234, 0, 115, 2, 225, 0, 116, 5, 212, 0, 115, 6, 198, 0, 115, 6, 182,
+ 0, 113, 8, 165, 0, 112, 8, 147, 0, 111, 9, 129, 0, 110, 10, 110, 0, 110, 10, 91, 0, 109, 10, 70, 0, 109, 11, 48,
+ 0, 109, 11, 28, 0, 108, 13, 10, 0, 99, 16, 1, 0, 88, 25, 0, 0, 122, 5, 239, 0, 121, 1, 225, 0, 119, 0, 211,
+ 0, 116, 0, 196, 0, 113, 0, 182, 0, 111, 0, 168, 0, 108, 1, 153, 0, 106, 1, 138, 0, 105, 1, 122, 0, 104, 1, 105,
+ 0, 104, 1, 90, 0, 104, 1, 73, 0, 104, 1, 54, 0, 103, 1, 35, 0, 102, 1, 18, 0, 100, 4, 4, 0, 87, 14, 0,
+ 0, 129, 3, 236, 0, 125, 0, 217, 0, 120, 0, 200, 0, 115, 0, 183, 0, 109, 0, 166, 0, 104, 0, 151, 0, 100, 0, 136,
+ 0, 97, 0, 121, 0, 94, 0, 106, 0, 92, 0, 93, 0, 91, 0, 82, 0, 91, 0, 69, 0, 90, 0, 55, 0, 90, 0, 40,
+ 0, 88, 0, 26, 0, 87, 1, 13, 0, 83, 6, 0, 0, 134, 0, 234, 0, 130, 0, 221, 0, 125, 0, 208, 0, 120, 0, 192,
+ 0, 115, 0, 173, 0, 109, 0, 155, 0, 103, 0, 137, 0, 97, 0, 119, 0, 92, 0, 102, 0, 86, 0, 85, 0, 85, 0, 78,
+ 0, 84, 0, 69, 0, 83, 0, 58, 0, 81, 0, 44, 0, 80, 0, 28, 0, 78, 0, 13, 0, 76, 0, 0, 0, 14, 224, 227,
+ 0, 9, 231, 211, 0, 7, 239, 184, 0, 8, 242, 160, 0, 12, 243, 137, 0, 18, 243, 107, 0, 27, 243, 65, 0, 37, 240, 29,
+ 0, 45, 235, 8, 0, 53, 227, 0, 0, 63, 222, 0, 0, 83, 210, 0, 0, 100, 200, 0, 0, 113, 193, 0, 0, 124, 187, 0,
+ 0, 132, 182, 0, 0, 139, 178, 0, 0, 28, 202, 240, 0, 29, 202, 239, 0, 32, 202, 213, 0, 30, 210, 191, 0, 26, 220, 154,
+ 0, 31, 217, 128, 0, 39, 214, 94, 0, 46, 212, 57, 0, 49, 209, 25, 0, 56, 204, 3, 0, 70, 194, 0, 0, 87, 185, 0,
+ 0, 102, 178, 0, 0, 113, 173, 0, 0, 121, 169, 0, 0, 128, 167, 0, 0, 133, 169, 0, 0, 37, 186, 246, 0, 42, 183, 246,
+ 0, 47, 186, 216, 0, 42, 192, 194, 0, 39, 202, 162, 0, 42, 202, 137, 0, 45, 200, 106, 0, 50, 198, 69, 0, 53, 196, 33,
+ 0, 57, 193, 4, 0, 71, 183, 0, 0, 88, 173, 0, 0, 101, 166, 0, 0, 111, 161, 0, 0, 118, 158, 0, 0, 123, 156, 0,
+ 0, 128, 160, 0, 0, 48, 167, 249, 0, 50, 166, 247, 0, 53, 171, 221, 0, 52, 178, 195, 0, 51, 180, 173, 0, 53, 182, 153,
+ 0, 55, 183, 127, 0, 55, 185, 95, 0, 58, 184, 44, 0, 60, 182, 8, 0, 72, 172, 0, 0, 88, 162, 0, 0, 100, 155, 0,
+ 0, 108, 150, 0, 0, 114, 146, 0, 0, 118, 144, 0, 0, 122, 149, 0, 0, 57, 146, 251, 0, 57, 147, 249, 0, 58, 156, 228,
+ 0, 61, 164, 202, 0, 62, 164, 174, 0, 64, 166, 155, 0, 66, 166, 134, 0, 63, 169, 104, 0, 65, 169, 57, 0, 66, 167, 19,
+ 0, 74, 161, 1, 0, 88, 151, 0, 0, 98, 143, 0, 0, 105, 138, 0, 0, 110, 134, 0, 0, 114, 132, 0, 0, 117, 137, 0,
+ 0, 59, 130, 252, 0, 61, 132, 246, 0, 66, 142, 227, 0, 67, 148, 209, 0, 67, 151, 186, 0, 69, 149, 154, 0, 70, 150, 135,
+ 0, 68, 152, 109, 0, 70, 154, 67, 0, 70, 152, 30, 0, 75, 148, 3, 0, 88, 139, 0, 0, 96, 131, 0, 0, 103, 126, 0,
+ 0, 108, 122, 0, 0, 112, 119, 0, 0, 114, 124, 0, 0, 60, 113, 253, 0, 64, 118, 237, 0, 70, 127, 213, 0, 72, 129, 201,
+ 0, 74, 130, 185, 0, 74, 135, 163, 0, 74, 131, 134, 0, 72, 133, 114, 0, 73, 136, 79, 0, 72, 137, 45, 0, 74, 134, 11,
+ 0, 86, 125, 1, 0, 95, 119, 0, 0, 101, 113, 0, 0, 105, 109, 0, 0, 109, 106, 0, 0, 111, 110, 0, 0, 63, 92, 254,
+ 0, 66, 98, 238, 0, 70, 105, 219, 0, 72, 112, 202, 0, 75, 115, 182, 0, 77, 115, 163, 0, 78, 116, 141, 0, 79, 111, 116,
+ 0, 76, 114, 94, 0, 72, 120, 65, 0, 76, 116, 24, 0, 84, 111, 2, 0, 93, 105, 0, 0, 98, 100, 0, 0, 102, 95, 0,
+ 0, 105, 92, 0, 0, 107, 94, 0, 0, 63, 74, 254, 0, 67, 76, 243, 0, 71, 82, 227, 0, 72, 90, 206, 0, 78, 91, 180,
+ 0, 80, 94, 164, 0, 80, 93, 139, 0, 82, 95, 123, 0, 81, 94, 97, 0, 77, 99, 74, 0, 79, 97, 35, 0, 84, 93, 6,
+ 0, 90, 89, 0, 0, 95, 84, 0, 0, 97, 80, 0, 0, 98, 76, 0, 0, 100, 76, 0, 0, 61, 58, 254, 0, 66, 59, 246,
+ 0, 69, 63, 233, 0, 69, 71, 214, 0, 72, 74, 194, 0, 75, 76, 176, 0, 77, 77, 152, 0, 82, 78, 128, 0, 83, 78, 106,
+ 0, 80, 82, 84, 0, 82, 80, 49, 0, 84, 75, 18, 0, 89, 72, 2, 0, 91, 68, 0, 0, 92, 65, 0, 0, 92, 63, 0,
+ 0, 93, 62, 0, 0, 59, 43, 254, 0, 67, 41, 250, 0, 71, 43, 238, 0, 74, 49, 221, 0, 78, 52, 203, 0, 79, 55, 183,
+ 0, 80, 57, 161, 0, 83, 59, 136, 0, 85, 61, 113, 0, 84, 62, 94, 0, 84, 63, 74, 0, 88, 56, 34, 0, 92, 53, 9,
+ 0, 92, 51, 0, 0, 91, 50, 0, 0, 91, 49, 0, 0, 91, 46, 0, 0, 70, 26, 253, 0, 75, 24, 250, 0, 80, 26, 240,
+ 0, 83, 33, 222, 0, 85, 37, 205, 0, 86, 40, 187, 0, 88, 41, 167, 0, 89, 42, 145, 0, 89, 45, 121, 0, 87, 47, 100,
+ 0, 88, 46, 78, 0, 90, 47, 51, 0, 91, 42, 24, 0, 92, 40, 4, 0, 90, 40, 0, 0, 87, 40, 0, 0, 84, 40, 0,
+ 0, 80, 13, 249, 0, 85, 12, 245, 0, 89, 14, 234, 0, 91, 20, 219, 0, 93, 23, 203, 0, 94, 25, 187, 0, 95, 25, 168,
+ 0, 95, 26, 148, 0, 94, 27, 127, 0, 91, 30, 105, 0, 90, 30, 83, 0, 90, 30, 61, 0, 92, 32, 39, 0, 93, 29, 17,
+ 0, 90, 29, 2, 0, 85, 31, 0, 0, 80, 33, 0, 0, 93, 8, 245, 0, 96, 3, 237, 0, 97, 4, 228, 0, 98, 8, 215,
+ 0, 99, 9, 200, 0, 99, 10, 183, 0, 98, 11, 165, 0, 97, 12, 147, 0, 97, 12, 129, 0, 96, 13, 110, 0, 94, 15, 89,
+ 0, 93, 15, 69, 0, 93, 16, 48, 0, 95, 17, 28, 0, 94, 16, 8, 0, 86, 19, 1, 0, 76, 25, 0, 0, 105, 5, 241,
+ 0, 105, 1, 229, 0, 104, 0, 217, 0, 102, 1, 203, 0, 101, 1, 188, 0, 100, 1, 173, 0, 98, 1, 157, 0, 96, 1, 141,
+ 0, 95, 1, 125, 0, 94, 1, 108, 0, 93, 2, 90, 0, 93, 2, 73, 0, 93, 3, 54, 0, 92, 3, 34, 0, 93, 3, 16,
+ 0, 88, 6, 3, 0, 74, 15, 0, 0, 115, 2, 238, 0, 112, 0, 221, 0, 108, 0, 204, 0, 104, 0, 186, 0, 99, 0, 168,
+ 0, 95, 0, 151, 0, 92, 0, 136, 0, 88, 0, 122, 0, 86, 0, 107, 0, 83, 0, 93, 0, 82, 0, 79, 0, 81, 0, 67,
+ 0, 81, 0, 53, 0, 80, 0, 38, 0, 79, 0, 24, 0, 78, 1, 12, 0, 70, 6, 0, 0, 121, 0, 236, 0, 118, 0, 224,
+ 0, 114, 0, 211, 0, 110, 0, 193, 0, 105, 0, 174, 0, 99, 0, 155, 0, 94, 0, 136, 0, 88, 0, 119, 0, 83, 0, 100,
+ 0, 77, 0, 84, 0, 72, 0, 69, 0, 70, 0, 61, 0, 69, 0, 52, 0, 68, 0, 40, 0, 67, 0, 27, 0, 65, 0, 13,
+ 0, 64, 0, 0, 0, 9, 222, 219, 0, 6, 228, 209, 0, 5, 233, 189, 0, 5, 238, 166, 0, 8, 240, 145, 0, 12, 241, 119,
+ 0, 17, 242, 83, 0, 27, 241, 44, 0, 35, 238, 17, 0, 43, 233, 4, 0, 51, 226, 0, 0, 58, 221, 0, 0, 78, 210, 0,
+ 0, 94, 200, 0, 0, 107, 193, 0, 0, 117, 187, 0, 0, 126, 181, 0, 0, 17, 200, 229, 0, 15, 202, 234, 0, 15, 204, 214,
+ 0, 15, 210, 193, 0, 12, 218, 158, 0, 16, 218, 131, 0, 23, 215, 106, 0, 30, 212, 68, 0, 36, 211, 35, 0, 41, 208, 9,
+ 0, 51, 200, 1, 0, 64, 192, 0, 0, 80, 183, 0, 0, 95, 177, 0, 0, 105, 173, 0, 0, 114, 171, 0, 0, 120, 173, 0,
+ 0, 24, 185, 238, 0, 24, 184, 243, 0, 24, 190, 219, 0, 23, 196, 195, 0, 21, 203, 165, 0, 24, 203, 140, 0, 27, 201, 115,
+ 0, 33, 200, 79, 0, 38, 198, 41, 0, 42, 195, 11, 0, 52, 188, 1, 0, 65, 179, 0, 0, 81, 170, 0, 0, 94, 164, 0,
+ 0, 103, 161, 0, 0, 109, 159, 0, 0, 115, 164, 0, 0, 33, 168, 245, 0, 33, 167, 246, 0, 33, 173, 225, 0, 32, 180, 198,
+ 0, 33, 182, 175, 0, 35, 184, 156, 0, 35, 185, 133, 0, 37, 185, 101, 0, 42, 184, 53, 0, 45, 182, 19, 0, 54, 176, 1,
+ 0, 67, 166, 0, 0, 81, 158, 0, 0, 92, 152, 0, 0, 99, 148, 0, 0, 105, 147, 0, 0, 109, 153, 0, 0, 42, 148, 249,
+ 0, 40, 149, 249, 0, 39, 156, 231, 0, 41, 165, 205, 0, 43, 165, 175, 0, 43, 166, 157, 0, 44, 169, 136, 0, 44, 171, 109,
+ 0, 48, 171, 64, 0, 50, 170, 28, 0, 55, 164, 2, 0, 68, 154, 0, 0, 81, 145, 0, 0, 90, 139, 0, 0, 96, 135, 0,
+ 0, 101, 133, 0, 0, 104, 140, 0, 0, 46, 131, 251, 0, 46, 131, 248, 0, 47, 136, 232, 0, 48, 149, 210, 0, 48, 155, 188,
+ 0, 50, 152, 156, 0, 50, 153, 138, 0, 50, 156, 114, 0, 52, 155, 73, 0, 53, 155, 38, 0, 55, 152, 5, 0, 68, 143, 0,
+ 0, 79, 133, 0, 0, 87, 127, 0, 0, 94, 122, 0, 0, 99, 120, 0, 0, 100, 126, 0, 0, 46, 115, 252, 0, 49, 119, 238,
+ 0, 53, 128, 218, 0, 54, 133, 208, 0, 55, 137, 192, 0, 57, 140, 166, 0, 56, 135, 136, 0, 55, 138, 117, 0, 56, 138, 83,
+ 0, 57, 140, 51, 0, 57, 138, 17, 0, 65, 131, 1, 0, 77, 121, 0, 0, 85, 114, 0, 0, 91, 109, 0, 0, 96, 107, 0,
+ 0, 97, 111, 0, 0, 48, 97, 253, 0, 51, 103, 235, 0, 55, 114, 214, 0, 57, 116, 199, 0, 60, 118, 183, 0, 62, 117, 167,
+ 0, 61, 119, 142, 0, 61, 116, 119, 0, 59, 117, 97, 0, 57, 120, 71, 0, 58, 121, 31, 0, 61, 117, 4, 0, 73, 108, 0,
+ 0, 82, 101, 0, 0, 88, 95, 0, 0, 92, 92, 0, 0, 93, 95, 0, 0, 51, 77, 253, 0, 53, 83, 235, 0, 57, 90, 217,
+ 0, 60, 93, 202, 0, 62, 95, 182, 0, 63, 98, 162, 0, 66, 98, 143, 0, 66, 100, 125, 0, 66, 97, 98, 0, 62, 100, 78,
+ 0, 60, 103, 43, 0, 61, 99, 12, 0, 71, 92, 1, 0, 79, 86, 0, 0, 84, 81, 0, 0, 86, 78, 0, 0, 87, 78, 0,
+ 0, 50, 61, 253, 0, 50, 68, 235, 0, 54, 73, 219, 0, 57, 76, 207, 0, 60, 78, 191, 0, 64, 79, 173, 0, 66, 81, 151,
+ 0, 68, 82, 129, 0, 69, 82, 106, 0, 66, 83, 85, 0, 62, 87, 60, 0, 60, 84, 30, 0, 68, 78, 4, 0, 76, 72, 0,
+ 0, 79, 68, 0, 0, 80, 65, 0, 0, 81, 64, 0, 0, 47, 45, 254, 0, 52, 46, 244, 0, 55, 49, 231, 0, 59, 54, 214,
+ 0, 61, 57, 200, 0, 60, 63, 183, 0, 63, 65, 158, 0, 66, 66, 136, 0, 69, 67, 111, 0, 69, 67, 90, 0, 65, 68, 67,
+ 0, 64, 66, 39, 0, 71, 61, 10, 0, 74, 57, 1, 0, 76, 55, 0, 0, 76, 52, 0, 0, 76, 51, 0, 0, 44, 31, 254,
+ 0, 53, 29, 249, 0, 57, 32, 237, 0, 61, 37, 219, 0, 63, 39, 203, 0, 60, 43, 187, 0, 62, 47, 166, 0, 65, 48, 145,
+ 0, 67, 49, 120, 0, 70, 51, 98, 0, 70, 50, 78, 0, 70, 48, 59, 0, 73, 43, 21, 0, 76, 41, 2, 0, 76, 39, 0,
+ 0, 76, 38, 0, 0, 75, 37, 0, 0, 55, 16, 253, 0, 62, 15, 249, 0, 67, 17, 239, 0, 70, 22, 222, 0, 72, 25, 204,
+ 0, 73, 27, 188, 0, 74, 29, 169, 0, 74, 30, 149, 0, 74, 31, 127, 0, 74, 33, 104, 0, 72, 33, 83, 0, 73, 32, 61,
+ 0, 76, 33, 36, 0, 76, 31, 13, 0, 76, 30, 1, 0, 73, 30, 0, 0, 69, 31, 0, 0, 70, 9, 249, 0, 73, 5, 243,
+ 0, 76, 7, 232, 0, 79, 11, 218, 0, 79, 13, 202, 0, 80, 14, 185, 0, 80, 15, 168, 0, 80, 16, 149, 0, 81, 16, 129,
+ 0, 80, 17, 109, 0, 78, 19, 88, 0, 75, 19, 67, 0, 76, 19, 46, 0, 78, 21, 26, 0, 78, 19, 7, 0, 72, 21, 0,
+ 0, 64, 24, 0, 0, 84, 5, 245, 0, 85, 1, 235, 0, 86, 1, 224, 0, 85, 2, 211, 0, 85, 3, 196, 0, 84, 3, 179,
+ 0, 83, 4, 160, 0, 83, 4, 142, 0, 83, 4, 126, 0, 82, 4, 109, 0, 80, 5, 91, 0, 79, 6, 72, 0, 78, 7, 53,
+ 0, 78, 7, 33, 0, 79, 7, 15, 0, 74, 9, 2, 0, 62, 16, 0, 0, 96, 2, 241, 0, 95, 0, 225, 0, 93, 0, 211,
+ 0, 90, 0, 194, 0, 87, 0, 176, 0, 84, 0, 157, 0, 81, 0, 139, 0, 79, 0, 123, 0, 76, 0, 108, 0, 74, 0, 94,
+ 0, 72, 0, 79, 0, 71, 0, 65, 0, 71, 1, 52, 0, 70, 1, 36, 0, 69, 0, 22, 0, 68, 2, 10, 0, 58, 7, 0,
+ 0, 106, 0, 238, 0, 103, 0, 227, 0, 100, 0, 215, 0, 97, 0, 199, 0, 93, 0, 178, 0, 88, 0, 157, 0, 83, 0, 137,
+ 0, 78, 0, 118, 0, 72, 0, 98, 0, 67, 0, 82, 0, 61, 0, 66, 0, 58, 0, 55, 0, 57, 0, 46, 0, 56, 0, 36,
+ 0, 55, 0, 25, 0, 54, 0, 13, 0, 53, 0, 0, 0, 6, 221, 212, 0, 5, 224, 207, 0, 5, 228, 194, 0, 5, 232, 172,
+ 0, 6, 235, 153, 0, 9, 236, 132, 0, 13, 238, 104, 0, 20, 239, 66, 0, 28, 238, 34, 0, 35, 235, 13, 0, 41, 231, 3,
+ 0, 48, 225, 0, 0, 53, 221, 0, 0, 72, 210, 0, 0, 88, 200, 0, 0, 101, 193, 0, 0, 111, 186, 0, 0, 12, 199, 220,
+ 0, 4, 206, 216, 0, 2, 210, 201, 0, 3, 213, 182, 0, 5, 215, 162, 0, 8, 215, 138, 0, 12, 214, 115, 0, 18, 213, 82,
+ 0, 24, 212, 46, 0, 30, 210, 19, 0, 36, 205, 3, 0, 47, 198, 0, 0, 57, 190, 0, 0, 74, 183, 0, 0, 88, 178, 0,
+ 0, 99, 175, 0, 0, 106, 177, 0, 0, 16, 183, 229, 0, 8, 190, 228, 0, 6, 198, 205, 0, 6, 201, 183, 0, 8, 202, 165,
+ 0, 10, 203, 144, 0, 13, 203, 119, 0, 18, 201, 88, 0, 24, 199, 52, 0, 29, 197, 21, 0, 36, 192, 2, 0, 48, 184, 0,
+ 0, 59, 176, 0, 0, 74, 168, 0, 0, 87, 163, 0, 0, 94, 162, 0, 0, 100, 167, 0, 0, 22, 167, 237, 0, 17, 171, 238,
+ 0, 14, 179, 217, 0, 15, 182, 197, 0, 17, 182, 177, 0, 17, 186, 158, 0, 18, 189, 126, 0, 21, 188, 97, 0, 27, 185, 60,
+ 0, 31, 185, 28, 0, 37, 180, 3, 0, 50, 171, 0, 0, 61, 162, 0, 0, 75, 155, 0, 0, 83, 151, 0, 0, 90, 149, 0,
+ 0, 95, 156, 0, 0, 28, 150, 244, 0, 24, 152, 246, 0, 22, 158, 228, 0, 24, 163, 203, 0, 25, 163, 174, 0, 24, 169, 158,
+ 0, 24, 174, 131, 0, 26, 173, 106, 0, 31, 171, 70, 0, 34, 171, 37, 0, 37, 168, 7, 0, 50, 158, 0, 0, 62, 149, 0,
+ 0, 73, 142, 0, 0, 81, 137, 0, 0, 87, 135, 0, 0, 90, 143, 0, 0, 34, 131, 249, 0, 32, 131, 248, 0, 31, 137, 231,
+ 0, 30, 146, 206, 0, 30, 153, 185, 0, 31, 152, 156, 0, 31, 155, 139, 0, 31, 156, 118, 0, 34, 156, 79, 0, 37, 156, 47,
+ 0, 38, 156, 15, 0, 48, 147, 1, 0, 60, 138, 0, 0, 70, 129, 0, 0, 79, 123, 0, 0, 85, 121, 0, 0, 86, 128, 0,
+ 0, 34, 116, 251, 0, 35, 119, 239, 0, 38, 124, 221, 0, 39, 129, 208, 0, 37, 138, 190, 0, 37, 142, 166, 0, 38, 137, 137,
+ 0, 37, 139, 119, 0, 38, 140, 88, 0, 39, 140, 57, 0, 40, 141, 26, 0, 44, 136, 3, 0, 56, 127, 0, 0, 67, 117, 0,
+ 0, 76, 109, 0, 0, 82, 106, 0, 0, 82, 112, 0, 0, 34, 100, 251, 0, 37, 106, 231, 0, 41, 113, 211, 0, 41, 117, 201,
+ 0, 43, 119, 188, 0, 45, 122, 171, 0, 44, 124, 145, 0, 43, 120, 119, 0, 42, 121, 100, 0, 41, 122, 74, 0, 43, 125, 37,
+ 0, 42, 122, 7, 0, 53, 113, 0, 0, 65, 102, 0, 0, 73, 95, 0, 0, 78, 91, 0, 0, 78, 95, 0, 0, 38, 80, 252,
+ 0, 40, 89, 228, 0, 45, 94, 209, 0, 45, 98, 197, 0, 46, 99, 180, 0, 47, 102, 165, 0, 50, 100, 147, 0, 49, 103, 126,
+ 0, 48, 100, 101, 0, 45, 102, 80, 0, 45, 105, 48, 0, 44, 104, 18, 0, 50, 97, 1, 0, 62, 89, 0, 0, 69, 83, 0,
+ 0, 73, 78, 0, 0, 73, 79, 0, 0, 40, 62, 253, 0, 40, 71, 231, 0, 43, 76, 215, 0, 45, 78, 204, 0, 46, 81, 190,
+ 0, 49, 83, 171, 0, 50, 85, 146, 0, 53, 86, 129, 0, 52, 86, 106, 0, 53, 83, 84, 0, 48, 85, 63, 0, 46, 89, 38,
+ 0, 49, 83, 7, 0, 59, 76, 0, 0, 66, 70, 0, 0, 69, 66, 0, 0, 68, 66, 0, 0, 37, 47, 253, 0, 41, 52, 237,
+ 0, 43, 55, 224, 0, 45, 59, 209, 0, 46, 62, 196, 0, 47, 66, 174, 0, 53, 68, 146, 0, 54, 69, 131, 0, 54, 70, 106,
+ 0, 56, 69, 87, 0, 53, 67, 65, 0, 50, 71, 45, 0, 53, 67, 16, 0, 58, 62, 1, 0, 63, 58, 0, 0, 65, 54, 0,
+ 0, 64, 54, 0, 0, 33, 33, 255, 0, 39, 35, 242, 0, 43, 37, 229, 0, 45, 41, 213, 0, 47, 43, 198, 0, 45, 50, 183,
+ 0, 48, 52, 162, 0, 50, 53, 141, 0, 52, 54, 118, 0, 55, 54, 94, 0, 55, 52, 74, 0, 51, 54, 51, 0, 53, 52, 23,
+ 0, 57, 48, 3, 0, 61, 44, 0, 0, 61, 42, 0, 0, 60, 41, 0, 0, 31, 21, 255, 0, 40, 19, 247, 0, 45, 21, 237,
+ 0, 48, 25, 220, 0, 50, 27, 202, 0, 51, 30, 187, 0, 53, 32, 169, 0, 53, 34, 149, 0, 54, 35, 127, 0, 56, 36, 103,
+ 0, 57, 35, 80, 0, 55, 35, 62, 0, 54, 35, 45, 0, 58, 32, 10, 0, 60, 30, 1, 0, 60, 29, 0, 0, 58, 28, 0,
+ 0, 45, 11, 253, 0, 49, 8, 247, 0, 54, 9, 238, 0, 57, 13, 223, 0, 58, 15, 207, 0, 59, 16, 190, 0, 60, 18, 172,
+ 0, 59, 20, 153, 0, 61, 21, 131, 0, 61, 21, 110, 0, 60, 22, 88, 0, 59, 22, 67, 0, 60, 21, 46, 0, 62, 22, 23,
+ 0, 62, 21, 4, 0, 58, 22, 0, 0, 54, 23, 0, 0, 61, 5, 250, 0, 62, 1, 241, 0, 64, 1, 231, 0, 65, 4, 216,
+ 0, 65, 5, 201, 0, 66, 6, 185, 0, 66, 7, 165, 0, 66, 7, 146, 0, 67, 7, 128, 0, 66, 8, 109, 0, 65, 8, 91,
+ 0, 63, 9, 71, 0, 62, 10, 51, 0, 63, 9, 32, 0, 64, 11, 14, 0, 59, 12, 2, 0, 51, 16, 0, 0, 75, 2, 245,
+ 0, 75, 0, 231, 0, 74, 0, 219, 0, 72, 0, 202, 0, 71, 0, 186, 0, 70, 0, 168, 0, 68, 1, 148, 0, 67, 1, 128,
+ 0, 65, 1, 110, 0, 63, 1, 95, 0, 62, 1, 80, 0, 61, 1, 66, 0, 60, 1, 51, 0, 60, 1, 36, 0, 59, 1, 21,
+ 0, 58, 3, 8, 0, 48, 7, 0, 0, 88, 0, 241, 0, 85, 0, 232, 0, 83, 0, 221, 0, 81, 0, 206, 0, 78, 0, 186,
+ 0, 75, 0, 164, 0, 71, 0, 141, 0, 66, 0, 119, 0, 61, 0, 96, 0, 55, 0, 78, 0, 51, 0, 65, 0, 48, 0, 53,
+ 0, 47, 0, 45, 0, 47, 0, 35, 0, 47, 0, 25, 0, 46, 0, 13, 0, 43, 0, 0, 0, 4, 219, 208, 0, 4, 221, 205,
+ 0, 4, 223, 195, 0, 4, 227, 176, 0, 5, 230, 159, 0, 8, 231, 141, 0, 11, 233, 119, 0, 15, 235, 88, 0, 22, 235, 54,
+ 0, 29, 234, 28, 0, 34, 232, 11, 0, 39, 228, 3, 0, 44, 224, 0, 0, 48, 221, 0, 0, 67, 210, 0, 0, 82, 200, 0,
+ 0, 95, 192, 0, 0, 9, 199, 214, 0, 1, 204, 208, 0, 0, 207, 196, 0, 0, 209, 180, 0, 1, 211, 165, 0, 3, 212, 146,
+ 0, 6, 213, 122, 0, 9, 213, 96, 0, 15, 213, 61, 0, 20, 211, 31, 0, 25, 209, 10, 0, 34, 203, 1, 0, 43, 197, 0,
+ 0, 52, 191, 0, 0, 67, 184, 0, 0, 81, 180, 0, 0, 89, 182, 0, 0, 10, 183, 221, 0, 2, 190, 218, 0, 1, 196, 199,
+ 0, 0, 199, 179, 0, 1, 200, 165, 0, 2, 201, 148, 0, 4, 202, 123, 0, 7, 202, 98, 0, 12, 201, 64, 0, 17, 199, 31,
+ 0, 23, 196, 7, 0, 35, 189, 0, 0, 45, 181, 0, 0, 54, 175, 0, 0, 68, 168, 0, 0, 78, 165, 0, 0, 84, 172, 0,
+ 0, 15, 167, 229, 0, 7, 171, 229, 0, 4, 180, 210, 0, 3, 183, 194, 0, 3, 184, 176, 0, 5, 186, 159, 0, 5, 190, 129,
+ 0, 7, 190, 103, 0, 12, 188, 71, 0, 17, 186, 37, 0, 22, 184, 9, 0, 35, 175, 0, 0, 46, 167, 0, 0, 55, 160, 0,
+ 0, 66, 155, 0, 0, 74, 151, 0, 0, 79, 159, 0, 0, 19, 151, 236, 0, 14, 153, 238, 0, 10, 160, 221, 0, 9, 164, 202,
+ 0, 8, 167, 176, 0, 8, 171, 158, 0, 9, 175, 133, 0, 10, 175, 110, 0, 13, 172, 79, 0, 18, 171, 47, 0, 22, 171, 17,
+ 0, 31, 163, 1, 0, 44, 154, 0, 0, 53, 147, 0, 0, 63, 141, 0, 0, 72, 137, 0, 0, 75, 146, 0, 0, 24, 132, 244,
+ 0, 20, 132, 246, 0, 17, 138, 230, 0, 15, 146, 207, 0, 14, 151, 182, 0, 14, 153, 158, 0, 15, 154, 139, 0, 15, 155, 120,
+ 0, 17, 155, 86, 0, 20, 155, 55, 0, 23, 156, 25, 0, 27, 151, 3, 0, 41, 143, 0, 0, 51, 135, 0, 0, 61, 127, 0,
+ 0, 70, 122, 0, 0, 71, 131, 0, 0, 25, 116, 248, 0, 23, 117, 242, 0, 23, 121, 229, 0, 22, 129, 210, 0, 20, 135, 189,
+ 0, 19, 141, 165, 0, 21, 137, 137, 0, 20, 139, 120, 0, 20, 140, 91, 0, 22, 140, 63, 0, 23, 141, 34, 0, 24, 140, 6,
+ 0, 37, 132, 0, 0, 48, 123, 0, 0, 59, 112, 0, 0, 67, 106, 0, 0, 67, 115, 0, 0, 25, 102, 247, 0, 24, 106, 231,
+ 0, 25, 111, 214, 0, 26, 113, 203, 0, 27, 117, 192, 0, 27, 122, 171, 0, 26, 124, 144, 0, 27, 122, 120, 0, 25, 123, 101,
+ 0, 25, 124, 79, 0, 26, 124, 44, 0, 26, 126, 15, 0, 34, 118, 1, 0, 46, 107, 0, 0, 57, 97, 0, 0, 64, 91, 0,
+ 0, 63, 95, 0, 0, 26, 85, 250, 0, 26, 92, 226, 0, 28, 97, 204, 0, 29, 99, 195, 0, 30, 101, 182, 0, 32, 102, 167,
+ 0, 32, 103, 150, 0, 32, 106, 126, 0, 32, 102, 100, 0, 29, 104, 83, 0, 29, 105, 52, 0, 28, 109, 25, 0, 31, 102, 2,
+ 0, 44, 92, 0, 0, 54, 85, 0, 0, 60, 79, 0, 0, 58, 80, 0, 0, 29, 65, 252, 0, 28, 73, 230, 0, 30, 78, 213,
+ 0, 32, 82, 201, 0, 32, 85, 187, 0, 33, 86, 165, 0, 35, 87, 147, 0, 37, 87, 131, 0, 36, 88, 106, 0, 36, 87, 85,
+ 0, 33, 88, 64, 0, 29, 91, 42, 0, 31, 89, 9, 0, 42, 80, 0, 0, 52, 72, 0, 0, 57, 67, 0, 0, 55, 67, 0,
+ 0, 29, 49, 253, 0, 32, 53, 236, 0, 33, 57, 223, 0, 30, 64, 205, 0, 33, 67, 189, 0, 36, 69, 169, 0, 38, 69, 143,
+ 0, 38, 72, 130, 0, 39, 71, 106, 0, 40, 72, 87, 0, 40, 69, 65, 0, 35, 72, 47, 0, 35, 73, 20, 0, 39, 68, 2,
+ 0, 49, 60, 0, 0, 54, 56, 0, 0, 52, 56, 0, 0, 26, 36, 254, 0, 29, 39, 238, 0, 31, 43, 223, 0, 28, 49, 207,
+ 0, 30, 52, 190, 0, 33, 54, 174, 0, 35, 55, 156, 0, 37, 55, 134, 0, 40, 56, 115, 0, 41, 57, 92, 0, 43, 54, 72,
+ 0, 38, 55, 52, 0, 37, 58, 31, 0, 35, 56, 9, 0, 46, 48, 1, 0, 50, 44, 0, 0, 47, 44, 0, 0, 24, 24, 255,
+ 0, 28, 24, 239, 0, 31, 27, 224, 0, 33, 31, 211, 0, 35, 33, 195, 0, 36, 36, 181, 0, 37, 37, 164, 0, 34, 41, 146,
+ 0, 36, 42, 123, 0, 39, 41, 99, 0, 42, 39, 76, 0, 40, 39, 57, 0, 38, 42, 36, 0, 37, 41, 13, 0, 44, 36, 1,
+ 0, 46, 33, 0, 0, 44, 33, 0, 0, 21, 14, 255, 0, 28, 12, 244, 0, 33, 13, 234, 0, 36, 15, 220, 0, 37, 18, 205,
+ 0, 38, 20, 188, 0, 39, 22, 171, 0, 35, 26, 155, 0, 37, 27, 132, 0, 39, 26, 108, 0, 41, 26, 85, 0, 42, 24, 64,
+ 0, 42, 24, 46, 0, 39, 25, 33, 0, 44, 21, 4, 0, 44, 21, 0, 0, 43, 21, 0, 0, 37, 7, 253, 0, 39, 3, 245,
+ 0, 41, 3, 237, 0, 42, 5, 224, 0, 43, 7, 209, 0, 44, 8, 194, 0, 45, 9, 174, 0, 45, 11, 154, 0, 46, 11, 133,
+ 0, 46, 12, 112, 0, 47, 12, 91, 0, 46, 12, 71, 0, 46, 12, 51, 0, 48, 12, 33, 0, 49, 14, 13, 0, 45, 13, 1,
+ 0, 40, 15, 0, 0, 52, 3, 249, 0, 52, 0, 238, 0, 51, 0, 227, 0, 51, 0, 215, 0, 51, 1, 199, 0, 51, 1, 183,
+ 0, 50, 1, 163, 0, 50, 1, 141, 0, 50, 1, 121, 0, 49, 1, 101, 0, 49, 1, 84, 0, 49, 1, 69, 0, 48, 2, 53,
+ 0, 49, 1, 36, 0, 50, 2, 20, 0, 49, 4, 5, 0, 39, 8, 0, 0, 67, 0, 244, 0, 64, 0, 236, 0, 62, 0, 228,
+ 0, 61, 0, 215, 0, 60, 0, 195, 0, 58, 0, 174, 0, 55, 0, 149, 0, 52, 0, 123, 0, 47, 0, 95, 0, 43, 0, 76,
+ 0, 41, 0, 64, 0, 39, 0, 53, 0, 38, 0, 45, 0, 38, 0, 36, 0, 38, 0, 26, 0, 38, 0, 14, 0, 35, 0, 0,
+ 0, 3, 216, 204, 0, 3, 217, 202, 0, 3, 219, 195, 0, 4, 222, 180, 0, 5, 224, 164, 0, 7, 226, 149, 0, 10, 227, 130,
+ 0, 13, 229, 107, 0, 18, 231, 76, 0, 24, 231, 48, 0, 29, 231, 26, 0, 33, 229, 11, 0, 37, 226, 4, 0, 40, 222, 0,
+ 0, 44, 220, 0, 0, 61, 209, 0, 0, 76, 200, 0, 0, 6, 199, 209, 0, 1, 201, 203, 0, 0, 203, 194, 0, 0, 206, 178,
+ 0, 0, 207, 166, 0, 1, 209, 151, 0, 2, 211, 130, 0, 4, 211, 106, 0, 8, 212, 75, 0, 14, 212, 44, 0, 18, 211, 20,
+ 0, 23, 208, 4, 0, 32, 202, 1, 0, 39, 197, 0, 0, 46, 192, 0, 0, 61, 187, 0, 0, 71, 189, 0, 0, 7, 183, 215,
+ 0, 1, 188, 209, 0, 0, 192, 194, 0, 0, 195, 175, 0, 0, 197, 162, 0, 0, 198, 148, 0, 0, 199, 130, 0, 1, 200, 105,
+ 0, 3, 201, 76, 0, 8, 200, 41, 0, 12, 199, 16, 0, 20, 194, 2, 0, 32, 187, 0, 0, 40, 180, 0, 0, 47, 175, 0,
+ 0, 57, 172, 0, 0, 65, 178, 0, 0, 10, 168, 222, 0, 3, 172, 220, 0, 0, 178, 202, 0, 0, 182, 178, 0, 0, 184, 160,
+ 0, 0, 186, 148, 0, 0, 187, 131, 0, 0, 188, 109, 0, 1, 188, 83, 0, 5, 187, 50, 0, 9, 186, 20, 0, 16, 181, 2,
+ 0, 29, 173, 0, 0, 38, 166, 0, 0, 45, 161, 0, 0, 55, 157, 0, 0, 61, 166, 0, 0, 12, 152, 227, 0, 6, 155, 229,
+ 0, 2, 161, 212, 0, 1, 166, 188, 0, 1, 170, 162, 0, 1, 172, 147, 0, 1, 173, 132, 0, 1, 174, 113, 0, 1, 173, 88,
+ 0, 4, 172, 58, 0, 7, 171, 27, 0, 12, 168, 4, 0, 26, 159, 0, 0, 36, 153, 0, 0, 43, 147, 0, 0, 54, 143, 0,
+ 0, 57, 152, 0, 0, 15, 134, 234, 0, 11, 135, 237, 0, 7, 141, 222, 0, 4, 149, 199, 0, 2, 154, 173, 0, 1, 154, 152,
+ 0, 2, 154, 137, 0, 2, 155, 121, 0, 3, 156, 92, 0, 5, 155, 63, 0, 7, 155, 34, 0, 10, 154, 8, 0, 22, 146, 0,
+ 0, 33, 139, 0, 0, 42, 133, 0, 0, 52, 127, 0, 0, 54, 137, 0, 0, 17, 117, 241, 0, 15, 116, 242, 0, 12, 121, 230,
+ 0, 9, 130, 209, 0, 7, 136, 184, 0, 5, 137, 161, 0, 5, 136, 137, 0, 5, 138, 119, 0, 6, 139, 93, 0, 7, 139, 70,
+ 0, 8, 138, 42, 0, 10, 139, 15, 0, 18, 133, 1, 0, 31, 125, 0, 0, 41, 116, 0, 0, 51, 109, 0, 0, 50, 119, 0,
+ 0, 16, 104, 241, 0, 14, 105, 231, 0, 13, 109, 218, 0, 13, 112, 206, 0, 12, 116, 191, 0, 10, 121, 170, 0, 10, 126, 145,
+ 0, 10, 122, 118, 0, 10, 122, 101, 0, 10, 123, 82, 0, 11, 123, 50, 0, 11, 124, 24, 0, 16, 120, 3, 0, 30, 109, 0,
+ 0, 40, 100, 0, 0, 49, 93, 0, 0, 47, 98, 0, 0, 17, 89, 244, 0, 14, 94, 224, 0, 15, 97, 204, 0, 15, 98, 194,
+ 0, 15, 100, 183, 0, 17, 102, 170, 0, 16, 104, 150, 0, 16, 106, 126, 0, 16, 104, 101, 0, 14, 106, 84, 0, 14, 106, 57,
+ 0, 13, 107, 33, 0, 14, 107, 6, 0, 28, 95, 0, 0, 39, 87, 0, 0, 46, 80, 0, 0, 44, 81, 0, 0, 18, 69, 248,
+ 0, 16, 76, 230, 0, 17, 81, 213, 0, 18, 85, 195, 0, 18, 86, 179, 0, 19, 88, 163, 0, 20, 88, 148, 0, 22, 88, 132,
+ 0, 21, 89, 105, 0, 20, 90, 85, 0, 18, 90, 67, 0, 15, 92, 46, 0, 16, 94, 15, 0, 25, 83, 1, 0, 37, 75, 0,
+ 0, 44, 69, 0, 0, 42, 69, 0, 0, 20, 51, 251, 0, 22, 53, 240, 0, 21, 59, 225, 0, 19, 67, 200, 0, 22, 70, 182,
+ 0, 23, 72, 165, 0, 22, 74, 146, 0, 24, 74, 130, 0, 25, 74, 112, 0, 25, 74, 87, 0, 24, 73, 67, 0, 20, 75, 48,
+ 0, 18, 78, 23, 0, 21, 73, 3, 0, 34, 64, 0, 0, 42, 58, 0, 0, 39, 58, 0, 0, 19, 38, 252, 0, 20, 41, 235,
+ 0, 21, 46, 220, 0, 18, 52, 202, 0, 20, 55, 185, 0, 22, 57, 172, 0, 23, 58, 155, 0, 25, 58, 133, 0, 26, 59, 110,
+ 0, 27, 59, 91, 0, 27, 58, 72, 0, 27, 57, 51, 0, 22, 60, 33, 0, 20, 62, 13, 0, 32, 52, 1, 0, 39, 47, 0,
+ 0, 36, 47, 0, 0, 17, 27, 253, 0, 19, 29, 235, 0, 20, 33, 219, 0, 21, 36, 204, 0, 22, 38, 191, 0, 23, 41, 177,
+ 0, 24, 43, 162, 0, 22, 45, 139, 0, 27, 44, 112, 0, 28, 43, 92, 0, 29, 44, 74, 0, 29, 42, 54, 0, 27, 43, 38,
+ 0, 24, 46, 19, 0, 30, 40, 2, 0, 34, 36, 0, 0, 31, 36, 0, 0, 16, 16, 255, 0, 18, 18, 233, 0, 20, 21, 218,
+ 0, 22, 23, 204, 0, 23, 25, 192, 0, 24, 26, 178, 0, 24, 28, 163, 0, 20, 31, 146, 0, 23, 31, 124, 0, 24, 31, 101,
+ 0, 26, 30, 80, 0, 28, 28, 59, 0, 29, 28, 42, 0, 25, 32, 25, 0, 28, 29, 4, 0, 31, 25, 0, 0, 29, 25, 0,
+ 0, 14, 9, 255, 0, 19, 7, 242, 0, 21, 7, 231, 0, 23, 8, 220, 0, 24, 11, 206, 0, 25, 12, 190, 0, 26, 13, 170,
+ 0, 26, 14, 152, 0, 28, 14, 133, 0, 28, 15, 112, 0, 29, 15, 90, 0, 30, 14, 68, 0, 30, 15, 48, 0, 30, 16, 33,
+ 0, 27, 17, 22, 0, 31, 14, 0, 0, 29, 13, 0, 0, 29, 3, 253, 0, 30, 1, 244, 0, 29, 0, 235, 0, 28, 1, 225,
+ 0, 28, 2, 211, 0, 29, 2, 195, 0, 30, 2, 176, 0, 30, 3, 153, 0, 31, 3, 132, 0, 31, 4, 110, 0, 32, 4, 91,
+ 0, 33, 3, 72, 0, 33, 4, 54, 0, 33, 4, 37, 0, 38, 3, 20, 0, 36, 4, 0, 0, 29, 8, 0, 0, 45, 0, 248,
+ 0, 42, 0, 241, 0, 40, 0, 234, 0, 39, 0, 224, 0, 38, 0, 206, 0, 37, 0, 185, 0, 36, 0, 161, 0, 35, 0, 134,
+ 0, 32, 0, 101, 0, 30, 0, 81, 0, 29, 0, 66, 0, 28, 0, 55, 0, 28, 0, 46, 0, 28, 0, 37, 0, 28, 0, 28,
+ 0, 29, 0, 15, 0, 27, 0, 0, 0, 1, 213, 201, 0, 2, 214, 199, 0, 2, 215, 193, 0, 4, 217, 181, 0, 5, 219, 168,
+ 0, 7, 220, 155, 0, 9, 222, 139, 0, 12, 223, 120, 0, 16, 225, 96, 0, 21, 227, 70, 0, 25, 228, 46, 0, 29, 228, 26,
+ 0, 32, 226, 13, 0, 35, 224, 6, 0, 37, 222, 2, 0, 39, 220, 0, 0, 56, 209, 0, 0, 3, 198, 205, 0, 0, 200, 199,
+ 0, 0, 201, 190, 0, 0, 203, 177, 0, 0, 205, 167, 0, 1, 207, 154, 0, 1, 208, 137, 0, 2, 210, 115, 0, 5, 211, 90,
+ 0, 10, 211, 62, 0, 14, 211, 37, 0, 19, 210, 18, 0, 23, 208, 6, 0, 30, 203, 3, 0, 35, 199, 1, 0, 40, 196, 1,
+ 0, 48, 197, 0, 0, 3, 183, 209, 0, 0, 186, 203, 0, 0, 189, 186, 0, 0, 192, 171, 0, 0, 194, 159, 0, 0, 195, 148,
+ 0, 0, 196, 134, 0, 0, 197, 114, 0, 0, 199, 89, 0, 2, 200, 58, 0, 4, 201, 29, 0, 8, 200, 9, 0, 16, 194, 3,
+ 0, 25, 188, 1, 0, 31, 184, 1, 0, 36, 181, 0, 0, 43, 187, 0, 0, 5, 168, 215, 0, 1, 172, 210, 0, 0, 176, 193,
+ 0, 0, 179, 169, 0, 0, 181, 152, 0, 0, 183, 143, 0, 0, 183, 131, 0, 0, 184, 116, 0, 0, 185, 93, 0, 0, 186, 65,
+ 0, 1, 186, 33, 0, 3, 186, 10, 0, 11, 181, 2, 0, 21, 174, 0, 0, 28, 168, 0, 0, 34, 166, 0, 0, 38, 174, 0,
+ 0, 6, 153, 220, 0, 2, 156, 219, 0, 0, 161, 201, 0, 0, 165, 177, 0, 0, 167, 152, 0, 0, 168, 138, 0, 0, 169, 128,
+ 0, 0, 169, 115, 0, 0, 169, 95, 0, 0, 169, 71, 0, 1, 170, 41, 0, 2, 170, 14, 0, 10, 165, 2, 0, 20, 158, 0,
+ 0, 28, 153, 0, 0, 33, 150, 0, 0, 35, 160, 0, 0, 7, 135, 226, 0, 4, 138, 226, 0, 1, 144, 211, 0, 0, 149, 188,
+ 0, 0, 152, 162, 0, 0, 151, 142, 0, 0, 150, 130, 0, 0, 151, 119, 0, 0, 152, 95, 0, 0, 152, 73, 0, 1, 152, 48,
+ 0, 1, 152, 20, 0, 8, 149, 3, 0, 19, 142, 0, 0, 27, 137, 0, 0, 32, 134, 0, 0, 33, 143, 0, 0, 9, 117, 233,
+ 0, 7, 118, 234, 0, 4, 124, 223, 0, 1, 131, 202, 0, 1, 136, 175, 0, 0, 136, 152, 0, 0, 134, 128, 0, 0, 135, 113,
+ 0, 0, 136, 93, 0, 1, 135, 76, 0, 1, 135, 53, 0, 1, 136, 27, 0, 5, 135, 5, 0, 17, 127, 0, 0, 27, 120, 0,
+ 0, 32, 115, 0, 0, 31, 124, 0, 0, 8, 104, 234, 0, 6, 106, 229, 0, 4, 109, 219, 0, 3, 113, 207, 0, 2, 117, 188,
+ 0, 1, 120, 164, 0, 1, 123, 138, 0, 1, 120, 113, 0, 1, 120, 99, 0, 1, 120, 84, 0, 1, 120, 57, 0, 1, 120, 33,
+ 0, 3, 120, 9, 0, 15, 111, 2, 0, 26, 102, 0, 0, 32, 96, 0, 0, 29, 102, 0, 0, 8, 91, 237, 0, 5, 95, 224,
+ 0, 4, 97, 211, 0, 4, 99, 200, 0, 3, 101, 188, 0, 3, 103, 172, 0, 2, 106, 149, 0, 0, 109, 127, 0, 1, 104, 100,
+ 0, 2, 105, 83, 0, 1, 106, 58, 0, 1, 105, 38, 0, 2, 105, 15, 0, 13, 98, 3, 0, 24, 89, 0, 0, 31, 82, 0,
+ 0, 27, 84, 0, 0, 9, 74, 241, 0, 6, 79, 230, 0, 5, 84, 215, 0, 5, 86, 199, 0, 5, 88, 184, 0, 5, 90, 170,
+ 0, 6, 90, 155, 0, 6, 91, 134, 0, 6, 91, 106, 0, 5, 91, 83, 0, 4, 91, 67, 0, 2, 92, 49, 0, 2, 92, 22,
+ 0, 9, 88, 4, 0, 22, 78, 0, 0, 29, 71, 0, 0, 26, 72, 0, 0, 10, 54, 246, 0, 11, 56, 239, 0, 10, 61, 227,
+ 0, 7, 70, 204, 0, 7, 74, 185, 0, 7, 76, 167, 0, 9, 75, 143, 0, 10, 76, 131, 0, 12, 75, 112, 0, 11, 77, 87,
+ 0, 11, 75, 68, 0, 7, 78, 50, 0, 4, 79, 26, 0, 5, 79, 6, 0, 19, 68, 1, 0, 27, 61, 0, 0, 25, 61, 0,
+ 0, 10, 39, 249, 0, 12, 41, 238, 0, 12, 46, 224, 0, 9, 54, 205, 0, 9, 57, 188, 0, 9, 60, 173, 0, 11, 61, 154,
+ 0, 11, 63, 133, 0, 13, 62, 110, 0, 14, 61, 93, 0, 13, 61, 71, 0, 11, 62, 51, 0, 8, 63, 34, 0, 5, 65, 17,
+ 0, 17, 58, 3, 0, 26, 50, 0, 0, 23, 49, 0, 0, 9, 29, 249, 0, 10, 34, 229, 0, 10, 38, 214, 0, 10, 40, 202,
+ 0, 11, 41, 190, 0, 12, 43, 176, 0, 13, 45, 162, 0, 12, 47, 137, 0, 15, 46, 111, 0, 15, 47, 92, 0, 16, 47, 75,
+ 0, 16, 46, 54, 0, 16, 45, 35, 0, 11, 49, 21, 0, 15, 46, 4, 0, 21, 40, 0, 0, 20, 39, 0, 0, 8, 18, 253,
+ 0, 10, 24, 226, 0, 10, 28, 210, 0, 10, 29, 199, 0, 10, 30, 187, 0, 11, 31, 174, 0, 11, 32, 161, 0, 8, 35, 139,
+ 0, 11, 34, 115, 0, 13, 34, 95, 0, 16, 32, 76, 0, 16, 32, 59, 0, 17, 32, 40, 0, 12, 35, 24, 0, 11, 37, 8,
+ 0, 15, 32, 2, 0, 16, 29, 0, 0, 8, 10, 255, 0, 10, 16, 224, 0, 10, 18, 208, 0, 10, 18, 197, 0, 11, 19, 186,
+ 0, 11, 19, 173, 0, 12, 19, 160, 0, 12, 19, 143, 0, 13, 20, 122, 0, 10, 22, 103, 0, 12, 21, 82, 0, 14, 20, 63,
+ 0, 15, 20, 43, 0, 15, 20, 27, 0, 11, 23, 9, 0, 16, 21, 0, 0, 14, 19, 0, 0, 7, 4, 255, 0, 11, 4, 242,
+ 0, 11, 4, 231, 0, 11, 4, 219, 0, 11, 5, 204, 0, 11, 5, 188, 0, 12, 5, 172, 0, 13, 6, 149, 0, 13, 7, 129,
+ 0, 10, 10, 109, 0, 11, 9, 89, 0, 14, 8, 71, 0, 15, 8, 51, 0, 15, 8, 35, 0, 18, 6, 22, 0, 13, 8, 11,
+ 0, 14, 7, 0, 0, 22, 0, 251, 0, 20, 0, 247, 0, 18, 0, 241, 0, 16, 0, 232, 0, 15, 0, 217, 0, 14, 0, 198,
+ 0, 14, 0, 179, 0, 14, 0, 155, 0, 15, 0, 119, 0, 15, 0, 97, 0, 15, 0, 78, 0, 15, 0, 61, 0, 16, 0, 49,
+ 0, 15, 0, 37, 0, 15, 0, 26, 0, 14, 0, 14, 0, 13, 0, 0, 0, 0, 211, 197, 0, 0, 210, 195, 0, 2, 211, 190,
+ 0, 3, 212, 180, 0, 5, 213, 170, 0, 7, 214, 159, 0, 9, 215, 146, 0, 12, 217, 131, 0, 15, 218, 113, 0, 19, 221, 92,
+ 0, 23, 222, 69, 0, 27, 223, 48, 0, 30, 223, 31, 0, 32, 222, 18, 0, 33, 221, 9, 0, 33, 221, 4, 0, 33, 220, 0,
+ 0, 0, 196, 201, 0, 0, 202, 186, 0, 0, 203, 180, 0, 0, 204, 171, 0, 0, 206, 161, 0, 0, 207, 151, 0, 2, 209, 141,
+ 0, 4, 209, 126, 0, 7, 210, 109, 0, 11, 211, 87, 0, 16, 211, 65, 0, 20, 211, 48, 0, 24, 211, 34, 0, 26, 210, 23,
+ 0, 27, 208, 14, 0, 26, 207, 7, 0, 22, 205, 0, 0, 0, 182, 205, 0, 0, 188, 192, 0, 0, 194, 173, 0, 0, 195, 164,
+ 0, 0, 197, 153, 0, 0, 198, 145, 0, 0, 199, 135, 0, 0, 199, 121, 0, 0, 200, 103, 0, 2, 203, 80, 0, 6, 203, 56,
+ 0, 10, 203, 39, 0, 14, 202, 25, 0, 16, 201, 14, 0, 17, 199, 7, 0, 17, 198, 2, 0, 16, 195, 0, 0, 0, 169, 208,
+ 0, 0, 174, 199, 0, 0, 179, 182, 0, 0, 183, 159, 0, 0, 185, 146, 0, 0, 186, 137, 0, 0, 187, 129, 0, 0, 187, 118,
+ 0, 0, 188, 102, 0, 0, 190, 80, 0, 0, 191, 54, 0, 2, 192, 32, 0, 4, 192, 17, 0, 6, 191, 6, 0, 9, 188, 1,
+ 0, 11, 185, 0, 0, 11, 184, 0, 0, 0, 154, 212, 0, 0, 159, 204, 0, 0, 164, 189, 0, 0, 168, 168, 0, 0, 171, 142,
+ 0, 0, 172, 131, 0, 0, 172, 122, 0, 0, 173, 113, 0, 0, 173, 101, 0, 0, 173, 85, 0, 0, 174, 64, 0, 0, 176, 38,
+ 0, 0, 176, 16, 0, 1, 175, 3, 0, 6, 171, 0, 0, 9, 169, 0, 0, 9, 167, 0, 0, 0, 137, 217, 0, 0, 142, 210,
+ 0, 0, 148, 197, 0, 0, 152, 177, 0, 0, 154, 152, 0, 0, 155, 123, 0, 0, 155, 114, 0, 0, 155, 107, 0, 0, 155, 98,
+ 0, 0, 155, 86, 0, 0, 155, 68, 0, 0, 156, 45, 0, 0, 157, 20, 0, 0, 156, 3, 0, 6, 152, 0, 0, 8, 150, 0,
+ 0, 8, 149, 0, 0, 0, 120, 222, 0, 0, 124, 218, 0, 0, 130, 206, 0, 0, 135, 188, 0, 0, 138, 164, 0, 0, 139, 136,
+ 0, 0, 137, 107, 0, 0, 137, 100, 0, 0, 136, 93, 0, 0, 136, 83, 0, 0, 135, 69, 0, 0, 136, 50, 0, 0, 136, 27,
+ 0, 0, 136, 6, 0, 4, 133, 0, 0, 8, 131, 0, 0, 7, 129, 0, 0, 0, 105, 226, 0, 0, 108, 220, 0, 0, 113, 211,
+ 0, 0, 117, 199, 0, 0, 121, 177, 0, 0, 124, 151, 0, 0, 122, 121, 0, 0, 119, 94, 0, 0, 119, 89, 0, 0, 118, 81,
+ 0, 0, 117, 67, 0, 0, 117, 50, 0, 0, 116, 31, 0, 0, 116, 12, 0, 4, 114, 2, 0, 7, 110, 0, 0, 7, 108, 0,
+ 0, 0, 92, 229, 0, 0, 96, 219, 0, 0, 99, 210, 0, 0, 101, 200, 0, 0, 104, 185, 0, 0, 108, 164, 0, 0, 108, 137,
+ 0, 0, 105, 108, 0, 0, 101, 79, 0, 0, 101, 75, 0, 0, 100, 64, 0, 0, 99, 50, 0, 0, 98, 34, 0, 0, 97, 17,
+ 0, 2, 96, 4, 0, 6, 91, 0, 0, 7, 90, 0, 0, 0, 78, 233, 0, 0, 82, 225, 0, 0, 85, 214, 0, 0, 88, 201,
+ 0, 0, 90, 186, 0, 0, 93, 168, 0, 0, 93, 146, 0, 0, 92, 124, 0, 0, 89, 88, 0, 0, 89, 69, 0, 0, 88, 63,
+ 0, 0, 88, 53, 0, 0, 87, 36, 0, 0, 86, 21, 0, 0, 84, 6, 0, 4, 80, 0, 0, 8, 76, 0, 0, 0, 59, 239,
+ 0, 0, 60, 235, 0, 0, 66, 225, 0, 0, 73, 207, 0, 0, 77, 188, 0, 0, 79, 166, 0, 0, 72, 134, 0, 0, 73, 120,
+ 0, 0, 75, 98, 0, 0, 75, 73, 0, 0, 77, 59, 0, 0, 76, 52, 0, 0, 76, 37, 0, 0, 75, 24, 0, 0, 73, 9,
+ 0, 4, 70, 1, 0, 8, 65, 0, 0, 0, 41, 244, 0, 0, 43, 234, 0, 0, 48, 222, 0, 0, 54, 207, 0, 0, 60, 191,
+ 0, 0, 65, 169, 0, 0, 64, 145, 0, 0, 63, 124, 0, 0, 60, 95, 0, 0, 59, 80, 0, 0, 62, 61, 0, 0, 64, 48,
+ 0, 0, 63, 39, 0, 0, 62, 28, 0, 0, 61, 11, 0, 2, 60, 1, 0, 8, 54, 0, 0, 0, 28, 247, 0, 0, 33, 232,
+ 0, 0, 37, 220, 0, 0, 40, 205, 0, 0, 43, 189, 0, 0, 46, 172, 0, 0, 49, 155, 0, 0, 50, 130, 0, 0, 48, 95,
+ 0, 0, 46, 78, 0, 0, 46, 67, 0, 0, 46, 46, 0, 0, 49, 35, 0, 0, 50, 27, 0, 0, 49, 14, 0, 1, 48, 3,
+ 0, 6, 43, 0, 0, 0, 19, 250, 0, 0, 31, 215, 0, 0, 34, 203, 0, 0, 35, 193, 0, 0, 35, 181, 0, 0, 35, 171,
+ 0, 0, 35, 157, 0, 0, 37, 134, 0, 0, 36, 104, 0, 0, 34, 82, 0, 0, 34, 64, 0, 0, 33, 52, 0, 0, 33, 35,
+ 0, 0, 37, 27, 0, 0, 37, 18, 0, 0, 36, 9, 0, 3, 33, 0, 0, 0, 11, 252, 0, 0, 23, 210, 0, 0, 26, 197,
+ 0, 0, 26, 188, 0, 0, 26, 178, 0, 0, 25, 167, 0, 0, 24, 155, 0, 0, 25, 137, 0, 0, 24, 111, 0, 0, 25, 85,
+ 0, 0, 24, 67, 0, 0, 22, 52, 0, 0, 22, 38, 0, 0, 22, 27, 0, 0, 25, 18, 0, 0, 25, 11, 0, 0, 24, 0,
+ 0, 0, 4, 255, 0, 0, 16, 210, 0, 0, 19, 194, 0, 0, 18, 182, 0, 0, 17, 170, 0, 0, 15, 160, 0, 0, 14, 148,
+ 0, 0, 13, 131, 0, 0, 13, 104, 0, 0, 14, 81, 0, 0, 14, 67, 0, 0, 13, 56, 0, 0, 13, 43, 0, 0, 13, 30,
+ 0, 0, 12, 17, 0, 0, 13, 9, 0, 0, 12, 0, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 251, 0, 0, 0, 236,
+ 0, 0, 0, 215, 0, 0, 0, 196, 0, 0, 0, 177, 0, 0, 0, 150, 0, 0, 0, 118, 0, 0, 0, 96, 0, 0, 0, 82,
+ 0, 0, 0, 67, 0, 0, 0, 51, 0, 0, 0, 35, 0, 0, 0, 19, 0, 0, 0, 10, 0, 0, 0, 0
+};
+
+// Acapulco Best KCMY RGB
+unsigned char ucMapDJ4100_KCMY_BestA_12x12x1[] =
+{
+ 0, 226, 237, 232, 0, 229, 225, 208, 0, 231, 213, 185, 0, 233, 201, 161, 0, 235, 196, 136, 0, 239, 192, 116, 0, 244, 187, 103,
+ 0, 246, 181, 89, 0, 247, 171, 73, 0, 249, 161, 56, 0, 250, 152, 38, 0, 251, 143, 20, 0, 251, 136, 6, 0, 250, 131, 0,
+ 0, 251, 129, 0, 0, 252, 127, 0, 0, 252, 125, 0, 0, 219, 211, 234, 0, 230, 219, 224, 0, 232, 209, 189, 0, 232, 192, 159,
+ 0, 235, 190, 128, 0, 242, 185, 103, 0, 245, 182, 91, 0, 247, 174, 77, 0, 248, 165, 63, 0, 249, 157, 47, 0, 250, 149, 30,
+ 0, 251, 141, 14, 0, 250, 135, 2, 0, 249, 132, 0, 0, 248, 131, 0, 0, 248, 129, 0, 0, 247, 127, 0, 0, 212, 186, 237,
+ 0, 220, 194, 234, 0, 234, 200, 216, 0, 232, 185, 171, 0, 232, 179, 134, 0, 237, 177, 104, 0, 242, 171, 82, 0, 247, 163, 62,
+ 0, 248, 157, 47, 0, 249, 150, 32, 0, 249, 143, 18, 0, 248, 137, 6, 0, 245, 134, 0, 0, 244, 133, 0, 0, 243, 132, 0,
+ 0, 242, 130, 0, 0, 242, 128, 0, 0, 209, 171, 239, 0, 213, 173, 235, 0, 218, 169, 216, 0, 226, 170, 186, 0, 228, 164, 147,
+ 0, 230, 161, 114, 0, 234, 158, 88, 0, 239, 153, 63, 0, 240, 149, 44, 0, 239, 145, 30, 0, 239, 141, 17, 0, 239, 136, 7,
+ 0, 236, 134, 1, 0, 233, 132, 0, 0, 233, 131, 0, 0, 233, 129, 0, 0, 232, 127, 0, 0, 206, 153, 241, 0, 210, 152, 238,
+ 0, 214, 149, 220, 0, 218, 150, 191, 0, 221, 149, 161, 0, 225, 145, 128, 0, 226, 143, 100, 0, 229, 140, 74, 0, 229, 138, 55,
+ 0, 226, 137, 42, 0, 225, 136, 29, 0, 224, 134, 18, 0, 223, 132, 9, 0, 222, 131, 5, 0, 221, 129, 3, 0, 220, 127, 1,
+ 0, 220, 124, 0, 0, 206, 129, 243, 0, 210, 125, 240, 0, 212, 126, 224, 0, 211, 129, 195, 0, 212, 132, 168, 0, 215, 130, 138,
+ 0, 218, 129, 112, 0, 221, 127, 85, 0, 220, 126, 64, 0, 217, 127, 50, 0, 215, 127, 39, 0, 214, 126, 28, 0, 214, 125, 17,
+ 0, 213, 123, 11, 0, 212, 122, 7, 0, 211, 120, 3, 0, 210, 118, 0, 0, 207, 103, 245, 0, 210, 100, 243, 0, 211, 102, 228,
+ 0, 207, 107, 199, 0, 208, 113, 175, 0, 210, 114, 150, 0, 212, 113, 119, 0, 214, 113, 96, 0, 215, 111, 73, 0, 213, 113, 55,
+ 0, 211, 114, 42, 0, 209, 115, 32, 0, 208, 115, 22, 0, 207, 114, 15, 0, 206, 113, 9, 0, 205, 112, 4, 0, 204, 110, 0,
+ 0, 207, 79, 246, 0, 209, 76, 244, 0, 210, 78, 233, 0, 206, 87, 206, 0, 205, 93, 183, 0, 206, 95, 160, 0, 208, 97, 132,
+ 0, 209, 96, 101, 0, 212, 96, 81, 0, 212, 95, 61, 0, 210, 98, 45, 0, 207, 102, 34, 0, 204, 104, 24, 0, 202, 104, 17,
+ 0, 200, 104, 11, 0, 199, 102, 5, 0, 197, 101, 0, 0, 206, 57, 247, 0, 208, 54, 246, 0, 210, 55, 238, 0, 205, 65, 213,
+ 0, 203, 73, 189, 0, 204, 77, 168, 0, 205, 79, 144, 0, 206, 80, 115, 0, 206, 80, 86, 0, 208, 80, 68, 0, 209, 81, 50,
+ 0, 206, 85, 37, 0, 203, 89, 26, 0, 199, 93, 18, 0, 196, 94, 12, 0, 193, 93, 6, 0, 191, 92, 0, 0, 203, 37, 247,
+ 0, 206, 34, 247, 0, 208, 32, 243, 0, 206, 42, 222, 0, 201, 52, 195, 0, 201, 58, 174, 0, 201, 62, 153, 0, 202, 63, 128,
+ 0, 202, 64, 99, 0, 202, 64, 71, 0, 204, 65, 55, 0, 205, 68, 41, 0, 203, 73, 29, 0, 199, 78, 20, 0, 194, 81, 12,
+ 0, 190, 82, 6, 0, 187, 82, 0, 0, 200, 22, 247, 0, 202, 18, 246, 0, 203, 17, 241, 0, 203, 22, 226, 0, 201, 34, 202,
+ 0, 199, 39, 181, 0, 198, 44, 161, 0, 198, 47, 139, 0, 199, 48, 113, 0, 199, 49, 85, 0, 199, 51, 59, 0, 201, 54, 45,
+ 0, 201, 57, 33, 0, 199, 62, 23, 0, 194, 67, 14, 0, 189, 71, 7, 0, 185, 73, 0, 0, 198, 15, 247, 0, 199, 12, 246,
+ 0, 200, 11, 239, 0, 199, 13, 226, 0, 197, 22, 205, 0, 196, 26, 186, 0, 195, 31, 167, 0, 195, 35, 148, 0, 195, 37, 126,
+ 0, 197, 38, 101, 0, 198, 39, 75, 0, 197, 41, 48, 0, 198, 43, 36, 0, 197, 46, 25, 0, 194, 52, 15, 0, 189, 57, 7,
+ 0, 185, 62, 0, 0, 196, 11, 247, 0, 197, 9, 246, 0, 198, 8, 240, 0, 197, 10, 228, 0, 195, 16, 209, 0, 193, 18, 191,
+ 0, 193, 22, 174, 0, 193, 26, 156, 0, 192, 29, 138, 0, 193, 31, 115, 0, 195, 31, 91, 0, 196, 31, 66, 0, 196, 32, 38,
+ 0, 195, 34, 27, 0, 193, 38, 17, 0, 189, 43, 8, 0, 185, 48, 0, 0, 195, 8, 247, 0, 196, 6, 246, 0, 196, 5, 241,
+ 0, 195, 6, 230, 0, 194, 9, 214, 0, 192, 13, 197, 0, 191, 15, 180, 0, 191, 18, 164, 0, 190, 21, 147, 0, 191, 22, 127,
+ 0, 192, 23, 105, 0, 193, 23, 81, 0, 194, 23, 55, 0, 194, 23, 27, 0, 191, 26, 17, 0, 188, 30, 8, 0, 185, 35, 0,
+ 0, 193, 6, 247, 0, 194, 4, 246, 0, 194, 3, 241, 0, 193, 4, 231, 0, 193, 5, 218, 0, 191, 8, 202, 0, 190, 9, 186,
+ 0, 190, 11, 170, 0, 189, 13, 154, 0, 189, 14, 137, 0, 189, 15, 116, 0, 190, 15, 94, 0, 191, 14, 71, 0, 192, 14, 45,
+ 0, 192, 15, 17, 0, 188, 18, 8, 0, 185, 22, 0, 0, 192, 3, 246, 0, 192, 2, 245, 0, 192, 2, 241, 0, 192, 2, 232,
+ 0, 191, 2, 221, 0, 190, 4, 206, 0, 189, 4, 192, 0, 189, 5, 177, 0, 188, 6, 162, 0, 188, 7, 145, 0, 188, 7, 126,
+ 0, 188, 7, 106, 0, 189, 7, 84, 0, 189, 6, 61, 0, 190, 7, 35, 0, 190, 7, 8, 0, 185, 10, 0, 0, 190, 0, 246,
+ 0, 190, 0, 244, 0, 190, 0, 239, 0, 189, 0, 232, 0, 189, 0, 222, 0, 188, 0, 209, 0, 188, 0, 196, 0, 187, 0, 183,
+ 0, 187, 0, 168, 0, 187, 0, 152, 0, 187, 0, 135, 0, 187, 0, 116, 0, 187, 0, 96, 0, 187, 0, 75, 0, 187, 0, 51,
+ 0, 187, 0, 27, 0, 187, 0, 0, 0, 209, 226, 235, 0, 198, 241, 212, 0, 215, 219, 180, 0, 212, 212, 156, 0, 212, 206, 125,
+ 0, 218, 201, 99, 0, 225, 195, 78, 0, 228, 185, 58, 0, 231, 175, 44, 0, 233, 168, 34, 0, 235, 160, 22, 0, 238, 153, 9,
+ 0, 238, 147, 2, 0, 241, 142, 0, 0, 244, 138, 0, 0, 245, 134, 0, 0, 247, 131, 0, 0, 209, 213, 238, 0, 214, 217, 231,
+ 0, 216, 218, 200, 0, 220, 200, 158, 0, 226, 193, 122, 0, 235, 182, 93, 0, 241, 176, 70, 0, 244, 168, 55, 0, 245, 161, 42,
+ 0, 247, 153, 29, 0, 248, 146, 17, 0, 248, 139, 5, 0, 246, 135, 0, 0, 243, 133, 0, 0, 242, 132, 0, 0, 242, 131, 0,
+ 0, 240, 130, 0, 0, 201, 188, 241, 0, 205, 189, 239, 0, 216, 198, 228, 0, 217, 179, 170, 0, 222, 178, 133, 0, 230, 175, 102,
+ 0, 238, 168, 74, 0, 244, 160, 51, 0, 248, 152, 33, 0, 250, 145, 19, 0, 250, 138, 7, 0, 248, 134, 1, 0, 243, 132, 0,
+ 0, 239, 131, 0, 0, 237, 131, 0, 0, 236, 130, 0, 0, 235, 130, 0, 0, 202, 171, 241, 0, 206, 170, 240, 0, 212, 168, 226,
+ 0, 213, 167, 188, 0, 216, 164, 151, 0, 221, 161, 117, 0, 227, 157, 86, 0, 233, 153, 58, 0, 238, 146, 35, 0, 243, 139, 15,
+ 0, 244, 133, 3, 0, 240, 131, 0, 0, 235, 131, 0, 0, 231, 130, 0, 0, 228, 130, 0, 0, 227, 129, 0, 0, 227, 129, 0,
+ 0, 202, 151, 243, 0, 206, 147, 241, 0, 211, 143, 231, 0, 210, 145, 196, 0, 211, 148, 166, 0, 215, 144, 132, 0, 217, 142, 101,
+ 0, 223, 139, 74, 0, 228, 136, 49, 0, 232, 131, 27, 0, 234, 127, 8, 0, 230, 126, 2, 0, 225, 127, 1, 0, 221, 127, 0,
+ 0, 218, 126, 0, 0, 217, 126, 0, 0, 217, 126, 0, 0, 203, 127, 245, 0, 206, 123, 244, 0, 211, 119, 237, 0, 209, 122, 204,
+ 0, 208, 129, 175, 0, 211, 129, 146, 0, 213, 128, 117, 0, 216, 126, 88, 0, 217, 125, 64, 0, 221, 123, 43, 0, 224, 119, 23,
+ 0, 223, 116, 7, 0, 219, 117, 2, 0, 215, 118, 1, 0, 212, 118, 1, 0, 211, 118, 0, 0, 210, 119, 0, 0, 203, 102, 246,
+ 0, 206, 100, 245, 0, 210, 95, 241, 0, 209, 100, 215, 0, 207, 107, 185, 0, 208, 111, 158, 0, 210, 111, 129, 0, 212, 111, 102,
+ 0, 214, 109, 76, 0, 214, 110, 54, 0, 214, 109, 36, 0, 214, 108, 19, 0, 213, 106, 7, 0, 211, 107, 2, 0, 208, 108, 1,
+ 0, 206, 109, 0, 0, 203, 110, 0, 0, 204, 78, 246, 0, 205, 76, 246, 0, 209, 73, 243, 0, 207, 79, 222, 0, 204, 88, 192,
+ 0, 205, 91, 168, 0, 207, 93, 142, 0, 209, 94, 113, 0, 211, 93, 88, 0, 212, 93, 65, 0, 210, 95, 45, 0, 209, 96, 27,
+ 0, 208, 95, 13, 0, 206, 96, 4, 0, 203, 97, 1, 0, 200, 99, 0, 0, 197, 101, 0, 0, 203, 57, 247, 0, 204, 56, 247,
+ 0, 207, 52, 245, 0, 207, 56, 228, 0, 202, 67, 199, 0, 202, 73, 176, 0, 204, 76, 152, 0, 204, 77, 125, 0, 206, 77, 98,
+ 0, 207, 77, 75, 0, 208, 78, 55, 0, 207, 80, 36, 0, 205, 83, 20, 0, 203, 84, 8, 0, 199, 86, 2, 0, 195, 88, 1,
+ 0, 190, 92, 0, 0, 200, 36, 248, 0, 201, 36, 248, 0, 204, 33, 246, 0, 205, 36, 235, 0, 201, 50, 206, 0, 200, 55, 183,
+ 0, 200, 59, 160, 0, 200, 61, 136, 0, 201, 62, 108, 0, 202, 62, 84, 0, 203, 62, 64, 0, 204, 63, 45, 0, 203, 67, 28,
+ 0, 200, 71, 14, 0, 196, 75, 6, 0, 191, 78, 1, 0, 185, 82, 0, 0, 197, 21, 247, 0, 198, 22, 247, 0, 200, 19, 246,
+ 0, 202, 18, 237, 0, 200, 31, 212, 0, 198, 36, 190, 0, 197, 42, 168, 0, 197, 45, 146, 0, 197, 47, 121, 0, 198, 47, 95,
+ 0, 199, 47, 72, 0, 200, 48, 53, 0, 200, 51, 35, 0, 198, 55, 21, 0, 195, 61, 10, 0, 190, 66, 3, 0, 183, 72, 0,
+ 0, 195, 15, 247, 0, 195, 10, 247, 0, 197, 7, 245, 0, 198, 7, 236, 0, 196, 16, 215, 0, 195, 23, 194, 0, 194, 28, 174,
+ 0, 194, 31, 154, 0, 194, 33, 132, 0, 195, 34, 107, 0, 196, 35, 83, 0, 196, 35, 61, 0, 197, 37, 42, 0, 196, 40, 27,
+ 0, 193, 45, 14, 0, 189, 52, 5, 0, 181, 61, 0, 0, 194, 11, 247, 0, 193, 3, 246, 0, 193, 1, 242, 0, 194, 2, 233,
+ 0, 193, 7, 214, 0, 192, 12, 196, 0, 191, 16, 178, 0, 190, 19, 160, 0, 190, 22, 140, 0, 191, 25, 119, 0, 192, 25, 95,
+ 0, 193, 25, 72, 0, 193, 25, 48, 0, 193, 28, 31, 0, 191, 31, 18, 0, 188, 37, 7, 0, 181, 47, 0, 0, 193, 8, 247,
+ 0, 189, 1, 241, 0, 189, 0, 237, 0, 190, 1, 229, 0, 190, 2, 215, 0, 189, 5, 199, 0, 188, 8, 182, 0, 187, 11, 165,
+ 0, 187, 13, 147, 0, 187, 15, 128, 0, 188, 16, 106, 0, 189, 15, 83, 0, 190, 15, 59, 0, 191, 15, 36, 0, 189, 19, 21,
+ 0, 186, 25, 10, 0, 182, 34, 0, 0, 192, 5, 247, 0, 187, 1, 238, 0, 186, 0, 233, 0, 187, 0, 226, 0, 187, 1, 215,
+ 0, 187, 1, 202, 0, 186, 3, 186, 0, 185, 4, 170, 0, 185, 6, 153, 0, 185, 7, 136, 0, 185, 8, 116, 0, 186, 8, 94,
+ 0, 186, 7, 72, 0, 187, 7, 47, 0, 188, 7, 24, 0, 185, 12, 11, 0, 180, 22, 0, 0, 190, 3, 246, 0, 185, 0, 237,
+ 0, 184, 0, 232, 0, 185, 0, 225, 0, 185, 0, 216, 0, 184, 0, 203, 0, 184, 1, 189, 0, 184, 1, 174, 0, 183, 1, 159,
+ 0, 183, 2, 142, 0, 183, 2, 124, 0, 183, 2, 104, 0, 184, 2, 83, 0, 184, 2, 60, 0, 185, 1, 37, 0, 184, 2, 14,
+ 0, 179, 9, 0, 0, 189, 0, 246, 0, 186, 0, 235, 0, 186, 0, 232, 0, 186, 0, 226, 0, 186, 0, 217, 0, 186, 0, 205,
+ 0, 184, 0, 192, 0, 184, 0, 178, 0, 183, 0, 164, 0, 183, 0, 148, 0, 183, 0, 131, 0, 183, 0, 112, 0, 182, 0, 93,
+ 0, 182, 0, 72, 0, 182, 0, 48, 0, 182, 0, 25, 0, 181, 0, 0, 0, 192, 215, 238, 0, 175, 233, 228, 0, 169, 246, 192,
+ 0, 193, 225, 156, 0, 197, 213, 122, 0, 201, 207, 95, 0, 206, 200, 73, 0, 209, 192, 53, 0, 212, 182, 40, 0, 214, 173, 32,
+ 0, 217, 165, 25, 0, 219, 157, 15, 0, 223, 151, 7, 0, 229, 148, 3, 0, 233, 144, 0, 0, 238, 141, 0, 0, 240, 138, 0,
+ 0, 192, 204, 242, 0, 196, 211, 239, 0, 194, 220, 200, 0, 201, 207, 157, 0, 204, 200, 119, 0, 208, 194, 89, 0, 213, 185, 64,
+ 0, 217, 175, 43, 0, 224, 168, 21, 0, 228, 159, 7, 0, 230, 153, 4, 0, 230, 148, 2, 0, 229, 145, 1, 0, 229, 142, 0,
+ 0, 231, 140, 0, 0, 232, 137, 0, 0, 234, 136, 0, 0, 192, 189, 244, 0, 197, 189, 243, 0, 198, 181, 210, 0, 201, 184, 168,
+ 0, 205, 181, 134, 0, 211, 176, 103, 0, 219, 168, 77, 0, 226, 162, 53, 0, 233, 156, 29, 0, 239, 147, 9, 0, 239, 141, 1,
+ 0, 237, 138, 0, 0, 233, 137, 0, 0, 230, 135, 0, 0, 227, 134, 0, 0, 226, 133, 0, 0, 227, 132, 0, 0, 195, 169, 244,
+ 0, 197, 168, 240, 0, 199, 167, 219, 0, 199, 165, 185, 0, 203, 163, 150, 0, 207, 161, 118, 0, 212, 159, 90, 0, 218, 154, 64,
+ 0, 224, 150, 41, 0, 230, 144, 18, 0, 233, 137, 2, 0, 230, 135, 0, 0, 226, 134, 0, 0, 223, 133, 0, 0, 220, 131, 0,
+ 0, 218, 130, 0, 0, 219, 131, 0, 0, 196, 147, 245, 0, 199, 145, 243, 0, 201, 144, 230, 0, 198, 144, 192, 0, 200, 148, 165,
+ 0, 203, 145, 133, 0, 207, 143, 103, 0, 210, 141, 77, 0, 214, 139, 53, 0, 217, 136, 31, 0, 221, 132, 9, 0, 219, 130, 1,
+ 0, 217, 129, 0, 0, 215, 128, 0, 0, 213, 127, 0, 0, 213, 126, 0, 0, 213, 127, 0, 0, 198, 126, 246, 0, 201, 122, 245,
+ 0, 204, 119, 238, 0, 200, 124, 203, 0, 200, 129, 175, 0, 202, 130, 148, 0, 206, 129, 118, 0, 208, 128, 90, 0, 210, 127, 66,
+ 0, 212, 125, 43, 0, 214, 121, 22, 0, 215, 119, 5, 0, 213, 119, 0, 0, 211, 119, 0, 0, 209, 119, 0, 0, 208, 119, 0,
+ 0, 207, 120, 0, 0, 199, 102, 247, 0, 201, 99, 246, 0, 205, 95, 243, 0, 203, 102, 216, 0, 201, 108, 185, 0, 202, 111, 159,
+ 0, 204, 112, 131, 0, 206, 112, 103, 0, 207, 111, 77, 0, 208, 112, 55, 0, 209, 110, 35, 0, 210, 108, 15, 0, 210, 106, 3,
+ 0, 208, 107, 0, 0, 205, 109, 0, 0, 203, 109, 0, 0, 201, 111, 0, 0, 199, 79, 247, 0, 201, 76, 247, 0, 204, 73, 245,
+ 0, 203, 79, 224, 0, 200, 87, 193, 0, 201, 91, 169, 0, 202, 93, 143, 0, 204, 94, 116, 0, 206, 94, 90, 0, 206, 94, 67,
+ 0, 206, 96, 45, 0, 206, 96, 25, 0, 205, 95, 9, 0, 204, 95, 1, 0, 201, 97, 0, 0, 198, 99, 0, 0, 195, 101, 0,
+ 0, 198, 58, 248, 0, 200, 57, 248, 0, 203, 53, 246, 0, 203, 57, 230, 0, 199, 68, 201, 0, 199, 72, 178, 0, 200, 76, 154,
+ 0, 201, 77, 128, 0, 202, 77, 101, 0, 203, 78, 78, 0, 204, 79, 57, 0, 203, 81, 37, 0, 202, 82, 18, 0, 200, 83, 5,
+ 0, 196, 85, 0, 0, 193, 88, 0, 0, 189, 92, 0, 0, 196, 37, 248, 0, 197, 37, 248, 0, 200, 35, 247, 0, 202, 38, 235,
+ 0, 198, 51, 207, 0, 196, 55, 185, 0, 197, 59, 163, 0, 197, 61, 139, 0, 198, 62, 112, 0, 199, 62, 87, 0, 200, 63, 66,
+ 0, 201, 64, 47, 0, 200, 66, 27, 0, 197, 70, 12, 0, 194, 74, 3, 0, 189, 77, 0, 0, 183, 82, 0, 0, 193, 22, 247,
+ 0, 194, 23, 247, 0, 197, 21, 247, 0, 199, 21, 238, 0, 197, 32, 214, 0, 195, 38, 192, 0, 194, 42, 171, 0, 194, 46, 149,
+ 0, 195, 47, 124, 0, 196, 48, 98, 0, 196, 48, 76, 0, 197, 48, 55, 0, 197, 50, 36, 0, 195, 54, 20, 0, 192, 59, 7,
+ 0, 187, 65, 1, 0, 179, 72, 0, 0, 192, 15, 247, 0, 192, 10, 247, 0, 194, 8, 245, 0, 196, 9, 237, 0, 194, 17, 218,
+ 0, 193, 23, 197, 0, 192, 28, 176, 0, 191, 31, 156, 0, 192, 33, 134, 0, 192, 35, 110, 0, 193, 35, 86, 0, 193, 35, 64,
+ 0, 193, 36, 44, 0, 193, 38, 27, 0, 190, 43, 13, 0, 186, 50, 3, 0, 178, 60, 0, 0, 191, 11, 247, 0, 189, 2, 245,
+ 0, 190, 1, 240, 0, 191, 1, 232, 0, 190, 7, 216, 0, 189, 12, 198, 0, 189, 16, 180, 0, 188, 18, 161, 0, 188, 21, 142,
+ 0, 188, 23, 120, 0, 189, 24, 96, 0, 189, 24, 74, 0, 190, 24, 51, 0, 190, 26, 33, 0, 188, 30, 18, 0, 185, 35, 6,
+ 0, 177, 46, 0, 0, 190, 8, 247, 0, 186, 1, 241, 0, 185, 0, 232, 0, 186, 0, 224, 0, 187, 2, 213, 0, 186, 4, 198,
+ 0, 185, 6, 182, 0, 184, 9, 165, 0, 184, 10, 147, 0, 184, 12, 128, 0, 185, 13, 106, 0, 186, 13, 83, 0, 186, 13, 61,
+ 0, 187, 13, 38, 0, 186, 16, 22, 0, 183, 22, 9, 0, 177, 33, 0, 0, 189, 5, 247, 0, 184, 0, 237, 0, 182, 0, 226,
+ 0, 182, 0, 219, 0, 183, 0, 210, 0, 183, 0, 198, 0, 182, 1, 184, 0, 182, 2, 168, 0, 181, 3, 152, 0, 181, 4, 134,
+ 0, 181, 5, 115, 0, 182, 5, 93, 0, 182, 5, 71, 0, 183, 4, 48, 0, 183, 5, 26, 0, 181, 10, 11, 0, 176, 21, 0,
+ 0, 188, 3, 247, 0, 182, 0, 235, 0, 179, 0, 223, 0, 179, 0, 216, 0, 180, 0, 208, 0, 179, 0, 197, 0, 178, 0, 184,
+ 0, 178, 0, 170, 0, 177, 0, 155, 0, 177, 0, 138, 0, 177, 1, 121, 0, 178, 1, 102, 0, 178, 1, 81, 0, 178, 0, 59,
+ 0, 178, 0, 37, 0, 177, 2, 15, 0, 174, 9, 0, 0, 187, 0, 247, 0, 184, 0, 235, 0, 182, 0, 223, 0, 182, 0, 219,
+ 0, 182, 0, 211, 0, 182, 0, 200, 0, 181, 0, 187, 0, 180, 0, 173, 0, 179, 0, 159, 0, 178, 0, 143, 0, 177, 0, 127,
+ 0, 177, 0, 109, 0, 176, 0, 90, 0, 176, 0, 69, 0, 176, 0, 46, 0, 176, 0, 23, 0, 175, 0, 0, 0, 185, 216, 237,
+ 0, 180, 221, 227, 0, 176, 234, 199, 0, 172, 240, 159, 0, 179, 220, 120, 0, 184, 212, 92, 0, 190, 204, 70, 0, 194, 197, 49,
+ 0, 198, 189, 36, 0, 201, 182, 27, 0, 205, 173, 20, 0, 208, 163, 12, 0, 211, 156, 6, 0, 215, 151, 4, 0, 219, 149, 4,
+ 0, 224, 147, 2, 0, 229, 144, 0, 0, 186, 203, 242, 0, 185, 209, 234, 0, 182, 212, 202, 0, 183, 213, 162, 0, 186, 206, 120,
+ 0, 190, 199, 89, 0, 196, 193, 62, 0, 200, 187, 39, 0, 204, 180, 18, 0, 208, 169, 4, 0, 211, 159, 2, 0, 212, 152, 1,
+ 0, 213, 148, 0, 0, 214, 145, 0, 0, 216, 143, 0, 0, 220, 141, 0, 0, 223, 141, 0, 0, 186, 189, 245, 0, 186, 191, 238,
+ 0, 183, 181, 204, 0, 185, 187, 169, 0, 188, 185, 133, 0, 193, 183, 101, 0, 198, 179, 74, 0, 202, 173, 50, 0, 206, 165, 29,
+ 0, 210, 155, 7, 0, 212, 148, 0, 0, 213, 146, 0, 0, 213, 143, 0, 0, 213, 140, 0, 0, 214, 138, 0, 0, 214, 136, 0,
+ 0, 216, 136, 0, 0, 183, 167, 249, 0, 185, 168, 233, 0, 185, 166, 210, 0, 189, 165, 193, 0, 190, 165, 148, 0, 194, 164, 116,
+ 0, 199, 160, 90, 0, 204, 156, 65, 0, 209, 152, 42, 0, 212, 145, 20, 0, 216, 140, 3, 0, 215, 137, 0, 0, 214, 135, 0,
+ 0, 213, 133, 0, 0, 212, 132, 0, 0, 211, 130, 0, 0, 214, 130, 0, 0, 186, 146, 249, 0, 188, 145, 242, 0, 188, 149, 222,
+ 0, 187, 146, 192, 0, 189, 147, 163, 0, 193, 147, 133, 0, 197, 147, 103, 0, 200, 145, 77, 0, 205, 143, 53, 0, 208, 138, 32,
+ 0, 211, 134, 11, 0, 212, 131, 1, 0, 210, 129, 0, 0, 209, 128, 0, 0, 208, 127, 0, 0, 207, 126, 0, 0, 208, 126, 0,
+ 0, 189, 125, 249, 0, 192, 122, 247, 0, 193, 124, 234, 0, 190, 128, 201, 0, 189, 130, 174, 0, 191, 133, 148, 0, 195, 132, 119,
+ 0, 198, 131, 91, 0, 201, 129, 67, 0, 204, 128, 43, 0, 206, 125, 20, 0, 208, 122, 3, 0, 206, 122, 0, 0, 204, 121, 0,
+ 0, 203, 120, 0, 0, 203, 120, 0, 0, 203, 121, 0, 0, 191, 102, 248, 0, 194, 99, 248, 0, 197, 98, 243, 0, 194, 105, 214,
+ 0, 192, 109, 184, 0, 192, 115, 158, 0, 193, 116, 132, 0, 198, 115, 104, 0, 199, 115, 79, 0, 200, 114, 56, 0, 203, 112, 34,
+ 0, 205, 109, 13, 0, 204, 109, 1, 0, 201, 110, 0, 0, 199, 111, 0, 0, 198, 111, 0, 0, 198, 112, 0, 0, 192, 80, 248,
+ 0, 195, 77, 248, 0, 198, 75, 245, 0, 196, 83, 222, 0, 193, 89, 193, 0, 193, 93, 168, 0, 194, 96, 144, 0, 196, 97, 116,
+ 0, 198, 97, 91, 0, 199, 97, 67, 0, 199, 99, 45, 0, 200, 98, 24, 0, 201, 96, 7, 0, 199, 97, 0, 0, 196, 99, 0,
+ 0, 194, 100, 0, 0, 192, 102, 0, 0, 192, 60, 249, 0, 194, 58, 248, 0, 197, 55, 246, 0, 196, 62, 227, 0, 193, 71, 201,
+ 0, 193, 74, 178, 0, 194, 77, 155, 0, 195, 79, 129, 0, 196, 79, 102, 0, 197, 80, 79, 0, 197, 82, 57, 0, 197, 84, 36,
+ 0, 197, 83, 16, 0, 195, 84, 2, 0, 192, 87, 0, 0, 189, 90, 0, 0, 186, 93, 0, 0, 190, 40, 248, 0, 192, 38, 248,
+ 0, 195, 37, 247, 0, 196, 42, 233, 0, 193, 53, 207, 0, 191, 56, 185, 0, 192, 60, 164, 0, 193, 63, 140, 0, 193, 64, 114,
+ 0, 194, 64, 89, 0, 195, 65, 68, 0, 195, 67, 47, 0, 194, 68, 26, 0, 192, 72, 10, 0, 189, 74, 1, 0, 184, 78, 0,
+ 0, 180, 82, 0, 0, 188, 23, 248, 0, 190, 23, 247, 0, 193, 22, 247, 0, 194, 25, 237, 0, 192, 35, 213, 0, 191, 40, 193,
+ 0, 190, 44, 171, 0, 191, 46, 150, 0, 191, 48, 125, 0, 192, 49, 100, 0, 192, 49, 77, 0, 192, 50, 56, 0, 192, 52, 36,
+ 0, 191, 55, 18, 0, 188, 60, 5, 0, 182, 66, 0, 0, 175, 71, 0, 0, 187, 16, 247, 0, 188, 11, 247, 0, 190, 9, 246,
+ 0, 191, 12, 236, 0, 190, 21, 216, 0, 189, 26, 196, 0, 188, 30, 177, 0, 188, 32, 157, 0, 188, 34, 135, 0, 188, 36, 112,
+ 0, 189, 36, 88, 0, 189, 36, 66, 0, 189, 37, 45, 0, 189, 39, 27, 0, 186, 43, 11, 0, 181, 50, 1, 0, 173, 60, 0,
+ 0, 187, 11, 247, 0, 186, 3, 246, 0, 186, 1, 240, 0, 187, 3, 231, 0, 186, 9, 215, 0, 186, 14, 198, 0, 185, 17, 181,
+ 0, 185, 19, 162, 0, 184, 22, 143, 0, 185, 24, 121, 0, 185, 25, 98, 0, 185, 25, 76, 0, 186, 25, 53, 0, 185, 26, 34,
+ 0, 184, 29, 17, 0, 181, 35, 5, 0, 172, 46, 0, 0, 186, 8, 247, 0, 183, 1, 241, 0, 182, 0, 232, 0, 182, 0, 222,
+ 0, 182, 3, 211, 0, 182, 5, 198, 0, 182, 6, 182, 0, 181, 8, 166, 0, 181, 10, 148, 0, 181, 11, 128, 0, 181, 13, 107,
+ 0, 182, 13, 84, 0, 182, 12, 62, 0, 182, 12, 40, 0, 181, 15, 22, 0, 179, 20, 8, 0, 172, 32, 0, 0, 186, 5, 247,
+ 0, 181, 0, 236, 0, 178, 0, 225, 0, 177, 0, 213, 0, 177, 0, 205, 0, 177, 0, 194, 0, 177, 1, 181, 0, 177, 1, 166,
+ 0, 176, 2, 150, 0, 176, 3, 133, 0, 176, 3, 113, 0, 177, 4, 93, 0, 177, 3, 71, 0, 178, 3, 48, 0, 178, 3, 26,
+ 0, 176, 7, 11, 0, 171, 20, 0, 0, 185, 3, 247, 0, 180, 0, 235, 0, 176, 0, 221, 0, 173, 0, 208, 0, 173, 0, 200,
+ 0, 173, 0, 191, 0, 173, 0, 179, 0, 172, 0, 165, 0, 171, 0, 150, 0, 170, 0, 134, 0, 170, 0, 117, 0, 170, 0, 99,
+ 0, 170, 0, 79, 0, 170, 0, 58, 0, 170, 0, 37, 0, 170, 1, 17, 0, 168, 9, 0, 0, 184, 0, 247, 0, 182, 0, 235,
+ 0, 179, 0, 224, 0, 177, 0, 211, 0, 177, 0, 204, 0, 177, 0, 195, 0, 176, 0, 183, 0, 175, 0, 169, 0, 173, 0, 155,
+ 0, 172, 0, 140, 0, 171, 0, 123, 0, 171, 0, 106, 0, 170, 0, 87, 0, 169, 0, 67, 0, 169, 0, 44, 0, 169, 0, 22,
+ 0, 168, 0, 0, 0, 171, 216, 237, 0, 167, 222, 227, 0, 164, 231, 203, 0, 162, 239, 166, 0, 158, 232, 122, 0, 164, 220, 91,
+ 0, 171, 210, 67, 0, 176, 202, 47, 0, 182, 193, 35, 0, 187, 187, 25, 0, 192, 180, 16, 0, 196, 171, 8, 0, 200, 164, 4,
+ 0, 204, 158, 4, 0, 208, 153, 3, 0, 211, 149, 2, 0, 215, 147, 0, 0, 173, 203, 240, 0, 171, 203, 223, 0, 170, 207, 199,
+ 0, 169, 212, 168, 0, 167, 211, 125, 0, 171, 206, 90, 0, 177, 199, 61, 0, 182, 192, 39, 0, 187, 186, 16, 0, 193, 177, 3,
+ 0, 197, 168, 1, 0, 200, 160, 1, 0, 203, 154, 0, 0, 205, 149, 0, 0, 207, 146, 0, 0, 210, 144, 0, 0, 211, 144, 0,
+ 0, 178, 188, 233, 0, 177, 183, 219, 0, 172, 182, 194, 0, 171, 186, 173, 0, 171, 189, 138, 0, 174, 187, 104, 0, 180, 184, 76,
+ 0, 185, 181, 50, 0, 189, 175, 25, 0, 194, 167, 3, 0, 197, 159, 0, 0, 200, 153, 0, 0, 202, 149, 0, 0, 203, 145, 0,
+ 0, 204, 141, 0, 0, 206, 139, 0, 0, 208, 139, 0, 0, 174, 168, 240, 0, 174, 166, 220, 0, 172, 164, 200, 0, 171, 165, 182,
+ 0, 173, 170, 151, 0, 177, 170, 116, 0, 181, 168, 88, 0, 187, 166, 63, 0, 190, 162, 38, 0, 194, 155, 14, 0, 198, 148, 1,
+ 0, 199, 144, 0, 0, 201, 140, 0, 0, 201, 137, 0, 0, 202, 135, 0, 0, 202, 134, 0, 0, 204, 134, 0, 0, 171, 146, 252,
+ 0, 174, 148, 233, 0, 173, 148, 206, 0, 172, 148, 188, 0, 177, 148, 171, 0, 179, 150, 132, 0, 184, 150, 102, 0, 189, 148, 77,
+ 0, 194, 146, 52, 0, 198, 141, 27, 0, 201, 135, 7, 0, 202, 132, 0, 0, 202, 130, 0, 0, 201, 129, 0, 0, 201, 127, 0,
+ 0, 200, 126, 0, 0, 202, 126, 0, 0, 175, 125, 251, 0, 178, 125, 245, 0, 177, 130, 218, 0, 176, 132, 195, 0, 176, 132, 173,
+ 0, 179, 134, 147, 0, 183, 135, 118, 0, 187, 134, 91, 0, 190, 133, 67, 0, 194, 132, 42, 0, 197, 128, 18, 0, 199, 124, 2,
+ 0, 199, 123, 0, 0, 197, 122, 0, 0, 196, 121, 0, 0, 196, 120, 0, 0, 197, 121, 0, 0, 178, 104, 250, 0, 183, 101, 249,
+ 0, 183, 104, 236, 0, 182, 111, 207, 0, 180, 114, 182, 0, 179, 118, 157, 0, 181, 121, 132, 0, 185, 120, 107, 0, 188, 119, 80,
+ 0, 191, 118, 56, 0, 194, 116, 32, 0, 196, 114, 10, 0, 195, 113, 1, 0, 194, 113, 0, 0, 192, 113, 0, 0, 191, 113, 0,
+ 0, 192, 114, 0, 0, 181, 82, 250, 0, 185, 79, 249, 0, 187, 80, 243, 0, 185, 88, 217, 0, 183, 93, 191, 0, 182, 97, 167,
+ 0, 182, 101, 144, 0, 184, 103, 117, 0, 188, 102, 92, 0, 189, 102, 68, 0, 190, 102, 45, 0, 193, 101, 22, 0, 194, 99, 4,
+ 0, 192, 100, 0, 0, 189, 101, 0, 0, 187, 102, 0, 0, 187, 104, 0, 0, 182, 62, 250, 0, 186, 59, 249, 0, 188, 59, 245,
+ 0, 187, 68, 224, 0, 185, 75, 200, 0, 184, 76, 177, 0, 185, 81, 155, 0, 185, 83, 130, 0, 187, 83, 103, 0, 189, 84, 79,
+ 0, 189, 86, 57, 0, 189, 87, 34, 0, 190, 86, 13, 0, 189, 87, 2, 0, 186, 89, 0, 0, 183, 91, 0, 0, 182, 93, 0,
+ 0, 182, 43, 249, 0, 185, 40, 248, 0, 187, 40, 246, 0, 187, 48, 230, 0, 186, 57, 205, 0, 185, 60, 185, 0, 185, 63, 164,
+ 0, 186, 65, 141, 0, 186, 67, 115, 0, 187, 67, 90, 0, 188, 68, 68, 0, 188, 70, 46, 0, 187, 72, 25, 0, 186, 74, 8,
+ 0, 183, 76, 1, 0, 179, 79, 0, 0, 176, 82, 0, 0, 180, 26, 248, 0, 184, 24, 248, 0, 186, 25, 246, 0, 186, 30, 233,
+ 0, 185, 41, 210, 0, 185, 43, 192, 0, 184, 46, 171, 0, 185, 48, 150, 0, 185, 50, 126, 0, 185, 52, 101, 0, 185, 52, 78,
+ 0, 186, 54, 57, 0, 186, 55, 36, 0, 185, 57, 17, 0, 182, 62, 3, 0, 176, 67, 0, 0, 170, 71, 0, 0, 180, 16, 248,
+ 0, 182, 12, 247, 0, 184, 12, 245, 0, 184, 16, 233, 0, 183, 25, 213, 0, 183, 29, 195, 0, 182, 32, 176, 0, 182, 34, 157,
+ 0, 182, 36, 136, 0, 183, 38, 113, 0, 183, 39, 89, 0, 183, 39, 68, 0, 183, 40, 46, 0, 183, 41, 26, 0, 180, 45, 9,
+ 0, 175, 51, 1, 0, 167, 60, 0, 0, 181, 11, 247, 0, 181, 3, 246, 0, 181, 3, 240, 0, 182, 6, 230, 0, 181, 13, 212,
+ 0, 180, 16, 196, 0, 180, 19, 180, 0, 180, 21, 162, 0, 179, 24, 143, 0, 180, 26, 122, 0, 180, 27, 99, 0, 180, 27, 77,
+ 0, 180, 26, 55, 0, 180, 28, 35, 0, 179, 30, 16, 0, 175, 34, 3, 0, 166, 45, 0, 0, 182, 8, 247, 0, 179, 1, 241,
+ 0, 178, 0, 233, 0, 177, 1, 222, 0, 177, 4, 208, 0, 176, 6, 196, 0, 177, 7, 181, 0, 176, 9, 165, 0, 176, 11, 147,
+ 0, 176, 12, 128, 0, 176, 13, 107, 0, 176, 13, 85, 0, 176, 13, 63, 0, 177, 12, 40, 0, 176, 15, 22, 0, 174, 19, 7,
+ 0, 166, 32, 0, 0, 182, 5, 247, 0, 177, 0, 236, 0, 175, 0, 226, 0, 173, 0, 213, 0, 171, 0, 200, 0, 171, 0, 190,
+ 0, 172, 1, 178, 0, 171, 1, 165, 0, 171, 1, 149, 0, 171, 1, 132, 0, 171, 2, 113, 0, 171, 2, 92, 0, 171, 2, 70,
+ 0, 172, 1, 47, 0, 172, 2, 27, 0, 170, 6, 11, 0, 164, 20, 0, 0, 182, 3, 247, 0, 176, 0, 234, 0, 172, 0, 221,
+ 0, 169, 0, 206, 0, 166, 0, 193, 0, 165, 0, 184, 0, 166, 0, 173, 0, 165, 0, 160, 0, 164, 0, 147, 0, 163, 0, 132,
+ 0, 162, 0, 115, 0, 162, 0, 97, 0, 162, 0, 78, 0, 162, 0, 57, 0, 163, 0, 37, 0, 162, 1, 17, 0, 161, 9, 0,
+ 0, 181, 0, 247, 0, 178, 0, 236, 0, 176, 0, 225, 0, 174, 0, 211, 0, 170, 0, 197, 0, 170, 0, 189, 0, 170, 0, 178,
+ 0, 169, 0, 165, 0, 167, 0, 151, 0, 165, 0, 136, 0, 164, 0, 121, 0, 163, 0, 104, 0, 162, 0, 85, 0, 162, 0, 65,
+ 0, 162, 0, 42, 0, 161, 0, 21, 0, 160, 0, 0, 0, 149, 217, 237, 0, 143, 225, 228, 0, 142, 231, 207, 0, 141, 235, 171,
+ 0, 140, 235, 128, 0, 138, 230, 90, 0, 146, 220, 62, 0, 155, 209, 42, 0, 164, 200, 30, 0, 171, 192, 22, 0, 178, 185, 16,
+ 0, 183, 178, 8, 0, 189, 172, 4, 0, 194, 166, 3, 0, 198, 161, 2, 0, 201, 156, 2, 0, 204, 152, 0, 0, 151, 203, 241,
+ 0, 150, 202, 221, 0, 153, 207, 199, 0, 153, 211, 173, 0, 152, 213, 136, 0, 150, 213, 94, 0, 156, 207, 61, 0, 162, 199, 37,
+ 0, 169, 192, 14, 0, 175, 183, 3, 0, 181, 175, 1, 0, 187, 168, 1, 0, 190, 161, 0, 0, 193, 156, 0, 0, 197, 152, 0,
+ 0, 200, 149, 0, 0, 202, 148, 0, 0, 155, 185, 242, 0, 155, 182, 219, 0, 159, 183, 193, 0, 158, 187, 177, 0, 156, 192, 147,
+ 0, 156, 194, 110, 0, 161, 191, 77, 0, 166, 188, 49, 0, 171, 182, 23, 0, 177, 175, 3, 0, 182, 167, 0, 0, 187, 160, 0,
+ 0, 190, 155, 0, 0, 192, 150, 0, 0, 195, 147, 0, 0, 197, 144, 0, 0, 199, 144, 0, 0, 157, 164, 227, 0, 157, 164, 216,
+ 0, 158, 164, 199, 0, 159, 166, 180, 0, 158, 173, 157, 0, 159, 176, 122, 0, 163, 175, 91, 0, 169, 172, 65, 0, 173, 169, 38,
+ 0, 177, 164, 13, 0, 182, 158, 1, 0, 186, 153, 0, 0, 188, 148, 0, 0, 190, 144, 0, 0, 192, 141, 0, 0, 193, 138, 0,
+ 0, 195, 138, 0, 0, 159, 150, 239, 0, 161, 150, 224, 0, 160, 149, 200, 0, 160, 149, 182, 0, 159, 153, 163, 0, 161, 157, 135,
+ 0, 165, 158, 102, 0, 170, 157, 76, 0, 175, 155, 50, 0, 178, 152, 23, 0, 182, 146, 3, 0, 185, 142, 0, 0, 187, 138, 0,
+ 0, 188, 135, 0, 0, 189, 132, 0, 0, 190, 130, 0, 0, 192, 130, 0, 0, 156, 127, 253, 0, 161, 130, 237, 0, 161, 133, 209,
+ 0, 160, 134, 188, 0, 160, 135, 171, 0, 163, 134, 154, 0, 167, 137, 118, 0, 172, 138, 90, 0, 177, 137, 66, 0, 182, 136, 40,
+ 0, 186, 132, 14, 0, 188, 127, 2, 0, 188, 125, 0, 0, 188, 123, 0, 0, 188, 121, 0, 0, 188, 120, 0, 0, 190, 120, 0,
+ 0, 162, 106, 252, 0, 165, 105, 249, 0, 166, 110, 232, 0, 165, 117, 201, 0, 164, 119, 179, 0, 165, 120, 157, 0, 168, 123, 132,
+ 0, 171, 123, 106, 0, 176, 123, 81, 0, 180, 123, 55, 0, 183, 121, 29, 0, 185, 118, 8, 0, 185, 116, 1, 0, 184, 115, 0,
+ 0, 184, 114, 0, 0, 183, 113, 0, 0, 185, 114, 0, 0, 166, 86, 251, 0, 171, 83, 250, 0, 172, 86, 241, 0, 171, 94, 213,
+ 0, 170, 98, 189, 0, 169, 101, 166, 0, 169, 105, 143, 0, 169, 107, 118, 0, 174, 107, 95, 0, 178, 107, 70, 0, 180, 107, 44,
+ 0, 183, 105, 20, 0, 184, 103, 3, 0, 182, 104, 0, 0, 180, 104, 0, 0, 179, 104, 0, 0, 180, 105, 0, 0, 169, 66, 250,
+ 0, 173, 62, 249, 0, 175, 64, 242, 0, 175, 72, 221, 0, 173, 78, 198, 0, 173, 82, 176, 0, 173, 85, 154, 0, 172, 88, 130,
+ 0, 173, 89, 105, 0, 178, 89, 81, 0, 179, 90, 57, 0, 180, 90, 33, 0, 181, 90, 11, 0, 180, 90, 1, 0, 178, 91, 0,
+ 0, 176, 92, 0, 0, 176, 94, 0, 0, 170, 46, 249, 0, 174, 43, 249, 0, 176, 45, 242, 0, 177, 53, 226, 0, 175, 61, 203,
+ 0, 175, 64, 184, 0, 175, 67, 163, 0, 176, 69, 142, 0, 176, 71, 116, 0, 177, 71, 91, 0, 178, 72, 69, 0, 178, 74, 45,
+ 0, 178, 75, 23, 0, 178, 75, 5, 0, 175, 77, 0, 0, 172, 80, 0, 0, 170, 83, 0, 0, 170, 29, 249, 0, 175, 27, 248,
+ 0, 176, 30, 242, 0, 176, 36, 228, 0, 176, 45, 207, 0, 175, 47, 190, 0, 175, 50, 171, 0, 176, 53, 150, 0, 176, 55, 127,
+ 0, 176, 56, 102, 0, 177, 56, 79, 0, 177, 57, 57, 0, 177, 58, 35, 0, 176, 59, 14, 0, 174, 64, 2, 0, 168, 68, 0,
+ 0, 165, 71, 0, 0, 172, 17, 248, 0, 175, 14, 247, 0, 176, 16, 242, 0, 176, 21, 230, 0, 175, 30, 210, 0, 174, 32, 194,
+ 0, 174, 35, 175, 0, 175, 37, 156, 0, 175, 39, 136, 0, 176, 40, 113, 0, 176, 41, 90, 0, 176, 41, 68, 0, 176, 42, 45,
+ 0, 175, 43, 25, 0, 173, 46, 7, 0, 167, 52, 1, 0, 161, 61, 0, 0, 174, 12, 248, 0, 175, 5, 245, 0, 175, 6, 238,
+ 0, 174, 10, 227, 0, 173, 17, 210, 0, 173, 18, 195, 0, 173, 21, 179, 0, 173, 23, 161, 0, 173, 25, 142, 0, 173, 27, 121,
+ 0, 173, 28, 99, 0, 173, 28, 77, 0, 173, 27, 55, 0, 173, 28, 34, 0, 172, 30, 15, 0, 168, 35, 2, 0, 158, 46, 0,
+ 0, 175, 8, 247, 0, 174, 1, 241, 0, 173, 1, 233, 0, 172, 2, 222, 0, 170, 6, 208, 0, 170, 6, 194, 0, 170, 8, 180,
+ 0, 170, 10, 164, 0, 169, 11, 146, 0, 169, 12, 127, 0, 169, 13, 107, 0, 169, 14, 85, 0, 170, 13, 63, 0, 170, 12, 41,
+ 0, 169, 15, 22, 0, 167, 18, 6, 0, 158, 32, 0, 0, 176, 5, 247, 0, 172, 0, 236, 0, 170, 0, 225, 0, 168, 0, 213,
+ 0, 165, 0, 200, 0, 164, 0, 188, 0, 165, 1, 177, 0, 165, 1, 163, 0, 165, 1, 148, 0, 164, 1, 131, 0, 164, 1, 112,
+ 0, 164, 2, 91, 0, 165, 1, 70, 0, 165, 1, 47, 0, 165, 1, 27, 0, 164, 5, 11, 0, 157, 20, 0, 0, 177, 3, 247,
+ 0, 172, 0, 233, 0, 168, 0, 220, 0, 164, 0, 206, 0, 160, 0, 192, 0, 158, 0, 178, 0, 158, 0, 168, 0, 157, 0, 157,
+ 0, 157, 0, 144, 0, 155, 0, 129, 0, 155, 0, 113, 0, 155, 0, 96, 0, 154, 0, 77, 0, 155, 0, 56, 0, 155, 0, 37,
+ 0, 154, 1, 18, 0, 154, 9, 0, 0, 177, 0, 247, 0, 174, 0, 236, 0, 171, 0, 225, 0, 169, 0, 211, 0, 166, 0, 197,
+ 0, 162, 0, 182, 0, 163, 0, 172, 0, 162, 0, 161, 0, 160, 0, 148, 0, 158, 0, 134, 0, 156, 0, 119, 0, 155, 0, 103,
+ 0, 154, 0, 85, 0, 154, 0, 64, 0, 154, 0, 41, 0, 153, 0, 20, 0, 152, 0, 0, 0, 125, 218, 239, 0, 120, 228, 228,
+ 0, 120, 231, 206, 0, 121, 231, 176, 0, 123, 232, 135, 0, 121, 229, 95, 0, 118, 227, 62, 0, 129, 216, 38, 0, 140, 207, 19,
+ 0, 152, 199, 14, 0, 162, 191, 11, 0, 170, 184, 8, 0, 176, 178, 5, 0, 182, 173, 3, 0, 187, 169, 2, 0, 191, 164, 1,
+ 0, 194, 159, 0, 0, 132, 203, 237, 0, 131, 203, 219, 0, 133, 207, 199, 0, 134, 209, 178, 0, 135, 210, 145, 0, 134, 211, 105,
+ 0, 133, 210, 68, 0, 139, 206, 36, 0, 148, 199, 10, 0, 157, 191, 2, 0, 165, 182, 1, 0, 172, 174, 1, 0, 177, 167, 0,
+ 0, 182, 162, 0, 0, 185, 159, 0, 0, 189, 156, 0, 0, 191, 155, 0, 0, 138, 185, 235, 0, 138, 184, 217, 0, 142, 185, 194,
+ 0, 141, 189, 178, 0, 140, 193, 154, 0, 140, 195, 119, 0, 140, 196, 84, 0, 145, 195, 49, 0, 152, 191, 21, 0, 159, 183, 2,
+ 0, 167, 175, 0, 0, 172, 167, 0, 0, 177, 161, 0, 0, 180, 157, 0, 0, 183, 153, 0, 0, 186, 150, 0, 0, 189, 150, 0,
+ 0, 143, 167, 227, 0, 144, 166, 220, 0, 143, 168, 199, 0, 146, 171, 178, 0, 145, 175, 159, 0, 144, 178, 129, 0, 144, 181, 96,
+ 0, 149, 179, 67, 0, 155, 176, 40, 0, 161, 172, 12, 0, 167, 166, 1, 0, 172, 159, 0, 0, 175, 154, 0, 0, 178, 150, 0,
+ 0, 181, 146, 0, 0, 183, 144, 0, 0, 186, 145, 0, 0, 145, 150, 219, 0, 147, 151, 208, 0, 146, 152, 197, 0, 148, 151, 180,
+ 0, 148, 155, 160, 0, 146, 160, 140, 0, 146, 164, 108, 0, 152, 163, 79, 0, 157, 162, 52, 0, 161, 160, 23, 0, 166, 155, 2,
+ 0, 170, 150, 0, 0, 173, 145, 0, 0, 176, 142, 0, 0, 178, 138, 0, 0, 180, 136, 0, 0, 182, 137, 0, 0, 143, 133, 232,
+ 0, 147, 135, 220, 0, 147, 135, 204, 0, 148, 136, 185, 0, 148, 138, 167, 0, 147, 141, 151, 0, 149, 145, 120, 0, 154, 146, 91,
+ 0, 158, 145, 66, 0, 163, 144, 36, 0, 166, 141, 10, 0, 170, 137, 1, 0, 172, 134, 0, 0, 174, 131, 0, 0, 175, 128, 0,
+ 0, 176, 126, 0, 0, 179, 127, 0, 0, 141, 109, 253, 0, 147, 111, 242, 0, 148, 115, 224, 0, 148, 119, 197, 0, 148, 121, 174,
+ 0, 148, 123, 157, 0, 152, 123, 139, 0, 155, 125, 105, 0, 161, 126, 79, 0, 166, 125, 52, 0, 170, 124, 25, 0, 173, 121, 4,
+ 0, 174, 119, 0, 0, 174, 117, 0, 0, 174, 115, 0, 0, 175, 114, 0, 0, 178, 112, 0, 0, 148, 89, 252, 0, 151, 88, 250,
+ 0, 154, 92, 238, 0, 154, 100, 210, 0, 153, 104, 186, 0, 153, 107, 166, 0, 153, 106, 144, 0, 155, 108, 119, 0, 160, 110, 94,
+ 0, 164, 110, 68, 0, 168, 110, 41, 0, 171, 108, 16, 0, 171, 105, 2, 0, 171, 104, 0, 0, 171, 104, 0, 0, 171, 103, 0,
+ 0, 172, 104, 0, 0, 152, 70, 251, 0, 156, 67, 250, 0, 159, 69, 242, 0, 160, 77, 222, 0, 159, 83, 197, 0, 159, 87, 176,
+ 0, 158, 88, 154, 0, 158, 91, 131, 0, 157, 93, 106, 0, 162, 95, 83, 0, 166, 94, 56, 0, 168, 94, 31, 0, 170, 92, 9,
+ 0, 170, 92, 1, 0, 168, 92, 0, 0, 167, 93, 0, 0, 168, 94, 0, 0, 155, 51, 250, 0, 160, 48, 249, 0, 162, 50, 242,
+ 0, 163, 58, 225, 0, 163, 65, 203, 0, 163, 68, 184, 0, 162, 71, 163, 0, 162, 73, 142, 0, 161, 75, 118, 0, 162, 76, 93,
+ 0, 166, 76, 69, 0, 167, 78, 44, 0, 168, 78, 20, 0, 169, 77, 3, 0, 166, 79, 0, 0, 164, 81, 0, 0, 164, 83, 0,
+ 0, 157, 33, 249, 0, 163, 30, 248, 0, 164, 34, 241, 0, 165, 41, 227, 0, 164, 49, 207, 0, 164, 51, 190, 0, 164, 55, 170,
+ 0, 163, 56, 150, 0, 164, 58, 127, 0, 165, 58, 102, 0, 166, 59, 79, 0, 166, 60, 55, 0, 166, 61, 33, 0, 166, 63, 12,
+ 0, 164, 66, 1, 0, 160, 68, 0, 0, 158, 71, 0, 0, 160, 19, 249, 0, 164, 16, 248, 0, 166, 19, 241, 0, 166, 24, 229,
+ 0, 165, 33, 209, 0, 164, 36, 193, 0, 164, 38, 175, 0, 164, 40, 156, 0, 165, 41, 136, 0, 166, 42, 112, 0, 166, 43, 89,
+ 0, 166, 43, 67, 0, 167, 44, 43, 0, 166, 46, 22, 0, 164, 48, 5, 0, 158, 55, 0, 0, 153, 61, 0, 0, 163, 13, 248,
+ 0, 166, 6, 245, 0, 166, 8, 238, 0, 166, 12, 227, 0, 165, 19, 210, 0, 164, 21, 195, 0, 163, 23, 178, 0, 163, 25, 160,
+ 0, 164, 26, 141, 0, 164, 27, 120, 0, 164, 28, 98, 0, 164, 29, 76, 0, 165, 28, 54, 0, 165, 30, 32, 0, 164, 31, 13,
+ 0, 159, 37, 1, 0, 150, 48, 0, 0, 167, 9, 248, 0, 166, 1, 242, 0, 165, 1, 234, 0, 165, 3, 223, 0, 163, 7, 208,
+ 0, 162, 8, 194, 0, 162, 9, 179, 0, 162, 11, 163, 0, 162, 12, 146, 0, 161, 13, 127, 0, 161, 14, 106, 0, 161, 15, 84,
+ 0, 162, 14, 63, 0, 162, 14, 41, 0, 162, 16, 21, 0, 160, 19, 5, 0, 149, 33, 0, 0, 169, 5, 248, 0, 166, 0, 235,
+ 0, 164, 0, 225, 0, 161, 0, 214, 0, 159, 1, 201, 0, 158, 1, 189, 0, 157, 1, 175, 0, 158, 1, 162, 0, 158, 1, 147,
+ 0, 157, 1, 130, 0, 157, 1, 111, 0, 157, 2, 91, 0, 157, 2, 70, 0, 158, 1, 47, 0, 158, 1, 27, 0, 157, 6, 10,
+ 0, 149, 21, 0, 0, 171, 3, 247, 0, 166, 0, 232, 0, 162, 0, 219, 0, 158, 0, 206, 0, 155, 0, 192, 0, 152, 0, 178,
+ 0, 150, 0, 164, 0, 149, 0, 154, 0, 149, 0, 141, 0, 148, 0, 127, 0, 147, 0, 112, 0, 147, 0, 95, 0, 147, 0, 76,
+ 0, 147, 0, 56, 0, 147, 0, 36, 0, 146, 1, 18, 0, 145, 10, 0, 0, 172, 0, 247, 0, 169, 0, 236, 0, 166, 0, 224,
+ 0, 163, 0, 211, 0, 160, 0, 197, 0, 157, 0, 181, 0, 153, 0, 166, 0, 153, 0, 156, 0, 152, 0, 144, 0, 150, 0, 132,
+ 0, 148, 0, 118, 0, 146, 0, 103, 0, 145, 0, 85, 0, 145, 0, 64, 0, 145, 0, 41, 0, 145, 0, 19, 0, 142, 0, 0,
+ 0, 104, 218, 241, 0, 100, 226, 227, 0, 102, 227, 203, 0, 103, 226, 178, 0, 107, 226, 145, 0, 106, 226, 103, 0, 103, 224, 69,
+ 0, 99, 224, 38, 0, 112, 214, 13, 0, 128, 204, 7, 0, 143, 198, 5, 0, 154, 192, 5, 0, 162, 186, 4, 0, 169, 180, 3,
+ 0, 175, 175, 3, 0, 179, 171, 1, 0, 183, 167, 0, 0, 113, 201, 233, 0, 113, 200, 217, 0, 114, 203, 197, 0, 115, 206, 178,
+ 0, 116, 207, 152, 0, 118, 206, 116, 0, 116, 208, 81, 0, 115, 210, 43, 0, 123, 204, 13, 0, 136, 196, 1, 0, 148, 188, 0,
+ 0, 157, 181, 1, 0, 164, 175, 0, 0, 169, 169, 0, 0, 174, 165, 0, 0, 178, 162, 0, 0, 180, 162, 0, 0, 124, 181, 222,
+ 0, 122, 182, 214, 0, 124, 185, 194, 0, 122, 190, 178, 0, 121, 193, 159, 0, 123, 195, 127, 0, 123, 196, 94, 0, 123, 196, 60,
+ 0, 129, 194, 27, 0, 139, 189, 3, 0, 149, 182, 0, 0, 157, 175, 0, 0, 163, 168, 0, 0, 168, 163, 0, 0, 172, 159, 0,
+ 0, 175, 156, 0, 0, 177, 157, 0, 0, 128, 163, 232, 0, 127, 165, 221, 0, 126, 168, 198, 0, 126, 175, 179, 0, 127, 177, 161,
+ 0, 128, 180, 135, 0, 127, 184, 103, 0, 128, 183, 73, 0, 134, 182, 42, 0, 142, 180, 11, 0, 150, 174, 1, 0, 157, 166, 0,
+ 0, 162, 160, 0, 0, 166, 155, 0, 0, 169, 151, 0, 0, 172, 149, 0, 0, 174, 150, 0, 0, 130, 149, 218, 0, 131, 150, 212,
+ 0, 132, 152, 201, 0, 131, 154, 182, 0, 134, 158, 159, 0, 132, 162, 144, 0, 130, 168, 114, 0, 131, 169, 83, 0, 137, 168, 54,
+ 0, 143, 166, 24, 0, 150, 163, 3, 0, 156, 157, 0, 0, 160, 151, 0, 0, 163, 147, 0, 0, 166, 143, 0, 0, 169, 140, 0,
+ 0, 171, 142, 0, 0, 129, 134, 227, 0, 134, 135, 216, 0, 134, 137, 200, 0, 133, 139, 184, 0, 136, 140, 168, 0, 135, 143, 150,
+ 0, 133, 149, 126, 0, 135, 151, 96, 0, 140, 151, 68, 0, 145, 151, 37, 0, 149, 149, 9, 0, 154, 145, 0, 0, 158, 141, 0,
+ 0, 161, 137, 0, 0, 163, 134, 0, 0, 165, 131, 0, 0, 168, 132, 0, 0, 128, 115, 244, 0, 131, 117, 227, 0, 133, 120, 205,
+ 0, 134, 122, 188, 0, 136, 125, 170, 0, 136, 126, 154, 0, 134, 128, 136, 0, 137, 131, 107, 0, 142, 133, 79, 0, 146, 133, 50,
+ 0, 150, 133, 22, 0, 154, 130, 3, 0, 156, 127, 0, 0, 159, 124, 0, 0, 160, 122, 0, 0, 162, 120, 0, 0, 165, 120, 0,
+ 0, 125, 92, 253, 0, 131, 95, 242, 0, 134, 101, 222, 0, 135, 104, 202, 0, 135, 107, 180, 0, 136, 109, 159, 0, 136, 110, 143,
+ 0, 139, 109, 127, 0, 144, 113, 94, 0, 149, 113, 66, 0, 153, 112, 37, 0, 157, 111, 13, 0, 159, 109, 1, 0, 160, 107, 0,
+ 0, 161, 106, 0, 0, 161, 104, 0, 0, 165, 103, 0, 0, 133, 73, 252, 0, 137, 72, 250, 0, 139, 77, 238, 0, 141, 83, 219,
+ 0, 142, 88, 196, 0, 142, 92, 173, 0, 142, 93, 154, 0, 142, 94, 133, 0, 144, 96, 107, 0, 148, 98, 81, 0, 152, 98, 54,
+ 0, 156, 96, 27, 0, 158, 93, 5, 0, 158, 93, 0, 0, 157, 93, 0, 0, 157, 93, 0, 0, 159, 93, 0, 0, 138, 55, 251,
+ 0, 142, 53, 250, 0, 145, 56, 241, 0, 147, 63, 225, 0, 148, 70, 203, 0, 148, 73, 183, 0, 148, 75, 163, 0, 147, 76, 143,
+ 0, 146, 79, 118, 0, 146, 81, 94, 0, 150, 82, 70, 0, 154, 82, 42, 0, 156, 80, 18, 0, 157, 79, 2, 0, 155, 80, 0,
+ 0, 154, 81, 0, 0, 155, 83, 0, 0, 142, 37, 250, 0, 146, 35, 249, 0, 149, 38, 240, 0, 151, 45, 226, 0, 151, 53, 207,
+ 0, 151, 56, 189, 0, 150, 60, 170, 0, 149, 61, 150, 0, 149, 62, 127, 0, 149, 64, 103, 0, 150, 65, 79, 0, 153, 64, 55,
+ 0, 155, 64, 30, 0, 155, 66, 9, 0, 153, 67, 1, 0, 151, 69, 0, 0, 150, 71, 0, 0, 145, 21, 249, 0, 151, 19, 248,
+ 0, 153, 22, 240, 0, 153, 29, 226, 0, 153, 37, 208, 0, 153, 39, 193, 0, 152, 42, 175, 0, 152, 43, 156, 0, 152, 45, 135,
+ 0, 152, 45, 112, 0, 153, 46, 88, 0, 154, 47, 66, 0, 154, 48, 42, 0, 154, 48, 20, 0, 153, 51, 3, 0, 148, 57, 0,
+ 0, 145, 61, 0, 0, 150, 13, 249, 0, 154, 8, 245, 0, 155, 10, 238, 0, 155, 14, 227, 0, 154, 22, 210, 0, 153, 24, 194,
+ 0, 153, 26, 177, 0, 152, 27, 160, 0, 152, 28, 141, 0, 153, 29, 120, 0, 154, 30, 98, 0, 154, 30, 75, 0, 155, 30, 52,
+ 0, 155, 32, 30, 0, 153, 33, 11, 0, 148, 39, 1, 0, 140, 49, 0, 0, 156, 9, 248, 0, 157, 2, 242, 0, 157, 2, 235,
+ 0, 156, 4, 223, 0, 154, 9, 208, 0, 153, 10, 194, 0, 153, 11, 179, 0, 152, 12, 163, 0, 152, 13, 146, 0, 152, 14, 126,
+ 0, 152, 15, 105, 0, 152, 15, 84, 0, 153, 15, 62, 0, 154, 15, 40, 0, 154, 17, 19, 0, 150, 21, 3, 0, 138, 34, 0,
+ 0, 160, 6, 248, 0, 158, 1, 236, 0, 156, 0, 226, 0, 154, 0, 214, 0, 152, 1, 202, 0, 151, 1, 190, 0, 150, 1, 176,
+ 0, 149, 1, 162, 0, 150, 1, 147, 0, 149, 1, 130, 0, 149, 2, 111, 0, 149, 2, 91, 0, 149, 2, 70, 0, 150, 2, 47,
+ 0, 150, 2, 27, 0, 149, 7, 9, 0, 138, 21, 0, 0, 163, 3, 248, 0, 159, 0, 232, 0, 156, 0, 219, 0, 152, 0, 205,
+ 0, 148, 0, 192, 0, 145, 0, 179, 0, 143, 0, 165, 0, 141, 0, 151, 0, 140, 0, 139, 0, 139, 0, 125, 0, 138, 0, 110,
+ 0, 137, 0, 93, 0, 137, 0, 75, 0, 137, 0, 55, 0, 137, 0, 36, 0, 136, 1, 18, 0, 134, 10, 0, 0, 165, 0, 248,
+ 0, 162, 0, 236, 0, 159, 0, 224, 0, 156, 0, 211, 0, 153, 0, 197, 0, 150, 0, 182, 0, 147, 0, 166, 0, 142, 0, 152,
+ 0, 142, 0, 142, 0, 141, 0, 130, 0, 138, 0, 116, 0, 136, 0, 101, 0, 134, 0, 84, 0, 134, 0, 64, 0, 134, 0, 41,
+ 0, 133, 0, 18, 0, 131, 0, 0, 0, 81, 219, 243, 0, 74, 228, 233, 0, 76, 228, 204, 0, 80, 227, 181, 0, 85, 226, 155,
+ 0, 87, 224, 115, 0, 87, 223, 78, 0, 84, 223, 44, 0, 82, 223, 16, 0, 99, 213, 3, 0, 119, 203, 2, 0, 135, 197, 1,
+ 0, 146, 192, 1, 0, 155, 188, 2, 0, 162, 183, 2, 0, 167, 178, 1, 0, 172, 174, 0, 0, 91, 203, 235, 0, 92, 201, 221,
+ 0, 95, 201, 197, 0, 96, 204, 179, 0, 96, 207, 158, 0, 100, 205, 125, 0, 101, 205, 91, 0, 97, 210, 53, 0, 97, 209, 20,
+ 0, 111, 201, 2, 0, 127, 192, 0, 0, 139, 186, 0, 0, 148, 181, 0, 0, 156, 176, 0, 0, 162, 172, 0, 0, 167, 168, 0,
+ 0, 170, 169, 0, 0, 103, 183, 223, 0, 102, 184, 217, 0, 106, 185, 195, 0, 103, 189, 179, 0, 102, 193, 162, 0, 105, 195, 133,
+ 0, 106, 196, 100, 0, 106, 196, 70, 0, 106, 197, 36, 0, 115, 193, 7, 0, 129, 185, 0, 0, 140, 180, 0, 0, 148, 174, 0,
+ 0, 155, 169, 0, 0, 160, 165, 0, 0, 164, 162, 0, 0, 167, 163, 0, 0, 108, 168, 231, 0, 108, 169, 222, 0, 109, 172, 200,
+ 0, 108, 176, 179, 0, 109, 179, 163, 0, 110, 182, 140, 0, 111, 184, 108, 0, 110, 185, 79, 0, 112, 185, 49, 0, 119, 182, 19,
+ 0, 130, 177, 2, 0, 141, 172, 0, 0, 148, 167, 0, 0, 153, 161, 0, 0, 157, 157, 0, 0, 161, 154, 0, 0, 163, 156, 0,
+ 0, 113, 151, 226, 0, 114, 150, 221, 0, 114, 152, 205, 0, 113, 156, 184, 0, 114, 162, 162, 0, 115, 165, 147, 0, 115, 170, 119,
+ 0, 114, 172, 89, 0, 116, 172, 59, 0, 122, 170, 29, 0, 131, 167, 3, 0, 140, 163, 0, 0, 146, 158, 0, 0, 151, 153, 0,
+ 0, 155, 148, 0, 0, 158, 145, 0, 0, 161, 147, 0, 0, 112, 137, 231, 0, 116, 140, 217, 0, 117, 138, 199, 0, 118, 140, 185,
+ 0, 117, 143, 169, 0, 120, 146, 149, 0, 119, 150, 130, 0, 118, 155, 101, 0, 119, 157, 72, 0, 124, 156, 40, 0, 131, 154, 11,
+ 0, 138, 151, 1, 0, 144, 147, 0, 0, 148, 142, 0, 0, 152, 138, 0, 0, 155, 135, 0, 0, 158, 137, 0, 0, 113, 116, 242,
+ 0, 118, 120, 220, 0, 122, 122, 196, 0, 122, 125, 184, 0, 120, 128, 169, 0, 122, 127, 153, 0, 122, 130, 135, 0, 120, 136, 112,
+ 0, 122, 140, 83, 0, 126, 139, 53, 0, 131, 138, 23, 0, 136, 137, 3, 0, 141, 134, 0, 0, 145, 130, 0, 0, 148, 127, 0,
+ 0, 151, 125, 0, 0, 155, 125, 0, 0, 113, 98, 245, 0, 117, 102, 227, 0, 119, 105, 208, 0, 119, 108, 192, 0, 120, 110, 175,
+ 0, 122, 112, 157, 0, 122, 113, 141, 0, 121, 118, 124, 0, 124, 121, 94, 0, 128, 121, 65, 0, 133, 120, 36, 0, 137, 119, 10,
+ 0, 141, 117, 1, 0, 144, 115, 0, 0, 146, 113, 0, 0, 148, 111, 0, 0, 152, 111, 0, 0, 109, 76, 253, 0, 116, 78, 245,
+ 0, 119, 82, 232, 0, 121, 89, 210, 0, 121, 92, 190, 0, 122, 95, 168, 0, 122, 95, 148, 0, 123, 97, 132, 0, 127, 97, 114,
+ 0, 131, 101, 79, 0, 135, 101, 50, 0, 141, 99, 23, 0, 144, 98, 3, 0, 146, 97, 0, 0, 146, 95, 0, 0, 147, 94, 0,
+ 0, 151, 92, 0, 0, 117, 59, 252, 0, 121, 57, 251, 0, 124, 60, 241, 0, 126, 69, 221, 0, 128, 74, 201, 0, 129, 77, 182,
+ 0, 129, 80, 160, 0, 129, 81, 141, 0, 130, 82, 119, 0, 132, 84, 92, 0, 135, 85, 67, 0, 139, 85, 39, 0, 143, 82, 14,
+ 0, 144, 80, 2, 0, 144, 81, 0, 0, 143, 81, 0, 0, 145, 82, 0, 0, 123, 41, 251, 0, 127, 40, 250, 0, 130, 43, 241,
+ 0, 132, 49, 225, 0, 135, 57, 207, 0, 135, 61, 189, 0, 135, 64, 170, 0, 134, 64, 150, 0, 134, 66, 128, 0, 134, 67, 103,
+ 0, 134, 69, 79, 0, 137, 70, 55, 0, 141, 69, 28, 0, 143, 67, 6, 0, 142, 66, 0, 0, 140, 67, 0, 0, 140, 69, 0,
+ 0, 127, 25, 250, 0, 132, 23, 248, 0, 135, 26, 240, 0, 137, 34, 225, 0, 139, 41, 208, 0, 139, 43, 193, 0, 138, 47, 174,
+ 0, 137, 48, 156, 0, 136, 50, 136, 0, 136, 50, 112, 0, 136, 52, 88, 0, 137, 53, 66, 0, 140, 52, 41, 0, 142, 52, 17,
+ 0, 141, 55, 2, 0, 137, 57, 0, 0, 135, 59, 0, 0, 133, 14, 250, 0, 138, 11, 246, 0, 141, 13, 238, 0, 142, 18, 226,
+ 0, 142, 25, 208, 0, 141, 27, 193, 0, 140, 30, 177, 0, 139, 31, 160, 0, 139, 32, 141, 0, 140, 32, 120, 0, 140, 33, 98,
+ 0, 141, 33, 75, 0, 142, 34, 51, 0, 143, 35, 28, 0, 141, 36, 9, 0, 136, 41, 1, 0, 130, 48, 0, 0, 142, 9, 249,
+ 0, 144, 3, 243, 0, 145, 3, 235, 0, 145, 7, 223, 0, 143, 11, 207, 0, 143, 13, 193, 0, 142, 14, 178, 0, 141, 15, 162,
+ 0, 141, 15, 145, 0, 141, 16, 126, 0, 141, 16, 105, 0, 142, 17, 83, 0, 142, 17, 61, 0, 143, 17, 38, 0, 143, 19, 17,
+ 0, 139, 23, 2, 0, 127, 34, 0, 0, 149, 6, 249, 0, 148, 1, 237, 0, 147, 0, 227, 0, 145, 0, 216, 0, 144, 1, 204,
+ 0, 142, 2, 192, 0, 141, 2, 177, 0, 140, 2, 162, 0, 140, 2, 146, 0, 139, 3, 129, 0, 139, 3, 110, 0, 139, 3, 90,
+ 0, 138, 4, 69, 0, 139, 4, 47, 0, 140, 3, 26, 0, 138, 8, 8, 0, 127, 21, 0, 0, 153, 3, 248, 0, 151, 0, 232,
+ 0, 148, 0, 219, 0, 144, 0, 206, 0, 140, 0, 192, 0, 137, 0, 179, 0, 134, 0, 165, 0, 131, 0, 150, 0, 129, 0, 136,
+ 0, 128, 0, 122, 0, 127, 0, 107, 0, 127, 0, 91, 0, 126, 0, 73, 0, 126, 0, 54, 0, 126, 0, 35, 0, 125, 2, 17,
+ 0, 122, 10, 0, 0, 157, 0, 248, 0, 154, 0, 237, 0, 151, 0, 225, 0, 149, 0, 211, 0, 145, 0, 197, 0, 142, 0, 182,
+ 0, 139, 0, 166, 0, 134, 0, 151, 0, 129, 0, 136, 0, 127, 0, 126, 0, 125, 0, 112, 0, 123, 0, 98, 0, 122, 0, 82,
+ 0, 121, 0, 63, 0, 120, 0, 41, 0, 119, 0, 18, 0, 118, 0, 0, 0, 58, 221, 244, 0, 54, 227, 237, 0, 54, 229, 207,
+ 0, 58, 229, 183, 0, 62, 228, 160, 0, 66, 226, 126, 0, 70, 226, 87, 0, 69, 227, 49, 0, 68, 226, 20, 0, 71, 224, 3,
+ 0, 92, 212, 0, 0, 113, 204, 0, 0, 128, 197, 0, 0, 139, 193, 0, 0, 147, 188, 0, 0, 154, 184, 0, 0, 161, 180, 0,
+ 0, 67, 206, 244, 0, 69, 205, 232, 0, 75, 200, 200, 0, 76, 205, 182, 0, 75, 208, 162, 0, 80, 206, 136, 0, 84, 205, 100,
+ 0, 84, 207, 69, 0, 82, 209, 35, 0, 84, 207, 5, 0, 102, 198, 0, 0, 118, 189, 0, 0, 131, 184, 0, 0, 141, 181, 0,
+ 0, 148, 178, 0, 0, 154, 175, 0, 0, 158, 175, 0, 0, 76, 192, 244, 0, 77, 191, 235, 0, 86, 184, 197, 0, 84, 190, 181,
+ 0, 83, 195, 165, 0, 86, 196, 141, 0, 89, 196, 107, 0, 90, 196, 78, 0, 89, 197, 48, 0, 91, 197, 17, 0, 104, 190, 1,
+ 0, 120, 182, 0, 0, 131, 177, 0, 0, 140, 174, 0, 0, 147, 171, 0, 0, 152, 168, 0, 0, 156, 169, 0, 0, 84, 173, 248,
+ 0, 86, 171, 229, 0, 89, 172, 202, 0, 90, 175, 183, 0, 91, 179, 165, 0, 93, 181, 146, 0, 95, 183, 116, 0, 95, 184, 85,
+ 0, 94, 186, 58, 0, 96, 186, 28, 0, 107, 182, 3, 0, 120, 175, 0, 0, 131, 169, 0, 0, 139, 166, 0, 0, 145, 163, 0,
+ 0, 149, 160, 0, 0, 153, 163, 0, 0, 90, 151, 248, 0, 92, 152, 233, 0, 95, 156, 208, 0, 95, 159, 187, 0, 97, 163, 163,
+ 0, 99, 166, 150, 0, 100, 168, 125, 0, 100, 171, 94, 0, 99, 174, 67, 0, 100, 174, 36, 0, 108, 171, 6, 0, 121, 165, 0,
+ 0, 130, 160, 0, 0, 137, 156, 0, 0, 142, 153, 0, 0, 146, 151, 0, 0, 149, 154, 0, 0, 92, 136, 245, 0, 96, 138, 223,
+ 0, 100, 140, 205, 0, 101, 141, 193, 0, 100, 145, 172, 0, 101, 150, 152, 0, 104, 152, 135, 0, 104, 156, 106, 0, 102, 160, 78,
+ 0, 103, 161, 46, 0, 110, 158, 13, 0, 120, 154, 1, 0, 128, 149, 0, 0, 134, 145, 0, 0, 139, 142, 0, 0, 143, 140, 0,
+ 0, 147, 143, 0, 0, 95, 119, 246, 0, 99, 123, 222, 0, 104, 128, 200, 0, 103, 128, 187, 0, 105, 131, 176, 0, 103, 131, 158,
+ 0, 107, 134, 137, 0, 107, 138, 117, 0, 105, 144, 88, 0, 106, 145, 57, 0, 111, 144, 25, 0, 118, 142, 3, 0, 125, 137, 0,
+ 0, 131, 133, 0, 0, 135, 130, 0, 0, 139, 127, 0, 0, 144, 130, 0, 0, 97, 102, 243, 0, 102, 105, 223, 0, 105, 108, 207,
+ 0, 106, 110, 192, 0, 106, 113, 177, 0, 107, 117, 162, 0, 108, 115, 144, 0, 108, 120, 126, 0, 107, 126, 100, 0, 109, 128, 69,
+ 0, 113, 127, 37, 0, 118, 125, 10, 0, 124, 122, 1, 0, 129, 118, 0, 0, 133, 116, 0, 0, 136, 114, 0, 0, 141, 115, 0,
+ 0, 96, 83, 247, 0, 101, 85, 236, 0, 103, 88, 221, 0, 105, 93, 199, 0, 105, 96, 181, 0, 106, 98, 164, 0, 108, 99, 146,
+ 0, 109, 101, 129, 0, 108, 106, 108, 0, 111, 108, 80, 0, 115, 108, 50, 0, 120, 105, 21, 0, 124, 105, 2, 0, 128, 102, 0,
+ 0, 131, 100, 0, 0, 133, 98, 0, 0, 137, 98, 0, 0, 93, 62, 254, 0, 99, 62, 247, 0, 103, 66, 235, 0, 106, 74, 212,
+ 0, 108, 77, 193, 0, 108, 81, 175, 0, 109, 82, 155, 0, 110, 83, 135, 0, 111, 84, 117, 0, 112, 85, 97, 0, 117, 88, 65,
+ 0, 123, 87, 35, 0, 128, 84, 10, 0, 130, 82, 1, 0, 131, 82, 0, 0, 132, 81, 0, 0, 135, 79, 0, 0, 102, 45, 252,
+ 0, 106, 44, 250, 0, 109, 47, 241, 0, 112, 54, 225, 0, 114, 60, 206, 0, 115, 64, 188, 0, 116, 67, 169, 0, 116, 68, 148,
+ 0, 116, 70, 127, 0, 117, 70, 103, 0, 118, 72, 77, 0, 121, 73, 52, 0, 126, 70, 24, 0, 130, 64, 4, 0, 129, 66, 0,
+ 0, 128, 67, 0, 0, 129, 68, 0, 0, 108, 29, 251, 0, 112, 28, 249, 0, 115, 30, 241, 0, 118, 38, 226, 0, 120, 45, 209,
+ 0, 121, 47, 194, 0, 121, 51, 175, 0, 121, 52, 156, 0, 120, 54, 136, 0, 119, 56, 111, 0, 120, 56, 88, 0, 121, 58, 65,
+ 0, 124, 57, 40, 0, 128, 55, 15, 0, 127, 55, 1, 0, 124, 56, 0, 0, 124, 57, 0, 0, 113, 15, 251, 0, 118, 14, 246,
+ 0, 121, 17, 239, 0, 123, 23, 224, 0, 125, 30, 208, 0, 125, 32, 193, 0, 125, 34, 177, 0, 124, 35, 160, 0, 123, 37, 142,
+ 0, 121, 39, 119, 0, 122, 39, 97, 0, 123, 40, 75, 0, 124, 41, 52, 0, 127, 39, 27, 0, 128, 39, 6, 0, 123, 43, 0,
+ 0, 119, 49, 0, 0, 123, 9, 250, 0, 125, 5, 244, 0, 127, 6, 235, 0, 129, 10, 223, 0, 128, 15, 206, 0, 127, 16, 191,
+ 0, 126, 18, 176, 0, 126, 19, 160, 0, 126, 19, 144, 0, 125, 20, 125, 0, 126, 20, 105, 0, 127, 21, 83, 0, 127, 21, 61,
+ 0, 129, 21, 37, 0, 129, 23, 15, 0, 125, 26, 2, 0, 115, 36, 0, 0, 133, 6, 249, 0, 134, 1, 239, 0, 134, 1, 229,
+ 0, 133, 1, 217, 0, 131, 3, 203, 0, 129, 4, 190, 0, 128, 5, 175, 0, 127, 5, 160, 0, 126, 5, 144, 0, 125, 5, 127,
+ 0, 125, 5, 109, 0, 125, 6, 89, 0, 125, 6, 68, 0, 126, 6, 46, 0, 127, 6, 25, 0, 125, 9, 7, 0, 114, 23, 0,
+ 0, 141, 3, 249, 0, 140, 0, 233, 0, 137, 0, 220, 0, 134, 0, 206, 0, 130, 0, 192, 0, 127, 0, 178, 0, 123, 0, 164,
+ 0, 121, 0, 149, 0, 118, 0, 134, 0, 116, 0, 119, 0, 115, 0, 104, 0, 115, 0, 89, 0, 115, 0, 72, 0, 114, 0, 53,
+ 0, 114, 0, 34, 0, 113, 2, 16, 0, 110, 11, 0, 0, 147, 0, 248, 0, 144, 0, 238, 0, 142, 0, 226, 0, 139, 0, 213,
+ 0, 136, 0, 197, 0, 132, 0, 181, 0, 128, 0, 165, 0, 123, 0, 148, 0, 118, 0, 133, 0, 112, 0, 118, 0, 110, 0, 107,
+ 0, 109, 0, 94, 0, 108, 0, 79, 0, 107, 0, 61, 0, 106, 0, 41, 0, 105, 0, 18, 0, 104, 0, 0, 0, 41, 223, 245,
+ 0, 37, 227, 239, 0, 35, 233, 214, 0, 39, 234, 188, 0, 44, 233, 165, 0, 48, 233, 134, 0, 52, 233, 94, 0, 55, 234, 54,
+ 0, 59, 230, 29, 0, 60, 228, 7, 0, 65, 224, 0, 0, 87, 213, 0, 0, 107, 204, 0, 0, 121, 198, 0, 0, 133, 193, 0,
+ 0, 142, 190, 0, 0, 149, 186, 0, 0, 48, 207, 247, 0, 50, 206, 236, 0, 57, 200, 204, 0, 56, 207, 186, 0, 55, 211, 164,
+ 0, 60, 210, 142, 0, 65, 208, 110, 0, 69, 207, 78, 0, 70, 208, 49, 0, 67, 211, 13, 0, 75, 205, 0, 0, 94, 196, 0,
+ 0, 110, 188, 0, 0, 123, 184, 0, 0, 133, 181, 0, 0, 141, 180, 0, 0, 146, 181, 0, 0, 56, 193, 248, 0, 58, 192, 239,
+ 0, 67, 185, 201, 0, 66, 191, 185, 0, 64, 196, 167, 0, 67, 197, 146, 0, 71, 197, 117, 0, 74, 197, 85, 0, 74, 198, 58,
+ 0, 74, 199, 27, 0, 78, 196, 4, 0, 95, 187, 0, 0, 111, 180, 0, 0, 123, 176, 0, 0, 132, 173, 0, 0, 139, 172, 0,
+ 0, 144, 175, 0, 0, 65, 175, 250, 0, 66, 175, 241, 0, 73, 174, 205, 0, 72, 176, 186, 0, 73, 179, 167, 0, 76, 181, 149,
+ 0, 78, 182, 124, 0, 80, 184, 93, 0, 79, 187, 65, 0, 79, 188, 35, 0, 81, 187, 7, 0, 97, 179, 1, 0, 112, 172, 0,
+ 0, 122, 167, 0, 0, 129, 165, 0, 0, 136, 163, 0, 0, 140, 168, 0, 0, 73, 152, 251, 0, 73, 156, 243, 0, 78, 158, 210,
+ 0, 78, 161, 190, 0, 80, 162, 167, 0, 83, 164, 151, 0, 86, 165, 132, 0, 85, 169, 102, 0, 84, 174, 74, 0, 83, 175, 44,
+ 0, 86, 175, 12, 0, 99, 169, 1, 0, 112, 163, 0, 0, 120, 158, 0, 0, 127, 155, 0, 0, 133, 153, 0, 0, 136, 158, 0,
+ 0, 76, 136, 251, 0, 79, 139, 234, 0, 83, 142, 213, 0, 82, 145, 196, 0, 82, 148, 175, 0, 84, 151, 152, 0, 87, 152, 136,
+ 0, 88, 156, 111, 0, 87, 161, 83, 0, 87, 162, 53, 0, 89, 161, 20, 0, 99, 158, 2, 0, 110, 153, 0, 0, 118, 148, 0,
+ 0, 124, 144, 0, 0, 130, 142, 0, 0, 133, 147, 0, 0, 77, 121, 250, 0, 82, 126, 226, 0, 86, 129, 204, 0, 87, 130, 192,
+ 0, 87, 131, 180, 0, 87, 135, 160, 0, 88, 139, 140, 0, 89, 142, 120, 0, 89, 146, 93, 0, 89, 149, 64, 0, 90, 148, 32,
+ 0, 97, 147, 4, 0, 107, 142, 0, 0, 115, 137, 0, 0, 122, 132, 0, 0, 127, 129, 0, 0, 131, 133, 0, 0, 81, 104, 247,
+ 0, 85, 108, 227, 0, 87, 112, 210, 0, 89, 116, 194, 0, 89, 118, 177, 0, 90, 119, 163, 0, 89, 122, 146, 0, 93, 125, 124,
+ 0, 93, 128, 103, 0, 91, 133, 74, 0, 92, 133, 41, 0, 97, 131, 11, 0, 106, 128, 1, 0, 113, 123, 0, 0, 119, 119, 0,
+ 0, 124, 116, 0, 0, 128, 118, 0, 0, 82, 87, 246, 0, 86, 89, 232, 0, 88, 93, 217, 0, 90, 97, 197, 0, 93, 99, 177,
+ 0, 92, 101, 164, 0, 92, 105, 147, 0, 94, 106, 130, 0, 96, 108, 108, 0, 94, 114, 83, 0, 93, 117, 53, 0, 99, 113, 22,
+ 0, 105, 112, 2, 0, 112, 108, 0, 0, 117, 105, 0, 0, 120, 102, 0, 0, 125, 102, 0, 0, 79, 69, 248, 0, 84, 71, 238,
+ 0, 87, 74, 225, 0, 90, 78, 205, 0, 91, 81, 187, 0, 91, 85, 173, 0, 91, 86, 155, 0, 94, 88, 135, 0, 94, 89, 114,
+ 0, 92, 94, 92, 0, 96, 96, 65, 0, 102, 94, 34, 0, 107, 92, 9, 0, 112, 91, 1, 0, 115, 89, 0, 0, 117, 87, 0,
+ 0, 121, 86, 0, 0, 76, 49, 254, 0, 83, 49, 247, 0, 87, 52, 237, 0, 90, 59, 220, 0, 92, 64, 203, 0, 94, 66, 186,
+ 0, 94, 69, 167, 0, 95, 70, 146, 0, 96, 72, 122, 0, 96, 74, 103, 0, 95, 74, 84, 0, 103, 75, 49, 0, 110, 72, 20,
+ 0, 113, 71, 2, 0, 115, 70, 0, 0, 115, 70, 0, 0, 118, 68, 0, 0, 85, 33, 253, 0, 90, 32, 250, 0, 94, 35, 241,
+ 0, 97, 41, 227, 0, 99, 47, 209, 0, 101, 50, 193, 0, 102, 54, 175, 0, 102, 56, 156, 0, 102, 58, 133, 0, 101, 59, 110,
+ 0, 102, 59, 88, 0, 104, 60, 63, 0, 109, 58, 37, 0, 113, 55, 12, 0, 113, 56, 1, 0, 111, 59, 0, 0, 111, 60, 0,
+ 0, 93, 18, 251, 0, 98, 17, 249, 0, 101, 20, 241, 0, 104, 26, 227, 0, 106, 33, 210, 0, 107, 35, 195, 0, 108, 38, 178,
+ 0, 108, 39, 161, 0, 108, 40, 142, 0, 106, 43, 119, 0, 105, 44, 96, 0, 107, 44, 74, 0, 108, 46, 50, 0, 111, 44, 26,
+ 0, 113, 43, 4, 0, 109, 46, 0, 0, 106, 48, 0, 0, 103, 10, 250, 0, 105, 7, 245, 0, 108, 9, 236, 0, 110, 13, 224,
+ 0, 110, 19, 207, 0, 110, 20, 192, 0, 111, 23, 177, 0, 111, 23, 161, 0, 111, 24, 145, 0, 110, 25, 126, 0, 109, 27, 104,
+ 0, 109, 27, 83, 0, 110, 27, 61, 0, 112, 29, 37, 0, 114, 27, 14, 0, 111, 30, 1, 0, 102, 36, 0, 0, 114, 6, 250,
+ 0, 114, 2, 242, 0, 114, 2, 232, 0, 114, 4, 218, 0, 113, 6, 203, 0, 113, 7, 188, 0, 112, 8, 173, 0, 112, 8, 158,
+ 0, 111, 8, 142, 0, 110, 8, 126, 0, 110, 9, 108, 0, 110, 9, 89, 0, 111, 9, 68, 0, 111, 9, 45, 0, 113, 10, 23,
+ 0, 112, 12, 5, 0, 100, 24, 0, 0, 124, 3, 249, 0, 123, 0, 236, 0, 121, 0, 223, 0, 119, 0, 209, 0, 116, 1, 193,
+ 0, 114, 1, 179, 0, 111, 1, 164, 0, 109, 1, 149, 0, 106, 1, 134, 0, 104, 1, 118, 0, 102, 1, 103, 0, 103, 1, 88,
+ 0, 103, 1, 71, 0, 103, 1, 52, 0, 102, 1, 33, 0, 102, 3, 14, 0, 97, 12, 0, 0, 133, 0, 249, 0, 130, 0, 239,
+ 0, 128, 0, 228, 0, 126, 0, 214, 0, 123, 0, 198, 0, 119, 0, 181, 0, 115, 0, 164, 0, 110, 0, 147, 0, 105, 0, 130,
+ 0, 100, 0, 114, 0, 95, 0, 100, 0, 94, 0, 89, 0, 93, 0, 75, 0, 92, 0, 58, 0, 92, 0, 39, 0, 91, 0, 18,
+ 0, 90, 0, 0, 0, 32, 224, 245, 0, 30, 229, 243, 0, 23, 238, 229, 0, 22, 242, 196, 0, 29, 240, 168, 0, 34, 239, 139,
+ 0, 39, 239, 104, 0, 44, 239, 61, 0, 48, 237, 32, 0, 50, 234, 11, 0, 54, 229, 2, 0, 60, 224, 0, 0, 82, 214, 0,
+ 0, 101, 205, 0, 0, 115, 199, 0, 0, 126, 193, 0, 0, 136, 190, 0, 0, 34, 207, 247, 0, 34, 207, 238, 0, 39, 204, 211,
+ 0, 38, 209, 191, 0, 38, 213, 168, 0, 42, 214, 145, 0, 46, 212, 119, 0, 53, 210, 86, 0, 56, 210, 58, 0, 56, 211, 30,
+ 0, 57, 210, 5, 0, 68, 204, 0, 0, 86, 195, 0, 0, 103, 189, 0, 0, 116, 184, 0, 0, 126, 182, 0, 0, 132, 184, 0,
+ 0, 40, 193, 248, 0, 39, 194, 242, 0, 45, 191, 209, 0, 46, 193, 188, 0, 46, 197, 169, 0, 49, 198, 148, 0, 52, 198, 125,
+ 0, 56, 198, 94, 0, 59, 199, 65, 0, 60, 200, 37, 0, 59, 200, 10, 0, 69, 194, 1, 0, 87, 186, 0, 0, 103, 179, 0,
+ 0, 115, 176, 0, 0, 123, 174, 0, 0, 129, 177, 0, 0, 48, 176, 249, 0, 47, 177, 245, 0, 49, 179, 219, 0, 51, 179, 192,
+ 0, 54, 181, 170, 0, 56, 184, 153, 0, 58, 185, 131, 0, 61, 186, 101, 0, 63, 188, 71, 0, 63, 189, 42, 0, 63, 190, 12,
+ 0, 72, 185, 1, 0, 90, 176, 0, 0, 104, 170, 0, 0, 113, 167, 0, 0, 120, 165, 0, 0, 126, 170, 0, 0, 58, 156, 251,
+ 0, 55, 158, 248, 0, 55, 163, 226, 0, 58, 164, 196, 0, 61, 163, 168, 0, 63, 167, 153, 0, 64, 169, 134, 0, 66, 172, 109,
+ 0, 68, 175, 80, 0, 68, 177, 51, 0, 68, 177, 18, 0, 76, 174, 1, 0, 91, 166, 0, 0, 102, 161, 0, 0, 111, 158, 0,
+ 0, 118, 156, 0, 0, 122, 161, 0, 0, 63, 136, 252, 0, 62, 138, 245, 0, 64, 145, 222, 0, 64, 148, 200, 0, 65, 150, 177,
+ 0, 67, 153, 154, 0, 69, 155, 139, 0, 69, 158, 117, 0, 71, 162, 90, 0, 72, 164, 62, 0, 72, 164, 28, 0, 76, 162, 3,
+ 0, 89, 156, 0, 0, 100, 152, 0, 0, 108, 148, 0, 0, 115, 145, 0, 0, 119, 151, 0, 0, 62, 122, 251, 0, 66, 126, 232,
+ 0, 70, 131, 209, 0, 72, 133, 198, 0, 71, 135, 184, 0, 71, 139, 162, 0, 71, 141, 138, 0, 71, 145, 121, 0, 73, 148, 96,
+ 0, 74, 151, 69, 0, 73, 151, 38, 0, 75, 150, 7, 0, 87, 146, 0, 0, 98, 140, 0, 0, 106, 136, 0, 0, 113, 133, 0,
+ 0, 116, 138, 0, 0, 64, 106, 248, 0, 68, 111, 228, 0, 71, 118, 207, 0, 73, 119, 194, 0, 74, 121, 181, 0, 75, 122, 168,
+ 0, 75, 128, 146, 0, 73, 130, 124, 0, 75, 132, 103, 0, 76, 136, 78, 0, 74, 139, 48, 0, 75, 137, 17, 0, 85, 133, 1,
+ 0, 96, 128, 0, 0, 104, 123, 0, 0, 111, 120, 0, 0, 114, 124, 0, 0, 67, 88, 247, 0, 73, 93, 230, 0, 75, 97, 212,
+ 0, 76, 100, 197, 0, 77, 104, 181, 0, 76, 107, 166, 0, 77, 108, 150, 0, 77, 111, 132, 0, 79, 113, 106, 0, 78, 117, 87,
+ 0, 75, 124, 58, 0, 77, 122, 27, 0, 84, 119, 3, 0, 94, 114, 0, 0, 102, 109, 0, 0, 108, 106, 0, 0, 111, 108, 0,
+ 0, 66, 72, 246, 0, 72, 78, 229, 0, 74, 81, 215, 0, 75, 83, 202, 0, 76, 86, 188, 0, 79, 88, 173, 0, 78, 90, 155,
+ 0, 79, 94, 137, 0, 80, 94, 117, 0, 79, 97, 94, 0, 78, 102, 69, 0, 80, 102, 41, 0, 86, 100, 14, 0, 93, 97, 1,
+ 0, 99, 93, 0, 0, 104, 91, 0, 0, 107, 92, 0, 0, 63, 55, 249, 0, 68, 56, 238, 0, 71, 60, 227, 0, 74, 65, 212,
+ 0, 75, 67, 199, 0, 77, 70, 181, 0, 78, 74, 161, 0, 78, 76, 142, 0, 80, 77, 120, 0, 79, 79, 100, 0, 78, 82, 77,
+ 0, 82, 82, 52, 0, 88, 81, 23, 0, 93, 79, 2, 0, 97, 77, 0, 0, 100, 75, 0, 0, 103, 75, 0, 0, 59, 36, 254,
+ 0, 67, 36, 247, 0, 71, 40, 237, 0, 75, 45, 223, 0, 77, 50, 207, 0, 79, 53, 190, 0, 80, 57, 172, 0, 81, 58, 153,
+ 0, 81, 60, 130, 0, 81, 62, 107, 0, 81, 62, 88, 0, 80, 62, 71, 0, 89, 60, 34, 0, 95, 61, 7, 0, 97, 61, 0,
+ 0, 98, 61, 0, 0, 99, 59, 0, 0, 69, 21, 253, 0, 75, 20, 250, 0, 79, 22, 243, 0, 82, 29, 228, 0, 84, 35, 211,
+ 0, 85, 37, 196, 0, 85, 40, 180, 0, 86, 42, 161, 0, 87, 43, 142, 0, 87, 45, 118, 0, 86, 46, 96, 0, 88, 46, 75,
+ 0, 90, 47, 48, 0, 94, 44, 22, 0, 96, 44, 3, 0, 95, 46, 0, 0, 93, 48, 0, 0, 82, 12, 252, 0, 84, 9, 248,
+ 0, 87, 10, 241, 0, 90, 14, 229, 0, 90, 21, 211, 0, 91, 23, 196, 0, 91, 25, 180, 0, 92, 26, 163, 0, 93, 27, 146,
+ 0, 93, 28, 126, 0, 91, 30, 104, 0, 91, 30, 82, 0, 92, 30, 60, 0, 93, 32, 35, 0, 96, 30, 13, 0, 94, 32, 1,
+ 0, 88, 36, 0, 0, 93, 6, 251, 0, 94, 2, 244, 0, 94, 3, 235, 0, 95, 5, 222, 0, 95, 9, 207, 0, 95, 9, 192,
+ 0, 96, 11, 176, 0, 96, 11, 160, 0, 96, 11, 144, 0, 95, 12, 127, 0, 95, 12, 109, 0, 93, 14, 88, 0, 94, 14, 68,
+ 0, 95, 14, 45, 0, 96, 15, 22, 0, 97, 16, 3, 0, 85, 24, 0, 0, 105, 3, 250, 0, 104, 0, 238, 0, 102, 0, 227,
+ 0, 101, 0, 214, 0, 100, 1, 200, 0, 99, 1, 184, 0, 98, 1, 168, 0, 96, 1, 151, 0, 94, 1, 135, 0, 93, 1, 120,
+ 0, 91, 1, 104, 0, 90, 1, 87, 0, 91, 1, 71, 0, 91, 1, 51, 0, 91, 1, 31, 0, 90, 3, 12, 0, 81, 12, 0,
+ 0, 115, 0, 250, 0, 112, 0, 241, 0, 110, 0, 231, 0, 109, 0, 217, 0, 107, 0, 201, 0, 104, 0, 184, 0, 101, 0, 165,
+ 0, 97, 0, 146, 0, 92, 0, 129, 0, 88, 0, 112, 0, 83, 0, 97, 0, 78, 0, 82, 0, 77, 0, 71, 0, 77, 0, 56,
+ 0, 77, 0, 37, 0, 76, 0, 18, 0, 75, 0, 0, 0, 26, 226, 245, 0, 26, 229, 244, 0, 20, 236, 236, 0, 14, 244, 202,
+ 0, 17, 244, 172, 0, 21, 245, 145, 0, 25, 244, 112, 0, 30, 244, 69, 0, 37, 244, 34, 0, 42, 238, 14, 0, 47, 234, 5,
+ 0, 51, 228, 0, 0, 56, 224, 0, 0, 77, 215, 0, 0, 95, 206, 0, 0, 109, 199, 0, 0, 120, 194, 0, 0, 26, 208, 247,
+ 0, 23, 209, 238, 0, 26, 207, 214, 0, 25, 212, 194, 0, 24, 216, 172, 0, 27, 217, 149, 0, 31, 215, 124, 0, 37, 214, 95,
+ 0, 43, 213, 64, 0, 46, 213, 41, 0, 46, 212, 14, 0, 50, 209, 1, 0, 61, 203, 0, 0, 79, 196, 0, 0, 95, 190, 0,
+ 0, 108, 186, 0, 0, 117, 187, 0, 0, 27, 192, 248, 0, 24, 195, 243, 0, 27, 196, 212, 0, 29, 197, 189, 0, 31, 199, 172,
+ 0, 33, 200, 152, 0, 36, 201, 130, 0, 40, 201, 103, 0, 44, 201, 72, 0, 47, 201, 44, 0, 47, 201, 18, 0, 51, 199, 2,
+ 0, 62, 193, 0, 0, 80, 185, 0, 0, 96, 180, 0, 0, 106, 178, 0, 0, 113, 181, 0, 0, 33, 176, 249, 0, 31, 178, 247,
+ 0, 30, 183, 226, 0, 33, 183, 193, 0, 36, 183, 170, 0, 38, 187, 154, 0, 39, 189, 133, 0, 42, 190, 108, 0, 46, 190, 77,
+ 0, 48, 192, 48, 0, 49, 191, 19, 0, 54, 190, 1, 0, 66, 183, 0, 0, 83, 175, 0, 0, 94, 170, 0, 0, 104, 169, 0,
+ 0, 110, 174, 0, 0, 42, 158, 250, 0, 39, 160, 249, 0, 37, 166, 234, 0, 39, 167, 200, 0, 42, 166, 170, 0, 42, 172, 155,
+ 0, 43, 176, 138, 0, 45, 178, 116, 0, 49, 178, 86, 0, 51, 180, 57, 0, 52, 181, 26, 0, 55, 180, 2, 0, 68, 172, 0,
+ 0, 81, 165, 0, 0, 92, 161, 0, 0, 101, 159, 0, 0, 106, 165, 0, 0, 49, 138, 251, 0, 46, 139, 248, 0, 45, 146, 232,
+ 0, 46, 151, 205, 0, 46, 154, 180, 0, 46, 158, 155, 0, 47, 160, 140, 0, 49, 163, 121, 0, 51, 166, 95, 0, 53, 167, 68,
+ 0, 53, 169, 37, 0, 54, 169, 6, 0, 66, 162, 0, 0, 79, 155, 0, 0, 90, 150, 0, 0, 99, 148, 0, 0, 102, 155, 0,
+ 0, 49, 122, 251, 0, 50, 125, 239, 0, 54, 131, 218, 0, 54, 135, 204, 0, 52, 139, 186, 0, 52, 142, 164, 0, 52, 144, 140,
+ 0, 52, 149, 124, 0, 52, 153, 102, 0, 54, 154, 75, 0, 55, 157, 45, 0, 54, 156, 14, 0, 63, 151, 1, 0, 77, 144, 0,
+ 0, 89, 139, 0, 0, 97, 137, 0, 0, 99, 143, 0, 0, 49, 108, 250, 0, 52, 112, 230, 0, 57, 119, 208, 0, 57, 121, 198,
+ 0, 57, 123, 186, 0, 57, 126, 172, 0, 56, 131, 148, 0, 54, 135, 125, 0, 56, 137, 106, 0, 57, 139, 81, 0, 56, 144, 53,
+ 0, 55, 143, 23, 0, 60, 140, 2, 0, 76, 132, 0, 0, 87, 127, 0, 0, 95, 124, 0, 0, 98, 129, 0, 0, 52, 90, 250,
+ 0, 57, 95, 228, 0, 60, 101, 205, 0, 59, 105, 196, 0, 59, 108, 183, 0, 60, 110, 169, 0, 61, 111, 155, 0, 60, 116, 132,
+ 0, 59, 117, 108, 0, 59, 121, 88, 0, 57, 127, 64, 0, 56, 129, 32, 0, 59, 128, 5, 0, 74, 119, 0, 0, 85, 113, 0,
+ 0, 92, 110, 0, 0, 96, 114, 0, 0, 53, 73, 247, 0, 59, 78, 230, 0, 61, 83, 214, 0, 61, 85, 203, 0, 61, 89, 191,
+ 0, 62, 92, 175, 0, 62, 95, 154, 0, 64, 97, 137, 0, 63, 99, 118, 0, 62, 100, 92, 0, 63, 103, 73, 0, 61, 108, 46,
+ 0, 62, 108, 18, 0, 73, 103, 1, 0, 83, 98, 0, 0, 89, 94, 0, 0, 92, 97, 0, 0, 51, 58, 246, 0, 54, 62, 233,
+ 0, 56, 66, 222, 0, 58, 70, 210, 0, 59, 72, 197, 0, 62, 75, 178, 0, 66, 77, 155, 0, 65, 79, 139, 0, 65, 81, 121,
+ 0, 66, 82, 99, 0, 65, 83, 79, 0, 64, 87, 56, 0, 65, 88, 29, 0, 72, 86, 3, 0, 80, 82, 0, 0, 86, 79, 0,
+ 0, 88, 80, 0, 0, 47, 42, 250, 0, 53, 43, 238, 0, 56, 47, 228, 0, 58, 52, 215, 0, 59, 55, 202, 0, 61, 58, 184,
+ 0, 63, 61, 166, 0, 64, 63, 148, 0, 64, 65, 129, 0, 65, 66, 105, 0, 64, 67, 85, 0, 62, 69, 63, 0, 66, 69, 36,
+ 0, 73, 68, 9, 0, 79, 66, 1, 0, 82, 65, 0, 0, 83, 65, 0, 0, 44, 26, 254, 0, 53, 25, 247, 0, 57, 26, 239,
+ 0, 59, 33, 225, 0, 61, 37, 209, 0, 62, 39, 195, 0, 63, 42, 180, 0, 65, 44, 162, 0, 66, 46, 142, 0, 66, 48, 117,
+ 0, 66, 49, 94, 0, 66, 48, 75, 0, 65, 48, 57, 0, 74, 46, 19, 0, 79, 47, 2, 0, 80, 47, 0, 0, 80, 47, 0,
+ 0, 58, 15, 253, 0, 61, 12, 249, 0, 65, 12, 242, 0, 68, 15, 231, 0, 68, 23, 212, 0, 68, 24, 198, 0, 69, 27, 183,
+ 0, 70, 28, 166, 0, 71, 29, 147, 0, 72, 30, 126, 0, 72, 32, 103, 0, 71, 33, 82, 0, 73, 32, 59, 0, 75, 33, 33,
+ 0, 79, 32, 9, 0, 78, 32, 1, 0, 75, 34, 0, 0, 72, 8, 252, 0, 73, 4, 246, 0, 74, 3, 240, 0, 75, 6, 228,
+ 0, 75, 10, 212, 0, 75, 11, 198, 0, 76, 13, 181, 0, 76, 13, 165, 0, 77, 14, 147, 0, 78, 14, 129, 0, 78, 15, 110,
+ 0, 76, 16, 88, 0, 76, 17, 67, 0, 77, 17, 44, 0, 78, 19, 20, 0, 79, 19, 2, 0, 70, 24, 0, 0, 84, 3, 251,
+ 0, 84, 1, 241, 0, 83, 0, 231, 0, 82, 0, 220, 0, 81, 1, 207, 0, 81, 1, 193, 0, 81, 2, 176, 0, 80, 1, 158,
+ 0, 80, 1, 140, 0, 79, 1, 124, 0, 79, 1, 108, 0, 78, 2, 90, 0, 77, 2, 71, 0, 77, 2, 51, 0, 78, 2, 29,
+ 0, 77, 4, 9, 0, 67, 12, 0, 0, 96, 0, 251, 0, 93, 0, 242, 0, 92, 0, 232, 0, 91, 0, 220, 0, 89, 0, 205,
+ 0, 88, 0, 188, 0, 85, 0, 169, 0, 82, 0, 148, 0, 78, 0, 128, 0, 74, 0, 111, 0, 70, 0, 95, 0, 66, 0, 79,
+ 0, 63, 0, 67, 0, 62, 0, 54, 0, 62, 0, 37, 0, 62, 0, 18, 0, 61, 0, 0, 0, 20, 229, 245, 0, 21, 230, 245,
+ 0, 18, 234, 239, 0, 10, 242, 207, 0, 12, 244, 177, 0, 16, 243, 153, 0, 20, 243, 125, 0, 25, 243, 91, 0, 30, 243, 52,
+ 0, 36, 241, 25, 0, 41, 236, 12, 0, 45, 232, 5, 0, 48, 227, 0, 0, 52, 225, 0, 0, 72, 215, 0, 0, 89, 207, 0,
+ 0, 103, 200, 0, 0, 20, 209, 246, 0, 15, 208, 235, 0, 19, 207, 212, 0, 18, 211, 194, 0, 14, 217, 177, 0, 16, 218, 156,
+ 0, 18, 219, 130, 0, 23, 218, 104, 0, 29, 216, 72, 0, 35, 215, 47, 0, 39, 213, 28, 0, 40, 213, 7, 0, 45, 208, 0,
+ 0, 54, 203, 0, 0, 72, 197, 0, 0, 88, 192, 0, 0, 98, 193, 0, 0, 20, 192, 247, 0, 14, 196, 242, 0, 16, 197, 210,
+ 0, 17, 199, 188, 0, 18, 201, 173, 0, 19, 203, 156, 0, 22, 203, 134, 0, 26, 203, 112, 0, 30, 203, 82, 0, 35, 204, 53,
+ 0, 37, 205, 28, 0, 38, 203, 4, 0, 47, 198, 0, 0, 57, 192, 0, 0, 74, 186, 0, 0, 86, 183, 0, 0, 94, 187, 0,
+ 0, 23, 176, 248, 0, 19, 179, 246, 0, 16, 184, 226, 0, 17, 186, 193, 0, 18, 188, 171, 0, 20, 190, 157, 0, 22, 192, 137,
+ 0, 26, 192, 116, 0, 30, 192, 88, 0, 34, 194, 58, 0, 36, 195, 28, 0, 38, 193, 4, 0, 49, 188, 0, 0, 60, 182, 0,
+ 0, 73, 176, 0, 0, 84, 173, 0, 0, 91, 179, 0, 0, 29, 159, 249, 0, 25, 160, 248, 0, 22, 166, 233, 0, 21, 170, 200,
+ 0, 21, 172, 172, 0, 21, 177, 156, 0, 23, 180, 140, 0, 26, 180, 120, 0, 29, 181, 94, 0, 33, 182, 65, 0, 35, 185, 35,
+ 0, 36, 184, 7, 0, 46, 179, 0, 0, 58, 172, 0, 0, 71, 166, 0, 0, 83, 162, 0, 0, 88, 170, 0, 0, 35, 140, 250,
+ 0, 32, 141, 249, 0, 28, 146, 236, 0, 27, 153, 207, 0, 25, 157, 181, 0, 24, 160, 156, 0, 27, 163, 140, 0, 29, 165, 123,
+ 0, 30, 168, 101, 0, 33, 170, 73, 0, 35, 173, 45, 0, 35, 174, 15, 0, 43, 169, 1, 0, 55, 162, 0, 0, 70, 155, 0,
+ 0, 81, 151, 0, 0, 85, 159, 0, 0, 37, 124, 251, 0, 36, 125, 245, 0, 35, 129, 232, 0, 33, 136, 212, 0, 31, 143, 191,
+ 0, 31, 147, 169, 0, 32, 147, 139, 0, 32, 151, 125, 0, 32, 155, 106, 0, 34, 157, 79, 0, 35, 160, 52, 0, 35, 162, 22,
+ 0, 40, 159, 2, 0, 53, 152, 0, 0, 69, 143, 0, 0, 80, 139, 0, 0, 82, 148, 0, 0, 36, 109, 251, 0, 37, 112, 235,
+ 0, 38, 117, 216, 0, 39, 122, 206, 0, 39, 127, 195, 0, 37, 131, 175, 0, 37, 135, 150, 0, 36, 137, 126, 0, 37, 140, 108,
+ 0, 37, 143, 86, 0, 36, 146, 60, 0, 35, 150, 29, 0, 37, 148, 4, 0, 52, 140, 0, 0, 68, 131, 0, 0, 79, 127, 0,
+ 0, 80, 134, 0, 0, 37, 92, 250, 0, 40, 98, 228, 0, 42, 105, 205, 0, 42, 108, 198, 0, 42, 110, 184, 0, 43, 113, 173,
+ 0, 43, 116, 159, 0, 41, 120, 134, 0, 41, 120, 108, 0, 40, 124, 92, 0, 39, 129, 68, 0, 37, 134, 39, 0, 37, 135, 9,
+ 0, 50, 128, 1, 0, 66, 119, 0, 0, 77, 114, 0, 0, 78, 120, 0, 0, 40, 74, 249, 0, 43, 78, 234, 0, 44, 84, 216,
+ 0, 45, 89, 204, 0, 44, 93, 191, 0, 44, 96, 171, 0, 45, 98, 157, 0, 47, 99, 139, 0, 44, 103, 119, 0, 43, 103, 94,
+ 0, 44, 106, 74, 0, 42, 111, 49, 0, 40, 115, 19, 0, 49, 111, 2, 0, 64, 102, 0, 0, 74, 98, 0, 0, 75, 103, 0,
+ 0, 41, 59, 248, 0, 43, 62, 236, 0, 44, 65, 225, 0, 45, 71, 209, 0, 47, 75, 194, 0, 49, 78, 177, 0, 49, 81, 158,
+ 0, 48, 83, 141, 0, 49, 84, 124, 0, 47, 86, 101, 0, 49, 85, 78, 0, 47, 89, 58, 0, 43, 94, 32, 0, 47, 93, 5,
+ 0, 62, 86, 0, 0, 70, 83, 0, 0, 71, 85, 0, 0, 38, 45, 248, 0, 41, 49, 233, 0, 42, 52, 223, 0, 43, 57, 209,
+ 0, 44, 61, 196, 0, 46, 64, 180, 0, 48, 65, 165, 0, 50, 66, 146, 0, 51, 68, 129, 0, 50, 69, 107, 0, 50, 70, 86,
+ 0, 48, 70, 65, 0, 48, 74, 41, 0, 50, 73, 15, 0, 59, 71, 1, 0, 67, 68, 0, 0, 67, 69, 0, 0, 35, 31, 252,
+ 0, 39, 33, 236, 0, 42, 35, 226, 0, 44, 39, 214, 0, 45, 41, 200, 0, 45, 45, 188, 0, 46, 48, 174, 0, 48, 50, 156,
+ 0, 49, 52, 135, 0, 50, 53, 114, 0, 50, 54, 91, 0, 49, 54, 71, 0, 47, 56, 46, 0, 52, 55, 21, 0, 59, 53, 2,
+ 0, 63, 51, 0, 0, 63, 52, 0, 0, 32, 18, 254, 0, 39, 16, 246, 0, 43, 17, 238, 0, 45, 20, 227, 0, 46, 25, 210,
+ 0, 46, 27, 196, 0, 47, 29, 182, 0, 49, 30, 164, 0, 49, 32, 144, 0, 50, 33, 124, 0, 51, 35, 100, 0, 52, 35, 78,
+ 0, 51, 35, 59, 0, 48, 37, 42, 0, 59, 33, 6, 0, 61, 34, 0, 0, 61, 36, 0, 0, 47, 10, 253, 0, 49, 6, 248,
+ 0, 51, 5, 241, 0, 52, 7, 231, 0, 52, 13, 214, 0, 51, 14, 199, 0, 52, 15, 184, 0, 53, 16, 167, 0, 54, 17, 149,
+ 0, 55, 18, 130, 0, 56, 18, 109, 0, 56, 19, 87, 0, 56, 20, 66, 0, 58, 19, 43, 0, 60, 21, 17, 0, 61, 21, 2,
+ 0, 56, 24, 0, 0, 62, 4, 252, 0, 62, 1, 245, 0, 61, 0, 236, 0, 60, 1, 227, 0, 60, 3, 214, 0, 60, 3, 199,
+ 0, 60, 3, 183, 0, 60, 4, 164, 0, 60, 4, 146, 0, 61, 4, 128, 0, 62, 4, 109, 0, 61, 4, 91, 0, 60, 5, 71,
+ 0, 61, 4, 50, 0, 63, 4, 28, 0, 62, 6, 6, 0, 53, 13, 0, 0, 75, 0, 252, 0, 73, 0, 243, 0, 72, 0, 235,
+ 0, 71, 0, 224, 0, 70, 0, 210, 0, 69, 0, 194, 0, 67, 0, 174, 0, 65, 0, 152, 0, 62, 0, 129, 0, 59, 0, 110,
+ 0, 56, 0, 93, 0, 53, 0, 77, 0, 50, 0, 64, 0, 49, 0, 52, 0, 49, 0, 38, 0, 50, 0, 20, 0, 48, 0, 0,
+ 0, 14, 230, 245, 0, 14, 231, 245, 0, 12, 235, 239, 0, 8, 239, 208, 0, 10, 240, 181, 0, 14, 240, 159, 0, 17, 240, 137,
+ 0, 21, 240, 109, 0, 26, 239, 73, 0, 32, 240, 41, 0, 36, 238, 22, 0, 40, 234, 12, 0, 43, 231, 5, 0, 45, 227, 0,
+ 0, 48, 225, 0, 0, 67, 216, 0, 0, 84, 207, 0, 0, 13, 211, 246, 0, 10, 208, 231, 0, 12, 207, 211, 0, 12, 211, 194,
+ 0, 8, 217, 180, 0, 9, 219, 161, 0, 11, 219, 137, 0, 15, 220, 111, 0, 20, 219, 84, 0, 28, 216, 57, 0, 33, 214, 39,
+ 0, 36, 213, 24, 0, 37, 212, 6, 0, 41, 209, 0, 0, 49, 205, 0, 0, 66, 200, 0, 0, 78, 199, 0, 0, 13, 194, 247,
+ 0, 7, 197, 240, 0, 7, 198, 209, 0, 8, 200, 187, 0, 9, 203, 173, 0, 9, 205, 158, 0, 11, 206, 139, 0, 13, 206, 116,
+ 0, 17, 205, 91, 0, 23, 205, 62, 0, 27, 205, 38, 0, 29, 204, 17, 0, 35, 202, 3, 0, 42, 198, 0, 0, 51, 194, 0,
+ 0, 63, 190, 0, 0, 73, 193, 0, 0, 15, 177, 248, 0, 10, 180, 245, 0, 6, 186, 221, 0, 5, 189, 189, 0, 5, 192, 168,
+ 0, 6, 194, 157, 0, 8, 195, 140, 0, 11, 194, 120, 0, 14, 193, 97, 0, 18, 194, 69, 0, 21, 195, 40, 0, 23, 196, 15,
+ 0, 30, 193, 2, 0, 40, 188, 0, 0, 49, 184, 0, 0, 61, 180, 0, 0, 70, 186, 0, 0, 18, 159, 249, 0, 15, 161, 247,
+ 0, 10, 167, 230, 0, 8, 173, 198, 0, 5, 178, 170, 0, 5, 181, 155, 0, 6, 182, 141, 0, 9, 181, 123, 0, 12, 181, 102,
+ 0, 15, 182, 76, 0, 18, 184, 47, 0, 20, 186, 19, 0, 25, 183, 2, 0, 37, 179, 0, 0, 46, 175, 0, 0, 60, 169, 0,
+ 0, 67, 177, 0, 0, 22, 140, 250, 0, 20, 142, 249, 0, 15, 147, 237, 0, 12, 156, 207, 0, 9, 161, 179, 0, 7, 164, 154,
+ 0, 8, 164, 139, 0, 10, 166, 124, 0, 12, 168, 106, 0, 14, 169, 80, 0, 16, 171, 54, 0, 17, 174, 27, 0, 20, 173, 3,
+ 0, 33, 169, 0, 0, 45, 163, 0, 0, 59, 157, 0, 0, 64, 166, 0, 0, 25, 123, 251, 0, 24, 123, 249, 0, 20, 128, 241,
+ 0, 17, 137, 216, 0, 13, 143, 190, 0, 11, 146, 163, 0, 11, 145, 138, 0, 12, 150, 124, 0, 13, 153, 107, 0, 14, 156, 85,
+ 0, 15, 158, 61, 0, 15, 161, 33, 0, 17, 161, 6, 0, 32, 157, 0, 0, 45, 151, 0, 0, 59, 145, 0, 0, 62, 154, 0,
+ 0, 24, 109, 251, 0, 23, 111, 239, 0, 22, 115, 225, 0, 21, 121, 211, 0, 20, 126, 195, 0, 17, 132, 174, 0, 17, 135, 152,
+ 0, 14, 135, 124, 0, 16, 138, 108, 0, 16, 141, 89, 0, 16, 145, 67, 0, 16, 147, 40, 0, 16, 149, 11, 0, 30, 145, 1,
+ 0, 45, 139, 0, 0, 59, 133, 0, 0, 61, 141, 0, 0, 24, 94, 251, 0, 24, 98, 231, 0, 24, 103, 205, 0, 24, 106, 197,
+ 0, 25, 112, 189, 0, 26, 116, 179, 0, 24, 120, 160, 0, 22, 123, 135, 0, 22, 122, 110, 0, 21, 126, 92, 0, 19, 129, 73,
+ 0, 18, 132, 48, 0, 17, 135, 18, 0, 27, 132, 1, 0, 44, 126, 0, 0, 58, 119, 0, 0, 59, 127, 0, 0, 25, 76, 251,
+ 0, 27, 80, 236, 0, 27, 86, 216, 0, 27, 91, 199, 0, 27, 96, 187, 0, 28, 97, 170, 0, 28, 101, 160, 0, 29, 102, 144,
+ 0, 26, 106, 120, 0, 23, 106, 93, 0, 24, 109, 76, 0, 23, 112, 53, 0, 20, 118, 26, 0, 25, 116, 3, 0, 42, 108, 0,
+ 0, 56, 101, 0, 0, 57, 109, 0, 0, 27, 59, 251, 0, 29, 61, 241, 0, 29, 65, 229, 0, 31, 73, 206, 0, 34, 78, 187,
+ 0, 32, 82, 176, 0, 31, 84, 159, 0, 31, 86, 143, 0, 33, 87, 128, 0, 30, 88, 101, 0, 29, 88, 79, 0, 28, 92, 59,
+ 0, 23, 98, 36, 0, 24, 99, 7, 0, 40, 91, 0, 0, 53, 86, 0, 0, 54, 89, 0, 0, 26, 46, 250, 0, 29, 50, 234,
+ 0, 29, 53, 222, 0, 30, 58, 207, 0, 31, 63, 193, 0, 32, 66, 181, 0, 32, 68, 166, 0, 34, 69, 146, 0, 34, 72, 128,
+ 0, 34, 72, 108, 0, 32, 73, 85, 0, 32, 73, 64, 0, 31, 76, 43, 0, 30, 79, 17, 0, 38, 76, 1, 0, 50, 70, 0,
+ 0, 49, 72, 0, 0, 24, 34, 251, 0, 27, 39, 230, 0, 28, 42, 218, 0, 29, 45, 206, 0, 29, 47, 195, 0, 29, 50, 184,
+ 0, 30, 53, 171, 0, 33, 54, 152, 0, 37, 54, 128, 0, 38, 55, 111, 0, 35, 58, 90, 0, 36, 57, 70, 0, 32, 57, 51,
+ 0, 33, 61, 24, 0, 36, 60, 2, 0, 47, 55, 0, 0, 45, 56, 0, 0, 22, 22, 254, 0, 25, 25, 232, 0, 27, 27, 219,
+ 0, 29, 29, 207, 0, 29, 32, 197, 0, 30, 33, 186, 0, 31, 36, 174, 0, 32, 37, 158, 0, 34, 38, 139, 0, 34, 39, 121,
+ 0, 35, 40, 99, 0, 35, 40, 76, 0, 34, 41, 55, 0, 31, 44, 31, 0, 36, 42, 6, 0, 44, 39, 0, 0, 43, 41, 0,
+ 0, 21, 12, 255, 0, 27, 11, 243, 0, 29, 10, 234, 0, 30, 11, 224, 0, 30, 15, 210, 0, 30, 16, 196, 0, 31, 18, 181,
+ 0, 32, 19, 166, 0, 33, 19, 149, 0, 34, 20, 131, 0, 35, 21, 110, 0, 35, 22, 86, 0, 36, 23, 63, 0, 36, 23, 45,
+ 0, 32, 26, 29, 0, 42, 24, 0, 0, 41, 26, 0, 0, 37, 5, 253, 0, 38, 2, 248, 0, 37, 1, 241, 0, 36, 2, 231,
+ 0, 36, 5, 217, 0, 36, 6, 201, 0, 36, 6, 185, 0, 37, 7, 167, 0, 37, 7, 149, 0, 38, 7, 130, 0, 39, 7, 111,
+ 0, 40, 7, 91, 0, 40, 8, 70, 0, 41, 7, 50, 0, 48, 5, 28, 0, 47, 6, 0, 0, 39, 15, 0, 0, 52, 0, 253,
+ 0, 50, 0, 247, 0, 48, 0, 240, 0, 47, 0, 231, 0, 46, 0, 219, 0, 45, 0, 203, 0, 44, 0, 184, 0, 43, 0, 161,
+ 0, 42, 0, 135, 0, 41, 0, 114, 0, 40, 0, 96, 0, 38, 0, 77, 0, 36, 0, 63, 0, 35, 0, 51, 0, 35, 0, 37,
+ 0, 37, 0, 23, 0, 35, 0, 0, 0, 7, 231, 244, 0, 7, 232, 244, 0, 6, 234, 237, 0, 7, 236, 208, 0, 9, 236, 185,
+ 0, 12, 236, 166, 0, 16, 236, 146, 0, 19, 236, 122, 0, 23, 236, 95, 0, 28, 236, 65, 0, 33, 237, 39, 0, 36, 235, 22,
+ 0, 39, 232, 13, 0, 41, 229, 5, 0, 42, 227, 1, 0, 44, 226, 0, 0, 62, 216, 0, 0, 7, 213, 246, 0, 5, 209, 226,
+ 0, 7, 209, 209, 0, 7, 213, 194, 0, 4, 218, 180, 0, 5, 219, 165, 0, 8, 219, 146, 0, 11, 220, 121, 0, 16, 219, 97,
+ 0, 22, 218, 71, 0, 29, 215, 50, 0, 33, 214, 37, 0, 36, 212, 23, 0, 36, 212, 7, 0, 38, 210, 2, 0, 44, 208, 1,
+ 0, 54, 206, 0, 0, 7, 196, 246, 0, 2, 199, 235, 0, 1, 199, 202, 0, 1, 202, 183, 0, 2, 204, 170, 0, 2, 206, 159,
+ 0, 3, 208, 143, 0, 5, 208, 122, 0, 8, 208, 98, 0, 13, 208, 73, 0, 19, 206, 50, 0, 23, 206, 32, 0, 25, 205, 16,
+ 0, 28, 203, 4, 0, 34, 200, 2, 0, 40, 198, 2, 0, 47, 196, 0, 0, 7, 178, 247, 0, 4, 182, 241, 0, 1, 187, 209,
+ 0, 0, 189, 180, 0, 0, 192, 163, 0, 1, 194, 154, 0, 1, 196, 141, 0, 1, 196, 124, 0, 2, 197, 102, 0, 4, 198, 76,
+ 0, 9, 198, 49, 0, 12, 198, 26, 0, 14, 198, 8, 0, 22, 194, 2, 0, 30, 191, 1, 0, 37, 189, 1, 0, 44, 193, 0,
+ 0, 8, 160, 248, 0, 6, 163, 245, 0, 3, 170, 221, 0, 1, 175, 191, 0, 0, 177, 164, 0, 0, 180, 149, 0, 0, 182, 139,
+ 0, 1, 182, 126, 0, 1, 182, 107, 0, 2, 183, 84, 0, 4, 184, 58, 0, 6, 186, 31, 0, 8, 187, 8, 0, 17, 184, 2,
+ 0, 27, 181, 0, 0, 35, 179, 0, 0, 41, 186, 0, 0, 10, 140, 249, 0, 9, 143, 247, 0, 5, 150, 231, 0, 2, 159, 201,
+ 0, 1, 162, 172, 0, 0, 163, 147, 0, 1, 164, 135, 0, 1, 166, 125, 0, 1, 167, 109, 0, 1, 169, 89, 0, 2, 171, 65,
+ 0, 2, 173, 38, 0, 4, 175, 11, 0, 14, 172, 2, 0, 25, 169, 0, 0, 34, 167, 0, 0, 38, 176, 0, 0, 13, 122, 250,
+ 0, 13, 124, 249, 0, 9, 130, 239, 0, 4, 139, 211, 0, 2, 146, 184, 0, 1, 147, 157, 0, 1, 146, 133, 0, 1, 149, 121,
+ 0, 1, 152, 108, 0, 1, 154, 91, 0, 1, 157, 70, 0, 1, 159, 45, 0, 2, 161, 17, 0, 12, 159, 3, 0, 25, 156, 0,
+ 0, 35, 155, 0, 0, 36, 164, 0, 0, 13, 108, 251, 0, 12, 110, 242, 0, 10, 114, 233, 0, 7, 120, 216, 0, 5, 127, 194,
+ 0, 3, 131, 169, 0, 2, 134, 144, 0, 1, 134, 120, 0, 2, 135, 107, 0, 1, 138, 92, 0, 1, 142, 74, 0, 1, 144, 51,
+ 0, 2, 147, 24, 0, 9, 147, 4, 0, 24, 143, 1, 0, 35, 141, 0, 0, 36, 150, 0, 0, 12, 94, 251, 0, 11, 98, 236,
+ 0, 10, 104, 216, 0, 9, 107, 205, 0, 8, 111, 194, 0, 7, 115, 178, 0, 5, 120, 158, 0, 0, 124, 135, 0, 2, 120, 109,
+ 0, 3, 123, 92, 0, 2, 127, 76, 0, 2, 129, 55, 0, 2, 131, 30, 0, 6, 134, 5, 0, 23, 129, 1, 0, 35, 126, 0,
+ 0, 35, 135, 0, 0, 12, 78, 251, 0, 12, 82, 240, 0, 11, 89, 221, 0, 11, 93, 204, 0, 10, 96, 191, 0, 9, 101, 178,
+ 0, 9, 105, 168, 0, 9, 105, 144, 0, 6, 109, 122, 0, 4, 109, 94, 0, 6, 110, 77, 0, 6, 113, 57, 0, 3, 116, 36,
+ 0, 5, 118, 9, 0, 21, 112, 2, 0, 34, 108, 0, 0, 34, 116, 0, 0, 14, 60, 252, 0, 15, 62, 244, 0, 14, 67, 231,
+ 0, 14, 77, 209, 0, 13, 81, 191, 0, 12, 85, 178, 0, 13, 87, 162, 0, 15, 88, 147, 0, 15, 90, 132, 0, 11, 92, 103,
+ 0, 10, 92, 77, 0, 9, 95, 61, 0, 5, 99, 41, 0, 5, 102, 15, 0, 19, 96, 2, 0, 33, 90, 0, 0, 33, 95, 0,
+ 0, 15, 45, 252, 0, 16, 47, 241, 0, 16, 51, 229, 0, 16, 59, 210, 0, 15, 64, 195, 0, 16, 69, 182, 0, 16, 71, 168,
+ 0, 16, 73, 149, 0, 17, 75, 130, 0, 18, 75, 113, 0, 14, 77, 85, 0, 11, 78, 64, 0, 12, 80, 44, 0, 10, 83, 20,
+ 0, 17, 81, 3, 0, 30, 74, 0, 0, 29, 76, 0, 0, 12, 35, 251, 0, 13, 41, 229, 0, 14, 45, 215, 0, 14, 47, 204,
+ 0, 14, 49, 194, 0, 15, 52, 184, 0, 16, 55, 172, 0, 19, 57, 153, 0, 22, 57, 132, 0, 20, 60, 113, 0, 20, 61, 92,
+ 0, 17, 62, 70, 0, 17, 60, 45, 0, 14, 64, 27, 0, 13, 67, 5, 0, 26, 59, 1, 0, 25, 60, 0, 0, 12, 24, 253,
+ 0, 13, 32, 222, 0, 13, 36, 208, 0, 13, 36, 198, 0, 13, 37, 190, 0, 14, 38, 180, 0, 15, 40, 169, 0, 17, 42, 155,
+ 0, 18, 43, 138, 0, 21, 44, 120, 0, 22, 43, 98, 0, 20, 45, 77, 0, 19, 43, 53, 0, 16, 46, 31, 0, 15, 49, 9,
+ 0, 25, 44, 2, 0, 23, 45, 0, 0, 11, 13, 255, 0, 13, 21, 221, 0, 13, 22, 207, 0, 13, 22, 198, 0, 13, 23, 190,
+ 0, 14, 23, 180, 0, 14, 24, 170, 0, 15, 25, 158, 0, 16, 26, 144, 0, 17, 27, 127, 0, 18, 27, 104, 0, 19, 27, 82,
+ 0, 20, 27, 58, 0, 20, 28, 39, 0, 20, 31, 13, 0, 27, 28, 0, 0, 23, 31, 0, 0, 10, 6, 255, 0, 15, 6, 240,
+ 0, 14, 5, 231, 0, 14, 5, 220, 0, 15, 7, 207, 0, 15, 7, 194, 0, 15, 8, 180, 0, 15, 8, 165, 0, 16, 9, 148,
+ 0, 17, 9, 130, 0, 18, 9, 110, 0, 19, 10, 89, 0, 19, 11, 66, 0, 21, 11, 46, 0, 24, 10, 28, 0, 18, 14, 16,
+ 0, 21, 13, 0, 0, 26, 0, 254, 0, 24, 0, 249, 0, 22, 0, 244, 0, 20, 0, 233, 0, 19, 0, 219, 0, 18, 0, 204,
+ 0, 17, 0, 187, 0, 17, 0, 169, 0, 19, 0, 148, 0, 20, 0, 130, 0, 21, 0, 111, 0, 21, 0, 88, 0, 20, 0, 68,
+ 0, 20, 0, 52, 0, 21, 0, 38, 0, 18, 0, 19, 0, 17, 0, 0, 0, 0, 232, 245, 0, 0, 231, 238, 0, 3, 231, 225,
+ 0, 6, 231, 205, 0, 9, 231, 187, 0, 12, 231, 171, 0, 15, 231, 154, 0, 18, 231, 134, 0, 22, 232, 112, 0, 26, 232, 88,
+ 0, 30, 233, 62, 0, 34, 233, 40, 0, 36, 232, 26, 0, 38, 229, 15, 0, 39, 228, 8, 0, 39, 227, 3, 0, 40, 226, 0,
+ 0, 0, 215, 245, 0, 0, 209, 203, 0, 5, 211, 196, 0, 5, 216, 186, 0, 5, 219, 173, 0, 7, 220, 163, 0, 9, 220, 150,
+ 0, 12, 221, 132, 0, 17, 221, 113, 0, 21, 221, 91, 0, 27, 220, 69, 0, 32, 219, 52, 0, 35, 218, 42, 0, 37, 216, 32,
+ 0, 36, 216, 19, 0, 34, 217, 9, 0, 27, 211, 0, 0, 0, 198, 246, 0, 0, 200, 211, 0, 0, 201, 183, 0, 0, 205, 174,
+ 0, 0, 207, 163, 0, 2, 210, 154, 0, 4, 210, 143, 0, 6, 211, 129, 0, 10, 211, 112, 0, 14, 210, 91, 0, 20, 210, 71,
+ 0, 26, 209, 56, 0, 29, 208, 45, 0, 32, 207, 35, 0, 31, 207, 24, 0, 28, 206, 14, 0, 16, 198, 0, 0, 0, 180, 247,
+ 0, 0, 187, 224, 0, 0, 191, 197, 0, 0, 193, 170, 0, 0, 196, 158, 0, 0, 198, 148, 0, 0, 199, 138, 0, 0, 200, 126,
+ 0, 2, 202, 110, 0, 3, 203, 88, 0, 8, 203, 67, 0, 14, 203, 50, 0, 17, 202, 36, 0, 20, 202, 25, 0, 20, 202, 14,
+ 0, 18, 201, 8, 0, 11, 195, 0, 0, 0, 160, 248, 0, 0, 169, 232, 0, 0, 176, 207, 0, 0, 179, 182, 0, 0, 181, 154,
+ 0, 0, 183, 143, 0, 0, 185, 135, 0, 0, 186, 125, 0, 0, 187, 112, 0, 0, 189, 96, 0, 1, 191, 75, 0, 4, 193, 51,
+ 0, 6, 194, 30, 0, 7, 195, 15, 0, 8, 195, 5, 0, 9, 195, 1, 0, 8, 193, 0, 0, 0, 140, 249, 0, 0, 148, 238,
+ 0, 0, 157, 214, 0, 0, 163, 191, 0, 0, 166, 166, 0, 0, 166, 137, 0, 0, 168, 129, 0, 0, 170, 122, 0, 0, 171, 113,
+ 0, 0, 172, 101, 0, 0, 174, 84, 0, 0, 176, 62, 0, 1, 180, 37, 0, 1, 182, 17, 0, 1, 183, 4, 0, 2, 183, 0,
+ 0, 3, 184, 0, 0, 0, 121, 250, 0, 0, 126, 246, 0, 0, 135, 229, 0, 0, 144, 201, 0, 0, 149, 175, 0, 0, 151, 149,
+ 0, 0, 149, 120, 0, 0, 152, 115, 0, 0, 153, 109, 0, 0, 155, 100, 0, 0, 158, 86, 0, 0, 161, 68, 0, 0, 164, 45,
+ 0, 0, 167, 22, 0, 0, 169, 6, 0, 0, 169, 0, 0, 0, 171, 0, 0, 0, 106, 250, 0, 0, 109, 249, 0, 0, 116, 238,
+ 0, 0, 125, 211, 0, 0, 131, 186, 0, 0, 135, 161, 0, 0, 135, 133, 0, 0, 132, 105, 0, 0, 135, 102, 0, 0, 138, 96,
+ 0, 0, 141, 85, 0, 0, 144, 70, 0, 0, 147, 51, 0, 0, 150, 28, 0, 0, 153, 10, 0, 0, 154, 1, 0, 0, 156, 0,
+ 0, 0, 93, 251, 0, 0, 98, 241, 0, 0, 106, 222, 0, 0, 111, 207, 0, 0, 115, 192, 0, 0, 119, 172, 0, 0, 122, 149,
+ 0, 0, 120, 120, 0, 0, 116, 92, 0, 0, 120, 89, 0, 0, 123, 82, 0, 0, 126, 70, 0, 0, 130, 54, 0, 0, 133, 34,
+ 0, 0, 136, 15, 0, 0, 138, 2, 0, 0, 140, 0, 0, 0, 79, 251, 0, 0, 84, 242, 0, 0, 92, 222, 0, 0, 97, 206,
+ 0, 0, 101, 192, 0, 0, 104, 175, 0, 0, 108, 158, 0, 0, 110, 138, 0, 0, 106, 105, 0, 0, 105, 83, 0, 0, 107, 78,
+ 0, 0, 110, 68, 0, 0, 112, 53, 0, 0, 115, 36, 0, 0, 118, 18, 0, 0, 120, 3, 0, 3, 122, 0, 0, 0, 62, 252,
+ 0, 0, 65, 242, 0, 0, 72, 228, 0, 0, 81, 210, 0, 0, 86, 193, 0, 0, 89, 174, 0, 0, 86, 151, 0, 0, 87, 136,
+ 0, 0, 95, 127, 0, 0, 91, 92, 0, 0, 92, 73, 0, 0, 94, 66, 0, 0, 96, 53, 0, 0, 98, 38, 0, 0, 100, 20,
+ 0, 0, 101, 5, 0, 4, 102, 0, 0, 0, 45, 253, 0, 0, 47, 240, 0, 0, 54, 227, 0, 0, 63, 210, 0, 0, 70, 195,
+ 0, 0, 75, 178, 0, 0, 76, 161, 0, 0, 74, 138, 0, 0, 77, 125, 0, 0, 73, 102, 0, 0, 81, 83, 0, 0, 78, 62,
+ 0, 0, 80, 52, 0, 0, 81, 39, 0, 0, 82, 22, 0, 0, 83, 7, 0, 3, 83, 0, 0, 0, 33, 254, 0, 0, 38, 237,
+ 0, 0, 43, 224, 0, 0, 48, 209, 0, 0, 51, 194, 0, 0, 57, 181, 0, 0, 60, 167, 0, 0, 61, 146, 0, 0, 62, 125,
+ 0, 0, 59, 103, 0, 0, 61, 90, 0, 0, 62, 66, 0, 0, 63, 50, 0, 0, 65, 38, 0, 0, 66, 24, 0, 0, 66, 10,
+ 0, 0, 66, 0, 0, 0, 23, 254, 0, 0, 37, 215, 0, 0, 40, 202, 0, 0, 42, 193, 0, 0, 42, 184, 0, 0, 43, 176,
+ 0, 0, 44, 167, 0, 0, 45, 151, 0, 0, 46, 133, 0, 0, 45, 111, 0, 0, 46, 91, 0, 0, 45, 71, 0, 0, 48, 55,
+ 0, 0, 47, 37, 0, 0, 49, 26, 0, 0, 50, 13, 0, 0, 50, 0, 0, 0, 14, 254, 0, 0, 30, 204, 0, 0, 32, 192,
+ 0, 0, 32, 185, 0, 0, 31, 177, 0, 0, 31, 169, 0, 0, 30, 159, 0, 0, 31, 146, 0, 0, 32, 133, 0, 0, 32, 120,
+ 0, 0, 31, 94, 0, 0, 28, 73, 0, 0, 32, 60, 0, 0, 33, 44, 0, 0, 33, 27, 0, 0, 37, 16, 0, 0, 35, 0,
+ 0, 0, 6, 255, 0, 0, 21, 201, 0, 0, 22, 190, 0, 0, 21, 182, 0, 0, 19, 174, 0, 0, 18, 166, 0, 0, 18, 157,
+ 0, 0, 18, 146, 0, 0, 18, 132, 0, 0, 18, 120, 0, 0, 18, 102, 0, 0, 17, 85, 0, 0, 18, 67, 0, 0, 18, 48,
+ 0, 0, 19, 30, 0, 0, 16, 13, 0, 0, 17, 0, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 248, 0, 0, 0, 231,
+ 0, 0, 0, 214, 0, 0, 0, 199, 0, 0, 0, 186, 0, 0, 0, 169, 0, 0, 0, 150, 0, 0, 0, 133, 0, 0, 0, 117,
+ 0, 0, 0, 97, 0, 0, 0, 76, 0, 0, 0, 55, 0, 0, 0, 33, 0, 0, 0, 17, 0, 0, 0, 0
+};
+
+// Scottie Best
+unsigned char ucMapDJ4100_KCMY_BestS_12x12x1[] =
+{
+ 223, 94, 45, 21, 203, 106, 59, 20, 184, 119, 73, 19, 153, 162, 96, 11, 122, 201, 120, 6, 96, 227, 135, 2, 86, 233, 139, 0,
+ 71, 238, 144, 0, 48, 240, 149, 0, 31, 243, 151, 0, 23, 245, 153, 0, 19, 245, 153, 0, 16, 246, 155, 0, 11, 246, 155, 0,
+ 8, 247, 155, 0, 3, 248, 157, 0, 0, 248, 159, 0, 189, 104, 34, 76, 197, 118, 36, 26, 159, 135, 75, 18, 130, 179, 104, 10,
+ 99, 226, 136, 2, 92, 232, 143, 1, 82, 236, 142, 0, 68, 238, 145, 0, 47, 240, 149, 0, 27, 244, 152, 0, 17, 245, 154, 0,
+ 9, 246, 154, 0, 7, 246, 155, 0, 4, 246, 156, 0, 2, 245, 158, 0, 0, 245, 158, 0, 0, 244, 159, 0, 152, 114, 21, 132,
+ 142, 126, 40, 78, 171, 142, 28, 30, 130, 186, 75, 8, 97, 220, 110, 3, 88, 223, 129, 3, 74, 231, 141, 2, 56, 237, 146, 1,
+ 36, 240, 151, 0, 21, 243, 153, 0, 13, 243, 155, 1, 8, 241, 155, 1, 5, 240, 156, 0, 3, 239, 156, 0, 1, 239, 157, 0,
+ 0, 239, 157, 0, 0, 238, 157, 0, 134, 141, 15, 163, 134, 146, 28, 118, 133, 163, 21, 84, 143, 170, 17, 9, 95, 224, 75, 1,
+ 86, 224, 105, 2, 73, 228, 126, 2, 54, 232, 137, 2, 36, 236, 144, 3, 21, 237, 150, 4, 14, 236, 153, 5, 9, 233, 154, 5,
+ 6, 232, 155, 4, 3, 231, 156, 2, 1, 231, 155, 0, 0, 232, 155, 0, 0, 232, 154, 0, 102, 181, 4, 218, 109, 181, 16, 170,
+ 106, 190, 12, 132, 104, 205, 6, 84, 104, 211, 11, 1, 86, 227, 69, 0, 74, 226, 99, 3, 57, 228, 119, 4, 40, 229, 132, 5,
+ 26, 229, 141, 7, 18, 228, 145, 8, 12, 228, 148, 8, 8, 226, 150, 6, 5, 225, 151, 4, 2, 224, 151, 1, 0, 223, 151, 0,
+ 0, 223, 150, 0, 86, 197, 0, 238, 91, 202, 7, 208, 92, 204, 6, 175, 92, 212, 3, 134, 90, 219, 0, 69, 86, 226, 12, 0,
+ 77, 223, 61, 2, 60, 224, 92, 5, 43, 223, 112, 8, 29, 223, 126, 9, 22, 221, 135, 11, 15, 221, 140, 10, 10, 219, 142, 9,
+ 6, 218, 143, 6, 3, 217, 145, 4, 1, 215, 145, 1, 0, 214, 144, 0, 76, 205, 0, 239, 78, 208, 4, 221, 79, 207, 5, 198,
+ 80, 209, 4, 163, 80, 215, 3, 119, 80, 219, 2, 62, 77, 228, 9, 0, 64, 225, 54, 3, 47, 223, 86, 7, 30, 221, 107, 9,
+ 21, 217, 122, 12, 17, 214, 131, 13, 11, 212, 135, 12, 8, 209, 136, 9, 4, 208, 137, 5, 1, 207, 137, 1, 0, 205, 138, 0,
+ 63, 207, 0, 240, 64, 209, 3, 229, 66, 209, 4, 213, 70, 211, 4, 189, 71, 215, 3, 156, 71, 218, 2, 114, 70, 223, 1, 56,
+ 66, 230, 6, 0, 52, 225, 47, 4, 36, 221, 80, 9, 21, 217, 102, 11, 15, 212, 116, 12, 10, 207, 125, 12, 8, 204, 127, 10,
+ 5, 201, 129, 8, 2, 199, 129, 3, 0, 198, 127, 0, 51, 207, 1, 240, 52, 208, 3, 233, 54, 209, 5, 220, 56, 208, 6, 201,
+ 59, 212, 4, 180, 60, 217, 2, 150, 61, 220, 2, 107, 59, 225, 1, 57, 53, 229, 3, 1, 39, 224, 43, 6, 24, 219, 75, 9,
+ 14, 214, 95, 9, 9, 207, 107, 9, 8, 202, 115, 8, 5, 198, 119, 7, 2, 195, 119, 4, 0, 192, 118, 0, 40, 207, 2, 241,
+ 41, 209, 3, 237, 42, 209, 5, 225, 44, 208, 6, 211, 45, 209, 6, 193, 45, 213, 5, 168, 47, 214, 6, 141, 45, 218, 4, 104,
+ 42, 224, 3, 56, 37, 230, 4, 5, 26, 224, 36, 7, 17, 218, 67, 8, 10, 211, 87, 7, 7, 204, 100, 6, 4, 199, 106, 5,
+ 2, 194, 109, 2, 0, 190, 110, 0, 27, 205, 4, 241, 27, 206, 5, 238, 28, 206, 7, 229, 30, 207, 9, 216, 30, 207, 8, 201,
+ 30, 211, 8, 184, 31, 212, 8, 159, 31, 215, 7, 136, 29, 219, 6, 100, 26, 225, 4, 56, 24, 232, 4, 8, 17, 223, 33, 6,
+ 12, 217, 60, 6, 8, 208, 80, 5, 4, 202, 93, 3, 2, 196, 99, 1, 0, 190, 102, 0, 17, 204, 6, 241, 17, 204, 7, 238,
+ 18, 204, 8, 230, 20, 204, 9, 220, 20, 206, 9, 207, 21, 208, 9, 193, 22, 211, 9, 176, 22, 213, 8, 153, 21, 216, 6, 131,
+ 18, 222, 4, 95, 17, 228, 2, 53, 17, 236, 3, 8, 14, 225, 30, 5, 9, 216, 55, 4, 5, 207, 75, 3, 2, 200, 86, 1,
+ 0, 193, 93, 0, 8, 203, 8, 241, 9, 204, 9, 238, 10, 204, 9, 232, 12, 205, 9, 223, 13, 206, 9, 214, 13, 207, 9, 201,
+ 14, 209, 8, 188, 14, 211, 7, 167, 14, 214, 6, 149, 14, 218, 4, 123, 14, 224, 2, 90, 14, 231, 1, 50, 13, 238, 3, 9,
+ 10, 226, 28, 4, 6, 216, 52, 3, 2, 206, 70, 1, 0, 198, 80, 0, 2, 202, 9, 243, 3, 202, 9, 239, 5, 203, 9, 234,
+ 8, 205, 9, 226, 9, 206, 9, 218, 9, 207, 7, 208, 9, 209, 7, 196, 9, 211, 5, 181, 10, 213, 5, 163, 10, 216, 4, 144,
+ 10, 221, 2, 116, 10, 227, 1, 86, 10, 233, 1, 46, 9, 238, 2, 6, 8, 225, 28, 4, 3, 215, 50, 1, 0, 205, 68, 0,
+ 0, 202, 7, 244, 0, 201, 7, 241, 0, 202, 8, 238, 3, 204, 8, 230, 6, 206, 9, 221, 7, 207, 7, 212, 7, 208, 5, 202,
+ 7, 211, 4, 191, 7, 212, 4, 176, 8, 214, 3, 158, 8, 217, 2, 138, 8, 222, 1, 110, 7, 227, 1, 80, 7, 232, 1, 43,
+ 7, 239, 4, 7, 4, 225, 26, 1, 0, 214, 49, 0, 0, 203, 3, 244, 0, 203, 3, 243, 0, 203, 3, 239, 0, 203, 3, 236,
+ 2, 205, 4, 226, 3, 206, 4, 218, 3, 207, 2, 208, 3, 208, 2, 198, 3, 211, 2, 187, 3, 212, 1, 171, 3, 215, 1, 153,
+ 3, 218, 1, 133, 3, 222, 0, 104, 3, 227, 0, 75, 3, 232, 0, 39, 2, 238, 0, 2, 0, 223, 26, 0, 0, 204, 0, 244,
+ 0, 204, 0, 243, 0, 204, 0, 240, 0, 204, 0, 237, 0, 204, 0, 231, 0, 204, 0, 224, 0, 205, 0, 215, 0, 207, 0, 205,
+ 0, 208, 0, 194, 0, 211, 0, 182, 0, 213, 0, 166, 0, 215, 0, 148, 0, 218, 0, 126, 0, 222, 0, 100, 0, 226, 0, 71,
+ 0, 231, 0, 36, 0, 238, 0, 0, 190, 72, 75, 72, 194, 75, 84, 17, 172, 97, 104, 13, 129, 145, 148, 8, 102, 179, 165, 5,
+ 91, 196, 161, 6, 75, 213, 165, 6, 55, 221, 168, 7, 33, 226, 171, 8, 15, 230, 173, 8, 11, 233, 172, 6, 9, 236, 168, 4,
+ 6, 238, 166, 2, 3, 239, 164, 0, 1, 243, 164, 0, 0, 244, 163, 0, 0, 245, 162, 0, 190, 71, 34, 74, 151, 97, 54, 31,
+ 139, 130, 82, 24, 121, 178, 107, 12, 97, 216, 139, 5, 82, 226, 147, 3, 69, 231, 150, 2, 52, 234, 152, 2, 36, 237, 154, 2,
+ 20, 238, 156, 3, 10, 239, 158, 1, 4, 240, 158, 0, 1, 240, 159, 0, 0, 239, 159, 0, 0, 239, 158, 0, 0, 239, 158, 0,
+ 0, 240, 158, 0, 151, 95, 21, 135, 170, 119, 27, 102, 146, 118, 44, 32, 126, 162, 84, 15, 100, 199, 115, 9, 82, 216, 134, 6,
+ 67, 227, 142, 3, 51, 232, 147, 3, 36, 236, 150, 3, 21, 238, 152, 3, 10, 239, 154, 2, 2, 239, 156, 0, 0, 238, 157, 0,
+ 0, 237, 156, 0, 0, 234, 156, 0, 0, 234, 156, 0, 0, 236, 156, 0, 135, 123, 15, 161, 136, 151, 17, 153, 126, 162, 23, 104,
+ 136, 143, 33, 26, 110, 177, 78, 12, 84, 208, 113, 7, 68, 220, 131, 6, 51, 225, 141, 6, 35, 228, 147, 7, 20, 231, 151, 7,
+ 10, 232, 154, 6, 3, 232, 155, 1, 0, 230, 155, 0, 0, 228, 155, 0, 0, 228, 154, 0, 0, 227, 154, 0, 0, 229, 154, 0,
+ 104, 165, 5, 214, 98, 188, 4, 220, 108, 181, 16, 150, 116, 159, 26, 84, 121, 154, 29, 19, 92, 200, 74, 8, 75, 213, 102, 7,
+ 58, 219, 122, 8, 40, 222, 134, 9, 25, 224, 143, 9, 13, 226, 148, 9, 5, 225, 151, 4, 1, 224, 151, 0, 0, 221, 151, 0,
+ 0, 220, 151, 0, 0, 220, 151, 0, 0, 222, 151, 0, 87, 182, 0, 239, 88, 190, 1, 230, 92, 194, 10, 189, 94, 191, 12, 140,
+ 95, 191, 13, 80, 99, 187, 17, 12, 80, 203, 60, 9, 62, 211, 93, 9, 45, 215, 113, 10, 29, 218, 129, 12, 17, 219, 138, 11,
+ 9, 219, 141, 7, 3, 218, 143, 3, 0, 216, 145, 0, 0, 214, 145, 0, 0, 213, 145, 0, 0, 213, 145, 0, 76, 197, 0, 239,
+ 76, 200, 2, 232, 80, 198, 9, 200, 82, 195, 11, 166, 82, 198, 10, 132, 82, 197, 12, 74, 86, 197, 13, 16, 68, 207, 53, 9,
+ 52, 212, 86, 10, 33, 212, 109, 14, 20, 212, 123, 14, 11, 212, 132, 12, 6, 211, 135, 7, 2, 209, 136, 2, 0, 208, 137, 0,
+ 0, 207, 137, 0, 0, 206, 138, 0, 63, 199, 1, 240, 63, 201, 2, 237, 65, 201, 7, 217, 69, 200, 9, 190, 72, 202, 9, 162,
+ 72, 202, 9, 126, 73, 202, 10, 75, 74, 201, 12, 18, 59, 207, 47, 10, 41, 209, 80, 13, 24, 209, 102, 14, 13, 207, 116, 13,
+ 8, 205, 123, 9, 4, 204, 126, 6, 1, 202, 127, 1, 0, 200, 127, 0, 0, 199, 129, 0, 51, 201, 2, 240, 51, 201, 3, 238,
+ 53, 201, 6, 224, 56, 200, 9, 203, 58, 201, 9, 184, 61, 203, 9, 154, 62, 204, 9, 118, 61, 205, 10, 75, 62, 203, 13, 24,
+ 46, 207, 43, 12, 28, 207, 75, 15, 16, 206, 94, 12, 9, 204, 105, 9, 5, 201, 112, 6, 2, 198, 116, 3, 0, 195, 118, 0,
+ 0, 192, 118, 0, 40, 203, 3, 241, 41, 202, 4, 238, 42, 201, 6, 229, 44, 201, 9, 213, 45, 200, 10, 194, 46, 202, 10, 173,
+ 48, 202, 11, 146, 48, 202, 12, 110, 47, 205, 13, 71, 46, 205, 15, 25, 34, 208, 41, 14, 21, 207, 68, 13, 11, 204, 86, 9,
+ 6, 201, 97, 5, 2, 198, 104, 3, 0, 193, 107, 0, 0, 189, 109, 0, 27, 202, 5, 243, 28, 200, 6, 239, 29, 199, 8, 231,
+ 30, 199, 10, 219, 31, 200, 12, 203, 32, 201, 12, 188, 33, 202, 12, 165, 36, 202, 13, 140, 35, 204, 13, 107, 34, 206, 13, 68,
+ 33, 206, 16, 24, 25, 206, 37, 13, 16, 206, 61, 9, 9, 203, 77, 6, 3, 199, 89, 2, 0, 194, 95, 0, 0, 188, 100, 0,
+ 16, 200, 8, 241, 17, 198, 9, 238, 18, 198, 9, 232, 20, 198, 11, 221, 22, 199, 13, 208, 22, 200, 14, 195, 23, 201, 13, 179,
+ 24, 202, 12, 155, 23, 204, 11, 135, 23, 206, 11, 102, 23, 208, 10, 63, 25, 209, 14, 25, 17, 206, 34, 12, 10, 204, 54, 7,
+ 5, 201, 71, 4, 1, 196, 82, 1, 0, 189, 90, 0, 7, 201, 9, 241, 9, 198, 9, 238, 10, 198, 10, 233, 12, 198, 12, 225,
+ 14, 199, 13, 214, 15, 200, 15, 201, 14, 200, 12, 189, 15, 202, 10, 168, 16, 203, 9, 150, 16, 205, 9, 126, 16, 207, 8, 94,
+ 17, 211, 8, 58, 17, 213, 14, 23, 12, 208, 32, 10, 7, 204, 50, 5, 2, 199, 66, 1, 0, 193, 78, 0, 2, 200, 9, 243,
+ 3, 198, 9, 238, 5, 198, 9, 233, 8, 200, 9, 225, 9, 200, 9, 217, 9, 199, 9, 206, 9, 200, 9, 195, 9, 201, 8, 181,
+ 9, 202, 7, 162, 9, 204, 6, 143, 10, 207, 6, 118, 11, 209, 5, 87, 11, 214, 6, 52, 13, 216, 12, 21, 9, 209, 29, 8,
+ 3, 203, 46, 2, 0, 198, 66, 0, 0, 200, 7, 244, 0, 196, 7, 239, 0, 196, 7, 234, 3, 198, 8, 228, 5, 199, 9, 219,
+ 6, 199, 8, 211, 6, 200, 7, 201, 5, 201, 6, 189, 6, 202, 5, 173, 6, 203, 4, 156, 7, 205, 4, 136, 7, 209, 3, 110,
+ 7, 213, 3, 82, 7, 217, 4, 46, 9, 219, 9, 16, 4, 209, 27, 4, 0, 203, 50, 0, 0, 201, 3, 244, 0, 197, 2, 239,
+ 0, 196, 2, 236, 0, 197, 3, 231, 2, 198, 3, 223, 2, 199, 4, 215, 3, 199, 2, 205, 3, 200, 2, 195, 3, 201, 2, 184,
+ 3, 203, 2, 167, 3, 205, 1, 150, 3, 208, 1, 130, 3, 211, 1, 104, 3, 215, 0, 74, 3, 219, 1, 39, 6, 221, 8, 10,
+ 0, 211, 31, 0, 0, 202, 0, 244, 0, 198, 0, 236, 0, 198, 0, 233, 0, 199, 0, 230, 0, 199, 0, 225, 0, 199, 0, 218,
+ 0, 200, 0, 209, 0, 201, 0, 199, 0, 202, 0, 189, 0, 204, 0, 177, 0, 206, 0, 159, 0, 208, 0, 142, 0, 211, 0, 120,
+ 0, 214, 0, 94, 0, 218, 0, 62, 0, 223, 0, 29, 0, 228, 0, 0, 156, 47, 102, 123, 151, 56, 114, 93, 164, 53, 123, 20,
+ 118, 102, 173, 5, 97, 143, 182, 3, 84, 173, 177, 4, 70, 192, 176, 5, 50, 203, 178, 5, 28, 212, 180, 7, 14, 217, 180, 8,
+ 9, 222, 179, 7, 7, 226, 177, 8, 5, 229, 175, 6, 2, 232, 172, 3, 1, 234, 168, 0, 0, 238, 167, 0, 0, 239, 165, 0,
+ 156, 46, 75, 126, 144, 78, 82, 69, 138, 89, 98, 21, 114, 137, 136, 12, 93, 178, 154, 9, 78, 196, 161, 8, 62, 208, 165, 8,
+ 44, 217, 168, 9, 26, 221, 172, 9, 13, 225, 173, 9, 4, 225, 172, 5, 0, 226, 170, 1, 0, 227, 167, 0, 0, 229, 164, 0,
+ 0, 230, 163, 0, 0, 232, 161, 0, 0, 234, 161, 0, 155, 46, 23, 127, 171, 76, 28, 100, 132, 98, 57, 36, 120, 136, 91, 24,
+ 96, 180, 123, 15, 82, 200, 136, 10, 65, 215, 144, 8, 48, 222, 149, 7, 34, 227, 151, 7, 20, 229, 155, 8, 9, 231, 157, 6,
+ 1, 231, 158, 1, 0, 230, 157, 0, 0, 229, 157, 0, 0, 228, 156, 0, 0, 227, 155, 0, 0, 230, 155, 0, 137, 89, 16, 158,
+ 138, 110, 18, 150, 132, 121, 40, 84, 126, 119, 48, 28, 104, 153, 89, 21, 84, 189, 114, 13, 67, 205, 133, 10, 51, 216, 141, 9,
+ 36, 221, 145, 9, 23, 224, 151, 10, 11, 227, 153, 8, 3, 227, 154, 2, 0, 226, 154, 0, 0, 224, 153, 0, 0, 223, 153, 0,
+ 0, 222, 153, 0, 0, 224, 153, 0, 108, 135, 7, 205, 102, 151, 6, 211, 116, 147, 26, 134, 112, 142, 36, 84, 110, 135, 43, 26,
+ 90, 171, 79, 17, 73, 197, 107, 12, 57, 207, 126, 11, 40, 214, 137, 12, 24, 217, 146, 14, 11, 219, 151, 10, 3, 219, 152, 3,
+ 0, 218, 151, 0, 0, 216, 151, 0, 0, 215, 151, 0, 0, 215, 151, 0, 0, 217, 151, 0, 88, 158, 0, 239, 88, 164, 1, 233,
+ 93, 171, 14, 186, 94, 171, 22, 137, 94, 159, 27, 77, 99, 154, 32, 20, 78, 187, 69, 15, 62, 200, 98, 14, 45, 206, 118, 15,
+ 29, 211, 132, 16, 15, 213, 141, 14, 5, 214, 143, 7, 0, 213, 145, 1, 0, 211, 145, 0, 0, 209, 145, 0, 0, 208, 145, 0,
+ 0, 211, 145, 0, 76, 179, 1, 240, 76, 187, 2, 234, 80, 184, 11, 199, 84, 182, 17, 163, 82, 184, 17, 129, 82, 181, 20, 78,
+ 87, 178, 22, 20, 67, 196, 60, 14, 51, 200, 92, 16, 33, 203, 113, 17, 19, 206, 126, 17, 9, 207, 133, 10, 3, 207, 135, 4,
+ 0, 207, 137, 0, 0, 205, 137, 0, 0, 203, 137, 0, 0, 204, 138, 0, 64, 189, 2, 240, 63, 190, 3, 237, 65, 190, 8, 216,
+ 69, 190, 14, 187, 71, 192, 14, 162, 73, 192, 14, 129, 72, 192, 16, 77, 73, 190, 18, 23, 58, 196, 53, 15, 40, 200, 86, 17,
+ 24, 202, 105, 17, 13, 202, 116, 14, 6, 202, 123, 8, 1, 201, 126, 2, 0, 200, 126, 0, 0, 198, 127, 0, 0, 198, 129, 0,
+ 51, 192, 4, 241, 51, 193, 5, 238, 52, 193, 8, 224, 56, 192, 12, 203, 58, 193, 14, 182, 61, 195, 13, 155, 62, 195, 14, 120,
+ 61, 195, 16, 79, 62, 192, 19, 29, 47, 197, 49, 17, 29, 200, 79, 17, 16, 201, 95, 15, 8, 200, 106, 9, 3, 198, 112, 4,
+ 0, 196, 115, 0, 0, 193, 116, 0, 0, 191, 118, 0, 40, 195, 4, 241, 41, 194, 5, 238, 42, 194, 8, 228, 44, 194, 11, 213,
+ 45, 195, 14, 194, 46, 195, 14, 175, 47, 196, 15, 148, 49, 194, 17, 114, 48, 195, 17, 75, 49, 194, 20, 28, 36, 199, 45, 17,
+ 21, 200, 70, 16, 11, 199, 86, 10, 5, 197, 96, 5, 1, 194, 102, 1, 0, 190, 106, 0, 0, 187, 107, 0, 27, 196, 6, 243,
+ 28, 195, 7, 239, 29, 194, 9, 230, 30, 195, 11, 218, 31, 195, 14, 203, 32, 196, 16, 188, 33, 197, 16, 166, 36, 196, 17, 141,
+ 36, 197, 17, 109, 36, 197, 17, 71, 36, 196, 22, 27, 26, 199, 41, 17, 16, 199, 61, 12, 9, 198, 77, 7, 2, 194, 87, 2,
+ 0, 190, 93, 0, 0, 184, 98, 0, 16, 196, 9, 243, 17, 195, 9, 238, 19, 195, 11, 231, 21, 196, 13, 220, 22, 195, 15, 208,
+ 23, 195, 17, 195, 24, 196, 17, 179, 24, 197, 15, 156, 25, 197, 15, 136, 25, 198, 15, 102, 25, 199, 15, 65, 26, 200, 19, 28,
+ 18, 199, 36, 16, 11, 198, 54, 9, 5, 196, 70, 4, 0, 192, 79, 0, 0, 184, 88, 0, 7, 198, 10, 241, 9, 195, 11, 238,
+ 10, 195, 12, 232, 12, 195, 13, 223, 13, 195, 16, 213, 15, 195, 17, 200, 15, 195, 15, 189, 16, 196, 14, 170, 17, 197, 13, 151,
+ 16, 198, 12, 126, 17, 200, 11, 95, 18, 200, 11, 59, 18, 202, 17, 27, 13, 200, 33, 14, 6, 197, 49, 6, 1, 193, 64, 1,
+ 0, 188, 76, 0, 2, 198, 9, 243, 4, 195, 9, 238, 6, 196, 10, 231, 8, 196, 11, 223, 8, 195, 12, 216, 9, 195, 13, 204,
+ 9, 195, 12, 194, 9, 195, 9, 180, 9, 196, 9, 161, 10, 197, 9, 142, 10, 199, 8, 116, 11, 200, 8, 87, 12, 202, 9, 53,
+ 11, 205, 15, 23, 8, 201, 29, 9, 2, 196, 45, 2, 0, 190, 64, 0, 0, 197, 7, 244, 0, 194, 7, 238, 1, 194, 7, 231,
+ 4, 194, 8, 224, 5, 195, 9, 217, 5, 194, 8, 208, 5, 194, 7, 198, 4, 194, 6, 187, 5, 195, 5, 171, 5, 197, 5, 153,
+ 6, 197, 4, 133, 7, 199, 4, 107, 7, 201, 4, 79, 8, 205, 6, 45, 8, 207, 12, 17, 3, 200, 26, 4, 0, 194, 48, 0,
+ 0, 199, 3, 244, 0, 194, 2, 238, 0, 192, 2, 231, 0, 192, 2, 225, 0, 192, 2, 220, 1, 193, 3, 211, 2, 194, 3, 202,
+ 1, 194, 2, 191, 1, 194, 2, 179, 2, 196, 1, 163, 2, 197, 1, 145, 2, 199, 1, 125, 2, 201, 1, 100, 3, 204, 1, 69,
+ 3, 207, 2, 36, 4, 209, 8, 9, 0, 200, 31, 0, 0, 200, 0, 244, 0, 196, 0, 237, 0, 192, 0, 227, 0, 193, 0, 224,
+ 0, 193, 0, 219, 0, 194, 0, 213, 0, 195, 0, 204, 0, 195, 0, 195, 0, 196, 0, 184, 0, 197, 0, 171, 0, 199, 0, 154,
+ 0, 201, 0, 137, 0, 203, 0, 114, 0, 206, 0, 89, 0, 209, 0, 54, 0, 214, 0, 22, 0, 219, 0, 0, 139, 33, 139, 156,
+ 131, 36, 151, 123, 131, 30, 165, 50, 105, 50, 201, 2, 93, 109, 195, 2, 80, 148, 188, 3, 66, 170, 186, 4, 47, 186, 187, 4,
+ 27, 192, 188, 6, 14, 200, 187, 6, 10, 206, 184, 6, 8, 213, 182, 5, 6, 216, 180, 5, 3, 220, 177, 4, 1, 225, 175, 2,
+ 0, 228, 172, 0, 0, 231, 170, 0, 142, 36, 102, 150, 137, 62, 104, 100, 133, 63, 110, 49, 116, 82, 142, 13, 90, 141, 166, 8,
+ 75, 168, 172, 6, 58, 187, 177, 6, 40, 195, 179, 7, 22, 200, 181, 8, 11, 206, 181, 7, 2, 209, 180, 1, 0, 213, 177, 0,
+ 0, 215, 173, 0, 0, 218, 170, 0, 0, 221, 167, 0, 0, 224, 165, 0, 0, 226, 165, 0, 141, 37, 62, 148, 136, 59, 75, 108,
+ 127, 79, 86, 73, 118, 86, 100, 24, 92, 141, 140, 15, 76, 171, 152, 11, 60, 189, 159, 11, 42, 199, 165, 11, 26, 205, 168, 12,
+ 14, 209, 171, 13, 5, 213, 171, 5, 0, 213, 167, 0, 0, 214, 165, 0, 0, 215, 163, 0, 0, 216, 162, 0, 0, 218, 159, 0,
+ 0, 221, 159, 0, 140, 34, 17, 157, 140, 49, 24, 136, 127, 84, 49, 77, 110, 100, 61, 42, 98, 134, 95, 27, 82, 170, 120, 20,
+ 66, 192, 135, 16, 50, 204, 142, 15, 36, 211, 149, 15, 21, 216, 153, 15, 10, 219, 155, 11, 3, 219, 155, 3, 0, 218, 154, 0,
+ 0, 216, 153, 0, 0, 215, 152, 0, 0, 214, 152, 0, 0, 218, 151, 0, 118, 82, 9, 192, 113, 99, 18, 165, 112, 106, 32, 126,
+ 107, 118, 44, 87, 105, 118, 54, 35, 87, 151, 88, 27, 70, 181, 113, 20, 55, 194, 132, 17, 39, 202, 141, 17, 25, 208, 146, 17,
+ 12, 213, 150, 14, 3, 214, 151, 5, 0, 213, 151, 0, 0, 211, 150, 0, 0, 209, 149, 0, 0, 208, 149, 0, 0, 212, 150, 0,
+ 93, 118, 1, 231, 93, 125, 3, 225, 96, 138, 17, 179, 95, 147, 29, 135, 93, 141, 39, 84, 96, 131, 46, 32, 77, 162, 80, 26,
+ 59, 188, 105, 20, 43, 196, 123, 20, 27, 202, 135, 20, 13, 205, 142, 17, 4, 207, 144, 7, 0, 206, 145, 0, 0, 204, 145, 0,
+ 0, 203, 144, 0, 0, 203, 143, 0, 0, 205, 144, 0, 78, 153, 2, 240, 77, 158, 2, 237, 82, 159, 12, 200, 84, 167, 21, 162,
+ 82, 164, 26, 129, 82, 155, 33, 80, 86, 150, 37, 27, 65, 180, 72, 21, 49, 190, 99, 21, 33, 195, 116, 22, 19, 200, 127, 20,
+ 8, 202, 134, 11, 2, 203, 135, 2, 0, 201, 136, 0, 0, 200, 136, 0, 0, 199, 136, 0, 0, 200, 137, 0, 65, 168, 4, 240,
+ 65, 173, 5, 237, 67, 175, 9, 215, 69, 179, 17, 187, 71, 180, 20, 159, 72, 180, 21, 129, 71, 176, 25, 80, 73, 173, 27, 26,
+ 56, 187, 63, 20, 38, 192, 91, 22, 24, 195, 107, 21, 12, 197, 118, 16, 4, 198, 123, 7, 0, 198, 126, 0, 0, 196, 126, 0,
+ 0, 194, 126, 0, 0, 195, 127, 0, 52, 179, 5, 241, 52, 179, 6, 238, 53, 180, 9, 223, 56, 184, 14, 201, 59, 184, 18, 181,
+ 60, 184, 19, 155, 61, 184, 20, 121, 60, 184, 22, 79, 62, 180, 26, 29, 45, 189, 57, 21, 28, 193, 82, 21, 16, 195, 98, 17,
+ 7, 194, 107, 9, 2, 193, 112, 2, 0, 192, 114, 0, 0, 190, 116, 0, 0, 189, 118, 0, 40, 186, 6, 241, 41, 184, 7, 238,
+ 42, 186, 9, 227, 44, 188, 13, 211, 45, 188, 17, 194, 45, 188, 18, 175, 46, 189, 19, 148, 48, 187, 21, 115, 48, 187, 22, 75,
+ 49, 186, 26, 31, 35, 190, 50, 22, 21, 193, 74, 18, 10, 193, 87, 10, 4, 192, 97, 4, 0, 190, 102, 0, 0, 187, 105, 0,
+ 0, 184, 107, 0, 28, 189, 8, 243, 29, 189, 9, 239, 30, 189, 10, 230, 31, 190, 13, 218, 32, 190, 16, 204, 33, 190, 18, 189,
+ 33, 191, 18, 167, 35, 190, 19, 142, 36, 190, 20, 110, 36, 189, 21, 74, 36, 189, 26, 33, 26, 192, 45, 20, 15, 192, 63, 14,
+ 8, 192, 78, 7, 1, 189, 87, 1, 0, 184, 93, 0, 0, 180, 97, 0, 16, 192, 10, 243, 17, 190, 11, 238, 19, 191, 12, 230,
+ 21, 191, 14, 219, 22, 190, 17, 208, 23, 190, 19, 195, 24, 191, 19, 179, 24, 192, 18, 157, 25, 191, 18, 136, 26, 191, 18, 104,
+ 26, 191, 19, 68, 27, 193, 24, 33, 18, 193, 38, 18, 10, 192, 56, 9, 4, 190, 70, 3, 0, 187, 78, 0, 0, 179, 86, 0,
+ 6, 193, 12, 241, 9, 191, 13, 238, 10, 190, 14, 231, 12, 190, 16, 222, 14, 189, 17, 212, 15, 190, 18, 200, 15, 189, 17, 189,
+ 16, 191, 16, 170, 16, 191, 15, 151, 17, 192, 15, 127, 17, 192, 15, 97, 19, 193, 15, 63, 20, 195, 22, 32, 13, 194, 35, 16,
+ 6, 190, 49, 6, 0, 187, 62, 0, 0, 180, 75, 0, 3, 195, 9, 243, 2, 192, 12, 238, 5, 192, 13, 230, 8, 191, 15, 222,
+ 8, 190, 15, 214, 9, 190, 14, 203, 9, 190, 13, 193, 9, 190, 11, 179, 9, 191, 10, 161, 9, 191, 10, 141, 10, 192, 9, 118,
+ 12, 192, 9, 88, 12, 195, 10, 55, 11, 197, 17, 26, 6, 194, 28, 10, 2, 189, 43, 2, 0, 182, 62, 0, 0, 194, 8, 244,
+ 0, 191, 8, 238, 2, 191, 9, 230, 4, 191, 9, 221, 4, 190, 9, 214, 5, 189, 8, 205, 4, 189, 7, 196, 4, 189, 6, 184,
+ 4, 189, 6, 168, 5, 190, 6, 151, 6, 190, 5, 132, 6, 191, 5, 106, 7, 193, 5, 78, 7, 196, 7, 45, 5, 198, 11, 19,
+ 3, 191, 25, 4, 0, 186, 46, 0, 0, 196, 3, 244, 0, 191, 3, 238, 0, 189, 2, 230, 0, 189, 2, 221, 0, 188, 2, 215,
+ 1, 188, 2, 206, 1, 188, 2, 198, 1, 188, 1, 188, 1, 188, 1, 175, 1, 189, 1, 158, 1, 190, 1, 141, 1, 191, 1, 120,
+ 1, 192, 0, 96, 2, 195, 1, 66, 2, 197, 2, 34, 2, 199, 7, 11, 0, 191, 29, 0, 0, 197, 0, 245, 0, 194, 0, 237,
+ 0, 190, 0, 228, 0, 187, 0, 217, 0, 188, 0, 213, 0, 188, 0, 206, 0, 189, 0, 199, 0, 189, 0, 190, 0, 189, 0, 179,
+ 0, 189, 0, 165, 0, 191, 0, 149, 0, 193, 0, 132, 0, 194, 0, 109, 0, 197, 0, 84, 0, 200, 0, 48, 0, 203, 0, 17,
+ 0, 207, 0, 0, 102, 9, 190, 214, 105, 21, 182, 154, 104, 17, 191, 92, 100, 16, 202, 5, 88, 56, 213, 1, 79, 107, 198, 3,
+ 65, 141, 194, 3, 47, 159, 192, 4, 28, 173, 191, 6, 15, 184, 190, 5, 10, 191, 189, 5, 9, 199, 187, 5, 6, 203, 184, 4,
+ 4, 208, 182, 3, 2, 212, 180, 1, 0, 216, 178, 0, 0, 220, 175, 0, 112, 18, 148, 193, 126, 51, 120, 123, 120, 53, 127, 89,
+ 119, 49, 139, 27, 91, 98, 173, 9, 75, 137, 181, 6, 60, 159, 184, 6, 41, 173, 184, 7, 23, 184, 186, 8, 11, 190, 186, 6,
+ 2, 195, 184, 1, 0, 199, 181, 0, 0, 203, 178, 0, 0, 206, 175, 0, 0, 209, 172, 0, 0, 213, 170, 0, 0, 216, 170, 0,
+ 120, 44, 96, 142, 115, 52, 93, 129, 115, 69, 100, 93, 112, 64, 113, 49, 92, 95, 146, 16, 76, 140, 159, 11, 60, 162, 167, 10,
+ 41, 177, 173, 10, 25, 186, 177, 11, 12, 191, 179, 9, 3, 196, 178, 2, 0, 199, 175, 0, 0, 201, 171, 0, 0, 204, 168, 0,
+ 0, 206, 165, 0, 0, 208, 164, 0, 0, 212, 164, 0, 116, 35, 65, 163, 114, 51, 67, 136, 110, 70, 77, 102, 109, 82, 84, 71,
+ 98, 93, 102, 27, 79, 133, 135, 20, 63, 161, 148, 17, 45, 177, 156, 17, 29, 187, 162, 17, 16, 193, 166, 14, 5, 198, 167, 8,
+ 0, 200, 165, 1, 0, 201, 162, 0, 0, 202, 159, 0, 0, 202, 157, 0, 0, 203, 155, 0, 0, 207, 156, 0, 115, 26, 9, 198,
+ 114, 58, 26, 148, 110, 80, 45, 104, 104, 92, 56, 79, 95, 102, 65, 50, 84, 130, 93, 36, 68, 162, 116, 28, 53, 181, 133, 25,
+ 36, 192, 141, 25, 23, 200, 146, 24, 9, 204, 151, 16, 2, 205, 150, 5, 0, 204, 150, 0, 0, 203, 148, 0, 0, 202, 146, 0,
+ 0, 201, 146, 0, 0, 205, 145, 0, 98, 78, 5, 222, 98, 84, 9, 207, 100, 104, 27, 152, 94, 112, 38, 123, 92, 118, 50, 86,
+ 92, 116, 58, 44, 75, 145, 88, 36, 57, 170, 110, 29, 40, 184, 127, 28, 27, 192, 136, 26, 14, 198, 141, 20, 4, 201, 143, 9,
+ 0, 201, 143, 0, 0, 199, 142, 0, 0, 198, 141, 0, 0, 197, 141, 0, 0, 200, 142, 0, 80, 108, 1, 241, 80, 118, 3, 238,
+ 82, 139, 14, 200, 82, 142, 25, 161, 82, 146, 34, 131, 80, 138, 45, 87, 84, 129, 52, 42, 65, 155, 80, 34, 46, 176, 104, 29,
+ 30, 187, 119, 28, 17, 192, 129, 24, 7, 196, 135, 12, 0, 196, 136, 2, 0, 195, 136, 0, 0, 193, 135, 0, 0, 192, 135, 0,
+ 0, 195, 136, 0, 68, 144, 4, 241, 68, 148, 6, 237, 69, 154, 12, 214, 70, 161, 19, 186, 71, 162, 26, 157, 71, 159, 31, 126,
+ 71, 149, 40, 82, 75, 146, 44, 37, 54, 170, 72, 29, 36, 182, 95, 27, 22, 188, 109, 25, 10, 191, 119, 17, 3, 192, 125, 6,
+ 0, 192, 126, 0, 0, 190, 126, 0, 0, 189, 126, 0, 0, 190, 127, 0, 53, 162, 7, 241, 53, 163, 8, 237, 55, 166, 11, 222,
+ 57, 171, 17, 199, 58, 170, 22, 178, 59, 171, 26, 153, 59, 168, 28, 121, 59, 165, 32, 80, 62, 163, 36, 34, 44, 179, 64, 27,
+ 26, 186, 86, 26, 15, 188, 100, 20, 7, 188, 108, 9, 1, 189, 112, 1, 0, 188, 114, 0, 0, 186, 115, 0, 0, 186, 116, 0,
+ 41, 175, 9, 241, 41, 173, 9, 238, 43, 175, 12, 227, 45, 177, 16, 209, 45, 177, 19, 193, 46, 178, 24, 173, 46, 178, 26, 148,
+ 47, 176, 26, 118, 47, 176, 28, 77, 49, 173, 32, 36, 33, 182, 56, 26, 19, 186, 77, 21, 9, 186, 90, 12, 3, 187, 98, 4,
+ 0, 184, 102, 0, 0, 181, 105, 0, 0, 180, 106, 0, 29, 182, 10, 243, 30, 181, 11, 239, 31, 181, 12, 230, 32, 184, 15, 218,
+ 33, 184, 17, 203, 33, 184, 21, 189, 34, 184, 24, 167, 35, 184, 25, 143, 36, 181, 25, 110, 36, 181, 26, 76, 36, 180, 31, 38,
+ 25, 184, 48, 23, 13, 184, 66, 15, 6, 184, 79, 6, 0, 184, 88, 0, 0, 178, 93, 0, 0, 175, 95, 0, 17, 187, 12, 243,
+ 18, 184, 13, 238, 20, 186, 14, 230, 22, 186, 16, 220, 23, 186, 18, 207, 24, 186, 21, 194, 25, 186, 24, 179, 25, 186, 22, 158,
+ 26, 184, 22, 137, 26, 184, 22, 105, 26, 184, 23, 71, 27, 186, 28, 36, 17, 186, 42, 20, 9, 184, 57, 9, 2, 184, 70, 3,
+ 0, 178, 78, 0, 0, 172, 84, 0, 6, 189, 15, 243, 9, 187, 15, 238, 11, 187, 16, 231, 13, 186, 17, 221, 14, 186, 17, 211,
+ 15, 184, 18, 199, 16, 184, 21, 188, 16, 184, 20, 168, 17, 186, 18, 151, 17, 184, 18, 127, 17, 184, 18, 98, 19, 186, 18, 65,
+ 20, 189, 25, 35, 12, 188, 36, 17, 5, 182, 50, 6, 0, 179, 62, 0, 0, 171, 72, 0, 1, 190, 13, 243, 2, 189, 16, 238,
+ 4, 188, 17, 230, 7, 187, 17, 222, 8, 186, 15, 212, 9, 184, 14, 202, 8, 184, 15, 192, 9, 184, 13, 179, 9, 186, 13, 161,
+ 9, 184, 12, 141, 10, 184, 11, 116, 11, 184, 11, 88, 12, 187, 13, 57, 11, 190, 19, 30, 6, 187, 29, 12, 1, 180, 43, 2,
+ 0, 172, 60, 0, 0, 191, 9, 244, 0, 189, 9, 238, 2, 188, 9, 230, 4, 187, 9, 221, 4, 184, 9, 212, 3, 182, 7, 204,
+ 3, 184, 8, 195, 3, 184, 7, 184, 4, 184, 7, 168, 4, 184, 6, 151, 5, 184, 6, 131, 6, 184, 5, 105, 6, 186, 6, 77,
+ 6, 189, 8, 45, 4, 190, 11, 20, 1, 184, 24, 5, 0, 175, 45, 0, 0, 192, 4, 244, 0, 189, 4, 238, 0, 187, 3, 230,
+ 0, 184, 2, 221, 1, 182, 2, 211, 0, 180, 1, 203, 0, 180, 1, 194, 0, 181, 2, 186, 0, 181, 1, 172, 0, 181, 1, 156,
+ 1, 181, 1, 140, 1, 182, 1, 119, 1, 184, 1, 94, 1, 186, 1, 64, 1, 189, 1, 32, 1, 189, 6, 11, 0, 179, 28, 0,
+ 0, 193, 0, 245, 0, 190, 0, 238, 0, 188, 0, 228, 0, 184, 0, 218, 0, 178, 0, 205, 0, 179, 0, 199, 0, 179, 0, 192,
+ 0, 179, 0, 184, 0, 180, 0, 172, 0, 180, 0, 158, 0, 181, 0, 144, 0, 182, 0, 126, 0, 184, 0, 104, 0, 187, 0, 79,
+ 0, 189, 0, 44, 0, 191, 0, 14, 0, 194, 0, 0, 93, 9, 198, 216, 94, 13, 196, 182, 93, 12, 201, 139, 90, 9, 209, 68,
+ 89, 15, 212, 3, 77, 52, 211, 3, 65, 97, 202, 4, 48, 132, 197, 5, 29, 150, 194, 6, 15, 164, 194, 5, 11, 176, 192, 4,
+ 9, 184, 190, 4, 7, 190, 189, 3, 4, 196, 187, 3, 2, 201, 184, 1, 1, 204, 181, 0, 0, 208, 180, 0, 95, 10, 168, 215,
+ 106, 32, 152, 164, 105, 38, 151, 129, 100, 34, 163, 78, 94, 46, 171, 10, 78, 89, 184, 8, 62, 123, 186, 8, 45, 146, 187, 8,
+ 26, 159, 188, 9, 12, 172, 189, 6, 3, 181, 188, 1, 0, 188, 186, 0, 0, 191, 182, 0, 0, 195, 179, 0, 0, 198, 177, 0,
+ 0, 202, 175, 0, 0, 205, 175, 0, 105, 24, 119, 184, 108, 36, 121, 156, 107, 56, 119, 118, 100, 52, 133, 86, 97, 52, 144, 17,
+ 79, 92, 162, 13, 63, 129, 171, 11, 45, 149, 176, 11, 27, 162, 179, 12, 14, 175, 181, 9, 4, 182, 182, 3, 0, 188, 179, 0,
+ 0, 190, 176, 0, 0, 193, 172, 0, 0, 196, 168, 0, 0, 199, 167, 0, 0, 202, 168, 0, 102, 22, 92, 192, 100, 34, 94, 168,
+ 100, 53, 102, 131, 100, 70, 100, 95, 93, 66, 114, 54, 82, 80, 137, 22, 64, 126, 152, 18, 47, 151, 159, 17, 30, 163, 165, 17,
+ 16, 175, 171, 13, 6, 182, 173, 6, 0, 187, 171, 0, 0, 189, 167, 0, 0, 191, 164, 0, 0, 193, 161, 0, 0, 194, 159, 0,
+ 0, 198, 161, 0, 98, 18, 48, 204, 100, 38, 62, 167, 99, 58, 71, 133, 94, 76, 78, 100, 92, 86, 86, 76, 86, 90, 98, 37,
+ 66, 130, 127, 28, 50, 151, 142, 25, 33, 165, 150, 24, 18, 177, 156, 20, 8, 182, 159, 10, 0, 188, 159, 1, 0, 189, 156, 0,
+ 0, 189, 153, 0, 0, 189, 151, 0, 0, 190, 149, 0, 0, 194, 150, 0, 92, 20, 1, 238, 97, 33, 16, 196, 102, 68, 40, 135,
+ 94, 84, 55, 102, 88, 93, 62, 79, 80, 105, 69, 59, 70, 127, 93, 45, 52, 154, 114, 37, 37, 171, 129, 36, 25, 184, 136, 32,
+ 11, 190, 142, 23, 3, 193, 143, 9, 0, 193, 141, 0, 0, 192, 140, 0, 0, 191, 139, 0, 0, 190, 138, 0, 0, 193, 137, 0,
+ 82, 74, 3, 243, 82, 80, 6, 233, 86, 97, 18, 194, 82, 107, 35, 151, 78, 113, 45, 123, 77, 116, 55, 90, 79, 115, 63, 54,
+ 61, 141, 87, 46, 42, 163, 107, 39, 26, 176, 122, 35, 15, 184, 131, 27, 6, 189, 135, 15, 1, 189, 135, 2, 0, 189, 134, 0,
+ 0, 188, 133, 0, 0, 187, 132, 0, 0, 189, 133, 0, 70, 121, 6, 241, 70, 126, 8, 234, 72, 133, 14, 213, 73, 141, 23, 182,
+ 71, 141, 31, 154, 70, 140, 41, 125, 68, 134, 52, 89, 70, 127, 59, 53, 53, 150, 80, 42, 33, 170, 100, 36, 18, 179, 113, 29,
+ 8, 184, 121, 20, 2, 186, 126, 7, 0, 184, 126, 0, 0, 182, 126, 0, 0, 181, 125, 0, 0, 184, 126, 0, 55, 147, 9, 241,
+ 55, 150, 10, 234, 56, 151, 14, 219, 58, 154, 19, 198, 59, 155, 25, 177, 58, 153, 32, 153, 59, 152, 39, 121, 57, 144, 46, 84,
+ 60, 143, 50, 46, 40, 164, 72, 36, 24, 176, 92, 31, 13, 179, 102, 23, 5, 181, 110, 11, 0, 182, 113, 1, 0, 180, 114, 0,
+ 0, 178, 114, 0, 0, 179, 115, 0, 42, 158, 11, 241, 42, 159, 12, 237, 44, 159, 15, 226, 45, 161, 18, 208, 46, 164, 22, 192,
+ 46, 163, 27, 172, 47, 163, 34, 147, 46, 162, 36, 118, 45, 159, 36, 80, 47, 159, 41, 41, 29, 170, 63, 32, 17, 177, 80, 24,
+ 7, 179, 93, 16, 2, 178, 99, 3, 0, 177, 102, 0, 0, 173, 104, 0, 0, 175, 106, 0, 30, 170, 12, 243, 31, 168, 14, 237,
+ 32, 168, 16, 227, 33, 171, 17, 216, 34, 172, 20, 202, 34, 172, 25, 187, 35, 171, 30, 165, 34, 171, 31, 143, 35, 170, 31, 112,
+ 35, 168, 32, 78, 36, 170, 37, 43, 22, 175, 54, 26, 11, 176, 70, 16, 3, 177, 82, 8, 0, 175, 88, 0, 0, 168, 92, 0,
+ 0, 167, 94, 0, 17, 178, 15, 243, 19, 177, 15, 238, 20, 177, 17, 231, 22, 177, 18, 221, 23, 178, 20, 208, 23, 177, 24, 194,
+ 25, 176, 27, 178, 26, 177, 27, 158, 25, 176, 26, 138, 25, 175, 26, 106, 26, 173, 27, 74, 26, 177, 34, 40, 14, 178, 45, 21,
+ 5, 177, 62, 12, 1, 173, 71, 1, 0, 167, 78, 0, 0, 164, 82, 0, 7, 182, 17, 243, 9, 180, 17, 238, 11, 180, 18, 231,
+ 13, 180, 19, 221, 14, 179, 21, 209, 14, 177, 22, 198, 16, 177, 24, 186, 16, 178, 24, 168, 16, 177, 22, 151, 17, 177, 21, 129,
+ 17, 176, 20, 98, 19, 177, 21, 66, 19, 181, 28, 37, 9, 179, 38, 18, 2, 173, 51, 6, 0, 167, 61, 0, 0, 162, 69, 0,
+ 0, 184, 17, 243, 2, 182, 17, 238, 5, 181, 17, 231, 7, 180, 17, 222, 7, 178, 16, 213, 7, 176, 14, 202, 8, 177, 15, 191,
+ 8, 177, 16, 178, 9, 177, 15, 161, 9, 176, 15, 141, 10, 176, 14, 116, 11, 176, 13, 88, 12, 178, 15, 58, 10, 182, 21, 33,
+ 3, 178, 31, 14, 0, 170, 42, 1, 0, 161, 56, 0, 0, 187, 11, 244, 0, 184, 11, 238, 2, 182, 11, 230, 4, 181, 10, 221,
+ 3, 179, 9, 213, 2, 176, 7, 203, 2, 176, 8, 193, 3, 176, 8, 182, 3, 176, 8, 167, 4, 175, 8, 149, 5, 173, 7, 130,
+ 6, 173, 7, 104, 7, 175, 7, 76, 6, 178, 10, 46, 3, 181, 13, 23, 1, 173, 23, 6, 0, 162, 42, 0, 0, 189, 5, 244,
+ 0, 184, 4, 238, 0, 181, 3, 230, 0, 179, 2, 221, 0, 177, 2, 211, 0, 172, 1, 200, 0, 172, 1, 191, 0, 172, 1, 182,
+ 0, 172, 1, 168, 0, 171, 1, 153, 1, 172, 1, 138, 1, 172, 1, 116, 1, 172, 1, 93, 1, 175, 2, 63, 1, 177, 2, 31,
+ 1, 177, 6, 10, 0, 165, 26, 0, 0, 189, 0, 244, 0, 187, 0, 238, 0, 182, 0, 228, 0, 178, 0, 218, 0, 173, 0, 205,
+ 0, 167, 0, 193, 0, 167, 0, 187, 0, 168, 0, 178, 0, 168, 0, 166, 0, 168, 0, 153, 0, 168, 0, 141, 0, 170, 0, 125,
+ 0, 170, 0, 102, 0, 173, 0, 76, 0, 176, 0, 40, 0, 178, 0, 11, 0, 179, 0, 0, 80, 9, 201, 216, 80, 9, 203, 197,
+ 82, 9, 204, 166, 79, 7, 213, 116, 79, 9, 215, 48, 77, 18, 213, 4, 63, 48, 213, 3, 48, 94, 204, 5, 31, 125, 199, 6,
+ 17, 144, 197, 5, 10, 158, 196, 3, 9, 167, 194, 3, 7, 177, 192, 2, 5, 184, 189, 2, 3, 189, 188, 1, 1, 193, 186, 0,
+ 0, 197, 184, 0, 86, 12, 179, 214, 88, 23, 172, 189, 89, 28, 170, 157, 86, 25, 180, 122, 86, 26, 184, 45, 80, 49, 187, 9,
+ 62, 86, 193, 8, 45, 116, 191, 8, 27, 140, 191, 9, 15, 153, 191, 7, 5, 164, 190, 2, 0, 173, 189, 0, 0, 179, 186, 0,
+ 0, 184, 182, 0, 0, 188, 180, 0, 0, 191, 179, 0, 0, 194, 179, 0, 92, 19, 141, 197, 93, 31, 147, 173, 90, 40, 145, 151,
+ 87, 39, 152, 125, 84, 37, 161, 60, 82, 51, 162, 15, 63, 90, 178, 12, 47, 121, 180, 12, 29, 142, 182, 12, 17, 155, 184, 9,
+ 6, 166, 184, 4, 0, 173, 182, 0, 0, 178, 179, 0, 0, 182, 176, 0, 0, 186, 173, 0, 0, 189, 171, 0, 0, 192, 172, 0,
+ 92, 21, 112, 195, 93, 30, 118, 179, 89, 40, 126, 156, 87, 55, 126, 127, 84, 56, 131, 91, 82, 52, 141, 43, 67, 89, 155, 19,
+ 51, 123, 162, 17, 33, 143, 167, 17, 17, 156, 172, 14, 7, 165, 176, 7, 0, 173, 176, 0, 0, 177, 171, 0, 0, 180, 167, 0,
+ 0, 184, 164, 0, 0, 186, 162, 0, 0, 189, 164, 0, 88, 24, 84, 197, 90, 34, 92, 179, 89, 41, 100, 161, 86, 62, 99, 125,
+ 84, 77, 95, 95, 80, 75, 108, 62, 69, 93, 131, 29, 52, 126, 144, 25, 34, 144, 152, 24, 19, 157, 159, 19, 8, 165, 163, 10,
+ 1, 171, 165, 1, 0, 175, 161, 0, 0, 177, 158, 0, 0, 179, 155, 0, 0, 181, 152, 0, 0, 184, 154, 0, 87, 20, 47, 213,
+ 88, 31, 54, 192, 89, 45, 67, 165, 86, 67, 75, 130, 80, 82, 80, 100, 76, 91, 87, 80, 72, 97, 98, 45, 52, 125, 123, 36,
+ 36, 146, 136, 33, 20, 158, 144, 27, 9, 167, 150, 17, 2, 172, 151, 4, 0, 175, 149, 0, 0, 176, 146, 0, 0, 176, 143, 0,
+ 0, 177, 141, 0, 0, 181, 142, 0, 80, 36, 6, 243, 82, 50, 14, 221, 84, 64, 26, 189, 82, 80, 45, 143, 75, 93, 60, 104,
+ 75, 93, 62, 82, 70, 108, 73, 66, 57, 123, 93, 55, 38, 149, 112, 46, 23, 164, 126, 40, 11, 175, 132, 31, 3, 180, 135, 17,
+ 0, 181, 134, 2, 0, 180, 132, 0, 0, 178, 130, 0, 0, 178, 129, 0, 0, 180, 126, 0, 72, 80, 8, 243, 73, 87, 11, 232,
+ 74, 99, 18, 208, 73, 106, 29, 179, 68, 109, 43, 146, 67, 110, 50, 115, 64, 114, 60, 91, 64, 115, 69, 65, 47, 137, 87, 56,
+ 28, 156, 105, 45, 14, 167, 118, 36, 5, 175, 123, 24, 1, 177, 125, 7, 0, 176, 125, 0, 0, 175, 123, 0, 0, 173, 121, 0,
+ 0, 175, 122, 0, 59, 118, 10, 241, 59, 123, 13, 232, 59, 129, 17, 218, 59, 135, 24, 196, 58, 134, 31, 176, 57, 135, 38, 150,
+ 57, 136, 46, 121, 53, 132, 59, 93, 55, 126, 64, 64, 39, 145, 80, 50, 19, 162, 97, 38, 9, 168, 106, 26, 1, 175, 113, 15,
+ 0, 172, 113, 0, 0, 170, 113, 0, 0, 167, 113, 0, 0, 168, 113, 0, 45, 141, 13, 243, 45, 143, 15, 233, 45, 146, 18, 222,
+ 46, 148, 22, 206, 46, 148, 26, 190, 46, 148, 32, 171, 46, 149, 38, 146, 45, 149, 45, 119, 44, 141, 51, 87, 46, 142, 55, 55,
+ 26, 157, 72, 40, 14, 165, 86, 28, 5, 170, 96, 18, 0, 170, 102, 6, 0, 167, 102, 0, 0, 164, 102, 0, 0, 164, 104, 0,
+ 31, 155, 16, 243, 32, 156, 17, 236, 33, 156, 19, 226, 34, 158, 22, 214, 34, 157, 25, 200, 34, 157, 29, 186, 34, 157, 35, 162,
+ 33, 159, 38, 144, 33, 157, 38, 113, 33, 155, 40, 80, 36, 157, 45, 47, 20, 163, 60, 31, 9, 166, 75, 17, 0, 170, 87, 12,
+ 0, 165, 89, 0, 0, 159, 91, 0, 0, 159, 93, 0, 18, 166, 17, 243, 20, 166, 18, 238, 21, 166, 19, 230, 23, 166, 21, 220,
+ 23, 165, 24, 208, 23, 164, 27, 194, 25, 165, 31, 176, 25, 165, 35, 156, 23, 164, 32, 137, 23, 164, 31, 107, 24, 162, 31, 75,
+ 24, 166, 38, 44, 12, 166, 48, 23, 0, 170, 67, 17, 0, 164, 73, 2, 0, 158, 77, 0, 0, 155, 80, 0, 8, 173, 19, 243,
+ 9, 172, 20, 238, 12, 171, 20, 231, 13, 171, 22, 221, 14, 170, 25, 209, 14, 167, 24, 198, 15, 167, 25, 184, 16, 168, 28, 168,
+ 15, 167, 26, 151, 15, 166, 25, 129, 16, 166, 23, 98, 17, 166, 24, 68, 15, 172, 31, 40, 6, 168, 40, 19, 0, 164, 53, 8,
+ 0, 157, 60, 0, 0, 152, 66, 0, 3, 178, 17, 243, 3, 175, 17, 238, 4, 173, 18, 231, 6, 171, 18, 222, 7, 170, 17, 213,
+ 7, 167, 16, 201, 8, 168, 17, 189, 7, 168, 19, 178, 8, 167, 19, 161, 8, 166, 18, 141, 9, 165, 17, 115, 11, 164, 16, 88,
+ 11, 167, 17, 59, 9, 172, 24, 35, 0, 168, 33, 17, 0, 159, 41, 1, 0, 151, 52, 0, 0, 180, 14, 244, 0, 177, 12, 238,
+ 2, 176, 11, 230, 3, 173, 10, 222, 3, 171, 9, 213, 2, 166, 8, 202, 3, 166, 8, 191, 2, 167, 10, 181, 3, 166, 10, 166,
+ 3, 164, 10, 148, 4, 164, 10, 130, 3, 165, 11, 106, 2, 166, 12, 80, 2, 170, 13, 51, 1, 171, 16, 26, 0, 163, 23, 8,
+ 0, 151, 37, 0, 0, 182, 7, 244, 0, 178, 5, 238, 0, 176, 3, 230, 0, 172, 2, 221, 0, 170, 2, 212, 0, 165, 1, 200,
+ 0, 163, 1, 189, 0, 163, 2, 179, 0, 163, 2, 166, 0, 162, 2, 151, 1, 161, 2, 136, 1, 161, 1, 113, 1, 161, 1, 91,
+ 1, 163, 2, 62, 0, 165, 4, 33, 0, 165, 7, 12, 0, 151, 22, 0, 0, 184, 0, 243, 0, 180, 0, 237, 0, 177, 0, 228,
+ 0, 172, 0, 218, 0, 167, 0, 206, 0, 162, 0, 193, 0, 157, 0, 178, 0, 157, 0, 170, 0, 157, 0, 159, 0, 157, 0, 149,
+ 0, 157, 0, 137, 0, 156, 0, 120, 0, 156, 0, 100, 0, 158, 0, 75, 0, 159, 0, 39, 0, 161, 0, 10, 0, 161, 0, 0,
+ 69, 9, 204, 218, 69, 9, 205, 203, 70, 9, 206, 184, 67, 6, 214, 150, 65, 7, 217, 95, 64, 9, 217, 38, 60, 20, 217, 5,
+ 47, 45, 215, 5, 33, 87, 206, 6, 19, 115, 202, 6, 12, 139, 200, 4, 8, 151, 198, 2, 6, 161, 195, 2, 4, 170, 193, 1,
+ 2, 177, 191, 1, 1, 182, 189, 0, 0, 188, 187, 0, 75, 10, 184, 219, 76, 17, 181, 204, 76, 23, 181, 180, 74, 21, 187, 152,
+ 72, 20, 193, 94, 70, 23, 194, 33, 62, 45, 194, 9, 48, 77, 196, 9, 31, 107, 194, 9, 17, 132, 194, 7, 7, 147, 193, 3,
+ 0, 156, 191, 0, 0, 163, 188, 0, 0, 170, 186, 0, 0, 176, 184, 0, 0, 180, 181, 0, 0, 184, 182, 0, 80, 19, 152, 201,
+ 82, 26, 153, 189, 80, 33, 155, 170, 75, 32, 165, 151, 72, 29, 176, 104, 70, 32, 177, 47, 65, 50, 178, 14, 51, 84, 184, 13,
+ 33, 113, 186, 12, 18, 136, 188, 9, 8, 148, 187, 4, 0, 157, 186, 0, 0, 163, 181, 0, 0, 168, 179, 0, 0, 173, 177, 0,
+ 0, 178, 175, 0, 0, 181, 177, 0, 79, 21, 135, 202, 80, 27, 136, 189, 80, 35, 139, 170, 76, 42, 143, 152, 74, 45, 148, 126,
+ 70, 43, 154, 82, 71, 51, 153, 21, 54, 86, 165, 18, 36, 114, 172, 17, 20, 137, 176, 14, 9, 149, 177, 9, 1, 157, 178, 1,
+ 0, 163, 175, 0, 0, 167, 170, 0, 0, 171, 167, 0, 0, 175, 165, 0, 0, 178, 168, 0, 79, 22, 107, 205, 80, 28, 109, 191,
+ 79, 36, 118, 175, 76, 47, 123, 151, 76, 65, 114, 119, 72, 64, 125, 92, 71, 63, 132, 36, 55, 89, 147, 26, 38, 118, 154, 24,
+ 23, 138, 159, 20, 10, 149, 164, 12, 2, 156, 167, 2, 0, 161, 164, 0, 0, 164, 159, 0, 0, 167, 157, 0, 0, 170, 155, 0,
+ 0, 175, 157, 0, 79, 20, 79, 215, 80, 28, 86, 198, 79, 39, 93, 179, 76, 50, 97, 155, 74, 68, 98, 122, 70, 80, 99, 100,
+ 65, 77, 109, 69, 59, 84, 123, 38, 39, 119, 139, 33, 23, 139, 147, 27, 10, 148, 152, 17, 2, 155, 155, 4, 0, 159, 153, 0,
+ 0, 161, 150, 0, 0, 163, 147, 0, 0, 165, 145, 0, 0, 170, 146, 0, 77, 15, 30, 234, 78, 26, 45, 212, 80, 39, 60, 188,
+ 77, 53, 72, 161, 69, 75, 79, 130, 66, 84, 80, 102, 62, 94, 90, 86, 61, 93, 96, 54, 38, 122, 119, 44, 22, 141, 133, 36,
+ 10, 150, 139, 26, 2, 157, 142, 12, 0, 159, 141, 0, 0, 159, 138, 0, 0, 161, 135, 0, 0, 161, 132, 0, 0, 165, 132, 0,
+ 71, 45, 13, 243, 72, 43, 22, 224, 72, 52, 32, 200, 71, 70, 45, 168, 62, 87, 63, 135, 66, 86, 62, 104, 62, 94, 68, 89,
+ 59, 110, 75, 72, 43, 121, 93, 63, 24, 143, 110, 52, 9, 158, 121, 41, 2, 164, 125, 25, 0, 165, 125, 8, 0, 165, 121, 0,
+ 0, 164, 119, 0, 0, 162, 116, 0, 0, 164, 113, 0, 60, 90, 14, 243, 60, 95, 17, 230, 60, 97, 23, 216, 59, 104, 31, 195,
+ 56, 106, 40, 173, 55, 109, 48, 139, 53, 110, 54, 112, 50, 113, 65, 93, 49, 115, 73, 74, 31, 135, 89, 65, 14, 151, 104, 48,
+ 4, 159, 112, 35, 0, 163, 115, 17, 0, 161, 113, 1, 0, 159, 110, 0, 0, 158, 109, 0, 0, 158, 108, 0, 46, 118, 17, 243,
+ 46, 122, 19, 231, 46, 123, 23, 220, 46, 126, 28, 204, 46, 130, 33, 189, 45, 131, 38, 167, 45, 132, 45, 142, 44, 134, 53, 118,
+ 38, 130, 63, 95, 40, 126, 68, 72, 23, 141, 80, 57, 11, 154, 92, 36, 2, 159, 100, 22, 0, 159, 102, 6, 0, 157, 102, 0,
+ 0, 155, 100, 0, 0, 154, 100, 0, 32, 139, 20, 243, 32, 140, 22, 233, 33, 140, 25, 224, 34, 141, 27, 212, 35, 142, 30, 199,
+ 35, 143, 34, 184, 35, 145, 38, 159, 33, 147, 44, 142, 30, 146, 48, 116, 28, 139, 53, 89, 30, 141, 58, 61, 17, 151, 69, 41,
+ 2, 159, 84, 31, 0, 159, 88, 12, 0, 155, 89, 0, 0, 152, 90, 0, 0, 151, 90, 0, 17, 151, 23, 243, 19, 152, 24, 237,
+ 21, 151, 25, 228, 22, 152, 26, 217, 23, 152, 29, 205, 23, 152, 32, 192, 24, 153, 34, 175, 23, 153, 37, 156, 20, 154, 38, 138,
+ 19, 151, 38, 109, 22, 150, 39, 79, 21, 153, 45, 50, 9, 156, 58, 33, 0, 158, 69, 17, 0, 155, 73, 1, 0, 150, 76, 0,
+ 0, 146, 78, 0, 6, 161, 25, 244, 9, 161, 25, 237, 11, 161, 26, 229, 13, 159, 26, 220, 14, 159, 26, 209, 14, 158, 26, 198,
+ 15, 158, 27, 184, 15, 157, 30, 167, 12, 158, 32, 152, 12, 156, 30, 130, 14, 154, 28, 99, 16, 154, 30, 70, 12, 159, 36, 45,
+ 2, 159, 45, 25, 0, 155, 53, 7, 0, 148, 59, 0, 0, 142, 64, 0, 0, 167, 23, 244, 1, 165, 21, 238, 3, 163, 21, 231,
+ 7, 162, 20, 222, 7, 159, 19, 213, 7, 159, 17, 201, 8, 159, 19, 189, 8, 158, 22, 176, 6, 158, 24, 161, 7, 157, 23, 141,
+ 8, 155, 22, 116, 8, 156, 21, 91, 7, 158, 25, 65, 4, 162, 29, 40, 0, 158, 34, 17, 0, 149, 40, 1, 0, 141, 48, 0,
+ 0, 171, 16, 244, 0, 168, 13, 238, 2, 166, 12, 230, 3, 164, 11, 222, 3, 162, 10, 213, 2, 159, 9, 203, 2, 159, 10, 192,
+ 1, 159, 12, 181, 1, 158, 14, 166, 0, 158, 14, 150, 1, 158, 14, 133, 0, 157, 14, 108, 0, 158, 14, 82, 0, 159, 15, 52,
+ 0, 161, 17, 26, 0, 152, 21, 6, 0, 139, 34, 0, 0, 175, 8, 244, 0, 171, 5, 238, 0, 167, 4, 230, 0, 164, 3, 222,
+ 1, 162, 3, 212, 0, 159, 2, 201, 0, 157, 2, 189, 0, 155, 2, 176, 0, 153, 2, 161, 0, 153, 3, 149, 0, 152, 4, 134,
+ 0, 152, 3, 113, 0, 152, 3, 92, 0, 153, 3, 64, 0, 153, 4, 33, 0, 153, 6, 11, 0, 138, 19, 0, 0, 177, 0, 243,
+ 0, 173, 0, 237, 0, 170, 0, 228, 0, 165, 0, 218, 0, 161, 0, 207, 0, 157, 0, 194, 0, 151, 0, 180, 0, 144, 0, 159,
+ 0, 144, 0, 150, 0, 143, 0, 141, 0, 143, 0, 130, 0, 142, 0, 114, 0, 141, 0, 96, 0, 143, 0, 74, 0, 144, 0, 39,
+ 0, 144, 0, 10, 0, 143, 0, 0, 57, 8, 207, 221, 57, 8, 207, 211, 57, 8, 208, 194, 55, 7, 213, 171, 53, 6, 217, 135,
+ 50, 8, 219, 80, 49, 9, 220, 34, 45, 18, 217, 6, 32, 40, 217, 7, 20, 79, 207, 6, 14, 108, 204, 4, 9, 131, 202, 2,
+ 6, 145, 199, 1, 4, 154, 196, 1, 2, 162, 194, 0, 0, 170, 191, 0, 0, 176, 189, 0, 63, 10, 189, 221, 64, 16, 187, 208,
+ 65, 20, 186, 191, 62, 18, 191, 171, 59, 16, 199, 133, 57, 18, 200, 78, 57, 23, 196, 30, 48, 41, 196, 11, 33, 72, 198, 11,
+ 18, 102, 198, 8, 9, 123, 196, 3, 1, 140, 194, 0, 0, 149, 190, 0, 0, 155, 188, 0, 0, 162, 186, 0, 0, 167, 184, 0,
+ 0, 172, 186, 0, 70, 17, 166, 209, 70, 21, 166, 200, 68, 28, 165, 184, 65, 28, 173, 167, 61, 25, 184, 137, 59, 26, 186, 91,
+ 59, 30, 182, 39, 53, 46, 182, 16, 36, 78, 189, 14, 21, 106, 190, 10, 9, 127, 189, 6, 1, 141, 188, 0, 0, 149, 184, 0,
+ 0, 155, 181, 0, 0, 161, 179, 0, 0, 165, 177, 0, 0, 168, 179, 0, 71, 17, 147, 211, 70, 23, 149, 199, 67, 30, 151, 186,
+ 66, 36, 154, 167, 63, 37, 159, 148, 60, 36, 164, 113, 59, 39, 165, 58, 59, 48, 162, 22, 39, 80, 173, 18, 24, 108, 179, 15,
+ 11, 130, 180, 9, 3, 141, 179, 2, 0, 150, 177, 0, 0, 154, 172, 0, 0, 158, 168, 0, 0, 162, 167, 0, 0, 165, 171, 0,
+ 71, 21, 126, 208, 71, 26, 127, 199, 67, 33, 134, 186, 65, 41, 138, 166, 64, 49, 139, 148, 61, 51, 142, 121, 58, 51, 147, 71,
+ 61, 57, 144, 29, 41, 86, 156, 25, 25, 112, 163, 21, 13, 131, 166, 13, 4, 141, 167, 4, 0, 149, 166, 0, 0, 152, 161, 0,
+ 0, 155, 158, 0, 0, 158, 156, 0, 0, 162, 159, 0, 69, 19, 104, 220, 70, 28, 107, 201, 68, 37, 110, 186, 65, 45, 114, 166,
+ 63, 54, 119, 148, 62, 69, 115, 120, 57, 69, 123, 93, 55, 66, 131, 57, 41, 91, 141, 34, 26, 115, 149, 28, 14, 131, 153, 19,
+ 5, 141, 156, 7, 0, 147, 155, 0, 0, 150, 151, 0, 0, 152, 148, 0, 0, 155, 146, 0, 0, 159, 147, 0, 69, 17, 70, 233,
+ 70, 30, 80, 206, 68, 43, 89, 184, 65, 51, 93, 166, 61, 60, 97, 151, 60, 75, 98, 118, 57, 84, 98, 102, 53, 82, 107, 75,
+ 43, 96, 121, 45, 25, 116, 134, 36, 12, 131, 141, 26, 3, 141, 145, 13, 0, 145, 145, 0, 0, 148, 141, 0, 0, 149, 138, 0,
+ 0, 151, 135, 0, 0, 154, 135, 0, 67, 20, 32, 239, 67, 28, 48, 222, 66, 41, 60, 200, 62, 54, 70, 181, 57, 68, 79, 156,
+ 56, 76, 79, 127, 53, 86, 82, 104, 48, 98, 91, 89, 46, 100, 97, 62, 25, 118, 115, 49, 10, 136, 127, 36, 3, 143, 131, 20,
+ 0, 146, 131, 3, 0, 147, 127, 0, 0, 148, 123, 0, 0, 149, 120, 0, 0, 151, 118, 0, 56, 52, 22, 244, 57, 62, 26, 228,
+ 57, 68, 33, 214, 55, 77, 42, 194, 50, 84, 53, 170, 54, 86, 57, 134, 56, 87, 59, 102, 50, 97, 71, 92, 40, 110, 79, 80,
+ 25, 120, 96, 71, 9, 141, 109, 56, 2, 149, 113, 37, 0, 151, 112, 13, 0, 151, 110, 0, 0, 151, 107, 0, 0, 150, 105, 0,
+ 0, 150, 100, 0, 45, 89, 24, 243, 44, 94, 26, 233, 43, 97, 31, 223, 43, 100, 37, 207, 42, 104, 42, 191, 42, 106, 47, 166,
+ 44, 106, 51, 132, 43, 109, 58, 109, 34, 113, 69, 98, 32, 115, 76, 82, 14, 132, 90, 71, 1, 147, 100, 51, 0, 150, 104, 26,
+ 0, 149, 102, 3, 0, 147, 100, 0, 0, 145, 98, 0, 0, 144, 95, 0, 31, 114, 26, 243, 31, 119, 27, 236, 31, 120, 30, 226,
+ 33, 122, 34, 214, 33, 125, 36, 199, 34, 126, 40, 184, 35, 129, 43, 158, 33, 130, 46, 138, 26, 133, 56, 120, 21, 127, 64, 97,
+ 22, 126, 72, 77, 8, 139, 82, 63, 1, 146, 88, 36, 0, 149, 89, 11, 0, 146, 88, 0, 0, 142, 88, 0, 0, 140, 87, 0,
+ 16, 136, 30, 244, 17, 138, 30, 237, 18, 138, 31, 229, 20, 139, 33, 218, 22, 140, 34, 205, 23, 141, 36, 191, 24, 141, 37, 173,
+ 23, 141, 38, 155, 18, 142, 45, 140, 16, 140, 48, 113, 14, 135, 56, 90, 13, 138, 61, 67, 0, 148, 71, 47, 0, 149, 73, 19,
+ 0, 145, 74, 1, 0, 141, 75, 0, 0, 136, 75, 0, 2, 149, 33, 244, 5, 150, 32, 238, 8, 150, 32, 230, 9, 149, 32, 221,
+ 12, 148, 31, 209, 14, 147, 29, 197, 16, 147, 30, 182, 15, 145, 32, 164, 11, 146, 36, 151, 9, 146, 38, 131, 8, 145, 40, 105,
+ 9, 144, 42, 79, 7, 148, 46, 52, 0, 149, 53, 31, 0, 145, 54, 6, 0, 139, 58, 0, 0, 132, 61, 0, 0, 155, 26, 244,
+ 1, 154, 23, 238, 3, 153, 23, 231, 6, 152, 22, 223, 7, 151, 21, 213, 8, 149, 20, 200, 9, 149, 21, 188, 7, 149, 25, 176,
+ 4, 149, 28, 161, 3, 149, 29, 144, 2, 149, 29, 123, 4, 148, 28, 95, 5, 147, 29, 67, 2, 150, 34, 41, 0, 146, 36, 15,
+ 0, 139, 40, 0, 0, 127, 45, 0, 0, 159, 17, 244, 0, 159, 14, 238, 2, 157, 13, 230, 2, 155, 13, 223, 2, 154, 12, 215,
+ 1, 152, 12, 204, 1, 151, 13, 193, 0, 151, 14, 181, 0, 149, 15, 165, 0, 149, 15, 149, 1, 148, 15, 131, 1, 147, 15, 106,
+ 0, 149, 16, 82, 0, 150, 17, 53, 0, 151, 18, 26, 0, 141, 21, 4, 0, 125, 31, 0, 0, 165, 9, 244, 0, 162, 5, 238,
+ 0, 159, 4, 230, 0, 157, 3, 222, 1, 154, 4, 212, 0, 151, 3, 201, 0, 150, 3, 190, 0, 147, 3, 177, 0, 145, 3, 159,
+ 0, 144, 4, 146, 0, 143, 4, 131, 0, 142, 4, 110, 0, 142, 3, 89, 0, 144, 4, 62, 0, 143, 4, 32, 0, 142, 6, 9,
+ 0, 120, 17, 0, 0, 167, 0, 243, 0, 165, 0, 238, 0, 162, 0, 229, 0, 158, 0, 219, 0, 154, 0, 207, 0, 150, 0, 194,
+ 0, 144, 0, 180, 0, 138, 0, 159, 0, 132, 0, 141, 0, 130, 0, 131, 0, 127, 0, 120, 0, 126, 0, 107, 0, 126, 0, 92,
+ 0, 127, 0, 70, 0, 127, 0, 39, 0, 126, 0, 11, 0, 125, 0, 0, 45, 8, 208, 222, 45, 8, 208, 213, 45, 8, 209, 200,
+ 43, 7, 213, 184, 40, 6, 217, 155, 37, 7, 219, 113, 35, 9, 220, 71, 32, 11, 219, 33, 31, 17, 217, 9, 22, 33, 218, 6,
+ 16, 73, 212, 4, 10, 102, 206, 3, 6, 125, 203, 1, 3, 139, 200, 1, 2, 149, 197, 0, 0, 156, 194, 0, 0, 163, 192, 0,
+ 48, 9, 195, 226, 50, 13, 191, 218, 52, 18, 190, 200, 49, 17, 195, 184, 45, 14, 203, 153, 44, 16, 203, 114, 44, 18, 202, 70,
+ 42, 22, 199, 33, 36, 38, 197, 13, 23, 63, 199, 9, 12, 91, 196, 6, 4, 113, 196, 1, 0, 131, 193, 0, 0, 141, 190, 0,
+ 0, 149, 189, 0, 0, 155, 187, 0, 0, 159, 188, 0, 51, 12, 179, 224, 56, 17, 173, 213, 58, 25, 173, 194, 52, 25, 181, 182,
+ 47, 21, 190, 154, 46, 22, 191, 125, 46, 25, 190, 79, 45, 29, 187, 42, 40, 44, 184, 17, 26, 70, 189, 14, 13, 96, 189, 8,
+ 3, 118, 189, 1, 0, 133, 187, 0, 0, 142, 184, 0, 0, 149, 181, 0, 0, 153, 179, 0, 0, 157, 181, 0, 54, 14, 161, 224,
+ 58, 19, 159, 212, 59, 26, 159, 193, 55, 32, 163, 181, 51, 33, 167, 163, 49, 34, 171, 141, 47, 34, 173, 105, 45, 35, 175, 70,
+ 44, 49, 170, 23, 27, 76, 177, 17, 15, 100, 180, 10, 5, 120, 180, 3, 0, 134, 179, 0, 0, 142, 175, 0, 0, 147, 171, 0,
+ 0, 151, 168, 0, 0, 153, 173, 0, 55, 17, 144, 223, 57, 23, 143, 209, 58, 29, 145, 194, 58, 36, 148, 179, 53, 44, 148, 159,
+ 51, 45, 151, 143, 49, 45, 153, 112, 47, 45, 155, 76, 45, 59, 154, 29, 27, 82, 163, 23, 15, 104, 167, 14, 6, 122, 170, 5,
+ 0, 134, 168, 0, 0, 141, 163, 0, 0, 144, 159, 0, 0, 148, 158, 0, 0, 151, 161, 0, 55, 18, 123, 228, 54, 27, 126, 211,
+ 55, 35, 127, 194, 56, 40, 131, 178, 53, 47, 133, 159, 49, 57, 135, 143, 47, 58, 138, 125, 45, 57, 141, 86, 45, 66, 140, 38,
+ 27, 87, 150, 29, 15, 106, 155, 18, 7, 123, 157, 8, 0, 133, 157, 0, 0, 139, 153, 0, 0, 141, 150, 0, 0, 145, 147, 0,
+ 0, 148, 150, 0, 57, 19, 98, 233, 56, 31, 104, 211, 54, 40, 109, 192, 53, 46, 110, 177, 51, 53, 113, 159, 51, 60, 119, 144,
+ 49, 75, 112, 118, 45, 74, 119, 93, 45, 76, 123, 51, 28, 91, 136, 38, 15, 107, 142, 25, 5, 123, 147, 16, 0, 131, 147, 1,
+ 0, 136, 143, 0, 0, 139, 139, 0, 0, 141, 136, 0, 0, 145, 137, 0, 57, 22, 69, 238, 55, 33, 80, 219, 53, 42, 87, 201,
+ 50, 50, 93, 186, 48, 59, 95, 164, 47, 66, 98, 147, 46, 77, 98, 120, 39, 87, 102, 105, 37, 84, 106, 79, 33, 90, 116, 52,
+ 15, 110, 129, 36, 5, 126, 135, 23, 0, 131, 136, 5, 0, 134, 132, 0, 0, 137, 127, 0, 0, 139, 123, 0, 0, 141, 121, 0,
+ 53, 30, 38, 240, 53, 40, 44, 223, 49, 47, 52, 213, 45, 56, 72, 196, 43, 67, 79, 177, 44, 71, 79, 152, 43, 76, 80, 123,
+ 36, 87, 86, 106, 29, 97, 93, 95, 27, 98, 99, 71, 11, 116, 113, 51, 2, 130, 120, 35, 0, 133, 120, 11, 0, 134, 115, 0,
+ 0, 135, 110, 0, 0, 136, 108, 0, 0, 136, 104, 0, 40, 63, 34, 244, 39, 72, 36, 233, 37, 75, 42, 224, 36, 73, 54, 206,
+ 34, 82, 65, 182, 42, 76, 58, 157, 47, 77, 57, 126, 43, 88, 65, 104, 33, 98, 75, 97, 21, 110, 82, 91, 6, 121, 98, 77,
+ 0, 133, 102, 51, 0, 137, 100, 23, 0, 138, 98, 2, 0, 138, 95, 0, 0, 136, 93, 0, 0, 137, 89, 0, 28, 93, 35, 244,
+ 28, 99, 36, 236, 28, 100, 38, 226, 29, 102, 43, 215, 28, 102, 46, 200, 29, 102, 49, 184, 34, 102, 47, 155, 36, 105, 52, 125,
+ 22, 110, 64, 115, 16, 114, 74, 104, 10, 116, 82, 91, 4, 126, 87, 70, 0, 135, 90, 37, 0, 137, 88, 9, 0, 135, 86, 0,
+ 0, 132, 84, 0, 0, 130, 82, 0, 14, 116, 37, 244, 16, 121, 37, 237, 17, 122, 37, 229, 19, 123, 39, 219, 20, 123, 40, 206,
+ 23, 122, 41, 192, 25, 122, 41, 173, 24, 123, 41, 152, 16, 126, 50, 139, 8, 123, 64, 121, 4, 121, 73, 104, 2, 125, 75, 86,
+ 0, 130, 75, 55, 0, 135, 75, 21, 0, 134, 74, 1, 0, 129, 74, 0, 0, 126, 74, 0, 2, 134, 37, 244, 5, 136, 35, 238,
+ 6, 135, 36, 231, 9, 135, 35, 222, 12, 134, 35, 211, 15, 133, 33, 197, 17, 134, 33, 181, 13, 134, 36, 166, 9, 134, 40, 151,
+ 2, 131, 52, 134, 0, 131, 56, 113, 0, 130, 57, 90, 0, 133, 59, 66, 0, 136, 57, 32, 0, 134, 55, 4, 0, 126, 58, 0,
+ 0, 120, 60, 0, 0, 142, 28, 244, 1, 142, 25, 238, 3, 142, 25, 231, 6, 141, 25, 222, 7, 140, 25, 212, 6, 139, 25, 201,
+ 7, 139, 26, 188, 7, 138, 27, 173, 5, 137, 29, 157, 1, 138, 35, 143, 0, 138, 36, 123, 0, 137, 36, 100, 0, 137, 37, 73,
+ 0, 139, 38, 43, 0, 135, 37, 15, 0, 126, 41, 0, 0, 116, 45, 0, 0, 149, 18, 245, 0, 149, 16, 238, 1, 148, 15, 232,
+ 2, 145, 14, 224, 2, 143, 14, 215, 2, 141, 14, 203, 1, 140, 15, 191, 0, 140, 17, 181, 0, 140, 17, 164, 0, 138, 18, 147,
+ 0, 138, 19, 129, 0, 137, 19, 107, 0, 137, 19, 82, 0, 137, 20, 51, 0, 138, 21, 26, 0, 129, 22, 2, 0, 114, 30, 0,
+ 0, 154, 9, 245, 0, 153, 6, 238, 0, 151, 5, 231, 0, 149, 5, 223, 0, 146, 5, 214, 0, 142, 4, 202, 0, 140, 4, 190,
+ 0, 138, 4, 177, 0, 136, 4, 159, 0, 134, 5, 144, 0, 133, 4, 129, 0, 132, 5, 109, 0, 132, 4, 88, 0, 133, 5, 61,
+ 0, 132, 5, 31, 0, 132, 7, 8, 0, 110, 16, 0, 0, 158, 0, 241, 0, 157, 0, 238, 0, 154, 0, 229, 0, 151, 0, 220,
+ 0, 147, 0, 208, 0, 141, 0, 195, 0, 136, 0, 180, 0, 130, 0, 159, 0, 121, 0, 141, 0, 119, 0, 126, 0, 118, 0, 115,
+ 0, 115, 0, 104, 0, 114, 0, 89, 0, 115, 0, 70, 0, 114, 0, 41, 0, 113, 0, 13, 0, 110, 0, 0, 32, 8, 208, 221,
+ 33, 8, 209, 214, 32, 8, 211, 203, 30, 6, 215, 189, 28, 5, 218, 168, 26, 6, 220, 139, 25, 6, 222, 98, 24, 8, 222, 62,
+ 24, 9, 221, 29, 24, 14, 221, 9, 16, 27, 222, 5, 12, 67, 215, 3, 8, 96, 208, 2, 4, 116, 204, 1, 1, 133, 201, 0,
+ 0, 143, 197, 0, 0, 151, 195, 0, 33, 10, 201, 225, 36, 12, 195, 221, 39, 17, 193, 206, 36, 16, 197, 192, 32, 13, 205, 165,
+ 30, 15, 205, 141, 29, 15, 205, 102, 28, 17, 204, 67, 29, 21, 200, 35, 26, 33, 198, 15, 16, 51, 199, 9, 7, 84, 198, 3,
+ 1, 104, 196, 0, 0, 122, 192, 0, 0, 135, 190, 0, 0, 142, 189, 0, 0, 148, 190, 0, 35, 12, 191, 227, 40, 15, 184, 220,
+ 44, 24, 178, 200, 39, 24, 186, 192, 34, 20, 193, 166, 32, 21, 194, 145, 31, 22, 193, 110, 31, 24, 191, 77, 31, 27, 189, 44,
+ 29, 40, 187, 19, 17, 59, 189, 11, 7, 87, 189, 4, 0, 107, 189, 0, 0, 123, 186, 0, 0, 135, 184, 0, 0, 141, 181, 0,
+ 0, 145, 184, 0, 37, 13, 177, 230, 42, 17, 170, 220, 44, 26, 166, 200, 41, 30, 168, 189, 38, 32, 172, 176, 36, 33, 175, 155,
+ 34, 32, 176, 133, 33, 31, 178, 99, 33, 36, 176, 47, 30, 49, 176, 22, 18, 69, 180, 14, 8, 93, 180, 5, 0, 110, 180, 0,
+ 0, 125, 176, 0, 0, 133, 173, 0, 0, 139, 171, 0, 0, 142, 176, 0, 39, 17, 158, 231, 43, 21, 153, 219, 45, 28, 154, 200,
+ 43, 35, 154, 187, 41, 41, 154, 171, 40, 45, 154, 153, 38, 45, 156, 135, 36, 41, 161, 102, 35, 44, 161, 52, 30, 59, 162, 27,
+ 17, 77, 167, 17, 8, 98, 170, 6, 0, 113, 170, 0, 0, 123, 164, 0, 0, 131, 161, 0, 0, 137, 159, 0, 0, 140, 163, 0,
+ 42, 18, 141, 233, 45, 25, 141, 218, 50, 30, 141, 200, 45, 38, 141, 186, 42, 45, 142, 170, 39, 52, 143, 154, 38, 53, 145, 139,
+ 36, 49, 149, 107, 34, 51, 150, 62, 30, 65, 150, 34, 17, 82, 156, 20, 8, 100, 158, 8, 0, 112, 159, 0, 0, 121, 154, 0,
+ 0, 127, 151, 0, 0, 133, 148, 0, 0, 137, 151, 0, 42, 22, 118, 236, 44, 30, 120, 217, 46, 36, 123, 199, 45, 42, 126, 187,
+ 41, 48, 126, 171, 37, 55, 130, 155, 36, 63, 134, 142, 34, 61, 135, 114, 32, 61, 136, 75, 33, 72, 136, 45, 17, 84, 144, 27,
+ 5, 102, 149, 16, 1, 110, 148, 1, 0, 119, 145, 0, 0, 126, 141, 0, 0, 130, 138, 0, 0, 134, 139, 0, 42, 27, 96, 237,
+ 41, 35, 102, 220, 41, 41, 105, 205, 40, 47, 108, 190, 37, 55, 110, 172, 37, 59, 112, 156, 36, 65, 116, 141, 33, 80, 110, 119,
+ 29, 75, 115, 95, 31, 75, 120, 65, 18, 90, 131, 37, 5, 105, 137, 24, 0, 113, 139, 9, 0, 118, 135, 0, 0, 123, 130, 0,
+ 0, 126, 126, 0, 0, 129, 125, 0, 41, 33, 72, 238, 41, 39, 75, 228, 38, 45, 82, 216, 36, 54, 92, 197, 34, 61, 95, 175,
+ 34, 63, 95, 156, 32, 68, 95, 139, 29, 80, 98, 119, 22, 90, 100, 108, 23, 86, 104, 80, 15, 95, 115, 51, 6, 107, 122, 34,
+ 0, 114, 126, 14, 0, 116, 121, 0, 0, 121, 116, 0, 0, 123, 110, 0, 0, 123, 108, 0, 35, 44, 48, 241, 34, 51, 52, 230,
+ 31, 58, 61, 221, 27, 64, 76, 206, 27, 67, 80, 189, 32, 65, 78, 168, 30, 68, 78, 149, 25, 82, 82, 126, 19, 92, 87, 110,
+ 13, 99, 93, 97, 8, 104, 100, 76, 0, 112, 107, 50, 0, 116, 107, 23, 0, 118, 104, 1, 0, 119, 100, 0, 0, 119, 95, 0,
+ 0, 120, 92, 0, 22, 74, 47, 244, 22, 79, 48, 236, 22, 82, 51, 226, 22, 86, 57, 213, 24, 84, 58, 197, 31, 76, 52, 176,
+ 39, 74, 48, 147, 39, 84, 55, 120, 25, 93, 67, 106, 13, 100, 78, 104, 0, 109, 84, 100, 0, 110, 91, 72, 0, 119, 88, 34,
+ 0, 121, 84, 4, 0, 121, 82, 0, 0, 120, 80, 0, 0, 120, 76, 0, 10, 99, 48, 244, 11, 102, 47, 238, 12, 104, 48, 230,
+ 14, 104, 49, 220, 17, 102, 48, 207, 22, 97, 46, 190, 27, 96, 44, 166, 20, 102, 49, 152, 1, 107, 65, 143, 6, 102, 70, 116,
+ 4, 105, 75, 102, 0, 110, 79, 86, 0, 114, 77, 54, 0, 119, 75, 17, 0, 119, 72, 0, 0, 115, 71, 0, 0, 113, 69, 0,
+ 0, 115, 45, 244, 2, 119, 43, 238, 5, 119, 42, 231, 9, 118, 40, 223, 12, 115, 39, 212, 15, 114, 37, 197, 17, 114, 36, 181,
+ 14, 115, 38, 166, 3, 119, 46, 157, 4, 114, 57, 130, 0, 110, 65, 110, 0, 110, 66, 92, 0, 110, 66, 70, 0, 114, 61, 36,
+ 0, 118, 56, 4, 0, 113, 57, 0, 0, 109, 58, 0, 0, 126, 32, 245, 1, 126, 28, 238, 3, 126, 28, 230, 7, 126, 28, 221,
+ 7, 125, 29, 212, 5, 125, 30, 203, 4, 126, 32, 192, 0, 126, 34, 182, 0, 126, 35, 163, 0, 123, 37, 144, 0, 116, 43, 119,
+ 0, 114, 44, 97, 0, 114, 44, 75, 0, 118, 45, 46, 0, 119, 39, 13, 0, 113, 41, 0, 0, 106, 44, 0, 0, 134, 21, 245,
+ 0, 136, 18, 238, 0, 135, 17, 232, 0, 133, 19, 225, 0, 132, 19, 217, 0, 130, 19, 205, 0, 129, 20, 192, 0, 127, 20, 179,
+ 0, 127, 20, 162, 0, 125, 21, 145, 0, 122, 23, 126, 0, 121, 23, 104, 0, 121, 23, 80, 0, 121, 23, 51, 0, 123, 23, 24,
+ 0, 115, 23, 1, 0, 104, 30, 0, 0, 142, 10, 245, 0, 141, 7, 239, 0, 140, 6, 232, 0, 137, 6, 224, 0, 135, 6, 214,
+ 0, 131, 6, 202, 0, 129, 6, 189, 0, 126, 6, 176, 0, 125, 7, 158, 0, 122, 6, 142, 0, 121, 6, 126, 0, 120, 6, 107,
+ 0, 120, 6, 87, 0, 120, 6, 60, 0, 120, 6, 30, 0, 119, 7, 6, 0, 102, 16, 0, 0, 147, 0, 241, 0, 146, 0, 239,
+ 0, 144, 0, 231, 0, 141, 0, 221, 0, 137, 0, 209, 0, 132, 0, 196, 0, 126, 0, 180, 0, 118, 0, 159, 0, 110, 0, 141,
+ 0, 108, 0, 126, 0, 107, 0, 110, 0, 105, 0, 102, 0, 104, 0, 87, 0, 104, 0, 69, 0, 104, 0, 43, 0, 102, 0, 16,
+ 0, 100, 0, 0, 22, 8, 211, 221, 22, 8, 211, 215, 21, 8, 212, 205, 20, 6, 216, 194, 19, 5, 219, 180, 19, 4, 221, 155,
+ 18, 4, 223, 125, 18, 5, 225, 87, 18, 5, 225, 54, 18, 8, 226, 26, 18, 12, 226, 7, 12, 24, 226, 4, 9, 62, 218, 2,
+ 5, 91, 211, 1, 2, 110, 205, 0, 0, 126, 201, 0, 0, 138, 197, 0, 21, 10, 204, 225, 25, 12, 200, 224, 26, 15, 199, 213,
+ 24, 14, 202, 198, 22, 12, 206, 176, 22, 12, 207, 154, 20, 11, 208, 126, 20, 12, 208, 89, 20, 14, 205, 60, 20, 18, 202, 35,
+ 19, 27, 200, 17, 10, 43, 201, 8, 3, 73, 200, 1, 0, 97, 196, 0, 0, 112, 192, 0, 0, 126, 190, 0, 0, 135, 192, 0,
+ 22, 12, 196, 228, 26, 14, 190, 225, 28, 19, 189, 211, 26, 21, 191, 198, 24, 18, 196, 176, 23, 17, 197, 157, 21, 17, 197, 134,
+ 21, 18, 196, 99, 22, 20, 193, 69, 22, 25, 191, 40, 20, 37, 189, 21, 10, 50, 191, 9, 2, 76, 191, 1, 0, 99, 188, 0,
+ 0, 114, 184, 0, 0, 125, 182, 0, 0, 132, 187, 0, 23, 15, 184, 231, 26, 17, 178, 226, 29, 23, 177, 212, 28, 27, 177, 198,
+ 27, 30, 178, 184, 26, 29, 180, 166, 24, 27, 182, 149, 21, 24, 184, 120, 24, 26, 181, 72, 25, 34, 179, 39, 20, 47, 180, 20,
+ 10, 61, 182, 9, 1, 84, 182, 0, 0, 102, 177, 0, 0, 113, 173, 0, 0, 122, 172, 0, 0, 129, 177, 0, 26, 18, 167, 232,
+ 27, 21, 164, 225, 29, 26, 164, 211, 29, 32, 162, 196, 30, 39, 159, 179, 29, 42, 161, 164, 26, 38, 165, 149, 23, 33, 168, 125,
+ 24, 33, 168, 75, 26, 41, 166, 42, 19, 56, 168, 22, 9, 70, 172, 9, 0, 89, 172, 0, 0, 102, 165, 0, 0, 112, 162, 0,
+ 0, 120, 159, 0, 0, 125, 165, 0, 27, 22, 151, 233, 29, 26, 151, 222, 29, 32, 150, 206, 29, 36, 151, 193, 29, 42, 151, 180,
+ 28, 48, 150, 163, 26, 48, 151, 150, 24, 41, 156, 130, 24, 40, 156, 82, 25, 46, 154, 48, 18, 60, 157, 26, 9, 75, 159, 11,
+ 1, 90, 161, 1, 0, 102, 156, 0, 0, 110, 151, 0, 0, 116, 149, 0, 0, 121, 152, 0, 26, 26, 135, 236, 28, 33, 136, 218,
+ 29, 39, 135, 200, 29, 43, 136, 191, 28, 46, 138, 179, 26, 50, 139, 163, 26, 56, 141, 151, 22, 49, 145, 135, 22, 47, 145, 93,
+ 24, 52, 142, 60, 18, 65, 145, 34, 8, 78, 150, 17, 2, 89, 150, 3, 0, 100, 146, 0, 0, 108, 141, 0, 0, 115, 139, 0,
+ 0, 118, 141, 0, 26, 32, 116, 237, 26, 38, 120, 220, 26, 44, 121, 205, 26, 47, 122, 192, 26, 51, 123, 180, 26, 54, 126, 165,
+ 25, 57, 127, 151, 20, 63, 130, 138, 19, 60, 129, 110, 21, 59, 130, 82, 17, 72, 133, 46, 3, 86, 141, 31, 0, 93, 141, 10,
+ 0, 100, 137, 0, 0, 107, 132, 0, 0, 113, 126, 0, 0, 114, 126, 0, 26, 38, 96, 238, 25, 44, 102, 223, 26, 47, 105, 211,
+ 25, 52, 108, 196, 25, 54, 108, 181, 26, 55, 107, 165, 24, 59, 106, 148, 19, 67, 110, 135, 15, 79, 109, 119, 14, 75, 112, 96,
+ 15, 79, 118, 62, 3, 89, 126, 43, 0, 95, 127, 18, 0, 100, 125, 0, 0, 106, 120, 0, 0, 110, 114, 0, 0, 109, 110, 0,
+ 23, 46, 77, 240, 21, 51, 86, 229, 21, 55, 89, 219, 21, 57, 93, 206, 23, 57, 92, 189, 26, 56, 91, 166, 21, 61, 93, 152,
+ 20, 70, 95, 137, 10, 82, 98, 122, 6, 88, 100, 109, 8, 86, 104, 84, 1, 91, 110, 68, 0, 99, 109, 41, 0, 100, 110, 4,
+ 0, 104, 104, 0, 0, 106, 99, 0, 0, 105, 96, 0, 15, 60, 62, 243, 17, 64, 63, 233, 17, 67, 65, 221, 19, 69, 70, 207,
+ 23, 65, 70, 193, 19, 60, 75, 184, 9, 67, 80, 175, 3, 75, 84, 158, 2, 84, 87, 135, 1, 93, 90, 115, 0, 94, 92, 97,
+ 0, 94, 94, 79, 0, 99, 93, 46, 0, 100, 90, 7, 0, 102, 86, 0, 0, 104, 82, 0, 0, 102, 79, 0, 1, 84, 64, 244,
+ 4, 88, 62, 237, 7, 87, 59, 228, 12, 84, 55, 217, 18, 76, 51, 200, 30, 61, 48, 175, 28, 65, 51, 159, 32, 72, 52, 140,
+ 18, 82, 64, 125, 0, 91, 76, 119, 0, 94, 78, 104, 0, 96, 75, 88, 0, 97, 76, 52, 0, 102, 72, 13, 0, 104, 68, 0,
+ 0, 104, 66, 0, 0, 102, 62, 0, 0, 97, 49, 244, 1, 100, 47, 238, 4, 100, 46, 232, 8, 100, 45, 222, 13, 96, 43, 207,
+ 12, 91, 43, 197, 9, 93, 45, 187, 0, 95, 51, 179, 0, 98, 55, 155, 0, 99, 62, 131, 0, 96, 66, 107, 0, 95, 66, 90,
+ 0, 95, 65, 66, 0, 98, 61, 32, 0, 102, 56, 4, 0, 100, 55, 0, 0, 98, 54, 0, 0, 106, 36, 245, 0, 108, 34, 239,
+ 2, 109, 33, 232, 4, 109, 33, 224, 5, 107, 33, 215, 4, 104, 34, 205, 2, 105, 36, 195, 0, 106, 37, 184, 0, 106, 36, 164,
+ 0, 107, 39, 143, 0, 100, 45, 116, 0, 94, 49, 93, 0, 93, 48, 72, 0, 94, 47, 47, 0, 99, 44, 17, 0, 100, 42, 1,
+ 0, 94, 43, 0, 0, 114, 23, 245, 0, 116, 20, 239, 0, 116, 19, 233, 0, 115, 20, 226, 0, 113, 22, 217, 0, 110, 23, 205,
+ 0, 110, 23, 192, 0, 110, 23, 179, 0, 110, 22, 162, 0, 109, 23, 145, 0, 106, 25, 125, 0, 100, 29, 99, 0, 99, 28, 76,
+ 0, 100, 28, 52, 0, 102, 28, 26, 0, 102, 25, 1, 0, 93, 29, 0, 0, 125, 12, 245, 0, 126, 9, 239, 0, 125, 7, 233,
+ 0, 122, 7, 225, 0, 120, 8, 215, 0, 116, 8, 202, 0, 114, 9, 189, 0, 110, 8, 175, 0, 109, 8, 157, 0, 108, 8, 141,
+ 0, 107, 8, 125, 0, 106, 8, 104, 0, 104, 8, 84, 0, 104, 8, 59, 0, 105, 8, 29, 0, 104, 8, 5, 0, 91, 15, 0,
+ 0, 132, 0, 240, 0, 132, 0, 239, 0, 130, 0, 234, 0, 126, 0, 225, 0, 123, 0, 213, 0, 119, 0, 198, 0, 112, 0, 181,
+ 0, 105, 0, 159, 0, 99, 0, 141, 0, 97, 0, 126, 0, 96, 0, 110, 0, 95, 0, 99, 0, 94, 0, 86, 0, 94, 0, 68,
+ 0, 93, 0, 44, 0, 92, 0, 18, 0, 90, 0, 0, 15, 7, 213, 223, 15, 7, 213, 218, 16, 6, 214, 209, 15, 5, 217, 200,
+ 14, 3, 220, 189, 14, 2, 222, 167, 14, 2, 225, 144, 14, 2, 227, 110, 15, 2, 228, 78, 15, 3, 229, 47, 15, 6, 230, 22,
+ 14, 12, 231, 5, 9, 20, 230, 2, 5, 56, 220, 1, 3, 84, 212, 0, 0, 104, 205, 0, 0, 119, 200, 0, 14, 10, 207, 225,
+ 15, 11, 205, 221, 15, 11, 206, 211, 14, 11, 208, 196, 13, 9, 209, 182, 13, 9, 209, 165, 13, 8, 211, 145, 13, 8, 212, 112,
+ 14, 9, 209, 82, 15, 11, 207, 56, 14, 16, 205, 35, 14, 25, 202, 19, 7, 34, 204, 7, 0, 62, 202, 0, 0, 87, 196, 0,
+ 0, 104, 193, 0, 0, 114, 194, 0, 12, 12, 199, 228, 14, 14, 198, 224, 17, 17, 198, 213, 16, 17, 199, 197, 14, 14, 200, 184,
+ 14, 14, 199, 167, 14, 12, 200, 149, 14, 12, 200, 119, 15, 14, 197, 87, 15, 16, 195, 61, 15, 20, 193, 36, 12, 29, 194, 17,
+ 5, 41, 194, 6, 0, 68, 191, 0, 0, 91, 187, 0, 0, 104, 184, 0, 0, 110, 188, 0, 13, 16, 189, 231, 14, 17, 188, 226,
+ 16, 20, 188, 215, 17, 25, 184, 204, 17, 26, 184, 191, 15, 23, 186, 177, 14, 18, 189, 154, 14, 17, 189, 127, 16, 18, 187, 90,
+ 17, 21, 184, 60, 17, 30, 184, 34, 11, 39, 184, 15, 3, 51, 186, 3, 0, 75, 181, 0, 0, 92, 176, 0, 0, 102, 172, 0,
+ 0, 108, 178, 0, 14, 19, 175, 233, 16, 21, 175, 227, 17, 25, 175, 216, 17, 30, 168, 202, 19, 38, 162, 184, 18, 35, 168, 175,
+ 16, 26, 175, 154, 15, 24, 177, 133, 17, 24, 175, 93, 17, 26, 172, 62, 18, 37, 171, 36, 10, 46, 175, 16, 3, 59, 175, 2,
+ 0, 77, 170, 0, 0, 92, 164, 0, 0, 102, 161, 0, 0, 106, 166, 0, 15, 24, 159, 234, 17, 27, 157, 225, 18, 31, 155, 213,
+ 18, 35, 154, 199, 18, 37, 152, 186, 19, 41, 154, 171, 17, 38, 158, 159, 15, 33, 161, 142, 16, 30, 161, 100, 17, 31, 159, 68,
+ 17, 41, 159, 42, 11, 51, 162, 21, 4, 63, 163, 5, 0, 77, 159, 0, 0, 91, 153, 0, 0, 100, 150, 0, 0, 104, 154, 0,
+ 14, 29, 146, 236, 17, 34, 144, 221, 20, 39, 141, 205, 20, 41, 142, 196, 18, 42, 144, 186, 18, 43, 145, 171, 16, 46, 146, 159,
+ 13, 40, 150, 145, 14, 36, 151, 110, 17, 37, 148, 77, 15, 45, 149, 48, 9, 55, 151, 27, 0, 68, 154, 11, 0, 77, 150, 0,
+ 0, 91, 142, 0, 0, 100, 140, 0, 0, 100, 142, 0, 13, 36, 132, 237, 15, 40, 133, 219, 17, 43, 131, 204, 18, 43, 132, 196,
+ 18, 44, 132, 186, 17, 44, 133, 172, 16, 47, 134, 157, 12, 51, 137, 146, 12, 47, 138, 126, 14, 45, 137, 95, 13, 50, 137, 60,
+ 7, 60, 141, 36, 0, 70, 143, 17, 0, 78, 139, 0, 0, 91, 133, 0, 0, 99, 127, 0, 0, 98, 129, 0, 11, 43, 115, 238,
+ 13, 45, 118, 219, 16, 47, 115, 202, 17, 45, 116, 195, 17, 45, 118, 187, 18, 47, 118, 173, 17, 51, 120, 158, 12, 59, 122, 144,
+ 7, 62, 122, 131, 7, 59, 125, 109, 8, 60, 126, 76, 2, 68, 130, 52, 0, 74, 130, 25, 0, 78, 126, 1, 0, 90, 121, 0,
+ 0, 96, 115, 0, 0, 94, 113, 0, 9, 50, 99, 240, 9, 53, 104, 225, 13, 50, 102, 213, 15, 48, 102, 202, 17, 47, 102, 190,
+ 17, 48, 102, 172, 10, 57, 104, 159, 7, 63, 108, 148, 1, 69, 110, 136, 0, 76, 107, 119, 0, 75, 110, 98, 0, 75, 112, 79,
+ 0, 79, 110, 46, 0, 80, 110, 7, 0, 88, 106, 0, 0, 93, 102, 0, 0, 91, 99, 0, 3, 63, 86, 243, 6, 64, 84, 233,
+ 9, 62, 84, 224, 13, 56, 84, 213, 17, 51, 84, 195, 13, 53, 88, 180, 7, 60, 92, 163, 9, 67, 91, 144, 4, 73, 95, 133,
+ 0, 82, 95, 116, 0, 84, 93, 100, 0, 80, 95, 86, 0, 84, 94, 59, 0, 84, 93, 25, 0, 87, 90, 2, 0, 90, 86, 0,
+ 0, 87, 84, 0, 0, 69, 70, 244, 5, 68, 66, 233, 10, 65, 62, 222, 17, 59, 60, 208, 15, 56, 63, 200, 0, 60, 77, 202,
+ 0, 63, 78, 186, 0, 66, 79, 165, 0, 72, 80, 144, 0, 78, 80, 120, 0, 80, 80, 100, 0, 77, 80, 88, 0, 80, 79, 61,
+ 0, 84, 76, 27, 0, 86, 72, 2, 0, 87, 68, 0, 0, 86, 67, 0, 0, 73, 51, 245, 0, 78, 51, 238, 4, 79, 49, 228,
+ 5, 77, 49, 220, 0, 73, 50, 218, 2, 65, 46, 205, 5, 64, 44, 189, 12, 63, 43, 164, 10, 68, 47, 145, 3, 79, 59, 126,
+ 0, 80, 64, 104, 0, 78, 64, 88, 0, 79, 61, 74, 0, 82, 60, 32, 0, 86, 54, 3, 0, 86, 52, 0, 0, 86, 48, 0,
+ 0, 86, 36, 245, 0, 88, 36, 238, 0, 90, 36, 233, 0, 90, 38, 226, 0, 88, 38, 217, 0, 84, 38, 206, 0, 84, 39, 194,
+ 0, 82, 40, 180, 0, 82, 40, 161, 0, 87, 43, 141, 0, 84, 46, 113, 0, 78, 47, 89, 0, 79, 47, 71, 0, 80, 45, 45,
+ 0, 82, 43, 14, 0, 84, 40, 0, 0, 80, 40, 0, 0, 95, 25, 246, 0, 96, 21, 239, 0, 96, 21, 233, 0, 96, 22, 226,
+ 0, 95, 23, 217, 0, 93, 24, 205, 0, 93, 25, 193, 0, 93, 25, 180, 0, 94, 26, 163, 0, 93, 26, 145, 0, 91, 26, 125,
+ 0, 84, 29, 96, 0, 80, 31, 73, 0, 80, 31, 51, 0, 82, 30, 27, 0, 84, 26, 2, 0, 78, 28, 0, 0, 104, 13, 245,
+ 0, 105, 9, 239, 0, 104, 9, 234, 0, 104, 8, 226, 0, 102, 9, 216, 0, 99, 9, 203, 0, 98, 9, 190, 0, 96, 9, 176,
+ 0, 95, 9, 158, 0, 94, 9, 142, 0, 93, 9, 126, 0, 92, 9, 104, 0, 86, 13, 79, 0, 84, 13, 56, 0, 86, 14, 32,
+ 0, 86, 13, 8, 0, 77, 14, 0, 0, 110, 0, 239, 0, 110, 0, 239, 0, 110, 0, 236, 0, 108, 0, 226, 0, 106, 0, 215,
+ 0, 102, 0, 200, 0, 98, 0, 184, 0, 93, 0, 161, 0, 86, 0, 141, 0, 84, 0, 126, 0, 84, 0, 110, 0, 84, 0, 99,
+ 0, 82, 0, 84, 0, 82, 0, 67, 0, 80, 0, 45, 0, 79, 0, 21, 0, 77, 0, 0, 11, 5, 215, 222, 12, 5, 215, 218,
+ 11, 3, 217, 212, 11, 2, 219, 203, 10, 1, 222, 192, 10, 1, 223, 177, 9, 0, 225, 155, 10, 0, 227, 131, 11, 1, 228, 99,
+ 11, 2, 229, 70, 11, 3, 231, 42, 12, 5, 232, 18, 11, 9, 233, 4, 7, 17, 232, 3, 4, 47, 221, 1, 1, 76, 212, 0,
+ 0, 97, 205, 0, 9, 9, 209, 225, 10, 11, 206, 220, 10, 9, 207, 213, 9, 8, 209, 199, 9, 7, 209, 189, 9, 7, 209, 175,
+ 9, 6, 212, 155, 9, 5, 212, 133, 9, 5, 212, 100, 9, 6, 211, 75, 9, 8, 208, 51, 9, 11, 207, 33, 9, 17, 205, 18,
+ 5, 26, 205, 6, 0, 50, 202, 0, 0, 78, 198, 0, 0, 93, 198, 0, 9, 11, 202, 228, 9, 12, 200, 223, 9, 12, 200, 214,
+ 9, 11, 201, 200, 9, 9, 201, 189, 8, 8, 200, 175, 8, 8, 201, 157, 8, 8, 200, 137, 9, 9, 200, 104, 9, 9, 198, 79,
+ 9, 11, 197, 53, 9, 15, 196, 29, 7, 21, 196, 12, 1, 32, 195, 1, 0, 58, 191, 0, 0, 77, 189, 0, 0, 89, 191, 0,
+ 7, 15, 192, 231, 8, 17, 190, 225, 9, 17, 190, 217, 10, 20, 189, 207, 9, 18, 188, 195, 8, 14, 189, 184, 8, 11, 190, 161,
+ 9, 10, 190, 141, 9, 10, 190, 109, 10, 12, 189, 80, 10, 16, 188, 50, 9, 21, 188, 25, 4, 28, 188, 9, 0, 42, 186, 0,
+ 0, 62, 181, 0, 0, 78, 177, 0, 0, 87, 181, 0, 7, 18, 181, 234, 7, 19, 179, 229, 9, 21, 179, 219, 9, 23, 177, 208,
+ 9, 22, 176, 196, 9, 19, 178, 184, 8, 17, 180, 163, 9, 16, 179, 144, 9, 15, 179, 113, 11, 15, 177, 82, 11, 19, 176, 53,
+ 9, 26, 178, 29, 4, 33, 178, 10, 0, 45, 175, 0, 0, 63, 168, 0, 0, 79, 164, 0, 0, 86, 168, 0, 6, 25, 166, 236,
+ 7, 27, 163, 227, 9, 27, 162, 218, 9, 26, 162, 207, 9, 25, 163, 195, 9, 27, 163, 184, 9, 26, 163, 168, 9, 22, 165, 151,
+ 9, 19, 166, 119, 9, 19, 164, 86, 10, 23, 163, 60, 9, 30, 164, 36, 4, 37, 166, 16, 0, 46, 163, 1, 0, 65, 157, 0,
+ 0, 80, 152, 0, 0, 84, 156, 0, 6, 28, 153, 237, 8, 29, 151, 225, 9, 31, 150, 214, 10, 29, 150, 204, 9, 27, 151, 194,
+ 9, 32, 149, 178, 9, 36, 149, 163, 7, 30, 152, 151, 8, 24, 154, 126, 9, 23, 152, 92, 9, 28, 151, 66, 7, 36, 153, 43,
+ 3, 41, 155, 20, 0, 48, 153, 2, 0, 67, 146, 0, 0, 80, 141, 0, 0, 82, 143, 0, 3, 36, 141, 238, 8, 34, 139, 222,
+ 9, 34, 137, 209, 10, 33, 138, 201, 11, 34, 139, 191, 10, 36, 140, 179, 9, 40, 141, 164, 6, 41, 141, 151, 5, 37, 142, 138,
+ 5, 36, 143, 114, 4, 38, 142, 80, 4, 41, 143, 51, 0, 46, 146, 28, 0, 50, 143, 3, 0, 68, 135, 0, 0, 80, 127, 0,
+ 0, 79, 130, 0, 1, 41, 129, 238, 9, 36, 126, 219, 11, 36, 123, 202, 10, 35, 125, 196, 12, 36, 123, 186, 10, 38, 125, 173,
+ 9, 42, 126, 161, 4, 47, 129, 151, 2, 49, 127, 137, 4, 44, 130, 118, 3, 45, 131, 89, 0, 48, 133, 65, 0, 50, 133, 34,
+ 0, 52, 131, 5, 0, 68, 122, 0, 0, 78, 115, 0, 0, 75, 113, 0, 1, 45, 112, 239, 7, 39, 110, 224, 9, 38, 109, 211,
+ 8, 39, 112, 202, 9, 41, 113, 193, 7, 44, 114, 184, 8, 47, 114, 167, 4, 52, 116, 151, 0, 56, 114, 138, 0, 52, 114, 123,
+ 0, 52, 115, 102, 0, 50, 116, 80, 0, 54, 118, 43, 0, 55, 114, 10, 0, 67, 107, 0, 0, 76, 102, 0, 0, 73, 100, 0,
+ 0, 50, 96, 241, 4, 48, 93, 232, 7, 45, 93, 223, 6, 43, 98, 211, 5, 45, 100, 198, 2, 49, 100, 184, 0, 54, 102, 168,
+ 0, 58, 102, 153, 0, 61, 102, 139, 0, 58, 100, 121, 0, 65, 96, 100, 0, 59, 98, 84, 0, 61, 100, 58, 0, 61, 97, 30,
+ 0, 68, 93, 3, 0, 75, 89, 0, 0, 71, 88, 0, 0, 54, 79, 244, 0, 53, 75, 238, 0, 51, 77, 231, 2, 45, 82, 219,
+ 0, 45, 84, 209, 0, 47, 86, 194, 0, 52, 86, 177, 0, 54, 86, 157, 0, 60, 86, 140, 0, 60, 86, 123, 0, 64, 80, 99,
+ 0, 62, 80, 84, 0, 60, 82, 68, 0, 61, 82, 45, 0, 66, 78, 9, 0, 72, 73, 0, 0, 68, 73, 0, 0, 54, 57, 245,
+ 4, 52, 51, 234, 8, 50, 47, 225, 8, 45, 47, 219, 4, 45, 50, 213, 0, 50, 59, 202, 0, 53, 62, 189, 0, 49, 68, 171,
+ 0, 53, 68, 149, 0, 57, 68, 130, 0, 61, 67, 102, 0, 61, 65, 82, 0, 59, 65, 68, 0, 60, 64, 43, 0, 67, 59, 9,
+ 0, 70, 55, 0, 0, 67, 53, 0, 0, 56, 37, 246, 0, 62, 36, 238, 0, 62, 36, 233, 0, 59, 35, 226, 0, 55, 33, 218,
+ 0, 52, 34, 206, 6, 51, 35, 188, 17, 48, 39, 161, 9, 50, 44, 151, 1, 57, 47, 140, 0, 61, 49, 113, 0, 60, 47, 86,
+ 0, 61, 46, 69, 0, 63, 45, 58, 0, 66, 41, 10, 0, 67, 38, 0, 0, 66, 35, 0, 0, 72, 25, 246, 0, 74, 22, 238,
+ 0, 74, 22, 233, 0, 73, 22, 226, 0, 71, 23, 217, 0, 69, 23, 206, 0, 68, 24, 194, 0, 68, 26, 182, 0, 70, 26, 164,
+ 0, 72, 26, 146, 0, 71, 27, 125, 0, 66, 28, 94, 0, 62, 31, 71, 0, 65, 31, 52, 0, 67, 29, 25, 0, 66, 26, 1,
+ 0, 62, 26, 0, 0, 84, 14, 245, 0, 86, 10, 239, 0, 86, 9, 234, 0, 84, 9, 227, 0, 82, 9, 217, 0, 80, 10, 205,
+ 0, 79, 10, 193, 0, 77, 10, 179, 0, 77, 11, 161, 0, 75, 11, 144, 0, 75, 10, 126, 0, 74, 10, 104, 0, 69, 14, 78,
+ 0, 68, 13, 54, 0, 72, 13, 30, 0, 71, 13, 6, 0, 60, 14, 0, 0, 91, 0, 238, 0, 92, 0, 238, 0, 91, 0, 236,
+ 0, 90, 0, 227, 0, 87, 0, 216, 0, 84, 0, 202, 0, 80, 0, 188, 0, 76, 0, 167, 0, 71, 0, 145, 0, 70, 0, 130,
+ 0, 69, 0, 112, 0, 69, 0, 99, 0, 68, 0, 84, 0, 66, 0, 67, 0, 66, 0, 45, 0, 65, 0, 23, 0, 61, 0, 0,
+ 8, 3, 218, 224, 8, 3, 218, 219, 8, 2, 220, 213, 7, 1, 222, 204, 7, 0, 224, 195, 6, 0, 224, 184, 6, 0, 226, 164,
+ 7, 0, 227, 145, 7, 0, 229, 116, 7, 1, 230, 87, 8, 1, 231, 62, 8, 2, 232, 37, 8, 4, 234, 17, 9, 9, 233, 6,
+ 5, 13, 233, 3, 2, 40, 222, 0, 0, 70, 214, 0, 6, 5, 213, 228, 6, 8, 209, 221, 6, 6, 209, 213, 5, 4, 213, 202,
+ 4, 3, 213, 192, 4, 3, 213, 180, 4, 3, 213, 163, 4, 2, 213, 145, 5, 2, 213, 116, 6, 3, 213, 90, 6, 4, 212, 68,
+ 6, 6, 211, 46, 5, 8, 209, 30, 5, 10, 208, 17, 3, 17, 207, 5, 0, 41, 204, 0, 0, 63, 205, 0, 3, 10, 204, 230,
+ 5, 10, 201, 224, 5, 9, 201, 213, 5, 6, 202, 202, 4, 5, 202, 192, 4, 4, 201, 180, 4, 4, 201, 164, 4, 4, 201, 147,
+ 4, 4, 201, 122, 5, 4, 200, 94, 5, 5, 199, 71, 5, 7, 198, 45, 4, 9, 198, 26, 3, 14, 198, 9, 1, 25, 195, 1,
+ 0, 41, 194, 0, 0, 56, 196, 0, 3, 9, 195, 233, 4, 10, 193, 226, 5, 12, 192, 216, 5, 10, 192, 204, 3, 7, 192, 193,
+ 3, 5, 191, 181, 3, 5, 191, 165, 3, 4, 190, 149, 4, 4, 191, 126, 5, 5, 190, 97, 5, 7, 190, 70, 5, 9, 189, 45,
+ 4, 11, 189, 23, 2, 16, 189, 9, 0, 30, 186, 0, 0, 45, 182, 0, 0, 54, 188, 0, 1, 16, 184, 236, 4, 16, 184, 228,
+ 5, 14, 182, 219, 4, 11, 184, 207, 3, 9, 184, 194, 3, 8, 182, 184, 3, 8, 181, 167, 3, 8, 181, 151, 4, 7, 181, 130,
+ 5, 7, 181, 100, 6, 9, 180, 73, 5, 10, 179, 46, 3, 13, 180, 25, 2, 17, 178, 9, 0, 33, 173, 0, 0, 48, 170, 0,
+ 0, 54, 176, 0, 2, 18, 172, 237, 3, 17, 171, 230, 4, 16, 170, 221, 4, 13, 171, 211, 3, 11, 172, 198, 3, 13, 170, 189,
+ 3, 14, 167, 175, 3, 11, 168, 159, 4, 9, 170, 134, 6, 9, 170, 104, 5, 9, 167, 76, 3, 14, 167, 52, 2, 17, 168, 30,
+ 0, 21, 167, 10, 0, 36, 161, 0, 0, 51, 156, 0, 0, 54, 162, 0, 1, 22, 159, 238, 2, 19, 157, 230, 4, 17, 157, 221,
+ 4, 15, 157, 211, 3, 13, 158, 199, 3, 17, 156, 188, 2, 23, 152, 170, 2, 17, 156, 158, 2, 14, 158, 138, 2, 14, 159, 113,
+ 0, 17, 159, 87, 0, 18, 158, 60, 1, 20, 157, 33, 0, 25, 156, 11, 0, 39, 150, 0, 0, 55, 143, 0, 0, 55, 148, 0,
+ 1, 25, 147, 238, 4, 21, 144, 226, 5, 20, 142, 215, 4, 19, 143, 207, 3, 19, 144, 197, 3, 21, 142, 184, 3, 25, 141, 167,
+ 2, 25, 143, 155, 1, 22, 145, 142, 1, 19, 146, 126, 1, 19, 146, 91, 0, 21, 146, 65, 0, 25, 147, 37, 0, 27, 145, 12,
+ 0, 41, 139, 0, 0, 56, 131, 0, 0, 54, 133, 0, 1, 28, 134, 238, 3, 26, 132, 222, 2, 26, 129, 206, 2, 28, 130, 201,
+ 3, 30, 131, 193, 3, 32, 132, 182, 1, 34, 134, 170, 0, 36, 132, 153, 0, 36, 131, 140, 0, 29, 134, 126, 0, 26, 135, 100,
+ 0, 27, 134, 75, 0, 28, 134, 43, 0, 30, 133, 15, 0, 41, 126, 0, 0, 55, 116, 0, 0, 51, 115, 0, 0, 31, 118, 239,
+ 2, 27, 118, 225, 3, 28, 118, 213, 2, 28, 118, 201, 2, 32, 118, 191, 1, 36, 119, 181, 0, 37, 120, 168, 0, 40, 121, 153,
+ 0, 40, 118, 139, 0, 36, 116, 123, 0, 33, 119, 106, 0, 30, 119, 86, 0, 30, 119, 49, 0, 33, 118, 18, 0, 41, 110, 1,
+ 0, 54, 104, 0, 0, 50, 102, 0, 0, 35, 102, 240, 1, 34, 100, 232, 1, 33, 102, 225, 0, 30, 104, 209, 0, 34, 104, 193,
+ 0, 37, 106, 184, 0, 38, 105, 170, 0, 40, 106, 155, 0, 41, 108, 141, 0, 41, 100, 121, 0, 40, 100, 104, 0, 36, 102, 84,
+ 0, 33, 102, 55, 0, 36, 104, 26, 0, 41, 98, 2, 0, 53, 91, 0, 0, 48, 91, 0, 0, 36, 84, 243, 0, 37, 84, 237,
+ 0, 36, 84, 230, 0, 31, 90, 215, 0, 31, 91, 201, 0, 33, 91, 190, 0, 35, 90, 176, 0, 36, 91, 156, 0, 39, 88, 139,
+ 0, 42, 87, 122, 0, 42, 86, 102, 0, 45, 80, 82, 0, 40, 84, 65, 0, 39, 86, 45, 0, 43, 82, 13, 0, 52, 77, 0,
+ 0, 47, 77, 0, 0, 38, 67, 244, 0, 38, 64, 238, 0, 36, 63, 232, 0, 35, 64, 223, 0, 34, 66, 212, 0, 36, 70, 200,
+ 0, 36, 72, 187, 0, 35, 75, 164, 0, 37, 74, 140, 0, 40, 71, 122, 0, 42, 70, 102, 0, 46, 64, 77, 0, 46, 63, 62,
+ 0, 44, 67, 49, 0, 45, 65, 20, 0, 49, 61, 1, 0, 45, 61, 0, 0, 37, 45, 245, 5, 37, 38, 233, 5, 34, 36, 228,
+ 7, 32, 35, 220, 3, 29, 36, 214, 0, 30, 40, 205, 0, 35, 47, 191, 0, 30, 53, 175, 0, 35, 55, 153, 0, 36, 53, 136,
+ 0, 38, 52, 110, 0, 43, 49, 84, 0, 45, 48, 64, 0, 44, 49, 53, 0, 47, 47, 23, 0, 46, 42, 1, 0, 45, 40, 0,
+ 0, 39, 26, 247, 0, 43, 21, 239, 0, 41, 19, 234, 0, 38, 17, 227, 0, 35, 17, 219, 0, 32, 17, 207, 1, 34, 19, 195,
+ 2, 36, 22, 180, 0, 40, 26, 164, 0, 44, 28, 145, 0, 45, 29, 125, 0, 45, 30, 93, 0, 45, 31, 68, 0, 47, 33, 54,
+ 0, 44, 30, 41, 0, 46, 24, 0, 0, 45, 22, 0, 0, 56, 14, 246, 0, 58, 11, 239, 0, 57, 9, 234, 0, 55, 9, 227,
+ 0, 53, 9, 218, 0, 51, 10, 207, 0, 51, 10, 196, 0, 50, 11, 184, 0, 51, 12, 165, 0, 49, 13, 148, 0, 49, 12, 129,
+ 0, 49, 12, 104, 0, 45, 14, 76, 0, 47, 15, 56, 0, 52, 11, 32, 0, 49, 13, 0, 0, 40, 15, 0, 0, 66, 0, 238,
+ 0, 65, 0, 236, 0, 63, 0, 232, 0, 62, 0, 226, 0, 60, 0, 217, 0, 58, 0, 206, 0, 57, 0, 193, 0, 54, 0, 177,
+ 0, 50, 0, 154, 0, 49, 0, 138, 0, 49, 0, 119, 0, 48, 0, 100, 0, 48, 0, 84, 0, 46, 0, 65, 0, 45, 0, 45,
+ 0, 45, 0, 25, 0, 44, 0, 0, 3, 0, 222, 230, 3, 0, 222, 225, 3, 0, 222, 218, 3, 0, 224, 208, 3, 0, 225, 200,
+ 3, 0, 225, 189, 2, 0, 227, 175, 3, 0, 228, 157, 3, 0, 229, 136, 3, 0, 230, 106, 3, 0, 232, 80, 3, 0, 233, 56,
+ 3, 0, 234, 34, 3, 1, 236, 17, 4, 3, 236, 6, 2, 4, 236, 0, 0, 34, 224, 0, 2, 0, 217, 233, 2, 0, 213, 225,
+ 2, 0, 213, 217, 1, 0, 215, 205, 1, 0, 215, 196, 0, 0, 215, 186, 0, 0, 215, 171, 0, 0, 215, 154, 1, 0, 215, 134,
+ 1, 0, 215, 106, 2, 0, 215, 82, 2, 1, 215, 61, 2, 2, 214, 43, 2, 3, 213, 28, 2, 5, 212, 17, 1, 11, 212, 3,
+ 0, 25, 214, 0, 0, 2, 207, 234, 1, 3, 204, 227, 1, 2, 203, 216, 0, 0, 204, 204, 0, 0, 204, 195, 0, 0, 203, 184,
+ 0, 0, 203, 171, 0, 0, 203, 154, 0, 0, 202, 137, 0, 0, 202, 110, 1, 1, 201, 89, 1, 1, 201, 68, 1, 1, 201, 47,
+ 1, 2, 200, 30, 2, 5, 199, 18, 1, 13, 198, 4, 0, 17, 203, 0, 0, 4, 197, 236, 1, 4, 195, 229, 1, 3, 194, 218,
+ 0, 1, 193, 204, 0, 1, 193, 194, 0, 0, 192, 184, 0, 0, 191, 171, 0, 0, 191, 155, 0, 0, 191, 140, 0, 0, 192, 114,
+ 0, 0, 192, 89, 1, 1, 192, 66, 1, 1, 191, 45, 0, 2, 190, 27, 1, 6, 189, 14, 1, 17, 187, 3, 0, 17, 194, 0,
+ 0, 8, 187, 236, 1, 8, 186, 230, 1, 6, 186, 219, 1, 2, 184, 206, 0, 1, 184, 194, 0, 0, 184, 184, 0, 0, 182, 171,
+ 0, 0, 182, 155, 0, 0, 182, 140, 0, 0, 184, 115, 0, 0, 184, 91, 0, 1, 182, 65, 1, 2, 181, 42, 0, 3, 180, 24,
+ 1, 7, 179, 10, 0, 22, 175, 3, 0, 17, 182, 0, 0, 10, 176, 237, 1, 9, 175, 231, 1, 7, 175, 221, 1, 4, 175, 209,
+ 0, 2, 173, 197, 0, 3, 171, 189, 0, 2, 170, 176, 0, 1, 170, 162, 0, 0, 171, 141, 0, 0, 172, 119, 0, 1, 172, 94,
+ 0, 1, 171, 68, 0, 3, 170, 41, 0, 3, 167, 20, 0, 9, 166, 7, 0, 26, 159, 3, 0, 18, 167, 0, 0, 11, 162, 238,
+ 1, 9, 162, 231, 2, 9, 161, 222, 1, 6, 162, 211, 0, 3, 162, 200, 0, 4, 159, 189, 0, 5, 158, 176, 0, 2, 159, 161,
+ 0, 1, 159, 141, 0, 1, 159, 125, 0, 1, 159, 99, 0, 2, 159, 73, 0, 5, 158, 44, 0, 6, 156, 19, 0, 13, 153, 4,
+ 0, 30, 148, 2, 0, 21, 152, 0, 0, 14, 151, 238, 0, 11, 151, 230, 0, 10, 150, 222, 0, 8, 150, 212, 0, 7, 149, 201,
+ 0, 7, 149, 189, 0, 8, 148, 176, 0, 8, 147, 159, 0, 7, 147, 145, 0, 5, 148, 133, 0, 5, 148, 104, 0, 5, 147, 77,
+ 0, 6, 146, 47, 0, 8, 145, 20, 0, 16, 142, 4, 0, 31, 136, 1, 0, 24, 138, 0, 0, 16, 139, 238, 0, 13, 138, 227,
+ 0, 11, 137, 218, 0, 9, 137, 209, 0, 9, 137, 199, 0, 10, 137, 189, 0, 10, 137, 175, 0, 10, 134, 156, 0, 16, 132, 140,
+ 0, 9, 135, 127, 0, 7, 137, 104, 0, 7, 134, 80, 0, 8, 134, 51, 0, 9, 133, 23, 0, 17, 131, 4, 0, 31, 121, 1,
+ 0, 25, 121, 0, 0, 17, 123, 239, 0, 15, 125, 230, 0, 13, 125, 220, 0, 11, 125, 209, 0, 12, 123, 198, 0, 14, 123, 187,
+ 0, 17, 123, 171, 0, 18, 125, 155, 0, 18, 119, 139, 0, 16, 119, 122, 0, 13, 121, 108, 0, 10, 120, 91, 0, 9, 119, 57,
+ 0, 11, 119, 26, 0, 17, 116, 5, 0, 30, 107, 1, 0, 25, 107, 0, 0, 18, 106, 240, 0, 17, 105, 234, 0, 16, 106, 226,
+ 0, 12, 108, 212, 0, 14, 108, 197, 0, 17, 107, 184, 0, 21, 107, 166, 0, 23, 107, 153, 0, 18, 105, 140, 0, 22, 104, 120,
+ 0, 22, 102, 104, 0, 16, 105, 89, 0, 12, 104, 60, 0, 12, 105, 31, 0, 17, 104, 6, 0, 30, 95, 0, 0, 25, 95, 0,
+ 0, 19, 90, 241, 0, 20, 89, 236, 0, 18, 90, 228, 0, 13, 93, 215, 0, 13, 93, 202, 0, 15, 93, 189, 0, 17, 93, 176,
+ 0, 20, 93, 157, 0, 19, 90, 140, 0, 22, 91, 123, 0, 24, 89, 102, 0, 20, 89, 84, 0, 17, 89, 65, 0, 13, 90, 42,
+ 0, 18, 91, 10, 0, 29, 82, 0, 0, 25, 82, 0, 0, 20, 74, 243, 0, 21, 71, 237, 0, 20, 71, 230, 0, 18, 73, 222,
+ 0, 17, 75, 211, 0, 17, 76, 199, 0, 17, 76, 186, 0, 17, 78, 162, 0, 18, 75, 140, 0, 22, 75, 123, 0, 24, 75, 104,
+ 0, 26, 72, 82, 0, 29, 68, 56, 0, 23, 71, 45, 0, 25, 75, 23, 0, 26, 68, 2, 0, 24, 67, 0, 0, 21, 53, 244,
+ 0, 21, 49, 238, 0, 19, 49, 232, 0, 18, 49, 225, 0, 17, 50, 215, 0, 17, 52, 203, 0, 17, 55, 190, 0, 15, 60, 170,
+ 0, 16, 60, 149, 0, 17, 60, 131, 0, 20, 58, 106, 0, 24, 56, 86, 0, 32, 49, 60, 0, 26, 51, 45, 0, 24, 56, 28,
+ 0, 22, 54, 5, 0, 23, 47, 0, 0, 20, 32, 245, 2, 20, 26, 238, 2, 19, 25, 231, 1, 17, 25, 225, 0, 14, 26, 218,
+ 0, 12, 26, 207, 0, 13, 26, 195, 0, 16, 30, 179, 0, 19, 34, 157, 0, 15, 37, 140, 0, 17, 36, 116, 0, 20, 36, 93,
+ 0, 24, 34, 64, 0, 27, 34, 43, 0, 23, 37, 22, 0, 23, 32, 0, 0, 23, 28, 0, 0, 21, 15, 244, 0, 24, 11, 238,
+ 0, 23, 9, 231, 0, 22, 9, 224, 1, 19, 9, 215, 1, 18, 9, 204, 1, 18, 9, 193, 0, 19, 9, 181, 0, 22, 13, 164,
+ 0, 17, 17, 148, 0, 18, 17, 129, 0, 22, 17, 105, 0, 24, 17, 76, 0, 27, 17, 52, 0, 26, 14, 23, 0, 20, 14, 19,
+ 0, 22, 11, 0, 0, 34, 0, 236, 0, 32, 0, 234, 0, 30, 0, 230, 0, 28, 0, 225, 0, 26, 0, 217, 0, 25, 0, 206,
+ 0, 25, 0, 195, 0, 25, 0, 184, 0, 25, 0, 165, 0, 25, 0, 148, 0, 25, 0, 129, 0, 26, 0, 108, 0, 26, 0, 87,
+ 0, 25, 0, 63, 0, 24, 0, 40, 0, 22, 0, 23, 0, 21, 0, 0, 0, 0, 224, 233, 0, 0, 224, 229, 0, 0, 225, 224,
+ 0, 0, 226, 215, 0, 0, 225, 205, 0, 0, 226, 195, 0, 0, 227, 184, 0, 0, 227, 168, 0, 0, 228, 151, 0, 0, 229, 127,
+ 0, 0, 231, 100, 0, 0, 232, 76, 0, 0, 233, 54, 0, 0, 236, 34, 0, 0, 236, 17, 0, 0, 237, 7, 0, 0, 238, 0,
+ 0, 0, 217, 233, 0, 0, 216, 224, 0, 0, 217, 218, 0, 0, 217, 208, 0, 0, 217, 200, 0, 0, 216, 192, 0, 0, 217, 181,
+ 0, 0, 217, 167, 0, 0, 217, 151, 0, 0, 218, 129, 0, 0, 219, 104, 0, 0, 220, 84, 0, 0, 220, 66, 0, 0, 220, 50,
+ 0, 0, 220, 37, 0, 0, 221, 26, 0, 0, 221, 0, 0, 0, 207, 233, 0, 0, 207, 225, 0, 0, 206, 213, 0, 0, 206, 204,
+ 0, 0, 206, 196, 0, 0, 205, 189, 0, 0, 205, 180, 0, 0, 205, 165, 0, 0, 205, 151, 0, 0, 205, 131, 0, 0, 206, 108,
+ 0, 0, 206, 91, 0, 0, 206, 75, 0, 0, 206, 62, 0, 0, 205, 50, 0, 0, 205, 38, 0, 0, 206, 0, 0, 0, 197, 233,
+ 0, 0, 199, 227, 0, 0, 197, 216, 0, 0, 195, 201, 0, 0, 194, 193, 0, 0, 194, 187, 0, 0, 193, 177, 0, 0, 193, 164,
+ 0, 0, 193, 150, 0, 0, 194, 132, 0, 0, 195, 109, 0, 0, 195, 92, 0, 0, 195, 75, 0, 0, 195, 60, 0, 0, 195, 48,
+ 0, 0, 195, 36, 0, 0, 194, 0, 0, 0, 188, 233, 0, 0, 189, 229, 0, 0, 189, 219, 0, 0, 187, 204, 0, 0, 184, 191,
+ 0, 0, 184, 182, 0, 0, 184, 173, 0, 0, 184, 161, 0, 0, 184, 148, 0, 0, 184, 133, 0, 0, 186, 112, 0, 0, 186, 91,
+ 0, 0, 186, 71, 0, 0, 186, 54, 0, 0, 186, 43, 0, 0, 184, 33, 0, 0, 182, 0, 0, 0, 176, 233, 0, 0, 178, 230,
+ 0, 0, 178, 221, 0, 0, 177, 207, 0, 0, 175, 194, 0, 0, 173, 181, 0, 0, 173, 171, 0, 0, 172, 159, 0, 0, 172, 148,
+ 0, 0, 172, 135, 0, 0, 173, 114, 0, 0, 175, 93, 0, 0, 173, 70, 0, 0, 172, 50, 0, 0, 172, 38, 0, 0, 171, 28,
+ 0, 0, 167, 0, 0, 0, 163, 233, 0, 0, 166, 231, 0, 0, 166, 222, 0, 0, 165, 209, 0, 0, 164, 197, 0, 0, 163, 184,
+ 0, 0, 162, 170, 0, 0, 162, 158, 0, 0, 161, 149, 0, 0, 159, 137, 0, 0, 159, 118, 0, 0, 161, 97, 0, 0, 159, 72,
+ 0, 0, 158, 47, 0, 0, 157, 33, 0, 0, 156, 22, 0, 0, 153, 0, 0, 0, 151, 233, 0, 0, 153, 232, 0, 0, 154, 224,
+ 0, 0, 154, 212, 0, 0, 153, 199, 0, 0, 153, 189, 0, 0, 153, 175, 0, 0, 151, 157, 0, 0, 151, 149, 0, 0, 149, 137,
+ 0, 0, 147, 118, 0, 0, 147, 96, 0, 0, 145, 74, 0, 0, 144, 47, 0, 0, 143, 29, 0, 0, 141, 17, 0, 0, 140, 0,
+ 0, 0, 140, 233, 0, 0, 140, 230, 0, 0, 141, 224, 0, 0, 142, 215, 0, 0, 142, 201, 0, 0, 141, 189, 0, 0, 141, 176,
+ 0, 0, 141, 159, 0, 0, 139, 141, 0, 0, 138, 132, 0, 0, 136, 115, 0, 0, 133, 96, 0, 0, 130, 74, 0, 0, 129, 49,
+ 0, 0, 127, 29, 0, 0, 126, 14, 0, 0, 125, 0, 0, 0, 125, 233, 0, 0, 125, 229, 0, 0, 126, 225, 0, 0, 129, 216,
+ 0, 0, 130, 202, 0, 0, 127, 189, 0, 0, 123, 168, 0, 0, 121, 151, 0, 0, 122, 137, 0, 0, 127, 126, 0, 0, 123, 112,
+ 0, 0, 122, 99, 0, 0, 118, 75, 0, 0, 115, 51, 0, 0, 114, 30, 0, 0, 113, 13, 0, 0, 110, 0, 0, 0, 106, 233,
+ 0, 0, 106, 228, 0, 0, 108, 224, 0, 0, 110, 216, 0, 0, 112, 202, 0, 0, 109, 184, 0, 0, 100, 151, 0, 0, 100, 141,
+ 0, 0, 108, 137, 0, 0, 104, 114, 0, 0, 100, 96, 0, 0, 106, 93, 0, 0, 104, 74, 0, 0, 102, 51, 0, 0, 102, 29,
+ 0, 0, 100, 12, 0, 0, 100, 0, 0, 0, 90, 233, 0, 0, 90, 229, 0, 0, 92, 224, 0, 0, 93, 216, 0, 0, 97, 205,
+ 0, 0, 97, 189, 0, 0, 95, 170, 0, 0, 94, 151, 0, 0, 93, 134, 0, 0, 93, 120, 0, 0, 87, 95, 0, 0, 89, 82,
+ 0, 0, 91, 74, 0, 0, 90, 55, 0, 0, 89, 30, 0, 0, 88, 12, 0, 0, 87, 0, 0, 0, 73, 233, 0, 0, 73, 230,
+ 0, 0, 74, 225, 0, 0, 76, 218, 0, 0, 80, 208, 0, 0, 80, 195, 0, 0, 82, 180, 0, 0, 82, 158, 0, 0, 80, 138,
+ 0, 0, 78, 119, 0, 0, 75, 99, 0, 0, 69, 75, 0, 0, 69, 61, 0, 0, 75, 50, 0, 0, 75, 29, 0, 0, 75, 13,
+ 0, 0, 74, 0, 0, 0, 53, 233, 0, 0, 54, 231, 0, 0, 55, 227, 0, 0, 58, 222, 0, 0, 60, 214, 0, 0, 62, 201,
+ 0, 0, 62, 187, 0, 0, 64, 164, 0, 0, 63, 144, 0, 0, 64, 126, 0, 0, 57, 98, 0, 0, 57, 80, 0, 0, 50, 55,
+ 0, 0, 54, 43, 0, 0, 57, 31, 0, 0, 57, 18, 0, 0, 56, 0, 0, 0, 34, 233, 0, 0, 34, 232, 0, 0, 35, 228,
+ 0, 0, 36, 223, 0, 0, 37, 215, 0, 0, 39, 204, 0, 0, 39, 191, 0, 0, 40, 173, 0, 0, 41, 153, 0, 0, 44, 129,
+ 0, 0, 43, 107, 0, 0, 39, 86, 0, 0, 36, 61, 0, 0, 31, 38, 0, 0, 35, 24, 0, 0, 38, 17, 0, 0, 37, 0,
+ 0, 0, 16, 233, 0, 0, 16, 232, 0, 0, 16, 229, 0, 0, 17, 224, 0, 0, 18, 216, 0, 0, 19, 204, 0, 0, 19, 191,
+ 0, 0, 18, 175, 0, 0, 19, 154, 0, 0, 21, 129, 0, 0, 20, 109, 0, 0, 19, 93, 0, 0, 19, 75, 0, 0, 18, 49,
+ 0, 0, 18, 23, 0, 0, 17, 11, 0, 0, 18, 0, 0, 0, 0, 234, 0, 0, 0, 230, 0, 0, 0, 226, 0, 0, 0, 221,
+ 0, 0, 0, 213, 0, 0, 0, 202, 0, 0, 0, 192, 0, 0, 0, 179, 0, 0, 0, 163, 0, 0, 0, 147, 0, 0, 0, 130,
+ 0, 0, 0, 106, 0, 0, 0, 84, 0, 0, 0, 56, 0, 0, 0, 29, 0, 0, 0, 14, 0, 0, 0, 0
+};
+
+APDK_END_NAMESPACE
+
+#endif
+
diff --git a/prnt/hpijs/dj540.cpp b/prnt/hpijs/dj540.cpp
new file mode 100644
index 0000000..cb8dd5c
--- /dev/null
+++ b/prnt/hpijs/dj540.cpp
@@ -0,0 +1,190 @@
+/*****************************************************************************\
+ dj540.cpp : Implimentation for the DJ540 class
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#ifdef APDK_DJ540
+
+#include "header.h"
+#include "dj6xx.h"
+#include "dj600.h"
+#include "dj540.h"
+#include "printerproxy.h"
+
+APDK_BEGIN_NAMESPACE
+
+extern uint32_t ulMapDJ600_CCM_K[ 9 * 9 * 9 ];
+extern uint32_t ulMapDJ600_CCM_CMY[ 9 * 9 * 9 ];
+//
+// ** DJ540:Printer CLASS **
+//
+DJ540::DJ540(SystemServices* pSS, BOOL proto)
+ : DJ6XX(pSS,NUM_DJ6XX_FONTS,proto)
+{
+
+ if ((!proto) && (IOMode.bDevID))
+ {
+ constructor_error = VerifyPenInfo();
+ CERRCHECK;
+ }
+ else
+ {
+ ePen = COLOR_PEN; // matches default mode
+ }
+
+ CMYMap = ulMapDJ600_CCM_CMY;
+ pMode[DEFAULTMODE_INDEX] = new Mode600();
+ pMode[GRAYMODE_INDEX] = new GrayMode(ulMapDJ600_CCM_K);
+#ifdef APDK_EXTENDED_MEDIASIZE
+ pMode[SPECIALMODE_INDEX] = new Mode600DraftGrayK();
+ pMode[SPECIALMODE_INDEX+1] = new Mode600DraftColor();
+ ModeCount = 4;
+#else
+ ModeCount = 2;
+#endif
+
+DBG1("DeskJet 540 created\n");
+}
+
+PEN_TYPE DJ540::DefaultPenSet()
+{
+ return COLOR_PEN;
+}
+
+Header540::Header540(Printer* p,PrintContext* pc)
+ : Header(p,pc)
+{ }
+
+DRIVER_ERROR Header540::Send()
+// Sends 540-style header to printer.
+// Identical to 600 Send except StartSend() has been removed.
+// Removed ConfigureRasterData() to be downword compatable with 400 (uni-di only). des
+{ DRIVER_ERROR err;
+
+ // modes & margins are specified in StartSend - which the 540 doesn't call
+ err=Modes(); // Set media source, type, size and quality modes.
+ ERRCHECK;
+
+ err=Margins(); // set margins
+ ERRCHECK;
+
+ err=Simple(); // set color mode and resolution
+ ERRCHECK;
+
+ err=Graphics(); // start raster graphics and set compression mode
+
+return err;
+}
+
+Header* DJ540::SelectHeader(PrintContext* pc)
+{
+ return new Header540(this,pc);
+}
+
+DRIVER_ERROR DJ540::VerifyPenInfo()
+// note: this function is identical to 600::VerifyPenInfo
+{
+ DRIVER_ERROR err = NO_ERROR;
+
+ if(IOMode.bDevID == FALSE)
+ return err;
+
+ err = ParsePenInfo(ePen);
+ ERRCHECK;
+
+ if(ePen == BLACK_PEN || ePen == COLOR_PEN)
+ // pen was recognized
+ {
+ return NO_ERROR;
+ }
+
+ // BLACK_PEN and COLOR_PEN are the only valid pens, so loop and
+ // display error message until user cancels or a valid pen installed
+ while(ePen != BLACK_PEN && ePen != COLOR_PEN)
+ {
+ pSS->DisplayPrinterStatus(DISPLAY_NO_PEN_DJ600);
+
+ if(pSS->BusyWait(500) == JOB_CANCELED)
+ {
+ return JOB_CANCELED;
+ }
+
+ err = ParsePenInfo(ePen);
+ ERRCHECK;
+ }
+
+ pSS->DisplayPrinterStatus(DISPLAY_PRINTING);
+
+ // The 600/?540? will report OFFLINE for a while after the
+ // pen has been installed. Let's wait for it to
+ // come online and not confuse the user with a potentially
+ // bogus OFFLINE message
+
+ if (pSS->BusyWait((DWORD)1000) == JOB_CANCELED)
+ return JOB_CANCELED;
+
+ return NO_ERROR;
+
+}
+
+
+DRIVER_ERROR DJ540::ParsePenInfo(PEN_TYPE& ePen, BOOL QueryPrinter)
+{
+ char* c;
+ DRIVER_ERROR err = SetPenInfo(c, QueryPrinter);
+ ERRCHECK;
+
+ if (*c != '$')
+ {
+ return BAD_DEVICE_ID;
+ }
+
+ c++; // skip $
+
+ // parse penID
+
+ if(c[0] == 'D') // D = kukla color pen
+ {
+ ePen = COLOR_PEN;
+ }
+ else if(c[0] == 'E') // E = triad black pen
+ {
+ ePen = BLACK_PEN;
+ }
+ else
+ {
+ ePen = NO_PEN;
+ }
+
+ return NO_ERROR;
+}
+
+APDK_END_NAMESPACE
+
+#endif //APDK_DJ540
diff --git a/prnt/hpijs/dj540.h b/prnt/hpijs/dj540.h
new file mode 100644
index 0000000..13d4a38
--- /dev/null
+++ b/prnt/hpijs/dj540.h
@@ -0,0 +1,74 @@
+/*****************************************************************************\
+ dj540.h : Interface for the DJ540 class
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#ifndef APDK_DJ540_H
+#define APDK_DJ540_H
+
+APDK_BEGIN_NAMESPACE
+
+/*!
+\internal
+*/
+class DJ540 : public DJ6XX
+{
+public:
+ DJ540(SystemServices* pSS, BOOL proto=FALSE);
+
+ Header* SelectHeader(PrintContext* pc);
+ DRIVER_ERROR VerifyPenInfo();
+ virtual DRIVER_ERROR ParsePenInfo(PEN_TYPE& ePen, BOOL QueryPrinter=TRUE);
+ virtual PEN_TYPE DefaultPenSet();
+
+}; //DJ540
+
+#ifdef APDK_DJ540
+//! DJ540Proxy
+/*!
+******************************************************************************/
+class DJ540Proxy : public PrinterProxy
+{
+public:
+ DJ540Proxy() : PrinterProxy(
+ "DJ540", // family name
+ "DESKJET 540\0" // DeskJet 540
+#ifdef APDK_MLC_PRINTER
+ "OfficeJet Series 3\0" // OfficeJet Series 300
+#endif
+ ) {m_iPrinterType = eDJ540;}
+ inline Printer* CreatePrinter(SystemServices* pSS) const { return new DJ540(pSS); }
+ inline PRINTER_TYPE GetPrinterType() const { return eDJ540;}
+ inline unsigned int GetModelBit() const { return 0x400000;}
+};
+#endif
+
+APDK_END_NAMESPACE
+
+#endif //APDK_DJ540_H
diff --git a/prnt/hpijs/dj55xx.h b/prnt/hpijs/dj55xx.h
new file mode 100644
index 0000000..3b2b393
--- /dev/null
+++ b/prnt/hpijs/dj55xx.h
@@ -0,0 +1,82 @@
+/*****************************************************************************\
+ dj55xx.h : Interface for the generic VIP printer class
+
+ Copyright (c) 2001 - 2002, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#ifndef APDK_DJ_55XX_H
+#define APDK_DJ_55XX_H
+
+APDK_BEGIN_NAMESPACE
+
+//DJ55xx
+//!
+/*!
+\internal
+******************************************************************************/
+class DJ55xx : public DJGenericVIP
+{
+public:
+ DJ55xx (SystemServices* pSS, BOOL proto = FALSE) : DJGenericVIP (pSS, proto)
+ {
+ }
+ virtual BOOL GetMargins (PAPER_SIZE ps, float *fMargins)
+ {
+ return FALSE;
+ }
+};
+
+#if defined(APDK_DJGENERICVIP) && defined (APDK_DJ9xxVIP)
+//! DJ55xxProxy
+/*!
+******************************************************************************/
+class DJ55xxProxy : public PrinterProxy
+{
+public:
+ DJ55xxProxy() : PrinterProxy(
+ "DJ55xx", // family name
+ "Deskjet 460\0"
+ "Deskjet 470\0"
+ "deskjet 5550\0"
+ "deskjet 5551\0"
+ "OfficeJet 6100\0"
+ "OfficeJet 6150\0"
+ "Officejet H470\0"
+ "PSC 21\0"
+ "PSC 2200\0"
+
+ ) {m_iPrinterType = eDJ55xx;}
+ inline Printer* CreatePrinter(SystemServices* pSS) const { return new DJ55xx(pSS); }
+ inline PRINTER_TYPE GetPrinterType() const { return eDJ55xx;}
+ inline unsigned int GetModelBit() const { return 0x200;}
+};
+#endif
+
+APDK_END_NAMESPACE
+
+#endif // APDK_DJ55xx_H
diff --git a/prnt/hpijs/dj600.cpp b/prnt/hpijs/dj600.cpp
new file mode 100644
index 0000000..2d299b9
--- /dev/null
+++ b/prnt/hpijs/dj600.cpp
@@ -0,0 +1,220 @@
+/*****************************************************************************\
+ dj600.cpp : Implimentation for the DJ600 class
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#ifdef APDK_DJ600
+
+#include "header.h"
+#include "dj6xx.h"
+#include "dj600.h"
+#include "printerproxy.h"
+
+APDK_BEGIN_NAMESPACE
+
+extern uint32_t ulMapDJ600_CCM_K[ 9 * 9 * 9 ];
+extern uint32_t ulMapDJ600_CCM_CMY[ 9 * 9 * 9 ];
+//
+// ** DJ600:Printer CLASS **
+//
+
+Mode600::Mode600()
+: PrintMode( ulMapDJ600_CCM_CMY )
+{
+ dyeCount=3;
+ CompatiblePens[0] = COLOR_PEN; // only color pen allowed
+}
+
+#ifdef APDK_EXTENDED_MEDIASIZE
+Mode600DraftColor::Mode600DraftColor()
+: PrintMode( ulMapDJ600_CCM_CMY )
+{
+ dyeCount=3;
+ CompatiblePens[0] = COLOR_PEN; // only color pen allowed
+ theQuality = qualityDraft;
+ pmQuality = QUALITY_DRAFT;
+}
+
+Mode600DraftGrayK::Mode600DraftGrayK()
+: GrayMode(ulMapDJ600_CCM_K)
+{
+ theQuality = qualityDraft;
+ pmQuality = QUALITY_DRAFT;
+}
+
+Mode600BestGrayK::Mode600BestGrayK()
+: GrayMode(ulMapDJ600_CCM_K)
+{
+ theQuality = qualityPresentation;
+ pmQuality = QUALITY_BEST;
+ BaseResX = 600;
+ ResolutionX[0] = 600;
+#ifdef APDK_HIGH_RES_MODES
+ BaseResY = 600;
+ ResolutionY[0] = 600;
+#else
+ BaseResY = 300;
+ ResolutionY[0] = 300;
+#endif
+}
+#endif // APDK_EXTENDED_MEDIASIZE
+
+DJ600::DJ600(SystemServices* pSS, BOOL proto)
+ : DJ6XX(pSS, NUM_DJ6XX_FONTS,proto)
+{
+ if ((!proto) && (IOMode.bDevID))
+ {
+ constructor_error = VerifyPenInfo();
+ CERRCHECK;
+ }
+ else
+ {
+ ePen=COLOR_PEN; // matches default mode
+ }
+
+ CMYMap = ulMapDJ600_CCM_CMY;
+
+ pMode[DEFAULTMODE_INDEX] = new Mode600();
+ pMode[GRAYMODE_INDEX] = new GrayMode(ulMapDJ600_CCM_K);
+#ifdef APDK_EXTENDED_MEDIASIZE
+ pMode[SPECIALMODE_INDEX] = new Mode600DraftGrayK();
+ pMode[SPECIALMODE_INDEX+1] = new Mode600DraftColor();
+ pMode[SPECIALMODE_INDEX+2] = new Mode600BestGrayK();
+#endif
+
+DBG1("DeskJet 600 created\n");
+}
+
+PEN_TYPE DJ600::DefaultPenSet()
+{
+ return COLOR_PEN;
+}
+
+Header600::Header600(Printer* p,PrintContext* pc)
+ : Header6XX(p,pc)
+{ }
+
+DRIVER_ERROR Header600::Send()
+// Sends 600-style header to printer.
+{ DRIVER_ERROR err;
+
+ StartSend();
+
+ if (dyeCount==3) // color pen
+ {
+ err = ConfigureRasterData();
+ ERRCHECK;
+ }
+ else // black pen
+ {
+ err=Simple(); // set color mode and resolution
+ ERRCHECK;
+ }
+
+ err=Graphics(); // start raster graphics and set compression mode
+
+return err;
+}
+
+Header* DJ600::SelectHeader(PrintContext* pc)
+{
+ return new Header600(this,pc);
+}
+
+DRIVER_ERROR DJ600::VerifyPenInfo()
+{
+ DRIVER_ERROR err=NO_ERROR;
+
+ if(IOMode.bDevID == FALSE)
+ return err;
+
+ err = ParsePenInfo(ePen);
+ ERRCHECK;
+
+ if (ePen == BLACK_PEN || ePen == COLOR_PEN)
+ // pen was recognized
+ {
+ return NO_ERROR;
+ }
+
+ // BLACK_PEN and COLOR_PEN are the only valid pens, so loop and
+ // display error message until user cancels or a valid pen installed
+ while(ePen != BLACK_PEN && ePen != COLOR_PEN)
+ {
+ pSS->DisplayPrinterStatus(DISPLAY_NO_PEN_DJ600);
+
+ if(pSS->BusyWait(500) == JOB_CANCELED)
+ {
+ return JOB_CANCELED;
+ }
+
+ err = ParsePenInfo(ePen);
+ ERRCHECK;
+ }
+
+ pSS->DisplayPrinterStatus(DISPLAY_PRINTING);
+
+ // The 600 will report OFFLINE for a while after the
+ // pen has been installed. Let's wait for it to
+ // come online and not confuse the user with a potentially
+ // bogus OFFLINE message
+
+ if (pSS->BusyWait((DWORD)1000) == JOB_CANCELED)
+ return JOB_CANCELED;
+
+ return NO_ERROR;
+
+}
+
+DRIVER_ERROR DJ600::ParsePenInfo(PEN_TYPE& ePen, BOOL QueryPrinter)
+{
+ char* c;
+ DRIVER_ERROR err = SetPenInfo(c, QueryPrinter);
+ ERRCHECK;
+
+ if (*c != '$')
+ {
+ return BAD_DEVICE_ID;
+ }
+
+ c++; // skip $
+ // parse penID
+
+ if(c[0] == 'R') // (R)obinhood color
+ ePen = COLOR_PEN;
+ else if(c[0] == 'C') // (C)andide black
+ ePen = BLACK_PEN;
+ else ePen = NO_PEN;
+
+ return NO_ERROR;
+}
+
+APDK_END_NAMESPACE
+
+#endif //APDK_DJ600
diff --git a/prnt/hpijs/dj600.h b/prnt/hpijs/dj600.h
new file mode 100644
index 0000000..d505235
--- /dev/null
+++ b/prnt/hpijs/dj600.h
@@ -0,0 +1,100 @@
+/*****************************************************************************\
+ dj600.h : Interface for the DJ600 class
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#ifndef APDK_DJ600_H
+#define APDK_DJ600_H
+
+APDK_BEGIN_NAMESPACE
+
+/*!
+\internal
+*/
+class DJ600 : public DJ6XX
+{
+public:
+ DJ600(SystemServices* pSS, BOOL proto=FALSE);
+
+ Header* SelectHeader(PrintContext* pc) ;
+ DRIVER_ERROR VerifyPenInfo();
+ virtual DRIVER_ERROR ParsePenInfo(PEN_TYPE& ePen, BOOL QueryPrinter=TRUE);
+ virtual PEN_TYPE DefaultPenSet();
+
+}; //DJ600
+
+
+class Mode600 : public PrintMode
+{
+public:
+ Mode600();
+
+}; //Mode600
+
+#ifdef APDK_EXTENDED_MEDIASIZE
+class Mode600DraftGrayK : public GrayMode
+{
+public:
+ Mode600DraftGrayK();
+}; //Mode600DraftGrayK
+
+class Mode600DraftColor : public PrintMode
+{
+public:
+ Mode600DraftColor();
+}; //Mode600DraftColor
+
+class Mode600BestGrayK : public GrayMode
+{
+public:
+ Mode600BestGrayK();
+}; //Mode600BestGrayK
+#endif // APDK_EXTENDED_MEDIASIZE
+#ifdef APDK_DJ600
+//! DJ600Proxy
+/*!
+******************************************************************************/
+class DJ600Proxy : public PrinterProxy
+{
+public:
+ DJ600Proxy() : PrinterProxy(
+ "DJ600", // family name
+ "DESKJET 600\0" // DeskJet 600
+#ifdef APDK_MLC_PRINTER
+#endif
+ ) {m_iPrinterType = eDJ6xx;}
+ inline Printer* CreatePrinter(SystemServices* pSS) const { return new DJ600(pSS); }
+ inline PRINTER_TYPE GetPrinterType() const { return eDJ6xx;}
+ inline unsigned int GetModelBit() const { return 0x200000;}
+};
+#endif
+
+APDK_END_NAMESPACE
+
+#endif //APDK_DJ600_H
diff --git a/prnt/hpijs/dj600_maps.cpp b/prnt/hpijs/dj600_maps.cpp
new file mode 100644
index 0000000..6476bcd
--- /dev/null
+++ b/prnt/hpijs/dj600_maps.cpp
@@ -0,0 +1,209 @@
+/*****************************************************************************\
+ dj600_maps.cpp : Color maps for the DJ600
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+// used by many models so no #ifdef here
+#include "config.h"
+#include "global_types.h"
+
+APDK_BEGIN_NAMESPACE
+
+uint32_t ulMapDJ600_CCM_K[ 9 * 9 * 9 ]=
+// DJ600_CCM_K
+ {
+ 226UL, 137UL, 135UL, 132UL, 128UL, 122UL, 111UL, 98UL, 90UL,
+ 133UL, 133UL, 132UL, 130UL, 125UL, 118UL, 107UL, 96UL, 88UL,
+ 120UL, 120UL, 118UL, 114UL, 109UL, 101UL, 95UL, 88UL, 80UL,
+ 92UL, 92UL, 91UL, 89UL, 87UL, 83UL, 79UL, 73UL, 69UL,
+ 69UL, 69UL, 69UL, 68UL, 67UL, 66UL, 63UL, 61UL, 59UL,
+ 55UL, 55UL, 55UL, 55UL, 54UL, 53UL, 51UL, 49UL, 47UL,
+ 41UL, 41UL, 40UL, 40UL, 39UL, 38UL, 37UL, 35UL, 33UL,
+ 25UL, 25UL, 25UL, 25UL, 24UL, 23UL, 22UL, 21UL, 19UL,
+ 11UL, 11UL, 11UL, 11UL, 11UL, 10UL, 10UL, 10UL, 9UL,
+ 136UL, 136UL, 134UL, 132UL, 127UL, 121UL, 110UL, 98UL, 90UL,
+ 132UL, 132UL, 132UL, 129UL, 124UL, 116UL, 106UL, 95UL, 88UL,
+ 119UL, 118UL, 116UL, 113UL, 107UL, 100UL, 94UL, 88UL, 80UL,
+ 92UL, 91UL, 90UL, 89UL, 87UL, 83UL, 78UL, 73UL, 68UL,
+ 69UL, 69UL, 69UL, 68UL, 67UL, 66UL, 63UL, 61UL, 58UL,
+ 55UL, 55UL, 55UL, 54UL, 54UL, 53UL, 51UL, 49UL, 47UL,
+ 40UL, 40UL, 40UL, 40UL, 39UL, 38UL, 36UL, 35UL, 33UL,
+ 25UL, 25UL, 25UL, 24UL, 23UL, 23UL, 22UL, 21UL, 19UL,
+ 11UL, 11UL, 11UL, 11UL, 10UL, 10UL, 10UL, 10UL, 9UL,
+ 132UL, 132UL, 131UL, 128UL, 124UL, 115UL, 105UL, 95UL, 88UL,
+ 129UL, 129UL, 127UL, 124UL, 120UL, 112UL, 101UL, 94UL, 86UL,
+ 114UL, 113UL, 112UL, 108UL, 103UL, 96UL, 92UL, 86UL, 78UL,
+ 89UL, 89UL, 88UL, 87UL, 84UL, 80UL, 76UL, 72UL, 67UL,
+ 68UL, 68UL, 68UL, 67UL, 66UL, 64UL, 62UL, 60UL, 58UL,
+ 55UL, 55UL, 54UL, 54UL, 53UL, 52UL, 50UL, 48UL, 46UL,
+ 40UL, 40UL, 40UL, 39UL, 39UL, 37UL, 36UL, 34UL, 33UL,
+ 25UL, 25UL, 24UL, 23UL, 23UL, 22UL, 21UL, 20UL, 19UL,
+ 11UL, 11UL, 11UL, 11UL, 10UL, 10UL, 10UL, 10UL, 9UL,
+ 124UL, 124UL, 123UL, 119UL, 113UL, 105UL, 97UL, 90UL, 83UL,
+ 121UL, 120UL, 118UL, 114UL, 109UL, 102UL, 95UL, 88UL, 81UL,
+ 104UL, 103UL, 102UL, 98UL, 95UL, 92UL, 87UL, 80UL, 74UL,
+ 84UL, 84UL, 83UL, 82UL, 80UL, 76UL, 73UL, 69UL, 66UL,
+ 66UL, 66UL, 66UL, 65UL, 64UL, 62UL, 61UL, 59UL, 56UL,
+ 53UL, 53UL, 53UL, 52UL, 52UL, 50UL, 49UL, 47UL, 45UL,
+ 39UL, 39UL, 38UL, 37UL, 37UL, 36UL, 35UL, 33UL, 31UL,
+ 23UL, 23UL, 23UL, 23UL, 22UL, 21UL, 20UL, 19UL, 18UL,
+ 10UL, 10UL, 10UL, 10UL, 10UL, 10UL, 10UL, 9UL, 9UL,
+ 108UL, 107UL, 105UL, 103UL, 98UL, 94UL, 88UL, 83UL, 76UL,
+ 104UL, 104UL, 102UL, 99UL, 95UL, 92UL, 87UL, 81UL, 74UL,
+ 93UL, 93UL, 92UL, 90UL, 88UL, 84UL, 80UL, 74UL, 69UL,
+ 77UL, 77UL, 76UL, 75UL, 73UL, 71UL, 68UL, 66UL, 62UL,
+ 63UL, 63UL, 62UL, 62UL, 61UL, 60UL, 58UL, 56UL, 54UL,
+ 51UL, 50UL, 50UL, 50UL, 49UL, 48UL, 47UL, 45UL, 43UL,
+ 36UL, 36UL, 36UL, 36UL, 35UL, 34UL, 33UL, 31UL, 29UL,
+ 22UL, 22UL, 21UL, 21UL, 21UL, 20UL, 19UL, 18UL, 16UL,
+ 10UL, 10UL, 10UL, 10UL, 10UL, 10UL, 9UL, 9UL, 9UL,
+ 92UL, 92UL, 91UL, 89UL, 87UL, 83UL, 79UL, 73UL, 69UL,
+ 90UL, 89UL, 89UL, 88UL, 85UL, 81UL, 77UL, 72UL, 68UL,
+ 82UL, 82UL, 81UL, 80UL, 77UL, 74UL, 71UL, 68UL, 64UL,
+ 69UL, 69UL, 69UL, 68UL, 67UL, 66UL, 63UL, 61UL, 59UL,
+ 59UL, 59UL, 59UL, 58UL, 57UL, 56UL, 54UL, 53UL, 50UL,
+ 48UL, 48UL, 47UL, 47UL, 46UL, 45UL, 43UL, 41UL, 39UL,
+ 34UL, 34UL, 33UL, 33UL, 32UL, 31UL, 30UL, 28UL, 27UL,
+ 20UL, 20UL, 19UL, 19UL, 19UL, 18UL, 17UL, 16UL, 14UL,
+ 10UL, 9UL, 9UL, 9UL, 9UL, 9UL, 9UL, 9UL, 8UL,
+ 78UL, 78UL, 77UL, 75UL, 73UL, 71UL, 68UL, 66UL, 62UL,
+ 76UL, 76UL, 75UL, 74UL, 73UL, 70UL, 68UL, 65UL, 62UL,
+ 70UL, 70UL, 70UL, 69UL, 68UL, 66UL, 64UL, 62UL, 59UL,
+ 63UL, 63UL, 63UL, 62UL, 61UL, 60UL, 58UL, 56UL, 54UL,
+ 54UL, 54UL, 54UL, 53UL, 53UL, 52UL, 50UL, 48UL, 46UL,
+ 43UL, 43UL, 43UL, 42UL, 41UL, 40UL, 39UL, 37UL, 35UL,
+ 30UL, 30UL, 30UL, 29UL, 29UL, 28UL, 27UL, 25UL, 23UL,
+ 17UL, 17UL, 16UL, 16UL, 16UL, 15UL, 14UL, 13UL, 11UL,
+ 9UL, 9UL, 9UL, 9UL, 9UL, 8UL, 8UL, 7UL, 7UL,
+ 66UL, 66UL, 66UL, 65UL, 64UL, 63UL, 61UL, 59UL, 56UL,
+ 66UL, 66UL, 65UL, 64UL, 63UL, 62UL, 60UL, 58UL, 55UL,
+ 62UL, 62UL, 62UL, 61UL, 60UL, 59UL, 58UL, 55UL, 53UL,
+ 56UL, 56UL, 56UL, 56UL, 55UL, 54UL, 52UL, 50UL, 48UL,
+ 49UL, 49UL, 48UL, 48UL, 47UL, 46UL, 44UL, 43UL, 40UL,
+ 37UL, 37UL, 37UL, 37UL, 36UL, 35UL, 34UL, 33UL, 30UL,
+ 26UL, 26UL, 25UL, 25UL, 25UL, 23UL, 22UL, 21UL, 20UL,
+ 13UL, 13UL, 13UL, 12UL, 12UL, 11UL, 11UL, 11UL, 10UL,
+ 7UL, 7UL, 7UL, 7UL, 7UL, 7UL, 7UL, 7UL, 6UL,
+ 58UL, 58UL, 58UL, 57UL, 56UL, 55UL, 53UL, 52UL, 49UL,
+ 58UL, 57UL, 57UL, 56UL, 55UL, 54UL, 53UL, 51UL, 49UL,
+ 55UL, 55UL, 54UL, 54UL, 53UL, 52UL, 50UL, 49UL, 46UL,
+ 50UL, 50UL, 49UL, 49UL, 48UL, 47UL, 45UL, 44UL, 41UL,
+ 42UL, 42UL, 41UL, 41UL, 40UL, 39UL, 38UL, 36UL, 34UL,
+ 32UL, 32UL, 31UL, 31UL, 30UL, 30UL, 28UL, 27UL, 25UL,
+ 21UL, 21UL, 21UL, 20UL, 20UL, 19UL, 18UL, 17UL, 15UL,
+ 10UL, 10UL, 10UL, 10UL, 10UL, 10UL, 10UL, 9UL, 9UL,
+ 6UL, 6UL, 6UL, 6UL, 6UL, 6UL, 6UL, 6UL, 0
+ };
+uint32_t ulMapDJ600_CCM_CMY[ 9 * 9 * 9 ]=
+ // DJ600_CCM_CMY
+ {
+ 3789676800UL, 2159472384UL, 1369304832UL, 831057920UL, 443871744UL, 191099648UL, 39120640UL, 4910336UL, 4585216UL,
+ 3699167488UL, 2137910016UL, 1332802048UL, 761852160UL, 408810240UL, 156103424UL, 21295104UL, 4253440UL, 3929600UL,
+ 3494949376UL, 2403977216UL, 1313134080UL, 725868032UL, 373351936UL, 138080256UL, 20313344UL, 3468032UL, 3339008UL,
+ 3308362240UL, 2486086656UL, 1479195392UL, 723895552UL, 371774208UL, 170517248UL, 36236288UL, 2746112UL, 2747904UL,
+ 3206385408UL, 2417728256UL, 1645915136UL, 957921280UL, 471253760UL, 219795200UL, 52158464UL, 2024704UL, 2222592UL,
+ 3138358784UL, 2416875520UL, 1745725184UL, 1124971008UL, 655080192UL, 286049024UL, 101634816UL, 1237504UL, 1632256UL,
+ 3087372544UL, 2432997888UL, 1812244736UL, 1241755904UL, 805550592UL, 436453120UL, 151243264UL, 17291520UL, 1106432UL,
+ 2952827392UL, 2348848384UL, 1811980544UL, 1291888128UL, 939569152UL, 587248896UL, 302038016UL, 67225856UL, 579584UL,
+ 2835387136UL, 2332071936UL, 1828756992UL, 1358995968UL, 1023452928UL, 738242304UL, 469808896UL, 218153216UL, 53248UL,
+ 4092890368UL, 3118959616UL, 1893638400UL, 1104588544UL, 499235328UL, 178898688UL, 26462464UL, 8503296UL, 7259136UL,
+ 4001661696UL, 2155905024UL, 1670552320UL, 1066312192UL, 612410368UL, 292463872UL, 90351360UL, 5743360UL, 5354752UL,
+ 3612442112UL, 2472181504UL, 1616546048UL, 1029477120UL, 626563072UL, 323984640UL, 105292544UL, 4301568UL, 4239616UL,
+ 3459346944UL, 2520282624UL, 1731755264UL, 1010271744UL, 607751680UL, 339384064UL, 137797632UL, 3449856UL, 3453440UL,
+ 3273419264UL, 2468507392UL, 1814263808UL, 1176796672UL, 656704256UL, 371756288UL, 170432768UL, 19374592UL, 2798336UL,
+ 3272567808UL, 2467524352UL, 1846834688UL, 1293253120UL, 806780672UL, 404193536UL, 186224128UL, 52140800UL, 2011904UL,
+ 3271913216UL, 2449960704UL, 1862759424UL, 1376352768UL, 940211968UL, 537690624UL, 218924032UL, 51418112UL, 1355264UL,
+ 3170923264UL, 2365616128UL, 1845523200UL, 1409317632UL, 1023508736UL, 671319296UL, 352552448UL, 84249600UL, 698112UL,
+ 3036707328UL, 2365617408UL, 1879078912UL, 1476427264UL, 1124107264UL, 822119680UL, 520131072UL, 251696384UL, 40448UL,
+ 3991889152UL, 3304284928UL, 2280153856UL, 1407741184UL, 736064768UL, 231570688UL, 12618240UL, 11374080UL, 9539072UL,
+ 3952630272UL, 2627495168UL, 1905878784UL, 1285254656UL, 747859968UL, 344354560UL, 108754176UL, 7437056UL, 7112704UL,
+ 3679670272UL, 2472499712UL, 1616928768UL, 1164404992UL, 727936000UL, 391998720UL, 139817728UL, 5208064UL, 5276416UL,
+ 3660795136UL, 2570737408UL, 1832803072UL, 1144872960UL, 725575424UL, 423652352UL, 171864576UL, 3962880UL, 4096768UL,
+ 3558689024UL, 2586072320UL, 1931958528UL, 1327979264UL, 791175424UL, 439052288UL, 187461376UL, 19691008UL, 3310336UL,
+ 3507505920UL, 2601801216UL, 1964333568UL, 1444371456UL, 924344320UL, 505045504UL, 236742912UL, 52392448UL, 2457856UL,
+ 3523629056UL, 2617857536UL, 1963481600UL, 1477074176UL, 1040933120UL, 621634304UL, 286156288UL, 85093888UL, 1605376UL,
+ 3439351040UL, 2566936832UL, 1895848192UL, 1476418560UL, 1107321088UL, 738288896UL, 385967616UL, 134572544UL, 752640UL,
+ 3254804480UL, 2483052288UL, 1929403904UL, 1560305664UL, 1224762624UL, 905996544UL, 570452992UL, 285241088UL, 30720UL,
+ 3924050432UL, 3203088384UL, 2229485568UL, 1305885696UL, 701841920UL, 265570304UL, 30233088UL, 12475392UL, 11428608UL,
+ 3969464832UL, 2745255168UL, 2057455872UL, 1335576576UL, 815483648UL, 412503040UL, 126767616UL, 8673536UL, 8479488UL,
+ 3848025344UL, 2657632256UL, 1852655616UL, 1248676352UL, 812535296UL, 443109120UL, 157504000UL, 6182912UL, 6185472UL,
+ 3711053824UL, 2537175296UL, 1849769984UL, 1145324544UL, 793266688UL, 474435328UL, 189092608UL, 4479232UL, 4612864UL,
+ 3659280384UL, 2602842624UL, 1982414848UL, 1395343872UL, 841762304UL, 506350336UL, 221270016UL, 19945472UL, 3564288UL,
+ 3675271936UL, 2652191744UL, 2065121792UL, 1494762496UL, 1008289280UL, 572213248UL, 270421248UL, 69293568UL, 2647040UL,
+ 3708237312UL, 2752134912UL, 2081047552UL, 1544176896UL, 1108035584UL, 688670976UL, 353258240UL, 101864192UL, 1664000UL,
+ 3724622848UL, 2751546112UL, 2063615744UL, 1543522048UL, 1157646336UL, 805390848UL, 436292608UL, 168054784UL, 680960UL,
+ 3422569728UL, 2617264384UL, 2030062336UL, 1610632192UL, 1258310656UL, 956321536UL, 637554688UL, 335565568UL, 23552UL,
+ 3956942848UL, 3118802688UL, 2145593088UL, 1322853632UL, 718414848UL, 299182336UL, 30683136UL, 12990976UL, 12402944UL,
+ 4019397376UL, 2795384064UL, 2074488832UL, 1419718656UL, 848965632UL, 463221504UL, 161035776UL, 9321472UL, 9323776UL,
+ 3999211264UL, 2792106496UL, 1987326208UL, 1366504192UL, 846279936UL, 477312768UL, 175061504UL, 6897152UL, 6965248UL,
+ 3895991296UL, 2722244352UL, 2018192896UL, 1330459136UL, 843985920UL, 508573952UL, 223230976UL, 4931584UL, 5130240UL,
+ 3659275008UL, 2636522752UL, 2032937728UL, 1395601152UL, 808464384UL, 540292608UL, 271923712UL, 20332544UL, 3819520UL,
+ 3658555136UL, 2736203520UL, 2132422144UL, 1545286144UL, 1025258496UL, 605893888UL, 304101632UL, 69353472UL, 2705664UL,
+ 3775406848UL, 2869701376UL, 2181902592UL, 1628255232UL, 1141716480UL, 739128832UL, 370096128UL, 101858816UL, 1722880UL,
+ 3858835456UL, 2936221696UL, 2181116672UL, 1644246784UL, 1191261952UL, 838940672UL, 486684928UL, 184826880UL, 674304UL,
+ 3623890688UL, 2818585856UL, 2147498496UL, 1660960000UL, 1275083776UL, 973093888UL, 671104512UL, 369115136UL, 17920UL,
+ 3956413952UL, 3034584320UL, 2078414080UL, 1339954432UL, 785847296UL, 349508352UL, 47585280UL, 13443584UL, 12986624UL,
+ 4002288640UL, 2845382912UL, 2090998784UL, 1486888192UL, 949820672UL, 479927552UL, 161226752UL, 9774336UL, 9776896UL,
+ 4015853824UL, 2960005632UL, 2071272704UL, 1467424512UL, 947265792UL, 494215680UL, 192291840UL, 7415552UL, 7549696UL,
+ 3996848128UL, 2907248896UL, 2152799488UL, 1448354304UL, 945169408UL, 542516736UL, 240592896UL, 22358784UL, 5649408UL,
+ 3810660352UL, 2838370048UL, 2201230336UL, 1513562112UL, 943203328UL, 557458944UL, 289220608UL, 37563392UL, 4142080UL,
+ 3759280384UL, 2769819392UL, 2166103040UL, 1545412096UL, 1008673280UL, 572662272UL, 321201664UL, 86387456UL, 2896896UL,
+ 3808957696UL, 2920094208UL, 2265915136UL, 1678713344UL, 1141842944UL, 739255296UL, 386999552UL, 135538944UL, 1782784UL,
+ 3942717440UL, 3036945920UL, 2315592192UL, 1728325120UL, 1208100352UL, 855778816UL, 520365824UL, 218442240UL, 668672UL,
+ 3841990400UL, 3003130880UL, 2281711616UL, 1728064512UL, 1308634624UL, 989867520UL, 671100160UL, 385887744UL, 13056UL,
+ 3939174656UL, 3034580992UL, 2095319040UL, 1407518720UL, 870254592UL, 416941824UL, 81200640UL, 13570304UL, 13441536UL,
+ 4001957888UL, 2861960448UL, 2107576064UL, 1537412864UL, 1017253632UL, 580914944UL, 194842368UL, 10163456UL, 10231296UL,
+ 4015720448UL, 3010268672UL, 2104823808UL, 1517949184UL, 1048187136UL, 595137024UL, 225972992UL, 7739136UL, 7872768UL,
+ 4013754112UL, 3075149312UL, 2253721600UL, 1549406976UL, 1046156288UL, 609948928UL, 257693184UL, 22812928UL, 6169088UL,
+ 3978758144UL, 3073576192UL, 2335838208UL, 1597903616UL, 1044256256UL, 608179968UL, 289478656UL, 37951744UL, 4596480UL,
+ 3944089600UL, 3038579968UL, 2334396416UL, 1663439360UL, 1076302848UL, 640161536UL, 321525760UL, 86776576UL, 3219968UL,
+ 3909683200UL, 3020819712UL, 2349994240UL, 1712526080UL, 1158878208UL, 722736384UL, 370546176UL, 135862784UL, 1974784UL,
+ 3993046272UL, 3104117248UL, 2433160192UL, 1795560960UL, 1275468032UL, 872814848UL, 520558848UL, 218634752UL, 794624UL,
+ 3959427840UL, 3154122240UL, 2415925248UL, 1828723712UL, 1342185216UL, 1006641152UL, 687873792UL, 385883904UL, 8704UL,
+ 3972661760UL, 3084779520UL, 2196045824UL, 1524957184UL, 1021444096UL, 601882624UL, 249364480UL, 47579904UL, 13831168UL,
+ 4018667520UL, 2945909760UL, 2208498944UL, 1655244032UL, 1152058624UL, 732693760UL, 329778432UL, 44303872UL, 10686208UL,
+ 4032561152UL, 3094086656UL, 2239169792UL, 1669334272UL, 1182991872UL, 746718720UL, 360711936UL, 41814272UL, 8065536UL,
+ 4030726144UL, 3226338304UL, 2388198912UL, 1667172096UL, 1164117760UL, 744818688UL, 375719936UL, 40110592UL, 6492928UL,
+ 4029350144UL, 3275162880UL, 2453603840UL, 1749288704UL, 1145374976UL, 726075904UL, 357042688UL, 55118592UL, 4985856UL,
+ 4011524352UL, 3273852160UL, 2519270912UL, 1798047744UL, 1194264576UL, 724503040UL, 372312576UL, 87166208UL, 3609600UL,
+ 4010672384UL, 3272869120UL, 2568488960UL, 1880754176UL, 1260062976UL, 807078400UL, 421202688UL, 119409920UL, 2298624UL,
+ 4026729216UL, 3255240192UL, 2550728704UL, 1913260288UL, 1326057984UL, 889784832UL, 503974400UL, 185273088UL, 1052928UL,
+ 4009756928UL, 3288336896UL, 2583694080UL, 1962937600UL, 1459621632UL, 1056968960UL, 704647680UL, 369103104UL, 4608UL,
+ 4040097792UL, 3236167680UL, 2465136640UL, 1827536896UL, 1307246592UL, 904396800UL, 551878656UL, 266403840UL, 14221312UL,
+ 4035969024UL, 3366453248UL, 2579103744UL, 1891631104UL, 1354956800UL, 952172544UL, 566034432UL, 263651328UL, 11141120UL,
+ 4033019904UL, 3396730880UL, 2592473088UL, 1905328128UL, 1402404864UL, 999751680UL, 580255744UL, 261160960UL, 8716288UL,
+ 4031184896UL, 3461611520UL, 2657222656UL, 1936457728UL, 1383071744UL, 980615168UL, 561250304UL, 225574912UL, 6946816UL,
+ 4029874176UL, 3527147520UL, 2739273728UL, 2051932160UL, 1397751808UL, 945029120UL, 542441472UL, 206897152UL, 5505024UL,
+ 4028891136UL, 3609788416UL, 2855272448UL, 2151022592UL, 1429864448UL, 943390720UL, 524025856UL, 188547072UL, 4063232UL,
+ 4028039168UL, 3743023104UL, 3055484928UL, 2283929600UL, 1545863168UL, 1009057792UL, 539230208UL, 203751424UL, 2752512UL,
+ 4027252736UL, 3792502784UL, 3155099648UL, 2400190464UL, 1729232896UL, 1142030336UL, 655491072UL, 252837888UL, 1376256UL,
+ 4026531840UL, 3573547008UL, 2952790016UL, 2281701376UL, 1694498816UL, 1191182336UL, 754974720UL, 369098752UL, 0
+ };
+
+APDK_END_NAMESPACE
diff --git a/prnt/hpijs/dj630.cpp b/prnt/hpijs/dj630.cpp
new file mode 100644
index 0000000..e351ac9
--- /dev/null
+++ b/prnt/hpijs/dj630.cpp
@@ -0,0 +1,312 @@
+/*****************************************************************************\
+ dj630.cpp : Implimentation for the DJ630 class
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#ifdef APDK_DJ630
+
+#include "header.h"
+#include "dj630.h"
+#include "printerproxy.h"
+
+APDK_BEGIN_NAMESPACE
+
+extern uint32_t ulMapDJ690_CMYK[ 9 * 9 * 9 ];
+extern uint32_t ulMapDJ690_ClMlxx[ 9 * 9 * 9 ];
+extern uint32_t ulMapDJ660_CCM_KCMY[ 9 * 9 * 9 ];
+extern uint32_t ulMapDJ600_CCM_K[ 9 * 9 * 9 ];
+extern uint32_t ulMapDJ600_CCM_CMY[ 9 * 9 * 9 ];
+
+
+DJ630::DJ630(SystemServices* pSS, BOOL proto)
+ : Printer(pSS, NUM_DJ6XX_FONTS,proto)
+{
+
+ if ((!proto) && (IOMode.bDevID))
+ {
+ constructor_error = VerifyPenInfo();
+ CERRCHECK;
+ }
+ else
+ {
+ ePen=COLOR_PEN; // matches default mode
+ }
+
+ CMYMap = ulMapDJ600_CCM_CMY;
+
+ pMode[DEFAULTMODE_INDEX] = new Mode630Color(); // normal color CMY
+ pMode[SPECIALMODE_INDEX + 0] = new PrintMode(ulMapDJ660_CCM_KCMY); // normal color KCMY
+ pMode[SPECIALMODE_INDEX + 1] = new Mode630Photo(); // photo
+ pMode[GRAYMODE_INDEX] = new GrayMode630(ulMapDJ600_CCM_K); // normal gray K
+#ifdef APDK_EXTENDED_MEDIASIZE
+ pMode[SPECIALMODE_INDEX+2] = new Mode630DraftGrayK();
+ pMode[SPECIALMODE_INDEX+3] = new Mode630DraftColorKCMY();
+ pMode[SPECIALMODE_INDEX+4] = new Mode630DraftColorCMY();
+ pMode[SPECIALMODE_INDEX+5] = new Mode630BestGrayK();
+ ModeCount=8;
+#else
+ ModeCount = 4;
+#endif
+
+ DBG1("DJ630 created\n");
+
+}
+
+PEN_TYPE DJ630::DefaultPenSet()
+{
+ return COLOR_PEN;
+}
+
+GrayMode630::GrayMode630(uint32_t *map)
+: GrayMode(map)
+{
+ CompatiblePens[1] = BLACK_PEN;
+ CompatiblePens[2] = MDL_BOTH;
+}
+
+DRIVER_ERROR DJ630::VerifyPenInfo()
+{
+
+ DRIVER_ERROR err=NO_ERROR;
+
+ if(IOMode.bDevID == FALSE)
+ return err;
+
+ err = ParsePenInfo(ePen);
+ ERRCHECK;
+
+ // check for the normal case
+ if (ePen == BOTH_PENS || ePen == MDL_BOTH || ePen == COLOR_PEN)
+ return NO_ERROR;
+
+DBG1("DJ630::VerifyPenInfo(): ePen is not BOTH_PENS, MDL_BOTH, or COLOR_PEN\n");
+
+ // the 630 printers require the color pen to be installed, so trap
+ // on any pen type that does not include the color pen
+ while ( (ePen != BOTH_PENS) && (ePen != MDL_BOTH) && (ePen != COLOR_PEN) )
+ {
+DBG1("DJ630::VerifyPenInfo(): in while loop\n");
+
+ switch (ePen)
+ {
+ case MDL_PEN:
+ case BLACK_PEN:
+ // black or photopen installed, need to install color pen
+ pSS->DisplayPrinterStatus(DISPLAY_NO_COLOR_PEN);
+ break;
+ case NO_PEN:
+ // neither pen installed
+ default:
+ pSS->DisplayPrinterStatus(DISPLAY_NO_PENS);
+ break;
+ }
+
+ if (pSS->BusyWait(500) == JOB_CANCELED)
+ return JOB_CANCELED;
+
+ err = ParsePenInfo(ePen);
+ ERRCHECK;
+ }
+
+ pSS->DisplayPrinterStatus(DISPLAY_PRINTING);
+
+ return NO_ERROR;
+
+}
+
+DRIVER_ERROR DJ630::ParsePenInfo(PEN_TYPE& ePen, BOOL QueryPrinter)
+{
+ char* str;
+ DRIVER_ERROR err = SetPenInfo(str, QueryPrinter);
+ ERRCHECK;
+
+ if (*str != '$')
+ {
+ return BAD_DEVICE_ID;
+ }
+
+ str++; // skip $
+ // parse penID
+ PEN_TYPE temp_pen1;
+ // check pen1, assume it is black or MDL, pen2 is color
+ switch (str[0])
+ {
+ // check for MDL in case someone wedged one in there
+ case 'M': temp_pen1 = MDL_PEN; break; // (M)ulti-Dye load pen
+ case 'C': temp_pen1 = BLACK_PEN; break; // (C)andide black
+ default: temp_pen1 = NO_PEN; break;
+ }
+
+ // now check pen2
+
+ int i=2;
+ while((i < DevIDBuffSize) && str[i]!='$') i++; // handles variable length penIDs
+ if (i == DevIDBuffSize)
+ {
+ return BAD_DEVICE_ID;
+ }
+
+ i++;
+
+ if(str[i]=='R') // we have the (R)obinhood color pen,
+ // check what pen1 was
+ {
+ if (temp_pen1 == BLACK_PEN)
+ ePen = BOTH_PENS;
+ else
+ {
+ if (temp_pen1 == MDL_PEN)
+ ePen = MDL_BOTH;
+ else
+ ePen = COLOR_PEN;
+ }
+ }
+ else // no color pen, just set what pen1 was
+ ePen = temp_pen1;
+
+ return NO_ERROR;
+}
+
+
+Mode630Photo::Mode630Photo()
+// print mode for photo pen
+: PrintMode(ulMapDJ690_CMYK,ulMapDJ690_ClMlxx)
+{
+ dyeCount=6;
+ medium = mediaSpecial;
+ theQuality = qualityNormal;
+
+
+ BaseResX = 600;
+ for (int i=0; i < 6; i++)
+ ResolutionX[i]=600;
+
+ CompatiblePens[0] = MDL_BOTH;
+
+ pmQuality=QUALITY_BEST;
+ pmMediaType=MEDIA_PREMIUM;
+
+// strcpy(ModeName, "Photo");
+
+}
+
+Mode630Color::Mode630Color()
+: PrintMode(ulMapDJ600_CCM_CMY)
+{
+ dyeCount=3;
+ CompatiblePens[0] = COLOR_PEN; // only color pen allowed
+
+// strcpy(ModeName, "Color");
+}
+
+#ifdef APDK_EXTENDED_MEDIASIZE
+Mode630DraftColorKCMY::Mode630DraftColorKCMY()
+: PrintMode( ulMapDJ660_CCM_KCMY )
+{
+ theQuality = qualityDraft;
+ Config.eHT = MATRIX;
+ pmQuality = QUALITY_DRAFT;
+}
+
+Mode630DraftGrayK::Mode630DraftGrayK()
+: GrayMode(ulMapDJ600_CCM_K)
+{
+ theQuality = qualityDraft;
+ pmQuality = QUALITY_DRAFT;
+}
+
+Mode630DraftColorCMY::Mode630DraftColorCMY()
+: PrintMode( ulMapDJ600_CCM_CMY )
+{
+ dyeCount=3;
+ CompatiblePens[0] = COLOR_PEN; // only color pen allowed
+ theQuality = qualityDraft;
+ pmQuality = QUALITY_DRAFT;
+}
+
+Mode630BestGrayK::Mode630BestGrayK()
+: GrayMode(ulMapDJ600_CCM_K)
+{
+ theQuality = qualityPresentation;
+ pmQuality = QUALITY_BEST;
+ BaseResX = 600;
+ ResolutionX[0] = 600;
+#ifdef APDK_HIGH_RES_MODES
+ BaseResY = 600;
+ ResolutionY[0] = 600;
+#else
+ BaseResY = 300;
+ ResolutionY[0] = 300;
+#endif
+}
+#endif // APDK_EXTENDED_MEDIASIZE
+
+Header630::Header630(Printer* p,PrintContext* pc)
+ : Header(p,pc)
+{ }
+
+Header* DJ630::SelectHeader(PrintContext* pc)
+{
+ return new Header630(this,pc);
+}
+
+DRIVER_ERROR Header630::Send()
+{ DRIVER_ERROR err;
+
+ StartSend();
+
+ // don't disable black extraction if we are in the color pen only mode
+ // since the printer may actually have both pens so we want the printer
+ // to print the K with the K pen if it actually has one
+ if (thePrintMode->dyeCount != 3)
+ {
+ err = thePrinter->Send((const BYTE*)BlackExtractOff,
+ sizeof(BlackExtractOff)); // just pertains to 2-pen
+ ERRCHECK;
+ }
+
+ err = ConfigureRasterData();
+ ERRCHECK;
+
+ if (ResolutionY[0] == 600)
+ {
+ char uom[10];
+ sprintf(uom,"%c%c%c%d%c",ESC,'&','u',thePrintMode->ResolutionY[K],'D');
+ err=thePrinter->Send((const BYTE*)uom, 7 );
+ ERRCHECK;
+ }
+
+ err=Graphics(); // start raster graphics and set compression mode
+
+return err;
+}
+
+APDK_END_NAMESPACE
+
+#endif // APDK_DJ630
diff --git a/prnt/hpijs/dj630.h b/prnt/hpijs/dj630.h
new file mode 100644
index 0000000..447c643
--- /dev/null
+++ b/prnt/hpijs/dj630.h
@@ -0,0 +1,140 @@
+/*****************************************************************************\
+ dj630.h : Interface for the DJ630 class
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#ifndef APDK_DJ630_H
+#define APDK_DJ630_H
+
+APDK_BEGIN_NAMESPACE
+
+/*!
+\internal
+*/
+class DJ630 : public Printer
+{
+public:
+ DJ630(SystemServices* pSS, BOOL proto=FALSE);
+
+ Header* SelectHeader(PrintContext* pc);
+ virtual DRIVER_ERROR VerifyPenInfo();
+ virtual DRIVER_ERROR ParsePenInfo(PEN_TYPE& ePen, BOOL QueryPrinter=TRUE);
+ virtual PEN_TYPE DefaultPenSet();
+ virtual BOOL GetMargins (PAPER_SIZE ps, float *fMargins)
+ {
+ if (ps == A4)
+ fMargins[0] = (float) 0.135;
+ else
+ fMargins[0] = (float) 0.25; // Left Margin
+ fMargins[1] = fMargins[0]; // Right Margin
+ fMargins[2] = (float) 0.125; // Top Margin
+ fMargins[3] = (float) 0.67; // Bottom Margin
+ return TRUE;
+ }
+
+#ifdef APDK_HP_UX
+protected:
+ virtual DJ630& operator = (Printer& rhs)
+ {
+ return *this;
+ }
+#endif
+
+}; //DJ630
+
+
+class Mode630Photo : public PrintMode
+{
+public:
+ Mode630Photo();
+}; //Mode630Photo
+
+
+class Mode630Color : public PrintMode
+{
+public:
+ Mode630Color();
+}; //Mode630Color
+
+
+class GrayMode630 : public GrayMode
+{
+public:
+ GrayMode630(uint32_t *map);
+}; //GrayMode630
+
+#ifdef APDK_EXTENDED_MEDIASIZE
+class Mode630DraftGrayK : public GrayMode
+{
+public:
+ Mode630DraftGrayK();
+}; //Mode630DraftGrayK
+
+class Mode630DraftColorKCMY : public PrintMode
+{
+public:
+ Mode630DraftColorKCMY();
+}; //Mode630DraftKCMYColor
+
+class Mode630DraftColorCMY : public PrintMode
+{
+public:
+ Mode630DraftColorCMY();
+}; //Mode630DraftCMYColor
+
+class Mode630BestGrayK : public GrayMode
+{
+public:
+ Mode630BestGrayK();
+}; //Mode630BestGrayK
+#endif // APDK_EXTENDED_MEDIASIZE
+
+#ifdef APDK_DJ630
+//! DJ630Proxy
+/*!
+******************************************************************************/
+class DJ630Proxy : public PrinterProxy
+{
+public:
+ DJ630Proxy() : PrinterProxy(
+ "DJ630", // family name
+ "DESKJET 63\0" // DeskJet 63x Series
+ "DESKJET 65\0" // DeskJet 65x Series
+#ifdef APDK_MLC_PRINTER
+#endif
+ ) {m_iPrinterType = eDJ630;}
+ inline Printer* CreatePrinter(SystemServices* pSS) const { return new DJ630(pSS); }
+ inline PRINTER_TYPE GetPrinterType() const { return eDJ630;}
+ inline unsigned int GetModelBit() const { return 0x8000;}
+};
+#endif
+
+APDK_END_NAMESPACE
+
+#endif // APDK_DJ630_H
diff --git a/prnt/hpijs/dj660.cpp b/prnt/hpijs/dj660.cpp
new file mode 100644
index 0000000..41e0180
--- /dev/null
+++ b/prnt/hpijs/dj660.cpp
@@ -0,0 +1,232 @@
+/*****************************************************************************\
+ dj660.cpp : Implimentation for the DJ660 class
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#ifdef APDK_DJ6xx
+
+#include "header.h"
+#include "dj6xx.h"
+#include "dj660.h"
+#include "printerproxy.h"
+
+APDK_BEGIN_NAMESPACE
+
+extern uint32_t ulMapDJ660_CCM_KCMY[ 9 * 9 * 9 ];
+extern uint32_t ulMapDJ600_CCM_K[ 9 * 9 * 9 ];
+extern uint32_t ulMapDJ600_CCM_CMY[ 9 * 9 * 9 ];
+//
+// ** DJ660:Printer CLASS **
+//
+
+DJ660::DJ660(SystemServices* pSS,BOOL proto)
+ : DJ6XX(pSS,NUM_DJ6XX_FONTS,proto)
+// create two dummy font objects to be queried via EnumFont
+{
+DBG1("DJ660::VerifyPenInfo(): called\n");
+
+ if ((!proto) && (IOMode.bDevID))
+ {
+ constructor_error = VerifyPenInfo();
+ CERRCHECK;
+ }
+ else ePen=BOTH_PENS; // matches default mode
+
+ pMode[DEFAULTMODE_INDEX] = new PrintMode( ulMapDJ660_CCM_KCMY );
+ pMode[GRAYMODE_INDEX] = new GrayMode(ulMapDJ600_CCM_K);
+ pMode[SPECIALMODE_INDEX] = new Mode660Draft();
+#ifdef APDK_EXTENDED_MEDIASIZE
+ pMode[SPECIALMODE_INDEX+1] = new Mode660DraftGrayK();
+ pMode[SPECIALMODE_INDEX+2] = new Mode660BestGrayK();
+ ModeCount=5;
+#else
+ ModeCount=3;
+#endif
+ CMYMap = ulMapDJ660_CCM_KCMY;
+
+
+DBG1("DJ 660 created\n");
+}
+
+Mode660Draft::Mode660Draft()
+: PrintMode( ulMapDJ660_CCM_KCMY )
+{
+ theQuality = qualityDraft;
+
+ Config.eHT = MATRIX;
+
+ pmQuality = QUALITY_DRAFT;
+
+// strcpy(ModeName, "Draft");
+
+}
+
+#ifdef APDK_EXTENDED_MEDIASIZE
+Mode660DraftGrayK::Mode660DraftGrayK()
+: GrayMode(ulMapDJ600_CCM_K)
+{
+ theQuality = qualityDraft;
+ pmQuality = QUALITY_DRAFT;
+}
+
+Mode660BestGrayK::Mode660BestGrayK()
+: GrayMode(ulMapDJ600_CCM_K)
+{
+ theQuality = qualityPresentation;
+ pmQuality = QUALITY_BEST;
+ BaseResX = 600;
+ ResolutionX[0] = 600;
+#ifdef APDK_HIGH_RES_MODES
+ BaseResY = 600;
+ ResolutionY[0] = 600;
+#else
+ BaseResY = 300;
+ ResolutionY[0] = 300;
+#endif
+}
+#endif // APDK_EXTENDED_MEDIASIZE
+
+Header* DJ660::SelectHeader(PrintContext* pc)
+{
+ return new Header6XX(this,pc);
+}
+
+DRIVER_ERROR DJ660::VerifyPenInfo()
+{
+
+ DRIVER_ERROR err=NO_ERROR;
+
+ if(IOMode.bDevID == FALSE)
+ return err;
+
+ err = ParsePenInfo(ePen);
+ ERRCHECK;
+
+
+ // check for the normal case
+ if (ePen == BOTH_PENS)
+ return NO_ERROR;
+
+
+ // the 6XX printers are all two-pen, so trap
+ // on any pen type that is not BOTH_PENS
+ while ( ePen != BOTH_PENS )
+ {
+
+ switch (ePen)
+ {
+ case MDL_BOTH:
+ case MDL_PEN:
+ // user shouldn't be able to get photopen in a non-690...
+ pSS->DisplayPrinterStatus(DISPLAY_PHOTO_PEN_WARN);
+ break;
+ case BLACK_PEN:
+ // black pen installed, need to install color pen
+ pSS->DisplayPrinterStatus(DISPLAY_NO_COLOR_PEN);
+ break;
+ case COLOR_PEN:
+ // color pen installed, need to install black pen
+ pSS->DisplayPrinterStatus(DISPLAY_NO_BLACK_PEN);
+ break;
+ case NO_PEN:
+ // neither pen installed
+ default:
+ pSS->DisplayPrinterStatus(DISPLAY_NO_PENS);
+ break;
+ }
+
+ if (pSS->BusyWait(500) == JOB_CANCELED)
+ return JOB_CANCELED;
+
+ err = ParsePenInfo(ePen);
+ ERRCHECK;
+ }
+
+ pSS->DisplayPrinterStatus(DISPLAY_PRINTING);
+
+ return NO_ERROR;
+
+}
+
+DRIVER_ERROR DJ660::ParsePenInfo(PEN_TYPE& ePen, BOOL QueryPrinter)
+{
+ char* str;
+ DRIVER_ERROR err = SetPenInfo(str, QueryPrinter);
+ ERRCHECK;
+
+ if (*str != '$')
+ {
+ return BAD_DEVICE_ID;
+ }
+
+ str++; // skip $
+ // parse penID
+ PEN_TYPE temp_pen1;
+ // check pen1, assume it is black or MDL, pen2 is color
+ switch (str[0])
+ {
+ // check for MDL in case someone wedged one in there
+ case 'M': temp_pen1 = MDL_PEN; break; // (M)ulti-Dye load pen
+ case 'C': temp_pen1 = BLACK_PEN; break; // (C)andide black
+ default: temp_pen1 = NO_PEN; break;
+ }
+
+ // now check pen2
+
+ int i=2;
+ while((i < DevIDBuffSize) && str[i]!='$') i++; // handles variable length penIDs
+ if (i == DevIDBuffSize)
+ {
+ return BAD_DEVICE_ID;
+ }
+
+ i++;
+
+ if(str[i]=='R') // we have the (R)obinhood color pen,
+ // check what pen1 was
+ {
+ if (temp_pen1 == BLACK_PEN)
+ ePen = BOTH_PENS;
+ else
+ {
+ if (temp_pen1 == MDL_PEN)
+ ePen = MDL_BOTH;
+ else
+ ePen = COLOR_PEN;
+ }
+ }
+ else // no color pen, just set what pen1 was
+ ePen = temp_pen1;
+
+ return NO_ERROR;
+}
+
+APDK_END_NAMESPACE
+
+#endif //APDK_DJ660
diff --git a/prnt/hpijs/dj660.h b/prnt/hpijs/dj660.h
new file mode 100644
index 0000000..6886506
--- /dev/null
+++ b/prnt/hpijs/dj660.h
@@ -0,0 +1,103 @@
+/*****************************************************************************\
+ dj660.h : Interface for the DJ660 class
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#ifndef APDK_DJ660_H
+#define APDK_DJ660_H
+
+APDK_BEGIN_NAMESPACE
+
+//extern char *ModelString[MAX_ID_STRING];
+
+/*!
+\internal
+*/
+class DJ660 : public DJ6XX
+{
+public:
+ DJ660(SystemServices* pSS, BOOL proto=FALSE);
+
+ Header* SelectHeader(PrintContext* pc);
+ virtual DRIVER_ERROR VerifyPenInfo();
+ virtual DRIVER_ERROR ParsePenInfo(PEN_TYPE& ePen, BOOL QueryPrinter=TRUE);
+
+}; //DJ660
+
+
+class Mode660Draft : public PrintMode
+{
+public:
+ Mode660Draft();
+}; //Mode660Draft
+
+#ifdef APDK_EXTENDED_MEDIASIZE
+class Mode660DraftGrayK : public GrayMode
+{
+public:
+ Mode660DraftGrayK();
+}; //Mode660DraftGrayK
+
+class Mode660BestGrayK : public GrayMode
+{
+public:
+ Mode660BestGrayK();
+}; //Mode660BestGrayK
+#endif // APDK_EXTENDED_MEDIASIZE
+
+#ifdef APDK_DJ6xx
+//! DJ660Proxy
+/*!
+******************************************************************************/
+class DJ660Proxy : public PrinterProxy
+{
+public:
+ DJ660Proxy() : PrinterProxy(
+ "DJ6xx", // family name
+ "DESKJET 66\0" // DeskJet 66x Series
+ "DESKJET 67\0" // DeskJet 67x Series
+ "DESKJET 68\0" // DeskJet 68x Series
+ "DESKJET 60\0" // DeskJet 6xx Series
+ "e-printer e20\0" // ePrinter
+#ifdef APDK_MLC_PRINTER
+ "OfficeJet Series 5\0" // OfficeJet Series 500
+ "OfficeJet Series 6\0" // OfficeJet Series 600
+ "Printer/Scanner/Copier 3\0" // PSC 300 Series
+ "OfficeJet Series 7\0" // OfficeJet Series 700
+#endif
+ ) {m_iPrinterType = eDJ6xx;}
+ inline Printer* CreatePrinter(SystemServices* pSS) const { return new DJ660(pSS); }
+ inline PRINTER_TYPE GetPrinterType() const { return eDJ6xx;}
+ inline unsigned int GetModelBit() const { return 0x100000;}
+};
+#endif
+
+APDK_END_NAMESPACE
+
+#endif //APDK_DJ660_H
diff --git a/prnt/hpijs/dj660_maps.cpp b/prnt/hpijs/dj660_maps.cpp
new file mode 100644
index 0000000..c61500c
--- /dev/null
+++ b/prnt/hpijs/dj660_maps.cpp
@@ -0,0 +1,125 @@
+/*****************************************************************************\
+ dj660_maps.cpp : Color maps for the DJ660
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#include "config.h"
+
+#include "global_types.h"
+
+APDK_BEGIN_NAMESPACE
+
+//const
+uint32_t ulMapDJ660_CCM_KCMY[ 9 * 9 * 9 ]=
+ {
+ 422720226UL, 142187374UL, 94354238UL, 62442785UL, 45668877UL, 27648516UL, 8972032UL, 7335680UL, 5895424UL,
+2519110233UL, 807846483UL, 391693109UL, 260029471UL, 143570703UL, 42776580UL, 8501760UL, 7782400UL, 6539520UL,
+3072173868UL, 1881129514UL, 841465387UL, 524792087UL, 358391818UL, 174364420UL, 40408577UL, 6920704UL, 6530560UL,
+3407591425UL, 2551891200UL, 1612695808UL, 824489479UL, 506699268UL, 306153730UL, 105283329UL, 5144320UL, 5737216UL,
+3289364224UL, 2584592128UL, 1829749504UL, 1142143232UL, 639280640UL, 405048832UL, 204241920UL, 53835264UL, 4290816UL,
+2970005760UL, 2449717248UL, 1862580992UL, 1325905408UL, 856467712UL, 487757568UL, 270041856UL, 119436800UL, 2650624UL,
+2583865856UL, 2214636288UL, 1811983360UL, 1392618240UL, 973382656UL, 621320448UL, 336235520UL, 152010496UL, 1405952UL,
+2197856768UL, 1996530176UL, 1711316992UL, 1375772160UL, 1040226048UL, 721654784UL, 436506368UL, 184846592UL, 622592UL,
+1879088896UL, 1778424576UL, 1593874176UL, 1342214912UL, 1073778688UL, 788565504UL, 536907264UL, 268472320UL, 37120UL,
+2191458944UL, 130097257UL, 63659581UL, 30835745UL, 30318351UL, 28684549UL, 9946880UL, 8574976UL, 7855360UL,
+2351640941UL, 1230197602UL, 763002927UL, 394890269UL, 193893645UL, 59415555UL, 8365312UL, 7515392UL, 6534656UL,
+2938266166UL, 2184740132UL, 1212123679UL, 760318735UL, 459048710UL, 173835267UL, 22906624UL, 6065408UL, 5544192UL,
+3273752070UL, 2552530688UL, 1730711808UL, 1043106817UL, 641040129UL, 373061120UL, 104886784UL, 4355584UL, 4489984UL,
+3155526144UL, 2501084160UL, 1846774528UL, 1242990592UL, 807173632UL, 488796928UL, 220555776UL, 53111296UL, 3305728UL,
+2970190592UL, 2399567872UL, 1829078016UL, 1342538496UL, 940211456UL, 588280832UL, 286354176UL, 102065408UL, 1992448UL,
+2802024960UL, 2231400192UL, 1795192832UL, 1375762944UL, 1023440896UL, 721712640UL, 436629248UL, 168257792UL, 813056UL,
+2583724288UL, 2097182464UL, 1744860672UL, 1409316864UL, 1124104448UL, 822113792UL, 520122624UL, 251686400UL, 225024UL,
+2315289088UL, 1996520960UL, 1694530816UL, 1392540928UL, 1124105216UL, 872446720UL, 620787968UL, 352352768UL, 31744UL,
+2813265494UL, 886309456UL, 47912514UL, 31343650UL, 47801870UL, 30114052UL, 11901184UL, 10791936UL, 9878016UL,
+2858360649UL, 1938110261UL, 764624176UL, 429676569UL, 211511561UL, 43283459UL, 9142784UL, 8359936UL, 7380736UL,
+2788045111UL, 2135115815UL, 1701143808UL, 1080584704UL, 577202944UL, 224619520UL, 6057728UL, 5864704UL, 5343744UL,
+3056161036UL, 2435668741UL, 1815635456UL, 1195009792UL, 725443840UL, 373187328UL, 104752128UL, 3894016UL, 3831552UL,
+2988071680UL, 2400804096UL, 1847354112UL, 1293771776UL, 857694464UL, 488791552UL, 220486400UL, 52715264UL, 2582272UL,
+2920177152UL, 2332777728UL, 1829330688UL, 1359503616UL, 973824256UL, 621763840UL, 269506560UL, 118642944UL, 1335040UL,
+2886099200UL, 2265144064UL, 1778407680UL, 1392532480UL, 1073766144UL, 755195648UL, 453270272UL, 184834304UL, 482560UL,
+2852218112UL, 2197838848UL, 1811963136UL, 1476419840UL, 1191208192UL, 889218048UL, 587227392UL, 302014208UL, 25088UL,
+2717935872UL, 2231395840UL, 1811965440UL, 1476421888UL, 1191209984UL, 939551744UL, 687892736UL, 402679808UL, 27136UL,
+3249604153UL, 1708524086UL, 585171507UL, 48370214UL, 31601680UL, 14372868UL, 13461760UL, 12680448UL, 11702272UL,
+3195409712UL, 2224038185UL, 1083974180UL, 396241692UL, 178339850UL, 43994626UL, 10051072UL, 9596416UL, 8880128UL,
+3007980834UL, 2337813271UL, 1785678080UL, 1081100800UL, 561007616UL, 191713280UL, 6706688UL, 6514176UL, 6124544UL,
+2838245394UL, 2301901833UL, 1799440128UL, 1128481536UL, 742672896UL, 356862976UL, 105075200UL, 4217344UL, 4024320UL,
+2871016960UL, 2300592640UL, 1797474304UL, 1311000576UL, 874990080UL, 505956608UL, 220744448UL, 52842752UL, 2382848UL,
+2836546048UL, 2249147648UL, 1779386112UL, 1359956224UL, 974146048UL, 605243648UL, 320030720UL, 101862400UL, 1135360UL,
+2903066112UL, 2214872320UL, 1778665216UL, 1426278656UL, 1090735104UL, 755256320UL, 436488960UL, 184830720UL, 282368UL,
+3003337216UL, 2264942592UL, 1862290176UL, 1526747136UL, 1191203584UL, 889213696UL, 604000512UL, 318787840UL, 21248UL,
+3070251008UL, 2432716800UL, 1929400832UL, 1577080320UL, 1258314496UL, 989879296UL, 738220800UL, 436230400UL, 22784UL,
+3568109346UL, 2262106917UL, 1122173220UL, 367395105UL, 31854613UL, 15083526UL, 14368512UL, 13717760UL, 13067776UL,
+3447722013UL, 2459112987UL, 1369380887UL, 547296537UL, 195174925UL, 44445699UL, 10698496UL, 10439936UL, 10182144UL,
+3143179283UL, 2439259148UL, 1785868800UL, 1098199552UL, 561329152UL, 192231424UL, 7487232UL, 7621632UL, 7428352UL,
+2856002824UL, 2302618117UL, 1766339072UL, 1212887808UL, 726479872UL, 340670208UL, 89013504UL, 5064192UL, 4871424UL,
+2770675968UL, 2217095168UL, 1730819072UL, 1261188352UL, 842150400UL, 489698816UL, 204552704UL, 53363200UL, 2968832UL,
+2752916736UL, 2165649920UL, 1712731648UL, 1310078464UL, 957822464UL, 605632256UL, 303642624UL, 102251776UL, 1394176UL,
+2886480128UL, 2198352896UL, 1728526080UL, 1376139264UL, 1040595200UL, 721893888UL, 436746752UL, 185023232UL, 475392UL,
+3104126208UL, 2298623744UL, 1828731392UL, 1476410624UL, 1157644288UL, 855654656UL, 570441728UL, 285229056UL, 17408UL,
+3338680832UL, 2550152192UL, 1996505088UL, 1610630400UL, 1308641536UL, 1006652416UL, 754994176UL, 436226816UL, 18944UL,
+3752199442UL, 2714829590UL, 1608712727UL, 786891031UL, 266863123UL, 15403531UL, 15080962UL, 14429952UL, 13975808UL,
+3565226513UL, 2610105871UL, 1587482636UL, 832573198UL, 228527886UL, 44439813UL, 11020288UL, 11023360UL, 11091712UL,
+3160347149UL, 2439583495UL, 1769086464UL, 1114971648UL, 527834880UL, 175710720UL, 8006144UL, 8336896UL, 8536320UL,
+2789414919UL, 2235964420UL, 1749885184UL, 1213211136UL, 726868480UL, 324412160UL, 89664000UL, 5976832UL, 6111488UL,
+2670533632UL, 2150506752UL, 1680941824UL, 1261642752UL, 859251456UL, 473506816UL, 188360704UL, 3747328UL, 3947264UL,
+2702777344UL, 2082087680UL, 1629168896UL, 1260135936UL, 924722432UL, 572662272UL, 287385088UL, 86060032UL, 2176512UL,
+2886606592UL, 2114724864UL, 1644898048UL, 1292577024UL, 990652416UL, 688727808UL, 386803968UL, 151857920UL, 930304UL,
+3171230464UL, 2265130496UL, 1711286016UL, 1375742464UL, 1090530304UL, 839003904UL, 553857024UL, 268644352UL, 209664UL,
+3540002560UL, 2583702016UL, 1962946304UL, 1610625792UL, 1308636928UL, 1023425024UL, 738212608UL, 436222720UL, 14848UL,
+3819438857UL, 3083666187UL, 2028077070UL, 1189478414UL, 652804109UL, 250413065UL, 15598599UL, 15144192UL, 14820608UL,
+3632465161UL, 2693924616UL, 1738344454UL, 1050674951UL, 530646791UL, 94635528UL, 27923458UL, 11411200UL, 11806464UL,
+3143895559UL, 2439646467UL, 1735462912UL, 1131745024UL, 611847936UL, 209326336UL, 8198144UL, 8791040UL, 9382656UL,
+2689011205UL, 2185891842UL, 1716523520UL, 1196626432UL, 743903488UL, 307827200UL, 73341184UL, 6627840UL, 7154944UL,
+2587038208UL, 2067010560UL, 1647711488UL, 1228477952UL, 842863872UL, 440341504UL, 155326208UL, 4529664UL, 4926208UL,
+2635993600UL, 2015368960UL, 1579161344UL, 1210259200UL, 874780160UL, 539497984UL, 254351104UL, 69934080UL, 3090176UL,
+2869890816UL, 2081429504UL, 1578113536UL, 1242569216UL, 957422080UL, 655563008UL, 387389184UL, 135666432UL, 1581568UL,
+3238466560UL, 2248480768UL, 1677990656UL, 1325669632UL, 1040457216UL, 772087296UL, 503717120UL, 235282176UL, 533248UL,
+3724548096UL, 2617252608UL, 1895833344UL, 1526735616UL, 1241523712UL, 973088768UL, 704653312UL, 402663424UL, 10240UL,
+3754033155UL, 3252158469UL, 2414215174UL, 1625948167UL, 1089339398UL, 653393924UL, 301334531UL, 15925254UL, 15732736UL,
+3616342532UL, 2777940483UL, 1872626178UL, 1252262146UL, 765985026UL, 380240130UL, 44958469UL, 11668480UL, 12325888UL,
+3144155907UL, 2439775233UL, 1718682624UL, 1165427712UL, 695993088UL, 310313984UL, 58918914UL, 9114112UL, 9770752UL,
+2672559362UL, 2186151169UL, 1699939840UL, 1196885248UL, 760939776UL, 375391488UL, 90507776UL, 7082496UL, 7608320UL,
+2486700288UL, 2017003520UL, 1614481664UL, 1212024832UL, 843122432UL, 474285824UL, 155781376UL, 5050112UL, 5641984UL,
+2552498432UL, 1965361920UL, 1546062336UL, 1193806592UL, 858393088UL, 539822336UL, 254806528UL, 53808640UL, 3872000UL,
+2819885312UL, 2064911360UL, 1561660672UL, 1192627200UL, 890702848UL, 605621248UL, 337316608UL, 119409920UL, 2298624UL,
+3288794880UL, 2282097664UL, 1644563968UL, 1241911040UL, 939986944UL, 688393984UL, 436866560UL, 185273088UL, 921856UL,
+3875539712UL, 2701135104UL, 1879052032UL, 1409290752UL, 1107301376UL, 855643392UL, 620762368UL, 335549440UL, 5376UL,
+3539009536UL, 3170041856UL, 2666856448UL, 2096496640UL, 1559756800UL, 1090125824UL, 721158144UL, 352124928UL, 16711680UL,
+3433627648UL, 2795896832UL, 2125332480UL, 1572143104UL, 1119551488UL, 750780416UL, 432275456UL, 180748288UL, 13041664UL,
+3111387136UL, 2507407360UL, 1887109120UL, 1350828032UL, 931725312UL, 563019776UL, 278200320UL, 77070336UL, 10158080UL,
+2689794048UL, 2253717504UL, 1784283136UL, 1314914304UL, 895811584UL, 527106048UL, 258998272UL, 58064896UL, 8126464UL,
+2436694016UL, 2050949120UL, 1665204224UL, 1279524864UL, 910753792UL, 575537152UL, 273874944UL, 72941568UL, 6291456UL,
+2469003264UL, 1948975104UL, 1579941888UL, 1227816960UL, 909115392UL, 607453184UL, 322568192UL, 104792064UL, 4653056UL,
+2803433472UL, 2098790400UL, 1595539456UL, 1192951808UL, 874315776UL, 606011392UL, 371326976UL, 153550848UL, 3080192UL,
+3339386880UL, 2416508928UL, 1711931392UL, 1242169344UL, 889978880UL, 621608960UL, 403636224UL, 185729024UL, 1507328UL,
+4026531840UL, 2936012800UL, 2030043136UL, 1409286144UL, 1006632960UL, 704643072UL, 469762048UL, 234881024UL, 0
+ };
+
+APDK_END_NAMESPACE
+
diff --git a/prnt/hpijs/dj690.cpp b/prnt/hpijs/dj690.cpp
new file mode 100644
index 0000000..c9ff4d4
--- /dev/null
+++ b/prnt/hpijs/dj690.cpp
@@ -0,0 +1,293 @@
+/*****************************************************************************\
+ dj690.cpp : Implimentation for the DJ6xxPhoto class
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#ifdef APDK_DJ6xxPhoto
+
+#include "header.h"
+#include "dj690.h"
+#include "printerproxy.h"
+
+APDK_BEGIN_NAMESPACE
+
+extern uint32_t ulMapDJ690_CMYK[ 9 * 9 * 9 ];
+extern uint32_t ulMapDJ690_ClMlxx[ 9 * 9 * 9 ];
+extern uint32_t ulMapDJ660_CCM_KCMY[ 9 * 9 * 9 ];
+extern uint32_t ulMapDJ600_CCM_K[ 9 * 9 * 9 ];
+
+//
+// ** DJ6xxPhoto:Printer CLASS **
+//
+Mode690::Mode690()
+// print mode for photo pen
+: PrintMode( ulMapDJ690_CMYK, ulMapDJ690_ClMlxx )
+{
+ dyeCount=6;
+ medium = mediaSpecial;
+ theQuality = qualityPresentation;
+// theQuality = qualityNormal;
+
+ BaseResX = 600;
+ for (int i=0; i < 6; i++)
+ ResolutionX[i]=600;
+
+ CompatiblePens[0] = MDL_BOTH;
+
+// strcpy(ModeName, "Photo");
+
+ pmQuality = QUALITY_BEST;
+ pmMediaType = MEDIA_PREMIUM;
+
+}
+
+GrayMode690::GrayMode690()
+// print mode for photo pen
+: PrintMode( ulMapDJ600_CCM_K )
+{
+ CompatiblePens[1] = MDL_BOTH;
+
+ dyeCount = 1;
+
+ pmColor=GREY_K;
+
+}
+
+#ifdef APDK_EXTENDED_MEDIASIZE
+Mode690DraftColor::Mode690DraftColor()
+: PrintMode( ulMapDJ660_CCM_KCMY )
+{
+ theQuality = qualityDraft;
+ Config.eHT = MATRIX;
+ pmQuality = QUALITY_DRAFT;
+}
+
+Mode690DraftGrayK::Mode690DraftGrayK()
+: GrayMode(ulMapDJ600_CCM_K)
+{
+ theQuality = qualityDraft;
+ pmQuality = QUALITY_DRAFT;
+}
+
+Mode690BestGrayK::Mode690BestGrayK()
+: GrayMode(ulMapDJ600_CCM_K)
+{
+ theQuality = qualityPresentation;
+ pmQuality = QUALITY_BEST;
+ BaseResX = 600;
+ ResolutionX[0] = 600;
+#ifdef APDK_HIGH_RES_MODES
+ BaseResY = 600;
+ ResolutionY[0] = 600;
+#else
+ BaseResY = 300;
+ ResolutionY[0] = 300;
+#endif
+}
+#endif // APDK_EXTENDED_MEDIASIZE
+
+DJ6xxPhoto::DJ6xxPhoto(SystemServices* pSS, BOOL proto)
+ : Printer(pSS, NUM_DJ6XX_FONTS,proto)
+// create two dummy font objects to be queried via EnumFont
+{
+
+ if ((!proto) && (IOMode.bDevID))
+ {
+ constructor_error = VerifyPenInfo();
+ CERRCHECK;
+ }
+ else
+ {
+ ePen=BOTH_PENS; // matches default mode
+ }
+
+ pMode[DEFAULTMODE_INDEX] = new PrintMode( ulMapDJ660_CCM_KCMY ); // normal color
+ pMode[GRAYMODE_INDEX] = new GrayMode690(); // normal gray k
+ pMode[SPECIALMODE_INDEX] = new Mode690(); // photo
+#ifdef APDK_EXTENDED_MEDIASIZE
+ pMode[SPECIALMODE_INDEX+1] = new Mode690DraftGrayK();
+ pMode[SPECIALMODE_INDEX+2] = new Mode690DraftColor();
+ pMode[SPECIALMODE_INDEX+3] = new Mode690BestGrayK();
+ ModeCount=6;
+#else
+ ModeCount = 3;
+#endif
+
+ CMYMap = ulMapDJ660_CCM_KCMY;
+
+ DBG1("DJ6xxPhoto created\n");
+
+}
+
+
+Header690::Header690(Printer* p,PrintContext* pc)
+ : Header(p,pc)
+{ }
+
+Header* DJ6xxPhoto::SelectHeader(PrintContext* pc)
+{
+ return new Header690(this, pc);
+}
+
+DRIVER_ERROR Header690::Send()
+{ DRIVER_ERROR err;
+
+ StartSend();
+
+ err = thePrinter->Send((const BYTE*)BlackExtractOff,
+ sizeof(BlackExtractOff)); // just pertains to 2-pen
+ ERRCHECK;
+
+ err = ConfigureRasterData();
+ ERRCHECK;
+
+ if (ResolutionY[0] == 600)
+ {
+ char uom[10];
+ sprintf(uom,"%c%c%c%d%c",ESC,'&','u',thePrintMode->ResolutionY[K],'D');
+ err=thePrinter->Send((const BYTE*)uom, 7 );
+ ERRCHECK;
+ }
+
+ err=Graphics(); // start raster graphics and set compression mode
+
+return err;
+}
+DRIVER_ERROR DJ6xxPhoto::VerifyPenInfo()
+{
+
+ DRIVER_ERROR err=NO_ERROR;
+
+ if(IOMode.bDevID == FALSE)
+ return err;
+
+ err = ParsePenInfo(ePen);
+ ERRCHECK;
+
+ // check for the normal case
+ if (ePen == BOTH_PENS || ePen == MDL_BOTH)
+ return NO_ERROR;
+
+DBG1("DJ6xxPhoto::VerifyPenInfo(): ePen is not BOTH_PENS or MDL_BOTH\n");
+
+ // the 6XX printers are all two-pen, so trap
+ // on any pen type that is not MDL_BOTH or
+ // BOTH_PENS
+ while ( (ePen != BOTH_PENS) && (ePen != MDL_BOTH) )
+ {
+DBG1("DJ6xxPhoto::VerifyPenInfo(): in while loop\n");
+
+ switch (ePen)
+ {
+ case MDL_PEN:
+ case BLACK_PEN:
+ // black or photopen installed, need to install color pen
+ pSS->DisplayPrinterStatus(DISPLAY_NO_COLOR_PEN);
+ break;
+ case COLOR_PEN:
+ // color pen installed, need to install black pen
+ // - use ambiguous message because of black or photo pen
+ pSS->DisplayPrinterStatus(DISPLAY_NO_PEN_DJ600);
+ break;
+ case NO_PEN:
+ // neither pen installed
+ default:
+ pSS->DisplayPrinterStatus(DISPLAY_NO_PENS);
+ break;
+ }
+
+ if (pSS->BusyWait(500) == JOB_CANCELED)
+ return JOB_CANCELED;
+
+ err = ParsePenInfo(ePen);
+ ERRCHECK;
+ }
+
+ pSS->DisplayPrinterStatus(DISPLAY_PRINTING);
+
+ return NO_ERROR;
+
+}
+
+DRIVER_ERROR DJ6xxPhoto::ParsePenInfo(PEN_TYPE& ePen, BOOL QueryPrinter)
+{
+ char* str;
+ DRIVER_ERROR err = SetPenInfo(str, QueryPrinter);
+ ERRCHECK;
+
+ if (*str != '$')
+ {
+ return BAD_DEVICE_ID;
+ }
+
+ str++; // skip $
+ // parse penID
+ PEN_TYPE temp_pen1;
+ // check pen1, assume it is black or MDL, pen2 is color
+ switch (str[0])
+ {
+ // check for MDL in case someone wedged one in there
+ case 'M': temp_pen1 = MDL_PEN; break; // (M)ulti-Dye load pen
+ case 'C': temp_pen1 = BLACK_PEN; break; // (C)andide black
+ default: temp_pen1 = NO_PEN; break;
+ }
+
+ // now check pen2
+
+ int i=2;
+ while((i < DevIDBuffSize) && str[i]!='$') i++; // handles variable length penIDs
+ if (i == DevIDBuffSize)
+ {
+ return BAD_DEVICE_ID;
+ }
+
+ i++;
+
+ if(str[i]=='R') // we have the (R)obinhood color pen,
+ // check what pen1 was
+ {
+ if (temp_pen1 == BLACK_PEN)
+ ePen = BOTH_PENS;
+ else
+ {
+ if (temp_pen1 == MDL_PEN)
+ ePen = MDL_BOTH;
+ else
+ ePen = COLOR_PEN;
+ }
+ }
+ else // no color pen, just set what pen1 was
+ ePen = temp_pen1;
+
+ return NO_ERROR;
+}
+
+APDK_END_NAMESPACE
+
+#endif //APDK_DJ690
diff --git a/prnt/hpijs/dj690.h b/prnt/hpijs/dj690.h
new file mode 100644
index 0000000..234618d
--- /dev/null
+++ b/prnt/hpijs/dj690.h
@@ -0,0 +1,131 @@
+/*****************************************************************************\
+ dj690.h : Interface for the DJ6xxPhoto class
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#ifndef APDK_DJ690_H
+#define APDK_DJ690_H
+
+APDK_BEGIN_NAMESPACE
+
+//extern char *ModelString[MAX_ID_STRING];
+
+/*!
+\internal
+*/
+class DJ6xxPhoto : public Printer
+{
+public:
+ DJ6xxPhoto(SystemServices* pSS, BOOL proto=FALSE);
+
+ Header* SelectHeader(PrintContext* pc);
+ virtual DRIVER_ERROR VerifyPenInfo();
+ virtual DRIVER_ERROR ParsePenInfo(PEN_TYPE& ePen, BOOL QueryPrinter=TRUE);
+ virtual BOOL GetMargins (PAPER_SIZE ps, float *fMargins)
+ {
+ if (ps == A4)
+ fMargins[0] = (float) 0.135;
+ else
+ fMargins[0] = (float) 0.25; // Left Margin
+ fMargins[1] = fMargins[0]; // Right Margin
+ fMargins[2] = (float) 0.125; // Top Margin
+ fMargins[3] = (float) 0.67; // Bottom Margin
+ return TRUE;
+ }
+
+protected:
+#ifdef APDK_HP_UX
+ virtual DJ6xxPhoto & operator = (Printer& rhs)
+ {
+ return *this;
+ }
+#endif
+
+ BOOL PhotoPenOK;
+
+}; //DJ6xxPhoto
+
+
+class Mode690 : public PrintMode
+{
+public:
+ Mode690();
+}; //Mode690
+
+
+class GrayMode690 : public PrintMode
+{
+public:
+ GrayMode690();
+}; //GrayMode690
+
+#ifdef APDK_EXTENDED_MEDIASIZE
+class Mode690DraftGrayK : public GrayMode
+{
+public:
+ Mode690DraftGrayK();
+}; //Mode690DraftGrayK
+
+class Mode690DraftColor : public PrintMode
+{
+public:
+ Mode690DraftColor();
+}; //Mode690DraftColor
+
+class Mode690BestGrayK : public GrayMode
+{
+public:
+ Mode690BestGrayK();
+}; //Mode690BestGrayK
+#endif // APDK_EXTENDED_MEDIASIZE
+
+#ifdef APDK_DJ6xxPhoto
+//! DJ690Proxy
+/*!
+******************************************************************************/
+class DJ6xxPhotoProxy : public PrinterProxy
+{
+public:
+ DJ6xxPhotoProxy() : PrinterProxy(
+ "DJ6xxPhoto", // family name
+ "DESKJET 61\0" // DeskJet 61x Series
+ "DESKJET 64\0" // DeskJet 64x Series
+ "DESKJET 69\0" // DeskJet 69x Series
+#ifdef APDK_MLC_PRINTER
+#endif
+ ) {m_iPrinterType = eDJ6xxPhoto;}
+ inline Printer* CreatePrinter(SystemServices* pSS) const { return new DJ6xxPhoto(pSS); }
+ inline PRINTER_TYPE GetPrinterType() const { return eDJ6xxPhoto;}
+ inline unsigned int GetModelBit() const { return 0x80000;}
+};
+#endif
+
+APDK_END_NAMESPACE
+
+#endif //APDK_DJ690_H
diff --git a/prnt/hpijs/dj690_maps.cpp b/prnt/hpijs/dj690_maps.cpp
new file mode 100644
index 0000000..bbc4c9b
--- /dev/null
+++ b/prnt/hpijs/dj690_maps.cpp
@@ -0,0 +1,291 @@
+/*****************************************************************************\
+ dj690_maps.cpp : Color maps for DJ6xxPhoto
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#include "config.h"
+
+#include "global_types.h"
+
+APDK_BEGIN_NAMESPACE
+
+uint32_t ulMapDJ690_CMYK[ 9 * 9 * 9 ]=
+// DJ690_CMYK
+ {
+ 337848575UL, 37838470UL, 155209268UL, 137905152UL, 36454656UL, 2310144UL,
+ 2179072UL, 2051072UL, 1733120UL, 2013280119UL, 385897321UL, 303379741UL,
+ 270610688UL, 102772224UL, 1844992UL, 1911552UL, 1847296UL, 1784832UL,
+2080387626UL, 1157643294UL, 452996881UL, 335555072UL, 202384384UL, 50991872UL,
+ 2304UL, 922880UL, 1319680UL, 2164273408UL, 1409300992UL, 721433088UL,
+ 385886976UL, 268444928UL, 151000832UL, 16777216UL, 0UL, 2048UL,
+2147495424UL, 1426075648UL, 838872576UL, 520104192UL, 301999872UL, 201335040UL,
+ 83889408UL, 0UL, 0UL, 2231381504UL, 1459629056UL, 922756864UL,
+ 603988736UL, 402662656UL, 234889984UL, 134224640UL, 33554432UL, 0UL,
+2365598720UL, 1711286528UL, 1023417856UL, 687873280UL, 469770240UL, 318775552UL,
+ 151002624UL, 67112448UL, 0UL, 2147492608UL, 1660951808UL, 1040191744UL,
+ 738202112UL, 520098560UL, 352326656UL, 234888192UL, 83891968UL, 512UL,
+1744833536UL, 1493176064UL, 1056967168UL, 771754240UL, 570427136UL, 402655744UL,
+ 285216512UL, 151000832UL, 5120UL, 1867382908UL, 242679926UL, 273556510UL,
+ 171977984UL, 37040896UL, 2963456UL, 2375168UL, 2380544UL, 2060288UL,
+2399142003UL, 336202819UL, 371005455UL, 287581184UL, 102769152UL, 1314048UL,
+ 1381120UL, 1515264UL, 1388032UL, 2214599729UL, 1107302927UL, 520100352UL,
+ 352328704UL, 219160320UL, 50333952UL, 0UL, 2560UL, 6144UL,
+2063606016UL, 1090527232UL, 671096832UL, 419437824UL, 285219584UL, 150998528UL,
+ 16777216UL, 0UL, 1024UL, 1677729536UL, 1056971776UL, 738204416UL,
+ 520100352UL, 352328448UL, 201331968UL, 83886080UL, 0UL, 0UL,
+1694504960UL, 1073743872UL, 771753728UL, 553649920UL, 419432704UL, 268439296UL,
+ 134219264UL, 33554432UL, 0UL, 1761611520UL, 1040187392UL, 822083584UL,
+ 620756992UL, 436207616UL, 301989888UL, 184549376UL, 67108864UL, 0UL,
+1979714048UL, 1073741824UL, 855638016UL, 687865856UL, 486539264UL, 352321536UL,
+ 234881024UL, 83886080UL, 0UL, 2214593536UL, 1275068416UL, 939524096UL,
+ 738197504UL, 553648128UL, 402653184UL, 268435456UL, 150994944UL, 0UL,
+2102263844UL, 1063190564UL, 391119377UL, 239537664UL, 54595584UL, 3940096UL,
+ 3616512UL, 3753984UL, 3105792UL, 2284060719UL, 1159987223UL, 421789697UL,
+ 321327616UL, 119671296UL, 1638400UL, 1572864UL, 1838080UL, 2041600UL,
+1962934313UL, 956301324UL, 402653184UL, 369889024UL, 236065536UL, 50331648UL,
+ 0UL, 0UL, 2560UL, 1543507718UL, 1040191232UL, 687870208UL,
+ 419434496UL, 285217280UL, 150995968UL, 16777216UL, 0UL, 0UL,
+1426067200UL, 1040190976UL, 738201344UL, 536874496UL, 369102592UL, 218106112UL,
+ 83886080UL, 0UL, 0UL, 1509949952UL, 1040187392UL, 788529152UL,
+ 587202560UL, 419430400UL, 285212672UL, 134217728UL, 33554432UL, 0UL,
+1644167168UL, 1023410176UL, 805306368UL, 637534208UL, 469762048UL, 318767104UL,
+ 184549376UL, 67108864UL, 0UL, 1946157056UL, 1056964608UL, 872415232UL,
+ 687865856UL, 520093696UL, 352321536UL, 234881024UL, 117440512UL, 0UL,
+2801795072UL, 1325400064UL, 939524096UL, 771751936UL, 553648128UL, 419430400UL,
+ 301989888UL, 184549376UL, 0UL, 2286419968UL, 1263140864UL, 608436224UL,
+ 290062336UL, 88997888UL, 4784128UL, 4720384UL, 4793600UL, 4932352UL,
+2452488192UL, 1126694912UL, 606535680UL, 338167040UL, 153354240UL, 2031616UL,
+ 1900544UL, 2031616UL, 2624768UL, 2014248971UL, 1074659328UL, 655294464UL,
+ 370344448UL, 235930880UL, 50331648UL, 0UL, 0UL, 786432UL,
+1308622848UL, 922746880UL, 654311424UL, 385875968UL, 285215232UL, 150994944UL,
+ 16777216UL, 0UL, 0UL, 1308623360UL, 1023411456UL, 771753728UL,
+ 536873216UL, 352323840UL, 201327104UL, 83886080UL, 0UL, 0UL,
+1392508928UL, 1023410176UL, 805306368UL, 587202560UL, 419430400UL, 268435456UL,
+ 134217728UL, 33554432UL, 0UL, 1577058304UL, 1040187392UL, 822083584UL,
+ 637534208UL, 503316480UL, 352321536UL, 184549376UL, 50331648UL, 0UL,
+1912602624UL, 1073741824UL, 889192448UL, 738197504UL, 587202560UL, 436207616UL,
+ 251658240UL, 100663296UL, 0UL, 3154116608UL, 1325400064UL, 973078528UL,
+ 788529152UL, 620756992UL, 469762048UL, 318767104UL, 201326592UL, 0UL,
+2185035776UL, 1245380608UL, 674693120UL, 407109632UL, 139132928UL, 5177344UL,
+ 5373952UL, 5636096UL, 6294784UL, 2435710976UL, 1059454976UL, 623050752UL,
+ 354680832UL, 153485312UL, 1966080UL, 1900544UL, 2228224UL, 3080192UL,
+1963982848UL, 1057816576UL, 672071680UL, 420478976UL, 218955776UL, 50331648UL,
+ 0UL, 786432UL, 1310720UL, 1426063360UL, 1006632960UL, 704643072UL,
+ 419430400UL, 285213184UL, 167772160UL, 16777216UL, 0UL, 0UL,
+1275068416UL, 1006632960UL, 738197504UL, 536870912UL, 335544320UL, 201326592UL,
+ 83886080UL, 0UL, 0UL, 1342177280UL, 1006632960UL, 805306368UL,
+ 603979776UL, 419430400UL, 234881024UL, 134217728UL, 16777216UL, 0UL,
+1543503872UL, 1056964608UL, 822083584UL, 637534208UL, 469762048UL, 318767104UL,
+ 150994944UL, 50331648UL, 0UL, 1895825408UL, 1107296256UL, 922746880UL,
+ 771751936UL, 637534208UL, 469762048UL, 285212672UL, 117440512UL, 0UL,
+3288334336UL, 1392508928UL, 1023410176UL, 855638016UL, 704643072UL, 553648128UL,
+ 385875968UL, 218103808UL, 0UL, 2033516544UL, 1160642560UL, 792068096UL,
+ 541261824UL, 256376832UL, 39124992UL, 5701632UL, 6029312UL, 6684672UL,
+2166882304UL, 1008533504UL, 622526464UL, 387710976UL, 169541632UL, 18808832UL,
+ 1835008UL, 2031616UL, 3276800UL, 1812594688UL, 1023410176UL, 603979776UL,
+ 402653184UL, 218103808UL, 50331648UL, 0UL, 0UL, 1310720UL,
+1526726656UL, 1023410176UL, 721420288UL, 452984832UL, 301989888UL, 150994944UL,
+ 16777216UL, 0UL, 0UL, 1375731712UL, 1006632960UL, 754974720UL,
+ 553648128UL, 335544320UL, 201326592UL, 83886080UL, 0UL, 0UL,
+1325400064UL, 989855744UL, 788529152UL, 603979776UL, 419430400UL, 251658240UL,
+ 134217728UL, 16777216UL, 0UL, 1476395008UL, 1056964608UL, 838860800UL,
+ 654311424UL, 503316480UL, 318767104UL, 150994944UL, 50331648UL, 0UL,
+1895825408UL, 1124073472UL, 939524096UL, 754974720UL, 620756992UL, 469762048UL,
+ 285212672UL, 100663296UL, 0UL, 3355443200UL, 1459617792UL, 1006632960UL,
+ 855638016UL, 721420288UL, 603979776UL, 419430400UL, 251658240UL, 0UL,
+2050097152UL, 1345191936UL, 942800896UL, 675479552UL, 408027136UL, 123404288UL,
+ 5963776UL, 6422528UL, 6881280UL, 1948385280UL, 890437632UL, 605290496UL,
+ 404094976UL, 236453888UL, 51904512UL, 1572864UL, 2162688UL, 3407872UL,
+1795162112UL, 956301312UL, 553648128UL, 369098752UL, 218103808UL, 67108864UL,
+ 0UL, 0UL, 1245184UL, 1644167168UL, 1023410176UL, 721420288UL,
+ 469762048UL, 318767104UL, 167772160UL, 16777216UL, 0UL, 0UL,
+1577058304UL, 1040187392UL, 788529152UL, 570425344UL, 385875968UL, 234881024UL,
+ 83886080UL, 0UL, 0UL, 1509949440UL, 1056964608UL, 838860800UL,
+ 637534208UL, 452984832UL, 251658240UL, 117440512UL, 16777216UL, 0UL,
+1509949440UL, 1073741824UL, 838860800UL, 671088640UL, 503316480UL, 318767104UL,
+ 167772160UL, 33554432UL, 0UL, 1895825408UL, 1124073472UL, 922746880UL,
+ 754974720UL, 587202560UL, 436207616UL, 268435456UL, 33554432UL, 0UL,
+3388997632UL, 1526726656UL, 1006632960UL, 838860800UL, 671088640UL, 553648128UL,
+ 419430400UL, 251658240UL, 0UL, 2016280576UL, 1664221184UL, 1346240512UL,
+ 995360768UL, 643629056UL, 341704704UL, 140705792UL, 23134208UL, 6881280UL,
+2132803584UL, 856489984UL, 621805568UL, 454426624UL, 286982144UL, 102432768UL,
+ 1441792UL, 1900544UL, 3538944UL, 2063597568UL, 905969664UL, 536870912UL,
+ 385875968UL, 234881024UL, 117440512UL, 0UL, 655360UL, 1179648UL,
+1979711488UL, 1023410176UL, 687865856UL, 452984832UL, 318767104UL, 167772160UL,
+ 33554432UL, 0UL, 0UL, 1962934272UL, 1107296256UL, 822083584UL,
+ 603979776UL, 402653184UL, 251658240UL, 67108864UL, 0UL, 0UL,
+1929379840UL, 1140850688UL, 872415232UL, 654311424UL, 469762048UL, 268435456UL,
+ 117440512UL, 0UL, 0UL, 1895825408UL, 1157627904UL, 905969664UL,
+ 704643072UL, 503316480UL, 335544320UL, 150994944UL, 33554432UL, 0UL,
+2030043136UL, 1174405120UL, 922746880UL, 754974720UL, 553648128UL, 385875968UL,
+ 218103808UL, 67108864UL, 0UL, 3439329280UL, 1577058304UL, 1006632960UL,
+ 822083584UL, 637534208UL, 503316480UL, 352321536UL, 201326592UL, 0UL,
+1865285632UL, 2033319936UL, 2017591296UL, 1700331520UL, 1164181504UL, 711131136UL,
+ 459538432UL, 225116160UL, 6291456UL, 2199322624UL, 1108738048UL, 773455872UL,
+ 623509504UL, 455999488UL, 305201152UL, 154402816UL, 36700160UL, 3014656UL,
+2667577344UL, 1090519040UL, 570425344UL, 402653184UL, 251658240UL, 117440512UL,
+ 16777216UL, 0UL, 0UL, 2969567232UL, 1191182336UL, 704643072UL,
+ 436207616UL, 285212672UL, 167772160UL, 33554432UL, 0UL, 0UL,
+3170893824UL, 1342177280UL, 889192448UL, 620756992UL, 402653184UL, 251658240UL,
+ 83886080UL, 0UL, 0UL, 3271557120UL, 1442840576UL, 973078528UL,
+ 738197504UL, 520093696UL, 335544320UL, 167772160UL, 0UL, 0UL,
+3355443200UL, 1509949440UL, 1006632960UL, 805306368UL, 570425344UL, 402653184UL,
+ 201326592UL, 50331648UL, 0UL, 3422552064UL, 1560281088UL, 1040187392UL,
+ 822083584UL, 620756992UL, 436207616UL, 251658240UL, 83886080UL, 0UL,
+3489660928UL, 1711276032UL, 1073741824UL, 805306368UL, 620756992UL, 436207616UL,
+ 285212672UL, 134217728UL, 0
+};
+uint32_t ulMapDJ690_ClMlxx[ 9 * 9 * 9 ]=
+// DJ690_ClMlxx
+{
+ 0UL, 988160UL, 2242048UL, 4611328UL, 5341952UL, 5871616UL,
+ 5937408UL, 5671424UL, 5528064UL, 2036480UL, 3948288UL, 6779392UL,
+ 5597696UL, 5207040UL, 7057152UL, 6992128UL, 6860800UL, 6332928UL,
+ 5190656UL, 6178560UL, 7304448UL, 8222208UL, 5007616UL, 7057408UL,
+ 10153472UL, 8443904UL, 7652352UL, 6115072UL, 6113792UL, 5529088UL,
+ 5990656UL, 5662720UL, 5736704UL, 6872064UL, 8580864UL, 9892096UL,
+ 3887360UL, 3366400UL, 3042816UL, 3501568UL, 3960320UL, 3829504UL,
+ 4171008UL, 4903680UL, 6808832UL, 2249728UL, 1731840UL, 1478400UL,
+ 1543424UL, 2260480UL, 2718720UL, 2589184UL, 2808576UL, 3855616UL,
+ 1072384UL, 688384UL, 441088UL, 373248UL, 761344UL, 1412608UL,
+ 1609472UL, 1619712UL, 2152960UL, 292864UL, 41472UL, 57344UL,
+ 55040UL, 53760UL, 312576UL, 632832UL, 767744UL, 915712UL,
+ 49408UL, 51712UL, 60160UL, 60928UL, 60416UL, 58624UL,
+ 55808UL, 53760UL, 58880UL, 597248UL, 2176256UL, 3496192UL,
+ 4875520UL, 5734656UL, 5935360UL, 6002944UL, 5275136UL, 5069568UL,
+ 2632192UL, 6326784UL, 8163328UL, 5664256UL, 5601792UL, 8573952UL,
+ 8310272UL, 7783168UL, 7124480UL, 4866560UL, 7764992UL, 9082624UL,
+ 8289280UL, 4941568UL, 8307456UL, 9697792UL, 10087680UL, 9951232UL,
+ 6381312UL, 5529344UL, 5137152UL, 5598464UL, 5333760UL, 5541888UL,
+ 5949440UL, 7397376UL, 8321024UL, 3956224UL, 3171328UL, 2780416UL,
+ 2912512UL, 3370240UL, 3238912UL, 3649536UL, 4045312UL, 5167616UL,
+ 2454272UL, 1678592UL, 1224192UL, 1289984UL, 1614080UL, 2002176UL,
+ 1742592UL, 2468352UL, 3326464UL, 1414144UL, 638464UL, 313344UL,
+ 248832UL, 312576UL, 638720UL, 964608UL, 828928UL, 1686016UL,
+ 698624UL, 48128UL, 50944UL, 53248UL, 51712UL, 50944UL,
+ 180992UL, 244992UL, 312576UL, 47616UL, 51968UL, 57856UL,
+ 59904UL, 58624UL, 57856UL, 56576UL, 59904UL, 60672UL,
+ 1727488UL, 2906112UL, 4613888UL, 5140480UL, 6131712UL, 6264320UL,
+ 5933824UL, 4749312UL, 4219392UL, 4279296UL, 6452992UL, 9082880UL,
+ 5795328UL, 6720768UL, 8898048UL, 9032448UL, 8373760UL, 7123200UL,
+ 5988352UL, 9147392UL, 10662656UL, 6847488UL, 5269504UL, 9155584UL,
+ 10146304UL, 10415616UL, 10022400UL, 5990656UL, 6189312UL, 5926400UL,
+ 5795840UL, 5398528UL, 5737472UL, 6072320UL, 6800640UL, 6939904UL,
+ 3960064UL, 3566336UL, 3171584UL, 3042048UL, 3237632UL, 3174656UL,
+ 3705600UL, 3777536UL, 4246016UL, 2462464UL, 2003200UL, 1607936UL,
+ 1411840UL, 1477632UL, 1675520UL, 1606144UL, 2328832UL, 2861568UL,
+ 1481216UL, 953088UL, 491520UL, 231680UL, 166144UL, 427264UL,
+ 754176UL, 818432UL, 1350144UL, 762112UL, 167424UL, 37120UL,
+ 40192UL, 39424UL, 41472UL, 38144UL, 102144UL, 39424UL,
+ 40960UL, 41216UL, 43008UL, 47616UL, 49152UL, 48384UL,
+ 47616UL, 46336UL, 44800UL, 3890176UL, 5201152UL, 6052864UL,
+ 5790208UL, 5993216UL, 6591488UL, 6333440UL, 5473536UL, 4156416UL,
+ 6186240UL, 6449408UL, 7105024UL, 5988352UL, 7304448UL, 8817664UL,
+ 9019392UL, 8763136UL, 7780352UL, 7496192UL, 8024832UL, 7042304UL,
+ 6647808UL, 6646016UL, 9928704UL, 10855168UL, 11451392UL, 9688320UL,
+ 6910208UL, 6714368UL, 6649600UL, 6913792UL, 5724416UL, 6256640UL,
+ 6782464UL, 7249152UL, 7520768UL, 4091904UL, 4025088UL, 3825408UL,
+ 3691776UL, 3560192UL, 3828992UL, 4027648UL, 3899136UL, 4235264UL,
+ 2716672UL, 2388224UL, 2125312UL, 1862912UL, 1798912UL, 1929728UL,
+ 2125056UL, 2256896UL, 2590464UL, 1602304UL, 1141760UL, 813056UL,
+ 550144UL, 419840UL, 485888UL, 813824UL, 748032UL, 1144064UL,
+ 751104UL, 224768UL, 26624UL, 28416UL, 29184UL, 30720UL,
+ 29184UL, 93952UL, 29184UL, 30976UL, 30976UL, 31232UL,
+ 33792UL, 35328UL, 37376UL, 37376UL, 35328UL, 33280UL,
+ 5782272UL, 6700800UL, 7356416UL, 6242048UL, 7091968UL, 7228160UL,
+ 6385408UL, 5869056UL, 4821504UL, 6505728UL, 6833920UL, 7620352UL,
+ 6965248UL, 7688960UL, 9918976UL, 9662720UL, 8816640UL, 8036096UL,
+ 9129984UL, 8474880UL, 7295232UL, 7426816UL, 8082944UL, 10640128UL,
+ 11301376UL, 10258688UL, 9608704UL, 8344832UL, 7755264UL, 7558656UL,
+ 7099648UL, 6901504UL, 6772736UL, 7364608UL, 8221184UL, 9344256UL,
+ 4344576UL, 4345344UL, 4214272UL, 4083456UL, 4412928UL, 4413696UL,
+ 4546048UL, 4349952UL, 4880384UL, 2839808UL, 2643200UL, 2511360UL,
+ 2381056UL, 2316288UL, 2249984UL, 2578688UL, 2448384UL, 2649344UL,
+ 1660928UL, 1266688UL, 1135104UL, 1069824UL, 938752UL, 873984UL,
+ 1005312UL, 1005056UL, 1138688UL, 742912UL, 283904UL, 152320UL,
+ 21504UL, 21504UL, 23808UL, 23040UL, 87808UL, 23040UL,
+ 23040UL, 23808UL, 23040UL, 24832UL, 25600UL, 27904UL,
+ 28416UL, 27136UL, 25856UL, 7480832UL, 8333056UL, 8923648UL,
+ 7088640UL, 7545600UL, 8199168UL, 7091200UL, 6246144UL, 5269760UL,
+ 8137984UL, 8989952UL, 9907712UL, 9318144UL, 9972736UL, 10435328UL,
+ 10635264UL, 9984768UL, 8416512UL, 11154688UL, 11744768UL, 11220480UL,
+ 11220736UL, 10957824UL, 11091456UL, 11424256UL, 12344576UL, 10185728UL,
+ 8731392UL, 8207104UL, 8076032UL, 7813376UL, 7813632UL, 7355392UL,
+ 7947776UL, 8738560UL, 10119680UL, 5126912UL, 5192704UL, 5060864UL,
+ 5192192UL, 5257216UL, 4930304UL, 5063424UL, 5130752UL, 5987584UL,
+ 2962432UL, 2831616UL, 2765568UL, 2765824UL, 2634752UL, 2832384UL,
+ 3096576UL, 3163904UL, 3298560UL, 1784576UL, 1457408UL, 1392128UL,
+ 1392384UL, 1457664UL, 1392128UL, 1326336UL, 1392384UL, 1658880UL,
+ 801792UL, 409600UL, 343808UL, 212992UL, 278272UL, 147712UL,
+ 148224UL, 213504UL, 18176UL, 16128UL, 17920UL, 17664UL,
+ 17920UL, 18688UL, 20224UL, 21760UL, 21760UL, 20480UL,
+ 9245952UL, 10163712UL, 10098944UL, 8133120UL, 7410688UL, 8325632UL,
+ 8850176UL, 7087104UL, 5977344UL, 10164736UL, 11933696UL, 12130304UL,
+ 11606272UL, 11409664UL, 12262656UL, 12070656UL, 10501632UL, 9191680UL,
+ 13836288UL, 12918784UL, 12263168UL, 12263424UL, 11673344UL, 11739648UL,
+ 11811328UL, 12601088UL, 11028992UL, 9315584UL, 8529152UL, 8332288UL,
+ 7938560UL, 8004096UL, 7675392UL, 8334848UL, 9256960UL, 10571008UL,
+ 5973248UL, 5645824UL, 5580288UL, 5514240UL, 5448960UL, 5580032UL,
+ 5449728UL, 5911040UL, 6767872UL, 3810304UL, 3614464UL, 3679744UL,
+ 3482880UL, 3679744UL, 3614208UL, 3613952UL, 3682048UL, 4209920UL,
+ 1777408UL, 1646080UL, 1580544UL, 1646336UL, 1712128UL, 1646848UL,
+ 1910272UL, 1911552UL, 2374144UL, 862208UL, 600320UL, 535552UL,
+ 469760UL, 469760UL, 469248UL, 469504UL, 403456UL, 668160UL,
+ 10496UL, 11520UL, 12544UL, 12544UL, 12544UL, 12800UL,
+ 14336UL, 15616UL, 14336UL, 10946304UL, 11077376UL, 10160896UL,
+ 8325888UL, 7013888UL, 7602176UL, 8060928UL, 8586240UL, 7410432UL,
+ 11799552UL, 14288896UL, 14157824UL, 13240832UL, 12716544UL, 13043712UL,
+ 14028544UL, 12133888UL, 10102784UL, 14880512UL, 13307392UL, 12520192UL,
+ 13176320UL, 12848640UL, 13176320UL, 12980992UL, 11677440UL, 12071680UL,
+ 10293504UL, 8851712UL, 8589312UL, 8589056UL, 8458240UL, 8523520UL,
+ 8983296UL, 9775616UL, 11024384UL, 6492928UL, 5968640UL, 5968640UL,
+ 5968896UL, 5968640UL, 6099968UL, 5968128UL, 6562048UL, 7417088UL,
+ 4198656UL, 3871232UL, 4002304UL, 4002816UL, 4068352UL, 4199424UL,
+ 4068096UL, 4266240UL, 4663296UL, 2494464UL, 2232832UL, 2167552UL,
+ 2167808UL, 2167808UL, 2167808UL, 2429696UL, 2429952UL, 3023360UL,
+ 790016UL, 658432UL, 660480UL, 658432UL, 658432UL, 658432UL,
+ 658688UL, 856576UL, 1252608UL, 5376UL, 6144UL, 6400UL,
+ 7168UL, 7168UL, 6656UL, 5888UL, 7424UL, 7424UL,
+ 11599872UL, 11272192UL, 10092544UL, 7995392UL, 6619136UL, 6750208UL,
+ 6946816UL, 6946816UL, 8912896UL, 14155776UL, 15073280UL, 14090240UL,
+ 11796480UL, 11206656UL, 11075584UL, 11599872UL, 12582912UL, 12910592UL,
+ 16646144UL, 15335424UL, 15335424UL, 15532032UL, 15466496UL, 15663104UL,
+ 16580608UL, 16711680UL, 16711680UL, 11993088UL, 10027008UL, 10027008UL,
+ 10158080UL, 9961472UL, 10027008UL, 10616832UL, 11337728UL, 12124160UL,
+ 7471104UL, 6553600UL, 6553600UL, 6619136UL, 6946816UL, 6619136UL,
+ 6750208UL, 7471104UL, 8388608UL, 4718592UL, 4390912UL, 4521984UL,
+ 4587520UL, 4784128UL, 5177344UL, 4784128UL, 4718592UL, 5636096UL,
+ 3014656UL, 2752512UL, 2686976UL, 2883584UL, 2818048UL, 3080192UL,
+ 3276800UL, 3080192UL, 3670016UL, 1441792UL, 1179648UL, 1114112UL,
+ 1048576UL, 1048576UL, 1179648UL, 1376256UL, 1638400UL, 1966080UL,
+ 0UL, 0UL, 0UL, 0UL, 0UL, 0UL,
+ 0UL, 0UL, 0UL,
+};
+
+APDK_END_NAMESPACE
diff --git a/prnt/hpijs/dj6xx.cpp b/prnt/hpijs/dj6xx.cpp
new file mode 100644
index 0000000..88c6704
--- /dev/null
+++ b/prnt/hpijs/dj6xx.cpp
@@ -0,0 +1,84 @@
+/*****************************************************************************\
+ dj6xx.cpp : Implimentation for the DJ6XX class
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#if defined(APDK_DJ540) || defined(APDK_DJ600) || defined(APDK_DJ6xx)
+
+#include "header.h"
+#include "dj6xx.h"
+
+//#include "printerproxy.h"
+
+APDK_BEGIN_NAMESPACE
+//
+// ** DJ6xx:Printer CLASS **
+//
+
+DJ6XX::DJ6XX(SystemServices* pSS,
+ int numfonts, BOOL proto)
+ : Printer(pSS, numfonts, proto)
+{
+ DBG1("DJ6XX constructor called, colormap pending\n");
+}
+
+
+
+Header6XX::Header6XX(Printer* p,PrintContext* pc)
+ : Header(p,pc)
+{ }
+
+DRIVER_ERROR Header6XX::Send()
+{ DRIVER_ERROR err;
+
+ StartSend();
+
+ err = thePrinter->Send((const BYTE*)BlackExtractOff,
+ sizeof(BlackExtractOff)); // just pertains to 2-pen
+ ERRCHECK;
+
+ err = ConfigureRasterData();
+ ERRCHECK;
+
+ if (ResolutionY[0] == 600)
+ {
+ char uom[10];
+ sprintf(uom,"%c%c%c%d%c",ESC,'&','u',thePrintMode->ResolutionY[K],'D');
+ err=thePrinter->Send((const BYTE*)uom, 7 );
+ ERRCHECK;
+ }
+
+ err=Graphics(); // start raster graphics and set compression mode
+
+return err;
+}
+
+APDK_END_NAMESPACE
+
+#endif //APDK_DJ650 || APDK_DJ600 || APDK_DJ6xx
diff --git a/prnt/hpijs/dj6xx.h b/prnt/hpijs/dj6xx.h
new file mode 100644
index 0000000..7fd8172
--- /dev/null
+++ b/prnt/hpijs/dj6xx.h
@@ -0,0 +1,94 @@
+/*****************************************************************************\
+ dj6xx.h : Interface for the DJ6XX class
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#ifndef APDK_DJ6XX_H
+#define APDK_DJ6XX_H
+
+APDK_BEGIN_NAMESPACE
+
+/*!
+\internal
+*/
+class DJ6XX : public Printer
+{
+public:
+
+ DJ6XX(SystemServices* pSS, int numfonts, BOOL proto = FALSE);
+ virtual BOOL GetMargins (PAPER_SIZE ps, float *fMargins)
+ {
+ if (ps == A4)
+ fMargins[0] = (float) 0.135;
+ else
+ fMargins[0] = (float) 0.25; // Left Margin
+ fMargins[1] = fMargins[0]; // Right Margin
+ fMargins[2] = (float) 0.125; // Top Margin
+ fMargins[3] = (float) 0.67; // Bottom Margin
+
+ return TRUE;
+ }
+
+#ifdef APDK_HP_UX
+protected:
+ virtual DJ6XX & operator = (Printer& rhs)
+ {
+ return *this;
+ }
+#endif
+
+}; //DJ6XX
+
+
+// there are no printers directly supported by DJ6XX - so we don't need a proxy.
+//! DJ6XXProxy
+/*!
+******************************************************************************/
+/*
+static class DJ6XXProxy : public PrinterProxy
+{
+public:
+ DJ6XXProxy() : PrinterProxy(
+ "DeskJet 600 series printers",
+ "DESKJET 66\0"
+ "DESKJET 67\0"
+ "DESKJET 68\0"
+ "DESKJET 6\0"
+ "e-printer e20\0"
+#ifdef APDK_MLC_PRINTER
+ "Deskjet 78\0"
+#endif
+ ) {}
+ inline Printer* CreatePrinter(SystemServices* pSS) const { return new DJ6XX(pSS); }
+} DJ6XXProxy;
+*/
+
+APDK_END_NAMESPACE
+
+#endif //APDK_DJ6XX_H
diff --git a/prnt/hpijs/dj850.cpp b/prnt/hpijs/dj850.cpp
new file mode 100644
index 0000000..566d42c
--- /dev/null
+++ b/prnt/hpijs/dj850.cpp
@@ -0,0 +1,417 @@
+/*****************************************************************************\
+ dj850.cpp : Implimentation for the DJ850 class
+
+ Copyright (c) 1996 - 2002, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+#if defined(APDK_DJ850)
+
+#include "header.h"
+#include "io_defs.h"
+#include "dj850.h"
+#include "printerproxy.h"
+
+APDK_BEGIN_NAMESPACE
+extern BYTE* GetHT3x3_4();
+extern BYTE* GetHT6x6_4();
+APDK_END_NAMESPACE
+
+APDK_BEGIN_NAMESPACE
+
+extern uint32_t ulMapDJ600_CCM_K[ 9 * 9 * 9 ];
+extern uint32_t ulMapDJ850_Normal_KCMY[9 * 9 * 9];
+extern uint32_t ulMapDJ600_CCM_K[ 9 * 9 * 9 ];
+extern uint32_t ulMapGRAY_K_6x6x1[9 * 9 * 9];
+
+DJ850Mode1::DJ850Mode1() // Normal Color
+: PrintMode(ulMapDJ850_Normal_KCMY)
+// 600x600x1 K
+// 300x300x2 CMY
+{
+ ColorDepth[K]=1; // 600x600x1 K
+
+ for (int i=1; i < 4; i++)
+ ColorDepth[i]=2; // 300x300x2 CMY
+
+ ResolutionX[K]=ResolutionY[K]=600;
+ MixedRes = TRUE;
+
+ ColorFEDTable = GetHT3x3_4();
+
+}
+
+DJ850Mode3::DJ850Mode3() // Draft Color
+: PrintMode(ulMapDJ850_Normal_KCMY)
+// 300x300x1 KCMY
+{
+ theQuality = qualityDraft;
+ pmQuality = QUALITY_DRAFT;
+}
+
+DJ850Mode4::DJ850Mode4() // Draft Gray K
+: GrayMode(ulMapDJ600_CCM_K)
+// 300x300x1 K
+{
+ theQuality = qualityDraft;
+ pmQuality = QUALITY_DRAFT;
+}
+
+DJ850Mode5::DJ850Mode5() // Normal Gray K
+: GrayMode(ulMapGRAY_K_6x6x1)
+// 600x600x1 K
+{
+ BaseResX = BaseResY = 600;
+ ResolutionX[K]=ResolutionY[K]=600;
+}
+
+DJ850::DJ850(SystemServices* pSS,
+ int numfonts, BOOL proto)
+ : Printer(pSS, numfonts, proto)
+{
+ if ((!proto) && (IOMode.bDevID))
+ {
+ constructor_error = VerifyPenInfo();
+ CERRCHECK;
+ }
+ else ePen=BOTH_PENS; // matches default mode
+
+ pMode[GRAYMODE_INDEX] = new DJ850Mode5 (); // Normal Gray K
+ pMode[DEFAULTMODE_INDEX] = new DJ850Mode1 (); // Normal Color
+ pMode[SPECIALMODE_INDEX] = new DJ850Mode3 (); // Draft Color
+ pMode[SPECIALMODE_INDEX+1] = new DJ850Mode4 (); // Draft Gray K
+ ModeCount = 4;
+
+ CMYMap = ulMapDJ850_Normal_KCMY;
+
+ DBG1("DJ850 created\n");
+}
+
+Header850::Header850(Printer* p,PrintContext* pc)
+ : Header895(p,pc)
+{ }
+
+Header* DJ850::SelectHeader(PrintContext* pc)
+{
+ return new Header850(this,pc);
+}
+
+DRIVER_ERROR Header850::StartSend()
+// common items gathered for code savings
+{
+ DRIVER_ERROR err;
+
+ err = thePrinter->Send((const BYTE*)Reset,sizeof(Reset));
+ ERRCHECK;
+#if 0
+ err = thePrinter->Send((const BYTE*)UEL,sizeof(UEL));
+ ERRCHECK;
+
+ err = thePrinter->Send((const BYTE*)EnterLanguage,sizeof(EnterLanguage));
+ ERRCHECK;
+
+ if (!thePrinter->UseGUIMode(thePrintContext->CurrentMode))
+ err = thePrinter->Send((const BYTE*)PCL3,sizeof(PCL3));
+ else
+ err = thePrinter->Send((const BYTE*)PCLGUI,sizeof(PCLGUI));
+ ERRCHECK;
+
+ err = thePrinter->Send((const BYTE*)&LF,1);
+ ERRCHECK;
+#endif
+ err=Modes(); // Set media source, type, size and quality modes.
+ ERRCHECK;
+
+// Now send media pre-load command
+ err = thePrinter->Send ((const BYTE *) "\033&l-2H", 6);
+ ERRCHECK;
+
+ char uom[10];
+ sprintf(uom,"%c%c%c%d%c",ESC,'&','u',thePrintContext->EffectiveResolutionY(),'D');
+ err=thePrinter->Send((const BYTE*)uom, strlen (uom));
+ ERRCHECK;
+
+ if (!thePrinter->UseGUIMode(thePrintContext->CurrentMode))
+ err=Margins(); // set margins
+
+ else // special GUI mode top margin set
+ {
+ CAPy = thePrintContext->GUITopMargin();
+ }
+
+ return err;
+}
+
+DRIVER_ERROR DJ850::VerifyPenInfo()
+{
+
+ DRIVER_ERROR err = NO_ERROR;
+
+ if(IOMode.bDevID == FALSE)
+ {
+ return err;
+ }
+
+ err = ParsePenInfo(ePen);
+
+ ERRCHECK;
+
+ // check for the normal case
+ if (ePen == BOTH_PENS)
+ {
+ return NO_ERROR;
+ }
+
+ while ( ePen != BOTH_PENS )
+ {
+
+ switch (ePen)
+ {
+ case BLACK_PEN:
+ // black pen installed, need to install color pen
+ pSS->DisplayPrinterStatus(DISPLAY_NO_COLOR_PEN);
+ break;
+ case COLOR_PEN:
+ // color pen installed, need to install black pen
+ pSS->DisplayPrinterStatus(DISPLAY_NO_BLACK_PEN);
+ break;
+ case NO_PEN:
+ // neither pen installed
+ default:
+ pSS->DisplayPrinterStatus(DISPLAY_NO_PENS);
+ break;
+ }
+
+ if (pSS->BusyWait(500) == JOB_CANCELED)
+ {
+ return JOB_CANCELED;
+ }
+
+ err = ParsePenInfo(ePen);
+ ERRCHECK;
+ }
+
+ pSS->DisplayPrinterStatus(DISPLAY_PRINTING);
+
+ return NO_ERROR;
+}
+
+DRIVER_ERROR DJ850::ParsePenInfo(PEN_TYPE& ePen, BOOL QueryPrinter)
+{
+ char* str;
+ DRIVER_ERROR err = SetPenInfo (str, QueryPrinter);
+ ERRCHECK;
+
+ if (*str != '$')
+ {
+ return BAD_DEVICE_ID;
+ }
+
+ // parse penID
+ PEN_TYPE temp_pen1;
+ // check pen1, assume it is black, pen2 is color
+ switch (str[1])
+ {
+ case 'H': // (H)obbes
+ case 'L': // (L)inus
+ case 'Z': // (Z)orro
+ {
+ temp_pen1 = BLACK_PEN;
+ break;
+ }
+ case 'X': return UNSUPPORTED_PEN;
+ default: temp_pen1 = NO_PEN; break;
+ }
+
+ // now check pen2
+
+ int i = 2;
+ while ((i < DevIDBuffSize) && str[i] != '$') i++; // handles variable length penIDs
+ if (i == DevIDBuffSize)
+ {
+ return BAD_DEVICE_ID;
+ }
+
+ i++;
+
+ // Check for (M)onet color pen, note (X)Undefined, (A)Missing.
+ if(str[i] == 'M')
+ // check what pen1 was
+ {
+ if (temp_pen1 == BLACK_PEN)
+ {
+ ePen = BOTH_PENS;
+ }
+ else
+ {
+ ePen = COLOR_PEN;
+ }
+ }
+ else // no color pen, just set what pen1 was
+ {
+ ePen = temp_pen1;
+ }
+
+ return NO_ERROR;
+}
+
+
+Compressor* DJ850::CreateCompressor(unsigned int RasterSize)
+{
+ DBG1("Compression = Mode2\n");
+ return new Mode2(pSS,RasterSize);
+}
+
+BOOL DJ850::UseGUIMode(PrintMode* pPrintMode)
+{
+ return (!pPrintMode->bFontCapable);
+}
+
+
+/*
+ * Function name: ParseError
+ *
+ * Owner: Darrell Walker
+ *
+ * Purpose: To determine what error state the printer is in.
+ *
+ * Called by: Send()
+ *
+ * Parameters on entry: status_reg is the contents of the centronics
+ * status register (at the time the error was
+ * detected)
+ *
+ * Parameters on exit: unchanged
+ *
+ * Return Values: The proper DISPLAY_STATUS to reflect the printer
+ * error state.
+ *
+ */
+
+/* We have to override the base class's (Printer) ParseError function due
+ to the fact that the 8XX series returns a status byte of F8 when it's out of
+ paper. Unfortunately, the 600 series returns F8 when they're turned off.
+ The way things are structured in Printer::ParseError, we used to check only
+ for DEVICE_IS_OOP. This would return true even if we were connected to a
+ 600 series printer that was turned off, causing the Out of paper status
+ message to be displayed. This change also reflects a corresponding change
+ in IO_defs.h, where I split DEVICE_IS_OOP into DEVICE_IS_OOP, DJ400_IS_OOP, and
+ DJ8XX_IS_OOP and we now check for DJ8XX_IS_OOP in the DJ8xx class's
+ ParseError function below. 05/11/99 DGC.
+*/
+
+DISPLAY_STATUS DJ850::ParseError(BYTE status_reg)
+{
+ DBG1("DJ850: parsing error info\n");
+
+ DRIVER_ERROR err = NO_ERROR;
+ BYTE DevIDBuffer[DevIDBuffSize];
+
+ if(IOMode.bDevID)
+ {
+ // If a bi-di cable was plugged in and everything was OK, let's see if it's still
+ // plugged in and everything is OK
+ err = pSS->GetDeviceID(DevIDBuffer, DevIDBuffSize, TRUE);
+ if(err != NO_ERROR)
+ // job was bi-di but now something's messed up, probably cable unplugged
+ return DISPLAY_COMM_PROBLEM;
+
+ if ( TopCoverOpen(status_reg) )
+ {
+ DBG1("Top Cover Open\n");
+ return DISPLAY_TOP_COVER_OPEN;
+ }
+
+ // VerifyPenInfo will handle prompting the user
+ // if this is a problem
+ err = VerifyPenInfo();
+
+ if(err != NO_ERROR)
+ // VerifyPenInfo returned an error, which can only happen when ToDevice
+ // or GetDeviceID returns an error. Either way, it's BAD_DEVICE_ID or
+ // IO_ERROR, both unrecoverable. This is probably due to the printer
+ // being turned off during printing, resulting in us not being able to
+ // power it back on in VerifyPenInfo, since the buffer still has a
+ // partial raster in it and we can't send the power-on command.
+ return DISPLAY_COMM_PROBLEM;
+ }
+
+ // check for errors we can detect from the status reg
+ if (IOMode.bStatus)
+ {
+ if ( DEVICE_IS_OOP(status_reg) )
+ {
+ DBG1("Out Of Paper\n");
+ return DISPLAY_OUT_OF_PAPER;
+ }
+
+ if (DEVICE_PAPER_JAMMED(status_reg))
+ {
+ DBG1("Paper Jammed\n");
+ return DISPLAY_PAPER_JAMMED;
+ }
+
+ if (DEVICE_IO_TRAP(status_reg))
+ {
+ DBG1("IO trap\n");
+ return DISPLAY_ERROR_TRAP;
+ }
+ }
+
+ // don't know what the problem is-
+ // Is the PrinterAlive?
+ if (pSS->PrinterIsAlive())
+ {
+ iTotal_SLOW_POLL_Count += iMax_SLOW_POLL_Count;
+#if defined(DEBUG) && (DBG_MASK & DBG_LVL1)
+ printf("iTotal_SLOW_POLL_Count = %d\n",iTotal_SLOW_POLL_Count);
+#endif
+ // -Note that iTotal_SLOW_POLL_Count is a multiple of
+ // iMax_SLOW_POLL_Count allowing us to check this
+ // on an absolute time limit - not relative to the number
+ // of times we happen to have entered ParseError.
+ // -Also note that we have different thresholds for uni-di & bi-di.
+ if(
+ ((IOMode.bDevID == FALSE) && (iTotal_SLOW_POLL_Count >= 60)) ||
+ ((IOMode.bDevID == TRUE) && (iTotal_SLOW_POLL_Count >= 120))
+ )
+ {
+ return DISPLAY_BUSY;
+ }
+ else
+ {
+ return DISPLAY_PRINTING;
+ }
+ }
+ else
+ {
+ return DISPLAY_COMM_PROBLEM;
+ }
+}
+
+APDK_END_NAMESPACE
+
+#endif // defined APDK_DJ850
diff --git a/prnt/hpijs/dj850.h b/prnt/hpijs/dj850.h
new file mode 100644
index 0000000..a1d63f2
--- /dev/null
+++ b/prnt/hpijs/dj850.h
@@ -0,0 +1,114 @@
+/*****************************************************************************\
+ dj850.h : Interface for the DJ850 class
+
+ Copyright (c) 1996 - 2002, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#ifndef APDK_DJ850_H
+#define APDK_DJ850_H
+
+APDK_BEGIN_NAMESPACE
+
+//extern char *ModelString[MAX_ID_STRING];
+
+/*!
+\internal
+*/
+class DJ850 : public Printer
+{
+public:
+ DJ850(SystemServices* pSS,int numfonts=0, BOOL proto=FALSE);
+
+ virtual Header* SelectHeader(PrintContext* pc);
+ virtual DRIVER_ERROR VerifyPenInfo();
+ virtual DRIVER_ERROR ParsePenInfo(PEN_TYPE& ePen, BOOL QueryPrinter=TRUE);
+ virtual DISPLAY_STATUS ParseError(BYTE status_reg);
+
+ Compressor* CreateCompressor(unsigned int RasterSize);
+
+ virtual BOOL UseGUIMode(PrintMode* pPrintMode);
+
+#ifdef APDK_HP_UX
+protected:
+ virtual DJ850 & operator = (Printer& rhs)
+ {
+ return *this;
+ }
+#endif
+
+}; //DJ850
+
+
+class DJ850Mode1 : public PrintMode
+{
+public:
+ DJ850Mode1();
+}; //DJ850Mode1
+
+class DJ850Mode3 : public PrintMode
+{
+public:
+ DJ850Mode3();
+}; //DJ850Mode3
+
+class DJ850Mode4 : public GrayMode
+{
+public:
+ DJ850Mode4();
+}; //DJ850Mode4
+
+class DJ850Mode5 : public GrayMode
+{
+public:
+ DJ850Mode5();
+}; //DJ850Mode5
+
+#if defined(APDK_DJ850)
+//! DJ850Proxy
+/*!
+******************************************************************************/
+class DJ850Proxy : public PrinterProxy
+{
+public:
+ DJ850Proxy() : PrinterProxy(
+ "DJ850", // family name
+ "DESKJET 85\0" // DeskJet 85x Series
+ "DESKJET 87\0" // DeskJet 87x Series
+#ifdef APDK_MLC_PRINTER
+ "OFFICEJET PRO 115\0" // OfficeJet PRO 1150
+#endif
+ ) {m_iPrinterType = eDJ850;}
+ inline Printer* CreatePrinter(SystemServices* pSS) const { return new DJ850(pSS); }
+ inline PRINTER_TYPE GetPrinterType() const { return eDJ850;}
+ inline unsigned int GetModelBit() const { return 0x8;}
+};
+#endif
+
+APDK_END_NAMESPACE
+
+#endif //APDK_DJ850_H
diff --git a/prnt/hpijs/dj850_maps.cpp b/prnt/hpijs/dj850_maps.cpp
new file mode 100644
index 0000000..6948533
--- /dev/null
+++ b/prnt/hpijs/dj850_maps.cpp
@@ -0,0 +1,163 @@
+/*****************************************************************************\
+ dj850_maps.cpp : Color maps for DJ850/855,870
+
+ Copyright (c) 1996 - 2002, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+#include "config.h"
+
+#include "global_types.h"
+
+APDK_BEGIN_NAMESPACE
+
+uint32_t ulMapDJ850_Normal_KCMY[ 9*9*9 ]=
+{
+1263225855UL, 12238176UL, 12629804UL, 13018654UL, 12694544UL, 11909632UL,
+ 10659840UL, 8955392UL, 6992896UL, 3087054194UL, 151053696UL, 6344002UL,
+ 9549090UL, 10727177UL, 10460416UL, 9736448UL, 9078528UL, 7899136UL,
+3288373052UL, 1879098177UL, 319208266UL, 2856756UL, 4950554UL, 6194948UL,
+ 6914304UL, 7502848UL, 7568128UL, 3372255013UL, 2667623458UL, 1258336554UL,
+ 218339638UL, 1212970UL, 2652433UL, 4029184UL, 5143552UL, 5995520UL,
+3540027412UL, 3070273808UL, 2013313045UL, 906012700UL, 151031338UL, 819489UL,
+ 1800202UL, 2978560UL, 4028416UL, 3640691978UL, 3338709252UL, 2566961664UL,
+1476442629UL, 654353681UL, 100699422UL, 491796UL, 1275908UL, 2257408UL,
+3590361856UL, 3321928704UL, 2483067904UL, 1728094720UL, 1006674432UL, 453023497UL,
+ 67144466UL, 427016UL, 1080064UL, 3540028672UL, 3170929920UL, 2365622016UL,
+1778421760UL, 1157664256UL, 671125504UL, 318804997UL, 50368008UL, 427776UL,
+3422586112UL, 2868936448UL, 2315288064UL, 1828750592UL, 1258324480UL, 822116864UL,
+ 520130048UL, 251696128UL, 38656UL, 2327904398UL, 15214693UL, 14771766UL,
+ 14449440UL, 13604369UL, 12297472UL, 11117312UL, 9348608UL, 7386880UL,
+2835814548UL, 505290396UL, 108031044UL, 60460574UL, 10723333UL, 9867264UL,
+ 8683776UL, 8290560UL, 6981376UL, 3271575886UL, 1510363734UL, 201547106UL,
+ 2779452UL, 4618269UL, 5604356UL, 6126336UL, 6322944UL, 5997824UL,
+3338687537UL, 2181259313UL, 1023437877UL, 218129981UL, 1074733UL, 2583569UL,
+ 3633664UL, 4356352UL, 4555008UL, 3472906782UL, 2566940189UL, 1560310301UL,
+ 771780640UL, 201353768UL, 484896UL, 1598984UL, 2583040UL, 3241216UL,
+3741343760UL, 2818598668UL, 1929408518UL, 1207989512UL, 620784908UL, 218130708UL,
+ 26384UL, 1009408UL, 1797120UL, 3925894916UL, 2919261952UL, 2113956096UL,
+1409314048UL, 905997568UL, 520121600UL, 218131461UL, 26880UL, 619264UL,
+4026559744UL, 2734711040UL, 2080399616UL, 1476421120UL, 1006659328UL, 704669952UL,
+ 419458304UL, 167800576UL, 30208UL, 3976228096UL, 2868931584UL, 2214620160UL,
+1610641408UL, 1124102144UL, 805335552UL, 553678848UL, 318798848UL, 33280UL,
+2730688596UL, 720830540UL, 16718132UL, 16729624UL, 15623173UL, 13398784UL,
+ 12289280UL, 11244544UL, 9281536UL, 3192390501UL, 1012795246UL, 59449934UL,
+ 11094818UL, 11494405UL, 10118912UL, 9266944UL, 8744192UL, 7697152UL,
+2819034461UL, 1308888178UL, 149UL, 3355457UL, 5196832UL, 6118660UL,
+ 6119424UL, 6187520UL, 5732352UL, 2835556922UL, 1761619265UL, 822095945UL,
+ 100678220UL, 1656112UL, 2839569UL, 3760128UL, 4024832UL, 3831040UL,
+2986358565UL, 2080389417UL, 1358970921UL, 721439014UL, 167790122UL, 674590UL,
+ 1659142UL, 2251264UL, 2582272UL, 3221241624UL, 2281717525UL, 1677739537UL,
+1107316493UL, 604000524UL, 218123280UL, 20750UL, 874240UL, 1466368UL,
+3523233036UL, 2533377540UL, 1828734976UL, 1308642816UL, 872436224UL, 520114432UL,
+ 218124032UL, 21760UL, 418816UL, 4127215360UL, 2667595776UL, 1929399040UL,
+1426084096UL, 1006654464UL, 704664576UL, 419452672UL, 167794432UL, 24576UL,
+4278210816UL, 2986365440UL, 2130728192UL, 1509971968UL, 1073765632UL, 771775744UL,
+ 553672192UL, 318792448UL, 27136UL, 3149594669UL, 1692467256UL, 369033261UL,
+ 16717077UL, 16724224UL, 15024128UL, 13586176UL, 12411136UL, 11433472UL,
+3596877886UL, 1836975165UL, 412287810UL, 11083301UL, 11875336UL, 10632960UL,
+ 9652224UL, 9326336UL, 9067264UL, 3122922309UL, 1781007185UL, 506331229UL,
+ 4591430UL, 6302496UL, 7355652UL, 7096320UL, 6967040UL, 6575872UL,
+2617510212UL, 1610614609UL, 771753054UL, 110UL, 2171185UL, 3421201UL,
+ 4146688UL, 4412416UL, 4349184UL, 2684558380UL, 1879055921UL, 1258299700UL,
+ 620765750UL, 100674100UL, 1061661UL, 1982216UL, 2443264UL, 2445824UL,
+2969576732UL, 2164271133UL, 1577069850UL, 1023422742UL, 570439956UL, 167786774UL,
+ 408080UL, 1065472UL, 1265408UL, 3338677520UL, 2332044812UL, 1761620741UL,
+1308637440UL, 872431360UL, 520110080UL, 201341956UL, 16132UL, 283136UL,
+3841995781UL, 2583704576UL, 1962948352UL, 1426079488UL, 1023427328UL, 721438208UL,
+ 419448320UL, 167789312UL, 18688UL, 4278204928UL, 3019913728UL, 2164276992UL,
+1560299008UL, 1107314944UL, 805326336UL, 570445312UL, 318787072UL, 20992UL,
+3283157026UL, 2295136294UL, 1039204384UL, 184483866UL, 16715013UL, 16720128UL,
+ 15216128UL, 14039296UL, 13191168UL, 3698524201UL, 2273837861UL, 966393897UL,
+ 111280172UL, 11868170UL, 11019520UL, 10104832UL, 9844480UL, 9911552UL,
+3644588076UL, 2269446194UL, 1028325432UL, 224067641UL, 6885920UL, 7481092UL,
+ 7484160UL, 7682304UL, 7749376UL, 2971140913UL, 2031681593UL, 1176240190UL,
+ 371327042UL, 3148340UL, 4333841UL, 4731648UL, 5192192UL, 5194496UL,
+2617443889UL, 1778386490UL, 1124074557UL, 553648962UL, 76UL, 1579296UL,
+ 2566152UL, 3028736UL, 3162112UL, 2818577184UL, 2063602978UL, 1459623969UL,
+ 956307745UL, 503323424UL, 117448480UL, 796434UL, 1388544UL, 1588224UL,
+3170900754UL, 2264931856UL, 1677730060UL, 1224746249UL, 822093832UL, 469773576UL,
+ 151006474UL, 208389UL, 473600UL, 3791659270UL, 2483037184UL, 1912612608UL,
+1459629312UL, 1023422720UL, 721433600UL, 419444480UL, 167785472UL, 14080UL,
+4278200064UL, 2885691136UL, 2214603520UL, 1660957440UL, 1174419712UL, 855653376UL,
+ 570441728UL, 352337920UL, 16896UL, 3349479445UL, 2780889109UL, 1692663828UL,
+ 771686417UL, 167706634UL, 16714240UL, 16586752UL, 15408896UL, 14821120UL,
+3749052442UL, 2542403605UL, 1369047065UL, 513998872UL, 10878998UL, 11080960UL,
+ 10624000UL, 10232832UL, 10692352UL, 3930652700UL, 2521890849UL, 1331298338UL,
+ 577372193UL, 7143457UL, 7738628UL, 7872768UL, 8071168UL, 8268544UL,
+3391423265UL, 2334654501UL, 1462763560UL, 725155880UL, 155189286UL, 4919056UL,
+ 5381888UL, 5777408UL, 6106624UL, 2920218661UL, 2064384045UL, 1360003117UL,
+ 806748205UL, 253296684UL, 2361632UL, 3217672UL, 3745536UL, 3944448UL,
+2768240677UL, 1962935337UL, 1308623913UL, 855639081UL, 452984874UL, 46UL,
+ 1184533UL, 1842944UL, 2239232UL, 3070233878UL, 2181042197UL, 1577063185UL,
+1124078353UL, 771757330UL, 402658836UL, 100669716UL, 466694UL, 862720UL,
+3741324550UL, 2466256900UL, 1828722944UL, 1358961664UL, 1023418112UL, 704651776UL,
+ 402662656UL, 151004160UL, 11008UL, 4278196480UL, 2734693120UL, 2080381952UL,
+1677730048UL, 1224746752UL, 872426240UL, 570437632UL, 352334080UL, 13056UL,
+3483369481UL, 3048538117UL, 2228420616UL, 1391919110UL, 687800320UL, 184483840UL,
+ 16712704UL, 16387840UL, 15734016UL, 3799711756UL, 2727149577UL, 1637613576UL,
+ 883228678UL, 312868870UL, 11011072UL, 10489856UL, 10426368UL, 11278592UL,
+4082368528UL, 2673344529UL, 1533083664UL, 879886348UL, 326303756UL, 7537670UL,
+ 8065792UL, 8460544UL, 8723200UL, 3845193748UL, 2570321942UL, 1664745493UL,
+ 927137810UL, 424411153UL, 5177358UL, 5771776UL, 6363392UL, 6757888UL,
+3474653205UL, 2367225882UL, 1629356057UL, 1025769496UL, 506069014UL, 120586262UL,
+ 3738629UL, 4331520UL, 4726528UL, 3171680281UL, 2215182368UL, 1510604830UL,
+1024262172UL, 604962844UL, 202506268UL, 1771026UL, 2429696UL, 2956800UL,
+3120562201UL, 2164261913UL, 1526727704UL, 1056965654UL, 671089689UL, 369098780UL,
+ 33UL, 855816UL, 1448704UL, 3640658441UL, 2382368009UL, 1728057093UL,
+1258295301UL, 905973765UL, 620761605UL, 318771206UL, 67113734UL, 400384UL,
+4278194176UL, 2734690816UL, 1912607488UL, 1459623168UL, 1207965696UL, 922753792UL,
+ 603986944UL, 318775040UL, 9472UL, 3550609408UL, 3283025920UL, 2798059520UL,
+2128871424UL, 1442775040UL, 822018048UL, 335478784UL, 16711680UL, 16713472UL,
+3883466752UL, 2995650560UL, 2023489536UL, 1235353600UL, 665583616UL, 263061504UL,
+ 10878976UL, 10488832UL, 11603200UL, 4200005637UL, 2824929280UL, 1785331712UL,
+1115160576UL, 578551808UL, 209584128UL, 8127488UL, 8457984UL, 8917504UL,
+4281794568UL, 2788950022UL, 1883439109UL, 1112276992UL, 626327552UL, 257359872UL,
+ 6095616UL, 6557696UL, 6951680UL, 4079026185UL, 2736914442UL, 1881669641UL,
+1227882502UL, 708182021UL, 322764804UL, 4194304UL, 4787456UL, 5182720UL,
+3977445385UL, 2618490893UL, 1880489996UL, 1259929609UL, 807272457UL, 421658633UL,
+ 103219208UL, 3016960UL, 3543552UL, 3741909002UL, 2433089553UL, 1762066446UL,
+1225326605UL, 805961741UL, 470614030UL, 151977998UL, 1573893UL, 1970176UL,
+3875536905UL, 2382365450UL, 1728054281UL, 1224737801UL, 822084361UL, 553648906UL,
+ 301989901UL, 18UL, 789760UL, 4278191872UL, 2919237888UL, 1929382400UL,
+1358957568UL, 1023413504UL, 771755776UL, 520097536UL, 251662080UL, 4864UL,
+3500539904UL, 3450535936UL, 3149398016UL, 2748448768UL, 2179465216UL, 1593769984UL,
+1023344640UL, 486473728UL, 16711680UL, 3934126080UL, 2978414592UL, 2174156800UL,
+1587478528UL, 1085145088UL, 716636160UL, 381550592UL, 113311744UL, 12779520UL,
+4283957248UL, 2942369792UL, 1835794432UL, 1232797696UL, 814022656UL, 461897728UL,
+ 176881664UL, 9240576UL, 9633792UL, 4282122240UL, 3024093184UL, 2068512768UL,
+1213464576UL, 777912320UL, 425787392UL, 124125184UL, 7077888UL, 7864320UL,
+4280745984UL, 2938765312UL, 2133852160UL, 1429798912UL, 859766784UL, 507904000UL,
+ 206241792UL, 5505024UL, 6160384UL, 4279828480UL, 2870673408UL, 2082340864UL,
+1428291584UL, 958922752UL, 573374464UL, 271777792UL, 3735552UL, 4521984UL,
+4279238656UL, 3020947456UL, 2115108864UL, 1427439616UL, 1008074752UL, 655949824UL,
+ 320602112UL, 69337088UL, 2949120UL, 4278648832UL, 3121020928UL, 2164719616UL,
+1426522112UL, 973668352UL, 654966784UL, 369885184UL, 151846912UL, 1572864UL,
+4278190080UL, 3187671040UL, 2113929216UL, 1459617792UL, 1006632960UL, 704643072UL,
+ 452984832UL, 218103808UL, 0UL
+};
+
+APDK_END_NAMESPACE
diff --git a/prnt/hpijs/dj890.cpp b/prnt/hpijs/dj890.cpp
new file mode 100644
index 0000000..86822c3
--- /dev/null
+++ b/prnt/hpijs/dj890.cpp
@@ -0,0 +1,78 @@
+/*****************************************************************************\
+ dj890.cpp : Implimentation for the DJ890 class
+
+ Copyright (c) 1996 - 2002, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+#if defined(APDK_DJ890)
+
+#include "header.h"
+#include "io_defs.h"
+#include "dj8xx.h"
+#include "dj890.h"
+#include "printerproxy.h"
+
+APDK_BEGIN_NAMESPACE
+
+extern uint32_t ulMapDJ895_Binary_KCMY[ 9 * 9 * 9 ];
+extern uint32_t ulMapDJ600_CCM_K[9 * 9 * 9 ];
+
+DJ890::DJ890(SystemServices* pSS,
+ int numfonts, BOOL proto)
+ : DJ8xx(pSS, numfonts, proto)
+{
+
+ if ((!proto) && (IOMode.bDevID))
+ {
+ constructor_error = VerifyPenInfo();
+ CERRCHECK;
+ }
+ else ePen=BOTH_PENS; // matches default mode
+
+#ifdef APDK_EXTENDED_MEDIASIZE
+ pMode[GRAYMODE_INDEX] = new DJ895Mode5 (); // Normal Gray K
+#else
+ pMode[GRAYMODE_INDEX] = new GrayMode (ulMapDJ600_CCM_K); // Normal Gray K
+#endif
+ pMode[DEFAULTMODE_INDEX] = new DJ895Mode1 (); // Normal Color
+ pMode[SPECIALMODE_INDEX] = new DJ895Mode3 (); // Draft Color
+ pMode[SPECIALMODE_INDEX+1] = new DJ895Mode4 (); // Draft Gray K
+ ModeCount = 4;
+
+ CMYMap = ulMapDJ895_Binary_KCMY;
+
+ DBG1("DJ890 created\n");
+}
+
+Header* DJ890::SelectHeader(PrintContext* pc)
+{
+ return new Header895(this,pc);
+}
+
+APDK_END_NAMESPACE
+
+#endif // defined APDK_DJ890
diff --git a/prnt/hpijs/dj890.h b/prnt/hpijs/dj890.h
new file mode 100644
index 0000000..5a7132e
--- /dev/null
+++ b/prnt/hpijs/dj890.h
@@ -0,0 +1,70 @@
+/*****************************************************************************\
+ dj890.h : Interface for the DJ890 class
+
+ Copyright (c) 1996 - 2002, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#ifndef APDK_DJ890_H
+#define APDK_DJ890_H
+
+APDK_BEGIN_NAMESPACE
+
+/*!
+\internal
+*/
+class DJ890 : public DJ8xx
+{
+public:
+ DJ890(SystemServices* pSS,int numfonts=0, BOOL proto=FALSE);
+ virtual Header *SelectHeader (PrintContext *pc);
+
+}; //DJ890
+
+#if defined(APDK_DJ890)
+//! DJ890Proxy
+/*!
+******************************************************************************/
+class DJ890Proxy : public PrinterProxy
+{
+public:
+ DJ890Proxy() : PrinterProxy(
+ "DJ890", // family name
+ "DESKJET 890\0" // DeskJet 890
+#ifdef APDK_MLC_PRINTER
+ "OFFICEJET PRO 117\0" // OfficeJet PRO 117
+#endif
+ ) {m_iPrinterType = eDJ890;}
+ inline Printer* CreatePrinter(SystemServices* pSS) const { return new DJ890(pSS); }
+ inline PRINTER_TYPE GetPrinterType() const { return eDJ890;}
+ inline unsigned int GetModelBit() const { return 0x4;}
+};
+#endif
+
+APDK_END_NAMESPACE
+
+#endif //APDK_DJ890_H
diff --git a/prnt/hpijs/dj895_maps.cpp b/prnt/hpijs/dj895_maps.cpp
new file mode 100644
index 0000000..ed9ad98
--- /dev/null
+++ b/prnt/hpijs/dj895_maps.cpp
@@ -0,0 +1,123 @@
+/*****************************************************************************\
+ dj895_maps.cpp : Color maps for DJ895
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#include "config.h"
+
+#include "global_types.h"
+
+APDK_BEGIN_NAMESPACE
+
+uint32_t ulMapDJ895_KCMY[ 9*9*9 ]=
+{
+1819176703UL, 79494215UL, 112983330UL, 79035667UL, 78183948UL, 60489224UL, 59571718UL, 42007811UL, 7405312UL,
+4230922555UL, 655358293UL, 176553263UL, 128253208UL, 61209869UL, 60751368UL, 26606852UL, 9305345UL, 8650496UL,
+4248940299UL, 3776766759UL, 756415798UL, 308083743UL, 142671120UL, 59440646UL, 9239553UL, 9109248UL, 8779520UL,
+4248086274UL, 4214276619UL, 2786390812UL, 942206231UL, 491516427UL, 224131588UL, 6616320UL, 7399168UL, 7857664UL,
+4264010752UL, 4247302401UL, 4011647240UL, 2148919051UL, 993059843UL, 507241472UL, 138274048UL, 4837888UL, 5950720UL,
+4262961664UL, 4246251520UL, 4229221122UL, 3239632384UL, 1763828224UL, 723902208UL, 304536064UL, 2674688UL, 3916800UL,
+4278952960UL, 4245530112UL, 4245339136UL, 3641362432UL, 2265566208UL, 1108008960UL, 437574912UL, 119069440UL, 2280192UL,
+4278233600UL, 4211122944UL, 4278235392UL, 3825252352UL, 2785196032UL, 1677774080UL, 738253824UL, 302835968UL, 1039616UL,
+4278236928UL, 4278234112UL, 4278234368UL, 3942690560UL, 3204492544UL, 2281749504UL, 1359008000UL, 620816128UL, 65280UL,
+3422292824UL, 536567352UL, 217763358UL, 133298706UL, 47578636UL, 46333448UL, 11795717UL, 11009281UL, 9365504UL,
+4252790811UL, 1819700817UL, 230487086UL, 112721175UL, 61734412UL, 60882438UL, 9829634UL, 9043712UL, 7992832UL,
+4233393664UL, 4064522015UL, 1346225965UL, 528017689UL, 126482957UL, 25951492UL, 8978176UL, 8648448UL, 7924992UL,
+4248074240UL, 4231703558UL, 3409695758UL, 1430441485UL, 811653892UL, 308602880UL, 6545664UL, 7133696UL, 7395840UL,
+4263805952UL, 4264010752UL, 4028613125UL, 2553530624UL, 1245367297UL, 524010752UL, 54051840UL, 4767488UL, 5883136UL,
+4279601152UL, 4245789184UL, 4161583616UL, 2886710016UL, 1544795648UL, 689813504UL, 253801216UL, 2600448UL, 3780608UL,
+4245129216UL, 4211118848UL, 3942687488UL, 3036717056UL, 2013308416UL, 1023652608UL, 369865216UL, 68201984UL, 2205952UL,
+4278225408UL, 3791685632UL, 3456142080UL, 3003157760UL, 2365624576UL, 1509989376UL, 755018496UL, 167817216UL, 897024UL,
+4278227456UL, 3456141056UL, 3288369152UL, 3019933952UL, 2617281536UL, 1979749120UL, 1224778496UL, 587248896UL, 48640UL,
+4143384622UL, 1744640554UL, 519916828UL, 184397586UL, 50262795UL, 64486664UL, 14285826UL, 12842496UL, 10868224UL,
+4255729162UL, 3084330804UL, 569604134UL, 251059983UL, 98368262UL, 13040899UL, 11861760UL, 10745856UL, 9232896UL,
+4250816512UL, 4135742478UL, 2223998487UL, 1253754887UL, 228518406UL, 9499904UL, 8974336UL, 8383744UL, 7593472UL,
+4248392704UL, 4249515008UL, 3461321226UL, 2172105475UL, 879538176UL, 191088128UL, 6606080UL, 7000064UL, 6868992UL,
+4280572928UL, 4264064512UL, 3928660994UL, 2402325760UL, 1195023616UL, 490381056UL, 54176256UL, 4829184UL, 5683456UL,
+4279723264UL, 4262689024UL, 3926823168UL, 2702347776UL, 1629131520UL, 723292928UL, 253662208UL, 2594816UL, 3842560UL,
+4278676224UL, 4278220032UL, 3674242816UL, 2785051136UL, 1845527040UL, 990088448UL, 403214336UL, 34442752UL, 2069504UL,
+4278219264UL, 3741346560UL, 3120591104UL, 2701161984UL, 2147514624UL, 1426095872UL, 755010048UL, 184585728UL, 692224UL,
+4278220544UL, 3439356672UL, 2952818944UL, 2667607552UL, 2298509056UL, 1795193088UL, 1157661440UL, 587239936UL, 37632UL,
+4259653128UL, 2868776476UL, 1174216726UL, 519914253UL, 134125065UL, 16439296UL, 15459328UL, 13752320UL, 11977728UL,
+4273417220UL, 3891139612UL, 1375215645UL, 418995213UL, 49524481UL, 14866176UL, 13754624UL, 12442880UL, 10931968UL,
+4269093120UL, 4221780741UL, 3066452487UL, 1153592327UL, 280338688UL, 10863360UL, 10408704UL, 9688832UL, 8900864UL,
+4265753600UL, 4250487808UL, 3530710787UL, 1954444800UL, 813005824UL, 174693632UL, 6993152UL, 7062272UL, 6931456UL,
+4280828416UL, 4247604224UL, 3946407424UL, 2470209280UL, 1262513408UL, 507607040UL, 54495744UL, 4955392UL, 5549056UL,
+4263135488UL, 4263006720UL, 4028065024UL, 2686019584UL, 1629382400UL, 773942784UL, 253850368UL, 2851072UL, 3969280UL,
+4245245184UL, 4211101952UL, 3842006784UL, 2701156864UL, 1829069568UL, 1023961088UL, 403467008UL, 814336UL, 2195200UL,
+4278211840UL, 3892335360UL, 3238024960UL, 2617270528UL, 2046846208UL, 1392534784UL, 721447424UL, 184577536UL, 684544UL,
+4160773120UL, 3506459648UL, 3003144704UL, 2566939392UL, 2181064448UL, 1694524928UL, 1124100608UL, 570455040UL, 29696UL,
+4276100357UL, 3573419536UL, 1895633680UL, 939336200UL, 452802307UL, 16152576UL, 15248896UL, 14072320UL, 12693248UL,
+4257226242UL, 4159906309UL, 2281312784UL, 905585670UL, 217727746UL, 15105792UL, 14331392UL, 13745920UL, 12433664UL,
+4287243264UL, 4256376834UL, 3403102720UL, 1557018882UL, 449465600UL, 12156160UL, 12298752UL, 11779072UL, 10665472UL,
+4283377152UL, 4268043520UL, 3582212864UL, 1988114432UL, 797067776UL, 142174720UL, 8163072UL, 8431872UL, 8107264UL,
+4264307712UL, 4265030400UL, 3745725441UL, 2420391680UL, 1196049920UL, 491344896UL, 38169088UL, 5277952UL, 5676800UL,
+4263261184UL, 4263393280UL, 3827318784UL, 2703311360UL, 1646610176UL, 807947008UL, 220681216UL, 3237376UL, 4160768UL,
+4245371392UL, 4245110016UL, 3876012288UL, 2835956992UL, 1879722240UL, 1057835776UL, 420433920UL, 34690304UL, 2385920UL,
+4278206208UL, 3959438848UL, 3372236800UL, 2701149696UL, 2046840064UL, 1375751936UL, 721441024UL, 184570880UL, 744448UL,
+4076880896UL, 3456122880UL, 3019916032UL, 2634042112UL, 2181059840UL, 1660966656UL, 1157650176UL, 587225856UL, 23808UL,
+4275835907UL, 4043119616UL, 2784892929UL, 1358829315UL, 603855360UL, 150741248UL, 15621120UL, 14257152UL, 12949760UL,
+4274394113UL, 4227209216UL, 3069974272UL, 1375344384UL, 335157248UL, 15411712UL, 14508800UL, 14062848UL, 13083392UL,
+4271446016UL, 4223538689UL, 3234600704UL, 1690966528UL, 550379520UL, 12791808UL, 12872192UL, 12949248UL, 12297984UL,
+4284291584UL, 4268891136UL, 3448184064UL, 2038897664UL, 898441472UL, 160182784UL, 9593344UL, 10258944UL, 9870848UL,
+4265024512UL, 4265484288UL, 3628671744UL, 2370708224UL, 1330915328UL, 458502656UL, 5458688UL, 6451456UL, 6785536UL,
+4280427008UL, 4263715584UL, 3727172864UL, 2552701952UL, 1580018176UL, 758065920UL, 237976064UL, 3625472UL, 4484608UL,
+4245628160UL, 4245563136UL, 3708758272UL, 2735614720UL, 1863331328UL, 1041445376UL, 437531904UL, 35077376UL, 2708224UL,
+4278201344UL, 3992988672UL, 3355454464UL, 2717920768UL, 2063610624UL, 1308636928UL, 687879936UL, 167786752UL, 869888UL,
+3774886912UL, 3288346624UL, 2919247872UL, 2566927616UL, 2181053440UL, 1660961536UL, 1140868096UL, 603997696UL, 18176UL,
+4258860033UL, 4160293632UL, 3170699520UL, 1660750336UL, 738069504UL, 201198336UL, 16192256UL, 14632192UL, 13398784UL,
+4257745665UL, 4226745857UL, 3220308480UL, 1609499648UL, 519046912UL, 15404032UL, 14622976UL, 14045184UL, 13400832UL,
+4255321344UL, 4173399296UL, 3082880256UL, 1841497856UL, 734464512UL, 63245568UL, 12986368UL, 13195264UL, 12812800UL,
+4251717120UL, 4219341568UL, 3213428736UL, 2055866880UL, 1016073472UL, 261492480UL, 10496256UL, 11098624UL, 11239936UL,
+4248834304UL, 4249227520UL, 3477868032UL, 2337542144UL, 1331368192UL, 526325248UL, 6497280UL, 7885312UL, 8549376UL,
+4280685824UL, 4247196672UL, 3542750208UL, 2536379136UL, 1614091776UL, 808916992UL, 205005312UL, 4472320UL, 5463552UL,
+4279637504UL, 4229240832UL, 3490911488UL, 2635339520UL, 1779897856UL, 974723328UL, 505355520UL, 1910528UL, 3097600UL,
+4194310144UL, 4060092672UL, 3405781504UL, 2684361472UL, 1962941440UL, 1241652992UL, 654582016UL, 184951552UL, 1192960UL,
+3590333184UL, 3154125056UL, 2818580992UL, 2466259712UL, 2080384512UL, 1593846528UL, 1073753856UL, 570437632UL, 12800UL,
+4208197632UL, 4227006464UL, 3506110464UL, 2113470464UL, 955777024UL, 402457344UL, 33358080UL, 15994112UL, 14235904UL,
+4291166208UL, 3956736000UL, 3151429632UL, 2044329984UL, 903675904UL, 249626624UL, 14485504UL, 14096128UL, 13712896UL,
+4289003520UL, 3836936192UL, 2947678208UL, 2109079552UL, 1035796480UL, 281018368UL, 12716544UL, 13114880UL, 13190656UL,
+4201906176UL, 3900702720UL, 2978611200UL, 2139881472UL, 1217462272UL, 412418048UL, 10356992UL, 11543296UL, 12013056UL,
+4249355008UL, 4081647616UL, 3209887744UL, 2254045184UL, 1365114880UL, 610533888UL, 74187776UL, 8725504UL, 9588224UL,
+4247389696UL, 4180346112UL, 3425633280UL, 2486436864UL, 1631192064UL, 842925568UL, 222365696UL, 5447936UL, 6702592UL,
+4279634432UL, 4145482496UL, 3373664256UL, 2585331456UL, 1797064704UL, 1025509632UL, 472124416UL, 2561536UL, 3945984UL,
+4278651648UL, 4077259776UL, 3355707904UL, 2667908096UL, 1963395840UL, 1225263872UL, 638193152UL, 370546176UL, 1713152UL,
+3858764288UL, 3321893376UL, 2868908800UL, 2432701184UL, 2013271552UL, 1526732288UL, 1006639104UL, 520100096UL, 7168UL,
+4293197824UL, 4293918720UL, 3673292800UL, 2616262656UL, 1492058112UL, 770834432UL, 334888960UL, 100335616UL, 16711680UL,
+4223860736UL, 3602972672UL, 3066298368UL, 2395668480UL, 1422917632UL, 684982272UL, 249036800UL, 14352384UL, 14417920UL,
+4020436992UL, 3517448192UL, 2896822272UL, 2309947392UL, 1488191488UL, 716767232UL, 247267328UL, 12779520UL, 13107200UL,
+3799646208UL, 3431137280UL, 2878078976UL, 2291204096UL, 1586757632UL, 832176128UL, 262012928UL, 11010048UL, 11863296UL,
+3763470336UL, 3394633728UL, 2891972608UL, 2288648192UL, 1651310592UL, 963706880UL, 343343104UL, 8650752UL, 10160896UL,
+3912433664UL, 3442802688UL, 2956591104UL, 2403467264UL, 1766326272UL, 1078722560UL, 474939392UL, 5767168UL, 7539712UL,
+4162584576UL, 3692888064UL, 3005218816UL, 2418212864UL, 1881604096UL, 1210843136UL, 590348288UL, 104071168UL, 4786688UL,
+4278779904UL, 3959422976UL, 3255238656UL, 2617769984UL, 1980366848UL, 1292828672UL, 688979968UL, 219348992UL, 2293760UL,
+4278190080UL, 3657433088UL, 3137339392UL, 2650800128UL, 2080374784UL, 1509949440UL, 922746880UL, 419430400UL, 0
+ }; //"Thu Aug 27 02:33:34 PM"
+
+APDK_END_NAMESPACE
diff --git a/prnt/hpijs/dj895_maps2.cpp b/prnt/hpijs/dj895_maps2.cpp
new file mode 100644
index 0000000..399f034
--- /dev/null
+++ b/prnt/hpijs/dj895_maps2.cpp
@@ -0,0 +1,291 @@
+/*****************************************************************************\
+ dj895_maps2.cpp : Color maps for DJ895
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#include "config.h"
+
+#include "global_types.h"
+
+APDK_BEGIN_NAMESPACE
+
+uint32_t ulMapDJ895_HB_KCMY[ 9*9*9 ]=
+{
+4074819328UL, 2530213376UL, 1420754432UL, 764542464UL, 477822464UL, 258866688UL,
+ 124255744UL, 23264768UL, 6422016UL, 4268472064UL, 2576481792UL, 1451818496UL,
+ 696188416UL, 325975552UL, 90635776UL, 23199232UL, 6422016UL, 5963264UL,
+4265913856UL, 3410541056UL, 1582748416UL, 861327104UL, 391568128UL, 38991616UL,
+ 5499136UL, 5495552UL, 5432320UL, 4264013312UL, 3760827392UL, 2117316096UL,
+1094299136UL, 540849920UL, 138000128UL, 3845120UL, 4172800UL, 4302592UL,
+4263027968UL, 3541736704UL, 2367658752UL, 1428464896UL, 690402304UL, 304528896UL,
+ 19510272UL, 2989312UL, 3182848UL, 4262173952UL, 3540884224UL, 2568132864UL,
+1729534208UL, 1008117504UL, 437634048UL, 102284800UL, 2073088UL, 2395392UL,
+4144206848UL, 3540292608UL, 2634584320UL, 1930137856UL, 1309382912UL, 705408000UL,
+ 218677504UL, 17740032UL, 1606912UL, 3758130432UL, 3405810176UL, 2768406528UL,
+2114159872UL, 1510246912UL, 973444096UL, 503491584UL, 67226368UL, 756992UL,
+3355473152UL, 3187702272UL, 2634052352UL, 1761632000UL, 1308645376UL, 855659520UL,
+ 570449664UL, 318803200UL, 42752UL, 4275270912UL, 2650705152UL, 1241425664UL,
+ 499696640UL, 178647552UL, 9436672UL, 8060416UL, 7601664UL, 6749696UL,
+4270030336UL, 2643103488UL, 1452253696UL, 813809152UL, 376560384UL, 40304128UL,
+ 6422016UL, 6022144UL, 5886720UL, 4266102016UL, 3360591616UL, 1868010496UL,
+1012306944UL, 509124608UL, 123055616UL, 5286912UL, 5351680UL, 5286912UL,
+4264200192UL, 3190783488UL, 1966374400UL, 1178043136UL, 624659712UL, 221876480UL,
+ 3840256UL, 4036096UL, 4300032UL, 4263020544UL, 2971367936UL, 2115991296UL,
+1394768896UL, 757433600UL, 354781184UL, 36080896UL, 2852096UL, 3114240UL,
+4228614144UL, 2886564352UL, 2198829568UL, 1527936768UL, 957643776UL, 471172352UL,
+ 135692544UL, 1866752UL, 2257664UL, 3825369344UL, 2801954048UL, 2198040320UL,
+1594191104UL, 1124626688UL, 638153984UL, 235502080UL, 17659136UL, 1469696UL,
+3288363264UL, 2566939136UL, 2197840384UL, 1728079360UL, 1291872000UL, 805398784UL,
+ 436301056UL, 84047104UL, 681728UL, 3070257408UL, 2566938112UL, 2315280128UL,
+1862295808UL, 1442865408UL, 1040212224UL, 654336512UL, 302016768UL, 29440UL,
+4276114944UL, 2852018688UL, 1375623680UL, 618949888UL, 196379904UL, 10328832UL,
+ 9547264UL, 8769280UL, 7599872UL, 4270939648UL, 3130285312UL, 1654807040UL,
+ 848390400UL, 394623488UL, 24807424UL, 7180544UL, 6922240UL, 6400256UL,
+4266875392UL, 3545716992UL, 1969055232UL, 1012295424UL, 525826560UL, 122849280UL,
+ 5148416UL, 5148928UL, 5083392UL, 4264386304UL, 3123863296UL, 1966366464UL,
+1194877440UL, 658270976UL, 238711552UL, 3833344UL, 3965184UL, 4098048UL,
+4263142912UL, 2887605760UL, 2115984896UL, 1377984768UL, 757360384UL, 354707200UL,
+ 36007168UL, 2781440UL, 3110144UL, 3909905152UL, 2769117440UL, 2081251072UL,
+1427136256UL, 890461952UL, 454254848UL, 135553536UL, 1662720UL, 2187776UL,
+3540150528UL, 2684443904UL, 2080463104UL, 1493326336UL, 1023695360UL, 604396032UL,
+ 218586368UL, 17521920UL, 1334016UL, 3019923200UL, 2432717824UL, 2046841600UL,
+1560302592UL, 1174426880UL, 738219008UL, 402675456UL, 67197440UL, 611840UL,
+2885704192UL, 2399163136UL, 2046841088UL, 1677742592UL, 1325421056UL, 973099520UL,
+ 637555456UL, 302011392UL, 22528UL, 4276369664UL, 3036429312UL, 1543388928UL,
+ 788414720UL, 281760256UL, 28205568UL, 10056960UL, 9538816UL, 8493824UL,
+4271128064UL, 3079750656UL, 1737901312UL, 1049905152UL, 462246656UL, 42294016UL,
+ 8153344UL, 7435520UL, 6585344UL, 4267065600UL, 3076080896UL, 1834501632UL,
+1096501248UL, 526274304UL, 106780160UL, 5922304UL, 5794048UL, 5336320UL,
+4264771584UL, 3073918464UL, 2000242432UL, 1262439424UL, 692015360UL, 255612672UL,
+ 20668160UL, 3892736UL, 4025088UL, 4263332096UL, 2887731200UL, 2116110592UL,
+1411664640UL, 791039744UL, 371609344UL, 36131840UL, 2840832UL, 3104512UL,
+3758968832UL, 2769177088UL, 2047756544UL, 1410353664UL, 890456832UL, 454315008UL,
+ 135614208UL, 1724928UL, 2249984UL, 3355661056UL, 2634173184UL, 2046969856UL,
+1459832832UL, 973359360UL, 587614464UL, 235359232UL, 17517824UL, 1330688UL,
+2919256320UL, 2399159808UL, 1929397248UL, 1476412672UL, 1090536704UL, 721437952UL,
+ 402671616UL, 67193344UL, 542976UL, 2768260608UL, 2365605632UL, 1929397248UL,
+1560298496UL, 1224754176UL, 905986816UL, 603997184UL, 302007808UL, 18176UL,
+4275249664UL, 3202622464UL, 1810704128UL, 1005726208UL, 552152064UL, 113523712UL,
+ 10965248UL, 10183680UL, 9072384UL, 4270794240UL, 2928290048UL, 1905536256UL,
+1167339776UL, 630797056UL, 143735808UL, 8932864UL, 7689728UL, 7299328UL,
+4267321856UL, 2925210880UL, 1901932288UL, 1214329344UL, 644297984UL, 157694720UL,
+ 6375168UL, 5984256UL, 5789440UL, 4231605504UL, 2805739264UL, 1967075328UL,
+1346581248UL, 709309696UL, 239483136UL, 4538880UL, 4540928UL, 4477184UL,
+4263586560UL, 2888052480UL, 2166764032UL, 1462252544UL, 841560832UL, 388577536UL,
+ 53034752UL, 2836224UL, 3099904UL, 3977261568UL, 2802921728UL, 2115056128UL,
+1427321856UL, 907359232UL, 487995136UL, 135805440UL, 1851392UL, 2246400UL,
+3355785472UL, 2600744448UL, 2047096064UL, 1443116032UL, 956642304UL, 587675392UL,
+ 235419904UL, 17579264UL, 1327104UL, 3019915264UL, 2365601792UL, 1929393664UL,
+1459631360UL, 1056978176UL, 704656640UL, 385890304UL, 67188992UL, 473600UL,
+2684370944UL, 2231384576UL, 1862285056UL, 1493186048UL, 1157641984UL, 838874368UL,
+ 587216128UL, 302003712UL, 14592UL, 4275508224UL, 3488158976UL, 2130122240UL,
+1190599168UL, 704060672UL, 368517120UL, 63450368UL, 11289344UL, 10180096UL,
+4271117824UL, 2978814208UL, 2089884416UL, 1251221248UL, 714678528UL, 379265792UL,
+ 43068672UL, 8601344UL, 8015616UL, 4267645440UL, 2891848704UL, 2002853376UL,
+1298210560UL, 711533056UL, 325788672UL, 23538944UL, 6438144UL, 6244352UL,
+3913162240UL, 2772377344UL, 1967267840UL, 1346576896UL, 776479744UL, 340403200UL,
+ 21769216UL, 4929536UL, 4800512UL, 3542491136UL, 2636587264UL, 1999184384UL,
+1395335936UL, 841688064UL, 405742592UL, 36710656UL, 3354880UL, 3422464UL,
+4145356288UL, 2836734208UL, 2115379712UL, 1427514112UL, 957883392UL, 538649088UL,
+ 135997696UL, 1978112UL, 2373376UL, 3909624832UL, 2768708352UL, 2080777216UL,
+1443243008UL, 973546496UL, 604579328UL, 235612416UL, 929024UL, 1389056UL,
+3472960256UL, 2566924288UL, 1895835392UL, 1442850560UL, 1056974592UL, 687876096UL,
+ 369109248UL, 67185152UL, 535808UL, 2768252928UL, 2231381248UL, 1795173120UL,
+1459628544UL, 1157638912UL, 788539648UL, 553658624UL, 268445952UL, 11008UL,
+4275243520UL, 3841395200UL, 2415790592UL, 1342049024UL, 704515584UL, 385748736UL,
+ 167646208UL, 32318464UL, 11613952UL, 4271246080UL, 3079605248UL, 2173766912UL,
+1436094208UL, 765268480UL, 463606784UL, 228595200UL, 26485760UL, 9057536UL,
+4267970048UL, 2892041984UL, 1935609344UL, 1399066624UL, 761991936UL, 376247296UL,
+ 107812352UL, 7152640UL, 6763520UL, 3829666048UL, 2722304512UL, 1967395328UL,
+1346704128UL, 826938368UL, 407573760UL, 89069056UL, 5186304UL, 5189632UL,
+3542750208UL, 2603160576UL, 1965757440UL, 1361908992UL, 858658048UL, 472978944UL,
+ 104208384UL, 3744256UL, 3812352UL, 3608745216UL, 2484671744UL, 1830360320UL,
+1343821056UL, 924587520UL, 538842624UL, 153229312UL, 2366976UL, 2697216UL,
+4262138624UL, 2768901120UL, 1997149440UL, 1443566848UL, 1007359488UL, 621549568UL,
+ 336598528UL, 1187072UL, 1582336UL, 4261550080UL, 2717980416UL, 1962940416UL,
+1459624192UL, 1073748480UL, 687872512UL, 352393728UL, 50470144UL, 663808UL,
+3238010880UL, 2315263744UL, 1761615616UL, 1426071552UL, 1124081664UL, 771759616UL,
+ 503324160UL, 251665920UL, 8192UL, 4274521088UL, 4278059520UL, 2851996160UL,
+1576927488UL, 670957824UL, 285082368UL, 83756032UL, 33425664UL, 15865856UL,
+4271571968UL, 3079734016UL, 2325283584UL, 1604453376UL, 900269312UL, 531171328UL,
+ 313395456UL, 178719744UL, 9836032UL, 4268557568UL, 2892367104UL, 2087060480UL,
+1500185600UL, 930153728UL, 477300736UL, 192350208UL, 58002176UL, 7412480UL,
+4148758016UL, 2806384384UL, 2001143296UL, 1397294592UL, 944571904UL, 474875904UL,
+ 139593728UL, 5508096UL, 5380864UL, 3677161728UL, 2603354368UL, 1932331008UL,
+1362036736UL, 892340224UL, 523503616UL, 137955328UL, 3869952UL, 4201472UL,
+3759934208UL, 2518354688UL, 1830488576UL, 1327302912UL, 908003840UL, 555813376UL,
+ 186911232UL, 2756352UL, 2956032UL, 3909946368UL, 2399931136UL, 1728842496UL,
+1326254848UL, 940444416UL, 605096704UL, 269748992UL, 1576448UL, 1906688UL,
+4261677312UL, 2801993984UL, 1996622336UL, 1476528896UL, 1073875712UL, 687999744UL,
+ 369363968UL, 134613504UL, 791552UL, 4261416448UL, 2600472320UL, 1862275072UL,
+1426067968UL, 1124078336UL, 754979584UL, 486543872UL, 234885376UL, 4608UL,
+4275503104UL, 4277600256UL, 3204317184UL, 1946025984UL, 1040056320UL, 486408192UL,
+ 184418304UL, 83755008UL, 16646144UL, 4271243264UL, 3365142528UL, 2610757632UL,
+1974206464UL, 1253703680UL, 617545728UL, 349110272UL, 231407616UL, 12648448UL,
+4268687360UL, 3026780160UL, 2238382080UL, 1651310592UL, 1182072832UL, 612237312UL,
+ 327221248UL, 176226304UL, 8126464UL, 3829989376UL, 2840133632UL, 2118778880UL,
+1481375744UL, 1078853632UL, 609288192UL, 240517120UL, 72941568UL, 5832704UL,
+3073048576UL, 2687303680UL, 1999568896UL, 1395720192UL, 959578112UL, 607518720UL,
+ 238747648UL, 21037056UL, 4718592UL, 2719350784UL, 2316959744UL, 1797062656UL,
+1344143360UL, 908132352UL, 572653568UL, 254148608UL, 19595264UL, 3473408UL,
+2567307264UL, 1963458560UL, 1561001984UL, 1259143168UL, 923795456UL, 605224960UL,
+ 286654464UL, 18481152UL, 2359296UL, 3288334336UL, 2281766912UL, 1627521024UL,
+1275199488UL, 922943488UL, 604307456UL, 352780288UL, 50987008UL, 1179648UL,
+4261412864UL, 3019898880UL, 2080374784UL, 1560281088UL, 1207959552UL, 838860800UL,
+ 536870912UL, 234881024UL, 0
+};
+
+uint32_t ulMapDJ895_Binary_KCMY[ 9*9*9 ]=
+{
+1819176648UL, 64158794UL, 80805158UL, 80215318UL, 62389519UL, 61406730UL,
+ 60292615UL, 42401028UL, 7601920UL, 4230922301UL, 571406681UL, 160889651UL,
+ 113048859UL, 62717200UL, 45415944UL, 27917573UL, 10419457UL, 9238272UL,
+4248940557UL, 3743081259UL, 790296119UL, 325515810UL, 127007505UL, 27196678UL,
+ 10483712UL, 10286592UL, 9628672UL, 4248283651UL, 4214473229UL, 2871125529UL,
+1077076501UL, 592700938UL, 275180291UL, 7331584UL, 8312576UL, 8770816UL,
+4247430912UL, 4247433730UL, 3978417159UL, 2317998598UL, 1111022339UL, 524081152UL,
+ 172217600UL, 5293312UL, 6668032UL, 4263158272UL, 4246448128UL, 4195927810UL,
+3021655296UL, 1747244032UL, 858642176UL, 338350592UL, 53332736UL, 4176640UL,
+4245529856UL, 4245661184UL, 4195203328UL, 3406608128UL, 2181939712UL, 1108266752UL,
+ 488232192UL, 135910656UL, 2344448UL, 4278233344UL, 4194346240UL, 4160794112UL,
+3691491584UL, 2701570560UL, 1661192448UL, 772069888UL, 286188288UL, 1039104UL,
+4278236928UL, 4278234368UL, 4278234624UL, 3842026752UL, 3070273792UL, 2214639616UL,
+1325453056UL, 604038400UL, 65280UL, 3422292824UL, 570249275UL, 234730018UL,
+ 117300502UL, 133429773UL, 64748809UL, 13040645UL, 11859712UL, 9952512UL,
+4252725022UL, 1819700817UL, 315878447UL, 131267353UL, 63241741UL, 45481478UL,
+ 11140354UL, 9961216UL, 8514560UL, 4233722368UL, 4031032611UL, 1430764332UL,
+ 713808663UL, 178123020UL, 27261699UL, 10089728UL, 9497600UL, 8577280UL,
+4248534272UL, 4231900167UL, 3427192076UL, 1565246476UL, 862178052UL, 309054976UL,
+ 7195648UL, 8047360UL, 8178944UL, 4280780288UL, 4247430912UL, 3911826179UL,
+2469969152UL, 1380369664UL, 625064704UL, 172013056UL, 5156608UL, 6468864UL,
+4279732480UL, 4245854464UL, 3994202112UL, 2719262208UL, 1545120512UL, 706719232UL,
+ 304261888UL, 2598400UL, 3974656UL, 4245326336UL, 4194341376UL, 3791690496UL,
+2868942592UL, 1980079616UL, 1024042752UL, 437168128UL, 101885440UL, 2204672UL,
+4278225408UL, 3724576256UL, 3372254720UL, 2868938752UL, 2281736960UL, 1442878976UL,
+ 738239232UL, 201566976UL, 961024UL, 4278227968UL, 3422586112UL, 3204482304UL,
+2936047360UL, 2516617216UL, 1912639232UL, 1191223040UL, 587248128UL, 47616UL,
+4143384622UL, 1761417770UL, 570245662UL, 285052180UL, 100517646UL, 65927685UL,
+ 15659008UL, 13556992UL, 11649792UL, 4255794442UL, 3117885236UL, 619931177UL,
+ 251246867UL, 183889409UL, 14611712UL, 13038080UL, 11658752UL, 9819648UL,
+4250947840UL, 4152519951UL, 2223998487UL, 1539817476UL, 565827328UL, 10543872UL,
+ 9888000UL, 9035264UL, 7918848UL, 4248655360UL, 4249843456UL, 3360984842UL,
+2222566402UL, 930062592UL, 258780928UL, 7255808UL, 7716608UL, 7455488UL,
+4264058368UL, 4247484160UL, 3727922432UL, 2335476992UL, 1211929344UL, 557683456UL,
+ 121673472UL, 5152000UL, 6138112UL, 4279920640UL, 4262820096UL, 3641935104UL,
+2534834944UL, 1578993664UL, 757041664UL, 304252928UL, 2657280UL, 4035584UL,
+4278807552UL, 4194333696UL, 3489691904UL, 2583721728UL, 1795586560UL, 990347520UL,
+ 420250624UL, 85034496UL, 2132224UL, 4278219008UL, 3691014144UL, 3036703744UL,
+2566942464UL, 2013294848UL, 1308652800UL, 704676096UL, 184583424UL, 755712UL,
+4194334208UL, 3338692864UL, 2868931840UL, 2566942720UL, 2181066752UL, 1694527744UL,
+1107328000UL, 570461184UL, 36608UL, 4259653128UL, 2868776476UL, 1190993687UL,
+ 587021071UL, 217936651UL, 33203202UL, 15841280UL, 14333184UL, 12625664UL,
+4273417220UL, 3891139612UL, 1442324508UL, 502942735UL, 133794818UL, 15248640UL,
+ 14334976UL, 13419264UL, 11713280UL, 4269093632UL, 4221780741UL, 3100072454UL,
+1304584967UL, 415074560UL, 11444992UL, 11319552UL, 10601216UL, 9486080UL,
+4265819136UL, 4250684928UL, 3480444418UL, 1954444800UL, 913862912UL, 292718592UL,
+ 7248640UL, 7515648UL, 7255296UL, 4247405312UL, 4247801344UL, 3711721984UL,
+2403362048UL, 1296262912UL, 574975488UL, 105150208UL, 5212160UL, 5806592UL,
+4263201280UL, 4263203328UL, 3709623808UL, 2552128512UL, 1579180800UL, 790914560UL,
+ 287729920UL, 2912512UL, 4161280UL, 4245310976UL, 4228207872UL, 3489682688UL,
+2550422784UL, 1745378816UL, 1007378688UL, 420373760UL, 68315136UL, 2191872UL,
+4278211584UL, 3825226240UL, 3103806464UL, 2499828736UL, 1929403904UL, 1308646912UL,
+ 687891200UL, 167798016UL, 682752UL, 4160772864UL, 3405795840UL, 2885703424UL,
+2449497600UL, 2097176832UL, 1610637568UL, 1073767168UL, 553675776UL, 28160UL,
+4276100357UL, 3590196752UL, 1912410896UL, 972890377UL, 519910147UL, 49830913UL,
+ 15697664UL, 14455808UL, 13077504UL, 4257226242UL, 4159906309UL, 2264535568UL,
+ 955917063UL, 318322689UL, 15294720UL, 14451968UL, 13932288UL, 12818688UL,
+4287243264UL, 4256376834UL, 3403102720UL, 1607350274UL, 617432320UL, 12148224UL,
+ 12288512UL, 12163584UL, 11313920UL, 4283377152UL, 4268043520UL, 3582212864UL,
+2004891648UL, 897729280UL, 243160832UL, 8483840UL, 8752896UL, 8429056UL,
+4264307712UL, 4265096192UL, 3695459841UL, 2387099392UL, 1196049920UL, 558648576UL,
+ 88759296UL, 5469440UL, 5802496UL, 4280169472UL, 4263459072UL, 3659611904UL,
+2569158912UL, 1596409088UL, 824788992UL, 288050432UL, 3233792UL, 4222208UL,
+4245371648UL, 4228463872UL, 3590995712UL, 2634694912UL, 1762477056UL, 1024476672UL,
+ 454183424UL, 68439296UL, 2448128UL, 4278206208UL, 3909106944UL, 3238018560UL,
+2566931200UL, 1912621056UL, 1275086848UL, 687885056UL, 184569088UL, 742400UL,
+4043326464UL, 3372236288UL, 2902475008UL, 2499823360UL, 2063618048UL, 1560301824UL,
+1090539776UL, 570447104UL, 22016UL, 4275835907UL, 4043119616UL, 2784892929UL,
+1375606275UL, 654187008UL, 184294912UL, 15746304UL, 14379264UL, 13202688UL,
+4274394113UL, 4227209216UL, 3053196800UL, 1375344384UL, 402265856UL, 15737600UL,
+ 14305536UL, 13790208UL, 12941568UL, 4271446016UL, 4223538689UL, 3234600704UL,
+1707743744UL, 684662528UL, 63252480UL, 12668160UL, 12545024UL, 12024832UL,
+4284291584UL, 4268891136UL, 3448184064UL, 2038897664UL, 948707584UL, 260909824UL,
+ 9258496UL, 9987840UL, 9993984UL, 4281867264UL, 4265615360UL, 3628737280UL,
+2370708224UL, 1330915328UL, 542519040UL, 55852544UL, 6576640UL, 7042048UL,
+4280427008UL, 4247004160UL, 3643155456UL, 2502436096UL, 1563240960UL, 741222912UL,
+ 271660032UL, 3556608UL, 4480768UL, 4279182848UL, 4212074240UL, 3507431424UL,
+2601462272UL, 1746021376UL, 1007955712UL, 454373888UL, 51852800UL, 2705664UL,
+4278201344UL, 3942656768UL, 3238013696UL, 2583702528UL, 1912614912UL, 1174417920UL,
+ 620770048UL, 151008256UL, 868352UL, 3724555008UL, 3221237504UL, 2818584320UL,
+2449486592UL, 2030057728UL, 1543519744UL, 1056980992UL, 570441984UL, 16896UL,
+4258860033UL, 4160293632UL, 3170699520UL, 1660750336UL, 738069248UL, 201198336UL,
+ 16256768UL, 14824960UL, 13522176UL, 4257745665UL, 4226745857UL, 3220308480UL,
+1609499648UL, 535758592UL, 15403264UL, 14752256UL, 13843200UL, 13261056UL,
+4255321344UL, 4173399296UL, 3082880256UL, 1841497856UL, 751176192UL, 79956480UL,
+ 12853248UL, 12795904UL, 12475136UL, 4251717120UL, 4219341568UL, 3213428736UL,
+2055866880UL, 1016007936UL, 261426944UL, 10166016UL, 10698496UL, 10705408UL,
+4282454272UL, 4249227520UL, 3477868032UL, 2337542144UL, 1331368192UL, 576591360UL,
+ 73473536UL, 7486464UL, 8279552UL, 4280685824UL, 4230419968UL, 3525972992UL,
+2519602176UL, 1580537344UL, 825628672UL, 255401472UL, 4337920UL, 5458688UL,
+4279637504UL, 4212528640UL, 3423737088UL, 2584942080UL, 1746343424UL, 957945344UL,
+ 505355520UL, 35529472UL, 3095296UL, 4194309888UL, 3959429376UL, 3271563520UL,
+2566920704UL, 1845500416UL, 1174674944UL, 637870080UL, 218571008UL, 1191424UL,
+3573555968UL, 3103793408UL, 2734694656UL, 2365596160UL, 1962943744UL, 1476405248UL,
+ 989867008UL, 536882176UL, 11776UL, 4208197632UL, 4227006464UL, 3489595392UL,
+2113536000UL, 955777024UL, 419169024UL, 50135552UL, 16059136UL, 14298112UL,
+4291166208UL, 3973513216UL, 3151429632UL, 2044329984UL, 903675904UL, 266272768UL,
+ 14616064UL, 14160384UL, 13512448UL, 4289003520UL, 3836936192UL, 2930966528UL,
+2109145088UL, 1018953728UL, 314572800UL, 12649984UL, 12916480UL, 12793088UL,
+4201906176UL, 3900702720UL, 2978611200UL, 2139881472UL, 1217462272UL, 429260800UL,
+ 10159104UL, 11148032UL, 11417600UL, 4249355008UL, 4081647616UL, 3209887744UL,
+2254045184UL, 1365114880UL, 627311104UL, 74056704UL, 8198912UL, 8992768UL,
+4247389696UL, 4180346112UL, 3425633280UL, 2486436864UL, 1631192064UL, 842925568UL,
+ 272631808UL, 4986880UL, 6305024UL, 4279634432UL, 4145482496UL, 3356952576UL,
+2585331456UL, 1780287488UL, 1008732416UL, 472124416UL, 2363392UL, 3746560UL,
+4245097216UL, 4043770880UL, 3338996224UL, 2634353408UL, 1913064192UL, 1191709696UL,
+ 621481216UL, 370546176UL, 1646080UL, 3825209856UL, 3338670592UL, 2868908800UL,
+2365592320UL, 1946162176UL, 1426068480UL, 939529728UL, 503322368UL, 6400UL,
+4293197824UL, 4226744320UL, 3639410688UL, 2582380544UL, 1475215360UL, 753991680UL,
+ 318111744UL, 100204544UL, 16711680UL, 4223860736UL, 3602972672UL, 3049521152UL,
+2362048512UL, 1406140416UL, 684982272UL, 265814016UL, 14352384UL, 14417920UL,
+4020436992UL, 3483893760UL, 2896822272UL, 2309947392UL, 1488191488UL, 733544448UL,
+ 280756224UL, 12713984UL, 13041664UL, 3799646208UL, 3431137280UL, 2878078976UL,
+2291204096UL, 1586757632UL, 832176128UL, 312279040UL, 10878976UL, 11665408UL,
+3763470336UL, 3394633728UL, 2908749824UL, 2288648192UL, 1651310592UL, 963706880UL,
+ 360054784UL, 8323072UL, 9634560UL, 3912433664UL, 3442802688UL, 2956591104UL,
+2403467264UL, 1766326272UL, 1078722560UL, 474873856UL, 5505024UL, 7013632UL,
+4162584576UL, 3692888064UL, 3005218816UL, 2418212864UL, 1881604096UL, 1194065920UL,
+ 590348288UL, 120782848UL, 4457216UL, 4278779904UL, 3959422976UL, 3255238656UL,
+2617769984UL, 1980366848UL, 1292828672UL, 672202752UL, 236126208UL, 2228224UL,
+4278190080UL, 3657433088UL, 3120562176UL, 2634022912UL, 2030043136UL, 1493172224UL,
+ 905969664UL, 402653184UL, 0
+};
+
+APDK_END_NAMESPACE
+
diff --git a/prnt/hpijs/dj8x5.cpp b/prnt/hpijs/dj8x5.cpp
new file mode 100644
index 0000000..f69e5ef
--- /dev/null
+++ b/prnt/hpijs/dj8x5.cpp
@@ -0,0 +1,208 @@
+/*****************************************************************************\
+ dj8x5.cpp : Implimentation for the DJ8x5 class
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#if defined(APDK_DJ8xx)|| defined(APDK_DJ9xx)
+
+#ifdef APDK_DJ8x5
+#include "header.h"
+#include "dj8xx.h"
+#include "dj8x5.h"
+#include "printerproxy.h"
+
+APDK_BEGIN_NAMESPACE // must be here for non-test harness case
+extern BYTE* GetHT3x3_4();
+extern BYTE* GetHT6x6_4();
+APDK_END_NAMESPACE // must be here for non-test harness case
+
+APDK_BEGIN_NAMESPACE
+
+extern uint32_t ulMapDJ8x5PlainNormal[ 9 * 9 * 9 ];
+extern uint32_t ulMapDJ895_HB_KCMY[ 9 * 9 * 9 ];
+extern uint32_t ulMapDJ8x5Draft[ 9 * 9 * 9 ];
+
+
+DJ8x5Mode1::DJ8x5Mode1()
+: PrintMode(ulMapDJ8x5PlainNormal)
+// 600x600x1 K
+// 300x300x2 CMY
+{
+
+ ColorDepth[K]=1; // 600x600x1 K
+
+ for (int i=1; i < 4; i++)
+ ColorDepth[i]=2; // 300x300x2 CMY
+
+ ResolutionX[K] =
+ ResolutionY[K] = 600;
+
+ MixedRes = TRUE;
+
+ ColorFEDTable = GetHT3x3_4();
+
+ bFontCapable = FALSE; // DJ8xx can't do fonts and hifipe at same time
+ dyeCount = 3;
+ CompatiblePens[0] = COLOR_PEN;
+}
+
+DJ8x5Mode2::DJ8x5Mode2()
+: PrintMode(ulMapDJ895_HB_KCMY)
+// 600x600x2 CMY
+{
+ int i;
+ ColorDepth[K]=1; // 600x600x1 K
+
+ for (i=1; i < 4; i++)
+ ColorDepth[i]=2; // 600x600x2 CMY
+
+ for (i=0; i < 4; i++)
+ ResolutionX[i]=ResolutionY[i]=600;
+
+ BaseResX = BaseResY = 600;
+ MixedRes = FALSE;
+
+ medium = mediaGlossy;
+ theQuality = qualityPresentation;
+
+ ColorFEDTable = GetHT6x6_4();
+
+ bFontCapable = FALSE; // DJ8xx can't do fonts and hifipe at same time
+
+ dyeCount = 3;
+ CompatiblePens[0] = COLOR_PEN;
+
+ pmQuality = QUALITY_BEST;
+ pmMediaType = MEDIA_PHOTO;
+}
+
+DJ8x5Mode3::DJ8x5Mode3()
+: PrintMode(ulMapDJ8x5Draft)
+// 300x300x1 CMY
+{
+
+ dyeCount = 3;
+ CompatiblePens[0] = COLOR_PEN;
+ theQuality = qualityDraft;
+ pmQuality = QUALITY_DRAFT;
+}
+
+DJ8x5::DJ8x5 (SystemServices* pSS, int numfonts, BOOL proto)
+ : DJ8xx (pSS, numfonts, TRUE)
+{
+ CMYMap = ulMapDJ8x5Draft;
+
+/*
+ * If we don't have device id, we won't know about the pens installed.
+ * But since both 825 and 845 ship with atleast a colorpen, we will
+ * default to COLOR_PEN, so it will work okay out of the box.
+ */
+
+ if ((!proto) && (IOMode.bDevID))
+ {
+ constructor_error = VerifyPenInfo();
+ CERRCHECK;
+ }
+ else
+ {
+ ePen = COLOR_PEN;
+ }
+
+// DJ8xx modes based on BOTH_PENS are already installed (i.e. pModes 0-4)
+
+ pMode[5] = new DJ8x5Mode1 (); // Normal Color CMY
+ pMode[6] = new DJ8x5Mode2 (); // Photo CMY
+ pMode[7] = new DJ8x5Mode3 (); // Draft Color CMY
+ ModeCount = 8;
+
+ DBG1("DJ8x5 created\n");
+}
+
+PEN_TYPE DJ8x5::DefaultPenSet()
+{
+ return COLOR_PEN;
+}
+
+DRIVER_ERROR DJ8x5::VerifyPenInfo ()
+{
+
+ DRIVER_ERROR err=NO_ERROR;
+
+ if(IOMode.bDevID == FALSE)
+ return err;
+
+ err = ParsePenInfo (ePen);
+
+ if(err == UNSUPPORTED_PEN) // probably Power Off - pens couldn't be read
+ {
+ DBG1("DJ8x5::Need to do a POWER ON to get penIDs\n");
+
+ if (pSS->BusyWait((DWORD)2000) == JOB_CANCELED)
+ return JOB_CANCELED;
+
+ DWORD length=sizeof (DJ895_Power_On);
+ err = pSS->ToDevice (DJ895_Power_On, &length);
+ ERRCHECK;
+
+ err = pSS->FlushIO ();
+ ERRCHECK;
+
+ // give the printer some time to power up
+ if (pSS->BusyWait ((DWORD) 2500) == JOB_CANCELED)
+ return JOB_CANCELED;
+
+ err = ParsePenInfo(ePen);
+ }
+
+ ERRCHECK;
+
+ // check for the normal case
+ if (ePen == BOTH_PENS)
+ return NO_ERROR;
+
+ while (ePen == NO_PEN)
+ {
+ pSS->DisplayPrinterStatus(DISPLAY_NO_PENS);
+
+ if (pSS->BusyWait(500) == JOB_CANCELED)
+ return JOB_CANCELED;
+
+ err = ParsePenInfo(ePen);
+ ERRCHECK;
+ }
+
+ pSS->DisplayPrinterStatus(DISPLAY_PRINTING);
+
+ return NO_ERROR;
+}
+
+APDK_END_NAMESPACE
+
+#endif // APDK_DJ8x5
+#endif // APDK_DJ895
diff --git a/prnt/hpijs/dj8x5.h b/prnt/hpijs/dj8x5.h
new file mode 100644
index 0000000..7c9f3fb
--- /dev/null
+++ b/prnt/hpijs/dj8x5.h
@@ -0,0 +1,111 @@
+/*****************************************************************************\
+ dj8x5.h : Interface for the DJ8x5 class
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#ifndef APDK_DJ8X5_H
+#define APDK_DJ8X5_H
+
+APDK_BEGIN_NAMESPACE
+
+/*!
+\internal
+*/
+class DJ8x5 : public DJ8xx
+{
+public:
+ DJ8x5 (SystemServices* pSS,int numfonts=0, BOOL proto=FALSE);
+
+ virtual DRIVER_ERROR VerifyPenInfo();
+ virtual PEN_TYPE DefaultPenSet();
+
+}; //DJ8x5
+
+
+class DJ8x5Mode1 : public PrintMode
+{
+public:
+ DJ8x5Mode1();
+}; //DJ8x5Mode1
+
+
+class DJ8x5Mode2 : public PrintMode
+{
+public:
+ DJ8x5Mode2();
+}; //DJ8x5Mode2
+
+
+class DJ8x5Mode3 : public PrintMode
+{
+public:
+ DJ8x5Mode3();
+}; //DJ8x5Mode3
+
+/*
+class DJ8x5Mode4 : public PrintMode
+{
+ public:
+ DJ8x5Mode4 ();
+}; //DJ8x5Mode4
+*/
+
+/*
+class DJ8x5Mode5 : public PrintMode
+{
+ public:
+ DJ8x5Mode5 ();
+};
+*/
+#if defined(APDK_DJ8xx)|| defined(APDK_DJ9xx)
+
+#ifdef APDK_DJ8x5
+//! DJ8x5Proxy
+/*!
+******************************************************************************/
+class DJ8x5Proxy : public PrinterProxy
+{
+public:
+ DJ8x5Proxy() : PrinterProxy(
+ "DJ8x5", // family name
+ "DESKJET 825\0" // DeskJet 825
+ "DESKJET 845\0" // DeskJet 845
+#ifdef APDK_MLC_PRINTER
+#endif
+ ) {m_iPrinterType = eDJ8x5;}
+ inline Printer* CreatePrinter(SystemServices* pSS) const { return new DJ8x5(pSS); }
+ inline PRINTER_TYPE GetPrinterType() const { return eDJ8x5;}
+ inline unsigned int GetModelBit() const { return 0x400;}
+} ;
+#endif
+#endif
+
+APDK_END_NAMESPACE
+
+#endif //APDK_DJ8X5_H
diff --git a/prnt/hpijs/dj8xx.cpp b/prnt/hpijs/dj8xx.cpp
new file mode 100644
index 0000000..6fec85c
--- /dev/null
+++ b/prnt/hpijs/dj8xx.cpp
@@ -0,0 +1,580 @@
+/*****************************************************************************\
+ dj8xx.cpp : Implimentation for the DJ8xx class
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#if defined(APDK_DJ8xx)|| defined(APDK_DJ9xx)
+
+#include "header.h"
+#include "io_defs.h"
+#include "dj8xx.h"
+#include "printerproxy.h"
+
+APDK_BEGIN_NAMESPACE
+extern BYTE* GetHT3x3_4();
+extern BYTE* GetHT6x6_4();
+APDK_END_NAMESPACE
+
+APDK_BEGIN_NAMESPACE
+
+extern uint32_t ulMapDJ895_KCMY[ 9 * 9 * 9 ];
+extern uint32_t ulMapDJ600_CCM_K[ 9 * 9 * 9 ];
+extern uint32_t ulMapDJ895_HB_KCMY[ 9 * 9 * 9 ];
+extern uint32_t ulMapDJ895_Binary_KCMY[ 9 * 9 * 9 ];
+extern uint32_t ulMapGRAY_K_6x6x1[9 * 9 * 9];
+
+DJ895Mode1::DJ895Mode1() // Normal Color
+: PrintMode(ulMapDJ895_KCMY)
+// 600x600x1 K
+// 300x300x2 CMY
+{
+
+ ColorDepth[K]=1; // 600x600x1 K
+
+ for (int i=1; i < 4; i++)
+ ColorDepth[i]=2; // 300x300x2 CMY
+
+ ResolutionX[K]=ResolutionY[K]=600;
+
+ MixedRes = TRUE;
+
+ ColorFEDTable = GetHT3x3_4();
+
+ bFontCapable = FALSE; // DJ895 can't do fonts and hifipe at same time
+}
+
+DJ895Mode2::DJ895Mode2() // Photo
+: PrintMode(ulMapDJ895_HB_KCMY)
+// 600x600x1 K
+// 600x600x2 CMY
+{
+ int i;
+ ColorDepth[K]=1; // 600x600x1 K
+
+ for (i=1; i < 4; i++)
+ ColorDepth[i]=2; // 600x600x2 CMY
+
+ for (i=0; i < 4; i++)
+ ResolutionX[i]=ResolutionY[i]=600;
+
+ BaseResX = BaseResY = 600;
+ MixedRes = FALSE;
+
+ medium = mediaGlossy;
+ theQuality = qualityPresentation;
+
+ ColorFEDTable = GetHT6x6_4();
+
+ bFontCapable = FALSE; // DJ895 can't do fonts and hifipe at same time
+
+// strcpy(ModeName, "Photo");
+
+ pmQuality = QUALITY_BEST;
+ pmMediaType = MEDIA_PHOTO;
+}
+
+DJ895Mode3::DJ895Mode3() // Draft Color
+: PrintMode(ulMapDJ895_Binary_KCMY)
+// 300x300x1 KCMY
+{
+
+ theQuality = qualityDraft;
+// strcpy(ModeName,"Draft");
+ pmQuality = QUALITY_DRAFT;
+}
+
+DJ895Mode4::DJ895Mode4() // Draft Gray K
+: GrayMode(ulMapDJ600_CCM_K)
+// 300x300x1 K
+{
+ theQuality = qualityDraft;
+ pmQuality = QUALITY_DRAFT;
+}
+
+#ifdef APDK_EXTENDED_MEDIASIZE
+DJ895Mode5::DJ895Mode5() // Normal Gray K
+: GrayMode(ulMapGRAY_K_6x6x1)
+// 600x600x1 K
+{
+ BaseResX = BaseResY = 600;
+ ResolutionX[K]=ResolutionY[K]=600;
+ bFontCapable = FALSE;
+}
+#endif
+
+DJ8xx::DJ8xx(SystemServices* pSS,
+ int numfonts, BOOL proto)
+ : Printer(pSS, numfonts, proto)
+{
+
+ if ((!proto) && (IOMode.bDevID))
+ {
+ constructor_error = VerifyPenInfo();
+ CERRCHECK;
+ }
+ else ePen=BOTH_PENS; // matches default mode
+
+#ifdef APDK_EXTENDED_MEDIASIZE
+ pMode[GRAYMODE_INDEX] = new DJ895Mode5 (); // Normal Gray K
+#else
+ pMode[GRAYMODE_INDEX] = new GrayMode (ulMapDJ600_CCM_K); // Normal Gray K
+#endif
+ pMode[DEFAULTMODE_INDEX] = new DJ895Mode1 (); // Normal Color
+ pMode[SPECIALMODE_INDEX] = new DJ895Mode2 (); // Photo
+ pMode[SPECIALMODE_INDEX+1] = new DJ895Mode3 (); // Draft Color
+ pMode[SPECIALMODE_INDEX+2] = new DJ895Mode4 (); // Draft Gray K
+ ModeCount = 5;
+
+ CMYMap = ulMapDJ895_Binary_KCMY;
+
+ DBG1("DJ8xx created\n");
+}
+
+
+Header895::Header895(Printer* p,PrintContext* pc)
+ : Header(p,pc)
+{ }
+
+DRIVER_ERROR Header895::Send()
+{ DRIVER_ERROR err;
+
+ StartSend();
+
+ err = ConfigureRasterData();
+ ERRCHECK;
+
+ err=Graphics(); // start raster graphics and set compression mode
+
+ // this is the pre-pick command but it doesn't work. hmm...
+ // err = thePrinter->Send((const BYTE*)DJ895_Pre_Pick,sizeof(DJ895_Pre_Pick));
+
+return err;
+}
+
+DRIVER_ERROR Header895::StartSend()
+// common items gathered for code savings
+{
+ DRIVER_ERROR err;
+
+ err = thePrinter->Send((const BYTE*)Reset,sizeof(Reset));
+ ERRCHECK;
+
+ err = thePrinter->Send((const BYTE*)UEL,sizeof(UEL));
+ ERRCHECK;
+
+ err = thePrinter->Send((const BYTE*)EnterLanguage,sizeof(EnterLanguage));
+ ERRCHECK;
+
+ if (!thePrinter->UseGUIMode(thePrintContext->CurrentMode))
+ err = thePrinter->Send((const BYTE*)PCL3,sizeof(PCL3));
+ else
+ err = thePrinter->Send((const BYTE*)PCLGUI,sizeof(PCLGUI));
+ ERRCHECK;
+
+ err = thePrinter->Send((const BYTE*)&LF,1);
+ ERRCHECK;
+
+ err=Modes(); // Set media source, type, size and quality modes.
+ ERRCHECK;
+
+// Now send media pre-load command
+ err = thePrinter->Send ((const BYTE *) "\033&l-2H", 6);
+ ERRCHECK;
+
+ char uom[10];
+ sprintf(uom,"%c%c%c%d%c",ESC,'&','u',thePrintContext->EffectiveResolutionY(),'D');
+ err=thePrinter->Send((const BYTE*)uom, strlen (uom));
+ ERRCHECK;
+
+ if (!thePrinter->UseGUIMode(thePrintContext->CurrentMode))
+ err=Margins(); // set margins
+
+ else // special GUI mode top margin set
+ {
+ CAPy = thePrintContext->GUITopMargin();
+ }
+
+ return err;
+}
+
+extern BYTE EscAmplCopy(BYTE *dest, int num, char end);
+
+
+DRIVER_ERROR Header895::Graphics()
+// variant due to compression problems
+{
+ DRIVER_ERROR error= thePrinter->Send((const BYTE*)grafStart, sizeof(grafStart) );
+ if (error!=NO_ERROR)
+ return error;
+
+ if (thePrintMode->Config.bCompress)
+ {
+ error= thePrinter->Send((const BYTE*)grafMode2, sizeof(grafMode2) );
+ if (error!=NO_ERROR)
+ return error;
+ }
+ else
+
+ error= thePrinter->Send((const BYTE*)grafMode0, sizeof(grafMode0) );
+
+return error;
+#define GRAPHICSIZE (sizeof(grafStart)+sizeof(grafMode9)+sizeof(SeedSame))
+}
+
+
+Header* DJ8xx::SelectHeader(PrintContext* pc)
+{
+ return new Header895(this,pc);
+}
+
+DRIVER_ERROR DJ8xx::VerifyPenInfo()
+{
+
+ DRIVER_ERROR err = NO_ERROR;
+
+ if(IOMode.bDevID == FALSE)
+ {
+ return err;
+ }
+
+ err = ParsePenInfo(ePen);
+
+ if(err == UNSUPPORTED_PEN) // probably Power Off - pens couldn't be read
+ {
+ DBG1("DJ8xx::Need to do a POWER ON to get penIDs\n");
+
+ // have to delay the POWER ON will be ignored
+ if (pSS->BusyWait((DWORD)2000) == JOB_CANCELED)
+ {
+ return JOB_CANCELED;
+ }
+
+ DWORD length = sizeof(DJ895_Power_On);
+ err = pSS->ToDevice(DJ895_Power_On,&length);
+ ERRCHECK;
+
+ err = pSS->FlushIO();
+ ERRCHECK;
+
+ // give the printer some time to power up
+ if (pSS->BusyWait ((DWORD) 2500) == JOB_CANCELED)
+ {
+ return JOB_CANCELED;
+ }
+
+ err = ParsePenInfo(ePen);
+ }
+
+ ERRCHECK;
+
+ // check for the normal case
+ if (ePen == BOTH_PENS)
+ {
+ return NO_ERROR;
+ }
+
+ while ( ePen != BOTH_PENS )
+ {
+
+ switch (ePen)
+ {
+ case BLACK_PEN:
+ // black pen installed, need to install color pen
+ pSS->DisplayPrinterStatus(DISPLAY_NO_COLOR_PEN);
+ break;
+ case COLOR_PEN:
+ // color pen installed, need to install black pen
+ pSS->DisplayPrinterStatus(DISPLAY_NO_BLACK_PEN);
+ break;
+ case NO_PEN:
+ // neither pen installed
+ default:
+ pSS->DisplayPrinterStatus(DISPLAY_NO_PENS);
+ break;
+ }
+
+ if (pSS->BusyWait(500) == JOB_CANCELED)
+ {
+ return JOB_CANCELED;
+ }
+
+ err = ParsePenInfo(ePen);
+ ERRCHECK;
+ }
+
+ pSS->DisplayPrinterStatus(DISPLAY_PRINTING);
+
+ return NO_ERROR;
+}
+
+DRIVER_ERROR DJ8xx::ParsePenInfo(PEN_TYPE& ePen, BOOL QueryPrinter)
+{
+ char* str;
+ DRIVER_ERROR err = SetPenInfo (str, QueryPrinter);
+ ERRCHECK;
+
+ if (*str != '$')
+ {
+ return BAD_DEVICE_ID;
+ }
+
+ // parse penID
+ PEN_TYPE temp_pen1;
+ // check pen1, assume it is black, pen2 is color
+ switch (str[1])
+ {
+ case 'H': // (H)obbes
+ case 'L': // (L)inus
+ case 'Z': // (Z)orro
+ {
+ temp_pen1 = BLACK_PEN;
+ break;
+ }
+ case 'X': return UNSUPPORTED_PEN;
+ default: temp_pen1 = NO_PEN; break;
+ }
+
+ // now check pen2
+
+ int i = 2;
+ while ((i < DevIDBuffSize) && str[i] != '$') i++; // handles variable length penIDs
+ if (i == DevIDBuffSize)
+ {
+ return BAD_DEVICE_ID;
+ }
+
+ i++;
+
+ // need to be more forgiving of the color pen type because of
+ // the unknown chinookID for DJ970
+ // we can't guarantee the (F)lash color pen, but we can make sure
+ // the pen is not (X)Undefined, (A)Missing or (M)onet
+ if(str[i] != 'X' && str[i] != 'A' && str[i] != 'M')
+ // check what pen1 was
+ {
+ if (temp_pen1 == BLACK_PEN)
+ {
+ ePen = BOTH_PENS;
+ }
+ else
+ {
+ ePen = COLOR_PEN;
+ }
+ }
+ else // no color pen, just set what pen1 was
+ {
+ ePen = temp_pen1;
+ }
+
+ return NO_ERROR;
+}
+
+
+Compressor* DJ8xx::CreateCompressor(unsigned int RasterSize)
+{
+ DBG1("Compression = Mode2\n");
+ return new Mode2(pSS,RasterSize);
+}
+
+BOOL DJ8xx::UseGUIMode(PrintMode* pPrintMode)
+{
+ return (!pPrintMode->bFontCapable);
+}
+
+DRIVER_ERROR DJ8xx::CleanPen()
+{
+ const BYTE DJ895_Diag_Page[] = {ESC, '%','P','u','i','f','p','.',
+ 'm','u','l','t','i','_','b','u','t','t','o','n','_','p','u','s','h',' ','4',';',
+ 'u','d','w','.','q','u','i','t',';',ESC,'%','-','1','2','3','4','5','X' };
+
+ const BYTE PEN_CLEAN_PML[]={0x1B,0x45,0x1B,0x26,0x62,0x31,0x36,0x57,
+ 0x50,0x4D,0x4C,0x20, // EscE Esc&b16WPML{space}
+ 0x04,0x00,0x06,0x01,0x04,0x01,0x05,0x01,
+ 0x01,0x04,0x01,0x64}; // PML Marking-Agent-Maintenance=100
+
+ DWORD length = sizeof(DJ895_Power_On);
+ DRIVER_ERROR Error = pSS->ToDevice(DJ895_Power_On,&length);
+
+ pSS->BusyWait((DWORD)1000);
+
+ length = sizeof(PEN_CLEAN_PML);
+ Error = pSS->ToDevice(PEN_CLEAN_PML,&length);
+
+ length = sizeof(DJ895_Diag_Page);
+ return pSS->ToDevice(DJ895_Diag_Page,&length);
+}
+
+
+
+
+/*
+ * Function name: ParseError
+ *
+ * Owner: Darrell Walker
+ *
+ * Purpose: To determine what error state the printer is in.
+ *
+ * Called by: Send()
+ *
+ * Parameters on entry: status_reg is the contents of the centronics
+ * status register (at the time the error was
+ * detected)
+ *
+ * Parameters on exit: unchanged
+ *
+ * Return Values: The proper DISPLAY_STATUS to reflect the printer
+ * error state.
+ *
+ */
+
+/* We have to override the base class's (Printer) ParseError function due
+ to the fact that the 8XX series returns a status byte of F8 when it's out of
+ paper. Unfortunately, the 600 series returns F8 when they're turned off.
+ The way things are structured in Printer::ParseError, we used to check only
+ for DEVICE_IS_OOP. This would return true even if we were connected to a
+ 600 series printer that was turned off, causing the Out of paper status
+ message to be displayed. This change also reflects a corresponding change
+ in IO_defs.h, where I split DEVICE_IS_OOP into DEVICE_IS_OOP, DJ400_IS_OOP, and
+ DJ8XX_IS_OOP and we now check for DJ8XX_IS_OOP in the DJ8xx class's
+ ParseError function below. 05/11/99 DGC.
+*/
+
+DISPLAY_STATUS DJ8xx::ParseError(BYTE status_reg)
+{
+ DBG1("DJ8xx: parsing error info\n");
+
+ DRIVER_ERROR err = NO_ERROR;
+ BYTE DevIDBuffer[DevIDBuffSize];
+
+ char *pStr;
+ if(IOMode.bDevID)
+ {
+ // If a bi-di cable was plugged in and everything was OK, let's see if it's still
+ // plugged in and everything is OK
+ err = pSS->GetDeviceID(DevIDBuffer, DevIDBuffSize, TRUE);
+ if(err != NO_ERROR)
+ // job was bi-di but now something's messed up, probably cable unplugged
+ return DISPLAY_COMM_PROBLEM;
+
+ if ( TopCoverOpen(status_reg) )
+ {
+ DBG1("Top Cover Open\n");
+ return DISPLAY_TOP_COVER_OPEN;
+ }
+
+
+ if ( (pStr=(char *)strstr((const char*)DevIDBuffer+2,"VSTATUS:")) == NULL )
+ {
+ return DISPLAY_COMM_PROBLEM;
+ }
+
+ pStr+=8; // skip "VSTATUS:"
+ // Paper Jam or Paper Stall
+ if (strstr((char*)pStr,"PAJM") || strstr((char*)pStr,"PAPS"))
+ {
+ return DISPLAY_PAPER_JAMMED;
+ }
+
+ // Power down or printing turning off
+ if (strstr((char*)pStr,"PWDN") || strstr((char*)pStr,"OFFF"))
+ {
+ return DISPLAY_OFFLINE;
+ }
+
+
+ // VerifyPenInfo will handle prompting the user
+ // if this is a problem
+ err = VerifyPenInfo();
+
+ if(err != NO_ERROR)
+ // VerifyPenInfo returned an error, which can only happen when ToDevice
+ // or GetDeviceID returns an error. Either way, it's BAD_DEVICE_ID or
+ // IO_ERROR, both unrecoverable. This is probably due to the printer
+ // being turned off during printing, resulting in us not being able to
+ // power it back on in VerifyPenInfo, since the buffer still has a
+ // partial raster in it and we can't send the power-on command.
+ return DISPLAY_COMM_PROBLEM;
+ }
+
+ // check for errors we can detect from the status reg
+ if (IOMode.bStatus)
+ {
+ if ( DEVICE_IS_OOP(status_reg) )
+ {
+ DBG1("Out Of Paper\n");
+ return DISPLAY_OUT_OF_PAPER;
+ }
+
+ if (DEVICE_PAPER_JAMMED(status_reg))
+ {
+ DBG1("Paper Jammed\n");
+ return DISPLAY_PAPER_JAMMED;
+ }
+
+ if (DEVICE_IO_TRAP(status_reg))
+ {
+ DBG1("IO trap\n");
+ return DISPLAY_ERROR_TRAP;
+ }
+ }
+
+ // don't know what the problem is-
+ // Is the PrinterAlive?
+ if (pSS->PrinterIsAlive())
+ {
+ iTotal_SLOW_POLL_Count += iMax_SLOW_POLL_Count;
+#if defined(DEBUG) && (DBG_MASK & DBG_LVL1)
+ printf("iTotal_SLOW_POLL_Count = %d\n",iTotal_SLOW_POLL_Count);
+#endif
+ // -Note that iTotal_SLOW_POLL_Count is a multiple of
+ // iMax_SLOW_POLL_Count allowing us to check this
+ // on an absolute time limit - not relative to the number
+ // of times we happen to have entered ParseError.
+ // -Also note that we have different thresholds for uni-di & bi-di.
+ if(
+ ((IOMode.bDevID == FALSE) && (iTotal_SLOW_POLL_Count >= 60)) ||
+ ((IOMode.bDevID == TRUE) && (iTotal_SLOW_POLL_Count >= 120))
+ )
+ {
+ return DISPLAY_BUSY;
+ }
+ else
+ {
+ return DISPLAY_PRINTING;
+ }
+ }
+ else
+ {
+ return DISPLAY_COMM_PROBLEM;
+ }
+}
+
+APDK_END_NAMESPACE
+
+#endif // defined APDK_DJ8xx or APDK_9xx
diff --git a/prnt/hpijs/dj8xx.h b/prnt/hpijs/dj8xx.h
new file mode 100644
index 0000000..b1f4c54
--- /dev/null
+++ b/prnt/hpijs/dj8xx.h
@@ -0,0 +1,133 @@
+/*****************************************************************************\
+ dj8xx.h : Interface for the DJ8xx class
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#ifndef APDK_DJ8XX_H
+#define APDK_DJ8XX_H
+
+APDK_BEGIN_NAMESPACE
+
+//extern char *ModelString[MAX_ID_STRING];
+
+/*!
+\internal
+*/
+class DJ8xx : public Printer
+{
+public:
+ DJ8xx(SystemServices* pSS,int numfonts=0, BOOL proto=FALSE);
+
+ virtual Header* SelectHeader(PrintContext* pc);
+ virtual DRIVER_ERROR VerifyPenInfo();
+ virtual DRIVER_ERROR ParsePenInfo(PEN_TYPE& ePen, BOOL QueryPrinter=TRUE);
+ virtual DISPLAY_STATUS ParseError(BYTE status_reg);
+
+ Compressor* CreateCompressor(unsigned int RasterSize);
+
+ virtual BOOL UseGUIMode(PrintMode* pPrintMode);
+ DRIVER_ERROR CleanPen();
+
+#ifdef APDK_HP_UX
+protected:
+ virtual DJ8xx & operator = (Printer& rhs)
+ {
+ return *this;
+ }
+#endif
+
+}; //DJ8xx
+
+
+class DJ895Mode1 : public PrintMode
+{
+public:
+ DJ895Mode1();
+}; //DJ895Mode1
+
+
+class DJ895Mode2 : public PrintMode
+{
+public:
+ DJ895Mode2();
+}; //DJ895Mode2
+
+
+class DJ895Mode3 : public PrintMode
+{
+public:
+ DJ895Mode3();
+}; //DJ895Mode3
+
+class DJ895Mode4 : public GrayMode
+{
+public:
+ DJ895Mode4();
+}; //DJ895Mode4
+
+#ifdef APDK_EXTENDED_MEDIASIZE
+
+class DJ895Mode5 : public GrayMode
+{
+public:
+ DJ895Mode5();
+}; //DJ895Mode5
+
+#endif //APDK_EXTENDED_MEDIASIZE
+
+
+#if defined(APDK_DJ8xx)|| defined(APDK_DJ9xx)
+//! DJ8xxProxy
+/*!
+******************************************************************************/
+class DJ8xxProxy : public PrinterProxy
+{
+public:
+ DJ8xxProxy() : PrinterProxy(
+ "DJ8xx", // family name
+ "DESKJET 81\0" // DeskJet 81x Series
+ "DESKJET 83\0" // DeskJet 83x Series
+ "DESKJET 84\0" // DeskJet 84x Series
+ "DESKJET 88\0" // DeskJet 88x Series
+ "DESKJET 895\0" // DeskJet 895
+#ifdef APDK_MLC_PRINTER
+ "OfficeJet T\0" // OfficeJet T Series
+ "OFFICEJET R\0" // OfficeJet R Series
+ "PSC 5\0" // PSC 500
+#endif
+ ) {m_iPrinterType = eDJ8xx;}
+ inline Printer* CreatePrinter(SystemServices* pSS) const { return new DJ8xx(pSS); }
+ inline PRINTER_TYPE GetPrinterType() const { return eDJ8xx;}
+ inline unsigned int GetModelBit() const { return 0x40000;}
+};
+#endif
+
+APDK_END_NAMESPACE
+
+#endif //APDK_DJ8XX_H
diff --git a/prnt/hpijs/dj970_maps.cpp b/prnt/hpijs/dj970_maps.cpp
new file mode 100644
index 0000000..1029bce
--- /dev/null
+++ b/prnt/hpijs/dj970_maps.cpp
@@ -0,0 +1,380 @@
+/*****************************************************************************\
+ dj970_maps.cpp : Color maps for DJ970
+
+ Copyright (c) 1996 - 2001UL, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#include "config.h"
+
+#include "global_types.h"
+
+APDK_BEGIN_NAMESPACE
+
+#if defined(APDK_DJ9xx)
+
+// 600x600x1, K - Plain, Normal, Grey
+
+uint32_t ulMapGRAY_K_6x6x1[] =
+{
+ 255UL, 238UL, 218UL, 204UL, 189UL, 181UL, 171UL, 161UL, 154UL,
+ 178UL, 168UL, 161UL, 153UL, 148UL, 141UL, 136UL, 130UL, 127UL,
+ 140UL, 133UL, 129UL, 124UL, 121UL, 116UL, 113UL, 109UL, 106UL,
+ 115UL, 112UL, 108UL, 104UL, 101UL, 97UL, 95UL, 91UL, 89UL,
+ 96UL, 94UL, 90UL, 88UL, 85UL, 82UL, 79UL, 77UL, 74UL,
+ 81UL, 78UL, 76UL, 73UL, 71UL, 69UL, 66UL, 65UL, 62UL,
+ 67UL, 66UL, 63UL, 62UL, 59UL, 57UL, 55UL, 54UL, 51UL,
+ 56UL, 55UL, 52UL, 51UL, 49UL, 47UL, 45UL, 44UL, 42UL,
+ 47UL, 45UL, 43UL, 41UL, 40UL, 38UL, 37UL, 35UL, 33UL,
+ 209UL, 191UL, 184UL, 173UL, 166UL, 156UL, 151UL, 144UL, 140UL,
+ 154UL, 149UL, 143UL, 138UL, 132UL, 128UL, 123UL, 120UL, 115UL,
+ 127UL, 122UL, 119UL, 114UL, 111UL, 107UL, 104UL, 100UL, 96UL,
+ 106UL, 102UL, 99UL, 95UL, 93UL, 90UL, 87UL, 84UL, 81UL,
+ 89UL, 85UL, 83UL, 80UL, 78UL, 75UL, 73UL, 70UL, 68UL,
+ 74UL, 71UL, 69UL, 67UL, 65UL, 63UL, 61UL, 59UL, 57UL,
+ 62UL, 60UL, 58UL, 56UL, 54UL, 52UL, 50UL, 48UL, 47UL,
+ 51UL, 50UL, 48UL, 46UL, 44UL, 43UL, 41UL, 39UL, 38UL,
+ 42UL, 40UL, 38UL, 37UL, 35UL, 34UL, 32UL, 31UL, 29UL,
+ 176UL, 168UL, 159UL, 153UL, 146UL, 141UL, 135UL, 130UL, 125UL,
+ 140UL, 133UL, 129UL, 124UL, 121UL, 116UL, 113UL, 109UL, 106UL,
+ 115UL, 112UL, 108UL, 104UL, 101UL, 97UL, 95UL, 91UL, 89UL,
+ 96UL, 94UL, 90UL, 88UL, 85UL, 82UL, 79UL, 77UL, 74UL,
+ 81UL, 78UL, 76UL, 73UL, 71UL, 69UL, 66UL, 65UL, 62UL,
+ 67UL, 66UL, 63UL, 62UL, 59UL, 57UL, 55UL, 54UL, 51UL,
+ 56UL, 55UL, 52UL, 51UL, 49UL, 47UL, 45UL, 44UL, 42UL,
+ 47UL, 45UL, 43UL, 41UL, 40UL, 38UL, 37UL, 35UL, 33UL,
+ 38UL, 36UL, 34UL, 32UL, 31UL, 29UL, 28UL, 26UL, 25UL,
+ 153UL, 148UL, 143UL, 136UL, 132UL, 127UL, 122UL, 119UL, 114UL,
+ 125UL, 122UL, 118UL, 114UL, 110UL, 107UL, 103UL, 100UL, 96UL,
+ 105UL, 102UL, 98UL, 95UL, 92UL, 90UL, 86UL, 84UL, 81UL,
+ 88UL, 85UL, 83UL, 80UL, 77UL, 75UL, 72UL, 70UL, 67UL,
+ 74UL, 71UL, 69UL, 67UL, 65UL, 63UL, 61UL, 59UL, 57UL,
+ 62UL, 60UL, 58UL, 56UL, 54UL, 52UL, 50UL, 48UL, 47UL,
+ 51UL, 49UL, 48UL, 46UL, 44UL, 42UL, 41UL, 39UL, 38UL,
+ 42UL, 40UL, 38UL, 37UL, 35UL, 33UL, 32UL, 30UL, 29UL,
+ 33UL, 31UL, 30UL, 28UL, 27UL, 25UL, 24UL, 22UL, 21UL,
+ 138UL, 132UL, 128UL, 123UL, 120UL, 115UL, 112UL, 108UL, 105UL,
+ 115UL, 111UL, 108UL, 104UL, 101UL, 97UL, 95UL, 91UL, 89UL,
+ 96UL, 93UL, 90UL, 87UL, 85UL, 81UL, 79UL, 76UL, 74UL,
+ 81UL, 78UL, 76UL, 73UL, 71UL, 68UL, 66UL, 64UL, 62UL,
+ 67UL, 66UL, 63UL, 62UL, 59UL, 57UL, 55UL, 53UL, 51UL,
+ 56UL, 55UL, 52UL, 51UL, 49UL, 47UL, 45UL, 44UL, 42UL,
+ 46UL, 45UL, 43UL, 41UL, 39UL, 38UL, 36UL, 35UL, 33UL,
+ 37UL, 36UL, 34UL, 32UL, 31UL, 29UL, 28UL, 26UL, 25UL,
+ 28UL, 27UL, 26UL, 24UL, 22UL, 21UL, 19UL, 18UL, 16UL,
+ 124UL, 121UL, 116UL, 113UL, 109UL, 106UL, 102UL, 99UL, 95UL,
+ 105UL, 102UL, 98UL, 95UL, 92UL, 90UL, 86UL, 83UL, 81UL,
+ 88UL, 85UL, 82UL, 80UL, 77UL, 75UL, 72UL, 70UL, 67UL,
+ 73UL, 71UL, 69UL, 67UL, 65UL, 63UL, 60UL, 59UL, 56UL,
+ 62UL, 60UL, 57UL, 56UL, 54UL, 52UL, 50UL, 48UL, 46UL,
+ 51UL, 49UL, 48UL, 46UL, 44UL, 42UL, 40UL, 39UL, 37UL,
+ 42UL, 40UL, 38UL, 37UL, 35UL, 33UL, 32UL, 30UL, 29UL,
+ 33UL, 31UL, 30UL, 28UL, 27UL, 25UL, 24UL, 22UL, 21UL,
+ 25UL, 23UL, 22UL, 20UL, 19UL, 17UL, 16UL, 14UL, 12UL,
+ 114UL, 110UL, 107UL, 103UL, 100UL, 96UL, 94UL, 90UL, 88UL,
+ 95UL, 93UL, 90UL, 87UL, 84UL, 81UL, 78UL, 76UL, 73UL,
+ 81UL, 78UL, 76UL, 73UL, 71UL, 68UL, 66UL, 64UL, 62UL,
+ 67UL, 65UL, 63UL, 61UL, 59UL, 57UL, 55UL, 53UL, 51UL,
+ 56UL, 54UL, 52UL, 50UL, 49UL, 47UL, 45UL, 43UL, 42UL,
+ 46UL, 44UL, 43UL, 41UL, 39UL, 38UL, 36UL, 34UL, 33UL,
+ 37UL, 36UL, 34UL, 32UL, 31UL, 29UL, 28UL, 26UL, 25UL,
+ 28UL, 27UL, 25UL, 24UL, 22UL, 21UL, 19UL, 18UL, 16UL,
+ 20UL, 19UL, 17UL, 16UL, 14UL, 13UL, 11UL, 10UL, 8UL,
+ 104UL, 101UL, 97UL, 95UL, 91UL, 89UL, 85UL, 83UL, 80UL,
+ 88UL, 85UL, 82UL, 79UL, 77UL, 74UL, 72UL, 69UL, 67UL,
+ 73UL, 71UL, 69UL, 66UL, 65UL, 62UL, 60UL, 58UL, 56UL,
+ 62UL, 60UL, 57UL, 56UL, 54UL, 52UL, 50UL, 48UL, 46UL,
+ 51UL, 49UL, 47UL, 46UL, 44UL, 42UL, 40UL, 39UL, 37UL,
+ 41UL, 40UL, 38UL, 37UL, 35UL, 33UL, 31UL, 30UL, 28UL,
+ 32UL, 31UL, 29UL, 28UL, 26UL, 25UL, 23UL, 22UL, 20UL,
+ 25UL, 23UL, 22UL, 20UL, 19UL, 17UL, 16UL, 14UL, 12UL,
+ 16UL, 15UL, 13UL, 12UL, 10UL, 9UL, 7UL, 6UL, 4UL,
+ 95UL, 92UL, 90UL, 86UL, 84UL, 81UL, 78UL, 76UL, 73UL,
+ 80UL, 78UL, 75UL, 73UL, 70UL, 68UL, 66UL, 64UL, 62UL,
+ 67UL, 65UL, 63UL, 61UL, 59UL, 57UL, 55UL, 53UL, 51UL,
+ 56UL, 54UL, 52UL, 50UL, 48UL, 47UL, 45UL, 43UL, 41UL,
+ 46UL, 44UL, 43UL, 41UL, 39UL, 38UL, 36UL, 34UL, 33UL,
+ 37UL, 35UL, 34UL, 32UL, 31UL, 29UL, 28UL, 26UL, 25UL,
+ 28UL, 27UL, 25UL, 24UL, 22UL, 21UL, 19UL, 18UL, 16UL,
+ 20UL, 19UL, 17UL, 16UL, 14UL, 12UL, 11UL, 9UL, 8UL,
+ 12UL, 11UL, 9UL, 8UL, 6UL, 5UL, 3UL, 2UL, 0UL
+};
+#endif
+
+uint32_t ulMapDJ970_KCMY[ 9*9*9 ]=
+{
+ 673723135UL, 26007371UL, 9756717UL, 10020638UL, 10022677UL, 10153743UL,
+ 10285066UL, 10416133UL, 9169408UL, 3405886809UL, 59743UL, 23980849UL,
+ 9366812UL, 10153744UL, 10285066UL, 10153990UL, 10087424UL, 9169408UL,
+3858807091UL, 2197868343UL, 60220UL, 4714015UL, 7270155UL, 8646656UL,
+ 8579328UL, 8382208UL, 7791360UL, 3875584801UL, 3187785766UL, 1660999718UL,
+ 60710UL, 36498447UL, 4646144UL, 5166848UL, 5624832UL, 5886976UL,
+3875585303UL, 3573661210UL, 2667629594UL, 1208016666UL, 319808529UL, 304931585UL,
+ 3000832UL, 3652608UL, 4176384UL, 3892820492UL, 3758145040UL, 3187721745UL,
+2197869329UL, 939582223UL, 387244805UL, 152818688UL, 2341120UL, 2927872UL,
+3909859588UL, 3892624647UL, 3472998923UL, 2835401737UL, 1728109064UL, 957341698UL,
+ 336716032UL, 1099008UL, 1944832UL, 3909661952UL, 3909269763UL, 3741368579UL,
+3238053891UL, 2516635904UL, 1375786499UL, 688380160UL, 56064UL, 1031168UL,
+3925912832UL, 3909136896UL, 3691033856UL, 3355490816UL, 2717957120UL, 1778432512UL,
+ 973126144UL, 436259072UL, 54784UL, 3183805035UL, 13972558UL, 11965228UL,
+ 11449373UL, 10995222UL, 27643922UL, 27514893UL, 27451400UL, 9560832UL,
+4015155266UL, 1835890539UL, 211079218UL, 26991389UL, 27255056UL, 27321354UL,
+ 10087171UL, 9168128UL, 8249088UL, 3928464674UL, 3004413502UL, 809093171UL,
+ 308797461UL, 109046276UL, 8512768UL, 8118528UL, 7658752UL, 7133184UL,
+3910708498UL, 3523329062UL, 2165818909UL, 993775120UL, 575525632UL, 4378368UL,
+ 5164288UL, 5623040UL, 5753856UL, 3910513160UL, 3892624145UL, 2919613972UL,
+1730004745UL, 892520192UL, 288014592UL, 2864640UL, 3649536UL, 4240640UL,
+3910120707UL, 3892689928UL, 3305161995UL, 2349777670UL, 1276887296UL, 505330688UL,
+ 119058688UL, 2204416UL, 2859264UL, 3909923840UL, 3909138435UL, 3523263488UL,
+2802367488UL, 1661777152UL, 823047168UL, 252687104UL, 958464UL, 1873408UL,
+3925912576UL, 3691030016UL, 3338708224UL, 2801837312UL, 1912644608UL, 1057007104UL,
+ 520136448UL, 84257792UL, 956928UL, 3724581888UL, 3506475520UL, 3254817536UL,
+2852164608UL, 2214631936UL, 1493213184UL, 855680256UL, 385919744UL, 44544UL,
+3805020222UL, 904134721UL, 14429742UL, 12876059UL, 12034579UL, 11580943UL,
+ 11387914UL, 11128584UL, 10082048UL, 3935974696UL, 2377526339UL, 381966891UL,
+ 12422935UL, 11841035UL, 11517956UL, 10734848UL, 9752576UL, 8441856UL,
+4017191173UL, 3663951909UL, 2509611275UL, 1100725504UL, 226741760UL, 7917824UL,
+ 7590144UL, 7129856UL, 6668800UL, 3980299776UL, 3895762190UL, 3075845379UL,
+1583263232UL, 559065856UL, 4698880UL, 5421824UL, 5684224UL, 5618176UL,
+3961691136UL, 3927877891UL, 3375083778UL, 1932502272UL, 875864832UL, 271360256UL,
+ 3056128UL, 3909376UL, 4369408UL, 3943867136UL, 3926765056UL, 3474239744UL,
+2300093184UL, 1176083200UL, 538810368UL, 102274048UL, 2199808UL, 2921984UL,
+3943081472UL, 3791692800UL, 3305152000UL, 2433193984UL, 1443467776UL, 738889472UL,
+ 286100736UL, 886016UL, 1737216UL, 3875577088UL, 3439363584UL, 3120596736UL,
+2516616704UL, 1660978688UL, 973113088UL, 453019136UL, 33280UL, 883456UL,
+3573581056UL, 3271587328UL, 2986374144UL, 2499834880UL, 1862301440UL, 1291876864UL,
+ 805339648UL, 352355328UL, 33792UL, 3838771235UL, 2229010470UL, 233504809UL,
+ 14755610UL, 13525519UL, 12553738UL, 12035848UL, 11647238UL, 10798848UL,
+3904054036UL, 3200782122UL, 1003559969UL, 131218706UL, 13266692UL, 12162304UL,
+ 11511808UL, 10859264UL, 10009088UL, 4002237696UL, 3801629204UL, 2762892800UL,
+1152083712UL, 194999040UL, 9931776UL, 9608448UL, 8889856UL, 7842560UL,
+4098708736UL, 3999230464UL, 3127209220UL, 1583244288UL, 609975040UL, 5149696UL,
+ 5547520UL, 5679872UL, 5548032UL, 4062537728UL, 3978851584UL, 3106761472UL,
+1882548992UL, 926511360UL, 288454400UL, 3375616UL, 4101120UL, 4364800UL,
+4027612672UL, 3943597056UL, 3222631168UL, 2132504320UL, 1159557120UL, 538996992UL,
+ 102461696UL, 2389760UL, 2982400UL, 3942679808UL, 3707795968UL, 3120589824UL,
+2315808768UL, 1393257984UL, 722234368UL, 286157568UL, 944384UL, 1797120UL,
+3741350656UL, 3321914624UL, 2952815360UL, 2365613824UL, 1543530240UL, 922772736UL,
+ 436233472UL, 24832UL, 812032UL, 3472911104UL, 3137363200UL, 2785040896UL,
+2281724672UL, 1660967680UL, 1157651968UL, 738222592UL, 335569664UL, 25088UL,
+3838836756UL, 2899836951UL, 1189412888UL, 15597591UL, 15015690UL, 13914373UL,
+ 13007875UL, 12360194UL, 11578624UL, 3904642310UL, 3503097879UL, 1725237778UL,
+ 601694217UL, 81081089UL, 12932864UL, 12089088UL, 11308032UL, 10787840UL,
+3969395712UL, 3853397762UL, 2779723008UL, 1269511680UL, 346766080UL, 10637312UL,
+ 10185984UL, 9666560UL, 8948992UL, 4099617792UL, 3882433280UL, 2875668992UL,
+1617574912UL, 661537024UL, 6703360UL, 7300096UL, 7436032UL, 6914048UL,
+4163778304UL, 3945872896UL, 3107536896UL, 1966948864UL, 1061110784UL, 322653952UL,
+ 3824896UL, 4420096UL, 4553728UL, 4128524288UL, 3977595904UL, 3122152448UL,
+2082292736UL, 1176585984UL, 589516032UL, 102715136UL, 2579200UL, 3172608UL,
+4110440960UL, 3674230016UL, 3037153536UL, 2181711872UL, 1376668672UL, 739200512UL,
+ 269504512UL, 1134336UL, 1922048UL, 3741342208UL, 3254799360UL, 2835367936UL,
+2197833216UL, 1442859008UL, 889211648UL, 419449600UL, 18688UL, 806144UL,
+3422573824UL, 3019917824UL, 2650817792UL, 2113946880UL, 1560299264UL, 1107315200UL,
+ 721439488UL, 352341248UL, 18944UL, 3855353864UL, 3235184653UL, 2011168781UL,
+ 585826314UL, 15468551UL, 15145472UL, 14304000UL, 13461760UL, 12749312UL,
+3904640001UL, 3671001096UL, 2463697669UL, 936907522UL, 232003840UL, 13181952UL,
+ 12534272UL, 11886336UL, 11237120UL, 3969652992UL, 3853391872UL, 2846693888UL,
+1353390848UL, 481238528UL, 11084800UL, 10895616UL, 10377216UL, 9660928UL,
+4083424768UL, 3815579136UL, 2825527296UL, 1634542080UL, 779232256UL, 158607360UL,
+ 7945472UL, 8147200UL, 7757824UL, 4164428544UL, 3694667008UL, 2822513920UL,
+1849763328UL, 994387968UL, 340339456UL, 4929536UL, 5655808UL, 5724672UL,
+4212793856UL, 3894158848UL, 3072403712UL, 2082810624UL, 1227304192UL, 656878080UL,
+ 103167232UL, 2900736UL, 3494144UL, 4178063104UL, 3825806848UL, 3087739904UL,
+2181901824UL, 1326395392UL, 772944896UL, 303183104UL, 1259264UL, 1982976UL,
+3909106176UL, 3372233216UL, 2818584576UL, 2147495936UL, 1392521216UL, 855650816UL,
+ 419443712UL, 13824UL, 866560UL, 3456122368UL, 2969581568UL, 2566927616UL,
+2080388096UL, 1543517440UL, 1073755648UL, 687880192UL, 352335872UL, 14080UL,
+3872000258UL, 3453223175UL, 2648440837UL, 1290141699UL, 351076352UL, 15534080UL,
+ 15339776UL, 14169344UL, 13785600UL, 3904572160UL, 3754754051UL, 2832334848UL,
+1288699904UL, 348979200UL, 13175552UL, 12851712UL, 12399616UL, 12079104UL,
+3953003520UL, 3853125120UL, 2745171968UL, 1453786624UL, 581568768UL, 10881536UL,
+ 11214080UL, 11089152UL, 10570240UL, 4067102464UL, 3798797824UL, 2825456896UL,
+1651314176UL, 829624320UL, 259723520UL, 8330240UL, 8729344UL, 8537344UL,
+4047377920UL, 3577419008UL, 2789151744UL, 1816335616UL, 1011291392UL, 458102272UL,
+ 5183744UL, 6041600UL, 6308608UL, 4011989504UL, 3542227456UL, 2720208896UL,
+1898452992UL, 1160452096UL, 623843328UL, 120593408UL, 3680768UL, 4209152UL,
+4245624064UL, 3792771584UL, 3021019392UL, 2182355712UL, 1360403712UL, 823598848UL,
+ 404232704UL, 1582080UL, 2240256UL, 4110425088UL, 3539998976UL, 2902464768UL,
+2181044736UL, 1375738624UL, 805313280UL, 436216064UL, 8448UL, 927744UL,
+3674220288UL, 3103794176UL, 2617254912UL, 2046829824UL, 1476404480UL, 1023419648UL,
+ 654321408UL, 335554304UL, 9472UL, 3888645121UL, 3637772291UL, 3050897410UL,
+1977745408UL, 854196224UL, 233701376UL, 15400960UL, 15141632UL, 14494464UL,
+3904438272UL, 3653238784UL, 2864578560UL, 1774321664UL, 801570816UL, 214433792UL,
+ 12977920UL, 12849664UL, 12658944UL, 3969646592UL, 3667853312UL, 2795241472UL,
+1721892864UL, 849870848UL, 229179392UL, 11142912UL, 11343104UL, 11282688UL,
+3983212544UL, 3664314368UL, 2808545280UL, 1684733952UL, 913440768UL, 309854208UL,
+ 8390144UL, 9180672UL, 9251072UL, 3980331008UL, 3476751616UL, 2688155648UL,
+1715404800UL, 943915008UL, 491520000UL, 5373952UL, 6166016UL, 6760704UL,
+3794145024UL, 3324185600UL, 2619672832UL, 1831471360UL, 1127024896UL, 607127808UL,
+ 204802304UL, 3871744UL, 4531200UL, 3944157696UL, 3440643840UL, 2736000256UL,
+1897270272UL, 1226312704UL, 739838976UL, 320604672UL, 2035968UL, 2694912UL,
+4161145600UL, 3607497728UL, 2936343552UL, 2164657152UL, 1443302912UL, 872877824UL,
+ 503845120UL, 185273344UL, 1055488UL, 3976205056UL, 3305115904UL, 2701136384UL,
+2080379648UL, 1509954816UL, 989861120UL, 587207936UL, 318772992UL, 5888UL,
+3738435584UL, 3621060608UL, 3218210816UL, 2497183744UL, 1441071104UL, 720044032UL,
+ 300810240UL, 15728640UL, 15728640UL, 3904307200UL, 3434151936UL, 2914320384UL,
+2176581632UL, 1287979008UL, 633995264UL, 248250368UL, 13500416UL, 13565952UL,
+3852009472UL, 3348234240UL, 2727608320UL, 1973157888UL, 1252327424UL, 631963648UL,
+ 229507072UL, 11468800UL, 11730944UL, 3664314368UL, 3261333504UL, 2691235840UL,
+1852768256UL, 1215758336UL, 662568960UL, 226820096UL, 9175040UL, 9830400UL,
+3611230208UL, 3158245376UL, 2588082176UL, 1850212352UL, 1179516928UL, 710082560UL,
+ 274202624UL, 6160384UL, 7208960UL, 3659857920UL, 3173384192UL, 2502492160UL,
+1798111232UL, 1160839168UL, 691208192UL, 322306048UL, 3932160UL, 4849664UL,
+3507486720UL, 3037790208UL, 2467561472UL, 1763115008UL, 1159331840UL, 706412544UL,
+ 354287616UL, 2293760UL, 3080192UL, 3741581312UL, 3288662016UL, 2667970560UL,
+1896284160UL, 1225261056UL, 755564544UL, 436928512UL, 118423552UL, 1572864UL,
+4278190080UL, 3472883712UL, 2818572288UL, 2097152000UL, 1493172224UL, 1006632960UL,
+ 620756992UL, 335544320UL, 0UL,
+ };
+
+uint32_t ulMapDJ970_KCMY_3x3x2[ 9*9*9 ]=
+{
+1920105215UL, 60881733UL, 10551078UL, 10288922UL, 10223378UL, 9895694UL,
+ 9895690UL, 10157829UL, 10157824UL, 4278246736UL, 65363UL, 8388394UL,
+ 9895705UL, 9961232UL, 9895691UL, 10092296UL, 10092292UL, 10157824UL,
+4278966312UL, 2818631985UL, 65334UL, 6291229UL, 8257294UL, 9109254UL,
+ 10223360UL, 9699072UL, 9633536UL, 4279751190UL, 3791969570UL, 2231430434UL,
+ 65318UL, 4259603UL, 6553347UL, 7533568UL, 7859712UL, 8055296UL,
+4280339978UL, 4278246676UL, 3187729943UL, 1761669401UL, 65305UL, 2883338UL,
+ 5041408UL, 6084608UL, 6608128UL, 4280732161UL, 4278246669UL, 3674398992UL,
+2717968655UL, 1459680272UL, 65295UL, 2095363UL, 4183808UL, 5098496UL,
+4279552258UL, 4279162627UL, 4043431433UL, 3271615752UL, 2315316489UL, 1191245065UL,
+ 50396937UL, 1828864UL, 3525632UL, 4278830848UL, 4278767360UL, 4278245632UL,
+3707822336UL, 2936072195UL, 1996549891UL, 1006696195UL, 65283UL, 1759488UL,
+4278237952UL, 4278239744UL, 4110469632UL, 3674263296UL, 3254835200UL, 2516638720UL,
+1644223744UL, 822144768UL, 65280UL, 3706389867UL, 16138823UL, 64936234UL,
+ 31323927UL, 46595346UL, 11992843UL, 11337480UL, 11337476UL, 11009792UL,
+4287273261UL, 2189593947UL, 10813229UL, 10747673UL, 10485519UL, 10354441UL,
+ 10485509UL, 10551040UL, 9696256UL, 4283283480UL, 3641890107UL, 657252153UL,
+ 57604636UL, 9109259UL, 9961219UL, 10026752UL, 9697280UL, 9039360UL,
+4282106121UL, 4278900765UL, 2517100065UL, 774168097UL, 172879376UL, 6747648UL,
+ 7727616UL, 8054272UL, 8052992UL, 4281516545UL, 4279293453UL, 3355501844UL,
+1946870037UL, 858381071UL, 524541952UL, 5101568UL, 6082560UL, 6672640UL,
+4280532992UL, 4279293187UL, 3791773706UL, 2869551879UL, 1813699845UL, 858380291UL,
+ 237622272UL, 3917568UL, 4964864UL, 4279354112UL, 4278767104UL, 4110473728UL,
+3238059010UL, 2383206400UL, 1477891328UL, 555275008UL, 1492992UL, 3324672UL,
+4278238464UL, 4127243776UL, 3774923264UL, 3288384512UL, 2634073344UL, 1828767744UL,
+1057475328UL, 235392768UL, 1556736UL, 4060131584UL, 3808472320UL, 3607147264UL,
+3288380928UL, 2835396864UL, 2248196352UL, 1543555072UL, 738249984UL, 53504UL,
+4293787704UL, 1291452479UL, 16138023UL, 15184662UL, 31578384UL, 81393413UL,
+ 13827840UL, 12910336UL, 12451584UL, 4289880862UL, 2848079424UL, 350061354UL,
+ 15058449UL, 31451141UL, 13826304UL, 12645632UL, 11464192UL, 10412032UL,
+4287139584UL, 4085422877UL, 2307494948UL, 949800976UL, 243856386UL, 11138816UL,
+ 10219520UL, 9627136UL, 9099264UL, 4283998720UL, 4283741450UL, 3058153496UL,
+1515567640UL, 863227650UL, 7657728UL, 7984896UL, 8181248UL, 8114944UL,
+4281773568UL, 4281907968UL, 3677079305UL, 2284831499UL, 1380369157UL, 541837568UL,
+ 5425152UL, 6342912UL, 6867712UL, 4280267008UL, 4279876608UL, 3960655874UL,
+2955134465UL, 1932051456UL, 976142592UL, 220970752UL, 3979520UL, 5159424UL,
+4278957056UL, 4278237696UL, 3909141504UL, 3104358144UL, 2248981760UL, 1393737472UL,
+ 538294784UL, 1487616UL, 3124736UL, 4278235392UL, 3842025984UL, 3556814592UL,
+3103830272UL, 2449519104UL, 1744877056UL, 906016512UL, 184595968UL, 1420032UL,
+3858801664UL, 3573587456UL, 3372261376UL, 3053494784UL, 2550178816UL, 2046863616UL,
+1459663360UL, 687911936UL, 46080UL, 4293006619UL, 2918449187UL, 385744936UL,
+ 16266776UL, 15374604UL, 15057667UL, 14802432UL, 13559552UL, 12314112UL,
+4290923277UL, 3957592103UL, 1138761255UL, 65824019UL, 15312642UL, 14534144UL,
+ 13619968UL, 12637696UL, 11522816UL, 4288179200UL, 4205668878UL, 2611569687UL,
+1085699858UL, 281126656UL, 12303104UL, 11913216UL, 11258880UL, 10340864UL,
+4284640000UL, 4285956864UL, 3430714118UL, 2273809152UL, 1166453760UL, 158907392UL,
+ 8504832UL, 8439808UL, 8242176UL, 4282089728UL, 4282552576UL, 3679493632UL,
+2690162944UL, 1633461760UL, 593078528UL, 5944320UL, 6732288UL, 7060992UL,
+4280325632UL, 4280196864UL, 3760366848UL, 2922292736UL, 1966187520UL, 1060480256UL,
+ 221423360UL, 4368640UL, 5419008UL, 4278886144UL, 4278231296UL, 3640696832UL,
+3037701120UL, 2215879936UL, 1410704128UL, 555196416UL, 1612800UL, 3251456UL,
+4144013056UL, 3707802624UL, 3422590208UL, 3019938304UL, 2348850176UL, 1694539520UL,
+ 889233152UL, 117479424UL, 1348608UL, 3724579328UL, 3489696256UL, 3238037760UL,
+2936048896UL, 2449510400UL, 1946194432UL, 1426102272UL, 671127808UL, 38400UL,
+4292615945UL, 3538944278UL, 1878523928UL, 16647962UL, 16330251UL, 15566339UL,
+ 15249664UL, 14403072UL, 13421824UL, 4291180801UL, 4192668434UL, 2246838038UL,
+ 300881686UL, 15948544UL, 14715392UL, 13937152UL, 13417472UL, 12435712UL,
+4288825344UL, 4290465028UL, 3149939976UL, 1539196173UL, 566847232UL, 12748032UL,
+ 12625408UL, 12235776UL, 11384576UL, 4285617152UL, 4286734080UL, 3499386880UL,
+2459265792UL, 1251635200UL, 9927936UL, 10459904UL, 10332672UL, 9743872UL,
+4282666752UL, 4283392256UL, 3663424256UL, 2774692096UL, 1768518144UL, 677610240UL,
+ 6394880UL, 7054848UL, 7318016UL, 4280575744UL, 4280643328UL, 3727324416UL,
+2872342272UL, 2034007040UL, 1128235264UL, 221938944UL, 4887040UL, 5742080UL,
+4279073024UL, 4278680832UL, 3658120448UL, 2953870080UL, 2216328960UL, 1461486080UL,
+ 572294144UL, 1934592UL, 3508992UL, 4177559808UL, 3674241536UL, 3389028608UL,
+2969598464UL, 2332065024UL, 1644199424UL, 906002688UL, 100695040UL, 1343744UL,
+3623910656UL, 3389027840UL, 3187700736UL, 2868933888UL, 2399172864UL, 1895856384UL,
+1409318144UL, 721453312UL, 31488UL, 4292222976UL, 3807248909UL, 2700345356UL,
+1123745804UL, 16649227UL, 16458243UL, 15757824UL, 14785024UL, 14070272UL,
+4291175424UL, 4226027779UL, 2918383626UL, 1374620934UL, 149889537UL, 15090688UL,
+ 14184960UL, 13537792UL, 13018880UL, 4289341696UL, 4290521088UL, 3418891777UL,
+2093493248UL, 818557952UL, 12993536UL, 12742912UL, 12553984UL, 12099840UL,
+4286263808UL, 4287051264UL, 3516152576UL, 2476228608UL, 1453212416UL, 279005696UL,
+ 11037952UL, 11176704UL, 10721280UL, 4283579648UL, 4284171008UL, 3479586560UL,
+2708098048UL, 1836011264UL, 745689856UL, 7758592UL, 8617728UL, 8556032UL,
+4281153280UL, 4281287936UL, 3694545408UL, 2940162048UL, 2084918528UL, 1280070144UL,
+ 272982784UL, 5076224UL, 5998080UL, 4279454720UL, 4279259648UL, 3725808896UL,
+2971096832UL, 2182895616UL, 1495424512UL, 572678912UL, 2319872UL, 3764992UL,
+4278214400UL, 3791674880UL, 3372244224UL, 2936036864UL, 2248170496UL, 1694983168UL,
+ 956720384UL, 134242816UL, 1533952UL, 3590350336UL, 3321914112UL, 3070255360UL,
+2785042688UL, 2365612800UL, 1862296832UL, 1342203392UL, 704669696UL, 25856UL,
+4291827200UL, 4075356422UL, 3169976325UL, 1945632774UL, 687669253UL, 16583939UL,
+ 16521216UL, 15293952UL, 14517248UL, 4291105792UL, 4292675840UL, 3371237376UL,
+2012151808UL, 518586368UL, 14882304UL, 14496000UL, 13786624UL, 13270528UL,
+4289664512UL, 4290514432UL, 3401449472UL, 2277968128UL, 1086852608UL, 12849920UL,
+ 12990464UL, 12804096UL, 12418048UL, 4286978560UL, 4287764224UL, 3516273920UL,
+2509903872UL, 1537153536UL, 480517632UL, 11220480UL, 11492864UL, 11368960UL,
+4284163072UL, 4284490240UL, 3496419840UL, 2674729984UL, 1853040384UL, 947398912UL,
+ 8007680UL, 9067008UL, 9532416UL, 4281739776UL, 4080544256UL, 3460114944UL,
+2756127744UL, 2051878400UL, 1330721024UL, 307443200UL, 6114816UL, 6907392UL,
+4280034048UL, 4279839488UL, 3625659648UL, 2988454144UL, 2200187648UL, 1512519168UL,
+ 757936384UL, 2835968UL, 3889408UL, 4278596864UL, 4110431232UL, 3523228928UL,
+2969581056UL, 2214606592UL, 1644575744UL, 990659584UL, 168445440UL, 1592576UL,
+3741336832UL, 3389014784UL, 3070247936UL, 2684372480UL, 2298497024UL, 1828735232UL,
+1308642048UL, 654330624UL, 18688UL, 4291628544UL, 4142202880UL, 3521970176UL,
+2599682048UL, 1492779008UL, 519897088UL, 16647424UL, 16584704UL, 15289088UL,
+4291037184UL, 4292280320UL, 3470589952UL, 2547843072UL, 1457520640UL, 400424960UL,
+ 14290176UL, 14098176UL, 13913088UL, 4290119424UL, 4290772992UL, 3418161152UL,
+2562785280UL, 1589903360UL, 465960960UL, 12979712UL, 13051136UL, 12865024UL,
+4287367168UL, 4287889408UL, 3466067968UL, 2593718272UL, 1738539008UL, 648085504UL,
+ 11012608UL, 11610112UL, 11619840UL, 4284484864UL, 4200728320UL, 3462989312UL,
+2658206976UL, 1869940480UL, 1065027840UL, 159320576UL, 9054208UL, 9850624UL,
+4282193152UL, 4013691648UL, 3376549632UL, 2722828032UL, 2001735680UL, 1347621120UL,
+ 441979392UL, 6366208UL, 7227392UL, 4280294400UL, 3961395456UL, 3374322944UL,
+2737181952UL, 2100040960UL, 1479611904UL, 724834048UL, 3612160UL, 4536832UL,
+4278915328UL, 4060550400UL, 3506902272UL, 2970228736UL, 2349537536UL, 1661868800UL,
+ 974068992UL, 336860416UL, 1912576UL, 4076872192UL, 3456115200UL, 3087016704UL,
+2717918464UL, 2248157440UL, 1778395648UL, 1207970048UL, 587213824UL, 11264UL,
+4293459968UL, 4293787648UL, 3773825024UL, 3035824128UL, 2096562176UL, 1308229632UL,
+ 587005952UL, 167641088UL, 16711680UL, 4291035136UL, 4022730752UL, 3469869056UL,
+2882797568UL, 2027487232UL, 1222443008UL, 501022720UL, 14483456UL, 14548992UL,
+4290314240UL, 3903848448UL, 3350659072UL, 2797404160UL, 2059468800UL, 1204027392UL,
+ 449183744UL, 13041664UL, 13172736UL, 4153344000UL, 3733913600UL, 3348496384UL,
+2761687040UL, 2091122688UL, 1319567360UL, 480903168UL, 11468800UL, 11927552UL,
+4066770944UL, 3630759936UL, 3295608832UL, 2725773312UL, 2054881280UL, 1417740288UL,
+ 562233344UL, 9109504UL, 9961472UL, 4282449920UL, 3762421760UL, 3242786816UL,
+2639265792UL, 2052587520UL, 1448804352UL, 710868992UL, 6488064UL, 7405568UL,
+3944218624UL, 3592290304UL, 3206742016UL, 2636906496UL, 2066808832UL, 1479868416UL,
+ 792133632UL, 121372672UL, 5046272UL, 3976200192UL, 3590324224UL, 3238330368UL,
+2752118784UL, 2114846720UL, 1527906304UL, 924123136UL, 253296640UL, 2490368UL,
+4278190080UL, 3657433088UL, 3254779904UL, 2818572288UL, 2298478592UL, 1795162112UL,
+1224736768UL, 603979776UL, 0UL,
+};
+
+APDK_END_NAMESPACE
diff --git a/prnt/hpijs/dj970_maps2.cpp b/prnt/hpijs/dj970_maps2.cpp
new file mode 100644
index 0000000..74dcf23
--- /dev/null
+++ b/prnt/hpijs/dj970_maps2.cpp
@@ -0,0 +1,165 @@
+/*****************************************************************************\
+ dj970_maps2.cpp : Color maps for DJ970
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#include "config.h"
+
+#include "global_types.h"
+
+APDK_BEGIN_NAMESPACE
+
+uint32_t ulMapDJ970_Gossimer_Normal_KCMY[ 9*9*9 ]=
+{
+3351632640UL, 2545805056UL, 1604580608UL, 982710016UL, 646379776UL, 343603456UL,
+ 158529792UL, 6945024UL, 6813952UL, 3951407872UL, 2543246848UL, 1821825536UL,
+ 831126272UL, 343537920UL, 124843776UL, 7010048UL, 6877440UL, 6744832UL,
+4116689152UL, 3446196736UL, 1835912448UL, 1097779456UL, 358863872UL, 6018304UL,
+ 6540544UL, 6671616UL, 6540544UL, 4114591232UL, 3947086592UL, 2706096640UL,
+1246349568UL, 642302976UL, 88260864UL, 4829952UL, 5157376UL, 5486336UL,
+4113345536UL, 4012686592UL, 3056777984UL, 2050081024UL, 774753024UL, 321766912UL,
+ 3256832UL, 3842560UL, 4103936UL, 4078807808UL, 4011636480UL, 3273701888UL,
+2468656896UL, 1478476800UL, 471453696UL, 119390720UL, 2794752UL, 3315712UL,
+4044531456UL, 3977294592UL, 3440555776UL, 2736304384UL, 1981330432UL, 1058195456UL,
+ 269210368UL, 1292544UL, 2399232UL, 4043809792UL, 4010257408UL, 3523850240UL,
+2920197120UL, 2316414208UL, 1561376000UL, 755485440UL, 67163392UL, 1289728UL,
+4076903680UL, 3808468480UL, 3355482880UL, 2801832704UL, 2231406080UL, 1644203776UL,
+ 973118720UL, 503365376UL, 52224UL, 3737164032UL, 2414321408UL, 1121105152UL,
+ 398182656UL, 10607872UL, 9496320UL, 8778496UL, 8189184UL, 7534336UL,
+4186805760UL, 2711663104UL, 1990112000UL, 932235520UL, 259776768UL, 7268608UL,
+ 7200256UL, 7262976UL, 7131136UL, 4284259072UL, 3379471616UL, 2272503552UL,
+1232382720UL, 476953088UL, 6603008UL, 6668544UL, 6668544UL, 6603008UL,
+4181368832UL, 3544622848UL, 2588713472UL, 1515038208UL, 726378240UL, 155625728UL,
+ 4893184UL, 5352704UL, 5616128UL, 4146372864UL, 3643516160UL, 2838601728UL,
+1983029248UL, 942842368UL, 372285696UL, 3185664UL, 3708672UL, 4102912UL,
+4078215424UL, 3625492992UL, 2971507968UL, 2250283520UL, 1327471872UL, 572432640UL,
+ 119381248UL, 2527232UL, 3116032UL, 4077560320UL, 3591085568UL, 3071252992UL,
+2417071872UL, 1712559872UL, 907058432UL, 269459456UL, 1217536UL, 2132736UL,
+3909131008UL, 3489699072UL, 3104084992UL, 2533790208UL, 1980273152UL, 1225363968UL,
+ 621190144UL, 84188672UL, 1216512UL, 3808465920UL, 3489697792UL, 3187708160UL,
+2684391424UL, 2164296704UL, 1526761984UL, 889228800UL, 436248832UL, 41472UL,
+3888412160UL, 2631563008UL, 1339844864UL, 399216128UL, 12100096UL, 11121664UL,
+ 10141696UL, 9358592UL, 8706304UL, 4288117504UL, 3064168704UL, 1990820352UL,
+ 866487552UL, 194746368UL, 9742592UL, 9155328UL, 8567040UL, 7978496UL,
+4283521280UL, 3295969024UL, 2122091008UL, 1283034880UL, 527473920UL, 6596864UL,
+ 6729984UL, 6664960UL, 6533120UL, 4281826048UL, 3309666560UL, 2538505728UL,
+1548781824UL, 760188160UL, 189371392UL, 5151488UL, 5611520UL, 5678080UL,
+4213410304UL, 3358230016UL, 2721155072UL, 1899202560UL, 942770944UL, 372280320UL,
+ 3181056UL, 3837440UL, 4297984UL, 4178808320UL, 3373696768UL, 2820442112UL,
+2132706816UL, 1260291584UL, 555582720UL, 119309056UL, 2457344UL, 3047168UL,
+4144468480UL, 3356133376UL, 2869659136UL, 2265809920UL, 1544454656UL, 839746048UL,
+ 286032640UL, 1145600UL, 1996544UL, 3724577792UL, 3288368128UL, 2902491904UL,
+2415952896UL, 1795457536UL, 1090879232UL, 536904448UL, 32512UL, 1079296UL,
+3623913216UL, 3271589888UL, 2952823040UL, 2550170112UL, 2046853376UL, 1409318144UL,
+ 855670016UL, 385908992UL, 33024UL, 4022356992UL, 2848934912UL, 1741574400UL,
+ 785336320UL, 96562432UL, 11963136UL, 11181056UL, 10266368UL, 9745408UL,
+3952694016UL, 3047315456UL, 2124831488UL, 1118330368UL, 279145472UL, 10388224UL,
+ 10130432UL, 9477376UL, 8823808UL, 3698415872UL, 3094960896UL, 2306760192UL,
+1317233152UL, 478374400UL, 8419328UL, 8620800UL, 8230144UL, 7575808UL,
+3980742912UL, 3243072512UL, 2522111232UL, 1532650496UL, 777415680UL, 206535168UL,
+ 5343744UL, 5608192UL, 5673984UL, 4112867840UL, 3257688320UL, 2586796288UL,
+1848993280UL, 942958336UL, 389311232UL, 3436800UL, 4030208UL, 4491264UL,
+3776212736UL, 3222759424UL, 2652464384UL, 2048813056UL, 1209952000UL, 572352512UL,
+ 119302144UL, 2517504UL, 3175424UL, 3725097216UL, 3238620416UL, 2735302912UL,
+2232314624UL, 1477339648UL, 806250496UL, 286025472UL, 1074432UL, 1925888UL,
+3556800512UL, 3170921472UL, 2768267776UL, 2298505984UL, 1694526208UL, 1023436544UL,
+ 486565120UL, 25344UL, 942080UL, 3523246080UL, 3154144256UL, 2768267520UL,
+2449501184UL, 1929407744UL, 1342204672UL, 822110208UL, 369124864UL, 25088UL,
+3853987072UL, 2982686464UL, 1925853696UL, 1086862848UL, 482881792UL, 12473344UL,
+ 11761664UL, 11045632UL, 10327808UL, 3751359232UL, 3013686272UL, 2175154176UL,
+1252473600UL, 581385472UL, 10571776UL, 10383616UL, 9994752UL, 9538816UL,
+3598006528UL, 3061594880UL, 2306948352UL, 1417953024UL, 663175168UL, 8604416UL,
+ 8939776UL, 8944640UL, 8487936UL, 3444522240UL, 2991799808UL, 2388213760UL,
+1616724224UL, 794837760UL, 157239296UL, 6774528UL, 7172608UL, 6912768UL,
+3727570688UL, 3224452352UL, 2603892480UL, 1849180416UL, 943210752UL, 406407936UL,
+ 3626496UL, 4221696UL, 4617216UL, 3944104960UL, 3222881024UL, 2602189824UL,
+1914520832UL, 1210140672UL, 555829248UL, 102779648UL, 2774528UL, 3368192UL,
+3674886912UL, 3121236992UL, 2617854208UL, 2047559936UL, 1410354176UL, 789596672UL,
+ 252594688UL, 1199104UL, 1987072UL, 3556793856UL, 3019919872UL, 2617265408UL,
+2164280320UL, 1610829824UL, 973098240UL, 453003008UL, 17664UL, 870912UL,
+3405800448UL, 2969589504UL, 2583711744UL, 2248167424UL, 1845515776UL, 1224758016UL,
+ 788548864UL, 369117440UL, 17920UL, 3853850880UL, 3166837248UL, 2160729088UL,
+1154162432UL, 634003968UL, 281551360UL, 12468992UL, 11757312UL, 11107840UL,
+3751353344UL, 3013417984UL, 2242060288UL, 1302799360UL, 682108160UL, 245901568UL,
+ 10699008UL, 10313728UL, 9991424UL, 3547931136UL, 3061719808UL, 2307073024UL,
+1502029568UL, 763963648UL, 210446848UL, 9125632UL, 9198336UL, 8874752UL,
+3344049664UL, 2991990528UL, 2371627008UL, 1616849408UL, 878914048UL, 291843072UL,
+ 7027712UL, 7558144UL, 7430656UL, 3291884288UL, 2939562496UL, 2402888192UL,
+1748839168UL, 1044458240UL, 423701760UL, 4338432UL, 5130240UL, 5461504UL,
+3592299776UL, 3206424576UL, 2652908032UL, 1965239296UL, 1227173120UL, 606350080UL,
+ 136721408UL, 2834176UL, 3428096UL, 3876401152UL, 3188534784UL, 2668441344UL,
+2014130176UL, 1309618176UL, 789721856UL, 286339840UL, 1390080UL, 2113280UL,
+3640670976UL, 3036689664UL, 2566927616UL, 2046833664UL, 1409298944UL, 923022848UL,
+ 486749440UL, 12288UL, 931584UL, 3405793024UL, 2852142592UL, 2466265856UL,
+2063612160UL, 1644181760UL, 1157643008UL, 721434880UL, 352335104UL, 12800UL,
+3987999744UL, 3401780224UL, 2396064512UL, 1154878464UL, 534122240UL, 282268160UL,
+ 147724544UL, 12662272UL, 12212480UL, 3818458624UL, 3080457472UL, 2342653696UL,
+1453723904UL, 732500736UL, 346625536UL, 111680000UL, 10827008UL, 10572288UL,
+3581678080UL, 3045069056UL, 2307002624UL, 1552356096UL, 797578496UL, 294393344UL,
+ 9181952UL, 9450752UL, 9325824UL, 3361150464UL, 2975405056UL, 2371752960UL,
+1617040896UL, 929437440UL, 359143424UL, 7150336UL, 7681280UL, 7817472UL,
+3224967680UL, 2872645632UL, 2386302976UL, 1715476736UL, 1010964992UL, 507779584UL,
+ 4462592UL, 5385984UL, 5849088UL, 3240369152UL, 2921536256UL, 2401573376UL,
+1781013248UL, 1126898432UL, 640489728UL, 153951232UL, 3352576UL, 3880448UL,
+3574798336UL, 3172014080UL, 2668698112UL, 2048072448UL, 1309940736UL, 806690048UL,
+ 370547200UL, 1647616UL, 2174976UL, 3909426944UL, 3171098112UL, 2634029824UL,
+2046827520UL, 1358961920UL, 805313536UL, 470098432UL, 67379200UL, 1058560UL,
+3590335232UL, 2986354688UL, 2449483776UL, 1979721472UL, 1493182464UL, 1006642944UL,
+ 654321408UL, 318776832UL, 8704UL, 3987800832UL, 3619946496UL, 2714828800UL,
+1507524608UL, 517931008UL, 15269888UL, 14616064UL, 14289920UL, 13314816UL,
+4086891520UL, 3113877504UL, 2493448192UL, 1671757824UL, 833356800UL, 397215232UL,
+ 162334976UL, 95030784UL, 11413760UL, 3648980480UL, 3078684672UL, 2340487168UL,
+1669857280UL, 915145984UL, 395183616UL, 93193728UL, 9506816UL, 9906688UL,
+3394963456UL, 2992572160UL, 2405631488UL, 1667565056UL, 979961344UL, 443287296UL,
+ 74319872UL, 7738368UL, 8203264UL, 3275492352UL, 2856061440UL, 2352875520UL,
+1681983488UL, 1011025920UL, 558237952UL, 122291968UL, 5444608UL, 6105344UL,
+3223916800UL, 2804420096UL, 2317945600UL, 1730874112UL, 1110248192UL, 640617216UL,
+ 170920704UL, 3543808UL, 4006912UL, 3340243200UL, 2971012864UL, 2467696128UL,
+1813449984UL, 1159269376UL, 739904512UL, 320604416UL, 1970176UL, 2497792UL,
+3809020416UL, 3188197632UL, 2684815360UL, 2080836608UL, 1426525440UL, 872877568UL,
+ 503779072UL, 168364800UL, 1186048UL, 4143977472UL, 3238007296UL, 2650804992UL,
+2080379904UL, 1526732288UL, 973084160UL, 587207680UL, 318772992UL, 5376UL,
+3954376704UL, 3888250880UL, 3167879168UL, 2145189888UL, 988348416UL, 385548288UL,
+ 67043328UL, 16711680UL, 16711680UL, 4086824960UL, 3197632512UL, 2778791936UL,
+2192244736UL, 1286864896UL, 616235008UL, 331153408UL, 213843968UL, 12386304UL,
+3716153344UL, 3045064704UL, 2491613184UL, 2005532672UL, 1284505600UL, 630456320UL,
+ 311754752UL, 144048128UL, 9895936UL, 3412131840UL, 2975989760UL, 2422538240UL,
+1852440576UL, 1215168512UL, 661782528UL, 259260416UL, 7733248UL, 8060928UL,
+3225354240UL, 2856255488UL, 2369912832UL, 1766260736UL, 1145700352UL, 692912128UL,
+ 256901120UL, 5570560UL, 6160384UL, 3324510208UL, 2854879232UL, 2284584960UL,
+1731067904UL, 1110507520UL, 674299904UL, 322174976UL, 3604480UL, 4194304UL,
+3323068416UL, 2819948544UL, 2283274240UL, 1696202752UL, 1109131264UL, 723320832UL,
+ 371130368UL, 2162688UL, 2686976UL, 3624140800UL, 3121086464UL, 2533883904UL,
+1913192448UL, 1208614912UL, 738918400UL, 470614016UL, 152109056UL, 1441792UL,
+4244635648UL, 3053453312UL, 2600468480UL, 2097152000UL, 1543503872UL, 1006632960UL,
+ 587202560UL, 301989888UL, 0
+};
+
+APDK_END_NAMESPACE
+
diff --git a/prnt/hpijs/dj970_maps3.cpp b/prnt/hpijs/dj970_maps3.cpp
new file mode 100644
index 0000000..a526747
--- /dev/null
+++ b/prnt/hpijs/dj970_maps3.cpp
@@ -0,0 +1,165 @@
+/*****************************************************************************\
+ dj970_maps3.cpp : Color maps for DJ970
+
+ Copyright (c) 1996 - 2002, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#include "config.h"
+
+#include "global_types.h"
+
+APDK_BEGIN_NAMESPACE
+
+uint32_t ulMapDJ970_Draft_KCMY[ 9*9*9 ]=
+{
+1802205183UL, 22740362UL, 5832524UL, 5635892UL, 5570340UL, 5308188UL,
+ 5308180UL, 5504778UL, 5504768UL, 4278239136UL, 65446UL, 4194132UL,
+ 5308210UL, 5373728UL, 5308182UL, 5504784UL, 5504776UL, 5504768UL,
+4278498896UL, 1862336354UL, 65388UL, 2621242UL, 4128540UL, 4718348UL,
+ 5570304UL, 5177088UL, 5111552UL, 4278758188UL, 4278317636UL, 1291910980UL,
+ 65356UL, 1638182UL, 2817798UL, 3866368UL, 4325120UL, 4652288UL,
+4279018260UL, 4278239016UL, 2717974318UL, 872480562UL, 65330UL, 1113876UL,
+ 2162432UL, 3407616UL, 4128512UL, 4279147522UL, 4278239002UL, 4009819936UL,
+1778450206UL, 604045088UL, 65310UL, 851206UL, 2227968UL, 3079936UL,
+4278688260UL, 4278563846UL, 4278244882UL, 2936078096UL, 1375797010UL, 469827346UL,
+ 16842514UL, 851712UL, 2096896UL, 4278425088UL, 4278428928UL, 4278237184UL,
+4093705984UL, 2097217286UL, 1073806598UL, 385941254UL, 65286UL, 917248UL,
+4278222592UL, 4278226176UL, 4278232832UL, 4244692736UL, 3288399616UL, 1812004608UL,
+ 922812160UL, 335609088UL, 65280UL, 3724477142UL, 16718478UL, 33550676UL,
+ 13303598UL, 9830180UL, 7798550UL, 6553360UL, 6553352UL, 6160128UL,
+4282864474UL, 2206438326UL, 6029146UL, 5963570UL, 5766942UL, 5701394UL,
+ 5766922UL, 5832448UL, 5570304UL, 4280056368UL, 4278842230UL, 320208754UL,
+ 20249912UL, 4718358UL, 5373702UL, 5439232UL, 5439232UL, 5308160UL,
+4279667474UL, 4278433338UL, 1644429122UL, 370278210UL, 69271328UL, 3145472UL,
+ 4324608UL, 4783872UL, 5046016UL, 4279405826UL, 4278628890UL, 3137404712UL,
+1174732586UL, 420805918UL, 237043456UL, 2686720UL, 3735296UL, 4390656UL,
+4279077120UL, 4278628358UL, 4278253844UL, 2047147790UL, 1091370762UL, 437649158UL,
+ 118947584UL, 2490112UL, 3342080UL, 4278619648UL, 4278428416UL, 4278241024UL,
+3120627460UL, 1745288960UL, 822869760UL, 302907136UL, 917248UL, 2490112UL,
+4278223616UL, 4278226432UL, 4278235904UL, 4278255360UL, 2499870464UL, 1392574208UL,
+ 637861632UL, 134545152UL, 1048320UL, 4278220544UL, 4278222592UL, 4278230528UL,
+4278243072UL, 3170957056UL, 2097217280UL, 1040252672UL, 419495680UL, 65280UL,
+4292804720UL, 503119998UL, 16718158UL, 16746540UL, 16771616UL, 29556490UL,
+ 11271936UL, 9502464UL, 8650496UL, 4285475388UL, 2885626240UL, 167729236UL,
+ 16758306UL, 15335178UL, 11664640UL, 9699072UL, 7732992UL, 7339776UL,
+4282796800UL, 4282866746UL, 2374868552UL, 528613152UL, 88866564UL, 6618880UL,
+ 6225664UL, 6225664UL, 6618880UL, 4280441088UL, 4280251412UL, 3962958640UL,
+1195375408UL, 492044036UL, 5046016UL, 5504768UL, 5766912UL, 5832448UL,
+4279527168UL, 4279598848UL, 4246063890UL, 2082471702UL, 909049610UL, 321847040UL,
+ 3407616UL, 4390656UL, 4914944UL, 4278938880UL, 4278812928UL, 4278698244UL,
+3071737090UL, 1595604736UL, 656408320UL, 153026304UL, 3012352UL, 3865344UL,
+4278481408UL, 4278222336UL, 4278233856UL, 3892707072UL, 2215182080UL, 973930240UL,
+ 403700480UL, 1106176UL, 2346496UL, 4278217984UL, 4278220032UL, 4278228992UL,
+4144027904UL, 2600525056UL, 1543564288UL, 671150080UL, 134278144UL, 1032960UL,
+4278218496UL, 4278221824UL, 4278227200UL, 3959468800UL, 2751510016UL, 1996537088UL,
+1107352832UL, 503374848UL, 58368UL, 4291364662UL, 1845428294UL, 150929488UL,
+ 16717104UL, 16605464UL, 16756486UL, 16774656UL, 12975872UL, 10223360UL,
+4287437850UL, 4293789518UL, 553586254UL, 33501734UL, 16739844UL, 16761856UL,
+ 15924992UL, 12844800UL, 10157824UL, 4283576576UL, 4251463964UL, 2830980654UL,
+ 820802084UL, 184527360UL, 16776960UL, 12779264UL, 10223360UL, 9240320UL,
+4280889344UL, 4281876992UL, 4284576524UL, 2324339712UL, 864667136UL, 108199680UL,
+ 7339264UL, 7077632UL, 7143168UL, 4279648512UL, 4279782656UL, 4247287040UL,
+2957291776UL, 1363851520UL, 440777984UL, 4711424UL, 5896960UL, 6094592UL,
+4278996992UL, 4278933248UL, 4279268864UL, 3458382080UL, 1864676864UL, 791131904UL,
+ 153467392UL, 3259648UL, 4052224UL, 4278408960UL, 4278212864UL, 4278221056UL,
+3893081600UL, 2249111296UL, 1057993728UL, 403812352UL, 1223168UL, 2403072UL,
+4278213632UL, 4278216960UL, 4278222592UL, 3825248000UL, 2449517056UL, 1459662336UL,
+ 654355968UL, 83928064UL, 1023488UL, 4278216192UL, 4278217984UL, 4278223104UL,
+3523252992UL, 2600507392UL, 1845533440UL, 1057006592UL, 503358720UL, 41216UL,
+4290644754UL, 3221159980UL, 905904176UL, 16712244UL, 16584982UL, 16731654UL,
+ 16744960UL, 16631808UL, 16514816UL, 4287894786UL, 4258923556UL, 1325335340UL,
+ 134023468UL, 16721664UL, 16735232UL, 16747264UL, 16764416UL, 15793920UL,
+4284029696UL, 4286520328UL, 3976146960UL, 1174352154UL, 352274944UL, 16742912UL,
+ 16755456UL, 16507904UL, 13299712UL, 4281671424UL, 4282459904UL, 4286072320UL,
+2610913280UL, 933718016UL, 10648320UL, 11446272UL, 11255552UL, 10407424UL,
+4279835904UL, 4280101120UL, 4281418240UL, 3075696896UL, 1566403328UL, 508855296UL,
+ 5348864UL, 6338816UL, 6733568UL, 4279053568UL, 4279055104UL, 4279519488UL,
+3274142208UL, 1965914624UL, 841974016UL, 153847552UL, 3644160UL, 4369664UL,
+4278467328UL, 4278337024UL, 4278539264UL, 3574364160UL, 2249424384UL, 1108706048UL,
+ 420840960UL, 1410816UL, 2592768UL, 4244652800UL, 4244656128UL, 4278214656UL,
+3640686336UL, 2415950592UL, 1392540928UL, 671121664UL, 67140096UL, 1016064UL,
+4278212096UL, 4278213632UL, 4278216960UL, 3271585536UL, 2516612352UL, 1761637632UL,
+1056996096UL, 536903936UL, 30720UL, 4289858560UL, 3841916954UL, 1610547224UL,
+ 436011032UL, 16712726UL, 16583942UL, 16727040UL, 16738816UL, 16751872UL,
+4287892736UL, 4258334214UL, 1862205460UL, 587007244UL, 66915842UL, 16719616UL,
+ 16730624UL, 16742400UL, 16621568UL, 4284419840UL, 4286648064UL, 4294186498UL,
+1727994624UL, 503258880UL, 16591616UL, 16736000UL, 16747776UL, 15970560UL,
+4282126848UL, 4282717184UL, 4285997312UL, 2628005888UL, 1101869568UL, 212940544UL,
+ 12346112UL, 12554240UL, 11838464UL, 4280161792UL, 4280555776UL, 4282656768UL,
+2975807744UL, 1667644160UL, 560676352UL, 7427072UL, 8683008UL, 8623360UL,
+4279243776UL, 4279310592UL, 4279969024UL, 3526310912UL, 2050178816UL, 960052480UL,
+ 204690432UL, 3763968UL, 4753664UL, 4278656000UL, 4278590976UL, 4278790400UL,
+3641786880UL, 2199208960UL, 1159286016UL, 421090304UL, 1726720UL, 2780160UL,
+4278200064UL, 4278202368UL, 4278205952UL, 3523235072UL, 2298497536UL, 1459967488UL,
+ 704927488UL, 100684544UL, 1137664UL, 4278206208UL, 4244654080UL, 4026552576UL,
+3103805696UL, 2466272256UL, 1711298304UL, 1006655744UL, 520117248UL, 22272UL,
+4289136640UL, 4293591052UL, 2399076362UL, 973013004UL, 268369930UL, 16712710UL,
+ 16713984UL, 16723200UL, 16734464UL, 4287760128UL, 4290708224UL, 2835283968UL,
+1090322432UL, 234815488UL, 16714240UL, 16717824UL, 16726272UL, 16737792UL,
+4285073408UL, 4286645504UL, 4292411392UL, 1979647232UL, 687802368UL, 16714752UL,
+ 16589824UL, 16729856UL, 16741888UL, 4282648832UL, 4283238400UL, 4286122752UL,
+2678526464UL, 1219367680UL, 364254720UL, 12789760UL, 13782272UL, 13268736UL,
+4280552704UL, 4280814592UL, 4282716928UL, 2925730560UL, 1701584128UL, 712252928UL,
+ 7808000UL, 9389824UL, 10055168UL, 4279504640UL, 4279636224UL, 4280489984UL,
+3056935168UL, 2000232960UL, 993797120UL, 222177280UL, 4930048UL, 6117632UL,
+4278848768UL, 4278784000UL, 4279113472UL, 3709346816UL, 2216371712UL, 1193093120UL,
+ 555820032UL, 2110464UL, 2901248UL, 4278326016UL, 4278195200UL, 4278197504UL,
+3640666112UL, 2248157440UL, 1392782592UL, 738800384UL, 117912576UL, 1194240UL,
+4278198528UL, 4278200576UL, 4026544896UL, 2952803328UL, 2365601280UL, 1660958208UL,
+ 973092864UL, 486553600UL, 13824UL, 4288742656UL, 4292608000UL, 3254714368UL,
+1526661120UL, 603783168UL, 201261056UL, 16711936UL, 16713216UL, 16720128UL,
+4287628032UL, 4289986560UL, 3640590336UL, 1828651008UL, 721354752UL, 201261056UL,
+ 16713216UL, 16715776UL, 16722176UL, 4285923840UL, 4287168512UL, 4292018176UL,
+2533294080UL, 1140785152UL, 301793280UL, 16582912UL, 16717568UL, 16724736UL,
+4282974976UL, 4283367424UL, 4286513152UL, 2812608512UL, 1521483776UL, 481361920UL,
+ 12322560UL, 14228992UL, 14236160UL, 4280812544UL, 4247454208UL, 4282909440UL,
+2909340416UL, 1718551808UL, 796395008UL, 108922624UL, 9379328UL, 10566400UL,
+4279633664UL, 4246276096UL, 4280813824UL, 3006794496UL, 1916537856UL, 1010699264UL,
+ 323226880UL, 5315328UL, 6632960UL, 4278979072UL, 4279044608UL, 4279438592UL,
+3021737728UL, 2065764096UL, 1143214080UL, 539431168UL, 2692608UL, 3353344UL,
+4278453760UL, 4278323200UL, 4278389504UL, 3641119232UL, 2450002432UL, 1409946624UL,
+ 722146560UL, 252645120UL, 1385216UL, 4278193408UL, 4278194944UL, 4076870144UL,
+3003128576UL, 2298486272UL, 1593843456UL, 905977344UL, 436216064UL, 8448UL,
+4292214784UL, 4292804608UL, 3707699200UL, 2097086464UL, 1090453504UL, 503119872UL,
+ 218038272UL, 67043328UL, 16711680UL, 4287627264UL, 4255580160UL, 4076797952UL,
+2399076352UL, 1358888960UL, 603914240UL, 251592704UL, 16711680UL, 16711680UL,
+4286316544UL, 4286578688UL, 4291493888UL, 3019833344UL, 1845428224UL, 788463616UL,
+ 285016064UL, 16711680UL, 16711680UL, 4283367424UL, 4284678144UL, 4287102976UL,
+3064594432UL, 2058747904UL, 985268224UL, 364838912UL, 13762560UL, 15466496UL,
+4281401344UL, 4282449920UL, 4284088320UL, 3010723840UL, 2004353024UL, 1065418752UL,
+ 411303936UL, 9437184UL, 10747904UL, 4279762944UL, 4280221696UL, 4281466880UL,
+2872836096UL, 2000945152UL, 1095237632UL, 525205504UL, 5505024UL, 6881280UL,
+4278845440UL, 4279238656UL, 4279762944UL, 2871066624UL, 2015625216UL, 1143406592UL,
+ 589889536UL, 86835200UL, 3735552UL, 4278190080UL, 4278190080UL, 4278386688UL,
+3053912064UL, 2097807360UL, 1208811520UL, 688848896UL, 185729024UL, 1835008UL,
+4278190080UL, 4278190080UL, 4278190080UL, 3154116608UL, 2365587456UL, 1610612736UL,
+ 905969664UL, 452984832UL, 0UL,
+};
+
+APDK_END_NAMESPACE
+
diff --git a/prnt/hpijs/dj9xx.cpp b/prnt/hpijs/dj9xx.cpp
new file mode 100644
index 0000000..fb55a34
--- /dev/null
+++ b/prnt/hpijs/dj9xx.cpp
@@ -0,0 +1,860 @@
+/*****************************************************************************\
+ dj9xx.cpp : Implimentation for the DJ9xx class
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#if APDK_DJ9xx
+
+#include "header.h"
+#include "io_defs.h"
+#include "dj8xx.h"
+#include "dj9xx.h"
+#include "resources.h"
+#include "printerproxy.h"
+
+APDK_BEGIN_NAMESPACE
+extern BYTE* GetHT3x3_4();
+extern BYTE* GetHT6x6_4_970();
+APDK_END_NAMESPACE
+
+APDK_BEGIN_NAMESPACE
+
+extern uint32_t ulMapDJ970_KCMY[ 9 * 9 * 9 ];
+extern uint32_t ulMapDJ970_KCMY_3x3x2[ 9 * 9 * 9 ];
+extern uint32_t ulMapDJ970_Gossimer_Normal_KCMY[ 9 * 9 * 9 ];
+extern uint32_t ulMapDJ600_CCM_K[ 9 * 9 * 9 ];
+extern uint32_t ulMapGRAY_K_6x6x1[9 * 9 * 9];
+extern uint32_t ulMapDJ970_Draft_KCMY[9 * 9 * 9];
+
+extern void AsciiHexToBinary(BYTE* dest, char* src, int count);
+
+DJ9xx::DJ9xx(SystemServices* pSS, BOOL proto)
+: Printer(pSS,NUM_DJ6XX_FONTS,proto)
+{
+ if (IOMode.bDevID)
+ {
+ bCheckForCancelButton = TRUE;
+ constructor_error = VerifyPenInfo();
+ CERRCHECK;
+ }
+ else ePen=BOTH_PENS; // matches default mode
+
+
+ pMode[DEFAULTMODE_INDEX] = new DJ970Mode1(); // Normal Color
+ pMode[SPECIALMODE_INDEX] = new DJ970Mode2(); // Photo
+
+#ifdef APDK_AUTODUPLEX
+/*
+ * When bidi is available, query printer for duplexer
+ * For now, this is available only on Linux which is unidi only.
+ */
+
+ bDuplexCapable = TRUE;
+#endif
+
+#ifdef APDK_EXTENDED_MEDIASIZE
+ pMode[GRAYMODE_INDEX] = new DJ970Mode3 (); // Draft Grayscale K
+ pMode[SPECIALMODE_INDEX+1] = new DJ970Mode4 (); // Normal Grayscale K
+ pMode[SPECIALMODE_INDEX+2] = new DJ970Mode5 (); // Draft Color
+ pMode[SPECIALMODE_INDEX+3] = new DJ970ModePres(); // Best Color
+ pMode[SPECIALMODE_INDEX+4] = new DJ970ModePhotoPres(); // HiRes
+ ModeCount=7;
+#else
+ pMode[GRAYMODE_INDEX] = new GrayMode (ulMapDJ600_CCM_K);
+ ModeCount=3;
+#endif
+
+ CMYMap = ulMapDJ970_KCMY;
+}
+
+DJ9xx::~DJ9xx()
+{ }
+
+DJ970Mode1::DJ970Mode1() // Normal Color
+: PrintMode(ulMapDJ970_KCMY_3x3x2)
+// 600x600x1 K
+// 300x300x2 CMY
+{
+
+ ColorDepth[K]=1; // 600x600x1 K
+
+ for (int i=1; i < 4; i++)
+ ColorDepth[i]=2; // 300x300x2 CMY
+
+ ResolutionX[K]=ResolutionY[K]=600;
+
+ MixedRes = TRUE;
+#ifdef APDK_AUTODUPLEX
+ bDuplexCapable = TRUE;
+#endif
+
+ ColorFEDTable = (BYTE*) HT300x3004level970_open;
+}
+
+DJ970Mode2::DJ970Mode2() // Photo
+: PrintMode(ulMapDJ970_Gossimer_Normal_KCMY)
+// 600x600x1 K
+// 600x600x2 CMY
+{
+ int i;
+ ColorDepth[K]=1; // 600x600x1 K
+
+ for (i=1; i < 4; i++)
+ ColorDepth[i]=2; // 300x300x2 CMY
+
+ for (i=0; i < 4; i++)
+ ResolutionX[i]=ResolutionY[i]=600;
+
+ BaseResX = BaseResY = 600;
+ MixedRes = FALSE;
+
+ medium = mediaGlossy;
+
+ ColorFEDTable = GetHT6x6_4_970();
+
+// strcpy(ModeName, "Photo");
+ bFontCapable=FALSE;
+#ifdef APDK_AUTODUPLEX
+ bDuplexCapable = FALSE;
+#endif
+
+ pmQuality = QUALITY_BEST;
+ pmMediaType = MEDIA_PHOTO;
+}
+
+#ifdef APDK_EXTENDED_MEDIASIZE
+DJ970Mode3::DJ970Mode3 () : GrayMode (ulMapDJ600_CCM_K) // Draft Grayscale K
+{
+#ifdef APDK_AUTODUPLEX
+ bDuplexCapable = TRUE;
+#endif
+ pmQuality = QUALITY_DRAFT;
+ theQuality = qualityDraft;
+}
+
+DJ970Mode4::DJ970Mode4 () : PrintMode (ulMapGRAY_K_6x6x1) // Normal Grayscale K
+{
+ bFontCapable = FALSE;
+#ifdef APDK_AUTODUPLEX
+ bDuplexCapable = TRUE;
+#endif
+ ResolutionX[0] =
+ ResolutionY[0] = 600;
+ BaseResX = 600;
+ BaseResY = 600;
+ CompatiblePens[1] = BLACK_PEN;
+ pmQuality = QUALITY_NORMAL;
+ theQuality = qualityNormal;
+ dyeCount = 1;
+ pmColor = GREY_K;
+}
+
+DJ970Mode5::DJ970Mode5() // Draft Color
+: PrintMode(ulMapDJ970_Draft_KCMY)
+// 300x300x1 K
+// 300x300x1 CMY
+{
+#ifdef APDK_AUTODUPLEX
+ bDuplexCapable = TRUE;
+#endif
+ pmQuality = QUALITY_DRAFT;
+ theQuality = qualityDraft;
+}
+
+// 2001.06.14 mrb: Added Presentation Mode: 600x600x2 for color,
+// 600x600x1 for b/w
+DJ970ModePres::DJ970ModePres() : PrintMode(ulMapDJ970_KCMY)
+// 600x600x1 K
+// 600x600x2 CMY
+{
+ ColorDepth[K]=1;
+
+ ColorDepth[C]=2;
+ ColorDepth[M]=2;
+ ColorDepth[Y]=2;
+
+ ResolutionX[K]=ResolutionY[K]=600;
+ ResolutionX[C]=ResolutionY[C]=600;
+ ResolutionX[M]=ResolutionY[M]=600;
+ ResolutionX[Y]=ResolutionY[Y]=600;
+
+ BaseResX = BaseResY = 600;
+ theQuality = qualityPresentation;
+
+ // 2001.07.09 mrb: Added for presentation mode of DJ970
+ ColorFEDTable = (BYTE*) HT600x600x4_Pres970_open;
+
+#ifdef APDK_AUTODUPLEX
+ bDuplexCapable = TRUE;
+#endif
+ pmQuality = QUALITY_BEST;
+}
+
+// 2001.06.14 mrb: Added Presentation Photo Mode: 1200x1200x1 for color.
+DJ970ModePhotoPres::DJ970ModePhotoPres()
+: PrintMode(ulMapDJ970_Gossimer_Normal_KCMY)
+// 1200x1200x1 CMY
+{
+ ColorDepth[K]=1;
+ ColorDepth[C]=1;
+ ColorDepth[M]=1;
+ ColorDepth[Y]=1;
+
+ ResolutionX[K]=ResolutionY[K]=1200;
+ ResolutionX[C]=ResolutionY[C]=1200;
+ ResolutionX[M]=ResolutionY[M]=1200;
+ ResolutionX[Y]=ResolutionY[Y]=1200;
+
+ BaseResX = BaseResY = 1200;
+
+ medium = mediaGlossy;
+ theQuality = qualityPresentation;
+
+ // 2001.07.09 mrb: Added for presentation mode of DJ970
+ ColorFEDTable = (BYTE*) HT1200x1200x1_PhotoPres970_open;
+
+ bFontCapable=FALSE;
+ pmQuality = QUALITY_HIGHRES_PHOTO;
+ pmMediaType = MEDIA_PHOTO;
+}
+#endif // APDK_EXTENDED_MEDIASIZE
+
+BOOL DJ9xx::UseGUIMode(PrintMode* pPrintMode)
+{
+
+ if ((!pPrintMode->bFontCapable)
+#ifdef APDK_AUTODUPLEX
+ || pPrintMode->QueryDuplexMode ()
+#endif
+ )
+ return TRUE;
+ return FALSE;
+}
+
+Compressor* DJ9xx::CreateCompressor(unsigned int RasterSize)
+{
+ return new Mode2(pSS,RasterSize);
+}
+
+Header900::Header900(Printer* p,PrintContext* pc)
+ : Header895(p,pc)
+{ }
+
+Header* DJ9xx::SelectHeader(PrintContext* pc)
+{
+ return new Header900(this,pc);
+}
+
+DRIVER_ERROR Header900::Send()
+{
+ DRIVER_ERROR err;
+ //BOOL bDuplex = FALSE;
+
+ StartSend();
+
+ // this code will look for the duplexer enabled in the device ID and send the right
+ // escape to the printer to enable duplexing. At this time, however, we are not
+ // going to support duplexing. One, it is not supported with PCL3, which we need
+ // for device font support. Second, we don't have the resources to reformat the page
+ // for book duplexing and can only do tablet.
+
+ /*BYTE bDevIDBuff[DevIDBuffSize];
+ err = theTranslator->pSS->GetDeviceID(bDevIDBuff, DevIDBuffSize, TRUE);
+ ERRCHECK;
+
+ // look for duplex code in bDevIDBuff
+ Duplex = DuplexEnabled(bDevIDBuff);
+
+ if(bDuplex)
+ {
+ err = thePrinter->Send((const BYTE*)EnableDuplex,sizeof(EnableDuplex));
+ ERRCHECK;
+ }*/
+
+#ifdef APDK_AUTODUPLEX
+ if (thePrintContext->QueryDuplexMode () != DUPLEXMODE_NONE)
+ err = thePrinter->Send ((const BYTE *) EnableDuplex, sizeof (EnableDuplex));
+#endif
+
+ err = ConfigureRasterData();
+ ERRCHECK;
+
+ err=Graphics(); // start raster graphics and set compression mode
+
+ return err;
+}
+
+BOOL Header900::DuplexEnabled(BYTE* bDevIDBuff)
+{
+ char* pStrVstatus = NULL;
+ char* pStrDuplex = NULL;
+ char* pStrSemicolon = NULL;
+
+ if((pStrVstatus = strstr((char*)bDevIDBuff + 2,"VSTATUS:")))
+ pStrVstatus += 8;
+ else
+ return FALSE;
+
+ pStrDuplex = pStrVstatus;
+ pStrSemicolon = pStrVstatus;
+
+ // now parse VSTATUS parameters to find if we are in simplex or duplex
+ if (!(pStrSemicolon = strstr((char*)pStrVstatus,";")))
+ return FALSE;
+
+ if ( (pStrDuplex = strstr((char*)pStrVstatus,"DP")) )
+ if(pStrDuplex < pStrSemicolon)
+ return TRUE;
+ if ( (pStrDuplex = strstr((char*)pStrVstatus,"SM")) )
+ if(pStrDuplex < pStrSemicolon)
+ return FALSE;
+
+ DBG1("didn't find SM or DP!!\n");
+ return FALSE;
+}
+
+
+BYTE DJ9xx::PhotoTrayStatus
+(
+ BOOL bQueryPrinter
+)
+{
+ DRIVER_ERROR err;
+ char* pStrVstatus = NULL;
+ char* pStrPhotoTray = NULL;
+ char* pStrSemicolon = NULL;
+
+ BYTE bDevIDBuff[DevIDBuffSize];
+
+ if (!IOMode.bDevID)
+ {
+ bQueryPrinter = FALSE;
+ }
+
+ err=pSS->GetDeviceID(bDevIDBuff, DevIDBuffSize, bQueryPrinter);
+ if (err!=NO_ERROR)
+ {
+ return 0;
+ }
+
+ if((pStrVstatus = strstr((char*)bDevIDBuff + 2,"VSTATUS:")))
+ {
+ pStrVstatus += 8;
+ }
+ else
+ {
+ return 0;
+ }
+
+ pStrPhotoTray = pStrVstatus;
+ pStrSemicolon = pStrVstatus;
+
+ // now parse VSTATUS parameters to find if we are in simplex or duplex
+ if (!(pStrSemicolon = strstr((char*)pStrVstatus,";")))
+ {
+ return 0;
+ }
+
+ if ( (pStrPhotoTray = strstr((char*)pStrVstatus,"PH")) )
+ {
+ if(pStrPhotoTray < pStrSemicolon)
+ {
+ return '9'; // return same as VIP installed and engaged status
+ }
+ }
+ if ( (pStrPhotoTray = strstr((char*)pStrVstatus,"NR")) )
+ {
+ if(pStrPhotoTray < pStrSemicolon)
+ {
+ return 0;
+ }
+ }
+
+ DBG1("didn't find PH or NR!!\n");
+ return 0;
+} //PhotoTrayStatus
+
+BOOL DJ9xx::PhotoTrayPresent
+(
+ BOOL bQueryPrinter
+)
+{
+ // present (and not engaged) == 8
+ return ((PhotoTrayStatus(bQueryPrinter) & 8) == 8);
+} //PhotoTrayInstalled
+
+
+PHOTOTRAY_STATE DJ9xx::PhotoTrayEngaged
+(
+ BOOL bQueryPrinter
+)
+{
+ // present and engaged == 9
+ return ((PHOTOTRAY_STATE) ((PhotoTrayStatus(bQueryPrinter) & 9) == 9));
+} //PhotoTrayEngaged
+
+
+PAPER_SIZE DJ9xx::MandatoryPaperSize()
+{
+ if (PhotoTrayEngaged (TRUE))
+ {
+ return PHOTO_SIZE;
+ }
+ else
+ {
+ return UNSUPPORTED_SIZE; // code for "nothing mandatory"
+ }
+} //MandatoryPaperSize
+
+
+DISPLAY_STATUS DJ9xx::ParseError(BYTE status_reg)
+{
+ DBG1("DJ9XX, parsing error info\n");
+
+ DRIVER_ERROR err = NO_ERROR;
+ BYTE DevIDBuffer[DevIDBuffSize];
+
+ char *pStr;
+ if(IOMode.bDevID)
+ {
+ // If a bi-di cable was plugged in and everything was OK, let's see if it's still
+ // plugged in and everything is OK
+ err = pSS->GetDeviceID (DevIDBuffer, DevIDBuffSize, TRUE);
+ if(err != NO_ERROR)
+ {
+ // job was bi-di but now something's messed up, probably cable unplugged
+ return DISPLAY_COMM_PROBLEM;
+ }
+
+ if ( (pStr=(char *)strstr((const char*)DevIDBuffer+2,"VSTATUS:")) == NULL )
+ {
+ return DISPLAY_COMM_PROBLEM;
+ }
+
+ pStr+=8; // skip "VSTATUS:"
+
+ // Paper Jam or Paper Stall
+ if (strstr((char*)pStr,"PAJM") || strstr((char*)pStr,"PAPS"))
+ {
+ return DISPLAY_PAPER_JAMMED;
+ }
+
+ // Carriage Stall
+ if (strstr((char*)pStr,"CARS"))
+ {
+ return DISPLAY_ERROR_TRAP;
+ }
+
+ if (strstr((char*)pStr,"OOPA")) // OOP state
+ {
+ DBG1("Out of Paper [from Encoded DevID]\n");
+ return DISPLAY_OUT_OF_PAPER;
+ }
+
+ // Job Cancelled (AIO printer turn idle after job canceled)
+ if (strstr((char*)pStr,"CNCL")) // CNCL state
+ {
+ DBG1("Printing Canceled [from Encoded DevID]\n");
+ return DISPLAY_PRINTING_CANCELED;
+ }
+
+ if ( TopCoverOpen(status_reg) )
+ {
+ DBG1("Top Cover Open\n");
+ return DISPLAY_TOP_COVER_OPEN;
+ }
+
+ // VerifyPenInfo will handle prompting the user
+ // if this is a problem
+ err = VerifyPenInfo();
+
+ if(err != NO_ERROR)
+ // VerifyPenInfo returned an error, which can only happen when ToDevice
+ // or GetDeviceID returns an error. Either way, it's BAD_DEVICE_ID or
+ // IO_ERROR, both unrecoverable. This is probably due to the printer
+ // being turned off during printing, resulting in us not being able to
+ // power it back on in VerifyPenInfo, since the buffer still has a
+ // partial raster in it and we can't send the power-on command.
+ return DISPLAY_COMM_PROBLEM;
+ }
+
+ // check for errors we can detect from the status reg
+ if (IOMode.bStatus)
+ {
+ if ( DEVICE_IS_OOP(status_reg) )
+ {
+ DBG1("Out Of Paper\n");
+ return DISPLAY_OUT_OF_PAPER;
+ }
+
+ if (DEVICE_PAPER_JAMMED(status_reg))
+ {
+ DBG1("Paper Jammed\n");
+ return DISPLAY_PAPER_JAMMED;
+ }
+ if (DEVICE_IO_TRAP(status_reg))
+ {
+ DBG1("IO trap\n");
+ return DISPLAY_ERROR_TRAP;
+ }
+ }
+
+ // don't know what the problem is-
+ // Is the PrinterAlive?
+ if (pSS->PrinterIsAlive())
+ {
+ iTotal_SLOW_POLL_Count += iMax_SLOW_POLL_Count;
+#if defined(DEBUG) && (DBG_MASK & DBG_LVL1)
+ printf("iTotal_SLOW_POLL_Count = %d\n",iTotal_SLOW_POLL_Count);
+#endif
+ // -Note that iTotal_SLOW_POLL_Count is a multiple of
+ // iMax_SLOW_POLL_Count allowing us to check this
+ // on an absolute time limit - not relative to the number
+ // of times we happen to have entered ParseError.
+ // -Also note that we have different thresholds for uni-di & bi-di.
+ if(
+ ((IOMode.bDevID == FALSE) && (iTotal_SLOW_POLL_Count >= 60)) ||
+ ((IOMode.bDevID == TRUE) && (iTotal_SLOW_POLL_Count >= 120))
+ )
+ return DISPLAY_BUSY;
+ else return DISPLAY_PRINTING;
+ }
+ else
+ return DISPLAY_COMM_PROBLEM;
+}
+
+DRIVER_ERROR DJ9xx::VerifyPenInfo()
+{
+
+ DRIVER_ERROR err=NO_ERROR;
+
+ if(IOMode.bDevID == FALSE)
+ return err;
+
+ err = ParsePenInfo(ePen);
+
+ if(err == UNSUPPORTED_PEN) // probably Power Off - pens couldn't be read
+ {
+ DBG1("DJ9xx::Need to do a POWER ON to get penIDs\n");
+
+ // have to delay for DJ9xx or the POWER ON will be ignored
+ if (pSS->BusyWait((DWORD)2000) == JOB_CANCELED)
+ return JOB_CANCELED;
+
+ DWORD length=sizeof(DJ895_Power_On);
+ err = pSS->ToDevice(DJ895_Power_On,&length);
+ ERRCHECK;
+
+ err = pSS->FlushIO();
+ ERRCHECK;
+
+ // give the printer some time to power up
+ if (pSS->BusyWait ((DWORD) 2500) == JOB_CANCELED)
+ return JOB_CANCELED;
+
+ err = ParsePenInfo(ePen);
+ }
+
+ ERRCHECK;
+
+ // check for the normal case
+ if (ePen == BOTH_PENS)
+ return NO_ERROR;
+
+ while ( ePen != BOTH_PENS )
+ {
+
+ switch (ePen)
+ {
+ case BLACK_PEN:
+ // black pen installed, need to install color pen
+ pSS->DisplayPrinterStatus(DISPLAY_NO_COLOR_PEN);
+ break;
+ case COLOR_PEN:
+ // color pen installed, need to install black pen
+ pSS->DisplayPrinterStatus(DISPLAY_NO_BLACK_PEN);
+ break;
+ case NO_PEN:
+ // neither pen installed
+ default:
+ pSS->DisplayPrinterStatus(DISPLAY_NO_PENS);
+ break;
+ }
+
+ if (pSS->BusyWait(500) == JOB_CANCELED)
+ return JOB_CANCELED;
+
+ err = ParsePenInfo(ePen);
+ ERRCHECK;
+ }
+
+ pSS->DisplayPrinterStatus(DISPLAY_PRINTING);
+
+ return NO_ERROR;
+
+}
+
+DRIVER_ERROR DJ9xx::ParsePenInfo(PEN_TYPE& ePen, BOOL QueryPrinter)
+{
+ char *str;
+ DRIVER_ERROR err = SetPenInfo (str, QueryPrinter);
+ ERRCHECK;
+
+ if (*str != '$')
+ {
+ // DeskJet 9300 has DJ990 style devid string.
+ int num_pens = 0;
+ PEN_TYPE temp_pen1 = NO_PEN;
+ BYTE penInfoBits[4];
+ int iNumMissingPens = 0;
+
+ // the first byte indicates how many pens are supported
+ if ((str[0] >= '0') && (str[0] <= '9'))
+ {
+ num_pens = str[0] - '0';
+ }
+ else if ((str[0] >= 'A') && (str[0] <= 'F'))
+ {
+ num_pens = 10 + (str[0] - 'A');
+ }
+ else
+ {
+ return BAD_DEVICE_ID;
+ }
+
+ if ((int) strlen (str) < (num_pens * 8))
+ {
+ return BAD_DEVICE_ID;
+ }
+
+ // DJ990 style DevID
+
+ if (pSS->GetVIPVersion () == 1)
+ {
+ if (num_pens < 2)
+ {
+ return UNSUPPORTED_PEN;
+ }
+
+ // parse pen1 (should be black)
+ AsciiHexToBinary(penInfoBits, str+1, 4);
+ penInfoBits[1] &= 0xf8; // mask off ink level trigger bits
+
+ if ((penInfoBits[0] == 0xc1) && (penInfoBits[1] == 0x10))
+ { // black
+ temp_pen1 = BLACK_PEN;
+ }
+ else if (penInfoBits[0] == 0xc0)
+ { // missing pen
+ temp_pen1 = NO_PEN;
+ iNumMissingPens = 1;
+ }
+ else
+ {
+ return UNSUPPORTED_PEN;
+ }
+
+ // now check pen2 (should be color)
+ AsciiHexToBinary(penInfoBits, str+9, 4);
+ penInfoBits[1] &= 0xf8; // mask off ink level trigger bits
+
+ if ((penInfoBits[0] == 0xc2) && (penInfoBits[1] == 0x08))
+ { // Chinook
+ if (temp_pen1 == BLACK_PEN)
+ {
+ ePen = BOTH_PENS;
+ }
+ else
+ {
+ ePen = COLOR_PEN;
+ }
+ }
+ else if (penInfoBits[0] == 0xc0)
+ { // missing pen
+ ePen = temp_pen1;
+ iNumMissingPens = 1;
+ }
+ else
+ {
+ return UNSUPPORTED_PEN;
+ }
+
+ return NO_ERROR;
+ }
+
+ // Check for missing pens
+
+ if (*(str - 1) == '1' && *(str - 2) == '1')
+ {
+ return UNSUPPORTED_PEN;
+ }
+
+ char *p = str + 1;
+ BYTE penColor;
+
+ ePen = NO_PEN;
+
+ for (int i = 0; i < num_pens; i++, p += 8)
+ {
+ AsciiHexToBinary (penInfoBits, p, 8);
+
+ if ((penInfoBits[1] & 0xf8) == 0xf8)
+ {
+
+ // The high 5 bits in the 3rd and 4th nibble (second byte) identify the
+ // installed pen. If all 5 bits are on, user has installed an incompatible pen.
+
+ return UNSUPPORTED_PEN;
+ }
+
+ if ((penInfoBits[0] & 0x80) != 0x80) // if Bit 31 is 0, this is not a pen
+ {
+ continue;
+ }
+ penColor = penInfoBits[0] & 0x3F;
+ switch (penColor)
+ {
+ case 0:
+ {
+ iNumMissingPens++;
+ break;
+ }
+ case 1:
+ ePen = BLACK_PEN;
+ break;
+ case 2:
+ {
+ if (ePen == BLACK_PEN)
+ {
+ ePen = BOTH_PENS;
+ }
+ else
+ {
+ ePen = COLOR_PEN;
+ }
+ break;
+ }
+ case 4: // cyan pen
+ case 5: // magenta pen
+ case 6: // yellow pen
+ case 7: // low dye load cyan pen
+ case 8: // low dye load magenta pen
+ case 9: // low dye load yellow pen
+ if (ePen == BLACK_PEN || ePen == BOTH_PENS)
+ {
+ ePen = BOTH_PENS;
+ }
+ else
+ {
+ ePen = COLOR_PEN;
+ }
+ break;
+ default:
+ ePen = UNKNOWN_PEN;
+ }
+ }
+ return NO_ERROR;
+ }
+
+ // parse penID
+ PEN_TYPE temp_pen1;
+ // check pen1, assume it is black, pen2 is color
+ switch (str[1])
+ {
+ case 'H':
+ case 'L':
+ case 'Z':
+ temp_pen1 = BLACK_PEN;
+ break;
+ case 'X': return UNSUPPORTED_PEN;
+ default: temp_pen1 = NO_PEN; break;
+ }
+
+ // now check pen2
+
+ int i = 2;
+ while ((i < DevIDBuffSize) && str[i]!='$') i++; // handles variable length penIDs
+ if (i == DevIDBuffSize)
+ {
+ return BAD_DEVICE_ID;
+ }
+
+ i++;
+
+ // need to be more forgiving of the color pen type because of
+ // the unknown chinookID for DJ970
+ // we can't guarantee the (F)lash color pen, but we can make sure
+ // the pen is not (X)Undefined, (A)Missing or (M)onet
+ if(str[i]!='X' && str[i]!='A' && str[i]!='M')
+ // check what pen1 was
+ {
+ if (temp_pen1 == BLACK_PEN)
+ ePen = BOTH_PENS;
+ else
+ {
+ ePen = COLOR_PEN;
+ }
+ }
+ else // no color pen, just set what pen1 was
+ ePen = temp_pen1;
+
+ return NO_ERROR;
+}
+
+#if defined(APDK_FONTS_NEEDED)
+Font* DJ9xx::RealizeFont(const int index,const BYTE bSize,
+ const TEXTCOLOR eColor,
+ const BOOL bBold,const BOOL bItalic,
+ const BOOL bUnderline)
+
+{
+
+ return Printer::RealizeFont(index,bSize,eColor,bBold,bItalic,bUnderline);
+}
+#endif
+
+DRIVER_ERROR DJ9xx::CleanPen()
+{
+ const BYTE DJ970_User_Output_Page[] = {ESC, '%','P','u','i','f','p','.',
+ 'm','u','l','t','i','_','b','u','t','t','o','n','_','p','u','s','h',' ','3',';',
+ 'u','d','w','.','q','u','i','t',';',ESC,'%','-','1','2','3','4','5','X' };
+
+ DWORD length = sizeof(PEN_CLEAN_PML);
+ DRIVER_ERROR err = pSS->ToDevice(PEN_CLEAN_PML, &length);
+ ERRCHECK;
+
+ // send this page so that the user sees some output. If you don't send this, the
+ // pens get serviced but nothing prints out.
+ length = sizeof(DJ970_User_Output_Page);
+ return pSS->ToDevice(DJ970_User_Output_Page, &length);
+}
+
+APDK_END_NAMESPACE
+
+#endif // APDK_DJ9xx
diff --git a/prnt/hpijs/dj9xx.h b/prnt/hpijs/dj9xx.h
new file mode 100644
index 0000000..0877ea3
--- /dev/null
+++ b/prnt/hpijs/dj9xx.h
@@ -0,0 +1,188 @@
+/*****************************************************************************\
+ dj9xx.h : Interface for the DJ9xx class
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#ifndef APDK_DJ9XX_H
+#define APDK_DJ9XX_H
+
+APDK_BEGIN_NAMESPACE
+
+//extern char *ModelString[MAX_ID_STRING];
+
+/*!
+\internal
+*/
+class DJ9xx : public Printer
+{
+public:
+ DJ9xx(SystemServices* pSS, BOOL proto=FALSE);
+
+ virtual ~DJ9xx();
+
+ BOOL UseGUIMode(PrintMode* pPrintMode);
+ Header* SelectHeader(PrintContext* pc);
+ Compressor* CreateCompressor(unsigned int RasterSize);
+ DISPLAY_STATUS ParseError(BYTE status_reg);
+ DRIVER_ERROR VerifyPenInfo();
+
+#if defined(APDK_FONTS_NEEDED)
+ Font* RealizeFont(const int index,const BYTE bSize,
+ const TEXTCOLOR eColor=BLACK_TEXT,
+ const BOOL bBold=FALSE,const BOOL bItalic=FALSE,
+ const BOOL bUnderline=FALSE);
+#endif
+
+ virtual DRIVER_ERROR ParsePenInfo(PEN_TYPE& ePen, BOOL QueryPrinter=TRUE);
+
+ PAPER_SIZE MandatoryPaperSize();
+
+ DRIVER_ERROR CleanPen();
+
+ virtual BOOL PhotoTrayPresent(BOOL bQueryPrinter);
+
+ virtual PHOTOTRAY_STATE PhotoTrayEngaged (BOOL bQueryPrinter);
+ inline virtual BOOL SupportSeparateBlack (PrintMode *pCurrentMode)
+ {
+ if (pCurrentMode->medium != mediaPlain)
+ {
+ return FALSE;
+ }
+ return TRUE;
+ }
+
+protected:
+
+#ifdef APDK_HP_UX
+ virtual DJ9xx & operator = (Printer& rhs)
+ {
+ return *this;
+ }
+#endif
+
+ virtual BYTE PhotoTrayStatus(BOOL bQueryPrinter);
+
+}; //DJ9xx
+
+
+class DJ970Mode1 : public PrintMode
+{
+public:
+ DJ970Mode1();
+}; //DJ970Mode1
+
+
+class DJ970Mode2 : public PrintMode
+{
+public:
+ DJ970Mode2();
+}; //DJ970Mode2
+
+
+#ifdef APDK_EXTENDED_MEDIASIZE
+
+class DJ970Mode3 : public GrayMode
+{
+public:
+ DJ970Mode3 ();
+}; //DJ970Mode3
+
+class DJ970Mode4 : public PrintMode
+{
+public:
+ DJ970Mode4 ();
+};
+
+class DJ970Mode5 : public PrintMode
+{
+public:
+ DJ970Mode5 ();
+};
+
+class DJ970ModePres : public PrintMode
+{
+public:
+ DJ970ModePres();
+
+};
+
+class DJ970ModePhotoPres : public PrintMode
+{
+public:
+ DJ970ModePhotoPres();
+
+};
+
+#endif // APDK_EXTENDED_MEDIASIZE
+
+#ifdef APDK_DJ9xx
+//! DJ9xxProxy
+/*!
+******************************************************************************/
+class DJ9xxProxy : public PrinterProxy
+{
+public:
+ DJ9xxProxy() : PrinterProxy(
+ "DJ9xx", // family name
+ "DESKJET 91\0" // DeskJet 91x Series
+ "DESKJET 92\0" // DeskJet 920
+ "DESKJET 93\0" // DeskJet 93x Series
+ "DESKJET 94\0" // DeskJet 94x Series
+ "DESKJET 95\0" // DeskJet 95x Series
+ "DESKJET 97\0" // DeskJet 97x Series
+ "DESKJET 1120\0" // DeskJet 1120
+ "DESKJET 1125\0" // DeskJet 1125
+ "DESKJET 3810\0" // DeskJet 3810
+ "DESKJET 3816\0" // DeskJet 3816
+ "DESKJET 3820\0" // DeskJet 3820
+ "DESKJET 3822\0" // DeskJet 3822
+ "PHOTOSMART P1000\0" // PSP 1000
+ "PHOTOSMART P1100\0" // PSP 1100
+ "DESKJET 1220\0" // DeskJet 1220
+ "Deskjet 1280\0" // Deskjet 1280
+ "hp deskjet 9300\0" // deskjet 9300
+#ifdef APDK_MLC_PRINTER
+ "OfficeJet K\0" // OfficeJet K Series
+ "OfficeJet V\0" // OfficeJet V Series
+ "OfficeJet G\0" // OfficeJet G Series
+ "PSC 7\0" // PSC 750
+ "PSC 9\0" // PSC 900 Series
+ "officejet 5100 series\0" // officejet 5100 series
+ "HP 2000C\0"
+#endif
+ ) {m_iPrinterType = eDJ9xx;}
+ inline Printer* CreatePrinter(SystemServices* pSS) const { return new DJ9xx(pSS); }
+ inline PRINTER_TYPE GetPrinterType() const { return eDJ9xx;}
+ inline unsigned int GetModelBit() const { return 0x20000;}
+};
+#endif
+
+APDK_END_NAMESPACE
+
+#endif //APDK_DJ9XX_H
diff --git a/prnt/hpijs/dj9xxvip.cpp b/prnt/hpijs/dj9xxvip.cpp
new file mode 100644
index 0000000..f1dc14e
--- /dev/null
+++ b/prnt/hpijs/dj9xxvip.cpp
@@ -0,0 +1,2407 @@
+/*****************************************************************************\
+ dj9xxvip.cpp : Implimentation for the DJ9xxVIP class
+
+ Copyright (c) 1996 - 2002, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#ifdef APDK_DJ9xxVIP
+
+#include "header.h"
+#include "io_defs.h"
+#include "dj9xxvip.h"
+#include "printerproxy.h"
+
+APDK_BEGIN_NAMESPACE
+
+
+#define OUR_PJL_JOBNAME "_PJL_pjl_PJL_pjl_" // this can be anything we want it to be
+#define DRIVERWARE_JOBNAME "NEWDRIVERWARE" // don't change this - it is defined in firmware!
+
+extern uint32_t ulMapDJ600_CCM_K[ 9 * 9 * 9 ];
+
+const char GrayscaleSeq[]= {ESC, '*', 'o', '5', 'W', 0x0B, 0x01, 0x00, 0x00, 0x02};
+
+const BYTE ExtraDryTime[] = "\033&b16WPML \004\000\006\001\004\001\004\001\006\010\001";
+
+extern BYTE EscAmplCopy(BYTE *dest, int num, char end);
+extern void AsciiHexToBinary(BYTE* dest, char* src, int count);
+extern MediaType MediaTypeToPcl (MEDIATYPE eMediaType);
+
+DJ9xxVIP::DJ9xxVIP
+(
+ SystemServices* pSS,
+ BOOL proto
+) :
+ Printer(pSS, NUM_DJ6XX_FONTS, proto),
+ PCL3acceptsDriverware(TRUE)
+{
+
+ m_bVIPPrinter = TRUE;
+
+ if (!proto && IOMode.bDevID)
+ {
+ bCheckForCancelButton = TRUE;
+ constructor_error = VerifyPenInfo();
+ CERRCHECK;
+ }
+ else ePen = BOTH_PENS; // matches default mode
+
+ PCL3acceptsDriverware = IsPCL3DriverwareAvailable();
+
+ ModeCount = 0;
+ pMode[ModeCount++] = new GrayModeDJ990(ulMapDJ600_CCM_K,PCL3acceptsDriverware); // Grayscale K
+ pMode[ModeCount++] = new DJ990Mode(); // Automatic Color
+ pMode[ModeCount++] = new DJ990CMYGrayMode(); // Automatic Grayscale CMY
+
+#ifdef APDK_AUTODUPLEX
+
+/*
+ * When bidi is available, query printer for duplexer
+ * For now, this is available only on Linux which is unidi only.
+ */
+
+ bDuplexCapable = TRUE;
+#endif
+
+#ifdef APDK_EXTENDED_MEDIASIZE
+ pMode[ModeCount++] = new DJ990KGrayMode (); // Normal Grayscale K
+ pMode[ModeCount++] = new DJ9902400Mode (); // HiRes
+ pMode[ModeCount++] = new DJ990DraftMode (); // Draft Color
+#endif
+ pMode[ModeCount++] = new DJ990BestMode (); // Photo Best
+ pMode[ModeCount++] = new DJ990PhotoNormalMode (); // Photo Normal
+
+ m_cExtraDryTime = 0;
+ m_iLeftOverspray = 0;
+ m_iTopOverspray = 0;
+ m_iRightOverspray = 0;
+ m_iBottomOverspray = 0;
+}
+
+GrayModeDJ990::GrayModeDJ990
+(
+ uint32_t *map,
+ BOOL PCL3OK
+) :
+ GrayMode(map)
+{
+#if defined(APDK_VIP_COLORFILTERING)
+ Config.bErnie = TRUE;
+#endif
+
+ Config.bColorImage=FALSE;
+
+ if (!PCL3OK)
+ {
+ bFontCapable = FALSE;
+ }
+
+#ifdef APDK_AUTODUPLEX
+ bDuplexCapable = TRUE;
+#endif
+#ifdef APDK_EXTENDED_MEDIASIZE
+ theQuality = qualityDraft;
+ pmQuality = QUALITY_DRAFT;
+#endif
+}
+
+DJ990Mode::DJ990Mode()
+: PrintMode(NULL)
+{
+
+/*
+ * The resolutions here are set to 300 for better performance from Cameras.
+ * REVISIT: Must provide a true 600 dpi printmode later.
+ * 12/21/01
+ *
+ * For now have added APDK_HIGH_RES_MODES which sets VIP_BASE_RES to 600 in dj9xxvip.h
+ * If APDK_HIGH_RES_MODES is not defined then VIP_BASE_RES is 300.
+ * 1/9/2002 - JLM
+ */
+
+ BaseResX = BaseResY = TextRes = ResolutionX[0] = ResolutionY[0] = VIP_BASE_RES;
+
+ medium = mediaAuto; // enable media-detect
+
+#if defined(APDK_VIP_COLORFILTERING)
+ Config.bErnie = TRUE;
+#endif
+
+ Config.bColorImage = FALSE;
+
+#ifdef APDK_AUTODUPLEX
+ bDuplexCapable = TRUE;
+#endif
+} //DJ990Mode
+
+
+DJ990CMYGrayMode::DJ990CMYGrayMode()
+: PrintMode(NULL)
+{
+
+/*
+ * See comments above regarding 300/600 dpi change
+ */
+
+ BaseResX = BaseResY = TextRes = ResolutionX[0] = ResolutionY[0] = VIP_BASE_RES;
+
+ medium = mediaAuto; // enable media-detect
+
+#if defined(APDK_VIP_COLORFILTERING)
+ Config.bErnie = TRUE;
+#endif
+
+ Config.bColorImage = FALSE;
+
+#ifdef APDK_AUTODUPLEX
+ bDuplexCapable = TRUE;
+#endif
+ pmColor = GREY_CMY;
+ bFontCapable = FALSE;
+} //DJ990CMYGrayMode
+
+#ifdef APDK_EXTENDED_MEDIASIZE
+DJ990KGrayMode::DJ990KGrayMode () : PrintMode (NULL)
+{
+
+/*
+ * See comments above regarding 300/600 dpi change.
+ */
+
+ BaseResX = BaseResY = ResolutionX[0] = ResolutionY[0] = VIP_BASE_RES;
+ medium = mediaPlain;
+#if defined(APDK_VIP_COLORFILTERING)
+ Config.bErnie = TRUE;
+#endif
+
+ Config.bColorImage = FALSE;
+
+#ifdef APDK_AUTODUPLEX
+ bDuplexCapable = TRUE;
+#endif
+ pmColor = GREY_K;
+ bFontCapable = FALSE;
+ dyeCount = 1;
+} //DJ990KGrayMode
+
+DJ9902400Mode::DJ9902400Mode () : PrintMode (NULL)
+{
+ BaseResX =
+ BaseResY = 1200;
+ ResolutionX[0] = 1200;
+ ResolutionY[0] = 1200;
+ bFontCapable = FALSE;
+#ifdef APDK_AUTODUPLEX
+ bDuplexCapable = FALSE;
+#endif
+#if defined(APDK_VIP_COLORFILTERING)
+ Config.bErnie = TRUE;
+#endif
+
+ Config.bColorImage = FALSE;
+
+ medium = mediaHighresPhoto;
+ theQuality = qualityPresentation;
+ pmMediaType = MEDIA_PHOTO;
+ pmQuality = QUALITY_HIGHRES_PHOTO;
+} // DJ9902400Mode
+
+DJ990DraftMode::DJ990DraftMode () : PrintMode (NULL)
+{
+ bFontCapable = FALSE;
+#ifdef APDK_AUTODUPLEX
+ bDuplexCapable = TRUE;
+#endif
+#if defined(APDK_VIP_COLORFILTERING)
+ Config.bErnie = TRUE;
+#endif
+
+ Config.bColorImage = FALSE;
+
+ medium = mediaAuto;
+ theQuality = qualityDraft;
+ pmQuality = QUALITY_DRAFT;
+} // DJ990DraftMode
+
+#endif // APDK_EXTENDED_MEDIASIZE
+
+/*
+ * Some VIP printers do not have Media Sensing device. To enable
+ * selection of Photo/Best mode for these printers, use this mode.
+ */
+
+DJ990BestMode::DJ990BestMode () : PrintMode (NULL)
+{
+ BaseResX = BaseResY = ResolutionX[0] = ResolutionY[0] = VIP_BASE_RES;
+
+ bFontCapable = FALSE;
+
+#ifdef APDK_AUTODUPLEX
+ bDuplexCapable = TRUE;
+#endif
+
+#if defined(APDK_VIP_COLORFILTERING)
+ Config.bErnie = TRUE;
+#endif
+
+ Config.bColorImage = FALSE;
+
+ medium = mediaGlossy;
+ theQuality = qualityPresentation;
+ pmQuality = QUALITY_BEST;
+ pmMediaType = MEDIA_PHOTO;
+} // DJ990BestMode
+
+DJ990PhotoNormalMode::DJ990PhotoNormalMode () : PrintMode (NULL)
+{
+ BaseResX = BaseResY = ResolutionX[0] = ResolutionY[0] = VIP_BASE_RES;
+
+ bFontCapable = FALSE;
+
+#ifdef APDK_AUTODUPLEX
+ bDuplexCapable = TRUE;
+#endif
+
+#if defined(APDK_VIP_COLORFILTERING)
+ Config.bErnie = TRUE;
+#endif
+
+ Config.bColorImage = FALSE;
+
+ medium = mediaGlossy;
+ theQuality = qualityNormal;
+ pmQuality = QUALITY_NORMAL;
+ pmMediaType = MEDIA_PHOTO;
+} // DJ990PhotoNormalMode
+
+BOOL DJ9xxVIP::UseGUIMode
+(
+ PrintMode* pPrintMode
+)
+{
+ // The reason to change all print mode in DJ9xxVIP family to PCL3GUI mode is that
+ // the PCL3 path in VIP printers is not tested. They don't support newer CRD
+ // command. The device fint support for this group is not recommended.
+
+ return TRUE;
+ /*
+ if (pPrintMode->medium == mediaHighresPhoto)
+ {
+ return TRUE;
+ }
+ else
+ {
+#ifdef APDK_AUTODUPLEX
+ if (pPrintMode->QueryDuplexMode() != DUPLEXMODE_NONE)
+ {
+ return TRUE;
+ }
+#endif
+ }
+#if defined(APDK_FONTS_NEEDED)
+// return ((!pPrintMode->bFontCapable) && (!PCL3acceptsDriverware));
+ return (!pPrintMode->bFontCapable);
+#else
+ return TRUE;
+#endif
+ */
+} //UseGUIMode
+
+DRIVER_ERROR DJ9xxVIP::AddPJLHeader ()
+{
+ char *szPJLBuffer = NULL;
+ DRIVER_ERROR err = NO_ERROR;
+ int iPJLBufferSize;
+ if (((iPJLBufferSize = pSS->GetPJLHeaderBuffer (&szPJLBuffer)) > 0) && (szPJLBuffer != NULL))
+ {
+ err = Send ((const BYTE *) szPJLBuffer, iPJLBufferSize);
+ }
+ return err;
+}
+
+Mode10::Mode10
+(
+ SystemServices* pSys,
+ Printer* pPrinter,
+ unsigned int PlaneSize
+) :
+ Compressor(pSys, PlaneSize, TRUE),
+ thePrinter(pPrinter) // needed by Flush
+{
+ if (constructor_error != NO_ERROR) // if error in base constructor
+ {
+ return;
+ }
+
+ // In the worst case, compression expands data by 50%
+ compressBuf = (BYTE*)pSS->AllocMem(PlaneSize + PlaneSize/2);
+ if (compressBuf == NULL)
+ constructor_error=ALLOCMEM_ERROR;
+
+ memset(SeedRow,0xFF,PlaneSize);
+} //Mode10
+
+
+Mode10::~Mode10()
+{ }
+
+
+const BYTE ResetSeedrow[]={ESC,'*','b','0','Y'};
+
+void Mode10::Flush()
+// special problem here regarding white rasters: we can't just reset our seedrow to white,
+// because if a true white raster comes next it will compress to zero, and firmware will
+// print ITS seedrow. So when we zero our seedrow, we need to zero the firmware seedrow.
+// The way to do this is to send ESC*b0Y. So that's what we will do here.
+{
+ if (!seeded)
+ {
+ return;
+ }
+ compressedsize=0;
+
+ iRastersReady = 0;
+ seeded = FALSE;
+ memset(SeedRow,0xFF,inputsize);
+ thePrinter->Send(ResetSeedrow, sizeof(ResetSeedrow));
+} //Flush
+
+
+Compressor* DJ9xxVIP::CreateCompressor(unsigned int RasterSize)
+{
+ return new Mode10(pSS,this,RasterSize);
+}
+
+
+Header* DJ9xxVIP::SelectHeader(PrintContext* pc)
+{
+ return new HeaderDJ990(this,pc);
+}
+
+
+HeaderDJ990::HeaderDJ990(Printer* p,PrintContext* pc)
+ : Header(p,pc)
+{
+ SetMediaSource (pc->GetMediaSource());
+}
+
+
+DRIVER_ERROR HeaderDJ990::ConfigureRasterData()
+// This is the more sophisticated way of setting color and resolution info.
+//
+// NOTE: Will need to be overridden for DJ5xx.
+{
+
+ char buff[50]; // 20 + 3 for crdstart + 3 for ##W
+ char *out = buff;
+
+
+ // begin the CRD command
+ memcpy(out,crdStart,sizeof(crdStart) );
+ out += sizeof(crdStart);
+
+ // now set up the "#W" part, where #= number of data bytes in the command
+ // #= 20
+ // format,ID,components(2bytes),resolutions (4bytes),
+ // compresssion method, orientation, bits/component,planes/component
+ *out++ = 0x32; // "2"
+ *out++ = 0x30; // "0"
+ *out++ = 'W';
+
+#define VIPcrdFormat 6
+#define VIPKRGBID 0x1F
+
+ *out++ = VIPcrdFormat;
+ *out++ = VIPKRGBID;
+
+ // 2-byte component count field
+ // number of components for sRGB is 1 by defintiion
+ *out++ = 0; // leading byte
+ *out++ = 2; // 2 "component"
+
+ *out++ = ResolutionX[0]/256;
+ *out++ = ResolutionX[0]%256;
+ *out++ = ResolutionY[0]/256;
+ *out++ = ResolutionY[0]%256;
+
+ // compression method
+ *out++ = 9; // mode 9 compression
+
+ // orientation
+ *out++ = 0; // pixel major code
+
+ // bits per component
+ *out++ = 1; // 1 bits each for k
+
+ // planes per component
+ *out++ = 1; // K = one component, one "plane"
+
+ *out++ = ResolutionX[0]/256;
+ *out++ = ResolutionX[0]%256;
+ *out++ = ResolutionY[0]/256;
+ *out++ = ResolutionY[0]%256;
+
+ // compression method
+ *out++ = 10; // mode 10 compression
+
+ // orientation
+ *out++ = 1; // pixel major code
+
+ // bits per component
+ *out++ = 32; // 8 bits each for s,R,G,B
+
+ // planes per component
+ *out++ = 1; // sRGB = one component, one "plane"
+
+ return thePrinter->Send((const BYTE*) buff, out-buff);
+} //ConfigureRasterData
+
+
+DRIVER_ERROR HeaderDJ990::ConfigureImageData()
+{
+ DRIVER_ERROR err = thePrinter->Send((const BYTE*)cidStart, sizeof(cidStart));
+ ERRCHECK;
+ char sizer[3];
+ sprintf(sizer,"%dW",6);
+ err = thePrinter->Send((const BYTE*)sizer,2);
+ ERRCHECK;
+
+ BYTE colorspace = 2; // RGB
+ BYTE coding = 3;
+ BYTE bitsindex = 3; // ??
+ BYTE bitsprimary = 8;
+ BYTE CID[6];
+ CID[0] = colorspace;
+ CID[1]=coding;
+ CID[2] = bitsindex;
+ CID[3] = CID[4] = CID[5] = bitsprimary;
+
+ return thePrinter->Send((const BYTE*) CID, 6);
+} //ConfigureImageData
+
+
+DRIVER_ERROR HeaderDJ990::Send()
+/// ASSUMES COMPRESSION ALWAYS ON -- required by DJ990
+{
+ DRIVER_ERROR err;
+// PRINTMODE_VALUES *pPMV;
+ COLORMODE eColorMode = COLOR;
+ MEDIATYPE eMediaType;
+ QUALITY_MODE eQualityMode;
+ BOOL bDeviceText;
+
+ thePrintContext->GetPrintModeSettings (eQualityMode, eMediaType, eColorMode, bDeviceText);
+
+ if (eMediaType == MEDIA_CDDVD)
+ {
+ thePrintContext->SetMediaSource (sourceTrayCDDVD);
+ SetMediaSource (sourceTrayCDDVD);
+ }
+
+ StartSend();
+
+#ifdef APDK_AUTODUPLEX
+ if (thePrintContext->QueryDuplexMode () != DUPLEXMODE_NONE)
+ {
+ err = thePrinter->Send ((const BYTE *) EnableDuplex, sizeof (EnableDuplex));
+ BYTE cDryTime;
+ cDryTime = (BYTE) ((thePrinter->GetHint (EXTRA_DRYTIME_HINT)) & 0xFF);
+ if (cDryTime != 0)
+ {
+ err = thePrinter->Send (ExtraDryTime, sizeof (ExtraDryTime) - 1);
+ err = thePrinter->Send ((const BYTE *) &cDryTime, 1);
+ ERRCHECK;
+ }
+ }
+#endif
+
+ err = ConfigureImageData();
+ ERRCHECK;
+
+ err = ConfigureRasterData();
+ ERRCHECK;
+
+ if (thePrintMode->dyeCount == 1) // grayscale
+ {
+ err=thePrinter->Send((const BYTE*)GrayscaleSeq, sizeof(GrayscaleSeq) );
+ ERRCHECK;
+ }
+ else
+ {
+ if (eColorMode == GREY_CMY)
+ {
+ char pStr[12];
+ memcpy (pStr, GrayscaleSeq, 10);
+ pStr[9] = 0x01;
+ err = thePrinter->Send ((const BYTE *) pStr, 10);
+ }
+ }
+
+ /////////////////////////////////////////////////////////////////////////////////////
+ // unit-of-measure command --- seems to be need in DJ990 PCL3 mode
+ char uom[10];
+ sprintf(uom,"%c%c%c%d%c",ESC,'&','u',thePrintMode->ResolutionX[K],'D');
+ err = thePrinter->Send((const BYTE*)uom, strlen (uom));
+ ERRCHECK;
+
+ // another command that helps PCLviewer
+ unsigned int width=thePrintContext->OutputPixelsPerRow();
+ unsigned int digits = 1;
+ unsigned int x = width;
+ while (x > 10)
+ {
+ digits++;
+ x = x / 10;
+ }
+ sprintf(uom,"%c%c%c%d%c",ESC,'*','r', width,'S');
+ err = thePrinter->Send((const BYTE*)uom, 4 + digits );
+ ERRCHECK;
+
+ ////////////////////////////////////////////////////////////////////////////////////
+
+/*
+ * Custom papersize command
+ */
+
+ if (thePrintContext->thePaperSize == CUSTOM_SIZE)
+ {
+ BYTE szStr[32];
+ short sWidth, sHeight;
+ BYTE b1, b2;
+ sWidth = (short) (thePrintContext->PhysicalPageSizeX () * thePrintContext->EffectiveResolutionX ());
+ sHeight = (short) (thePrintContext->PhysicalPageSizeY () * thePrintContext->EffectiveResolutionY ());
+ memcpy (szStr, "\x1B*o5W\x0E\x05\x00\x00\x00\x1B*o5W\x0E\x06\x00\x00\x00", 20);
+ b1 = (BYTE) ((sWidth & 0xFF00) >> 8);
+ b2 = (BYTE) (sWidth & 0xFF);
+ szStr[8] = b1;
+ szStr[9] = b2;
+ b1 = (BYTE) ((sHeight & 0xFF00) >> 8);
+ b2 = (BYTE) (sHeight & 0xFF);
+ szStr[18] = b1;
+ szStr[19] = b2;
+ err = thePrinter->Send ((const BYTE *) szStr, 20);
+ }
+
+ float fXOverSpray = 0.0;
+ float fYOverSpray = 0.0;
+ float fLeftOverSpray = 0.0;
+ float fTopOverSpray = 0.0;
+ FullbleedType fbType;
+ if (thePrintContext->bDoFullBleed &&
+ thePrinter->FullBleedCapable (thePrintContext->thePaperSize,
+ &fbType,
+ &fXOverSpray, &fYOverSpray,
+ &fLeftOverSpray, &fTopOverSpray))
+ {
+
+/*
+ * To get the printer to do fullbleed printing, send the top and
+ * left overspray commands. Overspray is needed to take care of
+ * skew during paper pick. These values may be mech dependent.
+ * Currently, supported only on PhotoSmart 100. Malibu supports
+ * fullbleed printing also. The current values for overspray are
+ * 0.059 inch for top, bottom and left edges and 0.079 for right edge.
+ */
+
+ BYTE cBuf[4];
+ BYTE TopOverSpraySeq[] = {0x1b, 0x2A, 0x6F, 0x35, 0x57, 0x0E, 0x02, 0x00};
+ // "Esc*o5W 0E 02 00 00 00" Top edge overspray for full-bleed printing
+
+ BYTE LeftOverSpraySeq[] = {0x1b, 0x2A, 0x6F, 0x35, 0x57, 0x0E, 0x01, 0x00};
+ // "Esc*o5W 0E 01 00 00 00" Left edge overspray for full-bleed printing
+
+ short topspray = (short)(fTopOverSpray * thePrintContext->EffectiveResolutionY() + 0.5);
+ cBuf[1] = topspray & 0xFF;
+ cBuf[0] = topspray >> 8;
+
+ err = thePrinter->Send ((const BYTE *) TopOverSpraySeq, sizeof (TopOverSpraySeq));
+ err = thePrinter->Send ((const BYTE *) cBuf, 2);
+
+ // set the left overspray value based on resolution and global constant for horizontal overspray
+ short leftspray = (short)(fLeftOverSpray * thePrintContext->EffectiveResolutionX() + 0.5);
+ cBuf[1] = leftspray & 0xFF;
+ cBuf[0] = leftspray >> 8;
+
+ err = thePrinter->Send ((const BYTE *) LeftOverSpraySeq, sizeof (LeftOverSpraySeq));
+ err = thePrinter->Send ((const BYTE *) cBuf, 2);
+ }
+
+// Now send media pre-load command
+ err = thePrinter->Send ((const BYTE *) "\033&l-2H", 6); // Moved from Modes(), des 3/11/03
+ ERRCHECK;
+
+// Send speed mech command
+ thePrinter->SetHint (SPEED_MECH_HINT, 0);
+
+ // no need for compression command, it's in the CRD
+
+ err = thePrinter->Send((const BYTE*)grafStart, sizeof(grafStart) );
+ ERRCHECK;
+
+ if (!thePrinter->UseGUIMode (thePrintContext->CurrentMode) &&
+ (thePrintContext->PhysicalPageSizeX ()) < 8.0)
+ {
+
+ BYTE blankRow[40];
+ memset (blankRow, 0xFF, 40);
+ strcpy ((char *) blankRow, "\033*p0Y\033*b23W");
+ blankRow[11] = 18; // ce, 7f
+ blankRow[30] = 0xCE; blankRow[31] = 0x7F;
+ err = thePrinter->Send ((const BYTE *) blankRow, 34);
+ }
+
+ return err;
+} //Send
+
+
+DRIVER_ERROR HeaderDJ990::StartSend()
+{
+ DRIVER_ERROR err;
+
+ err = thePrinter->Send((const BYTE*)Reset,sizeof(Reset));
+ ERRCHECK;
+
+ err = thePrinter->Send((const BYTE*)UEL,sizeof(UEL));
+ ERRCHECK;
+
+ err = thePrinter->AddPJLHeader ();
+ ERRCHECK;
+
+ err = thePrinter->Send((const BYTE*)EnterLanguage,sizeof(EnterLanguage));
+ ERRCHECK;
+
+ if (!thePrinter->UseGUIMode(thePrintContext->CurrentMode))
+ {
+ err = thePrinter->Send((const BYTE*)PCL3,sizeof(PCL3));
+ }
+ else
+ {
+ err = thePrinter->Send((const BYTE*)PCLGUI,sizeof(PCLGUI));
+ }
+ ERRCHECK;
+
+
+ err = thePrinter->Send((const BYTE*)&LF,1);
+ ERRCHECK;
+
+ err = Modes (); // Set media source, type, size and quality modes.
+ ERRCHECK;
+
+// Send media subtype if set
+ int iMediaSubtype = thePrintContext->GetMediaSubtype ();
+ if (iMediaSubtype != APDK_INVALID_VALUE)
+ {
+ BYTE szMediaSubtypeSeq[] = {0x1B, '*', 'o', '5', 'W', 0x0D, 0x03, 0x00, 0x00, 0x00};
+ szMediaSubtypeSeq[8] = (BYTE) ((iMediaSubtype & 0xFF00) >> 8);
+ szMediaSubtypeSeq[9] = (BYTE) (iMediaSubtype & 0x00FF);
+ err = thePrinter->Send ((const BYTE *) szMediaSubtypeSeq, sizeof(szMediaSubtypeSeq));
+ ERRCHECK;
+ }
+
+ if (!thePrinter->UseGUIMode(thePrintContext->CurrentMode))
+ {
+ err = Margins(); // set margins
+ }
+
+// special GUI mode top margin set
+
+ else if ((thePrintContext->PrintableStartY ()) > 0.0)
+ {
+ CAPy = thePrintContext->GUITopMargin();
+ }
+
+ if ((thePrintContext->GetMediaSource()) == sourceTrayCDDVD)
+ {
+ err = thePrinter->Send ((const BYTE *) "\033*o5W\x0D\x03\x00\x04\x0C", 10);
+ ERRCHECK;
+ }
+
+ return err;
+} //StartSend
+
+/* This could replace Header::SetMediaSource in header.cpp. des 8/5/02 */
+void HeaderDJ990::SetMediaSource(MediaSource msource)
+// Sets value of PCL::mediasource and associated counter msrccount
+{
+ msrccount=EscAmplCopy((BYTE*)mediasource,msource,'H');
+ if (msource == sourceTrayCDDVD)
+ {
+ SetMediaType (mediaCDDVD);
+ SetQuality (qualityPresentation);
+ return;
+ }
+ if (msource == sourceTray2 || msource > sourceTrayAuto)
+ {
+ SetMediaType (mediaPlain);
+ }
+}
+
+DRIVER_ERROR DJ9xxVIP::VerifyPenInfo()
+{
+ DRIVER_ERROR err=NO_ERROR;
+
+ if(IOMode.bDevID == FALSE)
+ return err;
+ err = ParsePenInfo(ePen);
+
+ if(err == UNSUPPORTED_PEN) // probably Power Off - pens couldn't be read
+ {
+ DBG1("DJ9xxVIP::Need to do a POWER ON to get penIDs\n");
+
+ // have to delay or the POWER ON will be ignored
+ if (pSS->BusyWait((DWORD)2000) == JOB_CANCELED)
+ {
+ return JOB_CANCELED;
+ }
+
+ DWORD length = sizeof(DJ895_Power_On);
+ err = pSS->ToDevice(DJ895_Power_On,&length);
+ ERRCHECK;
+
+ err = pSS->FlushIO();
+ ERRCHECK;
+
+ // give the printer some time to power up
+ if (pSS->BusyWait ((DWORD) 2500) == JOB_CANCELED)
+ {
+ return JOB_CANCELED;
+ }
+
+ err = ParsePenInfo(ePen);
+ }
+
+ ERRCHECK;
+
+ // check for the normal case
+ if (ePen == BOTH_PENS || ePen == MDL_BLACK_AND_COLOR_PENS)
+ {
+ return NO_ERROR;
+ }
+
+// Should we return NO_ERROR for MDL_BOTH also - malibu??
+
+ while ( ePen != BOTH_PENS && pSS->GetVIPVersion () == 1 )
+ {
+
+ switch (ePen)
+ {
+ case BLACK_PEN:
+ // black pen installed, need to install color pen
+ pSS->DisplayPrinterStatus(DISPLAY_NO_COLOR_PEN);
+ break;
+ case COLOR_PEN:
+ // color pen installed, need to install black pen
+ pSS->DisplayPrinterStatus(DISPLAY_NO_BLACK_PEN);
+ break;
+ case NO_PEN:
+ // neither pen installed
+ default:
+ pSS->DisplayPrinterStatus(DISPLAY_NO_PENS);
+ break;
+ }
+
+ if (pSS->BusyWait(500) == JOB_CANCELED)
+ {
+ return JOB_CANCELED;
+ }
+
+ err = ParsePenInfo(ePen);
+ ERRCHECK;
+ }
+
+ pSS->DisplayPrinterStatus(DISPLAY_PRINTING);
+
+ return NO_ERROR;
+} //VerifyPenInfo
+
+
+DRIVER_ERROR DJ9xxVIP::ParsePenInfo(PEN_TYPE& ePen, BOOL QueryPrinter)
+{
+ char* str;
+ int num_pens = 0;
+ PEN_TYPE temp_pen1 = NO_PEN;
+ BYTE penInfoBits[4];
+ int i;
+
+/*
+ * First check if this printer's firmware version is one I know about. Currently
+ * I know upto S:04. I can't guess if the pen info nibbles have shifted in the
+ * new version. Can't tell the user about missing pens.
+ */
+
+ if ((pSS->GetVIPVersion ()) > 5)
+ {
+ ePen = BOTH_PENS;
+ return NO_ERROR;
+ }
+
+ DRIVER_ERROR err = SetPenInfo (str, QueryPrinter);
+// ERRCHECK;
+ if (err != NO_ERROR)
+ {
+ ePen = BOTH_PENS;
+ return NO_ERROR;
+ }
+ iNumMissingPens = 0;
+
+ // the first byte indicates how many pens are supported
+ if ((str[0] >= '0') && (str[0] <= '9'))
+ {
+ num_pens = str[0] - '0';
+ }
+ else if ((str[0] >= 'A') && (str[0] <= 'F'))
+ {
+ num_pens = 10 + (str[0] - 'A');
+ }
+ else if ((str[0] >= 'a') && (str[0] <= 'f'))
+ {
+ num_pens = 10 + (str[0] - 'a');
+ }
+ else
+ {
+ return BAD_DEVICE_ID;
+ }
+
+ if ((int) strlen (str) < (num_pens * 8))
+ {
+ return BAD_DEVICE_ID;
+ }
+
+// DJ990 style DevID
+
+ if (pSS->GetVIPVersion () == 1)
+ {
+ if (num_pens < 2)
+ {
+ return UNSUPPORTED_PEN;
+ }
+
+ // parse pen1 (should be black)
+ AsciiHexToBinary(penInfoBits, str+1, 4);
+ penInfoBits[1] &= 0xf8; // mask off ink level trigger bits
+
+ if ((penInfoBits[0] == 0xc1) && (penInfoBits[1] == 0x10))
+ {
+ temp_pen1 = BLACK_PEN;
+ }
+ else if (penInfoBits[0] == 0xc0)
+ { // missing pen
+ temp_pen1 = NO_PEN;
+ iNumMissingPens = 1;
+ }
+ else
+ {
+ return UNSUPPORTED_PEN;
+ }
+
+ // now check pen2 (should be color)
+ AsciiHexToBinary(penInfoBits, str+9, 4);
+ penInfoBits[1] &= 0xf8; // mask off ink level trigger bits
+
+ if ((penInfoBits[0] == 0xc2) && (penInfoBits[1] == 0x08))
+ { // Chinook
+ if (temp_pen1 == BLACK_PEN)
+ {
+ ePen = BOTH_PENS;
+ }
+ else
+ {
+ ePen = COLOR_PEN;
+ }
+ }
+ else if (penInfoBits[0] == 0xc0)
+ { // missing pen
+ ePen = temp_pen1;
+ iNumMissingPens = 1;
+ }
+ else
+ {
+ return UNSUPPORTED_PEN;
+ }
+
+ return NO_ERROR;
+ }
+
+// Check for missing pens
+
+ if (*(str - 1) == '1' && *(str - 2) == '1')
+ {
+ return UNSUPPORTED_PEN;
+ }
+
+ char *p = str + 1;
+
+/*
+ * Pen Type Info
+ *
+ Bit 31 (1 bit)
+
+ 1 if these fields describe a print head
+ 0 otherwise
+ Bit 30 (1 bit)
+
+ 1 if these fields describe an ink supply
+ 0 otherwise
+
+ Bits 29 .. 24 (6 bits) describes the pen/supply type:
+
+ 0 = none
+ 1 = black
+ 2 = CMY
+ 3 = KCM
+ 4 = Cyan
+ 5 = Meganta
+ 6 = Yellow
+ 7 = Cyan - low dye load
+ 8 = Magenta - low dye load
+ 9 = Yellow - low dye load (may never be used, but reserve space anyway) [def added Jun 3, 2002]
+ 10 = gGK - two shades of grey plus black; g=light grey, G=medium Grey, K=black [added Sep 12, 02]
+ 11 = Blue Pen
+ 12 .. 62 = reserved for future use
+ 63 = Unknown
+
+ Bits 23 .. 19 (5 bits) describes the pen/supply id:
+
+ 0 = none
+ 1 = color (Formerly N)
+ 2 = black (Formerly H)
+ 3 = Flash (Formerly F)
+ 4 = (Formerly R -- only 6xx family)
+ 5 = (Formerly C -- only 6xx family)
+ 6 = (Formerly M -- only for 6xx family)
+ 7 = (Cp1160 Pen)
+ 8 = Europa (Jupiter Ink)
+ 9 = Wax (pen/ink combo; k)
+ 10 = (pen/ink combo; cmy)
+ 11 = (pen/ink combo; kcm)
+ 12 = (pen/ink combo; k) [def added Jun 27, 2002]
+ 13 = (k) [def added Jun 27, 2002]
+ 14 = pen/ink combo; gGK) [added Sep 12, 02]
+ 15 .. 30 = reserved for future use [def added Jun 27, 2002]
+ 31 = Other/Unknown [def added Jun 27, 2002]
+ */
+
+ ePen = NO_PEN;
+
+ if (pSS->GetVIPVersion () == 3)
+ {
+ for (i = 0; i < num_pens; i++, p += 4)
+ {
+ if (*p > 0 && *p < '5')
+ {
+ continue;
+ }
+ switch (*p)
+ {
+ case 0:
+ {
+ iNumMissingPens++;
+ break;
+ }
+ case '5':
+ {
+ ePen = BLACK_PEN;
+ break;
+ }
+ case '6':
+ case '7':
+ case '8':
+ {
+ if (ePen == BLACK_PEN)
+ {
+ ePen = BOTH_PENS;
+ }
+ else if (ePen != BOTH_PENS)
+ {
+ ePen = COLOR_PEN;
+ }
+ break;
+ }
+ }
+
+ }
+ if (iNumMissingPens != 0)
+ {
+ return MISSING_PENS;
+ }
+ return NO_ERROR;
+ }
+
+#if 0
+
+ BYTE penColor;
+
+/*
+ * These printers don't need all pens to be installed to print. Parsing the pen info
+ * is not all that useful. Also, the note about incompatible pen is not valid anymore,
+ * it just means unknown or other pen.
+ * Raghu - 11/17/05
+ */
+
+ for (i = 0; i < num_pens; i++, p += 8)
+ {
+ AsciiHexToBinary (penInfoBits, p, 8);
+
+ if ((penInfoBits[1] & 0xf8) == 0xf8)
+ {
+
+// The high 5 bits in the 3rd and 4th nibble (second byte) identify the
+// installed pen. If all 5 bits are on, user has installed an incompatible pen.
+
+ return UNSUPPORTED_PEN;
+ }
+
+ if ((penInfoBits[0] & 0x40) != 0x40) // if Bit 31 is 1, this is not a pen
+ {
+ continue;
+ }
+ penColor = penInfoBits[0] & 0x3F;
+ switch (penColor)
+ {
+ case 0:
+ {
+ iNumMissingPens++;
+ break;
+ }
+ case 1:
+ ePen = BLACK_PEN;
+ break;
+ case 2:
+ {
+ if (ePen == BLACK_PEN)
+ {
+ ePen = BOTH_PENS;
+ }
+ else if (ePen == MDL_PEN)
+ {
+ ePen = MDL_BOTH;
+ }
+ else if (ePen == GREY_PEN)
+ {
+ ePen = GREY_BOTH;
+ }
+ else
+ {
+ ePen = COLOR_PEN;
+ }
+ break;
+ }
+ case 3:
+ if (ePen == BLACK_PEN)
+ {
+ ePen = MDL_AND_BLACK_PENS;
+ }
+ else if (ePen == COLOR_PEN)
+ {
+ ePen = MDL_BOTH;
+ }
+ else if (ePen == BOTH_PENS)
+ {
+ ePen = MDL_BLACK_AND_COLOR_PENS;
+ }
+ else if (ePen == GREY_PEN)
+ {
+ ePen = MDL_AND_GREY_PENS;
+ }
+ else if (ePen == GREY_BOTH)
+ {
+ ePen = MDL_GREY_AND_COLOR_PENS;
+ }
+ else
+ {
+ ePen = MDL_PEN;
+ }
+ break;
+ case 4: // cyan pen
+ case 5: // magenta pen
+ case 6: // yellow pen
+ case 7: // low dye load cyan pen
+ case 8: // low dye load magenta pen
+ case 9: // low dye load yellow pen
+ case 11: // blue pen
+ if (ePen == BLACK_PEN || ePen == BOTH_PENS)
+ {
+ ePen = BOTH_PENS;
+ }
+ else
+ {
+ ePen = COLOR_PEN;
+ }
+ break;
+ case 10:
+ ePen = GREY_PEN;
+ break;
+ default:
+ ePen = UNKNOWN_PEN;
+ }
+ }
+ return NO_ERROR;
+#endif
+
+ ePen = BOTH_PENS;
+ return NO_ERROR;
+
+} //ParsePenInfo
+
+
+BOOL DJ9xxVIP::IsPCL3DriverwareAvailable()
+{
+#ifdef APDK_LINUX
+ // Linux supports Bi-Di, but is not enabled at this time. See comments below.
+ return TRUE;
+#else
+
+ BOOL pcl3driverware = TRUE; // default to TRUE since this is the case for all but some early units
+ BOOL inAJob = FALSE;
+ char *pStr;
+ char *pEnd;
+ BYTE devIDBuff[DevIDBuffSize];
+ int maxWaitTries;
+ int i;
+
+ // if don't have bidi can't check so assume driverware is ok since only certain
+ // 990s don't handle driverware in PCL3 mode
+ if (!IOMode.bDevID)
+ {
+ return TRUE;
+ }
+
+ if (pSS->GetDeviceID(devIDBuff, DevIDBuffSize, TRUE) != NO_ERROR)
+ {
+ goto cleanup;
+ }
+
+ // if printer does not have firmware based on the first 990 release
+ // don't bother checking, can assume driverware commands are OK
+ if (!strstr((const char*)devIDBuff+2,"MDL:DESKJET 990C") &&
+ !strstr((const char*)devIDBuff+2,"MDL:PHOTOSMART 1215") &&
+ !strstr((const char*)devIDBuff+2,"MDL:PHOTOSMART 1218") )
+ {
+ return TRUE;
+ }
+
+ // high-level process to check if driverware is available in PCL3 mode:
+ // 1. set JobName through the normal PJL command to some string X
+ // 2. poll DeviceID until see this JobName (syncs host with printer in case
+ // printer is still printing an earlier job etc.)
+ // 3. go into PCL3 mode
+ // 4. send driverware command to set JobName
+ // 5. get the DeviceID and look at the JobName, if it is not "NEWDRIVERWARE" (what
+ // the firmware driverware command sets it to) conclude that driverware is
+ // not available in PCL3 mode; if the JobName is "NEWDRIVERWARE" then conclude
+ // that driverware is available in PCL3 mode
+ // 6. exit this "job" (send a UEL)
+
+
+
+ // set the JobName via PJL
+ if (Flush() != NO_ERROR) goto cleanup;
+ if (Send((const BYTE*)UEL,sizeof(UEL)) != NO_ERROR) goto cleanup;
+ inAJob = TRUE;
+ if (Send((const BYTE*)JobName,sizeof(JobName)) != NO_ERROR) goto cleanup;
+ if (Send((const BYTE*)&Quote,1) != NO_ERROR) goto cleanup;
+ if (Send((const BYTE*)OUR_PJL_JOBNAME,strlen(OUR_PJL_JOBNAME)) != NO_ERROR) goto cleanup;
+ if (Send((const BYTE*)&Quote,1) != NO_ERROR) goto cleanup;
+ if (Send((const BYTE*)&LF,1) != NO_ERROR) goto cleanup;
+ if (Flush() != NO_ERROR) goto cleanup; // we flush our ::Send buffer
+ if (pSS->FlushIO() != NO_ERROR) goto cleanup; // we flush any external I/O buffer
+
+ // wait for printer to see this and set JobName in the DeviceID
+ // we know printer will respond, it is just a matter of time so wait
+ // a while until see it since it may take a few seconds
+ // for it to sync up with us if it is busy printing or picking
+ //
+ // this is a pretty long timeout but if the printer is finishing up
+ // a preceding job we need to give it time to finish it since it won't
+ // set the new jobname until the last job is complete
+ // one possible enhancement would be to look at the flags in the DeviceID
+ // to see if a job is active on more than one i/o connection
+ maxWaitTries = 120; // wait max of 60sec
+ for (i=0; i<maxWaitTries; i++)
+ {
+ if (pSS->GetDeviceID(devIDBuff, DevIDBuffSize, TRUE) != NO_ERROR) goto cleanup;
+ if ( (pStr=(char *)strstr((const char*)devIDBuff+2,";J:")) )
+ {
+ pStr += 3;
+ if ( (pEnd=(char *)strstr((const char*)pStr,";")) )
+ {
+ *pEnd = '\0';
+ while (pEnd > pStr) // take out trailing spaces in JobName before compare
+ {
+ if (*(pEnd-1) == ' ')
+ {
+ *(pEnd-1) = '\0';
+ }
+ else
+ {
+ break;
+ }
+ pEnd--;
+ }
+ if (!strcmp(pStr, OUR_PJL_JOBNAME))
+ {
+ break;
+ }
+ }
+ pSS->BusyWait((DWORD)500);
+ }
+ else
+ {
+ DBG1("JobName missing from DeviceID strings");
+ goto cleanup;
+ }
+ }
+ if (i>=maxWaitTries)
+ {
+ // printer didn't respond to driverware in PCL3GUI mode withing allowed timeout
+ DBG1("Printer didn't respond to PJL\n");
+ goto cleanup;
+ }
+
+ // now printer is in sync with us so try PCL3 mode and expect it to react to command
+ // immediately or will assume that it ignores driverware in that mode
+ if (Send((const BYTE*)EnterLanguage,sizeof(EnterLanguage)) != NO_ERROR) goto cleanup;
+ if (Send((const BYTE*)PCL3,sizeof(PCL3)) != NO_ERROR) goto cleanup;
+ if (Send((const BYTE*)&LF,1) != NO_ERROR) goto cleanup;
+ if (Send((const BYTE*)DriverwareJobName,sizeof(DriverwareJobName)) != NO_ERROR) goto cleanup;
+ if (Flush() != NO_ERROR) goto cleanup; // we flush our ::Send buffer
+ if (pSS->FlushIO() != NO_ERROR) goto cleanup; // we flush any external I/O buffer
+
+ // wait for printer to see this and set DeviceID to reflect this command
+ // since we are sending in PCL3 mode we don't know if printer will respond
+ // so don't wait very long
+ maxWaitTries = 4;
+ for (i=0; i<maxWaitTries; i++)
+ {
+ if (pSS->GetDeviceID(devIDBuff, DevIDBuffSize, TRUE) != NO_ERROR) goto cleanup;
+ if ( (pStr=(char *)strstr((const char*)devIDBuff+2,";J:")) )
+ {
+ pStr += 3;
+ if ( (pEnd=(char *)strstr((const char*)pStr,";")) )
+ {
+ *pEnd = '\0';
+ // firmware may have garbage in remainder of JobName buffer - truncate
+ // it to the length of the string that should be set before compare
+ if (!strncmp(pStr, DRIVERWARE_JOBNAME, strlen(DRIVERWARE_JOBNAME)))
+ {
+ pcl3driverware = TRUE;
+ break;
+ }
+ }
+ pSS->BusyWait((DWORD)500);
+ }
+ else
+ {
+ DBG1("JobName missing from DeviceID string");
+ goto cleanup;
+ }
+ }
+ if (i>=maxWaitTries)
+ {
+ // since we haven't gotten a response assume that the printer ignores driverware
+ // commands in PCL3 mode
+ pcl3driverware = FALSE;
+ }
+
+
+cleanup:
+ if (inAJob) // send UEL in case left printer in the context of a job
+ {
+ if (Send((const BYTE*)UEL,sizeof(UEL)) != NO_ERROR) goto bailout;
+ if (pSS->FlushIO() != NO_ERROR) goto bailout;
+ }
+
+bailout:
+ return pcl3driverware;
+
+#endif // APDK_LINUX
+
+} //IsPCL3DriverwareAvailable
+
+
+DISPLAY_STATUS DJ9xxVIP::ParseError(BYTE status_reg)
+{
+ DBG1("DJ9xxVIP, parsing error info\n");
+
+ DRIVER_ERROR err = NO_ERROR;
+ BYTE DevIDBuffer[DevIDBuffSize];
+ char *pStr;
+ int iVersion = pSS->GetVIPVersion ();
+
+ if(IOMode.bDevID && iVersion < 6)
+ {
+ // If a bi-di cable was plugged in and everything was OK, let's see if it's still
+ // plugged in and everything is OK
+ err = pSS->GetDeviceID (DevIDBuffer, DevIDBuffSize, TRUE);
+ if(err != NO_ERROR)
+ {
+ // job was bi-di but now something's messed up, probably cable unplugged
+ return DISPLAY_COMM_PROBLEM;
+ }
+
+ if ( (pStr=(char *)strstr((const char*)DevIDBuffer+2,";S:")) == NULL )
+ {
+ return DISPLAY_COMM_PROBLEM;
+ }
+
+ // point to PrinterState
+ BYTE b1,b2;
+
+ pStr+=5; // 3 for ";S:", 2 for version -- point to first byte of "printer state"
+ b1=*pStr;
+
+ if (b1=='9')
+ {
+ return DISPLAY_TOP_COVER_OPEN;
+ }
+
+ if (iVersion < 3)
+ {
+ pStr += 12; // point to "feature state"
+ }
+ else if (iVersion < 5)
+ {
+ pStr += 14;
+ }
+ else
+ {
+ pStr += 18;
+ }
+
+ b1=*pStr++;
+ b2=*pStr++;
+ if ((b1=='0') && (b2=='9')) // 09 = OOP state
+ {
+ DBG1("Out of Paper [from Encoded DevID]\n");
+ return DISPLAY_OUT_OF_PAPER;
+ }
+
+ if (b1 == '0' && (b2 == 'c' || b2 == 'C')) // 0C - PhotoTray Mismatch
+ {
+
+/*
+ * PhotoTray is engaged, but requested paper size is larger than A6.
+ * It may also mean A6/Photo size is requested but photo tray is not engaged.
+ */
+
+ DBG1("Photo Tray Mismatch [from Encoded DevID]\n");
+ return DISPLAY_PHOTOTRAY_MISMATCH;
+ }
+
+// Paper Jam or Paper Stall
+
+ if ((b1 == '1' && b2 == '0') || // Paper Jam
+ (b1 == '0' && (b2 == 'e' || b2 == 'E')))
+ {
+ return DISPLAY_PAPER_JAMMED;
+ }
+
+// Carriage Stall
+
+ if (b1 == '0' && (b2 == 'F' || b2 == 'f'))
+ {
+ return DISPLAY_ERROR_TRAP;
+ }
+
+// Job Cancelled (AIO printer turn idle after job canceled)
+ if ((b1=='0') && (b2=='5')) // 05 = CNCL state
+ {
+ DBG1("Printing Canceled [from Encoded DevID]\n");
+ return DISPLAY_PRINTING_CANCELED;
+ }
+
+ // VerifyPenInfo will handle prompting the user
+ // if this is a problem
+ err = VerifyPenInfo ();
+
+ if(err != NO_ERROR)
+ {
+ // VerifyPenInfo returned an error, which can only happen when ToDevice
+ // or GetDeviceID returns an error. Either way, it's BAD_DEVICE_ID or
+ // IO_ERROR, both unrecoverable. This is probably due to the printer
+ // being turned off during printing, resulting in us not being able to
+ // power it back on in VerifyPenInfo, since the buffer still has a
+ // partial raster in it and we can't send the power-on command.
+ return DISPLAY_COMM_PROBLEM;
+ }
+ }
+
+ // check for errors we can detect from the status reg
+ if (IOMode.bStatus)
+ {
+ // Although DJ8XX is OOP, printer continues taking data and BUSY bit gets
+ // set. See IO_defs.h
+ if ( DEVICE_IS_OOP(status_reg) )
+ {
+ DBG1("Out Of Paper [from status byte]\n");
+ return DISPLAY_OUT_OF_PAPER;
+ }
+
+ // DJ8XX doesn't go offline, so SELECT bit is set even when paper jammed.
+ // See IO_defs.h
+ if (DEVICE_PAPER_JAMMED(status_reg))
+ {
+ DBG1("Jammed [from status byte]\n");
+ return DISPLAY_PAPER_JAMMED;
+ }
+/*
+ * Do not process this. Malibu printers set the NFAULT bit low when a pen is
+ * missing, eventhough they support reserve mode printing. This causes us to
+ * report ERROR_TRAP message. Consequence is that we may not catch carriage
+ * stall, but should eventually result in time out.
+ if (DEVICE_IO_TRAP(status_reg))
+ {
+ DBG1("Jammed or trapped [from status byte]\n");
+ return DISPLAY_ERROR_TRAP;
+ }
+ */
+ }
+
+ // don't know what the problem is-
+ // Is the PrinterAlive?
+ if (pSS->PrinterIsAlive())
+ {
+ iTotal_SLOW_POLL_Count += iMax_SLOW_POLL_Count;
+#if defined(DEBUG) && (DBG_MASK & DBG_LVL1)
+ printf("iTotal_SLOW_POLL_Count = %d\n",iTotal_SLOW_POLL_Count);
+#endif
+ // -Note that iTotal_SLOW_POLL_Count is a multiple of
+ // iMax_SLOW_POLL_Count allowing us to check this
+ // on an absolute time limit - not relative to the number
+ // of times we happen to have entered ParseError.
+ // -Also note that we have different thresholds for uni-di & bi-di.
+ if(
+ ((IOMode.bDevID == FALSE) && (iTotal_SLOW_POLL_Count >= 60)) ||
+ ((IOMode.bDevID == TRUE) && (iTotal_SLOW_POLL_Count >= 120))
+ )
+ {
+ return DISPLAY_BUSY;
+ }
+ else
+ {
+ return DISPLAY_PRINTING;
+ }
+ }
+ else
+ {
+ return DISPLAY_COMM_PROBLEM;
+ }
+} //ParseError
+
+
+DRIVER_ERROR DJ9xxVIP::CleanPen()
+{
+ const BYTE DJ990_User_Output_Page[] = {ESC, '%','P','u','i','f','p','.',
+ 'm','u','l','t','i','_','b','u','t','t','o','n','_','p','u','s','h',' ','3',';',
+ 'u','d','w','.','q','u','i','t',';',ESC,'%','-','1','2','3','4','5','X' };
+
+ DWORD length = sizeof(PEN_CLEAN_PML);
+ DRIVER_ERROR err = pSS->ToDevice(PEN_CLEAN_PML, &length);
+ ERRCHECK;
+
+ // send this page so that the user sees some output. If you don't send this, the
+ // pens get serviced but nothing prints out.
+ length = sizeof(DJ990_User_Output_Page);
+ return pSS->ToDevice(DJ990_User_Output_Page, &length);
+} //CleanPen
+
+
+#if defined(APDK_VIP_COLORFILTERING)
+/// ERNIE ////////////////////////////////////////////////////////////////
+BOOL TErnieFilter::Process(RASTERDATA* ImageData)
+{
+ if (ImageData == NULL || (ImageData->rasterdata[COLORTYPE_COLOR] == NULL && ImageData->rasterdata[COLORTYPE_BLACK] == NULL))
+ {
+ return FALSE;
+ }
+ else
+ {
+ if (ImageData->rasterdata[COLORTYPE_COLOR])
+ {
+ submitRowToFilter(ImageData->rasterdata[COLORTYPE_COLOR]);
+
+ if (ImageData->rasterdata[COLORTYPE_BLACK])
+ {
+ memcpy(fBlackRowPtr[RowIndex], ImageData->rasterdata[COLORTYPE_BLACK], ImageData->rastersize[COLORTYPE_BLACK]);
+ }
+ BlackRasterSize[RowIndex++] = ImageData->rastersize[COLORTYPE_BLACK];
+
+ if (RowIndex == 4)
+ RowIndex = 0;
+
+ // something ready after 4th time only
+ return (fNumberOfBufferedRows == 0);
+ }
+ else
+ {
+ iRastersReady = 1;
+ }
+ }
+ return TRUE;
+} //Process
+
+
+unsigned int TErnieFilter::GetOutputWidth(COLORTYPE rastercolor)
+{
+ if (rastercolor == COLORTYPE_COLOR)
+ {
+ if (raster.rasterdata[COLORTYPE_COLOR] == NULL)
+ return 0;
+ else
+ return fRowWidthInPixels * BYTES_PER_PIXEL;
+ }
+ else
+ {
+ if (raster.rasterdata[COLORTYPE_COLOR] == NULL)
+ return raster.rastersize[rastercolor];
+ else
+ return BlackRasterSize[iRastersDelivered-1];
+ }
+} //GetOutputWidth
+
+
+BYTE* TErnieFilter::NextOutputRaster(COLORTYPE rastercolor)
+{
+ if (iRastersReady == 0)
+ return (BYTE*)NULL;
+ if (rastercolor == COLORTYPE_COLOR)
+ {
+ if (raster.rasterdata[COLORTYPE_COLOR] == NULL)
+ {
+ iRastersReady--;
+ return (BYTE*)NULL;
+ }
+ else
+ {
+ if (iRastersReady == 0)
+ return (BYTE*)NULL;
+
+ iRastersReady--;
+
+ return fRowPtr[iRastersDelivered++];
+ }
+ }
+ else
+ {
+ if (raster.rasterdata[COLORTYPE_COLOR] == NULL)
+ {
+ return raster.rasterdata[rastercolor];
+ }
+ else
+ {
+ if (BlackRasterSize[iRastersDelivered] == 0)
+ return NULL;
+ else
+ return fBlackRowPtr[iRastersDelivered];
+ }
+ }
+} //NextOutputRaster
+
+
+void TErnieFilter::Flush()
+{
+ writeBufferedRows();
+ iRastersDelivered=0;
+ fPixelOffsetIndex = 0;
+ iRastersReady = fNumberOfBufferedRows;
+ fNumberOfBufferedRows = 0;
+} //Flush
+
+#endif //APDK_VIP_COLORFILTERING
+
+inline uint32_t Mode10::get3Pixel
+(
+ BYTE* pixAddress,
+ int pixelOffset
+)
+{
+ pixAddress += ((pixelOffset << 1) + pixelOffset); //pixAddress += pixelOffset * 3;
+
+ BYTE r = *(pixAddress);
+ BYTE g = *(pixAddress + 1);
+ BYTE b = *(pixAddress + 2);
+
+ return (kWhite & ((r << 16) | (g << 8) | (b)));
+
+// unsigned int toReturn = *((unsigned int*)pixAddress); // load toReturn with XRGB
+// toReturn &= kWhite; // Strip off unwanted X. EGW stripped lsb blue.
+} //get3Pixel
+
+
+void Mode10::put3Pixel
+(
+ BYTE* pixAddress,
+ int pixelOffset,
+ uint32_t pixel
+)
+{
+ pixAddress += ((pixelOffset << 1) + pixelOffset); //pixAddress += pixelOffset * 3;
+
+ unsigned int temp = (pixel & kWhite);
+
+ *(pixAddress) = ((temp >> 16) & 0x000000FF);
+ *(pixAddress + 1) = ((temp >> 8) & 0x000000FF);
+ *(pixAddress + 2) = (temp & 0x000000FF);
+
+} //put3Pixel
+
+
+unsigned short Mode10::ShortDelta
+(
+ uint32_t lastPixel,
+ uint32_t lastUpperPixel
+)
+{
+ int dr,dg,db;
+ int result;
+
+ dr = GetRed(lastPixel) - GetRed(lastUpperPixel);
+ dg = GetGreen(lastPixel) - GetGreen(lastUpperPixel);
+ db = GetBlue(lastPixel) - GetBlue(lastUpperPixel);
+
+ if ((dr <= 15) && (dr >= -16) && (dg <= 15) && (dg >= -16) && (db <= 30) && (db >= -32))
+ { // Note db is divided by 2 to double it's range from -16..15 to -32..30
+ result = ((dr << 10) & 0x007C00) | (((dg << 5) & 0x0003E0) | ((db >> 1) & 0x01F) | 0x8000); // set upper bit to signify short delta
+ }
+ else
+ {
+ result = 0; // upper bit is zero to signify delta won't work
+ }
+
+ return result;
+}
+
+BOOL Mode10::Process
+(
+ RASTERDATA* input
+)
+/****************************************************************************
+Initially written by Elden Wood
+August 1998
+
+Similar to mode 9, though tailored for pixel data.
+For more information see the Bert Compression Format document.
+
+This function compresses a single row per call.
+****************************************************************************/
+{
+ if (input==NULL ||
+ (input->rasterdata[COLORTYPE_COLOR]==NULL && input->rasterdata[COLORTYPE_BLACK]==NULL)) // flushing pipeline
+ {
+ Flush();
+ return FALSE;
+ }
+
+ if (myplane == COLORTYPE_BLACK || input->rasterdata[COLORTYPE_COLOR]==NULL)
+ {
+ iRastersReady = 1;
+ compressedsize = 0;
+ if (seeded)
+ {
+ thePrinter->Send(ResetSeedrow, sizeof(ResetSeedrow));
+ memset(SeedRow,0xFF,inputsize);
+ seeded = FALSE;
+ }
+ return TRUE;
+ }
+ unsigned int originalsize = input->rastersize[myplane];
+ unsigned int size = input->rastersize[myplane];
+
+ unsigned char *seedRowPtr = (unsigned char*)SeedRow;
+
+ unsigned char *compressedDataPtr = compressBuf;
+ unsigned char *curRowPtr = (unsigned char*)input->rasterdata[myplane];
+ unsigned int rowWidthInBytes = size;
+
+ ASSERT(curRowPtr);
+ ASSERT(seedRowPtr);
+ ASSERT(compressedDataPtr);
+ ASSERT(rowWidthInBytes >= BYTES_PER_PIXEL);
+ ASSERT((rowWidthInBytes % BYTES_PER_PIXEL) == 0);
+
+ unsigned char *compressedDataStart = compressedDataPtr;
+ unsigned int lastPixel = (rowWidthInBytes / BYTES_PER_PIXEL) - 1;
+
+ // Setup sentinal value to replace last pixel of curRow. Simplifies future end condition checking.
+ uint32_t realLastPixel = getPixel(curRowPtr, lastPixel);
+
+ uint32_t newLastPixel = realLastPixel;
+ while ((getPixel(curRowPtr, lastPixel-1) == newLastPixel) ||
+ (getPixel(seedRowPtr, lastPixel) == newLastPixel))
+ {
+ putPixel(curRowPtr, lastPixel, newLastPixel += 0x100); // add one to green.
+ }
+
+ unsigned int curPixel = 0;
+ unsigned int seedRowPixelCopyCount;
+ unsigned int cachedColor = kWhite;
+
+ do // all pixels in row
+ {
+ unsigned char CMDByte = 0;
+ int replacementCount;
+
+ // Find seedRowPixelCopyCount for upcoming copy
+ seedRowPixelCopyCount = curPixel;
+ while (getPixel(seedRowPtr, curPixel) == getPixel(curRowPtr, curPixel))
+ {
+ curPixel++;
+ }
+
+ seedRowPixelCopyCount = curPixel - seedRowPixelCopyCount;
+ ASSERT (curPixel <= lastPixel);
+
+ int pixelSource = 0;
+
+ if (curPixel == lastPixel) // On last pixel of row. RLE could also leave us on the last pixel of the row from the previous iteration.
+ {
+ putPixel(curRowPtr, lastPixel, realLastPixel);
+
+ if (getPixel(seedRowPtr, curPixel) == realLastPixel)
+ {
+ goto mode10rtn;
+ }
+ else // code last pix as a literal
+ {
+
+ CMDByte = eLiteral;
+ pixelSource = eeNewPixel;
+ replacementCount = 1;
+ curPixel++;
+ }
+ }
+ else // prior to last pixel of row
+ {
+ ASSERT(curPixel < lastPixel);
+
+ replacementCount = curPixel;
+ uint32_t RLERun = getPixel(curRowPtr, curPixel);
+
+ curPixel++; // Adjust for next pixel.
+ while (RLERun == getPixel(curRowPtr, curPixel)) // RLE
+ {
+ curPixel++;
+ }
+ curPixel--; // snap back to current.
+ replacementCount = curPixel - replacementCount;
+ ASSERT(replacementCount >= 0);
+
+ if (replacementCount > 0) // Adjust for total occurance and move to next pixel to do.
+ {
+ curPixel++;
+ replacementCount++;
+
+ if (cachedColor == RLERun)
+ {
+ pixelSource = eeCachedColor;
+ }
+ else if (getPixel(seedRowPtr, curPixel-replacementCount+1) == RLERun)
+ {
+ pixelSource = eeNEPixel;
+ }
+ else if ((curPixel-replacementCount > 0) && (getPixel(curRowPtr, curPixel-replacementCount-1) == RLERun))
+ {
+ pixelSource = eeWPixel;
+ }
+ else
+ {
+ pixelSource = eeNewPixel;
+ cachedColor = RLERun;
+ }
+
+ CMDByte = eRLE; // Set default for later.
+
+ }
+
+ if (curPixel == lastPixel)
+ {
+ ASSERT(replacementCount > 0); // Already found some RLE pixels
+
+ if (realLastPixel == RLERun) // Add to current RLE. Otherwise it'll be part of the literal from the seedrow section above on the next iteration.
+ {
+ putPixel(curRowPtr, lastPixel, realLastPixel);
+ replacementCount++;
+ curPixel++;
+ }
+ }
+
+ if (0 == replacementCount) // no RLE so it's a literal by default.
+ {
+ uint32_t tempPixel = getPixel(curRowPtr, curPixel);
+
+ ASSERT(tempPixel != getPixel(curRowPtr, curPixel+1)); // not RLE
+ ASSERT(tempPixel != getPixel(seedRowPtr, curPixel)); // not seedrow copy
+
+ CMDByte = eLiteral;
+
+ if (cachedColor == tempPixel)
+ {
+ pixelSource = eeCachedColor;
+
+ }
+ else if (getPixel(seedRowPtr, curPixel+1) == tempPixel)
+ {
+ pixelSource = eeNEPixel;
+
+ }
+ else if ((curPixel > 0) && (getPixel(curRowPtr, curPixel-1) == tempPixel))
+ {
+ pixelSource = eeWPixel;
+
+ }
+ else
+ {
+
+ pixelSource = eeNewPixel;
+ cachedColor = tempPixel;
+ }
+
+ replacementCount = curPixel;
+ uint32_t cachePixel;
+ uint32_t nextPixel = getPixel(curRowPtr, curPixel+1);
+ do
+ {
+ if (++curPixel == lastPixel)
+ {
+ putPixel(curRowPtr, lastPixel, realLastPixel);
+ curPixel++;
+ break;
+ }
+ cachePixel = nextPixel;
+ }
+ while ((cachePixel != (nextPixel = getPixel(curRowPtr, curPixel+1))) &&
+ (cachePixel != getPixel(seedRowPtr, curPixel)));
+
+ replacementCount = curPixel - replacementCount;
+
+ ASSERT(replacementCount > 0);
+ }
+ }
+
+ ASSERT(seedRowPixelCopyCount >= 0);
+
+ // Write out compressed data next.
+ if (eLiteral == CMDByte)
+ {
+ ASSERT(replacementCount >= 1);
+
+ replacementCount -= 1; // normalize it
+
+ CMDByte |= pixelSource; // Could put this directly into CMDByte above.
+ CMDByte |= MIN(3, seedRowPixelCopyCount) << 3;
+ CMDByte |= MIN(7, replacementCount);
+
+ *compressedDataPtr++ = CMDByte;
+
+ if (seedRowPixelCopyCount >= 3)
+ {
+ outputVLIBytesConsecutively(seedRowPixelCopyCount - 3, compressedDataPtr);
+ }
+
+ replacementCount += 1; // denormalize it
+
+ int totalReplacementCount = replacementCount;
+ int upwardPixelCount = 1;
+
+ if (eeNewPixel != pixelSource)
+ {
+ replacementCount -= 1; // Do not encode 1st pixel of run since it comes from an alternate location.
+ upwardPixelCount = 2;
+ }
+
+ for ( ; upwardPixelCount <= totalReplacementCount; upwardPixelCount++)
+ {
+ ASSERT(totalReplacementCount >= upwardPixelCount);
+
+ unsigned short compressedPixel = ShortDelta( getPixel(curRowPtr, curPixel-replacementCount),
+ getPixel(seedRowPtr, curPixel-replacementCount));
+ if (compressedPixel)
+ {
+ *compressedDataPtr++ = compressedPixel >> 8;
+ *compressedDataPtr++ = (unsigned char)compressedPixel;
+
+ }
+ else
+ {
+ uint32_t uncompressedPixel = getPixel(curRowPtr, curPixel-replacementCount);
+
+ uncompressedPixel >>= 1; // Lose the lsb of blue and zero out the msb of the 3 bytes.
+
+ *compressedDataPtr++ = (BYTE)(uncompressedPixel >> 16);
+ *compressedDataPtr++ = (BYTE)(uncompressedPixel >> 8);
+ *compressedDataPtr++ = (BYTE)(uncompressedPixel);
+
+ }
+
+ if (((upwardPixelCount-8) % 255) == 0) // See if it's time to spill a single VLI byte.
+ {
+ *compressedDataPtr++ = MIN(255, totalReplacementCount - upwardPixelCount);
+ }
+
+ replacementCount--;
+ }
+ }
+ else // RLE
+ {
+ ASSERT(eRLE == CMDByte);
+ ASSERT(replacementCount >= 2);
+
+ replacementCount -= 2; // normalize it
+
+ CMDByte |= pixelSource; // Could put this directly into CMDByte above.
+ CMDByte |= MIN(3, seedRowPixelCopyCount) << 3;
+ CMDByte |= MIN(7, replacementCount);
+
+ *compressedDataPtr++ = CMDByte;
+
+ if (seedRowPixelCopyCount >= 3)
+ {
+ outputVLIBytesConsecutively(seedRowPixelCopyCount - 3, compressedDataPtr);
+ }
+
+ replacementCount += 2; // denormalize it
+
+ if (eeNewPixel == pixelSource)
+ {
+ unsigned short compressedPixel = ShortDelta(getPixel(curRowPtr, curPixel - replacementCount),
+ getPixel(seedRowPtr, curPixel - replacementCount));
+ if (compressedPixel)
+ {
+ *compressedDataPtr++ = compressedPixel >> 8;
+ *compressedDataPtr++ = (unsigned char)compressedPixel;
+ }
+ else
+ {
+ uint32_t uncompressedPixel = getPixel(curRowPtr, curPixel - replacementCount);
+
+ uncompressedPixel >>= 1;
+
+ *compressedDataPtr++ = (BYTE)(uncompressedPixel >> 16);
+ *compressedDataPtr++ = (BYTE)(uncompressedPixel >> 8);
+ *compressedDataPtr++ = (BYTE)(uncompressedPixel);
+ }
+ }
+
+ if (replacementCount-2 >= 7) outputVLIBytesConsecutively(replacementCount - (7+2), compressedDataPtr);
+ }
+ } while (curPixel <= lastPixel);
+
+mode10rtn:
+ size = compressedDataPtr - compressedDataStart; // return # of compressed bytes.
+ compressedsize = size;
+ memcpy(SeedRow, input->rasterdata[myplane], originalsize);
+ seeded = TRUE;
+ iRastersReady = 1;
+ return TRUE;
+} //Process
+
+BYTE* Mode10::NextOutputRaster(COLORTYPE color)
+// since we return 1-for-1, just return result first call
+{
+ if (iRastersReady==0)
+ return (BYTE*)NULL;
+
+ if (color == COLORTYPE_BLACK)
+ {
+ return raster.rasterdata[color];
+ }
+ else
+ {
+ iRastersReady=0;
+ if (raster.rasterdata[color] != NULL)
+ {
+ return compressBuf;
+ }
+ else
+ {
+ return raster.rasterdata[color];
+ }
+ }
+}
+
+BYTE DJ9xxVIP::PhotoTrayStatus
+(
+ BOOL bQueryPrinter
+)
+{
+ DRIVER_ERROR err;
+ char* pStr;
+
+ BYTE bDevIDBuff[DevIDBuffSize];
+
+ if (!IOMode.bDevID)
+ {
+ bQueryPrinter = FALSE;
+ }
+
+ err = pSS->GetDeviceID(bDevIDBuff, DevIDBuffSize, bQueryPrinter);
+ if (err!=NO_ERROR)
+ {
+ return 0;
+ }
+
+ if ( (pStr=(char *)strstr((const char*)bDevIDBuff+2,";S:")) == NULL )
+ {
+ return 0;
+ }
+
+ // skip over ";S:<version=2bytes><topcover><inklid><duplexer>"
+ pStr += 8;
+ BYTE b = *pStr;
+ return b;
+} //PhotoTrayStatus
+
+
+BOOL DJ9xxVIP::PhotoTrayPresent
+(
+ BOOL bQueryPrinter
+)
+{
+ // for phototray present == 8
+ return ((PhotoTrayStatus(bQueryPrinter) & 8) == 8);
+} //PhotoTrayInstalled
+
+
+PHOTOTRAY_STATE DJ9xxVIP::PhotoTrayEngaged
+(
+ BOOL bQueryPrinter
+)
+{
+
+/*
+ * When you add any new printer models to this class, make sure that the printer
+ * has the phototray sensor and reports the phototray state correctly.
+ */
+ // for phototray present and engaged == 9
+ return ((PHOTOTRAY_STATE) ((PhotoTrayStatus(bQueryPrinter) & 9) == 9));
+} //PhotoTrayEngaged
+
+
+PAPER_SIZE DJ9xxVIP::MandatoryPaperSize()
+{
+ if (PhotoTrayEngaged (TRUE))
+ return PHOTO_SIZE;
+ else return UNSUPPORTED_SIZE; // code for "nothing mandatory"
+} //MandatoryPaperSize
+
+
+DRIVER_ERROR DJ9xxVIP::CheckInkLevel()
+{
+ DRIVER_ERROR err;
+ char *pStr;
+ int i;
+
+// BYTE bDevIDBuff[DevIDBuffSize];
+
+ if (!IOMode.bDevID)
+ {
+ return NO_ERROR;
+ }
+
+#if 0
+/*
+ * Check for unknown device id version.
+ */
+
+ if ((pSS->GetVIPVersion ()) > 5)
+ {
+ return NO_ERROR;
+ }
+
+ err = pSS->GetDeviceID(bDevIDBuff, DevIDBuffSize, TRUE);
+ if (err!=NO_ERROR)
+ {
+ return err;
+ }
+
+ if ( (pStr=(char *)strstr((const char*)bDevIDBuff+2,";S:")) == NULL )
+ {
+ return NO_ERROR;
+ }
+#endif
+
+ // Skip to pen-count field
+
+ err = SetPenInfo (pStr, FALSE);
+ if (err != NO_ERROR)
+ {
+ return NO_ERROR;
+ }
+
+ /*
+ * VIPVersion = DevID Version + 1 - DevID Version no is 2 bytes following ;S:
+ * Version 00 and 01 report 12 bytes for status info
+ * Version 02 and onwards, report two additional bytes before pen info
+ */
+
+ if (pSS->GetVIPVersion () == 1)
+ {
+
+// DJ990 style DeviceID
+
+ // Next 3 should be 2C1
+ // meaning 2 pens, first field is head/supply for K
+
+// pStr += 19;
+ BYTE b1,b2,b3;
+ b1=*pStr++; b2=*pStr++; b3=*pStr++;
+ if ( (b1 != '2') || (b2 != 'C') || (b3 != '1'))
+ {
+ return NO_ERROR;
+ }
+
+ // black pen
+ pStr++; // skip pen identifier
+ BYTE blackink = *pStr - 48; // convert from ascii
+ // only look at low 3 bits
+ blackink = blackink & 7;
+
+ // skip into color field
+ pStr += 8;
+ BYTE colorink = *pStr - 48;
+ // only look at low 3 bits
+ colorink = colorink & 7;
+
+ if ((blackink<5) && (colorink<5))
+ {
+ return NO_ERROR;
+ }
+
+ if ((blackink>4) && (colorink>4))
+ {
+ return WARN_LOW_INK_BOTH_PENS;
+ }
+ if (blackink>4)
+ {
+ return WARN_LOW_INK_BLACK;
+ }
+ else
+ {
+ return WARN_LOW_INK_COLOR;
+ }
+ }
+
+#if 0
+ pStr += 21;
+ if (pSS->GetVIPVersion () > 4)
+ {
+ pStr += 4;
+ }
+#endif
+
+ int numPens = 0;
+ if (*pStr > '0' && *pStr < '9')
+ {
+ numPens = *pStr - '0';
+ }
+ else if (*pStr > 'A' && *pStr < 'F')
+ {
+ numPens = *pStr - 'A';
+ }
+ else if (*pStr > 'a' && *pStr < 'f')
+ {
+ numPens = *pStr - 'a';
+ }
+
+ pStr++;
+
+ err = NO_ERROR;
+ if (pSS->GetVIPVersion () == 3)
+ {
+ for (i = 0; i < numPens; i++, pStr += 4)
+ {
+ switch (*pStr)
+ {
+ case '5':
+ {
+ if ((*(pStr+1) & 0xf3) > 1)
+ {
+ if (err != NO_ERROR)
+ {
+ err = WARN_LOW_INK_MULTIPLE_PENS;
+ }
+ else
+ {
+ err = WARN_LOW_INK_BLACK;
+ }
+ }
+ break;
+ }
+ case '6':
+ {
+ if ((*(pStr+1) & 0xf3) > 1)
+ {
+ if (err != NO_ERROR)
+ {
+ err = WARN_LOW_INK_MULTIPLE_PENS;
+ }
+ else
+ {
+ err = WARN_LOW_INK_CYAN;
+ }
+ }
+ break;
+ }
+ case '7':
+ {
+ if ((*(pStr+1) & 0xf3) > 1)
+ {
+ if (err != NO_ERROR)
+ {
+ err = WARN_LOW_INK_MULTIPLE_PENS;
+ }
+ else
+ {
+ err = WARN_LOW_INK_MAGENTA;
+ }
+ }
+
+ break;
+ }
+ case '8':
+ {
+ if ((*(pStr+1) & 0xf3) > 1)
+ {
+ if (err != NO_ERROR)
+ {
+ err = WARN_LOW_INK_MULTIPLE_PENS;
+ }
+ else
+ {
+ err = WARN_LOW_INK_YELLOW;
+ }
+ }
+ break;
+ }
+ }
+ }
+ return err;
+ }
+
+ BYTE penInfoBits[4];
+ BYTE blackink = 0;
+ BYTE colorink = 0;
+ BYTE photoink = 0;
+ BYTE greyink = 0;
+
+ for (i = 0; i < numPens; i++, pStr += 8)
+ {
+ AsciiHexToBinary (penInfoBits, pStr, 8);
+
+ if ((penInfoBits[0] & 0x40) != 0x40) // if Bit 31 is 1, this is not a pen
+ {
+ continue;
+ }
+ int penColor = penInfoBits[0] & 0x3F;
+ switch (penColor)
+ {
+ case 1:
+ blackink = penInfoBits[1] & 0x7;
+ break;
+ case 2:
+ colorink = penInfoBits[1] & 0x7;
+ break;
+ case 3:
+ photoink = penInfoBits[1] & 0x7;
+ break;
+ case 10:
+ greyink = penInfoBits[1] & 0x7;
+ break;
+ case 4:
+ case 5:
+ case 6:
+ case 7:
+ case 8:
+ case 9:
+ colorink = penInfoBits[1] & 0x7; // REVISIT: these are C, M, Y respectively
+ break;
+ default:
+ break;
+ }
+ }
+ if (blackink < 2 && colorink < 2 && photoink < 2 && greyink < 2)
+ {
+ return NO_ERROR;
+ }
+ else if (blackink > 1 && colorink > 1 && photoink > 1)
+ {
+ return WARN_LOW_INK_COLOR_BLACK_PHOTO;
+ }
+ else if (greyink > 1 && colorink > 1 && photoink > 1)
+ {
+ return WARN_LOW_INK_COLOR_GREY_PHOTO;
+ }
+ else if (blackink > 1 && colorink > 1)
+ {
+ return WARN_LOW_INK_BOTH_PENS;
+ }
+ else if (blackink > 1 && photoink > 1)
+ {
+ return WARN_LOW_INK_BLACK_PHOTO;
+ }
+ else if (greyink > 1 && colorink > 1)
+ {
+ return WARN_LOW_INK_COLOR_GREY;
+ }
+ else if (greyink > 1 && photoink > 1)
+ {
+ return WARN_LOW_INK_GREY_PHOTO;
+ }
+ else if (colorink > 1 && photoink > 1)
+ {
+ return WARN_LOW_INK_COLOR_PHOTO;
+ }
+ else if (blackink > 1)
+ {
+ return WARN_LOW_INK_BLACK;
+ }
+ else if (colorink > 1)
+ {
+ return WARN_LOW_INK_COLOR;
+ }
+ else if (photoink > 1)
+ {
+ return WARN_LOW_INK_PHOTO;
+ }
+ else if (greyink > 1)
+ {
+ return WARN_LOW_INK_GREY;
+ }
+ else if (colorink > 1)
+ {
+ return WARN_LOW_INK_COLOR;
+ }
+ else
+ {
+ return NO_ERROR;
+ }
+} //CheckInkLevel
+
+APDK_END_NAMESPACE
+
+#endif //APDK_DJ9xxVIP
diff --git a/prnt/hpijs/dj9xxvip.h b/prnt/hpijs/dj9xxvip.h
new file mode 100644
index 0000000..07563fc
--- /dev/null
+++ b/prnt/hpijs/dj9xxvip.h
@@ -0,0 +1,417 @@
+/*****************************************************************************\
+ dj9xxvip.h : Interface for the DJ9xxVIP class
+
+ Copyright (c) 1996 - 2002, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#ifndef APDK_DJ9XXVIP_H
+#define APDK_DJ9XXVIP_H
+
+APDK_BEGIN_NAMESPACE
+
+//extern char *ModelString[MAX_ID_STRING];
+
+/*!
+\internal
+*/
+class DJ9xxVIP : public Printer
+{
+public:
+ DJ9xxVIP(SystemServices* pSS, BOOL proto=FALSE);
+
+ Header* SelectHeader(PrintContext* pc);
+ DRIVER_ERROR VerifyPenInfo();
+ DRIVER_ERROR ParsePenInfo(PEN_TYPE& ePen, BOOL QueryPrinter=TRUE);
+ DISPLAY_STATUS ParseError(BYTE status_reg);
+
+ Compressor* CreateCompressor(unsigned int RasterSize);
+
+ virtual BOOL UseGUIMode(PrintMode* pPrintMode);
+ BOOL UseCMYK(unsigned int iPrintMode) { return FALSE; }
+
+ DRIVER_ERROR CleanPen();
+
+ virtual PAPER_SIZE MandatoryPaperSize();
+
+ virtual DRIVER_ERROR CheckInkLevel();
+
+ virtual BOOL PhotoTrayPresent(BOOL bQueryPrinter);
+
+ virtual PHOTOTRAY_STATE PhotoTrayEngaged (BOOL bQueryPrinter);
+
+ inline virtual BOOL SupportSeparateBlack (PrintMode *pCurrentMode)
+ {
+ if (pCurrentMode->medium == mediaAuto ||
+ pCurrentMode->medium == mediaPlain)
+ {
+ return TRUE;
+ }
+ return FALSE;
+ }
+
+ virtual DRIVER_ERROR SetHint (PRINTER_HINT eHint, int iValue)
+ {
+ switch (eHint)
+ {
+ case PAGES_IN_DOC_HINT:
+ {
+ m_iNumPages = iValue;
+ break;
+ }
+ case SPEED_MECH_HINT:
+ {
+ return SendSpeedMechCmd (iValue);
+ }
+ case EXTRA_DRYTIME_HINT:
+ {
+ m_cExtraDryTime = (BYTE) (iValue & 0xFF);
+ break;
+ }
+ case LEFT_OVERSPRAY_HINT:
+ {
+ m_iLeftOverspray = iValue;
+ break;
+ }
+ case RIGHT_OVERSPRAY_HINT:
+ {
+ m_iRightOverspray = iValue;
+ break;
+ }
+ case TOP_OVERSPRAY_HINT:
+ {
+ m_iTopOverspray = iValue;
+ break;
+ }
+ case BOTTOM_OVERSPRAY_HINT:
+ {
+ m_iBottomOverspray = iValue;
+ break;
+ }
+
+ default:
+ break;
+ }
+ return NO_ERROR;
+ }
+ virtual int GetHint (PRINTER_HINT eHint)
+ {
+ if (eHint == EXTRA_DRYTIME_HINT)
+ {
+ return (int) m_cExtraDryTime;
+ }
+ return 0;
+ }
+
+ virtual DRIVER_ERROR AddPJLHeader ();
+protected:
+
+#ifdef APDK_HP_UX
+ virtual DJ9xxVIP & operator = (Printer& rhs)
+ {
+ return *this;
+ }
+#endif
+
+ BOOL PCL3acceptsDriverware;
+ virtual BYTE PhotoTrayStatus(BOOL bQueryPrinter);
+ int iNumMissingPens;
+ int m_iLeftOverspray;
+ int m_iTopOverspray;
+ int m_iRightOverspray;
+ int m_iBottomOverspray;
+
+private:
+ BOOL IsPCL3DriverwareAvailable();
+ virtual DRIVER_ERROR SendSpeedMechCmd (BOOL bLastPage)
+ {
+ return NO_ERROR;
+ }
+ BYTE m_cExtraDryTime;
+}; //DJ9xxVIP
+
+
+class DJ990Mode : public PrintMode
+{
+public:
+ DJ990Mode();
+}; //AladdenMode
+
+
+class GrayModeDJ990 : public GrayMode
+{
+public:
+ GrayModeDJ990 (uint32_t *map, BOOL PCL3OK);
+}; //GrayModeDJ990
+
+class DJ990CMYGrayMode : public PrintMode
+{
+public:
+ DJ990CMYGrayMode ();
+}; //DJ990CMYGrayMode
+
+#ifdef APDK_EXTENDED_MEDIASIZE
+class DJ990KGrayMode : public PrintMode
+{
+public:
+ DJ990KGrayMode ();
+}; //DJ990KGrayMode
+
+class DJ9902400Mode : public PrintMode
+{
+public:
+ DJ9902400Mode ();
+ virtual inline BOOL MediaCompatible (MEDIATYPE eMedia)
+ {
+ return (eMedia == pmMediaType || eMedia == MEDIA_PHOTO);
+ }
+}; // DJ9902400Mode
+
+class DJ990DraftMode : public PrintMode
+{
+public:
+ DJ990DraftMode ();
+}; // DJ990DraftMode
+
+#endif // APDK_EXTENDED_MEDIASIZE
+
+class DJ990BestMode : public PrintMode
+{
+public:
+ DJ990BestMode ();
+}; // DJ990BestMode
+
+class DJ990PhotoNormalMode : public PrintMode
+{
+public:
+ DJ990PhotoNormalMode ();
+}; // DJ990 PhotoNormalMode
+
+#ifdef APDK_HIGH_RES_MODES
+ const int VIP_BASE_RES = 600;
+#else
+ const int VIP_BASE_RES = 300;
+#endif
+
+/////////////////////////////
+#define kWhite 0x00FFFFFE
+#define GetRed(x) (((x >> 16) & 0x0FF))
+#define GetGreen(x) (((x >> 8) & 0x0FF))
+#define GetBlue(x) ((x & 0x0FF))
+
+#define kBertDecompressPixelSize 3
+
+// Follows are all the masks for the command byte.
+#define kTypeMask 0x80
+#define kTypeShiftAmount 7
+
+#define kCacheLiteralBitsMask 0x60
+#define kCacheLiteralBitsShiftAmount 5
+
+#define kCacheBitsMask 0x60
+#define kCacheBitsShiftAmount 5
+
+#define kRoffMask 0x18
+#define kRoffShiftAmount 3
+
+#define kReplace_countMask 0x07
+
+// Now have the compiler check to make sure none of the masks overlap/underlap bits accidently.
+#if ((kTypeMask | kCacheLiteralBitsMask | kRoffMask | kReplace_countMask) != 255)
+#error "Your mask bits are messed up!"
+#endif
+
+#if ((kTypeMask | kCacheBitsMask | kRoffMask | kReplace_countMask) != 255)
+#error "Your mask bits are messed up!"
+#endif
+
+
+enum
+{
+ eLiteral = 0,
+ eRLE = 0x80
+};
+
+enum
+{
+ eeNewPixel = 0x0,
+ eeWPixel = 0x20,
+ eeNEPixel = 0x40,
+ eeCachedColor = 0x60
+};
+
+enum
+{
+ eNewColor = 0x0,
+ eWestColor = 0x1,
+ eNorthEastColor = 0x2,
+ eCachedColor = 0x3
+};
+
+
+// Literal
+#define M10_MAX_OFFSET0 2 /* Largest unscaled value an offset can have before extra byte is needed. */
+#define M10_MAX_COUNT0 6 /* Largest unscaled and unbiased value a count can have before extra byte is needed */
+#define M10_COUNT_START0 1 /* What a count of zero has a value of. */
+
+// RLE
+#define M10_MAX_OFFSET1 2
+#define M10_MAX_COUNT1 6
+#define M10_COUNT_START1 2
+
+#ifndef MIN
+#define MIN(a,b) (((a)>=(b))?(b):(a))
+#endif
+#ifndef MAX
+#define MAX(a,b) (((a)<=(b))?(b):(a))
+#endif
+
+/*
+We don't actually support 4-byte RGB for anything excpet VIP printers.
+So implimenting this and documenting it as a build option is misleading.
+We must make halftoning support 4-byte RGB before we can publish this.
+If we hear from someone that they need support for 4-byte RGB (and it's
+worth it) then we will add it to halftoning, put the define in config.h,
+and uncomment the #if here. 1/17/2002 - JLM
+
+#if defined(APDK_4BYTE_RGB)
+ #define getPixel get4Pixel
+ #define putPixel put4Pixel
+ const unsigned int BYTES_PER_PIXEL = 4;
+#else
+*/
+ #define getPixel get3Pixel
+ #define putPixel put3Pixel
+ const unsigned int BYTES_PER_PIXEL = 3;
+//#endif
+
+
+/*!
+\internal
+*/
+class Mode10 : public Compressor
+{
+public:
+ Mode10(SystemServices* pSys, Printer* pPrinter, unsigned int RasterSize);
+ virtual ~Mode10();
+ BOOL Process(RASTERDATA* input);
+ BYTE* NextOutputRaster(COLORTYPE color);
+ void Flush();
+
+private:
+ Printer* thePrinter;
+
+ inline uint32_t get4Pixel(unsigned char *pixAddress, unsigned int bPrint = FALSE)
+ {
+ #ifdef APDK_LITTLE_ENDIAN
+ return (((unsigned int*)pixAddress)[0]) & kWhite;
+ #else
+ return (((unsigned int*)pixAddress)[0]) & 0xFFFFFF00;
+ #endif
+ }
+
+
+ inline uint32_t get4Pixel(unsigned char *pixAddress, int pixelOffset)
+ {
+ #ifdef APDK_LITTLE_ENDIAN
+ return ((unsigned int*)pixAddress)[pixelOffset] & kWhite;
+ #else
+ return ((unsigned int*)pixAddress)[pixelOffset] & 0xFFFFFF00;
+ #endif
+ }
+
+
+ inline void put4Pixel(unsigned char *pixAddress, int pixelOffset, uint32_t pixel)
+ {
+ #ifdef APDK_LITTLE_ENDIAN
+ (((unsigned int*)pixAddress)[pixelOffset] = pixel & kWhite);
+ #else
+ (((unsigned int*)pixAddress)[pixelOffset] = pixel & 0xFFFFFF00);
+ #endif
+ }
+
+
+ inline void outputVLIBytesConsecutively(int number, unsigned char *&compressedDataPtr)
+ {
+ do
+ {
+ *compressedDataPtr++ = MIN(number, 255);
+ if (255 == number)
+ {
+ *compressedDataPtr++ = 0;
+ }
+ number -= MIN(number,255);
+ } while (number);
+ }
+
+
+ void put3Pixel(BYTE* pixAddress, int pixelOffset, uint32_t pixel);
+ inline uint32_t get3Pixel(BYTE* pixAddress, int pixelOffset);
+ unsigned short ShortDelta(uint32_t lastPixel, uint32_t lastUpperPixel);
+
+
+}; //Mode10
+
+#ifdef APDK_DJ9xxVIP
+//! DJ9xxVIPProxy
+/*!
+******************************************************************************/
+class DJ9xxVIPProxy : public PrinterProxy
+{
+public:
+ DJ9xxVIPProxy() : PrinterProxy(
+ "DJ9xxVIP", // family name
+ "DESKJET 96\0" // DeskJet 96x series
+ "DESKJET 98\0" // DeskJet 98x series
+ "DESKJET 99\0" // DeskJet 99x series
+ "deskjet 6122\0" // deskjet 6122
+ "deskjet 6127\0" // deskjet 6127
+ "PHOTOSMART 1115\0"
+ "PHOTOSMART 1215\0" // PSP 1215
+ "PHOTOSMART 1218\0" // PSP 1218
+ "PHOTOSMART 1115\0" // PSP 1115
+ "PHOTOSMART 1315\0" // PSP 1315
+ "HP BUSINESS INKJET 22\0" // 2200, 2230, 2250, 2280
+ "cp1160\0" // CP 1160
+ "HP Color Inkjet CP1700\0" // CP 1700
+ "HP BUSINESS INKJET 22\0"
+ "dj450\0"
+ "deskjet 450\0"
+#ifdef APDK_MLC_PRINTER
+ "officejet d\0" // officejet d series
+ "officejet 7100\0" // offjetjet 7100 series
+#endif
+ ) {m_iPrinterType = eDJ9xxVIP;}
+ inline Printer* CreatePrinter(SystemServices* pSS) const { return new DJ9xxVIP(pSS); }
+ inline PRINTER_TYPE GetPrinterType() const { return eDJ9xxVIP;}
+ inline unsigned int GetModelBit() const { return 0x10000;}
+};
+#endif
+
+APDK_END_NAMESPACE
+
+#endif //APDK_DJ9XXVIP_H
diff --git a/prnt/hpijs/djd2600.h b/prnt/hpijs/djd2600.h
new file mode 100644
index 0000000..e108daf
--- /dev/null
+++ b/prnt/hpijs/djd2600.h
@@ -0,0 +1,75 @@
+/*****************************************************************************\
+ djd2600.h : Interface for the DJ D2600 printer class
+
+ Copyright (c) 2003 - 2009, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#ifndef APDK_DJD2600_H
+#define APDK_DJD2600_H
+#if defined(APDK_DJ3600) && defined (APDK_DJ3320)
+
+APDK_BEGIN_NAMESPACE
+//DJ2600
+//!
+/*!
+\internal
+******************************************************************************/
+class DJD2600 : public DJ4100
+{
+public:
+ DJD2600 (SystemServices* pSS, BOOL proto = FALSE) : DJ4100 (pSS, proto)
+ {
+ m_iBlackPenResolution = 600;
+ m_iNumBlackNozzles = 336;
+ }
+}; //DJD2600
+
+
+#if defined(APDK_DJ3600) && defined (APDK_DJ3320)
+//! DJ4100Proxy
+/*!
+******************************************************************************/
+class DJD2600Proxy : public PrinterProxy
+{
+public:
+ DJD2600Proxy() : PrinterProxy(
+ "DJD2600", // family name
+ "Deskjet D26\0" // DeskJet D2600
+ "Deskjet D16\0"
+ ) {m_iPrinterType = eDJD2600;}
+ inline Printer* CreatePrinter(SystemServices* pSS) const { return new DJD2600(pSS); }
+ inline PRINTER_TYPE GetPrinterType() const { return eDJD2600;}
+ inline unsigned int GetModelBit() const { return 0x2;}
+};
+#endif
+
+APDK_END_NAMESPACE
+
+#endif // defined(APDK_DJ3600) && defined (APDK_DJ3320)
+
+#endif // APDK_DJD2600_H
diff --git a/prnt/hpijs/djgenericvip.cpp b/prnt/hpijs/djgenericvip.cpp
new file mode 100644
index 0000000..e461e34
--- /dev/null
+++ b/prnt/hpijs/djgenericvip.cpp
@@ -0,0 +1,813 @@
+/*****************************************************************************\
+ djgenericvip.cpp : Implimentation for the generic VIP class
+
+ Copyright (c) 2001-2006, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#if defined(APDK_DJGENERICVIP) && defined (APDK_DJ9xxVIP)
+
+#include "header.h"
+#include "dj9xxvip.h"
+#include "djgenericvip.h"
+#include "printerproxy.h"
+
+APDK_BEGIN_NAMESPACE
+
+extern uint32_t ulMapDJ600_CCM_K[ 9 * 9 * 9 ];
+
+/*
+ * All VIP printers that are released after the APDK release.
+ * This subclass is mainly there to allow any combination of
+ * installed pens.
+ */
+
+DJGenericVIP::DJGenericVIP (SystemServices* pSS, BOOL proto)
+ : DJ9xxVIP (pSS, proto)
+{
+
+ if (!proto && IOMode.bDevID)
+ {
+ bCheckForCancelButton = TRUE;
+ constructor_error = VerifyPenInfo ();
+ if (constructor_error != NO_ERROR)
+ {
+ constructor_error = NO_ERROR;
+ ePen = BOTH_PENS;
+ }
+ }
+ else
+ ePen = BOTH_PENS;
+
+/*
+ * For this printer class, allow any print mode to be compatible with
+ * any installed pen set. Printer is expected to do the right thing.
+ * Also, language has to be PCL3GUI because some printers may not work
+ * properly in plain PCL3 mode. ex. PhotoSmart 1xx family. This means
+ * no device text support.
+ */
+
+ pMode[ModeCount++] = new VIPFastDraftMode (); // Fast Draft
+ pMode[ModeCount++] = new VIPGrayFastDraftMode (); // Grayscale Fast Draft
+ pMode[ModeCount++] = new VIPAutoPQMode (); // Printer selects PrintMode
+ pMode[ModeCount++] = new VIPFastPhotoMode (); // Fast Photo
+ pMode[ModeCount++] = new VIPCDDVDMode (); // CD/DVD PrintMode
+
+#ifdef APDK_EXTENDED_MEDIASIZE
+ pMode[ModeCount++] = new VIPBrochureNormalMode (); // Normal, Brochure media
+ pMode[ModeCount++] = new VIPPremiumNormalMode (); // Normal, Premium paper
+ pMode[ModeCount++] = new VIPPlainBestMode (); // Best, Plain media
+ pMode[ModeCount++] = new VIPBrochureBestMode (); // Best, Brochure media
+ pMode[ModeCount++] = new VIPPremiumBestMode (); // Best, Premium media
+#endif
+
+ for (int i = 0; i < (int) ModeCount; i++)
+ {
+ pMode[i]->bFontCapable = FALSE;
+ for (int j = BLACK_PEN; j < MAX_COMPATIBLE_PENS; j++)
+ {
+ pMode[i]->CompatiblePens[j] = (PEN_TYPE) j;
+ }
+ }
+#ifdef APDK_EXTENDED_MEDIASIZE
+/*
+ * Set quality to marvellous for high res (1200 dpi) mode.
+ * This mode was not available in the older printers, which only supported the
+ * media_high_res paper type, but used qualityPresentation for 1200 dpi mode.
+ */
+ pMode[4]->theQuality = qualityMarvellous;
+#endif
+}
+
+VIPFastDraftMode::VIPFastDraftMode () : PrintMode (NULL)
+{
+ bFontCapable = FALSE;
+#ifdef APDK_AUTODUPLEX
+ bDuplexCapable = TRUE;
+#endif
+#if defined(APDK_VIP_COLORFILTERING)
+ Config.bErnie = TRUE;
+#endif
+
+ Config.bColorImage = FALSE;
+
+ medium = mediaPlain;
+ theQuality = qualityFastDraft;
+ pmQuality = QUALITY_FASTDRAFT;
+ pmMediaType = MEDIA_PLAIN;
+} // VIPFastDraftMode
+
+VIPGrayFastDraftMode::VIPGrayFastDraftMode () : GrayMode (ulMapDJ600_CCM_K)
+{
+ bFontCapable = FALSE;
+
+#if defined(APDK_VIP_COLORFILTERING)
+ Config.bErnie = TRUE;
+#endif
+
+ Config.bColorImage = FALSE;
+
+#ifdef APDK_AUTODUPLEX
+ bDuplexCapable = TRUE;
+#endif
+
+ dyeCount = 1;
+ medium = mediaPlain;
+ theQuality = qualityFastDraft;
+ pmQuality = QUALITY_FASTDRAFT;
+ pmMediaType = MEDIA_PLAIN;
+ pmColor = GREY_K;
+}
+
+VIPFastPhotoMode::VIPFastPhotoMode () : PrintMode (NULL)
+{
+ bFontCapable = FALSE;
+#if defined(APDK_VIP_COLORFILTERING)
+ Config.bErnie = FALSE;
+#endif
+ medium = mediaHighresPhoto;
+ theQuality = qualityFastDraft;
+ pmQuality = QUALITY_FASTDRAFT;
+ pmMediaType = MEDIA_PHOTO;
+} // VIPFastPhotoMode
+
+VIPAutoPQMode::VIPAutoPQMode () : PrintMode (NULL)
+{
+ BaseResX =
+ BaseResY = 600;
+ ResolutionX[0] = 600;
+ ResolutionY[0] = 600;
+ bFontCapable = FALSE;
+#ifdef APDK_AUTODUPLEX
+ bDuplexCapable = FALSE;
+#endif
+#if defined(APDK_VIP_COLORFILTERING)
+ Config.bErnie = TRUE;
+#endif
+
+ Config.bColorImage = FALSE;
+
+ medium = mediaAuto;
+ theQuality = qualityAuto;
+ pmQuality = QUALITY_AUTO;
+} // VIPAutoPQMode
+
+VIPCDDVDMode::VIPCDDVDMode () : PrintMode (NULL)
+{
+ BaseResX =
+ BaseResY = 600;
+ ResolutionX[0] = 600;
+ ResolutionY[0] = 600;
+ bFontCapable = FALSE;
+#ifdef APDK_AUTODUPLEX
+ bDuplexCapable = FALSE;
+#endif
+#if defined(APDK_VIP_COLORFILTERING)
+ Config.bErnie = TRUE;
+#endif
+
+ Config.bColorImage = FALSE;
+
+ medium = mediaCDDVD;
+ theQuality = qualityPresentation;
+ pmQuality = QUALITY_BEST;
+ pmMediaType = MEDIA_CDDVD;
+}
+
+VIPBrochureNormalMode::VIPBrochureNormalMode () : PrintMode (NULL)
+{
+ BaseResX =
+ BaseResY = 600;
+ ResolutionX[0] = 600;
+ ResolutionY[0] = 600;
+ bFontCapable = FALSE;
+#ifdef APDK_AUTODUPLEX
+ bDuplexCapable = TRUE;
+#endif
+#if defined(APDK_VIP_COLORFILTERING)
+ Config.bErnie = TRUE;
+#endif
+
+ Config.bColorImage = FALSE;
+
+ medium = mediaBrochure;
+ theQuality = qualityNormal;
+ pmQuality = QUALITY_NORMAL;
+ pmMediaType = MEDIA_BROCHURE;
+} // Added by Lizzie
+
+VIPPremiumNormalMode::VIPPremiumNormalMode () : PrintMode (NULL)
+{
+ BaseResX =
+ BaseResY = 600;
+ ResolutionX[0] = 600;
+ ResolutionY[0] = 600;
+ bFontCapable = FALSE;
+#ifdef APDK_AUTODUPLEX
+ bDuplexCapable = TRUE;
+#endif
+#if defined(APDK_VIP_COLORFILTERING)
+ Config.bErnie = TRUE;
+#endif
+
+ Config.bColorImage = FALSE;
+
+ medium = mediaSpecial;
+ theQuality = qualityNormal;
+ pmQuality = QUALITY_NORMAL;
+ pmMediaType = MEDIA_PREMIUM;
+} // Added by Lizzie
+
+VIPPlainBestMode::VIPPlainBestMode () : PrintMode (NULL)
+{
+ BaseResX =
+ BaseResY = 600;
+ ResolutionX[0] = 600;
+ ResolutionY[0] = 600;
+ bFontCapable = FALSE;
+#ifdef APDK_AUTODUPLEX
+ bDuplexCapable = TRUE;
+#endif
+#if defined(APDK_VIP_COLORFILTERING)
+ Config.bErnie = TRUE;
+#endif
+
+ Config.bColorImage = FALSE;
+
+ medium = mediaPlain;
+ theQuality = qualityPresentation;
+ pmQuality = QUALITY_BEST;
+ pmMediaType = MEDIA_PLAIN;
+
+} // Added by Lizzie
+
+VIPBrochureBestMode::VIPBrochureBestMode () : PrintMode (NULL)
+{
+ BaseResX =
+ BaseResY = 600;
+ ResolutionX[0] = 600;
+ ResolutionY[0] = 600;
+ bFontCapable = FALSE;
+#ifdef APDK_AUTODUPLEX
+ bDuplexCapable = TRUE;
+#endif
+#if defined(APDK_VIP_COLORFILTERING)
+ Config.bErnie = TRUE;
+#endif
+
+ Config.bColorImage = FALSE;
+
+ medium = mediaBrochure;
+ theQuality = qualityPresentation;
+ pmQuality = QUALITY_BEST;
+ pmMediaType = MEDIA_BROCHURE;
+} // Added by Lizzie
+
+VIPPremiumBestMode::VIPPremiumBestMode () : PrintMode (NULL)
+{
+ BaseResX =
+ BaseResY = 600;
+ ResolutionX[0] = 600;
+ ResolutionY[0] = 600;
+ bFontCapable = FALSE;
+#ifdef APDK_AUTODUPLEX
+ bDuplexCapable = TRUE;
+#endif
+#if defined(APDK_VIP_COLORFILTERING)
+ Config.bErnie = TRUE;
+#endif
+
+ Config.bColorImage = FALSE;
+
+ medium = mediaSpecial;
+ theQuality = qualityPresentation;
+ pmQuality = QUALITY_BEST;
+ pmMediaType = MEDIA_PREMIUM;
+} // Added by Lizzie
+
+BOOL DJGenericVIP::UseGUIMode (PrintMode* pPrintMode)
+{
+ return TRUE;
+}
+
+/*
+ * We don't really know beforehand the largest papersize the attached printer
+ * can support. The first reserved nibble after the VIP flag nibble contains
+ * this information. Only firmware version 4 or greater support this feature.
+ */
+
+PAPER_SIZE DJGenericVIP::MandatoryPaperSize ()
+{
+ BYTE sDevIdStr[DevIDBuffSize];
+ char *pStr;
+
+/*
+ * Try to get the DevID. Advance the pointer to the beginning of the status field.
+ * Currently, only 3 lower bits are used for reporting paper size. Meaning of these
+ * bit-values is as follows:
+ * 000 - Allow any size
+ * 001 - A6
+ * 010 - Letter
+ * 011 - B4
+ * 100 - 13 X 19 size
+ */
+
+ if ((pSS->GetDeviceID (sDevIdStr, DevIDBuffSize, FALSE)) == NO_ERROR)
+ {
+ if ((pStr = strstr ((char *) sDevIdStr, ";S:")) && (pSS->GetVIPVersion ()) >= 3)
+ {
+#ifdef APDK_EXTENDED_MEDIASIZE
+ PAPER_SIZE PaperSizes[8] = {UNSUPPORTED_SIZE, A6, LETTER, B4, SUPERB_SIZE, UNSUPPORTED_SIZE, UNSUPPORTED_SIZE, UNSUPPORTED_SIZE};
+#else
+ PAPER_SIZE PaperSizes[8] = {UNSUPPORTED_SIZE, A6, LETTER, B4, UNSUPPORTED_SIZE, UNSUPPORTED_SIZE, UNSUPPORTED_SIZE, UNSUPPORTED_SIZE};
+#endif
+ char byte12 = pStr[17];
+ short value = (byte12 >= '0' && byte12 <= '9') ? byte12 - '0' :
+ ((byte12 >= 'A' && byte12 <= 'F') ? byte12 - 'A' + 10 :
+ ((byte12 >= 'a' && byte12 <= 'f') ? byte12 - 'a' + 10 : -1));
+ return (value == -1) ? UNSUPPORTED_SIZE : PaperSizes[(value & 0x07)];
+ }
+ }
+ return UNSUPPORTED_SIZE;
+} //MandantoryPaperSize
+
+
+/*
+* byte 13 - indicates full bleed (to every edge of paper) is supported if
+* the modifier bit in the lowest position is "set".
+*
+
+* 0000b or 0h = Unimplemented, or not specified.
+* 0001b or 1h = Full bleed (4 edge) printing supported on photo quality papers; this field is a modifier upon the bits in byte 12. That is, if this bit is set, it implies that the "max print width supported" values and smaller widths, ALL support full bleed, 4 edge, printing on photo quality paper.
+* 0010b or 2h = Full bleed (4 edge) printing supported on non-photo papers (e.g. plain, bond, etc.); this field is a modifier upon the bits in byte 12. If this bit is set, it implies that the "max print width supported" values and smaller widths, all support full bleed, 4 edge, printing on non-photo paper.
+* nn00b = The "nn" bits are reserved for future definitions
+*/
+
+BOOL DJGenericVIP::FullBleedCapable (PAPER_SIZE ps, FullbleedType *fbType, float *xOverSpray, float *yOverSpray,
+ float *fLeftOverSpray, float *fTopOverSpray)
+{
+ BYTE sDevIdStr[DevIDBuffSize];
+ char *pStr;
+ sDevIdStr[0] = 0;
+
+ // if overspray is passed down and set
+ if (this->m_iTopOverspray && this->m_iLeftOverspray && this->m_iRightOverspray && this->m_iBottomOverspray)
+ {
+
+/*
+ * This check is needed because of method override.
+ * Another caller would not pass down this parameter,
+ * and this is default to NULL
+ */
+ if (fTopOverSpray)
+ *fTopOverSpray = (float) this->m_iTopOverspray / (float) 1000.0;
+ if (fLeftOverSpray)
+ *fLeftOverSpray = (float) this->m_iLeftOverspray / (float) 1000.0;
+
+ *xOverSpray = (float) (this->m_iLeftOverspray + this->m_iRightOverspray) / (float) 1000.0;
+ *yOverSpray = (float) (this->m_iTopOverspray + this->m_iBottomOverspray) / (float) 1000.0;
+
+ *fbType = fullbleed4EdgeAllMedia;
+
+ return TRUE;
+ }
+
+ if ((pSS->GetDeviceID (sDevIdStr, DevIDBuffSize, FALSE)) == NO_ERROR)
+ {
+ if ((pStr = strstr ((char *) sDevIdStr, ";S:")) && (pSS->GetVIPVersion ()) >= 3)
+ {
+ char byte13 = pStr[18];
+ short value = (byte13 >= '0' && byte13 <= '9') ? byte13 - '0' :
+ ((byte13 >= 'A' && byte13 <= 'F') ? byte13 - 'A' + 10 :
+ ((byte13 >= 'a' && byte13 <= 'f') ? byte13 - 'a' + 10 : -1));
+ switch (ps)
+ {
+ case PHOTO_SIZE:
+ case A6:
+ case CARD_4x6:
+ case OUFUKU:
+ case HAGAKI:
+ case A6_WITH_TEAR_OFF_TAB:
+ case CUSTOM_SIZE:
+ {
+ *xOverSpray = (float) 0.12;
+ *yOverSpray = (float) 0.06;
+
+ if (fLeftOverSpray)
+ *fLeftOverSpray = (float) 0.05;
+ if (fTopOverSpray)
+ *fTopOverSpray = (float) 0.03;
+
+ if (ps == PHOTO_SIZE || ps == A6_WITH_TEAR_OFF_TAB)
+ *fbType = fullbleed4EdgeAllMedia;
+ else if ((value != -1) && ((value & 0x03) == 0x03))
+ *fbType = fullbleed4EdgeAllMedia;
+ else if ((value != -1) && ((value & 0x01) == 0x01))
+ *fbType = fullbleed4EdgePhotoMedia;
+ else if ((value != -1) && ((value & 0x02) == 0x02))
+ *fbType = fullbleed4EdgeNonPhotoMedia;
+ else
+ *fbType = fullbleed3EdgeAllMedia;
+
+ return TRUE;
+ }
+ default:
+ break;
+ }
+
+ if ((value != -1) && (value & 0x03))
+ {
+ *xOverSpray = (float) 0.216;
+ *yOverSpray = (float) 0.149;
+ if (fLeftOverSpray)
+ *fLeftOverSpray = (float) 0.098;
+ if (fTopOverSpray)
+ *fTopOverSpray = (float) 0.051;
+
+ if ((value & 0x03) == 0x03)
+ *fbType = fullbleed4EdgeAllMedia;
+ else if ((value & 0x01) == 0x01)
+ *fbType = fullbleed4EdgePhotoMedia;
+ else if ((value & 0x02) == 0x02)
+ *fbType = fullbleed4EdgeNonPhotoMedia;
+
+ return TRUE;
+
+ }
+ else
+ {
+ *xOverSpray = (float) 0;
+ *yOverSpray = (float) 0;
+ if (fLeftOverSpray)
+ *fLeftOverSpray = (float) 0;
+ if (fTopOverSpray)
+ *fTopOverSpray = (float) 0;
+ *fbType = fullbleedNotSupported;
+ return FALSE;
+ }
+ }
+ }
+
+ switch (ps)
+ {
+ case PHOTO_SIZE:
+ case A6:
+ case CARD_4x6:
+ case OUFUKU:
+ case HAGAKI:
+ case A6_WITH_TEAR_OFF_TAB:
+ case LETTER:
+ case A4:
+ case CUSTOM_SIZE:
+ {
+ *xOverSpray = (float) 0.12;
+ *yOverSpray = (float) 0.06;
+
+ if (fLeftOverSpray)
+ *fLeftOverSpray = (float) 0.05;
+ if (fTopOverSpray)
+ *fTopOverSpray = (float) 0.03;
+
+ if (ps == PHOTO_SIZE || ps == A6_WITH_TEAR_OFF_TAB)
+ *fbType = fullbleed4EdgeAllMedia;
+ else if (ps==LETTER||ps==A4||ps==CUSTOM_SIZE)
+ {
+ *fbType = fullbleed4EdgeAllMedia;
+ *xOverSpray = (float) 0.1;
+ *yOverSpray = (float) 0.1;
+ if (fLeftOverSpray)
+ *fLeftOverSpray = (float) 0.05;
+ if (fTopOverSpray)
+ *fTopOverSpray = (float) 0.05;
+ }
+ else
+ *fbType = fullbleed3EdgeAllMedia;
+
+ return TRUE;
+ }
+ default:
+ break;
+ }
+
+ *xOverSpray = (float) 0;
+ *yOverSpray = (float) 0;
+ if (fLeftOverSpray)
+ *fLeftOverSpray = (float) 0;
+ if (fTopOverSpray)
+ *fTopOverSpray = (float) 0;
+ *fbType = fullbleedNotSupported;
+ return FALSE;
+}
+
+BOOL DJGenericVIP::GetMargins (PAPER_SIZE ps, float *fMargins)
+{
+ float xo, yo, xl, yt;
+ FullbleedType fbType = fullbleedNotSupported;
+
+ if (ps == CDDVD_120 || ps == CDDVD_80)
+ {
+ fMargins[0] = (float) 0.06;
+ fMargins[1] = (float) 0.06;
+ fMargins[2] = (float) 0.06;
+ fMargins[3] = (float) 0.06;
+ return TRUE;
+ }
+
+ fMargins[0] = (float) 0.125;
+ fMargins[1] = (float) 0.125;
+ fMargins[2] = (float) 0.125;
+ fMargins[3] = (float) 0.5;
+ if ((FullBleedCapable (ps, &fbType, &xo, &yo, &xl, &yt)) &&
+ (fbType == fullbleed4EdgeAllMedia ||
+ fbType == fullbleed4EdgePhotoMedia ||
+ fbType == fullbleed4EdgeNonPhotoMedia))
+ {
+ fMargins[3] = (float) 0.125;
+ }
+
+ if (ps == SUPERB_SIZE)
+ {
+ fMargins[0] = (float) 0.125;
+ fMargins[1] = (float) 0.5;
+ fMargins[2] = (float) 0.125;
+ fMargins[3] = (float) 0.75;
+ }
+
+ return TRUE;
+}
+
+
+PHOTOTRAY_STATE DJGenericVIP::PhotoTrayEngaged (BOOL bQueryPrinter)
+{
+ return UNKNOWN;
+}
+
+//! Returns TRUE if a hagaki feed is present in printer.
+BOOL DJGenericVIP::HagakiFeedPresent(BOOL bQueryPrinter)
+{
+ DRIVER_ERROR err;
+ char* pStr;
+
+ BYTE bDevIDBuff[DevIDBuffSize];
+
+ if (!IOMode.bDevID)
+ {
+ bQueryPrinter = FALSE;
+ }
+
+ err = pSS->GetDeviceID(bDevIDBuff, DevIDBuffSize, bQueryPrinter);
+ if (err!=NO_ERROR)
+ {
+ return 0;
+ }
+
+ if ( (pStr=(char *)strstr((const char*)bDevIDBuff+2,";S:")) == NULL )
+ {
+ return 0;
+ }
+
+ // skip over ";S:<version=2bytes><topcover><inklid><duplexer>"
+ pStr += 8;
+ BYTE b = *pStr;
+ return ((b & 4) == 4);
+}
+
+#ifdef APDK_AUTODUPLEX
+//!Returns TRUE if duplexer and hagaki feed (combined) unit is present in printer.
+BOOL DJGenericVIP::HagakiFeedDuplexerPresent(BOOL bQueryPrinter)
+{
+ DRIVER_ERROR err;
+ char* pStr;
+
+ BYTE bDevIDBuff[DevIDBuffSize];
+
+ if (!IOMode.bDevID)
+ {
+ bQueryPrinter = FALSE;
+ }
+
+ err = pSS->GetDeviceID (bDevIDBuff, DevIDBuffSize, bQueryPrinter);
+ if (err!=NO_ERROR)
+ {
+ return 0;
+ }
+
+ if ( (pStr=(char *)strstr((const char*)bDevIDBuff+2,";S:")) == NULL )
+ {
+ return 0;
+ }
+
+ // skip over ";S:<version=2bytes><topcover><inklid>"
+ pStr += 6;
+ BYTE b = *pStr;
+ return ((b & 4) == 4);
+}
+#endif
+
+
+DRIVER_ERROR DJGenericVIP::VerifyPenInfo ()
+{
+
+ DRIVER_ERROR err = NO_ERROR;
+
+ if (IOMode.bDevID == FALSE)
+ return err;
+
+ ePen = NO_PEN;
+
+ err = ParsePenInfo (ePen);
+
+ if(err == UNSUPPORTED_PEN) // probably Power Off - pens couldn't be read
+ {
+
+ // have to delay or the POWER ON will be ignored
+ if (pSS->BusyWait ((DWORD) 2000) == JOB_CANCELED)
+ {
+ return JOB_CANCELED;
+ }
+
+ DWORD length = sizeof (DJ895_Power_On);
+ err = pSS->ToDevice (DJ895_Power_On, &length);
+ ERRCHECK;
+
+ err = pSS->FlushIO ();
+ ERRCHECK;
+
+ // give the printer some time to power up
+ if (pSS->BusyWait ((DWORD) 2500) == JOB_CANCELED)
+ {
+ return JOB_CANCELED;
+ }
+
+ err = ParsePenInfo (ePen);
+ }
+
+ ERRCHECK;
+
+/*
+ * If one or more pens are not installed, check the device id for ReserveMode
+ * capability for this printer. This info in in the flags nibble
+ * ;S:<XX><toplid><supplylic><duplexer><phototray><in-1><in-2><banner><flags>
+ * flags : x1xx - reserve mode supported, x0xx - not supported
+ */
+
+ BYTE sDevIdStr[DevIDBuffSize];
+ char *pStr;
+ BOOL bNeedAllPens = FALSE;
+
+ if (iNumMissingPens > 0 && ((pSS->GetDeviceID (sDevIdStr, DevIDBuffSize, FALSE)) == NO_ERROR))
+ {
+ if ((pStr = strstr ((char *) sDevIdStr, ";S:")))
+ {
+ char byte7 = pStr[12];
+ short value = (byte7 >= '0' && byte7 <= '9') ? byte7 - '0' :
+ ((byte7 >= 'A' && byte7 <= 'F') ? byte7 - 'A' + 10 :
+ ((byte7 >= 'a' && byte7 <= 'f') ? byte7 - 'a' + 10 : 0));
+ bNeedAllPens = !(value & 0x04);
+ }
+ }
+
+ while (ePen == NO_PEN || (bNeedAllPens && iNumMissingPens > 0))
+ {
+ if (ePen == NO_PEN || iNumMissingPens > 0)
+ {
+ pSS->DisplayPrinterStatus (DISPLAY_NO_PENS);
+
+ if (pSS->BusyWait (500) == JOB_CANCELED)
+ {
+ return JOB_CANCELED;
+ }
+ }
+ err = ParsePenInfo (ePen);
+ ERRCHECK;
+ }
+
+ pSS->DisplayPrinterStatus(DISPLAY_PRINTING);
+
+ return NO_ERROR;
+} //ParasePenInfo
+
+void DJGenericVIP::AdjustModeSettings (BOOL bDoFullBleed, MEDIATYPE ReqMedia,
+ MediaType *medium, Quality *quality)
+{
+
+/*
+ * Malibu platform printers have a defect that prevents these printers from
+ * performing full-bleed and media detect functions correctly. Check for this
+ * case, i.e., full-bleed and media detect flags and explicitly set the
+ * media type and quality as requested by the application.
+ */
+
+ if (bDoFullBleed && *medium == mediaAuto)
+ {
+
+ if (ReqMedia == MEDIA_PHOTO)
+ {
+ *medium = mediaGlossy;
+ *quality = qualityPresentation;
+
+ }
+ else
+ {
+ *medium = mediaPlain;
+ *quality = qualityNormal;
+
+ }
+
+ }
+ // Added by Lizzie - plain and premium will default to Auto when PQ is not fast draft
+ // so fix the media type here
+ if( ReqMedia == MEDIA_PLAIN)
+ *medium = mediaPlain;
+
+ if( ReqMedia == MEDIA_PREMIUM)
+ *medium = mediaSpecial;
+
+ if( ReqMedia == MEDIA_BROCHURE)
+ *medium = mediaBrochure;
+
+} // AdjustModeSettings
+
+#ifdef APDK_LINUX
+DRIVER_ERROR DJGenericVIP::SendSpeedMechCmd (BOOL bLastPage)
+{
+ DRIVER_ERROR err = NO_ERROR;
+ BYTE szStr[16];
+ if (m_iNumPages > 1)
+ {
+ memcpy (szStr, "\x1B*o5W\x0D\x02\x00\x00\x00", 10);
+ szStr[7] = (BYTE) ((m_iNumPages & 0x00FF0000) >> 16);
+ szStr[8] = (BYTE) ((m_iNumPages & 0x0000FF00) >> 8);
+ szStr[9] = (BYTE) (m_iNumPages & 0x000000FF);
+ err = Send ((const BYTE *) szStr, 10);
+ if (bLastPage)
+ {
+ err = Send ((const BYTE *) "\x1B*o5W\x0D\x05\x00\x00\x01", 10);
+ }
+ else
+ {
+ err = Send ((const BYTE *) "\x1B*o5W\x0D\x05\x00\x00\x00", 10);
+ }
+ }
+ return err;
+}
+#endif // APDK_LINUX
+
+Header *DJGenericVIP::SelectHeader (PrintContext *pc)
+{
+ return new HeaderDJGenericVIP (this, pc);
+}
+
+HeaderDJGenericVIP::HeaderDJGenericVIP (Printer *p, PrintContext *pc) : HeaderDJ990 (p, pc)
+{
+ m_uiCAPy = 0;
+}
+
+DRIVER_ERROR HeaderDJGenericVIP::SendCAPy (unsigned int iAbsY)
+{
+ char str[16];
+ DRIVER_ERROR err = NO_ERROR;
+ if (m_uiCAPy == 0)
+ {
+ sprintf (str, "\x1B*p%dY", iAbsY);
+ err = thePrinter->Send ((const BYTE *) str, strlen (str));
+ m_uiCAPy = iAbsY;
+ }
+ return err;
+}
+
+DRIVER_ERROR HeaderDJGenericVIP::FormFeed ()
+{
+ BYTE FF = 12;
+ m_uiCAPy = 0;
+ return thePrinter->Send ((const BYTE *) &FF, 1);
+}
+
+APDK_END_NAMESPACE
+
+
+#endif // defined(APDK_DJGENERICVIP) && defined (APDK_DJ9xxVIP)
diff --git a/prnt/hpijs/djgenericvip.h b/prnt/hpijs/djgenericvip.h
new file mode 100644
index 0000000..5ce0834
--- /dev/null
+++ b/prnt/hpijs/djgenericvip.h
@@ -0,0 +1,284 @@
+/*****************************************************************************\
+ djgenericvip.h : Interface for the generic VIP printer class
+
+ Copyright (c) 2001 - 2006, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#ifndef APDK_DJ_GENERIC_VIP_H
+#define APDK_DJ_GENERIC_VIP_H
+
+APDK_BEGIN_NAMESPACE
+
+//DJGenericVIP
+//!
+/*!
+\internal
+******************************************************************************/
+class DJGenericVIP : public DJ9xxVIP
+{
+public:
+ DJGenericVIP (SystemServices* pSS, BOOL proto = FALSE);
+ Header *SelectHeader (PrintContext *pc);
+ DRIVER_ERROR VerifyPenInfo ();
+ virtual BOOL FullBleedCapable (PAPER_SIZE ps, FullbleedType *fbType, float *xOverSpray, float *yOverSpray,
+ float *fLeftOverSpray, float *fTopOverSpray);
+ virtual BOOL UseGUIMode (PrintMode *pPrintMode);
+ virtual PAPER_SIZE MandatoryPaperSize ();
+ virtual PHOTOTRAY_STATE PhotoTrayEngaged (BOOL bQueryPrinter);
+ //! Returns TRUE if a hagaki feed is present in printer.
+ virtual BOOL HagakiFeedPresent(BOOL bQueryPrinter);
+ virtual DATA_FORMAT GetDataFormat () { return RASTER_STRIP; }
+
+#ifdef APDK_AUTODUPLEX
+ //!Returns TRUE if duplexer and hagaki feed (combined) unit is present in printer.
+
+ virtual BOOL HagakiFeedDuplexerPresent(BOOL bQueryPrinter);
+#endif
+ virtual BOOL GetMargins (PAPER_SIZE ps, float *fMargins);
+#ifdef APDK_LINUX
+ virtual DRIVER_ERROR SendSpeedMechCmd (BOOL bLastPage);
+#endif // APDK_LINUX
+
+private:
+ virtual void AdjustModeSettings (BOOL bDoFullBleed, MEDIATYPE ReqMedia,
+ MediaType *medium, Quality *quality);
+
+}; //DJGenericVIP
+
+class VIPFastDraftMode : public PrintMode
+{
+public:
+ VIPFastDraftMode ();
+}; // VIPFastDraftMode
+
+class VIPGrayFastDraftMode : public GrayMode
+{
+public:
+ VIPGrayFastDraftMode ();
+}; // VIPGrayFastDraftMode
+
+class VIPFastPhotoMode : public PrintMode
+{
+public:
+ VIPFastPhotoMode ();
+}; // VIPFastPhotoMode
+
+class VIPAutoPQMode : public PrintMode
+{
+public:
+ VIPAutoPQMode ();
+}; // VIPAutoPQMode
+
+class VIPCDDVDMode : public PrintMode
+{
+public:
+ VIPCDDVDMode ();
+}; // VIPCDDVDMode
+
+class VIPBrochureNormalMode : public PrintMode
+{
+public:
+ VIPBrochureNormalMode ();
+}; // VIPBrochureNormalMode
+
+class VIPPremiumNormalMode : public PrintMode
+{
+public:
+ VIPPremiumNormalMode ();
+}; // VIPPremiumNormalMode
+
+class VIPPlainBestMode : public PrintMode
+{
+public:
+ VIPPlainBestMode ();
+}; // VIPPlainBestMode
+
+class VIPBrochureBestMode : public PrintMode
+{
+public:
+ VIPBrochureBestMode ();
+}; // VIPBrochureBestMode
+
+class VIPPremiumBestMode : public PrintMode
+{
+public:
+ VIPPremiumBestMode ();
+}; // VIPPremiumBestMode
+
+#if defined(APDK_DJGENERICVIP) && defined (APDK_DJ9xxVIP)
+//! DJGenericVIPProxy
+/*!
+******************************************************************************/
+class DJGenericVIPProxy : public PrinterProxy
+{
+public:
+ DJGenericVIPProxy() : PrinterProxy(
+ "GenericVIP", // family name
+ "deskjet 5100\0"
+ "Deskjet 5400\0"
+ "deskjet 5600\0"
+ "Deskjet 5700\0"
+ "deskjet 5800\0"
+ "Deskjet 5900\0"
+ "Deskjet 6500\0"
+ "Deskjet 6600\0"
+ "Deskjet 6800\0"
+ "Deskjet 6940\0"
+ "Deskjet 6980\0"
+ "Deskjet 6988\0"
+ "deskjet 9600\0"
+ "Deskjet 9800\0"
+ "Deskjet D25\0"
+ "Deskjet D55\0"
+ "Deskjet F24\0"
+ "Deskjet F42\0"
+ "Deskjet F44\0"
+ "Deskjet F45\0"
+ "Deskjet 2050 J510\0"
+ "Deskjet 1050 J410\0"
+ "Business Inkjet 1000\0"
+ "hp business inkjet 1100\0"
+ "HP Business Inkjet 1200\0"
+ "Officejet Pro 8500\0"
+ "photosmart 7150\0"
+ "photosmart 7350\0"
+ "photosmart 7345\0"
+ "photosmart 7550\0"
+ "photosmart 7960\0"
+ "photosmart 7760\0"
+ "photosmart 7660\0"
+ "photosmart 7260\0"
+ "photosmart 7268\0"
+ "Photosmart 7400\0"
+ "Photosmart 7800\0"
+ "Photosmart 8000\0"
+ "Photosmart 8100\0"
+ "Photosmart 8400\0"
+ "Photosmart 8700\0"
+ "Photosmart 8200\0"
+ "Photosmart 320\0"
+ "Photosmart 370\0"
+ "Photosmart 380\0"
+ "Photosmart 330\0"
+ "Photosmart 420\0"
+ "Photosmart A430\0"
+ "Photosmart A510\0"
+ "Photosmart A520\0"
+ "PSC 1500\0"
+ "PSC 1600\0"
+ "psc 2300\0"
+ "PSC 2350\0"
+ "psc 2400\0"
+ "psc 2500\0"
+ "Officejet 4400 K410\0"
+ "Officejet 4500 All-in-One Printer - K710\0"
+ "Officejet 4500 G510\0"
+ "Officejet 6000 E609\0"
+ "Officejet 6500 E709\0"
+ "Officejet 7000 E809\0"
+ "Officejet 74\0"
+ "Officejet 73\0"
+ "Officejet 72\0"
+ "Officejet 60\0"
+ "Officejet 62\0"
+ "Officejet 63\0"
+ "Officejet J35\0"
+ "Officejet J36\0"
+ "Officejet J46\0"
+ "Officejet J55\0"
+ "Officejet J57\0"
+ "Officejet J64\0"
+ "Officejet K71\0"
+ "Officejet Pro K53\0"
+ "Officejet Pro K54\0"
+ "Officejet Pro K56\0"
+ "Officejet Pro K86\0"
+ "Officejet Pro L73\0"
+ "Officejet Pro L75\0"
+ "Officejet Pro L76\0"
+ "Officejet Pro L77\0"
+ "Officejet Pro L82\0"
+ "Officejet Pro L83\0"
+ "Officejet Pro L84\0"
+ "Photosmart 2570\0"
+ "Photosmart 2600\0"
+ "Photosmart 2700\0"
+ "Photosmart 3100\0"
+ "Photosmart 3200\0"
+ "Photosmart 3300\0"
+ "Photosmart A310\0"
+ "Photosmart A320\0"
+ "Photosmart A440\0"
+ "Photosmart B85\0"
+ "Photosmart B109\0"
+ "Photosmart Plus B209\0"
+ "Photosmart Prem-Web C309\0"
+ "Photosmart Pro B8300\0"
+ "Photosmart Pro B88\0"
+ "Photosmart C309\0"
+ "Photosmart C31\0"
+ "Photosmart C41\0"
+ "Photosmart C42\0"
+ "Photosmart C43\0"
+ "Photosmart C44\0"
+ "Photosmart C45\0"
+ "Photosmart C46\0"
+ "Photosmart C47\0"
+ "Photosmart C51\0"
+ "Photosmart C52\0"
+ "Photosmart C53\0"
+ "Photosmart C61\0"
+ "Photosmart C62\0"
+ "Photosmart C63\0"
+ "Photosmart C71\0"
+ "Photosmart C72\0"
+ "Photosmart C81\0"
+ "Photosmart D5060\0"
+ "Photosmart D51\0"
+ "Photosmart D53\0"
+ "Photosmart D54\0"
+ "Photosmart D61\0"
+ "Photosmart D71\0"
+ "Photosmart D72\0"
+ "Photosmart D73\0"
+ "Photosmart D74\0"
+ "Photosmart D73\0"
+ "Photosmart D110\0"
+ "Photosmart Wireless B109\0"
+ "Photosmart B010\0"
+ "Photosmart B110\0"
+ ) {m_iPrinterType = eDJGenericVIP;}
+ inline Printer* CreatePrinter(SystemServices* pSS) const { return new DJGenericVIP(pSS); }
+ inline PRINTER_TYPE GetPrinterType() const { return eDJGenericVIP;}
+ inline unsigned int GetModelBit() const { return 0x80;}
+};
+#endif
+
+APDK_END_NAMESPACE
+
+#endif // APDK_DJ_GENERIC_VIP_H
diff --git a/prnt/hpijs/ernieplatform.h b/prnt/hpijs/ernieplatform.h
new file mode 100644
index 0000000..40195c2
--- /dev/null
+++ b/prnt/hpijs/ernieplatform.h
@@ -0,0 +1,137 @@
+/*****************************************************************************\
+ ernieplatform.h : Interface for ernie
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+APDK_BEGIN_NAMESPACE
+
+// Endianess of the architecture we're on
+#ifdef APDK_LITTLE_ENDIAN
+ #define bigEndian 0
+ #define littleEndian 1
+ #define GetRed(x) (((x >> 16) & 0x0FF))
+ #define GetGreen(x) (((x >> 8) & 0x0FF))
+ #define GetBlue(x) ((x & 0x0FF))
+#else
+ #define bigEndian 1
+ #define littleEndian 0
+ #define GetRed(x) (((x >> 24) & 0x0FF))
+ #define GetGreen(x) (((x >> 16) & 0x0FF))
+ #define GetBlue(x) (((x >> 8) & 0x0FF))
+#endif
+
+/*#define GetRed(x) (((x >> 24) & 0x0FF))
+#define GetGreen(x) (((x >> 16) & 0x0FF))
+#define GetBlue(x) (((x >> 8) & 0x0FF))*/
+
+// Slow down the system and gather stats or not.
+#define kGatherStats 0
+#define kDecompressStats 0
+
+// ********** THIS IS NOT TRUE **************
+// While it may seem like the need to be both
+// big endian and little endian versions of
+// these macros, due to the face that the
+// shift command in general knows about the
+// endian order, you get the same result
+// from these commands no matter what order
+// the bytes are in. Strange isn't it.
+//#define GetRed(x) (((x >> 16) & 0x0FF))
+//#define GetRed(x) (((x >> 24) & 0x0FF))
+//#define GetGreen(x) (((x >> 8) & 0x0FF))
+//#define GetGreen(x) (((x >> 16) & 0x0FF))
+//#define GetBlue(x) ((x & 0x0FF))
+//#define GetBlue(x) (((x >> 8) & 0x0FF))
+// ******************************************
+
+#ifndef MIN
+#define MIN(a,b) (((a)>=(b))?(b):(a))
+#endif
+#ifndef MAX
+#define MAX(a,b) (((a)<=(b))?(b):(a))
+#endif
+
+#define kWhite 0x00FFFFFE
+
+//inline unsigned int get4Pixel(unsigned char *pixAddress);
+//inline unsigned int get4Pixel(unsigned char *pixAddress)
+//inline uint32_t get4Pixel(unsigned char *pixAddress);
+
+inline uint32_t get4Pixel(unsigned char *pixAddress)
+{
+// slower simple code
+// unsigned int toReturn = *((unsigned int*)pixAddress); // load toReturn with XRGB
+// toReturn &= kWhite; // Strip off unwanted X. EGW stripped lsb blue.
+//
+// return toReturn;
+
+#ifdef APDK_LITTLE_ENDIAN
+ return (((unsigned int*)pixAddress)[0]) & kWhite;
+#else
+ return (((unsigned int*)pixAddress)[0]) & 0xFFFFFF00;
+#endif
+}
+
+
+//inline unsigned int get4Pixel(unsigned char *pixAddress, int pixelOffset);
+//inline unsigned int get4Pixel(unsigned char *pixAddress, int pixelOffset)
+//inline uint32_t get4Pixel(unsigned char *pixAddress, int pixelOffset);
+
+inline uint32_t get4Pixel(unsigned char *pixAddress, int pixelOffset)
+{
+// slower simple code
+// unsigned int *uLongPtr = (unsigned int *)pixAddress;
+// uLongPtr += pixelOffset;
+//
+// return *uLongPtr & kWhite;
+
+#ifdef APDK_LITTLE_ENDIAN
+ return ((unsigned int*)pixAddress)[pixelOffset] & kWhite;
+#else
+ return ((unsigned int*)pixAddress)[pixelOffset] & 0xFFFFFF00;
+#endif
+}
+
+//void put3Pixel(unsigned char *pixAddress, int pixelOffset, unsigned int pixel);
+void put3Pixel(unsigned char *pixAddress, int pixelOffset, uint32_t pixel);
+
+//inline void put4Pixel(unsigned char *pixAddress, int pixelOffset, unsigned int pixel);
+//inline void put4Pixel(unsigned char *pixAddress, int pixelOffset, unsigned int pixel)
+//inline void put4Pixel(unsigned char *pixAddress, int pixelOffset, uint32_t pixel);
+
+inline void put4Pixel(unsigned char *pixAddress, int pixelOffset, uint32_t pixel)
+{
+#ifdef APDK_LITTLE_ENDIAN
+ (((unsigned int*)pixAddress)[pixelOffset] = pixel & kWhite);
+#else
+ (((unsigned int*)pixAddress)[pixelOffset] = pixel & 0xFFFFFF00);
+#endif
+}
+
+APDK_END_NAMESPACE
diff --git a/prnt/hpijs/filterhpa.cpp b/prnt/hpijs/filterhpa.cpp
new file mode 100644
index 0000000..f00aab5
--- /dev/null
+++ b/prnt/hpijs/filterhpa.cpp
@@ -0,0 +1,1967 @@
+/*****************************************************************************\
+ filterhpa.cpp : Implimentation for the TErnieFilter class
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#if defined(APDK_DJ9xxVIP) && defined(APDK_VIP_COLORFILTERING)
+
+#include "header.h"
+
+// copied from vob \di_research on 10/31/00
+// MODIFICATIONS BY GE:
+// 0. remove Windows header references
+// 1. define assert
+// 2. set iRastersReady, iRastersDelivered in submitrowtofilter
+// 3. (constructor) allocate (and delete in destructor) buffers for fRowPtr
+// (instead of setting it to input buffers, since we reuse input buffers)
+// 4. copy data into fRowPtr in submitrowtofilter
+
+//#define assert ASSERT
+
+#include "ernieplatform.h"
+#include "filterhpa.h"
+
+#if kGatherStats == 1
+extern int blockStats[];
+#endif
+
+#if ((kMemWritesOptimize != 1) && (kMemWritesOptimize != 0))
+#error "kMemWritesOptimize must be 0 or 1"
+#endif
+
+APDK_BEGIN_NAMESPACE
+
+inline void AverageNRound(bool roundGreenDown, int &rFinal, int &r0, int &r1, int &gFinal, int &g0, int &g1, int &bFinal, int &b0, int &b1);
+inline void AverageNRound(bool roundGreenDown, int &rFinal, int &r0, int &r1, int &gFinal, int &g0, int &g1, int &bFinal, int &b0, int &b1)
+{
+ // By rounding G in the other direction than R and B L* variations are minimized while mathematically alternate rounding is accomplished. EGW 2 Dec. 1999.
+ if (roundGreenDown)
+ {
+ rFinal = (r0 + r1 + 1) / 2;
+ gFinal = (g0 + g1) / 2;
+ bFinal = (b0 + b1 + 1) / 2;
+ }
+ else
+ {
+ rFinal = (r0 + r1) / 2;
+ gFinal = (g0 + g1 + 1) / 2;
+ bFinal = (b0 + b1) / 2;
+ }
+}
+
+
+// Filter1RawRow. To be used to filter an odd row for which we don't have a pair,
+// found at the bottom of bands that aren't divisable by 2. This routine
+// filters its row horizontally forming 4x1 and 2x1 blocks.
+void TErnieFilter::Filter1RawRow(unsigned char *currPtr, int rowWidthInPixels, unsigned int *flagsPtr)
+{
+ ASSERT(currPtr);
+ ASSERT(rowWidthInPixels > 0);
+
+ int R0, G0, B0, R1, G1, B1, lastR, lastG, lastB;
+ const unsigned int maxErrorForFourPixels = fMaxErrorForTwoPixels / 2;
+// const unsigned int maxErrorForEightPixels = maxErrorForFourPixels / 2;
+
+// int currPixel, lastPixel;
+ uint32_t currPixel, lastPixel;
+ bool lastPairAveraged = false;
+ bool last2by2Averaged = false;
+
+
+ for (int pixelNum = 0; pixelNum < rowWidthInPixels; pixelNum++)
+ {
+ if ((pixelNum & 0x03) == 0x00) // 0,4,8...
+ {
+ last2by2Averaged = false; // Reinitialize every four columns;
+ }
+
+ currPixel = get4Pixel(currPtr);
+
+ flagsPtr[0] = (e11n|e11s); // Initialize in case nothing is found for this column
+
+ if (isWhite(currPixel))
+ {
+ flagsPtr[0] = eDone;
+#if kGatherStats == 1
+ blockStats[esWhiteFound]++;
+#endif
+ }
+
+ // Currently we bail entirely if there is white. Later we may still do RLE on the non white pixel if one is present.
+ if (flagsPtr[0] == (e11n|e11s))
+ {
+ R1 = GetRed(currPixel);
+ G1 = GetGreen(currPixel);
+ B1 = GetBlue(currPixel);
+
+ // Can only horizontally average every other pixel, much like the 2x2 blocks.
+ if (isOdd(pixelNum))
+ {
+ // do horizontal on current raster
+ lastPixel = get4Pixel(currPtr,-1);
+ lastR = GetRed(lastPixel);
+ lastG = GetGreen(lastPixel);
+ lastB = GetBlue(lastPixel);
+ if ((fMaxErrorForTwoPixels >= 3) && (NewDeltaE(lastR, R1, lastG, G1, lastB, B1, fMaxErrorForTwoPixels)))
+ {
+ /* - -
+ | | build 2x1
+ - -
+ */
+ int didNotBuild4by1 = true;
+#if kGatherStats == 1
+ blockStats[es21nw]++;
+#endif
+ AverageNRound(isOdd(pixelNum), lastR, lastR, R1, lastG, lastG, G1, lastB, lastB, B1);
+ if ((pixelNum >= 3) && (flagsPtr[-3] & e21nw)) // 4,5,6,7,12,13,14,15,20...
+ {
+ // Look for a 4x1
+ ASSERT(!((flagsPtr[-3] | flagsPtr[-2] | flagsPtr[-1] | flagsPtr[0]) & eTheRest)); // no vertical blocks
+
+ lastPixel = get4Pixel(currPtr,-3);
+ R0 = GetRed(lastPixel);
+ G0 = GetGreen(lastPixel);
+ B0 = GetBlue(lastPixel);
+ if ((maxErrorForFourPixels >= 3) && (NewDeltaE(lastR, R0, lastG, G0, lastB, B0, maxErrorForFourPixels)))
+ {
+ /* - - - -
+ | | build 4x1
+ - - - -
+ */
+#if kGatherStats == 1
+ blockStats[es41ni]++;
+#endif
+ didNotBuild4by1 = false;
+ AverageNRound((pixelNum & 0x04)== 0x04, lastR, lastR, R0, lastG, lastG, G0, lastB, lastB, B0); // 4,5,6,7,12,13,14,15,20...
+
+ if(littleEndian)
+ currPixel = (lastR<<16) + (lastG<<8) + lastB;
+ else if(bigEndian)
+ currPixel = (lastR<<24) + (lastG<<16) + (lastB<<8);
+
+#if kMemWritesOptimize == 0
+ put4Pixel(currPtr, -3, currPixel);
+ put4Pixel(currPtr, -2, currPixel);
+ put4Pixel(currPtr, -1, currPixel);
+ put4Pixel(currPtr, 0, currPixel);
+#else
+ put4Pixel(currPtr, -3, currPixel);
+#endif
+ flagsPtr[-3] = (flagsPtr[-3] & ~eNorths) | e41ni;
+ flagsPtr[-2] = (flagsPtr[-2] & ~eNorths) | e41n;
+ flagsPtr[-1] = (flagsPtr[-1] & ~eNorths) | e41n;
+ flagsPtr[0] = (flagsPtr[0] & ~eNorths) | e41n;
+ }
+ }
+
+ if (didNotBuild4by1) // Not a 4x1 so output 2x1.
+ {
+ ASSERT(!((flagsPtr[-1] | flagsPtr[0]) & eTheRest)); // no vertical blocks
+
+ if(littleEndian)
+ currPixel = (lastR<<16) + (lastG<<8) + lastB;
+ else if(bigEndian)
+ currPixel = (lastR<<24) + (lastG<<16) + (lastB<<8);
+
+#if kMemWritesOptimize == 0
+ put4Pixel(currPtr, -1, currPixel);
+ put4Pixel(currPtr, 0, currPixel);
+#else
+ put4Pixel(currPtr, -1, currPixel);
+#endif
+ flagsPtr[-1] = (flagsPtr[-1] & ~eNorths) | e21nw;
+ flagsPtr[0] = (flagsPtr[0] & ~eNorths) | e21ne;
+ }
+ } // If DeltaE... Looking for two by one
+ } // IsOdd(pixelNum)
+ }
+ else // no flag bits set.
+ {
+ lastPairAveraged = false; // EGW Fixes bug on business graphics. 11/24/97
+ }
+
+ currPtr += eBufferedPixelWidthInBytes;
+ flagsPtr++;
+ } // for each pixel...
+}
+
+// Filter2RawRows: Looks filter two raw rows together to form blocks. Vertical
+// blocks are prefered over horizontal ones. The routine will create 1x2 blocks
+// before it will create 4x1's. In total this routine will create 1x2, 2x2, 4x2,
+// 4x1, and 2x1 blocks sizes, with the potential for two seperate 4x1's or 2x1's
+// in the upper and lower rasters.
+void TErnieFilter::Filter2RawRows(unsigned char *currPtr, unsigned char *upPtr, int rowWidthInPixels, unsigned int *flagsPtr)
+{
+ ASSERT(currPtr);
+ ASSERT(upPtr);
+ ASSERT(rowWidthInPixels > 0);
+
+ int R0, G0, B0, R1, G1, B1, lastR, lastG, lastB;
+ const unsigned int maxErrorForFourPixels = fMaxErrorForTwoPixels / 2;
+ const unsigned int maxErrorForEightPixels = maxErrorForFourPixels / 2;
+
+// int currPixel, upPixel, lastPixel;
+ uint32_t currPixel, upPixel, lastPixel;
+ bool lastPairAveraged = false;
+ bool last2by2Averaged = false;
+
+ for (int pixelNum = 0; pixelNum < rowWidthInPixels; pixelNum++)
+ {
+ if ((pixelNum & 0x03) == 0x00) // 0,4,8...
+ {
+ last2by2Averaged = false; // Reinitialize every four columns;
+ }
+
+ upPixel = get4Pixel(upPtr);
+ currPixel = get4Pixel(currPtr);
+
+ flagsPtr[0] = (e11n|e11s); // Initialize in case nothing is found for this column
+
+ if (isWhite(upPixel) && isWhite(currPixel)) // both white?
+ {
+ flagsPtr[0] = eDone;
+#if kGatherStats == 1
+ blockStats[esWhiteFound]++;
+#endif
+ }
+
+ // Do vertical average on the current 2 pixel high column
+
+ // Currently we bail entirely if there is white. Later we may still do RLE on the non white pixel if one is present.
+ if (flagsPtr[0] == (e11n|e11s))
+ {
+ R1 = GetRed(currPixel);
+ G1 = GetGreen(currPixel);
+ B1 = GetBlue(currPixel);
+
+ R0 = GetRed(upPixel);
+ G0 = GetGreen(upPixel);
+ B0 = GetBlue(upPixel);
+
+ if ((fMaxErrorForTwoPixels >= 3) && (NewDeltaE(R0, R1, G0, G1, B0, B1, fMaxErrorForTwoPixels)))
+ {
+ /* _
+ | | build 1x2
+ | |
+ -
+ */
+ ASSERT(flagsPtr[0] == (e11n|e11s));
+ flagsPtr[0] = e12;
+#if kGatherStats == 1
+ blockStats[es12]++;
+#endif
+ R1 = GetRed(currPixel);
+ G1 = GetGreen(currPixel);
+ B1 = GetBlue(currPixel);
+
+ R0 = GetRed(upPixel);
+ G0 = GetGreen(upPixel);
+ B0 = GetBlue(upPixel);
+
+ AverageNRound(isOdd(pixelNum), R1, R1, R0, G1, G1, G0, B1, B1, B0);
+
+ // look for a 2x2 block average on every other column
+ if (isOdd(pixelNum))
+ { // It looks like we are at the end of a 2x2 block
+ if (lastPairAveraged)
+ {
+ // Last pair was averaged so it's ok to try to make a 2x2 block
+ if ((maxErrorForFourPixels >= 3) && (NewDeltaE(lastR, R1, lastG, G1,lastB, B1, maxErrorForFourPixels)))
+ {
+ /* - -
+ | | build 2x2
+ | |
+ - -
+ */
+ ASSERT(flagsPtr[-1] == e12);
+ int didNotBuild4by2 = true;
+#if kGatherStats == 1
+ blockStats[es22w]++;
+#endif
+ flagsPtr[-1] = e22w;
+ flagsPtr[0] = e22e;
+
+ AverageNRound((pixelNum & 0x02) == 0x02, R1, R1, lastR, G1, G1, lastG, B1, B1, lastB); // 2,3,6,7... Alternate between rounding up and down for these 2x2 blocks
+
+ if ((pixelNum & 0x03) == 0x03) // 3,7,11,15... Looking for a 4x2 block to average
+ {
+ if (last2by2Averaged)
+ {
+ /* - - - -
+ | | | | We have two 2x2s.
+ | | | |
+ - - - -
+ */
+
+ lastPixel = get4Pixel(upPtr, -3); // Go back to previous 2x2 block and get the pixel
+ lastR = GetRed(lastPixel);
+ lastG = GetGreen(lastPixel);
+ lastB = GetBlue(lastPixel);
+ if ((maxErrorForEightPixels >= 3) && (NewDeltaE(lastR, R1, lastG, G1,lastB, B1, maxErrorForEightPixels)))
+ {
+
+
+ /* - - - -
+ | | build 4x2.
+ | |
+ - - - -
+ */
+#if kGatherStats == 1
+ blockStats[es42i]++;
+#endif
+ didNotBuild4by2 = false;
+
+ flagsPtr[-3] = e42i;
+ flagsPtr[-2] = flagsPtr[-1] = flagsPtr[0] = e42;
+
+ AverageNRound((pixelNum & 0x04) == 0x04, R1, R1, lastR, G1, G1, lastG, B1, B1, lastB); // 4,5,6,7,12,13,14,15,20... Alternate between rounding up down for these 4x2 blocks
+
+ if(littleEndian)
+ currPixel = (R1<<16) + (G1<<8) + B1;
+ else if(bigEndian)
+ currPixel = (R1<<24) + (G1<<16) + (B1<<8);
+
+#if kMemWritesOptimize == 0
+ put4Pixel(upPtr, -3, currPixel);
+ put4Pixel(upPtr, -2, currPixel);
+ put4Pixel(upPtr, -1, currPixel);
+ put4Pixel(upPtr, 0, currPixel);
+ put4Pixel(currPtr, -3, currPixel);
+ put4Pixel(currPtr, -2, currPixel);
+ put4Pixel(currPtr, -1, currPixel);
+ put4Pixel(currPtr, 0, currPixel);
+#else
+ put4Pixel(upPtr, -3, currPixel);
+#endif
+ }
+ }
+
+ if (didNotBuild4by2)
+ { // The first 2x2 block of this pair of 2x2 blocks wasn't averaged.
+ /* - - - -
+ |X X| | | not averaged block and averaged 2x2.
+ |X X| | |
+ - - - -
+ */
+
+ last2by2Averaged = true;
+
+ if(littleEndian)
+ currPixel = (R1<<16) + (G1<<8) + B1;
+ else if(bigEndian)
+ currPixel = (R1<<24) + (G1<<16) + (B1<<8);
+
+#if kMemWritesOptimize == 0
+ put4Pixel(upPtr, -1, currPixel);
+ put4Pixel(upPtr, 0, currPixel);
+ put4Pixel(currPtr, -1, currPixel);
+ put4Pixel(currPtr, 0, currPixel);
+#else
+ put4Pixel(upPtr, -1, currPixel);
+#endif
+ }
+ }
+ else // Not looking for a 4x2 block yet so just output this 2x2 block for now.
+ {
+ /* - - - -
+ | | |? ?| 1st 2x2 and maybe another later.
+ | | |? ?|
+ - - - -
+ */
+
+ last2by2Averaged = true;
+
+ if(littleEndian)
+ currPixel = (R1<<16) + (G1<<8) + B1;
+ else if(bigEndian)
+ currPixel = (R1<<24) + (G1<<16) + (B1<<8);
+
+#if kMemWritesOptimize == 0
+ put4Pixel(upPtr, -1, currPixel);
+ put4Pixel(upPtr, 0, currPixel);
+ put4Pixel(currPtr, -1, currPixel);
+ put4Pixel(currPtr, 0, currPixel);
+#else
+ put4Pixel(upPtr, -1, currPixel);
+#endif
+ }
+ }
+ else // The two averaged columns are not close enough in Delta E
+ {
+ /* - _
+ | | | | 2 1x2 blocks
+ | | | |
+ - -
+ */
+
+ last2by2Averaged = false;
+
+ if(littleEndian)
+ currPixel = (R1<<16) + (G1<<8) + B1;
+ else if(bigEndian)
+ currPixel = (R1<<24) + (G1<<16) + (B1<<8);
+
+#if kMemWritesOptimize == 0
+ put4Pixel(upPtr, 0, currPixel);
+ put4Pixel(currPtr, 0, currPixel);
+#else
+ put4Pixel(upPtr,0, currPixel);
+#endif
+ }
+ lastR = R1;
+ lastG = G1;
+ lastB = B1;
+ lastPairAveraged = true;
+ }
+ else // This is the right place for 2x2 averaging but the previous column wasn't averaged
+ {
+ /* -
+ X | | Two non averaged pixels and a 1x2.
+ X | |
+ -
+ */
+ last2by2Averaged = false;
+ lastPairAveraged = true;
+ lastR = R1;
+ lastG = G1;
+ lastB = B1;
+
+ if(littleEndian)
+ currPixel = (R1<<16) + (G1<<8) + B1;
+ else if(bigEndian)
+ currPixel = (R1<<24) + (G1<<16) + (B1<<8);
+
+#if kMemWritesOptimize == 0
+ put4Pixel(upPtr, 0, currPixel);
+ put4Pixel(currPtr, 0, currPixel);
+#else
+ put4Pixel(upPtr, 0, currPixel);
+#endif
+ }
+ }
+ else // Not on the boundary for a 2x2 block, so just output current averaged 1x2 column
+ {
+ /* -
+ | | ? 1x2
+ | | ?
+ -
+ */
+
+ lastPairAveraged = true;
+ lastR = R1;
+ lastG = G1;
+ lastB = B1;
+
+ if(littleEndian)
+ currPixel = (R1<<16) + (G1<<8) + B1;
+ else if(bigEndian)
+ currPixel = (R1<<24) + (G1<<16) + (B1<<8);
+
+#if kMemWritesOptimize == 0
+ put4Pixel(upPtr, 0, currPixel);
+ put4Pixel(currPtr, 0, currPixel);
+#else
+ put4Pixel(upPtr, 0, currPixel);
+#endif
+ }
+ }
+ else if (lastPairAveraged)
+ { // This is the case where we can't average current column and the last column was averaged.
+ // Don't do anything if last pair was averaged and this one can't be
+
+ /* -
+ | | X 1x2 averaged block and two non averaged pixels.
+ | | X
+ -
+ */
+
+ lastPairAveraged = false;
+ }
+ else
+ // can't vertically average current column so look for some horizontal averaging as a fallback
+ // Only do it if the last pair wasn't averaged either because we don't want to mess up a vertical averaging
+ // just to create a possible horizontal averaging.
+ {
+ // Can only horizontally average every other pixel, much like the 2x2 blocks.
+ if (isOdd(pixelNum))
+ {
+ // do horizontal averaging on previous raster
+ lastPixel = get4Pixel(upPtr,-1);
+ lastR = GetRed(lastPixel);
+ lastG = GetGreen(lastPixel);
+ lastB = GetBlue(lastPixel);
+ if (((fMaxErrorForTwoPixels >= 3)) && (NewDeltaE(lastR, R0, lastG, G0,lastB, B0, fMaxErrorForTwoPixels)))
+ {
+ /* - -
+ | | build upper 2x1
+ - -
+ */
+#if kGatherStats == 1
+ blockStats[es21nw]++;
+#endif
+ int didNotBuild4by1 = true;
+
+ AverageNRound(isOdd(pixelNum), lastR, lastR, R0, lastG, lastG, G0, lastB, lastB, B0);
+
+ if ((pixelNum >= 3) && (flagsPtr[-3] & e21nw)) // 4,5,6,7,12,13,14,15,20...
+ {
+ ASSERT(!((flagsPtr[-3] | flagsPtr[-2] | flagsPtr[-1] | flagsPtr[0]) & eTheRest)); // no vertical blocks
+
+ // Attempt an upper 4x1
+ lastPixel = get4Pixel(upPtr,-3);
+ R0 = GetRed(lastPixel);
+ G0 = GetGreen(lastPixel);
+ B0 = GetBlue(lastPixel);
+ if ( (maxErrorForFourPixels >= 3) && (NewDeltaE(lastR, R0, lastG, G0,lastB, B0, maxErrorForFourPixels)))
+ {
+ /* - - - -
+ | | build upper 4x1
+ - - - -
+ */
+#if kGatherStats == 1
+ blockStats[es41ni]++;
+#endif
+ didNotBuild4by1 = false;
+ AverageNRound((pixelNum & 0x04)== 0x04, lastR, lastR, R0, lastG, lastG, G0, lastB, lastB, B0); // 4,5,6,7,12,13,14,15,20...
+
+ if(littleEndian)
+ currPixel = (lastR<<16) + (lastG<<8) + lastB;
+ else if(bigEndian)
+ currPixel = (lastR<<24) + (lastG<<16) + (lastB<<8);
+
+#if kMemWritesOptimize == 0
+ put4Pixel(upPtr, -3, currPixel);
+ put4Pixel(upPtr, -2, currPixel);
+ put4Pixel(upPtr, -1, currPixel);
+ put4Pixel(upPtr, 0, currPixel);
+#else
+ put4Pixel(upPtr, -3, currPixel);
+#endif
+
+ ASSERT(!((flagsPtr[-3] | flagsPtr[-2] | flagsPtr[-1] | flagsPtr[0]) & eTheRest)); // no vertical blocks
+
+ flagsPtr[-3] = (flagsPtr[-3] & ~eNorths) | e41ni;
+ flagsPtr[-2] = (flagsPtr[-2] & ~eNorths) | e41n;
+ flagsPtr[-1] = (flagsPtr[-1] & ~eNorths) | e41n;
+ flagsPtr[0] = (flagsPtr[0] & ~eNorths) | e41n;
+ }
+ }
+
+ if (didNotBuild4by1) // Not an upper 4x1 so output upper 2x1.
+ {
+ if(littleEndian)
+ currPixel = (lastR<<16) + (lastG<<8) + lastB;
+ else if(bigEndian)
+ currPixel = (lastR<<24) + (lastG<<16) + (lastB<<8);
+
+#if kMemWritesOptimize == 0
+ put4Pixel(upPtr, -1, currPixel);
+ put4Pixel(upPtr, 0, currPixel);
+#else
+ put4Pixel(upPtr, -1, currPixel);
+#endif
+ ASSERT(!((flagsPtr[-1] | flagsPtr[0]) & eTheRest)); // no vertical blocks
+ flagsPtr[-1] = (flagsPtr[-1] & ~eNorths) | e21nw;
+ flagsPtr[0] = (flagsPtr[0] & ~eNorths) | e21ne;
+ }
+ }
+
+ // do horizontal on current raster
+ lastPixel = get4Pixel(currPtr,-1);
+ lastR = GetRed(lastPixel);
+ lastG = GetGreen(lastPixel);
+ lastB = GetBlue(lastPixel);
+ if ((fMaxErrorForTwoPixels >= 3) && (NewDeltaE(lastR, R1, lastG, G1, lastB, B1, fMaxErrorForTwoPixels)))
+ {
+ /* - -
+ | | build lower 2x1
+ - -
+ */
+ int didNotBuild4by1 = true;
+#if kGatherStats == 1
+ blockStats[es21sw]++;
+#endif
+ AverageNRound(isOdd(pixelNum), lastR, lastR, R1, lastG, lastG, G1, lastB, lastB, B1);
+ if ((pixelNum >= 3) && (flagsPtr[-3] & e21sw)) // 4,5,6,7,12,13,14,15,20...
+ {
+ // Look for a lower 4x1
+ ASSERT(!((flagsPtr[-3] | flagsPtr[-2] | flagsPtr[-1] | flagsPtr[0]) & eTheRest)); // no vertical blocks
+
+ lastPixel = get4Pixel(currPtr,-3);
+ R0 = GetRed(lastPixel);
+ G0 = GetGreen(lastPixel);
+ B0 = GetBlue(lastPixel);
+ if ((maxErrorForFourPixels >= 3) && (NewDeltaE(lastR, R0, lastG, G0, lastB, B0, maxErrorForFourPixels)))
+ {
+ /* - - - -
+ | | build lower 4x1
+ - - - -
+ */
+#if kGatherStats == 1
+ blockStats[es41si]++;
+#endif
+ didNotBuild4by1 = false;
+ AverageNRound((pixelNum & 0x04)== 0x04, lastR, lastR, R0, lastG, lastG, G0, lastB, lastB, B0); // 4,5,6,7,12,13,14,15,20...
+
+ if(littleEndian)
+ currPixel = (lastR<<16) + (lastG<<8) + lastB;
+ else if(bigEndian)
+ currPixel = (lastR<<24) + (lastG<<16) + (lastB<<8);
+
+#if kMemWritesOptimize == 0
+ put4Pixel(currPtr, -3, currPixel);
+ put4Pixel(currPtr, -2, currPixel);
+ put4Pixel(currPtr, -1, currPixel);
+ put4Pixel(currPtr, 0, currPixel);
+#else
+ put4Pixel(currPtr, -3, currPixel);
+#endif
+ flagsPtr[-3] = (flagsPtr[-3] & ~eSouths) | e41si;
+ flagsPtr[-2] = (flagsPtr[-2] & ~eSouths) | e41s;
+ flagsPtr[-1] = (flagsPtr[-1] & ~eSouths) | e41s;
+ flagsPtr[0] = (flagsPtr[0] & ~eSouths) | e41s;
+ }
+ }
+
+ if (didNotBuild4by1) // Not a lower 4x1 so output lower 2x1.
+ {
+ ASSERT(!((flagsPtr[-1] | flagsPtr[0]) & eTheRest)); // no vertical blocks
+
+ if(littleEndian)
+ currPixel = (lastR<<16) + (lastG<<8) + lastB;
+ else if(bigEndian)
+ currPixel = (lastR<<24) + (lastG<<16) + (lastB<<8);
+
+#if kMemWritesOptimize == 0
+ put4Pixel(currPtr, -1, currPixel);
+ put4Pixel(currPtr, 0, currPixel);
+#else
+ put4Pixel(currPtr, -1, currPixel);
+#endif
+
+ flagsPtr[-1] = (flagsPtr[-1] & ~eSouths) | e21sw;
+ flagsPtr[0] = (flagsPtr[0] & ~eSouths) | e21se;
+ }
+ } // If DeltaE... Looking for two by one
+ } // IsOdd(pixelNum)
+ }
+ }
+ else // no flag bits set.
+ {
+ lastPairAveraged = false; // EGW Fixes bug on business graphics. 11/24/97
+ }
+
+ upPtr += eBufferedPixelWidthInBytes;
+ currPtr += eBufferedPixelWidthInBytes;
+ flagsPtr++;
+ } // for each pixel...
+}
+
+// Filter2PairsOfFilteredRows. This routine takes 2 pairs of rows that
+// have been through the Filter2RawRows routine and puts blocks together
+// to make bigger blocks. It prefers taking 2 high blocks and putting
+// them together to make four high blocks, but as a last resort it will
+// take try to take a 1 high blocks from the second and third rasters and
+// create 2 high blocks. The possible block sizes this routine could
+// create are 8x4, 4x4, 2x4, and 1x4, and then with the second and third rasters
+// 4x2, 2x2, and 1x2.
+void TErnieFilter::Filter2PairsOfFilteredRows(unsigned char *row1Ptr, unsigned char *row2Ptr, unsigned char *row3Ptr, unsigned char *row4Ptr)
+{
+ const unsigned int maxErrorForFourPixels = fMaxErrorForTwoPixels / 2;
+ const unsigned int maxErrorForEightPixels = maxErrorForFourPixels / 2;
+ const unsigned int maxErrorForSixteenPixels = maxErrorForEightPixels / 2;
+ const unsigned int maxErrorForThirtyTwoPixels = maxErrorForSixteenPixels / 2;
+
+ for (int pixelNum = 0; pixelNum < (fRowWidthInPixels-3);) // Make sure we have four pixels to work with
+ {
+ int currPixel, upPixel;
+ int R0, G0, B0, R1, G1, B1;
+
+ if ((fPixelFilteredFlags[0][pixelNum] & e42i) && (fPixelFilteredFlags[1][pixelNum] & e42i))
+ {
+ /* - - - -
+ | |
+ | |
+ - - - - We have two 4x2s.
+ - - - -
+ | |
+ | |
+ - - - -
+ */
+ ASSERT(fPixelFilteredFlags[0][pixelNum] == e42i && fPixelFilteredFlags[0][pixelNum+1] == e42 && fPixelFilteredFlags[0][pixelNum+2] == e42 && fPixelFilteredFlags[0][pixelNum+3] == e42);
+ ASSERT(fPixelFilteredFlags[1][pixelNum] == e42i && fPixelFilteredFlags[1][pixelNum+1] == e42 && fPixelFilteredFlags[1][pixelNum+2] == e42 && fPixelFilteredFlags[1][pixelNum+3] == e42);
+
+ upPixel = get4Pixel(row1Ptr);
+ currPixel = get4Pixel(row3Ptr);
+
+ R1 = GetRed(currPixel);
+ G1 = GetGreen(currPixel);
+ B1 = GetBlue(currPixel);
+
+ R0 = GetRed(upPixel);
+ G0 = GetGreen(upPixel);
+ B0 = GetBlue(upPixel);
+
+ if((maxErrorForSixteenPixels >= 3) &&(NewDeltaE(R1, R0, G1, G0, B1, B0, maxErrorForSixteenPixels)))
+ {
+ /* - - - -
+ | |
+ | | build 4x4
+ | |
+ | |
+ - - - -
+ */
+#if kGatherStats == 1
+ blockStats[es44ni]++;
+#endif
+ AverageNRound((pixelNum & 0x04) == 0x04, R1, R1, R0, G1, G1, G0, B1, B1, B0); // 4,5,6,7,12,13,14,15,20... Alternate between rounding up down
+
+ if(littleEndian)
+ currPixel = (R1<<16) + (G1<<8) + B1;
+ else if(bigEndian)
+ currPixel = (R1<<24) + (G1<<16) + (B1<<8);
+
+#if kMemWritesOptimize == 0
+ put4Pixel(row1Ptr, 0, currPixel);
+ put4Pixel(row1Ptr, 1, currPixel);
+ put4Pixel(row1Ptr, 2, currPixel);
+ put4Pixel(row1Ptr, 3, currPixel);
+ put4Pixel(row2Ptr, 0, currPixel);
+ put4Pixel(row2Ptr, 1, currPixel);
+ put4Pixel(row2Ptr, 2, currPixel);
+ put4Pixel(row2Ptr, 3, currPixel);
+ put4Pixel(row3Ptr, 0, currPixel);
+ put4Pixel(row3Ptr, 1, currPixel);
+ put4Pixel(row3Ptr, 2, currPixel);
+ put4Pixel(row3Ptr, 3, currPixel);
+ put4Pixel(row4Ptr, 0, currPixel);
+ put4Pixel(row4Ptr, 1, currPixel);
+ put4Pixel(row4Ptr, 2, currPixel);
+ put4Pixel(row4Ptr, 3, currPixel);
+#else
+ put4Pixel(row1Ptr, 0, currPixel);
+#endif
+ row1Ptr += 4*eBufferedPixelWidthInBytes;
+ row2Ptr += 4*eBufferedPixelWidthInBytes;
+ row3Ptr += 4*eBufferedPixelWidthInBytes;
+ row4Ptr += 4*eBufferedPixelWidthInBytes;
+
+ fPixelFilteredFlags[0][pixelNum] = e44ni;
+ fPixelFilteredFlags[0][pixelNum+1] = fPixelFilteredFlags[0][pixelNum+2] = fPixelFilteredFlags[0][pixelNum+3] = e44n;
+ fPixelFilteredFlags[1][pixelNum] = e44si;
+ fPixelFilteredFlags[1][pixelNum+1] = fPixelFilteredFlags[1][pixelNum+2] = fPixelFilteredFlags[1][pixelNum+3] = e44s;
+
+ if ((pixelNum >= 4) && (fPixelFilteredFlags[1][pixelNum-4] & e44si)) // 4,5,6,7,12,13,14,15,20...
+ {
+ /* - - - - - - - -
+ | | | |
+ | | | | We have two 4x4s.
+ | | | |
+ | | | |
+ - - - - - - - -
+ */
+ ASSERT(fPixelFilteredFlags[0][pixelNum-4] == e44ni && fPixelFilteredFlags[0][pixelNum-3] == e44n && fPixelFilteredFlags[0][pixelNum-2] == e44n && fPixelFilteredFlags[0][pixelNum-1] == e44n);
+ ASSERT(fPixelFilteredFlags[1][pixelNum-4] == e44si && fPixelFilteredFlags[1][pixelNum-3] == e44s && fPixelFilteredFlags[1][pixelNum-2] == e44s && fPixelFilteredFlags[1][pixelNum-1] == e44s);
+
+ upPixel = get4Pixel(row1Ptr, -8);
+
+ R0 = GetRed(upPixel);
+ G0 = GetGreen(upPixel);
+ B0 = GetBlue(upPixel);
+
+ if( (maxErrorForThirtyTwoPixels >= 3) && (NewDeltaE(R1, R0, G1, G0, B1, B0, maxErrorForThirtyTwoPixels)))
+ {
+ /* - - - - - - - -
+ | |
+ | | build 8x4
+ | |
+ | |
+ - - - - - - - -
+ */
+#if kGatherStats == 1
+ blockStats[es84ni]++;
+#endif
+ AverageNRound((pixelNum & 0x08) == 0x08, R1, R1, R0, G1, G1, G0, B1, B1, B0);
+ if(littleEndian)
+ currPixel = (R1<<16) + (G1<<8) + B1;
+ else if(bigEndian)
+ currPixel = (R1<<24) + (G1<<16) + (B1<<8);
+
+#if kMemWritesOptimize == 0
+ put4Pixel(row1Ptr, -8, currPixel);
+ put4Pixel(row1Ptr, -7, currPixel);
+ put4Pixel(row1Ptr, -6, currPixel);
+ put4Pixel(row1Ptr, -5, currPixel);
+ put4Pixel(row1Ptr, -4, currPixel);
+ put4Pixel(row1Ptr, -3, currPixel);
+ put4Pixel(row1Ptr, -2, currPixel);
+ put4Pixel(row1Ptr, -1, currPixel);
+ put4Pixel(row2Ptr, -8, currPixel);
+ put4Pixel(row2Ptr, -7, currPixel);
+ put4Pixel(row2Ptr, -6, currPixel);
+ put4Pixel(row2Ptr, -5, currPixel);
+ put4Pixel(row2Ptr, -4, currPixel);
+ put4Pixel(row2Ptr, -3, currPixel);
+ put4Pixel(row2Ptr, -2, currPixel);
+ put4Pixel(row2Ptr, -1, currPixel);
+ put4Pixel(row3Ptr, -8, currPixel);
+ put4Pixel(row3Ptr, -7, currPixel);
+ put4Pixel(row3Ptr, -6, currPixel);
+ put4Pixel(row3Ptr, -5, currPixel);
+ put4Pixel(row3Ptr, -4, currPixel);
+ put4Pixel(row3Ptr, -3, currPixel);
+ put4Pixel(row3Ptr, -2, currPixel);
+ put4Pixel(row3Ptr, -1, currPixel);
+ put4Pixel(row4Ptr, -8, currPixel);
+ put4Pixel(row4Ptr, -7, currPixel);
+ put4Pixel(row4Ptr, -6, currPixel);
+ put4Pixel(row4Ptr, -5, currPixel);
+ put4Pixel(row4Ptr, -4, currPixel);
+ put4Pixel(row4Ptr, -3, currPixel);
+ put4Pixel(row4Ptr, -2, currPixel);
+ put4Pixel(row4Ptr, -1, currPixel);
+#else
+ put4Pixel(row1Ptr, -8, currPixel);
+#endif
+ fPixelFilteredFlags[0][pixelNum-4] = e84ni;
+ fPixelFilteredFlags[0][pixelNum-3] = fPixelFilteredFlags[0][pixelNum-2] = fPixelFilteredFlags[0][pixelNum-1] = fPixelFilteredFlags[0][pixelNum] = fPixelFilteredFlags[0][pixelNum+1] = fPixelFilteredFlags[0][pixelNum+2] = fPixelFilteredFlags[0][pixelNum+3] = e84n;
+ fPixelFilteredFlags[1][pixelNum-4] = e84si;
+ fPixelFilteredFlags[1][pixelNum-3] = fPixelFilteredFlags[1][pixelNum-2] = fPixelFilteredFlags[1][pixelNum-1] = fPixelFilteredFlags[1][pixelNum] = fPixelFilteredFlags[1][pixelNum+1] = fPixelFilteredFlags[1][pixelNum+2] = fPixelFilteredFlags[1][pixelNum+3] = e84s;
+ }
+ }
+ }
+ else // could not build 4x4 so move forward past the stacked 4x2s.
+ {
+ row1Ptr += 4*eBufferedPixelWidthInBytes;
+ row2Ptr += 4*eBufferedPixelWidthInBytes;
+ row3Ptr += 4*eBufferedPixelWidthInBytes;
+ row4Ptr += 4*eBufferedPixelWidthInBytes;
+ }
+ pixelNum += 4;
+ }
+ else if ((fPixelFilteredFlags[0][pixelNum] & e22w) && (fPixelFilteredFlags[1][pixelNum] & e22w))
+ {
+ /* - -
+ | |
+ | |
+ - - we have 2 2x2s.
+ - -
+ | |
+ | |
+ - -
+ */
+ ASSERT(fPixelFilteredFlags[0][pixelNum] == e22w && fPixelFilteredFlags[0][pixelNum+1] == e22e);
+ ASSERT(fPixelFilteredFlags[1][pixelNum] == e22w && fPixelFilteredFlags[1][pixelNum+1] == e22e);
+
+ upPixel = get4Pixel(row1Ptr);
+ currPixel = get4Pixel(row3Ptr);
+
+ R1 = GetRed(currPixel);
+ G1 = GetGreen(currPixel);
+ B1 = GetBlue(currPixel);
+
+ R0 = GetRed(upPixel);
+ G0 = GetGreen(upPixel);
+ B0 = GetBlue(upPixel);
+
+ if ((maxErrorForEightPixels >= 3) && (NewDeltaE(R1, R0, G1, G0, B1, B0, maxErrorForEightPixels)))
+ {
+ /* - -
+ | |
+ | | build 2x4
+ | |
+ | |
+ - -
+ */
+#if kGatherStats == 1
+ blockStats[es24nw]++;
+#endif
+ AverageNRound((pixelNum & 0x02) == 0x02, R1, R1, R0, G1, G1, G0, B1, B1, B0);
+
+ if(littleEndian)
+ currPixel = (R1<<16) + (G1<<8) + B1;
+ else if(bigEndian)
+ currPixel = (R1<<24) + (G1<<16) + (B1<<8);
+
+#if kMemWritesOptimize == 0
+ put4Pixel(row1Ptr, 0, currPixel);
+ put4Pixel(row1Ptr, 1, currPixel);
+ put4Pixel(row2Ptr, 0, currPixel);
+ put4Pixel(row2Ptr, 1, currPixel);
+ put4Pixel(row3Ptr, 0, currPixel);
+ put4Pixel(row3Ptr, 1, currPixel);
+ put4Pixel(row4Ptr, 0, currPixel);
+ put4Pixel(row4Ptr, 1, currPixel);
+#else
+ put4Pixel(row1Ptr, 0, currPixel);
+#endif
+ row1Ptr += 2*eBufferedPixelWidthInBytes;
+ row2Ptr += 2*eBufferedPixelWidthInBytes;
+ row3Ptr += 2*eBufferedPixelWidthInBytes;
+ row4Ptr += 2*eBufferedPixelWidthInBytes;
+
+ fPixelFilteredFlags[0][pixelNum] = e24nw;
+ fPixelFilteredFlags[0][pixelNum+1] = e24ne;
+ fPixelFilteredFlags[1][pixelNum] = e24sw;
+ fPixelFilteredFlags[1][pixelNum+1] = e24se;
+ }
+ else
+ {
+ row1Ptr += 2*eBufferedPixelWidthInBytes;
+ row2Ptr += 2*eBufferedPixelWidthInBytes;
+ row3Ptr += 2*eBufferedPixelWidthInBytes;
+ row4Ptr += 2*eBufferedPixelWidthInBytes;
+ }
+ pixelNum += 2;
+ }
+ else if ((fPixelFilteredFlags[0][pixelNum] & e12) && (fPixelFilteredFlags[1][pixelNum] & e12))
+ {
+ /* -
+ | |
+ | |
+ - we have two 1x2s.
+ -
+ | |
+ | |
+ -
+ */
+ ASSERT(fPixelFilteredFlags[0][pixelNum] == e12);
+ ASSERT(fPixelFilteredFlags[1][pixelNum] == e12);
+
+ upPixel = get4Pixel(row1Ptr);
+ currPixel = get4Pixel(row3Ptr);
+
+ R1 = GetRed(currPixel);
+ G1 = GetGreen(currPixel);
+ B1 = GetBlue(currPixel);
+
+ R0 = GetRed(upPixel);
+ G0 = GetGreen(upPixel);
+ B0 = GetBlue(upPixel);
+
+ if ((maxErrorForFourPixels >= 3) && (NewDeltaE(R1, R0, G1, G0, B1, B0, maxErrorForFourPixels)))
+ {
+ /* -
+ | |
+ | | build 1x4
+ | |
+ | |
+ -
+ */
+#if kGatherStats == 1
+ blockStats[es14n]++;
+#endif
+ AverageNRound((pixelNum & 0x01) == 0x01, R1, R1, R0, G1, G1, G0, B1, B1, B0);
+
+ if(littleEndian)
+ currPixel = (R1<<16) + (G1<<8) + B1;
+ else if(bigEndian)
+ currPixel = (R1<<24) + (G1<<16) + (B1<<8);
+
+#if kMemWritesOptimize == 0
+ put4Pixel(row1Ptr, 0, currPixel);
+ put4Pixel(row2Ptr, 0, currPixel);
+ put4Pixel(row3Ptr, 0, currPixel);
+ put4Pixel(row4Ptr, 0, currPixel);
+#else
+ put4Pixel(row1Ptr, 0, currPixel);
+#endif
+ fPixelFilteredFlags[0][pixelNum] = e14n;
+ fPixelFilteredFlags[1][pixelNum] = e14s;
+ }
+
+ row1Ptr += eBufferedPixelWidthInBytes;
+ row2Ptr += eBufferedPixelWidthInBytes;
+ row3Ptr += eBufferedPixelWidthInBytes;
+ row4Ptr += eBufferedPixelWidthInBytes;
+
+ pixelNum++;
+ }
+ else if ((fPixelFilteredFlags[0][pixelNum] & e41si)
+ && (fPixelFilteredFlags[1][pixelNum] & e41ni))
+ {
+ /* - - - -
+ | |
+ - - - - We have two 4x1s.
+ - - - -
+ | |
+ - - - -
+ */
+
+ upPixel = get4Pixel(row2Ptr);
+ currPixel = get4Pixel(row3Ptr);
+
+ R1 = GetRed(currPixel);
+ G1 = GetGreen(currPixel);
+ B1 = GetBlue(currPixel);
+
+ R0 = GetRed(upPixel);
+ G0 = GetGreen(upPixel);
+ B0 = GetBlue(upPixel);
+
+
+ if ((maxErrorForEightPixels >= 3) && (NewDeltaE(R1, R0, G1, G0, B1, B0, maxErrorForEightPixels)))
+ {
+
+ /* - - - -
+ | | build 4x2.
+ | |
+ - - - -
+ */
+#if kGatherStats == 1
+ blockStats[es42w]++;
+#endif
+ AverageNRound((pixelNum & 0x04) == 0x04, R1, R1, R0, G1, G1, G0, B1, B1, B0);
+
+ if(littleEndian)
+ currPixel = (R1<<16) + (G1<<8) + B1;
+ else if(bigEndian)
+ currPixel = (R1<<24) + (G1<<16) + (B1<<8);
+
+ // Note we write this block out now and do not delay the writes for the postprocessing step since we do not track this block.
+ put4Pixel(row2Ptr, 0, currPixel);
+ put4Pixel(row2Ptr, 1, currPixel);
+ put4Pixel(row2Ptr, 2, currPixel);
+ put4Pixel(row2Ptr, 3, currPixel);
+ put4Pixel(row3Ptr, 0, currPixel);
+ put4Pixel(row3Ptr, 1, currPixel);
+ put4Pixel(row3Ptr, 2, currPixel);
+ put4Pixel(row3Ptr, 3, currPixel);
+
+ fPixelFilteredFlags[0][pixelNum] = fPixelFilteredFlags[0][pixelNum] & ~e41si;
+ fPixelFilteredFlags[0][pixelNum+1] = fPixelFilteredFlags[0][pixelNum+1] & ~e41s;
+ fPixelFilteredFlags[0][pixelNum+2] = fPixelFilteredFlags[0][pixelNum+1] & ~e41s;
+ fPixelFilteredFlags[0][pixelNum+3] = fPixelFilteredFlags[0][pixelNum+1] & ~e41s;
+
+ fPixelFilteredFlags[1][pixelNum] = fPixelFilteredFlags[1][pixelNum] & ~e41ni; // Note that we just formed a 2x2 in the middle of the filtered sets of rows (and do not remember it). We then remove the 2x1s that the 2x2 eliminated.
+ fPixelFilteredFlags[1][pixelNum+1] = fPixelFilteredFlags[1][pixelNum+1] & ~e41n;
+ fPixelFilteredFlags[1][pixelNum+2] = fPixelFilteredFlags[1][pixelNum+1] & ~e41n;
+ fPixelFilteredFlags[1][pixelNum+3] = fPixelFilteredFlags[1][pixelNum+1] & ~e41n;
+ }
+ pixelNum += 4;
+
+ row1Ptr += 4*eBufferedPixelWidthInBytes;
+ row2Ptr += 4*eBufferedPixelWidthInBytes;
+ row3Ptr += 4*eBufferedPixelWidthInBytes;
+ row4Ptr += 4*eBufferedPixelWidthInBytes;
+ }
+ else if ((fPixelFilteredFlags[0][pixelNum] & e21sw)
+ && (fPixelFilteredFlags[1][pixelNum] & e21nw))
+ {
+ /* - -
+ | |
+ - - We have two 2x1s.
+ - -
+ | |
+ - -
+ */
+ ASSERT(!((fPixelFilteredFlags[0][pixelNum] & e11s) | (fPixelFilteredFlags[0][pixelNum+1] & e11s)));
+ ASSERT(!((fPixelFilteredFlags[1][pixelNum] & e11n) | (fPixelFilteredFlags[1][pixelNum+1] & e11n)));
+
+ upPixel = get4Pixel(row2Ptr);
+ currPixel = get4Pixel(row3Ptr);
+
+ R1 = GetRed(currPixel);
+ G1 = GetGreen(currPixel);
+ B1 = GetBlue(currPixel);
+
+ R0 = GetRed(upPixel);
+ G0 = GetGreen(upPixel);
+ B0 = GetBlue(upPixel);
+
+ if ((maxErrorForFourPixels >= 3) && (NewDeltaE(R1, R0, G1, G0, B1, B0, maxErrorForFourPixels)))
+ {
+ /* - -
+ | | build 2x2.
+ | |
+ - -
+ */
+#if kGatherStats == 1
+ blockStats[es22w]++;
+#endif
+ AverageNRound((pixelNum & 0x02) == 0x02, R1, R1, R0, G1, G1, G0, B1, B1, B0);
+
+ if(littleEndian)
+ currPixel = (R1<<16) + (G1<<8) + B1;
+ else if(bigEndian)
+ currPixel = (R1<<24) + (G1<<16) + (B1<<8);
+
+ // Note we write this block out now and do not delay the writes for the postprocessing step since we do not track this block.
+ put4Pixel(row2Ptr, 0, currPixel);
+ put4Pixel(row2Ptr, 1, currPixel);
+ put4Pixel(row3Ptr, 0, currPixel);
+ put4Pixel(row3Ptr, 1, currPixel);
+
+ fPixelFilteredFlags[0][pixelNum] = fPixelFilteredFlags[0][pixelNum] & ~e21sw;
+ fPixelFilteredFlags[0][pixelNum+1] = fPixelFilteredFlags[0][pixelNum+1] & ~e21se;
+
+ fPixelFilteredFlags[1][pixelNum] = fPixelFilteredFlags[1][pixelNum] & ~e21nw; // Note that we just formed a 2x2 in the middle of the filtered sets of rows (and do not remember it). We then remove the 2x1s that the 2x2 eliminated.
+ fPixelFilteredFlags[1][pixelNum+1] = fPixelFilteredFlags[1][pixelNum+1] & ~e21ne;
+ }
+
+ pixelNum += 2;
+
+ row1Ptr += 2*eBufferedPixelWidthInBytes;
+ row2Ptr += 2*eBufferedPixelWidthInBytes;
+ row3Ptr += 2*eBufferedPixelWidthInBytes;
+ row4Ptr += 2*eBufferedPixelWidthInBytes;
+ }
+ else if ((fPixelFilteredFlags[0][pixelNum] & e11s)
+ && (fPixelFilteredFlags[1][pixelNum] & e11n))
+ {
+ /* -
+ | |
+ - We have two 1x1s.
+ -
+ | |
+ -
+ */
+
+ upPixel = get4Pixel(row2Ptr);
+ currPixel = get4Pixel(row3Ptr);
+
+ R1 = GetRed(currPixel);
+ G1 = GetGreen(currPixel);
+ B1 = GetBlue(currPixel);
+
+ R0 = GetRed(upPixel);
+ G0 = GetGreen(upPixel);
+ B0 = GetBlue(upPixel);
+
+ if ((fMaxErrorForTwoPixels >= 3) && (NewDeltaE(R1, R0, G1, G0, B1, B0, fMaxErrorForTwoPixels)))
+ {
+ /* -
+ | | build 1x2.
+ | |
+ -
+ */
+#if kGatherStats == 1
+ blockStats[es12w]++;
+#endif
+ AverageNRound(isOdd(pixelNum), R1, R1, R0, G1, G1, G0, B1, B1, B0);
+
+ if(littleEndian)
+ currPixel = (R1<<16) + (G1<<8) + B1;
+ else if(bigEndian)
+ currPixel = (R1<<24) + (G1<<16) + (B1<<8);
+
+ // Note we write this block out now and do not delay the writes for the postprocessing step since we do not track this block.
+ put4Pixel(row2Ptr, 0, currPixel);
+ put4Pixel(row3Ptr, 0, currPixel);
+
+ fPixelFilteredFlags[0][pixelNum] = fPixelFilteredFlags[0][pixelNum] & ~e11s;
+
+ fPixelFilteredFlags[1][pixelNum] = fPixelFilteredFlags[1][pixelNum] & ~e11n; // Note that we just formed a 2x2 in the middle of the filtered sets of rows (and do not remember it). We then remove the 2x1s that the 2x2 eliminated.
+ }
+
+ pixelNum += 1;
+
+ row1Ptr += eBufferedPixelWidthInBytes;
+ row2Ptr += eBufferedPixelWidthInBytes;
+ row3Ptr += eBufferedPixelWidthInBytes;
+ row4Ptr += eBufferedPixelWidthInBytes;
+ }
+ else // Do no vertical filtering here.
+ {
+ pixelNum += 1;
+
+ row1Ptr += eBufferedPixelWidthInBytes;
+ row2Ptr += eBufferedPixelWidthInBytes;
+ row3Ptr += eBufferedPixelWidthInBytes;
+ row4Ptr += eBufferedPixelWidthInBytes;
+ }
+ }
+}
+
+// Filter3FilteredRows. This routine only exists for the case of the odd size band
+// with three rasters left over. I'm not sure how much extra benifit we really
+// get from running this, but for now I'm leaving it in. Since Ernie deals with
+// block sizes that are powers of two its rather difficult to filter 3 rows together,
+// about all I've been able to do is look for 1 high blocks in the second and third
+// rasters to put together into 2 high blocks. This routine will create 4x2, 2x2, and
+// 1x2 blocks from those second and third rasters.
+void TErnieFilter::Filter3FilteredRows(unsigned char *row1Ptr, unsigned char *row2Ptr, unsigned char *row3Ptr)
+{
+ const unsigned int maxErrorForFourPixels = fMaxErrorForTwoPixels / 2;
+ const unsigned int maxErrorForEightPixels = maxErrorForFourPixels / 2;
+// const unsigned int maxErrorForSixteenPixels = maxErrorForEightPixels / 2;
+// const unsigned int maxErrorForThirtyTwoPixels = maxErrorForSixteenPixels / 2;
+
+ for (int pixelNum = 0; pixelNum < (fRowWidthInPixels-3);) // Make sure we have four pixels to work with
+ {
+// int currPixel, upPixel;
+ uint32_t currPixel, upPixel;
+ int R0, G0, B0, R1, G1, B1;
+
+ if ((fPixelFilteredFlags[0][pixelNum] & e41si)
+ && (fPixelFilteredFlags[1][pixelNum] & e41ni))
+ {
+ /* - - - -
+ | |
+ - - - - We have two 4x1s.
+ - - - -
+ | |
+ - - - -
+ */
+ ASSERT(!((fPixelFilteredFlags[0][pixelNum] & e11s) | (fPixelFilteredFlags[0][pixelNum+1] & e11s)));
+ ASSERT(!((fPixelFilteredFlags[1][pixelNum] & e11n) | (fPixelFilteredFlags[1][pixelNum+1] & e11n)));
+
+ upPixel = get4Pixel(row2Ptr);
+ currPixel = get4Pixel(row3Ptr);
+
+ R1 = GetRed(currPixel);
+ G1 = GetGreen(currPixel);
+ B1 = GetBlue(currPixel);
+
+ R0 = GetRed(upPixel);
+ G0 = GetGreen(upPixel);
+ B0 = GetBlue(upPixel);
+
+
+ if ((maxErrorForEightPixels >= 3) && (NewDeltaE(R1, R0, G1, G0, B1, B0, maxErrorForEightPixels)))
+ {
+
+ /* - - - -
+ | | build 4x2.
+ | |
+ - - - -
+ */
+#if kGatherStats == 1
+ blockStats[es42w]++;
+#endif
+ AverageNRound((pixelNum & 0x04) == 0x04, R1, R1, R0, G1, G1, G0, B1, B1, B0);
+
+ if(littleEndian)
+ currPixel = (R1<<16) + (G1<<8) + B1;
+ else if(bigEndian)
+ currPixel = (R1<<24) + (G1<<16) + (B1<<8);
+
+ // Note we write this block out now and do not delay the writes for the postprocessing step since we do not track this block.
+ put4Pixel(row2Ptr, 0, currPixel);
+ put4Pixel(row2Ptr, 1, currPixel);
+ put4Pixel(row2Ptr, 2, currPixel);
+ put4Pixel(row2Ptr, 3, currPixel);
+ put4Pixel(row3Ptr, 0, currPixel);
+ put4Pixel(row3Ptr, 1, currPixel);
+ put4Pixel(row3Ptr, 2, currPixel);
+ put4Pixel(row3Ptr, 3, currPixel);
+
+ fPixelFilteredFlags[0][pixelNum] = fPixelFilteredFlags[0][pixelNum] & ~e41si;
+ fPixelFilteredFlags[0][pixelNum+1] = fPixelFilteredFlags[0][pixelNum+1] & ~e41s;
+ fPixelFilteredFlags[0][pixelNum+2] = fPixelFilteredFlags[0][pixelNum+1] & ~e41s;
+ fPixelFilteredFlags[0][pixelNum+3] = fPixelFilteredFlags[0][pixelNum+1] & ~e41s;
+
+ fPixelFilteredFlags[1][pixelNum] = fPixelFilteredFlags[1][pixelNum] & ~e41ni; // Note that we just formed a 2x2 in the middle of the filtered sets of rows (and do not remember it). We then remove the 2x1s that the 2x2 eliminated.
+ fPixelFilteredFlags[1][pixelNum+1] = fPixelFilteredFlags[1][pixelNum+1] & ~e41n;
+ fPixelFilteredFlags[1][pixelNum+2] = fPixelFilteredFlags[1][pixelNum+1] & ~e41n;
+ fPixelFilteredFlags[1][pixelNum+3] = fPixelFilteredFlags[1][pixelNum+1] & ~e41n;
+ }
+ pixelNum += 4;
+
+ row1Ptr += 4*eBufferedPixelWidthInBytes;
+ row2Ptr += 4*eBufferedPixelWidthInBytes;
+ row3Ptr += 4*eBufferedPixelWidthInBytes;
+ }
+ else if ((fPixelFilteredFlags[0][pixelNum] & e21sw)
+ && (fPixelFilteredFlags[1][pixelNum] & e21nw))
+ {
+ /* - -
+ | |
+ - - We have two 2x1s.
+ - -
+ | |
+ - -
+ */
+ ASSERT(!((fPixelFilteredFlags[0][pixelNum] & e11s) | (fPixelFilteredFlags[0][pixelNum+1] & e11s)));
+ ASSERT(!((fPixelFilteredFlags[1][pixelNum] & e11n) | (fPixelFilteredFlags[1][pixelNum+1] & e11n)));
+
+ upPixel = get4Pixel(row2Ptr);
+ currPixel = get4Pixel(row3Ptr);
+
+ R1 = GetRed(currPixel);
+ G1 = GetGreen(currPixel);
+ B1 = GetBlue(currPixel);
+
+ R0 = GetRed(upPixel);
+ G0 = GetGreen(upPixel);
+ B0 = GetBlue(upPixel);
+
+ if ((maxErrorForFourPixels >= 3) && (NewDeltaE(R1, R0, G1, G0, B1, B0, maxErrorForFourPixels)))
+ {
+ /* - -
+ | | build 2x2.
+ | |
+ - -
+ */
+#if kGatherStats == 1
+ blockStats[es22w]++;
+#endif
+ AverageNRound((pixelNum & 0x02) == 0x02, R1, R1, R0, G1, G1, G0, B1, B1, B0);
+
+ if(littleEndian)
+ currPixel = (R1<<16) + (G1<<8) + B1;
+ else if(bigEndian)
+ currPixel = (R1<<24) + (G1<<16) + (B1<<8);
+
+ // Note we write this block out now and do not delay the writes for the postprocessing step since we do not track this block.
+ put4Pixel(row2Ptr, 0, currPixel);
+ put4Pixel(row2Ptr, 1, currPixel);
+ put4Pixel(row3Ptr, 0, currPixel);
+ put4Pixel(row3Ptr, 1, currPixel);
+
+ fPixelFilteredFlags[0][pixelNum] = fPixelFilteredFlags[0][pixelNum] & ~e21sw;
+ fPixelFilteredFlags[0][pixelNum+1] = fPixelFilteredFlags[0][pixelNum+1] & ~e21se;
+
+ fPixelFilteredFlags[1][pixelNum] = fPixelFilteredFlags[1][pixelNum] & ~e21nw; // Note that we just formed a 2x2 in the middle of the filtered sets of rows (and do not remember it). We then remove the 2x1s that the 2x2 eliminated.
+ fPixelFilteredFlags[1][pixelNum+1] = fPixelFilteredFlags[1][pixelNum+1] & ~e21ne;
+ }
+
+ pixelNum += 2;
+
+ row1Ptr += 2*eBufferedPixelWidthInBytes;
+ row2Ptr += 2*eBufferedPixelWidthInBytes;
+ row3Ptr += 2*eBufferedPixelWidthInBytes;
+ }
+ else if ((fPixelFilteredFlags[0][pixelNum] & e11s)
+ && (fPixelFilteredFlags[1][pixelNum] & e11n))
+ {
+ /* -
+ | |
+ - We have two 1x1s.
+ -
+ | |
+ -
+ */
+
+ upPixel = get4Pixel(row2Ptr);
+ currPixel = get4Pixel(row3Ptr);
+
+ R1 = GetRed(currPixel);
+ G1 = GetGreen(currPixel);
+ B1 = GetBlue(currPixel);
+
+ R0 = GetRed(upPixel);
+ G0 = GetGreen(upPixel);
+ B0 = GetBlue(upPixel);
+
+ if ((fMaxErrorForTwoPixels >= 3) && (NewDeltaE(R1, R0, G1, G0, B1, B0, fMaxErrorForTwoPixels)))
+ {
+ /* -
+ | | build 1x2.
+ | |
+ -
+ */
+#if kGatherStats == 1
+ blockStats[es12w]++;
+#endif
+ AverageNRound(isOdd(pixelNum), R1, R1, R0, G1, G1, G0, B1, B1, B0);
+
+ if(littleEndian)
+ currPixel = (R1<<16) + (G1<<8) + B1;
+ else if(bigEndian)
+ currPixel = (R1<<24) + (G1<<16) + (B1<<8);
+
+ // Note we write this block out now and do not delay the writes for the postprocessing step since we do not track this block.
+ put4Pixel(row2Ptr, 0, currPixel);
+ put4Pixel(row3Ptr, 0, currPixel);
+
+ fPixelFilteredFlags[0][pixelNum] = fPixelFilteredFlags[0][pixelNum] & ~e11s;
+
+ fPixelFilteredFlags[1][pixelNum] = fPixelFilteredFlags[1][pixelNum] & ~e11n; // Note that we just formed a 2x2 in the middle of the filtered sets of rows (and do not remember it). We then remove the 2x1s that the 2x2 eliminated.
+ }
+
+ pixelNum += 1;
+
+ row1Ptr += eBufferedPixelWidthInBytes;
+ row2Ptr += eBufferedPixelWidthInBytes;
+ row3Ptr += eBufferedPixelWidthInBytes;
+ }
+ else // Do no vertical filtering here.
+ {
+ pixelNum += 1;
+
+ row1Ptr += eBufferedPixelWidthInBytes;
+ row2Ptr += eBufferedPixelWidthInBytes;
+ row3Ptr += eBufferedPixelWidthInBytes;
+ }
+ }
+}
+
+#define NEWTEST true
+
+inline bool TErnieFilter::NewDeltaE(int dr0, int dr1, int dg0, int dg1, int db0, int db1, int tolerance)
+{
+ int Y0, Y1, dY, Cr0, Cr1, Cb0, Cb1, dCr, dCb;
+
+ // new Delta E stuff from Jay
+
+ Y0 = 5*dr0 + 9*dg0 + 2*db0;
+ Y1 = 5*dr1 + 9*dg1 + 2*db1;
+
+ dY = ABS(Y0 - Y1) >> 4;
+
+ if(dY > tolerance) {
+ return false;
+ }
+ else
+ {
+ Cr0 = (dr0 << 4) - Y0;
+ Cr1 = (dr1 << 4) - Y1;
+ dCr = ABS(Cr0 - Cr1) >> 5;
+ if(dCr > tolerance)
+ {
+ return false;
+ }
+ else
+ {
+ Cb0 = (db0 << 4) - Y0;
+ Cb1 = (db1 << 4) - Y1;
+ dCb = ABS(Cb0 - Cb1) >> 6;
+ if(dCb > tolerance)
+ {
+ return false;
+ }
+ }
+ }
+ return true;
+}
+
+TErnieFilter::TErnieFilter(int rowWidthInPixels, pixelTypes pixelType, unsigned int maxErrorForTwoPixels, int bytesPerPixel)
+: fOriginalPixelSize(bytesPerPixel)
+{
+ int index;
+ ASSERT((fOriginalPixelSize == 3) || (fOriginalPixelSize == 4));
+ ASSERT(rowWidthInPixels > 0);
+ ASSERT(pixelType == eBGRPixelData);
+
+ fInternalBufferPixelSize = 4;
+
+ fPixelOffsetIndex = 0;
+ fRowWidthInPixels = rowWidthInPixels;
+ fRowWidthInBytes = fRowWidthInPixels*fInternalBufferPixelSize;
+ fMaxErrorForTwoPixels = maxErrorForTwoPixels;
+
+ for (index = 0; index < 4; index++)
+ {
+ fRowBuf[index] = new uint32_t[rowWidthInPixels];
+ ASSERT(fRowBuf[index]);
+
+ fRowPtr[index] = new unsigned char[rowWidthInPixels*fOriginalPixelSize];
+ ASSERT(fRowPtr[index]);
+
+ fBlackRowPtr[index] = new BYTE[rowWidthInPixels*fOriginalPixelSize];
+ ASSERT(fBlackRowPtr[index]);
+
+ BlackRasterSize[index] = 0;
+ }
+
+ for (index = 0; index < 2; index++)
+ {
+ fPixelFilteredFlags[index] = new unsigned int[rowWidthInPixels];
+ ASSERT(fPixelFilteredFlags[index]);
+ }
+
+ // The least compressible image will be all raw pixels. Maximum compressed size is:
+ // full size + a bloat of Cmd byte + 1 VLI byte per 255 pixels rounded up to nearest integer.
+
+ int maxCompressionBufSize = fRowWidthInBytes + 1 + ((int)ceil((float)MAX((rowWidthInPixels-2)/255, 0)));
+
+ fCompressionOutBuf = new unsigned char[maxCompressionBufSize];
+ ASSERT(fCompressionOutBuf);
+
+ fNumberOfBufferedRows = 0;
+
+ fPixelOffset[0] = 0;
+ fPixelOffset[1] = 5;
+ fPixelOffset[2] = 2;
+ fPixelOffset[3] = 7;
+ fPixelOffset[4] = 1;
+ fPixelOffset[5] = 4;
+ fPixelOffset[6] = 6;
+ fPixelOffset[7] = 3;
+
+ RowIndex = 0;
+}
+
+
+TErnieFilter::~TErnieFilter()
+{
+ // Deallocate memory next.
+ int index;
+
+ for (index = 0; index < 4; index++)
+ {
+ delete [] fRowBuf[index];
+ delete [] fRowPtr[index];
+ delete [] fBlackRowPtr[index];
+ }
+
+ for (index = 0; index < 2; index++)
+ {
+ delete [] fPixelFilteredFlags[index];
+ }
+
+ delete [] fCompressionOutBuf;
+}
+
+void TErnieFilter::writeBufferedRows()
+{
+ int pixelIndex = 0;
+
+ // We just have one lonely raster left. Nothing
+ // we can do but filter it horizontally.
+ if( 1 == fNumberOfBufferedRows)
+ {
+
+ int offset2 = fPixelOffset[fPixelOffsetIndex];
+
+ Filter1RawRow( (unsigned char*)(fRowBuf[0] + offset2),
+ fRowWidthInPixels - fPixelOffset[fPixelOffsetIndex],
+ fPixelFilteredFlags[0] + fPixelOffset[fPixelOffsetIndex]);
+
+
+ unsigned char *rowPtr = fRowPtr[0];
+ ASSERT(rowPtr);
+ pixelIndex = 0;
+ do
+ {
+ memcpy(rowPtr, &fRowBuf[0][pixelIndex], 3);
+ rowPtr += 3;
+ } while (++pixelIndex < fRowWidthInPixels);
+
+ }
+ // If we've got a pair of rasters in the buffer, that pair
+ // has already been filtered somewhat. So lets just write them
+ // out, some filtering is better than none.
+ else if (2 == fNumberOfBufferedRows)
+ {
+ // Write the two rows back out.
+ int k;
+ for (k = 0; k < 2; k++)
+ {
+ unsigned char *rowPtr = fRowPtr[k];
+ ASSERT(rowPtr);
+ pixelIndex = 0;
+ do
+ {
+ memcpy(rowPtr, &fRowBuf[k][pixelIndex], 3);
+ rowPtr += 3;
+ } while (++pixelIndex < fRowWidthInPixels);
+ }
+ }
+ // Okay, if we had three rasters in the buffer, the pair
+ // should have already been written out above, so lets
+ // just run the odd raster through Ernie with to
+ // get the horizontal filtering. [Need to look to see
+ // if there's something more we can do with filtering
+ // all three together.]
+ else if (3 == fNumberOfBufferedRows)
+ {
+
+ int offset2 = fPixelOffset[fPixelOffsetIndex];
+
+ Filter1RawRow( (unsigned char*)(fRowBuf[2] + offset2),
+ fRowWidthInPixels - fPixelOffset[fPixelOffsetIndex],
+ fPixelFilteredFlags[1] + fPixelOffset[fPixelOffsetIndex]);
+
+
+ Filter3FilteredRows( (unsigned char*)fRowBuf[0],
+ (unsigned char*)fRowBuf[1],
+ (unsigned char*)fRowBuf[2]);
+
+ int k;
+ for (k = 0; k < 3; k++)
+ {
+ unsigned char *rowPtr = fRowPtr[k];
+ ASSERT(rowPtr);
+ pixelIndex = 0;
+ do
+ {
+ memcpy(rowPtr, &fRowBuf[k][pixelIndex], 3);
+ rowPtr += 3;
+ } while (++pixelIndex < fRowWidthInPixels);
+ }
+ }
+}
+
+void TErnieFilter::submitRowToFilter(unsigned char *rowPtr)
+{
+ memcpy(fRowPtr[fNumberOfBufferedRows], rowPtr, fRowWidthInPixels*3);
+
+ // Now reformat the pixel data from 24 bit to 32 bit pixels
+ int pixelIndex = 0;
+ uint32_t *RowPtrDest = fRowBuf[fNumberOfBufferedRows];
+ BYTE byte1 = 0;
+ BYTE byte2 = 0;
+ BYTE byte3 = 0;
+ do
+ {
+ byte1 = *rowPtr++;
+ byte2 = *rowPtr++;
+ byte3 = *rowPtr++;
+ if(littleEndian)
+ RowPtrDest[pixelIndex] = ((byte3 << 16) | (byte2 << 8) | (byte1)) & 0x00FFFFFF;
+ else if(bigEndian)
+ RowPtrDest[pixelIndex] = ((byte1 << 24) | (byte2 << 16) | (byte3 << 8)) & 0xFFFFFF00;
+ } while (++pixelIndex < fRowWidthInPixels);
+
+ fNumberOfBufferedRows++;
+
+ iRastersReady=0;
+ iRastersDelivered=0;
+
+ // Next see about filtering & compression.
+ // NOTE 1: as an optimization only do subsections of the raster at a time to stay in cache.
+ // NOTE 2: Could filter the pixels left of the offset.
+ if (2 == fNumberOfBufferedRows)
+ {
+ int offset2 = fPixelOffset[fPixelOffsetIndex];
+
+ Filter2RawRows( (unsigned char*)(fRowBuf[1] + offset2),
+ (unsigned char*)(fRowBuf[0] + offset2),
+ fRowWidthInPixels - fPixelOffset[fPixelOffsetIndex],
+ fPixelFilteredFlags[0] + fPixelOffset[fPixelOffsetIndex]);
+ }
+
+ if (4 == fNumberOfBufferedRows)
+ {
+ int offset4 = fPixelOffset[fPixelOffsetIndex];
+ Filter2RawRows( (unsigned char*)(fRowBuf[3] + offset4),
+ (unsigned char*)(fRowBuf[2] + offset4),
+ fRowWidthInPixels - fPixelOffset[fPixelOffsetIndex],
+ fPixelFilteredFlags[1] + fPixelOffset[fPixelOffsetIndex]);
+
+ Filter2PairsOfFilteredRows( (unsigned char*)fRowBuf[0],
+ (unsigned char*)fRowBuf[1],
+ (unsigned char*)fRowBuf[2],
+ (unsigned char*)fRowBuf[3]);
+
+#if kMemWritesOptimize == 1
+ // Writing the blocks out on a post processing step in this manner could leave the last 3 rows
+ // unfiltered. This is a trade off we make for simplicity. The resulting loss in compression is small.
+ WriteBlockPixels();
+#endif
+
+ fPixelOffsetIndex = (fPixelOffsetIndex + 1) % 8; // cycle the offset index.
+
+ int k;
+ for (k = 0; k < fPixelOffset[fPixelOffsetIndex]; k++) // Clear out the flags that we're offsetting past for this next iteration.
+ {
+ fPixelFilteredFlags[0][k] = eDone;
+ fPixelFilteredFlags[1][k] = eDone;
+ }
+
+ // Write the four rows back out.
+ for (k = 0; k < 4; k++)
+ {
+ unsigned char *rowPtr = fRowPtr[k];
+ ASSERT(rowPtr);
+ pixelIndex = 0;
+ do
+ {
+ memcpy(rowPtr, &fRowBuf[k][pixelIndex], fOriginalPixelSize);
+ rowPtr += fOriginalPixelSize;
+ } while (++pixelIndex < fRowWidthInPixels);
+ }
+
+ fNumberOfBufferedRows = 0;
+ iRastersReady = 4;
+ }
+}
+
+
+#if kMemWritesOptimize == 1
+
+
+/*
+At this point the color for the entire block is stored in the top left
+corner of the block. This routine takes that pixel and smears it into the
+rest of the block.
+*/
+void TErnieFilter::WriteBlockPixels(void)
+{
+ unsigned char *row1Ptr = (unsigned char*)fRowBuf[0];
+ unsigned char *row2Ptr = (unsigned char*)fRowBuf[1];
+ unsigned char *row3Ptr = (unsigned char*)fRowBuf[2];
+ unsigned char *row4Ptr = (unsigned char*)fRowBuf[3];
+
+ for (int flagSet = 0; flagSet <= 1; flagSet++)
+ {
+ unsigned int *flagsPtr = fPixelFilteredFlags[0];
+ unsigned char *rowA = (unsigned char*)fRowBuf[0];
+ unsigned char *rowB = (unsigned char*)fRowBuf[1];
+
+ if (flagSet == 1)
+ {
+ flagsPtr = fPixelFilteredFlags[1];
+ rowA = (unsigned char*)fRowBuf[2];
+ rowB = (unsigned char*)fRowBuf[3];
+ }
+
+ for (int rowIndex = 0; rowIndex < fRowWidthInPixels;)
+ {
+ unsigned int currentFlags = flagsPtr[rowIndex];
+
+#ifndef NDEBUG /* only done for debug builds */
+ int numberOfBitsSet = 0;
+ unsigned int currentFlagsCopy = currentFlags & eTopLeftOfBlocks;
+ while (currentFlagsCopy)
+ {
+ if (currentFlagsCopy & 1) numberOfBitsSet++;
+ currentFlagsCopy >>= 1;
+ }
+ ASSERT( (numberOfBitsSet <= 1) ||
+ ((numberOfBitsSet == 2) &&
+ (((currentFlags & eTopLeftOfBlocks) & ~(e21nw|e21sw|e41ni|e41si))==0)));
+#endif
+
+ if (currentFlags & eTopLeftOfBlocks) // Avoids doing a lot of checks if nothing is set.
+ {
+// unsigned int pixel;
+ uint32_t pixel;
+ // The three possible scenerios are:
+ // 1: No top left of block bits are set.
+ // 2: 1 top left block bit is set.
+ // 3: 2 top left block bits are set. They are 21nw and 21sw.
+
+ // Note: Due to possibly having two groups tracked by this flag we require the north checks to occur before the south checks.
+ if (currentFlags & e22w)
+ {
+ pixel = get4Pixel(rowA, rowIndex);
+
+ put4Pixel(rowB, rowIndex, pixel);
+ rowIndex += 1;
+ put4Pixel(rowA, rowIndex, pixel);
+ put4Pixel(rowB, rowIndex, pixel);
+
+ rowIndex += 1;
+ continue;
+ }
+
+ if (currentFlags & e12)
+ {
+ put4Pixel(rowB, rowIndex, get4Pixel(rowA, rowIndex));
+
+ rowIndex += 1;
+ continue;
+ }
+
+ if (currentFlags & e42i)
+ {
+ pixel = get4Pixel(rowA, rowIndex);
+
+ put4Pixel(rowB, rowIndex, pixel);
+
+ rowIndex += 1;
+ put4Pixel(rowA, rowIndex, pixel);
+ put4Pixel(rowB, rowIndex, pixel);
+
+ rowIndex += 1;
+ put4Pixel(rowB, rowIndex, pixel);
+ put4Pixel(rowA, rowIndex, pixel);
+
+ rowIndex += 1;
+ put4Pixel(rowA, rowIndex, pixel);
+ put4Pixel(rowB, rowIndex, pixel);
+
+ rowIndex += 1;
+ continue;
+ }
+
+ if (currentFlags & e84ni)
+ {
+ pixel = get4Pixel(rowA, rowIndex);
+
+ put4Pixel(row2Ptr, rowIndex, pixel);
+ put4Pixel(row3Ptr, rowIndex, pixel);
+ put4Pixel(row4Ptr, rowIndex, pixel);
+
+ rowIndex += 1;
+ put4Pixel(row1Ptr, rowIndex, pixel);
+ put4Pixel(row2Ptr, rowIndex, pixel);
+ put4Pixel(row3Ptr, rowIndex, pixel);
+ put4Pixel(row4Ptr, rowIndex, pixel);
+
+ rowIndex += 1;
+ put4Pixel(row1Ptr, rowIndex, pixel);
+ put4Pixel(row2Ptr, rowIndex, pixel);
+ put4Pixel(row3Ptr, rowIndex, pixel);
+ put4Pixel(row4Ptr, rowIndex, pixel);
+
+ rowIndex += 1;
+ put4Pixel(row1Ptr, rowIndex, pixel);
+ put4Pixel(row2Ptr, rowIndex, pixel);
+ put4Pixel(row3Ptr, rowIndex, pixel);
+ put4Pixel(row4Ptr, rowIndex, pixel);
+
+ rowIndex += 1;
+ put4Pixel(row1Ptr, rowIndex, pixel);
+ put4Pixel(row2Ptr, rowIndex, pixel);
+ put4Pixel(row3Ptr, rowIndex, pixel);
+ put4Pixel(row4Ptr, rowIndex, pixel);
+
+ rowIndex += 1;
+ put4Pixel(row1Ptr, rowIndex, pixel);
+ put4Pixel(row2Ptr, rowIndex, pixel);
+ put4Pixel(row3Ptr, rowIndex, pixel);
+ put4Pixel(row4Ptr, rowIndex, pixel);
+
+ rowIndex += 1;
+ put4Pixel(row1Ptr, rowIndex, pixel);
+ put4Pixel(row2Ptr, rowIndex, pixel);
+ put4Pixel(row3Ptr, rowIndex, pixel);
+ put4Pixel(row4Ptr, rowIndex, pixel);
+
+ rowIndex += 1;
+ put4Pixel(row1Ptr, rowIndex, pixel);
+ put4Pixel(row2Ptr, rowIndex, pixel);
+ put4Pixel(row3Ptr, rowIndex, pixel);
+ put4Pixel(row4Ptr, rowIndex, pixel);
+
+ rowIndex += 1;
+
+ continue;
+ }
+
+ if (currentFlags & e24nw)
+ {
+ pixel = get4Pixel(row1Ptr, rowIndex);
+
+ put4Pixel(row2Ptr, rowIndex, pixel);
+ put4Pixel(row3Ptr, rowIndex, pixel);
+ put4Pixel(row4Ptr, rowIndex, pixel);
+
+ rowIndex += 1;
+ put4Pixel(row1Ptr, rowIndex, pixel);
+ put4Pixel(row2Ptr, rowIndex, pixel);
+ put4Pixel(row3Ptr, rowIndex, pixel);
+ put4Pixel(row4Ptr, rowIndex, pixel);
+
+ rowIndex += 1;
+ continue;
+ }
+
+ if (currentFlags & e44ni)
+ {
+ pixel = get4Pixel(row1Ptr, rowIndex);
+
+ put4Pixel(row2Ptr, rowIndex, pixel);
+ put4Pixel(row3Ptr, rowIndex, pixel);
+ put4Pixel(row4Ptr, rowIndex, pixel);
+
+ rowIndex += 1;
+ put4Pixel(row1Ptr, rowIndex, pixel);
+ put4Pixel(row2Ptr, rowIndex, pixel);
+ put4Pixel(row3Ptr, rowIndex, pixel);
+ put4Pixel(row4Ptr, rowIndex, pixel);
+
+ rowIndex += 1;
+ put4Pixel(row1Ptr, rowIndex, pixel);
+ put4Pixel(row2Ptr, rowIndex, pixel);
+ put4Pixel(row3Ptr, rowIndex, pixel);
+ put4Pixel(row4Ptr, rowIndex, pixel);
+
+ rowIndex += 1;
+ put4Pixel(row1Ptr, rowIndex, pixel);
+ put4Pixel(row2Ptr, rowIndex, pixel);
+ put4Pixel(row3Ptr, rowIndex, pixel);
+ put4Pixel(row4Ptr, rowIndex, pixel);
+
+ rowIndex += 1;
+ continue;
+ }
+
+ if (currentFlags & e14n)
+ {
+ pixel = get4Pixel(row1Ptr, rowIndex);
+
+ put4Pixel(row2Ptr, rowIndex, pixel);
+ put4Pixel(row3Ptr, rowIndex, pixel);
+ put4Pixel(row4Ptr, rowIndex, pixel);
+
+ rowIndex += 1;
+ continue;
+ }
+
+ if (currentFlags & e21nw)
+ {
+ put4Pixel(rowA, rowIndex+1, get4Pixel(rowA, rowIndex));
+
+ if (!(currentFlags & (e21sw|e41si))) // if no south groups
+ {
+ rowIndex += 2;
+ continue;
+ }
+ }
+
+ if (currentFlags & e41ni)
+ {
+ pixel = get4Pixel(rowA, rowIndex);
+
+ put4Pixel(rowA, rowIndex+1, pixel);
+ put4Pixel(rowA, rowIndex+2, pixel);
+ put4Pixel(rowA, rowIndex+3, pixel);
+
+ if (!(currentFlags & (e21sw|e41si))) // if no south groups.
+ {
+ rowIndex += 2;
+ continue;
+ }
+ }
+
+ if (currentFlags & e21sw)
+ {
+ put4Pixel(rowB, rowIndex+1, get4Pixel(rowB, rowIndex));
+
+ rowIndex += 2;
+ continue;
+ }
+
+ if (currentFlags & e41si)
+ {
+ pixel = get4Pixel(rowB, rowIndex);
+
+ put4Pixel(rowB, rowIndex+1, pixel);
+ put4Pixel(rowB, rowIndex+2, pixel);
+ put4Pixel(rowB, rowIndex+3, pixel);
+
+ rowIndex += 2;
+ continue;
+ }
+ }
+ rowIndex += 1;
+ }
+ }
+}
+
+#endif // kMemWritesOptimize
+
+APDK_END_NAMESPACE
+
+#endif // APDK_DJ9xxVIP && APDK_VIP_COLORFILTERING
diff --git a/prnt/hpijs/filterhpa.h b/prnt/hpijs/filterhpa.h
new file mode 100644
index 0000000..a2a5c52
--- /dev/null
+++ b/prnt/hpijs/filterhpa.h
@@ -0,0 +1,203 @@
+/*****************************************************************************\
+ filterhpa.h : Interface for the TErnieFilter class
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#ifndef APDK_FILTERHPA_H
+#define APDK_FILTERHPA_H
+
+#if defined(APDK_DJ9xxVIP) && defined(APDK_VIP_COLORFILTERING)
+
+APDK_BEGIN_NAMESPACE
+
+/* flags that track the block formations use bits which are specified in the
+ following enumeration. The first number is the horizontal block size. The
+ second number is the vertical block size. Then north (upper) or south (lower)
+ and west (left) or east (right) are specified when appropriate. Finally if a
+ location sequence number is needed then it is listed.
+*/
+
+enum eBlockType
+{
+ eDone = 0x0,
+ e11n = 0x00000001,
+ e11s = 0x00000002,
+ e12 = 0x00000004,
+ e14n = 0x00000008,
+ e14s = 0x00000010,
+ e21nw = 0x00000020,
+ e21ne = 0x00000040,
+ e21sw = 0x00000080,
+ e21se = 0x00000100,
+ e22w = 0x00000200,
+ e22e = 0x00000400,
+ e24nw = 0x00000800,
+ e24ne = 0x00001000,
+ e24sw = 0x00002000,
+ e24se = 0x00004000,
+ e41ni = 0x00008000,
+ e41n = 0x00010000,
+ e41si = 0x00020000,
+ e41s = 0x00040000,
+ e42i = 0x00080000,
+ e42 = 0x00100000,
+ e44ni = 0x00200000,
+ e44n = 0x00400000,
+ e44si = 0x00800000,
+ e44s = 0x01000000,
+ e84ni = 0x02000000,
+ e84n = 0x04000000,
+ e84si = 0x08000000,
+ e84s = 0x10000000,
+
+ eNorths = e11n | e21nw | e21ne | e41ni | e41n,
+ eSouths = e11s | e21sw | e21se | e41si | e41s,
+ eTheRest = ~(eNorths|eSouths),
+
+ eTopLeftOfBlocks = e12 | e14n | e21nw | e21sw | e22w | e24nw | e41ni | e41si | e42i | e44ni | e84ni
+};
+
+#define isOdd(x) (x & 0x01)
+#define isWhite(x) (((x) & kWhite) == kWhite)
+
+#define kMemWritesOptimize 0 // disables mem write optimizations.
+
+//#ifndef kGatherStats
+//#error "must define kGatherStats. Try including platform.h"
+//#endif
+
+#if kGatherStats == 1
+
+// Used now to track blocks being formed. These enums are only used in gathering
+// statistics for the developer to look at later. These are not critical to the actual
+// functioning of the algorithms.
+
+enum StatisticBlocks
+{
+ es11n = 0,
+ es11s,
+ es12,
+ es14n,
+ es14s,
+ es21nw,
+ es21ne,
+ es21sw,
+ es21se,
+ es22w,
+ es22e,
+ es24nw,
+ es24ne,
+ es24sw,
+ es24se,
+ es41ni,
+ es41n,
+ es41si,
+ es41s,
+ es42i,
+ es42,
+ es44ni,
+ es44n,
+ es44si,
+ es44s,
+ es84ni,
+ es84n,
+ es84si,
+ es84s,
+
+ esDoneStat,
+ esWhiteFound,
+
+ eLastAveragingFlagPosition
+};
+
+#endif
+
+enum pixelTypes
+{
+ eBGRPixelData = 0
+};
+
+class TErnieFilter : public Processor
+{
+public:
+ TErnieFilter(int rowWidthInPixels, pixelTypes pixelType, unsigned int maxErrorForTwoPixels, int bytesPerPixel = 3);
+ virtual ~TErnieFilter();
+
+ void submitRowToFilter(unsigned char *rowPtr);
+ void writeBufferedRows();
+
+ // Processor interface /////////////////////////////////////
+ BOOL Process(RASTERDATA* InputRaster=NULL);
+ void Flush();
+ unsigned int GetOutputWidth(COLORTYPE rastercolor);
+ unsigned int GetInputWidth();
+ BYTE* NextOutputRaster(COLORTYPE rastercolor);
+ /////////////////////////////////////////////////////////////
+
+private:
+ uint32_t *fRowBuf[4];
+ unsigned char *fRowPtr[4];
+ BYTE *fBlackRowPtr[4];
+ unsigned int BlackRasterSize[4];
+ unsigned char *fCompressionOutBuf;
+ unsigned int *fPixelFilteredFlags[2];
+
+ int fNumberOfBufferedRows;
+ int fPixelOffset[8];
+ int fPixelOffsetIndex;
+ int fRowWidthInPixels;
+ int fRowWidthInBytes;
+ int fInternalBufferPixelSize;
+ int fOriginalPixelSize;
+ unsigned int fMaxErrorForTwoPixels;
+
+ int RowIndex;
+
+ void Filter1RawRow(unsigned char *currPtr, int rowWidthInPixels, unsigned int *flagsPtr);
+ void Filter2RawRows(unsigned char *currPtr, unsigned char *upPtr, int rowWidthInPixels, unsigned int *flagsPtr);
+ void Filter2PairsOfFilteredRows(unsigned char *row1Ptr, unsigned char *row2Ptr, unsigned char *row3Ptr, unsigned char *row4Ptr);
+ void Filter3FilteredRows(unsigned char *row1Ptr, unsigned char *row2Ptr, unsigned char *row3Ptr);
+ inline unsigned int DeltaE(int dr0, int dr1, int dg0, int dg1, int db0, int db1);
+ inline bool NewDeltaE(int dr0, int dr1, int dg0, int dg1, int db0, int db1, int tolerance);
+ inline unsigned int GradDeltaE(int dr, int dg, int db);
+
+#if kMemWritesOptimize == 1
+ void WriteBlockPixels();
+#endif
+
+ enum
+ {
+ eBufferedPixelWidthInBytes = 4
+ };
+}; //TErnieFilter
+
+APDK_END_NAMESPACE
+
+#endif //APDK_DJ9xxVIP && APDK_VIP_COLORFILTERING
+#endif //APDK_FILTERHPA_H
diff --git a/prnt/hpijs/font.h b/prnt/hpijs/font.h
new file mode 100644
index 0000000..c3405dc
--- /dev/null
+++ b/prnt/hpijs/font.h
@@ -0,0 +1,480 @@
+/*****************************************************************************\
+ font.h : Interface for the font classes
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#ifndef APDK_FONT_H
+#define APDK_FONT_H
+#if defined(APDK_FONTS_NEEDED)
+
+APDK_BEGIN_NAMESPACE
+
+// font names
+const char sCourier[]="Courier";
+const char sCGTimes[]="CGTimes";
+const char sLetterGothic[]="LetterGothic";
+const char sUnivers[]="Univers";
+const char sBad[]="Bad";
+
+class PrintContext;
+
+//Font
+//! Base class for font support
+/*! \class Font font.h "hpprintapi.h"
+This object is used to control printer fonts when sending ASCII data.
+(For systems that lack a reasonable font engine or for some reason can
+benefit from using printer fonts.)
+
+It is not abstract, so that clients can request a font generically,
+but its constructor is not public -- Fonts are rather created
+through RealizeFont -- thus it is effectively "abstract" in this sense.
+Example:
+ Font* myFont = myJob->RealizeFont(FIXED_SERIF,12,...);
+
+Note that Printer initially constructs a dummy font (with default values)
+for each of its typefaces, so that the Is<x>Allowed functions can be
+invoked (for EnumFonts) prior to choosing specific instances.
+Then the Clone function is invoked by Printer::RealizeFont to provide
+instances to client.
+
+\sa ReferenceFont
+******************************************************************************/
+class Font
+{
+friend class Printer;
+friend class TextManager;
+public:
+
+ // constructors are protected -- clients use Job::RealizeFont()
+ virtual ~Font();
+
+ // public functions
+
+ // the base class version is really for printer fonts
+ virtual DRIVER_ERROR GetTextExtent(PrintContext* pPC, const char* pTextString,const int iLenString,
+ int& iHeight, int& iWidth);
+
+////// these functions allow access to properties of derived classes
+
+ //! Returns the typeface name.
+ virtual const char* GetName() const { return sBad; }
+
+ //! Tells whether text bolding is available.
+ virtual BOOL IsBoldAllowed() const { return FALSE; }
+
+ //! Tells whether text italicizing is available.
+ virtual BOOL IsItalicAllowed() const { return FALSE; }
+
+ //! Tells whether text underlining is available.
+ virtual BOOL IsUnderlineAllowed() const { return FALSE; }
+
+ //! Tells whether text coloring is available.
+ virtual BOOL IsColorAllowed() const { return FALSE; }
+
+ //! Tells whether this font is proportionally spaced, as opposed to fixed.
+ virtual BOOL IsProportional() const { return FALSE; }
+
+ //! Tells whether this typeface has serifs.
+ virtual BOOL HasSerif() const { return FALSE; }
+
+
+ /*!
+ For fixed fonts, returns the pitch for given point-size.
+ (Returns zero for proportional fonts.)
+ */
+ virtual BYTE GetPitch(const BYTE pointsize) const
+ { return 0; } // default for proportionals
+
+////// these data members give the properties of the actual instance
+ // as set by the user
+ BYTE iPointsize;
+ BOOL bBold; // boolean TRUE to request bold
+ BOOL bItalic; // boolean TRUE to request italic
+ BOOL bUnderline; // boolean TRUE to request underline
+ TEXTCOLOR eColor; // enum
+ int iPitch;
+
+ // string designating character set (as recognized by firmware)
+ //
+ //!\todo is this comment still valid?
+ // REVISIT: shouldn't really have Translator data here; we
+ // should have an enum here, which is interpreted by Translator
+ char charset[MAX_CHAR_SET];
+
+ BOOL PrinterBased;
+
+ //! Index of point-size from available list for this font.
+ virtual int Index() { return -1; };
+
+ // items for spooling
+// virtual BOOL Equal(Font* f);
+// virtual DRIVER_ERROR Store(FILE* sp, int& size);
+// virtual int SpoolSize();
+#ifdef APDK_CAPTURE
+ SystemServices* pSS;
+ void Capture_dFont(const unsigned int ptr);
+#endif
+protected:
+ // constructor, invoked by derivative constructors
+ Font(int SizesAvailable,BYTE size=0,
+ BOOL bold=FALSE, BOOL italic=FALSE, BOOL underline=FALSE,
+ TEXTCOLOR color=BLACK_TEXT,BOOL printer=TRUE,
+ unsigned int pvres=300,unsigned int phres=300);
+
+ // copy constructor used by RealizeFont
+ Font(const Font& f,const BYTE bSize,
+ const TEXTCOLOR color, const BOOL bold,
+ const BOOL italic, const BOOL underline);
+
+ // return a clone with a different character set
+ // base class version should not be called -- this should be pure virtual!
+ virtual Font* CharSetClone(char* NewCharSet) const;
+
+ int numsizes; // number of available pointsizes
+ // return array of sizes allowed
+ virtual BYTE* GetSizes() const { return (BYTE*)NULL; }
+ // return index of pointsize from array of available pointsizes
+ virtual int Ordinal(unsigned int /* pointsize */) const
+ { return 0; }
+
+ // match arbitrary input size to one we have
+ BYTE AssignSize(BYTE Size);
+ void Subst_Char(int& bCurrChar)const;
+
+ // pointers to the arrays containing widths for a given font
+ // separated into Lo (32..127) & Hi (160..255)
+ const BYTE *pWidthLo[MAX_POINTSIZES];
+ const BYTE *pWidthHi[MAX_POINTSIZES];
+
+ unsigned int PrinterVRes;
+ unsigned int PrinterHRes;
+
+ BOOL internal; // true iff font belongs to printer
+
+}; //Font
+
+//ReferenceFont
+//! Used by Job to realize a font
+/*! \class ReferenceFont font.h "hpprintapi.h"
+Subclass ReferenceFont (EnumFont) is used to query available font properties
+prior to instantiating the font. Whereas Font objects created upon request are
+to be deleted by caller, ReferenceFonts live with the core structures and
+cannot be deleted.
+
+The main purpose of this class is to hide the destructor, since
+the fonts that live with the Printer and are returned by EnumFont
+are meant to remain alive for the life of the Printer.
+
+\sa Font Printer
+******************************************************************************/
+class ReferenceFont : public Font
+{
+friend class Printer; // deletes from its fontarray
+friend class DJ400; // replaces fontarray from base class
+public:
+ ReferenceFont(int SizesAvailable,BYTE size=0,
+ BOOL bold=FALSE, BOOL italic=FALSE, BOOL underline=FALSE,
+ TEXTCOLOR color=BLACK_TEXT,BOOL printer=TRUE,
+ unsigned int pvres=300,unsigned int phres=300);
+protected:
+ ~ReferenceFont();
+
+ // copy constructor used by RealizeFont
+ ReferenceFont(const ReferenceFont& f,const BYTE bSize,
+ const TEXTCOLOR color, const BOOL bold,
+ const BOOL italic, const BOOL underline);
+
+}; //ReferenceFont
+
+
+#ifdef APDK_COURIER
+// fixed-pitch, serif
+
+extern BYTE CourierSizes[];
+
+class Courier : public ReferenceFont
+{
+friend class Printer;
+public:
+ Courier(BYTE size=0,
+ BOOL bold=FALSE, BOOL italic=FALSE, BOOL underline=FALSE,
+ TEXTCOLOR=BLACK_TEXT, unsigned int SizesAvailable=3);
+ virtual ~Courier();
+
+
+ BYTE GetPitch(const BYTE pointsize)const;
+ const char* GetName() const { return sCourier; }
+ BOOL IsBoldAllowed() const { return TRUE; }
+ BOOL IsItalicAllowed() const { return TRUE; }
+ BOOL IsUnderlineAllowed() const { return TRUE; }
+ virtual BOOL IsColorAllowed() const { return TRUE; }
+ BOOL IsProportional() const { return FALSE; }
+ BOOL HasSerif() const { return TRUE; }
+
+ int Index() { return COURIER_INDEX; }
+
+ BYTE unused; // left for future use by clients
+
+protected:
+ Courier(const Courier& f,const BYTE bSize,
+ const TEXTCOLOR color, const BOOL bold,
+ const BOOL italic, const BOOL underline);
+ int Ordinal(unsigned int pointsize)const;
+ virtual BYTE* GetSizes() const { return CourierSizes; }
+ virtual Font* CharSetClone(char* NewCharSet) const
+ { Courier* c = new Courier(*this,iPointsize,eColor,bBold,bItalic,bUnderline);
+ if (c==NULL) return (Font*)NULL;
+ strcpy(c->charset, NewCharSet);
+ return c;
+ }
+}; //Courier
+
+#ifdef APDK_DJ400
+
+extern BYTE Courier400Sizes[];
+
+class Courier400 : public Courier
+{
+friend class DJ400;
+public:
+ Courier400(BYTE size=0,
+ BOOL bold=FALSE, BOOL italic=FALSE, BOOL underline=FALSE);
+
+ BOOL IsColorAllowed() const { return FALSE; }
+
+
+protected:
+ Courier400(const Courier400& f,const BYTE bSize,
+ const TEXTCOLOR color, const BOOL bold,
+ const BOOL italic, const BOOL underline);
+ BYTE* GetSizes() const { return Courier400Sizes; }
+ Font* CharSetClone(char* NewCharSet) const
+ { Courier400* c = new Courier400(*this,iPointsize,eColor,bBold,bItalic,bUnderline);
+ if (c==NULL) return (Font*)NULL;
+ strcpy(c->charset, NewCharSet);
+ return c;
+ }
+}; //Courier400
+
+#endif // APDK_DJ400
+
+#endif // APDK_COURIER
+
+
+#ifdef APDK_CGTIMES
+// proportional, serif
+
+extern BYTE CGTimesSizes[];
+
+class CGTimes : public ReferenceFont
+{
+friend class Printer;
+public:
+ CGTimes(BYTE size=0,
+ BOOL bold=FALSE, BOOL italic=FALSE, BOOL underline=FALSE,
+ TEXTCOLOR=BLACK_TEXT, unsigned int SizesAvailable=5);
+
+ const char* GetName() const { return sCGTimes; }
+ BOOL IsBoldAllowed() const { return TRUE; }
+ BOOL IsItalicAllowed() const { return TRUE; }
+ BOOL IsUnderlineAllowed() const { return TRUE; }
+ virtual BOOL IsColorAllowed() const { return TRUE; }
+ BOOL IsProportional() const { return TRUE; }
+ BOOL HasSerif() const { return TRUE; }
+
+ int Index() { return CGTIMES_INDEX; }
+
+protected:
+ CGTimes(const CGTimes& f,const BYTE bSize,
+ const TEXTCOLOR color, const BOOL bold,
+ const BOOL italic, const BOOL underline);
+ int Ordinal(unsigned int pointsize)const;
+ virtual BYTE* GetSizes() const { return CGTimesSizes; }
+ virtual Font* CharSetClone(char* NewCharSet) const
+ { CGTimes* c = new CGTimes(*this,iPointsize,eColor,bBold,bItalic,bUnderline);
+ if (c==NULL) return (Font*)NULL;
+ strcpy(c->charset, NewCharSet);
+ return c;
+ }
+}; //CGTimes
+
+
+#ifdef APDK_DJ400
+
+extern BYTE CGTimes400Sizes[];
+
+class CGTimes400 : public CGTimes
+{
+friend class DJ400;
+public:
+ CGTimes400(BYTE size=0,
+ BOOL bold=FALSE, BOOL italic=FALSE, BOOL underline=FALSE);
+
+ BOOL IsColorAllowed() const { return FALSE; }
+
+
+protected:
+ CGTimes400(const CGTimes400& f,const BYTE bSize,
+ const TEXTCOLOR color, const BOOL bold,
+ const BOOL italic, const BOOL underline);
+ int Ordinal(unsigned int pointsize)const;
+ BYTE* GetSizes() const { return CGTimes400Sizes; }
+ Font* CharSetClone(char* NewCharSet) const
+ { CGTimes400* c = new CGTimes400(*this,iPointsize,eColor,bBold,bItalic,bUnderline);
+ if (c==NULL) return (Font*)NULL;
+ strcpy(c->charset, NewCharSet);
+ return c;
+ }
+}; //CGTimes400
+
+
+#endif // ifdef APDK_DJ400
+
+#endif // ifdef APDK_CGTIMES
+
+
+#ifdef APDK_LTRGOTHIC
+// fixed-pitch, sans-serif
+
+extern BYTE LetterGothicSizes[];
+
+
+class LetterGothic : public ReferenceFont
+{
+friend class Printer;
+public:
+ LetterGothic(BYTE size=0,
+ BOOL bold=FALSE, BOOL italic=FALSE, BOOL underline=FALSE,
+ TEXTCOLOR=BLACK_TEXT, unsigned int SizesAvailable=3);
+ virtual ~LetterGothic();
+
+
+ BYTE GetPitch(const BYTE pointsize)const;
+ const char* GetName() const { return sLetterGothic; }
+ BOOL IsBoldAllowed() const { return TRUE; }
+ BOOL IsItalicAllowed() const { return TRUE; }
+ BOOL IsUnderlineAllowed() const { return TRUE; }
+ virtual BOOL IsColorAllowed() const { return TRUE; }
+ BOOL IsProportional() const { return FALSE; }
+ BOOL HasSerif() const { return FALSE; }
+
+ int Index() { return LETTERGOTHIC_INDEX; }
+
+ BYTE unused; // left for future use by clients
+
+protected:
+ LetterGothic(const LetterGothic& f,const BYTE bSize,
+ const TEXTCOLOR color, const BOOL bold,
+ const BOOL italic, const BOOL underline);
+ int Ordinal(unsigned int pointsize)const;
+ virtual BYTE* GetSizes() const { return LetterGothicSizes; }
+ virtual Font* CharSetClone(char* NewCharSet) const
+ { LetterGothic* c = new LetterGothic(*this,iPointsize,eColor,bBold,bItalic,bUnderline);
+ if (c==NULL) return (Font*)NULL;
+ strcpy(c->charset, NewCharSet);
+ return c;
+ }
+}; //LettrerGothic
+
+#ifdef APDK_DJ400
+
+extern BYTE LetterGothic400Sizes[];
+
+class LetterGothic400 : public LetterGothic
+{
+friend class DJ400;
+public:
+ LetterGothic400(BYTE size=0,
+ BOOL bold=FALSE, BOOL italic=FALSE, BOOL underline=FALSE);
+
+ BOOL IsColorAllowed() const { return FALSE; }
+
+
+protected:
+ LetterGothic400(const LetterGothic400& f,const BYTE bSize,
+ const TEXTCOLOR color, const BOOL bold,
+ const BOOL italic, const BOOL underline);
+ BYTE* GetSizes() const { return LetterGothic400Sizes; }
+ Font* CharSetClone(char* NewCharSet) const
+ { LetterGothic400* c = new LetterGothic400(*this,iPointsize,eColor,bBold,bItalic,bUnderline);
+ if (c==NULL) return (Font*)NULL;
+ strcpy(c->charset, NewCharSet);
+ return c;
+ }
+}; //LetterGothic400
+
+#endif // APDK_DJ400
+
+#endif // APDK_LTRGOTHIC
+
+
+#ifdef APDK_UNIVERS
+// proportional, sans-serif
+
+extern BYTE UniversSizes[];
+
+class Univers : public ReferenceFont
+{
+friend class Printer;
+public:
+ Univers(BYTE size=0,
+ BOOL bold=FALSE, BOOL italic=FALSE, BOOL underline=FALSE,
+ TEXTCOLOR=BLACK_TEXT, unsigned int SizesAvailable=3);
+
+ const char* GetName() const { return sUnivers; }
+ BOOL IsBoldAllowed() const { return TRUE; }
+ BOOL IsItalicAllowed() const { return TRUE; }
+ BOOL IsUnderlineAllowed() const { return TRUE; }
+ virtual BOOL IsColorAllowed() const { return TRUE; }
+ BOOL IsProportional() const { return TRUE; }
+ BOOL HasSerif() const { return FALSE; }
+
+ int Index() { return UNIVERS_INDEX; }
+
+protected:
+ Univers(const Univers& f,const BYTE bSize,
+ const TEXTCOLOR color, const BOOL bold,
+ const BOOL italic, const BOOL underline);
+ int Ordinal(unsigned int pointsize)const;
+ virtual BYTE* GetSizes() const { return UniversSizes; }
+ virtual Font* CharSetClone(char* NewCharSet) const
+ { Univers* c = new Univers(*this,iPointsize,eColor,bBold,bItalic,bUnderline);
+ if (c==NULL) return (Font*)NULL;
+ strcpy(c->charset, NewCharSet);
+ return c;
+ }
+}; //Univers
+
+#endif // APDK_UNIVERS
+
+APDK_END_NAMESPACE
+
+#endif //APDK_FONTS_NEEDED
+#endif //APDK_FONT_H
+
diff --git a/prnt/hpijs/foomatic-rip-hplip b/prnt/hpijs/foomatic-rip-hplip
new file mode 100644
index 0000000..dc23519
--- /dev/null
+++ b/prnt/hpijs/foomatic-rip-hplip
@@ -0,0 +1,6744 @@
+#!/usr/bin/perl
+# The above Perl path may vary on your system; fix it!!! -*- perl -*-
+
+use strict;
+use POSIX;
+use Cwd;
+
+my $ripversion='$Revision=3.0.2.131$';
+#'# Fix emacs syntax highlighting
+
+# foomatic-rip is a spooler-independent filter script which takes
+# PostScript as standard input and generates the printer's page
+# description language (PDL)/raster format as standard output. This
+# kind of filter is usually called Raster Image Processor (RIP),
+# therefore the name "foomatic-rip".
+
+# Save it in one of the directories of your $PATH, so that it gets
+# found when called from the command line (for spooler-less printing),
+# link it to spooler-specific directories when you use CUPS or PPR:
+
+# ln -s /usr/bin/foomatic-rip /usr/lib/cups/filter/
+# ln -s /usr/bin/foomatic-rip /usr/lib/ppr/lib/
+# ln -s /usr/bin/foomatic-rip /usr/lib/ppr/interfaces/
+
+# Mark this filter world-readable and world-executable (note that most
+# spoolers run the print filters as a special user, as "lp", not as
+# "root" or as the user who sent the job).
+
+# See http://www.openprinting.org/cups-doc.html
+# http://www.openprinting.org/lpd-doc.html
+# http://www.openprinting.org/ppr-doc.html
+# http://www.openprinting.org/pdq-doc.html
+# http://www.openprinting.org/direct-doc.html
+# http://www.openprinting.org/ppd-doc.html
+
+# ==========================================================================
+#
+# User-configurable settings, edit them if needed
+#
+# ==========================================================================
+
+# What path to use for filter programs and such. Your printer driver
+# must be in the path, as must be the renderer, $enscriptcommand, and
+# possibly other stuff. The default path is often fine on Linux, but
+# may not be on other systems.
+#
+my $execpath = "/usr/bin:/usr/local/bin:/usr/bin:/bin";
+
+# CUPS raster drivers are searched here
+my $cupsfilterpath = "/usr/lib/cups/filter:/usr/local/lib/cups/filter:/usr/local/libexec/cups/filter:/opt/cups/filter:/usr/lib/cups/filter";
+
+# Location of the configuration file "filter.conf", this file can be
+# used to change the settings of foomatic-rip without editing
+# foomatic-rip. itself. This variable must contain the full pathname
+# of the directory which contains the configuration file, usually
+# "/etc/foomatic".
+# Some versions of configure do not fully expand $sysconfdir
+my $prefix = "/usr";
+my $configpath = "/etc/foomatic";
+
+# For the stuff below, the settings in the configuration file have priority.
+
+# Set to 1 to insert postscript code for page accounting (CUPS only).
+my $ps_accounting = 1;
+my $accounting_prolog = "";
+
+# Enter here your personal command for converting non-postscript files
+# (especially text) to PostScript. If you leave it blank, at first the
+# line "textfilter: ..." from /etc/foomatic/filter.conf is read and
+# then the commands given on the list below are tried, beginning with
+# the first one.
+# You can set this to "a2ps", "enscript" or "mpage" to select one of the
+# default command strings.
+my $fileconverter = '';
+
+my($kid0,$kid1,$kid2,$kid3,$kid4);
+my($kidfailed,$kid3finished,$kid4finished);
+my($convkidfailed,$dockidfailed,$kid0finished,$kid1finished,$kid2finished);
+my($fileconverterpid,$rendererpid,$fileconverterhandle,$rendererhandle);
+my($jobhasjcl);
+
+# What 'echo' program to use. It needs -e and -n. Linux's builtin
+# and regular echo work fine; non-GNU platforms may need to install
+# gnu echo and put gecho here or something.
+#
+my $myecho = 'echo';
+
+# Which shell to use for executing shell commands. Some of the PPD files
+# specify a FoomaticRIPCommandLine that makes use of constructs not available
+# from a vanilla Bourne shell. On systems where /bin/sh is a vanilla Bourne
+# we need to use a more "modern" shell to execute the command. This will
+# be set via a 'preferred_shell: (shell)' setting in the foomatic.conf file
+# or automatically detected at runtime later on in this program.
+#
+my $modern_shell = '';
+
+# Set debug to 1 to enable the debug logfile for this filter; it will
+# appear as defined by $logfile. It will contain status from this
+# filter, plus the renderer's stderr output. You can also add a line
+# "debug: 1" to your /etc/foomatic/filter.conf to get all your
+# Foomatic filters into debug mode.
+#
+# WARNING: This logfile is a security hole; do not use in production.
+my $debug = 0;
+
+# This is the location of the debug logfile (and also the copy of the
+# processed PostScript data) in case you have enabled debugging above.
+# The logfile will get the extension ".log", the PostScript data ".ps".
+my $logfile = "/tmp/foomatic-rip";
+
+# End interesting enduser options
+
+# ==========================================================================
+#
+# foomatic-rip spooler-independent PS->Printer filter (RIP) of Foomatic
+#
+# Copyright 2002 - 2008 Grant Taylor <gtaylor@picante.com>
+# & Till Kamppeter <till.kamppeter@gmail.com>
+# & Helge Blischke <h.blischke@srz.de>
+#
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+# Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+# USA.
+#
+
+my $added_lf = "\n";
+
+# Flush everything immediately.
+$|=1;
+
+
+
+## Constants used by this filter
+
+# Error codes, as some spooles behave different depending on the reason why
+# the RIP failed, we return an error code. As I have only found a table of
+# error codes for the PPR spooler. If our spooler is really PPR, these
+# definitions get overwritten by the ones of the PPR version currently in
+# use.
+
+my $EXIT_PRINTED = 0; # file was printed normally
+my $EXIT_PRNERR = 1; # printer error occured
+my $EXIT_PRNERR_NORETRY = 2; # printer error with no hope of retry
+my $EXIT_JOBERR = 3; # job is defective
+my $EXIT_SIGNAL = 4; # terminated after catching signal
+my $EXIT_ENGAGED = 5; # printer is otherwise engaged (connection
+ # refused)
+my $EXIT_STARVED = 6; # starved for system resources
+my $EXIT_PRNERR_NORETRY_ACCESS_DENIED = 7; # bad password? bad port
+ # permissions?
+my $EXIT_PRNERR_NOT_RESPONDING = 8; # just doesn't answer at all
+ # (turned off?)
+my $EXIT_PRNERR_NORETRY_BAD_SETTINGS = 9; # interface settings are invalid
+my $EXIT_PRNERR_NO_SUCH_ADDRESS = 10; # address lookup failed, may be
+ # transient
+my $EXIT_PRNERR_NORETRY_NO_SUCH_ADDRESS = 11; # address lookup failed, not
+ # transient
+my $EXIT_INCAPABLE = 50; # printer wants (lacks) features
+ # or resources
+# Standard Unix signal names
+#my SIGHUP = 1;
+#my SIGINT = 2;
+#my SIGQUIT = 3;
+#my SIGKILL = 9;
+#my SIGTERM = 15;
+#my SIGUSR1 = 10;
+#my SIGUSR2 = 12;
+#my SIGTTIN = 21;
+#my SIGTTOU = 22;
+
+my $ESPIPE = 29; # the errno value when seeking a pipe or socket
+
+# The modern_shell() function will register the PIDs of all shell calls,
+# so that rip_die() can kill these processes
+my %pids;
+
+# $kidgeneration stays 0 for the main process, child processes of the
+# main process get $kidgeneration = 1, their children 2, ...
+my $kidgeneration = 0;
+
+# Catch signals
+my $retval = $EXIT_PRINTED;
+use sigtrap qw(handler set_exit_canceled normal-signals
+ handler set_exit_error error-signals
+ handler set_exit_prnerr USR1
+ handler set_exit_prnerr_noretry USR2
+ handler set_exit_engaged TTIN);
+
+
+## Some important variables
+
+# We don't know yet, which spooler will be used. If we don't detect
+# one. we assume that we do spooler-less printing. Supported spoolers
+# are currently:
+
+# cups - CUPS - Common Unix Printing System
+# solaris - Solaris LP (possibly some other SysV LP services as well)
+# lpd - LPD - Line Printer Daemon
+# lprng - LPRng - LPR - New Generation
+# gnulpr - GNUlpr, an enhanced LPD (development stopped)
+# ppr - PPR (foomatic-rip runs as a PPR RIP)
+# ppr_int - PPR (foomatic-rip runs as an interface)
+# cps - CPS - Coherent Printing System
+# pdq - PDQ - Print, Don't Queue (development stopped)
+# direct - Direct, spooler-less printing
+
+my $spooler = 'direct';
+
+# PPD file name
+my $ppdfile = "";
+
+# Printer model
+my $model = "";
+
+# Printer queue name
+my $printer = "";
+
+# Printing options
+my $optstr = "";
+
+# Job ID
+my $jobid = "";
+
+# User who sent job
+my $jobuser = ((getpwuid($<))[0] || `whoami` || "");
+chomp $jobuser;
+
+# Host from which job was sent
+my $jobhost = `hostname`;
+chomp $jobhost;
+
+# Job title
+my $jobtitle = "$jobuser\@$jobhost";
+
+# Number of copies
+my $copies = "1";
+my $rbinumcopies = "0";
+
+# Post pipe (command into which the output of this filter should be piped)
+my $postpipe = "";
+
+# job meta-data file path (for Solaris LP)
+my $attrpath = '';
+
+# Files to be printed
+my @filelist = ();
+
+# Where to send debugging log output. Initialized to STDERR until the command
+# line arguments are parsed.
+my $logh = *STDERR;
+
+# JCL prefix to put before the JCL options (Can be modified by a
+# "*JCLBegin:" keyword in the PPD file):
+my $jclbegin = "\033%-12345X\@PJL\n";
+
+# JCL command to switch the printer to the PostScript interpreter (Can
+# be modified by a "*JCLToPSInterpreter:" keyword in the PPD file):
+my $jcltointerpreter = "";
+
+# JCL command to close a print job (Can be modified by a "*JCLEnd:"
+# keyword in the PPD file):
+my $jclend = "\033%-12345X\@PJL RESET\n";
+
+# Prefix for starting every JCL command (Can be modified by
+# "*FoomaticJCLPrefix:" keyword in the PPD file):
+my $jclprefix = "\@PJL ";
+
+# Under which name were we called and in which directory do we reside
+$0 =~ m!^(.*/)([^/]+)$!;
+my $programdir = $1;
+my $programname = $2;
+
+# Filters to convert non-PostScript files
+my @fileconverters =
+ (# a2ps (converts also other files than text)
+ 'a2ps -1 @@--medium=@@PAGESIZE@@ @@--center-title=@@JOBTITLE@@ -o -',
+ # enscript
+ 'enscript -G @@-M @@PAGESIZE@@ @@-b "Page $%|@@JOBTITLE@@ ' .
+ '--margins=36:36:36:36 --mark-wrapped-lines=arrow --word-wrap -p-',
+ # mpage
+ 'mpage -o -1 @@-b @@PAGESIZE@@ @@-H -h @@JOBTITLE@@ -m36l36b36t36r ' .
+ '-f -P- -');
+
+# spooler-specific file converters, default for the specific spooler when
+# none of the converters above is chosen. Remove weird characters from the
+# command line arguments to enhance security
+my @fixed_args =
+ (defined($ARGV[0])?removespecialchars($ARGV[0]):"",
+ defined($ARGV[1])?removespecialchars($ARGV[1]):"",
+ defined($ARGV[2])?removespecialchars($ARGV[2]):"",
+ defined($ARGV[3])?removespecialchars($ARGV[3]):"",
+ defined($ARGV[4])?removespecialchars($ARGV[4]):"");
+my $spoolerfileconverters = {
+ 'cups' => "${programdir}texttops '$fixed_args[0]' '$fixed_args[1]' '$fixed_args[2]' " .
+ "'$fixed_args[3]' '$fixed_args[4] page-top=36 page-bottom=36 " .
+ "page-left=36 page-right=36 nolandscape cpi=12 lpi=7 " .
+ "columns=1 wrap'"
+ };
+
+## Config file
+
+# Read config file if present
+my %conf = readConfFile("$configpath/filter.conf");
+
+# Get execution path from config file
+$execpath = $conf{execpath} if defined $conf{execpath};
+$ENV{'PATH'} = $execpath;
+
+# Get CUPS filter path from config file
+$cupsfilterpath = $conf{cupsfilterpath} if defined $conf{cupsfilterpath};
+
+# Set debug mode
+$debug = $conf{debug} if defined $conf{debug};
+
+# Determine which filter to use for non-PostScript files to be converted
+# to PostScript
+if (defined $conf{textfilter}) {
+ $fileconverter = $conf{textfilter};
+ $fileconverter eq 'a2ps' and $fileconverter = $fileconverters[0];
+ $fileconverter eq 'enscript' and $fileconverter = $fileconverters[1];
+ $fileconverter eq 'mpage' and $fileconverter = $fileconverters[2];
+}
+
+# Set the preferred shell for "system()" execution
+(defined $conf{preferred_shell}) &&
+ ($modern_shell = $conf{preferred_shell});
+# if none was preferred, look for a shell that will work
+foreach my $shell ('/bin/sh', '/bin/bash', '/bin/ksh', '/bin/zsh') {
+ if (($modern_shell eq '') && (-x $shell)) {
+ open(FD, "| ".$shell." -c \"((0<1))\" 2>/dev/null");
+ (close(FD) == 1) && ($modern_shell = $shell);
+ }
+}
+
+## Environment variables;
+
+# "PPD": PPD file name for CUPS, Solaris, or PPR (if we run as PPR RIP)
+if (defined($ENV{'PPD'})) {
+ # Clean the file name from weird characters which could cause
+ # unexpected behaviour
+ $ppdfile = removespecialchars($ENV{'PPD'});
+ # CUPS, Solaris LP, and PPR (RIP filter) use the "PPD" environment variable
+ # to make the PPD file name available (we set CUPS here preliminarily,
+ # in the next step we check for Solaris LP and the PPR)
+ $spooler = 'cups';
+}
+
+# "SPOOLER_KEY": Solaris LP print service
+if (defined($ENV{'SPOOLER_KEY'})) {
+ $spooler = 'solaris';
+
+ $ppdfile = $ENV{'PPD'};
+ # set the printer name from the PPD file name
+ ($ppdfile =~ m!^.*/([^/]+)\.ppd$!) &&
+ ($printer = $1);
+
+ # Solaris LP may augment the "options" string argument from the command
+ # line with an attributes file ($ATTRPATH)
+ (defined($attrpath = $ENV{'ATTRPATH'})) &&
+ ($optstr = read_attribute_file($attrpath));
+}
+
+# "PPR_VERSION": PPR
+if (defined($ENV{'PPR_VERSION'})) {
+ # We have PPR
+ $spooler = 'ppr';
+}
+
+# "PPR_RIPOPTS": PPR
+if (defined($ENV{'PPR_RIPOPTS'})) {
+ # PPR 1.5 allows the user to specify options for the PPR RIP with the
+ # "--ripopts" option on the "ppr" command line. They are provided to
+ # the RIP via the "PPR_RIPOPTS" environment variable.
+ # Clean the option string from weird characters which could cause
+ # unexpected behaviour
+ $optstr .= removespecialchars("$ENV{'PPR_RIPOPTS'} ");
+ # We have PPR
+ $spooler = 'ppr';
+}
+
+# "LPOPTS": Option settings for some LPD implementations (ex: GNUlpr)
+if (defined($ENV{'LPOPTS'})) {
+ my @lpopts = split(/,/, removespecialchars($ENV{'LPOPTS'}));
+ foreach my $opt (@lpopts) {
+ $opt =~ s/^\s+//;
+ $opt =~ s/\s+$//;
+ if ($opt =~ /\s+/) {
+ $opt = "\"$opt\"";
+ }
+ $optstr .= "$opt ";
+ }
+ # We have an LPD which accepts "-o" for options
+ $spooler = 'gnulpr';
+}
+
+
+
+## Named command line options
+
+# We do not use Getopt::Long because it does not work when between the
+# option and the argument is no space ("-w80" instead of "-w 80"). This
+# happens in the command line of LPRng, but also users could type in
+# options this way when printing without spooler.
+
+# Make one option string with a non-printable character as separator,
+# So we can parse it more easily.
+
+# To avoid the separator to be in the options itselves, it is filters
+# out of the options. This does not break anything as having non
+# printable characters in the command line options does not make sense
+# nor is this needed. This way misinterpretation and even abuse is
+# prevented.
+
+my $argstr = "\x01" .
+ join("\x01", map { removeunprintables($_) } @ARGV) . "\x01";
+
+# Version check
+if ($argstr =~ /^\x01-(h|v|-help|-version)\x01$/i) {
+ my $ver;
+ if ($ripversion =~ /^\$Revision=(.*)\$$/) {
+ $ver = $1;
+ } else {
+ $ver = "Unknown";
+ }
+ print "foomatic-rip revision $ver\n";
+ print "\"man foomatic-rip\" for help.\n";
+ exit 0;
+}
+
+# Debug mode activated via command line
+if ($argstr =~ s/\x01--debug\x01/\x01/) {
+ $debug = 1;
+}
+
+# Command line options for verbosity
+my $verbose = ($argstr =~ s/\x01-v\x01/\x01/);
+my $quiet = ($argstr =~ s/\x01-q\x01/\x01/);
+my $show_docs = ($argstr =~ s/\x01-d\x01/\x01/);
+my $do_docs;
+my $cupscolorprofile;
+
+if ($debug) {
+ # Grotesquely unsecure; use for debugging only
+ open LOG, "> ${logfile}.log";
+ $logh = *LOG;
+
+ use IO::Handle;
+ $logh->autoflush(1);
+} elsif (($quiet) && (!$verbose)) {
+ # Quiet mode, do not log
+ open LOG, "> /dev/null";
+ $logh = *LOG;
+
+ use IO::Handle;
+ $logh->autoflush(1);
+} else {
+ # Default: log to STDERR
+ $logh=*STDERR;
+}
+
+
+
+## Start debug logging
+if ($debug) {
+ # If we are not in debug mode, we do this later, as we must find out at
+ # first which spooler is used. When printing without spooler we
+ # suppress logging because foomatic-rip is called directly on the
+ # command line and so we avoid logging onto the console.
+ print $logh "foomatic-rip version $ripversion running...\n";
+ # Print the command line only in debug mode, Mac OS X adds very many
+ # options so that CUPS cannot handle the output of the command line
+ # in its log files. If CUPS encounters a line with more than 1024
+ # characters sent into its log files, it aborts the job with an error.
+ if (($debug) || ($spooler ne 'cups')) {
+ print $logh "called with arguments: '", join("', '",@ARGV), "'\n";
+ }
+}
+
+
+
+## Continue with named options
+
+# Check for LPRng first so we do not pick up bogus ppd files by the -p option
+if ($argstr =~ s/\x01--lprng\x01/\x01/) {
+ # We have LPRng
+ $spooler = 'lprng';
+}
+# 'PRINTCAP_ENTRY' environment variable is : LPRng
+# the :ppd=/path/to/ppdfile printcap entry should be used
+if (defined($ENV{'PRINTCAP_ENTRY'})){
+ $spooler = 'lprng';
+ my( @pc);
+ @pc = split( /\s*:\s*/, $ENV{'PRINTCAP_ENTRY'} );
+ shift @pc;
+ foreach (@pc) {
+ if( /^ppd=(.*)$/ or /^ppdfile=(.*)$/ ){
+ $ppdfile = removespecialchars($1) if $1;
+ }
+ }
+} elsif ($argstr =~ s/\x01--lprng\x01/\x01/g) {
+ # We have LPRng
+ $spooler = 'lprng';
+}
+
+
+# PPD file name given via the command line
+# allow duplicates, and use the last specified one
+while ( ($spooler ne 'lprng') and ($argstr =~ s/\x01-p(\x01|)([^\x01]+)\x01/\x01/)) {
+ $ppdfile = $2;
+}
+while ($argstr =~ s/\x01--ppd(\x01|=|)([^\x01]+)\x01/\x01/) {
+ $ppdfile = $2;
+}
+
+# Check for LPD/GNUlpr by typical options which the spooler puts onto
+# the filter's command line (options "-w": text width, "-l": text
+# length, "-i": indent, "-x", "-y": graphics size, "-c": raw printing,
+# "-n": user name, "-h": host name)
+if ($argstr =~ s/\x01-h(\x01|)([^\x01]+)\x01/\x01/) {
+ # We have LPD or GNUlpr
+ if (($spooler ne 'lpd') && ($spooler ne 'gnulpr') && ($spooler ne 'lprng')) {
+ $spooler = 'lpd';
+ }
+ $jobhost = $2;
+}
+if ($argstr =~ s/\x01-n(\x01|)([^\x01]+)\x01/\x01/) {
+ # We have LPD or GNUlpr
+ if (($spooler ne 'lpd') && ($spooler ne 'gnulpr') && ($spooler ne 'lprng')) {
+ $spooler = 'lpd';
+ }
+ $jobuser = $2;
+}
+if (($argstr =~ s/\x01-w(\x01|)\d+\x01/\x01/) ||
+ ($argstr =~ s/\x01-l(\x01|)\d+\x01/\x01/) ||
+ ($argstr =~ s/\x01-x(\x01|)\d+\x01/\x01/) ||
+ ($argstr =~ s/\x01-y(\x01|)\d+\x01/\x01/) ||
+ ($argstr =~ s/\x01-i(\x01|)\d+\x01/\x01/) ||
+ ($argstr =~ s/\x01-c\x01/\x01/)) {
+ # We have LPD or GNUlpr
+ if (($spooler ne 'lpd') && ($spooler ne 'gnulpr') && ($spooler ne 'lprng')) {
+ $spooler = 'lpd';
+ }
+}
+
+# LPRng delivers the option settings via the "-Z" argument
+if ($argstr =~ s/\x01-Z(\x01|)([^\x01]+)\x01/\x01/) {
+ my @lpopts = split(/,/, $2);
+ foreach my $opt (@lpopts) {
+ $opt =~ s/^\s+//;
+ $opt =~ s/\s+$//;
+ $opt = removeshellescapes($opt);
+ if ($opt =~ /\s+/) {
+ $opt = "\"$opt\"";
+ }
+ $optstr .= "$opt ";
+ }
+ # We have LPRng
+ $spooler = 'lprng';
+}
+
+# Job title and options for stock LPD
+if ($argstr =~ s/\x01-[jJ](\x01|)([^\x01]+)\x01/\x01/) {
+ # An LPD
+ $jobtitle = removeshellescapes($2);
+ # Classic LPD hack
+ if ($spooler eq "lpd") {
+ $optstr .= "$jobtitle ";
+ }
+}
+
+# Check for CPS
+if ($argstr =~ s/\x01--cps\x01/\x01/) {
+ # We have cps
+ $spooler = 'cps';
+}
+
+# Options for spooler-less printing, CPS, or PDQ
+while ($argstr =~ s/\x01-o(\x01|)([^\x01]+)\x01/\x01/) {
+ my $opt = $2;
+ $opt =~ s/^\s+//;
+ $opt =~ s/\s+$//;
+ $opt = removeshellescapes($opt);
+ if ($opt =~ /\s+/) {
+ $opt = "\"$opt\"";
+ }
+ $optstr .= "$opt ";
+ # If we don't print as a PPR RIP or as a CPS filter, we print without
+ # spooler (we check for PDQ later)
+ if (($spooler ne 'ppr') && ($spooler ne 'cps')) {
+ $spooler = 'direct';
+ }
+}
+
+# Printer for spooler-less printing or PDQ
+if ($argstr =~ s/\x01-d(\x01|)([^\x01]+)\x01/\x01/) {
+ $printer = removeshellescapes($2);
+}
+# Printer for spooler-less printing, PDQ, or LPRng
+if ($argstr =~ s/\x01-P(\x01|)([^\x01]+)\x01/\x01/) {
+ $printer = removeshellescapes($2);
+}
+
+# Were we called from a PDQ wrapper?
+if ($argstr =~ s/\x01--pdq\x01/\x01/) {
+ # We have PDQ
+ $spooler = 'pdq';
+}
+
+# Were we called to build the PDQ driver declaration file?
+# "--appendpdq=<file>" appends the data to the <file>,
+# "--genpdq=<file>" creates/overwrites <file> for the data, and
+# "--genpdq" writes to standard output
+my $genpdqfile = "";
+if (($argstr =~ s/\x01--(gen)(raw|)pdq(\x01|=|)([^\x01]*)\x01/\x01/) ||
+ ($argstr =~ s/\x01--(append)(raw|)pdq(\x01|=|)([^\x01]+)\x01/\x01/)) {
+ # Determine output file name
+ if (!$4) {
+ $genpdqfile = ">&STDOUT";
+ } else {
+ if ($1 eq 'gen') {
+ $genpdqfile = "> " . removeshellescapes($4);
+ } else {
+ $genpdqfile = ">> " . removeshellescapes($4);
+ }
+ }
+ # Do we want to have a PDQ driver declaration for a raw printer?
+ if ($2 eq 'raw') {
+ my $time = time();
+ my @pdqfile =
+"driver \"Raw-Printer-$time\" {
+ # This PDQ driver declaration file was generated automatically by
+ # foomatic-rip to allow raw (filter-less) printing.
+ language_driver all {
+ # We accept all file types and pass them through without any changes
+ filetype_regx \"\"
+ convert_exec {
+ ln -s \$INPUT \$OUTPUT
+ }
+ }
+ filter_exec {
+ ln -s \$INPUT \$OUTPUT
+ }
+}";
+ open PDQFILE, $genpdqfile or
+ rip_die("Cannot write PDQ driver declaration file",
+ $EXIT_PRNERR_NORETRY_BAD_SETTINGS);
+ print PDQFILE join('', @pdqfile);
+ close PDQFILE;
+ exit $EXIT_PRINTED;
+ }
+ # We have PDQ
+ $spooler = 'pdq';
+}
+
+
+# remove extra spacing if running as LPRng filter
+$added_lf = "" if $spooler eq 'lprng';
+
+## Command line arguments without name
+
+# Remaining arguments
+my @rargs = split(/\x01/, $argstr);
+shift @rargs;
+
+# Load definitions for PPR error messages, check whether we run as
+# PPR interface or as PPR RIP
+my( $ppr_printer, $ppr_address, $ppr_options, $ppr_jobbreak, $ppr_feedback,
+ $ppr_codes, $ppr_jobname, $ppr_routing, $ppr_for, $ppr_filetype,
+ $ppr_filetoprint );
+if ($spooler eq 'ppr') {
+ # Read interface.sh so we will know the correct exit codes and
+ # also signal.sh for the signal codes
+ my $deffound = 0; # Did we find one of the definition files
+ my @definitions;
+ for my $file (("lib/interface.sh", "lib/signal.sh")) {
+
+ open FILE, "< $file" || do {
+ print $logh "error opening $file.\n";
+ next;
+ };
+
+ $deffound = 1;
+ while(my $line = <FILE>) {
+ # Translate the shell script to Perl
+ if (($line !~ m/^\s*$/) && ($line !~ m/^\s*\#/)) {
+ $line =~ s/^\s*([^\#\s]*)/\$$1;/;
+ push (@definitions, $line);
+ }
+ }
+ close FILE;
+ }
+
+ if ($deffound) {
+ # Apply the definitions loaded from PPR
+ eval join('',@definitions) || do {
+ print $logh "unable to evaluate definitions\n";
+ rip_die ("Error in definitions evaluation",
+ $EXIT_PRNERR_NORETRY_BAD_SETTINGS);
+ };
+ }
+
+ # Check whether we run as a PPR interface (if not, we run as a PPR RIP)
+ if (($rargs[3] =~ /^\s*\d\d?\s*$/) &&
+ ($rargs[5] =~ /^\s*\d\d?\s*$/) &&
+ (($#rargs == 10) || ($#rargs == 9) || ($#rargs == 7))) {
+ # PPR calls interfaces with many command line parameters,
+ # where the forth and the sixth is a small integer
+ # number. In addition, we have 8 (PPR <= 1.31), 10
+ # (PPR>=1.32), 11 (PPR >= 1.50) command line parameters.
+ # We also check whether the current working directory is a
+ # PPR directory.
+
+ # Get all command line parameters
+ $ppr_printer = removeshellescapes($rargs[0]);
+ $ppr_address = $rargs[1];
+ $ppr_options = removeshellescapes($rargs[2]);
+ $ppr_jobbreak = $rargs[3];
+ $ppr_feedback = $rargs[4];
+ $ppr_codes = $rargs[5];
+ $ppr_jobname = removeshellescapes($rargs[6]);
+ $ppr_routing = removeshellescapes($rargs[7]);
+ $ppr_for = $rargs[8];
+ $ppr_filetype = $rargs[9];
+ $ppr_filetoprint = removeshellescapes($rargs[10]);
+
+ # Common job parameters
+ $printer = $ppr_printer;
+ $jobtitle = $ppr_jobname;
+ if ((!$jobtitle) && ($ppr_filetoprint)) {
+ $jobtitle = $ppr_filetoprint;
+ }
+ $optstr .= "$ppr_options $ppr_routing";
+
+ # Get the path of the PPD file from the queue configuration
+ $ppdfile = `LANG=en_US; ppad show $ppr_printer | grep PPDFile`;
+ $ppdfile = removeshellescapes($ppdfile);
+ $ppdfile =~ s/PPDFile:\s+//;
+ if ($ppdfile !~ m!^/!) {
+ $ppdfile = "../../share/ppr/PPDFiles/$ppdfile";
+ }
+ chomp($ppdfile);
+
+ # We have PPR and run as an interface
+ $spooler = 'ppr_int';
+ }
+}
+
+# CUPS
+my( $cups_jobid, $cups_user, $cups_jobtitle, $cups_copies, $cups_options,
+ $cups_filename );
+if ($spooler eq 'cups') {
+
+ # Use CUPS font path ("FontPath" in /etc/cups/cupsd.conf)
+ if ($ENV{'CUPS_FONTPATH'}) {
+ $ENV{'GS_LIB'} = $ENV{'CUPS_FONTPATH'} .
+ ($ENV{'GS_LIB'} ? ":$ENV{'GS_LIB'}" : "");
+ } else {
+ if ($ENV{'CUPS_DATADIR'}) {
+ $ENV{'GS_LIB'} = "$ENV{'CUPS_DATADIR'}/fonts" .
+ ($ENV{'GS_LIB'} ? ":$ENV{'GS_LIB'}" : "");
+ }
+ }
+
+ # Get all command line parameters
+ $cups_jobid = removeshellescapes($rargs[0]);
+ $cups_user = removeshellescapes($rargs[1]);
+ $cups_jobtitle = removeshellescapes($rargs[2]);
+ $cups_copies = removeshellescapes($rargs[3]);
+ $cups_options = removeshellescapes($rargs[4]);
+ $cups_filename = removeshellescapes($rargs[5]);
+
+ # Common job parameters
+ #$printer = $cups_printer;
+ $jobid = $cups_jobid;
+ $jobtitle = $cups_jobtitle;
+ $jobuser = $cups_user;
+ $copies = $cups_copies;
+ $optstr .= $cups_options;
+
+ # Check for and handle inputfile vs stdin
+ if ((defined($cups_filename)) && ($cups_filename) &&
+ ($cups_filename ne '-')) {
+ # We get the input from a file
+ @filelist = ($cups_filename);
+ print $logh "Getting input from file $cups_filename\n";
+ }
+}
+
+# Solaris LP spooler
+if ($spooler eq 'solaris') {
+ # Get all command line parameters
+ # $printer = # argv[0]
+ # ($rargs[0] =~ m!^.*/([^/]+)$!);
+ # $request_id = removeshellescapes($rargs[0]); # argv[1]
+ # $user_name = removeshellescapes($rargs[1]); # argv[2]
+ $jobtitle = removeshellescapes($rargs[2]); # argv[3]
+ # $copies = removeshellescapes($rargs[3]); # argv[4] # handled by the
+ # interface script
+ $optstr .= removeshellescapes($rargs[4]); # argv[5]
+ ($#rargs > 4) && # argv[6...]
+ (@filelist = @rargs[5, $#rargs]);
+}
+
+# LPD/LPRng/GNUlpr
+if (($spooler eq 'lpd') ||
+ ($spooler eq 'lprng' and !$ppdfile) ||
+ ($spooler eq 'gnulpr')) {
+
+ # Get PPD file name as the last command line argument
+ $ppdfile = $rargs[$#rargs];
+
+}
+
+
+# No spooler, CPS, or PDQ
+if (($spooler eq 'direct') || ($spooler eq 'cps') || ($spooler eq 'pdq')) {
+ # Which files do we want to print?
+ @filelist = map { removeshellescapes($_) } @rargs;
+}
+
+
+
+## Additional spooler-specific preparations
+
+# CUPS
+
+if ($spooler eq 'cups') {
+
+ # This piece of PostScript code (initial idea 2001 by Michael
+ # Allerhand (michael.allerhand at ed dot ac dot uk, vastly
+ # improved by Till Kamppeter in 2002) lets GhostScript output
+ # the page accounting information which CUPS needs on standard
+ # error.
+ # Redesign by Helge Blischke (2004-11-17):
+ # - As the PostScript job itself may define BeginPage and/or EndPage
+ # procedures, or the alternate pstops filter may have inserted
+ # such procedures, we make sure that the accounting routine
+ # will safely coexist with those. To achieve this, we force
+ # - the accountint stuff to be inserted at the very end of the
+ # PostScript job's setup section,
+ # - the accounting stuff just using the return value of the
+ # existing EndPage procedure, if any (and providing a default one
+ # if not).
+ # - As PostScript jobs may contain calls to setpagedevice "between"
+ # pages, e.g. to change media type, do in-job stapling, etc.,
+ # we cannot rely on the "showpage count since last pagedevice
+ # activation" but instead count the physical pages by ourselves
+ # (in a global dictionary).
+
+ if (defined $conf{ps_accounting}) {
+ $ps_accounting = $conf{ps_accounting};
+ }
+ $accounting_prolog = $ps_accounting ? "[{
+%% Code for writing CUPS accounting tags on standard error
+
+/cupsPSLevel2 % Determine whether we can do PostScript level 2 or newer
+ systemdict/languagelevel 2 copy
+ known{get exec}{pop pop 1}ifelse 2 ge
+def
+
+cupsPSLevel2
+{ % in case of level 2 or higher
+ currentglobal true setglobal % define a dictioary foomaticDict
+ globaldict begin % in global VM and establish a
+ /foomaticDict % pages count key there
+ <<
+ /PhysPages 0
+ >>def
+ end
+ setglobal
+}if
+
+/cupsGetNumCopies { % Read the number of Copies requested for the current
+ % page
+ cupsPSLevel2
+ {
+ % PS Level 2+: Get number of copies from Page Device dictionary
+ currentpagedevice /NumCopies get
+ }
+ {
+ % PS Level 1: Number of copies not in Page Device dictionary
+ null
+ }
+ ifelse
+ % Check whether the number is defined, if it is \"null\" use #copies
+ % instead
+ dup null eq {
+ pop #copies
+ }
+ if
+ % Check whether the number is defined now, if it is still \"null\" use 1
+ % instead
+ dup null eq {
+ pop 1
+ } if
+} bind def
+
+/cupsWrite { % write a string onto standard error
+ (%stderr) (w) file
+ exch writestring
+} bind def
+
+/cupsFlush % flush standard error to make it sort of unbuffered
+{
+ (%stderr)(w)file flushfile
+}bind def
+
+cupsPSLevel2
+{ % In language level 2, we try to do something reasonable
+ <<
+ /EndPage
+ [ % start the array that becomes the procedure
+ currentpagedevice/EndPage 2 copy known
+ {get} % get the existing EndPage procedure
+ {pop pop {exch pop 2 ne}bind}ifelse % there is none, define the default
+ /exec load % make sure it will be executed, whatever it is
+ /dup load % duplicate the result value
+ { % true: a sheet gets printed, do accounting
+ currentglobal true setglobal % switch to global VM ...
+ foomaticDict begin % ... and access our special dictionary
+ PhysPages 1 add % count the sheets printed (including this one)
+ dup /PhysPages exch def % and save the value
+ end % leave our dict
+ exch setglobal % return to previous VM
+ (PAGE: )cupsWrite % assemble and print the accounting string ...
+ 16 string cvs cupsWrite % ... the sheet count ...
+ ( )cupsWrite % ... a space ...
+ cupsGetNumCopies % ... the number of copies ...
+ 16 string cvs cupsWrite % ...
+ (\\n)cupsWrite % ... a newline
+ cupsFlush
+ }/if load
+ % false: current page gets discarded; do nothing
+ ]cvx bind % make the array executable and apply bind
+ >>setpagedevice
+}
+{
+ % In language level 1, we do no accounting currently, as there is no global VM
+ % the contents of which are undesturbed by save and restore.
+ % If we may be sure that showpage never gets called inside a page related save / restore pair
+ % we might implement an hack with showpage similar to the one above.
+}ifelse
+
+} stopped cleartomark
+" : "";
+
+ # On which queue are we printing?
+ # CUPS gives the PPD file the same name as the printer queue,
+ # so we can get the queue name from the name of the PPD file.
+ $ppdfile =~ m!^(.*/)([^/]+)\.ppd$!;
+ $printer = $2;
+}
+
+# No spooler, CPS, or PDQ
+
+if (($spooler eq 'direct') || ($spooler eq 'cps') || ($spooler eq 'pdq')) {
+
+ # Path for personal Foomatic configuration
+ my $user_default_path = "$ENV{'HOME'}/.foomatic";
+
+ if (!$ppdfile) {
+ if (!$printer) {
+ # No printer definition file selected, check whether we have a
+ # default printer defined.
+ for my $conf_file (("./.directconfig",
+ "./directconfig",
+ "./.config",
+ "$user_default_path/direct/.config",
+ "$user_default_path/direct.conf",
+ "$configpath/direct/.config",
+ "$configpath/direct.conf")) {
+ if (open CONFIG, "< $conf_file") {
+ while (my $line = <CONFIG>) {
+ chomp $line;
+ if ($line =~ /^default\s*:\s*([^:\s]+)\s*$/) {
+ $printer = $1;
+ last;
+ }
+ }
+ close CONFIG;
+ }
+ if ($printer) {
+ last;
+ }
+ }
+ }
+
+ # Neither in a config file nor on the command line a printer was
+ # selected.
+ if (!$printer) {
+ rip_die("No printer definition (option \"-P <name>\") " .
+ "specified!", $EXIT_PRNERR_NORETRY_BAD_SETTINGS);
+ }
+
+ # Search for the PPD file
+
+ # Search also common spooler-specific locations, this way a printer
+ # configured under a certain spooler can also be used without
+ # spooler
+
+ if (-r $printer) {
+ $ppdfile = $printer;
+ # CPS can have the PPD in the spool directory
+ } elsif (($spooler eq 'cps') &&
+ (-r "/var/spool/lpd/${printer}/${printer}.ppd")) {
+ $ppdfile = "/var/spool/lpd/${printer}/${printer}.ppd";
+ } elsif (($spooler eq 'cps') &&
+ (-r "/var/local/spool/lpd/${printer}/${printer}.ppd")) {
+ $ppdfile = "/var/local/spool/lpd/${printer}/${printer}.ppd";
+ } elsif (($spooler eq 'cps') &&
+ (-r "/var/local/lpd/${printer}/${printer}.ppd")) {
+ $ppdfile = "/var/local/lpd/${printer}/${printer}.ppd";
+ } elsif (($spooler eq 'cps') &&
+ (-r "/var/spool/lpd/${printer}.ppd")) {
+ $ppdfile = "/var/spool/lpd/${printer}.ppd";
+ } elsif (($spooler eq 'cps') &&
+ (-r "/var/local/spool/lpd/${printer}.ppd")) {
+ $ppdfile = "/var/local/spool/lpd/${printer}.ppd";
+ } elsif (($spooler eq 'cps') &&
+ (-r "/var/local/lpd/${printer}.ppd")) {
+ $ppdfile = "/var/local/lpd/${printer}.ppd";
+ } elsif (-r "${printer}.ppd") { # current dir
+ $ppdfile = "${printer}.ppd";
+ } elsif (-r "$user_default_path/${printer}.ppd") { # user dir
+ $ppdfile = "$user_default_path/${printer}.ppd";
+ } elsif (-r "$configpath/direct/${printer}.ppd") { # system dir
+ $ppdfile = "$configpath/direct/${printer}.ppd";
+ } elsif (-r "$configpath/${printer}.ppd") { # system dir
+ $ppdfile = "$configpath/${printer}.ppd";
+ } elsif (-r "/etc/cups/ppd/${printer}.ppd") { # CUPS config dir
+ $ppdfile = "/etc/cups/ppd/${printer}.ppd";
+ } elsif (-r "/usr/local/etc/cups/ppd/${printer}.ppd") {
+ $ppdfile = "/usr/local/etc/cups/ppd/${printer}.ppd";
+ } elsif (-r "/usr/share/ppr/PPDFiles/${printer}.ppd") { # PPR PPDs
+ $ppdfile = "/usr/share/ppr/PPDFiles/${printer}.ppd";
+ } elsif (-r "/usr/local/share/ppr/PPDFiles/${printer}.ppd") {
+ $ppdfile = "/usr/local/share/ppr/PPDFiles/${printer}.ppd";
+ } else {
+ rip_die ("There is no readable PPD file for the printer " .
+ "$printer, is it configured?",
+ $EXIT_PRNERR_NORETRY_BAD_SETTINGS);
+ }
+ }
+}
+
+
+
+## Files to be printed (can be more than one for spooler-less printing)
+
+# Empty file list -> print STDIN
+if ($#filelist < 0) {
+ @filelist = ("<STDIN>");
+}
+
+# Check file list
+my $file;
+my $filecnt = 0;
+for $file (@filelist) {
+ if ($file ne "<STDIN>") {
+ if ($file =~ /^-/) {
+ rip_die ("Invalid argument: $file",
+ $EXIT_PRNERR_NORETRY_BAD_SETTINGS);
+ } elsif (! -r $file) {
+ print $logh "File $file does not exist/is not readable\n";
+ splice(@filelist, $filecnt, 1);
+ $filecnt --;
+ }
+ }
+ $filecnt ++;
+}
+
+
+
+## When we print without spooler or with CPS do not log onto STDERR unless
+## the "-v" ('Verbose') is set or the debug mode is used
+if ((($spooler eq 'direct') || ($spooler eq 'cps') || ($genpdqfile)) &&
+ (!$verbose) && (!$debug)) {
+ close $logh;
+ open LOG, "> /dev/null";
+ $logh = *LOG;
+
+ use IO::Handle;
+ $logh->autoflush(1);
+}
+
+
+
+## Start logging
+if (!$debug) {
+ # If we are in debug mode, we do this earlier.
+ print $logh "foomatic-rip version $ripversion running...\n";
+ # Print the command line only in debug mode, Mac OS X adds very many
+ # options so that CUPS cannot handle the output of the command line
+ # in its log files. If CUPS encounters a line with more than 1024
+ # characters sent into its log files, it aborts the job with an error.
+ if (($debug) || ($spooler ne 'cups')) {
+ print $logh "called with arguments: '", join("', '",@ARGV), "'\n";
+ }
+}
+
+
+
+## PPD file
+
+# Load the PPD file and build a data structure for the renderer's
+# command line and the options
+open PPD, "< $ppdfile" || do {
+ print $logh "error opening $ppdfile.\n";
+ rip_die ("Unable to open PPD file $ppdfile",
+ $EXIT_PRNERR_NORETRY_BAD_SETTINGS);
+};
+
+print $logh "Parsing PPD file ...\n";
+
+my $dat = {}; # data structure for the options
+my $currentargument = ""; # We are currently reading this argument
+
+# If we have an old Foomatic 2.0.x PPD file, read its built-in Perl
+# data structure into @datablob and the default values in %ppddefaults
+# Then delete the $dat structure, replace it by the one "eval"ed from
+# @datablob, and correct the default settings according to the ones of
+# the main PPD structure
+my @datablob;
+my $jclprefixset = 0;
+
+# Parse the PPD file
+sub undossify( $ );
+while(<PPD>) {
+ # foomatic-rip should also work with PPD file downloaded under Windows.
+ $_ = undossify($_);
+ # Parse keywords
+ if (m!^\*NickName:\s*\"(.*)$!) {
+ # "*NickName: <code>"
+ my $line = $1;
+ # Store the value
+ # Code string can have multiple lines, read all of them
+ my $cmd = "";
+ while ($line !~ m!\"!) {
+ if ($line =~ m!&&$!) {
+ # line continues in next line
+ $cmd .= substr($line, 0, -2);
+ } else {
+ # line ends here
+ $cmd .= "$line\n";
+ }
+ # Read next line
+ $line = <PPD>;
+ chomp $line;
+ }
+ $line =~ m!^([^\"]*)\"!;
+ $cmd .= $1;
+ $model = unhtmlify($cmd);
+ } elsif (m!^\*FoomaticIDs:\s*\"?\s*(\S+?)\s+(\S+?)\s*\"?\s*$!) {
+ # "*FoomaticIDs: <printer ID> <driver ID>"
+ my $id = $1;
+ my $driver = $2;
+ # Store the values
+ $dat->{'id'} = $id;
+ $dat->{'driver'} = $driver;
+ } elsif (m!^\*FoomaticRIPPostPipe:\s*\"(.*)$!) {
+ # "*FoomaticRIPPostPipe: <code>"
+ my $line = $1;
+ # Store the value
+ # Code string can have multiple lines, read all of them
+ my $cmd = "";
+ while ($line !~ m!\"!) {
+ if ($line =~ m!&&$!) {
+ # line continues in next line
+ $cmd .= substr($line, 0, -2);
+ } else {
+ # line ends here
+ $cmd .= "$line\n";
+ }
+ # Read next line
+ $line = <PPD>;
+ chomp $line;
+ }
+ $line =~ m!^([^\"]*)\"!;
+ $cmd .= $1;
+ $postpipe = unhtmlify($cmd);
+ } elsif (m!^\*FoomaticRIPCommandLine:\s*\"(.*)$!) {
+ # "*FoomaticRIPCommandLine: <code>"
+ my $line = $1;
+ # Store the value
+ # Code string can have multiple lines, read all of them
+ my $cmd = "";
+ while ($line !~ m!\"!) {
+ if ($line =~ m!&&$!) {
+ # line continues in next line
+ $cmd .= substr($line, 0, -2);
+ } else {
+ # line ends here
+ $cmd .= "$line\n";
+ }
+ # Read next line
+ $line = <PPD>;
+ chomp $line;
+ }
+ $line =~ m!^([^\"]*)\"!;
+ $cmd .= $1;
+ $dat->{'cmd'} = unhtmlify($cmd);
+ } elsif (m!^\*FoomaticNoPageAccounting:\s*\"?\s*(\S+?)\s*\"?\s*$!) {
+ # "*FoomaticRIPNoPageAccounting: <boolean value>"
+ my $value = $1;
+ # Apply the value
+ if ($value =~ /^True$/i) {
+ # Driver is not compatible with page accounting according to the
+ # Foomatic database, so turn it off for this driver
+ $ps_accounting = 0;
+ $accounting_prolog = '';
+ print $logh "CUPS page accounting disabled by driver.\n";
+ }
+ } elsif (m!^\*cupsFilter:\s*\"(.*)$!) {
+ # "*cupsFilter: <code>"
+ my $line = $1;
+ # Store the value
+ # Code string can have multiple lines, read all of them
+ my $cmd = "";
+ while ($line !~ m!\"!) {
+ if ($line =~ m!&&$!) {
+ # line continues in next line
+ $cmd .= substr($line, 0, -2);
+ } else {
+ # line ends here
+ $cmd .= "$line\n";
+ }
+ # Read next line
+ $line = <PPD>;
+ chomp $line;
+ }
+ $line =~ m!^([^\"]*)\"!;
+ $cmd .= $1;
+ my $cupsfilterline = unhtmlify($cmd);
+ if ($cupsfilterline =~ /^\s*(\S+)\s+\d+\s+(\S+)\s*$/) {
+ print $logh "*cupsFilter: \"$cupsfilterline\"\n";
+ # Make a hash by mime type for all CUPS filters set in this PPD
+ $dat->{'cupsfilter'}{$1} = $2;
+ }
+ } elsif (m!^\*CustomPageSize\s+True:\s*\"(.*)$!) {
+ # "*CustomPageSize True: <code>"
+ my $setting = "Custom";
+ my $translation = "Custom Size";
+ my $line = $1;
+ # Make sure that the argument is in the data structure
+ checkarg ($dat, "PageSize");
+ checkarg ($dat, "PageRegion");
+ # Make sure that the setting is in the data structure
+ checksetting ($dat, "PageSize", $setting);
+ checksetting ($dat, "PageRegion", $setting);
+ $dat->{'args_byname'}{'PageSize'}{'vals_byname'}{$setting}{'comment'} = $translation;
+ $dat->{'args_byname'}{'PageRegion'}{'vals_byname'}{$setting}{'comment'} = $translation;
+ # Store the value
+ # Code string can have multiple lines, read all of them
+ my $code = "";
+ while ($line !~ m!\"!) {
+ if ($line =~ m!&&$!) {
+ # line continues in next line
+ $code .= substr($line, 0, -2);
+ } else {
+ # line ends here
+ $code .= "$line\n";
+ }
+ # Read next line
+ $line = <PPD>;
+ chomp $line;
+ }
+ $line =~ m!^([^\"]*)\"!;
+ $code .= $1;
+ if ($code !~ m!^%% FoomaticRIPOptionSetting!m) {
+ $dat->{'args_byname'}{'PageSize'}{'vals_byname'}{$setting}{'driverval'} = $code;
+ $dat->{'args_byname'}{'PageRegion'}{'vals_byname'}{$setting}{'driverval'} = $code;
+ }
+ } elsif (m!^\*(JCL|)OpenUI\s+\*([^:]+):\s*(\S+)\s*$!) {
+ # "*[JCL]OpenUI *<option>[/<translation>]: <type>"
+ my $argnametrans = $2;
+ my $argtype = $3;
+ my $argname;
+ my $translation = "";
+ if ($argnametrans =~ m!^([^:/\s]+)/([^:]*)$!) {
+ $argname = $1;
+ $translation = $2;
+ } else {
+ $argname = $argnametrans;
+ }
+ # Make sure that the argument is in the data structure
+ checkarg ($dat, $argname);
+ # Store the values
+ $dat->{'args_byname'}{$argname}{'comment'} = $translation;
+ # Set the argument type only if not defined yet, a
+ # definition in "*FoomaticRIPOption" has priority
+ if ( !($dat->{'args_byname'}{$argname}{'type'}) ) {
+ if ($argtype eq "PickOne") {
+ $dat->{'args_byname'}{$argname}{'type'} = 'enum';
+ } elsif ($argtype eq "PickMany") {
+ $dat->{'args_byname'}{$argname}{'type'} = 'pickmany';
+ } elsif ($argtype eq "Boolean") {
+ $dat->{'args_byname'}{$argname}{'type'} = 'bool';
+ }
+ }
+ # Mark in which argument we are currently, so that we can find
+ # the entries for the choices
+ $currentargument = $argname;
+ } elsif (m!^\*(JCL|)CloseUI:\s+\*([^:/\s]+)\s*$!) {
+ # "*[JCL]CloseUI *<option>"
+ my $argname = $2;
+ # Unmark the current argument to do not mis-interpret any keywords
+ # as choices
+ $currentargument = "";
+ } elsif ((m!^\*FoomaticRIPOption ([^/:\s]+):\s*\"?\s*(\S+?)\s+(\S+)\s+(\S)\s*\"?\s*$!) ||
+ (m!^\*FoomaticRIPOption ([^/:\s]+):\s*\"?\s*(\S+?)\s+(\S+)\s+(\S)\s+(\S+?)\s*\"?\s*$!)){
+ # "*FoomaticRIPOption <option>: <type> <style> <spot> [<order>]"
+ # <order> only used for 1-choice enum options
+ my $argname = $1;
+ my $argtype = $2;
+ my $argstyle = $3;
+ my $spot = $4;
+ my $order = $5;
+ # Make sure that the argument is in the data structure
+ checkarg ($dat, $argname);
+ # Store the values
+ $dat->{'args_byname'}{$argname}{'type'} = $argtype;
+ if ($argstyle eq "PS") {
+ $dat->{'args_byname'}{$argname}{'style'} = 'G';
+ } elsif ($argstyle eq "CmdLine") {
+ $dat->{'args_byname'}{$argname}{'style'} = 'C';
+ } elsif ($argstyle eq "JCL") {
+ $dat->{'args_byname'}{$argname}{'style'} = 'J';
+ $dat->{'jcl'} = 1;
+ } elsif ($argstyle eq "Composite") {
+ $dat->{'args_byname'}{$argname}{'style'} = 'X';
+ }
+ $dat->{'args_byname'}{$argname}{'spot'} = $spot;
+ # $order only defined here for 1-choice enum options
+ if ($order) {
+ $dat->{'args_byname'}{$argname}{'order'} = $order;
+ }
+ } elsif (m!^\*FoomaticRIPOptionPrototype\s+([^/:\s]+):\s*\"(.*)$!) {
+ # "*FoomaticRIPOptionPrototype <option>: <code>"
+ # Used for numerical and string options only
+ my $argname = $1;
+ my $line = $2;
+ # Make sure that the argument is in the data structure
+ checkarg ($dat, $argname);
+ # Store the value
+ # Code string can have multiple lines, read all of them
+ my $proto = "";
+ while ($line !~ m!\"!) {
+ if ($line =~ m!&&$!) {
+ # line continues in next line
+ $proto .= substr($line, 0, -2);
+ } else {
+ # line ends here
+ $proto .= "$line\n";
+ }
+ # Read next line
+ $line = <PPD>;
+ chomp $line;
+ }
+ $line =~ m!^([^\"]*)\"!;
+ $proto .= $1;
+ $dat->{'args_byname'}{$argname}{'proto'} = unhtmlify($proto);
+ } elsif (m!^\*FoomaticRIPOptionRange\s+([^/:\s]+):\s*\"?\s*(\S+?)\s+(\S+?)\s*\"?\s*$!) {
+ # "*FoomaticRIPOptionRange <option>: <min> <max>"
+ # Used for numerical options only
+ my $argname = $1;
+ my $min = $2;
+ my $max = $3;
+ # Make sure that the argument is in the data structure
+ checkarg ($dat, $argname);
+ # Store the values
+ $dat->{'args_byname'}{$argname}{'min'} = $min;
+ $dat->{'args_byname'}{$argname}{'max'} = $max;
+ } elsif (m!^\*FoomaticRIPOptionMaxLength\s+([^/:\s]+):\s*\"?\s*(\S+?)\s*\"?\s*$!) {
+ # "*FoomaticRIPOptionMaxLength <option>: <length>"
+ # Used for string options only
+ my $argname = $1;
+ my $maxlength = $2;
+ # Make sure that the argument is in the data structure
+ checkarg ($dat, $argname);
+ # Store the value
+ $dat->{'args_byname'}{$argname}{'maxlength'} = $maxlength;
+ } elsif (m!^\*FoomaticRIPOptionAllowedChars\s+([^/:\s]+):\s*\"(.*)$!) {
+ # "*FoomaticRIPOptionAllowedChars <option>: <code>"
+ # Used for string options only
+ my $argname = $1;
+ my $line = $2;
+ # Store the value
+ # Code string can have multiple lines, read all of them
+ my $code = "";
+ while ($line !~ m!\"!) {
+ if ($line =~ m!&&$!) {
+ # line continues in next line
+ $code .= substr($line, 0, -2);
+ } else {
+ # line ends here
+ $code .= "$line\n";
+ }
+ # Read next line
+ $line = <PPD>;
+ chomp $line;
+ }
+ $line =~ m!^([^\"]*)\"!;
+ $code .= $1;
+ # Make sure that the argument is in the data structure
+ checkarg ($dat, $argname);
+ # Store the value
+ $dat->{'args_byname'}{$argname}{'allowedchars'} = unhtmlify($code);
+ } elsif (m!^\*FoomaticRIPOptionAllowedRegExp\s+([^/:\s]+):\s*\"(.*)$!) {
+ # "*FoomaticRIPOptionAllowedRegExp <option>: <code>"
+ # Used for string options only
+ my $argname = $1;
+ my $line = $2;
+ # Store the value
+ # Code string can have multiple lines, read all of them
+ my $code = "";
+ while ($line !~ m!\"!) {
+ if ($line =~ m!&&$!) {
+ # line continues in next line
+ $code .= substr($line, 0, -2);
+ } else {
+ # line ends here
+ $code .= "$line\n";
+ }
+ # Read next line
+ $line = <PPD>;
+ chomp $line;
+ }
+ $line =~ m!^([^\"]*)\"!;
+ $code .= $1;
+ # Make sure that the argument is in the data structure
+ checkarg ($dat, $argname);
+ # Store the value
+ $dat->{'args_byname'}{$argname}{'allowedregexp'} =
+ unhtmlify($code);
+ } elsif (m!^\*OrderDependency:\s*(\S+)\s+(\S+)\s+\*([^:/\s]+)\s*$!) {
+ # "*OrderDependency: <order> <section> *<option>"
+ my $order = $1;
+ my $section = $2;
+ my $argname = $3;
+ # Make sure that the argument is in the data structure
+ checkarg ($dat, $argname);
+ # Store the values
+ $dat->{'args_byname'}{$argname}{'order'} = $order;
+ $dat->{'args_byname'}{$argname}{'section'} = $section;
+ } elsif (m!^\*Default([^/:\s]+):\s*([^/:\s]+)\s*$!) {
+ # "*Default<option>: <value>"
+ my $argname = $1;
+ my $default = $2;
+ # Make sure that the argument is in the data structure
+ checkarg ($dat, $argname);
+ # Store the value
+ $dat->{'args_byname'}{$argname}{'default'} = $default;
+ } elsif (m!^\*FoomaticRIPDefault([^/:\s]+):\s*\"?\s*([^/:\s]+?)\s*\"?\s*$!) {
+ # "*FoomaticRIPDefault<option>: <value>"
+ # Used for numerical options only
+ my $argname = $1;
+ my $default = $2;
+ # Make sure that the argument is in the data structure
+ checkarg ($dat, $argname);
+ # Store the value
+ $dat->{'args_byname'}{$argname}{'fdefault'} = $default;
+ } elsif (m!^\*$currentargument\s+([^:]+):\s*\"(.*)$!) {
+ # "*<option> <choice>[/<translation>]: <code>"
+ my $settingtrans = $1;
+ my $line = $2;
+ my $translation = "";
+ my $setting = "";
+ if ($settingtrans =~ m!^([^:/\s]+)/([^:]*)$!) {
+ $setting = $1;
+ $translation = $2;
+ } else {
+ $setting = $settingtrans;
+ }
+ # Make sure that the argument is in the data structure
+ checkarg ($dat, $currentargument);
+ # Make sure that the setting is in the data structure (enum options)
+ my $bool =
+ ($dat->{'args_byname'}{$currentargument}{'type'} eq 'bool');
+ if ($bool) {
+ if (lc($setting) eq "true") {
+ if (!$dat->{'args_byname'}{$currentargument}{'comment'}) {
+ $dat->{'args_byname'}{$currentargument}{'comment'} =
+ $translation;
+ }
+ $dat->{'args_byname'}{$currentargument}{'comment_true'} =
+ $translation;
+ } else {
+ $dat->{'args_byname'}{$currentargument}{'comment_false'} =
+ $translation;
+ }
+ } else {
+ checksetting ($dat, $currentargument, $setting);
+ # Make sure that this argument has a default setting, even if
+ # none is defined in this PPD file
+ if (!defined ($dat->{'args_byname'}{$currentargument}{'default'})) {
+ $dat->{'args_byname'}{$currentargument}{'default'} = $setting;
+ }
+ $dat->{'args_byname'}{$currentargument}{'vals_byname'}{$setting}{'comment'} = $translation;
+ }
+ # Store the value
+ # Code string can have multiple lines, read all of them
+ my $code = "";
+ while ($line !~ m!\"!) {
+ if ($line =~ m!&&$!) {
+ # line continues in next line
+ $code .= substr($line, 0, -2);
+ } else {
+ # line ends here
+ $code .= "$line\n";
+ }
+ # Read next line
+ $line = <PPD>;
+ chomp $line;
+ }
+ $line =~ m!^([^\"]*)\"!;
+ $code .= $1;
+ if ($code !~ m!^%% FoomaticRIPOptionSetting!) {
+ if ($bool) {
+ if (lc($setting) eq "true") {
+ $dat->{'args_byname'}{$currentargument}{'proto'} = $code;
+ } else {
+ $dat->{'args_byname'}{$currentargument}{'protof'} = $code;
+ }
+ } else {
+ $dat->{'args_byname'}{$currentargument}{'vals_byname'}{$setting}{'driverval'} = $code;
+ }
+ }
+ } elsif ((m!^\*FoomaticRIPOptionSetting\s+([^/:=\s]+)=([^/:=\s]+):\s*\"(.*)$!) ||
+ (m!^\*FoomaticRIPOptionSetting\s+([^/:=\s]+):\s*\"(.*)$!)) {
+ # "*FoomaticRIPOptionSetting <option>[=<choice>]: <code>"
+ # For boolean options <choice> is not given
+ my $argname = $1;
+ my $setting = $2;
+ my $line = $3;
+ my $bool = 0;
+ if (!$line) {
+ $line = $setting;
+ $bool = 1;
+ }
+ # Make sure that the argument is in the data structure
+ checkarg ($dat, $argname);
+ # Make sure that the setting is in the data structure (enum options)
+ if (!$bool) {
+ checksetting ($dat, $argname, $setting);
+ # Make sure that this argument has a default setting, even if
+ # none is defined in this PPD file
+ if (!defined ($dat->{'args_byname'}{$argname}{'default'})) {
+ $dat->{'args_byname'}{$argname}{'default'} = $setting;
+ }
+ }
+ # Store the value
+ # Code string can have multiple lines, read all of them
+ my $code = "";
+ while ($line !~ m!\"!) {
+ if ($line =~ m!&&$!) {
+ # line continues in next line
+ $code .= substr($line, 0, -2);
+ } else {
+ # line ends here
+ $code .= "$line\n";
+ }
+ # Read next line
+ $line = <PPD>;
+ chomp $line;
+ }
+ $line =~ m!^([^\"]*)\"!;
+ $code .= $1;
+ if ($bool) {
+ $dat->{'args_byname'}{$argname}{'proto'} = unhtmlify($code);
+ } else {
+ $dat->{'args_byname'}{$argname}{'vals_byname'}{$setting}{'driverval'} = unhtmlify($code);
+ }
+ } elsif (m!^\*(Foomatic|)JCL(Begin|ToPSInterpreter|End|Prefix):\s*\"(.*)$!) {
+ # "*(Foomatic|)JCL(Begin|ToPSInterpreter|End|Prefix): <code>"
+ # The printer supports PJL/JCL when there is such a line
+ $dat->{'jcl'} = 1;
+ my $item = $2;
+ my $line = $3;
+ # Store the value
+ # Code string can have multiple lines, read all of them
+ my $code = "";
+ while ($line !~ m!\"!) {
+ if ($line =~ m!&&$!) {
+ # line continues in next line
+ $code .= substr($line, 0, -2);
+ } else {
+ # line ends here
+ $code .= "$line\n";
+ }
+ # Read next line
+ $line = <PPD>;
+ chomp $line;
+ }
+ $line =~ m!^([^\"]*)\"!;
+ $code .= $1;
+ if ($item eq 'Begin') {
+ $jclbegin = unhexify($code);
+ $jclprefix = "" if (!$jclprefixset) && ($jclbegin !~ /PJL/s);
+ } elsif ($item eq 'ToPSInterpreter') {
+ $jcltointerpreter = unhexify($code);
+ } elsif ($item eq 'End') {
+ $jclend = unhexify($code);
+ } elsif ($item eq 'Prefix') {
+ $jclprefix = unhexify($code);
+ $jclprefixset = 1;
+ }
+ } elsif (m!^\*\% COMDATA \#(.*)$!) {
+ # If we have an old Foomatic 2.0.x PPD file, collect its Perl data
+ push (@datablob, $1);
+ }
+}
+close PPD;
+
+# If we have an old Foomatic 2.0.x PPD file use its Perl data structure
+if ($#datablob >= 0) {
+ print $logh "${added_lf}You are using an old Foomatic 2.0 PPD file, consider " .
+ "upgrading.${added_lf}\n";
+ my $VAR1;
+ if (eval join('',@datablob)) {
+ # Overtake default settings from the main structure of the PPD file
+ for my $arg (@{$dat->{'args'}}) {
+ if ($arg->{'default'}) {
+ $VAR1->{'argsbyname'}{$arg->{'name'}}{'default'} =
+ $arg->{'default'};
+ }
+ }
+ undef $dat;
+ $dat = $VAR1;
+ $dat->{'jcl'} = $dat->{'pjl'};
+ } else {
+ # Perl structure broken
+ print $logh "${added_lf}Unable to evaluate datablob, print job may come " .
+ "out incorrectly or not at all.${added_lf}\n";
+ }
+}
+
+
+
+## We do not need to parse the PostScript job when we don't have
+## any options. If we have options, we must check whether the
+## default settings from the PPD file are valid and correct them
+## if nexessary.
+
+my $dontparse = 0;
+if ((!defined(@{$dat->{'args'}})) ||
+ ($#{$dat->{'args'}} < 0)) {
+ # We don't have any options, so we do not need to parse the
+ # PostScript data
+ $dontparse = 1;
+} else {
+ # Let the default value of a boolean option being 0 or 1 instead of
+ # "True" or "False", range-check the defaults of all options and
+ # issue warnings if the values are not valid
+ checkoptions($dat, 'default');
+
+ # Adobe's PPD specs do not support numerical
+ # options. Therefore the numerical options are mapped to
+ # enumerated options in the PPD file and their characteristics
+ # as a numerical option are stored in "*Foomatic..."
+ # keywords. A default must be between the enumerated
+ # fixed values. The default
+ # value must be given by a "*FoomaticRIPDefault<option>:
+ # <value>" line in the PPD file. But this value is only valid
+ # if the "official" default given by a "*Default<option>:
+ # <value>" line (it must be one of the enumerated values)
+ # points to the enumerated value which is closest to this
+ # value. This way a user can select a default value with a
+ # tool only supporting PPD files but not Foomatic extensions.
+ # This tool only modifies the "*Default<option>: <value>" line
+ # and if the "*FoomaticRIPDefault<option>: <value>" had always
+ # priority, the user's change in "*Default<option>: <value>"
+ # would have no effect.
+
+ for my $arg (@{$dat->{'args'}}) {
+ if ($arg->{'fdefault'}) {
+ if ($arg->{'default'}) {
+ if ($arg->{'type'} =~ /^(int|float)$/) {
+ if ($arg->{'fdefault'} < $arg->{'min'}) {
+ $arg->{'fdefault'} = $arg->{'min'};
+ }
+ if ($arg->{'fdefault'} > $arg->{'max'}) {
+ $arg->{'fdefault'} = $arg->{'max'};
+ }
+ if ($arg->{'type'} eq 'int') {
+ $arg->{'fdefault'} = POSIX::floor($arg->{'fdefault'});
+ }
+ my $mindiff = abs($arg->{'max'} - $arg->{'min'});
+ my $closestvalue;
+ for my $val (@{$arg->{'vals'}}) {
+ if (abs($arg->{'fdefault'} - $val->{'value'}) <
+ $mindiff) {
+ $mindiff =
+ abs($arg->{'fdefault'} - $val->{'value'});
+ $closestvalue = $val->{'value'};
+ }
+ }
+ if (($arg->{'default'} == $closestvalue) ||
+ (abs($arg->{'default'} - $closestvalue) /
+ $closestvalue < 0.001)) {
+ $arg->{'default'} = $arg->{'fdefault'};
+ }
+ }
+ } else {
+ $arg->{'default'} = $arg->{'fdefault'};
+ }
+ }
+ }
+}
+
+# Is our PPD for a CUPS raster driver
+if (my $cupsfilter = $dat->{'cupsfilter'}{"application/vnd.cups-raster"}) {
+
+ # Search filter in cupsfilterpath
+ # The %Y is a placeholder for the option settings
+ my $havefilter = 0;
+ for (split(':', $cupsfilterpath)) {
+ if (-x "$_/$cupsfilter") {
+ $havefilter=1;
+ $cupsfilter = "$_/$cupsfilter 0 '' '' 0 '%Y%X'";
+ last;
+ }
+ }
+
+ if (!$havefilter) {
+
+ # We do not have the required filter, so we assume that
+ # rendering this job is supposed to be done on a remote
+ # server. So we do not define a renderer command line and
+ # embed only the option settings (as we had a PostScript
+ # printer). This way the settings are # taken into account
+ # when the job is rendered on the server.
+ print $logh "${added_lf}CUPS filter for this PPD file not found " .
+ "assuming that job will be rendered on a remote server. Only " .
+ "the PostScript of the options will be inserted into the " .
+ "PostScript data stream.${added_lf}\n";
+
+ } else {
+
+ # use pstoraster script if available, otherwise run GhostScript
+ # directly
+ my $pstoraster = "pstoraster";
+ my $havepstoraster = 0;
+ for (split(':', $cupsfilterpath)) {
+ if (-x "$_/$pstoraster") {
+ $havepstoraster=1;
+ $pstoraster = "$_/$pstoraster 0 '' '' 0 '%X'";
+ last;
+ }
+ }
+
+ if (!$havepstoraster) {
+
+ # Build GhostScript command line
+ $pstoraster = "gs -dQUIET -dDEBUG -dPARANOIDSAFER -dNOPAUSE -dBATCH -dNOMEDIAATTRS -sDEVICE=cups -sOutputFile=-%W -"
+
+ }
+
+ # build GhostScript/CUPS driver command line
+ $dat->{'cmd'} = "$pstoraster | $cupsfilter";
+
+ # Set environment variables
+ $ENV{'PPD'} = $ppdfile;
+
+ }
+}
+
+# Was the RIP command line defined in the PPD file? If not, we assume a
+# PostScript printer and do not render/translate the input data
+if (!defined($dat->{'cmd'})) {
+ $dat->{'cmd'} = "cat%A%B%C%D%E%F%G%H%I%J%K%L%M%Z";
+ if ($dontparse) {
+ # No command line, no options, we have a raw queue, don't check
+ # whether the input is PostScript and ignore the "docs" option,
+ # simply pass the input data to the backend.
+ $dontparse = 2;
+ $model = "Raw queue";
+ }
+}
+
+
+
+## Summary for debugging
+print $logh "${added_lf}Parameter Summary\n";
+print $logh "-----------------${added_lf}\n";
+print $logh "Spooler: $spooler\n";
+print $logh "Printer: $printer\n";
+print $logh "Shell: $modern_shell\n";
+print $logh "PPD file: $ppdfile\n";
+print $logh "ATTR file: $attrpath\n";
+print $logh "Printer model: $model\n";
+# Print the options string only in debug mode, Mac OS X adds very many
+# options so that CUPS cannot handle the output of the option string
+# in its log files. If CUPS encounters a line with more than 1024 characters
+# sent into its log files, it aborts the job with an error.
+if (($debug) || ($spooler ne 'cups')) {
+ print $logh "Options: $optstr\n";
+}
+print $logh "Job title: $jobtitle\n";
+print $logh "File(s) to be printed: ${added_lf}@filelist${added_lf}\n";
+print $logh "GhostScript extra search path ('GS_LIB'): $ENV{'GS_LIB'}\n"
+ if $ENV{'GS_LIB'};
+
+
+
+## Parse options from command line ($optstr)
+
+# Before we start, save the defaults for printing documentation pages
+
+copyoptions($dat, 'default', 'userval');
+
+
+# The options are "foo='bar nut'", "foo", "nofoo", "'bar nut'", or
+# "foo:'bar nut'" (when GPR was used) all with spaces between...
+# In addition they can be preceeded by page ranges, separated with a
+# colon.
+
+my @opts;
+
+# Variable for PPR's backend interface name (parallel, tcpip, atalk, ...)
+
+my $backend = "";
+
+# Array to collect unknown options so that they can get passed to the
+# backend interface of PPR. For other spoolers we ignore them.
+
+my @backendoptions = ();
+
+# "foo='bar nut'"
+while ($optstr =~ s!(((even|odd|[\d,-]+):|)\w+=[\'\"].*?[\'\"]) ?!!i) {
+ push (@opts, $1);
+}
+
+# "foo:'bar nut'" (GPR separates option and setting with a colon ":")
+while ($optstr =~ s!(((even|odd|[\d,-]+):|)\w+:[\'\"].*?[\'\"]) ?!!i) {
+#while ($optstr =~ s!(\w+=[\'\"].*?[\'\"])!!i) {
+ push (@opts, $1);
+}
+
+# "'bar nut'", "'foo=bar nut'", "'foo:bar nut'"
+while ($optstr =~ s!([\'\"].+?[\'\"]) ?!!) {
+ my $opt = $1;
+ $opt =~ s/[\'\"]//g; # Make only sure that we didn't quote
+ # the option for a second time when we read
+ # rge options from the command line or
+ # environment variable
+ push (@opts, $opt);
+
+}
+
+# "foo", "nofoo"
+push(@opts, split(/ /,$optstr));
+
+# Now actually process those pesky options...
+
+for (@opts) {
+ print $logh "Pondering option '$_'\n";
+
+ # "docs" option to print help page
+ if ((lc($_) =~ /^\s*docs\s*$/) ||
+ (lc($_) =~ /^\s*docs\s*=\s*true\s*$/)) {
+ # The second one is necessary becuase CUPS 1.1.15 or newer sees
+ # "docs" as boolean option and modifies it to "docs=true"
+ $do_docs = 1;
+ next;
+ }
+
+ # "profile" option to supply a color correction profile to a
+ # CUPS raster driver
+ if (lc($_) =~ /^\s*profile=(\S+)\s*$/) {
+ $cupscolorprofile=$1;
+ $dat->{'cmd'} =~ s!\%X!profile=$cupscolorprofile!g;
+ $dat->{'cmd'} =~ s!\%W! -c\"<</cupsProfile($cupscolorprofile)>>setpagedevice\"!g;
+ next;
+ }
+
+ # Is the command line option limited to certain page ranges? If so,
+ # mark the setting with a hash key containing the ranges
+ my $optionset;
+ if (s/^(even|odd|[\d,-]+)://i) {
+ $optionset = "pages:$1";
+ } else {
+ $optionset = 'userval';
+ }
+
+ # Solaris options that have no reason to be
+ if (/^nobanner$/ || /^dest=.+$/ || /^protocol=.+$/) {
+ next;
+ }
+
+ my $arg;
+ if ((m!([^=]+)=\'?(.*)\'?!) || (m!([^=:]+):\'?(.*)\'?!)) {
+ my ($aname, $avalue) = ($1, $2);
+
+ if (($optionset =~ /pages/) &&
+ ($arg = argbyname($aname)) &&
+ ((!defined($arg->{'section'})) ||
+ ($arg->{'section'} !~ /^(Any|Page)Setup/))) {
+ print $logh "This option is not a \"PageSetup\" or " .
+ "\"AnySetup\" option, so it cannot be restricted to " .
+ "a page range.\n";
+ next;
+ }
+
+ # At first look for the "backend" option to determine the PPR
+ # backend to use
+ if (($aname =~ m!^backend$!i) && ($spooler eq 'ppr_int')) {
+ # Backend interface name
+ $backend = $avalue;
+ } elsif ($aname =~ m!^media$!i) {
+
+ # Standard arguments?
+ # media=x,y,z
+ # sides=one|two-sided-long|short-edge
+
+ # Rummage around in the media= option for known media, source,
+ # etc types.
+ # We ought to do something sensible to make the common manual
+ # boolean option work when specified as a media= tray thing.
+ #
+ # Note that this fails miserably when the option value is in
+ # fact a number; they all look alike. It's unclear how many
+ # drivers do that. We may have to standardize the verbose
+ # names to make them work as selections, too.
+
+ my @values = split(',',$avalue);
+ for (@values) {
+ my $val;
+ if ($dat->{'args_byname'}{'PageSize'} and
+ $val=valbyname($dat->{'args_byname'}{'PageSize'},$_)) {
+ $dat->{'args_byname'}{'PageSize'}{$optionset} =
+ $val->{'value'};
+ # Keep "PageRegion" in sync
+ if ($dat->{'args_byname'}{'PageRegion'} and
+ $val=valbyname($dat->{'args_byname'}{'PageRegion'},
+ $_)) {
+ $dat->{'args_byname'}{'PageRegion'}{$optionset} =
+ $val->{'value'};
+ }
+ } elsif ($dat->{'args_byname'}{'PageSize'}
+ and /^Custom/) {
+ $dat->{'args_byname'}{'PageSize'}{$optionset} = $_;
+ # Keep "PageRegion" in sync
+ if ($dat->{'args_byname'}{'PageRegion'}) {
+ $dat->{'args_byname'}{'PageRegion'}{$optionset} =
+ $_;
+ }
+ } elsif ($dat->{'args_byname'}{'MediaType'} and
+ $val=valbyname($dat->{'args_byname'}{'MediaType'},
+ $_)) {
+ $dat->{'args_byname'}{'MediaType'}{$optionset} =
+ $val->{'value'};
+ } elsif ($dat->{'args_byname'}{'InputSlot'} and
+ $val=valbyname($dat->{'args_byname'}{'InputSlot'},
+ $_)) {
+ $dat->{'args_byname'}{'InputSlot'}{$optionset} =
+ $val->{'value'};
+ } elsif (lc($_) eq 'manualfeed') {
+ # Special case for our typical boolean manual
+ # feeder option if we didn't match an InputSlot above
+ if (defined($dat->{'args_byname'}{'ManualFeed'})) {
+ $dat->{'args_byname'}{'ManualFeed'}{$optionset} = 1;
+ }
+ } else {
+ print $logh "Unknown \"media\" component: \"$_\".\n";
+ }
+ }
+ } elsif ($aname =~ m!^sides$!i) {
+ # Handle the standard duplex option, mostly
+ if ($avalue =~ m!^two-sided!i) {
+ if (defined($dat->{'args_byname'}{'Duplex'})) {
+ # Default to long-edge binding here, for the case that
+ # there is no binding setting
+ $dat->{'args_byname'}{'Duplex'}{$optionset} =
+ 'DuplexNoTumble';
+ # Check the binding: "long edge" or "short edge"
+ if ($avalue =~ m!long-edge!i) {
+ if (defined($dat->{'args_byname'}{'Binding'})) {
+ $dat->{'args_byname'}{'Binding'}{$optionset} =
+ $dat->{'args_byname'}{'Binding'}{'vals_byname'}{'LongEdge'}{'value'};
+ } else {
+ $dat->{'args_byname'}{'Duplex'}{$optionset} =
+ 'DuplexNoTumble';
+ }
+ } elsif ($avalue =~ m!short-edge!i) {
+ if (defined($dat->{'args_byname'}{'Binding'})) {
+ $dat->{'args_byname'}{'Binding'}{$optionset} =
+ $dat->{'args_byname'}{'Binding'}{'vals_byname'}{'ShortEdge'}{'value'};
+ } else {
+ $dat->{'args_byname'}{'Duplex'}{$optionset} =
+ 'DuplexTumble';
+ }
+ }
+ }
+ } elsif ($avalue =~ m!^one-sided!i) {
+ if (defined($dat->{'args_byname'}{'Duplex'})) {
+ $dat->{'args_byname'}{'Duplex'}{$optionset} = 'None';
+ }
+ }
+
+ # We should handle the other half of this option - the
+ # BindEdge bit. Also, are there well-known ipp/cups
+ # options for Collate and StapleLocation? These may be
+ # here...
+
+ } else {
+ # Various non-standard printer-specific options
+ if ($arg = argbyname($aname)) {
+ if (defined(my $newvalue =
+ checkoptionvalue($dat, $aname, $avalue, 0))) {
+ # If the choice is valid, use it, otherwise
+ # ignore it.
+ $arg->{$optionset} = $newvalue;
+ # If this argument is PageSize or PageRegion,
+ # also set the other
+ syncpagesize($dat, $aname, $avalue, $optionset);
+ } else {
+ # Invalid choice, make log entry
+ print $logh "Invalid choice $aname=$avalue.\n";
+ }
+ } elsif ($spooler eq 'ppr_int') {
+ # Unknown option, pass it to PPR's backend interface
+ push (@backendoptions, "$aname=$avalue");
+ } else {
+ # Unknown option, make log entry
+ print $logh "Unknown option $aname=$avalue.\n";
+ }
+ }
+ } elsif (m!^([\d\.]+)x([\d\.]+)([A-Za-z]*)$!) {
+ my ($w, $h, $u) = ($1, $2, $3);
+ # Custom paper size
+ if (($w != 0) && ($h != 0) &&
+ ($arg=argbyname("PageSize")) &&
+ (defined($arg->{'vals_byname'}{'Custom'}))) {
+ $arg->{$optionset} = "Custom.${w}x${h}${u}";
+ # Keep "PageRegion" in sync
+ if ($dat->{'args_byname'}{'PageRegion'}) {
+ $dat->{'args_byname'}{'PageRegion'}{$optionset} =
+ $arg->{$optionset};
+ }
+ }
+ } elsif ((m!^\s*no(.+)\s*$!i) and ($arg=argbyname($1))) {
+ # standard bool args:
+ # landscape; what to do here?
+ # duplex; we should just handle this one OK now?
+ $arg->{$optionset} = 0;
+ } elsif (m!^\s*(.+)\s*$!) {
+ if ($arg=argbyname($1)) {
+ $arg->{$optionset} = 1;
+ } else {
+ print $logh "Unknown boolean option \"$1\".\n";
+ }
+ }
+}
+$do_docs = 1 if( $show_docs );
+
+
+## Were we called to build the PDQ driver declaration file?
+my @pdqfile;
+if ($genpdqfile) {
+ @pdqfile = buildpdqdriver($dat, 'userval');
+ open PDQFILE, $genpdqfile or
+ rip_die("Cannot write PDQ driver declaration file",
+ $EXIT_PRNERR_NORETRY_BAD_SETTINGS);
+ print PDQFILE join('', @pdqfile);
+ close PDQFILE;
+ exit $EXIT_PRINTED;
+}
+
+
+
+## Set the $postpipe
+
+# $postpipe when running as a PPR RIP
+if ($spooler eq 'ppr') {
+ # The PPR RIP sends the data output to /dev/fd/3 instead of to STDOUT
+ if (-w "/dev/fd/3") {
+ $postpipe = "| cat - > /dev/fd/3";
+ } else {
+ $postpipe = "| cat - >&3";
+ }
+}
+
+# Set up PPR backend (if we run as a PPR interface).
+if ($spooler eq 'ppr_int') {
+
+ # Is the chosen backend installed and executable
+ if (!-x "interfaces/$backend") {
+ my $pwd = cwd;
+ print $logh "The backend interface $pwd/interfaces/$backend " .
+ "does not exist/is not executable!\n";
+ rip_die ("The backend interface $pwd/interfaces/$backend " .
+ "does not exist/is not executable!",
+ $EXIT_PRNERR_NORETRY_BAD_SETTINGS);
+ }
+
+ # foomatic-rip cannot use foomatic-rip as backend
+ if ($backend eq "foomatic-rip") {
+ print $logh "\"foomatic-rip\" cannot use itself as backend " .
+ "interface!\n";
+ ppr_die ($ppr_printer,
+ "\"foomatic-rip\" cannot use itself as backend interface!",
+ $EXIT_PRNERR_NORETRY_BAD_SETTINGS);
+ }
+
+ # Put the backend interface into the $postpipe
+ $postpipe = "| ( interfaces/$backend \"$ppr_printer\" ".
+ "\"$ppr_address\" \"" . join(" ",@backendoptions) .
+ "\" \"$ppr_jobbreak\" \"$ppr_feedback\" " .
+ "\"$ppr_codes\" \"$ppr_jobname\" \"$ppr_routing\" " .
+ "\"$ppr_for\" \"\" )";
+
+}
+
+# CUPS and PDQ have their own backends, they do not need a $postpipe
+if (($spooler eq 'cups') || ($spooler eq 'pdq')) {
+ # No $postpipe for CUPS or PDQ, even if one is defined in the PPD file
+ $postpipe = "";
+}
+
+# CPS needs always a $postpipe, set the default one for local printing
+# if none is set
+if (($spooler eq 'cps') && !$postpipe) {
+ $postpipe = "| cat - > \$LPDDEV";
+}
+
+if ($postpipe) {
+ print $logh "${added_lf}Output will be redirected to:\n$postpipe${added_lf}\n";
+}
+
+
+
+## Print documentation page when asked for
+my ($docgeneratorhandle, $docgeneratorpid,$retval);
+if ($do_docs) {
+ # Don't print the supplied files, STDIN will be redirected to the
+ # documentation page generator
+ @filelist = ("<STDIN>");
+ # Start the documentation page generator
+ ($docgeneratorhandle, $docgeneratorpid) =
+ getdocgeneratorhandle($dat);
+ if ($retval != $EXIT_PRINTED) {
+ rip_die ("Error opening documentation page generator",
+ $retval);
+ }
+ # Read the further data from the documentation page generator and
+ # not from STDIN
+ if (!close STDIN && $! != $ESPIPE) {
+ rip_die ("Couldn't close STDIN",
+ $EXIT_PRNERR_NORETRY_BAD_SETTINGS);
+ }
+ if (!open (STDIN, "<&$docgeneratorhandle")) {
+ rip_die ("Couldn't dup \$docgeneratorhandle",
+ $EXIT_PRNERR_NORETRY_BAD_SETTINGS);
+ }
+ if( $show_docs ){
+ while( <$docgeneratorhandle> ){
+ print;
+ }
+ exit(0);
+ }
+}
+
+
+
+
+## In debug mode save the data supposed to be fed into the
+## renderer also into a file, reset the file here
+
+if ($debug) {
+ modern_system("> ${logfile}.ps");
+}
+
+
+
+## From here on we have to repeat all the rest of the program for
+## every file to print
+
+for $file (@filelist) {
+
+ print $logh
+"${added_lf}================================================\n${added_lf}".
+"File: $file\n${added_lf}" .
+"================================================\n${added_lf}";
+
+
+
+ ## If we do not print standard input, open the file to print
+ if ($file ne "<STDIN>") {
+ if (! -r $file) {
+ print $logh "File $file missing or not readable, skipping.\n";
+ next;
+ }
+ close STDIN;
+ open STDIN, "< $file" || do {
+ print $logh "Cannot open $file, skipping.\n";
+ next;
+ }
+ }
+
+
+
+ ## Do we have a raw queue
+ if ($dontparse == 2) {
+ # Raw queue, simply pass the input into the $postpipe (or to STDOUT
+ # when there is no $postpipe)
+ print $logh "Raw printing, executing \"cat $postpipe\"${added_lf}\n";
+ modern_system("cat $postpipe");
+ next;
+ }
+
+
+
+ ## First, for arguments with a default, stick the default in as
+ ## the initial value for the "header" option set, this option set
+ ## consists of the PPD defaults, the options specified on the
+ ## command line, and the options set in the header part of the
+ ## PostScript file (all before the first page begins).
+
+ copyoptions($dat, 'userval', 'header');
+
+
+
+ ## Next, examine the PostScript job for traces of command-line and
+ ## JCL options. PPD-aware applications and spoolers stuff option
+ ## settings directly into the file, they do not necessarily send
+ ## PPD options by the command line. Also stuff in PostScript code
+ ## to apply option settings given by the command line and to set
+ ## the defaults given in the PPD file.
+
+ # Examination strategy: read lines from STDIN until the first
+ # %%Page: comment appears and save them as @psheader. This is the
+ # page-independent header part of the PostScript file. The
+ # PostScript interpreter (renderer) must execute this part once
+ # before rendering any assortment of pages. Then pages can be
+ # printed in any arbitrary selection or order. All option
+ # settings we find here will be collected in the default option
+ # set for the RIP command line.
+
+ # Now the pages will be read and sent to the renderer, one after
+ # the other. Every page is read into memory until the
+ # %%EndPageSetup comment appears (or a certain amount of lines was
+ # read). So we can get option settings only valid for this
+ # page. If we have such settings we set them in the modified
+ # command set for this page.
+
+ # If the renderer is not running yet (first page) we start it with
+ # the command line built from the current modified command set and
+ # send the first page to it, in the end we leave the renderer
+ # running and keep input and output pipes open, so that it can
+ # accept further pages. If the renderer is still running from
+ # the previous page and the current modified command set is the
+ # same as the one for the previous page, we send the page. If
+ # the command set is different, we close the renderer, re-start
+ # it with the command line built from the new modified command
+ # set, send the header again, and then the page.
+
+ # After the last page the trailer (%%Trailer) is sent.
+
+ # The output pipe of this program stays open all the time so that
+ # the spooler does not assume that the job has finished when the
+ # renderer is re-started.
+
+ # Non DSC-conforming documents will be read until a certain line
+ # number is reached. Command line or JCL options inserted later
+ # will be ignored.
+
+ # If options are implemented by PostScript code supposed to be
+ # stuffed into the job's PostScript data we stuff the code for all
+ # these options into our job data, So all default settings made in
+ # the PPD file (the user can have edited the PPD file to change
+ # them) are taken care of and command line options get also
+ # applied. To give priority to settings made by applications we
+ # insert the options's code in the beginnings of their respective
+ # sections, so that sommething, which is already inserted, gets
+ # executed after our code. Missing sections are automatically
+ # created. In non-DSC-conforming files we insert the option code
+ # in the beginning of the file. This is the same policy as used by
+ # the "pstops" filter of CUPS.
+
+ # If CUPS is the spooler, the option settings were already
+ # inserted by the "pstops" filter, so we don't insert them
+ # again. The only thing we do is correcting settings of numerical
+ # options when they were set to a value not available as choice in
+ # the PPD file, As "pstops" does not support "real" numerical
+ # options, it sees these settings as an invalid choice and stays
+ # with the default setting. In this case we correct the setting in
+ # the first occurence of the option's code, as this one is the one
+ # added by CUPS, later occurences come from applications and
+ # should not be touched.
+
+ # If the input is not PostScript (if there is no "%!" after
+ # $maxlinestopsstart lines) a file conversion filter will
+ # automatically be applied to the incoming data, so that we will
+ # process the resulting PostScript here. This way we have always
+ # PostScript data here and so we can apply the printer/driver
+ # features described in the PPD file.
+
+ # Supported file conversion filters are "a2ps", "enscript",
+ # "mpage", and spooler-specific filters. All filters convert
+ # plain text to PostScript, "a2ps" also other formats. The
+ # conversion filter is always used when one prints the
+ # documentation pages, as they are created as plain text,
+ # when CUPS is the spooler "pstops" is executed after the
+ # filter so that the default option settings from the PPD file
+ # and CUPS-specific options as N-up get applied. On regular
+ # printouts one gets always PostScript when CUPS or PPR is
+ # the spooler, so the filter is only used for regular
+ # printouts under LPD, LPRng, GNUlpr or without spooler.
+
+ my $maxlines = 1000; # Maximum number of lines to be read
+ # when the documenent is not
+ # DSC-conforming. "$maxlines = 0"
+ # means that all will be read
+ # and examined. If it is
+ # discovered that the input file
+ # is DSC-conforming, this will
+ # be set to 0.
+
+ my $maxlinestopsstart = 200; # That many lines are allowed until the
+ # "%!" indicating PS comes. These
+ # additional lines in the
+ # beginning are usually JCL
+ # commands. The lines will be
+ # ignored by our parsing but
+ # passed through.
+
+ my $maxlinesforpageoptions=200; # Unfortunately, CUPS does not bracket
+ # "PageSetup" option with
+ # "%%BeginPageSetup" and
+ # "%%EndPageSetup", so the options
+ # can simply stand after the
+ # page header and before the
+ # page code, without special
+ # marking. So buffer this amount
+ # of lines before printing the
+ # page to check for options.
+
+ my $maxnondsclinesinheader=1000; # If there is a block of more lines
+ # than this in the document
+ # header which is not in the
+ # "%%BeginProlog...%%EndProlog"
+ # or
+ # "%%BeginSetup...%%EndSetup"
+ # sections, the document is not
+ # considered as DSC-conforming
+ # and the rest gets passed
+ # through to the renderer without
+ # further parsing for options.
+
+ my $nondsclines = 0; # Amount of lines found which are not in
+ # a section (see
+ # $maxnondsclinesinheader).
+
+ my $nonpslines = 0; # lines before "%!" found yet.
+
+ my $more_stuff = 1; # there is more stuff in stdin.
+
+ my $linect = 0; # how many lines have we examined?
+
+ my $onelinebefore = ""; # The line before the current line
+ # (Non-DSC comments are ignored)
+
+ my $twolinesbefore = ""; # The line two lines before the current
+ # line (Non-DSC comments are ignored)
+
+ my $linesafterlastbeginfeature = ""; # All code lines after the last
+ # "%%BeginFeature:"
+
+ my @psheader = (); # The header of the PostScript file,
+ # to be sent after each start of the
+ # renderer
+
+ my @psfifo = (); # The input FIFO, data which we have
+ # pulled from stdin for examination,
+ # but not sent to the renderer yet.
+
+ my $passthru = 0; # 0: write data into @psfifo; 1: pass
+ # data directly to the renderer
+
+ my $isdscjob = 0; # Is the job DSC conforming
+
+ my $inheader = 1; # Are we still in the header, before
+ # first "%%Page:" comment?
+
+ my $optionset = 'header'; # Where do the option settings, which
+ # we have found, go?
+
+ my $optionsalsointoheader = 0; # 1: We are in a "%%BeginSetup...
+ # %%EndSetup" section after the first
+ # "%%Page:..." line (OpenOffice.org
+ # does this and intends the options here
+ # apply to the whole document and not
+ # only to the current page). We have to
+ # add all lines also to the end of the
+ # @psheader now and we have to set
+ # non-PostScript options also in the
+ # "header" optionset. 0: otherwise.
+
+ my $nestinglevel = 0; # Are we in the main document (0) or
+ # in an embedded document bracketed by
+ # "%%BeginDocument" and "%%EndDocument"
+ # (>0) We do not parse the PostScript
+ # in an embedded document.
+
+ my $inpageheader = 0; # Are we in the header of a page,
+ # between "%%BeginPageSetup" and
+ # "%%EndPageSetup" (1) or not (0).
+
+ my $lastpassthru = 0; # State of $passthru in previous line
+ # (to allow debug output when $passthru
+ # switches.
+
+ my $ignorepageheader = 0; # Will be set to 1 as soon as active
+ # code (not between "%%BeginPageSetup"
+ # and "%%EndPageSetup") appears after a
+ # "%%Page:" comment. In this case
+ # "%%BeginPageSetup" and
+ # "%%EndPageSetup" is not allowed any
+ # more on this page and will be ignored.
+ # Will be set to 0 when a new "%%Page:"
+ # comment appears.
+
+ my $printprevpage = 0; # We set this when encountering
+ # "%%Page:" and the previous page is not
+ # printed yet. Then it will be printed and
+ # the new page will be prepared in the
+ # next run of the loop (we don't read a
+ # new line and don't increase the
+ # $linect then).
+
+ $fileconverterhandle = undef; # File handle to the fileconverter process
+
+ $fileconverterpid = 0; # PID of the fileconverter process
+
+ $rendererhandle = undef; # File handle to the renderer process
+
+ $rendererpid = 0; # PID of the renderer process
+
+ my $prologfound = 0; # Did we find the
+ # "%%BeginProlog...%%EndProlog" section?
+
+ my $setupfound = 0; # Did we find the
+ # "%%BeginSetup...%%EndSetup" section?
+
+ my $pagesetupfound = 0; # special page setup handling needed
+
+ my $inprolog = 0; # We are between "%%BeginProlog" and
+ # "%%EndProlog".
+
+ my $insetup = 0; # We are between "%%BeginSetup" and
+ # "%%EndSetup".
+
+ my $infeature = 0; # We are between "%%BeginFeature" and
+ # "%%EndFeature".
+
+ my $postscriptsection = 'jclsetup'; # In which section of the PostScript
+ # file are we currently?
+
+ $nondsclines = 0; # Number of subsequent lines found which
+ # are at a non-DSC-conforming place,
+ # between the sections of the header.
+
+ my $optionreplaced = 0; # Will be set to 1 when we are in an
+ # option ("%%BeginFeature...
+ # %%EndFeature") which we have replaced.
+
+ $jobhasjcl = 0; # When the job does not start with
+ # PostScript directly, but is a
+ # PostScript job, we set this to 1
+ # to avoid adding the JCL options
+ # for the second time.
+
+ my $insertoptions = 1; # If we find out that a file with
+ # a DSC magic string
+ # ("%!PS-Adobe-") is not really
+ # DSC-conforming, we insert the
+ # options directly after the line
+ # with the magic string. We use
+ # this variable to store the
+ # number of the line with the
+ # magic string.
+
+ my $currentpage = 0; # The page which we are currently
+ # printing.
+
+ my $ooo110 = 0; # Flag to work around an application
+ # bug.
+
+ my $saved = 0; # DSC line not processed yet
+
+ if ($dontparse) {
+ # We do not parse the PostScript to find Foomatic options, we check
+ # only whether we have PostScript.
+ $maxlines = 1;
+ }
+
+ print $logh "Reading PostScript input ...\n";
+
+ my $line; # Line to be read from stdin
+ do {
+ my $ignoreline = 0; # Comment line to be ignored when
+ # determining the last active line
+ # and the one before the last
+
+ if (($printprevpage) || ($saved) || ($line=<STDIN>)) {
+ $saved = 0;
+
+ if ($linect == $nonpslines) {
+ # In the beginning should be the postscript leader,
+ # sometimes after some JCL commands
+ if ($line !~ m/^.?%!/) { # There can be a Windows control
+ # character before "%!"
+ $nonpslines ++;
+ if ($maxlines == $nonpslines) {
+ $maxlines ++;
+ }
+ $jobhasjcl = 1;
+ if ($nonpslines > $maxlinestopsstart) {
+ # This is not a PostScript job, we must convert it
+ print $logh "${added_lf}Job does not start with \"%!\", " .
+ "is it PostScript?\n" .
+ "Starting file converter\n";
+ # Reset all variables but conserve the data which
+ # we have already read.
+ $jobhasjcl = 0;
+ $linect = 0;
+ $nonpslines = 1; # Take into account that the line
+ # of this run of the loop will be
+ # put into @psheader, so the
+ # first line read by the file
+ # converter is already the second
+ # line.
+ $maxlines = 1001;
+ $onelinebefore = "";
+ $twolinesbefore = "";
+ my $alreadyread = join('', @psheader, @psfifo) .
+ $line;
+ $line = "";
+ @psheader = ();
+ @psfifo = ();
+ # Start the file conversion filter
+ if (!$fileconverterpid) {
+ ($fileconverterhandle, $fileconverterpid) =
+ getfileconverterhandle
+ ($dat, $alreadyread);
+ if ($retval != $EXIT_PRINTED) {
+ rip_die ("Error opening file converter",
+ $retval);
+ }
+ } else {
+ rip_die("File conversion filter probably " .
+ "crashed",
+ $EXIT_JOBERR);
+ }
+ # Read the further data from the file converter and
+ # not from STDIN
+ if (!close STDIN && $! != $ESPIPE) {
+ rip_die ("Couldn't close STDIN",
+ $EXIT_PRNERR_NORETRY_BAD_SETTINGS);
+ }
+ if (!open (STDIN, "<&$fileconverterhandle")) {
+ rip_die ("Couldn't dup \$fileconverterhandle",
+ $EXIT_PRNERR_NORETRY_BAD_SETTINGS);
+ }
+ }
+ } else {
+ # Do we have a DSC-conforming document?
+ if ($line =~ m/^.?%!PS-Adobe-/) {
+ # Do not stop parsing the document
+ if (!$dontparse) {
+ $maxlines = 0;
+ $isdscjob = 1;
+ $insertoptions = $linect + 1;
+ # We have written into @psfifo before,
+ # now we continue in @psheader and move
+ # over the data which is already in @psfifo
+ push (@psheader, @psfifo);
+ @psfifo = ();
+ }
+ print $logh
+ "--> This document is DSC-conforming!\n";
+ } else {
+ # Job is not DSC-conforming, stick in all PostScript
+ # option settings in the beginning
+ $line .= makeprologsection($dat, $optionset, 1);
+ $line .= makesetupsection($dat, $optionset, 1);
+ $line .= makepagesetupsection($dat, $optionset, 1);
+ $prologfound = 1;
+ $setupfound = 1;
+ $pagesetupfound = 1;
+ }
+ }
+ } else {
+ if ($line =~ /^\%/) {
+ if ($line =~ m/^\s*\%\%BeginDocument[: ]/) {
+ # Beginning of an embedded document
+ # Note that Adobe Acrobat has a bug and so uses
+ # "%%BeginDocument " instead of "%%BeginDocument:"
+ $nestinglevel ++;
+ print $logh "Embedded document, " .
+ "nesting level now: $nestinglevel\n";
+ } elsif (($line =~ m/^\s*\%\%EndDocument/) &&
+ ($nestinglevel > 0)) {
+ # End of an embedded document
+ $nestinglevel --;
+ print $logh "End of Embedded document, " .
+ "nesting level now: $nestinglevel\n";
+ } elsif (($line =~ m/^\s*\%\%Creator[: ](.*)$/) &&
+ ($nestinglevel == 0)) {
+ # Here we set flags to treat particular bugs of the
+ # PostScript produced by certain applications
+ my $creator = $1;
+ if ($creator =~ /^\s*OpenOffice.org\s+1.1.\d+\s*$/) {
+ # OpenOffice.org 1.1.x
+ # The option settings supposed to affect the
+ # whole document are put into the "%%PageSetup"
+ # section of the first page
+ print $logh "Document created with " .
+ "OpenOffice.org 1.1.x\n";
+ $ooo110 = 1;
+ }
+ } elsif (($line =~ m/^\%\%BeginProlog/) &&
+ ($nestinglevel == 0)) {
+ # Note: Below is another place where a "Prolog"
+ # section start will be considered. There we assume
+ # start of the "Prolog" if the job is DSC-Conformimg,
+ # but an arbitrary comment starting with "%%Begin", but
+ # not a comment explicitly treated here, is found. This
+ # is done because many "dvips" (TeX/LaTeX) files miss
+ # the "%%BeginProlog" comment.
+ # Beginning of Prolog
+ print $logh "${added_lf}-----------\nFound: \%\%BeginProlog\n";
+ $inprolog = 1;
+ $postscriptsection = 'prolog' if $inheader;
+ $nondsclines = 0;
+ # Insert options for "Prolog"
+ if (!$prologfound) {
+ $line .= makeprologsection($dat, $optionset, 0);
+ }
+ $prologfound = 1;
+ } elsif (($line =~ m/^\%\%EndProlog/) &&
+ ($nestinglevel == 0)) {
+ # End of Prolog
+ print $logh "Found: \%\%EndProlog\n";
+ $inprolog = 0;
+ $insertoptions = $linect + 1;
+ } elsif (($line =~ m/^\%\%BeginSetup/) &&
+ ($nestinglevel == 0)) {
+ # Beginning of Setup
+ print $logh "${added_lf}-----------\nFound: \%\%BeginSetup\n";
+ $insetup = 1;
+ # We need to distinguish with the $inheader variable
+ # here whether we are in the header or on a page, as
+ # OpenOffice.org inserts a "%%BeginSetup...%%EndSetup"
+ # section after the first "%%Page:..." line and assumes
+ # this section to be valid for all pages.
+ $postscriptsection = 'setup' if $inheader;
+ $nondsclines = 0;
+ if ($inheader) {
+ # If there was no "Prolog" but there are
+ # options for the "Prolog", push a "Prolog"
+ # with these options onto the @psfifo here
+ if (!$prologfound) {
+ # "Prolog" missing, insert it here
+ $line =
+ makeprologsection($dat, $optionset, 1) .
+ $line;
+ # Now we have a "Prolog"
+ $prologfound = 1;
+ }
+ # Insert options for "DocumentSetup" or "AnySetup"
+ if ($spooler ne 'cups') {
+ # For non-CUPS spoolers or no spooler at all,
+ # we leave everything as it is.
+ if (!$setupfound) {
+ $line .=
+ makesetupsection($dat, $optionset, 0);
+ }
+ $setupfound = 1;
+ }
+ } else {
+ # Found option settings must be stuffed into both
+ # the header and the currrent page now. They will
+ # be written into both the "header" and the
+ # "currentpage" optionsets and the PostScript code
+ # lines of this section will not only go into the
+ # output stream, but also added to the end of the
+ # @psheader, so that they get repeated (to preserve
+ # the embedded PostScript option settings) on a
+ # restart of the renderer due to command line
+ # option changes
+ $optionsalsointoheader = 1;
+ print $logh "\"%%BeginSetup\" in page header\n";
+ }
+ } elsif (($line =~ m/^\%\%EndSetup/) &&
+ ($nestinglevel == 0)) {
+ # End of Setup
+ print $logh "Found: \%\%EndSetup\n";
+ $insetup = 0;
+ if ($inheader) {
+ if ($spooler eq 'cups') {
+ # In case of CUPS, we must insert the
+ # accounting stuff just before the
+ # %%EndSetup comment in order to leave any
+ # EndPage procedures that have been
+ # defined by either the pstops filter or
+ # the PostScript job itself fully
+ # functional.
+ if (!$setupfound) {
+ $line = makesetupsection($dat,
+ $optionset, 0) .
+ $line;
+ }
+ $setupfound = 1;
+ }
+ $insertoptions = $linect + 1;
+ } else {
+ # The "%%BeginSetup...%%EndSetup" which
+ # OpenOffice.org has inserted after the first
+ # "%%Page:..." line ends here, so the following
+ # options go only onto the current page again
+ $optionsalsointoheader = 0;
+ }
+ } elsif (($line =~ m/^\%\%Page:(.*)$/) &&
+ ($nestinglevel == 0)) {
+ if ((!$lastpassthru) && (!$inheader)) {
+ # In the last line we were not in passthru mode,
+ # so the last page is not printed. Prepare to do
+ # it now.
+ $printprevpage = 1;
+ # Print the previous page
+ $passthru = 1;
+ print $logh "New page found but previous not " .
+ "printed, print it now.\n";
+ } else {
+ # The previous page is printed, so we can prepare
+ # the current one
+ $printprevpage = 0;
+ print $logh "${added_lf}-----------\nNew page: $1\n";
+ # Count pages
+ $currentpage ++;
+ # We consider the beginning of the page already as
+ # page setup section, as some apps do not use
+ # "%%PageSetup" tags.
+ $postscriptsection = 'pagesetup';
+ # Save PostScript state before beginning the page
+ #$line .= "/foomatic-saved-state save def\n";
+ # Here begins a new page
+ if ($inheader) {
+ # One last update for the header
+ buildcommandline($dat, $optionset);
+ # Here we add some stuff which still belongs
+ # into the header
+ my $stillforheader;
+ # If there was no "Setup" but there are
+ # options for the "Setup", push a "Setup"
+ # with these options onto the @psfifo here
+ if (!$setupfound) {
+ # "Setup" missing, insert it here
+ $stillforheader =
+ makesetupsection($dat, $optionset, 1) .
+ $stillforheader;
+ # Now we have a "Setup"
+ $setupfound = 1;
+ }
+ # If there was no "Prolog" but there are
+ # options for the "Prolog", push a "Prolog"
+ # with these options onto the @psfifo here
+ if (!$prologfound) {
+ # "Prolog" missing, insert it here
+ $stillforheader =
+ makeprologsection($dat, $optionset,
+ 1) .
+ $stillforheader;
+ # Now we have a "Prolog"
+ $prologfound = 1;
+ }
+ # Now we push this onto the header
+ push (@psheader, $stillforheader);
+ # The first page starts, so the header ends
+ $inheader = 0;
+ $nondsclines = 0;
+ # Option setting should go into the
+ # page-specific option set now
+ $optionset = 'currentpage';
+ } else {
+ # Restore PostScript state after completing the
+ # previous page:
+ #
+ # foomatic-saved-state restore
+ # %%Page: ...
+ # /foomatic-saved-state save def
+ #
+ # Print this directly, so that if we need to
+ # restart the renderer for this page due to
+ # a command line change this is done under the
+ # old instance of the renderer
+ #print $rendererhandle
+ # "foomatic-saved-state restore\n";
+
+ # Save the option settings of the previous page
+ copyoptions($dat, 'currentpage',
+ 'previouspage');
+ deleteoptions($dat, 'currentpage');
+ }
+ # Initialize the option set
+ copyoptions($dat, 'header', 'currentpage');
+ # Set command line options which apply only
+ # given pages
+ setoptionsforpage($dat, 'currentpage', $currentpage);
+ $pagesetupfound = 0;
+ if ($spooler eq 'cups') {
+ # Remove the "notfirst" flag from all options
+ # forseen for the "PageSetup" section, because
+ # when these are numerical options for CUPS.
+ # they have to be set to the correct value
+ # for every page
+ for my $arg (@{$dat->{'args'}}) {
+ if (($arg->{'section'} eq 'PageSetup') &&
+ (defined($arg->{'notfirst'}))) {
+ delete($arg->{'notfirst'});
+ }
+ }
+ }
+ # Now the page header comes, so buffer the data,
+ # because we must perhaps shut down and restart
+ # the renderer
+ $passthru = 0;
+ $ignorepageheader = 0;
+ $optionsalsointoheader = 0;
+ }
+ } elsif (($line =~ m/^\%\%BeginPageSetup/) &&
+ ($nestinglevel == 0) &&
+ (!$ignorepageheader)) {
+ # Start of the page header, up to %%EndPageSetup
+ # nothing of the page will be drawn, page-specific
+ # option settngs (as letter-head paper for page 1)
+ # go here
+ print $logh "${added_lf}Found: \%\%BeginPageSetup\n";
+ $passthru = 0;
+ $inpageheader = 1;
+ $postscriptsection = 'pagesetup';
+ if (($ooo110) && ($currentpage == 1)) {
+ $optionsalsointoheader = 1;
+ } else {
+ $optionsalsointoheader = 0;
+ }
+ # Insert PostScript option settings
+ # (options for section "PageSetup".
+ if ($isdscjob) {
+ $line .=
+ makepagesetupsection($dat, $optionset,
+ 0);
+ $pagesetupfound = 1;
+ }
+ } elsif (($line =~ m/^\%\%EndPageSetup/) &&
+ ($nestinglevel == 0) &&
+ (!$ignorepageheader)) {
+ # End of the page header, the page is ready to be
+ # printed
+ print $logh "Found: \%\%EndPageSetup\n";
+ print $logh "End of page header\n";
+ # We cannot for sure say that the page header ends here
+ # OpenOffice.org puts (due to a bug) a "%%BeginSetup...
+ # %%EndSetup" section after the first "%%Page:...". It
+ # is possible that CUPS inserts a "%%BeginPageSetup...
+ # %%EndPageSetup" before this section, which means that
+ # the options in the "%%BeginSetup...%%EndSetup"
+ # section are after the "%%EndPageSetup", so we
+ # continue for searching options up to the buffer size
+ # limit $maxlinesforpageoptions.
+ $passthru = 0;
+ $inpageheader = 0;
+ $optionsalsointoheader = 0;
+ } elsif ((($line =~ m/^\%\%(BeginFeature):\s*\*?([^\*\s=]+)\s+()(\S[^\r\n]*)\r?\n?$/) ||
+ ($line =~ m/^\s*\%\%\s*(FoomaticRIPOptionSetting):\s*([^\*\s=]+)\s*=\s*(\@?)([^\@\s][^\r\n]*)\r?\n?$/)) &&
+ ($nestinglevel == 0) &&
+ (!$optionreplaced) &&
+ ((!$passthru) || (!$isdscjob))) {
+ my ($linetype, $option, $fromcomposite, $value) =
+ ($1, $2, $3, $4);
+
+ # Mark that we are in a "Feature" section
+ if ($linetype eq 'BeginFeature') {
+ $infeature = 1;
+ $linesafterlastbeginfeature = "";
+ }
+
+ # OK, we have an option. If it's not a
+ # *ostscript-style option (ie, it's command-line or
+ # JCL) then we should note that fact, since the
+ # attribute-to-filter option passing in CUPS is kind of
+ # funky, especially wrt boolean options.
+
+ print $logh "Found: $line";
+ if (my $arg=argbyname($option)) {
+ print $logh " Option: $option=" .
+ ($fromcomposite ? "From" : "") . $value;
+ if (($spooler eq 'cups') &&
+ ($linetype eq 'BeginFeature') &&
+ (!defined($arg->{'notfirst'})) &&
+ ($arg->{$optionset} ne $value) &&
+ (($inheader) ||
+ ($arg->{section} eq 'PageSetup'))) {
+
+ # We have the first occurence of an option
+ # setting and the spooler is CUPS, so this
+ # setting is inserted by "pstops" or
+ # "imagetops". The value from the command
+ # line was not inserted by "pstops" or
+ # "imagetops" so it seems to be not under
+ # the choices in the PPD. Possible
+ # reasons:
+ #
+ # - "pstops" and "imagetops" ignore settings
+ # of numerical or string options which are
+ # not one of the choices in the PPD file,
+ # and inserts the default value instead.
+ #
+ # - On the command line an option was applied
+ # only to selected pages:
+ # "-o <page ranges>:<option>=<values>
+ # This is not supported by CUPS, so not
+ # taken care of by "pstops".
+ #
+ # We must fix this here by replacing the
+ # setting inserted by "pstops" or "imagetops"
+ # with the exact setting given on the command
+ # line.
+
+ # $arg->{$optionset} is already
+ # range-checked, so do not check again here
+ # Insert DSC comment
+ my $dest = ((($inheader) && ($isdscjob)) ?
+ \@psheader : \@psfifo);
+ my $val;
+ if ($arg->{'style'} eq 'G') {
+ # PostScript option, insert the code
+ if ($arg->{'type'} eq 'bool') {
+ # Boolean option
+ push(@{$dest},
+ "%%BeginFeature: *$option " .
+ ($arg->{$optionset} == 1 ?
+ "True" : "False") . "\n");
+ if (defined($arg->{$optionset}) &&
+ $arg->{$optionset} == 1) {
+ push(@{$dest}, $arg->{'proto'} .
+ "\n");
+ } elsif ($arg->{'protof'}) {
+ push(@{$dest}, $arg->{'protof'} .
+ "\n");
+ }
+ # We have replaced this option on the
+ # FIFO
+ $optionreplaced = 1;
+ } elsif ((($arg->{'type'} eq 'enum') ||
+ ($arg->{'type'} eq 'string') ||
+ ($arg->{'type'} eq
+ 'password')) &&
+ (defined($val =
+ $arg->{'vals_byname'}{$arg->{$optionset}}))) {
+ # Enumerated choice of string or enum
+ # option
+ push(@{$dest},
+ "%%BeginFeature: " .
+ "*$option $arg->{$optionset}\n");
+ push(@{$dest}, $val->{'driverval'} . "\n");
+ # We have replaced this option on the
+ # FIFO
+ $optionreplaced = 1;
+ } elsif ((($arg->{'type'} eq 'string') ||
+ ($arg->{'type'} eq
+ 'password')) &&
+ ($arg->{$optionset} eq 'None')) {
+ # 'None' is mapped to the empty string
+ # in string options
+ push(@{$dest},
+ "%%BeginFeature: " .
+ "*$option $arg->{$optionset}\n");
+ my $driverval = $arg->{'proto'};
+ $driverval =~ s/\%s//g;
+ push(@{$dest}, $driverval . "\n");
+ # We have replaced this option on the
+ # FIFO
+ $optionreplaced = 1;
+ } elsif (($arg->{'type'} eq 'int') ||
+ ($arg->{'type'} eq 'float') ||
+ ($arg->{'type'} eq 'string') ||
+ ($arg->{'type'} eq 'password')) {
+ # Setting for numerical or string
+ # option which is not under the
+ # enumerated choices
+ push(@{$dest},
+ "%%BeginFeature: " .
+ "*$option $arg->{$optionset}\n");
+ my $sprintfproto = $arg->{'proto'};
+ $sprintfproto =~ s/\%(?!s)/\%\%/g;
+ push(@{$dest},
+ sprintf($sprintfproto,
+ $arg->{$optionset}) .
+ "\n");
+ # We have replaced this option on the
+ # FIFO
+ $optionreplaced = 1;
+ }
+ } else {
+ # Command line or JCL option
+ push(@{$dest},
+ "%% FoomaticRIPOptionSetting: " .
+ "$option=$arg->{$optionset}\n");
+ # We have replaced this option on the
+ # FIFO
+ $optionreplaced = 1;
+ }
+ print $logh " --> Correcting numerical/string " .
+ "option to $option=$arg->{$optionset}" .
+ " (Command line argument)\n" if
+ $optionreplaced;
+ }
+ # Mark that we have already found this option
+ $arg->{'notfirst'} = 1;
+ if (!$optionreplaced) {
+ if ($arg->{'style'} ne 'G') {
+ # "Controlled by '<Composite>'" setting of
+ # a member option of a composite option
+ if ($fromcomposite) {
+ $value = "From$value";
+ }
+ # Non-PostScript option
+ # Check whether it is valid
+ if (defined(my $newvalue =
+ checkoptionvalue($dat, $option,
+ $value, 0))) {
+ print $logh " --> Setting option\n";
+ # Valid choice, set it.
+ $arg->{$optionset} = $newvalue;
+ if ($optionsalsointoheader) {
+ $arg->{'header'} = $newvalue;
+ }
+ if (($arg->{'type'} eq 'enum') &&
+ (($option eq 'PageSize') ||
+ ($option eq 'PageRegion')) &&
+ ($newvalue =~ /^Custom/) &&
+ ($linetype eq
+ 'FoomaticRIPOptionSetting')) {
+ # Custom page size
+ $linesafterlastbeginfeature =~
+ /^[\s\r\n]*([\d\.]+)[\s\r\n]+([\d\.]+)[\s\r\n]+/s;
+ my ($w, $h) = ($1, $2);
+ if (($w) && ($h) &&
+ ($w != 0) && ($h != 0)) {
+ $newvalue =
+ "$newvalue.${w}x$h";
+ $arg->{$optionset} = $newvalue;
+ if ($optionsalsointoheader) {
+ $arg->{'header'} =
+ $newvalue;
+ }
+ }
+ }
+ # For a composite option insert the
+ # code from the member options with
+ # current setting "From<composite>"
+ # The code from the member options
+ # is chosen according to the setting
+ # of the composite option.
+ if (($arg->{'style'} eq 'X') &&
+ ($linetype eq
+ 'FoomaticRIPOptionSetting')) {
+ buildcommandline($dat, $optionset);
+ $line .=
+ $arg->{$postscriptsection};
+ }
+ # If this argument is PageSize or
+ # PageRegion, also set the other
+ syncpagesize($dat, $option, $newvalue,
+ $optionset);
+ if ($optionsalsointoheader) {
+ syncpagesize($dat, $option,
+ $newvalue, 'header');
+ }
+ } else {
+ # Invalid option, log it.
+ print $logh " --> Invalid option " .
+ "setting found in job\n";
+ }
+ } elsif ($fromcomposite) {
+ # PostScript option, but we have to look up
+ # the PostScript code to be inserted from
+ # the setting of a composite option, as
+ # this option is set to "Controlled by
+ # '<Composite>'".
+ # Set the option
+ if (defined(my $newvalue =
+ checkoptionvalue
+ ($dat, $option,
+ "From$value", 0))) {
+ print $logh " --> Looking up setting " .
+ "in composite option '$value'\n";
+ # Valid choice, set it.
+ $arg->{$optionset} = $newvalue;
+ if ($optionsalsointoheader) {
+ $arg->{'header'} = $newvalue;
+ }
+ # Update composite options
+ buildcommandline($dat, $optionset);
+ # Substitute PostScript comment by
+ # the real code
+ $line = $arg->{'compositesubst'};
+ } else {
+ # Invalid option, log it.
+ print $logh " --> Invalid option " .
+ "setting found in job\n";
+ }
+ } else {
+ # it is a PostScript style option with
+ # the code readily inserted, no option
+ # for the renderer command line/JCL to set,
+ # no lookup of a composite option needed,
+ # so nothing to do here...
+ print $logh
+ " --> Option will be set by " .
+ "PostScript interpreter\n";
+ }
+ }
+ } else {
+ # This option is unknown to us. WTF?
+ print $logh "Unknown option $option=$value found " .
+ "in the job\n";
+ }
+ } elsif (($line =~ m/^\%\%EndFeature/) &&
+ ($nestinglevel == 0)) {
+ # End of Feature
+ $infeature = 0;
+ # If the option setting was replaced, it ends here,
+ # too, and the next option is not necessarily also
+ # replaced.
+ $optionreplaced = 0;
+ $linesafterlastbeginfeature = "";
+ } elsif (($line =~ m/^\%\%Begin/) &&
+ ($isdscjob) &&
+ (!$prologfound) &&
+ ($nestinglevel == 0)) {
+ # In some PostScript files (especially when generated
+ # by "dvips" of TeX/LaTeX) the "%%BeginProlog" is
+ # missing, so assume that it was before the current
+ # line (the first line starting with "%%Begin".
+ print $logh "Job claims to be DSC-conforming, but " .
+ "\"%%BeginProlog\" was missing before first " .
+ "line with another \"%%Begin...\" comment " .
+ "(is this a TeX/LaTeX/dvips-generated PostScript " .
+ "file?). Assuming start of \"Prolog\" here.\n";
+ # Beginning of Prolog
+ $inprolog = 1;
+ $nondsclines = 0;
+ # Insert options for "Prolog" before the current line
+ if (!$prologfound) {
+ $line =
+ "%%BeginProlog\n" .
+ makeprologsection($dat, $optionset, 0) .
+ $line;
+ }
+ $prologfound = 1;
+ } elsif (($line =~ m/^\s*\%(\%?)RBINumCopies:\s*(\d+)\s*$/) &&
+ ($nestinglevel == 0)) {
+ # RBINumCopies entry
+ $rbinumcopies = $2;
+ print $logh "Found: %${1}RBINumCopies: $rbinumcopies\n";
+ } elsif (($line =~ m/^\s*\%/) || ($line =~ m/^\s*$/)) {
+ # This is an unknown PostScript comment or a blank
+ # line, no active code
+ $ignoreline = 1;
+ }
+ } else {
+ # This line is active PostScript code
+ if ($infeature) {
+ # Collect coe in a "%%BeginFeature: ... %%EndFeature"
+ # section, to get the values for a custom option
+ # setting
+ $linesafterlastbeginfeature .= $line;
+ }
+ if ($inheader) {
+ if ((!$inprolog) && (!$insetup)) {
+ # Outside the "Prolog" and "Setup" section
+ # a correct DSC-conforming document has no
+ # active PostScript code, so consider the
+ # file as non-DSC-conforming when there are
+ # too many of such lines.
+ $nondsclines ++;
+ if ($nondsclines > $maxnondsclinesinheader) {
+ # Consider document as not DSC-conforming
+ print $logh "This job seems not to be " .
+ "DSC-conforming, DSC-comment for " .
+ "next section not found, stopping " .
+ "to parse the rest, passing it " .
+ "directly to the renderer.\n";
+ # Stop scanning for further option settings
+ $maxlines = 1;
+ $isdscjob = 0;
+ # Insert defaults and command line settings
+ # in the beginning of the job or after the
+ # last valid section
+ splice(@psheader, $insertoptions, 0,
+ ($prologfound ? () :
+ makeprologsection($dat, $optionset,
+ 1)),
+ ($setupfound ? () :
+ makesetupsection($dat, $optionset,
+ 1)),
+ ($pagesetupfound ? () :
+ makepagesetupsection($dat,
+ $optionset,
+ 1)));
+ $prologfound = 1;
+ $setupfound = 1;
+ $pagesetupfound = 1;
+ }
+ }
+ } else {
+ if (!$inpageheader) {
+ # PostScript code inside a page, but not between
+ # "%%BeginPageSetup" and "%%EndPageSetup", so
+ # we are perhaps already drawing onto a page now
+ if ($onelinebefore =~ m/^\%\%Page:/) {
+ print $logh "No page header or page " .
+ "header not DSC-conforming\n";
+ }
+ # Stop buffering lines to search for options
+ # placed not DSC-conforming
+ if (scalar(@psfifo) >=
+ $maxlinesforpageoptions) {
+ print $logh "Stopping search for " .
+ "page header options\n";
+ $passthru = 1;
+ # If there comes a page header now, ignore
+ # it
+ $ignorepageheader = 1;
+ $optionsalsointoheader = 0;
+ }
+ # Insert PostScript option settings
+ # (options for section "PageSetup".
+ if ($isdscjob && !$pagesetupfound) {
+ $line .=
+ makepagesetupsection($dat, $optionset,
+ 1);
+ $pagesetupfound = 1;
+ }
+ }
+ }
+ }
+ }
+
+ # Debug info
+ if ($lastpassthru != $passthru) {
+ if ($passthru) {
+ print $logh "Found: $line" .
+ " --> Output goes directly to the renderer now.\n${added_lf}";
+ } else {
+ print $logh "Found: $line" .
+ " --> Output goes to the FIFO buffer now.${added_lf}\n";
+ }
+ }
+
+ # We are in an option which was replaced, do not output
+ # the current line.
+ if ($optionreplaced) {
+ $line = "";
+ }
+
+ # If we are in a "%%BeginSetup...%%EndSetup" section after
+ # the first "%%Page:..." and the current line belongs to
+ # an option setting, we have to copy the line also to the
+ # @psheader.
+ if (($optionsalsointoheader) &&
+ (($infeature) || ($line =~ m/^\%\%EndFeature/))) {
+ push (@psheader, $line);
+ }
+
+ # Store or send the current line
+ if (($inheader) && ($isdscjob)) {
+ # We are still in the PostScript header, collect all lines
+ # in @psheader
+ push (@psheader, $line);
+ } else {
+ if (($passthru) && ($isdscjob)) {
+ if (!$lastpassthru) {
+ # We enter passthru mode with this line, so the
+ # command line can have changed, check it and
+ # close the renderer if needed
+ if (($rendererpid) &&
+ (!optionsequal($dat, 'currentpage',
+ 'previouspage', 0))) {
+ print $logh "Command line/JCL options " .
+ "changed, restarting renderer\n";
+ $retval = closerendererhandle
+ ($rendererhandle, $rendererpid);
+ if ($retval != $EXIT_PRINTED) {
+ rip_die ("Error closing renderer",
+ $retval);
+ }
+ $rendererpid = 0;
+ }
+ }
+ # Flush @psfifo and send line directly to the renderer
+ if (!$rendererpid) {
+ # No renderer running, start it
+ ($rendererhandle, $rendererpid) =
+ getrendererhandle
+ ($dat, join('', @psheader, @psfifo));
+ if ($retval != $EXIT_PRINTED) {
+ rip_die ("Error opening renderer",
+ $retval);
+ }
+ # @psfifo is sent out, flush it.
+ @psfifo = ();
+ }
+ if ($#psfifo >= 0) {
+ # Send @psfifo to renderer
+ print $rendererhandle join('', @psfifo);
+ # flush @psfifo
+ @psfifo = ();
+ }
+ # Send line to renderer
+ if (!$printprevpage) {
+ print $rendererhandle $line;
+
+ while ($line=<STDIN>)
+ {
+ if ($line =~ /^\%\%[A-Za-z\s]{3,}/) {
+ print $logh "Found: $line" .
+ " --> Continue DSC parsing now.${added_lf}\n";
+ $saved = 1;
+ last;
+ } else {
+ print $rendererhandle $line;
+ $linect++;
+ }
+ }
+ }
+ } else {
+ # Push the line onto the stack for later spitting up...
+ push (@psfifo, $line);
+ }
+ }
+
+ if (!$printprevpage) {
+ $linect++;
+ }
+
+ } else {
+ # EOF!
+ $more_stuff = 0;
+ # No PostScript header in the whole file? Then it's not
+ # PostScript, convert it.
+ # We open the file converter here when the file has less
+ # lines than the amount which we search for the PostScript
+ # header ($maxlinestopsstart).
+ if ($linect <= $nonpslines) {
+ # This is not a PostScript job, we must convert it
+ print $logh "${added_lf}Job does not start with \"%!\", " .
+ "is it PostScript?\n" .
+ "Starting file converter\n";
+ # Reset all variables but conserve the data which
+ # we have already read.
+ $jobhasjcl = 0;
+ $linect = 0;
+ $nonpslines = 0;
+ $maxlines = 1000;
+ $onelinebefore = "";
+ $twolinesbefore = "";
+ my $alreadyread = join('', @psheader, @psfifo);
+ @psheader = ();
+ @psfifo = ();
+ $line = "";
+ # Start the file conversion filter
+ if (!$fileconverterpid) {
+ ($fileconverterhandle, $fileconverterpid) =
+ getfileconverterhandle($dat, $alreadyread);
+ if ( defined($retval) and $retval != $EXIT_PRINTED) {
+ rip_die ("Error opening file converter",
+ $retval);
+ }
+ } else {
+ rip_die("File conversion filter probably " .
+ "crashed",
+ $EXIT_JOBERR);
+ }
+ # Read the further data from the file converter and
+ # not from STDIN
+ if (!close STDIN && $! != $ESPIPE) {
+ rip_die ("Couldn't close STDIN",
+ $EXIT_PRNERR_NORETRY_BAD_SETTINGS);
+ }
+ if (!open (STDIN, "<&$fileconverterhandle")) {
+ rip_die ("Couldn't dup \$fileconverterhandle",
+ $EXIT_PRNERR_NORETRY_BAD_SETTINGS);
+ }
+ # Now we have new (converted) stuff in STDIN, so
+ # continue in the loop
+ $more_stuff = 1;
+ }
+ }
+
+ $lastpassthru = $passthru;
+
+ if ((!$ignoreline) && (!$printprevpage)) {
+ $twolinesbefore = $onelinebefore;
+ $onelinebefore = $line;
+ }
+
+ } while ((($maxlines == 0) or ($linect < $maxlines)) and
+ ($more_stuff != 0));
+
+ # Some buffer still containing data? Send it out to the renderer.
+ if (($more_stuff != 0) || ($inheader) || ($#psfifo >= 0)) {
+ # Flush @psfifo and send the remaining data to the renderer, this
+ # only happens with non-DSC-conforming jobs or non-Foomatic PPDs
+ if ($more_stuff) {
+ print $logh "Stopped parsing the PostScript data, ".
+ "sending rest directly to renderer.\n";
+ } else {
+ print $logh "Flushing FIFO.\n";
+ }
+ if ($inheader) {
+ # One last update for the header
+ buildcommandline($dat, $optionset);
+ # No page initialized yet? Copy the "header" option set into the
+ # "currentpage" option set, so that the renderer will find the
+ # options settings.
+ copyoptions($dat, 'header', 'currentpage');
+ $optionset = 'currentpage';
+ # If not done yet, insert defaults and command line settings
+ # in the beginning of the job or after the last valid section
+ splice(@psheader, $insertoptions, 0,
+ ($prologfound ? () :
+ makeprologsection($dat, $optionset, 1)),
+ ($setupfound ? () :
+ makesetupsection($dat, $optionset, 1)),
+ ($pagesetupfound ? () :
+ makepagesetupsection($dat, $optionset, 1)));
+ $prologfound = 1;
+ $setupfound = 1;
+ $pagesetupfound = 1;
+ }
+ if (($rendererpid) &&
+ (!optionsequal($dat, 'currentpage',
+ 'previouspage', 0))) {
+ print $logh "Command line/JCL options " .
+ "changed, restarting renderer\n";
+ $retval = closerendererhandle
+ ($rendererhandle, $rendererpid);
+ if ($retval != $EXIT_PRINTED) {
+ rip_die ("Error closing renderer",
+ $retval);
+ }
+ $rendererpid = 0;
+ }
+ if (!$rendererpid) {
+ ($rendererhandle, $rendererpid) =
+ getrendererhandle($dat, join('', @psheader, @psfifo));
+ if ($retval != $EXIT_PRINTED) {
+ rip_die ("Error opening renderer",
+ $retval);
+ }
+ # We have sent @psfifo now
+ @psfifo = ();
+ }
+ if ($#psfifo >= 0) {
+ # Send @psfifo to renderer
+ print $rendererhandle join('', @psfifo);
+ # flush @psfifo
+ @psfifo = ();
+ }
+ # Print the rest of the input data
+ if ($more_stuff) {
+ while (<STDIN>) {
+ print $rendererhandle $_;
+ }
+ }
+ }
+
+ # At every "%%Page:..." comment we have saved the PostScript state
+ # and we have increased the page number. So if the page number is
+ # non-zero we had at least one "%%Page:..." comment and so we have
+ # to give a restore the PostScript state.
+ #if ($currentpage > 0) {
+ # print $rendererhandle "foomatic-saved-state restore\n";
+ #}
+
+ # Close the renderer
+ if ($rendererpid) {
+ $retval = closerendererhandle ($rendererhandle, $rendererpid);
+ if ($retval != $EXIT_PRINTED) {
+ rip_die ("Error closing renderer",
+ $retval);
+ }
+ $rendererpid = 0;
+ }
+
+ # Close the file converter (if it was used)
+ if ($fileconverterpid) {
+ $retval = closefileconverterhandle
+ ($fileconverterhandle, $fileconverterpid);
+ if ($retval != $EXIT_PRINTED) {
+ rip_die ("Error closing file converter",
+ $retval);
+ }
+ $fileconverterpid = 0;
+ }
+}
+
+
+## Close the documentation page generator
+if ($docgeneratorpid) {
+ $retval = closedocgeneratorhandle
+ ($docgeneratorhandle, $docgeneratorpid);
+ if ($retval != $EXIT_PRINTED) {
+ rip_die ("Error closing documentation page generator",
+ $retval);
+ }
+ $docgeneratorpid = 0;
+}
+
+
+
+## Close last input file
+close STDIN;
+
+
+
+## Only for debugging
+if ($debug && 1) {
+ use Data::Dumper;
+ local $Data::Dumper::Purity=1;
+ local $Data::Dumper::Indent=1;
+ print $logh Dumper($dat);
+}
+
+
+
+## The End
+print $logh "${added_lf}Closing foomatic-rip.\n";
+close $logh;
+
+exit $retval;
+
+
+
+## Functions to let foomatic-rip fork to do several tasks in parallel.
+
+# To do the filtering without loading the whole file into memory we work
+# on a data stream, we read the data line by line analyse it to decide what
+# filters to use and start the filters if we have found out which we need.
+# We buffer the data only as long as we didn't determing which filters to
+# use for this piece of data and with which options. There are no temporary
+# files used.
+
+# foomatic-rip splits into up to 6 parallel processes to do the whole
+# filtering (listed in the order of the data flow):
+
+# KID0: Generate documentation pages (only jobs with "docs" option)
+# KID2: Put together already read data and current input stream for
+# feeding into the file conversion filter (only non-PostScript
+# and "docs" jobs)
+# KID1: Run the file conversion filter to convert non-PostScript
+# input into PostScript (only non-PostScript and "docs" jobs)
+# MAIN: Prepare the job auto-detecting the spooler, reading the PPD,
+# extracting the options from the command line, and parsing
+# the job data itself. It analyses the job data to check
+# whether it is PostScript and starts KID1/KID2 if not, it
+# also stuffs PostScript code from option settings into the
+# PostScript data stream. It starts the renderer (KID3/KID4)
+# as soon as it knows its command line and restarts it when
+# page-specific option settings need another command line
+# or different JCL commands.
+# KID3: The rendering process. In most cases GhostScript, "cat"
+# for native PostScript printers with their manufacturer's
+# PPD files.
+# KID4: Put together the JCL commands and the renderer's output
+# and send all that either to STDOUT or pipe it into the
+# command line defined with $postpipe.
+
+## This function runs the renderer command line (and if defined also
+## the postpipe) and returns a file handle for stuffing in the
+## PostScript data.
+sub getrendererhandle {
+
+ my ($dat, $prepend) = @_;
+
+ print $logh "${added_lf}Starting renderer\n";
+
+ # Reset return value of the renderer
+ $retval = $EXIT_PRINTED;
+
+ # Set up a pipe for the kids to pass their exit stat to the main process
+ pipe KID_MESSAGE, KID_MESSAGE_IN;
+
+ # When one kid fails put the exit stat here
+ $kidfailed = 0;
+
+ # When a kid exits successfully, mark it here
+ $kid3finished = 0;
+ $kid4finished = 0;
+
+ # Build the command line and get the JCL commands
+ buildcommandline($dat, 'currentpage');
+ my $commandline = $dat->{'currentcmd'};
+ my @jclprepend = @{$dat->{'jclprepend'}} if defined $dat->{'jclprepend'};
+ my @jclappend = @{$dat->{'jclappend'}} if defined $dat->{'jclappend'};
+
+ use IO::Handle;
+ pipe KID3_IN, KID3;
+ KID3->autoflush(1);
+ $kid3 = fork();
+ if (!defined($kid3)) {
+ close KID3;
+ close KID3_IN;
+ print $logh "$0: cannot fork for kid3!\n";
+ rip_die ("can't fork for kid3",
+ $EXIT_PRNERR_NORETRY_BAD_SETTINGS);
+ }
+ if ($kid3) {
+
+ # we are the parent; return a glob to the filehandle
+ close KID3_IN;
+
+ # Feed in the PostScript header and the FIFO contents
+ print KID3 $prepend;
+
+ KID3->flush();
+ return ( *KID3, $kid3 );
+
+ } else {
+ $kidgeneration += 1;
+
+ close KID3;
+
+ $SIG{PIPE} = 'DEFAULT';
+ pipe KID4_IN, KID4;
+ KID4->autoflush(1);
+ $kid4 = fork();
+ if (!defined($kid4)) {
+ close KID4;
+ close KID4_IN;
+ print $logh "$0: cannot fork for kid4!\n";
+ close KID_MESSAGE;
+ print KID_MESSAGE_IN "3 $EXIT_PRNERR_NORETRY_BAD_SETTINGS\n";
+ close KID_MESSAGE_IN;
+ rip_die ("can't fork for kid4",
+ $EXIT_PRNERR_NORETRY_BAD_SETTINGS);
+ }
+
+ if ($kid4) {
+ # parent, child of primary task; we are |commandline|
+ close KID4_IN;
+
+ print $logh "renderer PID kid4=$kid4\n";
+ print $logh "renderer command: $commandline\n";
+
+ if (!close STDIN && $! != $ESPIPE) {
+ close KID3_IN;
+ close KID4;
+ close KID_MESSAGE;
+ print KID_MESSAGE_IN
+ "3 $EXIT_PRNERR_NORETRY_BAD_SETTINGS\n";
+ close KID_MESSAGE_IN;
+ rip_die ("Couldn't close STDIN in $kid4",
+ $EXIT_PRNERR_NORETRY_BAD_SETTINGS);
+ }
+ if (!open (STDIN, "<&KID3_IN")) {
+ close KID3_IN;
+ close KID4;
+ close KID_MESSAGE;
+ print KID_MESSAGE_IN
+ "3 $EXIT_PRNERR_NORETRY_BAD_SETTINGS\n";
+ close KID_MESSAGE_IN;
+ rip_die ("Couldn't dup KID3_IN",
+ $EXIT_PRNERR_NORETRY_BAD_SETTINGS);
+ }
+ if (!close STDOUT) {
+ close KID3_IN;
+ close KID4;
+ close KID_MESSAGE;
+ print KID_MESSAGE_IN
+ "3 $EXIT_PRNERR_NORETRY_BAD_SETTINGS\n";
+ close KID_MESSAGE_IN;
+ rip_die ("Couldn't close STDOUT in $kid4",
+ $EXIT_PRNERR_NORETRY_BAD_SETTINGS);
+ }
+ if (!open (STDOUT, ">&KID4")) {
+ close KID3_IN;
+ close KID4;
+ close KID_MESSAGE;
+ print KID_MESSAGE_IN
+ "3 $EXIT_PRNERR_NORETRY_BAD_SETTINGS\n";
+ close KID_MESSAGE_IN;
+ rip_die ("Couldn't dup KID4",
+ $EXIT_PRNERR_NORETRY_BAD_SETTINGS);
+ }
+ if ($debug) {
+ if (!open (STDERR, ">&$logh")) {
+ close KID3_IN;
+ close KID4;
+ close KID_MESSAGE;
+ print KID_MESSAGE_IN
+ "3 $EXIT_PRNERR_NORETRY_BAD_SETTINGS\n";
+ close KID_MESSAGE_IN;
+ rip_die ("Couldn't dup logh to stderr",
+ $EXIT_PRNERR_NORETRY_BAD_SETTINGS);
+ }
+ }
+
+ # Massage commandline to execute foomatic-gswrapper
+ my $havewrapper = 0;
+ for (split(':', $ENV{'PATH'})) {
+ if (-x "$_/foomatic-gswrapper") {
+ $havewrapper=1;
+ last;
+ }
+ }
+ if ($havewrapper) {
+ $commandline =~ s!^\s*gs\s!foomatic-gswrapper !g;
+ $commandline =~ s!(\|\s*)gs\s!\|foomatic-gswrapper !g;
+ $commandline =~ s!(;\s*)gs\s!; foomatic-gswrapper !g;
+ }
+
+ # If the renderer command line contains the "echo"
+ # command, replace the "echo" by the user-chosen $myecho
+ # (important for non-GNU systems where GNU echo is in a
+ # special path
+ $commandline =~ s!^\s*echo\s!$myecho !g;
+ $commandline =~ s!(\|\s*)echo\s!\|$myecho !g;
+ $commandline =~ s!(;\s*)echo\s!; $myecho !g;
+
+ # In debug mode save the data supposed to be fed into the
+ # renderer also into a file
+ if ($debug) {
+ $commandline = "tee -a ${logfile}.ps | ( $commandline )";
+ }
+
+ # Actually run the thing...
+ modern_system("$commandline");
+ if ($? != 0) {
+ my $rendererretval = $? >> 8;
+ print $logh "renderer return value: $rendererretval\n";
+ my $renderersignal = $? & 127;
+ print $logh "renderer received signal: $rendererretval\n";
+ close STDOUT;
+ close KID4;
+ close STDIN;
+ close KID3_IN;
+ # Handle signals
+ if ($renderersignal == SIGUSR1) {
+ $retval = $EXIT_PRNERR;
+ } elsif ($renderersignal == SIGUSR2) {
+ $retval = $EXIT_PRNERR_NORETRY;
+ } elsif ($renderersignal == SIGTTIN) {
+ $retval = $EXIT_ENGAGED;
+ }
+ if ($retval != $EXIT_PRINTED) {
+ close KID_MESSAGE;
+ print KID_MESSAGE_IN "3 $retval\n";
+ close KID_MESSAGE_IN;
+ exit $retval;
+ }
+ # Evaluate renderer result
+ if ($rendererretval == 0) {
+ # Success, exit with 0 and inform main process
+ close KID_MESSAGE;
+ print KID_MESSAGE_IN "3 $EXIT_PRINTED\n";
+ close KID_MESSAGE_IN;
+ exit $EXIT_PRINTED;
+ } elsif ($rendererretval == 1) {
+ # Syntax error? PostScript error?
+ close KID_MESSAGE;
+ print KID_MESSAGE_IN "3 $EXIT_JOBERR\n";
+ close KID_MESSAGE_IN;
+ rip_die ("Possible error on renderer command line or PostScript error. Check options.",
+ $EXIT_JOBERR);
+ } elsif ($rendererretval == 139) {
+ # Seems to indicate a core dump
+ close KID_MESSAGE;
+ print KID_MESSAGE_IN "3 $EXIT_JOBERR\n";
+ close KID_MESSAGE_IN;
+ rip_die ("The renderer may have dumped core.",
+ $EXIT_JOBERR);
+ } elsif ($rendererretval == 141) {
+ # Broken pipe, presumably additional filter interface
+ # exited.
+ close KID_MESSAGE;
+ print KID_MESSAGE_IN "3 $EXIT_PRNERR\n";
+ close KID_MESSAGE_IN;
+ rip_die ("A filter used in addition to the renderer" .
+ " itself may have failed.",
+ $EXIT_PRNERR);
+ } elsif (($rendererretval == 243) || ($retval == 255)) {
+ # PostScript error?
+ close KID_MESSAGE;
+ print KID_MESSAGE_IN "3 $EXIT_JOBERR\n";
+ close KID_MESSAGE_IN;
+ exit $EXIT_JOBERR;
+ } else {
+ # Unknown error
+ close KID_MESSAGE;
+ print KID_MESSAGE_IN "3 $EXIT_PRNERR\n";
+ close KID_MESSAGE_IN;
+ rip_die ("The renderer command line returned an" .
+ " unrecognized error code $rendererretval.",
+ $EXIT_PRNERR);
+ }
+ }
+ close STDOUT;
+ close KID4;
+ close STDIN;
+ close KID3_IN;
+ # When arrived here the renderer command line was successful
+ # So exit with zero exit value here and inform the main process
+ close KID_MESSAGE;
+ # Wait for postpipe/output child
+ waitpid($kid4, 0);
+ if ($? != 0) {
+ print KID_MESSAGE_IN "3 $EXIT_SIGNAL\n";
+ } else {
+ print KID_MESSAGE_IN "3 $EXIT_PRINTED\n";
+ }
+ close KID_MESSAGE_IN;
+ print $logh "KID3 finished with $?\n";
+ exit $EXIT_PRINTED;
+ } else {
+ $kidgeneration += 1;
+
+ # child, trailing task on the pipe; we write jcl stuff
+ close KID4;
+ close KID3_IN;
+
+ my $fileh = *STDOUT;
+
+ # Do we have a $postpipe, if yes, launch the command(s) and
+ # point our output into it/them
+ if ($postpipe) {
+ if (!open PIPE,$postpipe) {
+ close KID4_IN;
+ close KID_MESSAGE;
+ print KID_MESSAGE_IN
+ "4 $EXIT_PRNERR_NORETRY_BAD_SETTINGS\n";
+ close KID_MESSAGE_IN;
+ rip_die ("cannot execute postpipe $postpipe",
+ $EXIT_PRNERR_NORETRY_BAD_SETTINGS);
+ }
+ $fileh = *PIPE;
+ }
+
+ # Debug output
+ print $logh "JCL: " . join("", @jclprepend) . "<job data> ${added_lf}" .
+ join("", @jclappend) . "\n";
+
+ # wrap the JCL around the job data, if there are any
+ # options specified...
+ # Should the driver already have inserted JCL commands we merge
+ # our JCL header with the one from the driver
+ my $driverjcl = 0;
+ if ( @jclprepend > 1 ) {
+ # JCL header read from renderer output
+ my @jclheader = ();
+ # Determine magic string of JCL in use (usually "@PJL")
+ # For that we take the first part of the second JCL line up
+ # to the first space
+ if ($jclprepend[1] =~ /^(\S+)/) {
+ my $jclstr = $1;
+ # Read from the renderer output until the first non-JCL
+ # line appears
+ while (my $line = <KID4_IN>) {
+ push(@jclheader, $line);
+ last if ($line !~ /$jclstr/);
+ }
+ # If we had read at least two lines, at least one is
+ # a JCL header, so do the merging
+ if (@jclheader > 1) {
+ $driverjcl = 1;
+ # Discard the first and the last entry of the
+ # @jclprepend array, we only need the option settings
+ # to merge them in
+ pop(@jclprepend);
+ shift(@jclprepend);
+ # Line after which we insert new JCL commands in the
+ # JCL header of the job
+ my $insert = 1;
+ # Go through every JCL command in @jclprepend
+ for my $line (@jclprepend) {
+ # Search the command in the JCL header from the
+ # driver. As search term use only the string from
+ # the beginning of the line to the "=", so the
+ # command will also be found when it has another
+ # value
+ $line =~ /^([^=]+)/;
+ my $cmd = $1;
+ $cmd =~ s/^\s*(.*?)\s*$/$1/;
+ my $cmdfound = 0;
+ for (@jclheader) {
+ # If the command is there, replace it
+ $_ =~ s/$cmd\b.*(\r\n|\n|\r)/$line/ and
+ $cmdfound = 1;
+ }
+ if (!$cmdfound) {
+ # If the command is not found, insert it
+ if (@jclheader > 2) {
+ # @jclheader has more than one line,
+ # insert the new command beginning
+ # right after the first line and continuing
+ # after the previous inserted command
+ splice(@jclheader, $insert, 0, $line);
+ $insert ++;
+ } else {
+ # If we have only one line of JCL it
+ # is probably something like the
+ # "@PJL ENTER LANGUAGE=..." line
+ # which has to be in the end, but
+ # it also contains the
+ # "<esc>%-12345X" which has to be in the
+ # beginning of the job. So we split the
+ # line right before the $jclstr and
+ # append our command to the end of the
+ # first part and let the second part
+ # be a second JCL line.
+ $jclheader[0] =~
+ /^(.*?)($jclstr.*(\r\n|\n|\r))/;
+ my $first = "$1$line";
+ my $second = "$2";
+ my $third = $jclheader[1];
+ @jclheader = ($first, $second, $third);
+ }
+ }
+ }
+ # Now pass on the merged JCL header
+ print $fileh @jclheader;
+ } else {
+ # The driver didn't create a JCL header, simply
+ # prepend ours and then pass on the line which we
+ # already have read
+ print $fileh @jclprepend, @jclheader;
+ }
+ } else {
+ # No merging of JCL header possible, simply prepend it
+ print $fileh @jclprepend;
+ }
+ }
+
+ # The rest of the job data
+ my $buf;
+ while (read(KID4_IN, $buf, 1024)) {
+ print $fileh $buf;
+ }
+
+ # A JCL trailer
+ if (( @jclprepend > 1 ) && (!$driverjcl)) {
+ print $fileh @jclappend;
+ }
+
+ if (!close $fileh) {
+ close KID4_IN;
+ close KID_MESSAGE;
+ print KID_MESSAGE_IN
+ "4 $EXIT_PRNERR_NORETRY_BAD_SETTINGS\n";
+ close KID_MESSAGE_IN;
+ rip_die ("error closing $fileh",
+ $EXIT_PRNERR_NORETRY_BAD_SETTINGS);
+ }
+ close KID4_IN;
+
+ print $logh "tail process done writing data to STDOUT\n";
+
+ # Handle signals of the backend interface
+ if ($retval != $EXIT_PRINTED) {
+ close KID_MESSAGE;
+ print KID_MESSAGE_IN "4 $retval\n";
+ close KID_MESSAGE_IN;
+ exit $retval;
+ }
+
+ # Successful exit, inform main process
+ close KID_MESSAGE;
+ print KID_MESSAGE_IN "4 $EXIT_PRINTED\n";
+ close KID_MESSAGE_IN;
+
+ print $logh "KID4 finished\n";
+ exit($EXIT_PRINTED);
+ }
+ }
+}
+
+
+
+## Close the renderer process and wait until all kid processes finish.
+
+sub closerendererhandle {
+
+ my ($rendererhandle, $rendererpid) = @_;
+
+ print $logh "${added_lf}Closing renderer\n";
+
+ # Do it!
+ close $rendererhandle;
+
+ # Wait for all kid processes to finish or one kid process to fail
+ close KID_MESSAGE_IN;
+ while ((!$kidfailed) &&
+ !(($kid3finished) &&
+ ($kid4finished))) {
+ my $message = <KID_MESSAGE>;
+ chomp $message;
+ if ($message =~ /(\d+)\s+(\d+)/) {
+ my $kid_id = $1;
+ my $exitstat = $2;
+ print $logh "KID$kid_id exited with status $exitstat\n";
+ if ($exitstat > 0) {
+ $kidfailed = $exitstat;
+ } elsif ($kid_id == 3) {
+ $kid3finished = 1;
+ } elsif ($kid_id == 4) {
+ $kid4finished = 1;
+ }
+ }
+ }
+
+ close KID_MESSAGE;
+
+ # If a kid failed, return the exit stat of this kid
+ if ($kidfailed != 0) {
+ $retval = $kidfailed;
+ }
+
+ print $logh "Renderer exit stat: $retval\n";
+ # Wait for renderer child
+ waitpid($rendererpid, 0);
+ print $logh "Renderer process finished\n";
+ return ($retval);
+}
+
+
+
+## This function is only used when the input data is not
+## PostScript. Then it runs a filter which converts non-PostScript
+## files into PostScript. The user can choose which filter he wants
+## to use. The filter command line is provided by $fileconverter.
+
+sub getfileconverterhandle {
+
+ # Already read data must be converted, too
+ my ($dat, $alreadyread) = @_;
+
+ print $logh "${added_lf}Starting converter for non-PostScript files\n";
+
+ # Determine with which command non-PostScript files are converted
+ # to PostScript
+ if ($fileconverter eq "") {
+ if ($spoolerfileconverters->{$spooler}) {
+ $fileconverter = $spoolerfileconverters->{$spooler};
+ } else {
+ for my $c (@fileconverters) {
+ ($c =~ m/^\s*(\S+)\s+/) || ($c = m/^\s*(\S+)$/);
+ my $command = $1;
+ if( -x $command ){
+ $fileconverter = $command;
+ } else {
+ for (split(':', $ENV{'PATH'})) {
+ if (-x "$_/$command") {
+ $fileconverter = $c;
+ last;
+ }
+ }
+ }
+ if ($fileconverter ne "") {
+ last;
+ }
+ }
+ }
+ if ($fileconverter eq "") {
+ $fileconverter = "echo \"Cannot convert file to " .
+ "PostScript!\" 1>&2";
+ }
+ }
+
+ # Insert the page size into the $fileconverter
+ if ($fileconverter =~ /\@\@([^@]+)\@\@PAGESIZE\@\@/) {
+ # We always use the "header" option swt here, with a
+ # non-PostScript file we have no "currentpage"
+ my $optstr = $1;
+ my $arg;
+ my $sizestr = (($arg = $dat->{'args_byname'}{'PageSize'})
+ ? $arg->{'header'}
+ : "");
+ if ($sizestr) {
+ # Use wider margins so that the pages come out completely on
+ # every printer model (especially HP inkjets)
+ if ($fileconverter =~ /^\s*(a2ps)\s+/) {
+ if (lc($sizestr) eq "letter") {
+ $sizestr = "Letterdj";
+ } elsif (lc($sizestr) eq "a4") {
+ $sizestr = "A4dj";
+ }
+ }
+ $optstr .= $sizestr;
+ } else {
+ $optstr = "";
+ }
+ $fileconverter =~ s/\@\@([^@]+)\@\@PAGESIZE\@\@/$optstr/;
+ }
+
+ # Insert the job title into the $fileconverter
+ if ($fileconverter =~ /\@\@([^@]+)\@\@JOBTITLE\@\@/) {
+ if ($do_docs) {
+ $jobtitle =
+ "Documentation for the $model";
+ }
+ my $titlearg = $1;
+ my ($arg, $optstr);
+ ($arg = $jobtitle) =~ s/\"/\\\"/g;
+ if (($titlearg =~ /\"/) || $arg) {
+ $optstr = $titlearg . ($titlearg =~ /\"/ ? '' : '"') .
+ ($arg ? "$arg\"" : '"');
+ } else {
+ $optstr = "";
+ }
+ $fileconverter =~ s/\@\@([^@]+)\@\@JOBTITLE\@\@/$optstr/;
+ }
+
+ # Apply "pstops" when having used a file converter under CUPS, so
+ # CUPS can stuff the default settings into the PostScript output
+ # of the file converter (so all CUPS settings get also applied when
+ # one prints the documentation pages (all other files we get
+ # already converted to PostScript by CUPS).
+ if ($spooler eq 'cups') {
+ $fileconverter .=
+ " | ${programdir}pstops '$rargs[0]' '$rargs[1]' '$rargs[2]' " .
+ "'$rargs[3]' '$rargs[4]'";
+ }
+
+ # Variables for the kid processes reporting their state
+
+ # Set up a pipe for the kids to pass their exit stat to the main process
+ pipe KID_MESSAGE_CONV, KID_MESSAGE_CONV_IN;
+
+ # When one kid fails put the exit stat here
+ $convkidfailed = 0;
+
+ # When a kid exits successfully, mark it here
+ $kid1finished = 0;
+ $kid2finished = 0;
+
+ use IO::Handle;
+ pipe KID1_IN, KID1;
+ KID1->autoflush(1);
+ my $kid1 = fork();
+ if (!defined($kid1)) {
+ close KID1;
+ close KID1_IN;
+ print $logh "$0: cannot fork for kid1!\n";
+ rip_die ("can't fork for kid1",
+ $EXIT_PRNERR_NORETRY_BAD_SETTINGS);
+ }
+
+ if ($kid1) {
+
+ # we are the parent; return a glob to the filehandle
+ close KID1;
+
+ return ( *KID1_IN, $kid1 );
+
+ } else {
+ $kidgeneration += 1;
+
+ # We go on reading the job data and stuff it into the file
+ # converter
+ close KID1_IN;
+
+ $SIG{PIPE} = 'DEFAULT';
+ pipe KID2_IN, KID2;
+ KID2->autoflush(1);
+ $kid2 = fork();
+ if (!defined($kid2)) {
+ print $logh "$0: cannot fork for kid2!\n";
+ close KID1;
+ close KID2;
+ close KID2_IN;
+ close KID_MESSAGE_CONV;
+ print KID_MESSAGE_CONV_IN
+ "1 $EXIT_PRNERR_NORETRY_BAD_SETTINGS\n";
+ rip_die ("can't fork for kid2",
+ $EXIT_PRNERR_NORETRY_BAD_SETTINGS);
+ }
+
+ if ($kid2) {
+ # parent, child of primary task; we are |$fileconverter|
+ close KID2;
+
+ print $logh "file converter PID kid2=$kid2\n";
+ if (($debug) || ($spooler ne 'cups')) {
+ print $logh "file converter command: $fileconverter\n";
+ }
+
+ if (!close STDIN && $! != $ESPIPE) {
+ close KID1;
+ close KID2_IN;
+ close KID_MESSAGE_CONV;
+ print KID_MESSAGE_CONV_IN
+ "1 $EXIT_PRNERR_NORETRY_BAD_SETTINGS\n";
+ close KID_MESSAGE_CONV_IN;
+ rip_die ("Couldn't close STDIN in $kid2",
+ $EXIT_PRNERR_NORETRY_BAD_SETTINGS);
+ }
+ if (!open (STDIN, "<&KID2_IN")) {
+ close KID1;
+ close KID2_IN;
+ close KID_MESSAGE_CONV;
+ print KID_MESSAGE_CONV_IN
+ "1 $EXIT_PRNERR_NORETRY_BAD_SETTINGS\n";
+ close KID_MESSAGE_CONV_IN;
+ rip_die ("Couldn't dup KID2_IN",
+ $EXIT_PRNERR_NORETRY_BAD_SETTINGS);
+ }
+ if (!close STDOUT) {
+ close KID1;
+ close KID2_IN;
+ close KID_MESSAGE_CONV;
+ print KID_MESSAGE_CONV_IN
+ "1 $EXIT_PRNERR_NORETRY_BAD_SETTINGS\n";
+ close KID_MESSAGE_CONV_IN;
+ rip_die ("Couldn't close STDOUT in $kid2",
+ $EXIT_PRNERR_NORETRY_BAD_SETTINGS);
+ }
+ if (!open (STDOUT, ">&KID1")) {
+ close KID1;
+ close KID2_IN;
+ close KID_MESSAGE_CONV;
+ print KID_MESSAGE_CONV_IN
+ "1 $EXIT_PRNERR_NORETRY_BAD_SETTINGS\n";
+ close KID_MESSAGE_CONV_IN;
+ rip_die ("Couldn't dup KID1",
+ $EXIT_PRNERR_NORETRY_BAD_SETTINGS);
+ }
+ if ($debug) {
+ if (!open (STDERR, ">&$logh")) {
+ close KID1;
+ close KID2_IN;
+ close KID_MESSAGE_CONV;
+ print KID_MESSAGE_CONV_IN
+ "1 $EXIT_PRNERR_NORETRY_BAD_SETTINGS\n";
+ close KID_MESSAGE_CONV_IN;
+ rip_die ("Couldn't dup logh to stderr",
+ $EXIT_PRNERR_NORETRY_BAD_SETTINGS);
+ }
+ }
+
+ # Actually run the thing...
+ modern_system("$fileconverter");
+ if ($? != 0) {
+ my $fileconverterretval = $? >> 8;
+ print $logh "file converter return value: " .
+ "$fileconverterretval\n";
+ my $fileconvertersignal = $? & 127;
+ print $logh "file converter received signal: ".
+ "$fileconverterretval\n";
+ close STDOUT;
+ close KID1;
+ close STDIN;
+ close KID2_IN;
+ # Handle signals
+ if ($fileconvertersignal == SIGUSR1) {
+ $retval = $EXIT_PRNERR;
+ } elsif ($fileconvertersignal == SIGUSR2) {
+ $retval = $EXIT_PRNERR_NORETRY;
+ } elsif ($fileconvertersignal == SIGTTIN) {
+ $retval = $EXIT_ENGAGED;
+ }
+ if ($retval != $EXIT_PRINTED) {
+ close KID_MESSAGE_CONV;
+ print KID_MESSAGE_CONV_IN "1 $retval\n";
+ close KID_MESSAGE_CONV_IN;
+ exit $retval;
+ }
+ # Evaluate fileconverter result
+ if ($fileconverterretval == 0) {
+ # Success, exit with 0 and inform main process
+ close KID_MESSAGE_CONV;
+ print KID_MESSAGE_CONV_IN "1 $EXIT_PRINTED\n";
+ close KID_MESSAGE_CONV_IN;
+ exit $EXIT_PRINTED;
+ } else {
+ # Unknown error
+ close KID_MESSAGE_CONV;
+ print KID_MESSAGE_CONV_IN "1 $EXIT_PRNERR\n";
+ close KID_MESSAGE_CONV_IN;
+ rip_die ("The file converter command line returned " .
+ "an unrecognized error code " .
+ "$fileconverterretval.",
+ $EXIT_PRNERR);
+ }
+ }
+ close STDOUT;
+ close KID1;
+ close STDIN;
+ close KID2_IN;
+ # When arrived here the fileconverter command line was
+ # successful.
+ # So exit with zero exit value here and inform the main process
+ close KID_MESSAGE_CONV;
+ print KID_MESSAGE_CONV_IN "1 $EXIT_PRINTED\n";
+ close KID_MESSAGE_CONV_IN;
+ # Wait for input child
+ waitpid($kid1, 0);
+ print $logh "KID1 finished\n";
+ exit $EXIT_PRINTED;
+ } else {
+ $kidgeneration += 1;
+
+ # child, first part of the pipe, reading in the data from
+ # standard input and stuffing it into the file converter
+ # after putting in the already read data (in $alreadyread)
+ close KID1;
+ close KID2_IN;
+
+ # At first pass the data which we have already read to the
+ # filter
+ print KID2 $alreadyread;
+ # Then read the rest from standard input
+ my $buf;
+ while (read(STDIN, $buf, 1024)) {
+ print KID2 $buf;
+ }
+
+ if (!close STDIN && $! != $ESPIPE) {
+ close KID2;
+ close KID_MESSAGE_CONV;
+ print KID_MESSAGE_CONV_IN
+ "2 $EXIT_PRNERR_NORETRY_BAD_SETTINGS\n";
+ close KID_MESSAGE_CONV_IN;
+ rip_die ("error closing STDIN",
+ $EXIT_PRNERR_NORETRY_BAD_SETTINGS);
+ }
+ close KID2;
+
+ print $logh "tail process done reading data from STDIN\n";
+
+ # Successful exit, inform main process
+ close KID_MESSAGE_CONV;
+ print KID_MESSAGE_CONV_IN "2 $EXIT_PRINTED\n";
+ close KID_MESSAGE_CONV_IN;
+
+ print $logh "KID2 finished\n";
+ exit($EXIT_PRINTED);
+ }
+ }
+}
+
+
+
+## Close the file conversion process and wait until all kid processes
+## finish.
+
+sub closefileconverterhandle {
+
+ my ($fileconverterhandle, $fileconverterpid) = @_;
+
+ print $logh "${added_lf}Closing file converter\n";
+
+ # Do it!
+ close $fileconverterhandle;
+
+ # Wait for all kid processes to finish or one kid process to fail
+ close KID_MESSAGE_CONV_IN;
+ while ((!$convkidfailed) &&
+ !(($kid1finished) &&
+ ($kid2finished))) {
+ my $message = <KID_MESSAGE_CONV>;
+ chomp $message;
+ if ($message =~ /(\d+)\s+(\d+)/) {
+ my $kid_id = $1;
+ my $exitstat = $2;
+ print $logh "KID$kid_id exited with status $exitstat\n";
+ if ($exitstat > 0) {
+ $convkidfailed = $exitstat;
+ } elsif ($kid_id == 1) {
+ $kid1finished = 1;
+ } elsif ($kid_id == 2) {
+ $kid2finished = 1;
+ }
+ }
+ }
+
+ close KID_MESSAGE_CONV;
+
+ # If a kid failed, return the exit stat of this kid
+ if ($convkidfailed != 0) {
+ $retval = $convkidfailed;
+ }
+
+ print $logh "File converter exit stat: $retval\n";
+ # Wait for fileconverter child
+ waitpid($fileconverterpid, 0);
+ print $logh "File converter process finished\n";
+ return ($retval);
+}
+
+
+
+## Generate the documentation page and return a filehandle to get it
+
+sub getdocgeneratorhandle {
+
+ # The data structure with the options
+ my ($dat) = @_;
+
+ print $logh "${added_lf}Generating documentation page for the $model\n";
+
+ # Printer queue name
+ my $printerstr;
+ if ($printer) {
+ $printerstr = $printer;
+ } else {
+ $printerstr = "<printer>";
+ }
+
+ # Spooler-specific differences
+ my ($command,
+ $enumopt, $enumoptleft, $enumoptequal, $enumoptright,
+ $boolopt, $booloptfalseprefix, $booloptleft, $booloptequal,
+ $booloptright,
+ $numopt, $numoptleft, $numoptequal, $numoptright,
+ $stropt, $stroptleft, $stroptequal, $stroptright,
+ $optsep, $trailer, $custompagesize);
+ if ($spooler eq 'cups') {
+ ($command,
+ $enumopt, $enumoptleft, $enumoptequal, $enumoptright,
+ $boolopt, $booloptfalseprefix, $booloptleft, $booloptequal,
+ $booloptright,
+ $numopt, $numoptleft, $numoptequal, $numoptright,
+ $stropt, $stroptleft, $stroptequal, $stroptright,
+ $optsep, $trailer, $custompagesize) =
+ ("lpr -P $printerstr ",
+ "-o ", "", "=", "",
+ "-o ", "no", "", "=", "",
+ "-o ", "", "=", "",
+ "-o ", "", "=", "",
+ " "," <file>",
+ "\n Custom size: -o PageSize=Custom." .
+ "<width>x<height>[<unit>]\n" .
+ " Units: pt (default), in, cm, mm\n" .
+ " Example: -o PageSize=Custom.4.0x6.0in\n");
+ } elsif ($spooler eq 'lpd') {
+ ($command,
+ $enumopt, $enumoptleft, $enumoptequal, $enumoptright,
+ $boolopt, $booloptfalseprefix, $booloptleft, $booloptequal,
+ $booloptright,
+ $numopt, $numoptleft, $numoptequal, $numoptright,
+ $stropt, $stroptleft, $stroptequal, $stroptright,
+ $optsep, $trailer, $custompagesize) =
+ ("lpr -P $printerstr -J \"",
+ "", "", "=", "",
+ "", "", "", "=", "",
+ "", "", "=", "",
+ "", "", "=", "",
+ " ", "\" <file>",
+ "\n Custom size: PageSize=Custom." .
+ "<width>x<height>[<unit>]\n" .
+ " Units: pt (default), in, cm, mm\n" .
+ " Example: PageSize=Custom.4.0x6.0in\n");
+ } elsif ($spooler eq 'gnulpr') {
+ ($command,
+ $enumopt, $enumoptleft, $enumoptequal, $enumoptright,
+ $boolopt, $booloptfalseprefix, $booloptleft, $booloptequal,
+ $booloptright,
+ $numopt, $numoptleft, $numoptequal, $numoptright,
+ $stropt, $stroptleft, $stroptequal, $stroptright,
+ $optsep, $trailer, $custompagesize) =
+ ("lpr -P $printerstr ",
+ "-o ", "", "=", "",
+ "-o ", "", "", "=", "",
+ "-o ", "", "=", "",
+ "-o ", "", "=", "",
+ " "," <file>",
+ "\n Custom size: -o PageSize=Custom." .
+ "<width>x<height>[<unit>]\n" .
+ " Units: pt (default), in, cm, mm\n" .
+ " Example: -o PageSize=Custom.4.0x6.0in\n");
+ } elsif ($spooler eq 'lprng') {
+ ($command,
+ $enumopt, $enumoptleft, $enumoptequal, $enumoptright,
+ $boolopt, $booloptfalseprefix, $booloptleft, $booloptequal,
+ $booloptright,
+ $numopt, $numoptleft, $numoptequal, $numoptright,
+ $stropt, $stroptleft, $stroptequal, $stroptright,
+ $optsep, $trailer, $custompagesize) =
+ ("lpr -P $printerstr ",
+ "-Z ", "", "=", "",
+ "-Z ", "", "", "=", "",
+ "-Z ", "", "=", "",
+ "-Z ", "", "=", "",
+ " "," <file>",
+ "\n Custom size: -Z PageSize=Custom." .
+ "<width>x<height>[<unit>]\n" .
+ " Units: pt (default), in, cm, mm\n" .
+ " Example: -Z PageSize=Custom.4.0x6.0in\n");
+ } elsif ($spooler eq 'ppr') {
+ ($command,
+ $enumopt, $enumoptleft, $enumoptequal, $enumoptright,
+ $boolopt, $booloptfalseprefix, $booloptleft, $booloptequal,
+ $booloptright,
+ $numopt, $numoptleft, $numoptequal, $numoptright,
+ $stropt, $stroptleft, $stroptequal, $stroptright,
+ $optsep, $trailer, $custompagesize) =
+ ("ppr -d $printerstr --ripopts \"",
+ "", "", "=", "",
+ "", "", "", "=", "",
+ "", "", "=", "",
+ "", "", "=", "",
+ " ","\" <file>",
+ "\n Custom size: PageSize=Custom." .
+ "<width>x<height>[<unit>]\n" .
+ " Units: pt (default), in, cm, mm\n" .
+ " Example: PageSize=Custom.4.0x6.0in\n");
+ } elsif ($spooler eq 'ppr-int') {
+ ($command,
+ $enumopt, $enumoptleft, $enumoptequal, $enumoptright,
+ $boolopt, $booloptfalseprefix, $booloptleft, $booloptequal,
+ $booloptright,
+ $numopt, $numoptleft, $numoptequal, $numoptright,
+ $stropt, $stroptleft, $stroptequal, $stroptright,
+ $optsep, $trailer, $custompagesize) =
+ ("ppr -d $printerstr -i \"",
+ "", "", "=", "",
+ "", "", "", "=", "",
+ "", "", "=", "",
+ "", "", "=", "",
+ " ","\" <file>",
+ "\n Custom size: PageSize=Custom." .
+ "<width>x<height>[<unit>]\n" .
+ " Units: pt (default), in, cm, mm\n" .
+ " Example: PageSize=Custom.4.0x6.0in\n");
+ } elsif ($spooler eq 'cps') {
+ ($command,
+ $enumopt, $enumoptleft, $enumoptequal, $enumoptright,
+ $boolopt, $booloptfalseprefix, $booloptleft, $booloptequal,
+ $booloptright,
+ $numopt, $numoptleft, $numoptequal, $numoptright,
+ $stropt, $stroptleft, $stroptequal, $stroptright,
+ $optsep, $trailer, $custompagesize) =
+ ("lpr -P $printerstr ",
+ "-o ", "", "=", "",
+ "-o ", "", "", "=", "",
+ "-o ", "", "=", "",
+ "-o ", "", "=", "",
+ " "," <file>",
+ "\n Custom size: -o PageSize=Custom." .
+ "<width>x<height>[<unit>]\n" .
+ " Units: pt (default), in, cm, mm\n" .
+ " Example: -o PageSize=Custom.4.0x6.0in\n");
+ } elsif ($spooler eq 'direct') {
+ ($command,
+ $enumopt, $enumoptleft, $enumoptequal, $enumoptright,
+ $boolopt, $booloptfalseprefix, $booloptleft, $booloptequal,
+ $booloptright,
+ $numopt, $numoptleft, $numoptequal, $numoptright,
+ $stropt, $stroptleft, $stroptequal, $stroptright,
+ $optsep, $trailer, $custompagesize) =
+ ("$programname -P $printerstr ",
+ "-o ", "", "=", "",
+ "-o ", "", "", "=", "",
+ "-o ", "", "=", "",
+ "-o ", "", "=", "",
+ " "," <file>",
+ "\n Custom size: -o PageSize=Custom." .
+ "<width>x<height>[<unit>]\n" .
+ " Units: pt (default), in, cm, mm\n" .
+ " Example: -o PageSize=Custom.4.0x6.0in\n");
+ } elsif ($spooler eq 'pdq') {
+ ($command,
+ $enumopt, $enumoptleft, $enumoptequal, $enumoptright,
+ $boolopt, $booloptfalseprefix, $booloptleft, $booloptequal,
+ $booloptright,
+ $numopt, $numoptleft, $numoptequal, $numoptright,
+ $stropt, $stroptleft, $stroptequal, $stroptright,
+ $optsep, $trailer, $custompagesize) =
+ ("pdq -P $printerstr ",
+ "-o", "", "_", "",
+ "-o", "no", "", "_", "",
+ "-a", "", "=", "",
+ "-a", "", "=", "",
+ " "," <file>",
+ "\n" .
+ "Option 'PageWidth':\n".
+ " Page Width (for \"Custom\" page size)\n" .
+ " A floating point number argument\n" .
+ " Range: 0 <= x <= 100000\n" .
+ " Example: -aPageWidth=123.4\n" .
+ "\n" .
+ "Option 'PageHeight':\n" .
+ " Page Height (for \"Custom\" page size)\n" .
+ " A floating point number argument\n" .
+ " Range: 0 <= x <= 100000\n" .
+ " Example: -aPageHeight=234.5\n" .
+ "\n" .
+ "Option 'PageSizeUnit':\n" .
+ " Unit (for \"Custom\" page size)\n" .
+ " An enumerated choice argument\n" .
+ " Possible choices:\n" .
+ " o -oPageSizeUnit_pt: Points (1/72 inch)\n" .
+ " o -oPageSizeUnit_in: Inches\n" .
+ " o -oPageSizeUnit_cm: cm\n" .
+ " o -oPageSizeUnit_mm: mm\n" .
+ " Example: -oPageSizeUnit_mm\n");
+ }
+
+ # Variables for the kid processes reporting their state
+
+ # Set up a pipe for the kids to pass their exit stat to the main process
+ pipe KID_MESSAGE_DOC, KID_MESSAGE_DOC_IN;
+
+ # When the kid fails put the exit stat here
+ $dockidfailed = 0;
+
+ # When the kid exits successfully, mark it here
+ $kid0finished = 0;
+
+ use IO::Handle;
+ pipe KID0_IN, KID0;
+ KID0->autoflush(1);
+ my $kid0 = fork();
+ if (!defined($kid0)) {
+ close KID0;
+ close KID0_IN;
+ print $logh "$0: cannot fork for kid0!\n";
+ rip_die ("can't fork for kid0",
+ $EXIT_PRNERR_NORETRY_BAD_SETTINGS);
+ }
+
+ if ($kid0) {
+ # we are the parent; return a glob to the filehandle
+ close KID0;
+ print $logh "Documentation page generator PID kid0=$kid0\n";
+ return ( *KID0_IN, $kid0 );
+ }
+
+ $kidgeneration += 1;
+
+ # we are the kid; we generate the documentation page
+
+ close KID0_IN;
+ $SIG{PIPE} = 'DEFAULT';
+
+ # Kill data on STDIN to satisfy PPR
+ if (($spooler eq 'ppr_int') || ($spooler eq 'ppr')) {
+ while (my $dummy = <STDIN>) {};
+ }
+ close STDIN
+ or print $logh "Error closing STDIN for docs print\n";
+
+ # write the job into KID0
+ select KID0;
+
+ print "\nInvokation summary for the $model\n\n";
+ print "Use the following command line:\n\n";
+ if ($booloptfalseprefix) {
+ # I think that what you want to indicate is that the prefix for a false
+ # boolean has this form: xxx [no]<switch> or something similar
+ print " ${command}${enumopt}${enumoptleft}<option>" .
+ "${enumoptequal}<choice>${enumoptright}${optsep}" .
+ "${boolopt}${booloptleft}\[${booloptfalseprefix}\]<switch>" .
+ "${booloptright}${optsep}" .
+ "${numopt}${numoptleft}<num. option>${numoptequal}" .
+ "<value>${numoptright}${optsep}" .
+ "${stropt}${stroptleft}<string option>${stroptequal}" .
+ "<string>${stroptright}" .
+ "${trailer}\n\n";
+ } else {
+ print " ${command}${enumopt}${enumoptleft}<option>" .
+ "${enumoptequal}<choice>${enumoptright}${optsep}" .
+ "${boolopt}${booloptleft}<switch>${booloptequal}" .
+ "<True/False>${booloptright}${optsep}" .
+ "${numopt}${numoptleft}<num. option>${numoptequal}" .
+ "<value>${numoptright}${optsep}" .
+ "${stropt}${stroptleft}<string option>${stroptequal}" .
+ "<string>${stroptright}" .
+ "${trailer}\n\n";
+ }
+
+ print "The following options are available for this printer:\n\n";
+
+ for my $arg (@{$dat->{'args'}}) {
+ my ($name,
+ $type,
+ $comment,
+ $spot,
+ $default) = ($arg->{'name'},
+ $arg->{'type'},
+ $arg->{'comment'},
+ $arg->{'spot'},
+ $arg->{'default'});
+
+ # Is this really an option? Otherwise skip it.
+ next if (!$type);
+
+ # We don't need "PageRegion", we have "PageSize"
+ next if ($name eq "PageRegion");
+
+ # Skip enumerated choice options with only one choice
+ next if (($type eq 'enum') && ($#{$arg->{'vals'}} < 1));
+
+ my $commentstr = "";
+ if ($comment) {
+ $commentstr = " $comment\n";
+ }
+
+ my $typestr;
+ if ($type eq "enum") {
+ $typestr = "An enumerated choice";
+ } elsif ($type eq "bool") {
+ $typestr = "A boolean";
+ } elsif ($type eq "int") {
+ $typestr = "An integer number";
+ } elsif ($type eq "float") {
+ $typestr = "A floating point number";
+ } elsif (($type eq "string") || ($type eq "password")) {
+ $typestr = "A string";
+ }
+
+ print "Option '$name':\n$commentstr $typestr argument\n";
+ print " This options corresponds to a JCL command\n" if ($arg->{'style'} eq 'J');
+
+ if ($type eq 'bool') {
+ print " Possible choices:\n";
+ if ($booloptfalseprefix) {
+ print " o $name: $arg->{'comment_true'}\n";
+ print " o $booloptfalseprefix$name: " .
+ "$arg->{'comment_false'}\n";
+ if (defined($default)) {
+ my $defstr = ($default ? "" : "$booloptfalseprefix");
+ print " Default: $defstr$name\n";
+ }
+ print " Example: ${boolopt}${booloptleft}${name}" .
+ "${booloptright}\n";
+ } else {
+ print " o True: $arg->{'comment_true'}\n";
+ print " o False: $arg->{'comment_false'}\n";
+ if (defined($default)) {
+ my $defstr = ($default ? "True" : "False");
+ print " Default: $defstr\n";
+ }
+ print " Example: ${boolopt}${booloptleft}${name}" .
+ "${booloptequal}True${booloptright}\n";
+ }
+ } elsif ($type eq 'enum') {
+ print " Possible choices:\n";
+ my $exarg;
+ my $havecustomsize = 0;
+ for (@{$arg->{'vals'}}) {
+ my ($choice, $comment) = ($_->{'value'}, $_->{'comment'});
+ print " o $choice: $comment\n";
+ if (($name eq "PageSize") && ($choice eq "Custom")) {
+ $havecustomsize = 1;
+ }
+ $exarg=$choice;
+ }
+ if (defined($default)) {
+ print " Default: $default\n";
+ }
+ print " Example: ${enumopt}${enumoptleft}${name}" .
+ "${enumoptequal}${exarg}${enumoptright}\n";
+ if ($havecustomsize) {
+ print $custompagesize;
+ }
+ } elsif ($type eq 'int' or $type eq 'float') {
+ my ($max, $min) = ($arg->{'max'}, $arg->{'min'});
+ my $exarg;
+ if (defined($max)) {
+ print " Range: $min <= x <= $max\n";
+ $exarg=$max;
+ }
+ if (defined($default)) {
+ print " Default: $default\n";
+ $exarg=$default;
+ }
+ if (!$exarg) { $exarg=0; }
+ print " Example: ${numopt}${numoptleft}${name}" .
+ "${numoptequal}${exarg}${numoptright}\n";
+ } elsif ($type eq 'string' or $type eq 'password') {
+ my $maxlength = $arg->{'maxlength'};
+ if (defined($maxlength)) {
+ print " Maximum length: $maxlength characters\n";
+ }
+ if (defined($default)) {
+ print " Default: $default\n";
+ }
+ print " Examples/special settings:\n";
+ for (@{$arg->{'vals'}}) {
+ my ($value, $comment, $driverval, $proto) =
+ ($_->{'value'}, $_->{'comment'}, $_->{'driverval'},
+ $arg->{'proto'});
+ # Retrieve the original string from the prototype
+ # and the driverval
+ my $string;
+ if ($proto) {
+ my $s = index($proto, '%s');
+ my $l = length($driverval) - length($proto) + 2;
+ if (($s < 0) || ($l < 0)) {
+ $string = $driverval;
+ } else {
+ $string = substr($driverval, $s, $l);
+ }
+ } else {
+ $string = $driverval;
+ }
+ print " o ${stropt}${stroptleft}${name}" .
+ "${stroptequal}${value}${stroptright}";
+ if (($value ne $string) || ($comment ne $value)) {
+ print " (";
+ }
+ if ($value ne $string) {
+ if ($string eq '') {
+ print "blank string";
+ } else {
+ print "\"$string\"";
+ }
+ }
+ if (($value ne $string) && ($comment ne $value)) {
+ print ", ";
+ }
+ if ($value ne $comment) {
+ print "$comment";
+ }
+ if (($value ne $string) || ($comment ne $value)) {
+ print ")";
+ }
+ print "\n";
+ }
+ }
+
+ print "\n";
+ }
+
+ select STDOUT;
+ close KID0
+ or print $logh "Error closing KID0 for docs print\n";
+ close STDOUT
+ or print $logh "Error closing STDOUT for docs print\n";
+
+ # Finished successfully, inform main process
+ close KID_MESSAGE_DOC;
+ print KID_MESSAGE_DOC_IN "0 $EXIT_PRINTED\n";
+ close KID_MESSAGE_DOC_IN;
+
+ print $logh "KID0 finished\n";
+ exit($EXIT_PRINTED);
+
+}
+
+
+
+## Close the documentation page generation process and wait until the
+## kid process finishes.
+
+sub closedocgeneratorhandle {
+
+ my ($handle, $pid) = @_;
+
+ print $logh "${added_lf}Closing documentation page generator\n";
+
+ # Do it!
+ close $handle;
+
+ # Wait for the kid process to finish or the kid process to fail
+ close KID_MESSAGE_DOC_IN;
+ while ((!$dockidfailed) &&
+ (!$kid0finished)) {
+ my $message = <KID_MESSAGE_DOC>;
+ chomp $message;
+ if ($message =~ /(\d+)\s+(\d+)/) {
+ my $kid_id = $1;
+ my $exitstat = $2;
+ print $logh "KID$kid_id exited with status $exitstat\n";
+ if ($exitstat > 0) {
+ $dockidfailed = $exitstat;
+ } elsif ($kid_id eq "0") {
+ $kid0finished = 1;
+ }
+ }
+ }
+
+ close KID_MESSAGE_DOC;
+
+ # If the kid failed, return the exit stat of the kid
+ if ($dockidfailed != 0) {
+ $retval = $dockidfailed;
+ }
+
+ print $logh "Documentation page generator exit stat: $retval\n";
+ # Wait for fileconverter child
+ waitpid($pid, 0);
+ print $logh "Documentation page generator process finished\n";
+ return ($retval);
+}
+
+
+
+# Find an argument by name in a case-insensitive way
+sub argbyname {
+ my $name = $_[0];
+
+ for my $arg (@{$dat->{'args'}}) {
+ return $arg if (lc($name) eq lc($arg->{'name'}));
+ }
+
+ return undef;
+}
+
+sub valbyname {
+ my ($arg,$name) = @_;
+
+ for my $val (@{$arg->{'vals'}}) {
+ return $val if (lc($name) eq lc($val->{'value'}));
+ }
+
+ return undef;
+}
+
+# Write a Good-Bye letter and clean up before committing suicide (send
+# error message to caller)
+
+sub rip_die {
+ my ($message, $exitstat) = @_;
+ my $errmsg = "$!";
+ my $errcod = $! + 0;
+
+ # Log that we are dying ...
+ print $logh "Process dying with \"$message\", exit stat: $exitstat\n\terror: $errmsg ($errcod)\n";
+
+ print $logh "Cleaning up ...\n";
+ foreach my $killsignal (15, 9) {
+
+ # Kill all registered subshells
+ foreach my $pid (keys %pids) {
+ print $logh "Killing process $pid ($pids{$pid}) and its subprocesses with signal $killsignal\n";
+ # This call kills the process group with group ID $pid, the
+ # group which was formed from the initial process $pid which
+ # contains $pid and all its subprocesses
+ kill(-$killsignal, $pid);
+ # If the system does not support process groups and therefore
+ # the call above does not kill anything, kill at least $pid
+ kill($killsignal, $pid);
+ }
+
+ # Close the documentation page generator (if it was used)
+ if ($kid0) {
+ print $logh "Killing process $kid0 (KID0) with signal $killsignal\n";
+ kill($killsignal, $kid0);
+ }
+
+ # Close the file converter (if it was used)
+ if ($kid2) {
+ print $logh "Killing process $kid2 (KID2) with signal $killsignal\n";
+ kill($killsignal, $kid2);
+ }
+ if ($kid1) {
+ print $logh "Killing process $kid1 (KID1) with signal $killsignal\n";
+ kill($killsignal, $kid1);
+ }
+
+ # Close the renderer
+ if ($kid4) {
+ print $logh "Killing process $kid4 (KID4) with signal $killsignal\n";
+ kill($killsignal, $kid4);
+ }
+ if ($kid3) {
+ print $logh "Killing process $kid3 (KID3) with signal $killsignal\n";
+ kill($killsignal, $kid3);
+ }
+
+ # Wait some time for the processes to close
+ sleep(5 - $kidgeneration) if $killsignal != 9;
+ }
+
+ # Do the debug dump and the PPR error handling only from the main process
+ if ($kidgeneration == 0) { # We are the main process
+
+ if ($spooler eq 'ppr_int') {
+ # Special error handling for PPR intefaces
+ $message =~ s/\\/\\\\/;
+ $message =~ s/\"/\\\"/;
+ my @messagelines = split("\n", $message);
+ my $firstline = "TRUE";
+ for my $line (@messagelines) {
+ modern_system("lib/alert $printer $firstline \"$line\"");
+ $firstline = "FALSE";
+ }
+ } else {
+ print STDERR $message . "\n";
+ }
+ if ($debug) {
+ use Data::Dumper;
+ local $Data::Dumper::Purity=1;
+ local $Data::Dumper::Indent=1;
+ print $logh Dumper($dat);
+ }
+ }
+
+ ## The End
+ print $logh "${added_lf}Closing foomatic-rip.\n";
+ close $logh;
+
+ exit $exitstat;
+}
+
+# Signal handling routines
+
+sub do_nothing {
+}
+
+sub set_exit_canceled {
+ $retval = $EXIT_PRINTED;
+ rip_die ("Caught termination signal: Job canceled", $retval);
+}
+
+sub set_exit_error {
+ $retval = $EXIT_SIGNAL;
+ rip_die ("Caught error signal: Error in renderer, driver, or foomatic-rip", $retval);
+}
+
+sub set_exit_prnerr {
+ $retval = $EXIT_PRNERR;
+}
+
+sub set_exit_prnerr_noretry {
+ $retval = $EXIT_PRNERR_NORETRY;
+}
+
+sub set_exit_engaged {
+ $retval = $EXIT_ENGAGED;
+}
+
+# Read the config file
+
+sub readConfFile {
+ my ($file) = @_;
+
+ my %conf;
+ # Read config file if present
+ if (open CONF, "< $file") {
+ while (<CONF>)
+ {
+ $conf{$1}="$2" if (m/^\s*([^\#\s]\S*)\s*:\s*(.*?)\s*$/);
+ }
+ close CONF;
+ }
+
+ return %conf;
+}
+
+sub removeunprintables {
+ # Remove unprintable characters
+ my $str = $_[0];
+ $str =~ s/[\x00-\x1f]//g;
+ return $str;
+}
+
+sub removeshellescapes {
+ # Remove shell escape characters
+ my $str = $_[0];
+ $str =~ s/[\|<>&!\$\'\"\#\*\?\(\)\[\]\{\}]//g;
+ return $str;
+}
+
+sub removespecialchars {
+ # Remove unprintable and shell escape characters
+ return removeshellescapes(removeunprintables($_[0]));
+}
+
+sub unhtmlify {
+ my $str = $_[0];
+
+ # Replace HTML/XML entities by the original characters
+ $str =~ s/\&apos;/\'/g;
+ $str =~ s/\&quot;/\"/g;
+ $str =~ s/\&gt;/\>/g;
+ $str =~ s/\&lt;/\</g;
+ $str =~ s/\&amp;/\&/g;
+
+ # Replace special entities by job data
+ $rbinumcopies = $copies if !$rbinumcopies;
+ $str =~ s/\&job;/$jobid/g;
+ $str =~ s/\&user;/$jobuser/g;
+ $str =~ s/\&host;/$jobhost/g;
+ $str =~ s/\&title;/$jobtitle/g;
+ $str =~ s/\&copies;/$copies/g;
+ $str =~ s/\&rbinumcopies;/$rbinumcopies/g;
+ $str =~ s/\&options;/$optstr/g;
+
+ my ($sec, $min, $hour, $mday, $mon, $year) = (localtime)[0..5];
+ my $yearstr = sprintf("%04d", $year + 1900);
+ my $monstr = sprintf("%02d", $mon + 1);
+ my $mdaystr = sprintf("%02d", $mday);
+ my $hourstr = sprintf("%02d", $hour);
+ my $minstr = sprintf("%02d", $min);
+ my $secstr = sprintf("%02d", $sec);
+
+ $str =~ s/\&year;/$yearstr/g;
+ $str =~ s/\&month;/$monstr/g;
+ $str =~ s/\&date;/$mdaystr/g;
+ $str =~ s/\&hour;/$hourstr/g;
+ $str =~ s/\&min;/$minstr/g;
+ $str =~ s/\&sec;/$secstr/g;
+
+ return $str;
+}
+
+sub unhexify {
+ # Replace hex notation for unprintable characters in PPD files
+ # by the actual characters ex: "<0A>" --> chr(hex("0A"))
+ my ($input) = @_;
+ my $output = "";
+ my $hexmode = 0;
+ my $firstdigit = "";
+ for (my $i = 0; $i < length($input); $i ++) {
+ my $c = substr($input, $i, 1);
+ if ($hexmode) {
+ if ($c eq ">") {
+ # End of hex string
+ $hexmode = 0;
+ } elsif ($c =~ /^[0-9a-fA-F]$/) {
+ # Hexadecimal digit, two of them give a character
+ if ($firstdigit ne "") {
+ $output .= chr(hex("$firstdigit$c"));
+ $firstdigit = "";
+ } else {
+ $firstdigit = $c;
+ }
+ }
+ } else {
+ if ($c eq "<") {
+ # Beginning of hex string
+ $hexmode = 1;
+ } else {
+ # Normal character
+ $output .= $c;
+ }
+ }
+ }
+ return $output;
+}
+
+sub undossify( $ ) {
+ # Remove "dossy" line ends ("\r\n") from a string
+ my $str = $_[0];
+ $str =~ s/\r\n/\n/gs;
+ $str =~ s/\r$//s;
+ return( $str );
+}
+
+sub checkarg {
+ # Check if there is already an argument record $argname in $dat, if not,
+ # create one
+ my ($dat, $argname) = @_;
+ return if defined($dat->{'args_byname'}{$argname});
+ # argument record
+ my $rec;
+ $rec->{'name'} = $argname;
+ # Insert record in 'args' array for browsing all arguments
+ push(@{$dat->{'args'}}, $rec);
+ # 'args_byname' hash for looking up arguments by name
+ $dat->{'args_byname'}{$argname} = $dat->{'args'}[$#{$dat->{'args'}}];
+ # Default execution style is 'G' (PostScript) since all arguments for
+ # which we don't find "*Foomatic..." keywords are usual PostScript
+ # options
+ $dat->{'args_byname'}{$argname}{'style'} = 'G';
+ # Default prototype for code to insert, used by enum options
+ $dat->{'args_byname'}{$argname}{'proto'} = '%s';
+ # stop Perl nattering about undefined to string comparisons
+ $dat->{'args_byname'}{$argname}{'type'} = '';
+ print $logh "Added option $argname\n";
+}
+
+sub checksetting {
+ # Check if there is already an choice record $setting in the $argname
+ # argument in $dat, if not, create one
+ my ($dat, $argname, $setting) = @_;
+ return if
+ defined($dat->{'args_byname'}{$argname}{'vals_byname'}{$setting});
+ # setting record
+ my $rec;
+ $rec->{'value'} = $setting;
+ # Insert record in 'vals' array for browsing all settings
+ push(@{$dat->{'args_byname'}{$argname}{'vals'}}, $rec);
+ # 'vals_byname' hash for looking up settings by name
+ $dat->{'args_byname'}{$argname}{'vals_byname'}{$setting} =
+ $dat->{'args_byname'}{$argname}{'vals'}[$#{$dat->{'args_byname'}{$argname}{'vals'}}];
+}
+
+sub removearg {
+ # remove the argument record $argname from $dat
+ my ($dat, $argname) = @_;
+ return if !defined($dat->{'args_byname'}{$argname});
+ # Remove 'args_byname' hash for looking up arguments by name
+ delete $dat->{'args_byname'}{$argname};
+ # Remove argument itself
+ for (my $i = 0; $i <= $#{$dat->{'args'}}; $i ++) {
+ if ($dat->{'args'}[$i]{'name'} eq $argname) {
+ print $logh "Removing option " .
+ $argname . "\n";
+ splice(@{$dat->{'args'}}, $i, 1);
+ last;
+ }
+ }
+}
+
+sub removepsargs {
+ # remove all records of PostScript arguments from $dat
+ my ($dat) = @_;
+ return if !defined($dat);
+ for (my $i = 0; $i <= $#{$dat->{'args'}}; $i ++) {
+ if ($dat->{'args'}[$i]{'style'} eq 'G') {
+ print $logh "Removing PostScript option " .
+ $dat->{'args'}[$i]{'name'} . "\n";
+ # Remove 'args_byname' hash for looking up arguments by name
+ delete $dat->{'args_byname'}{$dat->{'args'}[$i]{'name'}};
+ # Remove argument itself
+ splice(@{$dat->{'args'}}, $i, 1);
+ $i --;
+ }
+ }
+}
+
+sub checkoptionvalue {
+
+ ## This function checks whether a given value is valid for a given
+ ## option. If yes, it returns a cleaned value (e. g. always 0 or 1
+ ## for boolean options), otherwise "undef". If $forcevalue is set,
+ ## we always determine a corrected value to insert (we never return
+ ## "undef").
+
+ # Is $value valid for the option named $argname?
+ my ($dat, $argname, $value, $forcevalue) = @_;
+
+ # Record for option $argname
+ my $arg = $dat->{'args_byname'}{$argname};
+ $arg->{'type'} = '' if not defined $arg->{'type'};
+
+ if ($arg->{'type'} eq 'bool') {
+ my $lcvalue = lc($value);
+ if ((($lcvalue) eq 'true') ||
+ (($lcvalue) eq 'on') ||
+ (($lcvalue) eq 'yes') ||
+ (($lcvalue) eq '1')) {
+ return 1;
+ } elsif ((($lcvalue) eq 'false') ||
+ (($lcvalue) eq 'off') ||
+ (($lcvalue) eq 'no') ||
+ (($lcvalue) eq '0')) {
+ return 0;
+ } elsif ($forcevalue) {
+ # This maps Unknown to mean False. Good? Bad?
+ # It was done so in Foomatic 2.0.x, too.
+ my $name = $arg->{'name'};
+ print $logh
+ "The value $value for $name is not a " .
+ "choice!\n" .
+ " --> Using False instead!\n";
+ return 0;
+ }
+ } elsif ($arg->{'type'} eq 'enum') {
+ if ($value =~ /^None$/i) {
+ return 'None';
+ } elsif (defined($arg->{'vals_byname'}{$value})) {
+ return $value;
+ } elsif ((($arg->{'name'} eq "PageSize") ||
+ ($arg->{'name'} eq "PageRegion")) &&
+ (defined($arg->{'vals_byname'}{'Custom'})) &&
+ ($value =~ m!^Custom\.([\d\.]+)x([\d\.]+)([A-Za-z]*)$!)) {
+ # Custom paper size
+ return $value;
+ } elsif ($forcevalue) {
+ # wtf!? that's not a choice!
+ my $name = $arg->{'name'};
+ # Return the first entry of the list
+ my $firstentry = $arg->{'vals'}[0]{'value'};
+ print $logh
+ "The value $value for $name is not a " .
+ "choice!\n" .
+ " --> Using $firstentry instead!\n";
+ return $firstentry;
+ }
+ } elsif (($arg->{'type'} eq 'int') ||
+ ($arg->{'type'} eq 'float')) {
+ if (($value <= $arg->{'max'}) &&
+ ($value >= $arg->{'min'})) {
+ if ($arg->{'type'} eq 'int') {
+ return POSIX::floor($value);
+ } else {
+ return $value;
+ }
+ } elsif ($forcevalue) {
+ my $name = $arg->{'name'};
+ my $newvalue;
+ if ($value > $arg->{'max'}) {
+ $newvalue = $arg->{'max'}
+ } elsif ($value < $arg->{'min'}) {
+ $newvalue = $arg->{'min'}
+ }
+ print $logh
+ "The value $value for $name is out of " .
+ "range!\n" .
+ " --> Using $newvalue instead!\n";
+ return $newvalue;
+ }
+ } elsif (($arg->{'type'} eq 'string') ||
+ ($arg->{'type'} eq 'password')) {
+ if (defined($arg->{'vals_byname'}{$value})) {
+ my $name = $arg->{'name'};
+ print $logh
+ "The value $value for $name is a predefined choice\n";
+ return $value;
+ } elsif (stringvalid($dat, $argname, $value)) {
+ # Check whether the string is one of the enumerated choices
+ my $sprintfproto = $arg->{'proto'};
+ $sprintfproto =~ s/\%(?!s)/\%\%/g;
+ my $driverval = sprintf($sprintfproto, $value);
+ for my $val (@{$arg->{'vals'}}) {
+ if (($val->{'driverval'} eq $driverval) ||
+ ($val->{'driverval'} eq $value)) {
+ my $name = $arg->{'name'};
+ print $logh
+ "The string $value for $name is the predefined " .
+ "choice $val->{value}\n";
+ return $val->{value};
+ }
+ }
+ # "None" is mapped to the empty string
+ if ($value eq 'None') {
+ my $name = $arg->{'name'};
+ print $logh
+ "Option $name: 'None' is the mapped to the " .
+ "empty string\n";
+ return '';
+ }
+ # No matching choice? Return the original string
+ return $value;
+ } elsif ($forcevalue) {
+ my $name = $arg->{'name'};
+ my $str = substr($value, 0, $arg->{'maxlength'});
+ if (stringvalid($dat, $argname, $str)) {
+ print $logh
+ "The string $value for $name is longer than " .
+ "$arg->{'maxlength'}, string shortened to $str\n";
+ return $str;
+ } elsif ($#{$arg->{'vals'}} >= 0) {
+ # First list item
+ my $firstentry = $arg->{'vals'}[0]{'value'};
+ print $logh
+ "The string $value for $name contains forbidden " .
+ "characters or does not match the regular expression " .
+ "defined for this option, using predefined choice " .
+ "$firstentry instead\n";
+ return $firstentry;
+ } else {
+ # We should not get here
+ rip_die("Option $name incorrectly defined in the " .
+ "PPD file!\n", $EXIT_PRNERR_NORETRY_BAD_SETTINGS);
+ }
+ }
+ }
+ return undef;
+}
+
+sub stringvalid {
+
+ ## Checks whether a user-supplied value for a string option is valid
+ ## It must be within the length limit, should only contain allowed
+ ## characters and match the given regexp
+
+ # Option and string
+ my ($dat, $argname, $value) = @_;
+
+ my $arg = $dat->{'args_byname'}{$argname};
+
+ # Maximum length
+ return 0 if (defined($arg->{'maxlength'}) &&
+ (length($value) > $arg->{'maxlength'}));
+
+ # Allowed characters
+ if ($arg->{'allowedchars'}) {
+ my $chars = $arg->{'allowedchars'};
+ # Quote the slashes (if a slash is preceeded by an even number of
+ # backslashes, it is not already quoted)
+ $chars =~ s/(?<!\\)((\\\\)*)\//$2\\\//g;
+ return 0 if $value !~ /^[$chars]*$/;
+ }
+
+ # Regular expression
+ if ($arg->{'allowedregexp'}) {
+ my $regexp = $arg->{'allowedregexp'};
+ # Quote the slashes (if a slash is preceeded by an even number of
+ # backslashes, it is not already quoted)
+ $regexp =~ s/(?<!\\)((\\\\)*)\//$2\\\//g;
+ return 0 if $value !~ /$regexp/;
+ }
+
+ # All checks passed
+ return 1;
+}
+
+sub checkoptions {
+
+ ## Let the values of a boolean option being 0 or 1 instead of
+ ## "True" or "False", range-check the defaults of all options and
+ ## issue warnings if the values are not valid
+
+ # Option set to be examined
+ my ($dat, $optionset) = @_;
+
+ for my $arg (@{$dat->{'args'}}) {
+ if (defined($arg->{$optionset})) {
+ $arg->{$optionset} =
+ checkoptionvalue
+ ($dat, $arg->{'name'}, $arg->{$optionset}, 1);
+ }
+ }
+
+ # If the settings for "PageSize" and "PageRegion" are different,
+ # set the one for "PageRegion" to the one for "PageSize" and issue
+ # a warning.
+ if ($dat->{'args_byname'}{'PageSize'}{$optionset} ne
+ $dat->{'args_byname'}{'PageRegion'}{$optionset}) {
+ print $logh "Settings for \"PageSize\" and \"PageRegion\" are " .
+ "different:\n" .
+ " PageSize: $dat->{'args_byname'}{'PageSize'}{$optionset}\n" .
+ " PageRegion: ".
+ "$dat->{'args_byname'}{'PageRegion'}{$optionset}\n" .
+ "Using the \"PageSize\" value " .
+ "\"$dat->{'args_byname'}{'PageSize'}{$optionset}\"," .
+ " for both.\n";
+ $dat->{'args_byname'}{'PageRegion'}{$optionset} =
+ $dat->{'args_byname'}{'PageSize'}{$optionset};
+ }
+}
+
+# If the PageSize or PageRegion was changed, also change the other
+
+sub syncpagesize {
+
+ # Name and value of the option we set, and the option set where we
+ # did the change
+ my ($dat, $name, $value, $optionset) = @_;
+
+ # Don't do anything if we were called with an option other than
+ # "PageSize" or "PageRegion"
+ return if (($name ne "PageSize") && ($name ne "PageRegion"));
+
+ # Don't do anything if not both "PageSize" and "PageRegion" exist
+ return if ((!defined($dat->{'args_byname'}{'PageSize'})) ||
+ (!defined($dat->{'args_byname'}{'PageRegion'})));
+
+ my $dest;
+
+ # "PageSize" --> "PageRegion"
+ if ($name eq "PageSize") {
+ $dest = "PageRegion";
+ }
+
+ # "PageRegion" --> "PageSize"
+ if ($name eq "PageRegion") {
+ $dest = "PageSize";
+ }
+
+ # Do it!
+ my $val;
+ if ($val=valbyname($dat->{'args_byname'}{$dest}, $value)) {
+ # Standard paper size
+ $dat->{'args_byname'}{$dest}{$optionset} = $val->{'value'};
+ } elsif ($val=valbyname($dat->{'args_byname'}{$dest}, "Custom")) {
+ # Custom paper size
+ $dat->{'args_byname'}{$dest}{$optionset} = $value;
+ }
+}
+
+sub copyoptions {
+
+ ## Copy one option set into another one
+
+ # Source and destination option sets
+ my ($dat, $srcoptionset, $destoptionset) = @_;
+
+ for my $arg (@{$dat->{'args'}}) {
+ if (defined($arg->{$srcoptionset})) {
+ $arg->{$destoptionset} = $arg->{$srcoptionset};
+ }
+ }
+}
+
+sub deleteoptions {
+
+ ## Delete an option set
+
+ # option set to be removed
+ my ($dat, $optionset) = @_;
+
+ for my $arg (@{$dat->{'args'}}) {
+ if (defined($arg->{$optionset})) {
+ delete($arg->{$optionset});
+ }
+ }
+}
+
+sub optionsequal {
+
+ ## Compare two option sets, if they are equal, return 1, otherwise 0
+
+ # Option sets to be compared, flag to compare only command line and JCL
+ # options
+ my ($dat, $firstoptionset, $secondoptionset, $exceptPS) = @_;
+
+ for my $arg (@{$dat->{'args'}}) {
+ next if ($exceptPS && ($arg->{'style'} eq 'G'));
+ if ((defined($arg->{$firstoptionset})) &&
+ (defined($arg->{$secondoptionset}))) {
+ # Both entries exist
+ return 0 if $arg->{$firstoptionset} ne $arg->{$secondoptionset};
+ } elsif ((defined($arg->{$firstoptionset})) ||
+ (defined($arg->{$secondoptionset}))) {
+ # One entry exists
+ return 0;
+ }
+ # If no entry exists, the non-existing entries are considered as
+ # equal
+ }
+ return 1;
+}
+
+sub makeprologsection {
+
+ # option set to be used,
+ # $comments = 1: Add "%%BeginProlog...%%EndProlog"
+ my ($dat, $optionset, $comments) = @_;
+
+ # Collect data to be inserted here
+ my @output;
+
+ # Start comment
+ if ($comments) {
+ print $logh "\"Prolog\" section is missing, inserting it.\n";
+ push(@output, "%%BeginProlog\n");
+ }
+
+ # Generate the option code (not necessary when CUPS is spooler)
+ if ($spooler ne 'cups') {
+ print $logh "Inserting option code into \"Prolog\" section.\n";
+ buildcommandline ($dat, $optionset);
+ push(@output, @{$dat->{'prologprepend'}});
+ }
+
+ # End comment
+ if ($comments) {
+ push(@output, "%%EndProlog\n");
+ }
+
+ return join('', @output);
+}
+
+sub makesetupsection {
+
+ # option set to be used, $comments = 1: Add "%%BeginSetup...%%EndSetup"
+ my ($dat, $optionset, $comments) = @_;
+
+ # Collect data to be inserted here
+ my @output;
+
+ # Start comment
+ if ($comments) {
+ print $logh "\"Setup\" section is missing, inserting it.\n";
+ push(@output, "%%BeginSetup\n");
+ }
+
+ # PostScript code to generate accounting messages for CUPS
+ if ($spooler eq 'cups') {
+ print $logh "Inserting PostScript code for CUPS' page accounting\n";
+ push(@output, $accounting_prolog);
+ }
+
+ # Generate the option code (not necessary when CUPS is spooler)
+ if ($spooler ne 'cups') {
+ print $logh "Inserting option code into \"Setup\" section.\n";
+ buildcommandline ($dat, $optionset);
+ push(@output, @{$dat->{'setupprepend'}});
+ }
+
+ # End comment
+ if ($comments) {
+ push(@output, "%%EndSetup\n");
+ }
+
+ return join('', @output);
+}
+
+sub makepagesetupsection {
+
+ # option set to be used,
+ # $comments = 1: Add "%%BeginPageSetup...%%EndPageSetup"
+ my ($dat, $optionset, $comments) = @_;
+
+ # Collect data to be inserted here
+ my @output;
+
+ # Start comment
+ if ($comments) {
+ push(@output, "%%BeginPageSetup\n");
+ print $logh "\"PageSetup\" section is missing, inserting it.\n";
+ }
+
+ # Generate the option code (not necessary when CUPS is spooler)
+ print $logh "Inserting option code into \"PageSetup\" section.\n";
+ buildcommandline ($dat, $optionset);
+ if ($spooler ne 'cups') {
+ push(@output, @{$dat->{'pagesetupprepend'}});
+ } else {
+ push(@output, @{$dat->{'cupspagesetupprepend'}});
+ }
+
+ # End comment
+ if ($comments) {
+ push(@output, "%%EndPageSetup\n");
+ }
+
+ return join('', @output);
+}
+
+sub parsepageranges {
+
+ ## Parse a string containing page ranges and either check whether a
+ ## given page is in the ranges or, if the given page number is zero,
+ ## determine the score how specific this page range string is.
+
+ # String with page ranges and number of current page (0 for score)
+ my ($ranges, $page) = @_;
+
+ my $currentnumber = 0;
+ my $rangestart = 0;
+ my $currentkeyword = '';
+ my $invalidrange = 0;
+ my $totalscore = 0;
+ my $pageinside = 0;
+ my $currentrange = '';
+
+ my $evaluaterange = sub {
+ # evaluate the current range: determine its score and whether the
+ # current page is member of it.
+ if ($invalidrange) {
+ # Range is invalid, issue a warning
+ print $logh " Invalid range: $currentrange\n";
+ } else {
+ # We have a valid range, evaluate it
+ if ($currentkeyword) {
+ if ($currentkeyword =~ /^even/i) {
+ # All even-numbered pages
+ $totalscore += 50000;
+ $pageinside = 1 if (($page % 2) == 0);
+ } elsif ($currentkeyword =~ /^odd/i) {
+ # All odd-numbered pages
+ $totalscore += 50000;
+ $pageinside = 1 if (($page % 2) == 1);
+ } else {
+ # Invalid range
+ print $logh " Invalid range: $currentrange\n";
+ }
+ } elsif (($rangestart == 0) && ($currentnumber > 0)) {
+ # Page range is a single page
+ $totalscore += 1;
+ $pageinside = 1 if ($page == $currentnumber);
+ } elsif (($rangestart > 0) && ($currentnumber > 0)) {
+ # Page range is a sequence of pages
+ $totalscore += (abs($currentnumber - $rangestart) + 1);
+ if ($currentnumber < $rangestart) {
+ my $tmp = $currentnumber;
+ $currentnumber = $rangestart;
+ $rangestart = $tmp;
+ }
+ $pageinside = 1 if (($page <= $currentnumber) &&
+ ($page >= $rangestart));
+ } elsif ($rangestart > 0) {
+ # Page range goes to the end of the document
+ $totalscore += 100000;
+ $pageinside = 1 if ($page >= $rangestart);
+ } else {
+ # Invalid range
+ print $logh " Invalid range: $currentrange\n";
+ }
+ }
+ # Range is evaluated, remove all recordings of the current range
+ $rangestart = 0;
+ $currentnumber = 0;
+ $currentkeyword = '';
+ $invalidrange = 0;
+ $currentrange = '';
+ };
+
+ for (my $i = 0; $i < length($ranges); $i ++) {
+ my $c = substr($ranges, $i, 1);
+ if (!$invalidrange) {
+ if ($c =~ /\d/) {
+ # Digit
+ if ($currentkeyword) {
+ # Add to keyword
+ $currentkeyword .= $c;
+ } else {
+ # Build a page number
+ $currentnumber *= 10;
+ $currentnumber += $c;
+ }
+ } elsif ($c =~ /[a-z_]/i) {
+ # Letter or underscore
+ if (($rangestart > 0) || ($currentnumber > 0)) {
+ # Keyword not allowed after a page number or a
+ # page range
+ $invalidrange = 1;
+ } else {
+ # Build a keyword
+ $currentkeyword .= $c;
+ }
+ } elsif ($c eq '-') {
+ # Page range
+ if (($rangestart > 0) || ($currentkeyword)) {
+ # Keyword or two '-' not allowed in page range
+ $invalidrange = 1;
+ } else {
+ # Save start of range, reset page number
+ $rangestart = $currentnumber;
+ if ($rangestart == 0) {
+ $rangestart = 1;
+ }
+ $currentnumber = 0;
+ }
+ }
+ }
+ if ($c eq ',') {
+ # End of a range
+ &$evaluaterange();
+ } else {
+ # Make a string of the current range, for warnings
+ $currentrange .= $c;
+ }
+ }
+ # End of input string
+ &$evaluaterange();
+ # Return value
+ if (($page == 0) || ($pageinside)) {
+ return $totalscore;
+ } else {
+ return 0;
+ }
+}
+
+sub setoptionsforpage {
+
+ ## Set the options for a given page
+
+ # Foomatic data, name of the option set where to apply the options, and
+ # number of the page
+ my ($dat, $optionset, $page) = @_;
+
+ my $value;
+ for my $arg (@{$dat->{'args'}}) {
+ $value = '';
+ my $bestscore = 10000000;
+ for my $key (keys %{$arg}) {
+ next if $key !~ /^pages:(.*)$/;
+ my $pageranges = $1;
+ if (my $score = parsepageranges($pageranges, $page)) {
+ if ($score <= $bestscore) {
+ $bestscore = $score;
+ $value = $arg->{$key};
+ }
+ }
+ }
+ if ($value) {
+ $arg->{$optionset} = $value;
+ }
+ }
+}
+
+sub buildcommandline {
+
+ ## Build a renderer command line, based on the given option set
+
+ # Foomatic data and name of the option set to apply
+ my ($dat, $optionset) = @_;
+
+ # Construct the proper command line.
+ $dat->{'currentcmd'} = $dat->{'cmd'};
+ my @prologprepend;
+ my @setupprepend;
+ my @pagesetupprepend;
+ my @cupspagesetupprepend;
+ my @jclprepend;
+ my @jclappend;
+
+ # At first search for composite options and determine how they
+ # set their member options
+ for my $arg (@{$dat->{'args'}}) { $arg->{'order'} = 0 if !defined $arg->{'order'}; }
+ for my $arg (sort { $a->{'order'} <=> $b->{'order'} }
+ @{$dat->{'args'}}) {
+
+ # Here we are only interested in composite options, skip the others
+ next if $arg->{'style'} ne 'X';
+
+ my $name = $arg->{'name'};
+ # Check whether this composite option is controlled by another
+ # composite option, so nested composite options are possible.
+ my $userval = ($arg->{'fromcomposite'} ?
+ $arg->{'fromcomposite'} : $arg->{$optionset});
+
+ # Get the current setting
+ my $v = $arg->{'vals_byname'}{$userval};
+ my @settings = split(/\s+/s, $v->{'driverval'});
+ for my $s (@settings) {
+ my ($key, $value);
+ if ($s =~ /^([^=]+)=(.+)$/) {
+ $key = $1;
+ $value = $2;
+ } elsif ($s =~ /^no([^=]+)$/) {
+ $key = $1;
+ $value = 0;
+ } elsif ($s =~ /^([^=]+)$/) {
+ $key = $1;
+ $value = 1;
+ }
+ $a = $dat->{'args_byname'}{$key};
+ if ($a->{$optionset} eq "From$name") {
+ # We must set this option according to the
+ # composite option
+ $a->{'fromcomposite'} = $value;
+ # Mark the option telling by which composite option
+ # it is controlled
+ $a->{'controlledby'} = $name;
+ } else {
+ $a->{'fromcomposite'} = "";
+ }
+ }
+ # Remove PostScript code to be inserted after an appearance of the
+ # Composite option in the PostScript code.
+ undef $arg->{'jclsetup'};
+ undef $arg->{'prolog'};
+ undef $arg->{'setup'};
+ undef $arg->{'pagesetup'};
+ }
+
+ for my $arg (sort { $a->{'order'} <=> $b->{'order'} }
+ @{$dat->{'args'}}) {
+
+ # Composite options have no direct influence on the command
+ # line, skip them here
+ next if $arg->{'style'} eq 'X';
+
+ my $name = $arg->{'name'};
+ my $spot = $arg->{'spot'};
+ my $cmd = $arg->{'proto'};
+ my $cmdf = $arg->{'protof'};
+ my $type = ($arg->{'type'} || "");
+ my $section = $arg->{'section'};
+ my $userval = ($arg->{'fromcomposite'} ?
+ $arg->{'fromcomposite'} : $arg->{$optionset});
+ my $cmdvar = "";
+
+ # If we have both "PageSize" and "PageRegion" options, we kept
+ # them all the time in sync, so we don't need to insert the settings
+ # of both options. So skip "PageRegion".
+ next if (($name eq "PageRegion") &&
+ (defined($dat->{'args_byname'}{'PageSize'})) &&
+ (defined($dat->{'args_byname'}{'PageRegion'})));
+
+ # Build the command line snippet/PostScript/JCL code for the current
+ # option
+ if ($type eq 'bool') {
+
+ # If true, stick the proto into the command line, if false
+ # and we have a proto for false, stick that in
+ if (defined($userval) && $userval == 1) {
+ $cmdvar = $cmd;
+ } elsif ($cmdf) {
+ $userval = 0;
+ $cmdvar = $cmdf;
+ }
+
+ } elsif ($type eq 'int' or $type eq 'float') {
+
+ # If defined, process the proto and stick the result into
+ # the command line or postscript queue.
+ if (defined($userval)) {
+ my $min = $arg->{'min'};
+ my $max = $arg->{'max'};
+ # We have already range-checked, correct only
+ # floating point inaccuricies here
+ if ($userval < $min) {
+ $userval = $min;
+ }
+ if ($userval > $max) {
+ $userval = $max;
+ }
+ my $sprintfcmd = $cmd;
+ $sprintfcmd =~ s/\%(?!s)/\%\%/g;
+ $cmdvar = sprintf($sprintfcmd,
+ ($type eq 'int'
+ ? sprintf("%d", $userval)
+ : sprintf("%f", $userval)));
+ } else {
+ $userval = 'None';
+ }
+
+ } elsif ($type eq 'enum') {
+
+ # If defined, stick the selected value into the proto and
+ # thence into the commandline
+ if (defined($userval)) {
+ # CUPS assumes that options with the choices "Yes", "No",
+ # "On", "Off", "True", or "False" are boolean options and
+ # maps "-o Option=On" to "-o Option" and "-o Option=Off"
+ # to "-o noOption", which foomatic-rip maps to "0" and "1".
+ # So when "0" or "1" is unavailable in the option, we try
+ # "Yes", "No", "On", "Off", "True", and "False".
+ my $val;
+ my $found = 0;
+ if ($val=valbyname($arg,$userval)) {
+ $found = 1;
+ } elsif ($userval =~ /^Custom\.[\d\.]+x[\d\.]+[A-Za-z]*$/) {
+ # Custom paper size
+ $val = valbyname($arg,"Custom");
+ $found = 1;
+ } elsif ($userval =~ /^(0|No|Off|False)$/i) {
+ foreach (qw(0 No Off False None)) {
+ if ($val=valbyname($arg,$_)) {
+ $userval = $_;
+ $arg->{$optionset} = $userval;
+ $found = 1;
+ last;
+ }
+ }
+ } elsif ($userval =~ /^(1|Yes|On|True)$/i) {
+ foreach (qw(1 Yes On True)) {
+ if ($val=valbyname($arg,$_)) {
+ $userval = $_;
+ $arg->{$optionset} = $userval;
+ $found = 1;
+ last;
+ }
+ }
+ } elsif ($userval =~ /^(LongEdge|DuplexNoTumble)$/i) {
+ # Handle different names for the choices of the
+ # "Duplex" option
+ foreach (qw(LongEdge DuplexNoTumble)) {
+ if ($val=valbyname($arg,$_)) {
+ $userval = $_;
+ $arg->{$optionset} = $userval;
+ $found = 1;
+ last;
+ }
+ }
+ } elsif ($userval =~ /^(ShortEdge|DuplexTumble)$/i) {
+ foreach (qw(ShortEdge DuplexTumble)) {
+ if ($val=valbyname($arg,$_)) {
+ $userval = $_;
+ $arg->{$optionset} = $userval;
+ $found = 1;
+ last;
+ }
+ }
+ }
+ if ($found) {
+ my $sprintfcmd = $cmd;
+ $sprintfcmd =~ s/\%(?!s)/\%\%/g;
+ $cmdvar = sprintf($sprintfcmd,
+ (defined($val->{'driverval'})
+ ? $val->{'driverval'}
+ : $val->{'value'}));
+ # Custom paper size
+ if ($userval =~ /^Custom\.([\d\.]+)x([\d\.]+)([A-Za-z]*)$/) {
+ my $width = $1;
+ my $height = $2;
+ my $unit = $3;
+ # convert width and height to PostScript points
+ if (lc($unit) eq "in") {
+ $width *= 72.0;
+ $height *= 72.0;
+ } elsif (lc($unit) eq "cm") {
+ $width *= (72.0/2.54);
+ $height *= (72.0/2.54);
+ } elsif (lc($unit) eq "mm") {
+ $width *= (72.0/25.4);
+ $height *= (72.0/25.4);
+ }
+ # Round width and height
+ $width =~ s/\.[0-4].*$// or
+ $width =~ s/\.[5-9].*$// and $width += 1;
+ $height =~ s/\.[0-4].*$// or
+ $height =~ s/\.[5-9].*$// and $height += 1;
+ # Insert width and height into the prototype
+ if ($cmdvar =~ /^\s*pop\W/s) {
+ # Custom page size for PostScript printers
+ $cmdvar = "$width $height 0 0 0\n$cmdvar";
+ } else {
+ # Custom page size for Foomatic/Gutenprint/
+ # Gimp-Print
+ $cmdvar =~ s/\%0/$width/ or
+ $cmdvar =~ s/(\W)0(\W)/$1$width$2/ or
+ $cmdvar =~ s/^0(\W)/$width$1/m or
+ $cmdvar =~ s/(\W)0$/$1$width/m or
+ $cmdvar =~ s/^0$/$width/m;
+ $cmdvar =~ s/\%1/$height/ or
+ $cmdvar =~ s/(\W)0(\W)/$1$height$2/ or
+ $cmdvar =~ s/^0(\W)/$height$1/m or
+ $cmdvar =~ s/(\W)0$/$1$height/m or
+ $cmdvar =~ s/^0$/$height/m;
+ }
+ }
+ } else {
+ # User gave unknown value?
+ $userval = 'None';
+ print $logh "Value $userval for $name is not a valid choice.\n";
+ }
+ } else {
+ $userval = 'None';
+ }
+
+ } elsif (($type eq 'string') || ($type eq 'password')) {
+ # Stick the entered value into the proto and
+ # thence into the commandline
+ if (defined($userval)) {
+ my $val;
+ if ($val=valbyname($arg,$userval)) {
+ $userval = $val->{'value'};
+ $cmdvar = (defined($val->{'driverval'})
+ ? $val->{'driverval'}
+ : $val->{'value'});
+ } else {
+ my $sprintfcmd = $cmd;
+ $sprintfcmd =~ s/\%(?!s)/\%\%/g;
+ $cmdvar = sprintf($sprintfcmd, $userval);
+ }
+ } else {
+ $userval = 'None';
+ }
+
+ } else {
+ # Ignore unknown option types silently
+ }
+
+ # Insert the built snippet at the correct place
+ if ($arg->{'style'} eq 'G') {
+ # Place this Postscript command onto the prepend queue
+ # for the appropriate section.
+ if ($cmdvar) {
+ my $open = "[{\n%%BeginFeature: *$name ";
+ if ($type eq 'bool') {
+ $open .= ($userval == 1 ? "True" : "False") . "\n";
+ } else {
+ $open .= "$userval\n";
+ }
+ my $close = "\n%%EndFeature\n} stopped cleartomark\n";
+ if ($section eq "Prolog") {
+ push (@prologprepend, "$open$cmdvar$close");
+ my $a = $arg;
+ while ($a->{'controlledby'}) {
+ # Collect option PostScript code to be inserted when
+ # the composite option which controls this option
+ # is found in the PostScript code
+ $a = $dat->{'args_byname'}{$a->{'controlledby'}};
+ $a->{'prolog'} .= "$cmdvar\n";
+ }
+ } elsif ($section eq "AnySetup") {
+ if ($optionset ne 'currentpage') {
+ push (@setupprepend, "$open$cmdvar$close");
+ } elsif ($arg->{'header'} ne $userval) {
+ push (@pagesetupprepend, "$open$cmdvar$close");
+ push (@cupspagesetupprepend, "$open$cmdvar$close");
+ }
+ my $a = $arg;
+ while ($a->{'controlledby'}) {
+ # Collect option PostScript code to be inserted when
+ # the composite option which controls this option
+ # is found in the PostScript code
+ $a = $dat->{'args_byname'}{$a->{'controlledby'}};
+ $a->{'setup'} .= "$cmdvar\n";
+ $a->{'pagesetup'} .= "$cmdvar\n";
+ }
+ } elsif ($section eq "DocumentSetup") {
+ push (@setupprepend, "$open$cmdvar$close");
+ my $a = $arg;
+ while ($a->{'controlledby'}) {
+ # Collect option PostScript code to be inserted when
+ # the composite option which controls this option
+ # is found in the PostScript code
+ $a = $dat->{'args_byname'}{$a->{'controlledby'}};
+ $a->{'setup'} .= "$cmdvar\n";
+ }
+ } elsif ($section eq "PageSetup") {
+ push (@pagesetupprepend, "$open$cmdvar$close");
+ my $a = $arg;
+ while ($a->{'controlledby'}) {
+ # Collect option PostScript code to be inserted when
+ # the composite option which controls this option
+ # is found in the PostScript code
+ $a = $dat->{'args_byname'}{$a->{'controlledby'}};
+ $a->{'pagesetup'} .= "$cmdvar\n";
+ }
+ } elsif ($section eq "JCLSetup") {
+ # PJL/JCL argument
+ $dat->{'jcl'} = 1;
+ push (@jclprepend, unhexify($cmdvar));
+ my $a = $arg;
+ while ($a->{'controlledby'}) {
+ # Collect option PostScript code to be inserted when
+ # the composite option which controls this option
+ # is found in the PostScript code
+ $a = $dat->{'args_byname'}{$a->{'controlledby'}};
+ $a->{'jclsetup'} .= "$cmdvar\n";
+ }
+ } else {
+ push (@setupprepend, "$open$cmdvar$close");
+ my $a = $arg;
+ while ($a->{'controlledby'}) {
+ # Collect option PostScript code to be inserted when
+ # the composite option which controls this option
+ # is found in the PostScript code
+ $a = $dat->{'args_byname'}{$a->{'controlledby'}};
+ $a->{'setup'} .= "$cmdvar\n";
+ }
+ }
+ }
+ # Do we have an option which is set to "Controlled by
+ # '<Composite>'"? Then make PostScript code available
+ # for substitution of "%% FoomaticRIPOptionSetting: ..."
+ if ($arg->{'fromcomposite'}) {
+ $arg->{'compositesubst'} = "$cmdvar\n";
+ }
+ } elsif ($arg->{'style'} eq 'J') {
+ # JCL argument
+ $dat->{'jcl'} = 1;
+ # put JCL commands onto JCL stack...
+ push (@jclprepend, "$jclprefix$cmdvar\n") if $cmdvar;
+ } elsif ($arg->{'style'} eq 'C') {
+ # command-line argument
+
+ # Insert the processed argument in the commandline
+ # just before every occurance of the spot marker.
+ $dat->{'currentcmd'} =~ s!\%$spot!$cmdvar\%$spot!g;
+ }
+ # Insert option into command line of CUPS raster driver
+ if ($dat->{'currentcmd'} =~ m!\%Y!) {
+ next if !defined($userval) or $userval eq "";
+ $dat->{'currentcmd'} =~ s!\%Y!$name=$userval \%Y!g;
+ }
+ # Remove the marks telling that this option is currently controlled
+ # by a composite option (setting "From<composite>")
+ undef $arg->{'fromcomposite'};
+ undef $arg->{'controlledby'};
+ }
+
+
+ ### Tidy up after computing option statements for all of P, J, and
+ ### C types:
+
+ ## C type finishing
+ # Pluck out all of the %n's from the command line prototype
+ my @letters = qw/A B C D E F G H I J K L M W X Y Z/;
+ for my $spot (@letters) {
+ # Remove the letter markers from the commandline
+ $dat->{'currentcmd'} =~ s!\%$spot!!g;
+ }
+
+ ## J type finishing
+ # Compute the proper stuff to say around the job
+
+ if ((defined($dat->{'jcl'})) && (!$jobhasjcl)) {
+
+ # Stick beginning of job cruft on the front of the jcl stuff...
+ unshift (@jclprepend, $jclbegin);
+
+ # Command to switch to the interpreter
+ push (@jclprepend, $jcltointerpreter);
+
+ # Arrange for JCL RESET command at end of job
+ push (@jclappend, $jclend);
+
+ # Put the JCL stuff into the data structure
+ @{$dat->{'jclprepend'}} = @jclprepend;
+ @{$dat->{'jclappend'}} = @jclappend;
+ }
+
+ ## G type finishing
+ # Save PostScript options
+ @{$dat->{'prologprepend'}} = @prologprepend;
+ @{$dat->{'setupprepend'}} = @setupprepend;
+ @{$dat->{'pagesetupprepend'}} = @pagesetupprepend;
+ @{$dat->{'cupspagesetupprepend'}} = @cupspagesetupprepend;
+}
+
+sub buildpdqdriver {
+
+ # Build a PDQ driver description file to use the given PPD file
+ # together with foomatic-rip with the PDQ printing system
+
+ # Foomatic data and name of the option set for the default settings
+ my ($dat, $optionset) = @_;
+
+ # Construct structure with driver information
+ my @pdqdriver = ();
+
+ # Construct option list
+ my @driveropts = ();
+
+ # Do we have a "Custom" setting for the page size?
+ # Then we have to insert the following into the "filter_exec" script.
+ my @setcustompagesize = ();
+
+ # Fata for a custom page size, to allow a custom size as default
+ my $pagewidth = 612;
+ my $pageheight = 792;
+ my $pageunit = "pt";
+
+
+
+ ## First, compute the various option/value clauses
+ for my $arg (@{$dat->{'args'}}) {
+
+ if ($arg->{'type'} eq "enum") {
+
+ # Option with only one choice, omit it, foomatic-rip will set
+ # this choice anyway.
+ next if ($#{$arg->{'vals'}} < 1);
+
+ my $nam = $arg->{'name'};
+
+ # Omit "PageRegion" option, it does the same as "PageSize".
+ next if $nam eq "PageRegion";
+
+ my $com = $arg->{'comment'};
+
+ # Assure that the comment is not empty
+ if (!$com) {
+ $com = $nam;
+ }
+
+ my $def = $arg->{$optionset};
+ $arg->{'varname'} = "$nam";
+ $arg->{'varname'} =~ s![\-\/\.]!\_!g;
+ my $varn = $arg->{'varname'};
+
+ # 1, if setting "PageSize=Custom" was found
+ # Then we must add options for page width and height
+ my $custompagesize = 0;
+
+ # If the default is a custom size we have to set also
+ # defaults for the width, height, and units of the page
+ if (($nam eq "PageSize") &&
+ ($def =~ /^Custom\.([\d\.]+)x([\d\.]+)([A-Za-z]*)$/)) {
+ $def = "Custom";
+ $pagewidth = $1;
+ $pageheight = $2;
+ $pageunit = $3;
+ }
+
+ # No quotes, thank you.
+ $com =~ s!\"!\\\"!g;
+
+ push(@driveropts,
+ " option {\n",
+ " var = \"$varn\"\n",
+ " desc = \"$com\"\n");
+
+ # get enumeration values for each enum arg
+ my ($ev, @vals, @valstmp);
+ for $ev (@{$arg->{'vals'}}) {
+ my $choiceshortname = $ev->{'value'};
+ my $choicename = "${nam}_${choiceshortname}";
+ my $val = " -o ${nam}=${choiceshortname}";
+ my $com = $ev->{'comment'};
+
+ # Assure that the comment is not empty
+ if (!$com) {
+ $com = $choiceshortname;
+ }
+
+ # stick another choice on driveropts
+ push(@valstmp,
+ " choice \"$choicename\" {\n",
+ " desc = \"$com\"\n",
+ " value = \"$val\"\n",
+ " }\n");
+ if (($nam eq "PageSize") &&
+ ($choiceshortname eq "Custom")) {
+ $custompagesize = 1;
+ if ($#setcustompagesize < 0) {
+ push(@setcustompagesize,
+ " # Custom page size settings\n",
+ " # We aren't really checking for " .
+ "legal vals.\n",
+ " if [ \"x\${$varn}\" = 'x$val' ]; " .
+ "then\n",
+ " $varn=\"\${$varn}.\${PageWidth}" .
+ "x\${PageHeight}\${PageSizeUnit}\"\n",
+ " fi\n\n");
+ }
+ }
+ }
+
+ push(@driveropts,
+ " default_choice \"" . $nam . "_" . $def . "\"\n",
+ @valstmp,
+ " }\n\n");
+
+ if ($custompagesize) {
+ # Add options to set the custom page size
+ push(@driveropts,
+ " argument {\n",
+ " var = \"PageWidth\"\n",
+ " desc = \"Page Width (for \\\"Custom\\\" page " .
+ "size)\"\n",
+ " def_value \"$pagewidth\"\n",
+ " help = \"Minimum value: 0, Maximum value: " .
+ "100000\"\n",
+ " }\n\n",
+ " argument {\n",
+ " var = \"PageHeight\"\n",
+ " desc = \"Page Height (for \\\"Custom\\\" page " .
+ "size)\"\n",
+ " def_value \"$pageheight\"\n",
+ " help = \"Minimum value: 0, Maximum value: " .
+ "100000\"\n",
+ " }\n\n",
+ " option {\n",
+ " var = \"PageSizeUnit\"\n",
+ " desc = \"Unit (for \\\"Custom\\\" page size)\"\n",
+ " default_choice \"PageSizeUnit_$pageunit\"\n",
+ " choice \"PageSizeUnit_pt\" {\n",
+ " desc = \"Points (1/72 inch)\"\n",
+ " value = \"pt\"\n",
+ " }\n",
+ " choice \"PageSizeUnit_in\" {\n",
+ " desc = \"Inches\"\n",
+ " value = \"in\"\n",
+ " }\n",
+ " choice \"PageSizeUnit_cm\" {\n",
+ " desc = \"cm\"\n",
+ " value = \"cm\"\n",
+ " }\n",
+ " choice \"PageSizeUnit_mm\" {\n",
+ " desc = \"mm\"\n",
+ " value = \"mm\"\n",
+ " }\n",
+ " }\n\n");
+ }
+
+ } elsif ($arg->{'type'} eq 'int' or $arg->{'type'} eq 'float') {
+
+ my $nam = $arg->{'name'};
+ my $com = $arg->{'comment'};
+
+ # Assure that the comment is not empty
+ if (!$com) {
+ $com = $nam;
+ }
+
+ my $def = $arg->{$optionset};
+ my $max = $arg->{'max'};
+ my $min = $arg->{'min'};
+ $arg->{'varname'} = "$nam";
+ $arg->{'varname'} =~ s![\-\/\.]!\_!g;
+ my $varn = $arg->{'varname'};
+ my $legal = $arg->{'legal'} =
+ "Minimum value: $min, Maximum value: $max";
+
+ my $defstr = "";
+ if ($def) {
+ $defstr = sprintf(" def_value \"%s\"\n", $def);
+ }
+
+ push(@driveropts,
+ " argument {\n",
+ " var = \"$varn\"\n",
+ " desc = \"$com\"\n",
+ $defstr,
+ " help = \"$legal\"\n",
+ " }\n\n");
+
+ } elsif ($arg->{'type'} eq 'bool') {
+
+ my $nam = $arg->{'name'};
+ my $com = $arg->{'comment'};
+
+ # Assure that the comment is not empty
+ if (!$com) {
+ $com = $nam;
+ }
+
+ my $tcom = $arg->{'comment_true'};
+ my $fcom = $arg->{'comment_false'};
+ my $def = $arg->{$optionset};
+ $arg->{'legal'} = "Value is a boolean flag";
+ $arg->{'varname'} = "$nam";
+ $arg->{'varname'} =~ s![\-\/\.]!\_!g;
+ my $varn = $arg->{'varname'};
+
+ my $defstr = "";
+ if ($def) {
+ $defstr = sprintf(" default_choice \"%s\"\n",
+ $def ? "$nam" : "no$nam");
+ } else {
+ $defstr = sprintf(" default_choice \"%s\"\n", "no$nam");
+ }
+ push(@driveropts,
+ " option {\n",
+ " var = \"$varn\"\n",
+ " desc = \"$com\"\n",
+ $defstr,
+ " choice \"$nam\" {\n",
+ " desc = \"$tcom\"\n",
+ " value = \" -o $nam=True\"\n",
+ " }\n",
+ " choice \"no$nam\" {\n",
+ " desc = \"$fcom\"\n",
+ " value = \" -o $nam=False\"\n",
+ " }\n",
+ " }\n\n");
+
+ } elsif ($arg->{'type'} eq 'string' or $arg->{'type'} eq 'password') {
+
+ my $nam = $arg->{'name'};
+ my $com = $arg->{'comment'};
+
+ # Assure that the comment is not empty
+ if (!$com) {
+ $com = $nam;
+ }
+
+ my $def = $arg->{$optionset};
+ my $maxlength = $arg->{'maxlength'};
+ my $proto = $arg->{'proto'};
+ $arg->{'varname'} = "$nam";
+ $arg->{'varname'} =~ s![\-\/\.]!\_!g;
+ my $varn = $arg->{'varname'};
+
+ my $legal;
+ if (defined($maxlength)) {
+ $legal .= "Maximum length: $maxlength characters, ";
+ }
+ $legal .= "Examples/special settings: ";
+ for (@{$arg->{'vals'}}) {
+ my ($value, $comment, $driverval) =
+ ($_->{'value'}, $_->{'comment'}, $_->{'driverval'});
+ # Retrieve the original string from the prototype
+ # and the driverval
+ my $string;
+ if ($proto) {
+ my $s = index($proto, '%s');
+ my $l = length($driverval) - length($proto) + 2;
+ if (($s < 0) || ($l < 0)) {
+ $string = $driverval;
+ } else {
+ $string = substr($driverval, $s, $l);
+ }
+ } else {
+ $string = $driverval;
+ }
+ if ($value ne $string) {
+ $legal .= "${value}: \\\"$string\\\"";
+ } else {
+ $legal .= "\\\"$value\\\"";
+ }
+ if ($comment && ($value ne $comment) &&
+ ($string ne $comment) &&
+ (($value ne 'None') || ($comment ne '(None)'))) {
+ $legal .= " ($comment)";
+ }
+ $legal .= "; ";
+ }
+ $legal =~ s/; $//;
+
+ $arg->{'legal'} = $legal;
+
+ my $defstr = "";
+ if ($def) {
+ $defstr = sprintf(" def_value \"%s\"\n", $def);
+ }
+
+ push(@driveropts,
+ " argument {\n",
+ " var = \"$varn\"\n",
+ " desc = \"$com\"\n",
+ $defstr,
+ " help = \"$legal\"\n",
+ " }\n\n");
+
+ }
+
+ }
+
+
+
+ ## Define the "docs" option to print the driver documentation page
+
+ push(@driveropts,
+ " option {\n",
+ " var = \"DRIVERDOCS\"\n",
+ " desc = \"Print driver usage information\"\n",
+ " default_choice \"nodocs\"\n",
+ " choice \"docs\" {\n",
+ " desc = \"Yes\"\n",
+ " value = \" -o docs\"\n",
+ " }\n",
+ " choice \"nodocs\" {\n",
+ " desc = \"No\"\n",
+ " value = \"\"\n",
+ " }\n",
+ " }\n\n");
+
+
+
+ ## Build the "foomatic-rip" command line
+ my $commandline = "foomatic-rip --pdq";
+ if ($printer) {
+ $commandline .= " -P $printer";
+ } else {
+ # Make sure that the PPD file is entered with an absolute path
+ if ($ppdfile !~ m!^/!) {
+ my $pwd = cwd;
+ $ppdfile = "$pwd/$ppdfile";
+ }
+ $commandline .= " --ppd=$ppdfile";
+ }
+ for my $arg (@{$dat->{'args'}}) {
+ if ($arg->{'varname'}) {
+ $commandline .= "\${$arg->{'varname'}}";
+ }
+ }
+ $commandline .= "\${DRIVERDOCS} \$INPUT > \$OUTPUT";
+
+
+
+ ## Now we generate code to build the command line snippets for the
+ ## numerical options
+
+ my @psfilter;
+ for my $arg (@{$dat->{'args'}}) {
+
+ # Only numerical and string options need to be treated here
+ next if (($arg->{'type'} ne 'int') &&
+ ($arg->{'type'} ne 'float') &&
+ ($arg->{'type'} ne 'string') &&
+ ($arg->{'type'} ne 'password'));
+
+ my $comment = $arg->{'comment'};
+ my $name = $arg->{'name'};
+ my $varname = $arg->{'varname'};
+
+ # If the option's variable is non-null, put in the
+ # argument. Otherwise this option is the empty
+ # string. Error checking?
+
+ push(@psfilter,
+ " # $comment\n",
+ (($arg->{'type'} eq 'int') || ($arg->{'type'} eq 'float') ?
+ (" # We aren't really checking for max/min,\n",
+ " # this is done by foomatic-rip\n",
+ " if [ \"x\${$varname}\" != 'x' ]; then\n ") : ""),
+ #" $varname=`echo \${$varname} | perl -p -e \"s/'/'\\\\\\\\\\\\\\\\''/g\"`\n",
+ " $varname=\" -o $name='\${$varname}'\"\n",
+ (($arg->{'type'} eq 'int') || ($arg->{'type'} eq 'float') ?
+ " fi\n" : ""),
+ "\n");
+ }
+
+ # Command execution
+
+ push(@psfilter,
+ " if ! test -e \$INPUT.ok; then\n",
+ " sh -c \"$commandline\"\n",
+ " if ! test -e \$OUTPUT; then \n",
+ " echo 'Error running foomatic-rip; no output!'\n",
+ " exit 1\n",
+ " fi\n",
+ " else\n",
+ " ln -s \$INPUT \$OUTPUT\n",
+ " fi\n\n");
+
+ my $version = time();
+ my $name = "$model-$version";
+ $name =~ s/\W/\-/g;
+ $name =~ s/\-+/\-/g;
+
+ my $pname = $model;
+
+ push (@pdqdriver,
+ "driver \"$name\" {\n\n",
+ " # This PDQ driver declaration file was generated " .
+ "automatically by\n",
+ " # foomatic-rip from information in the file $ppdfile.\n",
+ " # It allows printing with PDQ on the $pname.\n",
+ "\n",
+ " requires \"foomatic-rip\"\n\n",
+ @driveropts,
+ " language_driver all {\n",
+ " # We accept all file types and pass them to foomatic-rip\n",
+ " # (invoked in \"filter_exec {}\" section) without\n",
+ " # pre-filtering\n",
+ " filetype_regx \"\"\n",
+ " convert_exec {\n",
+ " ln -s \$INPUT \$OUTPUT\n",
+ " }\n",
+ " }\n\n",
+ " filter_exec {\n",
+ @setcustompagesize,
+ @psfilter,
+ " }\n",
+ "}\n");
+
+ return @pdqdriver;
+
+}
+
+#
+# Convert lp or ipp based attribute names (and values) to something that matches# PPD file options.
+#
+sub option_to_ppd {
+ my ($ipp_attribute) = @_;
+ my ($key, $value, $result) = ();
+
+ if (/([^=]+)=[\'\"]?(.*}[\'\"]?)/) { # key=value
+ ($key, $value) = ($1, $2);
+ } elsif (/no(.+)/) { # BOOLEAN: no{key} (false)
+ ($key, $value) = ($1, 'false');
+ } else { # BOOLEAN: {key} (true)
+ ($key, $value) = ($1, 'true');
+ }
+
+ if (($key =~ /^job-/) || ($key =~ /^copies/) ||
+ ($key =~ /^multiple-document-handling/) || ($key =~ /^number-up/) ||
+ ($key =~ /^orientation-requested/) ||
+ ($key =~ /^dest/) || ($key =~ /^protocol/) || ($key =~ /^banner/) ||
+ ($key =~ /^page-ranges/)) {
+ # Ignored:
+ # job-*, multiple-document-handling are not supported by this
+ # filter
+ # dest, protocol, banner, number-up, orientation-requested are
+ # handled by the LP filtering or interface script
+ # NOTE - page-ranges should probably be handled here, but
+ # ignore it until we decide how to handle it.
+ } elsif (/^printer-resolution/) {
+ # value match on "123, 457" or on "123, 457, 8"
+ if (/([\d]+),([\s]*)([\d]+)((,([\s]*)([\d]+))??)/) {
+ $result = '$1x$2$3 '; # (width)x(height)(units)
+ }
+ } elsif (/^print-quality/) {
+ ($value == 3) &&
+ ($result = 'PrintoutMode=Draft');
+ ($value == 4) &&
+ ($result = 'PrintoutMode=Normal');
+ ($value == 5) &&
+ ($result = 'PrintoutMode=High');
+ } else {
+ # NOTE - if key == 'media', we may need to convert the values at some
+ # point. (see RFC2911, Section 14 for values)
+ $result = '$key=\"$value\"';
+ }
+
+ return ($result);
+}
+
+#
+# Read the attributes file containing the various job meta-data, including
+# requested capabilities
+#
+sub read_attribute_file {
+ my ($file) = @_;
+ my $result = "";
+
+ open (AFP, "<$file") ||
+ (print $logh "Unable to open IPP Attribute file ".$file.", ignored: ".$!);
+
+ while(<AFP>) {
+ $result .= option_to_ppd($_);
+ }
+
+ close (AFP);
+
+ return ($result);
+}
+
+sub modern_system {
+ my (@list) = @_;
+
+ if ($modern_shell |~ /.+/) {
+ # No "modern" shell other than the default shell was specified
+ $modern_shell = '/bin/sh';
+ }
+
+ my $pid = fork();
+ ($pid < 0) && die "failed to fork()";
+
+ if ($pid == 0) { # child, execute the commands under a modern shell
+ # If the system supports process groups, we create a process
+ # group of this subshell process. All the children of this
+ # process (calls of external filters, renderers, or drivers)
+ # will be members of this process group and so by killing this
+ # process group we can kill all subprocesses and so we can
+ # cleanly cancel print jobs
+ $SIG{PIPE} = 'DEFAULT';
+ eval("setpgrp()");
+ # Stop catching signals
+ #use sigtrap qw(die normal-signals error-signals
+ # handler do_nothing USR1 USR2 TTIN);
+ exec($modern_shell, "-c", @list);
+ rip_die("exec($modern_shell, \"-c\", @list);",
+ $EXIT_PRNERR_NORETRY_BAD_SETTINGS);
+ } else { # parent, register child's PID, wait for the child, and
+ # unregister the PID
+ $pids{$pid} = substr(join(" ", @list), 0, 100) .
+ (length(join(" ", @list)) > 100 ? "..." : "");
+ print $logh "Starting process $pid: \"$pids{$pid}\"\n";
+ waitpid($pid, 0);
+ print $logh "Process $pid ending: \"$pids{$pid}\"\n";
+ delete $pids{$pid};
+ }
+}
+
+# Emacs tabulator/indentation
+
+### Local Variables:
+### tab-width: 8
+### perl-indent-level: 4
+### End:
diff --git a/prnt/hpijs/gdevijs-krgb-1.5-gs8.61.patch b/prnt/hpijs/gdevijs-krgb-1.5-gs8.61.patch
new file mode 100644
index 0000000..d00bcf4
--- /dev/null
+++ b/prnt/hpijs/gdevijs-krgb-1.5-gs8.61.patch
@@ -0,0 +1,732 @@
+diff -uNr old/gdevijs.c new/gdevijs.c
+--- old/gdevijs.c 2008-01-15 20:20:07.000000000 -0800
++++ new/gdevijs.c 2008-01-17 09:52:54.000000000 -0800
+@@ -23,15 +23,54 @@
+ * which is a security risk, since any program can be run.
+ * You should use -dSAFER which sets .LockSafetyParams to true
+ * before opening this device.
++ *
++ * 11/26/03 David Suffield (gdevijs-krgb-1.0.patch)
++ * (c) 2003-2004 Copyright Hewlett-Packard Development Company, LP
++ *
++ * 1. Removed hpijs 1.0-1.0.2 workarounds, use hpijs 1.0.3 or higher.
++ * 2. Added krgb support.
++ *
++ * 02/21/05 David Suffield (gdevijs-krgb-1.1.patch)
++ * 1. Fixed segfault issue with 1-bit color space.
++ * 2. Fixed z-order issue with colored text on black rectangle.
++ *
++ * 02/22/06 David Suffield (gdevijs-krgb-1.2.patch)
++ * 1. Fixed krgb buffer overflow issue with out-of-band data in fill_rectangle and copy_mono.
++ * This buffer overflow condition occurred with fullbleed print jobs that had k-band images.
++ * 2. Added Dan Coby (artifex) fix for gsijs_read_string_malloc gs_free *str memory leak.
++ *
++ * 06/02/06 David Suffield (gdevijs-krgb-1.3.patch)
++ * 1. Revisited the krgb buffer overflow issue with out-of-band data in fill_rectangle and
++ * copy_mono. Changed the fill_rectangle and copy_mono to an inner loop buffer check
++ * instead of a outer loop x/y extent check.
++ * 2. As requested by Ralph Giles, added K 1-bit and 8-bit support for krgb, but only 1-bit is
++ * implemented for now.
++ *
++ * KRGB definition:
++ * 1. K=1-bit or 8-bit black plane, RGB=24 bit color raster.
++ * 2. K-plane will only contain objects that are black text and black line drawings.
++ * 3. RGB raster will not contain K-plane objects.
++ * 4. K resolution and RGB resolution will be equal.
++ * 5. K-plane will be byte aligned.
++ * 6. K-plane 1-bit definition; 1=black, 0=nothing (KRGB).
++ * 7. K-plane 8-bit definition; 255=black, 0=nothing (KxRGB).
++ *
++ * 1/15/08 David Suffield (gdevijs-krgb-1.5.patch)
++ * 1. Added checks for null forward device in the graphic procedures.
++ * 2. Corrected the "force banding" code in gsijs_open. Needed for small images (IE: hagaki in landscape).
++ *
+ */
+
+ #include "unistd_.h" /* for dup() */
+ #include <stdlib.h>
++#include <fcntl.h>
+ #include "gdevprn.h"
+ #include "gp.h"
+ #include "ijs.h"
+ #include "ijs_client.h"
+
++//#define KRGB_DEBUG
++
+ /* This should go into gdevprn.h, or, better yet, gdevprn should
+ acquire an API for changing resolution. */
+ int gdev_prn_maybe_realloc_memory(gx_device_printer *pdev,
+@@ -49,6 +88,14 @@
+ static dev_proc_put_params(gsijs_put_params);
+ static dev_proc_finish_copydevice(gsijs_finish_copydevice);
+
++/* Following definitions are for krgb support. */
++static dev_proc_create_buf_device(gsijs_create_buf_device);
++static dev_proc_fill_rectangle(gsijs_fill_rectangle);
++static dev_proc_copy_mono(gsijs_copy_mono);
++static dev_proc_fill_mask(gsijs_fill_mask);
++static dev_proc_fill_path(gsijs_fill_path);
++static dev_proc_stroke_path(gsijs_stroke_path);
++
+ static const gx_device_procs gsijs_procs = {
+ gsijs_open,
+ NULL, /* get_initial_matrix */
+@@ -123,6 +170,15 @@
+
+ IjsClientCtx *ctx;
+ int ijs_version;
++
++ /* Additional parameters for krgb support. */
++ int krgb_mode; /* 0=false, 1=true */
++ int k_bits; /* number of bits in k plane, 1 or 8 */
++ int k_path; /* k plane path, 0=false, 1=true */
++ int k_width; /* k plane width in pixels */
++ int k_band_size; /* k plane buffer size in bytes, byte aligned */
++ unsigned char *k_band; /* k plane buffer */
++ gx_device_procs prn_procs; /* banding playback procedures */
+ };
+
+ #define DEFAULT_DPI 74 /* See gsijs_set_resolution() below. */
+@@ -150,7 +206,13 @@
+ FALSE, /* Tumble_set */
+
+ NULL, /* IjsClient *ctx */
+- 0 /* ijs_version */
++ 0, /* ijs_version */
++ 0, /* krgb_mode */
++ 0, /* k_bits */
++ 0, /* k_path */
++ 0, /* k_width */
++ 0, /* k_band_size */
++ NULL /* k_band buffer */
+ };
+
+
+@@ -166,12 +228,314 @@
+
+ /**************************************************************************/
+
+-/* ------ Private definitions ------ */
++/* ---------------- Low-level graphic procedures ---------------- */
++
++static unsigned char xmask[] =
++{
++ 0x80, /* x=0 */
++ 0x40, /* 1 */
++ 0x20, /* 2 */
++ 0x10, /* 3 */
++ 0x08, /* 4 */
++ 0x04, /* 5 */
++ 0x02, /* 6 */
++ 0x01 /* 7 */
++};
++
++static int gsijs_fill_rectangle(gx_device * dev, int x, int y, int w, int h,
++ gx_color_index color)
++{
++ gx_device_ijs *ijsdev = (gx_device_ijs *)((gx_device_forward *)dev)->target;
++
++ if (!ijsdev)
++ return 0; /* no forward device, bug?? */
++
++ if (ijsdev->krgb_mode && ijsdev->k_path && y >= 0 && x >= 0)
++ {
++ int raster = (ijsdev->k_width+7) >> 3;
++ register unsigned char *dest;
++ int dest_start_bit;
++ int band_height = ijsdev->k_band_size/raster;
++ int i,j;
++ unsigned char *beg = ijsdev->k_band;
++ unsigned char *end = ijsdev->k_band+ijsdev->k_band_size;
++ unsigned char *p;
++
++ if (h <= 0 || w <= 0)
++ return 0;
++
++ /* Check for out-of-band graphic. */
++ if (x >= ijsdev->k_width || y >= band_height)
++ return 0; /* out-of-band */
++
++ dest_start_bit = x & 7;
++ dest=ijsdev->k_band+(raster*y)+(x >> 3);
++
++ /* Note x,y orgin 0,0 is stored first byte 0 left to right. */
++
++ if (color==0x0)
++ {
++ /* Color is black, store in k plane band instead of regular band. */
++ for (j=0; j<h; j++)
++ {
++ for (i=0; i<w; i++)
++ {
++ p = &dest[(dest_start_bit+i)>>3];
++ if (p >= beg && p <= end)
++ *p |= xmask[(dest_start_bit+i)&7];
++ }
++ dest+=raster;
++ }
++ return 0;
++ }
++ else
++ {
++ /* Color is not black, remove any k plane bits for z-order dependencies, store in regular band. */
++ for (j=0; j<h; j++)
++ {
++ for (i=0; i<w; i++)
++ {
++ p = &dest[(dest_start_bit+i)>>3];
++ if (p >= beg && p <= end)
++ *p &= ~xmask[(dest_start_bit+i)&7];
++ }
++ dest+=raster;
++ }
++ }
++ }
++
++ return (*ijsdev->prn_procs.fill_rectangle)(dev, x, y, w, h, color);
++}
++
++static int gsijs_copy_mono(gx_device * dev, const byte * data,
++ int dx, int draster, gx_bitmap_id id,
++ int x, int y, int w, int height, gx_color_index zero, gx_color_index one)
++{
++ gx_device_ijs *ijsdev = (gx_device_ijs *)((gx_device_forward *)dev)->target;
++
++ if (!ijsdev)
++ return 0; /* no forward device, bug?? */
++
++ // if (ijsdev->krgb_mode && ijsdev->k_path && one==0x0)
++ if (ijsdev->krgb_mode && ijsdev->k_path)
++ {
++ /* Store in k plane band instead of regular band. */
++ int raster = (ijsdev->k_width+7) >> 3; /* raster width in bytes, byte aligned */
++ register unsigned char *dest;
++ register const unsigned char *scan;
++ int dest_start_bit;
++ int scan_start_bit;
++ int band_height = ijsdev->k_band_size/raster;
++ int i,h=height;
++ unsigned char *beg = ijsdev->k_band;
++ unsigned char *end = ijsdev->k_band+ijsdev->k_band_size;
++ unsigned char *p;
++
++ if (h <= 0 || w <= 0)
++ return 0;
++
++ /* Check for out-of-band graphic. */
++ if (x >= ijsdev->k_width || y >= band_height)
++ return 0; /* out-of-band */
++
++ scan=data+(dx >> 3);
++ dest_start_bit = x & 7;
++ scan_start_bit = dx & 7;
++ dest=ijsdev->k_band+(raster*y)+(x >> 3);
++
++ if (one==0x0)
++ {
++ /* Color is black, store in k plane band instead of regular band. */
++ while (h-- > 0)
++ {
++ for (i=0; i<w; i++)
++ {
++ if (scan[(scan_start_bit+i)>>3] & xmask[(scan_start_bit+i)&7])
++ {
++ p = &dest[(dest_start_bit+i)>>3];
++ if (p >= beg && p <= end)
++ *p |= xmask[(dest_start_bit+i)&7];
++ }
++ }
++ scan+=draster;
++ dest+=raster;
++ }
++ return 0;
++ }
++ else
++ {
++ /* Color is not black, remove any k plane bits for z-order dependencies, store in regular band. */
++ while (h-- > 0)
++ {
++ for (i=0; i<w; i++)
++ {
++ if (scan[(scan_start_bit+i)>>3] & xmask[(scan_start_bit+i)&7])
++ {
++ p = &dest[(dest_start_bit+i)>>3];
++ if (p >= beg && p <= end)
++ *p &= ~xmask[(dest_start_bit+i)&7];
++ }
++ }
++ scan+=draster;
++ dest+=raster;
++ }
++ }
++ }
++
++ return (*ijsdev->prn_procs.copy_mono)(dev, data, dx, draster, id, x, y, w, height, zero, one);
++}
++
++/* ---------------- High-level graphic procedures ---------------- */
++
++static int gsijs_fill_mask(gx_device * dev,
++ const byte * data, int dx, int raster, gx_bitmap_id id,
++ int x, int y, int w, int h,
++ const gx_drawing_color * pdcolor, int depth,
++ gs_logical_operation_t lop, const gx_clip_path * pcpath)
++{
++ gx_device_ijs *ijsdev = (gx_device_ijs *)((gx_device_forward *)dev)->target;
++ int code;
++
++ if (!ijsdev)
++ return 0; /* no forward device, bug?? */
++
++ ijsdev->k_path = 1;
++
++ code = (*ijsdev->prn_procs.fill_mask)(dev, data, dx, raster, id, x, y, w, h, pdcolor, depth, lop, pcpath);
++
++ ijsdev->k_path = 0;
++
++ return code;
++}
++
++static int gsijs_fill_path(gx_device * dev, const gs_imager_state * pis,
++ gx_path * ppath, const gx_fill_params * params,
++ const gx_drawing_color * pdcolor,
++ const gx_clip_path * pcpath)
++{
++ gx_device_ijs *ijsdev = (gx_device_ijs *)((gx_device_forward *)dev)->target;
++ int code;
++
++ if (!ijsdev)
++ return 0; /* no forward device, bug?? */
++
++ ijsdev->k_path = 1;
++
++ code = (*ijsdev->prn_procs.fill_path)(dev, pis, ppath, params, pdcolor, pcpath);
+
+-/* Versions 1.0 through 1.0.2 of hpijs report IJS version 0.29, and
+- require some workarounds. When more up-to-date hpijs versions
+- become ubiquitous, all these workarounds should be removed. */
+-#define HPIJS_1_0_VERSION 29
++ ijsdev->k_path = 0;
++
++ return 0;
++}
++
++static int gsijs_stroke_path(gx_device * dev, const gs_imager_state * pis,
++ gx_path * ppath, const gx_stroke_params * params,
++ const gx_drawing_color * pdcolor,
++ const gx_clip_path * pcpath)
++{
++ gx_device_ijs *ijsdev = (gx_device_ijs *)((gx_device_forward *)dev)->target;
++ int code;
++
++ if (!ijsdev)
++ return 0; /* no forward device, bug?? */
++
++ ijsdev->k_path = 1;
++
++ code = (*ijsdev->prn_procs.stroke_path)(dev, pis, ppath, params, pdcolor, pcpath);
++
++ ijsdev->k_path = 0;
++
++ return code;
++}
++
++/* ---------------- krgb banding playback procedures ---------------- */
++
++static int gsijs_get_bits(gx_device_printer * pdev, int y, byte * str, byte ** actual_data)
++{
++ gx_device_ijs *ijsdev = (gx_device_ijs *)pdev;
++ gx_device_clist_common *cdev = (gx_device_clist_common *)pdev;
++ int band_height = cdev->page_info.band_params.BandHeight;
++ int band_number = y/band_height;
++ int raster = (ijsdev->k_width+7) >> 3; /* raster width in bytes, byte aligned */
++ int y1=raster*(y-(band_height*band_number));
++
++ if (y1 == 0)
++ {
++ /* First raster for band, clear k_band. Banding playback occurs on first raster. */
++ memset(ijsdev->k_band, 0, ijsdev->k_band_size);
++ }
++
++ return gdev_prn_get_bits(pdev, y, str, actual_data); /* get raster from regular band */
++}
++
++static int gsijs_k_get_bits(gx_device_printer * pdev, int y, byte ** actual_data)
++{
++ gx_device_ijs *ijsdev = (gx_device_ijs *)pdev;
++ gx_device_clist_common *cdev = (gx_device_clist_common *)pdev;
++ int band_height = cdev->page_info.band_params.BandHeight;
++ int band_number = y/band_height;
++ int raster = (ijsdev->k_width+7) >> 3; /* raster width in bytes, byte aligned */
++ int y1=raster*(y-(band_height*band_number));
++
++ *actual_data = ijsdev->k_band+y1;
++
++ return 0;
++}
++
++static int gsijs_create_buf_device(gx_device **pbdev, gx_device *target,
++ const gx_render_plane_t *render_plane, gs_memory_t *mem, gx_band_complexity_t *for_band)
++{
++ gx_device_ijs *ijsdev = (gx_device_ijs *)target;
++ int n_chan = ijsdev->color_info.num_components;
++ int code = gx_default_create_buf_device(pbdev, target, render_plane, mem, for_band);
++ if (code < 0 || n_chan != 3)
++ return code;
++
++ /* Save buffer (vector) procedures so that we can hook them during banding playback. */
++ ijsdev->prn_procs = (*pbdev)->procs;
++
++ /* Replace buffer procedures with krgb procedures. */
++ set_dev_proc(*pbdev, fill_rectangle, gsijs_fill_rectangle);
++ set_dev_proc(*pbdev, copy_mono, gsijs_copy_mono);
++ set_dev_proc(*pbdev, fill_mask, gsijs_fill_mask);
++ set_dev_proc(*pbdev, fill_path, gsijs_fill_path);
++ set_dev_proc(*pbdev, stroke_path, gsijs_stroke_path);
++
++ return code;
++}
++
++/* See if IJS server supports krgb. */
++static int
++gsijs_set_krgb_mode(gx_device_ijs *ijsdev)
++{
++ char buf[256];
++ int n_chan = ijsdev->color_info.num_components;
++ int code;
++
++ ijsdev->krgb_mode = 0; /* default is no krgb */
++
++ if (n_chan != 3)
++ return 0; /* no krgb support, not RGB colorspace */
++
++ buf[0] = 0;
++ code = ijs_client_enum_param(ijsdev->ctx, 0, "ColorSpace", buf, sizeof(buf)-1);
++ if (code >= 0)
++ buf[code] = 0;
++ if (strstr(buf, "KRGB") != NULL)
++ {
++ ijsdev->krgb_mode = 1; /* yes KRGB is supported */
++ ijsdev->k_bits = 1; /* KRGB = 1x8x8x8 */
++ }
++ else if (strstr(buf, "KxRGB") != NULL)
++ {
++ ijsdev->krgb_mode = 1; /* yes KRGB is supported */
++ ijsdev->k_bits = 8; /* KRGB = 8x8x8x8 */
++ }
++
++ return 0;
++}
++
++/* ------ Private definitions ------ */
+
+ static int
+ gsijs_parse_wxh (const char *val, int size, double *pw, double *ph)
+@@ -209,34 +573,6 @@
+ }
+
+ /**
+- * gsijs_set_generic_params_hpijs: Set generic IJS parameters.
+- *
+- * This version is specialized for hpijs 1.0 through 1.0.2, and
+- * accommodates a number of quirks.
+- **/
+-static int
+-gsijs_set_generic_params_hpijs(gx_device_ijs *ijsdev)
+-{
+- char buf[256];
+- int code = 0;
+-
+- /* IjsParams, Duplex, and Tumble get set at this point because
+- they may affect margins. */
+- if (ijsdev->IjsParams) {
+- code = gsijs_client_set_param(ijsdev, "IjsParams", ijsdev->IjsParams);
+- }
+-
+- if (code == 0 && ijsdev->Duplex_set) {
+- int duplex_val;
+-
+- duplex_val = ijsdev->Duplex ? (ijsdev->IjsTumble ? 1 : 2) : 0;
+- sprintf (buf, "%d", duplex_val);
+- code = gsijs_client_set_param(ijsdev, "Duplex", buf);
+- }
+- return code;
+-}
+-
+-/**
+ * gsijs_set_generic_params: Set generic IJS parameters.
+ **/
+ static int
+@@ -247,9 +583,6 @@
+ int i, j;
+ char *value;
+
+- if (ijsdev->ijs_version == HPIJS_1_0_VERSION)
+- return gsijs_set_generic_params_hpijs(ijsdev);
+-
+ /* Split IjsParams into separate parameters and send to ijs server */
+ value = NULL;
+ for (i=0, j=0; (j < ijsdev->IjsParams_size) && (i < sizeof(buf)-1); j++) {
+@@ -290,68 +623,6 @@
+ }
+
+ /**
+- * gsijs_set_margin_params_hpijs: Do margin negotiation with IJS server.
+- *
+- * This version is specialized for hpijs 1.0 through 1.0.2, and
+- * accommodates a number of quirks.
+- **/
+-static int
+-gsijs_set_margin_params_hpijs(gx_device_ijs *ijsdev)
+-{
+- char buf[256];
+- int code = 0;
+-
+- if (code == 0) {
+- sprintf(buf, "%d", ijsdev->width);
+- code = gsijs_client_set_param(ijsdev, "Width", buf);
+- }
+- if (code == 0) {
+- sprintf(buf, "%d", ijsdev->height);
+- code = gsijs_client_set_param(ijsdev, "Height", buf);
+- }
+-
+- if (code == 0) {
+- double printable_width, printable_height;
+- double printable_left, printable_top;
+- float m[4];
+-
+- code = ijs_client_get_param(ijsdev->ctx, 0, "PrintableArea",
+- buf, sizeof(buf));
+- if (code == IJS_EUNKPARAM)
+- /* IJS server doesn't support margin negotiations.
+- That's ok. */
+- return 0;
+- else if (code >= 0) {
+- code = gsijs_parse_wxh(buf, code,
+- &printable_width, &printable_height);
+- }
+-
+- if (code == 0) {
+- code = ijs_client_get_param(ijsdev->ctx, 0, "PrintableTopLeft",
+- buf, sizeof(buf));
+- if (code == IJS_EUNKPARAM)
+- return 0;
+- else if (code >= 0) {
+- code = gsijs_parse_wxh(buf, code,
+- &printable_left, &printable_top);
+- }
+- }
+-
+- if (code == 0) {
+- m[0] = printable_left;
+- m[1] = ijsdev->MediaSize[1] * (1.0 / 72) -
+- printable_top - printable_height;
+- m[2] = ijsdev->MediaSize[0] * (1.0 / 72) -
+- printable_left - printable_width;
+- m[3] = printable_top;
+- gx_device_set_margins((gx_device *)ijsdev, m, true);
+- }
+- }
+-
+- return code;
+-}
+-
+-/**
+ * gsijs_set_margin_params: Do margin negotiation with IJS server.
+ **/
+ static int
+@@ -362,9 +633,6 @@
+ int i, j;
+ char *value;
+
+- if (ijsdev->ijs_version == HPIJS_1_0_VERSION)
+- return gsijs_set_margin_params_hpijs(ijsdev);
+-
+ /* Split IjsParams into separate parameters and send to ijs server */
+ value = NULL;
+ for (i=0, j=0; (j < ijsdev->IjsParams_size) && (i < sizeof(buf)-1); j++) {
+@@ -537,6 +805,11 @@
+ return gs_note_error(gs_error_ioerror);
+ }
+
++ ijsdev->space_params.banding_type = BandingAlways; /* always force banding */
++
++ /* Set create_buf_device in printer device, so that we can hook the banding playback procedures. */
++ ijsdev->printer_procs.buf_procs.create_buf_device = gsijs_create_buf_device;
++
+ /* Decide whether to use OutputFile or OutputFD. Note: how to
+ determine this is a tricky question, so we just allow the
+ user to set it.
+@@ -610,6 +883,9 @@
+ if (code >= 0)
+ code = gsijs_set_margin_params(ijsdev);
+
++ if (code >= 0)
++ code = gsijs_set_krgb_mode(ijsdev);
++
+ return code;
+ }
+
+@@ -690,21 +966,6 @@
+ return min(width, end);
+ }
+
+-static int ijs_all_white(unsigned char *data, int size)
+-{
+- int clean = 1;
+- int i;
+- for (i = 0; i < size; i++)
+- {
+- if (data[i] != 0xFF)
+- {
+- clean = 0;
+- break;
+- }
+- }
+- return clean;
+-}
+-
+ /* Print a page. Don't use normal printer gdev_prn_output_page
+ * because it opens the output file.
+ */
+@@ -715,8 +976,10 @@
+ gx_device_printer *pdev = (gx_device_printer *)dev;
+ int raster = gdev_prn_raster(pdev);
+ int ijs_width, ijs_height;
+- int row_bytes;
++ int row_bytes, k_row_bytes=0;
+ int n_chan = pdev->color_info.num_components;
++ int krgb_mode = ijsdev->krgb_mode;
++ int k_bits = ijsdev->k_bits;
+ unsigned char *data;
+ char buf[256];
+ double xres = pdev->HWResolution[0];
+@@ -732,13 +995,23 @@
+
+ /* Determine bitmap width and height */
+ ijs_height = gdev_prn_print_scan_lines(dev);
+- if (ijsdev->ijs_version == HPIJS_1_0_VERSION) {
+- ijs_width = pdev->width;
+- } else {
+ ijs_width = gsijs_raster_width(dev);
+- }
++
+ row_bytes = (ijs_width * pdev->color_info.depth + 7) >> 3;
+
++ if (krgb_mode)
++ {
++ gx_device_clist_common *cdev = (gx_device_clist_common *)dev;
++ int band_height = cdev->page_info.band_params.BandHeight;
++ k_row_bytes = (ijs_width + 7) >> 3;
++
++ /* Create banding buffer for k plane. */
++ ijsdev->k_width = ijs_width;
++ ijsdev->k_band_size = band_height * k_row_bytes;
++ if ((ijsdev->k_band = gs_malloc(pdev->memory, ijsdev->k_band_size, 1, "gsijs_output_page")) == (unsigned char *)NULL)
++ return gs_note_error(gs_error_VMerror);
++ }
++
+ /* Required page parameters */
+ sprintf(buf, "%d", n_chan);
+ gsijs_client_set_param(ijsdev, "NumChan", buf);
+@@ -747,44 +1020,71 @@
+
+ /* This needs to become more sophisticated for DeviceN. */
+ strcpy(buf, (n_chan == 4) ? "DeviceCMYK" :
+- ((n_chan == 3) ? "DeviceRGB" : "DeviceGray"));
++ ((n_chan == 3) ? (krgb_mode ? ((k_bits == 1) ? "KRGB" : "KxRGB") : "DeviceRGB") : "DeviceGray"));
+ gsijs_client_set_param(ijsdev, "ColorSpace", buf);
+
+- /* If hpijs 1.0, don't set width and height here, because it
+- expects them to be the paper size. */
+- if (ijsdev->ijs_version != HPIJS_1_0_VERSION) {
+- sprintf(buf, "%d", ijs_width);
+- gsijs_client_set_param(ijsdev, "Width", buf);
+- sprintf(buf, "%d", ijs_height);
+- gsijs_client_set_param(ijsdev, "Height", buf);
+- }
++ sprintf(buf, "%d", ijs_width);
++ gsijs_client_set_param(ijsdev, "Width", buf);
++ sprintf(buf, "%d", ijs_height);
++ gsijs_client_set_param(ijsdev, "Height", buf);
+
+ sprintf(buf, "%gx%g", xres, yres);
+ gsijs_client_set_param(ijsdev, "Dpi", buf);
+
++#ifdef KRGB_DEBUG
++ int kfd, rgbfd;
++ char sz[128];
++ kfd = open("/tmp/k.pbm", O_CREAT | O_TRUNC | O_RDWR, 0644);
++ rgbfd = open("/tmp/rgb.ppm", O_CREAT | O_TRUNC | O_RDWR, 0644);
++ snprintf(sz, sizeof(sz), "P4\n#gdevijs test\n%d\n%d\n", ijs_width, ijs_height);
++ write(kfd, sz, strlen(sz));
++ snprintf(sz, sizeof(sz), "P6\n#gdevijs test\n%d\n%d\n255\n", ijs_width, ijs_height);
++ write(rgbfd, sz, strlen(sz));
++#endif
++
+ for (i=0; i<num_copies; i++) {
+ unsigned char *actual_data;
+ ijs_client_begin_cmd (ijsdev->ctx, IJS_CMD_BEGIN_PAGE);
+ status = ijs_client_send_cmd_wait(ijsdev->ctx);
+
+ for (y = 0; y < ijs_height; y++) {
+- code = gdev_prn_get_bits(pdev, y, data, &actual_data);
+- if (code < 0)
+- break;
++ if (krgb_mode)
++ code = gsijs_get_bits(pdev, y, data, &actual_data);
++ else
++ code = gdev_prn_get_bits(pdev, y, data, &actual_data);
++ if (code < 0)
++ break;
++#ifdef KRGB_DEBUG
++ write(rgbfd, actual_data, row_bytes);
++#endif
++ status = ijs_client_send_data_wait(ijsdev->ctx, 0, (char *)actual_data, row_bytes);
++ if (status)
++ break;
+
+- if (ijsdev->ijs_version == HPIJS_1_0_VERSION &&
+- ijs_all_white(actual_data, row_bytes))
+- status = ijs_client_send_data_wait(ijsdev->ctx, 0, NULL, 0);
+- else
+- status = ijs_client_send_data_wait(ijsdev->ctx, 0,
+- (char *)actual_data, row_bytes);
+- if (status)
+- break;
++ if (krgb_mode) {
++ code = gsijs_k_get_bits(pdev, y, &actual_data);
++ if (code < 0)
++ break;
++#ifdef KRGB_DEBUG
++ write(kfd, actual_data, k_row_bytes);
++#endif
++ status = ijs_client_send_data_wait(ijsdev->ctx, 0, (char *)actual_data, k_row_bytes);
++ if (status)
++ break;
++ }
+ }
+ ijs_client_begin_cmd(ijsdev->ctx, IJS_CMD_END_PAGE);
+ status = ijs_client_send_cmd_wait(ijsdev->ctx);
+ }
+
++#ifdef KRGB_DEBUG
++ close(kfd);
++ close(rgbfd);
++#endif
++
++ if(krgb_mode)
++ gs_free(pdev->memory, ijsdev->k_band, ijsdev->k_band_size, 1, "gsijs_output_page");
++
+ gs_free_object(pdev->memory, data, "gsijs_output_page");
+
+ endcode = (pdev->buffer_space && !pdev->is_async_renderer ?
+@@ -1090,7 +1390,6 @@
+ dprintf2("ijs: Can't set parameter %s=%s\n", key, value);
+ return code;
+ }
+-
+
+ static int
+ gsijs_set_color_format(gx_device_ijs *ijsdev)
diff --git a/prnt/hpijs/global_types.h b/prnt/hpijs/global_types.h
new file mode 100644
index 0000000..711f737
--- /dev/null
+++ b/prnt/hpijs/global_types.h
@@ -0,0 +1,547 @@
+/*****************************************************************************\
+ global_types.h : global types, enums, and #defines for APDK
+
+ Copyright (c) 1996 - 2008, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+/*! \addtogroup globals
+Definitions for global variables, types, and #defines
+@{
+*/
+
+//
+// Definitions and structures needed by applications
+//
+// This file does not include C++ class definitions etc. so it can
+// be included by calling C or C++ source files
+
+#ifndef APDK_GLOBAL_TYPES_H
+#define APDK_GLOBAL_TYPES_H
+
+#include "models.h"
+#include "modes.h"
+
+#define APDK_INVALID_VALUE -9999
+
+#if APDK_AUTO_INCLUDE
+ #include "auto-include.h"
+#else
+ typedef unsigned long uint32_t;
+#endif
+
+// ** Defines
+
+#ifdef APDK_NOTHROW
+ #include <new>
+ //#define NOTHROW (std::nothrow)
+ #define new new(std::nothrow)
+#endif
+
+// Camera compiler warns about NULL at different locations each time.
+// So, force a definition here.
+
+#ifdef NULL
+ #undef NULL
+#endif
+
+#ifndef NULL
+ #define NULL 0
+#endif
+
+#ifndef BOOL
+ typedef int BOOL;
+ #define TRUE 1
+ #define FALSE 0
+#endif
+
+/*
+#ifndef BOOL
+ #define BOOL bool
+#endif
+#ifndef TRUE
+ #define TRUE true
+#endif
+#ifndef FALSE
+ #define FALSE false
+#endif
+*/
+
+typedef unsigned char BYTE;
+
+typedef unsigned short WORD;
+
+typedef uint32_t DWORD;
+
+#ifndef LOWORD
+ #define LOWORD(l) ((WORD) (l))
+#endif
+
+#ifndef HIWORD
+ #define HIWORD(l) ((WORD) (((DWORD) (l) >> 16) & 0xFFFF))
+#endif
+
+#ifndef ABS
+ #define ABS(x) ( ((x)<0) ? -(x) : (x) )
+#endif
+
+#ifdef BLACK_PEN
+ #undef BLACK_PEN
+#endif
+
+#ifdef NO_ERROR
+ #undef NO_ERROR
+#endif
+
+APDK_BEGIN_NAMESPACE
+
+
+//! \internal For use in connection with PCL media-type command. Values are PCL codes.
+enum MediaType
+{
+ mediaAuto = -1,
+ mediaPlain = 0,
+ mediaBond = 0,
+ mediaSpecial = 2,
+ mediaGlossy = 3,
+ mediaTransparency = 4,
+ mediaHighresPhoto = 3, // used by vip printers for 2400 mode
+ mediaCDDVD = 7,
+ mediaBrochure = 8
+};
+
+
+//! \internal For use in connection with PCL media-size command. Values are PCL codes.
+enum MediaSize
+{
+ sizeUSLetter = 2,
+ sizeUSLegal = 3,
+ sizeA4 = 26,
+ sizeNum10Env = 81,
+ sizeA2Env = 109,
+ sizeC6Env = 92,
+ sizeDLEnv = 90,
+ size3JPNEnv = 110,
+ size4JPNEnv = 111,
+ sizePhoto = 74, // 4x6 Index Card / Photo paper
+ sizeA6 = 73, // used to be 24, full-bleed support is for 73 only. Is same size though
+ sizeB4 = 46,
+ sizeB5 = 45,
+ sizeOUFUKU = 72,
+ sizeHAGAKI = 71,
+ sizeA3 = 27,
+ sizeA5 = 25,
+ sizeSuperB = 16,
+ sizeLedger = 6,
+ sizeFLSA = 10,
+ sizeExecutive = 1,
+ sizeCustom = 101,
+ size5x7 = 122,
+ sizeCDDVD80 = 98,
+ sizeCDDVD120 = 99
+};
+
+//! \internal For use in connection with PCL media-source command. Values are PCL codes.
+enum MediaSource
+{
+ sourceTrayMin = -2,
+ sourceBanner = -1,
+ sourceTray1 = 1,
+ sourceManual = 2,
+ sourceManualEnv = 3,
+ sourceTray2 = 4,
+ sourceDuplexerNHagakiFeed = 5,
+ sourceOptionalEnv = 6,
+ sourceTrayPhoto = 6,
+ sourceTrayAuto = 7,
+ sourceTrayCDDVD = 14,
+ sourceTrayMax = 50
+};
+
+
+//! \internal For use in connection with PCL quality-mode command. Values are PCL codes.
+enum Quality
+{
+ qualityAuto = -3,
+ qualityFastDraft = -2,
+ qualityDraft = -1,
+ qualityNormal = 0,
+ qualityPresentation = 1,
+ qualityMarvellous = 2,
+ qualityFastNormal = 3
+};
+
+//! \internal For use in connection with fullbleed support. Values are type of fullbleed.
+enum FullbleedType
+{
+ fullbleedNotSupported = 0,
+ fullbleed3EdgeAllMedia = 1,
+ fullbleed3EdgePhotoMedia = 2,
+ fullbleed3EdgeNonPhotoMedia = 3,
+ fullbleed4EdgeAllMedia = 4,
+ fullbleed4EdgePhotoMedia = 5,
+ fullbleed4EdgeNonPhotoMedia = 6
+};
+
+enum FontIndex
+{
+ COURIER_INDEX = 1,
+ CGTIMES_INDEX = 2,
+ LETTERGOTHIC_INDEX = 3,
+ UNIVERS_INDEX = 4
+};
+
+const int MAX_CHAR_SET = 5;
+
+const int MAX_POINTSIZES = 5;
+
+const int MAXCOLORDEPTH = 3;
+
+const int MAXCOLORPLANES = 6; // current max anticipated, 6 for 690 photopen
+
+const int MAXCOLORROWS = 2; // multiple of high-to-low for mixed-resolution cases
+
+// ** JOB related structures/enums
+
+//! Possible pen combinations
+enum PEN_TYPE
+{
+ BLACK_PEN, //!< Only BLACK pen in the printer
+ COLOR_PEN, //!< Only COLOR pen in the printer
+ BOTH_PENS, //!< BLACK & COLOR pens in printer
+ MDL_PEN, //!< Photo pen in the printer
+ MDL_BOTH, //!< COLOR and Photo pen in printer
+ MDL_AND_BLACK_PENS, //!< BLACK and Photo pen in printer
+ MDL_BLACK_AND_COLOR_PENS, //!< BLACK, COLOR and Photo pen in printer
+ GREY_PEN, //!< Only GREY pen in the printer
+ GREY_BOTH, //!< COLOR and GREY pen in the printer
+ MDL_AND_GREY_PENS, //!< GREY and Photo pen in printer
+ MDL_GREY_AND_COLOR_PENS, //!< GREY, COLOR, and Photo pen in the printer
+ UNKNOWN_PEN, //!< New Pen type that we have no knowledge yet
+ // if more pen or pen combos are added then add them here and point MAX_PEN_TYPE to the last one
+ NO_PEN, //!< No pens in the printer
+ DUMMY_PEN, //!< Not a possible value - used for initialization
+ MAX_PEN_TYPE = UNKNOWN_PEN //!< base 0, ending with MDL_BOTH (NOT NO_PEN)
+};
+//const int MAX_PEN_TYPE = 4;
+
+
+//! Supported Paper sizes
+/*
+The PAPER_SIZE enum is directly supported by PSM in PrintContext
+do not change the order of the PAPER_SIZE enum. The static array in
+PrintContext depends on this order. Any changes to this enum may require
+changes to the PSM array.
+*/
+typedef enum // typedef'ed for C interface
+{
+ UNSUPPORTED_SIZE =-1, //!< Not supported paper size (also used as mandatory flag)
+ LETTER = 0, //!< 8.5 x 11 in.
+ A4 = 1, //!< 210 x 297 mm.
+ LEGAL = 2, //!< 8.25 x 14 in.
+ PHOTO_SIZE = 3, //!< 4x6 Photo with tear-off tab
+ A6 = 4, //!< 105 x 148 mm.
+ CARD_4x6 = 5, //!< 4x6 photo/card without tear-off tab
+ B4 = 6, //!< 250 x 353 mm.
+ B5 = 7, //!< 176 x 250 mm.
+ OUFUKU = 8, //!< 148 x 200 mm.
+ OFUKU = 8, //!< Misspelled - here for backwards compatibility
+ HAGAKI = 9, //!< 100 x 148 mm.
+ A6_WITH_TEAR_OFF_TAB = 10, //!< A6 with tear-off tab
+#ifdef APDK_EXTENDED_MEDIASIZE
+ A3 = 11, //!< 294 x 419.8 mm.
+ A5 = 12, //!< 148 x 210 mm.
+ LEDGER = 13, //!< 11 x 17 in.
+ SUPERB_SIZE = 14, //!< 13 x 19 in.
+ EXECUTIVE = 15, //!< 7.25 x 10.5 in.
+ FLSA = 16, //!< 8.5 x 13 in.
+ CUSTOM_SIZE = 17, //!< Custom
+ ENVELOPE_NO_10 = 18, //!< No. 10 Envelope (4.12 x 9.5 in.)
+ ENVELOPE_A2 = 19, //!< A2 Envelope (4.37 x 5.75 in.)
+ ENVELOPE_C6 = 20, //!< C6 Envelope (114 x 162 mm)
+ ENVELOPE_DL = 21, //!< DL Envelope (110 x 220 mm)
+ ENVELOPE_JPN3 = 22, //!< Japanese Envelope #3 (120 x 235 mm)
+ ENVELOPE_JPN4 = 23, //!< Japanese Envelope #4 (90 x 205 mm)
+#endif
+ PHOTO_5x7, //!< 5x7 Photo
+ CDDVD_80, //!< 3 in. CD or DVD
+ CDDVD_120, //!< 5 in. CD or DVD
+#ifdef APDK_EXTENDED_MEDIASIZE
+ PHOTO_4x8, //!< Panorama 4 in. x 8 in.
+ PHOTO_4x12, //!< Panorama 4 in. x 12 in.
+ L, //!< Japanese card (3.5 in. x 5 in.)
+#endif
+ MAX_PAPER_SIZE //!< Only for array size and loops
+} PAPER_SIZE;
+
+
+typedef enum // typedef'ed for C interface
+{
+ CLEAN_PEN = 0
+} PRINTER_FUNC;
+
+
+// ** TEXT related structures/enums
+
+//! Supported Text colors for device text
+typedef enum // typedef'ed for C interface
+{
+ WHITE_TEXT, //!< White
+ CYAN_TEXT, //!< Cyan
+ MAGENTA_TEXT, //!< Magenta
+ BLUE_TEXT, //!< Blue
+ YELLOW_TEXT, //!< Yellow
+ GREEN_TEXT, //!< Green
+ RED_TEXT, //!< Red
+ BLACK_TEXT //!< Black
+} TEXTCOLOR;
+
+
+// currently only portrait fonts are supported
+enum TEXTORIENT
+{
+ PORTRAIT,
+ LANDSCAPE,
+ BOTH
+};
+
+const int MAX_FONT_SIZES = 10; // max # of fonts to be realized at one time
+
+
+// ** I/O related stuff
+
+const int TIMEOUTVAL = 500; // in msec, ie 0.5 sec
+
+typedef WORD PORTID;
+typedef void * PORTHANDLE;
+
+enum MODE1284
+{
+ COMPATIBILITY,
+ NIBBLE,
+ ECP
+};
+
+
+enum HALFTONING_ALGORITHM
+{
+ FED,
+ MATRIX
+};
+
+
+//! Color modes for SelectPrintMode
+typedef enum // typedef'ed for C interface
+{
+ GREY_K, //!< Use the BLACK pen to print B&W only
+ GREY_CMY, //!< Use the COLOR pen to print grey scale
+ COLOR, //!< Use the COLOR pen to print color
+ MAX_COLORMODE
+} COLORMODE;
+
+
+//! Quality modes for SelectPrintMode
+typedef enum // typedef'ed for C interface
+{
+ QUALITY_NORMAL, //!< Normal quality print mode (probably 300x300)
+ QUALITY_DRAFT, //!< Draft print mode - the same or faster than normal
+ QUALITY_BEST, //!< Probably slower and possible higher resolution
+ QUALITY_HIGHRES_PHOTO, //!< 1200 dpi - currently 9xxvip, linux only
+ QUALITY_FASTDRAFT, //!< True draft, 300 dpi - newer VIP printers only
+ QUALITY_AUTO, //!< Printer selects optimum resolution - 05 and later VIP printers only
+ QUALITY_FASTNORMAL, //!< Normal quality print mode - faster than Normal
+ MAX_QUALITY_MODE
+} QUALITY_MODE;
+
+
+//! Media types for SelectPrintMode
+typedef enum // typedef'ed for C interface
+{
+ MEDIA_PLAIN, //!< Plain paper
+ MEDIA_PREMIUM, //!< Premium paper - for use with 6xx series
+ MEDIA_PHOTO, //!< Photo paper - for use with photo quality printers
+ MEDIA_TRANSPARENCY, //!< Transparency film
+ MEDIA_HIGHRES_PHOTO, //!< Premium photo paper
+ MEDIA_AUTO, //!< Printer uses media sense to determine media type
+ MEDIA_ADVANCED_PHOTO, //!< Advanced photo paper
+ MEDIA_CDDVD = 7, //!< CD or DVD media
+ MEDIA_BROCHURE = 8, //!< Glossy brochure paper
+ MAX_MEDIATYPE
+} MEDIATYPE;
+
+//! PhotoTray status
+typedef enum // typedef'ed for C interface
+{
+ UNKNOWN = -1, //!< Unknown State
+ DISENGAGED = 0, //!< Photo Tray is nor engaged
+ ENGAGED = 1 //!< Photo Tray is engaged
+} PHOTOTRAY_STATE;
+
+//////////////////////////////////////////////////////////////////////////////////////
+// values of DRIVER_ERROR
+// first of 2 hex digits indicates category
+
+typedef enum // typedef'ed for C interface
+{
+
+// general or system errors
+ NO_ERROR = 0x00, //!< everything okay
+ JOB_CANCELED = 0x01, //!< CANCEL chosen by user
+ SYSTEM_ERROR = 0x02, //!< something bad that should not have happened
+ ALLOCMEM_ERROR = 0x03, //!< failed to allocate memory
+ NO_PRINTER_SELECTED = 0x04, //!< indicates improper calling sequence or unidi
+ INDEX_OUT_OF_RANGE = 0x05, //!< what it says
+ ILLEGAL_RESOLUTION = 0x06, //!< tried to set resolution at unacceptable value
+ NULL_POINTER = 0x07, //!< supplied ptr was null
+ MISSING_PENS = 0x08, //!< one or more printhead/pen missing
+
+// build-related
+// (items either absent from current build, or just bad index from client code)
+ UNSUPPORTED_PRINTER = 0x10, //!< selected printer-type unsupported in build
+ UNSUPPORTED_PEN = 0x11, //!< selected pen-type unsupported
+ TEXT_UNSUPPORTED = 0x12, //!< no text allowed in current build, UsePageWidth is false
+ GRAPHICS_UNSUPPORTED = 0x13, //!< no graphics allowed in current build
+ UNSUPPORTED_FONT = 0x14, //!< font selection failed
+ ILLEGAL_COORDS = 0x15, //!< bad (x,y) passed to TextOut
+ UNSUPPORTED_FUNCTION = 0x16, //!< bad selection for PerformPrinterFunction
+ BAD_INPUT_WIDTH = 0x18, //!< inputwidth is 0 and
+ OUTPUTWIDTH_EXCEEDS_PAGEWIDTH = 0x19, //!< inputwidth exceeds printable width
+ UNSUPPORTED_SCALING = 0x1a, //!< inputwidth exceeds outputwidth, can't shrink output
+
+// I/O related
+ IO_ERROR = 0x20, //!< I/O error communicating with printer
+ BAD_DEVICE_ID = 0x21, //!< bad or garbled device id from printer
+ CONTINUE_FROM_BLOCK = 0x22, //!< continue from blocked state for printers with no buttons
+
+// Run time related
+ PLUGIN_LIBRARY_MISSING = 0x30, //!< a required plugin (dynamic) library is missing
+
+// WARNINGS
+// convention is that values < 0 can be ignored (at user's peril)
+ WARN_MODE_MISMATCH = -1, //!< printmode selection incompatible with pen, tray, etc.
+ WARN_DUPLEX = -2, //!< duplexer installed; our driver can't use it
+ WARN_LOW_INK_BOTH_PENS= -3, //!< sensor says pens below threshold
+ WARN_LOW_INK_BLACK = -4, //!< sensor says black pen below threshold
+ WARN_LOW_INK_COLOR = -5, //!< sensor says color pen below threshold
+
+ WARN_LOW_INK_PHOTO = -10, //!< sensor says photo pen below threshold
+ WARN_LOW_INK_GREY = -11, //!< sensor says grey pen below threshold
+ WARN_LOW_INK_BLACK_PHOTO = -12, //!< sensor says black and photo pens below threshold
+ WARN_LOW_INK_COLOR_PHOTO = -13, //!< sensor says color and photo pens below threshold
+ WARN_LOW_INK_GREY_PHOTO = -14, //!< sensor says grey and photo pens below threshold
+ WARN_LOW_INK_COLOR_GREY = -15, //!< sensor says color and grey pens below threshold
+ WARN_LOW_INK_COLOR_GREY_PHOTO = -16, //!< sensor says color, photo, and grey pens below threshold
+ WARN_LOW_INK_COLOR_BLACK_PHOTO = -17, //!< sensor says color, photo, and black pens below threshold
+ WARN_LOW_INK_CYAN = -18, //!< sensor says cyan ink below threshold
+ WARN_LOW_INK_MAGENTA = -19, //!< sensor says magenta ink below threshold
+ WARN_LOW_INK_YELLOW = -20, //!< sensor says yellow ink below threshold
+ WARN_LOW_INK_MULTIPLE_PENS = - 21, //!< sensor says more than one pen below threshold
+ WARN_FULL_BLEED_UNSUPPORTED = -6,//!< device does not support full-bleed printing
+ WARN_FULL_BLEED_3SIDES = -7, //!< full bleed on only 3 sides
+ WARN_FULL_BLEED_PHOTOPAPER_ONLY = -30, //!< device only support full-bleed on photo paper
+ WARN_FULL_BLEED_3SIDES_PHOTOPAPER_ONLY = -31, //!< device only support 3 sided full-bleed on photo paper
+ WARN_ILLEGAL_PAPERSIZE = -8, //!< papersize illegal for given hardware
+ ILLEGAL_PAPERSIZE = -8,
+ WARN_INVALID_MEDIA_SOURCE = -9 //!< media source tray is invalid
+} DRIVER_ERROR; //DRIVER_ERROR
+
+
+///////////////////////////////////////////////////////////////////////////////////////
+
+// ** Printer Status return values
+
+
+enum DISPLAY_STATUS
+{ // used for DisplayPrinterStatus
+ NODISPLAYSTATUS = -1,
+ DISPLAY_PRINTING,
+ DISPLAY_PRINTING_COMPLETE,
+ DISPLAY_PRINTING_CANCELED,
+ DISPLAY_OFFLINE,
+ DISPLAY_BUSY,
+ DISPLAY_OUT_OF_PAPER,
+ DISPLAY_TOP_COVER_OPEN,
+ DISPLAY_ERROR_TRAP,
+ DISPLAY_NO_PRINTER_FOUND,
+ DISPLAY_NO_PEN_DJ400,
+ DISPLAY_NO_PEN_DJ600,
+ DISPLAY_NO_COLOR_PEN,
+ DISPLAY_NO_BLACK_PEN,
+ DISPLAY_NO_PENS,
+ DISPLAY_PHOTO_PEN_WARN,
+ DISPLAY_PRINTER_NOT_SUPPORTED,
+ DISPLAY_COMM_PROBLEM,
+ DISPLAY_CANT_ID_PRINTER,
+ DISPLAY_OUT_OF_PAPER_NEED_CONTINUE,
+ DISPLAY_PAPER_JAMMED,
+ DISPLAY_PHOTOTRAY_MISMATCH,
+
+ // internal driver use only
+
+ ACCEPT_DEFAULT,
+ DISPLAY_PRINTCONTEXT_WARN,
+ DISPLAY_PRINTMODE_WARN,
+ DISPLAY_JOB_WARN
+};
+
+
+// ** move these to internal.h
+// items from wtv_interp.h
+
+const int NUMBER_PLANES = 3;
+
+// must be #define instead of const int for C interface
+#define NUMBER_RASTERS 3 // The number of Rasters to Buffer
+
+#ifdef APDK_AUTODUPLEX
+enum DUPLEXMODE
+{
+ DUPLEXMODE_NONE,
+ DUPLEXMODE_TABLET,
+ DUPLEXMODE_BOOK
+};
+#endif
+
+typedef enum
+{
+ SPEED_MECH_HINT,
+ PAGES_IN_DOC_HINT,
+ EXTRA_DRYTIME_HINT,
+ MAX_FILE_SIZE_HINT,
+ RED_EYE_REMOVAL_HINT,
+ PHOTO_FIX_HINT,
+ LEFT_OVERSPRAY_HINT,
+ RIGHT_OVERSPRAY_HINT,
+ TOP_OVERSPRAY_HINT,
+ BOTTOM_OVERSPRAY_HINT
+} PRINTER_HINT;
+
+APDK_END_NAMESPACE
+
+/*! @} */ // end globals group (documentation)
+
+#endif //APDK_GLOBAL_TYPES_H
diff --git a/prnt/hpijs/globals.cpp b/prnt/hpijs/globals.cpp
new file mode 100644
index 0000000..9e2b807
--- /dev/null
+++ b/prnt/hpijs/globals.cpp
@@ -0,0 +1,288 @@
+/*****************************************************************************\
+ globals.cpp : Global functions for APDK
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#include "header.h"
+// Functions used in Translator
+
+APDK_BEGIN_NAMESPACE
+
+/////////////////////////////////////////////////////////////////////////
+int stringlen(const char*s)
+// may not be in some systems
+{ int c=0;
+ while (s[c++]) ;
+ return c-1;
+}
+// utilities to save overhead for copying escape sequences
+
+// notice that the input is assumed to be zero-terminated, but the results
+// generated are not, in keeping with PCL
+
+BYTE EscCopy(BYTE *dest, const char *s,int num, char end)
+{
+ dest[0]=ESC; strcpy((char*)&dest[1],s);
+ BYTE k = stringlen(s)+1;
+ BYTE i = sprintf((char *)&dest[k],"%d",num);
+ dest[k+i] = end;
+ return (k+i+1);
+}
+BYTE EscAmplCopy(BYTE *dest, int num, char end)
+{
+ dest[0]=ESC; dest[1]='&';dest[2]='l';
+ BYTE i = sprintf((char *)&dest[3],"%d",num);
+ dest[3+i] = end;
+ return (4+i);
+}
+
+MediaSize PaperToMediaSize(PAPER_SIZE psize)
+{
+ switch(psize)
+ {
+ case LETTER: return sizeUSLetter; break;
+ case LEGAL: return sizeUSLegal; break;
+ case A4: return sizeA4; break;
+ case PHOTO_SIZE: return sizePhoto; break;
+ case CARD_4x6: return sizePhoto;
+ case A6: return sizeA6; break;
+ case A6_WITH_TEAR_OFF_TAB: return sizeA6;
+ case B4: return sizeB4; break;
+ case B5: return sizeB5; break;
+ case OUFUKU: return sizeOUFUKU; break;
+ case HAGAKI: return sizeHAGAKI; break;
+#ifdef APDK_EXTENDED_MEDIASIZE
+ case A3: return sizeA3; break;
+ case A5: return sizeA5; break;
+ case LEDGER: return sizeLedger; break;
+ case SUPERB_SIZE: return sizeSuperB; break;
+ case EXECUTIVE: return sizeExecutive; break;
+ case FLSA: return sizeFLSA; break;
+ case CUSTOM_SIZE: return sizeCustom; break;
+ case ENVELOPE_NO_10: return sizeNum10Env; break;
+ case ENVELOPE_A2: return sizeA2Env; break;
+ case ENVELOPE_C6: return sizeC6Env; break;
+ case ENVELOPE_DL: return sizeDLEnv; break;
+ case ENVELOPE_JPN3: return size3JPNEnv; break;
+ case ENVELOPE_JPN4: return size4JPNEnv; break;
+#endif
+ case PHOTO_5x7: return size5x7; break;
+ case CDDVD_80: return sizeCDDVD80; break;
+ case CDDVD_120: return sizeCDDVD120; break;
+ default: return sizeUSLetter; break;
+ }
+}
+
+PAPER_SIZE MediaSizeToPaper(MediaSize msize)
+{
+ switch(msize)
+ {
+ case sizeUSLetter: return LETTER; break;
+ case sizeUSLegal: return LEGAL; break;
+ case sizeA4: return A4; break;
+ case sizePhoto: return PHOTO_SIZE; break;
+ case sizeA6: return A6; break;
+ case sizeB4: return B4; break;
+ case sizeB5: return B5; break;
+ case sizeOUFUKU: return OUFUKU; break;
+ case sizeHAGAKI: return HAGAKI; break;
+#ifdef APDK_EXTENDED_MEDIASIZE
+ case sizeA3: return A3; break;
+ case sizeA5: return A5; break;
+ case sizeLedger: return LEDGER; break;
+ case sizeSuperB: return SUPERB_SIZE; break;
+ case sizeExecutive: return EXECUTIVE; break;
+ case sizeFLSA: return FLSA; break;
+ case sizeCustom: return CUSTOM_SIZE; break;
+ case sizeNum10Env: return ENVELOPE_NO_10; break;
+ case sizeA2Env: return ENVELOPE_A2; break;
+ case sizeC6Env: return ENVELOPE_C6; break;
+ case sizeDLEnv: return ENVELOPE_DL; break;
+ case size3JPNEnv: return ENVELOPE_JPN3; break;
+ case size4JPNEnv: return ENVELOPE_JPN4; break;
+#endif
+ case size5x7: return PHOTO_5x7; break;
+ case sizeCDDVD80: return CDDVD_80; break;
+ case sizeCDDVD120: return CDDVD_120; break;
+ default: return UNSUPPORTED_SIZE; break;
+ }
+}
+
+MediaType MediaTypeToPcl (MEDIATYPE eMediaType)
+{
+ switch (eMediaType)
+ {
+ case MEDIA_PLAIN:
+ return mediaPlain;
+ case MEDIA_PREMIUM:
+ return mediaSpecial;
+ case MEDIA_PHOTO:
+ case MEDIA_ADVANCED_PHOTO:
+ return mediaGlossy;
+ case MEDIA_TRANSPARENCY:
+ return mediaTransparency;
+ case MEDIA_HIGHRES_PHOTO:
+ return mediaHighresPhoto;
+ case MEDIA_AUTO:
+ return mediaAuto;
+ case MEDIA_CDDVD:
+ return mediaCDDVD;
+ case MEDIA_BROCHURE:
+ return mediaBrochure;
+ default:
+ return mediaPlain;
+ }
+}
+
+void AsciiHexToBinary(BYTE* dest, char* src, int count)
+{
+ int i;
+ BYTE bitPattern;
+ for (i=0; i<count ; i++)
+ {
+ switch (src[i])
+ {
+ case '0':
+ bitPattern = 0x00;
+ break;
+ case '1':
+ bitPattern = 0x01;
+ break;
+ case '2':
+ bitPattern = 0x02;
+ break;
+ case '3':
+ bitPattern = 0x03;
+ break;
+ case '4':
+ bitPattern = 0x04;
+ break;
+ case '5':
+ bitPattern = 0x05;
+ break;
+ case '6':
+ bitPattern = 0x06;
+ break;
+ case '7':
+ bitPattern = 0x07;
+ break;
+ case '8':
+ bitPattern = 0x08;
+ break;
+ case '9':
+ bitPattern = 0x09;
+ break;
+ case 'a':
+ case 'A':
+ bitPattern = 0x0a;
+ break;
+ case 'b':
+ case 'B':
+ bitPattern = 0x0b;
+ break;
+ case 'c':
+ case 'C':
+ bitPattern = 0x0c;
+ break;
+ case 'd':
+ case 'D':
+ bitPattern = 0x0d;
+ break;
+ case 'e':
+ case 'E':
+ bitPattern = 0x0e;
+ break;
+ case 'f':
+ case 'F':
+ bitPattern = 0x0f;
+ break;
+ default:
+ // default case should never happen so abort during debugging
+ ASSERT(0);
+ bitPattern = 0;
+ break;
+ }
+
+ if ((i%2) == 0)
+ {
+ dest[i/2] = bitPattern << 4;
+ }
+ else
+ {
+ dest[i/2] |= bitPattern;
+ }
+ }
+} //AsciiHexToBinary
+
+#ifdef HAVE_LIBDL
+#include <dlfcn.h>
+
+void *LoadPlugin (const char *szPluginName)
+{
+ FILE *fp;
+ char szLine[256];
+ int i;
+ void *ptemp = NULL;
+ char *p = NULL;
+ int bFound = 0;
+ if ((fp = fopen ("/etc/hp/hplip.conf", "r")) == NULL)
+ {
+ return NULL;
+ }
+ while (!feof (fp))
+ {
+ if (!fgets (szLine, 256, fp))
+ {
+ break;
+ }
+ if (!bFound && strncmp (szLine, "[dirs]", 6))
+ continue;
+ bFound = 1;
+ if (szLine[0] < ' ')
+ break;
+ if (!strncmp (szLine, "home", 4))
+ {
+ i = strlen (szLine);
+ while (i > 0 && szLine[i] < ' ')
+ szLine[i--] = '\0';
+ p = szLine + 4;
+ while (*p && *p != '/')
+ p++;
+ i = sizeof(szLine) - (strlen (p) + (p - szLine));
+ snprintf (p+strlen (p), i, "/prnt/plugins/%s", szPluginName);
+ ptemp = dlopen (p, RTLD_LAZY);
+ }
+ }
+ fclose (fp);
+ return ptemp;
+}
+#endif // HAVE_LIBDL
+
+APDK_END_NAMESPACE
+
diff --git a/prnt/hpijs/halftoner.cpp b/prnt/hpijs/halftoner.cpp
new file mode 100644
index 0000000..dc7278e
--- /dev/null
+++ b/prnt/hpijs/halftoner.cpp
@@ -0,0 +1,469 @@
+/*****************************************************************************\
+ halftoner.cpp : Implimentation for the Halftoner class
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+//===========================================================================
+//
+// Filename : halftoner.cpp
+//
+// Module : Open Source Imaging
+//
+// Description : This file contains the constructor and destructor for
+// the Halftoner class, which performs color-matching and
+// halftoning.
+//
+// Detailed Description:
+//
+// The only member functions needed are Process(inputRaster)
+// and Restart (used to skip white space and for new page).
+//
+// Configurability required in Slimhost driver is reflected in the
+// parameters to the constructor:
+// 1. SystemServices encapsulates memory management for platform-independence
+// 2. PrintMode contains info on resolution and other properties
+// 3. iInputWidth tells how many pixels input per plane
+// 4. iNumRows is 1 except for mixed-resolution cases
+// 5. HiResFactor is for boosting base resolution, e.g. 2 if 600 dpi grid
+// (base res assumed to be 300)
+//
+// These structures, together with the variable StartPlane (designating
+// K or C in the fixed ordering KCMY), are accessed by the Translator
+// component of the driver, in order to properly package the data in
+// the printer command language.
+//============================================================================
+
+#include "header.h"
+#include "hptypes.h"
+#include "halftoner.h"
+
+APDK_BEGIN_NAMESPACE
+
+Halftoner::Halftoner
+(
+ SystemServices* pSys,
+ PrintMode* pPM,
+ unsigned int iInputWidth,
+ unsigned int iNumRows[],
+ unsigned int HiResFactor,
+ BOOL matrixbased
+) : ColorPlaneCount(pPM->dyeCount),
+ InputWidth(iInputWidth),
+ ResBoost(HiResFactor),
+ pSS(pSys),
+ nNextRaster(0),
+ fBlackFEDResPtr(pPM->BlackFEDTable),
+ fColorFEDResPtr(pPM->ColorFEDTable),
+ iColor(0),
+ iRow(0),
+ iPlane(0),
+ tempBuffer(NULL),
+ tempBuffer2(NULL),
+ hold_random(0),
+ usematrix(matrixbased)
+{
+ unsigned int i;
+ int j,k,PlaneSize;
+ constructor_error = NO_ERROR;
+
+ StartPlane = K; // most common case
+
+ if (ColorPlaneCount == 3) // CMY pen
+ {
+ StartPlane=C;
+ NumRows[K] = ColorDepth[K] = OutputWidth[K] = 0;
+ }
+
+ EndPlane=Y; // most common case
+ if (ColorPlaneCount == 6)
+ {
+ EndPlane = Mlight;
+ }
+ if (ColorPlaneCount == 1)
+ {
+ EndPlane = K;
+ }
+
+ AdjustedInputWidth = InputWidth;
+ if (AdjustedInputWidth % 8)
+ {
+ AdjustedInputWidth += 8 - (AdjustedInputWidth % 8);
+ }
+
+ // init arrays
+ for (i = StartPlane; i < (ColorPlaneCount + StartPlane); i++)
+ {
+ ColorDepth[i]= pPM->ColorDepth[i];
+ NumRows[i]=iNumRows[i];
+
+ OutputWidth[i] = AdjustedInputWidth * NumRows[i] * ResBoost;
+
+ }
+ for (;i < (unsigned)MAXCOLORPLANES; i++)
+ {
+ NumRows[i] = ColorDepth[i] = OutputWidth[i] = 0;
+ }
+
+ oddbits = AdjustedInputWidth - InputWidth;
+ ///////////////////////////////////////////////////////////////////////////
+ for (i=0; i <= Mlight; i++)
+ {
+ ErrBuff[i]=NULL;
+ }
+
+ for (i=StartPlane; i <= EndPlane; i++)
+ {
+ ErrBuff[i] = (short*)pSS->AllocMem((OutputWidth[i] + 2) * sizeof(short));
+ if (ErrBuff[i] == NULL)
+ {
+ goto MemoryError;
+ }
+ }
+
+ if (OutputWidth[K] > AdjustedInputWidth)
+ // need to expand input data (easier than expanding bit-pixels after) on K row
+ {
+ tempBuffer = (BYTE*) pSS->AllocMem(OutputWidth[K]);
+ if (tempBuffer == NULL)
+ {
+ goto MemoryError;
+ }
+ if (EndPlane > Y)
+ {
+ tempBuffer2 = (BYTE*) pSS->AllocMem(OutputWidth[K]);
+ if (tempBuffer2 == NULL)
+ {
+ goto MemoryError;
+ }
+ }
+
+ }
+
+
+ Restart(); // this zeroes buffers and sets nextraster counter
+
+ // allocate output buffers
+ for (i = 0; i < (unsigned)MAXCOLORPLANES; i++)
+ {
+ for (j = 0; j < MAXCOLORROWS; j++)
+ {
+ for (k = 0; k < MAXCOLORDEPTH; k++)
+ {
+ ColorPlane[i][j][k] = NULL;
+ }
+ }
+ }
+
+ for (i=StartPlane; i < (ColorPlaneCount+StartPlane); i++)
+ {
+ for (j=0; j < NumRows[i]; j++)
+ {
+ for (k=0; k < ColorDepth[i]; k++)
+ {
+ PlaneSize= OutputWidth[i]/8 + // doublecheck ... should already be divisble by 8
+ ((OutputWidth[i] % 8)!=0);
+ ColorPlane[i][j][k] = (BYTE*) pSS->AllocMem(PlaneSize);
+ if (ColorPlane[i][j] == NULL)
+ {
+ goto MemoryError;
+ }
+ memset(ColorPlane[i][j][k], 0, PlaneSize);
+ }
+ }
+ }
+
+ PlaneSize = (OutputWidth[0] + 7) / 8;
+ if (PlaneSize > 0)
+ {
+ originalKData = (BYTE*) pSS->AllocMem(PlaneSize);
+ if (originalKData == NULL)
+ {
+ goto MemoryError;
+ }
+ memset(originalKData, 0, PlaneSize);
+ }
+ return;
+
+MemoryError:
+ constructor_error=ALLOCMEM_ERROR;
+
+ FreeBuffers();
+
+ for (i=0; i < ColorPlaneCount; i++)
+ {
+ for (j=0; j < NumRows[i]; j++)
+ {
+ for (k=0; k < ColorDepth[i]; k++)
+ {
+ if (ColorPlane[i][j][k])
+ {
+ pSS->FreeMemory(ColorPlane[i][j][k]);
+ }
+ }
+ }
+ }
+ if (originalKData)
+ {
+ pSS->FreeMemory(originalKData);
+ }
+
+} //Halftoner
+
+
+Halftoner::~Halftoner()
+{
+ DBG1("destroying Halftoner \n");
+
+ FreeBuffers();
+
+ for (int i=0; i < MAXCOLORPLANES; i++)
+ {
+ for (int j=0; j < NumRows[i]; j++)
+ {
+ for (int k=0; k < ColorDepth[i]; k++)
+ {
+ if (ColorPlane[i][j][k])
+ {
+ pSS->FreeMemory(ColorPlane[i][j][k]);
+ }
+ }
+ }
+ }
+ if (originalKData)
+ {
+ pSS->FreeMemory(originalKData);
+ }
+} //~Halftoner
+
+
+void Halftoner::Restart()
+{
+ nNextRaster = 0;
+
+ for (unsigned int i = StartPlane; i <= EndPlane; i++)
+ {
+ memset(ErrBuff[i], 0, (OutputWidth[i]+2) * sizeof(short));
+ }
+
+ started = FALSE;
+} //Restart
+
+
+void Halftoner::Flush()
+{
+ if (!started)
+ {
+ return;
+ }
+ Restart();
+} //Flush
+
+
+void Halftoner::FreeBuffers()
+{
+ for (unsigned int i = StartPlane; i <= EndPlane; i++)
+ {
+ pSS->FreeMemory(ErrBuff[i]);
+ }
+ if (tempBuffer)
+ {
+ pSS->FreeMemory(tempBuffer);
+ }
+ if (tempBuffer2)
+ {
+ pSS->FreeMemory(tempBuffer2);
+ }
+} //FreeBuffers
+
+
+// dumb horizontal doubling (tripling, etc.) for resolution-boost prior to halftoning
+void Halftoner::PixelMultiply(unsigned char* buffer, unsigned int width, unsigned int factor)
+{
+ if (factor == 1)
+ {
+ return;
+ }
+
+ for (int j = (int)(width-1); j >= 0; j--)
+ {
+ unsigned int iOffset = j * factor;
+ for (unsigned int k = 0; k < factor; k++)
+ {
+ buffer[iOffset + k] = buffer[j];
+ }
+ }
+
+} //PixelMultiply
+
+
+BYTE* Halftoner::NextOutputRaster(COLORTYPE rastercolor)
+{
+ if (rastercolor == COLORTYPE_COLOR)
+ {
+ if (iRastersReady == 0)
+ {
+ return NULL;
+ }
+
+ if (iColor == (ColorPlaneCount+StartPlane))
+ {
+ return NULL;
+ }
+
+ if (iPlane == ColorDepth[iColor])
+ {
+ iPlane = 0;
+ iRow++;
+ return NextOutputRaster(rastercolor);
+ }
+
+ if (iRow == NumRows[iColor])
+ {
+ iRow = 0;
+ iColor++;
+ return NextOutputRaster(rastercolor);
+ }
+
+ iRastersDelivered++;
+ iRastersReady--;
+ return ColorPlane[iColor][iRow][iPlane++];
+ }
+ else
+ {
+ return NULL;
+ }
+} //NextOutputRaster
+
+
+BOOL Halftoner::LastPlane()
+{
+ return ((iColor == (ColorPlaneCount+StartPlane-1)) &&
+ (iRow == (unsigned int)(NumRows[iColor] - 1)) &&
+ (iPlane == ColorDepth[iColor]) // was pre-incremented
+ );
+} //LastPlane
+
+
+BOOL Halftoner::FirstPlane()
+{
+ return ((iColor == StartPlane) &&
+ (iRow == 0) &&
+ (iPlane == 1) // was pre-incremented
+ );
+} //FirstPlane
+
+
+unsigned int Halftoner::GetOutputWidth(COLORTYPE rastercolor)
+// return size of data in the plane being delivered (depends on iRastersDelivered)
+// (will be used in connection with compression seedrow)
+{
+ if (rastercolor == COLORTYPE_COLOR)
+ {
+ unsigned int colorplane, tmp;
+ // figure out which colorplane we're on
+ unsigned int rasterd = iRastersDelivered;
+ // we come after increment of iRastersDelivered
+ if (rasterd>0)
+ {
+ rasterd--;
+ }
+
+ tmp = (unsigned int)(NumRows[0]*ColorDepth[0]);
+ if (rasterd < tmp)
+ {
+ colorplane = 0;
+ }
+ // have to count up to possible 6th plane;
+ // but we'll save code by assuming sizes of C,M,Y (Cl,Ml) are all same
+ else
+ {
+ colorplane = 1;
+ }
+
+ int temp = (OutputWidth[colorplane] + 7) / 8;
+ return temp;
+ }
+ else
+ {
+ return 0;
+ }
+} //GetOutputWidth
+
+
+unsigned int Halftoner::GetMaxOutputWidth(COLORTYPE rastercolor)
+// This is needed by Configure, since the output-width for Halftoner is variable
+// depending on the colorplane
+{
+ if (rastercolor == COLORTYPE_COLOR)
+ {
+ unsigned int max=0;
+ for (unsigned int i=StartPlane; i <= EndPlane; i++)
+ {
+ if (OutputWidth[i] > max)
+ {
+ max = OutputWidth[i];
+ }
+ }
+ return (max / 8) + ((max % 8)!=0);
+ }
+ else
+ {
+ return 0;
+ }
+} //GetMaxOutputWidth
+
+
+unsigned int Halftoner::PlaneCount()
+{
+ unsigned int count=0;
+
+ for (int i = 0; i < MAXCOLORPLANES; i++)
+ {
+ count += NumRows[i] * ColorDepth[i];
+ }
+
+ return count;
+} //PlaneCount
+
+
+void Halftoner::CleanOddBits(unsigned int iColor, unsigned int iRow)
+{
+ int index = (OutputWidth[iColor]/8)-1;
+
+ for (int i=0; i < ColorDepth[iColor]; i++)
+ {
+ BYTE lastbyte0 = ColorPlane[iColor][iRow][i][index];
+ lastbyte0 = lastbyte0 >> oddbits;
+ lastbyte0 = lastbyte0 << oddbits;
+ ColorPlane[iColor][iRow][i][index] = lastbyte0;
+ }
+} //CleanOddBits
+
+APDK_END_NAMESPACE
+
diff --git a/prnt/hpijs/halftoner.h b/prnt/hpijs/halftoner.h
new file mode 100644
index 0000000..41acd15
--- /dev/null
+++ b/prnt/hpijs/halftoner.h
@@ -0,0 +1,209 @@
+/*****************************************************************************\
+ halftoner.h : Interface for the Halftoner class
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#ifndef APDK_HALFTONER_H
+#define APDK_HALFTONER_H
+//===========================================================================
+//
+// Filename : Halftoner.h
+//
+// Module : Open Source Imaging
+//
+// Description : This file contains the class declaration for Imaging.
+//
+//===========================================================================
+
+#ifndef HPTYPES_H
+#include "hptypes.h"
+#endif
+
+APDK_BEGIN_NAMESPACE
+
+// used to encourage consistent ordering of color planes
+#define K 0
+#define C 1
+#define M 2
+#define Y 3
+#define Clight 4
+#define Mlight 5
+
+#define RANDSEED 77
+
+////////////////////////////////////////////////////////////////////////////
+// UMPQUA
+//
+// Encapsulation of buffers and data needed by Halftoner color-matching and
+// halftoning code.
+
+class Halftoner : public Processor
+{
+public:
+ Halftoner(SystemServices* pSys,
+ PrintMode* pPM,
+ unsigned int iInputWidth,
+ unsigned int iNumRows[], // for mixed-res cases
+ unsigned int HiResFactor, // when base-res is multiple of 300
+ BOOL matrixbased
+ );
+ virtual ~Halftoner();
+
+ virtual BOOL Process(RASTERDATA* pbyInputKRGBRaster=NULL) = 0;
+ virtual void Flush();
+
+ DRIVER_ERROR constructor_error;
+
+ virtual void Restart(); // set up for new page or blanks
+
+ // items required by Processor
+ unsigned int GetOutputWidth(COLORTYPE rastercolor);
+ unsigned int GetMaxOutputWidth(COLORTYPE rastercolor);
+ BYTE* NextOutputRaster(COLORTYPE rastercolor);
+ BOOL LastPlane();
+ BOOL FirstPlane();
+ unsigned int PlaneSize()
+ { return OutputWidth[iColor] / 8 + (OutputWidth[iColor] % 8); }
+
+ unsigned int ColorPlaneCount;
+ unsigned int InputWidth; // # of pixels input per colorplane
+ unsigned int OutputWidth[MAXCOLORPLANES]; // # of pixels output per colorplane
+ unsigned char ColorDepth[MAXCOLORPLANES];
+ // how many rows needed relative to base resolution -- all 1 unless mixed-res
+ unsigned char NumRows[MAXCOLORPLANES];
+ // color plane data
+ // for current interface, we must maintain mapping of
+ // 0=K, 1=C, 2=M, 3=Y
+ BYTE* ColorPlane[MAXCOLORPLANES][MAXCOLORROWS][MAXCOLORDEPTH];
+
+ unsigned int StartPlane; // since planes are ordered KCMY, if no K, this is 1
+ unsigned int EndPlane; // usually Y, could be Mlight
+ unsigned int ResBoost;
+
+protected:
+
+ SystemServices* pSS; // needed for memory management
+
+ void FreeBuffers();
+
+ HPBool Forward16PixelsNonWhite(HPBytePtr inputPtr)
+ {
+// return ((*(HPUInt32Ptr)(inputPtr) != 0x0) || (*(((HPUInt32Ptr)(inputPtr)) + 1) != 0x0) ||
+// (*(((HPUInt32Ptr)(inputPtr)) + 2) != 0x0) || (*(((HPUInt32Ptr)(inputPtr)) + 3) != 0x0));
+ for (int i=0; i < 16; i++)
+ {
+ if ((*inputPtr++) != 0)
+ {
+ return TRUE;
+ }
+ }
+ return FALSE;
+ }
+
+ HPBool Backward16PixelsNonWhite(HPBytePtr inputPtr)
+ {
+// return ((*(HPUInt32Ptr)(inputPtr) != 0x0) || (*(((HPUInt32Ptr)(inputPtr)) - 1) != 0x0) ||
+// (*(((HPUInt32Ptr)(inputPtr)) - 2) != 0x0) || (*(((HPUInt32Ptr)(inputPtr)) - 3) != 0x0));
+ for (int i=0; i < 16; i++)
+ {
+ if ((*inputPtr--) !=0 )
+ {
+ return TRUE;
+ }
+ }
+ return FALSE;
+ }
+
+
+ short* ErrBuff[6];
+
+ short nNextRaster;
+
+ short fRasterOdd;
+ unsigned char* fBlackFEDResPtr;
+ unsigned char* fColorFEDResPtr;
+
+ unsigned int AdjustedInputWidth; // InputWidth padded to be divisible by 8
+ void PixelMultiply(unsigned char* buffer, unsigned int width, unsigned int factor);
+
+ unsigned int iColor, iRow, iPlane;
+ unsigned int PlaneCount(); // tells how many layers (colors,hifipe,multirow)
+
+ BOOL started;
+
+ BYTE* tempBuffer;
+ BYTE* tempBuffer2;
+ BYTE* originalKData;
+ unsigned int oddbits;
+ void CleanOddBits(unsigned int iColor, unsigned int iRow);
+
+ HPUInt32 hold_random;
+ inline BYTE RandomNumber()
+ {
+ hold_random = (hold_random * 214013) + 2531011;
+ return (BYTE)((hold_random >> 16) & 0xFF);
+ } //RandomNumber
+
+
+ typedef struct THTDitherParms
+ {
+ HPUInt16 fNumPix; // Dirty Pixels to be dithered
+ HPBytePtr fInput; // Pixel array to dither
+ HPBytePtr fOutput1; // Output raster binary & hifipe plane 1
+ HPBytePtr fOutput2; // Output raster hifipe plane 2 (2-bit)
+ HPBytePtr fOutput3; // Output raster hifipe plane 3 (3-bit)
+
+ HPCBytePtr fFEDResPtr; // brkpnt table
+
+ kSpringsErrorTypePtr fErr; // Current error buffer
+ HPInt16 fRasterEvenOrOdd;// Serpentine (Forward/Backward)
+
+ HPBool fSymmetricFlag; // Are we symmetric
+
+ HPBool fHifipe; // Are we doing Hifipe?
+
+ HPUInt16 fMatrixRowSize;
+ HPBytePtr fMatrixV1;
+ HPUInt16 fDitherCellOffset;
+ HPUInt16 fSqueezeOffset;
+
+ HPCInt16Ptr fWeightTablePtr; // Error Diffusion threshold table
+ HPInt16 fOffsetPick; // Random# offset for threshold
+ HPBool fVerticalExpFlag; // Are we vertically expanding
+ } THTDitherParms, ENVPTR(THTDitherParmsPtr);
+
+ BOOL usematrix;
+
+ DRIVER_ERROR HTMATRIXHI_KCMY(THTDitherParmsPtr ditherParmsPtr, HPUInt16 count);
+
+}; //Halftoner
+
+APDK_END_NAMESPACE
+
+#endif //APDK_HALFTONER_H
diff --git a/prnt/hpijs/halftoner_open.cpp b/prnt/hpijs/halftoner_open.cpp
new file mode 100644
index 0000000..23483a6
--- /dev/null
+++ b/prnt/hpijs/halftoner_open.cpp
@@ -0,0 +1,511 @@
+/*****************************************************************************\
+ halftoner_open.cpp : Open Source Imaging Halftoning
+
+ Copyright (c) 1994 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+#include "header.h"
+#include "halftoner.h"
+#include "halftoner_open.h"
+
+APDK_BEGIN_NAMESPACE
+
+extern unsigned char BayerMatrix[];
+
+Halftoner_Open::Halftoner_Open
+(
+ SystemServices* pSys,
+ PrintMode* pPM,
+ unsigned int iInputWidth,
+ unsigned int iNumRows[],
+ unsigned int HiResFactor,
+ BOOL matrixbased
+)
+ : Halftoner(pSys,pPM,iInputWidth,iNumRows,HiResFactor,matrixbased)
+{ }
+
+
+Halftoner_Open::~Halftoner_Open()
+{ }
+
+
+BOOL Halftoner_Open::Process
+(
+ RASTERDATA* pbyInputKRGBRaster
+)
+{
+ unsigned int i;
+ int j, k;
+
+ if ((pbyInputKRGBRaster == NULL) ||
+ (pbyInputKRGBRaster && pbyInputKRGBRaster->rasterdata[COLORTYPE_COLOR]==NULL && pbyInputKRGBRaster->rasterdata[COLORTYPE_BLACK]==NULL))
+ {
+ Restart();
+ return FALSE; // no output
+ }
+ started=TRUE;
+
+ for (i=StartPlane; i < (ColorPlaneCount+StartPlane); i++)
+ {
+ for (j=0; j < NumRows[i]; j++)
+ {
+ for (k=0; k < ColorDepth[i]; k++)
+ {
+ int PlaneSize= (OutputWidth[i] + 7) / 8;
+ memset(ColorPlane[i][j][k], 0, PlaneSize);
+ }
+ }
+ }
+ if (pbyInputKRGBRaster->rasterdata[COLORTYPE_COLOR])
+ {
+ // increment current raster
+ ++nNextRaster;
+ if ( -1 == nNextRaster )
+ nNextRaster = 0;
+
+ fRasterOdd = ( 1 & nNextRaster ) ? 0 : 1;
+
+ BYTE* input;
+ unsigned int numpix;
+
+ for (i=StartPlane; i <= EndPlane; i++)
+ {
+ if (OutputWidth[i] > AdjustedInputWidth)
+ {
+ memset(tempBuffer, 0, OutputWidth[i]); // clear it out because outwidth might be
+ // > factor*inwidth due to roundoff
+ memcpy(tempBuffer,pbyInputKRGBRaster->rasterdata[COLORTYPE_COLOR],InputWidth);
+ int factor = NumRows[i] * ResBoost;
+ PixelMultiply(tempBuffer, InputWidth, factor);
+ input=tempBuffer;
+ numpix = OutputWidth[i];
+ }
+ else
+ {
+ input=pbyInputKRGBRaster->rasterdata[COLORTYPE_COLOR];
+ numpix = AdjustedInputWidth;
+ }
+
+ fDitherParms[i].fNumPix = numpix;
+ fDitherParms[i].fInput = input;
+ fDitherParms[i].fErr = ErrBuff[i];
+ fDitherParms[i].fErr++; // This is for serpentine
+ fDitherParms[i].fSymmetricFlag = HPTRUE; // Symmetric only
+ if (i == K)
+ fDitherParms[i].fFEDResPtr = fBlackFEDResPtr;
+ else
+ fDitherParms[i].fFEDResPtr = fColorFEDResPtr;
+ fDitherParms[i].fRasterEvenOrOdd = fRasterOdd;
+ fDitherParms[i].fHifipe = ColorDepth[i]>1;
+
+ // for matrix //////////////
+ if (usematrix)
+ {
+ fDitherParms[i].fSqueezeOffset=0;
+ fDitherParms[i].fMatrixRowSize = BayerMatrix[1];
+ BYTE colorindex = i + 2;
+ if (i>=Y)
+ colorindex = 4;
+ BYTE ditheroffset = BayerMatrix[colorindex];
+ BYTE matrixrowsize = BayerMatrix[1];
+ fDitherParms[i].fDitherCellOffset = ditheroffset;
+ HPBytePtr matrixptr = (HPBytePtr)(
+ (((ditheroffset + nNextRaster) % matrixrowsize) * matrixrowsize)
+ + 5 + BayerMatrix);
+
+ fDitherParms[i].fMatrixV1 = matrixptr;
+ }
+
+ ////////////////////////////////////
+
+ for (j=0; j < NumRows[i]; j++)
+ {
+ fDitherParms[i].fOutput1 = ColorPlane[i][j][0];
+ fDitherParms[i].fOutput2 = ColorPlane[i][j][1];
+
+ if (usematrix)
+ {
+ memset(fDitherParms[i].fOutput1, 0, OutputWidth[i]/8);
+ if (fDitherParms[i].fOutput2)
+ memset(fDitherParms[i].fOutput2, 0, OutputWidth[i]/8);
+ HTMATRIXHI_KCMY((THTDitherParmsPtr) fDitherParms, i);
+ }
+ else HTEDiffOpen ((THTDitherParmsPtr) fDitherParms, i);
+
+
+ // cleanup bits at end of row due to input-width not being divisible by 8
+ CleanOddBits(i,j);
+ }
+
+ pbyInputKRGBRaster->rasterdata[COLORTYPE_COLOR] += InputWidth;
+
+ }
+ }
+
+ if (pbyInputKRGBRaster->rasterdata[COLORTYPE_BLACK])
+ {
+ int factor = 1;
+ if (OutputWidth[K] > AdjustedInputWidth)
+ {
+ memset(tempBuffer, 0, OutputWidth[K]);
+ memcpy(tempBuffer,pbyInputKRGBRaster->rasterdata[COLORTYPE_BLACK],pbyInputKRGBRaster->rastersize[COLORTYPE_BLACK]);
+
+ factor = NumRows[K] * ResBoost;
+ PixelMultiply(tempBuffer, pbyInputKRGBRaster->rastersize[COLORTYPE_BLACK], factor);
+ }
+
+ // Convert 8bit per pixel data into 1 bit per pixel data
+ memset(originalKData, 0, (pbyInputKRGBRaster->rastersize[COLORTYPE_BLACK] * factor +7)/8);
+ int curBit = 0x80, curByte = 0;
+ for (int i=0; i<pbyInputKRGBRaster->rastersize[COLORTYPE_BLACK] * factor; i++)
+ {
+ if (OutputWidth[K] > AdjustedInputWidth)
+ {
+ if (tempBuffer[i])
+ {
+ originalKData[curByte] |= curBit;
+ }
+ }
+ else
+ {
+ if (pbyInputKRGBRaster->rasterdata[COLORTYPE_BLACK][i])
+ {
+ originalKData[curByte] |= curBit;
+ }
+ }
+ if (curBit == 0x01)
+ {
+ curByte++;
+ curBit = 0x80;
+ }
+ else
+ {
+ curBit = curBit >> 1;
+ }
+ }
+ for (j=0; j < NumRows[K]; j++)
+ {
+ for (k = 0; k < (pbyInputKRGBRaster->rastersize[COLORTYPE_BLACK] * factor +7)/8; k++)
+ if (ColorPlane[K][j][0])
+ ColorPlane[K][j][0][k] |= originalKData[k];
+ if (ColorPlane[K][j][1])
+ ColorPlane[K][j][1][k] |= originalKData[k];
+ }
+ }
+
+ iColor = StartPlane;
+ iRow = iPlane = 0;
+ iRastersReady = PlaneCount();
+ iRastersDelivered = 0;
+ return TRUE; // one raster in, one raster out
+} //Process
+
+
+void Halftoner_Open::HTEDiffOpen
+(
+ THTDitherParmsPtr ditherParmsPtr,
+ HPUInt16 count
+)
+{
+
+
+ ditherParms = ditherParmsPtr+count;
+ errPtr = ditherParms->fErr;
+ numLoop = ditherParms->fNumPix;
+ inputPtr = ditherParms->fInput;
+ fedResTbl = ditherParms->fFEDResPtr;
+ symmetricFlag = ditherParms->fSymmetricFlag;
+ doNext8Pixels = HPTRUE;
+ hifipe = ditherParms->fHifipe;
+ outputPtr1 = ditherParms->fOutput1;
+
+ outputPtr1 = ditherParms->fOutput1;
+
+ if (hifipe)
+ {
+ outputPtr1 = ditherParms->fOutput1;
+ outputPtr2 = ditherParms->fOutput2;
+ outputPtr3 = ditherParms->fOutput3;
+ }
+
+ diffusionErrorPtr = errPtr;
+
+ rasterByte1 = 0;
+ rasterByte2 = 0;
+ rasterByte3 = 0;
+
+ if( ditherParms->fRasterEvenOrOdd == 1 )
+ {
+ tmpShortStore = *diffusionErrorPtr;
+
+ *diffusionErrorPtr = 0;
+
+ for (pixelCount = numLoop + 8; (pixelCount -= 8) > 0; )
+ {
+ if (pixelCount > 16) // if next 16 pixels are white, skip 8
+ {
+ doNext8Pixels = Forward16PixelsNonWhite(inputPtr);
+ }
+ else
+ {
+ doNext8Pixels = HPTRUE;
+ }
+
+ if (doNext8Pixels)
+ {
+ thValue = HPRand();
+ FORWARD_FED( thValue, 0x80 );
+ thValue = HPRand();
+ FORWARD_FED( thValue, 0x40 );
+ thValue = HPRand();
+ FORWARD_FED( thValue, 0x20 );
+ thValue = HPRand();
+ FORWARD_FED( thValue, 0x10 );
+ thValue = HPRand();
+ FORWARD_FED( thValue, 0x08 );
+ thValue = HPRand();
+ FORWARD_FED( thValue, 0x04 );
+ thValue = HPRand();
+ FORWARD_FED( thValue, 0x02 );
+ thValue = HPRand();
+ FORWARD_FED( thValue, 0x01 );
+
+ *outputPtr1++ = rasterByte1;
+ rasterByte1 = 0;
+
+ if (hifipe)
+ {
+ *outputPtr2++ = rasterByte2;
+ rasterByte2 = 0;
+ }
+ }
+ else // Do white space skipping
+ {
+ inputPtr += 8;
+ *outputPtr1++ = 0;
+ if (hifipe)
+ {
+ *outputPtr2++ = 0;
+ }
+ *diffusionErrorPtr++ = 0;
+ *diffusionErrorPtr++ = 0;
+ *diffusionErrorPtr++ = 0;
+ *diffusionErrorPtr++ = 0;
+ *diffusionErrorPtr++ = 0;
+ *diffusionErrorPtr++ = 0;
+ *diffusionErrorPtr++ = 0;
+ *diffusionErrorPtr++ = 0;
+ rasterByte1 = 0;
+ rasterByte2 = 0;
+ tmpShortStore = 0;
+ }
+ } // for pixelCount
+ }
+ else
+ {
+ rasterByte1 = 0;
+ rasterByte2 = 0;
+ inputPtr += ( numLoop-1 );
+ outputPtr1 += ( numLoop/8 - 1 );
+ outputPtr2 += ( numLoop/8 - 1 );
+ diffusionErrorPtr += ( numLoop-1 );
+
+ tmpShortStore = *diffusionErrorPtr;
+
+ *diffusionErrorPtr = 0;
+
+ for (pixelCount = numLoop + 8; (pixelCount -= 8) > 0; )
+ {
+ if (pixelCount > 16) // if next 16 pixels are white, skip 8
+ {
+ doNext8Pixels = Backward16PixelsNonWhite(inputPtr);
+ }
+ else
+ {
+ doNext8Pixels = HPTRUE;
+ }
+
+ if (doNext8Pixels)
+ {
+ thValue = HPRand();
+ BACKWARD_FED( thValue, 0x01 );
+ thValue = HPRand();
+ BACKWARD_FED( thValue, 0x02 );
+ thValue = HPRand();
+ BACKWARD_FED( thValue, 0x04 );
+ thValue = HPRand();
+ BACKWARD_FED( thValue, 0x08 );
+ thValue = HPRand();
+ BACKWARD_FED( thValue, 0x10 );
+ thValue = HPRand();
+ BACKWARD_FED( thValue, 0x20 );
+ thValue = HPRand();
+ BACKWARD_FED( thValue, 0x40 );
+ thValue = HPRand();
+ BACKWARD_FED( thValue, 0x80 );
+
+ *outputPtr1-- = rasterByte1;
+ rasterByte1 = 0;
+
+ if (hifipe)
+ {
+ *outputPtr2-- = rasterByte2;
+ rasterByte2 = 0;
+ }
+ }
+ else // Do white space skipping
+ {
+ inputPtr -= 8;
+ *outputPtr1-- = 0;
+ if (hifipe)
+ {
+ *outputPtr2-- = 0;
+ }
+ *diffusionErrorPtr-- = 0;
+ *diffusionErrorPtr-- = 0;
+ *diffusionErrorPtr-- = 0;
+ *diffusionErrorPtr-- = 0;
+ *diffusionErrorPtr-- = 0;
+ *diffusionErrorPtr-- = 0;
+ *diffusionErrorPtr-- = 0;
+ *diffusionErrorPtr-- = 0;
+ rasterByte1 = 0;
+ rasterByte2 = 0;
+ tmpShortStore = 0;
+ }
+ }
+ }
+} //HTEDiffOpen
+
+//////////////////////////////////////////////////////////
+void Halftoner_Open::FORWARD_FED
+(
+ HPInt16 thresholdValue,
+ unsigned int bitMask
+)
+{
+ tone = (*inputPtr++ );
+ fedResPtr = fedResTbl + (tone << 2);
+ level = *fedResPtr++;
+ if (tone != 0)
+ {
+ tone = ( tmpShortStore + (HPInt16)(*fedResPtr++) );
+ if (tone >= thresholdValue)
+ {
+ tone -= 255;
+ level++;
+ }
+ switch (level)
+ {
+ case 0:
+ break;
+ case 1:
+ rasterByte1 |= bitMask;
+ break;
+ case 2:
+ rasterByte2 |= bitMask;
+ break;
+ case 3:
+ rasterByte2 |= bitMask; rasterByte1 |= bitMask;
+ break;
+ case 4:
+ rasterByte3 |= bitMask;
+ break;
+ case 5:
+ rasterByte3 |= bitMask; rasterByte1 |= bitMask;
+ break;
+ case 6:
+ rasterByte3 |= bitMask; rasterByte2 |= bitMask;
+ break;
+ case 7:
+ rasterByte3 |= bitMask; rasterByte2 |= bitMask; rasterByte1 |= bitMask;
+ break;
+ }
+ }
+ else
+ {
+ tone = tmpShortStore;
+ }
+ *diffusionErrorPtr++ = tone >> 1;
+ tmpShortStore = *diffusionErrorPtr + (tone - (tone >> 1));
+} //FORWARD_FED
+
+
+void Halftoner_Open::BACKWARD_FED
+(
+ HPInt16 thresholdValue,
+ unsigned int bitMask
+)
+{
+ tone = (*inputPtr-- );
+ fedResPtr = fedResTbl + (tone << 2);
+ level = *fedResPtr++;
+ if (tone != 0)
+ {
+ tone = ( tmpShortStore + (HPInt16)(*fedResPtr++) );
+ if (tone >= thresholdValue)
+ {
+ tone -= 255;
+ level++;
+ }
+ switch (level)
+ {
+ case 0:
+ break;
+ case 1:
+ rasterByte1 |= bitMask;
+ break;
+ case 2:
+ rasterByte2 |= bitMask;
+ break;
+ case 3:
+ rasterByte2 |= bitMask; rasterByte1 |= bitMask;
+ break;
+ case 4:
+ rasterByte3 |= bitMask;
+ break;
+ case 5:
+ rasterByte3 |= bitMask; rasterByte1 |= bitMask;
+ break;
+ case 6:
+ rasterByte3 |= bitMask; rasterByte2 |= bitMask;
+ break;
+ case 7:
+ rasterByte3 |= bitMask; rasterByte2 |= bitMask; rasterByte1 |= bitMask;
+ break;
+ }
+ }
+ else
+ {
+ tone = tmpShortStore;
+ }
+ *diffusionErrorPtr-- = tone >> 1;
+ tmpShortStore = *diffusionErrorPtr + (tone - (tone >> 1));
+
+} //BACKWARD_FED
+
+APDK_END_NAMESPACE
diff --git a/prnt/hpijs/halftoner_open.h b/prnt/hpijs/halftoner_open.h
new file mode 100644
index 0000000..70d28ac
--- /dev/null
+++ b/prnt/hpijs/halftoner_open.h
@@ -0,0 +1,102 @@
+/*****************************************************************************\
+ halftoner_open.h : Open Source Imaging Halftoning Interface
+
+ Copyright (c) 1994 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#ifndef HALFTONER_OPEN_H
+#define HALFTONER_OPEN_H
+
+APDK_BEGIN_NAMESPACE
+
+class Halftoner_Open : public Halftoner
+{
+public:
+ Halftoner_Open
+ (
+ SystemServices* pSys,
+ PrintMode* pPM,
+ unsigned int iInputWidth,
+ unsigned int iNumRows[], // for mixed-res cases
+ unsigned int HiResFactor, // when base-res is multiple of 300
+ BOOL matrixbased
+ );
+ virtual ~Halftoner_Open();
+
+ virtual BOOL Process(RASTERDATA* pbyInputKRGBRaster=NULL);
+
+
+protected:
+
+ void Interpolate(const uint32_t *start,const unsigned long i,
+ unsigned char r,unsigned char g,unsigned char b,
+ unsigned char *blackout, unsigned char *cyanout,
+ unsigned char *magentaout, unsigned char *yellowout, HPBool);
+
+
+ HPByte HPRand() // normalize to 5..79
+ { BYTE b=RandomNumber() % 74; b+= 5; return b; }
+
+
+ void HTEDiffOpen (THTDitherParmsPtr ditherParmsPtr,
+ HPUInt16 count);
+
+ THTDitherParms fDitherParms[6];
+
+ THTDitherParmsPtr ditherParms;
+ kSpringsErrorType tone;
+ kSpringsErrorTypePtr diffusionErrorPtr;
+ kSpringsErrorType tmpShortStore;
+ HPUInt8 rasterByte1, rasterByte2, rasterByte3;
+ HPUInt8 level;
+ HPInt16 pixelCount;
+ HPInt16 thValue;
+
+ kSpringsErrorTypePtr errPtr;
+ HPUInt16 numLoop;
+
+ HPBytePtr inputPtr;
+ HPBytePtr outputPtr1, outputPtr2, outputPtr3;
+
+ HPCBytePtr fedResTbl;
+ HPCBytePtr fedResPtr;
+
+ HPBool symmetricFlag;
+
+ HPBool doNext8Pixels;
+
+ HPBool hifipe;
+
+ void BACKWARD_FED( HPInt16 thresholdValue, unsigned int bitMask );
+ void FORWARD_FED( HPInt16 thresholdValue, unsigned int bitMask );
+
+};
+
+APDK_END_NAMESPACE
+
+#endif //HALFTONER_OPEN_H
diff --git a/prnt/hpijs/header.h b/prnt/hpijs/header.h
new file mode 100644
index 0000000..7172831
--- /dev/null
+++ b/prnt/hpijs/header.h
@@ -0,0 +1,50 @@
+/*****************************************************************************\
+ header.h : standard include header
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#ifndef APDK_HEADER_H
+#define APDK_HEADER_H
+
+#include "config.h"
+
+#include "platform.h" // platform-specific file not supplied with APDK; see platform.h.readme
+#include "debug.h"
+
+#include "hpprintapi.h"
+#include "internal.h"
+#include "printer.h"
+#include "font.h"
+#include "filterhpa.h"
+
+#if defined(APDK_CAPTURE) || defined(APDK_REPLAY)
+ #include "harness.h"
+#endif
+
+#endif // HEADER_H
diff --git a/prnt/hpijs/header2.cpp b/prnt/hpijs/header2.cpp
new file mode 100644
index 0000000..c14fdd9
--- /dev/null
+++ b/prnt/hpijs/header2.cpp
@@ -0,0 +1,445 @@
+/*****************************************************************************\
+ header.cpp : Implimentation for the Header class
+
+ Copyright (c) 1996 - 2008, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#include "header.h"
+
+APDK_BEGIN_NAMESPACE
+
+extern BYTE EscCopy(BYTE *dest,const char *s,int num, char end);
+extern BYTE EscAmplCopy(BYTE *dest, int num, char end);
+extern PAPER_SIZE MediaSizeToPaper(MediaSize msize);
+extern MediaSize PaperToMediaSize(PAPER_SIZE psize);
+
+
+float frac(float f)
+// Returns fractional part of float
+{ int g=(int)f;
+ float fp= f - (float)g;
+ return fp;
+}
+//////////////////////////////////////////////////////////////////////////////////////
+// Header constructor
+// Each printer model has a routine SelectHeader to call the constructor as needed.
+// The various PCL options we support are collected and initialized here.
+//
+Header::Header(Printer* p,PrintContext* pc)
+ : CAPy(0), thePrinter(p), thePrintContext(pc)
+{
+ thePrintMode = thePrintContext->CurrentMode;
+
+ dyeCount = thePrintMode->dyeCount;
+
+ DBG1("In Header constructor\n");
+ for (int i=0; i<MAXCOLORPLANES; i++)
+ {
+ ResolutionX[i] = thePrintMode->ResolutionX[i];
+ ResolutionY[i] = thePrintMode->ResolutionY[i];
+ }
+
+
+ // Set up internal data members with proper escape sequence data, for easy output later.
+ // Get values from PrintContext
+
+ /*
+ * Malibu platform printers have a defect that prevents these printers from
+ * performing full-bleed and media detect functions correctly. Check for this
+ * case, i.e., full-bleed and media detect flags and explicitly set the
+ * media type and quality as requested by the application.
+ */
+ thePrinter->AdjustModeSettings (thePrintContext->bDoFullBleed,
+ thePrintContext->m_mtReqMediaType,
+ &thePrintContext->CurrentMode->medium,
+ &thePrintContext->CurrentMode->theQuality);
+
+ SetMediaType(thePrintContext->CurrentMode->medium);
+ SetQuality(thePrintContext->CurrentMode->theQuality);
+
+ SetMediaSize( thePrintContext->thePaperSize );
+ SetMediaSource (thePrintContext->GetMediaSource ());
+
+ SetSimpleColor();
+} //Header
+
+Header::~Header ()
+{
+}
+
+
+//////////////////////////////////////////////////////////////////////////
+// routines to set internal data members
+
+void Header::SetMediaType(MediaType mtype)
+// Sets value of mediatype and associated counter mtcount
+{
+ mtcount=EscAmplCopy((BYTE*)mediatype,mtype,'M');
+}
+
+void Header::SetMediaSize(PAPER_SIZE psize)
+// Sets value of PCL::mediasize and associated counter mscount
+{
+ int msizeCode;
+
+ if ((msizeCode = thePrintContext->GetJobAttributes(MEDIASIZE_PCL)) < 0)
+ {
+ msizeCode = PaperToMediaSize(psize);
+ }
+
+ mscount=EscAmplCopy((BYTE*)mediasize,msizeCode,'A');
+}
+
+void Header::SetMediaSource(MediaSource msource)
+// Sets value of PCL::mediasource and associated counter msrccount
+{
+#if defined(DEBUG) && (DBG_MASK & DBG_LVL1)
+ DBG1("Setting MediaSource to ");
+ switch(msource)
+ {
+ case sourceTray1: DBG1("Tray1\n"); break;
+ case sourceTray2: DBG1("Tray2\n"); break;
+ case sourceManual: DBG1("Manual\n"); break;
+ case sourceManualEnv: DBG1("ManualEnv\n"); break;
+ case sourceTrayAuto: DBG1("AutoTray\n"); break;
+ case sourceDuplexerNHagakiFeed: DBG1("HagakiTray\n"); break;
+ case sourceBanner: DBG1("Bannerpaper\n"); break;
+ case sourceTrayCDDVD: DBG1("CD/DVD Tray\n"); break;
+ default: DBG1("<out of range, using> Tray1\n"); break;
+ }
+#endif
+
+ ASSERT( (msource==sourceTray1) || (msource==sourceManual) ||
+ (msource==sourceTray2) || (msource==sourceDuplexerNHagakiFeed) ||
+ (msource==sourceManualEnv) || (msource==sourceTrayAuto) ||
+ (msource == sourceOptionalEnv) || (msource == sourceBanner) ||
+ (msource == sourceTrayCDDVD));
+
+ if( (msource!=sourceTray1) && (msource!=sourceManual) &&
+ (msource!=sourceTray2) && (msource!=sourceDuplexerNHagakiFeed) &&
+ (msource!=sourceManualEnv) && (msource!=sourceTrayAuto) &&
+ (msource != sourceOptionalEnv) && (msource != sourceBanner) &&
+ (msource != sourceTrayCDDVD))
+ msource=sourceTray1;
+
+ if (thePrinter != NULL)
+ {
+ if (msource==sourceDuplexerNHagakiFeed && !thePrinter->HagakiFeedPresent(TRUE))
+ {
+ msource=sourceTray1;
+ }
+ }
+ msrccount=EscAmplCopy((BYTE*)mediasource,msource,'H');
+}
+
+void Header::SetQuality(Quality qual)
+// Sets value of PCL::quality and associated counter qualcount
+{
+#if defined(DEBUG) && (DBG_MASK & DBG_LVL1)
+ DBG1("Setting Quality to ");
+ switch(qual)
+ {
+ case qualityPresentation: DBG1("Presentation\n"); break;
+ case qualityNormal: DBG1("Normal\n"); break;
+ case qualityDraft: DBG1("Draft\n"); break;
+ case qualityFastDraft: DBG1 ("FastDraft\n"); break;
+ default: DBG1("<out of range, using> Normal\n"); break;
+ }
+#endif
+ ASSERT (qual >= qualityAuto || qual <= qualityFastNormal);
+
+ if (qual < qualityAuto || qual > qualityFastNormal)
+ qual = qualityNormal;
+
+ qualcount = EscCopy ((BYTE *) quality,"*o",qual,'M');
+}
+
+BYTE Header::QualityCode()
+{ return quality[3]; }
+
+void Header::SetSimpleColor()
+// Sets value of SimpleColor and associated counter sccount
+// Only applicable to one-pen products.
+// SimpleColor command tells printer how many color planes; alternative to
+// configure raster data in 6xx.
+{
+ DBG1("Setting SimpleColor mode\n");
+ int planes= 0 - dyeCount;
+ sccount=EscCopy((BYTE*)SimpleColor,"*r",planes,'U');
+}
+
+
+DRIVER_ERROR Header::StartSend()
+// common items gathered for code savings
+{
+ DRIVER_ERROR err;
+/*
+ * OfficeJet 600 series printers do not like Reset ahead of UEL.
+ err = thePrinter->Send((const BYTE*)Reset,sizeof(Reset));
+ ERRCHECK;
+*/
+
+ err = thePrinter->Send((const BYTE*)UEL,sizeof(UEL));
+ ERRCHECK;
+
+ err = thePrinter->Send((const BYTE*)EnterLanguage,sizeof(EnterLanguage));
+ ERRCHECK;
+
+ err = thePrinter->Send((const BYTE*)PCL3,sizeof(PCL3));
+ ERRCHECK;
+
+ err = thePrinter->Send((const BYTE*)Reset,sizeof(Reset));
+ ERRCHECK;
+
+ err = thePrinter->Send((const BYTE*)&LF,1);
+ ERRCHECK;
+
+ err=Modes(); // Set media source, type, size and quality modes.
+ ERRCHECK;
+
+ err=Margins(); // set margins
+
+ return err;
+}
+
+///////////////////////////////////////////////////////////////////////////
+DRIVER_ERROR Header::ConfigureRasterData()
+// This is the more sophisticated way of setting color and resolution info.
+//
+// NOTE: Will need to be overridden for DJ5xx.
+{
+
+#define CRDSIZE 41 // 5 + 6 (max#dyes) * 6
+char buff[CRDSIZE];
+char *out=buff;
+
+
+ // begin the CRD command
+ memcpy(out,crdStart,sizeof(crdStart) );
+ out += sizeof(crdStart);
+
+ // now set up the "#W" part, where #= number of data bytes in the command
+ // #= 6 per color (2 each for horiz. res., vert. res., and color levels)
+ // + 2 for format and dye count
+ char sBuffer[3];
+ int num = dyeCount * MAXCOLORPLANES + 2;
+ sprintf( sBuffer, "%d", num );
+ *out++ = sBuffer[0];
+ if (num > 9)
+ *out++ = sBuffer[1];
+ *out++ = 'W';
+
+ *out++ = crdFormat;
+ *out++ = (BYTE)dyeCount;
+
+ int start=K; // most common case
+ if (dyeCount==3) // CMY pen
+ start=C;
+
+ for (unsigned int color = start; color < (start + dyeCount); color++)
+ {
+ *out++ = ResolutionX[color]/256;
+ *out++ = ResolutionX[color]%256;
+ *out++ = ResolutionY[color]/256;
+ *out++ = ResolutionY[color]%256;
+
+ int depth=ColorLevels(color);
+
+ *out++ = depth/256;
+ *out++ = depth%256;
+ }
+ DRIVER_ERROR error= thePrinter->Send((const BYTE*) buff, out-buff);
+ return error;
+}
+
+
+#define unprintable (float).04
+#define granularity 48
+
+DRIVER_ERROR Header::Margins()
+// Some code shared between different header flavors.
+{
+#define MARGINSIZE (5 * 6) // each item can be 6
+BYTE buff[MARGINSIZE];
+BYTE *out=buff;
+// Calculate top margin.
+// This is given in terms of text line spacing, the smallest available
+// granularity of which is 48.
+// There also seems to be a starting unprintable distance, which is
+// .04 for printers checked so far. (Empirical check; 600 manual says zero.)
+// So our formula is: marginvalue = granularity * (startY/verticalres - unprintable)
+
+ float tmInches = thePrintContext->PrintableStartY();
+ float AdjustedStartY = tmInches - unprintable;
+ float fTopMargin = (float)granularity * AdjustedStartY;
+ // now round result up or down
+ int iTopMargin = (int) fTopMargin;
+ if (frac(fTopMargin) > (float).5)
+ iTopMargin++;
+
+
+ out += EscAmplCopy(out,0, 'L'); // turn perforation-skip OFF
+ out += EscAmplCopy(out,granularity,'D'); // set line spacing (for top margin)
+ out += EscAmplCopy(out,iTopMargin,'E'); // set top margin
+ out += EscAmplCopy(out,6,'D'); // reset to default in case of
+ // simple text mode
+
+ // set CAPx -- this must be done prior to grafStart (start of raster graphics)
+ // to fix the graphics margin
+ out += EscCopy(out,"*p", 0, 'X');
+
+ DRIVER_ERROR error= thePrinter->Send((const BYTE*) buff,(out-buff) );
+
+return error;
+}
+
+DRIVER_ERROR Header::Graphics()
+{
+ DRIVER_ERROR error= thePrinter->Send((const BYTE*)grafStart, sizeof(grafStart) );
+ if (error!=NO_ERROR)
+ return error;
+
+ if (thePrintMode->Config.bCompress)
+ {
+ error= thePrinter->Send((const BYTE*)grafMode9, sizeof(grafMode9) );
+ if (error!=NO_ERROR)
+ return error;
+ error= thePrinter->Send((const BYTE*)SeedSame, sizeof(SeedSame) );
+ }
+ else
+ error= thePrinter->Send((const BYTE*)grafMode0, sizeof(grafMode0) );
+
+return error;
+#define GRAPHICSIZE (sizeof(grafStart)+sizeof(grafMode9)+sizeof(SeedSame))
+}
+
+
+DRIVER_ERROR Header::Simple()
+// Items pertaining to "simple color" mode, including resolution and width.
+// (This is an alternative method to the CRD command.)
+// This sequence is used when in text-only mode, so reference no graphics data.
+{
+#define SIMPLESIZE 21 // max 7 for each of 3
+ BYTE buff[SIMPLESIZE];
+ BYTE *out = buff;
+
+ int resolution = thePrintContext->CurrentMode->BaseResX;
+ int gwidth = thePrintContext->PageWidth;
+
+ memcpy(out, SimpleColor, sccount);
+ out += sccount;
+
+ // set resolution
+ out += EscCopy(out,"*t", resolution, 'R');
+
+ // set graphics width
+ out += EscCopy(out,"*r", gwidth, 'S');
+
+
+ DRIVER_ERROR error= thePrinter->Send((const BYTE*) buff,(out-buff) );
+
+return error;
+
+}
+
+DRIVER_ERROR Header::Modes()
+// Set media source, type, size and quality modes.
+{
+#define MODESIZE 6*4
+ BYTE buff[MODESIZE];
+ BYTE *out = buff;
+
+ memcpy(out,mediasource, msrccount );
+ out += msrccount;
+ memcpy(out,mediatype, mtcount );
+ out += mtcount;
+
+/*
+ * Don't know why we don't want to send papersize command for PHOTO_SIZE
+ * AtomAnt needs the papersize set, else it will not print from the top edge
+ * when fullbleed printing is requested
+ * Perhaps, there was a valid reason with 9xx with photo-tray, so we need to
+ * fully test that we did not break anything else.
+ * Raghu - 12/21/01
+ */
+// if (thePrintContext->thePaperSize != PHOTO_SIZE)
+ {
+ memcpy(out,mediasize,mscount );
+ out += mscount;
+ }
+ memcpy(out,quality, qualcount );
+ out += qualcount;
+
+ DRIVER_ERROR error= thePrinter->Send((const BYTE*) buff,(out-buff) );
+
+// Now send media pre-load command
+
+// error = thePrinter->Send ((const BYTE *) "\033&l-2H", 6); // moved pre-load to dj9xxvip, dj8xx, dj850, des 2/4/03
+
+return error;
+}
+////////////////////////////////////////////////////////////////////
+
+
+
+DRIVER_ERROR Header::EndJob()
+{
+ DRIVER_ERROR err = thePrinter->Send((const BYTE*)Reset,sizeof(Reset));
+ ERRCHECK;
+
+ return thePrinter->Send((const BYTE*)UEL,sizeof(UEL));
+}
+
+
+DRIVER_ERROR Header::SendCAPy(unsigned int iAbsY)
+{ int len; BYTE temp[10];
+
+ len = EscCopy (temp,"*p",iAbsY,'Y');
+
+ return thePrinter->Send( temp, len);
+}
+
+unsigned int Header::ColorLevels(unsigned int ColorPlane)
+{
+ // convert from number of bits to levels
+ int bits=thePrintContext->CurrentMode->ColorDepth[ColorPlane];
+ int res=1;
+ for (int i=0; i<bits; i++)
+ res=res*2;
+
+ return res;
+}
+
+DRIVER_ERROR Header::FormFeed()
+{
+ BYTE FF=12;
+ return thePrinter->Send((const BYTE*)&FF,1);
+}
+
+APDK_END_NAMESPACE
+
diff --git a/prnt/hpijs/hpcupsfax.cpp b/prnt/hpijs/hpcupsfax.cpp
new file mode 100644
index 0000000..350418c
--- /dev/null
+++ b/prnt/hpijs/hpcupsfax.cpp
@@ -0,0 +1,779 @@
+/*****************************************************************************\
+ hpcupsfax.cpp : HP CUPS fax filter
+
+ Copyright (c) 2001 - 2010, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ NOT LIMITED TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+#include <sys/stat.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <syslog.h>
+#include <string.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <stdint.h>
+#include <time.h>
+#include <sys/time.h>
+#include <arpa/inet.h>
+#include <math.h>
+#include <cups/cups.h>
+#include <cups/raster.h>
+#include <string>
+#ifdef FALSE
+#undef FALSE
+#endif
+#ifdef TRUE
+#undef TRUE
+#endif
+#include "hpip.h"
+#include "hpcupsfax.h"
+#include "bug.h"
+using namespace std;
+
+int fax_encoding = RASTER_MMR;
+char device_name[16];
+BYTE szFileHeader[68];
+BYTE szPageHeader[64];
+
+uint32_t (*convert_endian_l)(uint32_t);
+uint16_t (*convert_endian_s)(uint16_t);
+
+static int iLogLevel = 1;
+char hpFileName[] = "/tmp/hplipfaxLog_XXXXXX";
+
+#define TIFF_HDR_SIZE 8
+#define LITTLE_ENDIAN_MODE I
+#define BIG_ENDIAN_MODE M
+
+#define DBG(args...) syslog(LOG_INFO, __FILE__ " " STRINGIZE(__LINE__) ": " args)
+
+// GrayLevel = (5/16)R + (9/16)G + (2/16)B
+#define RGB2BW(r, g, b) (BYTE) (((r << 2) + r + (g << 3) + g + (b << 1)) >> 4)
+
+void RGB2Gray (BYTE *pRGBData, int iNumPixels, BYTE *pGData)
+{
+ int i;
+ BYTE *pIn = pRGBData;
+ BYTE *pOut = pGData;
+ for (i = 0; i < iNumPixels; i++, pIn += 3)
+ {
+ *pOut++ = RGB2BW ((unsigned short) *pIn, (unsigned short) pIn[1], (unsigned short) pIn[2]);
+ }
+}
+
+static void GetLogLevel ()
+{
+ FILE *fp;
+ char str[258];
+ char *p;
+ fp = fopen ("/etc/cups/cupsd.conf", "r");
+ if (fp == NULL)
+ return;
+ while (!feof (fp))
+ {
+ if (!fgets (str, 256, fp))
+ {
+ break;
+ }
+ if ((p = strstr (str, "hpLogLevel")))
+ {
+ p += strlen ("hpLogLevel") + 1;
+ iLogLevel = atoi (p);
+ break;
+ }
+ }
+ fclose (fp);
+}
+
+void PrintCupsHeader (cups_page_header2_t m_cupsHeader)
+{
+ if (iLogLevel == 0)
+ {
+ return;
+ }
+ BUG ("DEBUG: HPFAX - startPage...\n");
+ BUG ("DEBUG: HPFAX - MediaClass = \"%s\"\n", m_cupsHeader.MediaClass);
+ BUG ("DEBUG: HPFAX - MediaColor = \"%s\"\n", m_cupsHeader.MediaColor);
+ BUG ("DEBUG: HPFAX - MediaType = \"%s\"\n", m_cupsHeader.MediaType);
+ BUG ("DEBUG: HPFAX - OutputType = \"%s\"\n", m_cupsHeader.OutputType);
+ BUG ("DEBUG: HPFAX - AdvanceDistance = %d\n", m_cupsHeader.AdvanceDistance);
+ BUG ("DEBUG: HPFAX - AdvanceMedia = %d\n", m_cupsHeader.AdvanceMedia);
+ BUG ("DEBUG: HPFAX - Collate = %d\n", m_cupsHeader.Collate);
+ BUG ("DEBUG: HPFAX - CutMedia = %d\n", m_cupsHeader.CutMedia);
+ BUG ("DEBUG: HPFAX - Duplex = %d\n", m_cupsHeader.Duplex);
+ BUG ("DEBUG: HPFAX - HWResolution = [ %d %d ]\n", m_cupsHeader.HWResolution[0], m_cupsHeader.HWResolution[1]);
+ BUG ("DEBUG: HPFAX - ImagingBoundingBox = [ %d %d %d %d ]\n",
+ m_cupsHeader.ImagingBoundingBox[0], m_cupsHeader.ImagingBoundingBox[1],
+ m_cupsHeader.ImagingBoundingBox[2], m_cupsHeader.ImagingBoundingBox[3]);
+ BUG ("DEBUG: HPFAX - InsertSheet = %d\n", m_cupsHeader.InsertSheet);
+ BUG ("DEBUG: HPFAX - Jog = %d\n", m_cupsHeader.Jog);
+ BUG ("DEBUG: HPFAX - LeadingEdge = %d\n", m_cupsHeader.LeadingEdge);
+ BUG ("DEBUG: HPFAX - Margins = [ %d %d ]\n", m_cupsHeader.Margins[0], m_cupsHeader.Margins[1]);
+ BUG ("DEBUG: HPFAX - ManualFeed = %d\n", m_cupsHeader.ManualFeed);
+ BUG ("DEBUG: HPFAX - MediaPosition = %d\n", m_cupsHeader.MediaPosition);
+ BUG ("DEBUG: HPFAX - MediaWeight = %d\n", m_cupsHeader.MediaWeight);
+ BUG ("DEBUG: HPFAX - MirrorPrint = %d\n", m_cupsHeader.MirrorPrint);
+ BUG ("DEBUG: HPFAX - NegativePrint = %d\n", m_cupsHeader.NegativePrint);
+ BUG ("DEBUG: HPFAX - NumCopies = %d\n", m_cupsHeader.NumCopies);
+ BUG ("DEBUG: HPFAX - Orientation = %d\n", m_cupsHeader.Orientation);
+ BUG ("DEBUG: HPFAX - OutputFaceUp = %d\n", m_cupsHeader.OutputFaceUp);
+ BUG ("DEBUG: HPFAX - PageSize = [ %d %d ]\n", m_cupsHeader.PageSize[0], m_cupsHeader.PageSize[1]);
+ BUG ("DEBUG: HPFAX - Separations = %d\n", m_cupsHeader.Separations);
+ BUG ("DEBUG: HPFAX - TraySwitch = %d\n", m_cupsHeader.TraySwitch);
+ BUG ("DEBUG: HPFAX - Tumble = %d\n", m_cupsHeader.Tumble);
+ BUG ("DEBUG: HPFAX - cupsWidth = %d\n", m_cupsHeader.cupsWidth);
+ BUG ("DEBUG: HPFAX - cupsHeight = %d\n", m_cupsHeader.cupsHeight);
+ BUG ("DEBUG: HPFAX - cupsMediaType = %d\n", m_cupsHeader.cupsMediaType);
+ BUG ("DEBUG: HPFAX - cupsRowStep = %d\n", m_cupsHeader.cupsRowStep);
+ BUG ("DEBUG: HPFAX - cupsBitsPerColor = %d\n", m_cupsHeader.cupsBitsPerColor);
+ BUG ("DEBUG: HPFAX - cupsBitsPerPixel = %d\n", m_cupsHeader.cupsBitsPerPixel);
+ BUG ("DEBUG: HPFAX - cupsBytesPerLine = %d\n", m_cupsHeader.cupsBytesPerLine);
+ BUG ("DEBUG: HPFAX - cupsColorOrder = %d\n", m_cupsHeader.cupsColorOrder);
+ BUG ("DEBUG: HPFAX - cupsColorSpace = %d\n", m_cupsHeader.cupsColorSpace);
+ BUG ("DEBUG: HPFAX - cupsCompression = %d\n", m_cupsHeader.cupsCompression);
+ BUG ("DEBUG: HPFAX - cupsPageSizeName = %s\n", m_cupsHeader.cupsPageSizeName);
+}
+
+int GetPageSizeFromString(char *string)
+{
+ int iPageSize = atoi(string);
+ if(iPageSize == 0)
+ {
+ if(strcmp(string,"Letter") ==0){
+ iPageSize = 1;
+ }
+ else if(strcmp(string,"A4") ==0){
+ iPageSize = 2;
+ }
+ else if(strcmp(string,"Legal") ==0){
+ iPageSize = 3;
+ }
+ else{
+ DBG("hpcupsfax: GetPageSizeFromString:Default Page Size is taken,ensure it is ok.\n");
+ iPageSize = 1;
+ }
+ }
+ DBG("hpcupsfax: GetPageSizeFromString: PageSize = %d\n",iPageSize);
+ return iPageSize;
+}
+
+int ProcessRasterData (cups_raster_t *cups_raster, int fdFax)
+{
+ int status = 0;
+ unsigned int i;
+ int widthMMR;
+ int iInputBufSize;
+ BYTE *pThisScanLine;
+ LPBYTE pbOutputBuf = NULL;
+ LPBYTE pInputBuf = NULL;
+ IP_XFORM_SPEC xForm[3];
+ IP_IMAGE_TRAITS traits;
+ IP_HANDLE hJob;
+
+ BYTE *p;
+ cups_page_header2_t cups_header;
+ int iPageNum = 0;
+ int color_mode;
+ char *pDev;
+ unsigned int uiPageNum = 0;
+
+ pDev = getenv ("DEVICE_URI");
+
+ while (cupsRasterReadHeader2 (cups_raster, &cups_header))
+ {
+ iPageNum++;
+ if (iPageNum == 1)
+ {
+ PrintCupsHeader (cups_header);
+ color_mode = (cups_header.cupsRowStep == 0) ? HPLIPFAX_MONO : HPLIPFAX_COLOR;
+ if (color_mode == HPLIPFAX_COLOR)
+ {
+ fax_encoding = RASTER_JPEG;
+ }
+ memset (szFileHeader, 0, sizeof (szFileHeader));
+ memcpy (szFileHeader, "hplip_g3", 8);
+ p = szFileHeader + 8;
+ *p++ = 1; // Version Number
+ HPLIPPUTINT32 (p, 0); p += 4; // Total number of pages in this job
+ HPLIPPUTINT16 (p, cups_header.HWResolution[0]); p += 2;
+ HPLIPPUTINT16 (p, cups_header.HWResolution[1]); p += 2;
+ BUG("ATOI Value = %d",atoi (cups_header.cupsPageSizeName));
+ *p++ = GetPageSizeFromString(cups_header.cupsPageSizeName); // Output paper size
+ *p++ = atoi (cups_header.OutputType); // Output quality
+ *p++ = fax_encoding; // MH, MMR or JPEG
+ p += 4; // Reserved 1
+ p += 4; // Reserved 2
+ write (fdFax, szFileHeader, (p - szFileHeader));
+ }
+
+ widthMMR = (((cups_header.cupsWidth + 7) >> 3)) << 3;
+
+/*
+ * Devices in the HPFax2 category require fixed width of 2528 pixels.
+ * Example: LaserJet 2727 MFP
+ */
+
+ if (strcmp (device_name, "HPFax4") ==0)
+ {
+ widthMMR = 1728;
+ }
+ else if (!strcmp (device_name, "HPFax2"))
+ {
+ widthMMR = 2528;
+ }
+ iInputBufSize = widthMMR * cups_header.cupsHeight;
+
+ pInputBuf = (LPBYTE) malloc (iInputBufSize);
+ if (pInputBuf == NULL)
+ {
+ BUG ("Unable to allocate pInputBuf, size = %d\n", iInputBufSize);
+ goto BUGOUT;
+ }
+ memset (pInputBuf, 0xFF, iInputBufSize);
+
+ pThisScanLine = new BYTE[cups_header.cupsBytesPerLine];
+ if (pThisScanLine == NULL)
+ {
+ BUG ("Unable to allocate pThisScanLine, size = %d\n", cups_header.cupsBytesPerLine);
+ goto BUGOUT;
+ }
+
+ for (i = 0; i < cups_header.cupsHeight; i++)
+ {
+ cupsRasterReadPixels (cups_raster, pThisScanLine, cups_header.cupsBytesPerLine);
+ RGB2Gray (pThisScanLine, cups_header.cupsWidth, pInputBuf + i * widthMMR);
+ }
+
+ WORD wResult;
+ DWORD dwInputAvail;
+ DWORD dwInputUsed;
+ DWORD dwInputNextPos;
+ DWORD dwOutputAvail;
+ DWORD dwOutputUsed;
+ DWORD dwOutputThisPos;
+ pbOutputBuf = (LPBYTE) malloc (iInputBufSize);
+ if (pbOutputBuf == NULL)
+ {
+ BUG ("unable to allocate pbOutputBuf, buffer size = %d\n", iInputBufSize);
+ goto BUGOUT;
+ }
+ memset (pbOutputBuf, 0xFF, iInputBufSize);
+
+ memset (xForm, 0, sizeof (xForm));
+
+ if (color_mode == HPLIPFAX_MONO)
+ {
+ i = 0;
+ xForm[i].eXform = X_GRAY_2_BI;
+
+ // 0 - Error diffusion
+ // >0 - Threshold value
+
+ xForm[i].aXformInfo[IP_GRAY_2_BI_THRESHOLD].dword = 127;
+ i++;
+
+ xForm[i].eXform = X_FAX_ENCODE;
+ if (fax_encoding== RASTER_MMR)
+ {
+ xForm[i].aXformInfo[IP_FAX_FORMAT].dword = IP_FAX_MMR;
+ }
+ else
+ {
+ xForm[i].aXformInfo[IP_FAX_FORMAT].dword = IP_FAX_MH;
+ }
+ /* 0 = EOLs are in data as usual; */
+ /* 1 = no EOLs in data. */
+ xForm[i].aXformInfo[IP_FAX_NO_EOLS].dword = 0;
+ xForm[i].pXform = NULL;
+ xForm[i].pfReadPeek = NULL;
+ xForm[i].pfWritePeek = NULL;
+ i++;
+
+ wResult = ipOpen (i, xForm, 0, &hJob);
+ traits.iComponentsPerPixel = 1;
+ traits.iBitsPerPixel = 8;
+ }
+ else
+ {
+ xForm[0].eXform = X_CNV_COLOR_SPACE;
+ xForm[0].aXformInfo[IP_CNV_COLOR_SPACE_WHICH_CNV].dword = IP_CNV_SRGB_TO_YCC;
+ xForm[1].eXform = X_CNV_COLOR_SPACE;
+ xForm[1].aXformInfo[IP_CNV_COLOR_SPACE_WHICH_CNV].dword = IP_CNV_YCC_TO_CIELAB;
+ xForm[0].eXform = X_JPG_ENCODE;
+ xForm[0].aXformInfo[IP_JPG_ENCODE_FOR_COLOR_FAX].dword = 1;
+ wResult = ipOpen (1, xForm, 0, &hJob);
+ traits.iComponentsPerPixel = 3;
+ traits.iBitsPerPixel = 8;
+ }
+
+ if (wResult != IP_DONE)
+ {
+ BUG ("ipOpen failed: wResult = %x\n", wResult);
+ goto BUGOUT;
+ }
+ traits.iPixelsPerRow = widthMMR;
+ traits.lHorizDPI = cups_header.HWResolution[0];
+ traits.lVertDPI = cups_header.HWResolution[1];
+ traits.lNumRows = cups_header.cupsHeight;
+ traits.iNumPages = 1;
+ traits.iPageNum = 1;
+
+ wResult = ipSetDefaultInputTraits (hJob, &traits);
+ if (wResult != IP_DONE)
+ {
+ BUG ("ipSetDefaultInputTraits failed: wResult = %x\n", wResult);
+ wResult = ipClose (hJob);
+ goto BUGOUT;
+ }
+ dwInputAvail = iInputBufSize;
+ dwOutputAvail = dwInputAvail;
+
+ wResult = ipConvert (hJob, dwInputAvail, pInputBuf, &dwInputUsed,
+ &dwInputNextPos, dwOutputAvail, pbOutputBuf,
+ &dwOutputUsed, &dwOutputThisPos);
+
+ if (wResult == IP_FATAL_ERROR)
+ {
+ BUG ("ipConvert failed, wResult = %d\n", wResult);
+ goto BUGOUT;
+ }
+ if (iLogLevel > 0)
+ {
+ BUG ("dwInputAvail = %d dwInputUsed = %d dwOutputUsed = %d\n",
+ dwInputAvail, dwInputUsed, dwOutputUsed);
+ }
+ wResult = ipClose (hJob);
+ hJob = 0;
+
+ uiPageNum++;
+
+ p = szPageHeader;
+ HPLIPPUTINT32 (p, uiPageNum); p += 4; // Current page number
+ HPLIPPUTINT32 (p, widthMMR); p += 4; // Num of pixels per row
+ HPLIPPUTINT32 (p, cups_header.cupsHeight); p += 4; // Num of rows in this page
+ HPLIPPUTINT32 (p, dwOutputUsed); p += 4; // Size in bytes of encoded data
+ HPLIPPUTINT32 (p, 0); p += 4; // Thumbnail data size
+ HPLIPPUTINT32 (p, 0); p += 4; // Reserved for future use
+ write (fdFax, szPageHeader, (p - szPageHeader));
+ write (fdFax, pbOutputBuf, dwOutputUsed);
+/*
+ * Write the thumbnail data here
+ */
+
+ // Send this to fax handler
+
+ free (pbOutputBuf);
+ free (pInputBuf);
+ free (pThisScanLine);
+ pbOutputBuf = NULL;
+ pInputBuf = NULL;
+ pThisScanLine = NULL;
+
+ } /* end while (1) */
+
+ lseek (fdFax, 9, SEEK_SET);
+ HPLIPPUTINT32 ((szFileHeader + 9), uiPageNum);
+ write (fdFax, szFileHeader + 9, 4);
+
+BUGOUT:
+ if (pbOutputBuf)
+ {
+ free (pbOutputBuf);
+ }
+
+ if (pInputBuf)
+ {
+ free (pInputBuf);
+ }
+
+ return status;
+}
+
+/*
+ * Return Zero if all the below are successful
+ * Reading from stdin into a temp file
+ * Getting the final file with HPLIP file and page headers
+ */
+int ProcessTiffData(int fromFD, int toFD)
+{
+ BYTE *p;
+ int fdTiff;
+ BYTE pTmp[4096];
+ struct timeval tv;
+ fd_set fds;
+ int page_length;
+ unsigned int page_counter;
+ unsigned int current_ifd_start;
+ unsigned int *ifd_offset;
+ unsigned int next_ifd_offset;
+ unsigned short ifd_count;
+ bool big_endian = false;
+ int i, ret, len;
+ BYTE szTiffHeader[TIFF_HDR_SIZE];
+ int bytes_written = 0;
+ int ret_status = 0;
+ int bytes_read = 0;
+ char hpTiffFileName[] = "/tmp/hpliptiffXXXXXX";
+ long input_file_size = 0;
+
+ fdTiff = mkstemp (hpTiffFileName);
+ if (fdTiff < 0)
+ {
+ BUG ("ERROR: Unable to open Fax output file - %s for writing\n", hpTiffFileName);
+ return 1;
+ }
+
+ memset (szFileHeader, 0, sizeof (szFileHeader));
+ memcpy (szFileHeader, "hplip_g3", 8);
+ p = szFileHeader + 8;
+ *p++ = 1; // Version Number
+ HPLIPPUTINT32 (p, 0); p += 4; // Total number of pages in this job
+ HPLIPPUTINT16 (p, 0); p += 2; //HWResolution[0]
+ HPLIPPUTINT16 (p, 0); p += 2; //HWResolution[0]
+ *p++ = atoi ("0"); // Output paper size (cupsPageSizeName)
+ *p++ = atoi ("0"); // Output quality (cups OutputType)
+ *p++ = fax_encoding; // MH, MMR or JPEG, TIFF
+ p += 4; // Reserved 1
+ p += 4; // Reserved 2
+ write (toFD, szFileHeader, (p - szFileHeader));
+
+ FD_ZERO(&fds);
+ FD_SET(fromFD, &fds);
+ tv.tv_sec = 0;
+ tv.tv_usec = 100 * 1000; //100 ms
+ i = 0;
+
+
+ len = read (fromFD, pTmp, 4096);
+ if (len > 0) {
+ DBG("hpcupsfax: read %d bytes from stdin", len);
+ write (fdTiff, pTmp, len);
+ bytes_written += len;
+ } else {
+ DBG("hpcupsfax: No data was available...");
+ }
+
+ while (i++ < 10)
+ {
+ memset (pTmp, 0, 4096);
+ ret = select(fromFD+1, &fds, NULL, NULL, &tv);
+ if (ret < 0) {
+ DBG("hpcupsfax: Timed out, Continue...");
+ continue;
+ }
+
+ if (FD_ISSET(fromFD, &fds)) {
+ DBG("hpcupsfax: Data is available");
+ while(1) {
+ memset (pTmp, 0, 4096);
+ len = read (fromFD, pTmp, 4096);
+ DBG("hpcupsfax: read %d bytes from stdin", len);
+ if (len <= 0) {
+ DBG("hpcupsfax: No data was available, Continue...");
+ break; //break from inner while()
+ }
+ write (fdTiff, pTmp, len);
+ bytes_written += len;
+ }
+ }
+ }
+ DBG("hpcupsfax: total bytes written to fdTiff is %d ", bytes_written);
+ input_file_size = bytes_written;
+
+ ret = lseek (fdTiff, 0, SEEK_SET);
+ memset (szTiffHeader, 0, sizeof (TIFF_HDR_SIZE));
+ ret = read (fdTiff, szTiffHeader, 8);
+ DBG("hpcupsfax: read %d bytes from fdTiff", ret);
+ ifd_offset = (unsigned int *) &(szTiffHeader[4]);
+ if (szTiffHeader[0] == 'M') {
+ DBG("hpcupsfax: it is big endian");
+ big_endian = true;
+ *ifd_offset = ntohl(*ifd_offset);
+ }
+ DBG("hpcupsfax: ifd_offset is %d", *ifd_offset);
+
+ current_ifd_start = 0;
+ page_counter = 0;
+ bytes_written = 0;
+//WHILE
+ while(1) {
+ // Note down the number of tags
+ ret = lseek (fdTiff, *ifd_offset, SEEK_SET);
+ ret = read (fdTiff, &ifd_count, 2);
+ if (big_endian) {
+ ifd_count = ntohs(ifd_count);
+ }
+ DBG("hpcupsfax: read %d bytes from fdTiff; ifd count is %d", ret, ifd_count);
+
+ // Read the end of IFD to check if there is another IFD following (for e.g., next page or image)
+ ret = lseek (fdTiff, (*ifd_offset+2+((ifd_count)*12)), SEEK_SET);
+ ret = read (fdTiff, &next_ifd_offset, 4);
+ if (big_endian) {
+ next_ifd_offset = ntohs(next_ifd_offset);
+ }
+ DBG("hpcupsfax: read %d bytes from fdTiff at %d; next ifd offset is %d",
+ ret, (*ifd_offset+2+((ifd_count)*12)), next_ifd_offset);
+
+ // Increment the page counter
+ page_counter = page_counter + 1;
+ DBG("hpcupsfax: Current page_counter is %d", page_counter);
+
+ // Write Tiff data for the current page (IFD)
+ page_length = next_ifd_offset-current_ifd_start;
+ DBG("hpcupsfax: page_length is %d ", page_length);
+ if (page_length <= 0) {
+ len = lseek (fdTiff, 0, SEEK_END);
+ page_length = len - current_ifd_start;
+ }
+ DBG("hpcupsfax: current_ifd_start=%d next_ifd_offset=%d total bytes are %d", current_ifd_start, next_ifd_offset, page_length);
+
+ // Write HPLIP page header
+ p = szPageHeader;
+ HPLIPPUTINT32 (p, page_counter); p += 4; // Current page number
+ HPLIPPUTINT32 (p, 0); p += 4; // Num of pixels per row - It is ImageWidth for Tiff
+ HPLIPPUTINT32 (p, 0); p += 4; // Num of rows in this page - It is ImageLength for Tiff
+ HPLIPPUTINT32 (p, page_length); p += 4; // Size in bytes of encoded data
+ HPLIPPUTINT32 (p, 0); p += 4; // Thumbnail data size
+ HPLIPPUTINT32 (p, 0); p += 4; // Reserved for future use
+ ret = write (toFD, szPageHeader, (p - szPageHeader));
+
+ ret = lseek (fdTiff, current_ifd_start, SEEK_SET);
+ while (page_length > 0) {
+ if (page_length < 4096) {
+ len = page_length;
+ } else {
+ len = 4096;
+ }
+ bytes_read = read (fdTiff, pTmp, len);
+ ret = write (toFD, pTmp, bytes_read);
+ page_length = page_length - ret;
+ bytes_written += ret;
+ }
+
+ // If there is no next IFD, break from the loop. Else, continue...
+ if (bytes_written > input_file_size) {
+ BUG("Error!! Bytes written to toFD is becoming more than input file size.");
+ ret_status = -1;
+ break; // while(1) for page counting
+ }
+
+ if (next_ifd_offset == 0) {
+ break; // while(1) for page counting
+ }
+ current_ifd_start = *ifd_offset = next_ifd_offset;
+ } // while(1) for page counting
+
+ lseek (toFD, 9, SEEK_SET);
+ HPLIPPUTINT32 ((szFileHeader + 9), page_counter);
+ write (toFD, szFileHeader + 9, 4);
+
+ return ret_status;
+}
+
+
+int send_data_to_stdout(int fromFD)
+{
+ int iSize, i;
+ int len;
+ BYTE *pTmp = NULL;
+
+ iSize = lseek (fromFD, 0, SEEK_END);
+ lseek (fromFD, 0, SEEK_SET);
+
+ DBG("hpcupsfax: lseek(fromFD) returned %d", iSize);
+ if (iSize > 0)
+ {
+ pTmp = (BYTE *) malloc (iSize);
+ }
+ if (pTmp == NULL)
+ {
+ iSize = 1024;
+ pTmp = (BYTE *) malloc (iSize);
+ if (pTmp == NULL)
+ {
+ return 1;
+ }
+ }
+
+ while ((len = read (fromFD, pTmp, iSize)) > 0)
+ {
+ write (STDOUT_FILENO, pTmp, len);
+ }
+ free (pTmp);
+
+ return 0;
+}
+
+int main (int argc, char **argv)
+{
+ int status = 0;
+ int fd = 0;
+ int fdFax = -1;
+ int i = 0;
+ FILE *fdTiff;
+ cups_raster_t *cups_raster;
+ ppd_file_t *ppd;
+ ppd_attr_t *attr;
+ ppd_attr_t *compression_attr;
+
+ /*********** PROLOGUE ***********/
+
+ GetLogLevel();
+ openlog("hpcupsfax", LOG_PID, LOG_DAEMON);
+
+ if (argc < 6 || argc > 7)
+ {
+ BUG ("ERROR: %s job-id user title copies options [file]\n", *argv);
+ return 1;
+ }
+
+ if (argc == 7)
+ {
+ if ((fd = open (argv[6], O_RDONLY)) == -1)
+ {
+ BUG ("ERROR: Unable to open raster file %s\n", argv[6]);
+ return 1;
+ }
+ }
+
+ while (argv[i] != NULL) {
+ DBG("hpcupsfax: argv[%d] = %s\n", i, argv[i]);
+ i++;
+ }
+
+ fdFax = mkstemp (hpFileName);
+ if (fdFax < 0)
+ {
+ BUG ("ERROR: Unable to open Fax output file - %s for writing\n", hpFileName);
+ return 1;
+ }
+
+ /*********** MAIN ***********/
+
+ ppd = ppdOpenFile (getenv ("PPD"));
+ if (ppd == NULL)
+ {
+ BUG ("ERROR: Unable to open ppd file %s\n", getenv ("PPD"));
+ return 1;
+ }
+ if ((attr = ppdFindAttr (ppd, "cupsModelName", NULL)) == NULL ||
+ (attr && attr->value == NULL))
+ {
+ ppdClose (ppd);
+ BUG ("ERROR: Required cupsModelName is missing in ppd file\n");
+ return 1;
+ }
+
+ memset (device_name, 0, sizeof (device_name));
+ strncpy (device_name, attr->value, 15);
+
+ if ((attr = ppdFindAttr (ppd, "DefaultEncoding", NULL)) == NULL ||
+ (attr && attr->value == NULL))
+ {
+ ppdClose (ppd);
+ BUG ("ERROR: Required DefaultEncoding is missing in ppd file\n");
+ return 1;
+ }
+ if (strstr(argv[5],"Encoding=MMR"))
+ {
+ fax_encoding = RASTER_MMR;
+ }
+ else if(strstr(argv[5],"Encoding=MH"))
+ {
+ fax_encoding = RASTER_MH;
+ }
+ else if (strstr(argv[5],"Encoding=Auto"))
+ {
+ BUG ("WARNING: AUTO is selected for Fax Encoding! Ensure this type is correct for the device");
+ fax_encoding = RASTER_AUTO;
+ }
+ else if (strstr(argv[5],"Encoding=TIFF"))
+ {
+ fax_encoding = RASTER_TIFF;
+ }
+ else
+ {
+ if(strcmp(attr->value,"MH") == 0) {
+ fax_encoding = RASTER_MH;
+ } else if(strcmp(attr->value,"MMR") == 0){
+ fax_encoding = RASTER_MMR;
+ }else if(strcmp(attr->value,"TIFF") ==0){
+ fax_encoding = RASTER_TIFF;
+ }else if(strcmp(attr->value,"Auto") ==0){
+ BUG ("WARNING: AUTO is selected for Fax Encoding! Ensure this type is correct for the device");
+ fax_encoding = RASTER_AUTO;
+ }
+ }
+ if (fax_encoding < 0) {
+ BUG ("ERROR: Required DefaultEncoding is invalid in ppd file\n");
+ return 1;
+ }
+ DBG("hpcupsfax: main: fax_encoding = %d \n", fax_encoding);
+ ppdClose (ppd);
+
+ if (fax_encoding == RASTER_TIFF)
+ {
+ status = ProcessTiffData(fd, fdFax);
+ } else {
+ cups_raster = cupsRasterOpen (fd, CUPS_RASTER_READ);
+ if (cups_raster == NULL)
+ {
+ status = 1;
+ BUG ("cupsRasterOpen failed, fd = %d\n", fd);
+ goto EPILOGUE;
+ }
+
+ status = ProcessRasterData (cups_raster, fdFax);
+
+ cupsRasterClose (cups_raster);
+ }
+
+ DBG("hpcupsfax: Send data to stdout \n");
+ status = send_data_to_stdout(fdFax);
+
+ /*********** EPILOGUE ***********/
+EPILOGUE:
+ if (fd != 0)
+ {
+ close (fd);
+ }
+
+ if (fdFax > 0)
+ {
+ close (fdFax);
+ if (!(iLogLevel & SAVE_PCL_FILE))
+ {
+ //Retain the intermediate file only if it is needed for debugging purpose.
+ unlink(hpFileName);
+ }
+ }
+
+ return status;
+}
+
diff --git a/prnt/hpijs/hpcupsfax.h b/prnt/hpijs/hpcupsfax.h
new file mode 100644
index 0000000..8c9eb78
--- /dev/null
+++ b/prnt/hpijs/hpcupsfax.h
@@ -0,0 +1,66 @@
+/*****************************************************************************\
+ hpcupsfax.h : HP Cups Fax Filter
+
+ Copyright (c) 2001 - 2002, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ NOT LIMITED TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+#ifndef HPCUPSFAX_H
+#define HPCUPSFAX_H
+
+/*
+ * Raster data encoding methods
+ */
+
+#define RASTER_BITMAP 0
+#define RASTER_GRAYMAP 1
+#define RASTER_MH 2
+#define RASTER_MR 3
+#define RASTER_MMR 4
+#define RASTER_RGB 5
+#define RASTER_YCC411 6
+#define RASTER_JPEG 7
+#define RASTER_PCL 8
+#define RASTER_NOT 9
+#define RASTER_TIFF 10
+#define RASTER_AUTO 99
+
+#define HPLIPFAX_MONO 1
+#define HPLIPFAX_COLOR 2
+
+#define HPLIPPUTINT32(bytearr, val) \
+ bytearr[0] = (val & 0xFF000000) >> 24; \
+ bytearr[1] = (val & 0x00FF0000) >> 16; \
+ bytearr[2] = (val & 0x0000FF00) >> 8; \
+ bytearr[3] = (val & 0x000000FF)
+
+#define HPLIPPUTINT16(bytearr, val) \
+ bytearr[0] = (val & 0x0000FF00) >> 8; \
+ bytearr[1] = (val & 0x000000FF)
+
+#endif /* HPCUPSFAX_H */
+
diff --git a/prnt/hpijs/hpijs.cpp b/prnt/hpijs/hpijs.cpp
new file mode 100644
index 0000000..e3af856
--- /dev/null
+++ b/prnt/hpijs/hpijs.cpp
@@ -0,0 +1,862 @@
+/*****************************************************************************\
+ hpijs.cpp : HP Inkjet Server
+
+ Copyright (c) 2001 - 2008, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ NOT LIMITED TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+#include <sys/stat.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <syslog.h>
+#include <string.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include "header.h"
+#include "ijs.h"
+#include "ijs_server.h"
+#include "hpijs.h"
+#include "services.h"
+
+extern void SendDbusMessage (const char *dev, const char *printer, int code,
+ const char *username, const int jobid, const char *title);
+
+#ifdef HAVE_LIBHPIP
+extern int hpijsFaxServer (int argc, char **argv);
+#endif
+
+#if 0
+int bug(const char *fmt, ...)
+{
+ char buf[256];
+ va_list args;
+ int n;
+
+ va_start(args, fmt);
+
+ if ((n = vsnprintf(buf, 256, fmt, args)) == -1)
+ buf[255] = 0; /* output was truncated */
+
+ fprintf(stderr, buf);
+ syslog(LOG_WARNING, buf);
+
+ fflush(stderr);
+ va_end(args);
+ return n;
+}
+#endif
+
+void setLogLevel(UXServices *pSS)
+{
+ FILE *fp;
+ char str[258];
+ char *p;
+ fp = fopen ("/etc/cups/cupsd.conf", "r");
+ if (fp == NULL)
+ return;
+ while (!feof (fp))
+ {
+ if (!fgets (str, 256, fp))
+ {
+ break;
+ }
+ if ((p = strstr (str, "hpLogLevel")))
+ {
+ p += strlen ("hpLogLevel") + 1;
+ pSS->m_iLogLevel = atoi (p);
+ break;
+ }
+ }
+ fclose (fp);
+
+ if (pSS->m_iLogLevel & SAVE_PCL_FILE)
+ {
+ char szFileName[32];
+ sprintf (szFileName, "/tmp/hpijs_%d.out", getpid());
+ pSS->outfp = fopen (szFileName, "w");
+ if (pSS->outfp)
+ {
+ chmod (szFileName, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
+ }
+ }
+}
+
+/* Set Print Context. */
+int hpijs_set_context(UXServices *pSS)
+{
+ int r;
+
+ if (pSS->PenSet != DUMMY_PEN)
+ {
+ if ((r = pSS->pPC->SetPenSet((PEN_TYPE)pSS->PenSet)) != NO_ERROR)
+ BUG("unable to SetPenSet set=%d, err=%d\n", pSS->PenSet, r);
+ }
+
+ if ((r = pSS->pPC->SelectPrintMode((QUALITY_MODE)pSS->Quality, (MEDIATYPE)pSS->MediaType, (COLORMODE)pSS->ColorMode)) != NO_ERROR)
+ {
+ BOOL bDevText;
+ BUG("unable to set Quality=%d, ColorMode=%d, MediaType=%d, err=%d\n", pSS->Quality, pSS->ColorMode, pSS->MediaType, r);
+ pSS->pPC->GetPrintModeSettings((QUALITY_MODE &)pSS->Quality, (MEDIATYPE &)pSS->MediaType, (COLORMODE &)pSS->ColorMode, bDevText);
+ BUG("following will be used Quality=%d, ColorMode=%d, MediaType=%d\n", pSS->Quality, pSS->ColorMode, pSS->MediaType);
+ }
+
+ /* Map ghostscript paper size to APDK paper size. */
+ pSS->MapPaperSize(pSS->PaperWidth, pSS->PaperHeight);
+
+ /* Do duplex stuff now, since we have a valid print mode. */
+ if (pSS->Duplex && !pSS->Tumble)
+ {
+ if (pSS->pPC->SelectDuplexPrinting(DUPLEXMODE_BOOK) != TRUE)
+ BUG("unable to set duplex mode=book\n");
+ }
+ else if (pSS->Duplex && pSS->Tumble)
+ {
+ if (pSS->pPC->SelectDuplexPrinting(DUPLEXMODE_TABLET) != TRUE)
+ BUG("unable to set duplex mode=tablet\n");
+ }
+ else
+ {
+ pSS->pPC->SelectDuplexPrinting(DUPLEXMODE_NONE);
+ }
+
+ if (pSS->MediaPosition != sourceTrayAuto)
+ {
+ if (pSS->pPC->SetMediaSource((MediaSource)pSS->MediaPosition) != NO_ERROR)
+ BUG("unable to set MediaPosition=%d\n", pSS->MediaPosition);
+ }
+
+ return 0;
+}
+
+int hpijs_status_cb(void *status_cb_data, IjsServerCtx *ctx, IjsJobId job_id)
+{
+ return 0;
+}
+
+int hpijs_list_cb(void *list_cb_data, IjsServerCtx *ctx, IjsJobId job_id,
+ char *val_buf, int val_size)
+{
+ return snprintf(val_buf, val_size, "OutputFD,DeviceManufacturer,DeviceModel,PageImageFormat,Dpi,Width,Height,BitsPerSample,ColorSpace,PaperSize,PrintableArea,PrintableTopLeft,DryTime,PS:Duplex,PS:Tumble,Quality:Quality,Quality:MediaType,Quality:ColorMode,Quality:PenSet,Quality:FullBleed,PS:MediaPosition");
+}
+
+int hpijs_enum_cb(void *enum_cb_data, IjsServerCtx *ctx, IjsJobId job_id,
+ const char *key, char *val_buf, int val_size)
+{
+ UXServices *pSS = (UXServices*)enum_cb_data;
+
+ if (!strcmp (key, "ColorSpace"))
+ {
+ if (pSS->pPC->SupportSeparateBlack())
+ return snprintf(val_buf, val_size, "sRGB,KRGB");
+ else
+ return snprintf(val_buf, val_size, "sRGB");
+ }
+ else if (!strcmp (key, "DeviceManufacturer"))
+ return snprintf(val_buf, val_size, "HEWLETT-PACKARD,APOLLO,HP");
+ else if (!strcmp (key, "PageImageFormat"))
+ return snprintf(val_buf, val_size, "Raster");
+ else if (!strcmp (key, "BitsPerSample"))
+ return snprintf(val_buf, val_size, "8");
+ else if (!strcmp (key, "PS:Duplex"))
+ {
+ if (pSS->pPC->SelectDuplexPrinting(DUPLEXMODE_BOOK) == TRUE)
+ return snprintf(val_buf, val_size, "true");
+ else
+ return snprintf(val_buf, val_size, "false");
+ pSS->pPC->SelectDuplexPrinting(DUPLEXMODE_NONE);
+ }
+ else if (!strcmp (key, "PS:Tumble"))
+ {
+ if (pSS->pPC->SelectDuplexPrinting(DUPLEXMODE_TABLET) == TRUE)
+ return snprintf(val_buf, val_size, "true");
+ else
+ return snprintf(val_buf, val_size, "false");
+ pSS->pPC->SelectDuplexPrinting(DUPLEXMODE_NONE);
+ }
+ else
+ BUG("unable to enum key=%s\n", key);
+ return IJS_ERANGE;
+}
+
+/*
+ * Set parameter (in the server) call back. Note, OutputFD is the only call that can be
+ * preceded by set DeviceManufacturer and DeviceModel.
+ */
+int hpijs_set_cb (void *set_cb_data, IjsServerCtx *ctx, IjsJobId job_id,
+ const char *key, const char *value, int value_size)
+{
+ UXServices *pSS = (UXServices*)set_cb_data;
+ int fd, r;
+ char *tail;
+ int status = 0;
+ char svalue[IJS_MAX_PARAM+1];
+ float w, h, dx, dy;
+ int iVal;
+
+ /* Sanity check input value. */
+ if (value_size > IJS_MAX_PARAM)
+ {
+ memcpy(svalue, value, IJS_MAX_PARAM);
+ svalue[IJS_MAX_PARAM] = 0;
+ }
+ else
+ {
+ memcpy(svalue, value, value_size);
+ svalue[value_size] = 0;
+ }
+
+ if (!strcmp (key, "OutputFD"))
+ {
+ fd = strtol(svalue, &tail, 10);
+ pSS->OutputPath = fd; /* set prn_stream as output of SS::ToDevice */
+ }
+ else if (!strcmp (key, "DeviceManufacturer"))
+ {
+ if ((strncasecmp(svalue, "HEWLETT-PACKARD", 15) != 0) &&
+ (strncasecmp(svalue, "APOLLO", 6) != 0) && (strncasecmp(svalue, "HP", 2) != 0))
+ {
+ BUG("unable to set DeviceManufacturer=%s\n", svalue);
+ status = -1;
+ }
+ }
+ else if (!strcmp (key, "DeviceModel"))
+ {
+ if ((r = pSS->pPC->SelectDevice(svalue)) != NO_ERROR)
+ {
+ if (r == PLUGIN_LIBRARY_MISSING)
+ {
+ // call dbus here
+ const char *user_name = " ";
+ const char *title = " ";
+ const char *device_uri = getenv ("DEVICE_URI");
+ const char *printer = getenv ("PRINTER");
+ int job_id = 0;
+
+ if (device_uri == NULL)
+ device_uri = "";
+ if (printer == NULL)
+ printer = "";
+
+ SendDbusMessage (device_uri, printer,
+ EVENT_PRINT_FAILED_MISSING_PLUGIN,
+ user_name, job_id, title);
+ BUG("unable to set device=%s, err=%d\n", svalue, r);
+ status = -1;
+ }
+ else
+ {
+ /* OfficeJet LX is not very unique, do separate check here. */
+ if (!strncmp(svalue,"OfficeJet", 10))
+ r = pSS->pPC->SelectDevice("DESKJET 540");
+ }
+ }
+
+ if (r == NO_ERROR)
+ {
+ pSS->Model = 1;
+
+ /* Got a valid device class, let's set some print mode defaults. */
+ BOOL bDevText;
+ pSS->pPC->GetPrintModeSettings((QUALITY_MODE &)pSS->Quality, (MEDIATYPE &)pSS->MediaType, (COLORMODE &)pSS->ColorMode, bDevText);
+ }
+ else
+ {
+ BUG("unable to set device=%s, err=%d\n", svalue, r);
+ status = -1;
+ }
+ }
+ else if ((strcmp (key, "PS:Duplex") == 0) || (strcmp (key, "Duplex") == 0))
+ {
+ if (strncmp(svalue, "true", 4) == 0)
+ pSS->Duplex = 1;
+ else
+ pSS->Duplex = 0;
+ }
+ else if ((strcmp (key, "PS:Tumble") == 0) || (strcmp (key, "Tumble") == 0))
+ {
+ if (strncmp(svalue, "true", 4) == 0)
+ pSS->Tumble = 1;
+ else
+ pSS->Tumble = 0;
+ }
+ else if (!strcmp (key, "PaperSize"))
+ {
+ w = (float)strtod(svalue, &tail);
+ h = (float)strtod(tail+1, &tail);
+
+ if (pSS->FirstRaster)
+ {
+ /* Normal start of print Job. */
+ pSS->PaperWidth = w;
+ pSS->PaperHeight = h;
+ hpijs_set_context(pSS);
+ }
+ else
+ {
+
+ dx = w > pSS->PaperWidth ? w - pSS->PaperWidth : pSS->PaperWidth - w;
+ dy = h > pSS->PaperHeight ? h - pSS->PaperHeight : pSS->PaperHeight - h;
+
+ /* Middle of print Job, ignore paper size if same. */
+ if ((dx > 0.25) || (dy > 0.25))
+ {
+ pSS->FirstRaster = 1; /* force new Job */
+ pSS->PaperWidth = w; /* set new paper size */
+ pSS->PaperHeight = h;
+ hpijs_set_context(pSS);
+ }
+ }
+ }
+ else if (!strcmp (key, "TopLeft"))
+ {
+ /* not currently used */
+ }
+ else if (!strcmp (key, "Quality:Quality"))
+ {
+ pSS->Quality = (QUALITY_MODE) strtol(svalue, &tail, 10);
+ }
+ else if (!strcmp (key, "Quality:MediaType"))
+ {
+ pSS->MediaType = (MEDIATYPE) strtol(svalue, &tail, 10);
+ }
+ else if (!strcmp (key, "Quality:ColorMode"))
+ {
+ pSS->ColorMode = (COLORMODE) strtol(svalue, &tail, 10);
+ }
+ else if (!strcmp (key, "Quality:PenSet"))
+ {
+ pSS->PenSet = (PEN_TYPE) strtol(svalue, &tail, 10);
+ }
+ else if (!strcmp (key, "Quality:FullBleed"))
+ {
+ pSS->FullBleed = strtol(svalue, &tail, 10);
+ }
+ else if (!strcmp (key, "PS:MediaPosition"))
+ {
+ pSS->MediaPosition = strtol(svalue, &tail, 10);
+ }
+ else if (!strcmp (key, "DryTime"))
+ {
+ iVal = strtol (svalue, &tail, 10);
+ pSS->pPC->SetPrinterHint (EXTRA_DRYTIME_HINT, iVal);
+ }
+ else if (!strcmp (key, "RedEye"))
+ {
+ iVal = strtol (svalue, &tail, 10);
+ pSS->pPC->SetPrinterHint (RED_EYE_REMOVAL_HINT, iVal);
+ }
+ else if (!strcmp (key, "PhotoFix"))
+ {
+ iVal = strtol (svalue, &tail, 10);
+ pSS->pPC->SetPrinterHint (PHOTO_FIX_HINT, iVal);
+ }
+ else if (!strcmp (key, "MaxJpegFileSize"))
+ {
+ iVal = strtol (svalue, &tail, 10);
+ pSS->pPC->SetPrinterHint (MAX_FILE_SIZE_HINT, iVal);
+ }
+ else if (!strcmp (key, "Quality:SpeedMech") && !pSS->Duplex)
+ {
+ pSS->pPC->SetPrinterHint (PAGES_IN_DOC_HINT, 512);
+ pSS->EnableSpeedMech (TRUE);
+ }
+ else if (!strcmp (key, "Quality:MediaSubtype"))
+ {
+ iVal = strtol (svalue, &tail, 10);
+ pSS->pPC->SetMediaSubtype (iVal);
+ }
+// The next 5 values are passed in as inch * 1000
+ else if (!strcmp (key, "Margin:TopPadding"))
+ {
+ iVal = strtol (svalue, &tail, 10);
+ pSS->pPC->SetMechOffset (iVal);
+ }
+ else if (!strcmp (key, "Overspray:Left"))
+ {
+ iVal = strtol (svalue, &tail, 10);
+ pSS->pPC->SetPrinterHint (LEFT_OVERSPRAY_HINT, iVal);
+ }
+ else if (!strcmp (key, "Overspray:Top"))
+ {
+ iVal = strtol (svalue, &tail, 10);
+ pSS->pPC->SetPrinterHint (TOP_OVERSPRAY_HINT, iVal);
+ }
+ else if (!strcmp (key, "Overspray:Right"))
+ {
+ iVal = strtol (svalue, &tail, 10);
+ pSS->pPC->SetPrinterHint (RIGHT_OVERSPRAY_HINT, iVal);
+ }
+ else if (!strcmp (key, "Overspray:Bottom"))
+ {
+ iVal = strtol (svalue, &tail, 10);
+ pSS->pPC->SetPrinterHint (BOTTOM_OVERSPRAY_HINT, iVal);
+ }
+ else
+ BUG("unable to set key=%s, value=%s\n", key, svalue);
+
+ return status;
+}
+
+/* Get parameter (from the server) call back. Note, all calls must be preceded by set DeviceName. */
+int hpijs_get_cb(void *get_cb_data, IjsServerCtx *ctx, IjsJobId job_id, const char *key, char *value_buf, int value_size)
+{
+ UXServices *pSS = (UXServices*)get_cb_data;
+ float fX;
+ float fY;
+
+ if (!strcmp (key, "PrintableArea"))
+ {
+ fY = pSS->pPC->PrintableHeight ();
+ /* If duplexing, adjust printable height to 1/2 inch top/bottom margins, except laserjets. */
+ if ((pSS->pPC->QueryDuplexMode() != DUPLEXMODE_NONE) && pSS->pPC->RotateImageForBackPage() && (FALSE == pSS->pPC->IsBorderless()))
+ {
+ // User has requested fullbleed printing and printer supports 4-sided fullbleed or
+ // top and bottom margin are equal (0.125"), then
+ // don't need top and bottom margins to be 0.5" each. In other words, if physical page size -
+ // printable height is more than 0.25 inches, adjustment is required for symmetry.
+ // Update - 11/22/05: Not so, the autoduplexer still requires a half inch margin.
+#if 0
+ if ((pSS->pPC->PrintableHeight () + 0.28) < pSS->pPC->PhysicalPageSizeY ())
+ {
+ fY = pSS->pPC->PhysicalPageSizeY () - 1.0;
+ }
+#endif
+ fY = pSS->pPC->PhysicalPageSizeY () - 1.0;
+
+ // SuperB size paper requires larger margins
+ if (pSS->pPC->PhysicalPageSizeY () > 18.0)
+ {
+ fY = 1.5;
+ }
+
+ }
+
+/*
+ * Fullbleed printing is requested and printer supports it, then
+ * return the unadjusted physical width and height.
+ */
+
+ if ((fX = pSS->pPC->PrintableWidth ()) > pSS->PaperWidth)
+ {
+ fX = pSS->PaperWidth;
+ fY = pSS->PaperHeight;
+ }
+
+ return (snprintf (value_buf, value_size, "%.4fx%.4f", fX, fY));
+ }
+ else if (!strcmp (key, "PrintableTopLeft"))
+ {
+ fY = pSS->pPC->PrintableStartY ();
+ /* If duplexing, adjust printable top to 1/2 inch top margin, except laserjets. */
+ if ((pSS->pPC->QueryDuplexMode() != DUPLEXMODE_NONE) && pSS->pPC->RotateImageForBackPage() && (FALSE == pSS->pPC->IsBorderless()))
+ {
+#if 0
+ if ((pSS->pPC->PrintableHeight () + 0.28) < pSS->pPC->PhysicalPageSizeY ())
+ {
+ fY = 0.5;
+ }
+#endif
+ fY = 0.5;
+ // SuperB size paper requires larger margins
+ if (pSS->pPC->PhysicalPageSizeY () > 18.0)
+ {
+ fY = 0.75;
+ }
+
+ }
+
+ return snprintf (value_buf, value_size, "%.4fx%.4f", pSS->pPC->PrintableStartX (), fY);
+ }
+ else if ((!strcmp (key, "Duplex")) || (!strcmp (key, "PS:Duplex")))
+ {
+ if (pSS->pPC->QueryDuplexMode() == DUPLEXMODE_NONE)
+ return snprintf(value_buf, value_size, "false");
+ else
+ return snprintf(value_buf, value_size, "true");
+ }
+ else if ((!strcmp (key, "Tumble")) || (!strcmp (key, "PS:Tumble")))
+ {
+ if (pSS->pPC->QueryDuplexMode() == DUPLEXMODE_TABLET)
+ return snprintf(value_buf, value_size, "true");
+ else
+ return snprintf(value_buf, value_size, "false");
+ }
+ else if (!strcmp (key, "PaperSize"))
+ {
+ return snprintf(value_buf, value_size, "%.4fx%.4f", pSS->pPC->PhysicalPageSizeX(), pSS->pPC->PhysicalPageSizeY());
+ }
+ else if (!strcmp (key, "Dpi"))
+ {
+ return snprintf(value_buf, value_size, "%dx%d", pSS->pPC->EffectiveResolutionX(), pSS->pPC->EffectiveResolutionY());
+ }
+ else if (!strcmp (key, "DeviceModel"))
+ {
+ return snprintf(value_buf, value_size, "%s", pSS->pPC->PrinterModel());
+ }
+ else if (!strcmp (key, "Quality:Quality"))
+ {
+ return snprintf(value_buf, value_size, "%d", pSS->Quality);
+ }
+ else if (!strcmp (key, "Quality:ColorMode"))
+ {
+ return snprintf(value_buf, value_size, "%d", pSS->ColorMode);
+ }
+ else if (!strcmp (key, "Quality:MediaType"))
+ {
+ return snprintf(value_buf, value_size, "%d", pSS->MediaType);
+ }
+ else if (!strcmp (key, "ColorSpace"))
+ {
+ return snprintf(value_buf, value_size, "%s", pSS->ph.cs);
+ }
+ else if (!strcmp (key, "PageImageFormat"))
+ {
+ return snprintf(value_buf, value_size, "Raster");
+ }
+ else if (!strcmp (key, "BitsPerSample"))
+ {
+ return snprintf(value_buf, value_size, "8");
+ }
+ else if (!strcmp (key, "PS:MediaPosition"))
+ {
+ return snprintf(value_buf, value_size, "%d", pSS->MediaPosition);
+ }
+ else
+ BUG("unable to get key=%s\n", key);
+
+ return IJS_EUNKPARAM;
+}
+
+/* Get raster from the client. */
+int hpijs_get_client_raster(IjsServerCtx *ctx, char *buf, int size, char white)
+{
+ int status, clean=1, i;
+
+ status = ijs_server_get_data(ctx, (char *)buf, size);
+
+ if (status < 0)
+ return status; /* error */
+
+ /* Check for blank raster. */
+ for (i = 0; i < size; i++)
+ {
+ if (buf[i] != white)
+ {
+ clean = 0;
+ break;
+ }
+ }
+
+ if (clean)
+ return 0;
+
+ return size;
+}
+
+int main (int argc, char *argv[], char *evenp[])
+{
+ UXServices *pSS = NULL;
+ IjsServerCtx *ctx = NULL;
+ char *raster = NULL, *k_raster = NULL;
+ int status = EXIT_FAILURE;
+ int ret, n, i, kn=0, width, k_width;
+
+ openlog("hpijs", LOG_PID, LOG_DAEMON);
+
+ if (argc > 1)
+ {
+ const char *arg = argv[1];
+ if ((arg[0] == '-') && (arg[1] == 'h'))
+ {
+ fprintf(stdout, "\nHewlett-Packard Co. Inkjet Server %s\n", VERSION);
+ fprintf(stdout, "Copyright (c) 2001-2004, Hewlett-Packard Co.\n");
+ exit(0);
+ }
+ }
+
+#ifdef HAVE_LIBHPIP
+ char *pDev;
+ if ((pDev = getenv ("DEVICE_URI")) &&
+ ((strncmp (pDev, "hpfax:", 6)) == 0))
+ {
+ exit ( hpijsFaxServer (argc, argv));
+ }
+#endif
+
+ ctx = ijs_server_init();
+ if (ctx == NULL)
+ {
+ BUG("unable to init hpijs server\n");
+ goto BUGOUT;
+ }
+
+ pSS = new UXServices();
+ if (pSS->constructor_error != NO_ERROR)
+ {
+ BUG("unable to open Services object err=%d\n", pSS->constructor_error);
+ goto BUGOUT;
+ }
+
+ setLogLevel(pSS);
+
+#ifdef CAPTURE
+ if ((pSS->InitScript("/tmp/capout", TRUE)) != NO_ERROR)
+ BUG("unable to init capture");
+#endif
+
+
+ pSS->pPC = new PrintContext (pSS, 0, 0);
+
+ /* Ignore JOB_CANCELED. This a bi-di hack that allows the job to continue even if bi-di communication failed. */
+ if (pSS->pPC->constructor_error > 0 && pSS->DisplayStatus != DISPLAY_PRINTING_CANCELED)
+ {
+ BUG("unable to open PrintContext object err=%d\n", pSS->pPC->constructor_error);
+ goto BUGOUT;
+ }
+
+/*
+ * Ignore the WARN_MODE_MISMATCH warning. This will happen if we are talking to a monochrome printer.
+ * We will select the correct printmode later.
+ */
+
+ if (pSS->pPC->constructor_error < 0 &&
+ pSS->pPC->constructor_error != WARN_MODE_MISMATCH)
+ {
+ BUG ("WARNING: %s\n", pSS->GetDriverMessage (pSS->pPC->constructor_error));
+ switch (pSS->pPC->constructor_error)
+ {
+ case WARN_LOW_INK_BOTH_PENS:
+ case WARN_LOW_INK_BLACK:
+ case WARN_LOW_INK_COLOR:
+ case WARN_LOW_INK_PHOTO:
+ case WARN_LOW_INK_GREY:
+ case WARN_LOW_INK_BLACK_PHOTO:
+ case WARN_LOW_INK_COLOR_PHOTO:
+ case WARN_LOW_INK_GREY_PHOTO:
+ case WARN_LOW_INK_COLOR_GREY:
+ case WARN_LOW_INK_COLOR_GREY_PHOTO:
+ case WARN_LOW_INK_COLOR_BLACK_PHOTO:
+ case WARN_LOW_INK_CYAN:
+ case WARN_LOW_INK_MAGENTA:
+ case WARN_LOW_INK_YELLOW:
+ case WARN_LOW_INK_MULTIPLE_PENS:
+ {
+ fputs("STATE: +marker-supply-low-warning\n", stderr);
+ break;
+ }
+ default:
+ fputs("STATE: +marker-supply-low-warning\n", stderr);
+ }
+ }
+
+#if 0
+ BUG("device model=%s\n", pSS->pPC->PrinterModel());
+ BUG("device class=%s\n", pSS->pPC->PrintertypeToString(pSS->pPC->SelectedDevice()));
+ BUG("default pen=%d\n", pSS->pPC->GetDefaultPenSet());
+ BUG("installed pen=%d\n", pSS->pPC->GetInstalledPens());
+#endif
+
+ ijs_server_install_status_cb (ctx, hpijs_status_cb, pSS);
+ ijs_server_install_list_cb (ctx, hpijs_list_cb, pSS);
+ ijs_server_install_enum_cb (ctx, hpijs_enum_cb, pSS);
+ ijs_server_install_set_cb (ctx, hpijs_set_cb, pSS);
+ ijs_server_install_get_cb (ctx, hpijs_get_cb, pSS);
+
+ while (1)
+ {
+ if ((ret = ijs_server_get_page_header(ctx, &pSS->ph)) < 0)
+ {
+ BUG("unable to read client data err=%d\n", ret);
+ goto BUGOUT;
+ }
+
+ if (pSS->Model == -1)
+ goto BUGOUT; /* no device selected */
+
+ if (ret)
+ {
+ status = 0; /* normal exit */
+ break;
+ }
+
+ if (pSS->FirstRaster)
+ {
+ char *pEnv = getenv ("COPY_COUNT");
+ if (pEnv)
+ {
+ i = atoi (pEnv);
+ pSS->pPC->SetCopyCount (i);
+ }
+
+ pSS->FirstRaster = 0;
+
+ width = (int)(pSS->ph.xres * pSS->pPC->PrintableWidth() + 0.5);
+
+ /* Desensitize input width, may be off by one due to paper size conversions. */
+ if (pSS->ph.width < width)
+ width = pSS->ph.width;
+
+ if ((ret = pSS->pPC->SetPixelsPerRow(width, width)) != NO_ERROR)
+ {
+ BUG("unable to SetPixelsPerRow width=%d, err=%d\n", pSS->ph.width, ret);
+ }
+
+ /* Turn off any bi-di support. Allow bi-di for printer capabilities only. */
+// pSS->IOMode.bDevID = pSS->IOMode.bStatus = FALSE;
+ pSS->ResetIOMode (FALSE, FALSE);
+
+// Turn off SpeedMech in duplex printing mode
+ if (pSS->Duplex)
+ {
+ pSS->EnableSpeedMech (FALSE);
+ }
+
+ if (pSS->IsSpeedMechEnabled ())
+ {
+ pSS->InitSpeedMechBuffer ();
+ }
+
+ if (pSS->pJob != NULL)
+ delete pSS->pJob;
+ pSS->pJob = new Job(pSS->pPC);
+ if (pSS->pJob->constructor_error != NO_ERROR)
+ {
+ BUG("unable to create Job object err=%d\n", pSS->pJob->constructor_error);
+ goto BUGOUT;
+ }
+
+ if (pSS->pPC->QueryDuplexMode() != DUPLEXMODE_NONE)
+ {
+ if ((pSS->pPC->QueryDuplexMode() == DUPLEXMODE_BOOK) && pSS->pPC->RotateImageForBackPage())
+ pSS->InitDuplexBuffer();
+ pSS->BackPage = FALSE;
+ }
+
+ pSS->KRGB=0;
+ if (strcmp(pSS->ph.cs, "KRGB") == 0)
+ pSS->KRGB=1;
+
+#if 0
+ BUG("papersize=%d\n", pSS->pPC->GetPaperSize());
+ BUG("width=%d, height=%d\n", pSS->ph.width, pSS->ph.height);
+ BUG("EffResX=%d, EffResY=%d, InPixelsPerRow=%d, OutPixelsPerRow=%d\n",
+ pSS->pPC->EffectiveResolutionX(), pSS->pPC->EffectiveResolutionY(),
+ pSS->pPC->InputPixelsPerRow(), pSS->pPC->OutputPixelsPerRow());
+ BUG("device=%s\n", pSS->pPC->PrinterModel());
+#endif
+ } // pSS->FirstRaster
+
+ if ((raster = (char *)malloc(pSS->ph.width*3)) == NULL)
+ {
+ BUG("unable to allocate raster buffer size=%d: %m\n", pSS->ph.width*3);
+ goto BUGOUT;
+ }
+
+ k_width = (pSS->ph.width + 7) >> 3; /* width of k plane in bytes, byte aligned */
+
+ if ((k_raster = (char *)malloc(k_width)) == NULL)
+ {
+ BUG("unable to allocate black raster buffer size=%d: %m\n", k_width);
+ goto BUGOUT;
+ }
+ memset(k_raster, 0, k_width);
+
+ pSS->SendPreviousPage ();
+ for (i=0; i < pSS->ph.height; i++)
+ {
+ if ((n = hpijs_get_client_raster(ctx, raster, pSS->ph.width*3, 0xff)) < 0)
+ break; /* error */
+ if (pSS->KRGB)
+ {
+ if ((kn = hpijs_get_client_raster(ctx, k_raster, k_width, 0)) < 0)
+ break; /* error */
+ }
+ if (n == 0 && kn == 0)
+ pSS->ProcessRaster((char *)0, (char *)0); /* blank raster */
+ else if (kn == 0)
+ pSS->ProcessRaster(raster, (char *)0);
+ else if (n == 0)
+ pSS->ProcessRaster((char *)0, k_raster);
+ else
+ pSS->ProcessRaster(raster, k_raster);
+ }
+
+ free(raster);
+ raster = NULL;
+ free(k_raster);
+ k_raster = NULL;
+
+ if (pSS->pPC->QueryDuplexMode() != DUPLEXMODE_NONE)
+ {
+ if ((pSS->pPC->QueryDuplexMode() == DUPLEXMODE_BOOK) && pSS->pPC->RotateImageForBackPage() && pSS->BackPage)
+ {
+ pSS->SendBackPage();
+ }
+ pSS->BackPage = (BOOL)((int)pSS->BackPage + 1) % 2;
+ }
+
+ pSS->pJob->NewPage();
+
+
+ } /* end while (1) */
+
+ if (pSS->pPC->QueryDuplexMode() != DUPLEXMODE_NONE)
+ {
+ if (pSS->BackPage)
+ {
+ /* Send extra blank line & newpage to eject the page. (for VIP printers). */
+ /* For malibu send enough blank lines to cause at least two blank rasters in Job::sendrasters(). 5/1/03, des */
+ // for (int i = 0; i < 201; i++)
+ for (int i = 0; i < 401; i++)
+ pSS->pJob->SendRasters((unsigned char *)0);
+ pSS->pJob->NewPage();
+ }
+ }
+
+BUGOUT:
+ if (pSS != NULL)
+ {
+ if (pSS->pJob != NULL)
+ delete pSS->pJob;
+ if (pSS->pPC != NULL)
+ delete pSS->pPC;
+#ifdef CAPTURE
+ pSS->EndScript();
+#endif
+ delete pSS;
+ }
+ if (raster != NULL)
+ free(raster);
+ if (k_raster != NULL)
+ free(k_raster);
+ if (ctx != NULL)
+ ijs_server_done(ctx);
+
+ exit(status);
+}
+
diff --git a/prnt/hpijs/hpijs.h b/prnt/hpijs/hpijs.h
new file mode 100644
index 0000000..2f4a9d3
--- /dev/null
+++ b/prnt/hpijs/hpijs.h
@@ -0,0 +1,45 @@
+/*****************************************************************************\
+ hpijs.h : HP Inkjet Server
+
+ Copyright (c) 2001 - 2002, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ NOT LIMITED TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+#ifndef hpijs_INCLUDED
+#define hpijs_INCLUDED
+
+#define IJS_MAX_PARAM 256
+#define EXCEPTION_TIMEOUT 45 /* seconds */
+
+#ifdef HAVE_LIBHPIP
+#include "hpmud.h"
+#include "hpiom.h"
+#endif
+
+#include "bug.h"
+
+#endif /* hpijs_INCLUDED */
diff --git a/prnt/hpijs/hpijsfax.cpp b/prnt/hpijs/hpijsfax.cpp
new file mode 100644
index 0000000..3c5794c
--- /dev/null
+++ b/prnt/hpijs/hpijsfax.cpp
@@ -0,0 +1,607 @@
+/*****************************************************************************\
+ hpijs.cpp : HP Inkjet Server
+
+ Copyright (c) 2001 - 2004, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ NOT LIMITED TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+#ifdef HAVE_LIBHPIP
+
+#include <sys/stat.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <syslog.h>
+#include <string.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <stdint.h>
+#include <time.h>
+#include <sys/time.h>
+#include <math.h>
+#include "ijs.h"
+#include "ijs_server.h"
+#ifdef FALSE
+#undef FALSE
+#endif
+#ifdef TRUE
+#undef TRUE
+#endif
+#include "hpip.h"
+#include "hpijsfax.h"
+
+int hpijsfax_status_cb (void *status_cb_data, IjsServerCtx *ctx, IjsJobId job_id)
+{
+ return 0;
+}
+
+int hpijsfax_list_cb (void *list_cb_data, IjsServerCtx *ctx, IjsJobId job_id,
+ char *val_buf, int val_size)
+{
+ return snprintf (val_buf, val_size, "OutputFD,DeviceManufacturer,DeviceModel,\
+ PageImageFormat,Dpi,Width,Height,BitsPerSample,\
+ ColorSpace,PaperSize,PrintableArea,\
+ PrintableTopLeft");
+}
+
+int hpijsfax_enum_cb (void *enum_cb_data, IjsServerCtx *ctx, IjsJobId job_id,
+ const char *key, char *val_buf, int val_size)
+{
+
+ if (!strcmp (key, "ColorSpace"))
+ {
+ return snprintf(val_buf, val_size, "sRGB");
+// return snprintf(val_buf, val_size, "DeviceGray");
+ }
+ else if (!strcmp (key, "DeviceManufacturer"))
+ {
+ return snprintf(val_buf, val_size, "HEWLETT-PACKARD,HP");
+ }
+ else if (!strcmp (key, "PageImageFormat"))
+ {
+ return snprintf(val_buf, val_size, "Raster");
+ }
+ else if (!strcmp (key, "BitsPerSample"))
+ {
+ return snprintf(val_buf, val_size, "8");
+ }
+// else
+// bug("unable to enum key=%s\n", key);
+ return IJS_ERANGE;
+}
+
+/*
+ * Set parameter (in the server) call back. Note, OutputFD is the only call that can be
+ * preceded by set DeviceManufacturer and DeviceModel.
+ */
+
+int hpijsfax_set_cb (void *set_cb_data, IjsServerCtx *ctx, IjsJobId job_id,
+ const char *key, const char *value, int value_size)
+{
+ HPIJSFax *pFaxStruct = (HPIJSFax*)set_cb_data;
+ int fd;
+ char *tail;
+ int status = 0;
+ char svalue[IJS_MAX_PARAM+1];
+ float w;
+ float h;
+
+ /* Sanity check input value. */
+ if (value_size > IJS_MAX_PARAM)
+ {
+ memcpy(svalue, value, IJS_MAX_PARAM);
+ svalue[IJS_MAX_PARAM] = 0;
+ }
+ else
+ {
+ memcpy(svalue, value, value_size);
+ svalue[value_size] = 0;
+ }
+
+ if (!strcmp (key, "OutputFD"))
+ {
+ fd = strtol (svalue, &tail, 10);
+ pFaxStruct->iOutputPath = fd; /* set prn_stream as output of SS::ToDevice */
+ }
+ else if (!strcmp (key, "DeviceModel"))
+ {
+ pFaxStruct->SetDeviceName (svalue);
+ }
+ else if (!strcmp (key, "PaperSize"))
+ {
+ w = (float) strtod (svalue, &tail);
+ h = (float) strtod (tail+1, &tail);
+ pFaxStruct->SetPaperSize (w, h);
+
+#if 0
+ if (pFaxStruct->IsFirstRaster ())
+ {
+ /* Normal start of print Job. */
+ pFaxStruct->SetPaperSize (w, h);
+ }
+ else
+ {
+ /* Middle of print Job, ignore paper size if same. */
+ if (!(w == pFaxStruct->GetPaperWidth () &&
+ h == pFaxStruct->GetPaperHeight ()))
+ {
+// bug ("w = %f, h = %f, old w = %f, old h = %f\n", w, h,
+// pFaxStruct->GetPaperWidth (), pFaxStruct->GetPaperHeight ());
+ pFaxStruct->SetFirstRaster (1); /* force new Job */
+ pFaxStruct->SetPaperSize (w, h); /* set new paper size */
+// hpijs_set_context (pFaxStruct);
+ }
+ }
+#endif
+ }
+ else if (!strcmp (key, "Quality:Quality"))
+ {
+ pFaxStruct->SetQuality (strtol (svalue, &tail, 10));
+ }
+ else if (!strcmp (key, "Quality:MediaType"))
+ {
+ pFaxStruct->SetMediaType (strtol (svalue, &tail, 10));
+ }
+ else if (!strcmp (key, "Quality:ColorMode"))
+ {
+ pFaxStruct->SetColorMode (strtol (svalue, &tail, 10));
+ }
+ else if (!strcmp (key, "FaxEncoding"))
+ {
+ pFaxStruct->SetFaxEncoding ((int) strtol (svalue, &tail, 10));
+ }
+// else
+// bug("unable to set key = **%s**, value = **%s**\n", key, svalue);
+
+ return status;
+}
+
+/*
+ * Get parameter (from the server) call back. Note, all calls must be preceded by
+ * set DeviceName.
+ */
+
+int hpijsfax_get_cb (void *get_cb_data, IjsServerCtx *ctx, IjsJobId job_id,
+ const char *key, char *value_buf, int value_size)
+{
+ HPIJSFax *pFaxStruct = (HPIJSFax*) get_cb_data;
+
+ if (!strcmp (key, "PrintableArea"))
+ {
+ return snprintf (value_buf, value_size, "%.4fx%.4f",
+ pFaxStruct->PrintableWidth (),
+ pFaxStruct->PrintableHeight ());
+ }
+ else if (!strcmp (key, "DeviceModel"))
+ {
+ return snprintf (value_buf, value_size, "%s", pFaxStruct->GetDeviceName ());
+ }
+ else if (!strcmp (key, "PrintableTopLeft"))
+ {
+ return snprintf (value_buf, value_size, "%.4fx%.4f",
+ pFaxStruct->PrintableStartX (),
+ pFaxStruct->PrintableStartY ());
+ }
+ else if (!strcmp (key, "PaperSize"))
+ {
+ return snprintf (value_buf, value_size, "%.4fx%.4f",
+ pFaxStruct->PhysicalPageSizeX (),
+ pFaxStruct->PhysicalPageSizeY ());
+ }
+ else if (!strcmp (key, "Dpi"))
+ {
+ return snprintf (value_buf, value_size, "%dx%d",
+ pFaxStruct->EffectiveResolutionX (),
+ pFaxStruct->EffectiveResolutionY ());
+ }
+ else if (!strcmp (key, "Quality:Quality"))
+ {
+ return snprintf (value_buf, value_size, "%d", pFaxStruct->GetQuality ());
+ }
+ else if (!strcmp (key, "Quality:ColorMode"))
+ {
+ return snprintf (value_buf, value_size, "%d", pFaxStruct->GetColorMode ());
+ }
+ else if (!strcmp (key, "Quality:MediaType"))
+ {
+ return snprintf (value_buf, value_size, "%d", pFaxStruct->GetMediaType ());
+ }
+ else if (!strcmp (key, "FaxEncoding"))
+ {
+ return snprintf (value_buf, value_size, "%d", pFaxStruct->GetFaxEncoding ());
+ }
+ else if (!strcmp (key, "ColorSpace"))
+ {
+ return snprintf (value_buf, value_size, "%s", pFaxStruct->ph.cs);
+ }
+ else if (!strcmp (key, "PageImageFormat"))
+ {
+ return snprintf (value_buf, value_size, "Raster");
+ }
+ else if (!strcmp (key, "BitsPerSample"))
+ {
+ return snprintf (value_buf, value_size, "8");
+ }
+// else
+// bug ("unable to get key=%s\n", key);
+
+ return IJS_EUNKPARAM;
+}
+
+int hpijsFaxServer (int argc, char **argv)
+{
+ IjsServerCtx *ctx = NULL;
+ HPIJSFax *pFaxStruct = NULL;
+ int status = EXIT_FAILURE;
+ int ret;
+ int n;
+ int i;
+ int width;
+ int widthMMR;
+ int iInputBufSize;
+ LPBYTE pbOutputBuf = NULL;
+ LPBYTE pThisScanLine = NULL;
+ LPBYTE pInputBuf = NULL;
+ IP_XFORM_SPEC xForm[3];
+ IP_IMAGE_TRAITS traits;
+ IP_HANDLE hJob;
+
+ char hpFileName[] = "/tmp/hplipfaxXXXXXX";
+ int fdFax = -1;
+ BYTE szFileHeader[68];
+ BYTE szPageHeader[64];
+ BYTE *p;
+ unsigned int uiPageNum = 0;
+
+ pFaxStruct = new HPIJSFax ();
+
+ if (pFaxStruct == NULL)
+ {
+ BUG ("unable to allocate HPIJSFax\n");
+ exit (0);
+ }
+
+ pFaxStruct->SetFirstRaster (TRUE);
+
+ ctx = ijs_server_init ();
+ if (ctx == NULL)
+ {
+ BUG ("unable to init hpijs server\n");
+ goto BUGOUT;
+ }
+
+ ijs_server_install_status_cb (ctx, hpijsfax_status_cb, pFaxStruct);
+ ijs_server_install_list_cb (ctx, hpijsfax_list_cb, pFaxStruct);
+ ijs_server_install_enum_cb (ctx, hpijsfax_enum_cb, pFaxStruct);
+ ijs_server_install_set_cb (ctx, hpijsfax_set_cb, pFaxStruct);
+ ijs_server_install_get_cb (ctx, hpijsfax_get_cb, pFaxStruct);
+
+ while (1)
+ {
+ if ((ret = ijs_server_get_page_header(ctx, &pFaxStruct->ph)) < 0)
+ {
+ BUG("unable to read client data err=%d\n", ret);
+ goto BUGOUT;
+ }
+
+ if (pFaxStruct->IsFirstRaster ())
+ {
+ pFaxStruct->SetFirstRaster (0);
+ if (fdFax == -1)
+ {
+ fdFax = mkstemp (hpFileName);
+ if (fdFax < 0)
+ {
+ BUG ("Unable to open Fax output file - %s for writing\n", hpFileName);
+ goto BUGOUT;
+ }
+
+ memset (szFileHeader, 0, sizeof (szFileHeader));
+ memcpy (szFileHeader, "hplip_g3", 8);
+ p = szFileHeader + 8;
+// memcpy (szFileHeader, "hplip_g3", 8);
+ *p++ = 1; // Version Number
+ HPLIPPUTINT32 (p, 0); p += 4; // Total number of pages in this job
+ HPLIPPUTINT16 (p, (pFaxStruct->EffectiveResolutionX ())); p += 2;
+ HPLIPPUTINT16 (p, (pFaxStruct->EffectiveResolutionY ())); p += 2;
+ *p++ = pFaxStruct->GetPaperSize (); // Output paper size
+ *p++ = pFaxStruct->GetQuality (); // Output qulity
+ *p++ = pFaxStruct->GetFaxEncoding (); // MH, MMR or JPEG
+ p += 4; // Reserved 1
+ p += 4; // Reserved 2
+ write (fdFax, szFileHeader, (p - szFileHeader));
+ }
+ }
+
+ if (ret)
+ {
+ status = 0; /* normal exit */
+ break;
+ }
+
+ width = (((pFaxStruct->ph.width + 7) >> 3)) << 3;
+ widthMMR = width;
+
+/*
+ * Devices in the HPFax2 category require fixed width of 2528 pixels.
+ * Example: LaserJet 2727 MFP
+ */
+
+ if (!strcmp (pFaxStruct->GetDeviceName (), "HPFax2"))
+ {
+ widthMMR = 2528;
+ }
+
+ if ((pThisScanLine = (LPBYTE) malloc (width * 3)) == NULL)
+ {
+ BUG ("unable to allocate pThisScanLine buffer size = %d: %m\n", width * 3);
+ goto BUGOUT;
+ }
+
+ memset (pThisScanLine, 0xFF, width * 3);
+
+ iInputBufSize = widthMMR * pFaxStruct->ph.height;
+ if (pFaxStruct->GetColorMode () == HPLIPFAX_COLOR)
+ {
+ iInputBufSize *= 3;
+ }
+
+ pInputBuf = (LPBYTE) malloc (iInputBufSize);
+ if (pInputBuf == NULL)
+ {
+ BUG ("Unable to allocate pInputBuf, size = %d\n", iInputBufSize);
+ goto BUGOUT;
+ }
+ memset (pInputBuf, 0xFF, iInputBufSize);
+
+ for (i = 0; i < pFaxStruct->ph.height; i++)
+ {
+ if ((n = ijs_server_get_data (ctx, (char *) pThisScanLine, pFaxStruct->ph.width * 3)) < 0)
+ {
+ BUG ("ijs_server_get_data failed\n");
+ break; /* error */
+ }
+ if (pFaxStruct->GetColorMode () == HPLIPFAX_MONO)
+ {
+ RGB2Gray (pThisScanLine, width, pInputBuf + i * widthMMR);
+ }
+ else
+ {
+ memcpy (pInputBuf + (i * widthMMR * 3), pThisScanLine, n);
+ }
+ }
+ WORD wResult;
+ DWORD dwInputAvail;
+ DWORD dwInputUsed;
+ DWORD dwInputNextPos;
+ DWORD dwOutputAvail;
+ DWORD dwOutputUsed;
+ DWORD dwOutputThisPos;
+ pbOutputBuf = (LPBYTE) malloc (iInputBufSize);
+ if (pbOutputBuf == NULL)
+ {
+ BUG ("unable to allocate pbOutputBuf, buffer size = %d\n", iInputBufSize);
+ goto BUGOUT;
+ }
+ memset (pbOutputBuf, 0xFF, iInputBufSize);
+
+ memset (xForm, 0, sizeof (xForm));
+
+ if (pFaxStruct->GetColorMode () == HPLIPFAX_MONO)
+ {
+ xForm[0].eXform = X_GRAY_2_BI;
+
+ // 0 - Error diffusion
+ // >0 - Threshold value
+
+ xForm[0].aXformInfo[IP_GRAY_2_BI_THRESHOLD].dword = 127;
+
+ xForm[1].eXform = X_FAX_ENCODE;
+ if (pFaxStruct->GetFaxEncoding () == RASTER_MMR)
+ {
+ xForm[1].aXformInfo[IP_FAX_FORMAT].dword = IP_FAX_MMR;
+ }
+ else
+ {
+ xForm[1].aXformInfo[IP_FAX_FORMAT].dword = IP_FAX_MH;
+ }
+ /* 0 = EOLs are in data as usual; */
+ /* 1 = no EOLs in data. */
+ xForm[1].aXformInfo[IP_FAX_NO_EOLS].dword = 0;
+// xForm[1].aXformInfo[IP_FAX_MIN_ROW_LEN].dword = ??
+ xForm[1].pXform = NULL;
+ xForm[1].pfReadPeek = NULL;
+ xForm[1].pfWritePeek = NULL;
+
+ traits.iComponentsPerPixel = 1;
+ wResult = ipOpen (2, xForm, 0, &hJob);
+ }
+ else
+ {
+ xForm[0].eXform = X_CNV_COLOR_SPACE;
+ xForm[0].aXformInfo[IP_CNV_COLOR_SPACE_WHICH_CNV].dword = IP_CNV_SRGB_TO_YCC;
+ xForm[1].eXform = X_CNV_COLOR_SPACE;
+ xForm[1].aXformInfo[IP_CNV_COLOR_SPACE_WHICH_CNV].dword = IP_CNV_YCC_TO_CIELAB;
+ xForm[0].eXform = X_JPG_ENCODE;
+ xForm[0].aXformInfo[IP_JPG_ENCODE_FOR_COLOR_FAX].dword = 1;
+ traits.iComponentsPerPixel = 3;
+ wResult = ipOpen (1, xForm, 0, &hJob);
+ }
+
+ if (wResult != IP_DONE)
+ {
+ BUG ("ipOpen failed: wResult = %x\n", wResult);
+ goto BUGOUT;
+ }
+ traits.iBitsPerPixel = 8;
+ traits.iPixelsPerRow = widthMMR;
+ traits.lHorizDPI = pFaxStruct->EffectiveResolutionX ();
+ traits.lVertDPI = pFaxStruct->EffectiveResolutionY ();
+ traits.lNumRows = pFaxStruct->ph.height;
+ traits.iNumPages = 1;
+ traits.iPageNum = 1;
+
+ wResult = ipSetDefaultInputTraits (hJob, &traits);
+ if (wResult != IP_DONE)
+ {
+ BUG ("ipSetDefaultInputTraits failed: wResult = %x\n", wResult);
+ wResult = ipClose (hJob);
+ goto BUGOUT;
+ }
+ dwInputAvail = iInputBufSize;
+ dwOutputAvail = dwInputAvail;
+
+ wResult = ipConvert (hJob, dwInputAvail, pInputBuf, &dwInputUsed,
+ &dwInputNextPos, dwOutputAvail, pbOutputBuf,
+ &dwOutputUsed, &dwOutputThisPos);
+
+ if (wResult == IP_FATAL_ERROR)
+ {
+ BUG ("ipConvert failed, wResult = %d\n", wResult);
+ goto BUGOUT;
+ }
+#if 0
+ BUG ("dwInputAvail = %d dwInputUsed = %d dwOutputUsed = %d\n",
+ dwInputAvail, dwInputUsed, dwOutputUsed);
+#endif
+ wResult = ipClose (hJob);
+ hJob = 0;
+
+ uiPageNum++;
+
+ p = szPageHeader;
+ HPLIPPUTINT32 (p, uiPageNum); p += 4; // Current page number
+ HPLIPPUTINT32 (p, widthMMR); p += 4; // Num of pixels per row
+ HPLIPPUTINT32 (p, pFaxStruct->ph.height); p += 4; // Num of rows in this page
+ HPLIPPUTINT32 (p, dwOutputUsed); p += 4; // Size in bytes of encoded data
+ HPLIPPUTINT32 (p, 0); p += 4; // Thumbnail data size
+ HPLIPPUTINT32 (p, 0); p += 4; // Reserved for future use
+ write (fdFax, szPageHeader, (p - szPageHeader));
+ write (fdFax, pbOutputBuf, dwOutputUsed);
+/*
+ * Write the thumbnail data here
+ */
+
+ // Send this to fax handler
+
+ free (pThisScanLine);
+ pThisScanLine = NULL;
+ free (pbOutputBuf);
+ free (pInputBuf);
+ pbOutputBuf = NULL;
+ pInputBuf = NULL;
+
+ } /* end while (1) */
+
+ lseek (fdFax, 9, SEEK_SET);
+ HPLIPPUTINT32 ((szFileHeader + 9), uiPageNum);
+ write (fdFax, szFileHeader + 9, 4);
+/*
+ chmod (hpFileName, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
+ hpFileName[strlen (hpFileName)] = '\n';
+ write (pFaxStruct->iOutputPath, hpFileName, strlen (hpFileName));
+ */
+
+ BYTE *pTmp;
+ int iSize;
+ pTmp = NULL;
+
+ iSize = lseek (fdFax, 0, SEEK_END);
+ lseek (fdFax, 0, SEEK_SET);
+
+ if (iSize > 0)
+ pTmp = new BYTE[iSize];
+ if (pTmp == NULL)
+ {
+ iSize = 1024;
+ pTmp = new BYTE[iSize];
+ if (pTmp == NULL)
+ {
+ goto BUGOUT;
+ }
+ }
+ while ((i = read (fdFax, pTmp, iSize)) > 0)
+ {
+ write (pFaxStruct->iOutputPath, pTmp, i);
+ }
+ delete [] pTmp;
+
+BUGOUT:
+ if (fdFax > 0)
+ {
+ close (fdFax);
+ }
+ //unlink (hpFileName);
+ if (pFaxStruct != NULL)
+ {
+ #ifdef CAPTURE
+ pFaxStruct->EndScript ();
+ #endif
+ }
+ if (pThisScanLine != NULL)
+ {
+ free (pThisScanLine);
+ }
+ if (pbOutputBuf)
+ {
+ free (pbOutputBuf);
+ }
+
+ if (pInputBuf)
+ {
+ free (pInputBuf);
+ }
+
+ if (pFaxStruct)
+ {
+ delete pFaxStruct;
+ pFaxStruct = NULL;
+ }
+
+ if (ctx != NULL)
+ {
+ ijs_server_done (ctx);
+ }
+
+ exit(status);
+}
+
+// GrayLevel = (5/16)R + (9/16)G + (2/16)B
+#define RGB2BW(r, g, b) (BYTE) (((r << 2) + r + (g << 3) + g + (b << 1)) >> 4)
+
+void RGB2Gray (BYTE *pRGBData, int iNumPixels, BYTE *pGData)
+{
+ int i;
+ BYTE *pIn = pRGBData;
+ BYTE *pOut = pGData;
+ for (i = 0; i < iNumPixels; i++, pIn += 3)
+ {
+ *pOut++ = RGB2BW ((unsigned short) *pIn, (unsigned short) pIn[1], (unsigned short) pIn[2]);
+ }
+}
+
+#endif // HAVE_LIBHPIP
diff --git a/prnt/hpijs/hpijsfax.h b/prnt/hpijs/hpijsfax.h
new file mode 100644
index 0000000..5f4426e
--- /dev/null
+++ b/prnt/hpijs/hpijsfax.h
@@ -0,0 +1,286 @@
+/*****************************************************************************\
+ hpijsfax.h : HP Inkjet Server
+
+ Copyright (c) 2001 - 2002, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ NOT LIMITED TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+#ifdef HAVE_LIBHPIP
+
+#ifndef HPIJSFAX_H
+#define HPIJSFAX_H
+
+#define IJS_MAX_PARAM 256
+
+#include "bug.h"
+
+/*
+ * Raster data encoding methods
+ */
+
+#define RASTER_BITMAP 0
+#define RASTER_GRAYMAP 1
+#define RASTER_MH 2
+#define RASTER_MR 3
+#define RASTER_MMR 4
+#define RASTER_RGB 5
+#define RASTER_YCC411 6
+#define RASTER_JPEG 7
+#define RASTER_PCL 8
+#define RASTER_NOT 9
+#define RASTER_AUTO 99
+
+#define HPLIPFAX_MONO 1
+#define HPLIPFAX_COLOR 2
+
+#define HPLIPPUTINT32(bytearr, val) \
+ bytearr[0] = (val & 0xFF000000) >> 24; \
+ bytearr[1] = (val & 0x00FF0000) >> 16; \
+ bytearr[2] = (val & 0x0000FF00) >> 8; \
+ bytearr[3] = (val & 0x000000FF)
+
+#define HPLIPPUTINT16(bytearr, val) \
+ bytearr[0] = (val & 0x0000FF00) >> 8; \
+ bytearr[1] = (val & 0x000000FF)
+
+/*
+typedef struct
+{
+ char szHeader[8];
+ uint32_t uiVersion;
+ uint32_t uiNumPages; // >= 1
+ uint32_t uiHorzRes; // 200 or 300
+ uint32_t uiVertRes; // 100, 200 or 300
+ uint32_t uiPageSize; // Letter - 1, A4 - 2, Legal - 3
+ uint32_t uiOutputQuality; // Standard - 1, Fine - 2 or Super Fine - 3
+ uint32_t uiReserved;
+} HPLIPFaxFileHeader;
+
+typedef struct
+{
+ uint32_t uiPageNum;
+ uint32_t uiPixelsPerRow;
+ uint32_t uiNumOfRowsThisPage;
+ uint32_t uiImageSize; // Size of fax data only, in bytes
+ uint32_t uiReserved;
+} HPLIPFaxPageHeader;
+*/
+
+class HPIJSFax
+{
+
+public:
+ HPIJSFax ()
+ {
+ iQuality = 2;
+ iColorMode = 1;
+ iMediaType = 0;
+ iPaperSize = 1;
+ iFirstRaster = 1;
+ iFaxEncoding = RASTER_MH;
+ fPaperWidth = 8.5;
+ fPaperHeight = 11.0;
+ strcpy (m_szDeviceName, "HPFax");
+ }
+ char *GetDeviceName ()
+ {
+ return m_szDeviceName;
+ }
+ void SetDeviceName (char *szDeviceName)
+ {
+ strcpy (m_szDeviceName, szDeviceName);
+ }
+ void SetOutputPath (int fd)
+ {
+ iOutputPath = fd;
+ }
+ void SetPaperSize (float w, float h)
+ {
+ fPaperWidth = w;
+ fPaperHeight = h;
+ if (fabs (8.5 - w) < 0.05 && fabs (11.0 - w) < 0.05)
+ {
+ iPaperSize = 1;
+ }
+ else if (fabs (8.27 - w) < 0.05 && fabs (11.69 - h) < 0.05)
+ {
+ iPaperSize = 2;
+ }
+ else if (fabs (8.5 - w) < 0.05 && fabs (14.0 - h) < 0.05)
+ {
+ iPaperSize = 3;
+ }
+ }
+ void SetPaperWidth (float w)
+ {
+ fPaperWidth = w;
+ }
+ void SetPaperHeight (float h)
+ {
+ fPaperHeight = h;
+ }
+ int GetQuality ()
+ {
+ return iQuality;
+ }
+ void SetQuality (int iQ)
+ {
+ iQuality = iQ;
+ }
+ void SetMediaType (int iM)
+ {
+ iMediaType = iM;
+ }
+ void SetColorMode (int iCm)
+ {
+ iColorMode = iCm; // 1 - Monochrome, 2 - Color
+ if (iCm == HPLIPFAX_COLOR)
+ {
+ iFaxEncoding = RASTER_JPEG;
+ }
+ }
+ void SetFirstRaster (int iFirst)
+ {
+ iFirstRaster = iFirst;
+ }
+ void SetFaxEncoding (int iVal)
+ {
+ iFaxEncoding = iVal;
+ if (iColorMode == HPLIPFAX_COLOR)
+ {
+ iFaxEncoding = RASTER_JPEG;
+ return;
+ }
+ if (iVal == RASTER_AUTO)
+ {
+ char *pDev = getenv ("DEVICE_URI");
+ iFaxEncoding = RASTER_MH;
+ if (pDev == NULL)
+ {
+ return;
+ }
+ if ((strstr (pDev, "Laser") || strstr (pDev, "laser")))
+ {
+ iFaxEncoding = RASTER_MMR;
+ }
+ }
+ }
+
+ int GetFaxEncoding ()
+ {
+ return iFaxEncoding;
+ }
+ int GetColorMode ()
+ {
+ return iColorMode;
+ }
+ int GetMediaType ()
+ {
+ return iMediaType;
+ }
+ int GetPaperSize ()
+ {
+ return iPaperSize;
+ }
+ float GetPaperWidth ()
+ {
+ return fPaperHeight;
+ }
+ float GetPaperHeight ()
+ {
+ return fPaperHeight;
+ }
+ int IsFirstRaster ()
+ {
+ return iFirstRaster;
+ }
+ float PrintableStartX ()
+ {
+ //return (float) 0.25;
+ return (float) 0.125;
+ }
+ float PrintableStartY ()
+ {
+ return (float) 0.125;
+ }
+ float PrintableWidth ()
+ {
+ return fPaperWidth - (2.0 * 0.125);
+ }
+ float PrintableHeight ()
+ {
+ return fPaperHeight - (2.0 * 0.125);
+ }
+ float PhysicalPageSizeX ()
+ {
+ return fPaperWidth;
+ }
+ float PhysicalPageSizeY ()
+ {
+ return fPaperHeight;
+ }
+ int EffectiveResolutionX ()
+ {
+ if (iQuality == 3)
+ {
+ return 300;
+ }
+ return 200;
+ }
+ int EffectiveResolutionY ()
+ {
+ if (iQuality == 2)
+ {
+ return 200;
+ }
+ if (iQuality == 3)
+ {
+ return 300;
+ }
+ return 100;
+ }
+
+ IjsPageHeader ph;
+ int iOutputPath;
+private:
+ int iQuality;
+ int iColorMode;
+ int iMediaType;
+ int iPaperSize;
+ int iFaxEncoding;
+ float fPaperWidth;
+ float fPaperHeight;
+ int iFirstRaster;
+ char m_szDeviceName[64];
+};
+
+void RGB2Gray (BYTE *pRGBData, int iNumPixels, BYTE *pBWData);
+
+#endif /* HPIJSFAX_H */
+
+#endif // HAVE_LIBHPIP
+
diff --git a/prnt/hpijs/hpiom.c b/prnt/hpijs/hpiom.c
new file mode 100644
index 0000000..87b8e02
--- /dev/null
+++ b/prnt/hpijs/hpiom.c
@@ -0,0 +1,533 @@
+/*****************************************************************************\
+
+ hpiom.c - HP I/O message handler
+
+ (c) 2003-2004 Copyright Hewlett-Packard Development Company, LP
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+\*****************************************************************************/
+
+#ifdef HAVE_LIBHPIP
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <netdb.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <string.h>
+#include <unistd.h>
+#include "hpijs.h"
+#include "hpiom.h"
+
+static const int gnMaxDataSize = 2048;
+static const int gnMaxCmdOptionSize = 4;
+
+static const char gcFrameMarker = '$';
+static const int gnPadding = 255;
+static const int gnRequiredSize = 11;
+static const int gnMinCommandSize = 16;
+static const int gnMinDecodeSize = 10; // needed six bytes to determine command number,
+ // command length and data length
+
+static const int gUV8FrameOffset = 0;
+static const int gUV16CommandLengthOffset = 1;
+static const int gUV8UnitNumberOffset = 3;
+static const int gE8PacketTypeOffset = 4;
+static const int gUV8CommandNumberOffset = 5;
+static const int gUV16ReferenceNumberOffset = 6;
+static const int gUV16DataLengthOffset = 8;
+static const int gUV8CommandOptionsOffset = 10;
+
+static const int gUV8RespFrameOffset = 0;
+static const int gUV16RespCommandLengthOffset = 1;
+static const int gUV8RespUnitNumberOffset = 3;
+static const int gE8RespPacketTypeOffset = 4;
+static const int gUV8RespCommandNumberOffset = 5;
+static const int gUV16RespReferenceNumberOffset = 6;
+static const int gUV16RespDataLengthOffset = 8;
+static const int gE8RespCompleteOffset = 10;
+
+// reserved reference number
+//
+static const int gnMinRefNum = 0xF000;
+static const int gnMaxRefNum = 0xFFFD;
+
+unsigned short gwSynchRefNum = 0xFFEC;
+unsigned short gwSynchCompleteRefNum = 0xFFEB;
+unsigned short gwResetRefNum = 0xFFEA;
+
+unsigned short gwPrinterVersionQueryRefNum = 0xFFD0;
+unsigned short gwPrinterStatusQueryRefNum = 0xFFD1;
+unsigned short gwPrinterAttributesQueryRefNum = 0xFFD2;
+unsigned short gwAlignmentQueryRefNum = 0xFFD3;
+unsigned short gwDeviceIdQueryRefNum = 0xFFDD;
+unsigned short gwHueCompensationQueryRefNum = 0xFFDE;
+
+// command options
+//
+// printer query command options
+//
+static const int gnPrinterQueryOptionsSize = 4;
+
+static unsigned char gpPrinterVersionQuery[] = { 0x00, 0x00, 0x00, 0x00 }; // 0 - return UV32 version data
+//static unsigned char gpPrinterStatusQuery[] = { 0x01, 0x00, 0x00, 0x00 }; // 1 - return status string
+//static unsigned char gpPrinterAttributesQuery[] = { 0x02, 0x00, 0x00, 0x00 }; // 2 - return printer attributes
+static unsigned char gpAlignmentQuery[] = { 0x03, 0x00, 0x00, 0x00 }; // 3 - return primitive alignment value
+//static unsigned char gpDeviceIdQuery[] = { 0x0D, 0x00, 0x00, 0x00 }; // 13 - return device id
+//static unsigned char gpHueCompensationQuery[] = { 0x0E, 0x00, 0x00, 0x00 }; // 14 - return hue compensation
+static unsigned char gpPenAlignmentQuery[] = { 0x0F, 0x00, 0x00, 0x00 }; // 15 - return pen alignment value
+
+/*
+ * Lidil commands.
+ */
+
+int EncodeCommand
+(
+ unsigned char *lpBuffer,
+ unsigned short wBufferSize,
+ unsigned char unUnitNumber,
+ int ePacketType,
+ int eCommandNumber,
+ char *lpData,
+ unsigned short wDataLength,
+ unsigned char *lpCommandOptions,
+ unsigned short wCommandOptionsSize,
+ int *dPacketSize,
+ unsigned short wRefNum
+)
+{
+ int x;
+ int lNumPaddingNeeded = 0;
+ unsigned char *lpTemp = NULL;
+
+ memset( lpBuffer, 0, wBufferSize );
+ lpBuffer [ gUV8FrameOffset ] = gcFrameMarker;
+ lpBuffer [ gUV8UnitNumberOffset ] = unUnitNumber;
+ lpBuffer [ gE8PacketTypeOffset ] = ePacketType;
+ lpBuffer [ gUV8CommandNumberOffset ] = eCommandNumber;
+ *(short *)(lpBuffer + gUV16DataLengthOffset) = htons(wDataLength);
+
+ if ( wCommandOptionsSize > 0 )
+ {
+ if ( lpCommandOptions )
+ {
+ // copy command options to the buffer
+ memcpy(( lpBuffer + gUV8CommandOptionsOffset ), lpCommandOptions, wCommandOptionsSize);
+ }
+ else
+ {
+ // command option is null, fill the buffer with zeros
+ memset(( lpBuffer + gUV8CommandOptionsOffset ), 0, wCommandOptionsSize );
+ }
+ }
+
+ // calculate command length and padding if needed
+ *dPacketSize = gnRequiredSize + wCommandOptionsSize;
+ lNumPaddingNeeded = gnMinCommandSize - *dPacketSize;
+
+ if ( lNumPaddingNeeded > 0 )
+ {
+ // move the pointer to the beginning of the padding
+ lpTemp = lpBuffer + gUV8CommandOptionsOffset + wCommandOptionsSize;
+
+ for (x = 0; x < lNumPaddingNeeded; x++, lpTemp++ )
+ {
+ *lpTemp = gnPadding;
+ }
+
+ *dPacketSize = gnMinCommandSize;
+ }
+
+ *(short *)(lpBuffer + gUV16CommandLengthOffset) = htons(*dPacketSize);
+ *(short *)(lpBuffer + gUV16ReferenceNumberOffset) = htons(wRefNum ? wRefNum : 1);
+
+ // add the trailing frame marker
+ lpBuffer[ *dPacketSize - 1 ] = gcFrameMarker;
+
+ if ( wDataLength )
+ {
+ if ((*dPacketSize + wDataLength) > wBufferSize)
+ {
+ BUG("unable to fill data buffer EncodeCommand size=%d\n", wDataLength);
+ return 1;
+ }
+
+ if ( lpData )
+ {
+ // copy the data to the end of the command
+ memcpy( lpBuffer + *dPacketSize, lpData, wDataLength );
+ }
+ else
+ {
+ // NULL data pointer, fill the buffer with zeros
+ memset( lpBuffer + *dPacketSize, 0, wDataLength );
+ }
+
+ *dPacketSize += wDataLength;
+ }
+
+ return 0;
+}
+
+int Synch(int hd, int chan)
+{
+ int bRet = 0;
+ int dPacketSize = 0;
+ unsigned char buf[4096];
+
+ // create the Synch command, send it to the device,
+ // and retrieve absolute credit data from the device.
+ EncodeCommand(buf, sizeof(buf)
+ , 0
+ , eSynch
+ , eCommandUnknown
+ , NULL
+ , gnMaxDataSize
+ , NULL
+ , gnMaxCmdOptionSize
+ , &dPacketSize
+ , gwSynchRefNum
+ );
+
+ hpmud_write_channel(hd, chan, buf, dPacketSize, EXCEPTION_TIMEOUT, &bRet);
+
+ return( bRet );
+}
+
+int SynchComplete(int hd, int chan)
+{
+ int bRet = 0;
+ int dPacketSize = 0;
+ unsigned char buf[32];
+
+ // create the SynchComplete command, send it to the device,
+ // and retrieve absolute credit data from the device.
+ EncodeCommand(buf, sizeof(buf)
+ , 0
+ , eSynchComplete
+ , eCommandUnknown
+ , NULL
+ , 0
+ , NULL
+ , 0
+ , &dPacketSize
+ , gwSynchCompleteRefNum
+ );
+
+ hpmud_write_channel(hd, chan, buf, dPacketSize, EXCEPTION_TIMEOUT, &bRet);
+
+ return( bRet );
+}
+
+int Reset(int hd, int chan)
+{
+ int bRet = 0;
+ int dPacketSize = 0;
+ unsigned char buf[32];
+
+ // create the Reset command, send it to the device,
+ // and retrieve absolute credit data from the device.
+ //
+ EncodeCommand(buf, sizeof(buf)
+ , 0
+ , eResetLidil
+ , eCommandUnknown
+ , NULL
+ , 0
+ , NULL
+ , 0
+ , &dPacketSize
+ , gwResetRefNum
+ );
+
+ hpmud_write_channel(hd, chan, buf, dPacketSize, EXCEPTION_TIMEOUT, &bRet);
+
+ return( bRet );
+}
+
+int RetrieveAlignmentValues038(int hd, int chan, LDLGenAlign *pG)
+{
+ int n;
+ int dPacketSize = 0;
+ unsigned char buf[256];
+ LDLResponseAlign038 *pA;
+
+ /* Enable responses. */
+ EncodeCommand(buf, sizeof(buf)
+ , 0
+ , eEnableResponses
+ , eCommandUnknown
+ , NULL
+ , 0
+ , NULL
+ , 0
+ , &dPacketSize
+ , 0
+ );
+ hpmud_write_channel(hd, chan, buf, dPacketSize, EXCEPTION_TIMEOUT, &n);
+
+ /* Write alignment query. */
+ EncodeCommand(buf, sizeof(buf)
+ , 0 // device 0
+ , eCommand
+ , eQuery
+ , NULL
+ , 0
+ , gpAlignmentQuery
+ , gnPrinterQueryOptionsSize
+ , &dPacketSize
+ , gwAlignmentQueryRefNum
+ );
+ hpmud_write_channel(hd, chan, buf, dPacketSize, EXCEPTION_TIMEOUT, &n);
+
+ /* Disable responses. */
+ EncodeCommand(buf, sizeof(buf)
+ , 0
+ , eDiableResponses
+ , eCommandUnknown
+ , NULL
+ , 0
+ , NULL
+ , 0
+ , &dPacketSize
+ , 0
+ );
+ hpmud_write_channel(hd, chan, buf, dPacketSize, EXCEPTION_TIMEOUT, &n);
+
+ /* Read query response. */
+ hpmud_read_channel(hd, chan, buf, sizeof(buf), EXCEPTION_TIMEOUT, &n);
+ pA = (LDLResponseAlign038 *)buf;
+ memset(pG, 0, sizeof(LDLGenAlign));
+ if (pA->h.packet_type == 16)
+ {
+ pG->nPens = 2;
+ /* Except for bi, convert values from relative to black pen to relative to color. */
+ pG->pen[0].color = 0;
+ pG->pen[0].vert = -pA->c[0];
+ pG->pen[0].horz = -pA->c[1];
+ pG->pen[0].bi = pA->k[2];
+ pG->pen[1].color = 1;
+ pG->pen[1].vert = pA->k[0];
+ pG->pen[1].horz = pA->k[1];
+ pG->pen[1].bi = pA->c[2];
+ }
+
+ return 0;
+}
+
+int RetrieveAlignmentValues043(int hd, int chan, LDLGenAlign *pG)
+{
+ int n=0;
+ int dPacketSize = 0;
+ unsigned char buf[256];
+ LDLResponseAlign043 *pA;
+
+ /* Enable responses. */
+ EncodeCommand(buf, sizeof(buf)
+ , 0
+ , eEnableResponses
+ , eCommandUnknown
+ , NULL
+ , 0
+ , NULL
+ , 0
+ , &dPacketSize
+ , 0
+ );
+ hpmud_write_channel(hd, chan, buf, dPacketSize, EXCEPTION_TIMEOUT, &n);
+
+ /* Write alignment query. */
+ EncodeCommand(buf, sizeof(buf)
+ , 0 // device 0
+ , eCommand
+ , eQuery
+ , NULL
+ , 0
+ , gpPenAlignmentQuery
+ , gnPrinterQueryOptionsSize
+ , &dPacketSize
+ , gwAlignmentQueryRefNum
+ );
+ hpmud_write_channel(hd, chan, buf, dPacketSize, EXCEPTION_TIMEOUT, &n);
+
+ /* Disable responses. */
+ EncodeCommand(buf, sizeof(buf)
+ , 0
+ , eDiableResponses
+ , eCommandUnknown
+ , NULL
+ , 0
+ , NULL
+ , 0
+ , &dPacketSize
+ , 0
+ );
+ hpmud_write_channel(hd, chan, buf, dPacketSize, EXCEPTION_TIMEOUT, &n);
+
+ hpmud_read_channel(hd, chan, buf, sizeof(buf), EXCEPTION_TIMEOUT, &n);
+ pA = (LDLResponseAlign043 *)buf;
+ memset(pG, 0, sizeof(LDLGenAlign));
+ if (pA->h.packet_type == 16)
+ {
+ memcpy(pG, &pA->g, sizeof(LDLGenAlign));
+ }
+
+ return 0;
+}
+
+uint32_t RetrieveVersion(int hd, int chan)
+{
+ int n, version=0;
+ int dPacketSize = 0;
+ unsigned char buf[256];
+ LDLResponseVersion *pV;
+
+ /* Enable responses. */
+ EncodeCommand(buf, sizeof(buf)
+ , 0
+ , eEnableResponses
+ , eCommandUnknown
+ , NULL
+ , 0
+ , NULL
+ , 0
+ , &dPacketSize
+ , 0
+ );
+ hpmud_write_channel(hd, chan, buf, dPacketSize, EXCEPTION_TIMEOUT, &n);
+
+ /* Write lidil version query. */
+ EncodeCommand(buf, sizeof(buf)
+ , 0 // device 0
+ , eCommand
+ , eQuery
+ , NULL
+ , 0
+ , gpPrinterVersionQuery
+ , gnPrinterQueryOptionsSize
+ , &dPacketSize
+ , gwAlignmentQueryRefNum
+ );
+ hpmud_write_channel(hd, chan, buf, dPacketSize, EXCEPTION_TIMEOUT, &n);
+
+ /* Disable responses. */
+ EncodeCommand(buf, sizeof(buf)
+ , 0
+ , eDiableResponses
+ , eCommandUnknown
+ , NULL
+ , 0
+ , NULL
+ , 0
+ , &dPacketSize
+ , 0
+ );
+ hpmud_write_channel(hd, chan, buf, dPacketSize, EXCEPTION_TIMEOUT, &n);
+
+ hpmud_read_channel(hd, chan, buf, sizeof(buf), EXCEPTION_TIMEOUT, &n);
+ pV = (LDLResponseVersion *)buf;
+ if (pV->h.packet_type == 16)
+ {
+ version = ntohl(pV->ldlversion);
+ fprintf(stdout, "lidil version = %x\n", version);
+ }
+
+ return(version);
+}
+
+/*
+ * Return value = (black | photo) to color vertical alignment offset, error = -1.
+ *
+ * All alignment values may be zero if pen(s) were never aligned. Valid values
+ * may range from -30 to +30.
+ */
+int ReadHPVertAlign(int hd)
+{
+ int channel, n, i, x2colorVert=-1;
+ uint32_t ver;
+ LDLGenAlign ga;
+
+ if (hpmud_open_channel(hd, "PRINT", &channel) != HPMUD_R_OK)
+ {
+ BUG("unable to open print channel ReadHPVertAlign\n");
+ goto bugout;
+ }
+
+ if (Synch(hd, channel)==0)
+ {
+ BUG("unable to write sync ReadHPVertAlign\n");
+ goto bugout;
+ }
+
+ if (SynchComplete(hd, channel)==0)
+ {
+ BUG("unable to write sync complete ReadHPVertAlign\n");
+ goto bugout;
+ }
+
+ if (Reset(hd, channel)==0)
+ {
+ BUG("unable to write reset ReadHPVertAlign\n");
+ goto bugout;
+ }
+
+ if ((ver = RetrieveVersion(hd, channel))==0)
+ {
+ BUG("unable to read version ReadHPVertAlign\n");
+ goto bugout;
+ }
+
+ if (ver > 0x308)
+ RetrieveAlignmentValues043(hd, channel, &ga);
+ else
+ RetrieveAlignmentValues038(hd, channel, &ga);
+
+ if (!(n = ga.nPens))
+ goto bugout;
+
+ for (i=0; i<n; i++)
+ {
+ if (ga.pen[i].color == 0 || ga.pen[i].color == 2)
+ {
+ x2colorVert = ga.pen[i].vert; /* (black | photo) to color offset */
+ BUG("%s alignment: vert=%d horz=%d bi=%d x2c=%d\n", (ga.pen[i].color==0) ? "black" : "photo", ga.pen[i].vert, ga.pen[i].horz, ga.pen[i].bi, x2colorVert);
+ }
+ }
+
+ Reset(hd, channel);
+
+bugout:
+ if (channel >= 0)
+ hpmud_close_channel(hd, channel);
+
+ return x2colorVert;
+}
+
+#endif // HAVE_LIBHPIP
+
+
diff --git a/prnt/hpijs/hpiom.h b/prnt/hpijs/hpiom.h
new file mode 100644
index 0000000..ed31fa6
--- /dev/null
+++ b/prnt/hpijs/hpiom.h
@@ -0,0 +1,139 @@
+/*****************************************************************************\
+
+ hpiom.h - HP I/O message handler
+
+ (c) 2003-2004 Copyright Hewlett-Packard Development Company, LP
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+\*****************************************************************************/
+
+#ifndef hpiom_INCLUDED
+#define hpiom_INCLUDED
+
+/*
+ * LIDIL Definitions.
+ */
+
+enum ePACKETTYPE{ eCommand
+ , eDisablePacing
+ , eEnablePacing
+ , eResumeNormalOperation
+ , eDiableResponses
+ , eEnableResponses
+ , eResetLidil
+ , eSynch
+ , eSynchComplete
+ , eResponseCommandExecuted = 16
+ , eResponseCommandDiscarded
+ , eResponseCommandNotSupported
+ , eResponseUnitNumberNotSupported
+ , eResponseCommandLengthNotSupported
+ , eResponseDataLengthNotSupported
+ , eResponseCommandError
+ , eResponseProtocalError
+ , eResponseAuto
+ , eOperationComplete
+ , eAbsoluteCredit = 32
+ , eCredit
+ , ePacketUnknown
+ };
+
+enum eCOMMANDNUMBER{ eJobControl
+ , eLoadPage
+ , eEjectPage
+ , ePrintSweep
+ , eLoadSweepData
+ , eQuery
+ , eComment = 7
+ , eHandlePen
+ , eUnderware = 11
+ , eDeviceControlCommand
+ , eCommandUnknown
+ };
+
+typedef struct
+{
+ unsigned char start_frame;
+ unsigned short cmd_length;
+ unsigned char unit_num;
+ unsigned char packet_type;
+ unsigned char cmd_num;
+ unsigned short ref_num;
+ unsigned short data_length;
+ unsigned char response_cmp;
+ unsigned char pad[4];
+ unsigned char end_frame;
+} __attribute__((packed)) LDLResponseHeader;
+
+typedef struct
+{
+ LDLResponseHeader h;
+ unsigned short colors;
+ char k[3]; /* 0=vertical 1=horizontal 2=bi */
+ char c[3]; /* c=m=y */
+ char m[3];
+ char y[3];
+} __attribute__((packed)) LDLResponseAlign038;
+
+typedef struct
+{
+ char color; /* 0=black 1=color 2=photo */
+ char vert; /* vertical alignment offset */
+ char horz; /* horizontal alignment offset */
+ char bi; /* bi-directional offset */
+} __attribute__((packed)) LDLPen;
+
+typedef struct
+{
+ unsigned char nPens; /* number of pens */
+ LDLPen pen[3];
+} __attribute__((packed)) LDLGenAlign;
+
+typedef struct
+{
+ LDLResponseHeader h;
+ LDLGenAlign g;
+} __attribute__((packed)) LDLResponseAlign043;
+
+typedef struct
+{
+ LDLResponseHeader h;
+ uint32_t ldlversion;
+ char firmversion[8];
+} __attribute__((packed)) LDLResponseVersion;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern int ReadHPVertAlign(int hd);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* hpiom_INCLUDED */
+
+
diff --git a/prnt/hpijs/hpjbig_wrapper.h b/prnt/hpijs/hpjbig_wrapper.h
new file mode 100644
index 0000000..230e298
--- /dev/null
+++ b/prnt/hpijs/hpjbig_wrapper.h
@@ -0,0 +1,49 @@
+/*****************************************************************************\
+ hpjbig_wrapper.h : header file for hpjbig_wrapper.c
+
+ Copyright (c) 1996 - 2007, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+typedef struct
+{
+ unsigned char *pszCompressedData;
+ unsigned long dwTotalSize;
+} HPLJZjcBuff;
+
+typedef struct
+{
+ unsigned long xd;
+ unsigned long yd;
+ unsigned long l0;
+ unsigned int mx;
+ unsigned int my;
+ int order;
+ int planes;
+ int dl;
+ int d;
+ int options;
+} HPLJZjsJbgEncSt;
diff --git a/prnt/hpijs/hpprint_c_api.h b/prnt/hpijs/hpprint_c_api.h
new file mode 100644
index 0000000..d127f84
--- /dev/null
+++ b/prnt/hpijs/hpprint_c_api.h
@@ -0,0 +1,231 @@
+/*****************************************************************************\
+ hpprint_c_api.h : Interface for C access to APDK
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+// hpprint_c_api.h
+// 'C' interface functions to APDK external C++ interfaces
+// For use when calling environment is written in 'C' not C++
+// (a C++ compiler is still required, however; and there must
+// be a derived SystemServices class defined for the host environment)
+
+#ifndef APDK_HPPRINT_C_API_H
+#define APDK_HPPRINT_C_API_H
+
+#include "global_types.h"
+#include "printerfactory.h"
+
+typedef void * JobHandle;
+typedef void * PrintContextHandle;
+typedef void * FontHandle;
+typedef void * ReferenceFontHandle;
+typedef void * SystemServicesHandle;
+
+APDK_USING_NAMESPACE
+
+//////////////////////////////////////////
+// 'C' interface to Job class
+//
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern DRIVER_ERROR C_Job_Create(JobHandle *phNewJob, PrintContextHandle hPrintContext);
+
+extern void C_Job_Destroy(JobHandle hJob);
+
+extern DRIVER_ERROR C_Job_SendRasters(JobHandle hJob, BYTE* ImageData);
+
+extern DRIVER_ERROR C_Job_SupportSeparateBlack(JobHandle hJob, BOOL* bSeparateBlack);
+
+extern DRIVER_ERROR C_Job_SendMultiPlaneRasters(JobHandle hJob, BYTE* BlackImageData, BYTE* ColorImageData);
+
+#if defined(APDK_FONTS_NEEDED)
+extern DRIVER_ERROR C_Job_TextOut(JobHandle hJob, const char* pTextString,
+ unsigned int iLenString, const FontHandle hFont,
+ int iAbsX, int iAbsY );
+#endif
+
+extern DRIVER_ERROR C_Job_NewPage(JobHandle hJob);
+
+
+//////////////////////////////////////////
+// 'C' interface to PrintContext class
+//
+
+extern DRIVER_ERROR C_PrintContext_Create(PrintContextHandle *phNewPrintContext,
+ SystemServicesHandle hSysServ,
+ unsigned int InputPixelsPerRow,
+ unsigned int OutputPixelsPerRow,
+ PAPER_SIZE ps);
+
+extern void C_PrintContext_Destroy(PrintContextHandle hPrintContext);
+
+extern void C_PrintContext_Flush(PrintContextHandle hPrintContext, int FlushSize);
+
+extern DRIVER_ERROR C_PrintContext_SelectDevice(PrintContextHandle hPrintContext, const PRINTER_TYPE Model);
+
+extern unsigned int C_PrintContext_GetModeCount(PrintContextHandle hPrintContext);
+
+extern DRIVER_ERROR C_PrintContext_OldSelectPrintMode(PrintContextHandle hPrintContext, const unsigned int index);
+
+extern DRIVER_ERROR C_PrintContext_SelectPrintMode(PrintContextHandle hPrintContext,
+ const QUALITY_MODE quality_mode,
+ const MEDIATYPE media_type,
+ const COLORMODE color_mode,
+ const BOOL device_text);
+
+extern unsigned int C_PrintContext_OldCurrentPrintMode(PrintContextHandle hPrintContext);
+
+extern DRIVER_ERROR C_PrintContext_CurrentPrintMode(PrintContextHandle hPrintContext,
+ QUALITY_MODE quality_mode,
+ MEDIATYPE media_type,
+ COLORMODE color_mode,
+ BOOL device_text);
+
+extern const char* C_PrintContext_GetModeName(PrintContextHandle hPrintContext);
+
+extern PRINTER_TYPE C_PrintContext_SelectedDevice(PrintContextHandle hPrintContext);
+
+#if defined(APDK_FONTS_NEEDED)
+extern ReferenceFontHandle C_PrintContext_EnumFont(PrintContextHandle hPrintContext, int * iCurrIdx);
+
+extern FontHandle C_PrintContext_RealizeFont(PrintContextHandle hPrintContext,
+ const int index, const BYTE bSize, const TEXTCOLOR eColor,
+ const BOOL bBold, const BOOL bItalic, const BOOL bUnderline);
+#endif
+
+extern PRINTER_TYPE C_PrintContext_EnumDevices(const PrintContextHandle hPrintContext, FAMILY_HANDLE& familyHandle);
+
+extern DRIVER_ERROR C_PrintContext_PerformPrinterFunction(PrintContextHandle hPrintContext, PRINTER_FUNC eFunc);
+
+extern DRIVER_ERROR C_PrintContext_SetPaperSize(PrintContextHandle hPrintContext, PAPER_SIZE ps, BOOL bFullBleed);
+
+extern DRIVER_ERROR C_PrintContext_SetPixelsPerRow(PrintContextHandle hPrintContext,
+ unsigned int InputPixelsPerRow,
+ unsigned int OutputPixelsPerRow);
+
+extern BOOL C_PrintContext_PrinterSelected(PrintContextHandle hPrintContext);
+
+extern BOOL C_PrintContext_PrinterFontsAvailable(PrintContextHandle hPrintContext);
+
+extern unsigned int C_PrintContext_InputPixelsPerRow(PrintContextHandle hPrintContext);
+
+extern unsigned int C_PrintContext_OutputPixelsPerRow(PrintContextHandle hPrintContext);
+
+extern PAPER_SIZE C_PrintContext_GetPaperSize(PrintContextHandle hPrintContext);
+
+extern const char* C_PrintContext_PrinterModel(PrintContextHandle hPrintContext);
+
+extern const char* C_PrintContext_PrintertypeToString(PrintContextHandle hPrintContext, PRINTER_TYPE pt);
+
+extern unsigned int C_PrintContext_InputResolution(PrintContextHandle hPrintContext);
+
+extern DRIVER_ERROR C_PrintContext_SetInputResolution(PrintContextHandle hPrintContext, unsigned int Res);
+
+extern unsigned int C_PrintContext_EffectiveResolutionX(PrintContextHandle hPrintContext);
+
+extern unsigned int C_PrintContext_EffectiveResolutionY(PrintContextHandle hPrintContext);
+
+extern float C_PrintContext_PrintableWidth(PrintContextHandle hPrintContext);
+
+extern float C_PrintContext_PrintableHeight(PrintContextHandle hPrintContext);
+
+extern float C_PrintContext_PhysicalPageSizeX(PrintContextHandle hPrintContext);
+
+extern float C_PrintContext_PhysicalPageSizeY(PrintContextHandle hPrintContext);
+
+extern float C_PrintContext_PrintableStartX(PrintContextHandle hPrintContext);
+
+extern float C_PrintContext_PrintableStartY(PrintContextHandle hPrintContext);
+
+extern DRIVER_ERROR C_PrintContext_SendPrinterReadyData(PrintContextHandle hPrintContext, BYTE* stream, unsigned int size);
+
+
+//////////////////////////////////////////
+// 'C' interface to Font class
+//
+#if defined(APDK_FONTS_NEEDED)
+
+extern void C_Font_Destroy(FontHandle hFont);
+
+extern DRIVER_ERROR C_Font_GetTextExtent(PrintContextHandle hPrintContext,FontHandle hFont,
+ const char* pTextString, const int iLenString,
+ int * iHeight, int * iWidth);
+
+extern const char* C_Font_GetName(const FontHandle hFont);
+
+extern BOOL C_Font_IsBoldAllowed(const FontHandle hFont);
+
+extern BOOL C_Font_IsItalicAllowed(const FontHandle hFont);
+
+extern BOOL C_Font_IsUnderlineAllowed(const FontHandle hFont);
+
+extern BOOL C_Font_IsColorAllowed(const FontHandle hFont);
+
+extern BOOL C_Font_IsProportional(const FontHandle hFont);
+
+extern BOOL C_Font_HasSerif(const FontHandle hFont);
+
+extern BYTE C_Font_GetPitch(const FontHandle hFont, const BYTE pointsize);
+
+extern int C_Font_Get_iPointsize(const FontHandle hFont);
+
+extern void C_Font_Set_iPointsize(const FontHandle hFont, int iPointsize);
+
+extern BOOL C_Font_Get_bBold(const FontHandle hFont);
+
+extern void C_Font_Set_bBold(const FontHandle hFont, BOOL bBold);
+
+extern BOOL C_Font_Get_bItalic(const FontHandle hFont);
+
+extern void C_Font_Set_bItalic(const FontHandle hFont, BOOL bItalic);
+
+extern BOOL C_Font_Get_bUnderline(const FontHandle hFont);
+
+extern void C_Font_Set_bUnderline(const FontHandle hFont, BOOL bUnderline);
+
+extern TEXTCOLOR C_Font_Get_eColor(const FontHandle hFont);
+
+extern void C_Font_Set_eColor(const FontHandle hFont, TEXTCOLOR eColor);
+
+extern int C_Font_Get_iPitch(const FontHandle hFont);
+
+extern void C_Font_Set_iPitch(const FontHandle hFont, int iPitch);
+
+extern int C_Font_Index(FontHandle hFont);
+
+#endif // defined(APDK_FONTS_NEEDED)
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // APDK_HPPRINT_C_API_H
diff --git a/prnt/hpijs/hpprintapi.h b/prnt/hpijs/hpprintapi.h
new file mode 100644
index 0000000..86b5af9
--- /dev/null
+++ b/prnt/hpijs/hpprintapi.h
@@ -0,0 +1,52 @@
+/*****************************************************************************\
+ hpprintapi.h : Interface/Implimentation for the APDK API
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#ifndef APDK_HPPRINTAPI_H
+#define APDK_HPPRINTAPI_H
+
+#include "global_types.h"
+
+// include SystemServices class
+#include "systemservices.h"
+
+// include the Font, ReferenceFont, etc... classes if necessary
+#if defined(APDK_FONTS_NEEDED)
+#include "font.h"
+#endif // if fonts used
+
+
+// include PrintContext class
+#include "context.h"
+
+// include Job class
+#include "job.h"
+
+#endif // APDK_HPPRINTAPI_H
diff --git a/prnt/hpijs/hptypes.h b/prnt/hpijs/hptypes.h
new file mode 100644
index 0000000..af5aa62
--- /dev/null
+++ b/prnt/hpijs/hptypes.h
@@ -0,0 +1,78 @@
+/*****************************************************************************\
+ hptypes.h : HP types defined used by imaging modeules
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#ifndef HPTYPES_H
+#define HPTYPES_H
+//===========================================================================
+//
+// Filename : hptypes.h
+//
+// Module : Open Source Imaging
+//
+// Description : This file contains HP Types used by imaging modules.
+//
+//============================================================================
+
+//=============================================================================
+// Header file dependencies
+//=============================================================================
+
+#define HPFAR
+
+#define ENVPTR(typeName) HPFAR *typeName
+
+typedef unsigned char HPUInt8;
+
+typedef const unsigned char HPCUInt8;
+
+typedef signed short HPInt16, ENVPTR(HPInt16Ptr);
+
+typedef const signed short HPCInt16, ENVPTR(HPCInt16Ptr);
+
+typedef unsigned short HPUInt16;
+
+typedef uint32_t HPUInt32, ENVPTR(HPUInt32Ptr);
+
+typedef int HPBool;
+
+typedef HPUInt8 HPByte, ENVPTR(HPBytePtr);
+
+typedef HPCUInt8 HPCByte, ENVPTR(HPCBytePtr);
+
+typedef HPUInt32 HPUIntPtrSize, ENVPTR(HPUIntPtrSizePtr);
+
+#define kSpringsErrorType HPInt16
+#define kSpringsErrorTypePtr HPInt16Ptr
+
+#define HPTRUE 1
+#define HPFALSE 0
+
+#endif // HPTYPES_H
diff --git a/prnt/hpijs/htfed.h b/prnt/hpijs/htfed.h
new file mode 100644
index 0000000..e8b9d89
--- /dev/null
+++ b/prnt/hpijs/htfed.h
@@ -0,0 +1,131 @@
+/*****************************************************************************\
+ hfed.h : Open Source Imaging error diffusion prototypes
+
+ Copyright (c) 1994 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#ifndef HTFED_H
+#define HTFED_H
+
+#define FORWARD_FED( thresholdValue, bitMask )\
+{\
+ tone = (*inputPtr++ );\
+ fedResPtr = fedResTbl + (tone << 2);\
+ level = *fedResPtr++;\
+ if (tone != 0)\
+ {\
+ tone = ( tmpShortStore + (HPInt16)(*fedResPtr++) );\
+ if (tone >= thresholdValue)\
+ {\
+ tone -= 255;\
+ level++;\
+ }\
+ switch (level)\
+ {\
+ case 0:\
+ break;\
+ case 1:\
+ rasterByte1 |= bitMask;\
+ break;\
+ case 2:\
+ rasterByte2 |= bitMask;\
+ break;\
+ case 3:\
+ rasterByte2 |= bitMask; rasterByte1 |= bitMask;\
+ break;\
+ case 4:\
+ rasterByte3 |= bitMask;\
+ break;\
+ case 5:\
+ rasterByte3 |= bitMask; rasterByte1 |= bitMask;\
+ break;\
+ case 6:\
+ rasterByte3 |= bitMask; rasterByte2 |= bitMask;\
+ break;\
+ case 7:\
+ rasterByte3 |= bitMask; rasterByte2 |= bitMask; rasterByte1 |= bitMask;\
+ break;\
+ }\
+ }\
+ else\
+ {\
+ tone = tmpShortStore;\
+ }\
+ *diffusionErrorPtr++ = tone >> 1;\
+ tmpShortStore = *diffusionErrorPtr + (tone - (tone >> 1));\
+}
+
+#define BACKWARD_FED( thresholdValue, bitMask )\
+{\
+ tone = (*inputPtr-- );\
+ fedResPtr = fedResTbl + (tone << 2);\
+ level = *fedResPtr++;\
+ if (tone != 0)\
+ {\
+ tone = ( tmpShortStore + (HPInt16)(*fedResPtr++) );\
+ if (tone >= thresholdValue)\
+ {\
+ tone -= 255;\
+ level++;\
+ }\
+ switch (level)\
+ {\
+ case 0:\
+ break;\
+ case 1:\
+ rasterByte1 |= bitMask;\
+ break;\
+ case 2:\
+ rasterByte2 |= bitMask;\
+ break;\
+ case 3:\
+ rasterByte2 |= bitMask; rasterByte1 |= bitMask;\
+ break;\
+ case 4:\
+ rasterByte3 |= bitMask;\
+ break;\
+ case 5:\
+ rasterByte3 |= bitMask; rasterByte1 |= bitMask;\
+ break;\
+ case 6:\
+ rasterByte3 |= bitMask; rasterByte2 |= bitMask;\
+ break;\
+ case 7:\
+ rasterByte3 |= bitMask; rasterByte2 |= bitMask; rasterByte1 |= bitMask;\
+ break;\
+ }\
+ }\
+ else\
+ {\
+ tone = tmpShortStore;\
+ }\
+ *diffusionErrorPtr-- = tone >> 1;\
+ tmpShortStore = *diffusionErrorPtr + (tone - (tone >> 1));\
+}
+
+#endif // INCLUDED_HTFED
diff --git a/prnt/hpijs/htmtxhi.cpp b/prnt/hpijs/htmtxhi.cpp
new file mode 100644
index 0000000..b55c956
--- /dev/null
+++ b/prnt/hpijs/htmtxhi.cpp
@@ -0,0 +1,220 @@
+/*****************************************************************************\
+ htmtxhi.cpp : Implimentation for Multilevel (HiFipe) dither matrix
+
+ Copyright (c) 1994 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+//===========================================================================
+//
+// Filename : HTMTXHI.CPP
+//
+// Module : Interlaken
+//
+// Description : Multilevel(HiFipe) dither matrix based halftoning
+//
+//============================================================================
+
+//=============================================================================
+// Header file dependencies
+//=============================================================================
+
+/*
+#ifndef INCLUDED_HPENVTYP
+#include "HPEnvTyp.h"
+#endif
+#ifndef INCLUDED_HTINTF
+#include "HTIntf.h"
+#endif
+#ifndef INCLUDED_HTWORLD
+#include "HTWorld.h"
+#endif
+#ifndef INCLUDED_HPASSERT
+#include "HPAssert.h"
+#endif
+#ifndef INCLUDED_HTMATRIX
+#include "htmatrix.h"
+#endif
+*/
+
+#include "header.h"
+#include "halftoner.h"
+
+APDK_BEGIN_NAMESPACE
+
+#define Dither4LevelHiFipe(matrix,bitMask)\
+{\
+ tone = (*inputPtr++ );\
+ fedResPtr = fedResTbl + (tone << 2);\
+ level = *fedResPtr++;\
+ if (*(fedResPtr) >= (HPByte)matrix )\
+ {\
+ level++;\
+ }\
+ switch (level)\
+ {\
+ case 0:\
+ break;\
+ case 1:\
+ rasterByte1 |= bitMask;\
+ break;\
+ case 2:\
+ rasterByte2 |= bitMask;\
+ break;\
+ case 3:\
+ rasterByte2 |= bitMask; rasterByte1 |= bitMask;\
+ break;\
+ case 4:\
+ rasterByte3 |= bitMask;\
+ break;\
+ case 5:\
+ rasterByte3 |= bitMask; rasterByte1 |= bitMask;\
+ break;\
+ case 6:\
+ rasterByte3 |= bitMask; rasterByte2 |= bitMask;\
+ break;\
+ case 7:\
+ rasterByte3 |= bitMask; rasterByte2 |= bitMask; rasterByte1 |= bitMask;\
+ break;\
+ }\
+}
+
+// Each dither matrix has a header of five bytes
+// 1st byte (Size (in bytes) of row in the matrix) - 1
+// 2nd byte Size (in bytes) of row in the matrix
+// 3rd byte Black offset
+// 4th byte Cyan offset
+// 5th byte Magenta offset
+//
+// With matrix actually starting on the 6th Byte.
+//
+// Black, cyan, and magenta are all offset into different
+// locations in the dither matrix. (Yellow uses the same offsets as
+// magenta)
+//
+
+// Ditherparms should be set up as Fed with the following additions
+// ditherParms->fSqueezeOffset = first dirty pixel, if white has been skipped at the beginning of the row
+// ditherParmsPtr->fMatrixRowSize = Byte 2 of the Header
+// ditherParmsPtr->fDitherCellOffset = Black, Cyan, or Magenta Offset respectively
+
+// To select the right row of the matrix for each color
+//
+// ditherParms->fMatrixV1 = ((matrixStart + rasterIndex + DitherCellOffset) % (MatrixRowSize)) * (MatrixRowSize)
+
+DRIVER_ERROR Halftoner::HTMATRIXHI_KCMY (THTDitherParmsPtr ditherParmsPtr,
+ HPUInt16 count)
+{
+#if HPUNUSEDVAR
+#pragma unused(envP1)
+#endif
+
+ THTDitherParmsPtr ditherParms = ditherParmsPtr+count;
+ HPByte tone;
+ HPUInt8 rasterByte1,rasterByte2, rasterByte3;
+ HPUInt8 level;
+ HPInt16 pixelCount;
+
+ HPUInt16 numLoop = ditherParms->fNumPix;
+ HPBytePtr inputPtr = ditherParms->fInput;
+ HPBytePtr outputPtr1, outputPtr2, outputPtr3;
+
+ HPBytePtr fedResTbl = (HPBytePtr)ditherParms->fFEDResPtr;
+ HPBytePtr fedResPtr;
+
+ HPBytePtr matrixV = ditherParms->fMatrixV1;
+ HPBytePtr matrixH;
+ HPUInt16 index;
+ HPUInt16 matrixRowSize = ditherParms->fMatrixRowSize;
+
+ rasterByte1 = 0;
+ rasterByte2 = 0;
+ rasterByte3 = 0;
+
+ outputPtr1 = ditherParms->fOutput1;
+ outputPtr2 = ditherParms->fOutput2;
+ outputPtr3 = ditherParms->fOutput3;
+
+ if (!ditherParms->fSymmetricFlag)
+ return SYSTEM_ERROR; // matrixHI_KCMY asymetric not supported
+
+ index = (ditherParms->fDitherCellOffset + ditherParms->fSqueezeOffset) % (matrixRowSize);
+ matrixH = matrixV + index;
+
+ for (pixelCount = numLoop + 8; (pixelCount -= 8) > 0; )
+ {
+ // if we've reached end of matrix we need to reset
+ // our row pointer to the start of the row
+ if ( index == matrixRowSize )
+ {
+ matrixH = matrixV;
+ index = 0;
+ }
+
+ Dither4LevelHiFipe(*matrixH,0x80);
+ matrixH++;
+ Dither4LevelHiFipe(*matrixH,0x40);
+ matrixH++;
+ Dither4LevelHiFipe(*matrixH,0x20);
+ matrixH++;
+ Dither4LevelHiFipe(*matrixH,0x10);
+ matrixH++;
+ Dither4LevelHiFipe(*matrixH,0x08);
+ matrixH++;
+ Dither4LevelHiFipe(*matrixH,0x04);
+ matrixH++;
+ Dither4LevelHiFipe(*matrixH,0x02);
+ matrixH++;
+ Dither4LevelHiFipe(*matrixH,0x01);
+ matrixH++;
+
+ *outputPtr1++ |= rasterByte1;
+ if (outputPtr2)
+ *outputPtr2++ |= rasterByte2;
+ rasterByte1 = 0;
+ rasterByte2 = 0;
+
+ index += 8;
+ }
+ return NO_ERROR;
+}
+
+unsigned char BayerMatrix[] =
+{
+ 0x07, 0x08, 0x00, 0x00, 0x00,
+ 0x2, 0x82, 0x22, 0xa2, 0xa, 0x8a, 0x2a, 0xaa,
+ 0xc2, 0x42, 0xe2, 0x62, 0xca, 0x4a, 0xea, 0x6a,
+ 0x32, 0xb2, 0x12, 0x92, 0x3a, 0xba, 0x1a, 0x9a,
+ 0xf2, 0x72, 0xd2, 0x52, 0xfa, 0x7a, 0xda, 0x5a,
+ 0xe, 0x8e, 0x2e, 0xae, 0x6, 0x86, 0x26, 0xa6,
+ 0xce, 0x4e, 0xee, 0x6e, 0xc6, 0x46, 0xe6, 0x66,
+ 0x3e, 0xbe, 0x1e, 0x9e, 0x36, 0xb6, 0x16, 0x96,
+ 0xfe, 0x7e, 0xde, 0x5e, 0xf6, 0x76, 0xd6, 0x56,
+};
+
+APDK_END_NAMESPACE
+
+
diff --git a/prnt/hpijs/ijs.c b/prnt/hpijs/ijs.c
new file mode 100644
index 0000000..01a14b7
--- /dev/null
+++ b/prnt/hpijs/ijs.c
@@ -0,0 +1,201 @@
+/**
+ * Copyright (c) 2001-2002 artofcode LLC.
+ *
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use, copy,
+ * modify, merge, publish, distribute, sublicense, and/or sell copies
+ * of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+**/
+
+#include <string.h>
+#include "unistd_.h"
+#include "ijs.h"
+
+static void
+ijs_put_int (char *p, int val)
+{
+ p[0] = (val >> 24) & 0xff;
+ p[1] = (val >> 16) & 0xff;
+ p[2] = (val >> 8) & 0xff;
+ p[3] = val & 0xff;
+}
+
+void
+ijs_send_init (IjsSendChan *ch, int fd)
+{
+ ch->fd = fd;
+ ch->buf_size = 0;
+}
+
+int
+ijs_send_int (IjsSendChan *ch, int val)
+{
+ if ((ch->buf_size + 4) > (int)sizeof(ch->buf))
+ return IJS_ERANGE;
+ ijs_put_int (ch->buf + ch->buf_size, val);
+ ch->buf_size += 4;
+ return 0;
+}
+
+int
+ijs_send_begin (IjsSendChan *ch, IjsCommand cmd)
+{
+ if (ch->buf_size != 0)
+ return IJS_EINTERNAL;
+ ijs_send_int (ch, cmd);
+ ch->buf_size += 4; /* leave room for size field */
+ return 0;
+}
+
+int
+ijs_send_block (IjsSendChan *ch, const char *buf, int len)
+{
+ if ((ch->buf_size + len) > (int)sizeof(ch->buf))
+ return IJS_ERANGE;
+ memcpy (ch->buf + ch->buf_size, buf, len);
+ ch->buf_size += len;
+ return 0;
+}
+
+int
+ijs_send_buf (IjsSendChan *ch)
+{
+ int status;
+
+ ijs_put_int (ch->buf + 4, ch->buf_size);
+ status = write (ch->fd, ch->buf, ch->buf_size);
+ status = (status == ch->buf_size) ? 0 : IJS_EIO;
+ ch->buf_size = 0;
+ return status;
+}
+
+void
+ijs_recv_init (IjsRecvChan *ch, int fd)
+{
+ ch->fd = fd;
+ ch->buf_size = 0;
+}
+
+int
+ijs_get_int (const char *p)
+{
+ const unsigned char *up = (const unsigned char *)p;
+ return (up[0] << 24) | (up[1] << 16) | (up[2] << 8) | up[3];
+}
+
+/* This is a drop-in replacement for read(), but handles partial reads. */
+int
+ijs_recv_read (IjsRecvChan *ch, char *buf, int size)
+{
+ int ix = 0;
+ int nbytes;
+
+ do
+ {
+ nbytes = read (ch->fd, buf + ix, size - ix);
+ if (nbytes < 0)
+ return nbytes;
+ else if (nbytes == 0)
+ return ix;
+ else
+ ix += nbytes;
+ }
+ while (ix < size);
+ return ix;
+}
+
+int
+ijs_recv_buf (IjsRecvChan *ch)
+{
+ int nbytes;
+ int data_size;
+
+ nbytes = ijs_recv_read (ch, ch->buf, 8);
+ if (nbytes != 8)
+ return IJS_EIO;
+ ch->buf_size = ijs_get_int (ch->buf + 4);
+ if (ch->buf_size < 8 || ch->buf_size > (int)sizeof(ch->buf))
+ return IJS_ERANGE;
+ data_size = ch->buf_size - 8;
+ if (data_size > 0)
+ {
+ nbytes = ijs_recv_read (ch, ch->buf + 8, data_size);
+ if (nbytes != data_size)
+ return IJS_EIO;
+ }
+ ch->buf_idx = 8;
+ return 0;
+}
+
+/**
+ * ijs_recv_ack: Receive an acknowledgement.
+ * @ch: Channel.
+ *
+ * Receives an acknowledgement code (generally from server to client).
+ * Note that the distinction between local error and error generated
+ * by the remote peer is lost in this routine. If it is important to
+ * preserve this distinction, use ijs_recv_buf directly instead.
+ *
+ * Return value: 0 on success, negative on error.
+ **/
+int
+ijs_recv_ack (IjsRecvChan *ch)
+{
+ int status;
+
+ status = ijs_recv_buf (ch);
+ if (status == 0)
+ {
+ int cmd = ijs_get_int (ch->buf);
+
+ if (cmd == IJS_CMD_NAK)
+ {
+ if (ch->buf_size != 12)
+ status = IJS_EPROTO;
+ else
+ status = ijs_get_int (ch->buf + 8);
+ }
+ }
+ return status;
+}
+
+int
+ijs_recv_int (IjsRecvChan *ch, int *val)
+{
+ if (ch->buf_idx + 4 > ch->buf_size)
+ return IJS_EPROTO;
+ *val = ijs_get_int (ch->buf + ch->buf_idx);
+ ch->buf_idx += 4;
+ return 0;
+}
+
+/**
+ * Return value: data block size if nonnegative, or error code if
+ * negative.
+ **/
+int
+ijs_recv_block (IjsRecvChan *ch, char *buf, int buf_size)
+{
+ int size = ch->buf_size - ch->buf_idx;
+
+ if (size > buf_size)
+ return IJS_ERANGE;
+ memcpy (buf, ch->buf + ch->buf_idx, size);
+ ch->buf_idx = ch->buf_size;
+ return size;
+}
diff --git a/prnt/hpijs/ijs.h b/prnt/hpijs/ijs.h
new file mode 100644
index 0000000..4c394c1
--- /dev/null
+++ b/prnt/hpijs/ijs.h
@@ -0,0 +1,124 @@
+/**
+ * Copyright (c) 2001-2004 artofcode LLC.
+ *
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use, copy,
+ * modify, merge, publish, distribute, sublicense, and/or sell copies
+ * of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+**/
+
+/* This file contains common data types for IJS */
+
+/* IJS_VERSION is decimal version number times 100 */
+#define IJS_VERSION 35
+
+typedef int ijs_bool;
+
+#ifndef FALSE
+#define FALSE 0
+#endif
+#ifndef TRUE
+#define TRUE 1
+#endif
+
+typedef enum {
+ IJS_CMD_ACK,
+ IJS_CMD_NAK,
+ IJS_CMD_PING,
+ IJS_CMD_PONG,
+ IJS_CMD_OPEN,
+ IJS_CMD_CLOSE,
+ IJS_CMD_BEGIN_JOB,
+ IJS_CMD_END_JOB,
+ IJS_CMD_CANCEL_JOB,
+ IJS_CMD_QUERY_STATUS,
+ IJS_CMD_LIST_PARAMS,
+ IJS_CMD_ENUM_PARAM,
+ IJS_CMD_SET_PARAM,
+ IJS_CMD_GET_PARAM,
+ IJS_CMD_BEGIN_PAGE,
+ IJS_CMD_SEND_DATA_BLOCK,
+ IJS_CMD_END_PAGE,
+ IJS_CMD_EXIT
+} IjsCommand;
+
+typedef int IjsJobId;
+
+#define IJS_EIO -2 /* I/O error */
+#define IJS_EPROTO -3 /* protocol error */
+#define IJS_ERANGE -4 /* out of range */
+#define IJS_EINTERNAL -5 /* internal error */
+#define IJS_ENYI -6 /* not yet implemented */
+#define IJS_ESYNTAX -7 /* syntax error */
+#define IJS_ECOLORSPACE -8 /* unknown color space */
+#define IJS_EUNKPARAM -9 /* unknown parameter */
+#define IJS_EJOBID -10 /* job id doesn't match */
+#define IJS_ETOOMANYJOBS -11 /* reached limit of server's #jobs */
+#define IJS_EBUF -12 /* buffer isn't big enough */
+
+#define IJS_HELO_STR "IJS\n\252v1\n"
+#define IJS_RESP_STR "IJS\n\253v1\n"
+
+typedef struct {
+ int fd;
+ char buf[4096];
+ int buf_size;
+} IjsSendChan;
+
+typedef struct {
+ int fd;
+ char buf[4096];
+ int buf_size;
+ int buf_idx;
+} IjsRecvChan;
+
+void
+ijs_send_init (IjsSendChan *ch, int fd);
+
+int
+ijs_send_int (IjsSendChan *ch, int val);
+
+int
+ijs_send_begin (IjsSendChan *ch, IjsCommand cmd);
+
+int
+ijs_send_block (IjsSendChan *ch, const char *buf, int len);
+
+int
+ijs_send_buf (IjsSendChan *ch);
+
+int
+ijs_get_int (const char *p);
+
+void
+ijs_recv_init (IjsRecvChan *ch, int fd);
+
+int
+ijs_recv_read (IjsRecvChan *ch, char *buf, int size);
+
+int
+ijs_recv_buf (IjsRecvChan *ch);
+
+int
+ijs_recv_ack (IjsRecvChan *ch);
+
+int
+ijs_recv_int (IjsRecvChan *ch, int *val);
+
+int
+ijs_recv_block (IjsRecvChan *ch, char *buf, int buf_size);
diff --git a/prnt/hpijs/ijs_client.h b/prnt/hpijs/ijs_client.h
new file mode 100644
index 0000000..3a6ec32
--- /dev/null
+++ b/prnt/hpijs/ijs_client.h
@@ -0,0 +1,96 @@
+/**
+ * Copyright (c) 2001-2002 artofcode LLC.
+ *
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use, copy,
+ * modify, merge, publish, distribute, sublicense, and/or sell copies
+ * of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+**/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct _IjsClientCtx IjsClientCtx;
+
+IjsClientCtx *
+ijs_invoke_server (const char *server_cmd);
+
+int
+ijs_exec_server (const char *server_cmd, int *pfd_to, int *pfd_from,
+ int *pchild_pid);
+
+int
+ijs_client_begin_cmd (IjsClientCtx *ctx, IjsCommand cmd);
+
+int
+ijs_client_send_int (IjsClientCtx *ctx, int val);
+
+int
+ijs_client_send_cmd (IjsClientCtx *ctx);
+
+int
+ijs_client_send_cmd_wait (IjsClientCtx *ctx);
+
+int
+ijs_client_send_data_wait (IjsClientCtx *ctx, IjsJobId job_id,
+ const char *buf, int size);
+
+int
+ijs_client_open (IjsClientCtx *ctx);
+
+int
+ijs_client_close (IjsClientCtx *ctx);
+
+int
+ijs_client_begin_job (IjsClientCtx *ctx, IjsJobId job_id);
+
+int
+ijs_client_end_job (IjsClientCtx *ctx, IjsJobId job_id);
+
+int
+ijs_client_list_params (IjsClientCtx *ctx, IjsJobId job_id,
+ char *value, int value_size);
+
+int
+ijs_client_enum_param (IjsClientCtx *ctx, IjsJobId job_id,
+ const char *key, char *value,
+ int value_size);
+
+int
+ijs_client_set_param (IjsClientCtx *ctx, IjsJobId job_id,
+ const char *key, const char *value,
+ int value_size);
+
+int
+ijs_client_get_param (IjsClientCtx *ctx, IjsJobId job_id,
+ const char *key, char *value,
+ int value_size);
+
+int
+ijs_client_begin_page (IjsClientCtx *ctx, IjsJobId job_id);
+
+int
+ijs_client_end_page (IjsClientCtx *ctx, IjsJobId job_id);
+
+int
+ijs_client_get_version (IjsClientCtx *ctx);
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/prnt/hpijs/ijs_server.c b/prnt/hpijs/ijs_server.c
new file mode 100644
index 0000000..2365fcd
--- /dev/null
+++ b/prnt/hpijs/ijs_server.c
@@ -0,0 +1,895 @@
+/**
+ * Copyright (c) 2001-2004 artofcode LLC.
+ *
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use, copy,
+ * modify, merge, publish, distribute, sublicense, and/or sell copies
+ * of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+**/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include "unistd_.h"
+#include <string.h>
+
+#include "ijs.h"
+#include "ijs_server.h"
+
+#define noVERBOSE
+
+typedef enum {
+ IJS_N_CHAN_SET = 1,
+ IJS_BPS_SET = 2,
+ IJS_CS_SET = 4,
+ IJS_WIDTH_SET = 8,
+ IJS_HEIGHT_SET = 16,
+ IJS_DPI_SET = 32
+} IjsFieldsSet;
+
+#define IJS_FIELDS_REQUIRED (IJS_N_CHAN_SET | IJS_BPS_SET | IJS_CS_SET | \
+ IJS_WIDTH_SET | IJS_HEIGHT_SET | IJS_DPI_SET)
+
+struct _IjsServerCtx {
+ int fd_from;
+ int child_pid;
+ IjsSendChan send_chan;
+ IjsRecvChan recv_chan;
+ int version;
+
+ /* callbacks */
+ IjsBeginJobCb *begin_cb;
+ void *begin_cb_data;
+ IjsEndJobCb *end_cb;
+ void *end_cb_data;
+ IjsQueryStatusCb *status_cb;
+ void *status_cb_data;
+ IjsListParamsCb *list_cb;
+ void *list_cb_data;
+ IjsEnumParamCb *enum_cb;
+ void *enum_cb_data;
+ IjsSetParamCb *set_cb;
+ void *set_cb_data;
+ IjsGetParamCb *get_cb;
+ void *get_cb_data;
+
+ ijs_bool in_job;
+ IjsJobId job_id;
+
+ IjsPageHeader *ph;
+
+ /* This should be IjsFieldsSet, but David Suffield reports that this
+ causes problems when compiling with g++. */
+ int fields_set;
+ ijs_bool in_page;
+
+ char *buf;
+ int buf_size;
+ int buf_ix;
+ char *overflow_buf;
+ int overflow_buf_size;
+ int overflow_buf_ix;
+};
+
+static int
+ijs_server_dummy_begin_cb (void *begin_cb_data,
+ IjsServerCtx *ctx,
+ IjsJobId job_id)
+{
+ return 0;
+}
+
+static int
+ijs_server_dummy_end_cb (void *end_cb_data,
+ IjsServerCtx *ctx,
+ IjsJobId job_id)
+{
+ return 0;
+}
+
+IjsServerCtx *
+ijs_server_init (void)
+{
+ ijs_bool ok = TRUE;
+ char helo_buf[8];
+ char resp_buf[8];
+ int nbytes;
+ IjsServerCtx *ctx = (IjsServerCtx *)malloc (sizeof(IjsServerCtx));
+ int fd_from, fd_to;
+
+ memcpy (resp_buf, IJS_RESP_STR, sizeof(resp_buf));
+
+ fd_from = 0;
+ fd_to = 1;
+#ifdef _MSC_VER
+ _setmode(fd_from, _O_BINARY);
+ _setmode(fd_to, _O_BINARY);
+#endif
+#ifdef VERBOSE
+ fprintf (stderr, "fd_from = %d, fd_to = %d\n", fd_from, fd_to);
+#endif
+ ijs_recv_init (&ctx->recv_chan, fd_from);
+ ijs_send_init (&ctx->send_chan, fd_to);
+ nbytes = read (ctx->recv_chan.fd, helo_buf, sizeof(helo_buf));
+
+ if (nbytes != sizeof(helo_buf))
+ ok = FALSE;
+
+ if (ok)
+ nbytes = write (ctx->send_chan.fd, resp_buf, sizeof(resp_buf));
+ if (nbytes != sizeof(resp_buf))
+ ok = FALSE;
+
+ ctx->in_job = FALSE;
+ ctx->job_id = -1;
+
+ ctx->ph = NULL;
+ ctx->in_page = FALSE;
+ ctx->buf = NULL;
+ ctx->overflow_buf = NULL;
+
+ ctx->begin_cb = ijs_server_dummy_begin_cb;
+ ctx->end_cb = ijs_server_dummy_end_cb;
+
+ if (ok)
+ return ctx;
+ else
+ {
+ ijs_server_done (ctx);
+ return NULL;
+ }
+}
+
+int
+ijs_server_install_begin_cb (IjsServerCtx *ctx,
+ IjsBeginJobCb *begin_cb, void *begin_cb_data)
+{
+ ctx->begin_cb = begin_cb;
+ ctx->begin_cb_data = begin_cb_data;
+ return 0;
+}
+
+int
+ijs_server_install_end_cb (IjsServerCtx *ctx,
+ IjsEndJobCb *end_cb, void *end_cb_data)
+{
+ ctx->end_cb = end_cb;
+ ctx->end_cb_data = end_cb_data;
+ return 0;
+}
+
+int
+ijs_server_install_status_cb (IjsServerCtx *ctx,
+ IjsQueryStatusCb *status_cb,
+ void *status_cb_data)
+{
+ ctx->status_cb = status_cb;
+ ctx->status_cb_data = status_cb_data;
+ return 0;
+}
+
+int
+ijs_server_install_list_cb (IjsServerCtx *ctx,
+ IjsListParamsCb *list_cb, void *list_cb_data)
+{
+ ctx->list_cb = list_cb;
+ ctx->list_cb_data = list_cb_data;
+ return 0;
+}
+
+int
+ijs_server_install_enum_cb (IjsServerCtx *ctx,
+ IjsEnumParamCb *enum_cb, void *enum_cb_data)
+{
+ ctx->enum_cb = enum_cb;
+ ctx->enum_cb_data = enum_cb_data;
+ return 0;
+}
+
+int
+ijs_server_install_set_cb (IjsServerCtx *ctx,
+ IjsSetParamCb *set_cb, void *set_cb_data)
+{
+ ctx->set_cb = set_cb;
+ ctx->set_cb_data = set_cb_data;
+ return 0;
+}
+
+int
+ijs_server_install_get_cb (IjsServerCtx *ctx,
+ IjsGetParamCb *get_cb, void *get_cb_data)
+{
+ ctx->get_cb = get_cb;
+ ctx->get_cb_data = get_cb_data;
+ return 0;
+}
+
+static int
+ijs_server_ack (IjsServerCtx *ctx)
+{
+ int status;
+
+ status = ijs_send_begin (&ctx->send_chan, IJS_CMD_ACK);
+ if (status < 0)
+ return status;
+ return ijs_send_buf (&ctx->send_chan);
+}
+
+void
+ijs_server_done (IjsServerCtx *ctx)
+{
+ /* todo: close channels */
+ ijs_server_ack (ctx);
+
+ free (ctx);
+}
+
+static int
+ijs_server_nak (IjsServerCtx *ctx, int errorcode)
+{
+ int status;
+
+ status = ijs_send_begin (&ctx->send_chan, IJS_CMD_NAK);
+ if (status < 0)
+ return status;
+ status = ijs_send_int (&ctx->send_chan, errorcode);
+ if (status < 0)
+ return status;
+ return ijs_send_buf (&ctx->send_chan);
+}
+
+/* The return code is: 0 if ok, positive on normal exit, negative on error */
+typedef int (*ijs_server_proc) (IjsServerCtx *ctx);
+
+static int
+ijs_server_proc_ack (IjsServerCtx *ctx)
+{
+ /* servers should not get ack commands */
+ return IJS_EPROTO;
+}
+
+static int
+ijs_server_proc_nak (IjsServerCtx *ctx)
+{
+ /* servers should not get nak commands */
+ return IJS_EPROTO;
+}
+
+static int
+ijs_server_proc_ping (IjsServerCtx *ctx)
+{
+ int status;
+ int version;
+
+ status = ijs_recv_int (&ctx->recv_chan, &version);
+ if (status < 0)
+ return status;
+ if (version > IJS_VERSION)
+ version = IJS_VERSION;
+ ctx->version = version;
+
+#ifdef VERBOSE
+ fprintf (stderr, "ping version=%d\n", version);
+#endif
+ status = ijs_send_begin (&ctx->send_chan, IJS_CMD_PONG);
+ if (status < 0)
+ return status;
+ status = ijs_send_int (&ctx->send_chan, IJS_VERSION);
+ if (status < 0)
+ return status;
+ return ijs_send_buf (&ctx->send_chan);
+}
+
+static int
+ijs_server_proc_pong (IjsServerCtx *ctx)
+{
+ /* servers should not get pong commands */
+ return IJS_EPROTO;
+}
+
+static int
+ijs_server_proc_open (IjsServerCtx *ctx)
+{
+ /* A server might allocate tables here. */
+ return ijs_server_ack (ctx);
+}
+
+static int
+ijs_server_proc_close (IjsServerCtx *ctx)
+{
+ /* A server might deallocate memory here. */
+ return ijs_server_ack (ctx);
+}
+
+static int
+ijs_server_proc_begin_job (IjsServerCtx *ctx)
+{
+ int code;
+ IjsJobId job_id;
+
+ code = ijs_recv_int (&ctx->recv_chan, &job_id);
+ if (code < 0) return code;
+
+ if (ctx->in_job)
+ return ijs_server_nak (ctx, IJS_ETOOMANYJOBS);
+ ctx->in_job = TRUE;
+ ctx->job_id = job_id;
+
+ return ijs_server_ack (ctx);
+}
+
+static int
+ijs_server_proc_end_job (IjsServerCtx *ctx)
+{
+ int code;
+ IjsJobId job_id;
+
+ code = ijs_recv_int (&ctx->recv_chan, &job_id);
+ if (code < 0) return code;
+
+ if (!ctx->in_job || job_id != ctx->job_id)
+ return ijs_server_nak (ctx, IJS_EJOBID);
+ ctx->in_job = FALSE;
+
+ return ijs_server_ack (ctx);
+}
+
+static int
+ijs_server_proc_cancel_job (IjsServerCtx *ctx)
+{
+ int code;
+ IjsJobId job_id;
+
+ code = ijs_recv_int (&ctx->recv_chan, &job_id);
+ if (code < 0) return code;
+
+ if (!ctx->in_job || job_id != ctx->job_id)
+ return ijs_server_nak (ctx, IJS_EJOBID);
+ /* todo: call cancel callback here */
+ ctx->in_job = FALSE;
+
+ return ijs_server_ack (ctx);
+}
+
+static int
+ijs_server_proc_query_status (IjsServerCtx *ctx)
+{
+ int code;
+ IjsJobId job_id;
+
+ code = ijs_recv_int (&ctx->recv_chan, &job_id);
+ if (code < 0)
+ return code;
+
+ if (!ctx->in_job || ctx->job_id != job_id)
+ return ijs_server_nak (ctx, IJS_EJOBID);
+
+ code = ctx->status_cb (ctx->list_cb_data, ctx, job_id);
+ if (code < 0)
+ return ijs_server_nak (ctx, code);
+ else
+ {
+ int status;
+
+ status = ijs_send_begin (&ctx->send_chan, IJS_CMD_ACK);
+ if (status < 0)
+ return status;
+ status = ijs_send_int (&ctx->send_chan, code);
+ if (status < 0)
+ return status;
+ return ijs_send_buf (&ctx->send_chan);
+ }
+}
+
+static int
+ijs_server_proc_list_params (IjsServerCtx *ctx)
+{
+ int code;
+ char buf[4096];
+ IjsJobId job_id;
+
+ code = ijs_recv_int (&ctx->recv_chan, &job_id);
+ if (code < 0)
+ return code;
+
+ if (!ctx->in_job || ctx->job_id != job_id)
+ return ijs_server_nak (ctx, IJS_EJOBID);
+
+ code = ctx->list_cb (ctx->list_cb_data, ctx, job_id, buf, sizeof(buf));
+ if (code < 0)
+ return ijs_server_nak (ctx, code);
+ else
+ {
+ int status;
+
+ status = ijs_send_begin (&ctx->send_chan, IJS_CMD_ACK);
+ if (status < 0)
+ return status;
+ status = ijs_send_block (&ctx->send_chan, buf, code);
+ if (status < 0)
+ return status;
+ return ijs_send_buf (&ctx->send_chan);
+ }
+}
+
+static int
+ijs_server_proc_enum_param (IjsServerCtx *ctx)
+{
+ const char *key;
+ int key_size;
+ int code;
+ char buf[4096];
+ IjsJobId job_id;
+
+ code = ijs_recv_int (&ctx->recv_chan, &job_id);
+ if (code < 0)
+ return code;
+
+ if (!ctx->in_job || ctx->job_id != job_id)
+ return ijs_server_nak (ctx, IJS_EJOBID);
+
+ key = ctx->recv_chan.buf + ctx->recv_chan.buf_idx;
+ key_size = ctx->recv_chan.buf_size - ctx->recv_chan.buf_idx;
+ if (key_size == 0 || key[key_size - 1])
+ return IJS_ESYNTAX;
+#ifdef VERBOSE
+ fprintf (stderr, "ijs_server_proc_enum_param, key_size = %d\n", key_size);
+#endif
+
+ code = ctx->enum_cb (ctx->enum_cb_data, ctx, job_id, key, buf, sizeof(buf));
+ if (code < 0)
+ return ijs_server_nak (ctx, code);
+ else
+ {
+ int status;
+
+ status = ijs_send_begin (&ctx->send_chan, IJS_CMD_ACK);
+ if (status < 0)
+ return status;
+ status = ijs_send_block (&ctx->send_chan, buf, code);
+ if (status < 0)
+ return status;
+ return ijs_send_buf (&ctx->send_chan);
+ }
+}
+
+static int
+ijs_strnlen (const char *s, int size)
+{
+ int i;
+
+ for (i = 0; i < size; i++)
+ if (s[i] == 0)
+ return i;
+ return size;
+}
+
+static int
+ijs_server_parse_int (const char *value, int size, int *result)
+{
+ int num = 0;
+ int i;
+ int sign = 1;
+
+ i = 0;
+ if (i == size)
+ return IJS_ESYNTAX;
+ if (value[i] == '-')
+ {
+ sign = -1;
+ i++;
+ }
+
+ if (i == size)
+ return IJS_ESYNTAX;
+
+ for (; i < size; i++)
+ {
+ char c = value[i];
+ if (c < '0' || c > '9')
+ return IJS_ESYNTAX;
+ num = (num * 10) + (c - '0');
+ }
+ *result = num;
+ return 0;
+}
+
+static int
+ijs_server_parse_float (const char *value, int size, double *result)
+{
+ char buf[256];
+ char *tail;
+
+ if (size + 1 > sizeof(buf))
+ return IJS_EBUF;
+ memcpy (buf, value, size);
+ buf[size] = 0;
+ *result = strtod (buf, &tail);
+ if (tail == buf)
+ return IJS_ESYNTAX;
+ return 0;
+}
+
+static int
+ijs_server_set_param (IjsServerCtx *ctx, IjsJobId job_id, const char *key,
+ const char *value, int value_size)
+{
+ int code;
+
+#ifdef VERBOSE
+ fprintf (stderr, "set_param %s = ", key);
+ fwrite (value, 1, value_size, stderr);
+ fputs ("\n", stderr);
+#endif
+ if (!strcmp (key, "NumChan"))
+ {
+ code = ijs_server_parse_int (value, value_size, &ctx->ph->n_chan);
+ if (code == 0)
+ ctx->fields_set |= IJS_N_CHAN_SET;
+ return code;
+ }
+ else if (!strcmp (key, "BitsPerSample"))
+ {
+ code = ijs_server_parse_int (value, value_size, &ctx->ph->bps);
+ if (code == 0)
+ ctx->fields_set |= IJS_BPS_SET;
+ return code;
+ }
+ else if (!strcmp (key, "ColorSpace"))
+ {
+ int size = value_size;
+
+ if (size > (int)sizeof(ctx->ph->cs) - 1)
+ size = sizeof(ctx->ph->cs) - 1;
+ memcpy (ctx->ph->cs, value, size);
+ ctx->ph->cs[size] = 0;
+ ctx->fields_set |= IJS_CS_SET;
+ return 0;
+ }
+ else if (!strcmp (key, "Width"))
+ {
+ code = ijs_server_parse_int (value, value_size, &ctx->ph->width);
+ if (code == 0)
+ ctx->fields_set |= IJS_WIDTH_SET;
+ return code;
+ }
+ else if (!strcmp (key, "Height"))
+ {
+ code = ijs_server_parse_int (value, value_size, &ctx->ph->height);
+ if (code == 0)
+ ctx->fields_set |= IJS_HEIGHT_SET;
+ return code;
+ }
+ else if (!strcmp (key, "Dpi"))
+ {
+ int x_ix;
+
+ for (x_ix = 0; x_ix < value_size; x_ix++)
+ if (value[x_ix] == 'x')
+ break;
+ if (x_ix == value_size)
+ return IJS_ESYNTAX;
+ code = ijs_server_parse_float (value, x_ix, &ctx->ph->xres);
+ if (code < 0)
+ return code;
+ code = ijs_server_parse_float (value + x_ix + 1, value_size - (x_ix + 1),
+ &ctx->ph->yres);
+ if (code < 0)
+ return code;
+ ctx->fields_set |= IJS_DPI_SET;
+ return 0;
+ }
+ else
+ {
+ return ctx->set_cb (ctx->set_cb_data, ctx, job_id, key, value, value_size);
+ }
+}
+
+static int
+ijs_server_proc_set_param (IjsServerCtx *ctx)
+{
+ const char *key, *value;
+ int key_size, value_size;
+ IjsJobId job_id;
+ int param_size;
+ int code;
+
+ code = ijs_recv_int (&ctx->recv_chan, &job_id);
+ if (code < 0)
+ return code;
+
+ if (!ctx->in_job || ctx->job_id != job_id)
+ return ijs_server_nak (ctx, IJS_EJOBID);
+
+ code = ijs_recv_int (&ctx->recv_chan, &param_size);
+ if (code < 0)
+ return code;
+ if (param_size != ctx->recv_chan.buf_size - ctx->recv_chan.buf_idx)
+ return IJS_EPROTO;
+ key = ctx->recv_chan.buf + ctx->recv_chan.buf_idx;
+ key_size = ijs_strnlen (key, ctx->recv_chan.buf_size);
+ if (key_size == param_size)
+ return IJS_EPROTO;
+ value = key + key_size + 1;
+ value_size = param_size - (key_size + 1);
+ code = ijs_server_set_param (ctx, job_id, key, value, value_size);
+ if (code)
+ return ijs_server_nak (ctx, code);
+ else
+ return ijs_server_ack (ctx);
+}
+
+static int
+ijs_server_get_param (IjsServerCtx *ctx, IjsJobId job_id, const char *key,
+ char *value, int value_size)
+{
+#ifdef VERBOSE
+ fprintf (stderr, "ijs_server_get_param %s\n", key);
+#endif
+ return ctx->get_cb (ctx->get_cb_data, ctx, job_id, key,
+ value, value_size);
+}
+
+static int
+ijs_server_proc_get_param (IjsServerCtx *ctx)
+{
+ const char *key;
+ int key_size;
+ int code;
+ char buf[4096];
+ IjsJobId job_id;
+
+ code = ijs_recv_int (&ctx->recv_chan, &job_id);
+ if (code < 0)
+ return code;
+
+ if (!ctx->in_job || ctx->job_id != job_id)
+ return ijs_server_nak (ctx, IJS_EJOBID);
+
+ key = ctx->recv_chan.buf + ctx->recv_chan.buf_idx;
+ key_size = ctx->recv_chan.buf_size - ctx->recv_chan.buf_idx;
+ if (key_size == 0 || key[key_size - 1])
+ return IJS_ESYNTAX;
+#ifdef VERBOSE
+ fprintf (stderr, "ijs_server_proc_get_param, key_size = %d\n", key_size);
+#endif
+
+ code = ijs_server_get_param (ctx, job_id, key, buf, sizeof(buf));
+ if (code < 0)
+ return ijs_server_nak (ctx, code);
+ else
+ {
+ int status;
+
+ status = ijs_send_begin (&ctx->send_chan, IJS_CMD_ACK);
+ if (status < 0)
+ return status;
+ status = ijs_send_block (&ctx->send_chan, buf, code);
+ if (status < 0)
+ return status;
+ return ijs_send_buf (&ctx->send_chan);
+ }
+}
+
+static int
+ijs_server_proc_begin_page (IjsServerCtx *ctx)
+{
+ IjsPageHeader *ph = ctx->ph;
+ int status = 0;
+
+ if (ph == NULL)
+ status = IJS_EPROTO;
+ if ((ctx->fields_set & IJS_FIELDS_REQUIRED) != IJS_FIELDS_REQUIRED)
+ status = IJS_EPROTO;
+#ifdef VERBOSE
+ fprintf (stderr, "begin page %d %d %d %d %d\n",
+ ph->n_chan, ph->bps, ph->cs, ph->width, ph->height);
+#endif
+ if (!status)
+ {
+ ctx->in_page = TRUE;
+ return ijs_server_ack (ctx);
+ }
+ else
+ return ijs_server_nak (ctx, status);
+}
+
+static int
+ijs_server_read_data (IjsServerCtx *ctx, char *buf, int size)
+{
+ int status;
+
+ status = ijs_recv_read (&ctx->recv_chan, buf, size);
+ return (status == size) ? 0 : IJS_EIO;
+}
+
+static int
+ijs_server_proc_send_data_block (IjsServerCtx *ctx)
+{
+ int size;
+ int status = 0;
+ IjsJobId job_id;
+
+ status = ijs_recv_int (&ctx->recv_chan, &job_id);
+ if (status < 0) return status;
+
+ if (!ctx->in_job || job_id != ctx->job_id)
+ status = IJS_EJOBID;
+ else if (ctx->buf == NULL)
+ status = IJS_EPROTO;
+
+ if (!status) status = ijs_recv_int (&ctx->recv_chan, &size);
+
+#ifdef VERBOSE
+ fprintf (stderr, "status=%d, send data block id=%d, size=%d\n",
+ status, job_id, size);
+#endif
+ if (status)
+ return ijs_server_nak (ctx, status);
+
+ if (size <= ctx->buf_size - ctx->buf_ix)
+ {
+ status = ijs_server_read_data (ctx, ctx->buf + ctx->buf_ix, size);
+ ctx->buf_ix += size;
+ }
+ else
+ {
+ ctx->overflow_buf_size = size - (ctx->buf_size - ctx->buf_ix);
+ ctx->overflow_buf = (char *)malloc (ctx->overflow_buf_size);
+ ctx->overflow_buf_ix = 0;
+ status = ijs_server_read_data (ctx, ctx->buf + ctx->buf_ix,
+ ctx->buf_size - ctx->buf_ix);
+ ctx->buf_ix = ctx->buf_size;
+ if (!status)
+ {
+ status = ijs_server_read_data (ctx, ctx->overflow_buf,
+ ctx->overflow_buf_size);
+ }
+ }
+ return ijs_server_ack (ctx);
+}
+
+static int
+ijs_server_proc_end_page (IjsServerCtx *ctx)
+{
+#ifdef VERBOSE
+ fprintf (stderr, "end page\n");
+#endif
+ return ijs_server_ack (ctx);
+}
+
+static int
+ijs_server_proc_exit (IjsServerCtx *ctx)
+{
+ return 1;
+}
+
+ijs_server_proc ijs_server_procs[] = {
+ ijs_server_proc_ack,
+ ijs_server_proc_nak,
+ ijs_server_proc_ping,
+ ijs_server_proc_pong,
+ ijs_server_proc_open,
+ ijs_server_proc_close,
+ ijs_server_proc_begin_job,
+ ijs_server_proc_end_job,
+ ijs_server_proc_cancel_job,
+ ijs_server_proc_query_status,
+ ijs_server_proc_list_params,
+ ijs_server_proc_enum_param,
+ ijs_server_proc_set_param,
+ ijs_server_proc_get_param,
+ ijs_server_proc_begin_page,
+ ijs_server_proc_send_data_block,
+ ijs_server_proc_end_page,
+ ijs_server_proc_exit
+};
+
+int
+ijs_server_iter (IjsServerCtx *ctx)
+{
+ int cmd_num;
+ int status;
+
+ status = ijs_recv_buf (&ctx->recv_chan);
+
+ if (status < 0)
+ return status;
+
+ cmd_num = ijs_get_int (ctx->recv_chan.buf);
+#ifdef VERBOSE
+ fprintf (stderr, "command %d, %d bytes\n", cmd_num, ctx->recv_chan.buf_size);
+#endif
+ if (cmd_num < 0 ||
+ cmd_num >= (int)sizeof(ijs_server_procs) / sizeof(ijs_server_procs[0]))
+ return -1;
+ return ijs_server_procs[cmd_num] (ctx);
+}
+
+/**
+ * ijs_server_get_page_header: Get the page header.
+ * @ctx: The server context.
+ * @ph: Where to store the page header.
+ *
+ * Return value: 0 on success, 1 on normal exit, negative on error.
+ **/
+int
+ijs_server_get_page_header (IjsServerCtx *ctx, IjsPageHeader *ph)
+{
+ int status;
+
+ ctx->ph = ph;
+ ctx->in_page = FALSE;
+
+ do
+ {
+ status = ijs_server_iter (ctx);
+ }
+ while (status == 0 && !ctx->in_page);
+
+ ctx->ph = NULL;
+ return status;
+}
+
+/**
+ * ijs_server_get_data: Get data from client.
+ * @ctx: The server context.
+ * @buf: Buffer for data being read.
+ * @size: Size of buf.
+ *
+ * Gets data from client. Data is stored in @buf or the
+ * overflow_buf.
+ *
+ * Return value: Number of bytes read, -1 on end of page, or < 0 on
+ * error.
+ **/
+int
+ijs_server_get_data (IjsServerCtx *ctx, char *buf, int size)
+{
+ int buf_ix = 0;
+ int status = 0;
+
+#ifdef VERBOSE
+ fprintf (stderr, "ijs_server_get_data %d\n", size);
+#endif
+
+ if (ctx->overflow_buf != NULL)
+ {
+ int n_bytes = ctx->overflow_buf_size - ctx->overflow_buf_ix;
+ if (n_bytes > size)
+ n_bytes = size;
+ memcpy (buf, ctx->overflow_buf + ctx->overflow_buf_ix, n_bytes);
+ ctx->overflow_buf_ix += n_bytes;
+ buf_ix = n_bytes;
+ if (ctx->overflow_buf_ix == ctx->overflow_buf_size)
+ {
+ free (ctx->overflow_buf);
+ ctx->overflow_buf = NULL;
+ ctx->overflow_buf_size = 0;
+ ctx->overflow_buf_ix = 0;
+ }
+ }
+ ctx->buf = buf;
+ ctx->buf_size = size;
+ ctx->buf_ix = buf_ix;
+ while (!status && ctx->buf_ix < size)
+ {
+ status = ijs_server_iter (ctx);
+ }
+ ctx->buf = NULL;
+ return status;
+}
diff --git a/prnt/hpijs/ijs_server.h b/prnt/hpijs/ijs_server.h
new file mode 100644
index 0000000..0dc00ae
--- /dev/null
+++ b/prnt/hpijs/ijs_server.h
@@ -0,0 +1,128 @@
+/**
+ * Copyright (c) 2001-2002 artofcode LLC.
+ *
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use, copy,
+ * modify, merge, publish, distribute, sublicense, and/or sell copies
+ * of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+**/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct _IjsServerCtx IjsServerCtx;
+
+typedef struct {
+ int n_chan; /* number of channels */
+ int bps; /* bits per sample, one of 1, 2, 4, 8, 16 */
+ char cs[256]; /* color space, as string */
+ int width; /* in pixels */
+ int height;
+ double xres; /* in dpi */
+ double yres;
+} IjsPageHeader;
+
+/* callbacks, lots of callbacks */
+
+typedef int IjsBeginJobCb (void *begin_cb_data,
+ IjsServerCtx *ctx,
+ IjsJobId job_id);
+
+typedef int IjsEndJobCb (void *end_cb_data,
+ IjsServerCtx *ctx,
+ IjsJobId job_id);
+
+typedef int IjsQueryStatusCb (void *status_cb_data,
+ IjsServerCtx *ctx,
+ IjsJobId job_id);
+
+typedef int IjsListParamsCb (void *list_cb_data,
+ IjsServerCtx *ctx,
+ IjsJobId job_id,
+ char *val_buf,
+ int val_size);
+
+typedef int IjsEnumParamCb (void *enum_cb_data,
+ IjsServerCtx *ctx,
+ IjsJobId job_id,
+ const char *key,
+ char *val_buf,
+ int val_size);
+
+typedef int IjsSetParamCb (void *set_cb_data,
+ IjsServerCtx *ctx,
+ IjsJobId job_id,
+ const char *key,
+ const char *value,
+ int value_size);
+
+typedef int IjsGetParamCb (void *get_cb_data,
+ IjsServerCtx *ctx,
+ IjsJobId job_id,
+ const char *key,
+ char *val_buf,
+ int val_size);
+
+IjsServerCtx *
+ijs_server_init (void);
+
+int
+ijs_server_install_begin_cb (IjsServerCtx *ctx,
+ IjsBeginJobCb *begin_cb, void *begin_cb_data);
+
+int
+ijs_server_install_end_cb (IjsServerCtx *ctx,
+ IjsEndJobCb *end_cb, void *end_cb_data);
+
+int
+ijs_server_install_status_cb (IjsServerCtx *ctx,
+ IjsQueryStatusCb *status_cb,
+ void *status_cb_data);
+
+int
+ijs_server_install_list_cb (IjsServerCtx *ctx,
+ IjsListParamsCb *list_cb, void *list_cb_data);
+
+int
+ijs_server_install_enum_cb (IjsServerCtx *ctx,
+ IjsEnumParamCb *enum_cb, void *enum_cb_data);
+
+int
+ijs_server_install_set_cb (IjsServerCtx *ctx,
+ IjsSetParamCb *set_cb, void *set_cb_data);
+
+int
+ijs_server_install_get_cb (IjsServerCtx *ctx,
+ IjsGetParamCb *get_cb, void *get_cb_data);
+
+void
+ijs_server_done (IjsServerCtx *ctx);
+
+int
+ijs_server_iter (IjsServerCtx *ctx);
+
+int
+ijs_server_get_page_header (IjsServerCtx *ctx, IjsPageHeader *ph);
+
+int
+ijs_server_get_data (IjsServerCtx *ctx, char *buf, int size);
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/prnt/hpijs/internal.h b/prnt/hpijs/internal.h
new file mode 100644
index 0000000..fb3f1b0
--- /dev/null
+++ b/prnt/hpijs/internal.h
@@ -0,0 +1,1303 @@
+/*****************************************************************************\
+ internal.h : Interface for internal classes
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#ifndef APDK_INTERNAL_H
+#define APDK_INTERNAL_H
+
+APDK_BEGIN_NAMESPACE
+
+/////////////////////////////////////////////////////////////////////////
+// contains all class declarations
+// for Slimhost++ driver
+//
+// merged in from file "Objects.h" 5/18/98
+/////////////////////////////////////////////////////////////////////////
+// these correspond to PCL codes
+typedef int TYPEFACE;
+#define COURIER 3
+#define LETTERGOTHIC 6
+#define CGTIMES 4101
+#define UNIVERS 52
+
+// character set names for PCL
+#define LATIN1 "0N" // aka ECMA94
+#define PC8 "10U"
+#define HP_LEGAL "1U"
+
+
+// used to encourage consistent ordering of color planes
+#define K 0
+#define C 1
+#define M 2
+#define Y 3
+#define Clight 4
+#define Mlight 5
+
+#define RANDSEED 77
+
+
+#define DEFAULT_SLOW_POLL_COUNT 30
+#define DEFAULT_SLOW_POLL_BIDI 3
+
+//////////////////////////////////////////
+
+enum STYLE_TYPE { UPRIGHT, ITALIC };
+
+enum WEIGHT_TYPE { NORMAL, BOLD };
+
+enum DATA_FORMAT { RASTER_LINE, RASTER_STRIP };
+
+
+///////////////////////////////////////////////////////////////////
+
+#define MAX_ESC_SEQ 40
+#define MAX_RASTERSIZE 10000 // REVISIT
+
+#define MAX_Y_OFFSET 32767
+// very frequently used fragments made into macros for readability
+#define CERRCHECK if (constructor_error != NO_ERROR) {DBG1("CERRCHECK fired\n"); return;}
+#define ERRCHECK if (err != NO_ERROR) {DBG1("ERRCHECK fired\n"); return err;}
+#define NEWCHECK(x) if (x==NULL) return ALLOCMEM_ERROR;
+#define CNEWCHECK(x) if (x==NULL) { constructor_error=ALLOCMEM_ERROR; return; }
+
+
+
+//////// STATIC DATA ////////////////////////////////////////////////////////////////
+// escape sequences -- see PCL Implementor's Guide or Software Developer's PCL Guides
+// for documentation
+#define ESC 0x1b
+
+const char UEL[] = {ESC, '%', '-','1','2','3','4','5','X' };
+const char EnterLanguage[] = {'@','P','J','L',' ','E','N','T','E','R',' ',
+ 'L','A','N','G','U','A','G','E','=' };
+const char PCL3[] = {'P','C','L','3' };
+const char PCLGUI[] = {'P','C','L','3','G','U','I' };
+const char JobName[] = {'@','P','J','L',' ','J','O','B',' ','N','A','M','E',' ','=',' '};
+const char Reset[] = {ESC,'E'};
+const char crdStart[] = {ESC, '*', 'g'}; // configure raster data command
+const char cidStart[] = {ESC, '*', 'v'}; // configure image data command
+const char crdFormat = 2; // only format for 600
+const char grafStart[] = {ESC, '*', 'r', '1', 'A'}; // raster graphics mode
+const char grafMode0[] = {ESC, '*', 'b', '0', 'M'}; // compression methods
+const char grafMode9[] = {ESC, '*', 'b', '9', 'M'};
+const char grafMode2[] = {ESC, '*', 'b', '2', 'M'};
+const char SeedSame[] = {ESC, '*', 'b', '0', 'S'};
+//const char EjectPage[] = {ESC, '&', 'l', '0', 'H'}; // not needed by us; will pick if no page already picked
+const char BlackExtractOff[] = {ESC, '*', 'o', '5', 'W', 0x04, 0xC, 0, 0, 0 };
+const char LF = '\012';
+const char Quote = '\042';
+const BYTE DJ895_Power_On[] = {ESC, '%','P','u','i','f','p','.',
+ 'p','o','w','e','r',' ','1',';',
+ 'u','d','w','.','q','u','i','t',';',ESC,'%','-','1','2','3','4','5','X' };
+/*const BYTE DJ895_Pre_Pick[] = {ESC, '&', 'l', -2, 'H'};
+{ESC, '%','P','m','e','c','h','.',
+ 'l','o','a','d','_','p','a','p','e','r',';',
+ 'u','d','w','.','q','u','i','t',';' };//,ESC,'%','-','1','2','3','4','5','X' };
+*/
+const char EnableDuplex[] = { ESC,'&','l', '2', 'S'};
+const char NoDepletion[] = {ESC, '*', 'o', '1', 'D'};
+const char NoGrayBalance[] = {ESC, '*', 'b', '2', 'B'};
+const char EnableBufferFlushing[] = { ESC,'&','b','1','5','W','P','M','L',32,4,0,5,1,2,1,1,5,4,1,1 };
+const char DisableBufferFlushing[] = { ESC,'&','b','1','5','W','P','M','L',32,4,0,5,1,2,1,1,5,4,1,2 };
+const char DriverwareJobName[] = { ESC,'*','o','5','W',0x0d,0x06,0x00,0x00,0x01 };
+const BYTE PEN_CLEAN_PML[]={0x1B,0x45,0x1B,0x26,0x62,0x31,0x36,0x57,
+ 0x50,0x4D,0x4C,0x20, // EscE Esc&b16WPML{space}
+ 0x04,0x00,0x06,0x01,0x04,0x01,0x05,0x01,
+ 0x01,0x04,0x01,0x64}; // PML Marking-Agent-Maintenance=100
+
+//
+// ** move these to intenal.h
+
+struct fOptSubSig
+{
+ float pi;
+ const float *means;
+};
+
+
+struct fOptClassSig
+{
+ int nsubclasses;
+ float variance;
+ float inv_variance;
+ float cnst;
+ struct fOptSubSig *OptSubSig;
+};
+
+
+struct fOptSigSet
+{
+ int nbands;
+ struct fOptClassSig *OptClassSig;
+};
+
+
+struct RESSYNSTRUCT
+{
+ int Width;
+ int ScaleFactorMultiplier;
+ int ScaleFactorDivisor;
+// int CallerAlloc; // Who does the memory alloc.
+ int Remainder; // For use in non integer scaling cases
+ int Repeat; // When to send an extra output raster
+ int RastersinBuffer; // # of currently buffered rasters
+ unsigned char* Bufferpt[NUMBER_RASTERS];
+ int BufferSize;
+ unsigned char* Buffer;
+ struct fOptSigSet OS;
+ struct fOptSubSig rsOptSubSigPtr1[45];
+ struct fOptClassSig OCS;
+ float **joint_means;
+ float ***filter;
+ float filterPtr1[45];
+ float filterPtr2[45][9];
+ float joint_meansPtr1[45];
+
+};
+
+typedef enum
+{
+ COLORTYPE_COLOR, // 0
+ COLORTYPE_BLACK, // 1
+ COLORTYPE_BOTH
+} COLORTYPE;
+
+#define MAX_COLORTYPE 2
+
+struct RASTERDATA
+{
+ int rastersize[MAX_COLORTYPE];
+ BYTE* rasterdata[MAX_COLORTYPE];
+};
+
+// Bitmap structure definition
+struct HPRGBQUAD {
+ BYTE rgbBlue;
+ BYTE rgbGreen;
+ BYTE rgbRed;
+ BYTE rgbReserved;
+};
+
+struct HPBITMAPINFOHEADER{
+ DWORD biSize;
+ long biWidth;
+ long biHeight;
+ WORD biPlanes;
+ WORD biBitCount;
+ DWORD biCompression;
+ DWORD biSizeImage;
+ long biXPelsPerMeter;
+ long biYPelsPerMeter;
+ DWORD biClrUsed;
+ DWORD biClrImportant;
+};
+
+struct HPBITMAPINFO {
+ HPBITMAPINFOHEADER bmiHeader;
+ HPRGBQUAD bmiColors[1];
+};
+
+
+struct HPLJBITMAP {
+
+ HPBITMAPINFO bitmapInfo;
+ unsigned long cjBits;
+ BYTE *pvBits;
+ BYTE *pvAlignedBits;
+};
+
+
+//////////////////////////////////////////
+class Pipeline;
+//Scaler, Halftoner, ColorMatcher, ErnieFilter, PixelReplicator,
+//(FRE object, ...) are subclasses of Processor.
+
+
+//Processor
+//!\internal
+//! Executes the "Process" method in it's containee.
+/*!
+Enter a full description of the class here. This will be the API doc.
+
+\sa Scaler Halftoner ColorMatcher ErnieFilter PixelReplicator
+******************************************************************************/
+class Processor
+{
+public:
+ Processor();
+ virtual ~Processor();
+
+ //virtual BOOL Process(BYTE* InputRaster=NULL, unsigned int size=0)=0; // returns TRUE iff output ready
+ virtual BOOL Process(RASTERDATA *InputRaster=NULL)=0; // returns TRUE iff output ready
+ virtual void Flush()=0; // take any concluding actions based on internal state
+ virtual BYTE* NextOutputRaster(COLORTYPE rastercolor)=0;
+ virtual unsigned int GetOutputWidth(COLORTYPE rastercolor)=0; // in bytes, not pixels
+ virtual unsigned int GetMaxOutputWidth(COLORTYPE rastercolor) { return GetOutputWidth(rastercolor); }
+
+ unsigned int iRastersReady, iRastersDelivered;
+ Pipeline* myphase;
+ COLORTYPE myplane;
+ RASTERDATA raster;
+}; //Processor
+
+
+//Pipeline
+//! Manages the processes used in a pipeline
+/*!
+\internal
+Enter a full description of the class here. This will be the API doc.
+
+******************************************************************************/
+class Pipeline
+{
+public:
+ Pipeline(Processor* E);
+ virtual ~Pipeline();
+
+ void AddPhase(Pipeline* p); // add p at end
+
+ //DRIVER_ERROR Execute(BYTE* InputRaster=NULL, unsigned int size=0); // run pipeline
+ DRIVER_ERROR Execute(RASTERDATA* InputRaster=NULL); // run pipeline
+
+ DRIVER_ERROR Flush();
+
+ //BOOL Process(BYTE* InputRaster=NULL, unsigned int size=0); // call processor for this phase
+ BOOL Process(RASTERDATA* InputRaster=NULL); // call processor for this phase
+
+ BYTE* NextOutputRaster(COLORTYPE rastercolor) { return Exec->NextOutputRaster(rastercolor); }
+ unsigned int GetOutputWidth(COLORTYPE rastercolor) { return Exec->GetOutputWidth(rastercolor); }
+ unsigned int GetMaxOutputWidth(COLORTYPE rastercolor) { return Exec->GetMaxOutputWidth(rastercolor); }
+
+ Pipeline* next;
+ Pipeline* prev;
+
+ Processor* Exec;
+
+ DRIVER_ERROR err;
+
+}; //Pipeline
+
+struct PipeConfigTable
+{
+ BOOL bResSynth;
+
+#if defined(APDK_VIP_COLORFILTERING)
+ BOOL bErnie;
+#endif
+
+ BOOL bPixelReplicate;
+ BOOL bColorImage;
+ BOOL bCompress;
+ HALFTONING_ALGORITHM eHT;
+};
+
+
+//Scaler
+//! Scales input by a factor
+/*!
+\internal
+Enter a full description of the class here. This will be the API doc.
+
+******************************************************************************/
+class Scaler : public Processor
+{
+public:
+ // constructor protected -- use Create_Scaler()
+ virtual ~Scaler();
+ //virtual BOOL Process(BYTE* InputRaster=NULL, unsigned int size=0)=0;
+ BOOL Process(RASTERDATA* InputRaster=NULL)=0;
+ virtual void Flush() { Process(); }
+
+ DRIVER_ERROR constructor_error;
+
+ float ScaleFactor;
+ unsigned int remainder;
+
+ virtual unsigned int GetOutputWidth(COLORTYPE rastercolor);
+ virtual unsigned int GetMaxOutputWidth(COLORTYPE rastercolor);
+ virtual BYTE* NextOutputRaster(COLORTYPE rastercolor)=0;
+
+protected:
+ Scaler(SystemServices* pSys,unsigned int inputwidth,
+ unsigned int numerator,unsigned int denominator, BOOL vip, unsigned int BytesPerPixel);
+ SystemServices* pSS;
+
+ BOOL scaling; // false iff ScaleFactor==1.0
+ BOOL ReplicateOnly; // true iff 1<ScaleFactor<2
+
+
+ unsigned int iOutputWidth;
+ unsigned int iInputWidth;
+ BYTE* pOutputBuffer[MAX_COLORTYPE];
+ BOOL fractional;
+}; //Scaler
+
+#ifdef APDK_PSCRIPT
+class PScriptProxy;
+#endif
+
+#ifdef APDK_LJMONO
+class LJMonoProxy;
+#endif
+
+#ifdef APDK_LJCOLOR
+class LJColorProxy;
+#endif
+
+#ifdef APDK_LJJETREADY
+class LJJetReadyProxy;
+#endif
+
+#ifdef APDK_LJFASTRASTER
+class LJFastRasterProxy;
+#endif
+
+#ifdef APDK_LJZJS_MONO
+class LJZjsMonoProxy;
+#endif
+
+#ifdef APDK_LJZJS_COLOR
+class LJZjsColorProxy;
+#endif
+
+#ifdef APDK_LJM1005
+class LJM1005Proxy;
+class LJP1XXXProxy;
+#endif
+
+#if defined(APDK_PSP100) && defined (APDK_DJ9xxVIP)
+class PSP100Proxy;
+class PSP470Proxy;
+#endif
+
+#if defined(APDK_DJGENERICVIP) && defined (APDK_DJ9xxVIP)
+class DJGenericVIPProxy;
+class DJ55xxProxy;
+#endif
+
+#ifdef APDK_DJ9xxVIP
+class DJ9xxVIPProxy;
+class OJProKx50Proxy;
+#endif
+
+#ifdef APDK_DJ9xx
+class DJ9xxProxy;
+#endif
+
+#if defined(APDK_DJ8xx)|| defined(APDK_DJ9xx)
+class DJ8xxProxy;
+#endif
+
+#if defined(APDK_DJ8xx)|| defined(APDK_DJ9xx)
+#ifdef APDK_DJ8x5
+class DJ8x5Proxy;
+#endif
+#endif
+
+#if defined(APDK_DJ890)
+class DJ890Proxy;
+#endif
+
+#if defined(APDK_DJ850)
+class DJ850Proxy;
+#endif
+
+#ifdef APDK_DJ6xxPhoto
+class DJ6xxPhotoProxy;
+#endif
+
+#ifdef APDK_DJ6xx
+class DJ660Proxy;
+#endif
+
+#ifdef APDK_DJ630
+class DJ630Proxy;
+#endif
+
+#ifdef APDK_DJ600
+class DJ600Proxy;
+#endif
+
+#ifdef APDK_DJ540
+class DJ540Proxy;
+#endif
+
+#ifdef APDK_DJ400
+class DJ400Proxy;
+#endif
+
+#ifdef APDK_DJ350
+class DJ350Proxy;
+#endif
+
+#if defined(APDK_DJ3600) && defined (APDK_DJ3320)
+class DJ3600Proxy;
+class DJ4100Proxy;
+class DJD2600Proxy;
+#endif
+
+#if defined (APDK_DJ3320)
+class DJ3320Proxy;
+#endif
+
+#ifdef APDK_APOLLO2560
+class Apollo2560Proxy;
+#endif
+
+#ifdef APDK_APOLLO21XX
+class Apollo21xxProxy;
+#endif
+
+#ifdef APDK_APOLLO2XXX
+class Apollo2xxxProxy;
+#endif
+
+#ifdef APDK_QUICKCONNECT
+class QuickConnectProxy;
+#endif
+
+//DeviceRegistry
+//! Isolates device dependencies
+/*!
+\internal
+DeviceRegistry, for isolating all device dependencies
+The data is contained in Registry.cpp
+
+This object encapsulates all model-specific data for a build.
+Its features are presented to client through the PrintContext.
+
+******************************************************************************/
+class DeviceRegistry
+{
+public:
+ DeviceRegistry();
+ virtual ~DeviceRegistry();
+
+
+ // get model string from DevID string
+ DRIVER_ERROR ParseDevIDString(const char* sDevID, char* strModel, int *pVIPVersion, char* strPens);
+ // set "device" to index of entry
+ virtual DRIVER_ERROR SelectDevice(char* model, int* pVIPVersion, char* pens, SystemServices* pSS);
+
+ virtual DRIVER_ERROR SelectDevice(const char* sDevID, SystemServices* pSS);
+
+ virtual DRIVER_ERROR SelectDevice(const PRINTER_TYPE Model);
+
+ virtual DRIVER_ERROR GetPrinterModel(char* strModel, int* pVIPVersion, char* strPens, SystemServices* pSS);
+
+
+ // create a Printer object as pointee of p, using the given SystemServices
+ // and the current value of device; still needs to be configured
+ virtual DRIVER_ERROR InstantiatePrinter(Printer*& p,SystemServices* pSS);
+
+
+ int device; // ordinal of device from list (or UNSUPPORTED=-1)
+
+#ifdef APDK_PSCRIPT
+ static PScriptProxy s_PScriptProxy;
+#endif
+
+#ifdef APDK_LJMONO
+ static LJMonoProxy s_LJMonoProxy;
+#endif
+
+#ifdef APDK_LJCOLOR
+ static LJColorProxy s_LJColorProxy;
+#endif
+
+#ifdef APDK_LJJETREADY
+ static LJJetReadyProxy s_LJJetReadyProxy;
+#endif
+
+#ifdef APDK_LJFASTRASTER
+ static LJFastRasterProxy s_LJFastRasterProxy;
+#endif
+
+#ifdef APDK_LJZJS_MONO
+ static LJZjsMonoProxy s_LJZjsMonoProxy;
+#endif
+
+#ifdef APDK_LJZJS_COLOR
+ static LJZjsColorProxy s_LJZjsColorProxy;
+#endif
+
+#ifdef APDK_LJM1005
+ static LJM1005Proxy s_LJM1005Proxy;
+ static LJP1XXXProxy s_LJP1XXXProxy;
+#endif
+
+#if defined(APDK_PSP100) && defined (APDK_DJ9xxVIP)
+ static PSP100Proxy s_PSP100Proxy;
+ static PSP470Proxy s_PSP470Proxy;
+#endif
+
+#if defined(APDK_DJGENERICVIP) && defined (APDK_DJ9xxVIP)
+ static DJGenericVIPProxy s_DJGenericVIPProxy;
+ static DJ55xxProxy s_DJ55xxProxy;
+#endif
+
+#ifdef APDK_DJ9xxVIP
+ static DJ9xxVIPProxy s_DJ9xxVIPProxy;
+ static OJProKx50Proxy s_OJProKx50Proxy;
+#endif
+
+#ifdef APDK_DJ9xx
+ static DJ9xxProxy s_DJ9xxProxy;
+#endif
+
+#if defined(APDK_DJ8xx)|| defined(APDK_DJ9xx)
+ static DJ8xxProxy s_DJ8xxProxy;
+#endif
+
+#if defined(APDK_DJ8xx)|| defined(APDK_DJ9xx)
+#ifdef APDK_DJ8x5
+ static DJ8x5Proxy s_DJ8x5Proxy;
+#endif
+#endif
+
+#if defined(APDK_DJ890)
+ static DJ890Proxy s_DJ890Proxy;
+#endif
+
+#if defined(APDK_DJ850)
+ static DJ850Proxy s_DJ850Proxy;
+#endif
+
+#ifdef APDK_DJ6xxPhoto
+ static DJ6xxPhotoProxy s_DJ6xxPhotoProxy;
+#endif
+
+#ifdef APDK_DJ6xx
+ static DJ660Proxy s_DJ660Proxy;
+#endif
+
+#ifdef APDK_DJ630
+ static DJ630Proxy s_DJ630Proxy;
+#endif
+
+#ifdef APDK_DJ600
+ static DJ600Proxy s_DJ600Proxy;
+#endif
+
+#ifdef APDK_DJ540
+ static DJ540Proxy s_DJ540Proxy;
+#endif
+
+#ifdef APDK_DJ400
+ static DJ400Proxy s_DJ400Proxy;
+#endif
+
+#ifdef APDK_DJ350
+ static DJ350Proxy s_DJ350Proxy;
+#endif
+
+#if defined(APDK_DJ3600) && defined (APDK_DJ3320)
+ static DJ3600Proxy s_DJ3600Proxy;
+ static DJ4100Proxy s_DJ4100Proxy;
+ static DJD2600Proxy s_DJD2600Proxy;
+#endif
+
+#if defined (APDK_DJ3320)
+ static DJ3320Proxy s_DJ3320Proxy;
+#endif
+
+#ifdef APDK_APOLLO2560
+ static Apollo2560Proxy s_Apollo2560Proxy;
+#endif
+
+#ifdef APDK_APOLLO21XX
+ static Apollo21xxProxy s_Apollo21xxProxy;
+#endif
+
+#ifdef APDK_APOLLO2XXX
+ static Apollo2xxxProxy s_Apollo2xxxProxy;
+#endif
+
+#ifdef APDK_QUICKCONNECT
+ static QuickConnectProxy s_QuickConnectProxy;
+#endif
+
+}; //DeviceRegistry
+
+
+////////////////////////////////////////////////
+typedef struct
+{
+ const uint32_t *ulMap1;
+ const uint32_t *ulMap2;
+ const unsigned char *ulMap3;
+} ColorMap;
+
+
+//Compressor
+//!\internal
+//! Base for data compression methods
+/*!
+Impliment compression
+
+******************************************************************************/
+class Compressor : public Processor
+{
+public:
+ Compressor(SystemServices* pSys, unsigned int RasterSize, BOOL useseed);
+ virtual ~Compressor();
+
+ virtual BOOL Process(RASTERDATA* InputRaster=NULL)=0;
+
+ virtual void Flush() { } // no pending output
+
+ unsigned int GetOutputWidth(COLORTYPE color);
+ virtual BYTE* NextOutputRaster(COLORTYPE color);
+
+ void SetSeedRow(BYTE* seed) { SeedRow=seed; }
+
+ DRIVER_ERROR constructor_error;
+
+ SystemServices* pSS;
+ // buffer is public for use by GraphicsTranslator
+ BYTE* compressBuf; // output buffer
+ BYTE* SeedRow;
+ BOOL UseSeedRow;
+ BYTE* originalKData;
+
+ unsigned int compressedsize;
+ unsigned int inputsize;
+ BOOL seeded;
+}; //Compressor
+
+
+//ClassName
+//!
+/*
+\internal
+*/
+class Mode9 : public Compressor
+{
+public:
+ Mode9(SystemServices* pSys,unsigned int RasterSize, BOOL bVIPPrinter = FALSE);
+ virtual ~Mode9();
+ BOOL Process(RASTERDATA* input);
+ void Flush();
+ BOOL ResetSeedRow;
+ BOOL m_bVIPPrinter;
+}; //Mode9
+
+//ClassName
+//!
+/*
+\internal
+*/
+class Mode2 : public Compressor
+{
+public:
+ Mode2(SystemServices* pSys,unsigned int RasterSize);
+ virtual ~Mode2();
+ BOOL Process(RASTERDATA* input);
+}; //Mode2
+
+//ClassName
+//!
+/*
+\internal
+*/
+class Mode3 : public Compressor
+{
+public:
+ Mode3 (SystemServices* pSys, Printer *pPrinter, unsigned int RasterSize);
+ virtual ~Mode3 ();
+ BOOL Process (RASTERDATA* input);
+ void Flush ();
+private:
+ Printer *m_pPrinter;
+}; //Mode3
+
+////////////////////////////////////////////////////////////////////////////
+#if defined(APDK_FONTS_NEEDED)
+
+
+//TextTranslator
+//! ASCII data support
+/*!
+\internal
+Does encapsulation work specific to ascii data, including handling of fonts
+and treatments.
+
+******************************************************************************/
+class TextTranslator
+{
+public:
+ TextTranslator(Printer* p,int quality,unsigned int colorplanes);
+ virtual ~TextTranslator();
+
+ DRIVER_ERROR TextOut(const char* pTextString, unsigned int LenString,
+ const Font& font, BOOL sendfont=FALSE,
+ int iAbsX=-1, int iAbsY=-1);
+
+ DRIVER_ERROR SendCAP(unsigned int iAbsX,unsigned int iAbsY);
+ const BYTE* ColorSequence(TEXTCOLOR eColor);
+ BYTE ColorCode(TEXTCOLOR eColor);
+ int TypefaceCode(const char* FontName);
+ const BYTE* PointsizeSequence(unsigned int iPointsize);
+ const BYTE* PitchSequence(unsigned int iPitch);
+ const BYTE* StyleSequence(BOOL bItalic);
+ const BYTE* WeightSequence(BOOL bBold);
+ const BYTE* CompleteSequence(const Font& font);
+ const BYTE* UnderlineSequence();
+ const BYTE* DisableUnderlineSequence();
+
+ // "transparent mode" escape to treat control code (BYTE b) as normal char
+ int TransparentChar(unsigned int iMaxLen, BYTE b, BYTE* outbuff);
+
+ DRIVER_ERROR constructor_error;
+
+ DRIVER_ERROR SendFont(const Font& font);
+ DRIVER_ERROR SendColorSequence(const TEXTCOLOR eColor);
+ DRIVER_ERROR SendPointsize(const unsigned int iPointsize);
+ DRIVER_ERROR SendPitch(const unsigned int iPitch);
+ DRIVER_ERROR SendStyle(const BOOL bItalic);
+ DRIVER_ERROR SendWeight(const BOOL bBold);
+ DRIVER_ERROR SendUnderline();
+ DRIVER_ERROR SendCompleteSequence(const Font& font);
+ DRIVER_ERROR DisableUnderline();
+
+
+private:
+ Printer* thePrinter;
+ int qualcode; // pcl code for text quality
+ BYTE EscSeq[MAX_ESC_SEQ]; // storage for the command
+ unsigned int iNumPlanes; // color planes, based on pen
+ BYTE ColorCode1(TEXTCOLOR eColor); // if iNumPlanes==1 (black)
+ BYTE ColorCode3(TEXTCOLOR eColor); // if iNumPlanes==3 (CMY)
+ BYTE ColorCode4(TEXTCOLOR eColor); // if iNumPlanes==4 (KCMY)
+
+ // items for avoiding redundant font resets
+ // (cheaper than copying whole font)
+ TEXTCOLOR lastcolor;
+ char lastname[20];
+ char lastcharset[MAX_CHAR_SET];
+ int lastpointsize;
+ BOOL lastitalic;
+ BOOL lastbold;
+ void SetLast(const Font& font);
+
+}; //TextTranslator
+
+#endif //fonts needed
+
+
+//Header
+//! Composes a header stream
+/*!
+\internal
+Composes a header stream, embodying specific requirements of the Printer.
+
+******************************************************************************/
+class Header
+{
+friend class Job;
+friend class ModeJPEG;
+
+public:
+ Header(Printer* p,PrintContext* pc);
+ virtual ~Header ();
+
+ virtual DRIVER_ERROR Send()=0;
+
+ virtual DRIVER_ERROR EndJob();
+
+ virtual DRIVER_ERROR SendCAPy(unsigned int iAbsY); // made virtual for crossbow
+ virtual DRIVER_ERROR FormFeed(); // made virtual for crossbow
+
+ BOOL IsLastBand() { return bLastBand; }
+ void SetLastBand(BOOL lastband) { bLastBand = lastband; }
+
+ unsigned int CAPy; // may be moved during header; retrieved by Job
+
+protected:
+ Printer* thePrinter;
+ PrintContext* thePrintContext;
+ PrintMode* thePrintMode;
+ /// routines to set values of internal variables
+ void SetMediaType(MediaType mtype);
+ void SetMediaSize(PAPER_SIZE papersize);
+ void SetMediaSource(MediaSource msource);
+ void SetQuality(Quality qual);
+ void SetSimpleColor();
+
+ // components of a header
+ DRIVER_ERROR Margins();
+ virtual DRIVER_ERROR Graphics();
+ DRIVER_ERROR Simple();
+ DRIVER_ERROR Modes();
+ DRIVER_ERROR ConfigureRasterData();
+
+ // common escapes, plus mode and margin setting
+ virtual DRIVER_ERROR StartSend();
+
+////// data members /////////////////////////////////
+ unsigned int ResolutionX[MAXCOLORPLANES];
+ unsigned int ResolutionY[MAXCOLORPLANES];
+ unsigned int dyeCount;
+
+ // utilities
+
+ unsigned int ColorLevels(unsigned int ColorPlane);
+
+ // escape sequence constants
+ char SimpleColor[6]; BYTE sccount; // color command string, and its size
+ char mediatype[6]; BYTE mtcount; // mediatype string, and its size
+ char mediasize[8]; BYTE mscount; // mediasize string, and its size
+ char mediasource[6]; BYTE msrccount; // mediasource string, and its size
+ char quality[6]; BYTE qualcount; // quality string, and its size
+ BYTE QualityCode(); // returns just the variable byte of quality
+ BOOL bLastBand;
+}; //Header
+
+
+//ClassName
+/*
+******************************************************************************/
+class Header350 : public Header
+{
+public:
+ Header350(Printer* p,PrintContext* pc);
+ DRIVER_ERROR Send();
+}; //Header350
+
+
+//ClassName
+/*
+******************************************************************************/
+class Header400 : public Header
+{
+public:
+ Header400(Printer* p,PrintContext* pc);
+ DRIVER_ERROR Send();
+
+}; //Header400
+
+
+//ClassName
+/*
+******************************************************************************/
+class Header6XX : public Header
+{
+public:
+ Header6XX(Printer* p,PrintContext* pc);
+ virtual DRIVER_ERROR Send();
+protected:
+
+}; //Header6XX
+
+
+//ClassName
+/*
+******************************************************************************/
+class Header600 : public Header6XX
+{
+public:
+ Header600(Printer* p,PrintContext* pc);
+ DRIVER_ERROR Send();
+
+}; //Header600
+
+
+//ClassName
+/*
+******************************************************************************/
+class Header690 : public Header
+{
+public:
+ Header690(Printer* p,PrintContext* pc);
+ DRIVER_ERROR Send();
+}; //Header690
+
+
+//ClassName
+/*
+******************************************************************************/
+class Header540 : public Header
+{
+public:
+ Header540(Printer* p,PrintContext* pc);
+ DRIVER_ERROR Send();
+
+}; //Header540
+
+
+//ClassName
+/*
+******************************************************************************/
+class Header895 : public Header
+{
+public:
+ Header895(Printer* p,PrintContext* pc);
+ virtual DRIVER_ERROR Send();
+
+protected:
+ DRIVER_ERROR Graphics();
+ DRIVER_ERROR StartSend();
+}; //Header895
+
+
+//ClassName
+/*
+******************************************************************************/
+class Header850 : public Header895
+{
+public:
+ Header850(Printer* p,PrintContext* pc);
+
+protected:
+ DRIVER_ERROR StartSend();
+
+}; //Header850
+
+
+//ClassName
+/*
+******************************************************************************/
+class Header900 : public Header895
+{
+public:
+ Header900(Printer* p,PrintContext* pc);
+ virtual DRIVER_ERROR Send();
+
+protected:
+ BOOL DuplexEnabled(BYTE* bDevIDBuff);
+}; //Header900
+
+
+//ClassName
+/*
+******************************************************************************/
+class HeaderDJ990 : public Header
+{
+public:
+ HeaderDJ990(Printer* p,PrintContext* pc);
+ DRIVER_ERROR ConfigureRasterData();
+ DRIVER_ERROR ConfigureImageData();
+ DRIVER_ERROR Send();
+ DRIVER_ERROR StartSend();
+ void SetMediaSource(MediaSource msource);
+}; //HeaderDJ990
+
+//ClassName
+/*
+******************************************************************************/
+class HeaderDJGenericVIP : public HeaderDJ990
+{
+public:
+ HeaderDJGenericVIP (Printer *p, PrintContext *pc);
+protected:
+ unsigned int m_uiCAPy;
+ DRIVER_ERROR SendCAPy (unsigned int iAbsY);
+ DRIVER_ERROR FormFeed ();
+}; // HeaderDJGenericVIP
+
+//ClassName
+/*
+******************************************************************************/
+class Header630 : public Header
+{
+public:
+ Header630(Printer* p,PrintContext* pc);
+ DRIVER_ERROR Send();
+}; //Header630
+
+
+//ClassName
+/*
+******************************************************************************/
+class Header2xxx : public Header
+{
+public:
+ Header2xxx(Printer* p,PrintContext* pc);
+ DRIVER_ERROR Send();
+}; //Header2xxx
+
+
+//ClassName
+/*
+******************************************************************************/
+class Header3320 : public Header
+{
+public:
+ Header3320 (Printer *p, PrintContext *pc);
+ DRIVER_ERROR Send ();
+protected:
+ DRIVER_ERROR EndJob ();
+ DRIVER_ERROR FormFeed ();
+ DRIVER_ERROR SendCAPy (unsigned int iAbsY);
+};
+//ClassName
+/*
+******************************************************************************/
+class Header21xx : public Header
+{
+public:
+ Header21xx(Printer* p,PrintContext* pc);
+ DRIVER_ERROR Send();
+}; //Header21xx
+
+//ClassName
+/*
+******************************************************************************/
+class HeaderLJMono : public Header
+{
+public:
+ HeaderLJMono (Printer* p,PrintContext* pc);
+ virtual DRIVER_ERROR Send();
+
+protected:
+ DRIVER_ERROR EndJob ();
+ DRIVER_ERROR Graphics ();
+ DRIVER_ERROR StartSend ();
+}; //HeaderLJMono
+
+//ClassName
+/*
+******************************************************************************/
+class HeaderLJColor : public Header
+{
+public:
+ HeaderLJColor (Printer* p,PrintContext* pc);
+ virtual DRIVER_ERROR Send();
+ virtual DRIVER_ERROR FormFeed ();
+
+protected:
+ DRIVER_ERROR EndJob ();
+ DRIVER_ERROR Graphics ();
+ DRIVER_ERROR StartSend ();
+ DRIVER_ERROR SendCAPy (unsigned int iAbsY);
+}; //HeaderLJColor
+
+//ClassName
+/*
+******************************************************************************/
+class HeaderPScript : public Header
+{
+public:
+ HeaderPScript (Printer *p, PrintContext *pc);
+ DRIVER_ERROR Send ();
+protected:
+ DRIVER_ERROR EndJob ();
+ DRIVER_ERROR FormFeed ();
+ DRIVER_ERROR SendCAPy (unsigned int iAbsY);
+ DRIVER_ERROR StartSend ();
+};
+
+//ClassName
+/*
+******************************************************************************/
+class HeaderLJJetReady : public Header
+{
+ friend class LJJetReady;
+public:
+ HeaderLJJetReady (Printer* p,PrintContext* pc);
+ virtual DRIVER_ERROR Send();
+ virtual DRIVER_ERROR FormFeed ();
+ virtual DRIVER_ERROR StartPage();
+ virtual DRIVER_ERROR EndPage();
+protected:
+ DRIVER_ERROR EndJob ();
+ DRIVER_ERROR StartSend ();
+ DRIVER_ERROR SendCAPy (unsigned int iAbsY);
+ DRIVER_ERROR MapPCLMediaTypeToString (MEDIATYPE eM);
+ int JRPaperToMediaSize(PAPER_SIZE ps);
+}; //HeaderLJJetReady
+
+//ClassName
+/*
+******************************************************************************/
+class HeaderLJFastRaster : public Header
+{
+ friend class LJFastRaster;
+public:
+ HeaderLJFastRaster (Printer* p,PrintContext* pc);
+ virtual DRIVER_ERROR Send();
+ virtual DRIVER_ERROR FormFeed ();
+ virtual DRIVER_ERROR StartPage();
+ virtual DRIVER_ERROR EndPage();
+protected:
+ DRIVER_ERROR EndJob ();
+ DRIVER_ERROR StartSend ();
+ DRIVER_ERROR SendCAPy (unsigned int iAbsY);
+ DRIVER_ERROR MapPCLMediaTypeToString (MEDIATYPE eM);
+ int FrPaperToMediaSize(PAPER_SIZE ps);
+}; //HeaderLJFastRaster
+
+//ClassName
+/*
+******************************************************************************/
+class HeaderLJZjs : public Header
+{
+ friend class LJZjs;
+public:
+ HeaderLJZjs (Printer *p, PrintContext *pc);
+ virtual DRIVER_ERROR Send ();
+ virtual DRIVER_ERROR FormFeed ();
+protected:
+ DRIVER_ERROR EndJob ();
+ DRIVER_ERROR SendCAPy (unsigned int iAbsY);
+}; // HeaderLJZjs
+
+//ClassName
+/*
+******************************************************************************/
+class HeaderQuickConnect : public Header
+{
+public:
+ HeaderQuickConnect (Printer *p, PrintContext *pc);
+ virtual DRIVER_ERROR Send ();
+ virtual DRIVER_ERROR FormFeed ();
+protected:
+ DRIVER_ERROR EndJob ();
+ DRIVER_ERROR SendCAPy (unsigned int iAbsY);
+}; // HeaderQuickConnect
+
+//ClassName
+/*
+******************************************************************************/
+
+class RasterSender : public Processor
+{
+friend class Header;
+friend class Header895;
+friend class Header900;
+public:
+ // installs Header and Connection
+ RasterSender(Printer* pP, PrintContext* pPC,
+ Job* pJob,Halftoner* pHalftoner);
+
+ virtual ~RasterSender();
+
+ // processor interface ////////////////////////////////////
+ //BOOL Process(BYTE* InputRaster=NULL, unsigned int size=0);
+ BOOL Process(RASTERDATA* InputRaster=NULL);
+ void Flush() { };
+ BYTE* NextOutputRaster(COLORTYPE rastercolor) { return NULL; } // end of pipeline
+ unsigned int GetOutputWidth(COLORTYPE rastercolor) { return 0; } // never called
+
+
+ DRIVER_ERROR constructor_error;
+
+ DRIVER_ERROR SendRaster(RASTERDATA* InputRaster=NULL);
+
+private:
+ Printer* thePrinter;
+
+ PrintContext* thePrintContext;
+ Job* theJob;
+ Halftoner* theHalftoner;
+ long m_lNBlankRasters; /* XXX unused? */
+}; //RasterSender
+
+// end of RasterSender section ///////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////
+
+#if defined(APDK_FONTS_NEEDED)
+
+//TextMapper
+//! Encapsulate mappings
+/*!
+\internal
+Component of TextManager
+This class encapsulates mappings that may be peculiar to different partners
+or data sources. The use is as follows:
+ 1. invoke Map
+ 2. now access SubstLen and charset
+
+Currently sets charset to LATIN1 at construction.
+
+******************************************************************************/
+class TextMapper
+{
+public:
+ TextMapper(TextTranslator* t);
+
+ // main function -- puts alternate string in buffer
+ virtual void Map(BYTE b,BYTE* bSubst);
+
+ // public members for access after call to Map()
+ unsigned int SubstLen;
+ char charset[MAX_CHAR_SET];
+
+protected:
+ TextTranslator* theTranslator;
+}; //TextMapper
+
+//GenericMapper
+//!
+/*
+******************************************************************************/
+class GenericMapper : public TextMapper
+{
+public:
+ GenericMapper(TextTranslator* t);
+ void Map(BYTE b,BYTE* bSubst);
+}; //GenericMapper
+
+
+//TextManager
+//!
+/*!
+\internal
+******************************************************************************/
+class TextManager
+// Component of TextJob
+{
+public:
+ TextManager(TextTranslator* t,unsigned int PrintableX, unsigned int PrintableY);
+ virtual ~TextManager();
+
+ virtual DRIVER_ERROR TextOut(const char* pTextString, unsigned int iLenString,
+ const Font& font, int iAbsX=-1, int iAbsY=-1);
+ TextTranslator* theTranslator;
+
+ DRIVER_ERROR constructor_error;
+
+protected:
+
+ unsigned int PrintableRegionX;
+ unsigned int PrintableRegionY;
+
+ DRIVER_ERROR CheckCoords(unsigned int iAbsX, unsigned int iAbsY );
+
+ TextMapper* theMapper;
+
+}; //TextManager
+
+#endif // FONTS
+
+APDK_END_NAMESPACE
+
+#endif //APDK_INTERNAL_H
diff --git a/prnt/hpijs/interp.h b/prnt/hpijs/interp.h
new file mode 100644
index 0000000..4f4d803
--- /dev/null
+++ b/prnt/hpijs/interp.h
@@ -0,0 +1,67 @@
+/*****************************************************************************\
+ interp.h : ResSyn routines and structures
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#ifndef APDK_INTERP_H
+#define APDK_INTERP_H
+
+APDK_BEGIN_NAMESPACE
+
+/* Constants for RS structure */
+#define NUMBER_RASTERS 3 /* The number of Rasters to Buffer */
+
+
+typedef struct rst
+{
+ int Width;
+ int ScaleFactorMultiplier;
+ int ScaleFactorDivisor;
+// int CallerAlloc;
+ int RastersinBuffer;
+ unsigned char* Bufferpt[NUMBER_RASTERS];
+ int BufferSize;
+ unsigned char* Buffer;
+
+} RESSYNSTRUCT;
+
+
+void ResSynStart ( int WidthInPixels,
+ int ScaleFactorMultiplier,
+ int ScaleFactorDivisor,
+// int CallerAlloc,
+ RESSYNSTRUCT *ResSynStruct);
+
+
+int ResSyn(RESSYNSTRUCT *ResSynStruct, unsigned char *raster_in,
+ unsigned char *raster_out );
+
+APDK_END_NAMESPACE
+
+#endif //APDK_INTERP_H
diff --git a/prnt/hpijs/interp_data_50.h b/prnt/hpijs/interp_data_50.h
new file mode 100644
index 0000000..eb4ab0a
--- /dev/null
+++ b/prnt/hpijs/interp_data_50.h
@@ -0,0 +1,494 @@
+/*****************************************************************************\
+ interp_data_50.h : constant data
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#ifndef APDK_INTERP_DATA_50_H
+#define APDK_INTERP_DATA_50_H
+
+APDK_BEGIN_NAMESPACE
+
+#define NBANDS3 8
+#define NSUBCLASSES3 45
+#define VARIANCE3 ((float) 0.222875)
+#define INV_VARIANCE3 ((float) 4.486825)
+#define CNST3 ((float) -1.346927)
+#define CLUST_VEC_POWER3 ((float) 0.250000)
+#define INTERP_FACTOR3 2
+#define W3 1
+#define P3 1
+#define BORDER3 3
+#define TOTAL_LENGTH3 13
+#define INTERP_CLUST_LENGTH3 8
+#define FILT_LENGTH3 9
+#define HIGH_RES_LENGTH3 4
+
+const float pi3[NSUBCLASSES3] =
+{
+
+ 0.134087f, 0.021311f, 0.019648f, 0.024394f, 0.034935f, 0.021820f,
+ 0.019170f, 0.022179f, 0.013944f, 0.012440f, 0.014401f, 0.013066f,
+ 0.035246f, 0.032467f, 0.014440f, 0.011417f, 0.010087f, 0.020046f,
+ 0.028311f, 0.017097f, 0.023745f, 0.016038f, 0.022072f, 0.023036f,
+ 0.028802f, 0.023446f, 0.015276f, 0.022871f, 0.011345f, 0.016940f,
+ 0.016896f, 0.018755f, 0.016816f, 0.011902f, 0.032550f, 0.024784f,
+ 0.012820f, 0.023129f, 0.008851f, 0.013391f, 0.018903f, 0.014587f,
+ 0.011018f, 0.022673f, 0.028847f
+};
+
+const float means3[NSUBCLASSES3*NBANDS3] =
+{ 0.000774f, 0.003593f, -0.002086f, 0.001974f, 0.001090f, 0.006085f, 0.009383f, -0.000469f,
+ -1.044311f, -0.765389f, -1.175416f, -0.742516f, -0.743477f, -1.186353f, -0.836232f, -1.090520f,
+ 0.338283f, -0.774581f, -1.416901f, 0.821453f, -1.176914f, 1.000631f, 0.568897f, -0.702795f,
+ -0.058699f, -0.462371f, -2.470061f, -0.071035f, -0.536233f, -0.420050f, -0.069105f, -0.048716f,
+ -0.064657f, 0.027666f, -0.037047f, -0.181144f, -0.189198f, -1.650089f, -1.774374f, -1.686162f,
+ 2.455220f, 0.387699f, 0.019051f, 0.463026f, -0.013956f, 0.029817f, -0.016442f, -0.026744f,
+ -1.025410f, 0.420109f, 1.194990f, -1.235820f, 1.152444f, -1.312478f, -0.425713f, 0.939458f,
+ 0.026192f, 0.338014f, 2.422950f, -0.032347f, 0.482617f, -0.025641f, -0.039135f, 0.016212f,
+ 0.006554f, 0.270283f, 2.149937f, -0.037302f, 2.076884f, 0.136553f, 0.105003f, 1.754475f,
+ 2.173123f, 0.560274f, 0.070122f, 0.632557f, 0.465478f, 0.111966f, 0.484268f, 2.009682f,
+ 0.219957f, 1.467974f, 1.995528f, -0.398120f, 1.589261f, -0.388413f, -0.387530f, 0.241743f,
+ -0.270451f, -1.699654f, -2.265285f, 0.203561f, -1.618941f, -0.037976f, 0.210997f, -0.186532f,
+ -0.048094f, -0.166164f, -1.663206f, 0.017631f, -1.772144f, -0.103216f, -0.225762f, -1.681172f,
+ 1.730204f, 1.737262f, 1.593460f, 0.181974f, 0.152116f, -0.109539f, -0.141882f, -0.056063f,
+ -0.230952f, 0.275236f, 0.072651f, -1.635954f, 0.262965f, -2.168830f, -1.615753f, -0.222218f,
+ 1.079399f, 0.244801f, 1.199122f, 1.162549f, 1.279812f, 0.986483f, 0.184212f, 1.201325f,
+ -0.560544f, -0.524704f, 0.352553f, -0.562952f, 1.635709f, -0.059114f, 1.425960f, 1.849587f,
+ -0.010279f, -0.003744f, -0.028509f, -0.018431f, -0.402123f, -0.066750f, -0.386577f, -2.443244f,
+ -1.723825f, -1.820417f, -1.734338f, -0.163968f, -0.219895f, -0.017193f, 0.020660f, -0.088216f,
+ -1.400438f, -0.718206f, 0.598797f, -1.257422f, 0.914653f, -0.834154f, 0.557207f, 0.997338f,
+ 0.029900f, -0.014535f, -0.011792f, 0.387747f, -0.014952f, 2.436290f, 0.383958f, 0.004128f,
+ -0.074886f, 0.160291f, -0.237074f, 0.174993f, -1.615974f, -0.221347f, -1.553910f, -2.203187f,
+ -0.942591f, -1.190646f, -1.277313f, 0.384835f, -0.446394f, 1.155884f, 1.122480f, 0.880156f,
+ 0.271327f, 0.837829f, 1.121860f, -0.692023f, 0.557900f, -1.368542f, -0.992892f, -0.465196f,
+ -0.000725f, -0.066347f, 0.033421f, 0.271319f, 0.074580f, 1.858489f, 1.790623f, 1.505258f,
+ -0.206268f, 0.132244f, 1.368347f, -0.262435f, 1.419442f, -0.173428f, 0.156229f, 1.361413f,
+ 0.249327f, 0.030119f, 0.081970f, 0.023521f, 0.591752f, 0.641430f, 1.702287f, 2.259731f,
+ 1.259956f, 0.251106f, -1.004476f, 1.239093f, -1.117822f, 1.105386f, -0.194298f, -1.129517f,
+ 1.116877f, 1.183586f, 1.026623f, 0.195173f, 0.209617f, 1.147194f, 1.211576f, 1.212144f,
+ -2.510197f, -0.349424f, 0.026320f, -0.373562f, 0.041303f, 0.010736f, 0.029276f, 0.006751f,
+ -0.953774f, -0.891946f, -0.603629f, -0.434015f, 0.662118f, 0.986387f, 1.303651f, 1.435651f,
+ 0.326236f, -0.257195f, -0.147855f, 1.640779f, -0.295173f, 2.109913f, 1.451703f, 0.103715f,
+ 2.087317f, 1.528896f, 0.209018f, 1.569349f, -0.233623f, 0.276365f, -0.232146f, -0.127082f,
+ 0.487855f, 0.039350f, 0.511064f, 0.061401f, 1.817653f, 0.086290f, 0.785898f, 2.408901f,
+ 1.679159f, 0.178437f, -0.001353f, 1.793388f, -0.086769f, 1.683560f, 0.201818f, -0.006799f,
+ 1.141604f, 1.130186f, 0.999398f, 0.229770f, -0.274429f, -1.043950f, -1.194934f, -1.220279f,
+ -1.988732f, -0.426505f, -0.109894f, -0.488769f, -0.708144f, -0.076649f, -0.560441f, -2.158441f,
+ -0.045908f, -0.068920f, -0.499930f, -0.476361f, -0.090959f, -2.472999f, -0.497707f, -0.053086f,
+ 0.493526f, 1.809131f, 2.396506f, 0.043945f, 0.786366f, 0.614150f, 0.043658f, 0.055845f,
+ -2.321377f, -1.448210f, -0.237279f, -1.517980f, 0.024960f, -0.308394f, 0.004862f, -0.375930f,
+ 1.079487f, 0.684766f, -0.280942f, 0.699966f, -0.957105f, -0.107189f, -0.868223f, -1.323501f,
+ -1.626288f, -1.425036f, -0.791911f, -1.011117f, 0.456523f, 0.115604f, 0.579521f, 0.700434f,
+ 0.087343f, 0.388898f, 1.972170f, 0.596996f, 0.527294f, 2.121683f, 0.562680f, 0.103259f,
+ -0.015322f, -0.019346f, 0.031279f, -0.035924f, 0.363621f, 0.004034f, 0.292051f, 2.362132f,
+ -1.657692f, -0.143410f, 0.030477f, -1.789348f, 0.072525f, -1.738594f, -0.258791f, -0.077726f
+
+};
+
+
+
+const float joint_means3[NSUBCLASSES3*TOTAL_LENGTH3] =
+{-0.569017f,
+-0.592667f, -0.532251f, -0.533552f, 91.392197f, 91.432030f, 91.380524f,
+91.478882f, 91.409416f, 91.421944f, 91.493507f, 91.523048f, 91.436142f,
+5.571358f, 5.433944f, 5.135954f, 5.441774f, 95.298454f, 99.144691f,
+94.238480f, 100.177010f, 113.276299f, 100.370522f, 93.951485f, 98.835159f,
+95.179161f, 2.617124f, -8.117904f, 8.099975f, -2.373677f, 99.011528f,
+87.405159f, 79.455757f, 105.221268f, 95.564682f, 82.333443f, 107.339516f,
+101.415665f, 87.523445f, 1.424042f, 0.917556f, 0.920758f, 1.525805f,
+119.968521f, 113.834908f, 93.340248f, 119.746132f, 121.602486f, 113.576851f,
+116.983887f, 119.928452f, 120.351059f, 7.603677f, 7.543176f, -0.585176f,
+-0.781502f, 123.565308f, 125.070862f, 123.865517f, 121.594925f, 125.237671f,
+121.372185f, 97.513763f, 96.125275f, 96.919067f, -1.331300f, -2.138124f,
+-2.018178f, -2.096316f, 99.314339f, 77.261803f, 71.717735f, 78.142349f,
+70.875839f, 70.950912f, 71.936111f, 70.862465f, 70.617989f, -8.014888f,
+11.075225f, -11.452845f, 7.494443f, 78.748947f, 98.882088f, 112.406013f,
+75.759773f, 94.514481f, 111.610947f, 74.622856f, 89.485092f, 108.127876f,
+-1.952583f, -1.344249f, -2.002568f, -2.008949f, 71.729599f, 76.722618f,
+98.642471f, 70.899178f, 70.813446f, 77.892159f, 70.545074f, 70.513885f,
+71.322296f, -13.498682f, -5.279373f, -13.301547f, -6.530796f, 67.035637f,
+74.070358f, 137.483719f, 65.706306f, 66.501457f, 135.201691f, 68.068069f,
+70.333176f, 126.416885f, -2.421132f, -7.263986f, -7.113289f, -5.041696f,
+113.511879f, 92.299118f, 82.014198f, 93.077629f, 78.905998f, 89.579971f,
+82.713440f, 89.633247f, 110.730766f, -7.695601f, 8.778397f, -13.626282f,
+-7.350642f, 86.419464f, 107.533638f, 118.287590f, 75.017532f, 81.295914f,
+110.057587f, 73.994385f, 74.698235f, 87.015480f, 10.047956f, -13.062446f,
+16.113504f, 11.422572f, 122.734695f, 92.693207f, 78.726280f, 136.608215f,
+132.787689f, 94.179359f, 132.055710f, 136.875946f, 125.348862f, 9.224700f,
+-0.109693f, 8.965702f, -0.078194f, 115.766251f, 112.862633f, 81.901588f,
+116.770088f, 116.841194f, 80.694397f, 115.074623f, 112.464111f, 81.732422f,
+-0.431740f, -0.687818f, -8.019328f, -7.777046f, 110.912521f, 111.521744f,
+109.288757f, 86.766777f, 83.508438f, 86.315483f, 82.502731f, 81.744019f,
+82.964638f, 7.614752f, 15.064453f, -11.623741f, 8.475021f, 119.371834f,
+131.461380f, 128.155228f, 94.235275f, 127.049324f, 131.303925f, 82.234612f,
+95.401711f, 120.397751f, -6.302689f, -5.910920f, -6.547348f, -6.058825f,
+99.441788f, 88.666321f, 100.618683f, 100.768311f, 82.404396f, 102.045547f,
+98.608253f, 87.694519f, 100.009857f, -17.036495f, -6.378878f, -10.414292f,
+15.038725f, 72.114906f, 74.113663f, 91.563385f, 72.744331f, 83.816856f,
+116.170692f, 82.362083f, 111.237984f, 121.416061f, 0.414496f, 0.749763f,
+0.770419f, 0.529369f, 120.045616f, 120.292374f, 120.079086f, 120.000946f,
+120.662018f, 114.732941f, 119.496468f, 114.432312f, 95.465790f, -0.047362f,
+-0.496625f, 8.377548f, 7.852504f, 96.215767f, 95.152092f, 96.173256f,
+124.467606f, 127.835419f, 123.311234f, 126.523270f, 127.219604f, 125.338181f,
+-9.018794f, 3.995118f, -3.569654f, 8.789133f, 79.912880f, 89.855011f,
+104.201942f, 81.839714f, 97.283287f, 108.731216f, 86.471237f, 102.783073f,
+109.948669f, -1.823330f, -1.852720f, -1.546260f, -1.880081f, 72.081467f,
+71.325989f, 71.009010f, 77.561722f, 71.134575f, 71.143837f, 99.420532f,
+77.284317f, 71.668335f, 13.929065f, 7.956630f, 8.870374f, -10.052946f,
+125.737823f, 130.778152f, 120.724350f, 130.647171f, 128.013351f, 95.409035f,
+121.004829f, 96.383324f, 82.803116f, -5.556594f, -8.549821f, 7.806454f,
+4.750080f, 91.123817f, 88.292786f, 87.096481f, 106.440826f, 102.886307f,
+98.477074f, 116.702499f, 116.316559f, 113.158890f, 1.075539f, 5.265429f,
+-5.829627f, -1.670283f, 103.415489f, 109.201225f, 111.960876f, 94.489799f,
+100.937698f, 105.862770f, 87.691956f, 91.334579f, 96.183907f, -8.266474f,
+-8.448220f, -0.802359f, -1.792390f, 81.980453f, 80.811188f, 81.881554f,
+86.368500f, 81.779594f, 83.906342f, 113.921211f, 113.435555f, 109.066956f,
+-5.534815f, 0.411996f, -5.401955f, 0.668718f, 70.415718f, 74.712982f,
+88.463638f, 69.656181f, 72.653130f, 89.422325f, 70.497787f, 74.922699f,
+88.350533f, -6.634558f, -7.243901f, -5.026807f, -1.170539f, 81.272621f,
+78.884071f, 79.765373f, 78.930000f, 77.668007f, 87.874817f, 90.459694f,
+108.092659f, 115.805992f, 12.936280f, -12.199434f, 11.127541f, -13.687916f,
+105.847946f, 87.855843f, 68.378708f, 105.886459f, 85.538193f, 66.909096f,
+103.999008f, 83.844185f, 66.849159f, -6.029956f, -5.981055f, -6.247091f,
+-6.074353f, 108.351288f, 109.286522f, 107.517570f, 95.627098f, 90.747322f,
+95.624100f, 108.178535f, 109.406937f, 108.333992f, 0.576806f, 0.499227f,
+0.344188f, 0.286852f, 95.710686f, 117.635460f, 123.376480f, 117.645851f,
+123.572441f, 123.630150f, 123.043686f, 123.276077f, 123.182358f, -9.367361f,
+-5.822471f, 2.340962f, 6.929045f, 84.255791f, 85.353493f, 88.596397f,
+91.730324f, 95.721077f, 101.984619f, 107.772736f, 111.527061f, 112.834869f,
+-7.752755f, -12.788501f, 7.672995f, -9.399925f, 85.713646f, 73.873901f,
+74.654320f, 109.969421f, 78.359344f, 73.395462f, 119.231781f, 105.176338f,
+81.158844f, 6.506885f, -8.369875f, -8.087216f, -12.377110f, 118.216179f,
+107.354614f, 85.525955f, 108.480766f, 80.080399f, 76.482391f, 86.772003f,
+76.417801f, 77.406715f, -8.335778f, -8.759060f, -9.785326f, -1.862754f,
+79.101120f, 72.741394f, 84.546692f, 73.024803f, 70.191154f, 113.874413f,
+73.086609f, 87.855972f, 126.313011f, -1.089821f, -7.504702f, -0.784354f,
+-7.460814f, 92.638008f, 64.828102f, 61.524342f, 94.584999f, 61.890564f,
+60.457340f, 92.596802f, 65.193420f, 61.392639f, 7.224984f, 5.508367f,
+-6.601244f, -8.299099f, 119.172958f, 119.234459f, 117.170547f, 106.564400f,
+104.419556f, 101.939377f, 91.159096f, 89.243958f, 88.913170f, 4.834817f,
+6.572627f, 6.972660f, 0.248389f, 91.959816f, 115.464470f, 122.800743f,
+114.467285f, 127.623825f, 110.708786f, 123.693909f, 112.996857f, 91.340538f,
+1.564369f, 1.211442f, 0.702830f, 1.520065f, 120.967758f, 120.471642f,
+116.924500f, 114.367996f, 122.219948f, 120.325874f, 94.351334f, 114.283783f,
+120.916695f, -7.336087f, -0.728319f, -8.558440f, -9.466346f, 89.045273f,
+113.133560f, 123.105583f, 79.906868f, 76.912331f, 92.106407f, 88.548775f,
+80.305260f, 79.564484f, -6.223439f, 9.556105f, 8.335138f, 11.464046f,
+81.604156f, 99.020416f, 122.144852f, 96.974823f, 129.496078f, 128.028473f,
+119.025749f, 127.608276f, 120.524513f, 5.649610f, -0.488222f, 0.112771f,
+-5.868335f, 107.334602f, 102.935028f, 93.884056f, 103.163963f, 96.557159f,
+87.643944f, 95.242966f, 88.395599f, 83.639801f, -7.558787f, -0.476352f,
+3.969364f, 8.754784f, 88.680267f, 91.705399f, 97.700638f, 97.635132f,
+108.679947f, 112.947777f, 109.305885f, 115.758072f, 117.416862f, -6.848458f,
+-4.182240f, -3.552881f, -6.959355f, 80.924568f, 87.599205f, 108.441681f,
+90.706146f, 77.277069f, 88.977470f, 110.651855f, 89.479492f, 80.840805f,
+-1.555507f, -1.539033f, -1.609181f, -1.199703f, 72.196388f, 72.513420f,
+72.907913f, 72.419037f, 72.624451f, 77.853828f, 72.784454f, 77.307564f,
+98.581871f, 0.992525f, 9.604681f, 0.665015f, 9.211377f, 74.333717f,
+109.724792f, 112.634926f, 73.194771f, 112.807877f, 113.447563f, 73.603554f,
+108.458832f, 111.487160f
+};
+
+const float filter3[NSUBCLASSES3*FILT_LENGTH3*HIGH_RES_LENGTH3] =
+{-0.038539f,
+-0.006377f, -0.014330f, 0.047676f, 0.100775f, 0.091890f, -0.300097f,
+-0.313949f, -0.028815f, -0.028053f, 0.052156f, -0.009875f, 0.096480f,
+-0.303045f, 0.099607f, -0.298992f, 0.425550f, 0.408621f, 0.439068f,
+0.431584f, -0.287630f, 0.101664f, -0.315186f, 0.100685f, -0.002751f,
+0.041112f, -0.036271f, -0.021252f, -0.311411f, -0.288203f, 0.078438f,
+0.100573f, 0.045634f, -0.018256f, -0.004139f, -0.037185f, 0.037846f,
+-0.094659f, -0.082729f, 0.106169f, 0.128023f, 0.194925f, -0.374994f,
+-0.327435f, -0.065959f, 0.005289f, 0.164576f, -0.080647f, 0.153420f,
+-0.357661f, 0.167628f, -0.313016f, 0.373973f, 0.357408f, 0.362472f,
+0.346208f, -0.336954f, 0.177288f, -0.344828f, 0.147837f, -0.079879f,
+0.136531f, 0.030287f, -0.075772f, -0.331317f, -0.355312f, 0.180272f,
+0.155402f, 0.109490f, -0.069536f, -0.108796f, 0.029849f, 0.211609f,
+-0.151922f, 0.006219f, -0.094823f, -0.022478f, 0.387082f, -0.444967f,
+-0.301156f, 0.058780f, -0.199739f, 0.222122f, -0.064855f, 0.068008f,
+-0.359451f, 0.310457f, -0.467473f, 0.607806f, 0.234437f, 0.198337f,
+0.676615f, -0.446353f, 0.307628f, -0.333007f, 0.031864f, -0.035179f,
+0.107025f, -0.047970f, 0.012583f, -0.374403f, -0.395650f, 0.306657f,
+0.018535f, -0.075709f, 0.076843f, -0.232489f, 0.197227f, 0.014156f,
+-0.014866f, -0.038554f, 0.014511f, -0.044734f, 0.102592f, -0.221716f,
+-0.265067f, 0.043170f, -0.122283f, 0.106632f, 0.044143f, 0.062062f,
+-0.399096f, 0.216543f, -0.274992f, 0.435559f, 0.640194f, 0.030215f,
+0.451540f, -0.233589f, 0.090198f, -0.204101f, -0.056299f, -0.002206f,
+0.143431f, -0.081150f, -0.017569f, -0.308730f, -0.399827f, 0.225155f,
+0.067090f, 0.031726f, -0.048616f, -0.027466f, 0.032326f, 0.029253f,
+0.013799f, -0.062027f, 0.043405f, 0.164658f, 0.135356f, -0.349309f,
+-0.354348f, -0.002888f, 0.041562f, 0.066073f, -0.058247f, 0.027416f,
+-0.262536f, 0.176518f, -0.291665f, 0.323808f, 0.310224f, 0.432907f,
+0.398017f, -0.308968f, 0.001312f, -0.286425f, 0.235222f, -0.082403f,
+0.096378f, -0.022362f, -0.001621f, -0.287247f, -0.330346f, 0.105533f,
+0.074766f, 0.102766f, -0.042037f, -0.036963f, -0.024264f, -0.082110f,
+0.021523f, 0.007256f, 0.055798f, 0.078652f, -0.052060f, -0.226890f,
+-0.192233f, -0.085468f, 0.082933f, 0.034081f, -0.034248f, 0.049751f,
+-0.223606f, -0.046080f, -0.168982f, 0.816598f, 0.365437f, 0.381294f,
+0.024015f, -0.439763f, 0.057289f, -0.269818f, 0.237595f, -0.028636f,
+-0.003287f, 0.062391f, -0.038873f, -0.364169f, -0.239898f, 0.056306f,
+0.132044f, 0.054477f, -0.011338f, -0.002422f, -0.018442f, 0.223555f,
+-0.317230f, 0.188120f, -0.151293f, 0.086944f, 0.158705f, -0.267532f,
+-0.414706f, 0.015522f, -0.066588f, 0.076893f, -0.026280f, 0.100254f,
+-0.377826f, 0.277492f, -0.472827f, 0.332768f, 0.522778f, 0.081638f,
+0.799384f, -0.384792f, 0.187138f, -0.293827f, 0.045525f, -0.004015f,
+0.113908f, -0.093851f, -0.007372f, -0.258776f, -0.357762f, 0.237904f,
+0.039333f, -0.094290f, 0.107982f, -0.190837f, 0.160000f, 0.044950f,
+0.017068f, -0.087331f, 0.024120f, -0.046207f, 0.082042f, -0.193270f,
+-0.251483f, 0.016711f, -0.087349f, 0.054266f, 0.011762f, 0.070761f,
+-0.400174f, 0.236681f, -0.314893f, 0.351154f, 0.734474f, 0.045844f,
+0.479364f, -0.202191f, 0.055457f, -0.182188f, -0.051137f, -0.013923f,
+0.057497f, -0.010780f, -0.010385f, -0.251828f, -0.395527f, 0.146461f,
+0.078176f, 0.026793f, -0.063364f, -0.014208f, 0.031309f, 0.195676f,
+-0.272931f, 0.159328f, -0.083343f, -0.176654f, 0.268300f, -0.242208f,
+-0.200756f, 0.035675f, -0.108883f, 0.124737f, -0.057824f, 0.174403f,
+-0.337902f, 0.184825f, -0.371331f, 0.008686f, 0.800090f, -0.049191f,
+0.751294f, -0.171097f, -0.031303f, -0.181403f, -0.055480f, -0.002609f,
+0.056020f, 0.019620f, -0.063656f, -0.190335f, -0.302646f, -0.063810f,
+0.179970f, 0.001563f, 0.008303f, -0.080241f, -0.014801f, -0.225420f,
+0.043172f, 0.011874f, 0.174858f, 0.281979f, -0.143768f, -0.235249f,
+-0.299497f, -0.164309f, 0.163043f, 0.008138f, -0.023346f, 0.275668f,
+-0.259545f, -0.140663f, -0.278952f, 0.331520f, 0.578112f, 0.510491f,
+0.201095f, -0.284796f, -0.135826f, -0.221269f, 0.267243f, -0.105222f,
+-0.035177f, 0.163730f, -0.076207f, -0.262958f, -0.247158f, -0.144369f,
+0.241386f, 0.164747f, 0.024927f, 0.031004f, -0.214805f, 0.170571f,
+-0.128602f, -0.080023f, -0.002011f, -0.103536f, 0.255655f, -0.201626f,
+-0.351362f, 0.048403f, -0.205119f, 0.132327f, 0.028883f, 0.074047f,
+-0.569580f, 0.400581f, -0.290180f, 0.410293f, 1.174623f, -0.461240f,
+0.504287f, -0.338923f, 0.177329f, -0.172856f, -0.077635f, -0.018366f,
+0.021709f, -0.015637f, 0.062549f, -0.274590f, -0.606581f, 0.445955f,
+0.007324f, 0.029480f, -0.096463f, -0.089122f, 0.118637f, 0.172921f,
+-0.023366f, -0.167288f, -0.010280f, -0.145919f, 0.437895f, -0.295632f,
+-0.352554f, 0.091878f, -0.433384f, 0.261227f, 0.110753f, -0.006829f,
+-0.565171f, 0.415717f, -0.231244f, 0.451488f, 0.556397f, -0.141596f,
+0.485789f, -0.341071f, 0.499413f, -0.281441f, -0.191709f, 0.093826f,
+0.227455f, -0.224415f, 0.024399f, -0.317060f, -0.555758f, 0.447157f,
+0.033543f, -0.016598f, -0.094330f, -0.063069f, 0.108099f, 0.074997f,
+-0.075776f, 0.011205f, 0.028938f, -0.088643f, 0.302885f, -0.311704f,
+-0.219449f, -0.013551f, -0.114632f, 0.145831f, -0.066035f, 0.139388f,
+-0.365222f, 0.169996f, -0.323064f, 0.377941f, 0.368001f, 0.334946f,
+0.332769f, -0.350325f, 0.127974f, -0.328386f, 0.104849f, 0.050448f,
+0.059929f, 0.046040f, -0.121134f, -0.364001f, -0.236433f, -0.059155f,
+0.360426f, 0.129808f, -0.050684f, -0.051941f, -0.083811f, -0.062922f,
+-0.021130f, -0.013934f, 0.080966f, -0.001278f, -0.018578f, -0.200779f,
+-0.199021f, 0.020747f, -0.003021f, 0.001041f, -0.084133f, 0.233064f,
+-0.303245f, -0.065640f, -0.253698f, 0.684579f, 0.722319f, 0.164290f,
+0.114581f, -0.346307f, 0.143139f, -0.204638f, -0.003047f, -0.165914f,
+-0.023076f, 0.103756f, 0.076082f, -0.368865f, -0.381985f, 0.177470f,
+0.176172f, 0.029599f, -0.088425f, 0.001886f, 0.060270f, 0.165462f,
+-0.084299f, -0.092631f, -0.030557f, -0.054623f, 0.396785f, -0.478884f,
+-0.261572f, 0.135054f, -0.226577f, 0.146775f, 0.023170f, -0.101874f,
+-0.292678f, 0.406803f, -0.379223f, 0.468669f, -0.050527f, 0.573784f,
+0.468039f, -0.367056f, 0.385542f, -0.479997f, 0.075179f, 0.059797f,
+0.236400f, -0.348575f, 0.100431f, -0.383957f, -0.335591f, 0.441099f,
+-0.108192f, 0.065435f, -0.074598f, -0.126676f, 0.101009f, 0.037006f,
+-0.118981f, 0.005055f, 0.040852f, 0.129756f, 0.090297f, -0.277477f,
+-0.312564f, -0.117482f, 0.058118f, 0.047260f, -0.043996f, 0.017865f,
+-0.222113f, 0.012222f, -0.200350f, 0.403085f, 0.422116f, 0.412928f,
+0.434283f, -0.229642f, 0.001362f, -0.210729f, 0.056728f, -0.023715f,
+0.057394f, 0.022204f, -0.104058f, -0.273857f, -0.298585f, 0.100519f,
+0.090161f, 0.048206f, 0.002680f, -0.123781f, 0.031976f, -0.091056f,
+-0.008982f, -0.014470f, 0.165106f, 0.563916f, -0.022556f, -0.238121f,
+-0.717396f, -0.127001f, 0.196403f, -0.046102f, -0.087218f, 0.518930f,
+-0.315263f, 0.054334f, -0.607986f, -0.655202f, 0.635625f, 0.459923f,
+1.164114f, -0.189307f, -0.124433f, -0.383164f, 0.259866f, -0.051335f,
+-0.018577f, 0.217040f, -0.190823f, -0.140183f, -0.365720f, -0.129350f,
+0.233518f, 0.139157f, 0.032565f, 0.073984f, -0.209769f, -0.063082f,
+-0.047104f, 0.044894f, 0.084191f, 0.220882f, 0.135381f, -0.396614f,
+-0.372962f, 0.035591f, 0.018929f, 0.039776f, -0.094316f, 0.238802f,
+-0.315182f, 0.062417f, -0.357961f, -0.101969f, 0.502500f, 0.456624f,
+0.710217f, -0.218455f, -0.067125f, -0.218651f, 0.088901f, -0.041690f,
+-0.020859f, 0.035555f, -0.025603f, -0.159360f, -0.255471f, -0.054359f,
+0.078487f, 0.092441f, 0.046868f, 0.027443f, -0.115207f, -0.065296f,
+-0.032188f, -0.020255f, 0.139151f, 0.090674f, 0.083170f, -0.301431f,
+-0.327831f, 0.009755f, -0.021837f, 0.071962f, -0.061453f, 0.220716f,
+-0.281490f, -0.008946f, -0.285064f, 0.454359f, 0.393610f, 0.292292f,
+0.290638f, -0.300812f, 0.269453f, -0.289263f, -0.009589f, -0.084388f,
+0.062668f, 0.044321f, 0.028924f, -0.376310f, -0.381285f, 0.168354f,
+0.152308f, 0.079864f, -0.066482f, -0.001408f, 0.030103f, -0.227105f,
+0.116332f, -0.115685f, 0.230501f, 0.386250f, -0.038951f, -0.273956f,
+-0.407767f, -0.168184f, 0.177680f, -0.133099f, 0.063340f, 0.316902f,
+-0.489064f, 0.050083f, -0.318527f, 0.253635f, 0.581441f, 0.771489f,
+0.133429f, -0.361661f, 0.088077f, -0.506916f, 0.343027f, 0.088038f,
+-0.069976f, 0.170115f, -0.247037f, -0.386423f, -0.347440f, -0.002188f,
+0.284998f, 0.103964f, -0.028559f, 0.048493f, -0.097583f, 0.005920f,
+-0.062874f, -0.017118f, 0.053518f, 0.115878f, 0.169953f, -0.407580f,
+-0.308633f, -0.019012f, 0.018014f, 0.028070f, 0.001222f, -0.040532f,
+-0.148765f, 0.026506f, -0.207908f, 0.376635f, 0.038171f, 0.835131f,
+0.350211f, -0.285202f, 0.162576f, -0.399446f, 0.101540f, 0.026254f,
+0.050405f, -0.081267f, 0.016201f, -0.237212f, -0.176654f, 0.044385f,
+-0.036973f, 0.053835f, -0.056335f, -0.029641f, 0.028929f, -0.257641f,
+0.068391f, 0.047737f, 0.212577f, 0.364318f, -0.017966f, -0.246723f,
+-0.471869f, -0.104872f, 0.177301f, -0.045693f, -0.081880f, 0.376280f,
+-0.270632f, -0.009161f, -0.455878f, 0.080904f, 0.452889f, 0.474998f,
+0.405000f, -0.312015f, -0.132134f, -0.320047f, 0.402063f, -0.107119f,
+-0.035797f, 0.167391f, -0.069024f, -0.346466f, -0.316509f, -0.171961f,
+0.464877f, 0.263527f, 0.065597f, 0.086810f, -0.364571f, 0.088134f,
+0.034978f, -0.167886f, 0.010731f, 0.157490f, 0.337221f, -0.429487f,
+-0.505035f, -0.081898f, -0.125972f, 0.194588f, 0.020214f, 0.054692f,
+-0.345033f, 0.239559f, -0.358633f, 0.574842f, 0.227677f, 0.306788f,
+0.644879f, -0.258533f, 0.292181f, -0.411414f, -0.003173f, -0.017793f,
+0.077829f, -0.050437f, -0.009678f, -0.456902f, -0.325057f, 0.230977f,
+0.091961f, -0.057946f, -0.171632f, 0.081214f, 0.105238f, 0.100588f,
+-0.049030f, -0.095920f, 0.014710f, 0.060972f, 0.222467f, -0.301101f,
+-0.414350f, -0.035239f, -0.060226f, 0.087387f, 0.003123f, 0.020389f,
+-0.406161f, 0.284406f, -0.312259f, 0.613758f, 0.390717f, 0.201299f,
+0.524320f, -0.351306f, 0.261104f, -0.373183f, 0.040473f, 0.031402f,
+0.163447f, -0.132031f, -0.047133f, -0.445181f, -0.370438f, 0.287869f,
+0.091249f, 0.003770f, -0.157141f, 0.043023f, 0.100826f, 0.127044f,
+0.081631f, -0.167687f, -0.021388f, 0.225642f, 0.218065f, -0.428301f,
+-0.419011f, 0.005990f, 0.069357f, 0.036948f, -0.097539f, -0.121056f,
+-0.286186f, 0.262259f, -0.269583f, 0.116073f, 0.062108f, 0.745855f,
+0.740329f, -0.205973f, -0.003648f, -0.353223f, 0.166048f, 0.024368f,
+0.109632f, -0.086132f, -0.039239f, -0.200049f, -0.182107f, -0.000573f,
+-0.045871f, -0.013298f, -0.108094f, 0.018849f, 0.013874f, 0.085701f,
+-0.133404f, 0.059287f, -0.003722f, 0.025092f, 0.165576f, -0.256433f,
+-0.355102f, -0.057631f, -0.014532f, 0.035498f, 0.009624f, 0.263768f,
+-0.441111f, 0.219099f, -0.464863f, 0.039621f, 0.777472f, 0.093270f,
+0.799600f, -0.210619f, 0.001037f, -0.234910f, 0.027800f, 0.065859f,
+-0.031514f, 0.124430f, -0.150805f, -0.272043f, -0.313766f, -0.028215f,
+0.188333f, 0.045296f, -0.006052f, -0.026126f, -0.046757f, -0.152273f,
+-0.056162f, 0.031983f, 0.183826f, 0.235771f, 0.074555f, -0.290660f,
+-0.381700f, -0.014400f, 0.147286f, 0.002715f, -0.165268f, 0.238820f,
+-0.157154f, 0.040983f, -0.518281f, 0.024003f, 0.328874f, 0.574054f,
+0.703917f, -0.197078f, -0.184095f, -0.267343f, 0.249694f, -0.112289f,
+-0.022590f, 0.022108f, 0.049073f, -0.178447f, -0.248466f, -0.097409f,
+0.066510f, 0.126196f, 0.093036f, -0.010638f, -0.163378f, -0.040780f,
+-0.004616f, -0.016181f, 0.069127f, 0.093695f, 0.131924f, -0.440716f,
+-0.219132f, -0.388849f, 0.277741f, -0.234441f, 0.248210f, 0.082317f,
+-0.286888f, -0.027784f, -0.231906f, 0.968896f, -0.117015f, 1.100811f,
+-0.219476f, -0.477928f, 0.280962f, -0.555048f, 0.320672f, 0.061056f,
+-0.020941f, 0.119322f, -0.132517f, -0.289841f, -0.297186f, 0.158228f,
+0.105961f, -0.062673f, 0.070626f, -0.157549f, 0.088666f, 0.029685f,
+-0.011507f, -0.097330f, 0.052632f, 0.060325f, 0.033389f, -0.259619f,
+-0.257504f, -0.017093f, 0.045234f, 0.031317f, -0.111592f, 0.131943f,
+-0.271723f, 0.066545f, -0.297126f, 0.405258f, 0.413017f, 0.435310f,
+0.447407f, -0.284218f, 0.091921f, -0.277713f, 0.106695f, -0.142680f,
+0.031491f, 0.077168f, -0.000435f, -0.226168f, -0.216700f, 0.000970f,
+0.017138f, 0.031209f, -0.122206f, 0.014423f, 0.040314f, -0.117203f,
+0.042837f, 0.052516f, 0.090925f, 0.089645f, -0.084481f, -0.234264f,
+-0.185552f, -0.066335f, 0.049812f, 0.036655f, -0.034070f, 0.088912f,
+-0.253365f, -0.052777f, -0.202749f, 0.755617f, 0.390916f, 0.444148f,
+-0.012960f, -0.356229f, 0.076936f, -0.340917f, 0.212843f, -0.041965f,
+0.089074f, -0.028386f, -0.041977f, -0.365181f, -0.343176f, 0.105890f,
+0.188486f, 0.000703f, 0.029761f, 0.015733f, -0.007062f, -0.083699f,
+-0.051566f, -0.008131f, 0.149960f, 0.378373f, 0.123415f, -0.526310f,
+-0.429972f, 0.048868f, 0.169094f, -0.041202f, -0.192173f, 0.275946f,
+-0.220524f, 0.014452f, -0.453918f, 0.018658f, 0.445547f, 0.832657f,
+0.473415f, -0.308061f, -0.020804f, -0.369992f, 0.292199f, -0.200860f,
+-0.099155f, 0.138097f, 0.085523f, -0.247602f, -0.375975f, -0.013997f,
+0.180318f, 0.112575f, 0.032685f, -0.025856f, -0.107123f, 0.160017f,
+-0.111838f, -0.059581f, -0.036245f, 0.043310f, 0.484925f, -0.730721f,
+-0.175829f, 0.013286f, -0.144975f, 0.158750f, -0.006119f, -0.171841f,
+-0.167615f, 0.213843f, -0.294353f, 0.446332f, -0.434399f, 1.177720f,
+0.382003f, -0.292792f, 0.425409f, -0.597335f, 0.098465f, 0.048768f,
+0.141034f, -0.256730f, 0.102251f, -0.271365f, -0.212339f, 0.287661f,
+-0.214837f, 0.025042f, -0.027244f, -0.168708f, 0.143563f, -0.218553f,
+0.070602f, 0.056636f, 0.117598f, 0.229367f, -0.147797f, -0.286600f,
+-0.200392f, -0.112789f, 0.123540f, 0.032974f, -0.094710f, 0.207712f,
+-0.308633f, -0.162789f, -0.152930f, 0.961005f, 0.396529f, 0.461616f,
+-0.200157f, -0.603361f, 0.030870f, -0.229512f, 0.410930f, -0.031579f,
+-0.001434f, 0.132325f, -0.159370f, -0.565002f, -0.173174f, -0.024711f,
+0.374993f, 0.166644f, 0.003343f, 0.017942f, -0.145456f, -0.222910f,
+0.017597f, -0.032838f, 0.236387f, 0.219523f, -0.037341f, -0.141779f,
+-0.431705f, -0.082738f, 0.034822f, -0.020310f, 0.006781f, 0.274026f,
+-0.274250f, 0.027123f, -0.336656f, -0.031077f, 0.648320f, 0.381077f,
+0.561221f, -0.158878f, -0.148091f, -0.243957f, 0.118927f, -0.006423f,
+-0.015231f, 0.137575f, -0.187513f, -0.183042f, -0.229412f, -0.280224f,
+0.311481f, 0.131624f, 0.017188f, 0.133418f, -0.238982f, -0.014043f,
+-0.033174f, 0.004408f, 0.046022f, 0.179092f, -0.063637f, -0.338349f,
+-0.233771f, -0.130741f, 0.099883f, -0.007293f, 0.033556f, -0.043553f,
+-0.186326f, -0.030564f, -0.171473f, 0.780380f, 0.058980f, 0.789950f,
+0.033544f, -0.438068f, 0.177975f, -0.394243f, 0.252201f, 0.000277f,
+0.069758f, -0.027393f, -0.028748f, -0.291594f, -0.300644f, 0.235721f,
+-0.117545f, -0.030197f, 0.126201f, -0.217840f, 0.133034f, -0.049019f,
+-0.019958f, -0.002331f, 0.062720f, 0.182636f, 0.087908f, -0.408507f,
+-0.325497f, 0.077945f, 0.092927f, -0.052880f, -0.160201f, 0.130870f,
+-0.314744f, 0.065331f, -0.287756f, 0.502228f, 0.574219f, 0.465179f,
+0.234652f, -0.409270f, 0.065645f, -0.275827f, 0.228066f, -0.160197f,
+-0.014316f, 0.089968f, 0.072272f, -0.370058f, -0.459206f, 0.148880f,
+0.207121f, 0.090773f, -0.017553f, -0.026600f, -0.030158f, -0.343788f,
+0.084305f, 0.076063f, 0.253837f, 0.281768f, -0.089003f, -0.282088f,
+-0.270604f, -0.086118f, 0.138577f, -0.021855f, -0.070978f, 0.272630f,
+-0.283237f, -0.099182f, -0.228750f, 0.203140f, 0.551886f, 0.570057f,
+0.015256f, -0.270628f, -0.076262f, -0.316633f, 0.303449f, -0.034742f,
+-0.051352f, 0.111573f, -0.084261f, -0.309323f, -0.317615f, -0.094698f,
+0.396521f, 0.271493f, 0.032813f, 0.041186f, -0.305118f, 0.053186f,
+-0.024496f, -0.069319f, 0.016187f, -0.002766f, 0.252327f, -0.387834f,
+-0.280512f, 0.027065f, -0.105529f, 0.152686f, -0.028994f, -0.014187f,
+-0.219148f, 0.108261f, -0.268867f, 0.453835f, 0.103071f, 0.564238f,
+0.465150f, -0.320844f, 0.183620f, -0.333135f, 0.053139f, 0.025184f,
+0.115907f, -0.125158f, 0.042378f, -0.244379f, -0.296413f, 0.147231f,
+-0.028292f, 0.016638f, -0.008062f, -0.060200f, 0.029420f, 0.082850f,
+-0.019618f, -0.095984f, -0.019129f, -0.152752f, 0.082748f, -0.174354f,
+-0.206752f, 0.018496f, -0.178897f, 0.130165f, 0.062388f, -0.096638f,
+-0.449371f, 0.266300f, -0.158123f, 0.685778f, 0.567925f, -0.006415f,
+0.408582f, -0.229067f, 0.291954f, -0.218927f, -0.211817f, 0.010033f,
+0.224647f, -0.210002f, -0.022498f, -0.275210f, -0.265050f, 0.234709f,
+-0.082616f, -0.034882f, -0.224705f, 0.029309f, 0.194655f, -0.401128f,
+0.104200f, 0.101049f, 0.255006f, 0.449611f, -0.184387f, -0.312581f,
+-0.309154f, -0.093694f, 0.116242f, 0.013231f, -0.101387f, 0.422146f,
+-0.329292f, -0.182287f, -0.276443f, 0.244958f, 0.509967f, 0.522617f,
+0.148644f, -0.361763f, -0.026337f, -0.243617f, 0.276696f, -0.028855f,
+0.007794f, 0.094943f, -0.137472f, -0.449815f, -0.245254f, -0.071506f,
+0.367049f, 0.248885f, 0.027507f, 0.063726f, -0.259306f, -0.047289f,
+-0.000945f, -0.013730f, 0.078731f, 0.234817f, 0.017615f, -0.372362f,
+-0.302937f, -0.124482f, 0.119537f, 0.004774f, -0.033214f, 0.273014f,
+-0.418846f, 0.056658f, -0.345161f, 0.357172f, 0.605618f, 0.565007f,
+0.170632f, -0.408176f, 0.038125f, -0.382813f, 0.328414f, -0.102645f,
+0.029473f, 0.105506f, -0.048647f, -0.396948f, -0.389695f, 0.042971f,
+0.327669f, 0.207607f, 0.000350f, -0.006979f, -0.173255f, -0.307395f,
+-0.053452f, 0.120680f, 0.255739f, 0.332456f, 0.013426f, -0.474096f,
+-0.298916f, 0.065817f, 0.148159f, -0.014042f, -0.223698f, 0.393038f,
+-0.338369f, -0.070042f, -0.373589f, 0.504040f, 0.710039f, 0.505853f,
+0.026179f, -0.462684f, 0.064258f, -0.348054f, 0.291485f, -0.157772f,
+-0.019152f, 0.165796f, -0.030835f, -0.431007f, -0.506948f, 0.114943f,
+0.376422f, 0.068700f, -0.011715f, -0.006711f, -0.037347f, 0.156533f,
+-0.049174f, -0.045999f, -0.080680f, -0.139524f, 0.293895f, -0.323045f,
+-0.220691f, 0.005776f, -0.214853f, 0.161239f, 0.029343f, -0.130737f,
+-0.246302f, 0.223388f, -0.232998f, 0.519759f, 0.167635f, 0.301192f,
+0.631034f, -0.225244f, 0.226595f, -0.278431f, -0.124333f, 0.045793f,
+0.130548f, -0.206803f, 0.040165f, -0.236008f, -0.231943f, 0.228075f,
+-0.159354f, -0.007616f, -0.080136f, -0.061198f, 0.102430f, -0.044000f,
+-0.046244f, 0.014763f, 0.096832f, 0.165128f, 0.170414f, -0.331759f,
+-0.429112f, 0.002160f, 0.020684f, 0.068907f, -0.093828f, 0.188599f,
+-0.337311f, 0.096042f, -0.372279f, 0.074743f, 0.409074f, 0.331038f,
+0.793213f, -0.210666f, -0.015273f, -0.226446f, 0.065123f, -0.050365f,
+0.045164f, 0.044708f, -0.048557f, -0.182332f, -0.268392f, -0.011377f,
+0.070426f, 0.056289f, 0.019044f, 0.011434f, -0.086059f, -0.154989f,
+-0.005373f, -0.083942f, 0.156126f, 0.359937f, -0.061899f, -0.228640f,
+-0.352086f, -0.079847f, 0.040400f, 0.051691f, 0.011928f, 0.167815f,
+-0.372779f, 0.112271f, -0.364243f, 0.293110f, 0.410991f, 0.361557f,
+0.390498f, -0.342884f, 0.167287f, -0.361263f, 0.132153f, -0.113543f,
+0.170829f, -0.134148f, 0.002776f, -0.192569f, -0.374695f, 0.339710f,
+-0.048318f, 0.060624f, -0.006521f, -0.058608f, 0.043826f
+};
+
+APDK_END_NAMESPACE
+
+#endif //APDK_INTERP_DATA_50_H
diff --git a/prnt/hpijs/io_defs.h b/prnt/hpijs/io_defs.h
new file mode 100644
index 0000000..3a13ed6
--- /dev/null
+++ b/prnt/hpijs/io_defs.h
@@ -0,0 +1,60 @@
+/*****************************************************************************\
+ io_defs.h : I/O definitions
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+#ifndef APDK_IO_DEFS_H
+#define APDK_IO_DEFS_H
+
+#define NFAULT_BIT 0x08
+#define SELECT_BIT 0x10
+#define PERROR_BIT 0x20
+#define NACK_BIT 0x40
+#define BUSY_BIT 0x80
+
+#define STATUS_MASK (NFAULT_BIT | PERROR_BIT)
+#define BUSY_MASK (BUSY_BIT | NACK_BIT | NFAULT_BIT)
+
+#define DEVICE_IS_BUSY(reg) (reg == BUSY_MASK)
+#define DEVICE_IS_OOP(reg) ((reg & STATUS_MASK) == OOP)
+#define DEVICE_JAMMED_OR_TRAPPED(reg) ( ((reg & STATUS_MASK) == JAMMED) || ((reg & STATUS_MASK) == ERROR_TRAP) )
+#define DEVICE_PAPER_JAMMED(reg) ((reg & STATUS_MASK) == JAMMED)
+#define DEVICE_IO_TRAP(reg) ((reg & STATUS_MASK) == ERROR_TRAP)
+
+#define OOP (NFAULT_BIT | PERROR_BIT)
+#define JAMMED (PERROR_BIT)
+#define ERROR_TRAP (0)
+#define OFFLINE (NFAULT_BIT)
+
+#define MAX_BUSY_TIME 30000 // in msec, ie 30 sec
+#define C32_STATUS_WAIT 2000 // in msec, ie 2 sec
+
+#define MAX_SLOW_POLL_TIMES 3
+#define MIN_XFER_FOR_SLOW_POLL 2
+
+#endif //APDK_IO_DEFS_H
diff --git a/prnt/hpijs/jccolor.c b/prnt/hpijs/jccolor.c
new file mode 100644
index 0000000..a6b2333
--- /dev/null
+++ b/prnt/hpijs/jccolor.c
@@ -0,0 +1,534 @@
+#if defined (APDK_LJJETREADY) || defined (APDK_QUICKCONNECT) || defined (APDK_PSCRIPT)
+/*
+ * jccolor.c
+ *
+ * Copyright (C) 1991-1996, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains input colorspace conversion routines.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+
+//#define USE_MOJAVE_CSC
+
+/* Private subobject */
+
+typedef struct {
+ struct jpeg_color_converter pub; /* public fields */
+
+ /* Private state for RGB->YCC conversion */
+ INT32 * rgb_ycc_tab; /* => table for RGB to YCbCr conversion */
+} my_color_converter;
+
+typedef my_color_converter * my_cconvert_ptr;
+
+
+/**************** RGB -> YCbCr conversion: most common case **************/
+
+/*
+ * YCbCr is defined per CCIR 601-1, except that Cb and Cr are
+ * normalized to the range 0..MAXJSAMPLE rather than -0.5 .. 0.5.
+ * The conversion equations to be implemented are therefore
+ * Y = 0.29900 * R + 0.58700 * G + 0.11400 * B
+ * Cb = -0.16874 * R - 0.33126 * G + 0.50000 * B + CENTERJSAMPLE
+ * Cr = 0.50000 * R - 0.41869 * G - 0.08131 * B + CENTERJSAMPLE
+ *
+ * NOTE:
+ * The CSC was changed to the values below as per the Mojave
+ * specification. These values are enabled by the compile time flag
+ * USE_MOJAVE_CSC defined below.
+ *
+ * Y = 0.50000 * R + 0.00000 * G + 0.00000 * B
+ * Cb = 0.50000 * R - 0.50000 * G + 0.00000 * B + CENTERJSAMPLE
+ * Cr = 0.50000 * R + 0.00000 * G - 0.50000 * B + CENTERJSAMPLE
+ *
+ * (These numbers are derived from TIFF 6.0 section 21, dated 3-June-92.)
+ * Note: older versions of the IJG code used a zero offset of MAXJSAMPLE/2,
+ * rather than CENTERJSAMPLE, for Cb and Cr. This gave equal positive and
+ * negative swings for Cb/Cr, but meant that grayscale values (Cb=Cr=0)
+ * were not represented exactly. Now we sacrifice exact representation of
+ * maximum red and maximum blue in order to get exact grayscales.
+ *
+ * To avoid floating-point arithmetic, we represent the fractional constants
+ * as integers scaled up by 2^16 (about 4 digits precision); we have to divide
+ * the products by 2^16, with appropriate rounding, to get the correct answer.
+ *
+ * For even more speed, we avoid doing any multiplications in the inner loop
+ * by precalculating the constants times R,G,B for all possible values.
+ * For 8-bit JSAMPLEs this is very reasonable (only 256 entries per table);
+ * for 12-bit samples it is still acceptable. It's not very reasonable for
+ * 16-bit samples, but if you want lossless storage you shouldn't be changing
+ * colorspace anyway.
+ * The CENTERJSAMPLE offsets and the rounding fudge-factor of 0.5 are included
+ * in the tables to save adding them separately in the inner loop.
+ */
+
+#define SCALEBITS 16 /* speediest right-shift on some machines */
+#define CBCR_OFFSET ((INT32) CENTERJSAMPLE << SCALEBITS)
+#define ONE_HALF ((INT32) 1 << (SCALEBITS-1))
+#define FIX(x) ((INT32) ((x) * (1L<<SCALEBITS) + 0.5))
+
+/* We allocate one big table and divide it up into eight parts, instead of
+ * doing eight alloc_small requests. This lets us use a single table base
+ * address, which can be held in a register in the inner loops on many
+ * machines (more than can hold all eight addresses, anyway).
+ */
+
+int iUseMojaveCsc = 1;
+
+int R_Y_OFF; /* offset to R => Y section */
+int G_Y_OFF; /* offset to G => Y section */
+int B_Y_OFF; /* offset to B => Y section */
+int R_CB_OFF; /* R=>Y, R=>Cb are the same */
+int G_CB_OFF; /* offset to G => Cb section */
+int B_CB_OFF; /* G=>Y, B=>Cb are the same */
+int R_CR_OFF; /* R=>Y, R=>Cr are the same */
+int G_CR_OFF; /* G=>Y, G=>Cr are the same */
+int B_CR_OFF; /* G=>Cb, B=>Cr are the same */
+int TABLE_SIZE;
+
+void hp_rgb_ycc_setup (int iFlag)
+{
+ iUseMojaveCsc = iFlag;
+ if (iUseMojaveCsc)
+ {
+ R_Y_OFF = 0; /* offset to R => Y section */
+ G_Y_OFF = (1*(MAXJSAMPLE+1)); /* offset to G => Y section */
+ B_Y_OFF = (2*(MAXJSAMPLE+1)); /* offset to B => Y section */
+ R_CB_OFF = R_Y_OFF; /* R=>Y, R=>Cb are the same */
+ G_CB_OFF = (3*(MAXJSAMPLE+1)); /* offset to G => Cb section */
+ B_CB_OFF = G_Y_OFF; /* G=>Y, B=>Cb are the same */
+ R_CR_OFF = R_Y_OFF; /* R=>Y, R=>Cr are the same */
+ G_CR_OFF = G_Y_OFF; /* G=>Y, G=>Cr are the same */
+ B_CR_OFF = G_CB_OFF; /* G=>Cb, B=>Cr are the same */
+ TABLE_SIZE = (4*(MAXJSAMPLE+1));
+ }
+ else
+ {
+ R_Y_OFF = 0; /* offset to R => Y section */
+ G_Y_OFF = (1*(MAXJSAMPLE+1)); /* offset to G => Y section */
+ B_Y_OFF= (2*(MAXJSAMPLE+1)); /* etc. */
+ R_CB_OFF= (3*(MAXJSAMPLE+1));
+ G_CB_OFF= (4*(MAXJSAMPLE+1));
+ B_CB_OFF= (5*(MAXJSAMPLE+1));
+ R_CR_OFF= B_CB_OFF; /* B=>Cb, R=>Cr are the same */
+ G_CR_OFF= (6*(MAXJSAMPLE+1));
+ B_CR_OFF= (7*(MAXJSAMPLE+1));
+ TABLE_SIZE =(8*(MAXJSAMPLE+1));
+ }
+}
+
+/*
+ * Initialize for RGB->YCC colorspace conversion.
+ */
+
+METHODDEF(void)
+rgb_ycc_start (j_compress_ptr cinfo)
+{
+ my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
+ INT32 * rgb_ycc_tab;
+ INT32 i;
+
+ /* Allocate and fill in the conversion tables. */
+ cconvert->rgb_ycc_tab = rgb_ycc_tab = (INT32 *)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ (TABLE_SIZE * SIZEOF(INT32)));
+
+ for (i = 0; i <= MAXJSAMPLE; i++)
+ {
+ if (iUseMojaveCsc)
+ {
+ rgb_ycc_tab[i+R_Y_OFF] = FIX(0.50000) * i;
+ rgb_ycc_tab[i+G_Y_OFF] = FIX(0.00000) * i;
+ rgb_ycc_tab[i+B_Y_OFF] = FIX(0.00000) * i + ONE_HALF;
+ /* R=>Y and R=>Cb tables are the same
+ rgb_ycc_tab[i+R_CB_OFF] = (FIX(0.50000)) * i;
+ */
+ rgb_ycc_tab[i+G_CB_OFF] = (-FIX(0.50000)) * i + CBCR_OFFSET + ONE_HALF-1;
+ /* We use a rounding fudge-factor of 0.5-epsilon for Cb and Cr.
+ * This ensures that the maximum output will round to MAXJSAMPLE
+ * not MAXJSAMPLE+1, and thus that we don't have to range-limit.
+ */
+ /* G=>Y and B=>Cb tables are the same
+ rgb_ycc_tab[i+B_CB_OFF] = FIX(0.00000) * i;
+ */
+ /* R=>Y and R=>Cr tables are the same
+ rgb_ycc_tab[i+R_CR_OFF] = FIX(0.50000) * i;
+ */
+ /* G=>Y and G=>Cr tables are the same
+ rgb_ycc_tab[i+G_CR_OFF] = (-FIX(0.00000)) * i;
+ */
+ /* G=>Cb and B=>Cr tables are the same
+ rgb_ycc_tab[i+B_CR_OFF] = (-FIX(0.50000)) * i + CBCR_OFFSET + ONE_HALF-1;
+ */
+ }
+ else
+ {
+ rgb_ycc_tab[i+R_Y_OFF] = FIX(0.29900) * i;
+ rgb_ycc_tab[i+G_Y_OFF] = FIX(0.58700) * i;
+ rgb_ycc_tab[i+B_Y_OFF] = FIX(0.11400) * i + ONE_HALF;
+ rgb_ycc_tab[i+R_CB_OFF] = (-FIX(0.16874)) * i;
+ rgb_ycc_tab[i+G_CB_OFF] = (-FIX(0.33126)) * i;
+ /* We use a rounding fudge-factor of 0.5-epsilon for Cb and Cr.
+ * This ensures that the maximum output will round to MAXJSAMPLE
+ * not MAXJSAMPLE+1, and thus that we don't have to range-limit.
+ */
+ rgb_ycc_tab[i+B_CB_OFF] = FIX(0.50000) * i + CBCR_OFFSET + ONE_HALF-1;
+ /* B=>Cb and R=>Cr tables are the same
+ rgb_ycc_tab[i+R_CR_OFF] = FIX(0.50000) * i + CBCR_OFFSET + ONE_HALF-1;
+ */
+ rgb_ycc_tab[i+G_CR_OFF] = (-FIX(0.41869)) * i;
+ rgb_ycc_tab[i+B_CR_OFF] = (-FIX(0.08131)) * i;
+ }
+ }
+}
+
+
+/*
+ * Convert some rows of samples to the JPEG colorspace.
+ *
+ * Note that we change from the application's interleaved-pixel format
+ * to our internal noninterleaved, one-plane-per-component format.
+ * The input buffer is therefore three times as wide as the output buffer.
+ *
+ * A starting row offset is provided only for the output buffer. The caller
+ * can easily adjust the passed input_buf value to accommodate any row
+ * offset required on that side.
+ */
+
+METHODDEF(void)
+rgb_ycc_convert (j_compress_ptr cinfo,
+ JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
+ JDIMENSION output_row, int num_rows)
+{
+ my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
+ register int r, g, b;
+ register INT32 * ctab = cconvert->rgb_ycc_tab;
+ register JSAMPROW inptr;
+ register JSAMPROW outptr0, outptr1, outptr2;
+ register JDIMENSION col;
+ JDIMENSION num_cols = cinfo->image_width;
+
+ while (--num_rows >= 0) {
+ inptr = *input_buf++;
+ outptr0 = output_buf[0][output_row];
+ outptr1 = output_buf[1][output_row];
+ outptr2 = output_buf[2][output_row];
+ output_row++;
+ for (col = 0; col < num_cols; col++) {
+ r = GETJSAMPLE(inptr[RGB_RED]);
+ g = GETJSAMPLE(inptr[RGB_GREEN]);
+ b = GETJSAMPLE(inptr[RGB_BLUE]);
+ inptr += RGB_PIXELSIZE;
+ /* If the inputs are 0..MAXJSAMPLE, the outputs of these equations
+ * must be too; we do not need an explicit range-limiting operation.
+ * Hence the value being shifted is never negative, and we don't
+ * need the general RIGHT_SHIFT macro.
+ */
+ /* Y */
+ outptr0[col] = (JSAMPLE)
+ ((ctab[r+R_Y_OFF] + ctab[g+G_Y_OFF] + ctab[b+B_Y_OFF])
+ >> SCALEBITS);
+ /* Cb */
+ outptr1[col] = (JSAMPLE)
+ ((ctab[r+R_CB_OFF] + ctab[g+G_CB_OFF] + ctab[b+B_CB_OFF])
+ >> SCALEBITS);
+ /* Cr */
+ outptr2[col] = (JSAMPLE)
+ ((ctab[r+R_CR_OFF] + ctab[g+G_CR_OFF] + ctab[b+B_CR_OFF])
+ >> SCALEBITS);
+ }
+ }
+}
+
+
+/**************** Cases other than RGB -> YCbCr **************/
+
+
+/*
+ * Convert some rows of samples to the JPEG colorspace.
+ * This version handles RGB->grayscale conversion, which is the same
+ * as the RGB->Y portion of RGB->YCbCr.
+ * We assume rgb_ycc_start has been called (we only use the Y tables).
+ */
+
+METHODDEF(void)
+rgb_gray_convert (j_compress_ptr cinfo,
+ JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
+ JDIMENSION output_row, int num_rows)
+{
+ my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
+ register int r, g, b;
+ register INT32 * ctab = cconvert->rgb_ycc_tab;
+ register JSAMPROW inptr;
+ register JSAMPROW outptr;
+ register JDIMENSION col;
+ JDIMENSION num_cols = cinfo->image_width;
+
+ while (--num_rows >= 0) {
+ inptr = *input_buf++;
+ outptr = output_buf[0][output_row];
+ output_row++;
+ for (col = 0; col < num_cols; col++) {
+ r = GETJSAMPLE(inptr[RGB_RED]);
+ g = GETJSAMPLE(inptr[RGB_GREEN]);
+ b = GETJSAMPLE(inptr[RGB_BLUE]);
+ inptr += RGB_PIXELSIZE;
+ /* Y */
+ outptr[col] = (JSAMPLE)
+ ((ctab[r+R_Y_OFF] + ctab[g+G_Y_OFF] + ctab[b+B_Y_OFF])
+ >> SCALEBITS);
+ }
+ }
+}
+
+
+/*
+ * Convert some rows of samples to the JPEG colorspace.
+ * This version handles Adobe-style CMYK->YCCK conversion,
+ * where we convert R=1-C, G=1-M, and B=1-Y to YCbCr using the same
+ * conversion as above, while passing K (black) unchanged.
+ * We assume rgb_ycc_start has been called.
+ */
+
+METHODDEF(void)
+cmyk_ycck_convert (j_compress_ptr cinfo,
+ JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
+ JDIMENSION output_row, int num_rows)
+{
+ my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
+ register int r, g, b;
+ register INT32 * ctab = cconvert->rgb_ycc_tab;
+ register JSAMPROW inptr;
+ register JSAMPROW outptr0, outptr1, outptr2, outptr3;
+ register JDIMENSION col;
+ JDIMENSION num_cols = cinfo->image_width;
+
+ while (--num_rows >= 0) {
+ inptr = *input_buf++;
+ outptr0 = output_buf[0][output_row];
+ outptr1 = output_buf[1][output_row];
+ outptr2 = output_buf[2][output_row];
+ outptr3 = output_buf[3][output_row];
+ output_row++;
+ for (col = 0; col < num_cols; col++) {
+ r = MAXJSAMPLE - GETJSAMPLE(inptr[0]);
+ g = MAXJSAMPLE - GETJSAMPLE(inptr[1]);
+ b = MAXJSAMPLE - GETJSAMPLE(inptr[2]);
+ /* K passes through as-is */
+ outptr3[col] = inptr[3]; /* don't need GETJSAMPLE here */
+ inptr += 4;
+ /* If the inputs are 0..MAXJSAMPLE, the outputs of these equations
+ * must be too; we do not need an explicit range-limiting operation.
+ * Hence the value being shifted is never negative, and we don't
+ * need the general RIGHT_SHIFT macro.
+ */
+ /* Y */
+ outptr0[col] = (JSAMPLE)
+ ((ctab[r+R_Y_OFF] + ctab[g+G_Y_OFF] + ctab[b+B_Y_OFF])
+ >> SCALEBITS);
+ /* Cb */
+ outptr1[col] = (JSAMPLE)
+ ((ctab[r+R_CB_OFF] + ctab[g+G_CB_OFF] + ctab[b+B_CB_OFF])
+ >> SCALEBITS);
+ /* Cr */
+ outptr2[col] = (JSAMPLE)
+ ((ctab[r+R_CR_OFF] + ctab[g+G_CR_OFF] + ctab[b+B_CR_OFF])
+ >> SCALEBITS);
+ }
+ }
+}
+
+
+/*
+ * Convert some rows of samples to the JPEG colorspace.
+ * This version handles grayscale output with no conversion.
+ * The source can be either plain grayscale or YCbCr (since Y == gray).
+ */
+
+METHODDEF(void)
+grayscale_convert (j_compress_ptr cinfo,
+ JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
+ JDIMENSION output_row, int num_rows)
+{
+ register JSAMPROW inptr;
+ register JSAMPROW outptr;
+ register JDIMENSION col;
+ JDIMENSION num_cols = cinfo->image_width;
+ int instride = cinfo->input_components;
+
+ while (--num_rows >= 0) {
+ inptr = *input_buf++;
+ outptr = output_buf[0][output_row];
+ output_row++;
+ for (col = 0; col < num_cols; col++) {
+ outptr[col] = inptr[0]; /* don't need GETJSAMPLE() here */
+ inptr += instride;
+ }
+ }
+}
+
+
+/*
+ * Convert some rows of samples to the JPEG colorspace.
+ * This version handles multi-component colorspaces without conversion.
+ * We assume input_components == num_components.
+ */
+
+METHODDEF(void)
+null_convert (j_compress_ptr cinfo,
+ JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
+ JDIMENSION output_row, int num_rows)
+{
+ register JSAMPROW inptr;
+ register JSAMPROW outptr;
+ register JDIMENSION col;
+ register int ci;
+ int nc = cinfo->num_components;
+ JDIMENSION num_cols = cinfo->image_width;
+
+ while (--num_rows >= 0) {
+ /* It seems fastest to make a separate pass for each component. */
+ for (ci = 0; ci < nc; ci++) {
+ inptr = *input_buf;
+ outptr = output_buf[ci][output_row];
+ for (col = 0; col < num_cols; col++) {
+ outptr[col] = inptr[ci]; /* don't need GETJSAMPLE() here */
+ inptr += nc;
+ }
+ }
+ input_buf++;
+ output_row++;
+ }
+}
+
+
+/*
+ * Empty method for start_pass.
+ */
+
+METHODDEF(void)
+null_method (j_compress_ptr cinfo)
+{
+ /* no work needed */
+}
+
+
+/*
+ * Module initialization routine for input colorspace conversion.
+ */
+
+GLOBAL(void)
+jinit_color_converter (j_compress_ptr cinfo)
+{
+ my_cconvert_ptr cconvert;
+
+ cconvert = (my_cconvert_ptr)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ SIZEOF(my_color_converter));
+ cinfo->cconvert = (struct jpeg_color_converter *) cconvert;
+ /* set start_pass to null method until we find out differently */
+ cconvert->pub.start_pass = null_method;
+
+ /* Make sure input_components agrees with in_color_space */
+ switch (cinfo->in_color_space) {
+ case JCS_GRAYSCALE:
+ if (cinfo->input_components != 1)
+ ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);
+ break;
+
+ case JCS_RGB:
+#if RGB_PIXELSIZE != 3
+ if (cinfo->input_components != RGB_PIXELSIZE)
+ ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);
+ break;
+#endif /* else share code with YCbCr */
+
+ case JCS_YCbCr:
+ if (cinfo->input_components != 3)
+ ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);
+ break;
+
+ case JCS_CMYK:
+ case JCS_YCCK:
+ if (cinfo->input_components != 4)
+ ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);
+ break;
+
+ default: /* JCS_UNKNOWN can be anything */
+ if (cinfo->input_components < 1)
+ ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);
+ break;
+ }
+
+ /* Check num_components, set conversion method based on requested space */
+ switch (cinfo->jpeg_color_space) {
+ case JCS_GRAYSCALE:
+ if (cinfo->num_components != 1)
+ ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
+ if (cinfo->in_color_space == JCS_GRAYSCALE)
+ cconvert->pub.color_convert = grayscale_convert;
+ else if (cinfo->in_color_space == JCS_RGB) {
+ cconvert->pub.start_pass = rgb_ycc_start;
+ cconvert->pub.color_convert = rgb_gray_convert;
+ } else if (cinfo->in_color_space == JCS_YCbCr)
+ cconvert->pub.color_convert = grayscale_convert;
+ else
+ ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
+ break;
+
+ case JCS_RGB:
+ if (cinfo->num_components != 3)
+ ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
+ if (cinfo->in_color_space == JCS_RGB && RGB_PIXELSIZE == 3)
+ cconvert->pub.color_convert = null_convert;
+ else
+ ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
+ break;
+
+ case JCS_YCbCr:
+ if (cinfo->num_components != 3)
+ ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
+ if (cinfo->in_color_space == JCS_RGB) {
+ cconvert->pub.start_pass = rgb_ycc_start;
+ cconvert->pub.color_convert = rgb_ycc_convert;
+ } else if (cinfo->in_color_space == JCS_YCbCr)
+ cconvert->pub.color_convert = null_convert;
+ else
+ ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
+ break;
+
+ case JCS_CMYK:
+ if (cinfo->num_components != 4)
+ ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
+ if (cinfo->in_color_space == JCS_CMYK)
+ cconvert->pub.color_convert = null_convert;
+ else
+ ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
+ break;
+
+ case JCS_YCCK:
+ if (cinfo->num_components != 4)
+ ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
+ if (cinfo->in_color_space == JCS_CMYK) {
+ cconvert->pub.start_pass = rgb_ycc_start;
+ cconvert->pub.color_convert = cmyk_ycck_convert;
+ } else if (cinfo->in_color_space == JCS_YCCK)
+ cconvert->pub.color_convert = null_convert;
+ else
+ ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
+ break;
+
+ default: /* allow null conversion of JCS_UNKNOWN */
+ if (cinfo->jpeg_color_space != cinfo->in_color_space ||
+ cinfo->num_components != cinfo->input_components)
+ ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
+ cconvert->pub.color_convert = null_convert;
+ break;
+ }
+}
+#endif // APDK_LJJETREADY || APDK_QUICKCONNECT || APDK_PSCRIPT
diff --git a/prnt/hpijs/jdatadbf.c b/prnt/hpijs/jdatadbf.c
new file mode 100644
index 0000000..3440b72
--- /dev/null
+++ b/prnt/hpijs/jdatadbf.c
@@ -0,0 +1,174 @@
+#if defined (APDK_LJJETREADY) || defined (APDK_QUICKCONNECT) || defined (APDK_PSCRIPT)
+/*
+ * jdatadbf.c
+ *
+ * Copyright (C) 2001, Dorian Goldstein, Thomas G. Lane.
+ *
+ * This file contains compression data destination routines for the case of
+ * This file is identicle with IJG's built in destination file manager in
+ * every respect but 1... instead fo emmiting data to a file
+ * it facilitates definition of a callback function.
+ */
+
+/* this is not a core library module, so it doesn't define JPEG_INTERNALS */
+#include "jinclude.h"
+#include "jpeglib.h"
+#include "jerror.h"
+
+
+/* Expanded data destination object for stdio output */
+
+typedef struct {
+ struct jpeg_destination_mgr pub; /* public fields */
+
+ JOCTET * outbuff; // target output buffer
+ JOCTET * buffer; // start of internal buffer
+ UINT16 size_outbuff; // current size of target output buffer
+ JMETHOD (void, flush_output_buffer_callback, (JOCTET *outbuf, JOCTET* buffer, size_t size));
+} my_destination_mgr;
+
+typedef my_destination_mgr * my_dest_ptr;
+
+#define OUTPUT_BUF_SIZE 4096 /* choose an efficiently fwrite'able size */
+
+
+/*
+ * Initialize destination --- called by jpeg_start_compress
+ * before any data is actually written.
+ */
+
+METHODDEF(void)
+init_destination (j_compress_ptr cinfo)
+{
+ my_dest_ptr dest = (my_dest_ptr) cinfo->dest;
+
+ /* Allocate the output buffer --- it will be released when done with image */
+ dest->buffer = (JOCTET *)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ OUTPUT_BUF_SIZE * SIZEOF(JOCTET));
+
+ dest->pub.next_output_byte = dest->buffer;
+ dest->pub.free_in_buffer = OUTPUT_BUF_SIZE;
+}
+
+
+/*
+ * Empty the output buffer --- called whenever buffer fills up.
+ *
+ * In typical applications, this should write the entire output buffer
+ * (ignoring the current state of next_output_byte & free_in_buffer),
+ * reset the pointer & count to the start of the buffer, and return TRUE
+ * indicating that the buffer has been dumped.
+ *
+ * In applications that need to be able to suspend compression due to output
+ * overrun, a FALSE return indicates that the buffer cannot be emptied now.
+ * In this situation, the compressor will return to its caller (possibly with
+ * an indication that it has not accepted all the supplied scanlines). The
+ * application should resume compression after it has made more room in the
+ * output buffer. Note that there are substantial restrictions on the use of
+ * suspension --- see the documentation.
+ *
+ * When suspending, the compressor will back up to a convenient restart point
+ * (typically the start of the current MCU). next_output_byte & free_in_buffer
+ * indicate where the restart point will be if the current call returns FALSE.
+ * Data beyond this point will be regenerated after resumption, so do not
+ * write it out when emptying the buffer externally.
+ */
+
+METHODDEF(boolean)
+empty_output_buffer (j_compress_ptr cinfo)
+{
+ my_dest_ptr dest = (my_dest_ptr) cinfo->dest;
+
+// DG Temp if (dest->flush_output_buffer_callback == NULL) {
+// DG Temp if (dest->outbuff) {
+// DG Temp MEMCOPY(dest->outbuff + dest->size_outbuff, dest->buffer, OUTPUT_BUF_SIZE);
+// DG Temp dest->size_outbuff += OUTPUT_BUF_SIZE;
+// DG Temp }
+// DG Temp } else {
+// DG Temp (*dest->flush_output_buffer_callback)(dest->buffer, OUTPUT_BUF_SIZE);
+// DG Temp }
+
+ (*dest->flush_output_buffer_callback)(dest->outbuff, dest->buffer, OUTPUT_BUF_SIZE);
+
+
+ dest->pub.next_output_byte = dest->buffer;
+ dest->pub.free_in_buffer = OUTPUT_BUF_SIZE;
+
+ return TRUE;
+}
+
+
+/*
+ * Terminate destination --- called by jpeg_finish_compress
+ * after all data has been written. Usually needs to flush buffer.
+ *
+ * NB: *not* called by jpeg_abort or jpeg_destroy; surrounding
+ * application must deal with any cleanup that should happen even
+ * for error exit.
+ */
+
+METHODDEF(void)
+term_destination (j_compress_ptr cinfo)
+{
+ my_dest_ptr dest = (my_dest_ptr) cinfo->dest;
+ size_t datacount = OUTPUT_BUF_SIZE - dest->pub.free_in_buffer;
+
+ /* Write any data remaining in the buffer */
+ if (datacount > 0) {
+// DG Temp if (dest->flush_output_buffer_callback == NULL) {
+// DG Temp if (dest->outbuff) {
+// DG Temp MEMCOPY(dest->outbuff + dest->size_outbuff, dest->buffer, datacount);
+// DG Temp dest->size_outbuff += datacount;
+// DG Temp }
+// DG Temp } else {
+// DG Temp (*dest->flush_output_buffer_callback)(dest->buffer, datacount);
+// DG Temp }
+
+ (*dest->flush_output_buffer_callback)(dest->outbuff, dest->buffer, datacount);
+ }
+}
+
+
+/*
+ * Prepare for output to a stdio stream.
+ * The caller must have already opened the stream, and is responsible
+ * for closing it after finishing compression.
+ */
+
+GLOBAL(void)
+jpeg_buffer_dest (j_compress_ptr cinfo, JOCTET* outbuff, void* flush_output_buffer_callback)
+{
+ my_dest_ptr dest;
+
+ /* The destination object is made permanent so that multiple JPEG images
+ * can be written to the same file without re-executing jpeg_stdio_dest.
+ * This makes it dangerous to use this manager and a different destination
+ * manager serially with the same JPEG object, because their private object
+ * sizes may be different. Caveat programmer.
+ */
+ if (cinfo->dest == NULL) { /* first time for this JPEG object? */
+ cinfo->dest = (struct jpeg_destination_mgr *)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
+ SIZEOF(my_destination_mgr));
+ }
+
+ dest = (my_dest_ptr) cinfo->dest;
+ dest->pub.init_destination = init_destination;
+ dest->pub.empty_output_buffer = empty_output_buffer;
+ dest->pub.term_destination = term_destination;
+
+ dest->outbuff = outbuff;
+ dest->size_outbuff = 0;
+ dest->flush_output_buffer_callback = flush_output_buffer_callback;
+//(*dest->flush_output_buffer_callback)(-1 , -1);
+}
+
+GLOBAL(long)
+jpeg_buffer_size_dest (j_compress_ptr cinfo)
+{
+ my_dest_ptr dest = (my_dest_ptr) cinfo->dest;
+
+ return dest->size_outbuff;
+}
+#endif // APDK_LJJETREADY || APDK_QUICKCONNECT || APDK_PSCRIPT
diff --git a/prnt/hpijs/jinclude.h b/prnt/hpijs/jinclude.h
new file mode 100644
index 0000000..0a4f151
--- /dev/null
+++ b/prnt/hpijs/jinclude.h
@@ -0,0 +1,91 @@
+/*
+ * jinclude.h
+ *
+ * Copyright (C) 1991-1994, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file exists to provide a single place to fix any problems with
+ * including the wrong system include files. (Common problems are taken
+ * care of by the standard jconfig symbols, but on really weird systems
+ * you may have to edit this file.)
+ *
+ * NOTE: this file is NOT intended to be included by applications using the
+ * JPEG library. Most applications need only include jpeglib.h.
+ */
+
+
+/* Include auto-config file to find out which system include files we need. */
+
+#include "jconfig.h" /* auto configuration options */
+#define JCONFIG_INCLUDED /* so that jpeglib.h doesn't do it again */
+
+/*
+ * We need the NULL macro and size_t typedef.
+ * On an ANSI-conforming system it is sufficient to include <stddef.h>.
+ * Otherwise, we get them from <stdlib.h> or <stdio.h>; we may have to
+ * pull in <sys/types.h> as well.
+ * Note that the core JPEG library does not require <stdio.h>;
+ * only the default error handler and data source/destination modules do.
+ * But we must pull it in because of the references to FILE in jpeglib.h.
+ * You can remove those references if you want to compile without <stdio.h>.
+ */
+
+#ifdef HAVE_STDDEF_H
+#include <stddef.h>
+#endif
+
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+
+#ifdef NEED_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+
+#include <stdio.h>
+
+/*
+ * We need memory copying and zeroing functions, plus strncpy().
+ * ANSI and System V implementations declare these in <string.h>.
+ * BSD doesn't have the mem() functions, but it does have bcopy()/bzero().
+ * Some systems may declare memset and memcpy in <memory.h>.
+ *
+ * NOTE: we assume the size parameters to these functions are of type size_t.
+ * Change the casts in these macros if not!
+ */
+
+#ifdef NEED_BSD_STRINGS
+
+#include <strings.h>
+#define MEMZERO(target,size) bzero((void *)(target), (size_t)(size))
+#define MEMCOPY(dest,src,size) bcopy((const void *)(src), (void *)(dest), (size_t)(size))
+
+#else /* not BSD, assume ANSI/SysV string lib */
+
+#include <string.h>
+#define MEMZERO(target,size) memset((void *)(target), 0, (size_t)(size))
+#define MEMCOPY(dest,src,size) memcpy((void *)(dest), (const void *)(src), (size_t)(size))
+
+#endif
+
+/*
+ * In ANSI C, and indeed any rational implementation, size_t is also the
+ * type returned by sizeof(). However, it seems there are some irrational
+ * implementations out there, in which sizeof() returns an int even though
+ * size_t is defined as long or unsigned long. To ensure consistent results
+ * we always use this SIZEOF() macro in place of using sizeof() directly.
+ */
+
+#define SIZEOF(object) ((size_t) sizeof(object))
+
+/*
+ * The modules that use fread() and fwrite() always invoke them through
+ * these macros. On some systems you may need to twiddle the argument casts.
+ * CAUTION: argument order is different from underlying functions!
+ */
+
+#define JFREAD(file,buf,sizeofbuf) \
+ ((size_t) fread((void *) (buf), (size_t) 1, (size_t) (sizeofbuf), (file)))
+#define JFWRITE(file,buf,sizeofbuf) \
+ ((size_t) fwrite((const void *) (buf), (size_t) 1, (size_t) (sizeofbuf), (file)))
diff --git a/prnt/hpijs/job.cpp b/prnt/hpijs/job.cpp
new file mode 100644
index 0000000..5f93f65
--- /dev/null
+++ b/prnt/hpijs/job.cpp
@@ -0,0 +1,1114 @@
+/*****************************************************************************\
+ job.cpp : Implimentation for the Job class
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+#include "header.h"
+#include "halftoner.h"
+#include "colormatch.h"
+#include "scaler_open.h"
+#include "scaler_prop.h"
+
+APDK_BEGIN_NAMESPACE
+extern Halftoner* Create_Halftoner( SystemServices* pSys, PrintMode* pPM,
+ unsigned int iInputWidth, unsigned int iNumRows[], unsigned int HiResFactor,
+ BOOL usematrix);
+extern Scaler* Create_Scaler(SystemServices* pSys,int inputwidth,
+ int numerator,int denominator,BOOL vip,unsigned int BytesPerPixel);
+extern ColorMatcher* Create_ColorMatcher( SystemServices* pSys,
+ ColorMap cm,unsigned int DyeCount,
+ unsigned int iInputWidth);
+extern BOOL ProprietaryImaging();
+extern BOOL ProprietaryScaling();
+APDK_END_NAMESPACE
+
+APDK_BEGIN_NAMESPACE
+
+extern float frac(float f);
+
+#define InitialPixelSize 3 // means first data into pipeline is RGB24
+#define Bytes(x) ((x/8)+(x%8))
+
+//////////////////////////////////////////////////////////////////////////
+// The Job object receives data for a contiguous set of pages targeted at
+// a single printer, with a single group of settings encapsulated in the
+// PrintContext.
+// At least one page will be ejected for a job, if any data at all
+// is printed (no half-page jobs). If settings are to be changed, this
+// must be done between jobs.
+//
+
+/*!
+constructor - must pass a valid PrintContext to create the job.
+Check constructor_error for NO_ERROR before continuing.
+*/
+Job::Job
+(
+ PrintContext* pPC
+) :
+ thePrintContext(pPC),
+ pSS(pPC->pSS),
+ thePrinter(NULL),
+ thePipeline(NULL),
+ pText(NULL),
+ pSender(NULL),
+ pHalftoner(NULL),
+ pColorMatcher(NULL),
+ pResSynth(NULL),
+ pBlackPlaneReplicator(NULL),
+ pReplicator(NULL),
+ theCompressor(NULL),
+ pBlackPlaneCompressor(NULL),
+ pHead(NULL),
+#if defined(APDK_VIP_COLORFILTERING)
+ pErnie(NULL),
+#endif
+#if defined(APDK_FONTS_NEEDED)
+ theTextManager(NULL),
+#endif
+ CurrentMode(pPC->CurrentMode),
+ fcount(0),
+ skipcount(0),
+ RowsInput(0),
+ BlankRaster(NULL),
+ BlackRaster(NULL),
+ DataSent(FALSE)
+#ifdef APDK_USAGE_LOG
+ , UText(0),
+ UTextCount(0)
+#endif
+{
+#ifdef APDK_CAPTURE
+ Capture_Job(pPC);
+#endif
+ unsigned int i;
+ constructor_error = NO_ERROR;
+
+ if (!thePrintContext->PrinterSelected())
+ {
+ constructor_error = NO_PRINTER_SELECTED;
+ return;
+ }
+ thePrinter = thePrintContext->thePrinter;
+
+
+ for (i=0; i<(unsigned)MAXCOLORPLANES; i++)
+ if (CurrentMode->MixedRes) // means res(K) !+ res(C,M,Y)
+ numrows[i] = CurrentMode->ResolutionX[i] / CurrentMode->BaseResX;
+ else numrows[i]=1;
+
+ ResBoost = CurrentMode->BaseResX / CurrentMode->BaseResY;
+ if (ResBoost==0) ResBoost=1; // safety
+
+
+ pHead = thePrinter->SelectHeader(thePrintContext);
+ CNEWCHECK(pHead);
+
+
+ // set up blank raster used by SendRasters
+ constructor_error=setblankraster();
+ CERRCHECK;
+
+ // flush any garbage out of the printer's buffer
+ constructor_error=thePrinter->Flush();
+ CERRCHECK;
+ // send the PCL header
+ constructor_error=pHead->Send();
+ CERRCHECK;
+ // set CAPy after sending header in case header used it
+ CAPy=pHead->CAPy;
+
+
+ constructor_error=Configure();
+ CERRCHECK;
+
+
+#if defined(APDK_FONTS_NEEDED)
+
+ pText = new TextTranslator(thePrinter, pHead->QualityCode(),
+ thePrintContext->CurrentMode->dyeCount);
+ CNEWCHECK(pText);
+
+ theTextManager = NULL;
+ if (CurrentMode->bFontCapable)
+ {
+ unsigned int pixelsX = (unsigned int) (int) (thePrintContext->printablewidth() *
+ CurrentMode->BaseResX);
+ unsigned int pixelsY = (unsigned int) (int) (thePrintContext->printableheight() *
+ CurrentMode->BaseResY);
+
+ theTextManager=new TextManager( pText, pixelsX,pixelsY );
+ CNEWCHECK(theTextManager);
+ constructor_error = theTextManager->constructor_error;
+ CERRCHECK;
+ }
+#endif
+
+ if (!thePrintContext->ModeAgreesWithHardware(TRUE))
+ constructor_error = WARN_MODE_MISMATCH;
+
+#ifdef APDK_USAGE_LOG
+ UHeader[0]='\0';
+#endif
+} //Job
+
+DRIVER_ERROR Job::SetupHalftoning(HALFTONING_ALGORITHM eHT)
+// Subroutine of Job constructor to handle ColorMatcher/Halftoner initialization.
+// OutputWidth set in InitScaler (it is not the ultimate width if horizontal doubling is needed)
+// Has to decide whether to use matrix or fast-error-diffusion, open or proprietary.
+{
+// first level of decision on matrix-vs.FED is the printmode setting itself
+ BOOL usematrix = (eHT == MATRIX);
+// but this is overridden in speed-optimized builds
+// we also can simulate the build-switch at runtime in the test harness
+#ifdef APDK_OPTIMIZE_FOR_SPEED
+ usematrix = TRUE;
+#endif
+
+ pHalftoner = Create_Halftoner(thePrintContext->pSS, CurrentMode,
+ OutputWidth, numrows,ResBoost,usematrix);
+ NEWCHECK(pHalftoner);
+ return pHalftoner->constructor_error;
+} //SetupHalftoning
+
+DRIVER_ERROR Job::SetupColorMatching()
+{
+
+ unsigned int cmWidth=InputWidth;
+ if (pResSynth) // if 2X scaling happens before ColorMatching
+ cmWidth *= 2;
+
+ pColorMatcher = Create_ColorMatcher(thePrintContext->pSS, CurrentMode->cmap,
+ CurrentMode->dyeCount, cmWidth);
+ NEWCHECK(pColorMatcher);
+ return pColorMatcher->constructor_error;
+} //SetupColorMatching
+
+
+Job::~Job()
+{
+#ifdef APDK_CAPTURE
+ Capture_dJob();
+#endif
+
+ // Client isn't required to call NewPage at end of last page, so
+ // we may need to eject a page now.
+ if (DataSent)
+ {
+ MediaSource mSource = thePrintContext->GetMediaSource ();
+ if (mSource == sourceBanner)
+ {
+ thePrintContext->SetMediaSource (sourceTrayAuto);
+ }
+ newpage();
+ thePrintContext->SetMediaSource (mSource);
+ }
+
+
+ // Tell printer that job is over.
+ if(pHead)
+ {
+ pHead->EndJob();
+ }//end if
+
+// Delete the 4 components created in Job constructor.
+#if defined(APDK_FONTS_NEEDED)
+DBG1("deleting TextManager\n");
+ if (theTextManager)
+ {
+ delete theTextManager;
+ }
+#endif
+
+DBG1("deleting RasterSender\n");
+ if (pSender)
+ {
+ delete pSender;
+ }
+
+ if (pHalftoner)
+ {
+ delete pHalftoner;
+ }
+
+ if (pColorMatcher)
+ {
+ delete pColorMatcher;
+ }
+
+ if (BlankRaster)
+ {
+ pSS->FreeMemory(BlankRaster);
+ }
+
+ if (BlackRaster)
+ {
+ pSS->FreeMemory(BlackRaster);
+ }
+
+ if (pBlackPlaneReplicator)
+ {
+ delete pBlackPlaneReplicator;
+ }
+
+ if (pReplicator)
+ {
+ delete pReplicator;
+ }
+
+ if (pResSynth)
+ {
+ delete pResSynth;
+ }
+
+ if (thePipeline)
+ {
+ delete thePipeline;
+ }
+
+ if (pHead)
+ {
+ delete pHead;
+ }
+
+#if defined(APDK_VIP_COLORFILTERING)
+ if (pErnie)
+ {
+ delete pErnie;
+ }
+#endif
+
+ if (theCompressor)
+ {
+ delete theCompressor;
+ }
+
+ if (pBlackPlaneCompressor)
+ {
+ delete pBlackPlaneCompressor;
+ }
+
+#if defined(APDK_FONTS_NEEDED)
+ if (pText)
+ {
+ delete pText;
+ }
+#endif // defined(APDK_FONTS_NEEDED)
+
+ if(thePrinter)
+ {
+ BYTE temp = 0;
+ thePrinter->EndJob = TRUE; // the Job is done -
+ thePrinter->Send(&temp,0); // call Send to dump any buffered data
+ }//end if
+
+DBG1("done with ~Job\n");
+} //~Job
+
+
+DRIVER_ERROR Job::SendCAPy()
+{
+ return pHead->SendCAPy(CAPy++);
+} //SendCAPy
+
+///////////////////////////////////////////////////////////////////////////////////
+//
+/*!
+This is the fundamental method for the driver, by means of which graphics data
+is sent to the printer.
+*/
+DRIVER_ERROR Job::SendRasters(BYTE* ImageData) // RGB24 data for one raster
+// This is how graphical data is sent to the driver.
+
+// We do not check for rasters where data is supplied but happens
+// to be all blank (white); caller should have used NULL in this case.
+{
+#ifdef APDK_CAPTURE
+ Capture_SendRasters(NULL, ImageData);
+#endif
+
+ return sendrasters(NULL, ImageData);
+} //SendRasters
+
+
+///////////////////////////////////////////////////////////////////////////////////
+//
+/*!
+This is the fundamental method for the driver, by means of which graphics data
+is sent to the printer.
+*/
+DRIVER_ERROR Job::SendRasters(BYTE* BlackImageData, BYTE* ColorImageData) // 1bit K data and RGB24 data for one raster
+// This is how graphical data is sent to the driver.
+
+// We do not check for rasters where data is supplied but happens
+// to be all blank (white); caller should have used NULL in this case.
+{
+#ifdef APDK_CAPTURE
+ Capture_SendRasters(BlackImageData, ColorImageData);
+#endif
+ return sendrasters(BlackImageData, ColorImageData);
+} //SendRasters
+
+/*!
+This is the method for use to check if they can send a separate 1 bit black channel
+*/
+DRIVER_ERROR Job::SupportSeparateBlack(BOOL* bSeparateBlack)
+{
+ *bSeparateBlack = thePrinter->SupportSeparateBlack(CurrentMode);
+ return NO_ERROR;
+}
+
+// internal entry point, used by newpage
+DRIVER_ERROR Job::sendrasters(BYTE* BlackImageData, BYTE* ColorImageData)
+{
+ DRIVER_ERROR err = NO_ERROR;
+
+ if (thePipeline == NULL)
+ {
+ return SYSTEM_ERROR;
+ }
+
+ // need to put out some data occasionally in case of all-text page,
+ // so printer will go ahead and start printing the text before end of page
+ if (BlackImageData == NULL && ColorImageData == NULL)
+ {
+ if (thePrinter->GetDataFormat() == RASTER_STRIP)
+ {
+ skipcount=0;
+ ColorImageData=BlankRaster;
+ }
+ else
+ {
+ skipcount++;
+ if (skipcount >= 200)
+ {
+ skipcount=0;
+ ColorImageData=BlankRaster;
+ }
+ else
+ {
+ fcount += ScaleFactor;
+ }
+
+ err = thePipeline->Flush();
+ ERRCHECK;
+ }
+ }
+ else
+ {
+ skipcount=0;
+ DataSent=TRUE; // so we know we need a formfeed when job ends
+ }
+
+ RowsInput++; // needed in case res > 300
+
+ if (BlackImageData || ColorImageData)
+ {
+ if (fcount > 1000)
+ {
+ CAPy += fcount/1000;
+
+ err = thePrinter->SkipRasters ((fcount / 1000)); // needed for DJ3320
+ ERRCHECK;
+ fcount =fcount % 1000;
+ }
+
+ if (BlackImageData && CurrentMode->dyeCount != 3 && CurrentMode->dyeCount != 6)
+ {
+ err = setblackraster();
+ ERRCHECK;
+
+ for (unsigned int i = 0; i < thePrintContext->InputWidth / 8; i++)
+ {
+ unsigned char bitflag = 0x80;
+ for (unsigned int j = 0; j < 8; j++)
+ {
+ if (BlackImageData[i] & bitflag)
+ BlackRaster[i*8+j] = 1;
+ bitflag = bitflag >> 1;
+ }
+ }
+ if (thePrintContext->InputWidth % 8 > 0)
+ {
+ unsigned int i = thePrintContext->InputWidth / 8;
+ unsigned char bitflag = 0x80;
+ for (unsigned int j = 0; j < thePrintContext->InputWidth % 8; j++)
+ {
+ if (BlackImageData[i] & bitflag)
+ BlackRaster[i*8+j] = 1;
+ bitflag = bitflag >> 1;
+ }
+ }
+ thePipeline->Exec->raster.rastersize[COLORTYPE_BLACK] = thePrintContext->InputWidth;
+ thePipeline->Exec->raster.rasterdata[COLORTYPE_BLACK] = BlackRaster;
+ }
+ else
+ {
+ thePipeline->Exec->raster.rastersize[COLORTYPE_BLACK] = 0;
+ thePipeline->Exec->raster.rasterdata[COLORTYPE_BLACK] = NULL;
+ }
+ if (ColorImageData)
+ {
+ thePipeline->Exec->raster.rastersize[COLORTYPE_COLOR] = thePrintContext->InputWidth*3;
+ thePipeline->Exec->raster.rasterdata[COLORTYPE_COLOR] = ColorImageData;
+ }
+ else
+ {
+ thePipeline->Exec->raster.rastersize[COLORTYPE_COLOR] = 0;
+ thePipeline->Exec->raster.rasterdata[COLORTYPE_COLOR] = NULL;
+ }
+ err = thePipeline->Execute(&(thePipeline->Exec->raster));
+ }
+
+ return err;
+} //sendrasters
+
+
+DRIVER_ERROR Job::newpage()
+// (for internal use, called by external NewPage)
+{
+ DRIVER_ERROR err;
+
+ if (thePrinter->GetDataFormat() == RASTER_STRIP)
+ {
+ pHead->SetLastBand(TRUE);
+ }
+
+ sendrasters(); // flush pipeline
+
+ if ((thePrintContext->GetMediaSource ()) == sourceBanner)
+ {
+ CAPy = 0;
+ }
+ else
+ {
+ err = pHead->FormFeed();
+ ERRCHECK;
+
+ // reset vertical cursor counter
+ if (thePrinter->UseGUIMode(thePrintContext->CurrentMode) &&
+ ((int) (thePrintContext->PrintableStartY () * 100)) != 0)
+ // DJ895 in GUImode doesn't accept top-margin setting, so we use CAP for topmargin
+ // Start at the top for full-bleed printing - PhotoSmart 100 for now
+ {
+ CAPy = thePrintContext->GUITopMargin();
+ }
+ else
+ {
+ CAPy = 0;
+ }
+ }
+
+ skipcount = RowsInput = 0;
+ fcount = 0;
+
+// reset flag used to see if formfeed needed
+ DataSent = FALSE;
+
+ if (!thePrintContext->ModeAgreesWithHardware(TRUE))
+ {
+ return WARN_MODE_MISMATCH;
+ }
+
+#ifdef APDK_USAGE_LOG
+ theTranslator->PrintDotCount(UHeader);
+ theTranslator->NextPage();
+ UTextCount=UText=0;
+#endif
+
+ return NO_ERROR;
+} //newpage
+
+/*!
+This method forces the associated printer to flush the remaining buffered
+data and tells it that the job is ended.
+
+Calling this method is not mandatory, since the object destructor already
+performs this action. It may be required, however, if the destructor is not
+called for some reason (for instance, when the call depends on the execution
+of a "finalize" method of a Java wrapper.
+*/
+
+DRIVER_ERROR Job::Flush()
+{
+ if(thePrinter)
+ {
+ BYTE temp = 0;
+ thePrinter->EndJob = TRUE; // the Job is done -
+ return thePrinter->Send(&temp,0); // call Send to dump any buffered data
+ }//end if
+ return NO_PRINTER_SELECTED;
+}
+
+/*!
+Resets counters, flushes buffers, and sends a form feed to the printer.
+*/
+DRIVER_ERROR Job::NewPage()
+// External entry point
+{
+#ifdef APDK_CAPTURE
+ Capture_NewPage();
+#endif
+ return newpage();
+} //NewPage
+
+
+void Job::SetOutputWidth()
+// set OutputWidth -- this is local and may not agree with PrintContext
+// in cases where horizontal doubling is needed
+{
+ OutputWidth = thePrintContext->OutputWidth;
+ InputWidth = thePrintContext->InputWidth;
+
+ if (CurrentMode->BaseResX != CurrentMode->BaseResY) // if horizontal expansion needed
+ {
+ int mixedfactor = CurrentMode->BaseResX / CurrentMode->BaseResY;
+ int widthfactor = OutputWidth / InputWidth;
+ if (widthfactor >= mixedfactor)
+ {
+ OutputWidth = OutputWidth / mixedfactor;
+ }
+ }
+} //SetOutputWidth
+
+
+DRIVER_ERROR Job::InitScaler()
+// sets pResSynth & pReplicator
+{
+ unsigned int numerator, denominator;
+ // set OutputWidth -- this is local and may not agree with PrintContext
+ // in cases where horizontal doubling is needed (see next if clause)
+ SetOutputWidth();
+
+ if ((OutputWidth % InputWidth) == 0)
+ {
+ numerator = OutputWidth / InputWidth;
+ denominator = 1;
+ }
+ else
+ {
+ numerator = OutputWidth;
+ denominator = InputWidth;
+ }
+
+
+ float tempfactor = (float)numerator / (float)denominator;
+ tempfactor *= 1000.0f;
+ ScaleFactor = (unsigned int) (int) tempfactor;
+
+ // Two paths: if ResSynth included (proprietary path), then use it for the first doubling;
+ // otherwise do it all in PixelReplication phase
+ // but don't use ResSynth anyway if printer-res=600 and scale<4 (i.e. original-res<150),
+ // or printer-res=300 and scale<2.33 (i.e. original-res<133)
+ BOOL RSok;
+ BOOL speedy=FALSE;
+#ifdef APDK_OPTIMIZE_FOR_SPEED
+ speedy = TRUE;
+#endif // APDK_OPTIMIZE_FOR_SPEED
+ if (speedy)
+ {
+ RSok = FALSE;
+ }
+ else
+ {
+ if (thePrintContext->EffectiveResolutionX()>300)
+ {
+ // I don't know about 1200dpi, so I'm doing it this way
+ RSok = ScaleFactor >= 4000;
+ }
+ else
+ {
+ RSok = ScaleFactor >= 2333;
+ }
+ }
+
+
+ unsigned int ReplFormat; // how many bytes per pixel
+ if (CurrentMode->Config.bColorImage)
+ {
+ ReplFormat = CurrentMode->dyeCount; // dealing with colormatching output
+ }
+ else
+ {
+ ReplFormat = 3; // RGB only
+ }
+
+ BOOL vip = !CurrentMode->Config.bColorImage;
+
+ if ((!ProprietaryScaling()) || !RSok )
+ // everything happens at Replication phase; input may be KCMY (or K, CMY, etc.) or RGB
+ {
+ pResSynth=NULL;
+ pReplicator = new Scaler_Open(pSS,InputWidth,numerator,denominator,vip,ReplFormat);
+ NEWCHECK(pReplicator);
+ return pReplicator->constructor_error;
+ }
+
+ // Proprietary path and scalefactor>=2, so break it up into 2 parts
+ // first give ResSynth a factor of 2, which is all it really does anyway.
+
+ // Scaler_Prop only operates on RGB, so it doesn't need the last two parameters
+ pResSynth = Create_Scaler(pSS,InputWidth,2,1,
+ TRUE, // as if VIP since it is working on RGB only at this phase
+ 3); // 3 bytes per pixel
+ NEWCHECK(pResSynth);
+ pResSynth->myplane = COLORTYPE_COLOR;
+ if (pResSynth->constructor_error != NO_ERROR)
+ {
+ return pResSynth->constructor_error;
+ }
+
+ pBlackPlaneReplicator = new Scaler_Open(pSS,InputWidth,2,1,FALSE,1);
+ NEWCHECK(pBlackPlaneReplicator);
+ pBlackPlaneReplicator->myplane = COLORTYPE_BLACK;
+ if (pBlackPlaneReplicator->constructor_error != NO_ERROR)
+ {
+ return pBlackPlaneReplicator->constructor_error;
+ }
+
+ // now replicate the rest of the way -- only half as much left
+ pReplicator = new Scaler_Open(pSS,2*InputWidth,numerator,2*denominator,vip,ReplFormat);
+ NEWCHECK(pReplicator);
+ return pReplicator->constructor_error;
+
+} //InitScaler
+
+
+DRIVER_ERROR Job::Configure()
+// mode has been set -- now set up rasterwidths and pipeline
+{
+ DRIVER_ERROR err;
+ Pipeline* p=NULL;
+ unsigned int width;
+ BOOL useRS=FALSE;
+
+ err = InitScaler(); // create pReplicator and maybe pResSynth
+ ERRCHECK;
+
+ if ((CurrentMode->Config.bResSynth) && ProprietaryScaling()
+ && pResSynth) // pResSynth==NULL if no scaling required
+ {
+ p = new Pipeline(pBlackPlaneReplicator);
+ NEWCHECK(p);
+ if (thePipeline)
+ thePipeline->AddPhase(p);
+ else thePipeline=p;
+
+ p = new Pipeline(pResSynth);
+ NEWCHECK(p);
+ if (thePipeline)
+ thePipeline->AddPhase(p);
+ else thePipeline=p;
+ useRS=TRUE;
+ }
+
+#if (defined(APDK_DJ9xxVIP) || defined(APDK_LJJETREADY)) && defined(APDK_VIP_COLORFILTERING)
+ if (CurrentMode->Config.bErnie)
+ {
+ // create Ernie (need pixelwidth for constructor)
+ if (p)
+ {
+ width = p->GetMaxOutputWidth(COLORTYPE_COLOR) / 3; // GetOutputWidth returns # of bytes
+ }
+ else
+ {
+ width = thePrintContext->InputWidth;
+ }
+
+ // calculate Ernie threshold value
+ //Normal: threshold = (resolution) * (0.0876) - 2
+ // roughly: image at original 300 implies threshold=24; 600=>48, 150=>12, 75=>6
+ // to get resolution of "original" image, divide target resolution by scalefactor
+ float scale = (float)thePrintContext->OutputWidth / (float)thePrintContext->InputWidth;
+ float original_res = ((float)thePrintContext->EffectiveResolutionX()) / scale;
+ if (useRS && (scale >= 2.0f))
+ {
+ // image already doubled by ResSynth so consider the resolution as of now
+ original_res *= 2.0f;
+ }
+ float fthreshold = original_res * 0.0876f;
+ int threshold = (int)fthreshold - 2;
+
+ pErnie = new TErnieFilter(width, eBGRPixelData, threshold);
+ p = new Pipeline(pErnie);
+ NEWCHECK(p);
+ if (thePipeline)
+ {
+ thePipeline->AddPhase(p);
+ }
+ else
+ {
+ thePipeline = p;
+ }
+ }
+#endif //APDK_DJ9xxVIP && APDK_VIP_COLORFILTERING
+
+ if (CurrentMode->Config.bColorImage)
+ {
+ err = SetupColorMatching(); // create pColorMatcher
+ ERRCHECK;
+ p = new Pipeline(pColorMatcher);
+ NEWCHECK(p);
+ if (thePipeline)
+ {
+ thePipeline->AddPhase(p);
+ }
+ else
+ {
+ thePipeline = p;
+ }
+ }
+
+ if (CurrentMode->Config.bPixelReplicate)
+ {
+ // create Replicator
+ p = new Pipeline(pReplicator);
+ NEWCHECK(p);
+ if (thePipeline)
+ {
+ thePipeline->AddPhase(p);
+ }
+ else
+ {
+ thePipeline = p;
+ }
+ }
+
+ if (CurrentMode->Config.bColorImage)
+ {
+ err = SetupHalftoning(CurrentMode->Config.eHT); // create pHalftoner
+ ERRCHECK;
+ p = new Pipeline(pHalftoner);
+ NEWCHECK(p);
+ if (thePipeline)
+ {
+ thePipeline->AddPhase(p);
+ }
+ else
+ {
+ thePipeline = p;
+ }
+ }
+
+ if (CurrentMode->Config.bCompress)
+ {
+ if (p)
+ {
+ width = p->GetMaxOutputWidth(COLORTYPE_COLOR);
+ }
+ else
+ {
+ width = thePrintContext->InputWidth;
+ }
+ unsigned int SeedBufferSize;
+ if (pHalftoner) // if data is halftoned-output
+ {
+ // format is 1 bit-per-pixel for each ink,drop,pass
+ SeedBufferSize = MAXCOLORPLANES * MAXCOLORDEPTH * MAXCOLORROWS * width;
+ }
+ else // VIP data is just RGB24 here
+ {
+ SeedBufferSize = width;
+ }
+
+ theCompressor = thePrinter->CreateCompressor(SeedBufferSize);
+ NEWCHECK(theCompressor);
+ err = theCompressor->constructor_error;
+ ERRCHECK;
+ theCompressor->myplane = COLORTYPE_COLOR;
+
+ p = new Pipeline(theCompressor);
+ NEWCHECK(p);
+ if (thePipeline)
+ {
+ thePipeline->AddPhase(p);
+ }
+ else
+ {
+ thePipeline = p;
+ }
+ if (thePrinter->VIPPrinter())
+ {
+ width = (width/3+7)/8;
+ if (width > 0)
+ {
+ // VIP black data is 1 bit here
+ unsigned int SeedBufferSize;
+ SeedBufferSize = width;
+ pBlackPlaneCompressor = thePrinter->CreateBlackPlaneCompressor(SeedBufferSize, TRUE);
+ NEWCHECK(pBlackPlaneCompressor);
+ err = pBlackPlaneCompressor->constructor_error;
+ ERRCHECK;
+ pBlackPlaneCompressor->myplane = COLORTYPE_BLACK;
+
+ p = new Pipeline(pBlackPlaneCompressor);
+ NEWCHECK(p);
+ if (thePipeline)
+ {
+ thePipeline->AddPhase(p);
+ }
+ else
+ {
+ thePipeline = p;
+ }
+ }
+ }
+
+ }
+
+ // always end pipeline with RasterSender
+ // create RasterSender object
+ pSender = new RasterSender(thePrinter,thePrintContext,this,pHalftoner);
+ NEWCHECK(pSender);
+ err = pSender->constructor_error;
+ ERRCHECK;
+
+ p = new Pipeline(pSender);
+
+ if (thePipeline)
+ {
+ thePipeline->AddPhase(p);
+ }
+ else
+ {
+ thePipeline = p;
+ }
+
+ return NO_ERROR;
+} //Configure
+
+
+DRIVER_ERROR Job::setblankraster()
+{
+ if (BlankRaster)
+ {
+ pSS->FreeMemory(BlankRaster);
+ }
+
+ size_t BlankRasterSize = thePrintContext->OutputWidth * 3; // Raghu
+ BlankRaster = (BYTE*)pSS->AllocMem (BlankRasterSize);
+ NEWCHECK(BlankRaster);
+
+ memset (BlankRaster, 0xFF, BlankRasterSize); // Raghu
+
+ return NO_ERROR;
+} //setblankraster
+
+DRIVER_ERROR Job::setblackraster()
+{
+ size_t BlackRasterSize = thePrintContext->InputWidth;
+ if (!BlackRaster)
+ {
+ BlackRaster = (BYTE*)pSS->AllocMem (BlackRasterSize);
+ NEWCHECK(BlackRaster);
+ }
+ memset (BlackRaster, 0, BlackRasterSize);
+
+ return NO_ERROR;
+} //setblankraster
+
+
+//////////////////////////////////////////////////////////////////////
+#if defined(APDK_FONTS_NEEDED)
+
+/*!
+This method is used to send ASCII data to the printer, which it will render
+as determined by the Font object.
+*/
+DRIVER_ERROR Job::TextOut
+(
+ const char* pTextString,
+ unsigned int iLenString,
+ const Font& font,
+ int iAbsX,
+ int iAbsY
+)
+// This is how ASCII data is sent to the driver.
+// Everything is really handled by the TextManager, including error checking.
+{
+#ifdef APDK_CAPTURE
+ Capture_TextOut(pTextString, iLenString, font, iAbsX, iAbsY);
+#endif
+
+ // Map coordinates (assumed to be in the graphical space) to the text-placement grid,
+ // which may be of lower resolution, indicated by TextRes
+ //
+ // using floats to cover the unusual case where graphical res is lower than text
+ float xfactor = ((float)CurrentMode->BaseResX) / ((float)CurrentMode->TextRes);
+ float yfactor = ((float)CurrentMode->BaseResY) / ((float)CurrentMode->TextRes);
+
+ float x = (float)iAbsX / xfactor;
+ float y = (float)iAbsY / yfactor;
+
+ iAbsX = (unsigned int)(int)x; // double cast for webtv compiler
+ iAbsY = (unsigned int)(int)y;
+
+ DRIVER_ERROR err = theTextManager->TextOut(pTextString,iLenString,font,iAbsX,iAbsY);
+ ERRCHECK;
+
+ DataSent=TRUE;
+
+#ifdef APDK_USAGE_LOG
+ if (iLenString > UTextSize)
+ {
+ iLenString = UTextSize-1;
+ UHeader[iLenString] = '\0';
+ }
+ if (UTextCount<2)
+ {
+ strcpy(UHeader,pTextString);
+ UText += iLenString;
+ }
+ if (UTextCount==1)
+ {
+ UHeader[UText] = '\0';
+ }
+ UTextCount++;
+
+#endif
+
+ return err;
+} //TextOut
+
+#endif
+
+
+///////////////////////////////////////////////////////////
+// Pipeline management
+Pipeline::Pipeline
+(
+ Processor* E
+) :
+ next(NULL),
+ prev(NULL)
+{
+ Exec = E;
+ Exec->myphase = this;
+} //Pipeline
+
+
+void Pipeline::AddPhase(Pipeline* newp)
+{
+ Pipeline* p = this;
+ while (p->next)
+ {
+ p = p->next;
+ }
+ p->next = newp;
+ newp->prev = p;
+} //AddPhase
+
+
+Pipeline::~Pipeline()
+{
+ if (next)
+ {
+ delete next;
+ }
+} //~Pipeline
+
+
+BOOL Pipeline::Process(RASTERDATA* raster)
+{
+ return Exec->Process(raster);
+} //Process
+
+
+DRIVER_ERROR Pipeline::Execute(RASTERDATA* InputRaster)
+{
+ err=NO_ERROR;
+
+ if (Process(InputRaster) // true if output ready; may set err
+ && (err==NO_ERROR))
+ {
+ if (next)
+ {
+ next->Exec->raster.rasterdata[COLORTYPE_BLACK] = NextOutputRaster(COLORTYPE_BLACK);
+ next->Exec->raster.rasterdata[COLORTYPE_COLOR] = NextOutputRaster(COLORTYPE_COLOR);
+ while (next->Exec->raster.rasterdata[COLORTYPE_COLOR] ||
+ next->Exec->raster.rasterdata[COLORTYPE_BLACK])
+ {
+ next->Exec->raster.rastersize[COLORTYPE_COLOR] = GetOutputWidth(COLORTYPE_COLOR);
+ next->Exec->raster.rastersize[COLORTYPE_BLACK] = GetOutputWidth(COLORTYPE_BLACK);
+ err = next->Execute(&(next->Exec->raster));
+ ERRCHECK;
+ next->Exec->raster.rasterdata[COLORTYPE_BLACK] = NextOutputRaster(COLORTYPE_BLACK);
+ next->Exec->raster.rasterdata[COLORTYPE_COLOR] = NextOutputRaster(COLORTYPE_COLOR);
+ }
+ }
+ }
+ return err;
+} //Execute
+
+
+DRIVER_ERROR Pipeline::Flush()
+{
+ err=NO_ERROR;
+
+ Exec->Flush();
+
+ if (next && (err == NO_ERROR))
+ {
+ next->Exec->raster.rasterdata[COLORTYPE_BLACK] = NextOutputRaster(COLORTYPE_BLACK);
+ next->Exec->raster.rasterdata[COLORTYPE_COLOR] = NextOutputRaster(COLORTYPE_COLOR);
+ while (next->Exec->raster.rasterdata[COLORTYPE_COLOR] || next->Exec->raster.rasterdata[COLORTYPE_BLACK])
+ {
+ next->Exec->raster.rastersize[COLORTYPE_BLACK] = GetOutputWidth(COLORTYPE_BLACK);
+ next->Exec->raster.rastersize[COLORTYPE_COLOR] = GetOutputWidth(COLORTYPE_COLOR);
+ err = next->Execute(&(next->Exec->raster));
+ next->Exec->raster.rasterdata[COLORTYPE_BLACK] = NextOutputRaster(COLORTYPE_BLACK);
+ next->Exec->raster.rasterdata[COLORTYPE_COLOR] = NextOutputRaster(COLORTYPE_COLOR);
+ ERRCHECK;
+ }
+ // one more to continue flushing downstream
+ err = next->Flush();
+ }
+
+ return err;
+} //Flush
+
+
+Processor::Processor() :
+ iRastersReady(0),
+ iRastersDelivered(0),
+ myphase(NULL),
+ myplane(COLORTYPE_BOTH)
+{
+ for (int i = COLORTYPE_COLOR; i < MAX_COLORTYPE; i++)
+ {
+ raster.rasterdata[i] = NULL;
+ raster.rastersize[i] = 0;
+ }
+} //Processor
+
+
+Processor::~Processor()
+{
+} //~Processor
+
+APDK_END_NAMESPACE
diff --git a/prnt/hpijs/job.h b/prnt/hpijs/job.h
new file mode 100644
index 0000000..fcb041f
--- /dev/null
+++ b/prnt/hpijs/job.h
@@ -0,0 +1,161 @@
+/*****************************************************************************\
+ job.h : Interface/Implimentation for the Job class
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#ifndef APDK_JOB_H
+#define APDK_JOB_H
+
+APDK_BEGIN_NAMESPACE
+
+#if defined(APDK_VIP_COLORFILTERING)
+class TErnieFilter;
+#endif
+
+class RasterSender;
+class Header;
+class TextTranslator;
+class TextManager;
+class Halftoner;
+class ColorMatcher;
+class Scaler;
+
+
+//Job
+//! Manages processes to create output for the device
+/*! \class Job job.h "hpprintapi.h"
+This object receives processes and transmits data to be printed by one device
+on successive pages. The PrintContext and Job together form the core of the
+driver proper.
+
+\sa PrintContext
+******************************************************************************/
+class Job
+{
+friend class RasterSender;
+
+public:
+ Job(PrintContext* pPC);
+
+ virtual ~Job();
+
+ DRIVER_ERROR constructor_error; // caller must check upon return
+
+ DRIVER_ERROR SendRasters(BYTE* ImageData=(BYTE*)NULL);
+
+ DRIVER_ERROR SendRasters(BYTE* BlackImageData, BYTE* ColorImageData);
+
+ DRIVER_ERROR SupportSeparateBlack(BOOL* bSeparateBlack);
+
+#if defined(APDK_FONTS_NEEDED)
+ DRIVER_ERROR TextOut(const char* pTextString, unsigned int iLenString,
+ const Font& font, int iAbsX, int iAbsY );
+ // return theTextManager->TextOut(pTextString,iLenString,font,iAbsX,iAbsY);
+#endif
+
+ DRIVER_ERROR Flush();
+ DRIVER_ERROR NewPage();
+
+private:
+
+ PrintContext* thePrintContext;
+ SystemServices* pSS;
+ Printer* thePrinter;
+ Pipeline* thePipeline;
+ TextTranslator* pText;
+ RasterSender* pSender;
+ Halftoner* pHalftoner;
+ ColorMatcher* pColorMatcher;
+ Scaler* pResSynth;
+ Scaler* pBlackPlaneReplicator;
+ Scaler* pReplicator;
+ Compressor* theCompressor;
+ Compressor* pBlackPlaneCompressor;
+ Header* pHead;
+#if defined(APDK_VIP_COLORFILTERING)
+ TErnieFilter* pErnie;
+#endif
+
+#if defined(APDK_FONTS_NEEDED)
+ TextManager* theTextManager;
+#endif
+
+ PrintMode* CurrentMode;
+
+ unsigned int fcount;
+ unsigned int skipcount;
+ unsigned int RowsInput;
+ BYTE* BlankRaster;
+ BYTE* BlackRaster;
+
+ unsigned int CAPy; // maintains cursor-pos for graphics purposes,
+ // independent of intervening text positioning
+ BOOL DataSent;
+
+ unsigned int ResBoost; // for horizontal expansion
+ unsigned int numrows[MAXCOLORPLANES]; // rows per call for mixed-res only
+ unsigned int OutputWidth;
+ unsigned int InputWidth;
+ unsigned int ScaleFactor;
+
+ DRIVER_ERROR Configure();
+ DRIVER_ERROR InitScaler();
+
+ DRIVER_ERROR newpage();
+ DRIVER_ERROR SetupHalftoning(HALFTONING_ALGORITHM eHT);
+ DRIVER_ERROR SetupColorMatching();
+ DRIVER_ERROR SendCAPy();
+ DRIVER_ERROR sendrasters(BYTE* BlackImageData=(BYTE*)NULL, BYTE* ColorImageData=(BYTE*)NULL);
+ DRIVER_ERROR setblankraster();
+ DRIVER_ERROR setblackraster();
+ void SetOutputWidth();
+
+#ifdef APDK_CAPTURE
+ void Capture_Job(PrintContext* pPC);
+ void Capture_dJob();
+ void Capture_SendRasters(BYTE* BlackImageData, BYTE* ColorImageData);
+#if defined(APDK_FONTS_NEEDED)
+ void Capture_TextOut(const char* pTextString, unsigned int iLenString,
+ const Font& font, unsigned int iAbsX, unsigned int iAbsY );
+#endif
+ void Capture_NewPage();
+#endif
+
+#ifdef APDK_USAGE_LOG
+ int UTextCount;
+ int UText;
+#define UTextSize 100
+ char UHeader[UTextSize*2];
+#endif
+
+}; //Job
+
+APDK_END_NAMESPACE
+
+#endif //APDK_JOB_H
diff --git a/prnt/hpijs/jpegint.h b/prnt/hpijs/jpegint.h
new file mode 100644
index 0000000..95b00d4
--- /dev/null
+++ b/prnt/hpijs/jpegint.h
@@ -0,0 +1,392 @@
+/*
+ * jpegint.h
+ *
+ * Copyright (C) 1991-1997, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file provides common declarations for the various JPEG modules.
+ * These declarations are considered internal to the JPEG library; most
+ * applications using the library shouldn't need to include this file.
+ */
+
+
+/* Declarations for both compression & decompression */
+
+typedef enum { /* Operating modes for buffer controllers */
+ JBUF_PASS_THRU, /* Plain stripwise operation */
+ /* Remaining modes require a full-image buffer to have been created */
+ JBUF_SAVE_SOURCE, /* Run source subobject only, save output */
+ JBUF_CRANK_DEST, /* Run dest subobject only, using saved data */
+ JBUF_SAVE_AND_PASS /* Run both subobjects, save output */
+} J_BUF_MODE;
+
+/* Values of global_state field (jdapi.c has some dependencies on ordering!) */
+#define CSTATE_START 100 /* after create_compress */
+#define CSTATE_SCANNING 101 /* start_compress done, write_scanlines OK */
+#define CSTATE_RAW_OK 102 /* start_compress done, write_raw_data OK */
+#define CSTATE_WRCOEFS 103 /* jpeg_write_coefficients done */
+#define DSTATE_START 200 /* after create_decompress */
+#define DSTATE_INHEADER 201 /* reading header markers, no SOS yet */
+#define DSTATE_READY 202 /* found SOS, ready for start_decompress */
+#define DSTATE_PRELOAD 203 /* reading multiscan file in start_decompress*/
+#define DSTATE_PRESCAN 204 /* performing dummy pass for 2-pass quant */
+#define DSTATE_SCANNING 205 /* start_decompress done, read_scanlines OK */
+#define DSTATE_RAW_OK 206 /* start_decompress done, read_raw_data OK */
+#define DSTATE_BUFIMAGE 207 /* expecting jpeg_start_output */
+#define DSTATE_BUFPOST 208 /* looking for SOS/EOI in jpeg_finish_output */
+#define DSTATE_RDCOEFS 209 /* reading file in jpeg_read_coefficients */
+#define DSTATE_STOPPING 210 /* looking for EOI in jpeg_finish_decompress */
+
+
+/* Declarations for compression modules */
+
+/* Master control module */
+struct jpeg_comp_master {
+ JMETHOD(void, prepare_for_pass, (j_compress_ptr cinfo));
+ JMETHOD(void, pass_startup, (j_compress_ptr cinfo));
+ JMETHOD(void, finish_pass, (j_compress_ptr cinfo));
+
+ /* State variables made visible to other modules */
+ boolean call_pass_startup; /* True if pass_startup must be called */
+ boolean is_last_pass; /* True during last pass */
+};
+
+/* Main buffer control (downsampled-data buffer) */
+struct jpeg_c_main_controller {
+ JMETHOD(void, start_pass, (j_compress_ptr cinfo, J_BUF_MODE pass_mode));
+ JMETHOD(void, process_data, (j_compress_ptr cinfo,
+ JSAMPARRAY input_buf, JDIMENSION *in_row_ctr,
+ JDIMENSION in_rows_avail));
+};
+
+/* Compression preprocessing (downsampling input buffer control) */
+struct jpeg_c_prep_controller {
+ JMETHOD(void, start_pass, (j_compress_ptr cinfo, J_BUF_MODE pass_mode));
+ JMETHOD(void, pre_process_data, (j_compress_ptr cinfo,
+ JSAMPARRAY input_buf,
+ JDIMENSION *in_row_ctr,
+ JDIMENSION in_rows_avail,
+ JSAMPIMAGE output_buf,
+ JDIMENSION *out_row_group_ctr,
+ JDIMENSION out_row_groups_avail));
+};
+
+/* Coefficient buffer control */
+struct jpeg_c_coef_controller {
+ JMETHOD(void, start_pass, (j_compress_ptr cinfo, J_BUF_MODE pass_mode));
+ JMETHOD(boolean, compress_data, (j_compress_ptr cinfo,
+ JSAMPIMAGE input_buf));
+};
+
+/* Colorspace conversion */
+struct jpeg_color_converter {
+ JMETHOD(void, start_pass, (j_compress_ptr cinfo));
+ JMETHOD(void, color_convert, (j_compress_ptr cinfo,
+ JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
+ JDIMENSION output_row, int num_rows));
+};
+
+/* Downsampling */
+struct jpeg_downsampler {
+ JMETHOD(void, start_pass, (j_compress_ptr cinfo));
+ JMETHOD(void, downsample, (j_compress_ptr cinfo,
+ JSAMPIMAGE input_buf, JDIMENSION in_row_index,
+ JSAMPIMAGE output_buf,
+ JDIMENSION out_row_group_index));
+
+ boolean need_context_rows; /* TRUE if need rows above & below */
+};
+
+/* Forward DCT (also controls coefficient quantization) */
+struct jpeg_forward_dct {
+ JMETHOD(void, start_pass, (j_compress_ptr cinfo));
+ /* perhaps this should be an array??? */
+ JMETHOD(void, forward_DCT, (j_compress_ptr cinfo,
+ jpeg_component_info * compptr,
+ JSAMPARRAY sample_data, JBLOCKROW coef_blocks,
+ JDIMENSION start_row, JDIMENSION start_col,
+ JDIMENSION num_blocks));
+};
+
+/* Entropy encoding */
+struct jpeg_entropy_encoder {
+ JMETHOD(void, start_pass, (j_compress_ptr cinfo, boolean gather_statistics));
+ JMETHOD(boolean, encode_mcu, (j_compress_ptr cinfo, JBLOCKROW *MCU_data));
+ JMETHOD(void, finish_pass, (j_compress_ptr cinfo));
+};
+
+/* Marker writing */
+struct jpeg_marker_writer {
+ JMETHOD(void, write_file_header, (j_compress_ptr cinfo));
+ JMETHOD(void, write_frame_header, (j_compress_ptr cinfo));
+ JMETHOD(void, write_scan_header, (j_compress_ptr cinfo));
+ JMETHOD(void, write_file_trailer, (j_compress_ptr cinfo));
+ JMETHOD(void, write_tables_only, (j_compress_ptr cinfo));
+ /* These routines are exported to allow insertion of extra markers */
+ /* Probably only COM and APPn markers should be written this way */
+ JMETHOD(void, write_marker_header, (j_compress_ptr cinfo, int marker,
+ unsigned int datalen));
+ JMETHOD(void, write_marker_byte, (j_compress_ptr cinfo, int val));
+};
+
+
+/* Declarations for decompression modules */
+
+/* Master control module */
+struct jpeg_decomp_master {
+ JMETHOD(void, prepare_for_output_pass, (j_decompress_ptr cinfo));
+ JMETHOD(void, finish_output_pass, (j_decompress_ptr cinfo));
+
+ /* State variables made visible to other modules */
+ boolean is_dummy_pass; /* True during 1st pass for 2-pass quant */
+};
+
+/* Input control module */
+struct jpeg_input_controller {
+ JMETHOD(int, consume_input, (j_decompress_ptr cinfo));
+ JMETHOD(void, reset_input_controller, (j_decompress_ptr cinfo));
+ JMETHOD(void, start_input_pass, (j_decompress_ptr cinfo));
+ JMETHOD(void, finish_input_pass, (j_decompress_ptr cinfo));
+
+ /* State variables made visible to other modules */
+ boolean has_multiple_scans; /* True if file has multiple scans */
+ boolean eoi_reached; /* True when EOI has been consumed */
+};
+
+/* Main buffer control (downsampled-data buffer) */
+struct jpeg_d_main_controller {
+ JMETHOD(void, start_pass, (j_decompress_ptr cinfo, J_BUF_MODE pass_mode));
+ JMETHOD(void, process_data, (j_decompress_ptr cinfo,
+ JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
+ JDIMENSION out_rows_avail));
+};
+
+/* Coefficient buffer control */
+struct jpeg_d_coef_controller {
+ JMETHOD(void, start_input_pass, (j_decompress_ptr cinfo));
+ JMETHOD(int, consume_data, (j_decompress_ptr cinfo));
+ JMETHOD(void, start_output_pass, (j_decompress_ptr cinfo));
+ JMETHOD(int, decompress_data, (j_decompress_ptr cinfo,
+ JSAMPIMAGE output_buf));
+ /* Pointer to array of coefficient virtual arrays, or NULL if none */
+ jvirt_barray_ptr *coef_arrays;
+};
+
+/* Decompression postprocessing (color quantization buffer control) */
+struct jpeg_d_post_controller {
+ JMETHOD(void, start_pass, (j_decompress_ptr cinfo, J_BUF_MODE pass_mode));
+ JMETHOD(void, post_process_data, (j_decompress_ptr cinfo,
+ JSAMPIMAGE input_buf,
+ JDIMENSION *in_row_group_ctr,
+ JDIMENSION in_row_groups_avail,
+ JSAMPARRAY output_buf,
+ JDIMENSION *out_row_ctr,
+ JDIMENSION out_rows_avail));
+};
+
+/* Marker reading & parsing */
+struct jpeg_marker_reader {
+ JMETHOD(void, reset_marker_reader, (j_decompress_ptr cinfo));
+ /* Read markers until SOS or EOI.
+ * Returns same codes as are defined for jpeg_consume_input:
+ * JPEG_SUSPENDED, JPEG_REACHED_SOS, or JPEG_REACHED_EOI.
+ */
+ JMETHOD(int, read_markers, (j_decompress_ptr cinfo));
+ /* Read a restart marker --- exported for use by entropy decoder only */
+ jpeg_marker_parser_method read_restart_marker;
+
+ /* State of marker reader --- nominally internal, but applications
+ * supplying COM or APPn handlers might like to know the state.
+ */
+ boolean saw_SOI; /* found SOI? */
+ boolean saw_SOF; /* found SOF? */
+ int next_restart_num; /* next restart number expected (0-7) */
+ unsigned int discarded_bytes; /* # of bytes skipped looking for a marker */
+};
+
+/* Entropy decoding */
+struct jpeg_entropy_decoder {
+ JMETHOD(void, start_pass, (j_decompress_ptr cinfo));
+ JMETHOD(boolean, decode_mcu, (j_decompress_ptr cinfo,
+ JBLOCKROW *MCU_data));
+
+ /* This is here to share code between baseline and progressive decoders; */
+ /* other modules probably should not use it */
+ boolean insufficient_data; /* set TRUE after emitting warning */
+};
+
+/* Inverse DCT (also performs dequantization) */
+typedef JMETHOD(void, inverse_DCT_method_ptr,
+ (j_decompress_ptr cinfo, jpeg_component_info * compptr,
+ JCOEFPTR coef_block,
+ JSAMPARRAY output_buf, JDIMENSION output_col));
+
+struct jpeg_inverse_dct {
+ JMETHOD(void, start_pass, (j_decompress_ptr cinfo));
+ /* It is useful to allow each component to have a separate IDCT method. */
+ inverse_DCT_method_ptr inverse_DCT[MAX_COMPONENTS];
+};
+
+/* Upsampling (note that upsampler must also call color converter) */
+struct jpeg_upsampler {
+ JMETHOD(void, start_pass, (j_decompress_ptr cinfo));
+ JMETHOD(void, upsample, (j_decompress_ptr cinfo,
+ JSAMPIMAGE input_buf,
+ JDIMENSION *in_row_group_ctr,
+ JDIMENSION in_row_groups_avail,
+ JSAMPARRAY output_buf,
+ JDIMENSION *out_row_ctr,
+ JDIMENSION out_rows_avail));
+
+ boolean need_context_rows; /* TRUE if need rows above & below */
+};
+
+/* Colorspace conversion */
+struct jpeg_color_deconverter {
+ JMETHOD(void, start_pass, (j_decompress_ptr cinfo));
+ JMETHOD(void, color_convert, (j_decompress_ptr cinfo,
+ JSAMPIMAGE input_buf, JDIMENSION input_row,
+ JSAMPARRAY output_buf, int num_rows));
+};
+
+/* Color quantization or color precision reduction */
+struct jpeg_color_quantizer {
+ JMETHOD(void, start_pass, (j_decompress_ptr cinfo, boolean is_pre_scan));
+ JMETHOD(void, color_quantize, (j_decompress_ptr cinfo,
+ JSAMPARRAY input_buf, JSAMPARRAY output_buf,
+ int num_rows));
+ JMETHOD(void, finish_pass, (j_decompress_ptr cinfo));
+ JMETHOD(void, new_color_map, (j_decompress_ptr cinfo));
+};
+
+
+/* Miscellaneous useful macros */
+
+#undef MAX
+#define MAX(a,b) ((a) > (b) ? (a) : (b))
+#undef MIN
+#define MIN(a,b) ((a) < (b) ? (a) : (b))
+
+
+/* We assume that right shift corresponds to signed division by 2 with
+ * rounding towards minus infinity. This is correct for typical "arithmetic
+ * shift" instructions that shift in copies of the sign bit. But some
+ * C compilers implement >> with an unsigned shift. For these machines you
+ * must define RIGHT_SHIFT_IS_UNSIGNED.
+ * RIGHT_SHIFT provides a proper signed right shift of an INT32 quantity.
+ * It is only applied with constant shift counts. SHIFT_TEMPS must be
+ * included in the variables of any routine using RIGHT_SHIFT.
+ */
+
+#ifdef RIGHT_SHIFT_IS_UNSIGNED
+#define SHIFT_TEMPS INT32 shift_temp;
+#define RIGHT_SHIFT(x,shft) \
+ ((shift_temp = (x)) < 0 ? \
+ (shift_temp >> (shft)) | ((~((INT32) 0)) << (32-(shft))) : \
+ (shift_temp >> (shft)))
+#else
+#define SHIFT_TEMPS
+#define RIGHT_SHIFT(x,shft) ((x) >> (shft))
+#endif
+
+
+/* Short forms of external names for systems with brain-damaged linkers. */
+
+#ifdef NEED_SHORT_EXTERNAL_NAMES
+#define jinit_compress_master jICompress
+#define jinit_c_master_control jICMaster
+#define jinit_c_main_controller jICMainC
+#define jinit_c_prep_controller jICPrepC
+#define jinit_c_coef_controller jICCoefC
+#define jinit_color_converter jICColor
+#define jinit_downsampler jIDownsampler
+#define jinit_forward_dct jIFDCT
+#define jinit_huff_encoder jIHEncoder
+#define jinit_phuff_encoder jIPHEncoder
+#define jinit_marker_writer jIMWriter
+#define jinit_master_decompress jIDMaster
+#define jinit_d_main_controller jIDMainC
+#define jinit_d_coef_controller jIDCoefC
+#define jinit_d_post_controller jIDPostC
+#define jinit_input_controller jIInCtlr
+#define jinit_marker_reader jIMReader
+#define jinit_huff_decoder jIHDecoder
+#define jinit_phuff_decoder jIPHDecoder
+#define jinit_inverse_dct jIIDCT
+#define jinit_upsampler jIUpsampler
+#define jinit_color_deconverter jIDColor
+#define jinit_1pass_quantizer jI1Quant
+#define jinit_2pass_quantizer jI2Quant
+#define jinit_merged_upsampler jIMUpsampler
+#define jinit_memory_mgr jIMemMgr
+#define jdiv_round_up jDivRound
+#define jround_up jRound
+#define jcopy_sample_rows jCopySamples
+#define jcopy_block_row jCopyBlocks
+#define jzero_far jZeroFar
+#define jpeg_zigzag_order jZIGTable
+#define jpeg_natural_order jZAGTable
+#endif /* NEED_SHORT_EXTERNAL_NAMES */
+
+
+/* Compression module initialization routines */
+EXTERN(void) jinit_compress_master JPP((j_compress_ptr cinfo));
+EXTERN(void) jinit_c_master_control JPP((j_compress_ptr cinfo,
+ boolean transcode_only));
+EXTERN(void) jinit_c_main_controller JPP((j_compress_ptr cinfo,
+ boolean need_full_buffer));
+EXTERN(void) jinit_c_prep_controller JPP((j_compress_ptr cinfo,
+ boolean need_full_buffer));
+EXTERN(void) jinit_c_coef_controller JPP((j_compress_ptr cinfo,
+ boolean need_full_buffer));
+EXTERN(void) jinit_color_converter JPP((j_compress_ptr cinfo));
+EXTERN(void) jinit_downsampler JPP((j_compress_ptr cinfo));
+EXTERN(void) jinit_forward_dct JPP((j_compress_ptr cinfo));
+EXTERN(void) jinit_huff_encoder JPP((j_compress_ptr cinfo));
+EXTERN(void) jinit_phuff_encoder JPP((j_compress_ptr cinfo));
+EXTERN(void) jinit_marker_writer JPP((j_compress_ptr cinfo));
+/* Decompression module initialization routines */
+EXTERN(void) jinit_master_decompress JPP((j_decompress_ptr cinfo));
+EXTERN(void) jinit_d_main_controller JPP((j_decompress_ptr cinfo,
+ boolean need_full_buffer));
+EXTERN(void) jinit_d_coef_controller JPP((j_decompress_ptr cinfo,
+ boolean need_full_buffer));
+EXTERN(void) jinit_d_post_controller JPP((j_decompress_ptr cinfo,
+ boolean need_full_buffer));
+EXTERN(void) jinit_input_controller JPP((j_decompress_ptr cinfo));
+EXTERN(void) jinit_marker_reader JPP((j_decompress_ptr cinfo));
+EXTERN(void) jinit_huff_decoder JPP((j_decompress_ptr cinfo));
+EXTERN(void) jinit_phuff_decoder JPP((j_decompress_ptr cinfo));
+EXTERN(void) jinit_inverse_dct JPP((j_decompress_ptr cinfo));
+EXTERN(void) jinit_upsampler JPP((j_decompress_ptr cinfo));
+EXTERN(void) jinit_color_deconverter JPP((j_decompress_ptr cinfo));
+EXTERN(void) jinit_1pass_quantizer JPP((j_decompress_ptr cinfo));
+EXTERN(void) jinit_2pass_quantizer JPP((j_decompress_ptr cinfo));
+EXTERN(void) jinit_merged_upsampler JPP((j_decompress_ptr cinfo));
+/* Memory manager initialization */
+EXTERN(void) jinit_memory_mgr JPP((j_common_ptr cinfo));
+
+/* Utility routines in jutils.c */
+EXTERN(long) jdiv_round_up JPP((long a, long b));
+EXTERN(long) jround_up JPP((long a, long b));
+EXTERN(void) jcopy_sample_rows JPP((JSAMPARRAY input_array, int source_row,
+ JSAMPARRAY output_array, int dest_row,
+ int num_rows, JDIMENSION num_cols));
+EXTERN(void) jcopy_block_row JPP((JBLOCKROW input_row, JBLOCKROW output_row,
+ JDIMENSION num_blocks));
+EXTERN(void) jzero_far JPP((void FAR * target, size_t bytestozero));
+/* Constant tables in jutils.c */
+#if 0 /* This table is not actually needed in v6a */
+extern const int jpeg_zigzag_order[]; /* natural coef order to zigzag order */
+#endif
+extern const int jpeg_natural_order[]; /* zigzag coef order to natural order */
+
+/* Suppress undefined-structure complaints if necessary. */
+
+#ifdef INCOMPLETE_TYPES_BROKEN
+#ifndef AM_MEMORY_MANAGER /* only jmemmgr.c defines these */
+struct jvirt_sarray_control { long dummy; };
+struct jvirt_barray_control { long dummy; };
+#endif
+#endif /* INCOMPLETE_TYPES_BROKEN */
diff --git a/prnt/hpijs/ldlencap.h b/prnt/hpijs/ldlencap.h
new file mode 100644
index 0000000..bb6c3a2
--- /dev/null
+++ b/prnt/hpijs/ldlencap.h
@@ -0,0 +1,222 @@
+/*****************************************************************************\
+ ldlencap.h : definitions for the lidil encapsulation
+
+ Copyright (c) 2001 - 2002, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ \***************************************************************************/
+#ifndef _LDLENCAP
+#define _LDLECNAP
+
+// Wait times
+#define PACKET_WAIT 5
+#define IO_WAIT 5
+#define CREDIT_WAIT 5
+#define ERROR_WAIT 20
+
+// Bytes to retrieve data from packet are 0-based, i.e. FRAME_BYTE is 1st byte of packet,
+// but 0th element of buffer. Command packets and credit packets may have different elements
+// with the same value
+#define FRAME_BYTE 0
+#define COMMAND_LENGTH_BYTE 1
+#define PACKET_TYPE_BYTE 4
+#define COMMAND_NUMBER_BYTE 5
+#define REFERENCE_NUMBER_BYTE 6
+#define DATA_LENGTH_BYTE 8
+#define NUMBER_OF_COMMANDS_BYTE 10
+#define COMMAND_OPT_BYTE 10
+#define CREDIT_BYTE 11
+
+// Packet types
+#define RESPONSE_COMMAND_EXECUTED 16
+#define RESPONSE_AUTO 24
+#define ABSOLUTE_CREDIT 32
+#define INCREMENTAL_CREDIT 33
+
+// Command numbers
+#define COMMAND_CANCEL 0
+#define COMMAND_QUERY 5
+#define COMMAND_CONTINUE 12
+#define COMMAND_PREPARE_TO_CANCEL 12
+
+// Auto response numbers 1-5 are reserved, but we'll probably only ever use number 1
+#define AUTO_RESPONSE_STATUS 1
+
+// MAX_PACKET_SIZE has to be a multiple of 64, which is the packet size of the printer
+// See comment at LDLEncap::GetPackets
+#define MAX_PACKET_READ_SIZE 256
+
+// Special packet types
+const BYTE byEnablePacing[] = { 0x24, 0x00, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x24 };
+const BYTE byResetLIDIL[] = { 0x24, 0x00, 0x10, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x24 };
+
+// The Sync packet has 245 bytes of 0's as command options and 2048 bytes of 0's as data following
+// the trailing frame byte. Rather than explicitly initialize the entire Sync packet with 0's here,
+// we'll just initialize up to the COMMAND_OPT_BYTE and fill in the rest of the command in the
+// LDLEncap constructor using memcpy
+const BYTE bySync[] = { 0x24, 0x01, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x08,
+ 0x00 };
+const BYTE bySyncComplete[] = { 0x24, 0x00, 0x10, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x24 };
+// Commands
+//const BYTE byDisableResponses[] = { 0x24, 0x00, 0x10, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00,
+// 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x24 };
+//const BYTE byEnableResponses[] = { 0x24, 0x00, 0x10, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00,
+// 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x24 };
+//const BYTE byStatusQuery[] = { 0x24, 0x00, 0x10, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00,
+// 0x00, 0x01, 0x00, 0x00, 0x00, 0xFF, 0x24 };
+const BYTE byEOCStatusQuery[] = { 0x24, 0x00, 0x10, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x02, 0x00, 0x01, 0xFF, 0x24 };
+const BYTE byContinue[] = { 0x24, 0x00, 0x10, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00,
+ 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0x24 };
+const BYTE byPrepareToCancel[] = { 0x24, 0x00, 0x10, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00,
+ 0x00, 0x0A, 0xFF, 0xFF, 0xFF, 0xFF, 0x24 };
+
+const int CANCELSIZE = 16;
+const int SYNCSIZE = 2304;
+const int SYNC_CMD_OPT_SIZE = 245;
+//const int QUERYSIZE = sizeof(byEnableResponses) + sizeof(byStatusQuery) + sizeof(byDisableResponses);
+
+typedef unsigned short UInt16;
+typedef unsigned long UInt32;
+typedef unsigned char UChar;
+typedef unsigned int Int16;
+typedef long Int32;
+typedef enum
+{
+ eLDLStartJob = 0,
+ eLDLEndJob = 0,
+ eLDLLoadPage = 1,
+ eLDLEjectPage =2,
+ eLDLPrintSweep=3,
+ eLDLLoadSweepData=4,
+ eLDLQueryPrinter = 5,
+ eLDLComments=7,
+ eLDLHandlePen = 8,
+ eLDLControl = 12,
+ eLDLDataStreamVersion=12
+}LDLCMD;
+
+typedef enum
+{
+ eLDLUnknownColor=-1,
+ eLDLBlack,
+ eLDLCyan,
+ eLDLMagenta,
+ eLDLYellow,
+ eLDLLoCyan,
+ eLDLLoMagenta,
+ eLDLLoBlack,
+ eLDLMaxColor
+} COLORENUM;
+
+
+#define LDLPACKET_MINSIZE 16 // define the minimum packet size defined by the protocol
+#define FRAME_SYN '$' // defined the synchronization frame
+#define OPTIMIZED_DELAYLIMIT 0 // defined how many PrintSweep will be sent before the
+ // first LoadSweepData command
+
+#define LDL_MAX_IMAGE_SIZE 2048
+
+
+#define SIZEOF_LDLHDR 10
+#define SIZEOF_LDLTERM 1
+#define SIZEOF_LDL_JOB_CMDOPT 5
+
+// define possible operation field
+#define OPERATION_STJOB 0
+#define OPERATION_ENDJOB 1
+#define OPERATION_CANCJOB 2
+
+#define SIZEOF_LDL_LDPAGE_CMDOPT 17
+
+// defn for possible option field settings
+#define MEDIATYPE_PLAIN 0 // possible types for mediatype field
+#define MEDIATYPE_PHOTO 3
+
+#define MEDIASRC_MAINTRAY 0 // possible setting for mediasrc
+
+#define MEDIADEST_MAINBIN 0 // possible setting for mediadest
+
+#define QUALITYLEVEL_DRAFT -1 // possible setting for quality
+#define QUALITYLEVEL_NORMAL 0
+#define QUALITYLEVEL_BEST 1
+#define QUALITYLEVEL_WONDER 2
+
+#define SPECLOAD_NONE 0 // possible setting for specload
+#define SPECLOAD_ENVELOPE 1
+
+#define MEDIALD_SPEED 0x00000001 // bitfield defn for opt_fields
+#define NEED_TO_SERVICE_PERIOD 0x00000002
+#define MINTIME_BTW_SWEEP 0x00000004
+
+#define DEVUNITS_XBOW 2400 // Crossbow device units is 2400 dots per inch
+
+#define SIZEOF_LDL_LDPAGE_OPTFLDS 4
+
+#define SIZEOF_LDL_COLROPT_ACTIVECOLR 2
+
+#define NO_ACTIVE_COLORS 0x0000
+
+#define SIZEOF_LDL_EJPAGE_CMDOPT 4
+
+#define MEDIA_EJSPEED 0x00000001 // bitfield defn for opt_fields
+
+#define SIZEOF_LDL_EJPAGE_OPTFLDS 1
+
+#define SIZEOF_LDL_PRTSWP_CMDOPT 18
+
+#define SWINGFMT_UNCOMPRSS 0 // define possible swing format
+
+#define PRNDRN_LEFTTORIGHT 0 // define the possible print direction
+#define PRNDRN_RIGHTTOLEFT 1
+
+#define IPS_CARRSPEED 0x00000001 // bitfield defn for printsweep optional field
+#define IPS_INIPRNSPEED 0x00000002
+#define IPS_MEDIASPEED 0x00000004
+#define PAPER_ACCURACY 0x00000008
+#define ACCURATEPOSN_NEEDED 0x00000010
+#define DRYTIME 0x00000020 // bit 6-31 undefined
+
+#define SIZEOF_LDL_PRTSWP_OPTFLDS 3
+
+#define SIZEOF_LDL_PRTSWP_COLROPT 29
+
+#define SIZEOF_LDL_LDSWPDATA_CMDOPT 2
+
+#define NO_ECHO 0
+#define ECHO_DATA 1
+
+#define OPERATION_CONTINUE 2
+#define DATASTREAMVERSION 3
+
+#define OPERATION_SPIT_PEN 2
+
+// possible values for ldlversion
+#define CURR_LDLVERSION 0x00000302 // lidil version of 0.3.2
+
+#endif
diff --git a/prnt/hpijs/ljcolor.cpp b/prnt/hpijs/ljcolor.cpp
new file mode 100644
index 0000000..aec700c
--- /dev/null
+++ b/prnt/hpijs/ljcolor.cpp
@@ -0,0 +1,651 @@
+/*****************************************************************************\
+ ljcolor.cpp : Implimentation for the LJColor class
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#ifdef APDK_LJCOLOR
+
+#include "header.h"
+#include "io_defs.h"
+#include "ljcolor.h"
+#include "printerproxy.h"
+#include "resources.h"
+
+APDK_BEGIN_NAMESPACE
+
+extern uint32_t ulMapDJ600_CCM_K[ 9 * 9 * 9 ];
+extern uint32_t ulMapGRAY_K_6x6x1[9 * 9 * 9];
+
+LJColor::LJColor (SystemServices* pSS, int numfonts, BOOL proto)
+ : Printer(pSS, numfonts, proto)
+{
+
+ if ((!proto) && (IOMode.bDevID))
+ {
+ constructor_error = VerifyPenInfo();
+ CERRCHECK;
+ }
+ else ePen = BOTH_PENS; // matches default mode
+
+ pMode[GRAYMODE_INDEX] = new LJColorGrayMode ();
+ pMode[DEFAULTMODE_INDEX] = new LJColor300DPIMode ();
+ pMode[SPECIALMODE_INDEX] = new LJColor600DPIMode ();
+ pMode[SPECIALMODE_INDEX+1] = new LJColor150DPIMode ();
+ pMode[SPECIALMODE_INDEX+2] = new LJColorKDraftMode ();
+ ModeCount = 5;
+
+
+ CMYMap = NULL;
+ m_bJobStarted = FALSE;
+#ifdef APDK_AUTODUPLEX
+ m_bRotateBackPage = FALSE; // Lasers don't require back side image to be rotated
+#endif
+#ifdef APDK_EXTENDED_MEDIASIZE
+ pMode[SPECIALMODE_INDEX+3] = new LJColorPlainBestMode ();
+ ModeCount = 6;
+#endif
+ m_pCompressor = NULL;
+ m_iYPos = 0;
+
+ DBG1("LJColor created\n");
+}
+
+LJColor::~LJColor ()
+{
+ DISPLAY_STATUS eDispStatus;
+ if (IOMode.bStatus && m_bJobStarted)
+ {
+ for (int i = 0; i < 5; i++)
+ {
+ pSS->BusyWait (2000);
+ eDispStatus = ParseError (0);
+ if (eDispStatus == DISPLAY_PRINTING_COMPLETE)
+ {
+ pSS->DisplayPrinterStatus (eDispStatus);
+ break;
+ }
+ }
+ }
+}
+
+LJColorKDraftMode::LJColorKDraftMode ()
+: GrayMode (ulMapDJ600_CCM_K)
+{
+ theQuality = qualityDraft;
+ pmQuality = QUALITY_DRAFT;
+ pmColor = GREY_K;
+#ifdef APDK_AUTODUPLEX
+ bDuplexCapable = TRUE;
+#endif
+}
+
+LJColorGrayMode::LJColorGrayMode () : GrayMode (ulMapGRAY_K_6x6x1)
+{
+ ResolutionX[0] =
+ ResolutionY[0] =
+ BaseResX =
+ BaseResY = 600;
+ pmColor = GREY_K;
+#ifdef APDK_AUTODUPLEX
+ bDuplexCapable = TRUE;
+#endif
+}
+
+LJColor150DPIMode::LJColor150DPIMode ()
+: PrintMode (NULL)
+{
+ ResolutionX[0] = ResolutionY[0] = 150;
+ BaseResX = BaseResY = 150;
+ TextRes = 150;
+ Config.bColorImage = FALSE;
+ theQuality = qualityDraft;
+ pmQuality = QUALITY_DRAFT;
+#ifdef APDK_AUTODUPLEX
+ bDuplexCapable = TRUE;
+#endif
+}
+
+LJColor300DPIMode::LJColor300DPIMode ()
+: PrintMode (NULL)
+{
+ ResolutionX[0] = 300;
+ ResolutionY[0] = 300;
+ BaseResX = BaseResY = 300;
+
+ Config.bColorImage = FALSE;
+ theQuality = qualityNormal;
+
+ bFontCapable = TRUE;
+ pmQuality = QUALITY_NORMAL;
+ Config.bColorImage = FALSE;
+#ifdef APDK_AUTODUPLEX
+ bDuplexCapable = TRUE;
+#endif
+}
+
+LJColor600DPIMode::LJColor600DPIMode ()
+: PrintMode (NULL)
+{
+ ResolutionX[0] = 600;
+ ResolutionY[0] = 600;
+ BaseResX = BaseResY = 600;
+ Config.bColorImage = FALSE;
+ theQuality = qualityPresentation;
+ bFontCapable = TRUE;
+ pmQuality = QUALITY_BEST;
+ pmMediaType = MEDIA_PHOTO;
+#ifdef APDK_AUTODUPLEX
+ bDuplexCapable = TRUE;
+#endif
+}
+
+#ifdef APDK_EXTENDED_MEDIASIZE
+LJColorPlainBestMode::LJColorPlainBestMode ()
+: PrintMode (NULL)
+{
+ ResolutionX[0] = 600;
+ ResolutionY[0] = 600;
+ BaseResX = BaseResY = 600;
+
+ Config.bColorImage = FALSE;
+ theQuality = qualityPresentation;
+ bFontCapable = TRUE;
+ pmQuality = QUALITY_BEST;
+#ifdef APDK_AUTODUPLEX
+ bDuplexCapable = TRUE;
+#endif
+}
+#endif
+
+HeaderLJColor::HeaderLJColor (Printer* p, PrintContext* pc)
+ : Header(p,pc)
+{ }
+
+DRIVER_ERROR HeaderLJColor::Send ()
+{
+ DRIVER_ERROR err;
+ char uom[12];
+
+ COLORMODE eC = COLOR;
+ MEDIATYPE eM;
+ QUALITY_MODE eQ;
+ BOOL bD;
+
+ ((LJColor *)thePrinter)->bGrey_K = FALSE;
+ if ((thePrintContext->GetPrintModeSettings (eQ, eM, eC, bD)) == NO_ERROR &&
+ eC == GREY_K)
+ {
+ ((LJColor *)thePrinter)->bGrey_K = TRUE;
+ }
+
+ StartSend ();
+
+ if (eC != GREY_K)
+ {
+
+/*
+ * Configure image data - ESC*v#W - # = 6 bytes
+ * 02 - RGB colorspace (00 - Device RGB)
+ * 03 - Direct pixel
+ * 08 - bits per index - ignored for direct pixel
+ * 08, 08, 08 - bits per primary each
+ */
+
+ err = thePrinter->Send ((const BYTE *) "\033*v6W\00\03\010\010\010\010", 11);
+ ERRCHECK;
+
+// Continues tone dither
+// Logical operation - 0
+
+// err = thePrinter->Send ((const BYTE *) "\033*t18J\033*l204O", 13);
+ err = thePrinter->Send ((const BYTE *) "\033*t18J", 6);
+
+ ERRCHECK;
+
+/*
+ * Driver Configuration Command - ESC*#W - # = 3 bytes
+ * device id - 6 = color HP LaserJet Printer
+ * func index - 4 = Select Colormap
+ * argument - 2 = Vivid Graphics
+ */
+
+ err = thePrinter->Send ((const BYTE *) "\033*o3W\06\04\06", 8);
+ ERRCHECK;
+
+/*
+ * Program color palette entries
+ */
+ err = thePrinter->Send ((const BYTE *) "\033*v255A\033*v255B\033*v255C\033*v0I", 26);
+ ERRCHECK;
+
+ err = thePrinter->Send ((const BYTE *) "\033*v255A\033*v0B\033*v0C\033*v6I", 22);
+ ERRCHECK;
+ err = thePrinter->Send ((const BYTE *) "\033*v0A\033*v255B\033*v0C\033*v5I", 22);
+ ERRCHECK;
+ err = thePrinter->Send ((const BYTE *) "\033*v0A\033*v0B\033*v255C\033*v3I", 22);
+ ERRCHECK;
+ err = thePrinter->Send ((const BYTE *) "\033*v255A\033*v255B\033*v0C\033*v4I", 24);
+ ERRCHECK;
+ err = thePrinter->Send ((const BYTE *) "\033*v255A\033*v0B\033*v255C\033*v2I", 24);
+ ERRCHECK;
+ err = thePrinter->Send ((const BYTE *) "\033*v0A\033*v255B\033*v255C\033*v1I", 24);
+ ERRCHECK;
+ err = thePrinter->Send ((const BYTE *) "\033*v0A\033*v0B\033*v0C\033*v7I", 20);
+ ERRCHECK;
+ }
+
+ sprintf (uom, "\033*r%dS", thePrintContext->OutputPixelsPerRow ());
+ err = thePrinter->Send ((const BYTE*)uom, strlen (uom));
+ ERRCHECK;
+
+ err = Graphics (); // start raster graphics and set compression mode
+
+ return err;
+}
+
+DRIVER_ERROR HeaderLJColor::StartSend ()
+{
+ DRIVER_ERROR err;
+ char res[72];
+ int iRes;
+
+ iRes = thePrintContext->EffectiveResolutionY ();
+
+ err = thePrinter->Send ((const BYTE*)UEL,sizeof(UEL));
+ ERRCHECK;
+
+ sprintf (res, "@PJL SET PAGEPROTECT=AUTO@PJL SET RESOLUTION=%d\015\012", iRes);
+ err = thePrinter->Send ((const BYTE *) res, strlen (res));
+ ERRCHECK;
+
+ if (thePrinter->IOMode.bStatus)
+ {
+ sprintf (res, "@PJL JOB NAME = \"%ld\"\015\012", (long) (thePrinter));
+ err = thePrinter->Send ((const BYTE *) res, strlen (res));
+ ERRCHECK;
+ }
+
+ QUALITY_MODE eQ = QUALITY_NORMAL;
+ COLORMODE eC;
+ MEDIATYPE eM;
+ BOOL bD;
+
+ thePrintContext->GetPrintModeSettings (eQ, eM, eC, bD);
+
+ if (eQ == QUALITY_DRAFT)
+ {
+ strcpy (res, "@PJL SET RET=OFF\015\012@PJL SET ECONOMODE=ON\015\012");
+ err = thePrinter->Send ((const BYTE *) res, strlen (res));
+ ERRCHECK;
+ }
+
+ if (thePrinter->IOMode.bStatus)
+ {
+ strcpy (res, "@PJL USTATUSOFF\015\012@PJL USTATUS DEVICE = ON\015\012@PJL USTATUS JOB = ON\015\012");
+ err = thePrinter->Send ((const BYTE *) res, strlen (res));
+ ERRCHECK;
+ }
+
+// Duplexing directive
+
+ strcpy (res, "@PJL SET DUPLEX=OFF\015\012");
+
+#ifdef APDK_AUTODUPLEX
+ DUPLEXMODE dupmode = thePrintContext->QueryDuplexMode ();
+ if (dupmode != DUPLEXMODE_NONE)
+ {
+ strcpy (res, "@PJL SET DUPLEX=ON\015\012@PJL SET BINDING=");
+ if (dupmode == DUPLEXMODE_BOOK)
+ strcat (res, "LONGEDGE\015\012");
+ else
+ strcat (res, "SHORTEDGE\015\012");
+ }
+#endif
+
+ err = thePrinter->Send ((const BYTE *) res, strlen (res));
+
+
+ err = thePrinter->Send ((const BYTE*) EnterLanguage, sizeof (EnterLanguage));
+ ERRCHECK;
+
+ err = thePrinter->Send ((const BYTE*) "PCL\015\012", 5);
+ ERRCHECK;
+
+ err = thePrinter->Send ((const BYTE*) Reset,sizeof (Reset));
+ ERRCHECK;
+
+ sprintf (res, "\033&l%dH", thePrintContext->GetMediaSource ());
+ err = thePrinter->Send ((const BYTE *) res, strlen (res)); // Source
+ ERRCHECK;
+
+// Media size, vertical spacing between lines and top margin
+
+ memcpy (res, mediasize, mscount - 1);
+ strcpy (res+mscount-1, "a8c0E");
+ err = thePrinter->Send ((const BYTE *) res, strlen (res));
+ ERRCHECK;
+
+ sprintf (res, "\033*t%dR\033&u%dD", iRes, iRes);
+ err=thePrinter->Send ((const BYTE*) res, strlen (res));
+ ERRCHECK;
+
+ err = Margins ();
+ ERRCHECK;
+ CAPy = 0;
+
+// Default is single sided printing
+
+ strcpy (res, "\033&l0S");
+
+#ifdef APDK_AUTODUPLEX
+ DUPLEXMODE eDupMode = thePrintContext->QueryDuplexMode ();
+ if (eDupMode != DUPLEXMODE_NONE)
+ {
+ sprintf (res, "\033&l%dS", (eDupMode == DUPLEXMODE_BOOK) ? 1 : 2);
+ }
+#endif
+ err = thePrinter->Send ((const BYTE *) res, strlen (res));
+ ERRCHECK;
+
+/*
+ * Set orientation to Portrait. APDK supports printing in Portrait mode only.
+ * If users desire Landscape printing, application/gluecode will have to
+ * rearrange the rasters appropriately.
+ */
+
+ err = thePrinter->Send ((const BYTE *) "\033&l0O", 5);
+
+ // Number of copies
+ sprintf (res, "\033&l%dX", thePrintContext->GetCopyCount ());
+ err = thePrinter->Send ((const BYTE *) res, strlen (res));
+ ERRCHECK;
+
+ return err;
+}
+
+DRIVER_ERROR HeaderLJColor::Graphics ()
+{
+
+ DRIVER_ERROR err;
+ err = thePrinter->Send ((const BYTE*) grafStart, sizeof (grafStart));
+ ERRCHECK;
+
+ if (((LJColor *) thePrinter)->bGrey_K)
+ {
+ err = thePrinter->Send ((const BYTE*) "\033*b2M", 5);
+ ERRCHECK;
+ }
+ else
+ {
+ err = thePrinter->Send ((const BYTE*) "\033*b3M", 5);
+ }
+
+ return err;
+}
+
+DRIVER_ERROR HeaderLJColor::EndJob ()
+{
+ char szBuff[128];
+ DRIVER_ERROR err = NO_ERROR;
+ if (thePrinter->IOMode.bStatus)
+ {
+ sprintf (szBuff, "\033E\033%%-12345X@PJL EOJ NAME = \"%ld\"\015\012@PJL RESET\015\012",
+ (long) (thePrinter));
+ err = thePrinter->Send ((const BYTE *) szBuff, strlen (szBuff));
+ ERRCHECK;
+ }
+ strcpy (szBuff, "\033%-12345X");
+ err = thePrinter->Send ((const BYTE *) szBuff, strlen (szBuff));
+
+ return err;
+}
+
+DRIVER_ERROR HeaderLJColor::FormFeed ()
+{
+ ((LJColor *)thePrinter)->bFGColorSet = FALSE;
+ ((LJColor *)thePrinter)->m_iYPos = 0;
+
+ return (thePrinter->Send ((const BYTE *) "\014", 1));
+}
+
+DRIVER_ERROR HeaderLJColor::SendCAPy (unsigned int iAbsY)
+{
+ if (iAbsY == 0)
+ {
+ return thePrinter->Send ((const BYTE *) "\033*p0Y", 5);
+ }
+ return NO_ERROR;
+}
+
+DRIVER_ERROR LJColor::Encapsulate (const RASTERDATA* InputRaster, BOOL bLastPlane)
+{
+ char szScratchStr[16];
+ DRIVER_ERROR err;
+ m_iYPos++;
+ if (bFGColorSet == FALSE)
+ {
+ Send ((const BYTE *) "\033*v7S", 5);
+ bFGColorSet = TRUE;
+ }
+ sprintf (szScratchStr, "\033*b%uW", InputRaster->rastersize[COLORTYPE_COLOR]);
+ err = Send ((const BYTE *) szScratchStr, strlen (szScratchStr));
+ if (err == NO_ERROR)
+ {
+ err = Send (InputRaster->rasterdata[COLORTYPE_COLOR], InputRaster->rastersize[COLORTYPE_COLOR]);
+ }
+
+/*
+ * Printers with low memory (64 MB or less) can run out of memory during decompressing
+ * the image data and will abort the job. To prevent this, restart raster command.
+ * Raghu
+ */
+
+ if (!bGrey_K &&
+ m_iYResolution == 600 &&
+ m_iYPos % 1200 == 0)
+ {
+ SkipRasters (0);
+ err = Send ((const BYTE *) "\033*rC\033*r1A\033*b3M", 14);
+ }
+
+ return err;
+}
+
+DRIVER_ERROR LJColor::SkipRasters (int nBlankRasters)
+{
+ char szScratchStr[16];
+ DRIVER_ERROR err = NO_ERROR;
+ if (m_pCompressor)
+ {
+ m_pCompressor->Flush ();
+ }
+ if (nBlankRasters > 0)
+ {
+ m_iYPos += nBlankRasters;
+ sprintf (szScratchStr, "\033*p%dY", m_iYPos);
+ err = Send ((const BYTE *) szScratchStr, strlen (szScratchStr));
+ }
+ return err;
+}
+
+
+Header* LJColor::SelectHeader (PrintContext *pc)
+{
+ m_iYResolution = pc->EffectiveResolutionY ();
+ return new HeaderLJColor (this, pc);
+}
+
+DRIVER_ERROR LJColor::VerifyPenInfo()
+{
+
+ DRIVER_ERROR err = NO_ERROR;
+
+ if(IOMode.bDevID == FALSE)
+ {
+ return err;
+ }
+
+ ePen = BOTH_PENS;
+ return NO_ERROR;
+}
+
+DRIVER_ERROR LJColor::ParsePenInfo(PEN_TYPE& ePen, BOOL QueryPrinter)
+{
+// char* str;
+// DRIVER_ERROR err = SetPenInfo(str, QueryPrinter);
+// ERRCHECK;
+
+ ePen = BOTH_PENS;
+
+ return NO_ERROR;
+}
+
+Compressor* LJColor::CreateCompressor (unsigned int RasterSize)
+{
+ bFGColorSet = FALSE;
+ if (bGrey_K)
+ return new Mode2 (pSS, RasterSize);
+
+ m_pCompressor = new Mode3 (pSS, this, RasterSize);
+ return m_pCompressor;
+}
+
+/*
+ * Function name: ParseError
+ *
+ * Owner: Darrell Walker
+ *
+ * Purpose: To determine what error state the printer is in.
+ *
+ * Called by: Send()
+ *
+ * Parameters on entry: status_reg is the contents of the centronics
+ * status register (at the time the error was
+ * detected)
+ *
+ * Parameters on exit: unchanged
+ *
+ * Return Values: The proper DISPLAY_STATUS to reflect the printer
+ * error state.
+ *
+ */
+
+/* We have to override the base class's (Printer) ParseError function due
+ to the fact that the 8XX series returns a status byte of F8 when it's out of
+ paper. Unfortunately, the 600 series returns F8 when they're turned off.
+ The way things are structured in Printer::ParseError, we used to check only
+ for DEVICE_IS_OOP. This would return true even if we were connected to a
+ 600 series printer that was turned off, causing the Out of paper status
+ message to be displayed. This change also reflects a corresponding change
+ in IO_defs.h, where I split DEVICE_IS_OOP into DEVICE_IS_OOP, DJ400_IS_OOP, and
+ DJ8XX_IS_OOP and we now check for DJ8XX_IS_OOP in the DJ8xx class's
+ ParseError function below. 05/11/99 DGC.
+*/
+
+DISPLAY_STATUS LJColor::ParseError(BYTE status_reg)
+{
+ DBG1("LJColor: parsing error info\n");
+
+ DRIVER_ERROR err = NO_ERROR;
+ BYTE szReadBuff[256];
+ DWORD iReadCount = 256;
+ DISPLAY_STATUS eStatus = (DISPLAY_STATUS) status_reg;
+ char *tmpStr;
+ int iErrorCode;
+
+ if (!IOMode.bDevID)
+ return eStatus;
+
+ memset (szReadBuff, 0, 256);
+ err = pSS->FromDevice (szReadBuff, &iReadCount);
+ if (err == NO_ERROR && iReadCount == 0)
+ return eStatus;
+
+ if (strstr ((char *) szReadBuff, "JOB"))
+ {
+ if (!(tmpStr = strstr ((char *) szReadBuff, "NAME")))
+ return DISPLAY_PRINTING;
+ tmpStr += 6;
+ while (*tmpStr < '0' || *tmpStr > '9')
+ tmpStr++;
+ sscanf (tmpStr, "%d", &iErrorCode);
+ if (iErrorCode != (long) (this))
+ return DISPLAY_PRINTING;
+ }
+
+ if (strstr ((char *) szReadBuff, "END"))
+ {
+ return DISPLAY_PRINTING_COMPLETE;
+ }
+
+
+ if (strstr ((char *) szReadBuff, "CANCEL"))
+ return DISPLAY_PRINTING_CANCELED;
+
+ if (!(tmpStr = strstr ((char *) szReadBuff, "CODE")))
+ return eStatus;
+
+ tmpStr += 4;
+ while (*tmpStr < '0' || *tmpStr > '9')
+ tmpStr++;
+ sscanf (tmpStr, "%d", &iErrorCode);
+
+ if (iErrorCode < 32000)
+ return DISPLAY_PRINTING;
+
+ if (iErrorCode == 40010 || iErrorCode == 40020)
+ return DISPLAY_NO_PENS; // Actually, out of toner
+
+ if (iErrorCode == 40021)
+ return DISPLAY_TOP_COVER_OPEN;
+
+ if ((iErrorCode / 100) == 419)
+ return DISPLAY_OUT_OF_PAPER;
+
+ if ((iErrorCode / 1000) == 42 || iErrorCode == 40022)
+ {
+ DBG1("Paper Jammed\n");
+ return DISPLAY_PAPER_JAMMED;
+ }
+
+ if (iErrorCode > 40049 && iErrorCode < 41000)
+ {
+ DBG1("IO trap\n");
+ return DISPLAY_ERROR_TRAP;
+ }
+
+ if (iErrorCode == 40079)
+ return DISPLAY_OFFLINE;
+
+ return DISPLAY_ERROR_TRAP;
+}
+
+APDK_END_NAMESPACE
+
+#endif // defined APDK_LJCOLOR
diff --git a/prnt/hpijs/ljcolor.h b/prnt/hpijs/ljcolor.h
new file mode 100644
index 0000000..b5f5fbf
--- /dev/null
+++ b/prnt/hpijs/ljcolor.h
@@ -0,0 +1,168 @@
+/*****************************************************************************\
+ ljcolor.h : Interface for the LJColor class
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#ifndef APDK_LJCOLOR_H
+#define APDK_LJCOLOR_H
+
+APDK_BEGIN_NAMESPACE
+
+/*!
+\internal
+*/
+class LJColor : public Printer
+{
+public:
+ LJColor (SystemServices* pSS,int numfonts=0, BOOL proto=FALSE);
+ ~LJColor ();
+
+ virtual Header* SelectHeader (PrintContext* pc);
+ virtual DRIVER_ERROR VerifyPenInfo ();
+ virtual DRIVER_ERROR ParsePenInfo (PEN_TYPE& ePen, BOOL QueryPrinter=TRUE);
+ virtual DISPLAY_STATUS ParseError (BYTE status_reg);
+ inline virtual BOOL SupportSeparateBlack (PrintMode *pCurrentMode) {return FALSE;}
+ DRIVER_ERROR SkipRasters (int nBlankRasters);
+ virtual DRIVER_ERROR Flush (int FlushSize)
+ {
+ return NO_ERROR;
+ }
+
+ virtual BOOL GetMargins (PAPER_SIZE ps, float *fMargins)
+ {
+ fMargins[0] = (float) 0.25;
+ fMargins[1] = (float) 0.25;
+ fMargins[2] = (float) 0.2;
+ fMargins[3] = (float) 0.2;
+ return TRUE;
+ }
+
+ virtual BOOL UseCMYK (unsigned int iPrintMode) { return FALSE;}
+ virtual DRIVER_ERROR Encapsulate (const RASTERDATA* InputRaster, BOOL bLastPlane);
+
+#ifdef APDK_AUTODUPLEX
+
+/*
+ * Note that we are returning TRUE here not to say there is a Hagaki Feed tray
+ * and Hagaki Card duplexer. Some non-HP Lasers number their input trays
+ * differently and try 5 (sourceHagakiFeedNDuplexer) can be a valid input tray.
+ * In order to allow selection of this tray, we will return TRUE for all lasers.
+ */
+
+ virtual BOOL HagakiFeedDuplexerPresent (BOOL bQueryPrinter)
+ {
+ return TRUE;
+ }
+#endif
+
+ Compressor* CreateCompressor (unsigned int RasterSize);
+ BOOL bFGColorSet;
+ BOOL bGrey_K;
+ int m_iYPos;
+
+protected:
+
+#ifdef APDK_HP_UX
+ virtual LJColor & operator = (Printer& rhs)
+ {
+ return *this;
+ }
+#endif
+
+ BOOL m_bJobStarted;
+ int m_iYResolution;
+ Compressor *m_pCompressor;
+
+}; // LJColor
+
+class LJColorKDraftMode : public GrayMode
+{
+public:
+ LJColorKDraftMode ();
+}; // LJColorDraftMode
+
+class LJColorGrayMode : public GrayMode
+{
+public:
+ LJColorGrayMode ();
+}; // LJColorGrayMode
+
+class LJColor150DPIMode : public PrintMode
+{
+public:
+ LJColor150DPIMode ();
+}; // LJColor150DPIMode
+
+class LJColor300DPIMode : public PrintMode
+{
+public:
+ LJColor300DPIMode ();
+}; // LJColor300DPIMode
+
+class LJColor600DPIMode : public PrintMode
+{
+public:
+ LJColor600DPIMode ();
+}; // LJColor600DPIMode
+
+#ifdef APDK_EXTENDED_MEDIASIZE
+class LJColorPlainBestMode : public PrintMode
+{
+public:
+ LJColorPlainBestMode ();
+};
+#endif
+
+#ifdef APDK_LJCOLOR
+//! LJColorProxy
+/*!
+******************************************************************************/
+class LJColorProxy : public PrinterProxy
+{
+public:
+ LJColorProxy() : PrinterProxy(
+ "ColorLaser", // family name
+ "hp color LaserJet\0"
+ "HP Color LaserJet\0"
+ "hp business inkjet 2600\0"
+ "hp business inkjet 3000\0"
+ "hp business inkjet 2300\0"
+ "Officejet 9100\0"
+#ifdef APDK_MLC_PRINTER
+#endif
+ ) {m_iPrinterType = eLJColor;}
+ inline Printer* CreatePrinter(SystemServices* pSS) const { return new LJColor(pSS); }
+ inline PRINTER_TYPE GetPrinterType() const { return eLJColor;}
+ inline unsigned int GetModelBit() const { return 0x20;}
+};
+#endif
+
+APDK_END_NAMESPACE
+
+#endif //APDK_LJCOLOR_H
diff --git a/prnt/hpijs/ljfastraster.cpp b/prnt/hpijs/ljfastraster.cpp
new file mode 100644
index 0000000..df89352
--- /dev/null
+++ b/prnt/hpijs/ljfastraster.cpp
@@ -0,0 +1,1274 @@
+/*****************************************************************************\
+ ljfastraster.cpp : Implimentation for the LJFastRaster class
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#ifdef APDK_LJFASTRASTER
+
+#include "header.h"
+#include "ljfastraster.h"
+#include "printerproxy.h"
+
+APDK_BEGIN_NAMESPACE
+
+#define INDY_STRIP_HEIGHT 128 // Indy strips can't cross 128 boundary
+
+extern uint32_t ulMapDJ600_CCM_K[ 9 * 9 * 9 ];
+
+BYTE FrBeginSessionSeq[] = {0xC0, 0x00, 0xF8, 0x86, 0xC0, 0x03, 0xF8, 0x8F, 0xD1, 0x58,
+ 0x02, 0x58, 0x02, 0xF8, 0x89, 0x41};
+BYTE FrFeedOrientationSeq[] = {0xC0, 0x00 , 0xF8, 0x28 };
+// |fd ori enum| |ori cmd|
+BYTE FrPaperSizeSeq[] = {0xC0, 0x00 ,0xF8, 0x25};
+// |pap siz enum| |pap sz cmd|
+BYTE FrMedSourceSeq[] = {0xC0, 0x00 ,0xF8, 0x26 };
+// |Med src enum| |Med src cmd|
+BYTE FrMedDestinationSeq[] = {0xC0, 0x00 ,0xF8 , 0x24 };
+// |Med Dest enum| |Med src cmd|
+BYTE FrBeginPageSeq[] = {0x43, 0xD3, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x2A, 0x75, 0xC0, 0x07,0xF8, 0x03, 0x6A,
+ 0xC0, 0xCC, 0xF8, 0x2C, 0x7B,
+ 0xD3, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x4C, 0x6B};
+
+BYTE FrBeginImageSeq[] = {0xC2, 0x00, 0x40, 0x70, 0x68, 0xF8, 0x91, 0xC1};
+
+BYTE FrVU_ver_TagSeq[] = {0xC2, 0x00, 0x00, 0x04, 0x00 , 0xF8, 0x95 };
+// |endian alignd | |Fr_ver_ tag|
+BYTE FrDataLengthSeq[] = {0xC2, 0x86, 0x0A, 0x00, 0x00, 0xF8, 0x92 };
+// | VU data length|
+BYTE FrVenUniqSeq[] = {0x46};
+BYTE FrVUExtn_3Seq[] = {0xC2, 0x11, 0x20, 0x70, 0x68 ,0xF8, 0x91 };
+// |endian alignd Fr rd img tag| |VU extensn|
+BYTE FrOpenDataSourceSeq[] = {0xC0, 0x00, 0xF8, 0x88, 0xC0, 0x01, 0xF8, 0x82, 0x48};
+
+BYTE FrEndPageSeq[] = {0x44};
+BYTE FrEndSessionSeq[] = {0x42};
+BYTE FrCloseDataSourceSeq[] = {0x49};
+// PJL level commands..
+
+//**JETLIB ENTRIES
+
+const char *ccpPJLStartJob = "\033%-12345X";
+const char *ccpPJLExitSeq = "\033%-12345X@PJL EOJ\012\033%-12345X";
+const char *ccpPJLSetRes = "@PJL SET RESOLUTION=600\012";
+const char *ccpPCLEnterXL = "@PJL ENTER LANGUAGE=PCLXL\012";
+const char *ccpPJLSetTO = "@PJL SET TIMEOUT=900\012";
+const char *ccpUEL = "\033%-12345X";
+const char *ccpPJLComment = ") HP-PCL XL;2;0;Comment\012";
+const char *ccpPJLSet1BPP = "@PJL SET BITSPERPIXEL=1\012";
+const char *ccpPJLSetECONOMODE = "@PJL SET ECONOMODE=OFF\012";
+const char *ccpPJLSetTimeStamp = "@PJL SET JOBATTR=";
+
+//**END JETLIB ENTRIES
+
+
+LJFastRaster::LJFastRaster (SystemServices* pSS, int numfonts, BOOL proto)
+ : Printer(pSS, numfonts, proto)
+{
+
+ if ((!proto) && (IOMode.bDevID))
+ {
+ constructor_error = VerifyPenInfo();
+ CERRCHECK;
+ }
+ else ePen = BLACK_PEN; // matches default mode
+
+ pMode[DEFAULTMODE_INDEX] = new LJFastRasterNormalMode ();
+ pMode[GRAYMODE_INDEX] = new LJFastRasterDraftMode ();
+ //pMode[DEFAULTMODE_INDEX] = pMode[GRAYMODE_INDEX];
+ ModeCount = 2;
+
+ CMYMap = NULL;
+ m_bJobStarted = FALSE;
+#ifdef APDK_AUTODUPLEX
+ m_bRotateBackPage = FALSE; // Lasers don't require back side image to be rotated
+#endif
+
+ m_iYPos = 0;
+ m_bStartPageNotSent = TRUE;
+
+ DBG1("LJFastRaster created\n");
+}
+
+LJFastRaster::~LJFastRaster ()
+{
+ DISPLAY_STATUS eDispStatus;
+ if (IOMode.bStatus && m_bJobStarted)
+ {
+ for (int i = 0; i < 5; i++)
+ {
+ pSS->BusyWait (2000);
+ eDispStatus = ParseError (0);
+ if (eDispStatus == DISPLAY_PRINTING_COMPLETE)
+ {
+ pSS->DisplayPrinterStatus (eDispStatus);
+ break;
+ }
+ }
+ }
+}
+
+LJFastRasterNormalMode::LJFastRasterNormalMode ()
+: GrayMode(ulMapDJ600_CCM_K)
+{
+ ResolutionX[0] = 600;
+ ResolutionY[0] = 600;
+ BaseResX = BaseResY = 600;
+
+ MixedRes = FALSE;
+
+ theQuality = qualityNormal;
+
+ pmQuality = QUALITY_NORMAL;
+
+#if defined(APDK_VIP_COLORFILTERING)
+ Config.bErnie = FALSE; // Raghu
+#endif
+
+#ifdef APDK_AUTODUPLEX
+ bDuplexCapable = TRUE;
+#endif
+
+ bFontCapable = FALSE;
+}
+
+LJFastRasterDraftMode::LJFastRasterDraftMode ()
+: GrayMode(ulMapDJ600_CCM_K)
+{
+ ResolutionX[0] = 600;
+ ResolutionY[0] = 600;
+ BaseResX = BaseResY = 600;
+
+ MixedRes = FALSE;
+
+ theQuality = qualityDraft;
+
+ pmQuality = QUALITY_DRAFT;
+
+#if defined(APDK_VIP_COLORFILTERING)
+ Config.bErnie = FALSE; // Raghu
+#endif
+
+#ifdef APDK_AUTODUPLEX
+ bDuplexCapable = TRUE;
+#endif
+
+ bFontCapable = FALSE;
+}
+
+HeaderLJFastRaster::HeaderLJFastRaster (Printer* p, PrintContext* pc)
+ : Header(p,pc)
+{
+ SetLastBand(FALSE);
+}
+
+DRIVER_ERROR HeaderLJFastRaster::Send ()
+{
+ StartSend ();
+
+ return NO_ERROR;
+}
+
+DRIVER_ERROR HeaderLJFastRaster::StartSend ()
+{
+ DRIVER_ERROR err = NO_ERROR;
+ char res[64];
+
+ err = thePrinter->Send ((const BYTE*)ccpPJLStartJob, strlen (ccpPJLStartJob));
+ ERRCHECK;
+
+ //Set the resolution to 600
+ err = thePrinter->Send ((const BYTE*)ccpPJLSetRes, strlen (ccpPJLSetRes));
+ ERRCHECK;
+
+ err = thePrinter->Send ((const BYTE*)ccpPJLSet1BPP, strlen (ccpPJLSet1BPP));
+ ERRCHECK;
+
+ QUALITY_MODE eQ = QUALITY_NORMAL;
+ COLORMODE eC;
+ MEDIATYPE eM;
+ BOOL bD;
+
+ thePrintContext->GetPrintModeSettings (eQ, eM, eC, bD);
+
+ strcpy (res, "@PJL SET ECONOMODE=");
+
+ if (eQ == QUALITY_DRAFT)
+ {
+ strcat (res, "ON\015\012");
+ }
+ else
+ {
+ strcat (res, "OFF\015\012");
+ }
+ err = thePrinter->Send ((const BYTE *) res, strlen (res));
+ ERRCHECK;
+
+
+ //Send the time out command
+ err = thePrinter->Send ((const BYTE*)ccpPJLSetTO, strlen (ccpPJLSetTO));
+ ERRCHECK;
+
+ //send the mojave PCL_XL_ENTER_LANG command
+ err = thePrinter->Send ((const BYTE*)ccpPCLEnterXL, strlen (ccpPCLEnterXL));
+ ERRCHECK;
+
+ //send the comment string
+ err = thePrinter->Send ((const BYTE*)ccpPJLComment, strlen (ccpPJLComment));
+ ERRCHECK;
+
+ err = thePrinter->Send ((const BYTE*)FrBeginSessionSeq,sizeof(FrBeginSessionSeq));
+ ERRCHECK;
+
+ //** VU command to enable PCL-XL
+ err = thePrinter->Send ((const BYTE*)FrVUExtn_3Seq,sizeof(FrVUExtn_3Seq));
+ ERRCHECK;
+ err = thePrinter->Send ((const BYTE*)FrVenUniqSeq,sizeof(FrVenUniqSeq));
+ ERRCHECK;
+
+ //----------------------------------------------------------------
+ // Open a data source, which will be kept open for the life
+ // of the session. Any operators that need embedded data will
+ // use this data source.
+ //----------------------------------------------------------------
+ err = thePrinter->Send ((const BYTE*)FrOpenDataSourceSeq,sizeof(FrOpenDataSourceSeq));
+ ERRCHECK;
+
+ return err;
+}
+
+int HeaderLJFastRaster::FrPaperToMediaSize(PAPER_SIZE psize)
+{
+ switch(psize)
+ {
+ case LETTER: return 0; break;
+ case LEGAL: return 1; break;
+ case A4: return 2; break;
+ case B4: return 10; break;
+ case B5: return 11; break;
+ case OUFUKU: return 14; break;
+ case HAGAKI: return 14; break;
+ case A6: return 17; break;
+#ifdef APDK_EXTENDED_MEDIASIZE
+ case A3: return 5; break;
+ case A5: return 16; break;
+ case LEDGER: return 4; break;
+ case EXECUTIVE: return 3; break;
+ case CUSTOM_SIZE: return 96; break;
+ case ENVELOPE_NO_10: return 6; break;
+ case ENVELOPE_A2: return 6; break;
+ case ENVELOPE_C6: return 8; break;
+ case ENVELOPE_DL: return 9; break;
+#endif
+ default: return 0; break;
+ }
+}
+
+DRIVER_ERROR HeaderLJFastRaster::StartPage ()
+{
+ DRIVER_ERROR err;
+ BYTE szCustomSize[16];
+
+ /* Orienatation: is FrFeedOrientationSeq[1]. Can take the following values:
+ Portrait : 0x00
+ Landscape: : 0x01
+ Reversed Portrait : 0x02
+ Reversed Landscape : 0x03
+ Image Orientataion: 0x04
+ */
+ err = thePrinter->Send ((const BYTE*)FrFeedOrientationSeq,sizeof(FrFeedOrientationSeq));
+ ERRCHECK;
+
+ //Put the papersize into the FrPaperSizeSeq[]
+ PAPER_SIZE ps = thePrintContext->GetPaperSize ();
+ int msizeCode = FrPaperToMediaSize(ps);
+ FrPaperSizeSeq[1] = (BYTE) msizeCode;
+#ifdef APDK_EXTENDED_MEDIASIZE
+ if(msizeCode == 96 || msizeCode == 17) //Custom paper size or A6
+ {
+ union
+ {
+ float fValue;
+ uint32_t uiValue;
+ } LJFUnion;
+ uint32_t uiXsize;
+ uint32_t uiYsize;
+ int k = 0;
+ LJFUnion.fValue = (float) thePrintContext->PhysicalPageSizeX ();
+ uiXsize = LJFUnion.uiValue;
+ LJFUnion.fValue = (float) thePrintContext->PhysicalPageSizeY ();
+ uiYsize = LJFUnion.uiValue;
+ szCustomSize[k++] = 0xD5;
+ szCustomSize[k++] = (BYTE) (uiXsize & 0x000000FF);
+ szCustomSize[k++] = (BYTE) ((uiXsize & 0x0000FF00) >> 8);
+ szCustomSize[k++] = (BYTE) ((uiXsize & 0x00FF0000) >> 16);
+ szCustomSize[k++] = (BYTE) ((uiXsize & 0xFF000000) >> 24);
+ szCustomSize[k++] = (BYTE) (uiYsize & 0x000000FF);
+ szCustomSize[k++] = (BYTE) ((uiYsize & 0x0000FF00) >> 8);
+ szCustomSize[k++] = (BYTE) ((uiYsize & 0x00FF0000) >> 16);
+ szCustomSize[k++] = (BYTE) ((uiYsize & 0xFF000000) >> 24);
+ szCustomSize[k++] = 0xF8;
+ szCustomSize[k++] = 0x2F;
+ err = thePrinter->Send ((const BYTE *) szCustomSize, k);
+ ERRCHECK;
+
+
+ BYTE FrCustomMediaSeq[] = {0xC0,0x00, 0xF8, 0x30};
+ err = thePrinter->Send ((const BYTE *)FrCustomMediaSeq, sizeof(FrCustomMediaSeq));
+ ERRCHECK;
+ }
+ else
+#endif
+ {
+ err = thePrinter->Send ((const BYTE*)FrPaperSizeSeq,sizeof(FrPaperSizeSeq));
+ ERRCHECK;
+ }
+
+ err = thePrinter->Send ((const BYTE *)FrBeginPageSeq, sizeof(FrBeginPageSeq));
+ ERRCHECK;
+
+ bLastBand = FALSE;
+
+ return err;
+}
+
+DRIVER_ERROR HeaderLJFastRaster::EndPage ()
+{
+ DRIVER_ERROR err;
+
+ // 0x44 - end page
+ err = thePrinter->Send ((const BYTE*)FrEndPageSeq,sizeof(FrEndPageSeq));
+ ERRCHECK;
+
+ return err;
+}
+
+DRIVER_ERROR HeaderLJFastRaster::EndJob ()
+{
+ DRIVER_ERROR err = NO_ERROR;
+
+ err = thePrinter->Send((const BYTE*)FrCloseDataSourceSeq, sizeof(FrCloseDataSourceSeq));
+ ERRCHECK;
+
+ err = thePrinter->Send((const BYTE*)FrEndSessionSeq, sizeof(FrEndSessionSeq));
+ ERRCHECK;
+
+ err = thePrinter->Send((const BYTE*)ccpPJLExitSeq, strlen (ccpPJLExitSeq));
+ ERRCHECK;
+
+ return err;
+}
+
+DRIVER_ERROR HeaderLJFastRaster::FormFeed ()
+{
+ DRIVER_ERROR err = NO_ERROR;
+ LJFastRaster *pFRPrinter = (LJFastRaster *) thePrinter;
+
+ bLastBand = TRUE;
+
+ err = EndPage ();
+
+ pFRPrinter->m_bStartPageNotSent = TRUE;
+ return err;
+}
+
+DRIVER_ERROR HeaderLJFastRaster::SendCAPy (unsigned int iAbsY)
+{
+ return NO_ERROR;
+}
+
+#define FAST_RASTER_HEADERSIZE 25
+
+//** Faster Raster Path Header address values
+
+#define BASE_ADDRESS 0
+#define PAGE_NUM_ADDRESS 1
+#define RESOLUTION_ADDRESS_HI 2
+#define RESOLUTION_ADDRESS_LO 3
+#define COMPRESSION_ADDRESS_HI 4
+#define COMPRESSION_ADDRESS_LO 5
+#define COLOR_PLANE_SPECIFIER_ADDRESS 6
+#define COMPRESSION_RATIO 7
+#define PRODUCT_ID 8
+#define IMAGE_SIZE_ADDRESS_HIWORD_HI 12
+#define IMAGE_SIZE_ADDRESS_HIWORD_LO 13
+#define IMAGE_SIZE_ADDRESS_LOWORD_HI 14
+#define IMAGE_SIZE_ADDRESS_LOWORD_LO 15
+#define IMAGE_WIDTH_ADDRESS_HI 16
+#define IMAGE_WIDTH_ADDRESS_LO 17
+#define IMAGE_HEIGTH_ADDRESS_HI 18
+#define IMAGE_HEIGTH_ADDRESS_LO 19
+#define ABS_X_ADDRESS_HI 20
+#define ABS_X_ADDRESS_LO 21
+#define ABS_Y_ADDRESS_HI 22
+#define ABS_Y_ADDRESS_LO 23
+#define BIT_DEPTH_ADDRESS 24
+
+#define eK 3
+typedef enum
+{
+ eDelta32,
+ eDeltaPlus = 24,
+ eFX = 18,
+ eRAW = 2
+} CompressionMethod;
+
+#define KILOBYTE 1024
+#define MAX_IMAGE 200*KILOBYTE
+
+DRIVER_ERROR LJFastRaster::Encapsulate (const RASTERDATA* InputRaster, BOOL bLastPlane)
+{
+ BYTE res[64];
+ DRIVER_ERROR err = NO_ERROR;
+
+ //** form FR header
+ unsigned char pucHeader[FAST_RASTER_HEADERSIZE];
+ long lImageWidth = ((ModeDeltaPlus*)m_pCompressor)->inputsize;
+ long lResolution = 600;
+ long lBlockOffset = ((((ModeDeltaPlus*)m_pCompressor)->m_lPrinterRasterRow + 127) / 128) * 128 - 128;
+ long lBitDepth = 1;
+ long lBlockHeight = ((ModeDeltaPlus*)m_pCompressor)->m_lCurrBlockHeight;
+
+ WORD wTemp = LOWORD (lBlockOffset);
+ BYTE byHIByte = 0;
+ BYTE byLOByte = 0;
+
+ memset (pucHeader, 0, FAST_RASTER_HEADERSIZE);
+
+ pucHeader[ABS_X_ADDRESS_HI] = 0;
+ pucHeader[ABS_X_ADDRESS_LO] = 0;
+ pucHeader[ABS_Y_ADDRESS_HI] = HIBYTE (wTemp);
+ pucHeader[ABS_Y_ADDRESS_LO] = LOBYTE (wTemp);
+
+ pucHeader[BASE_ADDRESS] = 0;
+ pucHeader[PAGE_NUM_ADDRESS] = 1;
+
+ wTemp = (WORD) (lResolution );
+ byHIByte = HIBYTE (wTemp);
+ byLOByte = LOBYTE (wTemp);
+ pucHeader[RESOLUTION_ADDRESS_HI] = byHIByte;
+ pucHeader[RESOLUTION_ADDRESS_LO] = byLOByte;
+
+ wTemp = ((ModeDeltaPlus*)m_pCompressor)->m_bCompressed ? (WORD)eDeltaPlus : (WORD)eRAW;
+ byHIByte = HIBYTE (wTemp);
+ byLOByte = LOBYTE (wTemp);
+ pucHeader[COMPRESSION_ADDRESS_HI] = byHIByte;
+ pucHeader[COMPRESSION_ADDRESS_LO] = byLOByte;
+
+ pucHeader[COLOR_PLANE_SPECIFIER_ADDRESS] = (BYTE)eK;
+ pucHeader[COMPRESSION_RATIO] = (BYTE)ceil (((ModeDeltaPlus*)m_pCompressor)->m_fRatio);
+ wTemp = HIWORD (InputRaster->rastersize[COLORTYPE_COLOR]);
+ byHIByte = HIBYTE (wTemp);
+ byLOByte = LOBYTE (wTemp);
+ pucHeader[IMAGE_SIZE_ADDRESS_HIWORD_HI] = byHIByte;
+ pucHeader[IMAGE_SIZE_ADDRESS_HIWORD_LO] = byLOByte;
+
+ wTemp = LOWORD (InputRaster->rastersize[COLORTYPE_COLOR]);
+ byHIByte = HIBYTE (wTemp);
+ byLOByte = LOBYTE (wTemp);
+ pucHeader[IMAGE_SIZE_ADDRESS_LOWORD_HI] = byHIByte;
+ pucHeader[IMAGE_SIZE_ADDRESS_LOWORD_LO] = byLOByte;
+
+ wTemp = LOWORD (lImageWidth*8);
+ byHIByte = HIBYTE (wTemp);
+ byLOByte = LOBYTE (wTemp);
+
+ pucHeader[IMAGE_WIDTH_ADDRESS_HI] = byHIByte;
+ pucHeader[IMAGE_WIDTH_ADDRESS_LO] = byLOByte;
+
+ wTemp = LOWORD (lBlockHeight);
+ byHIByte = HIBYTE (wTemp);
+ byLOByte = LOBYTE (wTemp);
+ pucHeader[IMAGE_HEIGTH_ADDRESS_HI] = byHIByte;
+ pucHeader[IMAGE_HEIGTH_ADDRESS_LO] = byLOByte;
+
+ wTemp = LOWORD (lBitDepth);
+ pucHeader[BIT_DEPTH_ADDRESS] = LOBYTE (wTemp);
+
+ unsigned int ulVUDataLength = (int)(InputRaster->rastersize[COLORTYPE_COLOR] + FAST_RASTER_HEADERSIZE);
+
+ BYTE FrEnterFRModeSeq[] = {0xC2, 0x06, 0x20, 0x70,0x68, 0xF8, 0x91, 0xC2};
+ err = Send ((const BYTE *)FrEnterFRModeSeq, sizeof(FrEnterFRModeSeq));
+ ERRCHECK;
+ res[0] = (BYTE) (ulVUDataLength & 0xFF);
+ res[1] = (BYTE) ((ulVUDataLength & 0x0000FF00) >> 8);
+ res[2] = (BYTE) ((ulVUDataLength & 0x00FF0000) >> 16);
+ res[3] = (BYTE) ((ulVUDataLength & 0xFF000000) >> 24);
+ res[4] = 0xF8;
+ res[5] = 0x92;
+ res[6] = 0x46;
+ err = Send (res, 7);
+ ERRCHECK;
+
+ //** now embed raster data, header and all
+ err = Send (pucHeader, FAST_RASTER_HEADERSIZE);
+ ERRCHECK;
+ err = Send (InputRaster->rasterdata[COLORTYPE_COLOR],
+ InputRaster->rastersize[COLORTYPE_COLOR]);
+ return err;
+}
+
+Header* LJFastRaster::SelectHeader (PrintContext *pc)
+{
+ phLJFastRaster = new HeaderLJFastRaster (this, pc);
+ return phLJFastRaster;
+}
+
+DRIVER_ERROR LJFastRaster::VerifyPenInfo()
+{
+ ePen = BLACK_PEN;
+ return NO_ERROR;
+}
+
+DRIVER_ERROR LJFastRaster::ParsePenInfo(PEN_TYPE& ePen, BOOL QueryPrinter)
+{
+ ePen = BOTH_PENS;
+
+ return NO_ERROR;
+}
+
+Compressor* LJFastRaster::CreateCompressor (unsigned int RasterSize)
+{
+ m_pCompressor = new ModeDeltaPlus (pSS, this, RasterSize);
+ return m_pCompressor;
+}
+
+/*
+ * Function name: ParseError
+ *
+ * Owner: Darrell Walker
+ *
+ * Purpose: To determine what error state the printer is in.
+ *
+ * Called by: Send()
+ *
+ * Parameters on entry: status_reg is the contents of the centronics
+ * status register (at the time the error was
+ * detected)
+ *
+ * Parameters on exit: unchanged
+ *
+ * Return Values: The proper DISPLAY_STATUS to reflect the printer
+ * error state.
+ *
+ */
+DISPLAY_STATUS LJFastRaster::ParseError(BYTE status_reg)
+{
+ DBG1("LJFastRaster: parsing error info\n");
+
+ DRIVER_ERROR err = NO_ERROR;
+ BYTE szReadBuff[256];
+ DWORD iReadCount = 256;
+ DISPLAY_STATUS eStatus = (DISPLAY_STATUS) status_reg;
+ char *tmpStr;
+ int iErrorCode;
+
+ if (!IOMode.bDevID)
+ return eStatus;
+
+ memset (szReadBuff, 0, 256);
+ err = pSS->FromDevice (szReadBuff, &iReadCount);
+ if (err == NO_ERROR && iReadCount == 0)
+ return eStatus;
+
+ if (strstr ((char *) szReadBuff, "JOB"))
+ {
+ if (!(tmpStr = strstr ((char *) szReadBuff, "NAME")))
+ return DISPLAY_PRINTING;
+ tmpStr += 6;
+ while (*tmpStr < '0' || *tmpStr > '9')
+ tmpStr++;
+ sscanf (tmpStr, "%d", &iErrorCode);
+ if (iErrorCode != (long) (this))
+ return DISPLAY_PRINTING;
+ }
+
+ if (strstr ((char *) szReadBuff, "END"))
+ {
+ return DISPLAY_PRINTING_COMPLETE;
+ }
+
+
+ if (strstr ((char *) szReadBuff, "CANCEL"))
+ return DISPLAY_PRINTING_CANCELED;
+
+ if (!(tmpStr = strstr ((char *) szReadBuff, "CODE")))
+ return eStatus;
+
+ tmpStr += 4;
+ while (*tmpStr < '0' || *tmpStr > '9')
+ tmpStr++;
+ sscanf (tmpStr, "%d", &iErrorCode);
+
+ if (iErrorCode < 32000)
+ return DISPLAY_PRINTING;
+
+ if (iErrorCode == 40010 || iErrorCode == 40020)
+ return DISPLAY_NO_PENS; // Actually, out of toner
+
+ if (iErrorCode == 40021)
+ return DISPLAY_TOP_COVER_OPEN;
+
+ if ((iErrorCode / 100) == 419)
+ return DISPLAY_OUT_OF_PAPER;
+
+ if ((iErrorCode / 1000) == 42 || iErrorCode == 40022)
+ {
+ DBG1("Paper Jammed\n");
+ return DISPLAY_PAPER_JAMMED;
+ }
+
+ if (iErrorCode > 40049 && iErrorCode < 41000)
+ {
+ DBG1("IO trap\n");
+ return DISPLAY_ERROR_TRAP;
+ }
+
+ if (iErrorCode == 40079)
+ return DISPLAY_OFFLINE;
+
+ return DISPLAY_ERROR_TRAP;
+}
+
+
+//--------------------------------------------------------------------
+// Function: ModeDeltaPlus::ModeDeltaPlus
+//
+// Release: [PROTO4_1]
+//
+// Description: Preferred ctor
+//
+// Input: padMultiple - the fBufferDataLength returned from
+// GetRow must be divisible by this value.
+//
+// Modifies: fpBuffer
+//
+// Precond: None
+//
+// Postcond: None
+//
+// Returns: None
+//
+// Created: 11/07/96 cal
+// Last Modified: 5/020/01 DG
+//--------------------------------------------------------------------
+ModeDeltaPlus::ModeDeltaPlus
+(
+ SystemServices* pSys,
+ Printer* pPrinter,
+ unsigned int PlaneSize
+) :
+ Compressor(pSys, PlaneSize, TRUE),
+ thePrinter(pPrinter), // needed by Flush
+ pbyInputImageBuffer (NULL),
+ pbySeedRow (NULL)
+{
+ if (constructor_error != NO_ERROR) // if error in base constructor
+ {
+ return;
+ }
+
+ inputsize = PlaneSize / (MAXCOLORPLANES * MAXCOLORDEPTH * MAXCOLORROWS);
+ inputsize = ((inputsize + 7) / 8) * 8;
+
+ // allocate a 2X compression buffer..
+ compressBuf = (BYTE*)pSS->AllocMem(2 * INDY_STRIP_HEIGHT * inputsize);
+ if (compressBuf == NULL)
+ {
+ constructor_error = ALLOCMEM_ERROR;
+ }
+ memset (compressBuf, 0x00, 2 * INDY_STRIP_HEIGHT * inputsize);
+
+ pbyInputImageBuffer = (BYTE*)pSS->AllocMem(INDY_STRIP_HEIGHT * inputsize);
+ if (pbyInputImageBuffer == NULL)
+ constructor_error=ALLOCMEM_ERROR;
+ memset(pbyInputImageBuffer, 0x00, INDY_STRIP_HEIGHT * inputsize);
+
+ pbySeedRow = (HPUInt8*) pSS->AllocMem (inputsize * sizeof (HPUInt8));
+ if (pbySeedRow == NULL)
+ {
+ constructor_error = ALLOCMEM_ERROR;
+ }
+ memset (pbySeedRow, 0, inputsize * sizeof (HPUInt8));
+
+ m_lCurrCDRasterRow = 0;
+ //m_lPrinterRasterRow = (((LJFastRaster*)thePrinter)->phLJFastRaster)->thePrintContext->PrintableStartY() * 600;
+
+ m_lPrinterRasterRow = 0;
+
+ iRastersReady = 0;
+
+ m_bCompressed = FALSE;
+ m_compressedsize = 0;
+ m_fRatio = 0;
+} // ModeDeltaPlus::ModeDeltaPlus
+
+
+//--------------------------------------------------------------------
+// Function: ModeDeltaPlus::~ModeDeltaPlus
+//
+// Release: [PROTO4_1]
+//
+// Description: Destructor.
+//
+// Input: None
+//
+// Modifies: fpBuffer - deletes the buffer
+// ?? - deletes other buffer(s)??
+//
+// Precond: None
+//
+// Postcond: None
+//
+// Returns: None
+//
+// Created: 11/07/96 cal
+// Last Modified: 5/020/01 DG
+//--------------------------------------------------------------------
+ModeDeltaPlus::~ModeDeltaPlus ()
+{
+ if (pbyInputImageBuffer)
+ {
+ pSS->FreeMem (pbyInputImageBuffer);
+ pbyInputImageBuffer = NULL;
+ }
+ if (pbySeedRow)
+ {
+ pSS->FreeMem (pbySeedRow);
+ pbySeedRow = NULL;
+ }
+
+} // ModeDeltaPlus::~ModeDeltaPlus
+
+/*
+ * The maximum width of a line, which is limited by the amount of hardware
+ * buffer space allocated to storing the seedrow.
+ */
+#define ROW_LIMIT 7040
+/*
+ * The maximum number of literals in a single command, not counting the first
+ * pixel. This is limited by the hardware buffer used to store a literal
+ * string. For real images, I expect a value of 64 would be a suitable
+ * minimum. The minimum compression ratio will be bounded by this. Note also
+ * that the software does not need any buffer for this, so there need be no
+ * limit at all on a purely software implementation. For the sake of enabling
+ * a hardware implementation, I would strongly recommend leaving it in and set
+ * to some reasonable value (say 1023 or 255).
+ */
+#define LITERAL_LIMIT 511
+
+/* These are set up this way to make it easy to change the predictions. */
+#define LTEST_W col > 0
+#define LVAL_W(col) cur_row[col-1]
+#define LTEST_NW col > 0
+#define LVAL_NW(col) seedrow[col-1]
+#define LTEST_WW col > 1
+#define LVAL_WW(col) cur_row[col-2]
+#define LTEST_NWW col > 1
+#define LVAL_NWW(col) seedrow[col-2]
+#define LTEST_NE (col+1) < row_width
+#define LVAL_NE(col) seedrow[col+1]
+#define LTEST_NEWCOL 1
+#define LVAL_NEWCOL(col) new_color
+#define LTEST_CACHE 1
+#define LVAL_CACHE(col) cache
+
+#define LOC1TEST LTEST_NE
+#define LOC1VAL(col) LVAL_NE(col)
+#define LOC2TEST LTEST_NW
+#define LOC2VAL(col) LVAL_NW(col)
+#define LOC3TEST LTEST_NEWCOL
+#define LOC3VAL(col) LVAL_NEWCOL(col)
+
+
+#define check(condition) if (!(condition)) return 0
+
+#define write_comp_byte(val) \
+ check(outptr < pastoutmem); \
+ *outptr++ = (HPUInt8) val;
+
+#define read_byte(val) \
+ check(inmem < pastinmem); \
+ val = *inmem++;
+
+#define encode_count(count, over, mem) \
+ if (count >= over) \
+ { \
+ count -= over; \
+ if (count <= (uint32_t) 253) \
+ { \
+ check(mem < pastoutmem); \
+ *mem++ = (HPUInt8) count; \
+ } \
+ else if (count <= (uint32_t) (254 + 255) ) \
+ { \
+ check((mem+1) < pastoutmem); \
+ check( count >= 254 ); \
+ check( (count - 254) <= 255 ); \
+ *mem++ = (HPUInt8) 0xFE; \
+ *mem++ = (HPUInt8) (count - 254); \
+ } \
+ else \
+ { \
+ check((mem+2) < pastoutmem); \
+ check( count >= 255 ); \
+ check( (count - 255) <= 65535 ); \
+ count -= 255; \
+ *mem++ = (HPUInt8) 0xFF; \
+ *mem++ = (HPUInt8) (count >> 8); \
+ *mem++ = (HPUInt8) (count & 0xFF); \
+ } \
+ }
+#define decode_count(count, over) \
+ if (count >= over) \
+ { \
+ read_byte(inval); \
+ count += (uint32_t) inval; \
+ if (inval == (HPUInt8) 0xFE) \
+ { \
+ read_byte(inval); \
+ count += (uint32_t) inval; \
+ } \
+ else if (inval == (HPUInt8) 0xFF) \
+ { \
+ read_byte(inval); \
+ count += (((uint32_t) inval) << 8); \
+ read_byte(inval); \
+ count += (uint32_t) inval; \
+ } \
+ }
+
+#define bytes_for_count(count, over) \
+ ( (count >= 255) ? 3 : (count >= over) ? 1 : 0 )
+
+
+/* The number of bytes we should be greater than to call memset/memcpy */
+#define memutil_thresh 15
+
+HPUInt8* ModeDeltaPlus::encode_header(HPUInt8* outptr, const HPUInt8* pastoutmem, uint32_t isrun, uint32_t location, uint32_t seedrow_count, uint32_t run_count, const HPUInt8 new_color)
+{
+ uint32_t byte;
+
+ check (location < 4);
+ check( (isrun == 0) || (isrun == 1) );
+
+ /* encode "literal" in command byte */
+ byte = (isrun << 7) | (location << 5);
+
+ /* write out number of seedrow bytes to copy */
+ if (seedrow_count > 2)
+ byte |= (0x03 << 3);
+ else
+ byte |= (seedrow_count << 3);
+
+ if (run_count > 6)
+ byte |= 0x07;
+ else
+ byte |= run_count;
+
+ /* write out command byte */
+ write_comp_byte(byte);
+
+ /* macro to write count if it's 3 or more */
+ encode_count( seedrow_count, 3, outptr );
+
+ /* if required, write out color of first pixel */
+ if (location == 0)
+ {
+ write_comp_byte( new_color );
+ }
+
+ /* macro to write count if it's 7 or more */
+ encode_count( run_count, 7, outptr );
+
+ return outptr;
+}
+
+/******************************************************************************/
+/* COMPRESSION */
+/******************************************************************************/
+BOOL ModeDeltaPlus::Compress (HPUInt8 *outmem,
+ uint32_t *outlen,
+ const HPUInt8 *inmem,
+ const uint32_t row_width,
+ const uint32_t inheight,
+ uint32_t horz_ht_dist)
+{
+ register HPUInt8 *outptr = outmem;
+ register uint32_t col;
+ const HPUInt8 *seedrow;
+ uint32_t seedrow_count = 0;
+ uint32_t location = 0;
+ HPUInt8 new_color = (HPUInt8) 0xFF;
+ const HPUInt8 *cur_row;
+ uint32_t row;
+ const HPUInt8 *pastoutmem = outmem + *outlen;
+ uint32_t do_word_copies;
+ /* Halftone distance must be 1-32 (but allow 0 == 1) */
+ if (horz_ht_dist > 32)
+ {
+ return FALSE;
+ }
+ if (horz_ht_dist < 1)
+ {
+ horz_ht_dist = 1;
+ }
+
+ seedrow = pbySeedRow;
+ do_word_copies = ((row_width % 4) == 0);
+
+ for (row = 0; row < inheight; row++)
+ {
+ cur_row = inmem + (row * row_width);
+
+ col = 0;
+ while (col < row_width)
+ {
+ /* First look for seedrow copy */
+ seedrow_count = 0;
+ if (do_word_copies)
+ {
+ /* Try a fast word-based search */
+ while ( ((col & 3) != 0) &&
+ (col < row_width) &&
+ (cur_row[col] == seedrow[col]) )
+ {
+ seedrow_count++;
+ col++;
+ }
+ if ( (col & 3) == 0)
+ {
+ while ( ((col+3) < row_width) &&
+ *((const uint32_t*) (cur_row + col)) == *((const uint32_t*) (seedrow + col)) )
+ {
+ seedrow_count += 4;
+ col += 4;
+ }
+ }
+ }
+ while ( (col < row_width) && (cur_row[col] == seedrow[col]) )
+ {
+ seedrow_count++;
+ col++;
+ }
+
+ /* It is possible that we have hit the end of the line already. */
+ if (col == row_width)
+ {
+ /* encode pure seed run as fake run */
+ outptr = encode_header(outptr, pastoutmem, 1 /*run*/, 1 /*location*/, seedrow_count, 0 /*runcount*/, (HPUInt8) 0 /*color*/);
+ /* exit the while loop for this row */
+ break;
+ }
+ check(col < row_width);
+
+
+ /* determine the prediction for the current pixel */
+ if ( (LOC1TEST) && (cur_row[col] == LOC1VAL(col)) )
+ location = 1;
+ else if ( (LOC2TEST) && (cur_row[col] == LOC2VAL(col)) )
+ location = 2;
+ else if ( (LOC3TEST) && (cur_row[col] == LOC3VAL(col)) )
+ location = 3;
+ else
+ {
+ location = 0;
+ new_color = cur_row[col];
+ }
+
+
+ /* Look for a run */
+ if (
+ ((col+1) < row_width)
+ &&
+ ((col+1) >= horz_ht_dist)
+ &&
+ (cur_row[col+1-horz_ht_dist] == cur_row[col+1])
+ )
+ {
+ /* We found a run. Determine the length. */
+ uint32_t run_count = 0; /* Actually 2 */
+ col++;
+ while ( ((col+1) < row_width) && (cur_row[col+1-horz_ht_dist] == cur_row[col+1]) )
+ {
+ run_count++;
+ col++;
+ }
+ col++;
+ outptr = encode_header(outptr, pastoutmem, 1 /*run*/, location, seedrow_count, run_count, new_color);
+ }
+
+ else
+
+ /* We didn't find a run. Encode literal(s). */
+ {
+ uint32_t replacement_count = 0; /* Actually 1 */
+ const HPUInt8* byte_array = cur_row + col + 1;
+ uint32_t i;
+ col++;
+ /*
+ * The (col+1) in this test is used because there is no need to
+ * check for literal breaks if this is the last byte of the row.
+ * Instead we just tack it on to our literal count at the end.
+ */
+ while ( (col+1) < row_width )
+ {
+ /*
+ * All cases that will break with 1 unit saved. This
+ * should be the best breaking spots, since we will always
+ * gain with the break, but never break for no gain. This
+ * leads to longer strings which is good for decomp speed.
+ */
+ if (
+ /* Seedrow ... */
+ (
+ (cur_row[col] == seedrow[col])
+ &&
+ (
+ /* 2 seedrows */
+ (
+ (cur_row[col+1] == seedrow[col+1])
+ )
+ ||
+ /* seedrow and predict */
+ (
+ (cur_row[col+1] == LVAL_NW(col+1))
+ ||
+ (cur_row[col+1] == LVAL_NEWCOL(col+1))
+ )
+ ||
+ (
+ ((col+2) < row_width)
+ &&
+ (
+ /* seedrow and run */
+ (
+ ((col + 2) >= horz_ht_dist) &&
+ (cur_row[col+2-horz_ht_dist] == cur_row[col+2])
+ )
+ ||
+ /* seedrow and northeast predict */
+ (cur_row[col+1] == LVAL_NE(col+1))
+ )
+ )
+ )
+ )
+ ||
+ /* Run ... */
+ (
+ (cur_row[col] != seedrow[col])
+ &&
+ ((col + 1) >= horz_ht_dist)
+ &&
+ (cur_row[col+1-horz_ht_dist] == cur_row[col+1])
+ &&
+ (
+ /* Run of 3 or more */
+ (
+ ((col+2) < row_width)
+ &&
+ ((col + 2) >= horz_ht_dist)
+ &&
+ (cur_row[col+2-horz_ht_dist] == cur_row[col+2])
+ )
+ ||
+ /* Predict first unit of run */
+ (cur_row[col] == LVAL_NE(col))
+ ||
+ (cur_row[col] == LVAL_NW(col))
+ ||
+ (cur_row[col] == LVAL_NEWCOL(col))
+ )
+ )
+ )
+ break;
+
+ /* limited hardware buffer */
+ if (replacement_count >= LITERAL_LIMIT)
+ break;
+
+ /* add another literal to the list */
+ replacement_count++;
+ col++;
+ }
+
+ /* If almost at end of block, just extend the literal by one */
+ if ( (col+1) == row_width ) {
+ replacement_count++;
+ col++;
+ }
+
+ outptr = encode_header(outptr, pastoutmem, 0 /*not run*/, location, seedrow_count, replacement_count, new_color);
+
+ /* Copy bytes from the byte array. If rc was 1, then we will
+ * have encoded a zero in the command byte, so nothing will be
+ * copied here (the 1 indicates the first pixel, which was
+ * written above or was predicted. If rc is between 2 and 7,
+ * then a value between 1 and 6 will have been written in the
+ * command byte, and we will copy it directly. If 8 or more,
+ * then we encode more counts, then finally copy all the values
+ * from byte_array.
+ */
+
+ if (replacement_count > 0)
+ {
+ /* Now insert rc bytes of data from byte_array */
+ if (replacement_count > memutil_thresh)
+ {
+ check( (outptr + replacement_count) <= pastoutmem );
+ memcpy(outptr, byte_array, (size_t) replacement_count);
+ outptr += replacement_count;
+ }
+ else
+ {
+ for (i = 0; i < replacement_count; i++)
+ {
+ write_comp_byte( byte_array[i] );
+ }
+ }
+ }
+ }
+
+ } /* end of column */
+
+ /* save current row as next row's seed row */
+ seedrow = cur_row;
+
+ } /* end of row */
+
+ check( outptr <= pastoutmem );
+ if (outptr > pastoutmem)
+ {
+ /* We're in big trouble -- we wrote PAST the end of their memory! */
+ *outlen = 0;
+ return 0;
+ }
+
+ *outlen = (uint32_t) (outptr - outmem);
+
+ return 1;
+} /* end of deltaplus_compress2 */
+
+
+BOOL ModeDeltaPlus::Process
+(
+ RASTERDATA* input
+)
+{
+ DRIVER_ERROR err = NO_ERROR;
+
+ if (input==NULL ||
+ (input->rasterdata[COLORTYPE_COLOR]==NULL && input->rasterdata[COLORTYPE_BLACK]==NULL)) // flushing pipeline
+ {
+ return FALSE;
+ }
+ if (input->rasterdata[COLORTYPE_COLOR])
+ {
+ if (m_lCurrCDRasterRow < INDY_STRIP_HEIGHT )
+ {
+ //Copy the data to m_SourceBitmap
+ memcpy(pbyInputImageBuffer + m_lCurrCDRasterRow * inputsize, input->rasterdata[COLORTYPE_COLOR], input->rastersize[COLORTYPE_COLOR]);
+ m_lCurrCDRasterRow ++;
+ }
+ if (m_lCurrCDRasterRow == INDY_STRIP_HEIGHT || ((LJFastRaster*)thePrinter)->phLJFastRaster->IsLastBand())
+ {
+ if (((LJFastRaster*)thePrinter)->m_bStartPageNotSent)
+ {
+ err = (((LJFastRaster*)thePrinter)->phLJFastRaster)->StartPage();
+ ((LJFastRaster*)thePrinter)->m_bStartPageNotSent = FALSE;
+ m_lPrinterRasterRow = 0;
+ }
+
+ m_compressedsize = 2 * inputsize * INDY_STRIP_HEIGHT;
+ BOOL bRet = Compress (compressBuf,
+ &m_compressedsize,
+ pbyInputImageBuffer,
+ inputsize,
+ m_lCurrCDRasterRow,
+ 16
+ );
+ if (!bRet)
+ {
+ memcpy (compressBuf, pbyInputImageBuffer, inputsize * INDY_STRIP_HEIGHT);
+ m_compressedsize = inputsize * INDY_STRIP_HEIGHT;
+ }
+ else
+ {
+ m_bCompressed = TRUE;
+ //m_fRatio = (float)m_compressedsize / (float)(inputsize * INDY_STRIP_HEIGHT);
+ }
+
+ memset(pbyInputImageBuffer, 0x00, inputsize * INDY_STRIP_HEIGHT);
+
+ m_lPrinterRasterRow += m_lCurrCDRasterRow;
+ m_lCurrBlockHeight = m_lCurrCDRasterRow;
+ m_lCurrCDRasterRow = 0;
+ iRastersReady = 1;
+
+ ((LJFastRaster*)thePrinter)->phLJFastRaster->SetLastBand(FALSE);
+ }
+ else
+ {
+ return FALSE;
+ }
+ }
+ return TRUE;
+} //Process
+
+BYTE* ModeDeltaPlus::NextOutputRaster(COLORTYPE color)
+// since we return 1-for-1, just return result first call
+{
+ if (iRastersReady==0)
+ return (BYTE*)NULL;
+
+ if (color == COLORTYPE_BLACK)
+ {
+ return (BYTE*)NULL;
+ }
+ else
+ {
+ iRastersReady=0;
+ return compressBuf;
+ }
+}
+
+unsigned int ModeDeltaPlus::GetOutputWidth(COLORTYPE color)
+{
+ if (color == COLORTYPE_COLOR)
+ {
+ return m_compressedsize;
+ }
+ else
+ {
+ return 0;
+ }
+} //GetOutputWidth
+
+APDK_END_NAMESPACE
+
+#endif // defined APDK_LJFASTRASTER
diff --git a/prnt/hpijs/ljfastraster.h b/prnt/hpijs/ljfastraster.h
new file mode 100644
index 0000000..7f8801a
--- /dev/null
+++ b/prnt/hpijs/ljfastraster.h
@@ -0,0 +1,183 @@
+/*****************************************************************************\
+ LJFastRaster.h : Interface for the LJFastRaster class
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#ifndef APDK_LJFASTRASTER_H
+#define APDK_LJFASTRASTER_H
+
+
+APDK_BEGIN_NAMESPACE
+/*!
+\internal
+*/
+class LJFastRaster : public Printer
+{
+public:
+ LJFastRaster (SystemServices* pSS,int numfonts=0, BOOL proto=FALSE);
+ ~LJFastRaster ();
+
+ virtual Header* SelectHeader (PrintContext* pc);
+ virtual DRIVER_ERROR VerifyPenInfo ();
+ virtual DRIVER_ERROR ParsePenInfo (PEN_TYPE& ePen, BOOL QueryPrinter=TRUE);
+ virtual DISPLAY_STATUS ParseError (BYTE status_reg);
+ virtual DRIVER_ERROR Flush (int FlushSize)
+ {
+ return NO_ERROR;
+ }
+
+ virtual BOOL GetMargins (PAPER_SIZE ps, float *fMargins)
+ {
+ fMargins[0] = (float) 0.1667;
+ fMargins[1] = (float) 0.1667;
+ fMargins[2] = (float) 0.1667;
+ fMargins[3] = (float) 0.1667;
+ return TRUE;
+ }
+
+ virtual BOOL UseCMYK (unsigned int iPrintMode) { return FALSE;}
+ virtual DRIVER_ERROR Encapsulate (const RASTERDATA* InputRaster, BOOL bLastPlane);
+ virtual BOOL SupportSeparateBlack (PrintMode *pCurrentMode)
+ {
+ return FALSE;
+ }
+
+ Compressor* CreateCompressor (unsigned int RasterSize);
+ int m_iYPos;
+ BOOL m_bStartPageNotSent;
+
+ HeaderLJFastRaster *phLJFastRaster;
+protected:
+
+#ifdef APDK_HP_UX
+ virtual LJFastRaster & operator = (Printer& rhs)
+ {
+ return *this;
+ }
+#endif
+
+ virtual DATA_FORMAT GetDataFormat() { return RASTER_STRIP; }
+
+ BOOL m_bJobStarted;
+
+ Compressor *m_pCompressor;
+}; // LJFastRaster
+
+class LJFastRasterNormalMode : public GrayMode
+{
+public:
+ LJFastRasterNormalMode ();
+}; // LJFastRasterNormalMode
+
+class LJFastRasterDraftMode : public GrayMode
+{
+public:
+ LJFastRasterDraftMode ();
+}; // LJFastRasterDraftMode
+
+/*!
+\internal
+*/
+
+#include "hptypes.h"
+
+#define HIBYTE(sVar) (BYTE) ((sVar & 0xFF00) >> 8)
+#define LOBYTE(sVar) (BYTE) ((sVar & 0x00FF))
+
+class ModeDeltaPlus : public Compressor
+{
+ friend class LJFastRaster;
+ friend class HeaderLJFastRaster;
+
+public:
+ ModeDeltaPlus(SystemServices* pSys, Printer* pPrinter, unsigned int RasterSize);
+ virtual ~ModeDeltaPlus();
+ BOOL Process(RASTERDATA* input);
+ BYTE* NextOutputRaster(COLORTYPE color);
+ unsigned int GetOutputWidth(COLORTYPE color);
+
+protected:
+ BOOL Compress(HPUInt8* outmem, uint32_t* outlen, const HPUInt8* inmem, const uint32_t row_width, const uint32_t inheight, uint32_t horz_ht_dist);
+private:
+ Printer* thePrinter;
+
+ HPUInt8* encode_header(HPUInt8* outptr, const HPUInt8* pastoutmem, uint32_t isrun, uint32_t location, uint32_t seedrow_count, uint32_t run_count, const HPUInt8 new_color);
+
+ unsigned char *pbyInputImageBuffer;
+
+ HPLJBITMAP m_DestBitmap;;
+ long m_lCurrCDRasterRow; // Current raster index. in PrintNextBand
+ long m_lCurrBlockHeight;
+ long m_lPrinterRasterRow; // Current printer raster row.
+
+ uint32_t m_compressedsize;
+ BOOL m_bCompressed;
+ float m_fRatio;
+ HPUInt8 *pbySeedRow;
+}; //ModeDeltaPlus
+
+
+#ifdef APDK_LJFASTRASTER
+//! LJFastRasterProxy
+/*!
+******************************************************************************/
+class LJFastRasterProxy : public PrinterProxy
+{
+public:
+ LJFastRasterProxy () : PrinterProxy(
+ "LJFastRaster", // family name
+ "hp LaserJet 1010\0"
+ "hp LaserJet 1012\0"
+/*
+ * The 1015 also supports a PCL path. It will be used a a LJMono printer.
+ *
+ "hp LaserJet 1015\0"
+ */
+ )
+ {
+ m_iPrinterType = eLJFastRaster;
+ }
+ inline Printer* CreatePrinter (SystemServices* pSS) const
+ {
+ return new LJFastRaster(pSS);
+ }
+ inline PRINTER_TYPE GetPrinterType () const
+ {
+ return eLJFastRaster;
+ }
+ inline unsigned int GetModelBit () const
+ {
+ return 0x1;
+ }
+};
+#endif
+
+APDK_END_NAMESPACE
+
+#endif //APDK_LJFASTRASTER_H
diff --git a/prnt/hpijs/ljjetready.cpp b/prnt/hpijs/ljjetready.cpp
new file mode 100644
index 0000000..048eca2
--- /dev/null
+++ b/prnt/hpijs/ljjetready.cpp
@@ -0,0 +1,1851 @@
+/*****************************************************************************\
+ ljjetready.cpp : Implimentation for the LJJetReady class
+
+ Copyright (c) 1996 - 2008, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#ifdef APDK_LJJETREADY
+/*
+ * Not sure need HAVE_PROTOTYPES here, a user reported a compiler error under Tru64. The error
+ * was for the assignment jerr.error_exit = Gjpeg_error; This seems to be due to JMETHOD
+ * definition in jmorecfg.h
+ */
+
+//#define HAVE_PROTOTYPES
+
+#include "header.h"
+#include "io_defs.h"
+#include "ljjetready.h"
+#include "printerproxy.h"
+#include "resources.h"
+
+#ifdef HAVE_LIBDL
+#include <dlfcn.h>
+#endif
+
+extern "C"
+{
+int (*HPLJJRCompress) (BYTE *pbOutBuffer,
+ uint32_t *outlen,
+ BYTE *inmem,
+ const uint32_t iLogicalImageWidth,
+ const uint32_t iLogicalImageHeight);
+}
+
+APDK_BEGIN_NAMESPACE
+
+#ifdef HAVE_LIBDL
+extern void *LoadPlugin (const char *szPluginName);
+#endif
+
+extern MediaSize PaperToMediaSize(PAPER_SIZE psize);
+
+#define MOJAVE_STRIP_HEIGHT 128 // Mojave strip height should always be 128 for compression sake
+
+#define MOJAVE_RESOLUTION 600 // Mojave supports only one resolution- 600 DPI
+
+BYTE JrBeginSessionSeq[] = {0xC0, 0x00, 0xF8, 0x86, 0xC0, 0x03, 0xF8, 0x8F, 0xD1, 0x58,
+ 0x02, 0x58, 0x02, 0xF8, 0x89, 0x41};
+BYTE JrFeedOrientationSeq[] = {0xC0, 0x00 , 0xF8, 0x28 };
+// |fd ori enum| |ori cmd|
+BYTE JrPaperSizeSeq[] = {0xC0, 0x00 ,0xF8, 0x25};
+// |pap siz enum| |pap sz cmd|
+BYTE JrMedSourceSeq[] = {0xC0, 0x00 ,0xF8, 0x26 };
+// |Med src enum| |Med src cmd|
+BYTE JrMedDestinationSeq[] = {0xC0, 0x00 ,0xF8 , 0x24 };
+// |Med Dest enum| |Med src cmd|
+BYTE JrBeginPageSeq[] = {0x43, 0xD3, 0x64, 0x00, 0x64, 0x00, 0xF8, 0x2A, 0x75, 0xD3,
+ 0x00, 0x00, 0x00, 0x00, 0xF8, 0x4C, 0x6B};
+BYTE JrBeginImageSeq[] = {0xC2, 0x00, 0x40, 0x70, 0x68, 0xF8, 0x91, 0xC1};
+
+BYTE JrVU_ver_TagSeq[] = {0xC2, 0x00, 0x00, 0x04, 0x00 , 0xF8, 0x95 };
+// |endian alignd | |Jr_ver_ tag|
+BYTE JrDataLengthSeq[] = {0xC2, 0x86, 0x0A, 0x00, 0x00, 0xF8, 0x92 };
+// | VU data length|
+BYTE JrVenUniqSeq[] = {0x46};
+BYTE JrVUExtn_3Seq[] = {0xC2, 0x02, 0x40, 0x70, 0x68 ,0xF8, 0x91 };
+// |endian alignd Jr rd img tag| |VU extensn|
+BYTE JrEndPageSeq[] = {0x44};
+BYTE JrEndSessionSeq[] = {0x42};
+// PJL level commands..
+
+//**JETLIB ENTRIES
+const char ccpPJLStartJob[] = {ESC, '%', '-','1','2','3','4','5','X' };;
+const char ccpPJLExitSeq[] = {ESC, '%', '-','1','2','3','4','5','X', '@','P','J','L',' ','E','O','J', LF, ESC,'%', '-','1','2','3','4','5','X'};
+const char ccpPJLSetRes[] = {'@','P','J','L',' ','S','E','T',' ','R','E','S','O','L','U','T','I','O','N','=','6','0','0', LF};
+const char ccpPJLUTF8[] = {'@','P','J','L',' ','S','E','T',' ','S','T','R','I','N','G','C','O','D','E','S','E','T','=','U','T','F','8', LF};
+const char ccpPJLSetPlanes[] = {'@','P','J','L',' ','S','E','T',' ','P','L','A','N','E','S','I','N','U','S','E','=','1',LF}; //Sent only for GrayScale Printing
+const char ccpPCLEnterXL[] = {'@','P','J','L',' ','E','N','T','E','R',' ','L','A','N','G','U','A','G','E','=','P','C','L','X','L', LF};
+const char ccpPJLSetTO[] = {'@','P','J','L',' ','S','E','T',' ','T','I','M','E','O','U','T','=','9','0', LF};
+const char ccpPJLSetCopyCount[] = {'@','P','J','L',' ','S','E','T',' ','C','O','P','I','E','S','=','1',LF};
+const char ccpUEL[] = {ESC, '%', '-','1','2','3','4','5','X' };
+const char ccpPJLComment[] = {')',' ','H','P','-','P','C','L',' ','X','L',';','3',';','0',';','C','o','m','m','e','n','t',',',' ','P','C','L','-','X','L',' ','J','e','t','R','e','a','d','y',' ','g','e','n','e','r','a','t','o','r', LF};
+//**END JETLIB ENTRIES
+
+
+LJJetReady::LJJetReady (SystemServices* pSS, int numfonts, BOOL proto)
+ : Printer(pSS, numfonts, proto)
+{
+
+ if ((!proto) && (IOMode.bDevID))
+ {
+ constructor_error = VerifyPenInfo();
+ CERRCHECK;
+ }
+ else ePen = BOTH_PENS; // matches default mode
+
+ pMode[GRAYMODE_INDEX] = new LJJetReadyGrayMode ();
+ pMode[DEFAULTMODE_INDEX] = new LJJetReadyNormalMode ();
+ ModeCount = 2;
+
+
+ CMYMap = NULL;
+ m_bJobStarted = FALSE;
+#ifdef APDK_AUTODUPLEX
+ m_bRotateBackPage = FALSE; // Lasers don't require back side image to be rotated
+#endif
+ m_pCompressor = NULL;
+ m_iYPos = 0;
+
+ m_bStartPageNotSent = TRUE;
+
+ HPLJJRCompress = NULL;
+
+#ifdef HAVE_LIBDL
+ m_hHPLibHandle = LoadPlugin ("lj.so");
+ if (m_hHPLibHandle)
+ {
+ dlerror ();
+ *(void **) (&HPLJJRCompress) = dlsym (m_hHPLibHandle, "HPJetReadyCompress");
+ }
+ if (HPLJJRCompress)
+ {
+ pMode[ModeCount] = new LJJetReadyBestColorMode ();
+ ModeCount++;
+ pMode[ModeCount] = new LJJetReadyBestGrayMode ();
+ ModeCount++;
+ }
+#endif
+ m_eCompressMode = COMPRESS_MODE_JPEG;
+
+ DBG1("LJJetReady created\n");
+}
+
+LJJetReady::~LJJetReady ()
+{
+ DISPLAY_STATUS eDispStatus;
+
+#ifdef HAVE_LIBDL
+ if (m_hHPLibHandle)
+ {
+ dlclose (m_hHPLibHandle);
+ }
+#endif
+
+ if (IOMode.bStatus && m_bJobStarted)
+ {
+ for (int i = 0; i < 5; i++)
+ {
+ pSS->BusyWait (2000);
+ eDispStatus = ParseError (0);
+ if (eDispStatus == DISPLAY_PRINTING_COMPLETE)
+ {
+ pSS->DisplayPrinterStatus (eDispStatus);
+ break;
+ }
+ }
+ }
+}
+
+LJJetReadyNormalMode::LJJetReadyNormalMode ()
+: PrintMode (NULL)
+{
+ ResolutionX[0] = 600;
+ ResolutionY[0] = 600;
+ BaseResX = BaseResY = 600;
+
+ bFontCapable = FALSE;
+
+#if defined(APDK_VIP_COLORFILTERING)
+ Config.bErnie = FALSE;
+#endif
+ Config.bColorImage = FALSE;
+ theQuality = qualityNormal;
+
+ pmQuality = QUALITY_NORMAL;
+ Config.bColorImage = FALSE;
+#ifdef APDK_AUTODUPLEX
+ bDuplexCapable = TRUE;
+#endif
+}
+
+LJJetReadyBestColorMode::LJJetReadyBestColorMode () : PrintMode (NULL)
+{
+ ResolutionX[0] =
+ ResolutionY[0] =
+ BaseResX =
+ BaseResY = 600;
+
+ bFontCapable = FALSE;
+
+#if defined(APDK_VIP_COLORFILTERING)
+ Config.bErnie = FALSE; // Raghu
+#endif
+
+ Config.bColorImage = FALSE;
+ theQuality = qualityPresentation;
+ pmQuality = QUALITY_BEST;
+#ifdef APDK_AUTODUPLEX
+ bDuplexCapable = TRUE;
+#endif
+}
+
+LJJetReadyGrayMode::LJJetReadyGrayMode () : PrintMode (NULL)
+{
+ ResolutionX[0] =
+ ResolutionY[0] =
+ BaseResX =
+ BaseResY = 600;
+
+ bFontCapable = FALSE;
+
+#if defined(APDK_VIP_COLORFILTERING)
+ Config.bErnie = FALSE; // Raghu
+#endif
+
+ Config.bColorImage = FALSE;
+ pmColor = GREY_K;
+#ifdef APDK_AUTODUPLEX
+ bDuplexCapable = TRUE;
+#endif
+}
+
+LJJetReadyBestGrayMode::LJJetReadyBestGrayMode () : PrintMode (NULL)
+{
+ ResolutionX[0] =
+ ResolutionY[0] =
+ BaseResX =
+ BaseResY = 600;
+
+ bFontCapable = FALSE;
+
+#if defined(APDK_VIP_COLORFILTERING)
+ Config.bErnie = FALSE; // Raghu
+#endif
+
+ Config.bColorImage = FALSE;
+ pmColor = GREY_K;
+ pmQuality = QUALITY_BEST;
+ theQuality = qualityPresentation;
+#ifdef APDK_AUTODUPLEX
+ bDuplexCapable = TRUE;
+#endif
+}
+
+HeaderLJJetReady::HeaderLJJetReady (Printer* p, PrintContext* pc)
+ : Header(p,pc)
+{
+ SetLastBand(FALSE);
+}
+
+DRIVER_ERROR HeaderLJJetReady::Send ()
+{
+ StartSend ();
+
+ return NO_ERROR;
+}
+
+DRIVER_ERROR HeaderLJJetReady::StartSend ()
+{
+ DRIVER_ERROR err;
+ char szScratchStr[64];
+
+ err = thePrinter->Send ((const BYTE*)ccpPJLStartJob, sizeof(ccpPJLStartJob));
+ ERRCHECK;
+
+ //Send the UTF8 encoding command
+ err = thePrinter->Send ((const BYTE*)ccpPJLUTF8, sizeof(ccpPJLUTF8));
+ ERRCHECK;
+
+ // If it is Grayscale printjob, send the PJL command indicating the same
+ COLORMODE eC = COLOR;
+ MEDIATYPE eM;
+ QUALITY_MODE eQ;
+ BOOL bD;
+
+ ((LJJetReady *)thePrinter)->bGrey_K = FALSE;
+ if ((thePrintContext->GetPrintModeSettings (eQ, eM, eC, bD)) == NO_ERROR &&
+ eC == GREY_K)
+ {
+ ((LJJetReady *)thePrinter)->bGrey_K = TRUE;
+ err = thePrinter->Send ((const BYTE*)ccpPJLSetPlanes,sizeof(ccpPJLSetPlanes));
+ ERRCHECK;
+ }
+
+ //Send the Number of copies command
+// err = thePrinter->Send ((const BYTE*)ccpPJLSetCopyCount,sizeof(ccpPJLSetCopyCount));
+ sprintf (szScratchStr, "@PJL SET COPIES=%d\015\012", thePrintContext->GetCopyCount ());
+ err = thePrinter->Send ((const BYTE *) szScratchStr, strlen (szScratchStr));
+ ERRCHECK;
+
+ // Send the Duplex command
+ strcpy (szScratchStr, "@PJL SET DUPLEX=OFF\015\012");
+#ifdef APDK_AUTODUPLEX
+ DUPLEXMODE dupmode = thePrintContext->QueryDuplexMode ();
+ if (dupmode != DUPLEXMODE_NONE)
+ {
+ strcpy (szScratchStr, "@PJL SET DUPLEX=ON\015\012@PJL SET BINDING=");
+ if (dupmode == DUPLEXMODE_BOOK)
+ strcat (szScratchStr, "LONGEDGE\015\012");
+ else
+ strcat (szScratchStr, "SHORTEDGE\015\012");
+ }
+#endif
+ err = thePrinter->Send ((const BYTE *) szScratchStr, strlen (szScratchStr));
+ ERRCHECK;
+
+ //Set the resolution to 600
+ err = thePrinter->Send ((const BYTE*)ccpPJLSetRes,sizeof(ccpPJLSetRes));
+ ERRCHECK;
+
+ //Send the time out command
+ err = thePrinter->Send ((const BYTE*)ccpPJLSetTO,sizeof(ccpPJLSetTO));
+ ERRCHECK;
+
+ //send the mojave PCL_XL_ENTER_LANG command
+ err = thePrinter->Send ((const BYTE*)ccpPCLEnterXL,sizeof(ccpPCLEnterXL));
+ ERRCHECK;
+
+ //send the comment string
+ err = thePrinter->Send ((const BYTE*)ccpPJLComment,sizeof(ccpPJLComment));
+ ERRCHECK;
+
+ err = thePrinter->Send ((const BYTE*)JrBeginSessionSeq,sizeof(JrBeginSessionSeq));
+ ERRCHECK;
+
+ return err;
+}
+
+int HeaderLJJetReady::JRPaperToMediaSize(PAPER_SIZE psize)
+{
+ switch(psize)
+ {
+ case LETTER: return 0;
+ case LEGAL: return 1;
+ case A4: return 2;
+ case B4: return 10;
+ case B5: return 11;
+ case OUFUKU: return 14;
+ case HAGAKI: return 14;
+ case A6: return 17;
+#ifdef APDK_EXTENDED_MEDIASIZE
+ case A3: return 5;
+ case A5: return 16;
+ case LEDGER: return 4;
+ case EXECUTIVE: return 3;
+ case CUSTOM_SIZE: return 96;
+ case ENVELOPE_NO_10: return 6;
+ case ENVELOPE_A2: return 6;
+ case ENVELOPE_C6: return 8;
+ case ENVELOPE_DL: return 9;
+#endif
+ default: return 0;
+ }
+}
+
+DRIVER_ERROR HeaderLJJetReady::StartPage ()
+{
+ DRIVER_ERROR err;
+ BYTE szCustomSize[64];
+
+ /* Orienatation: is JrFeedOrientationSeq[1]. Can take the following values:
+ Portrait : 0x00
+ Landscape: : 0x01
+ Reversed Portrait : 0x02
+ Reversed Landscape : 0x03
+ Image Orientataion: 0x04
+
+ Mojave supports only one feed orientation: Portrait
+ */
+ err = thePrinter->Send ((const BYTE*)JrFeedOrientationSeq,sizeof(JrFeedOrientationSeq));
+ ERRCHECK;
+
+ // Paper Size
+ PAPER_SIZE ps = thePrintContext->GetPaperSize ();
+ int msizeCode;
+ msizeCode = JRPaperToMediaSize(ps);
+ //Put the papersize into the JrPaperSizeSeq[]
+ JrPaperSizeSeq[1] = (BYTE) msizeCode;
+#ifdef APDK_EXTENDED_MEDIASIZE
+ if(msizeCode == 96) //Custom paper size
+ {
+ BYTE szScratchStr[] = {"\xF8\x2F\xC0\x00\xF8\x30"};
+ union
+ {
+ float fValue;
+ uint32_t uiValue;
+ } LJJRUnion;
+ uint32_t uiXsize;
+ uint32_t uiYsize;
+ int k = 0;
+ LJJRUnion.fValue = (float) thePrintContext->PhysicalPageSizeX ();
+ uiXsize = LJJRUnion.uiValue;
+ LJJRUnion.fValue = (float) thePrintContext->PhysicalPageSizeY ();
+ uiYsize = LJJRUnion.uiValue;
+ szCustomSize[k++] = 0xD5;
+ szCustomSize[k++] = (BYTE) (uiXsize & 0x000000FF);
+ szCustomSize[k++] = (BYTE) ((uiXsize & 0x0000FF00) >> 8);
+ szCustomSize[k++] = (BYTE) ((uiXsize & 0x00FF0000) >> 16);
+ szCustomSize[k++] = (BYTE) ((uiXsize & 0xFF000000) >> 24);
+ szCustomSize[k++] = (BYTE) (uiYsize & 0x000000FF);
+ szCustomSize[k++] = (BYTE) ((uiYsize & 0x0000FF00) >> 8);
+ szCustomSize[k++] = (BYTE) ((uiYsize & 0x00FF0000) >> 16);
+ szCustomSize[k++] = (BYTE) ((uiYsize & 0xFF000000) >> 24);
+ err = thePrinter->Send ((const BYTE *) szCustomSize, k);
+
+ err = thePrinter->Send (szScratchStr, sizeof (szScratchStr));
+ ERRCHECK;
+ }
+ else
+#endif
+ {
+ err = thePrinter->Send ((const BYTE*)JrPaperSizeSeq,sizeof(JrPaperSizeSeq));
+ ERRCHECK;
+ }
+
+ // If it is Grayscale printjob, send the PJL command indicating the same
+ COLORMODE eC = COLOR;
+ MEDIATYPE eM;
+ QUALITY_MODE eQ;
+ BOOL bD;
+
+ thePrintContext->GetPrintModeSettings (eQ, eM, eC, bD);
+
+/*
+ * Send Printable Area. This is necessary in case source width is less than printable width.
+ *
+ *
+ * width is imagewidth - multiple of 96
+ * height is physical page height - margins for 8x5 x 11 - 6600 - 200 = 6400
+ */
+
+ BYTE szPrintableArea[] = {"\xD1\x00\x00\x00\x00\xF8\x74"};
+ int iWidth = (int) thePrintContext->InputPixelsPerRow ();
+ int iPageHeight;
+
+/*
+ * There is a firmware bug in Mojave and Lakota that causes image replicatin across the
+ * page if width is less than the printable width in grayscale. So, set width to printable
+ * width for grayscale.
+ */
+
+ if (eC == GREY_K)
+ {
+ iWidth = (int) (thePrintContext->PrintableWidth () *
+ thePrintContext->EffectiveResolutionX ());
+ }
+
+/*
+ * The minimum printable width is 1600 pixels (3 inch * 600 - 200 for margins)
+ */
+
+ if (iWidth < 1600)
+ {
+ iWidth = 1600;
+ }
+
+/*
+ * Further, source width must be a multiple of 32.
+ */
+
+
+ iWidth = ((iWidth + 31) / 32) * 32;
+
+ iPageHeight = (int) (thePrintContext->PrintableHeight () *
+ thePrintContext->EffectiveResolutionY ());
+ iPageHeight = ((iPageHeight + (MOJAVE_STRIP_HEIGHT - 1)) / MOJAVE_STRIP_HEIGHT) * MOJAVE_STRIP_HEIGHT;
+
+ szPrintableArea[1] = iWidth & 0xFF;
+ szPrintableArea[2] = (iWidth >> 8) & 0xFF;
+ szPrintableArea[3] = iPageHeight & 0xFF;
+ szPrintableArea[4] = (iPageHeight >> 8) & 0xFF;
+ err = thePrinter->Send (szPrintableArea, 7);
+ ERRCHECK;
+
+ //MapPCLMediaTypeToString (eM); // Optional. No need to send
+
+ err = thePrinter->Send ((const BYTE *)JrBeginPageSeq, sizeof(JrBeginPageSeq));
+ ERRCHECK;
+
+ // The colorspace command has to be sent to intimate the printer to switch to color/monochrome
+ // depending upon the data that we are about to send.
+ // This command must be sent after SetCursor and before beginimage command
+ if (eC == GREY_K )
+ {
+ // indicates switch to monochrome mode
+ err = thePrinter->Send ((const BYTE *) "\xC0\x07\xF8\x03\x6A", 5);
+ ERRCHECK;
+ }
+ else
+ {
+ // indicates switch Color mode
+ err = thePrinter->Send ((const BYTE *) "\xC0\x06\xF8\x03\x6A", 5);
+ ERRCHECK;
+ }
+
+ bLastBand = FALSE;
+
+ return err;
+}
+
+DRIVER_ERROR HeaderLJJetReady::EndPage ()
+{
+ DRIVER_ERROR err;
+
+ err = thePrinter->Send ((const BYTE*)JrVUExtn_3Seq,sizeof(JrVUExtn_3Seq));
+ ERRCHECK;
+ err = thePrinter->Send ((const BYTE*)JrVU_ver_TagSeq,sizeof(JrVU_ver_TagSeq));
+ ERRCHECK;
+ err = thePrinter->Send ((const BYTE*)JrVenUniqSeq,sizeof(JrVenUniqSeq));
+ ERRCHECK;
+ err = thePrinter->Send ((const BYTE*)JrEndPageSeq,sizeof(JrEndPageSeq));
+ ERRCHECK;
+
+ return err;
+}
+
+
+//-----------------------------------------------------------------------------
+// Function: CDJPcl::MapPCLMediaTypeToString()
+//
+// Description: Sends the command for mediatype.
+// Input: None
+// Modifies: None
+//
+// Precond: None
+//
+//
+// Postcond: The mediatype commands are sent
+//
+// Returns: None
+//
+//-----------------------------------------------------------------------------
+DRIVER_ERROR HeaderLJJetReady::MapPCLMediaTypeToString (MEDIATYPE eM)
+{
+ DRIVER_ERROR err;
+ BYTE szPlain[] = {"\xC8\xC1\x05\x00Plain\xF8\x27"};
+ BYTE szPhoto[] = {"\xC8\xC1\x05\x00Gloss\xF8\x27"};
+
+ switch (eM)
+ {
+ case (MEDIA_PLAIN):
+ err = thePrinter->Send (szPlain, sizeof (szPlain));
+ ERRCHECK;
+ break;
+
+ case (MEDIA_PHOTO):
+ err = thePrinter->Send (szPhoto, sizeof (szPhoto));
+ ERRCHECK;
+ break;
+ default:
+ //** unsupported media type; return error code
+ assert (0);
+ err = SYSTEM_ERROR;
+ break;// to be verified..
+ }
+
+ return err;
+}
+
+DRIVER_ERROR HeaderLJJetReady::EndJob ()
+{
+ DRIVER_ERROR err = NO_ERROR;
+
+ err = thePrinter->Send((const BYTE*)JrEndSessionSeq, sizeof(JrEndSessionSeq));
+ ERRCHECK;
+
+ err = thePrinter->Send((const BYTE*)ccpPJLExitSeq, sizeof(ccpPJLExitSeq));
+ ERRCHECK;
+
+ return err;
+}
+
+DRIVER_ERROR HeaderLJJetReady::FormFeed ()
+{
+ DRIVER_ERROR err = NO_ERROR;
+ ModeJPEG *pCompressor;
+ LJJetReady *thisPrinter = (LJJetReady *) thePrinter;
+ int iPageHeight;
+
+ iPageHeight = (int) (thePrintContext->PrintableHeight () *
+ thePrintContext->EffectiveResolutionY ());
+ iPageHeight = ((iPageHeight + MOJAVE_STRIP_HEIGHT - 1) / MOJAVE_STRIP_HEIGHT) * MOJAVE_STRIP_HEIGHT;
+
+/*
+ * Send white rasters to fill up the rest of the page.
+ * This is required according to Brian Mayer, but introduces a long delay
+ * in printing. LJ3500 works fine without these white strips.
+ */
+
+ pCompressor = (ModeJPEG *) thisPrinter->GetCompressor ();
+ err = pCompressor->SendWhiteStrips (iPageHeight, thisPrinter->bGrey_K);
+
+
+ bLastBand = TRUE;
+
+ err = EndPage ();
+
+ thisPrinter->m_bStartPageNotSent = TRUE;
+ return err;
+}
+
+DRIVER_ERROR HeaderLJJetReady::SendCAPy (unsigned int iAbsY)
+{
+ return NO_ERROR;
+}
+
+DRIVER_ERROR LJJetReady::Encapsulate (const RASTERDATA* InputRaster, BOOL bLastPlane)
+{
+ BYTE res[64];
+ BYTE *pDataPtr = NULL;
+ DRIVER_ERROR err;
+
+ //if (m_bStartPageNotSent)
+ //{
+ // err = phLJJetReady->StartPage ();
+ // if (err != NO_ERROR)
+ // return err;
+ // m_bStartPageNotSent = FALSE;
+ //}
+
+
+ unsigned short int wCoordinate;
+
+ unsigned long ulVUDataLength = 0;
+
+ // For color JPEG, you need to skip the header information of 623 bytes
+
+ int iJpegHeaderSize = 623;
+#ifdef HAVE_LIBDL
+ if (HPLJJRCompress && m_eCompressMode == COMPRESS_MODE_LJ)
+ {
+ iJpegHeaderSize = 0;
+ }
+#endif
+
+ if (bGrey_K)
+ {
+ ulVUDataLength = InputRaster->rastersize[COLORTYPE_COLOR];
+ pDataPtr = (BYTE *) InputRaster->rasterdata[COLORTYPE_COLOR];
+ }
+ else
+ {
+ ulVUDataLength = InputRaster->rastersize[COLORTYPE_COLOR] - iJpegHeaderSize;
+ pDataPtr = (BYTE *) InputRaster->rasterdata[COLORTYPE_COLOR] + iJpegHeaderSize;
+ }
+
+
+ //VWritePrinter("\xC2\x01\x40\x70\x68\xF8\x91\xC1", 0x08);
+ BYTE JrReadImageSeq[] = {0xC2, 0x01, 0x40, 0x70,0x68, 0xF8, 0x91, 0xC1};
+ err = Send ((const BYTE *)JrReadImageSeq, sizeof(JrReadImageSeq));
+ ERRCHECK;
+
+ ModeJPEG *pCompressor = NULL;
+ pCompressor = (ModeJPEG*)GetCompressor();
+
+ wCoordinate = (unsigned short int)pCompressor->GetCoordinates() - 128;
+// err = Send ((const BYTE *)&wCoordinate, sizeof(unsigned short int));
+ res[0] = wCoordinate & 0xFF;
+ res[1] = ((wCoordinate & 0xFF00) >> 8);
+ err = Send ((const BYTE *) res, 2);
+ ERRCHECK;
+
+ BYTE JrStripHeight[] = {0xF8,0x6D,0xC1,0x80,0x00,0xF8,0x63};
+ err = Send ((const BYTE *)JrStripHeight, sizeof(JrStripHeight));
+ ERRCHECK;
+
+ BYTE JrTextObjectTypeSeq[] = {0xC0,0x00, 0xF8, 0x96};
+ err = Send ((const BYTE *)JrTextObjectTypeSeq, sizeof(JrTextObjectTypeSeq));
+ ERRCHECK;
+
+ err = Send ((const BYTE *)JrVU_ver_TagSeq, sizeof(JrVU_ver_TagSeq));
+ ERRCHECK;
+
+ err = Send ((const BYTE *) "\xC2", 1);
+ ERRCHECK;
+
+ ulVUDataLength += 6;
+ res[0] = (BYTE) (ulVUDataLength & 0xFF);
+ res[1] = (BYTE) ((ulVUDataLength & 0x0000FF00) >> 8);
+ res[2] = (BYTE) ((ulVUDataLength & 0x00FF0000) >> 16);
+ res[3] = (BYTE) ((ulVUDataLength & 0xFF000000) >> 24);
+ res[4] = 0xF8;
+ res[5] = 0x92;
+ res[6] = 0x46;
+ res[7] = 0x21;
+#ifdef HAVE_LIBDL
+ if (HPLJJRCompress && m_eCompressMode == COMPRESS_MODE_LJ)
+ {
+ res[7] = 0x11;
+ }
+#endif
+ res[8] = 0x90;
+
+ ulVUDataLength -= 6;
+ res[9] = (BYTE) (ulVUDataLength & 0xFF);
+ res[10] = (BYTE) ((ulVUDataLength & 0x0000FF00) >> 8);
+ res[11] = (BYTE) ((ulVUDataLength & 0x00FF0000) >> 16);
+ res[12] = (BYTE) ((ulVUDataLength & 0xFF000000) >> 24);
+
+ err = Send (res, 13);
+ ERRCHECK;
+
+ err = Send (pDataPtr, ulVUDataLength);
+ ERRCHECK;
+
+ return err;
+}
+
+Header* LJJetReady::SelectHeader (PrintContext *pc)
+{
+
+/*
+ * To take care of what seems to be a firmware bug in the printer's grayscale path,
+ * need printable width value later. So, save the PrintContext here.
+ * Raghu
+ */
+
+ COLORMODE eC = COLOR;
+ MEDIATYPE eM;
+ QUALITY_MODE eQ;
+ BOOL bD;
+
+ thePrintContext = pc;
+ phLJJetReady = new HeaderLJJetReady (this, pc);
+ pc->GetPrintModeSettings (eQ, eM, eC, bD);
+ if (eQ == QUALITY_BEST)
+ {
+ m_eCompressMode = COMPRESS_MODE_LJ;
+ }
+
+#ifdef HAVE_LIBDL
+ if (HPLJJRCompress && m_eCompressMode != COMPRESS_MODE_LJ)
+ {
+ dlclose (m_hHPLibHandle);
+ m_hHPLibHandle = NULL;
+ HPLJJRCompress = NULL;
+ }
+#endif
+ return phLJJetReady;
+}
+
+DRIVER_ERROR LJJetReady::VerifyPenInfo()
+{
+ ePen = BOTH_PENS;
+ return NO_ERROR;
+}
+
+DRIVER_ERROR LJJetReady::ParsePenInfo(PEN_TYPE& ePen, BOOL QueryPrinter)
+{
+ ePen = BOTH_PENS;
+
+ return NO_ERROR;
+}
+
+Compressor* LJJetReady::CreateCompressor (unsigned int RasterSize)
+{
+
+/*
+ * There is some problem printing in grayscale. When the inputwidth is less than the full
+ * page width, printer replicates the image across the width. To fix this, make the width of
+ * each strip the width of the printable page size. Note that this does not create any scaling
+ * of the image.
+ * In addition, there is a minimum source width requirement, which is
+ * 3 in. * resolution - 2 * margins = 3 * 600 - 2 * 100 = 1600
+ * So, minimum RasterSize must be 1600 * 3 here (width * 3 for RGB).
+ * Raghu
+ */
+
+ if (bGrey_K)
+ {
+ RasterSize = (int) (thePrintContext->PrintableWidth () * thePrintContext->EffectiveResolutionX ()) * 3;
+ }
+
+ if (RasterSize < 4800)
+ {
+ RasterSize = 4800;
+ }
+
+/*
+ * Further, source width must be a multiple of 32 (96 for RGB here).
+ */
+
+ RasterSize = ((RasterSize + 95) / 96) * 96;
+
+ m_pCompressor = new ModeJPEG (pSS, this, RasterSize, m_eCompressMode);
+ return m_pCompressor;
+}
+
+/*
+ * Function name: ParseError
+ *
+ * Owner: Darrell Walker
+ *
+ * Purpose: To determine what error state the printer is in.
+ *
+ * Called by: Send()
+ *
+ * Parameters on entry: status_reg is the contents of the centronics
+ * status register (at the time the error was
+ * detected)
+ *
+ * Parameters on exit: unchanged
+ *
+ * Return Values: The proper DISPLAY_STATUS to reflect the printer
+ * error state.
+ *
+ */
+DISPLAY_STATUS LJJetReady::ParseError(BYTE status_reg)
+{
+ DBG1("LJJetReady: parsing error info\n");
+
+ DRIVER_ERROR err = NO_ERROR;
+ BYTE szReadBuff[256];
+ DWORD iReadCount = 256;
+ DISPLAY_STATUS eStatus = (DISPLAY_STATUS) status_reg;
+ char *tmpStr;
+ int iErrorCode;
+
+ if (!IOMode.bDevID)
+ return eStatus;
+
+ memset (szReadBuff, 0, 256);
+ err = pSS->FromDevice (szReadBuff, &iReadCount);
+ if (err == NO_ERROR && iReadCount == 0)
+ return eStatus;
+
+ if (strstr ((char *) szReadBuff, "JOB"))
+ {
+ if (!(tmpStr = strstr ((char *) szReadBuff, "NAME")))
+ return DISPLAY_PRINTING;
+ tmpStr += 6;
+ while (*tmpStr < '0' || *tmpStr > '9')
+ tmpStr++;
+ sscanf (tmpStr, "%d", &iErrorCode);
+ if (iErrorCode != (long) (this))
+ return DISPLAY_PRINTING;
+ }
+
+ if (strstr ((char *) szReadBuff, "END"))
+ {
+ return DISPLAY_PRINTING_COMPLETE;
+ }
+
+
+ if (strstr ((char *) szReadBuff, "CANCEL"))
+ return DISPLAY_PRINTING_CANCELED;
+
+ if (!(tmpStr = strstr ((char *) szReadBuff, "CODE")))
+ return eStatus;
+
+ tmpStr += 4;
+ while (*tmpStr < '0' || *tmpStr > '9')
+ tmpStr++;
+ sscanf (tmpStr, "%d", &iErrorCode);
+
+ if (iErrorCode < 32000)
+ return DISPLAY_PRINTING;
+
+ if (iErrorCode == 40010 || iErrorCode == 40020)
+ return DISPLAY_NO_PENS; // Actually, out of toner
+
+ if (iErrorCode == 40021)
+ return DISPLAY_TOP_COVER_OPEN;
+
+ if ((iErrorCode / 100) == 419)
+ return DISPLAY_OUT_OF_PAPER;
+
+ if ((iErrorCode / 1000) == 42 || iErrorCode == 40022)
+ {
+ DBG1("Paper Jammed\n");
+ return DISPLAY_PAPER_JAMMED;
+ }
+
+ if (iErrorCode > 40049 && iErrorCode < 41000)
+ {
+ DBG1("IO trap\n");
+ return DISPLAY_ERROR_TRAP;
+ }
+
+ if (iErrorCode == 40079)
+ return DISPLAY_OFFLINE;
+
+ return DISPLAY_ERROR_TRAP;
+}
+
+BYTE * ModeJPEG::fpJPEGBuffer = NULL; // image buffer
+DWORD ModeJPEG::fJPEGBufferPos; // position of 1'st empty byte in image buffer
+
+void ModeJPEG::jpeg_flush_output_buffer_callback(JOCTET *outbuf, BYTE* buffer, DWORD size)
+{
+ fJPEGBufferPos += size;
+ memcpy (fpJPEGBuffer, buffer, size);
+ fpJPEGBuffer += size;
+}
+
+//----------------------------------------------------------------
+// These are "overrides" to the JPEG library error routines
+//----------------------------------------------------------------
+static void Gjpeg_error (j_common_ptr cinfo)
+{
+ // The standard behavior is to send a message to stderr.
+}
+/*
+void ModeJPEG::SetBuffer(BYTE * pJPEGBuffer)
+{
+ fpJPEGBuffer = pJPEGBuffer;
+}
+*/
+DWORD ModeJPEG::GetJPEGBufferSize() const
+{
+ return fJPEGBufferPos;
+}
+
+/*
+BYTE* ModeJPEG::GetBuffer()
+{
+ return fpJPEGBuffer;
+}
+*/
+
+extern "C"
+{
+void jpeg_buffer_dest (j_compress_ptr cinfo, JOCTET* outbuff, void* flush_output_buffer_callback);
+void hp_rgb_ycc_setup (int iFlag);
+}
+
+#define ConvertToGrayMacro(red, green, blue) ((unsigned char)( ( (red * 30) + (green * 59) + (blue * 11) ) / 100 ))
+
+//--------------------------------------------------------------------
+// Function: ModeJPEG::ModeJPEG
+//
+// Release: [PROTO4_1]
+//
+// Description: Preferred ctor
+//
+// Input: padMultiple - the fBufferDataLength returned from
+// GetRow must be divisible by this value.
+//
+// Modifies: fpBuffer
+//
+// Precond: None
+//
+// Postcond: None
+//
+// Returns: None
+//
+// Created: 11/07/96 cal
+// Last Modified: 5/020/01 DG
+//--------------------------------------------------------------------
+ModeJPEG::ModeJPEG
+(
+ SystemServices* pSys,
+ Printer* pPrinter,
+ unsigned int PlaneSize,
+ COMPRESS_MODE eCompressMode
+) :
+ Compressor(pSys, PlaneSize, TRUE),
+ thePrinter(pPrinter) // needed by Flush
+{
+ if (constructor_error != NO_ERROR) // if error in base constructor
+ {
+ return;
+ }
+ fpJPEGBuffer = NULL; // image buffer
+ fJPEGBufferPos = 0; // position of 1'st empty byte in image buffer
+ fpJPEGStart = NULL;
+
+ m_SourceBitmap.pvBits = (BYTE*) new BYTE[(inputsize * MOJAVE_STRIP_HEIGHT)];
+
+ if (m_SourceBitmap.pvBits == NULL)
+ {
+ constructor_error = ALLOCMEM_ERROR;
+ }
+ else
+ {
+ memset (m_SourceBitmap.pvBits, 0xFF, inputsize * MOJAVE_STRIP_HEIGHT);
+ }
+ m_SourceBitmap.cjBits = 0;
+ m_SourceBitmap.bitmapInfo.bmiHeader.biWidth = 0;
+ m_SourceBitmap.bitmapInfo.bmiHeader.biHeight = 0;
+
+
+ m_DestBitmap.pvBits = NULL;
+ m_DestBitmap.cjBits = 0;
+ m_DestBitmap.bitmapInfo.bmiHeader.biWidth = 0;
+ m_DestBitmap.bitmapInfo.bmiHeader.biHeight = 0;
+
+ m_lCurrCDRasterRow = 0;
+ m_lPrinterRasterRow = 0;
+
+ m_iRasterWidth = inputsize / 3;
+
+ iRastersReady = 0;
+
+ compressBuf = NULL;
+ m_eCompressMode = eCompressMode;
+
+} // ModeJPEG::ModeJPEG
+
+
+//--------------------------------------------------------------------
+// Function: ModeJPEG::~ModeJPEG
+//
+// Release: [PROTO4_1]
+//
+// Description: Destructor.
+//
+// Input: None
+//
+// Modifies: fpBuffer - deletes the buffer
+// ?? - deletes other buffer(s)??
+//
+// Precond: None
+//
+// Postcond: None
+//
+// Returns: None
+//
+// Created: 11/07/96 cal
+// Last Modified: 5/020/01 DG
+//--------------------------------------------------------------------
+ModeJPEG::~ModeJPEG ()
+{
+ if (m_SourceBitmap.pvBits)
+ {
+ delete m_SourceBitmap.pvBits;
+ m_SourceBitmap.pvBits = NULL;
+ }
+
+ if (m_DestBitmap.pvBits)
+ {
+ delete m_DestBitmap.pvBits;
+ m_DestBitmap.pvBits = NULL;
+ }
+
+} // ModeJPEG::~ModeJPEG
+
+/*
+ * JetReady specs require that data be sent for the whole page. When input data
+ * does not cover the whole page, send white rasters to cover the rest of the
+ * page.
+ */
+
+DRIVER_ERROR ModeJPEG::SendWhiteStrips (int iPageHeight, BOOL bGray)
+{
+ DRIVER_ERROR err = NO_ERROR;
+ HPLJBITMAP hWhiteBitmap;
+ QTABLEINFO qTableInfo;
+ RASTERDATA whiteRaster;
+
+ qTableInfo.qFactor = 6;
+
+ hWhiteBitmap.pvBits = NULL;
+
+ if (bGray)
+ {
+ m_SourceBitmap.cjBits = m_iRasterWidth * MOJAVE_STRIP_HEIGHT;
+ memset (m_SourceBitmap.pvBits, 0x00, m_SourceBitmap.cjBits);
+ }
+ else
+ {
+ m_SourceBitmap.cjBits = m_iRasterWidth * MOJAVE_STRIP_HEIGHT * 3;
+ memset (m_SourceBitmap.pvBits, 0xFF, m_SourceBitmap.cjBits);
+ }
+ memset(&m_SourceBitmap.bitmapInfo.bmiHeader, 0, sizeof(HPBITMAPINFOHEADER));
+ m_SourceBitmap.bitmapInfo.bmiHeader.biWidth = m_iRasterWidth;
+ m_SourceBitmap.bitmapInfo.bmiHeader.biHeight = MOJAVE_STRIP_HEIGHT;
+ m_SourceBitmap.bitmapInfo.bmiHeader.biSizeImage = m_SourceBitmap.cjBits;
+ m_SourceBitmap.bitmapInfo.bmiHeader.biBitCount = 8;
+ Compress (&m_SourceBitmap, &m_DestBitmap, &qTableInfo, bGray);
+ whiteRaster.rastersize[COLORTYPE_COLOR] = m_DestBitmap.cjBits;
+ whiteRaster.rasterdata[COLORTYPE_COLOR] = m_DestBitmap.pvBits;
+ while (m_lPrinterRasterRow < iPageHeight)
+ {
+ thePrinter->Encapsulate (&whiteRaster, TRUE);
+ m_lPrinterRasterRow += MOJAVE_STRIP_HEIGHT;
+ }
+
+ return err;
+}
+
+BOOL ModeJPEG::Compress( HPLJBITMAP *pSrcBitmap,
+ HPLJBITMAP *pTrgBitmap,
+ QTABLEINFO *pQTable,
+ BOOL bGrayscaleSet
+ )
+
+{
+#ifdef HAVE_LIBDL
+ if (HPLJJRCompress && m_eCompressMode == COMPRESS_MODE_LJ)
+ {
+ int iRet;
+ memcpy (pTrgBitmap, pSrcBitmap, sizeof (HPLJBITMAP));
+ pTrgBitmap->pvBits = new BYTE[pSrcBitmap->bitmapInfo.bmiHeader.biWidth * pSrcBitmap->bitmapInfo.bmiHeader.biHeight * 3];
+ if (pTrgBitmap->pvBits == NULL)
+ {
+ return FALSE;
+ }
+ if (bGrayscaleSet)
+ {
+ BYTE *p = pSrcBitmap->pvBits;
+ for (int j = 0; j < pSrcBitmap->bitmapInfo.bmiHeader.biHeight; j++)
+ {
+ for (int i = 0; i < pSrcBitmap->bitmapInfo.bmiHeader.biWidth; i++)
+ {
+ p[0] = ConvertToGrayMacro (p[0], p[1], p[2]);
+ p[1] = p[2] = 0;
+ p += 3;
+ }
+ }
+ }
+ iRet = HPLJJRCompress (pTrgBitmap->pvBits, (uint32_t *) &pTrgBitmap->cjBits, pSrcBitmap->pvBits,
+ pSrcBitmap->bitmapInfo.bmiHeader.biWidth, pSrcBitmap->bitmapInfo.bmiHeader.biHeight);
+ if (iRet < 0)
+ return FALSE;
+ return TRUE;
+ }
+#endif // HAVE_LIBDL
+
+#ifdef JPEG_FILE_OUTPUT
+ static int ifilecount = 0;
+ char szFileName [256];
+ sprintf(szFileName,"C:\\Temp\\compressed%03d",ifilecount++);
+ strcat(szFileName,".jpg");
+ FILE *pFile = fopen(szFileName, "w+b");
+#endif
+
+ fJPEGBufferPos = 0;
+
+ hp_rgb_ycc_setup (1); // Use modified Mojave CSC table
+
+ //----------------------------------------------------------------
+ // Setup for compression
+ //----------------------------------------------------------------
+
+ //----------------------------------------------------------------
+ // JPEG Lib Step 1: Allocate and initialize JPEG compression object
+ //----------------------------------------------------------------
+ cinfo.err = jpeg_std_error( &jerr );
+
+ //Fix the error handler to return when an error occurs,
+ //the default exit()s which is nasty for a driver to do.
+ jerr.error_exit = Gjpeg_error;
+ //Set the return jump address. This must be done now since
+ // jpeg_create_compress could cause an error.
+ if (setjmp(setjmp_buffer)) {
+
+ // If we get here, the JPEG code has signaled an error.
+ //* We need to clean up the JPEG object, and return.
+
+ jpeg_destroy_compress(&cinfo);
+ return FALSE;
+ }
+
+ jpeg_create_compress( &cinfo );
+
+ //----------------------------------------------------------------
+ // JPEG Lib Step 2: Specify the destination for the compressed data
+ // For our purposes we need to replace the "data destination" module
+ // with one that uses the JPEG library's I/O suspension mode.
+ // The buffer pointer and free space are updated each time GetNextRow
+ // is called; so only the function pointers are set here.
+ //----------------------------------------------------------------
+
+ //----------------------------------------------------------------
+ // JPEG Lib Step 3: Set parameters for compression, including image size & colorspace
+ //----------------------------------------------------------------
+
+ int iColorsUsed;
+
+ if(bGrayscaleSet)
+ {
+ cinfo.in_color_space = JCS_GRAYSCALE;
+ iColorsUsed = 1;
+ }
+ else
+ {
+ cinfo.in_color_space = JCS_RGB; // arbitrary guess
+ iColorsUsed = 3;
+ }
+ jpeg_set_defaults( &cinfo );
+
+ cinfo.image_width = pSrcBitmap->bitmapInfo.bmiHeader.biWidth;
+ cinfo.image_height = pSrcBitmap->bitmapInfo.bmiHeader.biHeight;
+ cinfo.input_components = iColorsUsed; //change if bit depths others than 24bpp are ever needed
+ cinfo.data_precision = 8;
+
+ //
+ // Create a static quant table here.
+ //
+ static unsigned int mojave_quant_table1[64] = { 2,3,4,5,5,5,5,5,
+ 3,6,5,8,5,8,5,8,
+ 4,5,5,5,5,5,5,5,
+ 5,8,5,8,5,8,5,8,
+ 5,5,5,5,5,5,5,5,
+ 5,8,5,8,5,8,5,8,
+ 5,5,5,5,5,5,5,5,
+ 5,8,5,8,5,8,5,8 };
+ //
+ // Use this variable for representing the scale_factor for now.
+ //
+ unsigned int iScaleFactor = pQTable->qFactor;
+
+ //
+ // JetReady specific Q-Tables will be added here. We do the following:
+ // 1. Add three Q-Tables.
+ // 2. Scale the Q-Table elemets with the given scale factor.
+ // 3. Check to see if any of the element is in the table is greater than 255
+ // reset that elemet to 255.
+ // 5. There is a specific scaling need to be done to the first 6
+ // elements in the matrix. This required to achieve the better
+ // compression ratio.
+ // 4. Check to see if any the of recently modified element is
+ // greater than 255, reset that with 255.
+ // Following for loop implements the above logic.
+ //
+ // Please refer to sRGBLaserHostBasedSoftwareERS.doc v9.0 section 5.2.5.3.1.1
+ // for more details.
+ //
+ // [NOTE] These loop needs to be further optimized.
+ //
+ for (int i = 0; i < 3; i++)
+ {
+ //
+ // Adding Q-Table.
+ //
+ jpeg_add_quant_table(&cinfo, i, mojave_quant_table1, 0, FALSE );
+ //
+ // Scaling the Q-Table elements.
+ // Reset the element to 255, if it is greater than 255.
+ //
+ for(int j = 1; j < 64; j++)
+ {
+ cinfo.quant_tbl_ptrs[i]->quantval[j] = (UINT16)((mojave_quant_table1[j] * iScaleFactor) & 0xFF);
+
+ } // for (int j = 1; j < 64; j++)
+ //
+ // Special scaling for first 6 elements in the table.
+ // Reset the specially scaled elements 255, if it is greater than 255.
+ //
+
+ //
+ // 1st component in the table. Unchanged, I need not change anything here.
+ //
+ cinfo.quant_tbl_ptrs[i]->quantval[0] = (UINT16)mojave_quant_table1[0];
+
+ //
+ // 2nd and 3rd components in the zig zag order
+ //
+ // The following dTemp is being used to ceil the vales: e.g 28.5 to 29
+ //
+ double dTemp = mojave_quant_table1[1] * (1 + 0.25 * (iScaleFactor - 1)) + 0.5;
+ cinfo.quant_tbl_ptrs[i]->quantval[1] = (UINT16)dTemp & 0xFF;
+
+ dTemp = mojave_quant_table1[8] * (1 + 0.25 * (iScaleFactor - 1)) + 0.5;
+ cinfo.quant_tbl_ptrs[i]->quantval[8] = (UINT16)dTemp & 0xFF;
+
+ //
+ // 4th, 5th and 6th components in the zig zag order
+ //
+ dTemp = mojave_quant_table1[16] * (1 + 0.50 * (iScaleFactor - 1)) + 0.5;
+ cinfo.quant_tbl_ptrs[i]->quantval[16] = (UINT16)dTemp & 0xFF;
+
+ dTemp = mojave_quant_table1[9] * (1 + 0.50 * (iScaleFactor - 1)) + 0.5;
+ cinfo.quant_tbl_ptrs[i]->quantval[9] = (UINT16)dTemp & 0xFF;
+
+ dTemp = mojave_quant_table1[2] * (1 + 0.50 * (iScaleFactor - 1)) + 0.5;
+ cinfo.quant_tbl_ptrs[i]->quantval[2] = (UINT16)dTemp & 0xFF;
+ } // for (i = 0; i < 3; i++)
+
+ //
+ // Hard code to use sampling mode 4:4:4
+ //
+ cinfo.comp_info[0].h_samp_factor = 1;
+ cinfo.comp_info[0].v_samp_factor = 1;
+
+ // Specify data destination for compression
+ fpJPEGBuffer = new BYTE[cinfo.image_width * cinfo.image_height * iColorsUsed]; //3 bytes for 24 bpp
+ if (NULL == fpJPEGBuffer)
+ {
+ //ERR(("JPEGCompress: Not enough memory\n"));
+ return FALSE;
+ }
+
+ fpJPEGStart = fpJPEGBuffer;
+
+ jpeg_buffer_dest(&cinfo, (JOCTET *) fpJPEGBuffer, (void*) (ModeJPEG::jpeg_flush_output_buffer_callback));
+ if(bGrayscaleSet)
+ {
+ cinfo.write_JFIF_header =
+ cinfo.write_Adobe_marker = FALSE;
+ jpeg_suppress_tables(&cinfo, TRUE);
+ }
+
+ //----------------------------------------------------------------
+ // JPEG Lib Step 4: Start the compression cycle
+ // set destination to table file
+ // jpeg_write_tables(cinfo);
+ // set destination to image file
+ // jpeg_start_compress(cinfo, FALSE);
+ //----------------------------------------------------------------
+
+ jpeg_start_compress( &cinfo, TRUE );
+
+
+ //----------------------------------------------------------------
+ // This completes the JPEG setup.
+ //----------------------------------------------------------------
+
+
+ // do the jpeg compression
+ JSAMPROW pRowArray[1];
+ BYTE* pCurLine = (BYTE*) pSrcBitmap->pvBits;
+ DWORD dwScanLine;
+
+ dwScanLine = cinfo.image_width * iColorsUsed;
+
+ for(unsigned int nrow = 0; nrow < cinfo.image_height; nrow++)
+ {
+ pRowArray[0] = (JSAMPROW) pCurLine;
+ jpeg_write_scanlines(&cinfo, pRowArray, 1);
+ pCurLine += dwScanLine;
+ }
+
+ //----------------------------------------------------------------
+ // JPEG Lib Step 6: Finish compression
+ //----------------------------------------------------------------
+ // Tell the compressor about the extra buffer space for the trailer
+ jpeg_finish_compress( &cinfo );
+
+ //
+ // Read the quantization tables used for the compression.
+ //
+
+ if (cinfo.quant_tbl_ptrs[0] != NULL)
+ {
+ for (int iI = 0; iI < QTABLE_SIZE; iI++)
+ {
+ pQTable->qtable0[iI] = (DWORD)cinfo.quant_tbl_ptrs[0]->quantval[iI];
+ }
+
+ }
+
+ if (cinfo.quant_tbl_ptrs[1] != NULL)
+ {
+ for (int iI = 0; iI < QTABLE_SIZE; iI++)
+ {
+ pQTable->qtable1[iI] = (DWORD)cinfo.quant_tbl_ptrs[1]->quantval[iI];
+ }
+ }
+
+ if (cinfo.quant_tbl_ptrs[2] != NULL)
+ {
+ for (int iI = 0; iI < QTABLE_SIZE; iI++)
+ {
+ pQTable->qtable2[iI] = (DWORD)cinfo.quant_tbl_ptrs[2]->quantval[iI];
+ }
+ }
+
+
+ //----------------------------------------------------------------
+ // JPEG Lib Step 7: Destroy the compression object
+ //----------------------------------------------------------------
+ jpeg_destroy_compress( &cinfo );
+
+ memcpy(pTrgBitmap, pSrcBitmap, sizeof(HPLJBITMAP));
+
+#ifdef JPEG_FILE_OUTPUT
+ fwrite(fpJPEGStart, sizeof(BYTE), GetJPEGBufferSize(), pFile);
+#endif
+ //
+ if(fpJPEGStart && bGrayscaleSet)
+ {
+ long lBufferSize = GetJPEGBufferSize();
+ long l = 0;
+ while (l < lBufferSize)
+ {
+ if(fpJPEGStart[l] == 0xFF && fpJPEGStart[l+1] == 0xDA)
+ break;
+ l++;
+ }
+ if(l != lBufferSize)
+ {
+ memcpy (fpJPEGStart, fpJPEGStart + l + 10, lBufferSize - l - 10);
+ memset (fpJPEGStart + lBufferSize - l - 10, 0xFF, l + 10);
+ pTrgBitmap->cjBits = lBufferSize - l - 10;
+ pTrgBitmap->pvBits = (BYTE*)fpJPEGStart;
+ }
+ else
+ {
+ pTrgBitmap->pvBits = (BYTE*)fpJPEGStart;
+ }
+ }
+ else
+ {
+ pTrgBitmap->pvBits = (BYTE*) fpJPEGStart;
+ pTrgBitmap->cjBits = GetJPEGBufferSize();
+ }
+
+#ifdef JPEG_FILE_OUTPUT
+ fclose(pFile);
+#endif
+
+ return TRUE;
+
+}
+
+BOOL ModeJPEG::Process
+(
+ RASTERDATA* input
+)
+{
+ DRIVER_ERROR err = NO_ERROR;
+
+ if (input==NULL ||
+ (input->rasterdata[COLORTYPE_COLOR]==NULL && input->rasterdata[COLORTYPE_BLACK]==NULL)) // flushing pipeline
+ {
+ return FALSE;
+ }
+ if (input->rasterdata[COLORTYPE_COLOR])
+ {
+ if (m_lCurrCDRasterRow < MOJAVE_STRIP_HEIGHT )
+ {
+ //Copy the data to m_SourceBitmap
+ memcpy(m_SourceBitmap.pvBits + m_lCurrCDRasterRow * inputsize, input->rasterdata[COLORTYPE_COLOR], input->rastersize[COLORTYPE_COLOR]);
+ m_lCurrCDRasterRow ++;
+ }
+
+ if (m_lCurrCDRasterRow == MOJAVE_STRIP_HEIGHT || ((LJJetReady*)thePrinter)->phLJJetReady->IsLastBand())
+ {
+ m_SourceBitmap.cjBits = inputsize * MOJAVE_STRIP_HEIGHT;
+ memset(&m_SourceBitmap.bitmapInfo.bmiHeader, 0, sizeof(HPBITMAPINFOHEADER));
+ m_SourceBitmap.bitmapInfo.bmiHeader.biWidth = inputsize / 3;
+ m_SourceBitmap.bitmapInfo.bmiHeader.biHeight = MOJAVE_STRIP_HEIGHT;
+
+ QTABLEINFO qTableInfo;
+ BOOL bGrayScaleSet = ((LJJetReady *)thePrinter)->bGrey_K;
+ BOOL bRet = TRUE;
+
+ qTableInfo.qFactor = 6;
+ if (((LJJetReady*)thePrinter)->m_bStartPageNotSent)
+ {
+ err = (((LJJetReady*)thePrinter)->phLJJetReady)->StartPage();
+ ((LJJetReady*)thePrinter)->m_bStartPageNotSent = FALSE;
+
+ char res[64];
+ //
+ // 0xC2 - unsigned 32 bit int
+ // 0x68704000 - begin image for the JetReady path - endin correct to 00 40 70 68
+ // 0xF8 - unsigned 8 bit attribute
+ // 0x91 - VUextension (a vendor unique attribute for JetReady)
+ // 0xC1 - Unsigned 16 bit int
+ err = thePrinter->Send ((const BYTE *)JrBeginImageSeq, sizeof(JrBeginImageSeq));
+ ERRCHECK;
+
+ unsigned short int sourcewidth = (unsigned short int) (inputsize / 3);
+ unsigned short int sourceheight = (unsigned short int)((((LJJetReady*)thePrinter)->phLJJetReady)->thePrintContext->PhysicalPageSizeY() * MOJAVE_RESOLUTION - 200);
+ if ( 0 != (sourceheight % MOJAVE_STRIP_HEIGHT) )
+ {
+ sourceheight = ( (sourceheight / MOJAVE_STRIP_HEIGHT) + 1) * MOJAVE_STRIP_HEIGHT;
+ }
+
+ //Write the source width to the printer;
+// err = thePrinter->Send ((const BYTE*)&sourcewidth, sizeof(unsigned short int));
+ res[0] = sourcewidth & 0x00FF;
+ res[1] = ((sourcewidth & 0xFF00) >> 8);
+ err = thePrinter->Send ((const BYTE *) res, 2);
+ ERRCHECK;
+ // 0xF8 - unsigned 8 bit attribute
+ // 0x6C - source width attribute
+ // 0xC1 - Unsigned 16 bit int
+ strcpy (res, "\xF8\x6C\xC1");
+ err = thePrinter->Send ((const BYTE *) res, strlen (res));
+ ERRCHECK;
+
+ //Write the source height to the printer
+// err = thePrinter->Send ((const BYTE*)&sourceheight, sizeof(unsigned short int));
+ res[0] = sourceheight & 0x00FF;
+ res[1] = ((sourceheight & 0xFF00) >> 8);
+ err = thePrinter->Send ((const BYTE *) res, 2);
+ ERRCHECK;
+ // 0xF8 - unsigned 8 bit attribute
+ // 0x6B - source height attribute
+ // 0xC1 - Unsigned 16 bit int
+ strcpy (res, "\xF8\x6B\xC1");
+ err = thePrinter->Send ((const BYTE *) res, strlen (res));
+ ERRCHECK;
+
+ unsigned short int stripcount = sourceheight / MOJAVE_STRIP_HEIGHT;
+ //stripcount = 4;
+// err = thePrinter->Send ((const BYTE *)&stripcount, sizeof(stripcount));
+ res[0] = stripcount & 0x00FF;
+ res[1] = ((stripcount & 0xFF00) >> 8);
+ err = thePrinter->Send ((const BYTE *) res, 2);
+ ERRCHECK;
+ //0xF8 - unsigned 8 bit attribute
+ //0x93 - special attribute 1 for strip count
+ //0xC1 - Unsigned 16 bit int
+ strcpy (res, "\xF8\x93\xC1");
+ err = thePrinter->Send ((const BYTE *) res, strlen (res));
+ //BYTE JrStripCountSeq[] = {0x32,0x00,0xF8,0x93,0xC1};
+ //err = thePrinter->Send ((const BYTE *)JrStripCountSeq, sizeof(JrStripCountSeq));
+ ERRCHECK;
+
+ // Write the MOJAVE_STRIP_HEIGHT value
+ //0xF8 - unsigned 8 bit attribute
+ //0x94 - special attribute 2 used for strip height
+ BYTE JrStripHeightSeq[] = {0x80,0x00,0xF8,0x94};
+ err = thePrinter->Send ((const BYTE *)JrStripHeightSeq, sizeof(JrStripHeightSeq));
+ ERRCHECK;
+
+ if (bGrayScaleSet)
+ {
+ // 0x00 indicates grayscale printing
+ BYTE JrGrayScaleSeq[] = {0xC0,0x00,0xF8,0x97};
+ err = thePrinter->Send ((const BYTE *)JrGrayScaleSeq, sizeof(JrGrayScaleSeq));
+ ERRCHECK;
+ }
+ else
+ {
+ // 0x04 indicates Color printing
+ BYTE JrColorSeq[] = {0xC0,0x04,0xF8,0x97};
+ err = thePrinter->Send ((const BYTE *)JrColorSeq, sizeof(JrColorSeq));
+ ERRCHECK;
+ }
+
+ // Interleaved Color Enumeration for Mojave
+ BYTE JrSeq[] = {0xC0,0x00,0xF8,0x98};
+ err = thePrinter->Send ((const BYTE *)JrSeq, sizeof(JrSeq));
+ ERRCHECK;
+
+ //0xC2 - unsigned 32 bit int
+ //0x00030000 - JetReady version number
+ //0xF8 - unsigned 8 bit attribute
+ //0x95 - JetReadyVersion attribute
+ err = thePrinter->Send ((const BYTE *)JrVU_ver_TagSeq, sizeof(JrVU_ver_TagSeq));
+ ERRCHECK;
+
+ // Send the JPEG statement for the sake of Dual Compression
+ // 0xC2 - unsigned 32 bit int
+ // VU DataLength - 824 bytes for jpeg header
+ // 0xF8 - unsigned 8 bit attribute
+ // 0x92 - VU data length
+ // 0x46 - vendor unique
+ BYTE JrDataLengthSeq[] = {0xC2,0x38,0x03,0x00,0x00,0xF8,0x92,0x46};
+#ifdef HAVE_LIBDL
+ if (HPLJJRCompress && m_eCompressMode == COMPRESS_MODE_LJ)
+ {
+ JrDataLengthSeq[1] = 0;
+ JrDataLengthSeq[2] = 0;
+ }
+#endif
+ err = thePrinter->Send ((const BYTE *)JrDataLengthSeq, sizeof(JrDataLengthSeq));
+ ERRCHECK;
+
+ bRet = Compress (&m_SourceBitmap,
+ &m_DestBitmap,
+ &qTableInfo,
+ FALSE // We are only worried about the qTables not about the colorspace.
+ );
+ if (!HPLJJRCompress || (HPLJJRCompress && m_eCompressMode != COMPRESS_MODE_LJ))
+ {
+
+ //VWritePrinter("\x00\x80\x00\x03\x00\x00", 0x6);
+ BYTE JrQTSeq[] = {0x00,0x80,0x00,0x03,0x00,0x00};
+ err = thePrinter->Send ((const BYTE *)JrQTSeq, sizeof(JrQTSeq));
+ ERRCHECK;
+
+#ifdef APDK_LITTLE_ENDIAN
+ //VWritePrinter((VOID*) pQTableInfo->qtable0, sizeof(DWORD) * QTABLE_SIZE);
+ err = thePrinter->Send ((const BYTE *)qTableInfo.qtable0, sizeof(DWORD) * QTABLE_SIZE);
+ ERRCHECK;
+
+
+ //VWritePrinter((VOID*) pQTableInfo->qtable1, sizeof(DWORD) * QTABLE_SIZE);
+ err = thePrinter->Send ((const BYTE *)qTableInfo.qtable1, sizeof(DWORD) * QTABLE_SIZE);
+ ERRCHECK;
+
+ //VWritePrinter((VOID*) pQTableInfo->qtable2, sizeof(DWORD) * QTABLE_SIZE);
+ err = thePrinter->Send ((const BYTE *)qTableInfo.qtable2, sizeof(DWORD) * QTABLE_SIZE);
+ ERRCHECK;
+#else
+ BYTE szStr[sizeof (DWORD) * QTABLE_SIZE * 3];
+ BYTE *p;
+ p = szStr;
+ for (int i = 0; i < QTABLE_SIZE; i++)
+ {
+ *p++ = qTableInfo.qtable0[i] & 0xFF;
+ *p++ = (qTableInfo.qtable0[i] >> 8) & 0xFF;
+ *p++ = (qTableInfo.qtable0[i] >> 16) & 0xFF;
+ *p++ = (qTableInfo.qtable0[i] >> 24) & 0xFF;
+ }
+ for (int i = 0; i < QTABLE_SIZE; i++)
+ {
+ *p++ = qTableInfo.qtable1[i] & 0xFF;
+ *p++ = (qTableInfo.qtable1[i] >> 8) & 0xFF;
+ *p++ = (qTableInfo.qtable1[i] >> 16) & 0xFF;
+ *p++ = (qTableInfo.qtable1[i] >> 24) & 0xFF;
+ }
+ for (int i = 0; i < QTABLE_SIZE; i++)
+ {
+ *p++ = qTableInfo.qtable2[i] & 0xFF;
+ *p++ = (qTableInfo.qtable2[i] >> 8) & 0xFF;
+ *p++ = (qTableInfo.qtable2[i] >> 16) & 0xFF;
+ *p++ = (qTableInfo.qtable2[i] >> 24) & 0xFF;
+ }
+ err = thePrinter->Send ((const BYTE *) szStr, 3 * sizeof (DWORD) * QTABLE_SIZE);
+ ERRCHECK;
+
+#endif
+ // Start of JPEG Control
+ // 0x8001 JPEG Control register
+ // size - unsigned 32 bit number 0x0000_002C
+ // 11 32 bit words total = 44 bytes
+ // Control one
+ // Color 0x6614_E001
+ // Mono 0x0000_E005
+ //
+ //VWritePrinter("\x01\x80\x2C\x00\x00\x00", 0x6);
+ BYTE JrCRSeq[] = {0x01,0x80,0x2C,0x00,0x00,0x00};
+ err = thePrinter->Send ((const BYTE *)JrCRSeq, sizeof(JrCRSeq));
+ ERRCHECK;
+
+ if (bGrayScaleSet)
+ {
+ //VWritePrinter("\x05\xE0\x00\x00", 0x4);
+ BYTE JrCR1GSeq[] = {0x05,0xE0,0x00,0x00};
+ err = thePrinter->Send ((const BYTE *)JrCR1GSeq, sizeof(JrCR1GSeq));
+ ERRCHECK;
+ }
+ else
+ {
+ //VWritePrinter("\x01\xE0\x14\x66", 0x4);
+ BYTE JrCR1CSeq[] = {0x01,0xE0,0x14,0x66};
+ err = thePrinter->Send ((const BYTE *)JrCR1CSeq, sizeof(JrCR1CSeq));
+ ERRCHECK;
+ }
+
+ //
+ // Control three
+ // Color 0x0000_0001
+ // Mono 0x0000_0000
+ // bit 0 = convert rgb data
+ // bit 1: 0 = 13 bit precision
+ // 1 = 14 bit precision
+ //
+ if (bGrayScaleSet)
+ {
+ //VWritePrinter("\x00\x00\x00\x00", 0x4);
+ BYTE JrCR3GSeq[] = {0x00,0x00,0x00,0x00};
+
+ err = thePrinter->Send ((const BYTE *)JrCR3GSeq, sizeof(JrCR3GSeq));
+ ERRCHECK;
+ }
+ else
+ {
+ //VWritePrinter("\x01\x00\x00\x00", 0x4);
+ BYTE JrCR3CSeq[] = {0x01,0x00,0x00,0x00};
+ err = thePrinter->Send ((const BYTE *)JrCR3CSeq, sizeof(JrCR3CSeq));
+ ERRCHECK;
+ }
+
+ //
+ // CSC matrix
+ // 11 12 13 2.0 0.0 0.0
+ // 21 22 23 2.0 -2.0 0.0
+ // 31 32 33 2.0 0.0 -2.0
+
+ // Decompression matrix
+ //VWritePrinter("\x00\x20\x00\x00", 0x4);
+ BYTE JrCSC1Seq[] = {0x00,0x20,0x00,0x00};
+ err = thePrinter->Send ((const BYTE *)JrCSC1Seq, sizeof(JrCSC1Seq));
+ ERRCHECK;
+
+ //VWritePrinter("\x00\x00\x00\x00", 0x4);
+ BYTE JrCSC2Seq[] = {0x00,0x00,0x00,0x00};
+ err = thePrinter->Send ((const BYTE *)JrCSC2Seq, sizeof(JrCSC2Seq));
+ ERRCHECK;
+
+ //VWritePrinter("\x00\x00\x00\x00", 0x4);
+ BYTE JrCSC3Seq[] = {0x00,0x00,0x00,0x00};
+ err = thePrinter->Send ((const BYTE *)JrCSC3Seq, sizeof(JrCSC3Seq));
+ ERRCHECK;
+
+ //VWritePrinter("\x00\x20\x00\x00", 0x4);
+ BYTE JrCSC4Seq[] = {0x00,0x20,0x00,0x00};
+ err = thePrinter->Send ((const BYTE *)JrCSC4Seq, sizeof(JrCSC4Seq));
+ ERRCHECK;
+
+ //VWritePrinter("\x00\xE0\x00\x00", 0x4);
+ BYTE JrCSC5Seq[] = {0x00,0xE0,0x00,0x00};
+ err = thePrinter->Send ((const BYTE *)JrCSC5Seq, sizeof(JrCSC5Seq));
+ ERRCHECK;
+
+ //VWritePrinter("\x00\x00\x00\x00", 0x4);
+ BYTE JrCSC6Seq[] = {0x00,0x00,0x00,0x00};
+ err = thePrinter->Send ((const BYTE *)JrCSC6Seq, sizeof(JrCSC6Seq));
+ ERRCHECK;
+
+ //VWritePrinter("\x00\x20\x00\x00", 0x4);
+ BYTE JrCSC7Seq[] = {0x00,0x20,0x00,0x00};
+ err = thePrinter->Send ((const BYTE *)JrCSC7Seq, sizeof(JrCSC7Seq));
+ ERRCHECK;
+
+ //VWritePrinter("\x00\x00\x00\x00", 0x4);
+ BYTE JrCSC8Seq[] = {0x00,0x00,0x00,0x00};
+ err = thePrinter->Send ((const BYTE *)JrCSC8Seq, sizeof(JrCSC8Seq));
+ ERRCHECK;
+
+ //VWritePrinter("\x00\xE0\x00\x00", 0x4);
+ BYTE JrCSC9Seq[] = {0x00,0xE0,0x00,0x00};
+ err = thePrinter->Send ((const BYTE *)JrCSC9Seq, sizeof(JrCSC9Seq));
+ ERRCHECK;
+ } // if (!HPLJJRCompress)
+ } // if (....bStartPageNotSent)
+
+
+ BYTE *pbTemp;
+ HPLJBITMAP jpegGrayBitmap;
+
+ jpegGrayBitmap.pvBits = NULL;
+ //
+ // Convert 24bpp Gray to 8bpp Gray.
+ // JPEG takes K 8bpp gray data. We are using two different buffers for these.
+ //
+ if(bGrayScaleSet && m_eCompressMode == COMPRESS_MODE_JPEG)
+ {
+ pbTemp = (BYTE*)m_SourceBitmap.pvBits;
+
+ jpegGrayBitmap.pvBits = new BYTE[m_SourceBitmap.cjBits / 3];
+
+ for(long i = 0, j=0; i < (long)m_SourceBitmap.cjBits; i += 3, j++)
+ {
+ pbTemp[i] = ConvertToGrayMacro(pbTemp[i], pbTemp[i + 1], pbTemp[i + 2] );
+ pbTemp[i] = 255 - pbTemp[i];
+ pbTemp[i + 1] = pbTemp[i];
+ pbTemp[i + 2] = pbTemp[i];
+
+ jpegGrayBitmap.pvBits[j] = pbTemp[i];
+ }
+ }
+
+ if (m_DestBitmap.pvBits)
+ {
+ delete m_DestBitmap.pvBits;
+ m_DestBitmap.pvBits = NULL;
+ }
+ //
+ // JPEG grayscale specific operations are done here.
+ //
+ if(bGrayScaleSet && m_eCompressMode == COMPRESS_MODE_JPEG)
+ {
+ jpegGrayBitmap.cjBits = m_SourceBitmap.cjBits / 3;
+ jpegGrayBitmap.bitmapInfo.bmiHeader.biSizeImage = m_SourceBitmap.bitmapInfo.bmiHeader.biSizeImage / 3;
+ jpegGrayBitmap.bitmapInfo.bmiHeader.biBitCount = 8;
+ jpegGrayBitmap.bitmapInfo.bmiHeader.biWidth = m_SourceBitmap.bitmapInfo.bmiHeader.biWidth;
+ jpegGrayBitmap.bitmapInfo.bmiHeader.biHeight = m_SourceBitmap.bitmapInfo.bmiHeader.biHeight;
+ }
+ if (bGrayScaleSet && m_eCompressMode == COMPRESS_MODE_JPEG)
+ {
+ bRet = Compress (&jpegGrayBitmap, &m_DestBitmap, &qTableInfo,bGrayScaleSet);
+ }
+ else
+ {
+ bRet = Compress (&m_SourceBitmap, &m_DestBitmap, &qTableInfo,bGrayScaleSet);
+ }
+
+ m_SourceBitmap.cjBits = 0;
+ m_SourceBitmap.bitmapInfo.bmiHeader.biWidth = 0;
+ m_SourceBitmap.bitmapInfo.bmiHeader.biHeight = 0;
+
+ memset(m_SourceBitmap.pvBits, 0xFF, inputsize * MOJAVE_STRIP_HEIGHT);
+
+ if (jpegGrayBitmap.pvBits)
+ {
+ delete jpegGrayBitmap.pvBits;
+ jpegGrayBitmap.pvBits = NULL;
+ }
+ m_lPrinterRasterRow += MOJAVE_STRIP_HEIGHT;
+
+ m_lCurrCDRasterRow = 0;
+ iRastersReady = 1;
+
+ ((LJJetReady*)thePrinter)->phLJJetReady->SetLastBand(FALSE);
+ }
+ else
+ {
+ return FALSE;
+ }
+ }
+
+ return TRUE;
+} //Process
+
+BYTE* ModeJPEG::NextOutputRaster(COLORTYPE color)
+// since we return 1-for-1, just return result first call
+{
+ if (iRastersReady==0)
+ return (BYTE*)NULL;
+
+ if (color == COLORTYPE_BLACK)
+ {
+ return (BYTE*)NULL;
+ }
+ else
+ {
+ iRastersReady=0;
+ return m_DestBitmap.pvBits;
+ }
+}
+
+unsigned int ModeJPEG::GetOutputWidth(COLORTYPE color)
+{
+ if (color == COLORTYPE_COLOR)
+ {
+ return m_DestBitmap.cjBits;
+ }
+ else
+ {
+ return 0;
+ }
+} //GetOutputWidth
+
+APDK_END_NAMESPACE
+
+#endif // defined APDK_LJJetReady
diff --git a/prnt/hpijs/ljjetready.h b/prnt/hpijs/ljjetready.h
new file mode 100644
index 0000000..5390ab9
--- /dev/null
+++ b/prnt/hpijs/ljjetready.h
@@ -0,0 +1,252 @@
+/*****************************************************************************\
+ LJJetReady.h : Interface for the LJJetReady class
+
+ Copyright (c) 1996 - 2008, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#ifndef APDK_LJJETREADY_H
+#define APDK_LJJETREADY_H
+
+#ifdef APDK_LJJETREADY
+
+#include <setjmp.h>
+
+extern "C"
+{
+#include "jpeglib.h"
+}
+
+APDK_BEGIN_NAMESPACE
+/*!
+\internal
+*/
+
+enum COMPRESS_MODE { COMPRESS_MODE0 = 0,
+ COMPRESS_MODE2 = 2,
+ COMPRESS_MODE9 = 9,
+ COMPRESS_MODE_AUTO = 10,
+ COMPRESS_MODE_JPEG = 11,
+ COMPRESS_MODE_LJ = 12,
+ COMPRESS_MODE_GRAFIT = 16
+ };
+
+class LJJetReady : public Printer
+{
+public:
+ LJJetReady (SystemServices* pSS,int numfonts=0, BOOL proto=FALSE);
+ ~LJJetReady ();
+
+ virtual Header* SelectHeader (PrintContext* pc);
+ virtual DRIVER_ERROR VerifyPenInfo ();
+ virtual DRIVER_ERROR ParsePenInfo (PEN_TYPE& ePen, BOOL QueryPrinter=TRUE);
+ virtual DISPLAY_STATUS ParseError (BYTE status_reg);
+ inline virtual BOOL SupportSeparateBlack() {return FALSE;}
+ virtual DRIVER_ERROR Flush (int FlushSize)
+ {
+ return NO_ERROR;
+ }
+
+ virtual BOOL GetMargins (PAPER_SIZE ps, float *fMargins)
+ {
+ fMargins[0] = (float) 0.1667;
+ fMargins[1] = (float) 0.1667;
+ fMargins[2] = (float) 0.1667;
+ fMargins[3] = (float) 0.1667;
+ return TRUE;
+ }
+
+ virtual BOOL UseCMYK (unsigned int iPrintMode) { return FALSE;}
+ virtual DRIVER_ERROR Encapsulate (const RASTERDATA* InputRaster, BOOL bLastPlane);
+
+// See comments in ljmono.h for an explanation.
+
+ virtual BOOL HagakiFeedDuplexerPresent (BOOL bQueryPrinter)
+ {
+ return TRUE;
+ }
+ virtual BOOL SupportSeparateBlack (PrintMode *pCurrentMode)
+ {
+ return FALSE;
+ }
+
+
+ Compressor* CreateCompressor (unsigned int RasterSize);
+ Compressor* GetCompressor() { return m_pCompressor; }
+ BOOL bFGColorSet;
+ BOOL bGrey_K;
+ int m_iYPos;
+ bool m_bStartPageNotSent;
+ HeaderLJJetReady *phLJJetReady;
+
+protected:
+
+#ifdef APDK_HP_UX
+ virtual LJJetReady & operator = (Printer& rhs)
+ {
+ return *this;
+ }
+#endif
+
+ virtual DATA_FORMAT GetDataFormat() { return RASTER_STRIP; }
+ BOOL m_bJobStarted;
+ int m_iYResolution;
+ Compressor *m_pCompressor;
+ PrintContext *thePrintContext;
+#ifdef HAVE_LIBDL
+ void *m_hHPLibHandle;
+#endif
+ COMPRESS_MODE m_eCompressMode;
+
+}; // LJJetReady
+
+class LJJetReadyNormalMode : public PrintMode
+{
+public:
+ LJJetReadyNormalMode ();
+}; // LJJetReadyNormalMode
+
+class LJJetReadyBestColorMode : public PrintMode
+{
+public:
+ LJJetReadyBestColorMode ();
+}; // LJJetReadyBestColorMode
+
+class LJJetReadyGrayMode : public PrintMode
+{
+public:
+ LJJetReadyGrayMode ();
+}; // LJJetReadyGrayMode
+
+class LJJetReadyBestGrayMode : public PrintMode
+{
+public:
+ LJJetReadyBestGrayMode ();
+}; // LJJetReadyBestGrayMode
+
+/*!
+\internal
+*/
+
+const int JPEG_HEADER_SIZE = 600; //As recommended by JPEG Library Docs
+const int JPEG_TRAILER_SIZE = 100; //As recommended by JPEG Library Docs
+
+const int QTABLE_SIZE = 64;
+struct QTABLEINFO {
+ DWORD qtable0[QTABLE_SIZE];
+ DWORD qtable1[QTABLE_SIZE];
+ DWORD qtable2[QTABLE_SIZE];
+ int qFactor;
+};
+
+class ModeJPEG : public Compressor
+{
+ friend class LJJetReady;
+ friend class HeaderLJJetReady;
+
+public:
+ ModeJPEG(SystemServices* pSys, Printer* pPrinter, unsigned int RasterSize, COMPRESS_MODE eCompressMode);
+ virtual ~ModeJPEG();
+ BOOL Process(RASTERDATA* input);
+ BYTE* NextOutputRaster(COLORTYPE color);
+ unsigned int GetOutputWidth(COLORTYPE color);
+ long GetCoordinates() { return m_lPrinterRasterRow; }
+ DRIVER_ERROR SendWhiteStrips (int iPageHeight, BOOL bGray);
+
+protected:
+ BOOL Compress( HPLJBITMAP *pSrcBmap,
+ HPLJBITMAP *pTrgBitmap,
+ QTABLEINFO *pQTable,
+ BOOL bGrayscaleSet
+ );
+
+ BYTE* GetBuffer(void);
+ void SetBuffer(BYTE* pJPEGBuffer);
+ DWORD GetJPEGBufferSize(void) const;
+
+ static BYTE* fpJPEGBuffer; // This is passed destination JPEG buffer
+ static DWORD fJPEGBufferPos; // position of first empty Byte in return Buffer
+ // has been called
+ JSAMPROW fRow_array[1]; // JPEG processing routine expects an
+ // array of pointers. We always send
+ // 1 row at a time.
+
+ DWORD fBufferSize;
+ BYTE* fpJPEGStart;
+
+ //----------------------------------------------------------------
+ // These are JPEG library "objects" used in the actual jpeg compression routines
+ //----------------------------------------------------------------
+ struct jpeg_compress_struct cinfo;
+ struct jpeg_decompress_struct dinfo;
+ struct jpeg_error_mgr jerr;
+ struct jpeg_destination_mgr dest;
+ jmp_buf setjmp_buffer; /* for return to caller */
+
+ //----------------------------------------------------------------
+ // IJG dest manager callback
+ //----------------------------------------------------------------
+ static void jpeg_flush_output_buffer_callback(JOCTET *outbuf, BYTE* buffer, DWORD size);
+
+private:
+ Printer* thePrinter;
+
+ HPLJBITMAP m_SourceBitmap;
+ HPLJBITMAP m_DestBitmap;
+ long m_lCurrCDRasterRow; // Current raster index. in PrintNextBand
+ long m_lPrinterRasterRow; // Current printer raster row.
+ int m_iRasterWidth; // Input image width
+ COMPRESS_MODE m_eCompressMode;
+}; //ModeJPEG
+
+
+#ifdef APDK_LJJETREADY
+//! LJJetReadyProxy
+/*!
+******************************************************************************/
+class LJJetReadyProxy : public PrinterProxy
+{
+public:
+ LJJetReadyProxy() : PrinterProxy(
+ "LJJetReady", // family name
+ "hp color LaserJet 3500\0"
+ "hp color LaserJet 3550\0"
+ "hp color LaserJet 3600\0"
+ "Hp Color LaserJet CP151\0"
+#ifdef APDK_MLC_PRINTER
+#endif
+ ) {m_iPrinterType = eLJJetReady;}
+ inline Printer* CreatePrinter(SystemServices* pSS) const { return new LJJetReady(pSS); }
+ inline PRINTER_TYPE GetPrinterType() const { return eLJJetReady;}
+ inline unsigned int GetModelBit() const { return 0x1;}
+};
+#endif
+
+APDK_END_NAMESPACE
+
+#endif // APDK_LJJETREADY
+#endif //APDK_LJJETREADY_H
diff --git a/prnt/hpijs/ljm1005.cpp b/prnt/hpijs/ljm1005.cpp
new file mode 100644
index 0000000..7263554
--- /dev/null
+++ b/prnt/hpijs/ljm1005.cpp
@@ -0,0 +1,236 @@
+/*****************************************************************************\
+ ljm1005.cpp : Implementation for the LJM1005 class
+
+ Copyright (c) 1996 - 2006, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+#ifdef APDK_LJM1005
+
+#include "header.h"
+#include "io_defs.h"
+#include "printerproxy.h"
+#include "resources.h"
+#include "ljzjs.h"
+#include "ljm1005.h"
+
+APDK_BEGIN_NAMESPACE
+
+extern uint32_t ulMapGRAY_K_6x6x1[9 * 9 * 9];
+
+extern uint32_t ulMapDJ600_CCM_K[9 * 9 * 9];
+
+LJM1005::LJM1005 (SystemServices* pSS, int numfonts, BOOL proto)
+ : LJZjs (pSS, numfonts, proto)
+{
+
+ ePen = BLACK_PEN;
+
+ pMode[GRAYMODE_INDEX] = new LJM1005DraftGrayMode ();
+ pMode[DEFAULTMODE_INDEX] = new LJM1005NormalGrayMode ();
+ ModeCount = 2;
+
+ CMYMap = NULL;
+#ifdef APDK_AUTODUPLEX
+ m_bRotateBackPage = FALSE; // Lasers don't require back side image to be rotated
+#endif
+ m_pszInputRasterData = NULL;
+ m_dwCurrentRaster = 0;
+ m_cmColorMode = GREY_K;
+ m_bStartPageSent = FALSE;
+ m_iPlaneNumber = 0;
+ m_iBPP = 2;
+ for (int i = 1; i < 4; i++)
+ {
+ m_iP[i] = i - 1; //{3, 0, 1, 2};
+ }
+ m_iP[0] = 0;
+ m_bIamColor = FALSE;
+ m_iPrinterType = eLJM1005;
+}
+
+LJM1005::~LJM1005 ()
+{
+}
+
+LJM1005DraftGrayMode::LJM1005DraftGrayMode ()
+: GrayMode(/*ulMapDJ600_CCM_K*/ulMapGRAY_K_6x6x1)
+{
+ ResolutionX[0] =
+ ResolutionY[0] = 600;
+ BaseResX =
+ BaseResY = 600;
+ MixedRes = FALSE;
+ bFontCapable = FALSE;
+ theQuality = qualityDraft;
+ pmQuality = QUALITY_DRAFT;
+ Config.bCompress = FALSE;
+}
+
+LJM1005NormalGrayMode::LJM1005NormalGrayMode ()
+: GrayMode(/*ulMapDJ600_CCM_K*/ulMapGRAY_K_6x6x1)
+{
+
+ ResolutionX[0] =
+ ResolutionY[0] = 600;
+ BaseResX =
+ BaseResY = 600;
+ TextRes = 600;
+ MixedRes = FALSE;
+ bFontCapable = FALSE;
+ Config.bCompress = FALSE;
+}
+
+DRIVER_ERROR LJM1005::Encapsulate (const RASTERDATA *pRasterData, BOOL bLastPlane)
+{
+ if (pRasterData != NULL)
+ {
+ for (int i = 0; i < pRasterData->rastersize[COLORTYPE_COLOR]; i++)
+ {
+ m_pszCurPtr[i*m_iBPP] = szByte1[pRasterData->rasterdata[COLORTYPE_COLOR][i]];
+ m_pszCurPtr[i*m_iBPP+1] = szByte2[pRasterData->rasterdata[COLORTYPE_COLOR][i]];
+ m_pszCurPtr[i*m_iBPP] |= (m_pszCurPtr[i*m_iBPP] >> 1);
+ m_pszCurPtr[i*m_iBPP+1] |= (m_pszCurPtr[i*m_iBPP+1] >> 1);
+ }
+ }
+
+ m_dwCurrentRaster++;
+ m_pszCurPtr += (m_iBPP * m_dwWidth);
+ if (m_dwCurrentRaster == m_dwLastRaster)
+ {
+ JbigCompress ();
+ }
+ return NO_ERROR;
+}
+
+DRIVER_ERROR LJM1005::EndPage ()
+{
+ DRIVER_ERROR err = NO_ERROR;
+ BYTE szStr[16];
+
+ memset (szStr, 0, 16);
+ szStr[3] = 0x06;
+ szStr[11] = 0x04;
+ err = Send ((const BYTE *) szStr, 16);
+
+ m_bStartPageSent = FALSE;
+
+ m_dwCurrentRaster = 0;
+ m_pszCurPtr = m_pszInputRasterData;
+
+ return err;
+}
+
+DRIVER_ERROR LJM1005::SendPlaneData (int iPlaneNumber, HPLJZjsJbgEncSt *se, HPLJZjcBuff *pcBuff, BOOL bLastStride)
+{
+ DRIVER_ERROR err = NO_ERROR;
+ BYTE szStr[128];
+ int i = 0;
+
+/*
+ * Send JBIG header info
+ */
+
+ memset (szStr, 0x0, 128);
+ szStr[3] = 0x05;
+ szStr[7] = 0x04;
+ i = 8;
+ i += SendIntItem (szStr+i, 0x80000000, 0x04, 0x40);
+ i += SendIntItem (szStr+i, 0x40000000, 0x04, 0x00);
+ i += SendIntItem (szStr+i, 0x40000002, 0x14, 0x00);
+ i -= 4;
+ szStr[i++] = se->dl;
+ szStr[i++] = se->d;
+ szStr[i++] = se->planes;
+ szStr[i++] = 0;
+ for (int j = 3; j >= 0; j--)
+ {
+ szStr[i] = (BYTE) ((se->xd >> (8 * j)) & 0xFF);
+ szStr[4+i] = (BYTE) ((se->yd >> (8 * j)) & 0xFF);
+ szStr[8+i] = (BYTE) ((se->l0 >> (8 * j)) & 0xFF);
+ i++;
+ }
+ i = 56;
+ szStr[i++] = se->mx;
+ szStr[i++] = se->my;
+ szStr[i++] = se->order;
+ szStr[i++] = se->options;
+ i += SendIntItem (szStr+i, 0x80000001, 0x04, 0xDEADBEEF);
+
+ BYTE *p = pcBuff->pszCompressedData + 20;
+ int iDataSize = pcBuff->dwTotalSize - 20;
+ char szTmpStr[32];
+ memset (szTmpStr, 0x0, 32);
+ szTmpStr[3] = 0x07;
+ szTmpStr[5] = 0x01;
+ szTmpStr[19] = 0x06;
+ szTmpStr[27] = 0x04;
+ while (iDataSize > 65536)
+ {
+ err = Send ((const BYTE *) szStr, i);
+ ERRCHECK;
+ err = Send ((const BYTE *) szTmpStr, 8);
+ ERRCHECK;
+ err = Send ((const BYTE *) p, 65536);
+ ERRCHECK;
+ iDataSize -= 65536;
+ p += 65536;
+// err = Send ((const BYTE *) szTmpStr+16, 16);
+ }
+ if (iDataSize > 0)
+ {
+ err = Send ((const BYTE *) szStr, i);
+ ERRCHECK;
+ szTmpStr[5] = (char) ((iDataSize >> 16) & 0xFF);
+ szTmpStr[6] = (char) ((iDataSize >> 8) & 0xFF);
+ szTmpStr[7] = (char) (iDataSize & 0xFF);
+ err = Send ((const BYTE *) szTmpStr, 8);
+ ERRCHECK;
+ err = Send ((const BYTE *) p, iDataSize);
+ ERRCHECK;
+// err = Send ((const BYTE *) szTmpStr+16, 16);
+ }
+
+ return err;
+}
+
+DRIVER_ERROR LJM1005::VerifyPenInfo()
+{
+ ePen = BLACK_PEN;
+ return NO_ERROR;
+}
+
+DRIVER_ERROR LJM1005::ParsePenInfo (PEN_TYPE& ePen, BOOL QueryPrinter)
+{
+ ePen = BLACK_PEN;
+
+ return NO_ERROR;
+}
+
+APDK_END_NAMESPACE
+
+#endif // APDK_LJM1005
+
diff --git a/prnt/hpijs/ljm1005.h b/prnt/hpijs/ljm1005.h
new file mode 100644
index 0000000..fbe27a7
--- /dev/null
+++ b/prnt/hpijs/ljm1005.h
@@ -0,0 +1,117 @@
+/*****************************************************************************\
+ ljm1005.h : Interface for the LJM1005 class
+
+ Copyright (c) 1996 - 2006, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#ifndef APDK_LJM1005_H
+#define APDK_LJM1005_H
+
+#ifdef APDK_LJM1005
+
+APDK_BEGIN_NAMESPACE
+
+/*!
+\internal
+*/
+class LJM1005 : public LJZjs
+{
+public:
+ LJM1005 (SystemServices* pSS, int numfonts = 0, BOOL proto = FALSE);
+ ~LJM1005 ();
+
+ virtual DRIVER_ERROR Encapsulate (const RASTERDATA *pRasterData, BOOL bLastPlane);
+ virtual DRIVER_ERROR VerifyPenInfo ();
+ virtual DRIVER_ERROR ParsePenInfo (PEN_TYPE& ePen, BOOL QueryPrinter = TRUE);
+ virtual BOOL GetMargins (PAPER_SIZE ps, float *fMargins)
+ {
+ fMargins[0] = (float) 0.156;
+ fMargins[1] = (float) 0.156;
+ fMargins[2] = (float) 0.156;
+ fMargins[3] = (float) 0.2;
+ return TRUE;
+ }
+
+protected:
+
+#ifdef APDK_HP_UX
+ virtual LJM1005 & operator = (Printer& rhs)
+ {
+ return *this;
+ }
+#endif
+
+private:
+ virtual DRIVER_ERROR EndPage ();
+ virtual DRIVER_ERROR SendPlaneData (int iPlaneNumber, HPLJZjsJbgEncSt *se, HPLJZjcBuff *pcBuff, BOOL bLastStride);
+ virtual int GetOutputResolutionY ()
+ {
+ return 600;
+ }
+
+}; // LJM1005
+
+class LJM1005DraftGrayMode : public GrayMode
+{
+public:
+ LJM1005DraftGrayMode ();
+}; // LJM1005DraftGrayMode
+
+class LJM1005NormalGrayMode : public GrayMode
+{
+public:
+ LJM1005NormalGrayMode ();
+}; // LJM1005NormalGrayMode
+
+//! LJM1005Proxy
+/*!
+******************************************************************************/
+class LJM1005Proxy : public PrinterProxy
+{
+public:
+ LJM1005Proxy() : PrinterProxy(
+ "LJM1005",
+ "LaserJet M1005\0"
+ "HP LaserJet M1005\0"
+ "HP LaserJet M1120\0"
+ "HP LaserJet M1319\0"
+ "HP LaserJet P1505\0"
+ "HP LaserJet P2010\0"
+ "HP LaserJet P2014\0"
+ "HP LaserJet P2014n\0"
+ "M1005\0"
+ ) {m_iPrinterType = eLJM1005;}
+ inline Printer* CreatePrinter(SystemServices* pSS) const { return new LJM1005(pSS); }
+ inline PRINTER_TYPE GetPrinterType() const { return eLJM1005;}
+ inline unsigned int GetModelBit() const { return 0x40;}
+};
+
+APDK_END_NAMESPACE
+
+#endif // APDK_LJM1005
+#endif //APDK_LJM1005_H
diff --git a/prnt/hpijs/ljmono.cpp b/prnt/hpijs/ljmono.cpp
new file mode 100644
index 0000000..6c2473e
--- /dev/null
+++ b/prnt/hpijs/ljmono.cpp
@@ -0,0 +1,416 @@
+/*****************************************************************************\
+ ljmono.cpp : Implimentation for the LJMono class
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#ifdef APDK_LJMONO
+
+#include "header.h"
+#include "io_defs.h"
+#include "ljmono.h"
+#include "printerproxy.h"
+#include "resources.h"
+
+APDK_BEGIN_NAMESPACE
+
+extern uint32_t ulMapDJ600_CCM_K[ 9 * 9 * 9 ];
+
+LJMono::LJMono (SystemServices* pSS, int numfonts, BOOL proto)
+ : Printer(pSS, numfonts, proto)
+{
+
+ if ((!proto) && (IOMode.bDevID))
+ {
+ constructor_error = VerifyPenInfo ();
+ CERRCHECK;
+ }
+ else ePen = BLACK_PEN; // matches default mode
+
+ pMode[GRAYMODE_INDEX] = new LJMonoDraftMode ();
+ pMode[DEFAULTMODE_INDEX] = new LJMonoNormalMode ();
+ pMode[SPECIALMODE_INDEX] = new LJMonoBestMode ();
+ ModeCount = 3;
+
+ CMYMap = NULL;
+ m_bJobStarted = FALSE;
+#ifdef APDK_AUTODUPLEX
+ m_bRotateBackPage = FALSE; // Lasers don't require back side image to be rotated
+#endif
+
+ DBG1("LJMono created\n");
+}
+
+LJMono::~LJMono ()
+{
+ DISPLAY_STATUS eDispStatus;
+ if (IOMode.bStatus && m_bJobStarted)
+ {
+ for (int i = 0; i < 5; i++)
+ {
+ pSS->BusyWait (2000);
+ eDispStatus = ParseError (0);
+ if (eDispStatus == DISPLAY_PRINTING_COMPLETE)
+ {
+ pSS->DisplayPrinterStatus (eDispStatus);
+ break;
+ }
+ }
+ }
+}
+
+LJMonoDraftMode::LJMonoDraftMode ()
+: GrayMode(ulMapDJ600_CCM_K)
+{
+
+// By default, this is 150 dpi because LJ_BASE_RES is defined to be 300
+// unless APDK_HIGH_RES_MODES is defined, then VIP_BASE_RES will be 600
+
+ ResolutionX[0] =
+ ResolutionY[0] = LJ_BASE_RES;
+ BaseResX =
+ BaseResY = LJ_BASE_RES;
+ MixedRes = FALSE;
+ bFontCapable = TRUE;
+ theQuality = qualityDraft;
+ pmQuality = QUALITY_DRAFT;
+#ifdef APDK_AUTODUPLEX
+ bDuplexCapable = TRUE;
+#endif
+}
+
+LJMonoNormalMode::LJMonoNormalMode ()
+: GrayMode(ulMapDJ600_CCM_K)
+{
+
+// 300 or 600 dpi depending on LJ_BASE_RES value, which in turn is affected by APDK_HIGH_RES_MODES
+
+ ResolutionX[0] =
+ ResolutionY[0] = LJ_BASE_RES * 2;
+ BaseResX =
+ BaseResY = LJ_BASE_RES * 2;
+ TextRes = LJ_BASE_RES * 2;
+ MixedRes = FALSE;
+ bFontCapable = TRUE;
+#ifdef APDK_AUTODUPLEX
+ bDuplexCapable = TRUE;
+#endif
+}
+
+LJMonoBestMode::LJMonoBestMode ()
+: GrayMode(ulMapDJ600_CCM_K)
+{
+ ResolutionX[0] = ResolutionY[0] = 600;
+ BaseResX = BaseResY = 600;
+ TextRes = 600;
+ MixedRes = FALSE;
+ bFontCapable = TRUE;
+ pmQuality = QUALITY_BEST;
+#ifdef APDK_AUTODUPLEX
+ bDuplexCapable = TRUE;
+#endif
+}
+
+HeaderLJMono::HeaderLJMono (Printer* p,PrintContext* pc)
+ : Header(p,pc)
+{ }
+
+DRIVER_ERROR HeaderLJMono::Send ()
+{
+ DRIVER_ERROR err;
+
+ StartSend ();
+
+ err = Graphics (); // start raster graphics and set compression mode
+
+ return err;
+}
+
+DRIVER_ERROR HeaderLJMono::StartSend ()
+{
+ DRIVER_ERROR err;
+ char res[96];
+ int iRes;
+
+ iRes = thePrintContext->EffectiveResolutionY ();
+
+ err = thePrinter->Send((const BYTE*)UEL,sizeof(UEL));
+ ERRCHECK;
+
+ sprintf (res, "@PJL SET PAGEPROTECT=AUTO\015\012@PJL SET RESOLUTION=%d\015\012", iRes);
+ err = thePrinter->Send ((const BYTE *) res, strlen (res));
+ ERRCHECK;
+
+ err = thePrinter->Send ((const BYTE *) "@PJL SET DENSITY=5\015\012", 20); // for lj1100, des 8/7/02
+ ERRCHECK;
+
+ QUALITY_MODE eQ = QUALITY_NORMAL;
+ COLORMODE eC;
+ MEDIATYPE eM;
+ BOOL bD;
+
+ thePrintContext->GetPrintModeSettings (eQ, eM, eC, bD);
+
+ if (eQ == QUALITY_DRAFT)
+ {
+ strcpy (res, "@PJL SET RET=OFF\015\012@PJL SET ECONOMODE=ON\015\012");
+ err = thePrinter->Send ((const BYTE *) res, strlen (res));
+ ERRCHECK;
+ }
+
+ if (thePrinter->IOMode.bStatus)
+ {
+ sprintf (res, "@PJL JOB NAME = \"%ld\"\015\012", (long) (thePrinter));
+ err = thePrinter->Send ((const BYTE *) res, strlen (res));
+ ERRCHECK;
+
+ strcpy (res, "@PJL USTATUSOFF\015\012@PJL USTATUS DEVICE = ON\015\012@PJL USTATUS JOB = ON\015\012");
+ err = thePrinter->Send ((const BYTE *) res, strlen (res));
+ ERRCHECK;
+ }
+
+// Duplexing directive
+
+ strcpy (res, "@PJL SET DUPLEX=OFF\015\012");
+
+#ifdef APDK_AUTODUPLEX
+ DUPLEXMODE dupmode = thePrintContext->QueryDuplexMode ();
+ if (dupmode != DUPLEXMODE_NONE)
+ {
+ strcpy (res, "@PJL SET DUPLEX=ON\015\012@PJL SET BINDING=");
+ if (dupmode == DUPLEXMODE_BOOK)
+ strcat (res, "LONGEDGE\015\012");
+ else
+ strcat (res, "SHORTEDGE\015\012");
+ }
+#endif
+ err = thePrinter->Send ((const BYTE *) res, strlen (res));
+ ERRCHECK;
+
+ err = thePrinter->Send ((const BYTE*) EnterLanguage, sizeof (EnterLanguage));
+ ERRCHECK;
+
+ err = thePrinter->Send ((const BYTE*) "PCL\015\012", 5);
+ ERRCHECK;
+
+ err = thePrinter->Send ((const BYTE*)Reset,sizeof(Reset));
+ ERRCHECK;
+
+ sprintf (res, "\033&l%dH", thePrintContext->GetMediaSource());
+ err = thePrinter->Send ((const BYTE *) res, strlen (res)); // Source
+ ERRCHECK;
+
+// Media size, vertical spacing between lines and top margin
+
+ memcpy (res, mediasize, mscount - 1);
+ strcpy (res+mscount-1, "a8c0E");
+ err = thePrinter->Send ((const BYTE *) res, strlen (res));
+ ERRCHECK;
+
+ sprintf (res, "\033*t%dR\033&u%dD", iRes, iRes);
+ err = thePrinter->Send ((const BYTE *) res, 14);
+ ERRCHECK;
+
+ err = Margins ();
+ ERRCHECK;
+ CAPy = 0;
+
+// Default is single sided printing
+
+ strcpy (res, "\033&l0S");
+#ifdef APDK_AUTODUPLEX
+ DUPLEXMODE eDupMode = thePrintContext->QueryDuplexMode ();
+ if (eDupMode != DUPLEXMODE_NONE)
+ {
+ sprintf (res, "\033&l%dS", (eDupMode == DUPLEXMODE_BOOK) ? 1 : 2);
+ }
+#endif
+ err = thePrinter->Send ((const BYTE *) res, strlen (res));
+ ERRCHECK;
+
+/*
+ * Set orientation to Portrait. APDK supports printing in Portrait mode only.
+ * If users desire Landscape printing, application/gluecode will have to
+ * rearrange the rasters appropriately.
+ */
+
+ err = thePrinter->Send ((const BYTE *) "\033&l0O", 5);
+
+ // Number of copies
+ sprintf (res, "\033&l%dX", thePrintContext->GetCopyCount ());
+ err = thePrinter->Send ((const BYTE *) res, strlen (res));
+ ERRCHECK;
+
+ return err;
+}
+
+DRIVER_ERROR HeaderLJMono::Graphics ()
+{
+ DRIVER_ERROR error = thePrinter->Send ((const BYTE*)grafStart, sizeof (grafStart) );
+ if (error!=NO_ERROR)
+ return error;
+
+ error= thePrinter->Send((const BYTE*) grafMode2, sizeof (grafMode2) );
+
+ if (error!=NO_ERROR)
+ return error;
+
+ return error;
+}
+
+DRIVER_ERROR HeaderLJMono::EndJob ()
+{
+ char szBuff[128];
+ DRIVER_ERROR err = NO_ERROR;
+ if (thePrinter->IOMode.bStatus)
+ {
+ sprintf (szBuff, "\033E\033%%-12345X@PJL EOJ NAME = \"%ld\"\015\012@PJL RESET\015\012",
+ (long) (thePrinter));
+ err = thePrinter->Send ((const BYTE *) szBuff, strlen (szBuff));
+ }
+
+ strcpy (szBuff, "\033%-12345X");
+ err = thePrinter->Send ((const BYTE *) szBuff, strlen (szBuff));
+
+ return err;
+}
+
+Header* LJMono::SelectHeader (PrintContext* pc)
+{
+ m_bJobStarted = TRUE;
+ return new HeaderLJMono (this,pc);
+}
+
+DRIVER_ERROR LJMono::VerifyPenInfo()
+{
+
+ DRIVER_ERROR err = NO_ERROR;
+
+ if(IOMode.bDevID == FALSE)
+ {
+ return err;
+ }
+
+ ePen = BLACK_PEN;
+ return NO_ERROR;
+}
+
+DRIVER_ERROR LJMono::ParsePenInfo(PEN_TYPE& ePen, BOOL QueryPrinter)
+{
+
+ ePen = BLACK_PEN;
+
+ return NO_ERROR;
+}
+
+Compressor* LJMono::CreateCompressor (unsigned int RasterSize)
+{
+ return new Mode2 (pSS,RasterSize);
+}
+
+DISPLAY_STATUS LJMono::ParseError (BYTE status_reg)
+{
+ DBG1("LJMono: parsing error info\n");
+
+ DRIVER_ERROR err = NO_ERROR;
+ BYTE szReadBuff[256];
+ DWORD iReadCount = 256;
+ DISPLAY_STATUS eStatus = (DISPLAY_STATUS) status_reg;
+ char *tmpStr;
+ int iErrorCode;
+
+ if (!IOMode.bDevID)
+ return eStatus;
+
+ memset (szReadBuff, 0, 256);
+ err = pSS->FromDevice (szReadBuff, &iReadCount);
+ if (err == NO_ERROR && iReadCount == 0)
+ return eStatus;
+
+ if (strstr ((char *) szReadBuff, "JOB"))
+ {
+ if (!(tmpStr = strstr ((char *) szReadBuff, "NAME")))
+ return DISPLAY_PRINTING;
+ tmpStr += 6;
+ while (*tmpStr < '0' || *tmpStr > '9')
+ tmpStr++;
+ sscanf (tmpStr, "%d", &iErrorCode);
+ if (iErrorCode != (long) (this))
+ return DISPLAY_PRINTING;
+ }
+
+ if (strstr ((char *) szReadBuff, "END"))
+ {
+ return DISPLAY_PRINTING_COMPLETE;
+ }
+
+
+ if (strstr ((char *) szReadBuff, "CANCEL"))
+ return DISPLAY_PRINTING_CANCELED;
+
+ if (!(tmpStr = strstr ((char *) szReadBuff, "CODE")))
+ return eStatus;
+
+ tmpStr += 4;
+ while (*tmpStr < '0' || *tmpStr > '9')
+ tmpStr++;
+ sscanf (tmpStr, "%d", &iErrorCode);
+
+ if (iErrorCode < 32000)
+ return DISPLAY_PRINTING;
+
+ if (iErrorCode == 40010 || iErrorCode == 40020)
+ return DISPLAY_NO_PENS; // Actually, out of toner
+
+ if (iErrorCode == 40021)
+ return DISPLAY_TOP_COVER_OPEN;
+
+ if ((iErrorCode / 100) == 419)
+ return DISPLAY_OUT_OF_PAPER;
+
+ if ((iErrorCode / 1000) == 42 || iErrorCode == 40022)
+ {
+ DBG1("Paper Jammed\n");
+ return DISPLAY_PAPER_JAMMED;
+ }
+
+ if (iErrorCode > 40049 && iErrorCode < 41000)
+ {
+ DBG1("IO trap\n");
+ return DISPLAY_ERROR_TRAP;
+ }
+
+ if (iErrorCode == 40079)
+ return DISPLAY_OFFLINE;
+
+ return DISPLAY_ERROR_TRAP;
+}
+
+APDK_END_NAMESPACE
+
+#endif // defined APDK_LJMono
diff --git a/prnt/hpijs/ljmono.h b/prnt/hpijs/ljmono.h
new file mode 100644
index 0000000..21b613a
--- /dev/null
+++ b/prnt/hpijs/ljmono.h
@@ -0,0 +1,140 @@
+/*****************************************************************************\
+ ljmono.h : Interface for the LJMono class
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#ifndef APDK_LJMONO_H
+#define APDK_LJMONO_H
+
+APDK_BEGIN_NAMESPACE
+
+#ifdef APDK_HIGH_RES_MODES
+#define LJ_BASE_RES 300
+#else
+#define LJ_BASE_RES 150
+#endif
+
+/*!
+\internal
+*/
+class LJMono : public Printer
+{
+public:
+ LJMono (SystemServices* pSS,int numfonts=0, BOOL proto=FALSE);
+ ~LJMono ();
+
+ virtual Header* SelectHeader (PrintContext* pc);
+ virtual DRIVER_ERROR VerifyPenInfo ();
+ virtual DRIVER_ERROR ParsePenInfo (PEN_TYPE& ePen, BOOL QueryPrinter=TRUE);
+ virtual DISPLAY_STATUS ParseError (BYTE status_reg);
+ virtual DRIVER_ERROR Flush (int FlushSize)
+ {
+ return NO_ERROR;
+ }
+
+ virtual BOOL GetMargins (PAPER_SIZE ps, float *fMargins)
+ {
+ fMargins[0] = (float) 0.25;
+ fMargins[1] = (float) 0.25;
+ fMargins[2] = (float) 0.2;
+ fMargins[3] = (float) 0.2;
+ return TRUE;
+ }
+
+#ifdef APDK_AUTODUPLEX
+
+/*
+ * Note that we are returning TRUE here not to say there is a Hagaki Feed tray
+ * and Hagaki Card duplexer. Some non-HP Lasers number their input trays
+ * differently and try 5 (sourceHagakiFeedNDuplexer) can be a valid input tray.
+ * In order to allow selection of this tray, we will return TRUE for all lasers.
+ */
+
+ virtual BOOL HagakiFeedDuplexerPresent (BOOL bQueryPrinter)
+ {
+ return TRUE;
+ }
+#endif
+
+ Compressor* CreateCompressor (unsigned int RasterSize);
+
+protected:
+
+#ifdef APDK_HP_UX
+ virtual LJMono & operator = (Printer& rhs)
+ {
+ return *this;
+ }
+#endif
+
+ BOOL m_bJobStarted;
+
+}; // LJMono
+
+class LJMonoDraftMode : public GrayMode
+{
+public:
+ LJMonoDraftMode ();
+}; // LJMonoDraftMode
+
+class LJMonoNormalMode : public GrayMode
+{
+public:
+ LJMonoNormalMode ();
+}; // LJMonoNormalMode
+
+class LJMonoBestMode : public GrayMode
+{
+public:
+ LJMonoBestMode ();
+}; // LJMonoBestMode
+
+#ifdef APDK_LJMONO
+//! LJMonoProxy
+/*!
+******************************************************************************/
+class LJMonoProxy : public PrinterProxy
+{
+public:
+ LJMonoProxy() : PrinterProxy(
+ "Mono Laser", // family name
+ "HP LaserJet\0"
+ "hp LaserJet\0"
+#ifdef APDK_MLC_PRINTER
+#endif
+ ) {m_iPrinterType = eLJMono;}
+ inline Printer* CreatePrinter(SystemServices* pSS) const { return new LJMono(pSS); }
+ inline PRINTER_TYPE GetPrinterType() const { return eLJMono;}
+ inline unsigned int GetModelBit() const { return 0x40;}
+};
+#endif
+
+APDK_END_NAMESPACE
+
+#endif //APDK_LJMono_H
diff --git a/prnt/hpijs/ljp1xxx.h b/prnt/hpijs/ljp1xxx.h
new file mode 100644
index 0000000..4676b1a
--- /dev/null
+++ b/prnt/hpijs/ljp1xxx.h
@@ -0,0 +1,111 @@
+/*****************************************************************************\
+ ljp1xxx.h : Interface for the LJP1XXX class
+
+ Copyright (c) 2008, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#ifndef APDK_LJP1XXX_H
+#define APDK_LJP1XXX_H
+
+#ifdef APDK_LJM1005
+
+APDK_BEGIN_NAMESPACE
+
+extern uint32_t ulMapGRAY_K_6x6x1[9 * 9 * 9];
+
+class LJP1XXXBestGrayMode : public GrayMode
+{
+public:
+ LJP1XXXBestGrayMode () : GrayMode (ulMapGRAY_K_6x6x1)
+
+ {
+ // Data sent at 600x600x2, printer outputs at 600x600x2
+
+ ResolutionX[0] =
+ ResolutionY[0] = 600;
+ BaseResX =
+ BaseResY = 600;
+ TextRes = 600;
+ MixedRes = FALSE;
+ bFontCapable = FALSE;
+ Config.bCompress = FALSE;
+ theQuality = qualityPresentation;
+ pmQuality = QUALITY_BEST;
+ }
+}; // LJP1XXXBestGrayMode
+
+/*!
+\internal
+*/
+class LJP1XXX : public LJM1005
+{
+public:
+ LJP1XXX (SystemServices* pSS, int numfonts = 0, BOOL proto = FALSE) : LJM1005 (pSS)
+ {
+ pMode[ModeCount] = new LJP1XXXBestGrayMode ();
+ ModeCount++;
+ }
+protected:
+
+#ifdef APDK_HP_UX
+ virtual LJP1XXX & operator = (Printer& rhs)
+ {
+ return *this;
+ }
+#endif
+
+private:
+ int GetOutputResolutionY ()
+ {
+ return 600;
+ }
+}; // LJP1XXX
+
+//! LJP1XXXProxy
+/*!
+******************************************************************************/
+class LJP1XXXProxy : public PrinterProxy
+{
+public:
+ LJP1XXXProxy() : PrinterProxy(
+ "LJP1XXX",
+ "HP LaserJet P1005\0"
+ "HP LaserJet P1006\0"
+ "HP LaserJet P1007\0"
+ "HP LaserJet P1008\0"
+ "HP LaserJet P1009\0"
+ ) {m_iPrinterType = eLJP1XXX;}
+ inline Printer* CreatePrinter(SystemServices* pSS) const { return new LJP1XXX(pSS); }
+ inline PRINTER_TYPE GetPrinterType() const { return eLJP1XXX;}
+ inline unsigned int GetModelBit() const { return 0x40;}
+};
+
+APDK_END_NAMESPACE
+
+#endif // APDK_LJP1XXX
+#endif //APDK_LJP1XXX_H
diff --git a/prnt/hpijs/ljzjs.cpp b/prnt/hpijs/ljzjs.cpp
new file mode 100644
index 0000000..e02505c
--- /dev/null
+++ b/prnt/hpijs/ljzjs.cpp
@@ -0,0 +1,657 @@
+/*****************************************************************************\
+ ljzjs.cpp : Implementation for the LJZjs class
+
+ Copyright (c) 1996 - 2007, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#if defined (APDK_LJZJS_MONO) || defined (APDK_LJZJS_COLOR) || defined (APDK_LJM1005)
+
+#include "header.h"
+#include "io_defs.h"
+#include "printerproxy.h"
+#include "resources.h"
+#include "ljzjs.h"
+#ifdef HAVE_LIBDL
+#include <dlfcn.h>
+#endif
+
+extern "C"
+{
+int (*HPLJJBGCompress) (int iWidth, int iHeight, unsigned char **pBuff,
+ HPLJZjcBuff *pOutBuff, HPLJZjsJbgEncSt *pJbgEncSt);
+int (*HPLJSoInit) (int iFlag);
+}
+
+APDK_BEGIN_NAMESPACE
+
+#ifdef HAVE_LIBDL
+extern void *LoadPlugin (const char *szPluginName);
+#endif
+
+const unsigned char LJZjs::szByte1[256] =
+ {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 42, 42, 42, 42, 42, 42, 42, 42,
+ 42, 42, 42, 42, 42, 42, 42, 42, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+ 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+ 130, 130, 130, 130, 136, 136, 136, 136, 136, 136, 136, 136,
+ 136, 136, 136, 136, 136, 136, 136, 136, 138, 138, 138, 138,
+ 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138,
+ 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+ 160, 160, 160, 160, 162, 162, 162, 162, 162, 162, 162, 162,
+ 162, 162, 162, 162, 162, 162, 162, 162, 168, 168, 168, 168,
+ 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
+ 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
+ 170, 170, 170, 170,
+ };
+const unsigned char LJZjs::szByte2[256] =
+ {
+ 0, 2, 8, 10, 32, 34, 40, 42, 128, 130, 136, 138,
+ 160, 162, 168, 170, 0, 2, 8, 10, 32, 34, 40, 42,
+ 128, 130, 136, 138, 160, 162, 168, 170, 0, 2, 8, 10,
+ 32, 34, 40, 42, 128, 130, 136, 138, 160, 162, 168, 170,
+ 0, 2, 8, 10, 32, 34, 40, 42, 128, 130, 136, 138,
+ 160, 162, 168, 170, 0, 2, 8, 10, 32, 34, 40, 42,
+ 128, 130, 136, 138, 160, 162, 168, 170, 0, 2, 8, 10,
+ 32, 34, 40, 42, 128, 130, 136, 138, 160, 162, 168, 170,
+ 0, 2, 8, 10, 32, 34, 40, 42, 128, 130, 136, 138,
+ 160, 162, 168, 170, 0, 2, 8, 10, 32, 34, 40, 42,
+ 128, 130, 136, 138, 160, 162, 168, 170, 0, 2, 8, 10,
+ 32, 34, 40, 42, 128, 130, 136, 138, 160, 162, 168, 170,
+ 0, 2, 8, 10, 32, 34, 40, 42, 128, 130, 136, 138,
+ 160, 162, 168, 170, 0, 2, 8, 10, 32, 34, 40, 42,
+ 128, 130, 136, 138, 160, 162, 168, 170, 0, 2, 8, 10,
+ 32, 34, 40, 42, 128, 130, 136, 138, 160, 162, 168, 170,
+ 0, 2, 8, 10, 32, 34, 40, 42, 128, 130, 136, 138,
+ 160, 162, 168, 170, 0, 2, 8, 10, 32, 34, 40, 42,
+ 128, 130, 136, 138, 160, 162, 168, 170, 0, 2, 8, 10,
+ 32, 34, 40, 42, 128, 130, 136, 138, 160, 162, 168, 170,
+ 0, 2, 8, 10, 32, 34, 40, 42, 128, 130, 136, 138,
+ 160, 162, 168, 170,
+ };
+
+LJZjs::LJZjs (SystemServices* pSS, int numfonts, BOOL proto)
+ : Printer(pSS, numfonts, proto)
+{
+
+ CMYMap = NULL;
+#ifdef APDK_AUTODUPLEX
+ m_bRotateBackPage = FALSE; // Lasers don't require back side image to be rotated
+#endif
+ m_pszInputRasterData = NULL;
+ m_dwCurrentRaster = 0;
+ m_bStartPageSent = FALSE;
+ HPLJJBGCompress = NULL;
+ m_hHPLibHandle = NULL;
+ m_iPrinterType = UNSUPPORTED;
+#ifdef HAVE_LIBDL
+ m_hHPLibHandle = LoadPlugin ("lj.so");
+ if (m_hHPLibHandle)
+ {
+ dlerror ();
+ *(void **) (&HPLJJBGCompress) = dlsym (m_hHPLibHandle, "hp_encode_bits_to_jbig");
+ *(void **) (&HPLJSoInit) = dlsym (m_hHPLibHandle, "hp_init_lib");
+ if (!HPLJSoInit || (HPLJSoInit && !HPLJSoInit (1)))
+ {
+ constructor_error = PLUGIN_LIBRARY_MISSING;
+ }
+ }
+#endif
+ if (HPLJJBGCompress == NULL)
+ {
+ constructor_error = PLUGIN_LIBRARY_MISSING;
+ }
+ //Issue: LJZJSMono class printers not printing in RHEL
+ //Cause: Since start page is common for LJZJSMono and LJZJSColor class, the items of
+ //LJZJSColor-2 format was used for LJZJSMono due to below variable not initialised
+ //Fix: Added initialisation so that correct LJZJSMono items are used.
+ //Variable is updated in LJZJSColor.
+ m_bLJZjsColor2Printer = FALSE;
+
+}
+
+LJZjs::~LJZjs ()
+{
+#ifdef HAVE_LIBDL
+ if (m_hHPLibHandle)
+ {
+ dlclose (m_hHPLibHandle);
+ }
+#endif
+ if (m_pszInputRasterData)
+ {
+ delete [] m_pszInputRasterData;
+ }
+}
+
+HeaderLJZjs::HeaderLJZjs (Printer* p,PrintContext* pc)
+ : Header(p,pc)
+{
+}
+
+DRIVER_ERROR HeaderLJZjs::Send ()
+{
+ DRIVER_ERROR err = NO_ERROR;
+ char szStr[256];
+ WORD wItems[3] = {ZJI_DMCOLLATE, ZJI_PAGECOUNT, ZJI_DMDUPLEX};
+ int i = 4;
+
+ QUALITY_MODE eQuality;
+ MEDIATYPE cmt;
+ BOOL cdt;
+ COLORMODE ccm;
+ thePrintContext->GetPrintModeSettings (eQuality, cmt, ccm, cdt);
+
+ if (((LJZjs *) thePrinter)->m_iPrinterType == eLJM1005)
+ {
+ strcpy (szStr, "\x1B\x25-12345X@PJL JOB\x0D\x0A");
+ strcpy (szStr+strlen (szStr), "@PJL SET JAMRECOVERY=OFF\x0D\x0A");
+ strcpy (szStr+strlen (szStr), "@PJL SET DENSITY=3\x0D\x0A");
+ strcpy (szStr+strlen (szStr), "@PJL SET RET=MEDIUM\x0D\x0A");
+ strcpy (szStr+strlen (szStr), "@PJL SET ECONOMODE=");
+ if (eQuality == QUALITY_DRAFT)
+ {
+ strcpy (szStr+strlen (szStr), "ON\x0D\x0A");
+ }
+ else
+ {
+ strcpy (szStr+strlen (szStr), "OFF\x0D\x0A");
+ }
+ err = thePrinter->Send ((const BYTE *) szStr, strlen (szStr));
+ ERRCHECK;
+
+ strcpy (szStr, "\x1B\x25-12345X,XQX");
+ err = thePrinter->Send ((const BYTE *) szStr, strlen (szStr));
+ memset (szStr, 0x0, 92);
+ szStr[3] = 0x01;
+ szStr[7] = 0x07;
+ i = 8;
+ i += ((LJZjs *) thePrinter)->SendIntItem ((BYTE *) szStr+i, 0x80000000, 0x04, 0x54);
+ i += ((LJZjs *) thePrinter)->SendIntItem ((BYTE *) szStr+i, 0x10000005, 0x04, 0x01);
+ i += ((LJZjs *) thePrinter)->SendIntItem ((BYTE *) szStr+i, 0x10000001, 0x04, 0x00);
+ i += ((LJZjs *) thePrinter)->SendIntItem ((BYTE *) szStr+i, 0x10000002, 0x04, 0x00);
+ i += ((LJZjs *) thePrinter)->SendIntItem ((BYTE *) szStr+i, 0x10000000, 0x04, 0x00);
+ i += ((LJZjs *) thePrinter)->SendIntItem ((BYTE *) szStr+i, 0x10000003, 0x04, 0x01);
+ i += ((LJZjs *) thePrinter)->SendIntItem ((BYTE *) szStr+i, 0x80000001, 0x04, 0xDEADBEEF);
+ err = thePrinter->Send ((const BYTE *) szStr, i);
+ return err;
+ }
+
+ strcpy (szStr, "\x1B\x25-12345X@PJL ENTER LANGUAGE=ZJS\x0A");
+ err = thePrinter->Send ((const BYTE *) szStr, strlen (szStr));
+ ERRCHECK;
+
+ memset (szStr, 0, 256);
+
+ strcpy (szStr, "JZJZ");
+ i = 0;
+ szStr[i+7] = 52;
+ szStr[i+11] = ZJT_START_DOC;
+ szStr[i+15] = 3;
+ szStr[i+17] = 36;
+ szStr[i+18] = 'Z';
+ szStr[i+19] = 'Z';
+
+ i += 20;
+ for (int j = 0; j < 3; j++)
+ {
+ szStr[i+3] = 12;
+ szStr[i+5] = (char) wItems[j];
+ szStr[i+6] = ZJIT_UINT32;
+ szStr[i+11] = j / 2;
+ i += 12;
+ }
+ err = thePrinter->Send ((const BYTE *) szStr, i);
+ return err;
+}
+
+int LJZjs::MapPaperSize ()
+{
+ switch (thePrintContext->GetPaperSize ())
+ {
+ case LETTER: return 1;
+ case LEGAL: return 5;
+ case A4: return 9;
+ case B4: return 12;
+ case B5: return 357;
+ case OUFUKU: return 43;
+ case HAGAKI: return 43;
+#ifdef APDK_EXTENDED_MEDIASIZE
+ case A3: return 8;
+ case A5: return 11;
+// case LEDGER: return 4;
+ case EXECUTIVE: return 7;
+// case CUSTOM_SIZE: return 96;
+ case ENVELOPE_NO_10: return 20;
+ case ENVELOPE_DL: return 27;
+ case FLSA: return 258;
+#endif
+ default: return 1;
+ }
+}
+
+DRIVER_ERROR LJZjs::StartPage (DWORD dwWidth, DWORD dwHeight)
+{
+ DRIVER_ERROR err = NO_ERROR;
+ QUALITY_MODE cqm;
+ MEDIATYPE cmt;
+ BOOL cdt;
+ DWORD dwNumItems = (m_bIamColor) ? 15 : 14;
+ BYTE szStr[16 + 15 * 12];
+ int iPlanes = 1;
+ int i;
+ int iMediaType = 1; // Plain paper
+
+ if (m_bStartPageSent)
+ {
+ return NO_ERROR;
+ }
+ m_bStartPageSent = TRUE;
+ err = thePrintContext->GetPrintModeSettings (cqm, cmt, m_cmColorMode, cdt);
+ if (cmt == MEDIA_TRANSPARENCY)
+ {
+ iMediaType = 2;
+ }
+ else if (cmt == MEDIA_PHOTO)
+ {
+ iMediaType = 3;
+ }
+
+ if (m_iPrinterType == eLJM1005)
+ {
+ int iOutputResolution = GetOutputResolutionY ();
+ if (cqm == QUALITY_BEST)
+ iOutputResolution = (int) thePrintContext->EffectiveResolutionY ();
+ memset (szStr, 0x0, sizeof (szStr));
+ szStr[3] = 0x03;
+ szStr[7] = 0x0F;
+ err = Send ((const BYTE *) szStr, 8);
+ i = 0;
+ i += SendIntItem (szStr+i, 0x80000000, 0x04, 0xB4);
+ i += SendIntItem (szStr+i, 0x20000005, 0x04, 0x01);
+ i += SendIntItem (szStr+i, 0x20000006, 0x04, 0x07);
+ i += SendIntItem (szStr+i, 0x20000000, 0x04, 0x01);
+ i += SendIntItem (szStr+i, 0x20000007, 0x04, 0x01);
+ i += SendIntItem (szStr+i, 0x20000008, 0x04, (int) thePrintContext->EffectiveResolutionX ());
+ i += SendIntItem (szStr+i, 0x20000009, 0x04, iOutputResolution);
+ i += SendIntItem (szStr+i, 0x2000000D, 0x04, (int) dwWidth);
+ i += SendIntItem (szStr+i, 0x2000000E, 0x04, (int) m_dwLastRaster);
+ i += SendIntItem (szStr+i, 0x2000000A, 0x04, m_iBPP);
+ i += SendIntItem (szStr+i, 0x2000000F, 0x04, (int) dwWidth/m_iBPP);
+ i += SendIntItem (szStr+i, 0x20000010, 0x04, (int) m_dwLastRaster);
+ i += SendIntItem (szStr+i, 0x20000011, 0x04, 0x01);
+ i += SendIntItem (szStr+i, 0x20000001, 0x04, MapPaperSize ());
+ i += SendIntItem (szStr+i, 0x80000001, 0x04, 0xDEADBEEF);
+ err = Send ((const BYTE *) szStr, i);
+ return err;
+ }
+
+ if(m_bLJZjsColor2Printer)
+ {
+ dwNumItems = 13;
+ }
+ if (m_cmColorMode == COLOR && m_bIamColor)
+ {
+ iPlanes = 4;
+ }
+
+ i = 0;
+ i += SendChunkHeader (szStr, 16 + dwNumItems * 12, ZJT_START_PAGE, dwNumItems);
+
+ if (m_bIamColor)
+ {
+ i += SendItem (szStr+i, ZJIT_UINT32, ZJI_PLANE, iPlanes);
+ }
+ i += SendItem (szStr+i, ZJIT_UINT32, ZJI_DMPAPER, MapPaperSize ());
+ i += SendItem (szStr+i, ZJIT_UINT32, ZJI_DMCOPIES, thePrintContext->GetCopyCount ());
+ i += SendItem (szStr+i, ZJIT_UINT32, ZJI_DMDEFAULTSOURCE, thePrintContext->GetMediaSource ());
+ i += SendItem (szStr+i, ZJIT_UINT32, ZJI_DMMEDIATYPE, iMediaType);
+ i += SendItem (szStr+i, ZJIT_UINT32, ZJI_NBIE, iPlanes);
+ i += SendItem (szStr+i, ZJIT_UINT32, ZJI_RESOLUTION_X, thePrintContext->EffectiveResolutionX ());
+ i += SendItem (szStr+i, ZJIT_UINT32, ZJI_RESOLUTION_Y, thePrintContext->EffectiveResolutionY ());
+ i += SendItem (szStr+i, ZJIT_UINT32, ZJI_RASTER_X, dwWidth);
+ i += SendItem (szStr+i, ZJIT_UINT32, ZJI_RASTER_Y, m_dwLastRaster);
+ i += SendItem (szStr+i, ZJIT_UINT32, ZJI_VIDEO_BPP, m_iBPP);
+ i += SendItem (szStr+i, ZJIT_UINT32, ZJI_VIDEO_X, dwWidth/m_iBPP);
+ i += SendItem (szStr+i, ZJIT_UINT32, ZJI_VIDEO_Y, m_dwLastRaster);
+ if(!m_bLJZjsColor2Printer)
+ {
+ i += SendItem (szStr+i, ZJIT_UINT32, ZJI_RET, RET_ON);
+ i += SendItem (szStr+i, ZJIT_UINT32, ZJI_TONER_SAVE, (cqm == QUALITY_DRAFT) ? 1 : 0);
+ }
+
+ err = Send ((const BYTE *) szStr, i);
+ return err;
+}
+
+int LJZjs::SendChunkHeader (BYTE *szStr, DWORD dwSize, DWORD dwChunkType, DWORD dwNumItems)
+{
+ for (int j = 3, i = 0; j >= 0; j--)
+ {
+ szStr[i] = (BYTE) ((dwSize >> (8 * (j))) & 0xFF);
+ szStr[4+i] = (BYTE) ((dwChunkType >> (8 * (j))) & 0xFF);
+ szStr[8+i] = (BYTE) ((dwNumItems >> (8 * (j))) & 0xFF);
+ i++;
+ }
+
+ szStr[12] = (BYTE) (((dwNumItems * 12) & 0xFF00) >> 8);
+ szStr[13] = (BYTE) (((dwNumItems * 12) & 0x00FF));
+
+ szStr[14] = 'Z';
+ szStr[15] = 'Z';
+ return 16;
+}
+
+int LJZjs::SendItem (BYTE *szStr, BYTE cType, WORD wItem, DWORD dwValue, DWORD dwExtra)
+{
+ int i, j;
+ dwExtra += 12;
+ for (j = 3, i = 0; j >= 0; j--)
+ {
+ szStr[i++] = (BYTE) ((dwExtra >> (8 * (j))) & 0xFF);
+ }
+ szStr[i++] = (BYTE) ((wItem & 0xFF00) >> 8);
+ szStr[i++] = (BYTE) ((wItem & 0x00FF));
+ szStr[i++] = (BYTE) cType;
+ szStr[i++] = 0;
+ for (j = 3; j >= 0; j--)
+ {
+ szStr[i++] = (BYTE) ((dwValue >> (8 * (j))) & 0xFF);
+ }
+ return i;
+}
+
+int LJZjs::SendIntItem (BYTE *szStr, int iItem, int iItemType, int iItemValue)
+{
+ int i = 0;
+ int j;
+ for (j = 3; j >= 0; j--)
+ {
+ szStr[i++] = (BYTE) ((iItem >> (8 * (j))) & 0xFF);
+ }
+ for (j = 3; j >= 0; j--)
+ {
+ szStr[i++] = (BYTE) ((iItemType >> (8 * (j))) & 0xFF);
+ }
+ for (j = 3; j >= 0; j--)
+ {
+ szStr[i++] = (BYTE) ((iItemValue >> (8 * (j))) & 0xFF);
+ }
+ return i;
+}
+
+DRIVER_ERROR LJZjs::SkipRasters (int iBlankRasters)
+{
+ DRIVER_ERROR err = NO_ERROR;
+ BOOL bLastPlane;
+ int iPlanes = (m_cmColorMode == COLOR) ? 4 : 1;
+ for (int i = 1; i <= iPlanes; i++)
+ {
+ bLastPlane = (i == iPlanes) ? TRUE : FALSE;
+ for (int j = 0; j < iBlankRasters; j++)
+ {
+ err = this->Encapsulate (NULL, bLastPlane);
+ }
+ }
+ return err;
+}
+
+DRIVER_ERROR HeaderLJZjs::FormFeed ()
+{
+ DRIVER_ERROR err = NO_ERROR;
+
+ err = thePrinter->Flush (0);
+
+ return err;
+}
+
+DRIVER_ERROR HeaderLJZjs::SendCAPy (unsigned int iAbsY)
+{
+ return NO_ERROR;
+}
+
+DRIVER_ERROR LJZjs::Flush (int FlushSize)
+{
+ DRIVER_ERROR err = NO_ERROR;
+ if (m_dwCurrentRaster == 0)
+ {
+ return NO_ERROR;
+ }
+ err = SkipRasters ((m_dwLastRaster - m_dwCurrentRaster));
+ return err;
+}
+
+DRIVER_ERROR LJZjs::JbigCompress ()
+{
+ DRIVER_ERROR err = NO_ERROR;
+ HPLJZjcBuff myBuffer;
+ int iPlanes = (m_cmColorMode == COLOR) ? 4 : 1;
+ int iIncr = (m_bIamColor) ? 100 : m_dwLastRaster;
+
+ HPLJZjsJbgEncSt se;
+ BYTE *bitmaps[4] =
+ {
+ m_pszInputRasterData,
+ m_pszInputRasterData + (m_dwWidth * m_iBPP * m_dwLastRaster),
+ m_pszInputRasterData + (m_dwWidth * m_iBPP * m_dwLastRaster * 2),
+ m_pszInputRasterData + (m_dwWidth * m_iBPP * m_dwLastRaster * 3)
+ };
+ myBuffer.pszCompressedData = new BYTE[m_dwWidth * m_dwLastRaster * m_iBPP];
+ myBuffer.dwTotalSize = 0;
+
+ BYTE *p;
+ int iHeight;
+ for (DWORD y = 0; y < m_dwLastRaster; y += iIncr)
+ {
+ for (int i = 0; i < iPlanes; i++)
+ {
+ memset (myBuffer.pszCompressedData, 0, m_dwWidth * m_dwLastRaster * m_iBPP);
+ myBuffer.dwTotalSize = 0;
+ p = bitmaps[i] + (y * m_dwWidth * m_iBPP);
+ iHeight = iIncr;
+ if (y + iIncr > m_dwLastRaster)
+ {
+ iHeight = m_dwLastRaster - y;
+ }
+
+ HPLJJBGCompress (m_dwWidth * 8 * m_iBPP, iHeight, &p, &myBuffer, &se);
+
+ if (i == 0)
+ {
+ StartPage (se.xd, se.yd);
+ }
+ err = this->SendPlaneData (i + 1, &se, &myBuffer, (y + iIncr) >= m_dwLastRaster);
+ }
+ }
+
+ delete [] myBuffer.pszCompressedData;
+ m_dwCurrentRaster = 0;
+ m_pszCurPtr = m_pszInputRasterData;
+ memset (m_pszCurPtr, 0, (m_dwWidth * m_dwLastRaster * iPlanes * m_iBPP));
+
+ err = EndPage ();
+
+ return err;
+}
+
+
+/*JBig Compress for LJZjsColor-2 Printers
+Separate function written for LJZjsColor-2 Printers, since for them, compression is done for whole plane data at a time
+whereas for other deiveces, compression is done for 100 lines of each plane*/
+DRIVER_ERROR LJZjs::JbigCompress_LJZjsColor2 ()
+{
+ DRIVER_ERROR err = NO_ERROR;
+ HPLJZjcBuff myBuffer;
+
+ int iPlanes = (m_cmColorMode == COLOR) ? 4 : 1;
+ int arrPlanesOrder[] = {3,2,1,4};
+ int nByteCount = 0;
+ int iHeight = 0;
+
+ HPLJZjsJbgEncSt se;
+ BYTE *pbUnCompressedData = NULL;
+
+ BYTE *bitmaps[4] =
+ {
+ m_pszInputRasterData,
+ m_pszInputRasterData + (m_dwWidth * m_iBPP * m_dwLastRaster),
+ m_pszInputRasterData + (m_dwWidth * m_iBPP * m_dwLastRaster * 2),
+ m_pszInputRasterData + (m_dwWidth * m_iBPP * m_dwLastRaster * 3)
+ };
+
+ myBuffer.pszCompressedData = new BYTE[m_dwWidth * m_dwLastRaster * m_iBPP];
+ if(NULL == myBuffer.pszCompressedData)
+ {
+ return ALLOCMEM_ERROR;
+ }
+ myBuffer.dwTotalSize = 0;
+
+ for (int nPlaneCount = 0; nPlaneCount < iPlanes; nPlaneCount++)
+ {
+
+ memset (myBuffer.pszCompressedData, 0, m_dwWidth * m_dwLastRaster * m_iBPP);
+ myBuffer.dwTotalSize = 0;
+
+ if(4 == iPlanes)/*If there are 4 planes follow LJZjsColor-2 order of 3 2 1 4*/
+ {
+ pbUnCompressedData = bitmaps[arrPlanesOrder[nPlaneCount]-1] ;
+ }
+ else /* Should not happen */
+ {
+ return SYSTEM_ERROR;
+ }
+
+
+ iHeight = m_dwLastRaster; /*Send all scan lines at one go*/
+
+ HPLJJBGCompress (m_dwWidth * 8 * m_iBPP, iHeight, &pbUnCompressedData, &myBuffer, &se);
+
+ if(0 == nPlaneCount)
+ {
+ StartPage (se.xd, se.yd);
+ }
+
+ err = this->SendPlaneData (arrPlanesOrder[nPlaneCount], &se, &myBuffer, FALSE);
+
+ }
+
+ delete [] myBuffer.pszCompressedData;
+ m_dwCurrentRaster = 0;
+ m_pszCurPtr = m_pszInputRasterData;
+ memset (m_pszCurPtr, 0, (m_dwWidth * m_dwLastRaster * iPlanes * m_iBPP));
+
+ err = EndPage ();
+
+ return err;
+}
+
+DRIVER_ERROR HeaderLJZjs::EndJob ()
+{
+ DRIVER_ERROR err = NO_ERROR;
+ char szStr[64];
+
+ if (((LJZjs *) thePrinter)->m_iPrinterType == eLJM1005)
+ {
+ memset (szStr, 0, 8);
+ szStr[3] = 2;
+ strcpy ((char *) szStr+8, "\x1B\x25-12345X@PJL EOJ\x0D\x0A\x1B\x25-12345X");
+ err = thePrinter->Send ((const BYTE *) szStr, 8 + strlen ((char *) (szStr+8)));
+ return err;
+ }
+
+
+ memset (szStr, 0, 64);
+
+ szStr[3] = 16;
+ szStr[7] = ZJT_END_DOC;
+ szStr[14] = 'Z';
+ szStr[15] = 'Z';
+ err = thePrinter->Send ((const BYTE *) szStr, 16);
+ return err;
+}
+
+Header *LJZjs::SelectHeader (PrintContext* pc)
+{
+ DRIVER_ERROR err = NO_ERROR;
+ DWORD dwSize;
+ int iPlanes = 1;
+ QUALITY_MODE cqm;
+ MEDIATYPE cmt;
+ BOOL cdt;
+ err = pc->GetPrintModeSettings (cqm, cmt, m_cmColorMode, cdt);
+
+ if (m_cmColorMode == COLOR && m_bIamColor)
+ {
+ iPlanes = 4;
+ m_iP[0] = 3;
+ }
+ m_dwWidth = pc->OutputPixelsPerRow () / 8;
+ if (m_dwWidth % 8)
+ {
+ m_dwWidth = (m_dwWidth / 8 + 1) * 8;
+ }
+ m_dwLastRaster = (int) (pc->PrintableHeight () * pc->EffectiveResolutionY () + 0.5);
+ dwSize = m_dwWidth * m_dwLastRaster * iPlanes * m_iBPP;
+ m_pszInputRasterData = new BYTE[dwSize];
+ if (m_pszInputRasterData == NULL)
+ {
+ return NULL;
+ }
+ m_pszCurPtr = m_pszInputRasterData;
+ memset (m_pszCurPtr, 0, dwSize);
+ thePrintContext = pc;
+ return new HeaderLJZjs (this,pc);
+}
+
+DRIVER_ERROR LJZjs::VerifyPenInfo()
+{
+
+ ePen = BOTH_PENS;
+ return NO_ERROR;
+}
+
+DRIVER_ERROR LJZjs::ParsePenInfo (PEN_TYPE& ePen, BOOL QueryPrinter)
+{
+
+ ePen = BOTH_PENS;
+
+ return NO_ERROR;
+}
+
+APDK_END_NAMESPACE
+
+#endif // defined APDK_LJZJS_MONO || defined APDK_LJZJS_COLOR || defined APDK_LJM1005
diff --git a/prnt/hpijs/ljzjs.h b/prnt/hpijs/ljzjs.h
new file mode 100644
index 0000000..1ec7f76
--- /dev/null
+++ b/prnt/hpijs/ljzjs.h
@@ -0,0 +1,213 @@
+/*****************************************************************************\
+ ljzjs.h : Interface for the LJZjs class
+
+ Copyright (c) 1996 - 2007, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#ifndef APDK_LJZJS_H
+#define APDK_LJZJS_H
+
+#if defined (APDK_LJZJS_MONO) || defined (APDK_LJZJS_COLOR) || defined (APDK_LJM1005)
+
+#include "hpjbig_wrapper.h"
+
+APDK_BEGIN_NAMESPACE
+
+
+/*!
+\internal
+*/
+class LJZjs : public Printer
+{
+public:
+ LJZjs (SystemServices* pSS, int numfonts = 0, BOOL proto = FALSE);
+ ~LJZjs ();
+
+ virtual Header* SelectHeader (PrintContext* pc);
+ virtual DRIVER_ERROR VerifyPenInfo ();
+ virtual DRIVER_ERROR ParsePenInfo (PEN_TYPE& ePen, BOOL QueryPrinter = TRUE);
+ virtual DRIVER_ERROR Encapsulate (const RASTERDATA *pRasterData, BOOL bLastPlane)
+ {
+ return SYSTEM_ERROR;
+ }
+ virtual DRIVER_ERROR Flush (int FlushSize);
+ virtual DRIVER_ERROR SkipRasters (int iBlankRasters);
+ int SendChunkHeader (BYTE *szStr, DWORD dwSize, DWORD dwChunkType, DWORD dwNumItems);
+ int SendItem (BYTE *szStr, BYTE cType, WORD wItem, DWORD dwValue, DWORD dwExtra = 0);
+ int SendIntItem (BYTE *szStr, int iItem, int iItemType, int iItemValue);
+ DRIVER_ERROR SendChunkAndItemHeader (BYTE type, void *obj);
+
+ virtual BOOL GetMargins (PAPER_SIZE ps, float *fMargins)
+ {
+ fMargins[0] = (float) 0.25;
+ fMargins[1] = (float) 0.25;
+ fMargins[2] = (float) 0.2;
+ fMargins[3] = (float) 0.2;
+ return TRUE;
+ }
+ PRINTER_TYPE m_iPrinterType;
+
+protected:
+
+#ifdef APDK_HP_UX
+ virtual LJZjs & operator = (Printer& rhs)
+ {
+ return *this;
+ }
+#endif
+
+//private:
+ int MapPaperSize ();
+ DRIVER_ERROR JbigCompress ();
+ DRIVER_ERROR JbigCompress_LJZjsColor2 ();
+ DRIVER_ERROR SendItemData (BYTE ItemType, WORD Item, DWORD dwValue);
+ DRIVER_ERROR StartPage (DWORD dwWidth, DWORD dwHeight);
+ virtual DRIVER_ERROR EndPage ()
+ {
+ return SYSTEM_ERROR;
+ }
+ virtual DRIVER_ERROR SendPlaneData (int iPlaneNumber, HPLJZjsJbgEncSt *se, HPLJZjcBuff *pcBuff, BOOL bLastStride)
+ {
+ return SYSTEM_ERROR;
+ }
+ virtual int GetOutputResolutionY ()
+ {
+ return 600;
+ }
+
+ static const unsigned char szByte1[256];
+ static const unsigned char szByte2[256];
+ void *m_hHPLibHandle;
+
+ DWORD m_dwWidth;
+ DWORD m_dwCurrentRaster;
+ DWORD m_dwLastRaster;
+ BYTE *m_pszInputRasterData;
+ BYTE *m_pszCurPtr;
+ PrintContext *thePrintContext;
+ BOOL m_bStartPageSent;
+ COLORMODE m_cmColorMode;
+ BOOL m_bIamColor;
+ int m_iPlaneNumber;
+ int m_iBPP;
+ int m_iP[4];
+ BOOL m_bLJZjsColor2Printer ; /*TRUE when the Printer model follows LJZjsColor-2 encapsulation format, else FALSE*/
+}; // LJZjs
+
+typedef enum
+{
+ ZJT_START_DOC,
+ ZJT_END_DOC,
+ ZJT_START_PAGE,
+ ZJT_END_PAGE,
+ ZJT_JBIG_BIH,
+ ZJT_JBIG_HID,
+ ZJT_END_JBIG,
+ ZJT_SIGNATURE,
+ ZJT_RAW_IMAGE,
+ ZJT_START_PLANE,
+ ZJT_END_PLANE,
+ ZJT_PAUSE,
+ ZJT_BITMAP
+} CHUNK_TYPE;
+
+typedef enum
+{
+/* 0x00*/ ZJI_PAGECOUNT,
+/* 0x01*/ ZJI_DMCOLLATE,
+/* 0x02*/ ZJI_DMDUPLEX,
+
+/* 0x03*/ ZJI_DMPAPER,
+/* 0x04*/ ZJI_DMCOPIES,
+/* 0x05*/ ZJI_DMDEFAULTSOURCE,
+/* 0x06*/ ZJI_DMMEDIATYPE,
+/* 0x07*/ ZJI_NBIE,
+/* 0x08*/ ZJI_RESOLUTION_X,
+/* 0x09*/ ZJI_RESOLUTION_Y,
+/* 0x0A */ ZJI_OFFSET_X,
+/* 0x0B */ ZJI_OFFSET_Y,
+/* 0x0C */ ZJI_RASTER_X,
+/* 0x0D */ ZJI_RASTER_Y,
+
+/* 0x0E */ ZJI_COLLATE,
+/* 0x0F */ ZJI_QUANTITY,
+
+/* 0x10 */ ZJI_VIDEO_BPP,
+/* 0x11 */ ZJI_VIDEO_X,
+/* 0x12 */ ZJI_VIDEO_Y,
+/* 0x13 */ ZJI_INTERLACE,
+/* 0x14 */ ZJI_PLANE,
+/* 0x15 */ ZJI_PALETTE,
+
+/* 0x16 */ ZJI_RET,
+/* 0x17 */ ZJI_TONER_SAVE,
+
+/* 0x18 */ ZJI_MEDIA_SIZE_X,
+/* 0x19 */ ZJI_MEDIA_SIZE_Y,
+/* 0x1A */ ZJI_MEDIA_SIZE_UNITS,
+
+/* 0x1B */ ZJI_CHROMATIC,
+
+/* 0x63 */ ZJI_PAD = 99,
+
+/* 0x64 */ ZJI_PROMPT,
+
+/* 0x65 */ ZJI_BITMAP_TYPE,
+/* 0x66 */ ZJI_ENCODING_DATA,
+/* 0x67 */ ZJI_END_PLANE,
+
+/* 0x68 */ ZJI_BITMAP_PIXELS,
+/* 0x69 */ ZJI_BITMAP_LINES,
+/* 0x6A */ ZJI_BITMAP_BPP,
+/* 0x6B */ ZJI_BITMAP_STRIDE,
+
+} ZJ_ITEM;
+
+typedef enum
+{
+ RET_OFF = 0,
+ RET_ON,
+ RET_AUTO,
+ RET_LIGHT,
+ RET_MEDIUM,
+ RET_DARK
+} RET_VALUE;
+
+typedef enum
+{
+ ZJIT_UINT32 = 1,
+ ZJIT_INT32,
+ ZJIT_STRING,
+ ZJIT_BYTELUT
+} CHUNK_ITEM_TYPE;
+
+APDK_END_NAMESPACE
+
+#endif // defned (APDK_LJZJS_MONO) || defined (APDK_LJZJS_COLOR) || defined (APDK_LJM1005)
+#endif //APDK_LJZJS_H
+
diff --git a/prnt/hpijs/ljzjscolor.cpp b/prnt/hpijs/ljzjscolor.cpp
new file mode 100644
index 0000000..ebb45e3
--- /dev/null
+++ b/prnt/hpijs/ljzjscolor.cpp
@@ -0,0 +1,541 @@
+/*****************************************************************************\
+ ljzjscolor.cpp : Implementation for the LJZjsColor class
+
+ Copyright (c) 1996 - 2006, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#ifdef APDK_LJZJS_COLOR
+
+#include "header.h"
+#include "io_defs.h"
+#include "printerproxy.h"
+#include "resources.h"
+#include "ljzjs.h"
+#include "ljzjscolor.h"
+
+APDK_BEGIN_NAMESPACE
+
+#define LJZJSCOLOR2DEVICESCOUNT 8
+
+extern uint32_t ulMapGRAY_K_6x6x1[9 * 9 * 9];
+
+extern uint32_t ulMapDJ600_CCM_K[9 * 9 * 9];
+extern uint32_t ulMapDJ970_KCMY[9 * 9 * 9];
+extern unsigned char ucMapDJ4100_KCMY_Photo_BestA_12x12x1[];
+extern unsigned char ucMapDJ4100_KCMY_Photo_BestV_12x12x1[];
+extern unsigned char ucMapDJ4100_KCMY_BestA_12x12x1[];
+extern unsigned char ucMapDJ4100_KCMY_BestS_12x12x1[];
+extern BYTE *GetHT12x12x1_4100_Photo_Best ();
+
+LJZjsColor::LJZjsColor (SystemServices* pSS, int numfonts, BOOL proto)
+ : LJZjs (pSS, numfonts, proto)
+{
+
+ ePen = BOTH_PENS;
+
+ pMode[GRAYMODE_INDEX] = new LJZjsColorDraftGrayMode ();
+ pMode[DEFAULTMODE_INDEX] = new LJZjsColorNormalGrayMode ();
+ pMode[SPECIALMODE_INDEX] = new LJZjsColorDraftColorMode ();
+ pMode[SPECIALMODE_INDEX+1] = new LJZjsColorNormalColorMode ();
+ ModeCount = 4;
+
+ CMYMap = NULL;
+#ifdef APDK_AUTODUPLEX
+ m_bRotateBackPage = FALSE; // Lasers don't require back side image to be rotated
+#endif
+ m_pszInputRasterData = NULL;
+ m_dwCurrentRaster = 0;
+ m_cmColorMode = GREY_K;
+ m_bStartPageSent = FALSE;
+ m_iPlaneNumber = 0;
+ m_iBPP = 2; // Setting this to 1 will cause problems
+ for (int i = 1; i < 4; i++)
+ {
+ m_iP[i] = i - 1; //{3, 0, 1, 2};
+ }
+ m_iP[0] = 3;
+ m_bIamColor = TRUE;
+ m_iPrinterType = eLJZjsColor;
+
+ /*Checking for LJZjsColor-2 format Printers*/
+ m_bLJZjsColor2Printer = IsLJZjsColor2Printer(pSS);
+}
+
+LJZjsColor::~LJZjsColor ()
+{
+}
+
+/*
+ * Draft
+ * Gray
+ */
+LJZjsColorDraftGrayMode::LJZjsColorDraftGrayMode ()
+: GrayMode(/*ulMapDJ600_CCM_K*/ulMapGRAY_K_6x6x1)
+{
+
+ ResolutionX[0] =
+ ResolutionY[0] = 600;
+ BaseResX =
+ BaseResY = 600;
+ MixedRes = FALSE;
+ bFontCapable = FALSE;
+ theQuality = qualityDraft;
+ pmQuality = QUALITY_DRAFT;
+#ifdef APDK_AUTODUPLEX
+ bDuplexCapable = TRUE;
+#endif
+ Config.bCompress = FALSE;
+}
+
+/*
+ * Normal
+ * Gray
+ */
+LJZjsColorNormalGrayMode::LJZjsColorNormalGrayMode ()
+: GrayMode(/*ulMapDJ600_CCM_K*/ulMapGRAY_K_6x6x1)
+{
+
+ ResolutionX[0] =
+ ResolutionY[0] = 600;
+ BaseResX =
+ BaseResY = 600;
+ TextRes = 600;
+ MixedRes = FALSE;
+ bFontCapable = FALSE;
+#ifdef APDK_AUTODUPLEX
+ bDuplexCapable = TRUE;
+#endif
+ Config.bCompress = FALSE;
+}
+
+/*
+ * Draft
+ * Color
+ */
+LJZjsColorDraftColorMode::LJZjsColorDraftColorMode ()
+: PrintMode(ulMapDJ970_KCMY)
+{
+ cmap.ulMap1 =
+ cmap.ulMap2 = NULL;
+ cmap.ulMap3 = (unsigned char *) ucMapDJ4100_KCMY_Photo_BestA_12x12x1;
+ ColorFEDTable = GetHT12x12x1_4100_Photo_Best ();
+
+ ResolutionX[0] = ResolutionY[0] = 600;
+ BaseResX = BaseResY = 600;
+ TextRes = 600;
+ MixedRes = FALSE;
+ bFontCapable = FALSE;
+ pmQuality = QUALITY_DRAFT;
+ theQuality = qualityDraft;
+#ifdef APDK_AUTODUPLEX
+ bDuplexCapable = TRUE;
+#endif
+ Config.bCompress = FALSE;
+}
+
+
+/*
+ * Normal
+ * Color
+ */
+LJZjsColorNormalColorMode::LJZjsColorNormalColorMode ()
+: PrintMode(ulMapDJ970_KCMY)
+{
+ cmap.ulMap1 =
+ cmap.ulMap2 = NULL;
+ cmap.ulMap3 = (unsigned char *) ucMapDJ4100_KCMY_Photo_BestA_12x12x1;
+
+ ColorFEDTable = GetHT12x12x1_4100_Photo_Best ();
+
+ for (int i = 0; i < 4; i++)
+ {
+ ColorDepth[i] = 1;
+
+ ResolutionX[i] = 600;
+ ResolutionY[i] = 600;
+ }
+// ColorDepth[0] = 1;
+ ResolutionX[0] =
+ ResolutionY[0] = 600;
+ BaseResX =
+ BaseResY = 600;
+ TextRes = 600;
+ MixedRes = FALSE;
+ bFontCapable = FALSE;
+ pmQuality = QUALITY_NORMAL;
+#ifdef APDK_AUTODUPLEX
+ bDuplexCapable = TRUE;
+#endif
+ Config.bCompress = FALSE;
+}
+
+DRIVER_ERROR LJZjsColor::Encapsulate (const RASTERDATA *pRasterData, BOOL bLastPlane)
+{
+ DRIVER_ERROR err = NO_ERROR;
+ if( m_cmColorMode == COLOR )
+ {
+ if (pRasterData != NULL)
+ {
+ BYTE *p = m_pszCurPtr + (m_iP[m_iPlaneNumber] * m_dwWidth * m_iBPP) * m_dwLastRaster;
+ for (int i = 0; i < pRasterData->rastersize[COLORTYPE_COLOR]; i++)
+ {
+ p[i*m_iBPP] = szByte1[pRasterData->rasterdata[COLORTYPE_COLOR][i]];
+ p[i*m_iBPP+1] = szByte2[pRasterData->rasterdata[COLORTYPE_COLOR][i]];
+ p[i*m_iBPP] |= (p[i*m_iBPP] >> 1);
+ p[i*m_iBPP+1] |= (p[i*m_iBPP+1] >> 1);
+ }
+ }
+ m_iPlaneNumber++;
+
+ if (bLastPlane)
+ {
+ m_dwCurrentRaster++;
+ m_pszCurPtr += m_iBPP * m_dwWidth;
+ m_iPlaneNumber = 0;
+ }
+
+ }
+ else
+ {
+ if (pRasterData != NULL)
+ {
+ for (int i = 0; i < pRasterData->rastersize[COLORTYPE_COLOR]; i++)
+ {
+ m_pszCurPtr[i*m_iBPP] = szByte1[pRasterData->rasterdata[COLORTYPE_COLOR][i]];
+ m_pszCurPtr[i*m_iBPP+1] = szByte2[pRasterData->rasterdata[COLORTYPE_COLOR][i]];
+ m_pszCurPtr[i*m_iBPP] |= (m_pszCurPtr[i*m_iBPP] >> 1);
+ m_pszCurPtr[i*m_iBPP+1] |= (m_pszCurPtr[i*m_iBPP+1] >> 1);
+ }
+ }
+
+ m_dwCurrentRaster++;
+ m_pszCurPtr += (m_iBPP * m_dwWidth);
+ }
+
+ if (m_dwCurrentRaster == m_dwLastRaster)
+ {
+ if(TRUE == m_bLJZjsColor2Printer)
+ {
+ err = JbigCompress_LJZjsColor2 ();
+ }
+ else
+ {
+ err = JbigCompress();
+ }
+ }
+ return err;
+}
+
+DRIVER_ERROR LJZjsColor::EndPage ()
+{
+ DRIVER_ERROR err = NO_ERROR;
+ BYTE szStr[256];
+ int i = 0;
+ int iCol = (m_cmColorMode == COLOR) ? 1 : 0;
+
+ i = SendChunkHeader (szStr, 112, ZJT_END_PAGE, 8);
+ for (int j = 0; j < 8; j++)
+ {
+ i += SendItem (szStr+i, ZJIT_UINT32, 0x8200+j, (j % 4 == 3) ? 1 : iCol);
+ }
+ err = Send ((const BYTE *) szStr, 112);
+
+ m_bStartPageSent = FALSE;
+
+ m_dwCurrentRaster = 0;
+ m_pszCurPtr = m_pszInputRasterData;
+
+ return err;
+}
+
+/*
+SendPlaneData
+Description: Call the appropriate SendPlaneData based on whether its LJZjsColor-2 printer or not
+Arguments:
+se: Not used for LJZjsColor-2 printer. Otherwise used to send header for last stride
+pcBuff: Pointer to struct having Compressed Data and size
+bLastStride: Last scan line. Not used for LJZjsColor-2 printer. Used to send header otherwise.
+*/
+DRIVER_ERROR LJZjsColor::SendPlaneData (int iPlaneNumber, HPLJZjsJbgEncSt *se, HPLJZjcBuff *pcBuff, BOOL bLastStride)
+{
+ DRIVER_ERROR err = NO_ERROR;
+ if(TRUE == m_bLJZjsColor2Printer)
+ {
+ err = SendPlaneData_LJZjsColor2 (iPlaneNumber,se, pcBuff,bLastStride);
+ }
+ else
+ {
+ err = SendPlaneData_LJZjsColor (iPlaneNumber, se, pcBuff, bLastStride);
+ }
+ return err;
+}
+
+DRIVER_ERROR LJZjsColor::SendPlaneData_LJZjsColor (int iPlaneNumber, HPLJZjsJbgEncSt *se, HPLJZjcBuff *pcBuff, BOOL bLastStride)
+{
+ DRIVER_ERROR err = NO_ERROR;
+ BYTE szStr[256];
+ static BOOL bNotSent = TRUE;
+ int kEnd = (m_cmColorMode == COLOR) ? 5 : 2;
+ int i = 0;
+
+ /*
+ * Send JBIG header info
+ */
+
+ // Send out the JBIG header if first plane and it hasn't already been sent out yet.
+ if (iPlaneNumber == 1 && bNotSent)
+ {
+ bNotSent = FALSE;
+ i = 0;
+ for (int k = 1; k < kEnd; k++)
+ {
+ i = SendChunkHeader (szStr, 132, ZJT_BITMAP, 8);
+ szStr[13] += 20;
+ i += SendItem (szStr+i, ZJIT_UINT32, ZJI_BITMAP_TYPE, 1);
+ i += SendItem (szStr+i, ZJIT_UINT32, ZJI_BITMAP_PIXELS, se->xd);
+ i += SendItem (szStr+i, ZJIT_UINT32, ZJI_BITMAP_STRIDE, se->xd);
+ i += SendItem (szStr+i, ZJIT_UINT32, ZJI_BITMAP_LINES, se->yd);
+ i += SendItem (szStr+i, ZJIT_UINT32, ZJI_BITMAP_BPP, 1);
+ i += SendItem (szStr+i, ZJIT_UINT32, ZJI_VIDEO_BPP, m_iBPP);
+ i += SendItem (szStr+i, ZJIT_UINT32, ZJI_PLANE,
+ (m_cmColorMode == COLOR) ? k : 4);
+ i += SendItem (szStr+i, ZJIT_BYTELUT, ZJI_ENCODING_DATA, 20, 20);
+ szStr[i++] = se->dl;
+ szStr[i++] = se->d;
+ szStr[i++] = se->planes;
+ szStr[i++] = 0;
+ for (int j = 3; j >= 0; j--)
+ {
+ szStr[i] = (BYTE) ((se->xd >> (8 * j)) & 0xFF);
+ szStr[4+i] = (BYTE) ((se->yd >> (8 * j)) & 0xFF);
+ szStr[8+i] = (BYTE) ((se->l0 >> (8 * j)) & 0xFF);
+ i++;
+ }
+ i += 8;
+
+ szStr[i++] = se->mx;
+ szStr[i++] = se->my;
+ szStr[i++] = se->order;
+ szStr[i++] = se->options;
+ err = Send ((const BYTE *) szStr, 132);
+ ERRCHECK;
+ }
+ }
+
+ BYTE *p = pcBuff->pszCompressedData + 20;
+ int dwNumItems;
+ int dwSize;
+
+ pcBuff->dwTotalSize -= 20;
+ int iPadCount = 0;
+
+ i = 0;
+ if (pcBuff->dwTotalSize % 4)
+ {
+ iPadCount = ((pcBuff->dwTotalSize / 4 + 1) * 4) - pcBuff->dwTotalSize;
+ }
+
+ dwSize = 16 + pcBuff->dwTotalSize + iPadCount;
+ dwNumItems = 1;
+ if (bLastStride)
+ {
+ dwNumItems = 3;
+ bNotSent = TRUE;
+ }
+ dwSize += (dwNumItems * 12);
+ i = SendChunkHeader (szStr, dwSize, ZJT_BITMAP, dwNumItems);
+ i += SendItem (szStr+i, ZJIT_UINT32, ZJI_PLANE, (kEnd == 5) ? iPlaneNumber : 4);
+ if (bLastStride)
+ {
+ i += SendItem (szStr+i, ZJIT_UINT32, ZJI_BITMAP_LINES, se->yd);
+ i += SendItem (szStr+i, ZJIT_UINT32, ZJI_END_PLANE, bLastStride);
+ }
+ err = Send ((const BYTE *) szStr, i);
+ ERRCHECK;
+
+ err = Send ((const BYTE *) p, pcBuff->dwTotalSize);
+ ERRCHECK;
+ if (iPadCount != 0)
+ {
+ memset (szStr, 0, iPadCount);
+ err = Send ((const BYTE *) szStr, iPadCount);
+ }
+
+ return err;
+}
+
+
+
+/*SendPlaneData for LJZjsColor-2 printer
+Description: Send the compressed data for the particular plane. Data sent in chunks of max size 64k
+or 0x10000
+Arguments:
+se: Not used for LJZjsColor-2 printer
+pcBuff: Pointer to struct having Compressed Data and size
+bLastStride: Last scan line. Not used for LJZjsColor-2 printer.
+*/
+DRIVER_ERROR LJZjsColor::SendPlaneData_LJZjsColor2 (int iPlaneNumber, HPLJZjsJbgEncSt *se, HPLJZjcBuff *pcBuff, BOOL bLastStride)
+{
+ DRIVER_ERROR err = NO_ERROR;
+ BYTE szStr[256]; /*Buffer to send commands*/
+
+ BYTE *pbJBigData = NULL;
+
+ DWORD dwDataSize = 0; /*Holds the total size of compressed bytes to Send*/
+ DWORD dwMaxChunkSize = 0x10000; /*1 chunk can send 64k bytes. 64k = 0x10000*/
+ DWORD dwCurrentChunkSize = 0;
+ DWORD dwLoopCount = 0;
+
+ int iPadCount = 0;
+ int nByteCount = 0;
+
+ bool bLastChunk = FALSE;
+
+ memset (szStr, 0, sizeof(szStr));
+
+ /*Start Plane with item Plane*/
+ nByteCount = SendChunkHeader (szStr, 28, ZJT_START_PLANE, 1);
+ nByteCount += SendItem (szStr+nByteCount, ZJIT_UINT32, ZJI_PLANE,iPlaneNumber);
+
+ /**** Send JBIG header info ****/
+ nByteCount += SendChunkHeader (szStr+nByteCount, 36, ZJT_JBIG_BIH, 0);
+ err = Send ((const BYTE *) szStr, nByteCount);
+ ERRCHECK;
+
+ pbJBigData = pcBuff->pszCompressedData;
+ err = Send ((const BYTE *) pbJBigData, 20);
+ ERRCHECK;
+
+ pbJBigData += 20;/*First 20 bytes was JBIG header which is done*/
+ pcBuff->dwTotalSize -= 20;
+
+
+ if (pcBuff->dwTotalSize % 4) /*Make Data DWORD aligned by padding if reqd.*/
+ {
+ iPadCount = ((pcBuff->dwTotalSize / 4 + 1) * 4) - pcBuff->dwTotalSize;
+ }
+
+ dwDataSize = pcBuff->dwTotalSize;
+
+ /*Send the Compressed Data in chunks of 0x10000 (~64k)*/
+ for(dwLoopCount = 0; dwLoopCount < dwDataSize ; dwLoopCount +=dwMaxChunkSize)
+ {
+ memset (szStr, 0, sizeof(szStr));
+ dwCurrentChunkSize = dwMaxChunkSize;
+
+ if(dwLoopCount+dwCurrentChunkSize > dwDataSize)
+ {
+ dwCurrentChunkSize = dwDataSize - (dwLoopCount);
+ bLastChunk = TRUE;
+ }
+ if (!bLastChunk)
+ {
+ nByteCount = SendChunkHeader (szStr, dwCurrentChunkSize + 16, ZJT_JBIG_HID, 0);
+ }
+ else /*For last chunk add the pad count size and send header*/
+ {
+ nByteCount = SendChunkHeader (szStr, dwCurrentChunkSize + 16 + iPadCount, ZJT_JBIG_HID, 0);
+ }
+ err = Send ((const BYTE *) szStr, nByteCount);
+ ERRCHECK;
+
+ err = Send ((const BYTE *) pbJBigData, dwCurrentChunkSize);
+ ERRCHECK;
+
+ pbJBigData+=dwCurrentChunkSize;
+ }
+ if(iPadCount != 0)
+ {
+ memset (szStr, 0, iPadCount);
+ err = Send ((const BYTE *) szStr, iPadCount);
+ }
+
+ memset (szStr, 0, sizeof(szStr));
+
+ /*End JBig and then End Plane with item Plane*/
+
+ nByteCount = SendChunkHeader (szStr, 16, ZJT_END_JBIG, 0);
+
+ nByteCount += SendChunkHeader (szStr+nByteCount, 28, ZJT_END_PLANE, 1);
+ nByteCount += SendItem (szStr+nByteCount, ZJIT_UINT32, ZJI_PLANE,iPlaneNumber);
+
+ err = Send ((const BYTE *) szStr, nByteCount);
+ ERRCHECK;
+
+ return err;
+}
+
+DRIVER_ERROR LJZjsColor::VerifyPenInfo()
+{
+ ePen = BOTH_PENS;
+ return NO_ERROR;
+}
+
+DRIVER_ERROR LJZjsColor::ParsePenInfo (PEN_TYPE& ePen, BOOL QueryPrinter)
+{
+ ePen = BOTH_PENS;
+
+ return NO_ERROR;
+}
+
+bool LJZjsColor::IsLJZjsColor2Printer(SystemServices* pSS)
+{
+ if (pSS == NULL)
+ return false;
+ char szLJZjsColor2ModelNames[LJZJSCOLOR2DEVICESCOUNT][25] = {
+ "HP LaserJet CP1025\0",
+ "HP LaserJet CP1021\0",
+ "HP LaserJet CP1022\0",
+ "HP LaserJet CP1023\0",
+ "HP LaserJet CP1025nw\0",
+ "HP LaserJet CP1026nw\0",
+ "HP LaserJet CP1027nw\0",
+ "HP LaserJet CP1028nw\0"
+ }; //Device models that follow LJZjsColor-2 encapsulation format
+
+ BYTE strDeviceID[DevIDBuffSize];
+ DRIVER_ERROR err;
+ bool bLJZjsColor2Printer = FALSE;
+ err = pSS->GetDeviceID(strDeviceID,DevIDBuffSize,FALSE);
+
+ for(int i=0; i< LJZJSCOLOR2DEVICESCOUNT; i++)
+ {
+ if( NO_ERROR == err &&
+ (strnlen((const char*)strDeviceID, DevIDBuffSize)< DevIDBuffSize) &&
+ (strstr((const char*)strDeviceID, (const char*)szLJZjsColor2ModelNames[i])))
+ {
+ bLJZjsColor2Printer = TRUE;
+ break;
+ }
+ }
+ return bLJZjsColor2Printer;
+}
+
+APDK_END_NAMESPACE
+
+#endif // defined APDK_LJZJS_COLOR
diff --git a/prnt/hpijs/ljzjscolor.h b/prnt/hpijs/ljzjscolor.h
new file mode 100644
index 0000000..1492b7e
--- /dev/null
+++ b/prnt/hpijs/ljzjscolor.h
@@ -0,0 +1,119 @@
+/*****************************************************************************\
+ ljzjscolor.h : Interface for the LJZjsColor class
+
+ Copyright (c) 1996 - 2006, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#ifndef APDK_LJZJS_COLOR_H
+#define APDK_LJZJS_COLOR_H
+
+APDK_BEGIN_NAMESPACE
+
+/*!
+\internal
+*/
+class LJZjsColor : public LJZjs
+{
+public:
+ LJZjsColor (SystemServices* pSS, int numfonts = 0, BOOL proto = FALSE);
+ ~LJZjsColor ();
+
+ virtual DRIVER_ERROR VerifyPenInfo ();
+ virtual DRIVER_ERROR ParsePenInfo (PEN_TYPE& ePen, BOOL QueryPrinter = TRUE);
+ virtual DRIVER_ERROR Encapsulate (const RASTERDATA *pRasterData, BOOL bLastPlane);
+
+protected:
+
+#ifdef APDK_HP_UX
+ virtual LJZjsColor & operator = (Printer& rhs)
+ {
+ return *this;
+ }
+#endif
+
+private:
+ bool IsLJZjsColor2Printer(SystemServices* pSS);
+ virtual DRIVER_ERROR EndPage ();
+ virtual DRIVER_ERROR SendPlaneData (int iPlaneNumber, HPLJZjsJbgEncSt *se, HPLJZjcBuff *pcBuff, BOOL bLastStride);
+ virtual DRIVER_ERROR SendPlaneData_LJZjsColor (int iPlaneNumber, HPLJZjsJbgEncSt *se, HPLJZjcBuff *pcBuff, BOOL bLastStride);
+ virtual DRIVER_ERROR SendPlaneData_LJZjsColor2 (int iPlaneNumber, HPLJZjsJbgEncSt *se, HPLJZjcBuff *pcBuff, BOOL bLastStride);
+
+}; // LJZjsColor
+
+class LJZjsColorDraftGrayMode : public GrayMode
+{
+public:
+ LJZjsColorDraftGrayMode ();
+}; // LJZjsColorDraftGrayMode
+
+class LJZjsColorNormalGrayMode : public GrayMode
+{
+public:
+ LJZjsColorNormalGrayMode ();
+}; // LJZjsColorNormalGrayMode
+
+class LJZjsColorDraftColorMode : public PrintMode
+{
+public:
+ LJZjsColorDraftColorMode ();
+}; // LJZjsColorDraftColorMode
+
+class LJZjsColorNormalColorMode : public PrintMode
+{
+public:
+ LJZjsColorNormalColorMode ();
+}; // LJZjsColorNormalColorMode
+
+//! LJZjsColorProxy
+/*!
+******************************************************************************/
+class LJZjsColorProxy : public PrinterProxy
+{
+public:
+ LJZjsColorProxy() : PrinterProxy(
+ "LJZjsColor", // family name
+ "HP Color LaserJet 1600\0" // models with null at end of each
+ "HP Color LaserJet 2600n\0"
+ "HP Color LaserJet CP1215\0"
+ "HP LaserJet CP1025\0"
+ "HP LaserJet CP1021\0"
+ "HP LaserJet CP1022\0"
+ "HP LaserJet CP1023\0"
+ "HP LaserJet CP1025nw\0"
+ "HP LaserJet CP1026nw\0"
+ "HP LaserJet CP1027nw\0"
+ "HP LaserJet CP1028nw\0"
+ ) {m_iPrinterType = eLJZjsColor;}
+ inline Printer* CreatePrinter(SystemServices* pSS) const { return new LJZjsColor(pSS); }
+ inline PRINTER_TYPE GetPrinterType() const { return eLJZjsColor;}
+ inline unsigned int GetModelBit() const { return 0x40;}
+};
+
+APDK_END_NAMESPACE
+
+#endif //APDK_LJZJS_COLOR_H
diff --git a/prnt/hpijs/ljzjsmono.cpp b/prnt/hpijs/ljzjsmono.cpp
new file mode 100644
index 0000000..48556e1
--- /dev/null
+++ b/prnt/hpijs/ljzjsmono.cpp
@@ -0,0 +1,211 @@
+/*****************************************************************************\
+ ljzjsmono.cpp : Implementation for the LJZjsMono class
+
+ Copyright (c) 1996 - 2007, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+#ifdef APDK_LJZJS_MONO
+
+#include "header.h"
+#include "io_defs.h"
+#include "printerproxy.h"
+#include "resources.h"
+#include "ljzjs.h"
+#include "ljzjsmono.h"
+
+APDK_BEGIN_NAMESPACE
+
+extern uint32_t ulMapGRAY_K_6x6x1[9 * 9 * 9];
+
+extern uint32_t ulMapDJ600_CCM_K[9 * 9 * 9];
+
+LJZjsMono::LJZjsMono (SystemServices* pSS, int numfonts, BOOL proto)
+ : LJZjs (pSS, numfonts, proto)
+{
+
+ ePen = BLACK_PEN;
+
+ pMode[GRAYMODE_INDEX] = new LJZjsMonoDraftGrayMode ();
+ pMode[DEFAULTMODE_INDEX] = new LJZjsMonoNormalGrayMode ();
+ ModeCount = 2;
+
+ CMYMap = NULL;
+#ifdef APDK_AUTODUPLEX
+ m_bRotateBackPage = FALSE; // Lasers don't require back side image to be rotated
+#endif
+ m_pszInputRasterData = NULL;
+ m_dwCurrentRaster = 0;
+ m_cmColorMode = GREY_K;
+ m_bStartPageSent = FALSE;
+ m_iPlaneNumber = 0;
+ m_iBPP = 1;
+ for (int i = 1; i < 4; i++)
+ {
+ m_iP[i] = i - 1; //{3, 0, 1, 2};
+ }
+ m_iP[0] = 0;
+ m_bIamColor = FALSE;
+ m_iPrinterType = eLJZjsMono;
+}
+
+LJZjsMono::~LJZjsMono ()
+{
+}
+
+LJZjsMonoDraftGrayMode::LJZjsMonoDraftGrayMode ()
+: GrayMode(/*ulMapDJ600_CCM_K*/ulMapGRAY_K_6x6x1)
+{
+
+ ResolutionX[0] =
+ ResolutionY[0] = 600;
+ BaseResX =
+ BaseResY = 600;
+ MixedRes = FALSE;
+ bFontCapable = FALSE;
+ theQuality = qualityDraft;
+ pmQuality = QUALITY_DRAFT;
+#ifdef APDK_AUTODUPLEX
+ bDuplexCapable = TRUE;
+#endif
+ Config.bCompress = FALSE;
+ medium = mediaAuto; // compatible with any media type
+}
+
+LJZjsMonoNormalGrayMode::LJZjsMonoNormalGrayMode ()
+: GrayMode(/*ulMapDJ600_CCM_K*/ulMapGRAY_K_6x6x1)
+{
+
+ ResolutionX[0] =
+ ResolutionY[0] = 600;
+ BaseResX =
+ BaseResY = 600;
+ TextRes = 600;
+ MixedRes = FALSE;
+ bFontCapable = FALSE;
+#ifdef APDK_AUTODUPLEX
+ bDuplexCapable = TRUE;
+#endif
+ Config.bCompress = FALSE;
+ medium = mediaAuto; // compatible with any media type
+}
+
+DRIVER_ERROR LJZjsMono::Encapsulate (const RASTERDATA *pRasterData, BOOL bLastPlane)
+{
+ if (pRasterData != NULL)
+ {
+ memcpy (m_pszCurPtr, pRasterData->rasterdata[COLORTYPE_COLOR],
+ pRasterData->rastersize[COLORTYPE_COLOR]);
+ }
+
+ m_dwCurrentRaster++;
+ m_pszCurPtr += m_dwWidth;
+ if (m_dwCurrentRaster == m_dwLastRaster)
+ {
+ JbigCompress ();
+ }
+ return NO_ERROR;
+}
+
+DRIVER_ERROR LJZjsMono::EndPage ()
+{
+ DRIVER_ERROR err = NO_ERROR;
+ BYTE szStr[16];
+
+ SendChunkHeader (szStr, 16, ZJT_END_PAGE, 0);
+ err = Send ((const BYTE *) szStr, 16);
+
+ m_bStartPageSent = FALSE;
+
+ m_dwCurrentRaster = 0;
+ m_pszCurPtr = m_pszInputRasterData;
+
+ return err;
+}
+
+DRIVER_ERROR LJZjsMono::SendPlaneData (int iPlaneNumber, HPLJZjsJbgEncSt *se, HPLJZjcBuff *pcBuff, BOOL bLastStride)
+{
+ DRIVER_ERROR err = NO_ERROR;
+ BYTE szStr[36];
+ int i = 0;
+
+/*
+ * Send JBIG header info
+ */
+
+ i = SendChunkHeader (szStr, 36, ZJT_JBIG_BIH, 0);
+
+ memcpy (szStr + 16, pcBuff->pszCompressedData, 20);
+ err = Send ((const BYTE *) szStr, 36);
+ ERRCHECK;
+
+ pcBuff->dwTotalSize -= 20;
+ int iPadCount = 0;
+ if (pcBuff->dwTotalSize % 16)
+ {
+ iPadCount = ((pcBuff->dwTotalSize / 16 + 1) * 16) - pcBuff->dwTotalSize;
+ }
+ DWORD dwTotal = pcBuff->dwTotalSize;
+ BYTE *p = pcBuff->pszCompressedData + 20;
+ i = dwTotal / 65536;
+ for (int j = 0; j < i; j++)
+ {
+ SendChunkHeader (szStr, 16 + 65536, ZJT_JBIG_HID, 0);
+ err = Send ((const BYTE *) szStr, 16);
+ err = Send ((const BYTE *) p, 65536);
+ dwTotal -= 65536;
+ p += 65536;
+ }
+ i = SendChunkHeader (szStr, 16 + dwTotal + iPadCount, ZJT_JBIG_HID, 0);
+ err = Send ((const BYTE *) szStr, 16);
+ err = Send ((const BYTE *) p, dwTotal);
+ ERRCHECK;
+ if (iPadCount != 0)
+ {
+ memset (szStr, 0, iPadCount);
+ err = Send ((const BYTE *) szStr, iPadCount);
+ }
+ i = SendChunkHeader (szStr, 16, ZJT_END_JBIG, 0);
+ err = Send ((const BYTE *) szStr, 16);
+ return err;
+}
+
+DRIVER_ERROR LJZjsMono::VerifyPenInfo()
+{
+ ePen = BLACK_PEN;
+ return NO_ERROR;
+}
+
+DRIVER_ERROR LJZjsMono::ParsePenInfo (PEN_TYPE& ePen, BOOL QueryPrinter)
+{
+ ePen = BLACK_PEN;
+
+ return NO_ERROR;
+}
+
+APDK_END_NAMESPACE
+
+#endif // APDK_LJZJS_MONO
diff --git a/prnt/hpijs/ljzjsmono.h b/prnt/hpijs/ljzjsmono.h
new file mode 100644
index 0000000..cbcf563
--- /dev/null
+++ b/prnt/hpijs/ljzjsmono.h
@@ -0,0 +1,109 @@
+/*****************************************************************************\
+ ljzjsmono.h : Interface for the LJZjsMono class
+
+ Copyright (c) 1996 - 2007, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#ifndef APDK_LJZJS_MONO_H
+#define APDK_LJZJS_MONO_H
+
+#ifdef APDK_LJZJS_MONO
+
+APDK_BEGIN_NAMESPACE
+
+/*!
+\internal
+*/
+class LJZjsMono : public LJZjs
+{
+public:
+ LJZjsMono (SystemServices* pSS, int numfonts = 0, BOOL proto = FALSE);
+ ~LJZjsMono ();
+
+ virtual DRIVER_ERROR Encapsulate (const RASTERDATA *pRasterData, BOOL bLastPlane);
+ virtual DRIVER_ERROR VerifyPenInfo ();
+ virtual DRIVER_ERROR ParsePenInfo (PEN_TYPE& ePen, BOOL QueryPrinter = TRUE);
+
+protected:
+
+#ifdef APDK_HP_UX
+ virtual LJZjsMono & operator = (Printer& rhs)
+ {
+ return *this;
+ }
+#endif
+
+private:
+ virtual DRIVER_ERROR EndPage ();
+ virtual DRIVER_ERROR SendPlaneData (int iPlaneNumber, HPLJZjsJbgEncSt *se, HPLJZjcBuff *pcBuff, BOOL bLastStride);
+
+}; // LJZjsMono
+
+class LJZjsMonoDraftGrayMode : public GrayMode
+{
+public:
+ LJZjsMonoDraftGrayMode ();
+}; // LJZjsMonoDraftGrayMode
+
+class LJZjsMonoNormalGrayMode : public GrayMode
+{
+public:
+ LJZjsMonoNormalGrayMode ();
+}; // LJZjsMonoNormalGrayMode
+
+//! LJZjsMonoProxy
+/*!
+******************************************************************************/
+class LJZjsMonoProxy : public PrinterProxy
+{
+public:
+ LJZjsMonoProxy() : PrinterProxy(
+ "LJZjsMono",
+ "HP LaserJet 1000\0"
+ "HP LaserJet 1005\0"
+ "HP LaserJet 1018\0"
+ "HP LaserJet 1020\0"
+ "HP LaserJet 1022\0"
+ "HP LaserJet P2035\0"
+ "HP LaserJet P1102\0"
+ "HP LaserJet P1566\0"
+ "HP LaserJet P1606\0"
+ "HP LaserJet Professional M1136\0"
+ "HP LaserJet Professional M1132\0"
+ "HP LaserJet Professional M1212nf\0"
+ ) {m_iPrinterType = eLJZjsMono;}
+ inline Printer* CreatePrinter(SystemServices* pSS) const { return new LJZjsMono(pSS); }
+ inline PRINTER_TYPE GetPrinterType() const { return eLJZjsMono;}
+ inline unsigned int GetModelBit() const { return 0x40;}
+};
+
+APDK_END_NAMESPACE
+
+#endif // APDK_LJZJS_MONO
+#endif //APDK_LJZJS_MONO_H
+
diff --git a/prnt/hpijs/models.cpp b/prnt/hpijs/models.cpp
new file mode 100644
index 0000000..dcb289f
--- /dev/null
+++ b/prnt/hpijs/models.cpp
@@ -0,0 +1,37 @@
+/*****************************************************************************\
+ models.cpp : Printer model mapping
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#include "models.h"
+
+APDK_BEGIN_NAMESPACE
+
+APDK_END_NAMESPACE
+
diff --git a/prnt/hpijs/models.h b/prnt/hpijs/models.h
new file mode 100644
index 0000000..e5c0301
--- /dev/null
+++ b/prnt/hpijs/models.h
@@ -0,0 +1,129 @@
+/*****************************************************************************\
+ models.h : Models types
+
+ Copyright (c) 1996 - 2008, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#ifndef APDK_MODELS_H
+#define APDK_MODELS_H
+
+#include "config.h"
+
+APDK_BEGIN_NAMESPACE
+
+// list of the basic equivalence classes
+/*! Do not use PRINTER_TYPE - it is going away in the next version
+\depricated
+*/
+typedef enum PRINTER_TYPE // typedef'ed for C interface
+{
+ UNSUPPORTED=-1,
+ eDJ400,
+ eDJ540,
+ eDJ600,
+ eDJ6xx,
+ eDJ6xxPhoto,
+ eDJ8xx,
+ eDJ850,
+ eDJ890,
+ eDJ9xx,
+ eDJ9xxVIP,
+ eDJ630,
+ eAP2xxx,
+ eAP21xx,
+ eAP2560,
+ eDJ350,
+ eDJ8x5,
+ ePSP100,
+ ePSP470,
+ eDJ3320,
+ eDJGenericVIP,
+ eDJ55xx,
+ eOJProKx50,
+ eLJMono,
+ eLJColor,
+ ePScript,
+ eDJ3600,
+ eDJ4100,
+ eDJD2600,
+ eLJJetReady,
+ eLJFastRaster,
+ eLJZjsMono,
+ eLJM1005,
+ eLJP1XXX,
+ eQuickConnect,
+ eLJZjsColor,
+ MAX_PRINTER_TYPE
+} PRINTER_TYPE;
+
+// strings used in Version function and for test harness
+/*! Do not use ModelName - it is going away in the next version
+\depricated
+*/
+const char ModelName[MAX_PRINTER_TYPE][13] =
+{
+ "DJ400",
+ "DJ540",
+ "DJ600",
+ "DJ6xx",
+ "DJ6xxPhoto",
+ "DJ8xx",
+ "DJ850",
+ "DJ890",
+ "DJ9xx",
+ "DJ9xxVIP",
+ "DJ630",
+ "AP2xxx",
+ "AP21xx",
+ "AP2560",
+ "DJ350",
+ "DJ8x5",
+ "PS100",
+ "PS470",
+ "DJ3320",
+ "GenericVIP",
+ "DJ55xx",
+ "OJProKx50",
+ "Mono Laser",
+ "ColorLaser",
+ "PostScript",
+ "DJ3600",
+ "DJ4100",
+ "DJD2600",
+ "LJJetReady",
+ "LJFastRaster",
+ "LJZjsMono",
+ "LJM1005",
+ "LJP1XXX",
+ "QuickConnect",
+ "LJZjsColor"
+};
+
+APDK_END_NAMESPACE
+
+#endif //APDK_MODELS_H
diff --git a/prnt/hpijs/modes.h b/prnt/hpijs/modes.h
new file mode 100644
index 0000000..53c27dd
--- /dev/null
+++ b/prnt/hpijs/modes.h
@@ -0,0 +1,10 @@
+#ifdef APDK_EXTENDED_MEDIASIZE
+#define MAX_PRINTMODES 20
+#else
+#define MAX_PRINTMODES 10
+#endif
+
+#define GRAYMODE_INDEX 0
+#define DEFAULTMODE_INDEX 1
+#define SPECIALMODE_INDEX 2
+#define EXTRASPECIALMODE_INDEX 3
diff --git a/prnt/hpijs/ojprokx50.h b/prnt/hpijs/ojprokx50.h
new file mode 100644
index 0000000..fdb379c
--- /dev/null
+++ b/prnt/hpijs/ojprokx50.h
@@ -0,0 +1,87 @@
+/*****************************************************************************\
+ ojprokx50.h : Interface for the generic VIP printer class
+
+ Copyright (c) 2001 - 2002, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#ifndef APDK_OJ_PROKX50_H
+#define APDK_OJ_PROKX50_H
+
+APDK_BEGIN_NAMESPACE
+
+//OJProKX50
+//!
+/*!
+\internal
+******************************************************************************/
+class OJProKx50 : public DJ9xxVIP
+{
+public:
+ OJProKx50 (SystemServices* pSS, BOOL proto = FALSE) : DJ9xxVIP (pSS, proto)
+ {
+ // Papertype for marvellous mode must be mediaGlossy (3) for these printers
+ pMode[4]->medium = mediaGlossy;
+ }
+ virtual BOOL GetMargins (PAPER_SIZE ps, float *fMargins)
+ {
+ fMargins[0] = (float) 0.125;
+ fMargins[1] = (float) 0.125;
+ fMargins[2] = (float) 0.125;
+ fMargins[3] = (float) 0.5;
+ if (ps == SUPERB_SIZE)
+ {
+ fMargins[0] = (float) 0.125;
+ fMargins[1] = (float) 0.5;
+ fMargins[2] = (float) 0.125;
+ fMargins[3] = (float) 0.75;
+ }
+ return TRUE;
+ }
+};
+
+#if defined (APDK_DJ9xxVIP)
+//! OJProKX50Proxy
+/*!
+******************************************************************************/
+class OJProKx50Proxy : public PrinterProxy
+{
+public:
+ OJProKx50Proxy() : PrinterProxy(
+ "OJProKx50", // family name
+ "Officejet Pro K550\0"
+ "Officejet Pro K850\0"
+ ) {m_iPrinterType = eOJProKx50;}
+ inline Printer* CreatePrinter(SystemServices* pSS) const { return new OJProKx50(pSS); }
+ inline PRINTER_TYPE GetPrinterType() const { return eOJProKx50;}
+ inline unsigned int GetModelBit() const { return 0x200;}
+};
+#endif
+
+APDK_END_NAMESPACE
+
+#endif // APDK_OJ_PROKX50_H
diff --git a/prnt/hpijs/phobos_cmaps.cpp b/prnt/hpijs/phobos_cmaps.cpp
new file mode 100644
index 0000000..b2758ba
--- /dev/null
+++ b/prnt/hpijs/phobos_cmaps.cpp
@@ -0,0 +1,422 @@
+/*****************************************************************************\
+ phobos_cmaps.cpp : Color maps for DJ8x5
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#include "config.h"
+
+#include "global_types.h"
+
+#ifdef APDK_DJ8x5
+
+APDK_BEGIN_NAMESPACE
+
+uint32_t ulMapDJ8x5Draft[ 9 * 9 * 9 ] =
+{
+4294967040UL, 3034836992UL, 2094464768UL, 1439104512UL, 867696128UL, 582024704UL,
+ 312933888UL, 94633472UL, 10551040UL, 4289449216UL, 3469671936UL, 2093612544UL,
+1287847424UL, 716373504UL, 346684928UL, 195559168UL, 27459072UL, 10484992UL,
+4268873216UL, 3834046464UL, 2290873088UL, 1267724032UL, 613875200UL, 160890368UL,
+ 26803712UL, 26803712UL, 9960960UL, 4266904576UL, 4267370752UL, 3026120448UL,
+1616965888UL, 795474688UL, 225704960UL, 24836352UL, 25360896UL, 8780288UL,
+4264934400UL, 4265267712UL, 3443514880UL, 2135023616UL, 1094903296UL, 474869248UL,
+ 22737664UL, 23522560UL, 7270144UL, 4263686656UL, 4246913280UL, 3676818176UL,
+2502677504UL, 1630330112UL, 724361472UL, 188345344UL, 21619712UL, 5760000UL,
+4262636288UL, 4262704384UL, 3793140736UL, 2769993216UL, 1998310656UL, 1226434816UL,
+ 387512832UL, 19394816UL, 4120576UL, 4261783552UL, 4261850368UL, 3859525376UL,
+3020796928UL, 2215557632UL, 1695341824UL, 873133312UL, 151715584UL, 2156288UL,
+4278230528UL, 4244676864UL, 3741358592UL, 3103824128UL, 2298518784UL, 1711320320UL,
+1325455360UL, 604040960UL, 65280UL, 4160200192UL, 2818485760UL, 1744750848UL,
+ 956104192UL, 366869760UL, 147455488UL, 29163008UL, 28376320UL, 11009280UL,
+4273584384UL, 3284386560UL, 2042811904UL, 1135996416UL, 430439168UL, 27459328UL,
+ 26604544UL, 26143744UL, 9234176UL, 4269058816UL, 3917791232UL, 2357640448UL,
+1334362112UL, 663143936UL, 42392832UL, 25615872UL, 25615872UL, 8773888UL,
+4283413504UL, 3797201152UL, 2640033024UL, 1700772864UL, 879085568UL, 308924928UL,
+ 23976704UL, 24369920UL, 7921664UL, 4264931840UL, 3828789760UL, 2956831744UL,
+1916711424UL, 1161803776UL, 524730368UL, 55428608UL, 5817856UL, 6542336UL,
+4280265472UL, 4062030592UL, 3173165312UL, 2200479488UL, 1445506048UL, 791261696UL,
+ 271628288UL, 20757248UL, 4964864UL, 4262241024UL, 3976961280UL, 3289357568UL,
+2383715072UL, 1729536000UL, 1041671424UL, 471248384UL, 35501568UL, 3456512UL,
+4261518848UL, 3674246400UL, 3288436224UL, 2550435840UL, 1963495936UL, 1359452928UL,
+ 721920256UL, 201764864UL, 1620992UL, 4127232000UL, 3355476224UL, 3170927872UL,
+2734721280UL, 2181073920UL, 1694537216UL, 1140891904UL, 553691648UL, 16890880UL,
+4278022656UL, 3422451200UL, 2029942784UL, 922653184UL, 182366720UL, 13814528UL,
+ 29679616UL, 28697600UL, 11332096UL, 4274286848UL, 3688530688UL, 2128250368UL,
+1103925760UL, 398306048UL, 29015040UL, 27706624UL, 26855680UL, 9490176UL,
+4271544832UL, 3751516160UL, 2560137216UL, 1452123136UL, 696365056UL, 25018368UL,
+ 8243200UL, 25085184UL, 8242176UL, 4266887168UL, 4183726592UL, 2892207616UL,
+1818532096UL, 929471232UL, 292070656UL, 7122688UL, 7516928UL, 7583232UL,
+4265123840UL, 3812268544UL, 3040711168UL, 2017629184UL, 1245944320UL, 558341376UL,
+ 38510848UL, 22653184UL, 6402048UL, 4263485440UL, 3844054016UL, 3089273856UL,
+2250740224UL, 1512740096UL, 858429440UL, 271620864UL, 20751104UL, 4826368UL,
+4262303488UL, 3708522240UL, 3037431808UL, 2282718976UL, 1679067392UL, 1058376960UL,
+ 504729600UL, 35494656UL, 3318272UL, 4278292224UL, 3422650112UL, 2885712896UL,
+2332130816UL, 1778614016UL, 1241744128UL, 705005824UL, 184913920UL, 1546752UL,
+3590356480UL, 3070260480UL, 2600497152UL, 2315285760UL, 1929410304UL, 1526758144UL,
+1040220160UL, 520128256UL, 36864UL, 4277355264UL, 3690873856UL, 2197770752UL,
+1308511488UL, 367881984UL, 32278784UL, 30059264UL, 29736192UL, 12176640UL,
+4275392768UL, 3890565888UL, 2312591872UL, 1406624000UL, 517107200UL, 29656064UL,
+ 28548608UL, 11315712UL, 10596864UL, 4270676224UL, 4037107968UL, 2694734592UL,
+1554016000UL, 714699776UL, 60392704UL, 9933824UL, 9477632UL, 8955392UL,
+4284966656UL, 3714606848UL, 2707908352UL, 1768515840UL, 1013546240UL, 358910976UL,
+ 23501568UL, 6988544UL, 6988288UL, 4265305856UL, 4215238144UL, 2890034688UL,
+1866689024UL, 1229286912UL, 558330880UL, 38502912UL, 5803520UL, 6198528UL,
+4213408512UL, 3710023936UL, 2804116480UL, 1982229504UL, 1361800448UL, 824931072UL,
+ 271613184UL, 3966208UL, 4688128UL, 4128081664UL, 3524099072UL, 2852876288UL,
+2131717376UL, 1511222016UL, 957705472UL, 471168256UL, 18710272UL, 3245056UL,
+3942677760UL, 3221319424UL, 2701224448UL, 2181065216UL, 1677814016UL, 1141073920UL,
+ 637759232UL, 184841472UL, 1408768UL, 3338694912UL, 2902484992UL, 2449498624UL,
+2164286208UL, 1795188224UL, 1375757568UL, 973170944UL, 486567168UL, 29440UL,
+4227734784UL, 3606979072UL, 2566793472UL, 1509897984UL, 788410112UL, 15227392UL,
+ 14709504UL, 30706688UL, 12559872UL, 4275383040UL, 3773114368UL, 2565222400UL,
+1557806336UL, 819218176UL, 64116224UL, 29649664UL, 28412160UL, 11245568UL,
+4272698880UL, 3719249408UL, 2897297920UL, 1806976768UL, 968444928UL, 179066112UL,
+ 27290624UL, 26902784UL, 9866496UL, 4285088256UL, 4151527424UL, 2994096896UL,
+2021150464UL, 1098535168UL, 343694080UL, 7890688UL, 7697152UL, 7699968UL,
+4249899008UL, 3729871872UL, 3109115136UL, 2152748288UL, 1381126656UL, 642735872UL,
+ 71787776UL, 5074944UL, 5537024UL, 4264186880UL, 4046018304UL, 3173799680UL,
+2133677824UL, 1429165312UL, 858740736UL, 288578816UL, 20604160UL, 4352512UL,
+4279329536UL, 3708837376UL, 2937084160UL, 2165331712UL, 1544770816UL, 974542592UL,
+ 488070144UL, 1860608UL, 2976000UL, 3791677696UL, 3271581440UL, 2801818368UL,
+2181060608UL, 1661032192UL, 1124161024UL, 604198656UL, 167993088UL, 1337088UL,
+3271582208UL, 2969590528UL, 2466272512UL, 2130793728UL, 1761629952UL, 1342199040UL,
+ 922768384UL, 486562560UL, 24320UL, 4277930240UL, 3841853952UL, 2935886080UL,
+1778325760UL, 1023287808UL, 436148480UL, 33244416UL, 14377984UL, 13990912UL,
+4293788928UL, 3840804352UL, 2917666304UL, 1709447680UL, 937501184UL, 366488320UL,
+ 30230784UL, 29777152UL, 12087296UL, 4288943872UL, 4038202880UL, 2813204992UL,
+1806246400UL, 1051207936UL, 447558144UL, 28328704UL, 27679232UL, 10448896UL,
+4285997312UL, 3799524864UL, 2775984640UL, 1920413184UL, 1199124480UL, 545273088UL,
+ 25510912UL, 25517312UL, 8546560UL, 4283642624UL, 3696440064UL, 2824222464UL,
+2086222080UL, 1465465088UL, 710753280UL, 56574976UL, 6640640UL, 6512128UL,
+4248385792UL, 3711516160UL, 3157802752UL, 2369273600UL, 1631142144UL, 1010580480UL,
+ 339298816UL, 20599296UL, 4152320UL, 4246290944UL, 4028056320UL, 3189129472UL,
+2283225600UL, 1612267520UL, 1025130240UL, 504971776UL, 18827520UL, 3035904UL,
+4261563904UL, 3640740096UL, 2969650688UL, 2248229888UL, 1677804288UL, 1141063936UL,
+ 604258560UL, 168053248UL, 1331712UL, 3439415552UL, 2986429184UL, 2516600576UL,
+2114012416UL, 1728071168UL, 1325417472UL, 905986560UL, 469780224UL, 19968UL,
+4294508544UL, 4076732672UL, 3372089856UL, 2298414336UL, 1325337600UL, 603851776UL,
+ 117311232UL, 32782848UL, 14441216UL, 4209574144UL, 3789816064UL, 3169124608UL,
+2246836480UL, 1189545984UL, 535367168UL, 65017856UL, 29900032UL, 13193984UL,
+4272948480UL, 3938517248UL, 3065839872UL, 2126578176UL, 1203244288UL, 565318400UL,
+ 28319232UL, 11352064UL, 11423488UL, 4270327808UL, 3750102784UL, 2927823360UL,
+2021723904UL, 1317147392UL, 646256640UL, 125967872UL, 25572864UL, 9195264UL,
+4267186176UL, 3797489152UL, 2891520000UL, 2035948288UL, 1448680960UL, 828186368UL,
+ 224404224UL, 23738624UL, 7556352UL, 4231865088UL, 3392741888UL, 2721719040UL,
+2084316416UL, 1513956096UL, 1010771200UL, 356722944UL, 4666624UL, 5325824UL,
+4263584000UL, 3726714880UL, 3173067008UL, 2367695104UL, 1780689664UL, 1143024384UL,
+ 640034304UL, 2175744UL, 2965760UL, 4262015488UL, 3959762944UL, 3271896832UL,
+2365926912UL, 1694772224UL, 1158032128UL, 621160960UL, 185020160UL, 1456128UL,
+3607116288UL, 2986358016UL, 2499818496UL, 2097231104UL, 1694577920UL, 1308635904UL,
+ 838872576UL, 452997120UL, 14080UL, 4260691968UL, 4194107648UL, 3607035904UL,
+2784887040UL, 1811873792UL, 1040057088UL, 452920064UL, 16711936UL, 16068352UL,
+4007657728UL, 3654811904UL, 3235578112UL, 2514157568UL, 1692598272UL, 887291904UL,
+ 300155136UL, 31198720UL, 13447680UL, 4207018240UL, 3821076736UL, 3166765312UL,
+2378039296UL, 1707343872UL, 834797824UL, 230818048UL, 28644352UL, 11415296UL,
+4186636288UL, 3632857088UL, 3146842112UL, 2241003776UL, 1586495744UL, 797835520UL,
+ 194249216UL, 26022400UL, 8923904UL, 3865968896UL, 3530162176UL, 2892300288UL,
+2170683392UL, 1549861888UL, 912459264UL, 359139328UL, 6755072UL, 7023872UL,
+4265937920UL, 3561097984UL, 2856388864UL, 2118257408UL, 1547832320UL, 1061293568UL,
+ 474353152UL, 21698048UL, 5648128UL, 4264105216UL, 3324450048UL, 2703561216UL,
+2099647232UL, 1613239296UL, 1126699776UL, 640291328UL, 19731968UL, 3614976UL,
+4262399744UL, 3624736000UL, 3054244864UL, 2315982080UL, 1745688320UL, 1208817152UL,
+ 738989824UL, 269488128UL, 1516800UL, 3842056448UL, 3154124800UL, 2583699200UL,
+2130713856UL, 1660952320UL, 1275141888UL, 822090752UL, 452992512UL, 8448UL,
+4294377472UL, 4277993472UL, 3841851392UL, 3187539968UL, 2331770880UL, 1492975616UL,
+ 922550272UL, 452853760UL, 16711680UL, 3889758208UL, 3654680576UL, 3319332864UL,
+2866479104UL, 2195980288UL, 1390804992UL, 820379648UL, 367394816UL, 15007744UL,
+4005691392UL, 3770548224UL, 3267428352UL, 2596274176UL, 2110062592UL, 1304821760UL,
+ 734265344UL, 247988224UL, 12713984UL, 3868000256UL, 3532455936UL, 3248095232UL,
+2375680000UL, 1838678016UL, 1251409920UL, 664141824UL, 195035136UL, 10027008UL,
+3446734848UL, 3228499968UL, 2809004032UL, 2339373056UL, 1768751104UL, 1298989056UL,
+ 661651456UL, 158597120UL, 7405568UL, 3679256576UL, 3360424192UL, 2840396032UL,
+2219638784UL, 1632174080UL, 1162346496UL, 659226624UL, 156237824UL, 5373952UL,
+4214226944UL, 3475832832UL, 2821521408UL, 2150432768UL, 1630339072UL, 1160577024UL,
+ 707461120UL, 187891712UL, 3932160UL, 4094624000UL, 3624861952UL, 2735603712UL,
+2081489152UL, 1578106880UL, 1125122048UL, 705757184UL, 286523392UL, 1966080UL,
+4278190080UL, 2919301376UL, 2499870976UL, 2113929216UL, 1728119040UL, 1224736768UL,
+ 922746880UL, 520093696UL, 0
+};
+
+uint32_t ulMapDJ8x5PlainNormal[9 * 9 * 9] =
+{
+4294967040UL, 2681863936UL, 1723662080UL, 1286209280UL, 1033699072UL, 831782656UL,
+ 630062848UL, 377552640UL, 7077632UL, 4289394944UL, 3250716416UL, 1940848384UL,
+1352793856UL, 999554816UL, 730595072UL, 528744192UL, 360447744UL, 6484992UL,
+4284473856UL, 3564568320UL, 2475949824UL, 1619721984UL, 1082326784UL, 695795456UL,
+ 409992960UL, 225050368UL, 5961984UL, 4281847296UL, 3946771968UL, 2824666880UL,
+2038038272UL, 1399848704UL, 811859712UL, 257031936UL, 72154880UL, 4913152UL,
+4280337408UL, 4196592384UL, 3375365888UL, 2236350208UL, 1718025984UL, 1197342464UL,
+ 457441024UL, 3470336UL, 3729152UL, 4279484416UL, 4279556864UL, 3843227392UL,
+2619473664UL, 1765539584UL, 1482227456UL, 893910784UL, 170521600UL, 2677248UL,
+4278893056UL, 4278897664UL, 4093701376UL, 3087466240UL, 1930755840UL, 1429208832UL,
+1280114432UL, 422181120UL, 1824768UL, 4278235136UL, 4278238464UL, 4160804352UL,
+3355501056UL, 2281761792UL, 1376253696UL, 1042218752UL, 943259392UL, 974848UL,
+4278233088UL, 4278235648UL, 3976248320UL, 3338716672UL, 2583744256UL, 1711331584UL,
+ 973136384UL, 436266240UL, 65280UL, 4110406144UL, 2634009088UL, 1391848192UL,
+ 937426688UL, 734461696UL, 615644928UL, 513736448UL, 378339072UL, 7206912UL,
+4290824704UL, 3621509376UL, 1875640064UL, 1236532992UL, 882835200UL, 630324992UL,
+ 428080896UL, 225902336UL, 6813696UL, 4284791040UL, 3766348032UL, 2493117696UL,
+1553071872UL, 965017344UL, 544866048UL, 258801408UL, 6553344UL, 6026240UL,
+4281905408UL, 4148093696UL, 2891379456UL, 1936717056UL, 1298988800UL, 610008832UL,
+ 71958272UL, 4846592UL, 4975360UL, 4280397312UL, 4280538112UL, 3391483904UL,
+2084236800UL, 1448014080UL, 927791360UL, 154202624UL, 3333120UL, 3791360UL,
+4279414016UL, 4279224320UL, 3674924800UL, 2366825472UL, 1360979968UL, 706929664UL,
+ 236840192UL, 1954304UL, 2542080UL, 4278692352UL, 4194350592UL, 3691039232UL,
+2617298432UL, 1543558400UL, 789108992UL, 269079296UL, 773120UL, 1622784UL,
+4278232064UL, 3774913280UL, 3355485696UL, 2684399360UL, 1828762880UL, 1090568448UL,
+ 520144640UL, 100713728UL, 835584UL, 4076901376UL, 3523250944UL, 3221262848UL,
+2751503360UL, 2097193472UL, 1426107392UL, 872463104UL, 402702848UL, 50432UL,
+4060054784UL, 2734657280UL, 1493143808UL, 822070528UL, 452062976UL, 383319808UL,
+ 330891008UL, 211615488UL, 8255744UL, 4291788544UL, 3353781760UL, 1609677312UL,
+ 670359808UL, 333379584UL, 247398144UL, 144834304UL, 8714496UL, 7467008UL,
+4286677248UL, 3969559040UL, 2442827008UL, 1168235008UL, 613479680UL, 259848960UL,
+ 74381568UL, 6615040UL, 6217728UL, 4282417664UL, 4182551040UL, 2823467776UL,
+1465630720UL, 727374848UL, 156167936UL, 4974592UL, 5168640UL, 5101056UL,
+4280650752UL, 4280854272UL, 3340811520UL, 1865007104UL, 825017344UL, 254333696UL,
+ 2872064UL, 3591424UL, 3983872UL, 4279537920UL, 4279346688UL, 3540826624UL,
+2198780672UL, 1125302016UL, 403685632UL, 51562496UL, 1949184UL, 2604032UL,
+4278686464UL, 4160788992UL, 3405816576UL, 2365630976UL, 1392553984UL, 704690176UL,
+ 218412800UL, 701184UL, 1552128UL, 4278226176UL, 3640689408UL, 3103820032UL,
+2466288640UL, 1660983552UL, 1040228608UL, 503359488UL, 117483520UL, 697088UL,
+3825237248UL, 3338696192UL, 2936043520UL, 2449506560UL, 1845528064UL, 1291881216UL,
+ 805344512UL, 385916416UL, 39936UL, 4110371584UL, 2986300160UL, 1577016576UL,
+ 889153024UL, 402628352UL, 16765440UL, 14477824UL, 12252160UL, 9956352UL,
+4292430592UL, 3572784640UL, 1777297920UL, 737835520UL, 116958976UL, 14732288UL,
+ 12901632UL, 10673664UL, 8772096UL, 4287844864UL, 4055196672UL, 2259116544UL,
+ 867532032UL, 179740928UL, 11058688UL, 9882368UL, 8637952UL, 7391744UL,
+4283519232UL, 4284771328UL, 2975821824UL, 1465539328UL, 509779456UL, 72859136UL,
+ 5621760UL, 5621248UL, 5488384UL, 4280966400UL, 4281233152UL, 3392045056UL,
+1848411136UL, 707562496UL, 238003200UL, 3453440UL, 3978752UL, 4240896UL,
+4279659520UL, 4279663104UL, 3507782912UL, 2182318336UL, 1108709120UL, 437557248UL,
+ 1550080UL, 2204672UL, 2926336UL, 4278744064UL, 4160780032UL, 3405806336UL,
+2332066816UL, 1359186688UL, 671387904UL, 201692928UL, 825344UL, 1611776UL,
+4211110656UL, 3607128320UL, 3070258176UL, 2365617664UL, 1593867264UL, 989888768UL,
+ 469796608UL, 100698112UL, 625152UL, 3674236416UL, 3238027520UL, 2868929280UL,
+2365614592UL, 1778413312UL, 1207987968UL, 771782144UL, 369130752UL, 31488UL,
+4227803648UL, 3355389952UL, 1828665344UL, 922697472UL, 469713664UL, 83849984UL,
+ 15508736UL, 13614848UL, 11650304UL, 4292815104UL, 3774821376UL, 2079931136UL,
+ 788021248UL, 201018368UL, 15234304UL, 13803520UL, 12498432UL, 10467328UL,
+4288491264UL, 4123211520UL, 2579379200UL, 934885632UL, 231099904UL, 12350208UL,
+ 11572736UL, 10265856UL, 8759808UL, 4284233216UL, 4285808640UL, 2977381632UL,
+1433485312UL, 561796864UL, 58289920UL, 7834112UL, 7444992UL, 6659584UL,
+4281678080UL, 4282073856UL, 3325379072UL, 1882737664UL, 1145391104UL, 306016256UL,
+ 3966208UL, 4429312UL, 4494592UL, 4280107776UL, 4280109568UL, 3491254016UL,
+2233095168UL, 1193237760UL, 505309184UL, 69105152UL, 2654208UL, 3180800UL,
+4278931200UL, 4278735616UL, 3439809792UL, 2366134272UL, 1359568384UL, 722101760UL,
+ 235498496UL, 1078272UL, 1800960UL, 4177548288UL, 3657453056UL, 3053473536UL,
+2382386432UL, 1560304384UL, 922771200UL, 453010688UL, 67134976UL, 748544UL,
+3573567488UL, 3187690240UL, 2818592000UL, 2332054016UL, 1744853248UL, 1174428416UL,
+ 738221056UL, 369123840UL, 24832UL, 4294907648UL, 3607042560UL, 2264866304UL,
+1023353856UL, 486483456UL, 201271296UL, 16077824UL, 14450432UL, 12818944UL,
+4293138688UL, 3909032448UL, 2482969600UL, 922362112UL, 217719040UL, 15740928UL,
+ 14571520UL, 13204480UL, 11636992UL, 4289273088UL, 4190903296UL, 2815367424UL,
+1204165376UL, 298196992UL, 12923904UL, 12409088UL, 11236864UL, 9864448UL,
+4285080064UL, 4202570752UL, 2995003392UL, 1635853312UL, 612641024UL, 92944128UL,
+ 9065472UL, 8613120UL, 7699200UL, 4282197504UL, 4165150720UL, 3057722112UL,
+1883712256UL, 978138112UL, 323894272UL, 5131264UL, 5465088UL, 5337088UL,
+4280559872UL, 4280626176UL, 3340445184UL, 2233544448UL, 1244150016UL, 791556096UL,
+ 69683712UL, 2972928UL, 3368960UL, 4279316224UL, 4279251456UL, 3456840192UL,
+2399942144UL, 1410284288UL, 739197440UL, 235751424UL, 1331968UL, 2055680UL,
+4177540096UL, 3808441600UL, 3103798784UL, 2365602304UL, 1526742272UL, 889209088UL,
+ 419448064UL, 18688UL, 873728UL, 3456121600UL, 3087022336UL, 2701146624UL,
+2214607872UL, 1644183296UL, 1124090624UL, 687883264UL, 369117184UL, 18688UL,
+4294380544UL, 3825142784UL, 2768178688UL, 1325338880UL, 570364928UL, 218043648UL,
+ 16389120UL, 15547904UL, 13919232UL, 4293135360UL, 3992913920UL, 2835286016UL,
+1241450752UL, 267848704UL, 15733504UL, 14885632UL, 13976320UL, 12869888UL,
+4289793536UL, 4174252288UL, 2949842432UL, 1506740224UL, 398920448UL, 12981248UL,
+ 12658688UL, 12338432UL, 11099392UL, 4285796608UL, 4186247424UL, 2995457536UL,
+1753878528UL, 747377408UL, 143529984UL, 9578752UL, 9651200UL, 8804352UL,
+4282717696UL, 4131984896UL, 3058307840UL, 1934628608UL, 1062607616UL, 374742528UL,
+ 5974016UL, 6438912UL, 6181120UL, 4280884224UL, 3928299264UL, 2988709120UL,
+2083199744UL, 1261444864UL, 556868096UL, 103885056UL, 3685120UL, 4016384UL,
+4279638784UL, 4195621632UL, 3389986816UL, 2400394496UL, 1461002752UL, 789915904UL,
+ 488381952UL, 1651968UL, 2245376UL, 4278525440UL, 4076871168UL, 3288341760UL,
+2365595648UL, 1476403712UL, 855647744UL, 385886976UL, 12544UL, 932352UL,
+3506447616UL, 2986353664UL, 2600477952UL, 2080384768UL, 1577069056UL, 1090530560UL,
+ 637546240UL, 352334336UL, 13312UL, 4293591040UL, 4026204160UL, 3154051072UL,
+1862206720UL, 788465664UL, 318703616UL, 100599808UL, 16321792UL, 15150848UL,
+4292804608UL, 4025286656UL, 3052339200UL, 1794113536UL, 569376768UL, 15532032UL,
+ 14814208UL, 14358272UL, 13775104UL, 4289921024UL, 3904962560UL, 2982477824UL,
+1858535424UL, 700907520UL, 12910592UL, 12652032UL, 12590080UL, 12137216UL,
+4286382080UL, 3984850944UL, 2928279552UL, 1837957120UL, 898629632UL, 227673088UL,
+ 9834240UL, 10034688UL, 9778432UL, 4283107328UL, 4014802432UL, 3025208832UL,
+1918174720UL, 1113131008UL, 458885632UL, 6098176UL, 6889472UL, 7156992UL,
+4281142528UL, 3794471424UL, 2955610368UL, 2050034432UL, 1261767936UL, 641142784UL,
+ 137826816UL, 4202496UL, 4600320UL, 4279898368UL, 3692235264UL, 2970946304UL,
+2149125632UL, 1377505536UL, 807211520UL, 253498112UL, 2039040UL, 2567168UL,
+4278783488UL, 4043771136UL, 3322219776UL, 2466648064UL, 1611076096UL, 939988480UL,
+ 436607232UL, 168430592UL, 1123584UL, 3841987072UL, 3087012608UL, 2600473600UL,
+2113934848UL, 1560287488UL, 1073748736UL, 637541632UL, 335552256UL, 8192UL,
+4292411392UL, 4142923776UL, 3455778816UL, 2399076352UL, 1224671232UL, 553582592UL,
+ 251592704UL, 16711680UL, 16711680UL, 3972530176UL, 3653959680UL, 3168141312UL,
+2279211008UL, 1189150720UL, 450953216UL, 149094400UL, 14745600UL, 14417920UL,
+3802660864UL, 3433889792UL, 2947809280UL, 2193096704UL, 1254031360UL, 465436672UL,
+ 96468992UL, 12517376UL, 12517376UL, 3783065600UL, 3431137280UL, 2861301760UL,
+2106589184UL, 1301544960UL, 546635776UL, 93716480UL, 10158080UL, 10289152UL,
+3914334208UL, 3411083264UL, 2824339456UL, 2019426304UL, 1298202624UL, 644022272UL,
+ 140705792UL, 6881280UL, 7602176UL, 4197449728UL, 3593469952UL, 2788294656UL,
+2016804864UL, 1278869504UL, 708509696UL, 222035968UL, 4325376UL, 5177344UL,
+4011327488UL, 3591897088UL, 2870542336UL, 2098987008UL, 1360855040UL, 756940800UL,
+ 287244288UL, 2424832UL, 3080192UL, 3976658944UL, 3607560192UL, 3003580416UL,
+2215116800UL, 1476919296UL, 856227840UL, 420085760UL, 851968UL, 1376256UL,
+4278190080UL, 3472883712UL, 2734686208UL, 2164260864UL, 1677721600UL, 1157627904UL,
+ 721420288UL, 301989888UL, 0
+};
+
+/*
+uint32_t ulMapDJ8x5Photo[9 * 9 * 9] =
+{
+3503543808UL, 3100498688UL, 2495668736UL, 1890903552UL, 1370285568UL, 916973056UL,
+ 514057728UL, 161604864UL, 10610176UL, 3718890240UL, 2964445952UL, 2545080832UL,
+1756291072UL, 1051191040UL, 497280512UL, 144827904UL, 10412288UL, 10346496UL,
+3800809728UL, 3364931072UL, 2543178496UL, 1973014272UL, 1117311488UL, 244766464UL,
+ 9884160UL, 9883904UL, 9883904UL, 3831938816UL, 3463298560UL, 2910240256UL,
+2189214720UL, 1451148544UL, 595510528UL, 8306688UL, 8634112UL, 8896512UL,
+3678649344UL, 3444226816UL, 3025385728UL, 2539306240UL, 1616757760UL, 929023232UL,
+ 157597952UL, 7190528UL, 7517440UL, 3576215296UL, 3408836096UL, 3090527744UL,
+2721822464UL, 2118106624UL, 1144899584UL, 474203648UL, 5552896UL, 6271232UL,
+3473781248UL, 3356799488UL, 3122508032UL, 2820846336UL, 2401809920UL, 1697103360UL,
+ 706857216UL, 137477888UL, 4632064UL, 3321932032UL, 3238046208UL, 3137711616UL,
+2886511872UL, 2584850176UL, 2048176896UL, 1292549120UL, 302498816UL, 2863360UL,
+3170934016UL, 3154157568UL, 3053495040UL, 2852168192UL, 2499845120UL, 2046859776UL,
+1526766848UL, 956345088UL, 46848UL, 3670715392UL, 3001202176UL, 2279259904UL,
+1389152512UL, 599839744UL, 129424384UL, 11394304UL, 11133952UL, 10739968UL,
+3819876352UL, 3132799488UL, 2645867520UL, 1941030912UL, 1084936704UL, 212130304UL,
+ 10540544UL, 10473984UL, 10342144UL, 3868111360UL, 3381965056UL, 2778183168UL,
+2140846080UL, 1335540736UL, 513327616UL, 9880064UL, 9880064UL, 9748480UL,
+3731337472UL, 3329207552UL, 2876681472UL, 2340270848UL, 1585361920UL, 779990528UL,
+ 92190976UL, 8566784UL, 8763392UL, 3611537664UL, 3276516352UL, 2924587776UL,
+2505681920UL, 1784459264UL, 1063235840UL, 241283584UL, 6925824UL, 7319296UL,
+3508973312UL, 3224086784UL, 2955979008UL, 2620893440UL, 2050862080UL, 1296019200UL,
+ 591638272UL, 5155584UL, 6006528UL, 3439963136UL, 3171656704UL, 2953880576UL,
+2669126912UL, 2233443584UL, 1596172288UL, 841394944UL, 154052608UL, 4301568UL,
+3254821376UL, 3053492992UL, 2936052992UL, 2701171968UL, 2399444992UL, 1879548160UL,
+1208460032UL, 436971008UL, 2531328UL, 3154156288UL, 3053491968UL, 2936051712UL,
+2768280064UL, 2516621824UL, 2147523584UL, 1610652672UL, 956341760UL, 41472UL,
+3721303296UL, 3201997312UL, 2430573312UL, 1473488384UL, 583643136UL, 12367872UL,
+ 11977216UL, 11652096UL, 11129600UL, 3837041408UL, 3333921792UL, 2646383872UL,
+1958257920UL, 1102293760UL, 162509312UL, 11122176UL, 10992384UL, 10599936UL,
+4002650624UL, 3398867200UL, 2728108544UL, 2207950080UL, 1385802496UL, 530035200UL,
+ 9877248UL, 9746176UL, 9614592UL, 3765148928UL, 3312753920UL, 2893586176UL,
+2357044224UL, 1635821056UL, 813672704UL, 75476480UL, 8564224UL, 8630272UL,
+3595084288UL, 3226311680UL, 2907872256UL, 2472123904UL, 1818075648UL, 1080009472UL,
+ 224503040UL, 7055104UL, 7317248UL, 3475612416UL, 3190660352UL, 2905512960UL,
+2553584640UL, 2000395776UL, 1279107072UL, 591437568UL, 5086976UL, 5872896UL,
+3389825280UL, 3121256960UL, 2886244352UL, 2601490688UL, 2132252928UL, 1511889408UL,
+ 807443456UL, 120232704UL, 4167936UL, 3238041856UL, 3019936256UL, 2852164096UL,
+2634060544UL, 2281739008UL, 1778422528UL, 1157928448UL, 403216384UL, 2397440UL,
+3137377280UL, 3003158528UL, 2852163328UL, 2684391424UL, 2415955968UL, 2080411904UL,
+1577095168UL, 939561216UL, 37120UL, 3754981376UL, 3285613056UL, 2614722048UL,
+1809547008UL, 835620864UL, 113483264UL, 12430080UL, 12038656UL, 11647744UL,
+3770055936UL, 3317138176UL, 2780333568UL, 2176485632UL, 1253478656UL, 213162496UL,
+ 11576320UL, 11053056UL, 10923776UL, 3784868096UL, 3298526464UL, 2862450688UL,
+2258733824UL, 1403031296UL, 497063680UL, 10263808UL, 10200064UL, 9807360UL,
+3816062976UL, 3329918464UL, 2944305152UL, 2323746048UL, 1686212864UL, 847288320UL,
+ 92315648UL, 8561664UL, 8561920UL, 3645802496UL, 3260253952UL, 2924972288UL,
+2505935616UL, 1851887104UL, 1097043968UL, 241472512UL, 6985728UL, 7445760UL,
+3476000256UL, 3174140416UL, 2889058560UL, 2536999424UL, 1983679232UL, 1296010496UL,
+ 591564544UL, 5017344UL, 5870336UL, 3356659968UL, 3121580544UL, 2886502400UL,
+2567997440UL, 2098694400UL, 1495107840UL, 807504640UL, 120294656UL, 4099072UL,
+3204484352UL, 3003155968UL, 2835383552UL, 2583725568UL, 2214626560UL, 1744864512UL,
+1124305152UL, 352749568UL, 2263040UL, 3120597760UL, 2952824064UL, 2801828608UL,
+2617279488UL, 2332066816UL, 1979745024UL, 1526760192UL, 922780672UL, 33536UL,
+3788396032UL, 3335674112UL, 2765315584UL, 2111136768UL, 1339450624UL, 365656576UL,
+ 63082752UL, 12295936UL, 11970560UL, 3719650560UL, 3249824512UL, 2813814528UL,
+2310630656UL, 1589276416UL, 548961024UL, 11832576UL, 11310592UL, 11247872UL,
+3701170944UL, 3248318464UL, 2828954368UL, 2342678528UL, 1604678144UL, 631601920UL,
+ 10717440UL, 10391808UL, 10196992UL, 3581634560UL, 3212798976UL, 2877517312UL,
+2441441536UL, 1720349696UL, 831092992UL, 76251904UL, 9145344UL, 9015808UL,
+3646383360UL, 3244059648UL, 2925489664UL, 2539942400UL, 1919448320UL, 1114077696UL,
+ 258375680UL, 7112960UL, 7442176UL, 3543625472UL, 3208146688UL, 2922934272UL,
+2554163712UL, 2000712704UL, 1313044224UL, 575043840UL, 5209600UL, 5932288UL,
+3373955328UL, 3105321984UL, 2870375168UL, 2534961664UL, 2065462272UL, 1478521856UL,
+ 807696128UL, 103643648UL, 4161024UL, 3221257728UL, 2986374656UL, 2818601984UL,
+2550166528UL, 2164290560UL, 1711306240UL, 1090811648UL, 336033024UL, 2258688UL,
+3087039744UL, 2936043520UL, 2768270592UL, 2566944000UL, 2264954112UL, 1879077888UL,
+1459647232UL, 889221632UL, 29184UL, 3788323584UL, 3419421696UL, 2916368128UL,
+2295678464UL, 1607944448UL, 920145664UL, 214853632UL, 12813056UL, 12293120UL,
+3753263360UL, 3266528512UL, 2880784640UL, 2394378240UL, 1740198400UL, 1086018816UL,
+ 179922944UL, 11895040UL, 11439616UL, 3651028480UL, 3214821888UL, 2829012480UL,
+2426556928UL, 1705399552UL, 984111104UL, 111634432UL, 10845184UL, 10520576UL,
+3514846208UL, 3179433984UL, 2860864000UL, 2441565440UL, 1837848576UL, 1032804864UL,
+ 126903808UL, 9467648UL, 9404672UL, 3445641472UL, 3126940416UL, 2858767616UL,
+2489931520UL, 1919638016UL, 1148214016UL, 225534208UL, 7761664UL, 7961344UL,
+3577695744UL, 3208663808UL, 2940294144UL, 2554615552UL, 2051561984UL, 1431066624UL,
+ 575365120UL, 5335296UL, 6059264UL, 3525466112UL, 3189790464UL, 2921224192UL,
+2535414272UL, 2065849088UL, 1478908672UL, 791240448UL, 103900160UL, 4287744UL,
+3355862016UL, 3053477632UL, 2768264448UL, 2466274560UL, 2097175808UL, 1627610624UL,
+1057316864UL, 302604288UL, 2319616UL, 3103812352UL, 2902484736UL, 2717934592UL,
+2499830528UL, 2231395584UL, 1811964160UL, 1375756288UL, 855662592UL, 24320UL,
+3771475200UL, 3486721024UL, 3034129920UL, 2413700864UL, 1608592384UL, 971255296UL,
+ 484522240UL, 81025280UL, 12940544UL, 3753388544UL, 3300207104UL, 2947951872UL,
+2545496320UL, 1840920320UL, 1253980416UL, 767377152UL, 112875776UL, 11891200UL,
+3667996416UL, 3248500736UL, 2862624768UL, 2527278080UL, 1806055424UL, 1101543680UL,
+ 480854016UL, 10901504UL, 10907648UL, 3531944960UL, 3179623680UL, 2860987904UL,
+2475309312UL, 1905146624UL, 1150303488UL, 429080832UL, 9656320UL, 9727232UL,
+3462806272UL, 3127130368UL, 2858957312UL, 2490186752UL, 1936604416UL, 1265778176UL,
+ 477577472UL, 8082688UL, 8283904UL, 3443932672UL, 3091611136UL, 2840018176UL,
+2471116544UL, 2001616384UL, 1381056256UL, 609632256UL, 5983488UL, 6577920UL,
+3643357184UL, 3207085056UL, 2905095424UL, 2536062464UL, 2083274496UL, 1529823488UL,
+ 993213184UL, 87509248UL, 4479232UL, 3607905024UL, 3171369216UL, 2852471296UL,
+2533704448UL, 2131051776UL, 1627800832UL, 1007174912UL, 286213888UL, 2510080UL,
+3238023424UL, 2952810496UL, 2717929472UL, 2466271232UL, 2181058816UL, 1761627648UL,
+1291864832UL, 805325312UL, 18688UL, 3787985920UL, 3604286720UL, 3202353920UL,
+2649098752UL, 1693452800UL, 904859904UL, 284233984UL, 116139008UL, 14502144UL,
+3837334272UL, 3317042944UL, 3015249920UL, 2679968512UL, 1992300544UL, 1371676672UL,
+ 935600640UL, 616638976UL, 12140288UL, 3718584320UL, 3248690432UL, 2913210880UL,
+2594640896UL, 2007635712UL, 1252793856UL, 699277056UL, 296560640UL, 11159552UL,
+3565755904UL, 3196591360UL, 2878020352UL, 2508987136UL, 2022710016UL, 1267867392UL,
+ 580198144UL, 93792768UL, 9849344UL, 3513459456UL, 3127452416UL, 2859147264UL,
+2456756224UL, 1953570816UL, 1349853440UL, 595075072UL, 8334848UL, 8538624UL,
+3494717696UL, 3108710400UL, 2823562496UL, 2454660096UL, 1985094656UL, 1414865664UL,
+ 693772800UL, 73608960UL, 6965248UL, 3543149568UL, 3073321728UL, 2788108288UL,
+2419074816UL, 1999841024UL, 1496720640UL, 859448576UL, 88091648UL, 4931328UL,
+3826590976UL, 3222479872UL, 2886739456UL, 2534287104UL, 2131699712UL, 1628514560UL,
+1041508608UL, 589112320UL, 2766336UL, 3590336000UL, 3087020032UL, 2768253696UL,
+2499818752UL, 2214606592UL, 1761621760UL, 1241527296UL, 738210048UL, 12544UL,
+3737911296UL, 3654615040UL, 3353018368UL, 2816147456UL, 2162098176UL, 1357381632UL,
+ 787152896UL, 485818368UL, 16711680UL, 3803643904UL, 3367370752UL, 3099197440UL,
+2847866880UL, 2361720832UL, 1573584896UL, 1070333952UL, 785252352UL, 13107200UL,
+3718709248UL, 3282370560UL, 2963603456UL, 2712141824UL, 2309750784UL, 1555038208UL,
+ 984678400UL, 682885120UL, 11599872UL, 3549233152UL, 3213688832UL, 2911764480UL,
+2576416768UL, 2207449088UL, 1570045952UL, 865599488UL, 446365696UL, 10223616UL,
+3328835584UL, 3178037248UL, 2876243968UL, 2507341824UL, 2071330816UL, 1551368192UL,
+ 813367296UL, 209780736UL, 8912896UL, 3192193024UL, 3041525760UL, 2823815168UL,
+2438135808UL, 1985413120UL, 1482293248UL, 861798400UL, 140771328UL, 7405568UL,
+3122659328UL, 2888105984UL, 2653618176UL, 2368798720UL, 1983250432UL, 1463418880UL,
+ 876412928UL, 172228608UL, 5570560UL, 3322216448UL, 2953379840UL, 2651586560UL,
+2349858816UL, 1964376064UL, 1494876160UL, 975044608UL, 321191936UL, 3473408UL,
+4278190080UL, 3288334336UL, 2902458368UL, 2583691264UL, 2231369728UL, 1811939328UL,
+1291845632UL, 704643072UL, 0UL
+};
+*/
+
+APDK_END_NAMESPACE
+
+#endif //APDK_DJ8x5
diff --git a/prnt/hpijs/pmselect.cpp b/prnt/hpijs/pmselect.cpp
new file mode 100644
index 0000000..6711865
--- /dev/null
+++ b/prnt/hpijs/pmselect.cpp
@@ -0,0 +1,295 @@
+/*****************************************************************************\
+ pmselect.cpp : Implimentation for the ModeSet class
+
+ Copyright (c) 2001 - 2002, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#include "header.h"
+#include "pmselect.h"
+
+APDK_BEGIN_NAMESPACE
+
+ModeSet::ModeSet
+(
+ PrintMode* pPM
+)
+{
+ ASSERT(pPM);
+ m_ListHead = new MSNode;
+
+ if (m_ListHead != NULL)
+ {
+ m_ListHead->m_pNext = NULL;
+ m_ListHead->m_pPrintMode = pPM;
+ }
+ Reset(); // m_Current = m_ListHead;
+} //ModeSet
+
+
+ModeSet::~ModeSet()
+{
+ if (m_ListHead != NULL)
+ {
+ Reset();
+ while (m_Current != NULL)
+ {
+ MSNode* pDeleteable = m_Current;
+ Next(); //m_Current = m_Current->m_pNext;
+ delete pDeleteable;
+ }
+ m_ListHead = NULL;
+ }
+} //~ModeSet
+
+// note that copy constructor, Head() and all "Subset" methods make NEW COPIES that need deleting
+
+// copy constructor
+ModeSet::ModeSet
+(
+ ModeSet* pSource
+) :
+ m_ListHead(NULL),
+ m_Current(NULL)
+{
+ ASSERT(pSource);
+
+ MSNode* t_SrcNode = pSource->m_ListHead;
+
+ while (t_SrcNode)
+ {
+ Append(t_SrcNode->m_pPrintMode);
+ t_SrcNode = t_SrcNode->m_pNext;
+ }
+} //ModeSet
+
+
+BOOL ModeSet::Append(PrintMode* pPrM) // return TRUE for memerr
+{
+ ASSERT(pPrM);
+ if (m_ListHead == NULL)
+ {
+ m_ListHead = new MSNode;
+ if (m_ListHead == NULL)
+ {
+ return TRUE; // memory error
+ }
+ m_ListHead->m_pPrintMode = pPrM;
+ }
+ else
+ {
+ MSNode* t_walk;
+ if (m_Current != NULL) // try to be effiecient and not walk the whole list
+ {
+ t_walk = m_Current;
+ }
+ else
+ {
+ t_walk = m_ListHead; // we know m_ListHead != NULL from above
+ }
+
+ while(t_walk->m_pNext != NULL)
+ {
+ t_walk = t_walk->m_pNext;
+ }
+
+ t_walk->m_pNext = new MSNode;
+ if (t_walk->m_pNext == NULL)
+ {
+ return TRUE; // memory error
+ }
+
+ // update current pointer (possible to shorten next append
+ // i.e. current will point to the last item in the list after an append
+ m_Current = t_walk->m_pNext;
+ m_Current->m_pPrintMode = pPrM; // finally!!
+ }
+
+ return FALSE; // no error
+} //Append
+
+
+unsigned int ModeSet::Size() const
+{
+ unsigned int uCount = 0;
+
+ MSNode* t_walk = m_ListHead;
+ while (t_walk != NULL)
+ {
+ uCount++;
+ t_walk = t_walk->m_pNext;
+ }
+
+ return uCount;
+} //Size
+
+// strange name...? Create a new one entry list with the first entry of this list
+ModeSet* ModeSet::Head()
+{
+ ASSERT(m_ListHead);
+ ModeSet* pNew = new ModeSet(HeadPrintMode());
+ return pNew;
+} //Head
+
+
+ModeSet* ModeSet::FontCapableSubset()
+{
+ ModeSet* resMS = new ModeSet;
+ if (resMS == NULL)
+ {
+ return NULL;
+ }
+
+ Reset();
+ while(m_Current)
+ {
+ // if we have set up the list properly we never have to worry about m_pPrintMode
+ // being NULL. If it is NULL then we shouldn't even have a node.
+ ASSERT(CurrPrintMode());
+
+ if(CurrPrintMode()->bFontCapable)
+ {
+ if(resMS->Append(CurrPrintMode()))
+ {
+ delete resMS; // there was a memory error appending
+ return NULL;
+ }
+ }
+ Next(); //m_Current = m_Current->m_pNext;
+ }
+ return resMS;
+} //FontCapableSubset
+
+
+ModeSet* ModeSet::PenCompatibleSubset(PEN_TYPE pens)
+{
+ ModeSet* resMS = new ModeSet;
+ if (resMS == NULL)
+ {
+ return NULL;
+ }
+
+ Reset();
+ while(m_Current)
+ {
+ ASSERT(CurrPrintMode()); // see comments above
+
+ if(CurrPrintMode()->Compatible(pens))
+ {
+ if(resMS->Append(CurrPrintMode()))
+ {
+ delete resMS; // memory error
+ return NULL;
+ }
+ }
+ Next();
+ }
+ return resMS;
+} //PenCompatibleSubset
+
+
+ModeSet* ModeSet::ColorCompatibleSubset(COLORMODE color)
+{
+ ModeSet* resMS = new ModeSet;
+ if (resMS == NULL)
+ {
+ return NULL;
+ }
+
+ Reset();
+ while(m_Current)
+ {
+ ASSERT(CurrPrintMode()); // see comments above
+
+ if (CurrPrintMode()->ColorCompatible(color))
+ {
+ if(resMS->Append(CurrPrintMode()))
+ {
+ delete resMS; // memory error
+ return NULL;
+ }
+ }
+ Next();
+ }
+ return resMS;
+} //ColorCompatibleSubset
+
+
+ModeSet* ModeSet::QualitySubset(QUALITY_MODE eQuality)
+{
+ ModeSet* resMS = new ModeSet;
+ if (resMS == NULL)
+ {
+ return NULL;
+ }
+
+ Reset();
+ while(m_Current)
+ {
+ ASSERT(CurrPrintMode()); // see comments above
+
+ if (CurrPrintMode()->QualityCompatible(eQuality))
+ {
+ if(resMS->Append(CurrPrintMode()))
+ {
+ delete resMS; // memory error
+ return NULL;
+ }
+ }
+ Next();
+ }
+ return resMS;
+} //QualitySubset
+
+
+ModeSet* ModeSet::MediaSubset(MEDIATYPE eMedia)
+{
+ ModeSet* resMS = new ModeSet;
+ if (resMS == NULL)
+ {
+ return NULL;
+ }
+
+ Reset();
+ while(m_Current)
+ {
+ ASSERT(CurrPrintMode()); // see comments above
+
+ if (CurrPrintMode()->MediaCompatible(eMedia))
+ {
+ if(resMS->Append(CurrPrintMode()))
+ {
+ delete resMS; // memory error
+ return NULL;
+ }
+ }
+ Next();
+ }
+ return resMS;
+} //MediaSubset
+
+APDK_END_NAMESPACE
diff --git a/prnt/hpijs/pmselect.h b/prnt/hpijs/pmselect.h
new file mode 100644
index 0000000..9015e00
--- /dev/null
+++ b/prnt/hpijs/pmselect.h
@@ -0,0 +1,95 @@
+/*****************************************************************************\
+ pmselect.h : Interface for the ModeSet class
+
+ Copyright (c) 2001 - 2002, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#ifndef APDK_PMSELECT_H
+#define APDK_PMSELECT_H
+
+APDK_BEGIN_NAMESPACE
+
+//MSNode
+//!
+/*!
+\internal
+******************************************************************************/
+struct MSNode
+{
+ //public constructor
+ MSNode() : m_pNext(NULL), m_pPrintMode(NULL) { }
+
+ // public attribs
+ MSNode* m_pNext;
+ PrintMode* m_pPrintMode;
+};
+
+//ModeSet
+//!
+/*!
+\internal
+******************************************************************************/
+class ModeSet
+{
+public:
+ ModeSet() : m_ListHead(NULL), m_Current(NULL) { }
+ ModeSet(PrintMode* pPM);
+ ModeSet(ModeSet* pMS);
+ ~ModeSet();
+
+ // generic container properties and manipulations
+ ModeSet* Head();
+ PrintMode* HeadPrintMode() const { return m_ListHead->m_pPrintMode; }
+ PrintMode* CurrPrintMode() const { return m_Current->m_pPrintMode; }
+ MSNode* Next() { m_Current = m_Current->m_pNext; return m_Current; }
+ void Reset() { m_Current = m_ListHead; }
+ BOOL Append(PrintMode* pPrM); // TRUE if err
+ BOOL IsEmpty() const { return (m_ListHead == NULL); }
+ unsigned int Size() const;
+
+ // subset producers
+ ModeSet* FontCapableSubset();
+ ModeSet* PenCompatibleSubset(PEN_TYPE pens);
+ ModeSet* ColorCompatibleSubset(COLORMODE color);
+ ModeSet* QualitySubset(QUALITY_MODE eQuality);
+ ModeSet* MediaSubset(MEDIATYPE eMedia);
+
+ // algorithmic chunks to improve readability and save space
+// DRIVER_ERROR QualitySieve(ModeSet*& Modes, ModeSet*& tempModeSet, QUALITY_MODE& eQuality);
+
+private:
+ MSNode* m_ListHead;
+ MSNode* m_Current;
+
+// PrintMode* m_pPM;
+// ModeSet* m_nextMS;
+}; //ModeSet
+
+APDK_END_NAMESPACE
+
+#endif //APDK_PMSELECT_H
diff --git a/prnt/hpijs/printer.cpp b/prnt/hpijs/printer.cpp
new file mode 100644
index 0000000..74df6ef
--- /dev/null
+++ b/prnt/hpijs/printer.cpp
@@ -0,0 +1,1289 @@
+/*****************************************************************************\
+ printer.cpp : Implimentation for the Printer class
+
+ Copyright (c) 1996 - 2006, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#include "header.h"
+#include "io_defs.h"
+#include "resources.h"
+
+
+//
+// ** Printer CLASS **
+
+APDK_BEGIN_NAMESPACE
+extern BYTE* GetHTBinary();
+APDK_END_NAMESPACE
+
+APDK_BEGIN_NAMESPACE
+
+Printer::Printer
+(
+ SystemServices* pSys,
+ int numfonts,
+ BOOL proto
+) :
+ constructor_error(NO_ERROR),
+ IOMode(pSys->IOMode),
+#if defined(APDK_FONTS_NEEDED)
+ iNumFonts(numfonts),
+#else
+ iNumFonts(0),
+#endif
+ bCheckForCancelButton(FALSE),
+ ulBytesSentSinceCancelCheck(0),
+ ePen(NO_PEN),
+ CMYMap(NULL),
+ pSS(pSys),
+ InSlowPollMode(0),
+ iTotal_SLOW_POLL_Count(0),
+ iMax_SLOW_POLL_Count(DEFAULT_SLOW_POLL_COUNT),
+ ErrorTerminationState(FALSE),
+ iBuffSize(pSys->GetSendBufferSize()),
+ iCurrBuffSize(0),
+ EndJob(FALSE),
+ ModeCount(2),
+ m_bVIPPrinter(FALSE)
+{
+
+ int i = 0; // counter
+
+#ifdef APDK_LINUX
+ m_iNumPages = 0;
+#endif
+
+ for (i = 0; i < MAX_PRINTMODES; i++)
+ {
+ pMode[i]=NULL;
+ }
+
+ //CompatiblePens[0] = BOTH_PENS;
+ //for (i = 1; i < MAX_COMPATIBLE_PENS; i++)
+ //{
+ // CompatiblePens[i] = DUMMY_PEN;
+ //}
+
+ if (IOMode.bDevID)
+ {
+ iMax_SLOW_POLL_Count = DEFAULT_SLOW_POLL_BIDI;
+ }
+
+ // Allocate memory for my send buffer
+ pSendBuffer = NULL;
+#ifdef APDK_BUFFER_SEND
+ pSendBuffer = pSS->AllocMem(iBuffSize+2);
+ CNEWCHECK(pSendBuffer);
+#endif
+
+#ifdef APDK_AUTODUPLEX
+ bDuplexCapable = FALSE;
+ m_bRotateBackPage = TRUE;
+#endif
+
+/*
+ * LaserJet printers do not send status via device id string. PJL is used to
+ * get status.
+ * REVISIT: Do the same for Business Inkjets as well.
+ */
+
+ m_bStatusByPJL = FALSE;
+ char *tmpStr;
+ if ((strstr ((char *) pSS->strDevID, "LaserJet")) &&
+ (tmpStr = strstr ((char *) pSS->strDevID, "CMD:")) &&
+ (tmpStr = strstr (tmpStr+4, "PJL")))
+ {
+ m_bStatusByPJL = TRUE;
+ }
+
+#if defined(APDK_FONTS_NEEDED)
+ // create dummy font objects to be queried via EnumFont
+ // these fonts used by all except DJ400
+
+ for (i = 0; i<=MAX_PRINTER_FONTS; i++)
+ fontarray[i] = NULL;
+
+
+#ifdef APDK_COURIER
+ fontarray[COURIER_INDEX] = new Courier();
+ CNEWCHECK(fontarray[COURIER_INDEX]);
+#endif
+#ifdef APDK_CGTIMES
+ fontarray[CGTIMES_INDEX] = new CGTimes();
+ CNEWCHECK(fontarray[CGTIMES_INDEX]);
+#endif
+#ifdef APDK_LTRGOTHIC
+ fontarray[LETTERGOTHIC_INDEX] = new LetterGothic();
+ CNEWCHECK(fontarray[LETTERGOTHIC_INDEX]);
+#endif
+#ifdef APDK_UNIVERS
+ fontarray[UNIVERS_INDEX] = new Univers();
+ CNEWCHECK(fontarray[UNIVERS_INDEX]);
+#endif
+
+#endif //
+} //Printer
+
+
+Printer::~Printer()
+{
+ if (pMode[GRAYMODE_INDEX])
+ {
+ if (pMode[GRAYMODE_INDEX]->dyeCount==3) // only happens when compgray map used
+ {
+ pSS->FreeMem((BYTE*) pMode[GRAYMODE_INDEX]->cmap.ulMap1 );
+ }
+ }
+
+ for (int i = 0; i < MAX_PRINTMODES; i++)
+ {
+ if (pMode[i])
+ {
+ delete pMode[i];
+ }
+ }
+
+#ifdef APDK_BUFFER_SEND
+ if (pSendBuffer != NULL)
+ {
+ pSS->FreeMem(pSendBuffer);
+ }
+#endif
+
+#ifdef APDK_COURIER
+ delete fontarray[COURIER_INDEX];
+#endif
+#ifdef APDK_CGTIMES
+ delete fontarray[CGTIMES_INDEX];
+#endif
+#ifdef APDK_LTRGOTHIC
+ delete fontarray[LETTERGOTHIC_INDEX];
+#endif
+#ifdef APDK_UNIVERS
+ delete fontarray[UNIVERS_INDEX];
+#endif
+
+} //~Printer
+
+
+////////////////////////////////////////////////////////////////////////////
+Compressor* Printer::CreateCompressor (unsigned int RasterSize)
+{
+ return new Mode9 (pSS, RasterSize); // most printers use mode 9
+}
+
+////////////////////////////////////////////////////////////////////////////
+Compressor* Printer::CreateBlackPlaneCompressor (unsigned int RasterSize,
+ BOOL bVIPPrinter)
+{
+ return new Mode9 (pSS, RasterSize, bVIPPrinter); // most printers use mode 9
+}
+
+////////////////////////////////////////////////////////////////////////////
+// ** API functions
+//
+
+
+DRIVER_ERROR Printer::Flush
+(
+ int FlushSize // = MAX_RASTERSIZE
+)
+// flush possible leftover garbage --
+// default call will send one (maximal) raster's worth of zeroes
+{
+ ASSERT(FlushSize > 0);
+ ASSERT(FlushSize <= MAX_RASTERSIZE);
+
+ DRIVER_ERROR err = NO_ERROR;
+ int iChunkSize = 1000;
+ BYTE *zero = NULL;
+
+ // Try to allocate iChunkSize bytes of memory. If we fail then cut size
+ // in half and try again. If we can't allocate even 10 bytes then bail
+ // with a memory allocation error. Flush is called at the beginning of
+ // the print job - if there is no memory allocate now then we won't be
+ // printing in any case.
+ while (iChunkSize > 10 && zero == NULL)
+ {
+ zero = pSS->AllocMem(iChunkSize);
+ if (zero == NULL)
+ {
+ iChunkSize /= 2;
+ }
+ }
+
+ if (zero == NULL)
+ {
+ return ALLOCMEM_ERROR;
+ }
+
+ memset(zero, 0, iChunkSize);
+ int iChunks = (FlushSize / iChunkSize) + 1;
+
+ for (int i = 0; i < iChunks; i++)
+ {
+ if ((err = Send( zero, iChunkSize)) != NO_ERROR)
+ {
+ break; // there was an error
+ }
+ }
+ pSS->FreeMem(zero); //break to here
+ return err;
+} //Flush
+
+
+/*
+ * Function name: ParseError
+ *
+ * Owner: Darrell Walker
+ *
+ * Purpose: To determine what error state the printer is in.
+ *
+ * Called by: Send()
+ *
+ * Parameters on entry: status_reg is the contents of the centronics
+ * status register (at the time the error was
+ * detected)
+ *
+ * Parameters on exit: unchanged
+ *
+ * Return Values: The proper DISPLAY_STATUS to reflect the printer
+ * error state.
+ *
+ */
+
+DISPLAY_STATUS Printer::ParseError
+(
+ BYTE status_reg
+)
+{
+ DBG1("Printer: parsing error info\n");
+
+ DRIVER_ERROR err = NO_ERROR;
+ BYTE DevIDBuffer[DevIDBuffSize];
+
+ if(IOMode.bDevID)
+ {
+ // If a bi-di cable was plugged in and everything was OK, let's see if it's still
+ // plugged in and everything is OK
+ err = pSS->GetDeviceID(DevIDBuffer, DevIDBuffSize, TRUE);
+ if(err != NO_ERROR)
+ {
+ // job was bi-di but now something's messed up, probably cable unplugged
+ // or printer turned off during print job
+ return DISPLAY_COMM_PROBLEM;
+ }
+ }
+
+ // check for errors we can detect from the status reg
+
+ if (IOMode.bStatus)
+ {
+ if ( DEVICE_IS_OOP(status_reg) )
+ {
+ DBG1("Out Of Paper\n");
+ return DISPLAY_OUT_OF_PAPER;
+ }
+
+ if (DEVICE_PAPER_JAMMED(status_reg))
+ {
+ DBG1("Paper Jammed\n");
+ return DISPLAY_PAPER_JAMMED;
+ }
+ if (DEVICE_IO_TRAP(status_reg))
+ {
+ DBG1("IO Trap\n");
+ return DISPLAY_ERROR_TRAP;
+ }
+ }
+
+ if (IOMode.bDevID)
+ {
+ if ( TopCoverOpen(status_reg) )
+ {
+ DBG1("Top Cover Open\n");
+ return DISPLAY_TOP_COVER_OPEN;
+ }
+
+ // VerifyPenInfo will handle prompting the user
+ // if this is a problem
+ VerifyPenInfo();
+ }
+
+ // don't know what the problem is-
+ // Is the PrinterAlive?
+ if (pSS->PrinterIsAlive()) // <- This is only viable if bStatus is TRUE
+ {
+ iTotal_SLOW_POLL_Count += iMax_SLOW_POLL_Count;
+
+ // -Note that iTotal_SLOW_POLL_Count is a multiple of
+ // iMax_SLOW_POLL_Count allowing us to check this
+ // on an absolute time limit - not relative to the number
+ // of times we happen to have entered ParseError.
+ // -Also note that we have different thresholds for uni-di & bi-di.
+
+ // REVISIT these counts - they are relative to the speed through
+ // the send loop aren't they? They may be too long!
+ if(
+ ((IOMode.bDevID == FALSE) && (iTotal_SLOW_POLL_Count >= 60)) ||
+ ((IOMode.bDevID == TRUE) && (iTotal_SLOW_POLL_Count >= 120))
+ )
+ {
+ return DISPLAY_BUSY;
+ }
+ else
+ {
+ return DISPLAY_PRINTING;
+ }
+ }
+ else
+ {
+ return DISPLAY_COMM_PROBLEM;
+ }
+} //ParseError
+
+DRIVER_ERROR Printer::Encapsulate
+(
+ const RASTERDATA* InputRaster,
+ BOOL bLastPlane
+)
+{
+ DRIVER_ERROR err;
+ char scratch[20];
+ int scratchLen;
+
+ if (bLastPlane)
+ {
+ if (VIPPrinter())
+ {
+ if (InputRaster->rastersize[COLORTYPE_BLACK] != 0)
+ {
+ if (InputRaster->rastersize[COLORTYPE_COLOR] != 0)
+ {
+ scratchLen = sprintf (scratch, "\033*b%uV", InputRaster->rastersize[COLORTYPE_BLACK]);
+ err = Send ((const BYTE*) scratch, scratchLen);
+ if (err == NO_ERROR)
+ {
+ err = Send (InputRaster->rasterdata[COLORTYPE_BLACK], InputRaster->rastersize[COLORTYPE_BLACK]);
+ }
+ if (err == NO_ERROR)
+ {
+ scratchLen = sprintf (scratch, "\033*b%uW", InputRaster->rastersize[COLORTYPE_COLOR]);
+ err = Send ((const BYTE*) scratch, scratchLen);
+ if (err == NO_ERROR)
+ {
+ err = Send (InputRaster->rasterdata[COLORTYPE_COLOR], InputRaster->rastersize[COLORTYPE_COLOR]);
+ }
+ }
+ }
+ else
+ {
+ scratchLen = sprintf (scratch, "\033*b%uV", InputRaster->rastersize[COLORTYPE_BLACK]);
+ err = Send ((const BYTE*) scratch, scratchLen);
+ if (err == NO_ERROR)
+ {
+ err = Send (InputRaster->rasterdata[COLORTYPE_BLACK], InputRaster->rastersize[COLORTYPE_BLACK]);
+ if (err == NO_ERROR)
+ {
+ scratchLen = sprintf (scratch, "\033*b%uW", 0);
+ err = Send ((const BYTE*) scratch, scratchLen);
+ }
+ }
+ }
+ }
+ else
+ {
+ scratchLen = sprintf (scratch, "\033*b%uV", 0);
+ err = Send ((const BYTE*) scratch, scratchLen);
+ if (err == NO_ERROR)
+ {
+ scratchLen = sprintf (scratch, "\033*b%uW", InputRaster->rastersize[COLORTYPE_COLOR]);
+ err = Send ((const BYTE*) scratch, scratchLen);
+ if (err == NO_ERROR && InputRaster->rastersize[COLORTYPE_COLOR] != 0)
+ {
+ err = Send (InputRaster->rasterdata[COLORTYPE_COLOR], InputRaster->rastersize[COLORTYPE_COLOR]);
+ }
+ }
+ }
+ }
+ else
+ {
+ scratchLen = sprintf (scratch, "\033*b%uW", InputRaster->rastersize[COLORTYPE_COLOR]);
+ err = Send ((const BYTE*) scratch, scratchLen);
+ if (err == NO_ERROR)
+ {
+ err = Send (InputRaster->rasterdata[COLORTYPE_COLOR], InputRaster->rastersize[COLORTYPE_COLOR]);
+ }
+ }
+ }
+ else
+ {
+ scratchLen = sprintf (scratch, "\033*b%uV", InputRaster->rastersize[COLORTYPE_COLOR]);
+ err = Send ((const BYTE*) scratch, scratchLen);
+ if (err == NO_ERROR)
+ {
+ err = Send (InputRaster->rasterdata[COLORTYPE_COLOR], InputRaster->rastersize[COLORTYPE_COLOR]);
+ }
+ }
+ return err;
+}
+
+
+DRIVER_ERROR Printer::Send
+(
+ const BYTE* pWriteBuff
+)
+{
+ ASSERT(pWriteBuff);
+ int len = strlen((const char*)pWriteBuff);
+ return Send(pWriteBuff,len);
+} //Send
+
+
+/*
+ * Function name: Printer::Send
+ *
+ * Owner: Darrell Walker
+ *
+ * Purpose: Encapsulate error handling generated by performing I/O
+ *
+ * Called by:
+ *
+ * Calls made: WritePort(), GetStatus(), BusyWait(), ParseError(),
+ * DisplayPrinterStatus(), YieldToSystem()
+ *
+ * Parameters on entry: pJob is a pointer to the current JOBSTRUCT,
+ * pWriteBuff is a pointer to the data the
+ * caller wishes to send to the pritner,
+ * wWriteCount is the number of bytes of
+ * pWriteBuff to send
+ *
+ * Parameters on exit: Unchanged
+ *
+ * Side effects: Sends data to the printer, may update print dialog,
+ * may change pJob->InSlowPollMode,
+ * pJob->ErrorTerminationState
+ *
+ * Return Values: NO_ERROR or JOB_CANCELED or IO_ERROR
+ *
+ * Comments: (TJL) This routine now has functionality to attempt iterating
+ * through wWriteCount bytes of data (until we hit slow poll mode)
+ * before sending PCL cleanup code. This still leaves the possibility of
+ * prematurely exiting with an incomplete raster, but gives I/O a fighting chance
+ * of completing the raster while also protecting from a bogged down slow poll phase
+ * which would prevent a timely exit from CANCEL. A JobCanceled flag is used
+ * because JOB_CANCELED cannot be maintained by write_error through the while
+ * loop since it will be overwritten by next ToDevice.
+ *
+ */
+
+DRIVER_ERROR Printer::Send
+(
+ const BYTE* pWriteBuff,
+ DWORD dwWriteCount
+)
+{
+ ASSERT(pWriteBuff);
+
+ DRIVER_ERROR write_error = NO_ERROR;
+ DWORD residual = 0;
+ const BYTE * pWritePos = NULL;
+ BOOL error_displayed = FALSE;
+ BYTE status_reg = 0;
+ DISPLAY_STATUS eDisplayStatus = DISPLAY_PRINTING;
+ BOOL JobCanceled = FALSE; // see comments in function header
+
+ // these are just an abstraction layer - buffered vs. non-buffered
+ const BYTE * pBuffer = pWriteBuff;
+ DWORD dwSendSize = dwWriteCount;
+
+////////////////////////////////////////////////////////////////
+#ifdef NULL_IO
+ // test imaging speed independent of printer I/O, will not
+ // send any data to the device
+ return NO_ERROR;
+#endif
+////////////////////////////////////////////////////////////////
+
+ if (ErrorTerminationState) // don't try any more IO if we previously
+ {
+ return JOB_CANCELED; // terminated in an error state
+ }
+
+ if (EndJob == FALSE && dwWriteCount == 0) // don't bother processing
+ {
+ return NO_ERROR; // an empty Send call
+ }
+
+#ifdef APDK_BUFFER_SEND
+ DWORD BytesToWrite = dwWriteCount;
+
+ do
+ {
+ // we should bypass the buffering for a large Send, but don't lose what may already be buffered
+ if ( (BytesToWrite >= iBuffSize) && (iCurrBuffSize == 0) )
+ {
+ pBuffer = pWriteBuff+(dwWriteCount-BytesToWrite);
+ dwSendSize = BytesToWrite;
+ BytesToWrite = 0; // this is checked for at the end of the outer loop
+ }
+ else // we will buffer this data
+ {
+ // if it'll fit then just copy everything to the buffer
+ if (BytesToWrite <= DWORD(iBuffSize-iCurrBuffSize))
+ {
+ memcpy((void*)(pSendBuffer+iCurrBuffSize),
+ (void*)(pWriteBuff+(dwWriteCount-BytesToWrite)),BytesToWrite);
+ iCurrBuffSize += BytesToWrite;
+ BytesToWrite = 0;
+ }
+ else // copy what we can into the buffer, we'll get the rest later
+ {
+ memcpy((void*)(pSendBuffer+iCurrBuffSize),
+ (void*)(pWriteBuff+(dwWriteCount-BytesToWrite)),
+ iBuffSize-iCurrBuffSize);
+ BytesToWrite -= (iBuffSize-iCurrBuffSize);
+ iCurrBuffSize = iBuffSize;
+ }
+
+ // if the buffer is now full (ready-to-send) or if we're at
+ // the end of the job, then send what we have in the buffer.
+ // otherwise just break (the buffer isn't ready to send)
+ if ( (EndJob == FALSE) && (iCurrBuffSize != iBuffSize) )
+ {
+ break; // we're not ready to send yet
+ }
+ else // send this buffered data
+ {
+ pBuffer = pSendBuffer;
+ dwSendSize = iCurrBuffSize;
+ }
+ }
+#endif
+
+ // initialize our 'residual' to the full send size
+ residual = dwSendSize;
+
+ if (bCheckForCancelButton &&
+ (ulBytesSentSinceCancelCheck >= CANCEL_BUTTON_CHECK_THRESHOLD) &&
+ (pSS->IOMode.bDevID))
+ {
+ ulBytesSentSinceCancelCheck = 0;
+ char* tmpStr;
+ BYTE DevIDBuffer[DevIDBuffSize];
+ DRIVER_ERROR tmpErr = pSS->GetDeviceID(DevIDBuffer, DevIDBuffSize, TRUE);
+ if(tmpErr)
+ return tmpErr;
+ BOOL cancelcheck=FALSE;
+
+ if((tmpStr = strstr((char*)DevIDBuffer + 2,"CNCL")))
+ {
+ cancelcheck=TRUE;
+ }
+ else
+ {
+ int iVersion = pSS->GetVIPVersion ();
+
+ if((tmpStr = strstr((char*)DevIDBuffer + 2,";S:")) &&
+ iVersion < 6) // DJ990 devID style
+ {
+ // point to PrinterState
+/*
+ * VIPVersion = DevID Version + 1 - DevID Version no is 2 bytes following ;S:
+ * Version 00 and 01 report 12 bytes for status info
+ * Version 02 and onwards, report two additional bytes before pen info
+ */
+
+ if (iVersion < 3)
+ {
+ tmpStr += 17; // 3 for ";S:", 2 for version, 12 for features = 17
+ }
+ else if (iVersion < 5)
+ {
+ tmpStr += 19; // 17 as above plus 1 for MaxPaperSize, 1 reserved = 19
+ }
+ else
+ {
+ tmpStr += 23; // Crystal added 4 more nibbles
+ }
+
+ BYTE b1=*tmpStr++;
+ BYTE b2=*tmpStr++;
+ if (((b1=='0') && (b2=='5')) && iVersion <= 5) // 05 = cancel
+ {
+ cancelcheck=TRUE;
+ }
+ }
+ }
+ if (cancelcheck)
+ {
+ // Since the printer is now just throwing data away, we can bail
+ // immediately w/o worrying about finishing the raster so the
+ // end-of-job FF will work.
+ ErrorTerminationState = TRUE;
+ pSS->DisplayPrinterStatus(DISPLAY_PRINTING_CANCELED);
+ return JOB_CANCELED;
+ }
+ }
+
+ // If we have nothing to send, we need to bail to avoid spurious dialogs
+ // at the end of the ::send function. I'd prefer a solution where we don't
+ // bail from a while loop but in practice this shouldn't have any ill effects.
+ if (residual <= 0)
+ {
+ return NO_ERROR;
+ }
+
+ while (residual > 0) // while still data to send in this request
+ {
+ DWORD prev_residual = residual; // WritePort overwrites request
+ // count, need to save
+
+ pWritePos = (const BYTE *) &(pBuffer[dwSendSize-residual]);
+ write_error = pSS->ToDevice(pWritePos, &residual);
+
+ // The following error handling code is recommended, but is not supported
+ // on several current platforms for this reason: when the printer buffer
+ // fills and declines more data, the O/S returns a BUSY error in one form
+ // or another. The real solution is to allow the code below and have the
+ // derived pSS->ToDevice functions catch and ignore any BUSY error - only
+ // returning a real error to ::Send. The current workaround here is that we
+ // literally ignore all errors returned from the I/O system and ultimately catch
+ // them after we've reached our slow poll limit via the slow poll logic below. -TL
+// if(write_error != NO_ERROR)
+// {
+// DBG1("IO_ERROR returned from ToDevice - ABORT!\n");
+// ErrorTerminationState = TRUE;
+// return write_error;
+// }
+
+ write_error = NO_ERROR;
+ eDisplayStatus = DISPLAY_PRINTING;
+ if (residual == 0) // no more data to send this time
+ {
+ if (m_bStatusByPJL)
+ {
+ status_reg = (BYTE) DISPLAY_PRINTING;
+ if (IOMode.bStatus)
+ eDisplayStatus = ParseError (status_reg);
+ if (eDisplayStatus != DISPLAY_PRINTING)
+ write_error = IO_ERROR;
+ }
+
+ // did we want to transition out of slow poll?
+ if ( (InSlowPollMode != 0) &&
+ (prev_residual > MIN_XFER_FOR_SLOW_POLL) )
+ {
+ InSlowPollMode = 0;
+ iTotal_SLOW_POLL_Count = 0;
+ }
+ if (write_error == NO_ERROR)
+ break; // out of while loop
+ }
+
+
+ // if we are here, WritePort() was not able to
+ // send the full request so start looking for errors
+
+ // decide whether we've waited long enough to check for an error
+ if (InSlowPollMode > iMax_SLOW_POLL_Count )
+ {
+ if (JobCanceled == TRUE)
+ // Well, I/O didn't finish in time to meet the CANCEL request and avoid
+ // the SlowPoll threshold. We have to bail for prompt cancel response.
+ {
+ DBG1("Send(SlowPoll): Premature return w/ JOB_CANCELED\n");
+ ErrorTerminationState = TRUE;
+ return JOB_CANCELED;
+ }
+
+ DBG1("Printer slow poll times exceeded\n");
+ // reset counter so we will not pop it next time
+ InSlowPollMode = 1;
+ write_error = IO_ERROR;
+ }
+ else
+ {
+ write_error = NO_ERROR;
+ }
+
+ // are we in slow poll mode? If so, track our count
+ if ( (prev_residual - residual) <= MIN_XFER_FOR_SLOW_POLL)
+ {
+ InSlowPollMode++;
+
+#if defined(DEBUG) && (DBG_MASK & DBG_LVL1)
+ if (InSlowPollMode == 1)
+ {
+ printf("entering slow poll mode\n");
+ }
+ else
+ {
+ printf("still in slow poll mode, count = %d\n",
+ InSlowPollMode);
+ }
+#endif
+ // give the printer some time to process
+ if (pSS->BusyWait((DWORD)200) == JOB_CANCELED)
+ {
+ DBG1("Send: JOB_CANCELED\n");
+ JobCanceled = TRUE;
+ pSS->DisplayPrinterStatus(DISPLAY_PRINTING_CANCELED);
+ }
+ }
+ else
+ {
+ // still busy, but taking enough data that
+ // we are not in slow poll mode
+ DBG1("Partial Send but not slow poll mode\n");
+ InSlowPollMode = 0;
+ iTotal_SLOW_POLL_Count = 0;
+ }
+
+
+ if (write_error != NO_ERROR || (m_bStatusByPJL && eDisplayStatus != DISPLAY_PRINTING))
+ // slow poll times exceeded
+ // the printer isn't taking data so let's see what's wrong...
+ {
+ DBG1("Parsing possible error state...\n");
+ error_displayed = TRUE;
+
+ if (m_bStatusByPJL)
+ {
+ status_reg = (BYTE) eDisplayStatus;
+ }
+ else
+ {
+ // go get the status of the printer
+ if (IOMode.bStatus)
+ {
+ pSS->GetStatusInfo(&status_reg);
+ }
+
+ // determine the error
+ eDisplayStatus = ParseError(status_reg);
+ }
+
+ switch (eDisplayStatus)
+ {
+ case DISPLAY_PRINTING_CANCELED:
+
+ // user canceled in an error state,
+ // so we don't want to attempt any
+ // further communication with the printer
+
+ ErrorTerminationState = TRUE;
+ pSS->DisplayPrinterStatus(eDisplayStatus);
+ return JOB_CANCELED;
+
+ case DISPLAY_ERROR_TRAP:
+ case DISPLAY_COMM_PROBLEM:
+ // these are unrecoverable cases
+ // don't let any more of this job
+ // be sent to the printer
+
+ ErrorTerminationState = TRUE;
+ pSS->DisplayPrinterStatus(eDisplayStatus);
+
+ // wait for user to cancel the job,
+ // otherwise they might miss the
+ // error message
+ while (pSS->BusyWait(500) != JOB_CANCELED)
+ {
+ // nothing....
+ ;
+ }
+ return IO_ERROR;
+
+ case DISPLAY_TOP_COVER_OPEN:
+
+ pSS->DisplayPrinterStatus(DISPLAY_TOP_COVER_OPEN);
+
+ // wait for top cover to close
+ while ( eDisplayStatus == DISPLAY_TOP_COVER_OPEN)
+ {
+ if (pSS->BusyWait((DWORD)500) == JOB_CANCELED)
+ // although we'll leave an incomplete job in the printer,
+ // we really need to bail for proper CANCEL response.
+ {
+ ErrorTerminationState = TRUE;
+ return JOB_CANCELED;
+ }
+
+ if (m_bStatusByPJL)
+ {
+ status_reg = (BYTE) eDisplayStatus;
+ }
+ else
+ {
+ if (IOMode.bStatus)
+ {
+ pSS->GetStatusInfo(&status_reg);
+ }
+ }
+
+ eDisplayStatus = ParseError(status_reg);
+ }
+
+ pSS->DisplayPrinterStatus(DISPLAY_PRINTING);
+
+ // Wait for printer to come back online
+ if (pSS->BusyWait((DWORD)1000) == JOB_CANCELED)
+ // Since the top_cover error HAS been handled, we have
+ // the opportunity to finish the raster before we hit
+ // the next slowpoll threshold.
+ {
+ DBG1("Send: JOB_CANCELED\n");
+ JobCanceled = TRUE;
+ pSS->DisplayPrinterStatus(DISPLAY_PRINTING_CANCELED);
+ }
+
+ break;
+
+ case DISPLAY_OUT_OF_PAPER:
+ case DISPLAY_PHOTOTRAY_MISMATCH:
+ {
+ DISPLAY_STATUS tmpStatus = eDisplayStatus;
+ pSS->DisplayPrinterStatus(eDisplayStatus);
+
+ // wait for the user to add paper and
+ // press resume
+ while ( eDisplayStatus == tmpStatus)
+ {
+ if (pSS->BusyWait((DWORD)500) == JOB_CANCELED)
+ // although we'll leave an incomplete job in the printer,
+ // we really need to bail for proper CANCEL response.
+ {
+ ErrorTerminationState = TRUE;
+ return JOB_CANCELED;
+ }
+
+ if (m_bStatusByPJL)
+ {
+ status_reg = (BYTE) eDisplayStatus;
+ }
+ else
+ {
+ if (IOMode.bStatus)
+ {
+ pSS->GetStatusInfo(&status_reg);
+ }
+ }
+
+ eDisplayStatus = ParseError(status_reg);
+ }
+
+ pSS->DisplayPrinterStatus(DISPLAY_PRINTING);
+
+ break;
+ }
+
+ case DISPLAY_BUSY:
+
+ if (pSS->BusyWait((DWORD)5000) == JOB_CANCELED)
+ {
+ ErrorTerminationState = TRUE;
+ return JOB_CANCELED;
+ }
+
+ pSS->DisplayPrinterStatus(DISPLAY_BUSY);
+
+ break;
+
+ // other cases need no special handling, display
+ // the error and try to continue
+ default:
+ pSS->DisplayPrinterStatus(eDisplayStatus);
+ break;
+ }// switch
+ } // if
+
+ // give printer time to digest the data and check for 'cancel' before
+ // the next iteration of the loop
+ if (pSS->BusyWait((DWORD)100) == JOB_CANCELED)
+ {
+ DBG1("Send: JOB_CANCELED\n");
+ JobCanceled = TRUE;
+ pSS->DisplayPrinterStatus(DISPLAY_PRINTING_CANCELED);
+ }
+
+ } // while (residual > 0)
+
+ // The above BusyWait's will not be checked if residual gets sent the first time, every time
+ // because we 'break' at that point for efficiency. However, we want to make sure we check
+ // at least once for a CANCEL event for timely job-cancel response.
+ if (pSS->BusyWait((DWORD)0) == JOB_CANCELED)
+ {
+ JobCanceled = TRUE;
+ pSS->DisplayPrinterStatus(DISPLAY_PRINTING_CANCELED);
+ }
+
+#ifdef APDK_BUFFER_SEND
+ // Our buffer is now empty: reset the size so concurrent writes start at the beginning
+ iCurrBuffSize = 0;
+
+ } while (BytesToWrite > 0);
+#endif
+
+ // restore my JOB_CANCELED error
+ if (JobCanceled == TRUE)
+ {
+ DBG1("Send: Clean return w/ JOB_CANCELED\n");
+ // ensure that display still says we're cancelling
+ pSS->DisplayPrinterStatus(DISPLAY_PRINTING_CANCELED);
+ return JOB_CANCELED;
+ }
+ else
+ {
+ // ensure any error message has been cleared
+ pSS->DisplayPrinterStatus(DISPLAY_PRINTING);
+ if (bCheckForCancelButton)
+ {
+ ulBytesSentSinceCancelCheck += dwWriteCount;
+ }
+ return NO_ERROR;
+ }
+} //Send
+
+
+BOOL Printer::TopCoverOpen
+(
+ BYTE /*status_reg*/
+)
+{
+ char * pStr;
+ BYTE bDevIDBuff[DevIDBuffSize];
+
+ if(IOMode.bDevID == FALSE)
+ {
+ return FALSE;
+ }
+
+ DRIVER_ERROR err = pSS->GetDeviceID(bDevIDBuff, DevIDBuffSize, TRUE);
+ if (err != NO_ERROR)
+ {
+ return FALSE;
+ }
+
+ if( (pStr=strstr((char*)bDevIDBuff+2,"VSTATUS:")) ) // find the VSTATUS area
+ {
+ pStr+=8;
+ // now parse VSTATUS parameters
+ // looking for UP for open, DN for closed
+ if (strstr((char*)pStr,"UP"))
+ {
+ return TRUE;
+ }
+ if (strstr((char*)pStr,"DN"))
+ {
+ return FALSE;
+ }
+
+ DBG1("didn't find UP or DN!!\n");
+ return FALSE;
+ }
+ else
+ if (( pStr = strstr ((char*) bDevIDBuff+2, ";S")))
+ {
+ if ( (*(pStr+5) == '9') )
+ {
+ return TRUE;
+ }
+ else
+ {
+ return FALSE;
+ }
+ }
+ else
+ {
+ return FALSE; // if we can't find VSTATUS or binary status field, assume top is not open
+ }
+} //TopCoverOpen
+
+
+DRIVER_ERROR Printer::CleanPen()
+{
+ DBG1("Printer::ClearPen() called\n");
+
+ DWORD length=sizeof(PEN_CLEAN_PML);
+ return pSS->ToDevice(PEN_CLEAN_PML,&length);
+} //CleanPen
+
+
+PrintMode* Printer::GetMode
+(
+ unsigned int index
+)
+{
+ if (index >= ModeCount)
+ {
+ return NULL;
+ }
+
+ return pMode[index];
+} //GetMode
+
+
+PrintMode::PrintMode
+(
+ uint32_t *map1,
+ uint32_t *map2
+)
+{
+ pmQuality = QUALITY_NORMAL;
+ pmMediaType = MEDIA_PLAIN;
+ pmColor = COLOR;
+ int iCount;
+
+ cmap.ulMap1 = map1;
+ cmap.ulMap2 = map2;
+ cmap.ulMap3 = NULL;
+
+ BaseResX = BaseResY = TextRes = 300;
+ MixedRes= FALSE;
+
+ // default setting
+ for (iCount = 0; iCount < MAXCOLORPLANES; iCount++)
+ {
+ ResolutionX[iCount] = BaseResX;
+ ResolutionY[iCount] = BaseResY;
+ ColorDepth[iCount] = 1;
+ }
+
+ medium = mediaPlain;
+ theQuality = qualityNormal;
+ dyeCount=4;
+
+ Config.bResSynth = TRUE;
+
+#if defined(APDK_VIP_COLORFILTERING)
+ Config.bErnie = FALSE;
+#endif
+
+ Config.bPixelReplicate = TRUE;
+ Config.bColorImage = TRUE;
+ Config.bCompress = TRUE;
+ Config.eHT = FED;
+ BlackFEDTable = GetHTBinary();
+ ColorFEDTable = GetHTBinary();
+
+
+ // set for most common cases
+ bFontCapable = TRUE;
+ CompatiblePens[0] = BOTH_PENS;
+ for(iCount = 1; iCount < MAX_COMPATIBLE_PENS; iCount++)
+ {
+ CompatiblePens[iCount] = DUMMY_PEN;
+ }
+
+#ifdef APDK_AUTODUPLEX
+ bDuplexCapable = FALSE;
+ DuplexMode = DUPLEXMODE_NONE;
+#endif
+
+} //PrintMode
+
+
+GrayMode::GrayMode
+(
+ uint32_t *map
+) :
+ PrintMode(map)
+// grayscale uses econo, 300, 1 bit
+{
+ ColorDepth[K] = 1;
+ dyeCount = 1;
+ CompatiblePens[1] = BLACK_PEN; // accept either black or both
+ pmColor = GREY_K;
+} //GrayMode
+
+
+CMYGrayMode::CMYGrayMode
+(
+ uint32_t *map
+) :
+ GrayMode(map)
+{
+ CompatiblePens[1] = COLOR_PEN; // accept either color or both
+ dyeCount = 3;
+ pmColor = GREY_CMY;
+} //CMYGrayMode
+
+
+KCMYGrayMode::KCMYGrayMode
+(
+ uint32_t *map
+) :
+ GrayMode(map)
+{
+ dyeCount = 4;
+ pmColor = GREY_CMY;
+} //KCMYGrayMode
+
+
+DRIVER_ERROR Printer::SetPenInfo
+(
+ char*& pStr,
+ BOOL QueryPrinter
+)
+{
+ DRIVER_ERROR err;
+
+ if (QueryPrinter)
+ {
+ // read the DevID into the stored strDevID
+ err = pSS->GetDeviceID(pSS->strDevID, DevIDBuffSize, TRUE);
+ ERRCHECK;
+
+ // update the static values of the pens
+ err = pSS->DR->ParseDevIDString((const char*)(pSS->strDevID),pSS->strModel,&(pSS->VIPVersion),pSS->strPens);
+ ERRCHECK;
+
+ if ((pStr = strstr((char*)pSS->strDevID,"VSTATUS:"))) // find the VSTATUS area
+ {
+ pStr += 8;
+ }
+ else if ((pStr = strstr((char*)pSS->strDevID, ";S:00"))) // binary encoded device ID status (version 0)
+ {
+ pStr += 19; // get to the number of pens field - 12 byte feature field
+ }
+ else if ((pStr = strstr ((char *) pSS->strDevID, ";S:01")))
+ {
+ pStr += 19; // same as version 00
+ }
+ else if ((pStr = strstr((char*)pSS->strDevID, ";S:02"))) // binary encoded device ID status (version 2)
+ {
+// pStr += 21; // get to the number of pens field - 14 byte feature field
+ pStr += 19; // same as version 00 - see registry.cpp
+ }
+ else if ((pStr = strstr((char*)pSS->strDevID, ";S:03"))) // binary encoded device ID status (version 3)
+ {
+ pStr += 21; // get to the number of pens field - 14 byte feature field
+ }
+ else if ((pStr = strstr((char*)pSS->strDevID, ";S:04"))) // binary encoded device ID status (version 3)
+ {
+ pStr += 25; // get to the number of pens field - 18 byte feature field
+ }
+ else if ((pSS->GetVIPVersion ()) > 5)
+ {
+ return NO_ERROR;
+ }
+ else
+ {
+ TRACE("Printer::SetPenInfo - Unsupported DeviceID %s.\n", pSS->strDevID);
+/* ASSERT (0); // you must have a printer with a new version that is not supported yet! */
+ return BAD_DEVICE_ID; // - code should never reach this point
+ }
+ }
+ else
+ {
+ pStr = pSS->strPens;
+ }
+ return NO_ERROR;
+} //SetPenInfo
+
+
+BOOL PrintMode::Compatible
+(
+ PEN_TYPE pens
+)
+{
+ BOOL res = FALSE;
+ for (int i=0; i < MAX_COMPATIBLE_PENS; i++)
+ {
+ if (CompatiblePens[i] == pens)
+ {
+ res = TRUE;
+ }
+ }
+ return res;
+} //Compatible
+
+
+
+DRIVER_ERROR Printer::SetPens
+(
+ PEN_TYPE eNewPen
+)
+{
+ ASSERT(eNewPen <= MAX_PEN_TYPE);
+ // We are (probably)in unidi. We have to trust they know what pens are
+ // in the printer. We'll let them set any pen set (even if this printer
+ // doesn't support it. We'll find out during SelectPrintMode
+ if (eNewPen <= MAX_PEN_TYPE)
+ {
+ ePen = eNewPen;
+ return NO_ERROR;
+ }
+ else
+ {
+ return UNSUPPORTED_PEN;
+ }
+} //SetPens
+
+void PrintMode::GetValues
+(
+ QUALITY_MODE& eQuality,
+ MEDIATYPE& eMedia,
+ COLORMODE& eColor,
+ BOOL& bDeviceText
+)
+{
+ if (&eQuality != NULL)
+ {
+ eQuality = pmQuality;
+ }
+
+ if (&eMedia != NULL)
+ {
+ eMedia = pmMediaType;
+ }
+
+ if (&eColor != NULL)
+ {
+ eColor = pmColor;
+ }
+
+ if (&bDeviceText != NULL)
+ {
+ bDeviceText = bFontCapable;
+ }
+} //GetValues
+
+
+void Printer::SetPMIndices()
+{
+ for (unsigned int i=0; i < ModeCount; i++)
+ {
+ pMode[i]->myIndex = i;
+ }
+} //SetPMIndices
+
+APDK_END_NAMESPACE
+
+
diff --git a/prnt/hpijs/printer.h b/prnt/hpijs/printer.h
new file mode 100644
index 0000000..b16d4c0
--- /dev/null
+++ b/prnt/hpijs/printer.h
@@ -0,0 +1,406 @@
+/*****************************************************************************\
+ printer.h : Interface for the Printer class
+
+ Copyright (c) 1996 - 2008, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#ifndef APDK_PRINTER_H
+#define APDK_PRINTER_H
+
+#include "modes.h"
+
+APDK_BEGIN_NAMESPACE
+
+////////////////////////////////////////////////////////////////////////////
+// PRINTER classes
+
+#define MAX_PRINTER_FONTS 4
+#define NUM_DJ400_FONTS 3 // ultimately obsolete these values since
+#define NUM_DJ6XX_FONTS 4 // number of fonts is flexible
+
+#define MAX_COMPATIBLE_PENS MAX_PEN_TYPE + 1
+
+#define CANCEL_BUTTON_CHECK_THRESHOLD 150000 // will poll printer's cancel button state every
+ // time this quantity of bytes is written out
+
+class Compressor;
+
+//ClassName
+//!
+/*!
+\internal
+******************************************************************************/
+class PrintMode
+{
+friend class Job;
+friend class Header;
+friend class PrintContext;
+friend class Translator;
+friend class GraphicsTranslator;
+friend class Halftoner;
+friend class Printer;
+friend class Tester;
+#ifdef APDK_DJ9xxVIP
+friend class DJGenericVIP;
+#endif
+#ifdef APDK_DJ3320
+friend class DJ4100;
+#endif
+public:
+ PrintMode (uint32_t *map1,uint32_t *map2=(uint32_t*)NULL);
+ virtual ~PrintMode ()
+ {
+ }
+
+ BOOL Compatible(PEN_TYPE pens);
+ inline BOOL ColorCompatible(COLORMODE color) { return (color == pmColor); }
+ inline BOOL QualityCompatible(QUALITY_MODE eQuality) { return (eQuality == pmQuality); }
+ virtual inline BOOL MediaCompatible(MEDIATYPE eMedia) { return (eMedia == pmMediaType); }
+ inline QUALITY_MODE GetQualityMode() { return pmQuality;}
+ inline MEDIATYPE GetMediaType() { return pmMediaType; }
+ void GetValues (QUALITY_MODE& eQuality, MEDIATYPE& eMedia, COLORMODE& eColor, BOOL& bDeviceText);
+
+// The resolutions can be different for different planes
+ unsigned int ResolutionX[MAXCOLORPLANES];
+ unsigned int ResolutionY[MAXCOLORPLANES];
+
+ unsigned int ColorDepth[MAXCOLORPLANES];
+
+ MediaType medium;
+
+ BOOL bFontCapable;
+
+// char ModeName[12];
+
+ PipeConfigTable Config;
+ unsigned int dyeCount; // number of inks in the pen(s)
+#ifdef APDK_AUTODUPLEX
+ BOOL bDuplexCapable;
+ void SetDuplexMode (DUPLEXMODE duplexmode)
+ {
+ DuplexMode = duplexmode;
+ if (DuplexMode != DUPLEXMODE_NONE)
+ bFontCapable = FALSE;
+ };
+
+ DUPLEXMODE QueryDuplexMode ()
+ {
+ return DuplexMode;
+ };
+#endif // APDK_AUTODUPLEX
+
+ DRIVER_ERROR SetMediaType (MEDIATYPE eMediaType)
+ {
+ if (MediaCompatible (eMediaType))
+ {
+ pmMediaType = eMediaType;
+ return NO_ERROR;
+ }
+ return WARN_MODE_MISMATCH;
+ }
+
+protected:
+ Quality theQuality;
+#ifdef APDK_AUTODUPLEX
+ DUPLEXMODE DuplexMode;
+#endif
+
+ ColorMap cmap;
+
+ unsigned int BaseResX,BaseResY, TextRes;
+ BOOL MixedRes;
+
+ unsigned char* BlackFEDTable;
+ unsigned char* ColorFEDTable;
+
+
+ PEN_TYPE CompatiblePens[MAX_COMPATIBLE_PENS];
+ QUALITY_MODE pmQuality;
+ MEDIATYPE pmMediaType;
+ COLORMODE pmColor;
+
+ unsigned int myIndex; // record what index this mode has within the Printer
+
+}; //PrintMode
+
+
+//ClassName
+//!
+/*!
+******************************************************************************/
+class GrayMode : public PrintMode
+{
+public:
+ GrayMode(uint32_t *map);
+}; //GrayMode
+
+
+//ClassName
+//!
+/*!
+******************************************************************************/
+class CMYGrayMode : public GrayMode
+{
+public:
+ CMYGrayMode(uint32_t *map);
+}; //CMYGrayMode
+
+//ClassName
+//!
+/*!
+******************************************************************************/
+class KCMYGrayMode : public GrayMode
+{
+public:
+ KCMYGrayMode(uint32_t *map);
+}; //KCMYGrayMode
+
+//Printer
+//! Encapulate printer functionality
+/*!
+\internal
+******************************************************************************/
+class Printer
+{
+friend class Job;
+friend class Tester;
+public:
+
+ Printer(SystemServices* pSys, int numfonts,
+ BOOL proto = FALSE);
+
+ virtual ~Printer();
+
+ DRIVER_ERROR constructor_error;
+
+ virtual unsigned int GetModeCount(void) { return ModeCount; }
+ virtual PrintMode* GetMode(unsigned int index);
+
+
+#if defined(APDK_FONTS_NEEDED)
+ ReferenceFont* EnumFont(int& iCurrIdx);
+
+ virtual Font* RealizeFont(const int index, const BYTE bSize,
+ const TEXTCOLOR eColor = BLACK_TEXT,
+ const BOOL bBold = FALSE,
+ const BOOL bItalic = FALSE,
+ const BOOL bUnderline = FALSE);
+#endif
+
+ virtual DRIVER_ERROR Send(const BYTE* pWriteBuff);
+ virtual DRIVER_ERROR Send(const BYTE* pWriteBuff, DWORD dwWriteLen);
+
+ virtual DRIVER_ERROR Flush(int FlushSize = MAX_RASTERSIZE); // flush printer input buffer
+
+ // select Header component of Translator
+ virtual Header* SelectHeader(PrintContext* pc) = 0;
+
+
+ virtual Compressor* CreateCompressor(unsigned int RasterSize);
+
+ virtual Compressor* CreateBlackPlaneCompressor (unsigned int RasterSize, BOOL bVIPPrinter = FALSE);
+
+ virtual DISPLAY_STATUS ParseError(BYTE status_reg);
+
+ virtual DRIVER_ERROR CleanPen();
+
+ virtual DRIVER_ERROR PagesPrinted(unsigned int& count) // read pagecount from printer memory
+ { return UNSUPPORTED_FUNCTION; } // default behavior for printers without the ability
+
+
+ // DEVID stuff
+ IO_MODE IOMode;
+
+ int iNumFonts; // size of fontarray
+ BOOL bCheckForCancelButton;
+ unsigned long ulBytesSentSinceCancelCheck; /* XXX unused? */
+
+ virtual BOOL UseGUIMode(PrintMode* pPrintMode) { return FALSE; }
+ virtual BOOL UseCMYK(unsigned int iPrintMode) { return TRUE;}
+
+ virtual BOOL PhotoTrayPresent(BOOL bQueryPrinter)
+ { return FALSE; }
+
+ virtual PHOTOTRAY_STATE PhotoTrayEngaged (BOOL bQueryPrinter)
+ { return DISENGAGED; }
+
+ //! Returns TRUE if a hagaki feed is present in printer.
+ virtual BOOL HagakiFeedPresent(BOOL bQueryPrinter)
+ { return FALSE; }
+
+#ifdef APDK_AUTODUPLEX
+ //!Returns TRUE if duplexer and hagaki feed (combined) unit is present in printer.
+ virtual BOOL HagakiFeedDuplexerPresent(BOOL bQueryPrinter)
+ { return FALSE; }
+#endif
+
+ virtual PAPER_SIZE MandatoryPaperSize()
+ { return UNSUPPORTED_SIZE; } //code for "nothing mandatory"
+
+ // tells currently installed pen type
+ inline virtual DRIVER_ERROR ParsePenInfo(PEN_TYPE& ePen, BOOL QueryPrinter = TRUE)
+ {
+ ePen = NO_PEN;
+ return NO_ERROR;
+ }
+
+ inline BOOL VIPPrinter() {return m_bVIPPrinter;}
+
+ inline virtual BOOL SupportSeparateBlack (PrintMode *pCurrentMode) {return TRUE;}
+
+ PEN_TYPE ePen;
+ uint32_t *CMYMap;
+
+ virtual DRIVER_ERROR CheckInkLevel() { return NO_ERROR; }
+
+ virtual PEN_TYPE DefaultPenSet() { return BOTH_PENS; }
+ // need ParsePenInfo to remember this
+ PEN_TYPE ActualPens() { return ePen; }
+ virtual DRIVER_ERROR SetPens(PEN_TYPE eNewPen);
+
+ // function to set PrintMode indices, which can't be done in base constructor
+ // so is called from PrintContext::SelectDevice
+ void SetPMIndices();
+
+ virtual DRIVER_ERROR SkipRasters (int nBlankRasters) // needed for crossbow
+ {
+ return NO_ERROR;
+ }
+
+ virtual DRIVER_ERROR Encapsulate (const RASTERDATA* InputRaster, BOOL bLastPlane);
+
+ virtual BOOL FullBleedCapable (PAPER_SIZE ps, FullbleedType *fbType, float *xOverSpray, float *yOverSpray,
+ float *fLeftOverSpray = NULL, float *fTopOverSpray = NULL)
+ {
+ *fbType = fullbleedNotSupported;
+ return FALSE;
+ }
+
+/*
+ * Some printers may require different margins than the default initialized in
+ * page size metrics table. If so, Getmargins should return TRUE and return the
+ * margin values in Left, Right, Top and Bottom in that order in the array fMargins.
+ * If default values are acceptable, return FALSE.
+ * At present, all 6xx family have larger bottom margin than the default 0.5 inch.
+ */
+
+ virtual BOOL GetMargins (PAPER_SIZE ps, float *fMargins)
+ {
+ return FALSE;
+ }
+
+/*
+ * Malibu based printers do not handle media sense and full bleed simultaneously.
+ * For those printers, media type and quality have to be set explicitly.
+ */
+
+ virtual void AdjustModeSettings (BOOL bDoFullBleed, MEDIATYPE ReqMedia,
+ MediaType *medium, Quality *quality)
+ {
+ return;
+ }
+
+ virtual int PrinterLanguage ()
+ {
+ return 0; // 0 - PCL, 10 - PostScript
+ }
+
+ virtual DRIVER_ERROR SaveText (const char *psStr, int iPointSize, int iX, int iY,
+ const char *pTextString, int iTextStringLen,
+ BOOL bUnderline)
+ {
+ return NO_ERROR;
+ }
+
+
+#ifdef APDK_AUTODUPLEX
+ BOOL bDuplexCapable;
+ BOOL RotateImageForBackPage ()
+ {
+ return m_bRotateBackPage;
+ };
+
+#endif
+
+ virtual DRIVER_ERROR SendPerPageHeader (BOOL bLastPage)
+ {
+ return NO_ERROR;
+ }
+ virtual DRIVER_ERROR SetHint (PRINTER_HINT eHint, int iValue)
+ {
+ return NO_ERROR;
+ }
+ virtual int GetHint (PRINTER_HINT eHint)
+ {
+ return 0;
+ }
+
+ virtual DRIVER_ERROR AddPJLHeader ()
+ {
+ return NO_ERROR;
+ }
+
+protected:
+ SystemServices* pSS;
+#if defined(APDK_FONTS_NEEDED)
+ ReferenceFont* fontarray[MAX_PRINTER_FONTS+1];
+#endif
+
+ int InSlowPollMode;
+ int iTotal_SLOW_POLL_Count; // total SLOW_POLLs (multiple of iMax_SLOW_POLL_Count)
+ int iMax_SLOW_POLL_Count; // time-out value at which point we do error check
+ BOOL ErrorTerminationState;
+
+ // buffering stuff
+ const unsigned int iBuffSize;
+ BYTE* pSendBuffer;
+ unsigned int iCurrBuffSize;
+ BOOL EndJob;
+
+ virtual DRIVER_ERROR VerifyPenInfo() = 0;
+ virtual BOOL TopCoverOpen(BYTE status_reg);
+ virtual DATA_FORMAT GetDataFormat() { return RASTER_LINE; }
+ DRIVER_ERROR SetPenInfo(char*& pStr, BOOL QueryPrinter);
+
+ PrintMode* pMode[MAX_PRINTMODES];
+ unsigned int ModeCount;
+ BOOL m_bVIPPrinter;
+ BOOL m_bStatusByPJL;
+#ifdef APDK_AUTODUPLEX
+ BOOL m_bRotateBackPage;
+#endif
+
+ int m_iNumPages;
+
+ virtual Printer& operator=(const Printer& rhs) {return *this;} // don't allow assignment
+
+}; //Printer
+
+APDK_END_NAMESPACE
+
+#endif //APDK_PRINTER_H
diff --git a/prnt/hpijs/printerfactory.cpp b/prnt/hpijs/printerfactory.cpp
new file mode 100644
index 0000000..67150a8
--- /dev/null
+++ b/prnt/hpijs/printerfactory.cpp
@@ -0,0 +1,527 @@
+/*****************************************************************************\
+ Copyright (c) 2002 - 2002, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+// PrinterFactory.cpp - Morpheus component code base
+
+#include "header.h"
+#include <string.h>
+#include "printerfactory.h"
+
+APDK_BEGIN_NAMESPACE
+
+PrinterFactory* PrinterFactory::s_Instance = NULL; // enforce the singleton
+PrinterFactory::ProxyListElement* PrinterFactory::s_ProxyList = NULL;
+unsigned int PrinterFactory::s_uFamilyCount = 0;
+unsigned int PrinterFactory::s_uPrinterCount = 0;
+
+extern void HP_strcat(char* str1, const char* str2);
+
+//PrinterFactory
+//! Constructor for PrinterFactory
+/*!
+******************************************************************************/
+PrinterFactory::PrinterFactory
+(
+)
+{
+ TRACE("PF::PF\n");
+ // the static factory is coming on-line, do what you need here.
+ TRACE("PF - static factory construction complete\n");
+} //PrinterFactory
+
+
+//~PrinterFactory
+//! Destructor for PrinterFactory
+/*!
+******************************************************************************/
+PrinterFactory::~PrinterFactory
+(
+)
+{
+ TRACE("PF::~PF - static factory destructing\n");
+ ProxyListElement* t_ListEntry;
+ while (s_ProxyList)
+ {
+ TRACE(" - deleting %s from factory list\n", s_ProxyList->printerProxyElement->GetFamilyName());
+ t_ListEntry = s_ProxyList;
+ s_ProxyList = t_ListEntry->next;
+ delete t_ListEntry;
+ }
+ s_Instance = NULL; // factory is gone
+ TRACE("finished PF::~PF\n");
+} //~PrinterFactory
+
+
+//Register
+//! Register proxy classes for printer families
+/*!
+This method is used by the constuctor of the PrinterProxy subclasses to
+register themselves with the factory. They call Register(this) to pass
+themselves to the factory.
+******************************************************************************/
+void PrinterFactory::Register
+(
+ const PrinterProxy* thePrinterProxy //!< [in]pointer to the PrinterProxy
+)
+{
+ // use the first registration of a printer proxy to force the instantiation
+ // of the only PrinterFactory
+ if (s_Instance == NULL)
+ {
+ TRACE("PF::Register - asking for new factory\n");
+ // create the singleton
+ s_Instance = new PrinterFactory;
+ }
+
+ TRACE("PF::Register\n");
+ // we know we'll need an entry in the list so create it first
+ ProxyListElement* t_ListEntry = new(ProxyListElement);
+ if (t_ListEntry == NULL)
+ {
+ // we have a problem - the driver is not running yet
+ // the RTL is registering these static printer proxy servers and
+ // the main code hasn't started yet.
+ return;
+ }
+ // this list works so simply because we don't care about the order
+ // and we always insert the next entry before the current head.
+ t_ListEntry->printerProxyElement = thePrinterProxy;
+ t_ListEntry->next = s_ProxyList;
+ s_ProxyList = t_ListEntry;
+ s_uFamilyCount++;
+ s_uPrinterCount += thePrinterProxy->GetModelCount();
+
+ TRACE("PF::Register %s registered with PrinterFactory\n", thePrinterProxy->GetFamilyName());
+ TRACE("Printers supported by class are:\n");
+ MODEL_HANDLE myHandle = thePrinterProxy->StartModelNameEnum();
+ const char* printerName;
+ while ((printerName = thePrinterProxy->GetNextModelName(myHandle)))
+ {
+ TRACE(" %s\n", printerName);
+ }
+} //Register
+
+
+//UnRegister
+//! UnRegister proxy classes for printer families
+/*!
+PrinterProxy subclasses use this to unregister themselves with their destuctor
+executes.
+******************************************************************************/
+void PrinterFactory::UnRegister
+(
+ const PrinterProxy* thePrinterProxy //!< [in]pointer to the PrinterProxy to unregister
+)
+{
+ // use the first registration of a printer proxy to force the instantiation
+ // of the only PrinterFactory
+ if (s_Instance == NULL)
+ {
+ TRACE("Unregistering a PrinterProxy when factory does not exist\n");
+ return;
+ }
+
+ TRACE("PF::UnRegister %s\n", thePrinterProxy->GetFamilyName());
+ if (s_ProxyList == NULL)
+ {
+ TRACE("PF::UnRegister - Printer Factory printer list is empty!\n");
+ }
+
+ ProxyListElement* prevListEntry = NULL;
+ ProxyListElement* t_ListEntry = s_ProxyList;
+ bool bFound = false;
+
+ while ((t_ListEntry) && (!bFound))
+ {
+ if (t_ListEntry->printerProxyElement == thePrinterProxy)
+ {
+ TRACE("We found the matching proxy by address\n");
+ bFound = true;
+ if (prevListEntry != NULL) //somewhere in list
+ {
+ prevListEntry->next = t_ListEntry->next;
+ }
+ else // at head of list
+ {
+ s_ProxyList = t_ListEntry->next;
+ }
+ delete t_ListEntry;
+ s_uFamilyCount--;
+ s_uPrinterCount -= thePrinterProxy->GetModelCount();
+ }
+ prevListEntry = t_ListEntry;
+ t_ListEntry = t_ListEntry->next;
+ }
+ TRACE("PF::UnRegister removed %s from PrinterFactory\n", thePrinterProxy->GetFamilyName());
+ TRACE("PF::UnRegister - factory now supports %d families and %d printers\n",
+ s_uFamilyCount,
+ s_uPrinterCount);
+
+ if (s_ProxyList == NULL)
+ {
+ TRACE("PF::UnRegister asking for deletion of empty Factory\n");
+ delete PrinterFactory::GetInstance();
+ }
+} //UnRegister
+
+
+//GetNextFamilyName
+//! return the next familiy name that is in the factory
+/*!
+Move to the next family in the factory and then return the name of that family.
+This moved to the next family first!
+FAMILY_HANDLE is changed to the next family. If there are no more families in
+the factory then FAMILY_HANDLE will be NULL.
+
+\return
+name of the next family in the factory<br>
+NULL if there are no more families in the factory
+******************************************************************************/
+const char* PrinterFactory::GetNextFamilyName
+(
+ FAMILY_HANDLE& theFamilyHandle //!< [in][out]handle to the current family
+) const
+{
+ TRACE("PF::GetNextFamilyName()\n");
+ if (nextFamily(theFamilyHandle))
+ {
+ return getPrinterProxy(theFamilyHandle)->GetFamilyName();
+ }
+ else
+ {
+ return NULL;
+ }
+} //GetNextFamilyName
+
+
+//GetFamilyName
+//! return the family namne that supports the printer
+/*!
+\return
+the name of the family that supports the printer name passed in. May be NULL
+if there is no family in the factory that supports the printer name.
+******************************************************************************/
+const char* PrinterFactory::GetFamilyName
+(
+ const char* thePrinterName //!< [in] name of the printer model
+) const
+{
+ const char* szFamilyName = NULL;
+ FAMILY_HANDLE myFamilyHandle = FindDevIdMatch(thePrinterName);
+ if (myFamilyHandle)
+ {
+ szFamilyName = getPrinterProxy(myFamilyHandle)->GetFamilyName();
+ }
+ return szFamilyName;
+} //GetFamilyName
+
+//NextModel
+//! return the next model name for the current family that is in the factory
+/*!
+MODEL_HANDLE is updated durint this processes
+\return
+Name of the next model that this family supports. Will be NULL at the end of
+the model list.
+******************************************************************************/
+const char* PrinterFactory::GetNextModelName
+(
+ FAMILY_HANDLE theFamilyHandle, //!< [in] handle to the current family
+ MODEL_HANDLE& theModelHandle //!< [in][out] handle to the current model
+) const
+{
+ TRACE("PF::GetNextModelName()\n");
+ const char* szModelName = NULL;
+ if (theFamilyHandle == NULL)
+ {
+ theModelHandle = NULL;
+ }
+ else
+ {
+ szModelName = getPrinterProxy(theFamilyHandle)->GetNextModelName(theModelHandle);
+ }
+ return szModelName;
+} //GetNextModelName
+
+
+//GetNextPrinterName
+//! return the next printer name in the factory
+/*!
+This returns the next printer (model) name supported in the factory. This
+iterates over the whole factory without regard to families. PRINTER_HANDLE is
+updated during this process.
+
+\return
+Name of the printer in the factory. Will be NULL after all the printers in the
+factory have been enumerated.
+******************************************************************************/
+const char* PrinterFactory::GetNextPrinterName
+(
+ PRINTER_HANDLE& thePrinterHandle //!< [in][out] handle to the printer
+) const
+{
+ TRACE("PF::GetNextPrinterName()\n");
+ static FAMILY_HANDLE familyHandle;
+ nextPrinter(familyHandle, thePrinterHandle);
+ return reinterpret_cast<const char*>(thePrinterHandle);
+} //GetNextPrinterName
+
+
+//nextFamily
+//! moves the family handle to the next family in the factory
+/*!
+updates the FAMILY_HANDLE to the next family in the factory. After the last
+family in the factory the FAMILY_HANDLE will be NULL.
+
+\return
+true - there was another family in the factory (ie FAMILY_HANDLE is not NULL)<br>
+false - there were no more families in the factory (ie FAMILY_HANDLE is NULL)
+******************************************************************************/
+bool PrinterFactory::nextFamily
+(
+ FAMILY_HANDLE& theFamilyHandle //!< [in][out] handle to the family
+) const
+{
+ TRACE("PF::nextFamily()\n");
+ bool bMore = true;
+ const ProxyListElement* proxyList = getProxyListElement(theFamilyHandle);
+ if (proxyList == NULL)
+ {
+ TRACE("PF::nextFamily - reset to head of list\n");
+ theFamilyHandle = s_ProxyList;
+ }
+ else
+ {
+ TRACE("PF::nextFamily - next element\n");
+ theFamilyHandle = proxyList->next;
+ }
+ if (theFamilyHandle == NULL)
+ {
+ TRACE("PF::nextFamily - NULL (end of list)\n");
+ bMore = false;
+ }
+ return bMore;
+} //nextFamily
+
+
+//EnumDevices
+//! moves the family handle to the next family in the factory
+/*!
+updates the FAMILY_HANDLE to the next family in the factory. After the last
+family in the factory the FAMILY_HANDLE will be NULL.
+
+\return
+true - there was another family in the factory (ie FAMILY_HANDLE is not NULL)<br>
+false - there were no more families in the factory (ie FAMILY_HANDLE is NULL)
+******************************************************************************/
+const PRINTER_TYPE PrinterFactory::EnumDevices
+(
+ FAMILY_HANDLE& theFamilyHandle
+) const
+{
+ TRACE("PF::EnumDevices()\n");
+ if (nextFamily(theFamilyHandle))
+ {
+ return getPrinterProxy(theFamilyHandle)->GetPrinterType();
+ }
+ else
+ {
+ return UNSUPPORTED;
+ }
+}
+
+//nextPrinter
+//! determines of there is another printer in the factory
+/*! moves the modle handle to the next model in the family. If there are no more
+models in the family then it moves the family handle to the next family and the
+model handle to the start of that families model list.
+both the family and model handels can be updated during this process. Both will
+be NULL if there are no more printers in this iteration of the factory.
+
+\return
+true - there was another printer in the factory and the family/model handle references it<br>
+false - there were no more printers in the factory and both handles are NULL
+******************************************************************************/
+bool PrinterFactory::nextPrinter
+(
+ FAMILY_HANDLE& theFamilyHandle, //!< [in][out] current family handle
+ MODEL_HANDLE& theModelHandle //!< [in][out] current model handle
+) const
+{
+ TRACE("PF::nextPrinter(,)\n");
+ bool bMore = true;
+ if (theFamilyHandle == NULL) //this is the first time through
+ {
+ theFamilyHandle = StartFamilyNameEnum();
+ if (nextFamily(theFamilyHandle))
+ {
+ theModelHandle = StartModelNameEnum(theFamilyHandle);
+ }
+ else
+ {
+ bMore = false; // no families in the list
+ goto EXIT;
+ }
+ }
+ if (GetNextModelName(theFamilyHandle, theModelHandle) == NULL) //end of model list
+ {
+ if(nextFamily(theFamilyHandle))
+ {
+ theModelHandle = StartModelNameEnum(theFamilyHandle);
+ if (GetNextModelName(theFamilyHandle, theModelHandle) == NULL)
+ {
+ bMore = false;
+ }
+ }
+ else
+ {
+ bMore = false;
+ }
+ }
+
+EXIT:
+ {
+ return bMore;
+ }
+} //nextPrinter
+
+
+//FindDevIdMatch
+//! Find a match for a Device ID string in the factory
+/*!
+The device ID string can be a device ID string retrived from a printer or it
+can be a simple model name or family name. This will walk through each family
+in the factory and will check to see if it is a simple family or model string
+and if not then will check for a valid device ID string.
+
+\return
+A family handle based on the device ID string passed in.<br>
+NULL if there is no match.
+******************************************************************************/
+const FAMILY_HANDLE PrinterFactory::FindDevIdMatch
+(
+ const char* szDevIdString //!< [in] well formed device id string
+) const
+{
+ TRACE("PF::FindDevIdMatch(%s)\n", szDevIdString);
+ FAMILY_HANDLE myFamilyHandle = StartFamilyNameEnum();
+
+ bool bDevIDString = TRUE;
+ if ((!strstr(szDevIdString, "MFG:") &&
+ !strstr(szDevIdString+2, "MFG:") &&
+ !strstr(szDevIdString, "MANUFACTURER:") &&
+ !strstr(szDevIdString+2, "MANUFACTURER:")) ||
+ (!strstr(szDevIdString, "MDL:") &&
+ !strstr(szDevIdString+2, "MDL:") &&
+ !strstr(szDevIdString, "MODEL:") &&
+ !strstr(szDevIdString+2, "MODEL:")) ||
+ ((szDevIdString[0] == '\0') && (szDevIdString[1] == '\0')))
+ {
+ bDevIDString = FALSE;
+ }
+
+ while (nextFamily(myFamilyHandle))
+ {
+ if (bDevIDString)
+ {
+ // check to see if a full device ID String match
+ if (getPrinterProxy(myFamilyHandle)->DeviceMatchQuery(szDevIdString))
+ {
+ break; // found it!
+ }
+ }
+ else
+ {
+ // check the family and see if they passed a simple model string
+ if (getPrinterProxy(myFamilyHandle)->ModelMatchQuery(szDevIdString))
+ {
+ break; // found it!
+ }
+ }
+ }
+ // if we never had a match (i.e. did the break) then myFamilyHandle is NULL
+ return myFamilyHandle;
+} //FindDevIdMatch
+
+//GetModelBits
+//! Get the bitwise return based on the registered family
+/*!
+
+\return
+A bitwise int based on the family registered.<br
+0 if there is no printer registered.
+******************************************************************************/
+const unsigned int PrinterFactory::GetModelBits
+(
+) const
+{
+ unsigned int bits=0;
+ TRACE("PF::GetModelBits\n");
+ FAMILY_HANDLE myFamilyHandle = StartFamilyNameEnum();
+
+ while (nextFamily(myFamilyHandle))
+ {
+ if (myFamilyHandle)
+ {
+ bits = bits | getPrinterProxy(myFamilyHandle)->GetModelBit();
+ }
+ }
+ return bits;
+} //GetModelBits
+
+//GetModelString
+//! Get the bitwise return based on the registered family
+/*!
+
+\return
+concatnated string based on the family registered.<br
+null string if there is no printer registered.
+******************************************************************************/
+const void PrinterFactory::GetModelString
+(
+ char* mresult,
+ int mresult_length
+) const
+{
+ assert(mresult);
+ mresult[0] = '\0';
+
+ TRACE("PF::GetModelString\n");
+ FAMILY_HANDLE myFamilyHandle = StartFamilyNameEnum();
+ int i = 2;
+ const char *p;
+ while (nextFamily(myFamilyHandle))
+ {
+ p = getPrinterProxy(myFamilyHandle)->GetFamilyName();
+ i += strlen(p) + 1;
+ if (i > mresult_length) break;
+ HP_strcat(mresult, p);
+ HP_strcat(mresult, " ");
+ }
+} //GetModelBits
+
+
+APDK_END_NAMESPACE
diff --git a/prnt/hpijs/printerfactory.h b/prnt/hpijs/printerfactory.h
new file mode 100644
index 0000000..4477c03
--- /dev/null
+++ b/prnt/hpijs/printerfactory.h
@@ -0,0 +1,194 @@
+/*****************************************************************************\
+ Copyright (c) 2002 - 2002, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+// PrinterFactory.h - Morpheus component code base
+
+#if !defined(APDK_PRINTERFACTORY_H)
+ #define APDK_PRINTERFACTORY_H
+
+#include "printerproxy.h" // the factory has to know about the proxies
+
+APDK_BEGIN_NAMESPACE
+
+typedef const void* FAMILY_HANDLE;
+typedef MODEL_HANDLE PRINTER_HANDLE;
+
+#define pPFI PrinterFactory::GetInstance()
+
+//PrinterFactory
+//! Provides the interface to enumerate models and create printer classes
+/*!
+PrinterFactory is a singleton that allows the caller to enumerate:
+\li Families supported
+\li Models supported within a family
+\li Printers supported in the factory
+
+Callers use the factory to create the appropriate printer class based on
+familiy name, model name, or device ID string.
+******************************************************************************/
+
+// Specify a class prototype, otherwise "virtual printer" fails with error: ISO C++
+// forbids declaration of "Printer" with no type
+class Printer;
+
+class PrinterFactory
+{
+ friend class dummy;
+public:
+ // public API
+
+ // get class related information
+ inline static const PrinterFactory* GetInstance() { return s_Instance; }
+ inline const unsigned int GetPrinterCount() const { return s_uPrinterCount; }
+ inline const unsigned int GetFamilyCount() const { return s_uFamilyCount; }
+
+
+ // enumerate Family APIs
+ FAMILY_HANDLE StartFamilyNameEnum() const { return NULL; }
+ const char* GetNextFamilyName(FAMILY_HANDLE& theFamilyHandle) const;
+
+ // enumerate models in a family APIs
+ inline MODEL_HANDLE StartModelNameEnum(FAMILY_HANDLE theFamilyHandle) const;
+ const char* GetNextModelName(FAMILY_HANDLE theFamilyHandle, MODEL_HANDLE& theModelHandle) const;
+
+ // enumerate all printers in factroy APIs
+ PRINTER_HANDLE StartPrinterNameEnum() const { return NULL; }
+ const char* GetNextPrinterName(PRINTER_HANDLE& thePrinterHandle) const;
+
+ // get family name based on printer name
+ const char* GetFamilyName(const char* thePrinterName) const;
+ const char* GetFamilyName(const FAMILY_HANDLE theFamilyHandle) const;
+ const PRINTER_TYPE GetFamilyType(const FAMILY_HANDLE theFamilyHandle) const;
+ const PRINTER_TYPE EnumDevices( FAMILY_HANDLE& theFamilyHandle) const;
+ const unsigned int GetModelBits() const;
+ const void GetModelString(char* modelstring, int modelstring_length) const;
+
+ // get a handle to family based on device string
+// const FAMILY_HANDLE FindModelMatch(const char* szModel) const;
+ const FAMILY_HANDLE FindDevIdMatch(const char* szDevIdString) const;
+
+ // Printer (un)registration and creation APIs
+ static void Register(const PrinterProxy* thePrinterProxy);
+ static void UnRegister(const PrinterProxy* thePrinterProxy);
+ inline Printer* CreatePrinter(SystemServices* pSys, const FAMILY_HANDLE& theFamilyHandle) const;
+
+private:
+ // constructors/destructor - Only the factory can construct or destruct itself
+ PrinterFactory();
+ ~PrinterFactory(); // doesn't need to be virtual - there is only one
+ PrinterFactory(const PrinterFactory& theFactory) {}; // dont' let the compiler generate a copy constructor
+
+ // Only available to factory manager
+ struct ProxyListElement
+ {
+ const PrinterProxy* printerProxyElement;
+ ProxyListElement* next;
+ };
+
+ inline const ProxyListElement* getProxyListElement(FAMILY_HANDLE theFamilyHandle) const;
+ inline const PrinterProxy* getPrinterProxy(FAMILY_HANDLE theFamilyHandle) const;
+ bool nextPrinter(FAMILY_HANDLE& theFamilyHandle, MODEL_HANDLE& theModelHandle) const;
+ bool nextFamily(FAMILY_HANDLE& theFamilyHandle) const;
+
+ static PrinterFactory* s_Instance;
+ static ProxyListElement* s_ProxyList;
+
+ static unsigned int s_uPrinterCount;
+ static unsigned int s_uFamilyCount;
+
+}; //PrinterFactory
+
+
+//getProxyListElement
+//! Return the the correct ProxyListELement based on the FAMILY_HANDLE
+inline const PrinterFactory::ProxyListElement* PrinterFactory::getProxyListElement
+(
+ const FAMILY_HANDLE theFamilyHandle
+) const
+{
+ return reinterpret_cast<const ProxyListElement*>(theFamilyHandle);
+}
+
+
+//getPrinterProxy
+//! Return the correct PrinterProxy based on the FAMILY_HANDLE
+inline const PrinterProxy* PrinterFactory::getPrinterProxy
+(
+ const FAMILY_HANDLE theFamilyHandle
+) const
+{
+ return theFamilyHandle ? getProxyListElement(theFamilyHandle)->printerProxyElement : NULL;
+} //GetPrinterPoxy
+
+
+//StartModelNameEnum
+//! Prepare for a Model Name enumeration based on a family
+inline MODEL_HANDLE PrinterFactory::StartModelNameEnum
+(
+ const FAMILY_HANDLE theFamilyHandle
+) const
+{
+ return getPrinterProxy(theFamilyHandle)->StartModelNameEnum();
+} //StartModelNameEnum
+
+
+//GetFamilyName
+//! Get the family name string based on the family handel
+inline const char* PrinterFactory::GetFamilyName
+(
+ const FAMILY_HANDLE theFamilyHandle //!< handle to the family
+) const
+{
+ return getPrinterProxy(theFamilyHandle)->GetFamilyName();
+} //GetFamilyName
+
+//GetFamilyType
+//! Get the family printer type enum based on the family handel
+inline const PRINTER_TYPE PrinterFactory::GetFamilyType
+(
+ const FAMILY_HANDLE theFamilyHandle //!< handle to the family
+) const
+{
+ return getPrinterProxy(theFamilyHandle)->GetPrinterType();
+} //GetFamilyName
+
+
+
+//CreatePrinter
+//! Create a printer class based on the family handle
+inline Printer* PrinterFactory::CreatePrinter
+(
+ SystemServices* pSys, //!< pointer to a valid SystemSerivce object
+ const FAMILY_HANDLE& theFamilyHandle //!< handle to the family to support
+) const
+{
+ return theFamilyHandle ? getPrinterProxy(theFamilyHandle)->CreatePrinter(pSys) : NULL;
+} //CreatePrinter
+
+APDK_END_NAMESPACE
+
+#endif //APDK_PRINTERFACTORY_H
diff --git a/prnt/hpijs/printerproxy.cpp b/prnt/hpijs/printerproxy.cpp
new file mode 100644
index 0000000..d6c74ed
--- /dev/null
+++ b/prnt/hpijs/printerproxy.cpp
@@ -0,0 +1,166 @@
+/*****************************************************************************\
+ Copyright (c) 2002 - 2002, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+// PrinterProxy.cpp - Morpheus component code base
+
+#include "header.h"
+#include <string.h>
+#include "printerfactory.h"
+#include "printerproxy.h"
+
+APDK_BEGIN_NAMESPACE
+
+//PrinterProxy
+//! Constructor for PrinterProxy
+/*!
+******************************************************************************/
+PrinterProxy::PrinterProxy
+(
+ const char* szFamilyName,
+ const char* szModelNames
+) : m_szFamilyName(szFamilyName),
+ m_szModelNames(szModelNames)
+{
+ unsigned int uCount = 0;
+ char* tPtr = const_cast<char*>(m_szModelNames);
+ while (*tPtr)
+ {
+ tPtr += strlen(tPtr)+1;
+ uCount++;
+ }
+ m_uModelCount = uCount;
+
+ PrinterFactory::Register(this);
+ TRACE("PP::PP family is %s and supports %d models\n", GetFamilyName(), GetModelCount());
+} //PrinterProxy
+
+
+//~PrinterProxy
+//! Destructor for PrinterProxy
+/*!
+******************************************************************************/
+PrinterProxy::~PrinterProxy()
+{
+ TRACE("PP::~PP<%s> destructing\n", GetFamilyName());
+ PrinterFactory::UnRegister(this);
+} //~PrinterProxy
+
+
+//GetNextModelName
+//! Return the next model the family supports
+/*!
+\return
+pointer to the next model string<br>
+NULL if there are no more models in the list
+******************************************************************************/
+const char* PrinterProxy::GetNextModelName
+(
+ MODEL_HANDLE& theModelHandle
+) const
+{
+ TRACE("PP::GetNextModelName()\n");
+ const char* szModelName = GetModelName(theModelHandle);
+ if (szModelName == NULL)
+ {
+ TRACE("PP:GetNextModelName - reset to being of list\n");
+ szModelName = m_szModelNames;
+ }
+ else
+ {
+ szModelName += strlen(szModelName)+1;
+ }
+ if (*szModelName == '\0')
+ {
+ TRACE("PP:GetNextModelName - hit end of list\n");
+ szModelName = NULL;
+ }
+ theModelHandle = szModelName;
+ return szModelName;
+} //GetNextModelName
+
+
+//ModelMatchQuery
+//! Indicate if there is a match in this proxy for the model string
+/*!
+\return
+true - there was a match<br>
+false - there was no match
+******************************************************************************/
+bool PrinterProxy::ModelMatchQuery
+(
+ const char* szModelString //!< model or family string
+) const
+{
+ TRACE("PP::ModelMatchQuery(%s)\n", szModelString);
+ bool bFound = false;
+ // check to see if they passed in the family name
+ TRACE("PP::MMQ - searching for %s(family) in %s\n",GetFamilyName(), szModelString);
+ if (!strcmp(szModelString, GetFamilyName()))
+ {
+ TRACE("PP::MMQ - found family name match (%s)!\n", GetFamilyName());
+ bFound = true;
+ }
+ else
+ {
+ const char* szNextModel = m_szModelNames;
+ while(*szNextModel)
+ {
+ TRACE("PP::MMQ - searching for %s in %s\n", szNextModel, szModelString);
+ // do a simple substring on what was passed in with what is in the model list
+ if (strstr(szModelString, szNextModel))
+ {
+ // we found a match
+ TRACE("PP:MMQ - found a model name match (%s)!\n", szNextModel);
+ bFound = true;
+ break;
+ }
+ szNextModel += strlen(szNextModel)+1;
+ }
+ }
+ return bFound;
+} //DeviceQueryMatch
+
+
+//DeviceMatchQuery
+//! Indicate to what level this printer class could support the device
+/*!
+\return
+PROXY_VOTE - confidance vote from 0 - 100 indicating how well the proxy
+belives that this printer class could support the device indicated. 0
+indicating "not at all" and 100 indicating "exact match".
+\sa PROXY_VOTE
+******************************************************************************/
+PROXY_VOTE PrinterProxy::DeviceMatchQuery
+(
+ const char* szDeviceString //!< valid device id string
+) const
+{
+ TRACE("PP::DeviceMatchQuery(%s)\n", szDeviceString);
+ return VOTE_NO_MATCH;
+} //DeviceQueryMatch
+
+APDK_END_NAMESPACE
diff --git a/prnt/hpijs/printerproxy.h b/prnt/hpijs/printerproxy.h
new file mode 100644
index 0000000..0da9ffd
--- /dev/null
+++ b/prnt/hpijs/printerproxy.h
@@ -0,0 +1,109 @@
+/*****************************************************************************\
+ Copyright (c) 2002 - 2002, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+// PrinterProxy.h - Morpheus component code base
+
+#if !defined(APDK_PRINTERPROXY_H)
+ #define APDK_PRINTERPROXY_H
+
+APDK_BEGIN_NAMESPACE
+
+typedef const void* MODEL_HANDLE;
+
+//! Define voting ranges for the proxy voting system
+typedef enum PROXY_VOTE
+{
+ VOTE_NO_MATCH = 0, //!< can't do anything for this request
+ VOTE_LAST_DITCH_MATCH = 10, //!< possible last ditch effort to do something
+ VOTE_POSSIBLE_MATCH = 50, //!< might be able to generate output
+ VOTE_FAMILY_MATCH = 70, //!< matched by family
+ VOTE_VIP_MATCH = 80, //!< matched because it is a VIP printer
+ VOTE_SUBSTRING_MATCH = 90, //!< a model was a substring of the full string
+ VOTE_EXACT_MATCH = 100 //!< exact match id on this printer
+} PROXY_VOTE;
+
+// Specify a class prototype, otherwise "virtual printer" fails with error: ISO C++
+// forbids declaration of "Printer" with no type
+class Printer;
+
+//PrinterProxy
+//!Provide act on behalf of the printer class for matching, names, voting, etc
+/*!
+******************************************************************************/
+class PrinterProxy
+{
+public:
+ PrinterProxy
+ (
+ const char* szFamilyName,
+ const char* szModelNames
+ );
+
+ virtual ~PrinterProxy(); // gcc wants it to be virtual
+
+ // Public API
+ inline const char* GetFamilyName() const { return m_szFamilyName; }
+ inline unsigned int GetModelCount() const { return m_uModelCount; }
+ virtual Printer* CreatePrinter(SystemServices* pSS) const = 0;
+ virtual PRINTER_TYPE GetPrinterType() const = 0;
+ virtual unsigned int GetModelBit() const = 0;
+
+ inline MODEL_HANDLE StartModelNameEnum() const { return NULL; }
+
+ const char* GetModelName(MODEL_HANDLE& theHandle) const;
+ const char* GetNextModelName(MODEL_HANDLE& theHandle) const;
+
+ PROXY_VOTE DeviceMatchQuery(const char* szDeviceString) const;
+ bool ModelMatchQuery(const char* szModelString) const;
+
+protected:
+ PRINTER_TYPE m_iPrinterType;
+
+private:
+ const char* m_szFamilyName;
+ const char* m_szModelNames;
+ unsigned int m_uModelCount;
+}; //PrinterProxy
+
+//GetModelName
+//!Get the model name based on the handle
+/*!
+\return
+model name based on the model handle
+******************************************************************************/
+inline const char* PrinterProxy::GetModelName
+(
+ MODEL_HANDLE& theModelHandle //!< [in][out] handle to current model
+) const
+{
+ TRACE("PP::GetModelName() returning %s\n", reinterpret_cast<const char*>(theModelHandle));
+ return reinterpret_cast<const char*>(theModelHandle);
+} //GetNextModelName
+
+APDK_END_NAMESPACE
+
+#endif //APDK_PRINTERPROXY_H
diff --git a/prnt/hpijs/pscript.h b/prnt/hpijs/pscript.h
new file mode 100644
index 0000000..6b3d98a
--- /dev/null
+++ b/prnt/hpijs/pscript.h
@@ -0,0 +1,169 @@
+/*****************************************************************************\
+ pscript.h : Interface for the PScript class
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#ifndef APDK_PSCRIPT_H
+#define APDK_PSCRIPT_H
+
+#ifdef APDK_PSCRIPT
+
+extern "C"
+{
+#include "jpeglib.h"
+}
+#include <setjmp.h>
+
+APDK_BEGIN_NAMESPACE
+
+#ifdef APDK_HIGH_RES_MODES
+#define PS_BASE_RES 300
+#else
+#define PS_BASE_RES 150
+#endif
+
+
+typedef struct _StrList
+{
+ char *pPSString;
+ struct _StrList *next;
+} StrList;
+
+/*!
+\internal
+*/
+class PScript : public Printer
+{
+public:
+ PScript (SystemServices* pSS,int numfonts=0, BOOL proto=FALSE);
+ ~PScript ();
+
+ PrintMode* GetMode (int index);
+
+ virtual Header* SelectHeader (PrintContext* pc);
+ virtual DRIVER_ERROR VerifyPenInfo ();
+ virtual DRIVER_ERROR ParsePenInfo (PEN_TYPE& ePen, BOOL QueryPrinter=TRUE);
+ virtual DISPLAY_STATUS ParseError (BYTE status_reg);
+ virtual DRIVER_ERROR Encapsulate (const RASTERDATA* InputRaster, BOOL bLastPlane);
+ inline virtual BOOL SupportSeparateBlack (PrintMode *pCurrentMode) {return FALSE;}
+ virtual DRIVER_ERROR Flush (int FlushSize);
+ DRIVER_ERROR SkipRasters (int nBlankRasters);
+
+ virtual int PrinterLanguage ()
+ {
+ return 10; // PostScript
+ }
+
+ virtual DRIVER_ERROR SaveText (const char *psStr, int iPointSize, int iX, int iY,
+ const char *pTextString, int iTextStringLen,
+ BOOL bUnderline);
+
+ virtual BOOL UseCMYK(unsigned int iPrintMode) { return FALSE;}
+
+ DRIVER_ERROR SendText (int iCurYPos);
+ void FreeList ();
+ void JpegData (BYTE *buffer, int iSize);
+
+protected:
+
+#ifdef APDK_HP_UX
+ virtual PScript & operator = (Printer& rhs)
+ {
+ return *this;
+ }
+#endif
+
+private:
+ DRIVER_ERROR SendImage ();
+ void AddRaster (BYTE *pbyRow, int iLength);
+ void JpegRaster ();
+ int EncodeJpeg ();
+ DRIVER_ERROR StartJpegCompression ();
+ void FinishJpegCompression ();
+ StrList *m_pHeadPtr;
+ StrList *m_pCurItem;
+ PrintContext *m_pPC;
+ struct jpeg_compress_struct m_cinfo;
+ struct jpeg_error_mgr m_jerr;
+ jmp_buf m_setjmp_buffer;
+
+ unsigned int m_iRowNumber;
+ int m_iRowWidth;
+ int m_iJpegBufferPos;
+ int m_iJpegBufferSize;
+ BYTE *m_pbyInputRaster;
+ BYTE *m_pbyJpegBuffer;
+ BYTE *m_pbyEncodedBuffer;
+ int m_iPageNumber;
+ COLORMODE m_eColorMode;
+}; // PScript
+
+class PScriptDraftMode : public PrintMode
+{
+public:
+ PScriptDraftMode ();
+}; // PScriptDraftMode
+
+class PScriptNormalMode : public PrintMode
+{
+public:
+ PScriptNormalMode ();
+}; // PScriptNormalMode
+
+class PScriptGrayMode : public PrintMode
+{
+public:
+ PScriptGrayMode ();
+}; // PScriptGrayMode
+
+#ifdef APDK_PSCRIPT
+//! PScriptProxy
+/*!
+******************************************************************************/
+class PScriptProxy : public PrinterProxy
+{
+public:
+ PScriptProxy() : PrinterProxy(
+ "PostScript", // family name
+ "postscript\0" // models
+ "HP Color LaserJet 2605\0"
+ "HP Color LaserJet 2605dn\0"
+#ifdef APDK_MLC_PRINTER
+#endif
+ ) {m_iPrinterType = ePScript;}
+ inline Printer* CreatePrinter(SystemServices* pSS) const { return new PScript(pSS); }
+ inline PRINTER_TYPE GetPrinterType() const { return ePScript;}
+ inline unsigned int GetModelBit() const { return 0x10;}
+};
+#endif
+
+APDK_END_NAMESPACE
+
+#endif // APDK_PSCRIPT
+#endif //APDK_PSCRIPT_H
diff --git a/prnt/hpijs/psp100.cpp b/prnt/hpijs/psp100.cpp
new file mode 100644
index 0000000..a92beb4
--- /dev/null
+++ b/prnt/hpijs/psp100.cpp
@@ -0,0 +1,232 @@
+/*****************************************************************************\
+ psp100.cpp : Implimentation for the PSP100 class
+
+ Copyright (c) 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+#if defined(APDK_PSP100) && defined (APDK_DJ9xxVIP)
+
+#include "header.h"
+#include "dj9xxvip.h"
+#include "psp100.h"
+#include "printerproxy.h"
+
+APDK_BEGIN_NAMESPACE
+
+// PhotoSmart 100 - AtomAnt
+PSP100::PSP100 (SystemServices* pSS, BOOL proto)
+ : DJ9xxVIP (pSS, proto)
+{
+
+ for (unsigned int i = 0; i < ModeCount; i++)
+ {
+ if (pMode[i])
+ delete pMode[i];
+ pMode[i] = NULL;
+ }
+
+ ePen = COLOR_PEN;
+
+ if (!proto && IOMode.bDevID)
+ {
+ bCheckForCancelButton = TRUE;
+ constructor_error = VerifyPenInfo ();
+ CERRCHECK;
+ }
+
+ pMode[GRAYMODE_INDEX] = new GrayModePSP100 ();
+ pMode[DEFAULTMODE_INDEX] = new PSP100Mode ();
+ pMode[SPECIALMODE_INDEX] = new PSP100NormalMode ();
+
+ ModeCount = 3;
+
+#ifdef APDK_AUTODUPLEX
+ bDuplexCapable = FALSE;
+#endif
+#ifdef APDK_EXTENDED_MEDIASIZE
+ pMode[SPECIALMODE_INDEX+1] = new PSP1002400Mode ();
+ ModeCount = 4;
+#endif
+
+} //PSP100
+
+
+GrayModePSP100::GrayModePSP100 ()
+ : PrintMode(NULL)
+{
+#if defined(APDK_VIP_COLORFILTERING)
+ Config.bErnie=TRUE;
+#endif
+
+ Config.bColorImage=FALSE;
+
+/*
+ * The resolutions here are set to 300 for better performance from Cameras.
+ * REVISIT: Must provide a true 600 dpi printmode later.
+ * 12/21/01
+ *
+ * See not in dj9xxvip.cpp - 1/9/2002 - JLM
+ */
+
+ BaseResX =
+ BaseResY =
+ TextRes =
+ ResolutionX[0] =
+ ResolutionY[0] = VIP_BASE_RES;
+ medium = mediaGlossy;
+ CompatiblePens[0] = COLOR_PEN;
+ theQuality = qualityPresentation;
+ bFontCapable = FALSE;
+ pmColor = GREY_CMY;
+} //GrayModePSP100
+
+
+PEN_TYPE PSP100::DefaultPenSet()
+{ return COLOR_PEN; }
+
+
+PSP100Mode::PSP100Mode () : PrintMode (NULL)
+{
+
+/*
+ * See comments above regarding 300/600 dpi change
+ */
+
+ BaseResX = BaseResY = TextRes = ResolutionX[0] = ResolutionY[0] = VIP_BASE_RES;
+
+#if defined(APDK_VIP_COLORFILTERING)
+ Config.bErnie = TRUE;
+#endif
+
+ Config.bColorImage = FALSE;
+
+ medium = mediaGlossy;
+ theQuality = qualityPresentation;
+ pmQuality = QUALITY_BEST;
+ pmMediaType = MEDIA_PHOTO;
+ CompatiblePens[0] = COLOR_PEN;
+ bFontCapable = FALSE;
+} //PSP100Mode
+
+PSP100NormalMode::PSP100NormalMode () : PrintMode (NULL)
+{
+
+/*
+ * See comments above regarding 300/600 dpi change
+ */
+
+ BaseResX = BaseResY = TextRes = ResolutionX[0] = ResolutionY[0] = VIP_BASE_RES;
+
+#if defined(APDK_VIP_COLORFILTERING)
+ Config.bErnie = TRUE;
+#endif
+
+ Config.bColorImage = FALSE;
+
+ medium = mediaSpecial;
+ theQuality = qualityNormal;
+ CompatiblePens[0] = COLOR_PEN;
+ bFontCapable = FALSE;
+} //PSP100Mode
+
+#ifdef APDK_EXTENDED_MEDIASIZE
+PSP1002400Mode::PSP1002400Mode () : PrintMode (NULL)
+{
+
+/*
+ * See comments above regarding 300/600 dpi change
+ */
+
+ BaseResX = BaseResY = TextRes = ResolutionX[0] = ResolutionY[0] = 1200;
+
+#if defined(APDK_VIP_COLORFILTERING)
+ Config.bErnie = TRUE;
+#endif
+
+ Config.bColorImage = FALSE;
+
+ medium = mediaHighresPhoto;
+ theQuality = qualityPresentation;
+ pmMediaType = MEDIA_PHOTO;
+ pmQuality = QUALITY_HIGHRES_PHOTO;
+ CompatiblePens[0] = COLOR_PEN;
+ bFontCapable = FALSE;
+} //PSP1002400Mode
+#endif
+
+PAPER_SIZE PSP100::MandatoryPaperSize ()
+{
+ return A6;
+ // return PHOTO_5x7;
+} //MandantoryPaperSize
+
+
+BOOL PSP100::UseGUIMode
+(
+ PrintMode* pPrintMode
+)
+{
+ return TRUE;
+} //UseGUIMode
+
+
+DRIVER_ERROR PSP100::VerifyPenInfo ()
+{
+ DRIVER_ERROR err = NO_ERROR;
+
+ if(IOMode.bDevID == FALSE)
+ {
+ return err;
+ }
+ ePen = NO_PEN;
+ char *str;
+ while (ePen == NO_PEN)
+ {
+ err = SetPenInfo (str, TRUE);
+ ERRCHECK;
+
+ if (*(str-1) == '1' && *(str-2) == '1')
+ {
+ pSS->DisplayPrinterStatus (DISPLAY_NO_PENS);
+ }
+ else
+ {
+ ePen = COLOR_PEN;
+ break;
+ }
+ if (pSS->BusyWait(500) == JOB_CANCELED)
+ {
+ return JOB_CANCELED;
+ }
+ }
+
+ return NO_ERROR;
+} //VerifyPenInfo
+
+APDK_END_NAMESPACE
+
+#endif //APDK_PSP100
diff --git a/prnt/hpijs/psp100.h b/prnt/hpijs/psp100.h
new file mode 100644
index 0000000..6ae79f1
--- /dev/null
+++ b/prnt/hpijs/psp100.h
@@ -0,0 +1,143 @@
+/*****************************************************************************\
+ psp100.h : Interface for the PSP100 class
+
+ Copyright (c) 2001-2002, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#ifndef APDK_PSP100_H
+#define APDK_PSP100_H
+// PhotoSmart 100
+
+APDK_BEGIN_NAMESPACE
+
+//PSP100
+//!
+/*!
+\internal
+******************************************************************************/
+class PSP100 : public DJ9xxVIP
+{
+public:
+ PSP100 (SystemServices* pSS, BOOL proto = FALSE);
+
+ DRIVER_ERROR VerifyPenInfo ();
+// DRIVER_ERROR ParsePenInfo (PEN_TYPE& ePen, BOOL QueryPrinter = TRUE);
+ virtual PEN_TYPE DefaultPenSet();
+ inline virtual BOOL SupportSeparateBlack (PrintMode *pCurrentMode) {return FALSE;}
+ virtual BOOL UseGUIMode (PrintMode* pPrintMode);
+ PAPER_SIZE MandatoryPaperSize ();
+ virtual BOOL FullBleedCapable (PAPER_SIZE ps, FullbleedType *fbType, float *xOverSpray, float *yOverSpray,
+ float *fLeftOverSpray, float *fTopOverSpray)
+ {
+ *xOverSpray = (float) 0.12;
+ *yOverSpray = (float) 0.06;
+
+ if (fLeftOverSpray)
+ *fLeftOverSpray = (float) 0.05;
+ if (fTopOverSpray)
+ *fTopOverSpray = (float) 0.03;
+
+ if (ps == PHOTO_SIZE || ps == A6_WITH_TEAR_OFF_TAB ||
+ ps == PHOTO_5x7)
+ {
+ *fbType = fullbleed4EdgeAllMedia;
+ }
+ else
+ {
+ *fbType = fullbleed3EdgeAllMedia;
+ }
+
+ return TRUE;
+ }
+
+}; //PSP100
+
+
+//PSP100Mode
+/*
+******************************************************************************/
+class PSP100Mode : public PrintMode
+{
+public:
+ PSP100Mode ();
+}; //PSP100Mode
+
+class PSP100NormalMode : public PrintMode
+{
+public:
+ PSP100NormalMode ();
+}; //PSP100NormalMode
+
+#ifdef APDK_EXTENDED_MEDIASIZE
+//PSP1002400Mode
+/*
+******************************************************************************/
+class PSP1002400Mode : public PrintMode
+{
+public:
+ PSP1002400Mode ();
+}; //PSP1002400Mode
+#endif
+
+//GrayModePSP100
+/*
+******************************************************************************/
+class GrayModePSP100 : public PrintMode
+{
+public:
+ GrayModePSP100 ();
+
+}; //GrayModePSP100
+
+
+#if defined(APDK_PSP100) && defined (APDK_DJ9xxVIP)
+//! PSP100Proxy
+/*!
+******************************************************************************/
+class PSP100Proxy : public PrinterProxy
+{
+public:
+ PSP100Proxy() : PrinterProxy(
+ "PS100", // family name
+ "PHOTOSMART 100\0"
+ "PHOTOSMART 130\0"
+ "PHOTOSMART 230\0"
+ "photosmart 240\0"
+ "photosmart 140\0"
+#ifdef APDK_MLC_PRINTER
+#endif
+ ) {m_iPrinterType = ePSP100;}
+ inline Printer* CreatePrinter(SystemServices* pSS) const { return new PSP100(pSS); }
+ inline PRINTER_TYPE GetPrinterType() const { return ePSP100;}
+ inline unsigned int GetModelBit() const { return 0x200;}
+};
+#endif
+
+APDK_END_NAMESPACE
+
+#endif // APDK_PSP100_H
diff --git a/prnt/hpijs/psp470.h b/prnt/hpijs/psp470.h
new file mode 100644
index 0000000..12f7086
--- /dev/null
+++ b/prnt/hpijs/psp470.h
@@ -0,0 +1,126 @@
+/*****************************************************************************\
+ psp470.h : Interface for the PSP470 class
+
+ Copyright (c) 2001-2002, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#ifndef APDK_PSP470_H
+#define APDK_PSP470_H
+// Photosmart 470 series
+
+APDK_BEGIN_NAMESPACE
+
+//PSPFastNormalMode
+/*
+******************************************************************************/
+class PSPFastNormalMode : public PrintMode
+{
+public:
+ PSPFastNormalMode ();
+}; //PSPFastNormalMode
+/******************************************************************************/
+
+PSPFastNormalMode::PSPFastNormalMode () : PrintMode (NULL)
+{
+
+ BaseResX = BaseResY = TextRes = ResolutionX[0] = ResolutionY[0] = 600;
+
+#if defined(APDK_VIP_COLORFILTERING)
+ Config.bErnie = TRUE;
+#endif
+
+ Config.bColorImage = FALSE;
+
+ medium = mediaAuto;
+ theQuality = qualityDraft;
+ pmQuality = QUALITY_DRAFT;
+ pmMediaType = MEDIA_PHOTO;
+ CompatiblePens[0] = COLOR_PEN;
+ bFontCapable = FALSE;
+} //PSP100Mode
+
+//PSP470
+//!
+/*!
+\internal
+******************************************************************************/
+class PSP470 : public PSP100
+{
+public:
+ PSP470 (SystemServices* pSS, BOOL proto = FALSE) : PSP100 (pSS, proto)
+ {
+ pMode[ModeCount] = new PSPFastNormalMode ();
+ ModeCount++;
+ }
+
+ PAPER_SIZE MandatoryPaperSize ()
+ {
+ return PHOTO_5x7;
+ }
+ virtual BOOL FullBleedCapable (PAPER_SIZE ps, FullbleedType *fbType, float *xOverSpray, float *yOverSpray,
+ float *fLeftOverSpray, float *fTopOverSpray)
+ {
+ *xOverSpray = (float) 0.12;
+ *yOverSpray = (float) 0.06;
+
+ if (fLeftOverSpray)
+ *fLeftOverSpray = (float) 0.05;
+ if (fTopOverSpray)
+ *fTopOverSpray = (float) 0.03;
+
+ *fbType = fullbleed4EdgeAllMedia;
+ return TRUE;
+ }
+
+}; //PSP470
+
+#if defined(APDK_PSP100) && defined (APDK_DJ9xxVIP)
+//! PSP470Proxy
+/*!
+******************************************************************************/
+class PSP470Proxy : public PrinterProxy
+{
+public:
+ PSP470Proxy() : PrinterProxy(
+ "PS470", // family name
+ "Photosmart 470\0"
+ "Photosmart 475\0"
+ "Photosmart A610\0"
+ "Photosmart A620\0"
+ "Photosmart A710\0"
+ "Photosmart A820\0"
+ ) {m_iPrinterType = ePSP470;}
+ inline Printer* CreatePrinter(SystemServices* pSS) const { return new PSP470(pSS); }
+ inline PRINTER_TYPE GetPrinterType() const { return ePSP470;}
+ inline unsigned int GetModelBit() const { return 0x200;}
+};
+#endif
+
+APDK_END_NAMESPACE
+
+#endif // APDK_PSP470_H
diff --git a/prnt/hpijs/quickconnect.cpp b/prnt/hpijs/quickconnect.cpp
new file mode 100644
index 0000000..df7b2b6
--- /dev/null
+++ b/prnt/hpijs/quickconnect.cpp
@@ -0,0 +1,653 @@
+/*****************************************************************************\
+ quickconnect.cpp : Implementation for the QuickConnect class
+
+ Copyright (c) 2008, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#ifdef APDK_QUICKCONNECT
+
+#include "header.h"
+#include "io_defs.h"
+#include "quickconnect.h"
+#include "printerproxy.h"
+#include "resources.h"
+#include <setjmp.h>
+
+APDK_BEGIN_NAMESPACE
+
+#define MAX_JPEG_FILE_SIZE 2097152
+
+QuickConnect::QuickConnect (SystemServices* pSS, BOOL proto)
+ : Printer (pSS, proto)
+{
+
+ if ((!proto) && (IOMode.bDevID))
+ {
+ constructor_error = VerifyPenInfo ();
+ CERRCHECK;
+ }
+ else
+ ePen = BOTH_PENS; // matches default mode
+
+ ModeCount = 0;
+ pMode[ModeCount++] = new QCAutomatic ();
+ pMode[ModeCount++] = new QCFastNormal ();
+ pMode[ModeCount++] = new QCNormal ();
+ pMode[ModeCount++] = new QCBest ();
+
+ CMYMap = NULL;
+
+ m_iJpegBufferPos = 0;
+ m_iMaxFileSize = MAX_JPEG_FILE_SIZE;
+ m_iInputBufferSize = 0;
+ m_pbyJpegBuffer = NULL;
+ m_pbyInputBuffer = NULL;
+
+ m_iPhotoFix = 0;
+ m_iRemoveRedEye = 1;
+ m_iJobId = pSS->GetSystemTickCount ();
+}
+
+QuickConnect::~QuickConnect ()
+{
+ if (m_pbyJpegBuffer)
+ {
+ pSS->FreeMemory (m_pbyJpegBuffer);
+ }
+ if (m_pbyInputBuffer)
+ {
+ pSS->FreeMemory (m_pbyInputBuffer);
+ }
+}
+
+QCAutomatic::QCAutomatic ()
+: PrintMode (NULL)
+{
+ ResolutionX[0] = 300;
+ ResolutionY[0] = 300;
+ BaseResX = BaseResY = 300;
+
+ bFontCapable = FALSE;
+
+ theQuality = qualityAuto;
+ medium = mediaAuto;
+
+ pmQuality = QUALITY_AUTO;
+ pmMediaType = MEDIA_PLAIN;
+ Config.bColorImage = FALSE;
+ Config.bCompress = FALSE;
+#ifdef APDK_AUTODUPLEX
+ bDuplexCapable = FALSE;
+#endif
+}
+
+QCFastNormal::QCFastNormal ()
+: PrintMode (NULL)
+{
+ ResolutionX[0] = 300;
+ ResolutionY[0] = 300;
+ BaseResX = BaseResY = 300;
+
+ bFontCapable = FALSE;
+
+ theQuality = qualityFastNormal;
+ medium = mediaAuto;
+
+ pmQuality = QUALITY_FASTNORMAL;
+ pmMediaType = MEDIA_PLAIN;
+ Config.bColorImage = FALSE;
+ Config.bCompress = FALSE;
+#ifdef APDK_AUTODUPLEX
+ bDuplexCapable = FALSE;
+#endif
+}
+
+QCNormal::QCNormal ()
+: PrintMode (NULL)
+{
+ ResolutionX[0] = 300;
+ ResolutionY[0] = 300;
+ BaseResX = BaseResY = 300;
+
+ bFontCapable = FALSE;
+
+ theQuality = qualityNormal;
+ medium = mediaAuto;
+
+ pmQuality = QUALITY_NORMAL;
+ pmMediaType = MEDIA_PLAIN;
+ Config.bColorImage = FALSE;
+ Config.bCompress = FALSE;
+#ifdef APDK_AUTODUPLEX
+ bDuplexCapable = FALSE;
+#endif
+}
+
+QCBest::QCBest ()
+: PrintMode (NULL)
+{
+ ResolutionX[0] = 300;
+ ResolutionY[0] = 300;
+ BaseResX = BaseResY = 300;
+
+ bFontCapable = FALSE;
+
+ theQuality = qualityPresentation;
+ medium = mediaAuto;
+
+ pmQuality = QUALITY_BEST;
+ pmMediaType = MEDIA_PLAIN;
+ Config.bColorImage = FALSE;
+ Config.bCompress = FALSE;
+#ifdef APDK_AUTODUPLEX
+ bDuplexCapable = FALSE;
+#endif
+}
+
+Header *QuickConnect::SelectHeader (PrintContext *pc)
+{
+ m_iRowNumber = 0;
+ m_pPC = pc;
+ m_iRowWidth = pc->OutputPixelsPerRow () * 3;
+
+ m_iInputBufferSize = m_iRowWidth * (int) (pc->PhysicalPageSizeY () * pc->EffectiveResolutionY ());
+ m_pbyInputBuffer = (BYTE *) pSS->AllocMem (m_iInputBufferSize);
+ m_pbyJpegBuffer = (BYTE *) pSS->AllocMem (m_iMaxFileSize);
+ if (m_pbyInputBuffer == NULL || m_pbyJpegBuffer == NULL)
+ {
+ constructor_error = ALLOCMEM_ERROR;
+ return NULL;
+ }
+ memset (m_pbyInputBuffer, 0xFF, m_iInputBufferSize);
+ return new HeaderQuickConnect (this, pc);
+}
+
+DRIVER_ERROR QuickConnect::Encapsulate (const RASTERDATA* InputRaster, BOOL bLastPlane)
+{
+ memcpy (m_pbyInputBuffer + (m_iRowNumber * m_iRowWidth), InputRaster->rasterdata[COLORTYPE_COLOR],
+ InputRaster->rastersize[COLORTYPE_COLOR]);
+ m_iRowNumber++;
+ return NO_ERROR;
+}
+
+DRIVER_ERROR QuickConnect::ParsePenInfo (PEN_TYPE& ePen, BOOL QueryPrinter)
+{
+ char *str;
+ int num_pens = 0;
+ ePen = BOTH_PENS;
+
+ DRIVER_ERROR err = SetPenInfo (str, QueryPrinter);
+ if (err != NO_ERROR)
+ {
+ return NO_ERROR;
+ }
+
+ num_pens = str[0] - '0';
+ if (num_pens == 0)
+ {
+ ePen = NO_PEN;
+ return NO_ERROR;
+ }
+
+ if ((int) strlen (str) < (num_pens * 8))
+ {
+ return BAD_DEVICE_ID;
+ }
+
+ return NO_ERROR;
+}
+
+DRIVER_ERROR QuickConnect::VerifyPenInfo ()
+{
+ ePen = BOTH_PENS;
+ DRIVER_ERROR err = NO_ERROR;
+
+ if (IOMode.bDevID == FALSE)
+ return err;
+
+ ePen = NO_PEN;
+
+ err = ParsePenInfo (ePen);
+
+ if(err == UNSUPPORTED_PEN) // probably Power Off - pens couldn't be read
+ {
+
+ // have to delay or the POWER ON will be ignored
+ if (pSS->BusyWait ((DWORD) 2000) == JOB_CANCELED)
+ {
+ return JOB_CANCELED;
+ }
+
+ DWORD length = sizeof (DJ895_Power_On);
+ err = pSS->ToDevice (DJ895_Power_On, &length);
+ ERRCHECK;
+
+ err = pSS->FlushIO ();
+ ERRCHECK;
+
+ // give the printer some time to power up
+ if (pSS->BusyWait ((DWORD) 2500) == JOB_CANCELED)
+ {
+ return JOB_CANCELED;
+ }
+
+ err = ParsePenInfo (ePen);
+ }
+
+ ERRCHECK;
+ while (ePen == NO_PEN)
+ {
+ pSS->DisplayPrinterStatus (DISPLAY_NO_PENS);
+
+ if (pSS->BusyWait (500) == JOB_CANCELED)
+ {
+ return JOB_CANCELED;
+ }
+ err = ParsePenInfo (ePen);
+ ERRCHECK;
+ }
+
+ pSS->DisplayPrinterStatus (DISPLAY_PRINTING);
+
+ return err;
+}
+
+int QuickConnect::MapPaperSize (PAPER_SIZE ePaperSize)
+{
+ switch (ePaperSize)
+ {
+ case PHOTO_5x7:
+ return 2;
+ case L:
+ return 3;
+ case PHOTO_4x8:
+ return 4;
+ case PHOTO_4x12:
+ return 5;
+ case CARD_4x6:
+ case HAGAKI:
+ case A6:
+ return 1;
+ default:
+ return 0;
+ }
+}
+
+int QuickConnect::MapMediaType (MEDIATYPE eMediaType)
+{
+ switch (eMediaType)
+ {
+ case MEDIA_HIGHRES_PHOTO:
+ return 1;
+ case MEDIA_PREMIUM:
+ return 2;
+ case MEDIA_PLAIN:
+ return 3;
+ case MEDIA_PHOTO:
+ return 4;
+ case MEDIA_AUTO:
+ default:
+ return 0;
+ }
+}
+
+int QuickConnect::MapQualityMode (QUALITY_MODE eQualityMode)
+{
+ switch (eQualityMode)
+ {
+ case QUALITY_NORMAL:
+ return 2;
+ case QUALITY_FASTNORMAL:
+ return 3;
+ case QUALITY_BEST:
+ return 1;
+ case QUALITY_AUTO:
+ default:
+ return 0;
+ }
+}
+
+DRIVER_ERROR QuickConnect::SetHint (PRINTER_HINT eHint, int iValue)
+{
+ switch (eHint)
+ {
+ case PHOTO_FIX_HINT:
+ {
+ m_iPhotoFix = iValue & 0x1;
+ break;
+ }
+ case RED_EYE_REMOVAL_HINT:
+ {
+ m_iRemoveRedEye = iValue & 0x1;
+ break;
+ }
+ case MAX_FILE_SIZE_HINT:
+ {
+ m_iMaxFileSize = iValue;
+ break;
+ }
+ default:
+ break;
+ }
+ return NO_ERROR;
+}
+
+
+DRIVER_ERROR QuickConnect::Flush (int iBufferSize)
+{
+ DRIVER_ERROR err = NO_ERROR;
+ if (iBufferSize == -1 && m_iRowNumber > 0)
+ {
+ char szStr[256];
+ int iPaperSize, iMediaType, iPrintQuality;
+ char szCopiesStr[64];
+ char szNullBytes[632];
+ static const char szPJLHeader[] = "\x1B\x45\x1B%-12345X@PJL ENTER LANGUAGE=PHOTOJPEG\012";
+ static const char szPJLEndJob[] = "\x1B\x45\x1B%-12345X";
+
+ err = Compress ();
+ ERRCHECK;
+
+ memset (szNullBytes, 0, sizeof (szNullBytes));
+ sprintf (szCopiesStr, "@PJL SET COPIES=%d\012@PJL SET JOBID=%d\012", m_pPC->GetCopyCount (), m_iJobId);
+
+ Send ((const BYTE *) szNullBytes, 600);
+ Send ((const BYTE *) szPJLHeader, sizeof(szPJLHeader) - 1);
+ Send ((const BYTE *) szCopiesStr, strlen (szCopiesStr));
+
+ COLORMODE eColorMode = COLOR;
+ MEDIATYPE eMediaType;
+ QUALITY_MODE eQualityMode;
+ BOOL bDeviceText;
+
+ m_pPC->GetPrintModeSettings (eQualityMode, eMediaType, eColorMode, bDeviceText);
+ iMediaType = MapMediaType (eMediaType);
+ iPrintQuality = MapQualityMode (eQualityMode);
+ iPaperSize = MapPaperSize (m_pPC->GetPaperSize ());
+
+ sprintf (szStr,
+ "@PJL SET PAPER=%d\012@PJL SET MEDIATYPE=%d\012@PJL SET PRINTQUALITY=%d\012@PJL SET BORDERLESS=%d\012",
+ iPaperSize, iMediaType, iPrintQuality, m_pPC->IsBorderless ());
+ err = Send ((const BYTE *) szStr, strlen (szStr));
+
+ err = AddExifHeader ();
+ ERRCHECK;
+
+ memset (m_pbyInputBuffer, 0xFF, m_iInputBufferSize);
+
+// Send the END JOB PJL command
+
+ Send ((const BYTE *) szPJLEndJob, sizeof(szPJLEndJob) - 1);
+
+ m_iRowNumber = 0;
+ }
+ return err;
+}
+
+HeaderQuickConnect::HeaderQuickConnect (Printer *p, PrintContext *pc)
+ : Header (p,pc)
+{
+}
+
+DRIVER_ERROR HeaderQuickConnect::Send ()
+{
+ return NO_ERROR;
+}
+
+DRIVER_ERROR HeaderQuickConnect::EndJob ()
+{
+ DRIVER_ERROR err = NO_ERROR;
+
+ return err;
+}
+
+DRIVER_ERROR HeaderQuickConnect::FormFeed ()
+{
+ DRIVER_ERROR err = NO_ERROR;
+ thePrinter->Flush (-1);
+ return err;
+}
+
+DRIVER_ERROR HeaderQuickConnect::SendCAPy (unsigned int iAbsY)
+{
+ return NO_ERROR;
+}
+
+void HPFlush_output_buffer_callback (JOCTET *outbuf, BYTE *buffer, int size)
+{
+ QuickConnect *pQC = (QuickConnect *) outbuf;
+ pQC->JpegData (buffer, size);
+}
+
+void QuickConnect::JpegData (BYTE *buffer, int iSize)
+{
+ m_iJpegBufferPos += iSize;
+ if (m_iJpegBufferPos < m_iMaxFileSize)
+ {
+ memcpy (m_pbyJpegBuffer + m_iJpegBufferPos - iSize, buffer, iSize);
+ }
+ else
+ {
+ m_iJpegBufferPos = m_iMaxFileSize + 1;
+ }
+}
+
+//----------------------------------------------------------------
+// These are "overrides" to the JPEG library error routines
+//----------------------------------------------------------------
+
+void HPJpeg_error (j_common_ptr cinfo)
+{
+
+}
+
+extern "C"
+{
+void jpeg_buffer_dest (j_compress_ptr cinfo, JOCTET* outbuff, void* flush_output_buffer_callback);
+void hp_rgb_ycc_setup (int iFlag);
+}
+
+DRIVER_ERROR QuickConnect::Compress ()
+{
+
+ BYTE *p;
+ int volatile iQuality = 100;
+
+/*
+ * Convert the byte buffer to jpg, if converted size is greater than 2MB, delete it and
+ * convert with a higher compression factor.
+ */
+
+ struct jpeg_compress_struct cinfo;
+ struct jpeg_error_mgr jerr;
+ jmp_buf setjmp_buffer;
+
+ BOOL bRedo;
+
+// Use the standard RGB to YCC table rather than the modified one for JetReady
+
+ hp_rgb_ycc_setup (0);
+ do
+ {
+ bRedo = 0;
+
+ m_iJpegBufferPos = 0;
+ memset (m_pbyJpegBuffer, 0xFF, m_iMaxFileSize);
+
+ cinfo.err = jpeg_std_error (&jerr);
+ jerr.error_exit = HPJpeg_error;
+ if (setjmp (setjmp_buffer))
+ {
+ jpeg_destroy_compress (&cinfo);
+ return SYSTEM_ERROR;
+ }
+
+ jpeg_create_compress (&cinfo);
+ cinfo.in_color_space = JCS_RGB;
+ jpeg_set_defaults (&cinfo);
+ cinfo.image_width = m_iRowWidth / 3;
+ cinfo.image_height = m_iRowNumber;
+ cinfo.input_components = 3;
+ cinfo.data_precision = 8;
+ jpeg_set_quality (&cinfo, iQuality, TRUE);
+ jpeg_buffer_dest (&cinfo, (JOCTET *) this, (void *) (HPFlush_output_buffer_callback));
+ jpeg_start_compress (&cinfo, TRUE);
+ JSAMPROW pRowArray[1];
+ p = m_pbyInputBuffer;
+ for (int i = 0; i < m_iRowNumber; i++)
+ {
+ pRowArray[0] = (JSAMPROW) p;
+ jpeg_write_scanlines (&cinfo, pRowArray, 1);
+ p += (m_iRowWidth);
+ if (m_iJpegBufferPos > m_iMaxFileSize)
+ {
+ m_iJpegBufferPos = 0;
+ bRedo = 1;
+ }
+ }
+ jpeg_finish_compress (&cinfo);
+ jpeg_destroy_compress (&cinfo);
+ iQuality -= 10;
+ if (iQuality == 0)
+ {
+ m_iJpegBufferPos = 0;
+ return SYSTEM_ERROR;
+ }
+ } while (bRedo);
+
+#ifdef _DEBUG
+ char szFileName[64];
+ sprintf (szFileName, "C:\\temp\\HPJpeg.jpg");
+ FILE *fp = fopen (szFileName, "wb");
+ if (fp)
+ {
+ fwrite (m_pbyJpegBuffer, 1, m_iJpegBufferPos, fp);
+ fclose (fp);
+ }
+#endif
+
+ return NO_ERROR;
+}
+
+DRIVER_ERROR QuickConnect::AddExifHeader ()
+{
+
+ DRIVER_ERROR err;
+ BYTE *pBuffer = m_pbyJpegBuffer;
+
+/*
+ * Jpeg APP2 Marker
+ * APP2 Header| Length | Identifier | Version |Number of Tags
+ * -------------------------------------------------------------------------
+ * 0xFF|0xE2 |0x00 | 0x23|0x48|0x50|0x51|0x43|0x00|0x00|0x01|0x00|0x02
+ * Length = No. of Tags * length of tag + length of APP2 marker
+ * -------------------------------------------------------------------------
+ * Tag ID |field Type| Count |Value Offset
+ * -------------------------------------------------------------
+ * 0x00|0x01|0x00|0x03 |0x00|0x00|0x00|0x01|0x00|0x00|0x00|0x01
+ * -------------------------------------------------------------
+ * Field Type 0x0003 stands for short
+ * Count and Value Offset are 4 bytes in TIFF convention.
+ * If the count <=4, Value Offset satisfies. If the count is bigger than 4 bytes,
+ * it will be offset to where data is located.
+ */
+
+ unsigned char App2[] = {"\xFF\xE2\x00\x23\x48\x50\x51\x43\x00\x00\x01\x00\x02"};
+ unsigned char szApp2Markers[2][12];
+ int iNumTags = 0;
+ int iOpts[2];
+
+// Things to set are: PhotoFix, RedEyeRemoval
+
+ iOpts[0] = m_iRemoveRedEye;
+ iOpts[1] = m_iBorderless;
+
+ short skey;
+ unsigned char szTag[] = {"\x00\x01\x00\x03\x00\x00\x00\x01\x00\x00\x00\x01"};
+ unsigned int iVal;
+
+ for (skey = 1; skey <= 2; skey++)
+ {
+ szTag[0] = (BYTE) ((skey & 0xFF) >> 8);
+ szTag[1] = (BYTE) (skey & 0xFF);
+
+ iVal = iOpts[skey];
+ szTag[8] = (BYTE) ((iVal >> 24) & 0xFF);
+ szTag[9] = (BYTE) ((iVal >> 16) & 0xFF);
+ szTag[10] = (BYTE) ((iVal >> 8) & 0xFF);
+ szTag[11] = (BYTE) (iVal & 0xFF);
+ memcpy (szApp2Markers[iNumTags], szTag, 12);
+ iNumTags++;
+
+ skey = (short) iNumTags * 12 + 11;
+ App2[2] = (BYTE) ((skey >> 8) & 0xFF);
+ App2[3] = (BYTE) (skey & 0xFF);
+ App2[11] = (BYTE) ((iNumTags >> 8) & 0xFF);
+ App2[12] = (BYTE) (iNumTags & 0xFF);
+ }
+
+/*
+ * First write the SOI and JFIF header
+ * File structure is:
+ *
+ * BYTE SOI[2]; // 00h Start of Image Marker
+ * BYTE APP0[2]; // 02h Application Use Marker
+ * BYTE Length[2]; // 04h Length of APP0 Field
+ * BYTE Identifier[5]; // 06h "JFIF" (zero terminated) Id String
+ * BYTE Version[2]; // 07h JFIF Format Revision
+ * BYTE Units; // 09h Units used for Resolution
+ * BYTE Xdensity[2]; // 0Ah Horizontal Resolution
+ * BYTE Ydensity[2]; // 0Ch Vertical Resolution
+ * BYTE XThumbnail; // 0Eh Horizontal Pixel Count
+ * BYTE YThumbnail; // 0Fh Vertical Pixel Count
+ */
+
+ short sJFIFHeaderSize = ((((short) pBuffer[4]) << 8) | pBuffer[5]) + 4;
+ err = Send ((const BYTE *) pBuffer, sJFIFHeaderSize);
+ ERRCHECK;
+
+ m_iJpegBufferPos -= sJFIFHeaderSize;
+ pBuffer += sJFIFHeaderSize;
+
+ if (iNumTags != 0)
+ {
+ err = Send ((const BYTE *) App2, 13);
+ for (int i = 0; i < iNumTags; i++)
+ {
+ err = Send ((const BYTE *) szApp2Markers[i], 12);
+ }
+ }
+
+ err = Send ((const BYTE *) pBuffer, m_iJpegBufferPos);
+ return err;
+}
+
+APDK_END_NAMESPACE
+
+#endif // defined APDK_QUICKCONNECT
+
diff --git a/prnt/hpijs/quickconnect.h b/prnt/hpijs/quickconnect.h
new file mode 100644
index 0000000..9de221b
--- /dev/null
+++ b/prnt/hpijs/quickconnect.h
@@ -0,0 +1,188 @@
+/*****************************************************************************\
+ quickconnect.h : Interface for the QuickConnect class
+
+ Copyright (c) 2008, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#ifndef APDK_QUICKCONNECT_H
+#define APDK_QUICKCONNECT_H
+
+extern "C"
+{
+#include "jpeglib.h"
+}
+
+APDK_BEGIN_NAMESPACE
+
+/*!
+\internal
+*/
+class QuickConnect : public Printer
+{
+public:
+ QuickConnect (SystemServices* pSS, BOOL proto=FALSE);
+ ~QuickConnect ();
+
+ Header *SelectHeader (PrintContext* pc);
+ DRIVER_ERROR VerifyPenInfo ();
+ DRIVER_ERROR ParsePenInfo (PEN_TYPE& ePen, BOOL QueryPrinter=TRUE);
+ inline virtual BOOL SupportSeparateBlack (PrintMode *pCurrentMode)
+ {
+ return FALSE;
+ }
+
+ virtual BOOL GetMargins (PAPER_SIZE ps, float *fMargins)
+ {
+ fMargins[0] = (float) 0.0;
+ fMargins[1] = (float) 0.0;
+ fMargins[2] = (float) 0.0;
+ fMargins[3] = (float) 0.0;
+ return TRUE;
+ }
+ virtual BOOL FullBleedCapable (PAPER_SIZE ps, FullbleedType *fbType,
+ float *xOverSpray, float *yOverSpray,
+ float *fLeftOverSpray, float *fTopOverSpray)
+ {
+ *xOverSpray = (float) 0.0;
+ *yOverSpray = (float) 0.0;
+ if (fLeftOverSpray)
+ *fLeftOverSpray = (float) 0.0;
+ if (fTopOverSpray)
+ *fTopOverSpray = (float) 0.0;
+ *fbType = fullbleed4EdgeAllMedia;
+ return TRUE;
+ }
+
+ virtual DRIVER_ERROR SetHint (PRINTER_HINT eHint, int iValue);
+ void JpegData (BYTE *buffer, int size);
+ DRIVER_ERROR Encapsulate (const RASTERDATA *InputRaster, BOOL bLastPlane);
+ DRIVER_ERROR Flush (int iBufferSize);
+ PAPER_SIZE MandatoryPaperSize ()
+ {
+ return PHOTO_5x7;
+ }
+
+protected:
+
+#ifdef APDK_HP_UX
+ virtual QuickConnect & operator = (Printer& rhs)
+ {
+ return *this;
+ }
+#endif
+
+private:
+ int MapPaperSize (PAPER_SIZE ePaperSize);
+ int MapMediaType (MEDIATYPE eMediaType);
+ int MapQualityMode (QUALITY_MODE eQualityMode);
+ DRIVER_ERROR AddExifHeader ();
+ DRIVER_ERROR Compress ();
+ PrintContext *m_pPC;
+
+ int m_iPhotoFix;
+ int m_iRemoveRedEye;
+ int m_iBorderless;
+ int m_iMaxFileSize;
+
+ int m_iRowNumber;
+ int m_iRowWidth;
+ int m_iJobId;
+ int m_iJpegBufferPos;
+ int m_iJpegBufferSize;
+ int m_iInputBufferSize;
+ BYTE *m_pbyInputBuffer;
+ BYTE *m_pbyJpegBuffer;
+}; // QuickConnect
+
+
+class QCAutomatic : public PrintMode
+{
+public:
+ QCAutomatic ();
+ inline BOOL MediaCompatible (MEDIATYPE eMedia)
+ {
+ return TRUE;
+ }
+}; // QCAutomatic
+
+
+class QCFastNormal : public PrintMode
+{
+public:
+ QCFastNormal ();
+ inline BOOL MediaCompatible (MEDIATYPE eMedia)
+ {
+ return TRUE;
+ }
+
+}; // QCFastNormal
+
+class QCNormal : public PrintMode
+{
+public:
+ QCNormal ();
+ inline BOOL MediaCompatible (MEDIATYPE eMedia)
+ {
+ return TRUE;
+ }
+
+}; // QCNormal
+
+class QCBest : public PrintMode
+{
+public:
+ QCBest ();
+ inline BOOL MediaCompatible (MEDIATYPE eMedia)
+ {
+ return TRUE;
+ }
+
+}; // QCBest
+
+#ifdef APDK_QUICKCONNECT
+//! QuickConnectProxy
+/*!
+******************************************************************************/
+class QuickConnectProxy : public PrinterProxy
+{
+public:
+ QuickConnectProxy() : PrinterProxy (
+ "QuickConnect", // family name
+ "Photosmart A530\0"
+ "Photosmart A630\0"
+ "Photosmart A640\0"
+ ) {m_iPrinterType = eQuickConnect;}
+ inline Printer* CreatePrinter (SystemServices *pSS) const { return new QuickConnect (pSS); }
+ inline PRINTER_TYPE GetPrinterType () const { return eQuickConnect;}
+ inline unsigned int GetModelBit() const { return 0x10000;}
+};
+#endif
+
+APDK_END_NAMESPACE
+
+#endif //APDK_QUICKCONNECT_H
diff --git a/prnt/hpijs/registry.cpp b/prnt/hpijs/registry.cpp
new file mode 100644
index 0000000..c11edba
--- /dev/null
+++ b/prnt/hpijs/registry.cpp
@@ -0,0 +1,698 @@
+/*****************************************************************************\
+ registry.cpp : Implimentation for the DeviceRegistry class
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+// The purpose of this file is to facilitate addition and subtraction
+// of supported devices from the system.
+
+#include "header.h"
+#include "printerfactory.h"
+
+#include "printer.h"
+#include "apollo2xxx.h"
+#include "apollo21xx.h"
+#include "apollo2560.h"
+#include "apollo2xxx.h"
+#ifdef APDK_DJ3320
+#include "dj3320.h"
+#ifdef APDK_DJ3600
+#include "dj3600.h"
+#include "dj4100.h"
+#include "djd2600.h"
+#endif
+#endif
+#include "dj400.h"
+#include "dj6xx.h"
+#include "dj600.h"
+#include "dj630.h"
+#include "dj660.h"
+#include "dj690.h"
+#include "dj350.h"
+#include "dj540.h"
+#include "dj8xx.h"
+#include "dj850.h"
+#include "dj8x5.h"
+#include "dj890.h"
+#include "dj9xx.h"
+#include "dj9xxvip.h"
+#include "djgenericvip.h"
+#include "dj55xx.h"
+#include "ojprokx50.h"
+#include "ljmono.h"
+#include "ljcolor.h"
+#include "psp100.h"
+#include "psp470.h"
+#include "pscript.h"
+#include "ljjetready.h"
+#include "ljfastraster.h"
+#if defined (APDK_LJZJS_MONO) || defined (APDK_LJZJS_COLOR) || defined (APDK_LJM1005)
+#include "ljzjs.h"
+#endif
+#ifdef APDK_LJZJS_MONO
+#include "ljzjsmono.h"
+#endif
+#ifdef APDK_LJZJS_COLOR
+#include "ljzjscolor.h"
+#endif
+#ifdef APDK_LJM1005
+#include "ljm1005.h"
+#include "ljp1xxx.h"
+#endif
+
+#ifdef APDK_QUICKCONNECT
+#include "quickconnect.h"
+#endif
+
+APDK_BEGIN_NAMESPACE
+
+#ifdef APDK_PSCRIPT
+PScriptProxy DeviceRegistry::s_PScriptProxy;
+#endif
+
+#ifdef APDK_LJMONO
+LJMonoProxy DeviceRegistry::s_LJMonoProxy;
+#endif
+
+#ifdef APDK_LJCOLOR
+LJColorProxy DeviceRegistry::s_LJColorProxy;
+#endif
+
+#ifdef APDK_LJJETREADY
+LJJetReadyProxy DeviceRegistry::s_LJJetReadyProxy;
+#endif
+
+#ifdef APDK_LJFASTRASTER
+LJFastRasterProxy DeviceRegistry::s_LJFastRasterProxy;
+#endif
+
+#ifdef APDK_LJZJS_MONO
+LJZjsMonoProxy DeviceRegistry::s_LJZjsMonoProxy;
+#endif
+
+#ifdef APDK_LJZJS_COLOR
+LJZjsColorProxy DeviceRegistry::s_LJZjsColorProxy;
+#endif
+
+#ifdef APDK_LJM1005
+LJM1005Proxy DeviceRegistry::s_LJM1005Proxy;
+LJP1XXXProxy DeviceRegistry::s_LJP1XXXProxy;
+#endif
+
+#if defined(APDK_PSP100) && defined (APDK_DJ9xxVIP)
+PSP100Proxy DeviceRegistry::s_PSP100Proxy;
+PSP470Proxy DeviceRegistry::s_PSP470Proxy;
+#endif
+
+#if defined(APDK_DJGENERICVIP) && defined (APDK_DJ9xxVIP)
+DJGenericVIPProxy DeviceRegistry::s_DJGenericVIPProxy;
+DJ55xxProxy DeviceRegistry::s_DJ55xxProxy;
+#endif
+
+#ifdef APDK_DJ9xx
+DJ9xxProxy DeviceRegistry::s_DJ9xxProxy;
+#endif
+
+#ifdef APDK_DJ9xxVIP
+DJ9xxVIPProxy DeviceRegistry::s_DJ9xxVIPProxy;
+OJProKx50Proxy DeviceRegistry::s_OJProKx50Proxy;
+#endif
+
+#if defined(APDK_DJ8xx)|| defined(APDK_DJ9xx)
+DJ8xxProxy DeviceRegistry::s_DJ8xxProxy;
+#endif
+
+#if defined(APDK_DJ8xx)|| defined(APDK_DJ9xx)
+#ifdef APDK_DJ8x5
+DJ8x5Proxy DeviceRegistry::s_DJ8x5Proxy;
+#endif
+#endif
+
+#if defined(APDK_DJ890)
+DJ890Proxy DeviceRegistry::s_DJ890Proxy;
+#endif
+
+#if defined(APDK_DJ850)
+DJ850Proxy DeviceRegistry::s_DJ850Proxy;
+#endif
+
+#ifdef APDK_DJ6xxPhoto
+DJ6xxPhotoProxy DeviceRegistry::s_DJ6xxPhotoProxy;
+#endif
+
+#ifdef APDK_DJ6xx
+DJ660Proxy DeviceRegistry::s_DJ660Proxy;
+#endif
+
+#ifdef APDK_DJ630
+DJ630Proxy DeviceRegistry::s_DJ630Proxy;
+#endif
+
+#ifdef APDK_DJ600
+DJ600Proxy DeviceRegistry::s_DJ600Proxy;
+#endif
+
+#ifdef APDK_DJ540
+DJ540Proxy DeviceRegistry::s_DJ540Proxy;
+#endif
+
+#ifdef APDK_DJ400
+DJ400Proxy DeviceRegistry::s_DJ400Proxy;
+#endif
+
+#ifdef APDK_DJ350
+DJ350Proxy DeviceRegistry::s_DJ350Proxy;
+#endif
+
+#if defined(APDK_DJ3600) && defined (APDK_DJ3320)
+DJ3600Proxy DeviceRegistry::s_DJ3600Proxy;
+DJ4100Proxy DeviceRegistry::s_DJ4100Proxy;
+DJD2600Proxy DeviceRegistry::s_DJD2600Proxy;
+#endif
+
+#if defined (APDK_DJ3320)
+DJ3320Proxy DeviceRegistry::s_DJ3320Proxy;
+#endif
+
+#ifdef APDK_APOLLO2560
+Apollo2560Proxy DeviceRegistry::s_Apollo2560Proxy;
+#endif
+
+#ifdef APDK_APOLLO21XX
+Apollo21xxProxy DeviceRegistry::s_Apollo21xxProxy;
+#endif
+
+#ifdef APDK_APOLLO2XXX
+Apollo2xxxProxy DeviceRegistry::s_Apollo2xxxProxy;
+#endif
+
+#ifdef APDK_QUICKCONNECT
+QuickConnectProxy DeviceRegistry::s_QuickConnectProxy;
+#endif
+
+DeviceRegistry::DeviceRegistry()
+ : device(UNSUPPORTED)
+{
+}
+
+
+DeviceRegistry::~DeviceRegistry()
+{
+ DBG1("deleting DeviceRegistry\n");
+}
+
+
+DRIVER_ERROR DeviceRegistry::SelectDevice(const PRINTER_TYPE Model)
+{
+ if (Model > MAX_PRINTER_TYPE)
+ return UNSUPPORTED_PRINTER;
+ device = Model;
+
+ return NO_ERROR;
+}
+
+
+DRIVER_ERROR DeviceRegistry::SelectDevice(char* model, int *pVIPVersion, char* pens, SystemServices* pSS)
+// used by PrintContext constructor
+// based on this 'model' string, we will search for the enum'd value
+// and set this enum'd value in 'device'
+{
+
+#if defined(DEBUG) && (DBG_MASK & DBG_LVL1)
+ printf("DR::SelectDevice: model= '%s'\n",model);
+ printf("DR::SelectDevice: VIPver= %d\n",*pVIPVersion);
+ printf("DR::SelectDevice: pens= '%s'\n",pens);
+#endif
+
+ int j = 0;
+ char pen1 = '\0'; // black/color(for CCM)/photo(for 690) pen
+ char pen2 = '\0'; // color/non-existent(for CCM) pen
+
+ BOOL match=FALSE;
+
+ DRIVER_ERROR err = NO_ERROR;
+
+ FAMILY_HANDLE familyHandle = pPFI->FindDevIdMatch(model);
+ if (familyHandle != NULL)
+ {
+ device = pPFI->GetFamilyType(familyHandle);
+ match = TRUE;
+ }
+
+ if (!match) // see if printer supports VIP, if so set compatible device
+ {
+ if (*pVIPVersion == 1)
+ {
+ match = TRUE;
+ device = eDJ9xxVIP;
+ }
+ else if (*pVIPVersion > 1)
+ {
+ match = TRUE;
+ device = eDJGenericVIP; // eDJ9xxVIP;
+ }
+ }
+
+/*
+ * See if this is a sleek (LIDIL) printer, or PostScript printer
+ */
+
+ if (!match)
+ {
+ BYTE DevIDBuffer[DevIDBuffSize];
+
+ err = pSS->GetDeviceID(DevIDBuffer, DevIDBuffSize, FALSE);
+ ERRCHECK; // should be either NO_ERROR or BAD_DEVICE_ID
+
+ char *cmdStr = (char *) strstr ((const char *) DevIDBuffer+2, "CMD:");
+ char *cmdStrEnd;
+ if ((strstr((const char *) DevIDBuffer+2,"CMD:LDL")))
+ {
+ device = eDJ3320;
+ match = TRUE;
+ }
+ if (!match && cmdStr && (cmdStrEnd = (char *) strstr (cmdStr, ";")))
+ {
+ *cmdStrEnd = '\0';
+ if (strstr (cmdStr, "LDL"))
+ {
+ match = TRUE;
+ device = eDJ4100;
+ }
+ *cmdStrEnd = ';';
+ }
+ if (!match && !cmdStr)
+ {
+ cmdStr = (char *) strstr ((const char *) DevIDBuffer+2, "COMMAND SET:");
+ }
+ if (!match && cmdStr && (strstr ((const char *) cmdStr+4, "POSTSCRIPT") ||
+ strstr ((const char *) cmdStr+4, "PostScript") ||
+ strstr ((const char *) cmdStr+4, "Postscript") ||
+ strstr ((const char *) cmdStr+4, "postscript") ))
+ {
+ device = ePScript;
+ match = TRUE;
+ }
+ }
+
+ if (!match)
+ {
+ // The devID model string did not have a match for a known printer
+ // and the printer doesn't support VIP so let's look at the pen info for clues
+
+ // if we don't have pen info (VSTATUS) it's presumably
+ // either sleek, DJ4xx or non-HP
+ device = UNSUPPORTED;
+ if ( pens[0] != '\0' )
+ {
+ // DJ8xx (and DJ970?) printers return penID $X0$X0
+ // when powered off
+ if(pens[1] == 'X')
+ {
+ DBG1("DR:(Unknown Model) Need to do a POWER ON to get penIDs\n");
+
+ DWORD length=sizeof(DJ895_Power_On);
+ err = pSS->ToDevice(DJ895_Power_On, &length);
+ ERRCHECK;
+
+ err = pSS->FlushIO();
+ ERRCHECK;
+
+ // give the printer some time to power up
+ if (pSS->BusyWait((DWORD)1000) == JOB_CANCELED)
+ return JOB_CANCELED;
+
+ // we must re-query the devID
+ err=GetPrinterModel(model,pVIPVersion,pens,pSS);
+ ERRCHECK;
+ }
+
+ // Arggghh. The pen(s) COULD be missing
+ do
+ {
+
+// Is this binary-encoded format?
+
+ if (pens[0] != '$')
+ {
+ break;
+ }
+
+ // get pen1 - penID format is $HB0$FC0
+ pen1=pens[1];
+
+ // get pen2 - if it exists
+ j=2;
+ BOOL NO_PEN2 = FALSE;
+ while(pens[j] != '$') // handles variable length penIDs
+ {
+ j++;
+ if ( pens[j] == '\0' )
+ // never found a pen2
+ {
+ pen2 = '\0';
+ NO_PEN2 = TRUE;
+ break;
+ }
+ }
+ if (NO_PEN2 == FALSE)
+ {
+ j++;
+ pen2 = pens[j];
+ }
+
+ if(pen1 == 'A' || pen2 == 'A')
+ {
+ if(pen1 == 'A')
+ {
+ // 2-pen printer with both pens missing
+ if(pen2 == 'A')
+ pSS->DisplayPrinterStatus(DISPLAY_NO_PENS);
+
+ // 1-pen printer with missing pen
+ else if(pen2 == '\0')
+ pSS->DisplayPrinterStatus(DISPLAY_NO_PEN_DJ600);
+
+ // may be one-pen DJ8xx derivative
+ else if (pen2 == 'F')
+ {
+ device = eDJ8x5;
+ return NO_ERROR;
+ }
+ // 2-pen printer with BLACK missing
+ else pSS->DisplayPrinterStatus(DISPLAY_NO_BLACK_PEN);
+ }
+ // 2-pen printer with COLOR missing
+ else if(pen2 == 'A')
+ {
+
+// possibly DJ8x5 derivative
+
+ if (pen1 == 'H' || pen1 == 'Z' || pen1 == 'L')
+ {
+ device = eDJ8x5;
+ return NO_ERROR;
+ }
+ pSS->DisplayPrinterStatus(DISPLAY_NO_COLOR_PEN);
+ }
+
+ if (pSS->BusyWait(500) == JOB_CANCELED)
+ return JOB_CANCELED;
+
+ // we must re-query the devID
+ err=GetPrinterModel(model,pVIPVersion,pens,pSS);
+ ERRCHECK;
+ }
+
+ } while(pen1 == 'A' || pen2 == 'A');
+
+ // now that we have pens to look at, let's do the logic
+ // to instantiate the 'best-fit' driver
+
+ if (pen1 == 'H' || pen1 == 'Z' || pen1 == 'L') // (BLACK)
+ {
+ // check for a 850/855/870
+ if (pen2 == 'M')
+ device = eDJ850;
+ else if (strncmp (model,"DESKJET 890",11) == 0)
+ device=eDJ890; // 890 has same pens as DJ895!
+ else if (pen2 == 'N') // (COLOR)
+ device = eDJ9xx;
+ // It must be a DJ8xx derivative or will hopefully at
+ // least recognize a DJ8xx print mode
+ else
+ device = eDJ8xx;
+ }
+ else if(pen1 == 'C') // (BLACK)
+ {
+ // check for 1-pen printer
+ if (pen2 == '\0') device = eDJ600;
+ // must be a 2-pen 6xx-derivative
+ else device = eDJ6xx;
+ }
+ else if(pen1 == 'M') // Multi-dye load
+ {
+ // must be a 690-derivative
+ device = eDJ6xxPhoto;
+ }
+
+ // check for 540-style pens?
+ // D = color, E = black
+
+// else device=UNSUPPORTED;
+ }
+ }
+
+
+ // Early DJ8xx printer do not yet have full bi-di so check
+ // the model to avoid a communication problem.
+ if ( ( (strncmp(model,"DESKJET 81",10) == 0)
+ || (strncmp(model,"DESKJET 83",10) == 0)
+ || (strncmp(model,"DESKJET 88",10) == 0)
+ || (strncmp(model,"DESKJET 895",11) == 0)
+ )
+ && (pSS->IOMode.bUSB)
+ )
+ {
+ DBG1("This printer has limited USB status\n");
+ pSS->IOMode.bStatus = FALSE;
+ pSS->IOMode.bDevID = FALSE;
+ }
+
+ if ( ( (strncmp(model,"DESKJET 63",10) == 0)
+ || (strncmp(model,"DESKJET 64",10) == 0)
+ )
+ && (pSS->IOMode.bUSB)
+ )
+ {
+ DBG1("This printer has limited USB status, but we did get DeviceIDString\n");
+ pSS->IOMode.bStatus = FALSE;
+ }
+
+ if (device == UNSUPPORTED) return UNSUPPORTED_PRINTER;
+ else return NO_ERROR;
+} //SelectDevice
+
+DRIVER_ERROR DeviceRegistry::SelectDevice(const char* sDevID, SystemServices* pSS)
+{
+ char strModel[DevIDBuffSize]; // to contain the MODEL (MDL) from the DevID
+ char strPens[64]; // to contain the VSTATUS penID from the DevID
+ int VIPVersion; // VIP version from the DevID
+
+ DRIVER_ERROR err = ParseDevIDString(sDevID, strModel, &VIPVersion, strPens);
+ if (err != NO_ERROR)
+ {
+ return UNSUPPORTED_PRINTER;
+ }
+
+ return SelectDevice(strModel, &VIPVersion, strPens, pSS);
+}
+
+DRIVER_ERROR DeviceRegistry::InstantiatePrinter(Printer*& p, SystemServices* pSS)
+// Instantiate a printer object and return a pointer p based on the previously
+// set 'device' variable
+{
+ //ASSERT(p == NULL); // if it's not then we're going to loose memory
+
+ FAMILY_HANDLE familyHandle = pPFI->FindDevIdMatch(ModelName[device]);
+ if (familyHandle == NULL)
+ {
+ ASSERT(familyHandle);
+ DBG1("DR::InstantiatePrinter - no family match\n");
+ return UNSUPPORTED_PRINTER;
+ }
+ p = pPFI->CreatePrinter(pSS, familyHandle);
+ NEWCHECK(p);
+ return p->constructor_error;
+} //InstantiatePrinter
+
+
+
+DRIVER_ERROR DeviceRegistry::GetPrinterModel(char* strModel, int *pVIPVersion, char* strPens, SystemServices* pSS)
+{
+ DRIVER_ERROR err;
+ BYTE DevIDBuffer[DevIDBuffSize];
+
+ err = pSS->GetDeviceID(DevIDBuffer, DevIDBuffSize, TRUE);
+ ERRCHECK; // should be either NO_ERROR or BAD_DEVICE_ID
+
+ return ParseDevIDString((const char*)DevIDBuffer, strModel, pVIPVersion, strPens);
+
+} //GetPrinterModel
+
+#define HEXTOINT(x, p) if (x >= '0' && x <= '9') *p |= x - '0'; \
+ else if (x >= 'A' && x <= 'F') *p |= 0xA + x - 'A'; \
+ else if (x >= 'a' && x <= 'f') *p |= 0xA + x - 'a'
+
+
+//ParseDevIDString
+//! Parse a device id string
+/*!
+Enter a full description of the method here. This will be the API doc.
+
+******************************************************************************/
+DRIVER_ERROR DeviceRegistry::ParseDevIDString(const char* sDevID, char* strModel, int *pVIPVersion, char* strPens)
+{
+ int i; // simple counter
+ char* pStr = NULL; // string pointer used in parsing DevID
+
+ // get the model name
+ // - note: I'm setting pStr to the return of strstr
+ // so I need to increment past my search string
+ if ( (pStr = (char *)strstr(sDevID+2,"MODEL:")) )
+ pStr+=6;
+ else
+ if ( (pStr=(char *)strstr(sDevID+2,"MDL:")) )
+ pStr+=4;
+ else return BAD_DEVICE_ID;
+
+ // my own version of strtok to pull out the model string here
+ i = 0;
+ while ( (pStr[i] != ';') && (pStr[i] != '\0') && (i < DevIDBuffSize))
+ {
+ strModel[i] = pStr[i];
+ i++;
+ }
+ strModel[i] = '\0';
+
+
+ // see if this printer support VIP or not
+ if ( (pStr=(char *)strstr(sDevID+2,";S:00")) ) // binary encoded device ID status (version 0)
+ {
+ pStr += 15; // get to the VIP support field (version of 0 == doesn't support VIP)
+ if ((*pStr >= '0') && (*pStr <= '9'))
+ {
+ *pVIPVersion = *pStr - '0';
+ }
+ else if ((*pStr >= 'A') && (*pStr <= 'F'))
+ {
+ *pVIPVersion = 10 + (*pStr - 'A');
+ }
+ else
+ {
+ *pVIPVersion = 0;
+ }
+ }
+
+/*
+ * DevID string has changed starting with Jupiter.
+ * Following ";S:", two nibbles for Version Number
+ * 12 nibbles for Status Information, the last nibble
+ * is reserved for future use, the second from last
+ * indicates whether the printer has VIP support.
+ *
+ * Actually, four nibbles were added.
+ * The first fourteen nibbles contain feature state info.
+ * So, starting with version 02 of device id, following ":S:" there are
+ * 2 nibbles for version number
+ * 14 nibbles for feature state (the 15th nibble from ';' is the vip flag
+ * 2 nibbles for printer status
+ *
+ * Crystal added 4 more nibbles to the option field.
+ */
+
+ else if ((pStr = (char *)strstr (sDevID+2, ";S:")))
+ {
+ *pVIPVersion = 0;
+ HEXTOINT (*(pStr+3), pVIPVersion);
+ *pVIPVersion = *pVIPVersion << 4;
+ HEXTOINT (*(pStr+4), pVIPVersion);
+ if (*(pStr + 15) == '1')
+ {
+ (*pVIPVersion)++;
+ }
+ else
+ {
+ *pVIPVersion = 0;
+ }
+ }
+
+ else
+ {
+ *pVIPVersion = 0;
+ }
+
+ // now get the pen info
+ if( (pStr=(char *)strstr(sDevID+2,"VSTATUS:")) )
+ {
+ pStr+=8;
+ i=0;
+ while ( (pStr[i] != ',') && (pStr[i] != ';') && (pStr[i] != '\0') )
+ {
+ strPens[i] = pStr[i];
+ i++;
+ }
+ strPens[i] = '\0';
+ }
+ else if ( (pStr = (char *)strstr(sDevID + 2, ";S:00")) || // binary encoded device ID status (version 0)
+ (pStr = (char *)strstr (sDevID + 2, ";S:"))) // Jupiter and later style
+ {
+
+ int iVersion = 0;
+ HEXTOINT (*(pStr+3), &iVersion);
+ iVersion = iVersion << 4;
+ HEXTOINT (*(pStr+4), &iVersion);
+ if (iVersion <= 2)
+ {
+ pStr += 19; // get to the number of pens field
+ }
+ else if (iVersion < 4)
+ {
+ pStr += 21;
+ }
+ else
+ {
+ pStr += 25;
+ }
+
+ // each supported pen has a block of 8 bytes of info so copy the number of pens byte
+ // plus 8 bytes for each supported ped
+ if ((*pStr >= '0') && (*pStr <= '9'))
+ {
+ i = 1 + ((*pStr-'0')*8);
+ }
+ else if ((*pStr >= 'A') && (*pStr <= 'F'))
+ {
+ i = 1 + ((10 + (*pStr-'A')) * 8);
+ }
+ else
+ { // bogus number of pens field
+ i = 1;
+ }
+ memcpy(strPens, pStr, i);
+ strPens[i] = '\0';
+ }
+ else // no VSTATUS for 400 and sleek printers
+ strPens[0] = '\0';
+
+ return NO_ERROR;
+} //ParseDevIDString
+
+APDK_END_NAMESPACE
+
diff --git a/prnt/hpijs/resources.h b/prnt/hpijs/resources.h
new file mode 100644
index 0000000..c40bf63
--- /dev/null
+++ b/prnt/hpijs/resources.h
@@ -0,0 +1,56 @@
+/*****************************************************************************\
+ resources.h : externs for open source imaging
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#include "config.h"
+
+APDK_BEGIN_NAMESPACE
+
+extern const unsigned char HTBinary_open[1024];
+extern const unsigned char HT300x3004level_open[1024];
+extern const unsigned char HT600x6004level895_open[1024];
+
+extern const unsigned char HTBinary_prop[1024];
+extern const unsigned char HT300x3004level_prop[1024];
+extern const unsigned char HT600x6004level895_prop[1024];
+
+extern const unsigned char HT600x6004level970_open[1024];
+extern const unsigned char HT600x6004level970_prop[1024];
+
+extern const unsigned char HT600x6004level3600_open[1024];
+
+// 2001.07.09 mrb: Added for presentation and photo glossy mode of DJ970
+extern const unsigned char HT1200x1200x1_PhotoPres970_open[1024];
+extern const unsigned char HT600x600x4_Pres970_open[1024];
+
+extern const unsigned char HT300x3004level970_open[1024];
+extern const unsigned char HT1200x1200x1PhotoBest_open[];
+
+APDK_END_NAMESPACE
diff --git a/prnt/hpijs/scaler.cpp b/prnt/hpijs/scaler.cpp
new file mode 100644
index 0000000..9b272f1
--- /dev/null
+++ b/prnt/hpijs/scaler.cpp
@@ -0,0 +1,159 @@
+/*****************************************************************************\
+ scaler.cpp : Implimentation for the Scaler class
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+#include "header.h"
+
+APDK_BEGIN_NAMESPACE
+
+#define MAX_OUTPUT_RASTERS 32
+
+
+Scaler::Scaler(SystemServices* pSys,unsigned int inputwidth,
+ unsigned int numerator,unsigned int denominator, BOOL vip, unsigned int BytesPerPixel)
+ : pSS(pSys), iInputWidth(inputwidth)
+{
+
+ ASSERT(denominator > 0);
+
+ constructor_error=NO_ERROR;
+ for (int i = COLORTYPE_COLOR; i < MAX_COLORTYPE; i++)
+ {
+ pOutputBuffer[i] = NULL;
+ }
+
+ ScaleFactor= (float)numerator / (float)denominator;
+ if (ScaleFactor > (float)MAX_OUTPUT_RASTERS) //
+ {
+ constructor_error = INDEX_OUT_OF_RANGE;
+ return;
+ }
+ int factor = (int)ScaleFactor;
+ float rem = ScaleFactor - (float)factor;
+ rem *= 1000;
+ remainder = (int)rem;
+
+ iOutputWidth = (int) (((float) iInputWidth / (float) denominator) *
+ (float) numerator);
+ iOutputWidth++; // safety measure to protect against roundoff error
+
+ if (numerator == denominator)
+ scaling=FALSE;
+ else scaling=TRUE;
+
+
+ // ScaleBound=max number of output rows per input row;
+ // i.e., if scale=4.28, then sometimes 5 rows will come out
+
+ int ScaleBound = int(ScaleFactor);
+ if (ScaleFactor > (float) ScaleBound)
+ ScaleBound++;
+
+ // allocate a buffer for one output row
+ int RSBuffSize= (int)(((float)(BytesPerPixel*iOutputWidth)) * ScaleBound );
+ pOutputBuffer[COLORTYPE_COLOR]=(BYTE*)pSS->AllocMem(RSBuffSize);
+ if (pOutputBuffer[COLORTYPE_COLOR] == NULL)
+ {
+ constructor_error=ALLOCMEM_ERROR;
+ return;
+ }
+
+// Initialize RGB buffer to white
+ if (vip)
+ {
+ memset(pOutputBuffer[COLORTYPE_COLOR], 0xFF, RSBuffSize);
+ }
+
+ int BlackBuffSize= (int)(((float)(iOutputWidth)) * ScaleBound );
+ pOutputBuffer[COLORTYPE_BLACK]=(BYTE*)pSS->AllocMem(BlackBuffSize);
+ if (pOutputBuffer[COLORTYPE_BLACK] == NULL)
+ {
+ constructor_error=ALLOCMEM_ERROR;
+ return;
+ }
+
+ if (ScaleFactor < 2.0)
+ ReplicateOnly = TRUE;
+ else ReplicateOnly=FALSE;
+
+ if (ScaleFactor > (float)factor)
+ fractional=TRUE;
+ else fractional=FALSE;
+}
+
+Scaler::~Scaler()
+{
+ for (int i = COLORTYPE_COLOR; i < MAX_COLORTYPE; i++)
+ {
+ if (pOutputBuffer[i])
+ {
+ pSS->FreeMemory(pOutputBuffer[i]);
+ pOutputBuffer[i] = NULL;
+ }
+ }
+}
+
+unsigned int Scaler::GetMaxOutputWidth(COLORTYPE rastercolor)
+{
+ if (rastercolor == COLORTYPE_COLOR)
+ {
+ return (iOutputWidth-1)*NUMBER_PLANES; // we padded it in case of roundoff error
+ }
+ else
+ {
+ return (iOutputWidth-1); // we padded it in case of roundoff error
+ }
+}
+
+unsigned int Scaler::GetOutputWidth(COLORTYPE color)
+{
+ if (color == COLORTYPE_COLOR)
+ {
+ if (raster.rasterdata[color])
+ if (myplane == COLORTYPE_BLACK)
+ return raster.rastersize[color];
+ else
+ return (iOutputWidth-1)*NUMBER_PLANES; // we padded it in case of roundoff error
+ else
+ return 0;
+ }
+ else
+ {
+ if (raster.rasterdata[color])
+ if (myplane == COLORTYPE_COLOR)
+ return raster.rastersize[color];
+ else
+ return (iOutputWidth-1); // we padded it in case of roundoff error
+ else
+ return 0;
+ }
+}
+
+APDK_END_NAMESPACE
+
diff --git a/prnt/hpijs/scaler_open.cpp b/prnt/hpijs/scaler_open.cpp
new file mode 100644
index 0000000..2e2b7e4
--- /dev/null
+++ b/prnt/hpijs/scaler_open.cpp
@@ -0,0 +1,229 @@
+/*****************************************************************************\
+ scaler_open.cpp : Implimentation for the Scaler_Open class
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+#include "header.h"
+#include "scaler_open.h"
+
+
+APDK_BEGIN_NAMESPACE
+
+Scaler_Open::Scaler_Open(SystemServices* pSys,int inputwidth,
+ int numerator,int denominator,
+ BOOL bVIP, unsigned int iNumInks)
+ : Scaler(pSys,inputwidth,numerator,denominator,bVIP, iNumInks),
+ NumInks(iNumInks), vip(bVIP)
+{
+ rowremainder = remainder;
+}
+
+Scaler_Open::~Scaler_Open()
+{ }
+
+BOOL Scaler_Open::Process(RASTERDATA* raster_in)
+{
+ iRastersDelivered=0;
+
+ if (raster_in == NULL || (raster_in->rasterdata[COLORTYPE_COLOR] == NULL && raster_in->rasterdata[COLORTYPE_BLACK] == NULL))
+ {
+ rowremainder=remainder;
+ return FALSE;
+ }
+
+ if (!scaling)
+ {
+ // just copy both to output buffer
+ for (int i = COLORTYPE_COLOR; i < MAX_COLORTYPE; i++)
+ {
+ if (raster_in->rasterdata[i])
+ {
+ memcpy(pOutputBuffer[i], raster_in->rasterdata[i], raster_in->rastersize[i]);
+ }
+ }
+ iRastersReady = 1;
+ return TRUE;
+ }
+
+ if (myplane == COLORTYPE_COLOR)
+ {
+ if (raster_in->rasterdata[COLORTYPE_BLACK])
+ {
+ memcpy(pOutputBuffer[COLORTYPE_BLACK], raster_in->rasterdata[COLORTYPE_BLACK], raster_in->rastersize[COLORTYPE_BLACK]);
+ }
+ }
+
+ if (myplane == COLORTYPE_BLACK)
+ {
+ if (raster_in->rasterdata[COLORTYPE_COLOR])
+ {
+ memcpy(pOutputBuffer[COLORTYPE_COLOR], raster_in->rasterdata[COLORTYPE_COLOR], raster_in->rastersize[COLORTYPE_COLOR]);
+ }
+ }
+
+ // multiply row
+ unsigned int ifactor = (unsigned int) (int) ScaleFactor;
+ unsigned int targptr=0;
+ unsigned int sourceptr=0;
+ unsigned int rem = remainder;
+
+ if (myplane == COLORTYPE_COLOR || myplane == COLORTYPE_BOTH)
+ {
+ if (raster_in->rasterdata[COLORTYPE_COLOR])
+ {
+ if (vip) // RGB values interleaved
+ {
+ unsigned int width = iInputWidth*3;
+ for (unsigned int i=0; i < width; i += 3)
+ {
+ unsigned int factor = ifactor;
+ if (rem >= 1000)
+ {
+ factor++;
+ rem -= 1000;
+ }
+ for (unsigned int j=0; j < factor; j++)
+ {
+ pOutputBuffer[COLORTYPE_COLOR][targptr++] = raster_in->rasterdata[COLORTYPE_COLOR][i];
+ pOutputBuffer[COLORTYPE_COLOR][targptr++] = raster_in->rasterdata[COLORTYPE_COLOR][i+1];
+ pOutputBuffer[COLORTYPE_COLOR][targptr++] = raster_in->rasterdata[COLORTYPE_COLOR][i+2];
+ }
+ rem += remainder;
+ }
+ }
+ else // KCMY values NOT interleaved
+ // iInputWidth = bytes per plane
+ for (unsigned int i=0; i < NumInks; i++) // loop over planes
+ {
+ unsigned int planecount=0; // count output bytes for this plane
+ unsigned int src=0; // count input bytes for this plane
+ while ((planecount < iOutputWidth-1) && (src < iInputWidth))
+ {
+ unsigned int factor = ifactor;
+ if (rem >= 1000)
+ {
+ factor++;
+ rem -= 1000;
+ }
+ for (unsigned int j=0; (j < factor) && (planecount < iOutputWidth-1); j++)
+ {
+ pOutputBuffer[COLORTYPE_COLOR][targptr++] = raster_in->rasterdata[COLORTYPE_COLOR][sourceptr];
+ planecount++;
+ }
+ rem += remainder;
+ sourceptr++; src++;
+ }
+ while (planecount < iOutputWidth-1) // fill out odd bytes so all planes are equal
+ {
+ pOutputBuffer[COLORTYPE_COLOR][targptr++] = raster_in->rasterdata[COLORTYPE_COLOR][sourceptr-1];
+ planecount++;
+ }
+
+ }
+ }
+ }
+
+ ifactor = (unsigned int) (int) ScaleFactor;
+ targptr=0;
+ sourceptr=0;
+ rem = remainder;
+
+ if (myplane == COLORTYPE_BLACK || myplane == COLORTYPE_BOTH)
+ {
+ if (raster_in->rasterdata[COLORTYPE_BLACK])
+ {
+ // K values NOT interleaved
+ // iInputWidth = bytes per plane
+ unsigned int planecount=0; // count output bytes for this plane
+ unsigned int src=0; // count input bytes for this plane
+ while ((planecount < iOutputWidth-1) && (src < iInputWidth))
+ {
+ unsigned int factor = ifactor;
+ if (rem >= 1000)
+ {
+ factor++;
+ rem -= 1000;
+ }
+ for (unsigned int j=0; (j < factor) && (planecount < iOutputWidth-1); j++)
+ {
+ pOutputBuffer[COLORTYPE_BLACK][targptr++] = raster_in->rasterdata[COLORTYPE_BLACK][sourceptr];
+ planecount++;
+ }
+ rem += remainder;
+ sourceptr++; src++;
+ }
+ while (planecount < iOutputWidth-1) // fill out odd bytes so all planes are equal
+ {
+ pOutputBuffer[COLORTYPE_BLACK][targptr++] = raster_in->rasterdata[COLORTYPE_BLACK][sourceptr-1];
+ planecount++;
+ }
+ }
+ }
+
+ unsigned int factor = ifactor;
+ if (rowremainder >= 1000)
+ {
+ factor++;
+ rowremainder -= 1000;
+ }
+ if (myplane == COLORTYPE_BLACK && raster_in->rasterdata[COLORTYPE_COLOR])
+ iRastersReady = 1;
+ else
+ iRastersReady=factor;
+ iRastersDelivered=0;
+ rowremainder += remainder;
+ return TRUE;
+}
+
+
+BYTE* Scaler_Open::NextOutputRaster(COLORTYPE color)
+{
+ if (iRastersReady==0)
+ return NULL;
+
+ if (myplane == COLORTYPE_BLACK)
+ {
+ if (raster.rasterdata[myplane] == NULL)
+ iRastersReady = 1;
+ }
+ if (color == COLORTYPE_COLOR)
+ {
+ iRastersReady--; iRastersDelivered++;
+ }
+ if (raster.rastersize[color] > 0)
+ {
+ return pOutputBuffer[color];
+ }
+ else
+ {
+ return NULL;
+ }
+}
+
+APDK_END_NAMESPACE
+
diff --git a/prnt/hpijs/scaler_open.h b/prnt/hpijs/scaler_open.h
new file mode 100644
index 0000000..be7e9b8
--- /dev/null
+++ b/prnt/hpijs/scaler_open.h
@@ -0,0 +1,60 @@
+/*****************************************************************************\
+ scaler_open.h : Interface for the Scaler_Open class
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#ifndef APDK_SCALER_OPEN_H
+#define APDK_SCALER_OPEN_H
+
+APDK_BEGIN_NAMESPACE
+
+//Scaler_Open
+/*
+******************************************************************************/
+class Scaler_Open : public Scaler
+{
+public:
+ Scaler_Open(SystemServices* pSys,int inputwidth,
+ int numerator,int denominator,
+ BOOL bVIP, unsigned int iNumInks);
+ ~Scaler_Open();
+
+ BYTE* NextOutputRaster(COLORTYPE color);
+
+protected:
+ BOOL Process(RASTERDATA* InputRaster=NULL);
+ unsigned int rowremainder;
+ unsigned int NumInks;
+ BOOL vip;
+
+};
+
+APDK_END_NAMESPACE
+
+#endif //APDK_SCALER_OPEN_H
diff --git a/prnt/hpijs/scaler_prop.h b/prnt/hpijs/scaler_prop.h
new file mode 100644
index 0000000..814ff24
--- /dev/null
+++ b/prnt/hpijs/scaler_prop.h
@@ -0,0 +1,61 @@
+/*****************************************************************************\
+ scaler_prop.h : Interface for the Scaler_Prop class
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#ifndef APDK_SCALER_PROP_H
+#define APDK_SCALER_PROP_H
+
+APDK_BEGIN_NAMESPACE
+
+class Scaler_Prop : public Scaler
+{
+public:
+ Scaler_Prop(SystemServices* pSys,int inputwidth,
+ int numerator,int denominator);
+ ~Scaler_Prop();
+ BOOL Process(RASTERDATA* InputRaster=NULL);
+ BYTE* NextOutputRaster(COLORTYPE color);
+protected:
+ RESSYNSTRUCT* pRSstruct;
+ void Pixel_ReplicateF(int color, int h_offset, int v_offset,
+ unsigned char **out_raster, int plane);
+ void PixelMultiply(unsigned char* buffer, unsigned int width, unsigned int factor);
+
+ void rez_synth(RESSYNSTRUCT *ResSynStruct, unsigned char *raster_out);
+ void InitInternals();
+
+ unsigned int ResSyn(const unsigned char *raster_in);
+ int create_out(BOOL simple);
+ unsigned char flag;
+};
+
+APDK_END_NAMESPACE
+
+#endif //APDK_SCALER_PROP_H
diff --git a/prnt/hpijs/script.cpp b/prnt/hpijs/script.cpp
new file mode 100644
index 0000000..df7e39e
--- /dev/null
+++ b/prnt/hpijs/script.cpp
@@ -0,0 +1,830 @@
+/*****************************************************************************\
+ script.cpp : Implimentation for scripting
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+#if defined(APDK_CAPTURE)
+
+#include "header.h"
+#include "script.h"
+
+APDK_BEGIN_NAMESPACE
+
+extern char* Version(int bCompressed);
+
+Scripter::Scripter(SystemServices* pSS):
+ pSys(pSS),
+ GlobalBuffer(NULL),
+ buffsize(0)
+{ }
+
+
+Scripter::~Scripter()
+{ }
+
+
+AsciiScripter::AsciiScripter(SystemServices* pSS)
+: Scripter(pSS)
+{ }
+
+
+AsciiScripter::~AsciiScripter()
+{ }
+
+
+BinaryScripter::BinaryScripter(SystemServices* pSS)
+: AsciiScripter(pSS)
+{ }
+
+
+BinaryScripter::~BinaryScripter()
+{ }
+
+
+DRIVER_ERROR SystemServices::InitScript(const char* FileName, BOOL ascii, BOOL read)
+{
+ if (ascii)
+ pScripter = new AsciiScripter(this);
+ else pScripter = new BinaryScripter(this);
+
+ if (read)
+ {
+ replay=TRUE;
+ if (pScripter->OpenDebugStreamR(FileName))
+ return SYSTEM_ERROR;
+ else return NO_ERROR;
+ }
+ else
+ {
+ replay=FALSE;
+ if (pScripter->OpenDebugStreamW(FileName))
+ return SYSTEM_ERROR;
+ else return NO_ERROR;
+ }
+
+}
+
+DRIVER_ERROR SystemServices::EndScript()
+{
+ if (pScripter==NULL)
+ return SYSTEM_ERROR;
+
+ if (replay)
+ {
+ if (pScripter->CloseDebugStreamR())
+ return SYSTEM_ERROR;
+ else return NO_ERROR;
+ }
+ else
+ {
+ if (pScripter->CloseDebugStreamW())
+ return SYSTEM_ERROR;
+ else return NO_ERROR;
+ }
+
+ delete pScripter;
+}
+
+
+BOOL Scripter::ParseVer(char* str)
+// set argProprietary
+{
+// example:
+//"[platform-specific information]!!002.001_09-12-00 propscale openimg debug little_endian fonts:CTLU DJ400 DJ540 DJ600 DJ6xx DJ6xxPhoto DJ8xx DJ9xx Aladdin DJ630 eprinter"
+
+ char c;
+ char ver[5];
+ int i=0;
+ c=str[i];
+ while ((c!='!') && (c!=EOF))
+ c=str[++i];
+ if (c!='!')
+ return TRUE;
+ while ((c!=' ') && (c!=EOF))
+ c=str[++i];
+ if (c!=' ')
+ return TRUE;
+
+ for (int j=0; j<4; j++)
+ ver[j]=str[++i];
+ ver[4]='\0';
+
+ if (!strcmp(ver,"open")) // old style
+ ;
+ else if (!strcmp(ver,"prop")) // old style
+ ;
+ // new style
+ else
+ {
+ if (!strcmp(ver,"openscale"))
+ ;
+ else if (!strcmp(ver,"propscale"))
+ ;
+ else return TRUE;
+ if (!strcmp(ver,"openimg"))
+ ;
+ else if (!strcmp(ver,"propimg"))
+ ;
+ else return TRUE;
+ }
+ return FALSE;
+}
+
+BOOL AsciiScripter::OpenDebugStreamR(const char* FileName)
+{
+ int x;
+ char *str;
+
+ strncpy(ScriptFileName,FileName, sizeof(ScriptFileName)-1);
+
+ ScriptFile = fopen(ScriptFileName, "ra");
+
+ if (ScriptFile == NULL)
+ return TRUE;
+
+ char c=fgetc(ScriptFile);
+ fseek(ScriptFile,0, 0);
+
+ if (c==' ') // spaces were never overwritten with tokencount
+ {
+ x = 2000; // arbitrary guess
+
+ }
+ else if (GetDebugInt(x))
+ return TRUE;
+
+ TokenCount=x;
+ ReplayTokenCount=0;
+ fontcount=0;
+
+ if (GetDebugString(str,x)) // get $Version
+ return TRUE;
+
+ if (ParseVer(str))
+ return TRUE;
+
+ return FALSE;
+}
+
+
+BOOL AsciiScripter::CloseDebugStreamR()
+{
+ if (GlobalBuffer != NULL)
+ pSys->FreeMem((BYTE*)GlobalBuffer,FALSE);
+
+ if (ScriptFile==NULL)
+ return TRUE;
+ return fclose(ScriptFile);
+}
+
+
+BOOL AsciiScripter::OpenDebugStreamW(const char* FileName)
+{
+ strncpy(ScriptFileName,FileName, sizeof(ScriptFileName)-1);
+ ScriptFile = fopen(ScriptFileName, "wa");
+
+ if (ScriptFile == NULL)
+ return TRUE;
+
+ pSys->Capturing=TRUE;
+ TokenCount=0;
+ fontcount=0;
+
+ // set up debugging token strings
+ strcpy(TokString[0],"Job constructor");
+ strcpy(TokString[1],"Job destructor");
+ strcpy(TokString[2],"NewPage");
+ strcpy(TokString[3],"SendRasters");
+ strcpy(TokString[4],"TextOut");
+ strcpy(TokString[5],"UNUSED1");
+ strcpy(TokString[6],"Font destructor");
+ strcpy(TokString[7],"PrintContext constructor");
+ strcpy(TokString[8],"PrintContext destructor");
+ strcpy(TokString[9],"SetPixelsPerRow");
+ strcpy(TokString[10],"RealizeFont");
+ strcpy(TokString[11],"SelectDevice");
+ strcpy(TokString[12],"SelectPrintMode");
+ strcpy(TokString[13],"SetPaperSize");
+ strcpy(TokString[14],"UseBlackOnly");
+ strcpy(TokString[15],"UseColor");
+ strcpy(TokString[16],"SetInputResolution");
+ strcpy(TokString[17],"UNUSED");
+ strcpy(TokString[18],"UNUSED");
+ strcpy(TokString[19],"UNUSED");
+ strcpy(TokString[20],"String");
+ strcpy(TokString[21],"RLE stream");
+ strcpy(TokString[22],"RAW stream");
+ strcpy(TokString[23],"stream token");
+ strcpy(TokString[24],"NULL token");
+
+ for (int i=0; i<25; i++)
+ TokCount[i]=0;
+
+ fprintf(ScriptFile," ");
+
+ char version[TEMPLEN];
+ sprintf(version, Version(FALSE) );
+ int len = strlen(version);
+
+ if (PutDebugString(version, len))
+ return TRUE;
+
+
+ return FALSE;
+}
+
+BOOL AsciiScripter::CloseDebugStreamW()
+{
+ if (ScriptFile==NULL)
+ return TRUE;
+
+ if (GlobalBuffer != NULL)
+ pSys->FreeMem((BYTE*)GlobalBuffer,FALSE);
+
+ fseek(ScriptFile,0, 0);
+ PutDebugInt(TokenCount);
+
+ pSys->Capturing=FALSE;
+
+
+ return fclose(ScriptFile);
+}
+
+
+BOOL AsciiScripter::PutDebugToken(const int token)
+{
+ TokenCount++;
+ TokCount[token] = TokCount[token]+1;
+
+ int res=fprintf(ScriptFile,"%%%0x ",token);
+ if (res<1)
+ return TRUE;
+
+ res=fprintf(ScriptFile,"\n%s:%d\n",TokString[token], TokCount[token]);
+
+ return (res < 1); // bad if res<1
+}
+
+
+BOOL AsciiScripter::PutDebugInt(const int data)
+{
+ int res=fprintf(ScriptFile,"%%%0x ",data);
+ return (res < 1); // bad if res<1
+}
+
+
+BOOL AsciiScripter::PutDebugByte(const BYTE data)
+{ return PutDebugInt(data); }
+
+
+BOOL AsciiScripter::PutDebugString(const char* str,const int len)
+{
+ if (PutDebugToken(tokCharPtr))
+ return TRUE;
+ if (PutDebugInt(len))
+ return TRUE;
+
+ fputc('"',ScriptFile);
+ for (int i=0; i < len; i++)
+ fprintf(ScriptFile,"%c",str[i]);
+ fputc('"',ScriptFile);
+
+return FALSE;
+}
+
+
+BOOL AsciiScripter::PutDebugStream(const BYTE* str,const int len)
+{
+// Does modified run-length-encoding from stream.
+// len=length of raw stream
+ int total=1; short count,i,j; BYTE current,next,last;
+ BOOL rle=TRUE;
+ short chunkarray[3];
+
+ if ((len==0) || (str==NULL))
+ {
+ PutDebugToken(tokRawStream);
+ fprintf(ScriptFile,"%%%0x ", len);
+ return FALSE;
+ }
+
+ next=0; // suppress stupid compiler warning
+ int alloclen= len*2; // in worst case each byte produces [count=1][byte]
+ if (buffsize < alloclen)
+ {
+ if (GlobalBuffer!=NULL)
+ pSys->FreeMem((BYTE*)GlobalBuffer,FALSE);
+ GlobalBuffer = (short*)pSys->AllocMem(alloclen,FALSE);
+ buffsize=alloclen;
+ }
+
+ short* buff = GlobalBuffer;
+
+ short *thebuff=buff;
+ if (buff==NULL)
+ return TRUE;
+ const BYTE *startstream=str;
+
+ for (i=0;i<3;i++) // go through 3 times, for r,g,b
+ {
+ short* startbuff=buff;
+ const BYTE* stream=startstream+i;
+ total=1;
+ current = *stream; stream+=3;
+ while (total<(len/3))
+ {
+ count=1;
+ while ((total<(len/3)) && (current == (next= *stream)) )
+ { count++; total++; stream+=3; }
+ if (total<(len/3))
+ { next= *stream; stream+=3; total++; }
+ buff[0]=count; buff[1]=current;
+ buff+=2;
+ last=current;
+ current=next;
+ }
+ // get last item if it is a single
+ if (current != last)
+ {
+ buff[0]=count; buff[1]=current;
+ buff+=2;
+ }
+
+ int chunks=(buff-startbuff)/2;
+ if (chunks>(len/6))
+ { rle=FALSE; break; }
+ else chunkarray[i]=chunks;
+ }
+
+ if (!rle)
+ {
+ PutDebugToken(tokRawStream);
+ fprintf(ScriptFile,"%%%0x ", len);
+ for (i=0;i<len;i++)
+ fprintf(ScriptFile,"%%%0x ",startstream[i]);
+
+ }
+ else
+ { total=0;
+ PutDebugToken(tokRLEstream);
+ fprintf(ScriptFile,"%%%0x ",len);
+ for (i=0;i<3;i++)
+ { count=chunkarray[i];
+ for (j=0;j<count;j++)
+ fprintf(ScriptFile,"%%%0x %%%0x ",thebuff[total+2*j],thebuff[total+2*j+1]);
+ total += count*2;
+ }
+ }
+
+return FALSE;
+}
+
+
+///////////////////////////////////////////////////////////////////
+BOOL AsciiScripter::FindPercent()
+// find our token '%'
+// return TRUE iff EOF
+{
+ char c;
+ c=fgetc(ScriptFile);
+ while ((c!='%') && (c!=EOF))
+ {
+ c=fgetc(ScriptFile);
+ }
+ return (c==EOF);
+}
+
+
+char* AsciiScripter::digits()
+// includes filtering of CR/LF's
+{
+ char c;
+ char *str=scanner;
+ BOOL done=FALSE;
+
+ while (!done)
+ {
+ c=fgetc(ScriptFile);
+ if (((c>='0')&&(c<='9')) ||
+ ((c>='a')&&(c<='f')) ||
+ ((c>='A')&&(c<='F'))
+ )
+ *str++ = c;
+ else if (c==' ')
+ { done=TRUE; *str++=c; }
+ else if ((c!=10)&&(c!=13))
+ { scanner[0]=0; done=TRUE; }
+ }
+ *str=0;
+ return scanner;
+}
+
+
+
+void AsciiScripter::ReadRLE(int instreamlen, BYTE* outstream)
+// Does run-length-decoding from stream.
+{
+ int count,total,i,j;
+ BYTE b;
+ int bi;
+ BYTE* buff=(BYTE*)pSys->AllocMem(instreamlen*2,FALSE);
+ int colorsize=instreamlen/3;
+
+ // first fill up 3-part buffer with all reds,then all greens, all blues
+
+ for (i=0;i<3;i++) // for each color
+ { total=0;
+ while (total<colorsize)
+ // assumes correct input, so that total count=instreamlen/3
+ {
+ if (FindPercent())
+ break;
+ sscanf(digits(),"%x ",&count);
+ if (FindPercent())
+ break;
+ sscanf(digits(),"%x ",&bi);
+ b= (BYTE)bi;
+ for (j=0;j<count;j++)
+ buff[ total + (i*colorsize) + j ] = b;
+ total+=count;
+ }
+ }
+
+ // now interleave
+
+ for (i=0;i<(instreamlen/3);i++)
+ {
+ *outstream++ = buff[i];
+ *outstream++ = buff[i+colorsize];
+ *outstream++ = buff[i+(2*colorsize)];
+ }
+ pSys->FreeMem(buff,FALSE);
+}
+
+
+void AsciiScripter::ReadRaw(int instreamlen, BYTE* outstream)
+{
+ BYTE b; int bi;
+ for (int i=0;i<instreamlen;i++)
+ { if (FindPercent())
+ break;
+ sscanf(digits(),"%x ",&bi);
+ b=(BYTE)bi;
+ *outstream++ = b; }
+}
+
+
+///////////////////////////////////////////////////////////////////
+BOOL AsciiScripter::GetDebugToken(int& token)
+{
+ char c;
+
+ if (GetDebugInt(token))
+ return TRUE;
+ if ((token<0)||(token>LAST_TOKEN))
+ return TRUE;
+
+ // now expect LF<string>LF
+ c=fgetc(ScriptFile);
+ if (c!=10)
+ return TRUE;
+
+ while ( (c=fgetc(ScriptFile))!=10) ;
+ // successfully ate debug string
+
+ ReplayTokenCount++;
+
+ return FALSE;
+}
+
+
+BOOL AsciiScripter::GetDebugInt(int& data)
+{ int res,k;
+
+ if (FindPercent())
+ { data=-1; return TRUE; }
+
+ res = sscanf(digits(),"%x ",&k);
+ if (!res)
+ data = -1;
+ else data=k;
+ return FALSE;
+}
+
+
+BOOL AsciiScripter::GetDebugByte(BYTE& data)
+{
+ int temp;
+ BOOL res=GetDebugInt(temp);
+ if (res)
+ return TRUE;
+ data=temp;
+ return FALSE;
+}
+
+
+BOOL AsciiScripter::GetDebugString(char*& str,int& length)
+{
+ int res,len,i;
+ str=NULL; // in case of err rtn
+
+ for (i=0; i<TEMPLEN; i++)
+ tempStr[i]=0;
+
+ GetDebugInt(res); // look for tokCharPtr
+ if (res != tokCharPtr)
+ return TRUE;
+ GetDebugInt(len); // get length
+
+ if (len >= TEMPLEN)
+ return TRUE;
+
+ char c=fgetc(ScriptFile);
+ if (c!='"')
+ return TRUE;
+ i=0;
+ tempStr[i]=fgetc(ScriptFile);
+ while ((i<TEMPLEN) && (tempStr[i] != '"'))
+ tempStr[++i]=fgetc(ScriptFile);
+
+ if ((i==TEMPLEN) || (i!=len))
+ return TRUE;
+
+ tempStr[i]=0;
+ str=tempStr;
+ length=len;
+
+ return FALSE;
+}
+
+
+BOOL AsciiScripter::GetDebugStream(const unsigned int buffersize, BYTE*& buffer)
+{
+ BYTE tok;
+ int token;
+
+ GetDebugToken(token);
+ if (token == tokStream)
+ {
+ buffer = (BYTE*)pSys->AllocMem(buffersize,FALSE);
+ if (buffer==NULL)
+ return TRUE;
+ int len;
+
+ GetDebugInt(len);
+ if (len==0)
+ return FALSE;
+ if (((unsigned int)len) != buffersize)
+ return TRUE;
+
+ for (int i=0; i < len; i++)
+ {
+ GetDebugByte(tok);
+ buffer[i] = tok;
+ }
+ }
+ else if ((token == tokRLEstream) || (token == tokRawStream))
+ {
+ int len;
+
+ GetDebugInt(len);
+ if (len==0)
+ buffer=NULL;
+ else
+ {
+ buffer = (BYTE*)pSys->AllocMem(len,FALSE);
+ if (token == tokRLEstream)
+ ReadRLE(len, buffer);
+ else ReadRaw(len, buffer);
+ }
+ }
+ else return TRUE;
+
+ return FALSE;
+}
+
+
+/////////////////////////////////////////////////////////////////////
+BOOL BinaryScripter::OpenDebugStreamR(const char* FileName)
+{
+ strncpy(ScriptFileName,FileName, sizeof(ScriptFileName)-1);
+
+ ScriptFile = fopen(ScriptFileName, "rb");
+
+ if (ScriptFile == NULL)
+ return TRUE;
+
+ int x;
+ if (GetDebugInt(x))
+ return TRUE;
+ TokenCount=x;
+ ReplayTokenCount=0;
+ fontcount=0;
+
+ char *ver;
+ if (GetDebugString(ver,x))
+ return TRUE;
+
+ if (ParseVer(ver))
+ return TRUE;
+
+ return FALSE;
+}
+
+
+BOOL BinaryScripter::OpenDebugStreamW(const char* FileName)
+{
+ strncpy(ScriptFileName,FileName, sizeof(ScriptFileName)-1);
+ ScriptFile = fopen(ScriptFileName, "wb");
+
+ if (ScriptFile == NULL)
+ return TRUE;
+
+ pSys->Capturing=TRUE;
+ TokenCount=0;
+ fontcount=0;
+
+ PutDebugInt(-1); // leave space for token count
+
+ char version[TEMPLEN];
+ sprintf(version, Version(FALSE) );
+ int len = strlen(version);
+
+ if (PutDebugString(version, len))
+ return TRUE;
+
+ return FALSE;
+}
+
+BOOL BinaryScripter::PutDebugToken(const int token)
+{
+ TokenCount++;
+
+ return PutDebugByte(token);
+}
+
+
+BOOL BinaryScripter::PutDebugInt(const int data)
+{
+ int res=fwrite( &data, sizeof(int), 1, ScriptFile );
+ return (res == EOF);
+}
+
+
+BOOL BinaryScripter::PutDebugByte(const BYTE data)
+{
+ int res=fputc( data, ScriptFile );
+ return (res == EOF);
+}
+
+
+BOOL BinaryScripter::PutDebugString(const char* str,const int len)
+{
+ if (PutDebugToken(tokCharPtr))
+ return TRUE;
+ if (PutDebugInt(len))
+ return TRUE;
+
+ for (int i=0; i < len; i++)
+ if ((fputc(str[i],ScriptFile))==EOF)
+ return TRUE;
+
+return FALSE;
+}
+
+BOOL BinaryScripter::PutDebugStream(const BYTE* str,const int len)
+{
+ if (PutDebugToken(tokStream))
+ return TRUE;
+ if (PutDebugInt(len))
+ return TRUE;
+
+ for (int i=0; i < len; i++)
+ if ((fputc(str[i],ScriptFile))==EOF)
+ return TRUE;
+
+return FALSE;
+}
+
+
+BOOL BinaryScripter::GetDebugToken(int& token)
+{
+ BYTE b;
+ if (GetDebugByte(b))
+ return TRUE;
+ token=b;
+ if (token>LAST_TOKEN)
+ return TRUE;
+
+ ReplayTokenCount++;
+
+ return FALSE;
+}
+
+
+BOOL BinaryScripter::GetDebugInt(int& data)
+{
+ int temp;
+ int res = fread(&temp, sizeof(int), 1, ScriptFile);
+ data=temp;
+ return (res<1);
+}
+
+
+BOOL BinaryScripter::GetDebugByte(BYTE& data)
+{
+ data=fgetc(ScriptFile);
+ return FALSE;
+}
+
+
+BOOL BinaryScripter::GetDebugString(char*& str,int& length)
+{
+ int res,len,i;
+ str=NULL; // in case of err rtn
+
+ for (i=0; i<TEMPLEN; i++)
+ tempStr[i]=0;
+
+ GetDebugToken(res); // look for tokCharPtr
+ if (res != tokCharPtr)
+ return TRUE;
+ GetDebugInt(len); // get length
+
+ if (len >= TEMPLEN)
+ return TRUE;
+
+ for (i=0; i<len; i++)
+ if ((tempStr[i]=fgetc(ScriptFile))==EOF)
+ return TRUE;
+
+ tempStr[i]=0;
+ str=tempStr;
+ length=len;
+
+ return FALSE;
+}
+
+
+BOOL BinaryScripter::GetDebugStream(const unsigned int buffersize, BYTE*& buffer)
+{
+ int token;
+ BYTE tok;
+
+ GetDebugToken(token);
+ if (token != tokStream)
+ return TRUE;
+
+ buffer = (BYTE*)pSys->AllocMem(buffersize,FALSE);
+ if (buffer==NULL)
+ return TRUE;
+ int len;
+
+ GetDebugInt(len);
+ if (len==0)
+ {
+ pSys->FreeMem(buffer,FALSE);
+ buffer=NULL;
+ return FALSE;
+ }
+ if (((unsigned int)len) != buffersize)
+ return TRUE;
+
+ for (int i=0; i < len; i++)
+ {
+ GetDebugByte(tok);
+ buffer[i] = tok;
+ }
+
+ return FALSE;
+}
+
+APDK_END_NAMESPACE
+
+#endif //APDK_CAPTURE
+
diff --git a/prnt/hpijs/script.h b/prnt/hpijs/script.h
new file mode 100644
index 0000000..ac01adc
--- /dev/null
+++ b/prnt/hpijs/script.h
@@ -0,0 +1,127 @@
+/*****************************************************************************\
+ script.h : Interface for Scripter classes
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+APDK_BEGIN_NAMESPACE
+
+class Scripter
+{
+public:
+ Scripter(SystemServices* pSS);
+ virtual ~Scripter();
+
+ unsigned int TokenCount;
+ unsigned int ReplayTokenCount;
+
+ FILE* ScriptFile;
+ char ScriptFileName[200];
+ unsigned int fontcount;
+
+ SystemServices* pSys;
+ short* GlobalBuffer;
+ int buffsize;
+
+
+ virtual BOOL OpenDebugStreamR(const char* filename)=0;
+ virtual BOOL CloseDebugStreamR()=0;
+ virtual BOOL OpenDebugStreamW(const char* filename)=0;
+ virtual BOOL CloseDebugStreamW()=0;
+ virtual BOOL PutDebugToken(const int token)=0;
+ virtual BOOL PutDebugInt(const int data)=0;
+ virtual BOOL PutDebugByte(const BYTE data)=0;
+ virtual BOOL PutDebugStream(const BYTE* stream,const int len)=0;
+ virtual BOOL PutDebugString(const char* str,const int len)=0;
+ virtual BOOL GetDebugToken(int& token)=0;
+ virtual BOOL GetDebugInt(int& data)=0;
+ virtual BOOL GetDebugString(char*& str,int& len)=0;
+ virtual BOOL GetDebugStream(const unsigned int buffersize, BYTE*& buffer)=0;
+ virtual BOOL GetDebugByte(BYTE& data)=0;
+
+ BOOL ParseVer(char* str);
+};
+
+class AsciiScripter : public Scripter
+{
+public:
+ AsciiScripter(SystemServices* pSS);
+ ~AsciiScripter();
+
+ virtual BOOL OpenDebugStreamR(const char* filename);
+ virtual BOOL CloseDebugStreamR();
+ virtual BOOL OpenDebugStreamW(const char* filename);
+ virtual BOOL CloseDebugStreamW();
+ virtual BOOL PutDebugToken(const int token);
+ virtual BOOL PutDebugInt(const int data);
+ virtual BOOL PutDebugByte(const BYTE data);
+ virtual BOOL PutDebugString(const char* str,const int len);
+ virtual BOOL PutDebugStream(const BYTE* stream,const int len);
+ virtual BOOL GetDebugToken(int& token);
+ virtual BOOL GetDebugInt(int& data);
+ virtual BOOL GetDebugByte(BYTE& data);
+ virtual BOOL GetDebugString(char*& str,int& len);
+ virtual BOOL GetDebugStream(const unsigned int buffersize, BYTE*& buffer );
+
+ void ReadRLE(int instreamlen, BYTE* outstream);
+ void ReadRaw(int instreamlen, BYTE* outstream);
+
+ BOOL FindPercent();
+ char* digits();
+ char scanner[30];
+ #define TEMPLEN 600
+ char tempStr[TEMPLEN];
+
+ char TokString[25][40]; // 25=# of tokens in harness.h; table set in ProtoServices cons.
+ unsigned int TokCount[25];
+
+};
+
+class BinaryScripter : public AsciiScripter
+{
+public:
+ BinaryScripter(SystemServices* pSS);
+ ~BinaryScripter();
+
+ BOOL OpenDebugStreamR(const char* filename);
+ BOOL OpenDebugStreamW(const char* filename);
+ BOOL PutDebugToken(const int token);
+ BOOL PutDebugInt(const int data);
+ BOOL PutDebugByte(const BYTE data);
+ BOOL PutDebugString(const char* str,const int len);
+ BOOL PutDebugStream(const BYTE* stream,const int len);
+ BOOL GetDebugToken(int& token);
+ BOOL GetDebugInt(int& data);
+ BOOL GetDebugString(char*& str,int& len);
+ BOOL GetDebugStream(const unsigned int buffersize, BYTE*& buffer );
+ BOOL GetDebugByte(BYTE& data);
+
+};
+
+APDK_END_NAMESPACE
+
diff --git a/prnt/hpijs/services.cpp b/prnt/hpijs/services.cpp
new file mode 100644
index 0000000..186d27f
--- /dev/null
+++ b/prnt/hpijs/services.cpp
@@ -0,0 +1,768 @@
+/*****************************************************************************\
+ services.cpp : HP Inkjet Server
+
+ Copyright (c) 2001 - 2004, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ NOT LIMITED TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+#include <sys/stat.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <syslog.h>
+#include <string.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include "header.h"
+#include "ijs.h"
+#include "ijs_server.h"
+#include "hpijs.h"
+#include "services.h"
+
+#if defined(HAVE_LIBHPIP) && defined(HAVE_DBUS)
+#include <dbus/dbus.h>
+#define DBUS_INTERFACE "com.hplip.StatusService"
+#define DBUS_PATH "/"
+static DBusError dbus_err;
+static DBusConnection *dbus_conn;
+void InitDbus (void);
+void SendDbusMessage (const char *dev, const char *printer, int code,
+ const char *username, const int jobid, const char *title);
+#else
+void SendDbusMessage (const char *dev, const char *printer, int code,
+ const char *username, const int jobid, const char *title)
+{
+}
+#endif
+
+int UXServices::InitDuplexBuffer()
+{
+ /* Free buffer if new page size in middle of print job. */
+ if (RastersOnPage)
+ delete [] RastersOnPage;
+ if (KRastersOnPage)
+ delete [] KRastersOnPage;
+
+ /* Calculate duplex page buffer */
+ CurrentRaster = ph.height - 1; /* Height = physical page in pixels */
+ RastersOnPage = (BYTE **) new BYTE[(ph.height) * sizeof (BYTE *)];
+ KRastersOnPage = (BYTE **) new BYTE[(ph.height) * sizeof (BYTE *)];
+ for (int i = 0; i < ph.height; i++)
+ {
+ RastersOnPage[i] = NULL;
+ KRastersOnPage[i] = NULL;
+ }
+ return 0;
+}
+
+int UXServices::SendBackPage()
+{
+ DRIVER_ERROR err;
+ int i = CurrentRaster+1;
+
+ while (i < ph.height)
+ {
+ if (KRGB)
+ {
+ if ((err = pJob->SendRasters(KRastersOnPage[i], RastersOnPage[i])) != NO_ERROR)
+ return err;
+ }
+ else
+ {
+ if ((err = pJob->SendRasters(RastersOnPage[i])) != NO_ERROR)
+ return err;
+ }
+
+ if (RastersOnPage[i])
+ delete [] RastersOnPage[i];
+ if (KRastersOnPage[i])
+ delete [] KRastersOnPage[i];
+ i++;
+ }
+
+ CurrentRaster = ph.height - 1; /* reset raster index */
+
+ return 0;
+}
+
+static unsigned char xmask[] =
+{
+ 0x80, /* x=0 */
+ 0x40, /* 1 */
+ 0x20, /* 2 */
+ 0x10, /* 3 */
+ 0x08, /* 4 */
+ 0x04, /* 5 */
+ 0x02, /* 6 */
+ 0x01 /* 7 */
+};
+
+int UXServices::ProcessRaster(char *raster, char *k_raster)
+{
+ if (!((pPC->QueryDuplexMode() == DUPLEXMODE_BOOK) && pPC->RotateImageForBackPage() && BackPage))
+ {
+ if (KRGB)
+ return pJob->SendRasters((unsigned char *)k_raster, (unsigned char *)raster);
+ else
+ return pJob->SendRasters((unsigned char *)raster);
+ }
+ else
+ {
+ if (CurrentRaster < 0)
+ return -1;
+
+ BYTE *new_raster;
+ int new_raster_size;
+ int i,w;
+
+ if (raster == NULL)
+ {
+ RastersOnPage[CurrentRaster] = NULL;
+ }
+ else
+ {
+ new_raster_size = pPC->InputPixelsPerRow() * 3;
+ new_raster = new BYTE[new_raster_size];
+ if (new_raster == 0)
+ {
+ BUG("unable to create duplex buffer, size=%d: %m\n", new_raster_size);
+ return -1;
+ }
+ memset(new_raster, 0xFF, new_raster_size);
+ RastersOnPage[CurrentRaster] = new_raster;
+ BYTE *p = new_raster + new_raster_size - 3;
+ for (i = 0; i < new_raster_size; i += 3)
+ {
+ memcpy (p, raster+i, 3); /* rotate rgb image */
+ p -= 3;
+ }
+ }
+
+ if (k_raster == NULL)
+ {
+ KRastersOnPage[CurrentRaster] = NULL;
+ }
+ else
+ {
+ new_raster_size = (pPC->InputPixelsPerRow() + 7) >> 3;
+ new_raster = new BYTE[new_raster_size];
+ if (new_raster == 0)
+ {
+ BUG("unable to create black duplex buffer, size=%d: %m\n", new_raster_size);
+ return -1;
+ }
+ memset(new_raster, 0, new_raster_size);
+ KRastersOnPage[CurrentRaster] = new_raster;
+ w = pPC->InputPixelsPerRow();
+ for (i=0; i<w; i++)
+ {
+ if (k_raster[i>>3] & xmask[i&7])
+ new_raster[(w-i)>>3] |= xmask[(w-i)&7]; /* rotate k image */
+ }
+ int k = ((w + 7) / 8) * 8 - w;
+ BYTE c = 0xff << k;
+ if (k != 0)
+ new_raster[0] = c & k_raster[new_raster_size-1];
+ }
+
+ CurrentRaster--;
+
+ return 0;
+ }
+}
+
+
+#ifdef HAVE_LIBHPIP
+
+/*
+ * Check models.xml for bi-di flag and also check the
+ * device id string for integrity. Some devices return
+ * device id without some expected fields.
+ *
+ */
+BOOL UXServices::CanDoBiDi ()
+{
+ char *hpDev;
+ struct hpmud_model_attributes ma;
+ char strDevID[512];
+
+ // Check for CUPS environment
+
+ if ((hpDev = getenv ("DEVICE_URI")) == NULL)
+ {
+ return FALSE;
+ }
+
+ // Check for HP Backend
+
+ if (strncmp (hpDev, "hp:", 3))
+ {
+ return FALSE;
+ }
+
+ // Check io-mode in models.xml for this device
+
+ hpmud_query_model(hpDev, &ma);
+
+ if (ma.prt_mode == HPMUD_UNI_MODE)
+ {
+ return FALSE;
+ }
+ if (hpmud_open_device(hpDev, ma.prt_mode, &hpFD) != HPMUD_R_OK)
+ {
+ return FALSE;
+ }
+ memset (strDevID, 0, 512);
+ if ((ReadDeviceID ((BYTE *) strDevID, 512)) != NO_ERROR)
+ {
+ return FALSE;
+ }
+
+ // Check if this is a laser device
+ if (strstr (strDevID, "Laser") || strstr (strDevID, "laser"))
+ {
+ return TRUE;
+ }
+
+ // Check if device id is complete
+ if (!(strstr (strDevID, ";S:")) && !(strstr (strDevID, "VSTATUS")))
+ {
+ return FALSE;
+ }
+ return TRUE;
+}
+
+#else
+
+BOOL UXServices::CanDoBiDi ()
+{
+ return FALSE;
+}
+
+#endif // HAVE_LIBHPIP
+
+UXServices::UXServices():SystemServices()
+{
+ constructor_error = NO_ERROR;
+ hpFD = -1;
+
+ // instead of InitDeviceComm(), just do...
+ IOMode.bDevID = IOMode.bStatus = FALSE; /* uni-di support is default */
+
+#if 0 // Old code
+
+ /* Check for CUPS environment and HP backend. */
+ if ((hpDev = getenv("DEVICE_URI")) != NULL)
+ {
+ if (strncmp(hpDev, "hp:", 3) == 0)
+ {
+ hplip_Init();
+ hplip_ModelQuery(hpDev, &ma); /* check io-mode in models.xml for this device */
+ if (ma.prt_mode != UNI_MODE)
+ {
+ if ((hpFD = hplip_OpenHP(hpDev, &ma)) >= 0)
+ {
+ InitDeviceComm(); /* lets try bi-di support */
+ }
+ if(IOMode.bDevID == FALSE)
+ BUG("unable to set bi-di for hp backend\n");
+ }
+ }
+ }
+
+#endif // Old code
+
+ if (CanDoBiDi ())
+ {
+ InitDeviceComm ();
+ if (IOMode.bDevID == FALSE)
+ {
+ BUG ("Unable to set bi-di for hp backend\n");
+ }
+ }
+
+ Quality = QUALITY_NORMAL;
+ MediaType = MEDIA_PLAIN;
+ ColorMode = COLOR;
+ PenSet = DUMMY_PEN;
+
+ RastersOnPage = 0;
+ KRastersOnPage = 0;
+ pPC = NULL;
+ pJob = NULL;
+ Duplex = 0;
+ Tumble = 0;
+ FullBleed = 0;
+ FirstRaster = 1;
+ MediaPosition = sourceTrayAuto;
+ Model = -1;
+ strcpy(ph.cs, "sRGB");
+ VertAlign = -1;
+ DisplayStatus = NODISPLAYSTATUS;
+ OutputPath = -1;
+ outfp = NULL;
+ m_iLogLevel = 0;
+
+ m_pbyPclBuffer = NULL;
+ m_iPclBufferSize = BUFFER_CHUNK_SIZE;
+ m_iCurPclBufferPos = 0;
+ m_iPageCount = 0;
+ m_bSpeedMechEnabled = FALSE;
+}
+
+UXServices::~UXServices()
+{
+ if (m_bSpeedMechEnabled)
+ {
+ SendLastPage ();
+ }
+
+ if (RastersOnPage)
+ delete [] RastersOnPage;
+ if (KRastersOnPage)
+ delete [] KRastersOnPage;
+#ifdef HAVE_LIBHPIP
+ if (hpFD >= 0)
+ hpmud_close_device(hpFD);
+#endif
+ if (outfp)
+ {
+ fclose (outfp);
+ }
+}
+
+DRIVER_ERROR UXServices::ToDevice(const BYTE * pBuffer, DWORD * Count)
+{
+ if (OutputPath == -1)
+ {
+ return IO_ERROR;
+ }
+
+ if (m_bSpeedMechEnabled)
+ {
+ if ((CopyData (pBuffer, *Count)) == 0)
+ {
+ *Count = 0;
+ return NO_ERROR;
+ }
+ }
+
+ if (outfp)
+ {
+ fwrite (pBuffer, 1, *Count, outfp);
+ if (!(m_iLogLevel & SEND_TO_PRINTER))
+ {
+ *Count = 0;
+ return NO_ERROR;
+ }
+ }
+
+ /* Write must be not-buffered, don't use streams */
+ if (write(OutputPath, pBuffer, *Count) != (ssize_t)*Count)
+ {
+ static int cnt=0;
+ if (cnt++ < 5)
+ BUG("unable to write to output, fd=%d, count=%d: %m\n", OutputPath, *Count);
+ return IO_ERROR;
+ }
+
+ *Count = 0;
+ return NO_ERROR;
+}
+
+BOOL UXServices::GetStatusInfo (BYTE * bStatReg)
+{
+#ifdef HAVE_LIBHPIP
+ unsigned int s;
+ if (hpmud_get_device_status(hpFD, &s) == HPMUD_R_OK)
+ {
+ *bStatReg = (BYTE)s;
+ return TRUE;
+ }
+#endif
+ return FALSE;
+}
+
+DRIVER_ERROR UXServices::ReadDeviceID (BYTE * strID, int iSize)
+{
+#ifdef HAVE_LIBHPIP
+ int len;
+ hpmud_get_device_id(hpFD, (char *)strID, iSize, &len);
+ if (len < 3)
+ return IO_ERROR;
+#endif
+ return NO_ERROR;
+}
+
+#ifdef HP_PRINTVIEW
+const char *szPJLHeader = "@PJL SET JOBATTR=\"JobAcct7=HPPrintView.exe\"\012";
+int UXServices::GetPJLHeaderBuffer (char **szPJLBuffer)
+{
+ *szPJLBuffer = (char *) szPJLHeader;
+ return strlen (szPJLHeader);
+}
+#endif // HP_PRINTVIEW
+
+BOOL UXServices::GetVerticalAlignmentValue(BYTE* cVertAlignVal)
+{
+ if (VertAlign == -1)
+ return FALSE;
+
+ *cVertAlignVal = (BYTE)VertAlign;
+ return TRUE;
+}
+
+BOOL UXServices::GetVertAlignFromDevice()
+{
+#ifdef HAVE_LIBHPIP
+ if ((VertAlign = ReadHPVertAlign(hpFD)) == -1)
+ return FALSE;
+#endif
+ return TRUE;
+}
+
+void UXServices::DisplayPrinterStatus (DISPLAY_STATUS ePrinterStatus)
+{
+ DisplayStatus = ePrinterStatus;
+}
+
+DRIVER_ERROR UXServices::BusyWait (DWORD msec)
+{
+ switch (DisplayStatus)
+ {
+ case DISPLAY_ERROR_TRAP:
+ case DISPLAY_COMM_PROBLEM:
+ case DISPLAY_PRINTER_NOT_SUPPORTED:
+ case DISPLAY_OUT_OF_PAPER:
+ case DISPLAY_PHOTOTRAY_MISMATCH:
+ case DISPLAY_TOP_COVER_OPEN:
+ case DISPLAY_NO_COLOR_PEN:
+ case DISPLAY_NO_BLACK_PEN:
+ case DISPLAY_NO_PENS:
+ BUG("WARNING: printer bi-di error=%d\n", DisplayStatus);
+ DisplayStatus = DISPLAY_PRINTING_CANCELED;
+ return JOB_CANCELED; /* bail-out otherwise APDK will wait forever */
+ default:
+ break;
+ }
+ return NO_ERROR;
+}
+
+const char * UXServices::GetDriverMessage (DRIVER_ERROR err)
+{
+ const char *p=NULL;
+
+ /* Map driver error to text message. TODO: text needs to be localized. */
+ switch(err)
+ {
+ case(WARN_MODE_MISMATCH):
+ p = "printmode mismatch with pen, tray, etc.";
+ break;
+ case(WARN_LOW_INK_BOTH_PENS):
+ p = "both pens have low ink";
+ break;
+ case(WARN_LOW_INK_BLACK):
+ p = "black pen has low ink";
+ break;
+ case(WARN_LOW_INK_COLOR):
+ p = "color pen has low ink";
+ break;
+ case(WARN_LOW_INK_PHOTO):
+ p = "photo pen has low ink";
+ break;
+ case(WARN_LOW_INK_GREY):
+ p = "grey pen has low ink";
+ break;
+ case(WARN_LOW_INK_BLACK_PHOTO):
+ p = "black photo has low ink";
+ break;
+ case(WARN_LOW_INK_COLOR_PHOTO):
+ p = "color photo pen has low ink";
+ break;
+ case(WARN_LOW_INK_GREY_PHOTO):
+ p = "grey photo pen has low ink";
+ break;
+ case(WARN_LOW_INK_COLOR_GREY):
+ p = "grey pen has low ink";
+ break;
+ case(WARN_LOW_INK_COLOR_GREY_PHOTO):
+ p = "color grey photo pen has low ink";
+ break;
+ case(WARN_LOW_INK_COLOR_BLACK_PHOTO):
+ p = "color back pen has low ink";
+ break;
+ case(WARN_LOW_INK_CYAN):
+ p = "cyan has low ink";
+ break;
+ case(WARN_LOW_INK_MAGENTA):
+ p = "magenta has low ink";
+ break;
+ case(WARN_LOW_INK_YELLOW):
+ p = "yellow has low ink";
+ break;
+ case(WARN_LOW_INK_MULTIPLE_PENS):
+ p = "more that one ink is low";
+ break;
+ case(WARN_FULL_BLEED_UNSUPPORTED):
+ p = "fullbleed is not supported";
+ break;
+ case(WARN_FULL_BLEED_3SIDES):
+ p = "fullbleed is 3 sides";
+ break;
+ case(WARN_FULL_BLEED_PHOTOPAPER_ONLY):
+ p = "fullbleed photo paper only";
+ break;
+ case(WARN_FULL_BLEED_3SIDES_PHOTOPAPER_ONLY):
+ p = "fullbleed 3 sides photo paper only";
+ break;
+ case(WARN_ILLEGAL_PAPERSIZE):
+ p = "illegal paper size";
+ break;
+ case(WARN_INVALID_MEDIA_SOURCE):
+ p = "invalid media source";
+ break;
+ default:
+ p = "driver error";
+ BUG("driver error=%d\n", err);
+ break;
+ }
+ return p;
+}
+
+int UXServices::MapPaperSize (float width, float height)
+{
+ int i, r, size;
+ float dx, dy;
+
+ /* Map gs paper sizes to APDK paper sizes, or do custom. */
+ size = CUSTOM_SIZE;
+ for (i=0; i<MAX_PAPER_SIZE; i++)
+ {
+ r = pPC->SetPaperSize ((PAPER_SIZE)i);
+
+ if (r != NO_ERROR)
+ continue;
+
+ dx = width > pPC->PhysicalPageSizeX () ? width - pPC->PhysicalPageSizeX () : pPC->PhysicalPageSizeX () - width;
+ dy = height > pPC->PhysicalPageSizeY () ? height - pPC->PhysicalPageSizeY () : pPC->PhysicalPageSizeY () - height;
+
+ if ((dx < 0.05) && (dy < 0.05))
+ {
+ size = i; /* found standard paper size */
+ break;
+ }
+ }
+
+ if (size == CUSTOM_SIZE)
+ pPC->SetCustomSize (width, height);
+
+ if ((r = pPC->SetPaperSize ((PAPER_SIZE)size, FullBleed)) != NO_ERROR)
+ {
+ if (r > 0)
+ {
+ BUG("unable to set paper size=%d, err=%d, width=%0.5g, height=%0.5g\n", size, r, width, height);
+ }
+ else
+ {
+ BUG("warning setting paper size=%d, err=%d, width=%0.5g, height=%0.5g\n", size, r, width, height);
+ }
+/*
+ * Call failed, reset our PaperWidth and PaperHeight values.
+ * This ensures that we return correct values when gs queries for printable area.
+ */
+
+ PaperWidth = pPC->PhysicalPageSizeX ();
+ PaperHeight = pPC->PhysicalPageSizeY ();
+ return -1;
+ }
+
+ PaperWidth = pPC->PhysicalPageSizeX ();
+ PaperHeight = pPC->PhysicalPageSizeY ();
+
+ return 0;
+}
+
+void UXServices::ResetIOMode (BOOL bDevID, BOOL bStatus)
+{
+ if (pPC)
+ {
+ IOMode.bDevID = bDevID;
+ IOMode.bStatus = bStatus;
+ pPC->ResetIOMode (bDevID, bStatus);
+ }
+}
+
+void UXServices::InitSpeedMechBuffer ()
+{
+ if (m_pbyPclBuffer)
+ {
+ return;
+ }
+ m_pbyPclBuffer = new BYTE[m_iPclBufferSize + 2];
+ if (m_pbyPclBuffer)
+ {
+ iSendBufferSize = 0;
+ }
+}
+
+int UXServices::SendPreviousPage ()
+{
+ DRIVER_ERROR err;
+ if (m_bSpeedMechEnabled == FALSE)
+ {
+ return 0;
+ }
+ m_iPageCount++;
+ if (m_iPageCount == 1)
+ {
+ return 0;
+ }
+ m_bSpeedMechEnabled = FALSE;
+ err = ToDevice (m_pbyPclBuffer, (DWORD *) &m_iCurPclBufferPos);
+ if (err != NO_ERROR)
+ {
+ return 1;
+ }
+ m_bSpeedMechEnabled = TRUE;
+ m_iCurPclBufferPos = 0;
+
+// Request the printer to inject speed mech command. Also, let it know this is not the last page
+
+ pPC->SetPrinterHint (SPEED_MECH_HINT, 0);
+ return 0;
+}
+
+int UXServices::CopyData (const BYTE *pBuffer, DWORD iCount)
+{
+ if (m_iCurPclBufferPos + (int) iCount < m_iPclBufferSize)
+ {
+ memcpy (m_pbyPclBuffer + m_iCurPclBufferPos, pBuffer, iCount);
+ m_iCurPclBufferPos += iCount;
+ return 0;
+ }
+ BYTE *p = new BYTE[m_iPclBufferSize + BUFFER_CHUNK_SIZE + 2];
+ if (p == NULL)
+ {
+ m_bSpeedMechEnabled = FALSE;
+ return 1;
+ }
+ memcpy (p, m_pbyPclBuffer, m_iCurPclBufferPos);
+ delete [] m_pbyPclBuffer;
+ m_pbyPclBuffer = p;
+ memcpy (m_pbyPclBuffer + m_iCurPclBufferPos, pBuffer, iCount);
+ m_iCurPclBufferPos += iCount;
+ m_iPclBufferSize += BUFFER_CHUNK_SIZE;
+ return 0;
+}
+
+// Note that this is good only for VIP printers
+const char *pbySpeedMechCmd = "\x1B*o5W\x0D\x02\x00";
+
+void UXServices::SendLastPage ()
+{
+ if (m_pbyPclBuffer == NULL)
+ {
+ return;
+ }
+ // Look for speed mech command in the buffer, set the page count and last page flag
+ int i = 0;
+ BYTE *p = m_pbyPclBuffer;
+ while (i < m_iPclBufferSize)
+ {
+ if (*p == '\x1B')
+ {
+ if (!(memcmp (p, pbySpeedMechCmd, 8)))
+ {
+ p += 8;
+ *p++ = (BYTE) ((m_iPageCount & 0xFF00) >> 8);
+ *p++ = (BYTE) ((m_iPageCount & 0x00FF));
+ *(p + 9) = 1;
+ break;
+ }
+ }
+ i++;
+ p++;
+ }
+ m_bSpeedMechEnabled = FALSE;
+ ToDevice (m_pbyPclBuffer, (DWORD *) &m_iCurPclBufferPos);
+ delete [] m_pbyPclBuffer;
+}
+
+#if defined(HAVE_LIBHPIP) && defined(HAVE_DBUS)
+void SendDbusMessage (const char *dev, const char *printer, int code,
+ const char *username, const int jobid, const char *title)
+{
+ DBusMessage * msg = NULL;
+
+ InitDbus ();
+ if (dbus_conn == NULL)
+ return;
+ msg = dbus_message_new_signal(DBUS_PATH, DBUS_INTERFACE, "Event");
+
+ if (NULL == msg)
+ {
+ BUG("dbus message is NULL!\n");
+ return;
+ }
+
+ dbus_message_append_args(msg,
+ DBUS_TYPE_STRING, &dev,
+ DBUS_TYPE_STRING, &printer,
+ DBUS_TYPE_UINT32, &code,
+ DBUS_TYPE_STRING, &username,
+ DBUS_TYPE_UINT32, &jobid,
+ DBUS_TYPE_STRING, &title,
+ DBUS_TYPE_INVALID);
+
+ if (!dbus_connection_send(dbus_conn, msg, NULL))
+ {
+ BUG("dbus message send failed!\n");
+ return;
+ }
+
+ dbus_connection_flush(dbus_conn);
+ dbus_message_unref(msg);
+
+ return;
+}
+
+void InitDbus (void)
+{
+ dbus_error_init (&dbus_err);
+ dbus_conn = dbus_bus_get (DBUS_BUS_SYSTEM, &dbus_err);
+
+ if (dbus_error_is_set (&dbus_err))
+ {
+ BUG ("dBus Connection Error (%s)!\n", dbus_err.message);
+ dbus_error_free (&dbus_err);
+ }
+
+ return;
+}
+#endif /* HAVE_DBUS */
+
+
diff --git a/prnt/hpijs/services.h b/prnt/hpijs/services.h
new file mode 100644
index 0000000..4334427
--- /dev/null
+++ b/prnt/hpijs/services.h
@@ -0,0 +1,189 @@
+/*****************************************************************************\
+ services.h : HP Inkjet Server
+
+ Copyright (c) 2001 - 2002, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ NOT LIMITED TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+#ifndef hpijs_services_INCLUDED
+#define hpijs_services_INCLUDED
+
+#include <stdio.h>
+#include <math.h>
+
+#define EVENT_PRINT_FAILED_MISSING_PLUGIN 502
+
+#include "global_types.h"
+
+APDK_USING_NAMESPACE
+
+#define BUFFER_CHUNK_SIZE 1024 * 1024 * 2
+
+class UXServices:public SystemServices
+{
+public:
+ UXServices ();
+ virtual ~ UXServices ();
+
+ DRIVER_ERROR BusyWait (DWORD msec);
+
+ DRIVER_ERROR ToDevice (const BYTE* pBuffer, DWORD* wCount);
+
+ DRIVER_ERROR FromDevice (BYTE* pReadBuff, DWORD * wReadCount)
+ {
+ return NO_ERROR;
+ }
+
+ DRIVER_ERROR ReadDeviceID (BYTE * strID, int iSize);
+ BOOL GetStatusInfo (BYTE * bStatReg);
+
+ DWORD GetSystemTickCount (void)
+ {
+ return 0;
+ }
+
+ /////////////////////////////////////////////////////////
+ BOOL YieldToSystem (void)
+ {
+ return 0;
+ }
+
+ BYTE GetRandomNumber ()
+ {
+ return rand ();
+ }
+
+ void DisplayPrinterStatus (DISPLAY_STATUS ePrinterStatus);
+
+ BYTE GetStatus ()
+ {
+ return 0;
+ }
+
+ DRIVER_ERROR GetDevID (BYTE * pDevIDString, int *iDevIDLength);
+
+ DRIVER_ERROR GetECPStatus (BYTE * pStatusString, int *pECPLength,
+ int ECPChannel)
+ {
+ return NO_ERROR;
+ }
+
+#ifdef HP_PRINTVIEW
+ int GetPJLHeaderBuffer (char **szPJLBuffer);
+#endif
+
+ BOOL GetVerticalAlignmentValue(BYTE* cVertAlignVal);
+ BOOL GetVertAlignFromDevice();
+
+ BYTE *AllocMem (int iMemSize)
+ {
+ return (BYTE *) malloc (iMemSize);
+ }
+
+ void FreeMem (BYTE * pMem)
+ {
+ free (pMem);
+ }
+
+ float power (float x, float y)
+ {
+ return pow (x, y);
+ }
+
+ int ProcessRaster(char *raster, char *k_raster);
+ int InitDuplexBuffer();
+ int SendBackPage ();
+ int MapPaperSize(float width, float height);
+ void MapModel(const char *nam);
+ const char * GetDriverMessage(DRIVER_ERROR err);
+
+ void ResetIOMode (BOOL bDevID, BOOL bStatus);
+
+ void InitSpeedMechBuffer ();
+ int CopyData (const BYTE *pBuffer, DWORD iCount);
+ int SendPreviousPage ();
+ void SendLastPage ();
+ BOOL IsSpeedMechEnabled ()
+ {
+ return m_bSpeedMechEnabled;
+ }
+ void EnableSpeedMech (BOOL bFlag)
+ {
+ m_bSpeedMechEnabled = bFlag;
+ }
+
+ BOOL BackPage;
+ int CurrentRaster;
+ BYTE **RastersOnPage;
+ BYTE **KRastersOnPage;
+
+ IjsPageHeader ph;
+
+ const float *Margin;
+ int Model; /* selected device: -1=no, 1=yes */
+ int OutputPath; /* open file descriptor */
+ QUALITY_MODE Quality;
+ MEDIATYPE MediaType;
+ COLORMODE ColorMode;
+ PEN_TYPE PenSet;
+ int MediaPosition;
+ float PaperWidth; /* physical width in inches */
+ float PaperHeight; /* physical height in inches */
+ int Duplex;
+ int Tumble;
+ int FullBleed;
+ int FirstRaster;
+ int KRGB; /* 0=no, 1=yes */
+ int hpFD; /* CUPS hp backend file descriptor. */
+ DISPLAY_STATUS DisplayStatus; /* current DisplayPrinterStatus */
+ int VertAlign; /* for Crossbow/Spear */
+
+ PrintContext *pPC;
+ Job *pJob;
+ FILE *outfp;
+ int m_iLogLevel;
+
+protected:
+
+ // for internal use
+ virtual BYTE* AllocMem (int iMemSize, BOOL trackmemory)
+ { return AllocMem(iMemSize); }
+
+ virtual void FreeMem (BYTE* pMem, BOOL trackmemory)
+ { FreeMem(pMem); }
+ BOOL CanDoBiDi ();
+
+private:
+ int m_iPageCount;
+ BOOL m_bSpeedMechEnabled;
+ int m_iPclBufferSize;
+ int m_iCurPclBufferPos;
+ BYTE *m_pbyPclBuffer;
+};
+
+#endif /* hpijs_services_INCLUDED */
+
diff --git a/prnt/hpijs/systemservices.cpp b/prnt/hpijs/systemservices.cpp
new file mode 100644
index 0000000..ee8d3a4
--- /dev/null
+++ b/prnt/hpijs/systemservices.cpp
@@ -0,0 +1,403 @@
+/*****************************************************************************\
+ systemservice.cpp : Implimentation for the SystemServices class
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+#include "header.h"
+#include "io_defs.h"
+#ifdef APDK_CAPTURE
+#include "script.h"
+#endif // APDK_CAPTURE
+
+APDK_BEGIN_NAMESPACE
+
+// Constructor instantiates the DeviceRegistry.
+// Real work done in InitDeviceComm, called from derived
+// class constructor.
+/*!
+This method constructs a SystemServices object. This is the first step in the
+calling sequence.
+Check constructor_error before continuing.
+*/
+SystemServices::SystemServices()
+ : constructor_error(NO_ERROR),
+#if defined(APDK_CAPTURE)
+ pScripter(NULL),
+ Capturing(FALSE),
+#endif
+ iSendBufferSize(4096)
+{
+
+ strModel[0] = strPens[0] = '\0';
+ VIPVersion = 0;
+
+ DR = new DeviceRegistry();
+ // DR can't fail
+
+ IOMode.bDevID=FALSE;
+ IOMode.bStatus=FALSE;
+ IOMode.bUSB=FALSE;
+ memset (strDevID, 0, DevIDBuffSize);
+
+}
+
+/*!
+This method is a destructor, called when the instance of SystemServices is
+deleted or goes out of scope.
+*/
+SystemServices::~SystemServices()
+{
+
+ delete DR;
+
+#if defined(APDK_CAPTURE)
+ if (pScripter)
+ delete pScripter;
+#endif
+
+DBG1("deleting SystemServices\n");
+}
+
+/*!
+Tests communication with printer. It calls host supplied GetStatusInfo.
+\return TRUE if communication with printer is working.
+\note This implementation is appropriate for Parallel bus only.
+*/
+BOOL SystemServices::PrinterIsAlive()
+{
+ BYTE status_reg;
+
+ // Technically, this function should not even be
+ // called if IOMode.bStatus is known to be FALSE
+ if (!IOMode.bStatus)
+ return TRUE;
+ if( GetStatusInfo(&status_reg) == FALSE )
+ {
+ DBG1("PrinterIsAlive: No Status-Byte Available (Default = TRUE)\n");
+ return TRUE;
+ }
+
+#define DJ6XX_OFF (0xF8)
+#define DJ400_OFF (0xC0)
+// sometimes the DJ400 reports a status byte of C8 when it's turned off
+#define DJ400_OFF_BOGUS (0xC8)
+#define DEVICE_IS_OK(reg) (!((reg == DJ6XX_OFF) || (reg == DJ400_OFF) || (reg == DJ400_OFF_BOGUS)))
+
+#if defined(APDK_DEBUG) && (DBG_MASK & DBG_LVL1)
+ printf("status reg is 0x%02x\n",status_reg);
+ if (DEVICE_IS_OK(status_reg))
+ DBG1("PrinterIsAlive: returning TRUE\n");
+ else
+ DBG1("PrinterIsAlive: returning FALSE\n");
+#endif
+
+ return (DEVICE_IS_OK(status_reg));
+}
+
+/*!
+ Same as host-supplied FreeMem, with extra safety check
+ for null pointer.
+*/
+DRIVER_ERROR SystemServices::FreeMemory(void *ptr)
+{
+ if (ptr == NULL)
+ return SYSTEM_ERROR;
+
+// printf("FreeMemory freeing %p\n",ptr);
+ FreeMem((BYTE*)ptr);
+
+ return NO_ERROR;
+}
+
+
+/*!
+This method tries to get the device id back from the printer and does some basic verification.
+*/
+DRIVER_ERROR SystemServices::GetDeviceID(BYTE* strID, int iSize, BOOL bQuery)
+{
+
+ if (iSize < 3) // must have at least enough space for count bytes and NULL terminator
+ {
+ return(SYSTEM_ERROR);
+ }
+
+ memset (strID, 0, iSize);
+
+ if (bQuery)
+ {
+ // initialize the first 3 bytes to NULL (1st 2 bytes may be binary count of string
+ // length so need to clear them as well as the "real" start of the string)
+ // so that if ReadDeviceID() does nothing with buffer we won't act upon what
+ // was in the buffer before calling it
+ strID[0] = strID[1] = strID[2] = '\0';
+
+ // we are going to try more then once because some printers lie and this
+ // specifically fixes problems with the DJ630 & DJ640 printers.
+ int i = 0;
+ for(i = 0; i < 20; i++)
+ {
+ // get the string
+ if((ReadDeviceID(strID, iSize) != NO_ERROR))
+ {
+ DBG1("Error from ReadDeviceID or No DevID Available\n");
+ if(BusyWait((DWORD)100) == JOB_CANCELED)
+ {
+ return JOB_CANCELED;
+ }
+ continue; // go back and try again
+ }
+ // look for the existence of either of the defined manufacturer fields in the string
+ // (need to look starting at strID[0] and at strID[2] since the first 2 bytes may or
+ // may not be binary count bytes, one of which could be a binary 0 (NULL) which strstr()
+ // will interpret as the end of string)
+ else
+ {
+ if ((!strstr((const char*)strID, "MFG:") &&
+ !strstr((const char*)strID+2, "MFG:") &&
+ !strstr((const char*)strID, "MANUFACTURER:") &&
+ !strstr((const char*)strID+2, "MANUFACTURER:")) ||
+ (!strstr((const char*)strID, "MDL:") &&
+ !strstr((const char*)strID+2, "MDL:") &&
+ !strstr((const char*)strID, "MODEL:") &&
+ !strstr((const char*)strID+2, "MODEL:")) ||
+ ((strID[0] == '\0') && (strID[1] == '\0')))
+ {
+ DBG1("Successful' DevID request was a lie. Retry...waiting 100 ms\n");
+ if(BusyWait((DWORD)100) == JOB_CANCELED)
+ {
+ return JOB_CANCELED;
+ }
+ continue; // go back and try again
+ }
+ else
+ {
+ // If either of the first two bytes is 0, byte count is there, replace them.
+
+ if (strID[0] == 0 || strID[1] == 0)
+ {
+ strID[0] = strID[1] = ' ';
+ }
+ //DBG1("HPPCL: ReadDeviceID [%hs]\n", strID+2);
+ break; // SUCCESS!
+ }
+ }
+ }
+ if(i >= 20)
+ {
+ return BAD_DEVICE_ID;
+ }
+ }
+ else
+ {
+ // for use when string doesn't have to be re-fetched from printer
+
+ if (DevIDBuffSize > iSize)
+ {
+ return SYSTEM_ERROR;
+ }
+
+ // the first 2 bytes may be binary so could be 0 (NULL) so can't use strcpy
+ // (could get strlen of strDevID if start @ strDevID+2 and then add 2
+ // if do this it wouldn't require that caller's buffer be >=
+ // DevIDBuffSize, only that is it longer that actual devID string read)
+ memcpy(strID, strDevID, DevIDBuffSize);
+ }
+ return NO_ERROR;
+
+ // This is old code from before the 630, 640 loop fix was done (above). This can
+ // eventually be removed.
+ // check the read (or copied) DeviceID string for validity
+
+ // check what may be the binary count of the string length (some platforms return
+ // the raw DeviceID in which the 1st 2 bytes are a binary count of the string length,
+ // other platforms strip off these count bytes)
+ // if they are a binary count they shouldn't be zero, and if they aren't a binary
+ // count they also shouldn't be zero (NULL) since that would mean end of string
+/* if ((strID[0] == '\0') && (strID[1] == '\0'))
+ {
+ return BAD_DEVICE_ID;
+ }
+
+ // look for the existence of either of the defined manufacturer fields in the string
+ // (need to look starting at strID[0] and at strID[2] since the first 2 bytes may or
+ // may not be binary count bytes, one of which could be a binary 0 (NULL) which strstr()
+ // will interpret as the end of string)
+ if (!strstr((const char*)strID, "MFG:") &&
+ !strstr((const char*)strID+2, "MFG:") &&
+ !strstr((const char*)strID, "MANUFACTURER:") &&
+ !strstr((const char*)strID+2, "MANUFACTURER:"))
+ {
+ return BAD_DEVICE_ID;
+ }*/
+
+} //GetDeviceID
+
+
+/*!
+Mandatory call to be inserted in derived constructor.
+This method tries to establish communications with printer and identify it.
+The derived SystemServices constructor must call this base-class routine.
+*/
+DRIVER_ERROR SystemServices::InitDeviceComm()
+// Must be called from derived class constructor.
+// (Base class must be constructed before system calls
+// below can be made.)
+// Opens the port, looks for printer and
+// dialogues with user if none found;
+// then attempts to read and parse device ID string --
+// if successful, sets IOMode.bDevID to TRUE (strings stored
+// for retrieval by PrintContext).
+// Returns an error only if user cancelled. Otherwise
+// no error even if unidi.
+//
+// Calls: OpenPort,PrinterIsAlive,DisplayPrinterStatus,BusyWait,
+// GetDeviceID,DeviceRegistry::ParseDevIDString.
+// Sets: hPort,IOMode, strModel, strPens
+{
+ DRIVER_ERROR err = NO_ERROR;
+ BOOL ErrorDisplayed = FALSE;
+ BYTE temp;
+
+ // Check whether this system supports passing back a status-byte
+ if( GetStatusInfo(&temp) == FALSE )
+ {
+ DBG1("InitDeviceComm: No Status-Byte Available\n");
+ }
+ else IOMode.bStatus = TRUE;
+
+ // Check whether we can get a DeviceID - this may
+ // still fail if the device is just turned off
+ err = GetDeviceID(strDevID, DevIDBuffSize, TRUE);
+
+ if ( err == NO_ERROR )
+ {
+ DBG1("InitDeviceComm: DevID request successful\n");
+ IOMode.bDevID = TRUE;
+ }
+
+
+ // PrinterIsAlive is arbitrary if we can't get the status-byte.
+ // This check is also critical so a true uni-di system does not sit
+ // in a loop informing the user to turn on the printer.
+ if ( IOMode.bStatus == TRUE )
+ {
+ // Make sure a printer is there, turned on and connected
+ // before we go any further. This takes some additional checking
+ // due to the fact that the 895 returns a status byte of F8 when
+ // it's out of paper, the same as a 600 when it's turned off.
+ // 895 can get a devID even when 'off' so we'll key off that logic.
+ if ( (err != NO_ERROR) && (PrinterIsAlive() == FALSE) )
+ {
+ // Printer is actually turned off
+ while(PrinterIsAlive() == FALSE)
+ {
+ DBG1("PrinterIsAlive returned FALSE\n");
+ ErrorDisplayed = TRUE;
+ DisplayPrinterStatus(DISPLAY_NO_PRINTER_FOUND);
+
+ if(BusyWait(500) == JOB_CANCELED)
+ return JOB_CANCELED;
+ }
+ if(ErrorDisplayed == TRUE)
+ {
+ DisplayPrinterStatus(DISPLAY_PRINTING);
+ // if they just turned on/connected the printer,
+ // delay a bit to let it initialize
+ if(BusyWait(2000) == JOB_CANCELED)
+ return JOB_CANCELED;
+
+ err = GetDeviceID(strDevID, DevIDBuffSize, TRUE);
+ if ( err == NO_ERROR )
+ {
+ DBG1("InitDeviceComm: DevID request successful\n");
+ IOMode.bDevID = TRUE;
+ }
+ }
+ }
+ // else... we have 8xx/9xx with an out-of-paper error
+ // which we will catch in the I/O handling
+
+ }
+
+ if (err!=NO_ERROR)
+ {
+ DBG1("InitDeviceComm: No DeviceID Available\n");
+ return NO_ERROR;
+ }
+
+ err = DR->ParseDevIDString((const char*)strDevID, strModel, &VIPVersion, strPens);
+
+ if (err!=NO_ERROR)
+ {
+ // The DevID we got is actually garbage!
+ DBG1("InitDeviceComm: The DevID string is invalid!\n");
+ IOMode.bDevID=FALSE;
+ }
+
+ return NO_ERROR;
+}
+
+
+/*!
+This function will open an ECP I/O channel to the printer and retrieve a
+given number of bytes from it. Because ECP is a 1284 protocol, this
+function is only relevant for 1284 compliant parallel I/O connectivity.
+Currently, only the DeskJet 4xx Series of printers requires implementation
+of this function. Because of the non-standard nature of this function, it
+is expected that the sample code supplied in ECPSample.cpp will be heavily
+leveraged during implementation of this function in the derived SystemServices
+class.
+
+\note The DJ400 & DJ540 code was written as a special for a specific host.
+DJ400 & DJ500 are not supported by the APDK and there is no help with
+communication issues with these printers.
+
+\param pStatusString The destination of the set of retrieved status bytes.
+\param pECPLength The number of retrieved bytes.
+\param ECPChannel The ECP channel number to be opened and read.
+*/
+DRIVER_ERROR SystemServices::GetECPStatus(BYTE *pStatusString,int *pECPLength, int ECPChannel)
+{
+ pStatusString = NULL;
+ *pECPLength = 0;
+
+ return UNSUPPORTED_FUNCTION;
+}
+
+//! reconcile printer's preferred settings with reality
+void SystemServices::AdjustIO(IO_MODE IM, const char* model)
+{
+ IOMode.bStatus=IM.bStatus && IOMode.bStatus;
+ IOMode.bDevID =IM.bDevID && IOMode.bDevID;
+
+ if (model)
+ strncpy(strModel,model, sizeof(strModel));
+}
+
+APDK_END_NAMESPACE
+
diff --git a/prnt/hpijs/systemservices.h b/prnt/hpijs/systemservices.h
new file mode 100644
index 0000000..7712a33
--- /dev/null
+++ b/prnt/hpijs/systemservices.h
@@ -0,0 +1,333 @@
+/*****************************************************************************\
+ systemservices.h : Interface for the SystemServices class
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#ifndef APDK_SYSTEMSERVICES_H
+#define APDK_SYSTEMSERVICES_H
+
+APDK_BEGIN_NAMESPACE
+
+struct IO_MODE
+{
+ //NO_FEEDBACK, STATUS_ONLY, BIDI, USB
+ BOOL bDevID;
+ BOOL bStatus;
+ BOOL bUSB;
+}; //IO_MODE
+
+
+//forward declarations
+class DeviceRegistry;
+//class RasterSender;
+class Scripter;
+
+const int DevIDBuffSize = 512; //!< size of buffer used by SetDevInfo
+
+//SystemServices
+//! Provides interface to host environment
+/*! \class SystemServices systemservices.h "hpprintapi.h"
+The SystemServices object is used to encapsulate memory-management, I/O,
+clock access, user notification and UI, and other utilities provided by the
+operating system or host system supporting the driver. It is an abstract base
+class, requiring implementation of the necessary routines by the host.
+Creation of SystemServices is the first step in the calling sequence for the
+driver, followed by creation of the PrintContext and the Job. The derived
+class constructor must include a call to the member function InitDeviceComm,
+which establishes communication with the printer if possible.
+The only reference to this object in API-calling code should be to its
+constructor and destructor, which must be invoked prior to and after all other
+driver calls.
+******************************************************************************/
+class SystemServices
+{
+friend class PrintContext;
+friend class Printer; // for saved device strings
+#ifdef APDK_APOLLO2XXX
+friend class Apollo2xxx; // it needs to check the specific model string
+#endif
+friend class Tester;
+friend class AsciiScripter;
+friend class BinaryScripter;
+public:
+ SystemServices();
+ virtual ~SystemServices();
+
+ /*!
+ Check this member variable for the validity of the constructed object.
+ Calling code must check that the value of this variable is NO_ERROR before
+ proceeding.
+ \sa DRIVER_ERROR
+ */
+ DRIVER_ERROR constructor_error;
+
+ //! Must include in derived class constructor (if using bi-di)
+ DRIVER_ERROR InitDeviceComm();
+
+ /////////////////////////////////////////////////////////////////////
+ IO_MODE IOMode;
+
+ //! Passes a command to the I/O system to send all data to the printer immediately.
+ /*!
+ A typical I/O system either buffer data or send data immediatly. If the I/O
+ system is buffering data then typically store all data sent in a buffer until it
+ has some amount of data (say 1, 2, or 4 Kbytes) then will send that block of data
+ to the printer. In some cases, it may be necessary that data that has just been
+ sent to the I/O system reach the printer ASAP, at which point the printer driver
+ will check the status or deviceID string of the printer and continue. Often,
+ USB implementations will favor the block-send mechanism because it is more
+ efficient through the system's call stack. Simple and traditional centronics
+ I/O is usually not buffered, but this is still a system-by-system I/O preference.
+
+ If the I/O system is buffering data into blocks before sending to the printer,
+ this command should pass a command to the I/O system to stop waiting and send
+ everything it has to the printer now. The base implimentation simply returns
+ NO_ERROR and is appropriate for a system that does not buffer I/O.
+
+ \note The appropriate way to handle a FlushIO on a buffered system is to call
+ the USB class driver's I/O Control routine with a flush command. If the USB
+ class driver has no flush command then check to see if it has timed flush
+ (it auto-flushes every n [milli]seconds). If it does then the base FlushIO
+ method will work okay.
+
+ \warning In the past some have implemented flush by sending 10K nulls to the USB
+ driver. Currently this does work and will cause data already in the buffer
+ to be sent to the printer. Current printers ignore the null, however, there
+ may be printers in the future that cannot handle this behavior.
+ */
+ virtual DRIVER_ERROR FlushIO() { return NO_ERROR; }
+
+ //! Tells the I/O system that the print job has ended prematurely.
+ /*!
+ This routine instructs the I/O system that this print job has ended
+ prematurely, that no further data will be sent and that any data being held
+ in a "send" buffer can be thrown away. This command is optional and depends
+ on the implementation of the I/O system. In some error conditions, the
+ printer is incapable of accepting more data. The printer driver will sense
+ this error and stop sending data, but if the I/O system has buffered data
+ it may continue to wait for the printer to accept this remaining data
+ before unloading. This mechanism will allow for a more efficient clean up
+ of the aborted job.
+ */
+ virtual DRIVER_ERROR AbortIO() { return NO_ERROR; }
+
+ /*!
+ Uses message code to relay a message to the user. Must be implemented in
+ derived class provided by developer. This routine will cause a corresponding
+ text string (or graphic, or both) to be displayed to the user to inform them
+ of printer status. This is how printer events such as out-of-paper will be
+ communicated to the user.
+ */
+ virtual void DisplayPrinterStatus (DISPLAY_STATUS ePrinterStatus)=0;
+
+ /*!
+ Must be implemented in derived class. Waits for the specified number of
+ milliseconds before returning to the caller. Gives host system a chance to
+ process asynchronous events. Derived implimentation of BusyWait MUST allow
+ the processing of asynchronous events such as user interface changes, response
+ to dialogs or pop-ups. The BusyWait method should return NO_ERROR if we should
+ continue processing. The APDK core code calls busy wait within loops (when
+ the printer is out of paper, has no pen, etc...) and will continue when the
+ user has fixed the problem. If the user wants to cancel the job then the
+ implemented version of BusyWait must return JOB_CANCELED so that the APDK
+ stops retrying and cancels the job.
+ */
+ virtual DRIVER_ERROR BusyWait(DWORD msec)=0;
+
+ /*!
+ Retrieves the device identifier string from the printer.
+
+ \param strID Pointer to buffer for storing string.
+ \param iSize The size of buffer.
+ \return IO_ERROR
+ */
+ virtual DRIVER_ERROR ReadDeviceID(BYTE* strID, int iSize)=0;
+
+ /*!
+ This method will allocate a contiguous block of memory at least iMemSize bytes long.
+
+ \param iMemSize - size of block.
+ \return Pointer to the memory block. Can also return NULL, if allocation failed.
+ */
+ virtual BYTE* AllocMem (int iMemSize)=0;
+
+ /*!
+ Frees a given block of memory previously allocated with AllocMem.
+
+ \param pMem - pointer to the block of memory to be freed.
+ */
+ virtual void FreeMem (BYTE* pMem)=0;
+
+ virtual BOOL PrinterIsAlive();
+
+ /*!
+ This method reads status register from printer. If the parallel status byte
+ is returned, the function returns TRUE when it sets this value. Otherwise
+ the function returns FALSE if this functionality is not supported.
+
+ \param bStatReg Pointer to a byte into which status register will be copied.
+
+ \return TRUE The value is set after returning the parallel status byte,
+ FALSE if the functionality is not supported.
+ */
+ virtual BOOL GetStatusInfo(BYTE* bStatReg)=0;
+
+ /*!
+ Sends bytes of data to the printer.
+ \note This method decrements the dwCount parameter (*dwCount) by the number
+ of bytes that were actually sent.
+
+ \param pBuffer pointer to buffer full of data.
+ \param dwCount (in/out) Upon entry, this contains the number of bytes of
+ data requested to send. Upon return from the method, dwCount is the number
+ of bytes that were not sent, i.e. the remaining bytes.
+ */
+ virtual DRIVER_ERROR ToDevice(const BYTE* pBuffer, DWORD* dwCount)=0;
+
+ /*!
+ Gets data from printer.
+
+ \param pReadBuff Pointer to buffer into which data is to be copied.
+ \param wReadCount Output parameter (pointer to allocated DWORD) telling
+ number of bytes copied.
+ */
+ virtual DRIVER_ERROR FromDevice(BYTE* pReadBuff, DWORD* wReadCount)=0;
+
+ virtual DRIVER_ERROR GetECPStatus(BYTE *pStatusString,int *pECPLength, int ECPChannel);
+
+ /*!
+ This routine will query the system for the current tick count (time).
+ Since it will be used primarily for retry time-outs in the driver, it only
+ needs to provide a running count of elapsed time since the device was booted,
+ for example.
+
+ \return DWORD Number of ticks for current tick count.
+ */
+ virtual DWORD GetSystemTickCount (void)=0;
+
+ virtual float power(float x, float y)=0;
+
+ /*!
+ Returns the model portion of the firmware ID string from the printer.
+ */
+ const char* PrinterModel() { return strModel; }
+
+ /*!
+ Returns the size of the send buffer.
+ */
+ unsigned int GetSendBufferSize() const { return iSendBufferSize; }
+
+#if defined (APDK_DJ3320)
+ /*!
+ This method return the reads Crossbow/Spear vertical alignment value from printer.
+ If the vertical alignment value is set by the user from host,
+ the function returns TRUE. Otherwise the function returns FALSE if this functionality
+ is not supported.
+
+ \param cVertAlignVal Pointer to a byte into which vertical alignment value will be copied.
+
+ \return TRUE The value is set after returning the vertical alignment value,
+ FALSE if the functionality is not supported.
+ */
+ virtual BOOL GetVerticalAlignmentValue(BYTE* cVertAlignVal) { return FALSE; }
+
+ /*!
+ This method reads Crossbow/Spear vertical alignment value from the device during
+ printer instantiation. The value is saved for later calls by GetVerticalAlignmentValue.
+
+ \return TRUE valid value read,
+ FALSE invalid value or not supported.
+ */
+
+ virtual BOOL GetVertAlignFromDevice() { return FALSE; }
+#endif
+
+// utilities ///////////////////////////////////////////////////////
+
+ // call FreeMem after checking for null ptr
+ DRIVER_ERROR FreeMemory(void *ptr);
+ DRIVER_ERROR GetDeviceID(BYTE* strID, int iSize, BOOL query);
+
+ /*!
+ Return the VIP version of the firmware ID from the printer.
+ */
+ int GetVIPVersion () { return VIPVersion; }
+
+#if defined(APDK_CAPTURE)
+ Scripter *pScripter;
+ /*!
+ Begin recording script for debugging.
+ \param FileName Name of the output file which will hold the script.
+ \param ascii If TRUE use ASCII implementation. Otherwise, use binary.
+ */
+ DRIVER_ERROR InitScript(const char* FileName, BOOL ascii, BOOL read=FALSE);
+
+ /*!
+ Stop recording script for debugging.
+ */
+ DRIVER_ERROR EndScript();
+
+ BOOL Capturing;
+ BOOL replay;
+#endif
+
+ virtual int GetPJLHeaderBuffer (char **szPJLBuffer)
+ {
+ return 0;
+ }
+
+protected:
+ virtual void AdjustIO(IO_MODE IM, const char* model = NULL);
+
+ BYTE strDevID[DevIDBuffSize]; // save whole DevID string
+
+ unsigned int iSendBufferSize;
+
+
+ PORTID ePortID;
+
+ DeviceRegistry* DR;
+
+ char strModel[DevIDBuffSize]; // to contain the MODEL (MDL) from the DevID
+ char strPens[132]; // to contain the VSTATUS penID from the DevID
+ int VIPVersion; // VIP version from the DevID
+
+ // for internal use
+ virtual BYTE* AllocMem (int iMemSize, BOOL trackmemory)
+ { return AllocMem(iMemSize); }
+
+ virtual void FreeMem (BYTE* pMem, BOOL trackmemory)
+ { FreeMem(pMem); }
+
+}; //SystemServices
+
+APDK_END_NAMESPACE
+
+
+#endif //APDK_SYSTEMSERVICES_H
diff --git a/prnt/hpijs/translator.cpp b/prnt/hpijs/translator.cpp
new file mode 100644
index 0000000..e4b8515
--- /dev/null
+++ b/prnt/hpijs/translator.cpp
@@ -0,0 +1,100 @@
+/*****************************************************************************\
+ translator.h : Implimentation for the RasterSender class
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+
+#include "header.h"
+#include "halftoner.h"
+
+APDK_BEGIN_NAMESPACE
+
+RasterSender::RasterSender(Printer* pP, PrintContext* pPC,
+ Job* pJob,Halftoner* pHalftoner)
+ : thePrinter(pP), thePrintContext(pPC), theJob(pJob),theHalftoner(pHalftoner)
+{
+ constructor_error=NO_ERROR;
+ m_lNBlankRasters = 0;
+}
+
+RasterSender::~RasterSender()
+{
+}
+
+////////////////////////////////////////////////////////////////////////
+BOOL RasterSender::Process(RASTERDATA* InputRaster)
+{
+ DRIVER_ERROR err=NO_ERROR;
+ BOOL bOutput=FALSE;
+ if (InputRaster && (InputRaster->rasterdata[COLORTYPE_COLOR] || InputRaster->rasterdata[COLORTYPE_BLACK]))
+ {
+ err=SendRaster(InputRaster);
+ if (err==NO_ERROR)
+ bOutput=TRUE;
+ }
+ else
+ {
+
+/*
+ * Replace CAP move command here with vertical raster move command.
+ * If buffering this causes code bloat, do send the command here.
+ */
+ err = theJob->SendCAPy ();
+
+ }
+
+ myphase->err = err;
+
+ return bOutput;
+}
+
+
+DRIVER_ERROR RasterSender::SendRaster(RASTERDATA* InputRaster)
+{
+ DRIVER_ERROR err;
+ BOOL lastplane,firstplane;
+
+ if (theHalftoner)
+ {
+ lastplane = theHalftoner->LastPlane();
+ firstplane = theHalftoner->FirstPlane();
+ }
+ else lastplane=firstplane=TRUE;
+
+ // older code used to send regular CAPy move as part of text-synchronization scheme
+ if (firstplane)
+ err=theJob->SendCAPy();
+
+ err = thePrinter->Encapsulate (InputRaster, lastplane);
+ ERRCHECK;
+
+ return err;
+}
+
+APDK_END_NAMESPACE
+
diff --git a/prnt/hpijs/unistd_.h b/prnt/hpijs/unistd_.h
new file mode 100644
index 0000000..11b51fe
--- /dev/null
+++ b/prnt/hpijs/unistd_.h
@@ -0,0 +1,34 @@
+/**
+ * Copyright (c) 2001-2002 artofcode LLC.
+ *
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use, copy,
+ * modify, merge, publish, distribute, sublicense, and/or sell copies
+ * of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+**/
+
+/* unistd_.h */
+#ifdef _MSC_VER
+#include <process.h>
+#include <io.h>
+#include <fcntl.h>
+#define read(handle, buffer, count) _read(handle, buffer, count)
+#define write(handle, buffer, count) _write(handle, buffer, count)
+#else
+#include <unistd.h>
+#endif
diff --git a/prnt/hpijs/version.cpp b/prnt/hpijs/version.cpp
new file mode 100644
index 0000000..f0ad64f
--- /dev/null
+++ b/prnt/hpijs/version.cpp
@@ -0,0 +1,46 @@
+/*****************************************************************************\
+ version.cpp : Definition of DeveloperString
+
+ Copyright (c) 1996 - 2001, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+#include "config.h"
+
+APDK_BEGIN_NAMESPACE
+
+/*! \addtogroup globals
+@{
+*/
+
+/*! Used for inserting unique information for your platform.
+Can be edited here or copied to during construction of your derived Services class
+to change information. Do not change size of the string.
+*/
+char DeveloperString[32]="[platform-specific information]";
+
+/*! @} */
+APDK_END_NAMESPACE
diff --git a/prnt/hpijs/versioncode.cpp b/prnt/hpijs/versioncode.cpp
new file mode 100644
index 0000000..a07d9ad
--- /dev/null
+++ b/prnt/hpijs/versioncode.cpp
@@ -0,0 +1,190 @@
+/*****************************************************************************\
+ versioncode.cpp : version information routines
+
+ Copyright (c) 1996 - 2002, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+\*****************************************************************************/
+
+#include "header.h"
+#include "printerfactory.h"
+
+APDK_BEGIN_NAMESPACE
+extern BOOL ProprietaryImaging();
+extern BOOL ProprietaryScaling();
+APDK_END_NAMESPACE
+
+APDK_BEGIN_NAMESPACE
+
+extern char DeveloperString[32];
+
+/*! \addtogroup globals
+@{
+*/
+
+const char VersionStringID[21] = "04.09.00A_11-06-2009"; //!< Version information
+
+char result[500];
+
+void HP_strcat(char* str1, const char* str2)
+{
+ while(*str1)
+ {
+ str1++;
+ }
+ while( (*str1++ = *str2++) )
+ {
+ // nothing. Just copying str2 to str1
+ ;
+ }
+}
+
+
+/*!
+Returns a string identifying components and features of the driver build.
+If bCompressed is TRUE then the string returned is a bit representation string
+of the build options (ie. speed, scaling, capture, etc...). If bCompressed is
+FALSE then the string is a textual concatenation of the developer build string,
+the APDK version string, and string representation of the build options.
+
+This function returns a string identifying components and features of the driver
+build, such as which printer-models are supported, whether font and scaling
+support is included, and other information intended to help solve customer problems.
+
+\param int bCompressed If true, the information is packed into a decimal number
+that may be decoded by Hewlett-Packard. Otherwise, the string consists of
+human-readable indicators.
+\return char* string representing version information.
+\note If bCompressed is TRUE then the return string has only build options and
+no version information.
+*/
+char* Version(BOOL bCompressed)
+{
+ if (bCompressed)
+ {
+ unsigned int bits=0;
+
+ if (ProprietaryScaling())
+ bits = bits | 0x80000000;
+
+#ifdef APDK_CAPTURE
+ bits = bits | 0x40000000;
+#endif
+
+#ifdef APDK_LITTLE_ENDIAN
+ bits = bits | 0x20000000;
+#endif
+
+ if (ProprietaryImaging())
+ bits = bits | 0x10000000;
+
+#ifdef APDK_COURIER
+ bits = bits | 0x08000000;
+#endif
+#ifdef APDK_CGTIMES
+ bits = bits | 0x04000000;
+#endif
+#ifdef APDK_LTRGOTHIC
+ bits = bits | 0x02000000;
+#endif
+#ifdef APDK_UNIVERS
+ bits = bits | 0x01000000;
+#endif
+
+#ifdef APDK_OPTIMIZE_FOR_SPEED
+ bits = bits | 0x00800000;
+#endif
+
+ bits = bits | pPFI->GetModelBits();
+
+ // room left for 23 more here
+ sprintf(result,"%0x", bits);
+ }
+ else
+ {
+ strcpy(result,DeveloperString);
+ HP_strcat(result,"!!");
+ HP_strcat(result,VersionStringID);
+ HP_strcat(result," ");
+
+ if (ProprietaryScaling())
+ HP_strcat(result,"propscale ");
+ else
+ HP_strcat(result,"openscale ");
+
+ if (ProprietaryImaging())
+ HP_strcat(result,"propimg ");
+ else
+ HP_strcat(result,"openimg ");
+
+#ifdef APDK_CAPTURE
+ HP_strcat(result,"debug ");
+#else
+ HP_strcat(result,"normal ");
+#endif
+
+#ifdef APDK_LITTLE_ENDIAN
+ HP_strcat(result,"little_endian ");
+#else
+ HP_strcat(result,"big_endian ");
+#endif
+
+#if defined(APDK_FONTS_NEEDED)
+ HP_strcat(result,"fonts:");
+#else
+ HP_strcat(result,"no_fonts");
+#endif
+#ifdef APDK_COURIER
+ HP_strcat(result,"C");
+#endif
+#ifdef APDK_CGTIMES
+ HP_strcat(result,"T");
+#endif
+#ifdef APDK_LTRGOTHIC
+ HP_strcat(result,"L");
+#endif
+#ifdef APDK_UNIVERS
+ HP_strcat(result,"U");
+#endif
+ HP_strcat(result," ");
+
+#ifdef APDK_OPTIMIZE_FOR_SPEED
+ HP_strcat(result,"speed ");
+#else
+ HP_strcat(result,"memory ");
+#endif
+
+ char modelstring[300];
+ pPFI->GetModelString(modelstring, sizeof(modelstring));
+ HP_strcat(result, modelstring);
+
+ }
+
+ return result;
+} //Version
+
+/*! @} */
+
+APDK_END_NAMESPACE
diff --git a/prnt/hpps/hppsfilter.c b/prnt/hpps/hppsfilter.c
new file mode 100644
index 0000000..d6ab7a8
--- /dev/null
+++ b/prnt/hpps/hppsfilter.c
@@ -0,0 +1,231 @@
+/*****************************************************************************\
+ hppsfilter.c : HP PS filter for PostScript printers
+
+ Copyright (c) 2011, Hewlett-Packard Co.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the Hewlett-Packard nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ NOT LIMITED TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+ Author: Yashwant Kumar Sahu
+\*****************************************************************************/
+
+#include <stdio.h>
+#include <string.h>
+#include <memory.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <cups/cups.h>
+#include <cups/ppd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#define PJL_HEADER "\x1B%-12345X@PJL\x0A"
+#define BOD_PJL_FIXED "0400040101020D10100115"
+#define BOD_PPD_ATR "HPBOD"
+#define BOD_PJL "@PJL DMINFO ASCIIHEX=\"%s%s\"\012"
+#define BOD_DATETIME_FORMAT "%04d%02d%02d%02d%02d%02d"
+#define DBG_PSFILE "/tmp/hpps_job%d.out"
+
+#define LINE_SIZE 258
+#define FILE_NAME_SIZE 128
+
+#define SAVE_PS_FILE 2
+
+/* save final output ps file: in cupsd.conf file value #hpLogLevel 15 */
+static int g_savepsfile = 0;
+
+/* final ps outfile file handle */
+static FILE *g_fp_outdbgps = NULL;
+
+/* get log level from the cups config file */
+void get_LogLevel ()
+{
+ FILE *fp;
+ char str[258];
+ char *p;
+ fp = fopen ("/etc/cups/cupsd.conf", "r");
+ if (fp == NULL)
+ return;
+ while (!feof (fp))
+ {
+ if (!fgets (str, 256, fp))
+ {
+ break;
+ }
+ if ((p = strstr (str, "hpLogLevel")))
+ {
+ p += strlen ("hpLogLevel") + 1;
+ g_savepsfile = atoi (p);
+ break;
+ }
+ }
+ fclose (fp);
+}
+
+
+/* create ps file for debugging purpose using job id */
+void open_dbg_outfile(char* szjob_id)
+{
+ g_fp_outdbgps = NULL;
+ if (g_savepsfile & SAVE_PS_FILE)
+ {
+ char sfile_name[FILE_NAME_SIZE] = {0};
+ sprintf(sfile_name, DBG_PSFILE, szjob_id);
+ g_fp_outdbgps= fopen(sfile_name, "w");
+ chmod(sfile_name, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
+ }
+}
+
+/* Writting into out file and debug file if debug level is set to 15 */
+int hpwrite (void *pBuffer, size_t size)
+{
+ int ndata_written = 0;
+ if(g_fp_outdbgps)
+ {
+ ndata_written = fwrite (pBuffer, 1, size, g_fp_outdbgps);
+ }
+
+ ndata_written = write (STDOUT_FILENO, pBuffer, size);
+ return ndata_written;
+}
+
+/* Read HPBOD attribute from PPD
+ return 1 if set as 1 */
+int require_bod()
+{
+ int bodRequire = 0;
+ ppd_attr_t *pattr = NULL;
+ ppd_file_t *pppd = NULL;
+ pppd = ppdOpenFile(getenv("PPD"));
+ if (pppd == NULL) {
+ fprintf (stderr, "HP PS : ppdOpenFile failed for %s\n", getenv("PPD"));
+ return 0;
+ }
+
+ if (((pattr = ppdFindAttr(pppd, BOD_PPD_ATR, NULL)) != NULL) &&
+ (pattr && pattr->value != NULL)) {
+ bodRequire = atoi(pattr->value);
+ }
+ return bodRequire;
+}
+
+/* Write BOD PJL command DMINFO */
+void emmit_bod_command()
+{
+ struct tm *tgmt = NULL;
+ time_t long_time;
+ char sBOD[100] = {0};
+ char sBOD_Var[29] = {0};
+ char sDateTime[15] = {0};
+ int index = 0;
+
+ time(&long_time);
+ tgmt = gmtime(&long_time);
+
+ sprintf(sDateTime, BOD_DATETIME_FORMAT, (tgmt->tm_year + 1900),
+ (tgmt->tm_mon + 1), tgmt->tm_mday, tgmt->tm_hour, tgmt->tm_min, tgmt->tm_sec);
+
+ for (index = 0; index < (sizeof(sDateTime) -1); index++)
+ {
+ sprintf( sBOD_Var + (index*2), "%2X", sDateTime[index ]);
+ }
+
+ sprintf(sBOD, BOD_PJL, BOD_PJL_FIXED, sBOD_Var);
+ fprintf (stderr, "HP PS filter sending BOD PJL: - %s\n", sBOD);
+ hpwrite (sBOD, strlen (sBOD));
+}
+
+int main (int argc, char **argv)
+{
+ cups_file_t *fp_input = NULL; /* input file: stdin or physical file */
+ char line[LINE_SIZE] = {0};
+
+ get_LogLevel();
+ setbuf (stderr, NULL);
+ fprintf (stderr, "HP PS filter starting : %s \n", *argv);
+
+ int i = 0;
+ /* Logging cups filter arguments */
+ for ( i = 0; i < argc; i++)
+ {
+ fprintf (stderr, "DEBUG: hppsfilter: argv[%d] = %s\n", i, argv[i]);
+ }
+
+ /* Logging debug information and creating outfile for debug */
+ if (g_savepsfile & SAVE_PS_FILE)
+ {
+ /* opening ps debug file */
+ open_dbg_outfile(argv[1]);
+ }
+
+ /* Check command-line... */
+ if (argc < 6 || argc > 7)
+ {
+ fputs("ERROR: hppsfilter job-id user title copies options [file]\n", stderr);
+ return (1);
+ }
+
+ /* If we have 7 arguments, print the file named on the command-line.
+ * Otherwise, send stdin instead... */
+ if (argc == 6)
+ fp_input = cupsFileStdin();
+ else
+ {
+ /* Try to open the print file... */
+ if ((fp_input = cupsFileOpen(argv[6], "r")) == NULL)
+ {
+ fprintf(stderr, "ERROR: Unable to open print file \"%s\" - %s\n",
+ argv[6], strerror);
+ return (1);
+ }
+ }
+
+ int len = 0;
+ int ibodwritten = 0;
+ int ireqire_bod = require_bod();
+ while ( ( len = cupsFileGetLine(fp_input, line, sizeof(line) )) > 0)
+ {
+ hpwrite (line, len);
+ /* if BOD is reqire, writting BOD command */
+ if ( !ibodwritten && (!strncmp(line, "@PJL JOB NAME", 13)) && ireqire_bod)
+ {
+ fprintf (stderr, "HP PS filter: Matched start PJL\n");
+ ibodwritten = 1;
+ emmit_bod_command();
+ }
+ }
+
+ if ( (argc == 7) && (fp_input != NULL) )
+ cupsFileClose (fp_input);
+
+ if(g_fp_outdbgps != NULL)
+ {
+ fclose (g_fp_outdbgps);
+ }
+
+ fprintf (stderr, "HP PS filter Ends\n");
+ return 0;
+}
diff --git a/prnt/ldl.py b/prnt/ldl.py
new file mode 100644
index 0000000..7a4cad6
--- /dev/null
+++ b/prnt/ldl.py
@@ -0,0 +1,379 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2007 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+
+# Std Lib
+import struct
+import sys
+
+
+PACKET_FRAME = ord('$')
+PACKET_PAD = 0xff
+CMD_HEADER_FMT = ">BHBBBHH" # 10 bytes
+
+# Packet types
+PACKET_TYPE_COMMAND = 0
+PACKET_TYPE_DISABLE_PACING = 1
+PACKET_TYPE_ENABLE_PACING = 2
+PACKET_TYPE_RESUME_NORMAL_OPERATION = 3
+PACKET_TYPE_DISABLE_RESPONSES = 4
+PACKET_TYPE_ENABLE_RESPONSES = 5
+PACKET_TYPE_RESET_LIDIL = 6
+PACKET_TYPE_SYNC = 7
+PACKET_TYPE_SYNC_COMPLETE = 8
+
+# Commands
+
+# Handle Pen
+COMMAND_HANDLE_PEN = 8
+COMMAND_HANDLE_PEN_ENTER_PEN_CHANGE = 0
+COMMAND_HANDLE_PEN_COMPLETE_PEN_CHANGE = 1
+COMMAND_HANDLE_PEN_CLEAN_LEVEL1 = 2
+COMMAND_HANDLE_PEN_CLEAN_LEVEL2 = 3
+COMMAND_HANDLE_PEN_CLEAN_LEVEL3 = 4
+
+# Set ZCA
+COMMAND_ZCA = 12
+COMMAND_ZCA_OPERATION = 11
+
+# 0.3.8 Set Printer Alignment
+COMMAND_SET_PRINTER_ALIGNMENT = 12
+COMMAND_SET_PRINTER_ALIGNMENT_OPERATION = 6
+
+# 0.4.3 Set Pen Alignment
+COMMAND_SET_PEN_ALIGNMENT = 12
+COMMAND_SET_PEN_ALIGNMENT_OPERATION = 18
+COMMAND_SET_PEN_ALIGNMENT_PEN_BLACK = 0
+COMMAND_SET_PEN_ALIGNMENT_PEN_COLOR = 1
+COMMAND_SET_PEN_ALIGNMENT_PEN_PHOTO = 2
+COMMAND_SET_PEN_ALIGNMENT_ITEM_HORT = 0
+COMMAND_SET_PEN_ALIGNMENT_ITEM_VERT = 1
+COMMAND_SET_PEN_ALIGNMENT_ITEM_BIDI = 2
+
+# Set Pens Aligned
+COMMAND_SET_PENS_ALIGNED = 12
+COMMAND_SET_PENS_ALIGNED_OPERATION = 14
+COMMAND_SET_PENS_ALIGNED_K = 0x01
+COMMAND_SET_PENS_ALIGNED_C = 0x02
+COMMAND_SET_PENS_ALIGNED_M = 0x04
+COMMAND_SET_PENS_ALIGNED_Y = 0x08
+COMMAND_SET_PENS_ALIGNED_c = 0x10
+COMMAND_SET_PENS_ALIGNED_m = 0x20
+COMMAND_SET_PENS_ALIGNED_k = 0x40
+
+# Set Hue Compensation
+COMMAND_SET_HUE_COMPENSATION = 12
+COMMAND_SET_HUE_COMPENSATION_OPERATION = 16
+COMMAND_SET_HUE_COMPENSATION_PEN_COLOR = 0
+COMMAND_SET_HUE_COMPENSATION_PEN_PHOTO = 1
+
+# Print internal page 0.3.8 and 0.4.3
+COMMAND_PRINT_INTERNAL_PAGE = 12
+COMMAND_PRINT_INTERNAL_PAGE_OPERATION = 17
+
+# 0.5.4 Report Page
+COMMAND_REPORT_PAGE = 12
+COMMAND_REPORT_PAGE_OPERATION = 21
+COMMAND_REPORT_PAGE_PEN_CALIBRATION = 81
+COMMAND_REPORT_PAGE_PEN_CALIBRATION_VERIFY = 82
+
+# 0.5.4 Set Pen Alignment 3
+COMMAND_SET_PEN_ALIGNMENT_3 = 12
+COMMAND_SET_PEN_ALIGNMENT_3_OPERATION = 23
+COMMAND_SET_PEN_ALIGNMENT_3_K = 0x01
+COMMAND_SET_PEN_ALIGNMENT_3_C = 0x02
+COMMAND_SET_PEN_ALIGNMENT_3_M = 0x04
+COMMAND_SET_PEN_ALIGNMENT_3_Y = 0x08
+COMMAND_SET_PEN_ALIGNMENT_3_COLOR = 0x0e
+COMMAND_SET_PEN_ALIGNMENT_3_c = 0x10
+COMMAND_SET_PEN_ALIGNMENT_3_m = 0x20
+COMMAND_SET_PEN_ALIGNMENT_3_k = 0x40
+COMMAND_SET_PEN_ALIGNMENT_3_PHOTO = 0x70
+
+# Printer queries
+COMMAND_QUERY = 5
+QUERY_PRINTER_ALIGNMENT = 3 # 0.3.8
+QUERY_PEN_ALIGNMENT = 15 # 0.4.3
+
+# 0.5.4 Dynamic counters
+COMMAND_DYNAMIC_COUNTERS = 12
+COMMAND_DYNAMIC_COUNTERS_OPERATION = 5
+
+
+def buildLIDILPacket(packet_type, command=0, operation=0, other={}):
+ p = ''
+
+ if packet_type == PACKET_TYPE_DISABLE_PACING:
+ p = '$\x00\x10\x00\x01\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff$'
+
+ elif packet_type == PACKET_TYPE_ENABLE_PACING:
+ p = '$\x00\x10\x00\x02\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff$'
+
+ elif packet_type == PACKET_TYPE_RESUME_NORMAL_OPERATION:
+ p = '$\x00\x10\x00\x03\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff$'
+
+ elif packet_type == PACKET_TYPE_ENABLE_RESPONSES:
+ p = '$\x00\x10\x00\x05\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff$'
+
+ elif packet_type == PACKET_TYPE_DISABLE_RESPONSES:
+ p = '$\x00\x10\x00\x04\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff$'
+
+ elif packet_type == PACKET_TYPE_SYNC:
+ fmt = ''.join([CMD_HEADER_FMT, 'B'*245, 'B', 'B'*2048])
+ p = struct.pack(fmt, PACKET_FRAME, 256, 0, PACKET_TYPE_SYNC, 0, 0, 2048, (0,)*245,
+ PACKET_FRAME, (0,)*2048)
+
+ elif packet_type == PACKET_TYPE_SYNC_COMPLETE:
+ p = '$\x00\x10\x00\x08\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff$'
+
+ elif packet_type == PACKET_TYPE_RESET_LIDIL:
+ p = '$\x00\x10\x00\x06\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff$'
+
+ elif packet_type == PACKET_TYPE_COMMAND:
+
+ if command == COMMAND_HANDLE_PEN:
+ fmt = CMD_HEADER_FMT + "BBBBBB"
+ p = struct.pack(fmt, PACKET_FRAME, struct.calcsize(fmt), 0, PACKET_TYPE_COMMAND, command,
+ 0, 0, operation, PACKET_PAD, PACKET_PAD, PACKET_PAD, PACKET_PAD, PACKET_FRAME)
+
+ elif command == COMMAND_SET_PRINTER_ALIGNMENT and operation == COMMAND_SET_PRINTER_ALIGNMENT_OPERATION: # 0.3.8
+ fmt = CMD_HEADER_FMT + "BHBBBBBBBBBBBBB"
+ b = (0, 0, other['k_bidi'], other['c_vert'], other['c_hort'], other['c_bidi'],
+ other['c_vert'], other['c_hort'], other['c_bidi'], other['c_vert'],
+ other['c_hort'], other['c_bidi'], PACKET_FRAME)
+
+ p = struct.pack(fmt, PACKET_FRAME, struct.calcsize(fmt), 0, PACKET_TYPE_COMMAND, command,
+ 0, 0, operation, 0x0f, *b)
+
+ elif command == COMMAND_SET_PEN_ALIGNMENT and operation == COMMAND_SET_PEN_ALIGNMENT_OPERATION: # 0.4.3
+ fmt = CMD_HEADER_FMT + "BBBbBB"
+ p = struct.pack(fmt, PACKET_FRAME, struct.calcsize(fmt), 0, PACKET_TYPE_COMMAND, command,
+ 0, 0, operation, other['pen'], other['item'], other['value'],
+ PACKET_PAD, PACKET_FRAME)
+
+ elif command == COMMAND_REPORT_PAGE and operation == COMMAND_REPORT_PAGE_OPERATION: # 0.5.4
+ fmt = CMD_HEADER_FMT + "BHBBB"
+ p = struct.pack(fmt, PACKET_FRAME, struct.calcsize(fmt), 0, PACKET_TYPE_COMMAND, command,
+ 0, 0, operation, other['report'], PACKET_PAD, PACKET_PAD, PACKET_FRAME)
+
+ elif command == COMMAND_ZCA and operation == COMMAND_ZCA_OPERATION:
+ fmt = CMD_HEADER_FMT + "BBhBB"
+ p = struct.pack(fmt, PACKET_FRAME, struct.calcsize(fmt), 0, PACKET_TYPE_COMMAND, command,
+ 0, 0, operation, 0, other['zca'], PACKET_PAD, PACKET_FRAME)
+
+ elif command == COMMAND_SET_PENS_ALIGNED and operation == COMMAND_SET_PENS_ALIGNED_OPERATION:
+ fmt = CMD_HEADER_FMT + "BHBBB"
+ p = struct.pack(fmt, PACKET_FRAME, struct.calcsize(fmt), 0, PACKET_TYPE_COMMAND, command,
+ 0, 0, operation, other['colors'], PACKET_PAD, PACKET_PAD, PACKET_FRAME)
+
+ elif command == COMMAND_SET_HUE_COMPENSATION and operation == COMMAND_SET_HUE_COMPENSATION_OPERATION:
+ fmt = CMD_HEADER_FMT + "BBbBBB"
+ p = struct.pack(fmt, PACKET_FRAME, struct.calcsize(fmt), 0, PACKET_TYPE_COMMAND, command,
+ 0, 0, operation, other['which'], other['value'], PACKET_PAD,
+ PACKET_PAD, PACKET_FRAME)
+
+ elif command == COMMAND_QUERY:
+ fmt = CMD_HEADER_FMT + "BBHBB"
+ p = struct.pack(fmt, PACKET_FRAME, struct.calcsize(fmt), 0, PACKET_TYPE_COMMAND, COMMAND_QUERY,
+ 0, 0, 0, operation, 0, PACKET_PAD, PACKET_FRAME)
+
+ elif command == COMMAND_PRINT_INTERNAL_PAGE and operation == COMMAND_PRINT_INTERNAL_PAGE_OPERATION:
+ fmt = CMD_HEADER_FMT + "BBBBBB"
+ p = struct.pack(fmt, PACKET_FRAME, struct.calcsize(fmt), 0, PACKET_TYPE_COMMAND, command,
+ 0, 0, operation, PACKET_PAD, PACKET_PAD,
+ PACKET_PAD, PACKET_PAD, PACKET_FRAME)
+
+ elif command == COMMAND_SET_PEN_ALIGNMENT_3 and operation == COMMAND_SET_PEN_ALIGNMENT_3_OPERATION: # 0.5.4
+ selections = other['selections']
+ num_selections = len(selections)
+ selections.append(PACKET_FRAME)
+ fmt = CMD_HEADER_FMT + "BIB" + "B"*(num_selections+1)
+
+ p = struct.pack(fmt, PACKET_FRAME, struct.calcsize(fmt), 0, PACKET_TYPE_COMMAND, command,
+ 0, 0, operation, other['active_colors'],
+ num_selections, *selections)
+
+ elif command == COMMAND_DYNAMIC_COUNTERS and operation == COMMAND_DYNAMIC_COUNTERS_OPERATION: # 0.5.4
+ fmt = CMD_HEADER_FMT + "BIB"
+
+ p = struct.pack(fmt, PACKET_FRAME, struct.calcsize(fmt), 0, PACKET_TYPE_COMMAND, command,
+ 0, 0, operation, other['counter'], PACKET_FRAME)
+
+
+ assert len(p) >= 16
+
+ return p
+
+
+
+def buildSyncPacket():
+ return buildLIDILPacket(PACKET_TYPE_SYNC)
+
+def buildSyncCompletePacket():
+ return buildLIDILPacket(PACKET_TYPE_SYNC_COMPLETE)
+
+def buildResetPacket():
+ return buildLIDILPacket(PACKET_TYPE_RESET_LIDIL)
+
+def buildGetAlignmentValues038Packet():
+ return buildLIDILPacket(PACKET_TYPE_COMMAND, COMMAND_QUERY, QUERY_PRINTER_ALIGNMENT)
+
+def buildGetAlignmentValues043Packet():
+ return buildLIDILPacket(PACKET_TYPE_COMMAND, COMMAND_QUERY, QUERY_PEN_ALIGNMENT)
+
+def buildEnableResponsesPacket(enable=True):
+ if enable:
+ return buildLIDILPacket(PACKET_TYPE_ENABLE_RESPONSES)
+ else:
+ return buildLIDILPacket(PACKET_TYPE_DISABLE_RESPONSES)
+
+def buildSetPrinterAlignmentPacket(k_bidi,
+ c_vert,
+ c_hort,
+ c_bidi): # 0.3.8
+
+ return buildLIDILPacket(PACKET_TYPE_COMMAND, COMMAND_SET_PRINTER_ALIGNMENT,
+ COMMAND_SET_PRINTER_ALIGNMENT_OPERATION,
+ other={'c_vert' : c_vert,
+ 'c_hort' : c_hort,
+ 'c_bidi' : c_bidi,
+ 'k_bidi' : k_bidi,
+
+ })
+
+def buildPrintInternalPagePacket(): # Type 6
+ return buildLIDILPacket(PACKET_TYPE_COMMAND,
+ COMMAND_PRINT_INTERNAL_PAGE,
+ COMMAND_PRINT_INTERNAL_PAGE_OPERATION)
+
+
+def buildZCAPacket(value):
+ return buildLIDILPacket(PACKET_TYPE_COMMAND, COMMAND_ZCA,
+ COMMAND_ZCA_OPERATION,
+ other={'zca' : value})
+
+def buildBlackBidiPacket(value): # 0.4.3
+ return buildLIDILPacket(PACKET_TYPE_COMMAND, COMMAND_SET_PEN_ALIGNMENT,
+ COMMAND_SET_PEN_ALIGNMENT_OPERATION,
+ other={'pen' : COMMAND_SET_PEN_ALIGNMENT_PEN_BLACK,
+ 'item' : COMMAND_SET_PEN_ALIGNMENT_ITEM_BIDI,
+ 'value' : value})
+
+def buildPhotoBidiPacket(value): # 0.4.3
+ return buildLIDILPacket(PACKET_TYPE_COMMAND, COMMAND_SET_PEN_ALIGNMENT,
+ COMMAND_SET_PEN_ALIGNMENT_OPERATION,
+ other={'pen' : COMMAND_SET_PEN_ALIGNMENT_PEN_PHOTO,
+ 'item' : COMMAND_SET_PEN_ALIGNMENT_ITEM_BIDI,
+ 'value' : value})
+
+def buildColorBidiPacket(value): # 0.4.3
+ return buildLIDILPacket(PACKET_TYPE_COMMAND, COMMAND_SET_PEN_ALIGNMENT,
+ COMMAND_SET_PEN_ALIGNMENT_OPERATION,
+ other={'pen' : COMMAND_SET_PEN_ALIGNMENT_PEN_COLOR,
+ 'item' : COMMAND_SET_PEN_ALIGNMENT_ITEM_BIDI,
+ 'value' : value})
+
+
+def buildColorHortPacket(value): # 0.4.3
+ return buildLIDILPacket(PACKET_TYPE_COMMAND, COMMAND_SET_PEN_ALIGNMENT,
+ COMMAND_SET_PEN_ALIGNMENT_OPERATION,
+ other={'pen' : COMMAND_SET_PEN_ALIGNMENT_PEN_COLOR,
+ 'item' : COMMAND_SET_PEN_ALIGNMENT_ITEM_HORT,
+ 'value' : value})
+
+def buildColorVertPacket(value): # 0.4.3
+ return buildLIDILPacket(PACKET_TYPE_COMMAND, COMMAND_SET_PEN_ALIGNMENT,
+ COMMAND_SET_PEN_ALIGNMENT_OPERATION,
+ other={'pen' : COMMAND_SET_PEN_ALIGNMENT_PEN_COLOR,
+ 'item' : COMMAND_SET_PEN_ALIGNMENT_ITEM_VERT,
+ 'value' : value})
+
+def buildBlackVertPacket(value): # 0.4.3
+ return buildLIDILPacket(PACKET_TYPE_COMMAND, COMMAND_SET_PEN_ALIGNMENT,
+ COMMAND_SET_PEN_ALIGNMENT_OPERATION,
+ other={'pen' : COMMAND_SET_PEN_ALIGNMENT_PEN_BLACK,
+ 'item' : COMMAND_SET_PEN_ALIGNMENT_ITEM_VERT,
+ 'value' : value})
+def buildBlackHortPacket(value): # 0.4.3
+ return buildLIDILPacket(PACKET_TYPE_COMMAND, COMMAND_SET_PEN_ALIGNMENT,
+ COMMAND_SET_PEN_ALIGNMENT_OPERATION,
+ other={'pen' : COMMAND_SET_PEN_ALIGNMENT_PEN_BLACK,
+ 'item' : COMMAND_SET_PEN_ALIGNMENT_ITEM_HORT,
+ 'value' : value})
+
+def buildPhotoHortPacket(value): # 0.4.3
+ return buildLIDILPacket(PACKET_TYPE_COMMAND, COMMAND_SET_PEN_ALIGNMENT,
+ COMMAND_SET_PEN_ALIGNMENT_OPERATION,
+ other={'pen' : COMMAND_SET_PEN_ALIGNMENT_PEN_PHOTO,
+ 'item' : COMMAND_SET_PEN_ALIGNMENT_ITEM_HORT,
+ 'value' : value})
+def buildPhotoVertPacket(value): # 0.4.3
+ return buildLIDILPacket(PACKET_TYPE_COMMAND, COMMAND_SET_PEN_ALIGNMENT,
+ COMMAND_SET_PEN_ALIGNMENT_OPERATION,
+ other={'pen' : COMMAND_SET_PEN_ALIGNMENT_PEN_PHOTO,
+ 'item' : COMMAND_SET_PEN_ALIGNMENT_ITEM_VERT,
+ 'value' : value})
+
+def buildPhotoHuePacket(value): # 0.4.3
+ return buildLIDILPacket(PACKET_TYPE_COMMAND, COMMAND_SET_HUE_COMPENSATION,
+ COMMAND_SET_HUE_COMPENSATION_OPERATION,
+ other={'which' : COMMAND_SET_HUE_COMPENSATION_PEN_PHOTO,
+ 'value' : value})
+
+
+def buildColorHuePacket(value): # 0.4.3
+ return buildLIDILPacket(PACKET_TYPE_COMMAND, COMMAND_SET_HUE_COMPENSATION,
+ COMMAND_SET_HUE_COMPENSATION_OPERATION,
+ other={'which' : COMMAND_SET_HUE_COMPENSATION_PEN_COLOR,
+ 'value' : value})
+
+def buildSetPensAlignedPacket():
+ return buildLIDILPacket(PACKET_TYPE_COMMAND, COMMAND_SET_PENS_ALIGNED,
+ COMMAND_SET_PENS_ALIGNED_OPERATION,
+ other={'colors' : COMMAND_SET_PENS_ALIGNED_C |
+ COMMAND_SET_PENS_ALIGNED_M |
+ COMMAND_SET_PENS_ALIGNED_Y |
+ COMMAND_SET_PENS_ALIGNED_c |
+ COMMAND_SET_PENS_ALIGNED_m |
+ COMMAND_SET_PENS_ALIGNED_k |
+ COMMAND_SET_PENS_ALIGNED_K})
+
+def buildReportPagePacket(report): # 0.5.4
+ return buildLIDILPacket(PACKET_TYPE_COMMAND, COMMAND_REPORT_PAGE,
+ COMMAND_REPORT_PAGE_OPERATION,
+ other={'report': report})
+
+def buildSetPenAlignment3Packet(active_colors, selections): # 0.5.4
+ return buildLIDILPacket(PACKET_TYPE_COMMAND, COMMAND_SET_PEN_ALIGNMENT_3,
+ COMMAND_SET_PEN_ALIGNMENT_3_OPERATION,
+ other={'active_colors': active_colors,
+ 'selections': selections,})
+
+def buildDynamicCountersPacket(counter): # 0.5.4
+ return buildLIDILPacket(PACKET_TYPE_COMMAND, COMMAND_DYNAMIC_COUNTERS,
+ COMMAND_DYNAMIC_COUNTERS_OPERATION,
+ other={'counter': counter,})
+
+if __name__ == "__main__":
+
+ pass
+
+
diff --git a/prnt/pcl.py b/prnt/pcl.py
new file mode 100644
index 0000000..4710e97
--- /dev/null
+++ b/prnt/pcl.py
@@ -0,0 +1,56 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2007 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+# Std Lib
+import struct
+
+# Local
+from base import pml
+
+
+ESC = '\x1b'
+RESET = '\x1bE'
+UEL = '\x1b%-12345X'
+PJL_ENTER_LANG = "@PJL ENTER LANGUAGE=PCL3GUI\n"
+PJL_BEGIN_JOB = '@PJL JOB NAME="unnamed"\n'
+PJL_END_JOB = '@PJL EOJ\n'
+
+def buildPCLCmd(punc, letter1, letter2, data=None, value=None):
+ if data is None:
+ return ''.join([ESC, punc, letter1, str(value), letter2])
+
+ return ''.join([ESC, punc, letter1, str(len(data)), letter2, data])
+
+
+def buildEmbeddedPML(pml):
+ return ''.join([UEL, PJL_ENTER_LANG, RESET, pml, RESET, UEL])
+
+
+def buildEmbeddedPML2(pml):
+ return ''.join([RESET, UEL, PJL_BEGIN_JOB, PJL_ENTER_LANG, RESET, pml, RESET, PJL_END_JOB, RESET, UEL])
+
+
+def buildDynamicCounter(counter):
+ #return ''.join([UEL, PJL_ENTER_LANG, ESC, '*o5W\xc0\x01', struct.pack(">I", counter)[1:], UEL])
+ return ''.join([UEL, PJL_ENTER_LANG, ESC, '*o5W\xc0\x01', struct.pack(">I", counter)[1:], PJL_END_JOB, UEL])
+
+def buildRP(a, b, c, d, e):
+ return ''.join(['\x00'*600, RESET, UEL, PJL_ENTER_LANG, buildPCLCmd('&', 'b', 'W', pml.buildEmbeddedPMLSetPacket('1.1.1.36', a + b + c + d + e, pml.TYPE_STRING)), RESET, UEL])
diff --git a/prnt/ps/hp-business_inkjet_2250-ps.ppd.gz b/prnt/ps/hp-business_inkjet_2250-ps.ppd.gz
new file mode 100644
index 0000000..443b1d7
--- /dev/null
+++ b/prnt/ps/hp-business_inkjet_2250-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-business_inkjet_2280-ps.ppd.gz b/prnt/ps/hp-business_inkjet_2280-ps.ppd.gz
new file mode 100644
index 0000000..6788c25
--- /dev/null
+++ b/prnt/ps/hp-business_inkjet_2280-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-business_inkjet_2300-ps.ppd.gz b/prnt/ps/hp-business_inkjet_2300-ps.ppd.gz
new file mode 100644
index 0000000..bfbf144
--- /dev/null
+++ b/prnt/ps/hp-business_inkjet_2300-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-business_inkjet_2600-ps.ppd.gz b/prnt/ps/hp-business_inkjet_2600-ps.ppd.gz
new file mode 100644
index 0000000..8cc91b8
--- /dev/null
+++ b/prnt/ps/hp-business_inkjet_2600-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-business_inkjet_2800-ps.ppd.gz b/prnt/ps/hp-business_inkjet_2800-ps.ppd.gz
new file mode 100644
index 0000000..b0388aa
--- /dev/null
+++ b/prnt/ps/hp-business_inkjet_2800-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-business_inkjet_3000-ps.ppd.gz b/prnt/ps/hp-business_inkjet_3000-ps.ppd.gz
new file mode 100644
index 0000000..18b41b5
--- /dev/null
+++ b/prnt/ps/hp-business_inkjet_3000-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-cm8050_mfp_with_edgeline-ps.ppd.gz b/prnt/ps/hp-cm8050_mfp_with_edgeline-ps.ppd.gz
new file mode 100644
index 0000000..8fc6600
--- /dev/null
+++ b/prnt/ps/hp-cm8050_mfp_with_edgeline-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-cm8060_mfp_with_edgeline-ps.ppd.gz b/prnt/ps/hp-cm8060_mfp_with_edgeline-ps.ppd.gz
new file mode 100644
index 0000000..101bf9d
--- /dev/null
+++ b/prnt/ps/hp-cm8060_mfp_with_edgeline-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-color_laserjet-ps.ppd.gz b/prnt/ps/hp-color_laserjet-ps.ppd.gz
new file mode 100644
index 0000000..647e39a
--- /dev/null
+++ b/prnt/ps/hp-color_laserjet-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-color_laserjet_2500-ps.ppd.gz b/prnt/ps/hp-color_laserjet_2500-ps.ppd.gz
new file mode 100644
index 0000000..3e09f54
--- /dev/null
+++ b/prnt/ps/hp-color_laserjet_2500-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-color_laserjet_2500_series-ps.ppd.gz b/prnt/ps/hp-color_laserjet_2500_series-ps.ppd.gz
new file mode 100644
index 0000000..834957c
--- /dev/null
+++ b/prnt/ps/hp-color_laserjet_2500_series-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-color_laserjet_2550_series-ps.ppd.gz b/prnt/ps/hp-color_laserjet_2550_series-ps.ppd.gz
new file mode 100644
index 0000000..417ca58
--- /dev/null
+++ b/prnt/ps/hp-color_laserjet_2550_series-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-color_laserjet_2605-ps.ppd.gz b/prnt/ps/hp-color_laserjet_2605-ps.ppd.gz
new file mode 100644
index 0000000..45b7fea
--- /dev/null
+++ b/prnt/ps/hp-color_laserjet_2605-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-color_laserjet_2605dn-ps.ppd.gz b/prnt/ps/hp-color_laserjet_2605dn-ps.ppd.gz
new file mode 100644
index 0000000..84ef597
--- /dev/null
+++ b/prnt/ps/hp-color_laserjet_2605dn-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-color_laserjet_2605dtn-ps.ppd.gz b/prnt/ps/hp-color_laserjet_2605dtn-ps.ppd.gz
new file mode 100644
index 0000000..8a51464
--- /dev/null
+++ b/prnt/ps/hp-color_laserjet_2605dtn-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-color_laserjet_2700-ps.ppd.gz b/prnt/ps/hp-color_laserjet_2700-ps.ppd.gz
new file mode 100644
index 0000000..0de4d92
--- /dev/null
+++ b/prnt/ps/hp-color_laserjet_2700-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-color_laserjet_2700n-ps.ppd.gz b/prnt/ps/hp-color_laserjet_2700n-ps.ppd.gz
new file mode 100644
index 0000000..b4b04a8
--- /dev/null
+++ b/prnt/ps/hp-color_laserjet_2700n-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-color_laserjet_2800-ps.ppd.gz b/prnt/ps/hp-color_laserjet_2800-ps.ppd.gz
new file mode 100644
index 0000000..27b8055
--- /dev/null
+++ b/prnt/ps/hp-color_laserjet_2800-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-color_laserjet_2820-ps.ppd.gz b/prnt/ps/hp-color_laserjet_2820-ps.ppd.gz
new file mode 100644
index 0000000..974b3ae
--- /dev/null
+++ b/prnt/ps/hp-color_laserjet_2820-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-color_laserjet_2830-ps.ppd.gz b/prnt/ps/hp-color_laserjet_2830-ps.ppd.gz
new file mode 100644
index 0000000..ba6e482
--- /dev/null
+++ b/prnt/ps/hp-color_laserjet_2830-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-color_laserjet_2840-ps.ppd.gz b/prnt/ps/hp-color_laserjet_2840-ps.ppd.gz
new file mode 100644
index 0000000..9036b57
--- /dev/null
+++ b/prnt/ps/hp-color_laserjet_2840-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-color_laserjet_3000-ps.ppd.gz b/prnt/ps/hp-color_laserjet_3000-ps.ppd.gz
new file mode 100644
index 0000000..ff4791d
--- /dev/null
+++ b/prnt/ps/hp-color_laserjet_3000-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-color_laserjet_3700-ps.ppd.gz b/prnt/ps/hp-color_laserjet_3700-ps.ppd.gz
new file mode 100644
index 0000000..313c99c
--- /dev/null
+++ b/prnt/ps/hp-color_laserjet_3700-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-color_laserjet_3700n-ps.ppd.gz b/prnt/ps/hp-color_laserjet_3700n-ps.ppd.gz
new file mode 100644
index 0000000..bf93985
--- /dev/null
+++ b/prnt/ps/hp-color_laserjet_3700n-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-color_laserjet_3800-ps.ppd.gz b/prnt/ps/hp-color_laserjet_3800-ps.ppd.gz
new file mode 100644
index 0000000..500e927
--- /dev/null
+++ b/prnt/ps/hp-color_laserjet_3800-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-color_laserjet_4500-ps.ppd.gz b/prnt/ps/hp-color_laserjet_4500-ps.ppd.gz
new file mode 100644
index 0000000..95f5bdd
--- /dev/null
+++ b/prnt/ps/hp-color_laserjet_4500-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-color_laserjet_4550-ps.ppd.gz b/prnt/ps/hp-color_laserjet_4550-ps.ppd.gz
new file mode 100644
index 0000000..12498e1
--- /dev/null
+++ b/prnt/ps/hp-color_laserjet_4550-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-color_laserjet_4600-ps.ppd.gz b/prnt/ps/hp-color_laserjet_4600-ps.ppd.gz
new file mode 100644
index 0000000..4b845cb
--- /dev/null
+++ b/prnt/ps/hp-color_laserjet_4600-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-color_laserjet_4600_series-ps.ppd.gz b/prnt/ps/hp-color_laserjet_4600_series-ps.ppd.gz
new file mode 100644
index 0000000..e4597c0
--- /dev/null
+++ b/prnt/ps/hp-color_laserjet_4600_series-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-color_laserjet_4610-ps.ppd.gz b/prnt/ps/hp-color_laserjet_4610-ps.ppd.gz
new file mode 100644
index 0000000..6c0d977
--- /dev/null
+++ b/prnt/ps/hp-color_laserjet_4610-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-color_laserjet_4650-ps.ppd.gz b/prnt/ps/hp-color_laserjet_4650-ps.ppd.gz
new file mode 100644
index 0000000..e668d23
--- /dev/null
+++ b/prnt/ps/hp-color_laserjet_4650-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-color_laserjet_4700-ps.ppd.gz b/prnt/ps/hp-color_laserjet_4700-ps.ppd.gz
new file mode 100644
index 0000000..a890d5f
--- /dev/null
+++ b/prnt/ps/hp-color_laserjet_4700-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-color_laserjet_4730mfp-ps.ppd.gz b/prnt/ps/hp-color_laserjet_4730mfp-ps.ppd.gz
new file mode 100644
index 0000000..93a2132
--- /dev/null
+++ b/prnt/ps/hp-color_laserjet_4730mfp-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-color_laserjet_5500-ps.ppd.gz b/prnt/ps/hp-color_laserjet_5500-ps.ppd.gz
new file mode 100644
index 0000000..b1b557c
--- /dev/null
+++ b/prnt/ps/hp-color_laserjet_5500-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-color_laserjet_5550-ps.ppd.gz b/prnt/ps/hp-color_laserjet_5550-ps.ppd.gz
new file mode 100644
index 0000000..56f097d
--- /dev/null
+++ b/prnt/ps/hp-color_laserjet_5550-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-color_laserjet_5m-ps.ppd.gz b/prnt/ps/hp-color_laserjet_5m-ps.ppd.gz
new file mode 100644
index 0000000..f98ba49
--- /dev/null
+++ b/prnt/ps/hp-color_laserjet_5m-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-color_laserjet_8500-ps.ppd.gz b/prnt/ps/hp-color_laserjet_8500-ps.ppd.gz
new file mode 100644
index 0000000..8096478
--- /dev/null
+++ b/prnt/ps/hp-color_laserjet_8500-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-color_laserjet_8550-ps.ppd.gz b/prnt/ps/hp-color_laserjet_8550-ps.ppd.gz
new file mode 100644
index 0000000..9cbe017
--- /dev/null
+++ b/prnt/ps/hp-color_laserjet_8550-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-color_laserjet_9500-ps.ppd.gz b/prnt/ps/hp-color_laserjet_9500-ps.ppd.gz
new file mode 100644
index 0000000..1df24a7
--- /dev/null
+++ b/prnt/ps/hp-color_laserjet_9500-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-color_laserjet_9500_mfp-ps.ppd.gz b/prnt/ps/hp-color_laserjet_9500_mfp-ps.ppd.gz
new file mode 100644
index 0000000..2c48a87
--- /dev/null
+++ b/prnt/ps/hp-color_laserjet_9500_mfp-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-color_laserjet_cm1015-ps.ppd.gz b/prnt/ps/hp-color_laserjet_cm1015-ps.ppd.gz
new file mode 100644
index 0000000..9cd9018
--- /dev/null
+++ b/prnt/ps/hp-color_laserjet_cm1015-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-color_laserjet_cm1017-ps.ppd.gz b/prnt/ps/hp-color_laserjet_cm1017-ps.ppd.gz
new file mode 100644
index 0000000..3a7ef72
--- /dev/null
+++ b/prnt/ps/hp-color_laserjet_cm1017-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-color_laserjet_cm1312_mfp-ps.ppd.gz b/prnt/ps/hp-color_laserjet_cm1312_mfp-ps.ppd.gz
new file mode 100644
index 0000000..2f2bf8d
--- /dev/null
+++ b/prnt/ps/hp-color_laserjet_cm1312_mfp-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-color_laserjet_cm1312nfi_mfp-ps.ppd.gz b/prnt/ps/hp-color_laserjet_cm1312nfi_mfp-ps.ppd.gz
new file mode 100644
index 0000000..3de31b1
--- /dev/null
+++ b/prnt/ps/hp-color_laserjet_cm1312nfi_mfp-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-color_laserjet_cm2320_mfp-ps.ppd.gz b/prnt/ps/hp-color_laserjet_cm2320_mfp-ps.ppd.gz
new file mode 100644
index 0000000..599bbf9
--- /dev/null
+++ b/prnt/ps/hp-color_laserjet_cm2320_mfp-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-color_laserjet_cm2320fxi_mfp-ps.ppd.gz b/prnt/ps/hp-color_laserjet_cm2320fxi_mfp-ps.ppd.gz
new file mode 100644
index 0000000..7f80d23
--- /dev/null
+++ b/prnt/ps/hp-color_laserjet_cm2320fxi_mfp-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-color_laserjet_cm2320n_mfp-ps.ppd.gz b/prnt/ps/hp-color_laserjet_cm2320n_mfp-ps.ppd.gz
new file mode 100644
index 0000000..5fc1d2b
--- /dev/null
+++ b/prnt/ps/hp-color_laserjet_cm2320n_mfp-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-color_laserjet_cm2320nf_mfp-ps.ppd.gz b/prnt/ps/hp-color_laserjet_cm2320nf_mfp-ps.ppd.gz
new file mode 100644
index 0000000..9934cfd
--- /dev/null
+++ b/prnt/ps/hp-color_laserjet_cm2320nf_mfp-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-color_laserjet_cm3530_mfp-ps.ppd.gz b/prnt/ps/hp-color_laserjet_cm3530_mfp-ps.ppd.gz
new file mode 100644
index 0000000..4cf8c99
--- /dev/null
+++ b/prnt/ps/hp-color_laserjet_cm3530_mfp-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-color_laserjet_cm4540_mfp-ps.ppd.gz b/prnt/ps/hp-color_laserjet_cm4540_mfp-ps.ppd.gz
new file mode 100644
index 0000000..6a21e28
--- /dev/null
+++ b/prnt/ps/hp-color_laserjet_cm4540_mfp-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-color_laserjet_cm4730_mfp-ps.ppd.gz b/prnt/ps/hp-color_laserjet_cm4730_mfp-ps.ppd.gz
new file mode 100644
index 0000000..b865bba
--- /dev/null
+++ b/prnt/ps/hp-color_laserjet_cm4730_mfp-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-color_laserjet_cm6030_mfp-ps.ppd.gz b/prnt/ps/hp-color_laserjet_cm6030_mfp-ps.ppd.gz
new file mode 100644
index 0000000..22a47bd
--- /dev/null
+++ b/prnt/ps/hp-color_laserjet_cm6030_mfp-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-color_laserjet_cm6040_mfp-ps.ppd.gz b/prnt/ps/hp-color_laserjet_cm6040_mfp-ps.ppd.gz
new file mode 100644
index 0000000..12ac2bf
--- /dev/null
+++ b/prnt/ps/hp-color_laserjet_cm6040_mfp-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-color_laserjet_cm6049_mfp-ps.ppd.gz b/prnt/ps/hp-color_laserjet_cm6049_mfp-ps.ppd.gz
new file mode 100644
index 0000000..7794d3a
--- /dev/null
+++ b/prnt/ps/hp-color_laserjet_cm6049_mfp-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-color_laserjet_cp1514n-ps.ppd.gz b/prnt/ps/hp-color_laserjet_cp1514n-ps.ppd.gz
new file mode 100644
index 0000000..058db7c
--- /dev/null
+++ b/prnt/ps/hp-color_laserjet_cp1514n-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-color_laserjet_cp1515n-ps.ppd.gz b/prnt/ps/hp-color_laserjet_cp1515n-ps.ppd.gz
new file mode 100644
index 0000000..b4e389b
--- /dev/null
+++ b/prnt/ps/hp-color_laserjet_cp1515n-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-color_laserjet_cp1518ni-ps.ppd.gz b/prnt/ps/hp-color_laserjet_cp1518ni-ps.ppd.gz
new file mode 100644
index 0000000..22812a2
--- /dev/null
+++ b/prnt/ps/hp-color_laserjet_cp1518ni-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-color_laserjet_cp2025-ps.ppd.gz b/prnt/ps/hp-color_laserjet_cp2025-ps.ppd.gz
new file mode 100644
index 0000000..5db324b
--- /dev/null
+++ b/prnt/ps/hp-color_laserjet_cp2025-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-color_laserjet_cp2025dn-ps.ppd.gz b/prnt/ps/hp-color_laserjet_cp2025dn-ps.ppd.gz
new file mode 100644
index 0000000..9d8326d
--- /dev/null
+++ b/prnt/ps/hp-color_laserjet_cp2025dn-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-color_laserjet_cp2025n-ps.ppd.gz b/prnt/ps/hp-color_laserjet_cp2025n-ps.ppd.gz
new file mode 100644
index 0000000..6e09209
--- /dev/null
+++ b/prnt/ps/hp-color_laserjet_cp2025n-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-color_laserjet_cp2025x-ps.ppd.gz b/prnt/ps/hp-color_laserjet_cp2025x-ps.ppd.gz
new file mode 100644
index 0000000..330bd5d
--- /dev/null
+++ b/prnt/ps/hp-color_laserjet_cp2025x-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-color_laserjet_cp3505-ps.ppd.gz b/prnt/ps/hp-color_laserjet_cp3505-ps.ppd.gz
new file mode 100644
index 0000000..52b3d63
--- /dev/null
+++ b/prnt/ps/hp-color_laserjet_cp3505-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-color_laserjet_cp3525-ps.ppd.gz b/prnt/ps/hp-color_laserjet_cp3525-ps.ppd.gz
new file mode 100644
index 0000000..5f21ada
--- /dev/null
+++ b/prnt/ps/hp-color_laserjet_cp3525-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-color_laserjet_cp4005-ps.ppd.gz b/prnt/ps/hp-color_laserjet_cp4005-ps.ppd.gz
new file mode 100644
index 0000000..1b20907
--- /dev/null
+++ b/prnt/ps/hp-color_laserjet_cp4005-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-color_laserjet_cp4020_series-ps.ppd.gz b/prnt/ps/hp-color_laserjet_cp4020_series-ps.ppd.gz
new file mode 100644
index 0000000..e52350d
--- /dev/null
+++ b/prnt/ps/hp-color_laserjet_cp4020_series-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-color_laserjet_cp4520_series-ps.ppd.gz b/prnt/ps/hp-color_laserjet_cp4520_series-ps.ppd.gz
new file mode 100644
index 0000000..9563d56
--- /dev/null
+++ b/prnt/ps/hp-color_laserjet_cp4520_series-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-color_laserjet_cp5225-ps.ppd.gz b/prnt/ps/hp-color_laserjet_cp5225-ps.ppd.gz
new file mode 100644
index 0000000..acc69e4
--- /dev/null
+++ b/prnt/ps/hp-color_laserjet_cp5225-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-color_laserjet_cp5225dn-ps.ppd.gz b/prnt/ps/hp-color_laserjet_cp5225dn-ps.ppd.gz
new file mode 100644
index 0000000..6f550bc
--- /dev/null
+++ b/prnt/ps/hp-color_laserjet_cp5225dn-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-color_laserjet_cp5225n-ps.ppd.gz b/prnt/ps/hp-color_laserjet_cp5225n-ps.ppd.gz
new file mode 100644
index 0000000..3f00e7d
--- /dev/null
+++ b/prnt/ps/hp-color_laserjet_cp5225n-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-color_laserjet_cp5520_series-ps.ppd.gz b/prnt/ps/hp-color_laserjet_cp5520_series-ps.ppd.gz
new file mode 100644
index 0000000..23b5e7b
--- /dev/null
+++ b/prnt/ps/hp-color_laserjet_cp5520_series-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-color_laserjet_cp6015-ps.ppd.gz b/prnt/ps/hp-color_laserjet_cp6015-ps.ppd.gz
new file mode 100644
index 0000000..a863147
--- /dev/null
+++ b/prnt/ps/hp-color_laserjet_cp6015-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-designjet_4000ps.ppd.gz b/prnt/ps/hp-designjet_4000ps.ppd.gz
new file mode 100644
index 0000000..68060ba
--- /dev/null
+++ b/prnt/ps/hp-designjet_4000ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-designjet_4020ps-ps.ppd.gz b/prnt/ps/hp-designjet_4020ps-ps.ppd.gz
new file mode 100644
index 0000000..468fdea
--- /dev/null
+++ b/prnt/ps/hp-designjet_4020ps-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-designjet_4500mfp.ppd.gz b/prnt/ps/hp-designjet_4500mfp.ppd.gz
new file mode 100644
index 0000000..861ca78
--- /dev/null
+++ b/prnt/ps/hp-designjet_4500mfp.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-designjet_4500ps.ppd.gz b/prnt/ps/hp-designjet_4500ps.ppd.gz
new file mode 100644
index 0000000..988a2b9
--- /dev/null
+++ b/prnt/ps/hp-designjet_4500ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-designjet_4520mfp-ps.ppd.gz b/prnt/ps/hp-designjet_4520mfp-ps.ppd.gz
new file mode 100644
index 0000000..ca2d388
--- /dev/null
+++ b/prnt/ps/hp-designjet_4520mfp-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-designjet_4520ps-ps.ppd.gz b/prnt/ps/hp-designjet_4520ps-ps.ppd.gz
new file mode 100644
index 0000000..e5fb1d8
--- /dev/null
+++ b/prnt/ps/hp-designjet_4520ps-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-designjet_t1100ps_24in-ps.ppd.gz b/prnt/ps/hp-designjet_t1100ps_24in-ps.ppd.gz
new file mode 100644
index 0000000..56b7c6c
--- /dev/null
+++ b/prnt/ps/hp-designjet_t1100ps_24in-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-designjet_t1100ps_44in-ps.ppd.gz b/prnt/ps/hp-designjet_t1100ps_44in-ps.ppd.gz
new file mode 100644
index 0000000..6683ce5
--- /dev/null
+++ b/prnt/ps/hp-designjet_t1100ps_44in-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-designjet_t1120ps_24in-ps.ppd.gz b/prnt/ps/hp-designjet_t1120ps_24in-ps.ppd.gz
new file mode 100644
index 0000000..d390f0d
--- /dev/null
+++ b/prnt/ps/hp-designjet_t1120ps_24in-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-designjet_t1120ps_44in-ps.ppd.gz b/prnt/ps/hp-designjet_t1120ps_44in-ps.ppd.gz
new file mode 100644
index 0000000..001e716
--- /dev/null
+++ b/prnt/ps/hp-designjet_t1120ps_44in-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-designjet_t1200_postscript-ps.ppd.gz b/prnt/ps/hp-designjet_t1200_postscript-ps.ppd.gz
new file mode 100644
index 0000000..14d5411
--- /dev/null
+++ b/prnt/ps/hp-designjet_t1200_postscript-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-designjet_t1300_postscript-ps.ppd.gz b/prnt/ps/hp-designjet_t1300_postscript-ps.ppd.gz
new file mode 100644
index 0000000..a71d1a0
--- /dev/null
+++ b/prnt/ps/hp-designjet_t1300_postscript-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-designjet_t2300_postscript-ps.ppd.gz b/prnt/ps/hp-designjet_t2300_postscript-ps.ppd.gz
new file mode 100644
index 0000000..8b74115
--- /dev/null
+++ b/prnt/ps/hp-designjet_t2300_postscript-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-designjet_t7100ps-ps.ppd.gz b/prnt/ps/hp-designjet_t7100ps-ps.ppd.gz
new file mode 100644
index 0000000..6cf74b3
--- /dev/null
+++ b/prnt/ps/hp-designjet_t7100ps-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-designjet_t7100ps_monochrome-ps.ppd.gz b/prnt/ps/hp-designjet_t7100ps_monochrome-ps.ppd.gz
new file mode 100644
index 0000000..4dddc9b
--- /dev/null
+++ b/prnt/ps/hp-designjet_t7100ps_monochrome-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-designjet_t770_postscript-ps.ppd.gz b/prnt/ps/hp-designjet_t770_postscript-ps.ppd.gz
new file mode 100644
index 0000000..c97c71b
--- /dev/null
+++ b/prnt/ps/hp-designjet_t770_postscript-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-designjet_t770ps_24in-ps.ppd.gz b/prnt/ps/hp-designjet_t770ps_24in-ps.ppd.gz
new file mode 100644
index 0000000..79fe4f5
--- /dev/null
+++ b/prnt/ps/hp-designjet_t770ps_24in-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-designjet_t790ps_24in-ps.ppd.gz b/prnt/ps/hp-designjet_t790ps_24in-ps.ppd.gz
new file mode 100644
index 0000000..232894d
--- /dev/null
+++ b/prnt/ps/hp-designjet_t790ps_24in-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-designjet_t790ps_44in-ps.ppd.gz b/prnt/ps/hp-designjet_t790ps_44in-ps.ppd.gz
new file mode 100644
index 0000000..be0adc8
--- /dev/null
+++ b/prnt/ps/hp-designjet_t790ps_44in-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-designjet_z6100ps_42in_photo-ps.ppd.gz b/prnt/ps/hp-designjet_z6100ps_42in_photo-ps.ppd.gz
new file mode 100644
index 0000000..526ac4b
--- /dev/null
+++ b/prnt/ps/hp-designjet_z6100ps_42in_photo-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-designjet_z6100ps_60in_photo-ps.ppd.gz b/prnt/ps/hp-designjet_z6100ps_60in_photo-ps.ppd.gz
new file mode 100644
index 0000000..9173292
--- /dev/null
+++ b/prnt/ps/hp-designjet_z6100ps_60in_photo-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-designjet_z6200_42in_photo-ps.ppd.gz b/prnt/ps/hp-designjet_z6200_42in_photo-ps.ppd.gz
new file mode 100644
index 0000000..f0904b7
--- /dev/null
+++ b/prnt/ps/hp-designjet_z6200_42in_photo-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-designjet_z6200_60in_photo-ps.ppd.gz b/prnt/ps/hp-designjet_z6200_60in_photo-ps.ppd.gz
new file mode 100644
index 0000000..5fa6fde
--- /dev/null
+++ b/prnt/ps/hp-designjet_z6200_60in_photo-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_100_color_mfp_m175-ps.ppd.gz b/prnt/ps/hp-laserjet_100_color_mfp_m175-ps.ppd.gz
new file mode 100644
index 0000000..560634c
--- /dev/null
+++ b/prnt/ps/hp-laserjet_100_color_mfp_m175-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_1200-ps.ppd.gz b/prnt/ps/hp-laserjet_1200-ps.ppd.gz
new file mode 100644
index 0000000..1b8a2da
--- /dev/null
+++ b/prnt/ps/hp-laserjet_1200-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_1200n-ps.ppd.gz b/prnt/ps/hp-laserjet_1200n-ps.ppd.gz
new file mode 100644
index 0000000..66b13f5
--- /dev/null
+++ b/prnt/ps/hp-laserjet_1200n-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_1220-ps.ppd.gz b/prnt/ps/hp-laserjet_1220-ps.ppd.gz
new file mode 100644
index 0000000..75fb3f2
--- /dev/null
+++ b/prnt/ps/hp-laserjet_1220-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_1220se-ps.ppd.gz b/prnt/ps/hp-laserjet_1220se-ps.ppd.gz
new file mode 100644
index 0000000..535a51b
--- /dev/null
+++ b/prnt/ps/hp-laserjet_1220se-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_1300-ps.ppd.gz b/prnt/ps/hp-laserjet_1300-ps.ppd.gz
new file mode 100644
index 0000000..aec921a
--- /dev/null
+++ b/prnt/ps/hp-laserjet_1300-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_1300n-ps.ppd.gz b/prnt/ps/hp-laserjet_1300n-ps.ppd.gz
new file mode 100644
index 0000000..c185501
--- /dev/null
+++ b/prnt/ps/hp-laserjet_1300n-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_1300xi-ps.ppd.gz b/prnt/ps/hp-laserjet_1300xi-ps.ppd.gz
new file mode 100644
index 0000000..f470fbe
--- /dev/null
+++ b/prnt/ps/hp-laserjet_1300xi-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_1320-ps.ppd.gz b/prnt/ps/hp-laserjet_1320-ps.ppd.gz
new file mode 100644
index 0000000..dd7dd3c
--- /dev/null
+++ b/prnt/ps/hp-laserjet_1320-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_1320_series-ps.ppd.gz b/prnt/ps/hp-laserjet_1320_series-ps.ppd.gz
new file mode 100644
index 0000000..04ffca2
--- /dev/null
+++ b/prnt/ps/hp-laserjet_1320_series-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_1320n-ps.ppd.gz b/prnt/ps/hp-laserjet_1320n-ps.ppd.gz
new file mode 100644
index 0000000..3a0f866
--- /dev/null
+++ b/prnt/ps/hp-laserjet_1320n-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_1320nw-ps.ppd.gz b/prnt/ps/hp-laserjet_1320nw-ps.ppd.gz
new file mode 100644
index 0000000..695d8bd
--- /dev/null
+++ b/prnt/ps/hp-laserjet_1320nw-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_1320tn-ps.ppd.gz b/prnt/ps/hp-laserjet_1320tn-ps.ppd.gz
new file mode 100644
index 0000000..485a813
--- /dev/null
+++ b/prnt/ps/hp-laserjet_1320tn-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_200_colormfp_m275-ps.ppd.gz b/prnt/ps/hp-laserjet_200_colormfp_m275-ps.ppd.gz
new file mode 100644
index 0000000..82292e6
--- /dev/null
+++ b/prnt/ps/hp-laserjet_200_colormfp_m275-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_2100-ps.ppd.gz b/prnt/ps/hp-laserjet_2100-ps.ppd.gz
new file mode 100644
index 0000000..65f4643
--- /dev/null
+++ b/prnt/ps/hp-laserjet_2100-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_2100_series-ps.ppd.gz b/prnt/ps/hp-laserjet_2100_series-ps.ppd.gz
new file mode 100644
index 0000000..9432a8c
--- /dev/null
+++ b/prnt/ps/hp-laserjet_2100_series-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_2200-ps.ppd.gz b/prnt/ps/hp-laserjet_2200-ps.ppd.gz
new file mode 100644
index 0000000..9e7f435
--- /dev/null
+++ b/prnt/ps/hp-laserjet_2200-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_2200_series-ps.ppd.gz b/prnt/ps/hp-laserjet_2200_series-ps.ppd.gz
new file mode 100644
index 0000000..67214af
--- /dev/null
+++ b/prnt/ps/hp-laserjet_2200_series-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_2300-ps.ppd.gz b/prnt/ps/hp-laserjet_2300-ps.ppd.gz
new file mode 100644
index 0000000..5bf92a8
--- /dev/null
+++ b/prnt/ps/hp-laserjet_2300-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_2300_series-ps.ppd.gz b/prnt/ps/hp-laserjet_2300_series-ps.ppd.gz
new file mode 100644
index 0000000..2bc36c7
--- /dev/null
+++ b/prnt/ps/hp-laserjet_2300_series-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_2410-ps.ppd.gz b/prnt/ps/hp-laserjet_2410-ps.ppd.gz
new file mode 100644
index 0000000..f65c590
--- /dev/null
+++ b/prnt/ps/hp-laserjet_2410-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_2420-ps.ppd.gz b/prnt/ps/hp-laserjet_2420-ps.ppd.gz
new file mode 100644
index 0000000..42bca2e
--- /dev/null
+++ b/prnt/ps/hp-laserjet_2420-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_2430-ps.ppd.gz b/prnt/ps/hp-laserjet_2430-ps.ppd.gz
new file mode 100644
index 0000000..afb102a
--- /dev/null
+++ b/prnt/ps/hp-laserjet_2430-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_3015-ps.ppd.gz b/prnt/ps/hp-laserjet_3015-ps.ppd.gz
new file mode 100644
index 0000000..312c79c
--- /dev/null
+++ b/prnt/ps/hp-laserjet_3015-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_3020-ps.ppd.gz b/prnt/ps/hp-laserjet_3020-ps.ppd.gz
new file mode 100644
index 0000000..d7282d7
--- /dev/null
+++ b/prnt/ps/hp-laserjet_3020-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_3030-ps.ppd.gz b/prnt/ps/hp-laserjet_3030-ps.ppd.gz
new file mode 100644
index 0000000..0e214b1
--- /dev/null
+++ b/prnt/ps/hp-laserjet_3030-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_3050-ps.ppd.gz b/prnt/ps/hp-laserjet_3050-ps.ppd.gz
new file mode 100644
index 0000000..ecca2fc
--- /dev/null
+++ b/prnt/ps/hp-laserjet_3050-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_3052-ps.ppd.gz b/prnt/ps/hp-laserjet_3052-ps.ppd.gz
new file mode 100644
index 0000000..0ed2990
--- /dev/null
+++ b/prnt/ps/hp-laserjet_3052-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_3200m-ps.ppd.gz b/prnt/ps/hp-laserjet_3200m-ps.ppd.gz
new file mode 100644
index 0000000..f61a8a6
--- /dev/null
+++ b/prnt/ps/hp-laserjet_3200m-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_3300_3310_3320-ps.ppd.gz b/prnt/ps/hp-laserjet_3300_3310_3320-ps.ppd.gz
new file mode 100644
index 0000000..3872595
--- /dev/null
+++ b/prnt/ps/hp-laserjet_3300_3310_3320-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_3380-ps.ppd.gz b/prnt/ps/hp-laserjet_3380-ps.ppd.gz
new file mode 100644
index 0000000..79d131b
--- /dev/null
+++ b/prnt/ps/hp-laserjet_3380-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_3390-ps.ppd.gz b/prnt/ps/hp-laserjet_3390-ps.ppd.gz
new file mode 100644
index 0000000..3dc0bee
--- /dev/null
+++ b/prnt/ps/hp-laserjet_3390-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_4-ps.ppd.gz b/prnt/ps/hp-laserjet_4-ps.ppd.gz
new file mode 100644
index 0000000..23b5dc3
--- /dev/null
+++ b/prnt/ps/hp-laserjet_4-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_4000_series-ps.ppd.gz b/prnt/ps/hp-laserjet_4000_series-ps.ppd.gz
new file mode 100644
index 0000000..904d24f
--- /dev/null
+++ b/prnt/ps/hp-laserjet_4000_series-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_4050_series-ps.ppd.gz b/prnt/ps/hp-laserjet_4050_series-ps.ppd.gz
new file mode 100644
index 0000000..012c87a
--- /dev/null
+++ b/prnt/ps/hp-laserjet_4050_series-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_4100_mfp-ps.ppd.gz b/prnt/ps/hp-laserjet_4100_mfp-ps.ppd.gz
new file mode 100644
index 0000000..9d4d4ea
--- /dev/null
+++ b/prnt/ps/hp-laserjet_4100_mfp-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_4100_series-ps.ppd.gz b/prnt/ps/hp-laserjet_4100_series-ps.ppd.gz
new file mode 100644
index 0000000..0ca4bd5
--- /dev/null
+++ b/prnt/ps/hp-laserjet_4100_series-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_4200-ps.ppd.gz b/prnt/ps/hp-laserjet_4200-ps.ppd.gz
new file mode 100644
index 0000000..e7b545e
--- /dev/null
+++ b/prnt/ps/hp-laserjet_4200-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_4240-ps.ppd.gz b/prnt/ps/hp-laserjet_4240-ps.ppd.gz
new file mode 100644
index 0000000..c75a28b
--- /dev/null
+++ b/prnt/ps/hp-laserjet_4240-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_4250-ps.ppd.gz b/prnt/ps/hp-laserjet_4250-ps.ppd.gz
new file mode 100644
index 0000000..c287ff4
--- /dev/null
+++ b/prnt/ps/hp-laserjet_4250-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_4300-ps.ppd.gz b/prnt/ps/hp-laserjet_4300-ps.ppd.gz
new file mode 100644
index 0000000..756a800
--- /dev/null
+++ b/prnt/ps/hp-laserjet_4300-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_4345_mfp-ps.ppd.gz b/prnt/ps/hp-laserjet_4345_mfp-ps.ppd.gz
new file mode 100644
index 0000000..ef75cbc
--- /dev/null
+++ b/prnt/ps/hp-laserjet_4345_mfp-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_4350-ps.ppd.gz b/prnt/ps/hp-laserjet_4350-ps.ppd.gz
new file mode 100644
index 0000000..9805fd0
--- /dev/null
+++ b/prnt/ps/hp-laserjet_4350-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_4_plus-ps.ppd.gz b/prnt/ps/hp-laserjet_4_plus-ps.ppd.gz
new file mode 100644
index 0000000..0ee87b9
--- /dev/null
+++ b/prnt/ps/hp-laserjet_4_plus-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_4ml-ps.ppd.gz b/prnt/ps/hp-laserjet_4ml-ps.ppd.gz
new file mode 100644
index 0000000..15e6f5a
--- /dev/null
+++ b/prnt/ps/hp-laserjet_4ml-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_4mp-ps.ppd.gz b/prnt/ps/hp-laserjet_4mp-ps.ppd.gz
new file mode 100644
index 0000000..99c2108
--- /dev/null
+++ b/prnt/ps/hp-laserjet_4mp-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_4si-ps.ppd.gz b/prnt/ps/hp-laserjet_4si-ps.ppd.gz
new file mode 100644
index 0000000..56c49a4
--- /dev/null
+++ b/prnt/ps/hp-laserjet_4si-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_4v-ps.ppd.gz b/prnt/ps/hp-laserjet_4v-ps.ppd.gz
new file mode 100644
index 0000000..8c668b6
--- /dev/null
+++ b/prnt/ps/hp-laserjet_4v-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_5000-ps.ppd.gz b/prnt/ps/hp-laserjet_5000-ps.ppd.gz
new file mode 100644
index 0000000..7d6a2a5
--- /dev/null
+++ b/prnt/ps/hp-laserjet_5000-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_5000_series-ps.ppd.gz b/prnt/ps/hp-laserjet_5000_series-ps.ppd.gz
new file mode 100644
index 0000000..60c87dc
--- /dev/null
+++ b/prnt/ps/hp-laserjet_5000_series-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_500_color_m551-ps.ppd.gz b/prnt/ps/hp-laserjet_500_color_m551-ps.ppd.gz
new file mode 100644
index 0000000..7e2a1eb
--- /dev/null
+++ b/prnt/ps/hp-laserjet_500_color_m551-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_5100_series-ps.ppd.gz b/prnt/ps/hp-laserjet_5100_series-ps.ppd.gz
new file mode 100644
index 0000000..724a2be
--- /dev/null
+++ b/prnt/ps/hp-laserjet_5100_series-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_5200-ps.ppd.gz b/prnt/ps/hp-laserjet_5200-ps.ppd.gz
new file mode 100644
index 0000000..7e5da6b
--- /dev/null
+++ b/prnt/ps/hp-laserjet_5200-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_5200l-ps.ppd.gz b/prnt/ps/hp-laserjet_5200l-ps.ppd.gz
new file mode 100644
index 0000000..57f2c28
--- /dev/null
+++ b/prnt/ps/hp-laserjet_5200l-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_5200lx-ps.ppd.gz b/prnt/ps/hp-laserjet_5200lx-ps.ppd.gz
new file mode 100644
index 0000000..0d364d6
--- /dev/null
+++ b/prnt/ps/hp-laserjet_5200lx-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_5mp-ps.ppd.gz b/prnt/ps/hp-laserjet_5mp-ps.ppd.gz
new file mode 100644
index 0000000..a3a06d4
--- /dev/null
+++ b/prnt/ps/hp-laserjet_5mp-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_5p-ps.ppd.gz b/prnt/ps/hp-laserjet_5p-ps.ppd.gz
new file mode 100644
index 0000000..ededcaa
--- /dev/null
+++ b/prnt/ps/hp-laserjet_5p-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_5si-ps.ppd.gz b/prnt/ps/hp-laserjet_5si-ps.ppd.gz
new file mode 100644
index 0000000..4ba19b4
--- /dev/null
+++ b/prnt/ps/hp-laserjet_5si-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_5si_mopier-ps.ppd.gz b/prnt/ps/hp-laserjet_5si_mopier-ps.ppd.gz
new file mode 100644
index 0000000..880ba31
--- /dev/null
+++ b/prnt/ps/hp-laserjet_5si_mopier-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_600_m601_m602_m603-ps.ppd.gz b/prnt/ps/hp-laserjet_600_m601_m602_m603-ps.ppd.gz
new file mode 100644
index 0000000..4dac2dd
--- /dev/null
+++ b/prnt/ps/hp-laserjet_600_m601_m602_m603-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_6mp-ps.ppd.gz b/prnt/ps/hp-laserjet_6mp-ps.ppd.gz
new file mode 100644
index 0000000..511f956
--- /dev/null
+++ b/prnt/ps/hp-laserjet_6mp-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_6p-ps.ppd.gz b/prnt/ps/hp-laserjet_6p-ps.ppd.gz
new file mode 100644
index 0000000..3ecd92b
--- /dev/null
+++ b/prnt/ps/hp-laserjet_6p-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_8000-ps.ppd.gz b/prnt/ps/hp-laserjet_8000-ps.ppd.gz
new file mode 100644
index 0000000..f5702ff
--- /dev/null
+++ b/prnt/ps/hp-laserjet_8000-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_8000_series-ps.ppd.gz b/prnt/ps/hp-laserjet_8000_series-ps.ppd.gz
new file mode 100644
index 0000000..979046f
--- /dev/null
+++ b/prnt/ps/hp-laserjet_8000_series-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_8100_mfp-ps.ppd.gz b/prnt/ps/hp-laserjet_8100_mfp-ps.ppd.gz
new file mode 100644
index 0000000..2ced857
--- /dev/null
+++ b/prnt/ps/hp-laserjet_8100_mfp-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_8100_series-ps.ppd.gz b/prnt/ps/hp-laserjet_8100_series-ps.ppd.gz
new file mode 100644
index 0000000..4e15900
--- /dev/null
+++ b/prnt/ps/hp-laserjet_8100_series-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_8150_mfp-ps.ppd.gz b/prnt/ps/hp-laserjet_8150_mfp-ps.ppd.gz
new file mode 100644
index 0000000..9ec9793
--- /dev/null
+++ b/prnt/ps/hp-laserjet_8150_mfp-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_9000_mfp-ps.ppd.gz b/prnt/ps/hp-laserjet_9000_mfp-ps.ppd.gz
new file mode 100644
index 0000000..484df67
--- /dev/null
+++ b/prnt/ps/hp-laserjet_9000_mfp-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_9000_series-ps.ppd.gz b/prnt/ps/hp-laserjet_9000_series-ps.ppd.gz
new file mode 100644
index 0000000..af14b9d
--- /dev/null
+++ b/prnt/ps/hp-laserjet_9000_series-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_9040-ps.ppd.gz b/prnt/ps/hp-laserjet_9040-ps.ppd.gz
new file mode 100644
index 0000000..77d81a2
--- /dev/null
+++ b/prnt/ps/hp-laserjet_9040-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_9040_mfp-ps.ppd.gz b/prnt/ps/hp-laserjet_9040_mfp-ps.ppd.gz
new file mode 100644
index 0000000..9258f80
--- /dev/null
+++ b/prnt/ps/hp-laserjet_9040_mfp-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_9050-ps.ppd.gz b/prnt/ps/hp-laserjet_9050-ps.ppd.gz
new file mode 100644
index 0000000..7a946d9
--- /dev/null
+++ b/prnt/ps/hp-laserjet_9050-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_9050_mfp-ps.ppd.gz b/prnt/ps/hp-laserjet_9050_mfp-ps.ppd.gz
new file mode 100644
index 0000000..78837ea
--- /dev/null
+++ b/prnt/ps/hp-laserjet_9050_mfp-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_9055mfp-ps.ppd.gz b/prnt/ps/hp-laserjet_9055mfp-ps.ppd.gz
new file mode 100644
index 0000000..e57ac3c
--- /dev/null
+++ b/prnt/ps/hp-laserjet_9055mfp-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_9065mfp-ps.ppd.gz b/prnt/ps/hp-laserjet_9065mfp-ps.ppd.gz
new file mode 100644
index 0000000..728a714
--- /dev/null
+++ b/prnt/ps/hp-laserjet_9065mfp-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_cm1410_series-ps.ppd.gz b/prnt/ps/hp-laserjet_cm1410_series-ps.ppd.gz
new file mode 100644
index 0000000..974b47d
--- /dev/null
+++ b/prnt/ps/hp-laserjet_cm1410_series-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_cp1520_series-ps.ppd.gz b/prnt/ps/hp-laserjet_cp1520_series-ps.ppd.gz
new file mode 100644
index 0000000..778ebd4
--- /dev/null
+++ b/prnt/ps/hp-laserjet_cp1520_series-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_m1522_mfp-ps.ppd.gz b/prnt/ps/hp-laserjet_m1522_mfp-ps.ppd.gz
new file mode 100644
index 0000000..c5030fa
--- /dev/null
+++ b/prnt/ps/hp-laserjet_m1522_mfp-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_m1522n_mfp-ps.ppd.gz b/prnt/ps/hp-laserjet_m1522n_mfp-ps.ppd.gz
new file mode 100644
index 0000000..1d7d9fe
--- /dev/null
+++ b/prnt/ps/hp-laserjet_m1522n_mfp-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_m1522nf_mfp-ps.ppd.gz b/prnt/ps/hp-laserjet_m1522nf_mfp-ps.ppd.gz
new file mode 100644
index 0000000..8010931
--- /dev/null
+++ b/prnt/ps/hp-laserjet_m1522nf_mfp-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_m1530_mfp_series-ps.ppd.gz b/prnt/ps/hp-laserjet_m1530_mfp_series-ps.ppd.gz
new file mode 100644
index 0000000..4d64dba
--- /dev/null
+++ b/prnt/ps/hp-laserjet_m1530_mfp_series-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_m2727_mfp_series-ps.ppd.gz b/prnt/ps/hp-laserjet_m2727_mfp_series-ps.ppd.gz
new file mode 100644
index 0000000..dd6ba4f
--- /dev/null
+++ b/prnt/ps/hp-laserjet_m2727_mfp_series-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_m3027_mfp-ps.ppd.gz b/prnt/ps/hp-laserjet_m3027_mfp-ps.ppd.gz
new file mode 100644
index 0000000..d18bb5e
--- /dev/null
+++ b/prnt/ps/hp-laserjet_m3027_mfp-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_m3035_mfp-ps.ppd.gz b/prnt/ps/hp-laserjet_m3035_mfp-ps.ppd.gz
new file mode 100644
index 0000000..7f2a55c
--- /dev/null
+++ b/prnt/ps/hp-laserjet_m3035_mfp-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_m4345_mfp-ps.ppd.gz b/prnt/ps/hp-laserjet_m4345_mfp-ps.ppd.gz
new file mode 100644
index 0000000..d7cb2bb
--- /dev/null
+++ b/prnt/ps/hp-laserjet_m4345_mfp-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_m4349_mfp-ps.ppd.gz b/prnt/ps/hp-laserjet_m4349_mfp-ps.ppd.gz
new file mode 100644
index 0000000..0fdbec5
--- /dev/null
+++ b/prnt/ps/hp-laserjet_m4349_mfp-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_m4555_mfp-ps.ppd.gz b/prnt/ps/hp-laserjet_m4555_mfp-ps.ppd.gz
new file mode 100644
index 0000000..f116cae
--- /dev/null
+++ b/prnt/ps/hp-laserjet_m4555_mfp-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_m5025_mfp-ps.ppd.gz b/prnt/ps/hp-laserjet_m5025_mfp-ps.ppd.gz
new file mode 100644
index 0000000..6ab0f48
--- /dev/null
+++ b/prnt/ps/hp-laserjet_m5025_mfp-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_m5035_mfp-ps.ppd.gz b/prnt/ps/hp-laserjet_m5035_mfp-ps.ppd.gz
new file mode 100644
index 0000000..d6a3f15
--- /dev/null
+++ b/prnt/ps/hp-laserjet_m5035_mfp-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_m9040_mfp-ps.ppd.gz b/prnt/ps/hp-laserjet_m9040_mfp-ps.ppd.gz
new file mode 100644
index 0000000..12ef004
--- /dev/null
+++ b/prnt/ps/hp-laserjet_m9040_mfp-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_m9050_mfp-ps.ppd.gz b/prnt/ps/hp-laserjet_m9050_mfp-ps.ppd.gz
new file mode 100644
index 0000000..ee59395
--- /dev/null
+++ b/prnt/ps/hp-laserjet_m9050_mfp-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_m9059_mfp-ps.ppd.gz b/prnt/ps/hp-laserjet_m9059_mfp-ps.ppd.gz
new file mode 100644
index 0000000..229ccee
--- /dev/null
+++ b/prnt/ps/hp-laserjet_m9059_mfp-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_p2015_series-ps.ppd.gz b/prnt/ps/hp-laserjet_p2015_series-ps.ppd.gz
new file mode 100644
index 0000000..0674a75
--- /dev/null
+++ b/prnt/ps/hp-laserjet_p2015_series-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_p2055_series-ps.ppd.gz b/prnt/ps/hp-laserjet_p2055_series-ps.ppd.gz
new file mode 100644
index 0000000..5ce2efd
--- /dev/null
+++ b/prnt/ps/hp-laserjet_p2055_series-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_p3004-ps.ppd.gz b/prnt/ps/hp-laserjet_p3004-ps.ppd.gz
new file mode 100644
index 0000000..166183c
--- /dev/null
+++ b/prnt/ps/hp-laserjet_p3004-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_p3005-ps.ppd.gz b/prnt/ps/hp-laserjet_p3005-ps.ppd.gz
new file mode 100644
index 0000000..71582ef
--- /dev/null
+++ b/prnt/ps/hp-laserjet_p3005-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_p3010_series-ps.ppd.gz b/prnt/ps/hp-laserjet_p3010_series-ps.ppd.gz
new file mode 100644
index 0000000..42cdfa2
--- /dev/null
+++ b/prnt/ps/hp-laserjet_p3010_series-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-laserjet_p4010_series-ps.ppd.gz b/prnt/ps/hp-laserjet_p4010_series-ps.ppd.gz
new file mode 100644
index 0000000..2a7e70e
--- /dev/null
+++ b/prnt/ps/hp-laserjet_p4010_series-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-lj_300_400_color_m351_m451-ps.ppd.gz b/prnt/ps/hp-lj_300_400_color_m351_m451-ps.ppd.gz
new file mode 100644
index 0000000..b7ffb3e
--- /dev/null
+++ b/prnt/ps/hp-lj_300_400_color_m351_m451-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-lj_300_400_color_mfp_m375_m475-ps.ppd.gz b/prnt/ps/hp-lj_300_400_color_mfp_m375_m475-ps.ppd.gz
new file mode 100644
index 0000000..f35931e
--- /dev/null
+++ b/prnt/ps/hp-lj_300_400_color_mfp_m375_m475-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-mopier_240-ps.ppd.gz b/prnt/ps/hp-mopier_240-ps.ppd.gz
new file mode 100644
index 0000000..70dc873
--- /dev/null
+++ b/prnt/ps/hp-mopier_240-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-mopier_320-ps.ppd.gz b/prnt/ps/hp-mopier_320-ps.ppd.gz
new file mode 100644
index 0000000..02db4f1
--- /dev/null
+++ b/prnt/ps/hp-mopier_320-ps.ppd.gz
Binary files differ
diff --git a/prnt/ps/hp-officejet_pro_8000_enterprise_a811a-ps.ppd.gz b/prnt/ps/hp-officejet_pro_8000_enterprise_a811a-ps.ppd.gz
new file mode 100644
index 0000000..ac50d18
--- /dev/null
+++ b/prnt/ps/hp-officejet_pro_8000_enterprise_a811a-ps.ppd.gz
Binary files differ
diff --git a/probe.py b/probe.py
new file mode 100755
index 0000000..8a85da3
--- /dev/null
+++ b/probe.py
@@ -0,0 +1,218 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2009 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+
+__version__ = '4.1'
+__mod__ = 'hp-probe'
+__title__ = 'Printer Discovery Utility'
+__doc__ = "Discover HPLIP supported USB, parallel, and network attached printers."
+
+
+# Std Lib
+import sys
+import getopt
+import operator
+import os
+
+# Local
+from base.g import *
+from base import device, utils, tui, module
+
+
+USAGE = [(__doc__, "", "name", True),
+ ("Usage: %s [OPTIONS]" % __mod__, "", "summary", True),
+ utils.USAGE_OPTIONS,
+ ("Bus to probe:", "-b<bus> or --bus=<bus>", "option", False),
+ ("", "<bus>: cups, usb\*, net, bt, fw, par (\*default) (Note: bt and fw not supported in this release.)", "option", False),
+ ("Set Time to Live (TTL):", "-t<ttl> or --ttl=<ttl> (Default is 4).", "option", False),
+ ("Set timeout:", "-o<timeout in secs.> or --timeout=<timeout is secs.>", "option", False),
+ ("Filter by functionality:", "-e<filter list> or --filter=<filter list>", "option", False),
+ ("", "<filter list>: comma separated list of one or more of: scan, pcard, fax, copy, or none\*. (\*none is the default)", "option", False),
+ ("Search:", "-s<search re> or --search=<search re>", "option", False),
+ ("", "<search re> must be a valid regular expression (not case sensitive)", "option", False),
+ ("Network discovery method:", "-m<method> or --method=<method>: <method> is 'slp'* or 'mdns'.", "option", False),
+ utils.USAGE_LOGGING1, utils.USAGE_LOGGING2, utils.USAGE_LOGGING3,
+ utils.USAGE_HELP,
+ utils.USAGE_SPACE,
+ utils.USAGE_EXAMPLES,
+ ("Find all devices on the network:", "hp-probe -bnet", "example", False),
+ ("Find all devices on USB that support scanning:", "hp-probe -busb -escan", "example", False),
+ ("Find all networked devices that contain the name 'lnx' and that support photo cards or scanning:", "hp-probe -bnet -slnx -escan,pcard", "example", False),
+ ("Find all devices that have queues installed in CUPS:", "hp-probe -bcups", "example", False),
+ ("Find all devices on the USB bus:", "hp-probe", "example", False),
+ ]
+
+
+
+try:
+ mod = module.Module(__mod__, __title__, __version__, __doc__, USAGE,
+ (INTERACTIVE_MODE,))
+
+ opts, device_uri, printer_name, mode, ui_toolkit, loc = \
+ mod.parseStdOpts('b:t:o:e:s:m:',
+ ['ttl=', 'filter=', 'search=', 'find=',
+ 'method=', 'time-out=', 'timeout=', 'bus='],
+ handle_device_printer=False)
+
+ bus = None
+ timeout=10
+ ttl=4
+ filter = []
+ search = ''
+ method = 'slp'
+
+ for o, a in opts:
+ if o in ('-b', '--bus'):
+ try:
+ bus = [x.lower().strip() for x in a.split(',')]
+ except TypeError:
+ bus = ['usb']
+
+ if not device.validateBusList(bus):
+ mod.usage(error_msg=['Invalid bus name'])
+
+ elif o in ('-m', '--method'):
+ method = a.lower().strip()
+
+ if method not in ('slp', 'mdns', 'bonjour'):
+ mod.usage(error_msg=["Invalid network search protocol name. Must be 'slp' or 'mdns'."])
+ else:
+ bus = ['net']
+
+ elif o in ('-t', '--ttl'):
+ try:
+ ttl = int(a)
+ except ValueError:
+ ttl = 4
+ log.note("TTL value error. TTL set to default of 4 hops.")
+
+ elif o in ('-o', '--timeout', '--time-out'):
+ try:
+ timeout = int(a)
+ if timeout > 45:
+ log.note("Timeout > 45secs. Setting to 45secs.")
+ timeout = 45
+ except ValueError:
+ timeout = 5
+ log.note("Timeout value error. Timeout set to default of 5secs.")
+
+ if timeout < 0:
+ mod.usage(error_msg=["You must specify a positive timeout in seconds."])
+
+ elif o in ('-e', '--filter'):
+ filter = [x.strip().lower() for x in a.split(',')]
+ if not device.validateFilterList(filter):
+ mod.usage(error_msg=["Invalid term in filter"])
+
+ elif o in ('-s', '--search', '--find'):
+ search = a.lower().strip()
+
+ if bus is None:
+ bus = tui.connection_table()
+
+ if bus is None:
+ sys.exit(0)
+
+ log.info("\nUsing connection type: %s" % bus[0])
+
+ log.info("")
+
+ tui.header("DEVICE DISCOVERY")
+
+ for b in bus:
+ if b == 'net':
+ log.info(log.bold("Probing network for printers. Please wait, this will take approx. %d seconds...\n" % timeout))
+
+ FILTER_MAP = {'print' : None,
+ 'none' : None,
+ 'scan': 'scan-type',
+ 'copy': 'copy-type',
+ 'pcard': 'pcard-type',
+ 'fax': 'fax-type',
+ }
+
+ filter_dict = {}
+ for f in filter:
+ if f in FILTER_MAP:
+ filter_dict[FILTER_MAP[f]] = (operator.gt, 0)
+ else:
+ filter_dict[f] = (operator.gt, 0)
+
+ log.debug(filter_dict)
+
+ devices = device.probeDevices([b], timeout, ttl, filter_dict, search, method)
+ cleanup_spinner()
+
+ max_c1, max_c2, max_c3, max_c4 = 0, 0, 0, 0
+
+ if devices:
+ for d in devices:
+ max_c1 = max(len(d), max_c1)
+ max_c3 = max(len(devices[d][0]), max_c3)
+ max_c4 = max(len(devices[d][2]), max_c4)
+
+ if b == 'net':
+ formatter = utils.TextFormatter(
+ (
+ {'width': max_c1, 'margin' : 2},
+ {'width': max_c3, 'margin' : 2},
+ {'width': max_c4, 'margin' : 2},
+ )
+ )
+
+ log.info(formatter.compose(("Device URI", "Model", "Name")))
+ log.info(formatter.compose(('-'*max_c1, '-'*max_c3, '-'*max_c4)))
+ for d in devices:
+ log.info(formatter.compose((d, devices[d][0], devices[d][2])))
+
+ elif b in ('usb', 'par', 'cups'):
+ formatter = utils.TextFormatter(
+ (
+ {'width': max_c1, 'margin' : 2},
+ {'width': max_c3, 'margin' : 2},
+ )
+ )
+
+ log.info(formatter.compose(("Device URI", "Model")))
+ log.info(formatter.compose(('-'*max_c1, '-'*max_c3)))
+ for d in devices:
+ log.info(formatter.compose((d, devices[d][0])))
+
+ else:
+ log.error("Invalid bus: %s" % b)
+
+ log.info("\nFound %d printer(s) on the '%s' bus.\n" % (len(devices), b))
+
+ else:
+ log.warn("No devices found on the '%s' bus. If this isn't the result you are expecting," % b)
+
+ if b == 'net':
+ log.warn("check your network connections and make sure your internet")
+ log.warn("firewall software is disabled.")
+ else:
+ log.warn("check to make sure your devices are properly connected and powered on.")
+
+except KeyboardInterrupt:
+ log.error("User exit")
+
+log.info("")
+log.info("Done.")
diff --git a/query.py b/query.py
new file mode 100755
index 0000000..3fa91b5
--- /dev/null
+++ b/query.py
@@ -0,0 +1,165 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2009 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+__version__ = '0.2'
+__title__ = 'Model Query Utility'
+__mod__ = 'hp-query'
+__doc__ = "Query a printer model for static model information. Designed to be called from other processes."
+
+# Std Lib
+import sys
+
+# Local
+from base.g import *
+from base import device, models, module
+
+
+try:
+
+ mod = module.Module(__mod__, __title__, __version__, __doc__, None,
+ (NON_INTERACTIVE_MODE,), quiet=True)
+
+ mod.setUsage(0,
+ extra_options=[
+ ("Specify model by device URI:", "-d<device_uri> or --device=<device_uri>", "option", False),
+ ("Specify normalized model name:", "-m<model_name> or --model=<model_name> (normalized models.dat format)", "option", False),
+ ("Specify raw model name:", "-r<model_name> or --raw=<model_name> (raw model name from MDL: field of device ID)", "option", False),
+ ("Specify key to query:", "-k<key> or --key=<key> (or, use -a/--all to return all keys)", "option", False),
+ ("Query all keys:", "-a or --all (default separator is a LF)", "option", False),
+ ("Specify the separator when multiple keys are queried:", "-s<sep> --sep=<sep> (character or 'tab', 'newline', 'cr', 'lf', 'crlf')(only valid when used with -a/--all)", "option", False),
+ ("Suppress trailing linefeed:", "-x", "option", False),],
+ see_also_list=['hp-info'])
+
+ opts, device_uri, printer_name, mode, ui_toolkit, lang = \
+ mod.parseStdOpts('m:k:as:d:r:x', ['model=', 'key=', 'sep=', 'all', 'device=', 'raw='],
+ handle_device_printer=False)
+
+ norm_model = None
+ raw_model = None
+ device_uri = None
+ key = None
+ all_keys = False
+ sep = 'lf'
+ suppress_trailing_linefeed = False
+
+ for o, a in opts:
+ if o in ('-m', '--model'):
+ norm_model = a
+
+ elif o in ('-d', '--model'):
+ device_uri = a
+
+ elif o in ('-k', '--key'):
+ key = a
+ all_keys = False
+
+ elif o in ('-a', '--all'):
+ all_keys = True
+ key = None
+
+ elif o in ('-r', '--raw'):
+ raw_model = a
+
+ elif o in ('-s', '--sep'):
+ sep = a
+
+ elif o == '-x':
+ suppress_trailing_linefeed = True
+
+ if (device_uri and norm_model) or \
+ (device_uri and raw_model) or \
+ (norm_model and raw_model):
+ log.stderr("error: You may only specify one of -d, -m, or -r.")
+ sys.exit(1)
+
+ if not device_uri and not norm_model and not raw_model:
+ log.stderr("error: You must specify one of -d, -m, or -r.")
+ sys.exit(1)
+
+ if device_uri:
+ try:
+ back_end, is_hp, bus, norm_model, serial, dev_file, host, zc, port = \
+ device.parseDeviceURI(device_uri)
+ except Error:
+ log.stderr("error: Invalid device URI: %s" % device_uri)
+ sys.exit(1)
+
+ elif raw_model:
+ norm_model = models.normalizeModelName(raw_model).lower()
+
+ if not norm_model:
+ log.stderr("error: Invalid model name.")
+ sys.exit(1)
+
+ s = sep.lower()
+ if s in ('lf', 'newline'):
+ sep = '\n'
+ elif s == 'cr':
+ sep = '\r'
+ elif s == 'crlf':
+ sep = '\r\n'
+ elif s == 'tab':
+ sep = '\t'
+ elif s == '=':
+ log.stderr("error: Separator must not be '='.")
+ sys.exit(1)
+
+ data = device.queryModelByModel(norm_model)
+
+ if not data:
+ log.stderr("error: Model name '%s' not found." % norm_model)
+ sys.exit(1)
+
+ output = ''
+ if all_keys:
+ kk = data.keys()
+ kk.sort()
+ for k in kk:
+ if not output:
+ output = '%s=%s' % (k, data[k])
+ else:
+ output = sep.join([output, '%s=%s' % (k, data[k])])
+
+ elif key:
+ try:
+ data[key]
+ except KeyError:
+ log.stderr("error: Key '%s' not found." % key)
+ sys.exit(1)
+ else:
+ output = '%s=%s' % (key, data[key])
+
+ else:
+ log.stderr("error: Must specify key with -k/--key or specify -a/--all.")
+ sys.exit(1)
+
+ if suppress_trailing_linefeed:
+ print output,
+ else:
+ print output
+
+
+except KeyboardInterrupt:
+ pass
+
+
+
diff --git a/scan.py b/scan.py
new file mode 100755
index 0000000..ac67cab
--- /dev/null
+++ b/scan.py
@@ -0,0 +1,1134 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2011 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+# Contributors: Sarbeswar Meher
+#
+
+from __future__ import division
+
+__version__ = '2.2'
+__mod__ = 'hp-scan'
+__title__ = 'Scan Utility'
+__doc__ = "SANE-based scan utility for HPLIP supported all-in-one/mfp devices."
+
+# Std Lib
+import sys
+import os
+import os.path
+import getopt
+import signal
+import time
+import socket
+import operator
+
+# Local
+from base.g import *
+from base import tui, device, module, utils
+from prnt import cups
+
+
+username = prop.username
+r = res = 300
+scan_mode = 'gray'
+tlx = None
+tly = None
+brx = None
+bry = None
+units = "mm"
+output = ''
+dest = []
+email_from = ''
+email_to = []
+email_subject = 'hp-scan from %s' % socket.gethostname()
+email_note = ''
+resize = 100
+contrast = 0
+brightness = 0
+page_size = ''
+size_desc = ''
+page_units = 'mm'
+default_res = 300
+scanner_compression = 'JPEG'
+adf = False
+
+PAGE_SIZES = { # in mm
+ '5x7' : (127, 178, "5x7 photo", 'in'),
+ '4x6' : (102, 152, "4x6 photo", 'in'),
+ '3x5' : (76, 127, "3x5 index card", 'in'),
+ 'a2_env' : (111, 146, "A2 Envelope", 'in'),
+ 'a3' : (297, 420, "A3", 'mm'),
+ "a4" : (210, 297, "A4", 'mm'),
+ "a5" : (148, 210, "A5", 'mm'),
+ "a6" : (105, 148, "A6", 'mm'),
+ "b4" : (257, 364, "B4", 'mm'),
+ "b5" : (182, 257, "B5", 'mm'),
+ "c6_env" : (114, 162, "C6 Envelope", 'in'),
+ "dl_env" : (110, 220, "DL Envelope", 'in'),
+ "exec" : (184, 267, "Executive", 'in'),
+ "flsa" : (216, 330, "Flsa", 'mm'),
+ "higaki" : (100, 148, "Hagaki", 'mm'),
+ "japan_env_3" : (120, 235, "Japanese Envelope #3", 'mm'),
+ "japan_env_4" : (90, 205, "Japanese Envelope #4", 'mm'),
+ "legal" : (215, 356, "Legal", 'in'),
+ "letter" : (215, 279, "Letter", 'in'),
+ "no_10_env" : (105, 241, "Number 10 Envelope", 'in'),
+ "oufufu-hagaki" : (148, 200, "Oufuku-Hagaki", 'mm'),
+ "photo" : (102, 152, "Photo", 'in'),
+ "super_b" : (330, 483, "Super B", 'in'),
+ }
+
+
+try:
+ viewer = ''
+ viewer_list = ['kview', 'display', 'gwenview', 'eog', 'kuickshow',]
+ for v in viewer_list:
+ vv = utils.which(v)
+ if vv:
+ viewer = os.path.join(vv, v)
+ break
+
+
+ editor = ''
+ editor_list = ['kolourpaint', 'gimp', 'krita', 'cinepaint', 'mirage',]
+ for e in editor_list:
+ ee = utils.which(e)
+ if ee:
+ editor = os.path.join(ee, e)
+ break
+
+ pdf_viewer = ''
+ pdf_viewer_list = ['kpdf', 'acroread', 'xpdf', 'evince',]
+ for v in pdf_viewer_list:
+ vv = utils.which(v)
+ if vv:
+ pdf_viewer = os.path.join(vv, v)
+ break
+
+ mod = module.Module(__mod__, __title__, __version__, __doc__, None,
+ (INTERACTIVE_MODE,))
+
+ mod.setUsage(module.USAGE_FLAG_DEVICE_ARGS,
+ extra_options=[utils.USAGE_SPACE,
+ ("[OPTIONS] (General)", "", "header", False),
+ ("Scan destinations:", "-s<dest_list> or --dest=<dest_list>", "option", False),
+ ("", "where <dest_list> is a comma separated list containing one or more of: 'file'\*, ", "option", False),
+ ("", "'viewer', 'editor', 'pdf', or 'print'. Use only commas between values, no spaces.", "option", False),
+ ("Scan mode:", "-m<mode> or --mode=<mode>. Where <mode> is 'gray'\*, 'color' or 'lineart'.", "option", False),
+ ("Scanning resolution:", "-r<resolution_in_dpi> or --res=<resolution_in_dpi> or --resolution=<resolution_in_dpi>", "option", False),
+ ("", "where 300 is default.", "option", False),
+ ("Image resize:", "--resize=<scale_in_%> (min=1%, max=400%, default=100%)", "option", False),
+ ("Image contrast:", "--contrast=<contrast>", "option", False),
+ ("ADF mode:", "--adf (Note, only PDF output is supported when using the ADF)", "option", False),
+ utils.USAGE_SPACE,
+ ("[OPTIONS] (Scan area)", "", "header", False),
+ ("Specify the units for area/box measurements:", "-t<units> or --units=<units>", "option", False),
+ ("", "where <units> is 'mm'\*, 'cm', 'in', 'px', or 'pt' ('mm' is default).", "option", False),
+ ("Scan area:", "-a<tlx>,<tly>,<brx>,<bry> or --area=<tlx>,<tly>,<brx>,<bry>", "option", False),
+ ("", "Coordinates are relative to the upper left corner of the scan area.", "option", False),
+ ("", "Units for tlx, tly, brx, and bry are specified by -t/--units (default is 'mm').", "option", False),
+ ("", "Use only commas between values, no spaces.", "option", False),
+ ("Scan box:", "--box=<tlx>,<tly>,<width>,<height>", "option", False),
+ ("", "tlx and tly coordinates are relative to the upper left corner of the scan area.", "option", False),
+ ("", "Units for tlx, tly, width, and height are specified by -t/--units (default is 'mm').", "option", False),
+ ("", "Use only commas between values, no spaces.", "option", False),
+ ("Top left x of the scan area:", "--tlx=<tlx>", "option", False),
+ ("", "Coordinates are relative to the upper left corner of the scan area.", "option", False),
+ ("", "Units are specified by -t/--units (default is 'mm').", "option", False),
+ ("Top left y of the scan area:", "--tly=<tly>", "option", False),
+ ("", "Coordinates are relative to the upper left corner of the scan area.", "option", False),
+ ("", "Units are specified by -t/--units (default is 'mm').", "option", False),
+ ("Bottom right x of the scan area:", "--brx=<brx>", "option", False),
+ ("", "Coordinates are relative to the upper left corner of the scan area.", "option", False),
+ ("", "Units are specified by -t/--units (default is 'mm').", "option", False),
+ ("Bottom right y of the scan area:", "--bry=<bry>", "option", False),
+ ("", "Coordinates are relative to the upper left corner of the scan area.", "option", False),
+ ("", "Units are specified by -t/--units (default is 'mm').", "option", False),
+ ("Specify the scan area based on a paper size:", "--size=<paper size name>", "option", False),
+ ("", "where <paper size name> is one of: %s" % ', '.join(PAGE_SIZES.keys()), "option", False),
+ utils.USAGE_SPACE,
+ ("[OPTIONS] ('file' dest)", "", "header", False),
+ ("Filename for 'file' destination:", "-o<file> or -f<file> or --file=<file> or --output=<file>", "option", False),
+ utils.USAGE_SPACE,
+ ("[OPTIONS] ('pdf' dest)", "", "header", False),
+ ("PDF viewer application:", "--pdf=<pdf_viewer>", "option", False),
+ utils.USAGE_SPACE,
+ ("[OPTIONS] ('viewer' dest)", "", "header", False),
+ ("Image viewer application:", "-v<viewer> or --viewer=<viewer>", "option", False),
+ utils.USAGE_SPACE,
+ ("[OPTIONS] ('editor' dest)", "", "header", False),
+ ("Image editor application:", "-e<editor> or --editor=<editor>", "option", False),
+ utils.USAGE_SPACE,
+ ("[OPTIONS] ('email' dest)", "", "header", False),
+ ("From: address for 'email' dest:", "--email-from=<email_from_address> (required for 'email' dest.)", "option", False),
+ ("To: address for 'email' dest:", "--email-to=<email__to_address> (required for 'email' dest.)", "option", False),
+ ("Email subject for 'email' dest:", '--email-subject="<subject>" or --subject="<subject>"', "option", False),
+ ("", 'Use double quotes (") around the subject if it contains space characters.', "option", False),
+ ("Note or message for the 'email' dest:", '--email-msg="<msg>" or --email-note="<note>"', "option", False),
+ ("", 'Use double quotes (") around the note/message if it contains space characters.', "option", False),
+ utils.USAGE_SPACE,
+ ("[OPTIONS] ('printer' dest)", "", "header", False),
+ ("Printer queue/printer:", "--printer=<printer_name>", "option", False),
+ utils.USAGE_SPACE,
+ ("[OPTIONS] (advanced)", "", "header", False),
+ ("Set the scanner compression mode:", "-x<mode> or --compression=<mode>, <mode>='raw', 'none' or 'jpeg' ('jpeg' is default) ('raw' and 'none' are equivalent)", "option", False),],
+ see_also_list=[])
+
+ opts, device_uri, printer_name, mode, ui_toolkit, lang = \
+ mod.parseStdOpts('s:m:r:c:t:a:b:o:v:f:c:x:e:',
+ ['dest=', 'mode=', 'res=', 'resolution=',
+ 'resize=', 'contrast=', 'adf', 'unit=',
+ 'units=', 'area=', 'box=', 'tlx=',
+ 'tly=', 'brx=', 'bry=', 'size=',
+ 'file=', 'output=', 'pdf=', 'viewer=',
+ 'email-from=', 'from=', 'email-to=',
+ 'to=', 'email-msg=', 'msg=',
+ 'printer=', 'compression=' , 'raw',
+ 'jpeg', 'color', 'lineart', 'colour',
+ 'bw', 'gray', 'grayscale', 'grey',
+ 'greyscale', 'email-subject=',
+ 'subject=', 'to=', 'from=', 'jpg',
+ 'grey-scale', 'gray-scale', 'about=',
+ 'editor='
+ ])
+
+
+
+ device_uri = mod.getDeviceUri(device_uri, printer_name,
+ back_end_filter=['hpaio'], filter={'scan-type': (operator.gt, 0)})
+
+ for o, a in opts:
+ if o in ('-x', '--compression'):
+ a = a.strip().lower()
+
+ if a in ('jpeg', 'jpg'):
+ scanner_compression = 'JPEG'
+
+ elif a in ('raw', 'none'):
+ scanner_compression = 'None'
+
+ else:
+ log.error("Invalid compression value. Valid values are 'jpeg', 'raw', and 'none'.")
+ log.error("Using default value of 'jpeg'.")
+ scanner_compression = 'JPEG'
+
+ elif o == 'raw':
+ scanner_compression = 'None'
+
+ elif o == 'jpeg':
+ scanner_compression = 'JPEG'
+
+ elif o in ('--color', '--colour'):
+ scan_mode = 'color'
+
+ elif o in ('--lineart', '--line-art', '--bw'):
+ scan_mode = 'lineart'
+
+ elif o in ('--gray', '--grayscale', '--gray-scale', '--grey', '--greyscale', '--grey-scale'):
+ scan_mode = 'gray'
+
+ elif o in ('-m', '--mode'):
+ a = a.strip().lower()
+
+ if a in ('color', 'colour'):
+ scan_mode = 'color'
+
+ elif a in ('lineart', 'bw', 'b&w'):
+ scan_mode = 'lineart'
+
+ elif a in ('gray', 'grayscale', 'grey', 'greyscale'):
+ scan_mode = 'gray'
+
+ else:
+ log.error("Invalid mode. Using default of 'gray'.")
+ log.error("Valid modes are 'color', 'lineart', or 'gray'.")
+ scan_mode = 'gray'
+
+ elif o in ('--res', '--resolution', '-r'):
+ try:
+ r = int(a.strip())
+ except ValueError:
+ log.error("Invalid value for resolution.")
+ res = default_res
+ else:
+ res = r
+
+ elif o in ('-t', '--units', '--unit'):
+ a = a.strip().lower()
+
+ if a in ('in', 'inch', 'inches'):
+ units = 'in'
+
+ elif a in ('mm', 'milimeter', 'milimeters', 'millimetre', 'millimetres'):
+ units = 'mm'
+
+ elif a in ('cm', 'centimeter', 'centimeters', 'centimetre', 'centimetres'):
+ units = 'cm'
+
+ elif a in ('px', 'pixel', 'pixels', 'pel', 'pels'):
+ units = 'px'
+
+ elif a in ('pt', 'point', 'points', 'pts'):
+ units = 'pt'
+
+ else:
+ log.error("Invalid units. Using default of 'mm'.")
+ units = 'mm'
+
+ elif o == '--tlx':
+ a = a.strip().lower()
+ try:
+ f = float(a)
+ except ValueError:
+ log.error("Invalid value for tlx.")
+ else:
+ tlx = f
+
+ elif o == '--tly':
+ a = a.strip().lower()
+ try:
+ f = float(a)
+ except ValueError:
+ log.error("Invalid value for tly.")
+ else:
+ tly = f
+
+ elif o == '--brx':
+ a = a.strip().lower()
+ try:
+ f = float(a)
+ except ValueError:
+ log.error("Invalid value for brx.")
+ else:
+ brx = f
+
+ elif o == '--bry':
+ a = a.strip().lower()
+ try:
+ f = float(a)
+ except ValueError:
+ log.error("Invalid value for bry.")
+ else:
+ bry = f
+
+ elif o in ('-a', '--area'): # tlx, tly, brx, bry
+ a = a.strip().lower()
+ try:
+ tlx, tly, brx, bry = a.split(',')[:4]
+ except ValueError:
+ log.error("Invalid scan area. Using defaults.")
+ else:
+ try:
+ tlx = float(tlx)
+ except ValueError:
+ log.error("Invalid value for tlx. Using defaults.")
+ tlx = None
+
+ try:
+ tly = float(tly)
+ except ValueError:
+ log.error("Invalid value for tly. Using defaults.")
+ tly = None
+
+ try:
+ brx = float(brx)
+ except ValueError:
+ log.error("Invalid value for brx. Using defaults.")
+ brx = None
+
+ try:
+ bry = float(bry)
+ except ValueError:
+ log.error("Invalid value for bry. Using defaults.")
+ bry = None
+
+ elif o in ('-b', '--box'): # tlx, tly, w, h
+ a = a.strip().lower()
+ try:
+ tlx, tly, width, height = a.split(',')[:4]
+ except ValueError:
+ log.error("Invalid scan area. Using defaults.")
+ else:
+ try:
+ tlx = float(tlx)
+ except ValueError:
+ log.error("Invalid value for tlx. Using defaults.")
+ tlx = None
+
+ try:
+ tly = float(tly)
+ except ValueError:
+ log.error("Invalid value for tly. Using defaults.")
+ tly = None
+
+ if tlx is not None:
+ try:
+ brx = float(width) + tlx
+ except ValueError:
+ log.error("Invalid value for width. Using defaults.")
+ brx = None
+ else:
+ log.error("Cannot calculate brx since tlx is invalid. Using defaults.")
+ brx = None
+
+ if tly is not None:
+ try:
+ bry = float(height) + tly
+ except ValueError:
+ log.error("Invalid value for height. Using defaults.")
+ bry = None
+ else:
+ log.error("Cannot calculate bry since tly is invalid. Using defaults.")
+ bry = None
+
+ elif o == '--size':
+ size = a.strip().lower()
+ if size in PAGE_SIZES:
+ brx, bry, size_desc, page_units = PAGE_SIZES[size]
+ tlx, tly = 0, 0
+ page_size = size
+ else:
+ log.error("Invalid page size. Valid page sizes are: %s" % ', '.join(PAGE_SIZES.keys()))
+ log.error("Using defaults.")
+
+ elif o in ('-o', '--output', '-f', '--file'):
+ output = os.path.abspath(os.path.normpath(os.path.expanduser(a.strip())))
+
+ try:
+ ext = os.path.splitext(output)[1]
+ except IndexError:
+ log.error("Invalid filename extension.")
+ output = ''
+ if 'file' in dest:
+ dest.remove('file')
+ else:
+ if ext.lower() not in ('.jpg', '.png'):
+ log.error("Only JPG (.jpg) and PNG (.png) output files are supported.")
+ output = ''
+ if 'file' in dest:
+ dest.remove('file')
+ else:
+ if os.path.exists(output):
+ log.warn("Output file '%s' exists. File will be overwritten." % output)
+
+ if 'file' not in dest:
+ dest.append('file')
+
+ elif o in ('-s', '--dest', '--destination'):
+ a = a.strip().lower().split(',')
+ for aa in a:
+ aa = aa.strip()
+ if aa in ('file', 'viewer', 'editor', 'printer', 'print', 'email', 'pdf') \
+ and aa not in dest:
+ if aa == 'print': aa = 'printer'
+ dest.append(aa)
+
+ elif o in ('-v', '--viewer'):
+ a = a.strip()
+ b = utils.which(a)
+ if not b:
+ log.error("Viewer application not found.")
+ else:
+ viewer = os.path.join(b, a)
+ if 'viewer' not in dest:
+ dest.append('viewer')
+
+ elif o in ('-e', '--editor'):
+ a = a.strip()
+ b = utils.which(a)
+ if not b:
+ log.error("Editor application not found.")
+ else:
+ editor = os.path.join(b, a)
+ if 'editor' not in dest:
+ dest.append('editor')
+
+ elif o == '--pdf':
+ a = a.strip()
+ b = utils.which(a)
+ if not b:
+ log.error("PDF viewer application not found.")
+ else:
+ pdf_viewer = os.path.join(b, a)
+ if 'pdf' not in dest:
+ dest.append('pdf')
+
+
+ elif o in ('--email-to', '--to'):
+ email_to = a.split(',')
+ if 'email' not in dest:
+ dest.append('email')
+
+ elif o in ('--email-from', '--from'):
+ email_from = a
+ if 'email' not in dest:
+ dest.append('email')
+
+ elif o in ('--email-subject', '--subject', '--about'):
+ email_subject = a
+ if 'email' not in dest:
+ dest.append('email')
+
+ elif o in ('--email-note', '--email-msg', '--msg', '--message', '--note', '--notes'):
+ email_note = a
+ if 'email' not in dest:
+ dest.append('email')
+
+ elif o == '--resize':
+ a = a.replace("%", "")
+ try:
+ resize = int(a)
+ except ValueError:
+ resize = 100
+ log.error("Invalid resize value. Using default of 100%.")
+
+ elif o in ('-b', '--brightness'):
+ pass
+
+ elif o in ('-c', '--contrast'):
+ try:
+ contrast = int(a.strip())
+ except ValueError:
+ log.error("Invalid contrast value. Using default of 100.")
+ contrast = 100
+
+ elif o == '--adf':
+ adf = True
+ output_type = 'pdf'
+
+
+ if printer_name is not None and \
+ device.getDeviceURIByPrinterName(printer_name) is not None and \
+ 'printer' not in dest:
+
+ dest.append('printer')
+
+ if not dest:
+ log.warn("No destinations specified. Adding 'file' destination by default.")
+ dest.append('file')
+
+ if 'email' in dest and (not email_from or not email_to):
+ log.error("Email specified, but email to and/or email from address(es) were not specified.")
+ log.error("Disabling 'email' destination.")
+ dest.remove("email")
+
+ if page_size:
+ units = 'mm'
+
+ if units == 'in':
+ if tlx is not None: tlx = tlx * 25.4
+ if tly is not None: tly = tly * 25.4
+ if brx is not None: brx = brx * 25.4
+ if bry is not None: bry = bry * 25.4
+
+ elif units == 'cm':
+ if tlx is not None: tlx = tlx * 10.0
+ if tly is not None: tly = tly * 10.0
+ if brx is not None: brx = brx * 10.0
+ if bry is not None: bry = bry * 10.0
+
+ elif units == 'pt':
+ if tlx is not None: tlx = tlx * 0.3528
+ if tly is not None: tly = tly * 0.3528
+ if brx is not None: brx = brx * 0.3528
+ if bry is not None: bry = bry * 0.3528
+
+ elif units == 'px':
+ log.warn("Units set to pixels. Using resolution of %ddpi for area calculations." % res)
+ if tlx is not None: tlx = tlx / res * 25.4
+ if tly is not None: tly = tly / res * 25.4
+ if brx is not None: brx = brx / res * 25.4
+ if bry is not None: bry = bry / res * 25.4
+
+ if tlx is not None and brx is not None and tlx >= brx:
+ log.error("Invalid values for tlx (%d) and brx (%d) (tlx>=brx). Using defaults." % (tlx, brx))
+ tlx = brx = None
+
+ if tly is not None and bry is not None and tly >= bry:
+ log.error("Invalid values for tly (%d) and bry (%d) (tly>=bry). Using defaults." % (tly, bry))
+ tly = bry = None
+
+ if not prop.scan_build:
+ log.error("Scanning disabled in build. Exiting")
+ sys.exit(1)
+
+ if mode == GUI_MODE:
+ log.error("GUI mode is not implemented yet. Refer to 'hp-scan -h' for help.")
+ sys.exit(1)
+
+
+ else: # INTERACTIVE_MODE
+ import Queue
+ from scan import sane
+ import scanext
+ import cStringIO
+
+ try:
+ import subprocess
+ except ImportError:
+ # Pre-2.4 Python
+ from base import subproc as subprocess
+
+ try:
+ import Image
+ except ImportError:
+ log.error("%s requires the Python Imaging Library (PIL). Exiting." % __mod__)
+ sys.exit(1)
+
+ sane.init()
+ devices = sane.getDevices()
+
+ # Make sure SANE backend sees the device...
+ for d, mfg, mdl, t in devices:
+ if d == device_uri:
+ break
+ else:
+ log.error("Unable to locate device %s using SANE backend hpaio:. Please check HPLIP installation." % device_uri)
+ sys.exit(1)
+
+ log.info(log.bold("Using device %s" % device_uri))
+ log.info("Opening connection to device...")
+
+ try:
+ device = sane.openDevice(device_uri)
+ except scanext.error, e:
+ sane.reportError(e)
+ sys.exit(1)
+
+ tlx = device.getOptionObj('tl-x').limitAndSet(tlx)
+ tly = device.getOptionObj('tl-y').limitAndSet(tly)
+ brx = device.getOptionObj('br-x').limitAndSet(brx)
+ bry = device.getOptionObj('br-y').limitAndSet(bry)
+
+ scan_area = (brx - tlx) * (bry - tly) # mm^2
+ scan_px = scan_area * res * res / 645.16 # res is in DPI
+
+ valid_res = device.getOptionObj('resolution').constraint
+ log.debug("Device supported resolutions %s" % (valid_res,))
+ if 0 in valid_res: #min-max range in tuple
+ if res < valid_res[0] or res > valid_res[1]:
+ log.warn("Invalid resolution. Using closest valid resolution of %d dpi" % res)
+ if res < valid_res[0]:
+ res = valid_res[0]
+ elif res > valid_res[1]:
+ res = valid_res[1]
+
+ else:
+ if res not in valid_res:
+ log.warn("Invalid resolution. Using closest valid resolution of %d dpi" % res)
+ log.warn("Valid resolutions are %s dpi." % ', '.join([str(x) for x in valid_res]))
+ res = valid_res[0]
+ min_dist = sys.maxint
+ for x in valid_res:
+ if abs(r-x) < min_dist:
+ min_dist = abs(r-x)
+ res = x
+
+ res = device.getOptionObj('resolution').limitAndSet(res)
+
+ if scan_mode == 'color':
+ scan_size = scan_px * 3 # 3 bytes/px
+ else:
+ scan_size = scan_px # 1 byte/px
+
+ if scan_size > 52428800: # 50MB
+ if res > 600:
+ log.warn("Using resolutions greater than 600 dpi will cause very large files to be created.")
+ else:
+ log.warn("The scan current parameters will cause very large files to be created.")
+
+ log.warn("This can cause the scan to take a long time to complete and may cause your system to slow down.")
+ log.warn("Approx. number of bytes to read from scanner: %s" % utils.format_bytes(scan_size, True))
+
+ device.setOption('compression', scanner_compression)
+
+ if brx - tlx <= 0.0 or bry - tly <= 0.0:
+ log.error("Invalid scan area (width or height is negative).")
+ sys.exit(1)
+
+ log.info("")
+ log.info("Resolution: %ddpi" % res)
+ log.info("Mode: %s" % scan_mode)
+ log.info("Compression: %s" % scanner_compression)
+ log.info("Scan area (mm):")
+ log.info(" Top left (x,y): (%fmm, %fmm)" % (tlx, tly))
+ log.info(" Bottom right (x,y): (%fmm, %fmm)" % (brx, bry))
+ log.info(" Width: %fmm" % (brx - tlx))
+ log.info(" Height: %fmm" % (bry - tly))
+
+ if page_size:
+ units = page_units # for display purposes only
+ log.info("Page size: %s" % size_desc)
+ if units != 'mm':
+ log.note("This scan area below in '%s' units may not be exact due to rounding errors." % units)
+
+ if units == 'in':
+ log.info("Scan area (in):")
+ log.info(" Top left (x,y): (%fin, %fin)" % (tlx/25.4, tly/25.4))
+ log.info(" Bottom right (x,y): (%fin, %fin)" % (brx/25.4, bry/25.4))
+ log.info(" Width: %fin" % ((brx - tlx)/25.4))
+ log.info(" Height: %fin" % ((bry - tly)/25.4))
+
+ elif units == 'cm':
+ log.info("Scan area (cm):")
+ log.info(" Top left (x,y): (%fcm, %fcm)" % (tlx/10.0, tly/10.0))
+ log.info(" Bottom right (x,y): (%fcm, %fcm)" % (brx/10.0, bry/10.0))
+ log.info(" Width: %fcm" % ((brx - tlx)/10.0))
+ log.info(" Height: %fcm" % ((bry - tly)/10.0))
+
+ elif units == 'px':
+ log.info("Scan area (px @ %ddpi):" % res)
+ log.info(" Top left (x,y): (%fpx, %fpx)" % (tlx*res/25.4, tly*res/25.4))
+ log.info(" Bottom right (x,y): (%fpx, %fpx)" % (brx*res/25.4, bry*res/25.4))
+ log.info(" Width: %fpx" % ((brx - tlx)*res/25.4))
+ log.info(" Height: %fpx" % ((bry - tly)*res/25.4))
+
+ elif units == 'pt':
+ log.info("Scan area (pt):")
+ log.info(" Top left (x,y): (%fpt, %fpt)" % (tlx/0.3528, tly/0.3528))
+ log.info(" Bottom right (x,y): (%fpt, %fpt)" % (brx/0.3528, bry/0.3528))
+ log.info(" Width: %fpt" % ((brx - tlx)/0.3528))
+ log.info(" Height: %fpt" % ((bry - tly)/0.3528))
+
+ log.info("Destination(s): %s" % ', '.join(dest))
+
+ if 'file' in dest:
+ log.info("Output file: %s" % output)
+
+ update_queue = Queue.Queue()
+ event_queue = Queue.Queue()
+
+ device.setOption("mode", scan_mode)
+ device.setOption("resolution", res)
+
+ source_option = device.getOptionObj("source").constraint
+ log.debug("Supported source Options: %s size=%d" % (source_option,len(source_option)))
+ if source_option is None:
+ log.error("Device doesn't have scanner.")
+ sys.exit(1)
+
+ #check if device has only ADF
+ if len(source_option) == 1 and 'ADF' in source_option:
+ log.debug("Device has only ADF support")
+ adf = True
+
+ if adf:
+ try:
+ if 'ADF' not in source_option:
+ log.error("Failed to set ADF mode. This device doesn't support ADF.")
+ sys.exit(1)
+ else:
+ device.setOption("source", "ADF")
+ device.setOption("batch-scan", True)
+ except scanext.error:
+ log.error("Error in setting ADF mode.")
+ sys.exit(1)
+
+ else:
+ try:
+ device.setOption("source", "Flatbed")
+ device.setOption("batch-scan", False)
+ except scanext.error:
+ log.debug("Error setting source or batch-scan option (this is probably OK).")
+
+
+ if 'file' in dest and not output:
+ log.warn("File destination enabled with no output file specified.")
+
+ if adf:
+ log.info("Setting output format to PDF for ADF mode.")
+ output = utils.createSequencedFilename("hpscan", ".pdf")
+ output_type = 'pdf'
+ else:
+ if scan_mode == 'gray':
+ log.info("Setting output format to PNG for greyscale mode.")
+ output = utils.createSequencedFilename("hpscan", ".png")
+ output_type = 'png'
+ else:
+ log.info("Setting output format to JPEG for color/lineart mode.")
+ output = utils.createSequencedFilename("hpscan", ".jpg")
+ output_type = 'jpeg'
+
+ log.warn("Defaulting to '%s'." % output)
+
+ else:
+ try:
+ output_type = os.path.splitext(output)[1].lower()[1:]
+ if output_type == 'jpg':
+ output_type = 'jpeg'
+ except IndexError:
+ output_type = ''
+
+ if output_type and output_type not in ('jpeg', 'png', 'pdf'):
+ log.error("Invalid output file format. File formats must be 'jpeg', 'png', or 'pdf'.")
+ sys.exit(1)
+
+ if adf and output_type and output_type != 'pdf':
+ log.error("ADF scans must be saved in PDF file format.")
+ sys.exit(1)
+
+ log.info("\nWarming up...")
+
+ no_docs = False
+ page = 1
+ adf_page_files = []
+ #adf_pages = []
+
+ cleanup_spinner()
+ log.info("")
+
+ try:
+ while True:
+ if adf:
+ log.info("\nPage %d: Scanning..." % page)
+ else:
+ log.info("\nScanning...")
+
+ bytes_read = 0
+
+ try:
+ try:
+ ok, expected_bytes, status = device.startScan("RGBA", update_queue, event_queue)
+ # Note: On some scanners (Marvell) expected_bytes will be < 0 (if lines == -1)
+ log.debug("expected_bytes = %d" % expected_bytes)
+ except scanext.error, e:
+ sane.reportError(e)
+ sys.exit(1)
+ except KeyboardInterrupt:
+ log.error("Aborted.")
+ device.cancelScan()
+ sys.exit(1)
+
+ if adf and status == scanext.SANE_STATUS_NO_DOCS:
+ if page-1 == 0:
+ log.error("No document(s). Please load documents and try again.")
+ sys.exit(0)
+ else:
+ log.info("Out of documents. Scanned %d pages total." % (page-1))
+ no_docs = True
+ break
+
+ if expected_bytes > 0:
+ if adf:
+ log.info("Expecting to read %s from scanner (per page)." % utils.format_bytes(expected_bytes))
+ else:
+ log.info("Expecting to read %s from scanner." % utils.format_bytes(expected_bytes))
+
+ device.waitForScanActive()
+
+ pm = tui.ProgressMeter("Reading data:")
+
+ while device.isScanActive():
+ while update_queue.qsize():
+ try:
+ status, bytes_read = update_queue.get(0)
+
+ if not log.is_debug():
+ if expected_bytes > 0:
+ pm.update(int(100*bytes_read/expected_bytes),
+ utils.format_bytes(bytes_read))
+ else:
+ pm.update(0,
+ utils.format_bytes(bytes_read))
+
+ if status != scanext.SANE_STATUS_GOOD:
+ log.error("Error in reading data. Status=%d bytes_read=%d." % (status, bytes_read))
+ sys.exit(1)
+
+ except Queue.Empty:
+ break
+
+
+ time.sleep(0.5)
+
+ except KeyboardInterrupt:
+ log.error("Aborted.")
+ device.cancelScan()
+ sys.exit(1)
+
+ # Make sure queue is cleared out...
+ while update_queue.qsize():
+ status, bytes_read = update_queue.get(0)
+
+ if not log.is_debug():
+ if expected_bytes > 0:
+ pm.update(int(100*bytes_read/expected_bytes),
+ utils.format_bytes(bytes_read))
+ else:
+ pm.update(0,
+ utils.format_bytes(bytes_read))
+
+ log.info("")
+
+ if bytes_read:
+ log.info("Read %s from scanner." % utils.format_bytes(bytes_read))
+
+ buffer, format, format_name, pixels_per_line, \
+ lines, depth, bytes_per_line, pad_bytes, total_read = device.getScan()
+
+ log.debug("PPL=%d lines=%d depth=%d BPL=%d pad=%d total=%d" %
+ (pixels_per_line, lines, depth, bytes_per_line, pad_bytes, total_read))
+
+ #For Marvell devices, expected bytes is not same as total_read
+ if lines == -1 or total_read != expected_bytes:
+ lines = int(total_read / bytes_per_line)
+
+ if scan_mode in ('color', 'gray'):
+ try:
+ im = Image.frombuffer('RGBA', (pixels_per_line, lines), buffer.read(),
+ 'raw', 'RGBA', 0, 1)
+ except ValueError:
+ log.error("Did not read enough data from scanner (I/O Error?)")
+ sys.exit(1)
+ elif scan_mode == 'lineart':
+ try:
+ im = Image.frombuffer('RGBA', (pixels_per_line, lines), buffer.read(),
+ 'raw', 'RGBA', 0, 1).convert('L')
+ except ValueError:
+ log.error("Did not read enough data from scanner (I/O Error?)")
+ sys.exit(1)
+
+ if adf:
+ temp_output = utils.createSequencedFilename("hpscan_pg%d_" % page, ".png")
+ adf_page_files.append(temp_output)
+ im.save(temp_output)
+ log.debug("Saved page %d to file %s" % (page, temp_output))
+ else:
+ log.error("No data read.")
+ sys.exit(1)
+
+ if not adf or (adf and no_docs):
+ break
+
+ page += 1
+
+ finally:
+ log.info("Closing device.")
+ device.cancelScan()
+
+ if adf:
+ try:
+ from reportlab.pdfgen import canvas
+ except ImportError:
+ log.error("PDF output requires ReportLab.")
+ sys.exit(1)
+
+ if not output:
+ output = utils.createSequencedFilename("hpscan", ".pdf")
+
+ c = canvas.Canvas(output, (brx/0.3528, bry/0.3528))
+
+ for p in adf_page_files:
+ log.info("Processing page %s..." % p)
+ image = Image.open(p)
+
+ try:
+ c.drawInlineImage(image, (tlx/0.3528), (tly/0.3528), ((brx-tlx)/0.3528),((bry-tly)/0.3528))
+ except NameError:
+ log.error("A problem has occurred with PDF generation. This is a known bug in ReportLab. Please update your install of ReportLab to version 2.0 or greater.")
+ sys.exit(1)
+
+ c.showPage()
+
+ log.info("Saving to file %s" % output)
+ c.save()
+ log.info("Viewing PDF file in %s" % pdf_viewer)
+ os.system("%s %s &" % (pdf_viewer, output))
+
+ sys.exit(0)
+
+ if resize != 100:
+ if resize < 1 or resize > 400:
+ log.error("Resize parameter is incorrect. Resize must be 0% < resize < 400%.")
+ log.error("Using resize value of 100%.")
+ else:
+ new_w = int(pixels_per_line * resize / 100)
+ new_h = int(lines * resize / 100)
+ log.info("Resizing image from %dx%d to %dx%d..." % (pixels_per_line, lines, new_w, new_h))
+ im = im.resize((new_w, new_h), Image.ANTIALIAS)
+
+ file_saved = False
+ if 'file' in dest:
+ log.info("\nOutputting to destination 'file':")
+ log.info("Saving to file %s" % output)
+
+ try:
+ im.save(output)
+ except IOError, e:
+ log.error("Error saving file: %s (I/O)" % e)
+ try:
+ os.remove(output)
+ except OSError:
+ pass
+ sys.exit(1)
+ except ValueError, e:
+ log.error("Error saving file: %s (PIL)" % e)
+ try:
+ os.remove(output)
+ except OSError:
+ pass
+ sys.exit(1)
+
+ file_saved = True
+ dest.remove("file")
+
+ temp_saved = False
+ if ('editor' in dest or 'viewer' in dest or 'email' in dest or 'printer' in dest) \
+ and not file_saved:
+
+ output_fd, output = utils.make_temp_file(suffix='.png')
+ try:
+ im.save(output)
+ except IOError, e:
+ log.error("Error saving temporary file: %s" % e)
+
+ try:
+ os.remove(output)
+ except OSError:
+ pass
+
+ sys.exit(1)
+
+ os.close(output_fd)
+ temp_saved = True
+
+ for d in dest:
+ log.info("\nSending to destination '%s':" % d)
+
+ if d == 'pdf':
+ try:
+ from reportlab.pdfgen import canvas
+ except ImportError:
+ log.error("PDF output requires ReportLab.")
+ continue
+
+ pdf_output = utils.createSequencedFilename("hpscan", ".pdf")
+ c = canvas.Canvas(pdf_output, (brx/0.3528, bry/0.3528))
+
+ try:
+ c.drawInlineImage(im, (tlx/0.3528), (tly/0.3528), ((brx-tlx)/0.3528),((bry-tly)/0.3528))
+ except NameError:
+ log.error("A problem has occurred with PDF generation. This is a known bug in ReportLab. Please update your install of ReportLab to version 2.0 or greater.")
+ continue
+
+ c.showPage()
+ log.info("Saving to file %s" % pdf_output)
+ c.save()
+ log.info("Viewing PDF file in %s" % pdf_viewer)
+ os.system("%s %s &" % (pdf_viewer, pdf_output))
+
+ sys.exit(0)
+
+ elif d == 'printer':
+ hp_print = utils.which("hp-print")
+ if hp_print:
+ cmd = 'hp-print %s &' % output
+ else:
+ cmd = "python ./print.py %s &" % output
+
+ os.system(cmd)
+
+ elif d == 'email':
+ try:
+ from email.mime.image import MIMEImage
+ from email.mime.multipart import MIMEMultipart
+ from email.mime.text import MIMEText
+ except ImportError:
+ try:
+ from email.MIMEImage import MIMEImage
+ from email.MIMEMultipart import MIMEMultipart
+ from email.MIMEText import MIMEText
+ except ImportError:
+ log.error("hp-scan email destination requires Python 2.2+.")
+ continue
+
+ msg = MIMEMultipart()
+ msg['Subject'] = email_subject
+ msg['From'] = email_from
+ msg['To'] = ','.join(email_to)
+ msg.preamble = 'Scanned using hp-scan'
+
+ if email_note:
+ txt = MIMEText(email_note)
+ msg.attach(txt)
+
+ if file_saved:
+ txt = MIMEText("attached: %s: %dx%d %s PNG image." %
+ (os.path.basename(output), pixels_per_line, lines, scan_mode))
+ else:
+ txt = MIMEText("attached: %dx%d %s PNG image." % (pixels_per_line, lines, scan_mode))
+
+ msg.attach(txt)
+
+ fp = open(output, 'r')
+ img = MIMEImage(fp.read())
+ fp.close()
+
+ if file_saved:
+ img.add_header('Content-Disposition', 'attachment', filename=os.path.basename(output))
+
+ msg.attach(img)
+
+ sendmail = utils.which("sendmail")
+
+ if sendmail:
+ sendmail = os.path.join(sendmail, 'sendmail')
+ cmd = [sendmail,'-t','-r',email_from]
+
+ log.debug(repr(cmd))
+ err = None
+ try:
+ sp = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+ std_out, std_err = sp.communicate(msg.as_string())
+ if std_err != '':
+ err = std_err
+ except OSError, e:
+ err = str(e)
+ cleanup_spinner()
+
+ if err:
+ log.error(repr(err))
+
+ else:
+ log.error("Mail send failed. 'sendmail' not found.")
+
+ elif d == 'viewer':
+ if viewer:
+ log.info("Viewing file in %s" % viewer)
+ os.system("%s %s &" % (viewer, output))
+ else:
+ log.error("Viewer not found.")
+
+ elif d == 'editor':
+ if editor:
+ log.info("Editing file in %s" % editor)
+ os.system("%s %s &" % (editor, output))
+ else:
+ log.error("Editor not found.")
+
+ device.freeScan()
+ sane.deInit()
+
+
+except KeyboardInterrupt:
+ log.error("User exit")
+
+log.info("")
+log.info("Done.")
+
diff --git a/scan/__init__.py b/scan/__init__.py
new file mode 100644
index 0000000..ffdcaff
--- /dev/null
+++ b/scan/__init__.py
@@ -0,0 +1,19 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2007 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+
diff --git a/scan/sane.py b/scan/sane.py
new file mode 100755
index 0000000..1b5395a
--- /dev/null
+++ b/scan/sane.py
@@ -0,0 +1,635 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2008 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Based on:
+# "sane.py", part of the Python Imaging Library (PIL)
+# http://www.pythonware.com/products/pil/
+# Python wrapper on top of the _sane module, which is in turn a very
+# thin wrapper on top of the SANE library. For a complete understanding
+# of SANE, consult the documentation at the SANE home page:
+# http://www.mostang.com/sane/ .#
+#
+# Modified to work without PIL by Don Welch
+#
+# (C) Copyright 2003 A.M. Kuchling. All Rights Reserved
+# (C) Copyright 2004 A.M. Kuchling, Ralph Heinkel All Rights Reserved
+#
+# Permission to use, copy, modify, and distribute this software and its
+# documentation for any purpose and without fee is hereby granted,
+# provided that the above copyright notice appear in all copies and that
+# both that copyright notice and this permission notice appear in
+# supporting documentation, and that the name of A.M. Kuchling and
+# Ralph Heinkel not be used in advertising or publicity pertaining to
+# distribution of the software without specific, written prior permission.
+#
+# A.M. KUCHLING, R.H. HEINKEL DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
+# SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS,
+# IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
+# USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+# OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+# PERFORMANCE OF THIS SOFTWARE.
+# Python wrapper on top of the scanext module, which is in turn a very
+# thin wrapper on top of the SANE library. For a complete understanding
+# of SANE, consult the documentation at the SANE home page:
+# http://www.mostang.com/sane/ .
+#
+# Original authors: Andrew Kuchling, Ralph Heinkel
+# Modified by: Don Welch
+#
+
+# Std Lib
+import scanext
+import threading
+import time
+import os
+import Queue
+
+# Local
+from base.g import *
+from base import utils
+
+EVENT_SCAN_CANCELED = 1
+
+TYPE_STR = { scanext.TYPE_BOOL: "TYPE_BOOL", scanext.TYPE_INT: "TYPE_INT",
+ scanext.TYPE_FIXED: "TYPE_FIXED", scanext.TYPE_STRING: "TYPE_STRING",
+ scanext.TYPE_BUTTON: "TYPE_BUTTON", scanext.TYPE_GROUP: "TYPE_GROUP" }
+
+UNIT_STR = { scanext.UNIT_NONE: "UNIT_NONE",
+ scanext.UNIT_PIXEL: "UNIT_PIXEL",
+ scanext.UNIT_BIT: "UNIT_BIT",
+ scanext.UNIT_MM: "UNIT_MM",
+ scanext.UNIT_DPI: "UNIT_DPI",
+ scanext.UNIT_PERCENT: "UNIT_PERCENT",
+ scanext.UNIT_MICROSECOND: "UNIT_MICROSECOND" }
+
+
+
+
+class Option:
+ """Class representing a SANE option.
+ Attributes:
+ index -- number from 0 to n, giving the option number
+ name -- a string uniquely identifying the option
+ title -- single-line string containing a title for the option
+ desc -- a long string describing the option; useful as a help message
+ type -- type of this option. Possible values: TYPE_BOOL,
+ TYPE_INT, TYPE_STRING, and so forth.
+ unit -- units of this option. Possible values: UNIT_NONE,
+ UNIT_PIXEL, etc.
+ size -- size of the value in bytes
+ cap -- capabilities available; CAP_EMULATED, CAP_SOFT_SELECT, etc.
+ constraint -- constraint on values. Possible values:
+ None : No constraint
+ (min,max,step) Integer values, from min to max, stepping by
+ list of integers or strings: only the listed values are allowed
+ """
+
+ def __init__(self, args, cur_device):
+ import string
+ self.cur_device = cur_device
+
+ self.index, self.name, self.title, self.desc, self.type, \
+ self.unit, self.size, self.cap, self.constraint = args
+
+ if type(self.name) != type(''):
+ self.name = str(self.name)
+
+ def isActive(self):
+ return scanext.isOptionActive(self.cap)
+
+ def isSettable(self):
+ return scanext.isOptionSettable(self.cap)
+
+ def __repr__(self):
+ if self.isSettable():
+ settable = 'yes'
+ else:
+ settable = 'no'
+
+ if self.isActive():
+ active = 'yes'
+ curValue = self.cur_device.getOption(self.name)
+ else:
+ active = 'no'
+ curValue = '<not available, inactive option>'
+
+
+ return """\nName: %s
+Cur value: %s
+Index: %d
+Title: %s
+Desc: %s
+Type: %s
+Unit: %s
+Constr: %s
+isActive: %s
+isSettable: %s\n""" % (self.name, curValue,
+ self.index, self.title, self.desc,
+ TYPE_STR[self.type], UNIT_STR[self.unit],
+ self.constraint, active, settable)
+ return s
+
+ def limitAndSet(self, value):
+ if value is not None and self.constraint is not None:
+ if type(self.constraint) == type(()):
+ if value < self.constraint[0]:
+ value = self.constraint[0]
+ log.warn("Invalid value for %s (%s < min value of %d). Using %d." %
+ (self.name, self.name, value, value))
+
+ elif value > self.constraint[1]:
+ value = self.constraint[1]
+ log.warn("Invalid value for %s (%s > max value of %d). Using %d." %
+ (self.name, self.name, value, value))
+
+ self.cur_device.setOption(self.name, value)
+
+ elif type(self.constraint) == type([]):
+ if value not in self.constraint:
+ v = self.constraint[0]
+ min_dist = sys.maxint
+ for x in self.constraint:
+ if abs(value-x) < min_dist:
+ min_dist = abs(value-x)
+ v = x
+
+ log.warn("Invalid value for %s (%s not in constraint list: %s). Using %d." %
+ (self.name, self.name, value, ', '.join(self.constraint), v))
+
+ self.cur_device.setOption(self.name, v)
+
+ else:
+ value = self.cur_device.getOption(self.name)
+
+ return value
+
+
+##class _SaneIterator:
+## """ intended for ADF scans.
+## """
+##
+## def __init__(self, cur_device):
+## self.cur_device = cur_device
+##
+## def __iter__(self):
+## return self
+##
+## def __del__(self):
+## self.cur_device.cancelScan()
+##
+## def next(self):
+## try:
+## self.cur_device.startScan()
+## except error, v:
+## if v == 'Document feeder out of documents':
+## raise StopIteration
+## else:
+## raise
+## return self.cur_device.performScan(1)
+
+
+
+
+class ScanDevice:
+ """Class representing a SANE device.
+ Methods:
+ startScan() -- initiate a scan, using the current settings
+ cancelScan() -- cancel an in-progress scanning operation
+
+ Also available, but rather low-level:
+ getParameters() -- get the current parameter settings of the device
+ getOptions() -- return a list of tuples describing all the options.
+
+ Attributes:
+ optlist -- list of option names
+
+ You can also access an option name to retrieve its value, and to
+ set it. For example, if one option has a .name attribute of
+ imagemode, and scanner is a ScanDevice object, you can do:
+ print scanner.imagemode
+ scanner.imagemode = 'Full frame'
+ scanner.['imagemode'] returns the corresponding Option object.
+ """
+
+ def __init__(self, dev):
+ self.scan_thread = None
+ self.dev = scanext.openDevice(dev)
+ self.options = {}
+ self.__load_options_dict()
+
+
+ def __load_options_dict(self):
+ opts = self.options
+ opt_list = self.dev.getOptions()
+
+ for t in opt_list:
+ o = Option(t, self)
+
+ if o.type != scanext.TYPE_GROUP:
+ opts[o.name] = o
+
+
+ def setOption(self, key, value):
+ opts = self.options
+
+ if key not in opts:
+ opts[key] = value
+ return
+
+ opt = opts[key]
+
+ if opt.type == scanext.TYPE_GROUP:
+ log.error("Groups can't be set: %s" % key)
+
+ if not scanext.isOptionActive(opt.cap):
+ log.error("Inactive option: %s" % key)
+
+ if not scanext.isOptionSettable(opt.cap):
+ log.error("Option can't be set by software: %s" % key)
+
+ if type(value) == int and opt.type == scanext.TYPE_FIXED:
+ # avoid annoying errors of backend if int is given instead float:
+ value = float(value)
+
+ try:
+ self.last_opt = self.dev.setOption(opt.index, value)
+ except scanext.error:
+ log.error("Unable to set option %s to value %s" % (key, value))
+ return
+
+ # do binary AND to find if we have to reload options:
+ if self.last_opt & scanext.INFO_RELOAD_OPTIONS:
+ self.__load_options_dict()
+
+
+ def getOption(self, key):
+ opts = self.options
+
+ if key == 'optlist':
+ return opts.keys()
+
+ if key == 'area':
+ return (opts["tl-x"], opts["tl-y"]), (opts["br-x"], opts["br-y"])
+
+ if key not in opts:
+ raise AttributeError, 'No such attribute: %s' % key
+
+ opt = opts[key]
+
+ if opt.type == scanext.TYPE_BUTTON:
+ raise AttributeError, "Buttons don't have values: %s" % key
+
+ if opt.type == scanext.TYPE_GROUP:
+ raise AttributeError, "Groups don't have values: %s " % key
+
+ if not scanext.isOptionActive(opt.cap):
+ raise AttributeError, 'Inactive option: %s' % key
+
+ return self.dev.getOption(opt.index)
+
+
+ def getOptionObj(self, key):
+ opts = self.options
+ if key in opts:
+ return opts[key]
+
+
+ def getParameters(self):
+ """Return a 6-tuple holding all the current device settings:
+ (format, format_name, last_frame, (pixels_per_line, lines), depth, bytes_per_line)
+
+ - format is the SANE frame type
+ - format is one of 'grey', 'color' (RGB), 'red', 'green', 'blue'.
+ - last_frame [bool] indicates if this is the last frame of a multi frame image
+ - (pixels_per_line, lines) specifies the size of the scanned image (x,y)
+ - lines denotes the number of scanlines per frame
+ - depth gives number of pixels per sample
+ """
+ return self.dev.getParameters()
+
+
+ def getOptions(self):
+ "Return a list of tuples describing all the available options"
+ return self.dev.getOptions()
+
+
+ def startScan(self, byte_format='BGRA', update_queue=None, event_queue=None):
+ """
+ Perform a scan with the current device.
+ Calls sane_start().
+ """
+ if not self.isScanActive():
+ status = self.dev.startScan()
+ self.format, self.format_name, self.last_frame, self.pixels_per_line, \
+ self.lines, self.depth, self.bytes_per_line = self.dev.getParameters()
+
+ self.scan_thread = ScanThread(self.dev, byte_format, update_queue, event_queue)
+ self.scan_thread.scan_active = True
+ self.scan_thread.start()
+ return True, self.lines * self.bytes_per_line, status
+ else:
+ # Already active
+ return False, 0, scanext.SANE_STATUS_DEVICE_BUSY
+
+
+ def cancelScan(self):
+ "Cancel an in-progress scanning operation."
+ return self.dev.cancelScan()
+
+
+ def getScan(self):
+ "Get the output buffer and info about a completed scan."
+ if not self.isScanActive():
+ s = self.scan_thread
+
+ return s.buffer, s.format, s.format_name, s.pixels_per_line, \
+ s.lines, s.depth, s.bytes_per_line, s.pad_bytes, s.total_read
+
+
+ def freeScan(self):
+ "Cleanup the scan file after a completed scan."
+ if not self.isScanActive():
+ s = self.scan_thread
+
+ try:
+ s.buffer.close()
+ os.remove(s.buffer_path)
+ except (IOError, AttributeError):
+ pass
+
+
+ def isScanActive(self):
+ if self.scan_thread is not None:
+ return self.scan_thread.isAlive() and self.scan_thread.scan_active
+ else:
+ return False
+
+
+ def waitForScanDone(self):
+ if self.scan_thread is not None and \
+ self.scan_thread.isAlive() and \
+ self.scan_thread.scan_active:
+
+ try:
+ self.scan_thread.join()
+ except KeyboardInterrupt:
+ pass
+
+
+ def waitForScanActive(self):
+ time.sleep(0.5)
+ if self.scan_thread is not None:
+ while True:
+ #print self.scan_thread.isAlive()
+ #print self.scan_thread.scan_active
+ if self.scan_thread.isAlive() and \
+ self.scan_thread.scan_active:
+ return
+
+ time.sleep(0.5)
+ #print "Waiting..."
+
+
+## def scanMulti(self):
+## return _SaneIterator(self)
+
+
+ def closeScan(self):
+ "Close the SANE device after a scan."
+ self.dev.closeScan()
+
+
+
+class ScanThread(threading.Thread):
+ def __init__(self, device, byte_format='BGRA', update_queue=None, event_queue=None):
+ threading.Thread.__init__(self)
+ self.scan_active = True
+ self.dev = device
+ self.update_queue = update_queue
+ self.event_queue = event_queue
+ self.buffer_fd, self.buffer_path = utils.make_temp_file(prefix='hpscan')
+ self.buffer = os.fdopen(self.buffer_fd, "w+b")
+ self.format = -1
+ self.format_name = ''
+ self.last_frame = -1
+ self.pixels_per_line = -1
+ self.lines = -1
+ self.depth = -1
+ self.bytes_per_line = -1
+ self.pad_bytes = -1
+ self.total_read = 0
+ self.byte_format = byte_format
+
+
+ def updateQueue(self, status, bytes_read):
+ if self.update_queue is not None:
+ try:
+ status = int(status)
+ except (ValueError, TypeError):
+ status = -1 #scanext.SANE_STATUS_GOOD
+
+ self.update_queue.put((status, bytes_read))
+ time.sleep(0)
+
+
+ def run(self):
+ #self.scan_active = True
+ self.format, self.format_name, self.last_frame, self.pixels_per_line, \
+ self.lines, self.depth, self.bytes_per_line = self.dev.getParameters()
+
+ log.debug("format=%d" % self.format)
+ log.debug("format_name=%s" % self.format_name)
+ log.debug("last_frame=%d" % self.last_frame)
+ log.debug("ppl=%d" % self.pixels_per_line)
+ log.debug("lines=%d" % self.lines)
+ log.debug("depth=%d" % self.depth)
+ log.debug("bpl=%d" % self.bytes_per_line)
+ log.debug("byte_format=%s" % self.byte_format)
+
+ w = self.buffer.write
+
+ if self.format == scanext.FRAME_RGB: # "Color"
+ if self.depth == 8: # 8 bpp (32bit)
+ self.pad_bytes = self.bytes_per_line - 3 * self.pixels_per_line
+
+ log.debug("pad_bytes=%d" % self.pad_bytes)
+
+ dir = -1
+ if self.byte_format == 'RGBA':
+ dir = 1
+
+ try:
+ st, t = self.dev.readScan(self.bytes_per_line)
+ except scanext.error, st:
+ self.updateQueue(st, 0)
+
+ #print st
+ while st == scanext.SANE_STATUS_GOOD:
+
+ if t:
+ index = 0
+ while index < len(t) - self.pad_bytes:
+ w(t[index:index+3:dir])
+ w('\xff')
+ index += 3
+
+ self.total_read += len(t)
+ self.updateQueue(st, self.total_read)
+ log.debug("Read %d bytes" % self.total_read)
+
+ else:
+ time.sleep(0.1)
+
+ try:
+ st, t = self.dev.readScan(self.bytes_per_line)
+ except scanext.error, st:
+ self.updateQueue(st, self.total_read)
+ break
+
+ if self.checkCancel():
+ break
+
+ elif self.format == scanext.FRAME_GRAY:
+
+ if self.depth == 1: # 1 bpp lineart
+ self.pad_bytes = self.bytes_per_line - (self.pixels_per_line + 7) // 8;
+
+ log.debug("pad_bytes=%d" % self.pad_bytes)
+
+ try:
+ st, t = self.dev.readScan(self.bytes_per_line)
+ except scanext.error, st:
+ self.updateQueue(st, 0)
+
+ while st == scanext.SANE_STATUS_GOOD:
+
+ if t:
+ index = 0
+ while index < len(t) - self.pad_bytes:
+ k = 0x80
+ j = ord(t[index])
+
+ for b in range(8):
+ if k & j:
+ w("\x00\x00\x00\xff")
+ else:
+ w("\xff\xff\xff\xff")
+
+ k = k >> 1
+
+ index += 1
+
+ self.total_read += len(t)
+ self.updateQueue(st, self.total_read)
+ log.debug("Read %d bytes" % self.total_read)
+ else:
+ time.sleep(0.1)
+
+ try:
+ st, t = self.dev.readScan(self.bytes_per_line)
+ except scanext.error, st:
+ self.updateQueue(st, self.total_read)
+ break
+
+ if self.checkCancel():
+ break
+
+ elif self.depth == 8: # 8 bpp grayscale
+ self.pad_bytes = self.bytes_per_line - self.pixels_per_line
+
+ log.debug("pad_bytes=%d" % self.pad_bytes)
+
+ try:
+ st, t = self.dev.readScan(self.bytes_per_line)
+ except scanext.error, st:
+ self.updateQueue(st, 0)
+
+ while st == scanext.SANE_STATUS_GOOD:
+
+ if t:
+ index = 0
+ while index < len(t) - self.pad_bytes:
+ j = t[index]
+ w(j)
+ w(j)
+ w(j)
+ w("\xff")
+
+ index += 1
+
+ self.total_read += len(t)
+ self.updateQueue(st, self.total_read)
+ log.debug("Read %d bytes" % self.total_read)
+ else:
+ time.sleep(0.1)
+
+ try:
+ st, t = self.dev.readScan(self.bytes_per_line)
+ except scanext.error, st:
+ self.updateQueue(st, self.total_read)
+ break
+
+ if self.checkCancel():
+ break
+
+ #self.dev.cancelScan()
+ self.buffer.seek(0)
+ self.scan_active = False
+ log.debug("Scan thread exiting...")
+
+
+ def checkCancel(self):
+ canceled = False
+ while self.event_queue.qsize():
+ try:
+ event = self.event_queue.get(0)
+ if event == EVENT_SCAN_CANCELED:
+ canceled = True
+ log.debug("Cancel pressed!")
+ self.dev.cancelScan()
+
+ except Queue.Empty:
+ break
+
+ return canceled
+
+
+
+def init():
+ return scanext.init()
+
+
+def deInit():
+ return scanext.deInit()
+
+
+def openDevice(dev):
+ "Open a device for scanning"
+ return ScanDevice(dev)
+
+
+def getDevices(local_only=0):
+ return scanext.getDevices(local_only)
+
+
+def reportError(code):
+ log.error("SANE: %s (code=%d)" % (scanext.getErrorMessage(code), code))
+
+
diff --git a/scan/sane/bb_ledm.c b/scan/sane/bb_ledm.c
new file mode 100644
index 0000000..d94d5b7
--- /dev/null
+++ b/scan/sane/bb_ledm.c
@@ -0,0 +1,1075 @@
+/************************************************************************************\
+ bb_ledm.c - HP SANE backend support for ledm based multi-function peripherals
+ (c) 2010 Copyright Hewlett-Packard Development Company, LP
+
+ Primary Author: Naga Samrat Chowdary, Narla
+ Contributing Authors: Yashwant Kumar Sahu, Sarbeswar Meher
+\************************************************************************************/
+
+# ifndef _GNU_SOURCE
+# define _GNU_SOURCE
+# endif
+
+# include <stdarg.h>
+# include <syslog.h>
+# include <stdio.h>
+# include <string.h>
+# include <fcntl.h>
+# include <math.h>
+# include "sane.h"
+# include "saneopts.h"
+# include "hpmud.h"
+# include "hpip.h"
+# include "common.h"
+# include "ledm.h"
+# include "ledmi.h"
+# include "http.h"
+# include "xml.h"
+# include <stdlib.h>
+
+# include <stdint.h>
+
+# define _STRINGIZE(x) #x
+# define STRINGIZE(x) _STRINGIZE(x)
+
+# define _BUG(args...) syslog(LOG_ERR, __FILE__ " " STRINGIZE(__LINE__) ": " args)
+
+# ifdef BB_LEDM_DEBUG
+ # define _DBG(args...) syslog(LOG_INFO, __FILE__ " " STRINGIZE(__LINE__) ": " args)
+# else
+ # define _DBG(args...)
+# endif
+
+enum DOCUMENT_TYPE
+{
+ DT_AUTO = 1,
+ DT_MAX,
+};
+
+enum SCANNER_STATE
+{
+ SS_IDLE = 1,
+ SS_PROCESSING,
+ SS_STOPPED,
+};
+
+enum SCANNER_STATE_REASON
+{
+ SSR_ATTENTION_REQUIRED = 1,
+ SSR_CALIBRATING,
+ SSR_COVER_OPEN,
+ SSR_INPUT_TRAY_EMPTY,
+ SSR_INTERNAL_STORAGE_FULL,
+ SSR_LAMP_ERROR,
+ SSR_LAMP_WARMING,
+ SSR_MEDIA_JAM,
+ SSR_BUSY,
+ SSR_NONE,
+};
+
+struct media_size
+{
+ int width; /* in 1/1000 of an inch */
+ int height; /* in 1/1000 of an inch */
+};
+
+struct device_settings
+{
+ enum COLOR_ENTRY color[CE_MAX];
+ enum SCAN_FORMAT formats[SF_MAX];
+ int jpeg_quality_factor_supported; /* 0=false, 1=true */
+ enum DOCUMENT_TYPE docs[DT_MAX];
+ int document_size_auto_detect_supported; /* 0=false, 1=true */
+ int feeder_capacity;
+};
+
+struct device_platen
+{
+ int flatbed_supported; /* 0=false, 1=true */
+ struct media_size minimum_size;
+ struct media_size maximum_size;
+ struct media_size optical_resolution;
+ int platen_resolution_list[MAX_LIST_SIZE];
+};
+
+struct device_adf
+{
+ int supported; /* 0=false, 1=true */
+ int duplex_supported; /* 0=false, 1=true */
+ struct media_size minimum_size;
+ struct media_size maximum_size;
+ struct media_size optical_resolution;
+ int adf_resolution_list[MAX_LIST_SIZE];
+};
+
+struct scanner_configuration
+{
+ struct device_settings settings;
+ struct device_platen platen;
+ struct device_adf adf;
+};
+
+struct scanner_status
+{
+ char *current_time;
+ enum SCANNER_STATE state;
+ enum SCANNER_STATE_REASON reason;
+ int paper_in_adf; /* 0=false, 1=true */
+ int scan_to_available; /* 0=false, 1=true */
+};
+
+struct wscn_scan_elements
+{
+ struct scanner_configuration config;
+ struct scanner_status status;
+ char model_number[32];
+};
+
+struct wscn_create_scan_job_response
+{
+ int jobid;
+ int pixels_per_line;
+ int lines; /* number of lines */
+ int bytes_per_line; /* zero if jpeg */
+ enum SCAN_FORMAT format;
+ int jpeg_quality_factor;
+ int images_to_transfer; /* number of images to scan */
+ enum INPUT_SOURCE source;
+ enum DOCUMENT_TYPE doc;
+ struct media_size input_size;
+ int scan_region_xoffset;
+ int scan_region_yoffset;
+ int scan_region_width;
+ int scan_region_height;
+ enum COLOR_ENTRY color;
+ struct media_size resolution;
+};
+
+struct bb_ledm_session
+{
+ struct wscn_create_scan_job_response job; /* actual scan job attributes (valid after sane_start) */
+ struct wscn_scan_elements elements; /* scanner elements (valid after sane_open and sane_start) */
+ HTTP_HANDLE http_handle;
+};
+
+/* Following elements must match their associated enum table. */
+static const char *sf_element[SF_MAX] = { "", "raw", "jpeg" }; /* SCAN_FORMAT (compression) */
+static const char *ce_element[CE_MAX] = { "", "K1", "Gray8", "Color8" }; /* COLOR_ENTRY */
+static const char *is_element[IS_MAX] = { "", "Platen", "Adf", "ADFDuplex" }; /* INPUT_SOURCE */
+
+# define POST_HEADER "POST /Scan/Jobs HTTP/1.1\r\nHost: localhost\r\nUser-Agent: \
+hplip\r\nAccept: text/plain, */*\r\nAccept-Language: en-us,en\r\n\
+Accept-Charset: ISO-8859-1,utf-8\r\nKeep-Alive: 1000\r\nProxy-Connection: keep-alive\r\n\
+Content-Type: */*; charset=UTF-8\r\nX-Requested-With: XMLHttpRequest\r\n\
+Content-Length: %d\r\nCookie: AccessCounter=new\r\n\
+Pragma: no-cache\r\nCache-Control: no-cache\r\n\r\n"
+
+# define GET_SCANNER_ELEMENTS "GET /Scan/ScanCaps HTTP/1.1\r\n\
+Host: localhost\r\nUser-Agent: hplip\r\n\
+Accept: text/xml\r\n\
+Accept-Language: en-us,en\r\n\
+Accept-Charset:utf-8\r\n\
+Keep-Alive: 20\r\nProxy-Connection: keep-alive\r\nCookie: AccessCounter=new\r\n0\r\n\r\n"
+
+# define GET_SCANNER_STATUS "GET /Scan/Status HTTP/1.1\r\n\
+Host: localhost\r\nUser-Agent: hplip\r\n\
+Accept: text/xml\r\n\
+Accept-Language: en-us,en\r\n\
+Accept-Charset:utf-8\r\n\
+Keep-Alive: 20\r\nProxy-Connection: keep-alive\r\nCookie: AccessCounter=new\r\n0\r\n\r\n"
+
+# define CREATE_SCAN_JOB_REQUEST "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\
+<ScanSettings xmlns=\"http://www.hp.com/schemas/imaging/con/cnx/scan/2008/08/19\">\
+<XResolution>%d</XResolution>\
+<YResolution>%d</YResolution>\
+<XStart>%d</XStart>\
+<Width>%d</Width>\
+<YStart>%d</YStart>\
+<Height>%d</Height>\
+<Format>%s</Format>\
+<CompressionQFactor>15</CompressionQFactor>\
+<ColorSpace>%s</ColorSpace>\
+<BitDepth>%d</BitDepth>\
+<InputSource>%s</InputSource>\
+<InputSourceType>%s</InputSourceType>%s\
+<GrayRendering>NTSC</GrayRendering>\
+<ToneMap>\
+<Gamma>0</Gamma>\
+<Brightness>1000</Brightness>\
+<Contrast>1000</Contrast>\
+<Highlite>0</Highlite>\
+<Shadow>0</Shadow></ToneMap>\
+<ContentType>Photo</ContentType></ScanSettings>"
+
+# define CANCEL_JOB_REQUEST "PUT %s HTTP/1.1\r\nHost: localhost\r\nUser-Agent: hplip\r\n\
+Accept: text/plain\r\nAccept-Language: en-us,en\r\nAccept-Charset:utf-8\r\nKeep-Alive: 10\r\n\
+Content-Type: text/xml\r\nProxy-Connection: Keep-alive\r\nX-Requested-With: XMLHttpRequest\r\nReferer: localhost\r\n\
+Content-Length: %d\r\nCookie: AccessCounter=new\r\n\r\n"
+
+#define CANCEL_JOB_DATA "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\
+<j:Job xmlns:j=\"http://www.hp.com/schemas/imaging/con/ledm/jobs/2009/04/30\" \
+xmlns:dd=\"http://www.hp.com/schemas/imaging/con/dictionaries/1.0/\" \
+xmlns:fax=\"http://www.hp.com/schemas/imaging/con/fax/2008/06/13\" \
+xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" \
+xsi:schemaLocation=\"http://www.hp.com/schemas/imaging/con/ledm/jobs/2009/04/30 ../schemas/Jobs.xsd\">\
+<j:JobState>Canceled</j:JobState></j:Job>"
+
+# define GET_SCAN_JOB_URL "GET %s HTTP/1.1\r\nHost: localhost\r\nUser-Agent: hplip\r\n\
+Accept: text/plain\r\nAccept-Language: en-us,en\r\nAccept-Charset:utf-8\r\nX-Requested-With: XMLHttpRequest\r\n\
+Keep-Alive: 300\r\nProxy-Connection: keep-alive\r\nCookie: AccessCounter=new\r\n0\r\n\r\n"
+
+# define ZERO_FOOTER "\r\n0\r\n\r\n"
+
+# define READY_TO_UPLOAD "<PageState>ReadyToUpload</PageState>"
+# define CANCELED_BY_DEVICE "<PageState>CanceledByDevice</PageState>"
+# define CANCELED_BY_CLIENT "<PageState>CanceledByClient</PageState>"
+# define ADF_LOADED "<AdfState>Loaded</AdfState>"
+# define ADF_EMPTY "<AdfState>Empty</AdfState>"
+# define SCANNER_IDLE "<ScannerState>Idle</ScannerState>"
+# define SCANNER_BUSY_WITH_SCAN_JOB "<ScannerState>BusyWithScanJob</ScannerState>"
+# define JOBSTATE_PROCESSING "<j:JobState>Processing</j:JobState>"
+# define JOBSTATE_CANCELED "<j:JobState>Canceled</j:JobState>"
+# define JOBSTATE_COMPLETED "<j:JobState>Completed</j:JobState>"
+
+static int parse_scan_elements(const char *payload, int size, struct wscn_scan_elements *elements)
+{
+ char tag[512];
+ char value[128];
+ int i;
+ char *tail=(char *)payload;
+
+ memset(elements, 0, sizeof(struct wscn_scan_elements));
+
+ while (1)
+ {
+ get_tag(tail, size-(tail-payload), tag, sizeof(tag), &tail);
+
+ if (!tag[0])
+ break; /* done */
+
+ if(strncmp(tag, "ColorEntries", 12) == 0)
+ {
+ int h=1;
+ while(h)
+ {
+ get_tag(tail, size-(tail-payload), tag, sizeof(tag), &tail);
+ if(strncmp(tag, "Platen", 6) ==0) break;
+ if(strncmp(tag, "/ColorEntries", 13) ==0) break;
+ if(strncmp(tag, "ColorType", 9)==0)
+ {
+ get_element(tail, size-(tail-payload), value, sizeof(value), &tail);
+ if (strcmp(value, ce_element[CE_K1]) == 0)
+ elements->config.settings.color[CE_K1] = CE_K1;
+ else if (strcmp(value, ce_element[CE_GRAY8]) == 0)
+ elements->config.settings.color[CE_GRAY8] = CE_GRAY8;
+ else if (strcmp(value, ce_element[CE_COLOR8]) == 0)
+ elements->config.settings.color[CE_COLOR8] = CE_COLOR8;
+// else
+// _BUG("unknowned element=%s, sf_element[SF_JPEG]=%s, sf_element[SF_RAW]=%s\n", value, sf_element[SF_JPEG], sf_element[SF_RAW] );
+ _DBG("FormatSupported:%s\n", value);
+ get_tag(tail, size-(tail-payload), tag, sizeof(tag), &tail);
+ if(strncmp(tag, "/ColorEntries", 13) == 0) h=0;
+ }
+ if(strncmp(tag, "/ColorEntries", 13) == 0) h=0;
+ }
+ }
+
+ if(strncmp(tag, "Platen", 6) == 0)
+ {
+ elements->config.platen.flatbed_supported = 1;
+ get_tag(tail, size-(tail-payload), tag, sizeof(tag), &tail);
+ get_tag(tail, size-(tail-payload), tag, sizeof(tag), &tail);
+ get_element(tail, size-(tail-payload), value, sizeof(value), &tail);
+ elements->config.platen.minimum_size.width=strtol(value, NULL, 10);
+ get_tag(tail, size-(tail-payload), tag, sizeof(tag), &tail);
+ get_tag(tail, size-(tail-payload), tag, sizeof(tag), &tail);
+ get_element(tail, size-(tail-payload), value, sizeof(value), &tail);
+ elements->config.platen.minimum_size.height=strtol(value, NULL, 10);
+ get_tag(tail, size-(tail-payload), tag, sizeof(tag), &tail);
+ get_tag(tail, size-(tail-payload), tag, sizeof(tag), &tail);
+ get_element(tail, size-(tail-payload), value, sizeof(value), &tail);
+ elements->config.platen.maximum_size.width=strtol(value, NULL, 10);
+ get_tag(tail, size-(tail-payload), tag, sizeof(tag), &tail);
+ get_tag(tail, size-(tail-payload), tag, sizeof(tag), &tail);
+ get_element(tail, size-(tail-payload), value, sizeof(value), &tail);
+ elements->config.platen.maximum_size.height=strtol(value, NULL, 10);
+ get_tag(tail, size-(tail-payload), tag, sizeof(tag), &tail);
+ get_tag(tail, size-(tail-payload), tag, sizeof(tag), &tail);
+ get_element(tail, size-(tail-payload), value, sizeof(value), &tail);
+ get_tag(tail, size-(tail-payload), tag, sizeof(tag), &tail);
+ get_tag(tail, size-(tail-payload), tag, sizeof(tag), &tail);
+ get_element(tail, size-(tail-payload), value, sizeof(value), &tail);
+ get_tag(tail, size-(tail-payload), tag, sizeof(tag), &tail);
+ get_tag(tail, size-(tail-payload), tag, sizeof(tag), &tail);
+ get_element(tail, size-(tail-payload), value, sizeof(value), &tail);
+ get_tag(tail, size-(tail-payload), tag, sizeof(tag), &tail);
+ get_tag(tail, size-(tail-payload), tag, sizeof(tag), &tail);
+ get_element(tail, size-(tail-payload), value, sizeof(value), &tail);
+ get_tag(tail, size-(tail-payload), tag, sizeof(tag), &tail);
+ get_tag(tail, size-(tail-payload), tag, sizeof(tag), &tail);
+ get_element(tail, size-(tail-payload), value, sizeof(value), &tail);
+ elements->config.platen.optical_resolution.width=strtol(value, NULL, 10);
+ get_tag(tail, size-(tail-payload), tag, sizeof(tag), &tail);
+ get_tag(tail, size-(tail-payload), tag, sizeof(tag), &tail);
+ get_element(tail, size-(tail-payload), value, sizeof(value), &tail);
+ elements->config.platen.optical_resolution.height=strtol(value, NULL, 10);
+ get_tag(tail, size-(tail-payload), tag, sizeof(tag), &tail);
+ get_tag(tail, size-(tail-payload), tag, sizeof(tag), &tail);
+ get_element(tail, size-(tail-payload), value, sizeof(value), &tail);
+
+ get_tag(tail, size-(tail-payload), tag, sizeof(tag), &tail);
+ get_tag(tail, size-(tail-payload), tag, sizeof(tag), &tail);
+ i=1;
+ elements->config.platen.platen_resolution_list[0]=0;
+ while(strcmp(tag, "/SupportedResolutions"))
+ {
+ get_tag(tail, size-(tail-payload), tag, sizeof(tag), &tail);
+ if(!strcmp(tag, "Resolution"))
+ {
+ get_tag(tail, size-(tail-payload), tag, sizeof(tag), &tail);
+ get_element(tail, size-(tail-payload), value, sizeof(value), &tail);
+ _DBG ("parse_scan_elements platen_resolution_list value=%s\n", value);
+ if(strtol(value, NULL, 10) && elements->config.platen.platen_resolution_list[i-1] != strtol(value, NULL, 10))
+
+ elements->config.platen.platen_resolution_list[i++]=strtol(value, NULL, 10);
+ }
+ }
+ elements->config.platen.platen_resolution_list[0]=i-1;
+ }
+
+ if(strncmp(tag, "Adf", 3) == 0 && strlen(tag) == 3)
+ {
+ elements->config.adf.supported = 1;
+ get_tag(tail, size-(tail-payload), tag, sizeof(tag), &tail);
+ get_tag(tail, size-(tail-payload), tag, sizeof(tag), &tail);
+ get_element(tail, size-(tail-payload), value, sizeof(value), &tail);
+ elements->config.adf.minimum_size.width=strtol(value, NULL, 10);
+ get_tag(tail, size-(tail-payload), tag, sizeof(tag), &tail);
+ get_tag(tail, size-(tail-payload), tag, sizeof(tag), &tail);
+ get_element(tail, size-(tail-payload), value, sizeof(value), &tail);
+ elements->config.adf.minimum_size.height=strtol(value, NULL, 10);
+ get_tag(tail, size-(tail-payload), tag, sizeof(tag), &tail);
+ get_tag(tail, size-(tail-payload), tag, sizeof(tag), &tail);
+ get_element(tail, size-(tail-payload), value, sizeof(value), &tail);
+ elements->config.adf.maximum_size.width=strtol(value, NULL, 10);
+ get_tag(tail, size-(tail-payload), tag, sizeof(tag), &tail);
+ get_tag(tail, size-(tail-payload), tag, sizeof(tag), &tail);
+ get_element(tail, size-(tail-payload), value, sizeof(value), &tail);
+ elements->config.adf.maximum_size.height=strtol(value, NULL, 10);
+ get_tag(tail, size-(tail-payload), tag, sizeof(tag), &tail);
+ get_tag(tail, size-(tail-payload), tag, sizeof(tag), &tail);
+ get_element(tail, size-(tail-payload), value, sizeof(value), &tail);
+ get_tag(tail, size-(tail-payload), tag, sizeof(tag), &tail);
+ get_tag(tail, size-(tail-payload), tag, sizeof(tag), &tail);
+ get_element(tail, size-(tail-payload), value, sizeof(value), &tail);
+ get_tag(tail, size-(tail-payload), tag, sizeof(tag), &tail);
+ get_tag(tail, size-(tail-payload), tag, sizeof(tag), &tail);
+ get_element(tail, size-(tail-payload), value, sizeof(value), &tail);
+ get_tag(tail, size-(tail-payload), tag, sizeof(tag), &tail);
+ get_tag(tail, size-(tail-payload), tag, sizeof(tag), &tail);
+ get_element(tail, size-(tail-payload), value, sizeof(value), &tail);
+ get_tag(tail, size-(tail-payload), tag, sizeof(tag), &tail);
+ get_tag(tail, size-(tail-payload), tag, sizeof(tag), &tail);
+ get_element(tail, size-(tail-payload), value, sizeof(value), &tail);
+ elements->config.adf.optical_resolution.width=strtol(value, NULL, 10);
+ get_tag(tail, size-(tail-payload), tag, sizeof(tag), &tail);
+ get_tag(tail, size-(tail-payload), tag, sizeof(tag), &tail);
+ get_element(tail, size-(tail-payload), value, sizeof(value), &tail);
+ elements->config.adf.optical_resolution.height=strtol(value, NULL, 10);
+ get_tag(tail, size-(tail-payload), tag, sizeof(tag), &tail);
+ get_tag(tail, size-(tail-payload), tag, sizeof(tag), &tail);
+ get_element(tail, size-(tail-payload), value, sizeof(value), &tail);
+
+ get_tag(tail, size-(tail-payload), tag, sizeof(tag), &tail);
+ get_tag(tail, size-(tail-payload), tag, sizeof(tag), &tail);
+ i=1;
+ elements->config.adf.adf_resolution_list[0]=0;
+ while(strcmp(tag, "/SupportedResolutions"))
+ {
+ get_tag(tail, size-(tail-payload), tag, sizeof(tag), &tail);
+ if(!strcmp(tag, "Resolution"))
+ {
+ get_tag(tail, size-(tail-payload), tag, sizeof(tag), &tail);
+ get_element(tail, size-(tail-payload), value, sizeof(value), &tail);
+ _DBG ("parse_scan_elements adf_resolution_list value=%s", value);
+ if(strtol(value, NULL, 10) && elements->config.adf.adf_resolution_list[i-1] != strtol(value, NULL, 10))
+ elements->config.adf.adf_resolution_list[i++]=strtol(value, NULL, 10);
+ }
+ }
+ elements->config.adf.adf_resolution_list[0]=i-1;
+ get_tag(tail, size-(tail-payload), tag, sizeof(tag), &tail);
+ get_tag(tail, size-(tail-payload), tag, sizeof(tag), &tail);//FeederCapacity
+ get_element(tail, size-(tail-payload), value, sizeof(value), &tail);
+ _DBG ("parse_scan_elements FeederCapacity=%s", value);
+ elements->config.settings.feeder_capacity = strtol(value, NULL, 10);
+ get_tag(tail, size-(tail-payload), tag, sizeof(tag), &tail);
+ get_tag(tail, size-(tail-payload), tag, sizeof(tag), &tail);
+ if(!strcmp(tag, "AdfDuplexer"))
+ {
+ elements->config.adf.duplex_supported = 1;
+ _DBG ("parse_scan_elements duplex_supported");
+ }
+ }
+ } /* end while (1) */
+ return 0;
+} /* parse_scan_elements */
+
+static struct bb_ledm_session* create_session()
+{
+ struct bb_ledm_session* pbb;
+
+ if ((pbb = malloc(sizeof(struct bb_ledm_session))) == NULL)
+ {
+ return NULL;
+ }
+
+ memset(pbb, 0, sizeof(struct bb_ledm_session));
+ return pbb;
+} /* create_session */
+
+static int read_http_payload(struct ledm_session *ps, char *payload, int max_size, int sec_timeout, int *bytes_read)
+{
+ struct bb_ledm_session *pbb = ps->bb_session;
+ int stat=1, total=0, len;
+ int tmo=sec_timeout;
+ enum HTTP_RESULT ret;
+ int payload_length=-1;
+ char *temp=NULL;
+
+ *bytes_read = 0;
+
+ if(http_read_header(pbb->http_handle, payload, max_size, tmo, &len) != HTTP_R_OK)
+ goto bugout;
+
+ _DBG("read_http_payload len=%d %s\n",len,payload);
+ temp = strstr(payload, "HTTP/1.1 201 Created");
+ if (temp)
+ {
+ *bytes_read = total = len;
+ stat=0;
+ return stat ;
+ }
+
+ temp=strstr(payload, "Content-Length:");
+ if (temp)
+ {
+ temp=temp+16;
+ temp=strtok(temp, "\r\n");
+ payload_length=strtol(temp, NULL, 10);
+ if (payload_length == 0)
+ {
+ *bytes_read = total = len;
+ stat=0;
+ return stat ;
+ }
+ }
+ memset(payload, ' ', len);
+ if(payload_length==-1)
+ {
+ int i=10;
+ while(i)
+ {
+ len = 0;
+ ret = http_read(pbb->http_handle, payload+total, max_size-total, tmo, &len);
+ total+=len;
+ tmo=1;
+ i--;
+ if (ret == HTTP_R_EOF)
+ {
+ _DBG("read_http_payload1 DONE......\n");
+ break; /* done */
+ }
+
+ if (!(ret == HTTP_R_OK || ret == HTTP_R_EOF))
+ {
+ _DBG("read_http_payload1 ERROR......\n");
+ goto bugout;
+ }
+ }//end while(i)
+ }//end if(payload_length==-1)
+ else
+ {
+ len=payload_length;
+ while (total < payload_length)
+ {
+ ret = http_read(pbb->http_handle, payload+total, max_size-total, tmo, &len);
+ total+=len;
+ tmo=1;
+ if (ret == HTTP_R_EOF)
+ {
+ _DBG("read_http_payload2 DONE......\n");
+ break; /* done */
+ }
+
+ if (!(ret == HTTP_R_OK || ret == HTTP_R_EOF))
+ {
+ _DBG("read_http_payload2 ERROR......\n");
+ goto bugout;
+ }
+ }//end while()
+ }//end else
+
+ *bytes_read = total;
+ stat=0;
+
+bugout:
+ return stat;
+} /* read_http_payload */
+
+static int get_scanner_elements(struct ledm_session *ps, struct wscn_scan_elements *elements)
+{
+ struct bb_ledm_session *pbb = ps->bb_session;
+ int bytes_read = 0;
+ int stat=1, tmo=10;
+ char buf[8192];
+
+ if (http_open(ps->dd, HPMUD_S_LEDM_SCAN, &pbb->http_handle) != HTTP_R_OK)
+ {
+ _BUG("unable to open http connection %s\n", ps->uri);
+ goto bugout;
+ }
+
+ /* Write the xml payload. */
+ if (http_write(pbb->http_handle, GET_SCANNER_ELEMENTS, sizeof(GET_SCANNER_ELEMENTS)-1, tmo) != HTTP_R_OK)
+ {
+ _BUG("unable to get_scanner_elements %s\n", ps->uri);
+ goto bugout;
+ }
+
+ /* Read http response. */
+ if (read_http_payload(ps, buf, sizeof(buf), tmo, &bytes_read))
+ goto bugout;
+
+ _DBG("get_scanner_elements bytes_read=%d len=%d buf=%s\n", bytes_read, strlen(buf), buf);
+
+ http_unchunk_data(buf);
+ bytes_read=strlen(buf);
+
+ _DBG("get_scanner_elements buf=%s\n", buf);
+ parse_scan_elements(buf, bytes_read, elements);
+ stat=0;
+
+bugout:
+ if (pbb->http_handle)
+ {
+ http_close(pbb->http_handle);
+ pbb->http_handle = 0;
+ }
+ return stat;
+} /* get_scanner_elements */
+
+static int cancel_job(struct ledm_session *ps)
+{
+ struct bb_ledm_session *pbb = ps->bb_session;
+ int len, stat=1, tmo=5/*EXCEPTION_TIMEOUT*/;
+ char buf[2048];
+ int bytes_read;
+
+ _DBG("cancel_job user_cancel=%d job_id=%d url=%s \n", ps->user_cancel, ps->job_id, ps->url);
+ if (ps->job_id == 0 || ps->user_cancel == 0)
+ {
+ ps->job_id = 0;
+ ps->page_id = 0;
+ return 0 ;
+ }
+
+ if (http_open(ps->dd, HPMUD_S_LEDM_SCAN, &pbb->http_handle) != HTTP_R_OK)
+ {
+ _BUG("unable to open http connection %s\n", ps->uri);
+ goto bugout;
+ }
+
+ len = snprintf(buf, sizeof(buf), CANCEL_JOB_REQUEST, ps->url, strlen(CANCEL_JOB_DATA));
+ if (http_write(pbb->http_handle, buf, len, 1) != HTTP_R_OK)
+ {
+ _BUG("unable to cancel_job %s\n", ps->url);
+ }
+
+ len = snprintf(buf, sizeof(buf), CANCEL_JOB_DATA);
+ if (http_write(pbb->http_handle, buf, len, 1) != HTTP_R_OK)
+ {
+ _BUG("unable to cancel_job %s\n", ps->url);
+ }
+
+ if (read_http_payload(ps, buf, sizeof(buf), tmo, &bytes_read))
+ goto bugout;
+
+ stat=0;
+
+bugout:
+ if (pbb->http_handle)
+ {
+ http_close(pbb->http_handle);
+ pbb->http_handle = 0;
+ }
+ return stat;
+}; /* cancel_job */
+
+/* --------------------------- LEDM API Calls -----------------------------*/
+
+int bb_open(struct ledm_session *ps)
+{
+ struct bb_ledm_session *pbb;
+ struct device_settings *ds;
+ int stat=1, i, j;
+
+ _DBG("bb_open()\n");
+
+ if ((ps->bb_session = create_session()) == NULL)
+ goto bugout;
+
+ pbb = ps->bb_session;
+
+ /* Get scanner elements from device. */
+ if (get_scanner_elements(ps, &pbb->elements))
+ {
+ goto bugout;
+ }
+
+ /* Determine supported Scan Modes. */
+ ds = &pbb->elements.config.settings;
+ for(i=0, j=0; i<CE_MAX; i++)
+ {
+ if (ds->color[i] == CE_K1)
+ {
+ ps->scanModeList[j] = SANE_VALUE_SCAN_MODE_LINEART;
+ ps->scanModeMap[j++] = CE_K1;
+ }
+ if (ds->color[i] == CE_GRAY8)
+ {
+ ps->scanModeList[j] = SANE_VALUE_SCAN_MODE_GRAY;
+ ps->scanModeMap[j++] = CE_GRAY8;
+ }
+ if (ds->color[i] == CE_COLOR8)
+ {
+ ps->scanModeList[j] = SANE_VALUE_SCAN_MODE_COLOR;
+ ps->scanModeMap[j++] = CE_COLOR8;
+ }
+ }
+
+ /* Determine scan input sources. */
+ i=0;
+ if (pbb->elements.config.platen.flatbed_supported)
+ {
+ ps->inputSourceList[i] = STR_ADF_MODE_FLATBED;
+ ps->inputSourceMap[i++] = IS_PLATEN;
+ }
+ if (pbb->elements.config.adf.supported)
+ {
+ ps->inputSourceList[i] = STR_ADF_MODE_ADF;
+ ps->inputSourceMap[i++] = IS_ADF;
+ }
+ if (pbb->elements.config.adf.duplex_supported)
+ {
+ ps->inputSourceList[i] = STR_TITLE_DUPLEX;
+ ps->inputSourceMap[i++] = IS_ADF_DUPLEX;
+ }
+
+ /* Determine if jpeg quality factor is supported. */
+ if (pbb->elements.config.settings.jpeg_quality_factor_supported)
+ ps->option[LEDM_OPTION_JPEG_QUALITY].cap &= ~SANE_CAP_INACTIVE;
+ else
+ ps->option[LEDM_OPTION_JPEG_QUALITY].cap |= SANE_CAP_INACTIVE;
+
+
+ /* Set flatbed x,y extents. */
+ ps->platen_min_width = SANE_FIX(pbb->elements.config.platen.minimum_size.width/1000.0*MM_PER_INCH);
+ ps->platen_min_height = SANE_FIX(pbb->elements.config.platen.minimum_size.height/1000.0*MM_PER_INCH);
+ ps->platen_tlxRange.max = SANE_FIX(pbb->elements.config.platen.maximum_size.width/11.811023);
+ ps->platen_brxRange.max = ps->platen_tlxRange.max;
+ ps->platen_tlyRange.max = SANE_FIX(pbb->elements.config.platen.maximum_size.height/11.811023);
+ ps->platen_bryRange.max = ps->platen_tlyRange.max;
+
+ /* Set adf/duplex x,y extents. */
+ ps->adf_min_width = SANE_FIX(pbb->elements.config.adf.minimum_size.width/1000.0*MM_PER_INCH);
+ ps->adf_min_height = SANE_FIX(pbb->elements.config.adf.minimum_size.height/1000.0*MM_PER_INCH);
+ ps->adf_tlxRange.max = SANE_FIX(pbb->elements.config.adf.maximum_size.width/11.811023);
+ ps->adf_brxRange.max = ps->adf_tlxRange.max;
+ ps->adf_tlyRange.max = SANE_FIX(pbb->elements.config.adf.maximum_size.height/11.811023);
+ ps->adf_bryRange.max = ps->adf_tlyRange.max;
+
+ i = pbb->elements.config.platen.platen_resolution_list[0] + 1;
+ while(i--)
+ {
+ _DBG("bb_open platen_resolution_list = %d\n", pbb->elements.config.platen.platen_resolution_list[i]);
+ ps->platen_resolutionList[i] = pbb->elements.config.platen.platen_resolution_list[i];
+ ps->resolutionList[i] = pbb->elements.config.platen.platen_resolution_list[i];
+ }
+
+ i = pbb->elements.config.adf.adf_resolution_list[0] + 1;
+ while(i--) ps->adf_resolutionList[i] = pbb->elements.config.adf.adf_resolution_list[i];
+
+ stat = 0;
+
+bugout:
+ return stat;
+} /* bb_open */
+
+int bb_close(struct ledm_session *ps)
+{
+ _DBG("bb_close()\n");
+ free(ps->bb_session);
+ ps->bb_session = NULL;
+ return 0;
+}
+
+/* Set scan parameters. If scan has started, use actual known parameters otherwise estimate. */
+int bb_get_parameters(struct ledm_session *ps, SANE_Parameters *pp, int option)
+{
+ struct bb_ledm_session *pbb = ps->bb_session;
+ pp->last_frame = SANE_TRUE;
+ int factor;
+
+ _DBG("bb_get_parameters(option=%d)\n", option);
+
+ switch(ps->currentScanMode)
+ {
+ case CE_K1:
+ pp->format = SANE_FRAME_GRAY; /* lineart (GRAY8 converted to MONO by IP) */
+ pp->depth = 1;
+ factor = 1;
+ break;
+ case CE_GRAY8:
+ pp->format = SANE_FRAME_GRAY; /* grayscale */
+ pp->depth = 8;
+ factor = 1;
+ break;
+ case CE_COLOR8:
+ default:
+ pp->format = SANE_FRAME_RGB; /* color */
+ pp->depth = 8;
+ factor = 3;
+ break;
+ }
+
+ switch (option)
+ {
+ case SPO_STARTED: /* called by xsane */
+ if (ps->currentCompression == SF_RAW && ps->currentScanMode != CE_GRAY8)
+ {
+ /* Set scan parameters based on scan job response values */
+ //pp->lines = pbb->job.lines;
+ pp->lines = (int)(SANE_UNFIX(ps->effectiveBry - ps->effectiveTly)/MM_PER_INCH*ps->currentResolution);
+ pp->pixels_per_line = pbb->job.pixels_per_line;
+ pp->bytes_per_line = pbb->job.bytes_per_line;
+ }
+ else /* Must be SF_JFIF or ScanMode==CE_BLACK_AND_WHITE1. */
+ {
+ /* Set scan parameters based on IP. Note for Linart, use IP for hpraw and jpeg. */
+ //pp->lines = ps->image_traits.lNumRows;
+ pp->lines = (int)(SANE_UNFIX(ps->effectiveBry - ps->effectiveTly)/MM_PER_INCH*ps->currentResolution);
+ pp->pixels_per_line = ps->image_traits.iPixelsPerRow;
+ pp->bytes_per_line = BYTES_PER_LINE(pp->pixels_per_line, pp->depth * factor);
+ }
+ break;
+ case SPO_STARTED_JR: /* called by sane_start */
+ /* Set scan parameters based on scan job response values */
+ pp->lines = pbb->job.lines;
+ pp->pixels_per_line = pbb->job.pixels_per_line;
+ pp->bytes_per_line = pbb->job.bytes_per_line;
+ break;
+ case SPO_BEST_GUESS: /* called by xsane & sane_start */
+ /* Set scan parameters based on best guess. */
+ pp->lines = (int)round(SANE_UNFIX(ps->effectiveBry - ps->effectiveTly)/MM_PER_INCH*ps->currentResolution);
+ pp->pixels_per_line = (int)round(SANE_UNFIX(ps->effectiveBrx -ps->effectiveTlx)/MM_PER_INCH*ps->currentResolution);
+ pp->bytes_per_line = BYTES_PER_LINE(pp->pixels_per_line, pp->depth * factor);
+ break;
+ default:
+ break;
+ }
+return 0;
+}
+
+int bb_is_paper_in_adf(struct ledm_session *ps) /* 0 = no paper in adf, 1 = paper in adf, -1 = error */
+{
+ char buf[1024];
+ int bytes_read;
+ struct bb_ledm_session *pbb = ps->bb_session;
+
+ if(http_open(ps->dd, HPMUD_S_LEDM_SCAN, &pbb->http_handle) != HTTP_R_OK)
+ {
+ }
+ if (http_write(pbb->http_handle, GET_SCANNER_STATUS, sizeof(GET_SCANNER_STATUS)-1, 10) != HTTP_R_OK)
+ {
+ //goto bugout;
+ }
+ read_http_payload(ps, buf, sizeof(buf), EXCEPTION_TIMEOUT, &bytes_read);
+
+ http_close(pbb->http_handle); /* error, close http connection */
+ pbb->http_handle = 0;
+ _DBG("bb_is_paper_in_adf .job_id=%d buf=%s\n", ps->job_id, buf);
+ if(strstr(buf, ADF_LOADED)) return 1;
+ if(strstr(buf, ADF_EMPTY) && strstr(buf, SCANNER_BUSY_WITH_SCAN_JOB)) return 2;
+ else return 0;
+}
+
+
+SANE_Status bb_start_scan(struct ledm_session *ps)
+{
+ char buf[4096] = {0};
+ char buf1[1024]={0};
+ int len, bytes_read;
+ int i, timeout = 10 ;
+ char szPage_ID[5] = {0};
+ char szJob_ID[5] = {0};
+ SANE_Status stat = SANE_STATUS_IO_ERROR;
+ struct bb_ledm_session *pbb = ps->bb_session;
+
+ ps->user_cancel = 0;
+ _DBG("bb_start_scan() entering...job_id=%d\n", ps->job_id);
+ if (ps->job_id == 0)
+ {
+ if(http_open(ps->dd, HPMUD_S_LEDM_SCAN, &pbb->http_handle) != HTTP_R_OK)
+ {
+ // goto bugout;
+ }
+
+ if (http_write(pbb->http_handle, GET_SCANNER_STATUS, sizeof(GET_SCANNER_STATUS)-1, timeout) != HTTP_R_OK)
+ {
+ //goto bugout;
+ }
+
+ read_http_payload(ps, buf, sizeof(buf), timeout, &bytes_read);
+
+ if(!strstr(buf, SCANNER_IDLE))
+ {
+ stat = SANE_STATUS_DEVICE_BUSY;
+ goto bugout;
+ }
+
+ http_close(pbb->http_handle);
+ pbb->http_handle = 0;
+
+ if(http_open(ps->dd, HPMUD_S_LEDM_SCAN, &pbb->http_handle) != HTTP_R_OK)
+ {
+ }
+
+ len = snprintf(buf, sizeof(buf), CREATE_SCAN_JOB_REQUEST,
+ ps->currentResolution,//<XResolution>
+ ps->currentResolution,//<YResolution>
+ (int) (ps->currentTlx / 5548.7133),//<XStart>
+ (int) ((ps->currentBrx / 5548.7133) - (ps->currentTlx / 5548.7133)),//<Width>
+ (int) (ps->currentTly / 5548.7133),//<YStart>
+ (int) ((ps->currentBry / 5548.7133) - (ps->currentTly / 5548.7133)),//<Height>
+ "Jpeg",//<Format>
+ (! strcmp(ce_element[ps->currentScanMode], "Color8")) ? "Color" : (! strcmp(ce_element[ps->currentScanMode], "Gray8")) ? "Gray" : "Gray",//<ColorSpace>
+ ((! strcmp(ce_element[ps->currentScanMode], "Color8")) || (! strcmp(ce_element[ps->currentScanMode], "Gray8"))) ? 8: 8,//<BitDepth>
+ ps->currentInputSource == IS_PLATEN ? is_element[1] : is_element[2],//<InputSource>
+ ps->currentInputSource == IS_PLATEN ? is_element[1] : is_element[2],//<InputSourceType>
+ ps->currentInputSource != IS_ADF_DUPLEX ? "" : "<AdfOptions><AdfOption>Duplex</AdfOption></AdfOptions>");
+
+ len = len + strlen(ZERO_FOOTER);
+
+ len = snprintf(buf1, sizeof(buf1), POST_HEADER, len);
+ if (http_write(pbb->http_handle, buf1, strlen(buf1), timeout) != HTTP_R_OK)
+ {
+ //goto bugout;
+ }
+
+ if (http_write(pbb->http_handle, buf, strlen(buf), 1) != HTTP_R_OK)
+ {
+ //goto bugout;
+ }
+
+ /* Write zero footer. */
+ if (http_write(pbb->http_handle, ZERO_FOOTER, sizeof(ZERO_FOOTER)-1, 1) != HTTP_R_OK)
+ {
+ //goto bugout;
+ }
+ memset(buf, 0, sizeof(buf));
+ /* Read response. */
+ if (read_http_payload(ps, buf, sizeof(buf), timeout, &bytes_read))
+ goto bugout;
+
+ http_close(pbb->http_handle);
+ pbb->http_handle = 0;
+
+ char joblist[64];
+ char* jl=strstr(buf, "Location:");
+ if (!jl) goto bugout;
+ jl=jl+10;
+
+ int i=0;
+ while(*jl != '\r')
+ {
+ joblist[i]=*jl;
+ jl=jl+1; i++;
+ }
+ joblist[i]='\0';
+
+ strcpy(ps->url, joblist);
+ char *c=ps->url;
+ c=strstr(c, "JobList");
+ if (c)
+ {
+ c=c+8;
+ int job_id=strtol(c, NULL, 10);
+ itoa(job_id, szJob_ID,10);
+ itoa(1, szPage_ID,10);
+ ps->page_id = 1;
+ ps->job_id = job_id;
+ }
+ }
+ else
+ {
+ if (ps->currentInputSource == IS_PLATEN)
+ {
+ stat = SANE_STATUS_INVAL;
+ goto bugout;
+ }
+
+ ps->page_id++;
+ itoa(ps->job_id,szJob_ID,10);
+ itoa(ps->page_id, szPage_ID,10);
+ }
+ _DBG("bb_start_scan() url=%s page_id=%d\n", ps->url, ps->page_id);
+
+ memset(buf, 0, sizeof(buf)-1);
+
+ if(http_open(ps->dd, HPMUD_S_LEDM_SCAN, &pbb->http_handle) != HTTP_R_OK)
+ {
+ }
+ while(strstr(buf, READY_TO_UPLOAD) == NULL)
+ {
+ _DBG("bb_start_scan() ENTERING....buf=%s\n", buf);
+ len = snprintf(buf, sizeof(buf), GET_SCAN_JOB_URL, ps->url);
+
+ if (http_write(pbb->http_handle, buf, strlen(buf), 1) != HTTP_R_OK)
+ {
+ //goto bugout;
+ break ;
+ }
+ if (read_http_payload (ps, buf, sizeof(buf), 5, &len) != HTTP_R_OK)
+ {
+ //goto bugout
+ _DBG("bb_start_scan() read_http_payload FAILED len=%d buf=%s\n", len, buf);
+ break;
+ }
+ if (strstr(buf,JOBSTATE_CANCELED) || strstr(buf, CANCELED_BY_DEVICE) || strstr(buf, CANCELED_BY_CLIENT))
+ {
+ //_DBG("bb_start_scan() SCAN CANCELLED\n");
+ stat = SANE_STATUS_GOOD;
+ ps->user_cancel = 1;
+ goto bugout;
+ }
+ if (strstr(buf, JOBSTATE_COMPLETED))
+ {
+ stat = SANE_STATUS_GOOD;
+ goto bugout;
+ }
+ usleep(500000);//0.5 sec delay
+ }//end while()
+
+ char *c = strstr(buf, "<BinaryURL>");
+ _DBG("bb_start_scan() BinaryURL=%s \n", c);
+
+ if (!c) goto bugout;
+ c +=11;
+ char BinaryURL[30];
+ i = 0;
+ while(*c != '<')
+ {
+ BinaryURL[i++] = *c ;
+ c++;
+ }
+ BinaryURL[i] = '\0';
+ //_DBG("bb_start_scan() BinaryURL=%s\n", BinaryURL);
+ len = snprintf(buf, sizeof(buf), GET_SCAN_JOB_URL, BinaryURL);
+
+ if (http_write(pbb->http_handle, buf, strlen(buf), timeout) != HTTP_R_OK)
+ {
+ //goto bugout;
+ }
+
+ if (http_read_header(pbb->http_handle, buf, sizeof(buf), timeout, &len) != HTTP_R_OK)
+ {
+ //goto bugout;
+ }
+
+ if(strstr(buf, "HTTP/1.1 400 Bad Request")) http_read_header(pbb->http_handle, buf, sizeof(buf), timeout, &len);
+
+ stat = SANE_STATUS_GOOD;
+bugout:
+ if (stat && pbb->http_handle)
+ {
+ http_close(pbb->http_handle); /* error, close http connection */
+ pbb->http_handle = 0;
+ }
+ return stat;
+} /* bb_start_scan */
+
+int get_size(struct ledm_session* ps)
+{
+ struct bb_ledm_session *pbb = ps->bb_session;
+ char buffer[7];
+ int i=0, tmo=50, len;
+
+ if(ps->currentResolution >= 1200) tmo *= 5;
+
+ while(1)
+ {
+ if(http_read_size(pbb->http_handle, buffer+i, 1, tmo, &len) == 2) return 0;
+ if( i && *(buffer+i) == '\n' && *(buffer+i-1) == '\r') break;
+ i++;
+ }
+ *(buffer+i+1)='\0';
+ return strtol(buffer, NULL, 16);
+}
+
+int bb_get_image_data(struct ledm_session* ps, int maxLength)
+{
+ struct bb_ledm_session *pbb = ps->bb_session;
+ int size=0, stat=1;
+ char buf_size[2];
+ int len=0, tmo=50;
+ _DBG("bb_get_image_data http_handle=%p cnt=%d pbb=%p\n", pbb->http_handle, ps->cnt, pbb);
+ if(ps->currentResolution >= 1200) tmo *= 5;
+
+ if (ps->cnt == 0)
+ {
+ size = get_size(ps);
+ if(size == 0)
+ {
+ http_read_size(pbb->http_handle, buf_size, 2, tmo, &len);
+ http_read_size(pbb->http_handle, buf_size, -1, tmo, &len);
+ return 0;
+ }
+ http_read_size(pbb->http_handle, ps->buf, size, tmo, &len);
+ ps->cnt += len;
+ http_read_size(pbb->http_handle, buf_size, 2, tmo, &len);
+ }
+
+ return stat=0;
+}
+
+int bb_end_page(struct ledm_session *ps, int io_error)
+{
+ struct bb_ledm_session *pbb = ps->bb_session;
+
+ _DBG("bb_end_page(error=%d)\n", io_error);
+
+ if (pbb->http_handle)
+ {
+ http_close(pbb->http_handle);
+ pbb->http_handle = 0;
+ }
+ return 0;
+}
+
+int bb_end_scan(struct ledm_session* ps, int io_error)
+{
+ struct bb_ledm_session *pbb = ps->bb_session;
+
+ _DBG("bb_end_scan(error=%d)\n", io_error);
+
+ if (pbb->http_handle)
+ {
+ http_close(pbb->http_handle);
+ pbb->http_handle = 0;
+ }
+ cancel_job(ps);
+ memset(ps->url, 0, sizeof(ps->url));
+ ps->job_id = 0;
+ ps->page_id = 0;
+ return 0;
+}
diff --git a/scan/sane/common.c b/scan/sane/common.c
new file mode 100755
index 0000000..22fce82
--- /dev/null
+++ b/scan/sane/common.c
@@ -0,0 +1,299 @@
+/********************************************************************************************\
+
+ common.c - common code for scl, pml, and soap backends
+
+ (c) 2001-2006 Copyright Hewlett-Packard Development Company, LP
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+ of the Software, and to permit persons to whom the Software is furnished to do
+ so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+ Contributing Authors: David Paschal, Don Welch, David Suffield, Naga Samrat Chowdary Narla
+ Sarbeswar Meher
+
+\********************************************************************************************/
+
+#include <stdio.h>
+#include <stdarg.h>
+#include <syslog.h>
+#include <string.h>
+#include <ctype.h>
+#include "common.h"
+
+#define DEBUG_NOT_STATIC
+#include "sanei_debug.h"
+
+int __attribute__ ((visibility ("hidden"))) bug(const char *fmt, ...)
+{
+ char buf[256];
+ va_list args;
+ int n;
+
+ va_start(args, fmt);
+ if ((n = vsnprintf(buf, 256, fmt, args)) == -1)
+ buf[255] = 0; /* output was truncated */
+ syslog(LOG_WARNING, "%s", buf);
+ DBG(2, "%s", buf);
+ va_end(args);
+ return n;
+}
+
+void __attribute__ ((visibility ("hidden"))) sysdump(const void *data, int size)
+{
+ /* Dump size bytes of *data. Output looks like:
+ * [0000] 75 6E 6B 6E 6F 77 6E 20 30 FF 00 00 00 00 39 00 unknown 0.....9.
+ */
+
+ unsigned char *p = (unsigned char *)data;
+ unsigned char c;
+ int n;
+ char bytestr[4] = {0};
+ char addrstr[10] = {0};
+ char hexstr[16*3 + 5] = {0};
+ char charstr[16*1 + 5] = {0};
+ for(n=1;n<=size;n++) {
+ if (n%16 == 1) {
+ /* store address for this line */
+ snprintf(addrstr, sizeof(addrstr), "%.4d", (int)((p-(unsigned char *)data) & 0xffff));
+ }
+
+ c = *p;
+ if (isprint(c) == 0) {
+ c = '.';
+ }
+
+ /* store hex str (for left side) */
+ snprintf(bytestr, sizeof(bytestr), "%02X ", *p);
+ strncat(hexstr, bytestr, sizeof(hexstr)-strlen(hexstr)-1);
+
+ /* store char str (for right side) */
+ snprintf(bytestr, sizeof(bytestr), "%c", c);
+ strncat(charstr, bytestr, sizeof(charstr)-strlen(charstr)-1);
+
+ if(n%16 == 0) {
+ /* line completed */
+ DBG_SZ("[%4.4s] %-50.50s %s\n", addrstr, hexstr, charstr);
+ hexstr[0] = 0;
+ charstr[0] = 0;
+ }
+ p++; /* next byte */
+ }
+
+ if (strlen(hexstr) > 0) {
+ /* print rest of buffer if not empty */
+ DBG_SZ("[%4.4s] %-50.50s %s\n", addrstr, hexstr, charstr);
+ }
+}
+
+void __attribute__ ((visibility ("hidden"))) bugdump(const void *data, int size)
+{
+ /* Dump size bytes of *data. Output looks like:
+ * [0000] 75 6E 6B 6E 6F 77 6E 20 30 FF 00 00 00 00 39 00 unknown 0.....9.
+ */
+
+ unsigned char *p = (unsigned char *)data;
+ unsigned char c;
+ int n;
+ char bytestr[4] = {0};
+ char addrstr[10] = {0};
+ char hexstr[16*3 + 5] = {0};
+ char charstr[16*1 + 5] = {0};
+ for(n=1;n<=size;n++) {
+ if (n%16 == 1) {
+ /* store address for this line */
+ snprintf(addrstr, sizeof(addrstr), "%.4d", (int)((p-(unsigned char *)data) & 0xffff));
+ }
+
+ c = *p;
+ if (isprint(c) == 0) {
+ c = '.';
+ }
+
+ /* store hex str (for left side) */
+ snprintf(bytestr, sizeof(bytestr), "%02X ", *p);
+ strncat(hexstr, bytestr, sizeof(hexstr)-strlen(hexstr)-1);
+
+ /* store char str (for right side) */
+ snprintf(bytestr, sizeof(bytestr), "%c", c);
+ strncat(charstr, bytestr, sizeof(charstr)-strlen(charstr)-1);
+
+ if(n%16 == 0) {
+ /* line completed */
+ BUG_SZ("[%4.4s] %-50.50s %s\n", addrstr, hexstr, charstr);
+ hexstr[0] = 0;
+ charstr[0] = 0;
+ }
+ p++; /* next byte */
+ }
+
+ if (strlen(hexstr) > 0) {
+ /* print rest of buffer if not empty */
+ BUG_SZ("[%4.4s] %-50.50s %s\n", addrstr, hexstr, charstr);
+ }
+}
+
+char __attribute__ ((visibility ("hidden"))) *psnprintf(char *buf, int bufSize, const char *fmt, ...)
+{
+ va_list args;
+ int n;
+
+ buf[0] = 0;
+
+ va_start(args, fmt);
+ if ((n = vsnprintf(buf, bufSize, fmt, args)) == -1)
+ buf[bufSize] = 0; /* output was truncated */
+ va_end(args);
+
+ return buf;
+}
+
+unsigned long __attribute__ ((visibility ("hidden"))) DivideAndShift( int line,
+ unsigned long numerator1,
+ unsigned long numerator2,
+ unsigned long denominator,
+ int shift )
+{
+ unsigned long remainder, shiftLoss = 0;
+ unsigned long long result = numerator1;
+ result *= numerator2;
+ if( shift > 0 )
+ {
+ result <<= shift;
+ }
+ remainder = result % denominator;
+ result /= denominator;
+ if( shift < 0 )
+ {
+ shiftLoss = result & ( ( 1 << ( -shift ) ) - 1 );
+ result >>= ( -shift );
+ }
+ return result;
+}
+
+void __attribute__ ((visibility ("hidden"))) NumListClear( int * list )
+{
+ memset( list, 0, sizeof( int ) * MAX_LIST_SIZE );
+}
+
+int __attribute__ ((visibility ("hidden"))) NumListIsInList( int * list, int n )
+{
+ int i;
+ for( i = 1; i < MAX_LIST_SIZE; i++ )
+ {
+ if( list[i] == n )
+ {
+ return 1;
+ }
+ }
+ return 0;
+}
+
+int __attribute__ ((visibility ("hidden"))) NumListAdd( int * list, int n )
+{
+ if( NumListIsInList( list, n ) )
+ {
+ return 1;
+ }
+ if( list[0] >= ( MAX_LIST_SIZE - 1 ) )
+ {
+ return 0;
+ }
+ list[0]++;
+ list[list[0]] = n;
+ return 1;
+}
+
+int __attribute__ ((visibility ("hidden"))) NumListGetCount( int * list )
+{
+ return list[0];
+}
+
+int __attribute__ ((visibility ("hidden"))) NumListGetFirst( int * list )
+{
+ int n = list[0];
+ if( n > 0 )
+ {
+ n = list[1];
+ }
+ return n;
+}
+
+void __attribute__ ((visibility ("hidden"))) StrListClear( const char ** list )
+{
+ memset( list, 0, sizeof( char * ) * MAX_LIST_SIZE );
+}
+
+int __attribute__ ((visibility ("hidden"))) StrListIsInList( const char ** list, char * s )
+{
+ while( *list )
+ {
+ if( !strcasecmp( *list, s ) )
+ {
+ return 1;
+ }
+ list++;
+ }
+ return 0;
+}
+
+int __attribute__ ((visibility ("hidden"))) StrListAdd( const char ** list, char * s )
+{
+ int i;
+ for( i = 0; i < MAX_LIST_SIZE - 1; i++ )
+ {
+ if( !list[i] )
+ {
+ list[i] = s;
+ return 1;
+ }
+ if( !strcasecmp( list[i], s ) )
+ {
+ return 1;
+ }
+ }
+ return 0;
+}
+
+char* __attribute__ ((visibility ("hidden"))) itoa(int value, char* str, int radix)
+{
+ static char dig[] = "0123456789""abcdefghijklmnopqrstuvwxyz";
+ int n = 0, neg = 0;
+ unsigned int v;
+ char* p, *q;
+ char c;
+
+ if (radix == 10 && value < 0)
+ {
+ value = -value;
+ neg = 1;
+ }
+ v = value;
+ do {
+ str[n++] = dig[v%radix];
+ v /= radix;
+ } while (v);
+ if (neg)
+ str[n++] = '-';
+ str[n] = '\0';
+
+ for (p = str, q = p + (n-1); p < q; ++p, --q)
+ c = *p, *p = *q, *q = c;
+ return str;
+}
+
+
+
+
diff --git a/scan/sane/common.h b/scan/sane/common.h
new file mode 100644
index 0000000..b42a287
--- /dev/null
+++ b/scan/sane/common.h
@@ -0,0 +1,188 @@
+/************************************************************************************\
+
+ common.h - common code for scl, pml and soap backends
+
+ (c) 2001-2006 Copyright Hewlett-Packard Development Company, LP
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+ of the Software, and to permit persons to whom the Software is furnished to do
+ so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+ Contributing Authors: David Paschal, Don Welch, David Suffield, Sarbeswar Meher
+
+\************************************************************************************/
+
+#ifndef _COMMON_H
+#define _COMMON_H
+
+#include <syslog.h>
+
+// Uncomment the following line to get verbose debugging output
+//#define HPAIO_DEBUG
+
+#define _STRINGIZE(x) #x
+#define STRINGIZE(x) _STRINGIZE(x)
+
+#define BUG(args...) {syslog(LOG_ERR, __FILE__ " " STRINGIZE(__LINE__) ": " args); DBG(2, __FILE__ " " STRINGIZE(__LINE__) ": " args);}
+#define BUG_DUMP(data, size) bugdump((data), (size))
+#define BUG_SZ(args...) {syslog(LOG_ERR, args); DBG(2, args);}
+
+#define DBG_DUMP(data, size) sysdump((data), (size))
+#if 1
+ #define DBG6(args...) DBG(6, __FILE__ " " STRINGIZE(__LINE__) ": " args)
+ #define DBG8(args...) DBG(8, __FILE__ " " STRINGIZE(__LINE__) ": " args)
+ #define DBG_SZ(args...) DBG(6, args)
+#else
+ #define DBG6(args...) syslog(LOG_INFO, __FILE__ " " STRINGIZE(__LINE__) ": " args)
+ #define DBG8(args...) syslog(LOG_INFO, __FILE__ " " STRINGIZE(__LINE__) ": " args)
+ #define DBG_SZ(args...) syslog(LOG_INFO, args)
+#endif
+
+#define BACKEND_NAME hpaio
+
+#define BREAKPOINT __asm( "int3" )
+
+#define OK 1
+#define ERROR 0
+#define MAX_LIST_SIZE 32
+#define EXCEPTION_TIMEOUT 45 /* seconds */
+
+#define STR_COMPRESSION_NONE SANE_I18N("None")
+#define STR_COMPRESSION_MH SANE_I18N("MH")
+#define STR_COMPRESSION_MR SANE_I18N("MR")
+#define STR_COMPRESSION_MMR SANE_I18N("MMR")
+#define STR_COMPRESSION_JPEG SANE_I18N("JPEG")
+
+#define STR_ADF_MODE_AUTO SANE_I18N("Auto")
+#define STR_ADF_MODE_FLATBED SANE_I18N("Flatbed")
+#define STR_ADF_MODE_ADF SANE_I18N("ADF")
+#define STR_ADF_MODE_CAMERA SANE_I18N("Camera")
+
+#define STR_TITLE_ADVANCED SANE_I18N("Advanced")
+
+#define STR_NAME_COMPRESSION "compression"
+#define STR_TITLE_COMPRESSION SANE_I18N("Compression")
+#define STR_DESC_COMPRESSION SANE_I18N("Selects the scanner compression method for faster scans, possibly at the expense of image quality.")
+
+#define STR_NAME_JPEG_QUALITY "jpeg-quality"
+#define STR_TITLE_JPEG_QUALITY SANE_I18N("JPEG compression factor")
+#define STR_DESC_JPEG_QUALITY SANE_I18N("Sets the scanner JPEG compression factor. Larger numbers mean better compression, " \
+ "and smaller numbers mean better image quality.")
+
+#define STR_NAME_BATCH_SCAN "batch-scan"
+#define STR_TITLE_BATCH_SCAN SANE_I18N("Batch scan")
+#define STR_DESC_BATCH_SCAN SANE_I18N("Enables continuous scanning with automatic document feeder (ADF).")
+
+#define STR_NAME_DUPLEX "duplex"
+#define STR_TITLE_DUPLEX SANE_I18N("Duplex")
+#define STR_DESC_DUPLEX SANE_I18N("Enables scanning on both sides of the page.")
+
+#define STR_TITLE_GEOMETRY SANE_I18N("Geometry")
+
+#define STR_NAME_LENGTH_MEASUREMENT "length-measurement"
+#define STR_TITLE_LENGTH_MEASUREMENT SANE_I18N("Length measurement")
+#define STR_DESC_LENGTH_MEASUREMENT SANE_I18N("Selects how the scanned image length is measured and " \
+ "reported, which is impossible to know in advance for scrollfed scans.")
+
+#define STR_LENGTH_MEASUREMENT_UNKNOWN SANE_I18N("Unknown")
+#define STR_LENGTH_MEASUREMENT_UNLIMITED SANE_I18N("Unlimited")
+#define STR_LENGTH_MEASUREMENT_APPROXIMATE SANE_I18N("Approximate")
+#define STR_LENGTH_MEASUREMENT_PADDED SANE_I18N("Padded")
+#define STR_LENGTH_MEASUREMENT_EXACT SANE_I18N("Exact")
+#define STR_UNKNOWN SANE_I18N("???")
+
+#define MIN_JPEG_COMPRESSION_FACTOR 0
+#define MAX_JPEG_COMPRESSION_FACTOR 100
+/* To prevent "2252" asserts on OfficeJet 600 series: */
+#define SAFER_JPEG_COMPRESSION_FACTOR 10
+
+#define BEND_GET_SHORT(s) (((s)[0]<<8)|((s)[1]))
+#define BEND_GET_LONG(s) (((s)[0]<<24)|((s)[1]<<16)|((s)[2]<<8)|((s)[3]))
+#define BEND_SET_SHORT(s,x) ((s)[0]=((x)>>8)&0xFF,(s)[1]=(x)&0xFF)
+#define BEND_SET_LONG(s,x) ((s)[0]=((x)>>24)&0xFF,(s)[1]=((x)>>16)&0xFF,(s)[2]=((x)>>8)&0xFF,(s)[3]=(x)&0xFF)
+#define LEND_GET_SHORT(s) (((s)[1]<<8)|((s)[0]))
+#define LEND_GET_LONG(s) (((s)[3]<<24)|((s)[2]<<16)|((s)[1]<<8)|((s)[0]))
+#define LEND_SET_SHORT(s,x) ((s)[1]=((x)>>8)&0xFF,(s)[0]=(x)&0xFF)
+#define LEND_SET_LONG(s,x) ((s)[3]=((x)>>24)&0xFF,(s)[2]=((x)>>16)&0xFF,(s)[1]=((x)>>8)&0xFF,(s)[0]=(x)&0xFF)
+
+#define GEOMETRY_OPTION_TYPE SANE_TYPE_FIXED
+#define MILLIMETER_SHIFT_FACTOR SANE_FIXED_SCALE_SHIFT
+
+#define DECIPOINTS_PER_INCH 720
+#define DEVPIXELS_PER_INCH 300
+#define MILLIMETERS_PER_10_INCHES 254
+#define INCHES_PER_254_MILLIMETERS 10
+
+#define BYTES_PER_LINE(pixelsPerLine,bitsPerPixel) \
+ ((((pixelsPerLine)*(bitsPerPixel))+7)/8)
+
+#define INCHES_TO_MILLIMETERS(inches) \
+ DivideAndShift(__LINE__, \
+ (inches), \
+ MILLIMETERS_PER_10_INCHES, \
+ INCHES_PER_254_MILLIMETERS, \
+ MILLIMETER_SHIFT_FACTOR)
+
+#define DECIPIXELS_TO_MILLIMETERS(decipixels) \
+ DivideAndShift(__LINE__, \
+ (decipixels), \
+ MILLIMETERS_PER_10_INCHES, \
+ INCHES_PER_254_MILLIMETERS*hpaio->decipixelsPerInch, \
+ MILLIMETER_SHIFT_FACTOR)
+
+#define MILLIMETERS_TO_DECIPIXELS(millimeters) \
+ DivideAndShift(__LINE__, \
+ (millimeters), \
+ INCHES_PER_254_MILLIMETERS*hpaio->decipixelsPerInch, \
+ MILLIMETERS_PER_10_INCHES, \
+ -MILLIMETER_SHIFT_FACTOR)
+
+#define PIXELS_TO_MILLIMETERS(pixels,pixelsPerInch) \
+ DivideAndShift(__LINE__, \
+ (pixels), \
+ MILLIMETERS_PER_10_INCHES, \
+ (pixelsPerInch)*INCHES_PER_254_MILLIMETERS, \
+ MILLIMETER_SHIFT_FACTOR)
+
+#define MILLIMETERS_TO_PIXELS(millimeters,pixelsPerInch) \
+ DivideAndShift(__LINE__, \
+ (millimeters), \
+ INCHES_PER_254_MILLIMETERS*(pixelsPerInch), \
+ MILLIMETERS_PER_10_INCHES, \
+ -MILLIMETER_SHIFT_FACTOR)
+
+#define ADD_XFORM(x) \
+ do { \
+ pXform->eXform=x; \
+ pXform++; \
+ } while(0)
+
+int __attribute__ ((visibility ("hidden"))) bug(const char *fmt, ...);
+void __attribute__ ((visibility ("hidden"))) sysdump(const void *data, int size);
+void __attribute__ ((visibility ("hidden"))) bugdump(const void *data, int size);
+char __attribute__ ((visibility ("hidden"))) *psnprintf(char *buf, int bufSize, const char *fmt, ...);
+unsigned long __attribute__ ((visibility ("hidden"))) DivideAndShift(int line, unsigned long numerator1, unsigned long numerator2,
+ unsigned long denominator, int shift);
+void __attribute__ ((visibility ("hidden"))) NumListClear( int * list );
+int __attribute__ ((visibility ("hidden"))) NumListIsInList( int * list, int n );
+int __attribute__ ((visibility ("hidden"))) NumListAdd( int * list, int n );
+int __attribute__ ((visibility ("hidden"))) NumListGetCount( int * list );
+int __attribute__ ((visibility ("hidden"))) NumListGetFirst( int * list );
+void __attribute__ ((visibility ("hidden"))) StrListClear( const char ** list );
+int __attribute__ ((visibility ("hidden"))) StrListIsInList( const char ** list, char * s );
+int __attribute__ ((visibility ("hidden"))) StrListAdd( const char ** list, char * s );
+char* __attribute__ ((visibility ("hidden"))) itoa(int value, char* str, int radix);
+#endif
diff --git a/scan/sane/hpaio.c b/scan/sane/hpaio.c
new file mode 100644
index 0000000..945ad1c
--- /dev/null
+++ b/scan/sane/hpaio.c
@@ -0,0 +1,3458 @@
+/************************************************************************************\
+
+ hpaio.c - HP SANE backend for multi-function peripherals (libsane-hpaio)
+
+ (c) 2001-2008 Copyright Hewlett-Packard Development Company, LP
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+ of the Software, and to permit persons to whom the Software is furnished to do
+ so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+ Contributing Authors: David Paschal, Don Welch, David Suffield, Narla Naga Samrat Chowdary,
+ Yashwant Sahu, Sarbeswar Meher
+
+\************************************************************************************/
+
+
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE
+#endif
+
+#include <stdio.h>
+#include <sys/time.h>
+#include <time.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <ctype.h>
+#include <cups/cups.h>
+#include "sane.h"
+#include "saneopts.h"
+#include "common.h"
+#include "io.h"
+#include "mfpdtf.h"
+#include "tables.h"
+#include "hpip.h"
+#include "hpmud.h"
+#include "soap.h"
+#include "soapht.h"
+#include "marvell.h"
+#include "hpaio.h"
+# include "ledm.h"
+
+#define DEBUG_DECLARE_ONLY
+#include "sanei_debug.h"
+
+static SANE_Device **DeviceList = NULL;
+
+static hpaioScanner_t FirstScanner = 0;
+static hpaioScanner_t LastScanner = 0;
+
+static int ResetDeviceList(SANE_Device ***pd)
+{
+ int i;
+
+ if (*pd)
+ {
+ for (i=0; (*pd)[i] && i<MAX_DEVICE; i++)
+ {
+ if ((*pd)[i]->name)
+ free((void *)(*pd)[i]->name);
+ if ((*pd)[i]->model)
+ free((void *)(*pd)[i]->model);
+ free((*pd)[i]);
+ }
+ free(*pd);
+ *pd = NULL;
+ }
+
+ return 0;
+}
+
+static int AddDeviceList(char *uri, char *model, SANE_Device ***pd)
+{
+ int i;
+
+ if (*pd == NULL)
+ {
+ /* Allocate array of pointers. */
+ *pd = malloc(sizeof(SANE_Device *) * MAX_DEVICE);
+ memset(*pd, 0, sizeof(SANE_Device *) * MAX_DEVICE);
+ }
+
+ /* Find empty slot in array of pointers. */
+ for (i=0; i<MAX_DEVICE; i++)
+ {
+ if ((*pd)[i] == NULL)
+ {
+ /* Allocate Sane_Device and members. */
+ (*pd)[i] = malloc(sizeof(SANE_Device));
+ (*pd)[i]->name = malloc(strlen(uri));
+ strcpy((char *)(*pd)[i]->name, uri+3); /* remove "hp:" */
+ (*pd)[i]->model = strdup(model);
+ (*pd)[i]->vendor = "Hewlett-Packard";
+ (*pd)[i]->type = "all-in-one";
+ break;
+ }
+ }
+
+ return 0;
+}
+
+static int AddCupsList(char *uri, char ***printer)
+{
+ int i, stat=1;
+
+ /* Look for hp network URIs only. */
+ if (strncasecmp(uri, "hp:/net/", 8) !=0)
+ goto bugout;
+
+ if (*printer == NULL)
+ {
+ /* Allocate array of string pointers. */
+ *printer = malloc(sizeof(char *) * MAX_DEVICE);
+ memset(*printer, 0, sizeof(char *) * MAX_DEVICE);
+ }
+
+ /* Ignor duplicates (ie: printer queues using the same device). */
+ for (i=0; (*printer)[i] != NULL && i<MAX_DEVICE; i++)
+ {
+ if (strcmp((*printer)[i], uri) == 0)
+ goto bugout;
+ }
+
+ /* Find empty slot in array of pointers. */
+ for (i=0; i<MAX_DEVICE; i++)
+ {
+ if ((*printer)[i] == NULL)
+ {
+ (*printer)[i] = strdup(uri);
+ break;
+ }
+ }
+
+ stat = 0;
+
+bugout:
+
+ return stat;
+}
+
+/* Parse URI record from buf. Assumes one record per line. All returned strings are zero terminated. */
+static int GetUriLine(char *buf, char *uri, char **tail)
+{
+ int i=0, j;
+ int maxBuf = HPMUD_LINE_SIZE*64;
+
+ uri[0] = 0;
+
+ if (strncasecmp(&buf[i], "direct ", 7) == 0)
+ {
+ i = 7;
+ j = 0;
+ for (; buf[i] == ' ' && i < maxBuf; i++); /* eat white space before string */
+ while ((buf[i] != ' ') && (i < maxBuf) && (j < HPMUD_LINE_SIZE))
+ uri[j++] = buf[i++];
+ uri[j] = 0;
+
+ for (; buf[i] != '\n' && i < maxBuf; i++); /* eat rest of line */
+ }
+ else
+ {
+ for (; buf[i] != '\n' && i < maxBuf; i++); /* eat line */
+ }
+
+ i++; /* bump past '\n' */
+
+ if (tail != NULL)
+ *tail = buf + i; /* tail points to next line */
+
+ return i;
+}
+
+static int GetCupsPrinters(char ***printer)
+{
+ http_t *http=NULL; /* HTTP object */
+ ipp_t *request=NULL; /* IPP request object */
+ ipp_t *response=NULL; /* IPP response object */
+ ipp_attribute_t *attr; /* Current IPP attribute */
+ int cnt=0;
+
+ /* Connect to the HTTP server */
+ if ((http = httpConnectEncrypt(cupsServer(), ippPort(), cupsEncryption())) == NULL)
+ goto bugout;
+
+ /* Assemble the IPP request */
+ request = ippNew();
+
+ request->request.op.operation_id = CUPS_GET_PRINTERS;
+ request->request.any.request_id = 1;
+
+ ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET, "attributes-charset", NULL, "utf-8");
+ ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE, "attributes-natural-language", NULL, "en");
+ ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, "requested-attributes", NULL, "device-uri");
+
+ /* Send the request and get a response. */
+ if ((response = cupsDoRequest(http, request, "/")) == NULL)
+ goto bugout;
+
+ for (attr = response->attrs; attr != NULL; attr = attr->next)
+ {
+ /* Skip leading attributes until we hit a printer. */
+ while (attr != NULL && attr->group_tag != IPP_TAG_PRINTER)
+ attr = attr->next;
+
+ if (attr == NULL)
+ break;
+
+ while (attr != NULL && attr->group_tag == IPP_TAG_PRINTER)
+ {
+ if (strcmp(attr->name, "device-uri") == 0 && attr->value_tag == IPP_TAG_URI && AddCupsList(attr->values[0].string.text, printer) == 0)
+ cnt++;
+ attr = attr->next;
+ }
+
+ if (attr == NULL)
+ break;
+ }
+
+ ippDelete(response);
+
+ bugout:
+ return cnt;
+}
+
+static int DevDiscovery(int localOnly)
+{
+ struct hpmud_model_attributes ma;
+ char message[HPMUD_LINE_SIZE*64];
+ char uri[HPMUD_LINE_SIZE];
+ char model[HPMUD_LINE_SIZE];
+ char *tail;
+ int i, scan_type, cnt=0, total=0, bytes_read;
+ char **cups_printer=NULL; /* list of printers */
+ enum HPMUD_RESULT stat;
+
+ stat = hpmud_probe_devices(HPMUD_BUS_ALL, message, sizeof(message), &cnt, &bytes_read);
+
+ if (stat != HPMUD_R_OK)
+ goto bugout;
+
+ /* Look for local all-in-one scan devices (defined by hpmud). */
+ tail = message;
+ for (i=0; i<cnt; i++)
+ {
+ scan_type = 0;
+ GetUriLine(tail, uri, &tail);
+ hpmud_query_model(uri, &ma);
+ if (ma.scantype > 0)
+ {
+ hpmud_get_uri_model(uri, model, sizeof(model));
+ AddDeviceList(uri, model, &DeviceList);
+ total++;
+ }
+ else
+ {
+ DBG(6,"unsupported scantype=%d %s\n", ma.scantype, uri);
+ }
+ }
+
+ /* Ignore localOnly flag (used by saned) and always look for network all-in-one scan devices (defined by cups). */
+ cnt = GetCupsPrinters(&cups_printer);
+ for (i=0; i<cnt; i++)
+ {
+ hpmud_query_model(cups_printer[i], &ma);
+ if (ma.scantype > 0)
+ {
+ hpmud_get_uri_model(cups_printer[i], model, sizeof(model));
+ AddDeviceList(cups_printer[i], model, &DeviceList);
+ total++;
+ }
+ else
+ {
+ DBG(6,"unsupported scantype=%d %s\n", ma.scantype, cups_printer[i]);
+ }
+ free(cups_printer[i]);
+ }
+ if (cups_printer)
+ free(cups_printer);
+
+bugout:
+ return total;
+}
+
+static void hpaioAddScanner( hpaioScanner_t scanner )
+{
+ if( !FirstScanner )
+ {
+ FirstScanner = scanner;
+ }
+ scanner->prev = LastScanner;
+ scanner->next = 0;
+ if( LastScanner )
+ {
+ LastScanner->next = scanner;
+ }
+ LastScanner = scanner;
+}
+
+static hpaioScanner_t hpaioFindScanner( SANE_String_Const name )
+{
+ hpaioScanner_t p = FirstScanner;
+
+ while( p != NULL )
+ {
+ if( strcasecmp( name, p->saneDevice.name ) == 0 )
+ return p;
+
+ p=p->next;
+ }
+
+ return NULL;
+}
+
+SANE_Status __attribute__ ((visibility ("hidden"))) hpaioScannerToSaneError( hpaioScanner_t hpaio )
+{
+ SANE_Status retcode;
+
+ if( hpaio->scannerType == SCANNER_TYPE_SCL )
+ {
+ int sclError;
+
+ retcode = SclInquire( hpaio->deviceid, hpaio->scan_channelid,
+ SCL_CMD_INQUIRE_DEVICE_PARAMETER,
+ SCL_INQ_CURRENT_ERROR,
+ &sclError,
+ 0,
+ 0 );
+
+ if( retcode == SANE_STATUS_UNSUPPORTED )
+ {
+ retcode = SANE_STATUS_GOOD;
+ }
+ else if( retcode == SANE_STATUS_GOOD )
+ {
+ bug("hpaio: hpaioScannerToSaneError: sclError=%d.\n", sclError);
+ switch( sclError )
+ {
+ case SCL_ERROR_UNRECOGNIZED_COMMAND:
+ case SCL_ERROR_PARAMETER_ERROR:
+ retcode = SANE_STATUS_UNSUPPORTED;
+ break;
+
+ case SCL_ERROR_NO_MEMORY:
+ retcode = SANE_STATUS_NO_MEM;
+ break;
+
+ case SCL_ERROR_CANCELLED:
+ retcode = SANE_STATUS_CANCELLED;
+ break;
+
+ case SCL_ERROR_PEN_DOOR_OPEN:
+ retcode = SANE_STATUS_COVER_OPEN;
+ break;
+
+ case SCL_ERROR_SCANNER_HEAD_LOCKED:
+ case SCL_ERROR_ADF_PAPER_JAM:
+ case SCL_ERROR_HOME_POSITION_MISSING:
+ case SCL_ERROR_ORIGINAL_ON_GLASS:
+ retcode = SANE_STATUS_JAMMED;
+ break;
+
+ case SCL_ERROR_PAPER_NOT_LOADED:
+ retcode = SANE_STATUS_NO_DOCS;
+ break;
+
+ default:
+ retcode = SANE_STATUS_IO_ERROR;
+ break;
+ }
+ }
+ }
+ else /* if (hpaio->scannerType==SCANNER_TYPE_PML) */
+ {
+ int pmlError, type;
+
+ //if( ptalPmlRequestGet( hpaio->pml.objUploadError, 0 ) == ERROR )
+ if( PmlRequestGet( hpaio->deviceid, hpaio->cmd_channelid, hpaio->pml.objUploadError ) == ERROR )
+ {
+ retcode = SANE_STATUS_GOOD;
+ }
+ else if( PmlGetIntegerValue( hpaio->pml.objUploadError,
+ &type,
+ &pmlError ) == ERROR )
+ {
+ bug("hpaio: hpaioScannerToSaneError: PmlGetIntegerValue failed, type=%d!\n", type);
+ retcode = SANE_STATUS_IO_ERROR;
+ }
+ else
+ {
+ bug("hpaio: hpaioScannerToSaneError: pmlError=%d.\n", pmlError);
+
+ switch( pmlError )
+ {
+ case PML_UPLOAD_ERROR_SCANNER_JAM:
+ retcode = SANE_STATUS_JAMMED;
+ break;
+
+ case PML_UPLOAD_ERROR_MLC_CHANNEL_CLOSED:
+ case PML_UPLOAD_ERROR_STOPPED_BY_HOST:
+ case PML_UPLOAD_ERROR_STOP_KEY_PRESSED:
+ retcode = SANE_STATUS_CANCELLED;
+ break;
+
+ case PML_UPLOAD_ERROR_NO_DOC_IN_ADF:
+ case PML_UPLOAD_ERROR_DOC_LOADED:
+ retcode = SANE_STATUS_NO_DOCS;
+ break;
+
+ case PML_UPLOAD_ERROR_COVER_OPEN:
+ retcode = SANE_STATUS_COVER_OPEN;
+ break;
+
+ case PML_UPLOAD_ERROR_DEVICE_BUSY:
+ retcode = SANE_STATUS_DEVICE_BUSY;
+ break;
+
+ default:
+ retcode = SANE_STATUS_IO_ERROR;
+ break;
+ }
+ }
+ }
+
+ return retcode;
+}
+
+
+SANE_Status __attribute__ ((visibility ("hidden"))) hpaioScannerToSaneStatus( hpaioScanner_t hpaio )
+{
+//BREAKPOINT;
+
+ SANE_Status retcode;
+
+ // if( hpaio->scannerType == SCANNER_TYPE_SCL )
+ // {
+ int sclStatus;
+
+ retcode = SclInquire( hpaio->deviceid, hpaio->scan_channelid,
+ SCL_CMD_INQUIRE_DEVICE_PARAMETER,
+ SCL_INQ_ADF_FEED_STATUS,
+ &sclStatus,
+ 0,
+ 0 );
+
+ if( retcode == SANE_STATUS_UNSUPPORTED )
+ {
+ retcode = SANE_STATUS_GOOD;
+ }
+ else if( retcode == SANE_STATUS_GOOD )
+ {
+ switch( sclStatus )
+ {
+ case SCL_ADF_FEED_STATUS_OK:
+ retcode = SANE_STATUS_GOOD;
+ break;
+
+ case SCL_ADF_FEED_STATUS_BUSY:
+ /* retcode=SANE_STATUS_DEVICE_BUSY; */
+ retcode = SANE_STATUS_GOOD;
+ break;
+
+ case SCL_ADF_FEED_STATUS_PAPER_JAM:
+ case SCL_ADF_FEED_STATUS_ORIGINAL_ON_GLASS:
+ retcode = SANE_STATUS_JAMMED;
+ break;
+
+ case SCL_ADF_FEED_STATUS_PORTRAIT_FEED:
+ retcode = SANE_STATUS_UNSUPPORTED;
+ break;
+
+ default:
+ retcode = SANE_STATUS_IO_ERROR;
+ break;
+ }
+ }
+
+ return retcode;
+}
+
+static int hpaioScannerIsUninterruptible( hpaioScanner_t hpaio,
+ int * pUploadState )
+{
+ int uploadState;
+ if( !pUploadState )
+ {
+ pUploadState = &uploadState;
+ }
+
+ return ( hpaio->scannerType == SCANNER_TYPE_PML &&
+ hpaio->pml.scanDone &&
+ PmlRequestGet( hpaio->deviceid, hpaio->cmd_channelid,
+ hpaio->pml.objUploadState ) != ERROR &&
+ PmlGetIntegerValue( hpaio->pml.objUploadState, 0, pUploadState ) != ERROR &&
+ ( *pUploadState == PML_UPLOAD_STATE_START ||
+ *pUploadState == PML_UPLOAD_STATE_ACTIVE ||
+ *pUploadState == PML_UPLOAD_STATE_NEWPAGE ) );
+}
+
+static SANE_Status hpaioResetScanner( hpaioScanner_t hpaio )
+{
+ SANE_Status retcode;
+
+ if( hpaio->scannerType == SCANNER_TYPE_SCL )
+ {
+ retcode = SclSendCommand( hpaio->deviceid, hpaio->scan_channelid, SCL_CMD_RESET, 0 );
+ if( retcode != SANE_STATUS_GOOD )
+ {
+ return retcode;
+ }
+ sleep(1); /* delay for embeded jetdirect scl scanners (ie: PS 3300, PS C7280, PS C6100) */
+ }
+ else /* if (hpaio->scannerType==SCANNER_TYPE_PML) */
+ {
+ if( !hpaioScannerIsUninterruptible( hpaio, 0 ) )
+ {
+ PmlSetIntegerValue( hpaio->pml.objUploadState,
+ PML_TYPE_ENUMERATION,
+ PML_UPLOAD_STATE_IDLE );
+
+ if( PmlRequestSetRetry( hpaio->deviceid, hpaio->cmd_channelid,
+ hpaio->pml.objUploadState, 0, 0 ) == ERROR )
+ {
+ return SANE_STATUS_IO_ERROR;
+ }
+ }
+
+ /* Clear upload error for the sake of the LaserJet 1100A. */
+ PmlSetIntegerValue( hpaio->pml.objUploadError,
+ PML_TYPE_SIGNED_INTEGER,
+ 0 );
+
+ PmlRequestSet( hpaio->deviceid, hpaio->cmd_channelid, hpaio->pml.objUploadError ); /* No retry. */
+ }
+
+ return SANE_STATUS_GOOD;
+}
+
+static PmlObject_t hpaioPmlAllocate( hpaioScanner_t hpaio )
+{
+ int size = sizeof( struct PmlObject_s );
+ PmlObject_t obj;
+
+ /* Malloc and zero object. */
+ obj = malloc( size );
+
+ memset( obj, 0, size );
+
+ /* Insert into linked list of PML objects for this device. */
+ if( !hpaio->firstPmlObject )
+ {
+ hpaio->firstPmlObject = obj;
+ }
+ obj->prev = hpaio->lastPmlObject;
+ obj->next = 0;
+ if( hpaio->lastPmlObject )
+ {
+ hpaio->lastPmlObject->next = obj;
+ }
+ hpaio->lastPmlObject = obj;
+
+ return obj;
+}
+
+static PmlObject_t hpaioPmlAllocateID( hpaioScanner_t hpaio, char * oid )
+{
+ PmlObject_t obj = hpaioPmlAllocate( hpaio );
+
+ if( !obj )
+ {
+ bug("hpaioPmlAllocateID: out of memory!\n");
+ }
+
+ PmlSetID( obj, oid );
+
+ return obj;
+}
+
+static void hpaioPmlDeallocateObjects( hpaioScanner_t hpaio )
+{
+ //int count = 0;
+ PmlObject_t current, next;
+
+ current = hpaio->firstPmlObject;
+
+ while( current )
+ {
+ next = current->next;
+
+ free( current );
+
+ current = next;
+ }
+}
+
+static SANE_Status hpaioPmlAllocateObjects(hpaioScanner_t hpaio)
+{
+ /* SNMP oids for PML scanners. */
+ hpaio->pml.objScannerStatus = hpaioPmlAllocateID( hpaio, "1.3.6.1.4.1.11.2.3.9.4.2.1.2.2.2.1.0" );
+ hpaio->pml.objResolutionRange = hpaioPmlAllocateID( hpaio, "1.3.6.1.4.1.11.2.3.9.4.2.1.2.2.2.3.0" );
+ hpaio->pml.objUploadTimeout = hpaioPmlAllocateID( hpaio, "1.3.6.1.4.1.11.2.3.9.4.2.1.1.1.18.0" );
+ hpaio->pml.objContrast = hpaioPmlAllocateID( hpaio, "1.3.6.1.4.1.11.2.3.9.4.2.1.2.2.1.1.0" );
+ hpaio->pml.objResolution = hpaioPmlAllocateID( hpaio, "1.3.6.1.4.1.11.2.3.9.4.2.1.2.2.1.2.0" );
+ hpaio->pml.objPixelDataType = hpaioPmlAllocateID( hpaio, "1.3.6.1.4.1.11.2.3.9.4.2.1.2.2.1.3.0" );
+ hpaio->pml.objCompression = hpaioPmlAllocateID( hpaio, "1.3.6.1.4.1.11.2.3.9.4.2.1.2.2.1.4.0" );
+ hpaio->pml.objCompressionFactor = hpaioPmlAllocateID( hpaio, "1.3.6.1.4.1.11.2.3.9.4.2.1.2.2.1.5.0" );
+ hpaio->pml.objUploadError = hpaioPmlAllocateID( hpaio, "1.3.6.1.4.1.11.2.3.9.4.2.1.2.2.1.6.0" );
+ hpaio->pml.objUploadState = hpaioPmlAllocateID( hpaio, "1.3.6.1.4.1.11.2.3.9.4.2.1.2.2.1.12.0" );
+ hpaio->pml.objAbcThresholds = hpaioPmlAllocateID( hpaio, "1.3.6.1.4.1.11.2.3.9.4.2.1.2.2.1.14.0" );
+ hpaio->pml.objSharpeningCoefficient = hpaioPmlAllocateID( hpaio, "1.3.6.1.4.1.11.2.3.9.4.2.1.2.2.1.15.0" );
+ hpaio->pml.objNeutralClipThresholds = hpaioPmlAllocateID( hpaio, "1.3.6.1.4.1.11.2.3.9.4.2.1.2.2.1.31.0" );
+ hpaio->pml.objToneMap = hpaioPmlAllocateID( hpaio, "1.3.6.1.4.1.11.2.3.9.4.2.1.2.2.1.32.0" );
+ hpaio->pml.objCopierReduction = hpaioPmlAllocateID( hpaio, "1.3.6.1.4.1.11.2.3.9.4.2.1.5.1.4.0" );
+ hpaio->pml.objScanToken = hpaioPmlAllocateID( hpaio, "1.3.6.1.4.1.11.2.3.9.4.2.1.1.1.25.0" );
+ hpaio->pml.objModularHardware = hpaioPmlAllocateID( hpaio, "1.3.6.1.4.1.11.2.3.9.4.2.1.2.2.1.75.0" );
+
+ /* Some PML objects for SCL scanners. */
+ hpaio->scl.objSupportedFunctions = hpaioPmlAllocateID( hpaio, "1.3.6.1.4.1.11.2.3.9.4.2.1.1.2.67.0" );
+
+ return SANE_STATUS_GOOD;
+}
+
+static int hpaioConnClose( hpaioScanner_t hpaio )
+{
+ if (hpaio->cmd_channelid > 0)
+ hpmud_close_channel(hpaio->deviceid, hpaio->cmd_channelid);
+ hpaio->cmd_channelid = -1;
+ if (hpaio->scan_channelid > 0)
+ hpmud_close_channel(hpaio->deviceid, hpaio->scan_channelid);
+ hpaio->scan_channelid = -1;
+
+ return 0;
+} // hpaioConnClose()
+
+static SANE_Status hpaioConnOpen( hpaioScanner_t hpaio )
+{
+ SANE_Status retcode;
+ enum HPMUD_RESULT stat;
+
+ if (hpaio->scannerType==SCANNER_TYPE_SCL)
+ {
+ stat = hpmud_open_channel(hpaio->deviceid, "HP-SCAN", &hpaio->scan_channelid);
+ if(stat != HPMUD_R_OK)
+ {
+ bug("failed to open scan channel: %s %d\n", __FILE__, __LINE__);
+ retcode = SANE_STATUS_DEVICE_BUSY;
+ goto abort;
+ }
+ }
+
+ stat = hpmud_open_channel(hpaio->deviceid, "HP-MESSAGE", &hpaio->cmd_channelid);
+ if(stat != HPMUD_R_OK)
+ {
+ bug("failed to open pml channel: %s %d\n", __FILE__, __LINE__);
+ retcode = SANE_STATUS_IO_ERROR;
+ goto abort;
+ }
+
+ retcode = SANE_STATUS_GOOD;
+
+abort:
+ if( retcode != SANE_STATUS_GOOD )
+ {
+ SendScanEvent( hpaio->deviceuri, EVENT_SCANNER_FAIL);
+ }
+ return retcode;
+}
+
+static SANE_Status hpaioConnPrepareScan( hpaioScanner_t hpaio )
+{
+ SANE_Status retcode;
+ int i;
+
+ /* ADF may already have channel(s) open. */
+ if (hpaio->cmd_channelid < 0)
+ {
+ retcode = hpaioConnOpen( hpaio );
+
+ if( retcode != SANE_STATUS_GOOD )
+ {
+ return retcode;
+ }
+ }
+
+ retcode = hpaioResetScanner( hpaio );
+
+ /* Reserve scanner and make sure it got reserved. */
+ SclSendCommand( hpaio->deviceid, hpaio->scan_channelid, SCL_CMD_SET_DEVICE_LOCK, 1 );
+ SclSendCommand( hpaio->deviceid, hpaio->scan_channelid,
+ SCL_CMD_SET_DEVICE_LOCK_TIMEOUT,
+ SCL_DEVICE_LOCK_TIMEOUT );
+
+ for( i = 0; ; i++ )
+ {
+ char buffer[LEN_SCL_BUFFER];
+ int len, j;
+ struct timeval tv1, tv2;
+ gettimeofday( &tv1, 0 );
+
+ if( SclInquire( hpaio->deviceid, hpaio->scan_channelid,
+ SCL_CMD_INQUIRE_DEVICE_PARAMETER,
+ SCL_INQ_SESSION_ID,
+ &len,
+ buffer,
+ LEN_SCL_BUFFER ) != SANE_STATUS_GOOD )
+ {
+// break;
+ return SANE_STATUS_IO_ERROR;
+ }
+
+ gettimeofday( &tv2, 0 );
+
+ for( j = 0; j < len && buffer[j] == '0'; j++ ) ;
+
+ if( j < len )
+ {
+ break;
+ }
+
+ if( i >= SCL_PREPARE_SCAN_DEVICE_LOCK_MAX_RETRIES )
+ {
+ return SANE_STATUS_DEVICE_BUSY;
+ }
+
+ DBG(8, "hpaioConnPrepareScan: Waiting for device lock %s %d\n", __FILE__, __LINE__);
+
+ if( ( ( unsigned ) ( tv2.tv_sec - tv1.tv_sec ) ) <= SCL_PREPARE_SCAN_DEVICE_LOCK_DELAY )
+ {
+ sleep( SCL_PREPARE_SCAN_DEVICE_LOCK_DELAY );
+ }
+ }
+
+ SendScanEvent( hpaio->deviceuri, EVENT_START_SCAN_JOB);
+
+ return SANE_STATUS_GOOD;
+}
+
+static void hpaioConnEndScan( hpaioScanner_t hpaio )
+{
+ hpaioResetScanner( hpaio );
+ hpaioConnClose( hpaio );
+
+ SendScanEvent( hpaio->deviceuri, EVENT_END_SCAN_JOB);
+}
+
+static SANE_Status SetResolutionListSCL(hpaioScanner_t hpaio)
+{
+ int supported_res[] = {50, 75, 100, 150, 200, 300, 600, 1200, 2400, 4800, 9600};
+ int i, len = sizeof(supported_res)/sizeof(int);
+
+ if (hpaio->currentAdfMode == ADF_MODE_ADF || hpaio->currentAdfMode == ADF_MODE_AUTO)
+ {
+ hpaio->resolutionRange.min = hpaio->scl.minResAdf;
+ hpaio->resolutionRange.max = hpaio->scl.maxResAdf;
+ }
+ else
+ {
+ hpaio->resolutionRange.min = hpaio->scl.minRes;
+ hpaio->resolutionRange.max = hpaio->scl.maxRes;
+ }
+
+ DBG(6,"minRes=%d maxRes=%d minResAdf=%d maxResAdf=%d\n", hpaio->scl.minRes, hpaio->scl.maxRes, hpaio->scl.minResAdf, hpaio->scl.maxResAdf);
+
+ NumListClear( hpaio->resolutionList );
+ NumListClear( hpaio->lineartResolutionList );
+ for (i = 0; i < len; i++)
+ {
+ if (supported_res[i] >= hpaio->resolutionRange.min &&
+ supported_res[i] <= hpaio->resolutionRange.max)
+ {
+ NumListAdd (hpaio->resolutionList, supported_res[i]);
+ NumListAdd (hpaio->lineartResolutionList, supported_res[i]);
+ }
+ }
+ hpaio->option[OPTION_SCAN_RESOLUTION].constraint_type = SANE_CONSTRAINT_WORD_LIST;
+
+ return SANE_STATUS_GOOD;
+}
+
+static SANE_Status hpaioSetDefaultValue( hpaioScanner_t hpaio, int option )
+{
+ switch( option )
+ {
+ case OPTION_SCAN_MODE:
+ if( hpaio->supportsScanMode[SCAN_MODE_COLOR] )
+ {
+ hpaio->currentScanMode = SCAN_MODE_COLOR;
+ }
+ else if( hpaio->supportsScanMode[SCAN_MODE_GRAYSCALE] )
+ {
+ hpaio->currentScanMode = SCAN_MODE_GRAYSCALE;
+ }
+ else /* if (hpaio->supportsScanMode[SCAN_MODE_LINEART]) */
+ {
+ hpaio->currentScanMode = SCAN_MODE_LINEART;
+ }
+ break;
+
+ case OPTION_SCAN_RESOLUTION:
+ if( hpaio->option[OPTION_SCAN_RESOLUTION].constraint_type == SANE_CONSTRAINT_WORD_LIST )
+ {
+ hpaio->currentResolution = NumListGetFirst( ( SANE_Int * )
+ hpaio->option[OPTION_SCAN_RESOLUTION].constraint.word_list );
+ }
+ else
+ {
+ hpaio->currentResolution = hpaio->resolutionRange.min;
+ }
+ break;
+
+ case OPTION_CONTRAST:
+ hpaio->currentContrast = hpaio->defaultContrast;
+ break;
+
+ case OPTION_COMPRESSION:
+ {
+//BREAKPOINT;
+ int supportedCompression = hpaio->supportsScanMode[hpaio->currentScanMode];
+ int defaultCompression = hpaio->defaultCompression[hpaio->currentScanMode];
+
+ if( supportedCompression & defaultCompression )
+ {
+ hpaio->currentCompression = defaultCompression;
+ }
+ else if( supportedCompression & COMPRESSION_JPEG )
+ {
+ hpaio->currentCompression = COMPRESSION_JPEG;
+ }
+ else if( supportedCompression & COMPRESSION_MH )
+ {
+ hpaio->currentCompression = COMPRESSION_MH;
+ }
+ else if( supportedCompression & COMPRESSION_MR )
+ {
+ hpaio->currentCompression = COMPRESSION_MR;
+ }
+ else if( supportedCompression & COMPRESSION_MMR )
+ {
+ hpaio->currentCompression = COMPRESSION_MMR;
+ }
+ else
+ {
+ hpaio->currentCompression = COMPRESSION_NONE;
+ }
+ }
+ break;
+
+ case OPTION_JPEG_COMPRESSION_FACTOR:
+ hpaio->currentJpegCompressionFactor = hpaio->defaultJpegCompressionFactor;
+ break;
+
+ case OPTION_BATCH_SCAN:
+ hpaio->currentBatchScan = SANE_FALSE;
+ break;
+
+ case OPTION_ADF_MODE:
+ if( hpaio->supportedAdfModes & ADF_MODE_AUTO )
+ {
+ if( hpaio->scannerType == SCANNER_TYPE_PML &&
+ !hpaio->pml.flatbedCapability &&
+ hpaio->supportedAdfModes & ADF_MODE_ADF )
+ {
+ goto defaultToAdf;
+ }
+ hpaio->currentAdfMode = ADF_MODE_AUTO;
+ }
+ else if( hpaio->supportedAdfModes & ADF_MODE_FLATBED )
+ {
+ hpaio->currentAdfMode = ADF_MODE_FLATBED;
+ }
+ else if( hpaio->supportedAdfModes & ADF_MODE_ADF )
+ {
+ defaultToAdf:
+ hpaio->currentAdfMode = ADF_MODE_ADF;
+ }
+ else
+ {
+ hpaio->currentAdfMode = ADF_MODE_AUTO;
+ }
+ break;
+#if 1
+ case OPTION_DUPLEX:
+ hpaio->currentDuplex = SANE_FALSE;
+ break;
+#endif
+ case OPTION_LENGTH_MEASUREMENT:
+ hpaio->currentLengthMeasurement = LENGTH_MEASUREMENT_PADDED;
+ break;
+
+ case OPTION_TL_X:
+ hpaio->currentTlx = hpaio->tlxRange.min;
+ break;
+
+ case OPTION_TL_Y:
+ hpaio->currentTly = hpaio->tlyRange.min;
+ break;
+
+ case OPTION_BR_X:
+ hpaio->currentBrx = hpaio->brxRange.max;
+ break;
+
+ case OPTION_BR_Y:
+ hpaio->currentBry = hpaio->bryRange.max;
+ break;
+
+ default:
+ return SANE_STATUS_INVAL;
+ }
+
+ return SANE_STATUS_GOOD;
+}
+
+static int hpaioUpdateDescriptors( hpaioScanner_t hpaio, int option )
+{
+ int initValues = ( option == OPTION_FIRST );
+ int reload = 0;
+
+ /* OPTION_SCAN_MODE: */
+ if( initValues )
+ {
+ StrListClear( hpaio->scanModeList );
+ if( hpaio->supportsScanMode[SCAN_MODE_LINEART] )
+ {
+ StrListAdd( hpaio->scanModeList, SANE_VALUE_SCAN_MODE_LINEART );
+ }
+ if( hpaio->supportsScanMode[SCAN_MODE_GRAYSCALE] )
+ {
+ StrListAdd( hpaio->scanModeList, SANE_VALUE_SCAN_MODE_GRAY );
+ }
+ if( hpaio->supportsScanMode[SCAN_MODE_COLOR] )
+ {
+ StrListAdd( hpaio->scanModeList, SANE_VALUE_SCAN_MODE_COLOR );
+ }
+ hpaioSetDefaultValue( hpaio, OPTION_SCAN_MODE );
+ reload |= SANE_INFO_RELOAD_OPTIONS;
+ reload |= SANE_INFO_RELOAD_PARAMS;
+ }
+ else if( option == OPTION_SCAN_MODE )
+ {
+ reload |= SANE_INFO_RELOAD_PARAMS;
+ }
+
+ if (hpaio->scannerType == SCANNER_TYPE_SCL)
+ SetResolutionListSCL(hpaio);
+ /* OPTION_SCAN_RESOLUTION: */
+ if( hpaio->option[OPTION_SCAN_RESOLUTION].constraint_type ==
+ SANE_CONSTRAINT_WORD_LIST )
+ {
+ SANE_Int ** pList = ( SANE_Int ** ) &hpaio->option[OPTION_SCAN_RESOLUTION].constraint.word_list;
+
+ if( hpaio->currentScanMode == SCAN_MODE_LINEART )
+ {
+ if( *pList != hpaio->lineartResolutionList )
+ {
+ *pList = hpaio->lineartResolutionList;
+ reload |= SANE_INFO_RELOAD_OPTIONS;
+ }
+ }
+ else
+ {
+ if( *pList != hpaio->resolutionList )
+ {
+ *pList = hpaio->resolutionList;
+ reload |= SANE_INFO_RELOAD_OPTIONS;
+ }
+ }
+ if( initValues || !NumListIsInList( *pList,
+ hpaio->currentResolution ) )
+ {
+ hpaioSetDefaultValue( hpaio, OPTION_SCAN_RESOLUTION );
+ reload |= SANE_INFO_RELOAD_OPTIONS;
+ reload |= SANE_INFO_RELOAD_PARAMS;
+ }
+ }
+ else
+ {
+ if( initValues ||
+ hpaio->currentResolution<hpaio->resolutionRange.min ||
+ hpaio->currentResolution>hpaio->resolutionRange.max )
+ {
+ hpaioSetDefaultValue( hpaio, OPTION_SCAN_RESOLUTION );
+ reload |= SANE_INFO_RELOAD_OPTIONS;
+ reload |= SANE_INFO_RELOAD_PARAMS;
+ }
+ }
+ if( option == OPTION_SCAN_RESOLUTION )
+ {
+ reload |= SANE_INFO_RELOAD_PARAMS;
+ }
+
+ /* OPTION_CONTRAST: */
+ if( initValues )
+ {
+ hpaioSetDefaultValue( hpaio, OPTION_CONTRAST );
+ }
+
+ /* OPTION_COMPRESSION: */
+ {
+//BREAKPOINT;
+ int supportedCompression = hpaio->supportsScanMode[hpaio->currentScanMode];
+ if( initValues ||
+ !( supportedCompression & hpaio->currentCompression ) ||
+ ( ( ( supportedCompression & COMPRESSION_NONE ) != 0 ) !=
+ ( StrListIsInList( hpaio->compressionList,
+ STR_COMPRESSION_NONE ) != 0 ) ) ||
+ ( ( ( supportedCompression & COMPRESSION_MH ) != 0 ) !=
+ ( StrListIsInList( hpaio->compressionList,
+ STR_COMPRESSION_MH ) != 0 ) ) ||
+ ( ( ( supportedCompression & COMPRESSION_MR ) != 0 ) !=
+ ( StrListIsInList( hpaio->compressionList,
+ STR_COMPRESSION_MR ) != 0 ) ) ||
+ ( ( ( supportedCompression & COMPRESSION_MMR ) != 0 ) !=
+ ( StrListIsInList( hpaio->compressionList,
+ STR_COMPRESSION_MMR ) != 0 ) ) ||
+ ( ( ( supportedCompression & COMPRESSION_JPEG ) != 0 ) !=
+ ( StrListIsInList( hpaio->compressionList,
+ STR_COMPRESSION_JPEG ) != 0 ) ) )
+ {
+ StrListClear( hpaio->compressionList );
+ if( supportedCompression & COMPRESSION_NONE )
+ {
+ StrListAdd( hpaio->compressionList, STR_COMPRESSION_NONE );
+ }
+ if( supportedCompression & COMPRESSION_MH )
+ {
+ StrListAdd( hpaio->compressionList, STR_COMPRESSION_MH );
+ }
+ if( supportedCompression & COMPRESSION_MR )
+ {
+ StrListAdd( hpaio->compressionList, STR_COMPRESSION_MR );
+ }
+ if( supportedCompression & COMPRESSION_MMR )
+ {
+ StrListAdd( hpaio->compressionList, STR_COMPRESSION_MMR );
+ }
+ if( supportedCompression & COMPRESSION_JPEG )
+ {
+ StrListAdd( hpaio->compressionList, STR_COMPRESSION_JPEG );
+ }
+ hpaioSetDefaultValue( hpaio, OPTION_COMPRESSION );
+ reload |= SANE_INFO_RELOAD_OPTIONS;
+ }
+ }
+
+ /* OPTION_JPEG_COMPRESSION_FACTOR: */
+ if( initValues ||
+ ( ( hpaio->currentCompression == COMPRESSION_JPEG ) !=
+ ( ( hpaio->option[OPTION_JPEG_COMPRESSION_FACTOR].cap & SANE_CAP_INACTIVE ) == 0 ) ) )
+ {
+ if( hpaio->currentCompression == COMPRESSION_JPEG )
+ {
+ hpaio->option[OPTION_JPEG_COMPRESSION_FACTOR].cap &= ~SANE_CAP_INACTIVE;
+ }
+ else
+ {
+ hpaio->option[OPTION_JPEG_COMPRESSION_FACTOR].cap |= SANE_CAP_INACTIVE;
+ }
+ hpaioSetDefaultValue( hpaio, OPTION_JPEG_COMPRESSION_FACTOR );
+ reload |= SANE_INFO_RELOAD_OPTIONS;
+ }
+
+ /* OPTION_BATCH_SCAN: */
+ if( initValues )
+ {
+ hpaioSetDefaultValue( hpaio, OPTION_BATCH_SCAN );
+ if( hpaio->preDenali )
+ {
+ hpaio->option[OPTION_BATCH_SCAN].cap |= SANE_CAP_INACTIVE;
+ }
+ reload |= SANE_INFO_RELOAD_OPTIONS;
+ }
+ if( !hpaio->currentBatchScan )
+ {
+ hpaio->noDocsConditionPending = 0;
+ }
+
+ /* OPTION_ADF_MODE: */
+ if( initValues )
+ {
+ StrListClear( hpaio->adfModeList );
+ if( hpaio->supportedAdfModes & ADF_MODE_AUTO )
+ {
+ StrListAdd( hpaio->adfModeList, STR_ADF_MODE_AUTO );
+ }
+ if( hpaio->supportedAdfModes & ADF_MODE_FLATBED )
+ {
+ StrListAdd( hpaio->adfModeList, STR_ADF_MODE_FLATBED );
+ }
+ if( hpaio->supportedAdfModes & ADF_MODE_ADF )
+ {
+ StrListAdd( hpaio->adfModeList, STR_ADF_MODE_ADF );
+ }
+ hpaioSetDefaultValue( hpaio, OPTION_ADF_MODE );
+ reload |= SANE_INFO_RELOAD_OPTIONS;
+ }
+
+#if 1
+ /* OPTION_DUPLEX: */
+ if( initValues ||
+ ( ( hpaio->supportsDuplex &&
+ hpaio->currentAdfMode != ADF_MODE_FLATBED ) !=
+ ( ( hpaio->option[OPTION_DUPLEX].cap & SANE_CAP_INACTIVE ) == 0 ) ) )
+ {
+ if( hpaio->supportsDuplex &&
+ hpaio->currentAdfMode != ADF_MODE_FLATBED )
+ {
+ hpaio->option[OPTION_DUPLEX].cap &= ~SANE_CAP_INACTIVE;
+ }
+ else
+ {
+ hpaio->option[OPTION_DUPLEX].cap |= SANE_CAP_INACTIVE;
+ }
+ hpaioSetDefaultValue( hpaio, OPTION_DUPLEX );
+ reload |= SANE_INFO_RELOAD_OPTIONS;
+ }
+#endif
+
+ /* OPTION_LENGTH_MEASUREMENT: */
+ if( initValues )
+ {
+ hpaioSetDefaultValue( hpaio, OPTION_LENGTH_MEASUREMENT );
+ StrListClear( hpaio->lengthMeasurementList );
+ StrListAdd( hpaio->lengthMeasurementList,
+ STR_LENGTH_MEASUREMENT_UNKNOWN );
+ if( hpaio->scannerType == SCANNER_TYPE_PML )
+ {
+ StrListAdd( hpaio->lengthMeasurementList,
+ STR_LENGTH_MEASUREMENT_UNLIMITED );
+ }
+ StrListAdd( hpaio->lengthMeasurementList,
+ STR_LENGTH_MEASUREMENT_APPROXIMATE );
+ StrListAdd( hpaio->lengthMeasurementList,
+ STR_LENGTH_MEASUREMENT_PADDED );
+ /* TODO: hpaioStrListAdd(hpaio->lengthMeasurementList,
+ STR_LENGTH_MEASUREMENT_EXACT); */
+ }
+
+ /* OPTION_TL_X, OPTION_TL_Y, OPTION_BR_X, OPTION_BR_Y: */
+ if( initValues )
+ {
+ hpaioSetDefaultValue( hpaio, OPTION_TL_X );
+ hpaioSetDefaultValue( hpaio, OPTION_TL_Y );
+ hpaioSetDefaultValue( hpaio, OPTION_BR_X );
+ hpaioSetDefaultValue( hpaio, OPTION_BR_Y );
+ reload |= SANE_INFO_RELOAD_OPTIONS;
+ goto processGeometry;
+ }
+ else if( option == OPTION_TL_X ||
+ option == OPTION_TL_Y ||
+ option == OPTION_BR_X ||
+ option == OPTION_BR_Y )
+ {
+ processGeometry : hpaio->effectiveTlx = hpaio->currentTlx;
+ hpaio->effectiveBrx = hpaio->currentBrx;
+ FIX_GEOMETRY( hpaio->effectiveTlx,
+ hpaio->effectiveBrx,
+ hpaio->brxRange.min,
+ hpaio->brxRange.max );
+ hpaio->effectiveTly = hpaio->currentTly;
+ hpaio->effectiveBry = hpaio->currentBry;
+ FIX_GEOMETRY( hpaio->effectiveTly,
+ hpaio->effectiveBry,
+ hpaio->bryRange.min,
+ hpaio->bryRange.max );
+ reload |= SANE_INFO_RELOAD_PARAMS;
+ }
+ if( ( hpaio->currentLengthMeasurement != LENGTH_MEASUREMENT_UNLIMITED ) !=
+ ( ( hpaio->option[OPTION_BR_Y].cap & SANE_CAP_INACTIVE ) == 0 ) )
+ {
+ if( hpaio->currentLengthMeasurement == LENGTH_MEASUREMENT_UNLIMITED )
+ {
+ hpaio->option[OPTION_BR_Y].cap |= SANE_CAP_INACTIVE;
+ }
+ else
+ {
+ hpaio->option[OPTION_BR_Y].cap &= ~SANE_CAP_INACTIVE;
+ }
+ reload |= SANE_INFO_RELOAD_OPTIONS;
+ }
+
+ /* Pre-scan parameters: */
+ if( reload & SANE_INFO_RELOAD_PARAMS )
+ {
+ switch( hpaio->currentScanMode )
+ {
+ case SCAN_MODE_LINEART:
+ hpaio->prescanParameters.format = SANE_FRAME_GRAY;
+ hpaio->prescanParameters.depth = 1;
+ break;
+
+ case SCAN_MODE_GRAYSCALE:
+ hpaio->prescanParameters.format = SANE_FRAME_GRAY;
+ hpaio->prescanParameters.depth = 8;
+ break;
+
+ case SCAN_MODE_COLOR:
+ default:
+ hpaio->prescanParameters.format = SANE_FRAME_RGB;
+ hpaio->prescanParameters.depth = 8;
+ break;
+ }
+ hpaio->prescanParameters.last_frame = SANE_TRUE;
+
+
+ hpaio->prescanParameters.lines = MILLIMETERS_TO_PIXELS( hpaio->effectiveBry - hpaio->effectiveTly,
+ hpaio->currentResolution );
+
+ hpaio->prescanParameters.pixels_per_line = MILLIMETERS_TO_PIXELS( hpaio->effectiveBrx - hpaio->effectiveTlx,
+ hpaio->currentResolution );
+
+ hpaio->prescanParameters.bytes_per_line = BYTES_PER_LINE( hpaio->prescanParameters.pixels_per_line,
+ hpaio->prescanParameters.depth * ( hpaio->prescanParameters.format ==
+ SANE_FRAME_RGB ?
+ 3 :
+ 1 ) );
+ }
+
+ return reload;
+}
+
+static void hpaioSetupOptions( hpaioScanner_t hpaio )
+{
+ hpaio->option[OPTION_NUM_OPTIONS].name = SANE_NAME_NUM_OPTIONS;
+ hpaio->option[OPTION_NUM_OPTIONS].title = SANE_TITLE_NUM_OPTIONS;
+ hpaio->option[OPTION_NUM_OPTIONS].desc = SANE_DESC_NUM_OPTIONS;
+ hpaio->option[OPTION_NUM_OPTIONS].type = SANE_TYPE_INT;
+ hpaio->option[OPTION_NUM_OPTIONS].unit = SANE_UNIT_NONE;
+ hpaio->option[OPTION_NUM_OPTIONS].size = sizeof( SANE_Int );
+ hpaio->option[OPTION_NUM_OPTIONS].cap = SANE_CAP_SOFT_DETECT;
+ hpaio->option[OPTION_NUM_OPTIONS].constraint_type = SANE_CONSTRAINT_NONE;
+
+ hpaio->option[GROUP_SCAN_MODE].title = SANE_TITLE_SCAN_MODE;
+ hpaio->option[GROUP_SCAN_MODE].type = SANE_TYPE_GROUP;
+
+ hpaio->option[OPTION_SCAN_MODE].name = SANE_NAME_SCAN_MODE;
+ hpaio->option[OPTION_SCAN_MODE].title = SANE_TITLE_SCAN_MODE;
+ hpaio->option[OPTION_SCAN_MODE].desc = SANE_DESC_SCAN_MODE;
+ hpaio->option[OPTION_SCAN_MODE].type = SANE_TYPE_STRING;
+ hpaio->option[OPTION_SCAN_MODE].unit = SANE_UNIT_NONE;
+ hpaio->option[OPTION_SCAN_MODE].size = LEN_STRING_OPTION_VALUE;
+ hpaio->option[OPTION_SCAN_MODE].cap = SANE_CAP_SOFT_SELECT |
+ SANE_CAP_SOFT_DETECT;
+ hpaio->option[OPTION_SCAN_MODE].constraint_type = SANE_CONSTRAINT_STRING_LIST;
+ hpaio->option[OPTION_SCAN_MODE].constraint.string_list = hpaio->scanModeList;
+
+ hpaio->option[OPTION_SCAN_RESOLUTION].name = SANE_NAME_SCAN_RESOLUTION;
+ hpaio->option[OPTION_SCAN_RESOLUTION].title = SANE_TITLE_SCAN_RESOLUTION;
+ hpaio->option[OPTION_SCAN_RESOLUTION].desc = SANE_DESC_SCAN_RESOLUTION;
+ hpaio->option[OPTION_SCAN_RESOLUTION].type = SANE_TYPE_INT;
+ hpaio->option[OPTION_SCAN_RESOLUTION].unit = SANE_UNIT_DPI;
+ hpaio->option[OPTION_SCAN_RESOLUTION].size = sizeof( SANE_Int );
+ hpaio->option[OPTION_SCAN_RESOLUTION].cap = SANE_CAP_SOFT_SELECT |
+ SANE_CAP_SOFT_DETECT;
+ hpaio->option[OPTION_SCAN_RESOLUTION].constraint_type = SANE_CONSTRAINT_RANGE;
+ hpaio->option[OPTION_SCAN_RESOLUTION].constraint.range = &hpaio->resolutionRange;
+ hpaio->resolutionRange.quant = 0;
+
+ hpaio->option[GROUP_ADVANCED].title = STR_TITLE_ADVANCED;
+ hpaio->option[GROUP_ADVANCED].type = SANE_TYPE_GROUP;
+ hpaio->option[GROUP_ADVANCED].cap = SANE_CAP_ADVANCED;
+
+ hpaio->option[OPTION_CONTRAST].name = SANE_NAME_CONTRAST;
+ hpaio->option[OPTION_CONTRAST].title = SANE_TITLE_CONTRAST;
+ hpaio->option[OPTION_CONTRAST].desc = SANE_DESC_CONTRAST;
+ hpaio->option[OPTION_CONTRAST].type = SANE_TYPE_INT;
+ hpaio->option[OPTION_CONTRAST].unit = SANE_UNIT_NONE;
+ hpaio->option[OPTION_CONTRAST].size = sizeof( SANE_Int );
+ hpaio->option[OPTION_CONTRAST].cap = SANE_CAP_SOFT_SELECT |
+ SANE_CAP_SOFT_DETECT |
+ SANE_CAP_ADVANCED |
+ SANE_CAP_INACTIVE;
+ hpaio->option[OPTION_CONTRAST].constraint_type = SANE_CONSTRAINT_RANGE;
+ hpaio->option[OPTION_CONTRAST].constraint.range = &hpaio->contrastRange;
+ hpaio->contrastRange.min = PML_CONTRAST_MIN;
+ hpaio->contrastRange.max = PML_CONTRAST_MAX;
+ hpaio->contrastRange.quant = 0;
+ hpaio->defaultContrast = PML_CONTRAST_DEFAULT;
+
+ hpaio->option[OPTION_COMPRESSION].name = STR_NAME_COMPRESSION;
+ hpaio->option[OPTION_COMPRESSION].title = STR_TITLE_COMPRESSION;
+ hpaio->option[OPTION_COMPRESSION].desc = STR_DESC_COMPRESSION;
+ hpaio->option[OPTION_COMPRESSION].type = SANE_TYPE_STRING;
+ hpaio->option[OPTION_COMPRESSION].unit = SANE_UNIT_NONE;
+ hpaio->option[OPTION_COMPRESSION].size = LEN_STRING_OPTION_VALUE;
+ hpaio->option[OPTION_COMPRESSION].cap = SANE_CAP_SOFT_SELECT |
+ SANE_CAP_SOFT_DETECT |
+ SANE_CAP_ADVANCED;
+ hpaio->option[OPTION_COMPRESSION].constraint_type = SANE_CONSTRAINT_STRING_LIST;
+ hpaio->option[OPTION_COMPRESSION].constraint.string_list = hpaio->compressionList;
+
+ hpaio->option[OPTION_JPEG_COMPRESSION_FACTOR].name = STR_NAME_JPEG_QUALITY;
+ hpaio->option[OPTION_JPEG_COMPRESSION_FACTOR].title = STR_TITLE_JPEG_QUALITY;
+ hpaio->option[OPTION_JPEG_COMPRESSION_FACTOR].desc = STR_DESC_JPEG_QUALITY;
+ hpaio->option[OPTION_JPEG_COMPRESSION_FACTOR].type = SANE_TYPE_INT;
+ hpaio->option[OPTION_JPEG_COMPRESSION_FACTOR].unit = SANE_UNIT_NONE;
+ hpaio->option[OPTION_JPEG_COMPRESSION_FACTOR].size = sizeof( SANE_Int );
+ hpaio->option[OPTION_JPEG_COMPRESSION_FACTOR].cap = SANE_CAP_SOFT_SELECT |
+ SANE_CAP_SOFT_DETECT |
+ SANE_CAP_ADVANCED;
+ hpaio->option[OPTION_JPEG_COMPRESSION_FACTOR].constraint_type = SANE_CONSTRAINT_RANGE;
+ hpaio->option[OPTION_JPEG_COMPRESSION_FACTOR].constraint.range = &hpaio->jpegCompressionFactorRange;
+ hpaio->jpegCompressionFactorRange.min = MIN_JPEG_COMPRESSION_FACTOR;
+ hpaio->jpegCompressionFactorRange.max = MAX_JPEG_COMPRESSION_FACTOR;
+ hpaio->jpegCompressionFactorRange.quant = 0;
+ hpaio->defaultJpegCompressionFactor = SAFER_JPEG_COMPRESSION_FACTOR;
+
+ hpaio->option[OPTION_BATCH_SCAN].name = STR_NAME_BATCH_SCAN;
+ hpaio->option[OPTION_BATCH_SCAN].title = STR_TITLE_BATCH_SCAN;
+ hpaio->option[OPTION_BATCH_SCAN].desc = STR_DESC_BATCH_SCAN;
+ hpaio->option[OPTION_BATCH_SCAN].type = SANE_TYPE_BOOL;
+ hpaio->option[OPTION_BATCH_SCAN].unit = SANE_UNIT_NONE;
+ hpaio->option[OPTION_BATCH_SCAN].size = sizeof( SANE_Bool );
+ hpaio->option[OPTION_BATCH_SCAN].cap = SANE_CAP_SOFT_SELECT |
+ SANE_CAP_SOFT_DETECT |
+ SANE_CAP_ADVANCED;
+ hpaio->option[OPTION_BATCH_SCAN].constraint_type = SANE_CONSTRAINT_NONE;
+
+ hpaio->option[OPTION_ADF_MODE].name = SANE_NAME_SCAN_SOURCE; // xsane expects this.
+ hpaio->option[OPTION_ADF_MODE].title = SANE_TITLE_SCAN_SOURCE;
+ hpaio->option[OPTION_ADF_MODE].desc = SANE_DESC_SCAN_SOURCE;
+ hpaio->option[OPTION_ADF_MODE].type = SANE_TYPE_STRING;
+ hpaio->option[OPTION_ADF_MODE].unit = SANE_UNIT_NONE;
+ hpaio->option[OPTION_ADF_MODE].size = LEN_STRING_OPTION_VALUE;
+ hpaio->option[OPTION_ADF_MODE].cap = SANE_CAP_SOFT_SELECT |
+ SANE_CAP_SOFT_DETECT |
+ SANE_CAP_ADVANCED;
+ hpaio->option[OPTION_ADF_MODE].constraint_type = SANE_CONSTRAINT_STRING_LIST;
+ hpaio->option[OPTION_ADF_MODE].constraint.string_list = hpaio->adfModeList;
+
+ // Duplex scanning is supported
+ if (hpaio->supportsDuplex == 1)
+ {
+ hpaio->option[OPTION_DUPLEX].name = STR_NAME_DUPLEX;
+ hpaio->option[OPTION_DUPLEX].title = STR_TITLE_DUPLEX;
+ hpaio->option[OPTION_DUPLEX].desc = STR_DESC_DUPLEX;
+ hpaio->option[OPTION_DUPLEX].type = SANE_TYPE_BOOL;
+ hpaio->option[OPTION_DUPLEX].unit = SANE_UNIT_NONE;
+ hpaio->option[OPTION_DUPLEX].size = sizeof( SANE_Bool );
+ hpaio->option[OPTION_DUPLEX].cap = SANE_CAP_SOFT_SELECT |
+ SANE_CAP_SOFT_DETECT |
+ SANE_CAP_ADVANCED;
+ hpaio->option[OPTION_DUPLEX].constraint_type = SANE_CONSTRAINT_NONE;
+ }
+ hpaio->option[GROUP_GEOMETRY].title = STR_TITLE_GEOMETRY;
+ hpaio->option[GROUP_GEOMETRY].type = SANE_TYPE_GROUP;
+ hpaio->option[GROUP_GEOMETRY].cap = SANE_CAP_ADVANCED;
+
+ hpaio->option[OPTION_LENGTH_MEASUREMENT].name = STR_NAME_LENGTH_MEASUREMENT;
+ hpaio->option[OPTION_LENGTH_MEASUREMENT].title = STR_TITLE_LENGTH_MEASUREMENT;
+ hpaio->option[OPTION_LENGTH_MEASUREMENT].desc = STR_DESC_LENGTH_MEASUREMENT;
+ hpaio->option[OPTION_LENGTH_MEASUREMENT].type = SANE_TYPE_STRING;
+ hpaio->option[OPTION_LENGTH_MEASUREMENT].unit = SANE_UNIT_NONE;
+ hpaio->option[OPTION_LENGTH_MEASUREMENT].size = LEN_STRING_OPTION_VALUE;
+ hpaio->option[OPTION_LENGTH_MEASUREMENT].cap = SANE_CAP_SOFT_SELECT |
+ SANE_CAP_SOFT_DETECT |
+ SANE_CAP_ADVANCED;
+ hpaio->option[OPTION_LENGTH_MEASUREMENT].constraint_type = SANE_CONSTRAINT_STRING_LIST;
+ hpaio->option[OPTION_LENGTH_MEASUREMENT].constraint.string_list = hpaio->lengthMeasurementList;
+
+ hpaio->option[OPTION_TL_X].name = SANE_NAME_SCAN_TL_X;
+ hpaio->option[OPTION_TL_X].title = SANE_TITLE_SCAN_TL_X;
+ hpaio->option[OPTION_TL_X].desc = SANE_DESC_SCAN_TL_X;
+ hpaio->option[OPTION_TL_X].type = GEOMETRY_OPTION_TYPE;
+ hpaio->option[OPTION_TL_X].unit = SANE_UNIT_MM;
+ hpaio->option[OPTION_TL_X].size = sizeof( SANE_Int );
+ hpaio->option[OPTION_TL_X].cap = SANE_CAP_SOFT_SELECT |
+ SANE_CAP_SOFT_DETECT;
+ hpaio->option[OPTION_TL_X].constraint_type = SANE_CONSTRAINT_RANGE;
+ hpaio->option[OPTION_TL_X].constraint.range = &hpaio->tlxRange;
+ hpaio->tlxRange.min = 0;
+ hpaio->tlxRange.quant = 0;
+
+ hpaio->option[OPTION_TL_Y].name = SANE_NAME_SCAN_TL_Y;
+ hpaio->option[OPTION_TL_Y].title = SANE_TITLE_SCAN_TL_Y;
+ hpaio->option[OPTION_TL_Y].desc = SANE_DESC_SCAN_TL_Y;
+ hpaio->option[OPTION_TL_Y].type = GEOMETRY_OPTION_TYPE;
+ hpaio->option[OPTION_TL_Y].unit = SANE_UNIT_MM;
+ hpaio->option[OPTION_TL_Y].size = sizeof( SANE_Int );
+ hpaio->option[OPTION_TL_Y].cap = SANE_CAP_SOFT_SELECT |
+ SANE_CAP_SOFT_DETECT;
+ hpaio->option[OPTION_TL_Y].constraint_type = SANE_CONSTRAINT_RANGE;
+ hpaio->option[OPTION_TL_Y].constraint.range = &hpaio->tlyRange;
+ hpaio->tlyRange.min = 0;
+ hpaio->tlyRange.quant = 0;
+
+ hpaio->option[OPTION_BR_X].name = SANE_NAME_SCAN_BR_X;
+ hpaio->option[OPTION_BR_X].title = SANE_TITLE_SCAN_BR_X;
+ hpaio->option[OPTION_BR_X].desc = SANE_DESC_SCAN_BR_X;
+ hpaio->option[OPTION_BR_X].type = GEOMETRY_OPTION_TYPE;
+ hpaio->option[OPTION_BR_X].unit = SANE_UNIT_MM;
+ hpaio->option[OPTION_BR_X].size = sizeof( SANE_Int );
+ hpaio->option[OPTION_BR_X].cap = SANE_CAP_SOFT_SELECT |
+ SANE_CAP_SOFT_DETECT;
+ hpaio->option[OPTION_BR_X].constraint_type = SANE_CONSTRAINT_RANGE;
+ hpaio->option[OPTION_BR_X].constraint.range = &hpaio->brxRange;
+ hpaio->brxRange.min = 0;
+ hpaio->brxRange.quant = 0;
+
+ hpaio->option[OPTION_BR_Y].name = SANE_NAME_SCAN_BR_Y;
+ hpaio->option[OPTION_BR_Y].title = SANE_TITLE_SCAN_BR_Y;
+ hpaio->option[OPTION_BR_Y].desc = SANE_DESC_SCAN_BR_Y;
+ hpaio->option[OPTION_BR_Y].type = GEOMETRY_OPTION_TYPE;
+ hpaio->option[OPTION_BR_Y].unit = SANE_UNIT_MM;
+ hpaio->option[OPTION_BR_Y].size = sizeof( SANE_Int );
+ hpaio->option[OPTION_BR_Y].cap = SANE_CAP_SOFT_SELECT |
+ SANE_CAP_SOFT_DETECT;
+ hpaio->option[OPTION_BR_Y].constraint_type = SANE_CONSTRAINT_RANGE;
+ hpaio->option[OPTION_BR_Y].constraint.range = &hpaio->bryRange;
+ hpaio->bryRange.min = 0;
+ hpaio->bryRange.quant = 0;
+}
+
+static int hpaioSclSendCommandCheckError( hpaioScanner_t hpaio, int cmd, int param )
+{
+ SANE_Status retcode;
+
+ SclSendCommand( hpaio->deviceid, hpaio->scan_channelid, SCL_CMD_CLEAR_ERROR_STACK, 0 );
+
+ retcode = SclSendCommand( hpaio->deviceid, hpaio->scan_channelid, cmd, param );
+
+ if( retcode == SANE_STATUS_GOOD &&
+ ( ( cmd != SCL_CMD_CHANGE_DOCUMENT && cmd != SCL_CMD_UNLOAD_DOCUMENT ) ||
+ hpaio->beforeScan ) )
+ {
+ retcode = hpaioScannerToSaneError( hpaio );
+ }
+
+ return retcode;
+}
+
+static SANE_Status hpaioProgramOptions( hpaioScanner_t hpaio )
+{
+ int bytes_wrote;
+
+ hpaio->effectiveScanMode = hpaio->currentScanMode;
+ hpaio->effectiveResolution = hpaio->currentResolution;
+
+ // if( hpaio->scannerType == SCANNER_TYPE_SCL )
+ // {
+ /* Set output data type and width. */
+ switch( hpaio->currentScanMode )
+ {
+ case SCAN_MODE_LINEART:
+ SclSendCommand( hpaio->deviceid, hpaio->scan_channelid,
+ SCL_CMD_SET_OUTPUT_DATA_TYPE,
+ SCL_DATA_TYPE_LINEART );
+ SclSendCommand( hpaio->deviceid, hpaio->scan_channelid,
+ SCL_CMD_SET_DATA_WIDTH,
+ SCL_DATA_WIDTH_LINEART );
+ break;
+
+ case SCAN_MODE_GRAYSCALE:
+ SclSendCommand( hpaio->deviceid, hpaio->scan_channelid,
+ SCL_CMD_SET_OUTPUT_DATA_TYPE,
+ SCL_DATA_TYPE_GRAYSCALE );
+ SclSendCommand( hpaio->deviceid, hpaio->scan_channelid,
+ SCL_CMD_SET_DATA_WIDTH,
+ SCL_DATA_WIDTH_GRAYSCALE );
+ break;
+
+ case SCAN_MODE_COLOR:
+ default:
+ SclSendCommand( hpaio->deviceid, hpaio->scan_channelid,
+ SCL_CMD_SET_OUTPUT_DATA_TYPE,
+ SCL_DATA_TYPE_COLOR );
+ SclSendCommand( hpaio->deviceid, hpaio->scan_channelid,
+ SCL_CMD_SET_DATA_WIDTH,
+ SCL_DATA_WIDTH_COLOR );
+ break;
+ }
+
+ /* Set MFPDTF. */
+ SclSendCommand( hpaio->deviceid, hpaio->scan_channelid,
+ SCL_CMD_SET_MFPDTF,
+ hpaio->mfpdtf ? SCL_MFPDTF_ON : SCL_MFPDTF_OFF );
+
+//BREAKPOINT;
+ /* Set compression. */
+ SclSendCommand( hpaio->deviceid, hpaio->scan_channelid,
+ SCL_CMD_SET_COMPRESSION,
+ ( hpaio->currentCompression ==
+ COMPRESSION_JPEG ? SCL_COMPRESSION_JPEG : SCL_COMPRESSION_NONE ) );
+
+ /* Set JPEG compression factor. */
+ SclSendCommand( hpaio->deviceid, hpaio->scan_channelid,
+ SCL_CMD_SET_JPEG_COMPRESSION_FACTOR,
+ hpaio->currentJpegCompressionFactor );
+
+ /* Set X and Y resolution. */
+ SclSendCommand( hpaio->deviceid, hpaio->scan_channelid,
+ SCL_CMD_SET_X_RESOLUTION,
+ hpaio->currentResolution );
+
+ SclSendCommand( hpaio->deviceid, hpaio->scan_channelid,
+ SCL_CMD_SET_Y_RESOLUTION,
+ hpaio->currentResolution );
+
+ /* Set X and Y position and extent. */
+ SclSendCommand( hpaio->deviceid, hpaio->scan_channelid,
+ SCL_CMD_SET_X_POSITION,
+ MILLIMETERS_TO_DECIPIXELS( hpaio->effectiveTlx ) );
+
+ SclSendCommand( hpaio->deviceid, hpaio->scan_channelid,
+ SCL_CMD_SET_Y_POSITION,
+ MILLIMETERS_TO_DECIPIXELS( hpaio->effectiveTly ) );
+
+ SclSendCommand( hpaio->deviceid, hpaio->scan_channelid,
+ SCL_CMD_SET_X_EXTENT,
+ MILLIMETERS_TO_DECIPIXELS( hpaio->effectiveBrx -
+ hpaio->effectiveTlx ) );
+
+ SclSendCommand( hpaio->deviceid, hpaio->scan_channelid,
+ SCL_CMD_SET_Y_EXTENT,
+ MILLIMETERS_TO_DECIPIXELS( hpaio->effectiveBry -
+ hpaio->effectiveTly ) );
+
+ /* Download color map to OfficeJet Pro 11xx. */
+ if( hpaio->scl.compat & ( SCL_COMPAT_1150 | SCL_COMPAT_1170 ) )
+ {
+ SclSendCommand( hpaio->deviceid, hpaio->scan_channelid,
+ SCL_CMD_SET_DOWNLOAD_TYPE,
+ SCL_DOWNLOAD_TYPE_COLORMAP );
+
+ SclSendCommand( hpaio->deviceid, hpaio->scan_channelid,
+ SCL_CMD_DOWNLOAD_BINARY_DATA,
+ sizeof( hp11xxSeriesColorMap ) );
+
+ hpmud_write_channel(hpaio->deviceid, hpaio->scan_channelid, hp11xxSeriesColorMap, sizeof(hp11xxSeriesColorMap),
+ EXCEPTION_TIMEOUT, &bytes_wrote);
+ }
+
+ /* For OfficeJet R and PSC 500 series, set CCD resolution to 600
+ * for lineart. */
+ if( hpaio->scl.compat & SCL_COMPAT_R_SERIES &&
+ hpaio->currentScanMode == SCAN_MODE_LINEART )
+ {
+ SclSendCommand( hpaio->deviceid, hpaio->scan_channelid,
+ SCL_CMD_SET_CCD_RESOLUTION, 600 );
+ }
+
+ return SANE_STATUS_GOOD;
+}
+
+static SANE_Status hpaioAdvanceDocument(hpaioScanner_t hpaio)
+{
+ SANE_Status retcode = SANE_STATUS_GOOD;
+ int documentLoaded = 0;
+
+ DBG(8, "hpaioAdvanceDocument: papersource=%s batch=%d %s %d\n",
+ hpaio->currentAdfMode==ADF_MODE_FLATBED ? "FLATBED" : hpaio->currentAdfMode==ADF_MODE_AUTO ? "AUTO" : "ADF",
+ hpaio->currentBatchScan, __FILE__, __LINE__);
+
+ if (hpaio->currentAdfMode == ADF_MODE_FLATBED)
+ goto bugout; /* nothing to do */
+
+ /* If there is an ADF see if paper is loaded. */
+ if (hpaio->supportedAdfModes & ADF_MODE_ADF)
+ {
+ retcode = SclInquire(hpaio->deviceid, hpaio->scan_channelid, SCL_CMD_INQUIRE_DEVICE_PARAMETER,
+ SCL_INQ_ADF_DOCUMENT_LOADED, &documentLoaded, 0, 0);
+
+ if (retcode != SANE_STATUS_GOOD)
+ goto bugout;
+ }
+
+ /* If in Batch mode, by definition we are in ADF mode. */
+ if (hpaio->currentBatchScan && !documentLoaded)
+ {
+ retcode = SANE_STATUS_NO_DOCS;
+ goto bugout; /* no paper loaded */
+ }
+
+ /* If in Auto mode and no paper loaded use flatbed. */
+ if (hpaio->currentAdfMode == ADF_MODE_AUTO && !documentLoaded)
+ goto bugout; /* no paper loaded, use flatbed */
+
+ /* Assume ADF mode. */
+ if (documentLoaded || (hpaio->currentSideNumber == 2) )
+ {
+ if (hpaio->currentDuplex)
+ {
+ /* Duplex change document. */
+ if(hpaio->currentSideNumber == 2)
+ hpaio->currentSideNumber = 1;
+ else
+ hpaio->currentSideNumber = 2;
+
+ retcode=hpaioSclSendCommandCheckError(hpaio, SCL_CMD_CHANGE_DOCUMENT, SCL_CHANGE_DOC_DUPLEX);
+ }
+ else
+ {
+ /* Simplex change document. */
+ retcode = hpaioSclSendCommandCheckError(hpaio, SCL_CMD_CHANGE_DOCUMENT, SCL_CHANGE_DOC_SIMPLEX);
+ }
+ hpaio->currentPageNumber++;
+ }
+ else
+ retcode = SANE_STATUS_NO_DOCS;
+
+bugout:
+
+ DBG(8, "hpaioAdvanceDocument returns %d ADF-loaded=%d: %s %d\n", retcode, documentLoaded, __FILE__, __LINE__);
+
+ return retcode;
+}
+
+/******************************************************* SANE API *******************************************************/
+
+extern SANE_Status sane_hpaio_init(SANE_Int * pVersionCode, SANE_Auth_Callback authorize)
+{
+ int stat;
+
+ DBG_INIT();
+ InitDbus();
+
+ DBG(8, "sane_hpaio_init(): %s %d\n", __FILE__, __LINE__);
+
+ if( pVersionCode )
+ {
+ *pVersionCode = SANE_VERSION_CODE( 1, 0, 0 );
+ }
+ stat = SANE_STATUS_GOOD;
+
+ return stat;
+} /* sane_hpaio_init() */
+
+extern void sane_hpaio_exit(void)
+{
+ DBG(8, "sane_hpaio_exit(): %s %d\n", __FILE__, __LINE__);
+ ResetDeviceList(&DeviceList);
+}
+
+extern SANE_Status sane_hpaio_get_devices(const SANE_Device ***deviceList, SANE_Bool localOnly)
+{
+ DBG(8, "sane_hpaio_get_devices(local=%d): %s %d\n", localOnly, __FILE__, __LINE__);
+ ResetDeviceList(&DeviceList);
+ DevDiscovery(localOnly);
+ *deviceList = (const SANE_Device **)DeviceList;
+ return SANE_STATUS_GOOD;
+}
+
+extern SANE_Status sane_hpaio_open(SANE_String_Const devicename, SANE_Handle * pHandle)
+{
+ struct hpmud_model_attributes ma;
+ SANE_Status retcode = SANE_STATUS_INVAL;
+ hpaioScanner_t hpaio = 0;
+ int bytes_read;
+ char deviceIDString[LEN_DEVICE_ID_STRING];
+ char model[256];
+ int forceJpegForGrayAndColor = 0;
+ int force300dpiForLineart = 0;
+ int force300dpiForGrayscale = 0;
+ int supportsMfpdtf = 1;
+ int modularHardware = 0;
+ char devname[256];
+ enum HPMUD_RESULT stat;
+
+ /* Get device attributes and determine what backend to call. */
+ snprintf(devname, sizeof(devname)-1, "hp:%s", devicename); /* prepend "hp:" */
+ hpmud_query_model(devname, &ma);
+ DBG(8, "sane_hpaio_open(%s): %s %d scan_type=%d scansrc=%d\n", devicename, __FILE__, __LINE__, ma.scantype, ma.scansrc);
+
+ if ((ma.scantype == HPMUD_SCANTYPE_MARVELL) || (ma.scantype == HPMUD_SCANTYPE_MARVELL2))
+ return marvell_open(devicename, pHandle);
+ if (ma.scantype == HPMUD_SCANTYPE_SOAP)
+ return soap_open(devicename, pHandle);
+ if (ma.scantype == HPMUD_SCANTYPE_SOAPHT)
+ return soapht_open(devicename, pHandle);
+ if (ma.scantype == HPMUD_SCANTYPE_LEDM)
+ return ledm_open(devicename, pHandle);
+
+ hpaio = hpaioFindScanner(devicename);
+
+ if( hpaio )
+ {
+ goto done; /* reuse same device, why?? (des) */
+ }
+
+ hpaio = malloc( sizeof( struct hpaioScanner_s ) );
+
+ if( !hpaio )
+ {
+ retcode = SANE_STATUS_NO_MEM;
+ goto abort;
+ }
+
+ hpaioAddScanner( hpaio );
+
+ if( pHandle )
+ {
+ *pHandle = hpaio;
+ }
+
+ memset( hpaio, 0, sizeof( struct hpaioScanner_s ) );
+
+ hpaio->tag = "SCL-PML";
+
+ stat = hpmud_open_device(devname, ma.mfp_mode, &hpaio->deviceid);
+ strncpy(hpaio->deviceuri, devname, sizeof(hpaio->deviceuri));
+
+ if(stat != HPMUD_R_OK)
+ {
+ retcode = SANE_STATUS_IO_ERROR;
+ goto abort;
+ }
+
+ hpaio->scan_channelid = -1;
+ hpaio->cmd_channelid = -1;
+
+ // Set the duplex type supported
+ if (ma.scantype == HPMUD_SCANTYPE_SCL_DUPLEX)
+ hpaio->supportsDuplex = 1;
+ else
+ hpaio->supportsDuplex = 0;
+
+ /* Get the device ID string and initialize the SANE_Device structure. */
+ memset(deviceIDString, 0, sizeof(deviceIDString));
+
+ if(hpmud_get_device_id(hpaio->deviceid, deviceIDString, sizeof(deviceIDString), &bytes_read) != HPMUD_R_OK)
+ {
+ retcode = SANE_STATUS_INVAL;
+ goto abort;
+ }
+
+ DBG(6, "device ID string=<%s>: %s %d\n", deviceIDString, __FILE__, __LINE__);
+
+ hpaio->saneDevice.name = strdup( devicename );
+
+ hpaio->saneDevice.vendor = "Hewlett-Packard";
+
+ hpmud_get_model(deviceIDString, model, sizeof(model));
+
+ DBG(6, "Model = %s: %s %d\n", model, __FILE__, __LINE__);
+
+ hpaio->saneDevice.model = strdup(model);
+ hpaio->saneDevice.type = "multi-function peripheral";
+
+ /* Initialize option descriptors. */
+ hpaioSetupOptions( hpaio );
+ hpaio->currentSideNumber = 1;
+
+
+//BREAKPOINT;
+
+ /* Guess the command language (SCL or PML) based on the model string. */
+ if( UNDEFINED_MODEL( hpaio ) )
+ {
+ hpaio->scannerType = SCANNER_TYPE_SCL;
+ }
+ else if( strcasestr( hpaio->saneDevice.model, "laserjet" ) )
+ {
+ hpaio->scannerType = SCANNER_TYPE_PML;
+ hpaio->pml.openFirst = 1;
+
+ if( strcasecmp( hpaio->saneDevice.model, "HP_LaserJet_1100" ) == 0 )
+ {
+ hpaio->pml.dontResetBeforeNextNonBatchPage = 1;
+ }
+ else
+ {
+ hpaio->pml.startNextBatchPageEarly = 1;
+ }
+ }
+ else if( strcasecmp( hpaio->saneDevice.model, "OfficeJet" ) == 0 ||
+ strcasecmp( hpaio->saneDevice.model, "OfficeJet_LX" ) == 0 ||
+ strcasecmp( hpaio->saneDevice.model, "OfficeJet_Series_300" ) == 0 )
+ {
+ hpaio->scannerType = SCANNER_TYPE_PML;
+ hpaio->preDenali = 1;
+ }
+ else if( strcasecmp( hpaio->saneDevice.model, "OfficeJet_Series_500" ) == 0 ||
+ strcasecmp( hpaio->saneDevice.model, "All-in-One_IJP-V100" ) == 0 )
+ {
+ hpaio->scannerType = SCANNER_TYPE_PML;
+ hpaio->fromDenali = 1;
+ force300dpiForLineart = 1;
+ force300dpiForGrayscale = 1;
+ hpaio->defaultCompression[SCAN_MODE_LINEART] = COMPRESSION_MH;
+ hpaio->defaultCompression[SCAN_MODE_GRAYSCALE] = COMPRESSION_JPEG;
+ hpaio->defaultJpegCompressionFactor = SAFER_JPEG_COMPRESSION_FACTOR;
+ }
+ else if( strcasecmp( hpaio->saneDevice.model, "OfficeJet_Series_600" ) == 0 )
+ {
+ hpaio->scannerType = SCANNER_TYPE_PML;
+ hpaio->denali = 1;
+ forceJpegForGrayAndColor = 1;
+ force300dpiForLineart = 1;
+ hpaio->defaultCompression[SCAN_MODE_LINEART] = COMPRESSION_MH;
+ hpaio->defaultJpegCompressionFactor = SAFER_JPEG_COMPRESSION_FACTOR;
+ }
+ else if( strcasecmp( hpaio->saneDevice.model, "Printer/Scanner/Copier_300" ) == 0 )
+ {
+ hpaio->scannerType = SCANNER_TYPE_PML;
+ forceJpegForGrayAndColor = 1;
+ force300dpiForLineart = 1;
+ hpaio->defaultCompression[SCAN_MODE_LINEART] = COMPRESSION_MH;
+ hpaio->defaultJpegCompressionFactor = SAFER_JPEG_COMPRESSION_FACTOR;
+ }
+ else if( strcasecmp( hpaio->saneDevice.model, "OfficeJet_Series_700" ) == 0 )
+ {
+ hpaio->scannerType = SCANNER_TYPE_PML;
+ forceJpegForGrayAndColor = 1;
+ force300dpiForLineart = 1;
+ hpaio->defaultCompression[SCAN_MODE_LINEART] = COMPRESSION_MH;
+ hpaio->defaultJpegCompressionFactor = SAFER_JPEG_COMPRESSION_FACTOR;
+ }
+ else if( strcasecmp( hpaio->saneDevice.model, "OfficeJet_T_Series" ) == 0 )
+ {
+ hpaio->scannerType = SCANNER_TYPE_PML;
+ forceJpegForGrayAndColor = 1;
+ }
+ else
+ {
+ hpaio->scannerType = SCANNER_TYPE_SCL;
+ }
+
+ DBG(6, "Scanner type=%s: %s %d\n", hpaio->scannerType==0 ? "SCL" : "PML", __FILE__, __LINE__);
+
+ hpaioPmlAllocateObjects(hpaio); /* used by pml scanners and scl scanners */
+
+ if ((retcode = hpaioConnOpen(hpaio)) != SANE_STATUS_GOOD)
+ {
+ goto abort;
+ }
+
+ if ((retcode = hpaioResetScanner(hpaio)) != SANE_STATUS_GOOD)
+ {
+ goto abort;
+ }
+
+ /* Probing and setup for SCL scanners... */
+ if( hpaio->scannerType == SCANNER_TYPE_SCL )
+ {
+ SclSendCommand( hpaio->deviceid, hpaio->scan_channelid, SCL_CMD_CLEAR_ERROR_STACK, 0 );
+
+ /* Probe the SCL model. */
+ retcode = SclInquire( hpaio->deviceid,
+ hpaio->scan_channelid,
+ SCL_CMD_INQUIRE_DEVICE_PARAMETER,
+ SCL_INQ_HP_MODEL_11,
+ 0,
+ hpaio->scl.compat1150,
+ LEN_MODEL_RESPONSE );
+
+ if( retcode == SANE_STATUS_GOOD )
+ {
+ hpaio->scl.compat |= SCL_COMPAT_OFFICEJET;
+ }
+ else if( retcode != SANE_STATUS_UNSUPPORTED )
+ {
+ goto abort;
+ }
+ DBG(6, "scl.compat1150=<%s>: %s %d\n", hpaio->scl.compat1150, __FILE__, __LINE__);
+
+ retcode = SclInquire( hpaio->deviceid, hpaio->scan_channelid,
+ SCL_CMD_INQUIRE_DEVICE_PARAMETER,
+ SCL_INQ_HP_MODEL_12,
+ 0,
+ hpaio->scl.compatPost1150,
+ LEN_MODEL_RESPONSE );
+
+ if( retcode == SANE_STATUS_GOOD )
+ {
+ hpaio->scl.compat |= SCL_COMPAT_POST_1150;
+ }
+ else if( retcode != SANE_STATUS_UNSUPPORTED )
+ {
+ goto abort;
+ }
+ DBG(6, "scl.compatPost1150=<%s>: %s %d\n", hpaio->scl.compatPost1150, __FILE__, __LINE__);
+
+ if( !hpaio->scl.compat )
+ {
+ SET_DEFAULT_MODEL( hpaio, "(unknown scanner)" );
+ }
+ else if( hpaio->scl.compat == SCL_COMPAT_OFFICEJET )
+ {
+ hpaio->scl.compat |= SCL_COMPAT_1150;
+ SET_DEFAULT_MODEL( hpaio, "(OfficeJet 1150)" );
+ }
+ else if( !strcmp( hpaio->scl.compatPost1150, "5400A" ) )
+ {
+ hpaio->scl.compat |= SCL_COMPAT_1170;
+ SET_DEFAULT_MODEL( hpaio, "(OfficeJet 1170)" );
+ }
+ else if( !strcmp( hpaio->scl.compatPost1150, "5500A" ) )
+ {
+ hpaio->scl.compat |= SCL_COMPAT_R_SERIES;
+ SET_DEFAULT_MODEL( hpaio, "(OfficeJet R Series)" );
+ }
+ else if( !strcmp( hpaio->scl.compatPost1150, "5600A" ) )
+ {
+ hpaio->scl.compat |= SCL_COMPAT_G_SERIES;
+ SET_DEFAULT_MODEL( hpaio, "(OfficeJet G Series)" );
+ }
+ else if( !strcmp( hpaio->scl.compatPost1150, "5700A" ) )
+ {
+ hpaio->scl.compat |= SCL_COMPAT_K_SERIES;
+ SET_DEFAULT_MODEL( hpaio, "(OfficeJet K Series)" );
+ }
+ else if( !strcmp( hpaio->scl.compatPost1150, "5800A" ) )
+ {
+ hpaio->scl.compat |= SCL_COMPAT_D_SERIES;
+ SET_DEFAULT_MODEL( hpaio, "(OfficeJet D Series)" );
+ }
+ else if( !strcmp( hpaio->scl.compatPost1150, "5900A" ) )
+ {
+ hpaio->scl.compat |= SCL_COMPAT_6100_SERIES;
+ SET_DEFAULT_MODEL( hpaio, "(OfficeJet 6100 Series)" );
+ }
+ else
+ {
+ SET_DEFAULT_MODEL( hpaio, "(unknown OfficeJet)" );
+ }
+ DBG(6, "scl.compat=0x%4.4X: %s %d\n", hpaio->scl.compat, __FILE__, __LINE__);
+
+ /* Decide which position/extent unit to use. "Device pixels" works
+ * better on most models, but the 1150 requires "decipoints." */
+ if( hpaio->scl.compat & ( SCL_COMPAT_1150 ) )
+ {
+ hpaio->scl.decipixelChar = SCL_CHAR_DECIPOINTS;
+ hpaio->decipixelsPerInch = DECIPOINTS_PER_INCH;
+ }
+ else
+ {
+ hpaio->scl.decipixelChar = SCL_CHAR_DEVPIXELS;
+ hpaio->decipixelsPerInch = DEVPIXELS_PER_INCH;
+ /* Check for non-default decipixelsPerInch definition. */
+ SclInquire( hpaio->deviceid, hpaio->scan_channelid,
+ SCL_CMD_INQUIRE_DEVICE_PARAMETER,
+ SCL_INQ_DEVICE_PIXELS_PER_INCH,
+ &hpaio->decipixelsPerInch,
+ 0,
+ 0 );
+ }
+ DBG(6, "decipixelChar='%c', decipixelsPerInch=%d: %s %d\n", hpaio->scl.decipixelChar, hpaio->decipixelsPerInch, __FILE__, __LINE__);
+
+ /* Is MFPDTF supported? */
+ if( hpaioSclSendCommandCheckError( hpaio,
+ SCL_CMD_SET_MFPDTF,
+ SCL_MFPDTF_ON ) != SANE_STATUS_GOOD )
+ {
+ DBG(6, "Doesn't support MFPDTF: %s %d\n", __FILE__, __LINE__);
+ supportsMfpdtf = 0;
+ }
+
+ /* All scan modes are supported with no compression. */
+ hpaio->supportsScanMode[SCAN_MODE_LINEART] = COMPRESSION_NONE;
+ hpaio->supportsScanMode[SCAN_MODE_GRAYSCALE] = COMPRESSION_NONE;
+ hpaio->supportsScanMode[SCAN_MODE_COLOR] = COMPRESSION_NONE;
+
+ if( supportsMfpdtf )
+ {
+ if( hpaioSclSendCommandCheckError( hpaio,
+ SCL_CMD_SET_COMPRESSION,
+ SCL_COMPRESSION_JPEG ) == SANE_STATUS_GOOD )
+ {
+ hpaio->supportsScanMode[SCAN_MODE_GRAYSCALE] |= COMPRESSION_JPEG;
+ hpaio->supportsScanMode[SCAN_MODE_COLOR] |= COMPRESSION_JPEG;
+ }
+ }
+
+ /* Determine the minimum and maximum resolution.
+ * Probe for both X and Y, and pick largest min and smallest max.
+ * For the 1150, set min to 50 to prevent scan head crashes (<42). */
+ int minXRes, minYRes, maxXRes, maxYRes;
+ retcode = SclInquire( hpaio->deviceid, hpaio->scan_channelid,
+ SCL_CMD_INQUIRE_MINIMUM_VALUE,
+ SCL_CMD_SET_X_RESOLUTION,
+ &minXRes,
+ 0,
+ 0 );
+
+ DBG(6, "minXRes=%d retcode=%d\n",minXRes, retcode);
+
+ retcode = SclInquire( hpaio->deviceid, hpaio->scan_channelid,
+ SCL_CMD_INQUIRE_MINIMUM_VALUE,
+ SCL_CMD_SET_Y_RESOLUTION,
+ &minYRes,
+ 0,
+ 0 );
+
+ DBG(6,"minYRes=%d retcode=%d\n", minYRes, retcode);
+
+ retcode = SclInquire( hpaio->deviceid, hpaio->scan_channelid,
+ SCL_CMD_INQUIRE_MAXIMUM_VALUE,
+ SCL_CMD_SET_X_RESOLUTION,
+ &maxXRes,
+ 0,
+ 0 );
+
+ DBG(6,"maxXRes=%d retcode=%d\n", maxXRes, retcode);
+
+ retcode = SclInquire( hpaio->deviceid, hpaio->scan_channelid,
+ SCL_CMD_INQUIRE_MAXIMUM_VALUE,
+ SCL_CMD_SET_Y_RESOLUTION,
+ &maxYRes,
+ 0,
+ 0 );
+
+ DBG(6,"maxYRes=%d retcode=%d\n", maxYRes, retcode);
+
+ if( hpaio->scl.compat & SCL_COMPAT_1150 &&
+ minYRes < SCL_MIN_Y_RES_1150 )
+ {
+ minYRes = SCL_MIN_Y_RES_1150;
+ }
+ hpaio->scl.minRes = minXRes;
+ if( hpaio->scl.minRes < minYRes )
+ {
+ hpaio->scl.minRes = minYRes;
+ }
+
+ hpaio->resolutionRange.min = hpaio->scl.minRes;
+
+ hpaio->scl.maxRes = maxXRes;
+
+ if( hpaio->scl.maxRes > maxYRes )
+ {
+ hpaio->scl.maxRes = maxYRes;
+ }
+
+ if( hpaio->scl.compat & ( SCL_COMPAT_1150 | SCL_COMPAT_1170 )
+ && hpaio->scl.maxRes > SCL_MAX_RES_1150_1170 )
+ {
+ hpaio->scl.maxRes = SCL_MAX_RES_1150_1170;
+ }
+ hpaio->resolutionRange.max = hpaio->scl.maxRes;
+
+ /* Determine ADF/duplex capabilities. */
+ {
+ retcode = SclInquire( hpaio->deviceid, hpaio->scan_channelid,
+ SCL_CMD_INQUIRE_DEVICE_PARAMETER,
+ SCL_INQ_ADF_CAPABILITY,
+ &hpaio->scl.adfCapability,
+ 0,
+ 0 );
+
+ DBG(6, "ADF capability=%d retcode=%d: %s %d\n", hpaio->scl.adfCapability, retcode,__FILE__, __LINE__);
+
+ if (hpaio->scl.adfCapability)
+ {
+ retcode = SclInquire( hpaio->deviceid, hpaio->scan_channelid,
+ SCL_CMD_INQUIRE_MINIMUM_VALUE,
+ SCL_PSEUDO_ADF_X_RESOLUTION,
+ &minXRes,
+ 0,
+ 0 );
+ DBG(6, "minXResAdf=%d retcode=%d\n", minXRes, retcode);
+ retcode = SclInquire( hpaio->deviceid, hpaio->scan_channelid,
+ SCL_CMD_INQUIRE_MINIMUM_VALUE,
+ SCL_PSEUDO_ADF_Y_RESOLUTION,
+ &minYRes,
+ 0,
+ 0 );
+ DBG(6, "minYResAdf=%d retcode=%d\n", minYRes, retcode);
+ retcode = SclInquire( hpaio->deviceid, hpaio->scan_channelid,
+ SCL_CMD_INQUIRE_MAXIMUM_VALUE,
+ SCL_PSEUDO_ADF_X_RESOLUTION,
+ &maxXRes,
+ 0,
+ 0 );
+ DBG(6, "maxXResAdf=%d retcode=%d\n", maxXRes, retcode);
+ retcode = SclInquire( hpaio->deviceid, hpaio->scan_channelid,
+ SCL_CMD_INQUIRE_MAXIMUM_VALUE,
+ SCL_PSEUDO_ADF_Y_RESOLUTION,
+ &maxYRes,
+ 0,
+ 0 );
+ DBG(6, "maxYResAdf=%d retcode=%d\n", maxYRes, retcode);
+ if( hpaio->scl.compat & SCL_COMPAT_1150 &&
+ minYRes < SCL_MIN_Y_RES_1150 )
+ {
+ minYRes = SCL_MIN_Y_RES_1150;
+ }
+ hpaio->scl.minResAdf = minXRes;
+ if( hpaio->scl.minResAdf < minYRes )
+ {
+ hpaio->scl.minResAdf = minYRes;
+ }
+
+ hpaio->scl.maxResAdf = maxXRes;
+
+ if( hpaio->scl.maxResAdf > maxYRes )
+ {
+ hpaio->scl.maxResAdf = maxYRes;
+ }
+
+ if( hpaio->scl.compat & ( SCL_COMPAT_1150 | SCL_COMPAT_1170 )
+ && hpaio->scl.maxResAdf > SCL_MAX_RES_1150_1170 )
+ {
+ hpaio->scl.maxResAdf = SCL_MAX_RES_1150_1170;
+ }
+
+ }
+ if(ma.scansrc & HPMUD_SCANSRC_FLATBED)
+ {
+ hpaio->scl.flatbedCapability = 1;
+ hpaio->supportedAdfModes = ADF_MODE_FLATBED;
+ }
+ if (hpaio->scl.adfCapability)
+ {
+ if( hpaio->scl.compat & SCL_COMPAT_K_SERIES)
+ {
+ hpaio->supportedAdfModes |= ADF_MODE_ADF;
+ }
+ else
+ {
+ int supportedFunctions;
+
+ hpaio->supportedAdfModes |= ADF_MODE_ADF;
+ if (hpaio->scl.flatbedCapability)
+ hpaio->supportedAdfModes |= ADF_MODE_AUTO;
+
+ if( hpaio->scl.compat & ( SCL_COMPAT_1170 | SCL_COMPAT_R_SERIES |SCL_COMPAT_G_SERIES ) )
+ {
+ hpaio->scl.unloadAfterScan = 1;
+ }
+ if( PmlRequestGet( hpaio->deviceid, hpaio->cmd_channelid, hpaio->scl.objSupportedFunctions ) != ERROR &&
+ PmlGetIntegerValue( hpaio->scl.objSupportedFunctions,
+ 0,
+ &supportedFunctions ) != ERROR &&
+ supportedFunctions & PML_SUPPFUNC_DUPLEX )
+ {
+ hpaio->supportsDuplex = 1;
+ }
+ }
+ }
+ }
+
+ /* Determine maximum X and Y extents. */
+ SclInquire( hpaio->deviceid, hpaio->scan_channelid,
+ SCL_CMD_INQUIRE_MAXIMUM_VALUE,
+ SCL_CMD_SET_X_EXTENT,
+ &hpaio->scl.maxXExtent,
+ 0,
+ 0 );
+
+ SclInquire( hpaio->deviceid, hpaio->scan_channelid,
+ SCL_CMD_INQUIRE_MAXIMUM_VALUE,
+ SCL_CMD_SET_Y_EXTENT,
+ &hpaio->scl.maxYExtent,
+ 0,
+ 0 );
+
+ DBG(8, "Maximum extents: x=%d, y=%d %s %d\n", hpaio->scl.maxXExtent, hpaio->scl.maxYExtent, __FILE__, __LINE__);
+
+ hpaio->tlxRange.max = hpaio->brxRange.max = DECIPIXELS_TO_MILLIMETERS( hpaio->scl.maxXExtent );
+ hpaio->tlyRange.max = hpaio->bryRange.max = DECIPIXELS_TO_MILLIMETERS( hpaio->scl.maxYExtent );
+
+ /* Probing and setup for PML scanners... */
+ }
+ else /* if (hpaio->scannerType==SCANNER_TYPE_PML) */
+ {
+ int comps = 0;
+
+ hpaio->decipixelsPerInch = DECIPOINTS_PER_INCH;
+
+ /*ChannelSetSelectPollTimeout( hpaio->chan, &selectPollTimeout );
+
+ ChannelSetSelectPollCallback( hpaio->chan,
+ hpaioPmlSelectCallback,
+ hpaio );*/
+
+ /* Determine supported scan modes and compression settings. */
+ if( hpaio->preDenali )
+ {
+ comps |= COMPRESSION_MMR;
+ }
+
+ PmlSetIntegerValue( hpaio->pml.objCompression,
+ PML_TYPE_ENUMERATION,
+ PML_COMPRESSION_NONE );
+
+ if( PmlRequestSetRetry( hpaio->deviceid, hpaio->cmd_channelid,
+ hpaio->pml.objCompression, 0, 0 ) != ERROR )
+ {
+ comps |= COMPRESSION_NONE;
+ }
+
+ PmlSetIntegerValue( hpaio->pml.objCompression,
+ PML_TYPE_ENUMERATION,
+ PML_COMPRESSION_MH );
+
+ if( PmlRequestSetRetry( hpaio->deviceid, hpaio->cmd_channelid,
+ hpaio->pml.objCompression, 0, 0 ) != ERROR )
+ {
+ comps |= COMPRESSION_MH;
+ }
+
+ PmlSetIntegerValue( hpaio->pml.objCompression,
+ PML_TYPE_ENUMERATION,
+ PML_COMPRESSION_MR );
+
+ if( PmlRequestSetRetry( hpaio->deviceid, hpaio->cmd_channelid,
+ hpaio->pml.objCompression, 0, 0 ) != ERROR )
+ {
+ comps |= COMPRESSION_MR;
+ }
+
+ PmlSetIntegerValue( hpaio->pml.objCompression,
+ PML_TYPE_ENUMERATION,
+ PML_COMPRESSION_MMR );
+
+ if( PmlRequestSetRetry( hpaio->deviceid, hpaio->cmd_channelid,
+ hpaio->pml.objCompression, 0, 0 ) != ERROR )
+ {
+ comps |= COMPRESSION_MMR;
+ }
+
+ PmlSetIntegerValue( hpaio->pml.objPixelDataType,
+ PML_TYPE_ENUMERATION,
+ PML_DATA_TYPE_LINEART );
+
+ if( PmlRequestSetRetry( hpaio->deviceid, hpaio->cmd_channelid,
+ hpaio->pml.objPixelDataType, 0, 0 ) != ERROR )
+ {
+ hpaio->supportsScanMode[SCAN_MODE_LINEART] = comps;
+ }
+ comps &= COMPRESSION_NONE;
+
+ if( forceJpegForGrayAndColor )
+ {
+ comps = 0;
+ }
+
+ PmlSetIntegerValue( hpaio->pml.objCompression,
+ PML_TYPE_ENUMERATION,
+ PML_COMPRESSION_JPEG );
+
+ if( PmlRequestSetRetry( hpaio->deviceid, hpaio->cmd_channelid,
+ hpaio->pml.objCompression, 0, 0 ) != ERROR )
+ {
+ comps |= COMPRESSION_JPEG;
+ }
+
+ PmlSetIntegerValue( hpaio->pml.objPixelDataType,
+ PML_TYPE_ENUMERATION,
+ PML_DATA_TYPE_GRAYSCALE );
+
+ if( PmlRequestSetRetry( hpaio->deviceid, hpaio->cmd_channelid,
+ hpaio->pml.objPixelDataType, 0, 0 ) != ERROR )
+ {
+ hpaio->supportsScanMode[SCAN_MODE_GRAYSCALE] = comps;
+ }
+
+ PmlSetIntegerValue( hpaio->pml.objPixelDataType,
+ PML_TYPE_ENUMERATION,
+ PML_DATA_TYPE_COLOR );
+
+ if( PmlRequestSetRetry( hpaio->deviceid, hpaio->cmd_channelid,
+ hpaio->pml.objPixelDataType, 0, 0 ) != ERROR )
+ {
+ hpaio->supportsScanMode[SCAN_MODE_COLOR] = comps;
+ }
+
+ /* Determine supported resolutions. */
+ NumListClear( hpaio->resolutionList );
+ NumListClear( hpaio->lineartResolutionList );
+
+ if( hpaio->preDenali )
+ {
+ NumListAdd( hpaio->lineartResolutionList, 200 );
+ if( !strcmp( hpaio->saneDevice.model, "OfficeJet_Series_300" ) )
+ {
+ NumListAdd( hpaio->lineartResolutionList, 300 );
+ }
+ hpaio->option[OPTION_SCAN_RESOLUTION].constraint_type = SANE_CONSTRAINT_WORD_LIST;
+ }
+ else if( PmlRequestGet( hpaio->deviceid, hpaio->cmd_channelid,
+ hpaio->pml.objResolutionRange ) == ERROR )
+ {
+pmlDefaultResRange:
+ /* TODO: What are the correct X and Y resolution ranges
+ * for the OfficeJet T series? */
+ hpaio->resolutionRange.min = 75;
+ hpaio->resolutionRange.max = 600;
+ }
+ else
+ {
+ char resList[PML_MAX_VALUE_LEN + 1];
+ int i, len, res, consumed;
+
+ PmlGetStringValue( hpaio->pml.objResolutionRange,
+ 0,
+ resList,
+ PML_MAX_VALUE_LEN );
+
+ resList[PML_MAX_VALUE_LEN] = 0;
+ len = strlen( resList );
+
+ /* Parse "(100)x(100),(150)x(150),(200)x(200),(300)x(300)".
+ * This isn't quite the right way to do it, but it'll do. */
+ for( i = 0; i < len; )
+ {
+ if( resList[i] < '0' || resList[i] > '9' )
+ {
+ i++;
+ continue;
+ }
+ if( sscanf( resList + i, "%d%n", &res, &consumed ) != 1 )
+ {
+ break;
+ }
+ i += consumed;
+ if( !force300dpiForGrayscale || res >= 300 )
+ {
+ NumListAdd( hpaio->resolutionList, res );
+ }
+ if( !force300dpiForLineart || res >= 300 )
+ {
+ NumListAdd( hpaio->lineartResolutionList, res );
+ }
+ }
+
+ if( !NumListGetCount( hpaio->resolutionList ) )
+ {
+ goto pmlDefaultResRange;
+ }
+ hpaio->option[OPTION_SCAN_RESOLUTION].constraint_type = SANE_CONSTRAINT_WORD_LIST;
+ }
+
+ /* Determine contrast support. (Removed, no LJ support, des 7/31/07) */
+// if( PmlRequestGet(hpaio->deviceid, hpaio->cmd_channelid, hpaio->pml.objContrast) != ERROR)
+// {
+// hpaio->option[OPTION_CONTRAST].cap &= ~SANE_CAP_INACTIVE;
+// }
+
+ /* Determine supported ADF modes. */
+ if(PmlRequestGet(hpaio->deviceid, hpaio->cmd_channelid, hpaio->pml.objModularHardware) != ERROR &&
+ PmlGetIntegerValue(hpaio->pml.objModularHardware, 0, &modularHardware) != ERROR)
+ {
+ hpaio->pml.flatbedCapability = 1;
+
+ DBG(6, "Valid PML modularHardware object value=%x: %s %d\n", modularHardware, __FILE__, __LINE__);
+
+ /* LJ3200 does not report ADF mode, so we force it. DES 8/5/08 */
+ if (strncasecmp(model, "hp_laserjet_3200", 16) == 0)
+ modularHardware = PML_MODHW_ADF;
+
+ if(modularHardware & PML_MODHW_ADF)
+ hpaio->supportedAdfModes = ADF_MODE_AUTO | ADF_MODE_ADF;
+ else
+ hpaio->supportedAdfModes = ADF_MODE_FLATBED;
+ }
+ else
+ {
+ DBG(6, "No valid PML modularHardware object, default to ADF and AUTO support: %s %d\n", __FILE__, __LINE__);
+ hpaio->supportedAdfModes = ADF_MODE_AUTO | ADF_MODE_ADF;
+ }
+ hpaio->supportsDuplex = 0;
+
+ hpaio->tlxRange.max = hpaio->brxRange.max = INCHES_TO_MILLIMETERS( PML_MAX_WIDTH_INCHES );
+ hpaio->tlyRange.max = hpaio->bryRange.max = INCHES_TO_MILLIMETERS( PML_MAX_HEIGHT_INCHES );
+
+ } /* if( hpaio->scannerType == SCANNER_TYPE_SCL ) */
+
+ /* Allocate MFPDTF parser if supported. */
+ if( supportsMfpdtf )
+ {
+ hpaio->mfpdtf = MfpdtfAllocate( hpaio->deviceid, hpaio->scan_channelid );
+ MfpdtfSetChannel( hpaio->mfpdtf, hpaio->scan_channelid );
+
+ if( hpaio->preDenali )
+ {
+ MfpdtfReadSetSimulateImageHeaders( hpaio->mfpdtf, 1 );
+ }
+ }
+
+done:
+ /* Finish setting up option descriptors. */
+ hpaioUpdateDescriptors( hpaio, OPTION_FIRST );
+
+ if( pHandle )
+ {
+ *pHandle = hpaio;
+ }
+ //ptalDeviceSetAppInfo( dev, hpaio );
+ retcode = SANE_STATUS_GOOD;
+
+abort:
+ if( hpaio )
+ {
+ hpaioConnClose( hpaio );
+ }
+ if( retcode != SANE_STATUS_GOOD )
+ {
+ if( hpaio )
+ {
+ if( hpaio->saneDevice.name )
+ {
+ free( ( void * ) hpaio->saneDevice.name );
+ }
+ if( hpaio->saneDevice.model )
+ {
+ free( ( void * ) hpaio->saneDevice.model );
+ }
+ free( hpaio );
+ }
+ }
+ return retcode;
+} /* sane_hpaio_open() */
+
+extern void sane_hpaio_close(SANE_Handle handle)
+{
+ hpaioScanner_t hpaio = (hpaioScanner_t) handle;
+
+ if (strcmp(*((char **)handle), "MARVELL") == 0)
+ return marvell_close(handle);
+ if (strcmp(*((char **)handle), "SOAP") == 0)
+ return soap_close(handle);
+ if (strcmp(*((char **)handle), "SOAPHT") == 0)
+ return soapht_close(handle);
+ if (strcmp(*((char **)handle), "LEDM") == 0)
+ return ledm_close(handle);
+
+ DBG(8, "sane_hpaio_close(): %s %d\n", __FILE__, __LINE__);
+
+ hpaioPmlDeallocateObjects(hpaio);
+
+ /* ADF may leave channel(s) open. */
+ if (hpaio->cmd_channelid > 0)
+ hpaioConnEndScan(hpaio);
+
+ if (hpaio->deviceid > 0)
+ {
+ hpmud_close_device(hpaio->deviceid);
+ hpaio->deviceid = -1;
+ }
+
+ /* free hpaio object?? (des) */
+} /* sane_hpaio_close() */
+
+extern const SANE_Option_Descriptor * sane_hpaio_get_option_descriptor(SANE_Handle handle, SANE_Int option)
+{
+ hpaioScanner_t hpaio = ( hpaioScanner_t ) handle;
+
+ if (strcmp(*((char **)handle), "MARVELL") == 0)
+ return marvell_get_option_descriptor(handle, option);
+ if (strcmp(*((char **)handle), "SOAP") == 0)
+ return soap_get_option_descriptor(handle, option);
+ if (strcmp(*((char **)handle), "SOAPHT") == 0)
+ return soapht_get_option_descriptor(handle, option);
+ if (strcmp(*((char **)handle), "LEDM") == 0)
+ return ledm_get_option_descriptor(handle, option);
+
+ DBG(8, "sane_hpaio_get_option_descriptor(option=%s): %s %d\n", hpaio->option[option].name, __FILE__, __LINE__);
+
+ if( option < 0 || option >= OPTION_LAST )
+ {
+ return 0;
+ }
+
+ return &hpaio->option[option];
+} /* sane_hpaio_get_option_descriptor() */
+
+extern SANE_Status sane_hpaio_control_option(SANE_Handle handle, SANE_Int option, SANE_Action action, void * pValue, SANE_Int * pInfo )
+{
+ hpaioScanner_t hpaio = ( hpaioScanner_t ) handle;
+ SANE_Int _info;
+ SANE_Int * pIntValue = pValue;
+ SANE_String pStrValue = pValue;
+ SANE_Status retcode;
+ char sz[64];
+
+ if (strcmp(*((char **)handle), "MARVELL") == 0)
+ return marvell_control_option(handle, option, action, pValue, pInfo);
+ if (strcmp(*((char **)handle), "SOAP") == 0)
+ return soap_control_option(handle, option, action, pValue, pInfo);
+ if (strcmp(*((char **)handle), "SOAPHT") == 0)
+ return soapht_control_option(handle, option, action, pValue, pInfo);
+ if (strcmp(*((char **)handle), "LEDM") == 0)
+ return ledm_control_option(handle, option, action, pValue, pInfo);
+
+ if( !pInfo )
+ {
+ pInfo = &_info;
+ }
+
+ switch( action )
+ {
+ case SANE_ACTION_GET_VALUE:
+ switch( option )
+ {
+ case OPTION_NUM_OPTIONS:
+ *pIntValue = OPTION_LAST;
+ break;
+
+ case OPTION_SCAN_MODE:
+ switch( hpaio->currentScanMode )
+ {
+ case SCAN_MODE_LINEART:
+ strcpy( pStrValue, SANE_VALUE_SCAN_MODE_LINEART );
+ break;
+ case SCAN_MODE_GRAYSCALE:
+ strcpy( pStrValue, SANE_VALUE_SCAN_MODE_GRAY );
+ break;
+ case SCAN_MODE_COLOR:
+ strcpy( pStrValue, SANE_VALUE_SCAN_MODE_COLOR );
+ break;
+ default:
+ strcpy( pStrValue, STR_UNKNOWN );
+ break;
+ }
+ break;
+
+ case OPTION_SCAN_RESOLUTION:
+ *pIntValue = hpaio->currentResolution;
+ break;
+
+ case OPTION_CONTRAST:
+ *pIntValue = hpaio->currentContrast;
+ break;
+
+ case OPTION_COMPRESSION:
+ switch( hpaio->currentCompression )
+ {
+ case COMPRESSION_NONE:
+ strcpy( pStrValue, STR_COMPRESSION_NONE );
+ break;
+ case COMPRESSION_MH:
+ strcpy( pStrValue, STR_COMPRESSION_MH );
+ break;
+ case COMPRESSION_MR:
+ strcpy( pStrValue, STR_COMPRESSION_MR );
+ break;
+ case COMPRESSION_MMR:
+ strcpy( pStrValue, STR_COMPRESSION_MMR );
+ break;
+ case COMPRESSION_JPEG:
+ strcpy( pStrValue, STR_COMPRESSION_JPEG );
+ break;
+ default:
+ strcpy( pStrValue, STR_UNKNOWN );
+ break;
+ }
+ break;
+
+ case OPTION_JPEG_COMPRESSION_FACTOR:
+ *pIntValue = hpaio->currentJpegCompressionFactor;
+ break;
+
+ case OPTION_BATCH_SCAN:
+ *pIntValue = hpaio->currentBatchScan;
+ break;
+
+ case OPTION_ADF_MODE:
+ switch( hpaio->currentAdfMode )
+ {
+ case ADF_MODE_AUTO:
+ strcpy( pStrValue, STR_ADF_MODE_AUTO );
+ break;
+ case ADF_MODE_FLATBED:
+ strcpy( pStrValue, STR_ADF_MODE_FLATBED );
+ break;
+ case ADF_MODE_ADF:
+ strcpy( pStrValue, STR_ADF_MODE_ADF );
+ break;
+ default:
+ strcpy( pStrValue, STR_UNKNOWN );
+ break;
+ }
+ break;
+#if 1
+ case OPTION_DUPLEX:
+ *pIntValue = hpaio->currentDuplex;
+ break;
+#endif
+ case OPTION_LENGTH_MEASUREMENT:
+ switch( hpaio->currentLengthMeasurement )
+ {
+ case LENGTH_MEASUREMENT_UNKNOWN:
+ strcpy( pStrValue, STR_LENGTH_MEASUREMENT_UNKNOWN );
+ break;
+ case LENGTH_MEASUREMENT_UNLIMITED:
+ strcpy( pStrValue,
+ STR_LENGTH_MEASUREMENT_UNLIMITED );
+ break;
+ case LENGTH_MEASUREMENT_APPROXIMATE:
+ strcpy( pStrValue,
+ STR_LENGTH_MEASUREMENT_APPROXIMATE );
+ break;
+ case LENGTH_MEASUREMENT_PADDED:
+ strcpy( pStrValue, STR_LENGTH_MEASUREMENT_PADDED );
+ break;
+ case LENGTH_MEASUREMENT_EXACT:
+ strcpy( pStrValue, STR_LENGTH_MEASUREMENT_EXACT );
+ break;
+ default:
+ strcpy( pStrValue, STR_UNKNOWN );
+ break;
+ }
+ break;
+
+ case OPTION_TL_X:
+ *pIntValue = hpaio->currentTlx;
+ break;
+
+ case OPTION_TL_Y:
+ *pIntValue = hpaio->currentTly;
+ break;
+
+ case OPTION_BR_X:
+ *pIntValue = hpaio->currentBrx;
+ break;
+
+ case OPTION_BR_Y:
+ *pIntValue = hpaio->currentBry;
+ break;
+
+ default:
+ return SANE_STATUS_INVAL;
+ }
+ break;
+
+ case SANE_ACTION_SET_VALUE:
+ if( hpaio->option[option].cap & SANE_CAP_INACTIVE )
+ {
+ return SANE_STATUS_INVAL;
+ }
+ switch( option )
+ {
+ case OPTION_SCAN_MODE:
+ if( !strcasecmp( pStrValue, SANE_VALUE_SCAN_MODE_LINEART ) &&
+ hpaio->supportsScanMode[SCAN_MODE_LINEART] )
+ {
+ hpaio->currentScanMode = SCAN_MODE_LINEART;
+ break;
+ }
+ if( !strcasecmp( pStrValue, SANE_VALUE_SCAN_MODE_GRAY ) &&
+ hpaio->supportsScanMode[SCAN_MODE_GRAYSCALE] )
+ {
+ hpaio->currentScanMode = SCAN_MODE_GRAYSCALE;
+ break;
+ }
+ if( !strcasecmp( pStrValue, SANE_VALUE_SCAN_MODE_COLOR ) &&
+ hpaio->supportsScanMode[SCAN_MODE_COLOR] )
+ {
+ hpaio->currentScanMode = SCAN_MODE_COLOR;
+ break;
+ }
+ return SANE_STATUS_INVAL;
+
+ case OPTION_SCAN_RESOLUTION:
+ if( ( hpaio->option[option].constraint_type ==
+ SANE_CONSTRAINT_WORD_LIST &&
+ !NumListIsInList( ( SANE_Int * )hpaio->option[option].constraint.word_list, *pIntValue ) ) ||
+ ( hpaio->option[option].constraint_type == SANE_CONSTRAINT_RANGE &&
+ ( *pIntValue<hpaio->resolutionRange.min ||
+ *pIntValue>hpaio->resolutionRange.max ) ) )
+ {
+ return SANE_STATUS_INVAL;
+ }
+ hpaio->currentResolution = *pIntValue;
+ break;
+
+ case OPTION_CONTRAST:
+ if( *pIntValue<hpaio->contrastRange.min ||
+ *pIntValue>hpaio->contrastRange.max )
+ {
+ return SANE_STATUS_INVAL;
+ }
+ hpaio->currentContrast = *pIntValue;
+ break;
+
+ case OPTION_COMPRESSION:
+ {
+ int supportedCompression = hpaio->supportsScanMode[hpaio->currentScanMode];
+ if( !strcasecmp( pStrValue, STR_COMPRESSION_NONE ) &&
+ supportedCompression & COMPRESSION_NONE )
+ {
+ hpaio->currentCompression = COMPRESSION_NONE;
+ break;
+ }
+ if( !strcasecmp( pStrValue, STR_COMPRESSION_MH ) &&
+ supportedCompression & COMPRESSION_MH )
+ {
+ hpaio->currentCompression = COMPRESSION_MH;
+ break;
+ }
+ if( !strcasecmp( pStrValue, STR_COMPRESSION_MR ) &&
+ supportedCompression & COMPRESSION_MR )
+ {
+ hpaio->currentCompression = COMPRESSION_MR;
+ break;
+ }
+ if( !strcasecmp( pStrValue, STR_COMPRESSION_MMR ) &&
+ supportedCompression & COMPRESSION_MMR )
+ {
+ hpaio->currentCompression = COMPRESSION_MMR;
+ break;
+ }
+ if( !strcasecmp( pStrValue, STR_COMPRESSION_JPEG ) &&
+ supportedCompression & COMPRESSION_JPEG )
+ {
+ hpaio->currentCompression = COMPRESSION_JPEG;
+ break;
+ }
+ return SANE_STATUS_INVAL;
+ }
+
+ case OPTION_JPEG_COMPRESSION_FACTOR:
+ if( *pIntValue<MIN_JPEG_COMPRESSION_FACTOR ||
+ *pIntValue>MAX_JPEG_COMPRESSION_FACTOR )
+ {
+ return SANE_STATUS_INVAL;
+ }
+ hpaio->currentJpegCompressionFactor = *pIntValue;
+ break;
+
+ case OPTION_BATCH_SCAN:
+ if( *pIntValue != SANE_FALSE && *pIntValue != SANE_TRUE )
+ {
+ return SANE_STATUS_INVAL;
+ }
+ hpaio->currentBatchScan = *pIntValue;
+ break;
+
+ case OPTION_ADF_MODE:
+ if( !strcasecmp( pStrValue, STR_ADF_MODE_AUTO ) &&
+ hpaio->supportedAdfModes & ADF_MODE_AUTO )
+ {
+ hpaio->currentAdfMode = ADF_MODE_AUTO;
+ break;
+ }
+ if( !strcasecmp( pStrValue, STR_ADF_MODE_FLATBED ) &&
+ hpaio->supportedAdfModes & ADF_MODE_FLATBED )
+ {
+ hpaio->currentAdfMode = ADF_MODE_FLATBED;
+ break;
+ }
+ if( !strcasecmp( pStrValue, STR_ADF_MODE_ADF ) &&
+ hpaio->supportedAdfModes & ADF_MODE_ADF )
+ {
+ hpaio->currentAdfMode = ADF_MODE_ADF;
+ break;
+ }
+ return SANE_STATUS_INVAL;
+#if 1
+ case OPTION_DUPLEX:
+ if( *pIntValue != SANE_FALSE && *pIntValue != SANE_TRUE )
+ {
+ return SANE_STATUS_INVAL;
+ }
+ hpaio->currentDuplex = *pIntValue;
+ break;
+#endif
+ case OPTION_LENGTH_MEASUREMENT:
+ if( !strcasecmp( pStrValue,
+ STR_LENGTH_MEASUREMENT_UNKNOWN ) )
+ {
+ hpaio->currentLengthMeasurement = LENGTH_MEASUREMENT_UNKNOWN;
+ break;
+ }
+ if( !strcasecmp( pStrValue,
+ STR_LENGTH_MEASUREMENT_UNLIMITED ) )
+ {
+ if( hpaio->scannerType != SCANNER_TYPE_PML )
+ {
+ return SANE_STATUS_INVAL;
+ }
+ hpaio->currentLengthMeasurement = LENGTH_MEASUREMENT_UNLIMITED;
+ break;
+ }
+ if( !strcasecmp( pStrValue,
+ STR_LENGTH_MEASUREMENT_APPROXIMATE ) )
+ {
+ hpaio->currentLengthMeasurement = LENGTH_MEASUREMENT_APPROXIMATE;
+ break;
+ }
+ if( !strcasecmp( pStrValue, STR_LENGTH_MEASUREMENT_PADDED ) )
+ {
+ hpaio->currentLengthMeasurement = LENGTH_MEASUREMENT_PADDED;
+ break;
+ }
+ if( !strcasecmp( pStrValue, STR_LENGTH_MEASUREMENT_EXACT ) )
+ {
+ hpaio->currentLengthMeasurement = LENGTH_MEASUREMENT_EXACT;
+ break;
+ }
+ return SANE_STATUS_INVAL;
+
+ case OPTION_TL_X:
+ if( *pIntValue<hpaio->tlxRange.min ||
+ *pIntValue>hpaio->tlxRange.max )
+ {
+ return SANE_STATUS_INVAL;
+ }
+ hpaio->currentTlx = *pIntValue;
+ break;
+
+ case OPTION_TL_Y:
+ if( *pIntValue<hpaio->tlyRange.min ||
+ *pIntValue>hpaio->tlyRange.max )
+ {
+ return SANE_STATUS_INVAL;
+ }
+ hpaio->currentTly = *pIntValue;
+ break;
+
+ case OPTION_BR_X:
+ if( *pIntValue<hpaio->brxRange.min ||
+ *pIntValue>hpaio->brxRange.max )
+ {
+ return SANE_STATUS_INVAL;
+ }
+ hpaio->currentBrx = *pIntValue;
+ break;
+
+ case OPTION_BR_Y:
+ if( *pIntValue<hpaio->bryRange.min ||
+ *pIntValue>hpaio->bryRange.max )
+ {
+ return SANE_STATUS_INVAL;
+ }
+ hpaio->currentBry = *pIntValue;
+ break;
+
+ default:
+ return SANE_STATUS_INVAL;
+ }
+ goto reload;
+
+ case SANE_ACTION_SET_AUTO:
+ retcode = hpaioSetDefaultValue( hpaio, option );
+ if( retcode != SANE_STATUS_GOOD )
+ {
+ return retcode;
+ }
+ reload : *pInfo = hpaioUpdateDescriptors( hpaio, option );
+ break;
+
+ default:
+ return SANE_STATUS_INVAL;
+ }
+
+ DBG(8, "sane_hpaio_control_option (option=%s action=%s value=%s): %s %d\n", hpaio->option[option].name,
+ action==SANE_ACTION_GET_VALUE ? "get" : action==SANE_ACTION_SET_VALUE ? "set" : "auto",
+ pValue ? hpaio->option[option].type == SANE_TYPE_STRING ? (char *)pValue : psnprintf(sz, sizeof(sz), "%d", *(int *)pValue) : "na", __FILE__, __LINE__);
+
+ return SANE_STATUS_GOOD;
+} /* sane_hpaio_control_option() */
+
+extern SANE_Status sane_hpaio_get_parameters(SANE_Handle handle, SANE_Parameters *pParams)
+{
+ hpaioScanner_t hpaio = ( hpaioScanner_t ) handle;
+ char *s = "";
+
+ if (strcmp(*((char **)handle), "MARVELL") == 0)
+ return marvell_get_parameters(handle, pParams);
+ if (strcmp(*((char **)handle), "SOAP") == 0)
+ return soap_get_parameters(handle, pParams);
+ if (strcmp(*((char **)handle), "SOAPHT") == 0)
+ return soapht_get_parameters(handle, pParams);
+ if (strcmp(*((char **)handle), "LEDM") == 0)
+ return ledm_get_parameters(handle, pParams);
+
+ if( !hpaio->hJob )
+ {
+ *pParams = hpaio->prescanParameters;
+ s = "pre";
+ }
+ else
+ {
+ *pParams = hpaio->scanParameters;
+ }
+ DBG(8, "sane_hpaio_get_parameters(%sscan): format=%d, last_frame=%d, lines=%d, depth=%d, pixels_per_line=%d, bytes_per_line=%d %s %d\n",
+ s, pParams->format, pParams->last_frame, pParams->lines, pParams->depth, pParams->pixels_per_line, pParams->bytes_per_line, __FILE__, __LINE__);
+
+ return SANE_STATUS_GOOD;
+} /* sane_hpaio_get_parameters() */
+
+extern SANE_Status sane_hpaio_start(SANE_Handle handle)
+{
+ hpaioScanner_t hpaio = ( hpaioScanner_t ) handle;
+ SANE_Status retcode;
+ IP_IMAGE_TRAITS traits;
+ IP_XFORM_SPEC xforms[IP_MAX_XFORMS], * pXform = xforms;
+ WORD wResult;
+
+ DBG(8, "sane_hpaio_start(): %s %d deviceuri=%s\n", __FILE__, __LINE__, hpaio->deviceuri);
+
+ if (strcmp(*((char **)handle), "MARVELL") == 0)
+ return marvell_start(handle);
+ if (strcmp(*((char **)handle), "SOAP") == 0)
+ return soap_start(handle);
+ if (strcmp(*((char **)handle), "SOAPHT") == 0)
+ return soapht_start(handle);
+ if (strcmp(*((char **)handle), "LEDM") == 0)
+ return ledm_start(handle);
+
+ hpaio->user_cancel = FALSE;
+
+ hpaio->endOfData = 0;
+
+ if (hpaio->scannerType==SCANNER_TYPE_PML)
+ return pml_start(hpaio);
+
+ /* TODO: convert to scl_start. des */
+
+ /* If we just scanned the last page of a batch scan, then return the obligatory SANE_STATUS_NO_DOCS condition. */
+ if( hpaio->noDocsConditionPending )
+ {
+ hpaio->noDocsConditionPending = 0;
+ retcode = SANE_STATUS_NO_DOCS;
+ goto abort;
+ }
+ /* Open scanner command channel. */
+ retcode = hpaioConnPrepareScan( hpaio );
+
+ if( retcode != SANE_STATUS_GOOD )
+ {
+ goto abort;
+ }
+ /* Change document if needed. */
+ hpaio->beforeScan = 1;
+ retcode = hpaioAdvanceDocument( hpaio );
+ hpaio->beforeScan = 0;
+
+ if( retcode != SANE_STATUS_GOOD )
+ {
+ goto abort;
+ }
+
+ /* Program options. */
+ retcode = hpaioProgramOptions( hpaio );
+
+ if( retcode != SANE_STATUS_GOOD )
+ {
+ goto abort;
+ }
+
+ hpaio->scanParameters = hpaio->prescanParameters;
+ memset( xforms, 0, sizeof( xforms ) );
+ traits.iPixelsPerRow = -1;
+
+ switch( hpaio->effectiveScanMode )
+ {
+ case SCAN_MODE_LINEART:
+ hpaio->scanParameters.format = SANE_FRAME_GRAY;
+ hpaio->scanParameters.depth = 1;
+ traits.iBitsPerPixel = 1;
+ break;
+ case SCAN_MODE_GRAYSCALE:
+ hpaio->scanParameters.format = SANE_FRAME_GRAY;
+ hpaio->scanParameters.depth = 8;
+ traits.iBitsPerPixel = 8;
+ break;
+ case SCAN_MODE_COLOR:
+ default:
+ hpaio->scanParameters.format = SANE_FRAME_RGB;
+ hpaio->scanParameters.depth = 8;
+ traits.iBitsPerPixel = 24;
+ break;
+ }
+ traits.lHorizDPI = hpaio->effectiveResolution << 16;
+ traits.lVertDPI = hpaio->effectiveResolution << 16;
+ traits.lNumRows = -1;
+ traits.iNumPages = 1;
+ traits.iPageNum = 1;
+
+ // if( hpaio->scannerType == SCANNER_TYPE_SCL )
+ // {
+ int lines, pixelsPerLine;
+
+ /* Inquire exact image dimensions. */
+ if( SclInquire( hpaio->deviceid, hpaio->scan_channelid, SCL_CMD_INQUIRE_DEVICE_PARAMETER, SCL_INQ_NUMBER_OF_SCAN_LINES,
+ &lines, 0, 0 ) == SANE_STATUS_GOOD )
+ {
+ traits.lNumRows = lines;
+ }
+ SclInquire( hpaio->deviceid, hpaio->scan_channelid, SCL_CMD_INQUIRE_DEVICE_PARAMETER, SCL_INQ_PIXELS_PER_SCAN_LINE,
+ &pixelsPerLine, 0, 0 );
+
+ traits.iPixelsPerRow = pixelsPerLine;
+
+ SclSendCommand( hpaio->deviceid, hpaio->scan_channelid, SCL_CMD_CLEAR_ERROR_STACK, 0 );
+
+ /* Start scanning. */
+ SclSendCommand( hpaio->deviceid, hpaio->scan_channelid, SCL_CMD_SCAN_WINDOW, 0 );
+
+ if( hpaio->mfpdtf )
+ {
+ MfpdtfSetChannel( hpaio->mfpdtf, hpaio->scan_channelid );
+
+ //MfpdtfReadSetTimeout( hpaio->mfpdtf, MFPDTF_EARLY_READ_TIMEOUT );
+ MfpdtfReadStart( hpaio->mfpdtf ); /* inits mfpdtf */
+
+#ifdef HPAIO_DEBUG
+ int log_output=1;
+#else
+ int log_output=0;
+#endif
+
+ if( log_output )
+ {
+ char f[256];
+ static int cnt=0;
+
+ sprintf(f, "/tmp/mfpdtf_%d.out", cnt++);
+
+ bug("saving raw image to %s \n", f);
+
+ MfpdtfLogToFile( hpaio->mfpdtf, f );
+ }
+
+ while( 1 )
+ {
+ int rService, sopEncoding;
+
+ rService = MfpdtfReadService( hpaio->mfpdtf );
+
+ if( retcode != SANE_STATUS_GOOD )
+ {
+ goto abort;
+ }
+
+ if( rService & MFPDTF_RESULT_ERROR_MASK )
+ {
+ retcode = SANE_STATUS_IO_ERROR;
+ goto abort;
+ }
+
+ if( rService & MFPDTF_RESULT_NEW_VARIANT_HEADER && hpaio->preDenali )
+ {
+ union MfpdtfVariantHeader_u vheader;
+ MfpdtfReadGetVariantHeader( hpaio->mfpdtf, &vheader, sizeof( vheader ) );
+
+ traits.iPixelsPerRow = LEND_GET_SHORT( vheader.faxArtoo.pixelsPerRow );
+ traits.iBitsPerPixel = 1;
+
+ switch( vheader.faxArtoo.dataCompression )
+ {
+ case MFPDTF_RASTER_MH:
+ sopEncoding = MFPDTF_RASTER_MH;
+ break;
+ case MFPDTF_RASTER_MR:
+ sopEncoding = MFPDTF_RASTER_MR;
+ break;
+ case MFPDTF_RASTER_MMR:
+ default:
+ sopEncoding = MFPDTF_RASTER_MMR;
+ break;
+ }
+ goto setupDecoder;
+ }
+ else if( rService & MFPDTF_RESULT_NEW_START_OF_PAGE_RECORD )
+ {
+ // struct MfpdtfImageStartPageRecord_s sop;
+
+ // if( hpaio->scannerType == SCANNER_TYPE_SCL )
+ // {
+ if( hpaio->currentCompression == COMPRESSION_NONE )
+ {
+ goto rawDecode;
+ }
+ else /* if (hpaio->currentCompression==COMPRESSION_JPEG) */
+ {
+ goto jpegDecode;
+ }
+
+ /* Read SOP record and set image pipeline input traits. */
+ // MfpdtfReadGetStartPageRecord( hpaio->mfpdtf, &sop, sizeof( sop ) );
+ // traits.iPixelsPerRow = LEND_GET_SHORT( sop.black.pixelsPerRow );
+ // traits.iBitsPerPixel = LEND_GET_SHORT( sop.black.bitsPerPixel );
+ // traits.lHorizDPI = LEND_GET_LONG( sop.black.xres );
+ // traits.lVertDPI = LEND_GET_LONG( sop.black.yres );
+ // sopEncoding = sop.encoding;
+
+setupDecoder:
+ /* Set up image-processing pipeline. */
+ switch( sopEncoding )
+ {
+ case MFPDTF_RASTER_MH:
+ pXform->aXformInfo[IP_FAX_FORMAT].dword = IP_FAX_MH;
+ ADD_XFORM( X_FAX_DECODE );
+ break;
+ case MFPDTF_RASTER_MR:
+ pXform->aXformInfo[IP_FAX_FORMAT].dword = IP_FAX_MR;
+ ADD_XFORM( X_FAX_DECODE );
+ break;
+ case MFPDTF_RASTER_MMR:
+ pXform->aXformInfo[IP_FAX_FORMAT].dword = IP_FAX_MMR;
+ ADD_XFORM( X_FAX_DECODE );
+ break;
+
+ case MFPDTF_RASTER_BITMAP:
+ case MFPDTF_RASTER_GRAYMAP:
+ case MFPDTF_RASTER_RGB:
+rawDecode:
+ break;
+
+ case MFPDTF_RASTER_JPEG:
+jpegDecode:
+ pXform->aXformInfo[IP_JPG_DECODE_FROM_DENALI].dword = hpaio->fromDenali;
+ ADD_XFORM( X_JPG_DECODE );
+
+ pXform->aXformInfo[IP_CNV_COLOR_SPACE_WHICH_CNV].dword = IP_CNV_YCC_TO_SRGB;
+ pXform->aXformInfo[IP_CNV_COLOR_SPACE_GAMMA].dword = 0x00010000;
+ ADD_XFORM( X_CNV_COLOR_SPACE );
+ break;
+
+ case MFPDTF_RASTER_YCC411:
+ case MFPDTF_RASTER_PCL:
+ case MFPDTF_RASTER_NOT:
+ default:
+ /* Skip processing for unknown encodings. */
+ bug("unknown image encoding sane_start: name=%s sop=%d %s %d\n", hpaio->saneDevice.name,sopEncoding, __FILE__, __LINE__);
+ }
+ continue;
+ }
+
+ if( rService & MFPDTF_RESULT_IMAGE_DATA_PENDING )
+ {
+ /*MfpdtfReadSetTimeout( hpaio->mfpdtf, MFPDTF_LATER_READ_TIMEOUT );*/
+ break;
+ }
+ }
+ }
+ hpaio->scanParameters.pixels_per_line = traits.iPixelsPerRow;
+ hpaio->scanParameters.lines = traits.lNumRows;
+
+ if( hpaio->scanParameters.lines < 0 )
+ {
+ hpaio->scanParameters.lines = MILLIMETERS_TO_PIXELS( hpaio->bryRange.max,
+ hpaio->effectiveResolution );
+ }
+
+ // if( hpaio->scannerType == SCANNER_TYPE_SCL )
+ // {
+ /* We have to invert bilevel data from SCL scanners. */
+ if( hpaio->effectiveScanMode == SCAN_MODE_LINEART )
+ {
+ ADD_XFORM( X_INVERT );
+ }
+ else /* if (hpaio->effectiveScanMode==SCAN_MODE_COLOR) */
+ {
+ /* Do gamma correction on OfficeJet Pro 11xx. */
+ if( hpaio->scl.compat & ( SCL_COMPAT_1150 | SCL_COMPAT_1170 ) )
+ {
+ pXform->aXformInfo[IP_TABLE_WHICH].dword = IP_TABLE_USER;
+ pXform->aXformInfo[IP_TABLE_OPTION].pvoid = ( char * )hp11xxSeriesGammaTable;
+ ADD_XFORM( X_TABLE );
+ }
+ }
+
+ if( hpaio->currentLengthMeasurement == LENGTH_MEASUREMENT_PADDED )
+ {
+ pXform->aXformInfo[IP_PAD_LEFT].dword = 0;
+ pXform->aXformInfo[IP_PAD_RIGHT].dword = 0;
+ pXform->aXformInfo[IP_PAD_TOP].dword = 0;
+ pXform->aXformInfo[IP_PAD_BOTTOM].dword = 0;
+ pXform->aXformInfo[IP_PAD_VALUE].dword = ( hpaio->effectiveScanMode == SCAN_MODE_LINEART ) ? PAD_VALUE_LINEART : PAD_VALUE_GRAYSCALE_COLOR;
+ pXform->aXformInfo[IP_PAD_MIN_HEIGHT].dword = hpaio->scanParameters.lines;
+ ADD_XFORM( X_PAD );
+ }
+
+ /* If we didn't set up any xforms by now, then add the dummy "skel" xform to simplify our subsequent code path. */
+ if( pXform == xforms )
+ {
+ ADD_XFORM( X_SKEL );
+ }
+
+ wResult = ipOpen( pXform - xforms, xforms, 0, &hpaio->hJob );
+
+ if( wResult != IP_DONE || !hpaio->hJob )
+ {
+ retcode = SANE_STATUS_INVAL;
+ goto abort;
+ }
+
+ traits.iComponentsPerPixel = ( ( traits.iBitsPerPixel % 3 ) ? 1 : 3 );
+ wResult = ipSetDefaultInputTraits( hpaio->hJob, &traits );
+
+ if( wResult != IP_DONE )
+ {
+ retcode = SANE_STATUS_INVAL;
+ goto abort;
+ }
+
+ hpaio->scanParameters.bytes_per_line = BYTES_PER_LINE( hpaio->scanParameters.pixels_per_line,
+ hpaio->scanParameters.depth * ( hpaio->scanParameters.format == SANE_FRAME_RGB ? 3 : 1 ) );
+
+ hpaio->totalBytesRemaining = hpaio->scanParameters.bytes_per_line * hpaio->scanParameters.lines;
+ hpaio->bufferOffset = 0;
+ hpaio->bufferBytesRemaining = 0;
+
+ if( hpaio->currentLengthMeasurement == LENGTH_MEASUREMENT_UNKNOWN || hpaio->currentLengthMeasurement == LENGTH_MEASUREMENT_UNLIMITED )
+ {
+ hpaio->scanParameters.lines = -1;
+ }
+ else if( hpaio->currentLengthMeasurement == LENGTH_MEASUREMENT_EXACT )
+ {
+ /* TODO: Set up spool file, scan the whole image into it,
+ * and set "hpaio->scanParameters.lines" accordingly.
+ * Then in sane_hpaio_read, read out of the file. */
+ }
+
+ retcode = SANE_STATUS_GOOD;
+
+abort:
+
+ if( retcode != SANE_STATUS_GOOD )
+ {
+ if (retcode == SANE_STATUS_NO_DOCS) SendScanEvent (hpaio->deviceuri, EVENT_SCAN_ADF_NO_DOCS);
+ sane_hpaio_cancel( handle );
+ }
+ return retcode;
+
+} /* sane_hpaio_start() */
+
+
+extern SANE_Status sane_hpaio_read(SANE_Handle handle, SANE_Byte *data, SANE_Int maxLength, SANE_Int *pLength)
+{
+ hpaioScanner_t hpaio = ( hpaioScanner_t ) handle;
+ SANE_Status retcode;
+ DWORD dwInputAvail;
+ LPBYTE pbInputBuf;
+ DWORD dwInputUsed, dwInputNextPos;
+ DWORD dwOutputAvail = maxLength;
+ LPBYTE pbOutputBuf = data;
+ DWORD dwOutputUsed, dwOutputThisPos;
+ WORD wResult;
+
+ if (strcmp(*((char **)handle), "LEDM") == 0)
+ return ledm_read(handle, data, maxLength, pLength);
+ if (strcmp(*((char **)handle), "MARVELL") == 0)
+ return marvell_read(handle, data, maxLength, pLength);
+ if (strcmp(*((char **)handle), "SOAP") == 0)
+ return soap_read(handle, data, maxLength, pLength);
+ if (strcmp(*((char **)handle), "SOAPHT") == 0)
+ return soapht_read(handle, data, maxLength, pLength);
+
+ if (hpaio->user_cancel) {
+ bug("sane_hpaio_read(maxLength=%d): User cancelled!\n", maxLength);
+ return SANE_STATUS_CANCELLED;
+ }
+
+ *pLength = 0;
+
+ if( !hpaio->hJob )
+ {
+ bug("sane_hpaio_read(maxLength=%d): No scan pending!\n", maxLength);
+ retcode = SANE_STATUS_EOF;
+ goto abort;
+ }
+
+ if (hpaio->scannerType==SCANNER_TYPE_PML)
+ {
+ retcode = pml_read(hpaio, data, maxLength, pLength);
+ return retcode;
+ }
+
+ DBG(8, "sane_hpaio_read called handle=%p data=%p maxLength=%d length=%d: %s %d\n", (void *)handle, data, maxLength, *pLength, __FILE__, __LINE__);
+
+ /* TODO: convert to scl_read. des */
+
+needMoreData:
+ if( hpaio->bufferBytesRemaining <= 0 && !hpaio->endOfData )
+ {
+ if( !hpaio->mfpdtf )
+ {
+ int r, len = hpaio->totalBytesRemaining;
+ if( len <= 0 )
+ {
+ hpaio->endOfData = 1;
+ }
+ else
+ {
+ if( len > LEN_BUFFER )
+ {
+ len = LEN_BUFFER;
+ }
+
+ r = ReadChannelEx(hpaio->deviceid,
+ hpaio->scan_channelid,
+ hpaio->inBuffer,
+ len,
+ EXCEPTION_TIMEOUT);
+
+ if( r < 0 )
+ {
+ retcode = SANE_STATUS_IO_ERROR;
+ goto abort;
+ }
+ hpaio->bufferBytesRemaining = r;
+ hpaio->totalBytesRemaining -= r;
+ }
+ }
+ else
+ {
+ // mfpdtf
+ int rService;
+
+ rService = MfpdtfReadService( hpaio->mfpdtf );
+
+ if( rService & MFPDTF_RESULT_ERROR_MASK )
+ {
+ // retcode = SANE_STATUS_IO_ERROR;
+ // goto abort;
+ hpaio->endOfData = 1; /* display any data (ie: OJ F380 1200dpi non-compressed can timeout after last scan). */
+ }
+
+ if( rService & MFPDTF_RESULT_IMAGE_DATA_PENDING )
+ {
+ hpaio->bufferBytesRemaining = MfpdtfReadInnerBlock( hpaio->mfpdtf, hpaio->inBuffer, LEN_BUFFER );
+
+ rService = MfpdtfReadGetLastServiceResult( hpaio->mfpdtf );
+
+ if( rService & MFPDTF_RESULT_ERROR_MASK )
+ {
+ retcode = SANE_STATUS_IO_ERROR;
+ goto abort;
+ }
+ }
+ else if( rService & MFPDTF_RESULT_NEW_END_OF_PAGE_RECORD || ( rService & MFPDTF_RESULT_END_PAGE && hpaio->preDenali ))
+ {
+ hpaio->endOfData = 1;
+ }
+
+ } /* if (!hpaio->mfpdtf) */
+
+ hpaio->bufferOffset = 0;
+ if( hpaio->preDenali )
+ {
+ ipMirrorBytes( hpaio->inBuffer, hpaio->bufferBytesRemaining );
+ }
+
+ } /* if( hpaio->bufferBytesRemaining <= 0 && !hpaio->endOfData ) */
+
+ dwInputAvail = hpaio->bufferBytesRemaining;
+
+ if( hpaio->bufferBytesRemaining <= 0 && hpaio->endOfData )
+ {
+ pbInputBuf = 0;
+ }
+ else
+ {
+ pbInputBuf = hpaio->inBuffer + hpaio->bufferOffset;
+ }
+
+ wResult = ipConvert( hpaio->hJob,
+ dwInputAvail,
+ pbInputBuf,
+ &dwInputUsed,
+ &dwInputNextPos,
+ dwOutputAvail,
+ pbOutputBuf,
+ &dwOutputUsed,
+ &dwOutputThisPos );
+
+ hpaio->bufferOffset += dwInputUsed;
+ hpaio->bufferBytesRemaining -= dwInputUsed;
+ *pLength = dwOutputUsed;
+
+ if( wResult & ( IP_INPUT_ERROR | IP_FATAL_ERROR ) )
+ {
+ bug("ipConvert error=%x\n", wResult);
+ retcode = SANE_STATUS_IO_ERROR;
+ goto abort;
+ }
+ if( !dwOutputUsed )
+ {
+ if( wResult & IP_DONE )
+ {
+ retcode = SANE_STATUS_EOF;
+// hpaioAdvanceDocument(hpaio);
+ ipClose(hpaio->hJob);
+ hpaio->hJob = 0;
+ goto abort;
+ }
+ goto needMoreData;
+ }
+
+ retcode = SANE_STATUS_GOOD;
+
+abort:
+ if(!(retcode == SANE_STATUS_GOOD || retcode == SANE_STATUS_EOF))
+ {
+ sane_hpaio_cancel( handle );
+ }
+
+ DBG(8, "sane_hpaio_read returned output=%p outputUsed=%d length=%d status=%d: %s %d\n", pbOutputBuf, dwOutputUsed, *pLength, retcode, __FILE__, __LINE__);
+
+ return retcode;
+
+} /* sane_hpaio_read() */
+
+/* Note, sane_cancel is called normally not just during IO abort situations. */
+extern void sane_hpaio_cancel( SANE_Handle handle )
+{
+ hpaioScanner_t hpaio = ( hpaioScanner_t ) handle;
+ DBG(8, "sane_hpaio_cancel(): %s %d\n", __FILE__, __LINE__);
+ if (strcmp(*((char **)handle), "MARVELL") == 0)
+ return marvell_cancel(handle);
+ if (strcmp(*((char **)handle), "SOAP") == 0)
+ return soap_cancel(handle);
+ if (strcmp(*((char **)handle), "SOAPHT") == 0)
+ return soapht_cancel(handle);
+ if (strcmp(*((char **)handle), "LEDM") == 0)
+ return ledm_cancel(handle);
+
+ if (hpaio->user_cancel) {
+ bug("sane_hpaio_cancel: already cancelled!\n");
+ }
+ hpaio->user_cancel = TRUE;
+
+ if (hpaio->scannerType==SCANNER_TYPE_PML)
+ {
+ pml_cancel(hpaio);
+ return ;
+ }
+
+ /* TODO: convert to scl_cancel. des */
+
+ if( hpaio->mfpdtf )
+ {
+ MfpdtfLogToFile( hpaio->mfpdtf, 0 );
+ //MfpdtfDeallocate( hpaio->mfpdtf );
+ }
+
+ if( hpaio->hJob )
+ {
+ ipClose( hpaio->hJob );
+ hpaio->hJob = 0;
+ }
+
+ /* Do not close pml/scan channels if in batch mode. */
+ if (hpaio->currentBatchScan != SANE_TRUE && hpaio->cmd_channelid > 0)
+ hpaioConnEndScan(hpaio);
+
+} /* sane_hpaio_cancel() */
+
+extern SANE_Status sane_hpaio_set_io_mode(SANE_Handle handle, SANE_Bool nonBlocking)
+{
+ return SANE_STATUS_UNSUPPORTED;
+}
+
+extern SANE_Status sane_hpaio_get_select_fd(SANE_Handle handle, SANE_Int *pFd)
+{
+ return SANE_STATUS_UNSUPPORTED;
+}
+
+
diff --git a/scan/sane/hpaio.desc b/scan/sane/hpaio.desc
new file mode 100644
index 0000000..2d9c22f
--- /dev/null
+++ b/scan/sane/hpaio.desc
@@ -0,0 +1,2448 @@
+;
+; SANE Backend specification file
+;
+
+:backend "hpaio" ; name of backend
+:version "" ; version of backend
+:url "http://hpinkjet.sourceforge.net/" ; backend's web page
+:comment "This backend isn't included in SANE because it is included in the HPLIP software."
+
+:devicetype :scanner ; start of a list of devices....
+:mfg "Hewlett-Packard" ; name a manufacturer
+:url "http://www.hp.com/united-states/consumer/gateway/printing_multifunction.html"
+:model "HP Photosmart All-in-one Printer - b010"
+:status :good
+
+:model "HP Officejet v30 All-in-one Printer"
+:status :good
+
+:model "HP Officejet v40xi All-in-one Printer"
+:status :good
+
+:model "HP Officejet v40s All-in-one Printer"
+:status :good
+
+:model "HP Officejet r40 All-in-one Printer"
+:status :good
+
+:model "HP Officejet v40 All-in-one Printer"
+:status :good
+
+:model "HP Officejet r40xi All-in-one Printer"
+:status :good
+
+:model "HP Officejet t45xi All-in-one Printer"
+:status :good
+
+:model "HP Officejet r45 All-in-one Printer"
+:status :good
+
+:model "HP Officejet v45 All-in-one Printer"
+:status :good
+
+:model "HP Officejet t45 All-in-one Printer"
+:status :good
+
+:model "HP Officejet g55 All-in-one Printer"
+:status :good
+
+:model "HP Officejet g55xi All-in-one Printer"
+:status :good
+
+:model "HP Officejet k60 All-in-one Printer"
+:status :good
+
+:model "HP Officejet r60 All-in-one Printer"
+:status :good
+
+:model "HP Officejet k60xi All-in-one Printer"
+:status :good
+
+:model "HP Officejet t65xi All-in-one Printer"
+:status :good
+
+:model "HP Officejet t65 All-in-one Printer"
+:status :good
+
+:model "HP Officejet r65 All-in-one Printer"
+:status :good
+
+:model "HP Officejet k80 All-in-one Printer"
+:status :good
+
+:model "HP Officejet k80xi All-in-one Printer"
+:status :good
+
+:model "HP Officejet r80xi All-in-one Printer"
+:status :good
+
+:model "HP Officejet r80 All-in-one Printer"
+:status :good
+
+:model "HP Officejet g85 All-in-one Printer"
+:status :good
+
+:model "HP Officejet g85xi All-in-one Printer"
+:status :good
+
+:model "HP Officejet g95 All-in-one Printer"
+:status :good
+
+:model "HP LaserJet 100 Color MFP m175"
+:status :good
+
+:model "HP Envy 100 d410 Series"
+:status :good
+
+:model "HP Photosmart All-in-one Printer - b109d"
+:status :good
+
+:model "HP Photosmart All-in-one Printer - b109e"
+:status :good
+
+:model "HP Photosmart All-in-one Printer - b109c"
+:status :good
+
+:model "HP Photosmart All-in-one Printer - b109a"
+:status :good
+
+:model "HP Photosmart Wireless All-in-one Printer - b109q"
+:status :good
+
+:model "HP Photosmart Wireless All-in-one Printer - b109n"
+:status :good
+
+:model "HP Photosmart Wireless All-in-one Printer - b109q=r"
+:status :good
+
+:model "HP Photosmart Wireless All-in-one Printer - b110"
+:status :good
+
+:model "HP Envy 110 E-all-in-one"
+:status :good
+
+:model "HP Photosmart d110 Series Printer"
+:status :good
+
+:model "HP Officejet d125xi All-in-one Printer"
+:status :good
+
+:model "HP Officejet d135 All-in-one Printer"
+:status :good
+
+:model "HP Officejet d135xi All-in-one Printer"
+:status :good
+
+:model "HP Officejet d145xi All-in-one Printer"
+:status :good
+
+:model "HP Officejet d145 All-in-one Printer"
+:status :good
+
+:model "HP Officejet d155xi All-in-one Printer"
+:status :good
+
+:model "HP LaserJet 200 Color MFP m275nw"
+:status :good
+
+:model "HP LaserJet 200 Color MFP m275s"
+:status :good
+
+:model "HP LaserJet 200 Color MFP m275t"
+:status :good
+
+:model "HP LaserJet 200 Color MFP m275u"
+:status :good
+
+:model "HP Deskjet Ink Advantage k209a All-in-one Printer"
+:status :good
+
+:model "HP Photosmart Plus All-in-one Printer - b209a"
+:status :good
+
+:model "HP Photosmart Plus All-in-one Printer - b209b"
+:status :good
+
+:model "HP Photosmart Plus All-in-one Printer - b209c"
+:status :good
+
+:model "HP Photosmart Plus b210 Series"
+:status :good
+
+:model "HP Printer Scanner Copier 300"
+:status :good
+
+:model "HP LaserJet 300 Color MFP m375nw"
+:status :good
+
+:model "HP Photosmart Premium All-in-one Printer Series - c309h"
+:status :good
+
+:model "HP Photosmart Premium All-in-one Printer Series - c309g"
+:status :good
+
+:model "HP Photosmart Premium Fax All-in-one Printer - c309a"
+:status :good
+
+:model "HP Photosmart Premium Fax All-in-one Printer Series -c309c"
+:status :good
+
+:model "HP Photosmart Premium Fax All-in-one Printer Series -c309a"
+:status :good
+
+:model "HP Photosmart Prem c310 Series"
+:status :good
+
+:model "HP Deskjet f310 All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f325 All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f335 All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f340 All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f350 All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f370 All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f375 All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f378 All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f379 All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f380 All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f385 All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f388 All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f390 All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f394 All-in-one Printer"
+:status :good
+
+:model "HP LaserJet 400 Color MFP m475dw"
+:status :good
+
+:model "HP LaserJet 400 Color MFP m475dn"
+:status :good
+
+:model "HP Photosmart Prem c410 Series"
+:status :good
+
+:model "HP PSC 500xi All-in-one Printer"
+:status :good
+
+:model "HP PSC 500 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart Estn c510 Series"
+:status :good
+
+:model "HP Photosmart Ink Adv k510"
+:status :good
+
+:model "HP Officejet 520 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 570 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 580 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 590 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 600 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 610 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 630 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 635 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 700 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 710 All-in-one Printer"
+:status :good
+
+:model "HP PSC 720 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 720 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 725 All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f735 All-in-one Printer"
+:status :good
+
+:model "HP PSC 750 All-in-one Printer"
+:status :good
+
+:model "HP PSC 750xi All-in-one Printer"
+:status :good
+
+:model "HP PSC 760 All-in-one Printer"
+:status :good
+
+:model "HP PSC 780 All-in-one Printer"
+:status :good
+
+:model "HP PSC 780xi All-in-one Printer"
+:status :good
+
+:model "HP PSC 900 All-in-one Printer"
+:status :good
+
+:model "HP 915 Inkjet All-in-one Printer"
+:status :good
+
+:model "HP PSC 920 All-in-one Printer"
+:status :good
+
+:model "HP PSC 950 All-in-one Printer"
+:status :good
+
+:model "HP PSC 950vr All-in-one Printer"
+:status :good
+
+:model "HP PSC 950xi All-in-one Printer"
+:status :good
+
+:model "HP LaserJet m1005 Multifunction Printer"
+:status :good
+
+:model "HP Color LaserJet cm1015 Multifunction Printer"
+:status :good
+
+:model "HP Color LaserJet cm1017 Multifunction Printer"
+:status :good
+
+:model "HP Deskjet 1050 j410 All-in-one Printer"
+:status :good
+
+:model "HP LaserJet 1100a Xi All-in-one Printer"
+:status :good
+
+:model "HP LaserJet 1100xi Printer"
+:status :good
+
+:model "HP LaserJet 1100a All-in-one Printer"
+:status :good
+
+:model "HP LaserJet 1100 Printer"
+:status :good
+
+:model "HP LaserJet 1100a Se All-in-one Printer"
+:status :good
+
+:model "HP LaserJet 1100se Printer"
+:status :good
+
+:model "HP PSC 1110v All-in-one Printer"
+:status :good
+
+:model "HP PSC 1110 All-in-one Printer"
+:status :good
+
+:model "HP PSC 1118 All-in-one Printer"
+:status :good
+
+:model "HP LaserJet m1120 Multifunction Printer"
+:status :good
+
+:model "HP LaserJet m1120n Multifunction Printer"
+:status :good
+
+:model "HP LaserJet Professional m1132s Multifunction Printer"
+:status :good
+
+:model "HP LaserJet Professional m1132 Multifunction Printer"
+:status :good
+
+:model "HP LaserJet Professional m1136 Multifunction Printer"
+:status :good
+
+:model "HP Officejet Pro 1150c All-in-one Printer"
+:status :good
+
+:model "HP Officejet Pro 1150cse All-in-one Printer"
+:status :good
+
+:model "HP Officejet Pro 1170cse All-in-one Printer"
+:status :good
+
+:model "HP Officejet Pro 1170c All-in-one Printer"
+:status :good
+
+:model "HP Officejet Pro 1170cxi All-in-one Printer"
+:status :good
+
+:model "HP Officejet Pro 1175cxi All-in-one Printer"
+:status :good
+
+:model "HP Officejet Pro 1175cse All-in-one Printer"
+:status :good
+
+:model "HP Officejet Pro 1175c All-in-one Printer"
+:status :good
+
+:model "HP PSC 1200 All-in-one Printer"
+:status :good
+
+:model "HP PSC 1205 All-in-one Printer"
+:status :good
+
+:model "HP PSC 1209 All-in-one Printer"
+:status :good
+
+:model "HP PSC 1210xi All-in-one Printer"
+:status :good
+
+:model "HP PSC 1210v All-in-one Printer"
+:status :good
+
+:model "HP PSC 1210 All-in-one Printer"
+:status :good
+
+:model "HP LaserJet Professional m1212nf Multifunction Printer"
+:status :good
+
+:model "HP LaserJet Professional m1213nf Multifunction Printer"
+:status :good
+
+:model "HP PSC 1213 All-in-one Printer"
+:status :good
+
+:model "HP LaserJet Professional m1214nfh Multifunction Printer"
+:status :good
+
+:model "HP PSC 1215 All-in-one Printer"
+:status :good
+
+:model "HP PSC 1216 All-in-one Printer"
+:status :good
+
+:model "HP LaserJet Professional m1216nfh MFP"
+:status :good
+
+:model "HP PSC 1217 All-in-one Printer"
+:status :good
+
+:model "HP LaserJet Professional m1217nfw Multifunction Printer"
+:status :good
+
+:model "HP PSC 1218 All-in-one Printer"
+:status :good
+
+:model "HP LaserJet Professional m1219nf MFP"
+:status :good
+
+:model "HP PSC 1219 All-in-one Printer"
+:status :good
+
+:model "HP LaserJet 1220 All-in-one Printer"
+:status :good
+
+:model "HP LaserJet 1220se All-in-one Printer"
+:status :good
+
+:model "HP PSC 1300 All-in-one Printer"
+:status :good
+
+:model "HP PSC 1310 All-in-one Printer"
+:status :good
+
+:model "HP PSC 1311 All-in-one Printer"
+:status :good
+
+:model "HP Color LaserJet cm1312nfi Multifunction Printer"
+:status :good
+
+:model "HP Color LaserJet cm1312 Multifunction Printer"
+:status :good
+
+:model "HP PSC 1312 All-in-one Printer"
+:status :good
+
+:model "HP PSC 1315v All-in-one Printer"
+:status :good
+
+:model "HP PSC 1315s All-in-one Printer"
+:status :good
+
+:model "HP PSC 1315xi All-in-one Printer"
+:status :good
+
+:model "HP PSC 1315 All-in-one Printer"
+:status :good
+
+:model "HP PSC 1317 All-in-one Printer"
+:status :good
+
+:model "HP PSC 1318 All-in-one Printer"
+:status :good
+
+:model "HP LaserJet m1319f Multifunction Printer"
+:status :good
+
+:model "HP PSC 1340 All-in-one Printer"
+:status :good
+
+:model "HP PSC 1345 All-in-one Printer"
+:status :good
+
+:model "HP PSC 1350xi All-in-one Printer"
+:status :good
+
+:model "HP PSC 1350v All-in-one Printer"
+:status :good
+
+:model "HP PSC 1350 All-in-one Printer"
+:status :good
+
+:model "HP PSC 1355 All-in-one Printer"
+:status :good
+
+:model "HP PSC 1401 All-in-one Printer"
+:status :good
+
+:model "HP PSC 1402 All-in-one Printer"
+:status :good
+
+:model "HP PSC 1403 All-in-one Printer"
+:status :good
+
+:model "HP PSC 1406 All-in-one Printer"
+:status :good
+
+:model "HP PSC 1408 All-in-one Printer"
+:status :good
+
+:model "HP PSC 1410 All-in-one Printer"
+:status :good
+
+:model "HP PSC 1410v All-in-one Printer"
+:status :good
+
+:model "HP PSC 1410xi All-in-one Printer"
+:status :good
+
+:model "HP LaserJet Professional cm1411fn"
+:status :good
+
+:model "HP LaserJet Professional cm1412fn"
+:status :good
+
+:model "HP LaserJet Professional cm1413fn"
+:status :good
+
+:model "HP PSC 1415 All-in-one Printer"
+:status :good
+
+:model "HP LaserJet Professional cm1415fnw"
+:status :good
+
+:model "HP LaserJet Professional cm1415fn"
+:status :good
+
+:model "HP LaserJet Professional cm1416fnw"
+:status :good
+
+:model "HP LaserJet Professional cm1417fnw"
+:status :good
+
+:model "HP PSC 1417 All-in-one Printer"
+:status :good
+
+:model "HP LaserJet Professional cm1418fnw"
+:status :good
+
+:model "HP PSC 1503 All-in-one Printer"
+:status :good
+
+:model "HP PSC 1504 All-in-one Printer"
+:status :good
+
+:model "HP PSC 1507 All-in-one Printer"
+:status :good
+
+:model "HP PSC 1508 All-in-one Printer"
+:status :good
+
+:model "HP PSC 1510s All-in-one Printer"
+:status :good
+
+:model "HP PSC 1510xi All-in-one Printer"
+:status :good
+
+:model "HP PSC 1510 All-in-one Printer"
+:status :good
+
+:model "HP PSC 1510v All-in-one Printer"
+:status :good
+
+:model "HP PSC 1513s All-in-one Printer"
+:status :good
+
+:model "HP PSC 1513 All-in-one Printer"
+:status :good
+
+:model "HP PSC 1514 All-in-one Printer"
+:status :good
+
+:model "HP LaserJet m1522n Multifunction Printer"
+:status :good
+
+:model "HP LaserJet m1522nf Multifunction Printer"
+:status :good
+
+:model "HP LaserJet m1522 Multifunction Printer"
+:status :good
+
+:model "HP LaserJet m1536dnf MFP"
+:status :good
+
+:model "HP LaserJet m1537dnf MFP"
+:status :good
+
+:model "HP LaserJet m1538dnf MFP"
+:status :good
+
+:model "HP LaserJet m1539dnf MFP"
+:status :good
+
+:model "HP PSC 1600 All-in-one Printer"
+:status :good
+
+:model "HP PSC 1603 All-in-one Printer"
+:status :good
+
+:model "HP PSC 1605 All-in-one Printer"
+:status :good
+
+:model "HP PSC 1608 All-in-one Printer"
+:status :good
+
+:model "HP PSC 1610 All-in-one Printer"
+:status :good
+
+:model "HP PSC 1610xi All-in-one Printer"
+:status :good
+
+:model "HP PSC 1610v All-in-one Printer"
+:status :good
+
+:model "HP PSC 1613 All-in-one Printer"
+:status :good
+
+:model "HP PSC 1615 All-in-one Printer"
+:status :good
+
+:model "HP Deskjet 2050 j510 All-in-one Printer"
+:status :good
+
+:model "HP Deskjet Ink Adv 2060 k110"
+:status :good
+
+:model "HP PSC 2105 All-in-one Printer"
+:status :good
+
+:model "HP PSC 2108 All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f2110 All-in-one Printer"
+:status :good
+
+:model "HP PSC 2110 All-in-one Printer"
+:status :good
+
+:model "HP PSC 2110v All-in-one Printer"
+:status :good
+
+:model "HP PSC 2110xi All-in-one Printer"
+:status :good
+
+:model "HP PSC 2115 All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f2120 All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f2128 All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f2140 All-in-one Printer"
+:status :good
+
+:model "HP PSC 2150 All-in-one Printer"
+:status :good
+
+:model "HP PSC 2170 All-in-one Printer"
+:status :good
+
+:model "HP PSC 2171 All-in-one Printer"
+:status :good
+
+:model "HP PSC 2175 All-in-one Printer"
+:status :good
+
+:model "HP PSC 2175v All-in-one Printer"
+:status :good
+
+:model "HP PSC 2175xi All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f2179 All-in-one Printer"
+:status :good
+
+:model "HP PSC 2179 All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f2180 All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f2185 All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f2187 All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f2188 All-in-one Printer"
+:status :good
+
+:model "HP PSC 2200 All-in-one Printer"
+:status :good
+
+:model "HP PSC 2210 All-in-one Printer"
+:status :good
+
+:model "HP PSC 2210v All-in-one Printer"
+:status :good
+
+:model "HP PSC 2210xi All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f2210 All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f2212 All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f2214 All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f2224 All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f2235 All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f2238 All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f2240 All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f2250 All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f2275 All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f2276 All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f2280 All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f2288 All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f2290 All-in-one Printer"
+:status :good
+
+:model "HP PSC 2300 Series All-in-one Printer"
+:status :good
+
+:model "HP PSC 2310 All-in-one Printer"
+:status :good
+
+:model "HP Color LaserJet cm2320n Multifunction Printer"
+:status :good
+
+:model "HP Color LaserJet cm2320nf Multifunction Printer"
+:status :good
+
+:model "HP Color LaserJet cm2320fxi Multifunction Printer"
+:status :good
+
+:model "HP Color LaserJet cm2320 Multifuntion Printer"
+:status :good
+
+:model "HP PSC 2350 All-in-one Printer"
+:status :good
+
+:model "HP PSC 2352 All-in-one Printer"
+:status :good
+
+:model "HP PSC 2353 All-in-one Printer"
+:status :good
+
+:model "HP PSC 2353p All-in-one Printer"
+:status :good
+
+:model "HP PSC 2355 All-in-one Printer"
+:status :good
+
+:model "HP PSC 2355p All-in-one Printer"
+:status :good
+
+:model "HP PSC 2355xi All-in-one Printer"
+:status :good
+
+:model "HP PSC 2355v All-in-one Printer"
+:status :good
+
+:model "HP PSC 2357 All-in-one Printer"
+:status :good
+
+:model "HP PSC 2358 All-in-one Printer"
+:status :good
+
+:model "HP PSC 2405 Photosmart All-in-one Printer"
+:status :good
+
+:model "HP PSC 2410v Photosmart All-in-one Printer"
+:status :good
+
+:model "HP PSC 2410xi Photosmart All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f2410 All-in-one Printer"
+:status :good
+
+:model "HP PSC 2410 Photosmart All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f2418 All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f2420 All-in-one Printer"
+:status :good
+
+:model "HP PSC 2420 Photosmart All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f2423 All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f2430 All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f2440 All-in-one Printer"
+:status :good
+
+:model "HP PSC 2450 Photosmart All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f2476 All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f2480 All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f2483 All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f2488 All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f2492 All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f2493 All-in-one Printer"
+:status :good
+
+:model "HP PSC 2500 Photosmart All-in-one Printer"
+:status :good
+
+:model "HP PSC 2510 Photosmart All-in-one Printer"
+:status :good
+
+:model "HP PSC 2510xi Photosmart All-in-one Printer"
+:status :good
+
+:model "HP PSC 2550 Photosmart All-in-one Printer"
+:status :good
+
+:model "HP Photosmart 2570 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart 2571 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart 2573 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart 2574 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart 2575v All-in-one Printer"
+:status :good
+
+:model "HP Photosmart 2575a All-in-one Printer"
+:status :good
+
+:model "HP Photosmart 2575xi All-in-one Printer"
+:status :good
+
+:model "HP Photosmart 2575 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart 2578 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart 2605 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart 2608 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart 2610 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart 2610v All-in-one Printer"
+:status :good
+
+:model "HP Photosmart 2610xi All-in-one Printer"
+:status :good
+
+:model "HP Photosmart 2613 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart 2615 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart 2710 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart 2710xi All-in-one Printer"
+:status :good
+
+:model "HP Photosmart 2713 All-in-one Printer"
+:status :good
+
+:model "HP LaserJet m2727nf Multifunction Printer"
+:status :good
+
+:model "HP LaserJet m2727 Multifunction Printer"
+:status :good
+
+:model "HP LaserJet m2727nfs Multifunction Printer"
+:status :good
+
+:model "HP Color LaserJet 2800 All-in-one Printer"
+:status :good
+
+:model "HP Color LaserJet 2820 All-in-one Printer"
+:status :good
+
+:model "HP Color LaserJet 2830 All-in-one Printer"
+:status :good
+
+:model "HP Color LaserJet 2840 All-in-one Printer"
+:status :good
+
+:model "HP LaserJet 3015 All-in-one Printer"
+:status :good
+
+:model "HP LaserJet 3020 All-in-one Printer"
+:status :good
+
+:model "HP LaserJet 3030 All-in-one Printer"
+:status :good
+
+:model "HP LaserJet m3035 Multifunction Printer"
+:status :good
+
+:model "HP LaserJet m3035xs Multifunction Printer"
+:status :good
+
+:model "HP Deskjet 3050 j610 Series"
+:status :good
+
+:model "HP LaserJet 3050z All-in-one Printer"
+:status :good
+
+:model "HP Deskjet 3050a j611 Series"
+:status :good
+
+:model "HP LaserJet 3050 All-in-one Printer"
+:status :good
+
+:model "HP LaserJet 3052 All-in-one Printer"
+:status :good
+
+:model "HP LaserJet 3055 All-in-one Printer"
+:status :good
+
+:model "HP Deskjet 3070 b611 Series"
+:status :good
+
+:model "HP LaserJet 3100xi All-in-one Printer"
+:status :good
+
+:model "HP LaserJet 3100se All-in-one Printer"
+:status :good
+
+:model "HP LaserJet 3100 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart 3108 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart 3110v All-in-one Printer"
+:status :good
+
+:model "HP Photosmart 3110 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c3110 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c3125 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c3135 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c3140 All-in-one Printer"
+:status :good
+
+:model "HP LaserJet 3150se All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c3150 All-in-one Printer"
+:status :good
+
+:model "HP LaserJet 3150 All-in-one Printer"
+:status :good
+
+:model "HP LaserJet 3150xi All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c3170 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c3173 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c3175 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c3180 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c3183 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c3188 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c3190 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c3193 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c3194 All-in-one Printer"
+:status :good
+
+:model "HP LaserJet 3200 All-in-one Printer"
+:status :good
+
+:model "HP LaserJet 3200m All-in-one Printer"
+:status :good
+
+:model "HP Photosmart 3207 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart 3210a All-in-one Printer"
+:status :good
+
+:model "HP Photosmart 3210v All-in-one Printer"
+:status :good
+
+:model "HP Photosmart 3210xi All-in-one Printer"
+:status :good
+
+:model "HP Photosmart 3210 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart 3213 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart 3214 All-in-one Printer"
+:status :good
+
+:model "HP LaserJet 3300 Multifunction Printer"
+:status :good
+
+:model "HP Photosmart 3308 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart 3310 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart 3310xi All-in-one Printer"
+:status :good
+
+:model "HP LaserJet 3310 Digital Printer Copier"
+:status :good
+
+:model "HP Photosmart 3313 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart 3314 All-in-one Printer"
+:status :good
+
+:model "HP LaserJet 3320n Multifunction Printer"
+:status :good
+
+:model "HP LaserJet 3320 Multifunction Printer"
+:status :good
+
+:model "HP LaserJet 3330 Multifunction Printer"
+:status :good
+
+:model "HP LaserJet 3380 All-in-one Printer"
+:status :good
+
+:model "HP LaserJet 3390 All-in-one Printer"
+:status :good
+
+:model "HP LaserJet 3392 All-in-one Printer"
+:status :good
+
+:model "HP Officejet j3508 All-in-one Printer"
+:status :good
+
+:model "HP Officejet j3608 All-in-one Printer"
+:status :good
+
+:model "HP Officejet j3625 All-in-one Printer"
+:status :good
+
+:model "HP Officejet j3635 All-in-one Printer"
+:status :good
+
+:model "HP Officejet j3640 All-in-one Printer"
+:status :good
+
+:model "HP Officejet j3650 All-in-one Printer"
+:status :good
+
+:model "HP Officejet j3680 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 4100 Series All-in-one Printer"
+:status :good
+
+:model "HP LaserJet 4100 Multifunction Printer"
+:status :good
+
+:model "HP LaserJet 4101 Multifunction Printer"
+:status :good
+
+:model "HP Officejet 4105 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 4110xi All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c4110 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 4110v All-in-one Printer"
+:status :good
+
+:model "HP Officejet 4110 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 4115 All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f4135 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c4140 All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f4140 All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f4150 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c4150 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c4170 All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f4172 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c4173 All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f4175 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c4175 All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f4180 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c4180 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c4183 All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f4185 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c4188 All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f4188 All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f4190 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c4190 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c4193 All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f4194 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c4194 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 4200 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c4205 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c4210 All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f4210 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 4211 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 4212 All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f4213 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 4215 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 4215v All-in-one Printer"
+:status :good
+
+:model "HP Officejet 4215xi All-in-one Printer"
+:status :good
+
+:model "HP Officejet 4219 All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f4224 All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f4230 All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f4235 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c4235 All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f4238 All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f4240 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c4240 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c4250 All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f4250 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 4251 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 4252 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 4255 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 4256 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 4259 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c4270 All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f4272 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c4272 All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f4273 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c4273 All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f4274 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c4275 All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f4275 All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f4280 All-in-one"
+:status :good
+
+:model "HP Photosmart c4280 All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f4280 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c4283 All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f4283 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c4285 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c4288 All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f4288 All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f4292 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c4293 All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f4293 All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f4294 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c4294 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 4308 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 4311 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 4312 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 4314 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 4315 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 4315xi All-in-one Printer"
+:status :good
+
+:model "HP Officejet 4315v All-in-one Printer"
+:status :good
+
+:model "HP Officejet 4317 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 4319 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 4338 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c4340 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c4342 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c4343 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c4344 All-in-one Printer"
+:status :good
+
+:model "HP LaserJet m4345 Multifunction Printer"
+:status :good
+
+:model "HP LaserJet 4345xm Multifunction Printer"
+:status :good
+
+:model "HP LaserJet 4345 Multifunction Printer"
+:status :good
+
+:model "HP LaserJet m4345x Multifunction Printer"
+:status :good
+
+:model "HP LaserJet m4345xs Multifunction Printer"
+:status :good
+
+:model "HP LaserJet 4345xs Multifunction Printer"
+:status :good
+
+:model "HP LaserJet 4345x Multifunction Printer"
+:status :good
+
+:model "HP Photosmart c4345 All-in-one Printer"
+:status :good
+
+:model "HP LaserJet m4345xm Multifunction Printer"
+:status :good
+
+:model "HP Photosmart c4348 All-in-one Printer"
+:status :good
+
+:model "HP LaserJet m4349 MFP"
+:status :good
+
+:model "HP Officejet 4352 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 4353 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 4355 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 4357 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 4359 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c4380 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c4383 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c4384 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c4385 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c4388 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 4400 k410 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c4410 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c4424 All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f4435 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c4435 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c4440 All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f4440 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c4450 All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f4450 All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f4470 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c4470 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c4472 All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f4472 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c4473 All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f4473 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c4480 All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f4480 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c4483 All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f4483 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c4485 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c4486 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c4488 All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f4488 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c4490 All-in-one Printer"
+:status :good
+
+:model "HP Deskjet f4492 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c4493 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c4494 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 4500 All-in-one Printer - g510g"
+:status :good
+
+:model "HP Officejet 4500 All-in-one Printer - g510h"
+:status :good
+
+:model "HP Officejet 4500 g510n-z All-in-one Printer"
+:status :good
+
+:model "HP Officejet 4500 All-in-one Printer - k710"
+:status :good
+
+:model "HP Designjet 4500mfp"
+:status :good
+
+:model "HP Officejet 4500 Desktop All-in-one Printer - g510a"
+:status :good
+
+:model "HP Deskjet f4500 All-in-one Printer Series"
+:status :good
+
+:model "HP Officejet 4500 All-in-one Desktop Printer - g510b"
+:status :good
+
+:model "HP Designjet 4520mfp"
+:status :good
+
+:model "HP Officejet j4524 All-in-one Printer"
+:status :good
+
+:model "HP Officejet j4525 All-in-one Printer"
+:status :good
+
+:model "HP Officejet j4535 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c4540 All-in-one Printer"
+:status :good
+
+:model "HP Officejet j4540 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c4550 All-in-one Printer"
+:status :good
+
+:model "HP Officejet j4550 All-in-one Printer"
+:status :good
+
+:model "HP LaserJet m4555 MFP"
+:status :good
+
+:model "HP Officejet j4560 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c4570 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c4572 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c4573 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c4575 All-in-one Printer"
+:status :good
+
+:model "HP Officejet j4580c All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c4580 All-in-one Printer"
+:status :good
+
+:model "HP Officejet j4580 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c4583 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c4585 All-in-one Printer"
+:status :good
+
+:model "HP Officejet j4585 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c4588 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c4593 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c4599 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c4610 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c4635 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c4640 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c4650 All-in-one Printer"
+:status :good
+
+:model "HP Officejet j4660 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c4670 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c4673 All-in-one Printer"
+:status :good
+
+:model "HP Officejet j4680 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c4680 All-in-one Printer"
+:status :good
+
+:model "HP Officejet j4680c All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c4683 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c4688 All-in-one Printer"
+:status :good
+
+:model "HP Color LaserJet 4730x Multifunction Printer"
+:status :good
+
+:model "HP Color LaserJet 4730xs Multifunction Printer"
+:status :good
+
+:model "HP Color LaserJet cm4730 Multifunction Printer"
+:status :good
+
+:model "HP Color LaserJet 4730 Multifunction Printer"
+:status :good
+
+:model "HP Color LaserJet cm4730fsk Multifunction Printer"
+:status :good
+
+:model "HP Color LaserJet cm4730fm Multifunction Printer"
+:status :good
+
+:model "HP Color LaserJet cm4730f Multifunction Printer"
+:status :good
+
+:model "HP Color LaserJet 4730xm Multifunction Printer"
+:status :good
+
+:model "HP Photosmart c4740 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c4750 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c4780 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c4783 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c4785 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c4788 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c4793 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c4795 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c4798 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c4799 All-in-one Printer"
+:status :good
+
+:model "HP LaserJet m5035 Multifunction Printer"
+:status :good
+
+:model "HP LaserJet m5035xs Multifunction Printer"
+:status :good
+
+:model "HP LaserJet m5035x Multifunction Printer"
+:status :good
+
+:model "HP LaserJet m5039 Multifunction Printer"
+:status :good
+
+:model "HP Officejet 5100 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 5105 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 5110 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 5110v All-in-one Printer"
+:status :good
+
+:model "HP Officejet 5110xi All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c5140 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c5150 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c5170 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c5173 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c5175 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c5180 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c5183 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c5185 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c5188 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c5194 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c5240 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c5250 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c5270 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c5273 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c5275 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c5280 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c5283 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c5288 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c5290 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c5293 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c5370 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c5373 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c5380 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c5383 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c5388 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c5390 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c5393 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 5505 All-in-one Printer"
+:status :good
+
+:model "HP Officejet j5505 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 5508 All-in-one Printer"
+:status :good
+
+:model "HP Officejet j5508 All-in-one Printer"
+:status :good
+
+:model "HP Officejet j5510v All-in-one Printer"
+:status :good
+
+:model "HP Photosmart 5510 E-all-in-one"
+:status :good
+
+:model "HP Officejet 5510v All-in-one Printer"
+:status :good
+
+:model "HP Photosmart 5510d E-all-in-one"
+:status :good
+
+:model "HP Officejet 5510xi All-in-one Printer"
+:status :good
+
+:model "HP Officejet 5510 All-in-one Printer"
+:status :good
+
+:model "HP Officejet j5510xi All-in-one Printer"
+:status :good
+
+:model "HP Officejet j5510 All-in-one Printer"
+:status :good
+
+:model "HP Officejet j5515 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 5515 All-in-one Printer"
+:status :good
+
+:model "HP Officejet j5520 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c5540 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c5550 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c5570 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c5580 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 5600 Series All-in-one Printer"
+:status :good
+
+:model "HP Officejet 5605 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 5607 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 5608 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 5609 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 5610v All-in-one Printer"
+:status :good
+
+:model "HP Officejet 5610xi All-in-one Printer"
+:status :good
+
+:model "HP Officejet 5610 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 5615 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 5679 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 5680 All-in-one Printer"
+:status :good
+
+:model "HP Officejet j5725 All-in-one Printer"
+:status :good
+
+:model "HP Officejet j5730 All-in-one Printer"
+:status :good
+
+:model "HP Officejet j5735 All-in-one Printer"
+:status :good
+
+:model "HP Officejet j5738 All-in-one Printer"
+:status :good
+
+:model "HP Officejet j5740 All-in-one Printer"
+:status :good
+
+:model "HP Officejet j5750 All-in-one Printer"
+:status :good
+
+:model "HP Officejet j5780 All-in-one Printer"
+:status :good
+
+:model "HP Officejet j5783 All-in-one Printer"
+:status :good
+
+:model "HP Officejet j5785 All-in-one Printer"
+:status :good
+
+:model "HP Officejet j5788 All-in-one Printer"
+:status :good
+
+:model "HP Officejet j5790 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 6105 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 6110v All-in-one Printer"
+:status :good
+
+:model "HP Officejet 6110 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 6110xi All-in-one Printer"
+:status :good
+
+:model "HP Officejet 6150 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c6150 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c6154 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c6170 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c6175 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c6180 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c6183 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c6185 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c6188 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c6190 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 6200 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 6203 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 6205 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 6208 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 6210xi All-in-one Printer"
+:status :good
+
+:model "HP Officejet 6210v All-in-one Printer"
+:status :good
+
+:model "HP Officejet 6210 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 6213 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 6215 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c6240 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c6245 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c6250 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c6260 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c6263 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c6268 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c6270 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c6275 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c6280 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c6283 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c6285 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c6286 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c6288 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 6301 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 6304 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 6305 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 6307 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 6308 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 6310 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 6310xi All-in-one Printer"
+:status :good
+
+:model "HP Officejet 6310v All-in-one Printer"
+:status :good
+
+:model "HP Officejet 6313 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 6315 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 6318 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c6324 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c6340 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c6350 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c6375 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c6380 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c6383 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c6388 All-in-one Printer"
+:status :good
+
+:model "HP Officejet j6405 All-in-one Printer"
+:status :good
+
+:model "HP Officejet j6410 All-in-one Printer"
+:status :good
+
+:model "HP Officejet j6413 All-in-one Printer"
+:status :good
+
+:model "HP Officejet j6415 All-in-one Printer"
+:status :good
+
+:model "HP Officejet j6424 All-in-one Printer"
+:status :good
+
+:model "HP Officejet j6450 All-in-one Printer"
+:status :good
+
+:model "HP Officejet j6480 All-in-one Printer"
+:status :good
+
+:model "HP Officejet j6488 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 6500 e710"
+:status :good
+
+:model "HP Officejet 6500 Wireless All-in-one Printer - e709q"
+:status :good
+
+:model "HP Officejet 6500 Wireless All-in-one Printer - e709n"
+:status :good
+
+:model "HP Oficejet 6500 e710n-z"
+:status :good
+
+:model "HP Officejet 6500 All-in-one Printer - e709c"
+:status :good
+
+:model "HP Officejet 6500 All-in-one Printer - e709a"
+:status :good
+
+:model "HP Photosmart 6510 E-all-in-one"
+:status :good
+
+:model "HP Officejet 6600 E-all-in-one Printer - h711a"
+:status :good
+
+:model "HP Officejet 6700 E-all-in-one Printer - h711n"
+:status :good
+
+:model "HP Officejet 7100 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 7110xi All-in-one Printer"
+:status :good
+
+:model "HP Officejet 7110 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 7115 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 7130xi All-in-one Printer"
+:status :good
+
+:model "HP Officejet 7130 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 7135xi All-in-one Printer"
+:status :good
+
+:model "HP Officejet 7140xi All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c7150 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c7154 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c7170 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c7180 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c7183 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c7185 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c7188 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c7190 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 7205 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 7208 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 7210 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 7210v All-in-one Printer"
+:status :good
+
+:model "HP Officejet 7210xi All-in-one Printer"
+:status :good
+
+:model "HP Officejet 7213 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 7215 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c7250 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c7275 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c7280 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c7283 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c7288 All-in-one Printer"
+:status :good
+
+:model "HP Officejet Pro l7300 Series All-in-one Printer"
+:status :good
+
+:model "HP Officejet 7310xi All-in-one Printer"
+:status :good
+
+:model "HP Officejet 7310 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 7313 All-in-one Printer"
+:status :good
+
+:model "HP Officejet Pro l7380 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 7408 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 7410xi All-in-one Printer"
+:status :good
+
+:model "HP Officejet 7410 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 7413 All-in-one Printer"
+:status :good
+
+:model "HP Officejet Pro l7480 All-in-one Printer"
+:status :good
+
+:model "HP Officejet Pro l7500 Series All-in-one Printer"
+:status :good
+
+:model "HP Officejet 7500 e910"
+:status :good
+
+:model "HP Photosmart 7510 E-all-in-one"
+:status :good
+
+:model "HP Officejet Pro l7550 All-in-one Printer"
+:status :good
+
+:model "HP Officejet Pro l7555 All-in-one Printer"
+:status :good
+
+:model "HP Officejet Pro l7580 All-in-one Printer"
+:status :good
+
+:model "HP Officejet Pro l7590 All-in-one Printer"
+:status :good
+
+:model "HP Officejet Pro l7600 Series All-in-one Printer"
+:status :good
+
+:model "HP Officejet Pro l7650 All-in-one Printer"
+:status :good
+
+:model "HP Officejet Pro l7680 All-in-one Printer"
+:status :good
+
+:model "HP Officejet Pro l7681 All-in-one Printer"
+:status :good
+
+:model "HP Officejet Pro l7700 Series All-in-one Printer"
+:status :good
+
+:model "HP Officejet Pro l7710 All-in-one Printer"
+:status :good
+
+:model "HP Officejet Pro l7750 All-in-one Printer"
+:status :good
+
+:model "HP Officejet Pro l7780 All-in-one Printer"
+:status :good
+
+:model "HP cm8050 Color Multifunction Printer With Edgeline Technology"
+:status :good
+
+:model "HP cm8060 Color Multifunction Printer With Edgeline Technology"
+:status :good
+
+:model "HP LaserJet 8100 Multifunction Printer"
+:status :good
+
+:model "HP LaserJet 8150 Multifunction Printer"
+:status :good
+
+:model "HP Photosmart c8150 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c8180 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c8183 All-in-one Printer"
+:status :good
+
+:model "HP Photosmart c8188 All-in-one Printer"
+:status :good
+
+:model "HP Officejet Pro 8500 Premier All-in-one Printer - a909n"
+:status :good
+
+:model "HP Officejet Pro 8500 Wireless All-in-one Printer - a909g"
+:status :good
+
+:model "HP Officejet Pro 8500 All-in-one Printer - a909a"
+:status :good
+
+:model "HP Officejet Pro 8500a E-aio Printer - a910a"
+:status :good
+
+:model "HP Officejet Pro 8500a Premium E-aio Printer - a910n"
+:status :good
+
+:model "HP Officejet Pro 8500a Plus E-aio Printer - a910g"
+:status :good
+
+:model "HP Officejet Pro 8600 Plus E-aio n911g"
+:status :good
+
+:model "HP Officejet Pro 8600 E-aio n911a"
+:status :good
+
+:model "HP LaserJet 9000 Multifunction Printer"
+:status :good
+
+:model "HP LaserJet 9000l Multifunction Printer"
+:status :good
+
+:model "HP LaserJet 9040 Multifunction Printer"
+:status :good
+
+:model "HP LaserJet 9050 Multifunction Printer"
+:status :good
+
+:model "HP LaserJet 9055 Multifunction Printer"
+:status :good
+
+:model "HP LaserJet 9065 Multifunction Printer"
+:status :good
+
+:model "HP Officejet 9110 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 9120 All-in-one Printer"
+:status :good
+
+:model "HP Officejet 9130 All-in-one Printer"
+:status :good
+
+:model "HP Color LaserJet 9500 Multifunction Printer"
+:status :good
+
diff --git a/scan/sane/hpaio.h b/scan/sane/hpaio.h
new file mode 100644
index 0000000..2516224
--- /dev/null
+++ b/scan/sane/hpaio.h
@@ -0,0 +1,277 @@
+/************************************************************************************\
+
+ hpaio.h - HP SANE backend for multi-function peripherals (libsane-hpaio)
+
+ (c) 2001-2006 Copyright Hewlett-Packard Development Company, LP
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+ of the Software, and to permit persons to whom the Software is furnished to do
+ so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+ Contributing Authors: David Paschal, Don Welch, David Suffield
+
+\************************************************************************************/
+
+#if !defined( __HPAIO_H__ )
+#define __HPAIO_H__
+
+#include "sane.h"
+#include "common.h"
+#include "mfpdtf.h"
+#include "hpip.h"
+#include "scl.h"
+#include "pml.h"
+
+/************************************************************************************/
+
+#define MAX_DEVICE 64 /* Max devices. */
+
+#define LEN_BUFFER 17408 /* 16384 + 1024, clj28xx used 16396 */
+#define LEN_DEVICE_ID_STRING 4096
+#define LEN_STRING_OPTION_VALUE 20
+#define LEN_MODEL_RESPONSE 20
+
+#define PAD_VALUE_LINEART 0
+#define PAD_VALUE_GRAYSCALE_COLOR -1
+
+enum hpaioOption_e {
+
+ OPTION_FIRST = 0,
+ OPTION_NUM_OPTIONS = 0,
+
+ GROUP_SCAN_MODE,
+ OPTION_SCAN_MODE,
+ OPTION_SCAN_RESOLUTION,
+ GROUP_ADVANCED,
+ OPTION_CONTRAST,
+ OPTION_COMPRESSION,
+ OPTION_JPEG_COMPRESSION_FACTOR,
+ OPTION_BATCH_SCAN,
+ OPTION_ADF_MODE,
+ OPTION_DUPLEX,
+
+ GROUP_GEOMETRY,
+ OPTION_LENGTH_MEASUREMENT,
+ OPTION_TL_X,
+ OPTION_TL_Y,
+ OPTION_BR_X,
+ OPTION_BR_Y,
+
+ OPTION_LAST };
+
+//#define STR_SCAN_MODE_LINEART "Lineart"
+//#define STR_SCAN_MODE_GRAYSCALE "Grayscale"
+//#define STR_SCAN_MODE_COLOR "Color"
+
+enum hpaioScanMode_e { SCAN_MODE_FIRST = 0,
+ SCAN_MODE_LINEART = 0,
+ SCAN_MODE_GRAYSCALE,
+ SCAN_MODE_COLOR,
+ SCAN_MODE_LAST
+ };
+
+#define COMPRESSION_NONE 0x01
+#define COMPRESSION_MH 0x02
+#define COMPRESSION_MR 0x04
+#define COMPRESSION_MMR 0x08
+#define COMPRESSION_JPEG 0x10
+
+#define ADF_MODE_AUTO 0x01 /* flatbed or ADF */
+#define ADF_MODE_FLATBED 0x02 /* flatbed only */
+#define ADF_MODE_ADF 0x04 /* ADF only */
+
+#define LENGTH_MEASUREMENT_UNKNOWN 0
+#define LENGTH_MEASUREMENT_UNLIMITED 1
+#define LENGTH_MEASUREMENT_APPROXIMATE 2
+#define LENGTH_MEASUREMENT_PADDED 3
+#define LENGTH_MEASUREMENT_EXACT 4
+
+struct hpaioScanner_s
+{
+ char *tag; /* handle identifier */
+ char deviceuri[128];
+ HPMUD_DEVICE deviceid;
+ HPMUD_CHANNEL scan_channelid;
+ HPMUD_CHANNEL cmd_channelid;
+
+ struct hpaioScanner_s * prev;
+ struct hpaioScanner_s * next;
+
+ SANE_Device saneDevice; /* "vendor", "model" dynamically allocated. */
+ SANE_Parameters prescanParameters;
+ SANE_Parameters scanParameters;
+
+ struct PmlObject_s * firstPmlObject;
+ struct PmlObject_s * lastPmlObject;
+
+ enum { SCANNER_TYPE_SCL, SCANNER_TYPE_PML } scannerType;
+ int decipixelsPerInch;
+
+ /* These are bitfields of COMPRESSION_* values. */
+ int supportsScanMode[SCAN_MODE_LAST];
+ SANE_String_Const scanModeList[MAX_LIST_SIZE];
+ enum hpaioScanMode_e currentScanMode, effectiveScanMode;
+
+ SANE_Range resolutionRange;
+ SANE_Int resolutionList[MAX_LIST_SIZE];
+ SANE_Int lineartResolutionList[MAX_LIST_SIZE]; /* 300 dpi. */
+ SANE_Int currentResolution, effectiveResolution;
+
+ SANE_Range contrastRange;
+ SANE_Int defaultContrast, currentContrast;
+
+ SANE_String_Const compressionList[MAX_LIST_SIZE];
+ int defaultCompression[SCAN_MODE_LAST];
+ SANE_Int currentCompression; /* One of the COMPRESSION_* values. */
+
+ SANE_Range jpegCompressionFactorRange;
+ SANE_Int defaultJpegCompressionFactor;
+ SANE_Int currentJpegCompressionFactor;
+
+ SANE_Bool currentBatchScan;
+ int beforeScan;
+ int alreadyPreAdvancedDocument;
+ int alreadyPostAdvancedDocument;
+ int noDocsConditionPending;
+
+ int supportedAdfModes;
+ SANE_String_Const adfModeList[MAX_LIST_SIZE];
+ int currentAdfMode;
+ int currentPageNumber;
+
+ int supportsDuplex;
+ SANE_Bool currentDuplex;
+ int currentSideNumber;
+
+ SANE_Int currentLengthMeasurement;
+ SANE_String_Const lengthMeasurementList[MAX_LIST_SIZE];
+
+ SANE_Range tlxRange, tlyRange, brxRange, bryRange;
+ SANE_Fixed currentTlx, currentTly, currentBrx, currentBry;
+ SANE_Fixed effectiveTlx,
+ effectiveTly,
+ effectiveBrx,
+ effectiveBry;
+
+ SANE_Option_Descriptor option[OPTION_LAST];
+
+ Mfpdtf_t mfpdtf;
+ IP_HANDLE hJob;
+ int fromDenali;
+ int preDenali;
+ int denali;
+ unsigned char inBuffer[LEN_BUFFER]; /* mfpdtf block buffer */
+ int bufferOffset;
+ int bufferBytesRemaining;
+ int totalBytesRemaining;
+ int endOfData;
+ int BlockSize; /* mfpdtf block size, including fixed header */
+ int BlockIndex; /* record index in mfpdtf block */
+ int RecordSize; /* record size, does not include header */
+ int RecordIndex; /* data index in record */
+ int mfpdtf_done;
+ int mfpdtf_timeout_cnt;
+ int pml_timeout_cnt; /* pml done timeout count */
+ int pml_done;
+ int ip_done;
+ int page_done;
+ int upload_state; /* last pml upload state */
+ int user_cancel; /* user cancelled operation */
+
+ struct
+ {
+ char compat1150[LEN_MODEL_RESPONSE + 1];
+ char compatPost1150[LEN_MODEL_RESPONSE + 1];
+ int compat;
+ char decipixelChar;
+
+ int minRes, maxRes;
+ int maxXExtent, maxYExtent;
+ int unloadAfterScan;
+ int flatbedCapability, adfCapability;
+ int minResAdf, maxResAdf;
+
+ PmlObject_t objSupportedFunctions;
+ } scl;
+
+ struct
+ {
+ PmlObject_t objScannerStatus,
+ objResolutionRange,
+ objUploadTimeout,
+ objContrast,
+ objResolution,
+ objPixelDataType,
+ objCompression,
+ objCompressionFactor,
+ objUploadError,
+ objUploadState,
+ objAbcThresholds,
+ objSharpeningCoefficient,
+ objNeutralClipThresholds,
+ objToneMap,
+ objCopierReduction,
+ objScanToken,
+ objModularHardware;
+
+ char scanToken[ PML_MAX_VALUE_LEN ];
+ char zeroScanToken[ PML_MAX_VALUE_LEN ];
+ int lenScanToken;
+ int scanTokenIsSet;
+
+ int openFirst;
+ int dontResetBeforeNextNonBatchPage;
+ int startNextBatchPageEarly;
+ int flatbedCapability;
+
+ int alreadyRestarted;
+ int scanDone;
+ int previousUploadState;
+ } pml;
+};
+
+typedef struct hpaioScanner_s * hpaioScanner_t;
+typedef struct hpaioScanner_s HPAIO_RECORD;
+
+#define UNDEFINED_MODEL(hpaio) (!hpaio->saneDevice.model)
+
+#define _SET_DEFAULT_MODEL(hpaio,s,len) \
+ do { \
+ if (UNDEFINED_MODEL(hpaio)) { \
+ hpaio->saneDevice.model=malloc(len+1); \
+ memcpy((char *)hpaio->saneDevice.model,s,len); \
+ ((char *)hpaio->saneDevice.model)[len]=0; \
+ } \
+ } while(0)
+#define SET_DEFAULT_MODEL(hpaio,s) _SET_DEFAULT_MODEL(hpaio,s,strlen(s))
+
+#define FIX_GEOMETRY(low,high,min,max) \
+ do { \
+ if (high<low) high=low; \
+ if (high==low) { \
+ if (high==max) { \
+ low--; \
+ } else { \
+ high++; \
+ } \
+ } \
+ } while(0)
+
+SANE_Status __attribute__ ((visibility ("hidden"))) hpaioScannerToSaneStatus( hpaioScanner_t hpaio );
+SANE_Status __attribute__ ((visibility ("hidden"))) hpaioScannerToSaneError( hpaioScanner_t hpaio );
+void sane_hpaio_cancel(SANE_Handle handle);
+
+#endif
diff --git a/scan/sane/http.c b/scan/sane/http.c
new file mode 100644
index 0000000..8c1578e
--- /dev/null
+++ b/scan/sane/http.c
@@ -0,0 +1,618 @@
+/************************************************************************************\
+ http.c - HTTP/1.1 feeder and consumer
+
+ (c) 2008 Copyright Hewlett-Packard Development Company, LP
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+ of the Software, and to permit persons to whom the Software is furnished to do
+ so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+ In order to support state-less connections, each HTTP/1.1 connection or session
+ must start with http_open and end with http_close.
+
+ Author: Naga Samrat Chowdary, Narla
+ Contributing Author: Sarbeswar Meher
+\************************************************************************************/
+
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <syslog.h>
+#include <ctype.h>
+#include "hpmud.h"
+#include "http.h"
+
+//#define HTTP_DEBUG
+
+#define _STRINGIZE(x) #x
+#define STRINGIZE(x) _STRINGIZE(x)
+
+#define BUG(args...) syslog(LOG_ERR, __FILE__ " " STRINGIZE(__LINE__) ": " args)
+
+#ifdef HTTP_DEBUG
+ #define DBG(args...) syslog(LOG_INFO, __FILE__ " " STRINGIZE(__LINE__) ": " args)
+ #define DBG_DUMP(data, size) sysdump((data), (size))
+ #define DBG_SZ(args...) syslog(LOG_INFO, args)
+#else
+ #define DBG(args...)
+ #define DBG_DUMP(data, size)
+ #define DBG_SZ(args...)
+#endif
+
+#define EXCEPTION_TIMEOUT 45 /* seconds */
+
+enum HTTP_STATE
+{
+ HS_ACTIVE = 1,
+ HS_EOF,
+};
+
+struct stream_buffer
+{
+ char buf[4096];
+ int index;
+ int cnt;
+};
+
+struct http_session
+{
+ enum HTTP_STATE state;
+ int http_status;
+ int footer; /* current footer */
+ int total;
+ HPMUD_DEVICE dd; /* hpiod device descriptor */
+ HPMUD_CHANNEL cd; /* hpiod soap channel descriptor */
+ struct stream_buffer s;
+};
+
+#if 0
+static char *strnstr(const char *haystack, const char *needle, size_t n)
+{
+ int i, len=strlen(needle);
+
+ for (i=0; *haystack && i<n; ++haystack, i++)
+ {
+ if (strncmp(haystack, needle, len) == 0)
+ {
+ return ((char *)haystack);
+ }
+ }
+ return 0;
+}
+#endif
+
+#if 0
+static void sysdump(const void *data, int size)
+{
+ /* Dump size bytes of *data. Output looks like:
+ * [0000] 75 6E 6B 6E 6F 77 6E 20 30 FF 00 00 00 00 39 00 unknown 0.....9.
+ */
+
+ unsigned char *p = (unsigned char *)data;
+ unsigned char c;
+ int n;
+ char bytestr[4] = {0};
+ char addrstr[10] = {0};
+ char hexstr[16*3 + 5] = {0};
+ char charstr[16*1 + 5] = {0};
+ for(n=1;n<=size;n++) {
+ if (n%16 == 1) {
+ /* store address for this line */
+ snprintf(addrstr, sizeof(addrstr), "%.4d", (int)((p-(unsigned char *)data) & 0xffff));
+ }
+
+ c = *p;
+ if (isprint(c) == 0) {
+ c = '.';
+ }
+
+ /* store hex str (for left side) */
+ snprintf(bytestr, sizeof(bytestr), "%02X ", *p);
+ strncat(hexstr, bytestr, sizeof(hexstr)-strlen(hexstr)-1);
+
+ /* store char str (for right side) */
+ snprintf(bytestr, sizeof(bytestr), "%c", c);
+ strncat(charstr, bytestr, sizeof(charstr)-strlen(charstr)-1);
+
+ if(n%16 == 0) {
+ /* line completed */
+ DBG_SZ("[%4.4s] %-50.50s %s\n", addrstr, hexstr, charstr);
+ hexstr[0] = 0;
+ charstr[0] = 0;
+ }
+ p++; /* next byte */
+ }
+
+ if (strlen(hexstr) > 0) {
+ /* print rest of buffer if not empty */
+ DBG_SZ("[%4.4s] %-50.50s %s\n", addrstr, hexstr, charstr);
+ }
+}
+#endif
+
+/* Read data into stream buffer. Return specified "size" or less. Unused data is left in the stream. */
+static int read_stream(struct http_session *ps, char *data, int size, int sec_timeout, int *bytes_read)
+{
+ int len, stat=1;
+ int tmo=sec_timeout; /* initial timeout */
+ int max=sizeof(ps->s.buf);
+ enum HPMUD_RESULT ret;
+
+ DBG("read_stream() ps=%p data=%p size=%d timeout=%d s.index=%d s.cnt=%d\n", ps, data, size, sec_timeout, ps->s.index, ps->s.cnt);
+
+ *bytes_read = 0;
+
+ /* Return any data in the stream first. */
+ if (ps->s.cnt)
+ {
+ if (ps->s.cnt > size)
+ {
+ /* Return part of stream buffer. */
+ len = size;
+ memcpy(data, &ps->s.buf[ps->s.index], len);
+ ps->s.index += len;
+ ps->s.cnt -= len;
+ }
+ else
+ {
+ /* Return all of rbuf. */
+ len = ps->s.cnt;
+ memcpy(data, &ps->s.buf[ps->s.index], len);
+ ps->s.index = ps->s.cnt = 0; /* stream is empty reset */
+ }
+ *bytes_read = len;
+ DBG("-read_stream() bytes_read=%d s.index=%d s.cnt=%d\n", len, ps->s.index, ps->s.cnt);
+ return 0;
+ }
+
+ /* Stream is empty read more data from device. */
+ ret = hpmud_read_channel(ps->dd, ps->cd, &ps->s.buf[ps->s.index], max-(ps->s.index + ps->s.cnt), tmo, &len);
+ if (ret == HPMUD_R_IO_TIMEOUT)
+ {
+ BUG("timeout reading data sec_timeout=%d\n", tmo);
+ goto bugout;
+ }
+ if (ret != HPMUD_R_OK)
+ {
+ BUG("read_stream error stat=%d\n", ret);
+ goto bugout;
+ }
+ if (len==0)
+ {
+ BUG("read_stream error len=0\n"); /* shouldn't happen, but it does with jetdirect */
+ goto bugout;
+ }
+
+ DBG("read_channel len=%d\n", len);
+ ps->s.cnt += len;
+
+ if (ps->s.cnt > size)
+ {
+ /* Return part of stream buffer. */
+ len = size;
+ memcpy(data, &ps->s.buf[ps->s.index], len);
+ ps->s.index += len;
+ ps->s.cnt -= len;
+ }
+ else
+ {
+ /* Return all of rbuf. */
+ len = ps->s.cnt;
+ memcpy(data, &ps->s.buf[ps->s.index], len);
+ ps->s.index = ps->s.cnt = 0; /* stream is empty reset */
+ }
+
+ *bytes_read = len;
+ stat = 0;
+ DBG("-read_stream() bytes_read=%d s.index=%d s.cnt=%d\n", len, ps->s.index, ps->s.cnt);
+
+bugout:
+ return stat;
+}
+
+static int read_char(struct http_session *ps, int sec_timeout)
+{
+ unsigned char ch;
+ int len;
+ if (read_stream(ps, (char *)&ch, 1, sec_timeout, &len))
+ return -1;
+ else
+ return ch;
+}
+
+/* Read a line of data. Line length is not known. */
+static int read_line(struct http_session *ps, char *line, int line_size, int sec_timeout, int *bytes_read)
+{
+ int total=0, stat=1;
+ int ch, cr=0, lf=0;
+ int tmo=sec_timeout; /* initial timeout */
+
+ *bytes_read = 0;
+
+ while (total < (line_size-1))
+ {
+ ch = read_char(ps, tmo);
+ line[total++]=ch;
+
+ if (ch == '\r')
+ cr=1;
+ else if (ch == '\n' && cr)
+ break; /* done, found CRLF */
+ else if (ch == '\n' && lf)
+ break; /* done, found LFLF (for kiwi "501 Not Implemented") */
+ else if (ch == '\n')
+ lf=1;
+ else if (ch == -1)
+ goto bugout; /* error */
+ else
+ {
+ cr=0;
+ lf=0;
+ }
+ tmo=3; /* changed 1 to 3 for 1200dpi uncompressed, DES 8/20/08. */
+ }
+ stat = 0;
+
+bugout:
+ line[total]=0;
+ *bytes_read=total; /* length does not include null termination */
+ DBG("read_line len=%d index=%d cnt=%d\n", total, ps->s.index, ps->s.cnt);
+ return stat;
+}
+
+/* Http_open must be called for each HTTP/1.1 connection or session. */
+enum HTTP_RESULT __attribute__ ((visibility ("hidden"))) http_open(HPMUD_DEVICE dd, const char *channel, HTTP_HANDLE *handle)
+{
+ struct http_session *ps;
+ enum HTTP_RESULT stat = HTTP_R_IO_ERROR;
+
+ DBG("http_open() dd=%d channel=%s handle=%p\n", dd, channel, handle);
+
+ *handle = NULL;
+
+ if ((ps = malloc(sizeof(struct http_session))) == NULL)
+ {
+ BUG("malloc failed: %m\n");
+ return HTTP_R_MALLOC_ERROR;
+ }
+ memset(ps, 0, sizeof(struct http_session));
+
+ ps->dd = dd;
+ if (hpmud_open_channel(ps->dd, channel, &ps->cd) != HPMUD_R_OK)
+ {
+ BUG("unable to open %s channel\n", channel);
+ goto bugout;
+ }
+
+ ps->state = HS_ACTIVE;
+ *handle = ps;
+ stat = HTTP_R_OK;
+
+bugout:
+ if (stat != HTTP_R_OK)
+ free(ps);
+ return stat;
+}
+
+/* Http_close must be called after the HTTP/1.1 connection closes. */
+enum HTTP_RESULT __attribute__ ((visibility ("hidden"))) http_close(HTTP_HANDLE handle)
+{
+ struct http_session *ps = (struct http_session *)handle;
+ DBG("http_close() handle=%p\n", handle);
+ if (ps->cd > 0)
+ hpmud_close_channel(ps->dd, ps->cd);
+ free(ps);
+ return HTTP_R_OK;
+}
+
+/* Read HTTP/1.1 header. Blocks until header is read or timeout. */
+enum HTTP_RESULT __attribute__ ((visibility ("hidden"))) http_read_header(HTTP_HANDLE handle, void *data, int max_size, int sec_timeout, int *bytes_read)
+{
+ struct http_session *ps = (struct http_session *)handle;
+ int len, total;
+ int tmo=sec_timeout; /* set initial timeout */
+ enum HTTP_RESULT stat = HTTP_R_IO_ERROR;
+
+ DBG("http_read_header() handle=%p data=%p size=%d sectime=%d\n", handle, data, max_size, sec_timeout);
+
+ *bytes_read = 0;
+
+ /* Read initial HTTP/1.1 header status line. */
+ if (read_line(ps, data, max_size, tmo, &len))
+ goto bugout;
+ ps->http_status = strtol(data+9, NULL, 10);
+ *bytes_read = total = len;
+
+ /* Check for good status, ignore 400 (no job id found for JobCancelRequest) */
+ if (!((ps->http_status >= 200 && ps->http_status < 300) || ps->http_status == 400))
+ {
+ BUG("invalid http_status=%d\n", ps->http_status);
+
+ /* Dump any outstanding payload here. */
+ while (!read_stream(ps, data, max_size, 1, &len))
+ BUG("dumping len=%d\n", len);
+ goto bugout;
+ }
+
+ /* Read rest of header. Look for blank line. */
+ *bytes_read = total = len;
+ while (len > 2)
+ {
+ if (read_line(ps, data+total, max_size-total, tmo, &len))
+ goto bugout;
+ total += len;
+ *bytes_read += len;
+ DBG("http_read_header data=%s len=%d total=%d\n", (char*)data+total, len, total);
+ }
+ stat = HTTP_R_OK;
+
+ DBG("-http_read_header() handle=%p data=%p bytes_read=%d size=%d status=%d\n", handle, data, *bytes_read, max_size, stat);
+
+bugout:
+ return stat;
+};
+
+/* Reads data from HTTP/1.1 chunked data stream until EOF. Returns max_size or less. */
+enum HTTP_RESULT __attribute__ ((visibility ("hidden"))) http_read_payload(HTTP_HANDLE handle, void *data, int max_size, int sec_timeout, int *bytes_read)
+{
+ struct http_session *ps = (struct http_session *)handle;
+ char line[128];
+ int len;
+ int tmo=sec_timeout; /* set initial timeout */
+ enum HTTP_RESULT stat = HTTP_R_IO_ERROR;
+
+ DBG("http_read_payload() handle=%p data=%p size=%d sectime=%d\n", handle, data, max_size, sec_timeout);
+
+ *bytes_read = 0;
+
+ if (ps->state == HS_EOF)
+ {
+ stat = HTTP_R_EOF;
+ }
+ else
+ {
+ if (ps->footer)
+ {
+ /* Footer is not complete. Continue reading payload. */
+ if (read_stream(ps, data, ps->footer < max_size ? ps->footer : max_size, tmo, &len))
+ goto bugout;
+
+ ps->total += len;
+ ps->footer -= len;
+ *bytes_read = len;
+
+ if (ps->footer == 0)
+ if (read_line(ps, line, sizeof(line), tmo, &len)) /* footer is complete, eat CRLF */
+ goto bugout;
+
+ stat = HTTP_R_OK;
+ }
+ else
+ {
+ /* Read new footer. */
+ if (read_line(ps, line, sizeof(line), tmo, &len))
+ goto bugout;
+ ps->footer = strtol(line, NULL, 16);
+
+ /* Check for zero footer. */
+ if (ps->footer == 0)
+ {
+ /* Done eat blank line. */
+ read_line(ps, line, sizeof(line), 1, &len);
+ ps->state = HS_EOF;
+ stat = HTTP_R_EOF;
+ }
+ else
+ {
+ /* Got a valid footer, continue reading payload. */
+ if (read_stream(ps, data, ps->footer < max_size ? ps->footer : max_size, tmo, &len))
+ goto bugout;
+
+ ps->total += len;
+ ps->footer -= len;
+ *bytes_read = len;
+
+ if (ps->footer == 0)
+ if (read_line(ps, line, sizeof(line), tmo, &len)) /* footer is complete, eat CRLF */
+ goto bugout;
+
+ stat = HTTP_R_OK;
+ }
+ }
+ } /* if (ps->state == HS_EOF) */
+
+ DBG("-http_read_payload() handle=%p data=%p bytes_read=%d size=%d status=%d\n", handle, data, *bytes_read, max_size, stat);
+
+bugout:
+ return stat;
+};
+
+/* Reads data from HTTP/1.1 chunked data stream until EOF. Returns max_size or less. */
+enum HTTP_RESULT __attribute__ ((visibility ("hidden"))) http_read(HTTP_HANDLE handle, void *data, int max_size, int sec_timeout, int *bytes_read)
+{
+ struct http_session *ps = (struct http_session *)handle;
+ char line[128] ={0,};
+ int len = 0, ret;
+ int tmo=sec_timeout; /* set initial timeout */
+ enum HTTP_RESULT stat = HTTP_R_IO_ERROR;
+ int total_payload_length=*bytes_read;
+
+ DBG("http_read() handle=%p data=%p size=%d sectime=%d total_payload_length=%d\n", handle, data, max_size, sec_timeout, total_payload_length);
+
+ ps->footer=total_payload_length;
+
+ *bytes_read = 0;
+
+ /* Read new footer. */
+ if (ps->footer) //Payload length is known
+ {
+ while(ps->footer)
+ {
+ if (read_line(ps, line, sizeof(line), tmo, &len))
+ {
+ *bytes_read = (ps->footer) * (-1) + 12;
+ goto bugout;
+ }
+ strcpy(data, line);
+ data=data+len;
+ ps->footer -= len;
+ *bytes_read += len;
+ }
+ }
+ else
+ {
+ while(1)
+ {
+ ret = read_line (ps, line, sizeof(line), tmo, &len);
+ *bytes_read += len;
+ if(ret) //failed to read line
+ {
+ ps->footer = 0;
+ break;
+ }
+ strcpy(data, line);
+ data = data + len;
+ DBG("http_read len=%d datalen=%d data=%s\n", len, strlen((char*)data), (char*)data);
+ //Check for the footer
+ if (strncmp(data-7, ZERO_FOOTER, sizeof(ZERO_FOOTER)-1) == 0)
+ {
+ ps->footer = 0;
+ break;
+ }
+ }//end while(1)
+ }//end else
+ stat = HTTP_R_OK;
+ if(ps->footer == 0) stat=HTTP_R_EOF;
+
+ DBG("-http_read() handle=%p data=%p bytes_read=%d size=%d status=%d\n", handle, data, *bytes_read, max_size, stat);
+
+bugout:
+ return stat;
+};
+
+enum HTTP_RESULT __attribute__ ((visibility ("hidden"))) http_read_size(HTTP_HANDLE handle, void *data, int max_size, int sec_timeout, int *bytes_read)
+{
+ struct http_session *ps = (struct http_session *)handle;
+ enum HTTP_RESULT stat = HTTP_R_IO_ERROR;
+
+ if(ps && ps->state == HTTP_R_EOF) return HTTP_R_EOF;
+ if(max_size == -1)
+ {
+ ps->state = HTTP_R_EOF;
+ return HTTP_R_EOF;
+ }
+
+ DBG("http_read_size() handle=%p data=%p size=%d sectime=%d\n", handle, data, max_size, sec_timeout);
+
+ *bytes_read=0;
+ while(*bytes_read < max_size)
+ {
+ *((char*)data + (*bytes_read)) = read_char(ps, sec_timeout);
+ *bytes_read = *bytes_read+1;
+ }
+
+ return stat = HTTP_R_OK;
+}
+
+/* Write data to HTTP/1.1 connection. Blocks until all data is written or timeout. Caller formats header, footer and payload. */
+enum HTTP_RESULT __attribute__ ((visibility ("hidden"))) http_write(HTTP_HANDLE handle, void *data, int size, int sec_timeout)
+{
+ struct http_session *ps = (struct http_session *)handle;
+ int len;
+ int tmo=sec_timeout; /* set initial timeout */
+ enum HTTP_RESULT stat = HTTP_R_IO_ERROR;
+
+ DBG("http_write() handle=%p data=%p size=%d sectime=%d\n", handle, data, size, sec_timeout);
+
+ if (hpmud_write_channel(ps->dd, ps->cd, data, size, tmo, &len) != HPMUD_R_OK)
+ {
+ BUG("unable to write channel data\n");
+ goto bugout;
+ }
+
+ stat = HTTP_R_OK;
+
+bugout:
+ return stat;
+}
+
+void __attribute__ ((visibility ("hidden"))) http_unchunk_data(char *buffer)
+{
+ char *temp=buffer;
+ char *p=buffer;
+ int chunklen = 0;
+
+ //Here buffer starts like "<?xml....". There is no chunklen, only buffer
+ if (*p == '<')
+ {
+ while(*p)
+ {
+ if (!(*p == '\n' || *p == '\r' || *p =='\t'))
+ {
+ *temp = *p;
+ temp++;
+ }
+ p++;
+ }
+ *temp = '\0';
+ return;
+ }
+ /*Here buffer looks like "chunklen data chunklen data 0"
+ e.g "FE3 <?xml.... 8E8 ... 0"*/
+ while(1)
+ {
+ while(*p != '\n' && *p != '\r')
+ {
+ chunklen = chunklen << 4 ; //Multiply 16
+ if ('0' <= *p && *p<='9')
+ chunklen += *p - '0';
+ else if ('A' <= *p && *p <= 'F')
+ chunklen += 10 - 'A' + *p;
+ else if ('a' <= *p && *p <= 'f')
+ chunklen += 10 + *p - 'a';
+ else
+ {
+ chunklen = chunklen >> 4;
+ break;
+ }
+ p++;
+ }//end while()
+ if (chunklen == 0)
+ break ;
+ while(*p == '\n' || *p == '\r' || *p =='\t') p++;
+ //copy the data till chunklen
+ while(chunklen > 0)
+ {
+ if (!(*p == '\n' || *p == '\r' || *p =='\t'))
+ {
+ *temp = *p ;
+ temp++;
+ }
+ p++;
+ chunklen--;
+ }
+ while(*p == '\n' || *p == '\r' || *p =='\t') p++;
+ }//end while(1)
+ *temp = '\0';
+}
+
+
+
+
diff --git a/scan/sane/http.h b/scan/sane/http.h
new file mode 100755
index 0000000..cfde791
--- /dev/null
+++ b/scan/sane/http.h
@@ -0,0 +1,55 @@
+/************************************************************************************\
+
+ http.h - HTTP/1.1 feeder and consumer
+
+ (c) 2008 Copyright Hewlett-Packard Development Company, LP
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+ of the Software, and to permit persons to whom the Software is furnished to do
+ so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+ Primary Author: Naga Samrat Chowdary, Narla
+ Contributing Author: Sarbeswar Meher
+\************************************************************************************/
+
+#ifndef _HTTP_H
+#define _HTTP_H
+
+enum HTTP_RESULT
+{
+ HTTP_R_OK = 0,
+ HTTP_R_IO_ERROR,
+ HTTP_R_EOF,
+ HTTP_R_IO_TIMEOUT,
+ HTTP_R_MALLOC_ERROR,
+ HTTP_R_INVALID_BUF_SIZE,
+};
+
+# define ZERO_FOOTER "\r\n0\r\n\r\n"
+
+typedef void * HTTP_HANDLE;
+
+enum HTTP_RESULT __attribute__ ((visibility ("hidden"))) http_open(HPMUD_DEVICE dd, const char *hpmud_channel, HTTP_HANDLE *handle);
+enum HTTP_RESULT __attribute__ ((visibility ("hidden"))) http_close(HTTP_HANDLE handle);
+enum HTTP_RESULT __attribute__ ((visibility ("hidden"))) http_read_header(HTTP_HANDLE handle, void *data, int max_size, int sec_timout, int *bytes_read);
+enum HTTP_RESULT __attribute__ ((visibility ("hidden"))) http_read_payload(HTTP_HANDLE handle, void *data, int max_size, int sec_timout, int *bytes_read);
+enum HTTP_RESULT __attribute__ ((visibility ("hidden"))) http_read(HTTP_HANDLE handle, void *data, int max_size, int sec_timout, int *bytes_read);
+enum HTTP_RESULT __attribute__ ((visibility ("hidden"))) http_read_size(HTTP_HANDLE handle, void *data, int max_size, int sec_timout, int *bytes_read);
+enum HTTP_RESULT __attribute__ ((visibility ("hidden"))) http_write(HTTP_HANDLE handle, void *data, int data_size, int sec_timout);
+void __attribute__ ((visibility ("hidden"))) http_unchunk_data(char *buffer);
+#endif // _HTTP_H
+
+
diff --git a/scan/sane/io.c b/scan/sane/io.c
new file mode 100755
index 0000000..1f15864
--- /dev/null
+++ b/scan/sane/io.c
@@ -0,0 +1,140 @@
+/************************************************************************************\
+
+ io.c - HP SANE backend for multi-function peripherals (libsane-hpaio)
+
+ (c) 2001-2008 Copyright Hewlett-Packard Development Company, LP
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+ of the Software, and to permit persons to whom the Software is furnished to do
+ so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+ Contributing Authors: Don Welch, David Suffield
+
+\************************************************************************************/
+
+#include <stdio.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <pwd.h>
+#include "hpmud.h"
+#include "common.h"
+#include "pml.h"
+#include "io.h"
+#ifdef HAVE_DBUS
+#include <dbus/dbus.h>
+#endif
+#define DEBUG_DECLARE_ONLY
+#include "sanei_debug.h"
+
+#ifdef HAVE_DBUS
+DBusError dbus_err;
+DBusConnection * dbus_conn;
+
+int __attribute__ ((visibility ("hidden"))) InitDbus(void)
+{
+ dbus_error_init(&dbus_err);
+ dbus_conn = dbus_bus_get(DBUS_BUS_SYSTEM, &dbus_err);
+
+ if (dbus_error_is_set(&dbus_err))
+ {
+ BUG("dBus Connection Error (%s)!\n", dbus_err.message);
+ dbus_error_free(&dbus_err);
+ }
+
+ if (NULL == dbus_conn)
+ {
+ return 0;
+ }
+
+ return 1;
+}
+
+int __attribute__ ((visibility ("hidden"))) SendScanEvent(char *device_uri, int event)
+{
+ DBusMessage * msg = dbus_message_new_signal(DBUS_PATH, DBUS_INTERFACE, "Event");
+ char * printer = "";
+ char * title = "";
+ int jobid = 0;
+ char * username = "";
+
+ uid_t uid = getuid();
+ struct passwd *p = getpwuid (uid);
+ username = p->pw_name;
+
+ if (NULL == username)
+ username = "";
+
+ if (NULL == msg)
+ {
+ BUG("dbus message is NULL!\n");
+ return 0;
+ }
+
+ dbus_message_append_args(msg,
+ DBUS_TYPE_STRING, &device_uri,
+ DBUS_TYPE_STRING, &printer,
+ DBUS_TYPE_UINT32, &event,
+ DBUS_TYPE_STRING, &username,
+ DBUS_TYPE_UINT32, &jobid,
+ DBUS_TYPE_STRING, &title,
+ DBUS_TYPE_INVALID);
+
+ if (!dbus_connection_send(dbus_conn, msg, NULL))
+ {
+ BUG("dbus message send failed!\n");
+ return 0;
+ }
+
+ dbus_connection_flush(dbus_conn);
+ dbus_message_unref(msg);
+
+ return 1;
+}
+#else
+int __attribute__ ((visibility ("hidden"))) InitDbus(void)
+{
+ return 1;
+}
+int __attribute__ ((visibility ("hidden"))) SendScanEvent(char *device_uri, int event)
+{
+ return 1;
+}
+#endif /* HAVE_DBUS */
+
+/* Read full requested data length in BUFFER_SIZE chunks. Return number of bytes read. */
+int __attribute__ ((visibility ("hidden"))) ReadChannelEx(int deviceid, int channelid, unsigned char * buffer, int length, int timeout)
+{
+ int n, len, size, total=0;
+ enum HPMUD_RESULT stat;
+
+ size = length;
+
+ while(size > 0)
+ {
+ len = size > HPMUD_BUFFER_SIZE ? HPMUD_BUFFER_SIZE : size;
+
+ stat = hpmud_read_channel(deviceid, channelid, buffer+total, len, timeout, &n);
+ if (n <= 0)
+ {
+ break; /* error or timeout */
+ }
+ size-=n;
+ total+=n;
+ }
+
+ return total;
+}
+
diff --git a/scan/sane/io.h b/scan/sane/io.h
new file mode 100755
index 0000000..a47bc8b
--- /dev/null
+++ b/scan/sane/io.h
@@ -0,0 +1,58 @@
+/************************************************************************************\
+
+ io.h - HP SANE backend for multi-function peripherals (libsane-hpaio)
+
+ (c) 2001-2006 Copyright Hewlett-Packard Development Company, LP
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+ of the Software, and to permit persons to whom the Software is furnished to do
+ so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+ Contributing Author: Don Welch, David Suffield, Naga Samrat Chowdary Narla,
+ Sarbeswar Meher
+\************************************************************************************/
+
+#if !defined(_IO_H)
+#define _IO_H
+
+#include "sane.h"
+#include "hpmud.h"
+
+int __attribute__ ((visibility ("hidden"))) InitDbus(void);
+int __attribute__ ((visibility ("hidden"))) SendScanEvent(char * device_uri, int event);
+int __attribute__ ((visibility ("hidden"))) ReadChannelEx(int deviceid, int channelid, unsigned char * buffer, int length, int timeout);
+
+#define EVENT_START_SCAN_JOB 2000
+#define EVENT_END_SCAN_JOB 2001
+#define EVENT_SCANNER_FAIL 2002
+#define EVENT_PLUGIN_FAIL 2003
+#define EVENT_SCAN_ADF_LOADED 2004
+#define EVENT_SCAN_TO_DESTINATION_NOTSET = 2005
+#define EVENT_SCAN_WAITING_FOR_PC = 2006
+#define EVENT_SCAN_ADF_JAM 2007
+#define EVENT_SCAN_ADF_DOOR_OPEN 2008
+#define EVENT_SCAN_CANCEL 2009
+#define EVENT_SIZE_WARNING 2010
+#define EVENT_SCAN_ADF_NO_DOCS 2011
+#define EVENT_SCAN_ADF_MISPICK 2012
+#define EVENT_SCAN_BUSY 2013
+
+#define DBUS_INTERFACE "com.hplip.StatusService"
+#define DBUS_PATH "/"
+
+#endif
+
+
diff --git a/scan/sane/ledm.c b/scan/sane/ledm.c
new file mode 100644
index 0000000..d9a1a76
--- /dev/null
+++ b/scan/sane/ledm.c
@@ -0,0 +1,1015 @@
+/************************************************************************************
+
+ ledm.c - HP SANE backend support for LEDM based multi-function peripherals
+ (c) 2010 Copyright Hewlett-Packard Development Company, LP
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+ of the Software, and to permit persons to whom the Software is furnished to do
+ so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+ Primary Author: Naga Samrat Chowary, Narla
+ Contributing Authors: Yashwant Kumar Sahu,Sarbeswar Meher
+
+*************************************************************************************/
+
+# ifndef _GNU_SOURCE
+# define _GNU_SOURCE
+# endif
+
+# include <stdio.h>
+# include <syslog.h>
+# include <string.h>
+# include <unistd.h>
+# include <fcntl.h>
+# include <dlfcn.h>
+# include "common.h"
+# include "hpmud.h"
+# include "hpip.h"
+# include "ledm.h"
+# include "ledmi.h"
+# include "sane.h"
+# include "saneopts.h"
+# include "io.h"
+
+# define DEBUG_DECLARE_ONLY
+# include "sanei_debug.h"
+
+static struct ledm_session *session = NULL;
+
+/* Verify current x/y extents and set effective extents. */
+static int set_extents(struct ledm_session *ps)
+{
+ int stat = 0;
+
+ if ((ps->currentBrx > ps->currentTlx) && (ps->currentBrx - ps->currentTlx >= ps->min_width) && (ps->currentBrx - ps->currentTlx <= ps->tlxRange.max))
+ {
+ ps->effectiveTlx = ps->currentTlx;
+ ps->effectiveBrx = ps->currentBrx;
+ }
+ else
+ {
+ ps->effectiveTlx = 0; /* current setting is not valid, zero it */
+ ps->effectiveBrx = 0;
+ stat = 1;
+ }
+ if ((ps->currentBry > ps->currentTly) && (ps->currentBry - ps->currentTly > ps->min_height) && (ps->currentBry - ps->currentTly <= ps->tlyRange.max))
+ {
+ ps->effectiveTly = ps->currentTly;
+ ps->effectiveBry = ps->currentBry;
+ }
+ else
+ {
+ ps->effectiveTly = 0; /* current setting is not valid, zero it */
+ ps->effectiveBry = 0;
+ stat = 1;
+ }
+ return stat;
+} /* set_extents */
+
+static struct ledm_session *create_session()
+{
+ struct ledm_session *ps;
+
+ if ((ps = malloc(sizeof(struct ledm_session))) == NULL)
+ {
+ return NULL;
+ }
+ memset(ps, 0, sizeof(struct ledm_session));
+ ps->tag = "LEDM";
+ ps->dd = -1;
+ ps->cd = -1;
+ ps->job_id = 0;
+ ps->page_id = 0;
+ return ps;
+}
+
+/* Get raw data (ie: uncompressed data) from image processor. */
+static int get_ip_data(struct ledm_session *ps, SANE_Byte *data, SANE_Int maxLength, SANE_Int *length)
+{
+ int ip_ret=IP_INPUT_ERROR;
+ unsigned int outputAvail=maxLength, outputUsed=0, outputThisPos;
+ unsigned char *input, *output = data;
+ unsigned int inputAvail, inputUsed=0, inputNextPos;
+
+ if (!ps->ip_handle)
+ {
+ goto bugout;
+ }
+
+ int eof;
+
+ eof=bb_get_image_data(ps, outputAvail);
+
+ if (ps->cnt > 0)
+ {
+ inputAvail = ps->cnt;
+ input = &ps->buf[ps->index];
+ }
+ else
+ {
+ input = NULL;
+ inputAvail = 0;
+ }
+
+
+ /* Transform input data to output. Note, output buffer may consume more bytes than input buffer (ie: jpeg to raster). */
+ ip_ret = ipConvert(ps->ip_handle, inputAvail, input, &inputUsed, &inputNextPos, outputAvail, output, &outputUsed, &outputThisPos);
+
+
+ DBG6("cnt=%d index=%d input=%p inputAvail=%d inputUsed=%d inputNextPos=%d output=%p outputAvail=%d outputUsed=%d outputThisPos=%d\n", ps->cnt, ps->index, input,
+ inputAvail, inputUsed, inputNextPos, output, outputAvail, outputUsed, outputThisPos);
+
+ if (input != NULL)
+ {
+ if (inputAvail == inputUsed)
+ {
+ ps->index = ps->cnt = 0; //
+ }
+ else
+ {
+ ps->cnt -= inputUsed; // save left over buffer for next soap_read
+ ps->index += inputUsed;
+ }
+ }
+
+ if (data)
+ *length = outputUsed;
+
+ /* For sane do not send output data simultaneously with IP_DONE. */
+ if (ip_ret & IP_DONE && outputUsed)
+ ip_ret &= ~IP_DONE;
+
+bugout:
+ return ip_ret;
+} /* get_ip_data */
+
+
+static int set_scan_mode_side_effects(struct ledm_session *ps, enum COLOR_ENTRY scanMode)
+{
+ int j=0;
+
+ memset(ps->compressionList, 0, sizeof(ps->compressionList));
+ memset(ps->compressionMap, 0, sizeof(ps->compressionMap));
+
+ switch (scanMode)
+ {
+ case CE_K1: /* same as GRAY8 */
+ case CE_GRAY8:
+ case CE_COLOR8:
+ default:
+// ps->compressionList[j] = STR_COMPRESSION_NONE;
+// ps->compressionMap[j++] = SF_RAW;
+ ps->compressionList[j] = STR_COMPRESSION_JPEG;
+ ps->compressionMap[j++] = SF_JPEG;
+ ps->currentCompression = SF_JPEG;
+ ps->option[LEDM_OPTION_JPEG_QUALITY].cap |= SANE_CAP_SOFT_SELECT; /* enable jpeg quality */
+ break;
+ }
+
+ return 0;
+} /* set_scan_mode_side_effects */
+
+static int set_input_source_side_effects(struct ledm_session *ps, enum INPUT_SOURCE source)
+{
+ switch (source)
+ {
+ case IS_PLATEN:
+ ps->min_width = ps->platen_min_width;
+ ps->min_height = ps->platen_min_height;
+ ps->tlxRange.max = ps->platen_tlxRange.max;
+ ps->brxRange.max = ps->platen_brxRange.max;
+ ps->tlyRange.max = ps->platen_tlyRange.max;
+ ps->bryRange.max = ps->platen_bryRange.max;
+ break;
+ case IS_ADF:
+ case IS_ADF_DUPLEX:
+ default:
+ ps->min_width = ps->adf_min_width;
+ ps->min_height = ps->adf_min_height;
+ ps->tlxRange.max = ps->adf_tlxRange.max;
+ ps->brxRange.max = ps->adf_brxRange.max;
+ ps->tlyRange.max = ps->adf_tlyRange.max;
+ ps->bryRange.max = ps->adf_bryRange.max;
+ break;
+ }
+
+ return 0;
+} /* set_input_source_side_effects */
+
+static int init_options(struct ledm_session *ps)
+{
+ ps->option[LEDM_OPTION_COUNT].name = "option-cnt";
+ ps->option[LEDM_OPTION_COUNT].title = SANE_TITLE_NUM_OPTIONS;
+ ps->option[LEDM_OPTION_COUNT].desc = SANE_DESC_NUM_OPTIONS;
+ ps->option[LEDM_OPTION_COUNT].type = SANE_TYPE_INT;
+ ps->option[LEDM_OPTION_COUNT].unit = SANE_UNIT_NONE;
+ ps->option[LEDM_OPTION_COUNT].size = sizeof(SANE_Int);
+ ps->option[LEDM_OPTION_COUNT].cap = SANE_CAP_SOFT_DETECT;
+ ps->option[LEDM_OPTION_COUNT].constraint_type = SANE_CONSTRAINT_NONE;
+
+ ps->option[LEDM_OPTION_GROUP_SCAN_MODE].name = "mode-group";
+ ps->option[LEDM_OPTION_GROUP_SCAN_MODE].title = SANE_TITLE_SCAN_MODE;
+ ps->option[LEDM_OPTION_GROUP_SCAN_MODE].type = SANE_TYPE_GROUP;
+
+ ps->option[LEDM_OPTION_SCAN_MODE].name = SANE_NAME_SCAN_MODE;
+ ps->option[LEDM_OPTION_SCAN_MODE].title = SANE_TITLE_SCAN_MODE;
+ ps->option[LEDM_OPTION_SCAN_MODE].desc = SANE_DESC_SCAN_MODE;
+ ps->option[LEDM_OPTION_SCAN_MODE].type = SANE_TYPE_STRING;
+ ps->option[LEDM_OPTION_SCAN_MODE].unit = SANE_UNIT_NONE;
+ ps->option[LEDM_OPTION_SCAN_MODE].size = MAX_STRING_SIZE;
+ ps->option[LEDM_OPTION_SCAN_MODE].cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT;
+ ps->option[LEDM_OPTION_SCAN_MODE].constraint_type = SANE_CONSTRAINT_STRING_LIST;
+ ps->option[LEDM_OPTION_SCAN_MODE].constraint.string_list = ps->scanModeList;
+
+ ps->option[LEDM_OPTION_INPUT_SOURCE].name = SANE_NAME_SCAN_SOURCE;
+ ps->option[LEDM_OPTION_INPUT_SOURCE].title = SANE_TITLE_SCAN_SOURCE;
+ ps->option[LEDM_OPTION_INPUT_SOURCE].desc = SANE_DESC_SCAN_SOURCE;
+ ps->option[LEDM_OPTION_INPUT_SOURCE].type = SANE_TYPE_STRING;
+ ps->option[LEDM_OPTION_INPUT_SOURCE].unit = SANE_UNIT_NONE;
+ ps->option[LEDM_OPTION_INPUT_SOURCE].size = MAX_STRING_SIZE;
+ ps->option[LEDM_OPTION_INPUT_SOURCE].cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT;
+ ps->option[LEDM_OPTION_INPUT_SOURCE].constraint_type = SANE_CONSTRAINT_STRING_LIST;
+ ps->option[LEDM_OPTION_INPUT_SOURCE].constraint.string_list = ps->inputSourceList;
+
+ ps->option[LEDM_OPTION_SCAN_RESOLUTION].name = SANE_NAME_SCAN_RESOLUTION;
+ ps->option[LEDM_OPTION_SCAN_RESOLUTION].title = SANE_TITLE_SCAN_RESOLUTION;
+ ps->option[LEDM_OPTION_SCAN_RESOLUTION].desc = SANE_DESC_SCAN_RESOLUTION;
+ ps->option[LEDM_OPTION_SCAN_RESOLUTION].type = SANE_TYPE_INT;
+ ps->option[LEDM_OPTION_SCAN_RESOLUTION].unit = SANE_UNIT_DPI;
+ ps->option[LEDM_OPTION_SCAN_RESOLUTION].size = sizeof(SANE_Int);
+ ps->option[LEDM_OPTION_SCAN_RESOLUTION].cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT;
+ ps->option[LEDM_OPTION_SCAN_RESOLUTION].constraint_type = SANE_CONSTRAINT_WORD_LIST;
+ ps->option[LEDM_OPTION_SCAN_RESOLUTION].constraint.word_list = ps->resolutionList;
+
+ ps->option[LEDM_OPTION_GROUP_ADVANCED].name = "advanced-group";
+ ps->option[LEDM_OPTION_GROUP_ADVANCED].title = STR_TITLE_ADVANCED;
+ ps->option[LEDM_OPTION_GROUP_ADVANCED].type = SANE_TYPE_GROUP;
+ ps->option[LEDM_OPTION_GROUP_ADVANCED].cap = SANE_CAP_ADVANCED;
+
+ ps->option[LEDM_OPTION_CONTRAST].name = SANE_NAME_CONTRAST;
+ ps->option[LEDM_OPTION_CONTRAST].title = SANE_TITLE_CONTRAST;
+ ps->option[LEDM_OPTION_CONTRAST].desc = SANE_DESC_CONTRAST;
+ ps->option[LEDM_OPTION_CONTRAST].type = SANE_TYPE_INT;
+ ps->option[LEDM_OPTION_CONTRAST].unit = SANE_UNIT_NONE;
+ ps->option[LEDM_OPTION_CONTRAST].size = sizeof(SANE_Int);
+ ps->option[LEDM_OPTION_CONTRAST].cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT | SANE_CAP_ADVANCED;
+ ps->option[LEDM_OPTION_CONTRAST].constraint_type = SANE_CONSTRAINT_RANGE;
+ ps->option[LEDM_OPTION_CONTRAST].constraint.range = &ps->contrastRange;
+ ps->contrastRange.min = LEDM_CONTRAST_MIN;
+ ps->contrastRange.max = LEDM_CONTRAST_MAX;
+ ps->contrastRange.quant = 0;
+
+ ps->option[LEDM_OPTION_COMPRESSION].name = STR_NAME_COMPRESSION;
+ ps->option[LEDM_OPTION_COMPRESSION].title = STR_TITLE_COMPRESSION;
+ ps->option[LEDM_OPTION_COMPRESSION].desc = STR_DESC_COMPRESSION;
+ ps->option[LEDM_OPTION_COMPRESSION].type = SANE_TYPE_STRING;
+ ps->option[LEDM_OPTION_COMPRESSION].unit = SANE_UNIT_NONE;
+ ps->option[LEDM_OPTION_COMPRESSION].size = MAX_STRING_SIZE;
+ ps->option[LEDM_OPTION_COMPRESSION].cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT | SANE_CAP_ADVANCED;
+ ps->option[LEDM_OPTION_COMPRESSION].constraint_type = SANE_CONSTRAINT_STRING_LIST;
+ ps->option[LEDM_OPTION_COMPRESSION].constraint.string_list = ps->compressionList;
+
+ ps->option[LEDM_OPTION_JPEG_QUALITY].name = STR_NAME_JPEG_QUALITY;
+ ps->option[LEDM_OPTION_JPEG_QUALITY].title = STR_TITLE_JPEG_QUALITY;
+ ps->option[LEDM_OPTION_JPEG_QUALITY].desc = STR_DESC_JPEG_QUALITY;
+ ps->option[LEDM_OPTION_JPEG_QUALITY].type = SANE_TYPE_INT;
+ ps->option[LEDM_OPTION_JPEG_QUALITY].unit = SANE_UNIT_NONE;
+ ps->option[LEDM_OPTION_JPEG_QUALITY].size = sizeof(SANE_Int);
+ ps->option[LEDM_OPTION_JPEG_QUALITY].cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT | SANE_CAP_ADVANCED;
+ ps->option[LEDM_OPTION_JPEG_QUALITY].constraint_type = SANE_CONSTRAINT_RANGE;
+ ps->option[LEDM_OPTION_JPEG_QUALITY].constraint.range = &ps->jpegQualityRange;
+ ps->jpegQualityRange.min = MIN_JPEG_COMPRESSION_FACTOR;
+ ps->jpegQualityRange.max = MAX_JPEG_COMPRESSION_FACTOR;
+ ps->jpegQualityRange.quant = 0;
+
+ ps->option[LEDM_OPTION_GROUP_GEOMETRY].name = "geometry-group";
+ ps->option[LEDM_OPTION_GROUP_GEOMETRY].title = STR_TITLE_GEOMETRY;
+ ps->option[LEDM_OPTION_GROUP_GEOMETRY].type = SANE_TYPE_GROUP;
+ ps->option[LEDM_OPTION_GROUP_GEOMETRY].cap = SANE_CAP_ADVANCED;
+
+ ps->option[LEDM_OPTION_TL_X].name = SANE_NAME_SCAN_TL_X;
+ ps->option[LEDM_OPTION_TL_X].title = SANE_TITLE_SCAN_TL_X;
+ ps->option[LEDM_OPTION_TL_X].desc = SANE_DESC_SCAN_TL_X;
+ ps->option[LEDM_OPTION_TL_X].type = SANE_TYPE_FIXED;
+ ps->option[LEDM_OPTION_TL_X].unit = SANE_UNIT_MM;
+ ps->option[LEDM_OPTION_TL_X].size = sizeof(SANE_Int);
+ ps->option[LEDM_OPTION_TL_X].cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT;
+ ps->option[LEDM_OPTION_TL_X].constraint_type = SANE_CONSTRAINT_RANGE;
+ ps->option[LEDM_OPTION_TL_X].constraint.range = &ps->tlxRange;
+ ps->tlxRange.min = 0;
+ ps->tlxRange.quant = 0;
+
+ ps->option[LEDM_OPTION_TL_Y].name = SANE_NAME_SCAN_TL_Y;
+ ps->option[LEDM_OPTION_TL_Y].title = SANE_TITLE_SCAN_TL_Y;
+ ps->option[LEDM_OPTION_TL_Y].desc = SANE_DESC_SCAN_TL_Y;
+ ps->option[LEDM_OPTION_TL_Y].type = SANE_TYPE_FIXED;
+ ps->option[LEDM_OPTION_TL_Y].unit = SANE_UNIT_MM;
+ ps->option[LEDM_OPTION_TL_Y].size = sizeof(SANE_Int);
+ ps->option[LEDM_OPTION_TL_Y].cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT;
+ ps->option[LEDM_OPTION_TL_Y].constraint_type = SANE_CONSTRAINT_RANGE;
+ ps->option[LEDM_OPTION_TL_Y].constraint.range = &ps->tlyRange;
+ ps->tlyRange.min = 0;
+ ps->tlyRange.quant = 0;
+
+ ps->option[LEDM_OPTION_BR_X].name = SANE_NAME_SCAN_BR_X;
+ ps->option[LEDM_OPTION_BR_X].title = SANE_TITLE_SCAN_BR_X;
+ ps->option[LEDM_OPTION_BR_X].desc = SANE_DESC_SCAN_BR_X;
+ ps->option[LEDM_OPTION_BR_X].type = SANE_TYPE_FIXED;
+ ps->option[LEDM_OPTION_BR_X].unit = SANE_UNIT_MM;
+ ps->option[LEDM_OPTION_BR_X].size = sizeof(SANE_Int);
+ ps->option[LEDM_OPTION_BR_X].cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT;
+ ps->option[LEDM_OPTION_BR_X].constraint_type = SANE_CONSTRAINT_RANGE;
+ ps->option[LEDM_OPTION_BR_X].constraint.range = &ps->brxRange;
+ ps->brxRange.min = 0;
+ ps->brxRange.quant = 0;
+
+ ps->option[LEDM_OPTION_BR_Y].name = SANE_NAME_SCAN_BR_Y;
+ ps->option[LEDM_OPTION_BR_Y].title = SANE_TITLE_SCAN_BR_Y;
+ ps->option[LEDM_OPTION_BR_Y].desc = SANE_DESC_SCAN_BR_Y;
+ ps->option[LEDM_OPTION_BR_Y].type = SANE_TYPE_FIXED;
+ ps->option[LEDM_OPTION_BR_Y].unit = SANE_UNIT_MM;
+ ps->option[LEDM_OPTION_BR_Y].size = sizeof(SANE_Int);
+ ps->option[LEDM_OPTION_BR_Y].cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT;
+ ps->option[LEDM_OPTION_BR_Y].constraint_type = SANE_CONSTRAINT_RANGE;
+ ps->option[LEDM_OPTION_BR_Y].constraint.range = &ps->bryRange;
+ ps->bryRange.min = 0;
+ ps->bryRange.quant = 0;
+
+return 0;
+}
+
+/*----------------------------------- LEDM API Calls ------------------------------------*/
+
+SANE_Status __attribute__ ((visibility ("hidden"))) ledm_open(SANE_String_Const device, SANE_Handle *handle)
+{
+ struct hpmud_model_attributes ma;
+ int stat = SANE_STATUS_IO_ERROR;
+
+ if(session)
+ {
+ return SANE_STATUS_DEVICE_BUSY;
+ }
+ if((session = create_session()) == NULL)
+ return SANE_STATUS_NO_MEM;
+
+ /* Set session to specified device. */
+ snprintf(session->uri, sizeof(session->uri)-1, "hp:%s", device); /* prepend "hp:" */
+
+ /* Get actual model attributes from models.dat. */
+ hpmud_query_model(session->uri, &ma);
+ session->scan_type = ma.scantype;
+
+ if (hpmud_open_device(session->uri, ma.mfp_mode, &session->dd) != HPMUD_R_OK)
+ {
+ stat = SANE_STATUS_IO_ERROR;
+ goto bugout;
+ }
+
+ init_options(session);
+
+ if (bb_open(session))
+ {
+ stat = SANE_STATUS_IO_ERROR;
+ goto bugout;
+ }
+
+ /* Set supported Scan Modes as determined by bb_open. */
+ ledm_control_option(session, LEDM_OPTION_SCAN_MODE, SANE_ACTION_SET_AUTO, NULL, NULL); /* set default option */
+
+ /* Set scan input sources as determined by bb_open. */
+ ledm_control_option(session, LEDM_OPTION_INPUT_SOURCE, SANE_ACTION_SET_AUTO, NULL, NULL); /* set default option */
+
+ /* Set supported resolutions. */
+ ledm_control_option(session, LEDM_OPTION_SCAN_RESOLUTION, SANE_ACTION_SET_AUTO, NULL, NULL); /* set default option */
+
+ /* Set supported contrast. */
+ ledm_control_option(session, LEDM_OPTION_CONTRAST, SANE_ACTION_SET_AUTO, NULL, NULL); /* set default option */
+
+ /* Set supported compression. (Note, cm1017 may say it supports MMR, but it doesn't) */
+ ledm_control_option(session, LEDM_OPTION_COMPRESSION, SANE_ACTION_SET_AUTO, NULL, NULL); /* set default option */
+
+ /* Determine supported jpeg quality factor as determined by bb_open. */
+ ledm_control_option(session, LEDM_OPTION_JPEG_QUALITY, SANE_ACTION_SET_AUTO, NULL, NULL); /* set default option */
+
+ /* Set x,y extents. See bb_open */
+ ledm_control_option(session, LEDM_OPTION_TL_X, SANE_ACTION_SET_AUTO, NULL, NULL); /* set default option */
+ ledm_control_option(session, LEDM_OPTION_TL_Y, SANE_ACTION_SET_AUTO, NULL, NULL); /* set default option */
+ ledm_control_option(session, LEDM_OPTION_BR_X, SANE_ACTION_SET_AUTO, NULL, NULL); /* set default option */
+ ledm_control_option(session, LEDM_OPTION_BR_Y, SANE_ACTION_SET_AUTO, NULL, NULL); /* set default option */
+
+ *handle = (SANE_Handle *)session;
+
+ stat = SANE_STATUS_GOOD;
+
+bugout:
+
+ if (stat != SANE_STATUS_GOOD)
+ {
+ if (session)
+ {
+ if (session->cd > 0)
+ hpmud_close_channel(session->dd, session->cd);
+ if (session->dd > 0)
+ hpmud_close_device(session->dd);
+ free(session);
+ session = NULL;
+ }
+ }
+
+ return stat;
+}
+
+const SANE_Option_Descriptor *ledm_get_option_descriptor(SANE_Handle handle, SANE_Int option)
+{
+ struct ledm_session *ps = (struct ledm_session *)handle;
+
+ DBG8("sane_hpaio_get_option_descriptor(option=%s)\n", ps->option[option].name);
+
+ if (option < 0 || option >= LEDM_OPTION_MAX)
+ return NULL;
+
+ return &ps->option[option];
+} /* ledm_get_option_descriptor */
+
+SANE_Status ledm_control_option(SANE_Handle handle, SANE_Int option, SANE_Action action, void *value, SANE_Int *set_result)
+{
+ struct ledm_session *ps = (struct ledm_session *)handle;
+ SANE_Int *int_value = value, mset_result=0;
+ int i, stat=SANE_STATUS_INVAL;
+
+ switch(option)
+ {
+ case LEDM_OPTION_COUNT:
+ if (action == SANE_ACTION_GET_VALUE)
+ {
+ *int_value = LEDM_OPTION_MAX;
+ stat = SANE_STATUS_GOOD;
+ }
+ break;
+ case LEDM_OPTION_SCAN_MODE:
+ if(action == SANE_ACTION_GET_VALUE)
+ {
+ for(i=0; ps->scanModeList[i]; i++)
+ {
+ if(ps->currentScanMode == ps->scanModeMap[i])
+ {
+ strcpy(value, ps->scanModeList[i]);
+ stat = SANE_STATUS_GOOD;
+ break;
+ }
+ }
+ }
+ else if (action == SANE_ACTION_SET_VALUE)
+ {
+ for (i=0; ps->scanModeList[i]; i++)
+ {
+ if (strcasecmp(ps->scanModeList[i], value) == 0)
+ {
+ ps->currentScanMode = ps->scanModeMap[i];
+ set_scan_mode_side_effects(ps, ps->currentScanMode);
+ mset_result |= SANE_INFO_RELOAD_PARAMS | SANE_INFO_RELOAD_OPTIONS;
+ stat = SANE_STATUS_GOOD;
+ break;
+ }
+ }
+ }
+ else
+ { /* Set default. */
+ ps->currentScanMode = CE_COLOR8;
+ set_scan_mode_side_effects(ps, ps->currentScanMode);
+ stat = SANE_STATUS_GOOD;
+ }
+ break;
+ case LEDM_OPTION_INPUT_SOURCE:
+ if (action == SANE_ACTION_GET_VALUE)
+ {
+ for (i=0; ps->inputSourceList[i]; i++)
+ {
+ if (ps->currentInputSource == ps->inputSourceMap[i])
+ {
+ strcpy(value, ps->inputSourceList[i]);
+ stat = SANE_STATUS_GOOD;
+ break;
+ }
+ }
+ }
+ else if (action == SANE_ACTION_SET_VALUE)
+ {
+ for (i=0; ps->inputSourceList[i]; i++)
+ {
+ if (strcasecmp(ps->inputSourceList[i], value) == 0)
+ {
+ ps->currentInputSource = ps->inputSourceMap[i];
+ set_input_source_side_effects(ps, ps->currentInputSource);
+ if(ps->currentInputSource == IS_PLATEN)
+ {
+ i = session->platen_resolutionList[0] + 1;
+ while(i--) session->resolutionList[i] = session->platen_resolutionList[i];
+ }
+ else
+ {
+ i = session->adf_resolutionList[0] + 1;
+ while(i--) session->resolutionList[i] = session->adf_resolutionList[i];
+ }
+ ps->currentResolution = session->resolutionList[1];
+ mset_result |= SANE_INFO_RELOAD_PARAMS | SANE_INFO_RELOAD_OPTIONS;
+ stat = SANE_STATUS_GOOD;
+ break;
+ }
+ }
+ }
+ else
+ { /* Set default. */
+ ps->currentInputSource = IS_PLATEN;
+ set_input_source_side_effects(ps, ps->currentInputSource);
+ mset_result |= SANE_INFO_RELOAD_PARAMS | SANE_INFO_RELOAD_OPTIONS;
+ stat = SANE_STATUS_GOOD;
+ }
+ break;
+ case LEDM_OPTION_SCAN_RESOLUTION:
+ if (action == SANE_ACTION_GET_VALUE)
+ {
+ *int_value = ps->currentResolution;
+ stat = SANE_STATUS_GOOD;
+ }
+ else if (action == SANE_ACTION_SET_VALUE)
+ {
+ for (i=1; i <= ps->resolutionList[0]; i++)
+ {
+ if (ps->resolutionList[i] == *int_value)
+ {
+ ps->currentResolution = *int_value;
+ if(ps->currentResolution == 4800) SendScanEvent(ps->uri, EVENT_SIZE_WARNING);
+ mset_result |= SANE_INFO_RELOAD_PARAMS;
+ stat = SANE_STATUS_GOOD;
+ break;
+ }
+ }
+ }
+ else
+ { /* Set default. */
+ ps->currentResolution = 75;
+ stat = SANE_STATUS_GOOD;
+ }
+ break;
+ case LEDM_OPTION_CONTRAST:
+ if (action == SANE_ACTION_GET_VALUE)
+ {
+ *int_value = ps->currentContrast;
+ stat = SANE_STATUS_GOOD;
+ }
+ else if (action == SANE_ACTION_SET_VALUE)
+ {
+ if (*int_value >= LEDM_CONTRAST_MIN && *int_value <= LEDM_CONTRAST_MAX)
+ {
+ ps->currentContrast = *int_value;
+ stat = SANE_STATUS_GOOD;
+ break;
+ }
+ }
+ else
+ { /* Set default. */
+ ps->currentContrast = LEDM_CONTRAST_DEFAULT;
+ stat = SANE_STATUS_GOOD;
+ }
+ break;
+ case LEDM_OPTION_COMPRESSION:
+ if (action == SANE_ACTION_GET_VALUE)
+ {
+ for (i=0; ps->compressionList[i]; i++)
+ {
+ if (ps->currentCompression == ps->compressionMap[i])
+ {
+ strcpy(value, ps->compressionList[i]);
+ stat = SANE_STATUS_GOOD;
+ break;
+ }
+ }
+ }
+ else if (action == SANE_ACTION_SET_VALUE)
+ {
+ for (i=0; ps->compressionList[i]; i++)
+ {
+ if (strcasecmp(ps->compressionList[i], value) == 0)
+ {
+ ps->currentCompression = ps->compressionMap[i];
+ stat = SANE_STATUS_GOOD;
+ break;
+ }
+ }
+ }
+ else
+ { /* Set default. */
+ ps->currentCompression = SF_JPEG;
+ stat = SANE_STATUS_GOOD;
+ }
+ break;
+ case LEDM_OPTION_JPEG_QUALITY:
+ if (action == SANE_ACTION_GET_VALUE)
+ {
+ *int_value = ps->currentJpegQuality;
+ stat = SANE_STATUS_GOOD;
+ }
+ else if (action == SANE_ACTION_SET_VALUE)
+ {
+ if (*int_value >= MIN_JPEG_COMPRESSION_FACTOR && *int_value <= MAX_JPEG_COMPRESSION_FACTOR)
+ {
+ ps->currentJpegQuality = *int_value;
+ stat = SANE_STATUS_GOOD;
+ break;
+ }
+ }
+ else
+ { /* Set default. */
+ ps->currentJpegQuality = SAFER_JPEG_COMPRESSION_FACTOR;
+ stat = SANE_STATUS_GOOD;
+ }
+ break;
+ case LEDM_OPTION_TL_X:
+ if (action == SANE_ACTION_GET_VALUE)
+ {
+ *int_value = ps->currentTlx;
+ stat = SANE_STATUS_GOOD;
+ }
+ else if (action == SANE_ACTION_SET_VALUE)
+ {
+ if (*int_value >= ps->tlxRange.min && *int_value <= ps->tlxRange.max)
+ {
+ ps->currentTlx = *int_value;
+ mset_result |= SANE_INFO_RELOAD_PARAMS;
+ stat = SANE_STATUS_GOOD;
+ break;
+ }
+ }
+ else
+ { /* Set default. */
+ ps->currentTlx = ps->tlxRange.min;
+ stat = SANE_STATUS_GOOD;
+ }
+ break;
+ case LEDM_OPTION_TL_Y:
+ if (action == SANE_ACTION_GET_VALUE)
+ {
+ *int_value = ps->currentTly;
+ stat = SANE_STATUS_GOOD;
+ }
+ else if (action == SANE_ACTION_SET_VALUE)
+ {
+ if (*int_value >= ps->tlyRange.min && *int_value <= ps->tlyRange.max)
+ {
+
+ ps->currentTly = *int_value;
+ mset_result |= SANE_INFO_RELOAD_PARAMS;
+ stat = SANE_STATUS_GOOD;
+ break;
+ }
+ }
+ else
+ { /* Set default. */
+ ps->currentTly = ps->tlyRange.min;
+ stat = SANE_STATUS_GOOD;
+ }
+ break;
+ case LEDM_OPTION_BR_X:
+ if (action == SANE_ACTION_GET_VALUE)
+ {
+ *int_value = ps->currentBrx;
+ stat = SANE_STATUS_GOOD;
+ }
+ else if (action == SANE_ACTION_SET_VALUE)
+ {
+ if (*int_value >= ps->brxRange.min && *int_value <= ps->brxRange.max)
+ {
+ ps->currentBrx = *int_value;
+ mset_result |= SANE_INFO_RELOAD_PARAMS;
+ stat = SANE_STATUS_GOOD;
+ break;
+ }
+ }
+ else
+ { /* Set default. */
+ ps->currentBrx = ps->brxRange.max;
+ stat = SANE_STATUS_GOOD;
+ }
+ break;
+ case LEDM_OPTION_BR_Y:
+ if (action == SANE_ACTION_GET_VALUE)
+ {
+ *int_value = ps->currentBry;
+ stat = SANE_STATUS_GOOD;
+ }
+ else if (action == SANE_ACTION_SET_VALUE)
+ {
+ if (*int_value >= ps->bryRange.min && *int_value <= ps->bryRange.max)
+ {
+ ps->currentBry = *int_value;
+ mset_result |= SANE_INFO_RELOAD_PARAMS;
+ stat = SANE_STATUS_GOOD;
+ break;
+ }
+ }
+ else
+ { /* Set default. */
+ ps->currentBry = ps->bryRange.max;
+ stat = SANE_STATUS_GOOD;
+ }
+ break;
+ default:
+ break;
+ }
+
+ if (set_result)
+ *set_result = mset_result;
+
+ if (stat != SANE_STATUS_GOOD)
+ {
+ BUG("control_option failed: option=%s action=%s\n", ps->option[option].name, action==SANE_ACTION_GET_VALUE ? "get" : action==SANE_ACTION_SET_VALUE ? "set" : "auto");
+ }
+
+ return stat;
+} /* ledm_control_option */
+
+SANE_Status ledm_get_parameters(SANE_Handle handle, SANE_Parameters *params)
+{
+ struct ledm_session *ps = (struct ledm_session *)handle;
+
+ set_extents(ps);
+
+ /* Get scan parameters for sane client. */
+ bb_get_parameters(ps, params, ps->ip_handle ? SPO_STARTED : SPO_BEST_GUESS);
+
+ DBG8("sane_hpaio_get_parameters(): format=%d, last_frame=%d, lines=%d, depth=%d, pixels_per_line=%d, bytes_per_line=%d\n",
+ params->format, params->last_frame, params->lines, params->depth, params->pixels_per_line, params->bytes_per_line);
+
+ return SANE_STATUS_GOOD;
+} /* ledm_get_parameters */
+
+SANE_Status ledm_start(SANE_Handle handle)
+{
+ struct ledm_session *ps = (struct ledm_session *)handle;
+ SANE_Parameters pp;
+ IP_IMAGE_TRAITS traits;
+ IP_XFORM_SPEC xforms[IP_MAX_XFORMS], *pXform=xforms;
+ int stat, ret;
+
+ DBG8("sane_hpaio_start()\n");
+
+ ps -> user_cancel = 0;
+ ps -> cnt = 0;
+ ps -> index = 0;
+
+ if (set_extents(ps))
+ {
+ stat = SANE_STATUS_INVAL;
+ goto bugout;
+ }
+
+ /* If input is ADF and ADF is empty, return SANE_STATUS_NO_DOCS. */
+ if (ps->currentInputSource==IS_ADF || ps->currentInputSource ==IS_ADF_DUPLEX)
+ {
+ ret = bb_is_paper_in_adf(ps); /* 0 = no paper in adf, 1 = paper in adf, -1 = error */
+ if (ret == 0)
+ {
+ stat = SANE_STATUS_NO_DOCS; /* done scanning */
+ SendScanEvent (ps->uri, EVENT_SCAN_ADF_NO_DOCS);
+ goto bugout;
+ }
+ else if (ret < 0)
+ {
+ stat = SANE_STATUS_IO_ERROR;
+ goto bugout;
+ }
+ }
+
+ /* Start scan and get actual image traits. */
+ stat = bb_start_scan(ps);
+ if (stat != SANE_STATUS_GOOD)
+ goto bugout;
+
+ if(ps->user_cancel)
+ {
+ stat = SANE_STATUS_GOOD ;
+ goto bugout;
+ }
+
+ SendScanEvent(ps->uri, EVENT_START_SCAN_JOB);
+
+ memset(xforms, 0, sizeof(xforms));
+
+ /* Setup image-processing pipeline for xform. */
+ if (ps->currentScanMode == CE_COLOR8 || ps->currentScanMode == CE_GRAY8)
+ {
+ switch(ps->currentCompression)
+ {
+ case SF_JPEG:
+ pXform->aXformInfo[IP_JPG_DECODE_FROM_DENALI].dword = 0; /* 0=no */
+ ADD_XFORM(X_JPG_DECODE);
+ pXform->aXformInfo[IP_CNV_COLOR_SPACE_WHICH_CNV].dword = IP_CNV_YCC_TO_SRGB;
+ pXform->aXformInfo[IP_CNV_COLOR_SPACE_GAMMA].dword = 0x00010000;
+ ADD_XFORM(X_CNV_COLOR_SPACE);
+ break;
+ case SF_RAW:
+ default:
+ break;
+ }
+ }
+ else
+ { /* Must be BLACK_AND_WHITE1 (Lineart). */
+ switch(ps->currentCompression)
+ {
+ case SF_JPEG:
+ pXform->aXformInfo[IP_JPG_DECODE_FROM_DENALI].dword = 0; /* 0=no */
+ ADD_XFORM(X_JPG_DECODE);
+ pXform->aXformInfo[IP_GRAY_2_BI_THRESHOLD].dword = 127;
+ ADD_XFORM(X_GRAY_2_BI);
+ break;
+ case SF_RAW:
+ pXform->aXformInfo[IP_GRAY_2_BI_THRESHOLD].dword = 127;
+ ADD_XFORM(X_GRAY_2_BI);
+ default:
+ break;
+ }
+ }
+
+ /* Setup x/y cropping for xform. (Actually we let cm1017 do it's own cropping) */
+ pXform->aXformInfo[IP_CROP_LEFT].dword = 0;
+ pXform->aXformInfo[IP_CROP_RIGHT].dword = 0;
+ pXform->aXformInfo[IP_CROP_TOP].dword = 0;
+ pXform->aXformInfo[IP_CROP_MAXOUTROWS].dword = 0;
+ ADD_XFORM(X_CROP);
+
+ /* Setup x/y padding for xform. (Actually we let cm1017 do it's own padding) */
+ pXform->aXformInfo[IP_PAD_LEFT].dword = 0; /* # of pixels to add to left side */
+ pXform->aXformInfo[IP_PAD_RIGHT].dword = 0; /* # of pixels to add to right side */
+ pXform->aXformInfo[IP_PAD_TOP].dword = 0; /* # of rows to add to top */
+ pXform->aXformInfo[IP_PAD_BOTTOM].dword = 0; /* # of rows to add to bottom */
+ pXform->aXformInfo[IP_PAD_VALUE].dword = ps->currentScanMode == CE_K1 ? 0 : -1; /* lineart white = 0, rgb white = -1 */
+ pXform->aXformInfo[IP_PAD_MIN_HEIGHT].dword = 0;
+ ADD_XFORM(X_PAD);
+
+ /* Open image processor. */
+ if ((ret = ipOpen(pXform-xforms, xforms, 0, &ps->ip_handle)) != IP_DONE)
+ {
+ stat = SANE_STATUS_INVAL;
+ goto bugout;
+ }
+
+ /* Get scan parameters for image processor. */
+ if (ps->currentCompression == SF_RAW)
+ bb_get_parameters(ps, &pp, SPO_STARTED_JR); /* hpraw, use actual parameters */
+ else
+ bb_get_parameters(ps, &pp, SPO_BEST_GUESS); /* jpeg, use best guess */
+ traits.iPixelsPerRow = pp.pixels_per_line;
+ switch(ps->currentScanMode)
+ {
+ case CE_K1: /* lineart (let IP create Mono from Gray8) */
+ case CE_GRAY8:
+ traits.iBitsPerPixel = 8; /* grayscale */
+ break;
+ case CE_COLOR8:
+ default:
+ traits.iBitsPerPixel = 24; /* color */
+ break;
+ }
+ traits.lHorizDPI = ps->currentResolution << 16;
+ traits.lVertDPI = ps->currentResolution << 16;
+ traits.lNumRows = pp.lines;
+ traits.iNumPages = 1;
+ traits.iPageNum = 1;
+ traits.iComponentsPerPixel = ((traits.iBitsPerPixel % 3) ? 1 : 3);
+ ipSetDefaultInputTraits(ps->ip_handle, &traits);
+
+ /* If jpeg get output image attributes from the image processor. */
+ if (ps->currentCompression == SF_JPEG)
+ {
+ /* Enable parsed header flag. */
+ ipResultMask(ps->ip_handle, IP_PARSED_HEADER);
+
+ /* Wait for image processor to process header so we know the exact size of the image for sane_get_params. */
+ while (1)
+ {
+ ret = get_ip_data(ps, NULL, 0, NULL);
+
+ if (ret & (IP_INPUT_ERROR | IP_FATAL_ERROR | IP_DONE))
+ {
+ stat = SANE_STATUS_IO_ERROR;
+ goto bugout;
+ }
+
+ if (ret & IP_PARSED_HEADER)
+ {
+ ipGetImageTraits(ps->ip_handle, NULL, &ps->image_traits); /* get valid image traits */
+ ipResultMask(ps->ip_handle, 0); /* disable parsed header flag */
+ break;
+ }
+ }
+ }
+ else
+ ipGetImageTraits(ps->ip_handle, NULL, &ps->image_traits); /* get valid image traits */
+
+ stat = SANE_STATUS_GOOD;
+
+bugout:
+ if (stat != SANE_STATUS_GOOD)
+ {
+ if (ps->ip_handle)
+ {
+ ipClose(ps->ip_handle);
+ ps->ip_handle = 0;
+ }
+ bb_end_scan(ps, stat == SANE_STATUS_IO_ERROR ? 1: 0);
+ }
+ return stat;
+} /* ledm_start */
+
+SANE_Status ledm_read(SANE_Handle handle, SANE_Byte *data, SANE_Int maxLength, SANE_Int *length)
+{
+ struct ledm_session *ps = (struct ledm_session *)handle;
+ int ret, stat=SANE_STATUS_IO_ERROR;
+
+ if(ps->user_cancel)
+ {
+ SendScanEvent(ps->uri, EVENT_SCAN_CANCEL);
+ return SANE_STATUS_CANCELLED;
+ }
+
+ ret = get_ip_data(ps, data, maxLength, length);
+
+ if(ret & (IP_INPUT_ERROR | IP_FATAL_ERROR))
+ {
+ goto bugout;
+ }
+
+ if(ret==IP_DONE)
+ {
+ stat = SANE_STATUS_EOF;
+ SendScanEvent(ps->uri, EVENT_END_SCAN_JOB);
+ }
+ else stat= SANE_STATUS_GOOD;
+
+bugout:
+ if (stat != SANE_STATUS_GOOD)
+ {
+ if (ps->ip_handle)
+ {
+ /* Note always call ipClose when SANE_STATUS_EOF, do not depend on sane_cancel because sane_cancel is only called at the end of a batch job. */
+ ipClose(ps->ip_handle);
+ ps->ip_handle = 0;
+ }
+ bb_end_page(ps, 0);
+ }
+
+ DBG8("-sane_hpaio_read() output=%p bytes_read=%d maxLength=%d status=%d\n", data, *length, maxLength, stat);
+
+ return stat;
+} /* ledm_read */
+
+void ledm_cancel(SANE_Handle handle)
+{
+ struct ledm_session *ps = (struct ledm_session *)handle;
+
+ DBG8("sane_hpaio_cancel()\n");
+
+ ps -> user_cancel = 1;
+ /* Sane_cancel is always called at the end of the scan job.
+ Note that on a multiple page scan job sane_cancel is called only once */
+
+ if (ps->ip_handle)
+ {
+ ipClose(ps->ip_handle);
+ ps->ip_handle = 0;
+ }
+ bb_end_scan(ps, 0);
+} /* ledm_cancel */
+
+void ledm_close(SANE_Handle handle)
+{
+ struct ledm_session *ps = (struct ledm_session *)handle;
+
+ if (ps == NULL || ps != session)
+ {
+ BUG("invalid sane_close\n");
+ return;
+ }
+
+ bb_close(ps);
+
+ if (ps->dd > 0)
+ hpmud_close_device(ps->dd);
+
+ free(ps);
+ session = NULL;
+}
diff --git a/scan/sane/ledm.h b/scan/sane/ledm.h
new file mode 100644
index 0000000..ae7212a
--- /dev/null
+++ b/scan/sane/ledm.h
@@ -0,0 +1,43 @@
+/************************************************************************************\
+
+ ledm.h - HP SANE backend support for LEDM based multi-function peripherals
+
+ (c) 2010 Copyright Hewlett-Packard Development Company, LP
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+ of the Software, and to permit persons to whom the Software is furnished to do
+ so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+ Primary Author: Narla Naga Samrat Chowdary
+
+\************************************************************************************/
+
+# ifndef _LEDM_H
+# define _LEDM_H
+
+# include "sane.h"
+
+SANE_Status ledm_open(SANE_String_Const device, SANE_Handle *handle);
+void ledm_close(SANE_Handle handle);
+const SANE_Option_Descriptor * ledm_get_option_descriptor(SANE_Handle handle, SANE_Int option);
+SANE_Status ledm_control_option(SANE_Handle handle, SANE_Int option, SANE_Action action, void *value, SANE_Int *info);
+SANE_Status ledm_get_parameters(SANE_Handle handle, SANE_Parameters *params);
+SANE_Status ledm_start(SANE_Handle handle);
+SANE_Status ledm_read(SANE_Handle handle, SANE_Byte *data, SANE_Int maxLength, SANE_Int *length);
+void ledm_cancel(SANE_Handle handle);
+
+# endif // _LEDM_H
+
diff --git a/scan/sane/ledmi.h b/scan/sane/ledmi.h
new file mode 100644
index 0000000..973a974
--- /dev/null
+++ b/scan/sane/ledmi.h
@@ -0,0 +1,163 @@
+/************************************************************************************\
+
+ ledmi.h - HP SANE backend support for LEDM based multi-function peripherals
+
+ (c) 2010 Copyright Hewlett-Packard Development Company, LP
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+ of the Software, and to permit persons to whom the Software is furnished to do
+ so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+ Primary Author: Naga Samrat Chowdary, Narla
+ Contributing Authors: Yashwant Kumar Sahu
+
+\************************************************************************************/
+
+# ifndef _LEDMI_H
+# define _LEDMI_H
+
+# include "sane.h"
+# include "hpip.h"
+# include "hpmud.h"
+
+# define LEDM_CONTRAST_MIN -127
+# define LEDM_CONTRAST_MAX 127
+# define LEDM_CONTRAST_DEFAULT 0
+
+# define MM_PER_INCH 25.4
+
+enum LEDM_OPTION_NUMBER
+{
+ LEDM_OPTION_COUNT = 0,
+ LEDM_OPTION_GROUP_SCAN_MODE,
+ LEDM_OPTION_SCAN_MODE,
+ LEDM_OPTION_SCAN_RESOLUTION,
+ LEDM_OPTION_INPUT_SOURCE, /* platen, ADF, ADFDuplex */
+ LEDM_OPTION_GROUP_ADVANCED,
+ LEDM_OPTION_CONTRAST,
+ LEDM_OPTION_COMPRESSION,
+ LEDM_OPTION_JPEG_QUALITY,
+ LEDM_OPTION_GROUP_GEOMETRY,
+ LEDM_OPTION_TL_X,
+ LEDM_OPTION_TL_Y,
+ LEDM_OPTION_BR_X,
+ LEDM_OPTION_BR_Y,
+ LEDM_OPTION_MAX
+};
+
+# define MAX_LIST_SIZE 32
+# define MAX_STRING_SIZE 32
+
+enum SCAN_FORMAT
+{
+ SF_RAW = 1,
+ SF_JPEG,
+ SF_MAX
+};
+
+enum INPUT_SOURCE
+{
+ IS_PLATEN = 1,
+ IS_ADF,
+ IS_ADF_DUPLEX,
+ IS_MAX
+};
+
+enum COLOR_ENTRY
+{
+ CE_K1 = 1,
+ CE_GRAY8,
+ CE_COLOR8,
+ CE_MAX
+};
+
+enum SCAN_PARAM_OPTION
+{
+ SPO_BEST_GUESS = 0, /* scan not started, return "best guess" scan parameters */
+ SPO_STARTED = 1, /* scan started, return "job resonse" or "image processor" scan parameters */
+ SPO_STARTED_JR = 2, /* scan started, but return "job response" scan parameters only */
+};
+
+struct ledm_session
+{
+ char *tag; /* handle identifier */
+ HPMUD_DEVICE dd; /* hpiod device descriptor */
+ HPMUD_CHANNEL cd; /* hpiod LEDM channel descriptor */
+ char uri[HPMUD_LINE_SIZE];
+ char model[HPMUD_LINE_SIZE];
+ char url[256];
+ int scan_type;
+ int user_cancel;
+
+ IP_IMAGE_TRAITS image_traits; /* specified by image header */
+
+ SANE_Option_Descriptor option[LEDM_OPTION_MAX];
+
+ SANE_String_Const inputSourceList[IS_MAX];
+ enum INPUT_SOURCE inputSourceMap[IS_MAX];
+ enum INPUT_SOURCE currentInputSource;
+
+ SANE_Int resolutionList[MAX_LIST_SIZE];
+ SANE_Int currentResolution;
+
+ SANE_Range contrastRange;
+ SANE_Int currentContrast;
+
+ SANE_String_Const scanModeList[CE_MAX];
+ enum COLOR_ENTRY scanModeMap[CE_MAX];
+ enum COLOR_ENTRY currentScanMode;
+
+ SANE_String_Const compressionList[SF_MAX];
+ enum SCAN_FORMAT compressionMap[SF_MAX];
+ enum SCAN_FORMAT currentCompression;
+
+ SANE_Range jpegQualityRange;
+ SANE_Int currentJpegQuality;
+
+ SANE_Range tlxRange, tlyRange, brxRange, bryRange;
+ SANE_Fixed currentTlx, currentTly, currentBrx, currentBry;
+ SANE_Fixed effectiveTlx, effectiveTly, effectiveBrx, effectiveBry;
+ SANE_Fixed min_width, min_height;
+ SANE_Int platen_resolutionList[MAX_LIST_SIZE];
+
+ SANE_Fixed platen_min_width, platen_min_height;
+ SANE_Range platen_tlxRange, platen_tlyRange, platen_brxRange, platen_bryRange;
+ SANE_Fixed adf_min_width, adf_min_height;
+ SANE_Range adf_tlxRange, adf_tlyRange, adf_brxRange, adf_bryRange;
+ SANE_Int adf_resolutionList[MAX_LIST_SIZE];
+
+ IP_HANDLE ip_handle;
+
+ int index; /* image buffer index */
+ int cnt; /* image buffer count */
+ unsigned char buf[32768]; /* image chunk buffer */
+
+ void *bb_session;
+ /* Add new elements here. */
+ int job_id;
+ int page_id;
+};
+
+int bb_open(struct ledm_session*);
+int bb_close(struct ledm_session*);
+int bb_get_parameters(struct ledm_session*, SANE_Parameters*, int);
+int bb_is_paper_in_adf(); /* 0 = no paper in adf, 1 = paper in adf, -1 = error */
+SANE_Status bb_start_scan(struct ledm_session*);
+int bb_get_image_data(struct ledm_session*, int);
+int bb_end_page(struct ledm_session*, int);
+int bb_end_scan(struct ledm_session* , int);
+
+#endif // _LEDMI_H
diff --git a/scan/sane/marvell.c b/scan/sane/marvell.c
new file mode 100644
index 0000000..395923e
--- /dev/null
+++ b/scan/sane/marvell.c
@@ -0,0 +1,1009 @@
+/************************************************************************************\
+
+ marvell.c - HP SANE backend support for Marvell based multi-function peripherals
+
+ (c) 2008 Copyright Hewlett-Packard Development Company, LP
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+ of the Software, and to permit persons to whom the Software is furnished to do
+ so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+ Author: David Suffield, Yashwant Sahu
+
+\************************************************************************************/
+
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE
+#endif
+
+#include <sys/socket.h>
+#include <netdb.h>
+#include <stdarg.h>
+#include <syslog.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/types.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <math.h>
+#include <dlfcn.h>
+#include "sane.h"
+#include "saneopts.h"
+#include "hpmud.h"
+#include "hpip.h"
+#include "common.h"
+#include "marvell.h"
+#include "marvelli.h"
+#include "io.h"
+
+#define DEBUG_DECLARE_ONLY
+#include "sanei_debug.h"
+
+static struct marvell_session *session = NULL; /* assume one sane_open per process */
+
+static int bb_load(struct marvell_session *ps, const char *so)
+{
+ char home[128];
+ char sz[255];
+ int stat=1;
+
+ /* Load hpmud manually with symbols exported. Otherwise the plugin will not find it. */
+ if ((ps->hpmud_handle = dlopen("libhpmud.so", RTLD_LAZY|RTLD_GLOBAL)) == NULL)
+ {
+ BUG("unable to load restricted library: %s\n", dlerror());
+ goto bugout;
+ }
+
+ /* Load math library manually with symbols exported (Ubuntu 8.04). Otherwise the plugin will not find it. */
+ if ((ps->math_handle = dlopen("libm.so", RTLD_LAZY|RTLD_GLOBAL)) == NULL)
+ {
+ if ((ps->math_handle = dlopen("libm.so.6", RTLD_LAZY|RTLD_GLOBAL)) == NULL)
+ {
+ BUG("unable to load restricted library: %s\n", dlerror());
+ goto bugout;
+ }
+ }
+
+ if (hpmud_get_conf("[dirs]", "home", home, sizeof(home)) != HPMUD_R_OK)
+ goto bugout;
+ snprintf(sz, sizeof(sz), "%s/scan/plugins/%s", home, so);
+ if ((ps->bb_handle = dlopen(sz, RTLD_NOW|RTLD_GLOBAL)) == NULL)
+ {
+ BUG("unable to load restricted library %s: %s\n", sz, dlerror());
+ SendScanEvent(ps->uri, EVENT_PLUGIN_FAIL);
+ goto bugout;
+ }
+
+ if ((ps->bb_open = dlsym(ps->bb_handle, "bb_open")) == NULL)
+ {
+ BUG("unable to load restricted library %s: %s\n", sz, dlerror());
+ goto bugout;
+ }
+ if ((ps->bb_close = dlsym(ps->bb_handle, "bb_close")) == NULL)
+ {
+ BUG("unable to load restricted library %s: %s\n", sz, dlerror());
+ goto bugout;
+ }
+ if ((ps->bb_get_parameters = dlsym(ps->bb_handle, "bb_get_parameters")) == NULL)
+ {
+ BUG("unable to load restricted library %s: %s\n", sz, dlerror());
+ goto bugout;
+ }
+ if ((ps->bb_is_paper_in_adf = dlsym(ps->bb_handle, "bb_is_paper_in_adf")) == NULL)
+ {
+ BUG("unable to load restricted library %s: %s\n", sz, dlerror());
+ goto bugout;
+ }
+ if ((ps->bb_start_scan = dlsym(ps->bb_handle, "bb_start_scan")) == NULL)
+ {
+ BUG("unable to load restricted library %s: %s\n", sz, dlerror());
+ goto bugout;
+ }
+ if ((ps->bb_end_scan = dlsym(ps->bb_handle, "bb_end_scan")) == NULL)
+ {
+ BUG("unable to load restricted library %s: %s\n", sz, dlerror());
+ goto bugout;
+ }
+ if ((ps->bb_get_image_data = dlsym(ps->bb_handle, "bb_get_image_data")) == NULL)
+ {
+ BUG("unable to load restricted library %s: %s\n", sz, dlerror());
+ goto bugout;
+ }
+ if ((ps->bb_end_page = dlsym(ps->bb_handle, "bb_end_page")) == NULL)
+ {
+ BUG("unable to load restricted library %s: %s\n", sz, dlerror());
+ goto bugout;
+ }
+
+ stat=0;
+
+bugout:
+ return stat;
+}
+
+static int bb_unload(struct marvell_session *ps)
+{
+ if (ps->bb_handle)
+ {
+ dlclose(ps->bb_handle);
+ ps->bb_handle = NULL;
+ }
+ if (ps->hpmud_handle)
+ {
+ dlclose(ps->hpmud_handle);
+ ps->hpmud_handle = NULL;
+ }
+ if (ps->math_handle)
+ {
+ dlclose(ps->math_handle);
+ ps->math_handle = NULL;
+ }
+ return 0;
+}
+
+/* Get raw data (ie: uncompressed data) from image processor. */
+static int get_ip_data(struct marvell_session *ps, SANE_Byte *data, SANE_Int maxLength, SANE_Int *length)
+{
+ int ip_ret=IP_INPUT_ERROR;
+ unsigned int outputAvail=maxLength, outputUsed=0, outputThisPos;
+ unsigned char *input, *output = data;
+ unsigned int inputAvail, inputUsed=0, inputNextPos;
+
+ if (!ps->ip_handle)
+ {
+ BUG("invalid ipconvert state\n");
+ goto bugout;
+ }
+
+ if (ps->bb_get_image_data(ps, outputAvail))
+ goto bugout;
+
+ if (ps->cnt > 0)
+ {
+ inputAvail = ps->cnt;
+ input = ps->buf;
+ }
+ else
+ {
+ input = NULL; /* no more scan data, flush ipconvert pipeline */
+ inputAvail = 0;
+ }
+
+ /* Transform input data to output. Note, output buffer may consume more bytes than input buffer (ie: jpeg to raster). */
+ ip_ret = ipConvert(ps->ip_handle, inputAvail, input, &inputUsed, &inputNextPos, outputAvail, output, &outputUsed, &outputThisPos);
+
+ DBG6("input=%p inputAvail=%d inputUsed=%d inputNextPos=%d output=%p outputAvail=%d outputUsed=%d outputThisPos=%d ret=%x\n", input,
+ inputAvail, inputUsed, inputNextPos, output, outputAvail, outputUsed, outputThisPos, ip_ret);
+
+ if (data)
+ *length = outputUsed;
+
+ /* For sane do not send output data simultaneously with IP_DONE. */
+ if (ip_ret & IP_DONE && outputUsed)
+ ip_ret &= ~IP_DONE;
+
+bugout:
+ return ip_ret;
+}
+
+static int init_options(struct marvell_session *ps)
+{
+ ps->option[MARVELL_OPTION_COUNT].name = "option-cnt";
+ ps->option[MARVELL_OPTION_COUNT].title = SANE_TITLE_NUM_OPTIONS;
+ ps->option[MARVELL_OPTION_COUNT].desc = SANE_DESC_NUM_OPTIONS;
+ ps->option[MARVELL_OPTION_COUNT].type = SANE_TYPE_INT;
+ ps->option[MARVELL_OPTION_COUNT].unit = SANE_UNIT_NONE;
+ ps->option[MARVELL_OPTION_COUNT].size = sizeof(SANE_Int);
+ ps->option[MARVELL_OPTION_COUNT].cap = SANE_CAP_SOFT_DETECT;
+ ps->option[MARVELL_OPTION_COUNT].constraint_type = SANE_CONSTRAINT_NONE;
+
+ ps->option[MARVELL_OPTION_GROUP_SCAN_MODE].name = "mode-group";
+ ps->option[MARVELL_OPTION_GROUP_SCAN_MODE].title = SANE_TITLE_SCAN_MODE;
+ ps->option[MARVELL_OPTION_GROUP_SCAN_MODE].type = SANE_TYPE_GROUP;
+
+ ps->option[MARVELL_OPTION_SCAN_MODE].name = SANE_NAME_SCAN_MODE;
+ ps->option[MARVELL_OPTION_SCAN_MODE].title = SANE_TITLE_SCAN_MODE;
+ ps->option[MARVELL_OPTION_SCAN_MODE].desc = SANE_DESC_SCAN_MODE;
+ ps->option[MARVELL_OPTION_SCAN_MODE].type = SANE_TYPE_STRING;
+ ps->option[MARVELL_OPTION_SCAN_MODE].unit = SANE_UNIT_NONE;
+ ps->option[MARVELL_OPTION_SCAN_MODE].size = MAX_STRING_SIZE;
+ ps->option[MARVELL_OPTION_SCAN_MODE].cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT;
+ ps->option[MARVELL_OPTION_SCAN_MODE].constraint_type = SANE_CONSTRAINT_STRING_LIST;
+ ps->option[MARVELL_OPTION_SCAN_MODE].constraint.string_list = ps->scan_mode_list;
+
+ ps->option[MARVELL_OPTION_INPUT_SOURCE].name = SANE_NAME_SCAN_SOURCE;
+ ps->option[MARVELL_OPTION_INPUT_SOURCE].title = SANE_TITLE_SCAN_SOURCE;
+ ps->option[MARVELL_OPTION_INPUT_SOURCE].desc = SANE_DESC_SCAN_SOURCE;
+ ps->option[MARVELL_OPTION_INPUT_SOURCE].type = SANE_TYPE_STRING;
+ ps->option[MARVELL_OPTION_INPUT_SOURCE].unit = SANE_UNIT_NONE;
+ ps->option[MARVELL_OPTION_INPUT_SOURCE].size = MAX_STRING_SIZE;
+ ps->option[MARVELL_OPTION_INPUT_SOURCE].cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT;
+ ps->option[MARVELL_OPTION_INPUT_SOURCE].constraint_type = SANE_CONSTRAINT_STRING_LIST;
+ ps->option[MARVELL_OPTION_INPUT_SOURCE].constraint.string_list = ps->input_source_list;
+
+ ps->option[MARVELL_OPTION_SCAN_RESOLUTION].name = SANE_NAME_SCAN_RESOLUTION;
+ ps->option[MARVELL_OPTION_SCAN_RESOLUTION].title = SANE_TITLE_SCAN_RESOLUTION;
+ ps->option[MARVELL_OPTION_SCAN_RESOLUTION].desc = SANE_DESC_SCAN_RESOLUTION;
+ ps->option[MARVELL_OPTION_SCAN_RESOLUTION].type = SANE_TYPE_INT;
+ ps->option[MARVELL_OPTION_SCAN_RESOLUTION].unit = SANE_UNIT_DPI;
+ ps->option[MARVELL_OPTION_SCAN_RESOLUTION].size = sizeof(SANE_Int);
+ ps->option[MARVELL_OPTION_SCAN_RESOLUTION].cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT;
+ ps->option[MARVELL_OPTION_SCAN_RESOLUTION].constraint_type = SANE_CONSTRAINT_WORD_LIST;
+ ps->option[MARVELL_OPTION_SCAN_RESOLUTION].constraint.word_list = ps->resolution_list;
+
+ ps->option[MARVELL_OPTION_GROUP_ADVANCED].name = "advanced-group";
+ ps->option[MARVELL_OPTION_GROUP_ADVANCED].title = STR_TITLE_ADVANCED;
+ ps->option[MARVELL_OPTION_GROUP_ADVANCED].type = SANE_TYPE_GROUP;
+ ps->option[MARVELL_OPTION_GROUP_ADVANCED].cap = SANE_CAP_ADVANCED;
+
+ ps->option[MARVELL_OPTION_CONTRAST].name = SANE_NAME_CONTRAST;
+ ps->option[MARVELL_OPTION_CONTRAST].title = SANE_TITLE_CONTRAST;
+ ps->option[MARVELL_OPTION_CONTRAST].desc = SANE_DESC_CONTRAST;
+ ps->option[MARVELL_OPTION_CONTRAST].type = SANE_TYPE_INT;
+ ps->option[MARVELL_OPTION_CONTRAST].unit = SANE_UNIT_NONE;
+ ps->option[MARVELL_OPTION_CONTRAST].size = sizeof(SANE_Int);
+ ps->option[MARVELL_OPTION_CONTRAST].cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT | SANE_CAP_ADVANCED;
+ ps->option[MARVELL_OPTION_CONTRAST].constraint_type = SANE_CONSTRAINT_RANGE;
+ ps->option[MARVELL_OPTION_CONTRAST].constraint.range = &ps->contrast_range;
+ ps->contrast_range.min = MARVELL_CONTRAST_MIN;
+ ps->contrast_range.max = MARVELL_CONTRAST_MAX;
+ ps->contrast_range.quant = 0;
+
+ ps->option[MARVELL_OPTION_GROUP_GEOMETRY].name = "geometry-group";
+ ps->option[MARVELL_OPTION_GROUP_GEOMETRY].title = STR_TITLE_GEOMETRY;
+ ps->option[MARVELL_OPTION_GROUP_GEOMETRY].type = SANE_TYPE_GROUP;
+ ps->option[MARVELL_OPTION_GROUP_GEOMETRY].cap = SANE_CAP_ADVANCED;
+
+ ps->option[MARVELL_OPTION_TL_X].name = SANE_NAME_SCAN_TL_X;
+ ps->option[MARVELL_OPTION_TL_X].title = SANE_TITLE_SCAN_TL_X;
+ ps->option[MARVELL_OPTION_TL_X].desc = SANE_DESC_SCAN_TL_X;
+ ps->option[MARVELL_OPTION_TL_X].type = SANE_TYPE_FIXED;
+ ps->option[MARVELL_OPTION_TL_X].unit = SANE_UNIT_MM;
+ ps->option[MARVELL_OPTION_TL_X].size = sizeof(SANE_Int);
+ ps->option[MARVELL_OPTION_TL_X].cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT;
+ ps->option[MARVELL_OPTION_TL_X].constraint_type = SANE_CONSTRAINT_RANGE;
+ ps->option[MARVELL_OPTION_TL_X].constraint.range = &ps->tlxRange;
+ ps->tlxRange.min = 0;
+ ps->tlxRange.quant = 0;
+
+ ps->option[MARVELL_OPTION_TL_Y].name = SANE_NAME_SCAN_TL_Y;
+ ps->option[MARVELL_OPTION_TL_Y].title = SANE_TITLE_SCAN_TL_Y;
+ ps->option[MARVELL_OPTION_TL_Y].desc = SANE_DESC_SCAN_TL_Y;
+ ps->option[MARVELL_OPTION_TL_Y].type = SANE_TYPE_FIXED;
+ ps->option[MARVELL_OPTION_TL_Y].unit = SANE_UNIT_MM;
+ ps->option[MARVELL_OPTION_TL_Y].size = sizeof(SANE_Int);
+ ps->option[MARVELL_OPTION_TL_Y].cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT;
+ ps->option[MARVELL_OPTION_TL_Y].constraint_type = SANE_CONSTRAINT_RANGE;
+ ps->option[MARVELL_OPTION_TL_Y].constraint.range = &ps->tlyRange;
+ ps->tlyRange.min = 0;
+ ps->tlyRange.quant = 0;
+
+ ps->option[MARVELL_OPTION_BR_X].name = SANE_NAME_SCAN_BR_X;
+ ps->option[MARVELL_OPTION_BR_X].title = SANE_TITLE_SCAN_BR_X;
+ ps->option[MARVELL_OPTION_BR_X].desc = SANE_DESC_SCAN_BR_X;
+ ps->option[MARVELL_OPTION_BR_X].type = SANE_TYPE_FIXED;
+ ps->option[MARVELL_OPTION_BR_X].unit = SANE_UNIT_MM;
+ ps->option[MARVELL_OPTION_BR_X].size = sizeof(SANE_Int);
+ ps->option[MARVELL_OPTION_BR_X].cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT;
+ ps->option[MARVELL_OPTION_BR_X].constraint_type = SANE_CONSTRAINT_RANGE;
+ ps->option[MARVELL_OPTION_BR_X].constraint.range = &ps->brxRange;
+ ps->brxRange.min = 0;
+ ps->brxRange.quant = 0;
+
+ ps->option[MARVELL_OPTION_BR_Y].name = SANE_NAME_SCAN_BR_Y;
+ ps->option[MARVELL_OPTION_BR_Y].title = SANE_TITLE_SCAN_BR_Y;
+ ps->option[MARVELL_OPTION_BR_Y].desc = SANE_DESC_SCAN_BR_Y;
+ ps->option[MARVELL_OPTION_BR_Y].type = SANE_TYPE_FIXED;
+ ps->option[MARVELL_OPTION_BR_Y].unit = SANE_UNIT_MM;
+ ps->option[MARVELL_OPTION_BR_Y].size = sizeof(SANE_Int);
+ ps->option[MARVELL_OPTION_BR_Y].cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT;
+ ps->option[MARVELL_OPTION_BR_Y].constraint_type = SANE_CONSTRAINT_RANGE;
+ ps->option[MARVELL_OPTION_BR_Y].constraint.range = &ps->bryRange;
+ ps->bryRange.min = 0;
+ ps->bryRange.quant = 0;
+
+ return 0;
+}
+
+/* Verify current x/y extents and set effective extents. */
+static int set_extents(struct marvell_session *ps)
+{
+ int stat = 0;
+
+ if ((ps->currentBrx > ps->currentTlx) && (ps->currentBrx - ps->currentTlx >= ps->min_width) && (ps->currentBrx - ps->currentTlx <= ps->tlxRange.max))
+ {
+ ps->effectiveTlx = ps->currentTlx;
+ ps->effectiveBrx = ps->currentBrx;
+ }
+ else
+ {
+ ps->effectiveTlx = 0; /* current setting is not valid, zero it */
+ ps->effectiveBrx = 0;
+ stat = 1;
+ }
+ if ((ps->currentBry > ps->currentTly) && (ps->currentBry - ps->currentTly > ps->min_height) && (ps->currentBry - ps->currentTly <= ps->tlyRange.max))
+ {
+ ps->effectiveTly = ps->currentTly;
+ ps->effectiveBry = ps->currentBry;
+ }
+ else
+ {
+ ps->effectiveTly = 0; /* current setting is not valid, zero it */
+ ps->effectiveBry = 0;
+ stat = 1;
+ }
+ return stat;
+}
+
+static struct marvell_session *create_session()
+{
+ struct marvell_session *ps;
+
+ if ((ps = malloc(sizeof(struct marvell_session))) == NULL)
+ {
+ BUG("malloc failed: %m\n");
+ return NULL;
+ }
+ memset(ps, 0, sizeof(struct marvell_session));
+ ps->tag = "MARVELL";
+ ps->dd = -1;
+ ps->cd = -1;
+
+ return ps;
+}
+
+/*
+ * SANE APIs.
+ */
+
+SANE_Status marvell_open(SANE_String_Const device, SANE_Handle *handle)
+{
+ struct hpmud_model_attributes ma;
+ int stat = SANE_STATUS_IO_ERROR;
+ int i;
+
+ DBG8("sane_hpaio_open(%s)\n", device);
+
+ if (session)
+ {
+ BUG("session in use\n");
+ return SANE_STATUS_DEVICE_BUSY;
+ }
+
+ if ((session = create_session()) == NULL)
+ return SANE_STATUS_NO_MEM;
+
+ /* Set session to specified device. */
+ snprintf(session->uri, sizeof(session->uri)-1, "hp:%s", device); /* prepend "hp:" */
+
+ /* Get actual model attributes from models.dat. */
+ hpmud_query_model(session->uri, &ma);
+ session->scan_type = ma.scantype;
+ session->scansrc = ma.scansrc;
+
+ switch (ma.scantype)
+ {
+ case HPMUD_SCANTYPE_MARVELL:
+ session->version = MARVELL_1;
+ break;
+ case HPMUD_SCANTYPE_MARVELL2:
+ session->version = MARVELL_2;
+ break;
+ default:
+ session->version = MARVELL_1;
+ };
+
+ if (hpmud_open_device(session->uri, ma.mfp_mode, &session->dd) != HPMUD_R_OK)
+ {
+ BUG("unable to open device %s\n", session->uri);
+ goto bugout;
+
+ free(session);
+ session = NULL;
+ return SANE_STATUS_IO_ERROR;
+ }
+
+ if (hpmud_open_channel(session->dd, HPMUD_S_MARVELL_SCAN_CHANNEL, &session->cd) != HPMUD_R_OK)
+ {
+ BUG("unable to open %s channel %s\n", HPMUD_S_MARVELL_SCAN_CHANNEL, session->uri);
+ stat = SANE_STATUS_DEVICE_BUSY;
+ goto bugout;
+ }
+
+ if (bb_load(session, "bb_marvell.so"))
+ {
+ stat = SANE_STATUS_IO_ERROR;
+ goto bugout;
+ }
+
+ /* Init sane option descriptors. */
+ init_options(session);
+
+ if (session->bb_open(session))
+ {
+ stat = SANE_STATUS_IO_ERROR;
+ goto bugout;
+ }
+
+ /* Set supported Scan Modes and set sane option. */
+ i=0;
+ session->scan_mode_list[i] = SANE_VALUE_SCAN_MODE_LINEART;
+ session->scan_mode_map[i++] = CE_BLACK_AND_WHITE1;
+ session->scan_mode_list[i] = SANE_VALUE_SCAN_MODE_GRAY;
+ session->scan_mode_map[i++] = CE_GRAY8;
+ session->scan_mode_list[i] = SANE_VALUE_SCAN_MODE_COLOR;
+ session->scan_mode_map[i++] = CE_RGB24;
+ marvell_control_option(session, MARVELL_OPTION_SCAN_MODE, SANE_ACTION_SET_AUTO, NULL, NULL); /* set default option */
+
+
+ /* Determine scan input source. */
+ i=0;
+ /* Some of the marvell devices supports both flatbed and ADF, No command to get the src types supported */
+ /* Getting from the model file */
+ if ( session->scansrc & HPMUD_SCANSRC_ADF)
+ {
+ session->input_source_list[i] = STR_ADF_MODE_ADF;
+ session->input_source_map[i++] = IS_ADF;
+ DBG8("scan src HPMUD_SCANSRC_ADF \n");
+ }
+ if ( session->scansrc & HPMUD_SCANSRC_FLATBED)
+ {
+ session->input_source_list[i] = STR_ADF_MODE_FLATBED;
+ session->input_source_map[i++] = IS_PLATEN;
+ DBG8("scan src HPMUD_SCANSRC_FLATBED \n");
+ }
+ /* Values if un specified in the, value is 0, get ADF state from the printer */
+ if (session->scansrc == HPMUD_SCANSRC_NA)
+ {
+ if (session->bb_is_paper_in_adf(session) == 2)
+ {
+ session->input_source_list[i] = STR_ADF_MODE_FLATBED;
+ session->input_source_map[i++] = IS_PLATEN;
+ DBG8("scan src b_is_paper_in_adf value 2 \n");
+ }
+ else
+ {
+ session->input_source_list[i] = STR_ADF_MODE_ADF;
+ session->input_source_map[i++] = IS_ADF;
+ DBG8("scan src b_is_paper_in_adf value not 2 \n");
+ }
+ }
+
+ marvell_control_option(session, MARVELL_OPTION_INPUT_SOURCE, SANE_ACTION_SET_AUTO, NULL, NULL); /* set default option */
+
+ /* Set supported resolutions. */
+ i=1;
+ session->resolution_list[i++] = 75;
+ session->resolution_list[i++] = 100;
+ session->resolution_list[i++] = 150;
+ session->resolution_list[i++] = 200;
+ session->resolution_list[i++] = 300;
+ session->resolution_list[i++] = 600;
+ session->resolution_list[i++] = 1200;
+ session->resolution_list[0] = i-1; /* length of word_list */
+ marvell_control_option(session, MARVELL_OPTION_SCAN_RESOLUTION, SANE_ACTION_SET_AUTO, NULL, NULL); /* set default option */
+
+ /* Set supported contrast. */
+ marvell_control_option(session, MARVELL_OPTION_CONTRAST, SANE_ACTION_SET_AUTO, NULL, NULL); /* set default option */
+
+ /* Set x,y extents. See bb_open(). */
+ marvell_control_option(session, MARVELL_OPTION_TL_X, SANE_ACTION_SET_AUTO, NULL, NULL); /* set default option */
+ marvell_control_option(session, MARVELL_OPTION_TL_Y, SANE_ACTION_SET_AUTO, NULL, NULL); /* set default option */
+ marvell_control_option(session, MARVELL_OPTION_BR_X, SANE_ACTION_SET_AUTO, NULL, NULL); /* set default option */
+ marvell_control_option(session, MARVELL_OPTION_BR_Y, SANE_ACTION_SET_AUTO, NULL, NULL); /* set default option */
+
+ *handle = (SANE_Handle *)session;
+
+ stat = SANE_STATUS_GOOD;
+
+bugout:
+
+ if (stat != SANE_STATUS_GOOD)
+ {
+ if (session)
+ {
+ bb_unload(session);
+ if (session->cd > 0)
+ hpmud_close_channel(session->dd, session->cd);
+ if (session->dd > 0)
+ hpmud_close_device(session->dd);
+ free(session);
+ session = NULL;
+ }
+ }
+
+ return stat;
+}
+
+void marvell_close(SANE_Handle handle)
+{
+ struct marvell_session *ps = (struct marvell_session *)handle;
+
+ DBG8("sane_hpaio_close()\n");
+
+ if (ps == NULL || ps != session)
+ {
+ BUG("invalid sane_close\n");
+ return;
+ }
+
+ ps->bb_close(ps);
+ bb_unload(ps);
+
+ if (ps->dd > 0)
+ {
+ if (ps->cd > 0)
+ hpmud_close_channel(ps->dd, ps->cd);
+ hpmud_close_device(ps->dd);
+ }
+
+ free(ps);
+ session = NULL;
+}
+
+const SANE_Option_Descriptor *marvell_get_option_descriptor(SANE_Handle handle, SANE_Int option)
+{
+ struct marvell_session *ps = (struct marvell_session *)handle;
+
+ DBG8("sane_hpaio_get_option_descriptor(option=%s)\n", ps->option[option].name);
+
+ if (option < 0 || option >= MARVELL_OPTION_MAX)
+ return NULL;
+
+ return &ps->option[option];
+}
+
+SANE_Status marvell_control_option(SANE_Handle handle, SANE_Int option, SANE_Action action, void *value, SANE_Int *set_result)
+{
+ struct marvell_session *ps = (struct marvell_session *)handle;
+ SANE_Int *int_value = value, mset_result=0;
+ int i, stat=SANE_STATUS_INVAL;
+ char sz[64];
+
+ switch(option)
+ {
+ case MARVELL_OPTION_COUNT:
+ if (action == SANE_ACTION_GET_VALUE)
+ {
+ *int_value = MARVELL_OPTION_MAX;
+ stat = SANE_STATUS_GOOD;
+ }
+ break;
+ case MARVELL_OPTION_SCAN_MODE:
+ if (action == SANE_ACTION_GET_VALUE)
+ {
+ for (i=0; ps->scan_mode_list[i]; i++)
+ {
+ if (ps->current_scan_mode == ps->scan_mode_map[i])
+ {
+ strcpy(value, ps->scan_mode_list[i]);
+ stat = SANE_STATUS_GOOD;
+ break;
+ }
+ }
+ }
+ else if (action == SANE_ACTION_SET_VALUE)
+ {
+ for (i=0; ps->scan_mode_list[i]; i++)
+ {
+ if (strcasecmp(ps->scan_mode_list[i], value) == 0)
+ {
+ ps->current_scan_mode = ps->scan_mode_map[i];
+ mset_result |= SANE_INFO_RELOAD_PARAMS | SANE_INFO_RELOAD_OPTIONS;
+ stat = SANE_STATUS_GOOD;
+ break;
+ }
+ }
+ }
+ else
+ { /* Set default. */
+ ps->current_scan_mode = ps->scan_mode_map[0];
+ stat = SANE_STATUS_GOOD;
+ }
+ break;
+ case MARVELL_OPTION_INPUT_SOURCE:
+ if (action == SANE_ACTION_GET_VALUE)
+ {
+ for (i=0; ps->input_source_list[i]; i++)
+ {
+ if (ps->current_input_source == ps->input_source_map[i])
+ {
+ strcpy(value, ps->input_source_list[i]);
+ stat = SANE_STATUS_GOOD;
+ break;
+ }
+ }
+ }
+ else if (action == SANE_ACTION_SET_VALUE)
+ {
+ for (i=0; ps->input_source_list[i]; i++)
+ {
+ if (strcasecmp(ps->input_source_list[i], value) == 0)
+ {
+ ps->current_input_source = ps->input_source_map[i];
+ stat = SANE_STATUS_GOOD;
+ break;
+ }
+ }
+ }
+ else
+ { /* Set default. */
+ ps->current_input_source = ps->input_source_map[0];
+ stat = SANE_STATUS_GOOD;
+ }
+ break;
+ case MARVELL_OPTION_SCAN_RESOLUTION:
+ if (action == SANE_ACTION_GET_VALUE)
+ {
+ *int_value = ps->current_resolution;
+ stat = SANE_STATUS_GOOD;
+ }
+ else if (action == SANE_ACTION_SET_VALUE)
+ {
+ for (i=1; i <= ps->resolution_list[0]; i++)
+ {
+ if (ps->resolution_list[i] == *int_value)
+ {
+ ps->current_resolution = *int_value;
+ mset_result |= SANE_INFO_RELOAD_PARAMS;
+ stat = SANE_STATUS_GOOD;
+ break;
+ }
+ }
+ }
+ else
+ { /* Set default. */
+ ps->current_resolution = 75;
+ stat = SANE_STATUS_GOOD;
+ }
+ break;
+ case MARVELL_OPTION_CONTRAST:
+ if (action == SANE_ACTION_GET_VALUE)
+ {
+ *int_value = ps->current_contrast;
+ stat = SANE_STATUS_GOOD;
+ }
+ else if (action == SANE_ACTION_SET_VALUE)
+ {
+ if (*int_value >= MARVELL_CONTRAST_MIN && *int_value <= MARVELL_CONTRAST_MAX)
+ {
+ ps->current_contrast = *int_value;
+ stat = SANE_STATUS_GOOD;
+ break;
+ }
+ }
+ else
+ { /* Set default. */
+ ps->current_contrast = MARVELL_CONTRAST_DEFAULT;
+ stat = SANE_STATUS_GOOD;
+ }
+ break;
+ case MARVELL_OPTION_TL_X:
+ if (action == SANE_ACTION_GET_VALUE)
+ {
+ *int_value = ps->currentTlx;
+ stat = SANE_STATUS_GOOD;
+ }
+ else if (action == SANE_ACTION_SET_VALUE)
+ {
+ if (*int_value >= ps->tlxRange.min && *int_value <= ps->tlxRange.max)
+ {
+ ps->currentTlx = *int_value;
+ mset_result |= SANE_INFO_RELOAD_PARAMS;
+ stat = SANE_STATUS_GOOD;
+ break;
+ }
+ }
+ else
+ { /* Set default. */
+ ps->currentTlx = ps->tlxRange.min;
+ stat = SANE_STATUS_GOOD;
+ }
+ break;
+ case MARVELL_OPTION_TL_Y:
+ if (action == SANE_ACTION_GET_VALUE)
+ {
+ *int_value = ps->currentTly;
+ stat = SANE_STATUS_GOOD;
+ }
+ else if (action == SANE_ACTION_SET_VALUE)
+ {
+ if (*int_value >= ps->tlyRange.min && *int_value <= ps->tlyRange.max)
+ {
+
+ ps->currentTly = *int_value;
+ mset_result |= SANE_INFO_RELOAD_PARAMS;
+ stat = SANE_STATUS_GOOD;
+ break;
+ }
+ }
+ else
+ { /* Set default. */
+ ps->currentTly = ps->tlyRange.min;
+ stat = SANE_STATUS_GOOD;
+ }
+ break;
+ case MARVELL_OPTION_BR_X:
+ if (action == SANE_ACTION_GET_VALUE)
+ {
+ *int_value = ps->currentBrx;
+ stat = SANE_STATUS_GOOD;
+ }
+ else if (action == SANE_ACTION_SET_VALUE)
+ {
+ if (*int_value >= ps->brxRange.min && *int_value <= ps->brxRange.max)
+ {
+ ps->currentBrx = *int_value;
+ mset_result |= SANE_INFO_RELOAD_PARAMS;
+ stat = SANE_STATUS_GOOD;
+ break;
+ }
+ }
+ else
+ { /* Set default. */
+ ps->currentBrx = ps->brxRange.max;
+ stat = SANE_STATUS_GOOD;
+ }
+ break;
+ case MARVELL_OPTION_BR_Y:
+ if (action == SANE_ACTION_GET_VALUE)
+ {
+ *int_value = ps->currentBry;
+ stat = SANE_STATUS_GOOD;
+ }
+ else if (action == SANE_ACTION_SET_VALUE)
+ {
+ if (*int_value >= ps->bryRange.min && *int_value <= ps->bryRange.max)
+ {
+ ps->currentBry = *int_value;
+ mset_result |= SANE_INFO_RELOAD_PARAMS;
+ stat = SANE_STATUS_GOOD;
+ break;
+ }
+ BUG("value=%d brymin=%d brymax=%d\n", *int_value, ps->bryRange.min, ps->bryRange.max);
+ }
+ else
+ { /* Set default. */
+ ps->currentBry = ps->bryRange.max;
+ stat = SANE_STATUS_GOOD;
+ }
+ break;
+ default:
+ break;
+ }
+
+ if (set_result)
+ *set_result = mset_result;
+
+ if (stat != SANE_STATUS_GOOD)
+ {
+ BUG("control_option failed: option=%s action=%s\n", ps->option[option].name,
+ action==SANE_ACTION_GET_VALUE ? "get" : action==SANE_ACTION_SET_VALUE ? "set" : "auto");
+ }
+
+ DBG8("sane_hpaio_control_option (option=%s action=%s value=%s)\n", ps->option[option].name,
+ action==SANE_ACTION_GET_VALUE ? "get" : action==SANE_ACTION_SET_VALUE ? "set" : "auto",
+ value ? ps->option[option].type == SANE_TYPE_STRING ? (char *)value : psnprintf(sz, sizeof(sz), "%d", *(int *)value) : "na");
+
+ return stat;
+}
+
+SANE_Status marvell_get_parameters(SANE_Handle handle, SANE_Parameters *params)
+{
+ struct marvell_session *ps = (struct marvell_session *)handle;
+
+ set_extents(ps);
+
+ ps->bb_get_parameters(ps, params, ps->ip_handle ? 1 : 0);
+
+ DBG8("sane_hpaio_get_parameters(): format=%d, last_frame=%d, lines=%d, depth=%d, pixels_per_line=%d, bytes_per_line=%d\n",
+ params->format, params->last_frame, params->lines, params->depth, params->pixels_per_line, params->bytes_per_line);
+
+ return SANE_STATUS_GOOD;
+}
+
+SANE_Status marvell_start(SANE_Handle handle)
+{
+ struct marvell_session *ps = (struct marvell_session *)handle;
+ SANE_Parameters pp;
+ IP_IMAGE_TRAITS traits;
+ IP_XFORM_SPEC xforms[IP_MAX_XFORMS], *pXform=xforms;
+ int stat, ret;
+// int tmo=EXCEPTION_TIMEOUT*2;
+
+ DBG8("sane_hpaio_start()\n");
+ ps->is_user_cancel = 0;
+
+ if (set_extents(ps))
+ {
+ BUG("invalid extents: tlx=%d brx=%d tly=%d bry=%d minwidth=%d minheight%d maxwidth=%d maxheight=%d\n",
+ ps->currentTlx, ps->currentTly, ps->currentBrx, ps->currentBry, ps->min_width, ps->min_height, ps->tlxRange.max, ps->tlyRange.max);
+ stat = SANE_STATUS_INVAL;
+ goto bugout;
+ }
+
+ /* If input is ADF and ADF is empty, return SANE_STATUS_NO_DOCS. */
+ if (ps->current_input_source == IS_ADF)
+ {
+ ret = ps->bb_is_paper_in_adf(ps); /* 0 = no paper in adf, 1 = paper in adf, 2 = no adf, -1 = error */
+ if (ret == 0)
+ {
+ stat = SANE_STATUS_NO_DOCS; /* done scanning */
+ SendScanEvent(ps->uri, EVENT_SCAN_ADF_NO_DOCS);
+ goto bugout;
+ }
+ else if (ret < 0)
+ {
+ stat = SANE_STATUS_IO_ERROR;
+ goto bugout;
+ }
+ }
+ /* Start scan and get actual image traits. */
+ if (ps->bb_start_scan(ps))
+ {
+ stat = SANE_STATUS_IO_ERROR;
+ goto bugout;
+ }
+
+ SendScanEvent(ps->uri, EVENT_START_SCAN_JOB);
+ memset(xforms, 0, sizeof(xforms));
+
+ /* Setup image-processing pipeline for xform. */
+ if (ps->current_scan_mode == CE_BLACK_AND_WHITE1)
+ {
+ pXform->aXformInfo[IP_GRAY_2_BI_THRESHOLD].dword = 127;
+ ADD_XFORM(X_GRAY_2_BI);
+ }
+
+ /* Setup x/y cropping for xform. (Actually we let cm1017 do it's own cropping) */
+ pXform->aXformInfo[IP_CROP_LEFT].dword = 0;
+ pXform->aXformInfo[IP_CROP_RIGHT].dword = 0;
+ pXform->aXformInfo[IP_CROP_TOP].dword = 0;
+ pXform->aXformInfo[IP_CROP_MAXOUTROWS].dword = 0;
+ ADD_XFORM(X_CROP);
+
+ /* Setup x/y padding for xform. (Actually we let cm1017 do it's own padding) */
+ pXform->aXformInfo[IP_PAD_LEFT].dword = 0; /* # of pixels to add to left side */
+ pXform->aXformInfo[IP_PAD_RIGHT].dword = 0; /* # of pixels to add to right side */
+ pXform->aXformInfo[IP_PAD_TOP].dword = 0; /* # of rows to add to top */
+ pXform->aXformInfo[IP_PAD_BOTTOM].dword = 0; /* # of rows to add to bottom */
+ pXform->aXformInfo[IP_PAD_VALUE].dword = ps->current_scan_mode == CE_BLACK_AND_WHITE1 ? 0 : -1; /* lineart white = 0, rgb white = -1 */
+ pXform->aXformInfo[IP_PAD_MIN_HEIGHT].dword = 0;
+ ADD_XFORM(X_PAD);
+
+ /* Open image processor. */
+ if ((ret = ipOpen(pXform-xforms, xforms, 0, &ps->ip_handle)) != IP_DONE)
+ {
+ BUG("unable open image processor: err=%d\n", ret);
+ stat = SANE_STATUS_INVAL;
+ goto bugout;
+ }
+
+ /* Get actual input image attributes. See bb_start_scan(). */
+ ps->bb_get_parameters(ps, &pp, 1);
+
+ /* Now set known input image attributes. */
+ traits.iPixelsPerRow = pp.pixels_per_line;
+ switch(ps->current_scan_mode)
+ {
+ case CE_BLACK_AND_WHITE1: /* lineart */
+ case CE_GRAY8:
+ traits.iBitsPerPixel = 8; /* grayscale */
+ break;
+ case CE_RGB24:
+ default:
+ traits.iBitsPerPixel = 24; /* color */
+ break;
+ }
+ traits.lHorizDPI = ps->current_resolution << 16;
+ traits.lVertDPI = ps->current_resolution << 16;
+ traits.lNumRows = pp.lines;
+ traits.iNumPages = 1;
+ traits.iPageNum = 1;
+ traits.iComponentsPerPixel = ((traits.iBitsPerPixel % 3) ? 1 : 3);
+ ipSetDefaultInputTraits(ps->ip_handle, &traits);
+
+ /* Get output image attributes from the image processor. */
+ ipGetImageTraits(ps->ip_handle, NULL, &ps->image_traits); /* get valid image traits */
+
+ stat = SANE_STATUS_GOOD;
+
+bugout:
+ if (stat != SANE_STATUS_GOOD)
+ {
+ if (ps->ip_handle)
+ {
+ ipClose(ps->ip_handle);
+ ps->ip_handle = 0;
+ }
+ ps->bb_end_scan(ps, stat == SANE_STATUS_IO_ERROR ? 1: 0);
+ }
+
+ return stat;
+}
+
+SANE_Status marvell_read(SANE_Handle handle, SANE_Byte *data, SANE_Int maxLength, SANE_Int *length)
+{
+ struct marvell_session *ps = (struct marvell_session *)handle;
+ int ret, stat=SANE_STATUS_IO_ERROR;
+// int tmo=EXCEPTION_TIMEOUT;
+
+ DBG8("sane_hpaio_read() handle=%p data=%p maxLength=%d\n", (void *)handle, data, maxLength);
+
+ ret = get_ip_data(ps, data, maxLength, length);
+
+ if(ret & (IP_INPUT_ERROR | IP_FATAL_ERROR))
+ {
+ BUG("ipConvert error=%x\n", ret);
+ goto bugout;
+ }
+
+ if (ret & IP_DONE)
+ {
+ stat = SANE_STATUS_EOF;
+ SendScanEvent(ps->uri, EVENT_END_SCAN_JOB);
+ }
+ else
+ stat = SANE_STATUS_GOOD;
+
+bugout:
+ if (stat != SANE_STATUS_GOOD)
+ {
+ if (ps->ip_handle)
+ {
+ /* Note always call ipClose when SANE_STATUS_EOF, do not depend on sane_cancel because sane_cancel is only called at the end of a batch job. */
+ ipClose(ps->ip_handle);
+ ps->ip_handle = 0;
+ }
+ //If user has cancelled scan from device
+ if (ps->is_user_cancel)
+ {
+ //Don't do anything. sane_hpaio_cancel() will be invoked automatically
+ SendScanEvent(ps->uri, EVENT_SCAN_CANCEL);
+ return SANE_STATUS_CANCELLED;
+
+ }
+ else
+ {
+ ps->bb_end_page(ps, stat == SANE_STATUS_IO_ERROR ? 1: 0);
+ }
+ }
+
+ DBG8("-sane_hpaio_read() output=%p bytes_read=%d maxLength=%d status=%d\n", data, *length, maxLength, stat);
+
+ return stat;
+}
+
+void marvell_cancel(SANE_Handle handle)
+{
+ struct marvell_session *ps = (struct marvell_session *)handle;
+
+ DBG8("sane_hpaio_cancel()\n");
+
+ /*
+ * Sane_cancel is always called at the end of the scan job. Note that on a multiple page scan job
+ * sane_cancel is called only once.
+ */
+ ps->is_user_cancel = 1 ;
+
+ if (ps->ip_handle)
+ {
+ ipClose(ps->ip_handle);
+ ps->ip_handle = 0;
+ }
+ ps->bb_end_scan(ps, 0);
+}
+
diff --git a/scan/sane/marvell.h b/scan/sane/marvell.h
new file mode 100755
index 0000000..18d177a
--- /dev/null
+++ b/scan/sane/marvell.h
@@ -0,0 +1,42 @@
+/************************************************************************************\
+
+ marvell.h - HP SANE backend support for Marvell based multi-function peripherals
+
+ (c) 2008 Copyright Hewlett-Packard Development Company, LP
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+ of the Software, and to permit persons to whom the Software is furnished to do
+ so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+\************************************************************************************/
+
+#ifndef _MARVELL_H
+#define _MARVELL_H
+
+#include "sane.h"
+
+SANE_Status marvell_open(SANE_String_Const device, SANE_Handle *handle);
+void marvell_close(SANE_Handle handle);
+const SANE_Option_Descriptor * marvell_get_option_descriptor(SANE_Handle handle, SANE_Int option);
+SANE_Status marvell_control_option(SANE_Handle handle, SANE_Int option, SANE_Action action, void *value, SANE_Int *info);
+SANE_Status marvell_get_parameters(SANE_Handle handle, SANE_Parameters *params);
+SANE_Status marvell_start(SANE_Handle handle);
+SANE_Status marvell_read(SANE_Handle handle, SANE_Byte *data, SANE_Int maxLength, SANE_Int *length);
+void marvell_cancel(SANE_Handle handle);
+
+#endif // _MARVELL_H
+
+
diff --git a/scan/sane/marvelli.h b/scan/sane/marvelli.h
new file mode 100644
index 0000000..b4d777b
--- /dev/null
+++ b/scan/sane/marvelli.h
@@ -0,0 +1,135 @@
+
+/************************************************************************************\
+
+ marvelli.h - HP SANE backend support for Marvell based multi-function peripherals
+
+ (c) 2008 Copyright Hewlett-Packard Development Company, LP
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+ of the Software, and to permit persons to whom the Software is furnished to do
+ so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+ Author: David Suffield, Yashwant Sahu
+
+\************************************************************************************/
+
+#ifndef _MARVELLI_H
+#define _MARVELLI_H
+
+#define MARVELL_CONTRAST_MIN -127
+#define MARVELL_CONTRAST_MAX 127
+#define MARVELL_CONTRAST_DEFAULT 0
+
+#define MM_PER_INCH 25.4
+
+enum MARVELL_OPTION_NUMBER
+{
+ MARVELL_OPTION_COUNT = 0,
+ MARVELL_OPTION_GROUP_SCAN_MODE,
+ MARVELL_OPTION_SCAN_MODE,
+ MARVELL_OPTION_SCAN_RESOLUTION,
+ MARVELL_OPTION_INPUT_SOURCE, /* platen, ADF */
+ MARVELL_OPTION_GROUP_ADVANCED,
+ MARVELL_OPTION_CONTRAST,
+ MARVELL_OPTION_GROUP_GEOMETRY,
+ MARVELL_OPTION_TL_X,
+ MARVELL_OPTION_TL_Y,
+ MARVELL_OPTION_BR_X,
+ MARVELL_OPTION_BR_Y,
+ MARVELL_OPTION_MAX
+};
+
+#define MAX_LIST_SIZE 32
+#define MAX_STRING_SIZE 32
+
+enum COLOR_ENTRY
+{
+ CE_BLACK_AND_WHITE1 = 1,
+ CE_GRAY8,
+ CE_RGB24,
+ CE_MAX,
+};
+
+enum INPUT_SOURCE
+{
+ IS_PLATEN = 1,
+ IS_ADF,
+ IS_MAX,
+};
+
+enum MARVELL_VERSION
+{
+ MARVELL_1 = 1,
+ MARVELL_2,
+};
+
+struct marvell_session
+{
+ char *tag; /* handle identifier */
+ HPMUD_DEVICE dd; /* hpiod device descriptor */
+ HPMUD_CHANNEL cd; /* hpiod soap channel descriptor */
+ char uri[HPMUD_LINE_SIZE];
+ char model[HPMUD_LINE_SIZE];
+ int scan_type;
+ int is_user_cancel;
+ IP_IMAGE_TRAITS image_traits; /* specified by image processor */
+
+ SANE_Option_Descriptor option[MARVELL_OPTION_MAX];
+
+ SANE_String_Const scan_mode_list[CE_MAX];
+ enum COLOR_ENTRY scan_mode_map[CE_MAX];
+ enum COLOR_ENTRY current_scan_mode;
+
+ SANE_String_Const input_source_list[IS_MAX];
+ enum INPUT_SOURCE input_source_map[IS_MAX];
+ enum INPUT_SOURCE current_input_source;
+
+ SANE_Int resolution_list[MAX_LIST_SIZE];
+ SANE_Int current_resolution;
+
+ SANE_Range contrast_range;
+ SANE_Int current_contrast;
+
+ SANE_Range tlxRange, tlyRange, brxRange, bryRange;
+ SANE_Fixed currentTlx, currentTly, currentBrx, currentBry;
+ SANE_Fixed effectiveTlx, effectiveTly, effectiveBrx, effectiveBry;
+ SANE_Fixed min_width, min_height;
+
+ IP_HANDLE ip_handle;
+
+ int cnt; /* number bytes available in buf[] */
+ unsigned char buf[32768]; /* line buffer (max = 1200dpi * 8.5inches * 3pixels) */
+
+ void *hpmud_handle; /* returned by dlopen */
+ void *bb_handle; /* returned by dlopen */
+ void *bb_session;
+ int (*bb_open)(struct marvell_session *ps);
+ int (*bb_close)(struct marvell_session *ps);
+ int (*bb_get_parameters)(struct marvell_session *ps, SANE_Parameters *pp, int scan_started);
+ int (*bb_is_paper_in_adf)(struct marvell_session *ps); /* 0 = no paper in adf, 1 = paper in adf, 2 = no adf, -1 = error */
+ int (*bb_start_scan)(struct marvell_session *ps);
+ int (*bb_get_image_data)(struct marvell_session *ps, int max_length); /* see cnt and buf above */
+ int (*bb_end_page)(struct marvell_session *ps, int io_error);
+ int (*bb_end_scan)(struct marvell_session *ps, int io_error);
+/* Add new elements here. */
+ void *math_handle; /* returned by dlopen */
+ enum HPMUD_SCANSRC scansrc; /* 0=NA */
+ enum MARVELL_VERSION version;
+};
+
+#endif // _MARVELLI_H
+
+
diff --git a/scan/sane/mfpdtf.c b/scan/sane/mfpdtf.c
new file mode 100755
index 0000000..4591c27
--- /dev/null
+++ b/scan/sane/mfpdtf.c
@@ -0,0 +1,535 @@
+/************************************************************************************\
+
+ mfpdtf.c - HP Multi-Function Peripheral Data Transfer Format filter.
+
+ (c) 2001-2005 Copyright Hewlett-Packard Development Company, LP
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+ of the Software, and to permit persons to whom the Software is furnished to do
+ so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+ Contributing Author(s): David Paschal, Don Welch, David Suffield
+
+\************************************************************************************/
+
+#include "common.h"
+#include "mfpdtf.h"
+#include "io.h"
+
+#define DEBUG_DECLARE_ONLY
+#include "sanei_debug.h"
+
+static union MfpdtfVariantHeader_u * MfpdtfReadAllocateVariantHeader( Mfpdtf_t mfpdtf,
+ int datalen )
+{
+ if( mfpdtf->read.pVariantHeader )
+ {
+ free( mfpdtf->read.pVariantHeader );
+ mfpdtf->read.pVariantHeader = 0;
+ }
+ mfpdtf->read.lenVariantHeader = datalen;
+ if( datalen )
+ {
+ mfpdtf->read.pVariantHeader = malloc( datalen );
+ }
+ return mfpdtf->read.pVariantHeader;
+}
+
+static int MfpdtfReadSetTimeout( Mfpdtf_t mfpdtf, int seconds )
+{
+ mfpdtf->read.timeout.tv_sec = seconds;
+ mfpdtf->read.timeout.tv_usec = 0;
+
+ return seconds;
+}
+
+Mfpdtf_t __attribute__ ((visibility ("hidden"))) MfpdtfAllocate( int deviceid, int channelid )
+{
+ int size = sizeof( struct Mfpdtf_s );
+ Mfpdtf_t mfpdtf = malloc( size );
+
+ if( mfpdtf )
+ {
+ memset( mfpdtf, 0, size );
+ mfpdtf->channelid = channelid;
+ mfpdtf->deviceid = deviceid;
+ mfpdtf->fdLog = -1;
+ MfpdtfReadSetTimeout( mfpdtf, 30 );
+ MfpdtfReadStart( mfpdtf );
+ }
+
+ return mfpdtf;
+}
+
+int __attribute__ ((visibility ("hidden"))) MfpdtfDeallocate( Mfpdtf_t mfpdtf )
+{
+ if( !mfpdtf )
+ {
+ return ERROR;
+ }
+ MfpdtfLogToFile( mfpdtf, 0 );
+ MfpdtfReadAllocateVariantHeader( mfpdtf, 0 );
+ free( mfpdtf );
+ return OK;
+}
+
+int __attribute__ ((visibility ("hidden"))) MfpdtfSetChannel( Mfpdtf_t mfpdtf, int channelid )
+{
+ mfpdtf->channelid = channelid;
+ /* If necessary, we can query the device ID string using the
+ * channel's device pointer. */
+ return OK;
+}
+
+int __attribute__ ((visibility ("hidden"))) MfpdtfLogToFile( Mfpdtf_t mfpdtf, char * filename )
+{
+ if( mfpdtf->fdLog != -1 )
+ {
+ close( mfpdtf->fdLog );
+ mfpdtf->fdLog = -1;
+ }
+ mfpdtf->logOffset = 0;
+ if( filename )
+ {
+ int fd = creat( filename, 0600 );
+ if( fd < 0 )
+ {
+ return ERROR;
+ }
+ mfpdtf->fdLog = fd;
+ }
+ return OK;
+}
+
+int __attribute__ ((visibility ("hidden"))) MfpdtfReadGetSimulateImageHeaders( Mfpdtf_t mfpdtf )
+{
+ return mfpdtf->read.simulateImageHeaders;
+}
+
+int __attribute__ ((visibility ("hidden"))) MfpdtfReadSetSimulateImageHeaders( Mfpdtf_t mfpdtf,
+ int simulateImageHeaders )
+{
+ mfpdtf->read.simulateImageHeaders = simulateImageHeaders;
+ return simulateImageHeaders;
+}
+
+int __attribute__ ((visibility ("hidden"))) MfpdtfReadStart( Mfpdtf_t mfpdtf )
+{
+ mfpdtf->read.lastServiceResult = 0;
+ mfpdtf->read.dataType = ERROR;
+ mfpdtf->read.arrayRecordCount = mfpdtf->read.arrayRecordSize;
+ mfpdtf->read.fixedBlockBytesRemaining = 0;
+ mfpdtf->read.innerBlockBytesRemaining = 0;
+ mfpdtf->read.dontDecrementInnerBlock = 0;
+ MfpdtfReadAllocateVariantHeader( mfpdtf, 0 );
+
+ return OK;
+}
+
+static int MfpdtfReadIsImageData( Mfpdtf_t mfpdtf )
+{
+ return ( ( MFPDTF_DT_MASK_IMAGE & ( 1 << mfpdtf->read.dataType ) ) !=
+ 0 );
+}
+
+static int MfpdtfReadIsArrayData( Mfpdtf_t mfpdtf )
+{
+ return ( !MfpdtfReadIsImageData( mfpdtf ) );
+}
+
+#define READ(buffer,datalen) \
+ do { \
+ int r=MfpdtfReadGeneric(mfpdtf, \
+ (unsigned char *)(buffer),datalen); \
+ if (r!=datalen) { \
+ if (r<0) return MFPDTF_RESULT_READ_ERROR; \
+ return MFPDTF_RESULT_READ_TIMEOUT; \
+ } \
+ } while(0)
+
+#define RETURN(_result) \
+ return (mfpdtf->read.lastServiceResult=(_result));
+
+static int MfpdtfReadGeneric( Mfpdtf_t mfpdtf, unsigned char * buffer, int datalen )
+{
+ int r = 0;
+
+ /* Don't read past the currently-defined fixed block. */
+ if( datalen > mfpdtf->read.fixedBlockBytesRemaining )
+ {
+ datalen = mfpdtf->read.fixedBlockBytesRemaining;
+ }
+
+ /* Read the data. */
+ if( datalen > 0 )
+ {
+ r = ReadChannelEx(mfpdtf->deviceid,
+ mfpdtf->channelid,
+ buffer,
+ datalen,
+ EXCEPTION_TIMEOUT);
+
+ if( r > 0 )
+ {
+ /* Account for and log what was read. */
+ mfpdtf->read.fixedBlockBytesRemaining -= r;
+
+ if( !mfpdtf->read.dontDecrementInnerBlock )
+ {
+ mfpdtf->read.innerBlockBytesRemaining -= r;
+ }
+
+ mfpdtf->read.dontDecrementInnerBlock = 0;
+ }
+
+ if( r != datalen )
+ {
+ mfpdtf->read.lastServiceResult = r < 0 ?
+ MFPDTF_RESULT_READ_ERROR :
+ MFPDTF_RESULT_READ_TIMEOUT;
+ }
+ }
+
+ return r;
+}
+
+int __attribute__ ((visibility ("hidden"))) MfpdtfReadService( Mfpdtf_t mfpdtf )
+{
+ int result = 0;
+ int datalen, blockLength, headerLength;
+
+ if( mfpdtf->read.fixedBlockBytesRemaining <= 0 )
+ {
+ /* Read fixed header. */
+ datalen = sizeof( mfpdtf->read.fixedHeader );
+ mfpdtf->read.fixedBlockBytesRemaining = datalen;
+ // DBG( 0, "********************************** FIXED HEADER **********************************.\n" );
+ mfpdtf->read.dontDecrementInnerBlock = 1;
+
+ //READ( &mfpdtf->read.fixedHeader, datalen );
+
+ int r = MfpdtfReadGeneric( mfpdtf, (unsigned char *)&mfpdtf->read.fixedHeader, datalen );
+
+ if( r!= datalen )
+ {
+ if( r < 0 )
+ return MFPDTF_RESULT_READ_ERROR;
+
+ return MFPDTF_RESULT_READ_TIMEOUT;
+ }
+
+ /* Parse fixed header. */
+ blockLength = LEND_GET_LONG( mfpdtf->read.fixedHeader.blockLength );
+ mfpdtf->read.fixedBlockBytesRemaining = blockLength - datalen;
+ headerLength = LEND_GET_SHORT( mfpdtf->read.fixedHeader.headerLength );
+
+ /* Scan data type? */
+ if(mfpdtf->read.fixedHeader.dataType != DT_SCAN)
+ {
+ bug("invalid mfpdtf fixed header datatype=%d\n", mfpdtf->read.fixedHeader.dataType);
+ return MFPDTF_RESULT_READ_ERROR;
+ }
+
+ /* Is this a new data type? */
+ if( mfpdtf->read.dataType != mfpdtf->read.fixedHeader.dataType )
+ {
+ mfpdtf->read.dataType = mfpdtf->read.fixedHeader.dataType;
+ result |= MFPDTF_RESULT_NEW_DATA_TYPE;
+ }
+
+ DBG(6, "fixed header page_flags=%x: %s %d\n", mfpdtf->read.fixedHeader.pageFlags, __FILE__, __LINE__);
+
+ /* Read variant header (if any). */
+ datalen = headerLength - sizeof( mfpdtf->read.fixedHeader );
+
+ if( datalen > 0 )
+ {
+ DBG(6, "reading variant header size=%d: %s %d\n", datalen, __FILE__, __LINE__);
+
+ if( !MfpdtfReadAllocateVariantHeader( mfpdtf, datalen ) )
+ {
+ RETURN( MFPDTF_RESULT_OTHER_ERROR );
+ }
+ mfpdtf->read.dontDecrementInnerBlock = 1;
+
+ int r = MfpdtfReadGeneric( mfpdtf, (unsigned char *)mfpdtf->read.pVariantHeader, datalen );
+
+ if( r!= datalen )
+ {
+ if( r < 0 )
+ return MFPDTF_RESULT_READ_ERROR;
+
+ return MFPDTF_RESULT_READ_TIMEOUT;
+
+ }
+
+ // DBG( 0, "********************************** VARIANT HEADER **********************************.\n" );
+
+ result |= MFPDTF_RESULT_NEW_VARIANT_HEADER;
+
+ /* Is this a valid array variant header? */
+ mfpdtf->read.arrayRecordSize = 0;
+ mfpdtf->read.arrayRecordCount = 0;
+ mfpdtf->read.innerBlockBytesRemaining = 0;
+
+ if( MfpdtfReadIsArrayData( mfpdtf ) &&
+ mfpdtf->read.lenVariantHeader >=
+ sizeof( mfpdtf->read.pVariantHeader->array ) )
+ {
+ mfpdtf->read.arrayRecordCount = LEND_GET_SHORT( mfpdtf->read.pVariantHeader->array.recordCount );
+ mfpdtf->read.arrayRecordSize = LEND_GET_SHORT( mfpdtf->read.pVariantHeader->array.recordSize );
+ mfpdtf->read.innerBlockBytesRemaining = mfpdtf->read.arrayRecordCount * mfpdtf->read.arrayRecordSize;
+ }
+ }
+ }
+ else if( MfpdtfReadIsImageData( mfpdtf ) )
+ {
+ if( mfpdtf->read.innerBlockBytesRemaining > 0 )
+ {
+ result |= MFPDTF_RESULT_IMAGE_DATA_PENDING;
+ }
+ else if( mfpdtf->read.simulateImageHeaders )
+ {
+ mfpdtf->read.innerBlockBytesRemaining = mfpdtf->read.fixedBlockBytesRemaining;
+
+ if( mfpdtf->read.innerBlockBytesRemaining > 0 )
+ {
+ result |= MFPDTF_RESULT_IMAGE_DATA_PENDING;
+ }
+ }
+ else
+ {
+ unsigned char id;
+ datalen = 1;
+
+ //READ( &id, datalen );
+
+ int r = MfpdtfReadGeneric( mfpdtf, (unsigned char *)&id, datalen );
+
+ if( r!= datalen )
+ {
+ if( r < 0 )
+ return MFPDTF_RESULT_READ_ERROR;
+
+ return MFPDTF_RESULT_READ_TIMEOUT;
+
+ }
+
+ if( id == MFPDTF_ID_RASTER_DATA )
+ {
+ datalen = sizeof( mfpdtf->read.imageRasterDataHeader );
+ // DBG( 0, "Reading raster data header.\n" );
+
+ // DBG( 0, "********************************** RASTER RECORD **********************************.\n" );
+ int r = MfpdtfReadGeneric( mfpdtf, (unsigned char *)&mfpdtf->read.imageRasterDataHeader, datalen );
+
+ if( r!= datalen )
+ {
+ if( r < 0 )
+ return MFPDTF_RESULT_READ_ERROR;
+
+ return MFPDTF_RESULT_READ_TIMEOUT;
+
+ }
+
+
+ mfpdtf->read.innerBlockBytesRemaining = LEND_GET_SHORT( mfpdtf->read.imageRasterDataHeader.byteCount );
+ result |= MFPDTF_RESULT_IMAGE_DATA_PENDING;
+ }
+ else if( id == MFPDTF_ID_START_PAGE )
+ {
+ datalen = sizeof( mfpdtf->read.imageStartPageRecord );
+ // DBG( 0, "Reading start of page record.\n" );
+ // DBG( 0, "********************************** SOP RECORD **********************************.\n" );
+ int r = MfpdtfReadGeneric( mfpdtf, (unsigned char *)&mfpdtf->read.imageStartPageRecord, datalen );
+
+ if( r!= datalen )
+ {
+ if( r < 0 )
+ return MFPDTF_RESULT_READ_ERROR;
+
+ return MFPDTF_RESULT_READ_TIMEOUT;
+
+ }
+
+ result |= MFPDTF_RESULT_NEW_START_OF_PAGE_RECORD;
+ }
+ else if( id == MFPDTF_ID_END_PAGE )
+ {
+ datalen = sizeof( mfpdtf->read.imageEndPageRecord );
+ // DBG( 0, "Reading end of page record.\n" );
+ // DBG( 0, "********************************** EOP RECORD **********************************.\n" );
+ int r = MfpdtfReadGeneric( mfpdtf, (unsigned char *)&mfpdtf->read.imageEndPageRecord, datalen );
+
+ if( r!= datalen )
+ {
+ if( r < 0 )
+ return MFPDTF_RESULT_READ_ERROR;
+
+ return MFPDTF_RESULT_READ_TIMEOUT;
+
+ }
+
+
+ result |= MFPDTF_RESULT_NEW_END_OF_PAGE_RECORD;
+ }
+ else
+ {
+ RETURN( MFPDTF_RESULT_OTHER_ERROR );
+ }
+ }
+ }
+ else if( MfpdtfReadIsArrayData( mfpdtf ) )
+ {
+ if( mfpdtf->read.innerBlockBytesRemaining > 0 )
+ {
+ result |= MFPDTF_RESULT_ARRAY_DATA_PENDING;
+ }
+ }
+
+ if( mfpdtf->read.fixedBlockBytesRemaining > 0 )
+ {
+ result |= MFPDTF_RESULT_GENERIC_DATA_PENDING;
+ }
+
+ RETURN( ( result | mfpdtf->read.fixedHeader.pageFlags ) );
+}
+
+int __attribute__ ((visibility ("hidden"))) MfpdtfReadGetLastServiceResult( Mfpdtf_t mfpdtf )
+{
+ return mfpdtf->read.lastServiceResult;
+}
+
+int __attribute__ ((visibility ("hidden"))) MfpdtfReadGetVariantHeader( Mfpdtf_t mfpdtf,
+ union MfpdtfVariantHeader_u * buffer,
+ int maxlen )
+{
+ if( !mfpdtf->read.pVariantHeader )
+ {
+ return 0;
+ }
+ if( !buffer )
+ {
+ return mfpdtf->read.lenVariantHeader;
+ }
+ if( maxlen > mfpdtf->read.lenVariantHeader )
+ {
+ maxlen = mfpdtf->read.lenVariantHeader;
+ }
+ memcpy( buffer, mfpdtf->read.pVariantHeader, maxlen );
+ return maxlen;
+}
+
+int __attribute__ ((visibility ("hidden"))) MfpdtfReadGetStartPageRecord( Mfpdtf_t mfpdtf,
+ struct MfpdtfImageStartPageRecord_s * buffer,
+ int maxlen )
+{
+ int len = sizeof( struct MfpdtfImageStartPageRecord_s );
+ if( maxlen > len )
+ {
+ maxlen = len;
+ }
+ memcpy( buffer, &mfpdtf->read.imageStartPageRecord, maxlen );
+ return maxlen;
+}
+
+int __attribute__ ((visibility ("hidden"))) MfpdtfReadInnerBlock( Mfpdtf_t mfpdtf,
+ unsigned char * buffer,
+ int countdown )
+{
+ int r, countup = 0;
+
+ while( 1 )
+ {
+ if( countdown > mfpdtf->read.innerBlockBytesRemaining )
+ {
+ countdown = mfpdtf->read.innerBlockBytesRemaining;
+ }
+
+ if( countdown <= 0 )
+ {
+ break;
+ }
+
+ r = MfpdtfReadGeneric( mfpdtf, buffer, countdown );
+
+ if( MfpdtfReadGetLastServiceResult( mfpdtf ) & MFPDTF_RESULT_ERROR_MASK )
+ {
+ break;
+ }
+
+ if( mfpdtf->fdLog >= 0 )
+ {
+ write( mfpdtf->fdLog, buffer, r ); /* log raw rgb data, use imagemagick to display */
+ }
+
+ buffer += r;
+ countdown -= r;
+ countup += r;
+
+ if( countdown <= 0 )
+ {
+ break;
+ }
+
+ r = MfpdtfReadService( mfpdtf );
+
+ if( r & ( MFPDTF_RESULT_ERROR_MASK |
+ MFPDTF_RESULT_NEW_DATA_TYPE |
+ MFPDTF_RESULT_NEW_VARIANT_HEADER ) )
+ {
+ break;
+ }
+ }
+
+ return countup;
+}
+
+/*
+ * Phase 2 rewrite. des
+ */
+
+int __attribute__ ((visibility ("hidden"))) read_mfpdtf_block(int device, int channel, char *buf, int bufSize, int timeout)
+{
+ MFPDTF_FIXED_HEADER *phd = (MFPDTF_FIXED_HEADER *)buf;
+ int size, bsize=0, len;
+
+ /* Read fixed header with timeout in seconds. */
+ size = sizeof(MFPDTF_FIXED_HEADER);
+ if ((len = ReadChannelEx(device, channel, (unsigned char *)buf, size, timeout)) != size)
+ goto bugout;
+
+ bsize = le32toh(phd->BlockLength);
+ if (bsize > bufSize)
+ {
+ bug("invalid bufsize: size=%d max=%d ReadMfpdtfBlock %s %d\n", bsize, bufSize, __FILE__, __LINE__);
+ bsize = -1;
+ goto bugout;
+ }
+
+ size = bsize - sizeof(MFPDTF_FIXED_HEADER);
+ // if ((len = ReadChannelEx(device, channel, (unsigned char *)buf+sizeof(MFPDTF_FIXED_HEADER), size, 5)) != size)
+ if ((len = ReadChannelEx(device, channel, (unsigned char *)buf+sizeof(MFPDTF_FIXED_HEADER), size, 10)) != size)
+ {
+ bug("invalid read: exp=%d act=%d ReadMfpdtfBlock %s %d\n", size, len, __FILE__, __LINE__);
+ bsize = -1;
+ goto bugout;
+ }
+
+bugout:
+ return bsize;
+}
+
diff --git a/scan/sane/mfpdtf.h b/scan/sane/mfpdtf.h
new file mode 100755
index 0000000..b51b0b9
--- /dev/null
+++ b/scan/sane/mfpdtf.h
@@ -0,0 +1,342 @@
+/************************************************************************************\
+
+ mfpdtf.h - HP Multi-Function Peripheral Data Transfer Format filter.
+
+ (c) 2001-2005 Copyright Hewlett-Packard Development Company, LP
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+ of the Software, and to permit persons to whom the Software is furnished to do
+ so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+ Contributing Author(s): David Paschal, Don Welch, David Suffield
+
+\************************************************************************************/
+
+#if !defined(_MFPDTF_H )
+#define _MFPDTF_H
+
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <string.h>
+#include <stdint.h>
+
+
+enum MfpdtfImageRecordID_e { MFPDTF_ID_START_PAGE = 0,
+ MFPDTF_ID_RASTER_DATA = 1,
+ MFPDTF_ID_END_PAGE = 2 };
+
+struct MfpdtfFixedHeader_s
+{
+ unsigned char blockLength[4]; /* Includes header(s). */
+ unsigned char headerLength[2]; /* Just header(s). */
+ unsigned char dataType;
+ unsigned char pageFlags;
+} __attribute__(( packed) );
+
+struct MfpdtfImageRasterDataHeader_s
+{
+ unsigned char traits; /* Unused. */
+ unsigned char byteCount[2];
+} __attribute__(( packed) );
+
+struct MfpdtfImageStartPageRecord_s
+{
+ unsigned char encoding;
+ unsigned char pageNumber[2];
+ struct
+ {
+ unsigned char pixelsPerRow[2];
+ unsigned char bitsPerPixel[2];
+ unsigned char rowsThisPage[4];
+ unsigned char xres[4];
+ unsigned char yres[4];
+ } black, color;
+} __attribute__(( packed) );
+
+struct MfpdtfImageEndPageRecord_s
+{
+ unsigned char unused[3];
+ struct
+ {
+ unsigned char numberOfRows[4];
+ } black, color;
+} __attribute__(( packed) );
+
+struct Mfpdtf_s
+{
+ //ptalChannel_t chan;
+ int deviceid;
+ int channelid;
+ int fdLog; /* <0 means not (yet) open. */
+ int logOffset;
+
+ struct
+ {
+ struct timeval timeout;
+ int simulateImageHeaders;
+
+ int lastServiceResult;
+ int dataType; /* <0 means not (yet) valid. */
+ int arrayRecordCount;
+ int arrayRecordSize;
+ int fixedBlockBytesRemaining; /* Also generic data. */
+ int innerBlockBytesRemaining; /* Image or array data. */
+ int dontDecrementInnerBlock;
+
+ struct MfpdtfFixedHeader_s fixedHeader;
+ int lenVariantHeader;
+ union MfpdtfVariantHeader_u * pVariantHeader;
+ struct MfpdtfImageStartPageRecord_s imageStartPageRecord;
+ struct MfpdtfImageRasterDataHeader_s imageRasterDataHeader;
+ struct MfpdtfImageEndPageRecord_s imageEndPageRecord;
+ } read;
+};
+
+typedef struct Mfpdtf_s * Mfpdtf_t;
+
+#define MFPDTF_RESULT_NEW_PAGE 0x00000001
+#define MFPDTF_RESULT_END_PAGE 0x00000002
+#define MFPDTF_RESULT_NEW_DOCUMENT 0x00000004
+#define MFPDTF_RESULT_END_DOCUMENT 0x00000008
+
+#define MFPDTF_RESULT_END_STREAM 0x00000010
+#define MFPDTF_RESULT_RESERVED_20 0x00000020
+#define MFPDTF_RESULT_RESERVED_40 0x00000040
+#define MFPDTF_RESULT_RESERVED_80 0x00000080
+
+#define MFPDTF_RESULT_00000100 0x00000100
+#define MFPDTF_RESULT_READ_TIMEOUT 0x00000200
+#define MFPDTF_RESULT_READ_ERROR 0x00000400
+#define MFPDTF_RESULT_OTHER_ERROR 0x00000800
+
+#define MFPDTF_RESULT_ERROR_MASK 0x00000E00
+
+#define MFPDTF_RESULT_NEW_DATA_TYPE 0x00001000
+#define MFPDTF_RESULT_NEW_VARIANT_HEADER 0x00002000
+#define MFPDTF_RESULT_GENERIC_DATA_PENDING 0x00004000
+#define MFPDTF_RESULT_ARRAY_DATA_PENDING 0x00008000
+
+#define MFPDTF_RESULT_NEW_START_OF_PAGE_RECORD 0x00010000
+#define MFPDTF_RESULT_IMAGE_DATA_PENDING 0x00020000
+#define MFPDTF_RESULT_NEW_END_OF_PAGE_RECORD 0x00040000
+#define MFPDTF_RESULT_00080000 0x00080000
+
+#define MFPDTF_RESULT_INNER_DATA_PENDING 0x00028000
+
+enum MfpdtfDataType_e { MFPDTF_DT_UNKNOWN = 0,
+ MFPDTF_DT_FAX_IMAGES = 1,
+ MFPDTF_DT_SCANNED_IMAGES = 2,
+ MFPDTF_DT_DIAL_STRINGS = 3,
+ MFPDTF_DT_DEMO_PAGES = 4,
+ MFPDTF_DT_SPEED_DIALS = 5,
+ MFPDTF_DT_FAX_LOGS = 6,
+ MFPDTF_DT_CFG_PARMS = 7,
+ MFPDTF_DT_LANG_STRS = 8,
+ MFPDTF_DT_JUNK_FAX_CSIDS = 9, /* MFPDTF_DT_DIAL_STRINGS */
+ MFPDTF_DT_REPORT_STRS = 10, /* MFPDTF_DT_LANG_STRS */
+ MFPDTF_DT_FONTS = 11,
+ MFPDTF_DT_TTI_BITMAP = 12,
+ MFPDTF_DT_COUNTERS = 13,
+ MFPDTF_DT_DEF_PARMS = 14, /* MFPDTF_DT_CFG_PARMS */
+ MFPDTF_DT_SCAN_OPTIONS = 15,
+ MFPDTF_DT_FW_JOB_TABLE = 17 };
+#define MFPDTF_DT_MASK_IMAGE \
+ ((1<<MFPDTF_DT_FAX_IMAGES) | \
+ (1<<MFPDTF_DT_SCANNED_IMAGES) | \
+ (1<<MFPDTF_DT_DEMO_PAGES))
+
+enum MfpdtfImageEncoding_e { MFPDTF_RASTER_BITMAP = 0,
+ MFPDTF_RASTER_GRAYMAP = 1,
+ MFPDTF_RASTER_MH = 2,
+ MFPDTF_RASTER_MR = 3,
+ MFPDTF_RASTER_MMR = 4,
+ MFPDTF_RASTER_RGB = 5,
+ MFPDTF_RASTER_YCC411 = 6,
+ MFPDTF_RASTER_JPEG = 7,
+ MFPDTF_RASTER_PCL = 8,
+ MFPDTF_RASTER_NOT = 9 };
+
+
+union MfpdtfVariantHeader_u
+{
+ struct MfpdtfVariantHeaderFaxDataArtoo_s
+ {
+ unsigned char majorVersion; /* 1 */
+ unsigned char minorVersion; /* 0 */
+ unsigned char dataSource; /* unknown=0,prev,host,fax,pollfax,scanner */
+ unsigned char dataFormat; /* unknown=0,ASCII=3,CCITT_G3=10 */
+ unsigned char dataCompression; /* native=1,MH,MR,MMR */
+ unsigned char pageResolution; /* fine=0,std,CCITT300,CCITT400 */
+ unsigned char pageSize; /* unknown=0 */
+ unsigned char pixelsPerRow[2];
+ unsigned char year;
+ unsigned char month;
+ unsigned char day;
+ unsigned char hour;
+ unsigned char minute;
+ unsigned char second;
+ unsigned char T30_CSI[20];
+ unsigned char T30_SUB[20];
+ } __attribute__(( packed) ) faxArtoo;
+
+ struct MfpdtfVariantHeaderFaxDataSolo_s
+ {
+ unsigned char majorVersion; /* 1 */
+ unsigned char minorVersion; /* 1 */
+ unsigned char dataSource;
+ unsigned char dataFormat;
+ unsigned char dataCompression;
+ unsigned char pageResolution;
+ unsigned char pageSize;
+ unsigned char pixelsPerRow[2];
+ unsigned char year;
+ unsigned char month;
+ unsigned char day;
+ unsigned char hour;
+ unsigned char minute;
+ unsigned char second;
+ unsigned char suppressTTI;
+ unsigned char T30_CSI[20];
+ unsigned char T30_SUB[20];
+ unsigned char T30_PWD[20];
+ } __attribute__(( packed) ) faxSolo;
+
+ struct MfpdtfVariantHeaderFaxData_s
+ {
+ unsigned char majorVersion;
+ unsigned char minorVersion;
+ /* TODO: Finish. */
+ } __attribute__(( packed) ) fax;
+
+ struct MfpdtfVariantHeaderImageData_s
+ {
+ unsigned char majorVersion;
+ unsigned char minorVersion;
+ unsigned char sourcePages[2];
+ unsigned char copiesPerPage[2];
+ unsigned char zoomFactor[2];
+ unsigned char jpegQualityFactor[2];
+ } __attribute__(( packed) ) image;
+
+ struct MfpdtfVariantHeaderArrayData_s
+ {
+ unsigned char majorVersion;
+ unsigned char minorVersion;
+ unsigned char recordCount[2];
+ unsigned char recordSize[2];
+ } __attribute__(( packed) ) array;
+} __attribute__(( packed) );
+
+Mfpdtf_t __attribute__ ((visibility ("hidden"))) MfpdtfAllocate(int deviceid, int channelid);
+int __attribute__ ((visibility ("hidden"))) MfpdtfDeallocate(Mfpdtf_t mfpdtf);
+int __attribute__ ((visibility ("hidden"))) MfpdtfSetChannel(Mfpdtf_t mfpdtf, int channelid);
+int __attribute__ ((visibility ("hidden"))) MfpdtfLogToFile(Mfpdtf_t mfpdtf, char * filename);
+int __attribute__ ((visibility ("hidden"))) MfpdtfReadGetSimulateImageHeaders(Mfpdtf_t mfpdtf);
+int __attribute__ ((visibility ("hidden"))) MfpdtfReadSetSimulateImageHeaders(Mfpdtf_t mfpdtf, int simulateImageHeaders);
+int __attribute__ ((visibility ("hidden"))) MfpdtfReadStart(Mfpdtf_t mfpdtf);
+int __attribute__ ((visibility ("hidden"))) MfpdtfReadService(Mfpdtf_t mfpdtf);
+int __attribute__ ((visibility ("hidden"))) MfpdtfReadGetLastServiceResult(Mfpdtf_t mfpdtf);
+int __attribute__ ((visibility ("hidden"))) MfpdtfReadGetVariantHeader(Mfpdtf_t mfpdtf, union MfpdtfVariantHeader_u * buffer, int maxlen);
+int __attribute__ ((visibility ("hidden"))) MfpdtfReadGetStartPageRecord(Mfpdtf_t mfpdtf, struct MfpdtfImageStartPageRecord_s * buffer, int maxlen);
+int __attribute__ ((visibility ("hidden"))) MfpdtfReadInnerBlock(Mfpdtf_t mfpdtf, unsigned char * buffer, int countdown);
+
+/*
+ * Phase 2 rewrite. des
+ */
+
+enum MFPDTF_DATA_TYPE
+{
+ DT_FAX = 1,
+ DT_SCAN = 2
+};
+
+/* MFPDTF page flag bit fields. */
+#define PF_NEW_PAGE 1
+#define PF_END_PAGE 2
+#define PF_NEW_DOC 4
+#define PF_END_DOC 8
+
+enum MFPDTF_RECORD_ID
+{
+ ID_START_PAGE = 0,
+ ID_RASTER_DATA = 1,
+ ID_END_PAGE = 2
+};
+
+/* All words are stored little endian. */
+
+typedef struct
+{
+ uint32_t BlockLength; /* includes header in bytes */
+ uint16_t HeaderLength; /* in bytes */
+ uint8_t DataType;
+ uint8_t PageFlag;
+} __attribute__((packed)) MFPDTF_FIXED_HEADER;
+
+typedef struct
+{
+ uint8_t ID;
+ uint8_t Code;
+ uint16_t PageNumber;
+ uint16_t BlackPixelsPerRow;
+ uint16_t BlackBitsPerPixel;
+ uint32_t BlackRows;
+ uint32_t BlackHorzDPI;
+ uint32_t BlackVertDPI;
+ uint16_t CMYPixelsPerRow;
+ uint16_t CMYBitsPerPixel;
+ uint32_t CMYRows;
+ uint32_t CMYHorzDPI;
+ uint32_t CMYVertDPI;
+} __attribute__((packed)) MFPDTF_START_PAGE;
+
+typedef struct
+{
+ uint8_t ID;
+ uint8_t dummy;
+ uint16_t Size; /* in bytes */
+} __attribute__((packed)) MFPDTF_RASTER;
+
+typedef struct
+{
+ uint8_t ID;
+ char dummy[3];
+ uint32_t BlackRows;
+ uint32_t CMYRows;
+} __attribute__((packed)) MFPDTF_END_PAGE;
+
+/* Folloing macros are now in gcc 4.3.2 endian.h */
+#if !defined(htole16)
+#if defined(WORDS_BIGENDIAN)
+#define htole16(A) ((((uint16_t)(A) & 0xff00) >> 8) | (((uint16_t)(A) & 0x00ff) << 8)) /* host to little-endian 16-bit value */
+#define le16toh htole16 /* little-endian to host 16-bit value */
+#define htole32(A) ((((uint32_t)(A) & (uint32_t)0x000000ff) << 24) | (((uint32_t)(A) & (uint32_t)0x0000ff00) << 8) | \
+ (((uint32_t)(A) & (uint32_t)0x00ff0000) >> 8) | (((uint32_t)(A) & (uint32_t)0xff000000) >> 24))
+#define le32toh htole32
+#else
+#define htole16(A) (A)
+#define le16toh(A) (A)
+#define le32toh(A) (A)
+#define htole32(A) (A)
+#endif // #if defined(WORDS_BIGENDIAN)
+#endif // #if !defined(htole16)
+
+int __attribute__ ((visibility ("hidden"))) read_mfpdtf_block(int device, int channel, char *buf, int bufSize, int timeout);
+
+#endif // _MFPDTF_H
diff --git a/scan/sane/pml.c b/scan/sane/pml.c
new file mode 100755
index 0000000..894a90a
--- /dev/null
+++ b/scan/sane/pml.c
@@ -0,0 +1,1056 @@
+/************************************************************************************\
+
+ pml.c - HP SANE backend for multi-function peripherals (libsane-hpaio)
+
+ (c) 2001-2005 Copyright Hewlett-Packard Development Company, LP
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+ of the Software, and to permit persons to whom the Software is furnished to do
+ so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+ Contributing Author(s): David Paschal, Don Welch, David Suffield
+
+\************************************************************************************/
+
+#include <string.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include "hpmud.h"
+#include "io.h"
+#include "common.h"
+#include "pml.h"
+
+#define DEBUG_DECLARE_ONLY
+#include "sanei_debug.h"
+
+int __attribute__ ((visibility ("hidden"))) PmlSetID( PmlObject_t obj, char * oid )
+{
+ int len = 0; /* TODO: Do we need this parameter? */
+
+ //DBG( 0, "PmlSetID(obj=0x%8.8X)\n", obj );
+
+ if( !len )
+ {
+ len = strlen( oid );
+ if( !len )
+ {
+ len++;
+ }
+ }
+ if( len > PML_MAX_OID_LEN )
+ {
+ return ERROR;
+ }
+
+ /* TODO: Disable trap (if enabled) on old OID. */
+
+ memcpy( obj->oid, oid, len );
+ obj->oid[len] = 0;
+
+ obj->numberOfValidValues = 0;
+
+ /* TODO: Clear out other trap-related fields. */
+
+ //DBG( 0, "PmlSetID(obj=0x%8.8X) returns OK.\n", obj );
+ return OK;
+}
+
+static PmlValue_t PmlGetLastValue( PmlObject_t obj )
+{
+ if( obj->numberOfValidValues <= 0 )
+ {
+ return 0;
+ }
+ return &obj->value[obj->indexOfLastValue];
+}
+
+static PmlValue_t PmlPrepareNextValue( PmlObject_t obj )
+{
+ obj->indexOfLastValue = ( obj->indexOfLastValue + 1 ) %
+ PML_MAX_OID_VALUES;
+ if( obj->numberOfValidValues < PML_MAX_OID_VALUES )
+ {
+ obj->numberOfValidValues++;
+ }
+ return &obj->value[obj->indexOfLastValue];
+}
+
+static int PmlSetPrefixValue( PmlObject_t obj,
+ int type,
+ char * prefix,
+ int lenPrefix,
+ char * value,
+ int lenValue )
+{
+ PmlValue_t v = PmlPrepareNextValue( obj );
+ int r = ERROR;
+
+ /*DBG( 0, "PmlSetPrefixValue(obj=0x%8.8X,type=0x%4.4X,"
+ "lenPrefix=%d,lenValue=%d)\n",
+ obj,
+ type,
+ lenPrefix,
+ lenValue );*/
+
+ if( lenPrefix < 0 ||
+ lenValue<0 ||
+ ( lenPrefix + lenValue )>PML_MAX_VALUE_LEN )
+ {
+ /*DBG( 0, "PmlSetPrefixValue(obj=0x%8.8X): "
+ "invalid lenPrefix=%d and/or lenValue=%d!\n",
+ obj,
+ lenPrefix,
+ lenValue );*/
+ goto abort;
+ }
+
+ v->type = type;
+ v->len = lenPrefix + lenValue;
+ if( lenPrefix )
+ {
+ memcpy( v->value, prefix, lenPrefix );
+ }
+ if( lenValue )
+ {
+ memcpy( v->value + lenPrefix, value, lenValue );
+ }
+ v->value[lenPrefix + lenValue] = 0;
+
+ r = OK;
+abort:
+ /*DBG( 0, "PmlSetPrefixValue(obj=0x%8.8X) returns %d.\n",
+ obj,
+ r );*/
+ return r;
+}
+
+int __attribute__ ((visibility ("hidden"))) PmlSetValue( PmlObject_t obj, int type, char * value, int len )
+{
+ return PmlSetPrefixValue( obj, type, 0, 0, value, len );
+}
+
+int __attribute__ ((visibility ("hidden"))) PmlSetIntegerValue( PmlObject_t obj, int type, int value )
+{
+ char buffer[sizeof( int )];
+ int len = sizeof( int ), i = len - 1;
+
+ while( 1 )
+ {
+ buffer[i] = value & 0xFF;
+ value >>= 8;
+ if( !i )
+ {
+ break;
+ }
+ i--;
+ }
+ for( ; !buffer[i] && i < ( len ); i++ )
+ ;
+
+ return PmlSetPrefixValue( obj, type, buffer + i, len - i, 0, 0 );
+}
+
+static int PmlGetPrefixValue( PmlObject_t obj,
+ int * pType,
+ char * prefix,
+ int lenPrefix,
+ char * buffer,
+ int maxlen )
+{
+ int len;
+ PmlValue_t v = PmlGetLastValue( obj );
+
+ if( !v )
+ {
+ return ERROR;
+ }
+ if( pType )
+ {
+ *pType = v->type;
+ }
+ if( !prefix && !buffer )
+ {
+ return OK;
+ }
+
+ if( lenPrefix < 0 || maxlen < 0 )
+ {
+ return ERROR;
+ }
+
+ if( v->len > lenPrefix + maxlen )
+ {
+ return ERROR;
+ }
+ if( v->len < lenPrefix )
+ {
+ return ERROR;
+ }
+
+ if( lenPrefix )
+ {
+ memcpy( prefix, v->value, lenPrefix );
+ }
+ len = v->len - lenPrefix;
+ if( len )
+ {
+ memcpy( buffer, v->value + lenPrefix, len );
+ }
+ if( len < maxlen )
+ {
+ buffer[len] = 0;
+ }
+
+ return len;
+}
+
+int __attribute__ ((visibility ("hidden"))) PmlGetValue(PmlObject_t obj, int *pType, char *buffer, int maxlen)
+{
+ return PmlGetPrefixValue( obj, pType, 0, 0, buffer, maxlen );
+}
+
+int __attribute__ ((visibility ("hidden"))) PmlGetStringValue( PmlObject_t obj,
+ int * pSymbolSet,
+ char * buffer,
+ int maxlen )
+{
+ int type, len;
+ unsigned char prefix[2];
+
+ if( PmlGetPrefixValue( obj, &type, 0, 0, 0, 0 ) == ERROR )
+ {
+ return ERROR;
+ }
+
+ len = PmlGetPrefixValue( obj, &type, (char *)prefix, 2, buffer, maxlen );
+ if( len == ERROR )
+ {
+ return ERROR;
+ }
+ if( pSymbolSet )
+ {
+ *pSymbolSet = ( ( prefix[0] << 8 ) | prefix[1] );
+ }
+
+ return len;
+}
+
+int __attribute__ ((visibility ("hidden"))) PmlGetIntegerValue( PmlObject_t obj, int * pType, int * pValue )
+{
+ int type;
+ unsigned char svalue[sizeof( int )];
+ int accum = 0, i, len;
+
+ if( !pType )
+ {
+ pType = &type;
+ }
+
+ len = PmlGetPrefixValue( obj, pType, 0, 0, (char *)svalue, sizeof( int ) );
+ /*if( len == ERROR )
+ {
+ return ERROR;
+ }*/
+
+ for( i = 0; i < len; i++ )
+ {
+ accum = ( ( accum << 8 ) | ( svalue[i] & 0xFF ) );
+ }
+ if( pValue )
+ {
+ *pValue = accum;
+ }
+
+ return OK;
+}
+
+static int PmlSetStatus( PmlObject_t obj, int status )
+{
+ obj->status = status;
+
+ return status;
+}
+
+static int PmlGetStatus( PmlObject_t obj )
+{
+ return obj->status;
+}
+
+int __attribute__ ((visibility ("hidden"))) PmlRequestSet( int deviceid, int channelid, PmlObject_t obj )
+{
+ unsigned char data[PML_MAX_DATALEN];
+ int datalen=0, status=ERROR, type, result, pml_result;
+
+ PmlSetStatus(obj, PML_ERROR);
+
+ datalen = PmlGetValue(obj, &type, (char *)data, sizeof(data));
+
+ result = hpmud_set_pml(deviceid, channelid, obj->oid, type, data, datalen, &pml_result);
+
+ PmlSetStatus(obj, pml_result);
+
+ if (result == HPMUD_R_OK)
+ status = OK;
+
+ return status; /* OK = valid I/O result */
+}
+
+int __attribute__ ((visibility ("hidden"))) PmlRequestSetRetry( int deviceid, int channelid, PmlObject_t obj, int count, int delay )
+{
+ int stat=ERROR, r;
+
+ if(count <= 0)
+ {
+ count = 10;
+ }
+ if(delay <= 0)
+ {
+ delay = 1;
+ }
+ while( 1 )
+ {
+ if ((r = PmlRequestSet(deviceid, channelid, obj)) == ERROR)
+ goto bugout;
+ if (PmlGetStatus(obj) == PML_ERROR_ACTION_CAN_NOT_BE_PERFORMED_NOW && count > 0)
+ {
+ sleep(delay);
+ count--;
+ continue;
+ }
+ break;
+ }
+
+ /* Check PML result. */
+ if (PmlGetStatus(obj) & PML_ERROR)
+ {
+ DBG(6, "PML set failed: oid=%s count=%d delay=%d %s %d\n", obj->oid, count, delay, __FILE__, __LINE__);
+ goto bugout;
+ }
+
+ stat = OK;
+
+bugout:
+ return stat; /* OK = valid I/O result AND PML result */
+}
+
+int __attribute__ ((visibility ("hidden"))) PmlRequestGet( int deviceid, int channelid, PmlObject_t obj )
+{
+ unsigned char data[PML_MAX_DATALEN];
+ int datalen=0, stat=ERROR, type, pml_result;
+ enum HPMUD_RESULT result;
+
+ result = hpmud_get_pml(deviceid, channelid, obj->oid, data, sizeof(data), &datalen, &type, &pml_result);
+
+ PmlSetStatus(obj, pml_result);
+
+ if (result == HPMUD_R_OK)
+ {
+ PmlSetValue(obj, type, (char *)data, datalen);
+ stat = OK;
+ }
+
+ return stat;
+}
+
+/*
+ * Phase 2 rewrite. des
+ */
+
+static int is_zero(char *buf, int size)
+{
+ int i;
+
+ for (i=0; i<size; i++)
+ {
+ if (buf[i] != 0)
+ return 0; /* no */
+ }
+ return 1; /* yes */
+}
+
+/* Unlock Scanner. */
+static int clr_scan_token(HPAIO_RECORD *hpaio)
+{
+ int len, i, stat=ERROR;
+ int max = sizeof(hpaio->pml.scanToken);
+
+ if (PmlRequestGet(hpaio->deviceid, hpaio->cmd_channelid, hpaio->pml.objScanToken) == ERROR)
+ goto bugout;
+ len = PmlGetValue(hpaio->pml.objScanToken, 0, hpaio->pml.scanToken, max);
+
+ if (len > 0 && !is_zero(hpaio->pml.scanToken, len))
+ {
+ /* Zero token. */
+ len = (len > max) ? max : len;
+ for(i=0; i<len; i++)
+ hpaio->pml.scanToken[i] = 0;
+ hpaio->pml.lenScanToken = len;
+ if (PmlSetValue(hpaio->pml.objScanToken, PML_TYPE_BINARY, hpaio->pml.scanToken, len) == ERROR)
+ goto bugout;
+ if (PmlRequestSet(hpaio->deviceid, hpaio->cmd_channelid, hpaio->pml.objScanToken) == ERROR)
+ goto bugout;
+ }
+
+ hpaio->pml.lenScanToken = len;
+ stat = OK;
+
+bugout:
+ return stat;
+}
+
+/* Lock Scanner. */
+static int set_scan_token(HPAIO_RECORD *hpaio)
+{
+ int stat=ERROR;
+
+ /* Make sure token==0. */
+ if (clr_scan_token(hpaio) == ERROR)
+ goto bugout;
+
+ if (hpaio->pml.lenScanToken > 0)
+ {
+ strncpy(hpaio->pml.scanToken, "555", hpaio->pml.lenScanToken);
+ if (PmlSetValue(hpaio->pml.objScanToken, PML_TYPE_BINARY, hpaio->pml.scanToken, hpaio->pml.lenScanToken) == ERROR)
+ goto bugout;
+ if (PmlRequestSet(hpaio->deviceid, hpaio->cmd_channelid, hpaio->pml.objScanToken) == ERROR)
+ goto bugout;
+ }
+ stat = OK;
+
+bugout:
+ return stat;
+}
+
+static int set_scan_parameters(HPAIO_RECORD *hpaio)
+{
+ int pixelDataType, stat=ERROR;
+ struct PmlResolution resolution;
+ int copierReduction = 100;
+ int compression;
+
+ hpaio->effectiveScanMode = hpaio->currentScanMode;
+ hpaio->effectiveResolution = hpaio->currentResolution;
+
+ /* Set upload timeout. */
+ PmlSetIntegerValue(hpaio->pml.objUploadTimeout, PML_TYPE_SIGNED_INTEGER, PML_UPLOAD_TIMEOUT);
+ if (PmlRequestSet(hpaio->deviceid, hpaio->cmd_channelid, hpaio->pml.objUploadTimeout) == ERROR)
+ goto bugout;
+
+ /* Set pixel data type. */
+ switch(hpaio->currentScanMode)
+ {
+ case SCAN_MODE_LINEART:
+ pixelDataType = PML_DATA_TYPE_LINEART;
+ break;
+ case SCAN_MODE_GRAYSCALE:
+ pixelDataType = PML_DATA_TYPE_GRAYSCALE;
+ break;
+ case SCAN_MODE_COLOR:
+ default:
+ pixelDataType = PML_DATA_TYPE_COLOR;
+ break;
+ }
+ PmlSetIntegerValue(hpaio->pml.objPixelDataType, PML_TYPE_ENUMERATION, pixelDataType);
+ if (PmlRequestSet(hpaio->deviceid, hpaio->cmd_channelid, hpaio->pml.objPixelDataType) == ERROR)
+ goto bugout;
+
+ /* Set resolution. */
+ BEND_SET_LONG(resolution.x, hpaio->currentResolution << 16);
+ BEND_SET_LONG(resolution.y, hpaio->currentResolution << 16);
+ PmlSetValue(hpaio->pml.objResolution, PML_TYPE_BINARY, (char *)&resolution, sizeof(resolution));
+ if (PmlRequestSet(hpaio->deviceid, hpaio->cmd_channelid, hpaio->pml.objResolution) == ERROR)
+ goto bugout;
+
+ /* Set compression. */
+ switch(hpaio->currentCompression)
+ {
+ case COMPRESSION_NONE:
+ compression = PML_COMPRESSION_NONE;
+ break;
+ case COMPRESSION_MH:
+ compression = PML_COMPRESSION_MH;
+ break;
+ case COMPRESSION_MR:
+ compression = PML_COMPRESSION_MR;
+ break;
+ case COMPRESSION_MMR:
+ compression = PML_COMPRESSION_MMR;
+ break;
+ case COMPRESSION_JPEG:
+ default:
+ compression = PML_COMPRESSION_JPEG;
+ break;
+ }
+
+ PmlSetIntegerValue(hpaio->pml.objCompression, PML_TYPE_ENUMERATION, compression);
+ if (PmlRequestSet(hpaio->deviceid, hpaio->cmd_channelid, hpaio->pml.objCompression) == ERROR)
+ goto bugout;
+
+ /* Set JPEG compression factor. */
+ PmlSetIntegerValue(hpaio->pml.objCompressionFactor, PML_TYPE_SIGNED_INTEGER, hpaio->currentJpegCompressionFactor);
+ if (PmlRequestSet(hpaio->deviceid, hpaio->cmd_channelid, hpaio->pml.objCompressionFactor) == ERROR)
+ goto bugout;
+
+#if 0 /* Removed, let host side perform contrast adjustments. des */
+ /* Set scan contrast. */
+ if (SANE_OPTION_IS_ACTIVE(hpaio->option[OPTION_CONTRAST].cap))
+ {
+ /* Note although settable, contrast is ignored by LJ3320, CLJ2840, LJ3055, LJ3050. */
+ PmlSetIntegerValue(hpaio->pml.objContrast, PML_TYPE_SIGNED_INTEGER, hpaio->currentContrast);
+ if (PmlRequestSet(hpaio->deviceid, hpaio->cmd_channelid, hpaio->pml.objContrast) == ERROR)
+ goto bugout;
+ }
+#endif
+
+ /* Set copier reduction. */
+ PmlSetIntegerValue(hpaio->pml.objCopierReduction, PML_TYPE_SIGNED_INTEGER, copierReduction);
+ if (PmlRequestSet(hpaio->deviceid, hpaio->cmd_channelid, hpaio->pml.objCopierReduction) == ERROR)
+ goto bugout;
+
+ stat = OK;
+
+bugout:
+ return stat;
+}
+
+static int pml_to_sane_status(HPAIO_RECORD *hpaio)
+{
+ int stat=SANE_STATUS_IO_ERROR, status;
+
+ if (PmlRequestGet(hpaio->deviceid, hpaio->cmd_channelid, hpaio->pml.objScannerStatus) == ERROR)
+ goto bugout;
+ PmlGetIntegerValue(hpaio->pml.objScannerStatus, 0, &status);
+
+ DBG(6, "PML scannerStatus=%x: %s %d\n", status, __FILE__, __LINE__);
+
+ if(status & PML_SCANNER_STATUS_FEEDER_JAM)
+ {
+ stat = SANE_STATUS_JAMMED;
+ }
+ else if(status & PML_SCANNER_STATUS_FEEDER_OPEN)
+ {
+ stat = SANE_STATUS_COVER_OPEN;
+ }
+ else if(status & PML_SCANNER_STATUS_FEEDER_EMPTY)
+ {
+ if(hpaio->currentAdfMode == ADF_MODE_FLATBED || (hpaio->currentBatchScan == SANE_FALSE && hpaio->currentAdfMode == ADF_MODE_AUTO))
+ {
+ stat = SANE_STATUS_GOOD;
+ }
+ else
+ {
+ stat = SANE_STATUS_NO_DOCS;
+ }
+ }
+ else if(status & PML_SCANNER_STATUS_INVALID_MEDIA_SIZE)
+ {
+ stat = SANE_STATUS_INVAL;
+ }
+ else if(status)
+ {
+ stat = SANE_STATUS_IO_ERROR;
+ }
+ else
+ {
+ stat = SANE_STATUS_GOOD;
+ }
+
+bugout:
+ return stat;
+}
+
+static int check_pml_done(HPAIO_RECORD *hpaio)
+{
+ int stat=ERROR, state;
+
+ /* See if pml side is done scanning. */
+ if (PmlRequestGet(hpaio->deviceid, hpaio->cmd_channelid, hpaio->pml.objUploadState) == ERROR)
+ goto bugout;
+ PmlGetIntegerValue(hpaio->pml.objUploadState, 0, &state);
+ hpaio->upload_state = state;
+
+ if (state == PML_UPLOAD_STATE_DONE || state == PML_UPLOAD_STATE_NEWPAGE)
+ hpaio->pml_done=1;
+ else if (state != PML_UPLOAD_STATE_ACTIVE)
+ goto bugout;
+ else if (hpaio->ip_done && hpaio->mfpdtf_done)
+ {
+ if (hpaio->pml_timeout_cnt++ > 15)
+ {
+ bug("check_pml_done timeout cnt=%d: %s %d\n", hpaio->pml_timeout_cnt, __FILE__, __LINE__);
+ goto bugout;
+ }
+ else
+ sleep(1);
+ }
+
+ stat = OK;
+
+bugout:
+ return stat;
+}
+
+int __attribute__ ((visibility ("hidden"))) pml_start(HPAIO_RECORD *hpaio)
+{
+ MFPDTF_FIXED_HEADER *ph;
+ MFPDTF_START_PAGE *ps;
+ IP_IMAGE_TRAITS traits;
+ IP_XFORM_SPEC xforms[IP_MAX_XFORMS], * pXform = xforms;
+ int stat = SANE_STATUS_DEVICE_BUSY;
+ int i, bsize, state, wResult, index, r;
+ int oldStuff = (hpaio->preDenali || hpaio->fromDenali || hpaio->denali) ? 1 : 0;
+
+ if (hpaio->cmd_channelid < 0)
+ {
+ if (hpmud_open_channel(hpaio->deviceid, "HP-MESSAGE", &hpaio->cmd_channelid) != HPMUD_R_OK)
+ {
+ bug("failed to open pml channel: %s %d\n", __FILE__, __LINE__);
+ goto bugout;
+ }
+ SendScanEvent(hpaio->deviceuri, EVENT_START_SCAN_JOB);
+ }
+ if (!oldStuff)
+ {
+ if (hpaio->scan_channelid < 0)
+ {
+ if (hpmud_open_channel(hpaio->deviceid, "HP-SCAN", &hpaio->scan_channelid) != HPMUD_R_OK)
+ {
+ bug("failed to open scan channel: %s %d\n", __FILE__, __LINE__);
+ goto bugout;
+ }
+ }
+ }
+
+ r = pml_to_sane_status(hpaio);
+ if (r != SANE_STATUS_GOOD)
+ {
+ stat = r;
+ goto bugout;
+ }
+
+ /* Make sure scanner is idle. */
+ if (PmlRequestGet(hpaio->deviceid, hpaio->cmd_channelid, hpaio->pml.objUploadState) == ERROR)
+ {
+ stat=SANE_STATUS_IO_ERROR;
+ goto bugout;
+ }
+ PmlGetIntegerValue(hpaio->pml.objUploadState, 0, &state);
+ DBG(6, "PML uploadState=%d before scan: %s %d\n", state, __FILE__, __LINE__);
+ switch (state)
+ {
+ case PML_UPLOAD_STATE_IDLE:
+ if (set_scan_token(hpaio) == ERROR)
+ goto bugout;
+ if (set_scan_parameters(hpaio) == ERROR)
+ goto bugout;
+ break;
+ case PML_UPLOAD_STATE_NEWPAGE:
+ break;
+ case PML_UPLOAD_STATE_DONE:
+ PmlSetIntegerValue(hpaio->pml.objUploadState, PML_TYPE_ENUMERATION, PML_UPLOAD_STATE_IDLE);
+ if (PmlRequestSetRetry(hpaio->deviceid, hpaio->cmd_channelid, hpaio->pml.objUploadState, 0, 0) == ERROR)
+ goto bugout;
+ break;
+ case PML_UPLOAD_STATE_START:
+ case PML_UPLOAD_STATE_ACTIVE:
+ goto bugout; /* scanner is busy */
+ case PML_UPLOAD_STATE_ABORTED:
+ default:
+ stat = hpaioScannerToSaneError(hpaio);
+ PmlSetIntegerValue(hpaio->pml.objUploadState, PML_TYPE_ENUMERATION, PML_UPLOAD_STATE_IDLE);
+ if (PmlRequestSetRetry(hpaio->deviceid, hpaio->cmd_channelid, hpaio->pml.objUploadState, 0, 0) == ERROR)
+ goto bugout;
+ break;
+ }
+
+ hpaio->scanParameters = hpaio->prescanParameters;
+ memset(xforms, 0, sizeof(xforms));
+ traits.iPixelsPerRow = -1;
+
+ switch(hpaio->effectiveScanMode)
+ {
+ case SCAN_MODE_LINEART:
+ hpaio->scanParameters.format = SANE_FRAME_GRAY;
+ hpaio->scanParameters.depth = 1;
+ traits.iBitsPerPixel = 1;
+ break;
+ case SCAN_MODE_GRAYSCALE:
+ hpaio->scanParameters.format = SANE_FRAME_GRAY;
+ hpaio->scanParameters.depth = 8;
+ traits.iBitsPerPixel = 8;
+ break;
+ case SCAN_MODE_COLOR:
+ default:
+ hpaio->scanParameters.format = SANE_FRAME_RGB;
+ hpaio->scanParameters.depth = 8;
+ traits.iBitsPerPixel = 24;
+ break;
+ }
+ traits.lHorizDPI = hpaio->effectiveResolution << 16;
+ traits.lVertDPI = hpaio->effectiveResolution << 16;
+ traits.lNumRows = -1;
+ traits.iNumPages = 1;
+ traits.iPageNum = 1;
+
+ /* Start scanning. */
+ PmlSetIntegerValue(hpaio->pml.objUploadState, PML_TYPE_ENUMERATION, PML_UPLOAD_STATE_START);
+ if (PmlRequestSetRetry(hpaio->deviceid, hpaio->cmd_channelid, hpaio->pml.objUploadState, 0, 0) == ERROR)
+ goto bugout;
+
+ /* Look for a confirmation that the scan started or failed. */
+ for(i=0; i < PML_START_SCAN_WAIT_ACTIVE_MAX_RETRIES; i++)
+ {
+ if (PmlRequestGet(hpaio->deviceid, hpaio->cmd_channelid, hpaio->pml.objUploadState) == ERROR)
+ {
+ stat=SANE_STATUS_IO_ERROR;
+ goto bugout;
+ }
+ PmlGetIntegerValue(hpaio->pml.objUploadState, 0, &state);
+
+ if(state == PML_UPLOAD_STATE_ACTIVE)
+ break;
+
+ if(state != PML_UPLOAD_STATE_START)
+ break; /* bail */
+
+ sleep(1);
+ }
+
+ if (state != PML_UPLOAD_STATE_ACTIVE)
+ {
+ /* Found and error, see if we can classify it otherwise use default. */
+ r = hpaioScannerToSaneError(hpaio);
+ if (r != SANE_STATUS_GOOD)
+ stat = r;
+ goto bugout;
+ }
+
+ /* For older all-in-ones open the scan channel now. */
+ if (oldStuff)
+ {
+ if (hpaio->scan_channelid < 0)
+ {
+ if (hpmud_open_channel(hpaio->deviceid, "HP-SCAN", &hpaio->scan_channelid) != HPMUD_R_OK)
+ goto bugout;
+ }
+ }
+
+ /* Find mfpdtf "New Page" block. */
+ while (1)
+ {
+ if ((bsize = read_mfpdtf_block(hpaio->deviceid, hpaio->scan_channelid, (char *)hpaio->inBuffer, sizeof(hpaio->inBuffer), 45)) <= 0)
+ goto bugout; /* i/o error or timeout */
+
+ ph = (MFPDTF_FIXED_HEADER *)hpaio->inBuffer;
+ if ((ph->DataType == DT_SCAN) && (ph->PageFlag & PF_NEW_PAGE))
+ break; /* found it */
+ }
+
+ index = sizeof(MFPDTF_FIXED_HEADER);
+ ps = (MFPDTF_START_PAGE *)(hpaio->inBuffer + index);
+ if (ps->ID != ID_START_PAGE)
+ goto bugout;
+
+ /* Read SOP record and set image pipeline input traits. */
+ traits.iPixelsPerRow = le16toh(ps->BlackPixelsPerRow);
+ traits.iBitsPerPixel = le16toh(ps->BlackBitsPerPixel);
+ traits.lHorizDPI = le16toh(ps->BlackHorzDPI);
+ traits.lVertDPI = le16toh(ps->BlackVertDPI);
+
+ /* Set up image-processing pipeline. */
+ switch(ps->Code)
+ {
+ case MFPDTF_RASTER_MH:
+ pXform->aXformInfo[IP_FAX_FORMAT].dword = IP_FAX_MH;
+ ADD_XFORM( X_FAX_DECODE );
+ break;
+ case MFPDTF_RASTER_MR:
+ pXform->aXformInfo[IP_FAX_FORMAT].dword = IP_FAX_MR;
+ ADD_XFORM( X_FAX_DECODE );
+ break;
+ case MFPDTF_RASTER_MMR:
+ pXform->aXformInfo[IP_FAX_FORMAT].dword = IP_FAX_MMR; /* possible lineart compression */
+ ADD_XFORM( X_FAX_DECODE );
+ break;
+ case MFPDTF_RASTER_BITMAP:
+ case MFPDTF_RASTER_GRAYMAP:
+ case MFPDTF_RASTER_RGB:
+ /* rawDecode */
+ break;
+ case MFPDTF_RASTER_JPEG:
+ /* jpegDecode */
+ pXform->aXformInfo[IP_JPG_DECODE_FROM_DENALI].dword = hpaio->fromDenali;
+ ADD_XFORM( X_JPG_DECODE );
+ pXform->aXformInfo[IP_CNV_COLOR_SPACE_WHICH_CNV].dword = IP_CNV_YCC_TO_SRGB;
+ pXform->aXformInfo[IP_CNV_COLOR_SPACE_GAMMA].dword = 0x00010000;
+ ADD_XFORM( X_CNV_COLOR_SPACE );
+ break;
+ default:
+ /* Skip processing for unknown encodings. */
+ bug("unknown image encoding sane_start: name=%s sop=%d %s %d\n", hpaio->saneDevice.name, ps->Code, __FILE__, __LINE__);
+ }
+
+ index += sizeof(MFPDTF_START_PAGE);
+ hpaio->BlockSize = bsize;
+ hpaio->BlockIndex = index;
+ hpaio->RecordSize = 0;
+ hpaio->RecordIndex = 0;
+ hpaio->mfpdtf_done = 0;
+ hpaio->pml_done = 0;
+ hpaio->ip_done = 0;
+ hpaio->page_done = 0;
+ hpaio->mfpdtf_timeout_cnt = 0;
+ hpaio->pml_timeout_cnt = 0;
+
+ hpaio->scanParameters.pixels_per_line = traits.iPixelsPerRow;
+ hpaio->scanParameters.lines = traits.lNumRows;
+
+ if(hpaio->scanParameters.lines < 0)
+ {
+ hpaio->scanParameters.lines = MILLIMETERS_TO_PIXELS(hpaio->bryRange.max, hpaio->effectiveResolution);
+ }
+
+ int mmWidth = PIXELS_TO_MILLIMETERS(traits.iPixelsPerRow, hpaio->effectiveResolution);
+
+ /* Set up X_CROP xform. */
+ pXform->aXformInfo[IP_CROP_LEFT].dword = MILLIMETERS_TO_PIXELS( hpaio->effectiveTlx, hpaio->effectiveResolution );
+ if( hpaio->effectiveBrx < hpaio->brxRange.max && hpaio->effectiveBrx < mmWidth )
+ {
+ pXform->aXformInfo[IP_CROP_RIGHT].dword = MILLIMETERS_TO_PIXELS( mmWidth-hpaio->effectiveBrx, hpaio->effectiveResolution );
+ }
+ pXform->aXformInfo[IP_CROP_TOP].dword = MILLIMETERS_TO_PIXELS( hpaio->effectiveTly, hpaio->effectiveResolution );
+ if( hpaio->currentLengthMeasurement != LENGTH_MEASUREMENT_UNLIMITED )
+ {
+ hpaio->scanParameters.lines = pXform->aXformInfo[IP_CROP_MAXOUTROWS].dword =
+ MILLIMETERS_TO_PIXELS(hpaio->effectiveBry - hpaio->effectiveTly, hpaio->effectiveResolution);
+ }
+ hpaio->scanParameters.pixels_per_line -= pXform->aXformInfo[IP_CROP_LEFT].dword + pXform->aXformInfo[IP_CROP_RIGHT].dword;
+ ADD_XFORM( X_CROP );
+
+ if( hpaio->currentLengthMeasurement == LENGTH_MEASUREMENT_PADDED )
+ {
+ pXform->aXformInfo[IP_PAD_LEFT].dword = 0;
+ pXform->aXformInfo[IP_PAD_RIGHT].dword = 0;
+ pXform->aXformInfo[IP_PAD_TOP].dword = 0;
+ pXform->aXformInfo[IP_PAD_BOTTOM].dword = 0;
+ pXform->aXformInfo[IP_PAD_VALUE].dword = ( hpaio->effectiveScanMode == SCAN_MODE_LINEART ) ? PAD_VALUE_LINEART : PAD_VALUE_GRAYSCALE_COLOR;
+ pXform->aXformInfo[IP_PAD_MIN_HEIGHT].dword = hpaio->scanParameters.lines;
+ ADD_XFORM( X_PAD );
+ }
+
+ /* If we didn't set up any xforms by now, then add the dummy "skel" xform to simplify our subsequent code path. */
+ if( pXform == xforms )
+ {
+ ADD_XFORM( X_SKEL );
+ }
+
+ wResult = ipOpen( pXform - xforms, xforms, 0, &hpaio->hJob );
+
+ if( wResult != IP_DONE || !hpaio->hJob )
+ {
+ stat = SANE_STATUS_INVAL;
+ goto bugout;
+ }
+
+ traits.iComponentsPerPixel = ( ( traits.iBitsPerPixel % 3 ) ? 1 : 3 );
+ wResult = ipSetDefaultInputTraits( hpaio->hJob, &traits );
+
+ if( wResult != IP_DONE )
+ {
+ stat = SANE_STATUS_INVAL;
+ goto bugout;
+ }
+
+ hpaio->scanParameters.bytes_per_line =
+ BYTES_PER_LINE(hpaio->scanParameters.pixels_per_line, hpaio->scanParameters.depth * (hpaio->scanParameters.format == SANE_FRAME_RGB ? 3 : 1));
+
+ if( hpaio->currentLengthMeasurement == LENGTH_MEASUREMENT_UNKNOWN || hpaio->currentLengthMeasurement == LENGTH_MEASUREMENT_UNLIMITED )
+ {
+ hpaio->scanParameters.lines = -1;
+ }
+
+ stat = SANE_STATUS_GOOD;
+
+bugout:
+ return stat;
+}
+
+int __attribute__ ((visibility ("hidden"))) pml_read(HPAIO_RECORD *hpaio, SANE_Byte *data, SANE_Int maxLength, SANE_Int *pLength)
+{
+ MFPDTF_RASTER *pd;
+ int stat=SANE_STATUS_IO_ERROR;
+ unsigned int outputAvail=maxLength, outputUsed=0, outputThisPos;
+ unsigned char *output = data;
+ unsigned int inputAvail=0, inputUsed=0, inputNextPos;
+ unsigned char *input;
+ int bsize, wResult;
+
+ DBG(8, "sane_hpaio_read called handle=%p data=%p maxLength=%d length=%d: %s %d\n", hpaio, data, maxLength, *pLength, __FILE__, __LINE__);
+
+ /* Process any bytes in current record. */
+ if (hpaio->RecordIndex < hpaio->RecordSize)
+ {
+ inputAvail = hpaio->RecordSize - hpaio->RecordIndex;
+ input = hpaio->inBuffer + hpaio->BlockIndex + hpaio->RecordIndex + sizeof(MFPDTF_RASTER);
+
+ /* Transform input data to output. Note, output buffer may consume more bytes than input buffer (ie: jpeg to raster). */
+ wResult = ipConvert(hpaio->hJob, inputAvail, input, &inputUsed, &inputNextPos, outputAvail, output, &outputUsed, &outputThisPos);
+ if(wResult & (IP_INPUT_ERROR | IP_FATAL_ERROR))
+ {
+ bug("ipConvert error=%x: %s %d\n", wResult, __FILE__, __LINE__);
+ goto bugout;
+ }
+ *pLength = outputUsed;
+ hpaio->RecordIndex += inputUsed; /* bump record index */
+ if (hpaio->RecordIndex >= hpaio->RecordSize)
+ hpaio->BlockIndex += sizeof(MFPDTF_RASTER) + hpaio->RecordSize; /* bump block index to next record */
+ }
+ else if (hpaio->BlockIndex < hpaio->BlockSize)
+ {
+ /* Process next record in current mfpdtf block. */
+ pd = (MFPDTF_RASTER *)(hpaio->inBuffer + hpaio->BlockIndex);
+ if (pd->ID == ID_RASTER_DATA)
+ {
+ /* Raster Record */
+ hpaio->RecordSize = le16toh(pd->Size);
+ hpaio->RecordIndex = 0;
+ }
+ else if (pd->ID == ID_END_PAGE)
+ {
+ /* End Page Record */
+ hpaio->page_done = 1;
+ hpaio->BlockIndex += sizeof(MFPDTF_END_PAGE); /* bump index to next record */
+ }
+ else
+ {
+ bug("unknown mfpdtf record id=%d: pml_read %s %d\n", pd->ID, __FILE__, __LINE__);
+ goto bugout;
+ }
+ }
+ else if (!hpaio->mfpdtf_done)
+ {
+ /* Read new mfpdtf block. */
+ if ((bsize = read_mfpdtf_block(hpaio->deviceid, hpaio->scan_channelid, (char *)hpaio->inBuffer, sizeof(hpaio->inBuffer), 1)) < 0)
+ goto bugout; /* i/o error */
+
+ hpaio->BlockSize = 0;
+ hpaio->BlockIndex = 0;
+
+ if (bsize == 0)
+ {
+ if (hpaio->page_done || hpaio->pml_done)
+ hpaio->mfpdtf_done = 1; /* normal timeout */
+ else if (hpaio->mfpdtf_timeout_cnt++ > 5)
+ {
+ bug("read_mfpdtf_block timeout cnt=%d: %s %d\n", hpaio->mfpdtf_timeout_cnt, __FILE__, __LINE__);
+ goto bugout;
+ }
+ else
+ {
+ if (check_pml_done(hpaio) == ERROR)
+ goto bugout;
+ }
+ }
+ else
+ {
+ hpaio->mfpdtf_timeout_cnt = 0;
+
+ if (bsize > sizeof(MFPDTF_FIXED_HEADER))
+ {
+ hpaio->BlockSize = bsize; /* set for next sane_read */
+ hpaio->BlockIndex = sizeof(MFPDTF_FIXED_HEADER);
+ }
+ }
+ }
+ else if ((hpaio->page_done || hpaio->pml_done) && !hpaio->ip_done)
+ {
+ /* No more scan data, flush ipconvert pipeline. */
+ input = NULL;
+ wResult = ipConvert(hpaio->hJob, inputAvail, input, &inputUsed, &inputNextPos, outputAvail, output, &outputUsed, &outputThisPos);
+ if (wResult & (IP_INPUT_ERROR | IP_FATAL_ERROR))
+ {
+ bug("hpaio: ipConvert error=%x\n", wResult);
+ goto bugout;
+ }
+ *pLength = outputUsed;
+ if (outputUsed == 0)
+ hpaio->ip_done = 1;
+ }
+ else if (!hpaio->pml_done)
+ {
+ if (check_pml_done(hpaio) == ERROR)
+ goto bugout;
+ }
+
+ if(hpaio->ip_done && hpaio->mfpdtf_done && hpaio->pml_done)
+ stat = SANE_STATUS_EOF; /* done scan_read */
+ else
+ stat = SANE_STATUS_GOOD; /* repeat scan_read */
+
+ bugout:
+ if (stat != SANE_STATUS_GOOD)
+ {
+ if (hpaio->hJob)
+ {
+ ipClose(hpaio->hJob);
+ hpaio->hJob = 0;
+ }
+ }
+
+ // bug("ipConvert result: inputAvail=%d input=%p inputUsed=%d inputNextPos=%d outputAvail=%d output=%p outputUsed=%d outputThisPos=%d\n",
+ // inputAvail, input, inputUsed, inputNextPos, outputAvail, output, outputUsed, outputThisPos);
+
+ DBG(8, "sane_hpaio_read returned output=%p outputUsed=%d length=%d status=%d: %s %d\n", output, outputUsed, *pLength, stat, __FILE__, __LINE__);
+
+ return stat;
+}
+
+int __attribute__ ((visibility ("hidden"))) pml_cancel(HPAIO_RECORD *hpaio)
+{
+ int oldStuff = (hpaio->preDenali || hpaio->fromDenali || hpaio->denali) ? 1 : 0;
+
+ if(hpaio->hJob)
+ {
+ ipClose(hpaio->hJob);
+ hpaio->hJob = 0;
+ }
+
+ /* If batch mode and page remains in ADF, leave pml/scan channels open. */
+ if(hpaio->currentBatchScan == SANE_TRUE && hpaio->upload_state == PML_UPLOAD_STATE_NEWPAGE)
+ return OK;
+
+ /* If newer scanner or old scanner and ADF is empty, set to scanner to idle and unlock the scanner. */
+ if(!oldStuff || (oldStuff && hpaio->upload_state != PML_UPLOAD_STATE_NEWPAGE))
+ {
+ PmlSetIntegerValue(hpaio->pml.objUploadState, PML_TYPE_ENUMERATION, PML_UPLOAD_STATE_IDLE);
+ if (PmlRequestSetRetry(hpaio->deviceid, hpaio->cmd_channelid, hpaio->pml.objUploadState, 0, 0) != ERROR)
+ clr_scan_token(hpaio);
+ }
+
+ if (hpaio->scan_channelid >= 0)
+ {
+ hpmud_close_channel(hpaio->deviceid, hpaio->scan_channelid);
+ hpaio->scan_channelid = -1;
+ }
+ if (hpaio->cmd_channelid >= 0)
+ {
+ hpmud_close_channel(hpaio->deviceid, hpaio->cmd_channelid);
+ hpaio->cmd_channelid = -1;
+ SendScanEvent(hpaio->deviceuri, EVENT_END_SCAN_JOB);
+ }
+
+ return OK;
+}
diff --git a/scan/sane/pml.h b/scan/sane/pml.h
new file mode 100755
index 0000000..7ee588a
--- /dev/null
+++ b/scan/sane/pml.h
@@ -0,0 +1,181 @@
+/************************************************************************************\
+
+ pml.h - HP SANE backend for multi-function peripherals (libsane-hpaio)
+
+ (c) 2001-2005 Copyright Hewlett-Packard Development Company, LP
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+ of the Software, and to permit persons to whom the Software is furnished to do
+ so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+ Contributing Author(s): David Paschal, Don Welch, David Suffield
+
+\************************************************************************************/
+
+#if !defined(_PML_H)
+#define _PML_H
+
+#include "sane.h"
+
+#define PML_MAX_OID_VALUES 2
+#define PML_MAX_VALUE_LEN 1023
+#define PML_MAX_OID_LEN 128
+#define PML_MAX_DATALEN 4096
+
+#define PML_TYPE_MASK 0xFC
+#define PML_TYPE_OBJECT_IDENTIFIER 0x00
+#define PML_TYPE_ENUMERATION 0x04
+#define PML_TYPE_SIGNED_INTEGER 0x08
+#define PML_TYPE_REAL 0x0C
+#define PML_TYPE_STRING 0x10
+#define PML_TYPE_BINARY 0x14
+#define PML_TYPE_ERROR_CODE 0x18
+#define PML_TYPE_NULL_VALUE 0x1C
+#define PML_TYPE_COLLECTION 0x20
+
+#define PML_SYMSET_0E 0x000E
+#define PML_SYMSET_ISO_8859_2_LATIN_2 0x004E
+#define PML_SYMSET_ISO_8859_9_LATIN_5 0x00AE
+#define PML_SYMSET_KANA8 0x010B
+#define PML_SYMSET_ROMAN8 0x0115
+#define PML_SYMSET_ISO_8859_5_LATIN_CYRILLIC 0x014E
+#define PML_SYMSET_US_UNICODE 0x024E
+#define PML_SYMSET_UTF8_UNICODE 0xFDE8
+
+#define PML_OK 0x00
+#define PML_OK_END_OF_SUPPORTED_OBJECTS 0x01
+#define PML_OK_NEAREST_LEGAL_VALUE_SUBSTITUTED 0x02
+#define PML_ERROR 0x80
+#define PML_ERROR_UNKNOWN_REQUEST 0x80
+#define PML_ERROR_BUFFER_OVERFLOW 0x81
+#define PML_ERROR_COMMAND_EXECUTION_ERROR 0x82
+#define PML_ERROR_UNKNOWN_OBJECT_IDENTIFIER 0x83
+#define PML_ERROR_OBJECT_DOES_NOT_SUPPORT_REQUESTED_ACTION 0x84
+#define PML_ERROR_INVALID_OR_UNSUPPORTED_VALUE 0x85
+#define PML_ERROR_PAST_END_OF_SUPPORTED_OBJECTS 0x86
+#define PML_ERROR_ACTION_CAN_NOT_BE_PERFORMED_NOW 0x87
+#define PML_ERROR_SYNTAX_ERROR 0x88
+
+struct PmlValue_s
+{
+ int type;
+ int len;
+ char value[ PML_MAX_VALUE_LEN + 1 ]; // null terminated
+}; // PmlValue_s, * PmlValue_t;
+
+typedef struct PmlValue_s * PmlValue_t;
+
+//extern hpaioScanner_t;
+
+
+struct PmlObject_s
+{
+ //struct hpaioScanner_s * dev;
+ struct PmlObject_s * prev;
+ struct PmlObject_s * next;
+ char oid[ PML_MAX_OID_LEN + 1 ]; /* ascii, null terminated */
+ int indexOfLastValue;
+ int numberOfValidValues;
+ struct PmlValue_s value[ PML_MAX_OID_VALUES ];
+ int status;
+}; // , * PmlObject_t;
+
+typedef struct PmlObject_s * PmlObject_t;
+
+#include "hpaio.h"
+
+#define PML_REQUEST_GET 0x00
+#define PML_REQUEST_GETNEXT 0x01
+#define PML_REQUEST_SET 0x04
+#define PML_REQUEST_TRAP_ENABLE 0x05
+#define PML_REQUEST_TRAP_DISABLE 0x06
+#define PML_REQUEST_TRAP 0x07
+#define PML_COMMAND_MASK 0x7F
+#define PML_COMMAND_REPLY 0x80
+#define PML_SELECT_POLL_TIMEOUT 1
+#define PML_UPLOAD_TIMEOUT 45
+#define PML_START_SCAN_WAIT_ACTIVE_MAX_RETRIES 40
+#define PML_START_SCAN_WAIT_ACTIVE_DELAY 1
+#define PML_MAX_WIDTH_INCHES 9
+#define PML_MAX_HEIGHT_INCHES 15
+
+#define PML_SCANNER_STATUS_UNKNOWN_ERROR 0x01
+#define PML_SCANNER_STATUS_INVALID_MEDIA_SIZE 0x02
+#define PML_SCANNER_STATUS_FEEDER_OPEN 0x04
+#define PML_SCANNER_STATUS_FEEDER_JAM 0x08
+#define PML_SCANNER_STATUS_FEEDER_EMPTY 0x10
+
+#define PML_DATA_TYPE_LINEART 1
+#define PML_DATA_TYPE_GRAYSCALE 8
+#define PML_DATA_TYPE_COLOR 24
+
+#define PML_CONTRAST_MIN 0
+#define PML_CONTRAST_MAX 100
+#define PML_CONTRAST_DEFAULT 50
+
+#define PML_COMPRESSION_NONE 1
+#define PML_COMPRESSION_DEFAULT 2
+#define PML_COMPRESSION_MH 3
+#define PML_COMPRESSION_MR 4
+#define PML_COMPRESSION_MMR 5
+#define PML_COMPRESSION_JPEG 6
+
+#define PML_MODHW_ADF 1
+
+#define PML_UPLOAD_STATE_IDLE 1
+#define PML_UPLOAD_STATE_START 2
+#define PML_UPLOAD_STATE_ACTIVE 3
+#define PML_UPLOAD_STATE_ABORTED 4
+#define PML_UPLOAD_STATE_DONE 5
+#define PML_UPLOAD_STATE_NEWPAGE 6
+
+#define PML_UPLOAD_ERROR_SCANNER_JAM 207
+#define PML_UPLOAD_ERROR_MLC_CHANNEL_CLOSED 208
+#define PML_UPLOAD_ERROR_STOPPED_BY_HOST 209
+#define PML_UPLOAD_ERROR_STOP_KEY_PRESSED 210
+#define PML_UPLOAD_ERROR_NO_DOC_IN_ADF 211
+#define PML_UPLOAD_ERROR_COVER_OPEN 213
+#define PML_UPLOAD_ERROR_DOC_LOADED 214
+#define PML_UPLOAD_ERROR_DEVICE_BUSY 216
+
+#define PML_SUPPFUNC_DUPLEX 0x00000008
+
+struct PmlResolution
+{
+ unsigned char x[4];
+ unsigned char y[4];
+} __attribute__(( packed));
+
+int __attribute__ ((visibility ("hidden"))) PmlSetID(PmlObject_t obj, char * oid);
+int __attribute__ ((visibility ("hidden"))) PmlSetValue(PmlObject_t obj, int type, char * value, int len);
+int __attribute__ ((visibility ("hidden"))) PmlSetIntegerValue(PmlObject_t obj, int type, int value);
+int __attribute__ ((visibility ("hidden"))) PmlGetValue(PmlObject_t obj, int * pType, char * buffer, int maxlen);
+int __attribute__ ((visibility ("hidden"))) PmlGetStringValue(PmlObject_t obj, int * pSymbolSet, char * buffer, int maxlen);
+int __attribute__ ((visibility ("hidden"))) PmlGetIntegerValue(PmlObject_t obj, int * pType, int * pValue);
+int __attribute__ ((visibility ("hidden"))) PmlRequestSet(int deviceid, int channelid, PmlObject_t obj);
+int __attribute__ ((visibility ("hidden"))) PmlRequestSetRetry(int deviceid, int channelid, PmlObject_t obj, int count, int delay);
+int __attribute__ ((visibility ("hidden"))) PmlRequestGet(int deviceid, int channelid, PmlObject_t obj);
+
+/*
+ * Phase 2 rewrite. des
+ */
+struct hpaioScanner_s;
+
+int __attribute__ ((visibility ("hidden"))) pml_start(struct hpaioScanner_s *hpaio);
+int __attribute__ ((visibility ("hidden"))) pml_read(struct hpaioScanner_s *hpaio, SANE_Byte *data, SANE_Int maxLength, SANE_Int *pLength);
+int __attribute__ ((visibility ("hidden"))) pml_cancel(struct hpaioScanner_s *hpaio);
+
+#endif // _PML_H
diff --git a/scan/sane/sane.h b/scan/sane/sane.h
new file mode 100755
index 0000000..880cca1
--- /dev/null
+++ b/scan/sane/sane.h
@@ -0,0 +1,213 @@
+/* sane - Scanner Access Now Easy.
+ Copyright (C) 1997-1999 David Mosberger-Tang and Andreas Beck
+ This file is part of the SANE package.
+
+ This file is in the public domain. You may use and modify it as
+ you see fit, as long as this copyright message is included and
+ that there is an indication as to what modifications have been
+ made (if any).
+
+ SANE is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE.
+
+ This file declares SANE application interface. See the SANE
+ standard for a detailed explanation of the interface. */
+#ifndef sane_h
+#define sane_h
+
+#define SANE_CURRENT_MAJOR 1
+
+#define SANE_VERSION_CODE(major, minor, build) \
+ ( (((SANE_Word) (major) & 0xff) << 24) \
+ | (((SANE_Word) (minor) & 0xff) << 16) \
+ | (((SANE_Word) (build) & 0xffff) << 0))
+
+#define SANE_VERSION_MAJOR(code) ((((SANE_Word)(code)) >> 24) & 0xff)
+#define SANE_VERSION_MINOR(code) ((((SANE_Word)(code)) >> 16) & 0xff)
+#define SANE_VERSION_BUILD(code) ((((SANE_Word)(code)) >> 0) & 0xffff)
+
+#define SANE_FALSE 0
+#define SANE_TRUE 1
+
+typedef unsigned char SANE_Byte;
+typedef int SANE_Word;
+typedef SANE_Word SANE_Bool;
+typedef SANE_Word SANE_Int;
+typedef char SANE_Char;
+typedef SANE_Char *SANE_String;
+typedef const SANE_Char *SANE_String_Const;
+typedef void *SANE_Handle;
+typedef SANE_Word SANE_Fixed;
+
+#define SANE_FIXED_SCALE_SHIFT 16
+#define SANE_FIX(v) ((SANE_Word) ((v) * (1 << SANE_FIXED_SCALE_SHIFT)))
+#define SANE_UNFIX(v) ((double)(v) / (1 << SANE_FIXED_SCALE_SHIFT))
+
+typedef enum
+ {
+ SANE_STATUS_GOOD = 0, /* everything A-OK */
+ SANE_STATUS_UNSUPPORTED, /* operation is not supported */
+ SANE_STATUS_CANCELLED, /* operation was cancelled */
+ SANE_STATUS_DEVICE_BUSY, /* device is busy; try again later */
+ SANE_STATUS_INVAL, /* data is invalid (includes no dev at open) */
+ SANE_STATUS_EOF, /* no more data available (end-of-file) */
+ SANE_STATUS_JAMMED, /* document feeder jammed */
+ SANE_STATUS_NO_DOCS, /* document feeder out of documents */
+ SANE_STATUS_COVER_OPEN, /* scanner cover is open */
+ SANE_STATUS_IO_ERROR, /* error during device I/O */
+ SANE_STATUS_NO_MEM, /* out of memory */
+ SANE_STATUS_ACCESS_DENIED /* access to resource has been denied */
+ }
+SANE_Status;
+
+typedef enum
+ {
+ SANE_TYPE_BOOL = 0,
+ SANE_TYPE_INT,
+ SANE_TYPE_FIXED,
+ SANE_TYPE_STRING,
+ SANE_TYPE_BUTTON,
+ SANE_TYPE_GROUP
+ }
+SANE_Value_Type;
+
+typedef enum
+ {
+ SANE_UNIT_NONE = 0, /* the value is unit-less (e.g., # of scans) */
+ SANE_UNIT_PIXEL, /* value is number of pixels */
+ SANE_UNIT_BIT, /* value is number of bits */
+ SANE_UNIT_MM, /* value is millimeters */
+ SANE_UNIT_DPI, /* value is resolution in dots/inch */
+ SANE_UNIT_PERCENT, /* value is a percentage */
+ SANE_UNIT_MICROSECOND /* value is micro seconds */
+ }
+SANE_Unit;
+
+typedef struct
+ {
+ SANE_String_Const name; /* unique device name */
+ SANE_String_Const vendor; /* device vendor string */
+ SANE_String_Const model; /* device model name */
+ SANE_String_Const type; /* device type (e.g., "flatbed scanner") */
+ }
+SANE_Device;
+
+#define SANE_CAP_SOFT_SELECT (1 << 0)
+#define SANE_CAP_HARD_SELECT (1 << 1)
+#define SANE_CAP_SOFT_DETECT (1 << 2)
+#define SANE_CAP_EMULATED (1 << 3)
+#define SANE_CAP_AUTOMATIC (1 << 4)
+#define SANE_CAP_INACTIVE (1 << 5)
+#define SANE_CAP_ADVANCED (1 << 6)
+#define SANE_CAP_ALWAYS_SETTABLE (1 << 7)
+
+#define SANE_OPTION_IS_ACTIVE(cap) (((cap) & SANE_CAP_INACTIVE) == 0)
+#define SANE_OPTION_IS_SETTABLE(cap) (((cap) & SANE_CAP_SOFT_SELECT) != 0)
+
+#define SANE_INFO_INEXACT (1 << 0)
+#define SANE_INFO_RELOAD_OPTIONS (1 << 1)
+#define SANE_INFO_RELOAD_PARAMS (1 << 2)
+
+typedef enum
+ {
+ SANE_CONSTRAINT_NONE = 0,
+ SANE_CONSTRAINT_RANGE,
+ SANE_CONSTRAINT_WORD_LIST,
+ SANE_CONSTRAINT_STRING_LIST
+ }
+SANE_Constraint_Type;
+
+typedef struct
+ {
+ SANE_Word min; /* minimum (element) value */
+ SANE_Word max; /* maximum (element) value */
+ SANE_Word quant; /* quantization value (0 if none) */
+ }
+SANE_Range;
+
+typedef struct
+ {
+ SANE_String_Const name; /* name of this option (command-line name) */
+ SANE_String_Const title; /* title of this option (single-line) */
+ SANE_String_Const desc; /* description of this option (multi-line) */
+ SANE_Value_Type type; /* how are values interpreted? */
+ SANE_Unit unit; /* what is the (physical) unit? */
+ SANE_Int size;
+ SANE_Int cap; /* capabilities */
+
+ SANE_Constraint_Type constraint_type;
+ union
+ {
+ const SANE_String_Const *string_list; /* NULL-terminated list */
+ const SANE_Word *word_list; /* first element is list-length */
+ const SANE_Range *range;
+ }
+ constraint;
+ }
+SANE_Option_Descriptor;
+
+typedef enum
+ {
+ SANE_ACTION_GET_VALUE = 0,
+ SANE_ACTION_SET_VALUE,
+ SANE_ACTION_SET_AUTO
+ }
+SANE_Action;
+
+typedef enum
+ {
+ SANE_FRAME_GRAY, /* band covering human visual range */
+ SANE_FRAME_RGB, /* pixel-interleaved red/green/blue bands */
+ SANE_FRAME_RED, /* red band only */
+ SANE_FRAME_GREEN, /* green band only */
+ SANE_FRAME_BLUE /* blue band only */
+ }
+SANE_Frame;
+
+typedef struct
+ {
+ SANE_Frame format;
+ SANE_Bool last_frame;
+ SANE_Int bytes_per_line;
+ SANE_Int pixels_per_line;
+ SANE_Int lines;
+ SANE_Int depth;
+ }
+SANE_Parameters;
+
+struct SANE_Auth_Data;
+
+#define SANE_MAX_USERNAME_LEN 128
+#define SANE_MAX_PASSWORD_LEN 128
+
+typedef void (*SANE_Auth_Callback) (SANE_String_Const resource,
+ SANE_Char username[SANE_MAX_USERNAME_LEN],
+ SANE_Char password[SANE_MAX_PASSWORD_LEN]);
+
+extern SANE_Status sane_init (SANE_Int * version_code,
+ SANE_Auth_Callback authorize);
+extern void sane_exit (void);
+extern SANE_Status sane_get_devices (const SANE_Device *** device_list,
+ SANE_Bool local_only);
+extern SANE_Status sane_open (SANE_String_Const devicename,
+ SANE_Handle * handle);
+extern void sane_close (SANE_Handle handle);
+extern const SANE_Option_Descriptor *
+ sane_get_option_descriptor (SANE_Handle handle, SANE_Int option);
+extern SANE_Status sane_control_option (SANE_Handle handle, SANE_Int option,
+ SANE_Action action, void *value,
+ SANE_Int * info);
+extern SANE_Status sane_get_parameters (SANE_Handle handle,
+ SANE_Parameters * params);
+extern SANE_Status sane_start (SANE_Handle handle);
+extern SANE_Status sane_read (SANE_Handle handle, SANE_Byte * data,
+ SANE_Int max_length, SANE_Int * length);
+extern void sane_cancel (SANE_Handle handle);
+extern SANE_Status sane_set_io_mode (SANE_Handle handle,
+ SANE_Bool non_blocking);
+extern SANE_Status sane_get_select_fd (SANE_Handle handle,
+ SANE_Int * fd);
+extern SANE_String_Const sane_strstatus (SANE_Status status);
+
+#endif /* sane_h */
diff --git a/scan/sane/sanei.h b/scan/sane/sanei.h
new file mode 100644
index 0000000..f1f0f85
--- /dev/null
+++ b/scan/sane/sanei.h
@@ -0,0 +1,170 @@
+/* sane - Scanner Access Now Easy.
+ Copyright (C) 1996 David Mosberger-Tang and Andreas Beck
+ Copyright (C) 2002, 2003 Henning Meier-Geinitz
+
+ This file is part of the SANE package.
+
+ SANE is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ SANE is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
+ License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with sane; see the file COPYING. If not, write to the Free
+ Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+ As a special exception, the authors of SANE give permission for
+ additional uses of the libraries contained in this release of SANE.
+
+ The exception is that, if you link a SANE library with other files
+ to produce an executable, this does not by itself cause the
+ resulting executable to be covered by the GNU General Public
+ License. Your use of that executable is in no way restricted on
+ account of linking the SANE library code into it.
+
+ This exception does not, however, invalidate any other reasons why
+ the executable file might be covered by the GNU General Public
+ License.
+
+ If you submit changes to SANE to the maintainers to be included in
+ a subsequent release, you agree by submitting the changes that
+ those changes may be distributed with this exception intact.
+
+ If you write modifications of your own for SANE, it is your choice
+ whether to permit this exception to apply to your modifications.
+ If you do not wish that, delete this exception notice.
+*/
+
+/** @file sanei.h
+ * Convenience macros and function declarations for backends
+ * @sa sanei_backend.h sanei_thread.h
+ */
+
+/* Doxygen documentation */
+
+/** @mainpage SANEI (SANE internal routines) documentation
+ *
+ * @image html ../images/sane-logo2.jpg
+ * @section intro Introduction
+ *
+ * The header files in the include/sane/ directory named sanei_*.h provide
+ * function declarations and macros that can be used by every SANE backend.
+ * Their implementations can be found in the sanei/ directory. The code aims
+ * to be platform-independent to avoid lots of \#ifdef code in the backends.
+ * Please use the SANEI functions wherever possible.
+ *
+ * This documentation was created by the use of doxygen, the
+ * doc/doxygen-sanei.conf configuration file and dcoumentation in the sanei_*.h
+ * files.
+ *
+ * This documenation is far from complete. Any help is appreciated.
+ *
+ * @section additional Additional documentation
+ * - The SANE standard can be found at <a
+ * href="http://www.sane-project.org/html/">the SANE webserver</a>.
+ * - Information on how to write a backend: <a
+ * href="../backend-writing.txt">backend-writing.txt</a>.
+ * - General SANE documentation is on <a
+ * href="http://www.sane-project.org/docs.html>the SANE documentation
+ * page</a>.
+ *
+ * @section contact Contact
+ *
+ * The common way to contact the developers of SANE is the sane-devel
+ * mailing list. See the <a
+ * href="http://www.sane-project.org/mailing-lists.html">mailing list webpage</a>
+ * for details. That's the place to ask questions, report bugs, or announce
+ * a new backend.
+ *
+ */
+
+#ifndef sanei_h
+#define sanei_h
+
+#include "sane.h"
+
+/** @name Public macros and functions
+ * @{
+ */
+/** @def STRINGIFY(x)
+ * Turn parameter into string.
+ */
+/** @def PASTE(x,y)
+ * Concatenate parameters.
+ *
+ */
+/** @def NELEMS(a)
+ * Return number of elements of an array.
+ *
+ */
+
+/** @fn extern SANE_Status sanei_check_value (const SANE_Option_Descriptor * opt, void * value);
+ * Check the constraints of a SANE option.
+ *
+ * @param opt option to check
+ * @param value value of the option
+ *
+ * @return
+ * - SANE_STATUS_GOOD - on success
+ * - SANE_STATUS_INVAL - if the value doesn't fit inside the constraint
+ * or any other error occured
+ * @sa sanei_constrain_value()
+ */
+
+/** @fn extern SANE_Status sanei_constrain_value (const SANE_Option_Descriptor * opt, void * value, SANE_Word * info);
+ * Check the constraints of a SANE option and adjust its value if necessary.
+ *
+ * Depending on the type of the option and constraint, value is modified
+ * to fit inside constraint.
+ *
+ * @param opt option to check
+ * @param value value of the option
+ * @param info info is set to SANE_INFO_INEXACT if value was changed
+ *
+ * @return
+ * - SANE_STATUS_GOOD - on success
+ * - SANE_STATUS_INVAL - if the function wasn't able to fit value into the
+ * constraint or any other error occured
+ * @sa sanei_check_value()
+ */
+
+/* @} */
+
+/** @name Private macros
+ * @{
+ */
+/** @def STRINGIFY1(x)
+ * Internal use only.
+ */
+/** @def PASTE1(x,y)
+ * Internal use only.
+ */
+/* @} */
+
+/* A few convenience macros: */
+/** @hideinitializer */
+#define NELEMS(a) ((int)(sizeof (a) / sizeof (a[0])))
+
+/** @hideinitializer */
+#define STRINGIFY1(x) #x
+/** @hideinitializer */
+#define STRINGIFY(x) STRINGIFY1(x)
+
+/** @hideinitializer */
+#define PASTE1(x,y) x##y
+/** @hideinitializer */
+#define PASTE(x,y) PASTE1(x,y)
+
+extern SANE_Status sanei_check_value (const SANE_Option_Descriptor * opt,
+ void * value);
+
+extern SANE_Status sanei_constrain_value (const SANE_Option_Descriptor * opt,
+ void * value, SANE_Word * info);
+
+
+#endif /* sanei_h */
diff --git a/scan/sane/sanei_debug.h b/scan/sane/sanei_debug.h
new file mode 100644
index 0000000..3400f59
--- /dev/null
+++ b/scan/sane/sanei_debug.h
@@ -0,0 +1,176 @@
+/** @file sanei_debug.h
+ * Support for printing debug messages.
+ *
+ * Use the functions of this header file to print debug or warning messages.
+ */
+
+#ifndef _SANEI_DEBUG_H
+#define _SANEI_DEBUG_H
+
+#include "sanei.h"
+
+/** @name Public macros
+ * These macros can be used in backends and other SANE-related
+ * code.
+ *
+ * Before including sanei_debug.h, the following macros must be set:
+ *
+ * - BACKEND_NAME - The name of your backend without double-quotes (must be set in any case)
+ * - STUBS - If this is defined, no macros will be included. Used in
+ * backends consisting of more than one .c file.
+ * - DEBUG_DECLARE_ONLY - Generates prototypes instead of functions. Used in
+ * backends consisting of more than one .c file.
+ * - DEBUG_NOT_STATIC - Doesn't generate static functions. Used in header files if
+ * they are include in more than one .c file.
+ *
+ * @{
+ */
+
+/** @def DBG_INIT()
+ * Initialize sanei_debug.
+ *
+ * Call this function before you use any DBG function.
+ */
+
+/** @def DBG(level, fmt, ...)
+ * Print a message at debug level `level' or higher using a printf-like
+ * function. Example: DBG(1, "sane_open: opening fd \%d\\n", fd).
+ *
+ * @param level debug level
+ * @param fmt format (see man 3 printf for details)
+ * @param ... additional arguments
+ */
+
+/** @def IF_DBG(x)
+ * Compile code only if debugging is enabled.
+ *
+ * Expands to x if debug support is enabled at compile-time. If NDEBUG is
+ * defined at compile-time this macro expands to nothing.
+ *
+ * @param x code to expand when debugging is enabled
+ */
+
+/**
+ * @def DBG_LEVEL
+ * Current debug level.
+ *
+ * You can only read this "variable".
+ */
+
+/** @def ENTRY(name)
+ * Expands to sane_BACKEND_NAME_name.
+ *
+ * Example: ENTRY(init) in mustek.c will expand to sane_mustek_init.
+ */
+
+/* @} */
+
+/** @name Internal macros and functions
+ * Do not use in your own code.
+ * @{
+ */
+
+/** @def DBG_LOCAL
+ * Do not use in backends directly.
+ *
+ * Internal wrapper for printing function.
+ */
+
+/** @fn extern void sanei_init_debug (const char * backend, int * debug_level_var);
+ * Do not use in backends directly.
+ *
+ * Actual init function.
+ */
+
+/** @fn extern void sanei_debug_msg (int level, int max_level, const char *be, const char *fmt, va_list ap);
+ * Do not use in backends directly.
+ *
+ * Actual printing function.
+ */
+/* @} */
+
+ /** @hideinitializer*/
+#define ENTRY(name) PASTE(PASTE(PASTE(sane_,BACKEND_NAME),_),name)
+
+#ifdef NDEBUG
+
+extern void sanei_debug_ndebug (int level, const char *msg, ...);
+
+# define DBG_LEVEL (0)
+# define DBG_INIT()
+# define DBG sanei_debug_ndebug
+# define IF_DBG(x)
+
+#else /* !NDEBUG */
+
+ /** @hideinitializer*/
+# define DBG_LEVEL PASTE(sanei_debug_,BACKEND_NAME)
+
+# if defined(BACKEND_NAME) && !defined(STUBS)
+# ifdef DEBUG_DECLARE_ONLY
+extern int DBG_LEVEL;
+# else /* !DEBUG_DECLARE_ONLY */
+int DBG_LEVEL = 0;
+# endif /* DEBUG_DECLARE_ONLY */
+# endif /* BACKEND_NAME && !STUBS */
+
+ /** @hideinitializer*/
+# define DBG_INIT() \
+ sanei_init_debug (STRINGIFY(BACKEND_NAME), &DBG_LEVEL)
+
+ /** @hideinitializer*/
+# define DBG_LOCAL PASTE(DBG_LEVEL,_call)
+
+
+# ifndef STUBS
+
+# ifdef DEBUG_DECLARE_ONLY
+
+extern void DBG_LOCAL (int level, const char *msg, ...)
+#ifdef __GNUC__
+__attribute__ ((format (printf, 2, 3)))
+#endif
+;
+
+# else /* !DEBUG_DECLARE_ONLY */
+
+# include <stdarg.h>
+
+extern void sanei_debug_msg
+ (int level, int max_level, const char *be, const char *fmt, va_list ap);
+
+#ifdef __GNUC__
+# ifndef DEBUG_NOT_STATIC
+static
+# endif /* !DEBUG_NOT_STATIC */
+void DBG_LOCAL (int level, const char *msg, ...) __attribute__ ((format (printf, 2, 3)));
+#endif /* __GNUC__ */
+
+# ifndef DEBUG_NOT_STATIC
+static
+# endif /* !DEBUG_NOT_STATIC */
+void
+DBG_LOCAL (int level, const char *msg, ...)
+{
+ va_list ap;
+
+ va_start (ap, msg);
+ sanei_debug_msg (level, DBG_LEVEL, STRINGIFY(BACKEND_NAME), msg, ap);
+ va_end (ap);
+}
+
+# endif /* DEBUG_DECLARE_ONLY */
+
+# endif /* !STUBS */
+
+ /** @hideinitializer*/
+# define DBG DBG_LOCAL
+
+extern void sanei_init_debug (const char * backend, int * debug_level_var);
+
+ /** @hideinitializer*/
+# define IF_DBG(x) x
+
+#endif /* NDEBUG */
+
+#endif /* _SANEI_DEBUG_H */
diff --git a/scan/sane/sanei_init_debug.c b/scan/sane/sanei_init_debug.c
new file mode 100644
index 0000000..aa72528
--- /dev/null
+++ b/scan/sane/sanei_init_debug.c
@@ -0,0 +1,109 @@
+/* sane - Scanner Access Now Easy.
+ Copyright (C) 1996, 1997 David Mosberger-Tang and Andreas Beck
+ This file is part of the SANE package.
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ MA 02111-1307, USA.
+
+ As a special exception, the authors of SANE give permission for
+ additional uses of the libraries contained in this release of SANE.
+
+ The exception is that, if you link a SANE library with other files
+ to produce an executable, this does not by itself cause the
+ resulting executable to be covered by the GNU General Public
+ License. Your use of that executable is in no way restricted on
+ account of linking the SANE library code into it.
+
+ This exception does not, however, invalidate any other reasons why
+ the executable file might be covered by the GNU General Public
+ License.
+
+ If you submit changes to SANE to the maintainers to be included in
+ a subsequent release, you agree by submitting the changes that
+ those changes may be distributed with this exception intact.
+
+ If you write modifications of your own for SANE, it is your choice
+ whether to permit this exception to apply to your modifications.
+ If you do not wish that, delete this exception notice. */
+
+//#include "../include/sane/config.h"
+
+#include <ctype.h>
+#include <stdio.h>
+#include <stdlib.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include <string.h>
+#include <stdarg.h>
+#include <syslog.h>
+#ifdef HAVE_OS2_H
+#include <sys/types.h>
+#endif
+#include <sys/stat.h>
+
+#ifdef HAVE_OS2_H
+# define INCL_DOS
+# include <os2.h>
+#endif
+
+#define BACKEND_NAME sanei_debug
+#include "sanei_debug.h"
+
+void
+sanei_init_debug (const char * backend, int * var)
+{
+ char ch, buf[256] = "SANE_DEBUG_";
+ const char * val;
+ unsigned int i;
+
+ *var = 0;
+
+ for (i = 11; (ch = backend[i - 11]) != 0; ++i)
+ {
+ if (i >= sizeof (buf) - 1)
+ break;
+ buf[i] = toupper(ch);
+ }
+ buf[i] = '\0';
+
+ val = getenv (buf);
+
+ if (!val)
+ return;
+
+ *var = atoi (val);
+
+ DBG (0, "Setting debug level of %s to %d.\n", backend, *var);
+}
+
+void
+sanei_debug_msg
+ (int level, int max_level, const char *be, const char *fmt, va_list ap)
+{
+ if (max_level >= level)
+ {
+ fprintf (stderr, "[%s] ", be);
+ vfprintf (stderr, fmt, ap);
+ }
+}
+
+#ifdef NDEBUG
+void
+sanei_debug_ndebug (int level, const char *fmt, ...)
+{
+ /* this function is never called */
+}
+#endif
diff --git a/scan/sane/saneopts.h b/scan/sane/saneopts.h
new file mode 100755
index 0000000..7f99303
--- /dev/null
+++ b/scan/sane/saneopts.h
@@ -0,0 +1,397 @@
+/* sane - Scanner Access Now Easy.
+ Copyright (C) 1996, 1997 David Mosberger-Tang and Andreas Beck
+ This file is part of the SANE package.
+
+ SANE is free software; you can redistribute it and/or modify it under
+ the terms of the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at your
+ option) any later version.
+
+ SANE is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with sane; see the file COPYING. If not, write to the Free
+ Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+ As a special exception, the authors of SANE give permission for
+ additional uses of the libraries contained in this release of SANE.
+
+ The exception is that, if you link a SANE library with other files
+ to produce an executable, this does not by itself cause the
+ resulting executable to be covered by the GNU General Public
+ License. Your use of that executable is in no way restricted on
+ account of linking the SANE library code into it.
+
+ This exception does not, however, invalidate any other reasons why
+ the executable file might be covered by the GNU General Public
+ License.
+
+ If you submit changes to SANE to the maintainers to be included in
+ a subsequent release, you agree by submitting the changes that
+ those changes may be distributed with this exception intact.
+
+ If you write modifications of your own for SANE, it is your choice
+ whether to permit this exception to apply to your modifications.
+ If you do not wish that, delete this exception notice.
+
+ This file declares common option names, titles, and descriptions. A
+ backend is not limited to these options but for the sake of
+ consistency it's better to use options declared here when appropriate.
+*/
+
+/* This file defines several option NAMEs, TITLEs and DESCs
+ that are (or should be) used by several backends.
+
+ All well known options should be listed here. But this does
+ not mean that all options that are listed here are well known options.
+ To find out if an option is a well known option and how well known
+ options have to be defined please take a look at the sane standard!!!
+ */
+#ifndef saneopts_h
+#define saneopts_h
+
+#ifndef SANE_I18N
+#define SANE_I18N(text) text
+#endif
+
+/* This _must_ be the first option (index 0): */
+#define SANE_NAME_NUM_OPTIONS "" /* never settable */
+#define SANE_NAME_PREVIEW "preview"
+#define SANE_NAME_GRAY_PREVIEW "preview-in-gray"
+#define SANE_NAME_BIT_DEPTH "depth"
+#define SANE_NAME_SCAN_MODE "mode"
+#define SANE_NAME_SCAN_SPEED "speed"
+#define SANE_NAME_SCAN_SOURCE "source"
+#define SANE_NAME_BACKTRACK "backtrack"
+/* Most user-interfaces will let the user specify the scan area as the
+ top-left corner and the width/height of the scan area. The reason
+ the backend interface uses the top-left/bottom-right corner is so
+ that the scan area values can be properly constraint independent of
+ any other option value. */
+#define SANE_NAME_SCAN_TL_X "tl-x"
+#define SANE_NAME_SCAN_TL_Y "tl-y"
+#define SANE_NAME_SCAN_BR_X "br-x"
+#define SANE_NAME_SCAN_BR_Y "br-y"
+#define SANE_NAME_SCAN_RESOLUTION "resolution"
+#define SANE_NAME_SCAN_X_RESOLUTION "resolution"
+#define SANE_NAME_SCAN_Y_RESOLUTION "y-resolution"
+#define SANE_NAME_CUSTOM_GAMMA "custom-gamma"
+#define SANE_NAME_GAMMA_VECTOR "gamma-table"
+#define SANE_NAME_GAMMA_VECTOR_R "red-gamma-table"
+#define SANE_NAME_GAMMA_VECTOR_G "green-gamma-table"
+#define SANE_NAME_GAMMA_VECTOR_B "blue-gamma-table"
+#define SANE_NAME_BRIGHTNESS "brightness"
+#define SANE_NAME_CONTRAST "contrast"
+#define SANE_NAME_GRAIN_SIZE "grain"
+#define SANE_NAME_HALFTONE "halftoning"
+#define SANE_NAME_BLACK_LEVEL "black-level"
+#define SANE_NAME_WHITE_LEVEL "white-level"
+#define SANE_NAME_WHITE_LEVEL_R "white-level-r"
+#define SANE_NAME_WHITE_LEVEL_G "white-level-g"
+#define SANE_NAME_WHITE_LEVEL_B "white-level-b"
+#define SANE_NAME_SHADOW "shadow"
+#define SANE_NAME_SHADOW_R "shadow-r"
+#define SANE_NAME_SHADOW_G "shadow-g"
+#define SANE_NAME_SHADOW_B "shadow-b"
+#define SANE_NAME_HIGHLIGHT "highlight"
+#define SANE_NAME_HIGHLIGHT_R "highlight-r"
+#define SANE_NAME_HIGHLIGHT_G "highlight-g"
+#define SANE_NAME_HIGHLIGHT_B "highlight-b"
+#define SANE_NAME_HUE "hue"
+#define SANE_NAME_SATURATION "saturation"
+#define SANE_NAME_FILE "filename"
+#define SANE_NAME_HALFTONE_DIMENSION "halftone-size"
+#define SANE_NAME_HALFTONE_PATTERN "halftone-pattern"
+#define SANE_NAME_RESOLUTION_BIND "resolution-bind"
+#define SANE_NAME_NEGATIVE "negative"
+#define SANE_NAME_QUALITY_CAL "quality-cal"
+#define SANE_NAME_DOR "double-res"
+#define SANE_NAME_RGB_BIND "rgb-bind"
+#define SANE_NAME_THRESHOLD "threshold"
+#define SANE_NAME_ANALOG_GAMMA "analog-gamma"
+#define SANE_NAME_ANALOG_GAMMA_R "analog-gamma-r"
+#define SANE_NAME_ANALOG_GAMMA_G "analog-gamma-g"
+#define SANE_NAME_ANALOG_GAMMA_B "analog-gamma-b"
+#define SANE_NAME_ANALOG_GAMMA_BIND "analog-gamma-bind"
+#define SANE_NAME_WARMUP "warmup"
+#define SANE_NAME_CAL_EXPOS_TIME "cal-exposure-time"
+#define SANE_NAME_CAL_EXPOS_TIME_R "cal-exposure-time-r"
+#define SANE_NAME_CAL_EXPOS_TIME_G "cal-exposure-time-g"
+#define SANE_NAME_CAL_EXPOS_TIME_B "cal-exposure-time-b"
+#define SANE_NAME_SCAN_EXPOS_TIME "scan-exposure-time"
+#define SANE_NAME_SCAN_EXPOS_TIME_R "scan-exposure-time-r"
+#define SANE_NAME_SCAN_EXPOS_TIME_G "scan-exposure-time-g"
+#define SANE_NAME_SCAN_EXPOS_TIME_B "scan-exposure-time-b"
+#define SANE_NAME_SELECT_EXPOSURE_TIME "select-exposure-time"
+#define SANE_NAME_CAL_LAMP_DEN "cal-lamp-density"
+#define SANE_NAME_SCAN_LAMP_DEN "scan-lamp-density"
+#define SANE_NAME_SELECT_LAMP_DENSITY "select-lamp-density"
+#define SANE_NAME_LAMP_OFF_AT_EXIT "lamp-off-at-exit"
+
+#define SANE_TITLE_NUM_OPTIONS SANE_I18N("Number of options")
+#define SANE_TITLE_PREVIEW SANE_I18N("Preview")
+#define SANE_TITLE_GRAY_PREVIEW SANE_I18N("Force monochrome preview")
+#define SANE_TITLE_BIT_DEPTH SANE_I18N("Bit depth")
+#define SANE_TITLE_SCAN_MODE SANE_I18N("Scan mode")
+#define SANE_TITLE_SCAN_SPEED SANE_I18N("Scan speed")
+#define SANE_TITLE_SCAN_SOURCE SANE_I18N("Scan source")
+#define SANE_TITLE_BACKTRACK SANE_I18N("Force backtracking")
+#define SANE_TITLE_SCAN_TL_X SANE_I18N("Top-left x")
+#define SANE_TITLE_SCAN_TL_Y SANE_I18N("Top-left y")
+#define SANE_TITLE_SCAN_BR_X SANE_I18N("Bottom-right x")
+#define SANE_TITLE_SCAN_BR_Y SANE_I18N("Bottom-right y")
+#define SANE_TITLE_SCAN_RESOLUTION SANE_I18N("Scan resolution")
+#define SANE_TITLE_SCAN_X_RESOLUTION SANE_I18N("X-resolution")
+#define SANE_TITLE_SCAN_Y_RESOLUTION SANE_I18N("Y-resolution")
+#define SANE_TITLE_CUSTOM_GAMMA SANE_I18N("Use custom gamma table")
+#define SANE_TITLE_GAMMA_VECTOR SANE_I18N("Image intensity")
+#define SANE_TITLE_GAMMA_VECTOR_R SANE_I18N("Red intensity")
+#define SANE_TITLE_GAMMA_VECTOR_G SANE_I18N("Green intensity")
+#define SANE_TITLE_GAMMA_VECTOR_B SANE_I18N("Blue intensity")
+#define SANE_TITLE_BRIGHTNESS SANE_I18N("Brightness")
+#define SANE_TITLE_CONTRAST SANE_I18N("Contrast")
+#define SANE_TITLE_GRAIN_SIZE SANE_I18N("Grain size")
+#define SANE_TITLE_HALFTONE SANE_I18N("Halftoning")
+#define SANE_TITLE_BLACK_LEVEL SANE_I18N("Black level")
+#define SANE_TITLE_WHITE_LEVEL SANE_I18N("White level")
+#define SANE_TITLE_WHITE_LEVEL_R SANE_I18N("White level for red")
+#define SANE_TITLE_WHITE_LEVEL_G SANE_I18N("White level for green")
+#define SANE_TITLE_WHITE_LEVEL_B SANE_I18N("White level for blue")
+#define SANE_TITLE_SHADOW SANE_I18N("Shadow")
+#define SANE_TITLE_SHADOW_R SANE_I18N("Shadow for red")
+#define SANE_TITLE_SHADOW_G SANE_I18N("Shadow for green")
+#define SANE_TITLE_SHADOW_B SANE_I18N("Shadow for blue")
+#define SANE_TITLE_HIGHLIGHT SANE_I18N("Highlight")
+#define SANE_TITLE_HIGHLIGHT_R SANE_I18N("Highlight for red")
+#define SANE_TITLE_HIGHLIGHT_G SANE_I18N("Highlight for green")
+#define SANE_TITLE_HIGHLIGHT_B SANE_I18N("Highlight for blue")
+#define SANE_TITLE_HUE SANE_I18N("Hue")
+#define SANE_TITLE_SATURATION SANE_I18N("Saturation")
+#define SANE_TITLE_FILE SANE_I18N("Filename")
+#define SANE_TITLE_HALFTONE_DIMENSION SANE_I18N("Halftone pattern size")
+#define SANE_TITLE_HALFTONE_PATTERN SANE_I18N("Halftone pattern")
+#define SANE_TITLE_RESOLUTION_BIND SANE_I18N("Bind X and Y resolution")
+#define SANE_TITLE_NEGATIVE SANE_I18N("Negative")
+#define SANE_TITLE_QUALITY_CAL SANE_I18N("Quality calibration")
+#define SANE_TITLE_DOR SANE_I18N("Double Optical Resolution")
+#define SANE_TITLE_RGB_BIND SANE_I18N("Bind RGB")
+#define SANE_TITLE_THRESHOLD SANE_I18N("Threshold")
+#define SANE_TITLE_ANALOG_GAMMA SANE_I18N("Analog gamma correction")
+#define SANE_TITLE_ANALOG_GAMMA_R SANE_I18N("Analog gamma red")
+#define SANE_TITLE_ANALOG_GAMMA_G SANE_I18N("Analog gamma green")
+#define SANE_TITLE_ANALOG_GAMMA_B SANE_I18N("Analog gamma blue")
+#define SANE_TITLE_ANALOG_GAMMA_BIND SANE_I18N("Bind analog gamma")
+#define SANE_TITLE_WARMUP SANE_I18N("Warmup lamp")
+#define SANE_TITLE_CAL_EXPOS_TIME SANE_I18N("Cal. exposure-time")
+#define SANE_TITLE_CAL_EXPOS_TIME_R SANE_I18N("Cal. exposure-time for red")
+#define SANE_TITLE_CAL_EXPOS_TIME_G SANE_I18N("Cal. exposure-time for " \
+"green")
+#define SANE_TITLE_CAL_EXPOS_TIME_B SANE_I18N("Cal. exposure-time for blue")
+#define SANE_TITLE_SCAN_EXPOS_TIME SANE_I18N("Scan exposure-time")
+#define SANE_TITLE_SCAN_EXPOS_TIME_R SANE_I18N("Scan exposure-time for red")
+#define SANE_TITLE_SCAN_EXPOS_TIME_G SANE_I18N("Scan exposure-time for " \
+"green")
+#define SANE_TITLE_SCAN_EXPOS_TIME_B SANE_I18N("Scan exposure-time for blue")
+#define SANE_TITLE_SELECT_EXPOSURE_TIME SANE_I18N("Set exposure-time")
+#define SANE_TITLE_CAL_LAMP_DEN SANE_I18N("Cal. lamp density")
+#define SANE_TITLE_SCAN_LAMP_DEN SANE_I18N("Scan lamp density")
+#define SANE_TITLE_SELECT_LAMP_DENSITY SANE_I18N("Set lamp density")
+#define SANE_TITLE_LAMP_OFF_AT_EXIT SANE_I18N("Lamp off at exit")
+
+/* Descriptive/help strings for above options: */
+#define SANE_DESC_NUM_OPTIONS \
+SANE_I18N("Read-only option that specifies how many options a specific " \
+"devices supports.")
+
+#define SANE_DESC_PREVIEW \
+SANE_I18N("Request a preview-quality scan.")
+
+#define SANE_DESC_GRAY_PREVIEW \
+SANE_I18N("Request that all previews are done in monochrome mode. On a " \
+"three-pass scanner this cuts down the number of passes to one and on a " \
+"one-pass scanner, it reduces the memory requirements and scan-time of the " \
+"preview.")
+
+#define SANE_DESC_BIT_DEPTH \
+SANE_I18N("Number of bits per sample, typical values are 1 for \"line-art\" " \
+"and 8 for multibit scans.")
+
+#define SANE_DESC_SCAN_MODE \
+SANE_I18N("Selects the scan mode (e.g., lineart, monochrome, or color).")
+
+#define SANE_DESC_SCAN_SPEED \
+SANE_I18N("Determines the speed at which the scan proceeds.")
+
+#define SANE_DESC_SCAN_SOURCE \
+SANE_I18N("Selects the scan source (such as a document-feeder).")
+
+#define SANE_DESC_BACKTRACK \
+SANE_I18N("Controls whether backtracking is forced.")
+
+#define SANE_DESC_SCAN_TL_X \
+SANE_I18N("Top-left x position of scan area.")
+
+#define SANE_DESC_SCAN_TL_Y \
+SANE_I18N("Top-left y position of scan area.")
+
+#define SANE_DESC_SCAN_BR_X \
+SANE_I18N("Bottom-right x position of scan area.")
+
+#define SANE_DESC_SCAN_BR_Y \
+SANE_I18N("Bottom-right y position of scan area.")
+
+#define SANE_DESC_SCAN_RESOLUTION \
+SANE_I18N("Sets the resolution of the scanned image.")
+
+#define SANE_DESC_SCAN_X_RESOLUTION \
+SANE_I18N("Sets the horizontal resolution of the scanned image.")
+
+#define SANE_DESC_SCAN_Y_RESOLUTION \
+SANE_I18N("Sets the vertical resolution of the scanned image.")
+
+#define SANE_DESC_CUSTOM_GAMMA \
+SANE_I18N("Determines whether a builtin or a custom gamma-table should be " \
+"used.")
+
+#define SANE_DESC_GAMMA_VECTOR \
+SANE_I18N("Gamma-correction table. In color mode this option equally " \
+"affects the red, green, and blue channels simultaneously (i.e., it is an " \
+"intensity gamma table).")
+
+#define SANE_DESC_GAMMA_VECTOR_R \
+SANE_I18N("Gamma-correction table for the red band.")
+
+#define SANE_DESC_GAMMA_VECTOR_G \
+SANE_I18N("Gamma-correction table for the green band.")
+
+#define SANE_DESC_GAMMA_VECTOR_B \
+SANE_I18N("Gamma-correction table for the blue band.")
+
+#define SANE_DESC_BRIGHTNESS \
+SANE_I18N("Controls the brightness of the acquired image.")
+
+#define SANE_DESC_CONTRAST \
+SANE_I18N("Controls the contrast of the acquired image.")
+
+#define SANE_DESC_GRAIN_SIZE \
+SANE_I18N("Selects the \"graininess\" of the acquired image. Smaller values " \
+"result in sharper images.")
+
+#define SANE_DESC_HALFTONE \
+SANE_I18N("Selects whether the acquired image should be halftoned (dithered).")
+
+#define SANE_DESC_BLACK_LEVEL \
+SANE_I18N("Selects what radiance level should be considered \"black\".")
+
+#define SANE_DESC_WHITE_LEVEL \
+SANE_I18N("Selects what radiance level should be considered \"white\".")
+
+#define SANE_DESC_WHITE_LEVEL_R \
+SANE_I18N("Selects what red radiance level should be considered \"white\".")
+
+#define SANE_DESC_WHITE_LEVEL_G \
+SANE_I18N("Selects what green radiance level should be considered \"white\".")
+
+#define SANE_DESC_WHITE_LEVEL_B \
+SANE_I18N("Selects what blue radiance level should be considered \"white\".")
+
+#define SANE_DESC_SHADOW \
+SANE_I18N("Selects what radiance level should be considered \"black\".")
+#define SANE_DESC_SHADOW_R \
+SANE_I18N("Selects what red radiance level should be considered \"black\".")
+#define SANE_DESC_SHADOW_G \
+SANE_I18N("Selects what green radiance level should be considered \"black\".")
+#define SANE_DESC_SHADOW_B \
+SANE_I18N("Selects what blue radiance level should be considered \"black\".")
+
+#define SANE_DESC_HIGHLIGHT \
+SANE_I18N("Selects what radiance level should be considered \"white\".")
+#define SANE_DESC_HIGHLIGHT_R \
+SANE_I18N("Selects what red radiance level should be considered \"full red\".")
+#define SANE_DESC_HIGHLIGHT_G \
+SANE_I18N("Selects what green radiance level should be considered \"full " \
+"green\".")
+#define SANE_DESC_HIGHLIGHT_B \
+SANE_I18N("Selects what blue radiance level should be considered \"full " \
+"blue\".")
+
+#define SANE_DESC_HUE \
+SANE_I18N("Controls the \"hue\" (blue-level) of the acquired image.")
+
+#define SANE_DESC_SATURATION \
+SANE_I18N("The saturation level controls the amount of \"blooming\" that " \
+"occurs when acquiring an image with a camera. Larger values cause more " \
+"blooming.")
+
+#define SANE_DESC_FILE \
+SANE_I18N("The filename of the image to be loaded.")
+
+#define SANE_DESC_HALFTONE_DIMENSION \
+SANE_I18N("Sets the size of the halftoning (dithering) pattern used when " \
+"scanning halftoned images.")
+
+#define SANE_DESC_HALFTONE_PATTERN \
+SANE_I18N("Defines the halftoning (dithering) pattern for scanning " \
+"halftoned images.")
+
+#define SANE_DESC_RESOLUTION_BIND \
+SANE_I18N("Use same values for X and Y resolution")
+#define SANE_DESC_NEGATIVE \
+SANE_I18N("Swap black and white")
+#define SANE_DESC_QUALITY_CAL \
+SANE_I18N("Do a quality white-calibration")
+#define SANE_DESC_DOR \
+SANE_I18N("Use lens that doubles optical resolution")
+#define SANE_DESC_RGB_BIND \
+SANE_I18N("In RGB-mode use same values for each color")
+#define SANE_DESC_THRESHOLD \
+SANE_I18N("Select minimum-brightness to get a white point")
+#define SANE_DESC_ANALOG_GAMMA \
+SANE_I18N("Analog gamma-correction")
+#define SANE_DESC_ANALOG_GAMMA_R \
+SANE_I18N("Analog gamma-correction for red")
+#define SANE_DESC_ANALOG_GAMMA_G \
+SANE_I18N("Analog gamma-correction for green")
+#define SANE_DESC_ANALOG_GAMMA_B \
+SANE_I18N("Analog gamma-correction for blue")
+#define SANE_DESC_ANALOG_GAMMA_BIND \
+SANE_I18N("In RGB-mode use same values for each color")
+#define SANE_DESC_WARMUP \
+SANE_I18N("Warmup lamp before scanning")
+#define SANE_DESC_CAL_EXPOS_TIME \
+SANE_I18N("Define exposure-time for calibration")
+#define SANE_DESC_CAL_EXPOS_TIME_R \
+SANE_I18N("Define exposure-time for red calibration")
+#define SANE_DESC_CAL_EXPOS_TIME_G \
+SANE_I18N("Define exposure-time for green calibration")
+#define SANE_DESC_CAL_EXPOS_TIME_B \
+SANE_I18N("Define exposure-time for blue calibration")
+#define SANE_DESC_SCAN_EXPOS_TIME \
+SANE_I18N("Define exposure-time for scan")
+#define SANE_DESC_SCAN_EXPOS_TIME_R \
+SANE_I18N("Define exposure-time for red scan")
+#define SANE_DESC_SCAN_EXPOS_TIME_G \
+SANE_I18N("Define exposure-time for green scan")
+#define SANE_DESC_SCAN_EXPOS_TIME_B \
+SANE_I18N("Define exposure-time for blue scan")
+#define SANE_DESC_SELECT_EXPOSURE_TIME \
+SANE_I18N("Enable selection of exposure-time")
+#define SANE_DESC_CAL_LAMP_DEN \
+SANE_I18N("Define lamp density for calibration")
+#define SANE_DESC_SCAN_LAMP_DEN \
+SANE_I18N("Define lamp density for scan")
+#define SANE_DESC_SELECT_LAMP_DENSITY \
+SANE_I18N("Enable selection of lamp density")
+#define SANE_DESC_LAMP_OFF_AT_EXIT \
+SANE_I18N("Turn off lamp when program exits")
+
+/* Typical values for stringlists (to keep the backends consistent) */
+
+#define SANE_VALUE_SCAN_MODE_COLOR SANE_I18N("Color")
+#define SANE_VALUE_SCAN_MODE_GRAY SANE_I18N("Gray")
+#define SANE_VALUE_SCAN_MODE_LINEART SANE_I18N("Lineart")
+
+#endif /* saneopts_h */
diff --git a/scan/sane/scl.c b/scan/sane/scl.c
new file mode 100755
index 0000000..77f39e9
--- /dev/null
+++ b/scan/sane/scl.c
@@ -0,0 +1,379 @@
+/************************************************************************************\
+
+ scl.c - HP SANE backend for multi-function peripherals (libsane-hpaio)
+
+ (c) 2001-2006 Copyright Hewlett-Packard Development Company, LP
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+ of the Software, and to permit persons to whom the Software is furnished to do
+ so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+ Contributing Authors: David Paschal, Don Welch, David Suffield
+
+\************************************************************************************/
+
+#include <errno.h>
+#include <stdio.h>
+#include <string.h>
+#include "hpmud.h"
+#include "io.h"
+#include "common.h"
+#include "scl.h"
+#include "hpaio.h"
+
+#define DEBUG_DECLARE_ONLY
+#include "sanei_debug.h"
+
+static int SclBufferIsPartialReply( unsigned char * data, int datalen )
+{
+ int i = 0, value = 0;
+ unsigned char d;
+
+ if( i >= datalen )
+ {
+ return 0;
+ }
+ if( data[i++] != 27 )
+ {
+ return 0;
+ }
+ if( i >= datalen )
+ {
+ return 0;
+ }
+ if( data[i++] != '*' )
+ {
+ return 0;
+ }
+ if( i >= datalen )
+ {
+ return 0;
+ }
+ if( data[i++] != 's' )
+ {
+ return 0;
+ }
+ while( 42 )
+ {
+ if( i >= datalen )
+ {
+ return 0;
+ }
+ d = data[i] - '0';
+ if( d > 9 )
+ {
+ break;
+ }
+ i++;
+ }
+ d = data[i++];
+ if( d<'a' || d>'z' )
+ {
+ return 0;
+ }
+ while( 42 )
+ {
+ if( i >= datalen )
+ {
+ return 0;
+ }
+ d = data[i] - '0';
+ if( d > 9 )
+ {
+ break;
+ }
+ i++;
+ value = ( value * 10 ) + d;
+ }
+ if( i >= datalen )
+ {
+ return 0;
+ }
+ if( data[i++] != 'W' )
+ {
+ return 0;
+ }
+ value = i + value - datalen;
+ if( value < 0 )
+ {
+ value = 0;
+ }
+ return value;
+}
+
+
+static int SclChannelRead(int deviceid, int channelid, char * buffer, int countdown, int isSclResponse)
+{
+ char * bufferStart = buffer;
+ int bufferLen = countdown, countup = 0, len;
+ enum HPMUD_RESULT stat;
+
+ if(!isSclResponse)
+ {
+ stat = hpmud_read_channel(deviceid, channelid, buffer, bufferLen, EXCEPTION_TIMEOUT, &len);
+ return len;
+ }
+
+ while(1)
+ {
+ stat = hpmud_read_channel(deviceid, channelid, buffer, countdown, EXCEPTION_TIMEOUT, &len);
+
+ if(stat != HPMUD_R_OK)
+ {
+ break;
+ }
+ countup += len;
+
+ countdown = SclBufferIsPartialReply( (unsigned char *)bufferStart, countup );
+
+ if( countup + countdown > bufferLen )
+ {
+ countdown = bufferLen - countup;
+ }
+ if( countdown <= 0 )
+ {
+ break;
+ }
+
+ buffer += len;
+ //startTimeout = continueTimeout;
+ }
+
+ if(!countup)
+ {
+ return len;
+ }
+ return countup;
+
+}
+
+SANE_Status __attribute__ ((visibility ("hidden"))) SclSendCommand(int deviceid, int channelid, int cmd, int param)
+{
+ char buffer[LEN_SCL_BUFFER];
+ int datalen, len;
+ char punc = SCL_CMD_PUNC( cmd );
+ char letter1 = SCL_CMD_LETTER1( cmd),letter2 = SCL_CMD_LETTER2( cmd );
+
+ if( cmd == SCL_CMD_RESET )
+ {
+ datalen = snprintf( buffer, LEN_SCL_BUFFER, "\x1B%c", letter2 );
+ }
+ else
+ {
+ if( cmd == SCL_CMD_CLEAR_ERROR_STACK )
+ {
+ datalen = snprintf( buffer,
+ LEN_SCL_BUFFER,
+ "\x1B%c%c%c",
+ punc,
+ letter1,
+ letter2 );
+ }
+ else
+ {
+ datalen = snprintf( buffer,
+ LEN_SCL_BUFFER,
+ "\x1B%c%c%d%c",
+ punc,
+ letter1,
+ param,
+ letter2 );
+ }
+ }
+
+ hpmud_write_channel(deviceid, channelid, buffer, datalen, EXCEPTION_TIMEOUT, &len);
+
+ DBG(6, "SclSendCommand: size=%d bytes_wrote=%d: %s %d\n", datalen, len, __FILE__, __LINE__);
+ if (DBG_LEVEL >= 6)
+ sysdump(buffer, datalen);
+
+ if(len != datalen)
+ {
+ return SANE_STATUS_IO_ERROR;
+ }
+
+ return SANE_STATUS_GOOD;
+}
+
+SANE_Status __attribute__ ((visibility ("hidden"))) SclInquire(int deviceid, int channelid, int cmd, int param, int * pValue, char * buffer, int maxlen)
+{
+ SANE_Status retcode;
+ int lenResponse, len, value;
+ char _response[LEN_SCL_BUFFER + 1], * response = _response;
+ char expected[LEN_SCL_BUFFER], expectedChar;
+
+ if( !pValue )
+ {
+ pValue = &value;
+ }
+ if( buffer && maxlen > 0 )
+ {
+ memset( buffer, 0, maxlen );
+ }
+ memset( _response, 0, LEN_SCL_BUFFER + 1 );
+
+ /* Send inquiry command. */
+ if( ( retcode = SclSendCommand( deviceid, channelid, cmd, param ) ) != SANE_STATUS_GOOD )
+ {
+ return retcode;
+ }
+
+ /* Figure out what format of response we expect. */
+ expectedChar = SCL_CMD_LETTER2( cmd ) - 'A' + 'a' - 1;
+ if( expectedChar == 'q' )
+ {
+ expectedChar--;
+ }
+ len = snprintf( expected,
+ LEN_SCL_BUFFER,
+ "\x1B%c%c%d%c",
+ SCL_CMD_PUNC( cmd ),
+ SCL_CMD_LETTER1( cmd ),
+ param,
+ expectedChar );
+
+ /* Read the response. */
+ lenResponse = SclChannelRead( deviceid, channelid, response, LEN_SCL_BUFFER, 1 );
+
+ DBG(6, "SclChannelRead: len=%d: %s %d\n", lenResponse, __FILE__, __LINE__);
+ if (DBG_LEVEL >= 6)
+ sysdump(response, lenResponse);
+
+ /* Validate the first part of the response. */
+ if( lenResponse <= len || memcmp( response, expected, len ) )
+ {
+ bug("invalid SclInquire(cmd=%x,param=%d) exp(len=%d)/act(len=%d): %s %d\n", cmd, param, len, lenResponse, __FILE__, __LINE__);
+ bug("exp:\n");
+ bugdump(expected, len);
+ bug("act:\n");
+ bugdump(response, lenResponse);
+ return SANE_STATUS_IO_ERROR;
+ }
+ response += len;
+ lenResponse -= len;
+
+ /* Null response? */
+ if( response[0] == 'N' )
+ {
+ DBG(6, "SclInquire null response. %s %d\n", __FILE__, __LINE__);
+ return SANE_STATUS_UNSUPPORTED;
+ }
+
+ /* Parse integer part of non-null response.
+ * If this is a binary-data response, then this value is the
+ * length of the binary-data portion. */
+ if( sscanf( response, "%d%n", pValue, &len ) != 1 )
+ {
+ bug("invalid SclInquire(cmd=%x,param=%d) integer response: %s %d\n", cmd, param, __FILE__, __LINE__);
+ return SANE_STATUS_IO_ERROR;
+ }
+
+ /* Integer response? */
+ if( response[len] == 'V' )
+ {
+ return SANE_STATUS_GOOD;
+ }
+
+ /* Binary-data response? */
+ if( response[len] != 'W' )
+ {
+ bug("invalid SclInquire(cmd=%x,param=%d) unexpected character '%c': %s %d\n", cmd, param, response[len], __FILE__, __LINE__);
+ return SANE_STATUS_IO_ERROR;
+ }
+ response += len + 1;
+ lenResponse -= len + 1;
+
+ /* Make sure we got the right length of binary data. */
+ if( lenResponse<0 || lenResponse != *pValue || lenResponse>maxlen )
+ {
+ bug("invalid SclInquire(cmd=%x,param=%d) binary data lenResponse=%d *pValue=%d maxlen=%d: %s %d\n",
+ cmd, param, lenResponse, *pValue, maxlen, __FILE__, __LINE__);
+ return SANE_STATUS_IO_ERROR;
+ }
+
+ /* Copy binary data into user's buffer. */
+ if( buffer )
+ {
+ maxlen = *pValue;
+ memcpy( buffer, response, maxlen );
+ }
+
+ return SANE_STATUS_GOOD;
+}
+
+/*
+ * Phase 2 partial rewrite. des 9/26/07
+ */
+
+SANE_Status __attribute__ ((visibility ("hidden"))) scl_send_cmd(HPAIO_RECORD *hpaio, const char *buf, int size)
+{
+ int len;
+
+ hpmud_write_channel(hpaio->deviceid, hpaio->scan_channelid, buf, size, EXCEPTION_TIMEOUT, &len);
+
+ DBG(6, "scl cmd sent size=%d bytes_wrote=%d: %s %d\n", size, len, __FILE__, __LINE__);
+ if (DBG_LEVEL >= 6)
+ sysdump(buf, size);
+
+ if(len != size)
+ {
+ return SANE_STATUS_IO_ERROR;
+ }
+
+ return SANE_STATUS_GOOD;
+}
+
+SANE_Status __attribute__ ((visibility ("hidden"))) scl_query_int(HPAIO_RECORD *hpaio, const char *buf, int size, int *result)
+{
+ char rbuf[256];
+ int len, stat;
+ char *tail;
+
+ *result=0;
+
+ if ((stat = scl_send_cmd(hpaio, buf, size)) != SANE_STATUS_GOOD)
+ {
+ return stat;
+ }
+
+ if ((stat = hpmud_read_channel(hpaio->deviceid, hpaio->scan_channelid, rbuf, sizeof(rbuf), EXCEPTION_TIMEOUT, &len)) != HPMUD_R_OK)
+ {
+ return SANE_STATUS_IO_ERROR;
+ }
+
+ DBG(6, "scl response size=%d: %s %d\n", len, __FILE__, __LINE__);
+ if (DBG_LEVEL >= 6)
+ sysdump(buf, size);
+
+ /* Null response? */
+ if(rbuf[len-1] == 'N')
+ {
+ DBG(6, "scl null response: %s %d\n", __FILE__, __LINE__);
+ return SANE_STATUS_UNSUPPORTED;
+ }
+
+ /* Integer response? */
+ if(rbuf[len-1] != 'V' )
+ {
+ bug("invalid scl integer response: %s %d\n", __FILE__, __LINE__);
+ return SANE_STATUS_IO_ERROR;
+ }
+
+ *result = strtol(&rbuf[size], &tail, 10);
+
+ return SANE_STATUS_GOOD;
+}
+
diff --git a/scan/sane/scl.h b/scan/sane/scl.h
new file mode 100755
index 0000000..3f52c36
--- /dev/null
+++ b/scan/sane/scl.h
@@ -0,0 +1,202 @@
+/************************************************************************************\
+
+ scl.h - HP SANE backend for multi-function peripherals (libsane-hpaio)
+
+ (c) 2001-2006 Copyright Hewlett-Packard Development Company, LP
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+ of the Software, and to permit persons to whom the Software is furnished to do
+ so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+ Contributing Authors: David Paschal, Don Welch, David Suffield
+
+\************************************************************************************/
+
+#if !defined( __SCL_H__ )
+#define __SCL_H__
+
+#include "sane.h"
+
+#define SCL_SEND_COMMAND_START_TIMEOUT 0
+#define SCL_SEND_COMMAND_CONTINUE_TIMEOUT 2
+#define SCL_INQUIRE_START_TIMEOUT 30
+#define SCL_INQUIRE_CONTINUE_TIMEOUT 5
+#define SCL_DEVICE_LOCK_TIMEOUT 0
+#define SCL_PREPARE_SCAN_DEVICE_LOCK_MAX_RETRIES 4
+#define SCL_PREPARE_SCAN_DEVICE_LOCK_DELAY 1
+#define SCL_CMD(a,b) ( (('*'-'!'+1)<<10) + (((a)-'`'+1)<<5) + ((b)-'@'+1) )
+#define SCL_CMD_PUNC(x) ((((x)>>10)&0x1F)+'!'-1)
+#define SCL_CMD_LETTER1(x) ((((x)>> 5)&0x1F)+'`'-1)
+#define SCL_CMD_LETTER2(x) (( (x) &0x1F)+'@'-1)
+
+#define SCL_af (hpaio->scl.decipixelChar)
+#define SCL_CHAR_DECIPOINTS 'a'
+#define SCL_CHAR_DEVPIXELS 'f'
+
+#define SCL_CMD_RESET SCL_CMD('z','E') /* No param! */
+#define SCL_CMD_CLEAR_ERROR_STACK SCL_CMD('o','E') /* No param! */
+#define SCL_CMD_INQUIRE_PRESENT_VALUE SCL_CMD('s','R')
+#define SCL_CMD_INQUIRE_MINIMUM_VALUE SCL_CMD('s','L')
+#define SCL_CMD_INQUIRE_MAXIMUM_VALUE SCL_CMD('s','H')
+#define SCL_CMD_INQUIRE_DEVICE_PARAMETER SCL_CMD('s','E')
+
+#define SCL_CMD_SET_OUTPUT_DATA_TYPE SCL_CMD('a','T')
+#define SCL_CMD_SET_DATA_WIDTH SCL_CMD('a','G')
+#define SCL_CMD_SET_MFPDTF SCL_CMD('m','S') /* No inq! */
+#define SCL_CMD_SET_COMPRESSION SCL_CMD('a','C') /* No inq! */
+#define SCL_CMD_SET_JPEG_COMPRESSION_FACTOR SCL_CMD('m','Q') /* No inq! */
+#define SCL_CMD_SET_X_RESOLUTION SCL_CMD('a','R')
+#define SCL_CMD_SET_Y_RESOLUTION SCL_CMD('a','S')
+#define SCL_CMD_SET_X_POSITION SCL_CMD(SCL_af,'X')
+#define SCL_CMD_SET_Y_POSITION SCL_CMD(SCL_af,'Y')
+#define SCL_CMD_SET_X_EXTENT SCL_CMD(SCL_af,'P')
+#define SCL_CMD_SET_Y_EXTENT SCL_CMD(SCL_af,'Q')
+#define SCL_CMD_SET_DOWNLOAD_TYPE SCL_CMD('a','D')
+#define SCL_CMD_DOWNLOAD_BINARY_DATA SCL_CMD('a','W')
+#define SCL_CMD_SET_CCD_RESOLUTION SCL_CMD('m','R')
+#define SCL_CMD_CHANGE_DOCUMENT SCL_CMD('u','X')
+#define SCL_CMD_UNLOAD_DOCUMENT SCL_CMD('u','U')
+#define SCL_CMD_CHANGE_DOCUMENT_BACKGROUND SCL_CMD('u','Y')
+#define SCL_CMD_SCAN_WINDOW SCL_CMD('f','S')
+#define SCL_CMD_SET_DEVICE_LOCK SCL_CMD('f','H')
+#define SCL_CMD_SET_DEVICE_LOCK_TIMEOUT SCL_CMD('f','I')
+
+#if 0
+#define SCL_CMD_SET_PRESCAN SCL_CMD('m','B')
+#define SCL_CMD_SET_NUMBER_OF_IMAGES_FOUND SCL_CMD('m','P')
+#define SCL_CMD_SET_SHARPENING SCL_CMD('a','N')
+#endif
+
+/* Pseudo-commands for inquiring flatbed- and ADF-specific min/max values: */
+#define SCL_PSEUDO_FLATBED_X_RESOLUTION (SCL_CMD_SET_X_RESOLUTION+1000)
+#define SCL_PSEUDO_FLATBED_Y_RESOLUTION (SCL_CMD_SET_Y_RESOLUTION+1000)
+#define SCL_PSEUDO_FLATBED_Y_EXTENT (SCL_CMD_SET_Y_EXTENT +1000)
+#define SCL_PSEUDO_ADF_X_RESOLUTION (SCL_CMD_SET_X_RESOLUTION+2000)
+#define SCL_PSEUDO_ADF_Y_RESOLUTION (SCL_CMD_SET_Y_RESOLUTION+2000)
+#define SCL_PSEUDO_ADF_Y_EXTENT (SCL_CMD_SET_Y_EXTENT +2000)
+
+#define SCL_DATA_TYPE_LINEART 0
+#define SCL_DATA_TYPE_GRAYSCALE 4
+#define SCL_DATA_TYPE_COLOR 5
+
+#define SCL_DATA_WIDTH_LINEART 1
+#define SCL_DATA_WIDTH_GRAYSCALE 8 /* or 10, 12, 14, 16? */
+#define SCL_DATA_WIDTH_COLOR 24 /* or 30, 36, 42, 48? */
+
+#define SCL_MFPDTF_OFF 0
+#define SCL_MFPDTF_ON 2
+
+#define SCL_COMPRESSION_NONE 0
+#define SCL_COMPRESSION_JPEG 2
+
+#define SCL_MIN_Y_RES_1150 50 /* 42 is absolute minimum. */
+#define SCL_MAX_RES_1150_1170 300
+
+#define SCL_DOWNLOAD_TYPE_COLORMAP 15
+
+#define SCL_DEVICE_LOCK_RELEASED 0
+#define SCL_DEVICE_LOCK_SET 1
+#define SCL_DEVICE_LOCK_TIMEOUT 0
+
+#define SCL_CHANGE_DOC_SIMPLEX 0
+#define SCL_CHANGE_DOC_DUPLEX 2
+#define SCL_CHANGE_DOC_DUPLEX_SIDE 12
+
+
+#define SCL_INQ_HP_MODEL_11 18
+#define SCL_INQ_HP_MODEL_12 19
+#define SCL_INQ_ADF_FEED_STATUS 23
+#define SCL_INQ_ADF_CAPABILITY 24
+#define SCL_INQ_ADF_DOCUMENT_LOADED 25
+#define SCL_INQ_ADF_READY_TO_UNLOAD 27
+#define SCL_INQ_MAX_ERROR_STACK 256 /* always 1 */
+#define SCL_INQ_CURRENT_ERROR_STACK 257 /* 0 or 1 errors */
+#define SCL_INQ_CURRENT_ERROR 259 /* error number */
+#define SCL_INQ_SESSION_ID 505
+#define SCL_INQ_BULB_WARM_UP_STATUS 506
+#define SCL_INQ_PIXELS_PER_SCAN_LINE 1024
+#define SCL_INQ_BYTES_PER_SCAN_LINE 1025
+#define SCL_INQ_NUMBER_OF_SCAN_LINES 1026
+#define SCL_INQ_ADF_READY_TO_LOAD 1027
+#define SCL_INQ_DEVICE_PIXELS_PER_INCH 1028 /* 300 */
+#if 0
+#define SCL_INQ_NATIVE_OPTICAL_RESOLUTION 1029
+#endif
+
+#define SCL_ADF_FEED_STATUS_OK 0
+#define SCL_ADF_FEED_STATUS_BUSY 1000
+#define SCL_ADF_FEED_STATUS_PAPER_JAM 1024
+#define SCL_ADF_FEED_STATUS_ORIGINAL_ON_GLASS 1027
+#define SCL_ADF_FEED_STATUS_PORTRAIT_FEED 1028
+
+
+#define SCL_ERROR_COMMAND_FORMAT_ERROR 0
+#define SCL_ERROR_UNRECOGNIZED_COMMAND 1
+#define SCL_ERROR_PARAMETER_ERROR 2
+#define SCL_ERROR_ILLEGAL_WINDOW 3
+#define SCL_ERROR_SCALING_ERROR 4
+#define SCL_ERROR_DITHER_ID_ERROR 5
+#define SCL_ERROR_TONE_MAP_ID_ERROR 6
+#define SCL_ERROR_LAMP_ERROR 7
+#define SCL_ERROR_MATRIX_ID_ERROR 8
+#define SCL_ERROR_CAL_STRIP_PARAM_ERROR 9
+#define SCL_ERROR_GROSS_CALIBRATION_ERROR 10
+#define SCL_ERROR_NO_MEMORY 500
+#define SCL_ERROR_SCANNER_HEAD_LOCKED 501
+#define SCL_ERROR_CANCELLED 502
+#define SCL_ERROR_PEN_DOOR_OPEN 503
+#define SCL_ERROR_ADF_PAPER_JAM 1024
+#define SCL_ERROR_HOME_POSITION_MISSING 1025
+#define SCL_ERROR_PAPER_NOT_LOADED 1026
+#define SCL_ERROR_ORIGINAL_ON_GLASS 1027
+
+#define SCL_COMPAT_1150 0x0001 /* model 11 "5300A", 12 null */
+#define SCL_COMPAT_1170 0x0002 /* model 12 "5400A" */
+#define SCL_COMPAT_R_SERIES 0x0004 /* model 12 "5500A" */
+#define SCL_COMPAT_G_SERIES 0x0008 /* model 12 "5600A" */
+#define SCL_COMPAT_K_SERIES 0x0010 /* model 12 "5700A" */
+#define SCL_COMPAT_D_SERIES 0x0020 /* model 12 "5800A" */
+#define SCL_COMPAT_6100_SERIES 0x0040 /* model 12 "5900A" */
+#define SCL_COMPAT_OFFICEJET 0x1000 /* model 11 not null */
+#define SCL_COMPAT_POST_1150 0x2000 /* model 12 not null */
+
+//#define LEN_SCL_BUFFER 1024
+#define LEN_SCL_BUFFER 256 /* Increase if reading binary data. */
+
+SANE_Status __attribute__ ((visibility ("hidden"))) SclSendCommand(int deviceid, int channelid, int cmd, int param);
+SANE_Status __attribute__ ((visibility ("hidden"))) SclInquire(int deviceid, int channelid, int cmd, int param, int *pValue, char *buffer, int maxlen);
+
+/*
+ * Phase 2 partial rewrite. des 9/26/07
+ */
+
+/* Note ESC = 0x1b = '\e' . */
+#define SCL_QUERY_DUPLEX_SUPPORTED "\e*s13500E" /* 1 = device can support duplex */
+#define SCL_QUERY_DUPLEX_VERT_FLIP_SUPPORTED "\e*s13501E" /* duplex can flip vertical (they all should) */
+#define SCL_QUERY_DUPLEX_HORZ_FLIP_SUPPORTED "\e*s13502E" /* duplex can flip horizontal (they all should) */
+
+#define SCL_SET_DUPLEX "\e*d%dD13505R" /* 1 = duplex is requested, 0 otherwise */
+#define SCL_SET_DUPLEX_VERT_FLIP "\e*d%dV13506R" /* 1 = vertical flip is requested, 0 otherwise */
+#define SCL_SET_DUPLEX_HORZ_FLIP "\e*d%dH13507R" /* 1 = horizontal flip is requested, 0 otherwise */
+#define SCL_SET_DUPLEX_ORIENTATION "\e*a%d13507R" /* 0 = no change, 1 = needs vert flip, 2 = vert and horz flip */
+
+struct hpaioScanner_s;
+
+SANE_Status __attribute__ ((visibility ("hidden"))) scl_send_cmd(struct hpaioScanner_s *hpaio, const char *buf, int size);
+SANE_Status __attribute__ ((visibility ("hidden"))) scl_query_int(struct hpaioScanner_s *hpaio, const char *buf, int size, int *result);
+
+#endif
+
diff --git a/scan/sane/soap.c b/scan/sane/soap.c
new file mode 100644
index 0000000..f455763
--- /dev/null
+++ b/scan/sane/soap.c
@@ -0,0 +1,1038 @@
+/************************************************************************************\
+
+ soap.c - HP SANE backend support for soap based multi-function peripherals
+
+ (c) 2006,2008 Copyright Hewlett-Packard Development Company, LP
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+ of the Software, and to permit persons to whom the Software is furnished to do
+ so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+ Note the CLJ CM1017 windows driver supports jpeg, but no hpraw (over the wire).
+ The problem is hpraw does not return bytes_per_line and number_of_lines at the
+ start of the scan job. Even though we perform the same calculation as firmware
+ for hpraw, due to round-off error between different math libraries determining
+ the correct bytes_per_line is not always possible (especially at 600dpi and 1200dpi).
+
+ Also the CM1017 linart mode only works with hpraw (over the wire).
+
+ Given the hpraw problem stated above this driver will only support jpeg for all scan
+ modes. Linart will use 8-bit gray then convert to mono. Same as windows.
+
+ Author: David Suffield
+
+\************************************************************************************/
+
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE
+#endif
+
+#include <stdarg.h>
+#include <syslog.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <math.h>
+#include <dlfcn.h>
+#include "sane.h"
+#include "saneopts.h"
+#include "hpmud.h"
+#include "hpip.h"
+#include "common.h"
+#include "soap.h"
+#include "soapi.h"
+#include "io.h"
+
+#define DEBUG_DECLARE_ONLY
+#include "sanei_debug.h"
+
+static struct soap_session *session = NULL; /* assume one sane_open per process */
+
+static int bb_load(struct soap_session *ps, const char *so)
+{
+ char home[128];
+ char sz[255];
+ int stat=1;
+
+ /* Load hpmud manually with symbols exported. Otherwise the plugin will not find it. */
+ if ((ps->hpmud_handle = dlopen("libhpmud.so", RTLD_LAZY|RTLD_GLOBAL)) == NULL)
+ {
+ BUG("unable to load restricted library: %s\n", dlerror());
+ goto bugout;
+ }
+
+ /* Load math library manually with symbols exported (Ubuntu 8.04). Otherwise the plugin will not find it. */
+ if ((ps->math_handle = dlopen("libm.so", RTLD_LAZY|RTLD_GLOBAL)) == NULL)
+ {
+ if ((ps->math_handle = dlopen("libm.so.6", RTLD_LAZY|RTLD_GLOBAL)) == NULL)
+ {
+ BUG("unable to load restricted library: %s\n", dlerror());
+ goto bugout;
+ }
+ }
+
+ if (hpmud_get_conf("[dirs]", "home", home, sizeof(home)) != HPMUD_R_OK)
+ goto bugout;
+ snprintf(sz, sizeof(sz), "%s/scan/plugins/%s", home, so);
+ if ((ps->bb_handle = dlopen(sz, RTLD_NOW|RTLD_GLOBAL)) == NULL)
+ {
+ BUG("unable to load restricted library %s: %s\n", sz, dlerror());
+ SendScanEvent(ps->uri, EVENT_PLUGIN_FAIL);
+ goto bugout;
+ }
+
+ if ((ps->bb_open = dlsym(ps->bb_handle, "bb_open")) == NULL)
+ {
+ BUG("unable to load restricted library %s: %s\n", sz, dlerror());
+ goto bugout;
+ }
+ if ((ps->bb_close = dlsym(ps->bb_handle, "bb_close")) == NULL)
+ {
+ BUG("unable to load restricted library %s: %s\n", sz, dlerror());
+ goto bugout;
+ }
+ if ((ps->bb_get_parameters = dlsym(ps->bb_handle, "bb_get_parameters")) == NULL)
+ {
+ BUG("unable to load restricted library %s: %s\n", sz, dlerror());
+ goto bugout;
+ }
+ if ((ps->bb_is_paper_in_adf = dlsym(ps->bb_handle, "bb_is_paper_in_adf")) == NULL)
+ {
+ BUG("unable to load restricted library %s: %s\n", sz, dlerror());
+ goto bugout;
+ }
+ if ((ps->bb_start_scan = dlsym(ps->bb_handle, "bb_start_scan")) == NULL)
+ {
+ BUG("unable to load restricted library %s: %s\n", sz, dlerror());
+ goto bugout;
+ }
+ if ((ps->bb_end_scan = dlsym(ps->bb_handle, "bb_end_scan")) == NULL)
+ {
+ BUG("unable to load restricted library %s: %s\n", sz, dlerror());
+ goto bugout;
+ }
+ if ((ps->bb_get_image_data = dlsym(ps->bb_handle, "bb_get_image_data")) == NULL)
+ {
+ BUG("unable to load restricted library %s: %s\n", sz, dlerror());
+ goto bugout;
+ }
+ if ((ps->bb_end_page = dlsym(ps->bb_handle, "bb_end_page")) == NULL)
+ {
+ BUG("unable to load restricted library %s: %s\n", sz, dlerror());
+ goto bugout;
+ }
+
+ stat=0;
+
+bugout:
+ return stat;
+} /* bb_load */
+
+static int bb_unload(struct soap_session *ps)
+{
+ if (ps->bb_handle)
+ {
+ dlclose(ps->bb_handle);
+ ps->bb_handle = NULL;
+ }
+ if (ps->hpmud_handle)
+ {
+ dlclose(ps->hpmud_handle);
+ ps->hpmud_handle = NULL;
+ }
+ if (ps->math_handle)
+ {
+ dlclose(ps->math_handle);
+ ps->math_handle = NULL;
+ }
+ return 0;
+} /* bb_unload */
+
+/* Get raw data (ie: uncompressed data) from image processor. */
+static int get_ip_data(struct soap_session *ps, SANE_Byte *data, SANE_Int maxLength, SANE_Int *length)
+{
+ int ip_ret=IP_INPUT_ERROR;
+ unsigned int outputAvail=maxLength, outputUsed=0, outputThisPos;
+ unsigned char *input, *output = data;
+ unsigned int inputAvail, inputUsed=0, inputNextPos;
+
+ if (!ps->ip_handle)
+ {
+ BUG("invalid ipconvert state\n");
+ goto bugout;
+ }
+
+ if (ps->bb_get_image_data(ps, outputAvail))
+ goto bugout;
+
+ if (ps->cnt > 0)
+ {
+ inputAvail = ps->cnt;
+ input = &ps->buf[ps->index];
+ }
+ else
+ {
+ input = NULL; /* no more scan data, flush ipconvert pipeline */
+ inputAvail = 0;
+ }
+
+ /* Transform input data to output. Note, output buffer may consume more bytes than input buffer (ie: jpeg to raster). */
+ ip_ret = ipConvert(ps->ip_handle, inputAvail, input, &inputUsed, &inputNextPos, outputAvail, output, &outputUsed, &outputThisPos);
+
+ DBG6("cnt=%d index=%d input=%p inputAvail=%d inputUsed=%d inputNextPos=%d output=%p outputAvail=%d outputThisPos=%d\n", ps->cnt, ps->index, input,
+ inputAvail, inputUsed, inputNextPos, output, outputAvail, outputThisPos);
+
+ if (input != NULL)
+ {
+ if (inputAvail == inputUsed)
+ {
+ ps->index = ps->cnt = 0; /* reset buffer */
+ }
+ else
+ {
+ ps->cnt -= inputUsed; /* save left over buffer for next soap_read */
+ ps->index += inputUsed;
+ }
+ }
+
+ if (data)
+ *length = outputUsed;
+
+ /* For sane do not send output data simultaneously with IP_DONE. */
+ if (ip_ret & IP_DONE && outputUsed)
+ ip_ret &= ~IP_DONE;
+
+bugout:
+ return ip_ret;
+} /* get_ip_data */
+
+static int set_scan_mode_side_effects(struct soap_session *ps, enum COLOR_ENTRY scanMode)
+{
+ int j=0;
+
+ memset(ps->compressionList, 0, sizeof(ps->compressionList));
+ memset(ps->compressionMap, 0, sizeof(ps->compressionMap));
+
+ switch (scanMode)
+ {
+ case CE_BLACK_AND_WHITE1:
+ case CE_GRAY8:
+ case CE_RGB24:
+ default:
+ ps->compressionList[j] = STR_COMPRESSION_JPEG;
+ ps->compressionMap[j++] = SF_JFIF;
+ ps->currentCompression = SF_JFIF;
+ ps->option[SOAP_OPTION_JPEG_QUALITY].cap |= SANE_CAP_SOFT_SELECT; /* enable jpeg quality */
+ break;
+ }
+
+ return 0;
+} /* set_scan_mode_side_effects */
+
+static struct soap_session *create_session()
+{
+ struct soap_session *ps;
+
+ if ((ps = malloc(sizeof(struct soap_session))) == NULL)
+ {
+ BUG("malloc failed: %m\n");
+ return NULL;
+ }
+ memset(ps, 0, sizeof(struct soap_session));
+ ps->tag = "SOAP";
+ ps->dd = -1;
+ ps->cd = -1;
+
+ return ps;
+} /* create_session */
+
+static int init_options(struct soap_session *ps)
+{
+ ps->option[SOAP_OPTION_COUNT].name = "option-cnt";
+ ps->option[SOAP_OPTION_COUNT].title = SANE_TITLE_NUM_OPTIONS;
+ ps->option[SOAP_OPTION_COUNT].desc = SANE_DESC_NUM_OPTIONS;
+ ps->option[SOAP_OPTION_COUNT].type = SANE_TYPE_INT;
+ ps->option[SOAP_OPTION_COUNT].unit = SANE_UNIT_NONE;
+ ps->option[SOAP_OPTION_COUNT].size = sizeof(SANE_Int);
+ ps->option[SOAP_OPTION_COUNT].cap = SANE_CAP_SOFT_DETECT;
+ ps->option[SOAP_OPTION_COUNT].constraint_type = SANE_CONSTRAINT_NONE;
+
+ ps->option[SOAP_OPTION_GROUP_SCAN_MODE].name = "mode-group";
+ ps->option[SOAP_OPTION_GROUP_SCAN_MODE].title = SANE_TITLE_SCAN_MODE;
+ ps->option[SOAP_OPTION_GROUP_SCAN_MODE].type = SANE_TYPE_GROUP;
+
+ ps->option[SOAP_OPTION_SCAN_MODE].name = SANE_NAME_SCAN_MODE;
+ ps->option[SOAP_OPTION_SCAN_MODE].title = SANE_TITLE_SCAN_MODE;
+ ps->option[SOAP_OPTION_SCAN_MODE].desc = SANE_DESC_SCAN_MODE;
+ ps->option[SOAP_OPTION_SCAN_MODE].type = SANE_TYPE_STRING;
+ ps->option[SOAP_OPTION_SCAN_MODE].unit = SANE_UNIT_NONE;
+ ps->option[SOAP_OPTION_SCAN_MODE].size = MAX_STRING_SIZE;
+ ps->option[SOAP_OPTION_SCAN_MODE].cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT;
+ ps->option[SOAP_OPTION_SCAN_MODE].constraint_type = SANE_CONSTRAINT_STRING_LIST;
+ ps->option[SOAP_OPTION_SCAN_MODE].constraint.string_list = ps->scanModeList;
+
+ ps->option[SOAP_OPTION_SCAN_RESOLUTION].name = SANE_NAME_SCAN_RESOLUTION;
+ ps->option[SOAP_OPTION_SCAN_RESOLUTION].title = SANE_TITLE_SCAN_RESOLUTION;
+ ps->option[SOAP_OPTION_SCAN_RESOLUTION].desc = SANE_DESC_SCAN_RESOLUTION;
+ ps->option[SOAP_OPTION_SCAN_RESOLUTION].type = SANE_TYPE_INT;
+ ps->option[SOAP_OPTION_SCAN_RESOLUTION].unit = SANE_UNIT_DPI;
+ ps->option[SOAP_OPTION_SCAN_RESOLUTION].size = sizeof(SANE_Int);
+ ps->option[SOAP_OPTION_SCAN_RESOLUTION].cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT;
+ ps->option[SOAP_OPTION_SCAN_RESOLUTION].constraint_type = SANE_CONSTRAINT_WORD_LIST;
+ ps->option[SOAP_OPTION_SCAN_RESOLUTION].constraint.word_list = ps->resolutionList;
+
+ ps->option[SOAP_OPTION_GROUP_ADVANCED].name = "advanced-group";
+ ps->option[SOAP_OPTION_GROUP_ADVANCED].title = STR_TITLE_ADVANCED;
+ ps->option[SOAP_OPTION_GROUP_ADVANCED].type = SANE_TYPE_GROUP;
+ ps->option[SOAP_OPTION_GROUP_ADVANCED].cap = SANE_CAP_ADVANCED;
+
+ ps->option[SOAP_OPTION_CONTRAST].name = SANE_NAME_CONTRAST;
+ ps->option[SOAP_OPTION_CONTRAST].title = SANE_TITLE_CONTRAST;
+ ps->option[SOAP_OPTION_CONTRAST].desc = SANE_DESC_CONTRAST;
+ ps->option[SOAP_OPTION_CONTRAST].type = SANE_TYPE_INT;
+ ps->option[SOAP_OPTION_CONTRAST].unit = SANE_UNIT_NONE;
+ ps->option[SOAP_OPTION_CONTRAST].size = sizeof(SANE_Int);
+ ps->option[SOAP_OPTION_CONTRAST].cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT | SANE_CAP_ADVANCED;
+ ps->option[SOAP_OPTION_CONTRAST].constraint_type = SANE_CONSTRAINT_RANGE;
+ ps->option[SOAP_OPTION_CONTRAST].constraint.range = &ps->contrastRange;
+ ps->contrastRange.min = SOAP_CONTRAST_MIN;
+ ps->contrastRange.max = SOAP_CONTRAST_MAX;
+ ps->contrastRange.quant = 0;
+
+ ps->option[SOAP_OPTION_COMPRESSION].name = STR_NAME_COMPRESSION;
+ ps->option[SOAP_OPTION_COMPRESSION].title = STR_TITLE_COMPRESSION;
+ ps->option[SOAP_OPTION_COMPRESSION].desc = STR_DESC_COMPRESSION;
+ ps->option[SOAP_OPTION_COMPRESSION].type = SANE_TYPE_STRING;
+ ps->option[SOAP_OPTION_COMPRESSION].unit = SANE_UNIT_NONE;
+ ps->option[SOAP_OPTION_COMPRESSION].size = MAX_STRING_SIZE;
+ ps->option[SOAP_OPTION_COMPRESSION].cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT | SANE_CAP_ADVANCED;
+ ps->option[SOAP_OPTION_COMPRESSION].constraint_type = SANE_CONSTRAINT_STRING_LIST;
+ ps->option[SOAP_OPTION_COMPRESSION].constraint.string_list = ps->compressionList;
+
+ ps->option[SOAP_OPTION_JPEG_QUALITY].name = STR_NAME_JPEG_QUALITY;
+ ps->option[SOAP_OPTION_JPEG_QUALITY].title = STR_TITLE_JPEG_QUALITY;
+ ps->option[SOAP_OPTION_JPEG_QUALITY].desc = STR_DESC_JPEG_QUALITY;
+ ps->option[SOAP_OPTION_JPEG_QUALITY].type = SANE_TYPE_INT;
+ ps->option[SOAP_OPTION_JPEG_QUALITY].unit = SANE_UNIT_NONE;
+ ps->option[SOAP_OPTION_JPEG_QUALITY].size = sizeof(SANE_Int);
+ ps->option[SOAP_OPTION_JPEG_QUALITY].cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT | SANE_CAP_ADVANCED;
+ ps->option[SOAP_OPTION_JPEG_QUALITY].constraint_type = SANE_CONSTRAINT_RANGE;
+ ps->option[SOAP_OPTION_JPEG_QUALITY].constraint.range = &ps->jpegQualityRange;
+ ps->jpegQualityRange.min = MIN_JPEG_COMPRESSION_FACTOR;
+ ps->jpegQualityRange.max = MAX_JPEG_COMPRESSION_FACTOR;
+ ps->jpegQualityRange.quant = 0;
+
+ ps->option[SOAP_OPTION_GROUP_GEOMETRY].name = "geometry-group";
+ ps->option[SOAP_OPTION_GROUP_GEOMETRY].title = STR_TITLE_GEOMETRY;
+ ps->option[SOAP_OPTION_GROUP_GEOMETRY].type = SANE_TYPE_GROUP;
+ ps->option[SOAP_OPTION_GROUP_GEOMETRY].cap = SANE_CAP_ADVANCED;
+
+ ps->option[SOAP_OPTION_TL_X].name = SANE_NAME_SCAN_TL_X;
+ ps->option[SOAP_OPTION_TL_X].title = SANE_TITLE_SCAN_TL_X;
+ ps->option[SOAP_OPTION_TL_X].desc = SANE_DESC_SCAN_TL_X;
+ ps->option[SOAP_OPTION_TL_X].type = SANE_TYPE_FIXED;
+ ps->option[SOAP_OPTION_TL_X].unit = SANE_UNIT_MM;
+ ps->option[SOAP_OPTION_TL_X].size = sizeof(SANE_Int);
+ ps->option[SOAP_OPTION_TL_X].cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT;
+ ps->option[SOAP_OPTION_TL_X].constraint_type = SANE_CONSTRAINT_RANGE;
+ ps->option[SOAP_OPTION_TL_X].constraint.range = &ps->tlxRange;
+ ps->tlxRange.min = 0;
+ ps->tlxRange.quant = 0;
+
+ ps->option[SOAP_OPTION_TL_Y].name = SANE_NAME_SCAN_TL_Y;
+ ps->option[SOAP_OPTION_TL_Y].title = SANE_TITLE_SCAN_TL_Y;
+ ps->option[SOAP_OPTION_TL_Y].desc = SANE_DESC_SCAN_TL_Y;
+ ps->option[SOAP_OPTION_TL_Y].type = SANE_TYPE_FIXED;
+ ps->option[SOAP_OPTION_TL_Y].unit = SANE_UNIT_MM;
+ ps->option[SOAP_OPTION_TL_Y].size = sizeof(SANE_Int);
+ ps->option[SOAP_OPTION_TL_Y].cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT;
+ ps->option[SOAP_OPTION_TL_Y].constraint_type = SANE_CONSTRAINT_RANGE;
+ ps->option[SOAP_OPTION_TL_Y].constraint.range = &ps->tlyRange;
+ ps->tlyRange.min = 0;
+ ps->tlyRange.quant = 0;
+
+ ps->option[SOAP_OPTION_BR_X].name = SANE_NAME_SCAN_BR_X;
+ ps->option[SOAP_OPTION_BR_X].title = SANE_TITLE_SCAN_BR_X;
+ ps->option[SOAP_OPTION_BR_X].desc = SANE_DESC_SCAN_BR_X;
+ ps->option[SOAP_OPTION_BR_X].type = SANE_TYPE_FIXED;
+ ps->option[SOAP_OPTION_BR_X].unit = SANE_UNIT_MM;
+ ps->option[SOAP_OPTION_BR_X].size = sizeof(SANE_Int);
+ ps->option[SOAP_OPTION_BR_X].cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT;
+ ps->option[SOAP_OPTION_BR_X].constraint_type = SANE_CONSTRAINT_RANGE;
+ ps->option[SOAP_OPTION_BR_X].constraint.range = &ps->brxRange;
+ ps->brxRange.min = 0;
+ ps->brxRange.quant = 0;
+
+ ps->option[SOAP_OPTION_BR_Y].name = SANE_NAME_SCAN_BR_Y;
+ ps->option[SOAP_OPTION_BR_Y].title = SANE_TITLE_SCAN_BR_Y;
+ ps->option[SOAP_OPTION_BR_Y].desc = SANE_DESC_SCAN_BR_Y;
+ ps->option[SOAP_OPTION_BR_Y].type = SANE_TYPE_FIXED;
+ ps->option[SOAP_OPTION_BR_Y].unit = SANE_UNIT_MM;
+ ps->option[SOAP_OPTION_BR_Y].size = sizeof(SANE_Int);
+ ps->option[SOAP_OPTION_BR_Y].cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT;
+ ps->option[SOAP_OPTION_BR_Y].constraint_type = SANE_CONSTRAINT_RANGE;
+ ps->option[SOAP_OPTION_BR_Y].constraint.range = &ps->bryRange;
+ ps->bryRange.min = 0;
+ ps->bryRange.quant = 0;
+
+ return 0;
+} /* init_options */
+
+/* Verify current x/y extents and set effective extents. */
+static int set_extents(struct soap_session *ps)
+{
+ int stat = 0;
+
+ if ((ps->currentBrx > ps->currentTlx) && (ps->currentBrx - ps->currentTlx >= ps->min_width) && (ps->currentBrx - ps->currentTlx <= ps->tlxRange.max))
+ {
+ ps->effectiveTlx = ps->currentTlx;
+ ps->effectiveBrx = ps->currentBrx;
+ }
+ else
+ {
+ ps->effectiveTlx = 0; /* current setting is not valid, zero it */
+ ps->effectiveBrx = 0;
+ stat = 1;
+ }
+ if ((ps->currentBry > ps->currentTly) && (ps->currentBry - ps->currentTly > ps->min_height) && (ps->currentBry - ps->currentTly <= ps->tlyRange.max))
+ {
+ ps->effectiveTly = ps->currentTly;
+ ps->effectiveBry = ps->currentBry;
+ }
+ else
+ {
+ ps->effectiveTly = 0; /* current setting is not valid, zero it */
+ ps->effectiveBry = 0;
+ stat = 1;
+ }
+ return stat;
+} /* set_extents */
+
+/*
+ * SANE APIs.
+ */
+
+SANE_Status soap_open(SANE_String_Const device, SANE_Handle *handle)
+{
+ struct hpmud_model_attributes ma;
+ int stat = SANE_STATUS_IO_ERROR, i;
+
+ DBG8("sane_hpaio_open(%s)\n", device);
+
+ if (session)
+ {
+ BUG("session in use\n");
+ return SANE_STATUS_DEVICE_BUSY;
+ }
+
+ if ((session = create_session()) == NULL)
+ return SANE_STATUS_NO_MEM;
+
+ /* Set session to specified device. */
+ snprintf(session->uri, sizeof(session->uri)-1, "hp:%s", device); /* prepend "hp:" */
+
+ /* Get actual model attributes from models.dat. */
+ hpmud_query_model(session->uri, &ma);
+ session->scan_type = ma.scantype;
+
+ if (hpmud_open_device(session->uri, ma.mfp_mode, &session->dd) != HPMUD_R_OK)
+ {
+ BUG("unable to open device %s\n", session->uri);
+ goto bugout;
+
+ free(session);
+ session = NULL;
+ return SANE_STATUS_IO_ERROR;
+ }
+
+ if (bb_load(session, "bb_soap.so"))
+ {
+ stat = SANE_STATUS_IO_ERROR;
+ goto bugout;
+ }
+
+ /* Init sane option descriptors. */
+ init_options(session);
+
+ if (session->bb_open(session))
+ {
+ stat = SANE_STATUS_IO_ERROR;
+ goto bugout;
+ }
+
+ /* Set supported Scan Modes as determined by bb_open. */
+ soap_control_option(session, SOAP_OPTION_SCAN_MODE, SANE_ACTION_SET_AUTO, NULL, NULL); /* set default option */
+
+ /* Set supported resolutions. */
+ i=1;
+ session->resolutionList[i++] = 75;
+ session->resolutionList[i++] = 100;
+ session->resolutionList[i++] = 150;
+ session->resolutionList[i++] = 200;
+ session->resolutionList[i++] = 300;
+ session->resolutionList[i++] = 600;
+ session->resolutionList[i++] = 1200;
+ session->resolutionList[0] = i-1; /* length of word_list */
+ soap_control_option(session, SOAP_OPTION_SCAN_RESOLUTION, SANE_ACTION_SET_AUTO, NULL, NULL); /* set default option */
+
+ /* Set supported contrast. */
+ soap_control_option(session, SOAP_OPTION_CONTRAST, SANE_ACTION_SET_AUTO, NULL, NULL); /* set default option */
+
+ /* Set supported compression. (Note, cm1017 may say it supports MMR, but it doesn't) */
+ soap_control_option(session, SOAP_OPTION_COMPRESSION, SANE_ACTION_SET_AUTO, NULL, NULL); /* set default option */
+
+ /* Set jpeg quality factor as determined by bb_open. */
+ soap_control_option(session, SOAP_OPTION_JPEG_QUALITY, SANE_ACTION_SET_AUTO, NULL, NULL); /* set default option */
+
+ /* Set x,y extents. See bb_open */
+ soap_control_option(session, SOAP_OPTION_TL_X, SANE_ACTION_SET_AUTO, NULL, NULL); /* set default option */
+ soap_control_option(session, SOAP_OPTION_TL_Y, SANE_ACTION_SET_AUTO, NULL, NULL); /* set default option */
+ soap_control_option(session, SOAP_OPTION_BR_X, SANE_ACTION_SET_AUTO, NULL, NULL); /* set default option */
+ soap_control_option(session, SOAP_OPTION_BR_Y, SANE_ACTION_SET_AUTO, NULL, NULL); /* set default option */
+
+ *handle = (SANE_Handle *)session;
+
+ stat = SANE_STATUS_GOOD;
+
+bugout:
+
+ if (stat != SANE_STATUS_GOOD)
+ {
+ if (session)
+ {
+ bb_unload(session);
+ if (session->dd > 0)
+ hpmud_close_device(session->dd);
+ free(session);
+ session = NULL;
+ }
+ }
+
+ return stat;
+} /* sane_open */
+
+void soap_close(SANE_Handle handle)
+{
+ struct soap_session *ps = (struct soap_session *)handle;
+
+ DBG8("sane_hpaio_close()\n");
+
+ if (ps == NULL || ps != session)
+ {
+ BUG("invalid sane_close\n");
+ return;
+ }
+
+ ps->bb_close(ps);
+ bb_unload(ps);
+
+ if (ps->dd > 0)
+ hpmud_close_device(ps->dd);
+
+ free(ps);
+ session = NULL;
+} /* soap_close */
+
+const SANE_Option_Descriptor *soap_get_option_descriptor(SANE_Handle handle, SANE_Int option)
+{
+ struct soap_session *ps = (struct soap_session *)handle;
+
+ DBG8("sane_hpaio_get_option_descriptor(option=%s)\n", ps->option[option].name);
+
+ if (option < 0 || option >= SOAP_OPTION_MAX)
+ return NULL;
+
+ return &ps->option[option];
+} /* soap_get_option_descriptor */
+
+SANE_Status soap_control_option(SANE_Handle handle, SANE_Int option, SANE_Action action, void *value, SANE_Int *set_result)
+{
+ struct soap_session *ps = (struct soap_session *)handle;
+ SANE_Int *int_value = value, mset_result=0;
+ int i, stat=SANE_STATUS_INVAL;
+ char sz[64];
+
+ switch(option)
+ {
+ case SOAP_OPTION_COUNT:
+ if (action == SANE_ACTION_GET_VALUE)
+ {
+ *int_value = SOAP_OPTION_MAX;
+ stat = SANE_STATUS_GOOD;
+ }
+ break;
+ case SOAP_OPTION_SCAN_MODE:
+ if (action == SANE_ACTION_GET_VALUE)
+ {
+ for (i=0; ps->scanModeList[i]; i++)
+ {
+ if (ps->currentScanMode == ps->scanModeMap[i])
+ {
+ strcpy(value, ps->scanModeList[i]);
+ stat = SANE_STATUS_GOOD;
+ break;
+ }
+ }
+ }
+ else if (action == SANE_ACTION_SET_VALUE)
+ {
+ for (i=0; ps->scanModeList[i]; i++)
+ {
+ if (strcasecmp(ps->scanModeList[i], value) == 0)
+ {
+ ps->currentScanMode = ps->scanModeMap[i];
+ set_scan_mode_side_effects(ps, ps->currentScanMode);
+ mset_result |= SANE_INFO_RELOAD_PARAMS | SANE_INFO_RELOAD_OPTIONS;
+ stat = SANE_STATUS_GOOD;
+ break;
+ }
+ }
+ }
+ else
+ { /* Set default. */
+ ps->currentScanMode = CE_RGB24;
+ set_scan_mode_side_effects(ps, ps->currentScanMode);
+ stat = SANE_STATUS_GOOD;
+ }
+ break;
+ case SOAP_OPTION_SCAN_RESOLUTION:
+ if (action == SANE_ACTION_GET_VALUE)
+ {
+ *int_value = ps->currentResolution;
+ stat = SANE_STATUS_GOOD;
+ }
+ else if (action == SANE_ACTION_SET_VALUE)
+ {
+ for (i=1; i <= ps->resolutionList[0]; i++)
+ {
+ if (ps->resolutionList[i] == *int_value)
+ {
+ ps->currentResolution = *int_value;
+ mset_result |= SANE_INFO_RELOAD_PARAMS;
+ stat = SANE_STATUS_GOOD;
+ break;
+ }
+ }
+ }
+ else
+ { /* Set default. */
+ ps->currentResolution = 75;
+ stat = SANE_STATUS_GOOD;
+ }
+ break;
+ case SOAP_OPTION_CONTRAST:
+ if (action == SANE_ACTION_GET_VALUE)
+ {
+ *int_value = ps->currentContrast;
+ stat = SANE_STATUS_GOOD;
+ }
+ else if (action == SANE_ACTION_SET_VALUE)
+ {
+ if (*int_value >= SOAP_CONTRAST_MIN && *int_value <= SOAP_CONTRAST_MAX)
+ {
+ ps->currentContrast = *int_value;
+ stat = SANE_STATUS_GOOD;
+ break;
+ }
+ }
+ else
+ { /* Set default. */
+ ps->currentContrast = SOAP_CONTRAST_DEFAULT;
+ stat = SANE_STATUS_GOOD;
+ }
+ break;
+ case SOAP_OPTION_COMPRESSION:
+ if (action == SANE_ACTION_GET_VALUE)
+ {
+ for (i=0; ps->compressionList[i]; i++)
+ {
+ if (ps->currentCompression == ps->compressionMap[i])
+ {
+ strcpy(value, ps->compressionList[i]);
+ stat = SANE_STATUS_GOOD;
+ break;
+ }
+ }
+ }
+ else if (action == SANE_ACTION_SET_VALUE)
+ {
+ for (i=0; ps->compressionList[i]; i++)
+ {
+ if (strcasecmp(ps->compressionList[i], value) == 0)
+ {
+ ps->currentCompression = ps->compressionMap[i];
+ stat = SANE_STATUS_GOOD;
+ break;
+ }
+ }
+ }
+ else
+ { /* Set default. */
+ ps->currentCompression = SF_JFIF;
+ stat = SANE_STATUS_GOOD;
+ }
+ break;
+ case SOAP_OPTION_JPEG_QUALITY:
+ if (action == SANE_ACTION_GET_VALUE)
+ {
+ *int_value = ps->currentJpegQuality;
+ stat = SANE_STATUS_GOOD;
+ }
+ else if (action == SANE_ACTION_SET_VALUE)
+ {
+ if (*int_value >= MIN_JPEG_COMPRESSION_FACTOR && *int_value <= MAX_JPEG_COMPRESSION_FACTOR)
+ {
+ ps->currentJpegQuality = *int_value;
+ stat = SANE_STATUS_GOOD;
+ break;
+ }
+ }
+ else
+ { /* Set default. */
+ ps->currentJpegQuality = SAFER_JPEG_COMPRESSION_FACTOR;
+ stat = SANE_STATUS_GOOD;
+ }
+ break;
+ case SOAP_OPTION_TL_X:
+ if (action == SANE_ACTION_GET_VALUE)
+ {
+ *int_value = ps->currentTlx;
+ stat = SANE_STATUS_GOOD;
+ }
+ else if (action == SANE_ACTION_SET_VALUE)
+ {
+ if (*int_value >= ps->tlxRange.min && *int_value <= ps->tlxRange.max)
+ {
+ ps->currentTlx = *int_value;
+ mset_result |= SANE_INFO_RELOAD_PARAMS;
+ stat = SANE_STATUS_GOOD;
+ break;
+ }
+ }
+ else
+ { /* Set default. */
+ ps->currentTlx = ps->tlxRange.min;
+ stat = SANE_STATUS_GOOD;
+ }
+ break;
+ case SOAP_OPTION_TL_Y:
+ if (action == SANE_ACTION_GET_VALUE)
+ {
+ *int_value = ps->currentTly;
+ stat = SANE_STATUS_GOOD;
+ }
+ else if (action == SANE_ACTION_SET_VALUE)
+ {
+ if (*int_value >= ps->tlyRange.min && *int_value <= ps->tlyRange.max)
+ {
+
+ ps->currentTly = *int_value;
+ mset_result |= SANE_INFO_RELOAD_PARAMS;
+ stat = SANE_STATUS_GOOD;
+ break;
+ }
+ }
+ else
+ { /* Set default. */
+ ps->currentTly = ps->tlyRange.min;
+ stat = SANE_STATUS_GOOD;
+ }
+ break;
+ case SOAP_OPTION_BR_X:
+ if (action == SANE_ACTION_GET_VALUE)
+ {
+ *int_value = ps->currentBrx;
+ stat = SANE_STATUS_GOOD;
+ }
+ else if (action == SANE_ACTION_SET_VALUE)
+ {
+ if (*int_value >= ps->brxRange.min && *int_value <= ps->brxRange.max)
+ {
+ ps->currentBrx = *int_value;
+ mset_result |= SANE_INFO_RELOAD_PARAMS;
+ stat = SANE_STATUS_GOOD;
+ break;
+ }
+ }
+ else
+ { /* Set default. */
+ ps->currentBrx = ps->brxRange.max;
+ stat = SANE_STATUS_GOOD;
+ }
+ break;
+ case SOAP_OPTION_BR_Y:
+ if (action == SANE_ACTION_GET_VALUE)
+ {
+ *int_value = ps->currentBry;
+ stat = SANE_STATUS_GOOD;
+ }
+ else if (action == SANE_ACTION_SET_VALUE)
+ {
+ if (*int_value >= ps->bryRange.min && *int_value <= ps->bryRange.max)
+ {
+ ps->currentBry = *int_value;
+ mset_result |= SANE_INFO_RELOAD_PARAMS;
+ stat = SANE_STATUS_GOOD;
+ break;
+ }
+ }
+ else
+ { /* Set default. */
+ ps->currentBry = ps->bryRange.max;
+ stat = SANE_STATUS_GOOD;
+ }
+ break;
+ default:
+ break;
+ }
+
+ if (set_result)
+ *set_result = mset_result;
+
+ if (stat != SANE_STATUS_GOOD)
+ {
+ BUG("control_option failed: option=%s action=%s\n", ps->option[option].name,
+ action==SANE_ACTION_GET_VALUE ? "get" : action==SANE_ACTION_SET_VALUE ? "set" : "auto");
+ }
+
+ DBG8("sane_hpaio_control_option (option=%s action=%s value=%s)\n", ps->option[option].name,
+ action==SANE_ACTION_GET_VALUE ? "get" : action==SANE_ACTION_SET_VALUE ? "set" : "auto",
+ value ? ps->option[option].type == SANE_TYPE_STRING ? (char *)value : psnprintf(sz, sizeof(sz), "%d", *(int *)value) : "na");
+
+ return stat;
+} /* soap_control_option */
+
+SANE_Status soap_get_parameters(SANE_Handle handle, SANE_Parameters *params)
+{
+ struct soap_session *ps = (struct soap_session *)handle;
+
+ set_extents(ps);
+
+ /* Get scan parameters for sane client. */
+ ps->bb_get_parameters(ps, params, ps->ip_handle ? SPO_STARTED : SPO_BEST_GUESS);
+
+ DBG8("sane_hpaio_get_parameters(): format=%d, last_frame=%d, lines=%d, depth=%d, pixels_per_line=%d, bytes_per_line=%d\n",
+ params->format, params->last_frame, params->lines, params->depth, params->pixels_per_line, params->bytes_per_line);
+
+ return SANE_STATUS_GOOD;
+} /* soap_get_parameters */
+
+SANE_Status soap_start(SANE_Handle handle)
+{
+ struct soap_session *ps = (struct soap_session *)handle;
+ SANE_Parameters pp;
+ IP_IMAGE_TRAITS traits;
+ IP_XFORM_SPEC xforms[IP_MAX_XFORMS], *pXform=xforms;
+ int stat, ret;
+
+ DBG8("sane_hpaio_start()\n");
+ ps->user_cancel = 0;
+ if (set_extents(ps))
+ {
+ BUG("invalid extents: tlx=%d brx=%d tly=%d bry=%d minwidth=%d minheight%d maxwidth=%d maxheight=%d\n",
+ ps->currentTlx, ps->currentTly, ps->currentBrx, ps->currentBry, ps->min_width, ps->min_height, ps->tlxRange.max, ps->tlyRange.max);
+ stat = SANE_STATUS_INVAL;
+ goto bugout;
+ }
+
+ /* Start scan. */
+ if (ps->bb_start_scan(ps))
+ {
+ stat = SANE_STATUS_IO_ERROR;
+ goto bugout;
+ }
+ SendScanEvent(ps->uri, EVENT_START_SCAN_JOB);
+ memset(xforms, 0, sizeof(xforms));
+
+ /* Setup image-processing pipeline for xform. */
+ if (ps->currentScanMode == CE_RGB24 || ps->currentScanMode == CE_GRAY8)
+ {
+ pXform->aXformInfo[IP_JPG_DECODE_FROM_DENALI].dword = 0; /* 0=no */
+ ADD_XFORM(X_JPG_DECODE);
+ pXform->aXformInfo[IP_CNV_COLOR_SPACE_WHICH_CNV].dword = IP_CNV_YCC_TO_SRGB;
+ pXform->aXformInfo[IP_CNV_COLOR_SPACE_GAMMA].dword = 0x00010000;
+ ADD_XFORM(X_CNV_COLOR_SPACE);
+ }
+ else
+ { /* Must be BLACK_AND_WHITE1 (Lineart). */
+ pXform->aXformInfo[IP_JPG_DECODE_FROM_DENALI].dword = 0; /* 0=no */
+ ADD_XFORM(X_JPG_DECODE);
+ pXform->aXformInfo[IP_GRAY_2_BI_THRESHOLD].dword = 127;
+ ADD_XFORM(X_GRAY_2_BI);
+ }
+
+ /* Setup x/y cropping for xform. (Actually we let cm1017 do it's own cropping) */
+ pXform->aXformInfo[IP_CROP_LEFT].dword = 0;
+ pXform->aXformInfo[IP_CROP_RIGHT].dword = 0;
+ pXform->aXformInfo[IP_CROP_TOP].dword = 0;
+ pXform->aXformInfo[IP_CROP_MAXOUTROWS].dword = 0;
+ ADD_XFORM(X_CROP);
+
+ /* Setup x/y padding for xform. (Actually we let cm1017 do it's own padding) */
+ pXform->aXformInfo[IP_PAD_LEFT].dword = 0; /* # of pixels to add to left side */
+ pXform->aXformInfo[IP_PAD_RIGHT].dword = 0; /* # of pixels to add to right side */
+ pXform->aXformInfo[IP_PAD_TOP].dword = 0; /* # of rows to add to top */
+ pXform->aXformInfo[IP_PAD_BOTTOM].dword = 0; /* # of rows to add to bottom */
+ pXform->aXformInfo[IP_PAD_VALUE].dword = ps->currentScanMode == CE_BLACK_AND_WHITE1 ? 0 : -1; /* lineart white = 0, rgb white = -1 */
+ pXform->aXformInfo[IP_PAD_MIN_HEIGHT].dword = 0;
+ ADD_XFORM(X_PAD);
+
+ /* Open image processor. */
+ if ((ret = ipOpen(pXform-xforms, xforms, 0, &ps->ip_handle)) != IP_DONE)
+ {
+ BUG("unable open image processor: err=%d\n", ret);
+ stat = SANE_STATUS_INVAL;
+ goto bugout;
+ }
+
+ /* Set known input image attributes. */
+ ps->bb_get_parameters(ps, &pp, SPO_BEST_GUESS);
+ traits.iPixelsPerRow = pp.pixels_per_line;
+ switch(ps->currentScanMode)
+ {
+ case CE_BLACK_AND_WHITE1: /* linart uses 8-bit gray */
+ case CE_GRAY8:
+ traits.iBitsPerPixel = 8; /* grayscale */
+ break;
+ case CE_RGB24:
+ default:
+ traits.iBitsPerPixel = 24; /* color */
+ break;
+ }
+ traits.lHorizDPI = ps->currentResolution << 16;
+ traits.lVertDPI = ps->currentResolution << 16;
+ traits.lNumRows = pp.lines;
+ traits.iNumPages = 1;
+ traits.iPageNum = 1;
+ traits.iComponentsPerPixel = ((traits.iBitsPerPixel % 3) ? 1 : 3);
+ DBG6("set traits iPixelsPerRow=%d iBitsPerPixel=%d lNumRows=%d iComponentsPerPixel=%d\n", traits.iPixelsPerRow,
+ traits.iBitsPerPixel, (int)traits.lNumRows, traits.iComponentsPerPixel);
+ ipSetDefaultInputTraits(ps->ip_handle, &traits);
+
+ /* If jpeg get output image attributes from the image processor. */
+ if (ps->currentCompression == SF_JFIF)
+ {
+ /* Enable parsed header flag. */
+ ipResultMask(ps->ip_handle, IP_PARSED_HEADER);
+
+ /* Wait for image processor to process header so we know the exact size of the image for sane_get_params. */
+ while (1)
+ {
+ ret = get_ip_data(ps, NULL, 0, NULL);
+
+ if (ret & (IP_INPUT_ERROR | IP_FATAL_ERROR | IP_DONE))
+ {
+ BUG("ipConvert error=%x\n", ret);
+ stat = SANE_STATUS_IO_ERROR;
+ goto bugout;
+ }
+
+ if (ret & IP_PARSED_HEADER)
+ {
+ ipGetImageTraits(ps->ip_handle, NULL, &ps->image_traits); /* get valid image traits */
+ ipResultMask(ps->ip_handle, 0); /* disable parsed header flag */
+ break;
+ }
+ }
+ }
+ else
+ ipGetImageTraits(ps->ip_handle, NULL, &ps->image_traits); /* get valid image traits */
+
+ DBG6("act traits iPixelsPerRow=%d iBitsPerPixel=%d lNumRows=%d iComponentsPerPixel=%d\n", ps->image_traits.iPixelsPerRow,
+ ps->image_traits.iBitsPerPixel, (int)ps->image_traits.lNumRows, ps->image_traits.iComponentsPerPixel);
+
+ stat = SANE_STATUS_GOOD;
+
+bugout:
+ if (stat != SANE_STATUS_GOOD)
+ {
+ if (ps->ip_handle)
+ {
+ ipClose(ps->ip_handle);
+ ps->ip_handle = 0;
+ }
+ ps->bb_end_scan(ps, stat == SANE_STATUS_IO_ERROR ? 1: 0);
+ }
+
+ return stat;
+} /* soap_start */
+
+SANE_Status soap_read(SANE_Handle handle, SANE_Byte *data, SANE_Int maxLength, SANE_Int *length)
+{
+ struct soap_session *ps = (struct soap_session *)handle;
+ int ret, stat=SANE_STATUS_IO_ERROR;
+
+ DBG8("sane_hpaio_read() handle=%p data=%p maxLength=%d\n", (void *)handle, data, maxLength);
+ if(ps->user_cancel)
+ {
+ DBG8("soap_read() EVENT_SCAN_CANCEL****uri=%s\n", ps->uri);
+ SendScanEvent(ps->uri, EVENT_SCAN_CANCEL);
+ return SANE_STATUS_CANCELLED;
+ }
+
+ ret = get_ip_data(ps, data, maxLength, length);
+
+ if(ret & (IP_INPUT_ERROR | IP_FATAL_ERROR))
+ {
+ BUG("ipConvert error=%x\n", ret);
+ goto bugout;
+ }
+
+ if (ret & IP_DONE)
+ {
+ stat = SANE_STATUS_EOF;
+ SendScanEvent (ps->uri, EVENT_END_SCAN_JOB);
+ }
+ else
+ stat = SANE_STATUS_GOOD;
+
+bugout:
+ if (stat != SANE_STATUS_GOOD)
+ {
+ if (ps->ip_handle)
+ {
+ /* Note always call ipClose when SANE_STATUS_EOF, do not depend on sane_cancel because sane_cancel is only called at the end of a batch job. */
+ ipClose(ps->ip_handle);
+ ps->ip_handle = 0;
+ }
+ ps->bb_end_page(ps, 0);
+ }
+
+ DBG8("-sane_hpaio_read() output=%p bytes_read=%d maxLength=%d status=%d\n", data, *length, maxLength, stat);
+
+ return stat;
+} /* soap_read */
+
+void soap_cancel(SANE_Handle handle)
+{
+ struct soap_session *ps = (struct soap_session *)handle;
+
+ DBG8("sane_hpaio_cancel()\n");
+
+ /*
+ * Sane_cancel is always called at the end of the scan job. Note that on a multiple page scan job
+ * sane_cancel is called only once.
+ */
+ ps->user_cancel = 1;
+ if (ps->ip_handle)
+ {
+ ipClose(ps->ip_handle);
+ ps->ip_handle = 0;
+ }
+ ps->bb_end_scan(ps, 0);
+} /* soap_cancel */
+
diff --git a/scan/sane/soap.h b/scan/sane/soap.h
new file mode 100755
index 0000000..d1d52d6
--- /dev/null
+++ b/scan/sane/soap.h
@@ -0,0 +1,42 @@
+/************************************************************************************\
+
+ soap.h - HP SANE backend support for soap base multi-function peripherals
+
+ (c) 2006,2008 Copyright Hewlett-Packard Development Company, LP
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+ of the Software, and to permit persons to whom the Software is furnished to do
+ so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+\************************************************************************************/
+
+#ifndef _SOAP_H
+#define _SOAP_H
+
+#include "sane.h"
+
+SANE_Status soap_open(SANE_String_Const device, SANE_Handle *handle);
+void soap_close(SANE_Handle handle);
+const SANE_Option_Descriptor * soap_get_option_descriptor(SANE_Handle handle, SANE_Int option);
+SANE_Status soap_control_option(SANE_Handle handle, SANE_Int option, SANE_Action action, void *value, SANE_Int *info);
+SANE_Status soap_get_parameters(SANE_Handle handle, SANE_Parameters *params);
+SANE_Status soap_start(SANE_Handle handle);
+SANE_Status soap_read(SANE_Handle handle, SANE_Byte *data, SANE_Int maxLength, SANE_Int *length);
+void soap_cancel(SANE_Handle handle);
+
+#endif // _SOAP_H
+
+
diff --git a/scan/sane/soapht.c b/scan/sane/soapht.c
new file mode 100644
index 0000000..deb81bc
--- /dev/null
+++ b/scan/sane/soapht.c
@@ -0,0 +1,1151 @@
+/************************************************************************************\
+
+ soapht.c - HP SANE backend support for soap based multi-function peripherals
+
+ (c) 2006,2008 Copyright Hewlett-Packard Development Company, LP
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+ of the Software, and to permit persons to whom the Software is furnished to do
+ so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+ Note when the LJM1522 input source is ADF, all pages loaded in the ADF must be scanned
+ as one complete scan job, otherwise the ADF will jam. This mean if you try to scan
+ one page only when multiple pages are loaded, the second page will jam. This is how the
+ hardware works. The Windows driver has the same limitation.
+
+ Author: David Suffield
+ Contributor: Sarbeswar Meher
+
+\************************************************************************************/
+
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE
+#endif
+
+#include <stdarg.h>
+#include <syslog.h>
+#include <stdio.h>
+#include <string.h>
+#include <fcntl.h>
+#include <math.h>
+#include <dlfcn.h>
+#include "sane.h"
+#include "saneopts.h"
+#include "hpmud.h"
+#include "hpip.h"
+#include "common.h"
+#include "soapht.h"
+#include "soaphti.h"
+#include "io.h"
+
+#define DEBUG_DECLARE_ONLY
+#include "sanei_debug.h"
+
+static struct soap_session *session = NULL; /* assume one sane_open per process */
+
+static int bb_load(struct soap_session *ps, const char *so)
+{
+ char home[128];
+ char sz[255];
+ int stat=1;
+
+ /* Load hpmud manually with symbols exported. Otherwise the plugin will not find it. */
+ if ((ps->hpmud_handle = dlopen("libhpmud.so.0", RTLD_LAZY|RTLD_GLOBAL)) == NULL)
+ {
+ BUG("unable to load restricted library: %s\n", dlerror());
+ goto bugout;
+ }
+
+ /* Load math library manually with symbols exported (Ubuntu 8.04). Otherwise the plugin will not find it. */
+ if ((ps->math_handle = dlopen("libm.so", RTLD_LAZY|RTLD_GLOBAL)) == NULL)
+ {
+ if ((ps->math_handle = dlopen("libm.so.6", RTLD_LAZY|RTLD_GLOBAL)) == NULL)
+ {
+ BUG("unable to load restricted library: %s\n", dlerror());
+ goto bugout;
+ }
+ }
+
+ if (hpmud_get_conf("[dirs]", "home", home, sizeof(home)) != HPMUD_R_OK)
+ goto bugout;
+ snprintf(sz, sizeof(sz), "%s/scan/plugins/%s", home, so);
+ if ((ps->bb_handle = dlopen(sz, RTLD_NOW|RTLD_GLOBAL)) == NULL)
+ {
+ BUG("unable to load restricted library %s: %s\n", sz, dlerror());
+ SendScanEvent(ps->uri, EVENT_PLUGIN_FAIL);
+ goto bugout;
+ }
+
+ if ((ps->bb_open = dlsym(ps->bb_handle, "bb_open")) == NULL)
+ {
+ BUG("unable to load restricted library %s: %s\n", sz, dlerror());
+ goto bugout;
+ }
+ if ((ps->bb_close = dlsym(ps->bb_handle, "bb_close")) == NULL)
+ {
+ BUG("unable to load restricted library %s: %s\n", sz, dlerror());
+ goto bugout;
+ }
+ if ((ps->bb_get_parameters = dlsym(ps->bb_handle, "bb_get_parameters")) == NULL)
+ {
+ BUG("unable to load restricted library %s: %s\n", sz, dlerror());
+ goto bugout;
+ }
+ if ((ps->bb_is_paper_in_adf = dlsym(ps->bb_handle, "bb_is_paper_in_adf")) == NULL)
+ {
+ BUG("unable to load restricted library %s: %s\n", sz, dlerror());
+ goto bugout;
+ }
+ if ((ps->bb_start_scan = dlsym(ps->bb_handle, "bb_start_scan")) == NULL)
+ {
+ BUG("unable to load restricted library %s: %s\n", sz, dlerror());
+ goto bugout;
+ }
+ if ((ps->bb_end_scan = dlsym(ps->bb_handle, "bb_end_scan")) == NULL)
+ {
+ BUG("unable to load restricted library %s: %s\n", sz, dlerror());
+ goto bugout;
+ }
+ if ((ps->bb_get_image_data = dlsym(ps->bb_handle, "bb_get_image_data")) == NULL)
+ {
+ BUG("unable to load restricted library %s: %s\n", sz, dlerror());
+ goto bugout;
+ }
+ if ((ps->bb_end_page = dlsym(ps->bb_handle, "bb_end_page")) == NULL)
+ {
+ BUG("unable to load restricted library %s: %s\n", sz, dlerror());
+ goto bugout;
+ }
+
+ stat=0;
+
+bugout:
+ return stat;
+} /* bb_load */
+
+static int bb_unload(struct soap_session *ps)
+{
+ if (ps->bb_handle)
+ {
+ dlclose(ps->bb_handle);
+ ps->bb_handle = NULL;
+ }
+ if (ps->hpmud_handle)
+ {
+ dlclose(ps->hpmud_handle);
+ ps->hpmud_handle = NULL;
+ }
+ if (ps->math_handle)
+ {
+ dlclose(ps->math_handle);
+ ps->math_handle = NULL;
+ }
+ return 0;
+} /* bb_unload */
+
+/* Get raw data (ie: uncompressed data) from image processor. */
+static int get_ip_data(struct soap_session *ps, SANE_Byte *data, SANE_Int maxLength, SANE_Int *length)
+{
+ int ip_ret=IP_INPUT_ERROR;
+ unsigned int outputAvail=maxLength, outputUsed=0, outputThisPos;
+ unsigned char *input, *output = data;
+ unsigned int inputAvail, inputUsed=0, inputNextPos;
+
+ if (!ps->ip_handle)
+ {
+ BUG("invalid ipconvert state\n");
+ goto bugout;
+ }
+
+ if (ps->bb_get_image_data(ps, outputAvail))
+ goto bugout;
+
+ if (ps->cnt > 0)
+ {
+ inputAvail = ps->cnt;
+ input = &ps->buf[ps->index];
+ }
+ else
+ {
+ input = NULL; /* no more scan data, flush ipconvert pipeline */
+ inputAvail = 0;
+ }
+
+ /* Transform input data to output. Note, output buffer may consume more bytes than input buffer (ie: jpeg to raster). */
+ ip_ret = ipConvert(ps->ip_handle, inputAvail, input, &inputUsed, &inputNextPos, outputAvail, output, &outputUsed, &outputThisPos);
+
+ DBG6("cnt=%d index=%d input=%p inputAvail=%d inputUsed=%d inputNextPos=%d output=%p outputAvail=%d outputUsed=%d outputThisPos=%d\n", ps->cnt, ps->index, input,
+ inputAvail, inputUsed, inputNextPos, output, outputAvail, outputUsed, outputThisPos);
+
+ if (input != NULL)
+ {
+ if (inputAvail == inputUsed)
+ {
+ ps->index = ps->cnt = 0; /* reset buffer */
+ }
+ else
+ {
+ ps->cnt -= inputUsed; /* save left over buffer for next soap_read */
+ ps->index += inputUsed;
+ }
+ }
+
+ if (data)
+ *length = outputUsed;
+
+ /* For sane do not send output data simultaneously with IP_DONE. */
+ if (ip_ret & IP_DONE && outputUsed)
+ ip_ret &= ~IP_DONE;
+
+bugout:
+ return ip_ret;
+} /* get_ip_data */
+
+static int set_scan_mode_side_effects(struct soap_session *ps, enum COLOR_ENTRY scanMode)
+{
+ int j=0;
+
+ memset(ps->compressionList, 0, sizeof(ps->compressionList));
+ memset(ps->compressionMap, 0, sizeof(ps->compressionMap));
+
+ switch (scanMode)
+ {
+ case CE_BLACK_AND_WHITE1: /* same as GRAY8 */
+ case CE_GRAY8:
+ case CE_RGB24:
+ default:
+ ps->compressionList[j] = STR_COMPRESSION_NONE;
+ ps->compressionMap[j++] = SF_HPRAW;
+ ps->compressionList[j] = STR_COMPRESSION_JPEG;
+ ps->compressionMap[j++] = SF_JFIF;
+ ps->currentCompression = SF_JFIF;
+ ps->option[SOAP_OPTION_JPEG_QUALITY].cap |= SANE_CAP_SOFT_SELECT; /* enable jpeg quality */
+ break;
+ }
+
+ return 0;
+} /* set_scan_mode_side_effects */
+
+static int set_input_source_side_effects(struct soap_session *ps, enum INPUT_SOURCE source)
+{
+ switch (source)
+ {
+ case IS_PLATEN:
+ ps->min_width = ps->platen_min_width;
+ ps->min_height = ps->platen_min_height;
+ ps->tlxRange.max = ps->platen_tlxRange.max;
+ ps->brxRange.max = ps->platen_brxRange.max;
+ ps->tlyRange.max = ps->platen_tlyRange.max;
+ ps->bryRange.max = ps->platen_bryRange.max;
+ break;
+ case IS_ADF:
+ case IS_ADF_DUPLEX:
+ default:
+ ps->min_width = ps->adf_min_width;
+ ps->min_height = ps->adf_min_height;
+ ps->tlxRange.max = ps->adf_tlxRange.max;
+ ps->brxRange.max = ps->adf_brxRange.max;
+ ps->tlyRange.max = ps->adf_tlyRange.max;
+ ps->bryRange.max = ps->adf_bryRange.max;
+ break;
+ }
+
+ return 0;
+} /* set_input_source_side_effects */
+
+static int init_options(struct soap_session *ps)
+{
+ ps->option[SOAP_OPTION_COUNT].name = "option-cnt";
+ ps->option[SOAP_OPTION_COUNT].title = SANE_TITLE_NUM_OPTIONS;
+ ps->option[SOAP_OPTION_COUNT].desc = SANE_DESC_NUM_OPTIONS;
+ ps->option[SOAP_OPTION_COUNT].type = SANE_TYPE_INT;
+ ps->option[SOAP_OPTION_COUNT].unit = SANE_UNIT_NONE;
+ ps->option[SOAP_OPTION_COUNT].size = sizeof(SANE_Int);
+ ps->option[SOAP_OPTION_COUNT].cap = SANE_CAP_SOFT_DETECT;
+ ps->option[SOAP_OPTION_COUNT].constraint_type = SANE_CONSTRAINT_NONE;
+
+ ps->option[SOAP_OPTION_GROUP_SCAN_MODE].name = "mode-group";
+ ps->option[SOAP_OPTION_GROUP_SCAN_MODE].title = SANE_TITLE_SCAN_MODE;
+ ps->option[SOAP_OPTION_GROUP_SCAN_MODE].type = SANE_TYPE_GROUP;
+
+ ps->option[SOAP_OPTION_SCAN_MODE].name = SANE_NAME_SCAN_MODE;
+ ps->option[SOAP_OPTION_SCAN_MODE].title = SANE_TITLE_SCAN_MODE;
+ ps->option[SOAP_OPTION_SCAN_MODE].desc = SANE_DESC_SCAN_MODE;
+ ps->option[SOAP_OPTION_SCAN_MODE].type = SANE_TYPE_STRING;
+ ps->option[SOAP_OPTION_SCAN_MODE].unit = SANE_UNIT_NONE;
+ ps->option[SOAP_OPTION_SCAN_MODE].size = MAX_STRING_SIZE;
+ ps->option[SOAP_OPTION_SCAN_MODE].cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT;
+ ps->option[SOAP_OPTION_SCAN_MODE].constraint_type = SANE_CONSTRAINT_STRING_LIST;
+ ps->option[SOAP_OPTION_SCAN_MODE].constraint.string_list = ps->scanModeList;
+
+ ps->option[SOAP_OPTION_INPUT_SOURCE].name = SANE_NAME_SCAN_SOURCE;
+ ps->option[SOAP_OPTION_INPUT_SOURCE].title = SANE_TITLE_SCAN_SOURCE;
+ ps->option[SOAP_OPTION_INPUT_SOURCE].desc = SANE_DESC_SCAN_SOURCE;
+ ps->option[SOAP_OPTION_INPUT_SOURCE].type = SANE_TYPE_STRING;
+ ps->option[SOAP_OPTION_INPUT_SOURCE].unit = SANE_UNIT_NONE;
+ ps->option[SOAP_OPTION_INPUT_SOURCE].size = MAX_STRING_SIZE;
+ ps->option[SOAP_OPTION_INPUT_SOURCE].cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT;
+ ps->option[SOAP_OPTION_INPUT_SOURCE].constraint_type = SANE_CONSTRAINT_STRING_LIST;
+ ps->option[SOAP_OPTION_INPUT_SOURCE].constraint.string_list = ps->inputSourceList;
+
+ ps->option[SOAP_OPTION_SCAN_RESOLUTION].name = SANE_NAME_SCAN_RESOLUTION;
+ ps->option[SOAP_OPTION_SCAN_RESOLUTION].title = SANE_TITLE_SCAN_RESOLUTION;
+ ps->option[SOAP_OPTION_SCAN_RESOLUTION].desc = SANE_DESC_SCAN_RESOLUTION;
+ ps->option[SOAP_OPTION_SCAN_RESOLUTION].type = SANE_TYPE_INT;
+ ps->option[SOAP_OPTION_SCAN_RESOLUTION].unit = SANE_UNIT_DPI;
+ ps->option[SOAP_OPTION_SCAN_RESOLUTION].size = sizeof(SANE_Int);
+ ps->option[SOAP_OPTION_SCAN_RESOLUTION].cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT;
+ ps->option[SOAP_OPTION_SCAN_RESOLUTION].constraint_type = SANE_CONSTRAINT_WORD_LIST;
+ ps->option[SOAP_OPTION_SCAN_RESOLUTION].constraint.word_list = ps->resolutionList;
+
+ ps->option[SOAP_OPTION_GROUP_ADVANCED].name = "advanced-group";
+ ps->option[SOAP_OPTION_GROUP_ADVANCED].title = STR_TITLE_ADVANCED;
+ ps->option[SOAP_OPTION_GROUP_ADVANCED].type = SANE_TYPE_GROUP;
+ ps->option[SOAP_OPTION_GROUP_ADVANCED].cap = SANE_CAP_ADVANCED;
+
+ ps->option[SOAP_OPTION_CONTRAST].name = SANE_NAME_CONTRAST;
+ ps->option[SOAP_OPTION_CONTRAST].title = SANE_TITLE_CONTRAST;
+ ps->option[SOAP_OPTION_CONTRAST].desc = SANE_DESC_CONTRAST;
+ ps->option[SOAP_OPTION_CONTRAST].type = SANE_TYPE_INT;
+ ps->option[SOAP_OPTION_CONTRAST].unit = SANE_UNIT_NONE;
+ ps->option[SOAP_OPTION_CONTRAST].size = sizeof(SANE_Int);
+ ps->option[SOAP_OPTION_CONTRAST].cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT | SANE_CAP_ADVANCED;
+ ps->option[SOAP_OPTION_CONTRAST].constraint_type = SANE_CONSTRAINT_RANGE;
+ ps->option[SOAP_OPTION_CONTRAST].constraint.range = &ps->contrastRange;
+ ps->contrastRange.min = SOAP_CONTRAST_MIN;
+ ps->contrastRange.max = SOAP_CONTRAST_MAX;
+ ps->contrastRange.quant = 0;
+
+ ps->option[SOAP_OPTION_COMPRESSION].name = STR_NAME_COMPRESSION;
+ ps->option[SOAP_OPTION_COMPRESSION].title = STR_TITLE_COMPRESSION;
+ ps->option[SOAP_OPTION_COMPRESSION].desc = STR_DESC_COMPRESSION;
+ ps->option[SOAP_OPTION_COMPRESSION].type = SANE_TYPE_STRING;
+ ps->option[SOAP_OPTION_COMPRESSION].unit = SANE_UNIT_NONE;
+ ps->option[SOAP_OPTION_COMPRESSION].size = MAX_STRING_SIZE;
+ ps->option[SOAP_OPTION_COMPRESSION].cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT | SANE_CAP_ADVANCED;
+ ps->option[SOAP_OPTION_COMPRESSION].constraint_type = SANE_CONSTRAINT_STRING_LIST;
+ ps->option[SOAP_OPTION_COMPRESSION].constraint.string_list = ps->compressionList;
+
+ ps->option[SOAP_OPTION_JPEG_QUALITY].name = STR_NAME_JPEG_QUALITY;
+ ps->option[SOAP_OPTION_JPEG_QUALITY].title = STR_TITLE_JPEG_QUALITY;
+ ps->option[SOAP_OPTION_JPEG_QUALITY].desc = STR_DESC_JPEG_QUALITY;
+ ps->option[SOAP_OPTION_JPEG_QUALITY].type = SANE_TYPE_INT;
+ ps->option[SOAP_OPTION_JPEG_QUALITY].unit = SANE_UNIT_NONE;
+ ps->option[SOAP_OPTION_JPEG_QUALITY].size = sizeof(SANE_Int);
+ ps->option[SOAP_OPTION_JPEG_QUALITY].cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT | SANE_CAP_ADVANCED;
+ ps->option[SOAP_OPTION_JPEG_QUALITY].constraint_type = SANE_CONSTRAINT_RANGE;
+ ps->option[SOAP_OPTION_JPEG_QUALITY].constraint.range = &ps->jpegQualityRange;
+ ps->jpegQualityRange.min = MIN_JPEG_COMPRESSION_FACTOR;
+ ps->jpegQualityRange.max = MAX_JPEG_COMPRESSION_FACTOR;
+ ps->jpegQualityRange.quant = 0;
+
+ ps->option[SOAP_OPTION_GROUP_GEOMETRY].name = "geometry-group";
+ ps->option[SOAP_OPTION_GROUP_GEOMETRY].title = STR_TITLE_GEOMETRY;
+ ps->option[SOAP_OPTION_GROUP_GEOMETRY].type = SANE_TYPE_GROUP;
+ ps->option[SOAP_OPTION_GROUP_GEOMETRY].cap = SANE_CAP_ADVANCED;
+
+ ps->option[SOAP_OPTION_TL_X].name = SANE_NAME_SCAN_TL_X;
+ ps->option[SOAP_OPTION_TL_X].title = SANE_TITLE_SCAN_TL_X;
+ ps->option[SOAP_OPTION_TL_X].desc = SANE_DESC_SCAN_TL_X;
+ ps->option[SOAP_OPTION_TL_X].type = SANE_TYPE_FIXED;
+ ps->option[SOAP_OPTION_TL_X].unit = SANE_UNIT_MM;
+ ps->option[SOAP_OPTION_TL_X].size = sizeof(SANE_Int);
+ ps->option[SOAP_OPTION_TL_X].cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT;
+ ps->option[SOAP_OPTION_TL_X].constraint_type = SANE_CONSTRAINT_RANGE;
+ ps->option[SOAP_OPTION_TL_X].constraint.range = &ps->tlxRange;
+ ps->tlxRange.min = 0;
+ ps->tlxRange.quant = 0;
+
+ ps->option[SOAP_OPTION_TL_Y].name = SANE_NAME_SCAN_TL_Y;
+ ps->option[SOAP_OPTION_TL_Y].title = SANE_TITLE_SCAN_TL_Y;
+ ps->option[SOAP_OPTION_TL_Y].desc = SANE_DESC_SCAN_TL_Y;
+ ps->option[SOAP_OPTION_TL_Y].type = SANE_TYPE_FIXED;
+ ps->option[SOAP_OPTION_TL_Y].unit = SANE_UNIT_MM;
+ ps->option[SOAP_OPTION_TL_Y].size = sizeof(SANE_Int);
+ ps->option[SOAP_OPTION_TL_Y].cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT;
+ ps->option[SOAP_OPTION_TL_Y].constraint_type = SANE_CONSTRAINT_RANGE;
+ ps->option[SOAP_OPTION_TL_Y].constraint.range = &ps->tlyRange;
+ ps->tlyRange.min = 0;
+ ps->tlyRange.quant = 0;
+
+ ps->option[SOAP_OPTION_BR_X].name = SANE_NAME_SCAN_BR_X;
+ ps->option[SOAP_OPTION_BR_X].title = SANE_TITLE_SCAN_BR_X;
+ ps->option[SOAP_OPTION_BR_X].desc = SANE_DESC_SCAN_BR_X;
+ ps->option[SOAP_OPTION_BR_X].type = SANE_TYPE_FIXED;
+ ps->option[SOAP_OPTION_BR_X].unit = SANE_UNIT_MM;
+ ps->option[SOAP_OPTION_BR_X].size = sizeof(SANE_Int);
+ ps->option[SOAP_OPTION_BR_X].cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT;
+ ps->option[SOAP_OPTION_BR_X].constraint_type = SANE_CONSTRAINT_RANGE;
+ ps->option[SOAP_OPTION_BR_X].constraint.range = &ps->brxRange;
+ ps->brxRange.min = 0;
+ ps->brxRange.quant = 0;
+
+ ps->option[SOAP_OPTION_BR_Y].name = SANE_NAME_SCAN_BR_Y;
+ ps->option[SOAP_OPTION_BR_Y].title = SANE_TITLE_SCAN_BR_Y;
+ ps->option[SOAP_OPTION_BR_Y].desc = SANE_DESC_SCAN_BR_Y;
+ ps->option[SOAP_OPTION_BR_Y].type = SANE_TYPE_FIXED;
+ ps->option[SOAP_OPTION_BR_Y].unit = SANE_UNIT_MM;
+ ps->option[SOAP_OPTION_BR_Y].size = sizeof(SANE_Int);
+ ps->option[SOAP_OPTION_BR_Y].cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT;
+ ps->option[SOAP_OPTION_BR_Y].constraint_type = SANE_CONSTRAINT_RANGE;
+ ps->option[SOAP_OPTION_BR_Y].constraint.range = &ps->bryRange;
+ ps->bryRange.min = 0;
+ ps->bryRange.quant = 0;
+
+ return 0;
+} /* init_options */
+
+/* Verify current x/y extents and set effective extents. */
+static int set_extents(struct soap_session *ps)
+{
+ int stat = 0;
+
+ if ((ps->currentBrx > ps->currentTlx) && (ps->currentBrx - ps->currentTlx >= ps->min_width) && (ps->currentBrx - ps->currentTlx <= ps->tlxRange.max))
+ {
+ ps->effectiveTlx = ps->currentTlx;
+ ps->effectiveBrx = ps->currentBrx;
+ }
+ else
+ {
+ ps->effectiveTlx = 0; /* current setting is not valid, zero it */
+ ps->effectiveBrx = 0;
+ stat = 1;
+ }
+ if ((ps->currentBry > ps->currentTly) && (ps->currentBry - ps->currentTly > ps->min_height) && (ps->currentBry - ps->currentTly <= ps->tlyRange.max))
+ {
+ ps->effectiveTly = ps->currentTly;
+ ps->effectiveBry = ps->currentBry;
+ }
+ else
+ {
+ ps->effectiveTly = 0; /* current setting is not valid, zero it */
+ ps->effectiveBry = 0;
+ stat = 1;
+ }
+ return stat;
+} /* set_extents */
+
+static struct soap_session *create_session()
+{
+ struct soap_session *ps;
+
+ if ((ps = malloc(sizeof(struct soap_session))) == NULL)
+ {
+ BUG("malloc failed: %m\n");
+ return NULL;
+ }
+ memset(ps, 0, sizeof(struct soap_session));
+ ps->tag = "SOAPHT";
+ ps->dd = -1;
+ ps->cd = -1;
+
+ return ps;
+} /* create_session */
+
+/*
+ * SANE APIs.
+ */
+
+SANE_Status soapht_open(SANE_String_Const device, SANE_Handle *handle)
+{
+ struct hpmud_model_attributes ma;
+ int i, stat = SANE_STATUS_IO_ERROR;
+
+ DBG8("sane_hpaio_open(%s)\n", device);
+
+ if (session)
+ {
+ BUG("session in use\n");
+ return SANE_STATUS_DEVICE_BUSY;
+ }
+
+ if ((session = create_session()) == NULL)
+ return SANE_STATUS_NO_MEM;
+
+ /* Set session to specified device. */
+ snprintf(session->uri, sizeof(session->uri)-1, "hp:%s", device); /* prepend "hp:" */
+
+ /* Get actual model attributes from models.dat. */
+ hpmud_query_model(session->uri, &ma);
+ session->scan_type = ma.scantype;
+
+ if (hpmud_open_device(session->uri, ma.mfp_mode, &session->dd) != HPMUD_R_OK)
+ {
+ BUG("unable to open device %s\n", session->uri);
+ goto bugout;
+
+ free(session);
+ session = NULL;
+ return SANE_STATUS_IO_ERROR;
+ }
+
+ if (bb_load(session, "bb_soapht.so"))
+ {
+ stat = SANE_STATUS_IO_ERROR;
+ goto bugout;
+ }
+
+ /* Init sane option descriptors. */
+ init_options(session);
+
+ if (session->bb_open(session))
+ {
+ stat = SANE_STATUS_IO_ERROR;
+ goto bugout;
+ }
+
+ /* Set supported Scan Modes as determined by bb_open. */
+ soapht_control_option(session, SOAP_OPTION_SCAN_MODE, SANE_ACTION_SET_AUTO, NULL, NULL); /* set default option */
+
+ /* Set scan input sources as determined by bb_open. */
+ soapht_control_option(session, SOAP_OPTION_INPUT_SOURCE, SANE_ACTION_SET_AUTO, NULL, NULL); /* set default option */
+
+ /* Set supported resolutions. */
+ soapht_control_option(session, SOAP_OPTION_SCAN_RESOLUTION, SANE_ACTION_SET_AUTO, NULL, NULL); /* set default option */
+
+ /* Set supported contrast. */
+ soapht_control_option(session, SOAP_OPTION_CONTRAST, SANE_ACTION_SET_AUTO, NULL, NULL); /* set default option */
+
+ /* Set supported compression. (Note, cm1017 may say it supports MMR, but it doesn't) */
+ soapht_control_option(session, SOAP_OPTION_COMPRESSION, SANE_ACTION_SET_AUTO, NULL, NULL); /* set default option */
+
+ /* Determine supported jpeg quality factor as determined by bb_open. */
+ soapht_control_option(session, SOAP_OPTION_JPEG_QUALITY, SANE_ACTION_SET_AUTO, NULL, NULL); /* set default option */
+
+ /* Set x,y extents. See bb_open */
+ soapht_control_option(session, SOAP_OPTION_TL_X, SANE_ACTION_SET_AUTO, NULL, NULL); /* set default option */
+ soapht_control_option(session, SOAP_OPTION_TL_Y, SANE_ACTION_SET_AUTO, NULL, NULL); /* set default option */
+ soapht_control_option(session, SOAP_OPTION_BR_X, SANE_ACTION_SET_AUTO, NULL, NULL); /* set default option */
+ soapht_control_option(session, SOAP_OPTION_BR_Y, SANE_ACTION_SET_AUTO, NULL, NULL); /* set default option */
+
+ *handle = (SANE_Handle *)session;
+
+ stat = SANE_STATUS_GOOD;
+
+bugout:
+
+ if (stat != SANE_STATUS_GOOD)
+ {
+ if (session)
+ {
+ bb_unload(session);
+ if (session->dd > 0)
+ hpmud_close_device(session->dd);
+ free(session);
+ session = NULL;
+ }
+ }
+
+ return stat;
+} /* saneht_open */
+
+void soapht_close(SANE_Handle handle)
+{
+ struct soap_session *ps = (struct soap_session *)handle;
+
+ DBG8("sane_hpaio_close()\n");
+
+ if (ps == NULL || ps != session)
+ {
+ BUG("invalid sane_close\n");
+ return;
+ }
+
+ ps->bb_close(ps);
+ bb_unload(ps);
+
+ if (ps->dd > 0)
+ hpmud_close_device(ps->dd);
+
+ free(ps);
+ session = NULL;
+} /* saneht_close */
+
+const SANE_Option_Descriptor *soapht_get_option_descriptor(SANE_Handle handle, SANE_Int option)
+{
+ struct soap_session *ps = (struct soap_session *)handle;
+
+ DBG8("sane_hpaio_get_option_descriptor(option=%s)\n", ps->option[option].name);
+
+ if (option < 0 || option >= SOAP_OPTION_MAX)
+ return NULL;
+
+ return &ps->option[option];
+} /* soapht_get_option_descriptor */
+
+SANE_Status soapht_control_option(SANE_Handle handle, SANE_Int option, SANE_Action action, void *value, SANE_Int *set_result)
+{
+ struct soap_session *ps = (struct soap_session *)handle;
+ SANE_Int *int_value = value, mset_result=0;
+ int i, stat=SANE_STATUS_INVAL;
+ char sz[64];
+
+ switch(option)
+ {
+ case SOAP_OPTION_COUNT:
+ if (action == SANE_ACTION_GET_VALUE)
+ {
+ *int_value = SOAP_OPTION_MAX;
+ stat = SANE_STATUS_GOOD;
+ }
+ break;
+ case SOAP_OPTION_SCAN_MODE:
+ if (action == SANE_ACTION_GET_VALUE)
+ {
+ for (i=0; ps->scanModeList[i]; i++)
+ {
+ if (ps->currentScanMode == ps->scanModeMap[i])
+ {
+ strcpy(value, ps->scanModeList[i]);
+ stat = SANE_STATUS_GOOD;
+ break;
+ }
+ }
+ }
+ else if (action == SANE_ACTION_SET_VALUE)
+ {
+ for (i=0; ps->scanModeList[i]; i++)
+ {
+ if (strcasecmp(ps->scanModeList[i], value) == 0)
+ {
+ ps->currentScanMode = ps->scanModeMap[i];
+ set_scan_mode_side_effects(ps, ps->currentScanMode);
+ mset_result |= SANE_INFO_RELOAD_PARAMS | SANE_INFO_RELOAD_OPTIONS;
+ stat = SANE_STATUS_GOOD;
+ break;
+ }
+ }
+ }
+ else
+ { /* Set default. */
+ ps->currentScanMode = CE_RGB24;
+ set_scan_mode_side_effects(ps, ps->currentScanMode);
+ stat = SANE_STATUS_GOOD;
+ }
+ break;
+ case SOAP_OPTION_INPUT_SOURCE:
+ if (action == SANE_ACTION_GET_VALUE)
+ {
+ for (i=0; ps->inputSourceList[i]; i++)
+ {
+ if (ps->currentInputSource == ps->inputSourceMap[i])
+ {
+ strcpy(value, ps->inputSourceList[i]);
+ stat = SANE_STATUS_GOOD;
+ break;
+ }
+ }
+ }
+ else if (action == SANE_ACTION_SET_VALUE)
+ {
+ for (i=0; ps->inputSourceList[i]; i++)
+ {
+ if (strcasecmp(ps->inputSourceList[i], value) == 0)
+ {
+ ps->currentInputSource = ps->inputSourceMap[i];
+ set_input_source_side_effects(ps, ps->currentInputSource);
+ if(ps->currentInputSource == IS_ADF || ps->currentInputSource == IS_ADF_DUPLEX)
+ {
+ i = ps->adf_resolutionList[0] + 1;
+ while(i--) ps->resolutionList[i] = ps->adf_resolutionList[i];
+ }
+ else //if(ps->currentInputSource == IS_PLATEN)
+ {
+ i = ps->platen_resolutionList[0] + 1;
+ while(i--) ps->resolutionList[i] = ps->platen_resolutionList[i];
+ }
+ mset_result |= SANE_INFO_RELOAD_PARAMS | SANE_INFO_RELOAD_OPTIONS;
+ stat = SANE_STATUS_GOOD;
+ break;
+ }
+ }
+ }
+ else
+ { /* Set default. */
+ ps->currentInputSource = IS_PLATEN;
+ set_input_source_side_effects(ps, ps->currentInputSource);
+ mset_result |= SANE_INFO_RELOAD_PARAMS | SANE_INFO_RELOAD_OPTIONS;
+ stat = SANE_STATUS_GOOD;
+ }
+ break;
+ case SOAP_OPTION_SCAN_RESOLUTION:
+ if (action == SANE_ACTION_GET_VALUE)
+ {
+ *int_value = ps->currentResolution;
+ stat = SANE_STATUS_GOOD;
+ }
+ else if (action == SANE_ACTION_SET_VALUE)
+ {
+ for (i=1; i <= ps->resolutionList[0]; i++)
+ {
+ if (ps->resolutionList[i] == *int_value)
+ {
+ ps->currentResolution = *int_value;
+ mset_result |= SANE_INFO_RELOAD_PARAMS;
+ stat = SANE_STATUS_GOOD;
+ break;
+ }
+ }
+ }
+ else
+ { /* Set default. */
+ ps->currentResolution = 75;
+ stat = SANE_STATUS_GOOD;
+ }
+ break;
+ case SOAP_OPTION_CONTRAST:
+ if (action == SANE_ACTION_GET_VALUE)
+ {
+ *int_value = ps->currentContrast;
+ stat = SANE_STATUS_GOOD;
+ }
+ else if (action == SANE_ACTION_SET_VALUE)
+ {
+ if (*int_value >= SOAP_CONTRAST_MIN && *int_value <= SOAP_CONTRAST_MAX)
+ {
+ ps->currentContrast = *int_value;
+ stat = SANE_STATUS_GOOD;
+ break;
+ }
+ }
+ else
+ { /* Set default. */
+ ps->currentContrast = SOAP_CONTRAST_DEFAULT;
+ stat = SANE_STATUS_GOOD;
+ }
+ break;
+ case SOAP_OPTION_COMPRESSION:
+ if (action == SANE_ACTION_GET_VALUE)
+ {
+ for (i=0; ps->compressionList[i]; i++)
+ {
+ if (ps->currentCompression == ps->compressionMap[i])
+ {
+ strcpy(value, ps->compressionList[i]);
+ stat = SANE_STATUS_GOOD;
+ break;
+ }
+ }
+ }
+ else if (action == SANE_ACTION_SET_VALUE)
+ {
+ for (i=0; ps->compressionList[i]; i++)
+ {
+ if (strcasecmp(ps->compressionList[i], value) == 0)
+ {
+ ps->currentCompression = ps->compressionMap[i];
+ stat = SANE_STATUS_GOOD;
+ break;
+ }
+ }
+ }
+ else
+ { /* Set default. */
+ ps->currentCompression = SF_JFIF;
+ stat = SANE_STATUS_GOOD;
+ }
+ break;
+ case SOAP_OPTION_JPEG_QUALITY:
+ if (action == SANE_ACTION_GET_VALUE)
+ {
+ *int_value = ps->currentJpegQuality;
+ stat = SANE_STATUS_GOOD;
+ }
+ else if (action == SANE_ACTION_SET_VALUE)
+ {
+ if (*int_value >= MIN_JPEG_COMPRESSION_FACTOR && *int_value <= MAX_JPEG_COMPRESSION_FACTOR)
+ {
+ ps->currentJpegQuality = *int_value;
+ stat = SANE_STATUS_GOOD;
+ break;
+ }
+ }
+ else
+ { /* Set default. */
+ ps->currentJpegQuality = SAFER_JPEG_COMPRESSION_FACTOR;
+ stat = SANE_STATUS_GOOD;
+ }
+ break;
+ case SOAP_OPTION_TL_X:
+ if (action == SANE_ACTION_GET_VALUE)
+ {
+ *int_value = ps->currentTlx;
+ stat = SANE_STATUS_GOOD;
+ }
+ else if (action == SANE_ACTION_SET_VALUE)
+ {
+ if (*int_value >= ps->tlxRange.min && *int_value <= ps->tlxRange.max)
+ {
+ ps->currentTlx = *int_value;
+ mset_result |= SANE_INFO_RELOAD_PARAMS;
+ stat = SANE_STATUS_GOOD;
+ break;
+ }
+ }
+ else
+ { /* Set default. */
+ ps->currentTlx = ps->tlxRange.min;
+ stat = SANE_STATUS_GOOD;
+ }
+ break;
+ case SOAP_OPTION_TL_Y:
+ if (action == SANE_ACTION_GET_VALUE)
+ {
+ *int_value = ps->currentTly;
+ stat = SANE_STATUS_GOOD;
+ }
+ else if (action == SANE_ACTION_SET_VALUE)
+ {
+ if (*int_value >= ps->tlyRange.min && *int_value <= ps->tlyRange.max)
+ {
+
+ ps->currentTly = *int_value;
+ mset_result |= SANE_INFO_RELOAD_PARAMS;
+ stat = SANE_STATUS_GOOD;
+ break;
+ }
+ }
+ else
+ { /* Set default. */
+ ps->currentTly = ps->tlyRange.min;
+ stat = SANE_STATUS_GOOD;
+ }
+ break;
+ case SOAP_OPTION_BR_X:
+ if (action == SANE_ACTION_GET_VALUE)
+ {
+ *int_value = ps->currentBrx;
+ stat = SANE_STATUS_GOOD;
+ }
+ else if (action == SANE_ACTION_SET_VALUE)
+ {
+ if (*int_value >= ps->brxRange.min && *int_value <= ps->brxRange.max)
+ {
+ ps->currentBrx = *int_value;
+ mset_result |= SANE_INFO_RELOAD_PARAMS;
+ stat = SANE_STATUS_GOOD;
+ break;
+ }
+ }
+ else
+ { /* Set default. */
+ ps->currentBrx = ps->brxRange.max;
+ stat = SANE_STATUS_GOOD;
+ }
+ break;
+ case SOAP_OPTION_BR_Y:
+ if (action == SANE_ACTION_GET_VALUE)
+ {
+ *int_value = ps->currentBry;
+ stat = SANE_STATUS_GOOD;
+ }
+ else if (action == SANE_ACTION_SET_VALUE)
+ {
+ if (*int_value >= ps->bryRange.min && *int_value <= ps->bryRange.max)
+ {
+ ps->currentBry = *int_value;
+ mset_result |= SANE_INFO_RELOAD_PARAMS;
+ stat = SANE_STATUS_GOOD;
+ break;
+ }
+ }
+ else
+ { /* Set default. */
+ ps->currentBry = ps->bryRange.max;
+ stat = SANE_STATUS_GOOD;
+ }
+ break;
+ default:
+ break;
+ }
+
+ if (set_result)
+ *set_result = mset_result;
+
+ if (stat != SANE_STATUS_GOOD)
+ {
+ BUG("control_option failed: option=%s action=%s\n", ps->option[option].name,
+ action==SANE_ACTION_GET_VALUE ? "get" : action==SANE_ACTION_SET_VALUE ? "set" : "auto");
+ }
+
+ DBG8("sane_hpaio_control_option (option=%s action=%s value=%s)\n", ps->option[option].name,
+ action==SANE_ACTION_GET_VALUE ? "get" : action==SANE_ACTION_SET_VALUE ? "set" : "auto",
+ value ? ps->option[option].type == SANE_TYPE_STRING ? (char *)value : psnprintf(sz, sizeof(sz), "%d", *(int *)value) : "na");
+
+ return stat;
+} /* soapht_control_option */
+
+SANE_Status soapht_get_parameters(SANE_Handle handle, SANE_Parameters *params)
+{
+ struct soap_session *ps = (struct soap_session *)handle;
+
+ set_extents(ps);
+
+ /* Get scan parameters for sane client. */
+ ps->bb_get_parameters(ps, params, ps->ip_handle ? SPO_STARTED : SPO_BEST_GUESS);
+
+ DBG8("sane_hpaio_get_parameters(): format=%d, last_frame=%d, lines=%d, depth=%d, pixels_per_line=%d, bytes_per_line=%d\n",
+ params->format, params->last_frame, params->lines, params->depth, params->pixels_per_line, params->bytes_per_line);
+
+ return SANE_STATUS_GOOD;
+} /* soapht_get_parameters */
+
+SANE_Status soapht_start(SANE_Handle handle)
+{
+ struct soap_session *ps = (struct soap_session *)handle;
+ SANE_Parameters pp;
+ IP_IMAGE_TRAITS traits;
+ IP_XFORM_SPEC xforms[IP_MAX_XFORMS], *pXform=xforms;
+ int stat, ret;
+
+ DBG8("sane_hpaio_start()\n");
+
+ ps -> user_cancel = 0;
+ ps -> cnt = 0;
+ ps -> index = 0;
+
+ if (set_extents(ps))
+ {
+ BUG("invalid extents: tlx=%d brx=%d tly=%d bry=%d minwidth=%d minheight%d maxwidth=%d maxheight=%d\n",
+ ps->currentTlx, ps->currentTly, ps->currentBrx, ps->currentBry, ps->min_width, ps->min_height, ps->tlxRange.max, ps->tlyRange.max);
+ stat = SANE_STATUS_INVAL;
+ goto bugout;
+ }
+
+ /* If input is ADF and ADF is empty, return SANE_STATUS_NO_DOCS. */
+ if (ps->currentInputSource==IS_ADF || ps->currentInputSource==IS_ADF_DUPLEX)
+ {
+ ret = ps->bb_is_paper_in_adf(ps); /* 0 = no paper in adf, 1 = paper in adf, -1 = error */
+ if (ret == 0)
+ {
+ stat = SANE_STATUS_NO_DOCS; /* done scanning */
+ SendScanEvent (ps->uri, EVENT_SCAN_ADF_NO_DOCS);
+ goto bugout;
+ }
+ else if (ret < 0)
+ {
+ stat = SANE_STATUS_IO_ERROR;
+ goto bugout;
+ }
+ }
+
+ /* Start scan and get actual image traits. */
+ if (ps->bb_start_scan(ps))
+ {
+ stat = SANE_STATUS_IO_ERROR;
+ goto bugout;
+ }
+ SendScanEvent(ps->uri, EVENT_START_SCAN_JOB);
+ memset(xforms, 0, sizeof(xforms));
+
+ /* Setup image-processing pipeline for xform. */
+ if (ps->currentScanMode == CE_RGB24 || ps->currentScanMode == CE_GRAY8)
+ {
+ switch(ps->currentCompression)
+ {
+ case SF_JFIF:
+ pXform->aXformInfo[IP_JPG_DECODE_FROM_DENALI].dword = 0; /* 0=no */
+ ADD_XFORM(X_JPG_DECODE);
+ pXform->aXformInfo[IP_CNV_COLOR_SPACE_WHICH_CNV].dword = IP_CNV_YCC_TO_SRGB;
+ pXform->aXformInfo[IP_CNV_COLOR_SPACE_GAMMA].dword = 0x00010000;
+ ADD_XFORM(X_CNV_COLOR_SPACE);
+ break;
+ case SF_HPRAW:
+ default:
+ break;
+ }
+ }
+ else
+ { /* Must be BLACK_AND_WHITE1 (Lineart). */
+ switch(ps->currentCompression)
+ {
+ case SF_JFIF:
+ pXform->aXformInfo[IP_JPG_DECODE_FROM_DENALI].dword = 0; /* 0=no */
+ ADD_XFORM(X_JPG_DECODE);
+ pXform->aXformInfo[IP_GRAY_2_BI_THRESHOLD].dword = 127;
+ ADD_XFORM(X_GRAY_2_BI);
+ break;
+ case SF_HPRAW:
+ pXform->aXformInfo[IP_GRAY_2_BI_THRESHOLD].dword = 127;
+ ADD_XFORM(X_GRAY_2_BI);
+ default:
+ break;
+ }
+ }
+
+ /* Setup x/y cropping for xform. (Actually we let cm1017 do it's own cropping) */
+ pXform->aXformInfo[IP_CROP_LEFT].dword = 0;
+ pXform->aXformInfo[IP_CROP_RIGHT].dword = 0;
+ pXform->aXformInfo[IP_CROP_TOP].dword = 0;
+ pXform->aXformInfo[IP_CROP_MAXOUTROWS].dword = 0;
+ ADD_XFORM(X_CROP);
+
+ /* Setup x/y padding for xform. (Actually we let cm1017 do it's own padding) */
+ pXform->aXformInfo[IP_PAD_LEFT].dword = 0; /* # of pixels to add to left side */
+ pXform->aXformInfo[IP_PAD_RIGHT].dword = 0; /* # of pixels to add to right side */
+ pXform->aXformInfo[IP_PAD_TOP].dword = 0; /* # of rows to add to top */
+ pXform->aXformInfo[IP_PAD_BOTTOM].dword = 0; /* # of rows to add to bottom */
+ pXform->aXformInfo[IP_PAD_VALUE].dword = ps->currentScanMode == CE_BLACK_AND_WHITE1 ? 0 : -1; /* lineart white = 0, rgb white = -1 */
+ pXform->aXformInfo[IP_PAD_MIN_HEIGHT].dword = 0;
+ ADD_XFORM(X_PAD);
+
+ /* Open image processor. */
+ if ((ret = ipOpen(pXform-xforms, xforms, 0, &ps->ip_handle)) != IP_DONE)
+ {
+ BUG("unable open image processor: err=%d\n", ret);
+ stat = SANE_STATUS_INVAL;
+ goto bugout;
+ }
+
+ /* Get scan parameters for image processor. */
+ if (ps->currentCompression == SF_HPRAW)
+ ps->bb_get_parameters(ps, &pp, SPO_STARTED_JR); /* hpraw, use actual parameters */
+ else
+ ps->bb_get_parameters(ps, &pp, SPO_BEST_GUESS); /* jpeg, use best guess */
+ traits.iPixelsPerRow = pp.pixels_per_line;
+ switch(ps->currentScanMode)
+ {
+ case CE_BLACK_AND_WHITE1: /* lineart (let IP create Mono from Gray8) */
+ case CE_GRAY8:
+ traits.iBitsPerPixel = 8; /* grayscale */
+ break;
+ case CE_RGB24:
+ default:
+ traits.iBitsPerPixel = 24; /* color */
+ break;
+ }
+ traits.lHorizDPI = ps->currentResolution << 16;
+ traits.lVertDPI = ps->currentResolution << 16;
+ traits.lNumRows = pp.lines;
+ traits.iNumPages = 1;
+ traits.iPageNum = 1;
+ traits.iComponentsPerPixel = ((traits.iBitsPerPixel % 3) ? 1 : 3);
+ ipSetDefaultInputTraits(ps->ip_handle, &traits);
+
+ /* If jpeg get output image attributes from the image processor. */
+ if (ps->currentCompression == SF_JFIF)
+ {
+ /* Enable parsed header flag. */
+ ipResultMask(ps->ip_handle, IP_PARSED_HEADER);
+
+ /* Wait for image processor to process header so we know the exact size of the image for sane_get_params. */
+ while (1)
+ {
+ ret = get_ip_data(ps, NULL, 0, NULL);
+
+ if (ret & (IP_INPUT_ERROR | IP_FATAL_ERROR | IP_DONE))
+ {
+ BUG("ipConvert error=%x\n", ret);
+ stat = SANE_STATUS_IO_ERROR;
+ goto bugout;
+ }
+
+ if (ret & IP_PARSED_HEADER)
+ {
+ ipGetImageTraits(ps->ip_handle, NULL, &ps->image_traits); /* get valid image traits */
+ ipResultMask(ps->ip_handle, 0); /* disable parsed header flag */
+ break;
+ }
+ }
+ }
+ else
+ ipGetImageTraits(ps->ip_handle, NULL, &ps->image_traits); /* get valid image traits */
+
+ stat = SANE_STATUS_GOOD;
+
+bugout:
+ if (stat != SANE_STATUS_GOOD)
+ {
+ if (ps->ip_handle)
+ {
+ ipClose(ps->ip_handle);
+ ps->ip_handle = 0;
+ }
+ ps->bb_end_scan(ps, stat == SANE_STATUS_IO_ERROR ? 1: 0);
+ }
+
+ return stat;
+} /* soapht_start */
+
+SANE_Status soapht_read(SANE_Handle handle, SANE_Byte *data, SANE_Int maxLength, SANE_Int *length)
+{
+ struct soap_session *ps = (struct soap_session *)handle;
+ int ret, stat=SANE_STATUS_IO_ERROR;
+
+ DBG8("sane_hpaio_read() handle=%p data=%p maxLength=%d\n", (void *)handle, data, maxLength);
+ if(ps->user_cancel)
+ {
+ DBG8("soapht_read() EVENT_SCAN_CANCEL****uri=%s\n", ps->uri);
+ SendScanEvent(ps->uri, EVENT_SCAN_CANCEL);
+ return SANE_STATUS_CANCELLED;
+ }
+
+ ret = get_ip_data(ps, data, maxLength, length);
+
+ if(ret & (IP_INPUT_ERROR | IP_FATAL_ERROR))
+ {
+ BUG("ipConvert error=%x\n", ret);
+ goto bugout;
+ }
+
+ if (ret & IP_DONE)
+ {
+ stat = SANE_STATUS_EOF;
+ SendScanEvent(ps->uri, EVENT_END_SCAN_JOB);
+ }
+ else
+ stat = SANE_STATUS_GOOD;
+
+bugout:
+ if (stat != SANE_STATUS_GOOD)
+ {
+ if (ps->ip_handle)
+ {
+ /* Note always call ipClose when SANE_STATUS_EOF, do not depend on sane_cancel because sane_cancel is only called at the end of a batch job. */
+ ipClose(ps->ip_handle);
+ ps->ip_handle = 0;
+ }
+ ps->bb_end_page(ps, 0);
+ }
+
+ DBG8("-sane_hpaio_read() output=%p bytes_read=%d maxLength=%d status=%d\n", data, *length, maxLength, stat);
+
+ return stat;
+} /* soapht_read */
+
+void soapht_cancel(SANE_Handle handle)
+{
+ struct soap_session *ps = (struct soap_session *)handle;
+
+ DBG8("sane_hpaio_cancel()\n");
+
+ /*
+ * Sane_cancel is always called at the end of the scan job. Note that on a multiple page scan job
+ * sane_cancel is called only once.
+ */
+ ps -> user_cancel = 1;
+ if (ps->ip_handle)
+ {
+ ipClose(ps->ip_handle);
+ ps->ip_handle = 0;
+ }
+ ps->bb_end_scan(ps, 0);
+} /* soapht_cancel */
+
+
+
+
+
diff --git a/scan/sane/soapht.h b/scan/sane/soapht.h
new file mode 100755
index 0000000..c3dae9d
--- /dev/null
+++ b/scan/sane/soapht.h
@@ -0,0 +1,42 @@
+/************************************************************************************\
+
+ soapht.h - HP SANE backend support for soap base multi-function peripherals
+
+ (c) 2006,2008 Copyright Hewlett-Packard Development Company, LP
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+ of the Software, and to permit persons to whom the Software is furnished to do
+ so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+\************************************************************************************/
+
+#ifndef _SOAPHT_H
+#define _SOAPHT_H
+
+#include "sane.h"
+
+SANE_Status soapht_open(SANE_String_Const device, SANE_Handle *handle);
+void soapht_close(SANE_Handle handle);
+const SANE_Option_Descriptor * soapht_get_option_descriptor(SANE_Handle handle, SANE_Int option);
+SANE_Status soapht_control_option(SANE_Handle handle, SANE_Int option, SANE_Action action, void *value, SANE_Int *info);
+SANE_Status soapht_get_parameters(SANE_Handle handle, SANE_Parameters *params);
+SANE_Status soapht_start(SANE_Handle handle);
+SANE_Status soapht_read(SANE_Handle handle, SANE_Byte *data, SANE_Int maxLength, SANE_Int *length);
+void soapht_cancel(SANE_Handle handle);
+
+#endif // _SOAPHT_H
+
+
diff --git a/scan/sane/soaphti.h b/scan/sane/soaphti.h
new file mode 100644
index 0000000..e468c71
--- /dev/null
+++ b/scan/sane/soaphti.h
@@ -0,0 +1,164 @@
+/************************************************************************************\
+
+ soaphti.h - HP SANE backend support for soap based multi-function peripherals
+
+ (c) 2006,2008 Copyright Hewlett-Packard Development Company, LP
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+ of the Software, and to permit persons to whom the Software is furnished to do
+ so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+ Note when the LJM1522 input source is ADF, all pages loaded in the ADF must be scanned
+ as one complete scan job, otherwise the ADF will jam. This mean if you try to scan
+ one page only when multiple pages are loaded, the second page will jam. This is how the
+ hardware works. The Windows driver has the same limitation.
+
+ Author: David Suffield
+
+\************************************************************************************/
+
+#ifndef _SOAPHTI_H
+#define _SOAPHTI_H
+
+#define SOAP_CONTRAST_MIN -127
+#define SOAP_CONTRAST_MAX 127
+#define SOAP_CONTRAST_DEFAULT 0
+
+#define MM_PER_INCH 25.4
+
+enum SOAP_OPTION_NUMBER
+{
+ SOAP_OPTION_COUNT = 0,
+ SOAP_OPTION_GROUP_SCAN_MODE,
+ SOAP_OPTION_SCAN_MODE,
+ SOAP_OPTION_SCAN_RESOLUTION,
+ SOAP_OPTION_INPUT_SOURCE, /* platen, ADF, ADFDuplex */
+ SOAP_OPTION_GROUP_ADVANCED,
+ SOAP_OPTION_CONTRAST,
+ SOAP_OPTION_COMPRESSION,
+ SOAP_OPTION_JPEG_QUALITY,
+ SOAP_OPTION_GROUP_GEOMETRY,
+ SOAP_OPTION_TL_X,
+ SOAP_OPTION_TL_Y,
+ SOAP_OPTION_BR_X,
+ SOAP_OPTION_BR_Y,
+ SOAP_OPTION_MAX
+};
+
+#define MAX_LIST_SIZE 32
+#define MAX_STRING_SIZE 32
+
+enum SCAN_FORMAT
+{
+ SF_HPRAW = 1,
+ SF_JFIF,
+ SF_MAX
+};
+
+enum INPUT_SOURCE
+{
+ IS_PLATEN = 1,
+ IS_ADF,
+ IS_ADF_DUPLEX,
+ IS_MAX
+};
+
+enum COLOR_ENTRY
+{
+ CE_BLACK_AND_WHITE1 = 1, /* Lineart is not supported on Horse Thief (ie: LJM1522). Windows converts GRAY8 to MONO. Ditto for us. */
+ CE_GRAY8,
+ CE_RGB24,
+ CE_RGB48, /* for test only */
+ CE_MAX
+};
+
+enum SCAN_PARAM_OPTION
+{
+ SPO_BEST_GUESS = 0, /* scan not started, return "best guess" scan parameters */
+ SPO_STARTED = 1, /* scan started, return "job resonse" or "image processor" scan parameters */
+ SPO_STARTED_JR = 2, /* scan started, but return "job response" scan parameters only */
+};
+
+struct soap_session
+{
+ char *tag; /* handle identifier */
+ HPMUD_DEVICE dd; /* hpiod device descriptor */
+ HPMUD_CHANNEL cd; /* hpiod soap channel descriptor */
+ char uri[HPMUD_LINE_SIZE];
+ char model[HPMUD_LINE_SIZE];
+ int scan_type;
+
+ IP_IMAGE_TRAITS image_traits; /* specified by image header */
+
+ SANE_Option_Descriptor option[SOAP_OPTION_MAX];
+
+ SANE_String_Const scanModeList[CE_MAX];
+ enum COLOR_ENTRY scanModeMap[CE_MAX];
+ enum COLOR_ENTRY currentScanMode;
+
+ SANE_String_Const inputSourceList[IS_MAX];
+ enum INPUT_SOURCE inputSourceMap[IS_MAX];
+ enum INPUT_SOURCE currentInputSource;
+
+ SANE_Int resolutionList[MAX_LIST_SIZE];
+ SANE_Int currentResolution;
+
+ SANE_Range contrastRange;
+ SANE_Int currentContrast;
+
+ SANE_String_Const compressionList[SF_MAX];
+ enum SCAN_FORMAT compressionMap[SF_MAX];
+ enum SCAN_FORMAT currentCompression;
+
+ SANE_Range jpegQualityRange;
+ SANE_Int currentJpegQuality;
+
+ SANE_Range tlxRange, tlyRange, brxRange, bryRange;
+ SANE_Fixed currentTlx, currentTly, currentBrx, currentBry;
+ SANE_Fixed effectiveTlx, effectiveTly, effectiveBrx, effectiveBry;
+ SANE_Fixed min_width, min_height;
+
+ SANE_Fixed platen_min_width, platen_min_height;
+ SANE_Range platen_tlxRange, platen_tlyRange, platen_brxRange, platen_bryRange;
+ SANE_Int platen_resolutionList[MAX_LIST_SIZE];
+
+ SANE_Fixed adf_min_width, adf_min_height;
+ SANE_Range adf_tlxRange, adf_tlyRange, adf_brxRange, adf_bryRange;
+ SANE_Int adf_resolutionList[MAX_LIST_SIZE];
+
+ IP_HANDLE ip_handle;
+
+ int index; /* dime buffer index */
+ int cnt; /* dime buffer count */
+ unsigned char buf[16384]; /* dime buffer */
+ int user_cancel;
+
+ void *hpmud_handle; /* returned by dlopen */
+ void *math_handle; /* returned by dlopen */
+ void *bb_handle; /* returned by dlopen */
+ void *bb_session;
+ int (*bb_open)(struct soap_session *ps);
+ int (*bb_close)(struct soap_session *ps);
+ int (*bb_get_parameters)(struct soap_session *ps, SANE_Parameters *pp, int scan_started);
+ int (*bb_is_paper_in_adf)(struct soap_session *ps); /* 0 = no paper in adf, 1 = paper in adf, -1 = error */
+ int (*bb_start_scan)(struct soap_session *ps);
+ int (*bb_get_image_data)(struct soap_session *ps, int max_length); /* see cnt and buf above */
+ int (*bb_end_page)(struct soap_session *ps, int io_error);
+ int (*bb_end_scan)(struct soap_session *ps, int io_error);
+/* Add new elements here. */
+};
+
+#endif // _SOAPHTI_H
diff --git a/scan/sane/soapi.h b/scan/sane/soapi.h
new file mode 100644
index 0000000..a6e0585
--- /dev/null
+++ b/scan/sane/soapi.h
@@ -0,0 +1,138 @@
+/************************************************************************************\
+
+ soapi.h - HP SANE backend support for soap based multi-function peripherals
+
+ (c) 2006,2008 Copyright Hewlett-Packard Development Company, LP
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+ of the Software, and to permit persons to whom the Software is furnished to do
+ so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+ Author: David Suffield
+
+\************************************************************************************/
+
+#ifndef _SOAPI_H
+#define _SOAPI_H
+
+#define SOAP_CONTRAST_MIN -127
+#define SOAP_CONTRAST_MAX 127
+#define SOAP_CONTRAST_DEFAULT 0
+
+#define MM_PER_INCH 25.4
+
+enum SOAP_OPTION_NUMBER
+{
+ SOAP_OPTION_COUNT = 0,
+ SOAP_OPTION_GROUP_SCAN_MODE,
+ SOAP_OPTION_SCAN_MODE,
+ SOAP_OPTION_SCAN_RESOLUTION,
+ SOAP_OPTION_GROUP_ADVANCED,
+ SOAP_OPTION_CONTRAST,
+ SOAP_OPTION_COMPRESSION,
+ SOAP_OPTION_JPEG_QUALITY,
+ SOAP_OPTION_GROUP_GEOMETRY,
+ SOAP_OPTION_TL_X,
+ SOAP_OPTION_TL_Y,
+ SOAP_OPTION_BR_X,
+ SOAP_OPTION_BR_Y,
+ SOAP_OPTION_MAX
+};
+
+#define MAX_LIST_SIZE 32
+#define MAX_STRING_SIZE 32
+
+enum SCAN_FORMAT
+{
+ SF_HPRAW = 1,
+ SF_JFIF,
+ SF_MMR,
+ SF_MAX
+};
+
+enum COLOR_ENTRY
+{
+ CE_BLACK_AND_WHITE1 = 1, /* Lineart is not supported on Horse Thief (ie: LJM1522). Windows converts GRAY8 to MONO. Ditto for us. */
+ CE_GRAY8,
+ CE_RGB24,
+ CE_RGB48, /* for test only */
+ CE_MAX
+};
+
+enum SCAN_PARAM_OPTION
+{
+ SPO_BEST_GUESS = 0, /* scan not started, return "best guess" scan parameters */
+ SPO_STARTED = 1, /* scan started, return "job resonse" or "image processor" scan parameters */
+ SPO_STARTED_JR = 2, /* scan started, but return "job response" scan parameters only */
+};
+
+struct soap_session
+{
+ char *tag; /* handle identifier */
+ HPMUD_DEVICE dd; /* hpiod device descriptor */
+ HPMUD_CHANNEL cd; /* hpiod soap channel descriptor */
+ char uri[HPMUD_LINE_SIZE];
+ char model[HPMUD_LINE_SIZE];
+ int scan_type;
+ int user_cancel;
+ IP_IMAGE_TRAITS image_traits; /* specified by image header */
+
+ SANE_Option_Descriptor option[SOAP_OPTION_MAX];
+
+ SANE_String_Const scanModeList[CE_MAX];
+ enum COLOR_ENTRY scanModeMap[CE_MAX];
+ enum COLOR_ENTRY currentScanMode;
+
+ SANE_Int resolutionList[MAX_LIST_SIZE];
+ SANE_Int currentResolution;
+
+ SANE_Range contrastRange;
+ SANE_Int currentContrast;
+
+ SANE_String_Const compressionList[SF_MAX];
+ enum SCAN_FORMAT compressionMap[SF_MAX];
+ enum SCAN_FORMAT currentCompression;
+
+ SANE_Range jpegQualityRange;
+ SANE_Int currentJpegQuality;
+
+ SANE_Range tlxRange, tlyRange, brxRange, bryRange;
+ SANE_Fixed currentTlx, currentTly, currentBrx, currentBry;
+ SANE_Fixed effectiveTlx, effectiveTly, effectiveBrx, effectiveBry;
+ SANE_Fixed min_width, min_height;
+
+ IP_HANDLE ip_handle;
+
+ int index; /* dime buffer index */
+ int cnt; /* dime buffer count */
+ unsigned char buf[16384]; /* dime buffer */
+
+ void *hpmud_handle; /* returned by dlopen */
+ void *math_handle; /* returned by dlopen */
+ void *bb_handle; /* returned by dlopen */
+ void *bb_session;
+ int (*bb_open)(struct soap_session *ps);
+ int (*bb_close)(struct soap_session *ps);
+ int (*bb_get_parameters)(struct soap_session *ps, SANE_Parameters *pp, int scan_started);
+ int (*bb_is_paper_in_adf)(struct soap_session *ps); /* 0 = no paper in adf, 1 = paper in adf, -1 = error */
+ int (*bb_start_scan)(struct soap_session *ps);
+ int (*bb_get_image_data)(struct soap_session *ps, int max_length); /* see cnt and buf above */
+ int (*bb_end_page)(struct soap_session *ps, int io_error);
+ int (*bb_end_scan)(struct soap_session *ps, int io_error);
+/* Add new elements here. */
+};
+
+#endif // _SOAPI_H
diff --git a/scan/sane/tables.h b/scan/sane/tables.h
new file mode 100755
index 0000000..4ae0cf2
--- /dev/null
+++ b/scan/sane/tables.h
@@ -0,0 +1,19481 @@
+/************************************************************************************\
+
+ tables.h - HP SANE backend for multi-function peripherals (libsane-hpaio)
+
+ (c) 2001-2004 Copyright Hewlett-Packard Development Company, LP
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+ of the Software, and to permit persons to whom the Software is furnished to do
+ so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+ Contributing Authors: David Paschal, Don Welch, David Suffield
+
+\************************************************************************************/
+
+/* This file contains various color-correction tables needed for specific
+ * models. */
+
+#if !defined( __TABLES_H__ )
+#define __TABLES_H__
+
+static const char hpTSeriesToneMap[] =
+{
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x01,
+ 0x02,
+ 0x02,
+ 0x04,
+ 0x05,
+ 0x06,
+ 0x07,
+ 0x07,
+ 0x08,
+ 0x09,
+ 0x0A,
+ 0x0B,
+ 0x0C,
+ 0x0D,
+ 0x0E,
+ 0x0F,
+ 0x10,
+ 0x11,
+ 0x11,
+ 0x12,
+ 0x13,
+ 0x14,
+ 0x15,
+ 0x17,
+ 0x18,
+ 0x1A,
+ 0x1B,
+ 0x1C,
+ 0x1C,
+ 0x1D,
+ 0x1E,
+ 0x1F,
+ 0x20,
+ 0x21,
+ 0x22,
+ 0x23,
+ 0x24,
+ 0x25,
+ 0x26,
+ 0x27,
+ 0x28,
+ 0x29,
+ 0x2A,
+ 0x2B,
+ 0x2C,
+ 0x2D,
+ 0x2E,
+ 0x2F,
+ 0x30,
+ 0x31,
+ 0x32,
+ 0x33,
+ 0x34,
+ 0x35,
+ 0x36,
+ 0x37,
+ 0x38,
+ 0x39,
+ 0x3A,
+ 0x3B,
+ 0x3C,
+ 0x3D,
+ 0x3E,
+ 0x3F,
+ 0x40,
+ 0x41,
+ 0x42,
+ 0x43,
+ 0x44,
+ 0x45,
+ 0x46,
+ 0x46,
+ 0x47,
+ 0x48,
+ 0x49,
+ 0x4A,
+ 0x4B,
+ 0x4C,
+ 0x4D,
+ 0x4E,
+ 0x4F,
+ 0x50,
+ 0x51,
+ 0x52,
+ 0x53,
+ 0x54,
+ 0x55,
+ 0x56,
+ 0x57,
+ 0x58,
+ 0x5A,
+ 0x5B,
+ 0x5C,
+ 0x5D,
+ 0x5E,
+ 0x5F,
+ 0x60,
+ 0x61,
+ 0x62,
+ 0x63,
+ 0x64,
+ 0x65,
+ 0x66,
+ 0x67,
+ 0x69,
+ 0x6A,
+ 0x6A,
+ 0x6B,
+ 0x6C,
+ 0x6D,
+ 0x6E,
+ 0x6F,
+ 0x70,
+ 0x71,
+ 0x72,
+ 0x73,
+ 0x74,
+ 0x75,
+ 0x76,
+ 0x77,
+ 0x78,
+ 0x78,
+ 0x79,
+ 0x7A,
+ 0x7B,
+ 0x7C,
+ 0x7D,
+ 0x7E,
+ 0x7F,
+ 0x80,
+ 0x81,
+ 0x82,
+ 0x83,
+ 0x84,
+ 0x85,
+ 0x86,
+ 0x87,
+ 0x88,
+ 0x89,
+ 0x8A,
+ 0x8A,
+ 0x8B,
+ 0x8C,
+ 0x8D,
+ 0x8E,
+ 0x8F,
+ 0x90,
+ 0x91,
+ 0x92,
+ 0x92,
+ 0x93,
+ 0x94,
+ 0x95,
+ 0x96,
+ 0x97,
+ 0x98,
+ 0x99,
+ 0x99,
+ 0x9A,
+ 0x9B,
+ 0x9C,
+ 0x9D,
+ 0x9E,
+ 0x9F,
+ 0xA0,
+ 0xA1,
+ 0xA2,
+ 0xA3,
+ 0xA4,
+ 0xA5,
+ 0xA6,
+ 0xA7,
+ 0xA8,
+ 0xA9,
+ 0xAA,
+ 0xAB,
+ 0xAB,
+ 0xAC,
+ 0xAD,
+ 0xAE,
+ 0xAF,
+ 0xB0,
+ 0xB1,
+ 0xB2,
+ 0xB3,
+ 0xB4,
+ 0xB5,
+ 0xB6,
+ 0xB7,
+ 0xB8,
+ 0xB9,
+ 0xBA,
+ 0xBB,
+ 0xBC,
+ 0xBD,
+ 0xBE,
+ 0xBF,
+ 0xC0,
+ 0xC0,
+ 0xC1,
+ 0xC2,
+ 0xC3,
+ 0xC4,
+ 0xC5,
+ 0xC6,
+ 0xC7,
+ 0xC8,
+ 0xC9,
+ 0xCA,
+ 0xCB,
+ 0xCC,
+ 0xCD,
+ 0xCE,
+ 0xD0,
+ 0xD1,
+ 0xD2,
+ 0xD4,
+ 0xD5,
+ 0xD6,
+ 0xD8,
+ 0xD9,
+ 0xDA,
+ 0xDC,
+ 0xDD,
+ 0xDE,
+ 0xE0,
+ 0xE1,
+ 0xE2,
+ 0xE4,
+ 0xE5,
+ 0xE7,
+ 0xE8,
+ 0xE9,
+ 0xEB,
+ 0xEC,
+ 0xEE,
+ 0xEF,
+ 0xF0,
+ 0xF2,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x01,
+ 0x02,
+ 0x03,
+ 0x04,
+ 0x05,
+ 0x06,
+ 0x07,
+ 0x09,
+ 0x0A,
+ 0x0B,
+ 0x0C,
+ 0x0D,
+ 0x0E,
+ 0x0F,
+ 0x10,
+ 0x11,
+ 0x12,
+ 0x13,
+ 0x14,
+ 0x15,
+ 0x16,
+ 0x17,
+ 0x18,
+ 0x1A,
+ 0x1B,
+ 0x1C,
+ 0x1D,
+ 0x1E,
+ 0x1F,
+ 0x21,
+ 0x22,
+ 0x23,
+ 0x24,
+ 0x25,
+ 0x26,
+ 0x27,
+ 0x28,
+ 0x29,
+ 0x2A,
+ 0x2B,
+ 0x2C,
+ 0x2E,
+ 0x2F,
+ 0x30,
+ 0x31,
+ 0x32,
+ 0x33,
+ 0x34,
+ 0x35,
+ 0x36,
+ 0x37,
+ 0x38,
+ 0x39,
+ 0x3A,
+ 0x3B,
+ 0x3C,
+ 0x3D,
+ 0x3E,
+ 0x3F,
+ 0x41,
+ 0x42,
+ 0x43,
+ 0x44,
+ 0x45,
+ 0x46,
+ 0x47,
+ 0x48,
+ 0x49,
+ 0x4A,
+ 0x4B,
+ 0x4C,
+ 0x4D,
+ 0x4D,
+ 0x4E,
+ 0x4F,
+ 0x50,
+ 0x51,
+ 0x52,
+ 0x53,
+ 0x54,
+ 0x55,
+ 0x56,
+ 0x57,
+ 0x58,
+ 0x59,
+ 0x5A,
+ 0x5B,
+ 0x5D,
+ 0x5E,
+ 0x5F,
+ 0x60,
+ 0x61,
+ 0x62,
+ 0x63,
+ 0x65,
+ 0x66,
+ 0x67,
+ 0x68,
+ 0x69,
+ 0x6A,
+ 0x6B,
+ 0x6C,
+ 0x6D,
+ 0x6E,
+ 0x6F,
+ 0x70,
+ 0x71,
+ 0x72,
+ 0x73,
+ 0x74,
+ 0x75,
+ 0x76,
+ 0x77,
+ 0x78,
+ 0x79,
+ 0x7A,
+ 0x7B,
+ 0x7C,
+ 0x7C,
+ 0x7D,
+ 0x7E,
+ 0x7F,
+ 0x80,
+ 0x81,
+ 0x82,
+ 0x83,
+ 0x84,
+ 0x85,
+ 0x86,
+ 0x86,
+ 0x87,
+ 0x88,
+ 0x89,
+ 0x8A,
+ 0x8B,
+ 0x8C,
+ 0x8D,
+ 0x8E,
+ 0x8F,
+ 0x90,
+ 0x91,
+ 0x92,
+ 0x93,
+ 0x94,
+ 0x95,
+ 0x96,
+ 0x97,
+ 0x98,
+ 0x99,
+ 0x9A,
+ 0x9B,
+ 0x9C,
+ 0x9D,
+ 0x9E,
+ 0x9F,
+ 0xA0,
+ 0xA1,
+ 0xA2,
+ 0xA2,
+ 0xA3,
+ 0xA4,
+ 0xA5,
+ 0xA6,
+ 0xA7,
+ 0xA8,
+ 0xA9,
+ 0xAA,
+ 0xAB,
+ 0xAC,
+ 0xAD,
+ 0xAE,
+ 0xAF,
+ 0xB0,
+ 0xB1,
+ 0xB2,
+ 0xB3,
+ 0xB3,
+ 0xB4,
+ 0xB5,
+ 0xB6,
+ 0xB7,
+ 0xB8,
+ 0xB9,
+ 0xBA,
+ 0xBB,
+ 0xBC,
+ 0xBD,
+ 0xBD,
+ 0xBE,
+ 0xBF,
+ 0xC0,
+ 0xC1,
+ 0xC2,
+ 0xC3,
+ 0xC4,
+ 0xC5,
+ 0xC6,
+ 0xC6,
+ 0xC7,
+ 0xC8,
+ 0xC9,
+ 0xCA,
+ 0xCC,
+ 0xCD,
+ 0xCE,
+ 0xCF,
+ 0xD0,
+ 0xD1,
+ 0xD2,
+ 0xD3,
+ 0xD4,
+ 0xD5,
+ 0xD6,
+ 0xD7,
+ 0xD8,
+ 0xD9,
+ 0xDA,
+ 0xDC,
+ 0xDD,
+ 0xDE,
+ 0xDF,
+ 0xE0,
+ 0xE1,
+ 0xE2,
+ 0xE3,
+ 0xE4,
+ 0xE5,
+ 0xE6,
+ 0xE7,
+ 0xE8,
+ 0xEA,
+ 0xEB,
+ 0xEC,
+ 0xED,
+ 0xEE,
+ 0xEF,
+ 0xF0,
+ 0xF1,
+ 0xF2,
+ 0xF3,
+ 0xF4,
+ 0xF6,
+ 0xF7,
+ 0xF8,
+ 0xF9,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x01,
+ 0x02,
+ 0x03,
+ 0x04,
+ 0x05,
+ 0x06,
+ 0x07,
+ 0x08,
+ 0x09,
+ 0x0A,
+ 0x0C,
+ 0x0D,
+ 0x0E,
+ 0x0F,
+ 0x10,
+ 0x11,
+ 0x11,
+ 0x12,
+ 0x14,
+ 0x15,
+ 0x16,
+ 0x17,
+ 0x18,
+ 0x19,
+ 0x1A,
+ 0x1B,
+ 0x1D,
+ 0x1E,
+ 0x1F,
+ 0x20,
+ 0x21,
+ 0x22,
+ 0x23,
+ 0x24,
+ 0x25,
+ 0x26,
+ 0x27,
+ 0x28,
+ 0x2A,
+ 0x2B,
+ 0x2C,
+ 0x2D,
+ 0x2E,
+ 0x2F,
+ 0x30,
+ 0x31,
+ 0x32,
+ 0x33,
+ 0x35,
+ 0x36,
+ 0x37,
+ 0x38,
+ 0x39,
+ 0x3A,
+ 0x3C,
+ 0x3D,
+ 0x3E,
+ 0x3F,
+ 0x40,
+ 0x41,
+ 0x42,
+ 0x44,
+ 0x45,
+ 0x46,
+ 0x47,
+ 0x48,
+ 0x49,
+ 0x4A,
+ 0x4B,
+ 0x4C,
+ 0x4D,
+ 0x4E,
+ 0x4F,
+ 0x50,
+ 0x51,
+ 0x51,
+ 0x52,
+ 0x54,
+ 0x55,
+ 0x56,
+ 0x57,
+ 0x58,
+ 0x59,
+ 0x5A,
+ 0x5B,
+ 0x5C,
+ 0x5D,
+ 0x5F,
+ 0x60,
+ 0x61,
+ 0x63,
+ 0x64,
+ 0x65,
+ 0x66,
+ 0x68,
+ 0x69,
+ 0x6A,
+ 0x6B,
+ 0x6C,
+ 0x6D,
+ 0x6E,
+ 0x6F,
+ 0x70,
+ 0x71,
+ 0x72,
+ 0x73,
+ 0x74,
+ 0x75,
+ 0x76,
+ 0x77,
+ 0x78,
+ 0x79,
+ 0x7A,
+ 0x7B,
+ 0x7C,
+ 0x7D,
+ 0x7E,
+ 0x7F,
+ 0x80,
+ 0x81,
+ 0x82,
+ 0x83,
+ 0x84,
+ 0x85,
+ 0x86,
+ 0x87,
+ 0x88,
+ 0x89,
+ 0x8A,
+ 0x8B,
+ 0x8C,
+ 0x8D,
+ 0x8E,
+ 0x8F,
+ 0x90,
+ 0x92,
+ 0x93,
+ 0x94,
+ 0x95,
+ 0x96,
+ 0x97,
+ 0x98,
+ 0x99,
+ 0x9A,
+ 0x9B,
+ 0x9C,
+ 0x9E,
+ 0x9F,
+ 0xA0,
+ 0xA1,
+ 0xA2,
+ 0xA3,
+ 0xA4,
+ 0xA5,
+ 0xA6,
+ 0xA7,
+ 0xA8,
+ 0xA9,
+ 0xAB,
+ 0xAC,
+ 0xAD,
+ 0xAE,
+ 0xAF,
+ 0xB0,
+ 0xB1,
+ 0xB2,
+ 0xB3,
+ 0xB4,
+ 0xB6,
+ 0xB7,
+ 0xB7,
+ 0xB8,
+ 0xB8,
+ 0xB8,
+ 0xB9,
+ 0xBA,
+ 0xBB,
+ 0xBC,
+ 0xBD,
+ 0xBE,
+ 0xBF,
+ 0xC0,
+ 0xC1,
+ 0xC2,
+ 0xC3,
+ 0xC4,
+ 0xC5,
+ 0xC6,
+ 0xC7,
+ 0xC8,
+ 0xC9,
+ 0xCA,
+ 0xCB,
+ 0xCC,
+ 0xCD,
+ 0xCE,
+ 0xCF,
+ 0xD0,
+ 0xD1,
+ 0xD2,
+ 0xD3,
+ 0xD4,
+ 0xD5,
+ 0xD6,
+ 0xD7,
+ 0xD8,
+ 0xD9,
+ 0xDA,
+ 0xDB,
+ 0xDC,
+ 0xDD,
+ 0xDE,
+ 0xDF,
+ 0xE0,
+ 0xE1,
+ 0xE2,
+ 0xE3,
+ 0xE4,
+ 0xE5,
+ 0xE6,
+ 0xE7,
+ 0xE8,
+ 0xE9,
+ 0xEA,
+ 0xEB,
+ 0xEC,
+ 0xED,
+ 0xEE,
+ 0xEF,
+ 0xF0,
+ 0xF1,
+ 0xF2,
+ 0xF3,
+ 0xF4,
+ 0xF5,
+ 0xF6,
+ 0xF7,
+ 0xF8,
+ 0xF9,
+ 0xFA,
+ 0xFB,
+ 0xFC,
+ 0xFD,
+ 0xFE,
+ 0xFF
+};
+
+static const unsigned char hp11xxSeriesGammaTable[256] =
+{
+ 0,
+ 6,
+ 12,
+ 17,
+ 21,
+ 25,
+ 29,
+ 33,
+ 36,
+ 39,
+ 44,
+ 47,
+ 50,
+ 53,
+ 56,
+ 59,
+ 61,
+ 64,
+ 67,
+ 70,
+ 72,
+ 75,
+ 77,
+ 80,
+ 82,
+ 85,
+ 87,
+ 89,
+ 92,
+ 94,
+ 96,
+ 99,
+ 101,
+ 102,
+ 104,
+ 105,
+ 106,
+ 108,
+ 109,
+ 110,
+ 111,
+ 113,
+ 114,
+ 115,
+ 116,
+ 117,
+ 118,
+ 120,
+ 121,
+ 122,
+ 123,
+ 124,
+ 125,
+ 126,
+ 127,
+ 129,
+ 130,
+ 131,
+ 132,
+ 133,
+ 134,
+ 135,
+ 136,
+ 137,
+ 138,
+ 139,
+ 140,
+ 141,
+ 142,
+ 143,
+ 144,
+ 144,
+ 145,
+ 146,
+ 147,
+ 148,
+ 149,
+ 149,
+ 150,
+ 151,
+ 152,
+ 153,
+ 153,
+ 154,
+ 155,
+ 156,
+ 156,
+ 157,
+ 158,
+ 159,
+ 159,
+ 160,
+ 161,
+ 162,
+ 162,
+ 163,
+ 164,
+ 165,
+ 165,
+ 166,
+ 167,
+ 167,
+ 168,
+ 169,
+ 170,
+ 170,
+ 171,
+ 172,
+ 172,
+ 173,
+ 174,
+ 174,
+ 175,
+ 176,
+ 176,
+ 177,
+ 178,
+ 178,
+ 179,
+ 180,
+ 180,
+ 181,
+ 182,
+ 182,
+ 183,
+ 183,
+ 184,
+ 185,
+ 185,
+ 186,
+ 187,
+ 187,
+ 188,
+ 189,
+ 189,
+ 190,
+ 191,
+ 191,
+ 192,
+ 192,
+ 193,
+ 194,
+ 194,
+ 195,
+ 196,
+ 196,
+ 197,
+ 197,
+ 198,
+ 199,
+ 199,
+ 200,
+ 200,
+ 201,
+ 202,
+ 202,
+ 203,
+ 203,
+ 204,
+ 205,
+ 205,
+ 206,
+ 206,
+ 207,
+ 208,
+ 208,
+ 209,
+ 209,
+ 210,
+ 210,
+ 211,
+ 212,
+ 212,
+ 214,
+ 214,
+ 215,
+ 215,
+ 216,
+ 217,
+ 217,
+ 218,
+ 218,
+ 219,
+ 219,
+ 220,
+ 220,
+ 221,
+ 221,
+ 222,
+ 222,
+ 223,
+ 224,
+ 224,
+ 225,
+ 225,
+ 226,
+ 226,
+ 227,
+ 227,
+ 228,
+ 228,
+ 229,
+ 229,
+ 230,
+ 230,
+ 231,
+ 231,
+ 232,
+ 232,
+ 233,
+ 233,
+ 234,
+ 234,
+ 235,
+ 235,
+ 236,
+ 236,
+ 237,
+ 237,
+ 238,
+ 238,
+ 239,
+ 239,
+ 240,
+ 240,
+ 241,
+ 241,
+ 242,
+ 242,
+ 243,
+ 243,
+ 244,
+ 244,
+ 245,
+ 245,
+ 246,
+ 246,
+ 247,
+ 247,
+ 248,
+ 248,
+ 249,
+ 249,
+ 249,
+ 250,
+ 250,
+ 251,
+ 251,
+ 252,
+ 252,
+ 253,
+ 253,
+ 254,
+ 254,
+ 255,
+ 255
+};
+
+static const char hp11xxSeriesColorMap[] =
+{
+ 0,
+ 0,
+ 0,
+ 1,
+ 1,
+ 1,
+ 3,
+ 3,
+ 3,
+ 7,
+ 7,
+ 7,
+ 11,
+ 11,
+ 11,
+ 19,
+ 19,
+ 19,
+ 29,
+ 29,
+ 29,
+ 40,
+ 40,
+ 40,
+ 57,
+ 57,
+ 57,
+ 84,
+ 84,
+ 84,
+ 110,
+ 110,
+ 110,
+ 132,
+ 132,
+ 132,
+ 155,
+ 155,
+ 155,
+ 195,
+ 195,
+ 195,
+ 225,
+ 225,
+ 225,
+ 255,
+ 255,
+ 255,
+ 255,
+ 255,
+ 255,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 1,
+ 0,
+ 1,
+ 2,
+ 0,
+ 1,
+ 2,
+ 0,
+ 1,
+ 3,
+ 0,
+ 2,
+ 5,
+ 0,
+ 2,
+ 8,
+ 0,
+ 3,
+ 15,
+ 0,
+ 5,
+ 25,
+ 0,
+ 8,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 2,
+ 0,
+ 0,
+ 3,
+ 0,
+ 1,
+ 4,
+ 0,
+ 1,
+ 6,
+ 0,
+ 1,
+ 9,
+ 0,
+ 1,
+ 17,
+ 0,
+ 1,
+ 29,
+ 0,
+ 2,
+ 0,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 2,
+ 0,
+ 0,
+ 2,
+ 0,
+ 0,
+ 3,
+ 0,
+ 0,
+ 4,
+ 0,
+ 0,
+ 6,
+ 0,
+ 0,
+ 9,
+ 0,
+ 0,
+ 18,
+ 0,
+ 0,
+ 30,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 2,
+ 0,
+ 0,
+ 2,
+ 0,
+ 0,
+ 3,
+ 0,
+ 0,
+ 4,
+ 0,
+ 0,
+ 7,
+ 0,
+ 0,
+ 9,
+ 0,
+ 0,
+ 17,
+ 0,
+ 0,
+ 28,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 2,
+ 0,
+ 0,
+ 2,
+ 0,
+ 0,
+ 3,
+ 0,
+ 0,
+ 4,
+ 0,
+ 0,
+ 6,
+ 0,
+ 0,
+ 8,
+ 0,
+ 0,
+ 14,
+ 0,
+ 0,
+ 22,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 2,
+ 0,
+ 0,
+ 3,
+ 0,
+ 0,
+ 4,
+ 0,
+ 0,
+ 5,
+ 0,
+ 0,
+ 7,
+ 0,
+ 0,
+ 11,
+ 0,
+ 0,
+ 15,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 2,
+ 0,
+ 0,
+ 2,
+ 0,
+ 0,
+ 3,
+ 0,
+ 0,
+ 5,
+ 0,
+ 0,
+ 6,
+ 0,
+ 0,
+ 9,
+ 0,
+ 0,
+ 12,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 2,
+ 0,
+ 0,
+ 3,
+ 0,
+ 0,
+ 4,
+ 0,
+ 0,
+ 5,
+ 0,
+ 0,
+ 8,
+ 0,
+ 0,
+ 10,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 2,
+ 0,
+ 0,
+ 3,
+ 0,
+ 0,
+ 4,
+ 0,
+ 0,
+ 6,
+ 0,
+ 0,
+ 8,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1,
+ 1,
+ 0,
+ 1,
+ 1,
+ 0,
+ 2,
+ 1,
+ 0,
+ 3,
+ 1,
+ 0,
+ 5,
+ 1,
+ 0,
+ 6,
+ 1,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 1,
+ 0,
+ 1,
+ 1,
+ 0,
+ 1,
+ 1,
+ 0,
+ 3,
+ 2,
+ 0,
+ 4,
+ 2,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 2,
+ 0,
+ 0,
+ 2,
+ 0,
+ 0,
+ 3,
+ 0,
+ 1,
+ 4,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 2,
+ 0,
+ 0,
+ 2,
+ 0,
+ 0,
+ 3,
+ 0,
+ 0,
+ 4,
+ 0,
+ 0,
+ 5,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 2,
+ 0,
+ 0,
+ 3,
+ 0,
+ 0,
+ 3,
+ 0,
+ 0,
+ 5,
+ 0,
+ 0,
+ 7,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 2,
+ 0,
+ 0,
+ 3,
+ 0,
+ 0,
+ 4,
+ 0,
+ 0,
+ 6,
+ 0,
+ 0,
+ 8,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 2,
+ 0,
+ 0,
+ 2,
+ 0,
+ 0,
+ 3,
+ 0,
+ 0,
+ 4,
+ 0,
+ 0,
+ 6,
+ 0,
+ 0,
+ 8,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 2,
+ 0,
+ 0,
+ 2,
+ 0,
+ 0,
+ 3,
+ 0,
+ 0,
+ 4,
+ 0,
+ 0,
+ 6,
+ 0,
+ 0,
+ 8,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 1,
+ 1,
+ 0,
+ 2,
+ 1,
+ 0,
+ 3,
+ 1,
+ 0,
+ 4,
+ 1,
+ 0,
+ 6,
+ 1,
+ 0,
+ 8,
+ 1,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 1,
+ 0,
+ 1,
+ 1,
+ 0,
+ 1,
+ 2,
+ 0,
+ 1,
+ 2,
+ 0,
+ 2,
+ 3,
+ 0,
+ 2,
+ 5,
+ 0,
+ 3,
+ 5,
+ 0,
+ 5,
+ 8,
+ 0,
+ 7,
+ 12,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 2,
+ 0,
+ 0,
+ 2,
+ 0,
+ 1,
+ 3,
+ 0,
+ 1,
+ 5,
+ 0,
+ 2,
+ 8,
+ 0,
+ 3,
+ 10,
+ 0,
+ 5,
+ 17,
+ 0,
+ 6,
+ 27,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 2,
+ 0,
+ 0,
+ 3,
+ 0,
+ 0,
+ 4,
+ 0,
+ 1,
+ 6,
+ 0,
+ 1,
+ 12,
+ 0,
+ 2,
+ 19,
+ 0,
+ 3,
+ 37,
+ 0,
+ 3,
+ 63,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 2,
+ 0,
+ 0,
+ 3,
+ 0,
+ 0,
+ 5,
+ 0,
+ 0,
+ 7,
+ 0,
+ 0,
+ 14,
+ 0,
+ 0,
+ 24,
+ 0,
+ 0,
+ 56,
+ 0,
+ 0,
+ 106,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 2,
+ 0,
+ 0,
+ 3,
+ 0,
+ 0,
+ 5,
+ 0,
+ 0,
+ 7,
+ 0,
+ 0,
+ 14,
+ 0,
+ 0,
+ 26,
+ 0,
+ 0,
+ 64,
+ 0,
+ 0,
+ 126,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 2,
+ 0,
+ 0,
+ 3,
+ 0,
+ 0,
+ 4,
+ 0,
+ 0,
+ 7,
+ 0,
+ 0,
+ 13,
+ 0,
+ 0,
+ 24,
+ 0,
+ 0,
+ 60,
+ 0,
+ 0,
+ 121,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 2,
+ 0,
+ 0,
+ 2,
+ 0,
+ 0,
+ 4,
+ 0,
+ 0,
+ 6,
+ 0,
+ 0,
+ 12,
+ 0,
+ 0,
+ 21,
+ 0,
+ 0,
+ 50,
+ 0,
+ 0,
+ 98,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 2,
+ 1,
+ 0,
+ 2,
+ 1,
+ 0,
+ 3,
+ 1,
+ 0,
+ 5,
+ 1,
+ 0,
+ 10,
+ 0,
+ 0,
+ 16,
+ 0,
+ 0,
+ 39,
+ 0,
+ 0,
+ 70,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 1,
+ 1,
+ 0,
+ 1,
+ 1,
+ 0,
+ 2,
+ 1,
+ 0,
+ 3,
+ 1,
+ 0,
+ 4,
+ 2,
+ 0,
+ 8,
+ 2,
+ 0,
+ 13,
+ 1,
+ 0,
+ 28,
+ 0,
+ 0,
+ 53,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1,
+ 1,
+ 0,
+ 1,
+ 1,
+ 0,
+ 1,
+ 1,
+ 0,
+ 2,
+ 1,
+ 0,
+ 3,
+ 2,
+ 0,
+ 4,
+ 3,
+ 0,
+ 6,
+ 3,
+ 0,
+ 10,
+ 5,
+ 0,
+ 21,
+ 7,
+ 0,
+ 39,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 1,
+ 0,
+ 1,
+ 1,
+ 0,
+ 1,
+ 1,
+ 0,
+ 1,
+ 2,
+ 0,
+ 2,
+ 2,
+ 0,
+ 3,
+ 3,
+ 0,
+ 5,
+ 5,
+ 0,
+ 8,
+ 8,
+ 0,
+ 16,
+ 14,
+ 0,
+ 27,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 1,
+ 0,
+ 1,
+ 1,
+ 0,
+ 1,
+ 1,
+ 0,
+ 1,
+ 2,
+ 0,
+ 2,
+ 3,
+ 0,
+ 2,
+ 4,
+ 0,
+ 4,
+ 6,
+ 0,
+ 5,
+ 12,
+ 0,
+ 10,
+ 20,
+ 0,
+ 17,
+ 1,
+ 1,
+ 1,
+ 2,
+ 2,
+ 2,
+ 2,
+ 1,
+ 2,
+ 3,
+ 1,
+ 2,
+ 3,
+ 1,
+ 2,
+ 3,
+ 1,
+ 3,
+ 4,
+ 0,
+ 3,
+ 6,
+ 0,
+ 3,
+ 9,
+ 0,
+ 4,
+ 12,
+ 0,
+ 6,
+ 22,
+ 0,
+ 9,
+ 35,
+ 0,
+ 14,
+ 1,
+ 1,
+ 1,
+ 2,
+ 2,
+ 2,
+ 2,
+ 1,
+ 2,
+ 3,
+ 1,
+ 2,
+ 3,
+ 1,
+ 2,
+ 4,
+ 1,
+ 2,
+ 5,
+ 0,
+ 2,
+ 6,
+ 0,
+ 2,
+ 10,
+ 0,
+ 2,
+ 14,
+ 0,
+ 3,
+ 25,
+ 0,
+ 3,
+ 41,
+ 0,
+ 4,
+ 1,
+ 1,
+ 1,
+ 2,
+ 2,
+ 2,
+ 3,
+ 1,
+ 2,
+ 3,
+ 1,
+ 2,
+ 3,
+ 1,
+ 2,
+ 4,
+ 1,
+ 2,
+ 5,
+ 0,
+ 2,
+ 7,
+ 0,
+ 1,
+ 10,
+ 0,
+ 1,
+ 14,
+ 0,
+ 0,
+ 26,
+ 0,
+ 0,
+ 42,
+ 0,
+ 0,
+ 1,
+ 1,
+ 1,
+ 2,
+ 2,
+ 1,
+ 3,
+ 1,
+ 1,
+ 3,
+ 1,
+ 1,
+ 3,
+ 1,
+ 1,
+ 4,
+ 1,
+ 1,
+ 5,
+ 0,
+ 0,
+ 7,
+ 0,
+ 0,
+ 10,
+ 0,
+ 0,
+ 14,
+ 0,
+ 0,
+ 24,
+ 0,
+ 0,
+ 38,
+ 0,
+ 0,
+ 1,
+ 1,
+ 1,
+ 2,
+ 2,
+ 1,
+ 3,
+ 2,
+ 1,
+ 3,
+ 1,
+ 1,
+ 3,
+ 1,
+ 1,
+ 4,
+ 1,
+ 0,
+ 5,
+ 1,
+ 0,
+ 6,
+ 0,
+ 0,
+ 9,
+ 0,
+ 0,
+ 12,
+ 0,
+ 0,
+ 20,
+ 0,
+ 0,
+ 30,
+ 0,
+ 0,
+ 1,
+ 1,
+ 1,
+ 2,
+ 2,
+ 1,
+ 2,
+ 2,
+ 1,
+ 3,
+ 2,
+ 1,
+ 3,
+ 1,
+ 0,
+ 4,
+ 1,
+ 0,
+ 5,
+ 1,
+ 0,
+ 6,
+ 1,
+ 0,
+ 8,
+ 0,
+ 0,
+ 10,
+ 0,
+ 0,
+ 15,
+ 0,
+ 0,
+ 20,
+ 0,
+ 0,
+ 1,
+ 1,
+ 1,
+ 2,
+ 2,
+ 1,
+ 2,
+ 2,
+ 1,
+ 2,
+ 2,
+ 0,
+ 3,
+ 2,
+ 0,
+ 3,
+ 1,
+ 0,
+ 4,
+ 1,
+ 0,
+ 5,
+ 1,
+ 0,
+ 7,
+ 1,
+ 0,
+ 8,
+ 1,
+ 0,
+ 11,
+ 0,
+ 0,
+ 15,
+ 0,
+ 0,
+ 1,
+ 1,
+ 1,
+ 2,
+ 2,
+ 1,
+ 2,
+ 2,
+ 1,
+ 2,
+ 2,
+ 0,
+ 3,
+ 2,
+ 0,
+ 3,
+ 2,
+ 0,
+ 4,
+ 2,
+ 0,
+ 4,
+ 1,
+ 0,
+ 6,
+ 1,
+ 0,
+ 7,
+ 1,
+ 0,
+ 9,
+ 1,
+ 0,
+ 12,
+ 1,
+ 0,
+ 1,
+ 1,
+ 1,
+ 2,
+ 2,
+ 1,
+ 2,
+ 2,
+ 1,
+ 2,
+ 2,
+ 0,
+ 2,
+ 2,
+ 0,
+ 2,
+ 2,
+ 0,
+ 3,
+ 2,
+ 0,
+ 4,
+ 2,
+ 0,
+ 5,
+ 2,
+ 0,
+ 6,
+ 2,
+ 0,
+ 8,
+ 2,
+ 0,
+ 10,
+ 2,
+ 0,
+ 1,
+ 1,
+ 1,
+ 2,
+ 2,
+ 1,
+ 2,
+ 2,
+ 1,
+ 2,
+ 2,
+ 0,
+ 2,
+ 2,
+ 0,
+ 2,
+ 2,
+ 0,
+ 2,
+ 2,
+ 0,
+ 3,
+ 2,
+ 0,
+ 4,
+ 2,
+ 0,
+ 5,
+ 2,
+ 0,
+ 6,
+ 3,
+ 0,
+ 8,
+ 3,
+ 0,
+ 1,
+ 1,
+ 1,
+ 2,
+ 2,
+ 1,
+ 2,
+ 2,
+ 1,
+ 2,
+ 2,
+ 1,
+ 2,
+ 2,
+ 0,
+ 2,
+ 2,
+ 0,
+ 2,
+ 3,
+ 0,
+ 2,
+ 3,
+ 0,
+ 2,
+ 3,
+ 0,
+ 3,
+ 3,
+ 0,
+ 4,
+ 4,
+ 0,
+ 6,
+ 4,
+ 0,
+ 1,
+ 1,
+ 1,
+ 2,
+ 2,
+ 1,
+ 2,
+ 2,
+ 1,
+ 2,
+ 2,
+ 1,
+ 1,
+ 2,
+ 0,
+ 1,
+ 2,
+ 0,
+ 1,
+ 3,
+ 0,
+ 1,
+ 3,
+ 0,
+ 1,
+ 4,
+ 0,
+ 2,
+ 4,
+ 0,
+ 2,
+ 5,
+ 0,
+ 3,
+ 5,
+ 0,
+ 1,
+ 1,
+ 1,
+ 2,
+ 2,
+ 1,
+ 1,
+ 2,
+ 1,
+ 1,
+ 2,
+ 1,
+ 1,
+ 2,
+ 0,
+ 1,
+ 3,
+ 0,
+ 1,
+ 3,
+ 0,
+ 0,
+ 3,
+ 0,
+ 0,
+ 4,
+ 0,
+ 0,
+ 5,
+ 0,
+ 0,
+ 6,
+ 0,
+ 0,
+ 7,
+ 0,
+ 1,
+ 1,
+ 1,
+ 1,
+ 2,
+ 1,
+ 1,
+ 2,
+ 1,
+ 1,
+ 2,
+ 1,
+ 1,
+ 2,
+ 1,
+ 1,
+ 3,
+ 0,
+ 0,
+ 3,
+ 0,
+ 0,
+ 4,
+ 0,
+ 0,
+ 4,
+ 0,
+ 0,
+ 5,
+ 0,
+ 0,
+ 7,
+ 0,
+ 0,
+ 9,
+ 0,
+ 1,
+ 1,
+ 1,
+ 1,
+ 2,
+ 1,
+ 1,
+ 2,
+ 1,
+ 1,
+ 2,
+ 1,
+ 1,
+ 2,
+ 1,
+ 0,
+ 3,
+ 0,
+ 0,
+ 3,
+ 0,
+ 0,
+ 4,
+ 0,
+ 0,
+ 5,
+ 0,
+ 0,
+ 6,
+ 0,
+ 0,
+ 7,
+ 0,
+ 0,
+ 9,
+ 0,
+ 1,
+ 1,
+ 1,
+ 1,
+ 2,
+ 2,
+ 1,
+ 2,
+ 1,
+ 1,
+ 2,
+ 1,
+ 0,
+ 3,
+ 1,
+ 0,
+ 3,
+ 1,
+ 0,
+ 3,
+ 1,
+ 0,
+ 4,
+ 1,
+ 0,
+ 5,
+ 0,
+ 0,
+ 6,
+ 0,
+ 0,
+ 8,
+ 0,
+ 0,
+ 10,
+ 0,
+ 1,
+ 1,
+ 1,
+ 1,
+ 2,
+ 2,
+ 1,
+ 2,
+ 2,
+ 1,
+ 2,
+ 2,
+ 0,
+ 3,
+ 2,
+ 0,
+ 3,
+ 2,
+ 0,
+ 3,
+ 2,
+ 0,
+ 4,
+ 1,
+ 0,
+ 5,
+ 1,
+ 0,
+ 6,
+ 1,
+ 0,
+ 8,
+ 0,
+ 0,
+ 10,
+ 0,
+ 1,
+ 1,
+ 1,
+ 1,
+ 2,
+ 2,
+ 1,
+ 2,
+ 2,
+ 1,
+ 2,
+ 2,
+ 0,
+ 3,
+ 2,
+ 0,
+ 3,
+ 2,
+ 0,
+ 3,
+ 2,
+ 0,
+ 4,
+ 2,
+ 0,
+ 5,
+ 2,
+ 0,
+ 6,
+ 2,
+ 0,
+ 8,
+ 2,
+ 0,
+ 10,
+ 3,
+ 1,
+ 1,
+ 1,
+ 1,
+ 2,
+ 2,
+ 1,
+ 2,
+ 2,
+ 1,
+ 2,
+ 3,
+ 0,
+ 2,
+ 3,
+ 0,
+ 2,
+ 4,
+ 0,
+ 3,
+ 5,
+ 0,
+ 3,
+ 6,
+ 0,
+ 4,
+ 7,
+ 0,
+ 5,
+ 8,
+ 0,
+ 7,
+ 13,
+ 0,
+ 9,
+ 19,
+ 1,
+ 1,
+ 1,
+ 1,
+ 2,
+ 2,
+ 1,
+ 2,
+ 3,
+ 1,
+ 2,
+ 3,
+ 0,
+ 2,
+ 4,
+ 0,
+ 2,
+ 4,
+ 0,
+ 3,
+ 6,
+ 0,
+ 3,
+ 8,
+ 0,
+ 4,
+ 11,
+ 0,
+ 5,
+ 14,
+ 0,
+ 6,
+ 24,
+ 0,
+ 8,
+ 38,
+ 1,
+ 1,
+ 1,
+ 1,
+ 2,
+ 2,
+ 1,
+ 2,
+ 3,
+ 1,
+ 2,
+ 3,
+ 1,
+ 2,
+ 4,
+ 0,
+ 2,
+ 5,
+ 0,
+ 2,
+ 7,
+ 0,
+ 2,
+ 10,
+ 0,
+ 3,
+ 18,
+ 0,
+ 3,
+ 25,
+ 0,
+ 4,
+ 48,
+ 0,
+ 5,
+ 79,
+ 1,
+ 1,
+ 1,
+ 2,
+ 2,
+ 2,
+ 1,
+ 2,
+ 3,
+ 1,
+ 2,
+ 3,
+ 1,
+ 2,
+ 4,
+ 1,
+ 2,
+ 5,
+ 0,
+ 2,
+ 8,
+ 0,
+ 2,
+ 12,
+ 0,
+ 2,
+ 21,
+ 0,
+ 2,
+ 34,
+ 0,
+ 2,
+ 72,
+ 0,
+ 1,
+ 130,
+ 1,
+ 1,
+ 1,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 3,
+ 2,
+ 2,
+ 3,
+ 1,
+ 2,
+ 4,
+ 1,
+ 1,
+ 5,
+ 0,
+ 1,
+ 8,
+ 0,
+ 1,
+ 12,
+ 0,
+ 1,
+ 22,
+ 0,
+ 1,
+ 36,
+ 0,
+ 0,
+ 82,
+ 0,
+ 0,
+ 154,
+ 1,
+ 1,
+ 1,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 3,
+ 2,
+ 2,
+ 3,
+ 2,
+ 1,
+ 4,
+ 2,
+ 1,
+ 5,
+ 1,
+ 1,
+ 8,
+ 0,
+ 1,
+ 11,
+ 0,
+ 0,
+ 20,
+ 0,
+ 0,
+ 34,
+ 0,
+ 0,
+ 78,
+ 0,
+ 0,
+ 149,
+ 1,
+ 1,
+ 1,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 3,
+ 2,
+ 1,
+ 3,
+ 2,
+ 1,
+ 4,
+ 2,
+ 1,
+ 5,
+ 2,
+ 1,
+ 7,
+ 1,
+ 1,
+ 10,
+ 0,
+ 0,
+ 18,
+ 0,
+ 0,
+ 29,
+ 0,
+ 0,
+ 67,
+ 0,
+ 0,
+ 136,
+ 1,
+ 1,
+ 1,
+ 2,
+ 2,
+ 2,
+ 2,
+ 1,
+ 3,
+ 2,
+ 1,
+ 3,
+ 2,
+ 1,
+ 4,
+ 2,
+ 1,
+ 4,
+ 2,
+ 1,
+ 6,
+ 2,
+ 0,
+ 9,
+ 2,
+ 0,
+ 15,
+ 1,
+ 0,
+ 24,
+ 0,
+ 0,
+ 50,
+ 0,
+ 0,
+ 90,
+ 1,
+ 1,
+ 1,
+ 2,
+ 2,
+ 2,
+ 2,
+ 1,
+ 2,
+ 2,
+ 1,
+ 3,
+ 2,
+ 1,
+ 3,
+ 2,
+ 1,
+ 4,
+ 3,
+ 1,
+ 6,
+ 3,
+ 0,
+ 8,
+ 4,
+ 0,
+ 13,
+ 4,
+ 0,
+ 19,
+ 4,
+ 0,
+ 39,
+ 3,
+ 0,
+ 69,
+ 1,
+ 1,
+ 1,
+ 2,
+ 2,
+ 2,
+ 2,
+ 1,
+ 2,
+ 2,
+ 1,
+ 3,
+ 3,
+ 1,
+ 3,
+ 3,
+ 1,
+ 4,
+ 3,
+ 0,
+ 5,
+ 4,
+ 0,
+ 7,
+ 5,
+ 0,
+ 11,
+ 6,
+ 0,
+ 16,
+ 9,
+ 0,
+ 30,
+ 13,
+ 0,
+ 52,
+ 1,
+ 1,
+ 1,
+ 2,
+ 2,
+ 2,
+ 2,
+ 1,
+ 2,
+ 2,
+ 1,
+ 2,
+ 3,
+ 1,
+ 3,
+ 3,
+ 1,
+ 3,
+ 4,
+ 0,
+ 5,
+ 4,
+ 0,
+ 6,
+ 6,
+ 0,
+ 9,
+ 8,
+ 0,
+ 12,
+ 14,
+ 0,
+ 23,
+ 21,
+ 0,
+ 37,
+ 1,
+ 1,
+ 1,
+ 2,
+ 2,
+ 2,
+ 2,
+ 1,
+ 2,
+ 3,
+ 1,
+ 2,
+ 3,
+ 1,
+ 3,
+ 3,
+ 1,
+ 3,
+ 4,
+ 0,
+ 4,
+ 5,
+ 0,
+ 5,
+ 7,
+ 0,
+ 7,
+ 10,
+ 0,
+ 9,
+ 18,
+ 0,
+ 16,
+ 29,
+ 0,
+ 24,
+ 3,
+ 3,
+ 3,
+ 4,
+ 3,
+ 4,
+ 5,
+ 3,
+ 4,
+ 9,
+ 5,
+ 7,
+ 4,
+ 1,
+ 3,
+ 4,
+ 1,
+ 3,
+ 8,
+ 1,
+ 6,
+ 10,
+ 0,
+ 6,
+ 14,
+ 0,
+ 8,
+ 19,
+ 0,
+ 9,
+ 32,
+ 0,
+ 14,
+ 50,
+ 0,
+ 20,
+ 3,
+ 3,
+ 3,
+ 4,
+ 3,
+ 4,
+ 5,
+ 3,
+ 4,
+ 5,
+ 3,
+ 4,
+ 5,
+ 2,
+ 3,
+ 5,
+ 1,
+ 3,
+ 9,
+ 1,
+ 5,
+ 11,
+ 0,
+ 5,
+ 16,
+ 0,
+ 5,
+ 21,
+ 0,
+ 5,
+ 36,
+ 0,
+ 6,
+ 56,
+ 0,
+ 8,
+ 3,
+ 3,
+ 3,
+ 5,
+ 3,
+ 4,
+ 5,
+ 3,
+ 4,
+ 9,
+ 6,
+ 6,
+ 7,
+ 3,
+ 5,
+ 9,
+ 3,
+ 5,
+ 9,
+ 1,
+ 3,
+ 11,
+ 0,
+ 3,
+ 16,
+ 0,
+ 3,
+ 22,
+ 0,
+ 2,
+ 37,
+ 0,
+ 2,
+ 57,
+ 0,
+ 2,
+ 3,
+ 3,
+ 3,
+ 5,
+ 3,
+ 3,
+ 5,
+ 3,
+ 3,
+ 5,
+ 3,
+ 3,
+ 6,
+ 3,
+ 3,
+ 7,
+ 2,
+ 3,
+ 9,
+ 2,
+ 2,
+ 11,
+ 1,
+ 1,
+ 15,
+ 0,
+ 0,
+ 21,
+ 0,
+ 0,
+ 35,
+ 0,
+ 0,
+ 53,
+ 0,
+ 0,
+ 3,
+ 3,
+ 3,
+ 5,
+ 4,
+ 3,
+ 5,
+ 3,
+ 3,
+ 5,
+ 3,
+ 3,
+ 6,
+ 3,
+ 2,
+ 7,
+ 3,
+ 2,
+ 8,
+ 2,
+ 1,
+ 10,
+ 1,
+ 0,
+ 13,
+ 0,
+ 0,
+ 18,
+ 0,
+ 0,
+ 28,
+ 0,
+ 0,
+ 41,
+ 0,
+ 0,
+ 3,
+ 3,
+ 3,
+ 4,
+ 4,
+ 3,
+ 5,
+ 4,
+ 3,
+ 5,
+ 3,
+ 2,
+ 6,
+ 3,
+ 2,
+ 6,
+ 3,
+ 2,
+ 8,
+ 3,
+ 0,
+ 9,
+ 2,
+ 0,
+ 11,
+ 1,
+ 0,
+ 14,
+ 0,
+ 0,
+ 20,
+ 0,
+ 0,
+ 28,
+ 0,
+ 0,
+ 3,
+ 3,
+ 3,
+ 4,
+ 4,
+ 3,
+ 4,
+ 4,
+ 3,
+ 5,
+ 4,
+ 2,
+ 5,
+ 4,
+ 2,
+ 6,
+ 3,
+ 1,
+ 7,
+ 3,
+ 0,
+ 8,
+ 3,
+ 0,
+ 10,
+ 2,
+ 0,
+ 12,
+ 2,
+ 0,
+ 16,
+ 1,
+ 0,
+ 20,
+ 0,
+ 0,
+ 3,
+ 3,
+ 3,
+ 4,
+ 4,
+ 3,
+ 4,
+ 4,
+ 2,
+ 4,
+ 4,
+ 2,
+ 5,
+ 4,
+ 2,
+ 5,
+ 4,
+ 1,
+ 6,
+ 3,
+ 0,
+ 7,
+ 3,
+ 0,
+ 8,
+ 3,
+ 0,
+ 10,
+ 3,
+ 0,
+ 13,
+ 2,
+ 0,
+ 16,
+ 2,
+ 0,
+ 3,
+ 3,
+ 3,
+ 4,
+ 4,
+ 3,
+ 4,
+ 4,
+ 3,
+ 4,
+ 4,
+ 2,
+ 4,
+ 4,
+ 2,
+ 4,
+ 4,
+ 1,
+ 5,
+ 4,
+ 0,
+ 6,
+ 4,
+ 0,
+ 7,
+ 4,
+ 0,
+ 8,
+ 4,
+ 0,
+ 10,
+ 4,
+ 0,
+ 13,
+ 4,
+ 0,
+ 3,
+ 3,
+ 3,
+ 4,
+ 4,
+ 3,
+ 4,
+ 4,
+ 3,
+ 4,
+ 4,
+ 2,
+ 4,
+ 4,
+ 2,
+ 4,
+ 4,
+ 1,
+ 4,
+ 4,
+ 0,
+ 5,
+ 4,
+ 0,
+ 6,
+ 5,
+ 0,
+ 7,
+ 5,
+ 0,
+ 8,
+ 5,
+ 0,
+ 10,
+ 5,
+ 0,
+ 3,
+ 3,
+ 3,
+ 4,
+ 4,
+ 3,
+ 4,
+ 4,
+ 3,
+ 4,
+ 4,
+ 2,
+ 3,
+ 4,
+ 2,
+ 3,
+ 4,
+ 1,
+ 3,
+ 5,
+ 0,
+ 4,
+ 5,
+ 0,
+ 4,
+ 5,
+ 0,
+ 5,
+ 5,
+ 0,
+ 7,
+ 6,
+ 0,
+ 8,
+ 6,
+ 0,
+ 3,
+ 3,
+ 3,
+ 4,
+ 4,
+ 3,
+ 3,
+ 4,
+ 3,
+ 3,
+ 4,
+ 2,
+ 3,
+ 4,
+ 2,
+ 3,
+ 5,
+ 2,
+ 3,
+ 5,
+ 0,
+ 3,
+ 5,
+ 0,
+ 3,
+ 5,
+ 0,
+ 4,
+ 6,
+ 0,
+ 4,
+ 7,
+ 0,
+ 5,
+ 7,
+ 0,
+ 3,
+ 3,
+ 3,
+ 3,
+ 4,
+ 3,
+ 3,
+ 4,
+ 3,
+ 3,
+ 4,
+ 3,
+ 3,
+ 5,
+ 2,
+ 3,
+ 5,
+ 2,
+ 2,
+ 5,
+ 1,
+ 2,
+ 5,
+ 0,
+ 2,
+ 6,
+ 0,
+ 2,
+ 7,
+ 0,
+ 1,
+ 8,
+ 0,
+ 0,
+ 9,
+ 0,
+ 3,
+ 3,
+ 3,
+ 3,
+ 4,
+ 3,
+ 3,
+ 4,
+ 3,
+ 3,
+ 4,
+ 3,
+ 3,
+ 5,
+ 2,
+ 2,
+ 5,
+ 2,
+ 2,
+ 5,
+ 1,
+ 2,
+ 6,
+ 0,
+ 1,
+ 6,
+ 0,
+ 0,
+ 7,
+ 0,
+ 0,
+ 9,
+ 0,
+ 0,
+ 11,
+ 0,
+ 3,
+ 3,
+ 3,
+ 3,
+ 4,
+ 3,
+ 3,
+ 4,
+ 3,
+ 3,
+ 4,
+ 3,
+ 3,
+ 5,
+ 3,
+ 2,
+ 5,
+ 2,
+ 2,
+ 5,
+ 2,
+ 1,
+ 6,
+ 1,
+ 0,
+ 7,
+ 0,
+ 0,
+ 8,
+ 0,
+ 0,
+ 10,
+ 0,
+ 0,
+ 11,
+ 0,
+ 3,
+ 3,
+ 3,
+ 3,
+ 4,
+ 4,
+ 3,
+ 4,
+ 3,
+ 3,
+ 4,
+ 3,
+ 2,
+ 5,
+ 3,
+ 2,
+ 5,
+ 3,
+ 1,
+ 5,
+ 3,
+ 0,
+ 6,
+ 2,
+ 0,
+ 7,
+ 2,
+ 0,
+ 8,
+ 1,
+ 0,
+ 10,
+ 0,
+ 0,
+ 12,
+ 0,
+ 3,
+ 3,
+ 3,
+ 3,
+ 4,
+ 4,
+ 3,
+ 4,
+ 4,
+ 3,
+ 4,
+ 4,
+ 2,
+ 5,
+ 4,
+ 1,
+ 5,
+ 4,
+ 1,
+ 5,
+ 4,
+ 0,
+ 6,
+ 3,
+ 0,
+ 7,
+ 3,
+ 0,
+ 8,
+ 3,
+ 0,
+ 10,
+ 2,
+ 0,
+ 12,
+ 2,
+ 3,
+ 3,
+ 3,
+ 3,
+ 4,
+ 4,
+ 3,
+ 4,
+ 4,
+ 2,
+ 4,
+ 4,
+ 2,
+ 5,
+ 4,
+ 1,
+ 5,
+ 4,
+ 1,
+ 5,
+ 5,
+ 0,
+ 6,
+ 5,
+ 0,
+ 7,
+ 5,
+ 0,
+ 8,
+ 5,
+ 0,
+ 10,
+ 5,
+ 0,
+ 12,
+ 5,
+ 3,
+ 3,
+ 3,
+ 3,
+ 4,
+ 4,
+ 3,
+ 4,
+ 5,
+ 2,
+ 4,
+ 5,
+ 2,
+ 4,
+ 6,
+ 1,
+ 5,
+ 7,
+ 0,
+ 5,
+ 8,
+ 0,
+ 5,
+ 9,
+ 0,
+ 6,
+ 11,
+ 0,
+ 7,
+ 13,
+ 0,
+ 9,
+ 19,
+ 0,
+ 11,
+ 27,
+ 3,
+ 3,
+ 3,
+ 3,
+ 4,
+ 5,
+ 3,
+ 4,
+ 5,
+ 3,
+ 4,
+ 6,
+ 2,
+ 4,
+ 7,
+ 1,
+ 4,
+ 8,
+ 0,
+ 5,
+ 10,
+ 0,
+ 5,
+ 12,
+ 0,
+ 6,
+ 17,
+ 0,
+ 7,
+ 21,
+ 0,
+ 8,
+ 33,
+ 0,
+ 9,
+ 50,
+ 3,
+ 3,
+ 3,
+ 3,
+ 4,
+ 5,
+ 3,
+ 4,
+ 5,
+ 3,
+ 4,
+ 6,
+ 2,
+ 4,
+ 7,
+ 1,
+ 4,
+ 9,
+ 0,
+ 4,
+ 12,
+ 0,
+ 4,
+ 16,
+ 0,
+ 5,
+ 25,
+ 0,
+ 5,
+ 34,
+ 0,
+ 6,
+ 60,
+ 0,
+ 6,
+ 97,
+ 3,
+ 3,
+ 3,
+ 4,
+ 4,
+ 5,
+ 3,
+ 4,
+ 5,
+ 3,
+ 4,
+ 6,
+ 3,
+ 4,
+ 8,
+ 2,
+ 4,
+ 9,
+ 1,
+ 4,
+ 13,
+ 0,
+ 4,
+ 18,
+ 0,
+ 4,
+ 30,
+ 0,
+ 4,
+ 45,
+ 0,
+ 3,
+ 90,
+ 0,
+ 2,
+ 157,
+ 3,
+ 3,
+ 3,
+ 4,
+ 4,
+ 5,
+ 4,
+ 4,
+ 5,
+ 3,
+ 4,
+ 6,
+ 3,
+ 3,
+ 7,
+ 3,
+ 3,
+ 9,
+ 2,
+ 3,
+ 13,
+ 0,
+ 3,
+ 18,
+ 0,
+ 3,
+ 31,
+ 0,
+ 3,
+ 49,
+ 0,
+ 1,
+ 103,
+ 0,
+ 0,
+ 186,
+ 3,
+ 3,
+ 3,
+ 4,
+ 4,
+ 5,
+ 4,
+ 4,
+ 5,
+ 4,
+ 3,
+ 6,
+ 4,
+ 3,
+ 7,
+ 3,
+ 3,
+ 9,
+ 3,
+ 3,
+ 12,
+ 1,
+ 2,
+ 17,
+ 0,
+ 2,
+ 29,
+ 0,
+ 1,
+ 47,
+ 0,
+ 0,
+ 99,
+ 0,
+ 0,
+ 180,
+ 3,
+ 3,
+ 3,
+ 4,
+ 4,
+ 5,
+ 4,
+ 3,
+ 5,
+ 4,
+ 3,
+ 6,
+ 4,
+ 3,
+ 7,
+ 4,
+ 3,
+ 8,
+ 4,
+ 2,
+ 11,
+ 3,
+ 2,
+ 16,
+ 1,
+ 1,
+ 26,
+ 0,
+ 0,
+ 41,
+ 0,
+ 0,
+ 83,
+ 0,
+ 0,
+ 140,
+ 3,
+ 3,
+ 3,
+ 4,
+ 4,
+ 5,
+ 4,
+ 3,
+ 5,
+ 4,
+ 3,
+ 5,
+ 4,
+ 3,
+ 7,
+ 4,
+ 3,
+ 8,
+ 4,
+ 2,
+ 11,
+ 5,
+ 1,
+ 14,
+ 4,
+ 0,
+ 22,
+ 4,
+ 0,
+ 33,
+ 0,
+ 0,
+ 65,
+ 0,
+ 0,
+ 112,
+ 3,
+ 3,
+ 3,
+ 4,
+ 4,
+ 4,
+ 4,
+ 3,
+ 5,
+ 4,
+ 3,
+ 5,
+ 5,
+ 3,
+ 6,
+ 5,
+ 3,
+ 7,
+ 5,
+ 2,
+ 10,
+ 6,
+ 1,
+ 12,
+ 7,
+ 0,
+ 19,
+ 8,
+ 0,
+ 28,
+ 9,
+ 0,
+ 52,
+ 8,
+ 0,
+ 88,
+ 3,
+ 3,
+ 3,
+ 4,
+ 3,
+ 4,
+ 4,
+ 3,
+ 5,
+ 5,
+ 3,
+ 5,
+ 5,
+ 3,
+ 6,
+ 5,
+ 2,
+ 7,
+ 6,
+ 2,
+ 9,
+ 7,
+ 1,
+ 11,
+ 9,
+ 0,
+ 16,
+ 11,
+ 0,
+ 23,
+ 15,
+ 0,
+ 41,
+ 20,
+ 0,
+ 68,
+ 3,
+ 3,
+ 3,
+ 4,
+ 3,
+ 4,
+ 5,
+ 3,
+ 5,
+ 5,
+ 3,
+ 5,
+ 5,
+ 3,
+ 6,
+ 5,
+ 1,
+ 6,
+ 5,
+ 0,
+ 6,
+ 8,
+ 1,
+ 10,
+ 10,
+ 0,
+ 14,
+ 14,
+ 0,
+ 19,
+ 21,
+ 0,
+ 32,
+ 32,
+ 0,
+ 49,
+ 3,
+ 3,
+ 3,
+ 4,
+ 3,
+ 4,
+ 5,
+ 3,
+ 4,
+ 5,
+ 3,
+ 5,
+ 7,
+ 3,
+ 7,
+ 4,
+ 1,
+ 4,
+ 7,
+ 1,
+ 7,
+ 9,
+ 0,
+ 8,
+ 12,
+ 0,
+ 11,
+ 16,
+ 0,
+ 14,
+ 27,
+ 0,
+ 23,
+ 41,
+ 0,
+ 33,
+ 7,
+ 7,
+ 7,
+ 8,
+ 7,
+ 8,
+ 9,
+ 6,
+ 8,
+ 9,
+ 4,
+ 7,
+ 8,
+ 3,
+ 6,
+ 13,
+ 3,
+ 9,
+ 14,
+ 1,
+ 9,
+ 16,
+ 2,
+ 10,
+ 21,
+ 0,
+ 12,
+ 28,
+ 0,
+ 15,
+ 45,
+ 0,
+ 21,
+ 67,
+ 0,
+ 27,
+ 7,
+ 7,
+ 7,
+ 8,
+ 7,
+ 7,
+ 9,
+ 6,
+ 7,
+ 9,
+ 5,
+ 7,
+ 12,
+ 5,
+ 8,
+ 6,
+ 1,
+ 3,
+ 14,
+ 1,
+ 7,
+ 21,
+ 1,
+ 9,
+ 23,
+ 0,
+ 8,
+ 31,
+ 0,
+ 9,
+ 50,
+ 0,
+ 10,
+ 75,
+ 0,
+ 13,
+ 7,
+ 7,
+ 7,
+ 8,
+ 7,
+ 7,
+ 9,
+ 6,
+ 7,
+ 10,
+ 6,
+ 6,
+ 11,
+ 5,
+ 6,
+ 13,
+ 4,
+ 5,
+ 13,
+ 2,
+ 5,
+ 19,
+ 1,
+ 6,
+ 24,
+ 0,
+ 5,
+ 32,
+ 0,
+ 4,
+ 51,
+ 0,
+ 4,
+ 76,
+ 0,
+ 5,
+ 7,
+ 7,
+ 7,
+ 8,
+ 7,
+ 7,
+ 9,
+ 7,
+ 6,
+ 10,
+ 6,
+ 6,
+ 12,
+ 6,
+ 5,
+ 12,
+ 4,
+ 4,
+ 18,
+ 5,
+ 5,
+ 23,
+ 4,
+ 5,
+ 23,
+ 0,
+ 4,
+ 30,
+ 0,
+ 3,
+ 48,
+ 0,
+ 1,
+ 70,
+ 0,
+ 0,
+ 7,
+ 7,
+ 7,
+ 9,
+ 7,
+ 7,
+ 10,
+ 7,
+ 6,
+ 10,
+ 7,
+ 6,
+ 11,
+ 6,
+ 5,
+ 14,
+ 7,
+ 5,
+ 20,
+ 9,
+ 6,
+ 15,
+ 4,
+ 3,
+ 20,
+ 1,
+ 1,
+ 25,
+ 0,
+ 0,
+ 39,
+ 0,
+ 0,
+ 55,
+ 0,
+ 0,
+ 7,
+ 7,
+ 7,
+ 9,
+ 8,
+ 7,
+ 10,
+ 8,
+ 6,
+ 11,
+ 8,
+ 6,
+ 12,
+ 7,
+ 5,
+ 16,
+ 9,
+ 6,
+ 12,
+ 5,
+ 4,
+ 13,
+ 5,
+ 2,
+ 17,
+ 3,
+ 0,
+ 20,
+ 2,
+ 0,
+ 28,
+ 0,
+ 0,
+ 37,
+ 0,
+ 0,
+ 7,
+ 7,
+ 7,
+ 9,
+ 8,
+ 7,
+ 10,
+ 9,
+ 7,
+ 10,
+ 8,
+ 5,
+ 13,
+ 9,
+ 5,
+ 10,
+ 6,
+ 3,
+ 11,
+ 6,
+ 3,
+ 12,
+ 5,
+ 2,
+ 14,
+ 5,
+ 0,
+ 17,
+ 4,
+ 0,
+ 22,
+ 2,
+ 0,
+ 28,
+ 0,
+ 0,
+ 7,
+ 7,
+ 7,
+ 9,
+ 9,
+ 7,
+ 11,
+ 10,
+ 7,
+ 11,
+ 10,
+ 6,
+ 13,
+ 11,
+ 6,
+ 9,
+ 7,
+ 3,
+ 10,
+ 6,
+ 3,
+ 10,
+ 6,
+ 2,
+ 12,
+ 6,
+ 0,
+ 14,
+ 5,
+ 0,
+ 17,
+ 5,
+ 0,
+ 21,
+ 4,
+ 0,
+ 7,
+ 7,
+ 7,
+ 9,
+ 9,
+ 8,
+ 11,
+ 11,
+ 8,
+ 11,
+ 11,
+ 6,
+ 8,
+ 7,
+ 3,
+ 8,
+ 7,
+ 2,
+ 8,
+ 7,
+ 3,
+ 9,
+ 7,
+ 1,
+ 10,
+ 7,
+ 0,
+ 12,
+ 7,
+ 0,
+ 14,
+ 7,
+ 0,
+ 16,
+ 6,
+ 0,
+ 7,
+ 7,
+ 7,
+ 10,
+ 10,
+ 8,
+ 12,
+ 12,
+ 8,
+ 12,
+ 13,
+ 7,
+ 7,
+ 7,
+ 3,
+ 7,
+ 8,
+ 3,
+ 7,
+ 8,
+ 3,
+ 8,
+ 8,
+ 1,
+ 8,
+ 8,
+ 0,
+ 9,
+ 8,
+ 0,
+ 11,
+ 8,
+ 0,
+ 12,
+ 8,
+ 0,
+ 7,
+ 7,
+ 7,
+ 10,
+ 10,
+ 8,
+ 12,
+ 13,
+ 9,
+ 7,
+ 7,
+ 5,
+ 7,
+ 8,
+ 4,
+ 7,
+ 8,
+ 3,
+ 6,
+ 8,
+ 3,
+ 6,
+ 8,
+ 2,
+ 6,
+ 9,
+ 0,
+ 7,
+ 9,
+ 0,
+ 8,
+ 10,
+ 0,
+ 8,
+ 10,
+ 0,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 6,
+ 6,
+ 7,
+ 5,
+ 6,
+ 8,
+ 5,
+ 6,
+ 8,
+ 4,
+ 6,
+ 8,
+ 3,
+ 5,
+ 9,
+ 3,
+ 5,
+ 9,
+ 2,
+ 4,
+ 10,
+ 0,
+ 4,
+ 10,
+ 0,
+ 4,
+ 11,
+ 0,
+ 8,
+ 11,
+ 0,
+ 7,
+ 7,
+ 7,
+ 7,
+ 8,
+ 6,
+ 6,
+ 8,
+ 5,
+ 6,
+ 8,
+ 5,
+ 6,
+ 8,
+ 4,
+ 5,
+ 8,
+ 3,
+ 4,
+ 9,
+ 2,
+ 3,
+ 10,
+ 3,
+ 2,
+ 11,
+ 0,
+ 2,
+ 11,
+ 0,
+ 4,
+ 11,
+ 0,
+ 3,
+ 12,
+ 0,
+ 7,
+ 7,
+ 7,
+ 7,
+ 8,
+ 7,
+ 6,
+ 8,
+ 6,
+ 6,
+ 8,
+ 5,
+ 5,
+ 8,
+ 5,
+ 5,
+ 9,
+ 4,
+ 4,
+ 9,
+ 3,
+ 3,
+ 10,
+ 2,
+ 1,
+ 11,
+ 2,
+ 3,
+ 10,
+ 0,
+ 0,
+ 12,
+ 0,
+ 0,
+ 14,
+ 0,
+ 7,
+ 7,
+ 7,
+ 7,
+ 8,
+ 7,
+ 6,
+ 8,
+ 6,
+ 6,
+ 8,
+ 6,
+ 5,
+ 8,
+ 5,
+ 4,
+ 9,
+ 4,
+ 3,
+ 9,
+ 3,
+ 2,
+ 10,
+ 3,
+ 0,
+ 11,
+ 3,
+ 1,
+ 11,
+ 2,
+ 0,
+ 13,
+ 0,
+ 0,
+ 15,
+ 0,
+ 7,
+ 7,
+ 7,
+ 7,
+ 8,
+ 7,
+ 6,
+ 8,
+ 6,
+ 5,
+ 8,
+ 6,
+ 4,
+ 8,
+ 6,
+ 4,
+ 9,
+ 6,
+ 2,
+ 10,
+ 5,
+ 1,
+ 10,
+ 5,
+ 2,
+ 10,
+ 4,
+ 0,
+ 11,
+ 3,
+ 0,
+ 13,
+ 2,
+ 0,
+ 15,
+ 2,
+ 7,
+ 7,
+ 7,
+ 6,
+ 8,
+ 7,
+ 5,
+ 8,
+ 7,
+ 5,
+ 8,
+ 7,
+ 4,
+ 8,
+ 7,
+ 3,
+ 9,
+ 7,
+ 2,
+ 10,
+ 6,
+ 0,
+ 10,
+ 6,
+ 1,
+ 10,
+ 6,
+ 0,
+ 11,
+ 5,
+ 0,
+ 13,
+ 4,
+ 0,
+ 15,
+ 3,
+ 7,
+ 7,
+ 7,
+ 6,
+ 8,
+ 7,
+ 5,
+ 8,
+ 7,
+ 5,
+ 8,
+ 7,
+ 4,
+ 8,
+ 7,
+ 3,
+ 9,
+ 8,
+ 1,
+ 10,
+ 8,
+ 0,
+ 10,
+ 8,
+ 1,
+ 10,
+ 8,
+ 0,
+ 11,
+ 8,
+ 0,
+ 13,
+ 9,
+ 0,
+ 15,
+ 9,
+ 7,
+ 7,
+ 7,
+ 6,
+ 7,
+ 8,
+ 5,
+ 7,
+ 8,
+ 5,
+ 8,
+ 9,
+ 4,
+ 8,
+ 10,
+ 3,
+ 8,
+ 11,
+ 0,
+ 9,
+ 13,
+ 0,
+ 10,
+ 14,
+ 0,
+ 11,
+ 16,
+ 0,
+ 10,
+ 19,
+ 0,
+ 12,
+ 27,
+ 0,
+ 14,
+ 37,
+ 7,
+ 7,
+ 7,
+ 6,
+ 7,
+ 8,
+ 5,
+ 7,
+ 9,
+ 5,
+ 7,
+ 10,
+ 4,
+ 8,
+ 11,
+ 3,
+ 8,
+ 12,
+ 0,
+ 9,
+ 15,
+ 0,
+ 9,
+ 18,
+ 0,
+ 10,
+ 23,
+ 0,
+ 10,
+ 28,
+ 0,
+ 11,
+ 44,
+ 0,
+ 12,
+ 65,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 8,
+ 6,
+ 7,
+ 9,
+ 5,
+ 7,
+ 10,
+ 4,
+ 7,
+ 12,
+ 3,
+ 7,
+ 14,
+ 1,
+ 8,
+ 18,
+ 0,
+ 8,
+ 23,
+ 0,
+ 9,
+ 34,
+ 0,
+ 10,
+ 45,
+ 0,
+ 9,
+ 76,
+ 0,
+ 9,
+ 118,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 8,
+ 6,
+ 7,
+ 9,
+ 6,
+ 7,
+ 10,
+ 5,
+ 7,
+ 12,
+ 4,
+ 7,
+ 14,
+ 2,
+ 7,
+ 20,
+ 0,
+ 7,
+ 25,
+ 0,
+ 7,
+ 40,
+ 0,
+ 8,
+ 58,
+ 0,
+ 7,
+ 111,
+ 0,
+ 4,
+ 188,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 8,
+ 7,
+ 7,
+ 9,
+ 6,
+ 7,
+ 10,
+ 6,
+ 6,
+ 12,
+ 5,
+ 6,
+ 14,
+ 4,
+ 6,
+ 19,
+ 1,
+ 6,
+ 26,
+ 0,
+ 6,
+ 42,
+ 0,
+ 6,
+ 64,
+ 0,
+ 4,
+ 127,
+ 0,
+ 2,
+ 221,
+ 7,
+ 7,
+ 7,
+ 10,
+ 10,
+ 12,
+ 12,
+ 12,
+ 16,
+ 7,
+ 6,
+ 10,
+ 7,
+ 6,
+ 12,
+ 6,
+ 6,
+ 14,
+ 5,
+ 5,
+ 19,
+ 4,
+ 5,
+ 25,
+ 0,
+ 4,
+ 41,
+ 0,
+ 3,
+ 62,
+ 0,
+ 1,
+ 125,
+ 0,
+ 0,
+ 224,
+ 7,
+ 7,
+ 7,
+ 10,
+ 9,
+ 11,
+ 12,
+ 11,
+ 15,
+ 7,
+ 6,
+ 10,
+ 7,
+ 6,
+ 11,
+ 7,
+ 6,
+ 13,
+ 7,
+ 5,
+ 18,
+ 6,
+ 4,
+ 23,
+ 4,
+ 3,
+ 36,
+ 1,
+ 1,
+ 54,
+ 0,
+ 0,
+ 101,
+ 0,
+ 0,
+ 170,
+ 7,
+ 7,
+ 7,
+ 9,
+ 9,
+ 11,
+ 11,
+ 10,
+ 14,
+ 11,
+ 9,
+ 14,
+ 11,
+ 8,
+ 16,
+ 10,
+ 6,
+ 18,
+ 8,
+ 4,
+ 16,
+ 8,
+ 4,
+ 21,
+ 8,
+ 1,
+ 31,
+ 8,
+ 0,
+ 45,
+ 5,
+ 0,
+ 83,
+ 0,
+ 0,
+ 139,
+ 7,
+ 7,
+ 7,
+ 9,
+ 8,
+ 10,
+ 11,
+ 9,
+ 12,
+ 10,
+ 7,
+ 13,
+ 10,
+ 6,
+ 14,
+ 9,
+ 4,
+ 15,
+ 9,
+ 2,
+ 18,
+ 10,
+ 3,
+ 19,
+ 11,
+ 1,
+ 27,
+ 13,
+ 0,
+ 38,
+ 15,
+ 0,
+ 68,
+ 15,
+ 0,
+ 111,
+ 7,
+ 7,
+ 7,
+ 9,
+ 8,
+ 9,
+ 10,
+ 8,
+ 11,
+ 10,
+ 6,
+ 11,
+ 9,
+ 4,
+ 11,
+ 4,
+ 1,
+ 7,
+ 5,
+ 0,
+ 9,
+ 6,
+ 0,
+ 13,
+ 14,
+ 0,
+ 24,
+ 17,
+ 0,
+ 32,
+ 23,
+ 0,
+ 55,
+ 31,
+ 0,
+ 87,
+ 7,
+ 7,
+ 7,
+ 9,
+ 7,
+ 9,
+ 10,
+ 7,
+ 10,
+ 9,
+ 5,
+ 9,
+ 8,
+ 3,
+ 9,
+ 5,
+ 0,
+ 6,
+ 5,
+ 0,
+ 7,
+ 13,
+ 2,
+ 15,
+ 16,
+ 0,
+ 21,
+ 21,
+ 0,
+ 27,
+ 31,
+ 0,
+ 43,
+ 44,
+ 0,
+ 64,
+ 7,
+ 7,
+ 7,
+ 8,
+ 7,
+ 8,
+ 9,
+ 6,
+ 9,
+ 9,
+ 5,
+ 8,
+ 4,
+ 1,
+ 4,
+ 5,
+ 0,
+ 5,
+ 6,
+ 0,
+ 6,
+ 10,
+ 0,
+ 9,
+ 19,
+ 0,
+ 17,
+ 24,
+ 0,
+ 21,
+ 38,
+ 0,
+ 32,
+ 56,
+ 0,
+ 44,
+ 11,
+ 11,
+ 11,
+ 15,
+ 11,
+ 13,
+ 18,
+ 11,
+ 14,
+ 21,
+ 11,
+ 16,
+ 21,
+ 9,
+ 16,
+ 21,
+ 5,
+ 15,
+ 17,
+ 1,
+ 11,
+ 24,
+ 0,
+ 14,
+ 31,
+ 0,
+ 19,
+ 39,
+ 0,
+ 23,
+ 60,
+ 0,
+ 30,
+ 87,
+ 0,
+ 37,
+ 11,
+ 11,
+ 11,
+ 15,
+ 12,
+ 13,
+ 19,
+ 12,
+ 14,
+ 22,
+ 12,
+ 16,
+ 23,
+ 10,
+ 15,
+ 23,
+ 6,
+ 13,
+ 21,
+ 1,
+ 9,
+ 29,
+ 0,
+ 12,
+ 33,
+ 0,
+ 13,
+ 43,
+ 0,
+ 14,
+ 67,
+ 0,
+ 17,
+ 96,
+ 0,
+ 21,
+ 11,
+ 11,
+ 11,
+ 15,
+ 12,
+ 13,
+ 19,
+ 13,
+ 14,
+ 22,
+ 12,
+ 14,
+ 22,
+ 10,
+ 12,
+ 23,
+ 7,
+ 10,
+ 22,
+ 3,
+ 7,
+ 27,
+ 1,
+ 7,
+ 34,
+ 0,
+ 8,
+ 45,
+ 0,
+ 8,
+ 69,
+ 0,
+ 7,
+ 99,
+ 0,
+ 7,
+ 11,
+ 11,
+ 11,
+ 15,
+ 12,
+ 12,
+ 19,
+ 13,
+ 13,
+ 21,
+ 12,
+ 12,
+ 20,
+ 10,
+ 10,
+ 22,
+ 8,
+ 7,
+ 24,
+ 6,
+ 6,
+ 25,
+ 2,
+ 4,
+ 34,
+ 1,
+ 5,
+ 43,
+ 0,
+ 3,
+ 64,
+ 0,
+ 6,
+ 91,
+ 0,
+ 5,
+ 11,
+ 11,
+ 11,
+ 15,
+ 12,
+ 11,
+ 19,
+ 13,
+ 11,
+ 19,
+ 12,
+ 10,
+ 21,
+ 12,
+ 9,
+ 21,
+ 10,
+ 7,
+ 23,
+ 9,
+ 6,
+ 31,
+ 10,
+ 5,
+ 28,
+ 4,
+ 6,
+ 35,
+ 0,
+ 4,
+ 52,
+ 0,
+ 1,
+ 73,
+ 0,
+ 0,
+ 11,
+ 11,
+ 11,
+ 15,
+ 13,
+ 11,
+ 18,
+ 14,
+ 10,
+ 18,
+ 13,
+ 8,
+ 21,
+ 13,
+ 8,
+ 22,
+ 12,
+ 7,
+ 27,
+ 13,
+ 6,
+ 21,
+ 8,
+ 2,
+ 24,
+ 6,
+ 5,
+ 29,
+ 4,
+ 2,
+ 39,
+ 0,
+ 0,
+ 50,
+ 0,
+ 0,
+ 11,
+ 11,
+ 11,
+ 14,
+ 13,
+ 10,
+ 16,
+ 14,
+ 9,
+ 17,
+ 13,
+ 8,
+ 18,
+ 13,
+ 7,
+ 22,
+ 14,
+ 7,
+ 18,
+ 10,
+ 3,
+ 18,
+ 9,
+ 6,
+ 21,
+ 8,
+ 4,
+ 24,
+ 7,
+ 1,
+ 30,
+ 5,
+ 0,
+ 37,
+ 2,
+ 0,
+ 11,
+ 11,
+ 11,
+ 13,
+ 13,
+ 10,
+ 15,
+ 14,
+ 9,
+ 17,
+ 14,
+ 8,
+ 18,
+ 14,
+ 7,
+ 21,
+ 15,
+ 6,
+ 16,
+ 10,
+ 3,
+ 16,
+ 10,
+ 6,
+ 18,
+ 10,
+ 3,
+ 20,
+ 9,
+ 1,
+ 24,
+ 8,
+ 0,
+ 29,
+ 7,
+ 0,
+ 11,
+ 11,
+ 11,
+ 13,
+ 13,
+ 10,
+ 15,
+ 15,
+ 9,
+ 16,
+ 15,
+ 8,
+ 17,
+ 15,
+ 6,
+ 20,
+ 16,
+ 6,
+ 15,
+ 11,
+ 3,
+ 14,
+ 11,
+ 6,
+ 15,
+ 11,
+ 3,
+ 17,
+ 11,
+ 0,
+ 19,
+ 10,
+ 0,
+ 22,
+ 10,
+ 0,
+ 11,
+ 11,
+ 11,
+ 13,
+ 13,
+ 10,
+ 14,
+ 15,
+ 9,
+ 14,
+ 16,
+ 7,
+ 15,
+ 16,
+ 6,
+ 18,
+ 17,
+ 6,
+ 13,
+ 12,
+ 3,
+ 12,
+ 12,
+ 6,
+ 13,
+ 12,
+ 3,
+ 14,
+ 12,
+ 0,
+ 15,
+ 13,
+ 0,
+ 16,
+ 13,
+ 0,
+ 11,
+ 11,
+ 11,
+ 12,
+ 14,
+ 10,
+ 13,
+ 16,
+ 9,
+ 13,
+ 16,
+ 7,
+ 14,
+ 17,
+ 7,
+ 16,
+ 18,
+ 6,
+ 11,
+ 13,
+ 3,
+ 10,
+ 13,
+ 6,
+ 10,
+ 14,
+ 3,
+ 10,
+ 14,
+ 0,
+ 11,
+ 15,
+ 0,
+ 11,
+ 16,
+ 0,
+ 11,
+ 11,
+ 11,
+ 12,
+ 14,
+ 10,
+ 13,
+ 16,
+ 9,
+ 13,
+ 16,
+ 8,
+ 13,
+ 18,
+ 8,
+ 14,
+ 20,
+ 7,
+ 10,
+ 14,
+ 4,
+ 9,
+ 14,
+ 2,
+ 7,
+ 15,
+ 4,
+ 7,
+ 16,
+ 1,
+ 6,
+ 17,
+ 0,
+ 5,
+ 19,
+ 0,
+ 11,
+ 11,
+ 11,
+ 12,
+ 14,
+ 11,
+ 13,
+ 16,
+ 10,
+ 13,
+ 17,
+ 9,
+ 13,
+ 19,
+ 9,
+ 13,
+ 21,
+ 8,
+ 8,
+ 14,
+ 4,
+ 7,
+ 15,
+ 3,
+ 4,
+ 16,
+ 5,
+ 3,
+ 17,
+ 2,
+ 1,
+ 19,
+ 0,
+ 8,
+ 17,
+ 0,
+ 11,
+ 11,
+ 11,
+ 12,
+ 14,
+ 11,
+ 13,
+ 17,
+ 11,
+ 13,
+ 18,
+ 11,
+ 13,
+ 20,
+ 11,
+ 8,
+ 14,
+ 7,
+ 7,
+ 15,
+ 5,
+ 6,
+ 16,
+ 4,
+ 3,
+ 17,
+ 2,
+ 0,
+ 19,
+ 4,
+ 5,
+ 17,
+ 1,
+ 3,
+ 18,
+ 0,
+ 11,
+ 11,
+ 11,
+ 12,
+ 14,
+ 12,
+ 13,
+ 17,
+ 13,
+ 13,
+ 18,
+ 13,
+ 9,
+ 13,
+ 9,
+ 8,
+ 14,
+ 8,
+ 6,
+ 15,
+ 6,
+ 4,
+ 16,
+ 5,
+ 2,
+ 18,
+ 3,
+ 0,
+ 19,
+ 2,
+ 3,
+ 17,
+ 4,
+ 0,
+ 19,
+ 2,
+ 11,
+ 11,
+ 11,
+ 12,
+ 14,
+ 13,
+ 13,
+ 17,
+ 14,
+ 13,
+ 19,
+ 16,
+ 8,
+ 13,
+ 10,
+ 7,
+ 14,
+ 10,
+ 5,
+ 15,
+ 9,
+ 3,
+ 16,
+ 8,
+ 0,
+ 18,
+ 7,
+ 0,
+ 20,
+ 6,
+ 2,
+ 18,
+ 4,
+ 0,
+ 20,
+ 2,
+ 11,
+ 11,
+ 11,
+ 12,
+ 14,
+ 14,
+ 13,
+ 17,
+ 16,
+ 12,
+ 19,
+ 17,
+ 7,
+ 13,
+ 11,
+ 6,
+ 14,
+ 11,
+ 4,
+ 15,
+ 11,
+ 2,
+ 16,
+ 10,
+ 0,
+ 18,
+ 10,
+ 0,
+ 20,
+ 9,
+ 1,
+ 18,
+ 8,
+ 0,
+ 20,
+ 7,
+ 11,
+ 11,
+ 11,
+ 12,
+ 14,
+ 14,
+ 13,
+ 17,
+ 17,
+ 13,
+ 19,
+ 18,
+ 7,
+ 13,
+ 12,
+ 6,
+ 14,
+ 13,
+ 3,
+ 15,
+ 13,
+ 1,
+ 16,
+ 13,
+ 0,
+ 18,
+ 13,
+ 0,
+ 19,
+ 13,
+ 0,
+ 17,
+ 14,
+ 0,
+ 19,
+ 15,
+ 11,
+ 11,
+ 11,
+ 12,
+ 14,
+ 15,
+ 13,
+ 16,
+ 18,
+ 13,
+ 17,
+ 20,
+ 7,
+ 13,
+ 16,
+ 5,
+ 13,
+ 17,
+ 2,
+ 14,
+ 19,
+ 0,
+ 15,
+ 21,
+ 0,
+ 17,
+ 24,
+ 0,
+ 19,
+ 27,
+ 0,
+ 16,
+ 39,
+ 0,
+ 18,
+ 53,
+ 11,
+ 11,
+ 11,
+ 12,
+ 13,
+ 15,
+ 13,
+ 15,
+ 18,
+ 13,
+ 17,
+ 21,
+ 7,
+ 12,
+ 17,
+ 6,
+ 13,
+ 19,
+ 2,
+ 14,
+ 23,
+ 0,
+ 15,
+ 26,
+ 0,
+ 16,
+ 32,
+ 0,
+ 18,
+ 39,
+ 0,
+ 15,
+ 60,
+ 0,
+ 16,
+ 87,
+ 11,
+ 11,
+ 11,
+ 12,
+ 13,
+ 15,
+ 13,
+ 15,
+ 18,
+ 13,
+ 16,
+ 21,
+ 8,
+ 12,
+ 18,
+ 6,
+ 12,
+ 21,
+ 3,
+ 12,
+ 27,
+ 0,
+ 13,
+ 32,
+ 0,
+ 15,
+ 45,
+ 0,
+ 16,
+ 58,
+ 0,
+ 17,
+ 97,
+ 0,
+ 13,
+ 148,
+ 11,
+ 11,
+ 11,
+ 12,
+ 13,
+ 15,
+ 13,
+ 14,
+ 19,
+ 13,
+ 15,
+ 21,
+ 13,
+ 16,
+ 25,
+ 8,
+ 11,
+ 21,
+ 5,
+ 11,
+ 28,
+ 2,
+ 12,
+ 36,
+ 0,
+ 12,
+ 54,
+ 0,
+ 13,
+ 76,
+ 0,
+ 13,
+ 138,
+ 0,
+ 12,
+ 226,
+ 11,
+ 11,
+ 11,
+ 12,
+ 12,
+ 15,
+ 13,
+ 13,
+ 18,
+ 13,
+ 14,
+ 21,
+ 13,
+ 14,
+ 24,
+ 14,
+ 15,
+ 30,
+ 7,
+ 10,
+ 28,
+ 4,
+ 10,
+ 36,
+ 0,
+ 10,
+ 56,
+ 0,
+ 10,
+ 82,
+ 0,
+ 8,
+ 155,
+ 0,
+ 6,
+ 255,
+ 11,
+ 11,
+ 11,
+ 12,
+ 12,
+ 15,
+ 13,
+ 12,
+ 18,
+ 13,
+ 12,
+ 20,
+ 13,
+ 13,
+ 24,
+ 13,
+ 12,
+ 28,
+ 9,
+ 9,
+ 27,
+ 7,
+ 9,
+ 35,
+ 2,
+ 8,
+ 54,
+ 0,
+ 6,
+ 79,
+ 0,
+ 4,
+ 152,
+ 0,
+ 2,
+ 255,
+ 11,
+ 11,
+ 11,
+ 12,
+ 11,
+ 15,
+ 13,
+ 11,
+ 18,
+ 13,
+ 10,
+ 19,
+ 13,
+ 10,
+ 22,
+ 11,
+ 8,
+ 24,
+ 13,
+ 9,
+ 35,
+ 11,
+ 8,
+ 32,
+ 8,
+ 6,
+ 49,
+ 5,
+ 3,
+ 70,
+ 0,
+ 0,
+ 125,
+ 0,
+ 0,
+ 202,
+ 11,
+ 11,
+ 11,
+ 13,
+ 11,
+ 14,
+ 14,
+ 11,
+ 17,
+ 12,
+ 9,
+ 17,
+ 10,
+ 7,
+ 18,
+ 10,
+ 5,
+ 22,
+ 11,
+ 4,
+ 28,
+ 11,
+ 3,
+ 37,
+ 13,
+ 4,
+ 44,
+ 13,
+ 1,
+ 61,
+ 12,
+ 0,
+ 104,
+ 6,
+ 0,
+ 168,
+ 11,
+ 11,
+ 11,
+ 13,
+ 11,
+ 14,
+ 14,
+ 11,
+ 16,
+ 13,
+ 9,
+ 17,
+ 10,
+ 5,
+ 16,
+ 8,
+ 2,
+ 15,
+ 9,
+ 1,
+ 20,
+ 13,
+ 0,
+ 31,
+ 18,
+ 3,
+ 38,
+ 20,
+ 0,
+ 51,
+ 24,
+ 0,
+ 87,
+ 26,
+ 0,
+ 136,
+ 11,
+ 11,
+ 11,
+ 13,
+ 11,
+ 14,
+ 15,
+ 11,
+ 16,
+ 17,
+ 10,
+ 20,
+ 8,
+ 3,
+ 11,
+ 8,
+ 1,
+ 14,
+ 6,
+ 0,
+ 11,
+ 17,
+ 0,
+ 28,
+ 22,
+ 2,
+ 33,
+ 25,
+ 0,
+ 44,
+ 34,
+ 0,
+ 71,
+ 43,
+ 0,
+ 109,
+ 11,
+ 11,
+ 11,
+ 13,
+ 11,
+ 13,
+ 15,
+ 11,
+ 15,
+ 15,
+ 8,
+ 15,
+ 13,
+ 5,
+ 15,
+ 13,
+ 2,
+ 15,
+ 6,
+ 0,
+ 8,
+ 17,
+ 0,
+ 22,
+ 25,
+ 1,
+ 29,
+ 30,
+ 0,
+ 37,
+ 44,
+ 0,
+ 57,
+ 60,
+ 0,
+ 82,
+ 11,
+ 11,
+ 11,
+ 14,
+ 11,
+ 13,
+ 17,
+ 11,
+ 15,
+ 17,
+ 9,
+ 15,
+ 20,
+ 8,
+ 18,
+ 15,
+ 3,
+ 14,
+ 7,
+ 0,
+ 7,
+ 13,
+ 0,
+ 13,
+ 27,
+ 1,
+ 25,
+ 35,
+ 0,
+ 30,
+ 52,
+ 0,
+ 43,
+ 75,
+ 0,
+ 58,
+ 19,
+ 19,
+ 19,
+ 23,
+ 19,
+ 22,
+ 27,
+ 19,
+ 24,
+ 28,
+ 18,
+ 24,
+ 30,
+ 16,
+ 24,
+ 32,
+ 13,
+ 24,
+ 33,
+ 6,
+ 22,
+ 30,
+ 0,
+ 18,
+ 42,
+ 3,
+ 28,
+ 52,
+ 0,
+ 33,
+ 77,
+ 0,
+ 42,
+ 109,
+ 0,
+ 52,
+ 19,
+ 19,
+ 19,
+ 24,
+ 20,
+ 21,
+ 28,
+ 20,
+ 23,
+ 28,
+ 17,
+ 22,
+ 29,
+ 16,
+ 21,
+ 34,
+ 14,
+ 21,
+ 33,
+ 6,
+ 16,
+ 36,
+ 1,
+ 14,
+ 51,
+ 0,
+ 21,
+ 57,
+ 0,
+ 22,
+ 85,
+ 0,
+ 27,
+ 121,
+ 0,
+ 30,
+ 19,
+ 19,
+ 19,
+ 23,
+ 20,
+ 20,
+ 27,
+ 20,
+ 21,
+ 29,
+ 19,
+ 21,
+ 30,
+ 17,
+ 19,
+ 34,
+ 15,
+ 18,
+ 35,
+ 8,
+ 13,
+ 35,
+ 2,
+ 9,
+ 50,
+ 1,
+ 12,
+ 60,
+ 0,
+ 13,
+ 90,
+ 0,
+ 12,
+ 126,
+ 0,
+ 11,
+ 19,
+ 19,
+ 19,
+ 23,
+ 20,
+ 19,
+ 26,
+ 20,
+ 19,
+ 27,
+ 18,
+ 17,
+ 29,
+ 17,
+ 16,
+ 33,
+ 15,
+ 14,
+ 32,
+ 9,
+ 8,
+ 36,
+ 4,
+ 5,
+ 45,
+ 3,
+ 5,
+ 58,
+ 0,
+ 6,
+ 85,
+ 0,
+ 4,
+ 115,
+ 0,
+ 12,
+ 19,
+ 19,
+ 19,
+ 23,
+ 20,
+ 19,
+ 26,
+ 20,
+ 18,
+ 26,
+ 19,
+ 15,
+ 28,
+ 18,
+ 14,
+ 31,
+ 16,
+ 10,
+ 33,
+ 12,
+ 6,
+ 38,
+ 11,
+ 5,
+ 46,
+ 10,
+ 4,
+ 47,
+ 3,
+ 11,
+ 68,
+ 0,
+ 7,
+ 92,
+ 0,
+ 5,
+ 19,
+ 19,
+ 19,
+ 22,
+ 20,
+ 18,
+ 25,
+ 21,
+ 17,
+ 25,
+ 19,
+ 14,
+ 29,
+ 20,
+ 12,
+ 30,
+ 18,
+ 9,
+ 32,
+ 16,
+ 6,
+ 36,
+ 16,
+ 5,
+ 32,
+ 11,
+ 10,
+ 38,
+ 9,
+ 8,
+ 50,
+ 3,
+ 4,
+ 63,
+ 0,
+ 0,
+ 19,
+ 19,
+ 19,
+ 22,
+ 20,
+ 18,
+ 25,
+ 21,
+ 17,
+ 25,
+ 20,
+ 14,
+ 28,
+ 20,
+ 12,
+ 29,
+ 19,
+ 8,
+ 31,
+ 19,
+ 6,
+ 27,
+ 15,
+ 4,
+ 28,
+ 14,
+ 10,
+ 31,
+ 12,
+ 7,
+ 39,
+ 9,
+ 2,
+ 47,
+ 6,
+ 0,
+ 19,
+ 19,
+ 19,
+ 22,
+ 21,
+ 18,
+ 25,
+ 22,
+ 16,
+ 25,
+ 22,
+ 14,
+ 26,
+ 21,
+ 10,
+ 28,
+ 21,
+ 7,
+ 31,
+ 22,
+ 6,
+ 24,
+ 17,
+ 3,
+ 24,
+ 16,
+ 9,
+ 26,
+ 15,
+ 7,
+ 31,
+ 14,
+ 1,
+ 36,
+ 12,
+ 0,
+ 19,
+ 19,
+ 19,
+ 22,
+ 21,
+ 18,
+ 24,
+ 22,
+ 16,
+ 24,
+ 22,
+ 13,
+ 23,
+ 21,
+ 8,
+ 25,
+ 22,
+ 7,
+ 29,
+ 24,
+ 6,
+ 22,
+ 18,
+ 3,
+ 21,
+ 17,
+ 9,
+ 22,
+ 17,
+ 6,
+ 25,
+ 17,
+ 1,
+ 28,
+ 17,
+ 0,
+ 19,
+ 19,
+ 19,
+ 21,
+ 21,
+ 17,
+ 22,
+ 23,
+ 15,
+ 21,
+ 22,
+ 11,
+ 19,
+ 21,
+ 7,
+ 21,
+ 23,
+ 6,
+ 25,
+ 25,
+ 6,
+ 20,
+ 19,
+ 3,
+ 17,
+ 19,
+ 9,
+ 18,
+ 19,
+ 6,
+ 19,
+ 20,
+ 1,
+ 20,
+ 20,
+ 0,
+ 19,
+ 19,
+ 19,
+ 19,
+ 21,
+ 17,
+ 19,
+ 22,
+ 14,
+ 18,
+ 22,
+ 10,
+ 16,
+ 22,
+ 7,
+ 18,
+ 24,
+ 6,
+ 21,
+ 26,
+ 6,
+ 17,
+ 20,
+ 3,
+ 14,
+ 21,
+ 9,
+ 14,
+ 21,
+ 6,
+ 13,
+ 23,
+ 1,
+ 13,
+ 24,
+ 0,
+ 19,
+ 19,
+ 19,
+ 18,
+ 21,
+ 16,
+ 16,
+ 22,
+ 13,
+ 14,
+ 22,
+ 10,
+ 15,
+ 23,
+ 8,
+ 15,
+ 24,
+ 6,
+ 16,
+ 27,
+ 6,
+ 14,
+ 22,
+ 4,
+ 10,
+ 23,
+ 10,
+ 9,
+ 24,
+ 7,
+ 7,
+ 26,
+ 2,
+ 5,
+ 28,
+ 0,
+ 19,
+ 19,
+ 19,
+ 17,
+ 21,
+ 16,
+ 14,
+ 22,
+ 12,
+ 13,
+ 22,
+ 10,
+ 12,
+ 23,
+ 9,
+ 12,
+ 24,
+ 7,
+ 13,
+ 28,
+ 7,
+ 11,
+ 23,
+ 6,
+ 9,
+ 25,
+ 2,
+ 4,
+ 26,
+ 8,
+ 1,
+ 29,
+ 4,
+ 0,
+ 31,
+ 0,
+ 19,
+ 19,
+ 19,
+ 16,
+ 21,
+ 16,
+ 13,
+ 22,
+ 12,
+ 12,
+ 22,
+ 11,
+ 11,
+ 23,
+ 10,
+ 11,
+ 25,
+ 9,
+ 10,
+ 29,
+ 9,
+ 9,
+ 23,
+ 8,
+ 6,
+ 26,
+ 4,
+ 3,
+ 28,
+ 2,
+ 0,
+ 31,
+ 7,
+ 8,
+ 24,
+ 4,
+ 19,
+ 19,
+ 19,
+ 16,
+ 21,
+ 17,
+ 12,
+ 22,
+ 14,
+ 11,
+ 22,
+ 12,
+ 11,
+ 24,
+ 12,
+ 10,
+ 26,
+ 11,
+ 10,
+ 22,
+ 11,
+ 8,
+ 24,
+ 10,
+ 4,
+ 26,
+ 7,
+ 1,
+ 28,
+ 4,
+ 0,
+ 32,
+ 1,
+ 6,
+ 25,
+ 8,
+ 19,
+ 19,
+ 19,
+ 16,
+ 21,
+ 18,
+ 12,
+ 22,
+ 16,
+ 11,
+ 22,
+ 16,
+ 10,
+ 25,
+ 17,
+ 9,
+ 28,
+ 19,
+ 8,
+ 23,
+ 15,
+ 5,
+ 24,
+ 14,
+ 1,
+ 27,
+ 12,
+ 0,
+ 29,
+ 11,
+ 0,
+ 32,
+ 8,
+ 5,
+ 26,
+ 6,
+ 19,
+ 19,
+ 19,
+ 16,
+ 20,
+ 19,
+ 12,
+ 21,
+ 18,
+ 11,
+ 22,
+ 18,
+ 10,
+ 25,
+ 20,
+ 10,
+ 21,
+ 17,
+ 7,
+ 23,
+ 17,
+ 4,
+ 24,
+ 16,
+ 0,
+ 27,
+ 16,
+ 0,
+ 29,
+ 15,
+ 0,
+ 32,
+ 14,
+ 3,
+ 26,
+ 13,
+ 19,
+ 19,
+ 19,
+ 16,
+ 20,
+ 20,
+ 12,
+ 21,
+ 20,
+ 11,
+ 22,
+ 20,
+ 11,
+ 25,
+ 23,
+ 10,
+ 21,
+ 19,
+ 6,
+ 23,
+ 20,
+ 4,
+ 24,
+ 19,
+ 0,
+ 27,
+ 20,
+ 0,
+ 29,
+ 20,
+ 0,
+ 31,
+ 22,
+ 0,
+ 25,
+ 24,
+ 19,
+ 19,
+ 19,
+ 16,
+ 20,
+ 21,
+ 12,
+ 21,
+ 22,
+ 11,
+ 21,
+ 24,
+ 11,
+ 23,
+ 27,
+ 9,
+ 20,
+ 24,
+ 5,
+ 22,
+ 26,
+ 2,
+ 23,
+ 28,
+ 0,
+ 26,
+ 32,
+ 0,
+ 28,
+ 37,
+ 0,
+ 30,
+ 51,
+ 0,
+ 23,
+ 68,
+ 19,
+ 19,
+ 19,
+ 16,
+ 20,
+ 21,
+ 13,
+ 20,
+ 23,
+ 12,
+ 20,
+ 25,
+ 11,
+ 22,
+ 29,
+ 10,
+ 24,
+ 33,
+ 5,
+ 21,
+ 31,
+ 1,
+ 22,
+ 34,
+ 0,
+ 25,
+ 41,
+ 0,
+ 27,
+ 50,
+ 0,
+ 29,
+ 74,
+ 0,
+ 22,
+ 105,
+ 19,
+ 19,
+ 19,
+ 16,
+ 19,
+ 22,
+ 13,
+ 19,
+ 24,
+ 12,
+ 19,
+ 26,
+ 12,
+ 21,
+ 31,
+ 11,
+ 22,
+ 36,
+ 6,
+ 19,
+ 35,
+ 2,
+ 21,
+ 42,
+ 0,
+ 23,
+ 55,
+ 0,
+ 24,
+ 70,
+ 0,
+ 26,
+ 112,
+ 0,
+ 27,
+ 167,
+ 19,
+ 19,
+ 19,
+ 17,
+ 19,
+ 22,
+ 14,
+ 19,
+ 25,
+ 13,
+ 19,
+ 28,
+ 12,
+ 18,
+ 31,
+ 12,
+ 20,
+ 37,
+ 8,
+ 18,
+ 38,
+ 4,
+ 19,
+ 47,
+ 0,
+ 20,
+ 67,
+ 0,
+ 21,
+ 92,
+ 0,
+ 21,
+ 160,
+ 0,
+ 21,
+ 253,
+ 19,
+ 19,
+ 19,
+ 18,
+ 19,
+ 23,
+ 16,
+ 19,
+ 26,
+ 14,
+ 17,
+ 29,
+ 12,
+ 15,
+ 30,
+ 12,
+ 17,
+ 37,
+ 11,
+ 17,
+ 39,
+ 7,
+ 17,
+ 48,
+ 0,
+ 17,
+ 72,
+ 0,
+ 17,
+ 102,
+ 0,
+ 15,
+ 185,
+ 0,
+ 13,
+ 255,
+ 19,
+ 19,
+ 19,
+ 19,
+ 19,
+ 23,
+ 18,
+ 19,
+ 27,
+ 15,
+ 16,
+ 29,
+ 11,
+ 12,
+ 28,
+ 11,
+ 11,
+ 33,
+ 12,
+ 14,
+ 46,
+ 11,
+ 15,
+ 48,
+ 4,
+ 14,
+ 72,
+ 0,
+ 13,
+ 102,
+ 0,
+ 9,
+ 186,
+ 0,
+ 0,
+ 255,
+ 19,
+ 19,
+ 19,
+ 20,
+ 19,
+ 23,
+ 20,
+ 19,
+ 27,
+ 16,
+ 15,
+ 28,
+ 13,
+ 11,
+ 28,
+ 14,
+ 11,
+ 35,
+ 12,
+ 8,
+ 39,
+ 14,
+ 11,
+ 58,
+ 12,
+ 11,
+ 66,
+ 9,
+ 7,
+ 91,
+ 0,
+ 0,
+ 158,
+ 0,
+ 0,
+ 254,
+ 19,
+ 19,
+ 19,
+ 21,
+ 19,
+ 23,
+ 22,
+ 19,
+ 27,
+ 19,
+ 15,
+ 27,
+ 18,
+ 14,
+ 31,
+ 18,
+ 11,
+ 35,
+ 17,
+ 8,
+ 40,
+ 19,
+ 8,
+ 53,
+ 20,
+ 8,
+ 58,
+ 19,
+ 4,
+ 80,
+ 14,
+ 0,
+ 137,
+ 5,
+ 0,
+ 215,
+ 19,
+ 19,
+ 19,
+ 21,
+ 19,
+ 23,
+ 23,
+ 18,
+ 26,
+ 21,
+ 16,
+ 27,
+ 23,
+ 15,
+ 32,
+ 22,
+ 12,
+ 34,
+ 25,
+ 11,
+ 44,
+ 25,
+ 8,
+ 51,
+ 25,
+ 7,
+ 53,
+ 27,
+ 2,
+ 70,
+ 29,
+ 0,
+ 116,
+ 29,
+ 0,
+ 179,
+ 19,
+ 19,
+ 19,
+ 22,
+ 19,
+ 22,
+ 24,
+ 18,
+ 25,
+ 24,
+ 17,
+ 27,
+ 25,
+ 15,
+ 30,
+ 26,
+ 14,
+ 35,
+ 26,
+ 9,
+ 38,
+ 30,
+ 7,
+ 48,
+ 29,
+ 6,
+ 47,
+ 34,
+ 1,
+ 61,
+ 43,
+ 0,
+ 97,
+ 52,
+ 0,
+ 145,
+ 19,
+ 19,
+ 19,
+ 22,
+ 19,
+ 22,
+ 25,
+ 18,
+ 24,
+ 26,
+ 17,
+ 26,
+ 27,
+ 16,
+ 28,
+ 29,
+ 13,
+ 31,
+ 29,
+ 9,
+ 34,
+ 32,
+ 5,
+ 39,
+ 34,
+ 4,
+ 41,
+ 40,
+ 0,
+ 51,
+ 55,
+ 0,
+ 78,
+ 73,
+ 0,
+ 112,
+ 19,
+ 19,
+ 19,
+ 23,
+ 19,
+ 22,
+ 26,
+ 19,
+ 24,
+ 27,
+ 18,
+ 24,
+ 31,
+ 18,
+ 28,
+ 29,
+ 12,
+ 27,
+ 28,
+ 6,
+ 25,
+ 33,
+ 2,
+ 29,
+ 38,
+ 4,
+ 35,
+ 47,
+ 0,
+ 42,
+ 67,
+ 0,
+ 59,
+ 93,
+ 0,
+ 80,
+ 29,
+ 29,
+ 29,
+ 31,
+ 28,
+ 29,
+ 32,
+ 26,
+ 29,
+ 34,
+ 25,
+ 30,
+ 36,
+ 24,
+ 31,
+ 39,
+ 20,
+ 32,
+ 41,
+ 14,
+ 31,
+ 50,
+ 10,
+ 35,
+ 53,
+ 4,
+ 36,
+ 68,
+ 0,
+ 44,
+ 98,
+ 0,
+ 57,
+ 135,
+ 0,
+ 70,
+ 29,
+ 29,
+ 29,
+ 31,
+ 28,
+ 29,
+ 33,
+ 26,
+ 28,
+ 34,
+ 25,
+ 28,
+ 36,
+ 23,
+ 27,
+ 41,
+ 22,
+ 28,
+ 45,
+ 18,
+ 27,
+ 51,
+ 10,
+ 25,
+ 55,
+ 2,
+ 23,
+ 74,
+ 0,
+ 32,
+ 108,
+ 0,
+ 37,
+ 150,
+ 0,
+ 41,
+ 29,
+ 29,
+ 29,
+ 31,
+ 28,
+ 28,
+ 33,
+ 27,
+ 27,
+ 34,
+ 25,
+ 26,
+ 37,
+ 25,
+ 26,
+ 40,
+ 22,
+ 24,
+ 45,
+ 19,
+ 23,
+ 50,
+ 12,
+ 18,
+ 56,
+ 4,
+ 14,
+ 78,
+ 0,
+ 18,
+ 114,
+ 0,
+ 18,
+ 157,
+ 0,
+ 17,
+ 29,
+ 29,
+ 29,
+ 31,
+ 28,
+ 28,
+ 33,
+ 27,
+ 26,
+ 34,
+ 26,
+ 24,
+ 36,
+ 25,
+ 23,
+ 38,
+ 23,
+ 20,
+ 43,
+ 20,
+ 17,
+ 49,
+ 14,
+ 12,
+ 54,
+ 7,
+ 8,
+ 68,
+ 3,
+ 8,
+ 109,
+ 0,
+ 6,
+ 148,
+ 0,
+ 4,
+ 29,
+ 29,
+ 29,
+ 31,
+ 28,
+ 27,
+ 33,
+ 27,
+ 25,
+ 33,
+ 26,
+ 23,
+ 35,
+ 26,
+ 20,
+ 38,
+ 24,
+ 16,
+ 43,
+ 20,
+ 11,
+ 44,
+ 13,
+ 5,
+ 54,
+ 11,
+ 4,
+ 66,
+ 9,
+ 3,
+ 85,
+ 0,
+ 15,
+ 113,
+ 0,
+ 12,
+ 29,
+ 29,
+ 29,
+ 31,
+ 28,
+ 27,
+ 32,
+ 27,
+ 24,
+ 33,
+ 27,
+ 21,
+ 34,
+ 26,
+ 18,
+ 37,
+ 24,
+ 12,
+ 38,
+ 20,
+ 6,
+ 43,
+ 20,
+ 4,
+ 52,
+ 21,
+ 3,
+ 48,
+ 15,
+ 16,
+ 62,
+ 9,
+ 11,
+ 76,
+ 3,
+ 7,
+ 29,
+ 29,
+ 29,
+ 31,
+ 29,
+ 27,
+ 32,
+ 28,
+ 24,
+ 32,
+ 28,
+ 20,
+ 34,
+ 28,
+ 16,
+ 35,
+ 26,
+ 10,
+ 38,
+ 25,
+ 6,
+ 41,
+ 25,
+ 4,
+ 40,
+ 22,
+ 2,
+ 40,
+ 20,
+ 15,
+ 48,
+ 17,
+ 10,
+ 56,
+ 13,
+ 5,
+ 29,
+ 29,
+ 29,
+ 30,
+ 29,
+ 26,
+ 31,
+ 29,
+ 23,
+ 31,
+ 28,
+ 20,
+ 34,
+ 29,
+ 15,
+ 34,
+ 28,
+ 9,
+ 35,
+ 28,
+ 6,
+ 39,
+ 29,
+ 4,
+ 36,
+ 25,
+ 2,
+ 33,
+ 23,
+ 14,
+ 38,
+ 22,
+ 9,
+ 43,
+ 20,
+ 3,
+ 29,
+ 29,
+ 29,
+ 30,
+ 30,
+ 26,
+ 31,
+ 30,
+ 23,
+ 31,
+ 30,
+ 19,
+ 31,
+ 30,
+ 13,
+ 31,
+ 30,
+ 8,
+ 34,
+ 31,
+ 6,
+ 37,
+ 33,
+ 4,
+ 32,
+ 27,
+ 1,
+ 28,
+ 26,
+ 14,
+ 31,
+ 26,
+ 9,
+ 33,
+ 26,
+ 3,
+ 29,
+ 29,
+ 29,
+ 30,
+ 30,
+ 26,
+ 30,
+ 30,
+ 23,
+ 30,
+ 31,
+ 19,
+ 28,
+ 31,
+ 13,
+ 27,
+ 31,
+ 8,
+ 29,
+ 32,
+ 6,
+ 33,
+ 35,
+ 4,
+ 28,
+ 29,
+ 1,
+ 23,
+ 28,
+ 14,
+ 24,
+ 29,
+ 8,
+ 24,
+ 30,
+ 3,
+ 29,
+ 29,
+ 29,
+ 29,
+ 30,
+ 26,
+ 28,
+ 31,
+ 22,
+ 27,
+ 31,
+ 19,
+ 26,
+ 32,
+ 14,
+ 24,
+ 31,
+ 8,
+ 24,
+ 33,
+ 6,
+ 27,
+ 36,
+ 4,
+ 24,
+ 31,
+ 2,
+ 18,
+ 31,
+ 14,
+ 16,
+ 33,
+ 9,
+ 14,
+ 35,
+ 3,
+ 29,
+ 29,
+ 29,
+ 28,
+ 30,
+ 26,
+ 27,
+ 31,
+ 22,
+ 26,
+ 32,
+ 20,
+ 24,
+ 33,
+ 15,
+ 19,
+ 31,
+ 8,
+ 19,
+ 33,
+ 5,
+ 21,
+ 37,
+ 4,
+ 19,
+ 33,
+ 3,
+ 12,
+ 34,
+ 15,
+ 8,
+ 37,
+ 10,
+ 5,
+ 40,
+ 4,
+ 29,
+ 29,
+ 29,
+ 28,
+ 30,
+ 26,
+ 26,
+ 31,
+ 23,
+ 24,
+ 32,
+ 20,
+ 22,
+ 34,
+ 17,
+ 15,
+ 31,
+ 9,
+ 13,
+ 33,
+ 6,
+ 13,
+ 37,
+ 4,
+ 14,
+ 35,
+ 4,
+ 11,
+ 37,
+ 1,
+ 1,
+ 40,
+ 12,
+ 0,
+ 44,
+ 7,
+ 29,
+ 29,
+ 29,
+ 27,
+ 30,
+ 26,
+ 25,
+ 31,
+ 23,
+ 23,
+ 32,
+ 21,
+ 18,
+ 32,
+ 17,
+ 13,
+ 32,
+ 12,
+ 10,
+ 33,
+ 8,
+ 8,
+ 39,
+ 6,
+ 10,
+ 37,
+ 8,
+ 6,
+ 39,
+ 4,
+ 0,
+ 43,
+ 15,
+ 0,
+ 46,
+ 12,
+ 29,
+ 29,
+ 29,
+ 27,
+ 30,
+ 27,
+ 24,
+ 31,
+ 24,
+ 22,
+ 33,
+ 22,
+ 15,
+ 31,
+ 17,
+ 11,
+ 32,
+ 13,
+ 8,
+ 35,
+ 11,
+ 12,
+ 34,
+ 15,
+ 7,
+ 37,
+ 12,
+ 2,
+ 40,
+ 9,
+ 0,
+ 45,
+ 4,
+ 0,
+ 48,
+ 0,
+ 29,
+ 29,
+ 29,
+ 26,
+ 30,
+ 28,
+ 23,
+ 31,
+ 26,
+ 18,
+ 32,
+ 25,
+ 12,
+ 30,
+ 21,
+ 7,
+ 31,
+ 19,
+ 13,
+ 32,
+ 22,
+ 9,
+ 34,
+ 21,
+ 3,
+ 38,
+ 19,
+ 0,
+ 41,
+ 17,
+ 0,
+ 45,
+ 14,
+ 0,
+ 48,
+ 11,
+ 29,
+ 29,
+ 29,
+ 26,
+ 30,
+ 29,
+ 22,
+ 31,
+ 28,
+ 18,
+ 32,
+ 27,
+ 12,
+ 31,
+ 24,
+ 7,
+ 32,
+ 23,
+ 12,
+ 32,
+ 24,
+ 8,
+ 34,
+ 24,
+ 2,
+ 38,
+ 23,
+ 0,
+ 40,
+ 22,
+ 0,
+ 45,
+ 21,
+ 11,
+ 33,
+ 21,
+ 29,
+ 29,
+ 29,
+ 26,
+ 30,
+ 30,
+ 22,
+ 31,
+ 30,
+ 18,
+ 31,
+ 29,
+ 12,
+ 30,
+ 27,
+ 7,
+ 32,
+ 27,
+ 11,
+ 32,
+ 27,
+ 7,
+ 34,
+ 27,
+ 0,
+ 37,
+ 28,
+ 0,
+ 40,
+ 29,
+ 0,
+ 44,
+ 31,
+ 0,
+ 47,
+ 34,
+ 29,
+ 29,
+ 29,
+ 26,
+ 30,
+ 31,
+ 23,
+ 31,
+ 32,
+ 20,
+ 31,
+ 34,
+ 12,
+ 28,
+ 33,
+ 8,
+ 30,
+ 35,
+ 10,
+ 31,
+ 35,
+ 5,
+ 33,
+ 36,
+ 0,
+ 36,
+ 42,
+ 0,
+ 39,
+ 48,
+ 0,
+ 43,
+ 63,
+ 0,
+ 45,
+ 82,
+ 29,
+ 29,
+ 29,
+ 27,
+ 30,
+ 32,
+ 24,
+ 30,
+ 34,
+ 21,
+ 30,
+ 36,
+ 14,
+ 28,
+ 37,
+ 9,
+ 28,
+ 39,
+ 10,
+ 30,
+ 39,
+ 5,
+ 32,
+ 42,
+ 0,
+ 35,
+ 51,
+ 0,
+ 38,
+ 61,
+ 0,
+ 41,
+ 87,
+ 0,
+ 43,
+ 119,
+ 29,
+ 29,
+ 29,
+ 27,
+ 29,
+ 32,
+ 25,
+ 29,
+ 34,
+ 22,
+ 30,
+ 38,
+ 16,
+ 27,
+ 39,
+ 11,
+ 26,
+ 43,
+ 9,
+ 31,
+ 53,
+ 5,
+ 30,
+ 52,
+ 0,
+ 33,
+ 66,
+ 0,
+ 36,
+ 82,
+ 0,
+ 39,
+ 125,
+ 0,
+ 40,
+ 181,
+ 29,
+ 29,
+ 29,
+ 28,
+ 29,
+ 32,
+ 26,
+ 29,
+ 35,
+ 24,
+ 29,
+ 38,
+ 18,
+ 26,
+ 40,
+ 14,
+ 24,
+ 46,
+ 10,
+ 25,
+ 53,
+ 7,
+ 28,
+ 60,
+ 0,
+ 30,
+ 82,
+ 0,
+ 31,
+ 108,
+ 0,
+ 33,
+ 179,
+ 0,
+ 33,
+ 255,
+ 29,
+ 29,
+ 29,
+ 28,
+ 29,
+ 32,
+ 27,
+ 29,
+ 35,
+ 24,
+ 27,
+ 38,
+ 22,
+ 26,
+ 42,
+ 18,
+ 25,
+ 49,
+ 12,
+ 21,
+ 54,
+ 11,
+ 25,
+ 63,
+ 0,
+ 26,
+ 90,
+ 0,
+ 26,
+ 124,
+ 0,
+ 26,
+ 215,
+ 0,
+ 23,
+ 255,
+ 29,
+ 29,
+ 29,
+ 29,
+ 29,
+ 32,
+ 28,
+ 28,
+ 35,
+ 27,
+ 28,
+ 39,
+ 24,
+ 26,
+ 43,
+ 22,
+ 25,
+ 50,
+ 18,
+ 22,
+ 59,
+ 14,
+ 22,
+ 73,
+ 8,
+ 21,
+ 91,
+ 0,
+ 19,
+ 126,
+ 0,
+ 13,
+ 219,
+ 0,
+ 7,
+ 255,
+ 29,
+ 29,
+ 29,
+ 29,
+ 29,
+ 32,
+ 29,
+ 28,
+ 35,
+ 28,
+ 27,
+ 38,
+ 27,
+ 26,
+ 43,
+ 26,
+ 25,
+ 51,
+ 22,
+ 20,
+ 58,
+ 20,
+ 18,
+ 68,
+ 18,
+ 17,
+ 85,
+ 13,
+ 14,
+ 117,
+ 0,
+ 6,
+ 200,
+ 0,
+ 0,
+ 255,
+ 29,
+ 29,
+ 29,
+ 30,
+ 28,
+ 32,
+ 30,
+ 27,
+ 35,
+ 29,
+ 26,
+ 38,
+ 28,
+ 25,
+ 42,
+ 28,
+ 22,
+ 47,
+ 28,
+ 20,
+ 58,
+ 26,
+ 19,
+ 57,
+ 25,
+ 15,
+ 79,
+ 23,
+ 10,
+ 106,
+ 15,
+ 1,
+ 177,
+ 1,
+ 0,
+ 255,
+ 29,
+ 29,
+ 29,
+ 30,
+ 28,
+ 32,
+ 30,
+ 27,
+ 34,
+ 30,
+ 25,
+ 37,
+ 31,
+ 24,
+ 41,
+ 31,
+ 22,
+ 46,
+ 32,
+ 20,
+ 55,
+ 33,
+ 16,
+ 64,
+ 32,
+ 13,
+ 72,
+ 34,
+ 8,
+ 94,
+ 34,
+ 0,
+ 153,
+ 31,
+ 0,
+ 231,
+ 29,
+ 29,
+ 29,
+ 30,
+ 28,
+ 31,
+ 31,
+ 26,
+ 33,
+ 32,
+ 26,
+ 36,
+ 33,
+ 24,
+ 39,
+ 34,
+ 22,
+ 43,
+ 36,
+ 19,
+ 50,
+ 38,
+ 15,
+ 59,
+ 38,
+ 11,
+ 64,
+ 43,
+ 5,
+ 82,
+ 52,
+ 0,
+ 129,
+ 60,
+ 0,
+ 189,
+ 29,
+ 29,
+ 29,
+ 31,
+ 28,
+ 31,
+ 32,
+ 26,
+ 32,
+ 33,
+ 26,
+ 34,
+ 35,
+ 24,
+ 37,
+ 36,
+ 22,
+ 40,
+ 39,
+ 19,
+ 46,
+ 41,
+ 13,
+ 51,
+ 44,
+ 9,
+ 56,
+ 52,
+ 3,
+ 70,
+ 68,
+ 0,
+ 105,
+ 87,
+ 0,
+ 148,
+ 29,
+ 29,
+ 29,
+ 31,
+ 27,
+ 30,
+ 32,
+ 25,
+ 30,
+ 31,
+ 23,
+ 29,
+ 35,
+ 24,
+ 34,
+ 39,
+ 23,
+ 37,
+ 42,
+ 18,
+ 39,
+ 47,
+ 11,
+ 43,
+ 51,
+ 8,
+ 47,
+ 61,
+ 1,
+ 57,
+ 84,
+ 0,
+ 80,
+ 112,
+ 0,
+ 108,
+ 40,
+ 40,
+ 40,
+ 41,
+ 38,
+ 40,
+ 42,
+ 35,
+ 40,
+ 44,
+ 34,
+ 40,
+ 45,
+ 32,
+ 41,
+ 49,
+ 29,
+ 42,
+ 53,
+ 25,
+ 43,
+ 62,
+ 19,
+ 47,
+ 64,
+ 9,
+ 45,
+ 87,
+ 4,
+ 59,
+ 122,
+ 0,
+ 75,
+ 164,
+ 0,
+ 93,
+ 40,
+ 40,
+ 40,
+ 41,
+ 38,
+ 39,
+ 42,
+ 36,
+ 38,
+ 44,
+ 35,
+ 38,
+ 46,
+ 33,
+ 37,
+ 49,
+ 30,
+ 37,
+ 54,
+ 26,
+ 36,
+ 63,
+ 20,
+ 36,
+ 71,
+ 9,
+ 35,
+ 95,
+ 3,
+ 43,
+ 135,
+ 0,
+ 50,
+ 183,
+ 0,
+ 56,
+ 40,
+ 40,
+ 40,
+ 41,
+ 38,
+ 39,
+ 42,
+ 36,
+ 37,
+ 44,
+ 35,
+ 36,
+ 47,
+ 34,
+ 35,
+ 49,
+ 31,
+ 33,
+ 53,
+ 27,
+ 30,
+ 62,
+ 23,
+ 28,
+ 72,
+ 13,
+ 25,
+ 81,
+ 3,
+ 21,
+ 142,
+ 0,
+ 26,
+ 193,
+ 0,
+ 25,
+ 40,
+ 40,
+ 40,
+ 41,
+ 39,
+ 38,
+ 42,
+ 37,
+ 35,
+ 44,
+ 36,
+ 34,
+ 45,
+ 34,
+ 31,
+ 47,
+ 31,
+ 28,
+ 52,
+ 29,
+ 24,
+ 59,
+ 24,
+ 20,
+ 71,
+ 18,
+ 16,
+ 79,
+ 8,
+ 12,
+ 137,
+ 0,
+ 10,
+ 183,
+ 0,
+ 7,
+ 40,
+ 40,
+ 40,
+ 41,
+ 39,
+ 37,
+ 42,
+ 37,
+ 34,
+ 43,
+ 36,
+ 31,
+ 44,
+ 34,
+ 28,
+ 48,
+ 34,
+ 25,
+ 52,
+ 31,
+ 21,
+ 58,
+ 27,
+ 15,
+ 62,
+ 18,
+ 7,
+ 74,
+ 11,
+ 4,
+ 106,
+ 1,
+ 25,
+ 139,
+ 0,
+ 23,
+ 40,
+ 40,
+ 40,
+ 41,
+ 39,
+ 36,
+ 41,
+ 37,
+ 32,
+ 43,
+ 37,
+ 30,
+ 43,
+ 35,
+ 26,
+ 46,
+ 34,
+ 21,
+ 50,
+ 31,
+ 14,
+ 52,
+ 25,
+ 7,
+ 59,
+ 24,
+ 3,
+ 70,
+ 24,
+ 2,
+ 77,
+ 16,
+ 21,
+ 94,
+ 9,
+ 17,
+ 40,
+ 40,
+ 40,
+ 40,
+ 39,
+ 36,
+ 40,
+ 37,
+ 31,
+ 41,
+ 37,
+ 29,
+ 42,
+ 36,
+ 25,
+ 46,
+ 36,
+ 19,
+ 46,
+ 31,
+ 8,
+ 50,
+ 30,
+ 4,
+ 54,
+ 32,
+ 4,
+ 51,
+ 29,
+ 25,
+ 60,
+ 25,
+ 20,
+ 70,
+ 22,
+ 14,
+ 40,
+ 40,
+ 40,
+ 40,
+ 39,
+ 36,
+ 40,
+ 38,
+ 31,
+ 41,
+ 38,
+ 28,
+ 42,
+ 38,
+ 24,
+ 44,
+ 37,
+ 16,
+ 43,
+ 34,
+ 7,
+ 47,
+ 34,
+ 4,
+ 48,
+ 35,
+ 4,
+ 43,
+ 33,
+ 24,
+ 48,
+ 32,
+ 19,
+ 53,
+ 30,
+ 13,
+ 40,
+ 40,
+ 40,
+ 40,
+ 40,
+ 36,
+ 39,
+ 39,
+ 31,
+ 40,
+ 39,
+ 27,
+ 40,
+ 39,
+ 23,
+ 42,
+ 40,
+ 15,
+ 42,
+ 39,
+ 7,
+ 45,
+ 41,
+ 4,
+ 43,
+ 37,
+ 4,
+ 37,
+ 36,
+ 24,
+ 39,
+ 36,
+ 18,
+ 41,
+ 37,
+ 13,
+ 40,
+ 40,
+ 40,
+ 40,
+ 40,
+ 36,
+ 39,
+ 40,
+ 31,
+ 39,
+ 41,
+ 28,
+ 39,
+ 41,
+ 23,
+ 39,
+ 41,
+ 16,
+ 36,
+ 39,
+ 7,
+ 38,
+ 42,
+ 4,
+ 38,
+ 40,
+ 4,
+ 31,
+ 40,
+ 24,
+ 30,
+ 41,
+ 18,
+ 30,
+ 42,
+ 13,
+ 40,
+ 40,
+ 40,
+ 40,
+ 41,
+ 36,
+ 39,
+ 41,
+ 32,
+ 38,
+ 41,
+ 28,
+ 37,
+ 42,
+ 24,
+ 36,
+ 44,
+ 17,
+ 31,
+ 41,
+ 8,
+ 31,
+ 43,
+ 4,
+ 33,
+ 42,
+ 4,
+ 32,
+ 44,
+ 0,
+ 21,
+ 46,
+ 19,
+ 18,
+ 48,
+ 13,
+ 40,
+ 40,
+ 40,
+ 39,
+ 41,
+ 37,
+ 38,
+ 42,
+ 33,
+ 36,
+ 42,
+ 30,
+ 35,
+ 43,
+ 25,
+ 33,
+ 45,
+ 18,
+ 26,
+ 42,
+ 9,
+ 23,
+ 43,
+ 4,
+ 27,
+ 45,
+ 5,
+ 25,
+ 47,
+ 1,
+ 11,
+ 50,
+ 19,
+ 6,
+ 54,
+ 14,
+ 40,
+ 40,
+ 40,
+ 38,
+ 41,
+ 37,
+ 36,
+ 42,
+ 33,
+ 34,
+ 42,
+ 30,
+ 32,
+ 43,
+ 26,
+ 28,
+ 45,
+ 20,
+ 21,
+ 44,
+ 12,
+ 15,
+ 44,
+ 6,
+ 21,
+ 48,
+ 9,
+ 17,
+ 51,
+ 3,
+ 2,
+ 55,
+ 21,
+ 0,
+ 59,
+ 17,
+ 40,
+ 40,
+ 40,
+ 38,
+ 41,
+ 37,
+ 35,
+ 42,
+ 33,
+ 32,
+ 42,
+ 31,
+ 30,
+ 44,
+ 28,
+ 26,
+ 46,
+ 23,
+ 20,
+ 46,
+ 16,
+ 13,
+ 49,
+ 10,
+ 15,
+ 50,
+ 13,
+ 10,
+ 53,
+ 8,
+ 1,
+ 59,
+ 1,
+ 0,
+ 63,
+ 22,
+ 40,
+ 40,
+ 40,
+ 37,
+ 41,
+ 38,
+ 33,
+ 42,
+ 35,
+ 32,
+ 43,
+ 33,
+ 29,
+ 44,
+ 31,
+ 25,
+ 46,
+ 27,
+ 19,
+ 49,
+ 22,
+ 11,
+ 51,
+ 16,
+ 12,
+ 50,
+ 18,
+ 6,
+ 54,
+ 14,
+ 0,
+ 60,
+ 7,
+ 0,
+ 65,
+ 2,
+ 40,
+ 40,
+ 40,
+ 36,
+ 41,
+ 39,
+ 32,
+ 42,
+ 37,
+ 30,
+ 43,
+ 36,
+ 26,
+ 44,
+ 35,
+ 20,
+ 47,
+ 34,
+ 9,
+ 46,
+ 27,
+ 15,
+ 46,
+ 30,
+ 7,
+ 51,
+ 28,
+ 0,
+ 55,
+ 26,
+ 0,
+ 61,
+ 22,
+ 0,
+ 65,
+ 18,
+ 40,
+ 40,
+ 40,
+ 36,
+ 41,
+ 40,
+ 32,
+ 41,
+ 39,
+ 29,
+ 42,
+ 39,
+ 24,
+ 43,
+ 39,
+ 18,
+ 45,
+ 38,
+ 18,
+ 44,
+ 35,
+ 14,
+ 46,
+ 34,
+ 5,
+ 51,
+ 33,
+ 0,
+ 55,
+ 33,
+ 0,
+ 61,
+ 32,
+ 0,
+ 65,
+ 31,
+ 40,
+ 40,
+ 40,
+ 36,
+ 41,
+ 41,
+ 32,
+ 41,
+ 41,
+ 29,
+ 42,
+ 41,
+ 24,
+ 42,
+ 41,
+ 16,
+ 44,
+ 40,
+ 17,
+ 44,
+ 38,
+ 12,
+ 46,
+ 38,
+ 3,
+ 51,
+ 39,
+ 0,
+ 54,
+ 41,
+ 0,
+ 60,
+ 45,
+ 0,
+ 64,
+ 49,
+ 40,
+ 40,
+ 40,
+ 36,
+ 40,
+ 42,
+ 32,
+ 40,
+ 43,
+ 29,
+ 41,
+ 45,
+ 24,
+ 41,
+ 47,
+ 18,
+ 43,
+ 52,
+ 8,
+ 43,
+ 52,
+ 10,
+ 45,
+ 49,
+ 0,
+ 49,
+ 55,
+ 0,
+ 53,
+ 63,
+ 0,
+ 58,
+ 83,
+ 0,
+ 62,
+ 106,
+ 40,
+ 40,
+ 40,
+ 37,
+ 40,
+ 42,
+ 33,
+ 40,
+ 44,
+ 30,
+ 40,
+ 47,
+ 26,
+ 40,
+ 50,
+ 20,
+ 41,
+ 55,
+ 8,
+ 40,
+ 56,
+ 10,
+ 44,
+ 56,
+ 0,
+ 48,
+ 65,
+ 0,
+ 52,
+ 78,
+ 0,
+ 56,
+ 108,
+ 0,
+ 59,
+ 146,
+ 40,
+ 40,
+ 40,
+ 37,
+ 40,
+ 43,
+ 34,
+ 39,
+ 45,
+ 30,
+ 37,
+ 46,
+ 27,
+ 38,
+ 51,
+ 22,
+ 39,
+ 59,
+ 12,
+ 38,
+ 63,
+ 10,
+ 42,
+ 66,
+ 0,
+ 46,
+ 81,
+ 0,
+ 49,
+ 99,
+ 0,
+ 53,
+ 147,
+ 0,
+ 56,
+ 209,
+ 40,
+ 40,
+ 40,
+ 37,
+ 39,
+ 43,
+ 34,
+ 38,
+ 45,
+ 31,
+ 37,
+ 48,
+ 29,
+ 38,
+ 53,
+ 25,
+ 38,
+ 61,
+ 17,
+ 38,
+ 71,
+ 8,
+ 37,
+ 79,
+ 0,
+ 42,
+ 101,
+ 0,
+ 44,
+ 129,
+ 0,
+ 46,
+ 207,
+ 0,
+ 47,
+ 255,
+ 40,
+ 40,
+ 40,
+ 37,
+ 39,
+ 43,
+ 34,
+ 37,
+ 45,
+ 33,
+ 37,
+ 49,
+ 31,
+ 37,
+ 55,
+ 27,
+ 36,
+ 62,
+ 20,
+ 34,
+ 72,
+ 13,
+ 34,
+ 86,
+ 2,
+ 37,
+ 112,
+ 0,
+ 39,
+ 146,
+ 0,
+ 41,
+ 239,
+ 0,
+ 28,
+ 255,
+ 40,
+ 40,
+ 40,
+ 38,
+ 38,
+ 43,
+ 35,
+ 36,
+ 45,
+ 34,
+ 36,
+ 49,
+ 32,
+ 36,
+ 55,
+ 30,
+ 36,
+ 64,
+ 24,
+ 32,
+ 74,
+ 23,
+ 32,
+ 81,
+ 15,
+ 30,
+ 114,
+ 4,
+ 28,
+ 154,
+ 0,
+ 22,
+ 255,
+ 0,
+ 16,
+ 255,
+ 40,
+ 40,
+ 40,
+ 38,
+ 38,
+ 43,
+ 35,
+ 36,
+ 45,
+ 35,
+ 36,
+ 49,
+ 34,
+ 34,
+ 55,
+ 33,
+ 32,
+ 63,
+ 30,
+ 29,
+ 72,
+ 30,
+ 29,
+ 78,
+ 25,
+ 26,
+ 109,
+ 17,
+ 23,
+ 146,
+ 0,
+ 14,
+ 244,
+ 0,
+ 5,
+ 255,
+ 40,
+ 40,
+ 40,
+ 38,
+ 38,
+ 43,
+ 36,
+ 35,
+ 45,
+ 36,
+ 35,
+ 49,
+ 36,
+ 33,
+ 54,
+ 36,
+ 31,
+ 61,
+ 35,
+ 28,
+ 71,
+ 35,
+ 28,
+ 75,
+ 33,
+ 23,
+ 102,
+ 30,
+ 18,
+ 135,
+ 19,
+ 7,
+ 220,
+ 0,
+ 0,
+ 255,
+ 40,
+ 40,
+ 40,
+ 39,
+ 38,
+ 42,
+ 38,
+ 35,
+ 44,
+ 38,
+ 34,
+ 47,
+ 38,
+ 32,
+ 51,
+ 40,
+ 32,
+ 60,
+ 40,
+ 28,
+ 68,
+ 40,
+ 26,
+ 71,
+ 41,
+ 20,
+ 94,
+ 42,
+ 15,
+ 122,
+ 41,
+ 1,
+ 193,
+ 36,
+ 0,
+ 255,
+ 40,
+ 40,
+ 40,
+ 40,
+ 38,
+ 42,
+ 39,
+ 35,
+ 43,
+ 40,
+ 34,
+ 46,
+ 41,
+ 32,
+ 50,
+ 43,
+ 30,
+ 55,
+ 45,
+ 27,
+ 63,
+ 45,
+ 24,
+ 65,
+ 50,
+ 18,
+ 85,
+ 54,
+ 11,
+ 108,
+ 63,
+ 0,
+ 165,
+ 70,
+ 0,
+ 238,
+ 40,
+ 40,
+ 40,
+ 40,
+ 38,
+ 42,
+ 40,
+ 35,
+ 43,
+ 42,
+ 35,
+ 45,
+ 42,
+ 32,
+ 47,
+ 44,
+ 29,
+ 51,
+ 47,
+ 26,
+ 57,
+ 50,
+ 20,
+ 64,
+ 57,
+ 16,
+ 75,
+ 66,
+ 8,
+ 92,
+ 83,
+ 0,
+ 136,
+ 103,
+ 0,
+ 190,
+ 40,
+ 40,
+ 40,
+ 41,
+ 38,
+ 41,
+ 41,
+ 36,
+ 41,
+ 42,
+ 34,
+ 43,
+ 44,
+ 32,
+ 44,
+ 47,
+ 29,
+ 46,
+ 51,
+ 24,
+ 49,
+ 56,
+ 19,
+ 54,
+ 65,
+ 14,
+ 63,
+ 77,
+ 6,
+ 76,
+ 104,
+ 0,
+ 105,
+ 135,
+ 0,
+ 141,
+ 57,
+ 57,
+ 57,
+ 57,
+ 53,
+ 55,
+ 56,
+ 48,
+ 53,
+ 58,
+ 46,
+ 54,
+ 61,
+ 44,
+ 54,
+ 65,
+ 41,
+ 56,
+ 72,
+ 37,
+ 58,
+ 79,
+ 29,
+ 59,
+ 93,
+ 21,
+ 66,
+ 110,
+ 10,
+ 75,
+ 151,
+ 0,
+ 94,
+ 199,
+ 0,
+ 115,
+ 57,
+ 57,
+ 57,
+ 57,
+ 53,
+ 54,
+ 56,
+ 48,
+ 50,
+ 59,
+ 47,
+ 51,
+ 61,
+ 45,
+ 50,
+ 65,
+ 41,
+ 49,
+ 72,
+ 37,
+ 48,
+ 79,
+ 29,
+ 47,
+ 91,
+ 18,
+ 47,
+ 119,
+ 9,
+ 55,
+ 166,
+ 0,
+ 62,
+ 222,
+ 0,
+ 70,
+ 57,
+ 57,
+ 57,
+ 58,
+ 54,
+ 53,
+ 58,
+ 50,
+ 49,
+ 61,
+ 50,
+ 50,
+ 63,
+ 47,
+ 47,
+ 67,
+ 44,
+ 45,
+ 72,
+ 40,
+ 42,
+ 81,
+ 34,
+ 39,
+ 91,
+ 23,
+ 34,
+ 100,
+ 9,
+ 29,
+ 174,
+ 0,
+ 34,
+ 232,
+ 0,
+ 33,
+ 57,
+ 57,
+ 57,
+ 58,
+ 54,
+ 53,
+ 59,
+ 51,
+ 48,
+ 61,
+ 50,
+ 47,
+ 64,
+ 49,
+ 44,
+ 61,
+ 42,
+ 36,
+ 68,
+ 39,
+ 33,
+ 77,
+ 35,
+ 28,
+ 86,
+ 27,
+ 22,
+ 102,
+ 16,
+ 18,
+ 168,
+ 0,
+ 14,
+ 222,
+ 0,
+ 11,
+ 57,
+ 57,
+ 57,
+ 58,
+ 54,
+ 52,
+ 58,
+ 51,
+ 46,
+ 60,
+ 51,
+ 44,
+ 62,
+ 50,
+ 40,
+ 66,
+ 48,
+ 36,
+ 71,
+ 45,
+ 30,
+ 72,
+ 36,
+ 21,
+ 79,
+ 28,
+ 13,
+ 90,
+ 18,
+ 6,
+ 144,
+ 7,
+ 3,
+ 176,
+ 0,
+ 37,
+ 57,
+ 57,
+ 57,
+ 57,
+ 54,
+ 51,
+ 56,
+ 50,
+ 44,
+ 57,
+ 49,
+ 40,
+ 58,
+ 48,
+ 36,
+ 61,
+ 47,
+ 31,
+ 65,
+ 46,
+ 25,
+ 73,
+ 41,
+ 16,
+ 68,
+ 27,
+ 5,
+ 86,
+ 30,
+ 3,
+ 97,
+ 25,
+ 34,
+ 116,
+ 16,
+ 29,
+ 57,
+ 57,
+ 57,
+ 56,
+ 54,
+ 50,
+ 55,
+ 51,
+ 43,
+ 57,
+ 51,
+ 40,
+ 58,
+ 50,
+ 35,
+ 61,
+ 50,
+ 29,
+ 64,
+ 48,
+ 20,
+ 66,
+ 42,
+ 10,
+ 73,
+ 40,
+ 4,
+ 77,
+ 41,
+ 2,
+ 76,
+ 36,
+ 32,
+ 87,
+ 31,
+ 27,
+ 57,
+ 57,
+ 57,
+ 56,
+ 55,
+ 50,
+ 55,
+ 52,
+ 42,
+ 54,
+ 50,
+ 38,
+ 56,
+ 51,
+ 34,
+ 58,
+ 51,
+ 28,
+ 62,
+ 51,
+ 18,
+ 59,
+ 44,
+ 6,
+ 69,
+ 48,
+ 3,
+ 68,
+ 46,
+ 2,
+ 62,
+ 43,
+ 31,
+ 68,
+ 41,
+ 26,
+ 57,
+ 57,
+ 57,
+ 56,
+ 55,
+ 50,
+ 54,
+ 53,
+ 42,
+ 55,
+ 53,
+ 39,
+ 56,
+ 53,
+ 34,
+ 58,
+ 54,
+ 27,
+ 59,
+ 54,
+ 16,
+ 58,
+ 51,
+ 6,
+ 58,
+ 50,
+ 7,
+ 60,
+ 50,
+ 1,
+ 51,
+ 49,
+ 31,
+ 53,
+ 49,
+ 25,
+ 57,
+ 57,
+ 57,
+ 55,
+ 55,
+ 50,
+ 52,
+ 53,
+ 42,
+ 53,
+ 54,
+ 39,
+ 55,
+ 55,
+ 34,
+ 55,
+ 56,
+ 27,
+ 54,
+ 56,
+ 15,
+ 51,
+ 54,
+ 5,
+ 52,
+ 53,
+ 7,
+ 53,
+ 54,
+ 1,
+ 40,
+ 54,
+ 30,
+ 39,
+ 56,
+ 25,
+ 57,
+ 57,
+ 57,
+ 54,
+ 55,
+ 50,
+ 51,
+ 53,
+ 42,
+ 51,
+ 54,
+ 39,
+ 51,
+ 56,
+ 34,
+ 51,
+ 57,
+ 28,
+ 50,
+ 59,
+ 18,
+ 43,
+ 55,
+ 7,
+ 46,
+ 56,
+ 8,
+ 45,
+ 58,
+ 2,
+ 29,
+ 60,
+ 31,
+ 24,
+ 64,
+ 25,
+ 57,
+ 57,
+ 57,
+ 54,
+ 56,
+ 50,
+ 50,
+ 54,
+ 43,
+ 49,
+ 55,
+ 40,
+ 48,
+ 56,
+ 35,
+ 47,
+ 58,
+ 29,
+ 45,
+ 61,
+ 21,
+ 37,
+ 60,
+ 10,
+ 35,
+ 63,
+ 4,
+ 36,
+ 62,
+ 3,
+ 17,
+ 66,
+ 31,
+ 10,
+ 71,
+ 26,
+ 57,
+ 57,
+ 57,
+ 53,
+ 56,
+ 51,
+ 49,
+ 55,
+ 44,
+ 48,
+ 56,
+ 41,
+ 46,
+ 58,
+ 37,
+ 43,
+ 60,
+ 32,
+ 40,
+ 64,
+ 25,
+ 34,
+ 66,
+ 15,
+ 25,
+ 66,
+ 6,
+ 26,
+ 66,
+ 6,
+ 16,
+ 73,
+ 0,
+ 0,
+ 78,
+ 29,
+ 57,
+ 57,
+ 57,
+ 53,
+ 56,
+ 52,
+ 48,
+ 55,
+ 46,
+ 46,
+ 57,
+ 43,
+ 44,
+ 59,
+ 40,
+ 41,
+ 62,
+ 35,
+ 36,
+ 65,
+ 29,
+ 27,
+ 68,
+ 20,
+ 24,
+ 65,
+ 18,
+ 17,
+ 70,
+ 12,
+ 5,
+ 78,
+ 3,
+ 0,
+ 84,
+ 0,
+ 57,
+ 57,
+ 57,
+ 52,
+ 57,
+ 53,
+ 47,
+ 56,
+ 48,
+ 45,
+ 57,
+ 45,
+ 42,
+ 60,
+ 43,
+ 37,
+ 62,
+ 38,
+ 31,
+ 66,
+ 34,
+ 21,
+ 69,
+ 26,
+ 19,
+ 66,
+ 25,
+ 12,
+ 71,
+ 19,
+ 0,
+ 79,
+ 11,
+ 0,
+ 85,
+ 4,
+ 57,
+ 57,
+ 57,
+ 52,
+ 57,
+ 54,
+ 46,
+ 56,
+ 50,
+ 43,
+ 57,
+ 48,
+ 39,
+ 60,
+ 47,
+ 33,
+ 62,
+ 45,
+ 25,
+ 67,
+ 43,
+ 23,
+ 61,
+ 41,
+ 12,
+ 67,
+ 39,
+ 3,
+ 72,
+ 36,
+ 0,
+ 80,
+ 31,
+ 0,
+ 86,
+ 27,
+ 57,
+ 57,
+ 57,
+ 51,
+ 56,
+ 55,
+ 45,
+ 55,
+ 52,
+ 41,
+ 57,
+ 52,
+ 37,
+ 59,
+ 52,
+ 31,
+ 62,
+ 53,
+ 20,
+ 64,
+ 51,
+ 20,
+ 61,
+ 47,
+ 10,
+ 67,
+ 46,
+ 0,
+ 72,
+ 45,
+ 0,
+ 80,
+ 44,
+ 0,
+ 86,
+ 43,
+ 57,
+ 57,
+ 57,
+ 51,
+ 56,
+ 56,
+ 45,
+ 55,
+ 54,
+ 41,
+ 56,
+ 55,
+ 37,
+ 59,
+ 56,
+ 31,
+ 61,
+ 58,
+ 18,
+ 64,
+ 58,
+ 19,
+ 61,
+ 53,
+ 7,
+ 67,
+ 54,
+ 0,
+ 71,
+ 56,
+ 0,
+ 79,
+ 60,
+ 0,
+ 85,
+ 65,
+ 57,
+ 57,
+ 57,
+ 51,
+ 56,
+ 57,
+ 45,
+ 54,
+ 57,
+ 41,
+ 54,
+ 59,
+ 38,
+ 56,
+ 63,
+ 31,
+ 58,
+ 67,
+ 19,
+ 60,
+ 72,
+ 17,
+ 59,
+ 66,
+ 3,
+ 65,
+ 74,
+ 0,
+ 69,
+ 83,
+ 0,
+ 77,
+ 106,
+ 0,
+ 81,
+ 133,
+ 57,
+ 57,
+ 57,
+ 52,
+ 55,
+ 58,
+ 46,
+ 53,
+ 59,
+ 41,
+ 51,
+ 58,
+ 38,
+ 52,
+ 63,
+ 31,
+ 53,
+ 68,
+ 22,
+ 58,
+ 80,
+ 16,
+ 58,
+ 76,
+ 1,
+ 63,
+ 87,
+ 0,
+ 68,
+ 100,
+ 0,
+ 74,
+ 136,
+ 0,
+ 79,
+ 180,
+ 57,
+ 57,
+ 57,
+ 52,
+ 55,
+ 59,
+ 46,
+ 52,
+ 60,
+ 44,
+ 52,
+ 63,
+ 41,
+ 54,
+ 70,
+ 36,
+ 55,
+ 77,
+ 26,
+ 55,
+ 87,
+ 14,
+ 57,
+ 96,
+ 0,
+ 60,
+ 104,
+ 0,
+ 65,
+ 121,
+ 0,
+ 71,
+ 177,
+ 0,
+ 74,
+ 247,
+ 57,
+ 57,
+ 57,
+ 52,
+ 54,
+ 59,
+ 47,
+ 51,
+ 60,
+ 47,
+ 54,
+ 67,
+ 43,
+ 53,
+ 73,
+ 38,
+ 54,
+ 82,
+ 30,
+ 53,
+ 94,
+ 17,
+ 53,
+ 105,
+ 2,
+ 56,
+ 123,
+ 0,
+ 59,
+ 154,
+ 0,
+ 62,
+ 242,
+ 0,
+ 64,
+ 255,
+ 57,
+ 57,
+ 57,
+ 52,
+ 54,
+ 59,
+ 47,
+ 50,
+ 60,
+ 45,
+ 50,
+ 65,
+ 42,
+ 50,
+ 71,
+ 39,
+ 50,
+ 81,
+ 33,
+ 49,
+ 95,
+ 27,
+ 47,
+ 102,
+ 14,
+ 46,
+ 140,
+ 0,
+ 46,
+ 187,
+ 0,
+ 43,
+ 255,
+ 0,
+ 39,
+ 255,
+ 57,
+ 57,
+ 57,
+ 53,
+ 53,
+ 59,
+ 48,
+ 49,
+ 60,
+ 46,
+ 49,
+ 65,
+ 45,
+ 49,
+ 73,
+ 42,
+ 48,
+ 82,
+ 35,
+ 43,
+ 90,
+ 34,
+ 43,
+ 102,
+ 24,
+ 41,
+ 140,
+ 11,
+ 39,
+ 186,
+ 0,
+ 33,
+ 255,
+ 0,
+ 25,
+ 255,
+ 57,
+ 57,
+ 57,
+ 53,
+ 53,
+ 58,
+ 49,
+ 48,
+ 59,
+ 48,
+ 48,
+ 65,
+ 46,
+ 46,
+ 70,
+ 44,
+ 43,
+ 78,
+ 41,
+ 40,
+ 89,
+ 41,
+ 41,
+ 99,
+ 35,
+ 37,
+ 135,
+ 27,
+ 33,
+ 177,
+ 3,
+ 23,
+ 255,
+ 0,
+ 12,
+ 255,
+ 57,
+ 57,
+ 57,
+ 54,
+ 53,
+ 58,
+ 50,
+ 48,
+ 59,
+ 50,
+ 47,
+ 64,
+ 49,
+ 45,
+ 69,
+ 48,
+ 43,
+ 77,
+ 49,
+ 42,
+ 91,
+ 47,
+ 38,
+ 95,
+ 45,
+ 33,
+ 127,
+ 42,
+ 27,
+ 165,
+ 30,
+ 15,
+ 255,
+ 10,
+ 0,
+ 255,
+ 57,
+ 57,
+ 57,
+ 55,
+ 53,
+ 58,
+ 52,
+ 48,
+ 58,
+ 52,
+ 47,
+ 63,
+ 51,
+ 44,
+ 67,
+ 54,
+ 43,
+ 76,
+ 53,
+ 39,
+ 84,
+ 53,
+ 36,
+ 90,
+ 55,
+ 30,
+ 117,
+ 56,
+ 23,
+ 150,
+ 56,
+ 7,
+ 231,
+ 51,
+ 0,
+ 255,
+ 57,
+ 57,
+ 57,
+ 55,
+ 53,
+ 58,
+ 53,
+ 48,
+ 58,
+ 55,
+ 48,
+ 62,
+ 55,
+ 45,
+ 65,
+ 55,
+ 41,
+ 70,
+ 59,
+ 38,
+ 80,
+ 59,
+ 34,
+ 84,
+ 65,
+ 27,
+ 107,
+ 70,
+ 19,
+ 134,
+ 81,
+ 1,
+ 199,
+ 90,
+ 0,
+ 255,
+ 57,
+ 57,
+ 57,
+ 56,
+ 53,
+ 57,
+ 55,
+ 49,
+ 57,
+ 56,
+ 47,
+ 59,
+ 58,
+ 45,
+ 63,
+ 57,
+ 40,
+ 65,
+ 61,
+ 36,
+ 72,
+ 64,
+ 33,
+ 78,
+ 74,
+ 25,
+ 95,
+ 84,
+ 15,
+ 115,
+ 105,
+ 0,
+ 165,
+ 128,
+ 0,
+ 227,
+ 57,
+ 57,
+ 57,
+ 57,
+ 53,
+ 57,
+ 56,
+ 49,
+ 56,
+ 56,
+ 46,
+ 56,
+ 58,
+ 44,
+ 58,
+ 60,
+ 39,
+ 59,
+ 67,
+ 35,
+ 64,
+ 71,
+ 28,
+ 67,
+ 84,
+ 22,
+ 81,
+ 98,
+ 12,
+ 96,
+ 129,
+ 0,
+ 130,
+ 165,
+ 0,
+ 171,
+ 84,
+ 84,
+ 84,
+ 79,
+ 74,
+ 77,
+ 74,
+ 64,
+ 70,
+ 77,
+ 62,
+ 71,
+ 80,
+ 60,
+ 72,
+ 81,
+ 53,
+ 71,
+ 90,
+ 49,
+ 74,
+ 98,
+ 41,
+ 76,
+ 116,
+ 31,
+ 84,
+ 136,
+ 18,
+ 94,
+ 183,
+ 0,
+ 116,
+ 237,
+ 0,
+ 142,
+ 84,
+ 84,
+ 84,
+ 79,
+ 74,
+ 76,
+ 74,
+ 63,
+ 67,
+ 76,
+ 62,
+ 66,
+ 81,
+ 61,
+ 66,
+ 86,
+ 58,
+ 66,
+ 92,
+ 51,
+ 64,
+ 102,
+ 42,
+ 63,
+ 116,
+ 31,
+ 63,
+ 147,
+ 17,
+ 70,
+ 201,
+ 0,
+ 78,
+ 255,
+ 0,
+ 88,
+ 84,
+ 84,
+ 84,
+ 79,
+ 74,
+ 74,
+ 74,
+ 64,
+ 64,
+ 79,
+ 65,
+ 65,
+ 82,
+ 63,
+ 63,
+ 87,
+ 59,
+ 60,
+ 91,
+ 53,
+ 56,
+ 101,
+ 46,
+ 52,
+ 114,
+ 35,
+ 46,
+ 153,
+ 19,
+ 45,
+ 210,
+ 0,
+ 44,
+ 255,
+ 0,
+ 43,
+ 84,
+ 84,
+ 84,
+ 79,
+ 75,
+ 74,
+ 74,
+ 65,
+ 63,
+ 74,
+ 63,
+ 59,
+ 81,
+ 63,
+ 58,
+ 86,
+ 60,
+ 54,
+ 90,
+ 55,
+ 47,
+ 98,
+ 49,
+ 40,
+ 111,
+ 40,
+ 33,
+ 124,
+ 27,
+ 25,
+ 201,
+ 0,
+ 18,
+ 255,
+ 0,
+ 13,
+ 84,
+ 84,
+ 84,
+ 79,
+ 75,
+ 73,
+ 74,
+ 66,
+ 61,
+ 75,
+ 65,
+ 57,
+ 80,
+ 65,
+ 54,
+ 82,
+ 61,
+ 47,
+ 87,
+ 57,
+ 40,
+ 94,
+ 52,
+ 32,
+ 105,
+ 45,
+ 23,
+ 119,
+ 33,
+ 13,
+ 174,
+ 17,
+ 5,
+ 205,
+ 0,
+ 51,
+ 84,
+ 84,
+ 84,
+ 79,
+ 76,
+ 72,
+ 74,
+ 67,
+ 59,
+ 75,
+ 66,
+ 55,
+ 77,
+ 65,
+ 50,
+ 80,
+ 63,
+ 44,
+ 85,
+ 61,
+ 36,
+ 93,
+ 59,
+ 27,
+ 96,
+ 48,
+ 13,
+ 106,
+ 43,
+ 5,
+ 119,
+ 36,
+ 48,
+ 141,
+ 25,
+ 44,
+ 84,
+ 84,
+ 84,
+ 79,
+ 76,
+ 71,
+ 73,
+ 68,
+ 58,
+ 74,
+ 67,
+ 53,
+ 75,
+ 66,
+ 47,
+ 79,
+ 66,
+ 41,
+ 85,
+ 66,
+ 33,
+ 89,
+ 62,
+ 20,
+ 92,
+ 55,
+ 8,
+ 99,
+ 55,
+ 5,
+ 95,
+ 48,
+ 47,
+ 107,
+ 43,
+ 42,
+ 84,
+ 84,
+ 84,
+ 78,
+ 76,
+ 71,
+ 72,
+ 68,
+ 57,
+ 73,
+ 68,
+ 52,
+ 74,
+ 67,
+ 46,
+ 76,
+ 67,
+ 39,
+ 80,
+ 67,
+ 30,
+ 83,
+ 65,
+ 17,
+ 85,
+ 60,
+ 5,
+ 88,
+ 60,
+ 4,
+ 78,
+ 57,
+ 46,
+ 84,
+ 55,
+ 40,
+ 84,
+ 84,
+ 84,
+ 78,
+ 76,
+ 70,
+ 71,
+ 68,
+ 56,
+ 72,
+ 69,
+ 52,
+ 73,
+ 69,
+ 45,
+ 77,
+ 72,
+ 39,
+ 77,
+ 70,
+ 27,
+ 79,
+ 70,
+ 14,
+ 82,
+ 70,
+ 5,
+ 79,
+ 65,
+ 4,
+ 65,
+ 64,
+ 45,
+ 67,
+ 64,
+ 40,
+ 84,
+ 84,
+ 84,
+ 77,
+ 77,
+ 70,
+ 69,
+ 69,
+ 56,
+ 69,
+ 69,
+ 51,
+ 71,
+ 71,
+ 46,
+ 75,
+ 75,
+ 39,
+ 73,
+ 75,
+ 27,
+ 73,
+ 76,
+ 14,
+ 74,
+ 77,
+ 5,
+ 70,
+ 70,
+ 4,
+ 52,
+ 71,
+ 45,
+ 50,
+ 73,
+ 39,
+ 84,
+ 84,
+ 84,
+ 76,
+ 78,
+ 71,
+ 68,
+ 71,
+ 57,
+ 68,
+ 72,
+ 53,
+ 68,
+ 73,
+ 47,
+ 68,
+ 75,
+ 39,
+ 66,
+ 76,
+ 30,
+ 65,
+ 79,
+ 17,
+ 62,
+ 79,
+ 6,
+ 60,
+ 75,
+ 4,
+ 38,
+ 78,
+ 45,
+ 32,
+ 82,
+ 40,
+ 84,
+ 84,
+ 84,
+ 76,
+ 78,
+ 71,
+ 67,
+ 72,
+ 58,
+ 67,
+ 74,
+ 54,
+ 66,
+ 75,
+ 49,
+ 64,
+ 77,
+ 41,
+ 61,
+ 79,
+ 32,
+ 58,
+ 83,
+ 21,
+ 49,
+ 81,
+ 8,
+ 49,
+ 80,
+ 6,
+ 24,
+ 85,
+ 46,
+ 14,
+ 91,
+ 41,
+ 84,
+ 84,
+ 84,
+ 75,
+ 79,
+ 72,
+ 66,
+ 73,
+ 60,
+ 64,
+ 74,
+ 56,
+ 62,
+ 76,
+ 50,
+ 60,
+ 79,
+ 44,
+ 56,
+ 81,
+ 36,
+ 50,
+ 86,
+ 25,
+ 40,
+ 89,
+ 12,
+ 37,
+ 85,
+ 11,
+ 24,
+ 94,
+ 0,
+ 0,
+ 99,
+ 43,
+ 84,
+ 84,
+ 84,
+ 75,
+ 79,
+ 73,
+ 65,
+ 73,
+ 61,
+ 63,
+ 75,
+ 58,
+ 59,
+ 76,
+ 53,
+ 55,
+ 79,
+ 47,
+ 50,
+ 83,
+ 41,
+ 41,
+ 88,
+ 30,
+ 35,
+ 83,
+ 26,
+ 26,
+ 89,
+ 18,
+ 11,
+ 99,
+ 6,
+ 0,
+ 107,
+ 0,
+ 84,
+ 84,
+ 84,
+ 74,
+ 79,
+ 74,
+ 63,
+ 73,
+ 63,
+ 60,
+ 75,
+ 60,
+ 55,
+ 76,
+ 56,
+ 51,
+ 79,
+ 51,
+ 45,
+ 85,
+ 47,
+ 35,
+ 91,
+ 39,
+ 29,
+ 85,
+ 33,
+ 19,
+ 91,
+ 27,
+ 3,
+ 101,
+ 16,
+ 0,
+ 109,
+ 8,
+ 84,
+ 84,
+ 84,
+ 73,
+ 79,
+ 75,
+ 61,
+ 73,
+ 65,
+ 56,
+ 73,
+ 63,
+ 52,
+ 76,
+ 62,
+ 47,
+ 81,
+ 61,
+ 37,
+ 86,
+ 58,
+ 33,
+ 79,
+ 53,
+ 20,
+ 86,
+ 51,
+ 8,
+ 92,
+ 48,
+ 0,
+ 103,
+ 43,
+ 0,
+ 110,
+ 38,
+ 84,
+ 84,
+ 84,
+ 72,
+ 79,
+ 76,
+ 60,
+ 73,
+ 67,
+ 56,
+ 74,
+ 68,
+ 52,
+ 77,
+ 69,
+ 45,
+ 81,
+ 70,
+ 34,
+ 85,
+ 70,
+ 29,
+ 79,
+ 63,
+ 16,
+ 86,
+ 62,
+ 4,
+ 92,
+ 61,
+ 0,
+ 102,
+ 60,
+ 0,
+ 110,
+ 59,
+ 84,
+ 84,
+ 84,
+ 72,
+ 78,
+ 78,
+ 60,
+ 72,
+ 71,
+ 57,
+ 75,
+ 73,
+ 52,
+ 78,
+ 75,
+ 44,
+ 80,
+ 77,
+ 32,
+ 83,
+ 78,
+ 27,
+ 78,
+ 71,
+ 13,
+ 85,
+ 74,
+ 0,
+ 91,
+ 75,
+ 0,
+ 101,
+ 81,
+ 0,
+ 109,
+ 86,
+ 84,
+ 84,
+ 84,
+ 73,
+ 78,
+ 79,
+ 61,
+ 72,
+ 74,
+ 58,
+ 73,
+ 78,
+ 51,
+ 72,
+ 80,
+ 44,
+ 75,
+ 88,
+ 32,
+ 78,
+ 95,
+ 25,
+ 76,
+ 91,
+ 8,
+ 83,
+ 101,
+ 0,
+ 89,
+ 110,
+ 0,
+ 98,
+ 136,
+ 0,
+ 105,
+ 166,
+ 84,
+ 84,
+ 84,
+ 73,
+ 77,
+ 80,
+ 61,
+ 70,
+ 75,
+ 58,
+ 71,
+ 80,
+ 53,
+ 72,
+ 85,
+ 46,
+ 73,
+ 93,
+ 36,
+ 75,
+ 103,
+ 23,
+ 80,
+ 114,
+ 6,
+ 80,
+ 116,
+ 0,
+ 86,
+ 130,
+ 0,
+ 95,
+ 172,
+ 0,
+ 101,
+ 221,
+ 84,
+ 84,
+ 84,
+ 73,
+ 77,
+ 80,
+ 62,
+ 69,
+ 76,
+ 60,
+ 70,
+ 81,
+ 54,
+ 69,
+ 86,
+ 48,
+ 70,
+ 95,
+ 38,
+ 72,
+ 109,
+ 25,
+ 75,
+ 125,
+ 6,
+ 76,
+ 138,
+ 0,
+ 82,
+ 161,
+ 0,
+ 90,
+ 223,
+ 0,
+ 95,
+ 255,
+ 84,
+ 84,
+ 84,
+ 73,
+ 76,
+ 81,
+ 62,
+ 68,
+ 78,
+ 61,
+ 69,
+ 84,
+ 56,
+ 68,
+ 90,
+ 51,
+ 69,
+ 100,
+ 41,
+ 67,
+ 112,
+ 32,
+ 66,
+ 123,
+ 12,
+ 68,
+ 161,
+ 0,
+ 72,
+ 202,
+ 0,
+ 78,
+ 255,
+ 0,
+ 82,
+ 255,
+ 84,
+ 84,
+ 84,
+ 74,
+ 76,
+ 82,
+ 63,
+ 67,
+ 79,
+ 62,
+ 68,
+ 85,
+ 58,
+ 68,
+ 92,
+ 54,
+ 68,
+ 104,
+ 47,
+ 66,
+ 117,
+ 39,
+ 62,
+ 126,
+ 23,
+ 61,
+ 170,
+ 4,
+ 61,
+ 223,
+ 0,
+ 58,
+ 255,
+ 0,
+ 54,
+ 255,
+ 84,
+ 84,
+ 84,
+ 74,
+ 75,
+ 82,
+ 64,
+ 66,
+ 79,
+ 62,
+ 65,
+ 85,
+ 59,
+ 64,
+ 91,
+ 55,
+ 61,
+ 100,
+ 51,
+ 59,
+ 107,
+ 46,
+ 58,
+ 126,
+ 35,
+ 55,
+ 170,
+ 20,
+ 52,
+ 222,
+ 0,
+ 46,
+ 255,
+ 0,
+ 38,
+ 255,
+ 84,
+ 84,
+ 84,
+ 75,
+ 75,
+ 82,
+ 66,
+ 65,
+ 79,
+ 65,
+ 65,
+ 85,
+ 61,
+ 61,
+ 89,
+ 60,
+ 60,
+ 101,
+ 56,
+ 57,
+ 105,
+ 54,
+ 55,
+ 123,
+ 47,
+ 50,
+ 164,
+ 38,
+ 45,
+ 213,
+ 11,
+ 34,
+ 255,
+ 0,
+ 22,
+ 255,
+ 84,
+ 84,
+ 84,
+ 76,
+ 75,
+ 81,
+ 67,
+ 65,
+ 78,
+ 67,
+ 63,
+ 83,
+ 64,
+ 60,
+ 88,
+ 66,
+ 61,
+ 101,
+ 61,
+ 55,
+ 103,
+ 61,
+ 52,
+ 119,
+ 59,
+ 46,
+ 156,
+ 55,
+ 39,
+ 199,
+ 41,
+ 25,
+ 255,
+ 19,
+ 8,
+ 255,
+ 84,
+ 84,
+ 84,
+ 77,
+ 74,
+ 81,
+ 69,
+ 64,
+ 77,
+ 69,
+ 63,
+ 82,
+ 68,
+ 60,
+ 86,
+ 70,
+ 59,
+ 97,
+ 67,
+ 53,
+ 99,
+ 68,
+ 49,
+ 113,
+ 70,
+ 42,
+ 145,
+ 72,
+ 34,
+ 183,
+ 71,
+ 16,
+ 255,
+ 66,
+ 0,
+ 255,
+ 84,
+ 84,
+ 84,
+ 78,
+ 75,
+ 80,
+ 71,
+ 65,
+ 76,
+ 72,
+ 63,
+ 80,
+ 72,
+ 60,
+ 83,
+ 74,
+ 57,
+ 91,
+ 72,
+ 51,
+ 94,
+ 75,
+ 47,
+ 106,
+ 82,
+ 38,
+ 133,
+ 88,
+ 29,
+ 164,
+ 100,
+ 8,
+ 240,
+ 110,
+ 0,
+ 255,
+ 84,
+ 84,
+ 84,
+ 78,
+ 75,
+ 80,
+ 72,
+ 65,
+ 75,
+ 73,
+ 62,
+ 76,
+ 73,
+ 58,
+ 78,
+ 75,
+ 54,
+ 84,
+ 77,
+ 49,
+ 90,
+ 82,
+ 45,
+ 98,
+ 94,
+ 35,
+ 119,
+ 105,
+ 25,
+ 143,
+ 129,
+ 1,
+ 201,
+ 155,
+ 0,
+ 255,
+ 84,
+ 84,
+ 84,
+ 79,
+ 74,
+ 79,
+ 73,
+ 64,
+ 73,
+ 73,
+ 61,
+ 73,
+ 75,
+ 58,
+ 75,
+ 78,
+ 53,
+ 77,
+ 84,
+ 48,
+ 82,
+ 91,
+ 41,
+ 88,
+ 105,
+ 32,
+ 102,
+ 121,
+ 21,
+ 119,
+ 157,
+ 0,
+ 159,
+ 198,
+ 0,
+ 207,
+ 110,
+ 110,
+ 110,
+ 101,
+ 96,
+ 99,
+ 92,
+ 82,
+ 87,
+ 93,
+ 77,
+ 87,
+ 96,
+ 75,
+ 89,
+ 99,
+ 68,
+ 88,
+ 106,
+ 61,
+ 89,
+ 116,
+ 53,
+ 92,
+ 142,
+ 43,
+ 106,
+ 166,
+ 29,
+ 118,
+ 219,
+ 0,
+ 143,
+ 255,
+ 0,
+ 173,
+ 110,
+ 110,
+ 110,
+ 102,
+ 97,
+ 98,
+ 94,
+ 83,
+ 86,
+ 92,
+ 77,
+ 81,
+ 99,
+ 77,
+ 83,
+ 105,
+ 72,
+ 82,
+ 111,
+ 65,
+ 80,
+ 123,
+ 56,
+ 79,
+ 138,
+ 43,
+ 78,
+ 179,
+ 27,
+ 88,
+ 241,
+ 0,
+ 98,
+ 255,
+ 0,
+ 109,
+ 110,
+ 110,
+ 110,
+ 102,
+ 97,
+ 97,
+ 94,
+ 83,
+ 83,
+ 97,
+ 82,
+ 82,
+ 100,
+ 78,
+ 78,
+ 104,
+ 74,
+ 75,
+ 109,
+ 67,
+ 69,
+ 121,
+ 59,
+ 65,
+ 137,
+ 48,
+ 60,
+ 186,
+ 30,
+ 58,
+ 251,
+ 0,
+ 55,
+ 255,
+ 0,
+ 54,
+ 110,
+ 110,
+ 110,
+ 101,
+ 97,
+ 95,
+ 92,
+ 83,
+ 79,
+ 94,
+ 80,
+ 75,
+ 99,
+ 79,
+ 73,
+ 104,
+ 76,
+ 68,
+ 107,
+ 68,
+ 59,
+ 120,
+ 63,
+ 52,
+ 135,
+ 55,
+ 44,
+ 179,
+ 38,
+ 33,
+ 239,
+ 10,
+ 23,
+ 255,
+ 0,
+ 17,
+ 110,
+ 110,
+ 110,
+ 101,
+ 97,
+ 93,
+ 91,
+ 83,
+ 76,
+ 93,
+ 81,
+ 71,
+ 96,
+ 79,
+ 67,
+ 99,
+ 75,
+ 59,
+ 105,
+ 71,
+ 51,
+ 115,
+ 67,
+ 42,
+ 128,
+ 59,
+ 30,
+ 144,
+ 48,
+ 20,
+ 207,
+ 29,
+ 8,
+ 255,
+ 4,
+ 3,
+ 110,
+ 110,
+ 110,
+ 101,
+ 97,
+ 92,
+ 91,
+ 83,
+ 74,
+ 92,
+ 82,
+ 69,
+ 94,
+ 80,
+ 63,
+ 97,
+ 78,
+ 55,
+ 103,
+ 77,
+ 47,
+ 110,
+ 72,
+ 35,
+ 120,
+ 66,
+ 22,
+ 131,
+ 56,
+ 10,
+ 166,
+ 51,
+ 1,
+ 170,
+ 37,
+ 62,
+ 110,
+ 110,
+ 110,
+ 100,
+ 97,
+ 91,
+ 90,
+ 84,
+ 72,
+ 91,
+ 83,
+ 66,
+ 93,
+ 82,
+ 60,
+ 97,
+ 82,
+ 52,
+ 100,
+ 80,
+ 42,
+ 106,
+ 77,
+ 29,
+ 116,
+ 74,
+ 16,
+ 125,
+ 70,
+ 5,
+ 138,
+ 66,
+ 0,
+ 131,
+ 58,
+ 59,
+ 110,
+ 110,
+ 110,
+ 100,
+ 98,
+ 91,
+ 89,
+ 85,
+ 71,
+ 90,
+ 84,
+ 65,
+ 91,
+ 83,
+ 59,
+ 94,
+ 83,
+ 50,
+ 98,
+ 84,
+ 39,
+ 102,
+ 83,
+ 25,
+ 108,
+ 80,
+ 11,
+ 111,
+ 78,
+ 8,
+ 98,
+ 74,
+ 63,
+ 104,
+ 71,
+ 58,
+ 110,
+ 110,
+ 110,
+ 99,
+ 98,
+ 91,
+ 88,
+ 86,
+ 71,
+ 89,
+ 86,
+ 65,
+ 90,
+ 86,
+ 58,
+ 92,
+ 86,
+ 49,
+ 93,
+ 86,
+ 37,
+ 99,
+ 88,
+ 23,
+ 99,
+ 84,
+ 8,
+ 100,
+ 83,
+ 8,
+ 82,
+ 82,
+ 63,
+ 84,
+ 82,
+ 57,
+ 110,
+ 110,
+ 110,
+ 98,
+ 98,
+ 91,
+ 86,
+ 86,
+ 71,
+ 87,
+ 87,
+ 65,
+ 88,
+ 87,
+ 58,
+ 89,
+ 89,
+ 49,
+ 90,
+ 91,
+ 38,
+ 89,
+ 91,
+ 22,
+ 92,
+ 94,
+ 8,
+ 90,
+ 89,
+ 8,
+ 67,
+ 90,
+ 63,
+ 64,
+ 93,
+ 57,
+ 110,
+ 110,
+ 110,
+ 97,
+ 99,
+ 91,
+ 84,
+ 87,
+ 71,
+ 84,
+ 88,
+ 66,
+ 84,
+ 89,
+ 60,
+ 83,
+ 90,
+ 50,
+ 82,
+ 93,
+ 39,
+ 82,
+ 96,
+ 25,
+ 79,
+ 98,
+ 10,
+ 78,
+ 95,
+ 9,
+ 72,
+ 100,
+ 0,
+ 42,
+ 103,
+ 57,
+ 110,
+ 110,
+ 110,
+ 97,
+ 99,
+ 91,
+ 83,
+ 88,
+ 72,
+ 81,
+ 88,
+ 67,
+ 81,
+ 91,
+ 61,
+ 79,
+ 93,
+ 53,
+ 76,
+ 95,
+ 42,
+ 73,
+ 100,
+ 29,
+ 66,
+ 103,
+ 13,
+ 65,
+ 101,
+ 11,
+ 55,
+ 109,
+ 0,
+ 21,
+ 114,
+ 58,
+ 110,
+ 110,
+ 110,
+ 96,
+ 99,
+ 92,
+ 81,
+ 88,
+ 74,
+ 80,
+ 90,
+ 70,
+ 76,
+ 91,
+ 63,
+ 74,
+ 94,
+ 55,
+ 70,
+ 98,
+ 46,
+ 64,
+ 104,
+ 34,
+ 55,
+ 108,
+ 19,
+ 52,
+ 107,
+ 16,
+ 36,
+ 117,
+ 1,
+ 0,
+ 125,
+ 60,
+ 110,
+ 110,
+ 110,
+ 95,
+ 100,
+ 93,
+ 80,
+ 89,
+ 76,
+ 77,
+ 90,
+ 72,
+ 73,
+ 92,
+ 66,
+ 68,
+ 95,
+ 59,
+ 63,
+ 101,
+ 52,
+ 55,
+ 106,
+ 40,
+ 49,
+ 104,
+ 35,
+ 38,
+ 112,
+ 25,
+ 19,
+ 124,
+ 11,
+ 3,
+ 134,
+ 1,
+ 110,
+ 110,
+ 110,
+ 94,
+ 100,
+ 94,
+ 78,
+ 89,
+ 78,
+ 75,
+ 91,
+ 75,
+ 69,
+ 92,
+ 70,
+ 64,
+ 96,
+ 65,
+ 58,
+ 102,
+ 59,
+ 53,
+ 99,
+ 54,
+ 40,
+ 107,
+ 44,
+ 29,
+ 114,
+ 37,
+ 8,
+ 127,
+ 23,
+ 0,
+ 137,
+ 13,
+ 110,
+ 110,
+ 110,
+ 94,
+ 100,
+ 96,
+ 77,
+ 90,
+ 81,
+ 72,
+ 91,
+ 80,
+ 67,
+ 94,
+ 79,
+ 61,
+ 99,
+ 77,
+ 51,
+ 104,
+ 73,
+ 45,
+ 100,
+ 70,
+ 29,
+ 108,
+ 67,
+ 15,
+ 116,
+ 64,
+ 0,
+ 129,
+ 57,
+ 0,
+ 139,
+ 51,
+ 110,
+ 110,
+ 110,
+ 93,
+ 100,
+ 98,
+ 76,
+ 90,
+ 85,
+ 72,
+ 91,
+ 86,
+ 66,
+ 94,
+ 87,
+ 59,
+ 98,
+ 87,
+ 47,
+ 102,
+ 85,
+ 41,
+ 100,
+ 81,
+ 24,
+ 108,
+ 81,
+ 9,
+ 116,
+ 80,
+ 0,
+ 128,
+ 79,
+ 0,
+ 138,
+ 78,
+ 110,
+ 110,
+ 110,
+ 93,
+ 100,
+ 99,
+ 76,
+ 89,
+ 88,
+ 72,
+ 91,
+ 90,
+ 66,
+ 94,
+ 92,
+ 58,
+ 98,
+ 94,
+ 45,
+ 100,
+ 95,
+ 38,
+ 99,
+ 92,
+ 20,
+ 107,
+ 96,
+ 4,
+ 115,
+ 98,
+ 0,
+ 127,
+ 105,
+ 0,
+ 137,
+ 112,
+ 110,
+ 110,
+ 110,
+ 93,
+ 99,
+ 101,
+ 76,
+ 88,
+ 91,
+ 71,
+ 88,
+ 95,
+ 66,
+ 90,
+ 100,
+ 57,
+ 92,
+ 106,
+ 45,
+ 95,
+ 115,
+ 35,
+ 96,
+ 116,
+ 14,
+ 103,
+ 130,
+ 0,
+ 111,
+ 142,
+ 0,
+ 122,
+ 173,
+ 0,
+ 131,
+ 206,
+ 110,
+ 110,
+ 110,
+ 94,
+ 98,
+ 102,
+ 77,
+ 86,
+ 93,
+ 73,
+ 88,
+ 98,
+ 66,
+ 87,
+ 102,
+ 59,
+ 88,
+ 110,
+ 48,
+ 91,
+ 122,
+ 36,
+ 93,
+ 129,
+ 13,
+ 100,
+ 151,
+ 0,
+ 107,
+ 169,
+ 0,
+ 118,
+ 216,
+ 0,
+ 127,
+ 255,
+ 110,
+ 110,
+ 110,
+ 94,
+ 98,
+ 102,
+ 78,
+ 85,
+ 94,
+ 74,
+ 85,
+ 97,
+ 69,
+ 86,
+ 104,
+ 62,
+ 88,
+ 116,
+ 51,
+ 88,
+ 130,
+ 37,
+ 91,
+ 149,
+ 15,
+ 94,
+ 175,
+ 0,
+ 100,
+ 207,
+ 0,
+ 111,
+ 255,
+ 0,
+ 119,
+ 255,
+ 110,
+ 110,
+ 110,
+ 95,
+ 98,
+ 103,
+ 79,
+ 85,
+ 95,
+ 77,
+ 85,
+ 102,
+ 71,
+ 84,
+ 108,
+ 65,
+ 85,
+ 120,
+ 55,
+ 83,
+ 133,
+ 45,
+ 84,
+ 150,
+ 23,
+ 86,
+ 196,
+ 0,
+ 89,
+ 247,
+ 0,
+ 95,
+ 255,
+ 0,
+ 102,
+ 255,
+ 110,
+ 110,
+ 110,
+ 95,
+ 97,
+ 104,
+ 80,
+ 84,
+ 97,
+ 76,
+ 83,
+ 102,
+ 73,
+ 83,
+ 111,
+ 67,
+ 82,
+ 122,
+ 61,
+ 79,
+ 133,
+ 53,
+ 79,
+ 154,
+ 34,
+ 79,
+ 204,
+ 13,
+ 78,
+ 255,
+ 0,
+ 76,
+ 255,
+ 0,
+ 72,
+ 255,
+ 110,
+ 110,
+ 110,
+ 96,
+ 97,
+ 104,
+ 81,
+ 83,
+ 97,
+ 79,
+ 82,
+ 103,
+ 74,
+ 79,
+ 110,
+ 70,
+ 76,
+ 119,
+ 67,
+ 76,
+ 132,
+ 61,
+ 75,
+ 154,
+ 48,
+ 72,
+ 204,
+ 31,
+ 69,
+ 255,
+ 0,
+ 62,
+ 255,
+ 0,
+ 53,
+ 255,
+ 110,
+ 110,
+ 110,
+ 96,
+ 96,
+ 103,
+ 82,
+ 81,
+ 96,
+ 81,
+ 80,
+ 102,
+ 78,
+ 78,
+ 109,
+ 76,
+ 76,
+ 119,
+ 73,
+ 73,
+ 130,
+ 69,
+ 71,
+ 151,
+ 61,
+ 66,
+ 198,
+ 51,
+ 61,
+ 253,
+ 22,
+ 48,
+ 255,
+ 0,
+ 35,
+ 255,
+ 110,
+ 110,
+ 110,
+ 97,
+ 96,
+ 103,
+ 84,
+ 81,
+ 96,
+ 83,
+ 80,
+ 101,
+ 82,
+ 78,
+ 109,
+ 82,
+ 76,
+ 119,
+ 79,
+ 71,
+ 127,
+ 78,
+ 68,
+ 146,
+ 75,
+ 61,
+ 189,
+ 71,
+ 53,
+ 238,
+ 56,
+ 37,
+ 255,
+ 32,
+ 18,
+ 255,
+ 110,
+ 110,
+ 110,
+ 98,
+ 96,
+ 103,
+ 86,
+ 81,
+ 95,
+ 86,
+ 80,
+ 100,
+ 86,
+ 76,
+ 106,
+ 86,
+ 73,
+ 114,
+ 85,
+ 69,
+ 123,
+ 86,
+ 65,
+ 140,
+ 88,
+ 56,
+ 177,
+ 90,
+ 47,
+ 220,
+ 90,
+ 27,
+ 255,
+ 84,
+ 4,
+ 255,
+ 110,
+ 110,
+ 110,
+ 99,
+ 96,
+ 102,
+ 88,
+ 81,
+ 94,
+ 89,
+ 79,
+ 98,
+ 89,
+ 76,
+ 102,
+ 90,
+ 72,
+ 110,
+ 91,
+ 67,
+ 117,
+ 95,
+ 62,
+ 131,
+ 102,
+ 52,
+ 163,
+ 109,
+ 42,
+ 199,
+ 123,
+ 18,
+ 255,
+ 134,
+ 0,
+ 255,
+ 110,
+ 110,
+ 110,
+ 100,
+ 96,
+ 101,
+ 89,
+ 81,
+ 92,
+ 90,
+ 78,
+ 94,
+ 91,
+ 75,
+ 98,
+ 92,
+ 70,
+ 103,
+ 96,
+ 65,
+ 111,
+ 103,
+ 60,
+ 122,
+ 116,
+ 48,
+ 146,
+ 129,
+ 36,
+ 175,
+ 156,
+ 10,
+ 241,
+ 185,
+ 0,
+ 255,
+ 110,
+ 110,
+ 110,
+ 100,
+ 96,
+ 100,
+ 90,
+ 81,
+ 89,
+ 90,
+ 77,
+ 90,
+ 93,
+ 74,
+ 93,
+ 96,
+ 67,
+ 94,
+ 103,
+ 62,
+ 99,
+ 112,
+ 58,
+ 109,
+ 130,
+ 45,
+ 127,
+ 148,
+ 32,
+ 147,
+ 189,
+ 2,
+ 193,
+ 234,
+ 0,
+ 248,
+ 132,
+ 132,
+ 132,
+ 122,
+ 117,
+ 120,
+ 112,
+ 101,
+ 107,
+ 116,
+ 98,
+ 109,
+ 118,
+ 93,
+ 108,
+ 122,
+ 87,
+ 108,
+ 127,
+ 77,
+ 108,
+ 147,
+ 73,
+ 119,
+ 172,
+ 58,
+ 131,
+ 199,
+ 42,
+ 145,
+ 255,
+ 5,
+ 174,
+ 255,
+ 0,
+ 209,
+ 132,
+ 132,
+ 132,
+ 123,
+ 117,
+ 118,
+ 113,
+ 101,
+ 104,
+ 116,
+ 99,
+ 104,
+ 120,
+ 95,
+ 103,
+ 127,
+ 90,
+ 102,
+ 134,
+ 82,
+ 99,
+ 147,
+ 73,
+ 98,
+ 184,
+ 57,
+ 103,
+ 215,
+ 40,
+ 109,
+ 255,
+ 2,
+ 120,
+ 255,
+ 0,
+ 134,
+ 132,
+ 132,
+ 132,
+ 123,
+ 118,
+ 117,
+ 114,
+ 103,
+ 102,
+ 117,
+ 101,
+ 100,
+ 120,
+ 97,
+ 97,
+ 126,
+ 92,
+ 93,
+ 133,
+ 85,
+ 88,
+ 144,
+ 75,
+ 80,
+ 189,
+ 60,
+ 76,
+ 223,
+ 43,
+ 73,
+ 255,
+ 6,
+ 68,
+ 255,
+ 0,
+ 67,
+ 132,
+ 132,
+ 132,
+ 123,
+ 118,
+ 116,
+ 114,
+ 103,
+ 99,
+ 117,
+ 102,
+ 97,
+ 120,
+ 99,
+ 92,
+ 126,
+ 95,
+ 86,
+ 132,
+ 87,
+ 76,
+ 145,
+ 81,
+ 68,
+ 183,
+ 68,
+ 53,
+ 215,
+ 53,
+ 44,
+ 255,
+ 21,
+ 30,
+ 255,
+ 0,
+ 22,
+ 132,
+ 132,
+ 132,
+ 123,
+ 118,
+ 114,
+ 113,
+ 103,
+ 96,
+ 115,
+ 101,
+ 92,
+ 117,
+ 99,
+ 86,
+ 124,
+ 96,
+ 78,
+ 128,
+ 89,
+ 66,
+ 141,
+ 86,
+ 56,
+ 169,
+ 77,
+ 38,
+ 194,
+ 67,
+ 27,
+ 246,
+ 44,
+ 11,
+ 255,
+ 16,
+ 4,
+ 132,
+ 132,
+ 132,
+ 122,
+ 118,
+ 113,
+ 112,
+ 104,
+ 94,
+ 113,
+ 102,
+ 88,
+ 115,
+ 100,
+ 81,
+ 118,
+ 97,
+ 71,
+ 125,
+ 95,
+ 60,
+ 134,
+ 91,
+ 47,
+ 144,
+ 83,
+ 30,
+ 169,
+ 81,
+ 18,
+ 200,
+ 68,
+ 3,
+ 206,
+ 50,
+ 83,
+ 132,
+ 132,
+ 132,
+ 122,
+ 119,
+ 112,
+ 112,
+ 105,
+ 92,
+ 112,
+ 104,
+ 86,
+ 113,
+ 102,
+ 77,
+ 116,
+ 100,
+ 67,
+ 120,
+ 99,
+ 55,
+ 130,
+ 98,
+ 41,
+ 139,
+ 92,
+ 23,
+ 151,
+ 88,
+ 10,
+ 169,
+ 85,
+ 0,
+ 158,
+ 75,
+ 80,
+ 132,
+ 132,
+ 132,
+ 122,
+ 119,
+ 112,
+ 111,
+ 106,
+ 91,
+ 111,
+ 105,
+ 85,
+ 113,
+ 105,
+ 76,
+ 115,
+ 104,
+ 65,
+ 119,
+ 104,
+ 53,
+ 126,
+ 104,
+ 37,
+ 133,
+ 100,
+ 18,
+ 137,
+ 95,
+ 6,
+ 148,
+ 96,
+ 0,
+ 127,
+ 91,
+ 79,
+ 132,
+ 132,
+ 132,
+ 121,
+ 120,
+ 112,
+ 109,
+ 107,
+ 91,
+ 110,
+ 106,
+ 84,
+ 110,
+ 106,
+ 75,
+ 111,
+ 105,
+ 63,
+ 114,
+ 106,
+ 50,
+ 118,
+ 107,
+ 33,
+ 122,
+ 106,
+ 15,
+ 129,
+ 108,
+ 4,
+ 129,
+ 106,
+ 0,
+ 103,
+ 103,
+ 78,
+ 132,
+ 132,
+ 132,
+ 120,
+ 120,
+ 111,
+ 107,
+ 107,
+ 90,
+ 108,
+ 108,
+ 84,
+ 108,
+ 107,
+ 75,
+ 109,
+ 109,
+ 64,
+ 111,
+ 111,
+ 51,
+ 112,
+ 114,
+ 34,
+ 112,
+ 115,
+ 15,
+ 114,
+ 117,
+ 4,
+ 111,
+ 115,
+ 0,
+ 80,
+ 115,
+ 77,
+ 132,
+ 132,
+ 132,
+ 119,
+ 120,
+ 111,
+ 105,
+ 107,
+ 90,
+ 105,
+ 108,
+ 85,
+ 105,
+ 110,
+ 77,
+ 105,
+ 112,
+ 67,
+ 104,
+ 114,
+ 53,
+ 104,
+ 119,
+ 37,
+ 102,
+ 122,
+ 17,
+ 98,
+ 124,
+ 5,
+ 93,
+ 124,
+ 0,
+ 55,
+ 128,
+ 77,
+ 132,
+ 132,
+ 132,
+ 117,
+ 120,
+ 112,
+ 102,
+ 108,
+ 91,
+ 101,
+ 109,
+ 85,
+ 100,
+ 110,
+ 78,
+ 99,
+ 113,
+ 68,
+ 97,
+ 117,
+ 56,
+ 93,
+ 122,
+ 40,
+ 86,
+ 127,
+ 21,
+ 85,
+ 125,
+ 17,
+ 72,
+ 134,
+ 0,
+ 30,
+ 141,
+ 78,
+ 132,
+ 132,
+ 132,
+ 117,
+ 121,
+ 113,
+ 101,
+ 109,
+ 93,
+ 99,
+ 110,
+ 88,
+ 97,
+ 112,
+ 81,
+ 94,
+ 116,
+ 72,
+ 89,
+ 120,
+ 61,
+ 82,
+ 126,
+ 46,
+ 76,
+ 125,
+ 37,
+ 68,
+ 132,
+ 23,
+ 50,
+ 145,
+ 5,
+ 32,
+ 156,
+ 0,
+ 132,
+ 132,
+ 132,
+ 116,
+ 121,
+ 114,
+ 100,
+ 110,
+ 96,
+ 97,
+ 112,
+ 91,
+ 93,
+ 114,
+ 85,
+ 88,
+ 118,
+ 77,
+ 81,
+ 123,
+ 68,
+ 76,
+ 120,
+ 62,
+ 64,
+ 129,
+ 47,
+ 52,
+ 138,
+ 35,
+ 29,
+ 153,
+ 17,
+ 9,
+ 166,
+ 5,
+ 132,
+ 132,
+ 132,
+ 116,
+ 122,
+ 116,
+ 99,
+ 111,
+ 99,
+ 95,
+ 113,
+ 95,
+ 88,
+ 114,
+ 89,
+ 83,
+ 119,
+ 83,
+ 77,
+ 117,
+ 77,
+ 69,
+ 122,
+ 70,
+ 55,
+ 132,
+ 58,
+ 40,
+ 141,
+ 49,
+ 16,
+ 157,
+ 33,
+ 0,
+ 170,
+ 20,
+ 132,
+ 132,
+ 132,
+ 115,
+ 122,
+ 118,
+ 98,
+ 112,
+ 103,
+ 93,
+ 115,
+ 101,
+ 86,
+ 116,
+ 98,
+ 78,
+ 121,
+ 96,
+ 69,
+ 118,
+ 91,
+ 59,
+ 124,
+ 90,
+ 40,
+ 134,
+ 86,
+ 23,
+ 143,
+ 83,
+ 0,
+ 159,
+ 75,
+ 0,
+ 171,
+ 68,
+ 132,
+ 132,
+ 132,
+ 115,
+ 122,
+ 120,
+ 97,
+ 112,
+ 107,
+ 92,
+ 114,
+ 107,
+ 84,
+ 116,
+ 106,
+ 75,
+ 120,
+ 106,
+ 65,
+ 118,
+ 102,
+ 54,
+ 124,
+ 103,
+ 34,
+ 134,
+ 103,
+ 17,
+ 143,
+ 102,
+ 0,
+ 158,
+ 101,
+ 0,
+ 171,
+ 100,
+ 132,
+ 132,
+ 132,
+ 115,
+ 122,
+ 122,
+ 97,
+ 112,
+ 111,
+ 91,
+ 114,
+ 111,
+ 83,
+ 115,
+ 112,
+ 73,
+ 118,
+ 114,
+ 62,
+ 117,
+ 112,
+ 51,
+ 123,
+ 116,
+ 29,
+ 132,
+ 121,
+ 10,
+ 142,
+ 125,
+ 0,
+ 157,
+ 134,
+ 0,
+ 169,
+ 142,
+ 132,
+ 132,
+ 132,
+ 115,
+ 121,
+ 123,
+ 97,
+ 110,
+ 114,
+ 90,
+ 110,
+ 117,
+ 83,
+ 111,
+ 121,
+ 74,
+ 114,
+ 129,
+ 61,
+ 114,
+ 134,
+ 48,
+ 118,
+ 144,
+ 23,
+ 127,
+ 163,
+ 0,
+ 136,
+ 179,
+ 0,
+ 151,
+ 216,
+ 0,
+ 162,
+ 253,
+ 132,
+ 132,
+ 132,
+ 115,
+ 120,
+ 124,
+ 97,
+ 108,
+ 115,
+ 93,
+ 108,
+ 119,
+ 85,
+ 108,
+ 125,
+ 77,
+ 111,
+ 135,
+ 65,
+ 115,
+ 151,
+ 50,
+ 115,
+ 160,
+ 23,
+ 123,
+ 188,
+ 0,
+ 131,
+ 212,
+ 0,
+ 145,
+ 255,
+ 0,
+ 156,
+ 255,
+ 132,
+ 132,
+ 132,
+ 115,
+ 119,
+ 124,
+ 98,
+ 106,
+ 116,
+ 95,
+ 107,
+ 121,
+ 88,
+ 107,
+ 129,
+ 79,
+ 108,
+ 140,
+ 67,
+ 107,
+ 153,
+ 54,
+ 110,
+ 172,
+ 27,
+ 116,
+ 214,
+ 0,
+ 123,
+ 254,
+ 0,
+ 134,
+ 255,
+ 0,
+ 145,
+ 255,
+ 132,
+ 132,
+ 132,
+ 116,
+ 119,
+ 125,
+ 99,
+ 106,
+ 118,
+ 96,
+ 106,
+ 125,
+ 88,
+ 104,
+ 131,
+ 82,
+ 104,
+ 142,
+ 72,
+ 103,
+ 159,
+ 61,
+ 105,
+ 182,
+ 36,
+ 108,
+ 233,
+ 8,
+ 110,
+ 255,
+ 0,
+ 115,
+ 255,
+ 0,
+ 120,
+ 255,
+ 132,
+ 132,
+ 132,
+ 116,
+ 118,
+ 126,
+ 99,
+ 104,
+ 119,
+ 96,
+ 104,
+ 126,
+ 91,
+ 102,
+ 134,
+ 86,
+ 101,
+ 144,
+ 78,
+ 100,
+ 161,
+ 69,
+ 100,
+ 186,
+ 48,
+ 99,
+ 242,
+ 24,
+ 99,
+ 255,
+ 0,
+ 97,
+ 255,
+ 0,
+ 93,
+ 255,
+ 132,
+ 132,
+ 132,
+ 116,
+ 117,
+ 126,
+ 100,
+ 101,
+ 119,
+ 94,
+ 96,
+ 122,
+ 92,
+ 97,
+ 132,
+ 91,
+ 98,
+ 139,
+ 85,
+ 96,
+ 161,
+ 78,
+ 95,
+ 186,
+ 63,
+ 92,
+ 242,
+ 45,
+ 88,
+ 255,
+ 0,
+ 80,
+ 255,
+ 0,
+ 71,
+ 255,
+ 132,
+ 132,
+ 132,
+ 117,
+ 117,
+ 126,
+ 102,
+ 101,
+ 119,
+ 101,
+ 101,
+ 126,
+ 97,
+ 97,
+ 132,
+ 95,
+ 96,
+ 137,
+ 92,
+ 93,
+ 159,
+ 88,
+ 91,
+ 183,
+ 78,
+ 85,
+ 236,
+ 67,
+ 79,
+ 255,
+ 35,
+ 65,
+ 255,
+ 0,
+ 50,
+ 255,
+ 132,
+ 132,
+ 132,
+ 119,
+ 117,
+ 126,
+ 105,
+ 102,
+ 119,
+ 104,
+ 101,
+ 125,
+ 103,
+ 98,
+ 133,
+ 100,
+ 94,
+ 135,
+ 99,
+ 91,
+ 155,
+ 97,
+ 87,
+ 177,
+ 94,
+ 79,
+ 226,
+ 89,
+ 71,
+ 255,
+ 73,
+ 52,
+ 255,
+ 46,
+ 32,
+ 255,
+ 132,
+ 132,
+ 132,
+ 120,
+ 118,
+ 126,
+ 108,
+ 103,
+ 119,
+ 109,
+ 101,
+ 125,
+ 106,
+ 96,
+ 129,
+ 104,
+ 92,
+ 132,
+ 105,
+ 88,
+ 150,
+ 107,
+ 84,
+ 170,
+ 109,
+ 74,
+ 213,
+ 111,
+ 63,
+ 255,
+ 111,
+ 41,
+ 255,
+ 104,
+ 15,
+ 255,
+ 132,
+ 132,
+ 132,
+ 121,
+ 118,
+ 125,
+ 110,
+ 103,
+ 117,
+ 110,
+ 100,
+ 121,
+ 110,
+ 96,
+ 126,
+ 109,
+ 91,
+ 128,
+ 113,
+ 86,
+ 144,
+ 117,
+ 80,
+ 161,
+ 125,
+ 69,
+ 198,
+ 133,
+ 57,
+ 238,
+ 148,
+ 30,
+ 255,
+ 161,
+ 0,
+ 255,
+ 132,
+ 132,
+ 132,
+ 122,
+ 117,
+ 123,
+ 111,
+ 102,
+ 114,
+ 112,
+ 100,
+ 118,
+ 113,
+ 94,
+ 121,
+ 113,
+ 88,
+ 125,
+ 120,
+ 84,
+ 136,
+ 127,
+ 77,
+ 149,
+ 141,
+ 64,
+ 178,
+ 156,
+ 51,
+ 211,
+ 186,
+ 20,
+ 255,
+ 219,
+ 0,
+ 255,
+ 132,
+ 132,
+ 132,
+ 122,
+ 117,
+ 122,
+ 111,
+ 101,
+ 111,
+ 112,
+ 98,
+ 113,
+ 109,
+ 89,
+ 110,
+ 115,
+ 85,
+ 116,
+ 127,
+ 82,
+ 127,
+ 137,
+ 75,
+ 136,
+ 157,
+ 61,
+ 156,
+ 178,
+ 45,
+ 179,
+ 224,
+ 12,
+ 231,
+ 255,
+ 0,
+ 255,
+ 155,
+ 155,
+ 155,
+ 146,
+ 140,
+ 144,
+ 137,
+ 124,
+ 132,
+ 140,
+ 121,
+ 133,
+ 143,
+ 115,
+ 133,
+ 147,
+ 108,
+ 133,
+ 164,
+ 101,
+ 140,
+ 178,
+ 93,
+ 145,
+ 207,
+ 76,
+ 159,
+ 237,
+ 57,
+ 174,
+ 255,
+ 16,
+ 208,
+ 255,
+ 0,
+ 246,
+ 155,
+ 155,
+ 155,
+ 147,
+ 140,
+ 142,
+ 139,
+ 125,
+ 129,
+ 140,
+ 121,
+ 127,
+ 147,
+ 118,
+ 126,
+ 153,
+ 112,
+ 125,
+ 150,
+ 95,
+ 114,
+ 186,
+ 93,
+ 125,
+ 220,
+ 75,
+ 127,
+ 255,
+ 56,
+ 132,
+ 255,
+ 13,
+ 145,
+ 255,
+ 0,
+ 161,
+ 155,
+ 155,
+ 155,
+ 148,
+ 142,
+ 141,
+ 140,
+ 128,
+ 127,
+ 131,
+ 113,
+ 112,
+ 146,
+ 118,
+ 118,
+ 154,
+ 115,
+ 116,
+ 161,
+ 107,
+ 109,
+ 190,
+ 95,
+ 102,
+ 226,
+ 78,
+ 94,
+ 255,
+ 60,
+ 90,
+ 255,
+ 18,
+ 84,
+ 255,
+ 0,
+ 81,
+ 155,
+ 155,
+ 155,
+ 148,
+ 142,
+ 140,
+ 140,
+ 129,
+ 124,
+ 145,
+ 128,
+ 122,
+ 148,
+ 123,
+ 115,
+ 154,
+ 119,
+ 108,
+ 161,
+ 111,
+ 97,
+ 186,
+ 101,
+ 82,
+ 219,
+ 87,
+ 67,
+ 254,
+ 71,
+ 56,
+ 255,
+ 36,
+ 39,
+ 255,
+ 0,
+ 28,
+ 155,
+ 155,
+ 155,
+ 147,
+ 142,
+ 137,
+ 138,
+ 128,
+ 119,
+ 139,
+ 124,
+ 112,
+ 146,
+ 124,
+ 108,
+ 152,
+ 120,
+ 99,
+ 157,
+ 113,
+ 86,
+ 176,
+ 108,
+ 70,
+ 203,
+ 99,
+ 51,
+ 231,
+ 87,
+ 36,
+ 255,
+ 61,
+ 17,
+ 255,
+ 30,
+ 7,
+ 155,
+ 155,
+ 155,
+ 146,
+ 142,
+ 136,
+ 137,
+ 128,
+ 116,
+ 139,
+ 126,
+ 110,
+ 143,
+ 124,
+ 102,
+ 148,
+ 122,
+ 91,
+ 152,
+ 116,
+ 76,
+ 163,
+ 113,
+ 61,
+ 184,
+ 110,
+ 42,
+ 203,
+ 104,
+ 26,
+ 238,
+ 89,
+ 6,
+ 238,
+ 70,
+ 107,
+ 155,
+ 155,
+ 155,
+ 146,
+ 143,
+ 135,
+ 137,
+ 130,
+ 115,
+ 138,
+ 128,
+ 108,
+ 140,
+ 126,
+ 97,
+ 142,
+ 123,
+ 85,
+ 148,
+ 121,
+ 71,
+ 157,
+ 119,
+ 54,
+ 169,
+ 119,
+ 38,
+ 182,
+ 115,
+ 22,
+ 205,
+ 107,
+ 2,
+ 188,
+ 96,
+ 104,
+ 155,
+ 155,
+ 155,
+ 146,
+ 143,
+ 135,
+ 136,
+ 131,
+ 114,
+ 137,
+ 131,
+ 107,
+ 139,
+ 130,
+ 97,
+ 142,
+ 129,
+ 84,
+ 147,
+ 128,
+ 69,
+ 154,
+ 128,
+ 49,
+ 162,
+ 125,
+ 27,
+ 169,
+ 121,
+ 11,
+ 180,
+ 120,
+ 1,
+ 154,
+ 114,
+ 103,
+ 155,
+ 155,
+ 155,
+ 145,
+ 144,
+ 135,
+ 135,
+ 132,
+ 114,
+ 134,
+ 130,
+ 105,
+ 136,
+ 130,
+ 95,
+ 138,
+ 130,
+ 82,
+ 142,
+ 131,
+ 67,
+ 145,
+ 131,
+ 46,
+ 149,
+ 130,
+ 24,
+ 160,
+ 134,
+ 9,
+ 160,
+ 131,
+ 0,
+ 126,
+ 128,
+ 102,
+ 155,
+ 155,
+ 155,
+ 144,
+ 144,
+ 135,
+ 133,
+ 132,
+ 114,
+ 133,
+ 132,
+ 106,
+ 134,
+ 133,
+ 96,
+ 135,
+ 134,
+ 83,
+ 138,
+ 137,
+ 68,
+ 136,
+ 136,
+ 46,
+ 143,
+ 144,
+ 25,
+ 144,
+ 146,
+ 9,
+ 139,
+ 141,
+ 0,
+ 99,
+ 142,
+ 101,
+ 155,
+ 155,
+ 155,
+ 143,
+ 144,
+ 135,
+ 130,
+ 133,
+ 114,
+ 130,
+ 133,
+ 107,
+ 128,
+ 133,
+ 96,
+ 130,
+ 137,
+ 86,
+ 129,
+ 140,
+ 70,
+ 128,
+ 144,
+ 49,
+ 126,
+ 148,
+ 27,
+ 124,
+ 144,
+ 22,
+ 117,
+ 152,
+ 1,
+ 71,
+ 156,
+ 101,
+ 155,
+ 155,
+ 155,
+ 141,
+ 144,
+ 135,
+ 127,
+ 133,
+ 114,
+ 125,
+ 133,
+ 107,
+ 123,
+ 134,
+ 98,
+ 123,
+ 139,
+ 87,
+ 120,
+ 143,
+ 72,
+ 116,
+ 140,
+ 65,
+ 111,
+ 147,
+ 43,
+ 107,
+ 153,
+ 25,
+ 93,
+ 164,
+ 3,
+ 77,
+ 174,
+ 0,
+ 155,
+ 155,
+ 155,
+ 141,
+ 145,
+ 136,
+ 126,
+ 134,
+ 116,
+ 123,
+ 136,
+ 110,
+ 121,
+ 139,
+ 103,
+ 117,
+ 142,
+ 92,
+ 113,
+ 147,
+ 79,
+ 106,
+ 144,
+ 71,
+ 97,
+ 153,
+ 50,
+ 87,
+ 161,
+ 33,
+ 67,
+ 176,
+ 10,
+ 46,
+ 189,
+ 0,
+ 155,
+ 155,
+ 155,
+ 140,
+ 146,
+ 137,
+ 125,
+ 136,
+ 119,
+ 122,
+ 138,
+ 114,
+ 117,
+ 140,
+ 107,
+ 111,
+ 144,
+ 98,
+ 104,
+ 142,
+ 89,
+ 97,
+ 147,
+ 79,
+ 83,
+ 158,
+ 61,
+ 68,
+ 168,
+ 47,
+ 42,
+ 186,
+ 25,
+ 18,
+ 201,
+ 9,
+ 155,
+ 155,
+ 155,
+ 139,
+ 146,
+ 138,
+ 123,
+ 137,
+ 121,
+ 119,
+ 138,
+ 117,
+ 114,
+ 142,
+ 112,
+ 107,
+ 146,
+ 105,
+ 97,
+ 144,
+ 96,
+ 89,
+ 150,
+ 88,
+ 71,
+ 161,
+ 75,
+ 55,
+ 172,
+ 63,
+ 26,
+ 190,
+ 44,
+ 1,
+ 206,
+ 28,
+ 155,
+ 155,
+ 155,
+ 138,
+ 146,
+ 140,
+ 121,
+ 137,
+ 125,
+ 116,
+ 139,
+ 123,
+ 109,
+ 143,
+ 121,
+ 100,
+ 139,
+ 116,
+ 88,
+ 145,
+ 114,
+ 76,
+ 152,
+ 112,
+ 54,
+ 163,
+ 108,
+ 34,
+ 174,
+ 104,
+ 1,
+ 193,
+ 95,
+ 0,
+ 208,
+ 86,
+ 155,
+ 155,
+ 155,
+ 137,
+ 146,
+ 142,
+ 119,
+ 136,
+ 129,
+ 113,
+ 138,
+ 128,
+ 106,
+ 141,
+ 129,
+ 97,
+ 138,
+ 125,
+ 83,
+ 145,
+ 125,
+ 71,
+ 151,
+ 126,
+ 47,
+ 163,
+ 128,
+ 26,
+ 174,
+ 128,
+ 0,
+ 192,
+ 127,
+ 0,
+ 207,
+ 125,
+ 155,
+ 155,
+ 155,
+ 137,
+ 146,
+ 144,
+ 119,
+ 136,
+ 133,
+ 113,
+ 138,
+ 133,
+ 105,
+ 140,
+ 136,
+ 95,
+ 138,
+ 133,
+ 81,
+ 144,
+ 138,
+ 67,
+ 150,
+ 142,
+ 42,
+ 162,
+ 150,
+ 19,
+ 172,
+ 155,
+ 0,
+ 190,
+ 166,
+ 0,
+ 205,
+ 175,
+ 155,
+ 155,
+ 155,
+ 137,
+ 145,
+ 146,
+ 119,
+ 134,
+ 137,
+ 114,
+ 136,
+ 142,
+ 105,
+ 136,
+ 146,
+ 94,
+ 137,
+ 153,
+ 79,
+ 140,
+ 163,
+ 64,
+ 145,
+ 176,
+ 35,
+ 155,
+ 199,
+ 8,
+ 165,
+ 219,
+ 0,
+ 183,
+ 255,
+ 0,
+ 197,
+ 255,
+ 155,
+ 155,
+ 155,
+ 138,
+ 144,
+ 148,
+ 120,
+ 132,
+ 140,
+ 114,
+ 131,
+ 143,
+ 109,
+ 135,
+ 153,
+ 99,
+ 136,
+ 162,
+ 81,
+ 136,
+ 175,
+ 66,
+ 141,
+ 193,
+ 35,
+ 149,
+ 228,
+ 5,
+ 159,
+ 255,
+ 0,
+ 175,
+ 255,
+ 0,
+ 190,
+ 255,
+ 155,
+ 155,
+ 155,
+ 138,
+ 143,
+ 148,
+ 120,
+ 130,
+ 141,
+ 116,
+ 131,
+ 148,
+ 109,
+ 131,
+ 155,
+ 102,
+ 132,
+ 166,
+ 86,
+ 132,
+ 185,
+ 71,
+ 135,
+ 207,
+ 40,
+ 142,
+ 255,
+ 7,
+ 149,
+ 255,
+ 0,
+ 162,
+ 255,
+ 0,
+ 174,
+ 255,
+ 155,
+ 155,
+ 155,
+ 138,
+ 142,
+ 149,
+ 120,
+ 128,
+ 143,
+ 116,
+ 128,
+ 149,
+ 109,
+ 126,
+ 155,
+ 104,
+ 126,
+ 167,
+ 92,
+ 128,
+ 191,
+ 79,
+ 129,
+ 217,
+ 51,
+ 132,
+ 255,
+ 19,
+ 136,
+ 255,
+ 0,
+ 141,
+ 255,
+ 0,
+ 144,
+ 255,
+ 155,
+ 155,
+ 155,
+ 138,
+ 141,
+ 150,
+ 121,
+ 127,
+ 144,
+ 120,
+ 128,
+ 152,
+ 115,
+ 125,
+ 159,
+ 109,
+ 124,
+ 168,
+ 99,
+ 124,
+ 194,
+ 89,
+ 124,
+ 221,
+ 65,
+ 123,
+ 255,
+ 38,
+ 123,
+ 255,
+ 0,
+ 121,
+ 255,
+ 0,
+ 117,
+ 255,
+ 155,
+ 155,
+ 155,
+ 138,
+ 139,
+ 147,
+ 121,
+ 123,
+ 139,
+ 123,
+ 125,
+ 152,
+ 117,
+ 122,
+ 156,
+ 114,
+ 121,
+ 168,
+ 107,
+ 120,
+ 193,
+ 99,
+ 118,
+ 221,
+ 82,
+ 115,
+ 255,
+ 61,
+ 111,
+ 255,
+ 9,
+ 102,
+ 255,
+ 0,
+ 92,
+ 255,
+ 155,
+ 155,
+ 155,
+ 141,
+ 141,
+ 150,
+ 127,
+ 126,
+ 145,
+ 127,
+ 125,
+ 152,
+ 121,
+ 120,
+ 155,
+ 119,
+ 119,
+ 167,
+ 114,
+ 116,
+ 191,
+ 109,
+ 114,
+ 218,
+ 99,
+ 108,
+ 255,
+ 86,
+ 100,
+ 255,
+ 51,
+ 85,
+ 255,
+ 1,
+ 68,
+ 255,
+ 155,
+ 155,
+ 155,
+ 143,
+ 141,
+ 150,
+ 130,
+ 126,
+ 145,
+ 130,
+ 125,
+ 152,
+ 124,
+ 119,
+ 153,
+ 124,
+ 117,
+ 164,
+ 122,
+ 113,
+ 187,
+ 120,
+ 109,
+ 212,
+ 116,
+ 101,
+ 255,
+ 111,
+ 91,
+ 255,
+ 93,
+ 70,
+ 255,
+ 65,
+ 47,
+ 255,
+ 155,
+ 155,
+ 155,
+ 144,
+ 141,
+ 150,
+ 132,
+ 126,
+ 144,
+ 134,
+ 126,
+ 151,
+ 128,
+ 117,
+ 151,
+ 128,
+ 115,
+ 161,
+ 130,
+ 110,
+ 182,
+ 131,
+ 105,
+ 204,
+ 133,
+ 95,
+ 254,
+ 136,
+ 83,
+ 255,
+ 136,
+ 57,
+ 255,
+ 130,
+ 28,
+ 255,
+ 155,
+ 155,
+ 155,
+ 145,
+ 141,
+ 149,
+ 134,
+ 126,
+ 142,
+ 136,
+ 125,
+ 148,
+ 131,
+ 116,
+ 148,
+ 134,
+ 113,
+ 157,
+ 138,
+ 108,
+ 175,
+ 143,
+ 101,
+ 194,
+ 152,
+ 89,
+ 236,
+ 161,
+ 75,
+ 255,
+ 178,
+ 45,
+ 255,
+ 193,
+ 11,
+ 255,
+ 155,
+ 155,
+ 155,
+ 145,
+ 140,
+ 147,
+ 135,
+ 125,
+ 139,
+ 137,
+ 123,
+ 143,
+ 139,
+ 118,
+ 146,
+ 139,
+ 112,
+ 151,
+ 147,
+ 105,
+ 165,
+ 154,
+ 98,
+ 181,
+ 171,
+ 83,
+ 214,
+ 187,
+ 68,
+ 250,
+ 222,
+ 34,
+ 255,
+ 255,
+ 0,
+ 255,
+ 155,
+ 155,
+ 155,
+ 146,
+ 140,
+ 146,
+ 136,
+ 125,
+ 136,
+ 135,
+ 120,
+ 137,
+ 140,
+ 116,
+ 139,
+ 147,
+ 112,
+ 144,
+ 156,
+ 103,
+ 153,
+ 166,
+ 95,
+ 164,
+ 189,
+ 79,
+ 188,
+ 213,
+ 62,
+ 214,
+ 255,
+ 24,
+ 255,
+ 255,
+ 0,
+ 255,
+ 195,
+ 195,
+ 195,
+ 180,
+ 173,
+ 178,
+ 165,
+ 151,
+ 160,
+ 166,
+ 146,
+ 160,
+ 168,
+ 141,
+ 160,
+ 180,
+ 135,
+ 165,
+ 195,
+ 126,
+ 171,
+ 211,
+ 116,
+ 178,
+ 244,
+ 97,
+ 193,
+ 255,
+ 76,
+ 210,
+ 255,
+ 30,
+ 248,
+ 255,
+ 0,
+ 255,
+ 195,
+ 195,
+ 195,
+ 180,
+ 172,
+ 175,
+ 164,
+ 149,
+ 155,
+ 167,
+ 145,
+ 153,
+ 173,
+ 142,
+ 152,
+ 186,
+ 135,
+ 151,
+ 204,
+ 125,
+ 151,
+ 222,
+ 116,
+ 152,
+ 255,
+ 96,
+ 155,
+ 255,
+ 74,
+ 162,
+ 255,
+ 27,
+ 176,
+ 255,
+ 0,
+ 194,
+ 195,
+ 195,
+ 195,
+ 180,
+ 173,
+ 173,
+ 164,
+ 150,
+ 150,
+ 170,
+ 149,
+ 149,
+ 174,
+ 145,
+ 145,
+ 188,
+ 136,
+ 138,
+ 207,
+ 128,
+ 131,
+ 226,
+ 119,
+ 126,
+ 255,
+ 100,
+ 117,
+ 255,
+ 79,
+ 112,
+ 255,
+ 32,
+ 104,
+ 255,
+ 0,
+ 99,
+ 195,
+ 195,
+ 195,
+ 181,
+ 174,
+ 172,
+ 166,
+ 153,
+ 149,
+ 172,
+ 153,
+ 147,
+ 175,
+ 149,
+ 140,
+ 187,
+ 139,
+ 126,
+ 204,
+ 132,
+ 115,
+ 223,
+ 125,
+ 104,
+ 255,
+ 110,
+ 86,
+ 255,
+ 92,
+ 73,
+ 255,
+ 52,
+ 52,
+ 255,
+ 7,
+ 38,
+ 195,
+ 195,
+ 195,
+ 181,
+ 175,
+ 171,
+ 166,
+ 154,
+ 146,
+ 170,
+ 153,
+ 141,
+ 174,
+ 150,
+ 134,
+ 181,
+ 147,
+ 125,
+ 197,
+ 138,
+ 103,
+ 212,
+ 133,
+ 89,
+ 241,
+ 123,
+ 66,
+ 255,
+ 110,
+ 48,
+ 255,
+ 81,
+ 24,
+ 255,
+ 47,
+ 11,
+ 195,
+ 195,
+ 195,
+ 180,
+ 175,
+ 168,
+ 165,
+ 154,
+ 141,
+ 167,
+ 152,
+ 134,
+ 170,
+ 149,
+ 125,
+ 176,
+ 148,
+ 114,
+ 187,
+ 145,
+ 96,
+ 199,
+ 142,
+ 81,
+ 220,
+ 136,
+ 56,
+ 242,
+ 128,
+ 36,
+ 255,
+ 113,
+ 11,
+ 255,
+ 95,
+ 0,
+ 195,
+ 195,
+ 195,
+ 179,
+ 175,
+ 167,
+ 163,
+ 155,
+ 138,
+ 165,
+ 153,
+ 130,
+ 166,
+ 150,
+ 120,
+ 170,
+ 148,
+ 107,
+ 177,
+ 147,
+ 90,
+ 187,
+ 148,
+ 77,
+ 203,
+ 145,
+ 51,
+ 217,
+ 142,
+ 31,
+ 244,
+ 133,
+ 6,
+ 255,
+ 123,
+ 0,
+ 195,
+ 195,
+ 195,
+ 179,
+ 176,
+ 166,
+ 162,
+ 156,
+ 137,
+ 163,
+ 155,
+ 128,
+ 164,
+ 153,
+ 117,
+ 168,
+ 152,
+ 103,
+ 174,
+ 153,
+ 86,
+ 182,
+ 153,
+ 65,
+ 189,
+ 153,
+ 50,
+ 201,
+ 151,
+ 29,
+ 217,
+ 147,
+ 4,
+ 184,
+ 140,
+ 130,
+ 195,
+ 195,
+ 195,
+ 178,
+ 176,
+ 166,
+ 161,
+ 157,
+ 136,
+ 161,
+ 156,
+ 127,
+ 163,
+ 156,
+ 117,
+ 164,
+ 155,
+ 102,
+ 168,
+ 156,
+ 84,
+ 172,
+ 156,
+ 61,
+ 178,
+ 156,
+ 35,
+ 219,
+ 183,
+ 10,
+ 255,
+ 208,
+ 0,
+ 235,
+ 255,
+ 0,
+ 195,
+ 195,
+ 195,
+ 177,
+ 177,
+ 166,
+ 159,
+ 158,
+ 136,
+ 158,
+ 158,
+ 127,
+ 160,
+ 159,
+ 117,
+ 161,
+ 160,
+ 103,
+ 182,
+ 181,
+ 109,
+ 181,
+ 180,
+ 83,
+ 187,
+ 187,
+ 39,
+ 186,
+ 186,
+ 10,
+ 222,
+ 222,
+ 0,
+ 211,
+ 224,
+ 0,
+ 195,
+ 195,
+ 195,
+ 176,
+ 178,
+ 166,
+ 156,
+ 160,
+ 137,
+ 156,
+ 160,
+ 129,
+ 154,
+ 160,
+ 117,
+ 153,
+ 161,
+ 103,
+ 159,
+ 168,
+ 102,
+ 156,
+ 171,
+ 80,
+ 164,
+ 184,
+ 54,
+ 152,
+ 175,
+ 31,
+ 145,
+ 184,
+ 4,
+ 133,
+ 193,
+ 0,
+ 195,
+ 195,
+ 195,
+ 175,
+ 178,
+ 167,
+ 154,
+ 161,
+ 139,
+ 152,
+ 161,
+ 131,
+ 150,
+ 162,
+ 121,
+ 148,
+ 165,
+ 108,
+ 145,
+ 166,
+ 98,
+ 142,
+ 170,
+ 83,
+ 137,
+ 178,
+ 57,
+ 131,
+ 185,
+ 36,
+ 116,
+ 198,
+ 8,
+ 99,
+ 210,
+ 0,
+ 195,
+ 195,
+ 195,
+ 174,
+ 179,
+ 169,
+ 152,
+ 162,
+ 142,
+ 149,
+ 163,
+ 135,
+ 146,
+ 165,
+ 126,
+ 142,
+ 163,
+ 118,
+ 137,
+ 169,
+ 103,
+ 131,
+ 174,
+ 90,
+ 120,
+ 185,
+ 66,
+ 109,
+ 194,
+ 46,
+ 86,
+ 212,
+ 16,
+ 62,
+ 228,
+ 0,
+ 195,
+ 195,
+ 195,
+ 173,
+ 179,
+ 170,
+ 151,
+ 163,
+ 145,
+ 148,
+ 165,
+ 139,
+ 140,
+ 162,
+ 130,
+ 136,
+ 165,
+ 123,
+ 128,
+ 172,
+ 111,
+ 120,
+ 178,
+ 99,
+ 104,
+ 190,
+ 79,
+ 87,
+ 202,
+ 62,
+ 57,
+ 223,
+ 35,
+ 29,
+ 241,
+ 16,
+ 195,
+ 195,
+ 195,
+ 172,
+ 180,
+ 172,
+ 149,
+ 164,
+ 148,
+ 142,
+ 159,
+ 139,
+ 136,
+ 163,
+ 134,
+ 131,
+ 167,
+ 129,
+ 121,
+ 174,
+ 119,
+ 111,
+ 181,
+ 111,
+ 91,
+ 194,
+ 95,
+ 71,
+ 206,
+ 81,
+ 37,
+ 228,
+ 58,
+ 8,
+ 247,
+ 40,
+ 195,
+ 195,
+ 195,
+ 171,
+ 180,
+ 173,
+ 147,
+ 164,
+ 151,
+ 138,
+ 160,
+ 145,
+ 131,
+ 164,
+ 143,
+ 123,
+ 168,
+ 143,
+ 109,
+ 176,
+ 140,
+ 96,
+ 183,
+ 138,
+ 70,
+ 197,
+ 134,
+ 47,
+ 209,
+ 130,
+ 7,
+ 232,
+ 120,
+ 0,
+ 250,
+ 111,
+ 195,
+ 195,
+ 195,
+ 170,
+ 179,
+ 175,
+ 144,
+ 163,
+ 155,
+ 140,
+ 166,
+ 156,
+ 128,
+ 164,
+ 151,
+ 120,
+ 168,
+ 152,
+ 105,
+ 175,
+ 153,
+ 90,
+ 183,
+ 155,
+ 62,
+ 196,
+ 157,
+ 37,
+ 209,
+ 158,
+ 0,
+ 231,
+ 159,
+ 0,
+ 249,
+ 158,
+ 195,
+ 195,
+ 195,
+ 169,
+ 179,
+ 177,
+ 143,
+ 162,
+ 159,
+ 138,
+ 165,
+ 161,
+ 126,
+ 163,
+ 159,
+ 118,
+ 167,
+ 162,
+ 101,
+ 174,
+ 168,
+ 86,
+ 181,
+ 173,
+ 56,
+ 194,
+ 184,
+ 29,
+ 207,
+ 191,
+ 0,
+ 228,
+ 205,
+ 0,
+ 246,
+ 217,
+ 195,
+ 195,
+ 195,
+ 169,
+ 178,
+ 180,
+ 143,
+ 160,
+ 164,
+ 137,
+ 161,
+ 171,
+ 126,
+ 160,
+ 175,
+ 118,
+ 163,
+ 183,
+ 100,
+ 169,
+ 198,
+ 83,
+ 175,
+ 213,
+ 49,
+ 186,
+ 242,
+ 17,
+ 198,
+ 255,
+ 0,
+ 218,
+ 255,
+ 0,
+ 235,
+ 255,
+ 195,
+ 195,
+ 195,
+ 170,
+ 177,
+ 182,
+ 145,
+ 159,
+ 168,
+ 140,
+ 159,
+ 172,
+ 128,
+ 158,
+ 180,
+ 120,
+ 161,
+ 190,
+ 103,
+ 165,
+ 211,
+ 86,
+ 170,
+ 232,
+ 51,
+ 179,
+ 255,
+ 15,
+ 190,
+ 255,
+ 0,
+ 209,
+ 255,
+ 0,
+ 226,
+ 255,
+ 195,
+ 195,
+ 195,
+ 171,
+ 176,
+ 183,
+ 146,
+ 157,
+ 170,
+ 140,
+ 155,
+ 172,
+ 131,
+ 156,
+ 185,
+ 124,
+ 157,
+ 196,
+ 108,
+ 160,
+ 221,
+ 92,
+ 164,
+ 246,
+ 58,
+ 171,
+ 255,
+ 20,
+ 179,
+ 255,
+ 0,
+ 193,
+ 255,
+ 0,
+ 207,
+ 255,
+ 195,
+ 195,
+ 195,
+ 172,
+ 176,
+ 184,
+ 148,
+ 157,
+ 172,
+ 145,
+ 158,
+ 180,
+ 135,
+ 153,
+ 187,
+ 129,
+ 154,
+ 200,
+ 116,
+ 155,
+ 228,
+ 101,
+ 157,
+ 255,
+ 70,
+ 161,
+ 255,
+ 34,
+ 165,
+ 255,
+ 0,
+ 170,
+ 255,
+ 0,
+ 174,
+ 255,
+ 195,
+ 195,
+ 195,
+ 173,
+ 176,
+ 185,
+ 151,
+ 157,
+ 175,
+ 144,
+ 151,
+ 175,
+ 140,
+ 151,
+ 188,
+ 134,
+ 151,
+ 202,
+ 124,
+ 151,
+ 230,
+ 112,
+ 151,
+ 255,
+ 85,
+ 151,
+ 255,
+ 55,
+ 151,
+ 255,
+ 0,
+ 148,
+ 255,
+ 0,
+ 145,
+ 255,
+ 195,
+ 195,
+ 195,
+ 172,
+ 173,
+ 182,
+ 149,
+ 150,
+ 169,
+ 147,
+ 150,
+ 175,
+ 143,
+ 149,
+ 188,
+ 140,
+ 148,
+ 201,
+ 132,
+ 147,
+ 230,
+ 123,
+ 145,
+ 255,
+ 103,
+ 142,
+ 255,
+ 81,
+ 137,
+ 255,
+ 24,
+ 128,
+ 255,
+ 0,
+ 116,
+ 255,
+ 195,
+ 195,
+ 195,
+ 176,
+ 175,
+ 185,
+ 156,
+ 155,
+ 175,
+ 149,
+ 149,
+ 174,
+ 147,
+ 147,
+ 187,
+ 145,
+ 146,
+ 200,
+ 140,
+ 143,
+ 228,
+ 134,
+ 140,
+ 255,
+ 121,
+ 133,
+ 255,
+ 107,
+ 126,
+ 255,
+ 69,
+ 109,
+ 255,
+ 16,
+ 90,
+ 255,
+ 195,
+ 195,
+ 195,
+ 177,
+ 175,
+ 185,
+ 158,
+ 154,
+ 174,
+ 151,
+ 148,
+ 173,
+ 151,
+ 146,
+ 185,
+ 150,
+ 144,
+ 197,
+ 148,
+ 140,
+ 224,
+ 146,
+ 135,
+ 252,
+ 140,
+ 126,
+ 255,
+ 135,
+ 115,
+ 255,
+ 116,
+ 92,
+ 255,
+ 86,
+ 66,
+ 255,
+ 195,
+ 195,
+ 195,
+ 179,
+ 176,
+ 185,
+ 162,
+ 157,
+ 175,
+ 154,
+ 147,
+ 172,
+ 155,
+ 144,
+ 183,
+ 155,
+ 142,
+ 194,
+ 157,
+ 136,
+ 218,
+ 158,
+ 131,
+ 244,
+ 160,
+ 119,
+ 255,
+ 163,
+ 106,
+ 255,
+ 163,
+ 77,
+ 255,
+ 157,
+ 45,
+ 255,
+ 195,
+ 195,
+ 195,
+ 181,
+ 177,
+ 185,
+ 166,
+ 158,
+ 174,
+ 154,
+ 143,
+ 167,
+ 159,
+ 143,
+ 180,
+ 161,
+ 140,
+ 190,
+ 114,
+ 96,
+ 138,
+ 171,
+ 126,
+ 232,
+ 180,
+ 112,
+ 255,
+ 191,
+ 97,
+ 255,
+ 210,
+ 63,
+ 255,
+ 227,
+ 26,
+ 255,
+ 195,
+ 195,
+ 195,
+ 180,
+ 175,
+ 183,
+ 165,
+ 155,
+ 170,
+ 165,
+ 152,
+ 173,
+ 163,
+ 141,
+ 175,
+ 167,
+ 138,
+ 183,
+ 175,
+ 130,
+ 200,
+ 184,
+ 122,
+ 218,
+ 202,
+ 106,
+ 255,
+ 221,
+ 88,
+ 255,
+ 255,
+ 50,
+ 255,
+ 255,
+ 8,
+ 255,
+ 195,
+ 195,
+ 195,
+ 180,
+ 174,
+ 180,
+ 164,
+ 153,
+ 165,
+ 166,
+ 150,
+ 168,
+ 167,
+ 140,
+ 170,
+ 173,
+ 136,
+ 175,
+ 185,
+ 128,
+ 188,
+ 198,
+ 119,
+ 200,
+ 224,
+ 100,
+ 226,
+ 251,
+ 81,
+ 255,
+ 255,
+ 39,
+ 255,
+ 255,
+ 0,
+ 255,
+ 225,
+ 225,
+ 225,
+ 210,
+ 201,
+ 208,
+ 194,
+ 176,
+ 190,
+ 197,
+ 174,
+ 192,
+ 206,
+ 169,
+ 196,
+ 214,
+ 164,
+ 199,
+ 232,
+ 154,
+ 206,
+ 250,
+ 143,
+ 213,
+ 255,
+ 121,
+ 230,
+ 255,
+ 98,
+ 249,
+ 255,
+ 47,
+ 255,
+ 255,
+ 0,
+ 255,
+ 225,
+ 225,
+ 225,
+ 211,
+ 201,
+ 204,
+ 197,
+ 176,
+ 182,
+ 202,
+ 174,
+ 183,
+ 211,
+ 169,
+ 182,
+ 222,
+ 164,
+ 181,
+ 242,
+ 153,
+ 182,
+ 255,
+ 143,
+ 183,
+ 255,
+ 120,
+ 185,
+ 255,
+ 96,
+ 193,
+ 255,
+ 43,
+ 209,
+ 255,
+ 0,
+ 228,
+ 225,
+ 225,
+ 225,
+ 212,
+ 201,
+ 200,
+ 198,
+ 177,
+ 175,
+ 203,
+ 175,
+ 172,
+ 214,
+ 170,
+ 169,
+ 224,
+ 165,
+ 165,
+ 245,
+ 156,
+ 158,
+ 255,
+ 146,
+ 152,
+ 255,
+ 125,
+ 142,
+ 255,
+ 101,
+ 136,
+ 255,
+ 50,
+ 126,
+ 255,
+ 0,
+ 120,
+ 225,
+ 225,
+ 225,
+ 211,
+ 202,
+ 198,
+ 197,
+ 178,
+ 171,
+ 202,
+ 176,
+ 166,
+ 212,
+ 173,
+ 159,
+ 222,
+ 169,
+ 153,
+ 242,
+ 161,
+ 140,
+ 255,
+ 153,
+ 128,
+ 255,
+ 136,
+ 106,
+ 255,
+ 116,
+ 90,
+ 255,
+ 73,
+ 65,
+ 255,
+ 23,
+ 48,
+ 225,
+ 225,
+ 225,
+ 211,
+ 202,
+ 196,
+ 196,
+ 179,
+ 167,
+ 200,
+ 178,
+ 162,
+ 208,
+ 176,
+ 153,
+ 217,
+ 173,
+ 144,
+ 234,
+ 168,
+ 127,
+ 251,
+ 163,
+ 111,
+ 255,
+ 151,
+ 84,
+ 255,
+ 137,
+ 62,
+ 255,
+ 106,
+ 32,
+ 255,
+ 68,
+ 15,
+ 225,
+ 225,
+ 225,
+ 210,
+ 203,
+ 195,
+ 194,
+ 181,
+ 165,
+ 197,
+ 180,
+ 160,
+ 204,
+ 179,
+ 149,
+ 211,
+ 177,
+ 139,
+ 224,
+ 175,
+ 119,
+ 236,
+ 172,
+ 102,
+ 255,
+ 165,
+ 72,
+ 255,
+ 158,
+ 48,
+ 255,
+ 140,
+ 17,
+ 255,
+ 121,
+ 1,
+ 225,
+ 225,
+ 225,
+ 208,
+ 204,
+ 195,
+ 191,
+ 183,
+ 164,
+ 193,
+ 183,
+ 158,
+ 199,
+ 182,
+ 147,
+ 204,
+ 181,
+ 136,
+ 214,
+ 180,
+ 116,
+ 223,
+ 179,
+ 97,
+ 240,
+ 177,
+ 67,
+ 255,
+ 173,
+ 43,
+ 255,
+ 164,
+ 11,
+ 255,
+ 153,
+ 0,
+ 225,
+ 225,
+ 225,
+ 213,
+ 210,
+ 200,
+ 200,
+ 195,
+ 175,
+ 190,
+ 184,
+ 158,
+ 194,
+ 185,
+ 146,
+ 198,
+ 185,
+ 135,
+ 205,
+ 185,
+ 115,
+ 212,
+ 185,
+ 96,
+ 225,
+ 185,
+ 65,
+ 237,
+ 183,
+ 41,
+ 255,
+ 179,
+ 9,
+ 255,
+ 175,
+ 0,
+ 225,
+ 225,
+ 225,
+ 211,
+ 211,
+ 208,
+ 196,
+ 196,
+ 191,
+ 197,
+ 196,
+ 191,
+ 209,
+ 205,
+ 174,
+ 234,
+ 224,
+ 149,
+ 240,
+ 225,
+ 125,
+ 249,
+ 229,
+ 103,
+ 255,
+ 227,
+ 65,
+ 255,
+ 218,
+ 35,
+ 255,
+ 206,
+ 0,
+ 255,
+ 208,
+ 0,
+ 225,
+ 225,
+ 225,
+ 211,
+ 211,
+ 208,
+ 196,
+ 196,
+ 191,
+ 197,
+ 197,
+ 190,
+ 197,
+ 196,
+ 171,
+ 211,
+ 210,
+ 169,
+ 212,
+ 210,
+ 133,
+ 225,
+ 221,
+ 104,
+ 231,
+ 227,
+ 67,
+ 240,
+ 234,
+ 36,
+ 255,
+ 250,
+ 0,
+ 244,
+ 255,
+ 0,
+ 225,
+ 225,
+ 225,
+ 205,
+ 206,
+ 195,
+ 184,
+ 186,
+ 165,
+ 184,
+ 187,
+ 159,
+ 184,
+ 189,
+ 148,
+ 185,
+ 191,
+ 137,
+ 202,
+ 213,
+ 129,
+ 201,
+ 215,
+ 108,
+ 195,
+ 219,
+ 71,
+ 183,
+ 210,
+ 43,
+ 176,
+ 220,
+ 9,
+ 164,
+ 230,
+ 0,
+ 225,
+ 225,
+ 225,
+ 204,
+ 206,
+ 196,
+ 182,
+ 187,
+ 166,
+ 181,
+ 188,
+ 160,
+ 180,
+ 191,
+ 150,
+ 178,
+ 194,
+ 140,
+ 175,
+ 199,
+ 122,
+ 172,
+ 204,
+ 105,
+ 165,
+ 213,
+ 75,
+ 159,
+ 221,
+ 49,
+ 142,
+ 237,
+ 14,
+ 123,
+ 250,
+ 0,
+ 225,
+ 225,
+ 225,
+ 202,
+ 207,
+ 196,
+ 179,
+ 188,
+ 167,
+ 178,
+ 190,
+ 163,
+ 175,
+ 193,
+ 154,
+ 171,
+ 196,
+ 145,
+ 165,
+ 203,
+ 128,
+ 159,
+ 209,
+ 113,
+ 147,
+ 221,
+ 85,
+ 134,
+ 232,
+ 61,
+ 108,
+ 252,
+ 25,
+ 81,
+ 255,
+ 3,
+ 225,
+ 225,
+ 225,
+ 201,
+ 207,
+ 197,
+ 177,
+ 189,
+ 169,
+ 175,
+ 191,
+ 165,
+ 170,
+ 195,
+ 158,
+ 165,
+ 198,
+ 151,
+ 156,
+ 206,
+ 136,
+ 147,
+ 213,
+ 123,
+ 129,
+ 227,
+ 100,
+ 110,
+ 240,
+ 80,
+ 75,
+ 255,
+ 48,
+ 42,
+ 255,
+ 24,
+ 225,
+ 225,
+ 225,
+ 200,
+ 207,
+ 199,
+ 175,
+ 189,
+ 172,
+ 172,
+ 192,
+ 169,
+ 166,
+ 196,
+ 163,
+ 159,
+ 200,
+ 157,
+ 148,
+ 208,
+ 146,
+ 136,
+ 216,
+ 136,
+ 113,
+ 231,
+ 118,
+ 91,
+ 245,
+ 102,
+ 52,
+ 255,
+ 74,
+ 18,
+ 255,
+ 53,
+ 225,
+ 225,
+ 225,
+ 199,
+ 208,
+ 201,
+ 172,
+ 190,
+ 176,
+ 167,
+ 192,
+ 176,
+ 159,
+ 197,
+ 174,
+ 151,
+ 201,
+ 173,
+ 135,
+ 210,
+ 170,
+ 119,
+ 219,
+ 167,
+ 90,
+ 234,
+ 162,
+ 63,
+ 249,
+ 158,
+ 17,
+ 255,
+ 147,
+ 0,
+ 255,
+ 137,
+ 225,
+ 225,
+ 225,
+ 198,
+ 208,
+ 203,
+ 170,
+ 190,
+ 180,
+ 165,
+ 193,
+ 180,
+ 156,
+ 197,
+ 181,
+ 147,
+ 201,
+ 182,
+ 130,
+ 210,
+ 184,
+ 113,
+ 218,
+ 186,
+ 81,
+ 234,
+ 189,
+ 52,
+ 248,
+ 191,
+ 2,
+ 255,
+ 192,
+ 0,
+ 255,
+ 191,
+ 225,
+ 225,
+ 225,
+ 197,
+ 208,
+ 205,
+ 168,
+ 190,
+ 185,
+ 164,
+ 192,
+ 185,
+ 154,
+ 197,
+ 189,
+ 144,
+ 201,
+ 193,
+ 126,
+ 209,
+ 200,
+ 108,
+ 217,
+ 207,
+ 74,
+ 232,
+ 219,
+ 43,
+ 246,
+ 228,
+ 0,
+ 255,
+ 245,
+ 0,
+ 255,
+ 255,
+ 225,
+ 225,
+ 225,
+ 197,
+ 207,
+ 209,
+ 168,
+ 189,
+ 192,
+ 163,
+ 190,
+ 198,
+ 154,
+ 193,
+ 207,
+ 144,
+ 196,
+ 216,
+ 125,
+ 203,
+ 235,
+ 105,
+ 209,
+ 252,
+ 67,
+ 222,
+ 255,
+ 30,
+ 235,
+ 255,
+ 0,
+ 255,
+ 255,
+ 0,
+ 255,
+ 255,
+ 225,
+ 225,
+ 225,
+ 197,
+ 206,
+ 212,
+ 169,
+ 187,
+ 198,
+ 165,
+ 188,
+ 204,
+ 156,
+ 190,
+ 215,
+ 147,
+ 193,
+ 226,
+ 128,
+ 198,
+ 249,
+ 109,
+ 203,
+ 255,
+ 69,
+ 214,
+ 255,
+ 29,
+ 226,
+ 255,
+ 0,
+ 248,
+ 255,
+ 0,
+ 255,
+ 255,
+ 225,
+ 225,
+ 225,
+ 199,
+ 205,
+ 213,
+ 172,
+ 185,
+ 201,
+ 168,
+ 186,
+ 208,
+ 160,
+ 188,
+ 220,
+ 151,
+ 190,
+ 233,
+ 134,
+ 193,
+ 255,
+ 115,
+ 197,
+ 255,
+ 77,
+ 204,
+ 255,
+ 35,
+ 213,
+ 255,
+ 0,
+ 230,
+ 255,
+ 0,
+ 245,
+ 255,
+ 225,
+ 225,
+ 225,
+ 200,
+ 204,
+ 214,
+ 175,
+ 183,
+ 202,
+ 171,
+ 184,
+ 209,
+ 164,
+ 185,
+ 223,
+ 157,
+ 186,
+ 237,
+ 142,
+ 187,
+ 255,
+ 126,
+ 189,
+ 255,
+ 90,
+ 193,
+ 255,
+ 51,
+ 198,
+ 255,
+ 0,
+ 205,
+ 255,
+ 0,
+ 210,
+ 255,
+ 225,
+ 225,
+ 225,
+ 201,
+ 204,
+ 214,
+ 177,
+ 182,
+ 203,
+ 174,
+ 182,
+ 210,
+ 169,
+ 182,
+ 224,
+ 163,
+ 182,
+ 239,
+ 150,
+ 182,
+ 255,
+ 137,
+ 183,
+ 255,
+ 108,
+ 182,
+ 255,
+ 74,
+ 182,
+ 255,
+ 0,
+ 181,
+ 255,
+ 0,
+ 177,
+ 255,
+ 225,
+ 225,
+ 225,
+ 202,
+ 203,
+ 214,
+ 179,
+ 181,
+ 202,
+ 177,
+ 181,
+ 209,
+ 173,
+ 180,
+ 224,
+ 168,
+ 180,
+ 239,
+ 159,
+ 178,
+ 255,
+ 149,
+ 176,
+ 255,
+ 127,
+ 172,
+ 255,
+ 102,
+ 168,
+ 255,
+ 39,
+ 158,
+ 255,
+ 0,
+ 146,
+ 255,
+ 225,
+ 225,
+ 225,
+ 203,
+ 203,
+ 214,
+ 180,
+ 181,
+ 202,
+ 179,
+ 180,
+ 209,
+ 177,
+ 178,
+ 223,
+ 174,
+ 177,
+ 238,
+ 168,
+ 174,
+ 255,
+ 161,
+ 171,
+ 255,
+ 147,
+ 164,
+ 255,
+ 131,
+ 155,
+ 255,
+ 90,
+ 136,
+ 255,
+ 32,
+ 116,
+ 255,
+ 225,
+ 225,
+ 225,
+ 204,
+ 203,
+ 213,
+ 182,
+ 180,
+ 201,
+ 182,
+ 179,
+ 208,
+ 181,
+ 177,
+ 221,
+ 180,
+ 174,
+ 235,
+ 178,
+ 170,
+ 255,
+ 174,
+ 165,
+ 255,
+ 167,
+ 155,
+ 255,
+ 161,
+ 143,
+ 255,
+ 141,
+ 117,
+ 255,
+ 109,
+ 89,
+ 255,
+ 225,
+ 225,
+ 225,
+ 205,
+ 202,
+ 213,
+ 184,
+ 179,
+ 200,
+ 184,
+ 178,
+ 206,
+ 185,
+ 175,
+ 219,
+ 186,
+ 172,
+ 232,
+ 187,
+ 166,
+ 255,
+ 188,
+ 160,
+ 255,
+ 190,
+ 147,
+ 255,
+ 193,
+ 132,
+ 255,
+ 194,
+ 100,
+ 255,
+ 188,
+ 65,
+ 255,
+ 225,
+ 225,
+ 225,
+ 206,
+ 202,
+ 212,
+ 186,
+ 178,
+ 199,
+ 187,
+ 177,
+ 204,
+ 190,
+ 173,
+ 215,
+ 192,
+ 170,
+ 227,
+ 197,
+ 163,
+ 250,
+ 203,
+ 155,
+ 255,
+ 213,
+ 139,
+ 255,
+ 225,
+ 122,
+ 255,
+ 246,
+ 85,
+ 255,
+ 255,
+ 44,
+ 255,
+ 225,
+ 225,
+ 225,
+ 207,
+ 202,
+ 211,
+ 188,
+ 178,
+ 197,
+ 190,
+ 176,
+ 201,
+ 195,
+ 172,
+ 211,
+ 199,
+ 168,
+ 220,
+ 208,
+ 159,
+ 239,
+ 218,
+ 150,
+ 255,
+ 238,
+ 132,
+ 255,
+ 255,
+ 112,
+ 255,
+ 255,
+ 70,
+ 255,
+ 255,
+ 23,
+ 255,
+ 225,
+ 225,
+ 225,
+ 208,
+ 201,
+ 210,
+ 191,
+ 177,
+ 194,
+ 193,
+ 175,
+ 198,
+ 200,
+ 170,
+ 205,
+ 207,
+ 165,
+ 211,
+ 220,
+ 156,
+ 225,
+ 234,
+ 146,
+ 238,
+ 255,
+ 125,
+ 255,
+ 255,
+ 104,
+ 255,
+ 255,
+ 57,
+ 255,
+ 255,
+ 5,
+ 255,
+ 255,
+ 255,
+ 255,
+ 225,
+ 213,
+ 224,
+ 230,
+ 211,
+ 227,
+ 234,
+ 208,
+ 229,
+ 243,
+ 203,
+ 233,
+ 253,
+ 197,
+ 237,
+ 255,
+ 185,
+ 244,
+ 255,
+ 174,
+ 252,
+ 255,
+ 149,
+ 255,
+ 255,
+ 123,
+ 255,
+ 255,
+ 67,
+ 255,
+ 255,
+ 4,
+ 255,
+ 255,
+ 255,
+ 255,
+ 227,
+ 213,
+ 220,
+ 233,
+ 210,
+ 220,
+ 239,
+ 208,
+ 219,
+ 250,
+ 202,
+ 218,
+ 255,
+ 196,
+ 217,
+ 255,
+ 185,
+ 217,
+ 255,
+ 173,
+ 217,
+ 255,
+ 148,
+ 220,
+ 255,
+ 121,
+ 228,
+ 255,
+ 63,
+ 245,
+ 255,
+ 0,
+ 255,
+ 255,
+ 255,
+ 255,
+ 229,
+ 213,
+ 215,
+ 235,
+ 211,
+ 211,
+ 241,
+ 209,
+ 207,
+ 253,
+ 204,
+ 202,
+ 255,
+ 199,
+ 198,
+ 255,
+ 188,
+ 190,
+ 255,
+ 177,
+ 183,
+ 255,
+ 153,
+ 171,
+ 255,
+ 127,
+ 164,
+ 255,
+ 71,
+ 152,
+ 255,
+ 7,
+ 145,
+ 255,
+ 255,
+ 255,
+ 229,
+ 214,
+ 210,
+ 235,
+ 212,
+ 205,
+ 240,
+ 211,
+ 200,
+ 251,
+ 207,
+ 192,
+ 255,
+ 202,
+ 184,
+ 255,
+ 194,
+ 169,
+ 255,
+ 185,
+ 156,
+ 255,
+ 166,
+ 131,
+ 255,
+ 144,
+ 112,
+ 255,
+ 96,
+ 82,
+ 255,
+ 41,
+ 62,
+ 255,
+ 255,
+ 255,
+ 228,
+ 216,
+ 206,
+ 233,
+ 214,
+ 200,
+ 238,
+ 213,
+ 195,
+ 247,
+ 210,
+ 184,
+ 255,
+ 207,
+ 174,
+ 255,
+ 201,
+ 155,
+ 255,
+ 195,
+ 137,
+ 255,
+ 182,
+ 105,
+ 255,
+ 168,
+ 80,
+ 255,
+ 133,
+ 43,
+ 255,
+ 91,
+ 22,
+ 255,
+ 255,
+ 255,
+ 226,
+ 217,
+ 204,
+ 230,
+ 216,
+ 198,
+ 234,
+ 215,
+ 192,
+ 242,
+ 213,
+ 180,
+ 250,
+ 212,
+ 168,
+ 255,
+ 209,
+ 146,
+ 255,
+ 206,
+ 126,
+ 255,
+ 199,
+ 91,
+ 255,
+ 190,
+ 64,
+ 255,
+ 171,
+ 25,
+ 255,
+ 149,
+ 4,
+ 255,
+ 255,
+ 255,
+ 225,
+ 218,
+ 204,
+ 228,
+ 217,
+ 197,
+ 231,
+ 217,
+ 190,
+ 238,
+ 216,
+ 178,
+ 243,
+ 216,
+ 165,
+ 254,
+ 215,
+ 142,
+ 255,
+ 214,
+ 121,
+ 255,
+ 211,
+ 85,
+ 255,
+ 207,
+ 57,
+ 255,
+ 198,
+ 18,
+ 255,
+ 186,
+ 0,
+ 255,
+ 255,
+ 255,
+ 223,
+ 219,
+ 203,
+ 226,
+ 219,
+ 196,
+ 228,
+ 219,
+ 190,
+ 233,
+ 219,
+ 177,
+ 237,
+ 219,
+ 164,
+ 245,
+ 220,
+ 141,
+ 252,
+ 220,
+ 119,
+ 255,
+ 220,
+ 83,
+ 255,
+ 219,
+ 54,
+ 255,
+ 215,
+ 15,
+ 255,
+ 208,
+ 0,
+ 255,
+ 255,
+ 255,
+ 222,
+ 219,
+ 203,
+ 249,
+ 246,
+ 227,
+ 255,
+ 250,
+ 223,
+ 255,
+ 246,
+ 187,
+ 255,
+ 244,
+ 172,
+ 255,
+ 240,
+ 145,
+ 255,
+ 236,
+ 121,
+ 255,
+ 229,
+ 79,
+ 255,
+ 227,
+ 45,
+ 255,
+ 227,
+ 0,
+ 255,
+ 229,
+ 0,
+ 255,
+ 255,
+ 255,
+ 220,
+ 220,
+ 203,
+ 255,
+ 254,
+ 223,
+ 255,
+ 252,
+ 207,
+ 246,
+ 243,
+ 186,
+ 247,
+ 243,
+ 172,
+ 248,
+ 245,
+ 147,
+ 255,
+ 251,
+ 122,
+ 255,
+ 250,
+ 80,
+ 255,
+ 248,
+ 46,
+ 255,
+ 251,
+ 0,
+ 251,
+ 255,
+ 0,
+ 255,
+ 255,
+ 255,
+ 219,
+ 221,
+ 204,
+ 219,
+ 222,
+ 197,
+ 220,
+ 223,
+ 191,
+ 220,
+ 225,
+ 178,
+ 221,
+ 227,
+ 166,
+ 230,
+ 240,
+ 149,
+ 227,
+ 244,
+ 127,
+ 225,
+ 250,
+ 86,
+ 218,
+ 250,
+ 58,
+ 212,
+ 255,
+ 17,
+ 200,
+ 255,
+ 0,
+ 255,
+ 255,
+ 255,
+ 217,
+ 221,
+ 205,
+ 216,
+ 223,
+ 199,
+ 216,
+ 224,
+ 193,
+ 215,
+ 227,
+ 181,
+ 213,
+ 230,
+ 170,
+ 210,
+ 236,
+ 149,
+ 206,
+ 242,
+ 129,
+ 198,
+ 252,
+ 95,
+ 191,
+ 255,
+ 65,
+ 173,
+ 255,
+ 23,
+ 152,
+ 255,
+ 0,
+ 255,
+ 255,
+ 255,
+ 215,
+ 222,
+ 206,
+ 214,
+ 224,
+ 201,
+ 212,
+ 226,
+ 195,
+ 209,
+ 229,
+ 185,
+ 205,
+ 233,
+ 175,
+ 199,
+ 240,
+ 156,
+ 192,
+ 247,
+ 138,
+ 177,
+ 255,
+ 106,
+ 163,
+ 255,
+ 79,
+ 134,
+ 255,
+ 36,
+ 104,
+ 255,
+ 8,
+ 255,
+ 255,
+ 255,
+ 214,
+ 223,
+ 208,
+ 211,
+ 225,
+ 203,
+ 209,
+ 227,
+ 198,
+ 204,
+ 231,
+ 190,
+ 198,
+ 236,
+ 182,
+ 188,
+ 244,
+ 165,
+ 178,
+ 252,
+ 150,
+ 157,
+ 255,
+ 123,
+ 136,
+ 255,
+ 100,
+ 96,
+ 255,
+ 62,
+ 59,
+ 255,
+ 34,
+ 255,
+ 255,
+ 255,
+ 212,
+ 223,
+ 210,
+ 209,
+ 225,
+ 206,
+ 206,
+ 228,
+ 202,
+ 199,
+ 233,
+ 195,
+ 192,
+ 237,
+ 189,
+ 179,
+ 246,
+ 176,
+ 166,
+ 255,
+ 165,
+ 140,
+ 255,
+ 143,
+ 115,
+ 255,
+ 126,
+ 70,
+ 255,
+ 94,
+ 30,
+ 255,
+ 68,
+ 255,
+ 255,
+ 255,
+ 210,
+ 224,
+ 212,
+ 206,
+ 226,
+ 210,
+ 201,
+ 229,
+ 209,
+ 191,
+ 234,
+ 207,
+ 182,
+ 239,
+ 206,
+ 164,
+ 249,
+ 202,
+ 146,
+ 255,
+ 200,
+ 113,
+ 255,
+ 194,
+ 82,
+ 255,
+ 190,
+ 28,
+ 255,
+ 178,
+ 0,
+ 255,
+ 166,
+ 255,
+ 255,
+ 255,
+ 208,
+ 224,
+ 215,
+ 204,
+ 226,
+ 215,
+ 199,
+ 229,
+ 214,
+ 188,
+ 234,
+ 215,
+ 178,
+ 239,
+ 217,
+ 158,
+ 249,
+ 218,
+ 139,
+ 255,
+ 221,
+ 103,
+ 255,
+ 225,
+ 69,
+ 255,
+ 228,
+ 11,
+ 255,
+ 231,
+ 0,
+ 255,
+ 229,
+ 255,
+ 255,
+ 255,
+ 207,
+ 224,
+ 219,
+ 202,
+ 226,
+ 221,
+ 197,
+ 229,
+ 220,
+ 186,
+ 234,
+ 224,
+ 175,
+ 238,
+ 229,
+ 154,
+ 247,
+ 237,
+ 133,
+ 255,
+ 245,
+ 95,
+ 255,
+ 255,
+ 59,
+ 255,
+ 255,
+ 0,
+ 255,
+ 255,
+ 0,
+ 255,
+ 255,
+ 255,
+ 255,
+ 255,
+ 207,
+ 223,
+ 225,
+ 201,
+ 225,
+ 230,
+ 196,
+ 226,
+ 236,
+ 185,
+ 230,
+ 245,
+ 174,
+ 233,
+ 255,
+ 153,
+ 240,
+ 255,
+ 131,
+ 247,
+ 255,
+ 88,
+ 255,
+ 255,
+ 45,
+ 255,
+ 255,
+ 0,
+ 255,
+ 255,
+ 0,
+ 255,
+ 255,
+ 255,
+ 255,
+ 255,
+ 208,
+ 221,
+ 229,
+ 203,
+ 222,
+ 236,
+ 198,
+ 224,
+ 242,
+ 188,
+ 227,
+ 254,
+ 178,
+ 229,
+ 255,
+ 157,
+ 235,
+ 255,
+ 135,
+ 241,
+ 255,
+ 91,
+ 252,
+ 255,
+ 45,
+ 255,
+ 255,
+ 0,
+ 255,
+ 255,
+ 0,
+ 255,
+ 255,
+ 255,
+ 255,
+ 255,
+ 210,
+ 220,
+ 232,
+ 206,
+ 220,
+ 239,
+ 202,
+ 221,
+ 246,
+ 193,
+ 223,
+ 255,
+ 183,
+ 225,
+ 255,
+ 163,
+ 229,
+ 255,
+ 143,
+ 233,
+ 255,
+ 100,
+ 242,
+ 255,
+ 54,
+ 251,
+ 255,
+ 0,
+ 255,
+ 255,
+ 0,
+ 255,
+ 255,
+ 255,
+ 255,
+ 255,
+ 212,
+ 218,
+ 232,
+ 209,
+ 218,
+ 240,
+ 206,
+ 219,
+ 248,
+ 198,
+ 220,
+ 255,
+ 190,
+ 221,
+ 255,
+ 173,
+ 223,
+ 255,
+ 155,
+ 225,
+ 255,
+ 116,
+ 229,
+ 255,
+ 73,
+ 234,
+ 255,
+ 0,
+ 242,
+ 255,
+ 0,
+ 248,
+ 255,
+ 255,
+ 255,
+ 255,
+ 214,
+ 218,
+ 232,
+ 212,
+ 217,
+ 240,
+ 209,
+ 217,
+ 248,
+ 203,
+ 217,
+ 255,
+ 196,
+ 217,
+ 255,
+ 183,
+ 217,
+ 255,
+ 168,
+ 217,
+ 255,
+ 136,
+ 217,
+ 255,
+ 99,
+ 217,
+ 255,
+ 13,
+ 216,
+ 255,
+ 0,
+ 212,
+ 255,
+ 255,
+ 255,
+ 255,
+ 215,
+ 217,
+ 232,
+ 214,
+ 216,
+ 240,
+ 211,
+ 216,
+ 248,
+ 207,
+ 215,
+ 255,
+ 202,
+ 214,
+ 255,
+ 192,
+ 212,
+ 255,
+ 181,
+ 210,
+ 255,
+ 157,
+ 206,
+ 255,
+ 129,
+ 201,
+ 255,
+ 61,
+ 190,
+ 255,
+ 0,
+ 177,
+ 255,
+ 255,
+ 255,
+ 255,
+ 217,
+ 216,
+ 232,
+ 216,
+ 215,
+ 239,
+ 214,
+ 215,
+ 247,
+ 212,
+ 213,
+ 255,
+ 209,
+ 211,
+ 255,
+ 202,
+ 208,
+ 255,
+ 195,
+ 204,
+ 255,
+ 178,
+ 196,
+ 255,
+ 161,
+ 187,
+ 255,
+ 117,
+ 166,
+ 255,
+ 57,
+ 143,
+ 255,
+ 255,
+ 255,
+ 255,
+ 218,
+ 216,
+ 231,
+ 218,
+ 215,
+ 238,
+ 217,
+ 213,
+ 246,
+ 216,
+ 211,
+ 255,
+ 215,
+ 208,
+ 255,
+ 213,
+ 203,
+ 255,
+ 209,
+ 198,
+ 255,
+ 201,
+ 187,
+ 255,
+ 195,
+ 174,
+ 255,
+ 174,
+ 145,
+ 255,
+ 141,
+ 114,
+ 255,
+ 255,
+ 255,
+ 255,
+ 219,
+ 215,
+ 231,
+ 219,
+ 214,
+ 237,
+ 220,
+ 212,
+ 244,
+ 221,
+ 209,
+ 255,
+ 222,
+ 206,
+ 255,
+ 223,
+ 199,
+ 255,
+ 224,
+ 192,
+ 255,
+ 226,
+ 178,
+ 255,
+ 230,
+ 161,
+ 255,
+ 232,
+ 126,
+ 255,
+ 227,
+ 87,
+ 255,
+ 255,
+ 255,
+ 255,
+ 220,
+ 215,
+ 230,
+ 222,
+ 213,
+ 236,
+ 223,
+ 211,
+ 242,
+ 226,
+ 207,
+ 254,
+ 229,
+ 203,
+ 255,
+ 234,
+ 195,
+ 255,
+ 115,
+ 98,
+ 141,
+ 251,
+ 169,
+ 255,
+ 255,
+ 150,
+ 255,
+ 255,
+ 109,
+ 255,
+ 255,
+ 63,
+ 255,
+ 255,
+ 255,
+ 255,
+ 222,
+ 214,
+ 228,
+ 224,
+ 212,
+ 234,
+ 226,
+ 210,
+ 239,
+ 231,
+ 206,
+ 249,
+ 236,
+ 201,
+ 255,
+ 246,
+ 191,
+ 255,
+ 255,
+ 182,
+ 255,
+ 255,
+ 161,
+ 255,
+ 255,
+ 139,
+ 255,
+ 255,
+ 92,
+ 255,
+ 255,
+ 41,
+ 255,
+ 255,
+ 255,
+ 255,
+ 223,
+ 214,
+ 227,
+ 227,
+ 211,
+ 231,
+ 230,
+ 209,
+ 235,
+ 237,
+ 204,
+ 243,
+ 244,
+ 199,
+ 250,
+ 255,
+ 188,
+ 255,
+ 255,
+ 177,
+ 255,
+ 255,
+ 154,
+ 255,
+ 255,
+ 130,
+ 255,
+ 255,
+ 78,
+ 255,
+ 255,
+ 20,
+ 255,
+ 255,
+ 255,
+ 255,
+ 255,
+ 250,
+ 255,
+ 255,
+ 247,
+ 255,
+ 255,
+ 244,
+ 255,
+ 255,
+ 238,
+ 255,
+ 255,
+ 232,
+ 255,
+ 255,
+ 219,
+ 255,
+ 255,
+ 206,
+ 255,
+ 255,
+ 179,
+ 255,
+ 255,
+ 150,
+ 255,
+ 255,
+ 89,
+ 255,
+ 255,
+ 21,
+ 255,
+ 255,
+ 255,
+ 255,
+ 255,
+ 249,
+ 255,
+ 255,
+ 246,
+ 255,
+ 255,
+ 243,
+ 255,
+ 255,
+ 237,
+ 255,
+ 255,
+ 231,
+ 254,
+ 255,
+ 218,
+ 253,
+ 255,
+ 205,
+ 253,
+ 255,
+ 177,
+ 255,
+ 255,
+ 148,
+ 255,
+ 255,
+ 84,
+ 255,
+ 255,
+ 13,
+ 255,
+ 255,
+ 255,
+ 255,
+ 255,
+ 249,
+ 252,
+ 255,
+ 247,
+ 248,
+ 255,
+ 245,
+ 243,
+ 255,
+ 239,
+ 237,
+ 255,
+ 234,
+ 232,
+ 255,
+ 222,
+ 223,
+ 255,
+ 209,
+ 215,
+ 255,
+ 184,
+ 200,
+ 255,
+ 155,
+ 192,
+ 255,
+ 93,
+ 179,
+ 255,
+ 24,
+ 170,
+ 255,
+ 255,
+ 255,
+ 255,
+ 250,
+ 247,
+ 255,
+ 249,
+ 240,
+ 255,
+ 247,
+ 235,
+ 255,
+ 242,
+ 225,
+ 255,
+ 238,
+ 216,
+ 255,
+ 228,
+ 200,
+ 255,
+ 218,
+ 185,
+ 255,
+ 198,
+ 156,
+ 255,
+ 174,
+ 134,
+ 255,
+ 122,
+ 100,
+ 255,
+ 62,
+ 76,
+ 255,
+ 255,
+ 255,
+ 255,
+ 252,
+ 242,
+ 255,
+ 251,
+ 235,
+ 255,
+ 249,
+ 229,
+ 255,
+ 246,
+ 217,
+ 255,
+ 243,
+ 206,
+ 255,
+ 236,
+ 184,
+ 255,
+ 230,
+ 164,
+ 255,
+ 216,
+ 127,
+ 255,
+ 200,
+ 98,
+ 255,
+ 163,
+ 56,
+ 255,
+ 117,
+ 30,
+ 255,
+ 255,
+ 255,
+ 255,
+ 254,
+ 240,
+ 255,
+ 253,
+ 232,
+ 255,
+ 252,
+ 225,
+ 255,
+ 250,
+ 212,
+ 255,
+ 248,
+ 199,
+ 255,
+ 245,
+ 174,
+ 255,
+ 241,
+ 152,
+ 255,
+ 234,
+ 112,
+ 255,
+ 225,
+ 80,
+ 255,
+ 204,
+ 34,
+ 255,
+ 180,
+ 8,
+ 255,
+ 255,
+ 255,
+ 255,
+ 255,
+ 239,
+ 255,
+ 254,
+ 231,
+ 255,
+ 254,
+ 224,
+ 255,
+ 253,
+ 210,
+ 255,
+ 253,
+ 196,
+ 255,
+ 252,
+ 170,
+ 255,
+ 251,
+ 146,
+ 255,
+ 248,
+ 105,
+ 255,
+ 243,
+ 72,
+ 255,
+ 233,
+ 26,
+ 255,
+ 221,
+ 1,
+ 255,
+ 255,
+ 255,
+ 255,
+ 255,
+ 238,
+ 255,
+ 255,
+ 231,
+ 255,
+ 255,
+ 223,
+ 255,
+ 255,
+ 209,
+ 255,
+ 255,
+ 195,
+ 255,
+ 255,
+ 168,
+ 255,
+ 255,
+ 144,
+ 255,
+ 255,
+ 103,
+ 255,
+ 255,
+ 70,
+ 255,
+ 253,
+ 23,
+ 255,
+ 247,
+ 0,
+ 255,
+ 255,
+ 255,
+ 255,
+ 255,
+ 238,
+ 255,
+ 255,
+ 249,
+ 255,
+ 255,
+ 246,
+ 255,
+ 255,
+ 208,
+ 255,
+ 255,
+ 190,
+ 255,
+ 255,
+ 162,
+ 255,
+ 255,
+ 135,
+ 255,
+ 255,
+ 90,
+ 255,
+ 255,
+ 54,
+ 255,
+ 255,
+ 3,
+ 255,
+ 255,
+ 0,
+ 255,
+ 255,
+ 255,
+ 255,
+ 255,
+ 239,
+ 255,
+ 255,
+ 250,
+ 255,
+ 255,
+ 242,
+ 255,
+ 255,
+ 205,
+ 255,
+ 255,
+ 190,
+ 255,
+ 255,
+ 163,
+ 255,
+ 255,
+ 137,
+ 255,
+ 255,
+ 92,
+ 255,
+ 255,
+ 55,
+ 255,
+ 255,
+ 3,
+ 255,
+ 255,
+ 0,
+ 255,
+ 255,
+ 255,
+ 255,
+ 255,
+ 239,
+ 255,
+ 255,
+ 232,
+ 255,
+ 255,
+ 225,
+ 255,
+ 255,
+ 211,
+ 255,
+ 255,
+ 197,
+ 255,
+ 255,
+ 167,
+ 255,
+ 255,
+ 143,
+ 255,
+ 255,
+ 97,
+ 255,
+ 255,
+ 74,
+ 248,
+ 255,
+ 25,
+ 237,
+ 255,
+ 0,
+ 255,
+ 255,
+ 255,
+ 253,
+ 255,
+ 241,
+ 253,
+ 255,
+ 234,
+ 252,
+ 255,
+ 227,
+ 251,
+ 255,
+ 214,
+ 249,
+ 255,
+ 201,
+ 246,
+ 255,
+ 177,
+ 242,
+ 255,
+ 156,
+ 233,
+ 255,
+ 117,
+ 225,
+ 255,
+ 83,
+ 206,
+ 255,
+ 33,
+ 183,
+ 255,
+ 2,
+ 255,
+ 255,
+ 255,
+ 251,
+ 255,
+ 242,
+ 250,
+ 255,
+ 236,
+ 248,
+ 255,
+ 230,
+ 244,
+ 255,
+ 218,
+ 241,
+ 255,
+ 207,
+ 233,
+ 255,
+ 186,
+ 225,
+ 255,
+ 166,
+ 210,
+ 255,
+ 130,
+ 194,
+ 255,
+ 99,
+ 162,
+ 255,
+ 49,
+ 129,
+ 255,
+ 15,
+ 255,
+ 255,
+ 255,
+ 250,
+ 255,
+ 243,
+ 247,
+ 255,
+ 238,
+ 244,
+ 255,
+ 233,
+ 239,
+ 255,
+ 223,
+ 233,
+ 255,
+ 214,
+ 221,
+ 255,
+ 196,
+ 210,
+ 255,
+ 179,
+ 188,
+ 255,
+ 148,
+ 164,
+ 255,
+ 122,
+ 120,
+ 255,
+ 79,
+ 78,
+ 255,
+ 46,
+ 255,
+ 255,
+ 255,
+ 248,
+ 255,
+ 246,
+ 244,
+ 255,
+ 241,
+ 241,
+ 255,
+ 237,
+ 234,
+ 255,
+ 229,
+ 226,
+ 255,
+ 222,
+ 211,
+ 255,
+ 208,
+ 197,
+ 255,
+ 195,
+ 169,
+ 255,
+ 171,
+ 140,
+ 255,
+ 151,
+ 90,
+ 255,
+ 114,
+ 45,
+ 255,
+ 84,
+ 255,
+ 255,
+ 255,
+ 246,
+ 255,
+ 249,
+ 241,
+ 255,
+ 246,
+ 236,
+ 255,
+ 245,
+ 226,
+ 255,
+ 242,
+ 215,
+ 255,
+ 241,
+ 195,
+ 255,
+ 237,
+ 176,
+ 255,
+ 234,
+ 138,
+ 255,
+ 227,
+ 103,
+ 255,
+ 222,
+ 42,
+ 255,
+ 210,
+ 0,
+ 255,
+ 198,
+ 255,
+ 255,
+ 255,
+ 244,
+ 255,
+ 252,
+ 239,
+ 255,
+ 251,
+ 233,
+ 255,
+ 250,
+ 222,
+ 255,
+ 251,
+ 211,
+ 255,
+ 252,
+ 189,
+ 255,
+ 254,
+ 167,
+ 255,
+ 255,
+ 127,
+ 255,
+ 255,
+ 89,
+ 255,
+ 255,
+ 22,
+ 255,
+ 255,
+ 0,
+ 255,
+ 255,
+ 255,
+ 255,
+ 255,
+ 243,
+ 255,
+ 255,
+ 237,
+ 255,
+ 255,
+ 231,
+ 255,
+ 255,
+ 219,
+ 255,
+ 255,
+ 207,
+ 255,
+ 255,
+ 184,
+ 255,
+ 255,
+ 161,
+ 255,
+ 255,
+ 117,
+ 255,
+ 255,
+ 77,
+ 255,
+ 255,
+ 4,
+ 255,
+ 255,
+ 0,
+ 255,
+ 255,
+ 255,
+ 255,
+ 255,
+ 242,
+ 255,
+ 255,
+ 236,
+ 255,
+ 255,
+ 230,
+ 255,
+ 255,
+ 218,
+ 255,
+ 255,
+ 206,
+ 255,
+ 255,
+ 182,
+ 255,
+ 255,
+ 158,
+ 255,
+ 255,
+ 110,
+ 255,
+ 255,
+ 63,
+ 255,
+ 255,
+ 0,
+ 255,
+ 255,
+ 0,
+ 255,
+ 255,
+ 255,
+ 255,
+ 255,
+ 244,
+ 255,
+ 255,
+ 238,
+ 255,
+ 255,
+ 233,
+ 255,
+ 255,
+ 222,
+ 255,
+ 255,
+ 210,
+ 255,
+ 255,
+ 187,
+ 255,
+ 255,
+ 163,
+ 255,
+ 255,
+ 115,
+ 255,
+ 255,
+ 64,
+ 255,
+ 255,
+ 0,
+ 255,
+ 255,
+ 0,
+ 255,
+ 255,
+ 255,
+ 255,
+ 255,
+ 246,
+ 255,
+ 255,
+ 242,
+ 255,
+ 255,
+ 237,
+ 255,
+ 255,
+ 227,
+ 255,
+ 255,
+ 216,
+ 255,
+ 255,
+ 194,
+ 255,
+ 255,
+ 172,
+ 255,
+ 255,
+ 125,
+ 255,
+ 255,
+ 75,
+ 255,
+ 255,
+ 0,
+ 255,
+ 255,
+ 0,
+ 255,
+ 255,
+ 255,
+ 255,
+ 255,
+ 248,
+ 255,
+ 255,
+ 245,
+ 255,
+ 255,
+ 241,
+ 255,
+ 255,
+ 233,
+ 255,
+ 255,
+ 223,
+ 255,
+ 255,
+ 205,
+ 255,
+ 255,
+ 185,
+ 255,
+ 255,
+ 143,
+ 255,
+ 255,
+ 95,
+ 255,
+ 255,
+ 0,
+ 255,
+ 255,
+ 0,
+ 255,
+ 255,
+ 255,
+ 255,
+ 255,
+ 250,
+ 255,
+ 255,
+ 247,
+ 254,
+ 255,
+ 244,
+ 254,
+ 255,
+ 238,
+ 254,
+ 255,
+ 230,
+ 254,
+ 255,
+ 216,
+ 254,
+ 255,
+ 199,
+ 254,
+ 255,
+ 164,
+ 254,
+ 255,
+ 124,
+ 254,
+ 255,
+ 31,
+ 253,
+ 255,
+ 0,
+ 249,
+ 255,
+ 255,
+ 255,
+ 255,
+ 252,
+ 254,
+ 255,
+ 250,
+ 253,
+ 255,
+ 247,
+ 253,
+ 255,
+ 243,
+ 252,
+ 255,
+ 237,
+ 251,
+ 255,
+ 226,
+ 249,
+ 255,
+ 214,
+ 247,
+ 255,
+ 187,
+ 242,
+ 255,
+ 157,
+ 237,
+ 255,
+ 84,
+ 225,
+ 255,
+ 0,
+ 210,
+ 255,
+ 255,
+ 255,
+ 255,
+ 253,
+ 253,
+ 255,
+ 252,
+ 252,
+ 255,
+ 250,
+ 251,
+ 255,
+ 247,
+ 249,
+ 255,
+ 244,
+ 247,
+ 255,
+ 237,
+ 244,
+ 255,
+ 229,
+ 240,
+ 255,
+ 211,
+ 231,
+ 255,
+ 192,
+ 221,
+ 255,
+ 145,
+ 198,
+ 255,
+ 81,
+ 174,
+ 255,
+ 255,
+ 255,
+ 255,
+ 254,
+ 253,
+ 255,
+ 254,
+ 251,
+ 255,
+ 253,
+ 250,
+ 255,
+ 252,
+ 247,
+ 255,
+ 251,
+ 244,
+ 255,
+ 248,
+ 239,
+ 255,
+ 245,
+ 233,
+ 255,
+ 236,
+ 221,
+ 255,
+ 229,
+ 207,
+ 255,
+ 208,
+ 175,
+ 255,
+ 173,
+ 141,
+ 255,
+ 255,
+ 255,
+ 255,
+ 255,
+ 252,
+ 255,
+ 255,
+ 250,
+ 255,
+ 255,
+ 249,
+ 255,
+ 255,
+ 245,
+ 255,
+ 255,
+ 242,
+ 255,
+ 255,
+ 234,
+ 255,
+ 255,
+ 227,
+ 255,
+ 255,
+ 211,
+ 255,
+ 255,
+ 193,
+ 255,
+ 255,
+ 154,
+ 255,
+ 255,
+ 112,
+ 255,
+ 255,
+ 255,
+ 255,
+ 255,
+ 252,
+ 255,
+ 255,
+ 250,
+ 255,
+ 255,
+ 247,
+ 255,
+ 255,
+ 243,
+ 255,
+ 255,
+ 239,
+ 255,
+ 255,
+ 230,
+ 255,
+ 255,
+ 221,
+ 255,
+ 255,
+ 202,
+ 255,
+ 255,
+ 180,
+ 255,
+ 255,
+ 135,
+ 255,
+ 255,
+ 86,
+ 255,
+ 255,
+ 255,
+ 255,
+ 255,
+ 251,
+ 255,
+ 255,
+ 249,
+ 255,
+ 255,
+ 246,
+ 255,
+ 255,
+ 241,
+ 255,
+ 255,
+ 236,
+ 255,
+ 255,
+ 226,
+ 255,
+ 255,
+ 215,
+ 255,
+ 255,
+ 192,
+ 255,
+ 255,
+ 168,
+ 255,
+ 255,
+ 117,
+ 255,
+ 255,
+ 61,
+ 255,
+ 255,
+ 255,
+ 255,
+ 255,
+ 250,
+ 255,
+ 255,
+ 248,
+ 255,
+ 255,
+ 245,
+ 255,
+ 255,
+ 239,
+ 255,
+ 255,
+ 234,
+ 255,
+ 255,
+ 222,
+ 255,
+ 255,
+ 210,
+ 255,
+ 255,
+ 184,
+ 255,
+ 255,
+ 158,
+ 255,
+ 255,
+ 100,
+ 255,
+ 255,
+ 38,
+ 255
+};
+
+#endif
diff --git a/scan/sane/xml.c b/scan/sane/xml.c
new file mode 100644
index 0000000..5c3780c
--- /dev/null
+++ b/scan/sane/xml.c
@@ -0,0 +1,126 @@
+/************************************************************************************\
+
+ xml.c - HP SANE backend support for xml parsing
+
+ (c) 2008 Copyright Hewlett-Packard Development Company, LP
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+ of the Software, and to permit persons to whom the Software is furnished to do
+ so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+ Author: David Suffield
+
+\************************************************************************************/
+
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE
+#endif
+
+#include <string.h>
+#include <stdlib.h>
+
+int __attribute__ ((visibility ("hidden"))) get_array_size(const char *tag)
+{
+ char *p, *tail;
+
+ if ((p = strstr(tag, "arraySize=\"")))
+ return strtol(p+11, &tail, 10);
+ else
+ return 0;
+}
+
+/* Get xml element from the buffer. The returned element is zero terminated. */
+int __attribute__ ((visibility ("hidden"))) get_element(const char *buf, int buf_size, char *element, int element_size, char **tail)
+{
+ int i, j;
+
+ element[0]=0;
+
+ for (i=0, j=0; buf[i] != '<' && j < (element_size-1) && i < buf_size; i++)
+ element[j++] = buf[i];
+
+ element[j]=0; /* zero terminate */
+
+ if (tail != NULL)
+ *tail = (char *)buf + i; /* tail points to next tag */
+
+ return j; /* length does not include zero termination */
+}
+
+/* Get next xml tag from the buffer. The returned xml tag is zero terminated. */
+int __attribute__ ((visibility ("hidden"))) get_tag(const char *buf, int buf_size, char *tag, int tag_size, char **tail)
+{
+ int i=0, j=0, dd=0, lf=0;
+
+ tag[0]=0;
+
+ while (1)
+ {
+ for (; buf[i] != '<' && i < buf_size; i++); /* eat up space before '<' */
+
+ if (buf[i] != '<')
+ break;
+
+ if (i < (buf_size-4) && (strncmp(&buf[i], "<!--", 4) == 0))
+ {
+ for (; buf[i] != '>' && i < buf_size; i++); /* eat comment line */
+ i++;
+ continue;
+ }
+
+ i++; /* eat '<' */
+
+ for (j=0; buf[i] != '>' && j < (tag_size-1) && i < buf_size; i++)
+ {
+ if (buf[i] == '\r')
+ {
+ tag[j++] = '\n'; /* convert CR to LF */
+ lf=1; /* set remove back-to-back LF flag */
+ }
+ else if (buf[i] == '\n')
+ {
+ if (!lf)
+ tag[j++] = buf[i];
+ }
+ else if (buf[i] == ' ')
+ {
+ if (!dd)
+ {
+ tag[j++] = buf[i];
+ dd=1; /* set remove back-to-back space flag */
+ }
+ }
+ else
+ {
+ tag[j++] = buf[i];
+ dd=0;
+ lf=0;
+ }
+ }
+ break;
+ }
+
+ if (i < buf_size)
+ i++; /* eat '>' */
+
+ tag[j]=0; /* zero terminate */
+
+ if (tail != NULL)
+ *tail = (char *)buf + i; /* tail points to next tag */
+
+ return j; /* length does no include zero termination */
+}
+
diff --git a/scan/sane/xml.h b/scan/sane/xml.h
new file mode 100644
index 0000000..3ed1dc4
--- /dev/null
+++ b/scan/sane/xml.h
@@ -0,0 +1,36 @@
+/************************************************************************************\
+
+ xml.h - HP SANE backend support for xml parsing
+
+ (c) 2008 Copyright Hewlett-Packard Development Company, LP
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+ of the Software, and to permit persons to whom the Software is furnished to do
+ so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+ Author: David Suffield
+
+\************************************************************************************/
+#ifndef _MXML_H
+#define _MXML_H
+
+int __attribute__ ((visibility ("hidden"))) get_array_size(const char *tag);
+/* Get xml element from the buffer. The returned element is zero terminated. */
+int __attribute__ ((visibility ("hidden"))) get_element(const char *buf, int buf_size, char *element, int element_size, char **tail);
+/* Get next xml tag from the buffer. The returned xml tag is zero terminated. */
+int __attribute__ ((visibility ("hidden"))) get_tag(const char *buf, int buf_size, char *tag, int tag_size, char **tail);
+
+#endif // _MXML_H
diff --git a/scan/scanext/scanext.c b/scan/scanext/scanext.c
new file mode 100755
index 0000000..34815d0
--- /dev/null
+++ b/scan/scanext/scanext.c
@@ -0,0 +1,748 @@
+/*******************************************************************
+scanext - Python extension class for SANE
+
+Portions (c) Copyright 2007 Hewlett-Packard Development Company, L.P.
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+Based on:
+"_sane.c", part of the Python Imaging Library (PIL)
+http://www.pythonware.com/products/pil/
+
+Modified to work without PIL by Don Welch
+
+(C) Copyright 2003 A.M. Kuchling. All Rights Reserved
+(C) Copyright 2004 A.M. Kuchling, Ralph Heinkel All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the name of A.M. Kuchling and
+Ralph Heinkel not be used in advertising or publicity pertaining to
+distribution of the software without specific, written prior permission.
+
+A.M. KUCHLING, R.H. HEINKEL DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
+SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS,
+IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
+USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+PERFORMANCE OF THIS SOFTWARE.
+
+*******************************************************************/
+
+
+/* _ScanDevice objects */
+
+#include "Python.h"
+#include "sane.h"
+#include <sys/time.h>
+
+static PyObject *ErrorObject;
+
+typedef struct
+{
+ PyObject_HEAD SANE_Handle h;
+} _ScanDevice;
+
+#ifdef WITH_THREAD
+PyThreadState *_save;
+#endif
+
+/* Raise a SANE exception using a SANE_Status code */
+PyObject *raiseSaneError (SANE_Status st)
+{
+ const char *string;
+
+ if (st == SANE_STATUS_GOOD)
+ {
+ Py_INCREF (Py_None);
+ return (Py_None);
+ }
+
+ string = sane_strstatus (st);
+ //PyErr_SetString (ErrorObject, string);
+ PyErr_SetObject(ErrorObject, PyInt_FromLong(st));
+ return NULL;
+}
+
+/* Raise an exception using a character string */
+PyObject * raiseError(const char * str)
+{
+ PyErr_SetString (ErrorObject, str);
+ return NULL;
+}
+
+/* Raise an exception using a character string */
+PyObject * raiseDeviceClosedError(void)
+{
+ return raiseError ("_ScanDevice object is closed");
+}
+
+static PyObject *getErrorMessage(PyObject * self, PyObject * args)
+{
+ int st;
+
+ if (!PyArg_ParseTuple (args, "i", &st))
+ raiseError("Invalid arguments.");
+
+ return Py_BuildValue("s", sane_strstatus (st));
+}
+
+staticforward PyTypeObject ScanDevice_type;
+
+#define SaneDevObject_Check(v) ((v)->ob_type == &ScanDevice_type)
+
+static _ScanDevice *newScanDeviceObject (void)
+{
+ _ScanDevice *self;
+
+ self = PyObject_NEW (_ScanDevice, &ScanDevice_type);
+
+ if (self == NULL)
+ return NULL;
+
+ self->h = NULL;
+ return self;
+}
+
+
+/* _ScanDevice methods */
+
+static void deAlloc (_ScanDevice * self)
+{
+ if (self->h)
+ sane_close (self->h);
+
+ self->h = NULL;
+ PyObject_DEL (self);
+}
+
+static PyObject *closeScan (_ScanDevice * self, PyObject * args)
+{
+ if (!PyArg_ParseTuple (args, ""))
+ return NULL;
+
+ if (self->h)
+ sane_close (self->h);
+
+ self->h = NULL;
+ Py_INCREF (Py_None);
+ return (Py_None);
+}
+
+static PyObject *getParameters (_ScanDevice * self, PyObject * args)
+{
+ SANE_Status st;
+ SANE_Parameters p;
+ char *format_name = "unknown";
+
+ if (!PyArg_ParseTuple (args, ""))
+ raiseError("Invalid arguments.");
+
+ if (self->h == NULL)
+ return raiseDeviceClosedError();
+
+ Py_BEGIN_ALLOW_THREADS
+ st = sane_get_parameters (self->h, &p);
+ Py_END_ALLOW_THREADS
+
+ if (st != SANE_STATUS_GOOD)
+ return raiseSaneError (st);
+
+ switch (p.format)
+ {
+ case (SANE_FRAME_GRAY):
+ format_name = "gray";
+ break;
+ case (SANE_FRAME_RGB):
+ format_name = "color";
+ break;
+ case (SANE_FRAME_RED):
+ format_name = "red";
+ break;
+ case (SANE_FRAME_GREEN):
+ format_name = "green";
+ break;
+ case (SANE_FRAME_BLUE):
+ format_name = "blue";
+ break;
+ }
+
+ return Py_BuildValue ("isiiiii", p.format, format_name,
+ p.last_frame, p.pixels_per_line,
+ p.lines, p.depth, p.bytes_per_line);
+}
+
+static PyObject *startScan (_ScanDevice * self, PyObject * args)
+{
+ SANE_Status st;
+
+ if (!PyArg_ParseTuple (args, ""))
+ raiseError("Invalid arguments.");
+
+ if (self->h == NULL)
+ return raiseDeviceClosedError();
+
+ /* sane_start can take several seconds, if the user initiates
+ a new scan, while the scan head of a flatbed scanner moves
+ back to the start position after finishing a previous scan.
+ Hence it is worth to allow threads here.
+ */
+ Py_BEGIN_ALLOW_THREADS
+ st = sane_start (self->h);
+ Py_END_ALLOW_THREADS
+
+ if (st != SANE_STATUS_GOOD &&
+ st != SANE_STATUS_EOF &&
+ st != SANE_STATUS_NO_DOCS)
+ return raiseSaneError(st);
+
+ return Py_BuildValue("i", st);
+}
+
+static PyObject *cancelScan (_ScanDevice * self, PyObject * args)
+{
+ if (!PyArg_ParseTuple (args, ""))
+ raiseError("Invalid arguments.");
+
+ if (self->h == NULL)
+ return raiseDeviceClosedError();
+
+ sane_cancel (self->h);
+ Py_INCREF (Py_None);
+ return Py_None;
+}
+
+static PyObject *getOptions (_ScanDevice * self, PyObject * args)
+{
+ const SANE_Option_Descriptor *d;
+ PyObject *list, *value;
+ int i = 1;
+
+ if (!PyArg_ParseTuple (args, ""))
+ raiseError("Invalid arguments.");
+
+ if (self->h == NULL)
+ return raiseDeviceClosedError();
+
+ if (!(list = PyList_New (0)))
+ raiseError("Unable to allocate list.");
+
+ do
+ {
+ d = sane_get_option_descriptor (self->h, i);
+ if (d != NULL)
+ {
+ PyObject *constraint = NULL;
+ int j;
+
+ switch (d->constraint_type)
+ {
+ case (SANE_CONSTRAINT_NONE):
+ Py_INCREF (Py_None);
+ constraint = Py_None;
+ break;
+ case (SANE_CONSTRAINT_RANGE):
+ if (d->type == SANE_TYPE_INT)
+ constraint =
+ Py_BuildValue ("iii", d->constraint.range->min,
+ d->constraint.range->max,
+ d->constraint.range->quant);
+ else
+ constraint = Py_BuildValue ("ddd",
+ SANE_UNFIX (d->
+ constraint.
+ range->min),
+ SANE_UNFIX (d->
+ constraint.
+ range->max),
+ SANE_UNFIX (d->
+ constraint.
+ range->quant));
+ break;
+ case (SANE_CONSTRAINT_WORD_LIST):
+ constraint = PyList_New (d->constraint.word_list[0]);
+
+ if (d->type == SANE_TYPE_INT)
+ for (j = 1; j <= d->constraint.word_list[0]; j++)
+ PyList_SetItem (constraint, j - 1,
+ PyInt_FromLong (d->constraint.
+ word_list[j]));
+ else
+ for (j = 1; j <= d->constraint.word_list[0]; j++)
+ PyList_SetItem (constraint, j - 1,
+ PyFloat_FromDouble (SANE_UNFIX
+ (d->
+ constraint.
+ word_list[j])));
+ break;
+ case (SANE_CONSTRAINT_STRING_LIST):
+ constraint = PyList_New (0);
+
+ for (j = 0; d->constraint.string_list[j] != NULL; j++)
+ PyList_Append (constraint,
+ PyString_FromString (d->constraint.
+ string_list[j]));
+ break;
+ }
+ value = Py_BuildValue ("isssiiiiO", i, d->name, d->title, d->desc,
+ d->type, d->unit, d->size, d->cap, constraint);
+
+ PyList_Append (list, value);
+ }
+ i++;
+ }
+
+ while (d != NULL);
+ return list;
+}
+
+static PyObject *getOption (_ScanDevice * self, PyObject * args)
+{
+ SANE_Status st;
+ const SANE_Option_Descriptor *d;
+ PyObject *value = NULL;
+ int n;
+ void *v;
+
+ if (!PyArg_ParseTuple (args, "i", &n))
+ raiseError("Invalid arguments.");
+
+ if (self->h == NULL)
+ return raiseDeviceClosedError();
+
+ d = sane_get_option_descriptor (self->h, n);
+ v = malloc (d->size + 1);
+ st = sane_control_option (self->h, n, SANE_ACTION_GET_VALUE, v, NULL);
+
+ if (st != SANE_STATUS_GOOD)
+ {
+ free (v);
+ return raiseSaneError(st);
+ }
+
+ switch (d->type)
+ {
+ case (SANE_TYPE_BOOL):
+ case (SANE_TYPE_INT):
+ value = Py_BuildValue ("i", *((SANE_Int *) v));
+ break;
+
+ case (SANE_TYPE_FIXED):
+ value = Py_BuildValue ("d", SANE_UNFIX ((*((SANE_Fixed *) v))));
+ break;
+
+ case (SANE_TYPE_STRING):
+ value = Py_BuildValue ("s", v);
+ break;
+
+ case (SANE_TYPE_BUTTON):
+ case (SANE_TYPE_GROUP):
+ value = Py_BuildValue ("O", Py_None);
+ break;
+ }
+
+ free (v);
+ return value;
+}
+
+static PyObject *setOption (_ScanDevice * self, PyObject * args)
+{
+ SANE_Status st;
+ const SANE_Option_Descriptor *d;
+ SANE_Int i;
+ PyObject *value;
+ int n;
+
+ if (!PyArg_ParseTuple (args, "iO", &n, &value))
+ raiseError("Invalid arguments.");
+
+ if (self->h == NULL)
+ return raiseDeviceClosedError();
+
+ d = sane_get_option_descriptor (self->h, n);
+ switch (d->type)
+ {
+ case (SANE_TYPE_BOOL):
+ if (!PyInt_Check (value))
+ return raiseError("SANE_Bool requires an integer.");
+
+ SANE_Bool b = PyInt_AsLong(value);
+
+ if (b != SANE_FALSE && b > SANE_TRUE)
+ b = SANE_TRUE;
+
+ st = sane_control_option (self->h, n, SANE_ACTION_SET_VALUE, (void *)&b, &i);
+ break;
+
+ case (SANE_TYPE_INT):
+ if (!PyInt_Check (value))
+ return raiseError("SANE_Int requires an integer.");
+
+ SANE_Int j = PyInt_AsLong (value);
+ st = sane_control_option (self->h, n, SANE_ACTION_SET_VALUE, (void *)&j, &i);
+ break;
+
+ case (SANE_TYPE_FIXED):
+ if (!PyFloat_Check (value))
+ return raiseError("SANE_Fixed requires an float.");
+
+ SANE_Fixed f = SANE_FIX (PyFloat_AsDouble (value));
+ st = sane_control_option (self->h, n, SANE_ACTION_SET_VALUE, (void *)&f, &i);
+ break;
+
+ case (SANE_TYPE_STRING):
+ if (!PyString_Check (value))
+ return raiseError("SANE_String requires a a string.");
+
+ SANE_String s = malloc (d->size + 1);
+ strncpy (s, PyString_AsString (value), d->size - 1);
+ ((SANE_String) s)[d->size - 1] = 0;
+ st = sane_control_option (self->h, n, SANE_ACTION_SET_VALUE, (void *)s, &i);
+ free(s);
+ break;
+
+ case (SANE_TYPE_BUTTON):
+ case (SANE_TYPE_GROUP):
+ break;
+ }
+
+ if (st != SANE_STATUS_GOOD)
+ return raiseSaneError(st);
+
+ return Py_BuildValue ("i", i);
+}
+
+static PyObject *setAutoOption (_ScanDevice * self, PyObject * args)
+{
+ SANE_Status st;
+ const SANE_Option_Descriptor *d;
+ SANE_Int i;
+ int n;
+
+ if (!PyArg_ParseTuple (args, "i", &n))
+ raiseError("Invalid arguments.");
+
+ if (self->h == NULL)
+ return raiseDeviceClosedError();
+
+ d = sane_get_option_descriptor (self->h, n);
+ st = sane_control_option (self->h, n, SANE_ACTION_SET_AUTO, NULL, &i);
+
+ if (st != SANE_STATUS_GOOD)
+ return raiseSaneError (st);
+
+ return Py_BuildValue ("i", i);
+}
+
+#define MAX_READSIZE 32768
+
+static PyObject *readScan (_ScanDevice * self, PyObject * args)
+{
+ SANE_Status st;
+ SANE_Int len;
+ SANE_Byte buffer[MAX_READSIZE];
+ int bytes_to_read;
+
+ if (!PyArg_ParseTuple (args, "i", &bytes_to_read))
+ raiseError("Invalid arguments.");
+
+ if (bytes_to_read > MAX_READSIZE)
+ return raiseError("bytes_to_read > MAX_READSIZE");
+
+ if (self->h == NULL)
+ return raiseDeviceClosedError();
+
+ //Py_BEGIN_ALLOW_THREADS
+ Py_UNBLOCK_THREADS
+ st = sane_read (self->h, buffer, bytes_to_read, &len);
+ //Py_END_ALLOW_THREADS
+ Py_BLOCK_THREADS
+
+ if (st != SANE_STATUS_GOOD &&
+ st != SANE_STATUS_EOF &&
+ st != SANE_STATUS_NO_DOCS)
+ {
+ sane_cancel(self->h);
+ //Py_BLOCK_THREADS
+ return raiseSaneError(st);
+ }
+
+ return Py_BuildValue ("(iz#)", st, buffer, len);
+}
+
+
+static PyMethodDef ScanDevice_methods[] = {
+ {"getParameters", (PyCFunction) getParameters, METH_VARARGS},
+
+ {"getOptions", (PyCFunction) getOptions, METH_VARARGS},
+ {"getOption", (PyCFunction) getOption, METH_VARARGS},
+ {"setOption", (PyCFunction) setOption, METH_VARARGS},
+ {"setAutoOption", (PyCFunction) setAutoOption, METH_VARARGS},
+
+ {"startScan", (PyCFunction) startScan, METH_VARARGS},
+ {"cancelScan", (PyCFunction) cancelScan, METH_VARARGS},
+ {"readScan", (PyCFunction) readScan, METH_VARARGS},
+ {"closeScan", (PyCFunction) closeScan, METH_VARARGS},
+ {NULL, NULL}
+};
+
+static PyObject *getAttr (_ScanDevice * self, char *name)
+{
+ return Py_FindMethod (ScanDevice_methods, (PyObject *) self, name);
+}
+
+staticforward PyTypeObject ScanDevice_type = {
+ PyObject_HEAD_INIT (&PyType_Type) 0, /*ob_size */
+ "_ScanDevice", /*tp_name */
+ sizeof (_ScanDevice), /*tp_basicsize */
+ 0, /*tp_itemsize */
+ /* methods */
+ (destructor) deAlloc, /*tp_dealloc */
+ 0, /*tp_print */
+ (getattrfunc) getAttr, /*tp_getattr */
+ 0, /*tp_setattr */
+ 0, /*tp_compare */
+ 0, /*tp_repr */
+ 0, /*tp_as_number */
+ 0, /*tp_as_sequence */
+ 0, /*tp_as_mapping */
+ 0, /*tp_hash */
+};
+
+/* --------------------------------------------------------------------- */
+
+static void auth_callback (SANE_String_Const resource,
+ SANE_Char * username, SANE_Char * password)
+{
+ printf("auth_callback\n");
+}
+
+static PyObject *init (PyObject * self, PyObject * args)
+{
+ SANE_Status st;
+ SANE_Int version;
+
+ if (!PyArg_ParseTuple (args, ""))
+ raiseError("Invalid arguments.");
+
+ /* XXX Authorization is not yet supported */
+ st = sane_init (&version, auth_callback);
+
+ if (st != SANE_STATUS_GOOD)
+ return raiseSaneError (st);
+
+ return Py_BuildValue ("iiii", version, SANE_VERSION_MAJOR (version),
+ SANE_VERSION_MINOR (version),
+ SANE_VERSION_BUILD (version));
+
+}
+
+
+
+static PyObject *deInit (PyObject * self, PyObject * args)
+{
+ if (!PyArg_ParseTuple (args, ""))
+ raiseError("Invalid arguments");
+
+ sane_exit ();
+ Py_INCREF (Py_None);
+ return Py_None;
+}
+
+static PyObject *getDevices (PyObject * self, PyObject * args)
+{
+ const SANE_Device **device_list;
+ SANE_Status st;
+ PyObject *list;
+ int local_only=SANE_FALSE, i;
+
+ if (!PyArg_ParseTuple (args, "|i", &local_only))
+ raiseError("Invalid arguments");
+
+ st = sane_get_devices (&device_list, local_only);
+
+ if (st != SANE_STATUS_GOOD)
+ return raiseSaneError (st);
+
+ if (!(list = PyList_New (0)))
+ return raiseError("Unable to allocate device list.");
+
+ for (i=0; device_list[i]; i++)
+ {
+ PyList_Append (list, Py_BuildValue ("ssss", device_list[i]->name, device_list[i]->vendor,
+ device_list[i]->model, device_list[i]->type));
+ }
+
+ return list;
+}
+
+/* Function returning new _ScanDevice object */
+
+static PyObject *openDevice (PyObject * self, PyObject * args)
+{
+ _ScanDevice *rv;
+ SANE_Status st;
+ char *name;
+
+ if (!PyArg_ParseTuple (args, "s", &name))
+ raiseError("Invalid arguments");
+
+ rv = newScanDeviceObject ();
+
+ if (rv == NULL)
+ return raiseError("Unable to create _ScanDevice object.");
+
+ st = sane_open (name, &(rv->h));
+
+ if (st != SANE_STATUS_GOOD)
+ {
+ Py_DECREF (rv);
+ return raiseSaneError (st);
+ }
+ return (PyObject *) rv;
+}
+
+static PyObject *isOptionActive (PyObject * self, PyObject * args)
+{
+ SANE_Int cap;
+ long lg;
+
+ if (!PyArg_ParseTuple (args, "l", &lg))
+ raiseError("Invalid arguments");
+
+ cap = lg;
+ return PyInt_FromLong (SANE_OPTION_IS_ACTIVE (cap));
+}
+
+static PyObject *isOptionSettable (PyObject * self, PyObject * args)
+{
+ SANE_Int cap;
+ long lg;
+
+ if (!PyArg_ParseTuple (args, "l", &lg))
+ raiseError("Invalid arguments");
+
+ cap = lg;
+ return PyInt_FromLong (SANE_OPTION_IS_SETTABLE (cap));
+}
+
+
+/* List of functions defined in the module */
+
+static PyMethodDef ScanExt_methods[] = {
+ {"init", init, METH_VARARGS},
+ {"deInit", deInit, METH_VARARGS},
+ {"getDevices", getDevices, METH_VARARGS},
+ {"openDevice", openDevice, METH_VARARGS},
+ {"isOptionActive", isOptionActive, METH_VARARGS},
+ {"isOptionSettable", isOptionSettable, METH_VARARGS},
+ {"getErrorMessage", getErrorMessage, METH_VARARGS},
+ {NULL, NULL} /* sentinel */
+};
+
+
+static void insint (PyObject * d, char *name, int value)
+{
+ PyObject *v = PyInt_FromLong ((long) value);
+
+ if (!v || PyDict_SetItemString (d, name, v))
+ Py_FatalError ("can't initialize sane module");
+
+ Py_DECREF (v);
+}
+
+void initscanext (void)
+{
+ PyObject *m, *d;
+
+ /* Create the module and add the functions */
+ m = Py_InitModule ("scanext", ScanExt_methods);
+
+ /* Add some symbolic constants to the module */
+ d = PyModule_GetDict (m);
+ ErrorObject = PyString_FromString ("scanext.error");
+ PyDict_SetItemString (d, "error", ErrorObject);
+
+ insint (d, "INFO_INEXACT", SANE_INFO_INEXACT);
+ insint (d, "INFO_RELOAD_OPTIONS", SANE_INFO_RELOAD_OPTIONS);
+ insint (d, "RELOAD_PARAMS", SANE_INFO_RELOAD_PARAMS);
+
+ insint (d, "FRAME_GRAY", SANE_FRAME_GRAY);
+ insint (d, "FRAME_RGB", SANE_FRAME_RGB);
+ insint (d, "FRAME_RED", SANE_FRAME_RED);
+ insint (d, "FRAME_GREEN", SANE_FRAME_GREEN);
+ insint (d, "FRAME_BLUE", SANE_FRAME_BLUE);
+
+ insint (d, "CONSTRAINT_NONE", SANE_CONSTRAINT_NONE);
+ insint (d, "CONSTRAINT_RANGE", SANE_CONSTRAINT_RANGE);
+ insint (d, "CONSTRAINT_WORD_LIST", SANE_CONSTRAINT_WORD_LIST);
+ insint (d, "CONSTRAINT_STRING_LIST", SANE_CONSTRAINT_STRING_LIST);
+
+ insint (d, "TYPE_BOOL", SANE_TYPE_BOOL);
+ insint (d, "TYPE_INT", SANE_TYPE_INT);
+ insint (d, "TYPE_FIXED", SANE_TYPE_FIXED);
+ insint (d, "TYPE_STRING", SANE_TYPE_STRING);
+ insint (d, "TYPE_BUTTON", SANE_TYPE_BUTTON);
+ insint (d, "TYPE_GROUP", SANE_TYPE_GROUP);
+
+ insint (d, "UNIT_NONE", SANE_UNIT_NONE);
+ insint (d, "UNIT_PIXEL", SANE_UNIT_PIXEL);
+ insint (d, "UNIT_BIT", SANE_UNIT_BIT);
+ insint (d, "UNIT_MM", SANE_UNIT_MM);
+ insint (d, "UNIT_DPI", SANE_UNIT_DPI);
+ insint (d, "UNIT_PERCENT", SANE_UNIT_PERCENT);
+ insint (d, "UNIT_MICROSECOND", SANE_UNIT_MICROSECOND);
+
+ insint (d, "CAP_SOFT_SELECT", SANE_CAP_SOFT_SELECT);
+ insint (d, "CAP_HARD_SELECT", SANE_CAP_HARD_SELECT);
+ insint (d, "CAP_SOFT_DETECT", SANE_CAP_SOFT_DETECT);
+ insint (d, "CAP_EMULATED", SANE_CAP_EMULATED);
+ insint (d, "CAP_AUTOMATIC", SANE_CAP_AUTOMATIC);
+ insint (d, "CAP_INACTIVE", SANE_CAP_INACTIVE);
+ insint (d, "CAP_ADVANCED", SANE_CAP_ADVANCED);
+
+ /* handy for checking array lengths: */
+ insint (d, "SANE_WORD_SIZE", sizeof (SANE_Word));
+
+ /* possible return values of set_option() */
+ insint (d, "INFO_INEXACT", SANE_INFO_INEXACT);
+ insint (d, "INFO_RELOAD_OPTIONS", SANE_INFO_RELOAD_OPTIONS);
+ insint (d, "INFO_RELOAD_PARAMS", SANE_INFO_RELOAD_PARAMS);
+
+ // SANE status codes
+ insint (d, "SANE_STATUS_GOOD", SANE_STATUS_GOOD); //Operation completed succesfully.
+ insint (d, "SANE_STATUS_UNSUPPORTED", SANE_STATUS_UNSUPPORTED); // Operation is not supported.
+ insint (d, "SANE_STATUS_CANCELLED", SANE_STATUS_CANCELLED); //Operation was cancelled.
+ insint (d, "SANE_STATUS_DEVICE_BUSY", SANE_STATUS_DEVICE_BUSY); // Device is busy---retry later.
+ insint (d, "SANE_STATUS_INVAL", SANE_STATUS_INVAL); // Data or argument is invalid.
+ insint (d, "SANE_STATUS_EOF", SANE_STATUS_EOF); // No more data available (end-of-file).
+ insint (d, "SANE_STATUS_JAMMED", SANE_STATUS_JAMMED); // Document feeder jammed.
+ insint (d, "SANE_STATUS_NO_DOCS", SANE_STATUS_NO_DOCS); // Document feeder out of documents.
+ insint (d, "SANE_STATUS_COVER_OPEN", SANE_STATUS_COVER_OPEN); // Scanner cover is open.
+ insint (d, "SANE_STATUS_IO_ERROR", SANE_STATUS_IO_ERROR); // Error during device I/O.
+ insint (d, "SANE_STATUS_NO_MEM", SANE_STATUS_NO_MEM); // Out of memory.
+ insint (d, "SANE_STATUS_ACCESS_DENIED", SANE_STATUS_ACCESS_DENIED); // Access to resource has been denied.
+
+ // Maximum buffer size for read()
+ insint(d, "MAX_READSIZE", MAX_READSIZE);
+
+ /* Check for errors */
+ if (PyErr_Occurred ())
+ Py_FatalError ("can't initialize module scanext");
+
+}
diff --git a/sendfax.py b/sendfax.py
new file mode 100755
index 0000000..d30ae2d
--- /dev/null
+++ b/sendfax.py
@@ -0,0 +1,572 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2009 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+# Thanks to Henrique M. Holschuh <hmh@debian.org> for various security patches
+#
+
+__version__ = '9.0'
+__title__ = 'PC Sendfax Utility'
+__mod__ = 'hp-sendfax'
+__doc__ = "PC send fax for HPLIP supported multifunction printers."
+
+# Std Lib
+import sys
+import os
+import os.path
+import getopt
+import signal
+import time
+import operator
+
+# Local
+from base.g import *
+import base.utils as utils
+from base import device, tui, module
+
+username = prop.username
+faxnum_list = []
+recipient_list = []
+group_list = []
+prettyprint = False
+
+mod = module.Module(__mod__, __title__, __version__, __doc__, None,
+ (GUI_MODE, NON_INTERACTIVE_MODE),
+ (UI_TOOLKIT_QT3, UI_TOOLKIT_QT4))
+
+mod.setUsage(module.USAGE_FLAG_DEVICE_ARGS | module.USAGE_FLAG_SUPRESS_G_DEBUG_FLAG,
+ extra_options=[
+ ("Specify the fax number(s):", "-f<number(s)> or --faxnum=<number(s)> or --fax-num=<number(s)> or --num=<number(s)>(-n only)", "option", False),
+ ("Specify the recipient(s):", "-r<recipient(s)> or --recipient=<recipient(s)> (-n only)", "option", False),
+ ("Specify the groups(s):", "--group=<group(s)> or --groups=<group(s)> (-n only)", "option", False) ],
+ see_also_list=['hp-faxsetup', 'hp-fab'])
+
+opts, device_uri, printer_name, mode, ui_toolkit, loc = \
+ mod.parseStdOpts('f:r:g:',
+ ['faxnum=', 'fax-num=', 'recipient=', 'group=',
+ 'groups=', 'gg'],
+ supress_g_debug_flag=True)
+
+for o, a in opts:
+ if o == '--gg':
+ log.set_level('debug')
+
+ elif o in ('-z', '--logfile'):
+ log.set_logfile(a)
+ log.set_where(log.LOG_TO_CONSOLE_AND_FILE)
+
+ elif o == '--fax':
+ printer_name = a
+
+ elif o in ('-f', '--faxnum', '--fax-num', '--num'):
+ faxnum_list.extend(a.split(','))
+
+ elif o in ('-r', '--recipient'):
+ recipient_list.extend(a.split(','))
+
+ elif o in ('-g', '--group'):
+ group_list.extend(a.split(','))
+
+
+if not prop.fax_build:
+ log.error("Fax is disabled (turned off during build). Exiting")
+ sys.exit(1)
+
+printer_name, device_uri = mod.getPrinterName(printer_name, device_uri,
+ filter={'fax-type': (operator.gt, 0)}, back_end_filter=['hpfax'])
+
+if mode == GUI_MODE:
+ if ui_toolkit == 'qt3':
+ if not utils.canEnterGUIMode():
+ log.error("%s requires GUI support (try running with --qt4). Also, try using non-interactive (-n) mode." % __mod__)
+ sys.exit(1)
+ else:
+ if not utils.canEnterGUIMode4():
+ log.error("%s requires GUI support (try running with --qt3). Also, try using non-interactive (-n) mode." % __mod__)
+ sys.exit(1)
+
+if mode == GUI_MODE:
+ if ui_toolkit == 'qt3':
+ app = None
+ sendfax = None
+
+ try:
+ from qt import *
+ from ui.faxsendjobform import FaxSendJobForm
+ except ImportError:
+ log.error("Unable to load Qt3 support. Is it installed?")
+ sys.exit(1)
+
+ # create the main application object
+ app = QApplication(sys.argv)
+
+ if loc is None:
+ loc = user_conf.get('ui', 'loc', 'system')
+ if loc.lower() == 'system':
+ loc = str(QTextCodec.locale())
+ log.debug("Using system locale: %s" % loc)
+
+ if loc.lower() != 'c':
+ e = 'utf8'
+ try:
+ l, x = loc.split('.')
+ loc = '.'.join([l, e])
+ except ValueError:
+ l = loc
+ loc = '.'.join([loc, e])
+
+ log.debug("Trying to load .qm file for %s locale." % loc)
+ trans = QTranslator(None)
+
+ qm_file = 'hplip_%s.qm' % l
+ log.debug("Name of .qm file: %s" % qm_file)
+ loaded = trans.load(qm_file, prop.localization_dir)
+
+ if loaded:
+ app.installTranslator(trans)
+ else:
+ loc = 'c'
+
+ if loc == 'c':
+ log.debug("Using default 'C' locale")
+ else:
+ log.debug("Using locale: %s" % loc)
+
+ QLocale.setDefault(QLocale(loc))
+ prop.locale = loc
+ try:
+ locale.setlocale(locale.LC_ALL, locale.normalize(loc))
+ except locale.Error:
+ pass
+
+
+ if os.geteuid() == 0:
+ log.error("You must not be root to run this utility.")
+
+ QMessageBox.critical(None,
+ "HP Device Manager - Send Fax",
+ "You must not be root to run hp-sendfax.",
+ QMessageBox.Ok,
+ QMessageBox.NoButton,
+ QMessageBox.NoButton)
+
+ sys.exit(1)
+
+ # TODO: Fix instance lock
+ sendfax = FaxSendJobForm(device_uri,
+ printer_name,
+ mod.args)
+
+ app.setMainWidget(sendfax)
+
+ pid = os.getpid()
+ log.debug('pid=%d' % pid)
+
+ sendfax.show()
+
+ try:
+ log.debug("Starting GUI loop...")
+ app.exec_loop()
+ except KeyboardInterrupt:
+ pass
+
+ else: # qt4
+ #try:
+ if 1:
+ from PyQt4.QtGui import QApplication
+ from ui4.sendfaxdialog import SendFaxDialog
+ #except ImportError:
+ if 0:
+ log.error("Unable to load Qt4 support. Is it installed?")
+ sys.exit(1)
+
+ app = QApplication(sys.argv)
+
+ dlg = SendFaxDialog(None, printer_name, device_uri, mod.args)
+ dlg.show()
+
+ try:
+ log.debug("Starting GUI loop...")
+ app.exec_()
+ except KeyboardInterrupt:
+ sys.exit(0)
+
+
+
+
+else: # NON_INTERACTIVE_MODE
+ if os.getuid() == 0:
+ log.error("%s cannot be run as root." % __mod__)
+ sys.exit(1)
+
+ try:
+ import struct, Queue
+ from prnt import cups
+ from base import magic
+
+ try:
+ from fax import fax
+ except ImportError:
+ # This can fail on Python < 2.3 due to the datetime module
+ log.error("Fax address book disabled - Python 2.3+ required.")
+ sys.exit(1)
+
+ db = fax.FaxAddressBook() # FAB instance
+
+ try:
+ import dbus
+ except ImportError:
+ log.error("PC send fax requires dBus and python-dbus")
+ sys.exit(1)
+
+ import warnings
+ # Ignore: .../dbus/connection.py:242: DeprecationWarning: object.__init__() takes no parameters
+ # (occurring on Python 2.6/dBus 0.83/Ubuntu 9.04)
+ warnings.simplefilter("ignore", DeprecationWarning)
+
+ dbus_avail, service, session_bus = device.init_dbus()
+
+ if not dbus_avail or service is None:
+ log.error("Unable to initialize dBus. PC send fax requires dBus and hp-systray support. Exiting.")
+ sys.exit(1)
+
+ phone_num_list = []
+
+ log.debug("Faxnum list = %s" % faxnum_list)
+ faxnum_list = utils.uniqueList(faxnum_list)
+ log.debug("Unique list=%s" % faxnum_list)
+
+ for f in faxnum_list:
+ for c in f:
+ if c not in '0123456789-(+) *#':
+ log.error("Invalid character in fax number '%s'. Only the characters '0123456789-(+) *#' are valid." % f)
+ sys.exit(1)
+
+ log.debug("Group list = %s" % group_list)
+ group_list = utils.uniqueList(group_list)
+ log.debug("Unique list=%s" % group_list)
+
+ for g in group_list:
+ entries = db.group_members(g)
+ if not entries:
+ log.warn("Unknown group name: %s" % g)
+ else:
+ for e in entries:
+ recipient_list.append(e)
+
+ log.debug("Recipient list = %s" % recipient_list)
+ recipient_list = utils.uniqueList(recipient_list)
+ log.debug("Unique list=%s" % recipient_list)
+
+ for r in recipient_list:
+ if db.get(r) is None:
+ log.error("Unknown fax recipient '%s' in the recipient list." % r)
+ all_entries = db.get_all_records()
+ log.info(log.bold("\nKnown recipients (entries):"))
+
+ for a in all_entries:
+ aa = db.get(a)
+ log.info("%s (fax number: %s)" % (a, aa['fax']))
+
+ print
+ sys.exit(1)
+
+ for p in recipient_list:
+ a = db.get(p)
+ if a['fax']:
+ phone_num_list.append(a)
+ log.debug("Name=%s Number=%s" % (a['name'], a['fax']))
+
+ for p in faxnum_list:
+ phone_num_list.append({'fax': p, 'name': u'Unknown'})
+ log.debug("Number=%s" % p)
+
+ log.debug("Phone num list = %s" % phone_num_list)
+
+ if not phone_num_list:
+ mod.usage(error_msg=["No recipients specified. Please use -f, -r, and/or -g to specify recipients."])
+
+ allowable_mime_types = cups.getAllowableMIMETypes()
+
+ for f in mod.args:
+ path = os.path.realpath(f)
+ log.debug(path)
+
+ if os.path.exists(path):
+ mime_type = magic.mime_type(path)
+ log.debug(mime_type)
+ else:
+ log.error("File '%s' does not exist." % path)
+ sys.exit(1)
+
+ if mime_type not in allowable_mime_types:
+ log.error("File '%s' has a non-allowed mime-type of '%s'" % (path, mime_type))
+ sys.exit(1)
+
+ log.info(log.bold("Using fax %s (%s)" % (printer_name, device_uri)))
+
+ #ok, lock_file = utils.lock_app('%s-%s' % (__mod__, printer_name), True)
+ mod.lockInstance(printer_name)
+
+ try:
+ ppd_file = cups.getPPD(printer_name)
+
+ if ppd_file is not None and os.path.exists(ppd_file):
+ if file(ppd_file, 'r').read(8192).find('HP Fax') == -1:
+ log.error("Fax configuration error. The CUPS fax queue for '%s' is incorrectly configured. Please make sure that the CUPS fax queue is configured with the 'HP Fax' Model/Driver." % printer_name)
+ sys.exit(1)
+
+ if not mod.args:
+ mod.usage(error_msg=["No files specfied to send. Please specify the file(s) to send on the command line."])
+
+ file_list = []
+
+ for f in mod.args:
+
+ #
+ # Submit each file to CUPS for rendering by hpijsfax
+ #
+ path = os.path.realpath(f)
+ log.debug(path)
+ mime_type = magic.mime_type(path)
+
+ if mime_type == 'application/hplip-fax': # .g3
+ log.info("\nPreparing fax file %s..." % f)
+ fax_file_fd = file(f, 'r')
+ header = fax_file_fd.read(fax.FILE_HEADER_SIZE)
+ fax_file_fd.close()
+
+ mg, version, pages, hort_dpi, vert_dpi, page_size, \
+ resolution, encoding, reserved1, reserved2 = struct.unpack(">8sBIHHBBBII", header)
+
+ if mg != 'hplip_g3':
+ log.error("%s: Invalid file header. Bad magic." % f)
+ sys.exit(1)
+
+ file_list.append((f, mime_type, "", "", pages))
+
+ else:
+ all_pages = True
+ page_range = ''
+ page_set = 0
+ nup = 1
+
+ cups.resetOptions()
+
+ if mime_type in ["application/x-cshell",
+ "application/x-perl",
+ "application/x-python",
+ "application/x-shell",
+ "text/plain",] and prettyprint:
+
+ cups.addOption('prettyprint')
+
+ if nup > 1:
+ cups.addOption('number-up=%d' % nup)
+
+ while True:
+
+ cups_printers = cups.getPrinters()
+ printer_state = cups.IPP_PRINTER_STATE_STOPPED
+ for p in cups_printers:
+ if p.name == printer_name:
+ printer_state = p.state
+
+ log.debug("Printer state = %d" % printer_state)
+
+ if printer_state == cups.IPP_PRINTER_STATE_IDLE:
+ log.debug("Printer name = %s file = %s" % (printer_name, path))
+ sent_job_id = cups.printFile(printer_name, path, os.path.basename(path))
+ log.info("\nRendering file '%s' (job %d)..." % (path, sent_job_id))
+ log.debug("Job ID=%d" % sent_job_id)
+ break
+ elif printer_state == cups.IPP_PRINTER_STATE_PROCESSING:
+ log.debug("Waiting for CUPS queue '%s' to become idle." % printer_name)
+ else:
+ log.error("The CUPS queue for '%s' is in a stopped or busy state (%d). Please check the queue and try again." % (printer_name, printer_state))
+ sys.exit(1)
+
+ cups.resetOptions()
+
+ #
+ # Wait for fax to finish rendering
+ #
+
+ end_time = time.time() + 120.0
+ while time.time() < end_time:
+ log.debug("Waiting for fax...")
+ try:
+ result = list(service.CheckForWaitingFax(device_uri, prop.username, sent_job_id))
+ log.debug(repr(result))
+
+ except dbus.exceptions.DBusException:
+ log.error("Cannot communicate with hp-systray. Canceling...")
+ cups.cancelJob(sent_job_id)
+ sys.exit(1)
+
+ fax_file = str(result[7])
+ log.info(fax_file)
+
+ if fax_file:
+ log.debug("Fax file=%s" % fax_file)
+ title = str(result[5])
+ break
+
+ time.sleep(1)
+
+ else:
+ log.error("Timeout waiting for rendering. Canceling job #%d..." % sent_job_id)
+ cups.cancelJob(sent_job_id)
+ sys.exit(1)
+
+ # open the rendered file to read the file header
+ f = file(fax_file, 'r')
+ header = f.read(fax.FILE_HEADER_SIZE)
+
+ if len(header) != fax.FILE_HEADER_SIZE:
+ log.error("Invalid fax file! (truncated header or no data)")
+ sys.exit(1)
+
+ mg, version, total_pages, hort_dpi, vert_dpi, page_size, \
+ resolution, encoding, reserved1, reserved2 = \
+ struct.unpack(">8sBIHHBBBII", header[:fax.FILE_HEADER_SIZE])
+
+ log.debug("Magic=%s Ver=%d Pages=%d hDPI=%d vDPI=%d Size=%d Res=%d Enc=%d" %
+ (mg, version, total_pages, hort_dpi, vert_dpi, page_size, resolution, encoding))
+
+ file_list.append((fax_file, mime_type, "", title, total_pages))
+ f.close()
+
+ #
+ # Insure that the device is in an OK state
+ #
+
+ dev = None
+
+ log.debug("\nChecking device state...")
+ try:
+ dev = fax.getFaxDevice(device_uri, printer_name)
+
+ try:
+ dev.open()
+ except Error, e:
+ log.warn(e.msg)
+
+ try:
+ dev.queryDevice(quick=True)
+ except Error, e:
+ log.error("Query device error (%s)." % e.msg)
+ dev.error_state = ERROR_STATE_ERROR
+
+ if dev.error_state > ERROR_STATE_MAX_OK and \
+ dev.error_state not in (ERROR_STATE_LOW_SUPPLIES, ERROR_STATE_LOW_PAPER):
+
+ log.error("Device is busy or in an error state (code=%d). Please wait for the device to become idle or clear the error and try again." % dev.error_state)
+ sys.exit(1)
+
+ user_conf.set('last_used', 'device_uri', dev.device_uri)
+
+ log.debug("File list:")
+
+ for f in file_list:
+ log.debug(str(f))
+
+ service.SendEvent(device_uri, printer_name, EVENT_START_FAX_JOB, prop.username, 0, '')
+
+ update_queue = Queue.Queue()
+ event_queue = Queue.Queue()
+
+ log.info("\nSending fax...")
+
+ if not dev.sendFaxes(phone_num_list, file_list, "",
+ "", None, False, printer_name,
+ update_queue, event_queue):
+
+ log.error("Send fax is active. Please wait for operation to complete.")
+ service.SendEvent(device_uri, printer_name, EVENT_FAX_JOB_FAIL, prop.username, 0, '')
+ sys.exit(1)
+
+ try:
+ cont = True
+ while cont:
+ while update_queue.qsize():
+ try:
+ status, page_num, phone_num = update_queue.get(0)
+ except Queue.Empty:
+ break
+
+ if status == fax.STATUS_IDLE:
+ log.debug("Idle")
+
+ elif status == fax.STATUS_PROCESSING_FILES:
+ log.info("\nProcessing page %d" % page_num)
+
+ elif status == fax.STATUS_DIALING:
+ log.info("\nDialing %s..." % phone_num)
+
+ elif status == fax.STATUS_CONNECTING:
+ log.info("\nConnecting to %s..." % phone_num)
+
+ elif status == fax.STATUS_SENDING:
+ log.info("\nSending page %d to %s..." % (page_num, phone_num))
+
+ elif status == fax.STATUS_CLEANUP:
+ log.info("\nCleaning up...")
+
+ elif status in (fax.STATUS_ERROR, fax.STATUS_BUSY, fax.STATUS_COMPLETED):
+ cont = False
+
+ if status == fax.STATUS_ERROR:
+ log.error("Fax send error.")
+ service.SendEvent(device_uri, printer_name, EVENT_FAX_JOB_FAIL, prop.username, 0, '')
+
+ elif status == fax.STATUS_BUSY:
+ log.error("Fax device is busy. Please try again later.")
+ service.SendEvent(device_uri, printer_name, EVENT_FAX_JOB_FAIL, prop.username, 0, '')
+
+ elif status == fax.STATUS_COMPLETED:
+ log.info("\nCompleted successfully.")
+ service.SendEvent(device_uri, printer_name, EVENT_END_FAX_JOB, prop.username, 0, '')
+
+ update_spinner()
+ time.sleep(2)
+
+ cleanup_spinner()
+
+ except KeyboardInterrupt:
+ event_queue.put((fax.EVENT_FAX_SEND_CANCELED, '', '', ''))
+ service.SendEvent(device_uri, printer_name, EVENT_FAX_JOB_CANCELED, prop.username, 0, '')
+ log.error("Cancelling...")
+
+ finally:
+ log.debug("Waiting for send fax thread to exit...")
+ if dev is not None:
+ dev.waitForSendFaxThread()
+ log.debug("Closing device...")
+ dev.close()
+
+ finally:
+ mod.unlockInstance()
+
+ except KeyboardInterrupt:
+ log.error("User exit")
+
+log.info("")
+log.info("Done.")
diff --git a/setup.py b/setup.py
new file mode 100755
index 0000000..a29e6c9
--- /dev/null
+++ b/setup.py
@@ -0,0 +1,912 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2009 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+
+__version__ = '9.0'
+__title__ = 'Printer/Fax Setup Utility'
+__mod__ = 'hp-setup'
+__doc__ = "Installs HPLIP printers and faxes in the CUPS spooler. Tries to automatically determine the correct PPD file to use. Allows the printing of a testpage. Performs basic fax parameter setup."
+
+# Std Lib
+import sys
+import getopt
+import time
+import os.path
+import re
+import os
+import gzip
+
+try:
+ import readline
+except ImportError:
+ pass
+
+# Local
+from base.g import *
+from base import device, utils, tui, models, module
+from prnt import cups
+
+pm = None
+
+def plugin_download_callback(c, s, t):
+ pm.update(int(100*c*s/t),
+ utils.format_bytes(c*s))
+
+
+nickname_pat = re.compile(r'''\*NickName:\s*\"(.*)"''', re.MULTILINE)
+
+USAGE = [ (__doc__, "", "name", True),
+ ("Usage: %s [MODE] [OPTIONS] [SERIAL NO.|USB bus:device|IP|DEVNODE]" % __mod__, "", "summary", True),
+ utils.USAGE_MODE,
+ utils.USAGE_GUI_MODE,
+ utils.USAGE_INTERACTIVE_MODE,
+ utils.USAGE_SPACE,
+ utils.USAGE_OPTIONS,
+ ("Automatic mode:", "-a or --auto (-i mode only)", "option", False),
+ ("To specify the port on a multi-port JetDirect:", "--port=<port> (Valid values are 1\*, 2, and 3. \*default)", "option", False),
+ ("No testpage in automatic mode:", "-x (-i mode only)", "option", False),
+ ("To specify a CUPS printer queue name:", "-p<printer> or --printer=<printer> (-i mode only)", "option", False),
+ ("To specify a CUPS fax queue name:", "-f<fax> or --fax=<fax> (-i mode only)", "option", False),
+ ("Type of queue(s) to install:", "-t<typelist> or --type=<typelist>. <typelist>: print*, fax\* (\*default) (-i mode only)", "option", False),
+ ("To specify the device URI to install:", "-d<device> or --device=<device> (--qt4 mode only)", "option", False),
+ ("Remove printers or faxes instead of setting-up:", "-r or --rm or --remove (-u only)", "option", False),
+ utils.USAGE_LANGUAGE,
+ utils.USAGE_LOGGING1, utils.USAGE_LOGGING2, utils.USAGE_LOGGING3,
+ utils.USAGE_HELP,
+ ("[SERIAL NO.|USB ID|IP|DEVNODE]", "", "heading", False),
+ ("USB bus:device (usb only):", """"xxx:yyy" where 'xxx' is the USB bus and 'yyy' is the USB device. (Note: The ':' and all leading zeros must be present.)""", 'option', False),
+ ("", "Use the 'lsusb' command to obtain this information.", "option", False),
+ ("IPs (network only):", 'IPv4 address "a.b.c.d" or "hostname"', "option", False),
+ ("DEVNODE (parallel only):", '"/dev/parportX", X=0,1,2,...', "option", False),
+ ("SERIAL NO. (usb and parallel only):", '"serial no."', "option", True),
+ utils.USAGE_EXAMPLES,
+ ("Setup using GUI mode:", "$ hp-setup", "example", False),
+ ("Setup using GUI mode, specifying usb:", "$ hp-setup -b usb", "example", False),
+ ("Setup using GUI mode, specifying an IP:", "$ hp-setup 192.168.0.101", "example", False),
+ ("One USB printer attached, automatic:", "$ hp-setup -i -a", "example", False),
+ ("USB, IDs specified:", "$ hp-setup -i 001:002", "example", False),
+ ("Network:", "$ hp-setup -i 66.35.250.209", "example", False),
+ ("Network, Jetdirect port 2:", "$ hp-setup -i --port=2 66.35.250.209", "example", False),
+ ("Parallel:", "$ hp-setup -i /dev/parport0", "example", False),
+ ("USB or parallel, using serial number:", "$ hp-setup -i US12345678A", "example", False),
+ ("USB, automatic:", "$ hp-setup -i --auto 001:002", "example", False),
+ ("Parallel, automatic, no testpage:", "$ hp-setup -i -a -x /dev/parport0", "example", False),
+ ("Parallel, choose device:", "$ hp-setup -i -b par", "example", False),
+ utils.USAGE_SPACE,
+ utils.USAGE_NOTES,
+ ("1. If no serial number, USB ID, IP, or device node is specified, the USB and parallel busses will be probed for devices.", "", 'note', False),
+ ("2. Using 'lsusb' to obtain USB IDs: (example)", "", 'note', False),
+ (" $ lsusb", "", 'note', False),
+ (" Bus 003 Device 011: ID 03f0:c202 Hewlett-Packard", "", 'note', False),
+ (" $ hp-setup --auto 003:011", "", 'note', False),
+ (" (Note: You may have to run 'lsusb' from /sbin or another location. Use '$ locate lsusb' to determine this.)", "", 'note', True),
+ ("3. Parameters -a, -f, -p, or -t are not valid in GUI (-u) mode.", "", 'note', True),
+ utils.USAGE_SPACE,
+ utils.USAGE_SEEALSO,
+ ("hp-makeuri", "", "seealso", False),
+ ("hp-probe", "", "seealso", False),
+ ]
+
+
+def showPasswordUI(prompt):
+ import getpass
+ print ""
+ print log.bold(prompt)
+ username = raw_input("Username: ")
+ password = getpass.getpass("Password: ")
+
+ return (username, password)
+
+
+def restart_cups():
+ if os.path.exists('/etc/init.d/cups'):
+ return '/etc/init.d/cups restart'
+
+ elif os.path.exists('/etc/init.d/cupsys'):
+ return '/etc/init.d/cupsys restart'
+
+ else:
+ return 'killall -HUP cupsd'
+
+
+mod = module.Module(__mod__, __title__, __version__, __doc__, USAGE,
+ (INTERACTIVE_MODE, GUI_MODE),
+ (UI_TOOLKIT_QT3, UI_TOOLKIT_QT4),
+ run_as_root_ok=True)
+
+opts, device_uri, printer_name, mode, ui_toolkit, loc = \
+ mod.parseStdOpts('axp:P:f:t:b:d:rq',
+ ['ttl=', 'filter=', 'search=', 'find=',
+ 'method=', 'time-out=', 'timeout=',
+ 'printer=', 'fax=', 'type=', 'port=',
+ 'auto', 'device=', 'rm', 'remove'],
+ handle_device_printer=False)
+
+selected_device_name = None
+printer_name = None
+fax_name = None
+bus = None
+setup_print = True
+setup_fax = True
+makeuri = None
+auto = False
+testpage_in_auto_mode = True
+jd_port = 1
+remove = False
+ignore_plugin_check = False
+
+for o, a in opts:
+ if o == '-x':
+ testpage_in_auto_mode = False
+
+ elif o in ('-P', '-p', '--printer'):
+ printer_name = a
+
+ elif o in ('-f', '--fax'):
+ fax_name = a
+
+ elif o in ('-d', '--device'):
+ device_uri = a
+
+ elif o in ('-b', '--bus'):
+ bus = [x.lower().strip() for x in a.split(',')]
+ if not device.validateBusList(bus, False):
+ mod.usage(error_msg=['Invalid bus name'])
+
+ elif o in ('-t', '--type'):
+ setup_fax, setup_print = False, False
+ a = a.strip().lower()
+ for aa in a.split(','):
+ if aa.strip() not in ('print', 'fax'):
+ mod.usage(error_msg=['Invalid type.'])
+
+ if aa.strip() == 'print':
+ setup_print = True
+
+ elif aa.strip() == 'fax':
+ if not prop.fax_build:
+ log.error("Cannot enable fax setup - HPLIP not built with fax enabled.")
+ else:
+ setup_fax = True
+
+ elif o == '--port':
+ try:
+ jd_port = int(a)
+ except ValueError:
+ #log.error("Invalid port number. Must be between 1 and 3 inclusive.")
+ mod.usage(error_msg=['Invalid port number. Must be between 1 and 3 inclusive.'])
+
+ elif o in ('-a', '--auto'):
+ auto = True
+
+ elif o in ('-r', '--rm', '--remove'):
+ remove = True
+ elif o in ('-q'):
+ ignore_plugin_check = True
+
+
+try:
+ param = mod.args[0]
+except IndexError:
+ param = ''
+
+log.debug("param=%s" % param)
+
+if printer_name is not None:
+ selected_device_name = printer_name
+else:
+ if fax_name is not None:
+ selected_device_name = fax_name
+log.debug("selected_device_name=%s" % selected_device_name)
+
+if mode == GUI_MODE:
+ if selected_device_name is not None:
+ log.warning("-p or -f option is not supported")
+ if ui_toolkit == 'qt3':
+ if not utils.canEnterGUIMode():
+ log.error("%s requires GUI support (try running with --qt4). Also, try using interactive (-i) mode." % __mod__)
+ sys.exit(1)
+ else:
+ if not utils.canEnterGUIMode4():
+ log.error("%s requires GUI support (try running with --qt3). Also, try using interactive (-i) mode." % __mod__)
+ sys.exit(1)
+
+if mode == GUI_MODE:
+ if ui_toolkit == 'qt3':
+ try:
+ from qt import *
+ from ui import setupform
+ except ImportError:
+ log.error("Unable to load Qt3 support. Is it installed?")
+ sys.exit(1)
+
+ if remove:
+ log.warn("-r/--rm/--remove not supported in qt3 mode.")
+
+ app = QApplication(sys.argv)
+ QObject.connect(app, SIGNAL("lastWindowClosed()"), app, SLOT("quit()"))
+
+ if loc is None:
+ loc = user_conf.get('ui', 'loc', 'system')
+ if loc.lower() == 'system':
+ loc = str(QTextCodec.locale())
+ log.debug("Using system locale: %s" % loc)
+
+ if loc.lower() != 'c':
+ e = 'utf8'
+ try:
+ l, x = loc.split('.')
+ loc = '.'.join([l, e])
+ except ValueError:
+ l = loc
+ loc = '.'.join([loc, e])
+
+ log.debug("Trying to load .qm file for %s locale." % loc)
+ trans = QTranslator(None)
+
+ qm_file = 'hplip_%s.qm' % l
+ log.debug("Name of .qm file: %s" % qm_file)
+ loaded = trans.load(qm_file, prop.localization_dir)
+
+ if loaded:
+ app.installTranslator(trans)
+ else:
+ loc = 'c'
+
+ if loc == 'c':
+ log.debug("Using default 'C' locale")
+ else:
+ log.debug("Using locale: %s" % loc)
+ QLocale.setDefault(QLocale(loc))
+ prop.locale = loc
+ try:
+ locale.setlocale(locale.LC_ALL, locale.normalize(loc))
+ except locale.Error:
+ pass
+
+ try:
+ w = setupform.SetupForm(bus, param, jd_port)
+ except Error:
+ log.error("Unable to connect to HPLIP I/O. Please (re)start HPLIP and try again.")
+ sys.exit(1)
+
+ app.setMainWidget(w)
+ w.show()
+
+ app.exec_loop()
+
+ else: # qt4
+ try:
+ from PyQt4.QtGui import QApplication, QMessageBox
+ from ui4.setupdialog import SetupDialog
+ except ImportError:
+ log.error("Unable to load Qt4 support. Is it installed?")
+ sys.exit(1)
+
+ app = QApplication(sys.argv)
+ log.debug("Sys.argv=%s printer_name=%s param=%s jd_port=%s device_uri=%s remove=%s" % (sys.argv, printer_name, param, jd_port, device_uri, remove))
+ dlg = SetupDialog(None, param, jd_port, device_uri, remove)
+ dlg.show()
+ try:
+ log.debug("Starting GUI loop...")
+ app.exec_()
+ except KeyboardInterrupt:
+ sys.exit(0)
+
+
+else: # INTERACTIVE_MODE
+ try:
+
+ cups.setPasswordCallback(showPasswordUI)
+
+ if remove:
+ log.error("-r/--rm/--remove not supported in -i mode.")
+ sys.exit(1)
+
+ if not auto:
+ log.info("(Note: Defaults for each question are maked with a '*'. Press <enter> to accept the default.)")
+ log.info("")
+
+ # ******************************* MAKEURI
+ if param:
+ device_uri, sane_uri, fax_uri = device.makeURI(param, jd_port)
+
+ # ******************************* CONNECTION TYPE CHOOSER
+ if not device_uri and bus is None:
+ bus = tui.connection_table()
+
+ if bus is None:
+ sys.exit(0)
+
+ log.info("\nUsing connection type: %s" % bus[0])
+
+ log.info("")
+
+ # ******************************* DEVICE CHOOSER
+
+ if not device_uri:
+ log.debug("\nDEVICE CHOOSER setup_fax=%s, setup_print=%s" % (setup_fax, setup_print))
+ device_uri = mod.getDeviceUri(device_uri, selected_device_name, devices = device.probeDevices(bus))
+
+
+ # ******************************* QUERY MODEL AND COLLECT PPDS
+ log.info(log.bold("\nSetting up device: %s\n" % device_uri))
+
+ log.info("")
+ print_uri = device_uri.replace("hpfax:", "hp:")
+ fax_uri = device_uri.replace("hp:", "hpfax:")
+
+ back_end, is_hp, bus, model, \
+ serial, dev_file, host, zc, port = \
+ device.parseDeviceURI(device_uri)
+
+ log.debug("Model=%s" % model)
+ mq = device.queryModelByURI(device_uri)
+
+ if not mq or mq.get('support-type', SUPPORT_TYPE_NONE) == SUPPORT_TYPE_NONE:
+ log.error("Unsupported printer model.")
+ sys.exit(1)
+
+ if mq.get('fax-type', FAX_TYPE_NONE) in (FAX_TYPE_NONE, FAX_TYPE_NOT_SUPPORTED) and setup_fax:
+ #log.warning("Cannot setup fax - device does not have fax feature.")
+ setup_fax = False
+
+ # ******************************* PLUGIN
+
+ norm_model = models.normalizeModelName(model).lower()
+ plugin = mq.get('plugin', PLUGIN_NONE)
+
+ plugin_installed = utils.to_bool(sys_state.get('plugin', 'installed', '0'))
+ if ignore_plugin_check is False and plugin > PLUGIN_NONE and not plugin_installed:
+ tui.header("PLUG-IN INSTALLATION")
+
+ hp_plugin = utils.which('hp-plugin')
+
+ if hp_plugin:
+ if prop.gui_build:
+ os.system("hp-plugin -i")
+ else:
+ os.system("hp-plugin")
+
+ ppds = cups.getSystemPPDs()
+
+ default_model = utils.xstrip(model.replace('series', '').replace('Series', ''), '_')
+ stripped_model = cups.stripModel2(default_model)
+
+ installed_print_devices = device.getSupportedCUPSDevices(['hp'])
+ for d in installed_print_devices.keys():
+ for p in installed_print_devices[d]:
+ log.debug("found print queue '%s'" % p)
+
+ installed_fax_devices = device.getSupportedCUPSDevices(['hpfax'])
+ for d in installed_fax_devices.keys():
+ for f in installed_fax_devices[d]:
+ log.debug("found fax queue '%s'" % f)
+
+ # ******************************* PRINT QUEUE SETUP
+ if setup_print:
+
+ tui.header("PRINT QUEUE SETUP")
+
+ if not auto and print_uri in installed_print_devices:
+ log.warning("One or more print queues already exist for this device: %s." %
+ ', '.join(installed_print_devices[print_uri]))
+
+ ok, setup_print = tui.enter_yes_no("\nWould you like to install another print queue for this device", 'n')
+ if not ok: sys.exit(0)
+
+ if setup_print:
+ if auto:
+ printer_name = default_model
+
+ printer_default_model = default_model
+
+ installed_printer_names = device.getSupportedCUPSPrinterNames(['hp'])
+ # Check for duplicate names
+ if (device_uri in installed_print_devices and printer_default_model in installed_print_devices[device_uri]) \
+ or (printer_default_model in installed_printer_names):
+ i = 2
+ while True:
+ t = printer_default_model + "_%d" % i
+ if (t not in installed_printer_names) and(device_uri not in installed_print_devices or t not in installed_print_devices[device_uri]):
+ printer_default_model += "_%d" % i
+ break
+ i += 1
+
+ if not auto:
+ if printer_name is None:
+ while True:
+ printer_name = raw_input(log.bold("\nPlease enter a name for this print queue (m=use model name:'%s'*, q=quit) ?" % printer_default_model))
+
+ if printer_name.lower().strip() == 'q':
+ log.info("OK, done.")
+ sys.exit(0)
+
+ if not printer_name or printer_name.lower().strip() == 'm':
+ printer_name = printer_default_model
+
+ name_ok = True
+
+ for d in installed_print_devices.keys():
+ for p in installed_print_devices[d]:
+ if printer_name == p:
+ log.error("A print queue with that name already exists. Please enter a different name.")
+ name_ok = False
+ break
+
+ for d in installed_fax_devices.keys():
+ for f in installed_fax_devices[d]:
+ if printer_name == f:
+ log.error("A fax queue with that name already exists. Please enter a different name.")
+ name_ok = False
+ break
+
+ for c in printer_name:
+ if c in cups.INVALID_PRINTER_NAME_CHARS:
+ log.error("Invalid character '%s' in printer name. Please enter a name that does not contain this character." % c)
+ name_ok = False
+
+ if name_ok:
+ break
+ else:
+ printer_name = printer_default_model
+
+ log.info("Using queue name: %s" % printer_name)
+
+ default_model = utils.xstrip(model.replace('series', '').replace('Series', ''), '_')
+ stripped_model = default_model.lower().replace('hp-', '').replace('hp_', '')
+
+ log.info("Locating PPD file... Please wait.")
+ print_ppd = cups.getPPDFile2(stripped_model, ppds)
+ enter_ppd = False
+
+ if print_ppd is None:
+ enter_ppd = True
+ log.error("Unable to find an appropriate PPD file.")
+
+ else:
+ print_ppd, desc = print_ppd
+ log.info("\nFound PPD file: %s" % print_ppd)
+
+ if desc:
+ log.info("Description: %s" % desc)
+#
+ if not auto:
+ log.info("\nNote: The model number may vary slightly from the actual model number on the device.")
+ ok, ans = tui.enter_yes_no("\nDoes this PPD file appear to be the correct one")
+ if not ok: sys.exit(0)
+ if not ans: enter_ppd = True
+
+
+ if enter_ppd:
+ enter_ppd = False
+
+ ok, enter_ppd = tui.enter_yes_no("\nWould you like to specify the path to the correct PPD file to use", 'n')
+ if not ok: sys.exit(0)
+
+ if enter_ppd:
+ ok = False
+
+ while True:
+ user_input = raw_input(log.bold("\nPlease enter the full filesystem path to the PPD file to use (q=quit) :"))
+
+ if user_input.lower().strip() == 'q':
+ log.info("OK, done.")
+ sys.exit(0)
+
+ file_path = user_input
+
+ if os.path.exists(file_path) and os.path.isfile(file_path):
+
+ if file_path.endswith('.gz'):
+ nickname = gzip.GzipFile(file_path, 'r').read(4096)
+ else:
+ nickname = file(file_path, 'r').read(4096)
+
+ try:
+ desc = nickname_pat.search(nickname).group(1)
+ except AttributeError:
+ desc = ''
+
+ if desc:
+ log.info("Description for the file: %s" % desc)
+ else:
+ log.error("No PPD 'NickName' found. This file may not be a valid PPD file.")
+
+ ok, ans = tui.enter_yes_no("\nUse this file")
+ if not ok: sys.exit(0)
+ if ans: print_ppd = file_path
+
+ else:
+ log.error("File not found or not an appropriate (PPD) file.")
+
+ if ok:
+ break
+ else:
+ log.error("PPD file required. Setup cannot continue. Exiting.")
+ sys.exit(1)
+
+ if auto:
+ location, info = '', 'Automatically setup by HPLIP'
+ else:
+ while True:
+ location = raw_input(log.bold("Enter a location description for this printer (q=quit) ?"))
+
+ if location.strip().lower() == 'q':
+ log.info("OK, done.")
+ sys.exit(0)
+
+ # TODO: Validate chars
+ break
+
+ while True:
+ info = raw_input(log.bold("Enter additonal information or notes for this printer (q=quit) ?"))
+
+ if info.strip().lower() == 'q':
+ log.info("OK, done.")
+ sys.exit(0)
+
+ # TODO: Validate chars
+ break
+
+ log.info(log.bold("\nAdding print queue to CUPS:"))
+ log.info("Device URI: %s" % print_uri)
+ log.info("Queue name: %s" % printer_name)
+ log.info("PPD file: %s" % print_ppd)
+ log.info("Location: %s" % location)
+ log.info("Information: %s" % info)
+
+ log.debug("Restarting CUPS...")
+ status, output = utils.run(restart_cups())
+ log.debug("Restart CUPS returned: exit=%d output=%s" % (status, output))
+
+ cups.setPasswordPrompt("You do not have permission to add a printer.")
+ if not os.path.exists(print_ppd): # assume foomatic: or some such
+ status, status_str = cups.addPrinter(printer_name.encode('utf8'), print_uri,
+ location, '', print_ppd, info)
+ else:
+ status, status_str = cups.addPrinter(printer_name.encode('utf8'), print_uri,
+ location, print_ppd, '', info)
+
+ log.debug("addPrinter() returned (%d, %s)" % (status, status_str))
+
+ installed_print_devices = device.getSupportedCUPSDevices(['hp'])
+
+ if print_uri not in installed_print_devices or \
+ printer_name not in installed_print_devices[print_uri]:
+
+ log.error("Printer queue setup failed. Please restart CUPS and try again.")
+ sys.exit(1)
+ else:
+ pass
+ # TODO:
+ #service.sendEvent(hpssd_sock, EVENT_CUPS_QUEUES_CHANGED, device_uri=print_uri)
+
+
+ # ******************************* FAX QUEUE SETUP
+ if setup_fax and not prop.fax_build:
+ log.error("Cannot setup fax - HPLIP not built with fax enabled.")
+ setup_fax = False
+
+ if setup_fax:
+
+ try:
+ from fax import fax
+ except ImportError:
+ # This can fail on Python < 2.3 due to the datetime module
+ setup_fax = False
+ log.warning("Fax setup disabled - Python 2.3+ required.")
+
+ log.info("")
+
+ if setup_fax:
+
+ tui.header("FAX QUEUE SETUP")
+
+ if not auto and fax_uri in installed_fax_devices:
+ log.warning("One or more fax queues already exist for this device: %s." % ', '.join(installed_fax_devices[fax_uri]))
+ ok, setup_fax = tui.enter_yes_no("\nWould you like to install another fax queue for this device", 'n')
+ if not ok: sys.exit(0)
+
+ if setup_fax:
+ if auto: # or fax_name is None:
+ fax_name = default_model + '_fax'
+
+ fax_default_model = default_model + '_fax'
+
+ installed_fax_names = device.getSupportedCUPSPrinterNames(['hpfax'])
+ # Check for duplicate names
+ if (fax_uri in installed_fax_devices and fax_default_model in installed_fax_devices[fax_uri]) \
+ or (fax_default_model in installed_fax_names):
+ i = 2
+ while True:
+ t = fax_default_model + "_%d" % i
+ if (t in installed_fax_names) and (fax_uri not in installed_fax_devices or t not in installed_fax_devices[fax_uri]):
+ fax_default_model += "_%d" % i
+ break
+ i += 1
+
+ if not auto:
+ if fax_name is None:
+ while True:
+ fax_name = raw_input(log.bold("\nPlease enter a name for this fax queue (m=use model name:'%s'*, q=quit) ?" % fax_default_model))
+
+ if fax_name.lower().strip() == 'q':
+ log.info("OK, done.")
+ sys.exit(0)
+
+ if not fax_name or fax_name.lower().strip() == 'm':
+ fax_name = fax_default_model
+
+ name_ok = True
+
+ for d in installed_print_devices.keys():
+ for p in installed_print_devices[d]:
+ if fax_name == p:
+ log.error("A print queue with that name already exists. Please enter a different name.")
+ name_ok = False
+ break
+
+ for d in installed_fax_devices.keys():
+ for f in installed_fax_devices[d]:
+ if fax_name == f:
+ log.error("A fax queue with that name already exists. Please enter a different name.")
+ name_ok = False
+ break
+
+ for c in fax_name:
+ if c in (' ', '#', '/', '%'):
+ log.error("Invalid character '%s' in fax name. Please enter a name that does not contain this character." % c)
+ name_ok = False
+
+ if name_ok:
+ break
+
+ else:
+ fax_name = fax_default_model
+
+ log.info("Using queue name: %s" % fax_name)
+
+ fax_type = mq.get('fax-type', FAX_TYPE_NONE)
+
+ if prop.hpcups_build:
+ if fax_type == FAX_TYPE_SOAP or fax_type == FAX_TYPE_LEDMSOAP:
+ fax_ppd_name = 'HP-Fax2-hpcups'
+ else:
+ fax_ppd_name = 'HP-Fax-hpcups'
+ else: # hpijs
+ if fax_type == FAX_TYPE_SOAP or fax_type == FAX_TYPE_LEDMSOAP:
+ fax_ppd_name = 'HP-Fax2-hpijs'
+ else:
+ fax_ppd_name = 'HP-Fax-hpijs'
+
+ for f in ppds:
+ if f.find(fax_ppd_name) >= 0:
+ fax_ppd = f
+ log.debug("Found PDD file: %s" % fax_ppd)
+ break
+ else:
+ log.error("Unable to find HP fax PPD file! Please check you HPLIP installation and try again.")
+ sys.exit(1)
+
+ if auto:
+ location, info = '', 'Automatically setup by HPLIP'
+ else:
+ while True:
+ location = raw_input(log.bold("Enter a location description for this printer (q=quit) ?"))
+
+ if location.strip().lower() == 'q':
+ log.info("OK, done.")
+ sys.exit(0)
+
+ # TODO: Validate chars
+ break
+
+ while True:
+ info = raw_input(log.bold("Enter additonal information or notes for this printer (q=quit) ?"))
+
+ if info.strip().lower() == 'q':
+ log.info("OK, done.")
+ sys.exit(0)
+
+ # TODO: Validate chars
+ break
+
+ log.info(log.bold("\nAdding fax queue to CUPS:"))
+ log.info("Device URI: %s" % fax_uri)
+ log.info("Queue name: %s" % fax_name)
+ log.info("PPD file: %s" % fax_ppd)
+ log.info("Location: %s" % location)
+ log.info("Information: %s" % info)
+
+ cups.setPasswordPrompt("You do not have permission to add a fax device.")
+ if not os.path.exists(fax_ppd): # assume foomatic: or some such
+ status, status_str = cups.addPrinter(fax_name.encode('utf8'), fax_uri,
+ location, '', fax_ppd, info)
+ else:
+ status, status_str = cups.addPrinter(fax_name.encode('utf8'), fax_uri,
+ location, fax_ppd, '', info)
+
+ log.debug("addPrinter() returned (%d, %s)" % (status, status_str))
+
+ installed_fax_devices = device.getSupportedCUPSDevices(['hpfax'])
+
+ log.debug(installed_fax_devices)
+
+ if fax_uri not in installed_fax_devices or \
+ fax_name not in installed_fax_devices[fax_uri]:
+
+ log.error("Fax queue setup failed. Please restart CUPS and try again.")
+ sys.exit(1)
+ else:
+ pass
+ # TODO:
+ #service.sendEvent(hpssd_sock, EVENT_CUPS_QUEUES_CHANGED, device_uri=fax_uri)
+
+
+ # ******************************* FAX HEADER SETUP
+ tui.header("FAX HEADER SETUP")
+
+ if auto:
+ setup_fax = False
+ else:
+ while True:
+ user_input = raw_input(log.bold("\nWould you like to perform fax header setup (y=yes*, n=no, q=quit) ?")).strip().lower()
+
+ if user_input == 'q':
+ log.info("OK, done.")
+ sys.exit(0)
+
+ if not user_input:
+ user_input = 'y'
+
+ setup_fax = (user_input == 'y')
+
+ if user_input in ('y', 'n', 'q'):
+ break
+
+ log.error("Please enter 'y' or 'n'")
+
+ if setup_fax:
+ d = fax.getFaxDevice(fax_uri, disable_dbus=True)
+
+ try:
+ d.open()
+ except Error:
+ log.error("Unable to communicate with the device. Please check the device and try again.")
+ else:
+ try:
+ tries = 0
+ ok = True
+
+ while True:
+ tries += 1
+
+ try:
+ current_phone_num = str(d.getPhoneNum())
+ current_station_name = str(d.getStationName())
+ except Error:
+ log.error("Could not communicate with device. Device may be busy. Please wait for retry...")
+ time.sleep(5)
+ ok = False
+
+ if tries > 12:
+ break
+
+ else:
+ ok = True
+ break
+
+ if ok:
+ while True:
+ if current_phone_num:
+ phone_num = raw_input(log.bold("\nEnter the fax phone number for this device (c=use current:'%s'*, q=quit) ?" % current_phone_num))
+ else:
+ phone_num = raw_input(log.bold("\nEnter the fax phone number for this device (q=quit) ?"))
+ if phone_num.strip().lower() == 'q':
+ log.info("OK, done.")
+ sys.exit(0)
+
+ if current_phone_num and (not phone_num or phone_num.strip().lower() == 'c'):
+ phone_num = current_phone_num
+
+ if len(phone_num) > 50:
+ log.error("Phone number length is too long (>50 characters). Please enter a shorter number.")
+ continue
+
+ ok = True
+ for x in phone_num:
+ if x not in '0123456789-(+) ':
+ log.error("Invalid characters in phone number. Please only use 0-9, -, (, +, and )")
+ ok = False
+ break
+
+ if not ok:
+ continue
+
+ break
+
+ while True:
+ if current_station_name:
+ station_name = raw_input(log.bold("\nEnter the name and/or company for this device (c=use current:'%s'*, q=quit) ?" % current_station_name))
+ else:
+ station_name = raw_input(log.bold("\nEnter the name and/or company for this device (q=quit) ?"))
+ if station_name.strip().lower() == 'q':
+ log.info("OK, done.")
+ sys.exit(0)
+
+ if current_station_name and (not station_name or station_name.strip().lower() == 'c'):
+ station_name = current_station_name
+
+
+ if len(station_name) > 50:
+ log.error("Name/company length is too long (>50 characters). Please enter a shorter name/company.")
+ continue
+ break
+
+ try:
+ d.setStationName(station_name)
+ d.setPhoneNum(phone_num)
+ except Error:
+ log.error("Could not communicate with device. Device may be busy.")
+ else:
+ log.info("\nParameters sent to device.")
+
+ finally:
+ d.close()
+
+ # ******************************* TEST PAGE
+ if setup_print:
+ print_test_page = False
+
+ tui.header("PRINTER TEST PAGE")
+
+ if auto:
+ if testpage_in_auto_mode:
+ print_test_page = True
+ else:
+ ok, print_test_page = tui.enter_yes_no("\nWould you like to print a test page")
+ if not ok: sys.exit(0)
+
+ if print_test_page:
+ path = utils.which('hp-testpage')
+
+ if printer_name:
+ param = "-p%s" % printer_name
+ else:
+ param = "-d%s" % print_uri
+
+ if len(path) > 0:
+ cmd = 'hp-testpage %s' % param
+ else:
+ cmd = 'python ./testpage.py %s' % param
+
+ log.debug(cmd)
+
+ os.system(cmd)
+
+ except KeyboardInterrupt:
+ log.error("User exit")
+
+log.info("")
+log.info("Done.")
+
diff --git a/systray.py b/systray.py
new file mode 100644
index 0000000..52481a1
--- /dev/null
+++ b/systray.py
@@ -0,0 +1,145 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2007 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+
+__version__ = '2.0'
+__mod__ = 'hp-systray'
+__title__ = 'System Tray Status Service'
+__doc__ = ""
+
+# StdLib
+import sys
+import os
+import getopt
+import signal
+
+# Local
+from base.g import *
+from base import utils, module
+from prnt import cups
+
+
+
+if __name__ == '__main__':
+
+ # Create a new session ID for the tray. This disassociates the
+ # tray from the controlling terminal so that it cannot receive
+ # keyboard interrupts.
+ #
+ # Only do this if we aren't already a session leader. This test
+ # only succeeds if we are executed from hp-toolbox.
+ if os.getpgid(os.getpid()) != os.getpid():
+ os.setsid()
+
+ mod = module.Module(__mod__, __title__, __version__, __doc__, None,
+ (GUI_MODE,), (UI_TOOLKIT_QT4, UI_TOOLKIT_QT3))
+
+ mod.setUsage(module.USAGE_FLAG_NONE,
+ extra_options=[("Startup even if no hplip CUPS queues are present:", "-x or --force-startup", "option", False)])
+
+ opts, device_uri, printer_name, mode, ui_toolkit, lang = \
+ mod.parseStdOpts('x', ['force-startup'], False)
+
+ force_startup = False
+ for o, a in opts:
+ if o in ('-x', '--force-startup'):
+ force_startup = True
+
+ if os.getuid() == 0:
+ log.error("hp-systray cannot be run as root. Exiting.")
+ sys.exit(1)
+
+ if ui_toolkit == 'qt3':
+ if not utils.canEnterGUIMode():
+ log.error("%s requires Qt3 GUI and DBus support. Exiting." % __mod__)
+ sys.exit(1)
+
+ else:
+ if not utils.canEnterGUIMode4():
+ log.error("%s requires Qt4 GUI and DBus support. Exiting." % __mod__)
+ sys.exit(1)
+
+ if not force_startup:
+ # Check for any hp: or hpfax: queues. If none, exit
+ if not utils.any([p.device_uri for p in cups.getPrinters()], lambda x : x.startswith('hp')):
+ log.warn("No hp: or hpfax: devices found in any installed CUPS queue. Exiting.")
+ sys.exit(1)
+
+ mod.lockInstance()
+
+ r1, w1 = os.pipe()
+ log.debug("Creating pipe: hpssd (%d) ==> systemtray (%d)" % (w1, r1))
+
+ parent_pid = os.getpid()
+ child_pid1 = os.fork()
+
+ if child_pid1:
+ # parent (UI)
+ os.close(w1)
+
+ if ui_toolkit == 'qt3':
+ try:
+ import ui.systemtray as systray
+ except ImportError:
+ log.error("Unable to load Qt3 support. Is it installed?")
+ sys.exit(1)
+
+ else: # qt4
+ try:
+ import ui4.systemtray as systray
+ except ImportError:
+ log.error("Unable to load Qt4 support. Is it installed?")
+ mod.unlockInstance()
+ sys.exit(1)
+
+ try:
+ systray.run(r1)
+ finally:
+ mod.unlockInstance()
+
+ else:
+ # child (dbus & device i/o [qt4] or dbus [qt3])
+ os.close(r1)
+
+ if ui_toolkit == 'qt4':
+ r2, w2 = os.pipe()
+ r3, w3 = os.pipe()
+
+ log.debug("Creating pipe: hpssd (%d) ==> hpdio (%d)" % (w2, r2))
+ log.debug("Creating pipe: hpdio (%d) ==> hpssd (%d)" % (w3, r3))
+
+ child_pid2 = os.fork()
+ if child_pid2:
+ # parent (dbus)
+ os.close(r2)
+
+ import hpssd
+ hpssd.run(w1, w2, r3)
+
+ else:
+ # child (device i/o)
+ os.close(w2)
+
+ import hpdio
+ hpdio.run(r2, w3)
+
+ else: # qt3
+ import hpssd
+ hpssd.run(w1)
diff --git a/testpage.py b/testpage.py
new file mode 100755
index 0000000..09a753a
--- /dev/null
+++ b/testpage.py
@@ -0,0 +1,169 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2008 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+__version__ = '6.0'
+__title__ = 'Testpage Print Utility'
+__mod__ = 'hp-testpage'
+__doc__ = "Print a tespage to a printer. Prints a summary of device information and shows the printer's margins."
+
+# Std Lib
+import sys
+import os
+import getopt
+import re
+import time
+
+# Local
+from base.g import *
+from base import device, utils, tui, module
+from prnt import cups
+
+
+
+try:
+ mod = module.Module(__mod__, __title__, __version__, __doc__, None,
+ (INTERACTIVE_MODE, GUI_MODE),
+ (UI_TOOLKIT_QT4,))
+
+ mod.setUsage(module.USAGE_FLAG_DEVICE_ARGS)
+
+ opts, device_uri, printer_name, mode, ui_toolkit, loc = \
+ mod.parseStdOpts()
+
+ printer_name, device_uri = mod.getPrinterName(printer_name, device_uri)
+ wait_for_printout = False
+
+ if mode == GUI_MODE:
+ if not utils.canEnterGUIMode4():
+ log.error("%s -u/--gui requires Qt4 GUI support. Entering interactive mode." % __mod__)
+ mode = INTERACTIVE_MODE
+
+ if mode == GUI_MODE:
+ try:
+ from PyQt4.QtGui import QApplication
+ from ui4.printtestpagedialog import PrintTestPageDialog
+ except ImportError:
+ log.error("Unable to load Qt4 support. Is it installed?")
+ sys.exit(1)
+
+ log.set_module("%s(UI)" % __mod__)
+
+ if 1:
+ app = QApplication(sys.argv)
+
+ dialog = PrintTestPageDialog(None, printer_name)
+ dialog.show()
+ try:
+ log.debug("Starting GUI loop...")
+ app.exec_()
+ except KeyboardInterrupt:
+ sys.exit(0)
+
+ sys.exit(0)
+
+ if mode == INTERACTIVE_MODE:
+ #else: # INTERACTIVE_MODE
+ try:
+ d = device.Device(device_uri, printer_name)
+ except Error, e:
+ log.error("Device error (%s)." % e.msg)
+ sys.exit(1)
+
+ try:
+ try:
+ d.open()
+ except Error:
+ log.error("Unable to print to printer. Please check device and try again.")
+ sys.exit(1)
+
+ # TODO: Fix the wait for printout stuff... can't get device ID
+ # while hp: backend has device open in printing mode...
+ wait_for_printout = False
+
+ if d.isIdleAndNoError():
+ d.close()
+ log.info( "Printing test page to printer %s..." % printer_name)
+ try:
+ d.printTestPage(printer_name)
+ except Error, e:
+ if e.opt == ERROR_NO_CUPS_QUEUE_FOUND_FOR_DEVICE:
+ log.error("No CUPS queue found for device. Please install the printer in CUPS and try again.")
+ else:
+ log.error("An error occured (code=%d)." % e.opt)
+ else:
+ if wait_for_printout:
+ log.info("Test page has been sent to printer. Waiting for printout to complete...")
+
+ time.sleep(5)
+ i = 0
+
+ while True:
+ time.sleep(5)
+
+ try:
+ d.queryDevice(quick=True)
+ except Error, e:
+ log.error("An error has occured.")
+
+ if d.error_state == ERROR_STATE_CLEAR:
+ break
+
+ elif d.error_state == ERROR_STATE_ERROR:
+ cleanup_spinner()
+ log.error("An error has occured (code=%d). Please check the printer and try again." % d.status_code)
+ break
+
+ elif d.error_state == ERROR_STATE_WARNING:
+ cleanup_spinner()
+ log.warning("There is a problem with the printer (code=%d). Please check the printer." % d.status_code)
+
+ else: # ERROR_STATE_BUSY
+ update_spinner()
+
+ i += 1
+
+ if i > 24: # 2min
+ break
+
+ cleanup_spinner()
+
+ else:
+ log.info("Test page has been sent to printer.")
+
+ else:
+ log.error("Device is busy or in an error state. Please check device and try again.")
+ sys.exit(1)
+
+
+ finally:
+ d.close()
+
+ log.info("")
+ log.notice("If an error occured, or the test page failed to print, refer to the HPLIP website")
+ log.notice("at: http://hplip.sourceforge.net for troubleshooting and support.")
+ log.info("")
+
+except KeyboardInterrupt:
+ log.error("User exit")
+
+log.info("")
+log.info("Done.")
diff --git a/timedate.py b/timedate.py
new file mode 100755
index 0000000..25f48e3
--- /dev/null
+++ b/timedate.py
@@ -0,0 +1,105 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2009 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+__version__ = '2.0'
+__mod__ = 'hp-timedate'
+__title__ = 'Time/Date Utility'
+__doc__ = "Set the time and date on an HP Officejet all-in-one device using the PC time and date."
+
+# Std Lib
+import sys
+import re
+import getopt
+import struct
+import operator
+import os
+
+# Local
+from base.g import *
+from base.codes import *
+from base import device, status, utils, pml, tui, module
+from prnt import cups
+
+try:
+ from fax import faxdevice
+except ImportError:
+ log.error("Unable to load fax services for HPLIP (required for hp-timedate). Exiting.")
+ sys.exit(1)
+
+
+PML_ERROR_CODES = {
+ pml.ERROR_OK_END_OF_SUPPORTED_OBJECTS: "OK: End of supported objects",
+ pml.ERROR_OK_NEAREST_LEGAL_VALUE_SUBSITUTED: "OK: Nearest legal value substituted",
+ pml.ERROR_UNKNOWN_REQUEST: "Unknown request",
+ pml.ERROR_BUFFER_OVERFLOW: "Buffer overflow",
+ pml.ERROR_COMMAND_EXECUTION: "Command execution",
+ pml.ERROR_UNKNOWN_OID: "Unknown OID",
+ pml.ERROR_OBJ_DOES_NOT_SUPPORT_SPECIFIED_ACTION: "Object does not support action",
+ pml.ERROR_INVALID_OR_UNSUPPORTED_VALUE: "Invalid or unsupported value",
+ pml.ERROR_PAST_END_OF_SUPPORTED_OBJS: "Past end of supported objects",
+ pml.ERROR_ACTION_CANNOT_BE_PERFORMED_NOW: "Action cannot be performed now",
+ pml.ERROR_SYNTAX: "Syntax",
+}
+
+try:
+ mod = module.Module(__mod__, __title__, __version__, __doc__, None,
+ (INTERACTIVE_MODE,))
+
+ mod.setUsage(module.USAGE_FLAG_DEVICE_ARGS)
+
+ opts, device_uri, printer_name, mode, ui_toolkit, lang = \
+ mod.parseStdOpts()
+
+ device_uri = mod.getDeviceUri(device_uri, printer_name,
+ filter={'fax-type': (operator.gt, 0)},
+ back_end_filter=['hpfax'])
+
+ try:
+ d = faxdevice.FaxDevice(device_uri, printer_name, disable_dbus=True)
+ except Error, e:
+ if e.opt == ERROR_DEVICE_DOES_NOT_SUPPORT_OPERATION:
+ log.error("Device does not support setting time/date.")
+ sys.exit(1)
+ else:
+ log.error(e.msg)
+ sys.exit(1)
+
+ try:
+ try:
+ d.open()
+ except Error:
+ log.error("Unable to open device. Exiting. ")
+ sys.exit(1)
+
+ try:
+ log.info("Setting time and date on %s" % device_uri)
+ d.setDateAndTime()
+ except Error:
+ log.error("An error occured!")
+ finally:
+ d.close()
+
+except KeyboardInterrupt:
+ log.error("User exit")
+
+log.info("")
+log.info('Done.')
diff --git a/toolbox.py b/toolbox.py
new file mode 100755
index 0000000..e00476d
--- /dev/null
+++ b/toolbox.py
@@ -0,0 +1,268 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2009 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+# Thanks to Henrique M. Holschuh <hmh@debian.org> for various security patches
+#
+
+__version__ = '15.0'
+__mod__ = 'hp-toolbox'
+__title__ = 'HP Device Manager'
+__doc__ = """The HP Device Manager (aka "Toolbox") for HPLIP supported devices. Provides access to status, tools, and supplies levels."""
+
+# Std Lib
+import sys
+import os
+import getopt
+import signal
+
+# Local
+from base.g import *
+import base.utils as utils
+from base import status, tui, module
+
+
+w = None # write pipe
+app = None
+toolbox = None
+session_bus = None
+
+
+def handle_session_signal(*args, **kwds):
+ if kwds['interface'] == 'com.hplip.Toolbox' and \
+ kwds['member'] == 'Event':
+
+ event = device.Event(*args)
+ event.debug()
+
+ if event.event_code > EVENT_MAX_EVENT:
+ event.event_code = status.MapPJLErrorCode(event.event_code)
+
+ # regular user/device status event
+ log.debug("Received event notifier: %d" % event.event_code)
+
+ if not event.send_via_pipe(w, 'toolbox ui'):
+ sys.exit(1)
+ # if this fails, then hp-toolbox must be killed.
+ # No need to continue running...
+
+
+mod = module.Module(__mod__, __title__, __version__, __doc__, None,
+ (GUI_MODE,), (UI_TOOLKIT_QT3, UI_TOOLKIT_QT4))
+mod.lockInstance()
+
+mod.setUsage(module.USAGE_FLAG_NONE,
+ extra_options=[("Disable dbus (Qt3 only):", "-x or --disable-dbus", "option", False)],
+ see_also_list = ['hp-align', 'hp-clean', 'hp-colorcal', 'hp-devicesettings',
+ 'hp-faxsetup', 'hp-firmware', 'hp-info', 'hp-levels',
+ 'hp-linefeedcal', 'hp-makecopies', 'hp-plugin',
+ 'hp-pqdiag', 'hp-print', 'hp-printsettings', 'hp-scan',
+ 'hp-sendfax', 'hp-testpage', 'hp-timedate', 'hp-unload'])
+
+opts, device_uri, printer_name, mode, ui_toolkit, loc = \
+ mod.parseStdOpts('x', ['disable-dbus'])
+
+disable_dbus = False
+
+for o, a in opts:
+ if o in ('-x', '--disable-dbus') and ui_toolkit == 'qt3':
+ disable_dbus = True
+
+if ui_toolkit == 'qt3':
+ if not utils.canEnterGUIMode():
+ log.error("%s requires GUI support. Exiting." % __mod__)
+ sys.exit(1)
+elif ui_toolkit == 'qt4':
+ if not utils.canEnterGUIMode4():
+ log.error("%s requires GUI support. Exiting." % __mod__)
+ sys.exit(1)
+
+child_pid, w, r = 0, 0, 0
+
+if ui_toolkit == 'qt3':
+ try:
+ from dbus import SessionBus
+ import dbus.service
+ from dbus.mainloop.glib import DBusGMainLoop, threads_init
+ from gobject import MainLoop
+ import glib
+ glib.threads_init()
+ dbus.mainloop.glib.threads_init()
+ except ImportError:
+ log.error("Unable to load dbus - Automatic status updates in HPLIP Device Manager will be disabled.")
+ disable_dbus = True
+
+ if not disable_dbus:
+ r, w = os.pipe()
+ parent_pid = os.getpid()
+ log.debug("Parent PID=%d" % parent_pid)
+ child_pid = os.fork()
+
+ if disable_dbus or child_pid: # qt3/ui
+ # parent (UI)
+ log.set_module("hp-toolbox(UI)")
+
+ if w:
+ os.close(w)
+
+ try:
+ from qt import *
+ from ui.devmgr4 import DevMgr4
+ except ImportError:
+ log.error("Unable to load Qt3 support. Is it installed?")
+ sys.exit(1)
+
+ # create the main application object
+ app = QApplication(sys.argv)
+
+ if loc is None:
+ loc = user_conf.get('ui', 'loc', 'system')
+ if loc.lower() == 'system':
+ loc = str(QTextCodec.locale())
+ log.debug("Using system locale: %s" % loc)
+
+ if loc.lower() != 'c':
+ e = 'utf8'
+ try:
+ l, x = loc.split('.')
+ loc = '.'.join([l, e])
+ except ValueError:
+ l = loc
+ loc = '.'.join([loc, e])
+
+ log.debug("Trying to load .qm file for %s locale." % loc)
+ trans = QTranslator(None)
+
+ qm_file = 'hplip_%s.qm' % l
+ log.debug("Name of .qm file: %s" % qm_file)
+ loaded = trans.load(qm_file, prop.localization_dir)
+
+ if loaded:
+ app.installTranslator(trans)
+ else:
+ loc = 'c'
+
+ if loc == 'c':
+ log.debug("Using default 'C' locale")
+ else:
+ log.debug("Using locale: %s" % loc)
+ QLocale.setDefault(QLocale(loc))
+ prop.locale = loc
+ try:
+ locale.setlocale(locale.LC_ALL, locale.normalize(loc))
+ except locale.Error:
+ pass
+
+ toolbox = DevMgr4(r, __version__, device_uri, disable_dbus)
+ app.setMainWidget(toolbox)
+
+ toolbox.show()
+
+ try:
+ try:
+ log.debug("Starting GUI loop...")
+ app.exec_loop()
+ except KeyboardInterrupt:
+ sys.exit(0)
+
+ finally:
+ if child_pid:
+ log.debug("Killing child toolbox process (pid=%d)..." % child_pid)
+ try:
+ os.kill(child_pid, signal.SIGKILL)
+ except OSError, e:
+ log.debug("Failed: %s" % e.message)
+
+ mod.unlockInstance()
+ sys.exit(0)
+
+ elif not disable_dbus: # qt3/dbus
+ # dBus
+ log.set_module("hp-toolbox(dbus)")
+ from base import device
+
+ try:
+ # child (dbus connector)
+ os.close(r)
+
+ dbus_loop = DBusGMainLoop(set_as_default=True)
+
+ try:
+ session_bus = dbus.SessionBus()
+ except dbus.exceptions.DBusException, e:
+ if os.getuid() != 0:
+ log.error("Unable to connect to dbus session bus. Exiting.")
+ sys.exit(1)
+ else:
+ log.error("Unable to connect to dbus session bus (running as root?)")
+ sys.exit(1)
+
+ # Receive events from the session bus
+ session_bus.add_signal_receiver(handle_session_signal, sender_keyword='sender',
+ destination_keyword='dest', interface_keyword='interface',
+ member_keyword='member', path_keyword='path')
+
+ log.debug("Entering main loop...")
+
+ try:
+ MainLoop().run()
+ except KeyboardInterrupt:
+ log.debug("Ctrl-C: Exiting...")
+
+ finally:
+ if parent_pid:
+ log.debug("Killing parent toolbox process (pid=%d)..." % parent_pid)
+ try:
+ os.kill(parent_pid, signal.SIGKILL)
+ except OSError, e:
+ log.debug("Failed: %s" % e.message)
+
+ mod.unlockInstance()
+
+ sys.exit(0)
+
+else: # qt4
+ try:
+ from PyQt4.QtGui import QApplication
+
+ except ImportError:
+ log.error("Unable to load Qt4 support. Is it installed?")
+ sys.exit(1)
+
+ from ui4.devmgr5 import DevMgr5
+
+ log.set_module("hp-toolbox(UI)")
+
+ if 1:
+ #try:
+ app = QApplication(sys.argv)
+
+ toolbox = DevMgr5(__version__, device_uri, None)
+ toolbox.show()
+ try:
+ log.debug("Starting GUI loop...")
+ app.exec_()
+ except KeyboardInterrupt:
+ sys.exit(0)
+
+ if 1:
+ #finally:
+ mod.unlockInstance()
+ sys.exit(0)
diff --git a/ui/__init__.py b/ui/__init__.py
new file mode 100644
index 0000000..5722dcb
--- /dev/null
+++ b/ui/__init__.py
@@ -0,0 +1,22 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2007 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+
diff --git a/ui/aboutdlg.py b/ui/aboutdlg.py
new file mode 100644
index 0000000..196a874
--- /dev/null
+++ b/ui/aboutdlg.py
@@ -0,0 +1,41 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2001-2008 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+# Std Lib
+import sys
+import os.path
+
+# Qt
+from qt import *
+
+# Local
+from base.g import *
+from aboutdlg_base import AboutDlg_base
+from ui_utils import load_pixmap
+
+
+class AboutDlg(AboutDlg_base):
+ def __init__(self,parent = None,name = None,modal = 0,fl = 0):
+ AboutDlg_base.__init__(self,parent,name,modal,fl)
+
+ self.pyPixmap.setPixmap(load_pixmap('powered_by_python.png'))
+ self.osiPixmap.setPixmap(load_pixmap('opensource-75x65.png'))
+ self.logoPixmap.setPixmap(load_pixmap('hp-tux-printer.png'))
diff --git a/ui/aboutdlg_base.py b/ui/aboutdlg_base.py
new file mode 100644
index 0000000..16730db
--- /dev/null
+++ b/ui/aboutdlg_base.py
@@ -0,0 +1,114 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'ui/aboutdlg_base.ui'
+#
+# Created: Mon Oct 15 16:07:30 2007
+# by: The PyQt User Interface Compiler (pyuic) 3.17
+#
+# WARNING! All changes made in this file will be lost!
+
+
+from qt import *
+
+
+class AboutDlg_base(QDialog):
+ def __init__(self,parent = None,name = None,modal = 0,fl = 0):
+ QDialog.__init__(self,parent,name,modal,fl)
+
+ if not name:
+ self.setName("AboutDlg_base")
+
+
+ AboutDlg_baseLayout = QGridLayout(self,1,1,11,6,"AboutDlg_baseLayout")
+
+ self.textLabel1 = QLabel(self,"textLabel1")
+
+ AboutDlg_baseLayout.addWidget(self.textLabel1,0,0)
+
+ layout17 = QHBoxLayout(None,0,6,"layout17")
+ spacer27 = QSpacerItem(150,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ layout17.addItem(spacer27)
+
+ self.logoPixmap = QLabel(self,"logoPixmap")
+ self.logoPixmap.setSizePolicy(QSizePolicy(QSizePolicy.Fixed,QSizePolicy.Fixed,0,0,self.logoPixmap.sizePolicy().hasHeightForWidth()))
+ self.logoPixmap.setMinimumSize(QSize(100,110))
+ self.logoPixmap.setMaximumSize(QSize(100,110))
+ self.logoPixmap.setScaledContents(1)
+ layout17.addWidget(self.logoPixmap)
+ spacer28 = QSpacerItem(151,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ layout17.addItem(spacer28)
+
+ AboutDlg_baseLayout.addLayout(layout17,1,0)
+
+ self.pushButton15 = QPushButton(self,"pushButton15")
+
+ AboutDlg_baseLayout.addWidget(self.pushButton15,8,0)
+
+ layout1 = QHBoxLayout(None,0,6,"layout1")
+
+ self.textLabel4 = QLabel(self,"textLabel4")
+ layout1.addWidget(self.textLabel4)
+
+ self.VersionText = QLabel(self,"VersionText")
+ layout1.addWidget(self.VersionText)
+
+ AboutDlg_baseLayout.addLayout(layout1,2,0)
+
+ layout1_2 = QHBoxLayout(None,0,6,"layout1_2")
+
+ self.textLabel4_2 = QLabel(self,"textLabel4_2")
+ layout1_2.addWidget(self.textLabel4_2)
+
+ self.ToolboxVersionText = QLabel(self,"ToolboxVersionText")
+ layout1_2.addWidget(self.ToolboxVersionText)
+
+ AboutDlg_baseLayout.addLayout(layout1_2,3,0)
+
+ self.textLabel2 = QLabel(self,"textLabel2")
+
+ AboutDlg_baseLayout.addWidget(self.textLabel2,5,0)
+
+ self.textLabel3 = QLabel(self,"textLabel3")
+
+ AboutDlg_baseLayout.addWidget(self.textLabel3,4,0)
+
+ layout18 = QHBoxLayout(None,0,6,"layout18")
+
+ self.pyPixmap = QLabel(self,"pyPixmap")
+ self.pyPixmap.setMinimumSize(QSize(200,62))
+ self.pyPixmap.setMaximumSize(QSize(200,62))
+ self.pyPixmap.setScaledContents(1)
+ layout18.addWidget(self.pyPixmap)
+
+ self.osiPixmap = QLabel(self,"osiPixmap")
+ self.osiPixmap.setMinimumSize(QSize(75,65))
+ self.osiPixmap.setMaximumSize(QSize(75,65))
+ self.osiPixmap.setScaledContents(1)
+ layout18.addWidget(self.osiPixmap)
+
+ AboutDlg_baseLayout.addLayout(layout18,6,0)
+ spacer29 = QSpacerItem(20,20,QSizePolicy.Minimum,QSizePolicy.Expanding)
+ AboutDlg_baseLayout.addItem(spacer29,7,0)
+
+ self.languageChange()
+
+ self.resize(QSize(481,560).expandedTo(self.minimumSizeHint()))
+ self.clearWState(Qt.WState_Polished)
+
+ self.connect(self.pushButton15,SIGNAL("clicked()"),self.close)
+
+
+ def languageChange(self):
+ self.setCaption(self.__tr("HP Device Manager - About"))
+ self.textLabel1.setText(self.__tr("<font size=\"+3\"><p align=\"center\">HP Linux Imaging and Printing (HPLIP)</p></font>"))
+ self.pushButton15.setText(self.__tr("Close"))
+ self.textLabel4.setText(self.__tr("<b>HPLIP Software Version:</b>"))
+ self.VersionText.setText(self.__tr("0.0.0"))
+ self.textLabel4_2.setText(self.__tr("<b>Device Manager Software Version:</b>"))
+ self.ToolboxVersionText.setText(self.__tr("0.0.0"))
+ self.textLabel2.setText(self.__tr("<b>Authors and Contributors:</b>\nDavid Suffield, Don Welch, Shiyun Yie, Raghothama Cauligi, John Oleinik, Cory Meisch, Foster Nuffer, Pete Parks, Jacqueline Pitter, David Paschal,\nSteve DeRoos, Mark Overton, Aaron Albright, Smith Kennedy, John Hosszu, Chris Wiesner, Henrique M. Holschuh, Till Kamppeter, Linus Araque, Mark Crawford, Charlie Moore, Naga Samrat Choudary, Suma Byrappa, Parul Singh, Srikant Lokare, Sanjay Kumar, Sarbeswar Meher, Goutam Kodu, Gaurav Sood, Raghavendra Chitpadi"))
+ self.textLabel3.setText(self.__tr("<b>License and Copyright:</b>\n(c) Copyright 2007 Hewlett-Packard Development Company, L.P. This software is licensed under the GNU General Public License (GPL), BSD, and MIT licenses. See the software sources for details."))
+
+
+ def __tr(self,s,c = None):
+ return qApp.translate("AboutDlg_base",s,c)
diff --git a/ui/aboutdlg_base.ui b/ui/aboutdlg_base.ui
new file mode 100644
index 0000000..4686e30
--- /dev/null
+++ b/ui/aboutdlg_base.ui
@@ -0,0 +1,259 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>AboutDlg_base</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>AboutDlg_base</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>481</width>
+ <height>560</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>HP Device Manager - About</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>&lt;font size="+3"&gt;&lt;p align="center"&gt;HP Linux Imaging and Printing (HPLIP)&lt;/p&gt;&lt;/font&gt;</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="1" column="0">
+ <property name="name">
+ <cstring>layout17</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>spacer27</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>150</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>logoPixmap</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>100</width>
+ <height>110</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>100</width>
+ <height>110</height>
+ </size>
+ </property>
+ <property name="scaledContents">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer28</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>151</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ <widget class="QPushButton" row="8" column="0">
+ <property name="name">
+ <cstring>pushButton15</cstring>
+ </property>
+ <property name="text">
+ <string>Close</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="2" column="0">
+ <property name="name">
+ <cstring>layout1</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel4</cstring>
+ </property>
+ <property name="text">
+ <string>&lt;b&gt;HPLIP Software Version:&lt;/b&gt;</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>VersionText</cstring>
+ </property>
+ <property name="text">
+ <string>0.0.0</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget" row="3" column="0">
+ <property name="name">
+ <cstring>layout1_2</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel4_2</cstring>
+ </property>
+ <property name="text">
+ <string>&lt;b&gt;Device Manager Software Version:&lt;/b&gt;</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>ToolboxVersionText</cstring>
+ </property>
+ <property name="text">
+ <string>0.0.0</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLabel" row="5" column="0">
+ <property name="name">
+ <cstring>textLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>&lt;b&gt;Authors and Contributors:&lt;/b&gt;
+David Suffield, Don Welch, Shiyun Yie, Raghothama Cauligi, John Oleinik, Cory Meisch, Foster Nuffer, Pete Parks, Jacqueline Pitter, David Paschal,
+Steve DeRoos, Mark Overton, Aaron Albright, Smith Kennedy, John Hosszu, Chris Wiesner, Henrique M. Holschuh, Till Kamppeter, Linus Araque, Mark Crawford, Charlie Moore, Naga Samrat Choudary, Suma Byrappa, Parul Singh, Srikant Lokare, Yashwant Sahu, Sanjay Kumar, Sarbeswar Meher, Goutam Kodu, Gaurav Sood</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="4" column="0">
+ <property name="name">
+ <cstring>textLabel3</cstring>
+ </property>
+ <property name="text">
+ <string>&lt;b&gt;License and Copyright:&lt;/b&gt;
+(c) Copyright 2007 Hewlett-Packard Development Company, L.P. This software is licensed under the GNU General Public License (GPL), BSD, and MIT licenses. See the software sources for details.</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="6" column="0">
+ <property name="name">
+ <cstring>layout18</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>pyPixmap</cstring>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>200</width>
+ <height>62</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>200</width>
+ <height>62</height>
+ </size>
+ </property>
+ <property name="scaledContents">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>osiPixmap</cstring>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>75</width>
+ <height>65</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>75</width>
+ <height>65</height>
+ </size>
+ </property>
+ <property name="scaledContents">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <spacer row="7" column="0">
+ <property name="name">
+ <cstring>spacer29</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>pushButton15</sender>
+ <signal>clicked()</signal>
+ <receiver>AboutDlg_base</receiver>
+ <slot>close()</slot>
+ </connection>
+</connections>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/ui/align10form.py b/ui/align10form.py
new file mode 100644
index 0000000..841330f
--- /dev/null
+++ b/ui/align10form.py
@@ -0,0 +1,65 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2001-2008 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+# Std Lib
+
+# Local
+from base.g import *
+from base import maint
+from ui_utils import load_pixmap
+
+# Qt
+from qt import *
+from align10form_base import Align10Form_Base
+
+# Also supports align-type==11
+class Align10Form(Align10Form_Base):
+ def __init__(self, pattern, align_type=ALIGN_TYPE_LBOW, parent = None, name = None, modal = 0, fl = 0):
+ Align10Form_Base.__init__(self,parent,name,modal,fl)
+ self.Icon.setPixmap(load_pixmap('align10'))
+
+ self.controls = maint.align10and11Controls(pattern, align_type)
+
+ for line in self.controls:
+ if not self.controls[line][0]:
+ eval('self.comboBox%s.setEnabled(False)' % line)
+ else:
+ for x in range(self.controls[line][1]):
+ eval('self.comboBox%s.insertItem("%s%d")' % (line, line, x+1))
+
+ def getValues(self):
+ ret = []
+ controls = self.controls.keys()
+ controls.sort()
+
+ for line in controls:
+ if not self.controls[line][0]:
+ ret.append(0)
+ else:
+ exec('selected = unicode(self.comboBox%s.currentText())' % line)
+ try:
+ selected = int(selected[1:])
+ except ValueError:
+ selected = 0
+ ret.append(selected)
+
+ return ret
+
diff --git a/ui/align10form_base.py b/ui/align10form_base.py
new file mode 100644
index 0000000..2d5c21b
--- /dev/null
+++ b/ui/align10form_base.py
@@ -0,0 +1,148 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'align10form_base.ui'
+#
+# Created: Wed Aug 10 21:07:52 2005
+# by: The PyQt User Interface Compiler (pyuic) 3.14.1
+#
+# WARNING! All changes made in this file will be lost!
+
+
+from qt import *
+
+
+class Align10Form_Base(QDialog):
+ def __init__(self,parent = None,name = None,modal = 0,fl = 0):
+ QDialog.__init__(self,parent,name,modal,fl)
+
+ if not name:
+ self.setName("Align10Form_base")
+
+
+ Align10Form_baseLayout = QGridLayout(self,1,1,11,6,"Align10Form_baseLayout")
+
+ self.textLabel2 = QLabel(self,"textLabel2")
+
+ Align10Form_baseLayout.addMultiCellWidget(self.textLabel2,0,0,0,2)
+
+ layout2 = QGridLayout(None,1,1,0,6,"layout2")
+
+ self.comboBoxF = QComboBox(0,self,"comboBoxF")
+
+ layout2.addWidget(self.comboBoxF,5,1)
+
+ self.textLabel1_2 = QLabel(self,"textLabel1_2")
+
+ layout2.addWidget(self.textLabel1_2,1,0)
+
+ self.textLabel1_6 = QLabel(self,"textLabel1_6")
+
+ layout2.addWidget(self.textLabel1_6,5,0)
+
+ self.comboBoxD = QComboBox(0,self,"comboBoxD")
+
+ layout2.addWidget(self.comboBoxD,3,1)
+
+ self.comboBoxE = QComboBox(0,self,"comboBoxE")
+
+ layout2.addWidget(self.comboBoxE,4,1)
+
+ self.textLabel1_3 = QLabel(self,"textLabel1_3")
+
+ layout2.addWidget(self.textLabel1_3,2,0)
+
+ self.textLabel1_4 = QLabel(self,"textLabel1_4")
+
+ layout2.addWidget(self.textLabel1_4,3,0)
+
+ self.comboBoxC = QComboBox(0,self,"comboBoxC")
+
+ layout2.addWidget(self.comboBoxC,2,1)
+
+ self.comboBoxA = QComboBox(0,self,"comboBoxA")
+
+ layout2.addWidget(self.comboBoxA,0,1)
+
+ self.comboBoxH = QComboBox(0,self,"comboBoxH")
+
+ layout2.addWidget(self.comboBoxH,7,1)
+
+ self.textLabel1_7 = QLabel(self,"textLabel1_7")
+
+ layout2.addWidget(self.textLabel1_7,6,0)
+
+ self.textLabel1 = QLabel(self,"textLabel1")
+
+ layout2.addWidget(self.textLabel1,0,0)
+
+ self.textLabel1_5 = QLabel(self,"textLabel1_5")
+
+ layout2.addWidget(self.textLabel1_5,4,0)
+
+ self.textLabel1_8 = QLabel(self,"textLabel1_8")
+
+ layout2.addWidget(self.textLabel1_8,7,0)
+
+ self.comboBoxB = QComboBox(0,self,"comboBoxB")
+
+ layout2.addWidget(self.comboBoxB,1,1)
+
+ self.comboBoxG = QComboBox(0,self,"comboBoxG")
+
+ layout2.addWidget(self.comboBoxG,6,1)
+
+ Align10Form_baseLayout.addMultiCellLayout(layout2,0,1,4,5)
+ spacer2 = QSpacerItem(20,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ Align10Form_baseLayout.addItem(spacer2,0,3)
+ spacer3 = QSpacerItem(20,41,QSizePolicy.Minimum,QSizePolicy.Expanding)
+ Align10Form_baseLayout.addItem(spacer3,2,5)
+
+ self.pushButton1 = QPushButton(self,"pushButton1")
+
+ Align10Form_baseLayout.addWidget(self.pushButton1,3,5)
+
+ self.pushButton2 = QPushButton(self,"pushButton2")
+
+ Align10Form_baseLayout.addMultiCellWidget(self.pushButton2,3,3,3,4)
+ spacer1 = QSpacerItem(320,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ Align10Form_baseLayout.addMultiCell(spacer1,3,3,0,2)
+ spacer5 = QSpacerItem(40,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ Align10Form_baseLayout.addItem(spacer5,1,0)
+
+ self.Icon = QLabel(self,"Icon")
+ self.Icon.setSizePolicy(QSizePolicy(QSizePolicy.Fixed,QSizePolicy.Fixed,0,0,self.Icon.sizePolicy().hasHeightForWidth()))
+ self.Icon.setMinimumSize(QSize(192,93))
+ self.Icon.setMaximumSize(QSize(192,93))
+ self.Icon.setScaledContents(1)
+
+ Align10Form_baseLayout.addWidget(self.Icon,1,1)
+ spacer4 = QSpacerItem(60,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ Align10Form_baseLayout.addMultiCell(spacer4,1,1,2,3)
+
+ self.languageChange()
+
+ self.resize(QSize(520,326).expandedTo(self.minimumSizeHint()))
+ self.clearWState(Qt.WState_Polished)
+
+ self.connect(self.pushButton1,SIGNAL("clicked()"),self.accept)
+ self.connect(self.pushButton2,SIGNAL("clicked()"),self.reject)
+
+
+ def languageChange(self):
+ self.setCaption(self.__tr("HP Device Manager - Alignment"))
+ self.textLabel2.setText(self.__tr("Examine the page that was printed. Several rows of boxes, each made up of thin lines, appear on the printed page.<p>\n"
+"For each row, select the label representing the box in which the shorter inner lines are the most aligned with the longer outer lines.."))
+ self.textLabel1_2.setText(self.__tr("<b><font face=\"Courier\">B:</font></b>"))
+ self.textLabel1_6.setText(self.__tr("<b><font face=\"Courier\">F:</font></b>"))
+ self.textLabel1_3.setText(self.__tr("<b><font face=\"Courier\">C:</font></b>"))
+ self.textLabel1_4.setText(self.__tr("<b><font face=\"Courier\">D:</font></b>"))
+ self.textLabel1_7.setText(self.__tr("<b><font face=\"Courier\">G:</font></b>"))
+ self.textLabel1.setText(self.__tr("<b><font face=\"Courier\">A:</font></b>"))
+ self.textLabel1_5.setText(self.__tr("<b><font face=\"Courier\">E:</font></b>"))
+ self.textLabel1_8.setText(self.__tr("<b><font face=\"Courier\">H:</font></b>"))
+ self.pushButton1.setText(self.__tr("Next >"))
+ self.pushButton2.setText(self.__tr("Cancel"))
+
+
+ def __tr(self,s,c = None):
+ return qApp.translate("Align10Form_Base",s,c)
diff --git a/ui/align10form_base.ui b/ui/align10form_base.ui
new file mode 100644
index 0000000..6f7a95f
--- /dev/null
+++ b/ui/align10form_base.ui
@@ -0,0 +1,291 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>Align10Form_Base</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>Align10Form_base</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>520</width>
+ <height>326</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>HP Device Manager - Alignment</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="0" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>textLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>Examine the page that was printed. Several rows of boxes, each made up of thin lines, appear on the printed page.&lt;p&gt;
+For each row, select the label representing the box in which the shorter inner lines are the most aligned with the longer outer lines..</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="0" column="4" rowspan="2" colspan="2">
+ <property name="name">
+ <cstring>layout2</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QComboBox" row="5" column="1">
+ <property name="name">
+ <cstring>comboBoxF</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>textLabel1_2</cstring>
+ </property>
+ <property name="text">
+ <string>&lt;b&gt;&lt;font face="Courier"&gt;B:&lt;/font&gt;&lt;/b&gt;</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="5" column="0">
+ <property name="name">
+ <cstring>textLabel1_6</cstring>
+ </property>
+ <property name="text">
+ <string>&lt;b&gt;&lt;font face="Courier"&gt;F:&lt;/font&gt;&lt;/b&gt;</string>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="3" column="1">
+ <property name="name">
+ <cstring>comboBoxD</cstring>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="4" column="1">
+ <property name="name">
+ <cstring>comboBoxE</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>textLabel1_3</cstring>
+ </property>
+ <property name="text">
+ <string>&lt;b&gt;&lt;font face="Courier"&gt;C:&lt;/font&gt;&lt;/b&gt;</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="3" column="0">
+ <property name="name">
+ <cstring>textLabel1_4</cstring>
+ </property>
+ <property name="text">
+ <string>&lt;b&gt;&lt;font face="Courier"&gt;D:&lt;/font&gt;&lt;/b&gt;</string>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="2" column="1">
+ <property name="name">
+ <cstring>comboBoxC</cstring>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="0" column="1">
+ <property name="name">
+ <cstring>comboBoxA</cstring>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="7" column="1">
+ <property name="name">
+ <cstring>comboBoxH</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="6" column="0">
+ <property name="name">
+ <cstring>textLabel1_7</cstring>
+ </property>
+ <property name="text">
+ <string>&lt;b&gt;&lt;font face="Courier"&gt;G:&lt;/font&gt;&lt;/b&gt;</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>&lt;b&gt;&lt;font face="Courier"&gt;A:&lt;/font&gt;&lt;/b&gt;</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="4" column="0">
+ <property name="name">
+ <cstring>textLabel1_5</cstring>
+ </property>
+ <property name="text">
+ <string>&lt;b&gt;&lt;font face="Courier"&gt;E:&lt;/font&gt;&lt;/b&gt;</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="7" column="0">
+ <property name="name">
+ <cstring>textLabel1_8</cstring>
+ </property>
+ <property name="text">
+ <string>&lt;b&gt;&lt;font face="Courier"&gt;H:&lt;/font&gt;&lt;/b&gt;</string>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="1" column="1">
+ <property name="name">
+ <cstring>comboBoxB</cstring>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="6" column="1">
+ <property name="name">
+ <cstring>comboBoxG</cstring>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <spacer row="0" column="3">
+ <property name="name">
+ <cstring>spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <spacer row="2" column="5">
+ <property name="name">
+ <cstring>spacer3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>41</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton" row="3" column="5">
+ <property name="name">
+ <cstring>pushButton1</cstring>
+ </property>
+ <property name="text">
+ <string>Next &gt;</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="3" column="3" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>pushButton2</cstring>
+ </property>
+ <property name="text">
+ <string>Cancel</string>
+ </property>
+ </widget>
+ <spacer row="3" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>320</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <spacer row="1" column="0">
+ <property name="name">
+ <cstring>spacer5</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLabel" row="1" column="1">
+ <property name="name">
+ <cstring>Icon</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>192</width>
+ <height>93</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>192</width>
+ <height>93</height>
+ </size>
+ </property>
+ <property name="scaledContents">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <spacer row="1" column="2" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>spacer4</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>60</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>pushButton1</sender>
+ <signal>clicked()</signal>
+ <receiver>Align10Form_base</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection>
+ <sender>pushButton2</sender>
+ <signal>clicked()</signal>
+ <receiver>Align10Form_base</receiver>
+ <slot>reject()</slot>
+ </connection>
+</connections>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/ui/align13form.py b/ui/align13form.py
new file mode 100644
index 0000000..cd5e9cc
--- /dev/null
+++ b/ui/align13form.py
@@ -0,0 +1,34 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2001-2008 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+# Std Lib
+
+# Local
+from base.g import *
+
+# Qt
+from qt import *
+from align13form_base import Align13Form_Base
+
+
+class Align13Form(Align13Form_Base):
+ def __init__(self, parent=None, name=None, modal=0, fl=0):
+ Align13Form_Base.__init__(self, parent, name, modal, fl)
diff --git a/ui/align13form_base.py b/ui/align13form_base.py
new file mode 100644
index 0000000..c962876
--- /dev/null
+++ b/ui/align13form_base.py
@@ -0,0 +1,50 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'align13form_base.ui'
+#
+# Created: Tue Oct 14 13:35:16 2008
+# by: The PyQt User Interface Compiler (pyuic) 3.17.4
+#
+# WARNING! All changes made in this file will be lost!
+
+
+from qt import *
+
+
+class Align13Form_Base(QDialog):
+ def __init__(self,parent = None,name = None,modal = 0,fl = 0):
+ QDialog.__init__(self,parent,name,modal,fl)
+
+ if not name:
+ self.setName("Align13Form_base")
+
+
+
+ self.textLabel2 = QLabel(self,"textLabel2")
+ self.textLabel2.setGeometry(QRect(30,20,540,140))
+
+ self.OKButton = QPushButton(self,"OKButton")
+ self.OKButton.setGeometry(QRect(490,180,80,30))
+
+ self.languageChange()
+
+ self.resize(QSize(600,232).expandedTo(self.minimumSizeHint()))
+ self.clearWState(Qt.WState_Polished)
+
+ self.connect(self.OKButton,SIGNAL("clicked()"),self.accept)
+
+
+ def languageChange(self):
+ self.setCaption(self.__tr("HP Device Manager - Align Print Cartridges"))
+ self.textLabel2.setText(self.__tr("<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
+"p, li { white-space: pre-wrap; }\n"
+"</style></head><body style=\" font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;\">\n"
+"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-weight:600;\">Follow these steps to complete the alignment:</span> </p>\n"
+"<p style=\" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-weight:600;\">1.</span> Place the alignment page, with the printed side facing down, on the scanner. </p>\n"
+"<p style=\" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-weight:600;\">2.</span> Press the <span style=\" font-style:italic;\">Enter</span> or <span style=\" font-style:italic;\">Scan</span> button on the printer. </p>\n"
+"<p style=\" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-weight:600;\">3.</span> \"Alignment Complete\" will be displayed when the process is finished (on some models with a front panel display) or the green light that was blinking during the process will stop blinking and remain green (on some models without a front panel display).</p></body></html>"))
+ self.OKButton.setText(self.__tr("OK"))
+
+
+ def __tr(self,s,c = None):
+ return qApp.translate("Align13Form_Base",s,c)
diff --git a/ui/align13form_base.ui b/ui/align13form_base.ui
new file mode 100644
index 0000000..3fd4b57
--- /dev/null
+++ b/ui/align13form_base.ui
@@ -0,0 +1,66 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>Align13Form_Base</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>Align13Form_base</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>600</width>
+ <height>232</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>HP Device Manager - Align Print Cartridges</string>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel2</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>30</x>
+ <y>20</y>
+ <width>540</width>
+ <height>140</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>&lt;html&gt;&lt;head&gt;&lt;meta name="qrichtext" content="1" /&gt;&lt;style type="text/css"&gt;
+p, li { white-space: pre-wrap; }
+&lt;/style&gt;&lt;/head&gt;&lt;body style=" font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;"&gt;
+&lt;p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"&gt;&lt;span style=" font-weight:600;"&gt;Follow these steps to complete the alignment:&lt;/span&gt; &lt;/p&gt;
+&lt;p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"&gt;&lt;span style=" font-weight:600;"&gt;1.&lt;/span&gt; Place the alignment page, with the printed side facing down, on the scanner. &lt;/p&gt;
+&lt;p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"&gt;&lt;span style=" font-weight:600;"&gt;2.&lt;/span&gt; Press the &lt;span style=" font-style:italic;"&gt;Enter&lt;/span&gt; or &lt;span style=" font-style:italic;"&gt;Scan&lt;/span&gt; button on the printer. &lt;/p&gt;
+&lt;p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"&gt;&lt;span style=" font-weight:600;"&gt;3.&lt;/span&gt; "Alignment Complete" will be displayed when the process is finished (on some models with a front panel display) or the green light that was blinking during the process will stop blinking and remain green (on some models without a front panel display).&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>OKButton</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>490</x>
+ <y>180</y>
+ <width>80</width>
+ <height>30</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>OK</string>
+ </property>
+ </widget>
+</widget>
+<connections>
+ <connection>
+ <sender>OKButton</sender>
+ <signal>clicked()</signal>
+ <receiver>Align13Form_base</receiver>
+ <slot>accept()</slot>
+ </connection>
+</connections>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/ui/alignform.py b/ui/alignform.py
new file mode 100644
index 0000000..d3fa30f
--- /dev/null
+++ b/ui/alignform.py
@@ -0,0 +1,123 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2001-2008 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+# Std Lib
+
+# Local
+from base.g import *
+from ui_utils import load_pixmap
+
+# Qt
+from qt import *
+
+
+class AlignForm(QDialog):
+ def __init__(self, parent, line_id, orientation, colors, line_count,
+ choice_count, name = None, modal = 0, fl = 0):
+ QDialog.__init__(self, parent, name, modal, fl)
+
+ # line_id: 'A', 'B', etc.
+ # orientation: 'v' or 'h'
+ # colors: 'k' or 'c' or 'kc'
+ # line_count: 2 or 3
+ # choice_count: 5, 7, 9, 11, etc. (odd)
+ mid_point = (choice_count+1)/2
+
+ if not name:
+ self.setProperty("name", QVariant("AlignForm"))
+
+ AlignFormLayout = QGridLayout(self,1,1,11,6,"AlignFormLayout")
+
+ #self.helpButton = QPushButton(self,"helpButton")
+
+ #AlignFormLayout.addWidget(self.helpButton,1,0)
+
+ self.CancelButton = QPushButton(self,"CancelButton")
+
+ AlignFormLayout.addWidget(self.CancelButton,1,2)
+
+ self.ContinueButton = QPushButton(self,"ContinueButton")
+
+ AlignFormLayout.addWidget(self.ContinueButton,1,3)
+ spacer1 = QSpacerItem(270,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ AlignFormLayout.addItem(spacer1,1,1)
+
+ self.buttonGroup = QButtonGroup(self,"buttonGroup")
+ self.buttonGroup.setColumnLayout(0,Qt.Vertical)
+ self.buttonGroup.layout().setSpacing(6)
+ self.buttonGroup.layout().setMargin(11)
+
+ buttonGroupLayout = QGridLayout(self.buttonGroup.layout())
+ buttonGroupLayout.setAlignment(Qt.AlignTop)
+
+ ChoiceLayout = QHBoxLayout(None,0,6,"ChoiceLayout")
+
+ for x in range(1, choice_count+1):
+ exec 'self.radioButton%d = QRadioButton( self.buttonGroup, "radioButton%d" )' % (x, x)
+ exec 'self.radioButton%d.setText( "%s%d" )' % (x, line_id, x)
+ if x == mid_point:
+ exec 'self.radioButton%d.setChecked( 1 )' % x
+ exec 'ChoiceLayout.addWidget( self.radioButton%d )' % x
+
+ buttonGroupLayout.addMultiCellLayout(ChoiceLayout, 1, 1, 0, 1)
+
+ self.Icon = QLabel(self.buttonGroup,"Icon")
+ self.Icon.setProperty("sizePolicy",QVariant(QSizePolicy(QSizePolicy.Fixed,QSizePolicy.Fixed,0,0,self.Icon.sizePolicy().hasHeightForWidth())))
+ self.Icon.setProperty("scaledContents",QVariant(QVariant(1,0)))
+
+ buttonGroupLayout.addWidget(self.Icon,0,0)
+
+ self.textLabel2_2 = QLabel(self.buttonGroup,"textLabel2_2")
+ self.textLabel2_2.setProperty("alignment",QVariant(QLabel.WordBreak | QLabel.AlignVCenter))
+
+ buttonGroupLayout.addWidget(self.textLabel2_2,0,1)
+
+ AlignFormLayout.addMultiCellWidget(self.buttonGroup,0,0,0,3)
+
+ self.languageChange()
+
+ self.resize(QSize(608,222).expandedTo(self.minimumSizeHint()))
+ self.clearWState(Qt.WState_Polished)
+
+ self.connect(self.CancelButton,SIGNAL("clicked()"),self,SLOT("reject()"))
+ self.connect(self.ContinueButton,SIGNAL("clicked()"),self,SLOT("accept()"))
+ self.connect(self.buttonGroup,SIGNAL("clicked(int)"),self.buttonGroup_clicked)
+
+ self.Icon.setPixmap(load_pixmap('%s-%s-%d.png' % (orientation, colors, line_count), 'other'))
+
+ self.buttonGroup.setTitle(line_id)
+
+ self.value = (choice_count + 1) / 2
+
+ def buttonGroup_clicked(self,a0):
+ self.value = a0 + 1
+ log.debug(self.value)
+
+ def languageChange(self):
+ self.setProperty("caption",QVariant(self.__tr("HP Device Manager - Alignment")))
+ #self.helpButton.setProperty("text",QVariant(self.__tr("Help")))
+ self.CancelButton.setProperty("text",QVariant(self.__tr("Cancel")))
+ self.ContinueButton.setProperty("text",QVariant(self.__tr("Next >")))
+ self.buttonGroup.setProperty("title",QVariant(self.__tr("")))
+ self.textLabel2_2.setProperty("text",QVariant(self.__tr("Choose the set of lines where the line segments are <b>best</b> aligned.")))
+
+ def __tr(self,s,c = None):
+ return qApp.translate("AlignForm",s,c)
diff --git a/ui/aligntype6form1.py b/ui/aligntype6form1.py
new file mode 100644
index 0000000..8c258ef
--- /dev/null
+++ b/ui/aligntype6form1.py
@@ -0,0 +1,29 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2001-2007 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+from qt import *
+from aligntype6form1_base import AlignType6Form1_base
+
+class AlignType6Form1(AlignType6Form1_base):
+
+ def __init__(self,parent = None,name = None,modal = 0,fl = 0):
+ AlignType6Form1_base.__init__(self,parent,name,modal,fl)
+
diff --git a/ui/aligntype6form1_base.py b/ui/aligntype6form1_base.py
new file mode 100644
index 0000000..28a615c
--- /dev/null
+++ b/ui/aligntype6form1_base.py
@@ -0,0 +1,67 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file '/home/dwelch/linux-imaging-and-printing/src/ui/aligntype6form1_base.ui'
+#
+# Created: Fri Apr 1 14:51:30 2005
+# by: The PyQt User Interface Compiler (pyuic) 3.14.1
+#
+# WARNING! All changes made in this file will be lost!
+
+
+import sys
+from qt import *
+
+
+class AlignType6Form1_base(QDialog):
+ def __init__(self,parent = None,name = None,modal = 0,fl = 0):
+ QDialog.__init__(self,parent,name,modal,fl)
+
+ if not name:
+ self.setName("AlignType6Form1_base")
+
+
+ AlignType6Form1_baseLayout = QGridLayout(self,1,1,11,6,"AlignType6Form1_baseLayout")
+
+ self.textLabel1 = QLabel(self,"textLabel1")
+ self.textLabel1.setAlignment(QLabel.WordBreak | QLabel.AlignVCenter)
+
+ AlignType6Form1_baseLayout.addMultiCellWidget(self.textLabel1,0,0,0,2)
+
+ self.pushButton2 = QPushButton(self,"pushButton2")
+
+ AlignType6Form1_baseLayout.addWidget(self.pushButton2,1,2)
+
+ self.pushButton3 = QPushButton(self,"pushButton3")
+
+ AlignType6Form1_baseLayout.addWidget(self.pushButton3,1,1)
+ spacer2 = QSpacerItem(351,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ AlignType6Form1_baseLayout.addItem(spacer2,1,0)
+
+ self.languageChange()
+
+ self.resize(QSize(627,188).expandedTo(self.minimumSizeHint()))
+ self.clearWState(Qt.WState_Polished)
+
+ self.connect(self.pushButton2,SIGNAL("clicked()"),self.accept)
+ self.connect(self.pushButton3,SIGNAL("clicked()"),self.reject)
+
+
+ def languageChange(self):
+ self.setCaption(self.__tr("HP Device Manager - Alignment"))
+ self.textLabel1.setText(self.__tr("To perform alignment, you will need the <b>alignment page</b> that is automatically printed after you install a print cartridge.\n"
+"<p> If you do <b>not</b> have this page, click <i>Print Page</i>.\n"
+"<p>If you already have this page, click <i>Next ></i>."))
+ self.pushButton2.setText(self.__tr("Next >"))
+ self.pushButton3.setText(self.__tr("Print Page"))
+
+
+ def __tr(self,s,c = None):
+ return qApp.translate("AlignType6Form1_base",s,c)
+
+if __name__ == "__main__":
+ a = QApplication(sys.argv)
+ QObject.connect(a,SIGNAL("lastWindowClosed()"),a,SLOT("quit()"))
+ w = AlignType6Form1_base()
+ a.setMainWidget(w)
+ w.show()
+ a.exec_loop()
diff --git a/ui/aligntype6form1_base.ui b/ui/aligntype6form1_base.ui
new file mode 100644
index 0000000..489f9a6
--- /dev/null
+++ b/ui/aligntype6form1_base.ui
@@ -0,0 +1,85 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>AlignType6Form1_base</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>AlignType6Form1_base</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>627</width>
+ <height>188</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>HP Device Manager - Alignment</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="0" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>To perform alignment, you will need the &lt;b&gt;alignment page&lt;/b&gt; that is automatically printed after you install a print cartridge.
+&lt;p&gt; If you do &lt;b&gt;not&lt;/b&gt; have this page, click &lt;i&gt;Print Page&lt;/i&gt;.
+&lt;p&gt;If you already have this page, click &lt;i&gt;Next &gt;&lt;/i&gt;.</string>
+ </property>
+ <property name="alignment">
+ <set>WordBreak|AlignVCenter</set>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="1" column="2">
+ <property name="name">
+ <cstring>pushButton2</cstring>
+ </property>
+ <property name="text">
+ <string>Next &gt;</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="1" column="1">
+ <property name="name">
+ <cstring>pushButton3</cstring>
+ </property>
+ <property name="text">
+ <string>Print Page</string>
+ </property>
+ </widget>
+ <spacer row="1" column="0">
+ <property name="name">
+ <cstring>spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>351</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>pushButton2</sender>
+ <signal>clicked()</signal>
+ <receiver>AlignType6Form1_base</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection>
+ <sender>pushButton3</sender>
+ <signal>clicked()</signal>
+ <receiver>AlignType6Form1_base</receiver>
+ <slot>reject()</slot>
+ </connection>
+</connections>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/ui/aligntype6form2.py b/ui/aligntype6form2.py
new file mode 100644
index 0000000..b5cec27
--- /dev/null
+++ b/ui/aligntype6form2.py
@@ -0,0 +1,28 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2001-2007 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+from qt import *
+from aligntype6form2_base import AlignType6Form2_base
+
+class AlignType6Form2(AlignType6Form2_base):
+ def __init__(self,parent = None,name = None,modal = 0,fl = 0):
+ AlignType6Form2_base.__init__(self,parent,name,modal,fl)
+
diff --git a/ui/aligntype6form2_base.py b/ui/aligntype6form2_base.py
new file mode 100644
index 0000000..17a5ba7
--- /dev/null
+++ b/ui/aligntype6form2_base.py
@@ -0,0 +1,63 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file '/home/dwelch/linux-imaging-and-printing/src/ui/aligntype6form2_base.ui'
+#
+# Created: Fri Apr 1 14:51:27 2005
+# by: The PyQt User Interface Compiler (pyuic) 3.14.1
+#
+# WARNING! All changes made in this file will be lost!
+
+
+import sys
+from qt import *
+
+
+class AlignType6Form2_base(QDialog):
+ def __init__(self,parent = None,name = None,modal = 0,fl = 0):
+ QDialog.__init__(self,parent,name,modal,fl)
+
+ if not name:
+ self.setName("AlignType6Form2_base")
+
+
+ AlignType6Form2_baseLayout = QGridLayout(self,1,1,11,6,"AlignType6Form2_baseLayout")
+
+ self.textLabel1 = QLabel(self,"textLabel1")
+ self.textLabel1.setTextFormat(QLabel.RichText)
+ self.textLabel1.setAlignment(QLabel.WordBreak | QLabel.AlignVCenter)
+
+ AlignType6Form2_baseLayout.addMultiCellWidget(self.textLabel1,0,0,0,1)
+
+ self.pushButton4 = QPushButton(self,"pushButton4")
+
+ AlignType6Form2_baseLayout.addWidget(self.pushButton4,1,1)
+ spacer3 = QSpacerItem(581,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ AlignType6Form2_baseLayout.addItem(spacer3,1,0)
+
+ self.languageChange()
+
+ self.resize(QSize(626,211).expandedTo(self.minimumSizeHint()))
+ self.clearWState(Qt.WState_Polished)
+
+ self.connect(self.pushButton4,SIGNAL("clicked()"),self.accept)
+
+
+ def languageChange(self):
+ self.setCaption(self.__tr("HP Device Manager - Alignment"))
+ self.textLabel1.setText(self.__tr("<b>Follow these steps to complete the alignment:</b>\n"
+"<p><b>1.</b> Place the alignment page, with the printed side facing down, on the scanner.\n"
+"<p><b>2.</b> Press the <i>Enter</i> or <i>Scan</i> button on the printer.\n"
+"<p><b>3.</b> \"Alignment Complete\" will be displayed when the process is finished (on some models).."))
+ self.pushButton4.setText(self.__tr("OK"))
+
+
+ def __tr(self,s,c = None):
+ return qApp.translate("AlignType6Form2_base",s,c)
+
+if __name__ == "__main__":
+ a = QApplication(sys.argv)
+ QObject.connect(a,SIGNAL("lastWindowClosed()"),a,SLOT("quit()"))
+ w = AlignType6Form2_base()
+ a.setMainWidget(w)
+ w.show()
+ a.exec_loop()
diff --git a/ui/aligntype6form2_base.ui b/ui/aligntype6form2_base.ui
new file mode 100644
index 0000000..edcaf6e
--- /dev/null
+++ b/ui/aligntype6form2_base.ui
@@ -0,0 +1,75 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>AlignType6Form2_base</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>AlignType6Form2_base</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>626</width>
+ <height>211</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>HP Device Manager - Alignment</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="0" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>&lt;b&gt;Follow these steps to complete the alignment:&lt;/b&gt;
+&lt;p&gt;&lt;b&gt;1.&lt;/b&gt; Place the alignment page, with the printed side facing down, on the scanner.
+&lt;p&gt;&lt;b&gt;2.&lt;/b&gt; Press the &lt;i&gt;Enter&lt;/i&gt; or &lt;i&gt;Scan&lt;/i&gt; button on the printer.
+&lt;p&gt;&lt;b&gt;3.&lt;/b&gt; "Alignment Complete" will be displayed when the process is finished (on some models)..</string>
+ </property>
+ <property name="textFormat">
+ <enum>RichText</enum>
+ </property>
+ <property name="alignment">
+ <set>WordBreak|AlignVCenter</set>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="1" column="1">
+ <property name="name">
+ <cstring>pushButton4</cstring>
+ </property>
+ <property name="text">
+ <string>OK</string>
+ </property>
+ </widget>
+ <spacer row="1" column="0">
+ <property name="name">
+ <cstring>spacer3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>581</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>pushButton4</sender>
+ <signal>clicked()</signal>
+ <receiver>AlignType6Form2_base</receiver>
+ <slot>accept()</slot>
+ </connection>
+</connections>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/ui/allowabletypesdlg.py b/ui/allowabletypesdlg.py
new file mode 100644
index 0000000..0253077
--- /dev/null
+++ b/ui/allowabletypesdlg.py
@@ -0,0 +1,33 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2007 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+from qt import *
+from allowabletypesdlg_base import AllowableTypesDlg_base
+
+class AllowableTypesDlg(AllowableTypesDlg_base):
+ def __init__(self, allowables, parent=None, name=None, modal=0, fl=0):
+ AllowableTypesDlg_base.__init__(self,parent,name,modal,fl)
+
+ for x in allowables:
+ QListViewItem(self.allowableTypesListView, x, *allowables[x])
+
+ def __tr(self,s,c = None):
+ return qApp.translate("AllowableTypesDlg",s,c)
diff --git a/ui/allowabletypesdlg_base.py b/ui/allowabletypesdlg_base.py
new file mode 100644
index 0000000..ffc1ea6
--- /dev/null
+++ b/ui/allowabletypesdlg_base.py
@@ -0,0 +1,74 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'allowabletypesdlg_base.ui'
+#
+# Created: Wed Mar 14 12:57:36 2007
+# by: The PyQt User Interface Compiler (pyuic) 3.16
+#
+# WARNING! All changes made in this file will be lost!
+
+
+from qt import *
+
+
+class AllowableTypesDlg_base(QDialog):
+ def __init__(self,parent = None,name = None,modal = 0,fl = 0):
+ QDialog.__init__(self,parent,name,modal,fl)
+
+ if not name:
+ self.setName("AllowableTypesDlg_base")
+
+
+ AllowableTypesDlg_baseLayout = QGridLayout(self,1,1,11,6,"AllowableTypesDlg_baseLayout")
+
+ self.line1_2 = QFrame(self,"line1_2")
+ self.line1_2.setFrameShape(QFrame.HLine)
+ self.line1_2.setFrameShadow(QFrame.Sunken)
+ self.line1_2.setFrameShape(QFrame.HLine)
+
+ AllowableTypesDlg_baseLayout.addMultiCellWidget(self.line1_2,1,1,0,1)
+
+ self.textLabel3_2 = QLabel(self,"textLabel3_2")
+ self.textLabel3_2.setSizePolicy(QSizePolicy(QSizePolicy.Preferred,QSizePolicy.Preferred,0,0,self.textLabel3_2.sizePolicy().hasHeightForWidth()))
+
+ AllowableTypesDlg_baseLayout.addMultiCellWidget(self.textLabel3_2,0,0,0,1)
+
+ self.pushButton10 = QPushButton(self,"pushButton10")
+
+ AllowableTypesDlg_baseLayout.addWidget(self.pushButton10,4,1)
+ spacer7 = QSpacerItem(301,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ AllowableTypesDlg_baseLayout.addItem(spacer7,4,0)
+
+ self.allowableTypesListView = QListView(self,"allowableTypesListView")
+ self.allowableTypesListView.addColumn(self.__tr("MIME Type"))
+ self.allowableTypesListView.addColumn(self.__tr("Description"))
+ self.allowableTypesListView.addColumn(self.__tr("Usual File Extension(s)"))
+ self.allowableTypesListView.setSelectionMode(QListView.NoSelection)
+ self.allowableTypesListView.setAllColumnsShowFocus(1)
+
+ AllowableTypesDlg_baseLayout.addMultiCellWidget(self.allowableTypesListView,2,2,0,1)
+
+ self.textLabel1 = QLabel(self,"textLabel1")
+
+ AllowableTypesDlg_baseLayout.addMultiCellWidget(self.textLabel1,3,3,0,1)
+
+ self.languageChange()
+
+ self.resize(QSize(495,576).expandedTo(self.minimumSizeHint()))
+ self.clearWState(Qt.WState_Polished)
+
+ self.connect(self.pushButton10,SIGNAL("clicked()"),self.accept)
+
+
+ def languageChange(self):
+ self.setCaption(self.__tr("HP Device Manager - Allowable Types"))
+ self.textLabel3_2.setText(self.__tr("<b>File/document types that can be added to the file list.</b>"))
+ self.pushButton10.setText(self.__tr("OK"))
+ self.allowableTypesListView.header().setLabel(0,self.__tr("MIME Type"))
+ self.allowableTypesListView.header().setLabel(1,self.__tr("Description"))
+ self.allowableTypesListView.header().setLabel(2,self.__tr("Usual File Extension(s)"))
+ self.textLabel1.setText(self.__tr("<i>Note: To print or fax file/document types that do not appear on this list, print the document from the application that created it through the appropriate CUPS printer.</i>"))
+
+
+ def __tr(self,s,c = None):
+ return qApp.translate("AllowableTypesDlg_base",s,c)
diff --git a/ui/allowabletypesdlg_base.ui b/ui/allowabletypesdlg_base.ui
new file mode 100644
index 0000000..9aa5b9c
--- /dev/null
+++ b/ui/allowabletypesdlg_base.ui
@@ -0,0 +1,140 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>AllowableTypesDlg_base</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>AllowableTypesDlg_base</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>495</width>
+ <height>576</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>HP Device Manager - Allowable Types</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="Line" row="1" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>line1_2</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>HLine</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Sunken</enum>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>textLabel3_2</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>&lt;b&gt;File/document types that can be added to the file list.&lt;/b&gt;</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="4" column="1">
+ <property name="name">
+ <cstring>pushButton10</cstring>
+ </property>
+ <property name="text">
+ <string>OK</string>
+ </property>
+ </widget>
+ <spacer row="4" column="0">
+ <property name="name">
+ <cstring>spacer7</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>301</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QListView" row="2" column="0" rowspan="1" colspan="2">
+ <column>
+ <property name="text">
+ <string>MIME Type</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Description</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Usual File Extension(s)</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>allowableTypesListView</cstring>
+ </property>
+ <property name="selectionMode">
+ <enum>NoSelection</enum>
+ </property>
+ <property name="allColumnsShowFocus">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QLabel" row="3" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>&lt;i&gt;Note: To print or fax file/document types that do not appear on this list, print the document from the application that created it through the appropriate CUPS printer.&lt;/i&gt;</string>
+ </property>
+ </widget>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>pushButton10</sender>
+ <signal>clicked()</signal>
+ <receiver>AllowableTypesDlg_base</receiver>
+ <slot>accept()</slot>
+ </connection>
+</connections>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/ui/choosedevicedlg.py b/ui/choosedevicedlg.py
new file mode 100644
index 0000000..32e2ccc
--- /dev/null
+++ b/ui/choosedevicedlg.py
@@ -0,0 +1,107 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2001-2009 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+from base.g import *
+import sys
+from qt import *
+
+class ChooseDeviceDlg(QDialog):
+ def __init__(self, devices, parent = None,name = None,modal = 0,fl = 0):
+ QDialog.__init__(self,parent,name,modal,fl)
+
+ if not name:
+ self.setName("ChooseDeviceDlg")
+
+ self.device_uri = ''
+
+ ChooseDeviceDlg_Layout = QGridLayout(self,1,1,6,6,"ChooseDeviceDlg_Layout")
+
+ self.OKButton = QPushButton(self,"OKButton")
+
+ ChooseDeviceDlg_Layout.addWidget(self.OKButton,2,2)
+
+ self.CancelButton = QPushButton(self,"CancelButton")
+
+ ChooseDeviceDlg_Layout.addWidget(self.CancelButton,2,1)
+ spacer1 = QSpacerItem(391,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ ChooseDeviceDlg_Layout.addItem(spacer1,2,0)
+ spacer2 = QSpacerItem(20,290,QSizePolicy.Minimum,QSizePolicy.Expanding)
+ ChooseDeviceDlg_Layout.addItem(spacer2,1,0)
+
+ self.DevicesButtonGroup = QButtonGroup(self,"DevicesButtonGroup")
+ self.DevicesButtonGroup.setColumnLayout(0,Qt.Vertical)
+ self.DevicesButtonGroup.layout().setSpacing(6)
+ self.DevicesButtonGroup.layout().setMargin(6)
+ DevicesButtonGroupLayout = QGridLayout(self.DevicesButtonGroup.layout())
+ DevicesButtonGroupLayout.setAlignment(Qt.AlignTop)
+
+ self.radio_buttons = {}
+
+ last_used_device_uri = user_conf.get('last_used', 'device_uri')
+ last_used_index = None
+
+ for y in range(len(devices)):
+ self.radio_buttons[y] = QRadioButton(self.DevicesButtonGroup,"radioButton%d" % y)
+ self.radio_buttons[y].setText(devices[y][0])
+
+ if devices[y][0] == last_used_device_uri:
+ last_used_index = y
+ self.device_uri = devices[y][0]
+
+ DevicesButtonGroupLayout.addWidget(self.radio_buttons[y], y, 0)
+
+ if last_used_index is not None:
+ self.radio_buttons[last_used_index].setChecked(1)
+ else:
+ self.radio_buttons[0].setChecked(1)
+ self.device_uri = devices[0][0]
+
+ ChooseDeviceDlg_Layout.addMultiCellWidget(self.DevicesButtonGroup,0,0,0,2)
+
+ self.languageChange()
+
+ self.resize(QSize(592,112).expandedTo(self.minimumSizeHint()))
+ self.clearWState(Qt.WState_Polished)
+
+ self.connect(self.OKButton,SIGNAL("clicked()"),self,SLOT("accept()"))
+ self.connect(self.CancelButton,SIGNAL("clicked()"),self,SLOT("reject()"))
+ self.connect(self.DevicesButtonGroup,SIGNAL("clicked(int)"),self.DevicesButtonGroup_clicked)
+
+ def languageChange(self):
+ self.setCaption(self.__tr("Choose Device"))
+ self.OKButton.setText(self.__tr("OK"))
+ self.CancelButton.setText(self.__tr("Cancel"))
+ self.DevicesButtonGroup.setTitle(self.__tr("Available Devices:"))
+
+
+ def __tr(self,s,c = None):
+ return qApp.translate("ChooseDeviceDlg",s,c)
+
+ def DevicesButtonGroup_clicked(self,a0):
+ self.device_uri = unicode(self.radio_buttons[a0].text())
+
+if __name__ == "__main__":
+ a = QApplication(sys.argv)
+ QObject.connect(a,SIGNAL("lastWindowClosed()"),a,SLOT("quit()"))
+ w = ChooseDeviceDlg()
+ a.setMainWidget(w)
+ w.show()
+ a.exec_loop()
diff --git a/ui/chooseprinterdlg.py b/ui/chooseprinterdlg.py
new file mode 100644
index 0000000..4ae0e41
--- /dev/null
+++ b/ui/chooseprinterdlg.py
@@ -0,0 +1,193 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2001-2007 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+from base.g import *
+from base import device
+import sys
+from qt import *
+
+class ChoosePrinterDlg(QDialog):
+ def __init__(self, printers, back_end_filter=['hp'], parent = None,name = None,modal = 0,fl = 0, show_uris=True):
+ QDialog.__init__(self,parent,name,modal,fl)
+
+ if not name:
+ self.setName("ChooseDeviceDlg")
+
+ self.device_uri = ''
+ self.printer_name = ''
+ self.back_end_filter = back_end_filter
+
+ ChooseDeviceDlg_Layout = QGridLayout(self,1,1,6,6,"ChooseDeviceDlg_Layout")
+
+ self.OKButton = QPushButton(self,"OKButton")
+
+ ChooseDeviceDlg_Layout.addWidget(self.OKButton,2,2)
+
+ self.CancelButton = QPushButton(self,"CancelButton")
+
+ ChooseDeviceDlg_Layout.addWidget(self.CancelButton,2,1)
+ spacer1 = QSpacerItem(391,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ ChooseDeviceDlg_Layout.addItem(spacer1,2,0)
+ spacer2 = QSpacerItem(20,290,QSizePolicy.Minimum,QSizePolicy.Expanding)
+ ChooseDeviceDlg_Layout.addItem(spacer2,1,0)
+
+ self.DevicesButtonGroup = QButtonGroup(self,"DevicesButtonGroup")
+ self.DevicesButtonGroup.setColumnLayout(0,Qt.Vertical)
+ self.DevicesButtonGroup.layout().setSpacing(6)
+ self.DevicesButtonGroup.layout().setMargin(6)
+ DevicesButtonGroupLayout = QGridLayout(self.DevicesButtonGroup.layout())
+ DevicesButtonGroupLayout.setAlignment(Qt.AlignTop)
+
+ self.radio_buttons = {}
+
+ self.printer_index, x = {}, 0
+ for p in printers:
+ try:
+ back_end, is_hp, bus, model, serial, dev_file, host, zc, port = \
+ device.parseDeviceURI(p.device_uri)
+
+ except Error:
+ continue
+
+ if back_end in back_end_filter:
+ self.printer_index[x] = (p.name, p.device_uri)
+ x += 1
+
+
+ for y in range(len(self.printer_index)):
+ if y == 0:
+ self.device_uri = self.printer_index[y][1]
+ self.printer_name = self.printer_index[y][0]
+
+ self.radio_buttons[y] = QRadioButton(self.DevicesButtonGroup,"radioButton%d" % y)
+
+ if show_uris:
+ self.radio_buttons[y].setText("%s (%s)" % self.printer_index[y])
+ else:
+ self.radio_buttons[y].setText(self.printer_index[y])
+
+ DevicesButtonGroupLayout.addWidget(self.radio_buttons[y], y, 0)
+
+ self.radio_buttons[0].setChecked(1)
+
+ ChooseDeviceDlg_Layout.addMultiCellWidget(self.DevicesButtonGroup,0,0,0,2)
+
+ self.languageChange()
+
+ self.resize(QSize(592,112).expandedTo(self.minimumSizeHint()))
+ self.clearWState(Qt.WState_Polished)
+
+ self.connect(self.OKButton,SIGNAL("clicked()"),self,SLOT("accept()"))
+ self.connect(self.CancelButton,SIGNAL("clicked()"),self,SLOT("reject()"))
+ self.connect(self.DevicesButtonGroup,SIGNAL("clicked(int)"),self.DevicesButtonGroup_clicked)
+
+ def languageChange(self):
+ self.setCaption(self.__tr("Choose Device"))
+ self.OKButton.setText(self.__tr("OK"))
+ self.CancelButton.setText(self.__tr("Cancel"))
+
+ if 'hp' in self.back_end_filter and 'hpfax' in self.back_end_filter:
+ self.DevicesButtonGroup.setTitle(self.__tr("Available Devices:"))
+ elif 'hp' in self.back_end_filter:
+ self.DevicesButtonGroup.setTitle(self.__tr("Available Printers:"))
+ elif 'hpfax' in self.back_end_filter:
+ self.DevicesButtonGroup.setTitle(self.__tr("Available Faxes:"))
+ else:
+ self.DevicesButtonGroup.setTitle(self.__tr("Available Devices:"))
+
+ def __tr(self,s,c = None):
+ return qApp.translate("ChooseDeviceDlg",s,c)
+
+ def DevicesButtonGroup_clicked(self,a0):
+ for p in self.printer_index:
+ pp = self.printer_index[p]
+ if unicode(self.radio_buttons[a0].text()).startswith(pp[0]):
+ self.device_uri = pp[1]
+ self.printer_name = pp[0]
+ break
+
+
+
+class ChoosePrinterDlg2(QDialog):
+ def __init__(self, printers, parent = None,name = None,modal = 0,fl = 0):
+ QDialog.__init__(self,parent,name,modal,fl)
+
+ self.printers = printers
+
+ if not name:
+ self.setName("ChooseDeviceDlg2")
+
+ ChooseDeviceDlg_Layout = QGridLayout(self,1,1,6,6,"ChooseDeviceDlg_Layout")
+
+ self.OKButton = QPushButton(self,"OKButton")
+
+ ChooseDeviceDlg_Layout.addWidget(self.OKButton,2,2)
+
+ self.CancelButton = QPushButton(self,"CancelButton")
+
+ ChooseDeviceDlg_Layout.addWidget(self.CancelButton,2,1)
+ spacer1 = QSpacerItem(391,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ ChooseDeviceDlg_Layout.addItem(spacer1,2,0)
+ spacer2 = QSpacerItem(20,290,QSizePolicy.Minimum,QSizePolicy.Expanding)
+ ChooseDeviceDlg_Layout.addItem(spacer2,1,0)
+
+ self.DevicesButtonGroup = QButtonGroup(self,"DevicesButtonGroup")
+ self.DevicesButtonGroup.setColumnLayout(0,Qt.Vertical)
+ self.DevicesButtonGroup.layout().setSpacing(6)
+ self.DevicesButtonGroup.layout().setMargin(6)
+ DevicesButtonGroupLayout = QGridLayout(self.DevicesButtonGroup.layout())
+ DevicesButtonGroupLayout.setAlignment(Qt.AlignTop)
+
+ self.radio_buttons = {}
+
+ for y in range(len(self.printers)):
+ if y == 0:
+ self.printer_name = self.printers[0]
+
+ self.radio_buttons[y] = QRadioButton(self.DevicesButtonGroup,"radioButton%d" % y)
+ self.radio_buttons[y].setText(self.printers[y])
+ DevicesButtonGroupLayout.addWidget(self.radio_buttons[y], y, 0)
+
+ self.radio_buttons[0].setChecked(1)
+
+ ChooseDeviceDlg_Layout.addMultiCellWidget(self.DevicesButtonGroup,0,0,0,2)
+
+ self.languageChange()
+
+ self.resize(QSize(592,112).expandedTo(self.minimumSizeHint()))
+ self.clearWState(Qt.WState_Polished)
+
+ self.connect(self.OKButton,SIGNAL("clicked()"),self,SLOT("accept()"))
+ self.connect(self.CancelButton,SIGNAL("clicked()"),self,SLOT("reject()"))
+ self.connect(self.DevicesButtonGroup,SIGNAL("clicked(int)"),self.DevicesButtonGroup_clicked)
+
+ def languageChange(self):
+ self.setCaption(self.__tr("Choose Printer"))
+ self.OKButton.setText(self.__tr("OK"))
+ self.CancelButton.setText(self.__tr("Cancel"))
+
+ self.DevicesButtonGroup.setTitle(self.__tr("Printers:"))
+
+ def __tr(self,s,c = None):
+ return qApp.translate("ChooseDeviceDlg2",s,c)
+
+ def DevicesButtonGroup_clicked(self,a0):
+ self.printer_name = self.printers[a0]
diff --git a/ui/cleaningform.py b/ui/cleaningform.py
new file mode 100644
index 0000000..9df484e
--- /dev/null
+++ b/ui/cleaningform.py
@@ -0,0 +1,58 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2001-2008 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+# Std Lib
+
+# Local
+from base.g import *
+from ui_utils import load_pixmap
+
+# Qt
+from qt import *
+from cleaningform_base import CleaningForm_base
+
+
+class CleaningForm(CleaningForm_base):
+ def __init__(self, parent, dev, cleaning_level, name=None, modal=0, fl=0):
+ CleaningForm_base.__init__(self, parent, name, modal, fl)
+ self.dev = dev
+
+ text = unicode(self.CleaningText.text())
+ self.CleaningText.setText(text % str(cleaning_level + 1))
+
+ text = unicode(self.Continue.text())
+ self.Continue.setText(text % str(cleaning_level + 1))
+
+ text = unicode(self.CleaningTitle.text())
+ self.CleaningTitle.setText(text % str(cleaning_level))
+
+ self.Icon.setPixmap(load_pixmap('clean.png', 'other'))
+
+ self.check_timer = QTimer(self, "CheckTimer")
+ self.connect(self.check_timer, SIGNAL('timeout()'), self.CheckTimerTimeout)
+
+ self.check_timer.start(3000)
+
+ def CheckTimerTimeout(self):
+ if self.dev.isIdleAndNoError():
+ self.Continue.setEnabled(True)
+ self.check_timer.stop()
+
diff --git a/ui/cleaningform2.py b/ui/cleaningform2.py
new file mode 100644
index 0000000..a82c059
--- /dev/null
+++ b/ui/cleaningform2.py
@@ -0,0 +1,37 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2001-2008 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+# Std Lib
+
+# Local
+from base.g import *
+from ui_utils import load_pixmap
+
+# Qt
+from qt import *
+from cleaningform2_base import CleaningForm2_base
+
+
+class CleaningForm2(CleaningForm2_base):
+ def __init__(self,parent = None,name = None,modal = 0,fl = 0):
+ CleaningForm2_base.__init__(self,parent,name,modal,fl)
+
+ self.Icon.setPixmap(load_pixmap('clean', 'other'))
diff --git a/ui/cleaningform2_base.py b/ui/cleaningform2_base.py
new file mode 100644
index 0000000..4b92c78
--- /dev/null
+++ b/ui/cleaningform2_base.py
@@ -0,0 +1,74 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file '/home/dwelch/linux-imaging-and-printing/src/ui/cleaningform2_base.ui'
+#
+# Created: Fri Apr 1 14:51:32 2005
+# by: The PyQt User Interface Compiler (pyuic) 3.14.1
+#
+# WARNING! All changes made in this file will be lost!
+
+
+import sys
+from qt import *
+
+
+class CleaningForm2_base(QDialog):
+ def __init__(self,parent = None,name = None,modal = 0,fl = 0):
+ QDialog.__init__(self,parent,name,modal,fl)
+
+ if not name:
+ self.setName("CleaningForm2_base")
+
+ self.setSizeGripEnabled(1)
+
+ CleaningForm2_baseLayout = QGridLayout(self,1,1,6,6,"CleaningForm2_baseLayout")
+
+ self.Icon = QLabel(self,"Icon")
+ self.Icon.setSizePolicy(QSizePolicy(QSizePolicy.Fixed,QSizePolicy.Fixed,0,0,self.Icon.sizePolicy().hasHeightForWidth()))
+ self.Icon.setMinimumSize(QSize(71,65))
+ self.Icon.setMaximumSize(QSize(71,65))
+ self.Icon.setScaledContents(1)
+
+ CleaningForm2_baseLayout.addWidget(self.Icon,1,0)
+
+ self.Finish = QPushButton(self,"Finish")
+
+ CleaningForm2_baseLayout.addWidget(self.Finish,3,3)
+ spacer2 = QSpacerItem(211,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ CleaningForm2_baseLayout.addMultiCell(spacer2,3,3,0,1)
+
+ self.CleaningText = QLabel(self,"CleaningText")
+
+ CleaningForm2_baseLayout.addMultiCellWidget(self.CleaningText,1,1,1,3)
+ spacer5 = QSpacerItem(20,20,QSizePolicy.Minimum,QSizePolicy.Expanding)
+ CleaningForm2_baseLayout.addItem(spacer5,2,2)
+
+ self.CleaningTitle = QLabel(self,"CleaningTitle")
+
+ CleaningForm2_baseLayout.addMultiCellWidget(self.CleaningTitle,0,0,1,3)
+
+ self.languageChange()
+
+ self.resize(QSize(562,186).expandedTo(self.minimumSizeHint()))
+ self.clearWState(Qt.WState_Polished)
+
+ self.connect(self.Finish,SIGNAL("clicked()"),self.accept)
+
+
+ def languageChange(self):
+ self.setCaption(self.__tr("HP Device Manager - Cleaning"))
+ self.Finish.setText(self.__tr("Finish"))
+ self.CleaningText.setText(self.__tr("Please wait while the test page is printed. Check this page to see if the problem was fixed. If the test page looks fine click <b>Finish </b>to quit the cleaning procedure. Otherwise, replace the print cartridges and click <b>Finish</b>."))
+ self.CleaningTitle.setText(self.__tr("<b>Cleaning Level 3 Performed</b>"))
+
+
+ def __tr(self,s,c = None):
+ return qApp.translate("CleaningForm2_base",s,c)
+
+if __name__ == "__main__":
+ a = QApplication(sys.argv)
+ QObject.connect(a,SIGNAL("lastWindowClosed()"),a,SLOT("quit()"))
+ w = CleaningForm2_base()
+ a.setMainWidget(w)
+ w.show()
+ a.exec_loop()
diff --git a/ui/cleaningform2_base.ui b/ui/cleaningform2_base.ui
new file mode 100644
index 0000000..fe06c0a
--- /dev/null
+++ b/ui/cleaningform2_base.ui
@@ -0,0 +1,122 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>CleaningForm2_base</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>CleaningForm2_base</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>562</width>
+ <height>186</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>HP Device Manager - Cleaning</string>
+ </property>
+ <property name="sizeGripEnabled">
+ <bool>true</bool>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>Icon</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>71</width>
+ <height>65</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>71</width>
+ <height>65</height>
+ </size>
+ </property>
+ <property name="scaledContents">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="3" column="3">
+ <property name="name">
+ <cstring>Finish</cstring>
+ </property>
+ <property name="text">
+ <string>Finish</string>
+ </property>
+ </widget>
+ <spacer row="3" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>211</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLabel" row="1" column="1" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>CleaningText</cstring>
+ </property>
+ <property name="text">
+ <string>Please wait while the test page is printed. Check this page to see if the problem was fixed. If the test page looks fine click &lt;b&gt;Finish &lt;/b&gt;to quit the cleaning procedure. Otherwise, replace the print cartridges and click &lt;b&gt;Finish&lt;/b&gt;.</string>
+ </property>
+ </widget>
+ <spacer row="2" column="2">
+ <property name="name">
+ <cstring>spacer5</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLabel" row="0" column="1" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>CleaningTitle</cstring>
+ </property>
+ <property name="text">
+ <string>&lt;b&gt;Cleaning Level 3 Performed&lt;/b&gt;</string>
+ </property>
+ </widget>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>Finish</sender>
+ <signal>clicked()</signal>
+ <receiver>CleaningForm2_base</receiver>
+ <slot>accept()</slot>
+ </connection>
+</connections>
+<layoutdefaults spacing="6" margin="6"/>
+</UI>
diff --git a/ui/cleaningform_base.py b/ui/cleaningform_base.py
new file mode 100644
index 0000000..3a52cd6
--- /dev/null
+++ b/ui/cleaningform_base.py
@@ -0,0 +1,72 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'cleaningform_base.ui'
+#
+# Created: Tue Sep 5 14:21:27 2006
+# by: The PyQt User Interface Compiler (pyuic) 3.15.1
+#
+# WARNING! All changes made in this file will be lost!
+
+
+from qt import *
+
+
+class CleaningForm_base(QDialog):
+ def __init__(self,parent = None,name = None,modal = 0,fl = 0):
+ QDialog.__init__(self,parent,name,modal,fl)
+
+ if not name:
+ self.setName("CleaningForm_base")
+
+ self.setSizeGripEnabled(1)
+
+ CleaningForm_baseLayout = QGridLayout(self,1,1,6,6,"CleaningForm_baseLayout")
+
+ self.Icon = QLabel(self,"Icon")
+ self.Icon.setSizePolicy(QSizePolicy(QSizePolicy.Fixed,QSizePolicy.Fixed,0,0,self.Icon.sizePolicy().hasHeightForWidth()))
+ self.Icon.setMinimumSize(QSize(71,65))
+ self.Icon.setMaximumSize(QSize(71,65))
+ self.Icon.setScaledContents(1)
+
+ CleaningForm_baseLayout.addWidget(self.Icon,1,0)
+
+ self.Finish = QPushButton(self,"Finish")
+
+ CleaningForm_baseLayout.addWidget(self.Finish,3,3)
+ spacer2 = QSpacerItem(211,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ CleaningForm_baseLayout.addMultiCell(spacer2,3,3,0,1)
+
+ self.Continue = QPushButton(self,"Continue")
+ self.Continue.setEnabled(0)
+
+ CleaningForm_baseLayout.addWidget(self.Continue,3,2)
+
+ self.CleaningText = QLabel(self,"CleaningText")
+
+ CleaningForm_baseLayout.addMultiCellWidget(self.CleaningText,1,1,1,3)
+ spacer5 = QSpacerItem(20,20,QSizePolicy.Minimum,QSizePolicy.Expanding)
+ CleaningForm_baseLayout.addItem(spacer5,2,2)
+
+ self.CleaningTitle = QLabel(self,"CleaningTitle")
+
+ CleaningForm_baseLayout.addMultiCellWidget(self.CleaningTitle,0,0,1,3)
+
+ self.languageChange()
+
+ self.resize(QSize(562,186).expandedTo(self.minimumSizeHint()))
+ self.clearWState(Qt.WState_Polished)
+
+ self.connect(self.Finish,SIGNAL("clicked()"),self.reject)
+ self.connect(self.Continue,SIGNAL("clicked()"),self.accept)
+
+
+ def languageChange(self):
+ self.setCaption(self.__tr("HP Device Manager - Please Wait - Cleaning"))
+ self.Finish.setText(self.__tr("Finish"))
+ self.Continue.setText(self.__tr("Cleaning Level %s"))
+ self.CleaningText.setText(self.__tr("Please wait while the test page is printed. Check this page to see if the problem was fixed. If the test page looks fine click <b>Finish </b>to quit the cleaning procedure. Otherwise, click <b>Cleaning Level %s</b> to continue with cleaning."))
+ self.CleaningTitle.setText(self.__tr("<b>Please Wait - Cleaning Level %s Being Performed</b>"))
+
+
+ def __tr(self,s,c = None):
+ return qApp.translate("CleaningForm_base",s,c)
diff --git a/ui/cleaningform_base.ui b/ui/cleaningform_base.ui
new file mode 100644
index 0000000..5d96e0a
--- /dev/null
+++ b/ui/cleaningform_base.ui
@@ -0,0 +1,139 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>CleaningForm_base</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>CleaningForm_base</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>562</width>
+ <height>186</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>HP Device Manager - Please Wait - Cleaning</string>
+ </property>
+ <property name="sizeGripEnabled">
+ <bool>true</bool>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>Icon</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>71</width>
+ <height>65</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>71</width>
+ <height>65</height>
+ </size>
+ </property>
+ <property name="scaledContents">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="3" column="3">
+ <property name="name">
+ <cstring>Finish</cstring>
+ </property>
+ <property name="text">
+ <string>Finish</string>
+ </property>
+ </widget>
+ <spacer row="3" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>211</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton" row="3" column="2">
+ <property name="name">
+ <cstring>Continue</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Cleaning Level %s</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="1" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>CleaningText</cstring>
+ </property>
+ <property name="text">
+ <string>Please wait while the test page is printed. Check this page to see if the problem was fixed. If the test page looks fine click &lt;b&gt;Finish &lt;/b&gt;to quit the cleaning procedure. Otherwise, click &lt;b&gt;Cleaning Level %s&lt;/b&gt; to continue with cleaning.</string>
+ </property>
+ </widget>
+ <spacer row="2" column="2">
+ <property name="name">
+ <cstring>spacer5</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLabel" row="0" column="1" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>CleaningTitle</cstring>
+ </property>
+ <property name="text">
+ <string>&lt;b&gt;Please Wait - Cleaning Level %s Being Performed&lt;/b&gt;</string>
+ </property>
+ </widget>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>Finish</sender>
+ <signal>clicked()</signal>
+ <receiver>CleaningForm_base</receiver>
+ <slot>reject()</slot>
+ </connection>
+ <connection>
+ <sender>Continue</sender>
+ <signal>clicked()</signal>
+ <receiver>CleaningForm_base</receiver>
+ <slot>accept()</slot>
+ </connection>
+</connections>
+<layoutdefaults spacing="6" margin="6"/>
+</UI>
diff --git a/ui/coloradjform.py b/ui/coloradjform.py
new file mode 100644
index 0000000..93f7826
--- /dev/null
+++ b/ui/coloradjform.py
@@ -0,0 +1,41 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2001-2007 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+# Std Lib
+
+# Local
+from base.g import *
+from ui_utils import load_pixmap
+
+# Qt
+from qt import *
+from coloradjform_base import ColorAdjForm_base
+
+class ColorAdjForm(ColorAdjForm_base):
+ def __init__(self, parent, line, name = None, modal = 0, fl = 0):
+ ColorAdjForm_base.__init__(self,parent,name,modal,fl)
+ self.Icon.setPixmap(load_pixmap('color_adj'))
+ self.LineLabel.setText("""<b><font size="+1">%s</font></b>""" % line)
+ self.value = 11
+
+ def buttonGroup_clicked(self,a0):
+ self.value = a0
+
diff --git a/ui/coloradjform_base.py b/ui/coloradjform_base.py
new file mode 100644
index 0000000..9707d9f
--- /dev/null
+++ b/ui/coloradjform_base.py
@@ -0,0 +1,257 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file '/home/dwelch/linux-imaging-and-printing/src/ui/coloradjform_base.ui'
+#
+# Created: Wed Jul 13 09:36:13 2005
+# by: The PyQt User Interface Compiler (pyuic) 3.14.1
+#
+# WARNING! All changes made in this file will be lost!
+
+
+import sys
+from qt import *
+
+
+class ColorAdjForm_base(QDialog):
+ def __init__(self,parent = None,name = None,modal = 0,fl = 0):
+ QDialog.__init__(self,parent,name,modal,fl)
+
+ if not name:
+ self.setName("ColorAdjForm_base")
+
+
+ ColorAdjForm_baseLayout = QGridLayout(self,1,1,11,6,"ColorAdjForm_baseLayout")
+
+ self.CancelButton = QPushButton(self,"CancelButton")
+
+ ColorAdjForm_baseLayout.addWidget(self.CancelButton,1,2)
+
+ self.ContinueButton = QPushButton(self,"ContinueButton")
+
+ ColorAdjForm_baseLayout.addWidget(self.ContinueButton,1,3)
+ spacer1 = QSpacerItem(270,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ ColorAdjForm_baseLayout.addItem(spacer1,1,1)
+
+ self.buttonGroup = QButtonGroup(self,"buttonGroup")
+ self.buttonGroup.setColumnLayout(0,Qt.Vertical)
+ self.buttonGroup.layout().setSpacing(6)
+ self.buttonGroup.layout().setMargin(11)
+ buttonGroupLayout = QGridLayout(self.buttonGroup.layout())
+ buttonGroupLayout.setAlignment(Qt.AlignTop)
+
+ self.Icon = QLabel(self.buttonGroup,"Icon")
+ self.Icon.setSizePolicy(QSizePolicy(QSizePolicy.Fixed,QSizePolicy.Fixed,0,0,self.Icon.sizePolicy().hasHeightForWidth()))
+ self.Icon.setScaledContents(1)
+
+ buttonGroupLayout.addWidget(self.Icon,0,0)
+
+ self.textLabel2_2 = QLabel(self.buttonGroup,"textLabel2_2")
+ self.textLabel2_2.setAlignment(QLabel.WordBreak | QLabel.AlignVCenter)
+
+ buttonGroupLayout.addMultiCellWidget(self.textLabel2_2,0,0,1,2)
+
+ layout2 = QHBoxLayout(None,0,6,"layout2")
+
+ self.radioButton1 = QRadioButton(self.buttonGroup,"radioButton1")
+ radioButton1_font = QFont(self.radioButton1.font())
+ radioButton1_font.setPointSize(8)
+ self.radioButton1.setFont(radioButton1_font)
+ layout2.addWidget(self.radioButton1)
+
+ self.radioButton2 = QRadioButton(self.buttonGroup,"radioButton2")
+ radioButton2_font = QFont(self.radioButton2.font())
+ radioButton2_font.setPointSize(8)
+ self.radioButton2.setFont(radioButton2_font)
+ layout2.addWidget(self.radioButton2)
+
+ self.radioButton3 = QRadioButton(self.buttonGroup,"radioButton3")
+ radioButton3_font = QFont(self.radioButton3.font())
+ radioButton3_font.setPointSize(8)
+ self.radioButton3.setFont(radioButton3_font)
+ layout2.addWidget(self.radioButton3)
+
+ self.radioButton4 = QRadioButton(self.buttonGroup,"radioButton4")
+ radioButton4_font = QFont(self.radioButton4.font())
+ radioButton4_font.setPointSize(8)
+ self.radioButton4.setFont(radioButton4_font)
+ layout2.addWidget(self.radioButton4)
+
+ self.radioButton5 = QRadioButton(self.buttonGroup,"radioButton5")
+ radioButton5_font = QFont(self.radioButton5.font())
+ radioButton5_font.setPointSize(8)
+ self.radioButton5.setFont(radioButton5_font)
+ layout2.addWidget(self.radioButton5)
+
+ self.radioButton6 = QRadioButton(self.buttonGroup,"radioButton6")
+ radioButton6_font = QFont(self.radioButton6.font())
+ radioButton6_font.setPointSize(8)
+ self.radioButton6.setFont(radioButton6_font)
+ layout2.addWidget(self.radioButton6)
+
+ self.radioButton7 = QRadioButton(self.buttonGroup,"radioButton7")
+ radioButton7_font = QFont(self.radioButton7.font())
+ radioButton7_font.setPointSize(8)
+ self.radioButton7.setFont(radioButton7_font)
+ layout2.addWidget(self.radioButton7)
+
+ self.radioButton8 = QRadioButton(self.buttonGroup,"radioButton8")
+ radioButton8_font = QFont(self.radioButton8.font())
+ radioButton8_font.setPointSize(8)
+ self.radioButton8.setFont(radioButton8_font)
+ layout2.addWidget(self.radioButton8)
+
+ self.radioButton9 = QRadioButton(self.buttonGroup,"radioButton9")
+ radioButton9_font = QFont(self.radioButton9.font())
+ radioButton9_font.setPointSize(8)
+ self.radioButton9.setFont(radioButton9_font)
+ layout2.addWidget(self.radioButton9)
+
+ self.radioButton10 = QRadioButton(self.buttonGroup,"radioButton10")
+ radioButton10_font = QFont(self.radioButton10.font())
+ radioButton10_font.setPointSize(8)
+ self.radioButton10.setFont(radioButton10_font)
+ layout2.addWidget(self.radioButton10)
+
+ self.radioButton11 = QRadioButton(self.buttonGroup,"radioButton11")
+ radioButton11_font = QFont(self.radioButton11.font())
+ radioButton11_font.setPointSize(8)
+ self.radioButton11.setFont(radioButton11_font)
+ self.radioButton11.setChecked(1)
+ layout2.addWidget(self.radioButton11)
+
+ self.radioButton12 = QRadioButton(self.buttonGroup,"radioButton12")
+ radioButton12_font = QFont(self.radioButton12.font())
+ radioButton12_font.setPointSize(8)
+ self.radioButton12.setFont(radioButton12_font)
+ layout2.addWidget(self.radioButton12)
+
+ self.radioButton13 = QRadioButton(self.buttonGroup,"radioButton13")
+ radioButton13_font = QFont(self.radioButton13.font())
+ radioButton13_font.setPointSize(8)
+ self.radioButton13.setFont(radioButton13_font)
+ layout2.addWidget(self.radioButton13)
+
+ self.radioButton14 = QRadioButton(self.buttonGroup,"radioButton14")
+ radioButton14_font = QFont(self.radioButton14.font())
+ radioButton14_font.setPointSize(8)
+ self.radioButton14.setFont(radioButton14_font)
+ layout2.addWidget(self.radioButton14)
+
+ self.radioButton15 = QRadioButton(self.buttonGroup,"radioButton15")
+ radioButton15_font = QFont(self.radioButton15.font())
+ radioButton15_font.setPointSize(8)
+ self.radioButton15.setFont(radioButton15_font)
+ layout2.addWidget(self.radioButton15)
+
+ self.radioButton16 = QRadioButton(self.buttonGroup,"radioButton16")
+ radioButton16_font = QFont(self.radioButton16.font())
+ radioButton16_font.setPointSize(8)
+ self.radioButton16.setFont(radioButton16_font)
+ layout2.addWidget(self.radioButton16)
+
+ self.radioButton17 = QRadioButton(self.buttonGroup,"radioButton17")
+ radioButton17_font = QFont(self.radioButton17.font())
+ radioButton17_font.setPointSize(8)
+ self.radioButton17.setFont(radioButton17_font)
+ layout2.addWidget(self.radioButton17)
+
+ self.radioButton18 = QRadioButton(self.buttonGroup,"radioButton18")
+ radioButton18_font = QFont(self.radioButton18.font())
+ radioButton18_font.setPointSize(8)
+ self.radioButton18.setFont(radioButton18_font)
+ layout2.addWidget(self.radioButton18)
+
+ self.radioButton19 = QRadioButton(self.buttonGroup,"radioButton19")
+ radioButton19_font = QFont(self.radioButton19.font())
+ radioButton19_font.setPointSize(8)
+ self.radioButton19.setFont(radioButton19_font)
+ layout2.addWidget(self.radioButton19)
+
+ self.radioButton20 = QRadioButton(self.buttonGroup,"radioButton20")
+ radioButton20_font = QFont(self.radioButton20.font())
+ radioButton20_font.setPointSize(8)
+ self.radioButton20.setFont(radioButton20_font)
+ layout2.addWidget(self.radioButton20)
+
+ self.radioButton21 = QRadioButton(self.buttonGroup,"radioButton21")
+ radioButton21_font = QFont(self.radioButton21.font())
+ radioButton21_font.setPointSize(8)
+ self.radioButton21.setFont(radioButton21_font)
+ layout2.addWidget(self.radioButton21)
+
+ buttonGroupLayout.addMultiCellLayout(layout2,1,1,1,2)
+ spacer2 = QSpacerItem(750,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ buttonGroupLayout.addItem(spacer2,2,2)
+
+ layout3 = QHBoxLayout(None,0,6,"layout3")
+
+ self.LineLabel_2 = QLabel(self.buttonGroup,"LineLabel_2")
+ LineLabel_2_font = QFont(self.LineLabel_2.font())
+ LineLabel_2_font.setFamily("Times New Roman")
+ self.LineLabel_2.setFont(LineLabel_2_font)
+ layout3.addWidget(self.LineLabel_2)
+
+ self.LineLabel = QLabel(self.buttonGroup,"LineLabel")
+ LineLabel_font = QFont(self.LineLabel.font())
+ LineLabel_font.setFamily("Times New Roman")
+ self.LineLabel.setFont(LineLabel_font)
+ layout3.addWidget(self.LineLabel)
+
+ buttonGroupLayout.addMultiCellLayout(layout3,2,2,0,1)
+
+ ColorAdjForm_baseLayout.addMultiCellWidget(self.buttonGroup,0,0,0,3)
+
+ self.languageChange()
+
+ self.resize(QSize(1013,164).expandedTo(self.minimumSizeHint()))
+ self.clearWState(Qt.WState_Polished)
+
+ self.connect(self.CancelButton,SIGNAL("clicked()"),self.reject)
+ self.connect(self.ContinueButton,SIGNAL("clicked()"),self.accept)
+ self.connect(self.buttonGroup,SIGNAL("clicked(int)"),self.buttonGroup_clicked)
+
+
+ def languageChange(self):
+ self.setCaption(self.__tr("HP Device Manager - Color Adjustment"))
+ self.CancelButton.setText(self.__tr("Cancel"))
+ self.ContinueButton.setText(self.__tr("Next >"))
+ self.buttonGroup.setTitle(QString.null)
+ self.textLabel2_2.setText(self.__tr("Choose the numbered colored box that the color <b>best </b>matches the background color of the bar."))
+ self.radioButton1.setText(self.__tr("1"))
+ self.radioButton2.setText(self.__tr("2"))
+ self.radioButton3.setText(self.__tr("3"))
+ self.radioButton4.setText(self.__tr("4"))
+ self.radioButton5.setText(self.__tr("5"))
+ self.radioButton6.setText(self.__tr("6"))
+ self.radioButton7.setText(self.__tr("7"))
+ self.radioButton8.setText(self.__tr("8"))
+ self.radioButton9.setText(self.__tr("9"))
+ self.radioButton10.setText(self.__tr("10"))
+ self.radioButton11.setText(self.__tr("11"))
+ self.radioButton12.setText(self.__tr("12"))
+ self.radioButton13.setText(self.__tr("13"))
+ self.radioButton14.setText(self.__tr("14"))
+ self.radioButton15.setText(self.__tr("15"))
+ self.radioButton16.setText(self.__tr("16"))
+ self.radioButton17.setText(self.__tr("17"))
+ self.radioButton18.setText(self.__tr("18"))
+ self.radioButton19.setText(self.__tr("19"))
+ self.radioButton20.setText(self.__tr("20"))
+ self.radioButton21.setText(self.__tr("21"))
+ self.LineLabel_2.setText(self.__tr("<b><font size=\"+1\">Line</font></b>"))
+ self.LineLabel.setText(self.__tr("<b><font size=\"+1\">X</font></b>"))
+
+
+ def buttonGroup_clicked(self,a0):
+ print "ColorAdjForm_base.buttonGroup_clicked(int): Not implemented yet"
+
+ def __tr(self,s,c = None):
+ return qApp.translate("ColorAdjForm_base",s,c)
+
+if __name__ == "__main__":
+ a = QApplication(sys.argv)
+ QObject.connect(a,SIGNAL("lastWindowClosed()"),a,SLOT("quit()"))
+ w = ColorAdjForm_base()
+ a.setMainWidget(w)
+ w.show()
+ a.exec_loop()
diff --git a/ui/coloradjform_base.ui b/ui/coloradjform_base.ui
new file mode 100644
index 0000000..27ab15b
--- /dev/null
+++ b/ui/coloradjform_base.ui
@@ -0,0 +1,460 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>ColorAdjForm_base</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>ColorAdjForm_base</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>1013</width>
+ <height>164</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>HP Device Manager - Color Adjustment</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QPushButton" row="1" column="2">
+ <property name="name">
+ <cstring>CancelButton</cstring>
+ </property>
+ <property name="text">
+ <string>Cancel</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="1" column="3">
+ <property name="name">
+ <cstring>ContinueButton</cstring>
+ </property>
+ <property name="text">
+ <string>Next &gt;</string>
+ </property>
+ </widget>
+ <spacer row="1" column="1">
+ <property name="name">
+ <cstring>spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>270</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QButtonGroup" row="0" column="0" rowspan="1" colspan="4">
+ <property name="name">
+ <cstring>buttonGroup</cstring>
+ </property>
+ <property name="title">
+ <string></string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>Icon</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="scaledContents">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="1" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>textLabel2_2</cstring>
+ </property>
+ <property name="text">
+ <string>Choose the numbered colored box that the color &lt;b&gt;best &lt;/b&gt;matches the background color of the bar.</string>
+ </property>
+ <property name="alignment">
+ <set>WordBreak|AlignVCenter</set>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="1" column="1" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>layout2</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>radioButton1</cstring>
+ </property>
+ <property name="font">
+ <font>
+ <pointsize>8</pointsize>
+ </font>
+ </property>
+ <property name="text">
+ <string>1</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>radioButton2</cstring>
+ </property>
+ <property name="font">
+ <font>
+ <pointsize>8</pointsize>
+ </font>
+ </property>
+ <property name="text">
+ <string>2</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>radioButton3</cstring>
+ </property>
+ <property name="font">
+ <font>
+ <pointsize>8</pointsize>
+ </font>
+ </property>
+ <property name="text">
+ <string>3</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>radioButton4</cstring>
+ </property>
+ <property name="font">
+ <font>
+ <pointsize>8</pointsize>
+ </font>
+ </property>
+ <property name="text">
+ <string>4</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>radioButton5</cstring>
+ </property>
+ <property name="font">
+ <font>
+ <pointsize>8</pointsize>
+ </font>
+ </property>
+ <property name="text">
+ <string>5</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>radioButton6</cstring>
+ </property>
+ <property name="font">
+ <font>
+ <pointsize>8</pointsize>
+ </font>
+ </property>
+ <property name="text">
+ <string>6</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>radioButton7</cstring>
+ </property>
+ <property name="font">
+ <font>
+ <pointsize>8</pointsize>
+ </font>
+ </property>
+ <property name="text">
+ <string>7</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>radioButton8</cstring>
+ </property>
+ <property name="font">
+ <font>
+ <pointsize>8</pointsize>
+ </font>
+ </property>
+ <property name="text">
+ <string>8</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>radioButton9</cstring>
+ </property>
+ <property name="font">
+ <font>
+ <pointsize>8</pointsize>
+ </font>
+ </property>
+ <property name="text">
+ <string>9</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>radioButton10</cstring>
+ </property>
+ <property name="font">
+ <font>
+ <pointsize>8</pointsize>
+ </font>
+ </property>
+ <property name="text">
+ <string>10</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>radioButton11</cstring>
+ </property>
+ <property name="font">
+ <font>
+ <pointsize>8</pointsize>
+ </font>
+ </property>
+ <property name="text">
+ <string>11</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>radioButton12</cstring>
+ </property>
+ <property name="font">
+ <font>
+ <pointsize>8</pointsize>
+ </font>
+ </property>
+ <property name="text">
+ <string>12</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>radioButton13</cstring>
+ </property>
+ <property name="font">
+ <font>
+ <pointsize>8</pointsize>
+ </font>
+ </property>
+ <property name="text">
+ <string>13</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>radioButton14</cstring>
+ </property>
+ <property name="font">
+ <font>
+ <pointsize>8</pointsize>
+ </font>
+ </property>
+ <property name="text">
+ <string>14</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>radioButton15</cstring>
+ </property>
+ <property name="font">
+ <font>
+ <pointsize>8</pointsize>
+ </font>
+ </property>
+ <property name="text">
+ <string>15</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>radioButton16</cstring>
+ </property>
+ <property name="font">
+ <font>
+ <pointsize>8</pointsize>
+ </font>
+ </property>
+ <property name="text">
+ <string>16</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>radioButton17</cstring>
+ </property>
+ <property name="font">
+ <font>
+ <pointsize>8</pointsize>
+ </font>
+ </property>
+ <property name="text">
+ <string>17</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>radioButton18</cstring>
+ </property>
+ <property name="font">
+ <font>
+ <pointsize>8</pointsize>
+ </font>
+ </property>
+ <property name="text">
+ <string>18</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>radioButton19</cstring>
+ </property>
+ <property name="font">
+ <font>
+ <pointsize>8</pointsize>
+ </font>
+ </property>
+ <property name="text">
+ <string>19</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>radioButton20</cstring>
+ </property>
+ <property name="font">
+ <font>
+ <pointsize>8</pointsize>
+ </font>
+ </property>
+ <property name="text">
+ <string>20</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>radioButton21</cstring>
+ </property>
+ <property name="font">
+ <font>
+ <pointsize>8</pointsize>
+ </font>
+ </property>
+ <property name="text">
+ <string>21</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <spacer row="2" column="2">
+ <property name="name">
+ <cstring>spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>750</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLayoutWidget" row="2" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>layout3</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>LineLabel_2</cstring>
+ </property>
+ <property name="font">
+ <font>
+ <family>Times New Roman</family>
+ </font>
+ </property>
+ <property name="text">
+ <string>&lt;b&gt;&lt;font size="+1"&gt;Line&lt;/font&gt;&lt;/b&gt;</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>LineLabel</cstring>
+ </property>
+ <property name="font">
+ <font>
+ <family>Times New Roman</family>
+ </font>
+ </property>
+ <property name="text">
+ <string>&lt;b&gt;&lt;font size="+1"&gt;X&lt;/font&gt;&lt;/b&gt;</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </grid>
+ </widget>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>CancelButton</sender>
+ <signal>clicked()</signal>
+ <receiver>ColorAdjForm_base</receiver>
+ <slot>reject()</slot>
+ </connection>
+ <connection>
+ <sender>ContinueButton</sender>
+ <signal>clicked()</signal>
+ <receiver>ColorAdjForm_base</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection>
+ <sender>buttonGroup</sender>
+ <signal>clicked(int)</signal>
+ <receiver>ColorAdjForm_base</receiver>
+ <slot>buttonGroup_clicked(int)</slot>
+ </connection>
+</connections>
+<slots>
+ <slot>buttonGroup_clicked( int )</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/ui/colorcal4form.py b/ui/colorcal4form.py
new file mode 100644
index 0000000..f74bd1b
--- /dev/null
+++ b/ui/colorcal4form.py
@@ -0,0 +1,56 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2001-2008 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+# Std Lib
+
+# Local
+from base.g import *
+from ui_utils import load_pixmap
+
+# Qt
+from qt import *
+from colorcal4form_base import ColorCal4Form_base
+
+
+class ColorCal4Form(ColorCal4Form_base):
+
+ def __init__(self, parent=None, name=None, modal=0, fl=0):
+ ColorCal4Form_base.__init__(self, parent, name, modal, fl)
+
+ self.gray_plot_png.setPixmap(load_pixmap('type4_gray_patch', 'other'))
+ self.color_plot_png.setPixmap(load_pixmap('type4_color_patch', 'other'))
+ self.values = [0, 0, 0, 0]
+
+ def GrayLetterComboBox_highlighted(self,a0):
+ self.values[0] = ord(str(a0)) - ord('A')
+
+ def GrayNumberComboBox_highlighted(self,a0):
+ self.values[1] = int(str(a0))-1
+
+ def ColorLetterComboBox_highlighted(self,a0):
+ self.values[2] = ord(str(a0)) - ord('P')
+
+ def ColorNumberComboBox_highlighted(self,a0):
+ self.values[3] = int(str(a0))-1
+
+ def UseDefaultsButton_clicked(self):
+ self.values = [-1, -1, -1, -1]
+ self.accept()
diff --git a/ui/colorcal4form_base.py b/ui/colorcal4form_base.py
new file mode 100644
index 0000000..163c4ea
--- /dev/null
+++ b/ui/colorcal4form_base.py
@@ -0,0 +1,237 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file '/home/dwelch/linux-imaging-and-printing/src/ui/colorcal4form_base.ui'
+#
+# Created: Tue May 17 16:20:37 2005
+# by: The PyQt User Interface Compiler (pyuic) 3.14.1
+#
+# WARNING! All changes made in this file will be lost!
+
+
+import sys
+from qt import *
+
+
+class ColorCal4Form_base(QDialog):
+ def __init__(self,parent = None,name = None,modal = 0,fl = 0):
+ QDialog.__init__(self,parent,name,modal,fl)
+
+ if not name:
+ self.setName("ColorCal4Form_base")
+
+
+ ColorCal4Form_baseLayout = QGridLayout(self,1,1,6,6,"ColorCal4Form_baseLayout")
+
+ self.pushButton1 = QPushButton(self,"pushButton1")
+
+ ColorCal4Form_baseLayout.addWidget(self.pushButton1,4,4)
+
+ self.textLabel1 = QLabel(self,"textLabel1")
+ self.textLabel1.setTextFormat(QLabel.RichText)
+ self.textLabel1.setAlignment(QLabel.WordBreak | QLabel.AlignVCenter)
+
+ ColorCal4Form_baseLayout.addMultiCellWidget(self.textLabel1,0,1,0,2)
+ spacer16 = QSpacerItem(20,101,QSizePolicy.Minimum,QSizePolicy.Expanding)
+ ColorCal4Form_baseLayout.addMultiCell(spacer16,2,3,0,0)
+ spacer17 = QSpacerItem(20,101,QSizePolicy.Minimum,QSizePolicy.Expanding)
+ ColorCal4Form_baseLayout.addItem(spacer17,3,4)
+
+ self.groupBox1 = QGroupBox(self,"groupBox1")
+ self.groupBox1.setColumnLayout(0,Qt.Vertical)
+ self.groupBox1.layout().setSpacing(6)
+ self.groupBox1.layout().setMargin(6)
+ groupBox1Layout = QGridLayout(self.groupBox1.layout())
+ groupBox1Layout.setAlignment(Qt.AlignTop)
+ spacer3 = QSpacerItem(60,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ groupBox1Layout.addItem(spacer3,1,4)
+
+ layout2 = QHBoxLayout(None,0,6,"layout2")
+
+ self.GrayLetterComboBox = QComboBox(0,self.groupBox1,"GrayLetterComboBox")
+ GrayLetterComboBox_font = QFont(self.GrayLetterComboBox.font())
+ GrayLetterComboBox_font.setFamily("Courier [Adobe]")
+ GrayLetterComboBox_font.setBold(1)
+ self.GrayLetterComboBox.setFont(GrayLetterComboBox_font)
+ layout2.addWidget(self.GrayLetterComboBox)
+
+ self.GrayNumberComboBox = QComboBox(0,self.groupBox1,"GrayNumberComboBox")
+ GrayNumberComboBox_font = QFont(self.GrayNumberComboBox.font())
+ GrayNumberComboBox_font.setFamily("Courier [Adobe]")
+ GrayNumberComboBox_font.setBold(1)
+ self.GrayNumberComboBox.setFont(GrayNumberComboBox_font)
+ layout2.addWidget(self.GrayNumberComboBox)
+
+ groupBox1Layout.addMultiCellLayout(layout2,1,1,1,3)
+ spacer4 = QSpacerItem(60,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ groupBox1Layout.addItem(spacer4,1,0)
+
+ self.gray_plot_png = QLabel(self.groupBox1,"gray_plot_png")
+ self.gray_plot_png.setSizePolicy(QSizePolicy(QSizePolicy.Fixed,QSizePolicy.Fixed,0,0,self.gray_plot_png.sizePolicy().hasHeightForWidth()))
+ self.gray_plot_png.setMinimumSize(QSize(75,75))
+ self.gray_plot_png.setMaximumSize(QSize(75,75))
+ self.gray_plot_png.setScaledContents(1)
+
+ groupBox1Layout.addWidget(self.gray_plot_png,0,2)
+ spacer1 = QSpacerItem(50,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ groupBox1Layout.addMultiCell(spacer1,0,0,3,4)
+ spacer2 = QSpacerItem(40,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ groupBox1Layout.addMultiCell(spacer2,0,0,0,1)
+
+ ColorCal4Form_baseLayout.addMultiCellWidget(self.groupBox1,0,0,3,4)
+
+ self.groupBox2 = QGroupBox(self,"groupBox2")
+ self.groupBox2.setColumnLayout(0,Qt.Vertical)
+ self.groupBox2.layout().setSpacing(6)
+ self.groupBox2.layout().setMargin(6)
+ groupBox2Layout = QGridLayout(self.groupBox2.layout())
+ groupBox2Layout.setAlignment(Qt.AlignTop)
+
+ self.color_plot_png = QLabel(self.groupBox2,"color_plot_png")
+ self.color_plot_png.setSizePolicy(QSizePolicy(QSizePolicy.Fixed,QSizePolicy.Fixed,0,0,self.color_plot_png.sizePolicy().hasHeightForWidth()))
+ self.color_plot_png.setMinimumSize(QSize(75,75))
+ self.color_plot_png.setMaximumSize(QSize(75,75))
+ self.color_plot_png.setScaledContents(1)
+
+ groupBox2Layout.addWidget(self.color_plot_png,0,2)
+ spacer12 = QSpacerItem(40,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ groupBox2Layout.addMultiCell(spacer12,0,0,0,1)
+ spacer14 = QSpacerItem(40,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ groupBox2Layout.addMultiCell(spacer14,0,0,3,4)
+ spacer15 = QSpacerItem(20,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ groupBox2Layout.addItem(spacer15,1,4)
+ spacer13 = QSpacerItem(20,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ groupBox2Layout.addItem(spacer13,1,0)
+
+ layout1 = QHBoxLayout(None,0,6,"layout1")
+
+ self.ColorLetterComboBox = QComboBox(0,self.groupBox2,"ColorLetterComboBox")
+ ColorLetterComboBox_font = QFont(self.ColorLetterComboBox.font())
+ ColorLetterComboBox_font.setFamily("Courier [Adobe]")
+ ColorLetterComboBox_font.setBold(1)
+ self.ColorLetterComboBox.setFont(ColorLetterComboBox_font)
+ layout1.addWidget(self.ColorLetterComboBox)
+
+ self.ColorNumberComboBox = QComboBox(0,self.groupBox2,"ColorNumberComboBox")
+ ColorNumberComboBox_font = QFont(self.ColorNumberComboBox.font())
+ ColorNumberComboBox_font.setFamily("Courier [Adobe]")
+ ColorNumberComboBox_font.setBold(1)
+ self.ColorNumberComboBox.setFont(ColorNumberComboBox_font)
+ layout1.addWidget(self.ColorNumberComboBox)
+
+ groupBox2Layout.addMultiCellLayout(layout1,1,1,1,3)
+
+ ColorCal4Form_baseLayout.addMultiCellWidget(self.groupBox2,1,2,3,4)
+ spacer9 = QSpacerItem(310,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ ColorCal4Form_baseLayout.addItem(spacer9,4,0)
+
+ self.pushButton2 = QPushButton(self,"pushButton2")
+
+ ColorCal4Form_baseLayout.addWidget(self.pushButton2,4,1)
+
+ self.UseDefaultsButton = QPushButton(self,"UseDefaultsButton")
+
+ ColorCal4Form_baseLayout.addMultiCellWidget(self.UseDefaultsButton,4,4,2,3)
+
+ self.languageChange()
+
+ self.resize(QSize(656,380).expandedTo(self.minimumSizeHint()))
+ self.clearWState(Qt.WState_Polished)
+
+ self.connect(self.pushButton2,SIGNAL("clicked()"),self.reject)
+ self.connect(self.pushButton1,SIGNAL("clicked()"),self.accept)
+ self.connect(self.ColorNumberComboBox,SIGNAL("highlighted(const QString&)"),self.ColorNumberComboBox_highlighted)
+ self.connect(self.ColorLetterComboBox,SIGNAL("highlighted(const QString&)"),self.ColorLetterComboBox_highlighted)
+ self.connect(self.GrayLetterComboBox,SIGNAL("highlighted(const QString&)"),self.GrayLetterComboBox_highlighted)
+ self.connect(self.GrayNumberComboBox,SIGNAL("highlighted(const QString&)"),self.GrayNumberComboBox_highlighted)
+ self.connect(self.UseDefaultsButton,SIGNAL("clicked()"),self.UseDefaultsButton_clicked)
+
+
+ def languageChange(self):
+ self.setCaption(self.__tr("HP Device Manager - Color Calibration"))
+ self.pushButton1.setText(self.__tr("Calibrate"))
+ self.textLabel1.setText(self.__tr("1. Hold the calibration page at arm's length in front of your eyes.\n"
+"<p><p>\n"
+"2. Tilt the page away from you. Look at the two large squares, each containing colored patches. For each large square, find the colored path that <b>most closely</b> matches the background color. Each patch has an associated letter and number.\n"
+"<p><p>\n"
+"3. Choose the letter and number for the matching patches for the gray and color plots.\n"
+"<p><p>\n"
+"4. Click <i>\"Calibrate\".</i> to continue.\n"
+"<p><p>\n"
+"(To reset the printer to known defaults, click <i>\"Use Factory Defaults\"</i>)"))
+ self.groupBox1.setTitle(self.__tr("Gray Plot"))
+ self.GrayLetterComboBox.clear()
+ self.GrayLetterComboBox.insertItem(self.__tr("A"))
+ self.GrayLetterComboBox.insertItem(self.__tr("B"))
+ self.GrayLetterComboBox.insertItem(self.__tr("C"))
+ self.GrayLetterComboBox.insertItem(self.__tr("D"))
+ self.GrayLetterComboBox.insertItem(self.__tr("E"))
+ self.GrayLetterComboBox.insertItem(self.__tr("F"))
+ self.GrayLetterComboBox.insertItem(self.__tr("G"))
+ self.GrayLetterComboBox.insertItem(self.__tr("H"))
+ self.GrayLetterComboBox.insertItem(self.__tr("I"))
+ self.GrayLetterComboBox.insertItem(self.__tr("J"))
+ self.GrayLetterComboBox.insertItem(self.__tr("K"))
+ self.GrayLetterComboBox.insertItem(self.__tr("L"))
+ self.GrayLetterComboBox.insertItem(self.__tr("M"))
+ self.GrayLetterComboBox.insertItem(self.__tr("N"))
+ self.GrayNumberComboBox.clear()
+ self.GrayNumberComboBox.insertItem(self.__tr("1"))
+ self.GrayNumberComboBox.insertItem(self.__tr("2"))
+ self.GrayNumberComboBox.insertItem(self.__tr("3"))
+ self.GrayNumberComboBox.insertItem(self.__tr("4"))
+ self.GrayNumberComboBox.insertItem(self.__tr("5"))
+ self.GrayNumberComboBox.insertItem(self.__tr("6"))
+ self.GrayNumberComboBox.insertItem(self.__tr("7"))
+ self.GrayNumberComboBox.insertItem(self.__tr("8"))
+ self.GrayNumberComboBox.insertItem(self.__tr("9"))
+ self.GrayNumberComboBox.insertItem(self.__tr("10"))
+ self.GrayNumberComboBox.insertItem(self.__tr("11"))
+ self.GrayNumberComboBox.insertItem(self.__tr("12"))
+ self.GrayNumberComboBox.insertItem(self.__tr("13"))
+ self.GrayNumberComboBox.insertItem(self.__tr("14"))
+ self.groupBox2.setTitle(self.__tr("Color Plot"))
+ self.ColorLetterComboBox.clear()
+ self.ColorLetterComboBox.insertItem(self.__tr("P"))
+ self.ColorLetterComboBox.insertItem(self.__tr("Q"))
+ self.ColorLetterComboBox.insertItem(self.__tr("R"))
+ self.ColorLetterComboBox.insertItem(self.__tr("S"))
+ self.ColorLetterComboBox.insertItem(self.__tr("T"))
+ self.ColorLetterComboBox.insertItem(self.__tr("U"))
+ self.ColorLetterComboBox.insertItem(self.__tr("V"))
+ self.ColorNumberComboBox.clear()
+ self.ColorNumberComboBox.insertItem(self.__tr("1"))
+ self.ColorNumberComboBox.insertItem(self.__tr("2"))
+ self.ColorNumberComboBox.insertItem(self.__tr("3"))
+ self.ColorNumberComboBox.insertItem(self.__tr("4"))
+ self.ColorNumberComboBox.insertItem(self.__tr("5"))
+ self.ColorNumberComboBox.insertItem(self.__tr("6"))
+ self.ColorNumberComboBox.insertItem(self.__tr("7"))
+ self.pushButton2.setText(self.__tr("Cancel"))
+ self.UseDefaultsButton.setText(self.__tr("Use Factory Defaults"))
+
+
+ def ColorNumberComboBox_highlighted(self,a0):
+ print "ColorCal4Form_base.ColorNumberComboBox_highlighted(const QString&): Not implemented yet"
+
+ def ColorLetterComboBox_highlighted(self,a0):
+ print "ColorCal4Form_base.ColorLetterComboBox_highlighted(const QString&): Not implemented yet"
+
+ def GrayLetterComboBox_highlighted(self,a0):
+ print "ColorCal4Form_base.GrayLetterComboBox_highlighted(const QString&): Not implemented yet"
+
+ def GrayNumberComboBox_highlighted(self,a0):
+ print "ColorCal4Form_base.GrayNumberComboBox_highlighted(const QString&): Not implemented yet"
+
+ def UseDefaultsButton_clicked(self):
+ print "ColorCal4Form_base.UseDefaultsButton_clicked(): Not implemented yet"
+
+ def __tr(self,s,c = None):
+ return qApp.translate("ColorCal4Form_base",s,c)
+
+if __name__ == "__main__":
+ a = QApplication(sys.argv)
+ QObject.connect(a,SIGNAL("lastWindowClosed()"),a,SLOT("quit()"))
+ w = ColorCal4Form_base()
+ a.setMainWidget(w)
+ w.show()
+ a.exec_loop()
diff --git a/ui/colorcal4form_base.ui b/ui/colorcal4form_base.ui
new file mode 100644
index 0000000..64b6fc1
--- /dev/null
+++ b/ui/colorcal4form_base.ui
@@ -0,0 +1,668 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>ColorCal4Form_base</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>ColorCal4Form_base</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>656</width>
+ <height>380</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>HP Device Manager - Color Calibration</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QPushButton" row="4" column="4">
+ <property name="name">
+ <cstring>pushButton1</cstring>
+ </property>
+ <property name="text">
+ <string>Calibrate</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0" rowspan="2" colspan="3">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>1. Hold the calibration page at arm's length in front of your eyes.
+&lt;p&gt;&lt;p&gt;
+2. Tilt the page away from you. Look at the two large squares, each containing colored patches. For each large square, find the colored path that &lt;b&gt;most closely&lt;/b&gt; matches the background color. Each patch has an associated letter and number.
+&lt;p&gt;&lt;p&gt;
+3. Choose the letter and number for the matching patches for the gray and color plots.
+&lt;p&gt;&lt;p&gt;
+4. Click &lt;i&gt;"Calibrate".&lt;/i&gt; to continue.
+&lt;p&gt;&lt;p&gt;
+(To reset the printer to known defaults, click &lt;i&gt;"Use Factory Defaults"&lt;/i&gt;)</string>
+ </property>
+ <property name="textFormat">
+ <enum>RichText</enum>
+ </property>
+ <property name="alignment">
+ <set>WordBreak|AlignVCenter</set>
+ </property>
+ </widget>
+ <spacer row="2" column="0" rowspan="2" colspan="1">
+ <property name="name">
+ <cstring>spacer16</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>101</height>
+ </size>
+ </property>
+ </spacer>
+ <spacer row="3" column="4">
+ <property name="name">
+ <cstring>spacer17</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>101</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QGroupBox" row="0" column="3" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>groupBox1</cstring>
+ </property>
+ <property name="title">
+ <string>Gray Plot</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer row="1" column="4">
+ <property name="name">
+ <cstring>spacer3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>60</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLayoutWidget" row="1" column="1" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>layout2</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QComboBox">
+ <item>
+ <property name="text">
+ <string>A</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>B</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>C</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>D</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>E</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>F</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>G</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>H</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>I</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>J</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>K</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>L</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>M</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>N</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>GrayLetterComboBox</cstring>
+ </property>
+ <property name="font">
+ <font>
+ <family>Courier [Adobe]</family>
+ <bold>1</bold>
+ </font>
+ </property>
+ </widget>
+ <widget class="QComboBox">
+ <item>
+ <property name="text">
+ <string>1</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>2</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>3</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>4</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>5</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>6</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>7</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>8</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>9</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>10</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>11</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>12</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>13</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>14</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>GrayNumberComboBox</cstring>
+ </property>
+ <property name="font">
+ <font>
+ <family>Courier [Adobe]</family>
+ <bold>1</bold>
+ </font>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <spacer row="1" column="0">
+ <property name="name">
+ <cstring>spacer4</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>60</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLabel" row="0" column="2">
+ <property name="name">
+ <cstring>gray_plot_png</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>75</width>
+ <height>75</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>75</width>
+ <height>75</height>
+ </size>
+ </property>
+ <property name="scaledContents">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <spacer row="0" column="3" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>50</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <spacer row="0" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+ </widget>
+ <widget class="QGroupBox" row="1" column="3" rowspan="2" colspan="2">
+ <property name="name">
+ <cstring>groupBox2</cstring>
+ </property>
+ <property name="title">
+ <string>Color Plot</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="0" column="2">
+ <property name="name">
+ <cstring>color_plot_png</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>75</width>
+ <height>75</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>75</width>
+ <height>75</height>
+ </size>
+ </property>
+ <property name="scaledContents">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <spacer row="0" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>spacer12</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <spacer row="0" column="3" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>spacer14</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <spacer row="1" column="4">
+ <property name="name">
+ <cstring>spacer15</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <spacer row="1" column="0">
+ <property name="name">
+ <cstring>spacer13</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLayoutWidget" row="1" column="1" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>layout1</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QComboBox">
+ <item>
+ <property name="text">
+ <string>P</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Q</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>R</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>S</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>T</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>U</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>V</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>ColorLetterComboBox</cstring>
+ </property>
+ <property name="font">
+ <font>
+ <family>Courier [Adobe]</family>
+ <bold>1</bold>
+ </font>
+ </property>
+ </widget>
+ <widget class="QComboBox">
+ <item>
+ <property name="text">
+ <string>1</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>2</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>3</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>4</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>5</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>6</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>7</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>ColorNumberComboBox</cstring>
+ </property>
+ <property name="font">
+ <font>
+ <family>Courier [Adobe]</family>
+ <bold>1</bold>
+ </font>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </grid>
+ </widget>
+ <spacer row="4" column="0">
+ <property name="name">
+ <cstring>spacer9</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>310</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton" row="4" column="1">
+ <property name="name">
+ <cstring>pushButton2</cstring>
+ </property>
+ <property name="text">
+ <string>Cancel</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="4" column="2" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>UseDefaultsButton</cstring>
+ </property>
+ <property name="text">
+ <string>Use Factory Defaults</string>
+ </property>
+ </widget>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>pushButton2</sender>
+ <signal>clicked()</signal>
+ <receiver>ColorCal4Form_base</receiver>
+ <slot>reject()</slot>
+ </connection>
+ <connection>
+ <sender>pushButton1</sender>
+ <signal>clicked()</signal>
+ <receiver>ColorCal4Form_base</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection>
+ <sender>ColorNumberComboBox</sender>
+ <signal>highlighted(const QString&amp;)</signal>
+ <receiver>ColorCal4Form_base</receiver>
+ <slot>ColorNumberComboBox_highlighted(const QString&amp;)</slot>
+ </connection>
+ <connection>
+ <sender>ColorLetterComboBox</sender>
+ <signal>highlighted(const QString&amp;)</signal>
+ <receiver>ColorCal4Form_base</receiver>
+ <slot>ColorLetterComboBox_highlighted(const QString&amp;)</slot>
+ </connection>
+ <connection>
+ <sender>GrayLetterComboBox</sender>
+ <signal>highlighted(const QString&amp;)</signal>
+ <receiver>ColorCal4Form_base</receiver>
+ <slot>GrayLetterComboBox_highlighted(const QString&amp;)</slot>
+ </connection>
+ <connection>
+ <sender>GrayNumberComboBox</sender>
+ <signal>highlighted(const QString&amp;)</signal>
+ <receiver>ColorCal4Form_base</receiver>
+ <slot>GrayNumberComboBox_highlighted(const QString&amp;)</slot>
+ </connection>
+ <connection>
+ <sender>UseDefaultsButton</sender>
+ <signal>clicked()</signal>
+ <receiver>ColorCal4Form_base</receiver>
+ <slot>UseDefaultsButton_clicked()</slot>
+ </connection>
+</connections>
+<includes>
+ <include location="local" impldecl="in implementation">colorcal4form_base.ui.h</include>
+</includes>
+<slots>
+ <slot>ColorNumberComboBox_highlighted( const QString &amp; )</slot>
+ <slot>ColorLetterComboBox_highlighted( const QString &amp; )</slot>
+ <slot>GrayLetterComboBox_highlighted( const QString &amp; )</slot>
+ <slot>GrayNumberComboBox_highlighted( const QString &amp; )</slot>
+ <slot>UseDefaultsButton_clicked()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="6"/>
+</UI>
diff --git a/ui/colorcalform.py b/ui/colorcalform.py
new file mode 100644
index 0000000..a0935cf
--- /dev/null
+++ b/ui/colorcalform.py
@@ -0,0 +1,33 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2001-2007 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+from qt import *
+from colorcalform_base import ColorCalForm_base
+
+class ColorCalForm(ColorCalForm_base):
+ def __init__(self,parent = None,name = None,modal = 0,fl = 0):
+ ColorCalForm_base.__init__(self,parent,name,modal,fl)
+
+ self.value = 4
+
+ def ColorCalGroup_clicked(self,a0):
+ self.value = a0 + 1
+
diff --git a/ui/colorcalform2.py b/ui/colorcalform2.py
new file mode 100644
index 0000000..d38982d
--- /dev/null
+++ b/ui/colorcalform2.py
@@ -0,0 +1,40 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2001-2008 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+# Std Lib
+
+# Local
+from base.g import *
+from ui_utils import load_pixmap
+
+# Qt
+from qt import *
+from colorcalform2_base import ColorCalForm2_base
+
+class ColorCalForm2(ColorCalForm2_base):
+ def __init__(self,parent = None,name = None,modal = 0,fl = 0):
+ ColorCalForm2_base.__init__(self,parent,name,modal,fl)
+ self.Icon.setPixmap(load_pixmap('color_adj', 'other'))
+ self.value = 1
+
+ def SpinBox_valueChanged(self,a0):
+ self.value = a0
+ #print self.value
diff --git a/ui/colorcalform2_base.py b/ui/colorcalform2_base.py
new file mode 100644
index 0000000..64a45e0
--- /dev/null
+++ b/ui/colorcalform2_base.py
@@ -0,0 +1,112 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file '/home/dwelch/linux-imaging-and-printing/src/ui/colorcalform2_base.ui'
+#
+# Created: Wed Jul 13 09:36:13 2005
+# by: The PyQt User Interface Compiler (pyuic) 3.14.1
+#
+# WARNING! All changes made in this file will be lost!
+
+
+import sys
+from qt import *
+
+
+class ColorCalForm2_base(QDialog):
+ def __init__(self,parent = None,name = None,modal = 0,fl = 0):
+ QDialog.__init__(self,parent,name,modal,fl)
+
+ if not name:
+ self.setName("ColorCalForm2_base")
+
+
+ ColorCalForm2_baseLayout = QGridLayout(self,1,1,11,6,"ColorCalForm2_baseLayout")
+
+ self.CancelButton = QPushButton(self,"CancelButton")
+
+ ColorCalForm2_baseLayout.addWidget(self.CancelButton,1,2)
+
+ self.ContinueButton = QPushButton(self,"ContinueButton")
+
+ ColorCalForm2_baseLayout.addWidget(self.ContinueButton,1,3)
+ spacer1 = QSpacerItem(270,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ ColorCalForm2_baseLayout.addItem(spacer1,1,1)
+
+ self.buttonGroup = QButtonGroup(self,"buttonGroup")
+ self.buttonGroup.setColumnLayout(0,Qt.Vertical)
+ self.buttonGroup.layout().setSpacing(6)
+ self.buttonGroup.layout().setMargin(11)
+ buttonGroupLayout = QGridLayout(self.buttonGroup.layout())
+ buttonGroupLayout.setAlignment(Qt.AlignTop)
+
+ self.Icon = QLabel(self.buttonGroup,"Icon")
+ self.Icon.setSizePolicy(QSizePolicy(QSizePolicy.Fixed,QSizePolicy.Fixed,0,0,self.Icon.sizePolicy().hasHeightForWidth()))
+ self.Icon.setScaledContents(1)
+
+ buttonGroupLayout.addWidget(self.Icon,0,0)
+
+ self.textLabel2_2 = QLabel(self.buttonGroup,"textLabel2_2")
+ self.textLabel2_2.setAlignment(QLabel.WordBreak | QLabel.AlignVCenter)
+
+ buttonGroupLayout.addMultiCellWidget(self.textLabel2_2,0,0,1,4)
+
+ layout3 = QHBoxLayout(None,0,6,"layout3")
+
+ self.textLabel1 = QLabel(self.buttonGroup,"textLabel1")
+ layout3.addWidget(self.textLabel1)
+
+ self.SpinBox = QSpinBox(self.buttonGroup,"SpinBox")
+ self.SpinBox.setMaxValue(81)
+ self.SpinBox.setMinValue(1)
+ layout3.addWidget(self.SpinBox)
+
+ buttonGroupLayout.addMultiCellLayout(layout3,2,2,2,3)
+ spacer3 = QSpacerItem(351,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ buttonGroupLayout.addItem(spacer3,2,4)
+ spacer4 = QSpacerItem(251,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ buttonGroupLayout.addMultiCell(spacer4,2,2,0,1)
+ spacer5 = QSpacerItem(20,21,QSizePolicy.Minimum,QSizePolicy.Expanding)
+ buttonGroupLayout.addItem(spacer5,1,2)
+ spacer6 = QSpacerItem(20,61,QSizePolicy.Minimum,QSizePolicy.Expanding)
+ buttonGroupLayout.addItem(spacer6,3,3)
+
+ ColorCalForm2_baseLayout.addMultiCellWidget(self.buttonGroup,0,0,0,3)
+
+ self.languageChange()
+
+ self.resize(QSize(952,327).expandedTo(self.minimumSizeHint()))
+ self.clearWState(Qt.WState_Polished)
+
+ self.connect(self.CancelButton,SIGNAL("clicked()"),self.reject)
+ self.connect(self.ContinueButton,SIGNAL("clicked()"),self.accept)
+ self.connect(self.SpinBox,SIGNAL("valueChanged(int)"),self.SpinBox_valueChanged)
+
+
+ def languageChange(self):
+ self.setCaption(self.__tr("HP Device Manager - Color Calibration"))
+ self.CancelButton.setText(self.__tr("Cancel"))
+ self.ContinueButton.setText(self.__tr("Next >"))
+ self.buttonGroup.setTitle(QString.null)
+ self.textLabel2_2.setText(self.__tr("<b>A page of color patches is printing. When it is complete, follow these steps:</b>\n"
+"<p><b>1.</b> Hold the page approximately 8 inches (~20cm) in front of your eyes.\n"
+"<p><b>2.</b> Slowly move the page away from you until the numbered patches fade to match the background.\n"
+"<p><b>3.</b> Select the number (below) between <i>1</i> and <i>81 </i>of the numbered patch that <b>best </b>matches the background:"))
+ self.textLabel1.setText(self.__tr("Number of best matching patch (1-81):"))
+
+
+ def buttonGroup_clicked(self,a0):
+ print "ColorCalForm2_base.buttonGroup_clicked(int): Not implemented yet"
+
+ def SpinBox_valueChanged(self,a0):
+ print "ColorCalForm2_base.SpinBox_valueChanged(int): Not implemented yet"
+
+ def __tr(self,s,c = None):
+ return qApp.translate("ColorCalForm2_base",s,c)
+
+if __name__ == "__main__":
+ a = QApplication(sys.argv)
+ QObject.connect(a,SIGNAL("lastWindowClosed()"),a,SLOT("quit()"))
+ w = ColorCalForm2_base()
+ a.setMainWidget(w)
+ w.show()
+ a.exec_loop()
diff --git a/ui/colorcalform2_base.ui b/ui/colorcalform2_base.ui
new file mode 100644
index 0000000..313a3b9
--- /dev/null
+++ b/ui/colorcalform2_base.ui
@@ -0,0 +1,222 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>ColorCalForm2_base</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>ColorCalForm2_base</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>952</width>
+ <height>327</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>HP Device Manager - Color Calibration</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QPushButton" row="1" column="2">
+ <property name="name">
+ <cstring>CancelButton</cstring>
+ </property>
+ <property name="text">
+ <string>Cancel</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="1" column="3">
+ <property name="name">
+ <cstring>ContinueButton</cstring>
+ </property>
+ <property name="text">
+ <string>Next &gt;</string>
+ </property>
+ </widget>
+ <spacer row="1" column="1">
+ <property name="name">
+ <cstring>spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>270</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QButtonGroup" row="0" column="0" rowspan="1" colspan="4">
+ <property name="name">
+ <cstring>buttonGroup</cstring>
+ </property>
+ <property name="title">
+ <string></string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>Icon</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="scaledContents">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="1" rowspan="1" colspan="4">
+ <property name="name">
+ <cstring>textLabel2_2</cstring>
+ </property>
+ <property name="text">
+ <string>&lt;b&gt;A page of color patches is printing. When it is complete, follow these steps:&lt;/b&gt;
+&lt;p&gt;&lt;b&gt;1.&lt;/b&gt; Hold the page approximately 8 inches (~20cm) in front of your eyes.
+&lt;p&gt;&lt;b&gt;2.&lt;/b&gt; Slowly move the page away from you until the numbered patches fade to match the background.
+&lt;p&gt;&lt;b&gt;3.&lt;/b&gt; Select the number (below) between &lt;i&gt;1&lt;/i&gt; and &lt;i&gt;81 &lt;/i&gt;of the numbered patch that &lt;b&gt;best &lt;/b&gt;matches the background:</string>
+ </property>
+ <property name="alignment">
+ <set>WordBreak|AlignVCenter</set>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="2" column="2" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>layout3</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>Number of best matching patch (1-81):</string>
+ </property>
+ </widget>
+ <widget class="QSpinBox">
+ <property name="name">
+ <cstring>SpinBox</cstring>
+ </property>
+ <property name="maxValue">
+ <number>81</number>
+ </property>
+ <property name="minValue">
+ <number>1</number>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <spacer row="2" column="4">
+ <property name="name">
+ <cstring>spacer3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>351</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <spacer row="2" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>spacer4</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>251</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <spacer row="1" column="2">
+ <property name="name">
+ <cstring>spacer5</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>21</height>
+ </size>
+ </property>
+ </spacer>
+ <spacer row="3" column="3">
+ <property name="name">
+ <cstring>spacer6</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>61</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+ </widget>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>CancelButton</sender>
+ <signal>clicked()</signal>
+ <receiver>ColorCalForm2_base</receiver>
+ <slot>reject()</slot>
+ </connection>
+ <connection>
+ <sender>ContinueButton</sender>
+ <signal>clicked()</signal>
+ <receiver>ColorCalForm2_base</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection>
+ <sender>SpinBox</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>ColorCalForm2_base</receiver>
+ <slot>SpinBox_valueChanged(int)</slot>
+ </connection>
+</connections>
+<slots>
+ <slot>buttonGroup_clicked( int )</slot>
+ <slot>SpinBox_valueChanged( int )</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/ui/colorcalform_base.py b/ui/colorcalform_base.py
new file mode 100644
index 0000000..5400137
--- /dev/null
+++ b/ui/colorcalform_base.py
@@ -0,0 +1,118 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file '/home/dwelch/linux-imaging-and-printing/src/ui/colorcalform_base.ui'
+#
+# Created: Wed Jul 13 09:36:13 2005
+# by: The PyQt User Interface Compiler (pyuic) 3.14.1
+#
+# WARNING! All changes made in this file will be lost!
+
+
+import sys
+from qt import *
+
+
+class ColorCalForm_base(QDialog):
+ def __init__(self,parent = None,name = None,modal = 0,fl = 0):
+ QDialog.__init__(self,parent,name,modal,fl)
+
+ if not name:
+ self.setName("ColorCalForm_base")
+
+
+ ColorCalForm_baseLayout = QGridLayout(self,1,1,11,6,"ColorCalForm_baseLayout")
+
+ self.ContinueButton = QPushButton(self,"ContinueButton")
+
+ ColorCalForm_baseLayout.addWidget(self.ContinueButton,1,3)
+ spacer1 = QSpacerItem(335,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ ColorCalForm_baseLayout.addItem(spacer1,1,1)
+
+ self.CancelButton = QPushButton(self,"CancelButton")
+
+ ColorCalForm_baseLayout.addWidget(self.CancelButton,1,2)
+
+ self.ColorCalGroup = QButtonGroup(self,"ColorCalGroup")
+ self.ColorCalGroup.setColumnLayout(0,Qt.Vertical)
+ self.ColorCalGroup.layout().setSpacing(6)
+ self.ColorCalGroup.layout().setMargin(11)
+ ColorCalGroupLayout = QGridLayout(self.ColorCalGroup.layout())
+ ColorCalGroupLayout.setAlignment(Qt.AlignTop)
+
+ layout2 = QHBoxLayout(None,0,6,"layout2")
+
+ self.radioButton12 = QRadioButton(self.ColorCalGroup,"radioButton12")
+ layout2.addWidget(self.radioButton12)
+
+ self.radioButton13 = QRadioButton(self.ColorCalGroup,"radioButton13")
+ layout2.addWidget(self.radioButton13)
+
+ self.radioButton14 = QRadioButton(self.ColorCalGroup,"radioButton14")
+ layout2.addWidget(self.radioButton14)
+
+ self.radioButton15 = QRadioButton(self.ColorCalGroup,"radioButton15")
+ self.radioButton15.setChecked(1)
+ layout2.addWidget(self.radioButton15)
+
+ self.radioButton16 = QRadioButton(self.ColorCalGroup,"radioButton16")
+ layout2.addWidget(self.radioButton16)
+
+ self.radioButton17 = QRadioButton(self.ColorCalGroup,"radioButton17")
+ layout2.addWidget(self.radioButton17)
+
+ self.radioButton18 = QRadioButton(self.ColorCalGroup,"radioButton18")
+ layout2.addWidget(self.radioButton18)
+
+ ColorCalGroupLayout.addLayout(layout2,1,0)
+
+ self.textLabel2_2 = QLabel(self.ColorCalGroup,"textLabel2_2")
+ self.textLabel2_2.setAlignment(QLabel.WordBreak | QLabel.AlignVCenter)
+
+ ColorCalGroupLayout.addWidget(self.textLabel2_2,0,0)
+
+ ColorCalForm_baseLayout.addMultiCellWidget(self.ColorCalGroup,0,0,0,3)
+
+ self.languageChange()
+
+ self.resize(QSize(610,220).expandedTo(self.minimumSizeHint()))
+ self.clearWState(Qt.WState_Polished)
+
+ self.connect(self.CancelButton,SIGNAL("clicked()"),self.reject)
+ self.connect(self.ContinueButton,SIGNAL("clicked()"),self.accept)
+ self.connect(self.ColorCalGroup,SIGNAL("clicked(int)"),self.ColorCalGroup_clicked)
+
+
+ def languageChange(self):
+ self.setCaption(self.__tr("HP Device Manager - Color Calibration"))
+ self.ContinueButton.setText(self.__tr("Next >"))
+ self.CancelButton.setText(self.__tr("Cancel"))
+ self.ColorCalGroup.setTitle(self.__tr("Color Calibration"))
+ self.radioButton12.setText(self.__tr("1"))
+ self.radioButton13.setText(self.__tr("2"))
+ self.radioButton14.setText(self.__tr("3"))
+ self.radioButton15.setText(self.__tr("4"))
+ self.radioButton16.setText(self.__tr("5"))
+ self.radioButton17.setText(self.__tr("6"))
+ self.radioButton18.setText(self.__tr("7"))
+ self.textLabel2_2.setText(self.__tr("Choose the numbered image labeled \"1\" thru \"7\" that is <b>best color matched</b> to the image labeled \"X\"."))
+
+
+ def buttonGroup2_clicked(self,a0):
+ print "ColorCalForm_base.buttonGroup2_clicked(int): Not implemented yet"
+
+ def ColorCalGroup_released(self,a0):
+ print "ColorCalForm_base.ColorCalGroup_released(int): Not implemented yet"
+
+ def ColorCalGroup_clicked(self,a0):
+ print "ColorCalForm_base.ColorCalGroup_clicked(int): Not implemented yet"
+
+ def __tr(self,s,c = None):
+ return qApp.translate("ColorCalForm_base",s,c)
+
+if __name__ == "__main__":
+ a = QApplication(sys.argv)
+ QObject.connect(a,SIGNAL("lastWindowClosed()"),a,SLOT("quit()"))
+ w = ColorCalForm_base()
+ a.setMainWidget(w)
+ w.show()
+ a.exec_loop()
diff --git a/ui/colorcalform_base.ui b/ui/colorcalform_base.ui
new file mode 100644
index 0000000..009220e
--- /dev/null
+++ b/ui/colorcalform_base.ui
@@ -0,0 +1,176 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>ColorCalForm_base</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>ColorCalForm_base</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>610</width>
+ <height>220</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>HP Device Manager - Color Calibration</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QPushButton" row="1" column="3">
+ <property name="name">
+ <cstring>ContinueButton</cstring>
+ </property>
+ <property name="text">
+ <string>Next &gt;</string>
+ </property>
+ </widget>
+ <spacer row="1" column="1">
+ <property name="name">
+ <cstring>spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>335</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton" row="1" column="2">
+ <property name="name">
+ <cstring>CancelButton</cstring>
+ </property>
+ <property name="text">
+ <string>Cancel</string>
+ </property>
+ </widget>
+ <widget class="QButtonGroup" row="0" column="0" rowspan="1" colspan="4">
+ <property name="name">
+ <cstring>ColorCalGroup</cstring>
+ </property>
+ <property name="title">
+ <string>Color Calibration</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget" row="1" column="0">
+ <property name="name">
+ <cstring>layout2</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>radioButton12</cstring>
+ </property>
+ <property name="text">
+ <string>1</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>radioButton13</cstring>
+ </property>
+ <property name="text">
+ <string>2</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>radioButton14</cstring>
+ </property>
+ <property name="text">
+ <string>3</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>radioButton15</cstring>
+ </property>
+ <property name="text">
+ <string>4</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>radioButton16</cstring>
+ </property>
+ <property name="text">
+ <string>5</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>radioButton17</cstring>
+ </property>
+ <property name="text">
+ <string>6</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>radioButton18</cstring>
+ </property>
+ <property name="text">
+ <string>7</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>textLabel2_2</cstring>
+ </property>
+ <property name="text">
+ <string>Choose the numbered image labeled "1" thru "7" that is &lt;b&gt;best color matched&lt;/b&gt; to the image labeled "X".</string>
+ </property>
+ <property name="alignment">
+ <set>WordBreak|AlignVCenter</set>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>CancelButton</sender>
+ <signal>clicked()</signal>
+ <receiver>ColorCalForm_base</receiver>
+ <slot>reject()</slot>
+ </connection>
+ <connection>
+ <sender>ContinueButton</sender>
+ <signal>clicked()</signal>
+ <receiver>ColorCalForm_base</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection>
+ <sender>ColorCalGroup</sender>
+ <signal>clicked(int)</signal>
+ <receiver>ColorCalForm_base</receiver>
+ <slot>ColorCalGroup_clicked(int)</slot>
+ </connection>
+</connections>
+<slots>
+ <slot>buttonGroup2_clicked( int )</slot>
+ <slot>ColorCalGroup_released( int )</slot>
+ <slot>ColorCalGroup_clicked( int )</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/ui/coverpageform.py b/ui/coverpageform.py
new file mode 100644
index 0000000..ae07e62
--- /dev/null
+++ b/ui/coverpageform.py
@@ -0,0 +1,82 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2008 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+# Std Lib
+
+# Local
+from base.g import *
+from ui_utils import load_pixmap
+from fax import coverpages
+from ui_utils import load_pixmap
+
+# Qt
+from qt import *
+from coverpageform_base import CoverpageForm_base
+
+
+
+class CoverpageForm(CoverpageForm_base):
+ def __init__(self, cover_page_name='', preserve_formatting=False, parent=None, name=None, modal=0, fl=0):
+ CoverpageForm_base.__init__(self, parent, name, modal, fl)
+
+ self.preserve_formatting = preserve_formatting
+ self.preserveFormattingCheckBox.setChecked(preserve_formatting)
+ self.prevCoverpageButton.setPixmap(load_pixmap('prev', '16x16'))
+ self.nextCoverpageButton.setPixmap(load_pixmap('next', '16x16'))
+ self.coverpage_list = coverpages.COVERPAGES.keys()
+
+ if cover_page_name:
+ self.coverpage_index = self.coverpage_list.index(cover_page_name)
+ else:
+ self.coverpage_index = 0
+
+ self.setCoverpage()
+
+
+ def setCoverpage(self, inc=0):
+ self.coverpage_index += inc
+
+ if self.coverpage_index > len(self.coverpage_list) - 1:
+ self.coverpage_index = 0
+
+ elif self.coverpage_index < 0:
+ self.coverpage_index = len(self.coverpage_list) - 1
+
+ self.coverpage_name = self.coverpage_list[self.coverpage_index]
+ self.data = coverpages.COVERPAGES[self.coverpage_name]
+
+ self.coverpagePixmap.setPixmap(load_pixmap(self.data[1], 'other'))
+
+
+ def prevCoverpageButton_clicked(self):
+ self.setCoverpage(-1)
+
+
+ def nextCoverpageButton_clicked(self):
+ self.setCoverpage(1)
+
+
+ def preserveFormattingCheckBox_toggled(self,a0):
+ self.preserve_formatting = bool(a0)
+
+
+ def __tr(self,s,c = None):
+ return qApp.translate("CoverpageForm_base",s,c)
diff --git a/ui/coverpageform_base.py b/ui/coverpageform_base.py
new file mode 100644
index 0000000..7c65ec1
--- /dev/null
+++ b/ui/coverpageform_base.py
@@ -0,0 +1,149 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'coverpageform_base.ui'
+#
+# Created: Fri Apr 13 10:15:44 2007
+# by: The PyQt User Interface Compiler (pyuic) 3.16
+#
+# WARNING! All changes made in this file will be lost!
+
+
+from qt import *
+
+
+class CoverpageForm_base(QDialog):
+ def __init__(self,parent = None,name = None,modal = 0,fl = 0):
+ QDialog.__init__(self,parent,name,modal,fl)
+
+ if not name:
+ self.setName("CoverpageForm_base")
+
+
+ CoverpageForm_baseLayout = QGridLayout(self,1,1,11,6,"CoverpageForm_baseLayout")
+ spacer7 = QSpacerItem(590,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ CoverpageForm_baseLayout.addMultiCell(spacer7,5,5,0,1)
+
+ self.pushButton10 = QPushButton(self,"pushButton10")
+
+ CoverpageForm_baseLayout.addWidget(self.pushButton10,5,2)
+
+ self.pushButton9 = QPushButton(self,"pushButton9")
+
+ CoverpageForm_baseLayout.addWidget(self.pushButton9,5,3)
+
+ self.groupBox2 = QGroupBox(self,"groupBox2")
+ self.groupBox2.setColumnLayout(0,Qt.Vertical)
+ self.groupBox2.layout().setSpacing(6)
+ self.groupBox2.layout().setMargin(11)
+ groupBox2Layout = QGridLayout(self.groupBox2.layout())
+ groupBox2Layout.setAlignment(Qt.AlignTop)
+
+ self.nextCoverpageButton = QToolButton(self.groupBox2,"nextCoverpageButton")
+ self.nextCoverpageButton.setSizePolicy(QSizePolicy(QSizePolicy.Fixed,QSizePolicy.Fixed,0,0,self.nextCoverpageButton.sizePolicy().hasHeightForWidth()))
+ self.nextCoverpageButton.setMinimumSize(QSize(32,32))
+ self.nextCoverpageButton.setMaximumSize(QSize(32,32))
+
+ groupBox2Layout.addWidget(self.nextCoverpageButton,0,2)
+
+ self.coverpagePixmap = QLabel(self.groupBox2,"coverpagePixmap")
+ self.coverpagePixmap.setSizePolicy(QSizePolicy(QSizePolicy.Fixed,QSizePolicy.Fixed,0,0,self.coverpagePixmap.sizePolicy().hasHeightForWidth()))
+ self.coverpagePixmap.setMinimumSize(QSize(164,228))
+ self.coverpagePixmap.setMaximumSize(QSize(164,228))
+ self.coverpagePixmap.setFrameShape(QLabel.Box)
+ self.coverpagePixmap.setFrameShadow(QLabel.Plain)
+ self.coverpagePixmap.setScaledContents(1)
+
+ groupBox2Layout.addWidget(self.coverpagePixmap,0,1)
+
+ self.prevCoverpageButton = QToolButton(self.groupBox2,"prevCoverpageButton")
+ self.prevCoverpageButton.setSizePolicy(QSizePolicy(QSizePolicy.Fixed,QSizePolicy.Fixed,0,0,self.prevCoverpageButton.sizePolicy().hasHeightForWidth()))
+ self.prevCoverpageButton.setMinimumSize(QSize(32,32))
+ self.prevCoverpageButton.setMaximumSize(QSize(32,32))
+
+ groupBox2Layout.addWidget(self.prevCoverpageButton,0,0)
+
+ CoverpageForm_baseLayout.addMultiCellWidget(self.groupBox2,2,3,0,0)
+
+ self.textLabel5 = QLabel(self,"textLabel5")
+ self.textLabel5.setSizePolicy(QSizePolicy(QSizePolicy.Preferred,QSizePolicy.Maximum,0,0,self.textLabel5.sizePolicy().hasHeightForWidth()))
+
+ CoverpageForm_baseLayout.addMultiCellWidget(self.textLabel5,0,0,0,3)
+
+ self.line1_2 = QFrame(self,"line1_2")
+ self.line1_2.setFrameShape(QFrame.HLine)
+ self.line1_2.setFrameShadow(QFrame.Sunken)
+ self.line1_2.setFrameShape(QFrame.HLine)
+
+ CoverpageForm_baseLayout.addMultiCellWidget(self.line1_2,1,1,0,3)
+
+ layout6 = QHBoxLayout(None,0,6,"layout6")
+
+ self.textLabel6 = QLabel(self,"textLabel6")
+ layout6.addWidget(self.textLabel6)
+
+ self.regardingTextEdit = QLineEdit(self,"regardingTextEdit")
+ layout6.addWidget(self.regardingTextEdit)
+
+ CoverpageForm_baseLayout.addMultiCellLayout(layout6,2,2,1,3)
+ spacer5 = QSpacerItem(20,141,QSizePolicy.Minimum,QSizePolicy.Expanding)
+ CoverpageForm_baseLayout.addItem(spacer5,4,0)
+
+ layout5 = QVBoxLayout(None,0,6,"layout5")
+
+ self.textLabel3 = QLabel(self,"textLabel3")
+ self.textLabel3.setSizePolicy(QSizePolicy(QSizePolicy.Preferred,QSizePolicy.Maximum,0,0,self.textLabel3.sizePolicy().hasHeightForWidth()))
+ layout5.addWidget(self.textLabel3)
+
+ self.messageTextEdit = QTextEdit(self,"messageTextEdit")
+ self.messageTextEdit.setSizePolicy(QSizePolicy(QSizePolicy.Expanding,QSizePolicy.Expanding,0,0,self.messageTextEdit.sizePolicy().hasHeightForWidth()))
+ layout5.addWidget(self.messageTextEdit)
+
+ self.preserveFormattingCheckBox = QCheckBox(self,"preserveFormattingCheckBox")
+ layout5.addWidget(self.preserveFormattingCheckBox)
+
+ CoverpageForm_baseLayout.addMultiCellLayout(layout5,3,4,1,3)
+
+ self.languageChange()
+
+ self.resize(QSize(675,558).expandedTo(self.minimumSizeHint()))
+ self.clearWState(Qt.WState_Polished)
+
+ self.connect(self.pushButton10,SIGNAL("clicked()"),self.reject)
+ self.connect(self.pushButton9,SIGNAL("clicked()"),self.accept)
+ self.connect(self.prevCoverpageButton,SIGNAL("clicked()"),self.prevCoverpageButton_clicked)
+ self.connect(self.nextCoverpageButton,SIGNAL("clicked()"),self.nextCoverpageButton_clicked)
+ self.connect(self.preserveFormattingCheckBox,SIGNAL("toggled(bool)"),self.preserveFormattingCheckBox_toggled)
+
+ self.setTabOrder(self.regardingTextEdit,self.messageTextEdit)
+ self.setTabOrder(self.messageTextEdit,self.pushButton10)
+ self.setTabOrder(self.pushButton10,self.pushButton9)
+
+
+ def languageChange(self):
+ self.setCaption(self.__tr("HP Device Manager - Coverpages"))
+ self.pushButton10.setText(self.__tr("Cancel"))
+ self.pushButton9.setText(self.__tr("OK"))
+ self.groupBox2.setTitle(self.__tr("Coverpage Design"))
+ self.nextCoverpageButton.setText(QString.null)
+ self.prevCoverpageButton.setText(QString.null)
+ self.prevCoverpageButton.setAccel(QKeySequence(QString.null))
+ self.textLabel5.setText(self.__tr("<b>Choose coverpage and enter optional message.<b>"))
+ self.textLabel6.setText(self.__tr("Regarding:"))
+ self.textLabel3.setText(self.__tr("Optional Message <i>(Maximum 2048 characters or 32 lines preformatted)</i>:"))
+ self.preserveFormattingCheckBox.setText(self.__tr("Preformatted (preserve formatting)"))
+
+
+ def coverpageListBox_currentChanged(self,a0):
+ print "CoverpageForm_base.coverpageListBox_currentChanged(QListBoxItem*): Not implemented yet"
+
+ def prevCoverpageButton_clicked(self):
+ print "CoverpageForm_base.prevCoverpageButton_clicked(): Not implemented yet"
+
+ def nextCoverpageButton_clicked(self):
+ print "CoverpageForm_base.nextCoverpageButton_clicked(): Not implemented yet"
+
+ def preserveFormattingCheckBox_toggled(self,a0):
+ print "CoverpageForm_base.preserveFormattingCheckBox_toggled(bool): Not implemented yet"
+
+ def __tr(self,s,c = None):
+ return qApp.translate("CoverpageForm_base",s,c)
diff --git a/ui/coverpageform_base.ui b/ui/coverpageform_base.ui
new file mode 100644
index 0000000..888b32d
--- /dev/null
+++ b/ui/coverpageform_base.ui
@@ -0,0 +1,328 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>CoverpageForm_base</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>CoverpageForm_base</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>675</width>
+ <height>558</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>HP Device Manager - Coverpages</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer row="5" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>spacer7</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>590</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton" row="5" column="2">
+ <property name="name">
+ <cstring>pushButton10</cstring>
+ </property>
+ <property name="text">
+ <string>Cancel</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="5" column="3">
+ <property name="name">
+ <cstring>pushButton9</cstring>
+ </property>
+ <property name="text">
+ <string>OK</string>
+ </property>
+ </widget>
+ <widget class="QGroupBox" row="2" column="0" rowspan="2" colspan="1">
+ <property name="name">
+ <cstring>groupBox2</cstring>
+ </property>
+ <property name="title">
+ <string>Coverpage Design</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QToolButton" row="0" column="2">
+ <property name="name">
+ <cstring>nextCoverpageButton</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="1">
+ <property name="name">
+ <cstring>coverpagePixmap</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>164</width>
+ <height>228</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>164</width>
+ <height>228</height>
+ </size>
+ </property>
+ <property name="frameShape">
+ <enum>Box</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Plain</enum>
+ </property>
+ <property name="scaledContents">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QToolButton" row="0" column="0">
+ <property name="name">
+ <cstring>prevCoverpageButton</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="accel">
+ <string></string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QLabel" row="0" column="0" rowspan="1" colspan="4">
+ <property name="name">
+ <cstring>textLabel5</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>4</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>&lt;b&gt;Choose coverpage and enter optional message.&lt;b&gt;</string>
+ </property>
+ </widget>
+ <widget class="Line" row="1" column="0" rowspan="1" colspan="4">
+ <property name="name">
+ <cstring>line1_2</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>HLine</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Sunken</enum>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="2" column="1" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>layout6</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel6</cstring>
+ </property>
+ <property name="text">
+ <string>Regarding:</string>
+ </property>
+ </widget>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>regardingTextEdit</cstring>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <spacer row="4" column="0">
+ <property name="name">
+ <cstring>spacer5</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>141</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLayoutWidget" row="3" column="1" rowspan="2" colspan="3">
+ <property name="name">
+ <cstring>layout5</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel3</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>4</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Optional Message &lt;i&gt;(Maximum 2048 characters or 32 lines preformatted)&lt;/i&gt;:</string>
+ </property>
+ </widget>
+ <widget class="QTextEdit">
+ <property name="name">
+ <cstring>messageTextEdit</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>preserveFormattingCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>Preformatted (preserve formatting)</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>pushButton10</sender>
+ <signal>clicked()</signal>
+ <receiver>CoverpageForm_base</receiver>
+ <slot>reject()</slot>
+ </connection>
+ <connection>
+ <sender>pushButton9</sender>
+ <signal>clicked()</signal>
+ <receiver>CoverpageForm_base</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection>
+ <sender>prevCoverpageButton</sender>
+ <signal>clicked()</signal>
+ <receiver>CoverpageForm_base</receiver>
+ <slot>prevCoverpageButton_clicked()</slot>
+ </connection>
+ <connection>
+ <sender>nextCoverpageButton</sender>
+ <signal>clicked()</signal>
+ <receiver>CoverpageForm_base</receiver>
+ <slot>nextCoverpageButton_clicked()</slot>
+ </connection>
+ <connection>
+ <sender>preserveFormattingCheckBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>CoverpageForm_base</receiver>
+ <slot>preserveFormattingCheckBox_toggled(bool)</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>regardingTextEdit</tabstop>
+ <tabstop>messageTextEdit</tabstop>
+ <tabstop>pushButton10</tabstop>
+ <tabstop>pushButton9</tabstop>
+</tabstops>
+<includes>
+ <include location="local" impldecl="in implementation">coverpageform_base.ui.h</include>
+</includes>
+<slots>
+ <slot>coverpageListBox_currentChanged( QListBoxItem * )</slot>
+ <slot>prevCoverpageButton_clicked()</slot>
+ <slot>nextCoverpageButton_clicked()</slot>
+ <slot>preserveFormattingCheckBox_toggled( bool )</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/ui/deviceuricombobox.py b/ui/deviceuricombobox.py
new file mode 100644
index 0000000..4cf7e9c
--- /dev/null
+++ b/ui/deviceuricombobox.py
@@ -0,0 +1,159 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2001-2011 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Sarbeswar Meher
+#
+
+# Std Lib
+
+# Local
+from base.g import *
+from ui_utils import *
+from base import device, utils
+
+# Qt3
+from qt import *
+
+DEVICEURICOMBOBOX_TYPE_PRINTER_ONLY = 0
+DEVICEURICOMBOBOX_TYPE_FAX_ONLY = 1
+DEVICEURICOMBOBOX_TYPE_PRINTER_AND_FAX = 2
+
+
+class DeviceUriComboBox(QWidget):
+ def __init__(self, parent):
+ QWidget.__init__(self, parent)
+ self.device_uri = ''
+ self.initial_device = None
+ self.updating = False
+ self.typ = DEVICEURICOMBOBOX_TYPE_PRINTER_ONLY
+ self.filter = None
+ self.devices = None
+
+ self.user_settings = utils.UserSettings()
+ self.user_settings.load()
+ self.user_settings.debug()
+
+ self.initUi()
+
+
+ def initUi(self):
+ HBoxLayout = QHBoxLayout(self)
+ HBoxLayout.setName("HBoxLayout")
+
+ self.NameLabel = QLabel(self)
+ self.NameLabel.setName("NameLabel")
+ HBoxLayout.addWidget(self.NameLabel)
+
+ SpacerItem = QSpacerItem(20, 20, QSizePolicy.Minimum, QSizePolicy.Minimum)
+ HBoxLayout.addItem(SpacerItem)
+
+ self.ComboBox = QComboBox(self)
+ sizePolicy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Preferred)
+ sizePolicy.setHorStretch(0)
+ sizePolicy.setVerStretch(0)
+ sizePolicy.setHeightForWidth(self.ComboBox.sizePolicy().hasHeightForWidth())
+ self.ComboBox.setSizePolicy(sizePolicy)
+ self.ComboBox.setName("ComboBox")
+ HBoxLayout.addWidget(self.ComboBox)
+
+ self.NameLabel.setText(self.__tr("Device:"))
+
+# self.connect(self.ComboBox, SIGNAL("currentIndexChanged(const QString &)"), self, self.ComboBox_currentIndexChanged)
+
+ self.connect(self.ComboBox, SIGNAL("highlighted(const QString &)"), self.ComboBox_currentIndexChanged)
+
+
+ def setType(self, typ):
+ if typ in (DEVICEURICOMBOBOX_TYPE_PRINTER_ONLY,
+ DEVICEURICOMBOBOX_TYPE_FAX_ONLY,
+ DEVICEURICOMBOBOX_TYPE_PRINTER_AND_FAX):
+ self.typ = typ
+
+
+ def setFilter(self, filter):
+ self.filter = filter
+
+
+ def setInitialDevice(self, device_uri):
+ self.initial_device = device_uri
+
+ def setParent(self, parent):
+ self.parent = parent
+
+ def setDevices(self):
+ if self.typ == DEVICEURICOMBOBOX_TYPE_PRINTER_ONLY:
+ be_filter = ['hp']
+
+ elif self.typ == DEVICEURICOMBOBOX_TYPE_FAX_ONLY:
+ be_filter = ['hpfax']
+ self.NameLabel.setText(self.__tr("Fax Device:"))
+
+ else: # DEVICEURICOMBOBOX_TYPE_PRINTER_AND_FAX
+ be_filter = ['hp', 'hpfax']
+
+ self.devices = device.getSupportedCUPSDevices(be_filter, self.filter)
+ return len(self.devices)
+
+
+ def updateUi(self):
+ if self.devices is None:
+ num_devices = self.setDevices()
+
+ self.device_index = {}
+
+ if self.devices:
+ if self.initial_device is None:
+ #self.initial_device = user_conf.get('last_used', 'device_uri')
+ self.initial_device = self.user_settings.last_used_device_uri
+
+ self.updating = True
+ try:
+ k = 0
+ str_devices = self.devices.keys()
+ d = str(str_devices[0])
+ for i in range(0, num_devices):
+ self.ComboBox.insertItem(str_devices[i], i)
+ if self.initial_device is not None and d == self.initial_device:
+ self.initial_device = None
+ k = i
+
+ self.ComboBox.setCurrentItem(-1)
+ finally:
+ self.updating = False
+
+ self.ComboBox.setCurrentItem(k)
+
+ else:
+ self.parent.DeviceUriComboBox_noDevices()
+
+
+ def ComboBox_currentIndexChanged(self, t):
+ if self.updating:
+ return
+
+ self.device_uri = unicode(t)
+ if self.device_uri:
+ #user_conf.set('last_used', 'device_uri', self.device_uri)
+ self.user_settings.last_used_device_uri = self.device_uri
+ self.user_settings.save()
+
+ self.parent.DeviceUriComboBox_currentChanged(self.device_uri)
+
+
+ def __tr(self,s,c = None):
+ return qApp.translate("DeviceUriComboBox",s,c)
diff --git a/ui/devmgr4.py b/ui/devmgr4.py
new file mode 100644
index 0000000..8a33558
--- /dev/null
+++ b/ui/devmgr4.py
@@ -0,0 +1,3258 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2001-2009 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Authors: Don Welch, Pete Parks, Naga Samrat Chowdary Narla,
+#
+
+from __future__ import generators
+
+# Std Lib
+import sys
+import time
+import os
+import gzip
+import select
+import struct
+import threading
+import Queue
+
+# Local
+from base.g import *
+from base import device, utils, pml, maint, pkit
+from prnt import cups
+from base.codes import *
+from ui_utils import load_pixmap
+from installer.core_install import *
+
+# Qt
+from qt import *
+
+# Main form
+from devmgr4_base import DevMgr4_base
+
+# Scrollviews
+from scrollview import ScrollView
+from scrollprintsettings import ScrollPrintSettingsView
+
+# Alignment and ColorCal forms
+from alignform import AlignForm
+from aligntype6form1 import AlignType6Form1
+from aligntype6form2 import AlignType6Form2
+from paperedgealignform import PaperEdgeAlignForm
+from colorcalform import ColorCalForm # Type 1 color cal
+from coloradjform import ColorAdjForm # Type 5 and 6 color adj
+from colorcalform2 import ColorCalForm2 # Type 2 color cal
+from colorcal4form import ColorCal4Form # Type 4 color cal
+from align10form import Align10Form # Type 10 and 11 alignment
+from align13form import Align13Form # Type 13 alignment
+
+# Misc forms
+from loadpaperform import LoadPaperForm
+from settingsdialog import SettingsDialog
+from aboutdlg import AboutDlg
+from cleaningform import CleaningForm
+from cleaningform2 import CleaningForm2
+from waitform import WaitForm
+from faxsettingsform import FaxSettingsForm
+from nodevicesform import NoDevicesForm
+from settingsdialog import SettingsDialog
+from firmwaredialog import FirmwareDialog
+
+# all in seconds
+MIN_AUTO_REFRESH_RATE = 5
+MAX_AUTO_REFRESH_RATE = 60
+DEF_AUTO_REFRESH_RATE = 30
+
+
+devices = {} # { Device_URI : device.Device(), ... }
+devices_lock = threading.RLock()
+
+RESPONSE_START = 1
+RESPONSE_DONE = 2
+
+# ***********************************************************************************
+#
+# LISTVIEW/UTILITY UI CLASSES
+#
+# ***********************************************************************************
+
+class IconViewToolTip(QToolTip):
+ def __init__(self, parent, tooltip_text):
+ QToolTip.__init__(self, parent.viewport())
+ self.parent = parent
+
+
+ def maybeTip(self, pos):
+ abs_coords = QPoint(pos.x() + self.parent.contentsX(),
+ pos.y() + self.parent.contentsY())
+
+ item = self.parent.findItem(abs_coords)
+
+ if item is not None and item.tooltip_text:
+ rel_coords = QRect()
+ rel_coords.setX(pos.x())
+ rel_coords.setY(pos.y())
+ i = item.rect()
+ rel_coords.setWidth(i.width())
+ rel_coords.setHeight(i.height())
+ self.tip(rel_coords, item.tooltip_text)
+
+
+
+class FuncViewItem(QIconViewItem):
+ def __init__(self, parent, text, pixmap, tooltip_text, cmd):
+ QIconViewItem.__init__(self, parent, text, pixmap)
+ self.tooltip_text = tooltip_text
+ self.cmd = cmd
+
+ self.tooltip = IconViewToolTip(parent, tooltip_text)
+
+
+
+class DeviceViewItem(QIconViewItem):
+ def __init__(self, parent, text, pixmap, device_uri, is_avail=True):
+ QIconViewItem.__init__(self, parent, text, pixmap)
+ self.device_uri = device_uri
+ self.is_avail = is_avail
+
+
+
+class SuppliesListViewItem(QListViewItem):
+ def __init__(self, parent, pixmap, desc, part_no, level_pixmap, status):
+ QListViewItem.__init__(self, parent, '', desc, part_no, '', status)
+ if pixmap is not None:
+ self.setPixmap(0, pixmap)
+ if level_pixmap is not None:
+ self.setPixmap(3, level_pixmap)
+
+ def paintCell(self, p, cg, c, w, a):
+ color = QColorGroup(cg)
+ pos = self.listView().itemPos(self)
+ h = self.totalHeight()
+
+ if (pos/h) % 2:
+ color.setColor(QColorGroup.Base, QColor(220, 228, 249))
+
+ QListViewItem.paintCell(self, p, color, c, w, a)
+
+
+
+class PasswordDialog(QDialog):
+ def __init__(self,prompt, parent=None, name=None, modal=0, fl=0):
+ QDialog.__init__(self,parent,name,modal,fl)
+ self.prompt = prompt
+
+ if not name:
+ self.setName("PasswordDialog")
+
+ passwordDlg_baseLayout = QGridLayout(self,1,1,11,6,"passwordDlg_baseLayout")
+
+ self.promptTextLabel = QLabel(self,"promptTextLabel")
+ passwordDlg_baseLayout.addMultiCellWidget(self.promptTextLabel,0,0,0,1)
+
+ self.usernameTextLabel = QLabel(self,"usernameTextLabel")
+ passwordDlg_baseLayout.addMultiCellWidget(self.usernameTextLabel,1,1,0,1)
+
+ self.usernameLineEdit = QLineEdit(self,"usernameLineEdit")
+ self.usernameLineEdit.setEchoMode(QLineEdit.Normal)
+ passwordDlg_baseLayout.addMultiCellWidget(self.usernameLineEdit,1,1,1,2)
+
+ self.passwordTextLabel = QLabel(self,"passwordTextLabel")
+ passwordDlg_baseLayout.addMultiCellWidget(self.passwordTextLabel,2,2,0,1)
+
+ self.passwordLineEdit = QLineEdit(self,"passwordLineEdit")
+ self.passwordLineEdit.setEchoMode(QLineEdit.Password)
+ passwordDlg_baseLayout.addMultiCellWidget(self.passwordLineEdit,2,2,1,2)
+
+ self.okPushButton = QPushButton(self,"okPushButton")
+ passwordDlg_baseLayout.addWidget(self.okPushButton,3,2)
+
+ self.languageChange()
+
+ self.resize(QSize(420,163).expandedTo(self.minimumSizeHint()))
+ self.clearWState(Qt.WState_Polished)
+
+ self.connect(self.okPushButton,SIGNAL("clicked()"),self.accept)
+ self.connect(self.passwordLineEdit,SIGNAL("returnPressed()"),self.accept)
+ def getUsername(self):
+ return unicode(self.usernameLineEdit.text())
+
+ def getPassword(self):
+ return unicode(self.passwordLineEdit.text())
+
+ def languageChange(self):
+ self.setCaption(self.__tr("HP Device Manager - Enter Username/Password"))
+ self.promptTextLabel.setText(self.__tr(self.prompt))
+ self.usernameTextLabel.setText(self.__tr("Username"))
+ self.passwordTextLabel.setText(self.__tr("Password"))
+ self.okPushButton.setText(self.__tr("OK"))
+
+ def __tr(self,s,c = None):
+ return qApp.translate("PasswordDialog",s,c)
+
+
+
+class ScrollDialog(QDialog):
+ def __init__(self, scrollview_cls, cur_device, cur_printer, service,
+ parent = None, name=None, modal=0, fl=0):
+
+ QDialog.__init__(self,parent,name,modal,fl)
+
+ if not name:
+ self.setName("ScrollDialog")
+
+ self.setSizeGripEnabled(1)
+ ScrollDialogLayout = QGridLayout(self,1,1,11,6,"ScrollDialogLayout")
+ Layout1 = QHBoxLayout(None,0,6,"Layout1")
+ Horizontal_Spacing2 = QSpacerItem(20,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ Layout1.addItem(Horizontal_Spacing2)
+ self.buttonOk = QPushButton(self,"buttonOk")
+ self.buttonOk.setAutoDefault(1)
+ self.buttonOk.setDefault(1)
+ Layout1.addWidget(self.buttonOk)
+ ScrollDialogLayout.addLayout(Layout1,1,0)
+
+ self.scrollview = scrollview_cls(service, self)
+ ScrollDialogLayout.addWidget(self.scrollview,0,0)
+
+ self.scrollview.onDeviceChange(cur_device)
+ self.scrollview.onPrinterChange(cur_printer)
+ self.languageChange()
+
+ self.resize(QSize(520,457).expandedTo(self.minimumSizeHint()))
+ self.clearWState(Qt.WState_Polished)
+ self.connect(self.buttonOk,SIGNAL("clicked()"),self.accept)
+
+
+ def languageChange(self):
+ self.setCaption(self.__tr("HP Device Manager"))
+ self.buttonOk.setText(self.__tr("Close"))
+ self.buttonOk.setAccel(QKeySequence(QString.null))
+
+ def __tr(self,s,c = None):
+ return qApp.translate("ScrollDialog",s,c)
+
+
+def showPasswordUI(prompt):
+ try:
+ dlg = PasswordDialog(prompt, None)
+
+ if dlg.exec_loop() == QDialog.Accepted:
+ return (dlg.getUsername(), dlg.getPassword())
+
+ finally:
+ pass
+
+ return ("", "")
+
+
+class StatusListViewItem(QListViewItem):
+ def __init__(self, parent, pixmap, ess, tt, event_code, job_id, username):
+ QListViewItem.__init__(self, parent, '', ess, tt, event_code, job_id, username)
+ self.setPixmap(0, pixmap)
+
+ def paintCell(self, p, cg, c, w, a):
+ color = QColorGroup(cg)
+ pos = self.listView().itemPos(self)
+ h = self.totalHeight()
+ row = pos/2
+
+ if row % 2:
+ color.setColor(QColorGroup.Base, QColor(220, 228, 249))
+
+ QListViewItem.paintCell(self, p, color, c, w, a)
+
+
+
+class JobListViewItem(QCheckListItem):
+ def __init__(self, parent, pixmap, desc, status, job_id):
+ QCheckListItem.__init__(self, parent, '', QCheckListItem.CheckBox)
+ self.job_id = job_id
+ self.setPixmap(1, pixmap)
+ self.setText(2, desc)
+ self.setText(3, status)
+ self.setText(4, job_id)
+
+ def paintCell(self, p, cg, c, w, a):
+ color = QColorGroup(cg)
+ pos = self.listView().itemPos(self)
+ h = self.totalHeight()
+
+ if (pos/h) % 2:
+ color.setColor(QColorGroup.Base, QColor(220, 228, 249))
+
+ QCheckListItem.paintCell(self, p, color, c, w, a)
+
+
+
+class JobInfoDialog(QDialog):
+ def __init__(self, text, parent=None, name=None, modal=0, fl=0):
+ QDialog.__init__(self, parent, name, modal, fl)
+
+ if not name:
+ self.setName("JobInfoDialog")
+
+ Form1Layout = QGridLayout(self,1,1,11,6,"Form1Layout")
+ spacer6 = QSpacerItem(371,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ Form1Layout.addItem(spacer6,1,0)
+ self.pushButton4 = QPushButton(self,"pushButton4")
+ Form1Layout.addWidget(self.pushButton4,1,1)
+ self.textEdit = QTextEdit(self,"textEdit")
+ Form1Layout.addMultiCellWidget(self.textEdit,0,0,0,1)
+
+ self.languageChange()
+
+ self.resize(QSize(571,542).expandedTo(self.minimumSizeHint()))
+ self.clearWState(Qt.WState_Polished)
+
+ self.connect(self.pushButton4,SIGNAL("clicked()"),self.close)
+
+ self.textEdit.setText(text)
+
+
+ def languageChange(self):
+ self.setCaption(self.__tr("HP Device Manager - Job Log"))
+ self.pushButton4.setText(self.__tr("Close"))
+
+
+ def __tr(self,s,c = None):
+ return qApp.translate("JobInfoDialog",s,c)
+
+
+# ***********************************************************************************
+#
+# DEVICE UPDATE THREAD
+#
+# ***********************************************************************************
+
+
+class UpdateThread(QThread):
+ def __init__(self, response_queue=None, request_queue=None):
+ self.response_queue = response_queue # update queue -> main window
+ self.request_queue = request_queue # main window -> update queue
+
+ QThread.__init__(self)
+
+ def run(self):
+ while True:
+ dev = self.request_queue.get(True)
+
+ if dev is None:
+ log.debug("Update thread: exit")
+ break
+
+ log.debug("Update thread start: %s" % dev.device_uri)
+
+ try:
+ #print "THREAD LOCK ACQUIRE"
+ devices_lock.acquire()
+ #print "THREAD LOCK ACQUIRE - OK"
+ self.response_queue.put((RESPONSE_START, dev.device_uri))
+ log.debug(log.bold("Update: %s %s %s" % ("*"*20, dev.device_uri, "*"*20)))
+
+ if dev.supported:
+ try:
+ dev.open()
+ except Error, e:
+ log.warn(e.msg)
+
+ time.sleep(0.1)
+
+ if dev.device_state == DEVICE_STATE_NOT_FOUND:
+ dev.error_state = ERROR_STATE_ERROR
+ else:
+ try:
+ dev.queryDevice()
+
+ except Error, e:
+ log.error("Query device error (%s)." % e.msg)
+ dev.error_state = ERROR_STATE_ERROR
+
+ finally:
+ dev.close()
+ #print "THREAD LOCK RELEASE"
+ devices_lock.release()
+
+ log.debug("Device state = %d" % dev.device_state)
+ log.debug("Status code = %d" % dev.status_code)
+ log.debug("Error state = %d" % dev.error_state)
+
+ log.debug("Update thread end: %s" % dev.device_uri)
+
+ self.response_queue.put((RESPONSE_DONE, dev.device_uri))
+
+
+# ***********************************************************************************
+#
+# MAINWINDOW
+#
+# ***********************************************************************************
+
+class DevMgr4(DevMgr4_base):
+ def __init__(self, read_pipe=None, toolbox_version='0.0',
+ initial_device_uri=None, disable_dbus=False,
+ parent=None, name=None, fl = 0):
+
+
+ # Distro insformation
+ core = CoreInstall(MODE_CHECK)
+# core.init()
+ self.Is_autoInstaller_distro = core.is_auto_installer_support()
+ self.Latest_ver= user_conf.get('upgrade', 'latest_available_version')
+ installed_version=sys_conf.get('hplip','version')
+ if utils.Is_HPLIP_older_version(installed_version, self.Latest_ver):
+ DevMgr4_base.__init__(self, parent, name, fl,self.Latest_ver,self.Is_autoInstaller_distro)
+ else:
+ self.Latest_ver = ""
+ DevMgr4_base.__init__(self, parent, name, fl,self.Latest_ver,self.Is_autoInstaller_distro)
+ log.debug("Initializing toolbox UI (Qt3)...")
+ log.debug("HPLIP Version: %s" % prop.installed_version)
+
+ self.disable_dbus = disable_dbus
+ self.toolbox_version = toolbox_version
+ self.cur_device_uri = user_conf.get('last_used', 'device_uri')
+ self.device_vars = {}
+ self.num_devices = 0
+ self.cur_device = None
+ self.rescanning = False
+ self.initial_device_uri = initial_device_uri
+
+ # dbus setup
+ if not self.disable_dbus:
+ self.dbus_avail, self.service, session_bus = device.init_dbus()
+
+ if not self.dbus_avail:
+ self.FailureUI("<b>Error</b><p>hp-systray must be running to get device status. hp-systray requires dbus support. Device status will not be available.")
+ else:
+ log.debug("dbus enabled")
+
+ else:
+ log.debug("dbus disabled")
+ self.dbus_avail, self.service = False, None
+
+
+ # Update thread setup
+ self.request_queue = Queue.Queue()
+ self.response_queue = Queue.Queue()
+ self.update_thread = UpdateThread(self.response_queue, self.request_queue)
+ self.update_thread.start()
+
+ # Pipe from toolbox/dbus setup
+ self.fmt = "80s80sI32sI80sf"
+ self.fmt_size = struct.calcsize(self.fmt)
+
+ if read_pipe is not None and not disable_dbus:
+ log.debug("Setting up read_pipe")
+ self.notifier = QSocketNotifier(read_pipe, QSocketNotifier.Read)
+ QObject.connect(self.notifier, SIGNAL("activated(int)"), self.notifier_activated)
+
+ # Application icon
+ self.setIcon(load_pixmap('hp_logo', '128x128'))
+
+ # User settings
+ self.user_settings = utils.UserSettings()
+ self.cmd_fab = self.user_settings.cmd_fab
+ log.debug("FAB command: %s" % self.cmd_fab)
+
+ if not self.user_settings.auto_refresh:
+ self.autoRefresh.toggle()
+
+ # Other initialization
+ self.InitPixmaps()
+ self.InitMisc()
+ self.InitUI()
+
+ cups.setPasswordCallback(showPasswordUI)
+
+ if not prop.doc_build:
+ self.helpContentsAction.setEnabled(False)
+
+ self.allow_auto_refresh = True
+ QTimer.singleShot(0, self.InitialUpdate)
+
+
+ # ***********************************************************************************
+ #
+ # INIT
+ #
+ # ***********************************************************************************
+
+ def InitPixmaps(self):
+ self.func_icons_cached = False
+ self.func_icons = {}
+ self.device_icons = {}
+
+ # TODO: Use Qt pixmap cache for all pixmaps?
+
+ # Device icon list overlays
+ self.warning_pix = load_pixmap('warning', '16x16')
+ self.error_pix = load_pixmap('error', '16x16')
+ self.ok_pix = load_pixmap('ok', '16x16')
+ self.lowink_pix = load_pixmap('inkdrop', '16x16')
+ self.lowtoner_pix = load_pixmap('toner', '16x16')
+ self.busy_pix = load_pixmap('busy', '16x16')
+ self.lowpaper_pix = load_pixmap('paper', '16x16')
+ self.refresh_pix = load_pixmap('refresh', '16x16')
+ self.refresh1_pix = load_pixmap('refresh1', '16x16')
+ self.fax_icon = load_pixmap('fax2', 'other')
+ self.idle_pix = load_pixmap('idle', '16x16')
+ self.scan_pix = load_pixmap("scan", '16x16')
+ self.print_pix = load_pixmap("print", '16x16')
+ self.sendfax_pix =load_pixmap("fax", '16x16')
+ self.pcard_pix = load_pixmap("pcard", '16x16')
+ self.makecopies_pix = load_pixmap("makecopies", '16x16')
+ self.help_pix = load_pixmap("help", '16x16')
+
+
+ # pixmaps: (inkjet, laserjet)
+ self.SMALL_ICONS = { ERROR_STATE_CLEAR : (None, None),
+ ERROR_STATE_BUSY : (self.busy_pix, self.busy_pix),
+ ERROR_STATE_ERROR : (self.error_pix, self.error_pix),
+ ERROR_STATE_LOW_SUPPLIES : (self.lowink_pix, self.lowtoner_pix),
+ ERROR_STATE_OK : (self.ok_pix, self.ok_pix),
+ ERROR_STATE_WARNING : (self.warning_pix, self.warning_pix),
+ ERROR_STATE_LOW_PAPER: (self.lowpaper_pix, self.lowpaper_pix),
+ ERROR_STATE_PRINTING : (self.busy_pix, self.busy_pix),
+ ERROR_STATE_SCANNING : (self.busy_pix, self.busy_pix),
+ ERROR_STATE_PHOTOCARD : (self.busy_pix, self.busy_pix),
+ ERROR_STATE_FAXING : (self.busy_pix, self.busy_pix),
+ ERROR_STATE_COPYING : (self.busy_pix, self.busy_pix),
+ ERROR_STATE_REFRESHING : (self.refresh1_pix, self.refresh1_pix),
+ }
+
+ self.STATUS_ICONS = { ERROR_STATE_CLEAR : (self.idle_pix, self.idle_pix),
+ ERROR_STATE_BUSY : (self.busy_pix, self.busy_pix),
+ ERROR_STATE_ERROR : (self.error_pix, self.error_pix),
+ ERROR_STATE_LOW_SUPPLIES : (self.lowink_pix, self.lowtoner_pix),
+ ERROR_STATE_OK : (self.ok_pix, self.ok_pix),
+ ERROR_STATE_WARNING : (self.warning_pix, self.warning_pix),
+ ERROR_STATE_LOW_PAPER: (self.lowpaper_pix, self.lowpaper_pix),
+ ERROR_STATE_PRINTING : (self.print_pix, self.print_pix),
+ ERROR_STATE_SCANNING : (self.scan_pix, self.scan_pix),
+ ERROR_STATE_PHOTOCARD : (self.pcard_pix, self.print_pix),
+ ERROR_STATE_FAXING : (self.sendfax_pix, self.sendfax_pix),
+ ERROR_STATE_COPYING : (self.makecopies_pix, self.makecopies_pix),
+ }
+
+
+
+ def InitUI(self):
+ # Setup device icon list
+ self.DeviceList.setAutoArrange(True)
+ self.DeviceList.setSorting(True)
+
+ # Setup main menu
+ self.deviceRescanAction.setIconSet(QIconSet(self.refresh1_pix))
+ self.deviceRefreshAll.setIconSet(QIconSet(self.refresh_pix))
+ self.deviceInstallAction.setIconSet(QIconSet(load_pixmap('list_add', '16x16')))
+ self.deviceRemoveAction.setIconSet(QIconSet(load_pixmap('list_remove', '16x16')))
+ self.settingsConfigure.setIconSet(QIconSet(load_pixmap('settings', '16x16')))
+ self.helpContentsAction.setIconSet(QIconSet(self.help_pix))
+
+ # Setup toolbar
+ self.deviceRescanAction.addTo(self.Toolbar)
+ self.deviceRefreshAll.addTo(self.Toolbar)
+ self.Toolbar.addSeparator()
+ self.deviceInstallAction.addTo(self.Toolbar)
+ self.deviceRemoveAction.addTo(self.Toolbar)
+ self.Toolbar.addSeparator()
+ self.settingsConfigure.addTo(self.Toolbar)
+ self.helpContentsAction.addTo(self.Toolbar)
+
+ # Init tabs/controls
+ self.InitFuncsTab()
+ self.InitStatusTab()
+ self.InitSuppliesTab()
+ self.InitPrintSettingsTab()
+ self.InitPrintControlTab()
+
+ # Resize the splitter so that the device list starts as a single column
+ self.splitter2.setSizes([120, 700])
+
+
+
+ def InitMisc(self):
+ self.unit_names = { "year" : (self.__tr("year"), self.__tr("years")),
+ "month" : (self.__tr("month"), self.__tr("months")),
+ "week" : (self.__tr("week"), self.__tr("weeks")),
+ "day" : (self.__tr("day"), self.__tr("days")),
+ "hour" : (self.__tr("hour"), self.__tr("hours")),
+ "minute" : (self.__tr("minute"), self.__tr("minutes")),
+ "second" : (self.__tr("second"), self.__tr("seconds")),
+ }
+
+ self.num_repr = { 1 : self.__tr("one"),
+ 2 : self.__tr("two"),
+ 3 : self.__tr("three"),
+ 4 : self.__tr("four"),
+ 5 : self.__tr("five"),
+ 6 : self.__tr("six"),
+ 7 : self.__tr("seven"),
+ 8 : self.__tr("eight"),
+ 9 : self.__tr("nine"),
+ 10 : self.__tr("ten"),
+ 11 : self.__tr("eleven"),
+ 12 : self.__tr("twelve")
+ }
+
+ if self.Latest_ver is "":
+ self.TabIndex = { self.FunctionsTab: self.UpdateFuncsTab,
+ self.StatusTab: self.UpdateStatusTab,
+ self.SuppliesTab: self.UpdateSuppliesTab,
+ self.PrintSettingsTab: self.UpdatePrintSettingsTab,
+ self.PrintJobsTab: self.UpdatePrintControlTab,
+ }
+ else:
+ self.TabIndex = { self.FunctionsTab: self.UpdateFuncsTab,
+ self.StatusTab: self.UpdateStatusTab,
+ self.SuppliesTab: self.UpdateSuppliesTab,
+ self.PrintSettingsTab: self.UpdatePrintSettingsTab,
+ self.PrintJobsTab: self.UpdatePrintControlTab,
+ self.UpgradeTab:self.UpdateUpgradeTab,
+ }
+
+
+
+ def InitialUpdate(self):
+ self.RescanDevices()
+
+ cont = True
+ if self.initial_device_uri is not None:
+ if not self.ActivateDevice(self.initial_device_uri):
+ log.error("Device %s not found" % self.initial_device_uri)
+ cont = False
+
+ self.refresh_timer = QTimer(self, "RefreshTimer")
+ self.connect(self.refresh_timer, SIGNAL('timeout()'), self.TimedRefresh)
+
+ if MIN_AUTO_REFRESH_RATE <= self.user_settings.auto_refresh_rate <= MAX_AUTO_REFRESH_RATE:
+ self.refresh_timer.start(self.user_settings.auto_refresh_rate * 1000)
+
+ self.update_timer = QTimer(self)
+ self.connect(self.update_timer, SIGNAL("timeout()"), self.ThreadUpdate)
+ self.update_timer.start(500)
+
+
+ def ActivateDevice(self, device_uri):
+ log.debug(log.bold("Activate: %s %s %s" % ("*"*20, device_uri, "*"*20)))
+ d = self.DeviceList.firstItem()
+ found = False
+
+ while d is not None:
+ if d.device_uri == device_uri:
+ found = True
+ self.DeviceList.setSelected(d, True)
+ self.DeviceList.setCurrentItem(d)
+ break
+
+ d = d.nextItem()
+
+ return found
+
+
+
+ # ***********************************************************************************
+ #
+ # UPDATES/NOTIFICATIONS
+ #
+ # ***********************************************************************************
+
+ def notifier_activated(self, sock): # dbus message has arrived
+ m = ''
+ while True:
+ ready = select.select([sock], [], [], 0.1)
+
+ if ready[0]:
+ m = ''.join([m, os.read(sock, self.fmt_size)])
+ if len(m) == self.fmt_size:
+ if self.cur_device is None or self.rescanning:
+ return
+
+ event = device.Event(*struct.unpack(self.fmt, m))
+ desc = device.queryString(event.event_code)
+ error_state = STATUS_TO_ERROR_STATE_MAP.get(event.event_code, ERROR_STATE_CLEAR)
+ log.debug("Status event: %s (%d)" % (event.device_uri, event.event_code))
+
+ if event.event_code > EVENT_MAX_USER_EVENT:
+
+ if event.event_code == EVENT_HISTORY_UPDATE: # 9003
+ log.debug("History update: %s" % event.device_uri)
+
+ if not self.rescanning:
+ dev = self.findDeviceByURI(event.device_uri)
+
+ self.UpdateHistory(dev)
+ self.UpdateDevice(dev)
+
+ elif event.event_code == EVENT_CUPS_QUEUES_CHANGED:
+ pass
+
+ elif event.event_code == EVENT_RAISE_DEVICE_MANAGER: # 9001
+ log.debug("Raise requested")
+ self.showNormal()
+ self.setActiveWindow()
+ self.raiseW()
+
+ else:
+ log.debug("Ignored")
+
+ else:
+ break
+
+
+ def TimedRefresh(self):
+ if not self.rescanning and self.user_settings.auto_refresh and self.allow_auto_refresh:
+ log.debug("Refresh timer...")
+ self.CleanupChildren()
+
+ if self.user_settings.auto_refresh_type == 0:
+ self.RequestDeviceUpdate()
+ else:
+ self.RescanDevices()
+
+
+ def ThreadUpdate(self): # periodically check for updates from update thread
+ if not self.response_queue.empty():
+ response_code, device_uri = self.response_queue.get()
+
+ if response_code == RESPONSE_START:
+ self.statusBar().message(self.__tr("Updating %1...").arg(device_uri))
+ qApp.processEvents()
+
+ elif response_code == RESPONSE_DONE:
+ self.statusBar().message(QString("%1 (%2)").arg(self.cur_device_uri).\
+ arg(', '.join(self.cur_device.cups_printers)))
+
+ dev = self.findDeviceByURI(device_uri)
+
+ if dev is not None:
+ self.UpdateHistory(dev)
+ self.UpdateDevice(dev)
+
+ qApp.processEvents()
+
+ if self.response_queue.empty() and self.request_queue.empty():
+ self.UpdateTitle()
+ # Disable thread timer until more items placed in request queue?
+
+
+ # ***********************************************************************************
+ #
+ # TAB/DEVICE CHANGE SLOTS
+ #
+ # ***********************************************************************************
+
+ def Tabs_currentChanged(self, tab=None):
+ """ Called when the active tab changes.
+ Update newly displayed tab.
+ """
+
+ if tab is None:
+ tab = self.Tabs.currentPage()
+
+ try:
+ self.TabIndex[tab]()
+ except AttributeError:
+ pass
+
+ def Tabs_deviceChanged(self, tab=None):
+ """ Called when the device changes.
+ Update the currently displayed tab.
+ """
+ if tab is None:
+ tab = self.Tabs.currentPage()
+
+ self.TabIndex[tab]()
+
+
+ # ***********************************************************************************
+ #
+ # DEVICE ICON LIST/DEVICE UPDATE(S)
+ #
+ # ***********************************************************************************
+
+ def DeviceList_onItem(self, a0):
+ pass
+
+
+ def deviceRescanAction_activated(self):
+ self.deviceRescanAction.setEnabled(False)
+ self.RequestDeviceUpdate()
+ self.deviceRescanAction.setEnabled(True)
+
+
+ def deviceRefreshAll_activated(self):
+ self.RescanDevices()
+
+
+ def DeviceList_clicked(self,a0):
+ pass
+
+
+ def CreatePixmap(self, dev=None):
+ if dev is None:
+ dev = self.cur_device
+
+ try:
+ dev.icon
+ except AttributeError:
+ dev.icon = "default_printer"
+
+ try:
+ self.device_icons[dev.icon]
+ except:
+ self.device_icons[dev.icon] = load_pixmap(dev.icon, 'devices')
+
+ pix = self.device_icons[dev.icon]
+
+ w, h = pix.width(), pix.height()
+ error_state = dev.error_state
+ icon = QPixmap(w, h)
+ p = QPainter(icon)
+ p.eraseRect(0, 0, icon.width(), icon.height())
+ p.drawPixmap(0, 0, pix)
+
+ try:
+ tech_type = dev.tech_type
+ except AttributeError:
+ tech_type = TECH_TYPE_NONE
+
+ if dev.device_type == DEVICE_TYPE_FAX:
+ p.drawPixmap(w - self.fax_icon.width(), 0, self.fax_icon)
+
+ if error_state != ERROR_STATE_CLEAR:
+ if tech_type in (TECH_TYPE_COLOR_INK, TECH_TYPE_MONO_INK):
+ status_icon = self.SMALL_ICONS[error_state][0] # ink
+ else:
+ status_icon = self.SMALL_ICONS[error_state][1] # laser
+
+ if status_icon is not None:
+ p.drawPixmap(0, 0, status_icon)
+
+ p.end()
+
+ return icon
+
+
+ def DeviceListRefresh(self):
+ global devices
+ log.debug("Rescanning device list...")
+
+ if not self.rescanning:
+ self.setCaption(self.__tr("Refreshing Device List - HP Device Manager"))
+ self.statusBar().message(self.__tr("Refreshing device list..."))
+
+ self.rescanning = True
+ self.cups_devices = device.getSupportedCUPSDevices(['hp', 'hpfax'])
+
+ devices_lock.acquire()
+
+ try:
+ adds = []
+ for d in self.cups_devices:
+ if d not in devices:
+ adds.append(d)
+
+ log.debug("Adds: %s" % ','.join(adds))
+
+ removals = []
+ for d in devices:
+ if d not in self.cups_devices:
+ removals.append(d)
+
+ log.debug("Removals (1): %s" % ','.join(removals))
+
+ updates = []
+ for d in devices:
+ if d not in adds and d not in removals:
+ updates.append(d)
+
+ log.debug("Updates: %s" % ','.join(updates))
+
+
+ for d in adds:
+ log.debug("adding: %s" % d)
+ try:
+ dev = device.Device(d, service=self.service, callback=self.callback,
+ disable_dbus=self.disable_dbus)
+ except Error:
+ log.error("Unexpected error in Device class.")
+ log.exception()
+
+ if not dev.supported:
+ log.debug("Unsupported model - removing device.")
+ removals.append(d)
+ continue
+
+ self.CheckForDeviceSettingsUI(dev)
+ icon = self.CreatePixmap(dev)
+
+ if dev.device_type == DEVICE_TYPE_FAX:
+ DeviceViewItem(self.DeviceList, self.__tr("%1 (Fax)").arg(dev.model_ui),
+ icon, d)
+ else:
+ if dev.fax_type:
+ DeviceViewItem(self.DeviceList, self.__tr("%1 (Printer)").arg(dev.model_ui),
+ icon, d)
+ else:
+ DeviceViewItem(self.DeviceList, dev.model_ui,
+ icon, d)
+
+ devices[d] = dev
+
+ log.debug("Removals (2): %s" % ','.join(removals))
+
+ for d in removals:
+ item = self.DeviceList.firstItem()
+ log.debug("removing: %s" % d)
+
+ try:
+ del devices[d]
+ except KeyError:
+ pass
+
+
+ while item is not None:
+ if item.device_uri == d:
+ self.DeviceList.takeItem(item)
+ break
+
+ item = item.nextItem()
+
+ qApp.processEvents()
+
+ self.DeviceList.adjustItems()
+ self.DeviceList.updateGeometry()
+ qApp.processEvents()
+
+ if len(devices):
+ for tab in self.TabIndex:
+ self.Tabs.setTabEnabled(tab, True)
+
+ if self.cur_device_uri:
+ item = first_item = self.DeviceList.firstItem()
+
+ while item is not None:
+ qApp.processEvents()
+ if item.device_uri == self.cur_device_uri:
+ self.DeviceList.setCurrentItem(item)
+ self.DeviceList.setSelected(item, True)
+ self.statusBar().message(self.cur_device_uri)
+ break
+
+ item = item.nextItem()
+
+ else:
+ self.cur_device = None
+ self.cur_device_uri = ''
+
+ if self.cur_device is None:
+ self.cur_device_uri = self.DeviceList.firstItem().device_uri
+ self.cur_device = devices[self.cur_device_uri]
+ self.DeviceList.setCurrentItem(self.DeviceList.firstItem())
+
+ self.Tabs.setTabEnabled(self.SuppliesTab, self.cur_device.device_type == DEVICE_TYPE_PRINTER and
+ self.cur_device.error_state != ERROR_STATE_ERROR)
+
+ self.UpdatePrinterCombos()
+
+ user_conf.set('last_used', 'device_uri', self.cur_device_uri)
+
+ for d in updates + adds:
+ if d not in removals:
+ self.RequestDeviceUpdate(devices[d])
+
+ else:
+ self.cur_device = None
+ self.deviceRescanAction.setEnabled(False)
+ self.deviceRemoveAction.setEnabled(False)
+ self.rescanning = False
+ self.statusBar().message(self.__tr("Press F6 to refresh."))
+
+ for tab in self.TabIndex:
+ self.Tabs.setTabEnabled(tab, False)
+
+ dlg = NoDevicesForm(self, "", True)
+ dlg.show()
+
+ finally:
+ self.rescanning = False
+ devices_lock.release()
+
+ self.deviceRescanAction.setEnabled(True)
+ self.deviceRemoveAction.setEnabled(True)
+
+
+
+ def UpdateTitle(self):
+ if self.cur_device.device_type == DEVICE_TYPE_FAX:
+ self.setCaption(self.__tr("HP Device Manager - %1 (Fax)").arg(self.cur_device.model_ui))
+ else:
+ if self.cur_device.fax_type:
+ self.setCaption(self.__tr("HP Device Manager - %1 (Printer)").arg(self.cur_device.model_ui))
+ else:
+ self.setCaption(self.__tr("HP Device Manager - %1").arg(self.cur_device.model_ui))
+
+
+ def UpdateDeviceByURI(self, device_uri):
+ return self.UpdateDevice(self.findDeviceByURI(device_uri))
+
+
+ def UpdateDevice(self, dev=None, update_tab=True):
+ """ Update the device icon and currently displayed tab.
+ """
+ if dev is None:
+ dev = self.cur_device
+
+ log.debug("UpdateDevice(%s)" % dev.device_uri)
+
+ item = self.findItem(dev)
+
+ if item is not None:
+ item.setPixmap(self.CreatePixmap(dev))
+
+ if dev is self.cur_device and dev.error_state == ERROR_STATE_ERROR:
+ self.Tabs.setCurrentPage(1)
+
+ if dev is self.cur_device and update_tab:
+ self.UpdatePrinterCombos()
+ self.TabIndex[self.Tabs.currentPage()]()
+
+ qApp.processEvents()
+
+
+ def DeviceList_currentChanged(self, i):
+ if i is not None: # and not self.rescanning:
+ self.cur_device_uri = self.DeviceList.currentItem().device_uri
+ self.cur_device = devices[self.cur_device_uri]
+ user_conf.set('last_used', 'device_uri', self.cur_device_uri)
+
+ self.Tabs.setTabEnabled(self.SuppliesTab, self.cur_device.device_type == DEVICE_TYPE_PRINTER and
+ self.cur_device.error_state != ERROR_STATE_ERROR)
+
+ self.UpdateDevice()
+ self.UpdateTitle()
+
+
+ def findItem(self, dev):
+ if dev is None:
+ dev = self.cur_device
+
+ return self.findItemByURI(dev.device_uri)
+
+
+ def findItemByURI(self, device_uri):
+ item = self.DeviceList.firstItem()
+
+ while item is not None:
+ if item.device_uri == device_uri:
+ return item
+ item = item.nextItem()
+
+
+ def findDeviceByURI(self, device_uri):
+ try:
+ return devices[device_uri]
+ except:
+ return None
+
+
+ def RequestDeviceUpdate(self, dev=None, item=None):
+ """ Submit device update request to update thread. """
+
+ if dev is None:
+ dev = self.cur_device
+
+ if dev is not None:
+ #log.debug("RequestDeviceUpdate(%s)" % dev.device_uri)
+ dev.error_state = ERROR_STATE_REFRESHING
+ self.UpdateDevice(dev, update_tab=False)
+ qApp.processEvents()
+
+ self.request_queue.put(dev)
+
+
+ def RescanDevices(self):
+ #log.debug("RescanDevices()")
+ if not self.rescanning:
+ self.deviceRefreshAll.setEnabled(False)
+ try:
+ self.DeviceListRefresh()
+ finally:
+ self.deviceRefreshAll.setEnabled(True)
+
+
+ def callback(self):
+ qApp.processEvents()
+
+
+ # ***********************************************************************************
+ #
+ # DEVICE LIST RIGHT CLICK
+ #
+ # ***********************************************************************************
+
+ def DeviceList_rightButtonClicked(self, item, pos):
+ popup = QPopupMenu(self)
+
+ if item is not None and item is self.DeviceList.currentItem():
+ if self.cur_device.error_state != ERROR_STATE_ERROR:
+ if self.cur_device.device_type == DEVICE_TYPE_PRINTER:
+ popup.insertItem(self.__tr("Print..."), self.PrintButton_clicked)
+
+ if self.cur_device.scan_type:
+ popup.insertItem(self.__tr("Scan..."), self.ScanButton_clicked)
+
+ if self.cur_device.pcard_type:
+ popup.insertItem(self.__tr("Access Photo Cards..."), self.PCardButton_clicked)
+
+ if self.cur_device.copy_type:
+ popup.insertItem(self.__tr("Make Copies..."), self.MakeCopiesButton_clicked)
+
+ elif self.cur_device.device_type == DEVICE_TYPE_FAX:
+ if self.cur_device.fax_type:
+ popup.insertItem(self.__tr("Send Fax..."), self.SendFaxButton_clicked)
+
+ popup.insertSeparator()
+
+ if self.cur_device.device_settings_ui is not None:
+ popup.insertItem(self.__tr("Device Settings..."), self.deviceSettingsButton_clicked)
+
+ if not self.rescanning:
+ popup.insertItem(self.__tr("Refresh Device"), self.deviceRescanAction_activated)
+
+ if not self.rescanning:
+ popup.insertItem(self.__tr("Refresh All"), self.deviceRefreshAll_activated)
+
+ popup.popup(pos)
+
+
+ # ***********************************************************************************
+ #
+ # PRINTER NAME COMBOS
+ #
+ # ***********************************************************************************
+
+ def updatePrinterList(self):
+ if self.cur_device is not None and \
+ self.cur_device.supported:
+
+ printers = cups.getPrinters()
+ self.cur_device.cups_printers = []
+
+ for p in printers:
+ if p.device_uri == self.cur_device_uri:
+ self.cur_device.cups_printers.append(p.name)
+
+
+ def UpdatePrinterCombos(self):
+ self.PrintSettingsPrinterCombo.clear()
+ self.PrintJobPrinterCombo.clear()
+
+ if self.cur_device is not None and \
+ self.cur_device.supported:
+
+ for c in self.cur_device.cups_printers:
+ self.PrintSettingsPrinterCombo.insertItem(c.decode("utf-8"))
+ self.PrintJobPrinterCombo.insertItem(c.decode("utf-8"))
+
+ self.cur_printer = unicode(self.PrintSettingsPrinterCombo.currentText())
+
+ def PrintSettingsPrinterCombo_activated(self, s):
+ self.cur_printer = unicode(s)
+ self.PrintJobPrinterCombo.setCurrentText(self.cur_printer.encode("latin1")) # TODO: ?
+ return self.PrinterCombo_activated(self.cur_printer)
+
+ def PrintJobPrinterCombo_activated(self, s):
+ self.cur_printer = unicode(s)
+ self.PrintSettingsPrinterCombo.setCurrentText(self.cur_printer.encode("latin1")) # TODO: ?
+ return self.PrinterCombo_activated(self.cur_printer)
+
+ def PrinterCombo_activated(self, printer):
+ self.TabIndex[self.Tabs.currentPage()]()
+ self.UpdatePrintSettingsTabPrinter()
+
+
+
+ # ***********************************************************************************
+ #
+ # FUNCTIONS/ACTION TAB
+ #
+ # ***********************************************************************************
+
+ def InitFuncsTab(self):
+ self.click_lock = None
+
+ def UpdateFuncsTab(self):
+ self.iconList.clear()
+
+ d = self.cur_device
+
+ if d is not None:
+
+ avail = d.device_state != DEVICE_STATE_NOT_FOUND and d.supported
+ fax = d.fax_type and prop.fax_build and d.device_type == DEVICE_TYPE_FAX and \
+ sys.hexversion >= 0x020300f0 and avail
+ printer = d.device_type == DEVICE_TYPE_PRINTER and avail
+ req_plugin = d.plugin == PLUGIN_REQUIRED
+ opt_plugin = d.plugin == PLUGIN_OPTIONAL
+
+ hplip_conf = ConfigParser.ConfigParser()
+ fp = open("/etc/hp/hplip.conf", "r")
+ hplip_conf.readfp(fp)
+ fp.close()
+
+ try:
+ plugin_installed = utils.to_bool(hplip_conf.get("hplip", "plugin"))
+ except ConfigParser.NoOptionError:
+ plugin_installed = False
+
+ if d.plugin:
+ if req_plugin and plugin_installed:
+ x = self.__tr("Download and install<br>required plugin (already installed).")
+
+ elif req_plugin and not plugin_installed:
+ x = self.__tr("Download and install<br>required plugin (needs installation).")
+
+ elif opt_plugin and plugin_installed:
+ x = self.__tr("Download and install<br>optional plugin (already installed).")
+
+ elif opt_plugin and not plugin_installed:
+ x = self.__tr("Download and install<br>optional plugin (needs installation).")
+
+ else:
+ x = ''
+
+
+ self.ICONS = [
+
+ # PRINTER
+
+ (lambda : printer, # filter func
+ self.__tr("Print"), # Text
+ "print", # Icon
+ self.__tr("Print documents or files."), # Tooltip
+ self.user_settings.cmd_print), # command/action
+
+ (lambda : d.scan_type and prop.scan_build and \
+ d.device_type == DEVICE_TYPE_PRINTER and avail,
+ self.__tr("Scan"),
+ "scan",
+ self.__tr("Scan a document, image, or photograph.<br>"),
+ self.user_settings.cmd_scan),
+
+ (lambda : d.copy_type and d.device_type == DEVICE_TYPE_PRINTER and avail,
+ self.__tr("Make Copies"),
+ "makecopies",
+ self.__tr("Make copies on the device controlled by the PC.<br>"),
+ self.user_settings.cmd_copy),
+
+ (lambda : d.pcard_type and d.device_type == DEVICE_TYPE_PRINTER and avail,
+ self.__tr("Unload Photo Card"),
+ "makecopies",
+ self.__tr("Copy images from the device's photo card to the PC."),
+ self.PCardButton_clicked),
+
+ # FAX
+
+ (lambda: fax,
+ self.__tr("Send Fax"),
+ "fax",
+ self.__tr("Send a fax from the PC."),
+ self.user_settings.cmd_fax),
+
+ (lambda: fax,
+ self.__tr("Fax Setup"),
+ "fax_setup",
+ self.__tr("Fax support must be setup before you can send faxes."),
+ self.faxSettingsButton_clicked),
+
+ (lambda: fax,
+ self.__tr("Fax Address Book"),
+ "fab",
+ self.__tr("Setup fax phone numbers to use when sending faxes from the PC."),
+ self.cmd_fab),
+
+ # SETTINGS/TOOLS
+
+ (lambda : self.cur_device.device_settings_ui is not None and avail,
+ self.__tr("Device Settings"),
+ "settings",
+ self.__tr("Your device has special device settings.<br>You may alter these settings here."),
+ self.deviceSettingsButton_clicked),
+
+ (lambda : printer,
+ self.__tr("Print Test Page"),
+ "testpage",
+ self.__tr("Print a test page to test the setup of your printer."),
+ self.PrintTestPageButton_clicked),
+
+ (lambda : True,
+ self.__tr("View Printer (Queue) Information"),
+ "cups",
+ self.__tr("View the printers (queues) installed in CUPS."),
+ self.viewPrinterInformation),
+
+ (lambda : True,
+ self.__tr("View Device Information"),
+ "info",
+ self.__tr("This information is primarily useful for <br>debugging and troubleshooting (advanced)."),
+ self.viewInformation),
+
+ (lambda: printer and d.align_type,
+ self.__tr("Align Cartridges (Print Heads)"),
+ "align",
+ self.__tr("This will improve the quality of output when a new cartridge is installed."),
+ self.AlignPensButton_clicked),
+
+ (lambda: printer and d.clean_type,
+ self.__tr("Clean Cartridges"),
+ "clean",
+ self.__tr("You only need to perform this action if you are<br>having problems with poor printout quality due to clogged ink nozzles."),
+ self.CleanPensButton_clicked),
+
+ (lambda: printer and d.color_cal_type and d.color_cal_type == COLOR_CAL_TYPE_TYPHOON,
+ self.__tr("Color Calibration"),
+ "colorcal",
+ self.__tr("Use this procedure to optimimize your printer's color output<br>(requires glossy photo paper)."),
+ self.ColorCalibrationButton_clicked),
+
+ (lambda: printer and d.color_cal_type and d.color_cal_type != COLOR_CAL_TYPE_TYPHOON,
+ self.__tr("Color Calibration"),
+ "colorcal",
+ self.__tr("Use this procedure to optimimize your printer's color output."),
+ self.ColorCalibrationButton_clicked),
+
+ (lambda: printer and d.linefeed_cal_type,
+ self.__tr("Line Feed Calibration"),
+ "linefeed_cal",
+ self.__tr("Use line feed calibration to optimize print quality<br>(to remove gaps in the printed output)."),
+ self.linefeedCalibration),
+
+ (lambda: printer and d.pq_diag_type,
+ self.__tr("Print Diagnostic Page"),
+ "pq_diag",
+ self.__tr("Your printer can print a test page <br>to help diagnose print quality problems."),
+ self.pqDiag),
+
+ # FIRMWARE
+
+ (lambda : printer and d.fw_download,
+ self.__tr("Download Firmware"),
+ "firmware",
+ self.__tr("Download firmware to your printer <br>(required on some devices after each power-up)."),
+ self.ShowFirmwareDlg),
+
+ # PLUGIN
+
+ (lambda : req_plugin,
+ self.__tr("Install Required Plugin"),
+ "plugin",
+ x, #self.__tr("Download and install the HPLIP plugin."),
+ self.downloadPlugin),
+
+ (lambda : opt_plugin,
+ self.__tr("Install Optional Plugin"),
+ "plugin",
+ x, #self.__tr("Download and install the HPLIP plugin."),
+ self.downloadPlugin),
+
+ # HELP/WEBSITE
+
+ (lambda : True,
+ self.__tr("Visit HPLIP Website"),
+ "hp_logo",
+ self.__tr("Visit HPLIP website."),
+ self.viewSupport),
+
+ (lambda : True,
+ self.__tr("Help"),
+ "help",
+ self.__tr("View HPLIP help."),
+ self.viewHelp),
+ ]
+
+ if not self.func_icons_cached:
+ for filter, text, icon, tooltip, cmd in self.ICONS:
+ self.func_icons[icon] = load_pixmap(icon, '32x32')
+ self.func_icons_cached = True
+
+ for filter, text, icon, tooltip, cmd in self.ICONS:
+ if filter is not None:
+ if not filter():
+ continue
+
+ FuncViewItem(self.iconList, text,
+ self.func_icons[icon],
+ tooltip,
+ cmd)
+
+
+ def downloadPlugin(self):
+ ok, sudo_ok = pkit.run_plugin_command(self.cur_device.plugin == PLUGIN_REQUIRED, self.cur_device.mq['plugin-reason'])
+ if not sudo_ok:
+ QMessageBox.critical(self,
+ self.caption(),
+ self.__tr("<b>Unable to find an appropriate su/sudo utility to run hp-plugin.</b><p>Install kdesu, gnomesu, or gksu.</p>"),
+ QMessageBox.Ok,
+ QMessageBox.NoButton,
+ QMessageBox.NoButton)
+ else:
+ self.UpdateFuncsTab()
+
+
+ def iconList_clicked(self, item):
+ return self.RunFuncCmd(item)
+
+
+ def RunFuncCmd(self, item):
+ if item is not None and self.click_lock is not item:
+ try:
+ item.cmd()
+ except TypeError:
+ self.RunCommand(item.cmd)
+
+ self.click_lock = item
+ QTimer.singleShot(1000, self.UnlockClick)
+
+
+ def UnlockClick(self):
+ self.click_lock = None
+
+
+ def RunFuncCmdContext(self):
+ return self.RunFuncCmd(self.iconList.currentItem())
+
+
+ def iconList_contextMenuRequested(self, item, pos):
+ if item is not None and item is self.iconList.currentItem():
+ popup = QPopupMenu(self)
+ popup.insertItem(self.__tr("Open..."), self.RunFuncCmdContext)
+ popup.popup(pos)
+
+
+ def iconList_returnPressed(self, item):
+ return self.RunFuncCmd(item)
+
+
+ def deviceSettingsButton_clicked(self):
+ try:
+ self.cur_device.open()
+ self.cur_device.device_settings_ui(self.cur_device, self)
+ finally:
+ self.cur_device.close()
+
+
+ def setupDevice_activated(self):
+ try:
+ self.cur_device.open()
+ self.cur_device.device_settings_ui(self.cur_device, self)
+ finally:
+ self.cur_device.close()
+
+
+ def PrintButton_clicked(self):
+ self.RunCommand(self.user_settings.cmd_print)
+
+
+ def ScanButton_clicked(self):
+ self.RunCommand(self.user_settings.cmd_scan)
+
+
+ def PCardButton_clicked(self):
+ if self.cur_device.pcard_type == PCARD_TYPE_MLC:
+ self.RunCommand(self.user_settings.cmd_pcard)
+
+ elif self.cur_device.pcard_type == PCARD_TYPE_USB_MASS_STORAGE:
+ self.FailureUI(self.__tr("<p><b>Photocards on your printer are only available by mounting them as drives using USB mass storage.</b><p>Please refer to your distribution's documentation for setup and usage instructions."))
+
+
+ def SendFaxButton_clicked(self):
+ self.RunCommand(self.user_settings.cmd_fax)
+
+
+ def MakeCopiesButton_clicked(self):
+ self.RunCommand(self.user_settings.cmd_copy)
+
+
+ def ConfigureFeaturesButton_clicked(self):
+ self.settingsConfigure_activated(2)
+
+
+ def viewInformation(self):
+ dlg = ScrollDialog(ScrollDeviceInfoView, self.cur_device, self.cur_printer, self.service, self)
+ dlg.exec_loop()
+
+
+ def viewPrinterInformation(self):
+ dlg = ScrollDialog(ScrollPrinterInfoView, self.cur_device, self.cur_printer, self.service, self)
+ dlg.exec_loop()
+
+
+ def viewHelp(self):
+ f = "http://hplip.sf.net"
+
+ if prop.doc_build:
+ g = os.path.join(sys_conf.get('dirs', 'doc'), 'index.html')
+ if os.path.exists(g):
+ f = "file://%s" % g
+
+ log.debug(f)
+ utils.openURL(f)
+
+
+ def viewSupport(self):
+ f = "http://hplip.sf.net"
+ log.debug(f)
+ utils.openURL(f)
+
+
+ def pqDiag(self):
+ d = self.cur_device
+ pq_diag = d.pq_diag_type
+
+ try:
+ QApplication.setOverrideCursor(QApplication.waitCursor)
+
+ try:
+ d.open()
+ except Error:
+ self.CheckDeviceUI()
+ else:
+ if d.isIdleAndNoError():
+ QApplication.restoreOverrideCursor()
+
+ if pq_diag == 1:
+ maint.printQualityDiagType1(d, self.LoadPaperUI)
+
+ elif pq_diag == 2:
+ maint.printQualityDiagType2(d, self.LoadPaperUI)
+
+ else:
+ self.CheckDeviceUI()
+
+ finally:
+ d.close()
+ QApplication.restoreOverrideCursor()
+
+
+ def linefeedCalibration(self):
+ d = self.cur_device
+ linefeed_type = d.linefeed_cal_type
+
+ try:
+ QApplication.setOverrideCursor(QApplication.waitCursor)
+
+ try:
+ d.open()
+ except Error:
+ self.CheckDeviceUI()
+ else:
+ if d.isIdleAndNoError():
+ QApplication.restoreOverrideCursor()
+
+ if linefeed_type == 1:
+ maint.linefeedCalType1(d, self.LoadPaperUI)
+
+ elif linefeed_type == 2:
+ maint.linefeedCalType2(d, self.LoadPaperUI)
+
+ else:
+ self.CheckDeviceUI()
+
+ finally:
+ d.close()
+ QApplication.restoreOverrideCursor()
+
+
+ def downloadFirmware(self):
+ d = self.cur_device
+ ok = False
+
+ try:
+ QApplication.setOverrideCursor(QApplication.waitCursor)
+ d.open()
+
+ if d.isIdleAndNoError():
+ ok = d.downloadFirmware()
+
+ finally:
+ d.close()
+ QApplication.restoreOverrideCursor()
+
+ if not ok:
+ self.FailureUI(self.__tr("<b>An error occured downloading firmware file.</b><p>Please check your printer and ensure that the HPLIP plugin has been installed."))
+
+
+ def CheckDeviceUI(self):
+ self.FailureUI(self.__tr("<b>Device is busy or in an error state.</b><p>Please check device and try again."))
+
+
+ def LoadPaperUI(self):
+ if LoadPaperForm(self).exec_loop() == QDialog.Accepted:
+ return True
+ return False
+
+
+ def AlignmentNumberUI(self, letter, hortvert, colors, line_count, choice_count):
+ dlg = AlignForm(self, letter, hortvert, colors, line_count, choice_count)
+ if dlg.exec_loop() == QDialog.Accepted:
+ return True, dlg.value
+ else:
+ return False, 0
+
+
+ def PaperEdgeUI(self, maximum):
+ dlg = PaperEdgeAlignForm(self)
+ if dlg.exec_loop() == QDialog.Accepted:
+ return True, dlg.value
+ else:
+ return False, 0
+
+
+ def BothPensRequiredUI(self):
+ self.WarningUI(self.__tr("<p><b>Both cartridges are required for alignment.</b><p>Please install both cartridges and try again."))
+
+
+ def InvalidPenUI(self):
+ self.WarningUI(self.__tr("<p><b>One or more cartiridges are missing from the printer.</b><p>Please install cartridge(s) and try again."))
+
+
+ def PhotoPenRequiredUI(self):
+ self.WarningUI(self.__tr("<p><b>Both the photo and color cartridges must be inserted into the printer to perform color calibration.</b><p>If you are planning on printing with the photo cartridge, please insert it and try again."))
+
+
+ def PhotoPenRequiredUI2(self):
+ self.WarningUI(self.__tr("<p><b>Both the photo (regular photo or photo blue) and color cartridges must be inserted into the printer to perform color calibration.</b><p>If you are planning on printing with the photo or photo blue cartridge, please insert it and try again."))
+
+
+ def NotPhotoOnlyRequired(self): # Type 11
+ self.WarningUI(self.__tr("<p><b>Cannot align with only the photo cartridge installed.</b><p>Please install other cartridges and try again."))
+
+
+ def AioUI1(self):
+ dlg = AlignType6Form1(self)
+ return dlg.exec_loop() == QDialog.Accepted
+
+
+ def AioUI2(self):
+ AlignType6Form2(self).exec_loop()
+
+
+ def Align10and11UI(self, pattern, align_type):
+ dlg = Align10Form(pattern, align_type, self)
+ dlg.exec_loop()
+ return dlg.getValues()
+
+
+ def Align13UI(self):
+ dlg = Align13Form(self)
+ dlg.exec_loop()
+ return True
+
+
+ def AlignPensButton_clicked(self):
+ d = self.cur_device
+ align_type = d.align_type
+
+ log.debug("Align: %s %s (type=%d) %s" % ("*"*20, self.cur_device.device_uri, align_type, "*"*20))
+
+ try:
+ QApplication.setOverrideCursor(QApplication.waitCursor)
+
+ try:
+ d.open()
+ except Error:
+ self.CheckDeviceUI()
+ else:
+ if d.isIdleAndNoError():
+ QApplication.restoreOverrideCursor()
+
+ if align_type == ALIGN_TYPE_AUTO:
+ maint.AlignType1(d, self.LoadPaperUI)
+
+ elif align_type == ALIGN_TYPE_8XX:
+ maint.AlignType2(d, self.LoadPaperUI, self.AlignmentNumberUI,
+ self.BothPensRequiredUI)
+
+ elif align_type in (ALIGN_TYPE_9XX,ALIGN_TYPE_9XX_NO_EDGE_ALIGN):
+ maint.AlignType3(d, self.LoadPaperUI, self.AlignmentNumberUI,
+ self.PaperEdgeUI, align_type)
+
+ elif align_type in (ALIGN_TYPE_LIDIL_0_3_8, ALIGN_TYPE_LIDIL_0_4_3, ALIGN_TYPE_LIDIL_VIP):
+ maint.AlignxBow(d, align_type, self.LoadPaperUI, self.AlignmentNumberUI,
+ self.PaperEdgeUI, self.InvalidPenUI, self.ColorAdjUI)
+
+ elif align_type == ALIGN_TYPE_LIDIL_AIO:
+ maint.AlignType6(d, self.AioUI1, self.AioUI2, self.LoadPaperUI)
+
+ elif align_type == ALIGN_TYPE_DESKJET_450:
+ maint.AlignType8(d, self.LoadPaperUI, self.AlignmentNumberUI)
+
+ elif align_type == ALIGN_TYPE_LBOW:
+ maint.AlignType10(d, self.LoadPaperUI, self.Align10and11UI)
+
+ elif align_type == ALIGN_TYPE_LIDIL_0_5_4:
+ maint.AlignType11(d, self.LoadPaperUI, self.Align10and11UI, self.NotPhotoOnlyRequired)
+
+ elif align_type == ALIGN_TYPE_OJ_PRO:
+ maint.AlignType12(d, self.LoadPaperUI)
+
+ elif align_type == ALIGN_TYPE_AIO:
+ maint.AlignType13(d, self.LoadPaperUI, self.Align13UI)
+
+ elif align_type == ALIGN_TYPE_LEDM:
+ maint.AlignType15(d, self.LoadPaperUI, self.Align13UI)
+
+ elif align_type == ALIGN_TYPE_LEDM_MANUAL:
+ maint.AlignType16(d, self.LoadPaperUI, self.AlignmentNumberUI)
+
+ elif align_type == ALIGN_TYPE_LEDM_FF_CC_0:
+ maint.AlignType17(d, self.LoadPaperUI, self.Align13UI)
+ else:
+ self.CheckDeviceUI()
+
+ finally:
+ d.close()
+ QApplication.restoreOverrideCursor()
+
+
+ def ColorAdjUI(self, line, maximum=0):
+ dlg = ColorAdjForm(self, line)
+ if dlg.exec_loop() == QDialog.Accepted:
+ return True, dlg.value
+ else:
+ return False, 0
+
+
+ def ColorCalUI(self):
+ dlg = ColorCalForm(self)
+ if dlg.exec_loop() == QDialog.Accepted:
+ return True, dlg.value
+ else:
+ return False, 0
+
+
+ def ColorCalUI2(self):
+ dlg = ColorCalForm2(self)
+ if dlg.exec_loop() == QDialog.Accepted:
+ return True, dlg.value
+ else:
+ return False, 0
+
+
+ def ColorCalUI4(self):
+ dlg = ColorCal4Form(self)
+ if dlg.exec_loop() == QDialog.Accepted:
+ return True, dlg.values
+ else:
+ return False, None
+
+
+ def ColorCalibrationButton_clicked(self):
+ d = self.cur_device
+ color_cal_type = d.color_cal_type
+ log.debug("Color-cal: %s %s (type=%d) %s" % ("*"*20, self.cur_device.device_uri, color_cal_type, "*"*20))
+
+ if color_cal_type == COLOR_CAL_TYPE_TYPHOON:
+ dlg = ScrollDialog(ScrollColorCalView, self.cur_device, self.cur_printer, self.service, self)
+ dlg.exec_loop()
+ else:
+ try:
+ QApplication.setOverrideCursor(QApplication.waitCursor)
+
+ try:
+ d.open()
+ except Error:
+ self.CheckDeviceUI()
+ else:
+ if d.isIdleAndNoError():
+ QApplication.restoreOverrideCursor()
+
+ if color_cal_type == COLOR_CAL_TYPE_DESKJET_450:
+ maint.colorCalType1(d, self.LoadPaperUI, self.ColorCalUI,
+ self.PhotoPenRequiredUI)
+
+ elif color_cal_type == COLOR_CAL_TYPE_MALIBU_CRICK:
+ maint.colorCalType2(d, self.LoadPaperUI, self.ColorCalUI2,
+ self.InvalidPenUI)
+
+ elif color_cal_type == COLOR_CAL_TYPE_STRINGRAY_LONGBOW_TORNADO:
+ maint.colorCalType3(d, self.LoadPaperUI, self.ColorAdjUI,
+ self.PhotoPenRequiredUI2)
+
+ elif color_cal_type == COLOR_CAL_TYPE_CONNERY:
+ maint.colorCalType4(d, self.LoadPaperUI, self.ColorCalUI4,
+ self.WaitUI)
+
+ elif color_cal_type == COLOR_CAL_TYPE_COUSTEAU:
+ maint.colorCalType5(d, self.LoadPaperUI)
+
+ elif color_cal_type == COLOR_CAL_TYPE_CARRIER:
+ maint.colorCalType6(d, self.LoadPaperUI)
+
+ else:
+ self.CheckDeviceUI()
+
+ finally:
+ d.close()
+ QApplication.restoreOverrideCursor()
+
+
+ def PrintTestPageButton_clicked(self):
+ dlg = ScrollDialog(ScrollTestpageView, self.cur_device, self.cur_printer, self.service, self)
+ dlg.exec_loop()
+
+
+ def CleanUI1(self):
+ return CleaningForm(self, self.cur_device, 1).exec_loop() == QDialog.Accepted
+
+
+ def CleanUI2(self):
+ return CleaningForm(self, self.cur_device, 2).exec_loop() == QDialog.Accepted
+
+
+ def CleanUI3(self):
+ CleaningForm2(self).exec_loop()
+ return True
+
+
+ def WaitUI(self, seconds):
+ WaitForm(seconds, None, self).exec_loop()
+
+
+ def CleanPensButton_clicked(self):
+ d = self.cur_device
+ clean_type = d.clean_type
+ log.debug("Clean: %s %s (type=%d) %s" % ("*"*20, self.cur_device.device_uri, clean_type, "*"*20))
+
+ try:
+ QApplication.setOverrideCursor(QApplication.waitCursor)
+
+ try:
+ d.open()
+ except Error:
+ self.CheckDeviceUI()
+ else:
+ if d.isIdleAndNoError():
+ QApplication.restoreOverrideCursor()
+
+ if clean_type == CLEAN_TYPE_PCL:
+ maint.cleaning(d, clean_type, maint.cleanType1, maint.primeType1,
+ maint.wipeAndSpitType1, self.LoadPaperUI,
+ self.CleanUI1, self.CleanUI2, self.CleanUI3,
+ self.WaitUI)
+
+ elif clean_type == CLEAN_TYPE_LIDIL:
+ maint.cleaning(d, clean_type, maint.cleanType2, maint.primeType2,
+ maint.wipeAndSpitType2, self.LoadPaperUI,
+ self.CleanUI1, self.CleanUI2, self.CleanUI3,
+ self.WaitUI)
+
+ elif clean_type == CLEAN_TYPE_PCL_WITH_PRINTOUT:
+ maint.cleaning(d, clean_type, maint.cleanType1, maint.primeType1,
+ maint.wipeAndSpitType1, self.LoadPaperUI,
+ self.CleanUI1, self.CleanUI2, self.CleanUI3,
+ self.WaitUI)
+ else:
+ self.CheckDeviceUI()
+
+ finally:
+ d.close()
+ QApplication.restoreOverrideCursor()
+
+
+ def OpenEmbeddedBrowserButton_clicked(self):
+ utils.openURL("http://%s" % self.cur_device.host)
+
+
+ def faxAddressBookButton_clicked(self):
+ self.RunCommand(self.cmd_fab)
+
+
+ def faxSettingsButton_clicked(self):
+ try:
+ try:
+ self.cur_device.open()
+ except Error:
+ self.CheckDeviceUI()
+ else:
+ try:
+ result_code, fax_num = self.cur_device.getPML(pml.OID_FAX_LOCAL_PHONE_NUM)
+ except Error:
+ log.error("PML failure.")
+ self.FailureUI(self.__tr("<p><b>Operation failed. Device busy.</b>"))
+ return
+
+ fax_num = str(fax_num)
+
+ try:
+ result_code, name = self.cur_device.getPML(pml.OID_FAX_STATION_NAME)
+ except Error:
+ log.error("PML failure.")
+ self.FailureUI(self.__tr("<p><b>Operation failed. Device busy.</b>"))
+ return
+
+ name = str(name)
+
+ dlg = FaxSettingsForm(self.cur_device, fax_num, name, self)
+ dlg.exec_loop()
+
+ finally:
+ self.cur_device.close()
+
+
+ def addressBookButton_clicked(self):
+ self.RunCommand(self.cmd_fab)
+
+
+ def ShowFirmwareDlg(self):
+ dlg = FirmwareDialog(self, self.cur_device_uri)
+ dlg.show()
+ return dlg.exec_loop() == QDialog.Accepted
+
+ # ***********************************************************************************
+ #
+ # STATUS TAB
+ #
+ # ***********************************************************************************
+
+ def InitStatusTab(self):
+ self.statusListView.setSorting(-1)
+ self.statusListView.setColumnText(0, QString(""))
+ #self.statusListView.setColumnWidthMode(0, QListView.Manual)
+ self.statusListView.setColumnWidth(0, 16)
+
+
+ def UpdateStatusTab(self):
+ #log.debug("UpdateStatusTab()")
+ self.UpdateHistory()
+ self.UpdatePanel()
+ self.UpdateStatusList()
+
+
+ def UpdatePanel(self):
+ if self.cur_device is not None and \
+ self.cur_device.hist and \
+ self.cur_device.supported:
+
+ dq = self.cur_device.dq
+
+ if dq.get('panel', 0) == 1:
+ line1 = dq.get('panel-line1', '')
+ line2 = dq.get('panel-line2', '')
+ else:
+ try:
+ line1 = device.queryString(self.cur_device.hist[0].event_code)
+ except (AttributeError, TypeError):
+ line1 = ''
+
+ line2 = ''
+
+ pm = load_pixmap('panel_lcd', 'other')
+
+ p = QPainter()
+ p.begin(pm)
+ p.setPen(QColor(0, 0, 0))
+ p.setFont(self.font())
+
+ x, y_line1, y_line2 = 10, 17, 33
+
+ # TODO: Scroll long lines
+ p.drawText(x, y_line1, line1)
+ p.drawText(x, y_line2, line2)
+ p.end()
+
+ self.panel.setPixmap(pm)
+
+ else:
+ self.panel.setPixmap(load_pixmap('panel_lcd', 'other'))
+
+
+ def UpdateHistory(self, dev=None):
+ if self.dbus_avail:
+ if dev is None:
+ dev = self.cur_device
+
+ return dev.queryHistory()
+
+ self.cur_device.hist = [self.cur_device.last_event]
+
+
+
+ def UpdateStatusList(self):
+ self.statusListView.clear()
+ row = 0
+ hist = self.cur_device.hist[:]
+
+ if hist:
+ hist.reverse()
+ row = len(hist)-1
+
+ for e in hist:
+ if e is None:
+ continue
+
+ ess = device.queryString(e.event_code, 0)
+ esl = device.queryString(e.event_code, 1)
+
+ if row == 0:
+ desc = self.__tr("(most recent)")
+
+ else:
+ desc = self.getTimeDeltaDesc(e.timedate)
+
+ dt = QDateTime()
+ dt.setTime_t(int(e.timedate), Qt.LocalTime)
+
+ # TODO: In Qt4.x, use QLocale.toString(date, format)
+ tt = QString("%1 %2").arg(dt.toString()).arg(desc)
+
+ if e.job_id:
+ job_id = unicode(e.job_id)
+ else:
+ job_id = u''
+
+ error_state = STATUS_TO_ERROR_STATE_MAP.get(e.event_code, ERROR_STATE_CLEAR)
+ tech_type = self.cur_device.tech_type
+
+ try:
+ if tech_type in (TECH_TYPE_COLOR_INK, TECH_TYPE_MONO_INK):
+ status_pix = self.STATUS_ICONS[error_state][0] # ink
+ else:
+ status_pix = self.STATUS_ICONS[error_state][1] # laser
+ except KeyError:
+ status_pix = self.STATUS_ICONS[ERROR_STATE_CLEAR][0]
+
+ StatusListViewItem(self.statusListView, status_pix, ess, tt, unicode(e.event_code),
+ job_id, unicode(e.username))
+
+ row -= 1
+
+ i = self.statusListView.firstChild()
+ if i is not None:
+ self.statusListView.setCurrentItem(i)
+
+
+ def getTimeDeltaDesc(self, past):
+ t1 = QDateTime()
+ t1.setTime_t(int(past))
+ t2 = QDateTime.currentDateTime()
+ delta = t1.secsTo(t2)
+ return self.__tr("(about %1 ago)").arg(self.stringify(delta))
+
+
+ # "Nicely readable timedelta"
+ # Credit: Bjorn Lindqvist
+ # ASPN Python Recipe 498062
+ # http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/498062
+ # Note: Modified from recipe
+ def seconds_in_units(self, seconds):
+ unit_limits = [("year", 31536000),
+ ("month", 2592000),
+ ("week", 604800),
+ ("day", 86400),
+ ("hour", 3600),
+ ("minute", 60)]
+
+ for unit_name, limit in unit_limits:
+ if seconds >= limit:
+ amount = int(round(float(seconds) / limit))
+ return amount, unit_name
+
+ return seconds, "second"
+
+
+ def stringify(self, seconds):
+ amount, unit_name = self.seconds_in_units(seconds)
+
+ try:
+ i18n_amount = self.num_repr[amount]
+ except KeyError:
+ i18n_amount = unicode(amount)
+
+ if amount == 1:
+ i18n_unit = self.unit_names[unit_name][0]
+ else:
+ i18n_unit = self.unit_names[unit_name][1]
+
+ return QString("%1 %2").arg(i18n_amount).arg(i18n_unit)
+
+
+
+
+ # ***********************************************************************************
+ #
+ # SUPPLIES TAB
+ #
+ # ***********************************************************************************
+
+ def InitSuppliesTab(self):
+ self.pix_battery = load_pixmap('battery', '16x16')
+
+ yellow = "#ffff00"
+ light_yellow = "#ffffcc"
+ cyan = "#00ffff"
+ light_cyan = "#ccffff"
+ magenta = "#ff00ff"
+ light_magenta = "#ffccff"
+ black = "#000000"
+ blue = "#0000ff"
+ dark_grey = "#808080"
+ light_grey = "#c0c0c0"
+
+ self.TYPE_TO_PIX_MAP = {
+ AGENT_TYPE_UNSPECIFIED : [black],
+ AGENT_TYPE_BLACK: [black],
+ AGENT_TYPE_CMY: [cyan, magenta, yellow],
+ AGENT_TYPE_KCM: [light_cyan, light_magenta, light_yellow],
+ AGENT_TYPE_GGK: [dark_grey],
+ AGENT_TYPE_YELLOW: [yellow],
+ AGENT_TYPE_MAGENTA: [magenta],
+ AGENT_TYPE_CYAN : [cyan],
+ AGENT_TYPE_CYAN_LOW: [light_cyan],
+ AGENT_TYPE_YELLOW_LOW: [light_yellow],
+ AGENT_TYPE_MAGENTA_LOW: [light_magenta],
+ AGENT_TYPE_BLUE: [blue],
+ AGENT_TYPE_KCMY_CM: [yellow, cyan, magenta],
+ AGENT_TYPE_LC_LM: [light_cyan, light_magenta],
+ #AGENT_TYPE_Y_M: [yellow, magenta],
+ #AGENT_TYPE_C_K: [black, cyan],
+ AGENT_TYPE_LG_PK: [light_grey, dark_grey],
+ AGENT_TYPE_LG: [light_grey],
+ AGENT_TYPE_G: [dark_grey],
+ AGENT_TYPE_PG: [light_grey],
+ AGENT_TYPE_C_M: [cyan, magenta],
+ AGENT_TYPE_K_Y: [black, yellow],
+ }
+
+ self.suppliesList.setSorting(-1)
+ self.suppliesList.setColumnText(0, QString(""))
+ #self.suppliesList.setColumnWidthMode(0, QListView.Manual)
+ self.suppliesList.setColumnWidth(0, 16)
+ self.suppliesList.setColumnWidth(3, 100)
+
+
+ def UpdateSuppliesTab(self):
+ #log.debug("UpdateSuppliesTab()")
+
+ self.suppliesList.clear()
+
+ if self.cur_device is not None and \
+ self.cur_device.supported and \
+ self.cur_device.status_type != STATUS_TYPE_NONE and \
+ self.cur_device.device_state != DEVICE_STATE_NOT_FOUND:
+
+ try:
+ self.cur_device.sorted_supplies
+ except AttributeError:
+ self.cur_device.sorted_supplies = []
+
+ if not self.cur_device.sorted_supplies:
+ a = 1
+ while True:
+ try:
+ agent_type = int(self.cur_device.dq['agent%d-type' % a])
+ agent_kind = int(self.cur_device.dq['agent%d-kind' % a])
+ agent_sku = self.cur_device.dq['agent%d-sku' % a]
+ except KeyError:
+ break
+ else:
+ self.cur_device.sorted_supplies.append((a, agent_kind, agent_type, agent_sku))
+
+ a += 1
+
+ self.cur_device.sorted_supplies.sort(lambda x, y: cmp(x[1], y[1]) or cmp(x[3], y[3]), reverse=True)
+
+
+ for x in self.cur_device.sorted_supplies:
+ a, agent_kind, agent_type, agent_sku = x
+ agent_level = int(self.cur_device.dq['agent%d-level' % a])
+ agent_desc = self.cur_device.dq['agent%d-desc' % a]
+ agent_health_desc = self.cur_device.dq['agent%d-health-desc' % a]
+
+ # Bar graph level
+ level_pixmap = None
+ if agent_kind in (AGENT_KIND_SUPPLY,
+ AGENT_KIND_HEAD,
+ AGENT_KIND_HEAD_AND_SUPPLY,
+ AGENT_KIND_TONER_CARTRIDGE,
+ AGENT_KIND_MAINT_KIT,
+ AGENT_KIND_ADF_KIT,
+ AGENT_KIND_INT_BATTERY,
+ AGENT_KIND_DRUM_KIT,
+ ):
+
+ level_pixmap = self.createBarGraph(agent_level, agent_type)
+
+ # Color icon
+ pixmap = None
+ if agent_kind in (AGENT_KIND_SUPPLY,
+ AGENT_KIND_HEAD,
+ AGENT_KIND_HEAD_AND_SUPPLY,
+ AGENT_KIND_TONER_CARTRIDGE,
+ #AGENT_KIND_MAINT_KIT,
+ #AGENT_KIND_ADF_KIT,
+ AGENT_KIND_INT_BATTERY,
+ #AGENT_KIND_DRUM_KIT,
+ ):
+
+ pixmap = self.getIcon(agent_kind, agent_type)
+
+
+ SuppliesListViewItem(self.suppliesList, pixmap, agent_desc,
+ agent_sku, level_pixmap, agent_health_desc)
+
+ i = self.suppliesList.firstChild()
+ if i is not None:
+ self.suppliesList.setCurrentItem(i)
+
+
+
+
+ def getIcon(self, agent_kind, agent_type):
+ if agent_kind in (AGENT_KIND_SUPPLY,
+ AGENT_KIND_HEAD,
+ AGENT_KIND_HEAD_AND_SUPPLY,
+ AGENT_KIND_TONER_CARTRIDGE):
+
+ map = self.TYPE_TO_PIX_MAP[agent_type]
+
+ if isinstance(map, list):
+ map_len = len(map)
+ pix = QPixmap(16, 16) #, -1, QPixmap.DefaultOptim)
+ pix.fill(qApp.palette().color(QPalette.Active, QColorGroup.Background))
+ p = QPainter()
+ p.begin(pix)
+ p.setBackgroundMode(Qt.OpaqueMode)
+
+ if map_len == 1:
+ p.setPen(QColor(map[0]))
+ p.setBrush(QBrush(QColor(map[0]), Qt.SolidPattern))
+ p.drawPie(2, 2, 10, 10, 0, 5760)
+
+ elif map_len == 2:
+ p.setPen(QColor(map[0]))
+ p.setBrush(QBrush(QColor(map[0]), Qt.SolidPattern))
+ p.drawPie(2, 4, 8, 8, 0, 5760)
+
+ p.setPen(QColor(map[1]))
+ p.setBrush(QBrush(QColor(map[1]), Qt.SolidPattern))
+ p.drawPie(6, 4, 8, 8, 0, 5760)
+
+ elif map_len == 3:
+ p.setPen(QColor(map[2]))
+ p.setBrush(QBrush(QColor(map[2]), Qt.SolidPattern))
+ p.drawPie(6, 6, 8, 8, 0, 5760)
+
+ p.setPen(QColor(map[1]))
+ p.setBrush(QBrush(QColor(map[1]), Qt.SolidPattern))
+ p.drawPie(2, 6, 8, 8, 0, 5760)
+
+ p.setPen(QColor(map[0]))
+ p.setBrush(QBrush(QColor(map[0]), Qt.SolidPattern))
+ p.drawPie(4, 2, 8, 8, 0, 5760)
+
+ p.end()
+ return pix
+
+ else:
+ return map
+
+ elif agent_kind == AGENT_KIND_INT_BATTERY:
+ return self.pix_battery
+
+
+ def createBarGraph(self, percent, agent_type, w=100, h=18):
+ fw = w/100*percent
+ px = QPixmap(w, h)
+ px.fill(qApp.palette().color(QPalette.Active, QColorGroup.Background))
+
+ pp = QPainter(px)
+ pp.setPen(Qt.black)
+ pp.setBackgroundColor(qApp.palette().color(QPalette.Active, QColorGroup.Base))
+
+ map = self.TYPE_TO_PIX_MAP[agent_type]
+ map_len = len(map)
+
+ if map_len == 1 or map_len > 3:
+ pp.fillRect(0, 0, fw, h, QBrush(QColor(map[0])))
+
+ elif map_len == 2:
+ h2 = h / 2
+ pp.fillRect(0, 0, fw, h2, QBrush(QColor(map[0])))
+ pp.fillRect(0, h2, fw, h, QBrush(QColor(map[1])))
+
+ elif map_len == 3:
+ h3 = h / 3
+ h23 = 2 * h3
+ pp.fillRect(0, 0, fw, h3, QBrush(QColor(map[0])))
+ pp.fillRect(0, h3, fw, h23, QBrush(QColor(map[1])))
+ pp.fillRect(0, h23, fw, h, QBrush(QColor(map[2])))
+
+ # draw black frame
+ pp.drawRect(0, 0, w, h)
+
+ if percent > 75 and agent_type in \
+ (AGENT_TYPE_BLACK, AGENT_TYPE_UNSPECIFIED, AGENT_TYPE_BLUE):
+ pp.setPen(Qt.white)
+
+ # 75% ticks
+ w1 = 3 * w / 4
+ h6 = h / 6
+ pp.drawLine(w1, 0, w1, h6)
+ pp.drawLine(w1, h, w1, h-h6)
+
+ if percent > 50 and agent_type in \
+ (AGENT_TYPE_BLACK, AGENT_TYPE_UNSPECIFIED, AGENT_TYPE_BLUE):
+ pp.setPen(Qt.white)
+
+ # 50% ticks
+ w2 = w / 2
+ h4 = h / 4
+ pp.drawLine(w2, 0, w2, h4)
+ pp.drawLine(w2, h, w2, h-h4)
+
+ if percent > 25 and agent_type in \
+ (AGENT_TYPE_BLACK, AGENT_TYPE_UNSPECIFIED, AGENT_TYPE_BLUE):
+ pp.setPen(Qt.white)
+
+ # 25% ticks
+ w4 = w / 4
+ pp.drawLine(w4, 0, w4, h6)
+ pp.drawLine(w4, h, w4, h-h6)
+
+ return px
+
+
+
+ # ***********************************************************************************
+ #
+ # PRINTER SETTINGS TAB
+ #
+ # ***********************************************************************************
+
+ def InitPrintSettingsTab(self): # Add Scrolling Print Settings
+ PrintJobsTabLayout = QGridLayout(self.PrintSettingsTab,1,1,11,6,"PrintJobsTabLayout")
+
+ self.PrintSettingsList = ScrollPrintSettingsView(self.service, self.PrintSettingsTab, "PrintSettingsView")
+ PrintJobsTabLayout.addMultiCellWidget(self.PrintSettingsList,1,1,0,3)
+
+ self.PrintSettingsPrinterCombo = QComboBox(0,self.PrintSettingsTab,"comboBox5")
+
+ self.PrintSettingsPrinterCombo.setSizePolicy(QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed,0,0,
+ self.PrintSettingsPrinterCombo.sizePolicy().hasHeightForWidth()))
+
+ PrintJobsTabLayout.addWidget(self.PrintSettingsPrinterCombo, 0, 2)
+
+ self.settingTextLabel = QLabel(self.PrintSettingsTab,"self.settingTextLabel")
+ PrintJobsTabLayout.addWidget(self.settingTextLabel,0,1)
+
+ self.settingTextLabel.setText(self.__tr("Printer Name:"))
+
+ spacer34 = QSpacerItem(20,20,QSizePolicy.Preferred, QSizePolicy.Minimum)
+ PrintJobsTabLayout.addItem(spacer34,0,3)
+
+ spacer35 = QSpacerItem(20,20,QSizePolicy.Preferred, QSizePolicy.Minimum)
+ PrintJobsTabLayout.addItem(spacer35,0,0)
+
+ self.connect(self.PrintSettingsPrinterCombo, SIGNAL("activated(const QString&)"),
+ self.PrintSettingsPrinterCombo_activated)
+
+
+ def UpdatePrintSettingsTab(self):
+ #log.debug("UpdatePrintSettingsTab()")
+ if self.cur_device.device_type == DEVICE_TYPE_PRINTER:
+ self.settingTextLabel.setText(self.__tr("Printer Name:"))
+ else:
+ self.settingTextLabel.setText(self.__tr("Fax Name:"))
+
+ self.PrintSettingsList.onDeviceChange(self.cur_device)
+
+
+ def UpdatePrintSettingsTabPrinter(self):
+ self.PrintSettingsList.onPrinterChange(self.cur_printer)
+
+
+ # ***********************************************************************************
+ #
+ # PRINTER CONTROL TAB
+ #
+ # ***********************************************************************************
+
+ def InitPrintControlTab(self):
+ self.JOB_STATES = { cups.IPP_JOB_PENDING : self.__tr("Pending"),
+ cups.IPP_JOB_HELD : self.__tr("On hold"),
+ cups.IPP_JOB_PROCESSING : self.__tr("Printing"),
+ cups.IPP_JOB_STOPPED : self.__tr("Stopped"),
+ cups.IPP_JOB_CANCELLED : self.__tr("Canceled"),
+ cups.IPP_JOB_ABORTED : self.__tr("Aborted"),
+ cups.IPP_JOB_COMPLETED : self.__tr("Completed"),
+ }
+
+ self.cancelToolButton.setIconSet(QIconSet(load_pixmap('cancel', '16x16')))
+ self.infoToolButton.setIconSet(QIconSet(load_pixmap('info', '16x16')))
+
+ self.JOB_STATE_ICONS = { cups.IPP_JOB_PENDING: self.busy_pix,
+ cups.IPP_JOB_HELD : self.busy_pix,
+ cups.IPP_JOB_PROCESSING : self.print_pix,
+ cups.IPP_JOB_STOPPED : self.warning_pix,
+ cups.IPP_JOB_CANCELLED : self.warning_pix,
+ cups.IPP_JOB_ABORTED : self.error_pix,
+ cups.IPP_JOB_COMPLETED : self.ok_pix,
+ }
+
+ self.jobList.setSorting(-1)
+ self.jobList.setColumnText(0, QString(""))
+ #self.jobList.setColumnWidthMode(0, QListView.Manual)
+ self.jobList.setColumnWidth(0, 16)
+ self.jobList.setColumnText(1, QString(""))
+ #self.jobList.setColumnWidthMode(1, QListView.Manual)
+ self.jobList.setColumnWidth(1, 16)
+ self.jobList.setColumnWidth(2, 300)
+ self.cancelToolButton.setEnabled(False)
+ self.infoToolButton.setEnabled(False)
+
+ self.printer_state = cups.IPP_PRINTER_STATE_IDLE
+
+ # TODO: Check queues at startup and send events if stopped or rejecting
+
+
+ def UpdatePrintControlTab(self):
+ #log.debug("UpdatePrintControlTab()")
+
+ if self.cur_device.device_type == DEVICE_TYPE_PRINTER:
+ self.printerTextLabel.setText(self.__tr("Printer Name:"))
+
+ else:
+ self.printerTextLabel.setText(self.__tr("Fax Name:"))
+
+ self.jobList.clear()
+ self.UpdatePrintController()
+
+ jobs = cups.getJobs()
+ num_jobs = 0
+ for j in jobs:
+ if j.dest.decode('utf-8') == unicode(self.cur_printer):
+ num_jobs += 1
+
+ for j in jobs:
+ if j.dest == self.cur_printer:
+ JobListViewItem(self.jobList, self.JOB_STATE_ICONS[j.state],
+ j.title, self.JOB_STATES[j.state], unicode(j.id))
+
+ i = self.jobList.firstChild()
+ if i is not None:
+ self.jobList.setCurrentItem(i)
+
+
+ def jobList_clicked(self, i):
+ num = 0
+ item = self.jobList.firstChild()
+ while item is not None:
+ if item.isOn():
+ num += 1
+
+ item = item.nextSibling()
+
+ self.cancelToolButton.setEnabled(num)
+ self.infoToolButton.setEnabled(num == 1)
+
+
+ def infoToolButton_clicked(self):
+ item = self.jobList.firstChild()
+ while item is not None:
+ if item.isOn():
+ return self.showJobInfoDialog(item)
+
+ item = item.nextSibling()
+
+
+ def cancelToolButton_clicked(self):
+ self.cancelCheckedJobs()
+
+
+ def jobList_contextMenuRequested(self, item, pos, a2):
+ if item is not None and item is self.jobList.currentItem():
+ popup = QPopupMenu(self)
+
+ popup.insertItem(self.__tr("Cancel Job"), self.cancelJob)
+ popup.insertSeparator()
+ popup.insertItem(self.__tr("View Job Log (advanced)..."), self.getJobInfo)
+
+ popup.popup(pos)
+
+
+ def cancelJob(self):
+ item = self.jobList.currentItem()
+
+ if item is not None:
+ self.cur_device.cancelJob(int(item.job_id))
+
+
+ def getJobInfo(self):
+ return self.showJobInfoDialog(self.jobList.currentItem())
+
+
+ def showJobInfoDialog(self, item):
+ if item is not None:
+ text = cups.getPrintJobErrorLog(int(item.job_id))
+
+ if text:
+ dlg = JobInfoDialog(text, self)
+ dlg.setCaption(self.__tr("HP Device Manager - Job Log - %1 - Job %2").\
+ arg(self.cur_printer).arg(unicode(item.job_id)))
+
+ dlg.exec_loop()
+
+ else:
+ self.FailureUI(self.__tr("<b>No log output found.</b><p>If the print job is stopped or the printer is rejecting jobs, there might not be any output. Also, you will receive more output in the CUPS LogLevel is set to 'debug'."))
+
+
+ def UpdatePrintController(self):
+ # default printer
+ self.defaultPushButton.setText(self.__tr("Set as Default"))
+
+ default_printer = cups.getDefaultPrinter()
+ if default_printer is not None:
+ default_printer = default_printer.decode('utf8')
+
+ if default_printer == self.cur_printer:
+ s = self.__tr("SET AS DEFAULT")
+ self.defaultPushButton.setEnabled(False)
+
+ else:
+ s = self.__tr("NOT SET AS DEFAULT")
+ self.defaultPushButton.setEnabled(True)
+
+ if self.cur_device.device_type == DEVICE_TYPE_PRINTER:
+ QToolTip.add(self.defaultPushButton, self.__tr("The printer is currently: %1").arg(s))
+
+ else:
+ QToolTip.add(self.defaultPushButton, self.__tr("The fax is currently: %1").arg(s))
+
+ self.printer_state = cups.IPP_PRINTER_STATE_IDLE
+
+ cups_printers = cups.getPrinters()
+
+ for p in cups_printers:
+ if p.name.decode('utf-8') == self.cur_printer:
+ self.printer_state = p.state
+ self.printer_accepting = p.accepting
+ break
+
+ # start/stop
+ if self.printer_state == cups.IPP_PRINTER_STATE_IDLE:
+ s = self.__tr("IDLE")
+
+ if self.cur_device.device_type == DEVICE_TYPE_PRINTER:
+ self.stopstartPushButton.setText(self.__tr("Stop Printer"))
+
+ else:
+ self.stopstartPushButton.setText(self.__tr("Stop Fax"))
+
+ elif self.printer_state == cups.IPP_PRINTER_STATE_PROCESSING:
+ s = self.__tr("PROCESSING")
+
+ if self.cur_device.device_type == DEVICE_TYPE_PRINTER:
+ self.stopstartPushButton.setText(self.__tr("Stop Printer"))
+
+ else:
+ self.stopstartPushButton.setText(self.__tr("Stop Fax"))
+ else:
+ s = self.__tr("STOPPED")
+
+ if self.cur_device.device_type == DEVICE_TYPE_PRINTER:
+ self.stopstartPushButton.setText(self.__tr("Start Printer"))
+
+ else:
+ self.stopstartPushButton.setText(self.__tr("Start Fax"))
+
+ if self.cur_device.device_type == DEVICE_TYPE_PRINTER:
+ QToolTip.add(self.stopstartPushButton, self.__tr("The printer is currently: %1").arg(s))
+
+ else:
+ QToolTip.add(self.stopstartPushButton, self.__tr("The fax is currently: %1").arg(s))
+
+ # reject/accept
+ if self.printer_accepting:
+ s = self.__tr("ACCEPTING JOBS")
+ self.rejectacceptPushButton.setText(self.__tr("Reject Jobs"))
+
+ else:
+ s = self.__tr("REJECTING JOBS")
+ self.rejectacceptPushButton.setText(self.__tr("Accept Jobs"))
+
+ if self.cur_device.device_type == DEVICE_TYPE_PRINTER:
+ QToolTip.add(self.rejectacceptPushButton, self.__tr("The printer is currently: %1").arg(s))
+
+ else:
+ QToolTip.add(self.rejectacceptPushButton, self.__tr("The fax is currently: %1").arg(s))
+
+
+ def stopstartPushButton_clicked(self):
+ QApplication.setOverrideCursor(QApplication.waitCursor)
+ try:
+ if self.printer_state in (cups.IPP_PRINTER_STATE_IDLE, cups.IPP_PRINTER_STATE_PROCESSING):
+ result = cups.stop(self.cur_printer)
+ if result:
+ if self.cur_device.device_type == DEVICE_TYPE_PRINTER:
+ e = EVENT_PRINTER_QUEUE_STOPPED
+ else:
+ e = EVENT_FAX_QUEUE_STOPPED
+
+ else:
+ result = cups.start(self.cur_printer)
+ if result:
+ if self.cur_device.device_type == DEVICE_TYPE_PRINTER:
+ e = EVENT_PRINTER_QUEUE_STARTED
+ else:
+ e = EVENT_FAX_QUEUE_STARTED
+
+ if result:
+ self.UpdatePrintController()
+ self.cur_device.sendEvent(e, self.cur_printer)
+ else:
+ log.error("Start/Stop printer operation failed")
+ self.FailureUI(self.__tr("<b>Start/Stop printer operation failed.</b><p>Try after add user to \"lp\" group."))
+
+ finally:
+ QApplication.restoreOverrideCursor()
+
+
+ def rejectacceptPushButton_clicked(self):
+ QApplication.setOverrideCursor(QApplication.waitCursor)
+ try:
+ if self.printer_accepting:
+ result = cups.reject(self.cur_printer)
+ if result:
+ if self.cur_device.device_type == DEVICE_TYPE_PRINTER:
+ e = EVENT_PRINTER_QUEUE_REJECTING_JOBS
+ else:
+ e = EVENT_FAX_QUEUE_REJECTING_JOBS
+
+ else:
+ result = cups.accept(self.cur_printer)
+ if result:
+ if self.cur_device.device_type == DEVICE_TYPE_PRINTER:
+ e = EVENT_PRINTER_QUEUE_ACCEPTING_JOBS
+ else:
+ e = EVENT_FAX_QUEUE_ACCEPTING_JOBS
+
+ if result:
+ self.UpdatePrintController()
+ self.cur_device.sendEvent(e, self.cur_printer)
+ else:
+ log.error("Reject/Accept jobs operation failed")
+ self.FailureUI(self.__tr("<b>Accept/Reject printer operation failed.</b><p>Try after add user to \"lp\" group."))
+
+ finally:
+ QApplication.restoreOverrideCursor()
+
+
+ def defaultPushButton_clicked(self):
+ QApplication.setOverrideCursor(QApplication.waitCursor)
+ try:
+ result = cups.setDefaultPrinter(self.cur_printer.encode('utf8'))
+ if not result:
+ log.error("Set default printer failed.")
+ self.FailureUI(self.__tr("<b>Set default printer operation failed.</b><p>Try after add user to \"lp\" group."))
+ else:
+ self.UpdatePrintController()
+ if self.cur_device.device_type == DEVICE_TYPE_PRINTER:
+ e = EVENT_PRINTER_QUEUE_SET_AS_DEFAULT
+ else:
+ e = EVENT_FAX_QUEUE_SET_AS_DEFAULT
+
+ self.cur_device.sendEvent(e, self.cur_printer)
+
+ finally:
+ QApplication.restoreOverrideCursor()
+
+
+ def cancelCheckedJobs(self):
+ QApplication.setOverrideCursor(QApplication.waitCursor)
+ try:
+ item = self.jobList.firstChild()
+ while item is not None:
+ if item.isOn():
+ self.cur_device.cancelJob(int(item.job_id))
+
+ item = item.nextSibling()
+
+ finally:
+ QApplication.restoreOverrideCursor()
+
+ self.UpdatePrintControlTab()
+
+ def UpdateUpgradeTab(self):
+ log.debug("Upgrade Tab is pressed")
+ self.InstallPushButton_lock = False
+
+ def InstallPushButton_clicked(self):
+ if self.InstallPushButton_lock is True:
+ return
+
+ if self.Is_autoInstaller_distro:
+ self.InstallPushButton.setEnabled(False)
+ terminal_cmd = utils.get_terminal()
+ if terminal_cmd is not None and utils.which("hp-upgrade"):
+ cmd = terminal_cmd + " 'hp-upgrade'"
+ log.debug("cmd = %s " %cmd)
+ os.system(cmd)
+ else:
+ log.error("Failed to run hp-upgrade command from terminal =%s "%terminal_cmd)
+ self.InstallPushButton.setEnabled(True)
+ else:
+ self.InstallPushButton_lock = True
+ utils.openURL("http://hplipopensource.com/hplip-web/install/manual/index.html")
+ QTimer.singleShot(1000, self.InstallPushButton_unlock)
+
+ def InstallPushButton_unlock(self):
+ self.InstallPushButton_lock = False
+
+ # ***********************************************************************************
+ #
+ # EXIT/CHILD CLEANUP
+ #
+ # ***********************************************************************************
+
+ def closeEvent(self, event):
+ self.Cleanup()
+ self.request_queue.put(None)
+ event.accept()
+
+
+ def Cleanup(self):
+ self.request_queue.put(None)
+ self.CleanupChildren()
+ if not self.update_thread.wait(5000):
+ self.update_thread.terminate()
+
+
+ def CleanupChildren(self):
+ log.debug("Cleaning up child processes.")
+ try:
+ os.waitpid(-1, os.WNOHANG)
+ except OSError:
+ pass
+
+
+ # ***********************************************************************************
+ #
+ # DEVICE SETTINGS PLUGIN
+ #
+ # ***********************************************************************************
+
+ def CheckForDeviceSettingsUI(self, dev):
+ dev.device_settings_ui = None
+ name = '.'.join(['plugins', dev.model])
+ log.debug("Attempting to load plugin: %s" % name)
+ try:
+ mod = __import__(name, globals(), locals(), [])
+ except ImportError:
+ log.debug("No plugin found.")
+ return
+ else:
+ components = name.split('.')
+ for c in components[1:]:
+ mod = getattr(mod, c)
+ log.debug("Loaded: %s" % repr(mod))
+ dev.device_settings_ui = mod.settingsUI
+
+
+ # ***********************************************************************************
+ #
+ # SETTINGS DIALOG
+ #
+ # ***********************************************************************************
+
+ def settingsConfigure_activated(self, tab_to_show=0):
+ dlg = SettingsDialog(self)
+ dlg.TabWidget.setCurrentPage(tab_to_show)
+
+ if dlg.exec_loop() == QDialog.Accepted:
+ old_auto_refresh = self.user_settings.auto_refresh_rate
+ self.user_settings.load()
+
+ if self.user_settings.auto_refresh and old_auto_refresh != self.user_settings.auto_refresh_rate:
+ self.refresh_timer.changeInterval(self.user_settings.auto_refresh_rate * 1000)
+
+ if old_auto_refresh != self.user_settings.auto_refresh:
+ self.autoRefresh.toggle()
+
+
+ # ***********************************************************************************
+ #
+ # SETUP/REMOVE
+ #
+ # ***********************************************************************************
+
+ def deviceInstallAction_activated(self):
+ if utils.which('hp-setup'):
+ cmd = 'hp-setup -u'
+ else:
+ cmd = 'python ./setup.py --gui'
+
+ log.debug(cmd)
+ utils.run(cmd, log_output=True, password_func=None, timeout=1)
+ self.RescanDevices()
+
+
+ def deviceRemoveAction_activated(self):
+ if self.cur_device is not None:
+ x = QMessageBox.critical(self,
+ self.caption(),
+ self.__tr("<b>Annoying Confirmation: Are you sure you want to remove this device?</b>"),
+ QMessageBox.Yes,
+ QMessageBox.No | QMessageBox.Default,
+ QMessageBox.NoButton)
+ if x == QMessageBox.Yes:
+ QApplication.setOverrideCursor(QApplication.waitCursor)
+ print_uri = self.cur_device.device_uri
+ fax_uri = print_uri.replace('hp:', 'hpfax:')
+
+ log.debug(print_uri)
+ log.debug(fax_uri)
+
+ self.cups_devices = device.getSupportedCUPSDevices(['hp', 'hpfax'])
+
+ for d in self.cups_devices:
+ if d in (print_uri, fax_uri):
+ for p in self.cups_devices[d]:
+ log.debug("Removing %s" % p)
+ r = cups.delPrinter(p)
+ if r == 0:
+ self.FailureUI(self.__tr("<p><b>Delete printer queue fails.</b><p>Try after add user to \"lp\" group."))
+
+ self.cur_device = None
+ self.cur_device_uri = ''
+ user_conf.set('last_used', 'device_uri', '')
+ QApplication.restoreOverrideCursor()
+
+ self.RescanDevices()
+
+
+ # ***********************************************************************************
+ #
+ # MISC
+ #
+ # ***********************************************************************************
+
+
+ def RunCommand(self, cmd, macro_char='%'):
+ QApplication.setOverrideCursor(QApplication.waitCursor)
+
+ try:
+ if len(cmd) == 0:
+ self.FailureUI(self.__tr("<p><b>Unable to run command. No command specified.</b><p>Use <pre>Configure...</pre> to specify a command to run."))
+ log.error("No command specified. Use settings to configure commands.")
+ else:
+ log.debug("Run: %s %s (%s) %s" % ("*"*20, cmd, self.cur_device_uri, "*"*20))
+ log.debug(cmd)
+
+ try:
+ cmd = ''.join([self.cur_device.device_vars.get(x, x) \
+ for x in cmd.split(macro_char)])
+ except AttributeError:
+ pass
+
+ log.debug(cmd)
+
+ path = cmd.split()[0]
+ args = cmd.split()
+
+ log.debug(path)
+ log.debug(args)
+
+ self.CleanupChildren()
+ os.spawnvp(os.P_NOWAIT, path, args)
+ qApp.processEvents()
+
+ finally:
+ QApplication.restoreOverrideCursor()
+
+
+ def helpContents(self):
+ f = "http://hplip.sf.net"
+
+ if prop.doc_build:
+ g = os.path.join(sys_conf.get('dirs', 'doc'), 'index.html')
+ if os.path.exists(g):
+ f = "file://%s" % g
+
+ log.debug(f)
+ utils.openURL(f)
+
+
+ def helpAbout(self):
+ dlg = AboutDlg(self)
+ dlg.VersionText.setText(prop.version)
+ dlg.ToolboxVersionText.setText(self.toolbox_version + " (Qt3)")
+ dlg.exec_loop()
+
+
+ def FailureUI(self, error_text):
+ QMessageBox.critical(self,
+ self.caption(),
+ error_text,
+ QMessageBox.Ok,
+ QMessageBox.NoButton,
+ QMessageBox.NoButton)
+
+
+ def WarningUI(self, msg):
+ QMessageBox.warning(self,
+ self.caption(),
+ msg,
+ QMessageBox.Ok,
+ QMessageBox.NoButton,
+ QMessageBox.NoButton)
+
+
+ def __tr(self,s,c = None):
+ return qApp.translate("DevMgr4",s,c)
+
+
+
+# ***********************************************************************************
+#
+# ScrollDeviceInfoView (View Device Information)
+#
+# ***********************************************************************************
+
+class ScrollDeviceInfoView(ScrollView):
+ def __init__(self, service, parent=None, form=None, name=None, fl=0):
+ ScrollView.__init__(self, service, parent, name, fl)
+
+
+ def fillControls(self):
+ ScrollView.fillControls(self)
+ self.addDeviceInfo()
+ self.maximizeControl()
+
+
+ def addDeviceInfo(self):
+ self.addGroupHeading("info_title", self.__tr("Device Information"))
+
+ widget = self.getWidget()
+
+ layout37 = QGridLayout(widget,1,1,5,10,"layout37")
+
+ self.infoListView = QListView(widget,"fileListView")
+ self.infoListView.addColumn(self.__tr("Static/Dynamic"))
+ self.infoListView.addColumn(self.__tr("Key"))
+ self.infoListView.addColumn(self.__tr("Value"))
+ self.infoListView.setAllColumnsShowFocus(1)
+ self.infoListView.setShowSortIndicator(1)
+ self.infoListView.setColumnWidth(0, 50)
+ self.infoListView.setColumnWidth(1, 150)
+ self.infoListView.setColumnWidth(2, 300)
+ self.infoListView.setItemMargin(2)
+ self.infoListView.setSorting(-1)
+
+ layout37.addMultiCellWidget(self.infoListView,1,1,0,3)
+
+ mq_keys = self.cur_device.mq.keys()
+ mq_keys.sort()
+ mq_keys.reverse()
+ for key,i in zip(mq_keys, range(len(mq_keys))):
+ QListViewItem(self.infoListView, self.__tr("Static"), key, str(self.cur_device.mq[key]))
+
+ dq_keys = self.cur_device.dq.keys()
+ dq_keys.sort()
+ dq_keys.reverse()
+ for key,i in zip(dq_keys, range(len(dq_keys))):
+ QListViewItem(self.infoListView, self.__tr("Dynamic"), key, str(self.cur_device.dq[key]))
+
+ self.addWidget(widget, "file_list", maximize=True)
+
+
+ def __tr(self,s,c = None):
+ return qApp.translate("ScrollDeviceInfoView",s,c)
+
+
+
+# ***********************************************************************************
+#
+# ScrollTestpageView (Print Test Page)
+#
+# ***********************************************************************************
+
+class ScrollTestpageView(ScrollView):
+ def __init__(self, service, parent=None, form=None, name=None, fl=0):
+ ScrollView.__init__(self, service, parent, name, fl)
+ self.dialog = parent
+
+
+ def fillControls(self):
+ ScrollView.fillControls(self)
+
+ if self.addPrinterFaxList():
+ self.addTestpageType()
+
+ self.addLoadPaper()
+
+ self.printButton = self.addActionButton("bottom_nav", self.__tr("Print Test Page"),
+ self.printButton_clicked, 'print.png', None)
+
+
+ def addTestpageType(self):
+ self.addGroupHeading("testpage_type", self.__tr("Test Page Type"))
+ widget = self.getWidget()
+
+ Form4Layout = QGridLayout(widget,1,1,5,10,"Form4Layout")
+
+ self.buttonGroup3 = QButtonGroup(widget,"buttonGroup3")
+ self.buttonGroup3.setLineWidth(0)
+ self.buttonGroup3.setColumnLayout(0,Qt.Vertical)
+ self.buttonGroup3.layout().setSpacing(5)
+ self.buttonGroup3.layout().setMargin(10)
+
+ buttonGroup3Layout = QGridLayout(self.buttonGroup3.layout())
+ buttonGroup3Layout.setAlignment(Qt.AlignTop)
+
+ self.radioButton6 = QRadioButton(self.buttonGroup3,"radioButton6")
+ self.radioButton6.setEnabled(False)
+ buttonGroup3Layout.addWidget(self.radioButton6,1,0)
+
+ self.radioButton5 = QRadioButton(self.buttonGroup3,"radioButton5")
+ self.radioButton5.setChecked(1)
+ buttonGroup3Layout.addWidget(self.radioButton5,0,0)
+
+ Form4Layout.addWidget(self.buttonGroup3,0,0)
+
+ self.radioButton6.setText(self.__tr("Printer diagnostic page (does not test print driver)"))
+ self.radioButton5.setText(self.__tr("HPLIP test page (tests print driver)"))
+
+ self.addWidget(widget, "page_type")
+
+
+ def printButton_clicked(self):
+ d = self.cur_device
+ printer_name = self.cur_printer
+ printed = False
+
+ try:
+ QApplication.setOverrideCursor(QApplication.waitCursor)
+
+ try:
+ d.open()
+ except Error:
+ self.CheckDeviceUI()
+ else:
+ try:
+ if d.isIdleAndNoError():
+ QApplication.restoreOverrideCursor()
+ d.close()
+
+ d.printTestPage(printer_name)
+ printed = True
+
+ else:
+ d.close()
+ self.CheckDeviceUI()
+ except Error:
+ self.CheckDeviceUI()
+
+ finally:
+ QApplication.restoreOverrideCursor()
+
+ if printed:
+ QMessageBox.information(self,
+ self.caption(),
+ self.__tr("<p><b>A test page should be printing on your printer.</b><p>If the page fails to print, please visit http://hplip.sourceforge.net for troubleshooting and support."),
+ QMessageBox.Ok,
+ QMessageBox.NoButton,
+ QMessageBox.NoButton)
+
+ self.dialog.accept()
+
+
+ def CheckDeviceUI(self):
+ self.FailureUI(self.__tr("<b>Device is busy or in an error state.</b><p>Please check device and try again."))
+
+
+ def FailureUI(self, error_text):
+ QMessageBox.critical(self,
+ self.caption(),
+ error_text,
+ QMessageBox.Ok,
+ QMessageBox.NoButton,
+ QMessageBox.NoButton)
+
+
+ def __tr(self,s,c = None):
+ return qApp.translate("ScrollTestpageView",s,c)
+
+# ***********************************************************************************
+#
+# ScrollPrinterInfoView (View Device Information)
+#
+# ***********************************************************************************
+
+class ScrollPrinterInfoView(ScrollView):
+ def __init__(self, service, parent = None, form=None, name = None,fl = 0):
+ ScrollView.__init__(self, service, parent, name, fl)
+
+
+ def fillControls(self):
+ ScrollView.fillControls(self)
+
+ printers = []
+ for p in self.printers:
+ if p.device_uri == self.cur_device.device_uri:
+ printers.append(p)
+
+ if not printers:
+ self.addGroupHeading("error_title", self.__tr("No printers found for this device."))
+ else:
+ for p in printers:
+ self.addPrinterInfo(p)
+
+ self.maximizeControl()
+
+
+ def addPrinterInfo(self, p):
+ self.addGroupHeading(p.name, p.name)
+ widget = self.getWidget()
+
+ layout1 = QVBoxLayout(widget,5,10,"layout1")
+
+ textLabel2 = QLabel(widget,"textLabel2")
+
+ if p.device_uri.startswith("hpfax:"):
+ s = self.__tr("Fax")
+ else:
+ s = self.__tr("Printer")
+
+ textLabel2.setText(self.__tr("Type: %1").arg(s))
+ layout1.addWidget(textLabel2)
+
+ textLabel3 = QLabel(widget,"textLabel3")
+ textLabel3.setText(self.__tr("Location: %1").arg(p.location))
+ layout1.addWidget(textLabel3)
+
+ textLabel4 = QLabel(widget,"textLabel4")
+ textLabel4.setText(self.__tr("Description/Info: %1").arg(p.info))
+ layout1.addWidget(textLabel4)
+
+ textLabel5 = QLabel(widget,"textLabel5")
+
+ if p.state == cups.IPP_PRINTER_STATE_IDLE:
+ s = self.__tr("Idle")
+ elif p.state == cups.IPP_PRINTER_STATE_PROCESSING:
+ s = self.__tr("Processing")
+ elif p.state == cups.IPP_PRINTER_STATE_STOPPED:
+ s = self.__tr("Stopped")
+ else:
+ s = self.__tr("Unknown")
+
+ textLabel5.setText(self.__tr("State: %1").arg(s))
+ layout1.addWidget(textLabel5)
+
+ textLabel6 = QLabel(widget,"textLabel6")
+ textLabel6.setText(self.__tr("PPD/Driver: %1").arg(p.makemodel))
+ layout1.addWidget(textLabel6)
+
+ textLabel7 = QLabel(widget,"textLabel7")
+ textLabel7.setText(self.__tr("CUPS/IPP Printer URI: %1").arg(p.printer_uri))
+ layout1.addWidget(textLabel7)
+
+ self.addWidget(widget, p.name)
+
+
+ def __tr(self,s,c = None):
+ return qApp.translate("ScrollPrinterInfoView",s,c)
+
+
+
+
+# ***********************************************************************************
+#
+# Color cal type 7
+#
+# ***********************************************************************************
+
+class ScrollColorCalView(ScrollView):
+ def __init__(self, service, parent = None, form=None, name = None,fl = 0):
+ ScrollView.__init__(self, service, parent, name, fl)
+ self.dialog = parent
+
+
+ def fillControls(self):
+ ScrollView.fillControls(self)
+ self.addLoadPaper(PAPER_TYPE_HP_ADV_PHOTO)
+
+ self.printButton = self.addActionButton("bottom_nav", self.__tr("Perform Color Calibration"),
+ self.colorcalButton_clicked, 'print.png', None)
+
+
+ def colorcalButton_clicked(self):
+ d = self.cur_device
+ printer_name = self.cur_printer
+ printed = False
+
+ try:
+ QApplication.setOverrideCursor(QApplication.waitCursor)
+
+ try:
+ d.open()
+ except Error:
+ self.CheckDeviceUI()
+ else:
+ if d.isIdleAndNoError():
+ QApplication.restoreOverrideCursor()
+ d.close()
+
+ d.setPML(pml.OID_PRINT_INTERNAL_PAGE, pml.PRINT_INTERNAL_PAGE_AUTOMATIC_COLOR_CALIBRATION)
+ printed = True
+
+ else:
+ d.close()
+ self.CheckDeviceUI()
+
+ finally:
+ QApplication.restoreOverrideCursor()
+
+ if printed:
+ QMessageBox.information(self,
+ self.caption(),
+ self.__tr("<p><b>A test page should be printing on your printer.</b><p>If the page fails to print, please visit http://hplip.sourceforge.net for troubleshooting and support."),
+ QMessageBox.Ok,
+ QMessageBox.NoButton,
+ QMessageBox.NoButton)
+
+ self.dialog.accept()
+
+
+ def CheckDeviceUI(self):
+ self.FailureUI(self.__tr("<b>Device is busy or in an error state.</b><p>Please check device and try again."))
+
+
+ def FailureUI(self, error_text):
+ QMessageBox.critical(self,
+ self.caption(),
+ error_text,
+ QMessageBox.Ok,
+ QMessageBox.NoButton,
+ QMessageBox.NoButton)
+
+
+ def __tr(self,s,c = None):
+ return qApp.translate("ScrollColorCalView",s,c)
diff --git a/ui/devmgr4_base.py b/ui/devmgr4_base.py
new file mode 100644
index 0000000..49b7f84
--- /dev/null
+++ b/ui/devmgr4_base.py
@@ -0,0 +1,576 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'ui/devmgr4_base.ui'
+#
+# Created: Fri Feb 3 12:00:32 2012
+# by: The PyQt User Interface Compiler (pyuic) 3.18.1
+#
+# WARNING! All changes made in this file will be lost!
+
+
+from qt import *
+
+
+class DevMgr4_base(QMainWindow):
+ def __init__(self,parent = None,name = None,fl = 0,latest_available_version="",Is_autoInstaller_distro=False):
+ QMainWindow.__init__(self,parent,name,fl)
+ self.statusBar()
+
+ if not name:
+ self.setName("DevMgr4_base")
+
+ self.latest_available_version= latest_available_version
+ self.Is_autoInstaller_distro= Is_autoInstaller_distro
+
+ self.setCentralWidget(QWidget(self,"qt_central_widget"))
+ DevMgr4_baseLayout = QGridLayout(self.centralWidget(),1,1,11,6,"DevMgr4_baseLayout")
+
+ self.splitter2 = QSplitter(self.centralWidget(),"splitter2")
+ self.splitter2.setOrientation(QSplitter.Horizontal)
+
+ LayoutWidget = QWidget(self.splitter2,"layout8")
+ layout8 = QVBoxLayout(LayoutWidget,11,6,"layout8")
+
+ self.DeviceList = QIconView(LayoutWidget,"DeviceList")
+ self.DeviceList.setSizePolicy(QSizePolicy(QSizePolicy.MinimumExpanding,QSizePolicy.Preferred,0,0,self.DeviceList.sizePolicy().hasHeightForWidth()))
+ self.DeviceList.setMinimumSize(QSize(0,0))
+ self.DeviceList.setMaximumSize(QSize(32767,32767))
+ self.DeviceList.setResizePolicy(QIconView.Manual)
+ self.DeviceList.setArrangement(QIconView.TopToBottom)
+ self.DeviceList.setResizeMode(QIconView.Adjust)
+ layout8.addWidget(self.DeviceList)
+
+ self.Tabs = QTabWidget(self.splitter2,"Tabs")
+
+ self.FunctionsTab = QWidget(self.Tabs,"FunctionsTab")
+ FunctionsTabLayout = QGridLayout(self.FunctionsTab,1,1,11,6,"FunctionsTabLayout")
+
+ self.iconList = QIconView(self.FunctionsTab,"iconList")
+ self.iconList.setFrameShape(QIconView.StyledPanel)
+ self.iconList.setFrameShadow(QIconView.Sunken)
+ self.iconList.setSelectionMode(QIconView.Single)
+ self.iconList.setGridX(100)
+ self.iconList.setGridY(100)
+ self.iconList.setResizeMode(QIconView.Adjust)
+ self.iconList.setShowToolTips(0)
+
+ FunctionsTabLayout.addWidget(self.iconList,0,0)
+ self.Tabs.insertTab(self.FunctionsTab,QString.fromLatin1(""))
+
+ self.StatusTab = QWidget(self.Tabs,"StatusTab")
+ StatusTabLayout = QGridLayout(self.StatusTab,1,1,11,6,"StatusTabLayout")
+
+ self.statusListView = QListView(self.StatusTab,"statusListView")
+ self.statusListView.addColumn(QString.null)
+ self.statusListView.addColumn(self.__tr("Description"))
+ self.statusListView.addColumn(self.__tr("Date and Time"))
+ self.statusListView.addColumn(self.__tr("Code"))
+ self.statusListView.addColumn(self.__tr("Job ID"))
+ self.statusListView.addColumn(self.__tr("User"))
+ self.statusListView.setSelectionMode(QListView.NoSelection)
+ self.statusListView.setAllColumnsShowFocus(1)
+ self.statusListView.setResizeMode(QListView.NoColumn)
+
+ StatusTabLayout.addWidget(self.statusListView,1,0)
+
+ layout11 = QHBoxLayout(None,0,6,"layout11")
+ spacer3 = QSpacerItem(20,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ layout11.addItem(spacer3)
+
+ self.panel = QLabel(self.StatusTab,"panel")
+ self.panel.setSizePolicy(QSizePolicy(QSizePolicy.Fixed,QSizePolicy.Fixed,0,0,self.panel.sizePolicy().hasHeightForWidth()))
+ self.panel.setMinimumSize(QSize(254,40))
+ self.panel.setScaledContents(1)
+ layout11.addWidget(self.panel)
+ spacer4 = QSpacerItem(21,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ layout11.addItem(spacer4)
+
+ StatusTabLayout.addLayout(layout11,0,0)
+ self.Tabs.insertTab(self.StatusTab,QString.fromLatin1(""))
+
+ self.SuppliesTab = QWidget(self.Tabs,"SuppliesTab")
+ SuppliesTabLayout = QGridLayout(self.SuppliesTab,1,1,11,6,"SuppliesTabLayout")
+
+ self.suppliesList = QListView(self.SuppliesTab,"suppliesList")
+ self.suppliesList.addColumn(QString.null)
+ self.suppliesList.addColumn(self.__tr("Description"))
+ self.suppliesList.addColumn(self.__tr("HP Part No."))
+ self.suppliesList.addColumn(self.__tr("Approx. Level"))
+ self.suppliesList.addColumn(self.__tr("Status"))
+ self.suppliesList.setSelectionMode(QListView.NoSelection)
+ self.suppliesList.setAllColumnsShowFocus(1)
+ self.suppliesList.setResizeMode(QListView.NoColumn)
+
+ SuppliesTabLayout.addWidget(self.suppliesList,0,0)
+ self.Tabs.insertTab(self.SuppliesTab,QString.fromLatin1(""))
+
+ self.PrintSettingsTab = QWidget(self.Tabs,"PrintSettingsTab")
+ self.Tabs.insertTab(self.PrintSettingsTab,QString.fromLatin1(""))
+
+ self.PrintJobsTab = QWidget(self.Tabs,"PrintJobsTab")
+ PrintJobsTabLayout = QGridLayout(self.PrintJobsTab,1,1,11,6,"PrintJobsTabLayout")
+
+ self.groupBox2 = QGroupBox(self.PrintJobsTab,"groupBox2")
+ self.groupBox2.setColumnLayout(0,Qt.Vertical)
+ self.groupBox2.layout().setSpacing(6)
+ self.groupBox2.layout().setMargin(11)
+ groupBox2Layout = QGridLayout(self.groupBox2.layout())
+ groupBox2Layout.setAlignment(Qt.AlignTop)
+
+ self.jobList = QListView(self.groupBox2,"jobList")
+ self.jobList.addColumn(QString.null)
+ self.jobList.addColumn(QString.null)
+ self.jobList.addColumn(self.__tr("Title/Description"))
+ self.jobList.addColumn(self.__tr("Status"))
+ self.jobList.addColumn(self.__tr("Job ID"))
+ self.jobList.setSelectionMode(QListView.NoSelection)
+ self.jobList.setAllColumnsShowFocus(1)
+ self.jobList.setResizeMode(QListView.NoColumn)
+
+ groupBox2Layout.addMultiCellWidget(self.jobList,0,0,0,2)
+
+ self.cancelToolButton = QToolButton(self.groupBox2,"cancelToolButton")
+ self.cancelToolButton.setSizePolicy(QSizePolicy(QSizePolicy.Fixed,QSizePolicy.Fixed,0,0,self.cancelToolButton.sizePolicy().hasHeightForWidth()))
+ self.cancelToolButton.setMinimumSize(QSize(32,32))
+
+ groupBox2Layout.addWidget(self.cancelToolButton,1,0)
+
+ self.infoToolButton = QToolButton(self.groupBox2,"infoToolButton")
+ self.infoToolButton.setSizePolicy(QSizePolicy(QSizePolicy.Fixed,QSizePolicy.Fixed,0,0,self.infoToolButton.sizePolicy().hasHeightForWidth()))
+ self.infoToolButton.setMinimumSize(QSize(32,32))
+
+ groupBox2Layout.addWidget(self.infoToolButton,1,1)
+ spacer5 = QSpacerItem(360,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ groupBox2Layout.addItem(spacer5,1,2)
+
+ PrintJobsTabLayout.addMultiCellWidget(self.groupBox2,2,2,0,3)
+
+ self.groupBox1 = QGroupBox(self.PrintJobsTab,"groupBox1")
+ self.groupBox1.setColumnLayout(0,Qt.Vertical)
+ self.groupBox1.layout().setSpacing(6)
+ self.groupBox1.layout().setMargin(11)
+ groupBox1Layout = QGridLayout(self.groupBox1.layout())
+ groupBox1Layout.setAlignment(Qt.AlignTop)
+
+ self.defaultPushButton = QPushButton(self.groupBox1,"defaultPushButton")
+
+ groupBox1Layout.addWidget(self.defaultPushButton,0,2)
+
+ self.rejectacceptPushButton = QPushButton(self.groupBox1,"rejectacceptPushButton")
+
+ groupBox1Layout.addWidget(self.rejectacceptPushButton,0,1)
+
+ self.stopstartPushButton = QPushButton(self.groupBox1,"stopstartPushButton")
+
+ groupBox1Layout.addWidget(self.stopstartPushButton,0,0)
+
+ PrintJobsTabLayout.addMultiCellWidget(self.groupBox1,1,1,0,3)
+ spacer6 = QSpacerItem(20,20,QSizePolicy.Preferred,QSizePolicy.Minimum)
+ PrintJobsTabLayout.addItem(spacer6,0,0)
+ spacer7 = QSpacerItem(20,20,QSizePolicy.Preferred,QSizePolicy.Minimum)
+ PrintJobsTabLayout.addItem(spacer7,0,3)
+
+ self.PrintJobPrinterCombo = QComboBox(0,self.PrintJobsTab,"PrintJobPrinterCombo")
+ self.PrintJobPrinterCombo.setSizePolicy(QSizePolicy(QSizePolicy.Expanding,QSizePolicy.Fixed,0,0,self.PrintJobPrinterCombo.sizePolicy().hasHeightForWidth()))
+ self.PrintJobPrinterCombo.setMinimumSize(QSize(0,0))
+
+ PrintJobsTabLayout.addWidget(self.PrintJobPrinterCombo,0,2)
+
+ self.printerTextLabel = QLabel(self.PrintJobsTab,"printerTextLabel")
+
+ PrintJobsTabLayout.addWidget(self.printerTextLabel,0,1)
+ self.Tabs.insertTab(self.PrintJobsTab,QString.fromLatin1(""))
+ if self.latest_available_version is not "":
+ self.UpgradeTab = QWidget(self.Tabs,"UpgradeTab")
+ self.UpgradeLabel = QLabel(self.UpgradeTab,"UpgradeLabel")
+ msg="Latest 'HPLIP-%s' version available for Installation"%self.latest_available_version
+ self.UpgradeLabel.setText(self.__tr(msg))
+ self.UpgradeLabel.setGeometry(QRect(17,43,330,20))
+ if self.Is_autoInstaller_distro:
+ self.InstallPushButton = QPushButton(self.UpgradeTab,"InstallPushButton")
+ self.InstallPushButton.setText(self.__tr("Install Now"))
+ self.InstallPushButton.setGeometry(QRect(390,40,111,30))
+ else:
+ self.ManualInfoLabel = QLabel(self.UpgradeTab,"ManualInfoLabel")
+ msg="Please install manually as mentioned in "
+ self.ManualInfoLabel.setText(self.__tr(msg))
+ self.ManualInfoLabel.setGeometry(QRect(17,70,300,30))
+
+ self.InstallPushButton = QPushButton(self.UpgradeTab,"InstallPushButton")
+ self.InstallPushButton.setText(self.__tr("HPLIP website"))
+ self.InstallPushButton.setGeometry(QRect(260,70,100,25))
+
+ self.Tabs.insertTab(self.UpgradeTab,QString.fromLatin1(""))
+
+
+ DevMgr4_baseLayout.addWidget(self.splitter2,0,0)
+
+ self.helpContentsAction = QAction(self,"helpContentsAction")
+ self.helpIndexAction = QAction(self,"helpIndexAction")
+ self.helpIndexAction.setEnabled(0)
+ self.helpAboutAction = QAction(self,"helpAboutAction")
+ self.deviceRescanAction = QAction(self,"deviceRescanAction")
+ self.deviceExitAction = QAction(self,"deviceExitAction")
+ self.settingsPopupAlertsAction = QAction(self,"settingsPopupAlertsAction")
+ self.settingsEmailAlertsAction = QAction(self,"settingsEmailAlertsAction")
+ self.settingsConfigure = QAction(self,"settingsConfigure")
+ self.deviceRefreshAll = QAction(self,"deviceRefreshAll")
+ self.autoRefresh = QAction(self,"autoRefresh")
+ self.autoRefresh.setToggleAction(1)
+ self.autoRefresh.setOn(1)
+ self.setupDevice = QAction(self,"setupDevice")
+ self.setupDevice.setEnabled(0)
+ self.viewSupportAction = QAction(self,"viewSupportAction")
+ self.deviceInstallAction = QAction(self,"deviceInstallAction")
+ self.deviceRemoveAction = QAction(self,"deviceRemoveAction")
+
+
+ self.Toolbar = QToolBar(QString(""),self,Qt.DockTop)
+
+
+
+ self.MenuBar = QMenuBar(self,"MenuBar")
+
+ self.MenuBar.setAcceptDrops(0)
+
+ self.Device = QPopupMenu(self)
+ self.setupDevice.addTo(self.Device)
+ self.Device.insertSeparator()
+ self.deviceRescanAction.addTo(self.Device)
+ self.deviceRefreshAll.addTo(self.Device)
+ self.Device.insertSeparator()
+ self.deviceInstallAction.addTo(self.Device)
+ self.deviceRemoveAction.addTo(self.Device)
+ self.Device.insertSeparator()
+ self.deviceExitAction.addTo(self.Device)
+ self.MenuBar.insertItem(QString(""),self.Device,2)
+
+ self.Configure = QPopupMenu(self)
+ self.settingsConfigure.addTo(self.Configure)
+ self.MenuBar.insertItem(QString(""),self.Configure,3)
+
+ self.helpMenu = QPopupMenu(self)
+ self.helpContentsAction.addTo(self.helpMenu)
+ self.helpMenu.insertSeparator()
+ self.helpAboutAction.addTo(self.helpMenu)
+ self.MenuBar.insertItem(QString(""),self.helpMenu,4)
+
+ self.MenuBar.insertSeparator(5)
+
+
+ self.languageChange()
+
+ self.resize(QSize(778,505).expandedTo(self.minimumSizeHint()))
+ self.clearWState(Qt.WState_Polished)
+
+ self.connect(self.helpIndexAction,SIGNAL("activated()"),self.helpIndex)
+ self.connect(self.helpContentsAction,SIGNAL("activated()"),self.helpContents)
+ self.connect(self.helpAboutAction,SIGNAL("activated()"),self.helpAbout)
+ self.connect(self.deviceExitAction,SIGNAL("activated()"),self.close)
+ self.connect(self.deviceRescanAction,SIGNAL("activated()"),self.deviceRescanAction_activated)
+ self.connect(self.settingsConfigure,SIGNAL("activated()"),self.settingsConfigure_activated)
+ self.connect(self.DeviceList,SIGNAL("currentChanged(QIconViewItem*)"),self.DeviceList_currentChanged)
+ self.connect(self.deviceRefreshAll,SIGNAL("activated()"),self.deviceRefreshAll_activated)
+ self.connect(self.DeviceList,SIGNAL("clicked(QIconViewItem*)"),self.DeviceList_clicked)
+ self.connect(self.DeviceList,SIGNAL("rightButtonClicked(QIconViewItem*,const QPoint&)"),self.DeviceList_rightButtonClicked)
+ self.connect(self.setupDevice,SIGNAL("activated()"),self.setupDevice_activated)
+ self.connect(self.viewSupportAction,SIGNAL("activated()"),self.viewSupportAction_activated)
+ self.connect(self.deviceInstallAction,SIGNAL("activated()"),self.deviceInstallAction_activated)
+ self.connect(self.deviceRemoveAction,SIGNAL("activated()"),self.deviceRemoveAction_activated)
+ self.connect(self.DeviceList,SIGNAL("onItem(QIconViewItem*)"),self.DeviceList_onItem)
+ self.connect(self.Tabs,SIGNAL("currentChanged(QWidget*)"),self.Tabs_currentChanged)
+ self.connect(self.PrintJobPrinterCombo,SIGNAL("activated(const QString&)"),self.PrintJobPrinterCombo_activated)
+ self.connect(self.stopstartPushButton,SIGNAL("clicked()"),self.stopstartPushButton_clicked)
+ self.connect(self.rejectacceptPushButton,SIGNAL("clicked()"),self.rejectacceptPushButton_clicked)
+ self.connect(self.defaultPushButton,SIGNAL("clicked()"),self.defaultPushButton_clicked)
+ self.connect(self.iconList,SIGNAL("clicked(QIconViewItem*)"),self.iconList_clicked)
+ self.connect(self.iconList,SIGNAL("contextMenuRequested(QIconViewItem*,const QPoint&)"),self.iconList_contextMenuRequested)
+ self.connect(self.iconList,SIGNAL("returnPressed(QIconViewItem*)"),self.iconList_returnPressed)
+ self.connect(self.jobList,SIGNAL("clicked(QListViewItem*)"),self.jobList_clicked)
+ self.connect(self.infoToolButton,SIGNAL("clicked()"),self.infoToolButton_clicked)
+ self.connect(self.cancelToolButton,SIGNAL("clicked()"),self.cancelToolButton_clicked)
+ self.connect(self.jobList,SIGNAL("contextMenuRequested(QListViewItem*,const QPoint&,int)"),self.jobList_contextMenuRequested)
+ if self.latest_available_version is not "":
+ self.connect(self.InstallPushButton,SIGNAL("clicked()"),self.InstallPushButton_clicked)
+
+ def languageChange(self):
+ self.setCaption(self.__tr("HP Device Manager"))
+ self.Tabs.changeTab(self.FunctionsTab,self.__tr("Actions"))
+ self.statusListView.header().setLabel(0,QString.null)
+ self.statusListView.header().setLabel(1,self.__tr("Description"))
+ self.statusListView.header().setLabel(2,self.__tr("Date and Time"))
+ self.statusListView.header().setLabel(3,self.__tr("Code"))
+ self.statusListView.header().setLabel(4,self.__tr("Job ID"))
+ self.statusListView.header().setLabel(5,self.__tr("User"))
+ self.Tabs.changeTab(self.StatusTab,self.__tr("Status"))
+ self.suppliesList.header().setLabel(0,QString.null)
+ self.suppliesList.header().setLabel(1,self.__tr("Description"))
+ self.suppliesList.header().setLabel(2,self.__tr("HP Part No."))
+ self.suppliesList.header().setLabel(3,self.__tr("Approx. Level"))
+ self.suppliesList.header().setLabel(4,self.__tr("Status"))
+ self.Tabs.changeTab(self.SuppliesTab,self.__tr("Supplies"))
+ self.Tabs.changeTab(self.PrintSettingsTab,self.__tr("Print Settings"))
+ self.groupBox2.setTitle(self.__tr("Active Jobs"))
+ self.jobList.header().setLabel(0,QString.null)
+ self.jobList.header().setLabel(1,QString.null)
+ self.jobList.header().setLabel(2,self.__tr("Title/Description"))
+ self.jobList.header().setLabel(3,self.__tr("Status"))
+ self.jobList.header().setLabel(4,self.__tr("Job ID"))
+ self.cancelToolButton.setText(QString.null)
+ self.infoToolButton.setText(QString.null)
+ self.groupBox1.setTitle(self.__tr("Printer (Queue) Control"))
+ self.defaultPushButton.setText(self.__tr("Set As Default"))
+ self.rejectacceptPushButton.setText(self.__tr("Reject Jobs"))
+ self.stopstartPushButton.setText(self.__tr("Stop Printer"))
+ self.printerTextLabel.setText(self.__tr("Printer Name:"))
+ self.Tabs.changeTab(self.PrintJobsTab,self.__tr("Print Control"))
+ if self.latest_available_version is not "":
+ self.Tabs.changeTab(self.UpgradeTab,self.__tr("Upgrade"))
+ self.helpContentsAction.setText(self.__tr("Contents"))
+ self.helpContentsAction.setMenuText(self.__tr("&Contents..."))
+ self.helpContentsAction.setToolTip(self.__tr("Help Contents (F1)"))
+ self.helpContentsAction.setAccel(self.__tr("F1"))
+ self.helpIndexAction.setText(self.__tr("Index"))
+ self.helpIndexAction.setMenuText(self.__tr("&Index..."))
+ self.helpIndexAction.setAccel(QString.null)
+ self.helpAboutAction.setText(self.__tr("&About..."))
+ self.helpAboutAction.setMenuText(self.__tr("&About..."))
+ self.helpAboutAction.setToolTip(self.__tr("About HP Device Manager..."))
+ self.deviceRescanAction.setText(self.__tr("Refresh Device"))
+ self.deviceRescanAction.setMenuText(self.__tr("Refresh Device"))
+ self.deviceRescanAction.setToolTip(self.__tr("Refresh Device (F5)"))
+ self.deviceRescanAction.setAccel(self.__tr("F5"))
+ self.deviceExitAction.setText(self.__tr("Exit"))
+ self.deviceExitAction.setMenuText(self.__tr("Exit"))
+ self.deviceExitAction.setToolTip(self.__tr("Exit HP Device Manager"))
+ self.deviceExitAction.setAccel(self.__tr("Ctrl+Q"))
+ self.settingsPopupAlertsAction.setText(self.__tr("Popup Alerts..."))
+ self.settingsPopupAlertsAction.setMenuText(self.__tr("Popup alerts..."))
+ self.settingsPopupAlertsAction.setToolTip(self.__tr("Configure popup alerts"))
+ self.settingsEmailAlertsAction.setText(self.__tr("Email alerts..."))
+ self.settingsEmailAlertsAction.setMenuText(self.__tr("Email alerts..."))
+ self.settingsEmailAlertsAction.setToolTip(self.__tr("Configure email alerts"))
+ self.settingsConfigure.setText(self.__tr("Settings..."))
+ self.settingsConfigure.setAccel(self.__tr("F2"))
+ self.deviceRefreshAll.setText(self.__tr("Refresh All"))
+ self.deviceRefreshAll.setAccel(self.__tr("F6"))
+ self.autoRefresh.setText(self.__tr("Auto Refresh"))
+ self.autoRefresh.setToolTip(self.__tr("Turn on/off Auto Refresh (Ctrl+A)"))
+ self.autoRefresh.setAccel(self.__tr("Ctrl+A"))
+ self.setupDevice.setText(self.__tr("Action"))
+ self.setupDevice.setMenuText(self.__tr("Settings..."))
+ self.setupDevice.setToolTip(self.__tr("Device Settings (F3)"))
+ self.setupDevice.setAccel(self.__tr("F3"))
+ self.viewSupportAction.setText(self.__tr("Support..."))
+ self.deviceInstallAction.setText(self.__tr("Setup New Device..."))
+ self.deviceInstallAction.setMenuText(self.__tr("Setup New Device..."))
+ self.deviceInstallAction.setAccel(self.__tr("Ins"))
+ self.deviceRemoveAction.setText(self.__tr("Remove Device..."))
+ self.deviceRemoveAction.setMenuText(self.__tr("Remove Device..."))
+ self.deviceRemoveAction.setAccel(self.__tr("Del"))
+ self.Toolbar.setLabel(self.__tr("Toolbar"))
+ if self.MenuBar.findItem(2):
+ self.MenuBar.findItem(2).setText(self.__tr("Device"))
+ if self.MenuBar.findItem(3):
+ self.MenuBar.findItem(3).setText(self.__tr("Configure"))
+ if self.MenuBar.findItem(4):
+ self.MenuBar.findItem(4).setText(self.__tr("&Help"))
+
+
+ def fileNew(self):
+ print "DevMgr4_base.fileNew(): Not implemented yet"
+
+ def fileOpen(self):
+ print "DevMgr4_base.fileOpen(): Not implemented yet"
+
+ def fileSave(self):
+ print "DevMgr4_base.fileSave(): Not implemented yet"
+
+ def fileSaveAs(self):
+ print "DevMgr4_base.fileSaveAs(): Not implemented yet"
+
+ def filePrint(self):
+ print "DevMgr4_base.filePrint(): Not implemented yet"
+
+ def fileExit(self):
+ print "DevMgr4_base.fileExit(): Not implemented yet"
+
+ def editUndo(self):
+ print "DevMgr4_base.editUndo(): Not implemented yet"
+
+ def editRedo(self):
+ print "DevMgr4_base.editRedo(): Not implemented yet"
+
+ def editCut(self):
+ print "DevMgr4_base.editCut(): Not implemented yet"
+
+ def editCopy(self):
+ print "DevMgr4_base.editCopy(): Not implemented yet"
+
+ def editPaste(self):
+ print "DevMgr4_base.editPaste(): Not implemented yet"
+
+ def editFind(self):
+ print "DevMgr4_base.editFind(): Not implemented yet"
+
+ def helpIndex(self):
+ print "DevMgr4_base.helpIndex(): Not implemented yet"
+
+ def helpContents(self):
+ print "DevMgr4_base.helpContents(): Not implemented yet"
+
+ def helpAbout(self):
+ print "DevMgr4_base.helpAbout(): Not implemented yet"
+
+ def deviceRescanAction_activated(self):
+ print "DevMgr4_base.deviceRescanAction_activated(): Not implemented yet"
+
+ def settingsEmailAlertsAction_activated(self):
+ print "DevMgr4_base.settingsEmailAlertsAction_activated(): Not implemented yet"
+
+ def DeviceList_currentChanged(self,a0):
+ print "DevMgr4_base.DeviceList_currentChanged(QIconViewItem*): Not implemented yet"
+
+ def CleanPensButton_clicked(self):
+ print "DevMgr4_base.CleanPensButton_clicked(): Not implemented yet"
+
+ def AlignPensButton_clicked(self):
+ print "DevMgr4_base.AlignPensButton_clicked(): Not implemented yet"
+
+ def PrintTestPageButton_clicked(self):
+ print "DevMgr4_base.PrintTestPageButton_clicked(): Not implemented yet"
+
+ def AdvancedInfoButton_clicked(self):
+ print "DevMgr4_base.AdvancedInfoButton_clicked(): Not implemented yet"
+
+ def ColorCalibrationButton_clicked(self):
+ print "DevMgr4_base.ColorCalibrationButton_clicked(): Not implemented yet"
+
+ def settingsConfigure_activated(self):
+ print "DevMgr4_base.settingsConfigure_activated(): Not implemented yet"
+
+ def PrintButton_clicked(self):
+ print "DevMgr4_base.PrintButton_clicked(): Not implemented yet"
+
+ def ScanButton_clicked(self):
+ print "DevMgr4_base.ScanButton_clicked(): Not implemented yet"
+
+ def PCardButton_clicked(self):
+ print "DevMgr4_base.PCardButton_clicked(): Not implemented yet"
+
+ def SendFaxButton_clicked(self):
+ print "DevMgr4_base.SendFaxButton_clicked(): Not implemented yet"
+
+ def MakeCopiesButton_clicked(self):
+ print "DevMgr4_base.MakeCopiesButton_clicked(): Not implemented yet"
+
+ def ConfigureFeaturesButton_clicked(self):
+ print "DevMgr4_base.ConfigureFeaturesButton_clicked(): Not implemented yet"
+
+ def CancelJobButton_clicked(self):
+ print "DevMgr4_base.CancelJobButton_clicked(): Not implemented yet"
+
+ def deviceRefreshAll_activated(self):
+ print "DevMgr4_base.deviceRefreshAll_activated(): Not implemented yet"
+
+ def DeviceList_clicked(self,a0):
+ print "DevMgr4_base.DeviceList_clicked(QIconViewItem*): Not implemented yet"
+
+ def autoRefresh_toggled(self,a0):
+ print "DevMgr4_base.autoRefresh_toggled(bool): Not implemented yet"
+
+ def PrintJobList_currentChanged(self,a0):
+ print "DevMgr4_base.PrintJobList_currentChanged(QListViewItem*): Not implemented yet"
+
+ def CancelPrintJobButton_clicked(self):
+ print "DevMgr4_base.CancelPrintJobButton_clicked(): Not implemented yet"
+
+ def PrintJobList_selectionChanged(self,a0):
+ print "DevMgr4_base.PrintJobList_selectionChanged(QListViewItem*): Not implemented yet"
+
+ def DeviceList_rightButtonClicked(self,a0,a1):
+ print "DevMgr4_base.DeviceList_rightButtonClicked(QIconViewItem*,const QPoint&): Not implemented yet"
+
+ def OpenEmbeddedBrowserButton_clicked(self):
+ print "DevMgr4_base.OpenEmbeddedBrowserButton_clicked(): Not implemented yet"
+
+ def deviceSettingsButton_clicked(self):
+ print "DevMgr4_base.deviceSettingsButton_clicked(): Not implemented yet"
+
+ def faxSetupWizardButton_clicked(self):
+ print "DevMgr4_base.faxSetupWizardButton_clicked(): Not implemented yet"
+
+ def faxSettingsButton_clicked(self):
+ print "DevMgr4_base.faxSettingsButton_clicked(): Not implemented yet"
+
+ def setupDevice_activated(self):
+ print "DevMgr4_base.setupDevice_activated(): Not implemented yet"
+
+ def viewSupportAction_activated(self):
+ print "DevMgr4_base.viewSupportAction_activated(): Not implemented yet"
+
+ def installDevice_activated(self):
+ print "DevMgr4_base.installDevice_activated(): Not implemented yet"
+
+ def deviceInstallAction_activated(self):
+ print "DevMgr4_base.deviceInstallAction_activated(): Not implemented yet"
+
+ def deviceRemoveAction_activated(self):
+ print "DevMgr4_base.deviceRemoveAction_activated(): Not implemented yet"
+
+ def Tabs_currentChanged(self,a0):
+ print "DevMgr4_base.Tabs_currentChanged(QWidget*): Not implemented yet"
+
+ def DeviceList_onItem(self,a0):
+ print "DevMgr4_base.DeviceList_onItem(QIconViewItem*): Not implemented yet"
+
+ def iconList_doubleClicked(self,a0):
+ print "DevMgr4_base.iconList_doubleClicked(QIconViewItem*): Not implemented yet"
+
+ def iconList_rightButtonClicked(self,a0,a1):
+ print "DevMgr4_base.iconList_rightButtonClicked(QIconViewItem*,const QPoint&): Not implemented yet"
+
+ def iconList_clicked(self,a0):
+ print "DevMgr4_base.iconList_clicked(QIconViewItem*): Not implemented yet"
+
+ def iconList_contextMenuRequested(self,a0,a1):
+ print "DevMgr4_base.iconList_contextMenuRequested(QIconViewItem*,const QPoint&): Not implemented yet"
+
+ def iconList_returnPressed(self,a0):
+ print "DevMgr4_base.iconList_returnPressed(QIconViewItem*): Not implemented yet"
+
+ def stopstartPushButton_clicked(self):
+ print "DevMgr4_base.stopstartPushButton_clicked(): Not implemented yet"
+
+ def rejectacceptPushButton_clicked(self):
+ print "DevMgr4_base.rejectacceptPushButton_clicked(): Not implemented yet"
+
+ def defaultPushButton_clicked(self):
+ print "DevMgr4_base.defaultPushButton_clicked(): Not implemented yet"
+
+ def PrintJobPrinterCombo_activated(self,a0):
+ print "DevMgr4_base.PrintJobPrinterCombo_activated(const QString&): Not implemented yet"
+
+ def PrintSettingsPrinterCombo_activated(self,a0):
+ print "DevMgr4_base.PrintSettingsPrinterCombo_activated(const QString&): Not implemented yet"
+
+ def jobList_rightButtonClicked(self,a0,a1,a2):
+ print "DevMgr4_base.jobList_rightButtonClicked(QListViewItem*,const QPoint&,int): Not implemented yet"
+
+ def jobList_clicked(self,a0):
+ print "DevMgr4_base.jobList_clicked(QListViewItem*): Not implemented yet"
+
+ def infoToolButton_clicked(self):
+ print "DevMgr4_base.infoToolButton_clicked(): Not implemented yet"
+
+ def cancelToolButton_clicked(self):
+ print "DevMgr4_base.cancelToolButton_clicked(): Not implemented yet"
+
+ def InstallPushButton_clicked(self):
+ print "DevMgr4_base.InstallPushButton_clicked(): Not implemented yet"
+
+ def jobList_contextMenuRequested(self,a0,a1,a2):
+ print "DevMgr4_base.jobList_contextMenuRequested(QListViewItem*,const QPoint&,int): Not implemented yet"
+
+ def __tr(self,s,c = None):
+ return qApp.translate("DevMgr4_base",s,c)
diff --git a/ui/devmgr4_base.ui b/ui/devmgr4_base.ui
new file mode 100644
index 0000000..31c58b7
--- /dev/null
+++ b/ui/devmgr4_base.ui
@@ -0,0 +1,1161 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>DevMgr4_base</class>
+<widget class="QMainWindow">
+ <property name="name">
+ <cstring>DevMgr4_base</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>778</width>
+ <height>505</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>HP Device Manager</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QSplitter" row="0" column="0">
+ <property name="name">
+ <cstring>splitter2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout8</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QIconView">
+ <property name="name">
+ <cstring>DeviceList</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>3</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>32767</width>
+ <height>32767</height>
+ </size>
+ </property>
+ <property name="resizePolicy">
+ <enum>Manual</enum>
+ </property>
+ <property name="arrangement">
+ <enum>TopToBottom</enum>
+ </property>
+ <property name="resizeMode">
+ <enum>Adjust</enum>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QTabWidget">
+ <property name="name">
+ <cstring>Tabs</cstring>
+ </property>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>FunctionsTab</cstring>
+ </property>
+ <attribute name="title">
+ <string>Actions</string>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QIconView" row="0" column="0">
+ <property name="name">
+ <cstring>iconList</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>StyledPanel</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Sunken</enum>
+ </property>
+ <property name="selectionMode">
+ <enum>Single</enum>
+ </property>
+ <property name="gridX">
+ <number>100</number>
+ </property>
+ <property name="gridY">
+ <number>100</number>
+ </property>
+ <property name="resizeMode">
+ <enum>Adjust</enum>
+ </property>
+ <property name="showToolTips">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>StatusTab</cstring>
+ </property>
+ <attribute name="title">
+ <string>Status</string>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QListView" row="1" column="0">
+ <column>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Description</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Date and Time</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Code</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Job ID</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>User</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>statusListView</cstring>
+ </property>
+ <property name="selectionMode">
+ <enum>NoSelection</enum>
+ </property>
+ <property name="allColumnsShowFocus">
+ <bool>true</bool>
+ </property>
+ <property name="resizeMode">
+ <enum>NoColumn</enum>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="0" column="0">
+ <property name="name">
+ <cstring>layout11</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>spacer3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>panel</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>254</width>
+ <height>40</height>
+ </size>
+ </property>
+ <property name="scaledContents">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer4</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>21</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>SuppliesTab</cstring>
+ </property>
+ <attribute name="title">
+ <string>Supplies</string>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QListView" row="0" column="0">
+ <column>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Description</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>HP Part No.</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Approx. Level</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Status</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>suppliesList</cstring>
+ </property>
+ <property name="selectionMode">
+ <enum>NoSelection</enum>
+ </property>
+ <property name="allColumnsShowFocus">
+ <bool>true</bool>
+ </property>
+ <property name="resizeMode">
+ <enum>NoColumn</enum>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>PrintSettingsTab</cstring>
+ </property>
+ <attribute name="title">
+ <string>Print Settings</string>
+ </attribute>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>PrintJobsTab</cstring>
+ </property>
+ <attribute name="title">
+ <string>Print Control</string>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QGroupBox" row="2" column="0" rowspan="1" colspan="4">
+ <property name="name">
+ <cstring>groupBox2</cstring>
+ </property>
+ <property name="title">
+ <string>Active Jobs</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QListView" row="0" column="0" rowspan="1" colspan="3">
+ <column>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Title/Description</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Status</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Job ID</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>jobList</cstring>
+ </property>
+ <property name="selectionMode">
+ <enum>NoSelection</enum>
+ </property>
+ <property name="allColumnsShowFocus">
+ <bool>true</bool>
+ </property>
+ <property name="resizeMode">
+ <enum>NoColumn</enum>
+ </property>
+ </widget>
+ <widget class="QToolButton" row="1" column="0">
+ <property name="name">
+ <cstring>cancelToolButton</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ <widget class="QToolButton" row="1" column="1">
+ <property name="name">
+ <cstring>infoToolButton</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ <spacer row="1" column="2">
+ <property name="name">
+ <cstring>spacer5</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>360</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+ </widget>
+ <widget class="QGroupBox" row="1" column="0" rowspan="1" colspan="4">
+ <property name="name">
+ <cstring>groupBox1</cstring>
+ </property>
+ <property name="title">
+ <string>Printer (Queue) Control</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QPushButton" row="0" column="2">
+ <property name="name">
+ <cstring>defaultPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>Set As Default</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="0" column="1">
+ <property name="name">
+ <cstring>rejectacceptPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>Reject Jobs</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="0" column="0">
+ <property name="name">
+ <cstring>stopstartPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>Stop Printer</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <spacer row="0" column="0">
+ <property name="name">
+ <cstring>spacer6</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Preferred</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <spacer row="0" column="3">
+ <property name="name">
+ <cstring>spacer7</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Preferred</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QComboBox" row="0" column="2">
+ <property name="name">
+ <cstring>PrintJobPrinterCombo</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>0</height>
+ </size>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="1">
+ <property name="name">
+ <cstring>printerTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>Printer Name:</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>TabPage</cstring>
+ </property>
+ <attribute name="title">
+ <string>Upgrade</string>
+ </attribute>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>pushButton4</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>390</x>
+ <y>40</y>
+ <width>111</width>
+ <height>30</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>pushButton4</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>17</x>
+ <y>43</y>
+ <width>330</width>
+ <height>20</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>textLabel1</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel2</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>11</x>
+ <y>91</y>
+ <width>480</width>
+ <height>70</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>textLabel2</string>
+ </property>
+ </widget>
+ </widget>
+ </widget>
+ </widget>
+ </grid>
+</widget>
+<menubar>
+ <property name="name">
+ <cstring>MenuBar</cstring>
+ </property>
+ <property name="acceptDrops">
+ <bool>false</bool>
+ </property>
+ <item text="Device" name="Device">
+ <action name="setupDevice"/>
+ <separator/>
+ <action name="deviceRescanAction"/>
+ <action name="deviceRefreshAll"/>
+ <separator/>
+ <action name="deviceInstallAction"/>
+ <action name="deviceRemoveAction"/>
+ <separator/>
+ <action name="deviceExitAction"/>
+ </item>
+ <item text="Configure" name="Configure">
+ <action name="settingsConfigure"/>
+ </item>
+ <item text="&amp;Help" name="helpMenu">
+ <action name="helpContentsAction"/>
+ <separator/>
+ <action name="helpAboutAction"/>
+ </item>
+ <separator/>
+</menubar>
+<toolbars>
+ <toolbar dock="2">
+ <property name="name">
+ <cstring>Toolbar</cstring>
+ </property>
+ <property name="label">
+ <string>Toolbar</string>
+ </property>
+ </toolbar>
+</toolbars>
+<actions>
+ <action>
+ <property name="name">
+ <cstring>helpContentsAction</cstring>
+ </property>
+ <property name="text">
+ <string>Contents</string>
+ </property>
+ <property name="menuText">
+ <string>&amp;Contents...</string>
+ </property>
+ <property name="toolTip">
+ <string>Help Contents (F1)</string>
+ </property>
+ <property name="accel">
+ <string>F1</string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>helpIndexAction</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Index</string>
+ </property>
+ <property name="menuText">
+ <string>&amp;Index...</string>
+ </property>
+ <property name="accel">
+ <string></string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>helpAboutAction</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;About...</string>
+ </property>
+ <property name="menuText">
+ <string>&amp;About...</string>
+ </property>
+ <property name="toolTip">
+ <string>About HP Device Manager...</string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>deviceRescanAction</cstring>
+ </property>
+ <property name="text">
+ <string>Refresh Device</string>
+ </property>
+ <property name="menuText">
+ <string>Refresh Device</string>
+ </property>
+ <property name="toolTip">
+ <string>Refresh Device (F5)</string>
+ </property>
+ <property name="accel">
+ <string>F5</string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>deviceExitAction</cstring>
+ </property>
+ <property name="text">
+ <string>Exit</string>
+ </property>
+ <property name="menuText">
+ <string>Exit</string>
+ </property>
+ <property name="toolTip">
+ <string>Exit HP Device Manager</string>
+ </property>
+ <property name="accel">
+ <string>Ctrl+Q</string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>settingsPopupAlertsAction</cstring>
+ </property>
+ <property name="text">
+ <string>Popup Alerts...</string>
+ </property>
+ <property name="menuText">
+ <string>Popup alerts...</string>
+ </property>
+ <property name="toolTip">
+ <string>Configure popup alerts</string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>settingsEmailAlertsAction</cstring>
+ </property>
+ <property name="text">
+ <string>Email alerts...</string>
+ </property>
+ <property name="menuText">
+ <string>Email alerts...</string>
+ </property>
+ <property name="toolTip">
+ <string>Configure email alerts</string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>settingsConfigure</cstring>
+ </property>
+ <property name="text">
+ <string>Settings...</string>
+ </property>
+ <property name="accel">
+ <string>F2</string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>deviceRefreshAll</cstring>
+ </property>
+ <property name="text">
+ <string>Refresh All</string>
+ </property>
+ <property name="accel">
+ <string>F6</string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>autoRefresh</cstring>
+ </property>
+ <property name="toggleAction">
+ <bool>true</bool>
+ </property>
+ <property name="on">
+ <bool>true</bool>
+ </property>
+ <property name="text">
+ <string>Auto Refresh</string>
+ </property>
+ <property name="toolTip">
+ <string>Turn on/off Auto Refresh (Ctrl+A)</string>
+ </property>
+ <property name="accel">
+ <string>Ctrl+A</string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>setupDevice</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Action</string>
+ </property>
+ <property name="menuText">
+ <string>Settings...</string>
+ </property>
+ <property name="toolTip">
+ <string>Device Settings (F3)</string>
+ </property>
+ <property name="accel">
+ <string>F3</string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>viewSupportAction</cstring>
+ </property>
+ <property name="text">
+ <string>Support...</string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>deviceInstallAction</cstring>
+ </property>
+ <property name="text">
+ <string>Setup New Device...</string>
+ </property>
+ <property name="menuText">
+ <string>Setup New Device...</string>
+ </property>
+ <property name="accel">
+ <string>Ins</string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>deviceRemoveAction</cstring>
+ </property>
+ <property name="text">
+ <string>Remove Device...</string>
+ </property>
+ <property name="menuText">
+ <string>Remove Device...</string>
+ </property>
+ <property name="accel">
+ <string>Del</string>
+ </property>
+ </action>
+</actions>
+<connections>
+ <connection>
+ <sender>helpIndexAction</sender>
+ <signal>activated()</signal>
+ <receiver>DevMgr4_base</receiver>
+ <slot>helpIndex()</slot>
+ </connection>
+ <connection>
+ <sender>helpContentsAction</sender>
+ <signal>activated()</signal>
+ <receiver>DevMgr4_base</receiver>
+ <slot>helpContents()</slot>
+ </connection>
+ <connection>
+ <sender>helpAboutAction</sender>
+ <signal>activated()</signal>
+ <receiver>DevMgr4_base</receiver>
+ <slot>helpAbout()</slot>
+ </connection>
+ <connection>
+ <sender>deviceExitAction</sender>
+ <signal>activated()</signal>
+ <receiver>DevMgr4_base</receiver>
+ <slot>close()</slot>
+ </connection>
+ <connection>
+ <sender>deviceRescanAction</sender>
+ <signal>activated()</signal>
+ <receiver>DevMgr4_base</receiver>
+ <slot>deviceRescanAction_activated()</slot>
+ </connection>
+ <connection>
+ <sender>settingsConfigure</sender>
+ <signal>activated()</signal>
+ <receiver>DevMgr4_base</receiver>
+ <slot>settingsConfigure_activated()</slot>
+ </connection>
+ <connection>
+ <sender>DeviceList</sender>
+ <signal>currentChanged(QIconViewItem*)</signal>
+ <receiver>DevMgr4_base</receiver>
+ <slot>DeviceList_currentChanged(QIconViewItem*)</slot>
+ </connection>
+ <connection>
+ <sender>deviceRefreshAll</sender>
+ <signal>activated()</signal>
+ <receiver>DevMgr4_base</receiver>
+ <slot>deviceRefreshAll_activated()</slot>
+ </connection>
+ <connection>
+ <sender>DeviceList</sender>
+ <signal>clicked(QIconViewItem*)</signal>
+ <receiver>DevMgr4_base</receiver>
+ <slot>DeviceList_clicked(QIconViewItem*)</slot>
+ </connection>
+ <connection>
+ <sender>DeviceList</sender>
+ <signal>rightButtonClicked(QIconViewItem*,const QPoint&amp;)</signal>
+ <receiver>DevMgr4_base</receiver>
+ <slot>DeviceList_rightButtonClicked(QIconViewItem*,const QPoint&amp;)</slot>
+ </connection>
+ <connection>
+ <sender>setupDevice</sender>
+ <signal>activated()</signal>
+ <receiver>DevMgr4_base</receiver>
+ <slot>setupDevice_activated()</slot>
+ </connection>
+ <connection>
+ <sender>viewSupportAction</sender>
+ <signal>activated()</signal>
+ <receiver>DevMgr4_base</receiver>
+ <slot>viewSupportAction_activated()</slot>
+ </connection>
+ <connection>
+ <sender>deviceInstallAction</sender>
+ <signal>activated()</signal>
+ <receiver>DevMgr4_base</receiver>
+ <slot>deviceInstallAction_activated()</slot>
+ </connection>
+ <connection>
+ <sender>deviceRemoveAction</sender>
+ <signal>activated()</signal>
+ <receiver>DevMgr4_base</receiver>
+ <slot>deviceRemoveAction_activated()</slot>
+ </connection>
+ <connection>
+ <sender>DeviceList</sender>
+ <signal>onItem(QIconViewItem*)</signal>
+ <receiver>DevMgr4_base</receiver>
+ <slot>DeviceList_onItem(QIconViewItem*)</slot>
+ </connection>
+ <connection>
+ <sender>Tabs</sender>
+ <signal>currentChanged(QWidget*)</signal>
+ <receiver>DevMgr4_base</receiver>
+ <slot>Tabs_currentChanged(QWidget*)</slot>
+ </connection>
+ <connection>
+ <sender>PrintJobPrinterCombo</sender>
+ <signal>activated(const QString&amp;)</signal>
+ <receiver>DevMgr4_base</receiver>
+ <slot>PrintJobPrinterCombo_activated(const QString&amp;)</slot>
+ </connection>
+ <connection>
+ <sender>stopstartPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>DevMgr4_base</receiver>
+ <slot>stopstartPushButton_clicked()</slot>
+ </connection>
+ <connection>
+ <sender>rejectacceptPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>DevMgr4_base</receiver>
+ <slot>rejectacceptPushButton_clicked()</slot>
+ </connection>
+ <connection>
+ <sender>defaultPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>DevMgr4_base</receiver>
+ <slot>defaultPushButton_clicked()</slot>
+ </connection>
+ <connection>
+ <sender>iconList</sender>
+ <signal>clicked(QIconViewItem*)</signal>
+ <receiver>DevMgr4_base</receiver>
+ <slot>iconList_clicked(QIconViewItem*)</slot>
+ </connection>
+ <connection>
+ <sender>iconList</sender>
+ <signal>contextMenuRequested(QIconViewItem*,const QPoint&amp;)</signal>
+ <receiver>DevMgr4_base</receiver>
+ <slot>iconList_contextMenuRequested(QIconViewItem*,const QPoint&amp;)</slot>
+ </connection>
+ <connection>
+ <sender>iconList</sender>
+ <signal>returnPressed(QIconViewItem*)</signal>
+ <receiver>DevMgr4_base</receiver>
+ <slot>iconList_returnPressed(QIconViewItem*)</slot>
+ </connection>
+ <connection>
+ <sender>jobList</sender>
+ <signal>clicked(QListViewItem*)</signal>
+ <receiver>DevMgr4_base</receiver>
+ <slot>jobList_clicked(QListViewItem*)</slot>
+ </connection>
+ <connection>
+ <sender>infoToolButton</sender>
+ <signal>clicked()</signal>
+ <receiver>DevMgr4_base</receiver>
+ <slot>infoToolButton_clicked()</slot>
+ </connection>
+ <connection>
+ <sender>cancelToolButton</sender>
+ <signal>clicked()</signal>
+ <receiver>DevMgr4_base</receiver>
+ <slot>cancelToolButton_clicked()</slot>
+ </connection>
+ <connection>
+ <sender>jobList</sender>
+ <signal>contextMenuRequested(QListViewItem*,const QPoint&amp;,int)</signal>
+ <receiver>DevMgr4_base</receiver>
+ <slot>jobList_contextMenuRequested(QListViewItem*,const QPoint&amp;,int)</slot>
+ </connection>
+</connections>
+<includes>
+ <include location="local" impldecl="in implementation">devmgr4_base.ui.h</include>
+</includes>
+<slots>
+ <slot>fileNew()</slot>
+ <slot>fileOpen()</slot>
+ <slot>fileSave()</slot>
+ <slot>fileSaveAs()</slot>
+ <slot>filePrint()</slot>
+ <slot>fileExit()</slot>
+ <slot>editUndo()</slot>
+ <slot>editRedo()</slot>
+ <slot>editCut()</slot>
+ <slot>editCopy()</slot>
+ <slot>editPaste()</slot>
+ <slot>editFind()</slot>
+ <slot>helpIndex()</slot>
+ <slot>helpContents()</slot>
+ <slot>helpAbout()</slot>
+ <slot>deviceRescanAction_activated()</slot>
+ <slot>settingsEmailAlertsAction_activated()</slot>
+ <slot>DeviceList_currentChanged( QIconViewItem * )</slot>
+ <slot>CleanPensButton_clicked()</slot>
+ <slot>AlignPensButton_clicked()</slot>
+ <slot>PrintTestPageButton_clicked()</slot>
+ <slot>AdvancedInfoButton_clicked()</slot>
+ <slot>ColorCalibrationButton_clicked()</slot>
+ <slot>settingsConfigure_activated()</slot>
+ <slot>PrintButton_clicked()</slot>
+ <slot>ScanButton_clicked()</slot>
+ <slot>PCardButton_clicked()</slot>
+ <slot>SendFaxButton_clicked()</slot>
+ <slot>MakeCopiesButton_clicked()</slot>
+ <slot>ConfigureFeaturesButton_clicked()</slot>
+ <slot>CancelJobButton_clicked()</slot>
+ <slot>deviceRefreshAll_activated()</slot>
+ <slot>DeviceList_clicked( QIconViewItem * )</slot>
+ <slot>autoRefresh_toggled( bool )</slot>
+ <slot>PrintJobList_currentChanged( QListViewItem * )</slot>
+ <slot>CancelPrintJobButton_clicked()</slot>
+ <slot>PrintJobList_selectionChanged( QListViewItem * )</slot>
+ <slot>DeviceList_rightButtonClicked( QIconViewItem *, const QPoint &amp; )</slot>
+ <slot>OpenEmbeddedBrowserButton_clicked()</slot>
+ <slot>deviceSettingsButton_clicked()</slot>
+ <slot>faxSetupWizardButton_clicked()</slot>
+ <slot>faxSettingsButton_clicked()</slot>
+ <slot>setupDevice_activated()</slot>
+ <slot>viewSupportAction_activated()</slot>
+ <slot>installDevice_activated()</slot>
+ <slot>deviceInstallAction_activated()</slot>
+ <slot>deviceRemoveAction_activated()</slot>
+ <slot>Tabs_currentChanged( QWidget * )</slot>
+ <slot>DeviceList_onItem( QIconViewItem * )</slot>
+ <slot>iconList_doubleClicked( QIconViewItem * )</slot>
+ <slot>iconList_rightButtonClicked( QIconViewItem *, const QPoint &amp; )</slot>
+ <slot>iconList_clicked( QIconViewItem * )</slot>
+ <slot>iconList_contextMenuRequested( QIconViewItem *, const QPoint &amp; )</slot>
+ <slot>iconList_returnPressed( QIconViewItem * )</slot>
+ <slot>stopstartPushButton_clicked()</slot>
+ <slot>rejectacceptPushButton_clicked()</slot>
+ <slot>defaultPushButton_clicked()</slot>
+ <slot>PrintJobPrinterCombo_activated( const QString &amp; )</slot>
+ <slot>PrintSettingsPrinterCombo_activated( const QString &amp; )</slot>
+ <slot>jobList_rightButtonClicked( QListViewItem *, const QPoint &amp;, int )</slot>
+ <slot>jobList_clicked( QListViewItem * )</slot>
+ <slot>infoToolButton_clicked()</slot>
+ <slot>cancelToolButton_clicked()</slot>
+ <slot>jobList_contextMenuRequested( QListViewItem *, const QPoint &amp;, int )</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/ui/faxaddrbookeditform_base.py b/ui/faxaddrbookeditform_base.py
new file mode 100644
index 0000000..1833e6f
--- /dev/null
+++ b/ui/faxaddrbookeditform_base.py
@@ -0,0 +1,197 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'ui/faxaddrbookeditform_base.ui'
+#
+# Created: Wed Jul 18 16:05:44 2007
+# by: The PyQt User Interface Compiler (pyuic) 3.17
+#
+# WARNING! All changes made in this file will be lost!
+
+
+from qt import *
+
+
+class FaxAddrBookEditForm_base(QDialog):
+ def __init__(self,parent = None,name = None,modal = 0,fl = 0):
+ QDialog.__init__(self,parent,name,modal,fl)
+
+ if not name:
+ self.setName("FaxAddrBookEditForm_base")
+
+
+ FaxAddrBookEditForm_baseLayout = QGridLayout(self,1,1,11,6,"FaxAddrBookEditForm_baseLayout")
+
+ self.pushButton34 = QPushButton(self,"pushButton34")
+
+ FaxAddrBookEditForm_baseLayout.addWidget(self.pushButton34,8,1)
+
+ self.line5 = QFrame(self,"line5")
+ self.line5.setFrameShape(QFrame.HLine)
+ self.line5.setFrameShadow(QFrame.Sunken)
+ self.line5.setFrameShape(QFrame.HLine)
+
+ FaxAddrBookEditForm_baseLayout.addMultiCellWidget(self.line5,6,6,0,2)
+
+ self.OKButton = QPushButton(self,"OKButton")
+ self.OKButton.setEnabled(0)
+
+ FaxAddrBookEditForm_baseLayout.addWidget(self.OKButton,8,2)
+ spacer31 = QSpacerItem(401,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ FaxAddrBookEditForm_baseLayout.addItem(spacer31,8,0)
+
+ self.line5_2_2 = QFrame(self,"line5_2_2")
+ self.line5_2_2.setFrameShape(QFrame.HLine)
+ self.line5_2_2.setFrameShadow(QFrame.Sunken)
+ self.line5_2_2.setFrameShape(QFrame.HLine)
+
+ FaxAddrBookEditForm_baseLayout.addMultiCellWidget(self.line5_2_2,9,9,0,2)
+
+ self.line5_2 = QFrame(self,"line5_2")
+ self.line5_2.setFrameShape(QFrame.HLine)
+ self.line5_2.setFrameShadow(QFrame.Sunken)
+ self.line5_2.setFrameShape(QFrame.HLine)
+
+ FaxAddrBookEditForm_baseLayout.addMultiCellWidget(self.line5_2,4,4,0,2)
+
+ layout1 = QHBoxLayout(None,0,6,"layout1")
+
+ self.textLabel7 = QLabel(self,"textLabel7")
+ layout1.addWidget(self.textLabel7)
+
+ self.faxEdit = QLineEdit(self,"faxEdit")
+ layout1.addWidget(self.faxEdit)
+
+ FaxAddrBookEditForm_baseLayout.addMultiCellLayout(layout1,5,5,0,2)
+
+ layout2 = QHBoxLayout(None,0,6,"layout2")
+
+ self.textLabel3 = QLabel(self,"textLabel3")
+ layout2.addWidget(self.textLabel3)
+
+ self.nicknameEdit = QLineEdit(self,"nicknameEdit")
+ layout2.addWidget(self.nicknameEdit)
+
+ FaxAddrBookEditForm_baseLayout.addMultiCellLayout(layout2,0,0,0,2)
+
+ layout6 = QHBoxLayout(None,0,6,"layout6")
+
+ self.textLabel4 = QLabel(self,"textLabel4")
+ layout6.addWidget(self.textLabel4)
+
+ self.groupListView = QListView(self,"groupListView")
+ self.groupListView.addColumn(self.__tr("Group Name"))
+ self.groupListView.setSelectionMode(QListView.NoSelection)
+ layout6.addWidget(self.groupListView)
+
+ FaxAddrBookEditForm_baseLayout.addMultiCellLayout(layout6,3,3,0,2)
+
+ layout7 = QVBoxLayout(None,0,6,"layout7")
+
+ self.textLabel6 = QLabel(self,"textLabel6")
+ layout7.addWidget(self.textLabel6)
+
+ self.notesEdit = QTextEdit(self,"notesEdit")
+ layout7.addWidget(self.notesEdit)
+
+ FaxAddrBookEditForm_baseLayout.addMultiCellLayout(layout7,7,7,0,2)
+
+ self.textLabel12 = QLabel(self,"textLabel12")
+
+ FaxAddrBookEditForm_baseLayout.addMultiCellWidget(self.textLabel12,10,10,0,2)
+
+ self.line12 = QFrame(self,"line12")
+ self.line12.setFrameShape(QFrame.HLine)
+ self.line12.setFrameShadow(QFrame.Sunken)
+ self.line12.setFrameShape(QFrame.HLine)
+
+ FaxAddrBookEditForm_baseLayout.addMultiCellWidget(self.line12,1,1,0,2)
+
+ layout11 = QGridLayout(None,1,1,0,6,"layout11")
+
+ layout9 = QVBoxLayout(None,0,6,"layout9")
+
+ self.textLabel5 = QLabel(self,"textLabel5")
+ layout9.addWidget(self.textLabel5)
+
+ self.textLabel1 = QLabel(self,"textLabel1")
+ layout9.addWidget(self.textLabel1)
+
+ self.textLabel2 = QLabel(self,"textLabel2")
+ layout9.addWidget(self.textLabel2)
+
+ layout11.addLayout(layout9,0,0)
+
+ layout10 = QVBoxLayout(None,0,6,"layout10")
+
+ self.titleEdit = QLineEdit(self,"titleEdit")
+ layout10.addWidget(self.titleEdit)
+
+ self.firstnameEdit = QLineEdit(self,"firstnameEdit")
+ layout10.addWidget(self.firstnameEdit)
+
+ self.lastnameEdit = QLineEdit(self,"lastnameEdit")
+ layout10.addWidget(self.lastnameEdit)
+
+ layout11.addLayout(layout10,0,1)
+
+ FaxAddrBookEditForm_baseLayout.addMultiCellLayout(layout11,2,2,0,2)
+
+ self.languageChange()
+
+ self.resize(QSize(532,555).expandedTo(self.minimumSizeHint()))
+ self.clearWState(Qt.WState_Polished)
+
+ self.connect(self.pushButton34,SIGNAL("clicked()"),self.reject)
+ self.connect(self.OKButton,SIGNAL("clicked()"),self.accept)
+ self.connect(self.firstnameEdit,SIGNAL("textChanged(const QString&)"),self.firstnameEdit_textChanged)
+ self.connect(self.lastnameEdit,SIGNAL("textChanged(const QString&)"),self.lastnameEdit_textChanged)
+ self.connect(self.nicknameEdit,SIGNAL("textChanged(const QString&)"),self.nicknameEdit_textChanged)
+ self.connect(self.faxEdit,SIGNAL("textChanged(const QString&)"),self.faxEdit_textChanged)
+
+ self.setTabOrder(self.nicknameEdit,self.titleEdit)
+ self.setTabOrder(self.titleEdit,self.firstnameEdit)
+ self.setTabOrder(self.firstnameEdit,self.lastnameEdit)
+ self.setTabOrder(self.lastnameEdit,self.faxEdit)
+ self.setTabOrder(self.faxEdit,self.notesEdit)
+ self.setTabOrder(self.notesEdit,self.pushButton34)
+ self.setTabOrder(self.pushButton34,self.OKButton)
+
+
+ def languageChange(self):
+ self.setCaption(self.__tr("HP Device Manager - Fax Address Book Entry"))
+ self.pushButton34.setText(self.__tr("Cancel"))
+ self.OKButton.setText(self.__tr("OK"))
+ self.textLabel7.setText(self.__tr("<b>Fax Number:</b>"))
+ self.textLabel3.setText(self.__tr("<b>Name/Nickname:<b>"))
+ self.textLabel4.setText(self.__tr("Member of Group(s):"))
+ self.groupListView.header().setLabel(0,self.__tr("Group Name"))
+ self.textLabel6.setText(self.__tr("Notes/Other Information:"))
+ self.textLabel12.setText(self.__tr("Note: Items in <b>bold</b> are required fields."))
+ self.textLabel5.setText(self.__tr("Title:"))
+ self.textLabel1.setText(self.__tr("First Name:"))
+ self.textLabel2.setText(self.__tr("Last Name:"))
+
+
+ def firstnameEdit_textChanged(self,a0):
+ print "FaxAddrBookEditForm_base.firstnameEdit_textChanged(const QString&): Not implemented yet"
+
+ def lastnameEdit_textChanged(self,a0):
+ print "FaxAddrBookEditForm_base.lastnameEdit_textChanged(const QString&): Not implemented yet"
+
+ def checkBox3_toggled(self,a0):
+ print "FaxAddrBookEditForm_base.checkBox3_toggled(bool): Not implemented yet"
+
+ def isGroupCheckBox_toggled(self,a0):
+ print "FaxAddrBookEditForm_base.isGroupCheckBox_toggled(bool): Not implemented yet"
+
+ def groupsButton2_clicked(self):
+ print "FaxAddrBookEditForm_base.groupsButton2_clicked(): Not implemented yet"
+
+ def nicknameEdit_textChanged(self,a0):
+ print "FaxAddrBookEditForm_base.nicknameEdit_textChanged(const QString&): Not implemented yet"
+
+ def faxEdit_textChanged(self,a0):
+ print "FaxAddrBookEditForm_base.faxEdit_textChanged(const QString&): Not implemented yet"
+
+ def __tr(self,s,c = None):
+ return qApp.translate("FaxAddrBookEditForm_base",s,c)
diff --git a/ui/faxaddrbookeditform_base.ui b/ui/faxaddrbookeditform_base.ui
new file mode 100644
index 0000000..840c039
--- /dev/null
+++ b/ui/faxaddrbookeditform_base.ui
@@ -0,0 +1,357 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>FaxAddrBookEditForm_base</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>FaxAddrBookEditForm_base</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>532</width>
+ <height>555</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>HP Device Manager - Fax Address Book Entry</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QPushButton" row="8" column="1">
+ <property name="name">
+ <cstring>pushButton34</cstring>
+ </property>
+ <property name="text">
+ <string>Cancel</string>
+ </property>
+ </widget>
+ <widget class="Line" row="6" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>line5</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>HLine</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Sunken</enum>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="8" column="2">
+ <property name="name">
+ <cstring>OKButton</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>OK</string>
+ </property>
+ </widget>
+ <spacer row="8" column="0">
+ <property name="name">
+ <cstring>spacer31</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>401</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="Line" row="9" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>line5_2_2</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>HLine</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Sunken</enum>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ </widget>
+ <widget class="Line" row="4" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>line5_2</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>HLine</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Sunken</enum>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="5" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>layout1</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel7</cstring>
+ </property>
+ <property name="text">
+ <string>&lt;b&gt;Fax Number:&lt;/b&gt;</string>
+ </property>
+ </widget>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>faxEdit</cstring>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget" row="0" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>layout2</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel3</cstring>
+ </property>
+ <property name="text">
+ <string>&lt;b&gt;Name/Nickname:&lt;/b&gt;</string>
+ </property>
+ </widget>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>nicknameEdit</cstring>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget" row="3" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>layout6</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel4</cstring>
+ </property>
+ <property name="text">
+ <string>Member of Group(s):</string>
+ </property>
+ </widget>
+ <widget class="QListView">
+ <column>
+ <property name="text">
+ <string>Group Name</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>groupListView</cstring>
+ </property>
+ <property name="selectionMode">
+ <enum>NoSelection</enum>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget" row="7" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>layout7</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel6</cstring>
+ </property>
+ <property name="text">
+ <string>Notes/Other Information:</string>
+ </property>
+ </widget>
+ <widget class="QTextEdit">
+ <property name="name">
+ <cstring>notesEdit</cstring>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QLabel" row="10" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>textLabel12</cstring>
+ </property>
+ <property name="text">
+ <string>Note: Items in &lt;b&gt;bold&lt;/b&gt; are required fields.</string>
+ </property>
+ </widget>
+ <widget class="Line" row="1" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>line12</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>HLine</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Sunken</enum>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="2" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>layout11</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget" row="0" column="0">
+ <property name="name">
+ <cstring>layout9</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel5</cstring>
+ </property>
+ <property name="text">
+ <string>Title:</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>First Name:</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>Last Name:</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QLayoutWidget" row="0" column="1">
+ <property name="name">
+ <cstring>layout10</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>titleEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>firstnameEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>lastnameEdit</cstring>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ </grid>
+ </widget>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>pushButton34</sender>
+ <signal>clicked()</signal>
+ <receiver>FaxAddrBookEditForm_base</receiver>
+ <slot>reject()</slot>
+ </connection>
+ <connection>
+ <sender>OKButton</sender>
+ <signal>clicked()</signal>
+ <receiver>FaxAddrBookEditForm_base</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection>
+ <sender>firstnameEdit</sender>
+ <signal>textChanged(const QString&amp;)</signal>
+ <receiver>FaxAddrBookEditForm_base</receiver>
+ <slot>firstnameEdit_textChanged(const QString&amp;)</slot>
+ </connection>
+ <connection>
+ <sender>lastnameEdit</sender>
+ <signal>textChanged(const QString&amp;)</signal>
+ <receiver>FaxAddrBookEditForm_base</receiver>
+ <slot>lastnameEdit_textChanged(const QString&amp;)</slot>
+ </connection>
+ <connection>
+ <sender>nicknameEdit</sender>
+ <signal>textChanged(const QString&amp;)</signal>
+ <receiver>FaxAddrBookEditForm_base</receiver>
+ <slot>nicknameEdit_textChanged(const QString&amp;)</slot>
+ </connection>
+ <connection>
+ <sender>faxEdit</sender>
+ <signal>textChanged(const QString&amp;)</signal>
+ <receiver>FaxAddrBookEditForm_base</receiver>
+ <slot>faxEdit_textChanged(const QString&amp;)</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>nicknameEdit</tabstop>
+ <tabstop>titleEdit</tabstop>
+ <tabstop>firstnameEdit</tabstop>
+ <tabstop>lastnameEdit</tabstop>
+ <tabstop>faxEdit</tabstop>
+ <tabstop>notesEdit</tabstop>
+ <tabstop>pushButton34</tabstop>
+ <tabstop>OKButton</tabstop>
+</tabstops>
+<slots>
+ <slot>firstnameEdit_textChanged( const QString &amp; )</slot>
+ <slot>lastnameEdit_textChanged( const QString &amp; )</slot>
+ <slot>checkBox3_toggled( bool )</slot>
+ <slot>isGroupCheckBox_toggled( bool )</slot>
+ <slot>groupsButton2_clicked()</slot>
+ <slot>nicknameEdit_textChanged( const QString &amp; )</slot>
+ <slot>faxEdit_textChanged( const QString &amp; )</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/ui/faxaddrbookform.py b/ui/faxaddrbookform.py
new file mode 100644
index 0000000..38b0300
--- /dev/null
+++ b/ui/faxaddrbookform.py
@@ -0,0 +1,492 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2009 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+# Std Lib
+import sys
+import os
+import os.path
+
+# Local
+from base.g import *
+from base import utils
+from ui_utils import load_pixmap
+
+try:
+ from fax import fax
+except ImportError:
+ # This can fail on Python < 2.3 due to the datetime module
+ log.error("Fax address book disabled - Python 2.3+ required.")
+ sys.exit(1)
+
+# Qt
+from qt import *
+from faxaddrbookform_base import FaxAddrBookForm_base
+from faxaddrbookeditform_base import FaxAddrBookEditForm_base
+from faxaddrbookgroupsform_base import FaxAddrBookGroupsForm_base
+from faxaddrbookgroupeditform_base import FaxAddrBookGroupEditForm_base
+
+# globals
+db = None
+
+# ****************************************************************************
+
+class AddressBookItem2(QListViewItem):
+
+ def __init__(self, parent, entry):
+ QListViewItem.__init__(self, parent)
+ self.entry = entry
+ self.setText(0, entry['name'])
+ self.setText(1, entry['title'])
+ self.setText(2, entry['firstname'])
+ self.setText(3, entry['lastname'])
+ self.setText(4, entry['fax'])
+ self.setText(5, ', '.join(entry['groups']))
+ self.setText(6, entry['notes'])
+
+class GroupValidator(QValidator):
+ def __init__(self, parent=None, name=None):
+ QValidator.__init__(self, parent, name)
+
+ def validate(self, input, pos):
+ input = unicode(input)
+ if input.find(u',') > 0:
+ return QValidator.Invalid, pos
+ elif len(input) > 50:
+ return QValidator.Invalid, pos
+ else:
+ return QValidator.Acceptable, pos
+
+
+class PhoneNumValidator(QValidator):
+ def __init__(self, parent=None, name=None):
+ QValidator.__init__(self, parent, name)
+
+ def validate(self, input, pos):
+ input = unicode(input)
+ if not input:
+ return QValidator.Acceptable, pos
+ elif input[pos-1] not in u'0123456789-(+) *#':
+ return QValidator.Invalid, pos
+ elif len(input) > 50:
+ return QValidator.Invalid, pos
+ else:
+ return QValidator.Acceptable, pos
+
+
+# **************************************************************************** #
+
+class FaxAddrBookGroupEditForm(FaxAddrBookGroupEditForm_base):
+ """
+ Called when clicking New... or Edit... from the Group Dialog
+ """
+ def __init__(self,parent = None,name = None,modal = 0,fl = 0):
+ FaxAddrBookGroupEditForm_base.__init__(self,parent,name,modal,fl)
+ self.edit_mode = False
+ self.okButton.setEnabled(True)
+ self.all_groups = db.get_all_groups()
+ self.groupnameEdit.setValidator(GroupValidator(self.groupnameEdit))
+
+ def setDlgData(self, group_name):
+ self.edit_mode = True
+ self.groupnameEdit.setText(group_name)
+ self.groupnameEdit.setReadOnly(True)
+ self.setEntries(group_name)
+
+ def setEntries(self, group_name=''):
+ self.entriesListView.clear()
+ all_entries = db.get_all_records()
+
+ for e, v in all_entries.items():
+ i = QCheckListItem(self.entriesListView, e, QCheckListItem.CheckBox)
+
+ if group_name and group_name in v['groups']:
+ i.setState(QCheckListItem.On)
+
+ self.CheckOKButton()
+
+
+ def getDlgData(self):
+ group_name = unicode(self.groupnameEdit.text())
+ entries = []
+
+ i = self.entriesListView.firstChild()
+
+ while i is not None:
+ if i.isOn():
+ entries.append(unicode(i.text()))
+
+ i = i.itemBelow()
+
+ return group_name, entries
+
+ def groupnameEdit_textChanged(self,a0):
+ self.CheckOKButton()
+
+ def entriesListView_clicked(self,a0):
+ self.CheckOKButton()
+
+ def CheckOKButton(self):
+ group_name = unicode(self.groupnameEdit.text())
+
+ if not group_name or \
+ (not self.edit_mode and group_name in self.all_groups):
+
+ self.okButton.setEnabled(False)
+ return
+
+ i = self.entriesListView.firstChild()
+
+ while i is not None:
+ if i.isOn():
+ break
+
+ i = i.itemBelow()
+
+ else:
+ self.okButton.setEnabled(False)
+ return
+
+ self.okButton.setEnabled(True)
+
+ def __tr(self,s,c = None):
+ return qApp.translate("FaxAddrBookGroupEditForm",s,c)
+
+
+# **************************************************************************** #
+
+class FaxAddrBookGroupsForm(FaxAddrBookGroupsForm_base):
+
+ def __init__(self,parent = None,name = None,modal = 0,fl = 0):
+ FaxAddrBookGroupsForm_base.__init__(self,parent,name,modal,fl)
+ self.current = None
+ QTimer.singleShot(0, self.InitialUpdate)
+
+ def InitialUpdate(self):
+ self.UpdateList()
+
+ def UpdateList(self):
+ self.groupListView.clear()
+ first_rec = None
+ all_groups = db.get_all_groups()
+ if all_groups:
+
+ for group in all_groups:
+ i = QListViewItem(self.groupListView, group,
+ u', '.join(db.group_members(group)))
+
+ if first_rec is None:
+ first_rec = i
+
+ self.groupListView.setCurrentItem(i)
+ self.current = i
+
+ self.editButton.setEnabled(True)
+ self.deleteButton.setEnabled(True)
+
+ else:
+ self.editButton.setEnabled(False)
+ self.deleteButton.setEnabled(False)
+
+ def newButton_clicked(self):
+ dlg = FaxAddrBookGroupEditForm(self)
+ dlg.setEntries()
+ if dlg.exec_loop() == QDialog.Accepted:
+ group_name, entries = dlg.getDlgData()
+ db.update_groups(group_name, entries)
+ self.UpdateList()
+
+ def editButton_clicked(self):
+ dlg = FaxAddrBookGroupEditForm(self)
+ group_name = unicode(self.current.text(0))
+ dlg.setDlgData(group_name)
+ if dlg.exec_loop() == QDialog.Accepted:
+ group_name, entries = dlg.getDlgData()
+ db.update_groups(group_name, entries)
+ self.UpdateList()
+
+
+ def deleteButton_clicked(self):
+ x = QMessageBox.critical(self,
+ self.caption(),
+ self.__tr("<b>Annoying Confirmation: Are you sure you want to delete this group?</b>"),
+ QMessageBox.Yes,
+ QMessageBox.No | QMessageBox.Default,
+ QMessageBox.NoButton)
+ if x == QMessageBox.Yes:
+ db.delete_group(unicode(self.current.text(0)))
+ self.UpdateList()
+
+ def groupListView_currentChanged(self, a0):
+ self.current = a0
+
+ def groupListView_doubleClicked(self, a0):
+ self.editButton_clicked()
+
+ def groupListView_rightButtonClicked(self, item, pos, a2):
+ popup = QPopupMenu(self)
+
+ popup.insertItem(self.__tr("New..."), self.newButton_clicked)
+
+ if item is not None:
+ popup.insertItem(self.__tr("Edit..."), self.editButton_clicked)
+ popup.insertItem(self.__tr("Delete..."), self.deleteButton_clicked)
+
+ popup.insertSeparator()
+ popup.insertItem(self.__tr("Refresh List"), self.UpdateList)
+ popup.popup(pos)
+
+ def __tr(self,s,c = None):
+ return qApp.translate("FaxAddrBookGroupsForm",s,c)
+
+
+# **************************************************************************** #
+
+
+class FaxAddrBookEditForm(FaxAddrBookEditForm_base):
+ def __init__(self, editing=True, parent = None,name = None,modal = 0,fl = 0):
+ FaxAddrBookEditForm_base.__init__(self,parent,name,modal,fl)
+ self.editing = editing
+ self.faxEdit.setValidator(PhoneNumValidator(self.faxEdit))
+ self.initial_nickname = ''
+ self.OKButton.setEnabled(self.editing)
+
+ def setDlgData(self, name, title, firstname, lastname, fax, group_list, notes):
+ self.initial_nickname = name
+ self.name = name
+ self.titleEdit.setText(title)
+ self.firstnameEdit.setText(firstname)
+ self.lastnameEdit.setText(lastname)
+ self.faxEdit.setText(fax)
+ self.notesEdit.setText(notes)
+ self.nicknameEdit.setText(name)
+ self.setGroups(group_list)
+
+ def setGroups(self, entry_groups=[]):
+ self.groupListView.clear()
+ for g in db.get_all_groups():
+ i = QCheckListItem(self.groupListView, g, QCheckListItem.CheckBox)
+
+ if g in entry_groups:
+ i.setState(QCheckListItem.On)
+
+ def getDlgData(self):
+ in_groups = []
+ i = self.groupListView.firstChild()
+
+ while i is not None:
+ if i.isOn():
+ in_groups.append(unicode(i.text()))
+ i = i.itemBelow()
+
+ return {'name': unicode(self.nicknameEdit.text()),
+ 'title': unicode(self.titleEdit.text()),
+ 'firstname': unicode(self.firstnameEdit.text()),
+ 'lastname': unicode(self.lastnameEdit.text()),
+ 'fax': unicode(self.faxEdit.text()),
+ 'groups': in_groups,
+ 'notes': unicode(self.notesEdit.text())}
+
+ def firstnameEdit_textChanged(self,a0):
+ pass
+
+ def lastnameEdit_textChanged(self,a0):
+ pass
+
+ def nicknameEdit_textChanged(self, nickname):
+ self.CheckOKButton(nickname, None)
+
+ def faxEdit_textChanged(self, fax):
+ self.CheckOKButton(None, fax)
+
+ def CheckOKButton(self, nickname=None, fax=None):
+ if nickname is None:
+ nickname = unicode(self.nicknameEdit.text())
+
+ if fax is None:
+ fax = unicode(self.faxEdit.text())
+
+ ok = bool(len(nickname) and len(fax))
+
+ if nickname:
+ all_entries = db.get_all_records()
+ for e, v in all_entries.items():
+ if nickname == e and nickname != self.initial_nickname:
+ ok = False
+
+ self.OKButton.setEnabled(ok)
+
+ def __tr(self,s,c = None):
+ return qApp.translate("FaxAddrBookEditForm",s,c)
+
+# **************************************************************************** #
+
+class FaxAddrBookForm(FaxAddrBookForm_base):
+ def __init__(self,parent = None,name = None,modal = 0,fl = 0):
+ FaxAddrBookForm_base.__init__(self,parent,name,modal,fl)
+
+ self.setIcon(load_pixmap('hp_logo', '128x128'))
+
+ global db
+ db = fax.FaxAddressBook()
+ self.init_problem = False
+
+ QTimer.singleShot(0, self.InitialUpdate)
+
+
+ def InitialUpdate(self):
+ if self.init_problem:
+ self.close()
+ return
+
+ self.UpdateList()
+
+ def UpdateList(self):
+ self.addressListView.clear()
+ first_rec = None
+ all_entries = db.get_all_records()
+ log.debug("Number of records is: %d" % len(all_entries))
+
+ if all_entries:
+ for e, v in all_entries.items():
+
+ if v['name'].startswith('__'):
+ continue
+
+ i = AddressBookItem2(self.addressListView, v)
+
+ if first_rec is None:
+ first_rec = i
+
+ self.addressListView.setCurrentItem(i)
+ self.current = i
+
+ self.editButton.setEnabled(True)
+ self.deleteButton.setEnabled(True)
+
+ else:
+ self.editButton.setEnabled(False)
+ self.deleteButton.setEnabled(False)
+
+ def groupButton_clicked(self):
+ FaxAddrBookGroupsForm(self).exec_loop()
+ self.sendUpdateEvent()
+ self.UpdateList()
+
+ def newButton_clicked(self):
+ dlg = FaxAddrBookEditForm(False, self)
+ dlg.setGroups()
+ if dlg.exec_loop() == QDialog.Accepted:
+ d = dlg.getDlgData()
+ db.set(**d)
+ self.sendUpdateEvent()
+ self.UpdateList()
+
+ def editButton_clicked(self):
+ dlg = FaxAddrBookEditForm(True, self)
+ c = self.current.entry
+ dlg.setDlgData(c['name'], c['title'], c['firstname'],
+ c['lastname'], c['fax'], c['groups'], c['notes'])
+ prev_name = c['name']
+ if dlg.exec_loop() == QDialog.Accepted:
+ d = dlg.getDlgData()
+
+ if prev_name != d['name']:
+ db.delete(prev_name)
+
+ db.set(**d)
+ self.sendUpdateEvent()
+ self.UpdateList()
+
+
+ def deleteButton_clicked(self):
+ if QMessageBox.critical(self,
+ self.caption(),
+ self.__tr("<b>Annoying Confirmation: Are you sure you want to delete this address book entry?</b>"),
+ QMessageBox.Yes,
+ QMessageBox.No | QMessageBox.Default,
+ QMessageBox.NoButton) == QMessageBox.Yes:
+ db.delete(self.current.entry['name'])
+ self.UpdateList()
+ self.sendUpdateEvent()
+
+
+ def addressListView_rightButtonClicked(self, item, pos, a2):
+ popup = QPopupMenu(self)
+ popup.insertItem(self.__tr("New..."), self.newButton_clicked)
+ if item is not None:
+ popup.insertItem(self.__tr("Edit..."), self.editButton_clicked)
+ popup.insertItem(self.__tr("Delete..."), self.deleteButton_clicked)
+
+ popup.insertSeparator()
+ popup.insertItem(self.__tr("Refresh List"), self.UpdateList)
+ popup.popup(pos)
+
+ def addressListView_doubleClicked(self,a0):
+ self.editButton_clicked()
+
+ def addressListView_currentChanged(self,item):
+ self.current = item
+
+ def FailureUI(self, error_text):
+ log.error(unicode(error_text).replace("<b>", "").replace("</b>", "").replace("<p>", " "))
+ QMessageBox.critical(self,
+ self.caption(),
+ QString(error_text),
+ QMessageBox.Ok,
+ QMessageBox.NoButton,
+ QMessageBox.NoButton)
+
+ def __tr(self,s,c = None):
+ return qApp.translate("FaxAddrBookForm",s,c)
+
+ def accept(self):
+ self.sendUpdateEvent()
+
+ FaxAddrBookForm_base.accept(self)
+
+ def sendUpdateEvent(self):
+ pass # TODO:
+
+ def importPushButton_clicked(self):
+ dlg = QFileDialog(user_conf.workingDirectory(), "LDIF (*.ldif *.ldi);;vCard (*.vcf)", None, None, True)
+
+ dlg.setCaption("openfile")
+ dlg.setMode(QFileDialog.ExistingFile)
+ dlg.show()
+
+ if dlg.exec_loop() == QDialog.Accepted:
+ result = str(dlg.selectedFile())
+ working_directory = unicode(dlg.dir().absPath())
+ log.debug("result: %s" % result)
+ user_conf.setWorkingDirectory(working_directory)
+
+ if result:
+ if result.endswith('.vcf'):
+ ok, error_str = db.import_vcard(result)
+ else:
+ ok, error_str = db.import_ldif(result)
+
+ if not ok:
+ self.FailureUI(error_str)
+
+ else:
+ self.UpdateList()
+
diff --git a/ui/faxaddrbookform_base.py b/ui/faxaddrbookform_base.py
new file mode 100644
index 0000000..00ccf10
--- /dev/null
+++ b/ui/faxaddrbookform_base.py
@@ -0,0 +1,148 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'faxaddrbookform_base.ui'
+#
+# Created: Thu Feb 7 16:26:14 2008
+# by: The PyQt User Interface Compiler (pyuic) 3.17.3
+#
+# WARNING! All changes made in this file will be lost!
+
+
+from qt import *
+
+
+class FaxAddrBookForm_base(QDialog):
+ def __init__(self,parent = None,name = None,modal = 0,fl = 0):
+ QDialog.__init__(self,parent,name,modal,fl)
+
+ if not name:
+ self.setName("FaxAddrBookForm_base")
+
+
+ FaxAddrBookForm_baseLayout = QGridLayout(self,1,1,11,6,"FaxAddrBookForm_baseLayout")
+
+ self.OKButton = QPushButton(self,"OKButton")
+
+ FaxAddrBookForm_baseLayout.addWidget(self.OKButton,2,8)
+
+ self.newButton = QPushButton(self,"newButton")
+
+ FaxAddrBookForm_baseLayout.addWidget(self.newButton,2,0)
+
+ self.editButton = QPushButton(self,"editButton")
+
+ FaxAddrBookForm_baseLayout.addWidget(self.editButton,2,1)
+
+ self.deleteButton = QPushButton(self,"deleteButton")
+
+ FaxAddrBookForm_baseLayout.addWidget(self.deleteButton,2,2)
+
+ self.addressListView = QListView(self,"addressListView")
+ self.addressListView.addColumn(self.__tr("Nickname"))
+ self.addressListView.addColumn(self.__tr("Title"))
+ self.addressListView.addColumn(self.__tr("First Name"))
+ self.addressListView.addColumn(self.__tr("Last Name"))
+ self.addressListView.addColumn(self.__tr("Fax Number"))
+ self.addressListView.addColumn(self.__tr("Member of Group(s)"))
+ self.addressListView.addColumn(self.__tr("Notes/Other Information"))
+ self.addressListView.setMidLineWidth(0)
+ self.addressListView.setSelectionMode(QListView.Single)
+ self.addressListView.setAllColumnsShowFocus(1)
+ self.addressListView.setShowSortIndicator(0)
+
+ FaxAddrBookForm_baseLayout.addMultiCellWidget(self.addressListView,1,1,0,8)
+
+ self.textLabel11 = QLabel(self,"textLabel11")
+
+ FaxAddrBookForm_baseLayout.addMultiCellWidget(self.textLabel11,0,0,0,2)
+
+ self.groupButton = QPushButton(self,"groupButton")
+
+ FaxAddrBookForm_baseLayout.addWidget(self.groupButton,2,4)
+
+ self.line8 = QFrame(self,"line8")
+ self.line8.setFrameShape(QFrame.VLine)
+ self.line8.setFrameShadow(QFrame.Sunken)
+ self.line8.setFrameShape(QFrame.VLine)
+
+ FaxAddrBookForm_baseLayout.addWidget(self.line8,2,3)
+
+ self.line8_2 = QFrame(self,"line8_2")
+ self.line8_2.setFrameShape(QFrame.VLine)
+ self.line8_2.setFrameShadow(QFrame.Sunken)
+ self.line8_2.setFrameShape(QFrame.VLine)
+
+ FaxAddrBookForm_baseLayout.addWidget(self.line8_2,2,5)
+
+ self.importPushButton = QPushButton(self,"importPushButton")
+
+ FaxAddrBookForm_baseLayout.addWidget(self.importPushButton,2,6)
+ spacer29 = QSpacerItem(300,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ FaxAddrBookForm_baseLayout.addItem(spacer29,2,7)
+
+ self.languageChange()
+
+ self.resize(QSize(861,358).expandedTo(self.minimumSizeHint()))
+ self.clearWState(Qt.WState_Polished)
+
+ self.connect(self.OKButton,SIGNAL("clicked()"),self.accept)
+ self.connect(self.newButton,SIGNAL("clicked()"),self.newButton_clicked)
+ self.connect(self.editButton,SIGNAL("clicked()"),self.editButton_clicked)
+ self.connect(self.deleteButton,SIGNAL("clicked()"),self.deleteButton_clicked)
+ self.connect(self.addressListView,SIGNAL("rightButtonClicked(QListViewItem*,const QPoint&,int)"),self.addressListView_rightButtonClicked)
+ self.connect(self.addressListView,SIGNAL("currentChanged(QListViewItem*)"),self.addressListView_currentChanged)
+ self.connect(self.addressListView,SIGNAL("doubleClicked(QListViewItem*)"),self.addressListView_doubleClicked)
+ self.connect(self.groupButton,SIGNAL("clicked()"),self.groupButton_clicked)
+ self.connect(self.importPushButton,SIGNAL("clicked()"),self.importPushButton_clicked)
+
+ self.setTabOrder(self.addressListView,self.newButton)
+ self.setTabOrder(self.newButton,self.editButton)
+ self.setTabOrder(self.editButton,self.deleteButton)
+ self.setTabOrder(self.deleteButton,self.groupButton)
+ self.setTabOrder(self.groupButton,self.OKButton)
+
+
+ def languageChange(self):
+ self.setCaption(self.__tr("HP Device Manager - Fax Address Book"))
+ self.OKButton.setText(self.__tr("OK"))
+ self.newButton.setText(self.__tr("New..."))
+ self.editButton.setText(self.__tr("Edit..."))
+ self.deleteButton.setText(self.__tr("Delete..."))
+ self.addressListView.header().setLabel(0,self.__tr("Nickname"))
+ self.addressListView.header().setLabel(1,self.__tr("Title"))
+ self.addressListView.header().setLabel(2,self.__tr("First Name"))
+ self.addressListView.header().setLabel(3,self.__tr("Last Name"))
+ self.addressListView.header().setLabel(4,self.__tr("Fax Number"))
+ self.addressListView.header().setLabel(5,self.__tr("Member of Group(s)"))
+ self.addressListView.header().setLabel(6,self.__tr("Notes/Other Information"))
+ self.textLabel11.setText(self.__tr("<b>Fax Addresses:</b>"))
+ self.groupButton.setText(self.__tr("Groups..."))
+ self.importPushButton.setText(self.__tr("Import..."))
+
+
+ def newButton_clicked(self):
+ print "FaxAddrBookForm_base.newButton_clicked(): Not implemented yet"
+
+ def editButton_clicked(self):
+ print "FaxAddrBookForm_base.editButton_clicked(): Not implemented yet"
+
+ def deleteButton_clicked(self):
+ print "FaxAddrBookForm_base.deleteButton_clicked(): Not implemented yet"
+
+ def addressListView_rightButtonClicked(self,a0,a1,a2):
+ print "FaxAddrBookForm_base.addressListView_rightButtonClicked(QListViewItem*,const QPoint&,int): Not implemented yet"
+
+ def addressListView_currentChanged(self,a0):
+ print "FaxAddrBookForm_base.addressListView_currentChanged(QListViewItem*): Not implemented yet"
+
+ def addressListView_doubleClicked(self,a0):
+ print "FaxAddrBookForm_base.addressListView_doubleClicked(QListViewItem*): Not implemented yet"
+
+ def groupButton_clicked(self):
+ print "FaxAddrBookForm_base.groupButton_clicked(): Not implemented yet"
+
+ def importPushButton_clicked(self):
+ print "FaxAddrBookForm_base.importPushButton_clicked(): Not implemented yet"
+
+ def __tr(self,s,c = None):
+ return qApp.translate("FaxAddrBookForm_base",s,c)
diff --git a/ui/faxaddrbookform_base.ui b/ui/faxaddrbookform_base.ui
new file mode 100644
index 0000000..0f0de20
--- /dev/null
+++ b/ui/faxaddrbookform_base.ui
@@ -0,0 +1,297 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>FaxAddrBookForm_base</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>FaxAddrBookForm_base</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>861</width>
+ <height>358</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>HP Device Manager - Fax Address Book</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QPushButton" row="2" column="8">
+ <property name="name">
+ <cstring>OKButton</cstring>
+ </property>
+ <property name="text">
+ <string>OK</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="2" column="0">
+ <property name="name">
+ <cstring>newButton</cstring>
+ </property>
+ <property name="text">
+ <string>New...</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="2" column="1">
+ <property name="name">
+ <cstring>editButton</cstring>
+ </property>
+ <property name="text">
+ <string>Edit...</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="2" column="2">
+ <property name="name">
+ <cstring>deleteButton</cstring>
+ </property>
+ <property name="text">
+ <string>Delete...</string>
+ </property>
+ </widget>
+ <widget class="QListView" row="1" column="0" rowspan="1" colspan="9">
+ <column>
+ <property name="text">
+ <string>Nickname</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Title</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>First Name</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Last Name</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Fax Number</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Member of Group(s)</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Notes/Other Information</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>addressListView</cstring>
+ </property>
+ <property name="midLineWidth">
+ <number>0</number>
+ </property>
+ <property name="selectionMode">
+ <enum>Single</enum>
+ </property>
+ <property name="allColumnsShowFocus">
+ <bool>true</bool>
+ </property>
+ <property name="showSortIndicator">
+ <bool>false</bool>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>textLabel11</cstring>
+ </property>
+ <property name="text">
+ <string>&lt;b&gt;Fax Addresses:&lt;/b&gt;</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="2" column="4">
+ <property name="name">
+ <cstring>groupButton</cstring>
+ </property>
+ <property name="text">
+ <string>Groups...</string>
+ </property>
+ </widget>
+ <widget class="Line" row="2" column="3">
+ <property name="name">
+ <cstring>line8</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>VLine</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Sunken</enum>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ </widget>
+ <widget class="Line" row="2" column="5">
+ <property name="name">
+ <cstring>line8_2</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>VLine</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Sunken</enum>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="2" column="6">
+ <property name="name">
+ <cstring>importPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>Import...</string>
+ </property>
+ </widget>
+ <spacer row="2" column="7">
+ <property name="name">
+ <cstring>spacer29</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>300</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>OKButton</sender>
+ <signal>clicked()</signal>
+ <receiver>FaxAddrBookForm_base</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection>
+ <sender>newButton</sender>
+ <signal>clicked()</signal>
+ <receiver>FaxAddrBookForm_base</receiver>
+ <slot>newButton_clicked()</slot>
+ </connection>
+ <connection>
+ <sender>editButton</sender>
+ <signal>clicked()</signal>
+ <receiver>FaxAddrBookForm_base</receiver>
+ <slot>editButton_clicked()</slot>
+ </connection>
+ <connection>
+ <sender>deleteButton</sender>
+ <signal>clicked()</signal>
+ <receiver>FaxAddrBookForm_base</receiver>
+ <slot>deleteButton_clicked()</slot>
+ </connection>
+ <connection>
+ <sender>addressListView</sender>
+ <signal>rightButtonClicked(QListViewItem*,const QPoint&amp;,int)</signal>
+ <receiver>FaxAddrBookForm_base</receiver>
+ <slot>addressListView_rightButtonClicked(QListViewItem*,const QPoint&amp;,int)</slot>
+ </connection>
+ <connection>
+ <sender>addressListView</sender>
+ <signal>currentChanged(QListViewItem*)</signal>
+ <receiver>FaxAddrBookForm_base</receiver>
+ <slot>addressListView_currentChanged(QListViewItem*)</slot>
+ </connection>
+ <connection>
+ <sender>addressListView</sender>
+ <signal>doubleClicked(QListViewItem*)</signal>
+ <receiver>FaxAddrBookForm_base</receiver>
+ <slot>addressListView_doubleClicked(QListViewItem*)</slot>
+ </connection>
+ <connection>
+ <sender>groupButton</sender>
+ <signal>clicked()</signal>
+ <receiver>FaxAddrBookForm_base</receiver>
+ <slot>groupButton_clicked()</slot>
+ </connection>
+ <connection>
+ <sender>importPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>FaxAddrBookForm_base</receiver>
+ <slot>importPushButton_clicked()</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>addressListView</tabstop>
+ <tabstop>newButton</tabstop>
+ <tabstop>editButton</tabstop>
+ <tabstop>deleteButton</tabstop>
+ <tabstop>groupButton</tabstop>
+ <tabstop>OKButton</tabstop>
+</tabstops>
+<includes>
+ <include location="local" impldecl="in implementation">faxaddrbookform_base.ui.h</include>
+</includes>
+<slots>
+ <slot>newButton_clicked()</slot>
+ <slot>editButton_clicked()</slot>
+ <slot>deleteButton_clicked()</slot>
+ <slot>addressListView_rightButtonClicked( QListViewItem *, const QPoint &amp;, int )</slot>
+ <slot>addressListView_currentChanged( QListViewItem * )</slot>
+ <slot>addressListView_doubleClicked( QListViewItem * )</slot>
+ <slot>groupButton_clicked()</slot>
+ <slot>importPushButton_clicked()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/ui/faxaddrbookgroupeditform_base.py b/ui/faxaddrbookgroupeditform_base.py
new file mode 100644
index 0000000..cc0d70e
--- /dev/null
+++ b/ui/faxaddrbookgroupeditform_base.py
@@ -0,0 +1,95 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file '/home/dwelch/linux-imaging-and-printing/src/ui/faxaddrbookgroupeditform_base.ui'
+#
+# Created: Mon May 9 13:35:55 2005
+# by: The PyQt User Interface Compiler (pyuic) 3.14.1
+#
+# WARNING! All changes made in this file will be lost!
+
+
+import sys
+from qt import *
+
+
+class FaxAddrBookGroupEditForm_base(QDialog):
+ def __init__(self,parent = None,name = None,modal = 0,fl = 0):
+ QDialog.__init__(self,parent,name,modal,fl)
+
+ if not name:
+ self.setName("FaxAddrBookGroupEditForm_base")
+
+
+ FaxAddrBookGroupEditForm_baseLayout = QGridLayout(self,1,1,11,6,"FaxAddrBookGroupEditForm_baseLayout")
+
+ self.textLabel8 = QLabel(self,"textLabel8")
+
+ FaxAddrBookGroupEditForm_baseLayout.addWidget(self.textLabel8,0,0)
+
+ self.textLabel9 = QLabel(self,"textLabel9")
+
+ FaxAddrBookGroupEditForm_baseLayout.addMultiCellWidget(self.textLabel9,2,2,0,3)
+
+ self.entriesListView = QListView(self,"entriesListView")
+ self.entriesListView.addColumn(self.__tr("Group Members"))
+ self.entriesListView.setSelectionMode(QListView.NoSelection)
+
+ FaxAddrBookGroupEditForm_baseLayout.addMultiCellWidget(self.entriesListView,3,3,0,3)
+
+ self.groupnameEdit = QLineEdit(self,"groupnameEdit")
+
+ FaxAddrBookGroupEditForm_baseLayout.addMultiCellWidget(self.groupnameEdit,0,0,1,3)
+
+ self.line11 = QFrame(self,"line11")
+ self.line11.setFrameShape(QFrame.HLine)
+ self.line11.setFrameShadow(QFrame.Sunken)
+ self.line11.setFrameShape(QFrame.HLine)
+
+ FaxAddrBookGroupEditForm_baseLayout.addMultiCellWidget(self.line11,1,1,0,3)
+
+ self.okButton = QPushButton(self,"okButton")
+
+ FaxAddrBookGroupEditForm_baseLayout.addWidget(self.okButton,4,3)
+
+ self.cancelButton = QPushButton(self,"cancelButton")
+
+ FaxAddrBookGroupEditForm_baseLayout.addWidget(self.cancelButton,4,2)
+ spacer36 = QSpacerItem(150,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ FaxAddrBookGroupEditForm_baseLayout.addMultiCell(spacer36,4,4,0,1)
+
+ self.languageChange()
+
+ self.resize(QSize(377,359).expandedTo(self.minimumSizeHint()))
+ self.clearWState(Qt.WState_Polished)
+
+ self.connect(self.okButton,SIGNAL("clicked()"),self.accept)
+ self.connect(self.cancelButton,SIGNAL("clicked()"),self.reject)
+ self.connect(self.groupnameEdit,SIGNAL("textChanged(const QString&)"),self.groupnameEdit_textChanged)
+ self.connect(self.entriesListView,SIGNAL("clicked(QListViewItem*)"),self.entriesListView_clicked)
+
+
+ def languageChange(self):
+ self.setCaption(self.__tr("HP Device Manager - Fax Address Book Group"))
+ self.textLabel8.setText(self.__tr("<b>Group Name:</b>"))
+ self.textLabel9.setText(self.__tr("<b>Member Address Book Entries:</b>"))
+ self.entriesListView.header().setLabel(0,self.__tr("Group Members"))
+ self.okButton.setText(self.__tr("OK"))
+ self.cancelButton.setText(self.__tr("Cancel"))
+
+
+ def groupnameEdit_textChanged(self,a0):
+ print "FaxAddrBookGroupEditForm_base.groupnameEdit_textChanged(const QString&): Not implemented yet"
+
+ def entriesListView_clicked(self,a0):
+ print "FaxAddrBookGroupEditForm_base.entriesListView_clicked(QListViewItem*): Not implemented yet"
+
+ def __tr(self,s,c = None):
+ return qApp.translate("FaxAddrBookGroupEditForm_base",s,c)
+
+if __name__ == "__main__":
+ a = QApplication(sys.argv)
+ QObject.connect(a,SIGNAL("lastWindowClosed()"),a,SLOT("quit()"))
+ w = FaxAddrBookGroupEditForm_base()
+ a.setMainWidget(w)
+ w.show()
+ a.exec_loop()
diff --git a/ui/faxaddrbookgroupeditform_base.ui b/ui/faxaddrbookgroupeditform_base.ui
new file mode 100644
index 0000000..13a7135
--- /dev/null
+++ b/ui/faxaddrbookgroupeditform_base.ui
@@ -0,0 +1,145 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>FaxAddrBookGroupEditForm_base</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>FaxAddrBookGroupEditForm_base</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>377</width>
+ <height>359</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>HP Device Manager - Fax Address Book Group</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>textLabel8</cstring>
+ </property>
+ <property name="text">
+ <string>&lt;b&gt;Group Name:&lt;/b&gt;</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="0" rowspan="1" colspan="4">
+ <property name="name">
+ <cstring>textLabel9</cstring>
+ </property>
+ <property name="text">
+ <string>&lt;b&gt;Member Address Book Entries:&lt;/b&gt;</string>
+ </property>
+ </widget>
+ <widget class="QListView" row="3" column="0" rowspan="1" colspan="4">
+ <column>
+ <property name="text">
+ <string>Group Members</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>entriesListView</cstring>
+ </property>
+ <property name="selectionMode">
+ <enum>NoSelection</enum>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="0" column="1" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>groupnameEdit</cstring>
+ </property>
+ </widget>
+ <widget class="Line" row="1" column="0" rowspan="1" colspan="4">
+ <property name="name">
+ <cstring>line11</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>HLine</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Sunken</enum>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="4" column="3">
+ <property name="name">
+ <cstring>okButton</cstring>
+ </property>
+ <property name="text">
+ <string>OK</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="4" column="2">
+ <property name="name">
+ <cstring>cancelButton</cstring>
+ </property>
+ <property name="text">
+ <string>Cancel</string>
+ </property>
+ </widget>
+ <spacer row="4" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>spacer36</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>150</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>okButton</sender>
+ <signal>clicked()</signal>
+ <receiver>FaxAddrBookGroupEditForm_base</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection>
+ <sender>cancelButton</sender>
+ <signal>clicked()</signal>
+ <receiver>FaxAddrBookGroupEditForm_base</receiver>
+ <slot>reject()</slot>
+ </connection>
+ <connection>
+ <sender>groupnameEdit</sender>
+ <signal>textChanged(const QString&amp;)</signal>
+ <receiver>FaxAddrBookGroupEditForm_base</receiver>
+ <slot>groupnameEdit_textChanged(const QString&amp;)</slot>
+ </connection>
+ <connection>
+ <sender>entriesListView</sender>
+ <signal>clicked(QListViewItem*)</signal>
+ <receiver>FaxAddrBookGroupEditForm_base</receiver>
+ <slot>entriesListView_clicked(QListViewItem*)</slot>
+ </connection>
+</connections>
+<includes>
+ <include location="local" impldecl="in implementation">faxaddrbookgroupeditform_base.ui.h</include>
+</includes>
+<slots>
+ <slot>groupnameEdit_textChanged( const QString &amp; )</slot>
+ <slot>entriesListView_clicked( QListViewItem * )</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/ui/faxaddrbookgroupsform_base.py b/ui/faxaddrbookgroupsform_base.py
new file mode 100644
index 0000000..1c4b2fb
--- /dev/null
+++ b/ui/faxaddrbookgroupsform_base.py
@@ -0,0 +1,106 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file '/home/dwelch/linux-imaging-and-printing/src/ui/faxaddrbookgroupsform_base.ui'
+#
+# Created: Mon May 9 13:35:56 2005
+# by: The PyQt User Interface Compiler (pyuic) 3.14.1
+#
+# WARNING! All changes made in this file will be lost!
+
+
+import sys
+from qt import *
+
+
+class FaxAddrBookGroupsForm_base(QDialog):
+ def __init__(self,parent = None,name = None,modal = 0,fl = 0):
+ QDialog.__init__(self,parent,name,modal,fl)
+
+ if not name:
+ self.setName("FaxAddrBookGroupsForm_base")
+
+
+ FaxAddrBookGroupsForm_baseLayout = QGridLayout(self,1,1,11,6,"FaxAddrBookGroupsForm_baseLayout")
+
+ self.groupListView = QListView(self,"groupListView")
+ self.groupListView.addColumn(self.__tr("Group Name"))
+ self.groupListView.addColumn(self.__tr("Group Members"))
+ self.groupListView.setAllColumnsShowFocus(1)
+
+ FaxAddrBookGroupsForm_baseLayout.addMultiCellWidget(self.groupListView,1,1,0,4)
+
+ self.newButton = QPushButton(self,"newButton")
+
+ FaxAddrBookGroupsForm_baseLayout.addWidget(self.newButton,2,0)
+
+ self.deleteButton = QPushButton(self,"deleteButton")
+
+ FaxAddrBookGroupsForm_baseLayout.addWidget(self.deleteButton,2,2)
+
+ self.editButton = QPushButton(self,"editButton")
+
+ FaxAddrBookGroupsForm_baseLayout.addWidget(self.editButton,2,1)
+ spacer35 = QSpacerItem(120,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ FaxAddrBookGroupsForm_baseLayout.addItem(spacer35,2,3)
+
+ self.pushButton42 = QPushButton(self,"pushButton42")
+
+ FaxAddrBookGroupsForm_baseLayout.addWidget(self.pushButton42,2,4)
+
+ self.textLabel10 = QLabel(self,"textLabel10")
+
+ FaxAddrBookGroupsForm_baseLayout.addMultiCellWidget(self.textLabel10,0,0,0,1)
+
+ self.languageChange()
+
+ self.resize(QSize(376,359).expandedTo(self.minimumSizeHint()))
+ self.clearWState(Qt.WState_Polished)
+
+ self.connect(self.newButton,SIGNAL("clicked()"),self.newButton_clicked)
+ self.connect(self.editButton,SIGNAL("clicked()"),self.editButton_clicked)
+ self.connect(self.deleteButton,SIGNAL("clicked()"),self.deleteButton_clicked)
+ self.connect(self.pushButton42,SIGNAL("clicked()"),self.close)
+ self.connect(self.groupListView,SIGNAL("currentChanged(QListViewItem*)"),self.groupListView_currentChanged)
+ self.connect(self.groupListView,SIGNAL("doubleClicked(QListViewItem*)"),self.groupListView_doubleClicked)
+ self.connect(self.groupListView,SIGNAL("rightButtonClicked(QListViewItem*,const QPoint&,int)"),self.groupListView_rightButtonClicked)
+
+
+ def languageChange(self):
+ self.setCaption(self.__tr("HP Device Manager - Fax Address Book Groups"))
+ self.groupListView.header().setLabel(0,self.__tr("Group Name"))
+ self.groupListView.header().setLabel(1,self.__tr("Group Members"))
+ self.newButton.setText(self.__tr("New..."))
+ self.deleteButton.setText(self.__tr("Delete..."))
+ self.editButton.setText(self.__tr("Edit..."))
+ self.pushButton42.setText(self.__tr("OK"))
+ self.textLabel10.setText(self.__tr("<b>Groups:</b>"))
+
+
+ def newButton_clicked(self):
+ print "FaxAddrBookGroupsForm_base.newButton_clicked(): Not implemented yet"
+
+ def editButton_clicked(self):
+ print "FaxAddrBookGroupsForm_base.editButton_clicked(): Not implemented yet"
+
+ def deleteButton_clicked(self):
+ print "FaxAddrBookGroupsForm_base.deleteButton_clicked(): Not implemented yet"
+
+ def groupListView_currentChanged(self,a0):
+ print "FaxAddrBookGroupsForm_base.groupListView_currentChanged(QListViewItem*): Not implemented yet"
+
+ def groupListView_doubleClicked(self,a0):
+ print "FaxAddrBookGroupsForm_base.groupListView_doubleClicked(QListViewItem*): Not implemented yet"
+
+ def groupListView_rightButtonClicked(self,a0,a1,a2):
+ print "FaxAddrBookGroupsForm_base.groupListView_rightButtonClicked(QListViewItem*,const QPoint&,int): Not implemented yet"
+
+ def __tr(self,s,c = None):
+ return qApp.translate("FaxAddrBookGroupsForm_base",s,c)
+
+if __name__ == "__main__":
+ a = QApplication(sys.argv)
+ QObject.connect(a,SIGNAL("lastWindowClosed()"),a,SLOT("quit()"))
+ w = FaxAddrBookGroupsForm_base()
+ a.setMainWidget(w)
+ w.show()
+ a.exec_loop()
diff --git a/ui/faxaddrbookgroupsform_base.ui b/ui/faxaddrbookgroupsform_base.ui
new file mode 100644
index 0000000..89a07cd
--- /dev/null
+++ b/ui/faxaddrbookgroupsform_base.ui
@@ -0,0 +1,167 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>FaxAddrBookGroupsForm_base</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>FaxAddrBookGroupsForm_base</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>376</width>
+ <height>359</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>HP Device Manager - Fax Address Book Groups</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QListView" row="1" column="0" rowspan="1" colspan="5">
+ <column>
+ <property name="text">
+ <string>Group Name</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Group Members</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>groupListView</cstring>
+ </property>
+ <property name="allColumnsShowFocus">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="2" column="0">
+ <property name="name">
+ <cstring>newButton</cstring>
+ </property>
+ <property name="text">
+ <string>New...</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="2" column="2">
+ <property name="name">
+ <cstring>deleteButton</cstring>
+ </property>
+ <property name="text">
+ <string>Delete...</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="2" column="1">
+ <property name="name">
+ <cstring>editButton</cstring>
+ </property>
+ <property name="text">
+ <string>Edit...</string>
+ </property>
+ </widget>
+ <spacer row="2" column="3">
+ <property name="name">
+ <cstring>spacer35</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>120</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton" row="2" column="4">
+ <property name="name">
+ <cstring>pushButton42</cstring>
+ </property>
+ <property name="text">
+ <string>OK</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>textLabel10</cstring>
+ </property>
+ <property name="text">
+ <string>&lt;b&gt;Groups:&lt;/b&gt;</string>
+ </property>
+ </widget>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>newButton</sender>
+ <signal>clicked()</signal>
+ <receiver>FaxAddrBookGroupsForm_base</receiver>
+ <slot>newButton_clicked()</slot>
+ </connection>
+ <connection>
+ <sender>editButton</sender>
+ <signal>clicked()</signal>
+ <receiver>FaxAddrBookGroupsForm_base</receiver>
+ <slot>editButton_clicked()</slot>
+ </connection>
+ <connection>
+ <sender>deleteButton</sender>
+ <signal>clicked()</signal>
+ <receiver>FaxAddrBookGroupsForm_base</receiver>
+ <slot>deleteButton_clicked()</slot>
+ </connection>
+ <connection>
+ <sender>pushButton42</sender>
+ <signal>clicked()</signal>
+ <receiver>FaxAddrBookGroupsForm_base</receiver>
+ <slot>close()</slot>
+ </connection>
+ <connection>
+ <sender>groupListView</sender>
+ <signal>currentChanged(QListViewItem*)</signal>
+ <receiver>FaxAddrBookGroupsForm_base</receiver>
+ <slot>groupListView_currentChanged(QListViewItem*)</slot>
+ </connection>
+ <connection>
+ <sender>groupListView</sender>
+ <signal>doubleClicked(QListViewItem*)</signal>
+ <receiver>FaxAddrBookGroupsForm_base</receiver>
+ <slot>groupListView_doubleClicked(QListViewItem*)</slot>
+ </connection>
+ <connection>
+ <sender>groupListView</sender>
+ <signal>rightButtonClicked(QListViewItem*,const QPoint&amp;,int)</signal>
+ <receiver>FaxAddrBookGroupsForm_base</receiver>
+ <slot>groupListView_rightButtonClicked(QListViewItem*,const QPoint&amp;,int)</slot>
+ </connection>
+</connections>
+<includes>
+ <include location="local" impldecl="in implementation">faxaddrbookgroupsform_base.ui.h</include>
+</includes>
+<slots>
+ <slot>newButton_clicked()</slot>
+ <slot>editButton_clicked()</slot>
+ <slot>deleteButton_clicked()</slot>
+ <slot>groupListView_currentChanged( QListViewItem * )</slot>
+ <slot>groupListView_doubleClicked( QListViewItem * )</slot>
+ <slot>groupListView_rightButtonClicked( QListViewItem *, const QPoint &amp;, int )</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/ui/faxsendjobform.py b/ui/faxsendjobform.py
new file mode 100644
index 0000000..a9d8c20
--- /dev/null
+++ b/ui/faxsendjobform.py
@@ -0,0 +1,235 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2009 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+# Std Lib
+import operator
+
+# Local
+from base.g import *
+from base.codes import *
+from base import utils, device
+from prnt import cups
+from ui_utils import load_pixmap
+
+if 1:
+#try:
+ from fax import fax
+#except ImportError:
+if 0:
+ # This can fail on Python < 2.3 due to the datetime module
+ log.error("Fax send disabled - Python 2.3+ required.")
+ sys.exit(1)
+
+
+# Qt/UI
+from qt import *
+from scrollfax import ScrollFaxView
+
+# dBus
+dbus_avail = False
+try:
+ import dbus
+except ImportError:
+ dbus_avail = False
+
+
+
+class FaxSendJobForm(QMainWindow):
+
+ def __init__(self, device_uri, printer_name, args,
+ parent=None, name=None,
+ modal=0, fl=0):
+
+ QMainWindow.__init__(self,parent,name,fl)
+
+ self.setIcon(load_pixmap('hp_logo', '128x128'))
+
+ self.init_failed = False
+ self.device_uri = device_uri
+ self.dev = None
+ self.printer_name = printer_name
+ bus = ['cups']
+ self.filename = ''
+ self.username = prop.username
+ self.args = args
+ self.setCentralWidget(QWidget(self,"qt_central_widget"))
+ self.FormLayout = QGridLayout(self.centralWidget(),1,1,11,6,"FormLayout")
+ self.resize(QSize(600,480).expandedTo(self.minimumSizeHint()))
+ self.clearWState(Qt.WState_Polished)
+ self.languageChange()
+
+# if self.device_uri and self.printer_name:
+# log.error("You may not specify both a printer (-p) and a device (-d).")
+# self.FailureUI(self.__tr("<p><b>You may not specify both a printer (-p) and a device (-d)."))
+# self.device_uri, self.printer_name = None, None
+# self.init_failed = True
+
+ self.cups_printers = cups.getPrinters()
+ log.debug(self.cups_printers)
+
+ if self.printer_name:
+ found = False
+ for p in self.cups_printers:
+ if p.name == printer_name:
+ self.device_uri = p.device_uri
+ found = True
+ break
+
+ if not found:
+ self.FailureUI(self.__tr("<b>Unknown printer name: %1</b><p>Please check the printer name and try again.").arg(self.printer_name))
+
+ if found and not p.device_uri.startswith('hpfax:/'):
+ self.FailureUI(self.__tr("You must specify a printer that has a device URI in the form 'hpfax:/...'"))
+ self.init_failed = True
+
+ if not self.device_uri and not self.printer_name:
+ t = device.probeDevices(bus=bus, filter={'fax-type':(operator.gt, FAX_TYPE_NONE)})
+ #print t
+ probed_devices = []
+
+ for d in t:
+ probed_devices.append(d.replace('hp:/', 'hpfax:/'))
+
+ #print probed_devices
+
+ probed_devices = utils.uniqueList(probed_devices)
+ log.debug(probed_devices)
+
+ max_deviceid_size, x, devices = 0, 0, {}
+
+ for d in probed_devices:
+ printers = []
+ for p in self.cups_printers:
+ #print p.device_uri, d
+ if p.device_uri == d:
+ #print "OK"
+ printers.append(p.name)
+
+ devices[x] = (d, printers)
+ x += 1
+ max_deviceid_size = max(len(d), max_deviceid_size)
+
+ x = len(devices)
+
+ #print devices
+
+ if x == 0:
+ from nodevicesform import NoDevicesForm
+ self.FailureUI(self.__tr("<p><b>No devices found.</b><p>Please make sure your device is properly installed and try again."))
+ self.init_failed = True
+
+ elif x == 1:
+ log.info(log.bold("Using device: %s" % devices[0][0]))
+ self.device_uri = devices[0][0]
+
+ else:
+ from chooseprinterdlg import ChoosePrinterDlg
+ dlg = ChoosePrinterDlg(self.cups_printers, ['hpfax'])
+
+ if dlg.exec_loop() == QDialog.Accepted:
+ self.device_uri = dlg.device_uri
+ else:
+ self.init_failed = True
+
+ self.dbus_avail, self.service, session_bus = device.init_dbus()
+
+ self.FaxView = ScrollFaxView(self.service, self.centralWidget(), self)
+ self.FormLayout.addWidget(self.FaxView,0,0)
+
+ if not self.init_failed:
+ if not self.device_uri or not self.device_uri.startswith("hpfax:"):
+ log.error("Invalid device URI: %s" % repr(device_uri))
+ self.FailureUI(self.__tr("<b>Invalid device URI %1.</b><p>Please check the parameters to hp-print and try again.").arg(repr(device_uri)));
+ self.init_failed = True
+
+ else:
+ try:
+ self.cur_device = device.Device(device_uri=self.device_uri,
+ printer_name=self.printer_name)
+ except Error, e:
+ log.error("Invalid device URI or printer name.")
+ self.FailureUI("<b>Invalid device URI or printer name.</b><p>Please check the parameters to hp-print and try again.")
+ self.init_failed = True
+
+ else:
+ self.device_uri = self.cur_device.device_uri
+ user_conf.set('last_used', 'device_uri', self.device_uri)
+
+ log.debug(self.device_uri)
+
+ self.statusBar().message(self.device_uri)
+
+
+ QTimer.singleShot(0, self.InitialUpdate)
+
+
+ def InitialUpdate(self):
+ if self.init_failed:
+ self.close()
+ return
+
+ self.FaxView.onDeviceChange(self.cur_device)
+
+ if self.args is not None:
+ for f in self.args:
+ self.FaxView.processFile(f)
+
+ if self.printer_name is not None:
+ self.FaxView.onPrinterChange(self.printer_name)
+
+
+ def languageChange(self):
+ self.setCaption(self.__tr("HP Device Manager - Send Fax"))
+
+ def closeEvent(self, event):
+ #print "close"
+ #print self.FaxView.lock_file
+ utils.unlock(self.FaxView.lock_file)
+ event.accept()
+
+ def SuccessUI(self):
+ QMessageBox.information(self,
+ self.caption(),
+ self.__tr("<p><b>Fax send completed successfully.</b>"),
+ QMessageBox.Ok,
+ QMessageBox.NoButton,
+ QMessageBox.NoButton)
+
+ def FailureUI(self, error_text):
+ log.error(unicode(error_text).replace("<b>", "").replace("</b>", "").replace("<p>", " "))
+ QMessageBox.critical(self,
+ self.caption(),
+ error_text,
+ QMessageBox.Ok,
+ QMessageBox.NoButton,
+ QMessageBox.NoButton)
+
+ def WarningUI(self, error_text):
+ log.warn(unicode(error_text).replace("<b>", "").replace("</b>", "").replace("<p>", " "))
+ QMessageBox.warning(self,
+ self.caption(),
+ error_text,
+ QMessageBox.Ok,
+ QMessageBox.NoButton,
+ QMessageBox.NoButton)
+
+ def __tr(self,s,c = None):
+ return qApp.translate("FaxSendJobForm", s, c)
diff --git a/ui/faxsettingsform.py b/ui/faxsettingsform.py
new file mode 100644
index 0000000..088895f
--- /dev/null
+++ b/ui/faxsettingsform.py
@@ -0,0 +1,119 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2009 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+
+
+from qt import *
+from faxsettingsform_base import FaxSettingsForm_base
+from base.g import *
+from base import device, pml, utils
+
+class PhoneNumValidator(QValidator):
+ def __init__(self, parent=None, name=None):
+ QValidator.__init__(self, parent, name)
+
+ def validate(self, input, pos):
+ input = unicode(input)
+ try:
+ input = input.encode('ascii')
+ except UnicodeEncodeError:
+ return QValidator.Invalid, pos
+
+ if not input:
+ return QValidator.Acceptable, pos
+ elif input[pos-1] not in '0123456789-(+) ':
+ return QValidator.Invalid, pos
+ elif len(input) > 50:
+ return QValidator.Invalid, pos
+ else:
+ return QValidator.Acceptable, pos
+
+
+class StationNameValidator(QValidator):
+ def __init__(self, parent=None, name=None):
+ QValidator.__init__(self, parent, name)
+
+ def validate(self, input, pos):
+ input = unicode(input)
+
+ try:
+ input = input.encode('ascii')
+ except UnicodeEncodeError:
+ return QValidator.Invalid, pos
+
+ if not input:
+ return QValidator.Acceptable, pos
+ # TODO: Find valid chars for this field
+ elif input != utils.printable(input):
+ return QValidator.Invalid, pos
+ elif len(input) > 50:
+ return QValidator.Invalid, pos
+ else:
+ return QValidator.Acceptable, pos
+
+
+
+class FaxSettingsForm(FaxSettingsForm_base):
+
+ def __init__(self, dev, fax_num, name_co, parent = None,name = None,modal = 0,fl = 0):
+ FaxSettingsForm_base.__init__(self,parent,name,modal,fl)
+ self.dev = dev
+ self.faxEdit.setValidator(PhoneNumValidator(self.faxEdit))
+ self.nameEdit.setValidator(StationNameValidator(self.nameEdit))
+ self.voiceEdit.setValidator(PhoneNumValidator(self.voiceEdit))
+ self.faxEdit.setText(fax_num)
+ self.nameEdit.setText(name_co)
+ self.setOKButton(fax_num and name_co)
+ self.voiceEdit.setText(QString(user_conf.get('fax', 'voice_phone')))
+ self.emailEdit.setText(QString(user_conf.get('fax', 'email_address')))
+
+ def faxEdit_textChanged(self,a0):
+ self.setOKButton()
+
+ def nameEdit_textChanged(self,a0):
+ self.setOKButton()
+
+ def setOKButton(self, toggle=None):
+ if toggle is not None:
+ self.pushButtonOK.setEnabled(bool(toggle))
+ else:
+ name = unicode(self.nameEdit.text())
+ fax_num = unicode(self.faxEdit.text())
+ self.pushButtonOK.setEnabled(bool(name and fax_num))
+
+ def accept(self):
+ # str() is OK here since the validators removed any non-ascii chars
+ fax = str(self.faxEdit.text())
+ log.debug(fax)
+ name = str(self.nameEdit.text())
+ log.debug(name)
+ try:
+ self.dev.setPML(pml.OID_FAX_LOCAL_PHONE_NUM, fax)
+ self.dev.setPML(pml.OID_FAX_STATION_NAME, name)
+ except Error:
+ log.error("Error setting fax settings to device.")
+
+ # TODO: This is a problem - user can enter non-ascii chars...
+ # user config needs to be in utf-8 encoding (but its not right now)
+ user_conf.set('fax', 'voice_phone', unicode(self.voiceEdit.text()).encode('utf-8'))
+ user_conf.set('fax', 'email_address', unicode(self.emailEdit.text()).encode('utf-8'))
+ FaxSettingsForm_base.accept(self)
+
diff --git a/ui/faxsettingsform_base.py b/ui/faxsettingsform_base.py
new file mode 100644
index 0000000..db334f7
--- /dev/null
+++ b/ui/faxsettingsform_base.py
@@ -0,0 +1,157 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'faxsettingsform_base.ui'
+#
+# Created: Mon Dec 12 16:15:55 2005
+# by: The PyQt User Interface Compiler (pyuic) 3.14.1
+#
+# WARNING! All changes made in this file will be lost!
+
+
+from qt import *
+
+
+class FaxSettingsForm_base(QDialog):
+ def __init__(self,parent = None,name = None,modal = 0,fl = 0):
+ QDialog.__init__(self,parent,name,modal,fl)
+
+ if not name:
+ self.setName("FaxSettingsForm_base")
+
+
+ FaxSettingsForm_baseLayout = QGridLayout(self,1,1,11,6,"FaxSettingsForm_baseLayout")
+
+ self.tabWidget2 = QTabWidget(self,"tabWidget2")
+
+ self.tab = QWidget(self.tabWidget2,"tab")
+ tabLayout = QGridLayout(self.tab,1,1,11,6,"tabLayout")
+
+ self.groupBox1 = QGroupBox(self.tab,"groupBox1")
+ self.groupBox1.setColumnLayout(0,Qt.Vertical)
+ self.groupBox1.layout().setSpacing(6)
+ self.groupBox1.layout().setMargin(11)
+ groupBox1Layout = QGridLayout(self.groupBox1.layout())
+ groupBox1Layout.setAlignment(Qt.AlignTop)
+
+ self.textLabel2 = QLabel(self.groupBox1,"textLabel2")
+
+ groupBox1Layout.addWidget(self.textLabel2,2,0)
+
+ self.faxEdit = QLineEdit(self.groupBox1,"faxEdit")
+
+ groupBox1Layout.addWidget(self.faxEdit,2,1)
+
+ self.textLabel1 = QLabel(self.groupBox1,"textLabel1")
+
+ groupBox1Layout.addWidget(self.textLabel1,1,0)
+
+ self.nameEdit = QLineEdit(self.groupBox1,"nameEdit")
+
+ groupBox1Layout.addWidget(self.nameEdit,1,1)
+
+ self.textLabel3 = QLabel(self.groupBox1,"textLabel3")
+ self.textLabel3.setAlignment(QLabel.WordBreak | QLabel.AlignVCenter)
+
+ groupBox1Layout.addMultiCellWidget(self.textLabel3,0,0,0,1)
+
+ tabLayout.addWidget(self.groupBox1,0,0)
+ spacer10 = QSpacerItem(20,60,QSizePolicy.Minimum,QSizePolicy.Expanding)
+ tabLayout.addItem(spacer10,2,0)
+
+ self.groupBox4 = QGroupBox(self.tab,"groupBox4")
+ self.groupBox4.setColumnLayout(0,Qt.Vertical)
+ self.groupBox4.layout().setSpacing(6)
+ self.groupBox4.layout().setMargin(11)
+ groupBox4Layout = QGridLayout(self.groupBox4.layout())
+ groupBox4Layout.setAlignment(Qt.AlignTop)
+
+ self.emailEdit = QLineEdit(self.groupBox4,"emailEdit")
+
+ groupBox4Layout.addWidget(self.emailEdit,2,1)
+
+ self.textLabel1_2 = QLabel(self.groupBox4,"textLabel1_2")
+
+ groupBox4Layout.addWidget(self.textLabel1_2,1,0)
+
+ self.voiceEdit = QLineEdit(self.groupBox4,"voiceEdit")
+
+ groupBox4Layout.addWidget(self.voiceEdit,1,1)
+
+ self.textLabel2_2 = QLabel(self.groupBox4,"textLabel2_2")
+
+ groupBox4Layout.addWidget(self.textLabel2_2,2,0)
+
+ self.textLabel3_2 = QLabel(self.groupBox4,"textLabel3_2")
+ self.textLabel3_2.setAlignment(QLabel.WordBreak | QLabel.AlignVCenter)
+
+ groupBox4Layout.addMultiCellWidget(self.textLabel3_2,0,0,0,1)
+
+ tabLayout.addWidget(self.groupBox4,1,0)
+ self.tabWidget2.insertTab(self.tab,QString.fromLatin1(""))
+
+ FaxSettingsForm_baseLayout.addMultiCellWidget(self.tabWidget2,2,2,0,3)
+
+ self.textLabel3_2_2 = QLabel(self,"textLabel3_2_2")
+
+ FaxSettingsForm_baseLayout.addMultiCellWidget(self.textLabel3_2_2,0,0,0,3)
+
+ self.line1_2_2 = QFrame(self,"line1_2_2")
+ self.line1_2_2.setFrameShape(QFrame.HLine)
+ self.line1_2_2.setFrameShadow(QFrame.Sunken)
+ self.line1_2_2.setFrameShape(QFrame.HLine)
+
+ FaxSettingsForm_baseLayout.addMultiCellWidget(self.line1_2_2,1,1,0,3)
+
+ self.pushButton31 = QPushButton(self,"pushButton31")
+
+ FaxSettingsForm_baseLayout.addWidget(self.pushButton31,3,2)
+
+ self.pushButtonOK = QPushButton(self,"pushButtonOK")
+ self.pushButtonOK.setEnabled(0)
+
+ FaxSettingsForm_baseLayout.addWidget(self.pushButtonOK,3,3)
+ spacer40 = QSpacerItem(386,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ FaxSettingsForm_baseLayout.addItem(spacer40,3,1)
+
+ self.languageChange()
+
+ self.resize(QSize(600,388).expandedTo(self.minimumSizeHint()))
+ self.clearWState(Qt.WState_Polished)
+
+ self.connect(self.pushButton31,SIGNAL("clicked()"),self.reject)
+ self.connect(self.pushButtonOK,SIGNAL("clicked()"),self.accept)
+ self.connect(self.faxEdit,SIGNAL("textChanged(const QString&)"),self.faxEdit_textChanged)
+ self.connect(self.nameEdit,SIGNAL("textChanged(const QString&)"),self.nameEdit_textChanged)
+
+ self.setTabOrder(self.nameEdit,self.faxEdit)
+ self.setTabOrder(self.faxEdit,self.voiceEdit)
+ self.setTabOrder(self.voiceEdit,self.emailEdit)
+ self.setTabOrder(self.emailEdit,self.pushButton31)
+ self.setTabOrder(self.pushButton31,self.pushButtonOK)
+ self.setTabOrder(self.pushButtonOK,self.tabWidget2)
+
+
+ def languageChange(self):
+ self.setCaption(self.__tr("HP Device Manager - Fax Settings"))
+ self.groupBox1.setTitle(self.__tr("Fax Header Information"))
+ self.textLabel2.setText(self.__tr("Device Fax Number:"))
+ self.textLabel1.setText(self.__tr("Name and/or Company:"))
+ self.textLabel3.setText(self.__tr("<i>This information will appear at the top of each fax that you send.</i>"))
+ self.groupBox4.setTitle(self.__tr("Coverpage Information"))
+ self.textLabel1_2.setText(self.__tr("Voice phone number:"))
+ self.textLabel2_2.setText(self.__tr("Email address:"))
+ self.textLabel3_2.setText(self.__tr("<i>This information will appear on any coverpage that you send.</i>"))
+ self.tabWidget2.changeTab(self.tab,self.__tr("Information"))
+ self.textLabel3_2_2.setText(self.__tr("<b>Configure device settings for sending faxes.</b>"))
+ self.pushButton31.setText(self.__tr("Cancel"))
+ self.pushButtonOK.setText(self.__tr("OK"))
+
+
+ def faxEdit_textChanged(self,a0):
+ print "FaxSettingsForm_base.faxEdit_textChanged(const QString&): Not implemented yet"
+
+ def nameEdit_textChanged(self,a0):
+ print "FaxSettingsForm_base.nameEdit_textChanged(const QString&): Not implemented yet"
+
+ def __tr(self,s,c = None):
+ return qApp.translate("FaxSettingsForm_base",s,c)
diff --git a/ui/faxsettingsform_base.ui b/ui/faxsettingsform_base.ui
new file mode 100644
index 0000000..828f372
--- /dev/null
+++ b/ui/faxsettingsform_base.ui
@@ -0,0 +1,257 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>FaxSettingsForm_base</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>FaxSettingsForm_base</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>600</width>
+ <height>388</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>HP Device Manager - Fax Settings</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QTabWidget" row="2" column="0" rowspan="1" colspan="4">
+ <property name="name">
+ <cstring>tabWidget2</cstring>
+ </property>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>tab</cstring>
+ </property>
+ <attribute name="title">
+ <string>Information</string>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QGroupBox" row="0" column="0">
+ <property name="name">
+ <cstring>groupBox1</cstring>
+ </property>
+ <property name="title">
+ <string>Fax Header Information</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>textLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>Device Fax Number:</string>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="2" column="1">
+ <property name="name">
+ <cstring>faxEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>Name and/or Company:</string>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="1" column="1">
+ <property name="name">
+ <cstring>nameEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>textLabel3</cstring>
+ </property>
+ <property name="text">
+ <string>&lt;i&gt;This information will appear at the top of each fax that you send.&lt;/i&gt;</string>
+ </property>
+ <property name="alignment">
+ <set>WordBreak|AlignVCenter</set>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <spacer row="2" column="0">
+ <property name="name">
+ <cstring>spacer10</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>60</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QGroupBox" row="1" column="0">
+ <property name="name">
+ <cstring>groupBox4</cstring>
+ </property>
+ <property name="title">
+ <string>Coverpage Information</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLineEdit" row="2" column="1">
+ <property name="name">
+ <cstring>emailEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>textLabel1_2</cstring>
+ </property>
+ <property name="text">
+ <string>Voice phone number:</string>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="1" column="1">
+ <property name="name">
+ <cstring>voiceEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>textLabel2_2</cstring>
+ </property>
+ <property name="text">
+ <string>Email address:</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>textLabel3_2</cstring>
+ </property>
+ <property name="text">
+ <string>&lt;i&gt;This information will appear on any coverpage that you send.&lt;/i&gt;</string>
+ </property>
+ <property name="alignment">
+ <set>WordBreak|AlignVCenter</set>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </grid>
+ </widget>
+ </widget>
+ <widget class="QLabel" row="0" column="0" rowspan="1" colspan="4">
+ <property name="name">
+ <cstring>textLabel3_2_2</cstring>
+ </property>
+ <property name="text">
+ <string>&lt;b&gt;Configure device settings for sending faxes.&lt;/b&gt;</string>
+ </property>
+ </widget>
+ <widget class="Line" row="1" column="0" rowspan="1" colspan="4">
+ <property name="name">
+ <cstring>line1_2_2</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>HLine</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Sunken</enum>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="3" column="2">
+ <property name="name">
+ <cstring>pushButton31</cstring>
+ </property>
+ <property name="text">
+ <string>Cancel</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="3" column="3">
+ <property name="name">
+ <cstring>pushButtonOK</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>OK</string>
+ </property>
+ </widget>
+ <spacer row="3" column="1">
+ <property name="name">
+ <cstring>spacer40</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>386</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>pushButton31</sender>
+ <signal>clicked()</signal>
+ <receiver>FaxSettingsForm_base</receiver>
+ <slot>reject()</slot>
+ </connection>
+ <connection>
+ <sender>pushButtonOK</sender>
+ <signal>clicked()</signal>
+ <receiver>FaxSettingsForm_base</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection>
+ <sender>faxEdit</sender>
+ <signal>textChanged(const QString&amp;)</signal>
+ <receiver>FaxSettingsForm_base</receiver>
+ <slot>faxEdit_textChanged(const QString&amp;)</slot>
+ </connection>
+ <connection>
+ <sender>nameEdit</sender>
+ <signal>textChanged(const QString&amp;)</signal>
+ <receiver>FaxSettingsForm_base</receiver>
+ <slot>nameEdit_textChanged(const QString&amp;)</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>nameEdit</tabstop>
+ <tabstop>faxEdit</tabstop>
+ <tabstop>voiceEdit</tabstop>
+ <tabstop>emailEdit</tabstop>
+ <tabstop>pushButton31</tabstop>
+ <tabstop>pushButtonOK</tabstop>
+ <tabstop>tabWidget2</tabstop>
+</tabstops>
+<slots>
+ <slot>faxEdit_textChanged( const QString &amp; )</slot>
+ <slot>nameEdit_textChanged( const QString &amp; )</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/ui/firmwaredialog.py b/ui/firmwaredialog.py
new file mode 100644
index 0000000..6429143
--- /dev/null
+++ b/ui/firmwaredialog.py
@@ -0,0 +1,117 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2001-2011 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Sarbeswar Meher
+#
+
+# Std Lib
+import operator
+
+# Local
+from base.g import *
+from base import device, utils
+from prnt import cups
+from base.codes import *
+from ui_utils import *
+
+# Qt
+from qt import *
+
+# Ui
+from firmwaredialog_base import FirmwareDialog_Base
+
+class FirmwareDialog(QDialog, FirmwareDialog_Base):
+ def __init__(self, parent, device_uri):
+ QDialog.__init__(self, parent)
+ self.setupUi(self)
+ self.device_uri = device_uri
+ self.initUi()
+ QTimer.singleShot(0, self.updateUi)
+
+ def initUi(self):
+ self.DeviceComboBox.setFilter({'fw-download' : (operator.gt, 0)})
+ self.DeviceComboBox.setParent(self)
+ self.connect(self.CancelButton, SIGNAL("clicked()"), self.close)
+ self.connect(self.DownloadFirmwareButton, SIGNAL("clicked()"), self.downloadFirmware)
+
+ # Application icon
+ self.setIcon(load_pixmap('hp_logo', '128x128'))
+
+ if self.device_uri:
+ self.DeviceComboBox.setInitialDevice(self.device_uri)
+
+
+ def updateUi(self):
+ self.DeviceComboBox.updateUi()
+
+
+ def DeviceUriComboBox_currentChanged(self, device_uri):
+ self.device_uri = device_uri
+ # Update
+
+
+ def DeviceUriComboBox_noDevices(self):
+ self.FailureUI(self.__tr("<b>No devices that support firmware download found.</b>"))
+ self.close()
+
+
+ def downloadFirmware(self):
+ d = None
+
+ try:
+ try:
+ d = device.Device(self.device_uri)
+ except Error:
+ self.CheckDeviceUI()
+ return
+
+ try:
+ d.open()
+ except Error:
+ self.CheckDeviceUI()
+ else:
+ if d.isIdleAndNoError():
+ ok = d.downloadFirmware()
+
+ else:
+ self.CheckDeviceUI()
+
+ finally:
+ if d is not None:
+ d.close()
+
+ self.close()
+
+
+
+ def __tr(self,s,c = None):
+ return qApp.translate("FirmwareDialog",s,c)
+
+ def FailureUI(self, error_text):
+
+ QMessageBox.critical(self,
+ self.caption(),
+ error_text,
+ QMessageBox.Ok,
+ QMessageBox.NoButton,
+ QMessageBox.NoButton)
+
+
+ def CheckDeviceUI(self):
+ return self.FailureUI(self.__tr("<b>Unable to communicate with device or device is in an error state.</b><p>Please check device setup and try again.</p>"))
+
diff --git a/ui/firmwaredialog_base.py b/ui/firmwaredialog_base.py
new file mode 100644
index 0000000..f5d1d6a
--- /dev/null
+++ b/ui/firmwaredialog_base.py
@@ -0,0 +1,66 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'firmwaredialog_base.ui'
+#
+# Created: Tue Feb 1 21:48:57 2011
+# by: The PyQt User Interface Compiler (pyuic) 3.17.4
+#
+# WARNING! All changes made in this file will be lost!
+#
+# Author: Sarbeswar Meher
+#
+
+from qt import *
+
+from deviceuricombobox import DeviceUriComboBox
+
+
+class FirmwareDialog_Base(object):
+ def setupUi(self,Dialog):
+ Dialog.setModal(True)
+ Dialog.setName("FirmwareDialog_Base")
+
+ self.Download_Firmwar = QLabel(Dialog,"Download_Firmware")
+ self.Download_Firmwar.setGeometry(QRect(9,9,454,25))
+ Download_Firmwar_font = QFont(self.Download_Firmwar.font())
+ Download_Firmwar_font.setPointSize(16)
+ self.Download_Firmwar.setFont(Download_Firmwar_font)
+
+ self.line = QFrame(Dialog,"line")
+ self.line.setGeometry(QRect(9,40,682,3))
+ self.line.setFrameShape(QFrame.HLine)
+ self.line.setFrameShadow(QFrame.Sunken)
+ self.line.setFrameShape(QFrame.HLine)
+
+ self.DownloadFirmwareButton = QPushButton(Dialog,"DownloadFirmwareButton")
+ self.DownloadFirmwareButton.setGeometry(QRect(460,320,131,27))
+
+ self.CancelButton = QPushButton(Dialog,"CancelButton")
+ self.CancelButton.setGeometry(QRect(600,320,85,27))
+
+ self.frame4 = QFrame(Dialog,"frame4")
+ self.frame4.setGeometry(QRect(9,86,682,37))
+ self.frame4.setFrameShape(QFrame.StyledPanel)
+ self.frame4.setFrameShadow(QFrame.Raised)
+
+ self.textLabel2 = QLabel(self.frame4,"textLabel2")
+ self.textLabel2.setGeometry(QRect(10,8,662,17))
+
+
+ self.DeviceComboBox = DeviceUriComboBox(Dialog)
+ self.DeviceComboBox.setGeometry(QRect(9,49,682,26))
+
+ self.languageChange(Dialog)
+
+ self.resize(QSize(709,361).expandedTo(self.minimumSizeHint()))
+
+ def languageChange(self, Dialog):
+ self.setCaption(self.__tr("HP Device Manager - Download Firmware "))
+ self.Download_Firmwar.setText(self.__tr("Download Firmware"))
+ self.DownloadFirmwareButton.setText(self.__tr("Download Firmware"))
+ self.CancelButton.setText(self.__tr("Cancel"))
+ self.textLabel2.setText(self.__tr("Click <i>Download Firmware</i> to begin download process."))
+
+
+ def __tr(self,s,c = None):
+ return qApp.translate("FirmwareDialog_Base",s,c)
diff --git a/ui/firmwaredialog_base.ui b/ui/firmwaredialog_base.ui
new file mode 100644
index 0000000..2f28cae
--- /dev/null
+++ b/ui/firmwaredialog_base.ui
@@ -0,0 +1,246 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>FirmwareDialog_Base</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>FirmwareDialog_Base</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>709</width>
+ <height>361</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>HP Device Manager - Download Firmware </string>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>Download_Firmwar</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>9</x>
+ <y>9</y>
+ <width>454</width>
+ <height>25</height>
+ </rect>
+ </property>
+ <property name="font">
+ <font>
+ <pointsize>16</pointsize>
+ </font>
+ </property>
+ <property name="text">
+ <string>Download Firmware</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>440</width>
+ <height>20</height>
+ </size>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>320</y>
+ <width>440</width>
+ <height>20</height>
+ </rect>
+ </property>
+ </spacer>
+ <widget class="Line">
+ <property name="name">
+ <cstring>line</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>9</x>
+ <y>40</y>
+ <width>682</width>
+ <height>3</height>
+ </rect>
+ </property>
+ <property name="frameShape">
+ <enum>HLine</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Sunken</enum>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>DownloadFirmwareButton</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>460</x>
+ <y>320</y>
+ <width>131</width>
+ <height>27</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>Download Firmware</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>CancelButton</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>600</x>
+ <y>320</y>
+ <width>85</width>
+ <height>27</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>Cancel</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>180</height>
+ </size>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>520</x>
+ <y>130</y>
+ <width>20</width>
+ <height>180</height>
+ </rect>
+ </property>
+ </spacer>
+ <widget class="QFrame">
+ <property name="name">
+ <cstring>frame4</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>9</x>
+ <y>86</y>
+ <width>682</width>
+ <height>37</height>
+ </rect>
+ </property>
+ <property name="frameShape">
+ <enum>StyledPanel</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Raised</enum>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel2</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>8</y>
+ <width>662</width>
+ <height>17</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>Click &lt;i&gt;Download Firmware&lt;/i&gt; to begin download process.</string>
+ </property>
+ </widget>
+ </widget>
+ <widget class="DeviceUriComboBox">
+ <property name="name">
+ <cstring>DeviceComboBox</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>9</x>
+ <y>49</y>
+ <width>682</width>
+ <height>26</height>
+ </rect>
+ </property>
+ </widget>
+</widget>
+<customwidgets>
+ <customwidget>
+ <class>QComboBox</class>
+ <header location="global">deviceuricombobox.h</header>
+ <sizehint>
+ <width>-1</width>
+ <height>-1</height>
+ </sizehint>
+ <container>0</container>
+ <sizepolicy>
+ <hordata>5</hordata>
+ <verdata>5</verdata>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ <pixmap>image0</pixmap>
+ </customwidget>
+</customwidgets>
+<images>
+ <image name="image0">
+ <data format="PNG" length="1002">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b000003b149444154388dad945f4c5b551cc73fe7dc4b7b4bcba0762d45c43114323599ee6192609c51d883892ce083f1718b3ebb185f8dc91e972cf39d2d2a2f1af664b6f1e0fe3863a0718969700eb0c52142da0242a1bd6d696f7bcff101585203ceb8fd9ece39f99dcff9fe7edf939f88c562ec465f5f9fe609442c161362173c3e3eae7b7a7ac8e7f36432196cdbfe4f907c3e4f2291201e8fe338cec3737357e9e8e828aded1e229d650e1f2d51754b082110124c13a4dc5ea341eb9dc284c0558a853f3ce8cb0677ef500fde7d39d2596679e326597b8e9abb85d7a770ab16ab6983ec5a05b487a70e36f0f4e10afe408d6a558310980108478dba4a1e8233990c5d474b64ed39aa3a8fe5f3317fbf81dbd70bccfeb205947632fd74f6589c1c6ea2f70d03a58ba0c1f2c9bdc1b66de3b8256a6e11cbe7e3ee1d181b590124fe2693aeee08d223c82c3a2c24b7b874bec8f26288774f7bd054504aef0dde6e99c0eb83f9fb266323cb80a27fb0958141836044605a2ee5523393371cc646fee2da37195aa35d0c0c5b4859ac03d7e91712dcaac5adab3650a3ff9d08ef7dd8404bb48869e5d958b5b87dadc4c9a1464e9f0d0326df7ebd86bd2e310cb1bf62d384d59441f2d70a070e1c60e09489929b988681bdd9cc97170bcc4c65595f71f8e0e3301337fc24a7732467831875a47f289652b0be5e4151e6d07316c1b0c0340d8ab92023e76d66a6b2840e36d2fb7a13fee632475e6edc367ea98a90fb98b7dd6310ca0328a44761582e1bab41befabcc0ec940d28bc5e93b68e064cab84e1d9beaeb48934eac1f53b01c1b000fca496aa54b61a99fcde61662a4b4b4b23d1680be9d426173e4df3602a48ea411989a4fd590f52a8fd156b05ed9d350e3defe3cfdf4b4c7ce770ea7d3fb9f520afbe1620daeee5c26735d20b9b9cfb6811a754a439e4e5c5639a4caa1e5caf586bfc0197b78702005cb9b4cae4cd3267ce8638fe964bd72b393e39d74928d242617303a756a37f284447770dcdbffc6384a05a85de1306e9a52057c7527c7131c3c42d3f475eb2303c82d4fc3276d6811db37efeb148723082d9b08f79f97c1e5729109a9a28307cc622d2d6cdf52b2b24efe548dedb00142009862cfa879ee1a71f6cec928353511472fbf4389148b0b0e0c108081412458dfe21c9f11351e67e7358595468246d1d1e5e38a6e9e851bc39d84ab502a669331dafec0d8ec7e3e8cb06e1a881d727d1ae40180a434a8c9db129a54126ad48a7358c2b4c5352c8c374bcccdab2bb37d8719cba79fab8211f9df218e0582c261e95f8bfc04f1a1e8bc5c4dfe0a190172af6a9690000000049454e44ae426082</data>
+ </image>
+</images>
+<connections>
+ <connection>
+ <sender>DownloadFirmwareButton</sender>
+ <signal>clicked()</signal>
+ <receiver>FirmwareDialog_Base</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection>
+ <sender>CancelButton</sender>
+ <signal>clicked()</signal>
+ <receiver>FirmwareDialog_Base</receiver>
+ <slot>close()</slot>
+ </connection>
+ <connection>
+ <sender>DeviceComboBox</sender>
+ <signal>DeviceUriComboBox_noDevices</signal>
+ <receiver>FirmwareDialog</receiver>
+ <slot>DeviceUriComboBox_noDevices()</slot>
+ </connection>
+ <connection>
+ <sender>DeviceComboBox</sender>
+ <signal>DeviceUriComboBox_currentChanged</signal>
+ <receiver>FirmwareDialog</receiver>
+ <slot>DeviceUriComboBox_currentChanged()</slot>
+ </connection>
+</connections>
+<slots>
+ <slot>DeviceUriComboBox_currentChanged</slot>
+ <slot>DeviceUriComboBox_noDevices</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/ui/imagepropertiesdlg.py b/ui/imagepropertiesdlg.py
new file mode 100644
index 0000000..3f18815
--- /dev/null
+++ b/ui/imagepropertiesdlg.py
@@ -0,0 +1,44 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2001-2007 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+import sys
+from qt import *
+from imagepropertiesdlg_base import ImagePropertiesDlg_base
+
+class ImagePropertiesDlg(ImagePropertiesDlg_base):
+ def __init__(self, filename, location, mimetype, size, exif_info={}, parent = None,name = None,modal = 0,fl = 0):
+ ImagePropertiesDlg_base.__init__(self,parent,name,modal,fl)
+
+ self.setCaption('Properties for ' + filename)
+ self.FilenameText.setText('<b>' + filename + '</b>')
+ self.LocationText.setText(location)
+ self.MimeTypeText.setText(mimetype)
+ self.SizeText.setText(size)
+ if exif_info:
+ for k in exif_info:
+ kk = k.lower()
+ if kk != "jpegthumbnail":
+ #print repr(k), repr(exif_info[k])
+ QListViewItem(self.EXifDataListView, k, str(exif_info[k]))
+
+
+
+
diff --git a/ui/imagepropertiesdlg_base.py b/ui/imagepropertiesdlg_base.py
new file mode 100644
index 0000000..785a6d3
--- /dev/null
+++ b/ui/imagepropertiesdlg_base.py
@@ -0,0 +1,111 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file '/home/dwelch/linux-imaging-and-printing/src/ui/imagepropertiesdlg_base.ui'
+#
+# Created: Fri Apr 1 14:51:29 2005
+# by: The PyQt User Interface Compiler (pyuic) 3.14.1
+#
+# WARNING! All changes made in this file will be lost!
+
+
+import sys
+from qt import *
+
+
+class ImagePropertiesDlg_base(QDialog):
+ def __init__(self,parent = None,name = None,modal = 0,fl = 0):
+ QDialog.__init__(self,parent,name,modal,fl)
+
+ if not name:
+ self.setName("ImagePropertiesDlg_base")
+
+
+ ImagePropertiesDlg_baseLayout = QGridLayout(self,1,1,11,6,"ImagePropertiesDlg_baseLayout")
+
+ self.textLabel6 = QLabel(self,"textLabel6")
+
+ ImagePropertiesDlg_baseLayout.addWidget(self.textLabel6,3,0)
+
+ self.textLabel8 = QLabel(self,"textLabel8")
+
+ ImagePropertiesDlg_baseLayout.addWidget(self.textLabel8,4,0)
+
+ self.textLabel10 = QLabel(self,"textLabel10")
+
+ ImagePropertiesDlg_baseLayout.addWidget(self.textLabel10,2,0)
+
+ self.EXifDataListView = QListView(self,"EXifDataListView")
+ self.EXifDataListView.addColumn(self.__tr("EXIF Labels"))
+ self.EXifDataListView.header().setResizeEnabled(0,self.EXifDataListView.header().count() - 1)
+ self.EXifDataListView.addColumn(self.__tr("Contents "))
+ self.EXifDataListView.setSizePolicy(QSizePolicy(QSizePolicy.Expanding,QSizePolicy.Expanding,0,0,self.EXifDataListView.sizePolicy().hasHeightForWidth()))
+ self.EXifDataListView.setMinimumSize(QSize(400,100))
+ self.EXifDataListView.setFrameShadow(QListView.Sunken)
+ self.EXifDataListView.setResizeMode(QListView.AllColumns)
+
+ ImagePropertiesDlg_baseLayout.addMultiCellWidget(self.EXifDataListView,5,5,0,2)
+
+ self.LocationText = QLabel(self,"LocationText")
+
+ ImagePropertiesDlg_baseLayout.addMultiCellWidget(self.LocationText,2,2,1,2)
+
+ self.MimeTypeText = QLabel(self,"MimeTypeText")
+
+ ImagePropertiesDlg_baseLayout.addMultiCellWidget(self.MimeTypeText,3,3,1,2)
+
+ self.SizeText = QLabel(self,"SizeText")
+
+ ImagePropertiesDlg_baseLayout.addMultiCellWidget(self.SizeText,4,4,1,2)
+
+ self.FilenameText = QLabel(self,"FilenameText")
+
+ ImagePropertiesDlg_baseLayout.addMultiCellWidget(self.FilenameText,0,0,0,2)
+
+ self.line1 = QFrame(self,"line1")
+ self.line1.setFrameShape(QFrame.HLine)
+ self.line1.setFrameShadow(QFrame.Sunken)
+ self.line1.setFrameShape(QFrame.HLine)
+
+ ImagePropertiesDlg_baseLayout.addMultiCellWidget(self.line1,1,1,0,2)
+ spacer3 = QSpacerItem(300,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ ImagePropertiesDlg_baseLayout.addMultiCell(spacer3,6,6,0,1)
+
+ self.pushButton6 = QPushButton(self,"pushButton6")
+
+ ImagePropertiesDlg_baseLayout.addWidget(self.pushButton6,6,2)
+
+ self.languageChange()
+
+ self.resize(QSize(431,388).expandedTo(self.minimumSizeHint()))
+ self.clearWState(Qt.WState_Polished)
+
+ self.connect(self.pushButton6,SIGNAL("clicked()"),self.close)
+
+
+ def languageChange(self):
+ self.setCaption(self.__tr("Properties for"))
+ self.textLabel6.setText(self.__tr("MIME Type:"))
+ self.textLabel8.setText(self.__tr("Size:"))
+ self.textLabel10.setText(self.__tr("Location:"))
+ self.EXifDataListView.header().setLabel(0,self.__tr("EXIF Labels"))
+ self.EXifDataListView.header().setLabel(1,self.__tr("Contents "))
+ self.LocationText.setText(self.__tr("LOCATION"))
+ self.MimeTypeText.setText(self.__tr("MIME TYPE"))
+ self.SizeText.setText(self.__tr("SIZE"))
+ self.FilenameText.setText(self.__tr("FILENAME"))
+ self.pushButton6.setText(self.__tr("OK"))
+
+
+ def ViewEXIFButton_clicked(self):
+ print "ImagePropertiesDlg_base.ViewEXIFButton_clicked(): Not implemented yet"
+
+ def __tr(self,s,c = None):
+ return qApp.translate("ImagePropertiesDlg_base",s,c)
+
+if __name__ == "__main__":
+ a = QApplication(sys.argv)
+ QObject.connect(a,SIGNAL("lastWindowClosed()"),a,SLOT("quit()"))
+ w = ImagePropertiesDlg_base()
+ a.setMainWidget(w)
+ w.show()
+ a.exec_loop()
diff --git a/ui/imagepropertiesdlg_base.ui b/ui/imagepropertiesdlg_base.ui
new file mode 100644
index 0000000..f2bef4b
--- /dev/null
+++ b/ui/imagepropertiesdlg_base.ui
@@ -0,0 +1,178 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>ImagePropertiesDlg_base</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>ImagePropertiesDlg_base</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>431</width>
+ <height>388</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Properties for</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="3" column="0">
+ <property name="name">
+ <cstring>textLabel6</cstring>
+ </property>
+ <property name="text">
+ <string>MIME Type:</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="4" column="0">
+ <property name="name">
+ <cstring>textLabel8</cstring>
+ </property>
+ <property name="text">
+ <string>Size:</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>textLabel10</cstring>
+ </property>
+ <property name="text">
+ <string>Location:</string>
+ </property>
+ </widget>
+ <widget class="QListView" row="5" column="0" rowspan="1" colspan="3">
+ <column>
+ <property name="text">
+ <string>EXIF Labels</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>false</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Contents </string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>EXifDataListView</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>400</width>
+ <height>100</height>
+ </size>
+ </property>
+ <property name="frameShadow">
+ <enum>Sunken</enum>
+ </property>
+ <property name="resizeMode">
+ <enum>AllColumns</enum>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="1" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>LocationText</cstring>
+ </property>
+ <property name="text">
+ <string>LOCATION</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="3" column="1" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>MimeTypeText</cstring>
+ </property>
+ <property name="text">
+ <string>MIME TYPE</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="4" column="1" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>SizeText</cstring>
+ </property>
+ <property name="text">
+ <string>SIZE</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>FilenameText</cstring>
+ </property>
+ <property name="text">
+ <string>FILENAME</string>
+ </property>
+ </widget>
+ <widget class="Line" row="1" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>line1</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>HLine</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Sunken</enum>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ </widget>
+ <spacer row="6" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>spacer3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>300</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton" row="6" column="2">
+ <property name="name">
+ <cstring>pushButton6</cstring>
+ </property>
+ <property name="text">
+ <string>OK</string>
+ </property>
+ </widget>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>pushButton6</sender>
+ <signal>clicked()</signal>
+ <receiver>ImagePropertiesDlg_base</receiver>
+ <slot>close()</slot>
+ </connection>
+</connections>
+<slots>
+ <slot>ViewEXIFButton_clicked()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/ui/jobstoragemixin.py b/ui/jobstoragemixin.py
new file mode 100644
index 0000000..5985997
--- /dev/null
+++ b/ui/jobstoragemixin.py
@@ -0,0 +1,643 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2001-2007 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+# Local
+from base.g import *
+from base import utils
+from prnt import cups
+
+# Qt
+from qt import *
+
+class PINValidator(QValidator):
+ def __init__(self, parent=None, name=None):
+ QValidator.__init__(self, parent, name)
+
+ def validate(self, input, pos):
+ for x in unicode(input)[pos-1:]:
+ if x not in u'0123456789':
+ return QValidator.Invalid, pos
+
+ return QValidator.Acceptable, pos
+
+class TextValidator(QValidator):
+ def __init__(self, parent=None, name=None):
+ QValidator.__init__(self, parent, name)
+
+ def validate(self, input, pos):
+ for x in unicode(input)[pos-1:]:
+ if x not in u'0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ -':
+ return QValidator.Invalid, pos
+
+ return QValidator.Acceptable, pos
+
+
+class JobStorageMixin(object):
+ def __init__(self):
+ pass
+
+ def initJobStorage(self, print_settings_mode=False):
+ self.print_settings_mode = print_settings_mode
+ self.job_storage_mode = JOB_STORAGE_TYPE_OFF
+ self.job_storage_pin = u"0000"
+ self.job_storage_use_pin = False
+ self.job_storage_username = unicode(prop.username[:16])
+ self.job_storage_auto_username = True
+ self.job_storage_jobname = u"Untitled"
+ self.job_storage_auto_jobname = True
+ self.job_storage_job_exist = 0
+
+
+ def addJobStorage(self, current_options=None):
+ self.addJobStorageMode()
+ self.addJobStoragePIN()
+ self.addJobStorageUsername()
+ self.addJobStorageID()
+ self.addJobStorageIDExists()
+ self.jobStorageDisable()
+
+ if current_options is None:
+ cups.resetOptions()
+ cups.openPPD(self.cur_printer)
+ current_options = dict(cups.getOptions())
+ cups.closePPD()
+
+ self.job_storage_pin = unicode(current_options.get('HOLDKEY', '0000')[:4])
+ self.jobStoragePINEdit.setText(self.job_storage_pin)
+
+ self.job_storage_username = unicode(current_options.get('USERNAME', prop.username)[:16])
+ self.jobStorageUsernameEdit.setText(self.job_storage_username)
+
+ self.job_storage_jobname = unicode(current_options.get('JOBNAME', u"Untitled")[:16])
+ self.jobStorageIDEdit.setText(self.job_storage_jobname)
+
+ hold = current_options.get('HOLD', 'OFF')
+ holdtype = current_options.get('HOLDTYPE', 'PUBLIC')
+
+ if hold == 'OFF':
+ self.job_storage_mode = JOB_STORAGE_TYPE_OFF
+
+ elif hold == 'ON':
+ if holdtype == 'PUBLIC':
+ self.job_storage_mode = JOB_STORAGE_TYPE_QUICK_COPY
+
+ else: # 'PRIVATE'
+ self.job_storage_mode = JOB_STORAGE_TYPE_PERSONAL
+ self.job_storage_use_pin = True
+
+ elif hold == 'PROOF':
+ if holdtype == 'PUBLIC':
+ self.job_storage_mode = JOB_STORAGE_TYPE_PROOF_AND_HOLD
+ else:
+ self.job_storage_mode = JOB_STORAGE_TYPE_PERSONAL
+ self.job_storage_use_pin = True
+
+ elif hold == 'STORE':
+ self.job_storage_mode = JOB_STORAGE_TYPE_STORE
+ self.job_storage_use_pin = (holdtype == 'PRIVATE')
+
+ self.jobStorageModeComboBox.setCurrentItem(self.job_storage_mode)
+ self.jobStorageModeDefaultPushButton.setEnabled(self.job_storage_mode != JOB_STORAGE_TYPE_OFF)
+ self.setModeTooltip()
+ self.setPrinterOptionHold()
+
+ duplicate = current_options.get('DUPLICATEJOB', 'REPLACE')
+
+ if duplicate == 'REPLACE':
+ self.job_storage_job_exist = 0
+ else:
+ self.job_storage_job_exist = 1
+
+ self.jobStorageIDExistsComboBox.setCurrentItem(self.job_storage_job_exist)
+ self.setPrinterOptionIDExists()
+
+ #
+
+ if self.job_storage_mode == JOB_STORAGE_TYPE_OFF:
+ self.jobStorageDisable()
+ else:
+ self.jobStorageUserJobEnable()
+ self.setPrinterOptionID()
+ self.setPrinterOptionPIN()
+ self.setPrinterOptionUsername()
+
+ self.jobStoragePINButtonGroup.setButton(self.job_storage_use_pin)
+ self.jobStoragePINEnable(self.job_storage_mode in (JOB_STORAGE_TYPE_PERSONAL, JOB_STORAGE_TYPE_STORE))
+
+
+ def addJobStorageMode(self):
+ widget = self.getWidget()
+
+ layout34 = QHBoxLayout(widget,5,10,"layout34")
+
+ self.jobStorageModeLabel = QLabel(widget,"jobStorageModeLabel")
+ layout34.addWidget(self.jobStorageModeLabel)
+ spacer20_4 = QSpacerItem(20,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ layout34.addItem(spacer20_4)
+
+ self.jobStorageModeComboBox = QComboBox(0,widget,"jobStorageModeComboBox")
+ layout34.addWidget(self.jobStorageModeComboBox)
+
+ self.jobStorageModeDefaultPushButton = QPushButton(widget,"pagesetDefaultPushButton")
+ layout34.addWidget(self.jobStorageModeDefaultPushButton)
+
+ self.jobStorageModeLabel.setText(self.__tr("Job Storage Mode:"))
+ self.jobStorageModeComboBox.clear()
+ self.jobStorageModeComboBox.insertItem(self.__tr("Off"))
+ self.jobStorageModeComboBox.insertItem(self.__tr("Proof and Hold"))
+ self.jobStorageModeComboBox.insertItem(self.__tr("Personal/Private Job"))
+ self.jobStorageModeComboBox.insertItem(self.__tr("Quick Copy"))
+ self.jobStorageModeComboBox.insertItem(self.__tr("Stored Job"))
+
+ self.jobStorageModeDefaultPushButton.setText(self.__tr("Default"))
+ self.jobStorageModeDefaultPushButton.setEnabled(False)
+
+ self.connect(self.jobStorageModeComboBox, SIGNAL("activated(int)"), self.jobStorageModeComboBox_activated)
+ self.connect(self.jobStorageModeDefaultPushButton, SIGNAL("clicked()"), self.jobStorageModeDefaultPushButton_clicked)
+
+ self.addWidget(widget, "job_storage_mode")
+
+ def jobStorageModeComboBox_activated(self, a):
+ #print a
+ self.job_storage_mode = a
+ self.jobStorageModeDefaultPushButton.setEnabled(a != JOB_STORAGE_TYPE_OFF)
+
+ if a == JOB_STORAGE_TYPE_OFF:
+ #print "off!"
+ self.jobStorageDisable()
+ else:
+ self.jobStorageUserJobEnable()
+
+ self.setPrinterOptionHold()
+ self.jobStoragePINEnable(a in (JOB_STORAGE_TYPE_PERSONAL, JOB_STORAGE_TYPE_STORE))
+ self.setModeTooltip()
+
+
+ def setModeTooltip(self):
+ QToolTip.remove(self.jobStorageModeComboBox)
+
+ if self.job_storage_mode == JOB_STORAGE_TYPE_OFF:
+ QToolTip.add(self.jobStorageModeComboBox,
+ self.__tr("""Your job will be printed but not stored on the printer."""))
+
+ elif self.job_storage_mode == JOB_STORAGE_TYPE_PERSONAL:
+ QToolTip.add(self.jobStorageModeComboBox,
+ self.__tr("""Your job will be stored on the printer and nothing will be printed until you request the job from the printer's control panel.<br>Once the job is printed, it will automatically be removed from the printer's job storage. For Private print jobs, add a 4-digit PIN."""))
+
+ elif self.job_storage_mode == JOB_STORAGE_TYPE_PROOF_AND_HOLD:
+ QToolTip.add(self.jobStorageModeComboBox,
+ self.__tr("""When multiples copies are requested, the first copy will be printed.<br>The remaining copies will be held on the printer until you release them using the printer's control panel."""))
+
+ elif self.job_storage_mode == JOB_STORAGE_TYPE_QUICK_COPY:
+ QToolTip.add(self.jobStorageModeComboBox,
+ self.__tr("""After your job prints, you can use the printer's control panel to print additional copies of your job."""))
+
+ elif self.job_storage_mode == JOB_STORAGE_TYPE_STORE:
+ QToolTip.add(self.jobStorageModeComboBox,
+ self.__tr("""Your job will not immediately print, but instead be stored in the printer. <br>You can request copies of this job from the printer's control panel. Use this for storage of forms and other common or shared documents."""))
+
+
+ def setPrinterOptionHold(self):
+ if self.print_settings_mode:
+ if self.job_storage_mode == JOB_STORAGE_TYPE_OFF:
+ #print "off!!!"
+ self.setPrinterOption('HOLD', 'OFF')
+ self.removePrinterOption('HOLDTYPE')
+ self.removePrinterOption('HOLDKEY')
+ self.removePrinterOption('USERNAME')
+ self.removePrinterOption('JOBNAME')
+ self.removePrinterOption('DUPLICATEJOB')
+
+ elif self.job_storage_mode == JOB_STORAGE_TYPE_PROOF_AND_HOLD:
+ #print "proof"
+ self.job_storage_use_pin = False
+ self.setPrinterOption('HOLD', 'PROOF')
+ self.removePrinterOption('HOLDTYPE')
+ self.removePrinterOption('HOLDKEY')
+
+ elif self.job_storage_mode == JOB_STORAGE_TYPE_PERSONAL:
+ #print "personal"
+ #self.setPrinterOption('HOLDTYPE', 'PRIVATE')
+
+ if self.job_storage_use_pin:
+ self.setPrinterOption('HOLD', 'ON')
+ self.setPrinterOption('HOLDTYPE', 'PRIVATE')
+ else:
+ self.setPrinterOption('HOLD', 'PROOF')
+ self.setPrinterOption('HOLDTYPE', 'PUBLIC')
+ self.removePrinterOption('HOLDKEY')
+
+
+ elif self.job_storage_mode == JOB_STORAGE_TYPE_QUICK_COPY:
+ #print "qc"
+ self.job_storage_use_pin = False
+ self.setPrinterOption('HOLD', 'ON')
+ self.setPrinterOption('HOLDTYPE', 'PUBLIC')
+ self.removePrinterOption('HOLDKEY')
+
+ elif self.job_storage_mode == JOB_STORAGE_TYPE_STORE:
+ #print "store"
+
+ self.setPrinterOption('HOLD', 'STORE')
+
+ if self.job_storage_use_pin:
+ self.setPrinterOption('HOLDTYPE', 'PRIVATE')
+ else:
+ self.removePrinterOption('HOLDTYPE')
+ self.removePrinterOption('HOLDKEY')
+
+
+ def jobStorageModeDefaultPushButton_clicked(self):
+ self.jobStorageModeComboBox.setCurrentItem(0)
+ self.job_storage_mode = JOB_STORAGE_TYPE_OFF
+ self.setPrinterOptionHold()
+ self.setModeTooltip()
+
+ def jobStorageDisable(self): # Off: Turn off all options
+ self.jobStorageModeDefaultPushButton.setEnabled(False)
+ self.jobStoragePINEnable(False)
+ self.jobStorageUserJobEnable(False)
+ #self.setPrinterOptionHold()
+
+ def jobStoragePINEnable(self, e=True): # PIN On/Off
+ t = e and self.jobStoragePINButtonGroup.selectedId() == 1
+ self.jobStoragePINButtonGroup.setEnabled(e)
+ self.jobStoragePINEdit.setEnabled(t)
+ self.jobStoragePINDefaultPushButton.setEnabled(t)
+ self.setPrinterOptionPIN()
+
+ def jobStorageUserJobEnable(self, e=True): # Username/Job ID/Job ID Exists On/Off
+ t = e and self.jobStorageUsernameButtonGroup.selectedId() == 1
+ self.jobStorageUsernameButtonGroup.setEnabled(e)
+ self.jobStorageUsernameDefaultPushButton.setEnabled(t)
+ self.jobStorageUsernameEdit.setEnabled(t)
+ if e: self.setPrinterOptionUsername()
+
+ t = e and self.jobStorageIDButtonGroup.selectedId() == 1
+ self.jobStorageIDButtonGroup.setEnabled(e)
+ self.jobStorageIDDefaultPushButton.setEnabled(t)
+ self.jobStorageIDEdit.setEnabled(t)
+ if e: self.setPrinterOptionID()
+
+ t = e and self.jobStorageIDExistsComboBox.currentItem() == 1
+ self.jobStorageIDExistsComboBox.setEnabled(e)
+ self.jobStorageIDExistsDefaultPushButton.setEnabled(t)
+ if e: self.setPrinterOptionIDExists()
+
+
+ # PIN
+
+
+ def addJobStoragePIN(self):
+ widget = self.getWidget()
+
+ layout39 = QGridLayout(widget,1,1,5,10,"layout39")
+
+ self.jobStoragePINEdit = QLineEdit(widget,"self.jobStoragePINEdit")
+ self.jobStoragePINEdit.setMaxLength(4)
+ self.jobStoragePINEdit.setInputMask(QString("9999"))
+ self.jobStoragePINEdit.setText(self.job_storage_pin)
+ layout39.addWidget(self.jobStoragePINEdit,0,3)
+
+ spacer20_2 = QSpacerItem(20,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ layout39.addItem(spacer20_2,0,1)
+
+ textLabel5_2 = QLabel(widget,"textLabel5_2")
+ layout39.addWidget(textLabel5_2,0,0)
+
+ self.jobStoragePINDefaultPushButton = QPushButton(widget,"jobStoragePINDefaultPushButton")
+ layout39.addWidget(self.jobStoragePINDefaultPushButton,0,4)
+
+ self.jobStoragePINButtonGroup = QButtonGroup(widget,"self.jobStoragePINButtonGroup")
+ self.jobStoragePINButtonGroup.setLineWidth(0)
+ self.jobStoragePINButtonGroup.setColumnLayout(0,Qt.Vertical)
+ self.jobStoragePINButtonGroup.layout().setSpacing(0)
+ self.jobStoragePINButtonGroup.layout().setMargin(0)
+ self.jobStoragePINButtonGroupLayout = QGridLayout(self.jobStoragePINButtonGroup.layout())
+ self.jobStoragePINButtonGroupLayout.setAlignment(Qt.AlignTop)
+
+ radioButton3_2 = QRadioButton(self.jobStoragePINButtonGroup,"radioButton3_2")
+ radioButton3_2.setChecked(1)
+ self.jobStoragePINButtonGroup.insert( radioButton3_2,0)
+ self.jobStoragePINButtonGroupLayout.addWidget(radioButton3_2,0,0)
+
+ radioButton4_2 = QRadioButton(self.jobStoragePINButtonGroup,"radioButton4_2")
+ self.jobStoragePINButtonGroup.insert( radioButton4_2,1)
+ self.jobStoragePINButtonGroupLayout.addWidget(radioButton4_2,0,1)
+
+ layout39.addWidget(self.jobStoragePINButtonGroup,0,2)
+
+ self.bg = self.jobStoragePINEdit.paletteBackgroundColor()
+ self.invalid_page_range = False
+
+ self.jobStoragePINEdit.setValidator(PINValidator(self.jobStoragePINEdit))
+
+ textLabel5_2.setText(self.__tr("Make Job Private (use PIN to print):"))
+ radioButton3_2.setText(self.__tr("Public/Off"))
+ radioButton4_2.setText(self.__tr("Private/Use PIN:"))
+
+ self.jobStoragePINDefaultPushButton.setText(self.__tr("Default"))
+
+ self.connect(self.jobStoragePINButtonGroup, SIGNAL("clicked(int)"), self.jobStoragePINButtonGroup_clicked)
+ self.connect(self.jobStoragePINEdit,SIGNAL("lostFocus()"),self.jobStoragePINEdit_lostFocus)
+ self.connect(self.jobStoragePINEdit,SIGNAL("textChanged(const QString&)"),self.jobStoragePINEdit_textChanged)
+ self.connect(self.jobStoragePINDefaultPushButton, SIGNAL("clicked()"), self.jobStoragePINDefaultPushButton_clicked)
+
+ self.addWidget(widget, "job_storage_pin")
+
+ def jobStoragePINButtonGroup_clicked(self, a):
+ if a == 0: # Public/Off
+ self.jobStoragePINDefaultPushButton.setEnabled(False)
+ self.jobStoragePINEdit.setEnabled(False)
+ self.job_storage_use_pin = False
+ self.job_storage_pin = u"0000"
+ self.setPrinterOptionPIN()
+
+ else: # On/Private/Use PIN
+ self.jobStoragePINDefaultPushButton.setEnabled(True)
+ self.jobStoragePINEdit.setEnabled(True)
+ self.job_storage_use_pin = True
+ self.job_storage_pin = unicode(self.jobStoragePINEdit.text())
+ self.setPrinterOptionPIN()
+
+ def setPrinterOptionPIN(self):
+ if self.print_settings_mode :
+ if self.job_storage_use_pin:
+
+ self.setPrinterOption('HOLDKEY', self.job_storage_pin.encode('ascii'))
+ #self.setPrinterOption('HOLD', 'ON')
+ else:
+ self.removePrinterOption('HOLDKEY')
+ #self.setPrinterOption('HOLD', 'PROOF')
+
+
+ def jobStoragePINEdit_lostFocus(self):
+ #self.setPrinterOptionPIN()
+ pass
+
+ def jobStoragePINEdit_textChanged(self, a):
+ self.job_storage_pin = unicode(a)
+ self.setPrinterOptionPIN()
+
+ def jobStoragePINDefaultPushButton_clicked(self):
+ self.jobStoragePINButtonGroup.setButton(0)
+ self.jobStoragePINDefaultPushButton.setEnabled(False)
+ self.jobStoragePINEdit.setEnabled(False)
+ self.job_storage_use_pin = False
+
+ # Username
+
+ def addJobStorageUsername(self):
+ widget = self.getWidget()
+
+ layout39 = QGridLayout(widget,1,1,5,10,"layout39")
+
+ self.jobStorageUsernameEdit = QLineEdit(widget,"self.jobStorageUsernameEdit")
+ self.jobStorageUsernameEdit.setMaxLength(16)
+ self.jobStorageUsernameEdit.setText(self.job_storage_username)
+ layout39.addWidget(self.jobStorageUsernameEdit,0,3)
+
+ spacer20_2 = QSpacerItem(20,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ layout39.addItem(spacer20_2,0,1)
+
+ textLabel5_2 = QLabel(widget,"textLabel5_2")
+ layout39.addWidget(textLabel5_2,0,0)
+
+ self.jobStorageUsernameDefaultPushButton = QPushButton(widget,"jobStorageUsernameDefaultPushButton")
+ layout39.addWidget(self.jobStorageUsernameDefaultPushButton,0,4)
+
+ self.jobStorageUsernameButtonGroup = QButtonGroup(widget,"self.jobStorageUsernameButtonGroup")
+ self.jobStorageUsernameButtonGroup.setLineWidth(0)
+ self.jobStorageUsernameButtonGroup.setColumnLayout(0,Qt.Vertical)
+ self.jobStorageUsernameButtonGroup.layout().setSpacing(0)
+ self.jobStorageUsernameButtonGroup.layout().setMargin(0)
+ self.jobStorageUsernameButtonGroupLayout = QGridLayout(self.jobStorageUsernameButtonGroup.layout())
+ self.jobStorageUsernameButtonGroupLayout.setAlignment(Qt.AlignTop)
+
+ radioButton3_2 = QRadioButton(self.jobStorageUsernameButtonGroup,"radioButton3_2")
+ radioButton3_2.setChecked(1)
+ self.jobStorageUsernameButtonGroup.insert( radioButton3_2,0)
+ self.jobStorageUsernameButtonGroupLayout.addWidget(radioButton3_2,0,0)
+
+ radioButton4_2 = QRadioButton(self.jobStorageUsernameButtonGroup,"radioButton4_2")
+ self.jobStorageUsernameButtonGroup.insert( radioButton4_2,1)
+ self.jobStorageUsernameButtonGroupLayout.addWidget(radioButton4_2,0,1)
+
+ layout39.addWidget(self.jobStorageUsernameButtonGroup,0,2)
+
+ self.bg = self.jobStorageUsernameEdit.paletteBackgroundColor()
+ self.invalid_page_range = False
+
+ self.jobStorageUsernameEdit.setValidator(TextValidator(self.jobStorageUsernameEdit))
+
+ textLabel5_2.setText(self.__tr("User name (for job identification):"))
+ radioButton3_2.setText(self.__tr("Automatic"))
+ radioButton4_2.setText(self.__tr("Custom:"))
+
+ self.jobStorageUsernameDefaultPushButton.setText(self.__tr("Default"))
+
+ self.connect(self.jobStorageUsernameButtonGroup, SIGNAL("clicked(int)"), self.jobStorageUsernameButtonGroup_clicked)
+ self.connect(self.jobStorageUsernameEdit,SIGNAL("lostFocus()"),self.jobStorageUsernameEdit_lostFocus)
+ self.connect(self.jobStorageUsernameEdit,SIGNAL("textChanged(const QString&)"),self.jobStorageUsernameEdit_textChanged)
+ self.connect(self.jobStorageUsernameDefaultPushButton, SIGNAL("clicked()"), self.jobStorageUsernameDefaultPushButton_clicked)
+
+ self.addWidget(widget, "job_storage_username")
+
+ def jobStorageUsernameButtonGroup_clicked(self, a):
+ if a == 0: # Automatic
+ self.jobStorageUsernameDefaultPushButton.setEnabled(False)
+ self.jobStorageUsernameEdit.setEnabled(False)
+ self.job_storage_auto_username = True
+ self.job_storage_username = unicode(prop.username[:16])
+ self.setPrinterOptionUsername()
+
+ else: # Custom
+ self.jobStorageUsernameDefaultPushButton.setEnabled(True)
+ self.jobStorageUsernameEdit.setEnabled(True)
+ self.job_storage_auto_username = False
+ self.job_storage_username = unicode(self.jobStorageUsernameEdit.text())
+ self.setPrinterOptionUsername()
+
+ def jobStorageUsernameEdit_lostFocus(self):
+ #self.setPrinterOptionUsername()
+ pass
+
+ def jobStorageUsernameEdit_textChanged(self, a):
+ self.job_storage_username = unicode(a)
+ self.setPrinterOptionUsername()
+
+ def jobStorageUsernameDefaultPushButton_clicked(self):
+ self.jobStorageUsernameButtonGroup.setButton(0)
+ self.jobStorageUsernameDefaultPushButton.setEnabled(False)
+ self.jobStorageUsernameEdit.setEnabled(False)
+ self.job_storage_auto_username = True
+ self.job_storage_username = unicode(prop.username[:16])
+ self.setPrinterOptionUsername()
+
+ def setPrinterOptionUsername(self):
+ if self.print_settings_mode:
+ self.setPrinterOption('USERNAME', self.job_storage_username.encode('ascii').replace(' ', '_'))
+
+
+ # Job ID
+
+ def addJobStorageID(self):
+ widget = self.getWidget()
+
+ layout39 = QGridLayout(widget,1,1,5,10,"layout39")
+
+ self.jobStorageIDEdit = QLineEdit(widget,"self.jobStorageIDEdit")
+ self.jobStorageIDEdit.setMaxLength(16)
+ self.jobStorageIDEdit.setText(self.job_storage_jobname)
+ layout39.addWidget(self.jobStorageIDEdit,0,3)
+
+ spacer20_2 = QSpacerItem(20,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ layout39.addItem(spacer20_2,0,1)
+
+ textLabel5_2 = QLabel(widget,"textLabel5_2")
+ layout39.addWidget(textLabel5_2,0,0)
+
+ self.jobStorageIDDefaultPushButton = QPushButton(widget,"jobStorageIDDefaultPushButton")
+ layout39.addWidget(self.jobStorageIDDefaultPushButton,0,4)
+
+ self.jobStorageIDButtonGroup = QButtonGroup(widget,"self.jobStorageIDButtonGroup")
+ self.jobStorageIDButtonGroup.setLineWidth(0)
+ self.jobStorageIDButtonGroup.setColumnLayout(0,Qt.Vertical)
+ self.jobStorageIDButtonGroup.layout().setSpacing(0)
+ self.jobStorageIDButtonGroup.layout().setMargin(0)
+ self.jobStorageIDButtonGroupLayout = QGridLayout(self.jobStorageIDButtonGroup.layout())
+ self.jobStorageIDButtonGroupLayout.setAlignment(Qt.AlignTop)
+
+ radioButton3_2 = QRadioButton(self.jobStorageIDButtonGroup,"radioButton3_2")
+ radioButton3_2.setChecked(1)
+ self.jobStorageIDButtonGroup.insert( radioButton3_2,0)
+ self.jobStorageIDButtonGroupLayout.addWidget(radioButton3_2,0,0)
+
+ radioButton4_2 = QRadioButton(self.jobStorageIDButtonGroup,"radioButton4_2")
+ self.jobStorageIDButtonGroup.insert( radioButton4_2,1)
+ self.jobStorageIDButtonGroupLayout.addWidget(radioButton4_2,0,1)
+
+ layout39.addWidget(self.jobStorageIDButtonGroup,0,2)
+
+ self.bg = self.jobStorageIDEdit.paletteBackgroundColor()
+ self.invalid_page_range = False
+
+ self.jobStorageIDEdit.setValidator(TextValidator(self.jobStorageIDEdit))
+
+ textLabel5_2.setText(self.__tr("Job name (for job identification):"))
+ radioButton3_2.setText(self.__tr("Automatic"))
+ radioButton4_2.setText(self.__tr("Custom:"))
+
+ self.jobStorageIDDefaultPushButton.setText(self.__tr("Default"))
+
+ self.connect(self.jobStorageIDButtonGroup, SIGNAL("clicked(int)"), self.jobStorageIDButtonGroup_clicked)
+ self.connect(self.jobStorageIDEdit,SIGNAL("lostFocus()"),self.jobStorageIDEdit_lostFocus)
+ self.connect(self.jobStorageIDEdit,SIGNAL("textChanged(const QString&)"),self.jobStorageIDEdit_textChanged)
+ self.connect(self.jobStorageIDDefaultPushButton, SIGNAL("clicked()"), self.jobStorageIDDefaultPushButton_clicked)
+
+ self.addWidget(widget, "job_storage_ID")
+
+ def jobStorageIDButtonGroup_clicked(self, a):
+ if a == 0: # Automatic
+ self.jobStorageIDDefaultPushButton.setEnabled(False)
+ self.jobStorageIDEdit.setEnabled(False)
+ self.job_storage_auto_jobname = True
+ self.job_storage_jobname = u"Untitled"
+ self.setPrinterOptionID()
+
+ else: # Custom
+ self.jobStorageIDDefaultPushButton.setEnabled(True)
+ self.jobStorageIDEdit.setEnabled(True)
+ self.job_storage_auto_jobname = False
+ self.job_storage_jobname = unicode(self.jobStorageIDEdit.text())
+ self.setPrinterOptionID()
+
+ def jobStorageIDEdit_lostFocus(self):
+ #self.setPrinterOptionID()
+ pass
+
+ def jobStorageIDEdit_textChanged(self, a):
+ self.job_storage_jobname = unicode(a)
+ self.setPrinterOptionID()
+
+ def jobStorageIDDefaultPushButton_clicked(self):
+ self.jobStorageIDButtonGroup.setButton(0)
+ self.jobStorageIDDefaultPushButton.setEnabled(False)
+ self.jobStorageIDEdit.setEnabled(False)
+ self.job_storage_auto_jobname = True
+ self.job_storage_jobname = u"Untitled"
+ self.setPrinterOptionID()
+
+ def setPrinterOptionID(self):
+ if self.print_settings_mode:
+ self.setPrinterOption('JOBNAME', self.job_storage_jobname.encode('ascii').replace(' ', '_'))
+
+ # Job ID Exists
+
+ def addJobStorageIDExists(self):
+ widget = self.getWidget()
+
+ layout34 = QHBoxLayout(widget,5,10,"layout34")
+
+ self.jobStorageIDExistsLabel = QLabel(widget,"jobStorageIDExistsLabel")
+ layout34.addWidget(self.jobStorageIDExistsLabel)
+ spacer20_4 = QSpacerItem(20,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ layout34.addItem(spacer20_4)
+
+ self.jobStorageIDExistsComboBox = QComboBox(0,widget,"jobStorageIDExistsComboBox")
+ layout34.addWidget(self.jobStorageIDExistsComboBox)
+
+ self.jobStorageIDExistsDefaultPushButton = QPushButton(widget,"pagesetDefaultPushButton")
+ layout34.addWidget(self.jobStorageIDExistsDefaultPushButton)
+
+ self.jobStorageIDExistsLabel.setText(self.__tr("If Job Name already exists:"))
+ self.jobStorageIDExistsComboBox.clear()
+ self.jobStorageIDExistsComboBox.insertItem(self.__tr("Replace existing job"))
+ self.jobStorageIDExistsComboBox.insertItem(self.__tr("Use Job Name + (1-99)"))
+
+ self.jobStorageIDExistsDefaultPushButton.setText(self.__tr("Default"))
+
+ self.connect(self.jobStorageIDExistsComboBox, SIGNAL("activated(int)"), self.jobStorageIDExistsComboBox_activated)
+ self.connect(self.jobStorageIDExistsDefaultPushButton, SIGNAL("clicked()"), self.jobStorageIDExistsDefaultPushButton_clicked)
+
+ self.addWidget(widget, "job_storage_id_exists")
+
+ def jobStorageIDExistsComboBox_activated(self, a):
+ self.jobStorageIDExistsDefaultPushButton.setEnabled(a==1)
+ self.job_storage_job_exist = a
+ self.setPrinterOptionIDExists()
+
+ def jobStorageIDExistsDefaultPushButton_clicked(self):
+ self.jobStorageIDExistsComboBox.setCurrentItem(0)
+ self.jobStorageIDExistsDefaultPushButton.setEnabled(False)
+ self.job_storage_job_exist = 0
+ self.setPrinterOptionIDExists()
+
+ def setPrinterOptionIDExists(self):
+ if self.print_settings_mode:
+ if self.job_storage_job_exist == 0:
+ self.setPrinterOption('DUPLICATEJOB', 'REPLACE')
+ else:
+ self.setPrinterOption('DUPLICATEJOB', 'APPEND')
+
+ def __tr(self,s,c = None):
+ return qApp.translate("JobStorage",s,c)
+
diff --git a/ui/loadpaperform.py b/ui/loadpaperform.py
new file mode 100644
index 0000000..59c7534
--- /dev/null
+++ b/ui/loadpaperform.py
@@ -0,0 +1,37 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2001-2008 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+# Std Lib
+
+# Local
+from base.g import *
+from ui_utils import load_pixmap
+
+# Qt
+from qt import *
+from loadpaperform_base import LoadPaperForm_base
+
+
+class LoadPaperForm(LoadPaperForm_base):
+ def __init__(self, parent=None, name=None, modal=0, fl=0):
+ LoadPaperForm_base.__init__(self, parent, name, modal, fl)
+
+ self.Icon.setPixmap(load_pixmap('load_paper', 'other'))
diff --git a/ui/loadpaperform_base.py b/ui/loadpaperform_base.py
new file mode 100644
index 0000000..265fd92
--- /dev/null
+++ b/ui/loadpaperform_base.py
@@ -0,0 +1,71 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file '/home/dwelch/linux-imaging-and-printing/src/ui/loadpaperform_base.ui'
+#
+# Created: Fri Apr 1 14:51:29 2005
+# by: The PyQt User Interface Compiler (pyuic) 3.14.1
+#
+# WARNING! All changes made in this file will be lost!
+
+
+import sys
+from qt import *
+
+
+class LoadPaperForm_base(QDialog):
+ def __init__(self,parent = None,name = None,modal = 0,fl = 0):
+ QDialog.__init__(self,parent,name,modal,fl)
+
+ if not name:
+ self.setName("LoadPaperForm_base")
+
+
+ LoadPaperForm_baseLayout = QGridLayout(self,1,1,11,6,"LoadPaperForm_baseLayout")
+
+ self.ContinueButton = QPushButton(self,"ContinueButton")
+
+ LoadPaperForm_baseLayout.addWidget(self.ContinueButton,1,3)
+
+ self.CancelButton = QPushButton(self,"CancelButton")
+
+ LoadPaperForm_baseLayout.addWidget(self.CancelButton,1,2)
+ spacer7 = QSpacerItem(391,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ LoadPaperForm_baseLayout.addMultiCell(spacer7,1,1,0,1)
+
+ self.textLabel7 = QLabel(self,"textLabel7")
+ self.textLabel7.setAlignment(QLabel.WordBreak | QLabel.AlignVCenter)
+
+ LoadPaperForm_baseLayout.addMultiCellWidget(self.textLabel7,0,0,1,3)
+
+ self.Icon = QLabel(self,"Icon")
+ self.Icon.setSizePolicy(QSizePolicy(QSizePolicy.Fixed,QSizePolicy.Fixed,0,0,self.Icon.sizePolicy().hasHeightForWidth()))
+ self.Icon.setScaledContents(1)
+
+ LoadPaperForm_baseLayout.addWidget(self.Icon,0,0)
+
+ self.languageChange()
+
+ self.resize(QSize(621,178).expandedTo(self.minimumSizeHint()))
+ self.clearWState(Qt.WState_Polished)
+
+ self.connect(self.CancelButton,SIGNAL("clicked()"),self.reject)
+ self.connect(self.ContinueButton,SIGNAL("clicked()"),self.accept)
+
+
+ def languageChange(self):
+ self.setCaption(self.__tr("HP Device Manager - Load Plain Paper"))
+ self.ContinueButton.setText(self.__tr("Continue"))
+ self.CancelButton.setText(self.__tr("Cancel"))
+ self.textLabel7.setText(self.__tr("A page will be printed. Please load <b>plain paper</b> in the printer and then press continue."))
+
+
+ def __tr(self,s,c = None):
+ return qApp.translate("LoadPaperForm_base",s,c)
+
+if __name__ == "__main__":
+ a = QApplication(sys.argv)
+ QObject.connect(a,SIGNAL("lastWindowClosed()"),a,SLOT("quit()"))
+ w = LoadPaperForm_base()
+ a.setMainWidget(w)
+ w.show()
+ a.exec_loop()
diff --git a/ui/loadpaperform_base.ui b/ui/loadpaperform_base.ui
new file mode 100644
index 0000000..99636cf
--- /dev/null
+++ b/ui/loadpaperform_base.ui
@@ -0,0 +1,99 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>LoadPaperForm_base</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>LoadPaperForm_base</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>621</width>
+ <height>178</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>HP Device Manager - Load Plain Paper</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QPushButton" row="1" column="3">
+ <property name="name">
+ <cstring>ContinueButton</cstring>
+ </property>
+ <property name="text">
+ <string>Continue</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="1" column="2">
+ <property name="name">
+ <cstring>CancelButton</cstring>
+ </property>
+ <property name="text">
+ <string>Cancel</string>
+ </property>
+ </widget>
+ <spacer row="1" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>spacer7</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>391</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLabel" row="0" column="1" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>textLabel7</cstring>
+ </property>
+ <property name="text">
+ <string>A page will be printed. Please load &lt;b&gt;plain paper&lt;/b&gt; in the printer and then press continue.</string>
+ </property>
+ <property name="alignment">
+ <set>WordBreak|AlignVCenter</set>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>Icon</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="scaledContents">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>CancelButton</sender>
+ <signal>clicked()</signal>
+ <receiver>LoadPaperForm_base</receiver>
+ <slot>reject()</slot>
+ </connection>
+ <connection>
+ <sender>ContinueButton</sender>
+ <signal>clicked()</signal>
+ <receiver>LoadPaperForm_base</receiver>
+ <slot>accept()</slot>
+ </connection>
+</connections>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/ui/makecopiesform.py b/ui/makecopiesform.py
new file mode 100644
index 0000000..37ed80c
--- /dev/null
+++ b/ui/makecopiesform.py
@@ -0,0 +1,173 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2001-2009 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Authors: Don Welch
+
+# Std Lib
+import operator
+
+# Local
+from base.g import *
+from prnt import cups
+from base import device, utils, pml
+from copier import copier
+from ui_utils import load_pixmap
+
+# Qt
+from qt import *
+from scrollcopy import ScrollCopyView
+
+class MakeCopiesForm(QMainWindow):
+ def __init__(self, bus='cups', device_uri=None, printer_name=None,
+ num_copies=None, contrast=None, quality=None,
+ reduction=None, fit_to_page=None,
+ parent=None, name=None, modal=0, fl=0):
+
+ QMainWindow.__init__(self,parent,name,fl)
+
+ self.setIcon(load_pixmap('hp_logo', '128x128'))
+
+ self.cur_device_uri = device_uri
+ self.printer_name = printer_name
+ self.init_failed = False
+ self.num_copies = num_copies
+ self.contrast = contrast
+ self.quality = quality
+ self.reduction = reduction
+ self.fit_to_page = fit_to_page
+
+ self.setCentralWidget(QWidget(self,"qt_central_widget"))
+ self.FormLayout = QGridLayout(self.centralWidget(),1,1,11,6,"FormLayout")
+ self.resize(QSize(600,480).expandedTo(self.minimumSizeHint()))
+ self.clearWState(Qt.WState_Polished)
+ self.languageChange()
+
+ if self.cur_device_uri and self.printer_name:
+ log.error("You may not specify both a printer (-p) and a device (-d).")
+ self.FailureUI(self.__tr("<p><b>You may not specify both a printer (-p) and a device (-d)."))
+ self.cur_device_uri, self.printer_name = None, None
+ self.init_failed = True
+
+ self.cups_printers = cups.getPrinters()
+ log.debug(self.cups_printers)
+
+ if not self.cur_device_uri and not self.printer_name:
+ t = device.probeDevices(bus=bus, filter={'copy-type': (operator.gt, 0)})
+ probed_devices = []
+
+ for d in t:
+ if d.startswith('hp:'):
+ probed_devices.append(d)
+
+ log.debug(probed_devices)
+
+ max_deviceid_size, x, devices = 0, 0, {}
+
+ for d in probed_devices:
+ printers = []
+ for p in self.cups_printers:
+ if p.device_uri == d:
+ printers.append(p.name)
+ devices[x] = (d, printers)
+ x += 1
+ max_deviceid_size = max(len(d), max_deviceid_size)
+
+ if x == 0:
+ from nodevicesform import NoDevicesForm
+ self.FailureUI(self.__tr("<p><b>No devices found.</b><p>Please make sure your device is properly installed and try again."))
+ self.init_failed = True
+
+ elif x == 1:
+ log.info(log.bold("Using device: %s" % devices[0][0]))
+ self.cur_device_uri = devices[0][0]
+
+
+ else:
+ from choosedevicedlg import ChooseDeviceDlg
+ dlg = ChooseDeviceDlg(devices) #, ['hp'])
+
+ if dlg.exec_loop() == QDialog.Accepted:
+ self.cur_device_uri = dlg.device_uri
+ else:
+ self.init_failed = True
+
+
+ self.CopyView = ScrollCopyView(None, num_copies=num_copies,
+ contrast=contrast, quality=quality,
+ reduction=reduction, fit_to_page=fit_to_page,
+ parent=self.centralWidget(), form=self)
+
+ self.FormLayout.addWidget(self.CopyView,0,0)
+
+ self.cur_device = self.cur_device_uri
+
+ if not self.init_failed:
+ try:
+ self.cur_device = copier.PMLCopyDevice(device_uri=self.cur_device_uri,
+ printer_name=self.printer_name)
+ except Error:
+ log.error("Invalid device URI or printer name.")
+ self.FailureUI("<b>Invalid device URI or printer name.</b><p>Please check the parameters to hp-print and try again.")
+ self.init_failed = True
+
+ else:
+
+ if self.cur_device.copy_type == COPY_TYPE_NONE:
+ self.FailureUI(self.__tr("<b>Sorry, make copies functionality is not implemented for this device.</b>"))
+ self.close()
+ return
+
+ self.cur_device_uri = self.cur_device.device_uri
+ user_conf.set('last_used', 'device_uri', self.cur_device_uri)
+
+ log.debug(self.cur_device_uri)
+
+ self.statusBar().message(self.cur_device.device_uri)
+
+
+ QTimer.singleShot(0, self.InitialUpdate)
+
+ def InitialUpdate(self):
+ if self.init_failed:
+ self.close()
+ return
+
+ self.CopyView.onDeviceChange(self.cur_device)
+
+ def languageChange(self):
+ self.setCaption(self.__tr("HP Device Manager - Make Copies"))
+
+ def FailureUI(self, error_text):
+ QMessageBox.critical(self,
+ self.caption(),
+ error_text,
+ QMessageBox.Ok,
+ QMessageBox.NoButton,
+ QMessageBox.NoButton)
+
+ def WarningUI(self, msg):
+ QMessageBox.warning(self,
+ self.caption(),
+ msg,
+ QMessageBox.Ok,
+ QMessageBox.NoButton,
+ QMessageBox.NoButton)
+
+
+ def __tr(self,s,c = None):
+ return qApp.translate("MakeCopiesForm",s,c)
diff --git a/ui/nodevicesform.py b/ui/nodevicesform.py
new file mode 100644
index 0000000..dd67de9
--- /dev/null
+++ b/ui/nodevicesform.py
@@ -0,0 +1,76 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2001-2008 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+# Std Lib
+import os.path
+
+# Local
+from base.g import *
+from base import utils
+from prnt import cups
+from ui_utils import load_pixmap
+
+# Qt
+from qt import *
+from nodevicesform_base import NoDevicesForm_base
+
+
+
+class NoDevicesForm(NoDevicesForm_base):
+ def __init__(self,parent = None,name = None,modal = 0,fl = 0):
+ NoDevicesForm_base.__init__(self, parent, name, modal, fl)
+
+ self.Icon.setPixmap(load_pixmap("warning.png", '32x32'))
+
+
+ def CUPSButton_clicked(self):
+ self.close()
+ utils.openURL("http://localhost:631/admin")
+
+
+ def ExitButton_clicked(self):
+ self.close()
+
+
+ def setupPushButton_clicked(self):
+ self.close()
+
+ if utils.which('hp-setup'):
+ cmd = 'hp-setup -u'
+ else:
+ cmd = 'python ./setup.py -u'
+
+ log.debug(cmd)
+ utils.run(cmd, log_output=True, password_func=None, timeout=1)
+
+ try:
+ self.parent().RescanDevices()
+ except Error:
+ QMessageBox.critical(self,
+ self.caption(),
+ self.__tr("<b>An error occurred.</b><p>Please re-start the Device Manager and try again."),
+ QMessageBox.Ok,
+ QMessageBox.NoButton,
+ QMessageBox.NoButton)
+
+
+ def __tr(self,s,c = None):
+ return qApp.translate("NoDevicesForm",s,c)
diff --git a/ui/nodevicesform_base.py b/ui/nodevicesform_base.py
new file mode 100644
index 0000000..1e04e62
--- /dev/null
+++ b/ui/nodevicesform_base.py
@@ -0,0 +1,88 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'ui/nodevicesform_base.ui'
+#
+# Created: Tue Jun 10 13:34:02 2008
+# by: The PyQt User Interface Compiler (pyuic) 3.17.3
+#
+# WARNING! All changes made in this file will be lost!
+
+
+from qt import *
+
+
+class NoDevicesForm_base(QDialog):
+ def __init__(self,parent = None,name = None,modal = 0,fl = 0):
+ QDialog.__init__(self,parent,name,modal,fl)
+
+ if not name:
+ self.setName("NoDevicesForm_base")
+
+
+ NoDevicesForm_baseLayout = QGridLayout(self,1,1,11,6,"NoDevicesForm_baseLayout")
+
+ self.Icon = QLabel(self,"Icon")
+ self.Icon.setSizePolicy(QSizePolicy(QSizePolicy.Fixed,QSizePolicy.Fixed,0,0,self.Icon.sizePolicy().hasHeightForWidth()))
+ self.Icon.setFrameShape(QLabel.NoFrame)
+ self.Icon.setScaledContents(1)
+
+ NoDevicesForm_baseLayout.addWidget(self.Icon,0,0)
+ spacer3 = QSpacerItem(20,280,QSizePolicy.Minimum,QSizePolicy.Expanding)
+ NoDevicesForm_baseLayout.addItem(spacer3,1,0)
+ spacer2 = QSpacerItem(20,16,QSizePolicy.Minimum,QSizePolicy.Expanding)
+ NoDevicesForm_baseLayout.addItem(spacer2,2,2)
+
+ self.textLabel7 = QLabel(self,"textLabel7")
+ self.textLabel7.setAlignment(QLabel.WordBreak | QLabel.AlignVCenter)
+
+ NoDevicesForm_baseLayout.addMultiCellWidget(self.textLabel7,0,1,1,4)
+ spacer43 = QSpacerItem(400,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ NoDevicesForm_baseLayout.addMultiCell(spacer43,3,3,0,1)
+
+ self.setupPushButton = QPushButton(self,"setupPushButton")
+
+ NoDevicesForm_baseLayout.addWidget(self.setupPushButton,3,2)
+
+ self.CUPSButton = QPushButton(self,"CUPSButton")
+
+ NoDevicesForm_baseLayout.addWidget(self.CUPSButton,3,3)
+
+ self.ExitButton = QPushButton(self,"ExitButton")
+ self.ExitButton.setDefault(1)
+
+ NoDevicesForm_baseLayout.addWidget(self.ExitButton,3,4)
+
+ self.languageChange()
+
+ self.resize(QSize(525,440).expandedTo(self.minimumSizeHint()))
+ self.clearWState(Qt.WState_Polished)
+
+ self.connect(self.CUPSButton,SIGNAL("clicked()"),self.CUPSButton_clicked)
+ self.connect(self.ExitButton,SIGNAL("clicked()"),self.ExitButton_clicked)
+ self.connect(self.setupPushButton,SIGNAL("clicked()"),self.setupPushButton_clicked)
+
+
+ def languageChange(self):
+ self.setCaption(self.__tr("HP Device Manager - No Installed HP Devices Found"))
+ self.textLabel7.setText(self.__tr("<b><font size=\"+2\">No Installed HP Devices Found.</font></b><p>To install a device, use one of the following methods:<p>\n"
+"1.Run <b>hp-setup</b> (in a shell/terminal or click <tt>Setup Device...</tt> below).<p>\n"
+"2. <b>CUPS web interface</b> (open a browser to: <u>http://localhost:631</u> or press the button below),<p>\n"
+"3. The <b>printer installation utility</b> that came with your operating system (YaST, PrinterDrake, etc).\n"
+"<p><p>After setting up a printer, you may have to press <tt>F6</tt> or choose <tt>Device | Refresh All</tt> for the printer to appear in the HP Device Manager.<p>\n"
+"<i><b>Note: Only devices installed with the <tt>hp:</tt> or <tt>hpfax:</tt> CUPS backend will appear in the HP Device Manager.</b></i><p>"))
+ self.setupPushButton.setText(self.__tr("Setup Device..."))
+ self.CUPSButton.setText(self.__tr("CUPS Web Interface"))
+ self.ExitButton.setText(self.__tr("Close"))
+
+
+ def CUPSButton_clicked(self):
+ print "NoDevicesForm_base.CUPSButton_clicked(): Not implemented yet"
+
+ def ExitButton_clicked(self):
+ print "NoDevicesForm_base.ExitButton_clicked(): Not implemented yet"
+
+ def setupPushButton_clicked(self):
+ print "NoDevicesForm_base.setupPushButton_clicked(): Not implemented yet"
+
+ def __tr(self,s,c = None):
+ return qApp.translate("NoDevicesForm_base",s,c)
diff --git a/ui/nodevicesform_base.ui b/ui/nodevicesform_base.ui
new file mode 100644
index 0000000..37b149c
--- /dev/null
+++ b/ui/nodevicesform_base.ui
@@ -0,0 +1,163 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>NoDevicesForm_base</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>NoDevicesForm_base</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>525</width>
+ <height>440</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>HP Device Manager - No Installed HP Devices Found</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>Icon</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="frameShape">
+ <enum>NoFrame</enum>
+ </property>
+ <property name="scaledContents">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <spacer row="1" column="0">
+ <property name="name">
+ <cstring>spacer3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>280</height>
+ </size>
+ </property>
+ </spacer>
+ <spacer row="2" column="2">
+ <property name="name">
+ <cstring>spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>16</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLabel" row="0" column="1" rowspan="2" colspan="4">
+ <property name="name">
+ <cstring>textLabel7</cstring>
+ </property>
+ <property name="text">
+ <string>&lt;b&gt;&lt;font size="+2"&gt;No Installed HP Devices Found.&lt;/font&gt;&lt;/b&gt;&lt;p&gt;To install a device, use one of the following methods:&lt;p&gt;
+1.Run &lt;b&gt;hp-setup&lt;/b&gt; (in a shell/terminal or click &lt;tt&gt;Setup Device...&lt;/tt&gt; below).&lt;p&gt;
+2. &lt;b&gt;CUPS web interface&lt;/b&gt; (open a browser to: &lt;u&gt;http://localhost:631&lt;/u&gt; or press the button below),&lt;p&gt;
+3. The &lt;b&gt;printer installation utility&lt;/b&gt; that came with your operating system (YaST, PrinterDrake, etc).
+&lt;p&gt;&lt;p&gt;After setting up a printer, you may have to press &lt;tt&gt;F6&lt;/tt&gt; or chose &lt;tt&gt;Device | Refresh All&lt;/tt&gt; for the printer to appear in the HP Device Manager.&lt;p&gt;
+&lt;i&gt;&lt;b&gt;Note: Only devices installed with the &lt;tt&gt;hp:&lt;/tt&gt; or &lt;tt&gt;hpfax:&lt;/tt&gt; CUPS backend will appear in the HP Device Manager.&lt;/b&gt;&lt;/i&gt;&lt;p&gt;</string>
+ </property>
+ <property name="alignment">
+ <set>WordBreak|AlignVCenter</set>
+ </property>
+ </widget>
+ <spacer row="3" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>spacer43</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>400</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton" row="3" column="2">
+ <property name="name">
+ <cstring>setupPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>Setup Device...</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="3" column="3">
+ <property name="name">
+ <cstring>CUPSButton</cstring>
+ </property>
+ <property name="text">
+ <string>CUPS Web Interface</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="3" column="4">
+ <property name="name">
+ <cstring>ExitButton</cstring>
+ </property>
+ <property name="text">
+ <string>Close</string>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>CUPSButton</sender>
+ <signal>clicked()</signal>
+ <receiver>NoDevicesForm_base</receiver>
+ <slot>CUPSButton_clicked()</slot>
+ </connection>
+ <connection>
+ <sender>ExitButton</sender>
+ <signal>clicked()</signal>
+ <receiver>NoDevicesForm_base</receiver>
+ <slot>ExitButton_clicked()</slot>
+ </connection>
+ <connection>
+ <sender>setupPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>NoDevicesForm_base</receiver>
+ <slot>setupPushButton_clicked()</slot>
+ </connection>
+</connections>
+<slots>
+ <slot>CUPSButton_clicked()</slot>
+ <slot>ExitButton_clicked()</slot>
+ <slot>setupPushButton_clicked()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/ui/paperedgealignform.py b/ui/paperedgealignform.py
new file mode 100644
index 0000000..766fc3b
--- /dev/null
+++ b/ui/paperedgealignform.py
@@ -0,0 +1,42 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2001-2008 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+# Std Lib
+from base.g import *
+
+# Local
+from ui_utils import load_pixmap
+
+# Qt
+from qt import *
+from paperedgealignform_base import PaperEdgeAlignForm_base
+
+
+
+class PaperEdgeAlignForm(PaperEdgeAlignForm_base):
+ def __init__(self,parent = None,name = None,modal = 0,fl = 0):
+ PaperEdgeAlignForm_base.__init__(self,parent,name,modal,fl)
+ self.Icon.setPixmap(load_pixmap("zca.png", 'other'))
+ self.value = 1
+
+
+ def buttonGroup_clicked(self,a0):
+ self.value = a0 + 1
diff --git a/ui/paperedgealignform_base.py b/ui/paperedgealignform_base.py
new file mode 100644
index 0000000..0fb4915
--- /dev/null
+++ b/ui/paperedgealignform_base.py
@@ -0,0 +1,143 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file '/home/dwelch/linux-imaging-and-printing/src/ui/paperedgealignform_base.ui'
+#
+# Created: Wed Jul 13 09:36:14 2005
+# by: The PyQt User Interface Compiler (pyuic) 3.14.1
+#
+# WARNING! All changes made in this file will be lost!
+
+
+import sys
+from qt import *
+
+
+class PaperEdgeAlignForm_base(QDialog):
+ def __init__(self,parent = None,name = None,modal = 0,fl = 0):
+ QDialog.__init__(self,parent,name,modal,fl)
+
+ if not name:
+ self.setName("PaperEdgeAlignForm_base")
+
+
+ PaperEdgeAlignForm_baseLayout = QGridLayout(self,1,1,11,6,"PaperEdgeAlignForm_baseLayout")
+ spacer37 = QSpacerItem(80,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ PaperEdgeAlignForm_baseLayout.addItem(spacer37,1,1)
+
+ self.ContinueButton = QPushButton(self,"ContinueButton")
+
+ PaperEdgeAlignForm_baseLayout.addWidget(self.ContinueButton,1,3)
+
+ self.CancelButton = QPushButton(self,"CancelButton")
+
+ PaperEdgeAlignForm_baseLayout.addWidget(self.CancelButton,1,2)
+
+ self.buttonGroup = QButtonGroup(self,"buttonGroup")
+ self.buttonGroup.setSizePolicy(QSizePolicy(QSizePolicy.Minimum,QSizePolicy.Preferred,0,0,self.buttonGroup.sizePolicy().hasHeightForWidth()))
+ self.buttonGroup.setColumnLayout(0,Qt.Vertical)
+ self.buttonGroup.layout().setSpacing(6)
+ self.buttonGroup.layout().setMargin(11)
+ buttonGroupLayout = QGridLayout(self.buttonGroup.layout())
+ buttonGroupLayout.setAlignment(Qt.AlignTop)
+
+ layout24 = QHBoxLayout(None,0,6,"layout24")
+
+ self.radioButton1 = QRadioButton(self.buttonGroup,"radioButton1")
+ self.radioButton1.setChecked(1)
+ layout24.addWidget(self.radioButton1)
+
+ self.radioButton2 = QRadioButton(self.buttonGroup,"radioButton2")
+ layout24.addWidget(self.radioButton2)
+
+ self.radioButton3 = QRadioButton(self.buttonGroup,"radioButton3")
+ layout24.addWidget(self.radioButton3)
+
+ self.radioButton4 = QRadioButton(self.buttonGroup,"radioButton4")
+ layout24.addWidget(self.radioButton4)
+
+ self.radioButton5 = QRadioButton(self.buttonGroup,"radioButton5")
+ layout24.addWidget(self.radioButton5)
+
+ self.radioButton6 = QRadioButton(self.buttonGroup,"radioButton6")
+ layout24.addWidget(self.radioButton6)
+
+ self.radioButton7 = QRadioButton(self.buttonGroup,"radioButton7")
+ layout24.addWidget(self.radioButton7)
+
+ self.radioButton8 = QRadioButton(self.buttonGroup,"radioButton8")
+ layout24.addWidget(self.radioButton8)
+
+ self.radioButton9 = QRadioButton(self.buttonGroup,"radioButton9")
+ layout24.addWidget(self.radioButton9)
+
+ self.radioButton10 = QRadioButton(self.buttonGroup,"radioButton10")
+ layout24.addWidget(self.radioButton10)
+
+ self.radioButton11 = QRadioButton(self.buttonGroup,"radioButton11")
+ layout24.addWidget(self.radioButton11)
+
+ self.radioButton12 = QRadioButton(self.buttonGroup,"radioButton12")
+ layout24.addWidget(self.radioButton12)
+
+ self.radioButton13 = QRadioButton(self.buttonGroup,"radioButton13")
+ layout24.addWidget(self.radioButton13)
+
+ buttonGroupLayout.addMultiCellLayout(layout24,1,1,0,1)
+
+ self.Icon = QLabel(self.buttonGroup,"Icon")
+ self.Icon.setSizePolicy(QSizePolicy(QSizePolicy.Fixed,QSizePolicy.Fixed,0,0,self.Icon.sizePolicy().hasHeightForWidth()))
+ self.Icon.setScaledContents(1)
+
+ buttonGroupLayout.addWidget(self.Icon,0,0)
+
+ self.textLabel4_2 = QLabel(self.buttonGroup,"textLabel4_2")
+ self.textLabel4_2.setAlignment(QLabel.WordBreak | QLabel.AlignVCenter)
+
+ buttonGroupLayout.addWidget(self.textLabel4_2,0,1)
+
+ PaperEdgeAlignForm_baseLayout.addMultiCellWidget(self.buttonGroup,0,0,0,3)
+
+ self.languageChange()
+
+ self.resize(QSize(618,233).expandedTo(self.minimumSizeHint()))
+ self.clearWState(Qt.WState_Polished)
+
+ self.connect(self.CancelButton,SIGNAL("clicked()"),self.reject)
+ self.connect(self.ContinueButton,SIGNAL("clicked()"),self.accept)
+ self.connect(self.buttonGroup,SIGNAL("clicked(int)"),self.buttonGroup_clicked)
+
+
+ def languageChange(self):
+ self.setCaption(self.__tr("HP Device Manager - Paper Edge Alignment"))
+ self.ContinueButton.setText(self.__tr("Next >"))
+ self.CancelButton.setText(self.__tr("Cancel"))
+ self.buttonGroup.setTitle(self.__tr("Paper Edge"))
+ self.radioButton1.setText(self.__tr("1"))
+ self.radioButton2.setText(self.__tr("2"))
+ self.radioButton3.setText(self.__tr("3"))
+ self.radioButton4.setText(self.__tr("4"))
+ self.radioButton5.setText(self.__tr("5"))
+ self.radioButton6.setText(self.__tr("6"))
+ self.radioButton7.setText(self.__tr("7"))
+ self.radioButton8.setText(self.__tr("8"))
+ self.radioButton9.setText(self.__tr("9"))
+ self.radioButton10.setText(self.__tr("10"))
+ self.radioButton11.setText(self.__tr("11"))
+ self.radioButton12.setText(self.__tr("12"))
+ self.radioButton13.setText(self.__tr("13"))
+ self.textLabel4_2.setText(self.__tr("Choose the <b>numbered arrow</b> that <b>best </b>marks the edge of the paper."))
+
+
+ def buttonGroup_clicked(self,a0):
+ print "PaperEdgeAlignForm_base.buttonGroup_clicked(int): Not implemented yet"
+
+ def __tr(self,s,c = None):
+ return qApp.translate("PaperEdgeAlignForm_base",s,c)
+
+if __name__ == "__main__":
+ a = QApplication(sys.argv)
+ QObject.connect(a,SIGNAL("lastWindowClosed()"),a,SLOT("quit()"))
+ w = PaperEdgeAlignForm_base()
+ a.setMainWidget(w)
+ w.show()
+ a.exec_loop()
diff --git a/ui/paperedgealignform_base.ui b/ui/paperedgealignform_base.ui
new file mode 100644
index 0000000..5a6320f
--- /dev/null
+++ b/ui/paperedgealignform_base.ui
@@ -0,0 +1,246 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>PaperEdgeAlignForm_base</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>PaperEdgeAlignForm_base</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>618</width>
+ <height>233</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>HP Device Manager - Paper Edge Alignment</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer row="1" column="1">
+ <property name="name">
+ <cstring>spacer37</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>80</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton" row="1" column="3">
+ <property name="name">
+ <cstring>ContinueButton</cstring>
+ </property>
+ <property name="text">
+ <string>Next &gt;</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="1" column="2">
+ <property name="name">
+ <cstring>CancelButton</cstring>
+ </property>
+ <property name="text">
+ <string>Cancel</string>
+ </property>
+ </widget>
+ <widget class="QButtonGroup" row="0" column="0" rowspan="1" colspan="4">
+ <property name="name">
+ <cstring>buttonGroup</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="title">
+ <string>Paper Edge</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget" row="1" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>layout24</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>radioButton1</cstring>
+ </property>
+ <property name="text">
+ <string>1</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>radioButton2</cstring>
+ </property>
+ <property name="text">
+ <string>2</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>radioButton3</cstring>
+ </property>
+ <property name="text">
+ <string>3</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>radioButton4</cstring>
+ </property>
+ <property name="text">
+ <string>4</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>radioButton5</cstring>
+ </property>
+ <property name="text">
+ <string>5</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>radioButton6</cstring>
+ </property>
+ <property name="text">
+ <string>6</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>radioButton7</cstring>
+ </property>
+ <property name="text">
+ <string>7</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>radioButton8</cstring>
+ </property>
+ <property name="text">
+ <string>8</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>radioButton9</cstring>
+ </property>
+ <property name="text">
+ <string>9</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>radioButton10</cstring>
+ </property>
+ <property name="text">
+ <string>10</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>radioButton11</cstring>
+ </property>
+ <property name="text">
+ <string>11</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>radioButton12</cstring>
+ </property>
+ <property name="text">
+ <string>12</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>radioButton13</cstring>
+ </property>
+ <property name="text">
+ <string>13</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>Icon</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="scaledContents">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="1">
+ <property name="name">
+ <cstring>textLabel4_2</cstring>
+ </property>
+ <property name="text">
+ <string>Choose the &lt;b&gt;numbered arrow&lt;/b&gt; that &lt;b&gt;best &lt;/b&gt;marks the edge of the paper.</string>
+ </property>
+ <property name="alignment">
+ <set>WordBreak|AlignVCenter</set>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>CancelButton</sender>
+ <signal>clicked()</signal>
+ <receiver>PaperEdgeAlignForm_base</receiver>
+ <slot>reject()</slot>
+ </connection>
+ <connection>
+ <sender>ContinueButton</sender>
+ <signal>clicked()</signal>
+ <receiver>PaperEdgeAlignForm_base</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection>
+ <sender>buttonGroup</sender>
+ <signal>clicked(int)</signal>
+ <receiver>PaperEdgeAlignForm_base</receiver>
+ <slot>buttonGroup_clicked(int)</slot>
+ </connection>
+</connections>
+<slots>
+ <slot>buttonGroup_clicked(int)</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/ui/pluginform2.py b/ui/pluginform2.py
new file mode 100644
index 0000000..f53c8c9
--- /dev/null
+++ b/ui/pluginform2.py
@@ -0,0 +1,270 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2009 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+from base.g import *
+from base import device
+from installer import core_install
+from installer.core_install import PLUGIN_INSTALL_ERROR_NONE, \
+ PLUGIN_INSTALL_ERROR_PLUGIN_FILE_NOT_FOUND, \
+ PLUGIN_INSTALL_ERROR_DIGITAL_SIG_NOT_FOUND, \
+ PLUGIN_INSTALL_ERROR_DIGITAL_SIG_BAD, \
+ PLUGIN_INSTALL_ERROR_PLUGIN_FILE_CHECKSUM_ERROR, \
+ PLUGIN_INSTALL_ERROR_NO_NETWORK, \
+ PLUGIN_INSTALL_ERROR_DIRECTORY_ERROR, \
+ PLUGIN_INSTALL_ERROR_UNABLE_TO_RECV_KEYS
+
+from qt import *
+from pluginform2_base import PluginForm2_base
+
+class PluginForm2(PluginForm2_base):
+ def __init__(self,parent = None,name = None,modal = 0,fl = 0):
+ PluginForm2_base.__init__(self,parent,name,modal,fl)
+ self.path = None
+ self.version = prop.installed_version
+ self.bg = self.pathLineEdit.paletteBackgroundColor()
+
+ self.titleTextLabel.setFont(QFont('Helvetica', 16))
+
+ self.sourceGroup.emit(SIGNAL("clicked(int)"), (0,))
+
+ def sourceGroup_clicked(self, item):
+ self.pathLineEdit.setEnabled(item == 1)
+ self.browsePushButton.setEnabled(item == 1)
+
+ if item == 0: # download
+ QToolTip.remove(self.pathLineEdit)
+ self.actionPushButton.setText(self.__tr("Download and Install"))
+ self.actionPushButton.setEnabled(True)
+ self.path = None
+ else: # path
+ self.path = unicode(self.pathLineEdit.text())
+ self.pathLineEdit.emit(SIGNAL("textChanged(const QString&)"), (self.path,))
+
+ if self.path.startswith(u"http://"):
+ self.actionPushButton.setText(self.__tr("Download and Install"))
+ else:
+ self.actionPushButton.setText(self.__tr("Copy and Install"))
+
+
+ def browsePushButton_clicked(self):
+ dlg = QFileDialog(user_conf.workingDirectory(), self.__tr("HPLIP %s Plug-in (*.run)" %
+ self.version), None, None, True)
+
+ dlg.setCaption("openfile")
+ dlg.setMode(QFileDialog.ExistingFile)
+ dlg.show()
+
+ if dlg.exec_loop() == QDialog.Accepted:
+ results = dlg.selectedFile()
+ working_directory = unicode(dlg.dir().absPath())
+ log.debug("results: %s" % results)
+ user_conf.setWorkingDirectory(working_directory)
+
+ if results:
+ self.path = unicode(results)
+ self.pathLineEdit.setText(self.path)
+
+
+ def pathLineEdit_textChanged(self, path):
+ path, ok = unicode(path), True
+
+ if not path.startswith(u'http://'):
+ self.actionPushButton.setText(self.__tr("Copy and Install"))
+
+ if not path or not os.path.exists(path):
+ QToolTip.add(self.pathLineEdit, self.__tr('File not found.'))
+ ok = False
+
+ elif os.path.basename(path) != u'hplip-%s-plugin.run' % self.version:
+ log.error("Incorrect file: %s (should be: %s)" % (path, 'hplip-%s-plugin.run' % self.version))
+ QToolTip.add(self.pathLineEdit, self.__tr("Incorrect file. Must be '%1'")\
+ .arg('hplip-%s-plugin.run' % self.version))
+
+ ok = False
+
+ else:
+ self.actionPushButton.setText(self.__tr("Download and Install"))
+
+ self.actionPushButton.setEnabled(ok)
+
+ if not ok:
+ self.pathLineEdit.setPaletteBackgroundColor(QColor(0xff, 0x99, 0x99))
+
+ else:
+ QToolTip.remove(self.pathLineEdit)
+ self.pathLineEdit.setPaletteBackgroundColor(self.bg)
+ self.path = path
+
+
+ def actionPushButton_clicked(self):
+ core = core_install.CoreInstall()
+ core.set_plugin_version() #self.version)
+
+ if self.path is None: # download
+ # read plugin.conf (local or on sf.net) to get plugin_path (http://)
+ plugin_conf_url = core.get_plugin_conf_url()
+
+ if plugin_conf_url.startswith('file://'):
+ pass
+ else:
+ pass
+
+ log.info("Checking for network connection...")
+ ok = core.check_network_connection()
+
+ if not ok:
+ log.error("Network connection not detected.")
+ self.FailureUI(self.__tr("Network connection not detected."))
+ self.close()
+ return
+
+
+ log.info("Downloading configuration file from: %s" % plugin_conf_url)
+
+ self.path, size, checksum, timestamp, ok = core.get_plugin_info(plugin_conf_url,
+ self.plugin_download_callback)
+
+ log.debug("path=%s, size=%d, checksum=%s, timestamp=%f, ok=%s" %
+ (self.path, size, checksum, timestamp, ok))
+
+ if not self.path.startswith('http://') and not self.path.startswith('file://'):
+ self.path = 'file://' + self.path
+
+
+ else: # path
+ if not self.path.startswith('http://'):
+ self.path = 'file://' + self.path
+
+ size, checksum, timestamp = 0, '', 0
+
+
+ if self.path.startswith('file://'):
+ pass
+ else:
+
+ log.info("Checking for network connection...")
+ ok = core.check_network_connection()
+
+ if not ok:
+ log.error("Network connection not detected.")
+ self.FailureUI(self.__tr("Network connection not detected."))
+ self.close()
+ return
+
+ log.info("Downloading plug-in from: %s" % self.path)
+
+ status, ret = core.download_plugin(self.path, size, checksum, timestamp,
+ self.plugin_download_callback)
+
+ if status != PLUGIN_INSTALL_ERROR_NONE:
+
+ if status == PLUGIN_INSTALL_ERROR_PLUGIN_FILE_NOT_FOUND:
+ desc = self.__tr("<b>ERROR: Plug-in file not found (server returned 404 or similar error).</b><p>Error code: %1</p>").arg(str(ret))
+
+ elif status == PLUGIN_INSTALL_ERROR_DIGITAL_SIG_NOT_FOUND:
+ desc = self.__tr("<b>ERROR: Plug-in digital signature file not found (server returned 404 or similar error).</b><p>Error code: %1</p>").arg(str(ret))
+
+ elif status == PLUGIN_INSTALL_ERROR_DIGITAL_SIG_BAD:
+ desc = self.__tr("<b>ERROR: Plug-in file does not match its digital signature.</b><p>File may have been corrupted or altered.</p><p>Error code: %1</p>").arg(str(ret))
+
+ elif status == PLUGIN_INSTALL_ERROR_PLUGIN_FILE_CHECKSUM_ERROR:
+ desc = self.__tr("<b>ERROR: Plug-in file does not match its checksum. File may have been corrupted or altered.")
+
+ elif status == PLUGIN_INSTALL_ERROR_NO_NETWORK:
+ desc = self.__tr("<b>ERROR: Unable to connect to network to download the plug-in.</b><p>Please check your network connection and try again.</p>")
+
+ elif status == PLUGIN_INSTALL_ERROR_DIRECTORY_ERROR:
+ desc = self.__tr("<b>ERROR: Unable to create the plug-in directory.</b><p>Please check your permissions and try again.</p>")
+
+ elif status == PLUGIN_INSTALL_ERROR_UNABLE_TO_RECV_KEYS:
+ desc = self.__tr("<b>ERROR: Unable to download the public HPLIP keys from the keyserver.</b><p>Error code: %1</p>").arg(str(ret))
+
+ core.delete_plugin()
+ self.FailureUI(desc)
+ self.close()
+ return
+
+ local_plugin = ret
+
+ if not core.run_plugin(GUI_MODE, self.plugin_install_callback):
+ core.delete_plugin()
+ self.FailureUI(self.__tr("Plug-in install failed."))
+ self.close()
+ return
+
+ cups_devices = device.getSupportedCUPSDevices(['hp']) #, 'hpfax'])
+
+ for dev in cups_devices:
+ mq = device.queryModelByURI(dev)
+
+ if mq.get('fw-download', False):
+
+ # Download firmware if needed
+ log.info(log.bold("\nDownloading firmware to device %s..." % dev))
+ try:
+ d = device.Device(dev)
+ except Error:
+ log.error("Error opening device.")
+ continue
+
+ if d.downloadFirmware():
+ log.info("Firmware download successful.\n")
+
+ d.close()
+
+
+ core.delete_plugin()
+ self.SuccessUI("Plug-in install successful.")
+ self.close()
+
+
+ def FailureUI(self, error_text):
+ QMessageBox.critical(self,
+ self.caption(),
+ error_text,
+ QMessageBox.Ok,
+ QMessageBox.NoButton,
+ QMessageBox.NoButton)
+
+ def SuccessUI(self, text):
+ QMessageBox.information(self,
+ self.caption(),
+ text,
+ QMessageBox.Ok,
+ QMessageBox.NoButton,
+ QMessageBox.NoButton)
+
+
+
+ def plugin_download_callback(self, c, s, t):
+ pass
+
+
+ def plugin_install_callback(self, s):
+ print s
+
+
+ def cancelPushButton_clicked(self):
+ self.close()
+
+
+ def __tr(self,s,c = None):
+ return qApp.translate("PluginForm_base",s,c)
diff --git a/ui/pluginform2_base.py b/ui/pluginform2_base.py
new file mode 100644
index 0000000..140821a
--- /dev/null
+++ b/ui/pluginform2_base.py
@@ -0,0 +1,125 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'ui/pluginform2_base.ui'
+#
+# Created: Thu May 22 15:17:47 2008
+# by: The PyQt User Interface Compiler (pyuic) 3.17.3
+#
+# WARNING! All changes made in this file will be lost!
+
+
+from qt import *
+
+
+class PluginForm2_base(QDialog):
+ def __init__(self,parent = None,name = None,modal = 0,fl = 0):
+ QDialog.__init__(self,parent,name,modal,fl)
+
+ if not name:
+ self.setName("PluginForm2_base")
+
+
+ PluginForm2_baseLayout = QGridLayout(self,1,1,11,6,"PluginForm2_baseLayout")
+
+ self.titleTextLabel = QLabel(self,"titleTextLabel")
+
+ PluginForm2_baseLayout.addMultiCellWidget(self.titleTextLabel,0,0,0,2)
+
+ self.line1 = QFrame(self,"line1")
+ self.line1.setFrameShape(QFrame.HLine)
+ self.line1.setFrameShadow(QFrame.Sunken)
+ self.line1.setFrameShape(QFrame.HLine)
+
+ PluginForm2_baseLayout.addMultiCellWidget(self.line1,1,1,0,2)
+ spacer8 = QSpacerItem(390,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ PluginForm2_baseLayout.addItem(spacer8,6,0)
+
+ self.cancelPushButton = QPushButton(self,"cancelPushButton")
+
+ PluginForm2_baseLayout.addWidget(self.cancelPushButton,6,2)
+
+ self.actionPushButton = QPushButton(self,"actionPushButton")
+ self.actionPushButton.setDefault(1)
+
+ PluginForm2_baseLayout.addWidget(self.actionPushButton,6,1)
+
+ self.textLabel1 = QLabel(self,"textLabel1")
+ self.textLabel1.setAlignment(QLabel.WordBreak | QLabel.AlignVCenter)
+
+ PluginForm2_baseLayout.addMultiCellWidget(self.textLabel1,2,2,0,2)
+ spacer11 = QSpacerItem(20,50,QSizePolicy.Minimum,QSizePolicy.Expanding)
+ PluginForm2_baseLayout.addItem(spacer11,5,2)
+
+ self.sourceGroup = QButtonGroup(self,"sourceGroup")
+ self.sourceGroup.setColumnLayout(0,Qt.Vertical)
+ self.sourceGroup.layout().setSpacing(6)
+ self.sourceGroup.layout().setMargin(11)
+ sourceGroupLayout = QGridLayout(self.sourceGroup.layout())
+ sourceGroupLayout.setAlignment(Qt.AlignTop)
+
+ self.radioButton5 = QRadioButton(self.sourceGroup,"radioButton5")
+ self.sourceGroup.insert( self.radioButton5,1)
+
+ sourceGroupLayout.addWidget(self.radioButton5,1,0)
+
+ self.browsePushButton = QPushButton(self.sourceGroup,"browsePushButton")
+ self.browsePushButton.setEnabled(0)
+
+ sourceGroupLayout.addWidget(self.browsePushButton,2,1)
+
+ self.radioButton4 = QRadioButton(self.sourceGroup,"radioButton4")
+ self.radioButton4.setChecked(1)
+ self.sourceGroup.insert( self.radioButton4,0)
+
+ sourceGroupLayout.addWidget(self.radioButton4,0,0)
+
+ self.pathLineEdit = QLineEdit(self.sourceGroup,"pathLineEdit")
+ self.pathLineEdit.setEnabled(0)
+
+ sourceGroupLayout.addWidget(self.pathLineEdit,2,0)
+
+ PluginForm2_baseLayout.addMultiCellWidget(self.sourceGroup,4,4,0,2)
+ spacer13 = QSpacerItem(20,21,QSizePolicy.Minimum,QSizePolicy.Expanding)
+ PluginForm2_baseLayout.addItem(spacer13,3,0)
+
+ self.languageChange()
+
+ self.resize(QSize(585,375).expandedTo(self.minimumSizeHint()))
+ self.clearWState(Qt.WState_Polished)
+
+ self.connect(self.sourceGroup,SIGNAL("clicked(int)"),self.sourceGroup_clicked)
+ self.connect(self.browsePushButton,SIGNAL("clicked()"),self.browsePushButton_clicked)
+ self.connect(self.pathLineEdit,SIGNAL("textChanged(const QString&)"),self.pathLineEdit_textChanged)
+ self.connect(self.actionPushButton,SIGNAL("clicked()"),self.actionPushButton_clicked)
+ self.connect(self.cancelPushButton,SIGNAL("clicked()"),self.cancelPushButton_clicked)
+
+
+ def languageChange(self):
+ self.setCaption(self.__tr("HP Device Manager - Plugin Download and Install"))
+ self.titleTextLabel.setText(self.__tr("Driver Plug-in Install"))
+ self.cancelPushButton.setText(self.__tr("Cancel"))
+ self.actionPushButton.setText(self.__tr("Download and Install"))
+ self.textLabel1.setText(self.__tr("You may download the plug-in directly from an HP authorized server, or, if you already have a copy of the file, you can specify a path to the file."))
+ self.sourceGroup.setTitle(self.__tr("Plug-in Source"))
+ self.radioButton5.setText(self.__tr("Use an exisiting copy of the plug-in file (advanced):"))
+ self.browsePushButton.setText(self.__tr("Browse..."))
+ self.radioButton4.setText(self.__tr("Download the plug-in from an HP authorized server (recommended)"))
+
+
+ def sourceGroup_clicked(self,a0):
+ print "PluginForm2_base.sourceGroup_clicked(int): Not implemented yet"
+
+ def browsePushButton_clicked(self):
+ print "PluginForm2_base.browsePushButton_clicked(): Not implemented yet"
+
+ def pathLineEdit_textChanged(self,a0):
+ print "PluginForm2_base.pathLineEdit_textChanged(const QString&): Not implemented yet"
+
+ def actionPushButton_clicked(self):
+ print "PluginForm2_base.actionPushButton_clicked(): Not implemented yet"
+
+ def cancelPushButton_clicked(self):
+ print "PluginForm2_base.cancelPushButton_clicked(): Not implemented yet"
+
+ def __tr(self,s,c = None):
+ return qApp.translate("PluginForm2_base",s,c)
diff --git a/ui/pluginform2_base.ui b/ui/pluginform2_base.ui
new file mode 100644
index 0000000..78d2168
--- /dev/null
+++ b/ui/pluginform2_base.ui
@@ -0,0 +1,227 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>PluginForm2_base</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>PluginForm2_base</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>585</width>
+ <height>375</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>HP Device Manager - Plugin Download and Install</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="0" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>titleTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>Driver Plug-in Install</string>
+ </property>
+ </widget>
+ <widget class="Line" row="1" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>line1</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>HLine</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Sunken</enum>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ </widget>
+ <spacer row="6" column="0">
+ <property name="name">
+ <cstring>spacer8</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>390</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton" row="6" column="2">
+ <property name="name">
+ <cstring>cancelPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>Cancel</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="6" column="1">
+ <property name="name">
+ <cstring>actionPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>Download and Install</string>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>You may download the plug-in directly from an HP authorized server, or, if you already have a copy of the file, you can specify a path to the file.</string>
+ </property>
+ <property name="alignment">
+ <set>WordBreak|AlignVCenter</set>
+ </property>
+ </widget>
+ <spacer row="5" column="2">
+ <property name="name">
+ <cstring>spacer11</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>50</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QButtonGroup" row="4" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>sourceGroup</cstring>
+ </property>
+ <property name="title">
+ <string>Plug-in Source</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QRadioButton" row="1" column="0">
+ <property name="name">
+ <cstring>radioButton5</cstring>
+ </property>
+ <property name="text">
+ <string>Use an exisiting copy of the plug-in file (advanced):</string>
+ </property>
+ <property name="buttonGroupId">
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="2" column="1">
+ <property name="name">
+ <cstring>browsePushButton</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Browse...</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton" row="0" column="0">
+ <property name="name">
+ <cstring>radioButton4</cstring>
+ </property>
+ <property name="text">
+ <string>Download the plug-in from an HP authorized server (recommended)</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ <property name="buttonGroupId">
+ <number>0</number>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="2" column="0">
+ <property name="name">
+ <cstring>pathLineEdit</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <spacer row="3" column="0">
+ <property name="name">
+ <cstring>spacer13</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>21</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>sourceGroup</sender>
+ <signal>clicked(int)</signal>
+ <receiver>PluginForm2_base</receiver>
+ <slot>sourceGroup_clicked(int)</slot>
+ </connection>
+ <connection>
+ <sender>browsePushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>PluginForm2_base</receiver>
+ <slot>browsePushButton_clicked()</slot>
+ </connection>
+ <connection>
+ <sender>pathLineEdit</sender>
+ <signal>textChanged(const QString&amp;)</signal>
+ <receiver>PluginForm2_base</receiver>
+ <slot>pathLineEdit_textChanged(const QString&amp;)</slot>
+ </connection>
+ <connection>
+ <sender>actionPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>PluginForm2_base</receiver>
+ <slot>actionPushButton_clicked()</slot>
+ </connection>
+ <connection>
+ <sender>cancelPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>PluginForm2_base</receiver>
+ <slot>cancelPushButton_clicked()</slot>
+ </connection>
+</connections>
+<includes>
+ <include location="local" impldecl="in implementation">pluginform2_base.ui.h</include>
+</includes>
+<slots>
+ <slot>sourceGroup_clicked( int )</slot>
+ <slot>browsePushButton_clicked()</slot>
+ <slot>pathLineEdit_textChanged( const QString &amp; )</slot>
+ <slot>actionPushButton_clicked()</slot>
+ <slot>cancelPushButton_clicked()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/ui/pluginlicenseform.py b/ui/pluginlicenseform.py
new file mode 100644
index 0000000..2d98ae4
--- /dev/null
+++ b/ui/pluginlicenseform.py
@@ -0,0 +1,23 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'ui/pluginlicenseform_base.ui'
+#
+# Created: Thu May 15 11:08:01 2008
+# by: The PyQt User Interface Compiler (pyuic) 3.17.3
+#
+# WARNING! All changes made in this file will be lost!
+
+
+from qt import *
+from pluginlicenseform_base import PluginLicenseForm_base
+
+class PluginLicenseForm(PluginLicenseForm_base):
+ def __init__(self, license_txt, parent=None, name=None, modal=0, fl=0):
+ PluginLicenseForm_base.__init__(self,parent,name,modal,fl)
+
+ self.titleText.setFont(QFont("Helvetica", 16))
+ self.licenseTextEdit.setText(license_txt)
+
+
+ def __tr(self,s,c = None):
+ return qApp.translate("PluginLicenseForm",s,c)
diff --git a/ui/pluginlicenseform_base.py b/ui/pluginlicenseform_base.py
new file mode 100644
index 0000000..a02a791
--- /dev/null
+++ b/ui/pluginlicenseform_base.py
@@ -0,0 +1,75 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'ui/pluginlicenseform_base.ui'
+#
+# Created: Mon May 19 10:33:53 2008
+# by: The PyQt User Interface Compiler (pyuic) 3.17.3
+#
+# WARNING! All changes made in this file will be lost!
+
+
+from qt import *
+
+
+class PluginLicenseForm_base(QDialog):
+ def __init__(self,parent = None,name = None,modal = 0,fl = 0):
+ QDialog.__init__(self,parent,name,modal,fl)
+
+ if not name:
+ self.setName("PluginLicenseForm_base")
+
+
+ PluginLicenseForm_baseLayout = QGridLayout(self,1,1,11,6,"PluginLicenseForm_baseLayout")
+
+ self.acceptCheckBox = QCheckBox(self,"acceptCheckBox")
+
+ PluginLicenseForm_baseLayout.addWidget(self.acceptCheckBox,3,0)
+
+ self.installPushButton = QPushButton(self,"installPushButton")
+ self.installPushButton.setEnabled(0)
+
+ PluginLicenseForm_baseLayout.addWidget(self.installPushButton,3,3)
+
+ self.cancelPushButton = QPushButton(self,"cancelPushButton")
+
+ PluginLicenseForm_baseLayout.addWidget(self.cancelPushButton,3,2)
+ spacer3 = QSpacerItem(81,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ PluginLicenseForm_baseLayout.addItem(spacer3,3,1)
+
+ self.licenseTextEdit = QTextEdit(self,"licenseTextEdit")
+ self.licenseTextEdit.setReadOnly(1)
+
+ PluginLicenseForm_baseLayout.addMultiCellWidget(self.licenseTextEdit,2,2,0,3)
+
+ self.textLabel1 = QLabel(self,"textLabel1")
+
+ PluginLicenseForm_baseLayout.addMultiCellWidget(self.textLabel1,1,1,0,3)
+
+ self.titleText = QLabel(self,"titleText")
+ titleText_font = QFont(self.titleText.font())
+ titleText_font.setPointSize(16)
+ self.titleText.setFont(titleText_font)
+
+ PluginLicenseForm_baseLayout.addWidget(self.titleText,0,0)
+
+ self.languageChange()
+
+ self.resize(QSize(609,480).expandedTo(self.minimumSizeHint()))
+ self.clearWState(Qt.WState_Polished)
+
+ self.connect(self.acceptCheckBox,SIGNAL("toggled(bool)"),self.installPushButton.setEnabled)
+ self.connect(self.cancelPushButton,SIGNAL("clicked()"),self.reject)
+ self.connect(self.installPushButton,SIGNAL("clicked()"),self.accept)
+
+
+ def languageChange(self):
+ self.setCaption(self.__tr("HP Device Manager - Plugin Installer License"))
+ self.acceptCheckBox.setText(self.__tr("I accept the terms of the license"))
+ self.installPushButton.setText(self.__tr("Install Plugin"))
+ self.cancelPushButton.setText(self.__tr("Cancel"))
+ self.textLabel1.setText(self.__tr("Please read the plugin license agreement. Click \"I accept\" to accept the terms of the license."))
+ self.titleText.setText(self.__tr("Plugin License Agreement"))
+
+
+ def __tr(self,s,c = None):
+ return qApp.translate("PluginLicenseForm_base",s,c)
diff --git a/ui/pluginlicenseform_base.ui b/ui/pluginlicenseform_base.ui
new file mode 100644
index 0000000..571b73e
--- /dev/null
+++ b/ui/pluginlicenseform_base.ui
@@ -0,0 +1,118 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>PluginLicenseForm_base</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>PluginLicenseForm_base</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>609</width>
+ <height>480</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>HP Device Manager - Plugin Installer License</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox" row="3" column="0">
+ <property name="name">
+ <cstring>acceptCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>I accept the terms of the license</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="3" column="3">
+ <property name="name">
+ <cstring>installPushButton</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Install Plugin</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="3" column="2">
+ <property name="name">
+ <cstring>cancelPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>Cancel</string>
+ </property>
+ </widget>
+ <spacer row="3" column="1">
+ <property name="name">
+ <cstring>spacer3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>81</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QTextEdit" row="2" column="0" rowspan="1" colspan="4">
+ <property name="name">
+ <cstring>licenseTextEdit</cstring>
+ </property>
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0" rowspan="1" colspan="4">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>Please read the plugin license agreement. Click "I accept" to accept the terms of the license.</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>titleText</cstring>
+ </property>
+ <property name="font">
+ <font>
+ <pointsize>16</pointsize>
+ </font>
+ </property>
+ <property name="text">
+ <string>Plugin License Agreement</string>
+ </property>
+ </widget>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>acceptCheckBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>installPushButton</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>cancelPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>PluginLicenseForm_base</receiver>
+ <slot>reject()</slot>
+ </connection>
+ <connection>
+ <sender>installPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>PluginLicenseForm_base</receiver>
+ <slot>accept()</slot>
+ </connection>
+</connections>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/ui/printerform.py b/ui/printerform.py
new file mode 100644
index 0000000..d1d20aa
--- /dev/null
+++ b/ui/printerform.py
@@ -0,0 +1,165 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2001-2009 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Authors: Don Welch
+
+# Std Lib
+
+# Local
+from base.g import *
+from base.codes import *
+from base import utils, device
+from prnt import cups
+from ui_utils import load_pixmap
+
+# Qt
+from qt import *
+from scrollprint import ScrollPrintView
+
+
+
+class PrinterForm(QMainWindow):
+ def __init__(self, printer_name=None, args=None,
+ parent=None,name=None,modal=0,fl=0):
+
+ QMainWindow.__init__(self,parent,name,fl)
+
+ self.printer_name = printer_name
+ self.file_list = []
+ self.args = args
+ self.init_failed = False
+
+ self.statusBar()
+
+ self.setIcon(load_pixmap('hp_logo', '128x128'))
+
+ if not name:
+ self.setName("PrinterForm")
+
+ self.setCentralWidget(QWidget(self,"qt_central_widget"))
+ self.FormLayout = QGridLayout(self.centralWidget(),1,1,11,6,"FormLayout")
+ self.resize(QSize(600,480).expandedTo(self.minimumSizeHint()))
+ self.clearWState(Qt.WState_Polished)
+ self.languageChange()
+
+ self.cups_printers = device.getSupportedCUPSPrinters()
+ log.debug(self.cups_printers)
+
+ if not self.printer_name: # no -p provided
+ t = device.probeDevices(['cups'])
+ probed_devices = []
+
+ for d in t:
+ if d.startswith('hp:'):
+ probed_devices.append(d)
+
+ log.debug(probed_devices)
+
+ max_deviceid_size, x, devices = 0, 0, {}
+
+ for d in probed_devices:
+ printers = []
+ for p in self.cups_printers:
+ if p.device_uri == d:
+ printers.append(p.name)
+ devices[x] = (d, printers)
+ x += 1
+ max_deviceid_size = max(len(d), max_deviceid_size)
+
+ if x == 0:
+ from nodevicesform import NoDevicesForm
+ self.FailureUI(self.__tr("<p><b>No devices found.</b><p>Please make sure your device is properly installed and try again."))
+ self.init_failed = True
+
+ elif x == 1:
+ log.info(log.bold("Using device: %s" % devices[0][0]))
+ self.device_uri = devices[0][0]
+
+ else:
+ from chooseprinterdlg import ChoosePrinterDlg
+ dlg = ChoosePrinterDlg(self.cups_printers)
+ if dlg.exec_loop() == QDialog.Accepted:
+ self.printer_name = dlg.printer_name
+ self.device_uri = dlg.device_uri
+ else:
+ self.init_failed = True
+
+ else: # -p provided
+ for p in self.cups_printers:
+ if p.name == self.printer_name:
+ self.device_uri = p.device_uri
+ break
+ else:
+ self.FailureUI("<b>Invalid printer name.</b><p>Please check the parameters to hp-print and try again.")
+ self.init_failed = True
+
+
+ if not self.init_failed:
+ self.PrintView = ScrollPrintView(None, self.centralWidget(), self, "PrintView")
+ self.FormLayout.addWidget(self.PrintView,0,0)
+
+ try:
+ self.cur_device = device.Device(device_uri=self.device_uri,
+ printer_name=self.printer_name)
+ except Error, e:
+ log.error("Invalid device URI or printer name.")
+ self.FailureUI("<b>Invalid device URI or printer name.</b><p>Please check the parameters to hp-print and try again.")
+ self.init_failed = True
+
+ else:
+ self.device_uri = self.cur_device.device_uri
+ user_conf.set('last_used', 'device_uri', self.device_uri)
+
+ log.debug(self.device_uri)
+
+ self.statusBar().message(self.device_uri)
+
+ QTimer.singleShot(0, self.InitialUpdate)
+
+
+ def InitialUpdate(self):
+ if self.init_failed:
+ self.close()
+ return
+
+ self.PrintView.onDeviceChange(self.cur_device)
+
+ if self.args is not None:
+ for f in self.args:
+ self.PrintView.addFile(f)
+
+ if self.printer_name is not None:
+ self.PrintView.onPrinterChange(self.printer_name)
+
+
+ def FailureUI(self, error_text):
+ log.error(unicode(error_text).replace("<b>", "").replace("</b>", "").replace("<p>", " "))
+ QMessageBox.critical(self,
+ self.caption(),
+ error_text,
+ QMessageBox.Ok,
+ QMessageBox.NoButton,
+ QMessageBox.NoButton)
+
+
+ def languageChange(self):
+ self.setCaption(self.__tr("HP Device Manager - Print"))
+
+
+ def __tr(self,s,c = None):
+ return qApp.translate("PrinterForm",s,c)
diff --git a/ui/scrollcopy.py b/ui/scrollcopy.py
new file mode 100644
index 0000000..a6afaf7
--- /dev/null
+++ b/ui/scrollcopy.py
@@ -0,0 +1,552 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2001-2007 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+# Local
+from base.g import *
+from base import utils, pml
+from copier import copier
+
+# Qt
+from qt import *
+from scrollview import ScrollView, PixmapLabelButton
+from waitform import WaitForm
+
+# Std Lib
+import os.path, os
+import Queue
+
+
+class ScrollCopyView(ScrollView):
+ def __init__(self, service, num_copies=None, contrast=None, quality=None,
+ reduction=None, fit_to_page=None, parent=None, form=None, name=None, fl=0):
+ ScrollView.__init__(self, service, parent, name, fl)
+
+ self.form = form
+
+ self.num_copies = num_copies
+ self.contrast = contrast
+ self.quality = quality
+ self.reduction = reduction
+ self.fit_to_page = fit_to_page
+
+ self.update_queue = Queue.Queue() # UI updates from copy thread
+ self.event_queue = Queue.Queue() # UI events to copy thread
+
+ def getDeviceSettings(self):
+ QApplication.setOverrideCursor(QApplication.waitCursor)
+ try:
+ # get sticky settings as defaults (if not spec'd on command line)
+ if self.num_copies is None:
+ result_code, self.num_copies = self.dev.getPML(pml.OID_COPIER_NUM_COPIES)
+
+ if self.contrast is None:
+ result_code, self.contrast = self.dev.getPML(pml.OID_COPIER_CONTRAST)
+
+ if self.reduction is None:
+ result_code, self.reduction = self.dev.getPML(pml.OID_COPIER_REDUCTION)
+
+ if self.quality is None:
+ result_code, self.quality = self.dev.getPML(pml.OID_COPIER_QUALITY)
+
+ if self.scan_src == SCAN_SRC_FLATBED and self.fit_to_page is None:
+ result_code, self.fit_to_page = self.dev.getPML(pml.OID_COPIER_FIT_TO_PAGE)
+
+ if result_code != pml.ERROR_OK:
+ self.fit_to_page = pml.COPIER_FIT_TO_PAGE_DISABLED
+ self.fitToPageCheckBox.setEnabled(False)
+
+ else:
+ self.fit_to_page = pml.COPIER_FIT_TO_PAGE_DISABLED
+
+ if self.scan_src != SCAN_SRC_FLATBED:
+ self.fitToPageCheckBox.setEnabled(False)
+
+ result_code, self.max_reduction = self.dev.getPML(pml.OID_COPIER_REDUCTION_MAXIMUM)
+ result_code, self.max_enlargement = self.dev.getPML(pml.OID_COPIER_ENLARGEMENT_MAXIMUM)
+
+ # contrast
+ a = self.contrast/25
+ self.contrastSpinBox.setValue(a)
+
+ if a >= 0:
+ self.contrastSpinBox.setPrefix("+")
+ else:
+ self.contrastSpinBox.setPrefix("")
+
+ self.contrastSlider.setValue(a)
+ self.contrastSlider.setTickmarks(QSlider.Below)
+ self.contrastSlider.setTickInterval(1)
+
+ self.contrastDefaultPushButton.setEnabled(a != 0)
+
+ # reduction/enlargement/fittopage
+
+ self.reductionSlider.setRange(self.max_reduction, self.max_enlargement)
+ self.reductionSlider.setTickmarks(QSlider.Below)
+ self.reductionSlider.setTickInterval(10)
+ self.reductionSlider.setValue(self.reduction)
+
+ self.reductionSpinBox.setMaxValue(self.max_enlargement)
+ self.reductionSpinBox.setMinValue(self.max_reduction)
+ self.reductionSpinBox.setValue(self.reduction)
+ self.reductionSpinBox.setSuffix("%")
+
+ if self.fit_to_page == pml.COPIER_FIT_TO_PAGE_ENABLED:
+ self.fitToPageCheckBox.setChecked(True)
+ self.reductionSpinBox.setEnabled(False)
+ self.reductionSlider.setEnabled(False)
+ self.reductionDefaultPushButton.setEnabled(True)
+ else:
+ self.fitToPageCheckBox.setChecked(False)
+ self.reductionSlider.setEnabled(True)
+ self.reductionSpinBox.setEnabled(True)
+ self.reductionDefaultPushButton.setEnabled(self.reduction != 100)
+
+ # num_copies
+ self.copiesSpinBox.setValue(self.num_copies)
+ self.copiesDefaultPushButton.setEnabled(self.num_copies != 1)
+
+ # quality
+ if self.quality == pml.COPIER_QUALITY_FAST:
+ self.qualityComboBox.setCurrentItem(0)
+ s = 'Fast'
+
+ elif self.quality == pml.COPIER_QUALITY_DRAFT:
+ self.qualityComboBox.setCurrentItem(1)
+ s = 'Draft'
+
+ elif self.quality == pml.COPIER_QUALITY_NORMAL:
+ self.qualityComboBox.setCurrentItem(2)
+ s = 'Normal'
+
+ elif self.quality == pml.COPIER_QUALITY_PRESENTATION:
+ self.qualityComboBox.setCurrentItem(3)
+ s = 'Presentation'
+
+ elif self.quality == pml.COPIER_QUALITY_BEST:
+ self.qualityComboBox.setCurrentItem(4)
+ s = 'Best'
+
+ log.debug("Default Quality: %d (%s)" % (self.quality, s))
+
+ self.qualityDefaultPushButton.setEnabled(self.quality != pml.COPIER_QUALITY_NORMAL)
+
+ log.debug("Default Num copies: %d" % self.num_copies)
+ log.debug("Default Contrast: %d" % self.contrast)
+ log.debug("Default Reduction: %d" % self.reduction)
+ log.debug("Maximum Reduction: %d" % self.max_reduction)
+ log.debug("Maximum Enlargement: %d" % self.max_enlargement)
+
+ if self.fit_to_page == pml.COPIER_FIT_TO_PAGE_ENABLED:
+ s = 'Enabled' # 2
+ else:
+ s = 'Disabled' # 1
+
+ log.debug("Default Fit to page: %s (%s)" % (self.fit_to_page, s))
+ log.debug("Scan src (models.dat: scan-src): %d" % self.scan_src)
+
+ finally:
+ self.dev.closePML()
+ QApplication.restoreOverrideCursor()
+
+
+ def fillControls(self):
+ ScrollView.fillControls(self)
+
+ self.addGroupHeading("copies", self.__tr("Number of Copies"))
+ self.addCopies()
+
+ self.addGroupHeading("reduction", self.__tr("Enlargement, Reduction and Fit to Page"))
+ self.addEnlargementReduction()
+
+ self.addGroupHeading("contrast", self.__tr("Copy Contrast"))
+ self.addContrast()
+
+ self.addGroupHeading("quality", self.__tr("Copy Quality"))
+ self.addQuality()
+
+ self.addGroupHeading("space1", "")
+
+ self.copyButton = self.addActionButton("bottom_nav", self.__tr("Make Copies(s)"),
+ self.copyButton_clicked, 'print.png', 'print.png',
+ self.__tr("Close"), self.funcButton_clicked)
+
+
+
+ def onUpdate(self, cur_device=None):
+ log.debug("ScrollPrintView.onUpdate()")
+
+ def onDeviceChange(self, cur_device=None):
+ ScrollView.onDeviceChange(self, cur_device)
+
+ self.dev = copier.PMLCopyDevice(device_uri=self.cur_device.device_uri,
+ printer_name=self.cur_printer)
+
+ self.scan_src = self.dev.mq.get('scan-src', SCAN_SRC_FLATBED)
+ self.copy_type = self.dev.mq.get('copy-type', COPY_TYPE_DEVICE)
+
+ if self.scan_src == SCAN_SRC_SCROLLFED:
+ self.fitToPageCheckBox.setEnabled(False)
+ self.fit_to_page = pml.COPIER_FIT_TO_PAGE_DISABLED
+
+ self.getDeviceSettings()
+
+
+ def addCopies(self):
+ widget = self.getWidget()
+
+ layout12 = QHBoxLayout(widget,5,10,"layout12")
+
+ self.textLabel5 = QLabel(widget,"textLabel5")
+ layout12.addWidget(self.textLabel5)
+ spacer20 = QSpacerItem(20,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ layout12.addItem(spacer20)
+
+ self.copiesSpinBox = QSpinBox(widget,"copiesSpinBox")
+ layout12.addWidget(self.copiesSpinBox)
+
+ self.copiesDefaultPushButton = QPushButton(widget,"copiesDefaultPushButton")
+ layout12.addWidget(self.copiesDefaultPushButton)
+
+ self.textLabel5.setText(self.__tr("Number of copies:"))
+ self.copiesDefaultPushButton.setText(self.__tr("Default"))
+
+ self.copiesSpinBox.setMaxValue(99)
+ self.copiesSpinBox.setMinValue(1)
+ self.copiesSpinBox.setValue(1)
+
+ self.copiesDefaultPushButton.setEnabled(False)
+
+ self.connect(self.copiesDefaultPushButton, SIGNAL("clicked()"), self.copiesDefaultPushButton_clicked)
+ self.connect(self.copiesSpinBox, SIGNAL("valueChanged(int)"), self.copiesSpinBox_valueChanged)
+
+ self.addWidget(widget, "copies")
+
+ def copiesDefaultPushButton_clicked(self):
+ self.copiesSpinBox.setValue(1)
+ self.copiesDefaultPushButton.setEnabled(False)
+
+ def copiesSpinBox_valueChanged(self, i):
+ self.copiesDefaultPushButton.setEnabled(i != 1)
+ self.num_copies = i
+
+ def addQuality(self):
+ widget = self.getWidget()
+ layout34 = QHBoxLayout(widget,5,10,"layout34")
+
+ self.textLabel5_4 = QLabel(widget,"textLabel5_4")
+ self.textLabel5_4.setText(self.__tr("Quality:"))
+ layout34.addWidget(self.textLabel5_4)
+
+ spacer20_4 = QSpacerItem(20,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ layout34.addItem(spacer20_4)
+
+ self.qualityComboBox = QComboBox(0,widget,"qualityComboBox")
+ layout34.addWidget(self.qualityComboBox)
+
+ self.qualityDefaultPushButton = QPushButton(widget,"qualityDefaultPushButton")
+ layout34.addWidget(self.qualityDefaultPushButton)
+
+ self.qualityComboBox.clear()
+ self.qualityComboBox.insertItem(self.__tr("Fast")) # 0
+ self.qualityComboBox.insertItem(self.__tr("Draft")) # 1
+ self.qualityComboBox.insertItem(self.__tr("Normal")) # 2
+ self.qualityComboBox.insertItem(self.__tr("Presentation")) # 3
+ self.qualityComboBox.insertItem(self.__tr("Best")) # 4
+ self.qualityComboBox.setCurrentItem(2) # Normal
+
+ self.qualityDefaultPushButton.setText(self.__tr("Default"))
+ self.qualityDefaultPushButton.setEnabled(False)
+
+ self.connect(self.qualityComboBox, SIGNAL("activated(int)"), self.qualityComboBox_activated)
+ self.connect(self.qualityDefaultPushButton, SIGNAL("clicked()"), self.qualityDefaultPushButton_clicked)
+
+ self.addWidget(widget, "quality")
+
+ def qualityDefaultPushButton_clicked(self):
+ self.qualityDefaultPushButton.setEnabled(False)
+ self.qualityComboBox.setCurrentItem(2) # Normal
+ self.quality = pml.COPIER_QUALITY_NORMAL
+
+ def qualityComboBox_activated(self, i):
+ self.qualityDefaultPushButton.setEnabled(i != 2) # Normal
+
+ if i == 0:
+ self.quality = pml.COPIER_QUALITY_FAST
+ elif i == 1:
+ self.quality = pml.COPIER_QUALITY_DRAFT
+ elif i == 2:
+ self.quality = pml.COPIER_QUALITY_NORMAL
+ elif i == 3:
+ self.quality = pml.COPIER_QUALITY_PRESENTATION
+ elif i == 4:
+ self.quality = pml.COPIER_QUALITY_BEST
+
+
+ def addEnlargementReduction(self):
+ widget = self.getWidget()
+ layout43 = QGridLayout(widget,1,1,5,10,"layout43")
+
+ self.reductionSlider = QSlider(widget,"reductionSlider")
+ self.reductionSlider.setOrientation(QSlider.Horizontal)
+
+ layout43.addWidget(self.reductionSlider,0,2)
+
+ self.reductionSpinBox = QSpinBox(widget, "reductionSpinBox")
+ self.reductionSpinBox.setMaxValue(100)
+ self.reductionSpinBox.setMinValue(0)
+ self.reductionSpinBox.setValue(100)
+ self.reductionSpinBox.setSuffix("%")
+ layout43.addWidget(self.reductionSpinBox,0,3)
+
+ spacer42 = QSpacerItem(20,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ layout43.addItem(spacer42,0,1)
+
+ self.fitToPageCheckBox = QCheckBox(widget,"fitToPageCheckBox")
+ layout43.addWidget(self.fitToPageCheckBox,1,2)
+
+ self.reductionDefaultPushButton = QPushButton(widget,"reductionDefaultPushButton")
+ layout43.addWidget(self.reductionDefaultPushButton,0,4)
+
+ self.textLabel1 = QLabel(widget,"textLabel1")
+ layout43.addWidget(self.textLabel1,0,0)
+
+ self.textLabel1.setText(self.__tr("Enlargement or reduction (percent):"))
+ self.fitToPageCheckBox.setText(self.__tr("Fit to Page"))
+ self.reductionDefaultPushButton.setText(self.__tr("Default"))
+
+ self.reductionSlider.setRange(25, 400)
+
+ self.connect(self.reductionSlider,SIGNAL("valueChanged(int)"),self.reductionSlider_valueChanged)
+ self.connect(self.fitToPageCheckBox,SIGNAL("clicked()"),self.fitToPageCheckBox_clicked)
+ self.connect(self.reductionDefaultPushButton, SIGNAL("clicked()"), self.reductionDefaultPushButton_clicked)
+ self.connect(self.reductionSpinBox, SIGNAL("valueChanged(int)"), self.reductionSpinBox_valueChanged)
+
+ self.addWidget(widget, "reduction")
+
+ def reductionSlider_valueChanged(self,a0):
+ self.reduction = a0
+ self.reductionSpinBox.setValue(a0)
+ self.reductionDefaultPushButton.setEnabled(a0 != 100)
+
+ def reductionSpinBox_valueChanged(self, a0):
+ self.reduction = a0
+ self.reductionSlider.setValue(a0)
+ self.reductionDefaultPushButton.setEnabled(a0 != 100)
+
+ def fitToPageCheckBox_clicked(self):
+ if self.fitToPageCheckBox.isChecked():
+ self.fit_to_page = pml.COPIER_FIT_TO_PAGE_ENABLED
+ self.reductionSpinBox.setEnabled(False)
+ self.reductionSlider.setEnabled(False)
+ self.reductionDefaultPushButton.setEnabled(True)
+ else:
+ self.fit_to_page = pml.COPIER_FIT_TO_PAGE_DISABLED
+ self.reductionSlider.setEnabled(True)
+ self.reductionSpinBox.setEnabled(True)
+ self.reductionDefaultPushButton.setEnabled(self.reductionSlider.value() != 100)
+
+ def reductionDefaultPushButton_clicked(self):
+ self.reduction = 100
+ self.reductionSlider.setValue(100)
+ self.reductionSlider.setEnabled(True)
+ self.reductionSpinBox.setValue(100)
+ self.reductionSpinBox.setEnabled(True)
+ self.fitToPageCheckBox.setChecked(False)
+ self.fit_to_page = False
+
+ def addContrast(self):
+ widget = self.getWidget()
+
+ layout41 = QGridLayout(widget,1,1,5,10,"layout41")
+
+ self.textLabel1_2 = QLabel(widget,"textLabel1_2")
+
+ layout41.addWidget(self.textLabel1_2,0,0)
+
+ self.contrastDefaultPushButton = QPushButton(widget,"contrastDefaultPushButton")
+
+ layout41.addWidget(self.contrastDefaultPushButton,0,4)
+ spacer41 = QSpacerItem(20,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ layout41.addItem(spacer41,0,1)
+
+ self.contrastSlider = QSlider(widget,"contrastSlider")
+ self.contrastSlider.setMinValue(-5)
+ self.contrastSlider.setMaxValue(5)
+ self.contrastSlider.setPageStep(1)
+ self.contrastSlider.setOrientation(QSlider.Horizontal)
+
+ layout41.addWidget(self.contrastSlider,0,2)
+
+ self.contrastSpinBox = QSpinBox(widget, "contrastSpinBox")
+ self.contrastSpinBox.setMinValue(-5)
+ self.contrastSpinBox.setMaxValue(5)
+
+ layout41.addWidget(self.contrastSpinBox,0,3)
+
+ self.textLabel1_2.setText(self.__tr("Contrast (-5 lighter to +5 darker):"))
+ self.contrastDefaultPushButton.setText(self.__tr("Default"))
+
+ self.connect(self.contrastSlider,SIGNAL("valueChanged(int)"),self.contrastSlider_valueChanged)
+ self.connect(self.contrastSpinBox, SIGNAL("valueChanged(int)"), self.contrastSpinBox_valueChanged)
+ self.connect(self.contrastDefaultPushButton, SIGNAL("clicked()"), self.contrastDefaultPushButton_clicked)
+
+ self.addWidget(widget, "contrast")
+
+
+ def contrastSlider_valueChanged(self, a0):
+ self.contrastSpinBox.setValue(a0)
+ self.contrast = a0 * 25
+ self.contrastDefaultPushButton.setEnabled(a0 != 0)
+
+ def contrastSpinBox_valueChanged(self, a0):
+ if a0 >= 0:
+ self.contrastSpinBox.setPrefix("+")
+ else:
+ self.contrastSpinBox.setPrefix("")
+
+ self.contrastSlider.setValue(a0)
+ self.contrast = a0 * 25
+ self.contrastDefaultPushButton.setEnabled(a0 != 0)
+
+ def contrastDefaultPushButton_clicked(self):
+ self.contrastSpinBox.setValue(0)
+ self.contrastSpinBox.setPrefix("+")
+ self.contrastSlider.setValue(0)
+ self.contrast = 0
+
+
+ def copy_canceled(self):
+ self.event_queue.put(copier.COPY_CANCELED)
+ self.dev.sendEvent(EVENT_COPY_JOB_CANCELED)
+
+ def copy_timer_timeout(self):
+ while self.update_queue.qsize():
+ try:
+ status = self.update_queue.get(0)
+ except Queue.Empty:
+ break
+
+ if status == copier.STATUS_IDLE:
+ self.copy_timer.stop()
+
+ #self.pb.hide()
+ #self.form.statusBar().removeWidget(self.pb)
+
+ elif status in (copier.STATUS_SETTING_UP, copier.STATUS_WARMING_UP):
+ #self.pb.setProgress(self.pb.progress()+1)
+ pass
+
+ elif status == copier.STATUS_ACTIVE:
+ #self.pb.setProgress(self.pb.progress()+1)
+ pass
+
+ elif status in (copier.STATUS_ERROR, copier.STATUS_DONE):
+ self.copy_timer.stop()
+ #self.pb.hide()
+ #self.form.statusBar().removeWidget(self.pb)
+
+ # Close the dialog box.
+ #
+ if self.waitdlg is not None:
+ self.waitdlg.hide()
+ self.waitdlg.close()
+ self.waitdlg = None
+
+ if status == copier.STATUS_ERROR:
+ self.form.FailureUI(self.__tr("<b>Copier error.</b><p>"))
+ self.dev.sendEvent(EVENT_COPY_JOB_FAIL)
+
+ elif status == copier.STATUS_DONE:
+ pass
+ self.dev.sendEvent(EVENT_END_COPY_JOB)
+
+ self.cur_device.close()
+ self.copyButton.setEnabled(True)
+
+ self.form.close()
+
+
+ def copyButton_clicked(self):
+ self.copyButton.setEnabled(False)
+ try:
+ try:
+ self.dev.open()
+ except Error:
+ self.form.FailureUI(self.__tr("<b>Cannot copy: Device is busy or not available.</b><p>Please check device and try again. [1]"))
+ return
+
+ self.dev.sendEvent(EVENT_START_COPY_JOB, self.cur_printer, 0, '')
+ #self.pb = QProgressBar()
+ #self.pb.setTotalSteps(2)
+ #self.form.statusBar().addWidget(self.pb)
+ #self.pb.show()
+
+ log.debug("Num copies: %d" % self.num_copies)
+ log.debug("Contrast: %d" % self.contrast)
+ log.debug("Reduction: %d" % self.reduction)
+
+ s = 'Normal'
+ if self.quality == pml.COPIER_QUALITY_FAST:
+ s = 'Fast'
+ elif self.quality == pml.COPIER_QUALITY_DRAFT:
+ s = 'Draft'
+ elif self.quality == pml.COPIER_QUALITY_NORMAL:
+ s = 'Normal'
+ elif self.quality == pml.COPIER_QUALITY_PRESENTATION:
+ s = 'Presentation'
+ elif self.quality == pml.COPIER_QUALITY_BEST:
+ s = 'Best'
+
+ log.debug("Quality: %d (%s)" % (self.quality, s))
+
+ if self.fit_to_page == pml.COPIER_FIT_TO_PAGE_ENABLED:
+ s = 'Enabled' # 2
+ else:
+ s = 'Disabled' # 1
+
+ log.debug("Fit to page: %s (%s)" % (self.fit_to_page, s))
+ log.debug("Scan src: %d" % self.scan_src)
+
+ # Open the dialog box.
+ #
+ self.waitdlg = WaitForm(0, self.__tr("Copying..."), self.copy_canceled, self, modal=1)
+ self.waitdlg.show()
+
+ self.copy_timer = QTimer(self, "CopyTimer")
+ self.connect(self.copy_timer, SIGNAL('timeout()'), self.copy_timer_timeout)
+ self.copy_timer.start(1000) # 1 sec UI updates
+
+ self.dev.copy(self.num_copies, self.contrast, self.reduction,
+ self.quality, self.fit_to_page, self.scan_src,
+ self.update_queue, self.event_queue)
+
+ finally:
+ #self.cur_device.close()
+ #self.copyButton.setEnabled(True)
+ pass
+
+ def funcButton_clicked(self):
+ self.dev.close()
+ self.form.close()
+
+ def __tr(self,s,c = None):
+ return qApp.translate("ScrollCopy",s,c)
diff --git a/ui/scrollfax.py b/ui/scrollfax.py
new file mode 100644
index 0000000..e5ad3f8
--- /dev/null
+++ b/ui/scrollfax.py
@@ -0,0 +1,1314 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2001-2009 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+# Local
+from base.g import *
+from base import utils, magic, pml
+from prnt import cups
+from ui_utils import load_pixmap
+
+# Qt
+from qt import *
+from scrollview import ScrollView, PixmapLabelButton
+from allowabletypesdlg import AllowableTypesDlg
+from waitform import WaitForm
+
+# Std Lib
+import os.path, os
+import struct, Queue, time
+
+
+fax_enabled = prop.fax_build
+
+if fax_enabled:
+ try:
+ from fax import fax
+ except ImportError:
+ # This can fail on Python < 2.3 due to the datetime module
+ # or if fax was diabled during the build
+ log.warn("Fax send disabled - Python 2.3+ required.")
+ fax_enabled = False
+
+
+coverpages_enabled = False
+if fax_enabled:
+ try:
+ import reportlab
+ ver = reportlab.Version
+ try:
+ ver_f = float(ver)
+ except ValueError:
+ ver_f = 0.0
+
+ if ver_f >= 2.0:
+ coverpages_enabled = True
+ else:
+ log.warn("Pre-2.0 version of Reportlab installed. Fax coverpages disabled.")
+
+ except ImportError:
+ log.warn("Reportlab not installed. Fax coverpages disabled.")
+
+
+if not coverpages_enabled:
+ log.warn("Please install version 2.0+ of Reportlab for coverpage support.")
+
+if fax_enabled and coverpages_enabled:
+ from fax import coverpages
+ from coverpageform import CoverpageForm
+
+
+# Used to store MIME types for files
+# added directly in interface.
+job_types = {} # { job_id : "mime_type", ...}
+
+class FileListViewItem(QListViewItem):
+ def __init__(self, parent, order, title, mime_type_desc, str_pages, path):
+ QListViewItem.__init__(self, parent, order, title, mime_type_desc, str_pages, path)
+ self.path = path
+
+
+class RecipientListViewItem(QListViewItem):
+ def __init__(self, parent, order, name, fax, notes):
+ QListViewItem.__init__(self, parent, order, name, fax, notes)
+ self.name = name
+ #self.entry = entry
+
+
+class PhoneNumValidator(QValidator):
+ def __init__(self, parent=None, name=None):
+ QValidator.__init__(self, parent, name)
+
+ def validate(self, input, pos):
+ input = unicode(input)
+ if not input:
+ return QValidator.Acceptable, pos
+ elif input[pos-1] not in u'0123456789-(+) *#':
+ return QValidator.Invalid, pos
+ elif len(input) > 50:
+ return QValidator.Invalid, pos
+ else:
+ return QValidator.Acceptable, pos
+
+
+
+class ScrollFaxView(ScrollView):
+ def __init__(self, service, parent = None, form=None, name = None,fl = 0):
+ ScrollView.__init__(self, service, parent, name, fl)
+
+ global fax_enabled
+ if service is None:
+ fax_enabled = False
+
+ self.form = form
+ self.file_list = []
+ self.pages_button_group = 0
+ self.recipient_list = []
+ self.username = prop.username
+ self.busy = False
+ self.allowable_mime_types = cups.getAllowableMIMETypes()
+ self.cover_page_func, cover_page_png = None, None
+ self.cover_page_message = ''
+ self.cover_page_re = ''
+ self.cover_page_name = ''
+ self.update_queue = Queue.Queue() # UI updates from send thread
+ self.event_queue = Queue.Queue() # UI events (cancel) to send thread
+ self.prev_selected_file_path = ''
+ self.prev_selected_recipient = ''
+ self.preserve_formatting = False
+ self.waitdlg = None
+ log.debug(self.allowable_mime_types)
+ self.last_job_id = 0
+ self.dev = None
+ self.lock_file = None
+
+
+ self.db = fax.FaxAddressBook()
+ self.last_db_modification = self.db.last_modification_time()
+
+ self.MIME_TYPES_DESC = \
+ {
+ "application/pdf" : (self.__tr("PDF Document"), '.pdf'),
+ "application/postscript" : (self.__tr("Postscript Document"), '.ps'),
+ "application/vnd.hp-HPGL" : (self.__tr("HP Graphics Language File"), '.hgl, .hpg, .plt, .prn'),
+ "application/x-cshell" : (self.__tr("C Shell Script"), '.csh, .sh'),
+ "application/x-csource" : (self.__tr("C Source Code"), '.c'),
+ "text/cpp": (self.__tr("C++ Source Code"), '.cpp, .cxx'),
+ "application/x-perl" : (self.__tr("Perl Script"), '.pl'),
+ "application/x-python" : (self.__tr("Python Program"), '.py'),
+ "application/x-shell" : (self.__tr("Shell Script"), '.sh'),
+ "application/x-sh" : (self.__tr("Shell Script"), '.sh'),
+ "text/plain" : (self.__tr("Plain Text"), '.txt, .log, etc'),
+ "text/html" : (self.__tr("HTML Dcoument"), '.htm, .html'),
+ "image/gif" : (self.__tr("GIF Image"), '.gif'),
+ "image/png" : (self.__tr("PNG Image"), '.png'),
+ "image/jpeg" : (self.__tr("JPEG Image"), '.jpg, .jpeg'),
+ "image/tiff" : (self.__tr("TIFF Image"), '.tif, .tiff'),
+ "image/x-bitmap" : (self.__tr("Bitmap (BMP) Image"), '.bmp'),
+ "image/x-bmp" : (self.__tr("Bitmap (BMP) Image"), '.bmp'),
+ "image/x-photocd" : (self.__tr("Photo CD Image"), '.pcd'),
+ "image/x-portable-anymap" : (self.__tr("Portable Image (PNM)"), '.pnm'),
+ "image/x-portable-bitmap" : (self.__tr("Portable B&W Image (PBM)"), '.pbm'),
+ "image/x-portable-graymap" : (self.__tr("Portable Grayscale Image (PGM)"), '.pgm'),
+ "image/x-portable-pixmap" : (self.__tr("Portable Color Image (PPM)"), '.ppm'),
+ "image/x-sgi-rgb" : (self.__tr("SGI RGB"), '.rgb'),
+ "image/x-xbitmap" : (self.__tr("X11 Bitmap (XBM)"), '.xbm'),
+ "image/x-xpixmap" : (self.__tr("X11 Pixmap (XPM)"), '.xpm'),
+ "image/x-sun-raster" : (self.__tr("Sun Raster Format"), '.ras'),
+ }
+
+
+ user_settings = utils.UserSettings()
+ self.cmd_fab = user_settings.cmd_fab
+ log.debug("FAB command: %s" % self.cmd_fab)
+
+ if fax_enabled:
+ self.check_timer = QTimer(self, "CheckTimer")
+ self.connect(self.check_timer, SIGNAL('timeout()'), self.PeriodicCheck)
+ self.check_timer.start(3000)
+
+
+ def fillControls(self):
+ ScrollView.fillControls(self)
+
+ if fax_enabled:
+ if self.addPrinterFaxList(): #faxes=True, printers=False):
+
+ self.addGroupHeading("files_to_fax", self.__tr("File(s) to Fax"))
+ self.addFileList()
+
+ if coverpages_enabled:
+ self.addGroupHeading("coverpage", self.__tr("Add/Edit Fax Coverpage"))
+ self.addCoverpage()
+
+ self.addGroupHeading("recipients", self.__tr("Recipient(s)"))
+
+ self.addRecipientList()
+
+ self.addGroupHeading("recipient_add_from_fab", self.__tr("Add Recipients from the Fax Address Book"))
+
+ self.addRecipientAddFromFAB()
+
+ self.addGroupHeading("recipient_quick_add", self.__tr("<i>Quick Add</i> an Individual Recipient"))
+
+ self.addRecipientQuickAdd()
+
+ self.addGroupHeading("space1", "")
+
+ self.faxButton = self.addActionButton("bottom_nav", self.__tr("Send Fax Now"),
+ self.faxButton_clicked, 'fax.png', 'fax.png',
+ self.__tr("Close"), self.funcButton_clicked)
+
+ self.faxButton.setEnabled(False)
+
+ self.updateRecipientCombos()
+
+ self.maximizeControl()
+
+ else:
+ QApplication.restoreOverrideCursor()
+ self.form.FailureUI("<b>Fax is disabled.</b><p>No CUPS fax queue found for this device.")
+ self.funcButton_clicked()
+
+ else:
+ QApplication.restoreOverrideCursor()
+ self.form.FailureUI("<b>Fax is disabled.</b><p>Python version 2.3 or greater required or fax was disabled during build.")
+ self.funcButton_clicked()
+
+
+
+ def onUpdate(self, cur_device=None):
+ log.debug("ScrollPrintView.onUpdate()")
+ self.updateFileList()
+ self.updateRecipientList()
+
+
+ def PeriodicCheck(self): # called by check_timer every 3 sec
+ #print self
+ if not self.busy:
+ log.debug("Checking for incoming faxes...")
+
+ result = list(self.service.CheckForWaitingFax(self.cur_device.device_uri,
+ prop.username, self.last_job_id))
+
+ fax_file = str(result[7])
+
+ if fax_file:
+ self.last_job_id = 0
+ log.debug("A new fax has arrived: %s" % fax_file)
+ job_id = int(result[4])
+ title = str(result[5])
+
+ if self.form.isMinimized():
+ self.form.showNormal()
+
+ self.check_timer.stop()
+ self.addFileFromJob(0, title, prop.username, job_id, fax_file)
+ self.check_timer.start(3000)
+ return
+
+ log.debug("Not found.")
+
+ # Check for updated FAB
+ last_db_modification = self.db.last_modification_time()
+
+ if last_db_modification > self.last_db_modification:
+ QApplication.setOverrideCursor(QApplication.waitCursor)
+ log.debug("FAB has been modified. Re-reading...")
+ self.last_db_modification = last_db_modification
+ self.updateRecipientCombos()
+ QApplication.restoreOverrideCursor()
+
+
+ def onPrinterChange(self, printer_name):
+ if printer_name != self.cur_printer:
+ self.unlock()
+ self.lock(printer_name)
+ #utils.unlock(self.lock_file)
+ #ok, self.lock_file = utils.lock_app('hp-sendfax-%s' % printer_name, True)
+
+ ScrollView.onPrinterChange(self, printer_name)
+
+ def unlock(self):
+ utils.unlock(self.lock_file)
+
+ def lock(self, printer_name=None):
+ if printer_name is None:
+ printer_name = self.cur_printer
+
+ ok, self.lock_file = utils.lock_app('hp-sendfax-%s' % printer_name, True)
+
+
+
+ # Event handler for adding files from a external print job (not during fax send thread)
+ def addFileFromJob(self, event, title, username, job_id, fax_file):
+ QApplication.setOverrideCursor(QApplication.waitCursor)
+ self.busy = True
+
+ try:
+ f = file(fax_file, 'r')
+ header = f.read(fax.FILE_HEADER_SIZE)
+
+ if len(header) != fax.FILE_HEADER_SIZE:
+ log.error("Invalid fax file! (truncated header or no data)")
+ sys.exit(1)
+
+ mg, version, total_pages, hort_dpi, vert_dpi, page_size, \
+ resolution, encoding, reserved1, reserved2 = \
+ struct.unpack(">8sBIHHBBBII", header[:fax.FILE_HEADER_SIZE])
+
+ log.debug("Magic=%s Ver=%d Pages=%d hDPI=%d vDPI=%d Size=%d Res=%d Enc=%d" %
+ (mg, version, total_pages, hort_dpi, vert_dpi, page_size, resolution, encoding))
+
+ if total_pages > 0:
+ mime_type = job_types.get(job_id, "application/hplip-fax")
+ mime_type_desc = self.MIME_TYPES_DESC.get(mime_type, ('Unknown', 'n/a'))[0]
+ log.debug("%s (%s)" % (mime_type, mime_type_desc))
+ self.file_list.append((fax_file, mime_type, mime_type_desc, title, total_pages))
+ self.prev_selected_file_path = fax_file
+ else:
+ self.form.FailureUI("<b>Render Failure:</b><p>Rendered document contains no data.")
+
+ self.updateFileList()
+
+ finally:
+ self.busy = False
+
+ if self.waitdlg is not None:
+ self.waitdlg.hide()
+ self.waitdlg.close()
+ self.waitdlg = None
+
+ QApplication.restoreOverrideCursor()
+
+
+ def add_fax_canceled(self):
+ pass
+
+ #
+ # FILE LIST
+ #
+
+ def addFileList(self):
+ widget = self.getWidget()
+
+ layout37 = QGridLayout(widget,1,1,5,10,"layout37")
+
+ self.addFilePushButton = PixmapLabelButton(widget, "list_add.png",
+ "list_add.png", name='addFilePushButton')
+
+ layout37.addWidget(self.addFilePushButton,2,0)
+
+ self.removeFilePushButton = PixmapLabelButton(widget,
+ "list_remove.png", "list_remove.png", name='removeFilePushButton')
+
+ layout37.addWidget(self.removeFilePushButton,2,1)
+
+ self.moveFileUpPushButton = PixmapLabelButton(widget, "up.png",
+ "up.png", name='moveFileUpPushButton')
+
+ layout37.addWidget(self.moveFileUpPushButton,2,2)
+
+ self.moveFileDownPushButton = PixmapLabelButton(widget, "down.png",
+ "down.png", name='moveFileDownPushButton')
+
+ layout37.addWidget(self.moveFileDownPushButton,2,3)
+
+ self.showTypesPushButton = PixmapLabelButton(widget, "mimetypes.png",
+ None, name='showTypesPushButton')
+
+ layout37.addWidget(self.showTypesPushButton,2,5)
+
+
+ self.fileListView = QListView(widget,"fileListView")
+ self.fileListView.addColumn(self.__tr("Order"))
+ self.fileListView.addColumn(self.__tr("Name"))
+ self.fileListView.addColumn(self.__tr("Type"))
+ self.fileListView.addColumn(self.__tr("Pages"))
+ self.fileListView.addColumn(self.__tr("Path"))
+ self.fileListView.setAllColumnsShowFocus(1)
+ self.fileListView.setShowSortIndicator(1)
+ self.fileListView.setColumnWidth(0, 100) # Order
+ self.fileListView.setColumnWidth(1, 150) # Name
+ self.fileListView.setColumnWidth(2, 100) # Type
+ self.fileListView.setColumnWidth(3, 100) # Pages
+ self.fileListView.setColumnWidth(4, 300) # Path
+ self.fileListView.setItemMargin(2)
+ self.fileListView.setSorting(-1)
+
+ layout37.addMultiCellWidget(self.fileListView,1,1,0,5)
+
+ spacer26 = QSpacerItem(20,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ layout37.addItem(spacer26,2,4)
+
+ self.addFilePushButton.setText(self.__tr("Add File..."))
+ self.showTypesPushButton.setText(self.__tr("Show Types..."))
+ self.removeFilePushButton.setText(self.__tr("Remove File"))
+ self.moveFileDownPushButton.setText(self.__tr("Move Down"))
+ self.moveFileUpPushButton.setText(self.__tr("Move Up"))
+
+ self.removeFilePushButton.setEnabled(False)
+ self.moveFileDownPushButton.setEnabled(False)
+ self.moveFileUpPushButton.setEnabled(False)
+ self.connect(self.addFilePushButton, SIGNAL("clicked()"), self.addFile_clicked)
+ self.connect(self.removeFilePushButton, SIGNAL("clicked()"), self.removeFile_clicked)
+ self.connect(self.showTypesPushButton, SIGNAL("clicked()"), self.showFileTypes_clicked)
+
+ self.connect(self.moveFileUpPushButton, SIGNAL("clicked()"), self.moveFileUp_clicked)
+ self.connect(self.moveFileDownPushButton, SIGNAL("clicked()"), self.moveFileDown_clicked)
+
+ self.connect(self.fileListView,SIGNAL("rightButtonClicked(QListViewItem*,const QPoint&, int)"),self.fileListView_rightButtonClicked)
+
+ self.connect(self.fileListView, SIGNAL("selectionChanged(QListViewItem*)"), self.fileListView_selectionChanged)
+
+ self.addWidget(widget, "file_list", maximize=True)
+
+ def fileListView_selectionChanged(self, i):
+ try:
+ self.prev_selected_file_path = i.path
+ except AttributeError:
+ pass
+ else:
+ flv = self.fileListView
+ selected_item = flv.selectedItem()
+ file_count = flv.childCount()
+ last_item = flv.firstChild()
+ while last_item.nextSibling():
+ last_item = last_item.nextSibling()
+
+ self.moveFileDownPushButton.setEnabled(file_count > 1 and selected_item is not last_item)
+ self.moveFileUpPushButton.setEnabled(file_count > 1 and selected_item is not flv.firstChild())
+
+
+ def moveFileUp_clicked(self):
+ try:
+ path = self.fileListView.selectedItem().path
+ except AttributeError:
+ return
+ else:
+ for i in range(1, len(self.file_list)):
+ if self.file_list[i][0] == path:
+ self.file_list[i-1],self.file_list[i] = self.file_list[i], self.file_list[i-1]
+
+ self.updateFileList()
+
+ def moveFileDown_clicked(self):
+ try:
+ path = self.fileListView.selectedItem().path
+ except AttributeError:
+ return
+ else:
+ for i in range(len(self.file_list) - 2, -1, -1):
+ if self.file_list[i][0] == path:
+ self.file_list[i], self.file_list[i+1] = self.file_list[i+1], self.file_list[i]
+
+ self.updateFileList()
+
+
+ def fileListView_rightButtonClicked(self, item, pos, col):
+ popup = QPopupMenu(self)
+
+ popup.insertItem(QIconSet(load_pixmap('list_add', '16x16')),
+ self.__tr("Add File..."), self.addFile_clicked)
+
+ if item is not None:
+ popup.insertItem(QIconSet(load_pixmap('list_remove', '16x16')),
+ self.__tr("Remove File"), self.removeFile_clicked)
+
+ if self.fileListView.childCount() > 1:
+ last_item = self.fileListView.firstChild()
+ while last_item is not None and last_item.nextSibling():
+ last_item = last_item.nextSibling()
+
+ if item is not self.fileListView.firstChild():
+ popup.insertItem(QIconSet(load_pixmap('up', '16x16')),
+ self.__tr("Move Up"), self.moveFileUp_clicked)
+
+ if item is not last_item:
+ popup.insertItem(QIconSet(load_pixmap('down', '16x16')),
+ self.__tr("Move Down"), self.moveFileDown_clicked)
+
+
+ popup.insertSeparator(-1)
+ popup.insertItem(QIconSet(load_pixmap('mimetypes', '16x16')),
+ self.__tr("Show File Types..."), self.showFileTypes_clicked)
+
+ popup.popup(pos)
+
+
+ def addFile(self, path, title, mime_type, mime_type_desc, pages):
+ self.file_list.append((path, mime_type, mime_type_desc, title, pages))
+ self.prev_selected_file_path = path
+
+ self.updateFileList()
+
+ def processFile(self, path, title=''): # Process an arbitrary file ("Add file...")
+ path = os.path.realpath(path)
+ if not title:
+ title = os.path.basename(path)
+
+ if os.path.exists(path) and os.access(path, os.R_OK):
+ mime_type = magic.mime_type(path)
+ mime_type_desc = mime_type
+
+ if mime_type == 'application/hplip-fax':
+ mime_type_desc = self.MIME_TYPES_DESC[mime_type][0]
+
+ fax_file_fd = file(path, 'r')
+ header = fax_file_fd.read(fax.FILE_HEADER_SIZE)
+
+ mg, version, pages, hort_dpi, vert_dpi, page_size, \
+ resolution, encoding, reserved1, reserved2 = self.decode_fax_header(header)
+
+ if mg != 'hplip_g3':
+ log.error("Invalid file header. Bad magic.")
+ self.form.WarningUI(self.__tr("<b>Invalid HPLIP Fax file.</b><p>Bad magic!"))
+ return
+
+ self.addFile(path, title, mime_type, mime_type_desc, pages)
+
+ else:
+ log.debug(repr(mime_type))
+ try:
+ mime_type_desc = self.MIME_TYPES_DESC[mime_type][0]
+ except KeyError:
+ self.form.WarningUI(self.__tr("<b>You are trying to add a file that cannot be directly faxed with this utility.</b><p>To print this file, use the print command in the application that created it."))
+ return
+ else:
+ log.debug("Adding file: title='%s' file=%s mime_type=%s mime_desc=%s)" % (title, path, mime_type, mime_type_desc))
+
+ all_pages = True
+ page_range = ''
+ page_set = 0
+ #nup = 1
+
+ cups.resetOptions()
+
+ self.cups_printers = cups.getPrinters()
+
+ printer_state = cups.IPP_PRINTER_STATE_STOPPED
+ for p in self.cups_printers:
+ if p.name == self.cur_printer:
+ printer_state = p.state
+
+ log.debug("Printer state = %d" % printer_state)
+
+ if printer_state == cups.IPP_PRINTER_STATE_IDLE:
+ log.debug("Printing: %s on %s" % (path, self.cur_printer))
+ sent_job_id = cups.printFile(self.cur_printer, path, os.path.basename(path))
+ self.last_job_id = sent_job_id
+ job_types[sent_job_id] = mime_type # save for later
+ log.debug("Job ID=%d" % sent_job_id)
+
+ QApplication.setOverrideCursor(QApplication.waitCursor)
+
+ self.waitdlg = WaitForm(0, self.__tr("Processing fax file..."), None, self, modal=1) # self.add_fax_canceled
+ self.waitdlg.show()
+
+ else:
+ self.form.FailureUI(self.__tr("<b>Printer '%1' is in a stopped or error state.</b><p>Check the printer queue in CUPS and try again.").arg(self.cur_printer))
+ cups.resetOptions()
+ return
+
+ cups.resetOptions()
+ QApplication.restoreOverrideCursor()
+
+ else:
+ self.form.FailureUI(self.__tr("<b>Unable to add file '%1' to file list (file not found or insufficient permissions).</b><p>Check the file name and try again.").arg(path))
+
+
+
+ def updateFileList(self):
+ self.fileListView.clear()
+ temp = self.file_list[:]
+ temp.reverse()
+ order = len(temp)
+ last_item = None
+ selected_item = None
+
+ for path, mime_type, mime_type_desc, title, pages in temp:
+ i = FileListViewItem(self.fileListView, str(order), title, mime_type_desc, str(pages), path)
+
+ if not self.prev_selected_file_path or self.prev_selected_file_path == path:
+ self.fileListView.setSelected(i, True)
+ selected_item = i
+ self.prev_selected_file_path = path
+
+ order -= 1
+
+ last_item = self.fileListView.firstChild()
+ while last_item is not None and last_item.nextSibling():
+ last_item = last_item.nextSibling()
+
+ file_count = self.fileListView.childCount()
+ self.moveFileDownPushButton.setEnabled(file_count > 1 and selected_item is not last_item)
+ self.moveFileUpPushButton.setEnabled(file_count > 1 and selected_item is not self.fileListView.firstChild())
+ self.checkSendFaxButton()
+ self.removeFilePushButton.setEnabled(file_count > 0)
+
+
+
+ def addFile_clicked(self):
+ dlg = QFileDialog(user_conf.workingDirectory(), QString.null, None, None, True)
+
+ dlg.setCaption("openfile")
+ dlg.setMode(QFileDialog.ExistingFile)
+ dlg.show()
+
+ if dlg.exec_loop() == QDialog.Accepted:
+ results = dlg.selectedFile()
+ working_directory = unicode(dlg.dir().absPath())
+ log.debug("results: %s" % results)
+ user_conf.setWorkingDirectory(working_directory)
+
+ if results:
+ path = unicode(results)
+ self.processFile(path)
+
+
+ def removeFile_clicked(self):
+ try:
+ path = self.fileListView.selectedItem().path
+ except AttributeError:
+ return
+ else:
+ temp = self.file_list[:]
+ index = 0
+ for p, t, d, x, g in temp:
+ if p == path:
+ del self.file_list[index]
+
+ if t == 'application/hplip-fax-coverpage':
+ self.addCoverpagePushButton.setEnabled(coverpages_enabled)
+ self.editCoverpagePushButton.setEnabled(False)
+
+ self.prev_selected_file_path = ''
+ self.updateFileList()
+ break
+
+ index += 1
+
+
+ def showFileTypes_clicked(self):
+ x = {}
+ for a in self.allowable_mime_types:
+ x[a] = self.MIME_TYPES_DESC.get(a, ('Unknown', 'n/a'))
+
+ log.debug(x)
+ dlg = AllowableTypesDlg(x, self)
+ dlg.exec_loop()
+
+
+ #
+ # COVERPAGE
+ #
+
+ def addCoverpage(self):
+ widget = self.getWidget()
+
+ layout14 = QGridLayout(widget,1,1,5,10,"layout14")
+
+ self.editCoverpagePushButton = PixmapLabelButton(widget,
+ "edit.png", "edit.png", name='')
+
+ layout14.addWidget(self.editCoverpagePushButton,0,1)
+
+ self.addCoverpagePushButton = PixmapLabelButton(widget,
+ "list_add.png", "list_add.png", name='')
+
+ layout14.addWidget(self.addCoverpagePushButton,0,2)
+ spacer12_2 = QSpacerItem(20,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ layout14.addItem(spacer12_2,0,0)
+
+ self.editCoverpagePushButton.setText(self.__tr("Edit..."))
+ self.editCoverpagePushButton.setEnabled(False)
+
+ self.addCoverpagePushButton.setText(self.__tr("Add..."))
+
+ self.connect(self.editCoverpagePushButton,SIGNAL("clicked()"),self.editCoverpagePushButton_clicked)
+ self.connect(self.addCoverpagePushButton,SIGNAL("clicked()"),self.addCoverpagePushButton_clicked)
+
+ self.addWidget(widget, "coverpage")
+
+ def editCoverpagePushButton_clicked(self):
+ self.showCoverPageDlg()
+
+ def addCoverpagePushButton_clicked(self):
+ if self.showCoverPageDlg():
+ self.file_list.insert(0, ('n/a', "application/hplip-fax-coverpage",
+ self.__tr("HP Fax Coverpage"), self.__tr("Cover Page"), 1))
+
+ self.updateFileList()
+ self.addCoverpagePushButton.setEnabled(False)
+ self.editCoverpagePushButton.setEnabled(True)
+
+ def showCoverPageDlg(self):
+ dlg = CoverpageForm(self.cover_page_name, self.preserve_formatting, parent=self)
+ dlg.messageTextEdit.setText(self.cover_page_message)
+ dlg.regardingTextEdit.setText(self.cover_page_re)
+
+ if dlg.exec_loop() == QDialog.Accepted:
+
+ self.cover_page_func, cover_page_png = dlg.data
+ self.cover_page_message = unicode(dlg.messageTextEdit.text())
+ self.cover_page_re = unicode(dlg.regardingTextEdit.text())
+ self.cover_page_name = dlg.coverpage_name
+ self.preserve_formatting = dlg.preserve_formatting
+ return True
+
+ return False
+
+
+
+ #
+ # RECIPIENT LIST
+ #
+
+ def addRecipientList(self):
+ widget = self.getWidget()
+
+ layout9 = QGridLayout(widget,1,1,5,10,"layout9")
+
+ self.moveDownPushButton = PixmapLabelButton(widget,
+ "down_user.png", "down_user.png", name='')
+
+ layout9.addWidget(self.moveDownPushButton,1,2)
+
+ self.recipientListView = QListView(widget,"recipientListView")
+ self.recipientListView.addColumn(self.__tr("Order"))
+ self.recipientListView.addColumn(self.__tr("Name"))
+ self.recipientListView.addColumn(self.__tr("Fax Number"))
+ self.recipientListView.addColumn(self.__tr("Notes"))
+
+ self.recipientListView.setAllColumnsShowFocus(1)
+ self.recipientListView.setShowSortIndicator(1)
+ self.recipientListView.setColumnWidth(0, 100) # Order
+ self.recipientListView.setColumnWidth(1, 150) # Name
+ self.recipientListView.setColumnWidth(2, 200) # Fax Number
+ self.recipientListView.setColumnWidth(3, 250) # Notes
+ self.recipientListView.setItemMargin(2)
+ self.recipientListView.setSorting(-1)
+
+ widget.setMaximumHeight(250)
+
+ layout9.addMultiCellWidget(self.recipientListView,0,0,0,4)
+
+ self.fabPushButton = PixmapLabelButton(widget,
+ "fab", None, name='')
+
+ layout9.addWidget(self.fabPushButton,1,4)
+
+ self.removeRecipientPushButton = PixmapLabelButton(widget,
+ "remove_user.png", "remove_user.png", name='')
+
+ self.removeRecipientPushButton.setEnabled(1)
+
+ layout9.addWidget(self.removeRecipientPushButton,1,0)
+ spacer10 = QSpacerItem(20,20,QSizePolicy.MinimumExpanding,QSizePolicy.Minimum)
+ layout9.addItem(spacer10,1,3)
+
+ self.moveUpPushButton = PixmapLabelButton(widget,
+ "up_user.png", "up_user.png", name='')
+
+ layout9.addWidget(self.moveUpPushButton,1,1)
+
+ self.moveDownPushButton.setEnabled(False)
+ self.moveUpPushButton.setEnabled(False)
+ self.removeRecipientPushButton.setEnabled(False)
+
+ self.moveDownPushButton.setText(self.__tr("Move Down"))
+ self.fabPushButton.setText(self.__tr("Fax Address Book..."))
+ self.removeRecipientPushButton.setText(self.__tr("Remove"))
+ self.moveUpPushButton.setText(self.__tr("Move Up"))
+
+
+ self.connect(self.recipientListView,SIGNAL("rightButtonClicked(QListViewItem*,const QPoint&,int)"),self.recipientListView_rightButtonClicked)
+
+ self.connect(self.removeRecipientPushButton,SIGNAL("clicked()"),self.removeRecipientPushButton_clicked)
+ self.connect(self.moveUpPushButton,SIGNAL("clicked()"),self.moveUpPushButton_clicked)
+ self.connect(self.moveDownPushButton,SIGNAL("clicked()"),self.moveDownPushButton_clicked)
+ self.connect(self.fabPushButton,SIGNAL("clicked()"),self.fabPushButton_clicked)
+
+ self.connect(self.recipientListView, SIGNAL("selectionChanged(QListViewItem*)"), self.recipientListView_selectionChanged)
+
+ self.addWidget(widget, "recipient_list", maximize=False)
+
+
+ def recipientListView_selectionChanged(self, i):
+ try:
+ self.prev_selected_recipient = i.name
+ except AttributeError:
+ pass
+ else:
+ rlv = self.recipientListView
+ selected_item = rlv.selectedItem()
+ recipient_count = rlv.childCount()
+ last_item = rlv.firstChild()
+ while last_item.nextSibling():
+ last_item = last_item.nextSibling()
+
+ self.moveDownPushButton.setEnabled(recipient_count > 1 and selected_item is not last_item)
+ self.moveUpPushButton.setEnabled(recipient_count > 1 and selected_item is not rlv.firstChild())
+
+
+
+ def updateRecipientList(self):
+ self.recipientListView.clear()
+ temp = self.recipient_list[:]
+ temp.reverse()
+ last_item = None
+ selected_item = None
+ order = len(temp)
+
+ for name in temp:
+ entry = self.db.get(name)
+ # TODO: If entry was in list prior to name change in hp-fab,
+ # this code will remove it instead of following the name change
+ # Ref: CDP-1675
+ if entry is not None:
+ i = RecipientListViewItem(self.recipientListView, str(order), name, entry['fax'], entry['notes'])
+
+ if not self.prev_selected_recipient or self.prev_selected_recipient == name:
+ self.recipientListView.setSelected(i, True)
+ selected_item = i
+ self.prev_selected_recipient = name
+
+ order -= 1
+
+ last_item = self.recipientListView.firstChild()
+ while last_item is not None and last_item.nextSibling():
+ last_item = last_item.nextSibling()
+
+ child_count = self.recipientListView.childCount()
+ self.removeRecipientPushButton.setEnabled(child_count > 0)
+ self.moveDownPushButton.setEnabled(child_count > 1 and selected_item is not last_item)
+ self.moveUpPushButton.setEnabled(child_count > 1 and selected_item is not self.recipientListView.firstChild())
+
+ self.checkSendFaxButton()
+
+
+
+ def recipientListView_rightButtonClicked(self, item, pos, col):
+ self.ind_map = {}
+ self.grp_map = {}
+ popup = QPopupMenu(self)
+ ind = QPopupMenu(popup)
+ grp = QPopupMenu(popup)
+
+ all_entries = self.db.get_all_records()
+ if all_entries:
+ popup.insertItem(QIconSet(load_pixmap('add_user', '16x16')),
+ self.__tr("Add Individual"), ind)
+
+ for e, v in all_entries.items():
+ if not e.startswith('__'):
+ self.ind_map[ind.insertItem(QIconSet(load_pixmap('add_user', '16x16')), e, None)] = e
+
+ all_groups = self.db.get_all_groups()
+ if all_groups:
+ popup.insertItem(QIconSet(load_pixmap('add_users', '16x16')),
+ self.__tr("Add Group"), grp)
+
+ for g in all_groups:
+ self.grp_map[grp.insertItem(QIconSet(load_pixmap('add_users', '16x16')),
+ g, None)] = g
+
+ if item is not None:
+ popup.insertSeparator(-1)
+
+ popup.insertItem(QIconSet(load_pixmap('remove_user', '16x16')),
+ self.__tr("Remove"), self.removeRecipientPushButton_clicked)
+
+ if self.recipientListView.childCount() > 1:
+ last_item = self.recipientListView.firstChild()
+ while last_item is not None and last_item.nextSibling():
+ last_item = last_item.nextSibling()
+
+ if item is not self.recipientListView.firstChild():
+ popup.insertItem(QIconSet(load_pixmap('up_user', '16x16')),
+ self.__tr("Move Up"), self.moveUpPushButton_clicked)
+
+ if item is not last_item:
+ popup.insertItem(QIconSet(load_pixmap('down_user', '16x16')),
+ self.__tr("Move Down"), self.moveDownPushButton_clicked)
+
+ popup.insertSeparator(-1)
+ popup.insertItem(QIconSet(load_pixmap('fab', '16x16')),
+ self.__tr("Fax Address Book..."), self.fabPushButton_clicked)
+
+ self.connect(ind, SIGNAL("activated(int)"), self.ind_popup_activated)
+ self.connect(grp, SIGNAL("activated(int)"), self.grp_popup_activated)
+
+ popup.popup(pos)
+
+
+ def ind_popup_activated(self, i):
+ self.addRecipient(self.ind_map[i])
+
+ def grp_popup_activated(self, i):
+ self.addRecipient(self.grp_map[i], True)
+
+ def moveUpPushButton_clicked(self):
+ try:
+ name = self.recipientListView.selectedItem().name
+ except AttributeError:
+ return
+ else:
+ utils.list_move_up(self.recipient_list, name)
+ self.updateRecipientList()
+
+ def moveDownPushButton_clicked(self):
+ try:
+ name = self.recipientListView.selectedItem().name
+ except AttributeError:
+ return
+ else:
+ utils.list_move_down(self.recipient_list, name)
+ self.updateRecipientList()
+
+
+ def fabPushButton_clicked(self):
+ log.debug(self.cmd_fab)
+ #print self.cmd_fab
+ cmd = ''.join([self.cur_device.device_vars.get(x, x) \
+ for x in self.cmd_fab.split('%')])
+ log.debug(cmd)
+
+ path = cmd.split()[0]
+ args = cmd.split()
+
+ self.CleanupChildren()
+ #os.spawnvp(os.P_NOWAIT, path, args)
+ os.system(cmd)
+
+ self.db.load()
+ self.updateRecipientList()
+ self.updateRecipientCombos()
+
+
+ def CleanupChildren(self):
+ log.debug("Cleaning up child processes.")
+ try:
+ os.waitpid(-1, os.WNOHANG)
+ except OSError:
+ pass
+
+
+ def removeRecipientPushButton_clicked(self):
+ try:
+ name = self.recipientListView.selectedItem().name
+ except AttributeError:
+ return
+ else:
+ temp = self.recipient_list[:]
+ index = 0
+ for n in temp:
+ if name == n:
+ del self.recipient_list[index]
+
+ self.prev_selected_recipient = ''
+ self.updateRecipientList()
+ break
+
+ index += 1
+
+
+
+ #
+ # ADD FROM ADDRESS BOOK
+ #
+
+ def addRecipientAddFromFAB(self):
+ widget = self.getWidget()
+
+ layout13 = QGridLayout(widget,1,1,5,10,"layout13")
+
+ self.groupComboBox = QComboBox(0,widget,"groupComboBox")
+ self.groupComboBox.setSizePolicy(QSizePolicy(QSizePolicy.MinimumExpanding,QSizePolicy.Fixed,0,0,self.groupComboBox.sizePolicy().hasHeightForWidth()))
+
+ layout13.addWidget(self.groupComboBox,1,2)
+ spacer12 = QSpacerItem(20,20,QSizePolicy.Preferred,QSizePolicy.Minimum)
+ layout13.addItem(spacer12,1,1)
+
+ self.textLabel1 = QLabel(widget,"textLabel1")
+ self.textLabel1.setSizePolicy(QSizePolicy(QSizePolicy.Expanding,QSizePolicy.Preferred,0,0,self.textLabel1.sizePolicy().hasHeightForWidth()))
+
+ layout13.addWidget(self.textLabel1,0,0)
+
+ self.individualComboBox = QComboBox(0,widget,"individualComboBox")
+ self.individualComboBox.setSizePolicy(QSizePolicy(QSizePolicy.MinimumExpanding,QSizePolicy.Fixed,0,0,self.individualComboBox.sizePolicy().hasHeightForWidth()))
+
+ layout13.addWidget(self.individualComboBox,0,2)
+
+ self.textLabel2 = QLabel(widget,"textLabel2")
+ self.textLabel2.setSizePolicy(QSizePolicy(QSizePolicy.MinimumExpanding,QSizePolicy.Preferred,0,0,self.textLabel2.sizePolicy().hasHeightForWidth()))
+
+ layout13.addWidget(self.textLabel2,1,0)
+ spacer11 = QSpacerItem(30,20,QSizePolicy.Preferred,QSizePolicy.Minimum)
+ layout13.addItem(spacer11,0,1)
+
+ self.addGroupPushButton = PixmapLabelButton(widget,
+ "add_users.png", "add_users.png", name='addGroupPushButton')
+
+ layout13.addWidget(self.addGroupPushButton,1,3)
+
+ self.addIndividualPushButton = PixmapLabelButton(widget,
+ "add_user.png", "add_user.png", name='addIndividualPushButton')
+
+
+ layout13.addWidget(self.addIndividualPushButton,0,3)
+
+ self.textLabel1.setText(self.__tr("Add an <b>individual </b>from the fax address book:"))
+ self.textLabel2.setText(self.__tr("Add a <b>group</b> from the fax address book:"))
+ self.addGroupPushButton.setText(self.__tr("Add"))
+ self.addIndividualPushButton.setText(self.__tr("Add"))
+
+ self.connect(self.addIndividualPushButton,SIGNAL("clicked()"),self.addIndividualPushButton_clicked)
+ self.connect(self.addGroupPushButton,SIGNAL("clicked()"),self.addGroupPushButton_clicked)
+
+
+ self.addWidget(widget, "recipient_add_from_fab")
+
+ def addIndividualPushButton_clicked(self):
+ self.addRecipient(unicode(self.individualComboBox.currentText()))
+
+ def addGroupPushButton_clicked(self):
+ self.addRecipient(unicode(self.groupComboBox.currentText()), True)
+
+ def addRecipient(self, name, is_group=False):
+ if is_group:
+ for i in self.db.group_members(name):
+ #for i in self.db.GroupEntries(name):
+ if not i.startswith('__'):
+ self.recipient_list.append(i)
+ self.prev_selected_recipient = self.recipient_list[-1]
+ else:
+ self.recipient_list.append(name)
+ self.prev_selected_recipient = name
+
+ self.updateRecipientList()
+
+ def updateRecipientCombos(self):
+ # Individuals
+ self.individualComboBox.clear()
+ all_entries = self.db.get_all_records()
+ self.addIndividualPushButton.setEnabled(len(all_entries))
+
+ for e, v in all_entries.items():
+ if not e.startswith('__'):
+ self.individualComboBox.insertItem(e)
+
+ # Groups
+ self.groupComboBox.clear()
+ all_groups = self.db.get_all_groups()
+ self.addGroupPushButton.setEnabled(len(all_groups))
+
+ for g in all_groups:
+ self.groupComboBox.insertItem(g)
+
+
+ #
+ # QUICK ADD
+ #
+
+ def addRecipientQuickAdd(self):
+ widget = self.getWidget()
+
+ layout12 = QGridLayout(widget,1,1,5,10,"layout12")
+ self.quickAddFaxLineEdit = QLineEdit(widget,"quickAddFaxLineEdit")
+
+ self.quickAddFaxLineEdit.setValidator(PhoneNumValidator(self.quickAddFaxLineEdit))
+ layout12.addWidget(self.quickAddFaxLineEdit,0,3)
+
+ self.quickAddNameLineEdit = QLineEdit(widget,"quickAddNameLineEdit")
+ layout12.addWidget(self.quickAddNameLineEdit,0,1)
+
+ self.textLabel4 = QLabel(widget,"textLabel4")
+ layout12.addWidget(self.textLabel4,0,0)
+
+ self.quickAddPushButton = PixmapLabelButton(widget,
+ "add_user_quick.png", "add_user_quick.png", name='quickAddPushButton')
+
+ layout12.addWidget(self.quickAddPushButton,0,4)
+
+ self.textLabel5 = QLabel(widget,"textLabel5")
+ layout12.addWidget(self.textLabel5,0,2)
+
+ self.textLabel4.setText(self.__tr("Name:"))
+ self.quickAddPushButton.setText(self.__tr("Add"))
+ self.textLabel5.setText(self.__tr("Fax Number:"))
+
+ self.quickAddPushButton.setEnabled(False)
+
+ self.connect(self.quickAddPushButton,SIGNAL("clicked()"),self.quickAddPushButton_clicked)
+ self.connect(self.quickAddNameLineEdit,SIGNAL("textChanged(const QString&)"),self.quickAddNameLineEdit_textChanged)
+ self.connect(self.quickAddFaxLineEdit,SIGNAL("textChanged(const QString&)"),self.quickAddFaxLineEdit_textChanged)
+
+ self.addWidget(widget, "recipient_quick_add")
+
+
+ def quickAddPushButton_clicked(self):
+ name = unicode(self.quickAddNameLineEdit.text())
+ self.db.set(name, u'', u'', u'', unicode(self.quickAddFaxLineEdit.text()), [], self.__tr('Added with Quick Add'))
+ self.db.save()
+ self.addRecipient(name)
+
+ self.quickAddNameLineEdit.setText("")
+ self.quickAddFaxLineEdit.setText("")
+
+
+ def enableQuickAddButton(self, name=None, fax=None):
+ if name is None:
+ name = unicode(self.quickAddNameLineEdit.text())
+ if fax is None:
+ fax = unicode(self.quickAddFaxLineEdit.text())
+
+ existing_name = False
+ if name:
+ existing_name = name in self.db.get_all_names()
+
+ if existing_name:
+ try:
+ self.quickAddNameLineEdit.setPaletteBackgroundColor(QColor("yellow"))
+ except AttributeError:
+ pass
+ else:
+ try:
+ self.quickAddNameLineEdit.setPaletteBackgroundColor(QColor("white"))
+ except AttributeError:
+ pass
+
+ if name and not existing_name and fax:
+ self.quickAddPushButton.setEnabled(True)
+ else:
+ self.quickAddPushButton.setEnabled(False)
+
+
+ def quickAddNameLineEdit_textChanged(self, name):
+ self.enableQuickAddButton(unicode(name))
+
+
+ def quickAddFaxLineEdit_textChanged(self, fax):
+ self.enableQuickAddButton(None, unicode(fax))
+
+
+ def checkSendFaxButton(self):
+ self.faxButton.setEnabled(len(self.file_list) and len(self.recipient_list))
+
+ def faxButton_clicked(self):
+ self.check_timer.stop()
+ phone_num_list = []
+
+ log.debug("Current printer=%s" % self.cur_printer)
+ ppd_file = cups.getPPD(self.cur_printer)
+
+ if ppd_file is not None and os.path.exists(ppd_file):
+ if file(ppd_file, 'r').read().find('HP Fax') == -1:
+ self.form.FailureUI(self.__tr("<b>Fax configuration error.</b><p>The CUPS fax queue for '%1' is incorrectly configured.<p>Please make sure that the CUPS fax queue is configured with the 'HPLIP Fax' Model/Driver.").arg(self.cur_printer))
+ return
+
+ QApplication.setOverrideCursor(QApplication.waitCursor)
+
+ self.dev = fax.getFaxDevice(self.cur_device.device_uri,
+ self.cur_printer, None,
+ self.cur_device.mq['fax-type'])
+
+ try:
+ try:
+ self.dev.open()
+ except Error, e:
+ log.warn(e.msg)
+
+ try:
+ self.dev.queryDevice(quick=True)
+ except Error, e:
+ log.error("Query device error (%s)." % e.msg)
+ self.dev.error_state = ERROR_STATE_ERROR
+
+ finally:
+ self.dev.close()
+ QApplication.restoreOverrideCursor()
+
+ if self.dev.error_state > ERROR_STATE_MAX_OK and \
+ self.dev.error_state not in (ERROR_STATE_LOW_SUPPLIES, ERROR_STATE_LOW_PAPER):
+
+ self.form.FailureUI(self.__tr("<b>Device is busy or in an error state (code=%1)</b><p>Please wait for the device to become idle or clear the error and try again.").arg(self.cur_device.status_code))
+ return
+
+ # Check to make sure queue in CUPS is idle
+ self.cups_printers = cups.getPrinters()
+ for p in self.cups_printers:
+ if p.name == self.cur_printer:
+ if p.state == cups.IPP_PRINTER_STATE_STOPPED:
+ self.form.FailureUI(self.__tr("<b>The CUPS queue for '%1' is in a stopped or busy state.</b><p>Please check the queue and try again.").arg(self.cur_printer))
+ return
+ break
+
+ log.debug("Recipient list:")
+
+ for p in self.recipient_list:
+ entry = self.db.get(p)
+ phone_num_list.append(entry)
+ log.debug("Name=%s Number=%s" % (entry["name"], entry["fax"]))
+
+ log.debug("File list:")
+
+
+ for f in self.file_list:
+ log.debug(unicode(f))
+
+ self.busy = True
+
+ self.dev.sendEvent(EVENT_START_FAX_JOB, self.cur_printer, 0, '')
+
+ if not self.dev.sendFaxes(phone_num_list, self.file_list, self.cover_page_message,
+ self.cover_page_re, self.cover_page_func, self.preserve_formatting,
+ self.cur_printer, self.update_queue, self.event_queue):
+
+ self.form.FailureUI(self.__tr("<b>Send fax is active.</b><p>Please wait for operation to complete."))
+ self.dev.sendEvent(EVENT_FAX_JOB_FAIL, self.cur_printer, 0, '')
+ self.busy = False
+ return
+
+
+ self.waitdlg = WaitForm(0, self.__tr("Initializing..."), self.send_fax_canceled, self, modal=1)
+ self.waitdlg.show()
+
+ self.send_fax_timer = QTimer(self, "SendFaxTimer")
+ self.connect(self.send_fax_timer, SIGNAL('timeout()'), self.send_fax_timer_timeout)
+ self.send_fax_timer.start(1000) # 1 sec UI updates
+
+ def send_fax_canceled(self):
+ self.event_queue.put((fax.EVENT_FAX_SEND_CANCELED, '', '', ''))
+ self.dev.sendEvent(EVENT_FAX_JOB_CANCELED, self.cur_printer, 0, '')
+
+ def send_fax_timer_timeout(self):
+ while self.update_queue.qsize():
+ try:
+ status, page_num, arg = self.update_queue.get(0)
+ except Queue.Empty:
+ break
+
+ if status == fax.STATUS_IDLE:
+ self.busy = False
+ self.send_fax_timer.stop()
+
+ if self.waitdlg is not None:
+ self.waitdlg.hide()
+ self.waitdlg.close()
+ self.waitdlg = None
+
+ elif status == fax.STATUS_PROCESSING_FILES:
+ self.waitdlg.setMessage(self.__tr("Processing page %1...").arg(page_num))
+
+ elif status == fax.STATUS_SENDING_TO_RECIPIENT:
+ self.waitdlg.setMessage(self.__tr("Sending fax to %1...").arg(arg))
+
+ elif status == fax.STATUS_DIALING:
+ self.waitdlg.setMessage(self.__tr("Dialing %1...").arg(arg))
+
+ elif status == fax.STATUS_CONNECTING:
+ self.waitdlg.setMessage(self.__tr("Connecting to %1...").arg(arg))
+
+ elif status == fax.STATUS_SENDING:
+ self.waitdlg.setMessage(self.__tr("Sending page %1 to %2...").arg(page_num).arg(arg))
+
+ elif status == fax.STATUS_CLEANUP:
+ self.waitdlg.setMessage(self.__tr("Cleaning up..."))
+
+ elif status in (fax.STATUS_ERROR, fax.STATUS_BUSY, fax.STATUS_COMPLETED):
+ self.busy = False
+ self.send_fax_timer.stop()
+
+ if self.waitdlg is not None:
+ self.waitdlg.hide()
+ self.waitdlg.close()
+ self.waitdlg = None
+
+ if status == fax.STATUS_ERROR:
+ result_code, error_state = self.dev.getPML(pml.OID_FAX_DOWNLOAD_ERROR)
+ if error_state == pml.DN_ERROR_NONE:
+ self.form.FailureUI(self.__tr("<b>Fax send error (Possible cause: No answer or dialtone)"))
+ else:
+ self.form.FailureUI(self.__tr("<b>Fax send error (%s).</b><p>" % pml.DN_ERROR_STR.get(error_state, "Unknown error")))
+ self.dev.sendEvent(EVENT_FAX_JOB_FAIL, self.cur_printer, 0, '')
+
+ elif status == fax.STATUS_BUSY:
+ self.form.FailureUI(self.__tr("<b>Fax device is busy.</b><p>Please try again later."))
+ self.dev.sendEvent(EVENT_FAX_JOB_FAIL, self.cur_printer, 0, '')
+
+ elif status == fax.STATUS_COMPLETED:
+ self.dev.sendEvent(EVENT_END_FAX_JOB, self.cur_printer, 0, '')
+
+ self.funcButton_clicked()
+
+
+ def cleanup(self):
+ self.unlock()
+
+ if fax_enabled:
+ self.check_timer.stop()
+
+ def funcButton_clicked(self):
+ self.cleanup()
+ self.form.close()
+
+ def __tr(self,s,c = None):
+ return qApp.translate("ScrollFaxView",s,c)
diff --git a/ui/scrollprint.py b/ui/scrollprint.py
new file mode 100644
index 0000000..647df7b
--- /dev/null
+++ b/ui/scrollprint.py
@@ -0,0 +1,1088 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2001-2009 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+# Local
+from base.g import *
+from base import utils, magic
+from prnt import cups
+from ui_utils import load_pixmap
+
+# Qt
+from qt import *
+from scrollview import ScrollView, PixmapLabelButton
+from allowabletypesdlg import AllowableTypesDlg
+from jobstoragemixin import JobStorageMixin
+
+# Std Lib
+import os.path
+import os
+import time
+
+class RangeValidator(QValidator):
+ def __init__(self, parent=None, name=None):
+ QValidator.__init__(self, parent, name)
+
+ def validate(self, input, pos):
+ for x in unicode(input)[pos-1:]:
+ if x not in u'0123456789,- ':
+ return QValidator.Invalid, pos
+
+ return QValidator.Acceptable, pos
+
+
+
+class FileListViewItem(QListViewItem):
+ def __init__(self, parent, index, filename, mime_type_desc, path):
+ QListViewItem.__init__(self, parent, str(index+1), filename, mime_type_desc, path)
+ self.path = path
+ self.index = index
+
+
+class ScrollPrintView(ScrollView):
+ utils.mixin(JobStorageMixin)
+
+ def __init__(self, service, parent=None, form=None, name=None, fl=0):
+ ScrollView.__init__(self, service, parent, name, fl)
+
+ self.initJobStorage()
+
+ self.form = form
+ self.file_list = []
+ self.pages_button_group = 0
+ self.prev_selected_file_index = 0
+
+ self.allowable_mime_types = cups.getAllowableMIMETypes()
+ log.debug(self.allowable_mime_types)
+
+ self.MIME_TYPES_DESC = \
+ {
+ "application/pdf" : (self.__tr("PDF Document"), '.pdf'),
+ "application/postscript" : (self.__tr("Postscript Document"), '.ps'),
+ "application/vnd.hp-HPGL" : (self.__tr("HP Graphics Language File"), '.hgl, .hpg, .plt, .prn'),
+ "application/x-cshell" : (self.__tr("C Shell Script"), '.csh, .sh'),
+ "application/x-csource" : (self.__tr("C Source Code"), '.c'),
+ "text/cpp": (self.__tr("C/C++ Source Code"), '.c, .cpp, .cxx'),
+ "application/x-perl" : (self.__tr("Perl Script"), '.pl'),
+ "application/x-python" : (self.__tr("Python Program"), '.py'),
+ "application/x-shell" : (self.__tr("Shell Script"), '.sh'),
+ "application/x-sh" : (self.__tr("Shell Script"), '.sh'),
+ "text/plain" : (self.__tr("Plain Text"), '.txt, .log, etc'),
+ "text/html" : (self.__tr("HTML Dcoument"), '.htm, .html'),
+ "image/gif" : (self.__tr("GIF Image"), '.gif'),
+ "image/png" : (self.__tr("PNG Image"), '.png'),
+ "image/jpeg" : (self.__tr("JPEG Image"), '.jpg, .jpeg'),
+ "image/tiff" : (self.__tr("TIFF Image"), '.tif, .tiff'),
+ "image/x-bitmap" : (self.__tr("Bitmap (BMP) Image"), '.bmp'),
+ "image/x-bmp" : (self.__tr("Bitmap (BMP) Image"), '.bmp'),
+ "image/x-photocd" : (self.__tr("Photo CD Image"), '.pcd'),
+ "image/x-portable-anymap" : (self.__tr("Portable Image (PNM)"), '.pnm'),
+ "image/x-portable-bitmap" : (self.__tr("Portable B&W Image (PBM)"), '.pbm'),
+ "image/x-portable-graymap" : (self.__tr("Portable Grayscale Image (PGM)"), '.pgm'),
+ "image/x-portable-pixmap" : (self.__tr("Portable Color Image (PPM)"), '.ppm'),
+ "image/x-sgi-rgb" : (self.__tr("SGI RGB"), '.rgb'),
+ "image/x-xbitmap" : (self.__tr("X11 Bitmap (XBM)"), '.xbm'),
+ "image/x-xpixmap" : (self.__tr("X11 Pixmap (XPM)"), '.xpm'),
+ "image/x-sun-raster" : (self.__tr("Sun Raster Format"), '.ras'),
+ }
+
+
+ def fillControls(self):
+ ScrollView.fillControls(self)
+
+ if self.addPrinterFaxList():
+ self.addGroupHeading("files_to_print", self.__tr("File(s) to Print"))
+ self.addFileList()
+ self.addGroupHeading("options", self.__tr("Print Options"))
+ self.addCopies()
+ self.addPageRange()
+ self.addPageSet()
+
+ self.job_storage_avail = self.cur_device.mq['job-storage'] == JOB_STORAGE_ENABLE
+
+ if self.job_storage_avail:
+ self.addGroupHeading("jobstorage", self.__tr("Job Storage and Secure Printing"))
+ self.addJobStorage()
+
+ self.addGroupHeading("space1", "")
+
+ self.printButton = self.addActionButton("bottom_nav", self.__tr("Print File(s)"),
+ self.printButton_clicked, 'print.png', 'print.png',
+ self.__tr("Close"), self.funcButton_clicked)
+
+ self.printButton.setEnabled(False)
+ self.maximizeControl()
+
+ else:
+ QApplication.restoreOverrideCursor()
+ self.form.FailureUI("<b>Print is disabled.</b><p>No CUPS print queue found for this device.")
+ self.funcButton_clicked()
+
+
+ def onUpdate(self, cur_device=None):
+ log.debug("ScrollPrintView.onUpdate()")
+ self.updateFileList()
+
+ def onDeviceChange(self, cur_device=None):
+ self.file_list = []
+ ScrollView.onDeviceChange(self, cur_device)
+
+ def addFileList(self):
+ widget = self.getWidget()
+ layout37 = QGridLayout(widget,1,1,5,10,"layout37")
+
+ self.addFilePushButton = PixmapLabelButton(widget,
+ "list_add.png", "list_add.png")
+
+ layout37.addWidget(self.addFilePushButton,2,0)
+
+ self.removeFilePushButton = PixmapLabelButton(widget,
+ "list_remove.png", "list_remove.png")
+
+ layout37.addWidget(self.removeFilePushButton,2,1)
+
+ self.moveFileUpPushButton = PixmapLabelButton(widget, "up.png",
+ "up.png", name='moveFileUpPushButton')
+
+ layout37.addWidget(self.moveFileUpPushButton,2,2)
+
+ self.moveFileDownPushButton = PixmapLabelButton(widget, "down.png",
+ "down.png", name='moveFileDownPushButton')
+
+ layout37.addWidget(self.moveFileDownPushButton,2,3)
+
+ self.showTypesPushButton = PixmapLabelButton(widget, "mimetypes.png",
+ None, name='addFilePushButton')
+
+ layout37.addWidget(self.showTypesPushButton,2,5)
+ self.fileListView = QListView(widget,"fileListView")
+ self.fileListView.addColumn(self.__tr("Order"))
+ self.fileListView.addColumn(self.__tr("Name"))
+ self.fileListView.addColumn(self.__tr("Type"))
+ self.fileListView.addColumn(self.__tr("Path"))
+ self.fileListView.setAllColumnsShowFocus(1)
+ self.fileListView.setShowSortIndicator(1)
+ self.fileListView.setColumnWidth(0, 100)
+ self.fileListView.setColumnWidth(1, 150)
+ self.fileListView.setColumnWidth(2, 75)
+ self.fileListView.setColumnWidth(3, 300)
+ self.fileListView.setItemMargin(2)
+ self.fileListView.setSorting(-1)
+
+ layout37.addMultiCellWidget(self.fileListView,1,1,0,5)
+
+ spacer26 = QSpacerItem(20,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ layout37.addItem(spacer26,2,4)
+
+ self.addFilePushButton.setText(self.__tr("Add File..."))
+ self.showTypesPushButton.setText(self.__tr("Show Types..."))
+ self.removeFilePushButton.setText(self.__tr("Remove File"))
+ self.moveFileDownPushButton.setText(self.__tr("Move Down"))
+ self.moveFileUpPushButton.setText(self.__tr("Move Up"))
+
+ self.removeFilePushButton.setEnabled(False)
+ self.moveFileDownPushButton.setEnabled(False)
+ self.moveFileUpPushButton.setEnabled(False)
+
+ self.connect(self.addFilePushButton, SIGNAL("clicked()"), self.addFile_clicked)
+ self.connect(self.removeFilePushButton, SIGNAL("clicked()"), self.removeFile_clicked)
+ self.connect(self.showTypesPushButton, SIGNAL("clicked()"), self.showFileTypes_clicked)
+ self.connect(self.fileListView,SIGNAL("rightButtonClicked(QListViewItem*,const QPoint&, int)"),self.fileListView_rightButtonClicked)
+
+ self.connect(self.moveFileUpPushButton, SIGNAL("clicked()"), self.moveFileUp_clicked)
+ self.connect(self.moveFileDownPushButton, SIGNAL("clicked()"), self.moveFileDown_clicked)
+ self.connect(self.fileListView, SIGNAL("selectionChanged(QListViewItem*)"),
+ self.fileListView_selectionChanged)
+
+ self.addWidget(widget, "file_list", maximize=True)
+
+ def fileListView_selectionChanged(self, i):
+ try:
+ self.prev_selected_file_index = i.index
+ except AttributeError:
+ pass
+ else:
+ flv = self.fileListView
+ selected_item = flv.selectedItem()
+ file_count = flv.childCount()
+ last_item = flv.firstChild()
+ while last_item.nextSibling():
+ last_item = last_item.nextSibling()
+
+ self.moveFileDownPushButton.setEnabled(file_count > 1 and selected_item is not last_item)
+ self.moveFileUpPushButton.setEnabled(file_count > 1 and selected_item is not flv.firstChild())
+
+ def fileListView_rightButtonClicked(self, item, pos, col):
+ popup = QPopupMenu(self)
+ popup.insertItem(QIconSet(load_pixmap('list_add', '16x16')),
+ self.__tr("Add File..."), self.addFile_clicked)
+
+ if item is not None:
+ popup.insertItem(QIconSet(load_pixmap('list_remove', '16x16')),
+ self.__tr("Remove File"), self.removeFile_clicked)
+
+ if self.fileListView.childCount() > 1:
+ last_item = self.fileListView.firstChild()
+ while last_item is not None and last_item.nextSibling():
+ last_item = last_item.nextSibling()
+
+ if item is not self.fileListView.firstChild():
+ popup.insertItem(QIconSet(load_pixmap('up', '16x16')),
+ self.__tr("Move Up"), self.moveFileUp_clicked)
+
+ if item is not last_item:
+ popup.insertItem(QIconSet(load_pixmap('down', '16x16')),
+ self.__tr("Move Down"), self.moveFileDown_clicked)
+
+ popup.insertSeparator(-1)
+ popup.insertItem(QIconSet(load_pixmap('mimetypes', '16x16')),
+ self.__tr("Show File Types..."), self.showFileTypes_clicked)
+
+ popup.popup(pos)
+
+ def moveFileUp_clicked(self):
+ log.debug("Move file up")
+ try:
+ item = self.fileListView.selectedItem()
+ path, index = item.path, item.index
+ except AttributeError:
+ return
+ else:
+ new_pos = index-1
+ self.file_list[new_pos], self.file_list[index] = self.file_list[index], self.file_list[new_pos]
+ item.index = new_pos
+ self.prev_selected_file_index = new_pos
+ self.updateFileList()
+
+ def moveFileDown_clicked(self):
+ log.debug("Move file down")
+ try:
+ item = self.fileListView.selectedItem()
+ path, index = item.path, item.index
+ except AttributeError:
+ return
+ else:
+ new_pos = index+1
+ self.file_list[index], self.file_list[new_pos] = self.file_list[new_pos], self.file_list[index]
+ item.index = new_pos
+ self.prev_selected_file_index = new_pos
+ self.updateFileList()
+
+ def addFile(self, path):
+ path = os.path.realpath(path)
+ if os.path.exists(path) and os.access(path, os.R_OK):
+ mime_type = magic.mime_type(path)
+ mime_type_desc = mime_type
+ log.debug(mime_type)
+
+ try:
+ mime_type_desc = self.MIME_TYPES_DESC[mime_type][0]
+ except KeyError:
+ self.form.FailureUI(self.__tr("<b>You are trying to add a file that cannot be directly printed with this utility.</b><p>To print this file, use the print command in the application that created it."))
+ else:
+ log.debug("Adding file %s (%s,%s)" % (path, mime_type, mime_type_desc))
+ self.file_list.append((path, mime_type, mime_type_desc))
+ else:
+ self.form.FailureUI(self.__tr("<b>Unable to add file '%1' to file list (file not found or insufficient permissions).</b><p>Check the file name and try again.").arg(path))
+
+ self.updateFileList()
+
+ def updateFileList(self):
+ self.fileListView.clear()
+ temp = self.file_list[:]
+ temp.reverse()
+ last_item = None
+ selected_item = None
+ index = len(temp)-1
+
+ for path, mime_type, desc in temp:
+ log.debug("path=%s, mime_type=%s, desc=%s, index=%d" % (path, mime_type, desc, index))
+ i = FileListViewItem(self.fileListView, index, os.path.basename(path), desc, path)
+
+ if self.prev_selected_file_index == index:
+ self.fileListView.setSelected(i, True)
+ self.prev_selected_file_index = index
+ selected_item = i
+
+ index -= 1
+
+ last_item = self.fileListView.firstChild()
+ while last_item is not None and last_item.nextSibling():
+ last_item = last_item.nextSibling()
+
+ file_count = self.fileListView.childCount()
+ self.moveFileDownPushButton.setEnabled(file_count > 1 and selected_item is not last_item)
+ self.moveFileUpPushButton.setEnabled(file_count > 1 and selected_item is not self.fileListView.firstChild())
+ self.removeFilePushButton.setEnabled(file_count > 0)
+ self.printButton.setEnabled(file_count > 0)
+
+ def addFile_clicked(self):
+ dlg = QFileDialog(user_conf.workingDirectory(), QString.null, None, None, True)
+
+ dlg.setCaption("openfile")
+ dlg.setMode(QFileDialog.ExistingFile)
+ dlg.show()
+
+ if dlg.exec_loop() == QDialog.Accepted:
+ results = dlg.selectedFile()
+ working_directory = unicode(dlg.dir().absPath())
+ log.debug("results: %s" % results)
+ user_conf.setWorkingDirectory(working_directory)
+
+ if results:
+ self.addFile(unicode(results))
+
+ def removeFile_clicked(self):
+ try:
+ path = self.fileListView.selectedItem().path
+ except AttributeError:
+ return
+ else:
+ temp = self.file_list[:]
+ index = 0
+ for p, t, d in temp:
+ if p == path:
+ del self.file_list[index]
+ if index == self.prev_selected_file_index:
+ self.prev_selected_file_index = 0
+ break
+ index += 1
+
+ self.updateFileList()
+
+ def showFileTypes_clicked(self):
+ x = {}
+ for a in self.allowable_mime_types:
+ x[a] = self.MIME_TYPES_DESC.get(a, ('Unknown', 'n/a'))
+
+ log.debug(x)
+ dlg = AllowableTypesDlg(x, self)
+ dlg.exec_loop()
+
+
+ def addCopies(self):
+ widget = self.getWidget()
+
+ layout12 = QHBoxLayout(widget,5,10,"layout12")
+
+ self.textLabel5 = QLabel(widget,"textLabel5")
+ layout12.addWidget(self.textLabel5)
+ spacer20 = QSpacerItem(20,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ layout12.addItem(spacer20)
+
+ self.copiesSpinBox = QSpinBox(widget,"copiesSpinBox")
+ layout12.addWidget(self.copiesSpinBox)
+
+ self.copiesDefaultPushButton = QPushButton(widget,"copiesDefaultPushButton")
+ layout12.addWidget(self.copiesDefaultPushButton)
+
+ self.textLabel5.setText(self.__tr("Number of copies:"))
+ self.copiesDefaultPushButton.setText(self.__tr("Default"))
+
+ self.copiesSpinBox.setMaxValue(99)
+ self.copiesSpinBox.setMinValue(1)
+ self.copiesSpinBox.setValue(1)
+
+ self.copiesDefaultPushButton.setEnabled(False)
+
+ self.connect(self.copiesDefaultPushButton, SIGNAL("clicked()"), self.copiesDefaultPushButton_clicked)
+ self.connect(self.copiesSpinBox, SIGNAL("valueChanged(int)"), self.copiesSpinBox_valueChanged)
+
+ self.addWidget(widget, "copies")
+
+ def copiesDefaultPushButton_clicked(self):
+ self.copiesSpinBox.setValue(1)
+ self.copiesDefaultPushButton.setEnabled(False)
+
+ def copiesSpinBox_valueChanged(self, i):
+ self.copiesDefaultPushButton.setEnabled(i != 1)
+
+ def addPageRange(self):
+ widget = self.getWidget()
+
+ layout39 = QGridLayout(widget,1,1,5,10,"layout39")
+
+ self.pageRangeEdit = QLineEdit(widget,"self.pageRangeEdit")
+ self.pageRangeEdit.setEnabled(0)
+ layout39.addWidget(self.pageRangeEdit,0,3)
+
+ spacer20_2 = QSpacerItem(20,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ layout39.addItem(spacer20_2,0,1)
+
+ textLabel5_2 = QLabel(widget,"textLabel5_2")
+ layout39.addWidget(textLabel5_2,0,0)
+
+ self.pagerangeDefaultPushButton = QPushButton(widget,"pagerangeDefaultPushButton")
+ layout39.addWidget(self.pagerangeDefaultPushButton,0,4)
+
+ self.rangeButtonGroup = QButtonGroup(widget,"self.rangeButtonGroup")
+ self.rangeButtonGroup.setLineWidth(0)
+ self.rangeButtonGroup.setColumnLayout(0,Qt.Vertical)
+ self.rangeButtonGroup.layout().setSpacing(0)
+ self.rangeButtonGroup.layout().setMargin(0)
+ self.rangeButtonGroupLayout = QGridLayout(self.rangeButtonGroup.layout())
+ self.rangeButtonGroupLayout.setAlignment(Qt.AlignTop)
+
+ radioButton3_2 = QRadioButton(self.rangeButtonGroup,"radioButton3_2")
+ radioButton3_2.setChecked(1)
+ self.rangeButtonGroup.insert( radioButton3_2,0)
+ self.rangeButtonGroupLayout.addWidget(radioButton3_2,0,0)
+
+ radioButton4_2 = QRadioButton(self.rangeButtonGroup,"radioButton4_2")
+ self.rangeButtonGroup.insert( radioButton4_2,1)
+ self.rangeButtonGroupLayout.addWidget(radioButton4_2,0,1)
+
+ layout39.addWidget(self.rangeButtonGroup,0,2)
+
+ self.bg = self.pageRangeEdit.paletteBackgroundColor()
+ self.invalid_page_range = False
+
+ self.pageRangeEdit.setValidator(RangeValidator(self.pageRangeEdit))
+
+ textLabel5_2.setText(self.__tr("Page Range:"))
+ radioButton3_2.setText(self.__tr("All pages"))
+ radioButton4_2.setText(self.__tr("Page range:"))
+
+ self.pagerangeDefaultPushButton.setText(self.__tr("Default"))
+
+ self.pagerangeDefaultPushButton.setEnabled(False)
+
+ self.connect(self.rangeButtonGroup, SIGNAL("clicked(int)"), self.rangeButtonGroup_clicked)
+ self.connect(self.pageRangeEdit,SIGNAL("lostFocus()"),self.pageRangeEdit_lostFocus)
+ self.connect(self.pageRangeEdit,SIGNAL("textChanged(const QString&)"),self.pageRangeEdit_textChanged)
+ self.connect(self.pagerangeDefaultPushButton, SIGNAL("clicked()"), self.pagerangeDefaultPushButton_clicked)
+
+ self.addWidget(widget, "range")
+
+ def pagerangeDefaultPushButton_clicked(self):
+ self.rangeButtonGroup.setButton(0)
+ self.pagerangeDefaultPushButton.setEnabled(False)
+ self.pageRangeEdit.setEnabled(False)
+
+ def rangeButtonGroup_clicked(self, a0):
+ self.pages_button_group = a0
+ self.pageRangeEdit.setEnabled(a0 == 1)
+ self.pagerangeDefaultPushButton.setEnabled(a0 == 1)
+
+ def pageRangeEdit_lostFocus(self):
+ x = []
+ try:
+ x = utils.expand_range(unicode(self.pageRangeEdit.text()))
+ except ValueError:
+ log.error("Invalid page range entered.")
+ self.invalid_page_range = True
+ self.pageRangeEdit.setPaletteBackgroundColor(QColor(0xff, 0x99, 0x99))
+
+ else:
+ self.pageRangeEdit.setText(QString(utils.collapse_range(x)))
+ self.pageRangeEdit.setPaletteBackgroundColor(self.bg)
+ self.invalid_page_range = False
+
+ def pageRangeEdit_textChanged(self,a0):
+ x = []
+ try:
+ x = utils.expand_range(str(self.pageRangeEdit.text()))
+ except ValueError:
+ self.invalid_page_range = True
+ self.pageRangeEdit.setPaletteBackgroundColor(QColor(0xff, 0x99, 0x99))
+
+ else:
+ self.pageRangeEdit.setPaletteBackgroundColor(self.bg)
+ self.invalid_page_range = False
+
+ def addPageSet(self):
+ widget = self.getWidget()
+
+ layout34 = QHBoxLayout(widget,5,10,"layout34")
+
+ self.textLabel5_4 = QLabel(widget,"textLabel5_4")
+ layout34.addWidget(self.textLabel5_4)
+ spacer20_4 = QSpacerItem(20,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ layout34.addItem(spacer20_4)
+
+ self.pageSetComboBox = QComboBox(0,widget,"pageSetComboBox")
+ layout34.addWidget(self.pageSetComboBox)
+
+ self.pagesetDefaultPushButton = QPushButton(widget,"pagesetDefaultPushButton")
+ layout34.addWidget(self.pagesetDefaultPushButton)
+
+ self.textLabel5_4.setText(self.__tr("Page set:"))
+ self.pageSetComboBox.clear()
+ self.pageSetComboBox.insertItem(self.__tr("All pages"))
+ self.pageSetComboBox.insertItem(self.__tr("Even pages"))
+ self.pageSetComboBox.insertItem(self.__tr("Odd pages"))
+ self.pagesetDefaultPushButton.setText(self.__tr("Default"))
+
+ self.pagesetDefaultPushButton.setEnabled(False)
+
+ self.connect(self.pageSetComboBox, SIGNAL("activated(int)"), self.pageSetComboBox_activated)
+ self.connect(self.pagesetDefaultPushButton, SIGNAL("clicked()"), self.pagesetDefaultPushButton_clicked)
+
+ self.addWidget(widget, "set")
+
+ def pagesetDefaultPushButton_clicked(self):
+ self.pagesetDefaultPushButton.setEnabled(False)
+ self.pageSetComboBox.setCurrentItem(0)
+
+ def pageSetComboBox_activated(self, i):
+ self.pagesetDefaultPushButton.setEnabled(i != 0)
+
+## #
+## # JOB STORAGE
+## #
+##
+## def addJobStorage(self):
+## self.addJobStorageMode()
+## self.addJobStoragePIN()
+## self.addJobStorageUsername()
+## self.addJobStorageID()
+## self.addJobStorageIDExists()
+## self.jobStorageDisable()
+##
+##
+## def addJobStorageMode(self):
+## widget = self.getWidget()
+##
+## layout34 = QHBoxLayout(widget,5,10,"layout34")
+##
+## self.jobStorageModeLabel = QLabel(widget,"jobStorageModeLabel")
+## layout34.addWidget(self.jobStorageModeLabel)
+## spacer20_4 = QSpacerItem(20,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+## layout34.addItem(spacer20_4)
+##
+## self.jobStorageModeComboBox = QComboBox(0,widget,"jobStorageModeComboBox")
+## layout34.addWidget(self.jobStorageModeComboBox)
+##
+## self.jobStorageModeDefaultPushButton = QPushButton(widget,"pagesetDefaultPushButton")
+## layout34.addWidget(self.jobStorageModeDefaultPushButton)
+##
+## self.jobStorageModeLabel.setText(self.__tr("Job Storage Mode:"))
+## self.jobStorageModeComboBox.clear()
+## self.jobStorageModeComboBox.insertItem(self.__tr("Off"))
+## self.jobStorageModeComboBox.insertItem(self.__tr("Proof and Hold"))
+## self.jobStorageModeComboBox.insertItem(self.__tr("Personal/Private Job"))
+## self.jobStorageModeComboBox.insertItem(self.__tr("Quick Copy"))
+## self.jobStorageModeComboBox.insertItem(self.__tr("Stored Job"))
+##
+## self.jobStorageModeDefaultPushButton.setText(self.__tr("Default"))
+## self.jobStorageModeDefaultPushButton.setEnabled(False)
+##
+## self.connect(self.jobStorageModeComboBox, SIGNAL("activated(int)"), self.jobStorageModeComboBox_activated)
+## self.connect(self.jobStorageModeDefaultPushButton, SIGNAL("clicked()"), self.jobStorageModeDefaultPushButton_clicked)
+##
+## self.addWidget(widget, "job_storage_mode")
+##
+## def jobStorageModeComboBox_activated(self, a):
+## self.job_storage_mode = a
+##
+## if a == 0: # Off
+## self.jobStorageDisable()
+##
+## elif a == 1: # Proof and Hold
+## self.jobStorageModeDefaultPushButton.setEnabled(True)
+## self.jobStorageUserJobEnable(True)
+## self.jobStoragePINEnable(False)
+##
+## elif a == 2: # Private Job
+## self.jobStorageModeDefaultPushButton.setEnabled(True)
+## self.jobStoragePINEnable(True)
+## self.jobStorageUserJobEnable(True)
+##
+## elif a == 3: # Quick Copy
+## self.jobStorageModeDefaultPushButton.setEnabled(True)
+## self.jobStoragePINEnable(False)
+## self.jobStorageUserJobEnable(True)
+##
+## elif a == 4: # Stored Job
+## self.jobStorageModeDefaultPushButton.setEnabled(True)
+## self.jobStoragePINEnable(True) # ???
+## self.jobStorageUserJobEnable(True)
+##
+## def jobStorageModeDefaultPushButton_clicked(self):
+## self.jobStorageModeComboBox.setCurrentItem(0)
+## self.job_storage_mode = 0
+##
+## def jobStorageDisable(self): # Turn all Off
+## self.jobStorageModeDefaultPushButton.setEnabled(False)
+## self.jobStoragePINEnable(False)
+## self.jobStorageUserJobEnable(False)
+##
+## def jobStoragePINEnable(self, e=True): # PIN On/Off
+## t = e and self.jobStoragePINButtonGroup.selectedId() == 1
+## self.jobStoragePINButtonGroup.setEnabled(e)
+## self.jobStoragePINEdit.setEnabled(t)
+## self.jobStoragePINDefaultPushButton.setEnabled(t)
+##
+## def jobStorageUserJobEnable(self, e=True): # Username/Job ID/Job ID Exists On/Off
+## t = e and self.jobStorageUsernameButtonGroup.selectedId() == 1
+## self.jobStorageUsernameButtonGroup.setEnabled(e)
+## self.jobStorageUsernameDefaultPushButton.setEnabled(t)
+## self.jobStorageUsernameEdit.setEnabled(t)
+##
+## t = e and self.jobStorageIDButtonGroup.selectedId() == 1
+## self.jobStorageIDButtonGroup.setEnabled(e)
+## self.jobStorageIDDefaultPushButton.setEnabled(t)
+## self.jobStorageIDEdit.setEnabled(t)
+##
+## t = e and self.jobStorageIDExistsComboBox.currentItem() == 1
+## self.jobStorageIDExistsComboBox.setEnabled(e)
+## self.jobStorageIDExistsDefaultPushButton.setEnabled(t)
+##
+##
+##
+## # PIN
+##
+##
+## def addJobStoragePIN(self):
+## widget = self.getWidget()
+##
+## layout39 = QGridLayout(widget,1,1,5,10,"layout39")
+##
+## self.jobStoragePINEdit = QLineEdit(widget,"self.jobStoragePINEdit")
+## self.jobStoragePINEdit.setMaxLength(4)
+## self.jobStoragePINEdit.setText(self.job_storage_pin)
+## layout39.addWidget(self.jobStoragePINEdit,0,3)
+##
+## spacer20_2 = QSpacerItem(20,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+## layout39.addItem(spacer20_2,0,1)
+##
+## textLabel5_2 = QLabel(widget,"textLabel5_2")
+## layout39.addWidget(textLabel5_2,0,0)
+##
+## self.jobStoragePINDefaultPushButton = QPushButton(widget,"jobStoragePINDefaultPushButton")
+## layout39.addWidget(self.jobStoragePINDefaultPushButton,0,4)
+##
+## self.jobStoragePINButtonGroup = QButtonGroup(widget,"self.jobStoragePINButtonGroup")
+## self.jobStoragePINButtonGroup.setLineWidth(0)
+## self.jobStoragePINButtonGroup.setColumnLayout(0,Qt.Vertical)
+## self.jobStoragePINButtonGroup.layout().setSpacing(0)
+## self.jobStoragePINButtonGroup.layout().setMargin(0)
+## self.jobStoragePINButtonGroupLayout = QGridLayout(self.jobStoragePINButtonGroup.layout())
+## self.jobStoragePINButtonGroupLayout.setAlignment(Qt.AlignTop)
+##
+## radioButton3_2 = QRadioButton(self.jobStoragePINButtonGroup,"radioButton3_2")
+## radioButton3_2.setChecked(1)
+## self.jobStoragePINButtonGroup.insert( radioButton3_2,0)
+## self.jobStoragePINButtonGroupLayout.addWidget(radioButton3_2,0,0)
+##
+## radioButton4_2 = QRadioButton(self.jobStoragePINButtonGroup,"radioButton4_2")
+## self.jobStoragePINButtonGroup.insert( radioButton4_2,1)
+## self.jobStoragePINButtonGroupLayout.addWidget(radioButton4_2,0,1)
+##
+## layout39.addWidget(self.jobStoragePINButtonGroup,0,2)
+##
+## self.bg = self.jobStoragePINEdit.paletteBackgroundColor()
+## self.invalid_page_range = False
+##
+## self.jobStoragePINEdit.setValidator(PINValidator(self.jobStoragePINEdit))
+##
+## textLabel5_2.setText(self.__tr("Make Job Private (use PIN to print):"))
+## radioButton3_2.setText(self.__tr("Public/Off"))
+## radioButton4_2.setText(self.__tr("Private/Use PIN to Print:"))
+##
+## self.jobStoragePINDefaultPushButton.setText(self.__tr("Default"))
+##
+## self.connect(self.jobStoragePINButtonGroup, SIGNAL("clicked(int)"), self.jobStoragePINButtonGroup_clicked)
+## self.connect(self.jobStoragePINEdit,SIGNAL("lostFocus()"),self.jobStoragePINEdit_lostFocus)
+## self.connect(self.jobStoragePINEdit,SIGNAL("textChanged(const QString&)"),self.jobStoragePINEdit_textChanged)
+## self.connect(self.jobStoragePINDefaultPushButton, SIGNAL("clicked()"), self.jobStoragePINDefaultPushButton_clicked)
+##
+## self.addWidget(widget, "job_storage_pin")
+##
+## def jobStoragePINButtonGroup_clicked(self, a):
+## if a == 0: # Public/Off
+## self.jobStoragePINDefaultPushButton.setEnabled(False)
+## self.jobStoragePINEdit.setEnabled(False)
+## self.job_storage_use_pin = False
+## self.job_storage_pin = u"0000"
+##
+## else: # On/Private/Use PIN
+## self.jobStoragePINDefaultPushButton.setEnabled(True)
+## self.jobStoragePINEdit.setEnabled(True)
+## self.job_storage_use_pin = True
+## self.job_storage_pin = unicode(self.jobStoragePINEdit.text())
+##
+## def jobStoragePINEdit_lostFocus(self):
+## pafss
+##
+## def jobStoragePINEdit_textChanged(self, a):
+## self.job_storage_pin = unicode(a)
+##
+## def jobStoragePINDefaultPushButton_clicked(self):
+## self.jobStoragePINButtonGroup.setButton(0)
+## self.jobStoragePINDefaultPushButton.setEnabled(False)
+## self.jobStoragePINEdit.setEnabled(False)
+## self.job_storage_use_pin = False
+##
+## # Username
+##
+## def addJobStorageUsername(self):
+## widget = self.getWidget()
+##
+## layout39 = QGridLayout(widget,1,1,5,10,"layout39")
+##
+## self.jobStorageUsernameEdit = QLineEdit(widget,"self.jobStorageUsernameEdit")
+## self.jobStorageUsernameEdit.setMaxLength(16)
+## self.jobStorageUsernameEdit.setText(self.job_storage_username)
+## layout39.addWidget(self.jobStorageUsernameEdit,0,3)
+##
+## spacer20_2 = QSpacerItem(20,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+## layout39.addItem(spacer20_2,0,1)
+##
+## textLabel5_2 = QLabel(widget,"textLabel5_2")
+## layout39.addWidget(textLabel5_2,0,0)
+##
+## self.jobStorageUsernameDefaultPushButton = QPushButton(widget,"jobStorageUsernameDefaultPushButton")
+## layout39.addWidget(self.jobStorageUsernameDefaultPushButton,0,4)
+##
+## self.jobStorageUsernameButtonGroup = QButtonGroup(widget,"self.jobStorageUsernameButtonGroup")
+## self.jobStorageUsernameButtonGroup.setLineWidth(0)
+## self.jobStorageUsernameButtonGroup.setColumnLayout(0,Qt.Vertical)
+## self.jobStorageUsernameButtonGroup.layout().setSpacing(0)
+## self.jobStorageUsernameButtonGroup.layout().setMargin(0)
+## self.jobStorageUsernameButtonGroupLayout = QGridLayout(self.jobStorageUsernameButtonGroup.layout())
+## self.jobStorageUsernameButtonGroupLayout.setAlignment(Qt.AlignTop)
+##
+## radioButton3_2 = QRadioButton(self.jobStorageUsernameButtonGroup,"radioButton3_2")
+## radioButton3_2.setChecked(1)
+## self.jobStorageUsernameButtonGroup.insert( radioButton3_2,0)
+## self.jobStorageUsernameButtonGroupLayout.addWidget(radioButton3_2,0,0)
+##
+## radioButton4_2 = QRadioButton(self.jobStorageUsernameButtonGroup,"radioButton4_2")
+## self.jobStorageUsernameButtonGroup.insert( radioButton4_2,1)
+## self.jobStorageUsernameButtonGroupLayout.addWidget(radioButton4_2,0,1)
+##
+## layout39.addWidget(self.jobStorageUsernameButtonGroup,0,2)
+##
+## self.bg = self.jobStorageUsernameEdit.paletteBackgroundColor()
+## self.invalid_page_range = False
+##
+## self.jobStorageUsernameEdit.setValidator(TextValidator(self.jobStorageUsernameEdit))
+##
+## textLabel5_2.setText(self.__tr("User name (for job identification):"))
+## radioButton3_2.setText(self.__tr("Automatic"))
+## radioButton4_2.setText(self.__tr("Custom:"))
+##
+## self.jobStorageUsernameDefaultPushButton.setText(self.__tr("Default"))
+##
+## self.connect(self.jobStorageUsernameButtonGroup, SIGNAL("clicked(int)"), self.jobStorageUsernameButtonGroup_clicked)
+## self.connect(self.jobStorageUsernameEdit,SIGNAL("lostFocus()"),self.jobStorageUsernameEdit_lostFocus)
+## self.connect(self.jobStorageUsernameEdit,SIGNAL("textChanged(const QString&)"),self.jobStorageUsernameEdit_textChanged)
+## self.connect(self.jobStorageUsernameDefaultPushButton, SIGNAL("clicked()"), self.jobStorageUsernameDefaultPushButton_clicked)
+##
+## self.addWidget(widget, "job_storage_username")
+##
+## def jobStorageUsernameButtonGroup_clicked(self, a):
+## if a == 0: # Automatic
+## self.jobStorageUsernameDefaultPushButton.setEnabled(False)
+## self.jobStorageUsernameEdit.setEnabled(False)
+## self.job_storage_auto_username = True
+## self.job_storage_username = unicode(prop.username[:16])
+##
+## else: # Custom
+## self.jobStorageUsernameDefaultPushButton.setEnabled(True)
+## self.jobStorageUsernameEdit.setEnabled(True)
+## self.job_storage_auto_username = False
+## self.job_storage_username = unicode(self.jobStorageUsernameEdit.text())
+##
+## def jobStorageUsernameEdit_lostFocus(saddJobStorageIDelf):
+## pass
+##
+## def jobStorageUsernameEdit_textChanged(self, a):
+## self.job_storage_username = unicode(a)
+##
+## def jobStorageUsernameDefaultPushButton_clicked(self):
+## self.jobStorageUsernameButtonGroup.setButton(0)
+## self.jobStorageUsernameDefaultPushButton.setEnabled(False)
+## self.jobStorageUsernameEdit.setEnabled(False)
+## self.job_storage_auto_username = True
+## self.job_storage_username = unicode(prop.username[:16])
+##
+## # Job ID
+##
+## def addJobStorageID(self):
+## widget = self.getWidget()
+##
+## layout39 = QGridLayout(widget,1,1,5,10,"layout39")
+##
+## self.jobStorageIDEdit = QLineEdit(widget,"self.jobStorageIDEdit")
+## self.jobStorageIDEdit.setMaxLength(16)
+## self.jobStorageIDEdit.setText(self.job_storage_jobname)
+## layout39.addWidget(self.jobStorageIDEdit,0,3)
+##
+## spacer20_2 = QSpacerItem(20,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+## layout39.addItem(spacer20_2,0,1)
+##
+## textLabel5_2 = QLabel(widget,"textLabel5_2")
+## layout39.addWidget(textLabel5_2,0,0)
+##
+## self.jobStorageIDDefaultPushButton = QPushButton(widget,"jobStorageIDDefaultPushButton")
+## layout39.addWidget(self.jobStorageIDDefaultPushButton,0,4)
+##
+## self.jobStorageIDButtonGroup = QButtonGroup(widget,"self.jobStorageIDButtonGroup")
+## self.jobStorageIDButtonGroup.setLineWidth(0)
+## self.jobStorageIDButtonGroup.setColumnLayout(0,Qt.Vertical)
+## self.jobStorageIDButtonGroup.layout().setSpacing(0)
+## self.jobStorageIDButtonGroup.layout().setMargin(0)
+## self.jobStorageIDButtonGroupLayout = QGridLayout(self.jobStorageIDButtonGroup.layout())
+## self.jobStorageIDButtonGroupLayout.setAlignment(Qt.AlignTop)
+##
+## radioButton3_2 = QRadioButton(self.jobStorageIDButtonGroup,"radioButton3_2")
+## radioButton3_2.setChecked(1)
+## self.jobStorageIDButtonGroup.insert( radioButton3_2,0)
+## self.jobStorageIDButtonGroupLayout.addWidget(radioButton3_2,0,0)
+##
+## radioButton4_2 = QRadioButton(self.jobStorageIDButtonGroup,"radioButton4_2")
+## self.jobStorageIDButtonGroup.insert( radioButton4_2,1)
+## self.jobStorageIDButtonGroupLayout.addWidget(radioButton4_2,0,1)
+##
+## layout39.addWidget(self.jobStorageIDButtonGroup,0,2)
+##
+## self.bg = self.jobStorageIDEdit.paletteBackgroundColor()
+## self.invalid_page_range = False
+##
+## self.jobStorageIDEdit.setValidator(TextValidator(self.jobStorageIDEdit))
+##
+## textLabel5_2.setText(self.__tr("Job name (for job identification):"))
+## radioButton3_2.setText(self.__tr("Automatic"))
+## radioButton4_2.setText(self.__tr("Custom:"))
+##
+## self.jobStorageIDDefaultPushButton.setText(self.__tr("Default"))
+##
+## self.connect(self.jobStorageIDButtonGroup, SIGNAL("clicked(int)"), self.jobStorageIDButtonGroup_clicked)
+## self.connect(self.jobStorageIDEdit,SIGNAL("lostFocus()"),self.jobStorageIDEdit_lostFocus)
+## self.connect(self.jobStorageIDEdit,SIGNAL("textChanged(const QString&)"),self.jobStorageIDEdit_textChanged)
+## self.connect(self.jobStorageIDDefaultPushButton, SIGNAL("clicked()"), self.jobStorageIDDefaultPushButton_clicked)
+##
+## self.addWidget(widget, "job_storage_ID")
+##
+## def jobStorageIDButtonGroup_clicked(self, a):
+## if a == 0: # Automatic
+## self.jobStorageIDDefaultPushButton.setEnabled(False)
+## self.jobStorageIDEdit.setEnabled(False)
+## self.job_storage_auto_jobname = True
+## self.job_storage_jobname = unicode(time.strftime("%a, %d %b %Y %H:%M:%S"))
+##
+## else: # Custom
+## self.jobStorageIDDefaultPushButton.setEnabled(True)
+## self.jobStorageIDEdit.setEnabled(True)
+## self.job_storage_auto_jobname = False
+## self.job_storage_jobname = unicode(self.jobStorageIDEdit.text())
+##
+## def jobStorageIDEdit_lostFocus(self):
+## pass
+##
+## def jobStorageIDEdit_textChanged(self, a):
+## self.job_storage_jobname = unicode(a)
+##
+## def jobStorageIDDefaultPushButton_clicked(self):
+## self.jobStorageIDButtonGroup.setButton(0)
+## self.jobStorageIDDefaultPushButton.setEnabled(False)
+## self.jobStorageIDEdit.setEnabled(False)
+## self.job_storage_auto_jobname = True
+## self.job_storage_jobname = unicode(time.strftime("%a, %d %b %Y %H:%M:%S"))
+##
+## # Job ID Exists
+##
+## def addJobStorageIDExists(self):
+## widget = self.getWidget()
+##
+## layout34 = QHBoxLayout(widget,5,10,"layout34")
+##
+## self.jobStorageIDExistsLabel = QLabel(widget,"jobStorageIDExistsLabel")
+## layout34.addWidget(self.jobStorageIDExistsLabel)
+## spacer20_4 = QSpacerItem(20,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+## layout34.addItem(spacer20_4)
+##
+## self.jobStorageIDExistsComboBox = QComboBox(0,widget,"jobStorageIDExistsComboBox")
+## layout34.addWidget(self.jobStorageIDExistsComboBox)
+##
+## self.jobStorageIDExistsDefaultPushButton = QPushButton(widget,"pagesetDefaultPushButton")
+## layout34.addWidget(self.jobStorageIDExistsDefaultPushButton)
+##
+## self.jobStorageIDExistsLabel.setText(self.__tr("If Job Name already exists:"))
+## self.jobStorageIDExistsComboBox.clear()
+## self.jobStorageIDExistsComboBox.insertItem(self.__tr("Replace existing job"))
+## self.jobStorageIDExistsComboBox.insertItem(self.__tr("Use Job Name + (1-99)"))
+##
+## self.jobStorageIDExistsDefaultPushButton.setText(self.__tr("Default"))
+##
+## self.connect(self.jobStorageIDExistsComboBox, SIGNAL("activated(int)"), self.jobStorageIDExistsComboBox_activated)
+## self.connect(self.jobStorageIDExistsDefaultPushButton, SIGNAL("clicked()"), self.jobStorageIDExistsDefaultPushButton_clicked)
+##
+## self.addWidget(widget, "job_storage_id_exists")
+##
+## def jobStorageIDExistsComboBox_activated(self, a):
+## self.jobStorageIDExistsDefaultPushButton.setEnabled(a==1)
+## self.job_storage_job_exist = a
+##
+## def jobStorageIDExistsDefaultPushButton_clicked(self):
+## self.jobStorageIDExistsComboBox.setCurrentItem(0)
+## self.jobStorageIDExistsDefaultPushButton.setEnabled(False)
+## self.job_storage_job_exist = 0
+##
+##
+## #
+## #
+## #
+
+ def printButton_clicked(self):
+ if self.invalid_page_range:
+ self.form.FailureUI(self.__tr("<b>Cannot print: Invalid page range: %1</b><p>A valid page range is a list of pages or ranges of pages separated by commas (e.g., 1-2,4,6-7)").arg(self.pageRangeEdit.text()))
+ return
+
+ try:
+ try:
+ self.cur_device.open()
+ except Error:
+ self.form.FailureUI(self.__tr("<b>Cannot print: Device is busy or not available.</b><p>Please check device and try again."))
+ return
+
+ if 1: # Go ahead and allow - print will be queued in CUPS if not rejecting
+ printers = cups.getPrinters()
+ for p in printers:
+ if p.name == self.cur_printer:
+ break
+
+ if p.state == cups.IPP_PRINTER_STATE_STOPPED:
+ self.form.FailureUI(self.__tr("<b>Cannot print: Printer is stopped.</b><p>Please START the printer to continue this print. Job will begin printing once printer is started."))
+
+ if not p.accepting:
+ self.form.FailureUI(self.__tr("<b>Cannot print: Printer is not accepting jobs.</b><p>Please set the printer to ACCEPTING JOBS to continue printing."))
+ return
+
+ copies = int(self.copiesSpinBox.value())
+ all_pages = self.pages_button_group == 0
+ page_range = unicode(self.pageRangeEdit.text())
+ page_set = int(self.pageSetComboBox.currentItem())
+
+ cups.resetOptions()
+ cups.openPPD(self.cur_printer)
+ current_options = dict(cups.getOptions())
+ cups.closePPD()
+
+ nup = int(current_options.get("number-up", 1))
+ log.debug("number-up = %d" % nup)
+
+ for p, t, d in self.file_list:
+
+ alt_nup = (nup > 1 and t == 'application/postscript' and utils.which('psnup'))
+
+ if utils.which('lpr'):
+ if alt_nup:
+ cmd = ' '.join(['psnup', '-%d' % nup, ''.join(['"', p, '"']), '| lpr -P', self.cur_printer])
+ else:
+ cmd = ' '.join(['lpr -P', self.cur_printer])
+
+ if copies > 1:
+ cmd = ' '.join([cmd, '-#%d' % copies])
+
+ else:
+ if alt_nup:
+ cmd = ' '.join(['psnup', '-%d' % nup, ''.join(['"', p, '"']), '| lp -c -d', self.cur_printer])
+ else:
+ cmd = ' '.join(['lp -c -d', self.cur_printer])
+
+ if copies > 1:
+ cmd = ' '.join([cmd, '-n%d' % copies])
+
+
+ if not all_pages and len(page_range) > 0:
+ cmd = ' '.join([cmd, '-o page-ranges=%s' % page_range])
+
+ if page_set > 0:
+ if page_set == 1:
+ cmd = ' '.join([cmd, '-o page-set=even'])
+ else:
+ cmd = ' '.join([cmd, '-o page-set=odd'])
+
+
+ # Job Storage
+ # self.job_storage_mode = (0=Off, 1=P&H, 2=PJ, 3=QC, 4=SJ)
+ # self.job_storage_pin = u"" (dddd)
+ # self.job_storage_use_pin = True|False
+ # self.job_storage_username = u""
+ # self.job_storage_auto_username = True|False
+ # self.job_storage_jobname = u""
+ # self.job_storage_auto_jobname = True|False
+ # self.job_storage_job_exist = (0=replace, 1=job name+(1-99))
+
+ if self.job_storage_avail:
+ if self.job_storage_mode: # On
+
+ if self.job_storage_mode == 1: # Proof and Hold
+ cmd = ' '.join([cmd, '-o HOLD=PROOF'])
+
+ elif self.job_storage_mode == 2: # Private Job
+ if self.job_storage_use_pin:
+ cmd = ' '.join([cmd, '-o HOLD=ON'])
+ cmd = ' '.join([cmd, '-o HOLDTYPE=PRIVATE'])
+ cmd = ' '.join([cmd, '-o HOLDKEY=%s' % self.job_storage_pin.encode('ascii')])
+ else:
+ cmd = ' '.join([cmd, '-o HOLD=PROOF'])
+ cmd = ' '.join([cmd, '-o HOLDTYPE=PRIVATE'])
+
+ elif self.job_storage_mode == 3: # Quick Copy
+ cmd = ' '.join([cmd, '-o HOLD=ON'])
+ cmd = ' '.join([cmd, '-o HOLDTYPE=PUBLIC'])
+
+ elif self.job_storage_mode == 4: # Store Job
+ if self.job_storage_use_pin:
+ cmd = ' '.join([cmd, '-o HOLD=STORE'])
+ cmd = ' '.join([cmd, '-o HOLDTYPE=PRIVATE'])
+ cmd = ' '.join([cmd, '-o HOLDKEY=%s' % self.job_storage_pin.encode('ascii')])
+ else:
+ cmd = ' '.join([cmd, '-o HOLD=STORE'])
+
+ cmd = ' '.join([cmd, '-o USERNAME=%s' % self.job_storage_username.encode('ascii')\
+ .replace(" ", "_")])
+
+ cmd = ' '.join([cmd, '-o JOBNAME=%s' % self.job_storage_jobname.encode('ascii')\
+ .replace(" ", "_")])
+
+ if self.job_storage_job_exist == 1:
+ cmd = ' '.join([cmd, '-o DUPLICATEJOB=APPEND'])
+ else:
+ cmd = ' '.join([cmd, '-o DUPLICATEJOB=REPLACE'])
+
+ else: # Off
+ cmd = ' '.join([cmd, '-o HOLD=OFF'])
+
+
+ if not alt_nup:
+ cmd = ''.join([cmd, ' "', p, '"'])
+
+ log.debug("Printing: %s" % cmd)
+
+ code = os.system(cmd)
+ if code != 0:
+ log.error("Print command failed.")
+ self.form.FailureUI(self.__tr("Print command failed with error code %1").arg(code))
+
+ self.form.close()
+
+ finally:
+ self.cur_device.close()
+
+ def funcButton_clicked(self):
+ self.form.close()
+
+ def __tr(self,s,c = None):
+ return qApp.translate("ScrollPrintView",s,c)
diff --git a/ui/scrollprintsettings.py b/ui/scrollprintsettings.py
new file mode 100644
index 0000000..5b878cc
--- /dev/null
+++ b/ui/scrollprintsettings.py
@@ -0,0 +1,1069 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2001-2007 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch, Yashwant Kumar Sahu
+#
+
+# Local
+from base.g import *
+from base import utils
+from prnt import cups
+from jobstoragemixin import JobStorageMixin
+
+# Qt
+from qt import *
+from scrollview import ScrollView
+
+# Std Lib
+import os.path
+import os
+
+
+class RangeValidator(QValidator):
+ def __init__(self, parent=None, name=None):
+ QValidator.__init__(self, parent, name)
+
+ def validate(self, input, pos):
+ for x in unicode(input)[pos-1:]:
+ if x not in u'0123456789,- ':
+ return QValidator.Invalid, pos
+
+ return QValidator.Acceptable, pos
+
+
+class OptionComboBox(QComboBox):
+ def __init__(self, rw, parent, name, group, option, choices, default, typ=cups.PPD_UI_PICKONE, other=None):
+ QComboBox.__init__(self, rw, parent, name)
+ self.group = group
+ self.option = option
+ self.choices = choices
+ self.default = default
+ self.typ = typ
+ self.other = other
+
+ def setDefaultPushbutton(self, pushbutton):
+ self.pushbutton = pushbutton
+
+ def setOther(self, other):
+ self.other = other
+
+
+class OptionSpinBox(QSpinBox):
+ def __init__(self, parent, name, group, option, default):
+ QSpinBox.__init__(self, parent, name)
+ self.group = group
+ self.option = option
+ self.default = default
+
+ def setDefaultPushbutton(self, pushbutton):
+ self.pushbutton = pushbutton
+
+
+class OptionButtonGroup(QButtonGroup):
+ def __init__(self, parent, name, group, option, default):
+ QButtonGroup.__init__(self, parent, name)
+ self.group = group
+ self.option = option
+ self.default = default
+
+ def setDefaultPushbutton(self, pushbutton):
+ self.pushbutton = pushbutton
+
+
+class DefaultPushButton(QPushButton):
+ def __init__(self, parent, name, group, option, choices, default, control, typ):
+ QPushButton.__init__(self, parent, name)
+ self.group = group
+ self.option = option
+ self.default = default
+ self.control = control
+ self.typ = typ
+ self.choices = choices
+
+
+
+class ScrollPrintSettingsView(ScrollView):
+ utils.mixin(JobStorageMixin)
+
+ def __init__(self, service, parent=None, name=None, fl=0):
+ ScrollView.__init__(self, service, parent, name, fl)
+
+ self.initJobStorage(True)
+
+
+
+ def fillControls(self):
+ QApplication.setOverrideCursor(QApplication.waitCursor)
+
+ ScrollView.fillControls(self)
+
+ self.loading = True
+ cups.resetOptions()
+ cups.openPPD(self.cur_printer)
+ cur_outputmode = ""
+
+ #if 1:
+ try:
+ if 1:
+ #try:
+ current_options = dict(cups.getOptions())
+
+ if not self.cur_device.device_type == DEVICE_TYPE_FAX:
+ self.addGroupHeading("basic", self.__tr("Basic"))
+ log.debug("Group: Basic")
+
+ # Basic
+ # PageSize (in PPD section)
+ # orientation-requested
+ # sides
+ # outputorder
+ # Collate
+
+
+ current = current_options.get('orientation-requested', '3')
+
+ self.addItem("basic", "orientation-requested", self.__tr("Page Orientation"),
+ cups.PPD_UI_PICKONE, current,
+ [('3', self.__tr('Portrait')),
+ ('4', self.__tr('Landscape')),
+ ('5', self.__tr('Reverse landscape')),
+ ('6', self.__tr('Reverse portrait'))], '3')
+
+ log.debug("Option: orientation-requested")
+ log.debug("Current value: %s" % current)
+
+ duplexer = self.cur_device.dq.get('duplexer', 0)
+ log.debug("Duplexer = %d" % duplexer)
+
+ if duplexer:
+ current = current_options.get('sides', 'one-sided')
+ self.addItem("basic", "sides",
+ self.__tr("Duplex (Print on both sides of the page)"),
+ cups.PPD_UI_PICKONE, current,
+ [('one-sided',self.__tr('Single sided')),
+ ('two-sided-long-edge', self.__tr('Two sided (long edge)')),
+ ('two-sided-short-edge', self.__tr('Two sided (short edge)'))], 'one-sided')
+
+ log.debug("Option: sides")
+ log.debug("Current value: %s" % current)
+
+ current = current_options.get('outputorder', 'normal')
+
+ self.addItem("basic", "outputorder",
+ self.__tr("Output Order (Print last page first)"),
+ cups.PPD_UI_PICKONE, current,
+ [('normal', self.__tr('Normal (Print first page first)')),
+ ('reverse', self.__tr('Reversed (Print last page first)'))], 'normal')
+
+ log.debug("Option: outputorder")
+ log.debug("Current value: %s" % current)
+
+ current = utils.to_bool(current_options.get('Collate', '0'))
+
+ self.addItem("basic", "Collate",
+ self.__tr("Collate (Group together multiple copies)"),
+ cups.PPD_UI_BOOLEAN, current,
+ [], 0)
+
+ log.debug("Option: Collate")
+ log.debug("Current value: %s" % current)
+
+ groups = cups.getGroupList()
+
+ for g in groups:
+ log.debug("Group: %s" % repr(g))
+
+ if 'jobretention' in g.lower():
+ log.debug("HPJobRetention skipped.")
+ continue
+
+ text, num_subgroups = cups.getGroup(g)
+ read_only = 'install' in g.lower()
+
+ try:
+ text = text.decode('utf-8')
+ except UnicodeDecodeError:
+ pass
+
+ if g.lower() == 'printoutmode':
+ text = self.__tr("Quality")
+
+ self.addGroupHeading(g, text, read_only)
+
+ log.debug(" Text: %s" % repr(text))
+ log.debug("Num subgroups: %d" % num_subgroups)
+
+ options = cups.getOptionList(g)
+
+ for o in options:
+ log.debug(" Option: %s" % repr(o))
+
+ if 'pageregion' in o.lower():
+ log.debug("Page Region skipped.")
+ continue
+
+
+
+ option_text, defchoice, conflicted, ui = cups.getOption(g, o)
+
+ try:
+ option_text = option_text.decode('utf-8')
+ except UnicodeDecodeError:
+ pass
+
+ if o.lower() == 'quality':
+ option_text = self.__tr("Quality")
+
+ log.debug(" Text: %s" % repr(option_text))
+ log.debug(" Defchoice: %s" % repr(defchoice))
+
+ choices = cups.getChoiceList(g, o)
+
+ value = None
+ choice_data = []
+ for c in choices:
+ log.debug(" Choice: %s" % repr(c))
+
+ # TODO: Add custom paper size controls
+ if 'pagesize' in o.lower() and 'custom' in c.lower():
+ log.debug("Skipped.")
+ continue
+
+ choice_text, marked = cups.getChoice(g, o, c)
+
+ try:
+ choice_text = choice_text.decode('utf-8')
+ except UnicodeDecodeError:
+ pass
+
+ log.debug(" Text: %s" % repr(choice_text))
+
+ if marked:
+ value = c
+
+ choice_data.append((c, choice_text))
+
+ if o.lower() == 'outputmode':
+ if value is not None:
+ cur_outputmode = value
+ else:
+ cur_outputmode = defchoice
+
+ self.addItem(g, o, option_text, ui, value, choice_data, defchoice, read_only)
+
+## if 'pagesize' in o.lower(): # and 'custom' in c.lower():
+## current = 0.0
+## width_widget = self.addItem("custom", "custom-width", self.__tr("Custom Paper Width"), cups.UI_UNITS_SPINNER,
+## current, (0.0, 0.0), 0.0)
+##
+## current = 0.0
+## height_widget = self.addItem("custom", "custom-height", self.__tr("Custom Paper Height"), cups.UI_UNITS_SPINNER,
+## current, (0.0, 0.0), 0.0)
+##
+## if value.lower() == 'custom':
+## pass
+
+ # N-Up
+ # number-up
+ # number-up-layout
+ # page-border
+
+ self.addGroupHeading("nup",
+ self.__tr("N-Up (Multiple document pages per printed page)"))
+
+ log.debug("Group: N-Up")
+
+ current = current_options.get('number-up', '1')
+
+ self.addItem("nup", "number-up", self.__tr("Pages per Sheet"),
+ cups.PPD_UI_PICKONE, current,
+ [('1', self.__tr('1 page per sheet')),
+ ('2', self.__tr('2 pages per sheet')),
+ ('4', self.__tr('4 pages per sheet'))], '1')
+
+ log.debug(" Option: number-up")
+ log.debug(" Current value: %s" % current)
+
+ current = current_options.get('number-up-layout', 'lrtb')
+
+ self.addItem("nup", "number-up-layout", self.__tr("Layout"),
+ cups.PPD_UI_PICKONE, current,
+ [('btlr', self.__tr('Bottom to top, left to right')),
+ ('btrl', self.__tr('Bottom to top, right to left')),
+ ('lrbt', self.__tr('Left to right, bottom to top')),
+ ('lrtb', self.__tr('Left to right, top to bottom')),
+ ('rlbt', self.__tr('Right to left, bottom to top')),
+ ('rltb', self.__tr('Right to left, top to bottom')),
+ ('tblr', self.__tr('Top to bottom, left to right')),
+ ('tbrl', self.__tr('Top to bottom, right to left')) ], 'lrtb')
+
+ log.debug(" Option: number-up-layout")
+ log.debug(" Current value: %s" % current)
+
+ current = current_options.get('page-border', 'none')
+
+ self.addItem("nup", "page-border",
+ self.__tr("Printed Border Around Each Page"),
+ cups.PPD_UI_PICKONE, current,
+ [('double', self.__tr("Two thin borders")),
+ ("double-thick", self.__tr("Two thick borders")),
+ ("none", self.__tr("No border")),
+ ("single", self.__tr("One thin border")),
+ ("single-thick", self.__tr("One thick border"))], 'none')
+
+ log.debug(" Option: page-border")
+ log.debug(" Current value: %s" % current)
+
+ # Adjustment
+ # brightness
+ # gamma
+
+ if not self.cur_device.device_type == DEVICE_TYPE_FAX:
+ self.addGroupHeading("adjustment", self.__tr("Printout Appearance"))
+
+ current = int(current_options.get('brightness', 100))
+
+ log.debug(" Option: brightness")
+ log.debug(" Current value: %s" % current)
+
+ self.addItem("adjustment", "brightness", self.__tr("Brightness"),
+ cups.UI_SPINNER, current, (0, 200), 100, suffix=" %")
+
+ current = int(current_options.get('gamma', 1000))
+
+ log.debug(" Option: gamma")
+ log.debug(" Current value: %s" % current)
+
+ self.addItem("adjustment", "gamma", self.__tr("Gamma"), cups.UI_SPINNER, current,
+ (1, 10000), 1000)
+
+ # Margins (pts)
+ # page-left
+ # page-right
+ # page-top
+ # page-bottom
+
+## if 0:
+## # TODO: cupsPPDPageSize() fails on LaserJets. How do we get margins in this case? Defaults?
+## # PPD file for LJs has a HWMargin entry...
+## page, page_width, page_len, left, bottom, right, top = cups.getPPDPageSize()
+##
+## right = page_width - right
+## top = page_len - top
+##
+## self.addGroupHeading("margins", self.__tr("Margins"))
+## current_top = current_options.get('page-top', 0) # pts
+## current_bottom = current_options.get('page-bottom', 0) # pts
+## current_left = current_options.get('page-left', 0) # pts
+## current_right = current_options.get('page-right', 0) # pts
+##
+## log.debug(" Option: page-top")
+## log.debug(" Current value: %s" % current_top)
+##
+## self.addItem("margins", "page-top", self.__tr("Top margin"),
+## cups.UI_UNITS_SPINNER, current_top,
+## (0, page_len), top)
+##
+## self.addItem("margins", "page-bottom", self.__tr("Bottom margin"),
+## cups.UI_UNITS_SPINNER, current_bottom,
+## (0, page_len), bottom)
+##
+## self.addItem("margins", "page-left", self.__tr("Right margin"),
+## cups.UI_UNITS_SPINNER, current_left,
+## (0, page_width), left)
+##
+## self.addItem("margins", "page-right", self.__tr("Left margin"),
+## cups.UI_UNITS_SPINNER, current_right,
+## (0, page_width), right)
+
+ # Image Printing
+ # position
+ # natural-scaling
+ # saturation
+ # hue
+
+ self.addGroupHeading("image", self.__tr("Image Printing"))
+
+ current = utils.to_bool(current_options.get('fitplot', 'false'))
+
+ self.addItem("image", "fitplot",
+ self.__tr("Fit to Page"),
+ cups.PPD_UI_BOOLEAN, current,
+ [], 0)
+
+
+ current = current_options.get('position', 'center')
+
+ self.addItem("image", "position", self.__tr("Position on Page"),
+ cups.PPD_UI_PICKONE, current,
+ [('center', self.__tr('Centered')),
+ ('top', self.__tr('Top')),
+ ('left', self.__tr('Left')),
+ ('right', self.__tr('Right')),
+ ('top-left', self.__tr('Top left')),
+ ('top-right', self.__tr('Top right')),
+ ('bottom', self.__tr('Bottom')),
+ ('bottom-left', self.__tr('Bottom left')),
+ ('bottom-right', self.__tr('Bottom right'))], 'center')
+
+ log.debug(" Option: position")
+ log.debug(" Current value: %s" % current)
+
+ if not self.cur_device.device_type == DEVICE_TYPE_FAX:
+ current = int(current_options.get('saturation', 100))
+
+ log.debug(" Option: saturation")
+ log.debug(" Current value: %s" % current)
+
+ self.addItem("image", "saturation", self.__tr("Saturation"),
+ cups.UI_SPINNER, current, (0, 200), 100, suffix=" %")
+
+ current = int(current_options.get('hue', 0))
+
+ log.debug(" Option: hue")
+ log.debug(" Current value: %s" % current)
+
+ self.addItem("image", "hue", self.__tr("Hue (color shift/rotation)"),
+ cups.UI_SPINNER, current,
+ (-100, 100), 0)
+
+ current = int(current_options.get('natural-scaling', 100))
+
+ log.debug(" Option: natural-scaling")
+ log.debug(" Current value: %s" % current)
+
+ self.addItem("image", "natural-scaling",
+ self.__tr('"Natural" Scaling (relative to image)'),
+ cups.UI_SPINNER, current, (1, 800), 100, suffix=" %")
+
+ current = int(current_options.get('scaling', 100))
+
+ log.debug(" Option: scaling")
+ log.debug(" Current value: %s" % current)
+
+ self.addItem("image", "scaling", self.__tr("Scaling (relative to page)"),
+ cups.UI_SPINNER, current,
+ (1, 800), 100, suffix=" %")
+
+ # Misc
+ # PrettyPrint
+ # job-sheets
+ # mirror
+
+ self.addGroupHeading("misc", self.__tr("Miscellaneous"))
+
+ log.debug("Group: Misc")
+
+ current = utils.to_bool(current_options.get('prettyprint', '0'))
+
+ self.addItem("misc", "prettyprint",
+ self.__tr('"Pretty Print" Text Documents (Add headers and formatting)'),
+ cups.PPD_UI_BOOLEAN, current, [], 0)
+
+ log.debug(" Option: prettyprint")
+ log.debug(" Current value: %s" % current)
+
+ if not self.cur_device.device_type == DEVICE_TYPE_FAX:
+ current = current_options.get('job-sheets', 'none').split(',')
+
+ try:
+ start = current[0]
+ except IndexError:
+ start = 'none'
+
+ try:
+ end = current[1]
+ except IndexError:
+ end = 'none'
+
+ # TODO: Look for locally installed banner pages beyond the default CUPS ones?
+ self.addItem("misc", "job-sheets", self.__tr("Banner Pages"), cups.UI_BANNER_JOB_SHEETS,
+ (start, end),
+ [("none", self.__tr("No banner page")),
+ ('classified', self.__tr("Classified")),
+ ('confidential', self.__tr("Confidential")),
+ ('secret', self.__tr("Secret")),
+ ('standard', self.__tr("Standard")),
+ ('topsecret', self.__tr("Top secret")),
+ ('unclassified', self.__tr("Unclassified"))], ('none', 'none'))
+
+ log.debug(" Option: job-sheets")
+ log.debug(" Current value: %s,%s" % (start, end))
+
+ current = utils.to_bool(current_options.get('mirror', '0'))
+
+ self.addItem("misc", "mirror", self.__tr('Mirror Printing'),
+ cups.PPD_UI_BOOLEAN, current, [], 0)
+
+ log.debug(" Option: mirror")
+ log.debug(" Current value: %s" % current)
+
+ #Summary
+ #color input
+ #quality
+ quality_attr_name = "OutputModeDPI"
+ cur_outputmode_dpi = cups.findPPDAttribute(quality_attr_name, cur_outputmode)
+ if cur_outputmode_dpi is not None:
+ log.debug("Adding Group: Summary outputmode is : %s" % cur_outputmode)
+ log.debug("Adding Group: Summary outputmode dpi is : %s" % unicode (cur_outputmode_dpi))
+ self.addGroupHeading("summry", self.__tr("Summary"))
+ self.addItem("summry", "colorinput", self.__tr('Color Input / Black Render'),
+ cups.UI_INFO, cur_outputmode_dpi, [], 0)
+ self.addItem("summry", "quality", self.__tr('Print Quality'),
+ cups.UI_INFO, cur_outputmode, [], 0)
+
+ self.job_storage_avail = self.cur_device.mq['job-storage'] == JOB_STORAGE_ENABLE
+
+ #print current_options
+
+ if self.job_storage_avail:
+ self.addGroupHeading("jobstorage", self.__tr("Job Storage and Secure Printing"))
+ self.addJobStorage(current_options)
+
+
+ #except Exception, e:
+ #log.exception()
+ # pass
+
+ finally:
+ cups.closePPD()
+ self.loading = False
+ QApplication.restoreOverrideCursor()
+
+ def ComboBox_indexChanged(self, currentItem):
+ sender = self.sender()
+ currentItem = unicode(currentItem)
+ # Checking for summary control
+ labelPQValaue = getattr(self, 'PQValueLabel', None)
+ labelPQColorInput = getattr(self, 'PQColorInputLabel', None)
+ # When output mode combo item is changed, we need to update the summary information
+ if currentItem is not None and sender.option == 'OutputMode' and labelPQValaue is not None and labelPQColorInput is not None:
+ # Setting output mode
+ self.PQValueLabel.setText(currentItem)
+
+ # Getting DPI custom attributefrom the PPD
+ # Setting color input
+ quality_attr_name = "OutputModeDPI"
+ cups.openPPD(self.cur_printer)
+ outputmode_dpi = cups.findPPDAttribute(quality_attr_name, currentItem)
+ log.debug("Outputmode changed, setting outputmode_dpi: %s" % outputmode_dpi)
+ cups.closePPD()
+ self.PQColorInputLabel.setText(outputmode_dpi)
+
+ log.debug("Outputmode changed, setting value outputmode: %s" % currentItem)
+
+ def optionComboBox_activated(self, a):
+ a = unicode(a)
+ sender = self.sender()
+ choice = None
+
+ if sender.typ == cups.UI_BANNER_JOB_SHEETS:
+ start, end = None, None
+ for c, t in sender.choices:
+ if t == a:
+ start = c
+ break
+
+ for c, t in sender.other.choices:
+ if t == sender.other.currentText():
+ end = c
+ break
+
+ if sender.option == 'end':
+ start, end = end, start
+
+ if start is not None and \
+ end is not None and \
+ start.lower() == sender.default[0].lower() and \
+ end.lower() == sender.default[1].lower():
+ self.removePrinterOption('job-sheets')
+ sender.pushbutton.setEnabled(False)
+ else:
+ sender.pushbutton.setEnabled(True)
+
+ if start is not None and \
+ end is not None:
+
+ self.setPrinterOption('job-sheets', ','.join([start, end]))
+
+ else:
+ choice = None
+ for c, t in sender.choices:
+ if t == a:
+ choice = c
+ break
+
+ if choice is not None and choice.lower() == sender.default.lower():
+ self.removePrinterOption(sender.option)
+ sender.pushbutton.setEnabled(False)
+ else:
+ sender.pushbutton.setEnabled(True)
+
+ if choice is not None:
+ self.setPrinterOption(sender.option, choice)
+
+ self.linkPrintoutModeAndQuality(sender.option, choice)
+
+
+ def linkPrintoutModeAndQuality(self, option, choice):
+ if option.lower() == 'quality' and \
+ choice is not None:
+
+ try:
+ c = self.items['o:PrintoutMode'].control
+ except KeyError:
+ return
+ else:
+ if c is not None:
+ if choice.lower() == 'fromprintoutmode':
+ # from printoutmode selected
+ # determine printoutmode option combo enable state
+ c.setEnabled(True)
+ QToolTip.remove(c)
+ a = unicode(c.currentText())
+
+ # determine printoutmode default button state
+ link_choice = None
+ for x, t in c.choices:
+ if t == a:
+ link_choice = x
+ break
+
+ if link_choice is not None and \
+ link_choice.lower() == c.default.lower():
+
+ c.pushbutton.setEnabled(False)
+ else:
+ c.pushbutton.setEnabled(True)
+
+ else: # fromprintoutmode not selected, disable printoutmode
+ c.setEnabled(False)
+ QToolTip.add(c, self.__tr("""Set Quality to "Controlled by 'Printout Mode'" to enable."""))
+ c.pushbutton.setEnabled(False)
+
+
+
+ def optionSpinBox_valueChanged(self, i):
+ sender = self.sender()
+
+ if i == sender.default:
+ self.removePrinterOption(sender.option)
+ sender.pushbutton.setEnabled(False)
+ else:
+ sender.pushbutton.setEnabled(True)
+ self.setPrinterOption(sender.option, str(i))
+
+
+ def optionButtonGroup_clicked(self, b):
+ sender = self.sender()
+ b = int(b)
+
+ if b == sender.default:
+ self.removePrinterOption(sender.option)
+ sender.pushbutton.setEnabled(False)
+ else:
+ sender.pushbutton.setEnabled(True)
+
+ if b:
+ self.setPrinterOption(sender.option, "true")
+ else:
+ self.setPrinterOption(sender.option, "false")
+
+
+
+ def defaultPushButton_clicked(self):
+ sender = self.sender()
+ sender.setEnabled(False)
+
+ if sender.typ == cups.PPD_UI_BOOLEAN:
+ if sender.default:
+ sender.control.setButton(1)
+ else:
+ sender.control.setButton(0)
+
+ self.removePrinterOption(sender.option)
+
+ elif sender.typ == cups.PPD_UI_PICKONE:
+ choice, text = None, None
+
+ for c, t in sender.choices:
+ if c == sender.default:
+ choice = c
+ text = t
+ break
+
+ if choice is not None:
+ self.removePrinterOption(sender.option)
+ sender.control.setCurrentText(text)
+
+ self.linkPrintoutModeAndQuality(sender.option, choice)
+
+ elif sender.typ == cups.UI_SPINNER:
+ sender.control.setValue(sender.default)
+ self.removePrinterOption(sender.option)
+
+ elif sender.typ == cups.UI_BANNER_JOB_SHEETS:
+ start, end, start_text, end_text = None, None, None, None
+ for c, t in sender.choices:
+ if c == sender.default[0]:
+ start = c
+ start_text = t
+
+ if c == sender.default[1]:
+ end = c
+ end_text = t
+
+ if start is not None:
+ sender.control[0].setCurrentText(start_text)
+
+ if end is not None:
+ sender.control[1].setCurrentText(end_text)
+
+ self.removePrinterOption('job-sheets')
+
+
+ def setPrinterOption(self, option, value):
+ cups.openPPD(self.cur_printer)
+
+ try:
+ cups.addOption("%s=%s" % (option, value))
+ cups.setOptions()
+ finally:
+ cups.closePPD()
+
+ def removePrinterOption(self, option):
+ cups.openPPD(self.cur_printer)
+
+ try:
+ cups.removeOption(option)
+ cups.setOptions()
+ finally:
+ cups.closePPD()
+
+
+ def addItem(self, group, option, text, typ, value, choices, default, read_only=False, suffix=""):
+ widget, control = None, None
+
+ if typ == cups.PPD_UI_BOOLEAN: # () On (*) Off widget
+ widget = self.getWidget()
+ layout = QGridLayout(widget, 1, 1, 5, 10, "layout")
+ default = int(utils.to_bool(str(default)))
+ value = int(utils.to_bool(str(value)))
+
+ textLabel1 = QLabel(widget, "textLabel1")
+ layout.addWidget(textLabel1, 0, 0)
+
+ buttonGroup = OptionButtonGroup(widget, "buttonGroup", group, option, default)
+ buttonGroup.setLineWidth(0)
+ buttonGroup.setColumnLayout(0,Qt.Vertical)
+ buttonGroup.layout().setSpacing(1)
+ buttonGroup.layout().setMargin(5)
+ buttonGroupLayout = QHBoxLayout(buttonGroup.layout())
+ buttonGroupLayout.setAlignment(Qt.AlignTop)
+
+ defaultPushButton = DefaultPushButton(widget,"defaultPushButton", group, option,
+ choices, default, buttonGroup, typ)
+
+ buttonGroup.setDefaultPushbutton(defaultPushButton)
+
+ layout.addWidget(defaultPushButton, 0, 3)
+
+ spacer1 = QSpacerItem(20, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
+ layout.addItem(spacer1, 0, 1)
+
+ onRadioButton = QRadioButton(buttonGroup,"onRadioButton")
+ buttonGroup.insert(onRadioButton, 1)
+ buttonGroupLayout.addWidget(onRadioButton)
+
+ offRadioButton = QRadioButton(buttonGroup,"offRadioButton")
+ buttonGroup.insert(offRadioButton, 0)
+ buttonGroupLayout.addWidget(offRadioButton)
+
+ layout.addWidget(buttonGroup, 0, 2)
+
+ textLabel1.setText(text)
+ onRadioButton.setText(self.__tr("On"))
+ offRadioButton.setText(self.__tr("Off"))
+
+ if value == default:
+ defaultPushButton.setEnabled(False)
+
+ self.connect(defaultPushButton, SIGNAL("clicked()"), self.defaultPushButton_clicked)
+ self.connect(buttonGroup, SIGNAL("clicked(int)"), self.optionButtonGroup_clicked)
+
+ x = self.__tr('Off')
+ if default:
+ x = self.__tr('On')
+
+ if value:
+ buttonGroup.setButton(1)
+ else:
+ buttonGroup.setButton(0)
+
+ if read_only:
+ onRadioButton.setEnabled(False)
+ offRadioButton.setEnabled(False)
+ defaultPushButton.setEnabled(False)
+ else:
+ QToolTip.add(defaultPushButton, self.__tr('Set to default value of "%1".').arg(x))
+
+ defaultPushButton.setText("Default")
+
+ elif typ == cups.PPD_UI_PICKONE: # Combo box widget
+ widget = self.getWidget()
+
+ layout1 = QHBoxLayout(widget,5,10,"layout1")
+
+ textLabel1 = QLabel(widget,"textLabel1")
+ layout1.addWidget(textLabel1)
+
+ spacer1 = QSpacerItem(20, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
+ layout1.addItem(spacer1)
+
+ optionComboBox = OptionComboBox(0, widget, "optionComboBox", group, option, choices, default)
+ layout1.addWidget(optionComboBox)
+
+ defaultPushButton = DefaultPushButton(widget,"defaultPushButton", group, option,
+ choices, default, optionComboBox, typ)
+
+ optionComboBox.setDefaultPushbutton(defaultPushButton)
+
+ layout1.addWidget(defaultPushButton)
+
+ textLabel1.setText(text)
+ defaultPushButton.setText("Default")
+
+ x, y = None, None
+ for c, t in choices:
+ d = c.lower()
+ if value is not None and d == value.lower():
+ x = t
+
+ if d == default.lower():
+ y = t
+
+ optionComboBox.insertItem(t)
+
+ if x is not None:
+ optionComboBox.setCurrentText(x)
+
+ if value is not None and value.lower() == default.lower():
+ defaultPushButton.setEnabled(False)
+
+ self.linkPrintoutModeAndQuality(option, value)
+
+ if read_only:
+ optionComboBox.setEnabled(False)
+ defaultPushButton.setEnabled(False)
+ elif y is not None:
+ QToolTip.add(defaultPushButton, self.__tr('Set to default value of "%1".').arg(y))
+
+ self.connect(defaultPushButton, SIGNAL("clicked()"), self.defaultPushButton_clicked)
+ self.connect(optionComboBox, SIGNAL("activated(const QString&)"), self.optionComboBox_activated)
+ self.connect(optionComboBox, SIGNAL("activated(const QString &)"), self.ComboBox_indexChanged)
+
+ control = optionComboBox
+
+ elif typ == cups.UI_SPINNER: # Spinner widget
+ widget = self.getWidget()
+
+ layout1 = QHBoxLayout(widget,5,10, "layout1")
+
+ textLabel1 = QLabel(widget, "textLabel1")
+ layout1.addWidget(textLabel1)
+
+ spacer1 = QSpacerItem(20, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
+ layout1.addItem(spacer1)
+
+ optionSpinBox = OptionSpinBox(widget,"optionSpinBox", group, option, default)
+ layout1.addWidget(optionSpinBox)
+
+ defaultPushButton = DefaultPushButton(widget, "defaultPushButton", group, option, choices,
+ default, optionSpinBox, typ)
+
+ optionSpinBox.setDefaultPushbutton(defaultPushButton)
+
+ layout1.addWidget(defaultPushButton)
+
+ min, max = choices
+ optionSpinBox.setMinValue(min)
+ optionSpinBox.setMaxValue(max)
+ optionSpinBox.setValue(value)
+
+ if suffix:
+ optionSpinBox.setSuffix(suffix)
+
+ textLabel1.setText(text)
+ defaultPushButton.setText("Default")
+
+ self.connect(optionSpinBox, SIGNAL("valueChanged(int)"), self.optionSpinBox_valueChanged)
+ self.connect(defaultPushButton, SIGNAL("clicked()"), self.defaultPushButton_clicked)
+
+ if value == default:
+ defaultPushButton.setEnabled(False)
+
+ if read_only:
+ self.optionSpinBox.setEnabled(False)
+ self.defaultPushButton.setEnabled()
+ else:
+ QToolTip.add(defaultPushButton,
+ self.__tr('Set to default value of "%1".').arg(default))
+
+ elif typ == cups.UI_BANNER_JOB_SHEETS: # Job sheets widget
+ widget = self.getWidget()
+
+ layout1 = QGridLayout(widget,1,1,5,10,"layout1")
+
+ startComboBox = OptionComboBox(0, widget, "startComboBox", group,
+ "start", choices, default, typ)
+
+ layout1.addWidget(startComboBox,0,3)
+
+ startTextLabel = QLabel(widget,"startTextLabel")
+ layout1.addWidget(startTextLabel,0,2)
+
+ endTextLabel = QLabel(widget,"endTextLabel")
+ layout1.addWidget(endTextLabel,0,4)
+
+ endComboBox = OptionComboBox(0, widget, "endComboBox", group, "end", choices,
+ default, typ, startComboBox)
+
+ layout1.addWidget(endComboBox,0,5)
+
+ startComboBox.setOther(endComboBox)
+
+ defaultPushButton = DefaultPushButton(widget, "defaultPushButton", group, option, choices,
+ default, (startComboBox, endComboBox), typ)
+
+ layout1.addWidget(defaultPushButton,0,6)
+
+ startComboBox.setDefaultPushbutton(defaultPushButton)
+ endComboBox.setDefaultPushbutton(defaultPushButton)
+
+ textLabel1 = QLabel(widget,"textLabel1")
+ layout1.addWidget(textLabel1,0,0)
+
+ spacer1 = QSpacerItem(20,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ layout1.addItem(spacer1,0,1)
+
+ textLabel1.setText(text)
+ defaultPushButton.setText("Default")
+
+ startTextLabel.setText(self.__tr("Start:"))
+ endTextLabel.setText(self.__tr("End:"))
+
+ s, e, y, z = None, None, None, None
+ for c, t in choices:
+ d = c.lower()
+ if value is not None:
+ if d == value[0].lower():
+ s = t
+
+ if d == value[1].lower():
+ e = t
+
+ if d == default[0].lower():
+ y = t
+
+ if d == default[1].lower():
+ z = t
+
+ startComboBox.insertItem(t)
+ endComboBox.insertItem(t)
+
+ if s is not None:
+ startComboBox.setCurrentText(s)
+
+ if e is not None:
+ endComboBox.setCurrentText(e)
+
+ if value is not None and \
+ value[0].lower() == default[0].lower() and \
+ value[1].lower() == default[1].lower():
+
+ defaultPushButton.setEnabled(False)
+
+ if y is not None and z is not None:
+ QToolTip.add(defaultPushButton, self.__tr('Set to default value of "Start: %1, End: %2".').arg(y).arg(z))
+
+ self.connect(startComboBox, SIGNAL("activated(const QString&)"), self.optionComboBox_activated)
+ self.connect(endComboBox, SIGNAL("activated(const QString&)"), self.optionComboBox_activated)
+ self.connect(defaultPushButton, SIGNAL("clicked()"), self.defaultPushButton_clicked)
+
+ elif typ == cups.PPD_UI_PICKMANY:
+ log.error("Unrecognized type: pickmany")
+
+ elif typ == cups.UI_UNITS_SPINNER:
+ widget = self.getWidget()
+
+ layout1 = QHBoxLayout(widget,5,10,"layout1")
+
+ textLabel1 = QLabel(widget,"textLabel1")
+ layout1.addWidget(textLabel1)
+
+ spacer1 = QSpacerItem(20,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ layout1.addItem(spacer1)
+
+ lineEdit1 = QLineEdit(widget,"lineEdit1")
+ layout1.addWidget(lineEdit1)
+
+ comboBox1 = QComboBox(0,widget,"comboBox1")
+ layout1.addWidget(comboBox1)
+
+ defaultPushButton = QPushButton(widget,"defaultPushButton")
+ layout1.addWidget(defaultPushButton)
+
+ textLabel1.setText(text)
+ defaultPushButton.setText("Default")
+
+ elif typ == cups.UI_INFO:
+ widget = self.getWidget()
+
+ layout1 = QHBoxLayout(widget,5,10,"layout1")
+
+ textPropName = QLabel(widget,"textPropName")
+ layout1.addWidget(textPropName)
+ textPropName.setText(text)
+
+ spacer1 = QSpacerItem(20,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ layout1.addItem(spacer1)
+
+ if text == 'Print Quality':
+ self.PQValueLabel = QLabel(widget,"textPropValue")
+ layout1.addWidget(self.PQValueLabel)
+ self.PQValueLabel.setText(value)
+ elif text == 'Color Input / Black Render':
+ self.PQColorInputLabel = QLabel(widget,"textPropValue")
+ layout1.addWidget(self.PQColorInputLabel)
+ self.PQColorInputLabel.setText(value)
+ else:
+ textPropValue = QLabel(widget,"textPropValue")
+ layout1.addWidget(textPropValue)
+ textPropValue.setText(value)
+
+ else:
+ log.error("Invalid UI value: %s/%s" % (group, option))
+
+ if widget is not None:
+ self.addWidget(widget, "o:"+option, control)
+ return widget
+
+
+
+ def __tr(self,s,c = None):
+ return qApp.translate("ScrollPrintSettingsView",s,c)
diff --git a/ui/scrollunload.py b/ui/scrollunload.py
new file mode 100644
index 0000000..8efb515
--- /dev/null
+++ b/ui/scrollunload.py
@@ -0,0 +1,648 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2001-2009 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+# Local
+from base.g import *
+from base import utils, magic
+from pcard import photocard
+from ui_utils import load_pixmap
+
+# Qt
+from qt import *
+from scrollview import ScrollView, PixmapLabelButton
+from imagepropertiesdlg import ImagePropertiesDlg
+#from waitform import WaitForm
+
+# Std Lib
+import os.path, os
+
+class IconViewItem(QIconViewItem):
+ def __init__(self, parent, dirname, fname, path, pixmap, mime_type, mime_subtype, size, exif_info={}):
+ QIconViewItem.__init__(self, parent, fname, pixmap)
+ self.mime_type = mime_type
+ self.mime_subtype = mime_subtype
+ self.path = path
+ self.dirname = dirname
+ self.filename = fname
+ self.exif_info = exif_info
+ self.size = size
+ self.thumbnail_set = False
+
+
+class ScrollUnloadView(ScrollView):
+ def __init__(self, service, parent=None, form=None, name=None, fl=0):
+ ScrollView.__init__(self, service, parent, name, fl)
+
+ self.form = form
+ self.progress_dlg = None
+ self.unload_dir = os.path.normpath(os.path.expanduser('~'))
+
+ self.image_icon_map = {'tiff' : 'tif',
+ 'bmp' : 'bmp',
+ 'jpeg' : 'jpg',
+ 'gif' : 'gif',
+ 'unknown' : 'unknown',
+ }
+
+ self.video_icon_map = {'unknown' : 'movie',
+ 'mpeg' : 'mpg',
+ }
+
+ QTimer.singleShot(0, self.fillControls)
+
+
+ def fillControls(self):
+ ScrollView.fillControls(self)
+
+ if 0:
+ self.addGroupHeading("error", self.__tr("ERROR: Photo Card Failed to Mount Properly. Please check device and card and try again."))
+
+ self.addGroupHeading("files_to_unload", self.__tr("Select File(s) to Unload from Photo Card"))
+ self.addIconList()
+
+ self.addGroupHeading("folder", self.__tr("Unload Folder"))
+ self.addFolder()
+
+ self.removal_option = 1 # remove files (default)
+
+ self.addGroupHeading("options", self.__tr("Unload Options"))
+ self.addOptions()
+
+ self.addGroupHeading("space1", "")
+
+ self.unloadButton = self.addActionButton("bottom_nav", self.__tr("Unload File(s)"),
+ self.unloadButton_clicked, 'download.png', 'download.png',
+ self.__tr("Close"), self.funcButton_clicked)
+
+ self.unloadButton.setEnabled(False)
+
+ self.maximizeControl()
+
+
+ def onDeviceChange(self, cur_device=None):
+ if cur_device is not None:
+ log.debug("ScrollUnloadView.onDeviceChange(%s)" % cur_device.device_uri)
+ self.cur_device = cur_device
+ else:
+ log.debug("ScrollUnloadView.onDeviceChange(None)")
+
+ # TODO: Print a message telling users to use USB mass storage if possible
+ QTimer.singleShot(0, self.mountCard)
+
+
+ def mountCard(self):
+ self.pc = None
+
+ if self.cur_device is not None and self.cur_device.supported:
+
+ QApplication.setOverrideCursor(QApplication.waitCursor)
+
+ try:
+ self.pc = photocard.PhotoCard(None, self.cur_device.device_uri, self.cur_printer)
+ except Error, e:
+ QApplication.restoreOverrideCursor()
+ self.form.FailureUI(self.__tr("An error occured: %s" % e[0]))
+ self.cleanup(EVENT_PCARD_UNABLE_TO_MOUNT)
+ return False
+
+ if self.pc.device.device_uri is None and self.cur_printer:
+ QApplication.restoreOverrideCursor()
+ self.form.FailureUI(self.__tr("Printer '%s' not found." % self.cur_printer))
+ self.cleanup(EVENT_PCARD_JOB_FAIL)
+ return False
+
+ if self.pc.device.device_uri is None and self.cur_device.device_uri:
+ QApplication.restoreOverrideCursor()
+ self.form.FailureUI(self.__tr("Malformed/invalid device-uri: %s" % self.device_uri))
+ self.cleanup(EVENT_PCARD_JOB_FAIL)
+
+ return False
+ else:
+ try:
+ self.pc.mount()
+ except Error:
+ QApplication.restoreOverrideCursor()
+ self.form.FailureUI(self.__tr("<b>Unable to mount photo card on device.</b><p>Check that device is powered on and photo card is correctly inserted."))
+ #self.pc.umount()
+ self.cleanup(EVENT_PCARD_UNABLE_TO_MOUNT)
+ return
+
+ self.device_uri = self.pc.device.device_uri
+ user_conf.set('last_used', 'device_uri', self.device_uri)
+
+ # TODO:
+ #self.pc.device.sendEvent(EVENT_START_PCARD_JOB)
+
+ disk_info = self.pc.info()
+ self.pc.write_protect = disk_info[8]
+
+ if self.pc.write_protect:
+ log.warning("Photo card is write protected.")
+
+ log.info("Photocard on device %s mounted" % self.pc.device_uri)
+
+ if not self.pc.write_protect:
+ log.info("DO NOT REMOVE PHOTO CARD UNTIL YOU EXIT THIS PROGRAM")
+
+ self.unload_dir = user_conf.workingDirectory()
+
+ try:
+ os.chdir(self.unload_dir)
+ except OSError:
+ self.unload_dir = ''
+
+ self.UnloadDirectoryEdit.setText(self.unload_dir)
+
+ self.unload_list = self.pc.get_unload_list()
+
+ self.total_number = 0
+ self.total_size = 0
+
+ self.updateSelectionStatus()
+
+ if self.pc.write_protect:
+ self.removal_option = 0 # leave all files on card
+
+ # Item map disambiguates between files of the same
+ # name that are on the pcard in more than one location
+ self.item_map = {}
+
+ QApplication.restoreOverrideCursor()
+
+ else:
+ log.debug("Unsupported device")
+ self.y = 0
+ self.clear()
+ return False
+
+ self.busy = False
+
+ QTimer.singleShot(0, self.updateIconView)
+
+ self.display_update_timer = QTimer(self, "DisplayUpdateTimer")
+ self.connect(self.display_update_timer, SIGNAL('timeout()'), self.updateDisplay)
+
+ self.display_update_timer.start(1000)
+
+ return True
+
+
+
+ def addIconList(self):
+ widget = self.getWidget()
+
+ layout32 = QGridLayout(widget,1,1,5,10,"layout32")
+
+ spacer34 = QSpacerItem(20,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ layout32.addItem(spacer34,2,2)
+
+ self.selectAllPushButton = PixmapLabelButton(widget, 'ok.png', None)
+
+ layout32.addWidget(self.selectAllPushButton,2,0)
+
+ self.ShowThumbnailsButton = PixmapLabelButton(widget, 'thumbnail.png', None)
+
+ layout32.addWidget(self.ShowThumbnailsButton,2,3)
+
+ self.IconView = QIconView(widget,"IconView")
+ self.IconView.setResizePolicy(QIconView.AutoOneFit)
+ self.IconView.setSelectionMode(QIconView.Multi)
+ self.IconView.setResizeMode(QIconView.Adjust)
+ self.IconView.setMaxItemWidth(200)
+ self.IconView.setAutoArrange(0)
+ self.IconView.setItemsMovable(1)
+
+ layout32.addMultiCellWidget(self.IconView,0,0,0,3)
+
+ self.selectNonePushButton = PixmapLabelButton(widget, 'folder_remove.png', None)
+
+ layout32.addWidget(self.selectNonePushButton,2,1)
+
+ self.selectionStatusText = QLabel(widget,"selectionStatusText")
+ layout32.addMultiCellWidget(self.selectionStatusText,1,1,0,3)
+ self.selectAllPushButton.setText(self.__tr("Select All"))
+ self.selectNonePushButton.setText(self.__tr("Select None"))
+ self.ShowThumbnailsButton.setText(self.__tr("Show Thumbnails"))
+
+ self.connect(self.selectAllPushButton,SIGNAL("clicked()"),self.selectAllPushButton_clicked)
+ self.connect(self.selectNonePushButton,SIGNAL("clicked()"),self.selectNonePushButton_clicked)
+ self.connect(self.IconView,SIGNAL("doubleClicked(QIconViewItem*)"),self.IconView_doubleClicked)
+ self.connect(self.IconView,SIGNAL("rightButtonClicked(QIconViewItem*,const QPoint&)"),self.IconView_rightButtonClicked)
+ self.connect(self.ShowThumbnailsButton,SIGNAL("clicked()"),self.ShowThumbnailsButton_clicked)
+
+ self.addWidget(widget, "file_list", maximize=True)
+
+
+ def selectAllPushButton_clicked(self):
+ self.IconView.selectAll(1)
+
+ def selectNonePushButton_clicked(self):
+ self.IconView.selectAll(0)
+
+ def IconView_doubleClicked(self, a0):
+ return self.PopupProperties()
+
+ def IconView_rightButtonClicked(self, item, pos):
+ popup = QPopupMenu(self)
+ popup.insertItem(self.__tr("Properties"), self.PopupProperties)
+
+ if item is not None and \
+ item.mime_type == 'image' and \
+ item.mime_subtype == 'jpeg' and \
+ self.pc.get_exif_path(item.path) and \
+ not item.thumbnail_set:
+
+ popup.insertItem(self.__tr("Show Thumbnail"), self.showThumbNail)
+
+ popup.popup(pos)
+
+ def ShowThumbnailsButton_clicked(self):
+ self.ShowThumbnailsButton.setEnabled(False)
+ self.updateIconView(first_load=False)
+
+ def updateDisplay(self):
+ if not self.busy:
+ self.total_number = 0
+ self.total_size = 0
+ i = self.IconView.firstItem()
+
+ while i is not None:
+
+ if i.isSelected():
+ self.total_number += 1
+ self.total_size += i.size
+
+ i = i.nextItem()
+
+ self.updateSelectionStatus()
+
+ self.updateUnloadButton()
+
+ def updateUnloadButton(self):
+ self.unloadButton.setEnabled(not self.busy and self.total_number and os.path.exists(self.unload_dir))
+ #qApp.processEvents()
+
+ def updateSelectionStatus(self):
+ if self.total_number == 0:
+ s = self.__tr("No files selected")
+
+ elif self.total_number == 1:
+ s = self.__tr("1 file selected, %1").arg(utils.format_bytes(self.total_size, True))
+
+ else:
+ s = self.__tr("%1 files selected, %2").arg(self.total_number).arg(utils.format_bytes(self.total_size, True))
+
+ self.selectionStatusText.setText(s)
+
+
+ def PopupDisplay(self):
+ self.Display(self.IconView.currentItem())
+
+ def PopupProperties(self):
+ self.Properties(self.IconView.currentItem())
+
+ def showThumbNail(self):
+ item = self.IconView.currentItem()
+ exif_info = self.pc.get_exif_path(item.path)
+
+ if len(exif_info) > 0:
+ if 'JPEGThumbnail' in exif_info:
+ pixmap = QPixmap()
+ pixmap.loadFromData(exif_info['JPEGThumbnail'], "JPEG")
+ self.resizePixmap(pixmap)
+ del exif_info['JPEGThumbnail']
+ item.setPixmap(pixmap)
+
+ self.IconView.adjustItems()
+
+ else:
+ self.form.FailureUI(self.__tr("<p><b>No thumbnail found in image.</b>"))
+
+ item.thumbnail_set = True
+
+ def Properties(self, item):
+ if item is not None:
+ if not item.exif_info:
+ item.exif_info = self.pc.get_exif_path(item.path)
+
+ ImagePropertiesDlg(item.filename, item.dirname,
+ '/'.join([item.mime_type, item.mime_subtype]),
+ utils.format_bytes(item.size, True),
+ item.exif_info, self).exec_loop()
+
+
+ def updateIconView(self, first_load=True):
+ QApplication.setOverrideCursor(QApplication.waitCursor)
+ self.busy = True
+ self.first_load = first_load
+ self.item_num = 0
+
+ if first_load:
+ self.IconView.clear()
+
+ self.num_items = len(self.unload_list)
+
+ self.progress_dlg = QProgressDialog(self.__tr("Loading..."), \
+ self.__tr("Cancel"), self.num_items, self, "progress", 0)
+ self.progress_dlg.setCaption(self.__tr("HP Device Manager"))
+
+ self.progress_dlg.setMinimumDuration(0)
+ self.progress_dlg.setProgress(0)
+
+ self.load_timer = QTimer(self, "LoadTimer")
+ self.connect(self.load_timer, SIGNAL('timeout()'), self.continueLoadIconView)
+ self.load_timer.start(0)
+
+
+ def continueLoadIconView(self):
+ if self.item_num == self.num_items:
+ self.load_timer.stop()
+ self.disconnect(self.load_timer, SIGNAL('timeout()'), self.continueLoadIconView)
+ self.load_timer = None
+ del self.load_timer
+
+ self.progress_dlg.close()
+ self.progress_dlg = None
+
+ self.IconView.adjustItems()
+ self.busy = False
+ QApplication.restoreOverrideCursor()
+ return
+
+ self.progress_dlg.setProgress(self.item_num)
+
+ f = self.unload_list[self.item_num]
+ self.item_num += 1
+ log.debug(f)
+
+ path, size = f[0], f[1]
+
+ typ, subtyp = self.pc.classify_file(path).split('/')
+
+ if not self.first_load and typ == 'image' and subtyp == 'jpeg':
+
+ exif_info = self.pc.get_exif_path(path)
+ if len(exif_info) > 0:
+
+ if 'JPEGThumbnail' in exif_info:
+ pixmap = QPixmap()
+ pixmap.loadFromData(exif_info['JPEGThumbnail'], "JPEG")
+
+ self.resizePixmap(pixmap)
+
+ del exif_info['JPEGThumbnail']
+ dname, fname=os.path.split(path)
+ x = self.item_map[fname]
+
+ if len(x) == 1:
+ item = self.IconView.findItem(fname, 0)
+ else:
+ i = x.index(path)
+ if i == 0:
+ item = self.IconView.findItem(fname, 0)
+ else:
+ item = self.IconView.findItem(fname + " (%d)" % (i+1), 0)
+
+ if item is not None:
+ item.setPixmap(pixmap)
+ item.thumbnail_set = True
+
+ return
+
+ elif self.first_load:
+ if typ == 'image':
+ f = self.image_icon_map.get(subtyp, 'unknown')
+
+ elif typ == 'video':
+ f = self.video_icon_map.get(subtyp, 'movie')
+
+ elif typ == 'audio':
+ f = 'sound'
+
+ else:
+ f = 'unknown'
+
+ dirname, fname=os.path.split(path)
+ num = 1
+ try:
+ self.item_map[fname]
+ except:
+ self.item_map[fname] = [path]
+ else:
+ self.item_map[fname].append(path)
+ num = len(self.item_map[fname])
+
+ if num == 1:
+ IconViewItem(self.IconView, dirname, fname, path,
+ load_pixmap(f, '128x128'), typ, subtyp, size)
+ else:
+ IconViewItem(self.IconView, dirname, fname + " (%d)" % num,
+ path,load_pixmap(f, '128x128'), typ, subtyp, size)
+
+ def resizePixmap(self, pixmap):
+ w, h = pixmap.width(), pixmap.height()
+
+ if h > 128 or w > 128:
+ ww, hh = w - 128, h - 128
+ if ww >= hh:
+ pixmap.resize(128, int(float((w-ww))/w*h))
+ else:
+ pixmap.resize(int(float((h-hh))/h*w), 128)
+
+ def addFolder(self):
+ widget = self.getWidget()
+ layout38 = QGridLayout(widget,1,1,5,10,"layout38")
+
+ self.UnloadDirectoryEdit = QLineEdit(widget,"UnloadDirectoryEdit")
+ layout38.addWidget(self.UnloadDirectoryEdit,0,0)
+
+ self.UnloadDirectoryBrowseButton = PixmapLabelButton(widget, 'folder_open.png', None)
+ layout38.addWidget(self.UnloadDirectoryBrowseButton,0,1)
+
+ self.UnloadDirectoryBrowseButton.setText(self.__tr("Browse..."))
+ self.connect(self.UnloadDirectoryBrowseButton,SIGNAL("clicked()"),self.UnloadDirectoryBrowseButton_clicked)
+ self.connect(self.UnloadDirectoryEdit,SIGNAL("textChanged(const QString&)"),self.UnloadDirectoryEdit_textChanged)
+
+ self.bg = self.UnloadDirectoryEdit.paletteBackgroundColor()
+
+ self.addWidget(widget, "folder")
+
+ def UnloadDirectoryEdit_textChanged(self, dir):
+ self.unload_dir = unicode(dir)
+
+ if not os.path.exists(self.unload_dir):
+ self.UnloadDirectoryEdit.setPaletteBackgroundColor(QColor(0xff, 0x99, 0x99))
+ else:
+ self.UnloadDirectoryEdit.setPaletteBackgroundColor(self.bg)
+
+ def UnloadDirectoryBrowseButton_clicked(self):
+ old_dir = self.unload_dir
+ self.unload_dir = unicode(QFileDialog.getExistingDirectory(self.unload_dir, self))
+
+ if not len(self.unload_dir):
+ return
+
+ elif not utils.is_path_writable(self.unload_dir):
+ self.form.FailureUI(self.__tr("<p><b>The unload directory path you entered is not valid.</b><p>The directory must exist and you must have write permissions."))
+ self.unload_dir = old_dir
+
+ else:
+ self.UnloadDirectoryEdit.setText(self.unload_dir)
+ os.chdir(self.unload_dir)
+ user_conf.setWorkingDirectory(self.unload_dir)
+
+ def addOptions(self):
+ widget = self.getWidget()
+
+ layout34 = QHBoxLayout(widget,5,10,"layout34")
+
+ self.textLabel5_4 = QLabel(widget,"textLabel5_4")
+ layout34.addWidget(self.textLabel5_4)
+ spacer20_4 = QSpacerItem(20,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ layout34.addItem(spacer20_4)
+
+ self.optionComboBox = QComboBox(0,widget,"optionsComboBox")
+ layout34.addWidget(self.optionComboBox)
+
+ self.textLabel5_4.setText(self.__tr("File removal:"))
+ self.optionComboBox.clear()
+ self.optionComboBox.insertItem(self.__tr("Leave unloaded files on photo card")) # 0
+ self.optionComboBox.insertItem(self.__tr("Remove all unloaded files from photo card")) # 1
+ self.optionComboBox.setCurrentItem(self.removal_option)
+
+ self.connect(self.optionComboBox, SIGNAL("activated(int)"), self.optionComboBox_activated)
+
+ self.addWidget(widget, "option")
+
+ def optionComboBox_activated(self, i):
+ self.removal_option = i
+
+
+ def unloadButton_clicked(self):
+ was_cancelled = False
+ self.busy = True
+ self.unloadButton.setEnabled(False)
+ self.unload_dir = unicode(self.UnloadDirectoryEdit.text())
+ dir_error = False
+
+ try:
+ try:
+ os.chdir(self.unload_dir)
+ except OSError:
+ log.error("Directory not found: %s" % self.unload_dir)
+ dir_error = True
+
+ if dir_error or not utils.is_path_writable(self.unload_dir):
+ self.form.FailureUI(self.__tr("<p><b>The unload directory path is not valid.</b><p>Please enter a new path and try again."))
+ return
+
+ unload_list = []
+ i = self.IconView.firstItem()
+ self.total_size = 0
+ while i is not None:
+
+ if i.isSelected():
+ unload_list.append((i.path, i.size, i.mime_type, i.mime_subtype))
+ self.total_size += i.size
+ i = i.nextItem()
+
+ if self.total_size == 0:
+ self.form.FailureUI(self.__tr("<p><b>No files are selected to unload.</b><p>Please select one or more files to unload and try again."))
+ return
+
+ self.total_complete = 0
+ self.progress_dlg = QProgressDialog(self.__tr("Unloading card..."), \
+ self.__tr("Cancel"), 100, self, "progress", 1)
+ self.progress_dlg.setCaption(self.__tr("HP Device Manager"))
+ self.progress_dlg.setMinimumDuration(0)
+ self.progress_dlg.setProgress(0)
+ qApp.processEvents()
+
+ if self.removal_option == 0: # Leave files
+ total_size, total_time, was_cancelled = \
+ self.pc.unload(unload_list, self.updateStatusProgressBar, None, True)
+
+ elif self.removal_option == 1: # remove selected
+ total_size, total_time, was_cancelled = \
+ self.pc.unload(unload_list, self.updateStatusProgressBar, None, False)
+
+ else: # remove all
+ total_size, total_time, was_cancelled = \
+ self.pc.unload(unload_list, self.updateStatusProgressBar, None, False)
+ # TODO: Remove remainder of files
+
+ self.progress_dlg.close()
+ self.progress_dlg = None
+
+ # TODO:
+ #self.pc.device.sendEvent(EVENT_PCARD_FILES_TRANSFERED)
+
+ if self.removal_option != 0: # remove selected or remove all
+ self.unload_list = self.pc.get_unload_list()
+ self.total_number = 0
+ self.total_size = 0
+ self.item_map = {}
+ self.total_complete = 0
+ self.updateIconView()
+
+ if was_cancelled:
+ self.form.FailureUI(self.__tr("<b>Unload cancelled at user request.</b>"))
+ else:
+ pass
+
+ finally:
+ self.busy = False
+
+ def updateStatusProgressBar(self, src, trg, size):
+ qApp.processEvents()
+ self.total_complete += size
+ percent = int(100.0 * self.total_complete/self.total_size)
+ self.progress_dlg.setProgress(percent)
+ qApp.processEvents()
+
+ if self.progress_dlg.wasCanceled():
+ return True
+
+ return False
+
+
+ def cleanup(self, error=0):
+ if self.pc is not None:
+ if error > 0:
+ # TODO:
+ #self.pc.device.sendEvent(error, typ='error')
+ pass
+
+ try:
+ self.pc.umount()
+ self.pc.device.close()
+ except Error:
+ pass
+
+ def funcButton_clicked(self):
+ if self.pc is not None:
+ self.pc.umount()
+ self.pc.device.close()
+
+ self.form.close()
+
+ def __tr(self,s,c = None):
+ return qApp.translate("ScrollUnloadView",s,c)
diff --git a/ui/scrollview.py b/ui/scrollview.py
new file mode 100644
index 0000000..030627f
--- /dev/null
+++ b/ui/scrollview.py
@@ -0,0 +1,475 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2001-2007 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+# Std Lib
+
+# Local
+from base.g import *
+from prnt import cups
+from base import device
+from ui_utils import load_pixmap
+
+# Qt
+from qt import *
+
+
+
+class Widget(QWidget):
+ def __init__(self, parent=None, name=None, fl=0):
+ QWidget.__init__(self, parent, name, fl)
+ self.control = None
+
+ def setControl(self, control):
+ self.control = control
+
+
+
+class ScrollView(QScrollView):
+ def __init__(self, service=None, parent=None, name=None, fl=0):
+ QScrollView.__init__(self, parent, name, fl)
+
+ self.service = service
+ self.items = {}
+ self.enableClipper(True)
+ self.viewport().setPaletteBackgroundColor(qApp.palette().color(QPalette.Active, QColorGroup.Background))
+ self.cur_device = None
+ self.cur_printer = None
+ self.item_margin = 2
+ self.y = 0
+ self.printers = []
+ self.maximize = None
+ self.orig_height = 0
+ self.content_padding = 20
+
+ if log.is_debug():
+ self.heading_color = qApp.palette().color(QPalette.Active, QColorGroup.Base)
+ self.frame_shape = QFrame.Box
+ else:
+ self.heading_color = qApp.palette().color(QPalette.Active, QColorGroup.Background)
+ self.frame_shape = QFrame.NoFrame
+
+ def getWidget(self):
+ widget = Widget(self.viewport(),"widget")
+ widget.setPaletteBackgroundColor(qApp.palette().color(QPalette.Active, QColorGroup.Background))
+ return widget
+
+ def viewportResizeEvent(self, e):
+ QScrollView.viewportResizeEvent(self, e)
+
+ total_height = 0
+ item_margin = self.item_margin
+ width = e.size().width()
+
+ for w in self.items:
+ height = self.items[w].size().height()
+ self.items[w].resize(width, height)
+ self.items[w].setMinimumWidth(width)
+ total_height += (height + item_margin)
+
+ if self.maximize is not None:
+ self.maximizeControl(total_height)
+
+ self.resizeContents(e.size().width(), total_height + self.content_padding)
+
+ def maximizeControl(self, total_height=0):
+ if self.maximize is not None:
+ try:
+ self.items[self.maximize]
+ except KeyError:
+ return
+
+ if total_height == 0:
+ item_margin = self.item_margin
+ for w in self.items:
+ total_height += (self.items[w].size().height() + item_margin)
+
+ if len(self.items) == 1:
+ #total_height += item_margin
+ self.content_padding = 0
+
+ width = self.items[self.maximize].size().width()
+ old_height = self.items[self.maximize].size().height()
+
+ new_height = max((self.visibleHeight()-(total_height-old_height)),
+ self.orig_height)
+
+ delta = new_height - old_height
+
+ if delta:
+ self.items[self.maximize].resize(width, new_height)
+ self.resizeContents(width, self.contentsHeight()+delta+self.content_padding)
+ m_y = self.childY(self.items[self.maximize])
+
+ for w in self.items:
+ w_y = self.childY(self.items[w])
+ if w_y > m_y:
+ self.moveChild(self.items[w], 0, w_y+delta)
+
+
+ def onDeviceChange(self, cur_device=None, updating=False):
+ if cur_device is not None:
+ log.debug("ScrollView.onDeviceChange(%s)" % cur_device.device_uri)
+ else:
+ log.debug("ScrollView.onDeviceChange(None)")
+
+ self.cur_device = cur_device
+
+ if self.cur_device is not None and self.cur_device.supported:
+ #if not updating or not self.cur_printer:
+ if not self.cur_printer:
+ try:
+ cur_printer = self.cur_device.cups_printers[0]
+ except IndexError:
+ log.error("Printer list empty") # Shouldn't happen!
+ self.cur_printer = None
+ return
+
+ #self.isFax()
+ self.printers = cups.getPrinters()
+ self.onPrinterChange(cur_printer)
+ self.cur_printer = cur_printer
+
+ #else:
+ if 1:
+ QApplication.setOverrideCursor(QApplication.waitCursor)
+ try:
+ if 1:
+ #try:
+ self.fillControls()
+ #except Exception, e:
+ # log.exception()
+ finally:
+ QApplication.restoreOverrideCursor()
+
+ else:
+ log.debug("Unsupported device")
+ self.y = 0
+ self.clear()
+
+ self.addGroupHeading("error", self.__tr("ERROR: No device found or unsupported device."))
+
+ def onUpdate(self, cur_device=None):
+ log.debug("ScrollView.onUpdate()")
+ return self.onDeviceChange(cur_device, True)
+
+ def fillControls(self):
+ log.debug("fillControls(%s)" % str(self.name()))
+ self.y = 0
+ self.clear()
+
+ def onPrinterChange(self, printer_name):
+ if printer_name == self.cur_printer or printer_name is None:
+ return
+
+ self.cur_printer = unicode(printer_name)
+
+ if self.cur_device is not None and self.cur_device.supported:
+ #self.isFax()
+ QApplication.setOverrideCursor(QApplication.waitCursor)
+ try:
+ if 1:
+ #try:
+ self.fillControls()
+ #except Exception, e:
+ # log.exception()
+ finally:
+ QApplication.restoreOverrideCursor()
+
+ if self.cur_printer is not None:
+ try:
+ self.printerComboBox.setCurrentText(self.cur_printer)
+ except AttributeError:
+ pass
+
+ else:
+ self.y = 0
+ self.clear()
+
+ def addWidget(self, widget, key, control=None, maximize=False):
+ try:
+ self.items[key]
+ except KeyError:
+ if maximize:
+ self.maximize = key
+ widget.resize(widget.size().width(), 150)
+ self.orig_height = widget.size().height()
+
+ try:
+ widget.setControl(control)
+ except AttributeError:
+ pass
+ self.items[key] = widget
+ widget.setMinimumWidth(self.visibleWidth())
+ widget.adjustSize()
+ self.addChild(widget, 0, self.y)
+ self.y += (widget.size().height() + self.item_margin)
+ self.resizeContents(self.visibleWidth(), self.y + self.content_padding)
+ widget.show()
+ #else:
+ # log.debug("ERROR: Duplicate control name: %s" % key)
+
+ def clear(self):
+ if len(self.items):
+ for x in self.items:
+ self.removeChild(self.items[x])
+ self.items[x].hide()
+
+ self.items.clear()
+
+ def addGroupHeading(self, group, heading, read_only=False):
+ widget = self.getWidget()
+ widget.setMinimumHeight(30)
+
+ layout = QGridLayout(widget, 0, 0, 5, 0, "layout")
+ textLabel2 = QLabel(widget, "textLabel2")
+
+ textLabel2.setSizePolicy(QSizePolicy(QSizePolicy.Preferred,
+ QSizePolicy.Maximum, 0, 0,
+ textLabel2.sizePolicy().hasHeightForWidth()))
+
+ if log.is_debug():
+ textLabel2.setFrameShape(self.frame_shape)
+
+ elif heading:
+ textLabel2.setFrameShape(QFrame.TabWidgetPanel)
+ textLabel2.setPaletteBackgroundColor(self.heading_color)
+
+ if read_only:
+ s = self.__tr("<b>%1 (read only)</b>").arg(heading) # <nobr>
+ else:
+ s = QString("<b>%1</b>").arg(heading)
+
+ # If label is kinda long, provide a tooltip to allow reading the whole thing
+ if s.length() > 32:
+ QToolTip.add(textLabel2, s)
+
+ textLabel2.setText(s)
+ textLabel2.setAlignment(QLabel.AlignLeft | QLabel.AlignVCenter | Qt.SingleLine)
+
+ layout.addWidget(textLabel2, 0, 0)
+
+ self.addWidget(widget, "g:"+unicode(group))
+
+
+ def addActionButton(self, name, action_text, action_func,
+ action_pixmap=None, disabled_action_pixmap=None,
+ nav_text ='', nav_func=None):
+
+ widget = self.getWidget()
+
+ self.actionPushButton = None
+ self.navPushButton = None
+
+ layout36 = QHBoxLayout(widget,5,10,"layout36")
+
+ if nav_func is not None:
+ self.navPushButton = QPushButton(widget,"navPushButton")
+ navPushButton_font = QFont(self.navPushButton.font())
+ navPushButton_font.setBold(1)
+ self.navPushButton.setFont(navPushButton_font)
+ self.navPushButton.setText(nav_text)
+ layout36.addWidget(self.navPushButton)
+
+ self.connect(self.navPushButton, SIGNAL("clicked()"), nav_func)
+
+ spacer35 = QSpacerItem(20,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ layout36.addItem(spacer35)
+
+ if action_func is not None:
+ if action_pixmap is None:
+ self.actionPushButton = QPushButton(widget, "actionPushButton")
+ else:
+ self.actionPushButton = PixmapLabelButton(widget, action_pixmap,
+ disabled_action_pixmap, 'actionPushButton')
+
+ actionPushButton_font = QFont(self.actionPushButton.font())
+ actionPushButton_font.setBold(1)
+ self.actionPushButton.setFont(actionPushButton_font)
+ layout36.addWidget(self.actionPushButton)
+
+ self.actionPushButton.setText(action_text)
+
+ self.connect(self.actionPushButton, SIGNAL("clicked()"), action_func)
+
+ self.addWidget(widget, name)
+
+ if self.actionPushButton is not None:
+ return self.actionPushButton
+
+ elif self.navPushButton is not None:
+ return self.navPushButton
+
+ else:
+ return None
+
+ def printerComboBox_activated(self, p):
+ self.cur_printer = str(p)
+
+ def addPrinterFaxList(self): # printers=True, faxes=False):
+ widget = self.getWidget()
+
+ layout = QGridLayout(widget,1,1,5,10,"layout")
+
+ self.printernameTextLabel = QLabel(widget,"printernameTextLabel")
+ layout.addWidget(self.printernameTextLabel,0,0)
+
+ self.printerComboBox = QComboBox(0,widget,"printerComboBox")
+ layout.addWidget(self.printerComboBox,0,1)
+
+ #print self.cur_device.device_type
+ if self.cur_device.device_type == DEVICE_TYPE_PRINTER:
+ self.addGroupHeading("printer_list_heading", self.__tr("Printer"))
+ self.printernameTextLabel.setText(self.__tr("Printer Name:"))
+ else:
+ self.addGroupHeading("fax_list_heading", self.__tr("Fax"))
+ self.printernameTextLabel.setText(self.__tr("Fax Name:"))
+
+ self.printers = cups.getPrinters()
+ self.cur_printer = None
+ for p in self.printers:
+ if p.device_uri == self.cur_device.device_uri:
+
+ self.printerComboBox.insertItem(p.name)
+
+ if self.cur_printer is None:
+ self.cur_printer = p.name
+
+ if self.cur_printer is None:
+ #log.error("No fax queue found")
+ self.y = 0
+ self.clear()
+
+ #if printers and faxes:
+ if self.cur_device.device_type == DEVICE_TYPE_PRINTER:
+ self.addGroupHeading("error", self.__tr("ERROR: No CUPS queue found for device."))
+ else:
+ self.addGroupHeading("error", self.__tr("ERROR: No CUPS fax queue found for device."))
+
+ return False
+
+ else:
+ self.connect(self.printerComboBox, SIGNAL("activated(const QString&)"), self.printerComboBox_activated)
+
+ self.addWidget(widget, "printer_list")
+ return True
+
+
+ def addLoadPaper(self, paper_type=PAPER_TYPE_PLAIN):
+ self.addGroupHeading("load_paper", self.__tr("Load Paper"))
+
+ widget = self.getWidget()
+ layout1 = QGridLayout(widget, 1, 2, 5, 10,"layout1")
+
+ layout1.setColStretch(0, 1)
+ layout1.setColStretch(1, 10)
+
+ icon = QLabel(widget, "icon")
+ icon.setSizePolicy(QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed, 0, 0,
+ icon.sizePolicy().hasHeightForWidth()))
+
+ icon.setScaledContents(1)
+ layout1.addWidget(icon, 0, 0)
+
+ textLabel = QLabel(widget, "textLabel")
+ textLabel.setAlignment(QLabel.WordBreak)
+ textLabel.setSizePolicy(QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Preferred, 0, 0,
+ textLabel.sizePolicy().hasHeightForWidth()))
+ textLabel.setFrameShape(self.frame_shape)
+ layout1.addWidget(textLabel, 0, 1)
+
+ spacer1 = QSpacerItem(20, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
+ layout1.addItem(spacer1, 0, 2)
+
+ if paper_type == PAPER_TYPE_PLAIN:
+ textLabel.setText(self.__tr("A page will be printed. Please load Letter/A4 <b>Plain Paper</b> into the printer."))
+ elif paper_type == PAPER_TYPE_HP_ADV_PHOTO:
+ textLabel.setText(self.__tr("A page will be printed. Please load Letter/A4 <b>HP Advanced Photo Paper - Glossy</b> into the printer."))
+
+ icon.setPixmap(load_pixmap("load_paper", 'other'))
+
+ self.addWidget(widget, "load_paper")
+
+
+ def cleanup(self):
+ pass
+
+ def __tr(self,s,c = None):
+ return qApp.translate("ScrollView",s,c)
+
+
+
+class PixmapLabelButton(QPushButton):
+ def __init__(self, parent=None, pixmap=None, disabled_pixmap=None, name='', subdir=None):
+ QPushButton.__init__(self, parent, name)
+
+ if subdir is None:
+ subdir = '16x16'
+
+ if type(pixmap) == type(''):
+ self.pixmap = load_pixmap(pixmap, subdir)
+ else:
+ self.pixmap = pixmap
+
+ if type(disabled_pixmap) == type(''):
+ self.disabled_pixmap = load_pixmap(disabled_pixmap, subdir)
+ else:
+ self.disabled_pixmap = disabled_pixmap
+
+ self.pixmap_width, self.pixmap_height = self.pixmap.width(), self.pixmap.height()
+ self.width_set = None
+
+
+ def drawButtonLabel(self, painter):
+ button_width, button_height = self.width(), self.height()
+
+ adj = 0
+ if self.isDown():
+ adj = 1
+
+ if self.isEnabled():
+ painter.setPen(Qt.black)
+ else:
+ painter.setPen(Qt.gray)
+
+ text_rect = painter.boundingRect(0, 0, 1000, 1000, Qt.AlignLeft, self.text())
+ text_width, text_height = text_rect.right() - text_rect.left(), text_rect.bottom() - text_rect.top()
+
+ button_width_center = button_width/2
+ button_height_center = button_height/2
+ combined_width_center = (self.pixmap_width + text_width + 10)/2
+
+
+ if self.isEnabled() or self.disabled_pixmap is None:
+ painter.drawPixmap(button_width_center - combined_width_center + adj,
+ button_height_center - self.pixmap_height/2 + adj, self.pixmap)
+ else:
+ painter.drawPixmap(button_width_center - combined_width_center + adj,
+ button_height_center - self.pixmap_height/2 + adj, self.disabled_pixmap)
+
+ if self.width_set is None:
+ self.setMinimumWidth(self.pixmap_width + text_width + 20)
+ self.width_set = 0
+
+ painter.drawText(button_width_center - combined_width_center +
+ self.pixmap_width + 5 + adj,
+ button_height_center - text_height/2 + adj, 1000, 1000,
+ Qt.AlignLeft, self.text())
+
diff --git a/ui/settingsdialog.py b/ui/settingsdialog.py
new file mode 100644
index 0000000..7100f83
--- /dev/null
+++ b/ui/settingsdialog.py
@@ -0,0 +1,202 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2001-2007 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+from base.g import *
+from base.codes import *
+from base import utils
+from qt import *
+from settingsdialog_base import SettingsDialog_base
+
+class SettingsDialog(SettingsDialog_base):
+ def __init__(self, parent = None,name = None,modal = 0,fl = 0):
+ SettingsDialog_base.__init__(self,parent,name,modal,fl)
+ self.DefaultsButton.setEnabled(False)
+ #self.sendmail = utils.which('sendmail')
+
+ #if not self.sendmail:
+ # self.EmailTestButton.setEnabled(False)
+
+ self.user_settings = utils.UserSettings()
+ self.updateControls()
+
+ def updateControls(self):
+ self.autoRefreshCheckBox.setChecked(self.user_settings.auto_refresh)
+ self.AutoRefreshRate.setValue(self.user_settings.auto_refresh_rate) # min
+ self.refreshScopeButtonGroup.setButton(self.user_settings.auto_refresh_type)
+
+## self.EmailCheckBox.setChecked(self.user_settings.email_alerts)
+## self.EmailAddress.setText(self.user_settings.email_to_addresses)
+## self.senderLineEdit.setText(self.user_settings.email_from_address)
+
+ self.PrintCommand.setText(self.user_settings.cmd_print)
+ #self.PrintCommand.setEnabled(not self.user_settings.cmd_print_int)
+
+## if self.user_settings.cmd_print_int:
+## self.printButtonGroup.setButton(0)
+## else:
+## self.printButtonGroup.setButton(1)
+
+ self.ScanCommand.setText(self.user_settings.cmd_scan)
+ #self.ScanCommand.setEnabled(not self.user_settings.cmd_scan_int)
+
+## if self.user_settings.cmd_scan_int:
+## self.scanButtonGroup.setButton(0)
+## else:
+## self.scanButtonGroup.setButton(1)
+
+ self.AccessPCardCommand.setText(self.user_settings.cmd_pcard)
+ #self.AccessPCardCommand.setEnabled(not self.user_settings.cmd_pcard_int)
+
+## if self.user_settings.cmd_pcard_int:
+## self.pcardButtonGroup.setButton(0)
+## else:
+## self.pcardButtonGroup.setButton(1)
+
+ self.SendFaxCommand.setText(self.user_settings.cmd_fax)
+ #self.SendFaxCommand.setEnabled(not self.user_settings.cmd_fax_int)
+
+## if self.user_settings.cmd_fax_int:
+## self.faxButtonGroup.setButton(0)
+## else:
+## self.faxButtonGroup.setButton(1)
+
+ self.MakeCopiesCommand.setText(self.user_settings.cmd_copy)
+ #self.MakeCopiesCommand.setEnabled(not self.user_settings.cmd_copy_int)
+
+## if self.user_settings.cmd_copy_int:
+## self.copyButtonGroup.setButton(0)
+## else:
+## self.copyButtonGroup.setButton(1)
+
+ def updateData(self):
+ self.user_settings.cmd_print = unicode(self.PrintCommand.text())
+ #self.user_settings.cmd_print_int = (self.printButtonGroup.selectedId() == 0)
+
+ self.user_settings.cmd_scan = unicode(self.ScanCommand.text())
+ #self.user_settings.cmd_scan_int = (self.scanButtonGroup.selectedId() == 0)
+
+ self.user_settings.cmd_pcard = unicode(self.AccessPCardCommand.text())
+ #self.user_settings.cmd_pcard_int = (self.pcardButtonGroup.selectedId() == 0)
+
+ self.user_settings.cmd_fax = unicode(self.SendFaxCommand.text())
+ #self.user_settings.cmd_fax_int = (self.faxButtonGroup.selectedId() == 0)
+
+ self.user_settings.cmd_copy = unicode(self.MakeCopiesCommand.text())
+ #self.user_settings.cmd_copy_int = (self.copyButtonGroup.selectedId() == 0)
+
+## self.user_settings.email_alerts = bool(self.EmailCheckBox.isChecked())
+## self.user_settings.email_to_addresses = unicode(self.EmailAddress.text())
+## self.user_settings.email_from_address = unicode(self.senderLineEdit.text())
+
+ self.user_settings.auto_refresh = str(self.autoRefreshCheckBox.isChecked())
+ self.user_settings.auto_refresh_type = str(self.refreshScopeButtonGroup.selectedId())
+ self.user_settings.auto_refresh_rate = str(self.AutoRefreshRate.value())
+
+## def PrintCmdChangeButton_clicked(self):
+## pass
+##
+## def ScanCmdChangeButton_clicked(self):
+## pass
+##
+## def AccessPCardCmdChangeButton_clicked(self):
+## pass
+##
+## def SendFaxCmdChangeButton_clicked(self):
+## pass
+##
+## def MakeCopiesCmdChangeButton_clicked(self):
+## pass
+
+ def DefaultsButton_clicked(self):
+ self.user_settings.loadDefaults()
+ self.updateControls()
+
+ def TabWidget_currentChanged(self,a0):
+ name = str(a0.name())
+
+ if name == 'FunctionCommands':
+ self.DefaultsButton.setEnabled(True)
+ else:
+ self.DefaultsButton.setEnabled(False)
+
+## def EmailTestButton_clicked(self):
+## email_to_addresses = unicode(self.EmailAddress.text())
+## email_from_address = unicode(self.senderLineEdit.text())
+##
+## if not email_to_addresses or not email_from_address:
+## QMessageBox.warning(self,
+## self.caption(),
+## self.__tr("<b>One or more email addresses are missing.</b><p>Please enter this information and try again."),
+## QMessageBox.Ok,
+## QMessageBox.NoButton,
+## QMessageBox.NoButton)
+## return
+##
+## # TODO:
+#### service.setAlerts(self.hpssd_sock,
+#### True,
+#### email_from_address,
+#### email_to_addresses)
+##
+## #result_code = service.testEmail(self.hpssd_sock, prop.username)
+## log.debug(result_code)
+##
+## QMessageBox.information(self,
+## self.caption(),
+## self.__tr("<p><b>Please check your email for a test message.</b><p>If the message doesn't arrive, please check your settings and try again."),
+## QMessageBox.Ok,
+## QMessageBox.NoButton,
+## QMessageBox.NoButton)
+
+
+ def autoRefreshCheckBox_clicked(self):
+ pass
+
+## def CleaningLevel_clicked(self,a0):
+## pass
+
+ def refreshScopeButtonGroup_clicked(self,a0):
+ self.auto_refresh_type = int(a0)
+
+## def printButtonGroup_clicked(self,a0):
+## self.PrintCommand.setEnabled(a0)
+##
+## def scanButtonGroup_clicked(self,a0):
+## self.ScanCommand.setEnabled(a0)
+##
+## def faxButtonGroup_clicked(self,a0):
+## self.SendFaxCommand.setEnabled(a0)
+##
+## def pcardButtonGroup_clicked(self,a0):
+## self.AccessPCardCommand.setEnabled(a0)
+##
+## def copyButtonGroup_clicked(self,a0):
+## self.MakeCopiesCommand.setEnabled(a0)
+
+ def accept(self):
+ self.updateData()
+ self.user_settings.save()
+ SettingsDialog_base.accept(self)
+
+ def __tr(self,s,c = None):
+ return qApp.translate("SettingsDialog",s,c)
+
+
diff --git a/ui/settingsdialog_base.py b/ui/settingsdialog_base.py
new file mode 100644
index 0000000..d69e5bf
--- /dev/null
+++ b/ui/settingsdialog_base.py
@@ -0,0 +1,292 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'ui/settingsdialog_base.ui'
+#
+# Created: Mon Apr 21 09:46:06 2008
+# by: The PyQt User Interface Compiler (pyuic) 3.17.3
+#
+# WARNING! All changes made in this file will be lost!
+
+
+from qt import *
+
+
+class SettingsDialog_base(QDialog):
+ def __init__(self,parent = None,name = None,modal = 0,fl = 0):
+ QDialog.__init__(self,parent,name,modal,fl)
+
+ if not name:
+ self.setName("SettingsDialog_base")
+
+
+ SettingsDialog_baseLayout = QGridLayout(self,1,1,11,6,"SettingsDialog_baseLayout")
+
+ self.pushButton30 = QPushButton(self,"pushButton30")
+
+ SettingsDialog_baseLayout.addWidget(self.pushButton30,1,2)
+
+ self.pushButton31 = QPushButton(self,"pushButton31")
+
+ SettingsDialog_baseLayout.addWidget(self.pushButton31,1,1)
+ spacer40 = QSpacerItem(430,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ SettingsDialog_baseLayout.addItem(spacer40,1,0)
+
+ self.TabWidget = QTabWidget(self,"TabWidget")
+
+ self.CleaningLevels = QWidget(self.TabWidget,"CleaningLevels")
+ CleaningLevelsLayout = QGridLayout(self.CleaningLevels,1,1,11,6,"CleaningLevelsLayout")
+
+ self.textLabel3_2_2 = QLabel(self.CleaningLevels,"textLabel3_2_2")
+
+ CleaningLevelsLayout.addWidget(self.textLabel3_2_2,0,0)
+
+ self.line1_2_2 = QFrame(self.CleaningLevels,"line1_2_2")
+ self.line1_2_2.setFrameShape(QFrame.HLine)
+ self.line1_2_2.setFrameShadow(QFrame.Sunken)
+ self.line1_2_2.setFrameShape(QFrame.HLine)
+
+ CleaningLevelsLayout.addWidget(self.line1_2_2,1,0)
+ spacer8 = QSpacerItem(20,30,QSizePolicy.Minimum,QSizePolicy.Expanding)
+ CleaningLevelsLayout.addItem(spacer8,5,0)
+
+ self.autoRefreshCheckBox = QCheckBox(self.CleaningLevels,"autoRefreshCheckBox")
+
+ CleaningLevelsLayout.addWidget(self.autoRefreshCheckBox,2,0)
+
+ self.CleaningLevel = QButtonGroup(self.CleaningLevels,"CleaningLevel")
+ self.CleaningLevel.setColumnLayout(0,Qt.Vertical)
+ self.CleaningLevel.layout().setSpacing(6)
+ self.CleaningLevel.layout().setMargin(11)
+ CleaningLevelLayout = QGridLayout(self.CleaningLevel.layout())
+ CleaningLevelLayout.setAlignment(Qt.AlignTop)
+ spacer9_2 = QSpacerItem(290,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ CleaningLevelLayout.addItem(spacer9_2,0,2)
+
+ self.textLabel1_4 = QLabel(self.CleaningLevel,"textLabel1_4")
+
+ CleaningLevelLayout.addWidget(self.textLabel1_4,0,0)
+
+ layout7 = QHBoxLayout(None,0,6,"layout7")
+
+ self.AutoRefreshRate = QSpinBox(self.CleaningLevel,"AutoRefreshRate")
+ self.AutoRefreshRate.setEnabled(0)
+ self.AutoRefreshRate.setWrapping(1)
+ self.AutoRefreshRate.setButtonSymbols(QSpinBox.PlusMinus)
+ self.AutoRefreshRate.setMaxValue(60)
+ self.AutoRefreshRate.setMinValue(5)
+ self.AutoRefreshRate.setValue(6)
+ layout7.addWidget(self.AutoRefreshRate)
+
+ self.textLabel1_3 = QLabel(self.CleaningLevel,"textLabel1_3")
+ layout7.addWidget(self.textLabel1_3)
+
+ CleaningLevelLayout.addLayout(layout7,0,1)
+
+ CleaningLevelsLayout.addWidget(self.CleaningLevel,3,0)
+
+ self.refreshScopeButtonGroup = QButtonGroup(self.CleaningLevels,"refreshScopeButtonGroup")
+ self.refreshScopeButtonGroup.setColumnLayout(0,Qt.Vertical)
+ self.refreshScopeButtonGroup.layout().setSpacing(6)
+ self.refreshScopeButtonGroup.layout().setMargin(11)
+ refreshScopeButtonGroupLayout = QGridLayout(self.refreshScopeButtonGroup.layout())
+ refreshScopeButtonGroupLayout.setAlignment(Qt.AlignTop)
+
+ self.radioButton1 = QRadioButton(self.refreshScopeButtonGroup,"radioButton1")
+ self.radioButton1.setEnabled(0)
+ self.radioButton1.setChecked(1)
+
+ refreshScopeButtonGroupLayout.addWidget(self.radioButton1,0,0)
+
+ self.radioButton2 = QRadioButton(self.refreshScopeButtonGroup,"radioButton2")
+ self.radioButton2.setEnabled(0)
+
+ refreshScopeButtonGroupLayout.addWidget(self.radioButton2,1,0)
+
+ CleaningLevelsLayout.addWidget(self.refreshScopeButtonGroup,4,0)
+ self.TabWidget.insertTab(self.CleaningLevels,QString.fromLatin1(""))
+
+ self.FunctionCommands = QWidget(self.TabWidget,"FunctionCommands")
+ FunctionCommandsLayout = QGridLayout(self.FunctionCommands,1,1,11,6,"FunctionCommandsLayout")
+
+ self.line1_2_2_3 = QFrame(self.FunctionCommands,"line1_2_2_3")
+ self.line1_2_2_3.setFrameShape(QFrame.HLine)
+ self.line1_2_2_3.setFrameShadow(QFrame.Sunken)
+ self.line1_2_2_3.setFrameShape(QFrame.HLine)
+
+ FunctionCommandsLayout.addMultiCellWidget(self.line1_2_2_3,1,1,0,1)
+
+ self.textLabel3_2_2_2 = QLabel(self.FunctionCommands,"textLabel3_2_2_2")
+
+ FunctionCommandsLayout.addMultiCellWidget(self.textLabel3_2_2_2,0,0,0,1)
+
+ self.DefaultsButton = QPushButton(self.FunctionCommands,"DefaultsButton")
+ self.DefaultsButton.setEnabled(1)
+
+ FunctionCommandsLayout.addWidget(self.DefaultsButton,4,0)
+ spacer8_2 = QSpacerItem(20,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ FunctionCommandsLayout.addItem(spacer8_2,4,1)
+
+ self.groupBox3 = QGroupBox(self.FunctionCommands,"groupBox3")
+ self.groupBox3.setColumnLayout(0,Qt.Vertical)
+ self.groupBox3.layout().setSpacing(6)
+ self.groupBox3.layout().setMargin(11)
+ groupBox3Layout = QGridLayout(self.groupBox3.layout())
+ groupBox3Layout.setAlignment(Qt.AlignTop)
+
+ self.textLabel1_2 = QLabel(self.groupBox3,"textLabel1_2")
+
+ groupBox3Layout.addWidget(self.textLabel1_2,0,0)
+
+ self.PrintCommand = QLineEdit(self.groupBox3,"PrintCommand")
+ self.PrintCommand.setEnabled(1)
+
+ groupBox3Layout.addWidget(self.PrintCommand,1,0)
+
+ self.textLabel2_2 = QLabel(self.groupBox3,"textLabel2_2")
+
+ groupBox3Layout.addWidget(self.textLabel2_2,2,0)
+
+ self.textLabel3_3 = QLabel(self.groupBox3,"textLabel3_3")
+
+ groupBox3Layout.addWidget(self.textLabel3_3,4,0)
+
+ self.textLabel4 = QLabel(self.groupBox3,"textLabel4")
+
+ groupBox3Layout.addWidget(self.textLabel4,6,0)
+
+ self.ScanCommand = QLineEdit(self.groupBox3,"ScanCommand")
+
+ groupBox3Layout.addWidget(self.ScanCommand,3,0)
+
+ self.SendFaxCommand = QLineEdit(self.groupBox3,"SendFaxCommand")
+ self.SendFaxCommand.setEnabled(1)
+
+ groupBox3Layout.addWidget(self.SendFaxCommand,5,0)
+
+ self.AccessPCardCommand = QLineEdit(self.groupBox3,"AccessPCardCommand")
+ self.AccessPCardCommand.setEnabled(1)
+
+ groupBox3Layout.addWidget(self.AccessPCardCommand,7,0)
+
+ self.textLabel5 = QLabel(self.groupBox3,"textLabel5")
+
+ groupBox3Layout.addWidget(self.textLabel5,8,0)
+
+ self.MakeCopiesCommand = QLineEdit(self.groupBox3,"MakeCopiesCommand")
+ self.MakeCopiesCommand.setEnabled(1)
+
+ groupBox3Layout.addWidget(self.MakeCopiesCommand,9,0)
+
+ FunctionCommandsLayout.addMultiCellWidget(self.groupBox3,2,2,0,1)
+ spacer49 = QSpacerItem(20,60,QSizePolicy.Minimum,QSizePolicy.Expanding)
+ FunctionCommandsLayout.addItem(spacer49,3,0)
+ self.TabWidget.insertTab(self.FunctionCommands,QString.fromLatin1(""))
+
+ SettingsDialog_baseLayout.addMultiCellWidget(self.TabWidget,0,0,0,2)
+
+ self.languageChange()
+
+ self.resize(QSize(460,565).expandedTo(self.minimumSizeHint()))
+ self.clearWState(Qt.WState_Polished)
+
+ self.connect(self.pushButton31,SIGNAL("clicked()"),self.reject)
+ self.connect(self.pushButton30,SIGNAL("clicked()"),self.accept)
+ self.connect(self.CleaningLevel,SIGNAL("clicked(int)"),self.CleaningLevel_clicked)
+ self.connect(self.DefaultsButton,SIGNAL("clicked()"),self.DefaultsButton_clicked)
+ self.connect(self.TabWidget,SIGNAL("currentChanged(QWidget*)"),self.TabWidget_currentChanged)
+ self.connect(self.autoRefreshCheckBox,SIGNAL("clicked()"),self.autoRefreshCheckBox_clicked)
+ self.connect(self.autoRefreshCheckBox,SIGNAL("toggled(bool)"),self.AutoRefreshRate.setEnabled)
+ self.connect(self.autoRefreshCheckBox,SIGNAL("toggled(bool)"),self.radioButton1.setEnabled)
+ self.connect(self.autoRefreshCheckBox,SIGNAL("toggled(bool)"),self.radioButton2.setEnabled)
+ self.connect(self.refreshScopeButtonGroup,SIGNAL("clicked(int)"),self.refreshScopeButtonGroup_clicked)
+
+ self.setTabOrder(self.TabWidget,self.pushButton30)
+ self.setTabOrder(self.pushButton30,self.pushButton31)
+ self.setTabOrder(self.pushButton31,self.PrintCommand)
+ self.setTabOrder(self.PrintCommand,self.ScanCommand)
+ self.setTabOrder(self.ScanCommand,self.AccessPCardCommand)
+ self.setTabOrder(self.AccessPCardCommand,self.SendFaxCommand)
+ self.setTabOrder(self.SendFaxCommand,self.MakeCopiesCommand)
+ self.setTabOrder(self.MakeCopiesCommand,self.DefaultsButton)
+
+
+ def languageChange(self):
+ self.setCaption(self.__tr("HP Device Manager - Settings"))
+ self.pushButton30.setText(self.__tr("OK"))
+ self.pushButton31.setText(self.__tr("Cancel"))
+ self.textLabel3_2_2.setText(self.__tr("<b>Configure if and when device(s) are automatically refreshed</b>"))
+ self.autoRefreshCheckBox.setText(self.__tr("Enable device auto refresh"))
+ self.CleaningLevel.setTitle(self.__tr("Auto Interval"))
+ self.textLabel1_4.setText(self.__tr("Refresh every:"))
+ self.textLabel1_3.setText(self.__tr("seconds"))
+ self.refreshScopeButtonGroup.setTitle(self.__tr("Device(s) to Refresh "))
+ self.radioButton1.setText(self.__tr("Only currently selected device"))
+ self.radioButton2.setText(self.__tr("All devices"))
+ self.TabWidget.changeTab(self.CleaningLevels,self.__tr("Auto Refresh"))
+ self.textLabel3_2_2_2.setText(self.__tr("<b>Configure what commands to run for device functions</b>"))
+ self.DefaultsButton.setText(self.__tr("Set Defaults"))
+ self.groupBox3.setTitle(self.__tr("Commands"))
+ self.textLabel1_2.setText(self.__tr("Print:"))
+ self.textLabel2_2.setText(self.__tr("Scan:"))
+ self.textLabel3_3.setText(self.__tr("Send PC Fax:"))
+ self.textLabel4.setText(self.__tr("Unload Photo Cards:"))
+ self.textLabel5.setText(self.__tr("Make Copies:"))
+ self.TabWidget.changeTab(self.FunctionCommands,self.__tr("Commands (Advanced)"))
+
+
+ def PrintCmdChangeButton_clicked(self):
+ print "SettingsDialog_base.PrintCmdChangeButton_clicked(): Not implemented yet"
+
+ def ScanCmdChangeButton_clicked(self):
+ print "SettingsDialog_base.ScanCmdChangeButton_clicked(): Not implemented yet"
+
+ def AccessPCardCmdChangeButton_clicked(self):
+ print "SettingsDialog_base.AccessPCardCmdChangeButton_clicked(): Not implemented yet"
+
+ def SendFaxCmdChangeButton_clicked(self):
+ print "SettingsDialog_base.SendFaxCmdChangeButton_clicked(): Not implemented yet"
+
+ def MakeCopiesCmdChangeButton_clicked(self):
+ print "SettingsDialog_base.MakeCopiesCmdChangeButton_clicked(): Not implemented yet"
+
+ def CleaningLevel_clicked(self,a0):
+ print "SettingsDialog_base.CleaningLevel_clicked(int): Not implemented yet"
+
+ def pushButton5_clicked(self):
+ print "SettingsDialog_base.pushButton5_clicked(): Not implemented yet"
+
+ def DefaultsButton_clicked(self):
+ print "SettingsDialog_base.DefaultsButton_clicked(): Not implemented yet"
+
+ def TabWidget_currentChanged(self,a0):
+ print "SettingsDialog_base.TabWidget_currentChanged(QWidget*): Not implemented yet"
+
+ def pushButton6_clicked(self):
+ print "SettingsDialog_base.pushButton6_clicked(): Not implemented yet"
+
+ def EmailTestButton_clicked(self):
+ print "SettingsDialog_base.EmailTestButton_clicked(): Not implemented yet"
+
+ def autoRefreshCheckBox_clicked(self):
+ print "SettingsDialog_base.autoRefreshCheckBox_clicked(): Not implemented yet"
+
+ def refreshScopeButtonGroup_clicked(self,a0):
+ print "SettingsDialog_base.refreshScopeButtonGroup_clicked(int): Not implemented yet"
+
+ def printButtonGroup_clicked(self,a0):
+ print "SettingsDialog_base.printButtonGroup_clicked(int): Not implemented yet"
+
+ def scanButtonGroup_clicked(self,a0):
+ print "SettingsDialog_base.scanButtonGroup_clicked(int): Not implemented yet"
+
+ def faxButtonGroup_clicked(self,a0):
+ print "SettingsDialog_base.faxButtonGroup_clicked(int): Not implemented yet"
+
+ def pcardButtonGroup_clicked(self,a0):
+ print "SettingsDialog_base.pcardButtonGroup_clicked(int): Not implemented yet"
+
+ def copyButtonGroup_clicked(self,a0):
+ print "SettingsDialog_base.copyButtonGroup_clicked(int): Not implemented yet"
+
+ def __tr(self,s,c = None):
+ return qApp.translate("SettingsDialog_base",s,c)
diff --git a/ui/settingsdialog_base.ui b/ui/settingsdialog_base.ui
new file mode 100644
index 0000000..deccad6
--- /dev/null
+++ b/ui/settingsdialog_base.ui
@@ -0,0 +1,503 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>SettingsDialog_base</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>SettingsDialog_base</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>460</width>
+ <height>565</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>HP Device Manager - Settings</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QPushButton" row="1" column="2">
+ <property name="name">
+ <cstring>pushButton30</cstring>
+ </property>
+ <property name="text">
+ <string>OK</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="1" column="1">
+ <property name="name">
+ <cstring>pushButton31</cstring>
+ </property>
+ <property name="text">
+ <string>Cancel</string>
+ </property>
+ </widget>
+ <spacer row="1" column="0">
+ <property name="name">
+ <cstring>spacer40</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>430</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QTabWidget" row="0" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>TabWidget</cstring>
+ </property>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>CleaningLevels</cstring>
+ </property>
+ <attribute name="title">
+ <string>Auto Refresh</string>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>textLabel3_2_2</cstring>
+ </property>
+ <property name="text">
+ <string>&lt;b&gt;Configure if and when device(s) are automatically refreshed&lt;/b&gt;</string>
+ </property>
+ </widget>
+ <widget class="Line" row="1" column="0">
+ <property name="name">
+ <cstring>line1_2_2</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>HLine</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Sunken</enum>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ </widget>
+ <spacer row="5" column="0">
+ <property name="name">
+ <cstring>spacer8</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>30</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QCheckBox" row="2" column="0">
+ <property name="name">
+ <cstring>autoRefreshCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>Enable device auto refresh</string>
+ </property>
+ </widget>
+ <widget class="QButtonGroup" row="3" column="0">
+ <property name="name">
+ <cstring>CleaningLevel</cstring>
+ </property>
+ <property name="title">
+ <string>Auto Interval</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer row="0" column="2">
+ <property name="name">
+ <cstring>spacer9_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>290</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>textLabel1_4</cstring>
+ </property>
+ <property name="text">
+ <string>Refresh every:</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="0" column="1">
+ <property name="name">
+ <cstring>layout7</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QSpinBox">
+ <property name="name">
+ <cstring>AutoRefreshRate</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="wrapping">
+ <bool>true</bool>
+ </property>
+ <property name="buttonSymbols">
+ <enum>PlusMinus</enum>
+ </property>
+ <property name="maxValue">
+ <number>60</number>
+ </property>
+ <property name="minValue">
+ <number>5</number>
+ </property>
+ <property name="value">
+ <number>6</number>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1_3</cstring>
+ </property>
+ <property name="text">
+ <string>seconds</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QButtonGroup" row="4" column="0">
+ <property name="name">
+ <cstring>refreshScopeButtonGroup</cstring>
+ </property>
+ <property name="title">
+ <string>Device(s) to Refresh </string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QRadioButton" row="0" column="0">
+ <property name="name">
+ <cstring>radioButton1</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Only currently selected device</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QRadioButton" row="1" column="0">
+ <property name="name">
+ <cstring>radioButton2</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>All devices</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>FunctionCommands</cstring>
+ </property>
+ <attribute name="title">
+ <string>Commands (Advanced)</string>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="Line" row="1" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>line1_2_2_3</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>HLine</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Sunken</enum>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>textLabel3_2_2_2</cstring>
+ </property>
+ <property name="text">
+ <string>&lt;b&gt;Configure what commands to run for device functions&lt;/b&gt;</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="4" column="0">
+ <property name="name">
+ <cstring>DefaultsButton</cstring>
+ </property>
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="text">
+ <string>Set Defaults</string>
+ </property>
+ </widget>
+ <spacer row="4" column="1">
+ <property name="name">
+ <cstring>spacer8_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QGroupBox" row="2" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>groupBox3</cstring>
+ </property>
+ <property name="title">
+ <string>Commands</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>textLabel1_2</cstring>
+ </property>
+ <property name="text">
+ <string>Print:</string>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="1" column="0">
+ <property name="name">
+ <cstring>PrintCommand</cstring>
+ </property>
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>textLabel2_2</cstring>
+ </property>
+ <property name="text">
+ <string>Scan:</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="4" column="0">
+ <property name="name">
+ <cstring>textLabel3_3</cstring>
+ </property>
+ <property name="text">
+ <string>Send PC Fax:</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="6" column="0">
+ <property name="name">
+ <cstring>textLabel4</cstring>
+ </property>
+ <property name="text">
+ <string>Unload Photo Cards:</string>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="3" column="0">
+ <property name="name">
+ <cstring>ScanCommand</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="5" column="0">
+ <property name="name">
+ <cstring>SendFaxCommand</cstring>
+ </property>
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="7" column="0">
+ <property name="name">
+ <cstring>AccessPCardCommand</cstring>
+ </property>
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QLabel" row="8" column="0">
+ <property name="name">
+ <cstring>textLabel5</cstring>
+ </property>
+ <property name="text">
+ <string>Make Copies:</string>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="9" column="0">
+ <property name="name">
+ <cstring>MakeCopiesCommand</cstring>
+ </property>
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <spacer row="3" column="0">
+ <property name="name">
+ <cstring>spacer49</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>60</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+ </widget>
+ </widget>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>pushButton31</sender>
+ <signal>clicked()</signal>
+ <receiver>SettingsDialog_base</receiver>
+ <slot>reject()</slot>
+ </connection>
+ <connection>
+ <sender>pushButton30</sender>
+ <signal>clicked()</signal>
+ <receiver>SettingsDialog_base</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection>
+ <sender>CleaningLevel</sender>
+ <signal>clicked(int)</signal>
+ <receiver>SettingsDialog_base</receiver>
+ <slot>CleaningLevel_clicked(int)</slot>
+ </connection>
+ <connection>
+ <sender>DefaultsButton</sender>
+ <signal>clicked()</signal>
+ <receiver>SettingsDialog_base</receiver>
+ <slot>DefaultsButton_clicked()</slot>
+ </connection>
+ <connection>
+ <sender>TabWidget</sender>
+ <signal>currentChanged(QWidget*)</signal>
+ <receiver>SettingsDialog_base</receiver>
+ <slot>TabWidget_currentChanged(QWidget*)</slot>
+ </connection>
+ <connection>
+ <sender>autoRefreshCheckBox</sender>
+ <signal>clicked()</signal>
+ <receiver>SettingsDialog_base</receiver>
+ <slot>autoRefreshCheckBox_clicked()</slot>
+ </connection>
+ <connection>
+ <sender>autoRefreshCheckBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>AutoRefreshRate</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>autoRefreshCheckBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>radioButton1</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>autoRefreshCheckBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>radioButton2</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>refreshScopeButtonGroup</sender>
+ <signal>clicked(int)</signal>
+ <receiver>SettingsDialog_base</receiver>
+ <slot>refreshScopeButtonGroup_clicked(int)</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>TabWidget</tabstop>
+ <tabstop>pushButton30</tabstop>
+ <tabstop>pushButton31</tabstop>
+ <tabstop>PrintCommand</tabstop>
+ <tabstop>ScanCommand</tabstop>
+ <tabstop>AccessPCardCommand</tabstop>
+ <tabstop>SendFaxCommand</tabstop>
+ <tabstop>MakeCopiesCommand</tabstop>
+ <tabstop>DefaultsButton</tabstop>
+</tabstops>
+<slots>
+ <slot>PrintCmdChangeButton_clicked()</slot>
+ <slot>ScanCmdChangeButton_clicked()</slot>
+ <slot>AccessPCardCmdChangeButton_clicked()</slot>
+ <slot>SendFaxCmdChangeButton_clicked()</slot>
+ <slot>MakeCopiesCmdChangeButton_clicked()</slot>
+ <slot>CleaningLevel_clicked( int )</slot>
+ <slot>pushButton5_clicked()</slot>
+ <slot>DefaultsButton_clicked()</slot>
+ <slot>TabWidget_currentChanged( QWidget * )</slot>
+ <slot>pushButton6_clicked()</slot>
+ <slot>EmailTestButton_clicked()</slot>
+ <slot>autoRefreshCheckBox_clicked()</slot>
+ <slot>refreshScopeButtonGroup_clicked( int )</slot>
+ <slot>printButtonGroup_clicked( int )</slot>
+ <slot>scanButtonGroup_clicked( int )</slot>
+ <slot>faxButtonGroup_clicked( int )</slot>
+ <slot>pcardButtonGroup_clicked( int )</slot>
+ <slot>copyButtonGroup_clicked( int )</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/ui/setupform.py b/ui/setupform.py
new file mode 100644
index 0000000..a2e56b5
--- /dev/null
+++ b/ui/setupform.py
@@ -0,0 +1,1112 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2001-2009 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch, Goutam Korra, Naga Samrat Chowdary Narla,
+
+# Std Lib
+import sys
+import socket
+import re
+import gzip
+import time
+import os.path, os
+import operator
+
+# Local
+from base.g import *
+from base import device, utils, models, pkit
+from prnt import cups
+from installer import core_install
+from ui_utils import load_pixmap
+
+try:
+ from fax import fax
+ #from fax import fax
+ fax_import_ok = True
+except ImportError:
+ # This can fail on Python < 2.3 due to the datetime module
+ fax_import_ok = False
+ log.warning("Fax setup disabled - Python 2.3+ required.")
+
+# Qt
+from qt import *
+from setupform_base import SetupForm_base
+from setupsettings import SetupSettings
+from setupmanualfind import SetupManualFind
+
+def restart_cups():
+ if os.path.exists('/etc/init.d/cups'):
+ return '/etc/init.d/cups restart'
+
+ elif os.path.exists('/etc/init.d/cupsys'):
+ return '/etc/init.d/cupsys restart'
+
+ else:
+ return 'killall -HUP cupsd'
+
+
+class DeviceListViewItem(QListViewItem):
+ def __init__(self, parent, device_uri, mq, c1='', c2='', c3='', c4=''):
+ QListViewItem.__init__(self, parent, c1, c2, c3, c4)
+ self.device_uri = device_uri
+ self.mq = mq
+
+
+class PPDListViewItem(QListViewItem):
+ def __init__(self, parent, ppd_file, c1=''):
+ QListViewItem.__init__(self, parent, ppd_file, c1)
+ self.ppd_file = ppd_file
+
+
+class PrinterNameValidator(QValidator):
+ def __init__(self, parent=None, name=None):
+ QValidator.__init__(self, parent, name)
+
+ def validate(self, input, pos):
+ input = unicode(input)
+
+ if not input:
+ return QValidator.Acceptable, pos
+
+ elif input[pos-1] in u"""~`!@#$%^&*()-=+[]{}()\\/,.<>?'\";:| """:
+ return QValidator.Invalid, pos
+
+ # TODO: How to determine if unicode char is "printable" and acceptable
+ # to CUPS?
+ #elif input != utils.printable(input):
+ # return QValidator.Invalid, pos
+
+ else:
+ return QValidator.Acceptable, pos
+
+
+
+class PhoneNumValidator(QValidator):
+ def __init__(self, parent=None, name=None):
+ QValidator.__init__(self, parent, name)
+
+ def validate(self, input, pos):
+ input = unicode(input)
+
+ if not input:
+ return QValidator.Acceptable, pos
+
+ elif input[pos-1] not in u'0123456789-(+) ':
+ return QValidator.Invalid, pos
+
+ else:
+ return QValidator.Acceptable, pos
+
+
+
+class SetupForm(SetupForm_base):
+ def __init__(self, bus, param, jd_port=1, parent=None, name=None, modal=0, fl=0):
+ SetupForm_base.__init__(self, parent, name, modal, fl)
+
+ self.start_page = self.ConnectionPage
+ self.first_page = True
+
+ if bus is None:
+ self.bus = 'usb'
+ else:
+ self.bus = bus[0]
+ self.start_page = self.ProbedDevicesPage
+
+ if not prop.par_build:
+ self.parRadioButton.setEnabled(False)
+
+ if not prop.net_build:
+ self.netRadioButton.setEnabled(False)
+
+ if not prop.par_build and not prop.net_build:
+ self.bus = 'usb'
+ self.start_page = self.ProbedDevicesPage
+
+ self.param = param
+ self.jd_port = jd_port
+
+ if self.param:
+ # Validate param...
+ device_uri, sane_uri, fax_uri = device.makeURI(self.param, self.jd_port)
+
+ if device_uri:
+ self.device_uri = device_uri
+ self.start_page = self.PPDPage
+
+ else:
+ self.FailureUI(self.__tr("<b>Device not found.</b> <p>Please make sure your printer is properly connected and powered-on."))
+
+ self.setIcon(load_pixmap('hp_logo', '128x128'))
+
+ self.connectionTypeButtonGroup.setButton(0)
+ self.device_uri = ''
+ self.mq = {}
+ self.prev_page = None
+ self.probe_pat = re.compile(r'(.*?)\s"(.*?)"\s"(.*?)"\s"(.*?)"', re.IGNORECASE)
+ self.printer_name = ''
+ self.ppd_list = []
+ self.location = ''
+ self.desc = ''
+ self.filter = []
+ self.search = ''
+ self.ttl = 4
+ self.timeout = 5
+ self.printer_name_ok = True
+ self.fax_name_ok = True
+ self.fax_number = ''
+ self.fax_name = ''
+ self.printer_fax_names_same = False
+ self.fax_name_company = ''
+ self.fax_location = ''
+ self.fax_desc = ''
+ self.print_test_page = True
+ self.printerNameLineEdit.setValidator(PrinterNameValidator(self.printerNameLineEdit))
+ self.faxNameLineEdit.setValidator(PrinterNameValidator(self.faxNameLineEdit))
+ self.faxNumberLineEdit.setValidator(PhoneNumValidator(self.faxNumberLineEdit))
+ self.setTitleFont(QFont("Helvetica", 16))
+ self.setBackEnabled(self.FinishedPage, False)
+ self.bg = self.printerNameLineEdit.paletteBackgroundColor()
+ self.setHelpEnabled(self.ConnectionPage, False)
+ self.setHelpEnabled(self.ProbedDevicesPage, False)
+ self.setHelpEnabled(self.PPDPage, False)
+ self.setHelpEnabled(self.PrinterNamePage, False)
+ self.setHelpEnabled(self.FinishedPage, False)
+
+ self.faxNameLineEdit.setMaxLength(50)
+ self.printerNameLineEdit.setMaxLength(50)
+
+ QToolTip.add(self.searchFiltersPushButton2,
+ self.__tr('Current: Filter: [%2] Search: "%3" TTL: %4 Timeout: %5s').arg(','.join(self.filter)).arg(self.search or '').arg(self.ttl).arg(self.timeout))
+
+ cups.setPasswordCallback(showPasswordUI)
+
+
+ def showPage(self, page):
+ orig_page = page
+
+ if self.first_page:
+ page = self.start_page
+ self.first_page = False
+
+ log.debug("%s %s %s" % ("*"*20, "showPage(%s)" % page.name(), "*"*20))
+
+ try:
+ log.debug("%s --> %s" % (self.prev_page.name(), page.name()))
+ except AttributeError:
+ log.debug("--> %s" % page.name())
+
+ if page is self.ConnectionPage: # start --> ConnectionPage
+ pass
+
+ elif page is self.ProbedDevicesPage:
+ # ConnectionPage --> ProbedDevicesPage/EnterIPPage/DeviceNotFoundPage
+ devices_found = self.updateProbedDevicesPage()
+
+
+ elif page is self.PPDPage: # ProbedDevicesPage --> PPDPage
+ if self.param:
+ device_uri, sane_uri, fax_uri = device.makeURI(self.param, self.jd_port)
+
+ if device_uri:
+ self.device_uri = device_uri
+
+ back_end, is_hp, bus, model, serial, dev_file, host, zc, port = \
+ device.parseDeviceURI(self.device_uri)
+
+ self.bus = bus
+ self.mq = device.queryModelByURI(self.device_uri)
+
+ norm_model = models.normalizeModelName(model).lower()
+
+ core = core_install.CoreInstall()
+ core.set_plugin_version()
+ plugin = self.mq.get('plugin', PLUGIN_NONE)
+ plugin_reason = self.mq.get('plugin-reason', PLUGIN_REASON_NONE)
+ if plugin > PLUGIN_NONE and core.check_for_plugin() != PLUGIN_INSTALLED:
+ ok, sudo_ok = pkit.run_plugin_command(plugin == PLUGIN_REQUIRED, plugin_reason)
+ if not sudo_ok:
+ self.FailureUI(self.__tr("<b>Unable to find an appropriate su/sudo utility to run hp-plugin.</b><p>Install kdesu, gnomesu, or gksu.</p>"))
+ return
+ if not ok or core.check_for_plugin() != PLUGIN_INSTALLED:
+ if plugin == PLUGIN_REQUIRED:
+ self.FailureUI(self.__tr("<b>The printer you are trying to setup requires a binary driver plug-in and it failed to install.</b><p>Please check your internet connection and try again.</p><p>Visit <u>http://hplipopensource.com</u> for more information.</p>"))
+ return
+ else:
+ self.WarningUI(self.__tr("Either you have chosen to skip the installation of the optional plug-in or that installation has failed. Your printer may not function at optimal performance."))
+
+ self.updatePPDPage()
+
+ elif page is self.PrinterNamePage:
+ self.setDefaultPrinterName()
+
+ if fax_import_ok and prop.fax_build and \
+ self.mq.get('fax-type', FAX_TYPE_NONE) not in (FAX_TYPE_NONE, FAX_TYPE_NOT_SUPPORTED):
+
+ self.faxCheckBox.setEnabled(True)
+ self.faxCheckBox.setEnabled(True)
+ self.faxNameLineEdit.setEnabled(True)
+ self.faxNumberLineEdit.setEnabled(True)
+ self.faxNameCoLineEdit.setEnabled(True)
+ self.faxLocationLineEdit.setEnabled(True)
+ self.faxDescriptionLineEdit.setEnabled(True)
+ self.faxInfoGroupBox.setEnabled(True)
+ self.setup_fax = True
+ self.setDefaultFaxName()
+ self.readwriteFaxInformation(True)
+
+ else:
+ self.setup_fax = False
+ self.fax_name_ok = True
+ self.defaultFaxNamePushButton.setEnabled(False)
+ self.faxCheckBox.setEnabled(False)
+ self.faxNameLineEdit.setEnabled(False)
+ self.faxNumberLineEdit.setEnabled(False)
+ self.faxNameCoLineEdit.setEnabled(False)
+ self.faxLocationLineEdit.setEnabled(False)
+ self.faxDescriptionLineEdit.setEnabled(False)
+ self.faxInfoGroupBox.setEnabled(False)
+
+ elif page is self.FinishedPage:
+ self.lineEdit1.setText(self.printer_name)
+ self.lineEdit2.setText(self.location)
+ self.lineEdit3.setText(self.desc)
+ self.lineEdit4.setText(self.ppd_file)
+
+ #log.debug("Restarting CUPS...")
+ #status, output = utils.run(restart_cups())
+ #log.debug("Restart CUPS returned: exit=%d output=%s" % (status, output))
+
+ self.setupPrinter()
+
+ if self.setup_fax:
+ self.setupFax()
+ self.readwriteFaxInformation(False)
+
+ self.lineEdit5.setText(self.fax_number)
+ self.lineEdit6.setText(self.fax_name)
+ self.lineEdit7.setText(self.fax_name_company)
+ self.lineEdit8.setText(self.fax_location)
+ self.lineEdit9.setText(self.fax_desc)
+
+ self.faxGroupBox.setEnabled(True)
+
+ else:
+ self.faxGroupBox.setEnabled(False)
+
+ self.setFinishEnabled(self.FinishedPage, True)
+
+ if orig_page != page:
+ try:
+ log.debug("%s --> %s" % (self.prev_page.name(), page.name()))
+ except AttributeError:
+ log.debug("--> %s" % page.name())
+
+ self.prev_page = page
+ QWizard.showPage(self, page)
+
+ if page is self.ProbedDevicesPage: # ConnectionPage --> ProbedDevicesPage/EnterIPPage/DeviceNotFoundPage
+ if not devices_found:
+ self.FailureUI(self.__tr("<b>No devices found.</b><p>Please make sure your printer is properly connected and powered-on."))
+
+
+ #
+ # CONNECTION TYPE PAGE
+ #
+
+ def connectionTypeButtonGroup_clicked(self,a0):
+ if a0 == 0:
+ self.bus = 'usb'
+
+ elif a0 == 1:
+ self.bus = 'net'
+
+ elif a0 == 2:
+ self.bus = 'par'
+
+ log.debug(self.bus)
+
+
+ def searchFiltersPushButton2_clicked(self):
+ self.settingsDlg()
+
+ #
+ # FILTERS SEARCH SETTINGS
+ #
+
+ def settingsDlg(self):
+ dlg = SetupSettings(self.bus, self.filter, self.search, self.ttl, self.timeout, self)
+ if dlg.exec_loop() == QDialog.Accepted:
+ #self.filter = [x.lower().strip() for x in dlg.filter.split(',')]
+ self.filter = dlg.filter
+ self.search = dlg.search
+ self.ttl = dlg.ttl
+ self.timeout = dlg.timeout
+
+ t = self.__tr('Current Settings: Filter: [%2] Search: "%3" TTL: %4 Timeout: %5s').arg(','.join(self.filter)).arg(self.search or '').arg(self.ttl).arg(self.timeout)
+
+ QToolTip.add(self.searchFiltersPushButton2, t)
+ QToolTip.add(self.searchFiltersPushButton, t)
+ return True
+
+ return False
+
+ #
+ # PROBED DEVICES PAGE
+ #
+
+ def updateProbedDevicesPage(self, devices=None, param=''):
+ QApplication.setOverrideCursor(QApplication.waitCursor)
+
+ if self.bus == 'net':
+ io_str = self.__tr("network")
+
+ elif self.bus == 'usb':
+ io_str = self.__tr("USB bus")
+
+ elif self.bus == 'par':
+ io_str = self.__tr("parallel port")
+
+ QToolTip.add(self.searchFiltersPushButton, self.__tr('Current Settings: Filter: [%2] Search: "%3" TTL: %4 Timeout: %5s').arg(','.join(self.filter)).arg(self.search or '').arg(self.ttl).arg(self.timeout))
+
+ log.debug("Updating probed devices list...")
+ log.debug(self.bus)
+
+ self.probedDevicesListView.clear()
+
+ while self.probedDevicesListView.columns():
+ self.probedDevicesListView.removeColumn(0)
+
+ self.probedDevicesListView.addColumn(self.__tr("Model"))
+
+ if self.bus == 'usb':
+ self.probedDevicesListView.addColumn(self.__tr("Serial No."))
+
+ elif self.bus == 'net':
+ self.probedDevicesListView.addColumn(self.__tr("IP Address"))
+ self.probedDevicesListView.addColumn(self.__tr("Host Name"))
+
+ elif self.bus == 'par':
+ self.probedDevicesListView.addColumn(self.__tr("Device"))
+
+ self.probedDevicesListView.addColumn(self.__tr("Device URI"))
+
+ if devices is None:
+ FILTER_MAP = {'print' : None,
+ 'none' : None,
+ 'scan': 'scan-type',
+ 'copy': 'copy-type',
+ 'pcard': 'pcard-type',
+ 'fax': 'fax-type',
+ }
+
+ filter_dict = {}
+
+ if prop.fax_build and prop.scan_build:
+ for f in self.filter:
+ if f in FILTER_MAP:
+ filter_dict[FILTER_MAP[f]] = (operator.gt, 0)
+ else:
+ filter_dict[f] = (operator.gt, 0)
+ else:
+ filter_dict['scan-type'] = (operator.ge, SCAN_TYPE_NONE)
+
+ devices = device.probeDevices([self.bus], self.timeout, self.ttl, filter_dict, self.search, net_search='slp')
+
+ self.probeHeadingTextLabel.setText(self.__tr("%1 device(s) found on the %1:").arg(len(devices)).arg(io_str))
+
+ else:
+ if self.bus == 'net':
+ self.probeHeadingTextLabel.setText(self.__tr("%1 device(s) found on the %1 at address %2:").arg(len(devices)).arg(io_str).arg(param))
+
+ elif self.bus == 'usb':
+ self.probeHeadingTextLabel.setText(self.__tr("%1 device(s) found on the %1 at ID %2:").arg(len(devices)).arg(io_str).arg(param))
+
+ elif self.bus == 'par':
+ self.probeHeadingTextLabel.setText(self.__tr("%1 device(s) found on the %1 device node ID %2:").arg(len(devices)).arg(io_str).arg(param))
+
+ log.debug(devices)
+
+ if devices:
+ row = 0
+ for d in devices:
+ back_end, is_hp, bus, model, serial, dev_file, host, zc, port = device.parseDeviceURI(d)
+
+ mq = {}
+ model_ui = models.normalizeModelUIName(model)
+
+ if self.bus == 'usb':
+ i = DeviceListViewItem(self.probedDevicesListView, d, mq, model_ui, serial, d)
+
+ elif self.bus == 'net':
+ i = DeviceListViewItem(self.probedDevicesListView, d, mq, model_ui, host, devices[d][2], d)
+
+ elif self.bus == 'par':
+ i = DeviceListViewItem(self.probedDevicesListView, d, mq, model_ui, dev_file, d)
+
+ row += 1
+
+ i = self.probedDevicesListView.firstChild()
+ self.probedDevicesListView.setCurrentItem(i)
+ self.probedDevicesListView.setSelected(i, True)
+ item = self.probedDevicesListView.currentItem()
+ self.device_uri = item.device_uri
+ self.updateModelQuery(item)
+ self.setNextEnabled(self.ProbedDevicesPage, True)
+ log.debug(self.device_uri)
+
+ else:
+ self.setNextEnabled(self.ProbedDevicesPage, False)
+ QApplication.restoreOverrideCursor()
+ return False
+
+ QApplication.restoreOverrideCursor()
+ return True
+
+ def updateModelQuery(self, item):
+ if not item.mq:
+ item.mq = device.queryModelByURI(self.device_uri)
+ self.mq = item.mq
+ else:
+ self.mq = item.mq
+
+ log.debug(self.mq)
+
+ def probedDevicesListView_currentChanged(self, item):
+ self.device_uri = item.device_uri
+ self.updateModelQuery(item)
+ log.debug(self.device_uri)
+
+ def probeUpdatePushButton_clicked(self):
+ self.updateProbedDevicesPage()
+
+ def searchFiltersPushButton_clicked(self):
+ if self.settingsDlg():
+ self.updateProbedDevicesPage()
+
+ def manualFindPushButton_clicked(self):
+ dlg = SetupManualFind(self.bus, self)
+ if dlg.exec_loop() == QDialog.Accepted:
+ QApplication.setOverrideCursor(QApplication.waitCursor)
+
+ cups_uri, sane_uri, fax_uri = device.makeURI(dlg.param)
+
+ if cups_uri:
+ back_end, is_hp, bus, model, serial, dev_file, host, zc, port = device.parseDeviceURI(cups_uri)
+ name = ''
+ if self.bus == 'net':
+ try:
+ name = socket.gethostbyaddr(host)[0]
+ except socket.herror:
+ name = ''
+
+ QApplication.restoreOverrideCursor()
+ self.updateProbedDevicesPage({cups_uri: (model, model, name)}, dlg.param)
+ else:
+ QApplication.restoreOverrideCursor()
+ self.updateProbedDevicesPage([], dlg.param)
+
+ #
+ # PPD
+ #
+
+ def updatePPDPage(self, ppds=None):
+ QApplication.setOverrideCursor(QApplication.waitCursor)
+ try:
+ back_end, is_hp, bus, model, serial, dev_file, host, zc, port = device.parseDeviceURI(self.device_uri)
+ except Error:
+ self.FailureUI(self.__tr("<b>Device not found or invalid HPLIP device.</b><p>If you specified a USB ID, IP address, or other parameter, please re-check it and try again."))
+ self.close()
+ sys.exit()
+
+ if ppds is None or not ppds:
+ ppds = cups.getSystemPPDs()
+
+ #print ppds
+
+ default_model = utils.xstrip(model.replace('series', '').replace('Series', ''), '_')
+ stripped_model = cups.stripModel2(models.normalizeModelName(model).lower())
+
+
+ #Check if common ppd name is already given in models.dat(This is needed because in case of devices having more than one derivatives
+ #will have diffrent model name strings in device ID, because of which we don't get the common ppd name for search)
+
+ ppd_name = self.mq.get('ppd-name',0)
+
+ if ppd_name == 0:
+ self.ppd = cups.getPPDFile2(stripped_model, ppds)
+ else:
+ self.ppd = cups.getPPDFile2(ppd_name, ppds)
+
+ log.debug(self.ppd)
+ self.ppdListView.clear()
+
+ if self.ppd is not None:
+ #for ppd in self.ppd_dict:
+ PPDListViewItem(self.ppdListView, self.ppd[0], self.ppd[1])
+
+# i = self.ppdListView.firstChild()
+# self.ppdListView.setCurrentItem(i)
+# self.ppdListView.setSelected(i, True)
+# self.ppd_file = self.ppdListView.currentItem().ppd_file
+ self.ppd_file = self.ppd[0]
+ log.debug(self.ppd_file)
+
+ else:
+ self.FailureUI(self.__tr('<b>PPD not file found.</b><p>An appropriate PPD file could not be found. Please check your HPLIP install, use <i>Select Other...</i>, or download one from linuxprinting.org.'))
+
+ QApplication.restoreOverrideCursor()
+
+
+ def ppdListView_currentChanged(self,a0):
+ self.ppd_file = a0.ppd_file
+ log.debug(self.ppd_file)
+
+
+ def otherPPDPushButton_clicked(self):
+ ppd_dir = sys_conf.get('dirs', 'ppd')
+ ppd_file = unicode(QFileDialog.getOpenFileName(ppd_dir, "PPD Files (*.ppd *.ppd.gz);;All Files (*)", self, "open file dialog", "Choose a PPD file"))
+
+ if ppd_file and os.path.exists(ppd_file):
+ self.updatePPDPage({ppd_file: cups.getPPDDescription(ppd_file)})
+ else:
+ self.updatePPDPage()
+
+ def ppdDefaultsPushButton_clicked(self):
+ self.updatePPDPage()
+
+
+ #
+ # PRINTER/FAX INFORMATION PAGE
+ #
+
+ def setDefaultPrinterName(self):
+ self.installed_print_devices = device.getSupportedCUPSDevices(['hp'])
+ #self.installed_print_devices = device.getSupportedCUPSDevices('*')
+ log.debug(self.installed_print_devices)
+
+ self.installed_queues = [p.name for p in cups.getPrinters()]
+
+ back_end, is_hp, bus, model, serial, dev_file, host, zc, port = device.parseDeviceURI(self.device_uri)
+ default_model = utils.xstrip(model.replace('series', '').replace('Series', ''), '_')
+
+ printer_name = default_model
+
+ installed_printer_names = device.getSupportedCUPSPrinterNames(['hp'])
+ # Check for duplicate names
+ if (self.device_uri in self.installed_print_devices and printer_name in self.installed_print_devices[self.device_uri]) \
+ or (printer_name in installed_printer_names):
+ i = 2
+ while True:
+ t = printer_name + "_%d" % i
+ if (t not in installed_printer_names) and (self.device_uri not in self.installed_print_devices or t not in self.installed_print_devices[self.device_uri]):
+ printer_name += "_%d" % i
+ break
+ i += 1
+
+ self.printer_name_ok = True
+ self.printerNameLineEdit.setText(printer_name)
+ log.debug(printer_name)
+ self.printerNameLineEdit.setPaletteBackgroundColor(self.bg)
+ self.defaultPrinterNamePushButton.setEnabled(False)
+ self.printer_name = printer_name
+
+
+ def setEditErrors(self):
+ if self.printer_name_ok:
+ self.printerNameLineEdit.setPaletteBackgroundColor(self.bg)
+ self.printer_name_ok = True
+
+ if self.fax_name_ok:
+ self.setNextEnabled(self.PrinterNamePage, True)
+
+ QToolTip.remove(self.printerNameLineEdit)
+
+ else:
+ self.printerNameLineEdit.setPaletteBackgroundColor(QColor(0xff, 0x99, 0x99))
+ self.setNextEnabled(self.PrinterNamePage, False)
+
+ if self.fax_name_ok:
+ self.fax_name_ok = True
+ self.faxNameLineEdit.setPaletteBackgroundColor(self.bg)
+
+ if self.printer_name_ok:
+ self.setNextEnabled(self.PrinterNamePage, True)
+
+ QToolTip.remove(self.faxNameLineEdit)
+
+ else:
+ self.faxNameLineEdit.setPaletteBackgroundColor(QColor(0xff, 0x99, 0x99))
+ self.setNextEnabled(self.PrinterNamePage, False)
+
+
+ def printerNameLineEdit_textChanged(self,a0):
+ self.printer_name = unicode(a0)
+ self.defaultPrinterNamePushButton.setEnabled(True)
+
+ self.printer_name_ok = True
+
+ if not self.printer_name:
+ QToolTip.add(self.printerNameLineEdit, self.__tr('You must enter a name for the printer.'))
+ self.printer_name_ok = False
+
+ elif self.fax_name == self.printer_name:
+ s = self.__tr('The printer name and fax name must be different. Please choose different names.')
+ QToolTip.add(self.faxNameLineEdit, s)
+ QToolTip.add(self.printerNameLineEdit, s)
+ self.fax_name_ok = False
+ self.printer_name_ok = False
+ self.printer_fax_names_same = True
+
+ elif self.printer_name in self.installed_queues:
+ QToolTip.add(self.printerNameLineEdit,
+ self.__tr('A printer already exists with this name. Please choose a different name.'))
+ self.printer_name_ok = False
+
+ elif self.printer_fax_names_same:
+ if self.fax_name != self.printer_name:
+ self.printer_fax_names_same = False
+ self.printer_name_ok = True
+
+ self.faxNameLineEdit.emit(SIGNAL("textChanged(const QString&)"),
+ (self.faxNameLineEdit.text(),))
+
+ self.setEditErrors()
+
+
+ def printerLocationLineEdit_textChanged(self, a0):
+ self.location = unicode(a0)
+
+ def printerDescriptionLineEdit_textChanged(self,a0):
+ self.desc = unicode(a0)
+
+ def faxLocationLineEdit_textChanged(self,a0):
+ self.fax_location = unicode(a0)
+
+ def faxDescriptionLineEdit_textChanged(self,a0):
+ self.fax_desc = unicode(a0)
+
+ def defaultPrinterNamePushButton_clicked(self):
+ self.setDefaultPrinterName()
+ self.defaultPrinterNamePushButton.setEnabled(False)
+
+ def setDefaultFaxName(self):
+ self.installed_fax_devices = device.getSupportedCUPSDevices(['hpfax'])
+ log.debug(self.installed_fax_devices)
+
+ self.fax_uri = self.device_uri.replace('hp:', 'hpfax:')
+
+ back_end, is_hp, bus, model, serial, dev_file, host, zc, port = device.parseDeviceURI(self.fax_uri)
+ default_model = utils.xstrip(model.replace('series', '').replace('Series', ''), '_')
+
+ fax_name = default_model + "_fax"
+ installed_fax_names = device.getSupportedCUPSPrinterNames(['hpfax'])
+
+ # Check for duplicate names
+ if (self.fax_uri in self.installed_fax_devices and fax_name in self.installed_fax_devices[self.fax_uri]) \
+ or (fax_name in installed_fax_names):
+ #if fax_name in self.installed_queues or fax_name == self.printer_name:
+ i = 2
+ while True:
+ t = fax_name + "_%d" % i
+ if (t not in installed_fax_names) and (self.fax_uri not in self.installed_fax_devices or t not in self.installed_fax_devices[self.fax_uri]):
+ fax_name += "_%d" % i
+ break
+ i += 1
+
+ self.fax_name_ok = True
+ self.faxNameLineEdit.setText(fax_name)
+ self.faxNameLineEdit.setPaletteBackgroundColor(self.bg)
+ self.defaultFaxNamePushButton.setEnabled(False)
+ self.fax_name = fax_name
+ #self.fax_name_error = False
+
+ def faxNameLineEdit_textChanged(self, a0):
+ self.fax_name = unicode(a0)
+ self.defaultFaxNamePushButton.setEnabled(True)
+
+ self.fax_name_ok = True
+
+ if not self.fax_name:
+ QToolTip.add(self.faxNameLineEdit, self.__tr('You must enter a fax name.'))
+ self.fax_name_ok = False
+
+ elif self.fax_name == self.printer_name:
+ s = self.__tr('The printer name and fax name must be different. Please choose different names.')
+ QToolTip.add(self.faxNameLineEdit, s)
+ QToolTip.add(self.printerNameLineEdit, s)
+ self.printer_name_ok = False
+ self.fax_name_ok = False
+ self.printer_fax_names_same = True
+
+ elif self.fax_name in self.installed_queues:
+ QToolTip.add(self.faxNameLineEdit,
+ self.__tr('A fax already exists with this name. Please choose a different name.'))
+ self.fax_name_ok = False
+
+ elif self.printer_fax_names_same:
+ if self.fax_name != self.printer_name:
+ self.printer_fax_names_same = False
+ self.fax_name_ok = True
+
+ self.printerNameLineEdit.emit(SIGNAL("textChanged(const QString&)"),
+ (self.printerNameLineEdit.text(),))
+
+ self.setEditErrors()
+
+
+ def faxNumberLineEdit_textChanged(self, a0):
+ self.fax_number = unicode(a0)
+
+ def faxNameCoLineEdit_textChanged(self, a0):
+ self.fax_name_company = unicode(a0)
+
+ def faxCheckBox_clicked(self):
+ pass
+
+ def faxCheckBox_toggled(self, a0):
+ self.setup_fax = bool(a0)
+
+ if not self.setup_fax and not self.fax_name_ok:
+ self.setDefaultFaxName()
+
+ def printTestPageCheckBox_toggled(self, a0):
+ self.print_test_page = bool(a0)
+
+ def defaultFaxNamePushButton_clicked(self):
+ self.setDefaultFaxName()
+ self.defaultFaxNamePushButton.setEnabled(False)
+
+ def readwriteFaxInformation(self, read=True):
+ try:
+ QApplication.setOverrideCursor(QApplication.waitCursor)
+
+ d = fax.getFaxDevice(self.fax_uri, disable_dbus=True)
+
+ while True:
+ try:
+ d.open()
+ except Error:
+ error_text = self.__tr("Unable to communicate with the device. Please check the device and try again.")
+ log.error(unicode(error_text))
+ if QMessageBox.critical(self,
+ self.caption(),
+ error_text,
+ QMessageBox.Retry | QMessageBox.Default,
+ QMessageBox.Cancel | QMessageBox.Escape,
+ QMessageBox.NoButton) == QMessageBox.Cancel:
+ break
+
+ else:
+ try:
+ tries = 0
+ ok = True
+
+ while True:
+ tries += 1
+
+ try:
+ if read:
+ self.fax_number = unicode(d.getPhoneNum())
+ self.fax_name_company = unicode(d.getStationName())
+ else:
+ d.setStationName(self.fax_name_company)
+ d.setPhoneNum(self.fax_number)
+
+ except Error:
+ error_text = self.__tr("<b>Device I/O Error</b><p>Could not communicate with device. Device may be busy.")
+ log.error(unicode(error_text))
+
+ if QMessageBox.critical(self,
+ self.caption(),
+ error_text,
+ QMessageBox.Retry | QMessageBox.Default,
+ QMessageBox.Cancel | QMessageBox.Escape,
+ QMessageBox.NoButton) == QMessageBox.Cancel:
+ break
+
+
+ time.sleep(5)
+ ok = False
+
+ if tries > 12:
+ break
+
+ else:
+ ok = True
+ break
+
+ finally:
+ d.close()
+
+ if ok and read:
+ self.faxNumberLineEdit.setText(self.fax_number)
+ self.faxNameCoLineEdit.setText(self.fax_name_company)
+
+ break
+
+ finally:
+ QApplication.restoreOverrideCursor()
+
+ #
+ # SETUP PRINTER/FAX
+ #
+
+ def setupPrinter(self):
+ QApplication.setOverrideCursor(QApplication.waitCursor)
+
+ cups.setPasswordPrompt("You do not have permission to add a printer.")
+ #if self.ppd_file.startswith("foomatic:"):
+ if not os.path.exists(self.ppd_file): # assume foomatic: or some such
+ status, status_str = cups.addPrinter(self.printer_name.encode('utf8'), self.device_uri,
+ self.location, '', self.ppd_file, self.desc)
+ else:
+ status, status_str = cups.addPrinter(self.printer_name.encode('utf8'), self.device_uri,
+ self.location, self.ppd_file, '', self.desc)
+
+ log.debug("addPrinter() returned (%d, %s)" % (status, status_str))
+ self.installed_print_devices = device.getSupportedCUPSDevices(['hp'])
+
+ log.debug(self.installed_print_devices)
+
+ if self.device_uri not in self.installed_print_devices or \
+ self.printer_name not in self.installed_print_devices[self.device_uri]:
+
+ self.FailureUI(self.__tr("<b>Printer queue setup failed.</b><p>Please restart CUPS and try again."))
+ else:
+ # TODO:
+ #service.sendEvent(self.hpssd_sock, EVENT_CUPS_QUEUES_CHANGED, device_uri=self.device_uri)
+ pass
+
+ QApplication.restoreOverrideCursor()
+
+ def setupFax(self):
+ QApplication.setOverrideCursor(QApplication.waitCursor)
+
+ if self.mq.get('fax-type', FAX_TYPE_NONE) == FAX_TYPE_MARVELL:
+ fax_ppd_name = "HP-Fax3-hplip" # Fixed width (2528 pixels) and 300dpi rendering
+ nick = "HP Fax 3"
+ if self.mq.get('fax-type', FAX_TYPE_NONE) == FAX_TYPE_SOAP or self.mq.get('fax-type', FAX_TYPE_NONE) == FAX_TYPE_LEDMSOAP:
+ fax_ppd_name = "HP-Fax2-hplip" # Fixed width (2528 pixels) and 300dpi rendering
+ nick = "HP Fax 2"
+ if self.mq.get('fax-type', FAX_TYPE_NONE) == FAX_TYPE_LEDM:
+ fax_ppd_name = "HP-Fax4-hplip" # Fixed width (1728 pixels) and 200dpi rendering
+ nick = "HP Fax 4"
+ else:
+ fax_ppd_name = "HP-Fax-hplip" # Standard
+ nick = "HP Fax"
+
+ ppds = []
+
+ log.debug("Searching for fax file %s..." % fax_ppd_name)
+
+ ppd_dir = sys_conf.get('dirs', 'ppd')
+ for f in utils.walkFiles(ppd_dir, pattern="HP-Fax*.ppd*", abs_paths=True):
+ ppds.append(f)
+
+ for f in ppds:
+ if f.find(fax_ppd_name) >= 0:
+ fax_ppd = f
+ log.debug("Found PDD file: %s" % fax_ppd)
+ log.debug("Nickname: %s" % cups.getPPDDescription(fax_ppd))
+ break
+ else:
+ QApplication.restoreOverrideCursor()
+ log.error("Fax PPD file not found.")
+
+ if QMessageBox.warning(self, self.__tr("Unable to find HP fax PPD file."),
+ self.__tr("The PPD file (%1.ppd) needed to setup the fax queue was not found.").arg(fax_ppd_name),
+ self.__tr("Browse to file..."), # button 0
+ self.__tr("Quit") # button 1
+ ) == 0: # Browse
+
+ while True:
+ ppd_dir = sys_conf.get('dirs', 'ppd')
+ fax_ppd = unicode(QFileDialog.getOpenFileName(ppd_dir,
+ "HP Fax PPD Files (*.ppd *.ppd.gz);;All Files (*)", self,
+ "open file dialog", "Choose the fax PPD file"))
+
+ if not fax_ppd: # user hit cancel
+ return
+
+ if os.path.exists(fax_ppd):
+ n = cups.getPPDDescription(fax_ppd)
+ if n == nick:
+ break
+ else:
+ self.FailureUI(self.__tr("<b>Incorrect fax PPD file.</b><p>The fax PPD file must have a nickname of '%1', not '%1'.").arg(nick).arg(n))
+ else:
+ self.FailureUI(self.__tr("<b>File not found.</b><p>hp-setup cannot find the file %1").arg(fax_ppd))
+
+ else: # Quit
+ return
+
+ cups.setPasswordPrompt("You do not have permission to add a fax device.")
+ if not os.path.exists(fax_ppd):
+ status, status_str = cups.addPrinter(self.fax_name.encode('utf8'),
+ self.fax_uri, self.fax_location, '', fax_ppd, self.fax_desc)
+ else:
+ status, status_str = cups.addPrinter(self.fax_name.encode('utf8'),
+ self.fax_uri, self.fax_location, fax_ppd, '', self.fax_desc)
+
+ log.debug("addPrinter() returned (%d, %s)" % (status, status_str))
+ self.installed_fax_devices = device.getSupportedCUPSDevices(['hpfax'])
+
+ log.debug(self.installed_fax_devices)
+
+ if self.fax_uri not in self.installed_fax_devices or \
+ self.fax_name not in self.installed_fax_devices[self.fax_uri]:
+
+ self.FailureUI(self.__tr("<b>Fax queue setup failed.</b><p>Please restart CUPS and try again."))
+ else:
+ pass
+ # TODO:
+ #service.sendEvent(self.hpssd_sock, EVENT_CUPS_QUEUES_CHANGED, device_uri=self.fax_uri)
+
+ QApplication.restoreOverrideCursor()
+
+ def accept(self):
+ if self.print_test_page:
+ try:
+ d = device.Device(self.device_uri)
+ except Error, e:
+ self.FailureUI(self.__tr("<b>Device error:</b><p>%s (%s)." % (e.msg, e.opt)))
+
+ else:
+ try:
+ d.open()
+ except Error:
+ self.FailureUI(self.__tr("<b>Unable to print to printer.</b><p>Please check device and try again."))
+ else:
+ if d.isIdleAndNoError():
+ d.close()
+
+ try:
+ d.printTestPage(self.printer_name)
+ except Error, e:
+ if e.opt == ERROR_NO_CUPS_QUEUE_FOUND_FOR_DEVICE:
+ self.FailureUI(self.__tr("<b>No CUPS queue found for device.</b><p>Please install the printer in CUPS and try again."))
+ else:
+ self.FailureUI(self.__tr("<b>Printer Error</b><p>An error occured: %s (code=%d)." % (e.msg, e.opt)))
+ else:
+ self.FailureUI(self.__tr("<b>Printer Error.</b><p>Printer is busy, offline, or in an error state. Please check the device and try again."))
+ d.close()
+
+
+ QWizard.accept(self)
+
+
+ def reject(self):
+ QWizard.reject(self)
+
+ def FailureUI(self, error_text):
+ log.error(unicode(error_text).replace("<b>", "").replace("</b>", "").replace("<p>", " "))
+ QMessageBox.critical(self,
+ self.caption(),
+ error_text,
+ QMessageBox.Ok,
+ QMessageBox.NoButton,
+ QMessageBox.NoButton)
+
+ def WarningUI(self, error_text):
+ QMessageBox.warning(self,
+ self.caption(),
+ error_text,
+ QMessageBox.Ok,
+ QMessageBox.NoButton,
+ QMessageBox.NoButton)
+
+ def __tr(self, s, c=None):
+ return qApp.translate("SetupForm", s, c)
+
+
+
+class PasswordDialog(QDialog):
+ def __init__(self,prompt, parent=None, name=None, modal=0, fl=0):
+ QDialog.__init__(self,parent,name,modal,fl)
+ self.prompt = prompt
+
+ if not name:
+ self.setName("PasswordDialog")
+
+ passwordDlg_baseLayout = QGridLayout(self,1,1,11,6,"passwordDlg_baseLayout")
+
+ self.promptTextLabel = QLabel(self,"promptTextLabel")
+ passwordDlg_baseLayout.addMultiCellWidget(self.promptTextLabel,0,0,0,1)
+
+ self.usernameTextLabel = QLabel(self,"usernameTextLabel")
+ passwordDlg_baseLayout.addMultiCellWidget(self.usernameTextLabel,1,1,0,1)
+
+ self.usernameLineEdit = QLineEdit(self,"usernameLineEdit")
+ self.usernameLineEdit.setEchoMode(QLineEdit.Normal)
+ passwordDlg_baseLayout.addMultiCellWidget(self.usernameLineEdit,1,1,1,2)
+
+ self.passwordTextLabel = QLabel(self,"passwordTextLabel")
+ passwordDlg_baseLayout.addMultiCellWidget(self.passwordTextLabel,2,2,0,1)
+
+ self.passwordLineEdit = QLineEdit(self,"passwordLineEdit")
+ self.passwordLineEdit.setEchoMode(QLineEdit.Password)
+ passwordDlg_baseLayout.addMultiCellWidget(self.passwordLineEdit,2,2,1,2)
+
+ self.okPushButton = QPushButton(self,"okPushButton")
+ passwordDlg_baseLayout.addWidget(self.okPushButton,3,2)
+
+ self.languageChange()
+
+ self.resize(QSize(420,163).expandedTo(self.minimumSizeHint()))
+ self.clearWState(Qt.WState_Polished)
+
+ self.connect(self.okPushButton,SIGNAL("clicked()"),self.accept)
+ self.connect(self.passwordLineEdit,SIGNAL("returnPressed()"),self.accept)
+
+ def setDefaultUsername(self, defUser, allowUsernameEdit = True):
+ self.usernameLineEdit.setText(defUser)
+ if not allowUsernameEdit:
+ self.usernameLineEdit.setReadOnly(True)
+ self.usernameLineEdit.setPaletteBackgroundColor(QColor("lightgray"))
+
+ def getUsername(self):
+ return unicode(self.usernameLineEdit.text())
+
+ def getPassword(self):
+ return unicode(self.passwordLineEdit.text())
+
+ def languageChange(self):
+ self.setCaption(self.__tr("HP Device Manager - Enter Username/Password"))
+ self.promptTextLabel.setText(self.__tr(self.prompt))
+ self.usernameTextLabel.setText(self.__tr("Username"))
+ self.passwordTextLabel.setText(self.__tr("Password"))
+ self.okPushButton.setText(self.__tr("OK"))
+
+ def __tr(self,s,c = None):
+ return qApp.translate("PasswordDialog",s,c)
+
+
+def showPasswordUI(prompt, userName=None, allowUsernameEdit=True):
+ try:
+ dlg = PasswordDialog(prompt, None)
+
+ if userName != None:
+ dlg.setDefaultUsername(userName, allowUsernameEdit)
+
+ if dlg.exec_loop() == QDialog.Accepted:
+ return (dlg.getUsername(), dlg.getPassword())
+
+ finally:
+ pass
+
+ return ("", "")
diff --git a/ui/setupform_base.py b/ui/setupform_base.py
new file mode 100644
index 0000000..4157ba2
--- /dev/null
+++ b/ui/setupform_base.py
@@ -0,0 +1,540 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'ui/setupform_base.ui'
+#
+# Created: Thu Sep 20 11:45:16 2007
+# by: The PyQt User Interface Compiler (pyuic) 3.17
+#
+# WARNING! All changes made in this file will be lost!
+
+
+from qt import *
+
+
+class SetupForm_base(QWizard):
+ def __init__(self,parent = None,name = None,modal = 0,fl = 0):
+ QWizard.__init__(self,parent,name,modal,fl)
+
+ if not name:
+ self.setName("SetupForm_base")
+
+
+
+ self.ConnectionPage = QWidget(self,"ConnectionPage")
+ ConnectionPageLayout = QGridLayout(self.ConnectionPage,1,1,11,6,"ConnectionPageLayout")
+
+ self.connectionTypeButtonGroup = QButtonGroup(self.ConnectionPage,"connectionTypeButtonGroup")
+ self.connectionTypeButtonGroup.setColumnLayout(0,Qt.Vertical)
+ self.connectionTypeButtonGroup.layout().setSpacing(6)
+ self.connectionTypeButtonGroup.layout().setMargin(11)
+ connectionTypeButtonGroupLayout = QGridLayout(self.connectionTypeButtonGroup.layout())
+ connectionTypeButtonGroupLayout.setAlignment(Qt.AlignTop)
+
+ self.usbRadioButton = QRadioButton(self.connectionTypeButtonGroup,"usbRadioButton")
+
+ connectionTypeButtonGroupLayout.addWidget(self.usbRadioButton,0,0)
+
+ self.netRadioButton = QRadioButton(self.connectionTypeButtonGroup,"netRadioButton")
+
+ connectionTypeButtonGroupLayout.addWidget(self.netRadioButton,1,0)
+
+ self.parRadioButton = QRadioButton(self.connectionTypeButtonGroup,"parRadioButton")
+
+ connectionTypeButtonGroupLayout.addWidget(self.parRadioButton,2,0)
+
+ ConnectionPageLayout.addMultiCellWidget(self.connectionTypeButtonGroup,1,1,0,1)
+ spacer12 = QSpacerItem(20,120,QSizePolicy.Minimum,QSizePolicy.Expanding)
+ ConnectionPageLayout.addItem(spacer12,2,0)
+ spacer18 = QSpacerItem(321,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ ConnectionPageLayout.addItem(spacer18,3,1)
+
+ self.searchFiltersPushButton2 = QPushButton(self.ConnectionPage,"searchFiltersPushButton2")
+
+ ConnectionPageLayout.addWidget(self.searchFiltersPushButton2,3,0)
+ self.addPage(self.ConnectionPage,QString(""))
+
+ self.ProbedDevicesPage = QWidget(self,"ProbedDevicesPage")
+ ProbedDevicesPageLayout = QGridLayout(self.ProbedDevicesPage,1,1,11,6,"ProbedDevicesPageLayout")
+
+ self.probedDevicesListView = QListView(self.ProbedDevicesPage,"probedDevicesListView")
+ self.probedDevicesListView.setAllColumnsShowFocus(1)
+
+ ProbedDevicesPageLayout.addMultiCellWidget(self.probedDevicesListView,1,1,0,3)
+
+ self.searchFiltersPushButton = QPushButton(self.ProbedDevicesPage,"searchFiltersPushButton")
+
+ ProbedDevicesPageLayout.addWidget(self.searchFiltersPushButton,2,0)
+
+ self.probeHeadingTextLabel = QLabel(self.ProbedDevicesPage,"probeHeadingTextLabel")
+
+ ProbedDevicesPageLayout.addMultiCellWidget(self.probeHeadingTextLabel,0,0,0,3)
+
+ self.manualFindPushButton = QPushButton(self.ProbedDevicesPage,"manualFindPushButton")
+
+ ProbedDevicesPageLayout.addWidget(self.manualFindPushButton,2,1)
+ spacer13 = QSpacerItem(101,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ ProbedDevicesPageLayout.addItem(spacer13,2,2)
+
+ self.probeUpdatePushButton = QPushButton(self.ProbedDevicesPage,"probeUpdatePushButton")
+
+ ProbedDevicesPageLayout.addWidget(self.probeUpdatePushButton,2,3)
+ self.addPage(self.ProbedDevicesPage,QString(""))
+
+ self.PPDPage = QWidget(self,"PPDPage")
+ PPDPageLayout = QGridLayout(self.PPDPage,1,1,11,6,"PPDPageLayout")
+
+ self.ppdListView = QListView(self.PPDPage,"ppdListView")
+ self.ppdListView.addColumn(self.__tr("PPD File"))
+ self.ppdListView.addColumn(self.__tr("Description"))
+ self.ppdListView.setAllColumnsShowFocus(1)
+
+ PPDPageLayout.addMultiCellWidget(self.ppdListView,1,1,0,2)
+
+ self.otherPPDPushButton = QPushButton(self.PPDPage,"otherPPDPushButton")
+ self.otherPPDPushButton.setEnabled(1)
+
+ PPDPageLayout.addWidget(self.otherPPDPushButton,2,0)
+ spacer9 = QSpacerItem(320,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ PPDPageLayout.addItem(spacer9,2,1)
+
+ self.ppdDefaultsPushButton = QPushButton(self.PPDPage,"ppdDefaultsPushButton")
+
+ PPDPageLayout.addWidget(self.ppdDefaultsPushButton,2,2)
+
+ self.textLabel1_5 = QLabel(self.PPDPage,"textLabel1_5")
+ self.textLabel1_5.setAlignment(QLabel.WordBreak | QLabel.AlignVCenter)
+
+ PPDPageLayout.addMultiCellWidget(self.textLabel1_5,0,0,0,2)
+ self.addPage(self.PPDPage,QString(""))
+
+ self.PrinterNamePage = QWidget(self,"PrinterNamePage")
+ PrinterNamePageLayout = QGridLayout(self.PrinterNamePage,1,1,11,6,"PrinterNamePageLayout")
+
+ self.groupBox4 = QGroupBox(self.PrinterNamePage,"groupBox4")
+ self.groupBox4.setColumnLayout(0,Qt.Vertical)
+ self.groupBox4.layout().setSpacing(6)
+ self.groupBox4.layout().setMargin(11)
+ groupBox4Layout = QGridLayout(self.groupBox4.layout())
+ groupBox4Layout.setAlignment(Qt.AlignTop)
+
+ self.printerNameLineEdit = QLineEdit(self.groupBox4,"printerNameLineEdit")
+ self.printerNameLineEdit.setMaxLength(50)
+
+ groupBox4Layout.addWidget(self.printerNameLineEdit,0,1)
+
+ self.defaultPrinterNamePushButton = QPushButton(self.groupBox4,"defaultPrinterNamePushButton")
+ self.defaultPrinterNamePushButton.setEnabled(0)
+
+ groupBox4Layout.addWidget(self.defaultPrinterNamePushButton,0,2)
+
+ self.textLabel1_2 = QLabel(self.groupBox4,"textLabel1_2")
+
+ groupBox4Layout.addWidget(self.textLabel1_2,1,0)
+
+ self.textLabel1 = QLabel(self.groupBox4,"textLabel1")
+
+ groupBox4Layout.addWidget(self.textLabel1,0,0)
+
+ self.printerDescriptionLineEdit = QLineEdit(self.groupBox4,"printerDescriptionLineEdit")
+ self.printerDescriptionLineEdit.setMaxLength(50)
+
+ groupBox4Layout.addWidget(self.printerDescriptionLineEdit,2,1)
+
+ self.printerLocationLineEdit = QLineEdit(self.groupBox4,"printerLocationLineEdit")
+ self.printerLocationLineEdit.setMaxLength(50)
+
+ groupBox4Layout.addWidget(self.printerLocationLineEdit,1,1)
+
+ self.textLabel2 = QLabel(self.groupBox4,"textLabel2")
+
+ groupBox4Layout.addWidget(self.textLabel2,2,0)
+
+ PrinterNamePageLayout.addWidget(self.groupBox4,0,0)
+
+ self.faxInfoGroupBox = QGroupBox(self.PrinterNamePage,"faxInfoGroupBox")
+ self.faxInfoGroupBox.setColumnLayout(0,Qt.Vertical)
+ self.faxInfoGroupBox.layout().setSpacing(6)
+ self.faxInfoGroupBox.layout().setMargin(11)
+ faxInfoGroupBoxLayout = QGridLayout(self.faxInfoGroupBox.layout())
+ faxInfoGroupBoxLayout.setAlignment(Qt.AlignTop)
+
+ self.faxNameLineEdit = QLineEdit(self.faxInfoGroupBox,"faxNameLineEdit")
+
+ faxInfoGroupBoxLayout.addWidget(self.faxNameLineEdit,1,1)
+
+ self.textLabel1_3 = QLabel(self.faxInfoGroupBox,"textLabel1_3")
+
+ faxInfoGroupBoxLayout.addWidget(self.textLabel1_3,1,0)
+
+ self.textLabel3 = QLabel(self.faxInfoGroupBox,"textLabel3")
+
+ faxInfoGroupBoxLayout.addWidget(self.textLabel3,3,0)
+
+ self.textLabel2_2 = QLabel(self.faxInfoGroupBox,"textLabel2_2")
+
+ faxInfoGroupBoxLayout.addWidget(self.textLabel2_2,2,0)
+
+ self.faxCheckBox = QCheckBox(self.faxInfoGroupBox,"faxCheckBox")
+ self.faxCheckBox.setChecked(1)
+
+ faxInfoGroupBoxLayout.addMultiCellWidget(self.faxCheckBox,0,0,0,2)
+
+ self.faxNumberLineEdit = QLineEdit(self.faxInfoGroupBox,"faxNumberLineEdit")
+ self.faxNumberLineEdit.setMaxLength(50)
+
+ faxInfoGroupBoxLayout.addWidget(self.faxNumberLineEdit,2,1)
+
+ self.faxNameCoLineEdit = QLineEdit(self.faxInfoGroupBox,"faxNameCoLineEdit")
+ self.faxNameCoLineEdit.setMaxLength(50)
+
+ faxInfoGroupBoxLayout.addWidget(self.faxNameCoLineEdit,3,1)
+
+ self.defaultFaxNamePushButton = QPushButton(self.faxInfoGroupBox,"defaultFaxNamePushButton")
+ self.defaultFaxNamePushButton.setEnabled(0)
+
+ faxInfoGroupBoxLayout.addWidget(self.defaultFaxNamePushButton,1,2)
+
+ self.textLabel1_2_2 = QLabel(self.faxInfoGroupBox,"textLabel1_2_2")
+
+ faxInfoGroupBoxLayout.addWidget(self.textLabel1_2_2,4,0)
+
+ self.textLabel2_4 = QLabel(self.faxInfoGroupBox,"textLabel2_4")
+
+ faxInfoGroupBoxLayout.addWidget(self.textLabel2_4,5,0)
+
+ self.faxLocationLineEdit = QLineEdit(self.faxInfoGroupBox,"faxLocationLineEdit")
+ self.faxLocationLineEdit.setMaxLength(50)
+
+ faxInfoGroupBoxLayout.addWidget(self.faxLocationLineEdit,4,1)
+
+ self.faxDescriptionLineEdit = QLineEdit(self.faxInfoGroupBox,"faxDescriptionLineEdit")
+ self.faxDescriptionLineEdit.setMaxLength(50)
+
+ faxInfoGroupBoxLayout.addWidget(self.faxDescriptionLineEdit,5,1)
+
+ PrinterNamePageLayout.addWidget(self.faxInfoGroupBox,1,0)
+
+ self.textLabel1_4 = QLabel(self.PrinterNamePage,"textLabel1_4")
+
+ PrinterNamePageLayout.addWidget(self.textLabel1_4,3,0)
+ spacer14 = QSpacerItem(20,20,QSizePolicy.Minimum,QSizePolicy.Expanding)
+ PrinterNamePageLayout.addItem(spacer14,2,0)
+ self.addPage(self.PrinterNamePage,QString(""))
+
+ self.FinishedPage = QWidget(self,"FinishedPage")
+ FinishedPageLayout = QGridLayout(self.FinishedPage,1,1,11,6,"FinishedPageLayout")
+
+ self.printTestPageCheckBox = QCheckBox(self.FinishedPage,"printTestPageCheckBox")
+ self.printTestPageCheckBox.setChecked(1)
+
+ FinishedPageLayout.addWidget(self.printTestPageCheckBox,4,0)
+ spacer7 = QSpacerItem(20,20,QSizePolicy.Minimum,QSizePolicy.Expanding)
+ FinishedPageLayout.addItem(spacer7,3,0)
+
+ self.faxGroupBox = QGroupBox(self.FinishedPage,"faxGroupBox")
+ self.faxGroupBox.setEnabled(0)
+ self.faxGroupBox.setColumnLayout(0,Qt.Vertical)
+ self.faxGroupBox.layout().setSpacing(6)
+ self.faxGroupBox.layout().setMargin(11)
+ faxGroupBoxLayout = QGridLayout(self.faxGroupBox.layout())
+ faxGroupBoxLayout.setAlignment(Qt.AlignTop)
+
+ self.textLabel7 = QLabel(self.faxGroupBox,"textLabel7")
+
+ faxGroupBoxLayout.addWidget(self.textLabel7,0,0)
+
+ self.lineEdit5 = QLineEdit(self.faxGroupBox,"lineEdit5")
+ self.lineEdit5.setFrameShape(QLineEdit.NoFrame)
+ self.lineEdit5.setReadOnly(1)
+
+ faxGroupBoxLayout.addWidget(self.lineEdit5,0,1)
+
+ self.lineEdit6 = QLineEdit(self.faxGroupBox,"lineEdit6")
+ self.lineEdit6.setFrameShape(QLineEdit.NoFrame)
+ self.lineEdit6.setReadOnly(1)
+
+ faxGroupBoxLayout.addWidget(self.lineEdit6,1,1)
+
+ self.textLabel6 = QLabel(self.faxGroupBox,"textLabel6")
+
+ faxGroupBoxLayout.addWidget(self.textLabel6,1,0)
+
+ self.textLabel8 = QLabel(self.faxGroupBox,"textLabel8")
+
+ faxGroupBoxLayout.addWidget(self.textLabel8,2,0)
+
+ self.textLabel8_2 = QLabel(self.faxGroupBox,"textLabel8_2")
+
+ faxGroupBoxLayout.addWidget(self.textLabel8_2,3,0)
+
+ self.lineEdit7 = QLineEdit(self.faxGroupBox,"lineEdit7")
+ self.lineEdit7.setFrameShape(QLineEdit.NoFrame)
+ self.lineEdit7.setReadOnly(1)
+
+ faxGroupBoxLayout.addWidget(self.lineEdit7,2,1)
+
+ self.textLabel8_3 = QLabel(self.faxGroupBox,"textLabel8_3")
+
+ faxGroupBoxLayout.addWidget(self.textLabel8_3,4,0)
+
+ self.lineEdit8 = QLineEdit(self.faxGroupBox,"lineEdit8")
+ self.lineEdit8.setFrameShape(QLineEdit.NoFrame)
+ self.lineEdit8.setReadOnly(1)
+
+ faxGroupBoxLayout.addWidget(self.lineEdit8,3,1)
+
+ self.lineEdit9 = QLineEdit(self.faxGroupBox,"lineEdit9")
+ self.lineEdit9.setFrameShape(QLineEdit.NoFrame)
+ self.lineEdit9.setReadOnly(1)
+
+ faxGroupBoxLayout.addWidget(self.lineEdit9,4,1)
+
+ FinishedPageLayout.addWidget(self.faxGroupBox,2,0)
+
+ self.groupBox3 = QGroupBox(self.FinishedPage,"groupBox3")
+ self.groupBox3.setColumnLayout(0,Qt.Vertical)
+ self.groupBox3.layout().setSpacing(6)
+ self.groupBox3.layout().setMargin(11)
+ groupBox3Layout = QGridLayout(self.groupBox3.layout())
+ groupBox3Layout.setAlignment(Qt.AlignTop)
+
+ self.textLabel4 = QLabel(self.groupBox3,"textLabel4")
+
+ groupBox3Layout.addWidget(self.textLabel4,2,0)
+
+ self.textLabel3_2 = QLabel(self.groupBox3,"textLabel3_2")
+
+ groupBox3Layout.addWidget(self.textLabel3_2,1,0)
+
+ self.lineEdit4 = QLineEdit(self.groupBox3,"lineEdit4")
+ self.lineEdit4.setFrameShape(QLineEdit.NoFrame)
+ self.lineEdit4.setReadOnly(1)
+
+ groupBox3Layout.addWidget(self.lineEdit4,3,1)
+
+ self.textLabel2_3 = QLabel(self.groupBox3,"textLabel2_3")
+
+ groupBox3Layout.addWidget(self.textLabel2_3,0,0)
+
+ self.lineEdit3 = QLineEdit(self.groupBox3,"lineEdit3")
+ self.lineEdit3.setFrameShape(QLineEdit.NoFrame)
+ self.lineEdit3.setReadOnly(1)
+
+ groupBox3Layout.addWidget(self.lineEdit3,2,1)
+
+ self.lineEdit2 = QLineEdit(self.groupBox3,"lineEdit2")
+ self.lineEdit2.setFrameShape(QLineEdit.NoFrame)
+ self.lineEdit2.setReadOnly(1)
+
+ groupBox3Layout.addWidget(self.lineEdit2,1,1)
+
+ self.lineEdit1 = QLineEdit(self.groupBox3,"lineEdit1")
+ self.lineEdit1.setFrameShape(QLineEdit.NoFrame)
+ self.lineEdit1.setReadOnly(1)
+
+ groupBox3Layout.addWidget(self.lineEdit1,0,1)
+
+ self.textLabel5 = QLabel(self.groupBox3,"textLabel5")
+
+ groupBox3Layout.addWidget(self.textLabel5,3,0)
+
+ FinishedPageLayout.addWidget(self.groupBox3,1,0)
+
+ self.textLabel2_5 = QLabel(self.FinishedPage,"textLabel2_5")
+ self.textLabel2_5.setAlignment(QLabel.WordBreak | QLabel.AlignVCenter)
+
+ FinishedPageLayout.addWidget(self.textLabel2_5,0,0)
+ self.addPage(self.FinishedPage,QString(""))
+
+ self.languageChange()
+
+ self.resize(QSize(754,456).expandedTo(self.minimumSizeHint()))
+ self.clearWState(Qt.WState_Polished)
+
+ self.connect(self.connectionTypeButtonGroup,SIGNAL("clicked(int)"),self.connectionTypeButtonGroup_clicked)
+ self.connect(self.probedDevicesListView,SIGNAL("currentChanged(QListViewItem*)"),self.probedDevicesListView_currentChanged)
+ self.connect(self.printerNameLineEdit,SIGNAL("textChanged(const QString&)"),self.printerNameLineEdit_textChanged)
+ self.connect(self.defaultPrinterNamePushButton,SIGNAL("clicked()"),self.defaultPrinterNamePushButton_clicked)
+ self.connect(self.ppdListView,SIGNAL("currentChanged(QListViewItem*)"),self.ppdListView_currentChanged)
+ self.connect(self.searchFiltersPushButton,SIGNAL("clicked()"),self.searchFiltersPushButton_clicked)
+ self.connect(self.searchFiltersPushButton2,SIGNAL("clicked()"),self.searchFiltersPushButton2_clicked)
+ self.connect(self.probeUpdatePushButton,SIGNAL("clicked()"),self.probeUpdatePushButton_clicked)
+ self.connect(self.manualFindPushButton,SIGNAL("clicked()"),self.manualFindPushButton_clicked)
+ self.connect(self.printerLocationLineEdit,SIGNAL("textChanged(const QString&)"),self.printerLocationLineEdit_textChanged)
+ self.connect(self.printerDescriptionLineEdit,SIGNAL("textChanged(const QString&)"),self.printerDescriptionLineEdit_textChanged)
+ self.connect(self.faxCheckBox,SIGNAL("toggled(bool)"),self.faxNameLineEdit.setEnabled)
+ self.connect(self.faxCheckBox,SIGNAL("toggled(bool)"),self.faxNumberLineEdit.setEnabled)
+ self.connect(self.faxCheckBox,SIGNAL("toggled(bool)"),self.faxNameCoLineEdit.setEnabled)
+ self.connect(self.faxNameLineEdit,SIGNAL("textChanged(const QString&)"),self.faxNameLineEdit_textChanged)
+ self.connect(self.faxNumberLineEdit,SIGNAL("textChanged(const QString&)"),self.faxNumberLineEdit_textChanged)
+ self.connect(self.faxNameCoLineEdit,SIGNAL("textChanged(const QString&)"),self.faxNameCoLineEdit_textChanged)
+ self.connect(self.faxCheckBox,SIGNAL("toggled(bool)"),self.faxCheckBox_toggled)
+ self.connect(self.printTestPageCheckBox,SIGNAL("toggled(bool)"),self.printTestPageCheckBox_toggled)
+ self.connect(self.defaultFaxNamePushButton,SIGNAL("clicked()"),self.defaultFaxNamePushButton_clicked)
+ self.connect(self.otherPPDPushButton,SIGNAL("clicked()"),self.otherPPDPushButton_clicked)
+ self.connect(self.ppdDefaultsPushButton,SIGNAL("clicked()"),self.ppdDefaultsPushButton_clicked)
+ self.connect(self.faxLocationLineEdit,SIGNAL("textChanged(const QString&)"),self.faxLocationLineEdit_textChanged)
+ self.connect(self.faxDescriptionLineEdit,SIGNAL("textChanged(const QString&)"),self.faxDescriptionLineEdit_textChanged)
+ self.connect(self.faxCheckBox,SIGNAL("toggled(bool)"),self.faxLocationLineEdit.setEnabled)
+ self.connect(self.faxCheckBox,SIGNAL("toggled(bool)"),self.faxDescriptionLineEdit.setEnabled)
+
+ self.setTabOrder(self.printerNameLineEdit,self.printerLocationLineEdit)
+ self.setTabOrder(self.printerLocationLineEdit,self.printerDescriptionLineEdit)
+ self.setTabOrder(self.printerDescriptionLineEdit,self.faxCheckBox)
+ self.setTabOrder(self.faxCheckBox,self.faxNameLineEdit)
+ self.setTabOrder(self.faxNameLineEdit,self.faxNumberLineEdit)
+ self.setTabOrder(self.faxNumberLineEdit,self.faxNameCoLineEdit)
+ self.setTabOrder(self.faxNameCoLineEdit,self.faxLocationLineEdit)
+ self.setTabOrder(self.faxLocationLineEdit,self.faxDescriptionLineEdit)
+ self.setTabOrder(self.faxDescriptionLineEdit,self.usbRadioButton)
+ self.setTabOrder(self.usbRadioButton,self.netRadioButton)
+ self.setTabOrder(self.netRadioButton,self.parRadioButton)
+ self.setTabOrder(self.parRadioButton,self.searchFiltersPushButton2)
+ self.setTabOrder(self.searchFiltersPushButton2,self.probedDevicesListView)
+ self.setTabOrder(self.probedDevicesListView,self.searchFiltersPushButton)
+ self.setTabOrder(self.searchFiltersPushButton,self.manualFindPushButton)
+ self.setTabOrder(self.manualFindPushButton,self.probeUpdatePushButton)
+ self.setTabOrder(self.probeUpdatePushButton,self.ppdListView)
+ self.setTabOrder(self.ppdListView,self.otherPPDPushButton)
+ self.setTabOrder(self.otherPPDPushButton,self.ppdDefaultsPushButton)
+ self.setTabOrder(self.ppdDefaultsPushButton,self.defaultPrinterNamePushButton)
+ self.setTabOrder(self.defaultPrinterNamePushButton,self.defaultFaxNamePushButton)
+ self.setTabOrder(self.defaultFaxNamePushButton,self.lineEdit4)
+ self.setTabOrder(self.lineEdit4,self.lineEdit3)
+ self.setTabOrder(self.lineEdit3,self.lineEdit2)
+ self.setTabOrder(self.lineEdit2,self.lineEdit1)
+ self.setTabOrder(self.lineEdit1,self.printTestPageCheckBox)
+ self.setTabOrder(self.printTestPageCheckBox,self.lineEdit5)
+ self.setTabOrder(self.lineEdit5,self.lineEdit6)
+ self.setTabOrder(self.lineEdit6,self.lineEdit7)
+ self.setTabOrder(self.lineEdit7,self.lineEdit8)
+ self.setTabOrder(self.lineEdit8,self.lineEdit9)
+
+
+ def languageChange(self):
+ self.setCaption(self.__tr("HP Device Manger - Printer Setup Wizard"))
+ self.connectionTypeButtonGroup.setTitle(self.__tr("Connection (I/O) Type"))
+ self.usbRadioButton.setText(self.__tr("Universal Serial Bus (USB)"))
+ self.netRadioButton.setText(self.__tr("Network/Ethernet/Wireless (direct connection or JetDirect)"))
+ self.parRadioButton.setText(self.__tr("Parallel Port (LPT)"))
+ self.searchFiltersPushButton2.setText(self.__tr("Advanced..."))
+ self.setTitle(self.ConnectionPage,self.__tr("Choose Connection Type"))
+ self.searchFiltersPushButton.setText(self.__tr("Advanced..."))
+ self.probeHeadingTextLabel.setText(self.__tr("probeHeadingTextLabel"))
+ self.manualFindPushButton.setText(self.__tr("Find Manually..."))
+ self.probeUpdatePushButton.setText(self.__tr("Refresh"))
+ self.setTitle(self.ProbedDevicesPage,self.__tr("Select from Discovered Devices"))
+ self.ppdListView.header().setLabel(0,self.__tr("PPD File"))
+ self.ppdListView.header().setLabel(1,self.__tr("Description"))
+ self.otherPPDPushButton.setText(self.__tr("Select Other..."))
+ self.ppdDefaultsPushButton.setText(self.__tr("Defaults"))
+ self.textLabel1_5.setText(self.__tr("Please choose the PPD file (by name and description) that most closely matches your printer. <i>Note: The model name of the printer may vary somewhat from the PPD file name, for example, a Deskjet 5550 may have a PPD file with the model name of Deskjet_5500_series.</i>"))
+ self.setTitle(self.PPDPage,self.__tr("Select/Confirm PPD File"))
+ self.groupBox4.setTitle(self.__tr("Printer Information"))
+ self.defaultPrinterNamePushButton.setText(self.__tr("Default"))
+ self.textLabel1_2.setText(self.__tr("Location:"))
+ self.textLabel1.setText(self.__tr("Printer Name:"))
+ self.textLabel2.setText(self.__tr("Description:"))
+ self.faxInfoGroupBox.setTitle(self.__tr("Fax Information"))
+ self.textLabel1_3.setText(self.__tr("Fax Name:"))
+ self.textLabel3.setText(self.__tr("Name/Company:"))
+ self.textLabel2_2.setText(self.__tr("Fax Number:"))
+ self.faxCheckBox.setText(self.__tr("Setup PC send fax"))
+ self.defaultFaxNamePushButton.setText(self.__tr("Default"))
+ self.textLabel1_2_2.setText(self.__tr("Location:"))
+ self.textLabel2_4.setText(self.__tr("Description:"))
+ self.textLabel1_4.setText(self.__tr("Click \"Next >\" to install the printer on your system."))
+ self.setTitle(self.PrinterNamePage,self.__tr("Enter Printer Information"))
+ self.printTestPageCheckBox.setText(self.__tr("Send test page to printer"))
+ self.faxGroupBox.setTitle(self.__tr("Fax Summary"))
+ self.textLabel7.setText(self.__tr("Fax Number:"))
+ self.textLabel6.setText(self.__tr("Fax Name:"))
+ self.textLabel8.setText(self.__tr("Name/Company:"))
+ self.textLabel8_2.setText(self.__tr("Location:"))
+ self.textLabel8_3.setText(self.__tr("Description:"))
+ self.groupBox3.setTitle(self.__tr("Printer Summary"))
+ self.textLabel4.setText(self.__tr("Description:"))
+ self.textLabel3_2.setText(self.__tr("Location:"))
+ self.textLabel2_3.setText(self.__tr("Printer Name:"))
+ self.textLabel5.setText(self.__tr("PPD File:"))
+ self.textLabel2_5.setText(self.__tr("The printer has been successfully installed on your system."))
+ self.setTitle(self.FinishedPage,self.__tr("Finished Adding Printer"))
+
+
+ def connectionTypeButtonGroup_clicked(self,a0):
+ print "SetupForm_base.connectionTypeButtonGroup_clicked(int): Not implemented yet"
+
+ def probedDevicesListView_currentChanged(self,a0):
+ print "SetupForm_base.probedDevicesListView_currentChanged(QListViewItem*): Not implemented yet"
+
+ def printerNameLineEdit_textChanged(self,a0):
+ print "SetupForm_base.printerNameLineEdit_textChanged(const QString&): Not implemented yet"
+
+ def defaultPrinterNamePushButton_clicked(self):
+ print "SetupForm_base.defaultPrinterNamePushButton_clicked(): Not implemented yet"
+
+ def ppdBrowsePushButton_clicked(self):
+ print "SetupForm_base.ppdBrowsePushButton_clicked(): Not implemented yet"
+
+ def ppdFileLineEdit_textChanged(self,a0):
+ print "SetupForm_base.ppdFileLineEdit_textChanged(const QString&): Not implemented yet"
+
+ def ppdListView_currentChanged(self,a0):
+ print "SetupForm_base.ppdListView_currentChanged(QListViewItem*): Not implemented yet"
+
+ def probeUpdatePushButton_clicked(self):
+ print "SetupForm_base.probeUpdatePushButton_clicked(): Not implemented yet"
+
+ def searchFiltersPushButton_clicked(self):
+ print "SetupForm_base.searchFiltersPushButton_clicked(): Not implemented yet"
+
+ def searchFiltersPushButton2_clicked(self):
+ print "SetupForm_base.searchFiltersPushButton2_clicked(): Not implemented yet"
+
+ def manualFindPushButton_clicked(self):
+ print "SetupForm_base.manualFindPushButton_clicked(): Not implemented yet"
+
+ def printerLocationLineEdit_textChanged(self,a0):
+ print "SetupForm_base.printerLocationLineEdit_textChanged(const QString&): Not implemented yet"
+
+ def printerDescriptionLineEdit_textChanged(self,a0):
+ print "SetupForm_base.printerDescriptionLineEdit_textChanged(const QString&): Not implemented yet"
+
+ def faxNameLineEdit_textChanged(self,a0):
+ print "SetupForm_base.faxNameLineEdit_textChanged(const QString&): Not implemented yet"
+
+ def faxNumberLineEdit_textChanged(self,a0):
+ print "SetupForm_base.faxNumberLineEdit_textChanged(const QString&): Not implemented yet"
+
+ def faxNameCoLineEdit_textChanged(self,a0):
+ print "SetupForm_base.faxNameCoLineEdit_textChanged(const QString&): Not implemented yet"
+
+ def printTestPageCheckBox_clicked(self):
+ print "SetupForm_base.printTestPageCheckBox_clicked(): Not implemented yet"
+
+ def faxCheckBox_clicked(self):
+ print "SetupForm_base.faxCheckBox_clicked(): Not implemented yet"
+
+ def faxCheckBox_toggled(self,a0):
+ print "SetupForm_base.faxCheckBox_toggled(bool): Not implemented yet"
+
+ def printTestPageCheckBox_toggled(self,a0):
+ print "SetupForm_base.printTestPageCheckBox_toggled(bool): Not implemented yet"
+
+ def defaultFaxNamePushButton_clicked(self):
+ print "SetupForm_base.defaultFaxNamePushButton_clicked(): Not implemented yet"
+
+ def otherPPDPushButton_clicked(self):
+ print "SetupForm_base.otherPPDPushButton_clicked(): Not implemented yet"
+
+ def ppdDefaultsPushButton_clicked(self):
+ print "SetupForm_base.ppdDefaultsPushButton_clicked(): Not implemented yet"
+
+ def faxLocationLineEdit_textChanged(self,a0):
+ print "SetupForm_base.faxLocationLineEdit_textChanged(const QString&): Not implemented yet"
+
+ def faxDescriptionLineEdit_textChanged(self,a0):
+ print "SetupForm_base.faxDescriptionLineEdit_textChanged(const QString&): Not implemented yet"
+
+ def __tr(self,s,c = None):
+ return qApp.translate("SetupForm_base",s,c)
diff --git a/ui/setupform_base.ui b/ui/setupform_base.ui
new file mode 100644
index 0000000..10ae988
--- /dev/null
+++ b/ui/setupform_base.ui
@@ -0,0 +1,965 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>SetupForm_base</class>
+<widget class="QWizard">
+ <property name="name">
+ <cstring>SetupForm_base</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>754</width>
+ <height>456</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>HP Device Manger - Printer Setup Wizard</string>
+ </property>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>ConnectionPage</cstring>
+ </property>
+ <attribute name="title">
+ <string>Choose Connection Type</string>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QButtonGroup" row="1" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>connectionTypeButtonGroup</cstring>
+ </property>
+ <property name="title">
+ <string>Connection (I/O) Type</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QRadioButton" row="0" column="0">
+ <property name="name">
+ <cstring>usbRadioButton</cstring>
+ </property>
+ <property name="text">
+ <string>Universal Serial Bus (USB)</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton" row="1" column="0">
+ <property name="name">
+ <cstring>netRadioButton</cstring>
+ </property>
+ <property name="text">
+ <string>Network/Ethernet/Wireless (direct connection or JetDirect)</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton" row="2" column="0">
+ <property name="name">
+ <cstring>parRadioButton</cstring>
+ </property>
+ <property name="text">
+ <string>Parallel Port (LPT)</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <spacer row="2" column="0">
+ <property name="name">
+ <cstring>spacer12</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>120</height>
+ </size>
+ </property>
+ </spacer>
+ <spacer row="3" column="1">
+ <property name="name">
+ <cstring>spacer18</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>321</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton" row="3" column="0">
+ <property name="name">
+ <cstring>searchFiltersPushButton2</cstring>
+ </property>
+ <property name="text">
+ <string>Advanced...</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>ProbedDevicesPage</cstring>
+ </property>
+ <attribute name="title">
+ <string>Select from Discovered Devices</string>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QListView" row="1" column="0" rowspan="1" colspan="4">
+ <property name="name">
+ <cstring>probedDevicesListView</cstring>
+ </property>
+ <property name="allColumnsShowFocus">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="2" column="0">
+ <property name="name">
+ <cstring>searchFiltersPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>Advanced...</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0" rowspan="1" colspan="4">
+ <property name="name">
+ <cstring>probeHeadingTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>probeHeadingTextLabel</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="2" column="1">
+ <property name="name">
+ <cstring>manualFindPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>Find Manually...</string>
+ </property>
+ </widget>
+ <spacer row="2" column="2">
+ <property name="name">
+ <cstring>spacer13</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>101</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton" row="2" column="3">
+ <property name="name">
+ <cstring>probeUpdatePushButton</cstring>
+ </property>
+ <property name="text">
+ <string>Refresh</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>PPDPage</cstring>
+ </property>
+ <attribute name="title">
+ <string>Select/Confirm PPD File</string>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QListView" row="1" column="0" rowspan="1" colspan="3">
+ <column>
+ <property name="text">
+ <string>PPD File</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Description</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>ppdListView</cstring>
+ </property>
+ <property name="allColumnsShowFocus">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="2" column="0">
+ <property name="name">
+ <cstring>otherPPDPushButton</cstring>
+ </property>
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="text">
+ <string>Select Other...</string>
+ </property>
+ </widget>
+ <spacer row="2" column="1">
+ <property name="name">
+ <cstring>spacer9</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>320</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton" row="2" column="2">
+ <property name="name">
+ <cstring>ppdDefaultsPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>Defaults</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>textLabel1_5</cstring>
+ </property>
+ <property name="text">
+ <string>Please choose the PPD file (by name and description) that most closely matches your printer. &lt;i&gt;Note: The model name of the printer may vary somewhat from the PPD file name, for example, a Deskjet 5550 may have a PPD file with the model name of Deskjet_5500_series.&lt;/i&gt;</string>
+ </property>
+ <property name="alignment">
+ <set>WordBreak|AlignVCenter</set>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>PrinterNamePage</cstring>
+ </property>
+ <attribute name="title">
+ <string>Enter Printer Information</string>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QGroupBox" row="0" column="0">
+ <property name="name">
+ <cstring>groupBox4</cstring>
+ </property>
+ <property name="title">
+ <string>Printer Information</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLineEdit" row="0" column="1">
+ <property name="name">
+ <cstring>printerNameLineEdit</cstring>
+ </property>
+ <property name="maxLength">
+ <number>50</number>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="0" column="2">
+ <property name="name">
+ <cstring>defaultPrinterNamePushButton</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Default</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>textLabel1_2</cstring>
+ </property>
+ <property name="text">
+ <string>Location:</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>Printer Name:</string>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="2" column="1">
+ <property name="name">
+ <cstring>printerDescriptionLineEdit</cstring>
+ </property>
+ <property name="maxLength">
+ <number>50</number>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="1" column="1">
+ <property name="name">
+ <cstring>printerLocationLineEdit</cstring>
+ </property>
+ <property name="maxLength">
+ <number>50</number>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>textLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>Description:</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QGroupBox" row="1" column="0">
+ <property name="name">
+ <cstring>faxInfoGroupBox</cstring>
+ </property>
+ <property name="title">
+ <string>Fax Information</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLineEdit" row="1" column="1">
+ <property name="name">
+ <cstring>faxNameLineEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>textLabel1_3</cstring>
+ </property>
+ <property name="text">
+ <string>Fax Name:</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="3" column="0">
+ <property name="name">
+ <cstring>textLabel3</cstring>
+ </property>
+ <property name="text">
+ <string>Name/Company:</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>textLabel2_2</cstring>
+ </property>
+ <property name="text">
+ <string>Fax Number:</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="0" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>faxCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>Setup PC send fax</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="2" column="1">
+ <property name="name">
+ <cstring>faxNumberLineEdit</cstring>
+ </property>
+ <property name="maxLength">
+ <number>50</number>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="3" column="1">
+ <property name="name">
+ <cstring>faxNameCoLineEdit</cstring>
+ </property>
+ <property name="maxLength">
+ <number>50</number>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="1" column="2">
+ <property name="name">
+ <cstring>defaultFaxNamePushButton</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Default</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="4" column="0">
+ <property name="name">
+ <cstring>textLabel1_2_2</cstring>
+ </property>
+ <property name="text">
+ <string>Location:</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="5" column="0">
+ <property name="name">
+ <cstring>textLabel2_4</cstring>
+ </property>
+ <property name="text">
+ <string>Description:</string>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="4" column="1">
+ <property name="name">
+ <cstring>faxLocationLineEdit</cstring>
+ </property>
+ <property name="maxLength">
+ <number>50</number>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="5" column="1">
+ <property name="name">
+ <cstring>faxDescriptionLineEdit</cstring>
+ </property>
+ <property name="maxLength">
+ <number>50</number>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QLabel" row="3" column="0">
+ <property name="name">
+ <cstring>textLabel1_4</cstring>
+ </property>
+ <property name="text">
+ <string>Click "Next &gt;" to install the printer on your system.</string>
+ </property>
+ </widget>
+ <spacer row="2" column="0">
+ <property name="name">
+ <cstring>spacer14</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>FinishedPage</cstring>
+ </property>
+ <attribute name="title">
+ <string>Finished Adding Printer</string>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox" row="4" column="0">
+ <property name="name">
+ <cstring>printTestPageCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>Send test page to printer</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <spacer row="3" column="0">
+ <property name="name">
+ <cstring>spacer7</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QGroupBox" row="2" column="0">
+ <property name="name">
+ <cstring>faxGroupBox</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="title">
+ <string>Fax Summary</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>textLabel7</cstring>
+ </property>
+ <property name="text">
+ <string>Fax Number:</string>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="0" column="1">
+ <property name="name">
+ <cstring>lineEdit5</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>NoFrame</enum>
+ </property>
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="1" column="1">
+ <property name="name">
+ <cstring>lineEdit6</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>NoFrame</enum>
+ </property>
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>textLabel6</cstring>
+ </property>
+ <property name="text">
+ <string>Fax Name:</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>textLabel8</cstring>
+ </property>
+ <property name="text">
+ <string>Name/Company:</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="3" column="0">
+ <property name="name">
+ <cstring>textLabel8_2</cstring>
+ </property>
+ <property name="text">
+ <string>Location:</string>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="2" column="1">
+ <property name="name">
+ <cstring>lineEdit7</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>NoFrame</enum>
+ </property>
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QLabel" row="4" column="0">
+ <property name="name">
+ <cstring>textLabel8_3</cstring>
+ </property>
+ <property name="text">
+ <string>Description:</string>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="3" column="1">
+ <property name="name">
+ <cstring>lineEdit8</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>NoFrame</enum>
+ </property>
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="4" column="1">
+ <property name="name">
+ <cstring>lineEdit9</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>NoFrame</enum>
+ </property>
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QGroupBox" row="1" column="0">
+ <property name="name">
+ <cstring>groupBox3</cstring>
+ </property>
+ <property name="title">
+ <string>Printer Summary</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>textLabel4</cstring>
+ </property>
+ <property name="text">
+ <string>Description:</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>textLabel3_2</cstring>
+ </property>
+ <property name="text">
+ <string>Location:</string>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="3" column="1">
+ <property name="name">
+ <cstring>lineEdit4</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>NoFrame</enum>
+ </property>
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>textLabel2_3</cstring>
+ </property>
+ <property name="text">
+ <string>Printer Name:</string>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="2" column="1">
+ <property name="name">
+ <cstring>lineEdit3</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>NoFrame</enum>
+ </property>
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="1" column="1">
+ <property name="name">
+ <cstring>lineEdit2</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>NoFrame</enum>
+ </property>
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="0" column="1">
+ <property name="name">
+ <cstring>lineEdit1</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>NoFrame</enum>
+ </property>
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QLabel" row="3" column="0">
+ <property name="name">
+ <cstring>textLabel5</cstring>
+ </property>
+ <property name="text">
+ <string>PPD File:</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>textLabel2_5</cstring>
+ </property>
+ <property name="text">
+ <string>The printer has been successfully installed on your system.</string>
+ </property>
+ <property name="alignment">
+ <set>WordBreak|AlignVCenter</set>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+</widget>
+<connections>
+ <connection>
+ <sender>connectionTypeButtonGroup</sender>
+ <signal>clicked(int)</signal>
+ <receiver>SetupForm_base</receiver>
+ <slot>connectionTypeButtonGroup_clicked(int)</slot>
+ </connection>
+ <connection>
+ <sender>probedDevicesListView</sender>
+ <signal>currentChanged(QListViewItem*)</signal>
+ <receiver>SetupForm_base</receiver>
+ <slot>probedDevicesListView_currentChanged(QListViewItem*)</slot>
+ </connection>
+ <connection>
+ <sender>printerNameLineEdit</sender>
+ <signal>textChanged(const QString&amp;)</signal>
+ <receiver>SetupForm_base</receiver>
+ <slot>printerNameLineEdit_textChanged(const QString&amp;)</slot>
+ </connection>
+ <connection>
+ <sender>defaultPrinterNamePushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>SetupForm_base</receiver>
+ <slot>defaultPrinterNamePushButton_clicked()</slot>
+ </connection>
+ <connection>
+ <sender>ppdListView</sender>
+ <signal>currentChanged(QListViewItem*)</signal>
+ <receiver>SetupForm_base</receiver>
+ <slot>ppdListView_currentChanged(QListViewItem*)</slot>
+ </connection>
+ <connection>
+ <sender>searchFiltersPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>SetupForm_base</receiver>
+ <slot>searchFiltersPushButton_clicked()</slot>
+ </connection>
+ <connection>
+ <sender>searchFiltersPushButton2</sender>
+ <signal>clicked()</signal>
+ <receiver>SetupForm_base</receiver>
+ <slot>searchFiltersPushButton2_clicked()</slot>
+ </connection>
+ <connection>
+ <sender>probeUpdatePushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>SetupForm_base</receiver>
+ <slot>probeUpdatePushButton_clicked()</slot>
+ </connection>
+ <connection>
+ <sender>manualFindPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>SetupForm_base</receiver>
+ <slot>manualFindPushButton_clicked()</slot>
+ </connection>
+ <connection>
+ <sender>printerLocationLineEdit</sender>
+ <signal>textChanged(const QString&amp;)</signal>
+ <receiver>SetupForm_base</receiver>
+ <slot>printerLocationLineEdit_textChanged(const QString&amp;)</slot>
+ </connection>
+ <connection>
+ <sender>printerDescriptionLineEdit</sender>
+ <signal>textChanged(const QString&amp;)</signal>
+ <receiver>SetupForm_base</receiver>
+ <slot>printerDescriptionLineEdit_textChanged(const QString&amp;)</slot>
+ </connection>
+ <connection>
+ <sender>faxCheckBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>faxNameLineEdit</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>faxCheckBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>faxNumberLineEdit</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>faxCheckBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>faxNameCoLineEdit</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>faxNameLineEdit</sender>
+ <signal>textChanged(const QString&amp;)</signal>
+ <receiver>SetupForm_base</receiver>
+ <slot>faxNameLineEdit_textChanged(const QString&amp;)</slot>
+ </connection>
+ <connection>
+ <sender>faxNumberLineEdit</sender>
+ <signal>textChanged(const QString&amp;)</signal>
+ <receiver>SetupForm_base</receiver>
+ <slot>faxNumberLineEdit_textChanged(const QString&amp;)</slot>
+ </connection>
+ <connection>
+ <sender>faxNameCoLineEdit</sender>
+ <signal>textChanged(const QString&amp;)</signal>
+ <receiver>SetupForm_base</receiver>
+ <slot>faxNameCoLineEdit_textChanged(const QString&amp;)</slot>
+ </connection>
+ <connection>
+ <sender>faxCheckBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>SetupForm_base</receiver>
+ <slot>faxCheckBox_toggled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>printTestPageCheckBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>SetupForm_base</receiver>
+ <slot>printTestPageCheckBox_toggled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>defaultFaxNamePushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>SetupForm_base</receiver>
+ <slot>defaultFaxNamePushButton_clicked()</slot>
+ </connection>
+ <connection>
+ <sender>otherPPDPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>SetupForm_base</receiver>
+ <slot>otherPPDPushButton_clicked()</slot>
+ </connection>
+ <connection>
+ <sender>ppdDefaultsPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>SetupForm_base</receiver>
+ <slot>ppdDefaultsPushButton_clicked()</slot>
+ </connection>
+ <connection>
+ <sender>faxLocationLineEdit</sender>
+ <signal>textChanged(const QString&amp;)</signal>
+ <receiver>SetupForm_base</receiver>
+ <slot>faxLocationLineEdit_textChanged(const QString&amp;)</slot>
+ </connection>
+ <connection>
+ <sender>faxDescriptionLineEdit</sender>
+ <signal>textChanged(const QString&amp;)</signal>
+ <receiver>SetupForm_base</receiver>
+ <slot>faxDescriptionLineEdit_textChanged(const QString&amp;)</slot>
+ </connection>
+ <connection>
+ <sender>faxCheckBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>faxLocationLineEdit</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>faxCheckBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>faxDescriptionLineEdit</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>printerNameLineEdit</tabstop>
+ <tabstop>printerLocationLineEdit</tabstop>
+ <tabstop>printerDescriptionLineEdit</tabstop>
+ <tabstop>faxCheckBox</tabstop>
+ <tabstop>faxNameLineEdit</tabstop>
+ <tabstop>faxNumberLineEdit</tabstop>
+ <tabstop>faxNameCoLineEdit</tabstop>
+ <tabstop>faxLocationLineEdit</tabstop>
+ <tabstop>faxDescriptionLineEdit</tabstop>
+ <tabstop>usbRadioButton</tabstop>
+ <tabstop>netRadioButton</tabstop>
+ <tabstop>parRadioButton</tabstop>
+ <tabstop>searchFiltersPushButton2</tabstop>
+ <tabstop>probedDevicesListView</tabstop>
+ <tabstop>searchFiltersPushButton</tabstop>
+ <tabstop>manualFindPushButton</tabstop>
+ <tabstop>probeUpdatePushButton</tabstop>
+ <tabstop>ppdListView</tabstop>
+ <tabstop>otherPPDPushButton</tabstop>
+ <tabstop>ppdDefaultsPushButton</tabstop>
+ <tabstop>defaultPrinterNamePushButton</tabstop>
+ <tabstop>defaultFaxNamePushButton</tabstop>
+ <tabstop>lineEdit4</tabstop>
+ <tabstop>lineEdit3</tabstop>
+ <tabstop>lineEdit2</tabstop>
+ <tabstop>lineEdit1</tabstop>
+ <tabstop>printTestPageCheckBox</tabstop>
+ <tabstop>lineEdit5</tabstop>
+ <tabstop>lineEdit6</tabstop>
+ <tabstop>lineEdit7</tabstop>
+ <tabstop>lineEdit8</tabstop>
+ <tabstop>lineEdit9</tabstop>
+</tabstops>
+<slots>
+ <slot>connectionTypeButtonGroup_clicked( int )</slot>
+ <slot>probedDevicesListView_currentChanged( QListViewItem * )</slot>
+ <slot>printerNameLineEdit_textChanged( const QString &amp; )</slot>
+ <slot>defaultPrinterNamePushButton_clicked()</slot>
+ <slot>ppdBrowsePushButton_clicked()</slot>
+ <slot>ppdFileLineEdit_textChanged( const QString &amp; )</slot>
+ <slot>ppdListView_currentChanged( QListViewItem * )</slot>
+ <slot>probeUpdatePushButton_clicked()</slot>
+ <slot>searchFiltersPushButton_clicked()</slot>
+ <slot>searchFiltersPushButton2_clicked()</slot>
+ <slot>manualFindPushButton_clicked()</slot>
+ <slot>printerLocationLineEdit_textChanged( const QString &amp; )</slot>
+ <slot>printerDescriptionLineEdit_textChanged( const QString &amp; )</slot>
+ <slot>faxNameLineEdit_textChanged( const QString &amp; )</slot>
+ <slot>faxNumberLineEdit_textChanged( const QString &amp; )</slot>
+ <slot>faxNameCoLineEdit_textChanged( const QString &amp; )</slot>
+ <slot>printTestPageCheckBox_clicked()</slot>
+ <slot>faxCheckBox_clicked()</slot>
+ <slot>faxCheckBox_toggled( bool )</slot>
+ <slot>printTestPageCheckBox_toggled( bool )</slot>
+ <slot>defaultFaxNamePushButton_clicked()</slot>
+ <slot>otherPPDPushButton_clicked()</slot>
+ <slot>ppdDefaultsPushButton_clicked()</slot>
+ <slot>faxLocationLineEdit_textChanged( const QString &amp; )</slot>
+ <slot>faxDescriptionLineEdit_textChanged( const QString &amp; )</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/ui/setupmanualfind.py b/ui/setupmanualfind.py
new file mode 100644
index 0000000..4072080
--- /dev/null
+++ b/ui/setupmanualfind.py
@@ -0,0 +1,57 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2001-2007 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+from base.g import *
+
+from qt import *
+from setupmanualfind_base import SetupManualFind_base
+
+class SetupManualFind(SetupManualFind_base):
+ def __init__(self, bus, parent=None, name=None, modal=0, fl = 0):
+ SetupManualFind_base.__init__(self, parent, name, modal, fl)
+ self.bus = bus
+ self.param = ''
+
+ if self.bus == 'net':
+ self.findHeadingText.setText(self.__tr("""Please enter the printer's network hostname or IP address."""))
+ self.hintTextLabel.setText(self.__tr("""<i>(IPv4 address "a.b.c.d" or "hostname".)</i>"""))
+ self.findTextLabel.setText(self.__tr("""Hostname or IP Address:"""))
+
+ elif self.bus == 'usb':
+ self.findHeadingText.setText(self.__tr("""Please enter the USB ID for the printer."""))
+ self.hintTextLabel.setText(self.__tr("""<i>("xxx:yyy" where xxx is the USB bus ID and yyy is the USB device ID. The ':' and all leading zeroes must be present. Use 'lsusb' to determine this information.)</i>"""))
+ self.findTextLabel.setText(self.__tr("""USB ID:"""))
+ self.findLineEdit.setInputMask("000:000;0")
+
+ elif self.bus == 'par':
+ self.findHeadingText.setText(self.__tr("""Please enter the filesystem device node for the printer."""))
+ self.hintTextLabel.setText(self.__tr(""" <i>("/dev/parportX", X=0,1,2,...)</i>"""))
+ self.findTextLabel.setText(self.__tr("""Device Node:"""))
+
+ def findLineEdit_textChanged(self,a0):
+ self.param = unicode(a0)
+
+ if self.bus == 'usb':
+ bus, dev = self.param.split(':')
+ self.param = ''.join(['0'*(3-len(bus)), bus, ':', '0'*(3-len(dev)), dev])
+
+ def __tr(self,s,c = None):
+ return qApp.translate("SetupManualFind_base",s,c)
diff --git a/ui/setupmanualfind_base.py b/ui/setupmanualfind_base.py
new file mode 100644
index 0000000..fd30938
--- /dev/null
+++ b/ui/setupmanualfind_base.py
@@ -0,0 +1,86 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'ui/setupmanualfind_base.ui'
+#
+# Created: Fri Apr 25 15:08:10 2008
+# by: The PyQt User Interface Compiler (pyuic) 3.17.3
+#
+# WARNING! All changes made in this file will be lost!
+
+
+from qt import *
+
+
+class SetupManualFind_base(QDialog):
+ def __init__(self,parent = None,name = None,modal = 0,fl = 0):
+ QDialog.__init__(self,parent,name,modal,fl)
+
+ if not name:
+ self.setName("SetupManualFind_base")
+
+
+ SetupManualFind_baseLayout = QGridLayout(self,1,1,11,6,"SetupManualFind_baseLayout")
+ spacer19 = QSpacerItem(331,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ SetupManualFind_baseLayout.addItem(spacer19,3,0)
+
+ self.findHeadingText = QLabel(self,"findHeadingText")
+ self.findHeadingText.setAlignment(QLabel.WordBreak | QLabel.AlignVCenter)
+
+ SetupManualFind_baseLayout.addMultiCellWidget(self.findHeadingText,0,0,0,2)
+
+ self.pushButton12 = QPushButton(self,"pushButton12")
+
+ SetupManualFind_baseLayout.addWidget(self.pushButton12,3,1)
+
+ self.pushButton11 = QPushButton(self,"pushButton11")
+ self.pushButton11.setDefault(1)
+
+ SetupManualFind_baseLayout.addWidget(self.pushButton11,3,2)
+ spacer21 = QSpacerItem(20,40,QSizePolicy.Minimum,QSizePolicy.Expanding)
+ SetupManualFind_baseLayout.addItem(spacer21,2,0)
+
+ layout3 = QGridLayout(None,1,1,0,6,"layout3")
+
+ self.findLineEdit = QLineEdit(self,"findLineEdit")
+ self.findLineEdit.setMaxLength(50)
+
+ layout3.addWidget(self.findLineEdit,0,1)
+
+ self.hintTextLabel = QLabel(self,"hintTextLabel")
+ self.hintTextLabel.setAlignment(QLabel.WordBreak | QLabel.AlignVCenter)
+
+ layout3.addWidget(self.hintTextLabel,1,1)
+
+ self.findTextLabel = QLabel(self,"findTextLabel")
+
+ layout3.addWidget(self.findTextLabel,0,0)
+
+ SetupManualFind_baseLayout.addMultiCellLayout(layout3,1,1,0,2)
+
+ self.languageChange()
+
+ self.resize(QSize(646,226).expandedTo(self.minimumSizeHint()))
+ self.clearWState(Qt.WState_Polished)
+
+ self.connect(self.pushButton12,SIGNAL("clicked()"),self.reject)
+ self.connect(self.pushButton11,SIGNAL("clicked()"),self.accept)
+ self.connect(self.findLineEdit,SIGNAL("textChanged(const QString&)"),self.findLineEdit_textChanged)
+
+ self.setTabOrder(self.findLineEdit,self.pushButton12)
+ self.setTabOrder(self.pushButton12,self.pushButton11)
+
+
+ def languageChange(self):
+ self.setCaption(self.__tr("HP Device Manager - Manually Find Device"))
+ self.findHeadingText.setText(self.__tr("TEXT"))
+ self.pushButton12.setText(self.__tr("Cancel"))
+ self.pushButton11.setText(self.__tr("Find"))
+ self.hintTextLabel.setText(self.__tr("textLabel1"))
+ self.findTextLabel.setText(self.__tr("IP/HN/SER/USB/DEV:"))
+
+
+ def findLineEdit_textChanged(self,a0):
+ print "SetupManualFind_base.findLineEdit_textChanged(const QString&): Not implemented yet"
+
+ def __tr(self,s,c = None):
+ return qApp.translate("SetupManualFind_base",s,c)
diff --git a/ui/setupmanualfind_base.ui b/ui/setupmanualfind_base.ui
new file mode 100644
index 0000000..fbf7e41
--- /dev/null
+++ b/ui/setupmanualfind_base.ui
@@ -0,0 +1,154 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>SetupManualFind_base</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>SetupManualFind_base</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>646</width>
+ <height>226</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>HP Device Manager - Manually Find Device</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer row="3" column="0">
+ <property name="name">
+ <cstring>spacer19</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>331</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLabel" row="0" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>findHeadingText</cstring>
+ </property>
+ <property name="text">
+ <string>TEXT</string>
+ </property>
+ <property name="alignment">
+ <set>WordBreak|AlignVCenter</set>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="3" column="1">
+ <property name="name">
+ <cstring>pushButton12</cstring>
+ </property>
+ <property name="text">
+ <string>Cancel</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="3" column="2">
+ <property name="name">
+ <cstring>pushButton11</cstring>
+ </property>
+ <property name="text">
+ <string>Find</string>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <spacer row="2" column="0">
+ <property name="name">
+ <cstring>spacer21</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLayoutWidget" row="1" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>layout3</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLineEdit" row="0" column="1">
+ <property name="name">
+ <cstring>findLineEdit</cstring>
+ </property>
+ <property name="maxLength">
+ <number>50</number>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="1">
+ <property name="name">
+ <cstring>hintTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>textLabel1</string>
+ </property>
+ <property name="alignment">
+ <set>WordBreak|AlignVCenter</set>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>findTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>IP/HN/SER/USB/DEV:</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>pushButton12</sender>
+ <signal>clicked()</signal>
+ <receiver>SetupManualFind_base</receiver>
+ <slot>reject()</slot>
+ </connection>
+ <connection>
+ <sender>pushButton11</sender>
+ <signal>clicked()</signal>
+ <receiver>SetupManualFind_base</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection>
+ <sender>findLineEdit</sender>
+ <signal>textChanged(const QString&amp;)</signal>
+ <receiver>SetupManualFind_base</receiver>
+ <slot>findLineEdit_textChanged(const QString&amp;)</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>findLineEdit</tabstop>
+ <tabstop>pushButton12</tabstop>
+ <tabstop>pushButton11</tabstop>
+</tabstops>
+<slots>
+ <slot>findLineEdit_textChanged( const QString &amp; )</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/ui/setupsettings.py b/ui/setupsettings.py
new file mode 100644
index 0000000..120cf5b
--- /dev/null
+++ b/ui/setupsettings.py
@@ -0,0 +1,121 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2001-2007 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+from base.g import *
+from base.codes import *
+
+from qt import *
+from setupsettings_base import SetupSettings_base
+
+class SetupSettings(SetupSettings_base):
+ def __init__(self, bus, filter, search, ttl, timeout, parent=None, name=None, modal=0, fl = 0):
+ SetupSettings_base.__init__(self, parent, name, modal, fl)
+
+ self.filter = filter
+ self.search = search
+ self.ttl = ttl
+ self.timeout = timeout
+
+ log.debug("filter is %s" % filter)
+ if prop.fax_build and prop.scan_build:
+ if not filter:
+ self.filterButtonGroup.setButton(0)
+ else:
+ self.filterButtonGroup.setButton(1)
+ self.faxCheckBox.setChecked('fax' in filter)
+ self.scanCheckBox.setChecked('scan' in filter)
+ self.pcardCheckBox.setChecked('pcard' in filter)
+ self.copyCheckBox.setChecked('copy' in filter)
+ else:
+ self.filterButtonGroup.setEnabled(False)
+
+ self.searchTermLineEdit.setText(self.search)
+
+ self.ttlSpinBox.setValue(self.ttl)
+ self.timeoutSpinBox.setValue(self.timeout)
+
+ if not prop.net_build:
+ self.ttlSpinBox.setEnabled(False)
+ self.timeoutSpinBox.setEnabled(False)
+ self.groupBox3.setEnabled(False)
+ self.textLabel7.setEnabled(False)
+ self.textLabel8.setEnabled(False)
+
+ def faxCheckBox_toggled(self,a0):
+ self.updateFilter()
+
+ def scanCheckBox_toggled(self,a0):
+ self.updateFilter()
+
+ def pcardCheckBox_toggled(self,a0):
+ self.updateFilter()
+
+ def copyCheckBox_toggled(self,a0):
+ self.updateFilter()
+
+ def filterButtonGroup_clicked(self, a0):
+ self.updateFilter(a0)
+
+ def searchTermLineEdit_textChanged(self, a0):
+ self.search = unicode(a0)
+
+ def ttlSpinBox_valueChanged(self, a0):
+ self.ttl = a0
+ log.debug(self.ttl)
+
+ def timeoutSpinBox_valueChanged(self, a0):
+ self.timeout = a0
+ log.debug(self.timeout)
+
+ def updateFilter(self, id=-1):
+ self.filter = []
+
+ if id == 0:
+ return
+
+ else:
+ if self.faxCheckBox.isChecked():
+ self.filter.append('fax')
+
+ if self.scanCheckBox.isChecked():
+ self.filter.append('scan')
+
+ if self.pcardCheckBox.isChecked():
+ self.filter.append('pcard')
+
+ if self.copyCheckBox.isChecked():
+ self.filter.append('copy')
+
+ #if not filter:
+ # filter.append('none')
+
+ log.debug(self.filter)
+
+
+ def defaultsPushButton_clicked(self):
+ self.filterButtonGroup.setButton(0)
+ self.updateFilter(0)
+ self.searchTermLineEdit.setText('')
+ self.ttlSpinBox.setValue(4)
+ self.timeoutSpinBox.setValue(5)
+
+ def __tr(self,s,c = None):
+ return qApp.translate("SetupSettings_base",s,c)
diff --git a/ui/setupsettings_base.py b/ui/setupsettings_base.py
new file mode 100644
index 0000000..3000ee7
--- /dev/null
+++ b/ui/setupsettings_base.py
@@ -0,0 +1,217 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'ui/setupsettings_base.ui'
+#
+# Created: Wed Sep 27 09:51:56 2006
+# by: The PyQt User Interface Compiler (pyuic) 3.15.1
+#
+# WARNING! All changes made in this file will be lost!
+
+
+from qt import *
+
+
+class SetupSettings_base(QDialog):
+ def __init__(self,parent = None,name = None,modal = 0,fl = 0):
+ QDialog.__init__(self,parent,name,modal,fl)
+
+ if not name:
+ self.setName("SetupSettings_base")
+
+
+ SetupSettings_baseLayout = QGridLayout(self,1,1,11,6,"SetupSettings_baseLayout")
+
+ self.filterButtonGroup = QButtonGroup(self,"filterButtonGroup")
+ self.filterButtonGroup.setColumnLayout(0,Qt.Vertical)
+ self.filterButtonGroup.layout().setSpacing(6)
+ self.filterButtonGroup.layout().setMargin(11)
+ filterButtonGroupLayout = QGridLayout(self.filterButtonGroup.layout())
+ filterButtonGroupLayout.setAlignment(Qt.AlignTop)
+
+ self.allRadioButton = QRadioButton(self.filterButtonGroup,"allRadioButton")
+ self.allRadioButton.setChecked(1)
+
+ filterButtonGroupLayout.addMultiCellWidget(self.allRadioButton,0,0,0,1)
+
+ self.filterRadioButton = QRadioButton(self.filterButtonGroup,"filterRadioButton")
+
+ filterButtonGroupLayout.addMultiCellWidget(self.filterRadioButton,1,1,0,2)
+
+ layout8 = QGridLayout(None,1,1,8,6,"layout8")
+
+ self.copyCheckBox = QCheckBox(self.filterButtonGroup,"copyCheckBox")
+ self.copyCheckBox.setEnabled(0)
+
+ layout8.addWidget(self.copyCheckBox,3,0)
+
+ self.pcardCheckBox = QCheckBox(self.filterButtonGroup,"pcardCheckBox")
+ self.pcardCheckBox.setEnabled(0)
+
+ layout8.addWidget(self.pcardCheckBox,2,0)
+
+ self.scanCheckBox = QCheckBox(self.filterButtonGroup,"scanCheckBox")
+ self.scanCheckBox.setEnabled(0)
+
+ layout8.addWidget(self.scanCheckBox,1,0)
+
+ self.faxCheckBox = QCheckBox(self.filterButtonGroup,"faxCheckBox")
+ self.faxCheckBox.setEnabled(0)
+
+ layout8.addWidget(self.faxCheckBox,0,0)
+
+ filterButtonGroupLayout.addLayout(layout8,2,1)
+ spacer14 = QSpacerItem(301,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ filterButtonGroupLayout.addItem(spacer14,2,2)
+
+ SetupSettings_baseLayout.addMultiCellWidget(self.filterButtonGroup,0,0,0,3)
+
+ self.okPushButton = QPushButton(self,"okPushButton")
+ self.okPushButton.setDefault(1)
+
+ SetupSettings_baseLayout.addWidget(self.okPushButton,4,3)
+
+ self.cancelPushButton = QPushButton(self,"cancelPushButton")
+
+ SetupSettings_baseLayout.addWidget(self.cancelPushButton,4,2)
+
+ self.defaultsPushButton = QPushButton(self,"defaultsPushButton")
+
+ SetupSettings_baseLayout.addWidget(self.defaultsPushButton,4,0)
+ spacer16 = QSpacerItem(140,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ SetupSettings_baseLayout.addItem(spacer16,4,1)
+
+ self.groupBox2 = QGroupBox(self,"groupBox2")
+ self.groupBox2.setColumnLayout(0,Qt.Vertical)
+ self.groupBox2.layout().setSpacing(6)
+ self.groupBox2.layout().setMargin(11)
+ groupBox2Layout = QGridLayout(self.groupBox2.layout())
+ groupBox2Layout.setAlignment(Qt.AlignTop)
+
+ self.textLabel6 = QLabel(self.groupBox2,"textLabel6")
+
+ groupBox2Layout.addWidget(self.textLabel6,0,0)
+
+ self.searchTermLineEdit = QLineEdit(self.groupBox2,"searchTermLineEdit")
+ self.searchTermLineEdit.setMaxLength(255)
+
+ groupBox2Layout.addWidget(self.searchTermLineEdit,0,1)
+
+ SetupSettings_baseLayout.addMultiCellWidget(self.groupBox2,1,1,0,3)
+
+ self.groupBox3 = QGroupBox(self,"groupBox3")
+ self.groupBox3.setColumnLayout(0,Qt.Vertical)
+ self.groupBox3.layout().setSpacing(6)
+ self.groupBox3.layout().setMargin(11)
+ groupBox3Layout = QGridLayout(self.groupBox3.layout())
+ groupBox3Layout.setAlignment(Qt.AlignTop)
+
+ layout10 = QGridLayout(None,1,1,0,6,"layout10")
+
+ self.timeoutSpinBox = QSpinBox(self.groupBox3,"timeoutSpinBox")
+ self.timeoutSpinBox.setMaxValue(45)
+ self.timeoutSpinBox.setMinValue(1)
+
+ layout10.addWidget(self.timeoutSpinBox,1,1)
+
+ self.textLabel7 = QLabel(self.groupBox3,"textLabel7")
+
+ layout10.addWidget(self.textLabel7,0,0)
+
+ self.textLabel8 = QLabel(self.groupBox3,"textLabel8")
+
+ layout10.addWidget(self.textLabel8,1,0)
+
+ self.ttlSpinBox = QSpinBox(self.groupBox3,"ttlSpinBox")
+ self.ttlSpinBox.setMaxValue(255)
+ self.ttlSpinBox.setMinValue(1)
+
+ layout10.addWidget(self.ttlSpinBox,0,1)
+
+ groupBox3Layout.addLayout(layout10,0,0)
+ spacer15 = QSpacerItem(261,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ groupBox3Layout.addItem(spacer15,0,1)
+
+ SetupSettings_baseLayout.addMultiCellWidget(self.groupBox3,2,2,0,3)
+ spacer12 = QSpacerItem(20,16,QSizePolicy.Minimum,QSizePolicy.Expanding)
+ SetupSettings_baseLayout.addItem(spacer12,3,0)
+
+ self.languageChange()
+
+ self.resize(QSize(473,421).expandedTo(self.minimumSizeHint()))
+ self.clearWState(Qt.WState_Polished)
+
+ self.connect(self.cancelPushButton,SIGNAL("clicked()"),self.reject)
+ self.connect(self.okPushButton,SIGNAL("clicked()"),self.accept)
+ self.connect(self.filterRadioButton,SIGNAL("toggled(bool)"),self.faxCheckBox.setEnabled)
+ self.connect(self.filterRadioButton,SIGNAL("toggled(bool)"),self.scanCheckBox.setEnabled)
+ self.connect(self.filterRadioButton,SIGNAL("toggled(bool)"),self.pcardCheckBox.setEnabled)
+ self.connect(self.filterRadioButton,SIGNAL("toggled(bool)"),self.copyCheckBox.setEnabled)
+ self.connect(self.faxCheckBox,SIGNAL("toggled(bool)"),self.faxCheckBox_toggled)
+ self.connect(self.scanCheckBox,SIGNAL("toggled(bool)"),self.scanCheckBox_toggled)
+ self.connect(self.pcardCheckBox,SIGNAL("toggled(bool)"),self.pcardCheckBox_toggled)
+ self.connect(self.copyCheckBox,SIGNAL("toggled(bool)"),self.copyCheckBox_toggled)
+ self.connect(self.filterButtonGroup,SIGNAL("clicked(int)"),self.filterButtonGroup_clicked)
+ self.connect(self.searchTermLineEdit,SIGNAL("textChanged(const QString&)"),self.searchTermLineEdit_textChanged)
+ self.connect(self.ttlSpinBox,SIGNAL("valueChanged(int)"),self.ttlSpinBox_valueChanged)
+ self.connect(self.timeoutSpinBox,SIGNAL("valueChanged(int)"),self.timeoutSpinBox_valueChanged)
+ self.connect(self.defaultsPushButton,SIGNAL("clicked()"),self.defaultsPushButton_clicked)
+
+ self.setTabOrder(self.allRadioButton,self.faxCheckBox)
+ self.setTabOrder(self.faxCheckBox,self.scanCheckBox)
+ self.setTabOrder(self.scanCheckBox,self.pcardCheckBox)
+ self.setTabOrder(self.pcardCheckBox,self.copyCheckBox)
+ self.setTabOrder(self.copyCheckBox,self.searchTermLineEdit)
+ self.setTabOrder(self.searchTermLineEdit,self.ttlSpinBox)
+ self.setTabOrder(self.ttlSpinBox,self.timeoutSpinBox)
+ self.setTabOrder(self.timeoutSpinBox,self.cancelPushButton)
+ self.setTabOrder(self.cancelPushButton,self.okPushButton)
+
+
+ def languageChange(self):
+ self.setCaption(self.__tr("HP Device Manager - Setup Filters, Search and Settings"))
+ self.filterButtonGroup.setTitle(self.__tr("Discovery Filter"))
+ self.allRadioButton.setText(self.__tr("Discover all devices"))
+ self.filterRadioButton.setText(self.__tr("Only discover devices that support the following functionality:"))
+ self.copyCheckBox.setText(self.__tr("PC Initiated Copying"))
+ self.pcardCheckBox.setText(self.__tr("PC Photocard Access"))
+ self.scanCheckBox.setText(self.__tr("Scan to PC"))
+ self.faxCheckBox.setText(self.__tr("PC Send Fax"))
+ self.okPushButton.setText(self.__tr("OK"))
+ self.cancelPushButton.setText(self.__tr("Cancel"))
+ self.defaultsPushButton.setText(self.__tr("Defaults"))
+ self.groupBox2.setTitle(self.__tr("Discovery Search"))
+ self.textLabel6.setText(self.__tr("Search Term:"))
+ self.groupBox3.setTitle(self.__tr("Network Discovery Settings"))
+ self.textLabel7.setText(self.__tr("TTL:"))
+ self.textLabel8.setText(self.__tr("Timeout (secs):"))
+
+
+ def faxCheckBox_toggled(self,a0):
+ print "SetupSettings_base.faxCheckBox_toggled(bool): Not implemented yet"
+
+ def scanCheckBox_toggled(self,a0):
+ print "SetupSettings_base.scanCheckBox_toggled(bool): Not implemented yet"
+
+ def pcardCheckBox_toggled(self,a0):
+ print "SetupSettings_base.pcardCheckBox_toggled(bool): Not implemented yet"
+
+ def copyCheckBox_toggled(self,a0):
+ print "SetupSettings_base.copyCheckBox_toggled(bool): Not implemented yet"
+
+ def filterButtonGroup_clicked(self,a0):
+ print "SetupSettings_base.filterButtonGroup_clicked(int): Not implemented yet"
+
+ def searchTermLineEdit_textChanged(self,a0):
+ print "SetupSettings_base.searchTermLineEdit_textChanged(const QString&): Not implemented yet"
+
+ def ttlSpinBox_valueChanged(self,a0):
+ print "SetupSettings_base.ttlSpinBox_valueChanged(int): Not implemented yet"
+
+ def timeoutSpinBox_valueChanged(self,a0):
+ print "SetupSettings_base.timeoutSpinBox_valueChanged(int): Not implemented yet"
+
+ def defaultsPushButton_clicked(self):
+ print "SetupSettings_base.defaultsPushButton_clicked(): Not implemented yet"
+
+ def __tr(self,s,c = None):
+ return qApp.translate("SetupSettings_base",s,c)
diff --git a/ui/setupsettings_base.ui b/ui/setupsettings_base.ui
new file mode 100644
index 0000000..7a3750a
--- /dev/null
+++ b/ui/setupsettings_base.ui
@@ -0,0 +1,417 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>SetupSettings_base</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>SetupSettings_base</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>473</width>
+ <height>421</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>HP Device Manager - Setup Filters, Search and Settings</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QButtonGroup" row="0" column="0" rowspan="1" colspan="4">
+ <property name="name">
+ <cstring>filterButtonGroup</cstring>
+ </property>
+ <property name="title">
+ <string>Discovery Filter</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QRadioButton" row="0" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>allRadioButton</cstring>
+ </property>
+ <property name="text">
+ <string>Discover all devices</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QRadioButton" row="1" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>filterRadioButton</cstring>
+ </property>
+ <property name="text">
+ <string>Only discover devices that support the following functionality:</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="2" column="1">
+ <property name="name">
+ <cstring>layout8</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>8</number>
+ </property>
+ <widget class="QCheckBox" row="3" column="0">
+ <property name="name">
+ <cstring>copyCheckBox</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>PC Initiated Copying</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="2" column="0">
+ <property name="name">
+ <cstring>pcardCheckBox</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>PC Photocard Access</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="1" column="0">
+ <property name="name">
+ <cstring>scanCheckBox</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Scan to PC</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="0" column="0">
+ <property name="name">
+ <cstring>faxCheckBox</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>PC Send Fax</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <spacer row="2" column="2">
+ <property name="name">
+ <cstring>spacer14</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>301</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+ </widget>
+ <widget class="QPushButton" row="4" column="3">
+ <property name="name">
+ <cstring>okPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>OK</string>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="4" column="2">
+ <property name="name">
+ <cstring>cancelPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>Cancel</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="4" column="0">
+ <property name="name">
+ <cstring>defaultsPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>Defaults</string>
+ </property>
+ </widget>
+ <spacer row="4" column="1">
+ <property name="name">
+ <cstring>spacer16</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>140</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QGroupBox" row="1" column="0" rowspan="1" colspan="4">
+ <property name="name">
+ <cstring>groupBox2</cstring>
+ </property>
+ <property name="title">
+ <string>Discovery Search</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>textLabel6</cstring>
+ </property>
+ <property name="text">
+ <string>Search Term:</string>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="0" column="1">
+ <property name="name">
+ <cstring>searchTermLineEdit</cstring>
+ </property>
+ <property name="maxLength">
+ <number>255</number>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QGroupBox" row="2" column="0" rowspan="1" colspan="4">
+ <property name="name">
+ <cstring>groupBox3</cstring>
+ </property>
+ <property name="title">
+ <string>Network Discovery Settings</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget" row="0" column="0">
+ <property name="name">
+ <cstring>layout10</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QSpinBox" row="1" column="1">
+ <property name="name">
+ <cstring>timeoutSpinBox</cstring>
+ </property>
+ <property name="maxValue">
+ <number>45</number>
+ </property>
+ <property name="minValue">
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>textLabel7</cstring>
+ </property>
+ <property name="text">
+ <string>TTL:</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>textLabel8</cstring>
+ </property>
+ <property name="text">
+ <string>Timeout (secs):</string>
+ </property>
+ </widget>
+ <widget class="QSpinBox" row="0" column="1">
+ <property name="name">
+ <cstring>ttlSpinBox</cstring>
+ </property>
+ <property name="maxValue">
+ <number>255</number>
+ </property>
+ <property name="minValue">
+ <number>1</number>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <spacer row="0" column="1">
+ <property name="name">
+ <cstring>spacer15</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>261</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+ </widget>
+ <spacer row="3" column="0">
+ <property name="name">
+ <cstring>spacer12</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>16</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>cancelPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>SetupSettings_base</receiver>
+ <slot>reject()</slot>
+ </connection>
+ <connection>
+ <sender>okPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>SetupSettings_base</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection>
+ <sender>filterRadioButton</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>faxCheckBox</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>filterRadioButton</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>scanCheckBox</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>filterRadioButton</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>pcardCheckBox</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>filterRadioButton</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>copyCheckBox</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>faxCheckBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>SetupSettings_base</receiver>
+ <slot>faxCheckBox_toggled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>scanCheckBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>SetupSettings_base</receiver>
+ <slot>scanCheckBox_toggled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>pcardCheckBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>SetupSettings_base</receiver>
+ <slot>pcardCheckBox_toggled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>copyCheckBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>SetupSettings_base</receiver>
+ <slot>copyCheckBox_toggled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>filterButtonGroup</sender>
+ <signal>clicked(int)</signal>
+ <receiver>SetupSettings_base</receiver>
+ <slot>filterButtonGroup_clicked(int)</slot>
+ </connection>
+ <connection>
+ <sender>searchTermLineEdit</sender>
+ <signal>textChanged(const QString&amp;)</signal>
+ <receiver>SetupSettings_base</receiver>
+ <slot>searchTermLineEdit_textChanged(const QString&amp;)</slot>
+ </connection>
+ <connection>
+ <sender>ttlSpinBox</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>SetupSettings_base</receiver>
+ <slot>ttlSpinBox_valueChanged(int)</slot>
+ </connection>
+ <connection>
+ <sender>timeoutSpinBox</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>SetupSettings_base</receiver>
+ <slot>timeoutSpinBox_valueChanged(int)</slot>
+ </connection>
+ <connection>
+ <sender>defaultsPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>SetupSettings_base</receiver>
+ <slot>defaultsPushButton_clicked()</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>allRadioButton</tabstop>
+ <tabstop>faxCheckBox</tabstop>
+ <tabstop>scanCheckBox</tabstop>
+ <tabstop>pcardCheckBox</tabstop>
+ <tabstop>copyCheckBox</tabstop>
+ <tabstop>searchTermLineEdit</tabstop>
+ <tabstop>ttlSpinBox</tabstop>
+ <tabstop>timeoutSpinBox</tabstop>
+ <tabstop>cancelPushButton</tabstop>
+ <tabstop>okPushButton</tabstop>
+</tabstops>
+<includes>
+ <include location="local" impldecl="in implementation">setupsettings_base.ui.h</include>
+</includes>
+<slots>
+ <slot>faxCheckBox_toggled( bool )</slot>
+ <slot>scanCheckBox_toggled( bool )</slot>
+ <slot>pcardCheckBox_toggled( bool )</slot>
+ <slot>copyCheckBox_toggled( bool )</slot>
+ <slot>filterButtonGroup_clicked( int )</slot>
+ <slot>searchTermLineEdit_textChanged( const QString &amp; )</slot>
+ <slot>ttlSpinBox_valueChanged( int )</slot>
+ <slot>timeoutSpinBox_valueChanged( int )</slot>
+ <slot>defaultsPushButton_clicked()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/ui/systemtray.py b/ui/systemtray.py
new file mode 100644
index 0000000..8145443
--- /dev/null
+++ b/ui/systemtray.py
@@ -0,0 +1,578 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2008 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Authors: Don Welch, Torsten Marek
+
+# Std Lib
+import sys
+import struct
+import select
+import os
+import signal
+import os.path
+import time
+
+# Local
+from base.g import *
+from base import device, utils
+from ui_utils import load_pixmap
+
+# Qt
+try:
+ from qt import *
+except ImportError:
+ log.error("Python bindings for Qt3 not found. Exiting!")
+ sys.exit(1)
+
+# C types
+try:
+ import ctypes as c
+ import ctypes.util as cu
+except ImportError:
+ log.error("Qt3 version of hp-systray requires python-ctypes module. Exiting!")
+ sys.exit(1)
+
+# dbus
+try:
+ import dbus
+ from dbus import SessionBus, lowlevel
+except ImportError:
+ log.error("Python bindings for dbus not found. Exiting!")
+ sys.exit(1)
+
+
+# pynotify (optional)
+have_pynotify = True
+try:
+ import pynotify
+except ImportError:
+ have_pynotify = False
+
+
+TrayIcon_Warning = 0
+TrayIcon_Critical = 1
+TrayIcon_Information = 2
+
+theBalloonTip = None
+UPGRADE_CHECK_DELAY=24*60*60*1000 #1 day
+
+
+class BalloonTip(QDialog):
+ def __init__(self, msg_icon, title, msg, tray_icon):
+ QDialog.__init__(self, tray_icon, "BalloonTip", False,
+ Qt.WStyle_StaysOnTop | Qt.WStyle_Customize | Qt.WStyle_NoBorder | Qt.WStyle_Tool | Qt.WX11BypassWM)
+
+ self.timerId = None
+ self.bubbleActive = False
+
+ QObject.connect(tray_icon, SIGNAL("destroyed()"), self.close)
+
+ self.titleLabel = QLabel(self)
+ self.titleLabel.installEventFilter(self)
+ self.titleLabel.setText(title)
+ f = self.titleLabel.font()
+ f.setBold(True)
+ self.titleLabel.setFont(f)
+ self.titleLabel.setTextFormat(Qt.PlainText) # to maintain compat with windows
+
+ self.closeButton = QPushButton(self)
+ self.closeButton.setPixmap(load_pixmap('close', '16x16'))
+ self.closeButton.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
+ self.closeButton.setFixedSize(18, 18)
+ QObject.connect(self.closeButton, SIGNAL("clicked()"), self.close)
+
+ self.msgLabel = QLabel(self)
+ self.msgLabel.installEventFilter(self)
+ self.msgLabel.setText(msg)
+ self.msgLabel.setTextFormat(Qt.PlainText)
+ self.msgLabel.setAlignment(Qt.AlignTop | Qt.AlignLeft)
+
+ layout = QGridLayout(self)
+ if msg_icon is not None:
+ self.iconLabel = QLabel(self)
+ self.iconLabel.setPixmap(msg_icon)
+ self.iconLabel.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
+ self.iconLabel.setMargin(2)
+ layout.addWidget(self.iconLabel, 0, 0)
+ layout.addWidget(self.titleLabel, 0, 1)
+ else:
+ layout.addMultiCellWidget(self.titleLabel, 0, 1, 0, 2)
+
+ layout.addWidget(self.closeButton, 0, 3)
+ layout.addMultiCellWidget(self.msgLabel, 1, 1, 0, 3)
+ layout.setMargin(3)
+ self.setPaletteBackgroundColor(QColor(255, 255, 224))
+
+
+ def resizeEvent(self, e):
+ QWidget.resizeEvent(self, e)
+
+
+ def mousePressEvent(self, e):
+ self.close()
+ if e.button() == Qt.LeftButton:
+ pass # TODO
+
+
+ def timerEvent(self, e):
+ if e.timerId() == self.timerId:
+ self.killTimer(self.timerId)
+ self.hide()
+ self.close()
+
+ return
+
+ QWidget.timerEvent(self, e)
+
+
+ def closeEvent(self, event):
+ self.bubbleActive = False
+ event.accept()
+
+
+ def balloon(self, pos, msecs, showArrow):
+ if self.bubbleActive:
+ return
+
+ self.bubbleActive = True
+
+ scr = QApplication.desktop().screenGeometry(pos)
+ sh = self.sizeHint()
+ ao = 18
+ if pos.y() + ao > scr.bottom():
+ self.move(pos.x()-sh.width(), pos.y()-sh.height()-ao)
+ else:
+ self.move(pos.x()-sh.width(), pos.y()+ao)
+
+ if msecs > 0:
+ self.timerId = self.startTimer(msecs)
+
+ self.show()
+
+
+def showBalloon(msg_icon, title, msg, tray_icon, pos, timeout, showArrow=True):
+ global theBalloonTip
+ hideBalloon()
+
+ theBalloonTip = BalloonTip(msg_icon, msg, title, tray_icon)
+
+ if timeout < 0:
+ timeout = 5000
+
+ theBalloonTip.balloon(pos, timeout, showArrow)
+
+
+def hideBalloon():
+ global theBalloonTip
+ if theBalloonTip is None:
+ return
+
+ theBalloonTip.hide()
+ del theBalloonTip
+ theBalloonTip = None
+
+
+
+class SystrayIcon(QLabel):
+ """ On construction, you have to supply a QPixmap instance holding the
+ application icon. The pixmap should not be bigger than 32x32,
+ preferably 22x22. Currently, no check is made.
+
+ The class can emits two signals:
+ Leftclick on icon: activated()
+ Rightclick on icon: contextMenuRequested(const QPoint&)
+
+ Based on code: (C) 2004 Torsten Marek
+ License: Public domain
+ """
+
+ def __init__(self, icon, parent=None, name=""):
+ QLabel.__init__(self, parent, name, Qt.WMouseNoMask | Qt.WRepaintNoErase |
+ Qt.WType_TopLevel | Qt.WStyle_Customize |
+ Qt.WStyle_NoBorder | Qt.WStyle_StaysOnTop)
+
+ self.setMinimumSize(22, 22)
+ self.setBackgroundMode(Qt.X11ParentRelative)
+ self.setBackgroundOrigin(QWidget.WindowOrigin)
+
+ self.libX11 = c.cdll.LoadLibrary(cu.find_library('X11'))
+
+ # get all functions, set arguments + return types
+ self.XternAtom = self.libX11.XInternAtom
+ self.XternAtom.argtypes = [c.c_void_p, c.c_char_p, c.c_int]
+
+ XSelectInput = self.libX11.XSelectInput
+ XSelectInput.argtypes = [c.c_void_p, c.c_int, c.c_long]
+
+ XUngrabServer = self.libX11.XUngrabServer
+ XUngrabServer.argtypes = [c.c_void_p]
+
+ XFlush = self.libX11.XFlush
+ XFlush.argtypes = [c.c_void_p]
+
+ class data(c.Union):
+ _fields_ = [("b", c.c_char * 20),
+ ("s", c.c_short * 10),
+ ("l", c.c_long * 5)]
+
+ class XClientMessageEvent(c.Structure):
+ _fields_ = [("type", c.c_int),
+ ("serial", c.c_ulong),
+ ("send_event", c.c_int),
+ ("display", c.c_void_p),
+ ("window", c.c_int),
+ ("message_type", c.c_int),
+ ("format", c.c_int),
+ ("data", data)]
+
+ XSendEvent = self.libX11.XSendEvent
+ XSendEvent.argtypes = [c.c_void_p, c.c_int, c.c_int, c.c_long, c.c_void_p]
+
+ XSync = self.libX11.XSync
+ XSync.argtypes = [c.c_void_p, c.c_int]
+
+ XChangeProperty = self.libX11.XChangeProperty
+ XChangeProperty.argtypes = [c.c_void_p, c.c_long, c.c_int, c.c_int,
+ c.c_int, c.c_int, c.c_char_p, c.c_int]
+
+ dpy = int(qt_xdisplay())
+ trayWin = self.winId()
+
+ x = 0
+ while True:
+ managerWin = self.locateTray(dpy)
+ if managerWin: break
+ x += 1
+ if x > 30: break
+ time.sleep(2.0)
+
+
+ # Make sure KDE puts the icon in the system tray
+ class data2(c.Union):
+ _fields_ = [("i", c.c_int, 32),
+ ("s", c.c_char * 4)]
+
+ k = data2()
+ k.i = 1
+ pk = c.cast(c.pointer(k), c.c_char_p)
+
+ r = self.XternAtom(dpy, "KWM_DOCKWINDOW", 0)
+ XChangeProperty(dpy, trayWin, r, r, 32, 0, pk, 1)
+
+ r = self.XternAtom(dpy, "_KDE_NET_WM_SYSTEM_TRAY_WINDOW_FOR", 0)
+ XChangeProperty(dpy, trayWin, r, 33, 32, 0, pk, 1)
+
+ if managerWin != 0:
+ # set StructureNotifyMask (1L << 17)
+ XSelectInput(dpy, managerWin, 1L << 17)
+
+ #XUngrabServer(dpy)
+ XFlush(dpy)
+
+ if managerWin != 0:
+ # send "SYSTEM_TRAY_OPCODE_REQUEST_DOCK to managerWin
+ k = data()
+ k.l = (0, # CurrentTime
+ 0, # REQUEST_DOCK
+ trayWin, # window ID
+ 0, # empty
+ 0) # empty
+ ev = XClientMessageEvent(33, #type: ClientMessage
+ 0, # serial
+ 0, # send_event
+ dpy, # display
+ managerWin, # systray manager
+ self.XternAtom(dpy, "_NET_SYSTEM_TRAY_OPCODE", 0), # message type
+ 32, # format
+ k) # message data
+ XSendEvent(dpy, managerWin, 0, 0, c.addressof(ev))
+ XSync(dpy, 0)
+
+ self.setPixmap(icon)
+ self.setAlignment(Qt.AlignHCenter)
+
+ if parent:
+ QToolTip.add(self, parent.caption())
+
+
+
+ def locateTray(self, dpy):
+ # get systray window (holds _NET_SYSTEM_TRAY_S<screen> atom)
+ self.XScreenNumberOfScreen = self.libX11.XScreenNumberOfScreen
+ self.XScreenNumberOfScreen.argtypes = [c.c_void_p]
+
+ XDefaultScreenOfDisplay = self.libX11.XDefaultScreenOfDisplay
+ XDefaultScreenOfDisplay.argtypes = [c.c_void_p]
+ XDefaultScreenOfDisplay.restype = c.c_void_p
+
+ XGetSelectionOwner = self.libX11.XGetSelectionOwner
+ XGetSelectionOwner.argtypes = [c.c_void_p, c.c_int]
+
+ XGrabServer = self.libX11.XGrabServer
+ XGrabServer.argtypes = [c.c_void_p]
+
+ iscreen = self.XScreenNumberOfScreen(XDefaultScreenOfDisplay(dpy))
+ selectionAtom = self.XternAtom(dpy, "_NET_SYSTEM_TRAY_S%i" % iscreen, 0)
+ #XGrabServer(dpy)
+
+ managerWin = XGetSelectionOwner(dpy, selectionAtom)
+ return managerWin
+
+
+ def setTooltipText(self, text):
+ QToolTip.add(self, text)
+
+
+ def mousePressEvent(self, e):
+ if e.button() == Qt.RightButton:
+ self.emit(PYSIGNAL("contextMenuRequested(const QPoint&)"), (e.globalPos(),))
+
+ elif e.button() == Qt.LeftButton:
+ self.emit(PYSIGNAL("activated()"), ())
+
+
+ def supportsMessages(self):
+ return True
+
+
+ def showMessage(self, title, msg, icon, msecs):
+ if have_pynotify and pynotify.init("hplip"):
+ n = pynotify.Notification(title, msg, icon)
+ n.set_timeout(msecs)
+ s.show()
+ else:
+ g = self.mapToGlobal(QPoint(0, 0))
+ showBalloon(icon, msg, title, self,
+ QPoint(g.x() + self.width()/2, g.y() + self.height()/2), msecs)
+
+
+
+class TitleItem(QCustomMenuItem):
+ def __init__(self, icon, text):
+ QCustomMenuItem.__init__(self)
+ self.font = QFont()
+ self.font.setBold(True)
+ self.pen = QPen(Qt.black)
+ self.bg_color = qApp.palette().color(QPalette.Active, QColorGroup.Background)
+ self.icon = icon
+ self.text = text
+
+ def paint(self, painter, cg, act, enabled, x, y, w, h):
+ painter.setPen(self.pen)
+ painter.setFont(self.font)
+ painter.setBackgroundColor(self.bg_color)
+ painter.eraseRect(x, y, w, h)
+ painter.drawPixmap(2, 2, self.icon, 0, 0, -1, -1)
+ painter.drawText(x, y, w, h, Qt.AlignLeft | Qt.AlignVCenter | Qt.ShowPrefix | Qt.DontClip, self.text)
+
+ def sizeHint(self):
+ return QFontMetrics(self.font).size(Qt.AlignLeft | Qt.AlignVCenter | Qt.ShowPrefix | Qt.DontClip, self.text)
+
+
+
+class SystemTrayApp(QApplication):
+ def __init__(self, args, read_pipe):
+ QApplication.__init__(self, args)
+
+ self.read_pipe = read_pipe
+ self.fmt = "80s80sI32sI80sf"
+ self.fmt_size = struct.calcsize(self.fmt)
+
+ self.user_settings = utils.UserSettings()
+ self.user_settings.load()
+ self.user_settings.debug()
+
+ self.tray_icon = SystrayIcon(load_pixmap("hp_logo", "32x32", (22, 22)))
+ self.menu = QPopupMenu()
+
+ title_item = TitleItem(load_pixmap('hp_logo', '16x16', (16, 16)), "HP Status Service")
+ i = self.menu.insertItem(title_item)
+ self.menu.setItemEnabled(i, False)
+
+ self.menu.insertSeparator()
+
+ self.menu.insertItem(self.tr("HP Device Manager..."), self.toolbox_triggered)
+
+ # TODO:
+ #icon2 = QIconSet(load_pixmap('settings', '16x16'))
+ #self.menu.insertItem(icon2, self.tr("Options..."), self.preferences_triggered)
+
+ self.menu.insertSeparator()
+
+ icon3 = QIconSet(load_pixmap('quit', '16x16'))
+ self.menu.insertItem(icon3, self.tr("Quit"), self.quit_triggered)
+
+ self.tray_icon.show()
+
+ notifier = QSocketNotifier(self.read_pipe, QSocketNotifier.Read)
+ QObject.connect(notifier, SIGNAL("activated(int)"), self.notifier_activated)
+
+ QObject.connect(self.tray_icon, PYSIGNAL("contextMenuRequested(const QPoint&)"), self.menu_requested)
+
+ self.icon_info = load_pixmap('info', '16x16')
+ self.icon_warn = load_pixmap('warning', '16x16')
+ self.icon_error = load_pixmap('error', '16x16')
+
+ self.handle_hplip_updation()
+ self.timer = QTimer()
+ self.timer.connect(self.timer,SIGNAL("timeout()"),self.handle_hplip_updation)
+ self.timer.start(UPGRADE_CHECK_DELAY)
+
+ self.ERROR_STATE_TO_ICON = {
+ ERROR_STATE_CLEAR: self.icon_info,
+ ERROR_STATE_OK: self.icon_info,
+ ERROR_STATE_WARNING: self.icon_warn,
+ ERROR_STATE_ERROR: self.icon_error,
+ ERROR_STATE_LOW_SUPPLIES: self.icon_warn,
+ ERROR_STATE_BUSY: self.icon_warn,
+ ERROR_STATE_LOW_PAPER: self.icon_warn,
+ ERROR_STATE_PRINTING: self.icon_info,
+ ERROR_STATE_SCANNING: self.icon_info,
+ ERROR_STATE_PHOTOCARD: self.icon_info,
+ ERROR_STATE_FAXING: self.icon_info,
+ ERROR_STATE_COPYING: self.icon_info,
+ }
+
+
+ def menu_requested(self, pos):
+ self.menu.popup(pos)
+
+
+ def quit_triggered(self):
+ device.Event('', '', EVENT_SYSTEMTRAY_EXIT).send_via_dbus(SessionBus())
+ self.quit()
+
+
+ def toolbox_triggered(self):
+ try:
+ os.waitpid(-1, os.WNOHANG)
+ except OSError:
+ pass
+
+ # See if it is already running...
+ ok, lock_file = utils.lock_app('hp-toolbox', True)
+
+ if ok: # able to lock, not running...
+ utils.unlock(lock_file)
+
+ path = utils.which('hp-toolbox')
+ if path:
+ path = os.path.join(path, 'hp-toolbox')
+ else:
+ log.error("Unable to find hp-toolbox on PATH.")
+
+ self.tray_icon.showMessage("HPLIP Status Service",
+ self.__tr("Unable to locate hp-toolbox on system PATH."),
+ self.icon_error, 5000)
+
+ return
+
+ log.debug(path)
+ os.spawnlp(os.P_NOWAIT, path, 'hp-toolbox')
+
+ else: # ...already running, raise it
+ device.Event('', '', EVENT_RAISE_DEVICE_MANAGER).send_via_dbus(SessionBus(), 'com.hplip.Toolbox')
+
+
+ def preferences_triggered(self):
+ #print "\nPARENT: prefs!"
+ pass
+
+
+ def notifier_activated(self, s):
+ m = ''
+ while True:
+ ready = select.select([self.read_pipe], [], [], 1.0)
+
+ if ready[0]:
+ m = ''.join([m, os.read(self.read_pipe, self.fmt_size)])
+ if len(m) == self.fmt_size:
+ event = device.Event(*struct.unpack(self.fmt, m))
+
+ if event.event_code > EVENT_MAX_USER_EVENT:
+ continue
+
+ desc = device.queryString(event.event_code)
+ #print "BUBBLE:", event.device_uri, event.event_code, event.username
+ error_state = STATUS_TO_ERROR_STATE_MAP.get(event.event_code, ERROR_STATE_CLEAR)
+ icon = self.ERROR_STATE_TO_ICON.get(error_state, self.icon_info)
+
+ if self.tray_icon.supportsMessages():
+ if event.job_id and event.title:
+ self.tray_icon.showMessage("HPLIP Device Status",
+ QString("%1\n%2\n%3\n(%4/%5/%6)").\
+ arg(event.device_uri).arg(event.event_code).\
+ arg(desc).arg(event.username).arg(event.job_id).arg(event.title),
+ icon, 5000)
+ else:
+ self.tray_icon.showMessage("HPLIP Device Status",
+ QString("%1\n%2\n%3").arg(event.device_uri).\
+ arg(event.event_code).arg(desc),
+ icon, 5000)
+
+ else:
+ break
+
+ def handle_hplip_updation(self):
+ log.debug("handle_hplip_updation upgrade_notify =%d"%(self.user_settings.upgrade_notify))
+ path = utils.which('hp-upgrade')
+ if self.user_settings.upgrade_notify is False:
+ log.debug("upgrade notification is disabled in systray ")
+ if path:
+ path = os.path.join(path, 'hp-upgrade')
+ log.debug("Running hp-upgrade: %s " % (path))
+ # this just updates the available version in conf file. But won't notify
+ os.spawnlp(os.P_NOWAIT, path, 'hp-upgrade', '--check')
+ return
+
+
+ current_time = time.time()
+
+ if int(current_time) > self.user_settings.upgrade_pending_update_time:
+ path = utils.which('hp-upgrade')
+ if path:
+ path = os.path.join(path, 'hp-upgrade')
+ log.debug("Running hp-upgrade: %s " % (path))
+ os.spawnlp(os.P_NOWAIT, path, 'hp-upgrade', '--notify')
+
+ else:
+ log.error("Unable to find hp-upgrade --notify on PATH.")
+ else:
+ log.debug("upgrade schedule time is not yet completed. schedule time =%d current time =%d " %(self.user_settings.upgrade_pending_update_time, current_time))
+
+
+
+ def __tr(self,s,c = None):
+ return qApp.translate("SystemTrayApp",s,c)
+
+
+
+
+def run(read_pipe):
+ log.set_module("hp-systray(qt3)")
+
+ app = SystemTrayApp(sys.argv, read_pipe)
+
+ notifier = QSocketNotifier(read_pipe, QSocketNotifier.Read)
+ QObject.connect(notifier, SIGNAL("activated(int)"), app.notifier_activated)
+
+ try:
+ app.exec_loop()
+ except KeyboardInterrupt:
+ log.debug("Ctrl-C: Exiting...")
diff --git a/ui/ui_utils.py b/ui/ui_utils.py
new file mode 100644
index 0000000..7f7130e
--- /dev/null
+++ b/ui/ui_utils.py
@@ -0,0 +1,72 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2001-2007 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+# Thanks to Henrique M. Holschuh <hmh@debian.org> for various security patches
+#
+
+# Std Lib
+import os.path
+
+# Local
+from base.g import *
+from base import utils
+
+# Qt
+try:
+ from qt import *
+except ImportError:
+ log.error("Unable to load qt3. Is python-qt3 installed?")
+
+# TODO: Cache pixmaps
+
+def load_pixmap(name, subdir=None, resize_to=None): # Qt3 only
+ name = ''.join([os.path.splitext(name)[0], '.png'])
+
+ if subdir is None:
+ dir = prop.image_dir
+ ldir = os.path.join(os.getcwd(), 'data', 'images')
+ else:
+ dir = os.path.join(prop.image_dir, subdir)
+ ldir = os.path.join(os.getcwd(), 'data', 'images', subdir)
+
+ for d in [dir, ldir]:
+ f = os.path.join(d, name)
+
+ if os.path.exists(f):
+ if resize_to is not None:
+ img = QImage(f)
+ pm = QPixmap()
+ pm.convertFromImage(img.smoothScale(*resize_to), 0)
+ return pm
+ else:
+ return QPixmap(f)
+
+ for w in utils.walkFiles(dir, recurse=True, abs_paths=True, return_folders=False, pattern=name):
+ if resize_to is not None:
+ img = QImage(w)
+ pm = QPixmap()
+ pm.convertFromImage(img.smoothScale(*resize_to), 0)
+ return pm
+ else:
+ return QPixmap(w)
+
+ log.error("Pixmap '%s' not found!" % name)
+ return QPixmap()
+
diff --git a/ui/unloadform.py b/ui/unloadform.py
new file mode 100644
index 0000000..8b08002
--- /dev/null
+++ b/ui/unloadform.py
@@ -0,0 +1,147 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2001-2009 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+# Std Lib
+import os, os.path
+import operator
+
+# Local
+from base.g import *
+from base import utils, device
+from prnt import cups
+from ui_utils import load_pixmap
+
+# Qt
+from qt import *
+from scrollunload import ScrollUnloadView
+
+
+class UnloadForm(QMainWindow):
+ def __init__(self, bus=['usb', 'par'], device_uri=None, printer_name=None,
+ parent=None, name=None, fl=0):
+
+ QMainWindow.__init__(self,parent,name,fl)
+
+ self.pc = None
+ self.device_uri = device_uri
+ self.printer_name = printer_name
+ self.init_failed = False
+
+ self.setIcon(load_pixmap('hp_logo', '128x128'))
+
+ self.setCentralWidget(QWidget(self,"qt_central_widget"))
+ self.FormLayout = QGridLayout(self.centralWidget(),1,1,11,6,"FormLayout")
+
+ self.languageChange()
+
+ self.resize(QSize(600,480).expandedTo(self.minimumSizeHint()))
+ self.clearWState(Qt.WState_Polished)
+
+ if self.device_uri and self.printer_name:
+ log.error("You may not specify both a printer (-p) and a device (-d).")
+ self.device_uri, self.printer_name = None, None
+
+ if not self.device_uri and not self.printer_name:
+ probed_devices = device.probeDevices(bus=bus, filter={'pcard-type': (operator.eq, 1)})
+ cups_printers = cups.getPrinters()
+ log.debug(probed_devices)
+ log.debug(cups_printers)
+ max_deviceid_size, x, devices = 0, 0, {}
+
+ for d in probed_devices:
+ if d.startswith('hp:'):
+ printers = []
+ for p in cups_printers:
+ if p.device_uri == d:
+ printers.append(p.name)
+ devices[x] = (d, printers)
+ x += 1
+ max_deviceid_size = max(len(d), max_deviceid_size)
+
+ if x == 0:
+ from nodevicesform import NoDevicesForm
+ self.FailureUI(self.__tr("<p><b>No devices found that support photo card access.</b><p>Please make sure your device is properly installed and try again."))
+ self.init_failed = True
+
+ elif x == 1:
+ log.info(log.bold("Using device: %s" % devices[0][0]))
+ self.device_uri = devices[0][0]
+
+ else:
+ from choosedevicedlg import ChooseDeviceDlg
+ dlg = ChooseDeviceDlg(devices)
+ if dlg.exec_loop() == QDialog.Accepted:
+ self.device_uri = dlg.device_uri
+ else:
+ self.init_failed = True
+
+ self.dbus_avail, self.service, session_bus = device.init_dbus()
+
+ self.UnloadView = ScrollUnloadView(self.service,
+ self.centralWidget(), self, "UnloadView")
+
+ self.FormLayout.addWidget(self.UnloadView,0,0)
+
+
+ if not self.init_failed:
+ try:
+ self.cur_device = device.Device(device_uri=self.device_uri,
+ printer_name=self.printer_name)
+ except Error, e:
+ log.error("Invalid device URI or printer name.")
+ self.FailureUI("<b>Invalid device URI or printer name.</b><p>Please check the parameters to hp-print and try again.")
+ self.init_failed = True
+
+ else:
+ self.device_uri = self.cur_device.device_uri
+ user_conf.set('last_used', 'device_uri', self.device_uri)
+
+ log.debug(self.device_uri)
+
+ self.statusBar().message(self.device_uri)
+
+
+ QTimer.singleShot(0, self.initialUpdate)
+
+
+ def initialUpdate(self):
+ if self.init_failed:
+ self.close()
+ return
+
+ self.UnloadView.onDeviceChange(self.cur_device)
+
+ def FailureUI(self, error_text):
+ log.error(unicode(error_text).replace("<b>", "").replace("</b>", "").replace("<p>", " "))
+ QMessageBox.critical(self,
+ self.caption(),
+ error_text,
+ QMessageBox.Ok,
+ QMessageBox.NoButton,
+ QMessageBox.NoButton)
+
+
+ def languageChange(self):
+ self.setCaption(self.__tr("HP Device Manager - Unload Photo Card"))
+
+ def __tr(self,s,c = None):
+ return qApp.translate("UnloadForm",s,c)
+
diff --git a/ui/upgradeform.py b/ui/upgradeform.py
new file mode 100644
index 0000000..2b9814f
--- /dev/null
+++ b/ui/upgradeform.py
@@ -0,0 +1,136 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2001-2012 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch, Goutam Korra, Naga Samrat Chowdary Narla,
+
+# Std Lib
+import sys
+import re
+import os.path, os
+import time
+
+# Local
+from base.g import *
+from base import device, utils, models
+from ui_utils import load_pixmap
+
+# Qt
+from qt import *
+from upgradeform_base import UpgradeForm_base
+
+MANUAL_INSTALL_LINK = "http://hplipopensource.com/hplip-web/install/manual/index.html"
+
+class UpgradeForm(UpgradeForm_base):
+ def __init__(self, parent=None, name="",modal=0, fl=0,distro_type= 1,msg=""):
+ UpgradeForm_base.__init__(self, parent, name, modal, fl,distro_type, msg)
+
+ self.msg = msg
+ self.distro_type = distro_type
+ self.setIcon(load_pixmap('hp_logo', '128x128'))
+ self.initUi()
+
+ def initUi(self):
+ self.connect(self.NextButton,SIGNAL('clicked()'),self.NextButton_clicked)
+ self.connect(self.CancelButton, SIGNAL("clicked()"), self.CancelButton_clicked)
+
+# self.connect(self.installRadioBtton, SIGNAL("toggled(bool)"), self.installRadioBtton_toggled)
+# self.connect(self.remindRadioBtton, SIGNAL("toggled(bool)"), self.remindRadioBtton_toggled)
+# self.connect(self.dontRemindRadioBtton, SIGNAL("toggled(bool)"), self.dontRemindRadioBtton_toggled)
+
+
+ def installRadioBtton_toggled(self, radio_enabled):
+ log.info("+++++++ installRadioBtton_toggled = %d" %radio_enabled)
+ if radio_enabled is True:
+ self.installRadioBtton.setChecked(True)
+ else:
+ self.installRadioBtton.setChecked(False)
+
+
+ def remindRadioBtton_toggled(self, radio_enabled):
+ log.info("+++++++ remindRadioBtton_toggled = %d" %radio_enabled)
+ if radio_enabled is True:
+ self.remindRadioBtton.setChecked(True)
+ self.daysSpinBox.setEnabled(True)
+ else:
+ self.remindRadioBtton.setChecked(False)
+ self.daysSpinBox.setEnabled(False)
+
+
+ def dontRemindRadioBtton_toggled(self, radio_enabled):
+ log.info("+++++++ dontRemindRadioBtton_toggled = %d" %radio_enabled)
+ if radio_enabled is True:
+ self.dontRemindRadioBtton.setChecked(True)
+ else:
+ self.dontRemindRadioBtton.setChecked(False)
+
+
+ def NextButton_clicked (self):
+ if self.dontRemindRadioBtton.isChecked():
+ log.debug("HPLIP Upgrade, selected Don't remind again radiobutton")
+ user_conf.set('upgrade', 'notify_upgrade', 'false')
+ msg= "Check for HPLIP updates is disabled. To Upgrade again, check it in 'HP-toolbox' "
+ self.SuccessUI( self.__tr(msg))
+ elif self.remindRadioBtton.isChecked():
+ schedule_days = str(self.daysSpinBox.value())
+ log.debug("HPLIP Upgrade, selected remind later radiobutton days= %d" %(int(schedule_days)))
+ next_time = time.time() + (int(schedule_days) *24 * 60 *60)
+ user_conf.set('upgrade', 'pending_upgrade_time', str(int(next_time)))
+ else:
+ log.debug("HPLIP Upgrade, selected Install radiobutton distro_type=%d" %self.distro_type)
+ self.NextButton.setEnabled(False)
+ if self.distro_type != 1: # not tier 1 distro
+ utils.openURL(MANUAL_INSTALL_LINK)
+ else:
+ terminal_cmd = utils.get_terminal()
+ if terminal_cmd is not None and utils.which("hp-upgrade"):
+ cmd = terminal_cmd + " 'hp-upgrade '"
+ log.debug("cmd = %s " %cmd)
+ os.system(cmd)
+ self.result = True
+ else:
+ log.error("Failed to run hp-upgrade command from terminal =%s "%terminal_cmd)
+ self.FailureUI( self.__tr("Failed to run hp-upgrade"))
+
+ self.close()
+
+
+ def CancelButton_clicked(self):
+ log.debug("User exit")
+ self.close()
+
+
+ def FailureUI(self, error_text):
+ QMessageBox.critical(self,
+ self.caption(),
+ error_text,
+ QMessageBox.Ok,
+ QMessageBox.NoButton,
+ QMessageBox.NoButton)
+
+ def SuccessUI(self, text):
+ QMessageBox.information(self,
+ self.caption(),
+ text,
+ QMessageBox.Ok,
+ QMessageBox.NoButton,
+ QMessageBox.NoButton)
+
+
+ def __tr(self,s,c = None):
+ return qApp.translate("UpgradeDialog",s,c)
diff --git a/ui/upgradeform_base.py b/ui/upgradeform_base.py
new file mode 100644
index 0000000..803ba7b
--- /dev/null
+++ b/ui/upgradeform_base.py
@@ -0,0 +1,86 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'ui/upgradeform_base.ui'
+#
+# Created: Thu Feb 9 20:00:42 2012
+# by: The PyQt User Interface Compiler (pyuic) 3.18.1
+#
+# WARNING! All changes made in this file will be lost!
+
+
+from qt import *
+
+
+class UpgradeForm_base(QDialog):
+ def __init__(self,parent = None,name = "",modal = 0,fl = 0,distro_type =1 , msg="" ):
+ QDialog.__init__(self,parent,name,modal,fl)
+
+ if name == "":
+ self.setName("HPLIP_Upgrade")
+ self.msg=msg
+ self.distro_type = distro_type
+
+ self.textLabel1 = QLabel(self,"textLabel1")
+ self.textLabel1.setGeometry(QRect(10,10,310,50))
+
+
+ self.buttonGroup1 = QButtonGroup(self,"buttonGroup1")
+ self.buttonGroup1.setGeometry(QRect(10,60,300,110))
+
+ self.installRadioBtton = QRadioButton(self.buttonGroup1,"installRadioBtton")
+ self.installRadioBtton.setGeometry(QRect(10,20,250,20))
+ self.installRadioBtton.setChecked(True)
+
+
+ self.remindRadioBtton = QRadioButton(self.buttonGroup1,"remindRadioBtton")
+ self.remindRadioBtton.setGeometry(QRect(10,50,130,20))
+
+
+ self.daysSpinBox = QSpinBox(self.buttonGroup1,"daysSpinBox")
+ self.daysSpinBox.setGeometry(QRect(139,50,50,20))
+ self.daysSpinBox.setMinValue(1)
+ self.daysSpinBox.setMaxValue(365)
+# self.daysSpinBox.setEnabled(False)
+
+
+ self.daysLabel = QLabel(self.buttonGroup1,"daysLabel")
+
+ self.daysLabel.setGeometry(QRect(200,50,68,20))
+
+
+ self.dontRemindRadioBtton = QRadioButton(self.buttonGroup1,"dontRemindRadioBtton")
+ self.dontRemindRadioBtton.setGeometry(QRect(10,80,160,20))
+
+
+ self.NextButton = QPushButton(self,"NextButton")
+ self.NextButton.setGeometry(QRect(140,190,90,25))
+
+ self.CancelButton = QPushButton(self,"CancelButton")
+ self.CancelButton.setGeometry(QRect(240,190,80,25))
+
+ self.languageChange()
+ self.resize(QSize(328,225).expandedTo(self.minimumSizeHint()))
+ self.clearWState(Qt.WState_Polished)
+
+ self.connect(self.daysSpinBox,SIGNAL("valueChanged(int)"),self.daysSpinBox_change)
+
+ def daysSpinBox_change(self):
+ self.remindRadioBtton.setChecked(True)
+
+ def languageChange(self):
+ self.setCaption(self.__tr("HPLIP Upgrade Manager"))
+ self.textLabel1.setText(self.__tr(self.msg))
+ if self.distro_type == 1:
+ self.installRadioBtton.setText(self.__tr("Download and Install"))
+ else:
+ self.installRadioBtton.setText(self.__tr("Follow steps from www.hplip.net"))
+ self.remindRadioBtton.setText(self.__tr("Remind me after"))
+ self.daysLabel.setText(self.__tr("days"))
+ self.dontRemindRadioBtton.setText(self.__tr("Don't remind again"))
+ self.NextButton.setText(self.__tr("Ok"))
+ self.CancelButton.setText(self.__tr("Cancel"))
+
+
+
+ def __tr(self,s,c = None):
+ return qApp.translate("Form1",s,c)
diff --git a/ui/waitform.py b/ui/waitform.py
new file mode 100644
index 0000000..95e07f0
--- /dev/null
+++ b/ui/waitform.py
@@ -0,0 +1,64 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2007 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+import sys
+from qt import *
+from waitform_base import WaitForm_base
+
+class WaitForm(WaitForm_base):
+ def __init__(self, seconds, message=None, cancel_func=None, parent=None, name=None, modal=0, fl=0):
+ WaitForm_base.__init__(self,parent,name,modal,fl)
+
+ self.wait_timer = QTimer(self, "WaitTimer")
+ self.connect(self.wait_timer, SIGNAL('timeout()'), self.wait_timer_timeout)
+ self.seconds = seconds
+ self.progress = 0
+ self.ProgressBar.setTotalSteps(seconds)
+
+ if seconds == 0:
+ self.wait_timer.start(10)
+ else:
+ self.wait_timer.start(seconds*1000)
+
+ if message is not None:
+ self.setMessage(message)
+
+ self.cancelPushButton.setEnabled(cancel_func is not None)
+ self.cancel_func = cancel_func
+ self.canceled = False
+
+ def wait_timer_timeout(self):
+ self.progress += 1
+ self.ProgressBar.setProgress(self.progress)
+
+ if self.progress == self.seconds:
+ self.wait_timer.stop()
+ self.close()
+
+ def setMessage(self, message):
+ self.textLabel3.setText(message)
+ qApp.processEvents()
+
+ def cancelPushButton_clicked(self):
+ self.canceled = True
+ if self.cancel_func is not None:
+ self.cancel_func()
+ self.cancelPushButton.setEnabled(False)
diff --git a/ui/waitform_base.py b/ui/waitform_base.py
new file mode 100644
index 0000000..46922cf
--- /dev/null
+++ b/ui/waitform_base.py
@@ -0,0 +1,63 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'waitform_base.ui'
+#
+# Created: Wed Oct 26 13:21:40 2005
+# by: The PyQt User Interface Compiler (pyuic) 3.14.1
+#
+# WARNING! All changes made in this file will be lost!
+
+
+from qt import *
+
+
+class WaitForm_base(QDialog):
+ def __init__(self,parent = None,name = None,modal = 0,fl = 0):
+ QDialog.__init__(self,parent,name,modal,fl)
+
+ if not name:
+ self.setName("WaitForm_base")
+
+
+ WaitForm_baseLayout = QGridLayout(self,1,1,11,6,"WaitForm_baseLayout")
+
+ layout2 = QVBoxLayout(None,0,6,"layout2")
+
+ self.textLabel3 = QLabel(self,"textLabel3")
+ layout2.addWidget(self.textLabel3)
+
+ self.ProgressBar = QProgressBar(self,"ProgressBar")
+ layout2.addWidget(self.ProgressBar)
+
+ WaitForm_baseLayout.addMultiCellLayout(layout2,0,0,0,2)
+ spacer10 = QSpacerItem(20,30,QSizePolicy.Minimum,QSizePolicy.Expanding)
+ WaitForm_baseLayout.addItem(spacer10,1,1)
+
+ self.cancelPushButton = QPushButton(self,"cancelPushButton")
+ self.cancelPushButton.setEnabled(0)
+
+ WaitForm_baseLayout.addWidget(self.cancelPushButton,2,1)
+ spacer2 = QSpacerItem(121,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ WaitForm_baseLayout.addItem(spacer2,2,2)
+ spacer3 = QSpacerItem(131,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ WaitForm_baseLayout.addItem(spacer3,2,0)
+
+ self.languageChange()
+
+ self.resize(QSize(424,115).expandedTo(self.minimumSizeHint()))
+ self.clearWState(Qt.WState_Polished)
+
+ self.connect(self.cancelPushButton,SIGNAL("clicked()"),self.cancelPushButton_clicked)
+
+
+ def languageChange(self):
+ self.setCaption(self.__tr("HP Device Manager - Waiting"))
+ self.textLabel3.setText(self.__tr("<b>Waiting for procedure to finish...</b>"))
+ self.cancelPushButton.setText(self.__tr("Cancel"))
+
+
+ def cancelPushButton_clicked(self):
+ print "WaitForm_base.cancelPushButton_clicked(): Not implemented yet"
+
+ def __tr(self,s,c = None):
+ return qApp.translate("WaitForm_base",s,c)
diff --git a/ui/waitform_base.ui b/ui/waitform_base.ui
new file mode 100644
index 0000000..e4612bc
--- /dev/null
+++ b/ui/waitform_base.ui
@@ -0,0 +1,124 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>WaitForm_base</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>WaitForm_base</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>424</width>
+ <height>115</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>HP Device Manager - Waiting</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget" row="0" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>layout2</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel3</cstring>
+ </property>
+ <property name="text">
+ <string>&lt;b&gt;Waiting for procedure to finish...&lt;/b&gt;</string>
+ </property>
+ </widget>
+ <widget class="QProgressBar">
+ <property name="name">
+ <cstring>ProgressBar</cstring>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <spacer row="1" column="1">
+ <property name="name">
+ <cstring>spacer10</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>30</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton" row="2" column="1">
+ <property name="name">
+ <cstring>cancelPushButton</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Cancel</string>
+ </property>
+ </widget>
+ <spacer row="2" column="2">
+ <property name="name">
+ <cstring>spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>121</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <spacer row="2" column="0">
+ <property name="name">
+ <cstring>spacer3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>131</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>cancelPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>WaitForm_base</receiver>
+ <slot>cancelPushButton_clicked()</slot>
+ </connection>
+</connections>
+<includes>
+ <include location="local" impldecl="in implementation">waitform_base.ui.h</include>
+</includes>
+<slots>
+ <slot>cancelPushButton_clicked()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/ui4/__init__.py b/ui4/__init__.py
new file mode 100644
index 0000000..ffdcaff
--- /dev/null
+++ b/ui4/__init__.py
@@ -0,0 +1,19 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2007 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+
diff --git a/ui4/aboutdialog.py b/ui4/aboutdialog.py
new file mode 100644
index 0000000..a613e27
--- /dev/null
+++ b/ui4/aboutdialog.py
@@ -0,0 +1,58 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2001-2008 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Authors: Don Welch
+#
+
+
+# Local
+from base.g import *
+#from base import device, utils
+from ui_utils import *
+
+# Qt
+from PyQt4.QtCore import *
+from PyQt4.QtGui import *
+
+# Ui
+from aboutdialog_base import Ui_AboutDlg_base
+
+
+class AboutDialog(QDialog, Ui_AboutDlg_base):
+ def __init__(self, parent, hplip_version, toolbox_version):
+ QDialog.__init__(self, parent)
+ self.setupUi(self)
+ self.initUi(hplip_version, toolbox_version)
+
+
+ def initUi(self, hplip_version, toolbox_version):
+ self.connect(self.CloseButton, SIGNAL("clicked()"), self.CloseButton_clicked)
+
+ self.HPLIPVersionText.setText(hplip_version)
+ self.ToolboxVersionText.setText(toolbox_version)
+ self.PythonPixmap.setPixmap(load_pixmap('powered_by_python.png'))
+ self.OsiPixmap.setPixmap(load_pixmap('opensource-75x65.png'))
+ self.HPLIPLogo.setPixmap(load_pixmap('hp-tux-printer.png'))
+
+
+
+ def CloseButton_clicked(self):
+ self.close()
+
+
+
diff --git a/ui4/aboutdialog_base.py b/ui4/aboutdialog_base.py
new file mode 100644
index 0000000..ad1f6ba
--- /dev/null
+++ b/ui4/aboutdialog_base.py
@@ -0,0 +1,119 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'ui4/aboutdialog_base.ui'
+#
+# Created: Mon May 4 14:30:30 2009
+# by: PyQt4 UI code generator 4.4.4
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt4 import QtCore, QtGui
+
+class Ui_AboutDlg_base(object):
+ def setupUi(self, AboutDlg_base):
+ AboutDlg_base.setObjectName("AboutDlg_base")
+ AboutDlg_base.resize(537, 543)
+ self.gridlayout = QtGui.QGridLayout(AboutDlg_base)
+ self.gridlayout.setObjectName("gridlayout")
+ self.textLabel1 = QtGui.QLabel(AboutDlg_base)
+ self.textLabel1.setWordWrap(False)
+ self.textLabel1.setObjectName("textLabel1")
+ self.gridlayout.addWidget(self.textLabel1, 0, 0, 1, 2)
+ self.hboxlayout = QtGui.QHBoxLayout()
+ self.hboxlayout.setObjectName("hboxlayout")
+ spacerItem = QtGui.QSpacerItem(150, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+ self.hboxlayout.addItem(spacerItem)
+ self.HPLIPLogo = QtGui.QLabel(AboutDlg_base)
+ sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.HPLIPLogo.sizePolicy().hasHeightForWidth())
+ self.HPLIPLogo.setSizePolicy(sizePolicy)
+ self.HPLIPLogo.setMinimumSize(QtCore.QSize(100, 110))
+ self.HPLIPLogo.setMaximumSize(QtCore.QSize(100, 110))
+ self.HPLIPLogo.setScaledContents(True)
+ self.HPLIPLogo.setWordWrap(False)
+ self.HPLIPLogo.setObjectName("HPLIPLogo")
+ self.hboxlayout.addWidget(self.HPLIPLogo)
+ spacerItem1 = QtGui.QSpacerItem(151, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+ self.hboxlayout.addItem(spacerItem1)
+ self.gridlayout.addLayout(self.hboxlayout, 1, 0, 1, 2)
+ self.hboxlayout1 = QtGui.QHBoxLayout()
+ self.hboxlayout1.setObjectName("hboxlayout1")
+ self.textLabel4 = QtGui.QLabel(AboutDlg_base)
+ self.textLabel4.setWordWrap(False)
+ self.textLabel4.setObjectName("textLabel4")
+ self.hboxlayout1.addWidget(self.textLabel4)
+ self.HPLIPVersionText = QtGui.QLabel(AboutDlg_base)
+ self.HPLIPVersionText.setWordWrap(False)
+ self.HPLIPVersionText.setObjectName("HPLIPVersionText")
+ self.hboxlayout1.addWidget(self.HPLIPVersionText)
+ self.gridlayout.addLayout(self.hboxlayout1, 2, 0, 1, 2)
+ self.hboxlayout2 = QtGui.QHBoxLayout()
+ self.hboxlayout2.setObjectName("hboxlayout2")
+ self.textLabel4_2 = QtGui.QLabel(AboutDlg_base)
+ self.textLabel4_2.setWordWrap(False)
+ self.textLabel4_2.setObjectName("textLabel4_2")
+ self.hboxlayout2.addWidget(self.textLabel4_2)
+ self.ToolboxVersionText = QtGui.QLabel(AboutDlg_base)
+ self.ToolboxVersionText.setWordWrap(False)
+ self.ToolboxVersionText.setObjectName("ToolboxVersionText")
+ self.hboxlayout2.addWidget(self.ToolboxVersionText)
+ self.gridlayout.addLayout(self.hboxlayout2, 3, 0, 1, 2)
+ self.textLabel3 = QtGui.QLabel(AboutDlg_base)
+ self.textLabel3.setWordWrap(True)
+ self.textLabel3.setObjectName("textLabel3")
+ self.gridlayout.addWidget(self.textLabel3, 4, 0, 1, 2)
+ self.textLabel2 = QtGui.QLabel(AboutDlg_base)
+ self.textLabel2.setWordWrap(True)
+ self.textLabel2.setObjectName("textLabel2")
+ self.gridlayout.addWidget(self.textLabel2, 5, 0, 1, 2)
+ self.hboxlayout3 = QtGui.QHBoxLayout()
+ self.hboxlayout3.setObjectName("hboxlayout3")
+ self.PythonPixmap = QtGui.QLabel(AboutDlg_base)
+ self.PythonPixmap.setMinimumSize(QtCore.QSize(200, 62))
+ self.PythonPixmap.setMaximumSize(QtCore.QSize(200, 62))
+ self.PythonPixmap.setScaledContents(True)
+ self.PythonPixmap.setWordWrap(False)
+ self.PythonPixmap.setObjectName("PythonPixmap")
+ self.hboxlayout3.addWidget(self.PythonPixmap)
+ self.OsiPixmap = QtGui.QLabel(AboutDlg_base)
+ self.OsiPixmap.setMinimumSize(QtCore.QSize(75, 65))
+ self.OsiPixmap.setMaximumSize(QtCore.QSize(75, 65))
+ self.OsiPixmap.setScaledContents(True)
+ self.OsiPixmap.setWordWrap(False)
+ self.OsiPixmap.setObjectName("OsiPixmap")
+ self.hboxlayout3.addWidget(self.OsiPixmap)
+ self.gridlayout.addLayout(self.hboxlayout3, 6, 0, 1, 2)
+ spacerItem2 = QtGui.QSpacerItem(20, 20, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ self.gridlayout.addItem(spacerItem2, 7, 0, 1, 2)
+ spacerItem3 = QtGui.QSpacerItem(411, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+ self.gridlayout.addItem(spacerItem3, 8, 0, 1, 1)
+ self.CloseButton = QtGui.QPushButton(AboutDlg_base)
+ self.CloseButton.setObjectName("CloseButton")
+ self.gridlayout.addWidget(self.CloseButton, 8, 1, 1, 1)
+
+ self.retranslateUi(AboutDlg_base)
+ QtCore.QObject.connect(self.CloseButton, QtCore.SIGNAL("clicked()"), AboutDlg_base.close)
+ QtCore.QMetaObject.connectSlotsByName(AboutDlg_base)
+
+ def retranslateUi(self, AboutDlg_base):
+ AboutDlg_base.setWindowTitle(QtGui.QApplication.translate("AboutDlg_base", "HP Device Manager - About", None, QtGui.QApplication.UnicodeUTF8))
+ self.textLabel1.setText(QtGui.QApplication.translate("AboutDlg_base", "<font size=\"+3\"><p align=\"center\">HP Linux Imaging and Printing (HPLIP)</p></font>", None, QtGui.QApplication.UnicodeUTF8))
+ self.textLabel4.setText(QtGui.QApplication.translate("AboutDlg_base", "<b>HPLIP Software Version:</b>", None, QtGui.QApplication.UnicodeUTF8))
+ self.HPLIPVersionText.setText(QtGui.QApplication.translate("AboutDlg_base", "0.0.0", None, QtGui.QApplication.UnicodeUTF8))
+ self.textLabel4_2.setText(QtGui.QApplication.translate("AboutDlg_base", "<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
+"p, li { white-space: pre-wrap; }\n"
+"</style></head><body style=\" font-family:\'DejaVu Sans\'; font-size:10pt; font-weight:400; font-style:normal;\">\n"
+"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-weight:600;\">Device Manager Version:</span></p></body></html>", None, QtGui.QApplication.UnicodeUTF8))
+ self.ToolboxVersionText.setText(QtGui.QApplication.translate("AboutDlg_base", "0.0.0", None, QtGui.QApplication.UnicodeUTF8))
+ self.textLabel3.setText(QtGui.QApplication.translate("AboutDlg_base", "<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
+"p, li { white-space: pre-wrap; }\n"
+"</style></head><body style=\" font-family:\'DejaVu Sans\'; font-size:10pt; font-weight:400; font-style:normal;\">\n"
+"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-weight:600;\">License and Copyright:</span> (c) Copyright 2009 Hewlett-Packard Development Company, L.P. This software is licensed under the GNU General Public License (GPL), BSD, and MIT licenses. See the software sources for details.</p></body></html>", None, QtGui.QApplication.UnicodeUTF8))
+ self.textLabel2.setText(QtGui.QApplication.translate("AboutDlg_base", "<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
+"p, li { white-space: pre-wrap; }\n"
+"</style></head><body style=\" font-family:\'DejaVu Sans\'; font-size:10pt; font-weight:400; font-style:normal;\">\n"
+"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-weight:600;\">Authors and Contributors:</span> David Suffield, Don Welch, Shiyun Yie, Raghothama Cauligi, John Oleinik, Cory Meisch, Foster Nuffer, Pete Parks, Jacqueline Pitter, David Paschal, Steve DeRoos, Mark Overton, Aaron Albright, Smith Kennedy, John Hosszu, Chris Wiesner, Henrique M. Holschuh, Till Kamppeter, Linus Araque, Mark Crawford, Charlie Moore, Jason Callough, Stan Dolson, Don Mackliet, Paul Leclerc, Naga Samrat Choudary, Suma Byrappa, Yashwant Sahu, Sanjay Kumar, Sarbeswar Meher, Goutam Kodu, Gaurav Sood, Srikant Lokare, Parul Singh, Raghavendra Chitpadi</p></body></html>", None, QtGui.QApplication.UnicodeUTF8))
+ self.CloseButton.setText(QtGui.QApplication.translate("AboutDlg_base", "Close", None, QtGui.QApplication.UnicodeUTF8))
+
diff --git a/ui4/aboutdialog_base.ui b/ui4/aboutdialog_base.ui
new file mode 100644
index 0000000..61350cf
--- /dev/null
+++ b/ui4/aboutdialog_base.ui
@@ -0,0 +1,274 @@
+<ui version="4.0" >
+ <class>AboutDlg_base</class>
+ <widget class="QDialog" name="AboutDlg_base" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>537</width>
+ <height>543</height>
+ </rect>
+ </property>
+ <property name="windowTitle" >
+ <string>HP Device Manager - About</string>
+ </property>
+ <layout class="QGridLayout" >
+ <item row="0" column="0" colspan="2" >
+ <widget class="QLabel" name="textLabel1" >
+ <property name="text" >
+ <string>&lt;font size="+3">&lt;p align="center">HP Linux Imaging and Printing (HPLIP)&lt;/p>&lt;/font></string>
+ </property>
+ <property name="wordWrap" >
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" colspan="2" >
+ <layout class="QHBoxLayout" >
+ <item>
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType" >
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>150</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QLabel" name="HPLIPLogo" >
+ <property name="sizePolicy" >
+ <sizepolicy vsizetype="Fixed" hsizetype="Fixed" >
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize" >
+ <size>
+ <width>100</width>
+ <height>110</height>
+ </size>
+ </property>
+ <property name="maximumSize" >
+ <size>
+ <width>100</width>
+ <height>110</height>
+ </size>
+ </property>
+ <property name="scaledContents" >
+ <bool>true</bool>
+ </property>
+ <property name="wordWrap" >
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType" >
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>151</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ <item row="2" column="0" colspan="2" >
+ <layout class="QHBoxLayout" >
+ <item>
+ <widget class="QLabel" name="textLabel4" >
+ <property name="text" >
+ <string>&lt;b>HPLIP Software Version:&lt;/b></string>
+ </property>
+ <property name="wordWrap" >
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="HPLIPVersionText" >
+ <property name="text" >
+ <string>0.0.0</string>
+ </property>
+ <property name="wordWrap" >
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="3" column="0" colspan="2" >
+ <layout class="QHBoxLayout" >
+ <item>
+ <widget class="QLabel" name="textLabel4_2" >
+ <property name="text" >
+ <string>&lt;html>&lt;head>&lt;meta name="qrichtext" content="1" />&lt;style type="text/css">
+p, li { white-space: pre-wrap; }
+&lt;/style>&lt;/head>&lt;body style=" font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;">
+&lt;p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">&lt;span style=" font-weight:600;">Device Manager Version:&lt;/span>&lt;/p>&lt;/body>&lt;/html></string>
+ </property>
+ <property name="wordWrap" >
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="ToolboxVersionText" >
+ <property name="text" >
+ <string>0.0.0</string>
+ </property>
+ <property name="wordWrap" >
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="4" column="0" colspan="2" >
+ <widget class="QLabel" name="textLabel3" >
+ <property name="text" >
+ <string>&lt;html>&lt;head>&lt;meta name="qrichtext" content="1" />&lt;style type="text/css">
+p, li { white-space: pre-wrap; }
+&lt;/style>&lt;/head>&lt;body style=" font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;">
+&lt;p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">&lt;span style=" font-weight:600;">License and Copyright:&lt;/span> (c) Copyright 2009 Hewlett-Packard Development Company, L.P. This software is licensed under the GNU General Public License (GPL), BSD, and MIT licenses. See the software sources for details.&lt;/p>&lt;/body>&lt;/html></string>
+ </property>
+ <property name="wordWrap" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="0" colspan="2" >
+ <widget class="QLabel" name="textLabel2" >
+ <property name="text" >
+ <string>&lt;html>&lt;head>&lt;meta name="qrichtext" content="1" />&lt;style type="text/css">
+p, li { white-space: pre-wrap; }
+&lt;/style>&lt;/head>&lt;body style=" font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;">
+&lt;p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">&lt;span style=" font-weight:600;">Authors and Contributors:&lt;/span> David Suffield, Don Welch, Shiyun Yie, Raghothama Cauligi, John Oleinik, Cory Meisch, Foster Nuffer, Pete Parks, Jacqueline Pitter, David Paschal, Steve DeRoos, Mark Overton, Aaron Albright, Smith Kennedy, John Hosszu, Chris Wiesner, Henrique M. Holschuh, Till Kamppeter, Linus Araque, Mark Crawford, Charlie Moore, Jason Callough, Stan Dolson, Don Mackliet, Paul Leclerc, Naga Samrat Choudary, Suma Byrappa, Yashwant Sahu, Sanjay Kumar, Sarbeswar Meher, Goutam Kodu, Gaurav Sood, Srikant Lokare, Parul Singh, Raghavendra Chitpadi&lt;/p>&lt;/body>&lt;/html></string>
+ </property>
+ <property name="wordWrap" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="6" column="0" colspan="2" >
+ <layout class="QHBoxLayout" >
+ <item>
+ <widget class="QLabel" name="PythonPixmap" >
+ <property name="minimumSize" >
+ <size>
+ <width>200</width>
+ <height>62</height>
+ </size>
+ </property>
+ <property name="maximumSize" >
+ <size>
+ <width>200</width>
+ <height>62</height>
+ </size>
+ </property>
+ <property name="scaledContents" >
+ <bool>true</bool>
+ </property>
+ <property name="wordWrap" >
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="OsiPixmap" >
+ <property name="minimumSize" >
+ <size>
+ <width>75</width>
+ <height>65</height>
+ </size>
+ </property>
+ <property name="maximumSize" >
+ <size>
+ <width>75</width>
+ <height>65</height>
+ </size>
+ </property>
+ <property name="scaledContents" >
+ <bool>true</bool>
+ </property>
+ <property name="wordWrap" >
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="7" column="0" colspan="2" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeType" >
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="8" column="0" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>411</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="8" column="1" >
+ <widget class="QPushButton" name="CloseButton" >
+ <property name="text" >
+ <string>Close</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <layoutdefault spacing="6" margin="11" />
+ <pixmapfunction>qPixmapFromMimeSource</pixmapfunction>
+ <resources/>
+ <connections>
+ <connection>
+ <sender>CloseButton</sender>
+ <signal>clicked()</signal>
+ <receiver>AboutDlg_base</receiver>
+ <slot>close()</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>20</x>
+ <y>20</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>20</x>
+ <y>20</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>
diff --git a/ui4/aligndialog.py b/ui4/aligndialog.py
new file mode 100644
index 0000000..75be5f6
--- /dev/null
+++ b/ui4/aligndialog.py
@@ -0,0 +1,768 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2001-2008 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Authors: Don Welch, Naga Samrat Chowdary Narla,
+#
+
+# StdLib
+import operator
+
+# Local
+from base.g import *
+from base import device, utils, maint, status
+#from prnt import cups
+from base.codes import *
+from ui_utils import *
+
+# Qt
+from PyQt4.QtCore import *
+from PyQt4.QtGui import *
+
+# Ui
+from aligndialog_base import Ui_Dialog
+
+PAGE_START = 0
+PAGE_LOAD_PAPER = 1
+PAGE_EDGE = 2
+PAGE_ALIGNMENT_NUMBER = 3
+PAGE_COLOR_ADJ = 4 # types 4, 5 & 7
+PAGE_LBOW = 5 # types 10 & 11
+PAGE_AIO = 6 # Place on scanner, ...
+PAGE_FRONT_PANEL = 7 # Use front panel menu
+
+BUTTON_ALIGN = 0
+BUTTON_NEXT = 1
+BUTTON_FINISH = 2
+
+ALIGN_TYPE_INITIAL = 1000
+ALIGN_TYPE_TEST = 1001
+
+# xBow offset types
+ALIGN_TYPE_XBOW_OFFSET = 100
+ALIGN_TYPE_XBOW_BLACK_ONLY = ALIGN_TYPE_XBOW_OFFSET + AGENT_CONFIG_BLACK_ONLY
+ALIGN_TYPE_XBOW_PHOTO_ONLY = ALIGN_TYPE_XBOW_OFFSET + AGENT_CONFIG_PHOTO_ONLY
+ALIGN_TYPE_XBOW_COLOR_ONLY = ALIGN_TYPE_XBOW_OFFSET + AGENT_CONFIG_COLOR_ONLY
+ALIGN_TYPE_XBOW_COLOR_AND_BLACK = ALIGN_TYPE_XBOW_OFFSET + AGENT_CONFIG_COLOR_AND_BLACK
+ALIGN_TYPE_XBOW_COLOR_AND_PHOTO = ALIGN_TYPE_XBOW_OFFSET + AGENT_CONFIG_COLOR_AND_PHOTO
+
+
+def true():
+ return True
+
+
+class AlignDialog(QDialog, Ui_Dialog):
+ def __init__(self, parent, device_uri):
+ QDialog.__init__(self, parent)
+ self.device_uri = device_uri
+ self.mq = {}
+ self.step_max = 0
+ self.align_type = ALIGN_TYPE_INITIAL
+ self.step = 1
+ self.a, self.b, self.c, self.d, self.zca = 0, 0, 0, 0, 0
+ self.e, self.f, self.g = 0, 0, 0
+ self.num_inks = 0 # type 8
+ self.pattern = 0 # type 10
+ self.values = [] # type 10
+ self.abort = False
+ self.seq_index = 0
+
+ self.max_steps = {
+ ALIGN_TYPE_UNSUPPORTED : 1,
+ ALIGN_TYPE_AUTO : 2,
+ ALIGN_TYPE_9XX : 7,
+ ALIGN_TYPE_8XX : 7,
+ ALIGN_TYPE_LIDIL_0_3_8 : 0,
+ ALIGN_TYPE_LIDIL_0_4_3 : 0,
+ ALIGN_TYPE_LIDIL_AIO : 3,
+ ALIGN_TYPE_LIDIL_VIP : 0,
+ ALIGN_TYPE_DESKJET_450 : 0,
+ ALIGN_TYPE_9XX_NO_EDGE_ALIGN : 6,
+ ALIGN_TYPE_LBOW : 0,
+ ALIGN_TYPE_LIDIL_0_5_4 : 0,
+ ALIGN_TYPE_OJ_PRO : 0,
+ ALIGN_TYPE_TEST : 0,
+ ALIGN_TYPE_AIO : 3,
+ ALIGN_TYPE_LIDIL_DJ_D1600: 0,
+ ALIGN_TYPE_LEDM: 0,
+ ALIGN_TYPE_LEDM_MANUAL: 0,
+ ALIGN_TYPE_LEDM_FF_CC_0: 0,
+ }
+
+ self.seq = { # (func|method, tuple of params|None)
+ ALIGN_TYPE_TEST : [ # testing only
+ (self.showColorAdjustPage, ('F', 21)),
+ (self.endColorAdjustPage, ('F',)),
+ (self.showColorAdjustPage, ('G', 11)),
+ (self.endColorAdjustPage, ('G',)),
+ (self.close, None),
+ ],
+
+ ALIGN_TYPE_INITIAL : [ # (used when starting up and align-type isn't known)
+ (self.showStartPage, None),
+ (self.endStartPage, None), # switch to a valid align-type here
+ ],
+
+ ALIGN_TYPE_UNSUPPORTED : [ # -1
+ (self.showFrontPanelPage, None),
+ (self.endFronPanelPage, None),
+ (self.close, None),
+ ],
+
+# ALIGN_TYPE_NONE : [ # 0
+# (self.close, None)
+# ],
+
+ ALIGN_TYPE_AUTO : [ # 1
+ (self.showLoadPaperPage, None),
+ (maint.AlignType1PML, (lambda : self.dev, lambda: true)),
+ (self.closeAll, None),
+ (self.close, None),
+ ],
+
+ ALIGN_TYPE_8XX : [ # 2
+ (self.checkType2PenConfig, None),
+ (self.showLoadPaperPage, None),
+ (maint.alignType2Phase1, (lambda: self.dev,)),
+ (self.showAlignmentNumberPage, ('A', 'h', 'kc', 2, 11)),
+ (self.endAlignmentNumberPage, ('A',)),
+ (self.showAlignmentNumberPage, ('B', 'v', 'kc', 2, 11)),
+ (self.endAlignmentNumberPage, ('B',)),
+ (self.showAlignmentNumberPage, ('C', 'v', 'kc', 2, 5)),
+ (self.endAlignmentNumberPage, ('C',)),
+ (self.showAlignmentNumberPage, ('D', 'v', 'c', 2, 5)),
+ (self.endAlignmentNumberPage, ('D',)),
+ (self.setAlignButton, (BUTTON_ALIGN,)),
+ (self.showLoadPaperPage, (lambda: True,)),
+ (maint.alignType2Phase2, (lambda: self.dev, lambda: self.a, lambda: self.b,
+ lambda: self.c, lambda: self.d)),
+ (self.close, None),
+ ],
+
+ ALIGN_TYPE_9XX : [ # 3
+ (self.showLoadPaperPage, None),
+ (self.showAlignmentNumberPage, ('A', 'h', 'kc', 2, 11)),
+ (self.endAlignmentNumberPage, ('A',)),
+ (self.showAlignmentNumberPage, ('B', 'v', 'kc', 2, 11)),
+ (self.endAlignmentNumberPage, ('B',)),
+ (self.showAlignmentNumberPage, ('C', 'v', 'k', 2, 11)),
+ (self.endAlignmentNumberPage, ('C',)),
+ (self.setAlignButton, (BUTTON_ALIGN,)),
+ (self.showAlignmentNumberPage, ('D', 'v', 'kc', 2, 11)),
+ (self.endAlignmentNumberPage, ('D',)),
+ (maint.alignType3Phase2, (lambda: self.dev, lambda: self.a, lambda: self.b,
+ lambda: self.c, lambda: self.d)),
+ (maint.alignType3Phase3, (lambda: self.dev,)),
+ (self.showPageEdgePage, None),
+ (self.endPageEdgePage, None),
+ (maint.alignType3Phase4, (lambda: self.dev, lambda: self.zca)),
+ (self.close, None),
+ ],
+
+ ALIGN_TYPE_LIDIL_0_3_8 : [ # 4
+ (self.showLoadPaperPage, None),
+ (self.setPenConfig, None),
+ (maint.alignType4Phase1, (lambda: self.dev,)),
+ (self.setXBow, None),
+ # switches to offset align_type here
+ ],
+
+ ALIGN_TYPE_LIDIL_0_4_3 : [ # 5
+ (self.showLoadPaperPage, None),
+ (self.setPenConfig, None),
+ (maint.alignType5Phase1, (lambda: self.dev,)),
+ (self.showPageEdgePage, ('A',)),
+ (self.endPageEdgePage, None),
+ (self.setXBow, None),
+ # switches to offset align_type here
+ ],
+
+ ALIGN_TYPE_LIDIL_VIP : [ # 7
+ (self.showLoadPaperPage, None),
+ (self.setPenConfig, None),
+ (maint.alignType7Phase1, (lambda: self.dev,)),
+ (self.showPageEdgePage, ('A',)),
+ (self.endPageEdgePage, None),
+ (self.setXBow, None),
+ # switches to offset align_type here (next 5 types)
+ ],
+
+ # xBow offset alignment type
+ ALIGN_TYPE_XBOW_BLACK_ONLY : [ # 4, 5 & 7
+ (self.showAlignmentNumberPage, ('B', 'v', 'k', 2, 11)),
+ (self.endAlignmentNumberPage, ('B',)),
+ (self.setXBowValues, None),
+ (self.close, None),
+ ],
+
+ # xBow offset alignment type
+ ALIGN_TYPE_XBOW_PHOTO_ONLY : [ # 4, 5 & 7
+ (self.showAlignmentNumberPage, ('B', 'v', 'k', 2, 11)),
+ (self.endAlignmentNumberPage, ('B',)),
+ (self.setXBowValues, None),
+ (self.close, None),
+ ],
+
+ # xBow offset alignment type
+ ALIGN_TYPE_XBOW_COLOR_ONLY : [ # 4, 5 & 7
+ (self.showAlignmentNumberPage, ('B', 'v', 'kc', 2, 11)),
+ (self.endAlignmentNumberPage, ('B',)),
+ (self.setXBowValues, None),
+ (self.close, None),
+ ],
+
+ # xBow offset alignment type
+ ALIGN_TYPE_XBOW_COLOR_AND_BLACK : [ # 4, 5 & 7
+ (self.showAlignmentNumberPage, ('B', 'h', 'kc', 2, 17)),
+ (self.endAlignmentNumberPage, ('B',)),
+ (self.showAlignmentNumberPage, ('C', 'v', 'kc', 2, 17)),
+ (self.endAlignmentNumberPage, ('C',)),
+ (self.showAlignmentNumberPage, ('D', 'v', 'k', 2, 11)),
+ (self.endAlignmentNumberPage, ('D',)),
+ (self.showAlignmentNumberPage, ('E', 'v', 'kc', 2, 11)),
+ (self.endAlignmentNumberPage, ('E',)),
+ (self.setXBowValues, None),
+ (self.close, None),
+ ],
+
+ # xBow offset alignment type
+ ALIGN_TYPE_XBOW_COLOR_AND_PHOTO : [ # 4, 5 & 7
+ (self.showAlignmentNumberPage, ('B', 'h', 'kc', 2, 17)),
+ (self.endAlignmentNumberPage, ('B',)),
+ (self.showAlignmentNumberPage, ('C', 'v', 'kc', 2, 17)),
+ (self.endAlignmentNumberPage, ('C',)),
+ (self.showAlignmentNumberPage, ('D', 'v', 'k', 2, 11)),
+ (self.endAlignmentNumberPage, ('D',)),
+ (self.showAlignmentNumberPage, ('E', 'v', 'kc', 2, 11)),
+ (self.endAlignmentNumberPage, ('E',)),
+ (self.showColorAdjustPage, ('F', 21)),
+ (self.endColorAdjustPage, ('F',)),
+ (self.showColorAdjustPage, ('G', 21)),
+ (self.endColorAdjustPage, ('G',)),
+ (self.setXBowValues, None),
+ (self.close, None),
+ ],
+
+ ALIGN_TYPE_LIDIL_AIO : [ # 6 (semi-auto)
+ (self.showLoadPaperPage, None),
+ (maint.alignType6Phase1, (lambda: self.dev,)),
+ (self.setAlignButton, (BUTTON_FINISH,)),
+ (self.showAioPage, None),
+ (self.close, None),
+ ],
+
+ ALIGN_TYPE_DESKJET_450 : [ # 8
+ (self.showLoadPaperPage, None),
+ (self.alignType8Phase1, None), # sets num_inks
+ (self.showAlignmentNumberPage, ('A', 'v', 'k', 3, 9)),
+ (self.endAlignmentNumberPage, ('A',)),
+ (self.showAlignmentNumberPage, ('B', 'v', 'c', 3, 9)),
+ (self.endAlignmentNumberPage, ('B',)),
+ (self.showAlignmentNumberPage, ('C', 'v', 'kc', 3, 9)),
+ (self.endAlignmentNumberPage, ('C',)),
+ (self.setAlignButton, (BUTTON_ALIGN,)),
+ (self.showAlignmentNumberPage, ('D', 'h', 'kc', 3, 9)),
+ (self.endAlignmentNumberPage, ('D',)),
+ (maint.alignType3Phase2, (lambda: self.dev, lambda: self.num_inks, lambda: self.a,
+ lambda: self.b, lambda: self.c, lambda: self.d)),
+ (self.close, None),
+ ],
+
+ ALIGN_TYPE_9XX_NO_EDGE_ALIGN : [ # 9
+ (self.showLoadPaperPage, None),
+ (self.showAlignmentNumberPage, ('A', 'h', 'kc', 2, 11)),
+ (self.endAlignmentNumberPage, ('A',)),
+ (self.showAlignmentNumberPage, ('B', 'v', 'kc', 2, 11)),
+ (self.endAlignmentNumberPage, ('B',)),
+ (self.showAlignmentNumberPage, ('C', 'v', 'k', 2, 11)),
+ (self.endAlignmentNumberPage, ('C',)),
+ (self.setAlignButton, (BUTTON_ALIGN,)),
+ (self.showAlignmentNumberPage, ('D', 'v', 'kc', 2, 11)),
+ (self.endAlignmentNumberPage, ('D',)),
+ (maint.alignType3Phase2, (lambda: self.dev, lambda: self.a, lambda: self.b,
+ lambda: self.c, lambda: self.d)),
+ (self.close, None),
+ ],
+
+ ALIGN_TYPE_LBOW : [ # 10
+ (self.showLoadPaperPage, None),
+ (maint.alignType10Phase1, (lambda: self.dev,)),
+ (self.setAlignButton, (BUTTON_ALIGN,)),
+ (self.showLBowPage, (lambda: self.pattern,)),
+ (self.endLBowPage, None), # sets values
+ (maint.alignType10Phase2, (lambda: self.dev, lambda: self.values,
+ lambda: self.pattern)),
+ (self.setAlignButton, (BUTTON_FINISH,)),
+ (self.showLoadPaperPage, (lambda: True,)),
+ (maint.alignType10Phase3, (lambda: self.dev,)),
+ (self.close, None),
+ ],
+
+ ALIGN_TYPE_LIDIL_0_5_4 : [ # 11
+ (self.showLoadPaperPage, None),
+ (maint.alignType11Phase1, (lambda: self.dev,)),
+ (self.setAlignButton, (BUTTON_ALIGN,)),
+ (self.showLBowPage, (lambda: self.pattern,)),
+ (self.endLBowPage, None), # sets values
+ (maint.alignType11Phase2, (lambda: self.dev, lambda: self.values,
+ lambda: self.pattern, lambda: self.dev.pen_config)),
+ (self.setAlignButton, (BUTTON_FINISH,)),
+ (self.showLoadPaperPage, (lambda: True,)),
+ (maint.alignType11Phase3, (lambda: self.dev,)),
+ (self.close, None),
+ ],
+
+ ALIGN_TYPE_OJ_PRO : [ # 12
+ (self.showLoadPaperPage, None),
+ (maint.AlignType12, (lambda : self.dev, lambda: true)),
+ (self.close, None),
+ ],
+
+ ALIGN_TYPE_AIO : [ #13
+ (self.showLoadPaperPage, None),
+ (maint.alignType13Phase1, (lambda: self.dev,)),
+ (self.setAlignButton, (BUTTON_FINISH,)),
+ (self.showAioPage, None),
+ (self.close, None),
+ ],
+
+ ALIGN_TYPE_LIDIL_DJ_D1600 : [ # 14
+ (self.showLoadPaperPage, None),
+ (maint.alignType14Phase1, (lambda: self.dev,)),
+ (self.setAlignButton, (BUTTON_ALIGN,)),
+ (self.showLBowPage, (lambda: self.pattern,)),
+ (self.endLBowPage, None), # sets values
+ (maint.alignType14Phase2, (lambda: self.dev, lambda: self.values,
+ lambda: self.pattern, lambda: self.dev.pen_config)),
+ (self.setAlignButton, (BUTTON_FINISH,)),
+ (self.showLoadPaperPage, (lambda: True,)),
+ (maint.alignType14Phase3, (lambda: self.dev,)),
+ (self.close, None),
+ ],
+
+ ALIGN_TYPE_LEDM : [ # 15
+ (self.showLoadPaperPage, None),
+ (maint.AlignType15Phase1, (lambda : self.dev, lambda: self.showAioPage)),
+ (self.close, None),
+ ],
+
+ ALIGN_TYPE_LEDM_MANUAL : [ # 16
+ (self.showLoadPaperPage, None),
+ (maint.AlignType15Phase1, (lambda : self.dev, lambda: true)),
+ (self.showAlignmentNumberPage, ('A', 'v', 'kc', 3, 23)),
+ (self.endAlignmentNumberPage, ('A',)),
+ (self.showAlignmentNumberPage, ('B', 'h', 'kc', 3, 11)),
+ (self.endAlignmentNumberPage, ('B',)),
+ (self.showAlignmentNumberPage, ('C', 'v', 'k', 3, 23)),
+ (self.endAlignmentNumberPage, ('C',)),
+ (self.showAlignmentNumberPage, ('D', 'v', 'c', 3, 23)),
+ (self.endAlignmentNumberPage, ('D',)),
+ (self.showAlignmentNumberPage, ('E', 'h', 'k', 3, 11)),
+ (self.endAlignmentNumberPage, ('E',)),
+ (self.showAlignmentNumberPage, ('F', 'h', 'k', 3, 11)),
+ (self.endAlignmentNumberPage, ('F',)),
+ (self.showAlignmentNumberPage, ('G', 'h', 'k', 3, 11)),
+ (self.endAlignmentNumberPage, ('G',)),
+ (self.showAlignmentNumberPage, ('H', 'v', 'k', 3, 9)),
+ (self.endAlignmentNumberPage, ('H',)),
+ (self.showAlignmentNumberPage, ('I', 'v', 'c', 3, 9)),
+ (self.endAlignmentNumberPage, ('I',)),
+ (maint.AlignType16Phase1, (lambda: self.dev, lambda: self.a, lambda: self.b,
+ lambda: self.c, lambda: self.d, lambda: self.e,
+ lambda: self.f, lambda: self.g, lambda: self.h,
+ lambda: self.i)),
+ (self.close, None),
+ ],
+ ALIGN_TYPE_LEDM_FF_CC_0 : [ # 17
+ (self.showLoadPaperPage, None),
+ (maint.AlignType17Phase1, (lambda : self.dev, lambda: self.showAioPage)),
+ (self.close, None),
+ ],
+ }
+
+ self.setupUi(self)
+ self.initUi()
+
+ QTimer.singleShot(0, self.nextSequence)
+
+
+ def initUi(self):
+ # connect signals/slots
+ self.connect(self.CancelButton, SIGNAL("clicked()"), self.CancelButton_clicked)
+ self.connect(self.NextButton, SIGNAL("clicked()"), self.NextButton_clicked)
+ #self.connect(self.BackButton, SIGNAL("clicked()"), self.BackButton_clicked)
+ self.connect(self.DeviceComboBox, SIGNAL("DeviceUriComboBox_noDevices"), self.DeviceUriComboBox_noDevices)
+ self.connect(self.DeviceComboBox, SIGNAL("DeviceUriComboBox_currentChanged"), self.DeviceUriComboBox_currentChanged)
+ self.DeviceComboBox.setFilter({'align-type': (operator.gt, 0)})
+
+ # Application icon
+ self.setWindowIcon(QIcon(load_pixmap('hp_logo', '128x128')))
+
+ if self.device_uri:
+ self.DeviceComboBox.setInitialDevice(self.device_uri)
+
+
+ def DeviceUriComboBox_noDevices(self):
+ FailureUI(self, self.__tr("<b>No devices that support print cartridge alignment found.</b><p>Click <i>OK</i> to exit.</p>"))
+ self.close()
+
+
+ def DeviceUriComboBox_currentChanged(self, device_uri):
+ self.device_uri = device_uri
+
+
+ def CancelButton_clicked(self):
+ self.close()
+
+
+ def NextButton_clicked(self):
+ self.nextSequence()
+
+
+ def nextSequence(self):
+ while True:
+ try:
+ seq, params = self.seq[self.align_type][self.seq_index]
+ except IndexError:
+ break
+
+ if seq is None:
+ self.seq_index += 1
+ continue
+
+ self.new_page = False
+
+ t = []
+ if params is not None:
+ for p in params:
+ try:
+ t.append(p())
+ except:
+ t.append(p)
+
+ try:
+ log.debug("%s(%s)" % (seq.func_name, ','.join([repr(x) for x in t])))
+ except AttributeError:
+ pass
+
+ try:
+ seq(*t)
+ except Error:
+ CheckDeviceUI(self)
+ break
+
+ self.seq_index += 1
+
+ if self.new_page:
+ break
+
+ if self.abort:
+ self.close()
+
+
+
+ def showStartPage(self):
+# self.BackButton.setEnabled(False)
+ num_devices = self.DeviceComboBox.setDevices()
+
+ if num_devices == 1:
+ self.skipPage()
+ return
+
+ self.DeviceComboBox.updateUi()
+ self.displayPage(PAGE_START)
+
+
+ def endStartPage(self):
+ self.mq = device.queryModelByURI(self.device_uri)
+ self.align_type = self.mq.get('align-type', ALIGN_TYPE_NONE)
+ self.seq_index = -1
+
+ #self.align_type = ALIGN_TYPE_TEST# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+
+ log.debug("align-type=%d" % self.align_type)
+ self.step_max = self.max_steps[self.align_type]
+
+ try:
+ self.dev = device.Device(self.device_uri)
+ except Error:
+ CheckDeviceUI(self)
+ return
+
+
+ def showLoadPaperPage(self, finish=False):
+ if finish:
+ self.LoadPaper.button_name = self.__tr("Finish >")
+ self.LoadPaper.updateUi()
+ self.displayPage(PAGE_LOAD_PAPER)
+
+
+ def endLoadPaperPage(self):
+ pass
+
+
+ def showAlignmentNumberPage(self, line_id, orientation, colors, line_count, choice_count):
+ # line_id: 'A', 'B', etc.
+ # orientation: 'v' or 'h'
+ # colors: 'k' or 'c' or 'kc'
+ # line_count: 2 or 3
+ # choice_count: 5, 7, 9, 11, etc. (odd)
+ self.AlignmentNumberTitle.setText(self.__tr("From the printed Alignment page, Choose the set of lines in group %1 where the line segments are <b>best</b> aligned.").arg(line_id))
+ self.AlignmentNumberIcon.setPixmap(load_pixmap('%s-%s-%d' % (orientation, colors, line_count), 'other'))
+ self.AlignmentNumberComboBox.clear()
+
+ for x in range(choice_count):
+ self.AlignmentNumberComboBox.addItem(QString("%1%2").arg(line_id).arg(x+1))
+
+ self.displayPage(PAGE_ALIGNMENT_NUMBER)
+ return
+
+
+ def endAlignmentNumberPage(self, line_id):
+ v = int(str(self.AlignmentNumberComboBox.currentText())[1:])
+
+ if line_id == 'A':
+ self.a = v
+ log.debug("A=%d" % v)
+
+ elif line_id == 'B':
+ self.b = v
+ log.debug("B=%d" % v)
+
+ elif line_id == 'C':
+ self.c = v
+ log.debug("C=%d" % v)
+
+ elif line_id == 'D':
+ self.d = v
+ log.debug("D=%d" % v)
+
+ elif line_id == 'E':
+ self.e = v
+ log.debug("E=%d" % v)
+
+ elif line_id == 'F':
+ self.f = v
+ log.debug("F=%d" % v)
+
+ elif line_id == 'G':
+ self.g = v
+ log.debug("G=%d" % v)
+
+ elif line_id == 'H':
+ self.h = v
+ log.debug("H=%d" % v)
+
+ elif line_id == 'I':
+ self.i = v
+ log.debug("I=%d" % v)
+
+ def showPageEdgePage(self, prefix=None, count=13):
+ self.PageEdgeTitle.setText(self.__tr("Choose the <b>numbered arrow</b> that <b>best </b>marks the edge of the paper."))
+ self.PageEdgeIcon.setPixmap(load_pixmap('zca.png', 'other'))
+
+ self.PageEdgeComboBox.clear()
+ for x in range(count):
+ if prefix is None:
+ self.PageEdgeComboBox.addItem(QString("%1").arg(x+1))
+ else:
+ self.PageEdgeComboBox.addItem(QString("%1%2").arg(prefix).arg(x+1)) # for xBow
+
+ self.displayPage(PAGE_EDGE)
+
+
+ def endPageEdgePage(self):
+ v = int(str(self.PageEdgeComboBox.currentText())[1:])
+ self.zca = v
+ log.debug("ZCA=%d" % v)
+
+
+ def showLBowPage(self, pattern):
+ self.LBowIcon.setPixmap(load_pixmap('align10', 'other'))
+
+ if self.align_type == ALIGN_TYPE_LBOW:
+ pattern = maint.alignType10SetPattern(self.dev)
+
+ elif self.align_type == ALIGN_TYPE_LIDIL_DJ_D1600:
+ pattern = maint.alignType14SetPattern(self.dev)
+
+ else: # ALIGN_TYPE_LIDIL_0_5_4
+ pattern = maint.alignType11SetPattern(self.dev)
+
+ if pattern is None:
+ log.error("Invalid pattern!")
+ # TODO: ...
+
+ self.controls = maint.align10and11and14Controls(pattern, self.align_type)
+ keys = self.controls.keys()
+ keys.sort()
+ max_line = 'A'
+ for line in keys:
+ if self.controls[line][0]:
+ max_line = line
+ else:
+ break
+
+ self.LBowTitle.setText(self.__tr("For each row A - %1, select the label representing the box in which in the inner lines are the <b>least</b> visible.").arg(max_line))
+
+ for line in self.controls:
+ if not self.controls[line][0]:
+ eval('self.%sComboBox.setEnabled(False)' % line.lower())
+ else:
+ for x in range(self.controls[line][1]):
+ eval('self.%sComboBox.addItem("%s%d")' % (line.lower(), line, x + 1))
+
+ self.displayPage(PAGE_LBOW)
+
+
+
+ def endLBowPage(self):
+ self.values = []
+ controls = self.controls.keys()
+ controls.sort()
+
+ for line in controls:
+ if not self.controls[line][0]:
+ self.values.append(0)
+ else:
+ exec('selected = unicode(self.%sComboBox.currentText())' % line.lower())
+ try:
+ selected = int(selected[1:])
+ except ValueError:
+ selected = 0
+
+ self.values.append(selected)
+
+
+ def showAioPage(self):
+ self.AioIcon.setPixmap(load_pixmap('aio_align', 'other'))
+ self.displayPage(PAGE_AIO)
+
+
+ def endAioPage(self):
+ pass
+
+
+ def showColorAdjustPage(self, line_id, count=21):
+ self.ColorAdjustComboBox.clear()
+ self.ColorAdjustIcon.setPixmap(load_pixmap('color_adj', 'other'))
+ self.ColorAdjustLabel.setText(self.__tr("Line %1:").arg(line_id))
+
+ for x in range(count):
+ self.ColorAdjustComboBox.addItem(QString("%1%2").arg(line_id).arg(x+1))
+
+ self.displayPage(PAGE_COLOR_ADJ)
+
+
+ def endColorAdjustPage(self, line_id):
+ v = int(str(self.ColorAdjustComboBox.currentText())[1:])
+
+ if line_id == 'F':
+ self.f = v
+ log.debug("F=%d" % v)
+
+ elif line_id == 'G':
+ self.g = v
+ log.debug("G=%d" % v)
+
+
+ def showFrontPanelPage(self):
+# self.BackButton.setEnabled(False)
+ self.setAlignButton(BUTTON_FINISH)
+ self.displayPage(PAGE_FRONT_PANEL)
+
+
+ def endFronPanelPage(self):
+ pass
+
+ #
+ # ALIGN-TYPE SPECIFIC
+ #
+
+ def checkType2PenConfig(self):
+ pass
+ # TODO: set abort if problem
+
+
+ def alignType8Phase1(self):
+ self.num_inks = maint.alignType8Phase1(self.dev)
+
+
+ def setXBow(self):
+ # TODO: set abort if invalid pen config
+ self.real_align_type = self.align_type
+ self.align_type = ALIGN_TYPE_XBOW_OFFSET + self.dev.pen_config
+ self.seq_index = -1
+
+
+ def setXBowValues(self):
+ if self.real_align_type == ALIGN_TYPE_LIDIL_0_3_8:
+ maint.alignType4Phase2(self.dev, self.zca, self.b, self.c, self.d, self.e)
+ maint.alignType4Phase3(self.dev)
+
+ elif self.real_align_type == ALIGN_TYPE_LIDIL_0_4_3:
+ maint.alignType5Phase2(self.dev, self.zca, self.b, self.c, self.d, self.e, self.f, self.g)
+ maint.alignType5Phase3(self.dev)
+
+ elif self.real_align_type == ALIGN_TYPE_LIDIL_VIP:
+ maint.alignType7Phase2(self.dev, self.zca, self.b, self.c, self.d, self.e, self.f, self.g)
+ maint.alignType7Phase3(self.dev)
+
+
+ #
+ # Misc
+ #
+
+ def displayPage(self, page):
+ self.updateStepText(self.step)
+ self.step += 1
+ self.new_page = True
+ self.StackedWidget.setCurrentIndex(page)
+
+
+ def skipPage(self):
+ self.step += 1
+ self.new_page = False
+
+
+ def updateStepText(self, p=None):
+ if p is None or not self.step_max:
+ self.StepText.setText(QString(""))
+ else:
+ self.StepText.setText(self.__tr("Step %1 of %2").arg(p).arg(self.step_max))
+
+
+ def setAlignButton(self, typ=BUTTON_ALIGN):
+ if typ == BUTTON_ALIGN:
+ self.NextButton.setText(self.__tr("Align"))
+ elif typ == BUTTON_NEXT:
+ self.NextButton.setText(self.__tr("Next >"))
+ elif typ == BUTTON_FINISH:
+ self.NextButton.setText(self.__tr("Finish"))
+
+
+ def setPenConfig(self):
+ self.dev.pen_config = status.getPenConfiguration(self.dev.getStatusFromDeviceID())
+
+
+ def closeAll(self):
+ if self.dev is not None:
+ self.dev.close()
+
+
+ def __tr(self,s,c = None):
+ return qApp.translate("AlignDialog",s,c)
diff --git a/ui4/aligndialog_base.py b/ui4/aligndialog_base.py
new file mode 100644
index 0000000..fd02be3
--- /dev/null
+++ b/ui4/aligndialog_base.py
@@ -0,0 +1,376 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'aligndialog_base.ui'
+#
+# Created: Thu Jul 30 10:31:01 2009
+# by: PyQt4 UI code generator 4.4.4
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt4 import QtCore, QtGui
+
+class Ui_Dialog(object):
+ def setupUi(self, Dialog):
+ Dialog.setObjectName("Dialog")
+ Dialog.resize(700, 568)
+ self.gridlayout = QtGui.QGridLayout(Dialog)
+ self.gridlayout.setObjectName("gridlayout")
+ self.label = QtGui.QLabel(Dialog)
+ font = QtGui.QFont()
+ font.setPointSize(16)
+ self.label.setFont(font)
+ self.label.setObjectName("label")
+ self.gridlayout.addWidget(self.label, 0, 0, 1, 3)
+ self.line = QtGui.QFrame(Dialog)
+ self.line.setFrameShape(QtGui.QFrame.HLine)
+ self.line.setFrameShadow(QtGui.QFrame.Sunken)
+ self.line.setObjectName("line")
+ self.gridlayout.addWidget(self.line, 1, 0, 1, 5)
+ self.line_2 = QtGui.QFrame(Dialog)
+ self.line_2.setFrameShape(QtGui.QFrame.HLine)
+ self.line_2.setFrameShadow(QtGui.QFrame.Sunken)
+ self.line_2.setObjectName("line_2")
+ self.gridlayout.addWidget(self.line_2, 3, 0, 1, 5)
+ self.StepText = QtGui.QLabel(Dialog)
+ self.StepText.setObjectName("StepText")
+ self.gridlayout.addWidget(self.StepText, 4, 0, 1, 1)
+ spacerItem = QtGui.QSpacerItem(191, 29, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+ self.gridlayout.addItem(spacerItem, 4, 1, 1, 1)
+ self.NextButton = QtGui.QPushButton(Dialog)
+ self.NextButton.setObjectName("NextButton")
+ self.gridlayout.addWidget(self.NextButton, 4, 3, 1, 1)
+ self.CancelButton = QtGui.QPushButton(Dialog)
+ self.CancelButton.setObjectName("CancelButton")
+ self.gridlayout.addWidget(self.CancelButton, 4, 4, 1, 1)
+ self.StackedWidget = QtGui.QStackedWidget(Dialog)
+ self.StackedWidget.setObjectName("StackedWidget")
+ self.StartPage = QtGui.QWidget()
+ self.StartPage.setObjectName("StartPage")
+ self.gridlayout1 = QtGui.QGridLayout(self.StartPage)
+ self.gridlayout1.setObjectName("gridlayout1")
+ self.DeviceComboBox = DeviceUriComboBox(self.StartPage)
+ self.DeviceComboBox.setObjectName("DeviceComboBox")
+ self.gridlayout1.addWidget(self.DeviceComboBox, 0, 0, 1, 1)
+ self.groupBox = QtGui.QGroupBox(self.StartPage)
+ self.groupBox.setObjectName("groupBox")
+ self.gridlayout2 = QtGui.QGridLayout(self.groupBox)
+ self.gridlayout2.setObjectName("gridlayout2")
+ self.label_2 = QtGui.QLabel(self.groupBox)
+ self.label_2.setObjectName("label_2")
+ self.gridlayout2.addWidget(self.label_2, 0, 0, 1, 1)
+ self.gridlayout1.addWidget(self.groupBox, 1, 0, 1, 1)
+ spacerItem1 = QtGui.QSpacerItem(564, 161, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ self.gridlayout1.addItem(spacerItem1, 2, 0, 1, 1)
+ self.StackedWidget.addWidget(self.StartPage)
+ self.LoadPaperPage = QtGui.QWidget()
+ self.LoadPaperPage.setObjectName("LoadPaperPage")
+ self.gridlayout3 = QtGui.QGridLayout(self.LoadPaperPage)
+ self.gridlayout3.setObjectName("gridlayout3")
+ self.LoadPaper = LoadPaperGroupBox(self.LoadPaperPage)
+ self.LoadPaper.setObjectName("LoadPaper")
+ self.gridlayout3.addWidget(self.LoadPaper, 0, 0, 1, 1)
+ spacerItem2 = QtGui.QSpacerItem(20, 181, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ self.gridlayout3.addItem(spacerItem2, 1, 0, 1, 1)
+ self.StackedWidget.addWidget(self.LoadPaperPage)
+ self.PaperEdgePage = QtGui.QWidget()
+ self.PaperEdgePage.setObjectName("PaperEdgePage")
+ self.gridlayout4 = QtGui.QGridLayout(self.PaperEdgePage)
+ self.gridlayout4.setObjectName("gridlayout4")
+ self.PageEdgeTitle = QtGui.QLabel(self.PaperEdgePage)
+ self.PageEdgeTitle.setObjectName("PageEdgeTitle")
+ self.gridlayout4.addWidget(self.PageEdgeTitle, 0, 0, 1, 4)
+ spacerItem3 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ self.gridlayout4.addItem(spacerItem3, 1, 1, 1, 1)
+ spacerItem4 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+ self.gridlayout4.addItem(spacerItem4, 2, 0, 1, 1)
+ self.hboxlayout = QtGui.QHBoxLayout()
+ self.hboxlayout.setObjectName("hboxlayout")
+ self.PageEdgeIcon = QtGui.QLabel(self.PaperEdgePage)
+ sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.PageEdgeIcon.sizePolicy().hasHeightForWidth())
+ self.PageEdgeIcon.setSizePolicy(sizePolicy)
+ self.PageEdgeIcon.setMinimumSize(QtCore.QSize(85, 90))
+ self.PageEdgeIcon.setMaximumSize(QtCore.QSize(85, 90))
+ self.PageEdgeIcon.setFrameShape(QtGui.QFrame.NoFrame)
+ self.PageEdgeIcon.setObjectName("PageEdgeIcon")
+ self.hboxlayout.addWidget(self.PageEdgeIcon)
+ self.PageEdgeComboBox = QtGui.QComboBox(self.PaperEdgePage)
+ self.PageEdgeComboBox.setObjectName("PageEdgeComboBox")
+ self.hboxlayout.addWidget(self.PageEdgeComboBox)
+ self.gridlayout4.addLayout(self.hboxlayout, 2, 1, 1, 2)
+ spacerItem5 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+ self.gridlayout4.addItem(spacerItem5, 2, 3, 1, 1)
+ spacerItem6 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ self.gridlayout4.addItem(spacerItem6, 3, 2, 1, 1)
+ self.StackedWidget.addWidget(self.PaperEdgePage)
+ self.AlignmentNumber = QtGui.QWidget()
+ self.AlignmentNumber.setObjectName("AlignmentNumber")
+ self.gridlayout5 = QtGui.QGridLayout(self.AlignmentNumber)
+ self.gridlayout5.setObjectName("gridlayout5")
+ self.AlignmentNumberTitle = QtGui.QLabel(self.AlignmentNumber)
+ self.AlignmentNumberTitle.setObjectName("AlignmentNumberTitle")
+ self.gridlayout5.addWidget(self.AlignmentNumberTitle, 0, 0, 1, 4)
+ spacerItem7 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ self.gridlayout5.addItem(spacerItem7, 1, 1, 1, 1)
+ spacerItem8 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+ self.gridlayout5.addItem(spacerItem8, 2, 0, 1, 1)
+ self.hboxlayout1 = QtGui.QHBoxLayout()
+ self.hboxlayout1.setObjectName("hboxlayout1")
+ self.AlignmentNumberIcon = QtGui.QLabel(self.AlignmentNumber)
+ sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.AlignmentNumberIcon.sizePolicy().hasHeightForWidth())
+ self.AlignmentNumberIcon.setSizePolicy(sizePolicy)
+ self.AlignmentNumberIcon.setMinimumSize(QtCore.QSize(85, 90))
+ self.AlignmentNumberIcon.setMaximumSize(QtCore.QSize(85, 90))
+ self.AlignmentNumberIcon.setFrameShape(QtGui.QFrame.NoFrame)
+ self.AlignmentNumberIcon.setObjectName("AlignmentNumberIcon")
+ self.hboxlayout1.addWidget(self.AlignmentNumberIcon)
+ self.AlignmentNumberComboBox = QtGui.QComboBox(self.AlignmentNumber)
+ self.AlignmentNumberComboBox.setObjectName("AlignmentNumberComboBox")
+ self.hboxlayout1.addWidget(self.AlignmentNumberComboBox)
+ self.gridlayout5.addLayout(self.hboxlayout1, 2, 1, 1, 2)
+ spacerItem9 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+ self.gridlayout5.addItem(spacerItem9, 2, 3, 1, 1)
+ spacerItem10 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ self.gridlayout5.addItem(spacerItem10, 3, 2, 1, 1)
+ self.StackedWidget.addWidget(self.AlignmentNumber)
+ self.ColorAdjPage = QtGui.QWidget()
+ self.ColorAdjPage.setObjectName("ColorAdjPage")
+ self.gridlayout6 = QtGui.QGridLayout(self.ColorAdjPage)
+ self.gridlayout6.setObjectName("gridlayout6")
+ self.label_12 = QtGui.QLabel(self.ColorAdjPage)
+ self.label_12.setWordWrap(True)
+ self.label_12.setObjectName("label_12")
+ self.gridlayout6.addWidget(self.label_12, 0, 0, 1, 5)
+ spacerItem11 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ self.gridlayout6.addItem(spacerItem11, 1, 1, 1, 1)
+ spacerItem12 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+ self.gridlayout6.addItem(spacerItem12, 2, 0, 1, 1)
+ self.ColorAdjustIcon = QtGui.QLabel(self.ColorAdjPage)
+ sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.ColorAdjustIcon.sizePolicy().hasHeightForWidth())
+ self.ColorAdjustIcon.setSizePolicy(sizePolicy)
+ self.ColorAdjustIcon.setMinimumSize(QtCore.QSize(85, 90))
+ self.ColorAdjustIcon.setMaximumSize(QtCore.QSize(85, 90))
+ self.ColorAdjustIcon.setFrameShape(QtGui.QFrame.NoFrame)
+ self.ColorAdjustIcon.setObjectName("ColorAdjustIcon")
+ self.gridlayout6.addWidget(self.ColorAdjustIcon, 2, 1, 1, 1)
+ spacerItem13 = QtGui.QSpacerItem(31, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+ self.gridlayout6.addItem(spacerItem13, 2, 2, 1, 1)
+ self.hboxlayout2 = QtGui.QHBoxLayout()
+ self.hboxlayout2.setObjectName("hboxlayout2")
+ self.ColorAdjustLabel = QtGui.QLabel(self.ColorAdjPage)
+ self.ColorAdjustLabel.setObjectName("ColorAdjustLabel")
+ self.hboxlayout2.addWidget(self.ColorAdjustLabel)
+ self.ColorAdjustComboBox = QtGui.QComboBox(self.ColorAdjPage)
+ self.ColorAdjustComboBox.setObjectName("ColorAdjustComboBox")
+ self.hboxlayout2.addWidget(self.ColorAdjustComboBox)
+ self.gridlayout6.addLayout(self.hboxlayout2, 2, 3, 1, 1)
+ spacerItem14 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+ self.gridlayout6.addItem(spacerItem14, 2, 4, 1, 1)
+ spacerItem15 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ self.gridlayout6.addItem(spacerItem15, 3, 1, 1, 1)
+ self.StackedWidget.addWidget(self.ColorAdjPage)
+ self.LBowPage = QtGui.QWidget()
+ self.LBowPage.setObjectName("LBowPage")
+ self.gridlayout7 = QtGui.QGridLayout(self.LBowPage)
+ self.gridlayout7.setObjectName("gridlayout7")
+ self.LBowTitle = QtGui.QLabel(self.LBowPage)
+ self.LBowTitle.setWordWrap(True)
+ self.LBowTitle.setObjectName("LBowTitle")
+ self.gridlayout7.addWidget(self.LBowTitle, 0, 0, 1, 5)
+ spacerItem16 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ self.gridlayout7.addItem(spacerItem16, 1, 1, 1, 1)
+ spacerItem17 = QtGui.QSpacerItem(41, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+ self.gridlayout7.addItem(spacerItem17, 2, 0, 1, 1)
+ self.LBowIcon = QtGui.QLabel(self.LBowPage)
+ sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.LBowIcon.sizePolicy().hasHeightForWidth())
+ self.LBowIcon.setSizePolicy(sizePolicy)
+ self.LBowIcon.setMinimumSize(QtCore.QSize(192, 93))
+ self.LBowIcon.setMaximumSize(QtCore.QSize(192, 93))
+ self.LBowIcon.setFrameShape(QtGui.QFrame.NoFrame)
+ self.LBowIcon.setObjectName("LBowIcon")
+ self.gridlayout7.addWidget(self.LBowIcon, 2, 1, 1, 1)
+ spacerItem18 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+ self.gridlayout7.addItem(spacerItem18, 2, 2, 1, 1)
+ spacerItem19 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+ self.gridlayout7.addItem(spacerItem19, 2, 4, 1, 1)
+ spacerItem20 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ self.gridlayout7.addItem(spacerItem20, 3, 1, 1, 1)
+ self.groupBox_2 = QtGui.QGroupBox(self.LBowPage)
+ self.groupBox_2.setObjectName("groupBox_2")
+ self.gridlayout8 = QtGui.QGridLayout(self.groupBox_2)
+ self.gridlayout8.setObjectName("gridlayout8")
+ self.hboxlayout3 = QtGui.QHBoxLayout()
+ self.hboxlayout3.setObjectName("hboxlayout3")
+ self.label_4 = QtGui.QLabel(self.groupBox_2)
+ self.label_4.setObjectName("label_4")
+ self.hboxlayout3.addWidget(self.label_4)
+ self.aComboBox = QtGui.QComboBox(self.groupBox_2)
+ self.aComboBox.setObjectName("aComboBox")
+ self.hboxlayout3.addWidget(self.aComboBox)
+ self.gridlayout8.addLayout(self.hboxlayout3, 0, 0, 1, 1)
+ self.hboxlayout4 = QtGui.QHBoxLayout()
+ self.hboxlayout4.setObjectName("hboxlayout4")
+ self.label_5 = QtGui.QLabel(self.groupBox_2)
+ self.label_5.setObjectName("label_5")
+ self.hboxlayout4.addWidget(self.label_5)
+ self.bComboBox = QtGui.QComboBox(self.groupBox_2)
+ self.bComboBox.setObjectName("bComboBox")
+ self.hboxlayout4.addWidget(self.bComboBox)
+ self.gridlayout8.addLayout(self.hboxlayout4, 1, 0, 1, 1)
+ self.hboxlayout5 = QtGui.QHBoxLayout()
+ self.hboxlayout5.setObjectName("hboxlayout5")
+ self.label_6 = QtGui.QLabel(self.groupBox_2)
+ self.label_6.setObjectName("label_6")
+ self.hboxlayout5.addWidget(self.label_6)
+ self.cComboBox = QtGui.QComboBox(self.groupBox_2)
+ self.cComboBox.setObjectName("cComboBox")
+ self.hboxlayout5.addWidget(self.cComboBox)
+ self.gridlayout8.addLayout(self.hboxlayout5, 2, 0, 1, 1)
+ self.hboxlayout6 = QtGui.QHBoxLayout()
+ self.hboxlayout6.setObjectName("hboxlayout6")
+ self.label_7 = QtGui.QLabel(self.groupBox_2)
+ self.label_7.setObjectName("label_7")
+ self.hboxlayout6.addWidget(self.label_7)
+ self.dComboBox = QtGui.QComboBox(self.groupBox_2)
+ self.dComboBox.setObjectName("dComboBox")
+ self.hboxlayout6.addWidget(self.dComboBox)
+ self.gridlayout8.addLayout(self.hboxlayout6, 3, 0, 1, 1)
+ self.hboxlayout7 = QtGui.QHBoxLayout()
+ self.hboxlayout7.setObjectName("hboxlayout7")
+ self.label_8 = QtGui.QLabel(self.groupBox_2)
+ self.label_8.setObjectName("label_8")
+ self.hboxlayout7.addWidget(self.label_8)
+ self.eComboBox = QtGui.QComboBox(self.groupBox_2)
+ self.eComboBox.setObjectName("eComboBox")
+ self.hboxlayout7.addWidget(self.eComboBox)
+ self.gridlayout8.addLayout(self.hboxlayout7, 4, 0, 1, 1)
+ self.hboxlayout8 = QtGui.QHBoxLayout()
+ self.hboxlayout8.setObjectName("hboxlayout8")
+ self.label_9 = QtGui.QLabel(self.groupBox_2)
+ self.label_9.setObjectName("label_9")
+ self.hboxlayout8.addWidget(self.label_9)
+ self.fComboBox = QtGui.QComboBox(self.groupBox_2)
+ self.fComboBox.setObjectName("fComboBox")
+ self.hboxlayout8.addWidget(self.fComboBox)
+ self.gridlayout8.addLayout(self.hboxlayout8, 5, 0, 1, 1)
+ self.hboxlayout9 = QtGui.QHBoxLayout()
+ self.hboxlayout9.setObjectName("hboxlayout9")
+ self.label_10 = QtGui.QLabel(self.groupBox_2)
+ self.label_10.setObjectName("label_10")
+ self.hboxlayout9.addWidget(self.label_10)
+ self.gComboBox = QtGui.QComboBox(self.groupBox_2)
+ self.gComboBox.setObjectName("gComboBox")
+ self.hboxlayout9.addWidget(self.gComboBox)
+ self.gridlayout8.addLayout(self.hboxlayout9, 6, 0, 1, 1)
+ self.hboxlayout10 = QtGui.QHBoxLayout()
+ self.hboxlayout10.setObjectName("hboxlayout10")
+ self.label_11 = QtGui.QLabel(self.groupBox_2)
+ self.label_11.setObjectName("label_11")
+ self.hboxlayout10.addWidget(self.label_11)
+ self.hComboBox = QtGui.QComboBox(self.groupBox_2)
+ self.hComboBox.setObjectName("hComboBox")
+ self.hboxlayout10.addWidget(self.hComboBox)
+ self.gridlayout8.addLayout(self.hboxlayout10, 7, 0, 1, 1)
+ self.horizontalLayout = QtGui.QHBoxLayout()
+ self.horizontalLayout.setObjectName("horizontalLayout")
+ self.label_14 = QtGui.QLabel(self.groupBox_2)
+ self.label_14.setObjectName("label_14")
+ self.horizontalLayout.addWidget(self.label_14)
+ self.iComboBox = QtGui.QComboBox(self.groupBox_2)
+ self.iComboBox.setObjectName("iComboBox")
+ self.horizontalLayout.addWidget(self.iComboBox)
+ self.gridlayout8.addLayout(self.horizontalLayout, 8, 0, 1, 1)
+ self.gridlayout7.addWidget(self.groupBox_2, 1, 3, 3, 1)
+ self.StackedWidget.addWidget(self.LBowPage)
+ self.AioPage = QtGui.QWidget()
+ self.AioPage.setObjectName("AioPage")
+ self.gridlayout9 = QtGui.QGridLayout(self.AioPage)
+ self.gridlayout9.setObjectName("gridlayout9")
+ spacerItem21 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ self.gridlayout9.addItem(spacerItem21, 0, 1, 1, 1)
+ spacerItem22 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+ self.gridlayout9.addItem(spacerItem22, 1, 0, 1, 1)
+ self.AioIcon = QtGui.QLabel(self.AioPage)
+ sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.AioIcon.sizePolicy().hasHeightForWidth())
+ self.AioIcon.setSizePolicy(sizePolicy)
+ self.AioIcon.setMinimumSize(QtCore.QSize(92, 120))
+ self.AioIcon.setMaximumSize(QtCore.QSize(92, 120))
+ self.AioIcon.setFrameShape(QtGui.QFrame.NoFrame)
+ self.AioIcon.setObjectName("AioIcon")
+ self.gridlayout9.addWidget(self.AioIcon, 1, 1, 1, 1)
+ spacerItem23 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+ self.gridlayout9.addItem(spacerItem23, 1, 2, 1, 1)
+ self.label_3 = QtGui.QLabel(self.AioPage)
+ self.label_3.setWordWrap(True)
+ self.label_3.setObjectName("label_3")
+ self.gridlayout9.addWidget(self.label_3, 1, 3, 1, 1)
+ spacerItem24 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ self.gridlayout9.addItem(spacerItem24, 2, 1, 1, 1)
+ self.StackedWidget.addWidget(self.AioPage)
+ self.FrontPanelPage = QtGui.QWidget()
+ self.FrontPanelPage.setObjectName("FrontPanelPage")
+ self.gridlayout10 = QtGui.QGridLayout(self.FrontPanelPage)
+ self.gridlayout10.setObjectName("gridlayout10")
+ self.label_13 = QtGui.QLabel(self.FrontPanelPage)
+ self.label_13.setTextFormat(QtCore.Qt.RichText)
+ self.label_13.setWordWrap(True)
+ self.label_13.setObjectName("label_13")
+ self.gridlayout10.addWidget(self.label_13, 0, 0, 1, 1)
+ spacerItem25 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ self.gridlayout10.addItem(spacerItem25, 1, 0, 1, 1)
+ self.StackedWidget.addWidget(self.FrontPanelPage)
+ self.gridlayout.addWidget(self.StackedWidget, 2, 0, 1, 5)
+
+ self.retranslateUi(Dialog)
+ self.StackedWidget.setCurrentIndex(5)
+ QtCore.QMetaObject.connectSlotsByName(Dialog)
+
+ def retranslateUi(self, Dialog):
+ Dialog.setWindowTitle(QtGui.QApplication.translate("Dialog", "HP Device Manager - Align Print Cartridges", None, QtGui.QApplication.UnicodeUTF8))
+ self.label.setText(QtGui.QApplication.translate("Dialog", "Align Print Cartridges", None, QtGui.QApplication.UnicodeUTF8))
+ self.StepText.setText(QtGui.QApplication.translate("Dialog", "Step %1 of %2", None, QtGui.QApplication.UnicodeUTF8))
+ self.NextButton.setText(QtGui.QApplication.translate("Dialog", "Next >", None, QtGui.QApplication.UnicodeUTF8))
+ self.CancelButton.setText(QtGui.QApplication.translate("Dialog", "Cancel", None, QtGui.QApplication.UnicodeUTF8))
+ self.label_2.setText(QtGui.QApplication.translate("Dialog", "<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
+"p, li { white-space: pre-wrap; }\n"
+"</style></head><body style=\" font-family:\'Sans Serif\'; font-size:9pt; font-weight:400; font-style:normal;\">\n"
+"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">Select the device to align and click <span style=\" font-style:italic;\">Next &gt;</span> to continue.</p></body></html>", None, QtGui.QApplication.UnicodeUTF8))
+ self.label_12.setText(QtGui.QApplication.translate("Dialog", "Choose the numbered colored box that the color <b>best </b>matches the background color of the bar.", None, QtGui.QApplication.UnicodeUTF8))
+ self.ColorAdjustLabel.setText(QtGui.QApplication.translate("Dialog", "Line %1:", None, QtGui.QApplication.UnicodeUTF8))
+ self.label_4.setText(QtGui.QApplication.translate("Dialog", "Row A:", None, QtGui.QApplication.UnicodeUTF8))
+ self.label_5.setText(QtGui.QApplication.translate("Dialog", "Row B:", None, QtGui.QApplication.UnicodeUTF8))
+ self.label_6.setText(QtGui.QApplication.translate("Dialog", "Row C:", None, QtGui.QApplication.UnicodeUTF8))
+ self.label_7.setText(QtGui.QApplication.translate("Dialog", "Row D:", None, QtGui.QApplication.UnicodeUTF8))
+ self.label_8.setText(QtGui.QApplication.translate("Dialog", "Row E:", None, QtGui.QApplication.UnicodeUTF8))
+ self.label_9.setText(QtGui.QApplication.translate("Dialog", "Row F:", None, QtGui.QApplication.UnicodeUTF8))
+ self.label_10.setText(QtGui.QApplication.translate("Dialog", "Row G:", None, QtGui.QApplication.UnicodeUTF8))
+ self.label_11.setText(QtGui.QApplication.translate("Dialog", "Row H:", None, QtGui.QApplication.UnicodeUTF8))
+ self.label_14.setText(QtGui.QApplication.translate("Dialog", "Row I:", None, QtGui.QApplication.UnicodeUTF8))
+ self.label_3.setText(QtGui.QApplication.translate("Dialog", "<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
+"p, li { white-space: pre-wrap; }\n"
+"</style></head><body style=\" font-family:\'DejaVu Sans\'; font-size:10pt; font-weight:400; font-style:normal;\">\n"
+"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-weight:600;\">Follow these steps to complete the alignment:</span> </p>\n"
+"<p style=\" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-weight:600;\">1.</span> Place the alignment page, with the printed side facing down, on the scanner. </p>\n"
+"<p style=\" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-weight:600;\">2.</span> Press the <span style=\" font-style:italic;\">Enter</span> or <span style=\" font-style:italic;\">Scan</span> button on the printer. </p>\n"
+"<p style=\" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-weight:600;\">3.</span> \"Alignment Complete\" will be displayed when the process is finished (on some models with a front panel display) or the green light that was blinking during the process will stop blinking and remain green (on some models without a front panel display).</p></body></html>", None, QtGui.QApplication.UnicodeUTF8))
+ self.label_13.setText(QtGui.QApplication.translate("Dialog", "<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
+"p, li { white-space: pre-wrap; }\n"
+"</style></head><body style=\" font-family:\'DejaVu Sans\'; font-size:10pt; font-weight:400; font-style:normal;\">\n"
+"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-weight:600;\">Cartridge alignment on this printer is only available by accessing the front panel of the printer. </span>Please refer to the user guide for the printer for more information. Click <span style=\" font-style:italic;\">Finish</span> to exit.</p></body></html>", None, QtGui.QApplication.UnicodeUTF8))
+
+from loadpapergroupbox import LoadPaperGroupBox
+from deviceuricombobox import DeviceUriComboBox
diff --git a/ui4/aligndialog_base.ui b/ui4/aligndialog_base.ui
new file mode 100644
index 0000000..0b575c5
--- /dev/null
+++ b/ui4/aligndialog_base.ui
@@ -0,0 +1,850 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>Dialog</class>
+ <widget class="QDialog" name="Dialog">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>700</width>
+ <height>568</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>HP Device Manager - Align Print Cartridges</string>
+ </property>
+ <layout class="QGridLayout">
+ <item row="0" column="0" colspan="3">
+ <widget class="QLabel" name="label">
+ <property name="font">
+ <font>
+ <pointsize>16</pointsize>
+ </font>
+ </property>
+ <property name="text">
+ <string>Align Print Cartridges</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" colspan="5">
+ <widget class="Line" name="line">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0" colspan="5">
+ <widget class="Line" name="line_2">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="0">
+ <widget class="QLabel" name="StepText">
+ <property name="text">
+ <string>Step %1 of %2</string>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="1">
+ <spacer>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>191</width>
+ <height>29</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="4" column="3">
+ <widget class="QPushButton" name="NextButton">
+ <property name="text">
+ <string>Next &gt;</string>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="4">
+ <widget class="QPushButton" name="CancelButton">
+ <property name="text">
+ <string>Cancel</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" colspan="5">
+ <widget class="QStackedWidget" name="StackedWidget">
+ <property name="currentIndex">
+ <number>5</number>
+ </property>
+ <widget class="QWidget" name="StartPage">
+ <layout class="QGridLayout">
+ <item row="0" column="0">
+ <widget class="DeviceUriComboBox" name="DeviceComboBox"/>
+ </item>
+ <item row="1" column="0">
+ <widget class="QGroupBox" name="groupBox">
+ <property name="title">
+ <string/>
+ </property>
+ <layout class="QGridLayout">
+ <item row="0" column="0">
+ <widget class="QLabel" name="label_2">
+ <property name="text">
+ <string>&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
+p, li { white-space: pre-wrap; }
+&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;&quot;&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Select the device to align and click &lt;span style=&quot; font-style:italic;&quot;&gt;Next &amp;gt;&lt;/span&gt; to continue.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <spacer>
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>564</width>
+ <height>161</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="LoadPaperPage">
+ <layout class="QGridLayout">
+ <item row="0" column="0">
+ <widget class="LoadPaperGroupBox" name="LoadPaper">
+ <property name="title">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <spacer>
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>181</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="PaperEdgePage">
+ <layout class="QGridLayout">
+ <item row="0" column="0" colspan="4">
+ <widget class="QLabel" name="PageEdgeTitle">
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <spacer>
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="2" column="0">
+ <spacer>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="2" column="1" colspan="2">
+ <layout class="QHBoxLayout">
+ <item>
+ <widget class="QLabel" name="PageEdgeIcon">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>85</width>
+ <height>90</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>85</width>
+ <height>90</height>
+ </size>
+ </property>
+ <property name="frameShape">
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QComboBox" name="PageEdgeComboBox"/>
+ </item>
+ </layout>
+ </item>
+ <item row="2" column="3">
+ <spacer>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="3" column="2">
+ <spacer>
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="AlignmentNumber">
+ <layout class="QGridLayout">
+ <item row="0" column="0" colspan="4">
+ <widget class="QLabel" name="AlignmentNumberTitle">
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <spacer>
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="2" column="0">
+ <spacer>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="2" column="1" colspan="2">
+ <layout class="QHBoxLayout">
+ <item>
+ <widget class="QLabel" name="AlignmentNumberIcon">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>85</width>
+ <height>90</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>85</width>
+ <height>90</height>
+ </size>
+ </property>
+ <property name="frameShape">
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QComboBox" name="AlignmentNumberComboBox"/>
+ </item>
+ </layout>
+ </item>
+ <item row="2" column="3">
+ <spacer>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="3" column="2">
+ <spacer>
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="ColorAdjPage">
+ <layout class="QGridLayout">
+ <item row="0" column="0" colspan="5">
+ <widget class="QLabel" name="label_12">
+ <property name="text">
+ <string>Choose the numbered colored box that the color &lt;b&gt;best &lt;/b&gt;matches the background color of the bar.</string>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <spacer>
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="2" column="0">
+ <spacer>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="2" column="1">
+ <widget class="QLabel" name="ColorAdjustIcon">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>85</width>
+ <height>90</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>85</width>
+ <height>90</height>
+ </size>
+ </property>
+ <property name="frameShape">
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="2">
+ <spacer>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>31</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="2" column="3">
+ <layout class="QHBoxLayout">
+ <item>
+ <widget class="QLabel" name="ColorAdjustLabel">
+ <property name="text">
+ <string>Line %1:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QComboBox" name="ColorAdjustComboBox"/>
+ </item>
+ </layout>
+ </item>
+ <item row="2" column="4">
+ <spacer>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="3" column="1">
+ <spacer>
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="LBowPage">
+ <layout class="QGridLayout">
+ <item row="0" column="0" colspan="5">
+ <widget class="QLabel" name="LBowTitle">
+ <property name="text">
+ <string/>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <spacer>
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="2" column="0">
+ <spacer>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>41</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="2" column="1">
+ <widget class="QLabel" name="LBowIcon">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>192</width>
+ <height>93</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>192</width>
+ <height>93</height>
+ </size>
+ </property>
+ <property name="frameShape">
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="2">
+ <spacer>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="2" column="4">
+ <spacer>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="3" column="1">
+ <spacer>
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="1" column="3" rowspan="3">
+ <widget class="QGroupBox" name="groupBox_2">
+ <property name="title">
+ <string/>
+ </property>
+ <layout class="QGridLayout">
+ <item row="0" column="0">
+ <layout class="QHBoxLayout">
+ <item>
+ <widget class="QLabel" name="label_4">
+ <property name="text">
+ <string>Row A:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QComboBox" name="aComboBox"/>
+ </item>
+ </layout>
+ </item>
+ <item row="1" column="0">
+ <layout class="QHBoxLayout">
+ <item>
+ <widget class="QLabel" name="label_5">
+ <property name="text">
+ <string>Row B:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QComboBox" name="bComboBox"/>
+ </item>
+ </layout>
+ </item>
+ <item row="2" column="0">
+ <layout class="QHBoxLayout">
+ <item>
+ <widget class="QLabel" name="label_6">
+ <property name="text">
+ <string>Row C:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QComboBox" name="cComboBox"/>
+ </item>
+ </layout>
+ </item>
+ <item row="3" column="0">
+ <layout class="QHBoxLayout">
+ <item>
+ <widget class="QLabel" name="label_7">
+ <property name="text">
+ <string>Row D:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QComboBox" name="dComboBox"/>
+ </item>
+ </layout>
+ </item>
+ <item row="4" column="0">
+ <layout class="QHBoxLayout">
+ <item>
+ <widget class="QLabel" name="label_8">
+ <property name="text">
+ <string>Row E:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QComboBox" name="eComboBox"/>
+ </item>
+ </layout>
+ </item>
+ <item row="5" column="0">
+ <layout class="QHBoxLayout">
+ <item>
+ <widget class="QLabel" name="label_9">
+ <property name="text">
+ <string>Row F:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QComboBox" name="fComboBox"/>
+ </item>
+ </layout>
+ </item>
+ <item row="6" column="0">
+ <layout class="QHBoxLayout">
+ <item>
+ <widget class="QLabel" name="label_10">
+ <property name="text">
+ <string>Row G:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QComboBox" name="gComboBox"/>
+ </item>
+ </layout>
+ </item>
+ <item row="7" column="0">
+ <layout class="QHBoxLayout">
+ <item>
+ <widget class="QLabel" name="label_11">
+ <property name="text">
+ <string>Row H:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QComboBox" name="hComboBox"/>
+ </item>
+ </layout>
+ </item>
+ <item row="8" column="0">
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <widget class="QLabel" name="label_14">
+ <property name="text">
+ <string>Row I:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QComboBox" name="iComboBox"/>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="AioPage">
+ <layout class="QGridLayout">
+ <item row="0" column="1">
+ <spacer>
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="1" column="0">
+ <spacer>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="1" column="1">
+ <widget class="QLabel" name="AioIcon">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>92</width>
+ <height>120</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>92</width>
+ <height>120</height>
+ </size>
+ </property>
+ <property name="frameShape">
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2">
+ <spacer>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="1" column="3">
+ <widget class="QLabel" name="label_3">
+ <property name="text">
+ <string>&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
+p, li { white-space: pre-wrap; }
+&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Follow these steps to complete the alignment:&lt;/span&gt; &lt;/p&gt;
+&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;1.&lt;/span&gt; Place the alignment page, with the printed side facing down, on the scanner. &lt;/p&gt;
+&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;2.&lt;/span&gt; Press the &lt;span style=&quot; font-style:italic;&quot;&gt;Enter&lt;/span&gt; or &lt;span style=&quot; font-style:italic;&quot;&gt;Scan&lt;/span&gt; button on the printer. &lt;/p&gt;
+&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;3.&lt;/span&gt; &quot;Alignment Complete&quot; will be displayed when the process is finished (on some models with a front panel display) or the green light that was blinking during the process will stop blinking and remain green (on some models without a front panel display).&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <spacer>
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="FrontPanelPage">
+ <layout class="QGridLayout">
+ <item row="0" column="0">
+ <widget class="QLabel" name="label_13">
+ <property name="text">
+ <string>&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
+p, li { white-space: pre-wrap; }
+&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Cartridge alignment on this printer is only available by accessing the front panel of the printer. &lt;/span&gt;Please refer to the user guide for the printer for more information. Click &lt;span style=&quot; font-style:italic;&quot;&gt;Finish&lt;/span&gt; to exit.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="textFormat">
+ <enum>Qt::RichText</enum>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <spacer>
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <customwidgets>
+ <customwidget>
+ <class>DeviceUriComboBox</class>
+ <extends>QComboBox</extends>
+ <header>deviceuricombobox.h</header>
+ </customwidget>
+ <customwidget>
+ <class>LoadPaperGroupBox</class>
+ <extends>QGroupBox</extends>
+ <header>loadpapergroupbox.h</header>
+ <container>1</container>
+ </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/ui4/cleandialog.py b/ui4/cleandialog.py
new file mode 100644
index 0000000..df84f85
--- /dev/null
+++ b/ui4/cleandialog.py
@@ -0,0 +1,346 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2001-2008 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Authors: Don Welch
+#
+
+# StdLib
+import operator
+
+# Local
+from base.g import *
+from base import device, utils, maint
+from prnt import cups
+from base.codes import *
+from ui_utils import *
+
+# Qt
+from PyQt4.QtCore import *
+from PyQt4.QtGui import *
+
+# Ui
+from cleandialog_base import Ui_Dialog
+
+
+CLEAN_TYPE_INITIAL = 1000
+CLEAN_TYPE_TEST = 1001
+
+PAGE_START = 0
+PAGE_LEVEL_1 = 1
+PAGE_LEVEL_2 = 2
+PAGE_LEVEL_3 = 3
+PAGE_FRONT_PANEL = 4
+
+BUTTON_CLEAN = 0
+BUTTON_NEXT = 1
+BUTTON_FINISH = 2
+
+
+#d = None
+def true():
+ return True
+
+
+
+class CleanDialog(QDialog, Ui_Dialog):
+ def __init__(self, parent, device_uri):
+ QDialog.__init__(self, parent)
+ self.setupUi(self)
+ self.device_uri = device_uri
+ self.clean_type = CLEAN_TYPE_INITIAL
+ self.abort = False
+ self.seq_index = 0
+ self.step = 1
+ self.step_max = 0
+
+ self.max_steps = {
+ CLEAN_TYPE_UNSUPPORTED : 1,
+ CLEAN_TYPE_PCL : 4,
+ CLEAN_TYPE_LIDIL : 4,
+ CLEAN_TYPE_PCL_WITH_PRINTOUT : 4,
+ }
+
+ self.seq = { # (func|method, tuple of params|None)
+ CLEAN_TYPE_INITIAL: [ # (used when starting up and clean-type isn't known)
+ (self.showStartPage, None),
+ (self.endStartPage, None), # switch to a valid clean-type here
+ ],
+
+ CLEAN_TYPE_UNSUPPORTED : [
+ (self.showFrontPanelPage, None),
+ (self.endFrontPanelPage, None),
+ (self.close, None),
+ ],
+
+ CLEAN_TYPE_PCL : [ # 1
+ (self.showLevel1Page, None),
+ (self.endLevel1Page, None),
+ (self.doClean, (1,)),
+ (self.showLevel2Page, None),
+ (self.endLevel2Page, None),
+ (self.doClean, (2,)),
+ (self.showLevel3Page, None),
+ (self.endLevel3Page, None),
+ (self.doClean, (3,)),
+ (self.close, None),
+ ],
+
+ CLEAN_TYPE_LIDIL : [ # 2
+ (self.showLevel1Page, None),
+ (self.endLevel1Page, None),
+ (self.doClean, (1,)),
+ (self.showLevel2Page, None),
+ (self.endLevel2Page, None),
+ (self.doClean, (2,)),
+ (self.showLevel3Page, None),
+ (self.endLevel3Page, None),
+ (self.doClean, (3,)),
+ (self.close, None),
+ ],
+
+ CLEAN_TYPE_PCL_WITH_PRINTOUT : [ # 3
+ (self.showLevel1Page, None),
+ (self.endLevel1Page, None),
+ (self.doClean, (1,)),
+ (self.showLevel2Page, None),
+ (self.endLevel2Page, None),
+ (self.doClean, (2,)),
+ (self.showLevel3Page, None),
+ (self.endLevel3Page, None),
+ (self.doClean, (3,)),
+ # TODO: Add print-out
+ (self.close, None),
+ ],
+ }
+
+
+ self.initUi()
+ QTimer.singleShot(0, self.nextSequence)
+
+
+ def initUi(self):
+ # connect signals/slots
+ self.connect(self.CancelButton, SIGNAL("clicked()"), self.CancelButton_clicked)
+ self.connect(self.NextButton, SIGNAL("clicked()"), self.NextButton_clicked)
+ self.connect(self.DeviceComboBox, SIGNAL("DeviceUriComboBox_noDevices"), self.DeviceUriComboBox_noDevices)
+ self.connect(self.DeviceComboBox, SIGNAL("DeviceUriComboBox_currentChanged"), self.DeviceUriComboBox_currentChanged)
+ self.DeviceComboBox.setFilter({'clean-type': (operator.gt, 0)})
+
+ if self.device_uri:
+ self.DeviceComboBox.setInitialDevice(self.device_uri)
+
+ # Application icon
+ self.setWindowIcon(QIcon(load_pixmap('hp_logo', '128x128')))
+
+
+ def NextButton_clicked(self):
+ self.nextSequence()
+
+
+ def nextSequence(self):
+ while True:
+ try:
+ seq, params = self.seq[self.clean_type][self.seq_index]
+ except IndexError:
+ break
+
+ if seq is None:
+ self.seq_index += 1
+ continue
+
+ self.new_page = False
+
+ t = []
+ if params is not None:
+ for p in params:
+ try:
+ t.append(p())
+ except:
+ t.append(p)
+
+ try:
+ log.debug("%s(%s)" % (seq.func_name, ','.join([repr(x) for x in t])))
+ except AttributeError:
+ pass
+
+ try:
+ seq(*t)
+ except Error:
+ CheckDeviceUI(self)
+ break
+
+ self.seq_index += 1
+
+ if self.new_page:
+ break
+
+ if self.abort:
+ self.close()
+
+
+ def showStartPage(self):
+ self.setCleanButton(BUTTON_NEXT)
+ num_devices = self.DeviceComboBox.setDevices()
+
+ if num_devices == 1:
+ self.skipPage()
+ return
+
+ self.DeviceComboBox.updateUi()
+ self.displayPage(PAGE_START)
+
+
+ def endStartPage(self):
+ self.mq = device.queryModelByURI(self.device_uri)
+ self.clean_type = self.mq.get('clean-type', CLEAN_TYPE_NONE)
+ self.seq_index = -1
+
+ log.debug("clean-type=%d" % self.clean_type)
+ self.step_max = self.max_steps[self.clean_type]
+
+ try:
+ self.dev = device.Device(self.device_uri)
+ except Error:
+ CheckDeviceUI(self)
+ return
+
+
+ def showLevel1Page(self):
+ self.setCleanButton(BUTTON_CLEAN)
+ self.displayPage(PAGE_LEVEL_1)
+
+
+ def endLevel1Page(self):
+ pass
+
+
+ def showLevel2Page(self):
+ self.displayPage(PAGE_LEVEL_2)
+
+
+ def endLevel2Page(self):
+ pass
+
+
+ def showLevel3Page(self):
+ self.displayPage(PAGE_LEVEL_3)
+
+
+ def endLevel3Page(self):
+ pass
+
+
+ def showFrontPanelPage(self):
+ self.setCleanButton(BUTTON_FINISH)
+ self.displayPage(PAGE_FRONT_PANEL)
+
+
+ def endFrontPanelPage(self):
+ pass
+
+
+ def DeviceUriComboBox_currentChanged(self, device_uri):
+ self.device_uri = device_uri
+
+
+ def DeviceUriComboBox_noDevices(self):
+ FailureUI(self, self.__tr("<b>No devices that support print cartridge cleaning found.</b><p>Click <i>OK</i> to exit.</p>"))
+ self.close()
+
+
+ def CancelButton_clicked(self):
+ self.close()
+
+
+ def doClean(self, level):
+ try:
+ try:
+ self.dev.open()
+ except Error:
+ CheckDeviceUI(self)
+ else:
+ if self.dev.isIdleAndNoError():
+ if self.clean_type in (CLEAN_TYPE_PCL, # 1
+ CLEAN_TYPE_PCL_WITH_PRINTOUT): # 3
+
+ if level == 1:
+ maint.cleanType1(self.dev)
+
+ elif level == 2:
+ maint.primeType1(self.dev)
+
+ else: # 3
+ maint.wipeAndSpitType1(self.dev)
+
+
+ elif self.clean_type == CLEAN_TYPE_LIDIL: # 2
+ if level == 1:
+ maint.cleanType2(self.dev)
+
+ elif level == 2:
+ maint.primeType2(self.dev)
+
+ else: # 3
+ maint.wipeAndSpitType2(self.dev)
+
+ maint.print_clean_test_page(self.dev)
+
+ else:
+ CheckDeviceUI(self)
+
+ finally:
+ if self.dev is not None:
+ self.dev.close()
+
+
+ #
+ # Misc
+ #
+
+ def displayPage(self, page):
+ self.updateStepText(self.step)
+ self.step += 1
+ self.new_page = True
+ self.StackedWidget.setCurrentIndex(page)
+
+
+ def skipPage(self):
+ self.step += 1
+ self.new_page = False
+
+
+ def updateStepText(self, p=None):
+ if p is None or not self.step_max:
+ self.StepText.setText(QString(""))
+ else:
+ self.StepText.setText(self.__tr("Step %1 of %2").arg(p).arg(self.step_max))
+
+
+ def setCleanButton(self, typ=BUTTON_CLEAN):
+ if typ == BUTTON_CLEAN:
+ self.NextButton.setText(self.__tr("Clean"))
+ elif typ == BUTTON_NEXT:
+ self.NextButton.setText(self.__tr("Next >"))
+ elif typ == BUTTON_FINISH:
+ self.NextButton.setText(self.__tr("Finish"))
+
+
+ def __tr(self,s,c = None):
+ return qApp.translate("CleanDialog",s,c)
+
+
diff --git a/ui4/cleandialog_base.py b/ui4/cleandialog_base.py
new file mode 100644
index 0000000..319bc72
--- /dev/null
+++ b/ui4/cleandialog_base.py
@@ -0,0 +1,169 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'ui4/cleandialog_base.ui'
+#
+# Created: Mon May 4 14:30:31 2009
+# by: PyQt4 UI code generator 4.4.4
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt4 import QtCore, QtGui
+
+class Ui_Dialog(object):
+ def setupUi(self, Dialog):
+ Dialog.setObjectName("Dialog")
+ Dialog.resize(700, 500)
+ self.gridlayout = QtGui.QGridLayout(Dialog)
+ self.gridlayout.setObjectName("gridlayout")
+ self.label = QtGui.QLabel(Dialog)
+ font = QtGui.QFont()
+ font.setPointSize(16)
+ self.label.setFont(font)
+ self.label.setObjectName("label")
+ self.gridlayout.addWidget(self.label, 0, 0, 1, 2)
+ self.line = QtGui.QFrame(Dialog)
+ self.line.setFrameShape(QtGui.QFrame.HLine)
+ self.line.setFrameShadow(QtGui.QFrame.Sunken)
+ self.line.setObjectName("line")
+ self.gridlayout.addWidget(self.line, 1, 0, 1, 4)
+ self.StackedWidget = QtGui.QStackedWidget(Dialog)
+ self.StackedWidget.setFrameShape(QtGui.QFrame.NoFrame)
+ self.StackedWidget.setObjectName("StackedWidget")
+ self.StartPage = QtGui.QWidget()
+ self.StartPage.setObjectName("StartPage")
+ self.gridlayout1 = QtGui.QGridLayout(self.StartPage)
+ self.gridlayout1.setObjectName("gridlayout1")
+ self.DeviceComboBox = DeviceUriComboBox(self.StartPage)
+ self.DeviceComboBox.setObjectName("DeviceComboBox")
+ self.gridlayout1.addWidget(self.DeviceComboBox, 0, 0, 1, 1)
+ self.groupBox = QtGui.QGroupBox(self.StartPage)
+ self.groupBox.setObjectName("groupBox")
+ self.gridlayout2 = QtGui.QGridLayout(self.groupBox)
+ self.gridlayout2.setObjectName("gridlayout2")
+ self.Prompt = QtGui.QLabel(self.groupBox)
+ self.Prompt.setObjectName("Prompt")
+ self.gridlayout2.addWidget(self.Prompt, 0, 0, 1, 1)
+ self.gridlayout1.addWidget(self.groupBox, 1, 0, 1, 1)
+ spacerItem = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ self.gridlayout1.addItem(spacerItem, 2, 0, 1, 1)
+ self.StackedWidget.addWidget(self.StartPage)
+ self.Level1Page = QtGui.QWidget()
+ self.Level1Page.setObjectName("Level1Page")
+ self.gridlayout3 = QtGui.QGridLayout(self.Level1Page)
+ self.gridlayout3.setObjectName("gridlayout3")
+ self.LoadPaper = LoadPaperGroupBox(self.Level1Page)
+ self.LoadPaper.setObjectName("LoadPaper")
+ self.gridlayout3.addWidget(self.LoadPaper, 0, 0, 1, 1)
+ self.groupBox_2 = QtGui.QGroupBox(self.Level1Page)
+ self.groupBox_2.setObjectName("groupBox_2")
+ self.gridlayout4 = QtGui.QGridLayout(self.groupBox_2)
+ self.gridlayout4.setObjectName("gridlayout4")
+ self.Prompt_2 = QtGui.QLabel(self.groupBox_2)
+ self.Prompt_2.setWordWrap(True)
+ self.Prompt_2.setObjectName("Prompt_2")
+ self.gridlayout4.addWidget(self.Prompt_2, 0, 0, 1, 1)
+ self.gridlayout3.addWidget(self.groupBox_2, 1, 0, 1, 1)
+ spacerItem1 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ self.gridlayout3.addItem(spacerItem1, 2, 0, 1, 1)
+ self.StackedWidget.addWidget(self.Level1Page)
+ self.Level2Page = QtGui.QWidget()
+ self.Level2Page.setObjectName("Level2Page")
+ self.gridlayout5 = QtGui.QGridLayout(self.Level2Page)
+ self.gridlayout5.setObjectName("gridlayout5")
+ self.LoadPaper_2 = LoadPaperGroupBox(self.Level2Page)
+ self.LoadPaper_2.setObjectName("LoadPaper_2")
+ self.gridlayout5.addWidget(self.LoadPaper_2, 0, 0, 1, 1)
+ self.groupBox_3 = QtGui.QGroupBox(self.Level2Page)
+ self.groupBox_3.setObjectName("groupBox_3")
+ self.gridlayout6 = QtGui.QGridLayout(self.groupBox_3)
+ self.gridlayout6.setObjectName("gridlayout6")
+ self.Prompt_5 = QtGui.QLabel(self.groupBox_3)
+ self.Prompt_5.setWordWrap(True)
+ self.Prompt_5.setObjectName("Prompt_5")
+ self.gridlayout6.addWidget(self.Prompt_5, 0, 0, 1, 1)
+ self.gridlayout5.addWidget(self.groupBox_3, 1, 0, 1, 1)
+ spacerItem2 = QtGui.QSpacerItem(20, 91, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ self.gridlayout5.addItem(spacerItem2, 2, 0, 1, 1)
+ self.StackedWidget.addWidget(self.Level2Page)
+ self.Level3Page = QtGui.QWidget()
+ self.Level3Page.setObjectName("Level3Page")
+ self.gridlayout7 = QtGui.QGridLayout(self.Level3Page)
+ self.gridlayout7.setObjectName("gridlayout7")
+ self.LoadPaper_3 = LoadPaperGroupBox(self.Level3Page)
+ self.LoadPaper_3.setObjectName("LoadPaper_3")
+ self.gridlayout7.addWidget(self.LoadPaper_3, 0, 0, 1, 1)
+ self.groupBox_4 = QtGui.QGroupBox(self.Level3Page)
+ self.groupBox_4.setObjectName("groupBox_4")
+ self.gridlayout8 = QtGui.QGridLayout(self.groupBox_4)
+ self.gridlayout8.setObjectName("gridlayout8")
+ self.Prompt_6 = QtGui.QLabel(self.groupBox_4)
+ self.Prompt_6.setWordWrap(True)
+ self.Prompt_6.setObjectName("Prompt_6")
+ self.gridlayout8.addWidget(self.Prompt_6, 0, 0, 1, 1)
+ self.gridlayout7.addWidget(self.groupBox_4, 1, 0, 1, 1)
+ spacerItem3 = QtGui.QSpacerItem(20, 71, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ self.gridlayout7.addItem(spacerItem3, 2, 0, 1, 1)
+ self.StackedWidget.addWidget(self.Level3Page)
+ self.FrontPanelPage = QtGui.QWidget()
+ self.FrontPanelPage.setObjectName("FrontPanelPage")
+ self.gridlayout9 = QtGui.QGridLayout(self.FrontPanelPage)
+ self.gridlayout9.setObjectName("gridlayout9")
+ self.label_2 = QtGui.QLabel(self.FrontPanelPage)
+ self.label_2.setTextFormat(QtCore.Qt.RichText)
+ self.label_2.setWordWrap(True)
+ self.label_2.setObjectName("label_2")
+ self.gridlayout9.addWidget(self.label_2, 0, 0, 1, 1)
+ spacerItem4 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ self.gridlayout9.addItem(spacerItem4, 1, 0, 1, 1)
+ self.StackedWidget.addWidget(self.FrontPanelPage)
+ self.gridlayout.addWidget(self.StackedWidget, 2, 0, 1, 4)
+ self.line_2 = QtGui.QFrame(Dialog)
+ self.line_2.setFrameShape(QtGui.QFrame.HLine)
+ self.line_2.setFrameShadow(QtGui.QFrame.Sunken)
+ self.line_2.setObjectName("line_2")
+ self.gridlayout.addWidget(self.line_2, 4, 0, 1, 4)
+ self.StepText = QtGui.QLabel(Dialog)
+ self.StepText.setObjectName("StepText")
+ self.gridlayout.addWidget(self.StepText, 5, 0, 1, 1)
+ spacerItem5 = QtGui.QSpacerItem(351, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+ self.gridlayout.addItem(spacerItem5, 5, 1, 1, 1)
+ self.NextButton = QtGui.QPushButton(Dialog)
+ self.NextButton.setObjectName("NextButton")
+ self.gridlayout.addWidget(self.NextButton, 5, 2, 1, 1)
+ self.CancelButton = QtGui.QPushButton(Dialog)
+ self.CancelButton.setObjectName("CancelButton")
+ self.gridlayout.addWidget(self.CancelButton, 5, 3, 1, 1)
+
+ self.retranslateUi(Dialog)
+ self.StackedWidget.setCurrentIndex(0)
+ QtCore.QMetaObject.connectSlotsByName(Dialog)
+
+ def retranslateUi(self, Dialog):
+ Dialog.setWindowTitle(QtGui.QApplication.translate("Dialog", "HP Device Manager - Clean Print Cartridges", None, QtGui.QApplication.UnicodeUTF8))
+ self.label.setText(QtGui.QApplication.translate("Dialog", "Clean Print Cartridges", None, QtGui.QApplication.UnicodeUTF8))
+ self.Prompt.setText(QtGui.QApplication.translate("Dialog", "<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
+"p, li { white-space: pre-wrap; }\n"
+"</style></head><body style=\" font-family:\'DejaVu Sans\'; font-size:10pt; font-weight:400; font-style:normal;\">\n"
+"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">Click<span style=\" font-style:italic;\"> Next</span> to begin the cleaning process.</p></body></html>", None, QtGui.QApplication.UnicodeUTF8))
+ self.Prompt_2.setText(QtGui.QApplication.translate("Dialog", "<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
+"p, li { white-space: pre-wrap; }\n"
+"</style></head><body style=\" font-family:\'DejaVu Sans\'; font-size:10pt; font-weight:400; font-style:normal;\">\n"
+"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">Click <span style=\" font-style:italic;\">Clean</span> to begin the level 1 cleaning process.</p></body></html>", None, QtGui.QApplication.UnicodeUTF8))
+ self.Prompt_5.setText(QtGui.QApplication.translate("Dialog", "<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
+"p, li { white-space: pre-wrap; }\n"
+"</style></head><body style=\" font-family:\'DejaVu Sans\'; font-size:10pt; font-weight:400; font-style:normal;\">\n"
+"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-weight:600;\">Cleaning level 1 is done after the page being printed is complete.</span> If the printed output from level 1 cleaning is acceptable, then click <span style=\" font-style:italic;\">Cancel</span> to exit. Otherwise, click <span style=\" font-style:italic;\">Clean</span> again to begin the level 2 cleaning process.</p></body></html>", None, QtGui.QApplication.UnicodeUTF8))
+ self.Prompt_6.setText(QtGui.QApplication.translate("Dialog", "<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
+"p, li { white-space: pre-wrap; }\n"
+"</style></head><body style=\" font-family:\'DejaVu Sans\'; font-size:10pt; font-weight:400; font-style:normal;\">\n"
+"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-weight:600;\">Cleaning level 2 is done after the page being printed is complete.</span> If the printed output from level 2 cleaning is acceptable, then click <span style=\" font-style:italic;\">Cancel</span> to exit. Otherwise, click <span style=\" font-style:italic;\">Clean</span> again to begin the level 3 cleaning process. </p></body></html>", None, QtGui.QApplication.UnicodeUTF8))
+ self.label_2.setText(QtGui.QApplication.translate("Dialog", "<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
+"p, li { white-space: pre-wrap; }\n"
+"</style></head><body style=\" font-family:\'DejaVu Sans\'; font-size:10pt; font-weight:400; font-style:normal;\">\n"
+"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-weight:600;\">Cartridge cleaning on this printer is only available by accessing the front panel of the printer. </span>Please refer to the user guide for the printer for more information. Click <span style=\" font-style:italic;\">Finish</span> to exit.</p></body></html>", None, QtGui.QApplication.UnicodeUTF8))
+ self.StepText.setText(QtGui.QApplication.translate("Dialog", "Step %1 of %2", None, QtGui.QApplication.UnicodeUTF8))
+ self.NextButton.setText(QtGui.QApplication.translate("Dialog", "Next >", None, QtGui.QApplication.UnicodeUTF8))
+ self.CancelButton.setText(QtGui.QApplication.translate("Dialog", "Cancel", None, QtGui.QApplication.UnicodeUTF8))
+
+from loadpapergroupbox import LoadPaperGroupBox
+from deviceuricombobox import DeviceUriComboBox
diff --git a/ui4/cleandialog_base.ui b/ui4/cleandialog_base.ui
new file mode 100644
index 0000000..0c8c481
--- /dev/null
+++ b/ui4/cleandialog_base.ui
@@ -0,0 +1,313 @@
+<ui version="4.0" >
+ <class>Dialog</class>
+ <widget class="QDialog" name="Dialog" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>700</width>
+ <height>500</height>
+ </rect>
+ </property>
+ <property name="windowTitle" >
+ <string>HP Device Manager - Clean Print Cartridges</string>
+ </property>
+ <layout class="QGridLayout" >
+ <item row="0" column="0" colspan="2" >
+ <widget class="QLabel" name="label" >
+ <property name="font" >
+ <font>
+ <pointsize>16</pointsize>
+ </font>
+ </property>
+ <property name="text" >
+ <string>Clean Print Cartridges</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" colspan="4" >
+ <widget class="Line" name="line" >
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" colspan="4" >
+ <widget class="QStackedWidget" name="StackedWidget" >
+ <property name="frameShape" >
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="currentIndex" >
+ <number>0</number>
+ </property>
+ <widget class="QWidget" name="StartPage" >
+ <layout class="QGridLayout" >
+ <item row="0" column="0" >
+ <widget class="DeviceUriComboBox" name="DeviceComboBox" />
+ </item>
+ <item row="1" column="0" >
+ <widget class="QGroupBox" name="groupBox" >
+ <property name="title" >
+ <string/>
+ </property>
+ <layout class="QGridLayout" >
+ <item row="0" column="0" >
+ <widget class="QLabel" name="Prompt" >
+ <property name="text" >
+ <string>&lt;html>&lt;head>&lt;meta name="qrichtext" content="1" />&lt;style type="text/css">
+p, li { white-space: pre-wrap; }
+&lt;/style>&lt;/head>&lt;body style=" font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;">
+&lt;p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Click&lt;span style=" font-style:italic;"> Next&lt;/span> to begin the cleaning process.&lt;/p>&lt;/body>&lt;/html></string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="2" column="0" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="Level1Page" >
+ <layout class="QGridLayout" >
+ <item row="0" column="0" >
+ <widget class="LoadPaperGroupBox" name="LoadPaper" >
+ <property name="title" >
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QGroupBox" name="groupBox_2" >
+ <property name="title" >
+ <string/>
+ </property>
+ <layout class="QGridLayout" >
+ <item row="0" column="0" >
+ <widget class="QLabel" name="Prompt_2" >
+ <property name="text" >
+ <string>&lt;html>&lt;head>&lt;meta name="qrichtext" content="1" />&lt;style type="text/css">
+p, li { white-space: pre-wrap; }
+&lt;/style>&lt;/head>&lt;body style=" font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;">
+&lt;p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Click &lt;span style=" font-style:italic;">Clean&lt;/span> to begin the level 1 cleaning process.&lt;/p>&lt;/body>&lt;/html></string>
+ </property>
+ <property name="wordWrap" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="2" column="0" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="Level2Page" >
+ <layout class="QGridLayout" >
+ <item row="0" column="0" >
+ <widget class="LoadPaperGroupBox" name="LoadPaper_2" >
+ <property name="title" >
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QGroupBox" name="groupBox_3" >
+ <property name="title" >
+ <string/>
+ </property>
+ <layout class="QGridLayout" >
+ <item row="0" column="0" >
+ <widget class="QLabel" name="Prompt_5" >
+ <property name="text" >
+ <string>&lt;html>&lt;head>&lt;meta name="qrichtext" content="1" />&lt;style type="text/css">
+p, li { white-space: pre-wrap; }
+&lt;/style>&lt;/head>&lt;body style=" font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;">
+&lt;p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">&lt;span style=" font-weight:600;">Cleaning level 1 is done after the page being printed is complete.&lt;/span> If the printed output from level 1 cleaning is acceptable, then click &lt;span style=" font-style:italic;">Cancel&lt;/span> to exit. Otherwise, click &lt;span style=" font-style:italic;">Clean&lt;/span> again to begin the level 2 cleaning process.&lt;/p>&lt;/body>&lt;/html></string>
+ </property>
+ <property name="wordWrap" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="2" column="0" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>20</width>
+ <height>91</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="Level3Page" >
+ <layout class="QGridLayout" >
+ <item row="0" column="0" >
+ <widget class="LoadPaperGroupBox" name="LoadPaper_3" >
+ <property name="title" >
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QGroupBox" name="groupBox_4" >
+ <property name="title" >
+ <string/>
+ </property>
+ <layout class="QGridLayout" >
+ <item row="0" column="0" >
+ <widget class="QLabel" name="Prompt_6" >
+ <property name="text" >
+ <string>&lt;html>&lt;head>&lt;meta name="qrichtext" content="1" />&lt;style type="text/css">
+p, li { white-space: pre-wrap; }
+&lt;/style>&lt;/head>&lt;body style=" font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;">
+&lt;p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">&lt;span style=" font-weight:600;">Cleaning level 2 is done after the page being printed is complete.&lt;/span> If the printed output from level 2 cleaning is acceptable, then click &lt;span style=" font-style:italic;">Cancel&lt;/span> to exit. Otherwise, click &lt;span style=" font-style:italic;">Clean&lt;/span> again to begin the level 3 cleaning process. &lt;/p>&lt;/body>&lt;/html></string>
+ </property>
+ <property name="wordWrap" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="2" column="0" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>20</width>
+ <height>71</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="FrontPanelPage" >
+ <layout class="QGridLayout" >
+ <item row="0" column="0" >
+ <widget class="QLabel" name="label_2" >
+ <property name="text" >
+ <string>&lt;html>&lt;head>&lt;meta name="qrichtext" content="1" />&lt;style type="text/css">
+p, li { white-space: pre-wrap; }
+&lt;/style>&lt;/head>&lt;body style=" font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;">
+&lt;p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">&lt;span style=" font-weight:600;">Cartridge cleaning on this printer is only available by accessing the front panel of the printer. &lt;/span>Please refer to the user guide for the printer for more information. Click &lt;span style=" font-style:italic;">Finish&lt;/span> to exit.&lt;/p>&lt;/body>&lt;/html></string>
+ </property>
+ <property name="textFormat" >
+ <enum>Qt::RichText</enum>
+ </property>
+ <property name="wordWrap" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ </item>
+ <item row="4" column="0" colspan="4" >
+ <widget class="Line" name="line_2" >
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="0" >
+ <widget class="QLabel" name="StepText" >
+ <property name="text" >
+ <string>Step %1 of %2</string>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="1" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>351</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="5" column="2" >
+ <widget class="QPushButton" name="NextButton" >
+ <property name="text" >
+ <string>Next ></string>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="3" >
+ <widget class="QPushButton" name="CancelButton" >
+ <property name="text" >
+ <string>Cancel</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <customwidgets>
+ <customwidget>
+ <class>DeviceUriComboBox</class>
+ <extends>QComboBox</extends>
+ <header>deviceuricombobox.h</header>
+ </customwidget>
+ <customwidget>
+ <class>LoadPaperGroupBox</class>
+ <extends>QGroupBox</extends>
+ <header>loadpapergroupbox.h</header>
+ <container>1</container>
+ </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/ui4/colorcaldialog.py b/ui4/colorcaldialog.py
new file mode 100644
index 0000000..d6956a1
--- /dev/null
+++ b/ui4/colorcaldialog.py
@@ -0,0 +1,435 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2001-2008 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Authors: Don Welch
+#
+
+# StdLib
+import operator
+
+# Local
+from base.g import *
+from base import device, utils, maint
+from prnt import cups
+from base.codes import *
+from ui_utils import *
+
+# Qt
+from PyQt4.QtCore import *
+from PyQt4.QtGui import *
+
+# Ui
+from colorcaldialog_base import Ui_Dialog
+
+
+COLOR_CAL_TYPE_INITIAL = 1000
+COLOR_CAL_TYPE_TEST = 1001
+
+PAGE_START = 0
+PAGE_LOAD_PAPER = 1
+PAGE_DESKJET_450 = 2
+PAGE_CRICK = 3
+PAGE_LBOW = 4
+PAGE_CONNERY = 5
+PAGE_FRONT_PANEL = 6
+
+
+BUTTON_CALIBRATE = 0
+BUTTON_NEXT = 1
+BUTTON_FINISH = 2
+
+
+def true():
+ return True
+
+
+class ColorCalDialog(QDialog, Ui_Dialog):
+ def __init__(self, parent, device_uri):
+ QDialog.__init__(self, parent)
+ self.setupUi(self)
+ self.device_uri = device_uri
+ self.color_cal_type = COLOR_CAL_TYPE_INITIAL
+ self.a, self.b = 0, 0
+ self.step = 1
+ self.abort = False
+ self.seq_index = 0
+ self.value = 0
+ self.values = []
+ self.step_max = 0
+
+ self.max_steps = {
+ COLOR_CAL_TYPE_UNSUPPORTED : 1,
+ COLOR_CAL_TYPE_DESKJET_450 : 2,
+ COLOR_CAL_TYPE_MALIBU_CRICK : 0,
+ COLOR_CAL_TYPE_STRINGRAY_LONGBOW_TORNADO : 0,
+ COLOR_CAL_TYPE_CONNERY : 0,
+ COLOR_CAL_TYPE_COUSTEAU : 0,
+ COLOR_CAL_TYPE_CARRIER : 0,
+ COLOR_CAL_TYPE_TYPHOON : 0,
+ }
+
+ self.seq = { # (func|method, tuple of params|None)
+ COLOR_CAL_TYPE_INITIAL: [ # (used when starting up and align-type isn't known)
+ (self.showStartPage, None),
+ (self.endStartPage, None), # switch to a valid align-type here
+ ],
+
+ COLOR_CAL_TYPE_UNSUPPORTED : [
+ (self.showFrontPanelPage, None),
+ (self.endFrontPanelPage, None),
+ (self.close, None),
+ ],
+
+ COLOR_CAL_TYPE_DESKJET_450 : [ # 1
+ (self.colorCalType1PenCheck, None),
+ (self.showLoadPaperPage, None),
+ (self.endLoadPaperPage, None),
+ (maint.colorCalType1Phase1, (lambda: self.dev,)),
+ (self.setColorCalButton, (BUTTON_CALIBRATE,)),
+ (self.showDeskjet450Page, None),
+ (self.endDeskjet450Page, None),
+ (maint.colorCalType1Phase2, (lambda: self.dev, lambda: self.value)),
+ (self.close, None),
+ ],
+
+ COLOR_CAL_TYPE_MALIBU_CRICK : [ # 2
+ (self.colorCalType2PenCheck, None),
+ (self.showLoadPaperPage, None),
+ (self.endLoadPaperPage, None),
+ (maint.colorCalType1Phase1, (lambda: self.dev,)),
+ (self.setColorCalButton, (BUTTON_CALIBRATE,)),
+ (self.showCrick, None),
+ (self.endCrick, None),
+ (maint.colorCalType2Phase2, (lambda: self.dev, lambda: self.value)),
+ (self.close, None),
+ ],
+
+ COLOR_CAL_TYPE_STRINGRAY_LONGBOW_TORNADO : [ # 3
+ (self.colorCalType3PenCheck, None),
+ (self.showLoadPaperPage, None),
+ (self.endLoadPaperPage, None),
+ (maint.colorCalType3Phase1, (lambda: self.dev,)),
+ (self.showLBowPage, ('A', 21)),
+ (self.endLBowPage, ('A',)),
+ (self.setColorCalButton, (BUTTON_CALIBRATE,)),
+ (self.showLBowPage, ('B', 21)),
+ (self.endLBowPage, ('B',)),
+ (maint.colorCalType3Phase2, (lambda: self.dev, lambda: self.a,
+ lambda: self.b)),
+ (self.close, None),
+ ],
+
+ COLOR_CAL_TYPE_CONNERY : [ #4
+ (self.showLoadPaperPage, None),
+ (self.endLoadPaperPage, None),
+ (maint.colorCalType4Phase1, (lambda: self.dev,)),
+ (self.setColorCalButton, (BUTTON_CALIBRATE,)),
+ (self.showConneryPage, None),
+ (self.endConneryPage, None), # sets self.values (list)
+ (maint.colorCalType4Phase2, (lambda: self.dev, lambda: self.values)),
+ (self.showLoadPaperPage, None),
+ (self.endLoadPaperPage, None),
+ (maint.colorCalType4Phase3, (lambda: self.dev,)),
+ (self.close, None),
+ ],
+
+ COLOR_CAL_TYPE_COUSTEAU : [ #5
+ (self.setColorCalButton, (BUTTON_CALIBRATE,)),
+ (self.showLoadPaperPage, None),
+ (self.endLoadPaperPage, None),
+ (maint.colorCalType5, (lambda: self.dev, lambda: true)),
+ (self.showConneryPage, None),
+ (self.endConneryPage, None),
+ (self.close, None),
+ ],
+
+ COLOR_CAL_TYPE_CARRIER : [ #6
+ (self.setColorCalButton, (BUTTON_CALIBRATE,)),
+ (self.showLoadPaperPage, None),
+ (self.endLoadPaperPage, None),
+ (maint.colorCalType6, (lambda: self.dev, lambda: true)),
+ (self.close, None),
+ ],
+
+ COLOR_CAL_TYPE_TYPHOON : [ #7
+ (self.setColorCalButton, (BUTTON_CALIBRATE,)),
+ (self.showLoadPaperPage, None),
+ (self.endLoadPaperPage, None),
+ (maint.colorCalType7, (lambda: self.dev, lambda: true)),
+ (self.close, None),
+ ],
+ }
+
+
+ self.initUi()
+
+ QTimer.singleShot(0, self.nextSequence)
+
+
+ def initUi(self):
+ # connect signals/slots
+ self.connect(self.CancelButton, SIGNAL("clicked()"), self.CancelButton_clicked)
+ self.connect(self.NextButton, SIGNAL("clicked()"), self.NextButton_clicked)
+ self.connect(self.DeviceComboBox, SIGNAL("DeviceUriComboBox_noDevices"), self.DeviceUriComboBox_noDevices)
+ self.connect(self.DeviceComboBox, SIGNAL("DeviceUriComboBox_currentChanged"), self.DeviceUriComboBox_currentChanged)
+ self.DeviceComboBox.setFilter({'color-cal-type': (operator.gt, 0)})
+
+ if self.device_uri:
+ self.DeviceComboBox.setInitialDevice(self.device_uri)
+
+ # Application icon
+ self.setWindowIcon(QIcon(load_pixmap('hp_logo', '128x128')))
+ self.updateStepText()
+
+
+
+
+ def DeviceUriComboBox_noDevices(self):
+ FailureUI(self, self.__tr("<b>No devices that support print cartridge alignment found.</b><p>Click <i>OK</i> to exit.</p>"))
+ self.close()
+
+
+ def DeviceUriComboBox_currentChanged(self, device_uri):
+ self.device_uri = device_uri
+
+
+ def CancelButton_clicked(self):
+ self.close()
+
+
+ def NextButton_clicked(self):
+ self.nextSequence()
+
+
+ def nextSequence(self):
+ while True:
+ try:
+ seq, params = self.seq[self.color_cal_type][self.seq_index]
+ except IndexError:
+ break
+
+ if seq is None:
+ self.seq_index += 1
+ continue
+
+ self.new_page = False
+
+ t = []
+ if params is not None:
+ for p in params:
+ try:
+ t.append(p())
+ except:
+ t.append(p)
+
+ try:
+ log.debug("%s(%s)" % (seq.func_name, ','.join([repr(x) for x in t])))
+ except AttributeError:
+ pass
+
+ try:
+ seq(*t)
+ except Error:
+ CheckDeviceUI(self)
+ break
+
+ self.seq_index += 1
+
+ if self.new_page:
+ break
+
+ if self.abort:
+ self.close()
+
+
+
+ def showStartPage(self):
+ self.BackButton.setEnabled(False)
+ num_devices = self.DeviceComboBox.setDevices()
+
+ if num_devices == 1:
+ self.skipPage()
+ return
+
+ self.DeviceComboBox.updateUi()
+ self.displayPage(PAGE_START)
+
+
+ def endStartPage(self):
+ self.mq = device.queryModelByURI(self.device_uri)
+ self.color_cal_type = self.mq.get('color-cal-type', COLOR_CAL_TYPE_NONE)
+ self.seq_index = -1
+
+ #self.color_cal_type = COLOR_CAL_TYPE_TEST # XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+
+ log.debug("color-cal-type=%d" % self.color_cal_type)
+ self.step_max = self.max_steps[self.color_cal_type]
+
+ try:
+ self.dev = device.Device(self.device_uri)
+ except Error:
+ CheckDeviceUI(self)
+ return
+
+
+ def showLoadPaperPage(self):
+ self.LoadPaper.updateUi()
+ self.displayPage(PAGE_LOAD_PAPER)
+
+
+ def endLoadPaperPage(self):
+ pass
+
+
+ def showDeskjet450Page(self):
+ self.displayPage(PAGE_DESKJET_450)
+
+
+ def endDeskjet450Page(self):
+ self.value = int(unicode(self.Deskjet450ComboBox.currentText()))
+
+
+ def showCrick(self):
+ self.displayPage(PAGE_CRICK)
+
+
+ def endCrick(self):
+ self.value = self.CrickSpinBox.value()
+
+ def showLBowPage(self, line_id, count=21):
+ self.LBowComboBox.clear()
+ self.LBowIcon.setPixmap(load_pixmap('color_adj', 'other'))
+ self.LBowLabel.setText(self.__tr("Line %1:").arg(line_id))
+
+ for x in range(count):
+ self.LBowComboBox.addItem(QString("%1%2").arg(line_id).arg(x+1))
+
+ self.displayPage(PAGE_LBOW)
+
+
+ def endLBowPage(self, line_id):
+ v = int(str(self.LBowComboBox.currentText())[1:])
+
+ if line_id == 'A':
+ self.a = v
+ log.debug("A=%d" % v)
+
+ elif line_id == 'B':
+ self.b = v
+ log.debug("B=%d" % v)
+
+
+ def showConneryPage(self):
+ self.ConneryGrayPatchIcon.setPixmap(load_pixmap('type4_gray_patch', 'other'))
+ self.ConneryColorPatchIcon.setPixmap(load_pixmap('type4_color_patch', 'other'))
+
+ for x in 'ABCDEFGHIJKLMN':
+ self.ConneryGrayLetterComboBox.addItem(QString(x))
+
+ for x in range(13):
+ self.ConneryGrayNumberComboBox.addItem(QString("%1").arg(x+1))
+
+ for x in 'PQRSTUV':
+ self.ConneryColorLetterComboBox.addItem(QString(x))
+
+ for x in range(6):
+ self.ConneryColorNumberComboBox.addItem(QString("%1").arg(x+1))
+
+ self.displayPage(PAGE_CONNERY)
+
+
+ def endConneryPage(self):
+ if self.ConneryUseFactoryDefaultsCheckBox.checkState() == Qt.Checked:
+ log.debug("Using factory defaults")
+ self.values = [-1, -1, -1, -1]
+ else:
+ self.values = [
+ (ord(str(self.ConneryGrayLetterComboBox.currentText())) - ord('A')),
+ int(str(self.ConneryGrayNumberComboBox.currentText())),
+ (ord(str(self.ConneryColorLetterComboBox.currentText())) - ord('P')),
+ int(str(self.ConneryColorNumberComboBox.currentText()))
+ ]
+
+
+ def showFrontPanelPage(self):
+ self.BackButton.setEnabled(False)
+ self.setColorCalButton(BUTTON_FINISH)
+ self.displayPage(PAGE_FRONT_PANEL)
+
+
+ def endFrontPanelPage(self):
+ pass
+
+ #
+ # Color cal specific
+ #
+
+ def colorCalType1PenCheck(self):
+ if not maint.colorCalType1PenCheck(self.dev):
+ pass # TODO: Error message (photo pen must be inserted)
+
+
+ def colorCalType2PenCheck(self):
+ if not maint.colorCalType2PenCheck(self.dev):
+ pass # TODO: Error message (photo pen must be inserted)
+
+
+ def colorCalType3PenCheck(self):
+ if not maint.colorCalType3PenCheck(self.dev):
+ pass # TODO:
+
+ #
+ # Misc
+ #
+
+ def displayPage(self, page):
+ self.updateStepText(self.step)
+ self.step += 1
+ self.new_page = True
+ self.StackedWidget.setCurrentIndex(page)
+
+
+ def skipPage(self):
+ self.step += 1
+ self.new_page = False
+
+
+ def updateStepText(self, p=None):
+ if p is None or not self.step_max:
+ self.StepText.setText(QString(""))
+ else:
+ self.StepText.setText(self.__tr("Step %1 of %2").arg(p).arg(self.step_max))
+
+
+ def setColorCalButton(self, typ=BUTTON_CALIBRATE):
+ if typ == BUTTON_CALIBRATE:
+ self.NextButton.setText(self.__tr("Calibrate"))
+ elif typ == BUTTON_NEXT:
+ self.NextButton.setText(self.__tr("Next >"))
+ elif typ == BUTTON_FINISH:
+ self.NextButton.setText(self.__tr("Finish"))
+
+
+# def setPenConfig(self):
+# self.dev.pen_config = status.getPenConfiguration(dev.getStatusFromDeviceID())
+
+
+ def __tr(self,s,c = None):
+ return qApp.translate("ColorCalDialog",s,c)
+
+
diff --git a/ui4/colorcaldialog_base.py b/ui4/colorcaldialog_base.py
new file mode 100644
index 0000000..7199db5
--- /dev/null
+++ b/ui4/colorcaldialog_base.py
@@ -0,0 +1,326 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'ui4/colorcaldialog_base.ui'
+#
+# Created: Mon May 4 14:30:31 2009
+# by: PyQt4 UI code generator 4.4.4
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt4 import QtCore, QtGui
+
+class Ui_Dialog(object):
+ def setupUi(self, Dialog):
+ Dialog.setObjectName("Dialog")
+ Dialog.resize(700, 500)
+ self.gridlayout = QtGui.QGridLayout(Dialog)
+ self.gridlayout.setObjectName("gridlayout")
+ self.label = QtGui.QLabel(Dialog)
+ font = QtGui.QFont()
+ font.setPointSize(16)
+ self.label.setFont(font)
+ self.label.setObjectName("label")
+ self.gridlayout.addWidget(self.label, 0, 0, 1, 3)
+ self.line = QtGui.QFrame(Dialog)
+ self.line.setFrameShape(QtGui.QFrame.HLine)
+ self.line.setFrameShadow(QtGui.QFrame.Sunken)
+ self.line.setObjectName("line")
+ self.gridlayout.addWidget(self.line, 1, 0, 1, 5)
+ self.StackedWidget = QtGui.QStackedWidget(Dialog)
+ self.StackedWidget.setFrameShape(QtGui.QFrame.NoFrame)
+ self.StackedWidget.setObjectName("StackedWidget")
+ self.StartPage = QtGui.QWidget()
+ self.StartPage.setObjectName("StartPage")
+ self.gridlayout1 = QtGui.QGridLayout(self.StartPage)
+ self.gridlayout1.setObjectName("gridlayout1")
+ self.DeviceComboBox = DeviceUriComboBox(self.StartPage)
+ self.DeviceComboBox.setObjectName("DeviceComboBox")
+ self.gridlayout1.addWidget(self.DeviceComboBox, 0, 0, 1, 1)
+ self.groupBox = QtGui.QGroupBox(self.StartPage)
+ self.groupBox.setObjectName("groupBox")
+ self.gridlayout2 = QtGui.QGridLayout(self.groupBox)
+ self.gridlayout2.setObjectName("gridlayout2")
+ self.label_2 = QtGui.QLabel(self.groupBox)
+ self.label_2.setObjectName("label_2")
+ self.gridlayout2.addWidget(self.label_2, 0, 0, 1, 1)
+ self.gridlayout1.addWidget(self.groupBox, 1, 0, 1, 1)
+ spacerItem = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ self.gridlayout1.addItem(spacerItem, 2, 0, 1, 1)
+ self.StackedWidget.addWidget(self.StartPage)
+ self.LoadPaperPage = QtGui.QWidget()
+ self.LoadPaperPage.setObjectName("LoadPaperPage")
+ self.gridlayout3 = QtGui.QGridLayout(self.LoadPaperPage)
+ self.gridlayout3.setObjectName("gridlayout3")
+ self.LoadPaper = LoadPaperGroupBox(self.LoadPaperPage)
+ self.LoadPaper.setObjectName("LoadPaper")
+ self.gridlayout3.addWidget(self.LoadPaper, 0, 0, 1, 1)
+ spacerItem1 = QtGui.QSpacerItem(20, 181, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ self.gridlayout3.addItem(spacerItem1, 1, 0, 1, 1)
+ self.StackedWidget.addWidget(self.LoadPaperPage)
+ self.Deskjet450Page = QtGui.QWidget()
+ self.Deskjet450Page.setObjectName("Deskjet450Page")
+ self.gridlayout4 = QtGui.QGridLayout(self.Deskjet450Page)
+ self.gridlayout4.setObjectName("gridlayout4")
+ self.label_3 = QtGui.QLabel(self.Deskjet450Page)
+ self.label_3.setWordWrap(True)
+ self.label_3.setObjectName("label_3")
+ self.gridlayout4.addWidget(self.label_3, 0, 0, 1, 3)
+ spacerItem2 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ self.gridlayout4.addItem(spacerItem2, 1, 1, 1, 1)
+ spacerItem3 = QtGui.QSpacerItem(111, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+ self.gridlayout4.addItem(spacerItem3, 2, 0, 1, 1)
+ self.hboxlayout = QtGui.QHBoxLayout()
+ self.hboxlayout.setObjectName("hboxlayout")
+ self.label_4 = QtGui.QLabel(self.Deskjet450Page)
+ self.label_4.setObjectName("label_4")
+ self.hboxlayout.addWidget(self.label_4)
+ self.Deskjet450ComboBox = QtGui.QComboBox(self.Deskjet450Page)
+ self.Deskjet450ComboBox.setObjectName("Deskjet450ComboBox")
+ self.Deskjet450ComboBox.addItem(QtCore.QString())
+ self.Deskjet450ComboBox.addItem(QtCore.QString())
+ self.Deskjet450ComboBox.addItem(QtCore.QString())
+ self.Deskjet450ComboBox.addItem(QtCore.QString())
+ self.Deskjet450ComboBox.addItem(QtCore.QString())
+ self.Deskjet450ComboBox.addItem(QtCore.QString())
+ self.Deskjet450ComboBox.addItem(QtCore.QString())
+ self.hboxlayout.addWidget(self.Deskjet450ComboBox)
+ self.gridlayout4.addLayout(self.hboxlayout, 2, 1, 1, 1)
+ spacerItem4 = QtGui.QSpacerItem(221, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+ self.gridlayout4.addItem(spacerItem4, 2, 2, 1, 1)
+ spacerItem5 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ self.gridlayout4.addItem(spacerItem5, 3, 1, 1, 1)
+ self.StackedWidget.addWidget(self.Deskjet450Page)
+ self.CrickPage = QtGui.QWidget()
+ self.CrickPage.setObjectName("CrickPage")
+ self.gridlayout5 = QtGui.QGridLayout(self.CrickPage)
+ self.gridlayout5.setObjectName("gridlayout5")
+ self.label_5 = QtGui.QLabel(self.CrickPage)
+ self.label_5.setWordWrap(True)
+ self.label_5.setObjectName("label_5")
+ self.gridlayout5.addWidget(self.label_5, 0, 0, 1, 3)
+ spacerItem6 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ self.gridlayout5.addItem(spacerItem6, 1, 1, 1, 1)
+ spacerItem7 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+ self.gridlayout5.addItem(spacerItem7, 2, 0, 1, 1)
+ self.hboxlayout1 = QtGui.QHBoxLayout()
+ self.hboxlayout1.setObjectName("hboxlayout1")
+ self.label_6 = QtGui.QLabel(self.CrickPage)
+ self.label_6.setObjectName("label_6")
+ self.hboxlayout1.addWidget(self.label_6)
+ self.CrickSpinBox = QtGui.QSpinBox(self.CrickPage)
+ self.CrickSpinBox.setMinimum(1)
+ self.CrickSpinBox.setMaximum(81)
+ self.CrickSpinBox.setProperty("value", QtCore.QVariant(41))
+ self.CrickSpinBox.setObjectName("CrickSpinBox")
+ self.hboxlayout1.addWidget(self.CrickSpinBox)
+ self.gridlayout5.addLayout(self.hboxlayout1, 2, 1, 1, 1)
+ spacerItem8 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+ self.gridlayout5.addItem(spacerItem8, 2, 2, 1, 1)
+ spacerItem9 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ self.gridlayout5.addItem(spacerItem9, 3, 1, 1, 1)
+ self.StackedWidget.addWidget(self.CrickPage)
+ self.LBowPage = QtGui.QWidget()
+ self.LBowPage.setObjectName("LBowPage")
+ self.gridlayout6 = QtGui.QGridLayout(self.LBowPage)
+ self.gridlayout6.setObjectName("gridlayout6")
+ self.label_12 = QtGui.QLabel(self.LBowPage)
+ self.label_12.setWordWrap(True)
+ self.label_12.setObjectName("label_12")
+ self.gridlayout6.addWidget(self.label_12, 0, 0, 1, 5)
+ spacerItem10 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ self.gridlayout6.addItem(spacerItem10, 1, 1, 1, 1)
+ spacerItem11 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+ self.gridlayout6.addItem(spacerItem11, 2, 0, 1, 1)
+ self.LBowIcon = QtGui.QLabel(self.LBowPage)
+ sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.LBowIcon.sizePolicy().hasHeightForWidth())
+ self.LBowIcon.setSizePolicy(sizePolicy)
+ self.LBowIcon.setMinimumSize(QtCore.QSize(85, 90))
+ self.LBowIcon.setMaximumSize(QtCore.QSize(85, 90))
+ self.LBowIcon.setFrameShape(QtGui.QFrame.NoFrame)
+ self.LBowIcon.setObjectName("LBowIcon")
+ self.gridlayout6.addWidget(self.LBowIcon, 2, 1, 1, 1)
+ spacerItem12 = QtGui.QSpacerItem(31, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+ self.gridlayout6.addItem(spacerItem12, 2, 2, 1, 1)
+ self.hboxlayout2 = QtGui.QHBoxLayout()
+ self.hboxlayout2.setObjectName("hboxlayout2")
+ self.LBowLabel = QtGui.QLabel(self.LBowPage)
+ self.LBowLabel.setObjectName("LBowLabel")
+ self.hboxlayout2.addWidget(self.LBowLabel)
+ self.LBowComboBox = QtGui.QComboBox(self.LBowPage)
+ self.LBowComboBox.setObjectName("LBowComboBox")
+ self.hboxlayout2.addWidget(self.LBowComboBox)
+ self.gridlayout6.addLayout(self.hboxlayout2, 2, 3, 1, 1)
+ spacerItem13 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+ self.gridlayout6.addItem(spacerItem13, 2, 4, 1, 1)
+ spacerItem14 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ self.gridlayout6.addItem(spacerItem14, 3, 1, 1, 1)
+ self.StackedWidget.addWidget(self.LBowPage)
+ self.ConneryPage = QtGui.QWidget()
+ self.ConneryPage.setObjectName("ConneryPage")
+ self.gridlayout7 = QtGui.QGridLayout(self.ConneryPage)
+ self.gridlayout7.setObjectName("gridlayout7")
+ self.label_7 = QtGui.QLabel(self.ConneryPage)
+ self.label_7.setWordWrap(True)
+ self.label_7.setObjectName("label_7")
+ self.gridlayout7.addWidget(self.label_7, 0, 0, 1, 5)
+ spacerItem15 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ self.gridlayout7.addItem(spacerItem15, 1, 2, 1, 1)
+ spacerItem16 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+ self.gridlayout7.addItem(spacerItem16, 2, 0, 1, 1)
+ self.hboxlayout3 = QtGui.QHBoxLayout()
+ self.hboxlayout3.setObjectName("hboxlayout3")
+ self.groupBox_2 = QtGui.QGroupBox(self.ConneryPage)
+ self.groupBox_2.setObjectName("groupBox_2")
+ self.gridlayout8 = QtGui.QGridLayout(self.groupBox_2)
+ self.gridlayout8.setObjectName("gridlayout8")
+ spacerItem17 = QtGui.QSpacerItem(21, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+ self.gridlayout8.addItem(spacerItem17, 0, 0, 1, 1)
+ self.ConneryGrayPatchIcon = QtGui.QLabel(self.groupBox_2)
+ sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.ConneryGrayPatchIcon.sizePolicy().hasHeightForWidth())
+ self.ConneryGrayPatchIcon.setSizePolicy(sizePolicy)
+ self.ConneryGrayPatchIcon.setMinimumSize(QtCore.QSize(75, 75))
+ self.ConneryGrayPatchIcon.setMaximumSize(QtCore.QSize(75, 75))
+ self.ConneryGrayPatchIcon.setFrameShape(QtGui.QFrame.NoFrame)
+ self.ConneryGrayPatchIcon.setObjectName("ConneryGrayPatchIcon")
+ self.gridlayout8.addWidget(self.ConneryGrayPatchIcon, 0, 1, 1, 2)
+ spacerItem18 = QtGui.QSpacerItem(21, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+ self.gridlayout8.addItem(spacerItem18, 0, 3, 1, 1)
+ self.ConneryGrayLetterComboBox = QtGui.QComboBox(self.groupBox_2)
+ self.ConneryGrayLetterComboBox.setObjectName("ConneryGrayLetterComboBox")
+ self.gridlayout8.addWidget(self.ConneryGrayLetterComboBox, 1, 0, 1, 2)
+ self.ConneryGrayNumberComboBox = QtGui.QComboBox(self.groupBox_2)
+ self.ConneryGrayNumberComboBox.setObjectName("ConneryGrayNumberComboBox")
+ self.gridlayout8.addWidget(self.ConneryGrayNumberComboBox, 1, 2, 1, 2)
+ self.hboxlayout3.addWidget(self.groupBox_2)
+ self.groupBox_3 = QtGui.QGroupBox(self.ConneryPage)
+ self.groupBox_3.setObjectName("groupBox_3")
+ self.gridlayout9 = QtGui.QGridLayout(self.groupBox_3)
+ self.gridlayout9.setObjectName("gridlayout9")
+ spacerItem19 = QtGui.QSpacerItem(21, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+ self.gridlayout9.addItem(spacerItem19, 0, 0, 1, 1)
+ self.ConneryColorPatchIcon = QtGui.QLabel(self.groupBox_3)
+ sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.ConneryColorPatchIcon.sizePolicy().hasHeightForWidth())
+ self.ConneryColorPatchIcon.setSizePolicy(sizePolicy)
+ self.ConneryColorPatchIcon.setMinimumSize(QtCore.QSize(75, 75))
+ self.ConneryColorPatchIcon.setMaximumSize(QtCore.QSize(75, 75))
+ self.ConneryColorPatchIcon.setFrameShape(QtGui.QFrame.NoFrame)
+ self.ConneryColorPatchIcon.setObjectName("ConneryColorPatchIcon")
+ self.gridlayout9.addWidget(self.ConneryColorPatchIcon, 0, 1, 1, 2)
+ spacerItem20 = QtGui.QSpacerItem(31, 75, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+ self.gridlayout9.addItem(spacerItem20, 0, 3, 1, 1)
+ self.ConneryColorLetterComboBox = QtGui.QComboBox(self.groupBox_3)
+ self.ConneryColorLetterComboBox.setObjectName("ConneryColorLetterComboBox")
+ self.gridlayout9.addWidget(self.ConneryColorLetterComboBox, 1, 0, 1, 2)
+ self.ConneryColorNumberComboBox = QtGui.QComboBox(self.groupBox_3)
+ self.ConneryColorNumberComboBox.setObjectName("ConneryColorNumberComboBox")
+ self.gridlayout9.addWidget(self.ConneryColorNumberComboBox, 1, 2, 1, 2)
+ self.hboxlayout3.addWidget(self.groupBox_3)
+ self.gridlayout7.addLayout(self.hboxlayout3, 2, 1, 1, 3)
+ spacerItem21 = QtGui.QSpacerItem(81, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+ self.gridlayout7.addItem(spacerItem21, 2, 4, 1, 1)
+ spacerItem22 = QtGui.QSpacerItem(20, 21, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ self.gridlayout7.addItem(spacerItem22, 3, 1, 1, 1)
+ spacerItem23 = QtGui.QSpacerItem(20, 51, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ self.gridlayout7.addItem(spacerItem23, 3, 3, 2, 1)
+ self.ConneryUseFactoryDefaultsCheckBox = QtGui.QCheckBox(self.ConneryPage)
+ self.ConneryUseFactoryDefaultsCheckBox.setObjectName("ConneryUseFactoryDefaultsCheckBox")
+ self.gridlayout7.addWidget(self.ConneryUseFactoryDefaultsCheckBox, 4, 0, 1, 2)
+ self.StackedWidget.addWidget(self.ConneryPage)
+ self.FrontPanelPage = QtGui.QWidget()
+ self.FrontPanelPage.setObjectName("FrontPanelPage")
+ self.gridlayout10 = QtGui.QGridLayout(self.FrontPanelPage)
+ self.gridlayout10.setObjectName("gridlayout10")
+ self.label_8 = QtGui.QLabel(self.FrontPanelPage)
+ self.label_8.setWordWrap(True)
+ self.label_8.setObjectName("label_8")
+ self.gridlayout10.addWidget(self.label_8, 0, 0, 1, 1)
+ spacerItem24 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ self.gridlayout10.addItem(spacerItem24, 1, 0, 1, 1)
+ self.StackedWidget.addWidget(self.FrontPanelPage)
+ self.gridlayout.addWidget(self.StackedWidget, 2, 0, 1, 6)
+ self.line_2 = QtGui.QFrame(Dialog)
+ self.line_2.setFrameShape(QtGui.QFrame.HLine)
+ self.line_2.setFrameShadow(QtGui.QFrame.Sunken)
+ self.line_2.setObjectName("line_2")
+ self.gridlayout.addWidget(self.line_2, 3, 0, 1, 5)
+ self.StepText = QtGui.QLabel(Dialog)
+ self.StepText.setObjectName("StepText")
+ self.gridlayout.addWidget(self.StepText, 4, 0, 1, 1)
+ spacerItem25 = QtGui.QSpacerItem(141, 28, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+ self.gridlayout.addItem(spacerItem25, 4, 1, 1, 1)
+ self.BackButton = QtGui.QPushButton(Dialog)
+ self.BackButton.setObjectName("BackButton")
+ self.gridlayout.addWidget(self.BackButton, 4, 2, 1, 1)
+ self.NextButton = QtGui.QPushButton(Dialog)
+ self.NextButton.setObjectName("NextButton")
+ self.gridlayout.addWidget(self.NextButton, 4, 3, 1, 1)
+ self.CancelButton = QtGui.QPushButton(Dialog)
+ self.CancelButton.setObjectName("CancelButton")
+ self.gridlayout.addWidget(self.CancelButton, 4, 4, 1, 1)
+
+ self.retranslateUi(Dialog)
+ self.StackedWidget.setCurrentIndex(0)
+ QtCore.QObject.connect(self.ConneryUseFactoryDefaultsCheckBox, QtCore.SIGNAL("clicked(bool)"), self.groupBox_2.setDisabled)
+ QtCore.QObject.connect(self.ConneryUseFactoryDefaultsCheckBox, QtCore.SIGNAL("clicked(bool)"), self.groupBox_3.setDisabled)
+ QtCore.QMetaObject.connectSlotsByName(Dialog)
+
+ def retranslateUi(self, Dialog):
+ Dialog.setWindowTitle(QtGui.QApplication.translate("Dialog", "HP Device Manager - Printer Color Calibration", None, QtGui.QApplication.UnicodeUTF8))
+ self.label.setText(QtGui.QApplication.translate("Dialog", "Printer Color Calibration", None, QtGui.QApplication.UnicodeUTF8))
+ self.label_2.setText(QtGui.QApplication.translate("Dialog", "<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
+"p, li { white-space: pre-wrap; }\n"
+"</style></head><body style=\" font-family:\'Sans Serif\'; font-size:9pt; font-weight:400; font-style:normal;\">\n"
+"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">Select the device to align and click <span style=\" font-style:italic;\">Next &gt;</span> to continue.</p></body></html>", None, QtGui.QApplication.UnicodeUTF8))
+ self.label_3.setText(QtGui.QApplication.translate("Dialog", "<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
+"p, li { white-space: pre-wrap; }\n"
+"</style></head><body style=\" font-family:\'Sans Serif\'; font-size:9pt; font-weight:400; font-style:normal;\">\n"
+"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">Choose the numbered image labeled \"1\" thru \"7\" that is <span style=\" font-weight:600;\">best color matched</span> to the image labeled \"X\".</p></body></html>", None, QtGui.QApplication.UnicodeUTF8))
+ self.label_4.setText(QtGui.QApplication.translate("Dialog", "Best Matched Image:", None, QtGui.QApplication.UnicodeUTF8))
+ self.Deskjet450ComboBox.setItemText(0, QtGui.QApplication.translate("Dialog", "1", None, QtGui.QApplication.UnicodeUTF8))
+ self.Deskjet450ComboBox.setItemText(1, QtGui.QApplication.translate("Dialog", "2", None, QtGui.QApplication.UnicodeUTF8))
+ self.Deskjet450ComboBox.setItemText(2, QtGui.QApplication.translate("Dialog", "3", None, QtGui.QApplication.UnicodeUTF8))
+ self.Deskjet450ComboBox.setItemText(3, QtGui.QApplication.translate("Dialog", "4", None, QtGui.QApplication.UnicodeUTF8))
+ self.Deskjet450ComboBox.setItemText(4, QtGui.QApplication.translate("Dialog", "5", None, QtGui.QApplication.UnicodeUTF8))
+ self.Deskjet450ComboBox.setItemText(5, QtGui.QApplication.translate("Dialog", "6", None, QtGui.QApplication.UnicodeUTF8))
+ self.Deskjet450ComboBox.setItemText(6, QtGui.QApplication.translate("Dialog", "7", None, QtGui.QApplication.UnicodeUTF8))
+ self.label_5.setText(QtGui.QApplication.translate("Dialog", "<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
+"p, li { white-space: pre-wrap; }\n"
+"</style></head><body style=\" font-family:\'Sans Serif\'; font-size:9pt; font-weight:400; font-style:normal;\">\n"
+"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-weight:600;\">A page of color patches is printing. When it is complete, follow these steps:</span> </p>\n"
+"<p style=\" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-weight:600;\">1.</span> Hold the page approximately 8 inches (~20cm) in front of your eyes. </p>\n"
+"<p style=\" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-weight:600;\">2.</span> Slowly move the page away from you until the numbered patches fade to match the background. </p>\n"
+"<p style=\" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-weight:600;\">3.</span> Select the number (below) between <span style=\" font-style:italic;\">1</span> and <span style=\" font-style:italic;\">81 </span>of the numbered patch that <span style=\" font-weight:600;\">best </span>matches the background:</p></body></html>", None, QtGui.QApplication.UnicodeUTF8))
+ self.label_6.setText(QtGui.QApplication.translate("Dialog", "Number of <b>best</b> matching patch (1-81):", None, QtGui.QApplication.UnicodeUTF8))
+ self.label_12.setText(QtGui.QApplication.translate("Dialog", "Choose the numbered colored box that the color <b>best </b>matches the background color of the bar.", None, QtGui.QApplication.UnicodeUTF8))
+ self.LBowLabel.setText(QtGui.QApplication.translate("Dialog", "Line %1:", None, QtGui.QApplication.UnicodeUTF8))
+ self.label_7.setText(QtGui.QApplication.translate("Dialog", "<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
+"p, li { white-space: pre-wrap; }\n"
+"</style></head><body style=\" font-family:\'Sans Serif\'; font-size:9pt; font-weight:400; font-style:normal;\">\n"
+"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">1. Hold the calibration page at arm\'s length in front of your eyes.</p>\n"
+"<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"></p>\n"
+"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">2. Tilt the page away from you. Look at the two large squares, each containing colored patches. For each large square, find the colored path that <span style=\" font-weight:600;\">most closely</span> matches the background color.</p>\n"
+"<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"></p>\n"
+"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">3. Choose the letter and number for the matching patches for the gray and color plots.</p></body></html>", None, QtGui.QApplication.UnicodeUTF8))
+ self.groupBox_2.setTitle(QtGui.QApplication.translate("Dialog", "Gray Plot", None, QtGui.QApplication.UnicodeUTF8))
+ self.groupBox_3.setTitle(QtGui.QApplication.translate("Dialog", "Color Plot", None, QtGui.QApplication.UnicodeUTF8))
+ self.ConneryUseFactoryDefaultsCheckBox.setText(QtGui.QApplication.translate("Dialog", "Use Factory Defaults", None, QtGui.QApplication.UnicodeUTF8))
+ self.label_8.setText(QtGui.QApplication.translate("Dialog", "<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
+"p, li { white-space: pre-wrap; }\n"
+"</style></head><body style=\" font-family:\'DejaVu Sans\'; font-size:10pt; font-weight:400; font-style:normal;\">\n"
+"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-weight:600;\">Cartridge alignment on this printer is only available by accessing the front panel of the printer.</span> Please refer to the user guide for the printer for more information. Click <span style=\" font-style:italic;\">Finish</span> to exit.</p></body></html>", None, QtGui.QApplication.UnicodeUTF8))
+ self.StepText.setText(QtGui.QApplication.translate("Dialog", "Step %1 of %2", None, QtGui.QApplication.UnicodeUTF8))
+ self.BackButton.setText(QtGui.QApplication.translate("Dialog", "< Back", None, QtGui.QApplication.UnicodeUTF8))
+ self.NextButton.setText(QtGui.QApplication.translate("Dialog", "Next >", None, QtGui.QApplication.UnicodeUTF8))
+ self.CancelButton.setText(QtGui.QApplication.translate("Dialog", "Cancel", None, QtGui.QApplication.UnicodeUTF8))
+
+from loadpapergroupbox import LoadPaperGroupBox
+from deviceuricombobox import DeviceUriComboBox
diff --git a/ui4/colorcaldialog_base.ui b/ui4/colorcaldialog_base.ui
new file mode 100644
index 0000000..1b3cf6d
--- /dev/null
+++ b/ui4/colorcaldialog_base.ui
@@ -0,0 +1,810 @@
+<ui version="4.0" >
+ <class>Dialog</class>
+ <widget class="QDialog" name="Dialog" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>700</width>
+ <height>500</height>
+ </rect>
+ </property>
+ <property name="windowTitle" >
+ <string>HP Device Manager - Printer Color Calibration</string>
+ </property>
+ <layout class="QGridLayout" >
+ <item row="0" column="0" colspan="3" >
+ <widget class="QLabel" name="label" >
+ <property name="font" >
+ <font>
+ <pointsize>16</pointsize>
+ </font>
+ </property>
+ <property name="text" >
+ <string>Printer Color Calibration</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" colspan="5" >
+ <widget class="Line" name="line" >
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" colspan="6" >
+ <widget class="QStackedWidget" name="StackedWidget" >
+ <property name="frameShape" >
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="currentIndex" >
+ <number>0</number>
+ </property>
+ <widget class="QWidget" name="StartPage" >
+ <layout class="QGridLayout" >
+ <item row="0" column="0" >
+ <widget class="DeviceUriComboBox" name="DeviceComboBox" />
+ </item>
+ <item row="1" column="0" >
+ <widget class="QGroupBox" name="groupBox" >
+ <property name="title" >
+ <string/>
+ </property>
+ <layout class="QGridLayout" >
+ <item row="0" column="0" >
+ <widget class="QLabel" name="label_2" >
+ <property name="text" >
+ <string>&lt;html>&lt;head>&lt;meta name="qrichtext" content="1" />&lt;style type="text/css">
+p, li { white-space: pre-wrap; }
+&lt;/style>&lt;/head>&lt;body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;">
+&lt;p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Select the device to align and click &lt;span style=" font-style:italic;">Next &amp;gt;&lt;/span> to continue.&lt;/p>&lt;/body>&lt;/html></string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="2" column="0" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="LoadPaperPage" >
+ <layout class="QGridLayout" >
+ <item row="0" column="0" >
+ <widget class="LoadPaperGroupBox" name="LoadPaper" >
+ <property name="title" >
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>20</width>
+ <height>181</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="Deskjet450Page" >
+ <layout class="QGridLayout" >
+ <item row="0" column="0" colspan="3" >
+ <widget class="QLabel" name="label_3" >
+ <property name="text" >
+ <string>&lt;html>&lt;head>&lt;meta name="qrichtext" content="1" />&lt;style type="text/css">
+p, li { white-space: pre-wrap; }
+&lt;/style>&lt;/head>&lt;body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;">
+&lt;p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Choose the numbered image labeled "1" thru "7" that is &lt;span style=" font-weight:600;">best color matched&lt;/span> to the image labeled "X".&lt;/p>&lt;/body>&lt;/html></string>
+ </property>
+ <property name="wordWrap" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="2" column="0" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>111</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="2" column="1" >
+ <layout class="QHBoxLayout" >
+ <item>
+ <widget class="QLabel" name="label_4" >
+ <property name="text" >
+ <string>Best Matched Image:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QComboBox" name="Deskjet450ComboBox" >
+ <item>
+ <property name="text" >
+ <string>1</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>2</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>3</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>4</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>5</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>6</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>7</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="2" column="2" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>221</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="3" column="1" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="CrickPage" >
+ <layout class="QGridLayout" >
+ <item row="0" column="0" colspan="3" >
+ <widget class="QLabel" name="label_5" >
+ <property name="text" >
+ <string>&lt;html>&lt;head>&lt;meta name="qrichtext" content="1" />&lt;style type="text/css">
+p, li { white-space: pre-wrap; }
+&lt;/style>&lt;/head>&lt;body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;">
+&lt;p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">&lt;span style=" font-weight:600;">A page of color patches is printing. When it is complete, follow these steps:&lt;/span> &lt;/p>
+&lt;p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">&lt;span style=" font-weight:600;">1.&lt;/span> Hold the page approximately 8 inches (~20cm) in front of your eyes. &lt;/p>
+&lt;p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">&lt;span style=" font-weight:600;">2.&lt;/span> Slowly move the page away from you until the numbered patches fade to match the background. &lt;/p>
+&lt;p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">&lt;span style=" font-weight:600;">3.&lt;/span> Select the number (below) between &lt;span style=" font-style:italic;">1&lt;/span> and &lt;span style=" font-style:italic;">81 &lt;/span>of the numbered patch that &lt;span style=" font-weight:600;">best &lt;/span>matches the background:&lt;/p>&lt;/body>&lt;/html></string>
+ </property>
+ <property name="wordWrap" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="2" column="0" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="2" column="1" >
+ <layout class="QHBoxLayout" >
+ <item>
+ <widget class="QLabel" name="label_6" >
+ <property name="text" >
+ <string>Number of &lt;b>best&lt;/b> matching patch (1-81):</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QSpinBox" name="CrickSpinBox" >
+ <property name="prefix" >
+ <string/>
+ </property>
+ <property name="minimum" >
+ <number>1</number>
+ </property>
+ <property name="maximum" >
+ <number>81</number>
+ </property>
+ <property name="value" >
+ <number>41</number>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="2" column="2" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="3" column="1" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="LBowPage" >
+ <layout class="QGridLayout" >
+ <item row="0" column="0" colspan="5" >
+ <widget class="QLabel" name="label_12" >
+ <property name="text" >
+ <string>Choose the numbered colored box that the color &lt;b>best &lt;/b>matches the background color of the bar.</string>
+ </property>
+ <property name="wordWrap" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="2" column="0" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="2" column="1" >
+ <widget class="QLabel" name="LBowIcon" >
+ <property name="sizePolicy" >
+ <sizepolicy vsizetype="Fixed" hsizetype="Fixed" >
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize" >
+ <size>
+ <width>85</width>
+ <height>90</height>
+ </size>
+ </property>
+ <property name="maximumSize" >
+ <size>
+ <width>85</width>
+ <height>90</height>
+ </size>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="text" >
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="2" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>31</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="2" column="3" >
+ <layout class="QHBoxLayout" >
+ <item>
+ <widget class="QLabel" name="LBowLabel" >
+ <property name="text" >
+ <string>Line %1:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QComboBox" name="LBowComboBox" />
+ </item>
+ </layout>
+ </item>
+ <item row="2" column="4" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="3" column="1" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="ConneryPage" >
+ <layout class="QGridLayout" >
+ <item row="0" column="0" colspan="5" >
+ <widget class="QLabel" name="label_7" >
+ <property name="text" >
+ <string>&lt;html>&lt;head>&lt;meta name="qrichtext" content="1" />&lt;style type="text/css">
+p, li { white-space: pre-wrap; }
+&lt;/style>&lt;/head>&lt;body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;">
+&lt;p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">1. Hold the calibration page at arm's length in front of your eyes.&lt;/p>
+&lt;p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">&lt;/p>
+&lt;p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">2. Tilt the page away from you. Look at the two large squares, each containing colored patches. For each large square, find the colored path that &lt;span style=" font-weight:600;">most closely&lt;/span> matches the background color.&lt;/p>
+&lt;p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">&lt;/p>
+&lt;p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">3. Choose the letter and number for the matching patches for the gray and color plots.&lt;/p>&lt;/body>&lt;/html></string>
+ </property>
+ <property name="wordWrap" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="2" column="0" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="2" column="1" colspan="3" >
+ <layout class="QHBoxLayout" >
+ <item>
+ <widget class="QGroupBox" name="groupBox_2" >
+ <property name="title" >
+ <string>Gray Plot</string>
+ </property>
+ <layout class="QGridLayout" >
+ <item row="0" column="0" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>21</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="0" column="1" colspan="2" >
+ <widget class="QLabel" name="ConneryGrayPatchIcon" >
+ <property name="sizePolicy" >
+ <sizepolicy vsizetype="Fixed" hsizetype="Fixed" >
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize" >
+ <size>
+ <width>75</width>
+ <height>75</height>
+ </size>
+ </property>
+ <property name="maximumSize" >
+ <size>
+ <width>75</width>
+ <height>75</height>
+ </size>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="text" >
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="3" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>21</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="1" column="0" colspan="2" >
+ <widget class="QComboBox" name="ConneryGrayLetterComboBox" />
+ </item>
+ <item row="1" column="2" colspan="2" >
+ <widget class="QComboBox" name="ConneryGrayNumberComboBox" />
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QGroupBox" name="groupBox_3" >
+ <property name="title" >
+ <string>Color Plot</string>
+ </property>
+ <layout class="QGridLayout" >
+ <item row="0" column="0" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>21</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="0" column="1" colspan="2" >
+ <widget class="QLabel" name="ConneryColorPatchIcon" >
+ <property name="sizePolicy" >
+ <sizepolicy vsizetype="Fixed" hsizetype="Fixed" >
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize" >
+ <size>
+ <width>75</width>
+ <height>75</height>
+ </size>
+ </property>
+ <property name="maximumSize" >
+ <size>
+ <width>75</width>
+ <height>75</height>
+ </size>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="text" >
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="3" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>31</width>
+ <height>75</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="1" column="0" colspan="2" >
+ <widget class="QComboBox" name="ConneryColorLetterComboBox" />
+ </item>
+ <item row="1" column="2" colspan="2" >
+ <widget class="QComboBox" name="ConneryColorNumberComboBox" />
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="2" column="4" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>81</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="3" column="1" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>20</width>
+ <height>21</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item rowspan="2" row="3" column="3" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>20</width>
+ <height>51</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="4" column="0" colspan="2" >
+ <widget class="QCheckBox" name="ConneryUseFactoryDefaultsCheckBox" >
+ <property name="text" >
+ <string>Use Factory Defaults</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="FrontPanelPage" >
+ <layout class="QGridLayout" >
+ <item row="0" column="0" >
+ <widget class="QLabel" name="label_8" >
+ <property name="text" >
+ <string>&lt;html>&lt;head>&lt;meta name="qrichtext" content="1" />&lt;style type="text/css">
+p, li { white-space: pre-wrap; }
+&lt;/style>&lt;/head>&lt;body style=" font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;">
+&lt;p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">&lt;span style=" font-weight:600;">Cartridge alignment on this printer is only available by accessing the front panel of the printer.&lt;/span> Please refer to the user guide for the printer for more information. Click &lt;span style=" font-style:italic;">Finish&lt;/span> to exit.&lt;/p>&lt;/body>&lt;/html></string>
+ </property>
+ <property name="wordWrap" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ </item>
+ <item row="3" column="0" colspan="5" >
+ <widget class="Line" name="line_2" >
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="0" >
+ <widget class="QLabel" name="StepText" >
+ <property name="text" >
+ <string>Step %1 of %2</string>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="1" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>141</width>
+ <height>28</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="4" column="2" >
+ <widget class="QPushButton" name="BackButton" >
+ <property name="text" >
+ <string>&lt; Back</string>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="3" >
+ <widget class="QPushButton" name="NextButton" >
+ <property name="text" >
+ <string>Next ></string>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="4" >
+ <widget class="QPushButton" name="CancelButton" >
+ <property name="text" >
+ <string>Cancel</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <customwidgets>
+ <customwidget>
+ <class>DeviceUriComboBox</class>
+ <extends>QComboBox</extends>
+ <header>deviceuricombobox.h</header>
+ </customwidget>
+ <customwidget>
+ <class>LoadPaperGroupBox</class>
+ <extends>QGroupBox</extends>
+ <header>loadpapergroupbox.h</header>
+ <container>1</container>
+ </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections>
+ <connection>
+ <sender>ConneryUseFactoryDefaultsCheckBox</sender>
+ <signal>clicked(bool)</signal>
+ <receiver>groupBox_2</receiver>
+ <slot>setDisabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>98</x>
+ <y>417</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>146</x>
+ <y>221</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>ConneryUseFactoryDefaultsCheckBox</sender>
+ <signal>clicked(bool)</signal>
+ <receiver>groupBox_3</receiver>
+ <slot>setDisabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>158</x>
+ <y>427</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>324</x>
+ <y>222</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>
diff --git a/ui4/devicesetupdialog.py b/ui4/devicesetupdialog.py
new file mode 100644
index 0000000..3e46f1d
--- /dev/null
+++ b/ui4/devicesetupdialog.py
@@ -0,0 +1,297 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2001-2008 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Authors: Don Welch
+#
+
+# StdLib
+import operator
+import string
+
+# Local
+from base.g import *
+from base import device, utils, pml
+from prnt import cups
+from base.codes import *
+from ui_utils import *
+
+# Qt
+from PyQt4.QtCore import *
+from PyQt4.QtGui import *
+
+# Ui
+from devicesetupdialog_base import Ui_Dialog
+
+TAB_POWER_SETTINGS = 0
+
+class DeviceSetupDialog(QDialog, Ui_Dialog):
+ def __init__(self, parent, device_uri):
+ QDialog.__init__(self, parent)
+ self.setupUi(self)
+ self.device_uri = device_uri
+ self.mq = {}
+ self.dev = None
+ self.initUi()
+
+ QTimer.singleShot(0, self.updateUi)
+
+
+ def initUi(self):
+ # connect signals/slots
+ self.connect(self.CancelButton, SIGNAL("clicked()"), self.CancelButton_clicked)
+ #self.connect(self.ApplyButton, SIGNAL("clicked()"), self.ApplyButton_clicked)
+ self.connect(self.DeviceComboBox, SIGNAL("DeviceUriComboBox_noDevices"), self.DeviceUriComboBox_noDevices)
+ self.connect(self.DeviceComboBox, SIGNAL("DeviceUriComboBox_currentChanged"),
+ self.DeviceUriComboBox_currentChanged)
+
+ self.DeviceComboBox.setFilter({'power-settings': (operator.gt, 0)})
+
+ # Application icon
+ self.setWindowIcon(QIcon(load_pixmap('hp_logo', '128x128')))
+
+ if self.device_uri:
+ self.DeviceComboBox.setInitialDevice(self.device_uri)
+
+ self.DurationComboBox.addItem(self.__tr("15 minutes"), QVariant(15))
+ self.DurationComboBox.addItem(self.__tr("30 minutes"), QVariant(30))
+ self.DurationComboBox.addItem(self.__tr("45 minutes"), QVariant(45))
+ self.DurationComboBox.addItem(self.__tr("1 hour"), QVariant(60))
+ self.DurationComboBox.addItem(self.__tr("2 hours"), QVariant(120))
+ self.DurationComboBox.addItem(self.__tr("3 hours"), QVariant(180))
+
+ self.connect(self.DurationComboBox, SIGNAL("activated(int)"), self.DurationComboBox_activated)
+
+ self.connect(self.OnRadioButton, SIGNAL("toggled(bool)"), self.OnRadioButton_toggled)
+
+
+ def OnRadioButton_toggled(self, b):
+ i = self.DurationComboBox.currentIndex()
+ if i == -1:
+ return
+ v, ok = self.DurationComboBox.itemData(i).toInt()
+ if not ok:
+ return
+
+ if self.power_settings == POWER_SETTINGS_EPML:
+ if b:
+ self.setPowerSettingsEPML('999')
+ else:
+ self.setPowerSettingsEPML(string.zfill(v, 3))
+
+ elif self.power_settings == POWER_SETTINGS_PML:
+ if b:
+ self.setPowerSettingsPML(pml.OID_POWER_SETTINGS_NEVER)
+ else:
+ self.setPowerSettingsPML(self.getPMLSettingsValue(v))
+
+
+
+ def updateUi(self):
+ self.DeviceComboBox.updateUi()
+
+
+ def updatePowerSettingsUi(self):
+ pass
+
+
+ def DeviceUriComboBox_currentChanged(self, device_uri):
+ beginWaitCursor()
+ try:
+ self.device_uri = device_uri
+
+ if self.dev is not None:
+ self.dev.close()
+
+ self.dev = device.Device(self.device_uri)
+
+ # Update
+ self.mq = device.queryModelByURI(self.device_uri)
+ self.power_settings = self.mq.get('power-settings', POWER_SETTINGS_NONE)
+
+ self.TabWidget.setTabEnabled(TAB_POWER_SETTINGS, self.power_settings != POWER_SETTINGS_NONE)
+
+ if self.power_settings == POWER_SETTINGS_EPML:
+ self.updatePowerSettingsEPML()
+
+ elif self.power_settings == POWER_SETTINGS_PML:
+ self.updatePowerSettingsPML()
+
+ finally:
+ endWaitCursor()
+
+ # DJ 4x0 battery power settings
+
+ # 15min = 015
+ # 30min = 030
+ # 45min = 045
+ # 1hr = 060
+ # 2hr = 120
+ # 3hr = 180
+ # never = 999
+
+ def updatePowerSettingsEPML(self):
+ value = self.getPowerSettingsEPML()
+
+ if value == '999':
+ self.OnRadioButton.setChecked(True)
+ self.OffRadioButton.setChecked(False)
+ else:
+ self.OnRadioButton.setChecked(False)
+ self.OffRadioButton.setChecked(True)
+
+ find = int(value)
+ index = self.DurationComboBox.findData(QVariant(find))
+
+ if index != -1:
+ self.DurationComboBox.setCurrentIndex(index)
+
+
+ def getPowerSettingsEPML(self):
+ value = self.dev.getDynamicCounter(256, False)
+ log.debug("Current power settings: %s" % value)
+ self.dev.closePrint()
+ return value[6:9]
+
+
+ def setPowerSettingsEPML(self, value):
+ log.debug("Setting power setting to %s" % value)
+ pcl= \
+ """\x1b%%-12345X@PJL ENTER LANGUAGE=PCL3GUI\n\x1bE\x1b%%Pmech.set_battery_autooff %s;\nudw.quit;\x1b*rC\x1bE\x1b%%-12345X""" % value
+ self.dev.printData(pcl, direct=True)
+ self.dev.closePrint()
+
+ # h470
+
+ # PML
+ # OID_POWER_SETTINGS = ('1.1.2.118', TYPE_ENUMERATION)
+ # OID_POWER_SETTINGS_15MIN = 1
+ # OID_POWER_SETTINGS_30MIN = 2
+ # OID_POWER_SETTINGS_45MIN = 3
+ # OID_POWER_SETTINGS_1HR = 4
+ # OID_POWER_SETTINGS_2HR = 5
+ # OID_POWER_SETTINGS_3HR = 6
+ # OID_POWER_SETTINGS_NEVER = 999
+
+ def updatePowerSettingsPML(self):
+ value = self.getPowerSettingsPML()
+ if value == pml.OID_POWER_SETTINGS_NEVER:
+ self.OnRadioButton.setChecked(True)
+ self.OffRadioButton.setChecked(False)
+ else:
+ self.OnRadioButton.setChecked(False)
+ self.OffRadioButton.setChecked(True)
+
+ find = 15
+ if value == pml.OID_POWER_SETTINGS_15MIN:
+ find = 15
+ elif value == pml.OID_POWER_SETTINGS_30MIN:
+ find = 30
+ elif value == pml.OID_POWER_SETTINGS_45MIN:
+ find = 45
+ elif value == pml.OID_POWER_SETTINGS_1HR:
+ find = 60
+ elif value == pml.OID_POWER_SETTINGS_2HR:
+ find = 120
+ elif value == pml.OID_POWER_SETTINGS_3HR:
+ find = 180
+
+ index = self.DurationComboBox.findData(QVariant(find))
+
+ if index != -1:
+ self.DurationComboBox.setCurrentIndex(index)
+
+
+
+ def getPowerSettingsPML(self):
+ pml_result_code, value = self.dev.getPML(pml.OID_POWER_SETTINGS)
+ self.dev.closePML()
+ log.debug("Current power settings: %s" % value)
+ return value
+
+
+ def setPowerSettingsPML(self, value):
+ log.debug("Setting power setting to %s" % value)
+ pml_result_code = self.dev.setPML(pml.OID_POWER_SETTINGS, value)
+ self.dev.closePML()
+
+ # #####################
+
+
+ def DurationComboBox_activated(self, i):
+ if i == -1:
+ return
+ v, ok = self.DurationComboBox.itemData(i).toInt()
+ if not ok:
+ return
+ if self.power_settings == POWER_SETTINGS_EPML:
+ beginWaitCursor()
+ try:
+ self.setPowerSettingsEPML(string.zfill(v, 3))
+ finally:
+ endWaitCursor()
+
+ elif self.power_settings == POWER_SETTINGS_PML:
+ beginWaitCursor()
+ try:
+ self.setPowerSettingsPML(self.getPMLSettingsValue(v))
+ finally:
+ endWaitCursor()
+
+
+ def getPMLSettingsValue(self, v):
+ x = pml.OID_POWER_SETTINGS_15MIN
+
+ if v == 15:
+ x = pml.OID_POWER_SETTINGS_15MIN
+ elif v == 30:
+ x = pml.OID_POWER_SETTINGS_30MIN
+ elif v == 45:
+ x = pml.OID_POWER_SETTINGS_45MIN
+ elif v == 60:
+ x = pml.OID_POWER_SETTINGS_1HR
+ elif v == 120:
+ x = pml.OID_POWER_SETTINGS_2HR
+ elif v == 180:
+ x = pml.OID_POWER_SETTINGS_3HR
+
+ return x
+
+
+ def DeviceUriComboBox_noDevices(self):
+ FailureUI(self, self.__tr("<b>No devices that support device setup found.</b>"))
+ self.close()
+
+
+ def CancelButton_clicked(self):
+ if self.dev is not None:
+ self.dev.close()
+
+ self.close()
+
+
+# def ApplyButton_clicked(self):
+# pass
+
+ #
+ # Misc
+ #
+
+ def __tr(self,s,c = None):
+ return qApp.translate("DeviceSetupDialog",s,c)
+
+
diff --git a/ui4/devicesetupdialog_base.py b/ui4/devicesetupdialog_base.py
new file mode 100644
index 0000000..05f5fda
--- /dev/null
+++ b/ui4/devicesetupdialog_base.py
@@ -0,0 +1,85 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'ui4/devicesetupdialog_base.ui'
+#
+# Created: Mon May 4 14:30:32 2009
+# by: PyQt4 UI code generator 4.4.4
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt4 import QtCore, QtGui
+
+class Ui_Dialog(object):
+ def setupUi(self, Dialog):
+ Dialog.setObjectName("Dialog")
+ Dialog.resize(700, 500)
+ self.gridlayout = QtGui.QGridLayout(Dialog)
+ self.gridlayout.setObjectName("gridlayout")
+ self.label = QtGui.QLabel(Dialog)
+ font = QtGui.QFont()
+ font.setPointSize(16)
+ self.label.setFont(font)
+ self.label.setObjectName("label")
+ self.gridlayout.addWidget(self.label, 0, 0, 1, 1)
+ self.line = QtGui.QFrame(Dialog)
+ self.line.setFrameShape(QtGui.QFrame.HLine)
+ self.line.setFrameShadow(QtGui.QFrame.Sunken)
+ self.line.setObjectName("line")
+ self.gridlayout.addWidget(self.line, 1, 0, 1, 3)
+ self.DeviceComboBox = DeviceUriComboBox(Dialog)
+ self.DeviceComboBox.setObjectName("DeviceComboBox")
+ self.gridlayout.addWidget(self.DeviceComboBox, 2, 0, 1, 3)
+ self.TabWidget = QtGui.QTabWidget(Dialog)
+ self.TabWidget.setObjectName("TabWidget")
+ self.PowerSettingsTab = QtGui.QWidget()
+ self.PowerSettingsTab.setObjectName("PowerSettingsTab")
+ self.gridlayout1 = QtGui.QGridLayout(self.PowerSettingsTab)
+ self.gridlayout1.setObjectName("gridlayout1")
+ self.groupBox = QtGui.QGroupBox(self.PowerSettingsTab)
+ self.groupBox.setObjectName("groupBox")
+ self.gridlayout2 = QtGui.QGridLayout(self.groupBox)
+ self.gridlayout2.setObjectName("gridlayout2")
+ self.OnRadioButton = QtGui.QRadioButton(self.groupBox)
+ self.OnRadioButton.setObjectName("OnRadioButton")
+ self.gridlayout2.addWidget(self.OnRadioButton, 0, 0, 1, 2)
+ self.hboxlayout = QtGui.QHBoxLayout()
+ self.hboxlayout.setObjectName("hboxlayout")
+ self.OffRadioButton = QtGui.QRadioButton(self.groupBox)
+ self.OffRadioButton.setEnabled(True)
+ self.OffRadioButton.setObjectName("OffRadioButton")
+ self.hboxlayout.addWidget(self.OffRadioButton)
+ self.DurationComboBox = QtGui.QComboBox(self.groupBox)
+ self.DurationComboBox.setEnabled(False)
+ self.DurationComboBox.setObjectName("DurationComboBox")
+ self.hboxlayout.addWidget(self.DurationComboBox)
+ self.gridlayout2.addLayout(self.hboxlayout, 1, 0, 1, 1)
+ spacerItem = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+ self.gridlayout2.addItem(spacerItem, 1, 1, 1, 1)
+ self.gridlayout1.addWidget(self.groupBox, 0, 0, 1, 1)
+ spacerItem1 = QtGui.QSpacerItem(282, 51, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ self.gridlayout1.addItem(spacerItem1, 1, 0, 1, 1)
+ self.TabWidget.addTab(self.PowerSettingsTab, "")
+ self.gridlayout.addWidget(self.TabWidget, 3, 0, 1, 3)
+ spacerItem2 = QtGui.QSpacerItem(510, 20, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Preferred)
+ self.gridlayout.addItem(spacerItem2, 4, 0, 1, 1)
+ spacerItem3 = QtGui.QSpacerItem(361, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+ self.gridlayout.addItem(spacerItem3, 5, 0, 1, 1)
+ self.CancelButton = QtGui.QPushButton(Dialog)
+ self.CancelButton.setObjectName("CancelButton")
+ self.gridlayout.addWidget(self.CancelButton, 5, 2, 1, 1)
+
+ self.retranslateUi(Dialog)
+ self.TabWidget.setCurrentIndex(0)
+ QtCore.QObject.connect(self.OffRadioButton, QtCore.SIGNAL("toggled(bool)"), self.DurationComboBox.setEnabled)
+ QtCore.QMetaObject.connectSlotsByName(Dialog)
+
+ def retranslateUi(self, Dialog):
+ Dialog.setWindowTitle(QtGui.QApplication.translate("Dialog", "HP Device Manager - Device Setup", None, QtGui.QApplication.UnicodeUTF8))
+ self.label.setText(QtGui.QApplication.translate("Dialog", "Device Setup", None, QtGui.QApplication.UnicodeUTF8))
+ self.groupBox.setTitle(QtGui.QApplication.translate("Dialog", "Automatic Power Off", None, QtGui.QApplication.UnicodeUTF8))
+ self.OnRadioButton.setText(QtGui.QApplication.translate("Dialog", "Always leave printer on", None, QtGui.QApplication.UnicodeUTF8))
+ self.OffRadioButton.setText(QtGui.QApplication.translate("Dialog", "Automatically turn printer off after:", None, QtGui.QApplication.UnicodeUTF8))
+ self.TabWidget.setTabText(self.TabWidget.indexOf(self.PowerSettingsTab), QtGui.QApplication.translate("Dialog", "Power Settings", None, QtGui.QApplication.UnicodeUTF8))
+ self.CancelButton.setText(QtGui.QApplication.translate("Dialog", "Close", None, QtGui.QApplication.UnicodeUTF8))
+
+from deviceuricombobox import DeviceUriComboBox
diff --git a/ui4/devicesetupdialog_base.ui b/ui4/devicesetupdialog_base.ui
new file mode 100644
index 0000000..bc6e63a
--- /dev/null
+++ b/ui4/devicesetupdialog_base.ui
@@ -0,0 +1,179 @@
+<ui version="4.0" >
+ <class>Dialog</class>
+ <widget class="QDialog" name="Dialog" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>700</width>
+ <height>500</height>
+ </rect>
+ </property>
+ <property name="windowTitle" >
+ <string>HP Device Manager - Device Setup</string>
+ </property>
+ <layout class="QGridLayout" >
+ <item row="0" column="0" >
+ <widget class="QLabel" name="label" >
+ <property name="font" >
+ <font>
+ <pointsize>16</pointsize>
+ </font>
+ </property>
+ <property name="text" >
+ <string>Device Setup</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" colspan="3" >
+ <widget class="Line" name="line" >
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" colspan="3" >
+ <widget class="DeviceUriComboBox" name="DeviceComboBox" />
+ </item>
+ <item row="3" column="0" colspan="3" >
+ <widget class="QTabWidget" name="TabWidget" >
+ <property name="currentIndex" >
+ <number>0</number>
+ </property>
+ <widget class="QWidget" name="PowerSettingsTab" >
+ <attribute name="title" >
+ <string>Power Settings</string>
+ </attribute>
+ <layout class="QGridLayout" >
+ <item row="0" column="0" >
+ <widget class="QGroupBox" name="groupBox" >
+ <property name="title" >
+ <string>Automatic Power Off</string>
+ </property>
+ <layout class="QGridLayout" >
+ <item row="0" column="0" colspan="2" >
+ <widget class="QRadioButton" name="OnRadioButton" >
+ <property name="text" >
+ <string>Always leave printer on</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <layout class="QHBoxLayout" >
+ <item>
+ <widget class="QRadioButton" name="OffRadioButton" >
+ <property name="enabled" >
+ <bool>true</bool>
+ </property>
+ <property name="text" >
+ <string>Automatically turn printer off after:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QComboBox" name="DurationComboBox" >
+ <property name="enabled" >
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="1" column="1" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>282</width>
+ <height>51</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ </item>
+ <item row="4" column="0" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeType" >
+ <enum>QSizePolicy::Preferred</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>510</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="5" column="0" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>361</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="5" column="2" >
+ <widget class="QPushButton" name="CancelButton" >
+ <property name="text" >
+ <string>Close</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <customwidgets>
+ <customwidget>
+ <class>DeviceUriComboBox</class>
+ <extends>QComboBox</extends>
+ <header>deviceuricombobox.h</header>
+ </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections>
+ <connection>
+ <sender>OffRadioButton</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>DurationComboBox</receiver>
+ <slot>setEnabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>140</x>
+ <y>189</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>276</x>
+ <y>196</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>
diff --git a/ui4/deviceuricombobox.py b/ui4/deviceuricombobox.py
new file mode 100644
index 0000000..5d08734
--- /dev/null
+++ b/ui4/deviceuricombobox.py
@@ -0,0 +1,163 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2001-2009 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+# Std Lib
+
+# Local
+from base.g import *
+from ui_utils import *
+from base import device
+
+# Qt
+from PyQt4.QtCore import *
+from PyQt4.QtGui import *
+
+
+DEVICEURICOMBOBOX_TYPE_PRINTER_ONLY = 0
+DEVICEURICOMBOBOX_TYPE_FAX_ONLY = 1
+DEVICEURICOMBOBOX_TYPE_PRINTER_AND_FAX = 2
+
+
+class DeviceUriComboBox(QWidget):
+ def __init__(self, parent):
+ QWidget.__init__(self, parent)
+ self.device_uri = ''
+ self.initial_device = None
+ self.updating = False
+ self.typ = DEVICEURICOMBOBOX_TYPE_PRINTER_ONLY
+ self.filter = None
+ self.devices = None
+
+ self.user_settings = UserSettings()
+ self.user_settings.load()
+ self.user_settings.debug()
+
+ self.initUi()
+
+
+ def initUi(self):
+ HBoxLayout = QHBoxLayout(self)
+ HBoxLayout.setObjectName("HBoxLayout")
+
+ self.NameLabel = QLabel(self)
+ self.NameLabel.setObjectName("NameLabel")
+ HBoxLayout.addWidget(self.NameLabel)
+
+ SpacerItem = QSpacerItem(20, 20, QSizePolicy.Minimum, QSizePolicy.Minimum)
+ HBoxLayout.addItem(SpacerItem)
+
+ self.ComboBox = QComboBox(self)
+ sizePolicy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Preferred)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.ComboBox.sizePolicy().hasHeightForWidth())
+ self.ComboBox.setSizePolicy(sizePolicy)
+ self.ComboBox.setObjectName("ComboBox")
+ HBoxLayout.addWidget(self.ComboBox)
+
+ self.NameLabel.setText(self.__tr("Device:"))
+
+# self.connect(self.ComboBox, SIGNAL("currentIndexChanged(int)"),
+# self.ComboBox_currentIndexChanged)
+
+ self.connect(self.ComboBox, SIGNAL("currentIndexChanged(const QString &)"),
+ self.ComboBox_currentIndexChanged)
+
+
+ def setType(self, typ):
+ if typ in (DEVICEURICOMBOBOX_TYPE_PRINTER_ONLY,
+ DEVICEURICOMBOBOX_TYPE_FAX_ONLY,
+ DEVICEURICOMBOBOX_TYPE_PRINTER_AND_FAX):
+ self.typ = typ
+
+
+ def setFilter(self, filter):
+ self.filter = filter
+
+
+ def setInitialDevice(self, device_uri):
+ self.initial_device = device_uri
+
+
+ def setDevices(self):
+ if self.typ == DEVICEURICOMBOBOX_TYPE_PRINTER_ONLY:
+ be_filter = ['hp']
+
+ elif self.typ == DEVICEURICOMBOBOX_TYPE_FAX_ONLY:
+ be_filter = ['hpfax']
+ self.NameLabel.setText(self.__tr("Fax Device:"))
+
+ else: # DEVICEURICOMBOBOX_TYPE_PRINTER_AND_FAX
+ be_filter = ['hp', 'hpfax']
+
+ self.devices = device.getSupportedCUPSDevices(be_filter, self.filter)
+ return len(self.devices)
+
+
+ def updateUi(self):
+ if self.devices is None:
+ self.setDevices()
+
+ self.device_index = {}
+
+ if self.devices:
+ if self.initial_device is None:
+ #self.initial_device = user_conf.get('last_used', 'device_uri')
+ self.initial_device = self.user_settings.last_used_device_uri
+
+ self.updating = True
+ try:
+ k = 0
+ for i, d in enumerate(self.devices):
+ self.ComboBox.insertItem(i, d)
+
+ if self.initial_device is not None and d == self.initial_device:
+ self.initial_device = None
+ k = i
+
+ self.ComboBox.setCurrentIndex(-1)
+ finally:
+ self.updating = False
+
+ self.ComboBox.setCurrentIndex(k)
+
+ if len(self.devices) == 1:
+ self.emit(SIGNAL("DeviceUriComboBox_oneDevice"))
+
+ else:
+ self.emit(SIGNAL("DeviceUriComboBox_noDevices"))
+
+
+ def ComboBox_currentIndexChanged(self, t):
+ if self.updating:
+ return
+
+ self.device_uri = unicode(t)
+ if self.device_uri:
+ #user_conf.set('last_used', 'device_uri', self.device_uri)
+ self.user_settings.last_used_device_uri = self.device_uri
+ self.user_settings.save()
+
+ self.emit(SIGNAL("DeviceUriComboBox_currentChanged"), self.device_uri)
+
+
+ def __tr(self,s,c = None):
+ return qApp.translate("DeviceUriComboBox",s,c)
diff --git a/ui4/devmgr5.py b/ui4/devmgr5.py
new file mode 100644
index 0000000..defbff8
--- /dev/null
+++ b/ui4/devmgr5.py
@@ -0,0 +1,2260 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2001-2009 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Authors: Don Welch, Naga Samrat Chowdary Narla
+#
+
+#from __future__ import generators
+
+# Std Lib
+import sys
+import time
+import os
+import gzip
+import select
+import struct
+
+# Local
+from base.g import *
+from base import device, utils, pml, maint, models, pkit
+from prnt import cups
+from base.codes import *
+from ui_utils import *
+import hpmudext
+from installer.core_install import *
+
+# Qt
+from PyQt4.QtCore import *
+from PyQt4.QtGui import *
+
+# dbus
+try:
+ import dbus
+ from dbus.mainloop.qt import DBusQtMainLoop
+ from dbus import lowlevel
+except ImportError:
+ log.error("Unable to load DBus libraries. Please check your installation and try again.")
+ sys.exit(1)
+
+import warnings
+# Ignore: .../dbus/connection.py:242: DeprecationWarning: object.__init__() takes no parameters
+# (occurring on Python 2.6/dBus 0.83/Ubuntu 9.04)
+warnings.simplefilter("ignore", DeprecationWarning)
+
+
+# Main form
+from devmgr5_base import Ui_MainWindow
+
+# Aux. dialogs
+from faxsetupdialog import FaxSetupDialog
+from plugindialog import PluginDialog
+from firmwaredialog import FirmwareDialog
+from aligndialog import AlignDialog
+from printdialog import PrintDialog
+from makecopiesdialog import MakeCopiesDialog
+from sendfaxdialog import SendFaxDialog
+from fabwindow import FABWindow
+from devicesetupdialog import DeviceSetupDialog
+from printtestpagedialog import PrintTestPageDialog
+from infodialog import InfoDialog
+from cleandialog import CleanDialog
+from colorcaldialog import ColorCalDialog
+from linefeedcaldialog import LineFeedCalDialog
+from pqdiagdialog import PQDiagDialog
+from nodevicesdialog import NoDevicesDialog
+from aboutdialog import AboutDialog
+
+# Other forms and controls
+from settingsdialog import SettingsDialog
+from printsettingstoolbox import PrintSettingsToolbox
+
+
+# all in seconds
+MIN_AUTO_REFRESH_RATE = 5
+MAX_AUTO_REFRESH_RATE = 60
+DEF_AUTO_REFRESH_RATE = 30
+
+
+device_list = {} # { Device_URI : device.Device(), ... }
+model_obj = models.ModelData() # Used to convert dbus xformed data back to plain Python types
+
+
+# ***********************************************************************************
+#
+# ITEM/UTILITY UI CLASSES
+#
+# ***********************************************************************************
+
+
+class FuncViewItem(QListWidgetItem):
+ def __init__(self, parent, text, pixmap, tooltip_text, cmd):
+ QListWidgetItem.__init__(self, QIcon(pixmap), text, parent)
+ self.tooltip_text = tooltip_text
+ self.cmd = cmd
+
+# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+
+class DeviceViewItem(QListWidgetItem):
+ def __init__(self, parent, text, pixmap, device_uri, is_avail=True):
+ QListWidgetItem.__init__(self, QIcon(pixmap), text, parent)
+ self.device_uri = device_uri
+ self.is_avail = is_avail
+ self.setTextAlignment(Qt.AlignHCenter)
+
+# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+
+class PluginInstall(QObject):
+ def __init__(self, parent, plugin_type, plugin_installed):
+ self.parent = parent
+ self.plugin_type = plugin_type
+ self.plugin_installed = plugin_installed
+
+
+ def exec_(self):
+ install_plugin = True
+
+ if self.plugin_installed:
+ install_plugin = QMessageBox.warning(self.parent,
+ self.parent.windowTitle(),
+ self.__tr("<b>The HPLIP plugin is already installed.</b><p>Do you want to continue and re-install it?"),
+ QMessageBox.Yes,
+ QMessageBox.No,
+ QMessageBox.NoButton) == QMessageBox.Yes
+
+ if install_plugin:
+ ok, sudo_ok = pkit.run_plugin_command(self.plugin_type == PLUGIN_REQUIRED, self.parent.cur_device.mq['plugin-reason'])
+ if not sudo_ok:
+ QMessageBox.critical(self.parent,
+ self.parent.windowTitle(),
+ self.__tr("<b>Unable to find an appropriate su/sudo utility to run hp-plugin.</b><p>Install kdesu, gnomesu, or gksu.</p>"),
+ QMessageBox.Ok,
+ QMessageBox.NoButton,
+ QMessageBox.NoButton)
+
+
+ def __tr(self,s,c = None):
+ return qApp.translate("DevMgr5",s,c)
+
+
+class DiagnoseQueue(QObject):
+ def __init__(self, parent):
+ self.parent = parent
+
+
+ def exec_(self):
+ ok, output = utils.run('hp-diagnose_queues -r')
+
+ def __tr(self,s,c = None):
+ return qApp.translate("DevMgr5",s,c)
+
+
+
+# ***********************************************************************************
+#
+# MAINWINDOW
+#
+# ***********************************************************************************
+
+class DevMgr5(QMainWindow, Ui_MainWindow):
+ def __init__(self, toolbox_version, initial_device_uri=None,
+ dbus_loop=None, parent=None, name=None, fl=0):
+
+ QMainWindow.__init__(self, parent)
+
+ log.debug("Initializing toolbox UI (Qt4)...")
+ log.debug("HPLIP Version: %s" % prop.installed_version)
+
+
+ self.toolbox_version = toolbox_version
+ self.initial_device_uri = initial_device_uri
+ self.device_vars = {}
+ self.num_devices = 0
+ self.cur_device = None
+ self.cur_printer = None
+ self.updating = False
+ self.init_failed = False
+ self.service = None
+ self.Is_autoInstaller_distro = False # True-->tier1(supports auto installation). False--> tier2(manual installation)
+
+ # Distro insformation
+ core = CoreInstall(MODE_CHECK)
+# core.init()
+ self.Is_autoInstaller_distro = core.is_auto_installer_support()
+ # User settings
+ self.user_settings = UserSettings()
+ self.user_settings.load()
+ self.user_settings.debug()
+ self.cur_device_uri = self.user_settings.last_used_device_uri
+ installed_version=sys_conf.get('hplip','version')
+ if not utils.Is_HPLIP_older_version( installed_version, self.user_settings.latest_available_version):
+ self.setupUi(self,"",self.Is_autoInstaller_distro)
+ else:
+ self.setupUi(self, self.user_settings.latest_available_version,self.Is_autoInstaller_distro)
+
+ # Other initialization
+ self.initDBus()
+ self.initPixmaps()
+ self.initMisc()
+ self.initUI()
+
+ cups.setPasswordCallback(showPasswordUI)
+
+ if not prop.doc_build:
+ self.ContentsAction.setEnabled(False)
+
+ self.allow_auto_refresh = True
+ QTimer.singleShot(0, self.initalUpdate)
+
+
+ # ***********************************************************************************
+ #
+ # INIT
+ #
+ # ***********************************************************************************
+
+ # TODO: Make sbus init mandatory success, else exit
+ def initDBus(self):
+ self.dbus_loop = DBusQtMainLoop(set_as_default=True)
+ self.dbus_avail, self.service, self.session_bus = device.init_dbus(self.dbus_loop)
+
+ if not self.dbus_avail:
+ log.error("dBus initialization error. Exiting.")
+ self.init_failed = True
+ return
+
+ # Receive events from the session bus
+ self.session_bus.add_signal_receiver(self.handleSessionSignal, sender_keyword='sender',
+ destination_keyword='dest', interface_keyword='interface',
+ member_keyword='member', path_keyword='path')
+
+
+ def initPixmaps(self):
+ self.func_icons_cached = False
+ self.func_icons = {}
+ self.device_icons = {}
+
+ # Application icon
+ self.setWindowIcon(QIcon(load_pixmap('hp_logo', '128x128')))
+
+ self.fax_icon = load_pixmap("fax2", "other")
+
+
+ def initUI(self):
+ # Setup device icon list
+ self.DeviceList.setSortingEnabled(True)
+ self.DeviceList.setContextMenuPolicy(Qt.CustomContextMenu)
+ self.setDeviceListViewMode(QListView.IconMode)
+
+ self.connect(self.ViewAsIconsAction, SIGNAL("triggered()"), lambda: self.setDeviceListViewMode(QListView.IconMode))
+ self.connect(self.ViewAsListAction, SIGNAL("triggered()"), lambda: self.setDeviceListViewMode(QListView.ListMode))
+
+ self.connect(self.DeviceList, SIGNAL("customContextMenuRequested(const QPoint &)"), self.DeviceList_customContextMenuRequested)
+
+ # Setup main menu
+ self.DeviceRefreshAction.setIcon(QIcon(load_pixmap("refresh1", "16x16")))
+ self.connect(self.DeviceRefreshAction, SIGNAL("triggered()"), self.DeviceRefreshAction_activated)
+
+ self.RefreshAllAction.setIcon(QIcon(load_pixmap("refresh", "16x16")))
+ self.connect(self.RefreshAllAction, SIGNAL("triggered()"), self.RefreshAllAction_activated)
+
+ self.SetupDeviceAction.setIcon(QIcon(load_pixmap('list_add', '16x16')))
+ self.connect(self.SetupDeviceAction, SIGNAL("triggered()"), self.SetupDeviceAction_activated)
+
+ self.RemoveDeviceAction.setIcon(QIcon(load_pixmap('list_remove', '16x16')))
+ self.connect(self.RemoveDeviceAction, SIGNAL("triggered()"), self.RemoveDeviceAction_activated)
+
+ self.PreferencesAction.setIcon(QIcon(load_pixmap('settings', '16x16')))
+ self.connect(self.PreferencesAction, SIGNAL("triggered()"), self.PreferencesAction_activated)
+
+ self.ContentsAction.setIcon(QIcon(load_pixmap("help", "16x16")))
+ self.connect(self.ContentsAction, SIGNAL("triggered()"), self.helpContents)
+
+ self.QuitAction.setIcon(QIcon(load_pixmap("quit", "16x16")))
+ self.connect(self.QuitAction, SIGNAL("triggered()"), self.quit)
+
+ self.connect(self.AboutAction, SIGNAL("triggered()"), self.helpAbout)
+
+ self.connect(self.PrintControlPrinterNameCombo, SIGNAL("activated(const QString &)"), self.PrintControlPrinterNameCombo_activated)
+ self.connect(self.PrintSettingsPrinterNameCombo, SIGNAL("activated(const QString &)"), self.PrintSettingsPrinterNameCombo_activated)
+
+
+ # Init tabs/controls
+ self.initActionsTab()
+ self.initStatusTab()
+ self.initSuppliesTab()
+ self.initPrintSettingsTab()
+ self.initPrintControlTab()
+
+
+ self.connect(self.Tabs,SIGNAL("currentChanged(int)"),self.Tabs_currentChanged)
+
+ # Resize the splitter so that the device list starts as a single column
+ self.splitter.setSizes([80, 600])
+
+ # Setup the Device List
+ self.DeviceList.setIconSize(QSize(60, 60))
+ self.connect(self.DeviceList, SIGNAL("currentItemChanged(QListWidgetItem * ,QListWidgetItem *)"),
+ self.DeviceList_currentChanged)
+
+
+ def initMisc(self):
+ self.TabIndex = { 0: self.updateActionsTab,
+ 1: self.updateStatusTab,
+ 2: self.updateSuppliesTab,
+ 3: self.updatePrintSettingsTab,
+ 4: self.updatePrintControlTab,
+ 5:self.updateHPLIPupgrade,
+ }
+
+ # docs
+ self.docs = "http://hplip.sf.net"
+
+ if prop.doc_build:
+ g = os.path.join(sys_conf.get('dirs', 'doc'), 'index.html')
+ if os.path.exists(g):
+ self.docs = "file://%s" % g
+
+ # support
+ self.support = "https://launchpad.net/hplip"
+
+
+
+ def initalUpdate(self):
+ if self.init_failed:
+ self.close()
+ return
+
+ self.rescanDevices()
+
+ cont = True
+ if self.initial_device_uri is not None:
+ if not self.activateDevice(self.initial_device_uri):
+ log.error("Device %s not found" % self.initial_device_uri)
+ cont = False
+
+ if self.cur_printer:
+ self.getPrinterState()
+
+ if self.printer_state == cups.IPP_PRINTER_STATE_STOPPED:
+ self.cur_device.sendEvent(EVENT_PRINTER_QUEUE_STOPPED, self.cur_printer)
+
+ if not self.printer_accepting:
+ self.cur_device.sendEvent(EVENT_PRINTER_QUEUE_REJECTING_JOBS, self.cur_printer)
+
+
+ def activateDevice(self, device_uri):
+ log.debug(log.bold("Activate: %s %s %s" % ("*"*20, device_uri, "*"*20)))
+ index = 0
+ d = self.DeviceList.item(index) #firstItem()
+ found = False
+
+ while d is not None:
+ if d.device_uri == device_uri:
+ found = True
+ self.DeviceList.setSelected(d, True)
+ self.DeviceList.setCurrentItem(d)
+ break
+
+ index += 1
+ d = self.DeviceList.item(index)
+
+ return found
+
+
+
+ # ***********************************************************************************
+ #
+ # UPDATES/NOTIFICATIONS
+ #
+ # ***********************************************************************************
+
+ def handleSessionSignal(self, *args, **kwds):
+ if kwds['interface'] == 'com.hplip.Toolbox' and \
+ kwds['member'] == 'Event':
+
+ log.debug("Handling event...")
+ event = device.Event(*args[:6])
+ event.debug()
+
+ if event.event_code < EVENT_MIN_USER_EVENT:
+ pass
+
+ elif event.event_code == EVENT_DEVICE_UPDATE_REPLY:
+ log.debug("EVENT_DEVICE_UPDATE_REPLY (%s)" % event.device_uri)
+ dev = self.findDeviceByURI(event.device_uri)
+
+ if dev is not None:
+ try:
+ self.service.GetStatus(event.device_uri, reply_handler=self.handleStatusReply,
+ error_handler=self.handleStatusError)
+
+ except dbus.exceptions.DBusException, e:
+ log.error("dbus call to GetStatus() failed.")
+
+ elif event.event_code == EVENT_USER_CONFIGURATION_CHANGED:
+ log.debug("EVENT_USER_CONFIGURATION_CHANGED")
+ self.user_settings.load()
+
+ elif event.event_code == EVENT_HISTORY_UPDATE:
+ log.debug("EVENT_HISTORY_UPDATE (%s)" % event.device_uri)
+ dev = self.findDeviceByURI(event.device_uri)
+ if dev is not None:
+ self.updateHistory(dev)
+
+ elif event.event_code == EVENT_SYSTEMTRAY_EXIT:
+ log.debug("EVENT_SYSTEMTRAY_EXIT")
+ log.error("HPLIP Status Service was closed. HPLIP Device Manager will now exit.")
+ self.close()
+
+ elif event.event_code == EVENT_RAISE_DEVICE_MANAGER:
+ log.debug("EVENT_RAISE_DEVICE_MANAGER")
+ self.showNormal()
+ self.setWindowState(self.windowState() & ~Qt.WindowMinimized | Qt.WindowActive)
+ self.raise_()
+
+ elif event.event_code in (EVENT_DEVICE_START_POLLING,
+ EVENT_DEVICE_STOP_POLLING,
+ EVENT_POLLING_REQUEST):
+ pass
+
+ else:
+ log.error("Unhandled event: %d" % event.event_code)
+
+
+ def handleStatusReply(self, device_uri, data):
+ dev = self.findDeviceByURI(device_uri)
+ if dev is not None:
+ t = {}
+ for key in data:
+ value = model_obj.convert_data(str(key), str(data[key]))
+ t.setdefault(key, value)
+
+ dev.dq = t.copy()
+ for d in dev.dq:
+ dev.__dict__[d.replace('-','_')] = dev.dq[d]
+
+ self.updateDevice(dev)
+
+
+ def handleStatusError(self, e):
+ log.error(str(e))
+
+
+ def updateHistory(self, dev=None):
+ if dev is None:
+ dev = self.cur_device
+
+ try:
+ self.service.GetHistory(dev.device_uri, reply_handler=self.handleHistoryReply,
+ error_handler=self.handleHistoryError)
+ except dbus.exceptions.DBusException, e:
+ log.error("dbus call to GetHistory() failed.")
+
+
+ def handleHistoryReply(self, device_uri, history):
+ dev = self.findDeviceByURI(device_uri)
+ if dev is not None:
+ result = []
+ history.reverse()
+
+ for h in history:
+ result.append(device.Event(*tuple(h)))
+
+ try:
+ self.error_code = result[0].event_code
+ except IndexError:
+ self.error_code = STATUS_UNKNOWN
+
+ dev.error_state = STATUS_TO_ERROR_STATE_MAP.get(self.error_code, ERROR_STATE_CLEAR)
+ dev.hist = result
+
+ self.updateDevice(dev)
+
+
+ def handleHistoryError(self, e):
+ log.error(str(e))
+
+
+ def sendMessage(self, device_uri, printer_name, event_code, username=prop.username,
+ job_id=0, title=''):
+
+ device.Event(device_uri, printer_name, event_code, username,
+ job_id, title).send_via_dbus(self.session_bus)
+
+
+ def timedRefresh(self):
+ if not self.updating and self.user_settings.auto_refresh and self.allow_auto_refresh:
+ log.debug("Refresh timer...")
+ self.cleanupChildren()
+
+ if self.user_settings.auto_refresh_type == 0:
+ self.requestDeviceUpdate()
+ else:
+ self.rescanDevices()
+
+
+ # ***********************************************************************************
+ #
+ # TAB/DEVICE CHANGE SLOTS
+ #
+ # ***********************************************************************************
+
+ def Tabs_currentChanged(self, tab=0):
+ """ Called when the active tab changes.
+ Update newly displayed tab.
+ """
+ if self.cur_device is not None:
+ self.TabIndex[tab]()
+
+ def updateAllTabs(self):
+ for tab in self.TabIndex:
+ self.TabIndex[tab]()
+
+
+ def updateCurrentTab(self):
+ log.debug("updateCurrentTab()")
+ self.TabIndex[self.Tabs.currentIndex()]()
+
+
+
+ # ***********************************************************************************
+ #
+ # DEVICE ICON LIST/DEVICE UPDATE(S)
+ #
+ # ***********************************************************************************
+
+
+ def DeviceRefreshAction_activated(self):
+ self.DeviceRefreshAction.setEnabled(False)
+ self.requestDeviceUpdate()
+ self.DeviceRefreshAction.setEnabled(True)
+
+
+ def RefreshAllAction_activated(self):
+ self.rescanDevices()
+
+
+ def setDeviceListViewMode(self, mode):
+ if mode == QListView.ListMode:
+ self.DeviceList.setViewMode(QListView.ListMode)
+ self.ViewAsListAction.setEnabled(False)
+ self.ViewAsIconsAction.setEnabled(True)
+ else:
+ self.DeviceList.setViewMode(QListView.IconMode)
+ self.ViewAsListAction.setEnabled(True)
+ self.ViewAsIconsAction.setEnabled(False)
+
+
+ def createDeviceIcon(self, dev=None):
+ if dev is None:
+ dev = self.cur_device
+
+ try:
+ dev.icon
+ except AttributeError:
+ dev.icon = "default_printer"
+
+ try:
+ self.device_icons[dev.icon]
+ except:
+ self.device_icons[dev.icon] = load_pixmap(dev.icon, 'devices')
+
+ pix = self.device_icons[dev.icon]
+
+ w, h = pix.width(), pix.height()
+ error_state = dev.error_state
+ icon = QPixmap(w, h)
+ p = QPainter(icon)
+ p.eraseRect(0, 0, icon.width(), icon.height())
+ p.drawPixmap(0, 0, pix)
+
+ try:
+ tech_type = dev.tech_type
+ except AttributeError:
+ tech_type = TECH_TYPE_NONE
+
+ if dev.device_type == DEVICE_TYPE_FAX:
+ p.drawPixmap(w - self.fax_icon.width(), 0, self.fax_icon)
+
+ if error_state != ERROR_STATE_CLEAR:
+ if tech_type in (TECH_TYPE_COLOR_INK, TECH_TYPE_MONO_INK):
+ status_icon = getStatusOverlayIcon(error_state)[0] # ink
+ else:
+ status_icon = getStatusOverlayIcon(error_state)[1] # laser
+
+ if status_icon is not None:
+ p.drawPixmap(0, 0, status_icon)
+
+ p.end()
+ return icon
+
+
+ def refreshDeviceList(self):
+ global devices
+ log.debug("Rescanning device list...")
+
+ if 1:
+ beginWaitCursor()
+ self.updating = True
+
+ self.setWindowTitle(self.__tr("Refreshing Device List - HP Device Manager"))
+ self.statusBar().showMessage(self.__tr("Refreshing device list..."))
+
+ self.cups_devices = device.getSupportedCUPSDevices(['hp', 'hpfax'])
+
+ current = None
+
+ try:
+ adds = []
+ for d in self.cups_devices:
+ if d not in device_list:
+ adds.append(d)
+
+ log.debug("Adds: %s" % ','.join(adds))
+
+ removals = []
+ for d in device_list:
+ if d not in self.cups_devices:
+ removals.append(d)
+
+ log.debug("Removals (1): %s" % ','.join(removals))
+
+ updates = []
+ for d in device_list:
+ if d not in adds and d not in removals:
+ updates.append(d)
+
+ log.debug("Updates: %s" % ','.join(updates))
+
+ for d in adds:
+ log.debug("adding: %s" % d)
+ # Note: Do not perform any I/O with this device.
+ dev = device.Device(d, service=self.service, disable_dbus=False)
+
+ if not dev.supported:
+ log.debug("Unsupported model - removing device.")
+ removals.append(d)
+ continue
+
+ icon = self.createDeviceIcon(dev)
+
+ if dev.device_type == DEVICE_TYPE_FAX:
+ DeviceViewItem(self.DeviceList, self.__tr("%1 (Fax)").arg(dev.model_ui),
+ icon, d)
+ else:
+ if dev.fax_type:
+ DeviceViewItem(self.DeviceList, self.__tr("%1 (Printer)").arg(dev.model_ui),
+ icon, d)
+ else:
+ DeviceViewItem(self.DeviceList, dev.model_ui,
+ icon, d)
+
+ device_list[d] = dev
+
+ log.debug("Removals (2): %s" % ','.join(removals))
+
+ for d in removals:
+ index = self.DeviceList.count()-1
+ item = self.DeviceList.item(index)
+ log.debug("removing: %s" % d)
+
+ try:
+ del device_list[d]
+ except KeyError:
+ pass
+
+ while index >= 0 and item is not None:
+ if item.device_uri == d:
+ self.DeviceList.takeItem(index)
+ break
+
+ index -= 1
+ item = self.DeviceList.item(index)
+
+ qApp.processEvents()
+
+ self.DeviceList.updateGeometry()
+ qApp.processEvents()
+
+ if len(device_list):
+ for tab in self.TabIndex:
+ self.Tabs.setTabEnabled(tab, True)
+
+ if self.cur_device_uri:
+ index = 0
+ item = first_item = self.DeviceList.item(index)
+
+ while item is not None:
+ qApp.processEvents()
+ if item.device_uri == self.cur_device_uri:
+ current = item
+ self.statusBar().showMessage(self.cur_device_uri)
+ break
+
+ index += 1
+ item = self.DeviceList.item(index)
+
+ else:
+ self.cur_device = None
+ self.cur_device_uri = ''
+
+ if self.cur_device is None:
+ i = self.DeviceList.item(0)
+ if i is not None:
+ self.cur_device_uri = i.device_uri
+ self.cur_device = device_list[self.cur_device_uri]
+ current = i
+
+ self.updatePrinterCombos()
+
+ if self.cur_device_uri:
+ #user_conf.set('last_used', 'device_uri',self.cur_device_uri)
+ self.user_settings.last_used_device_uri = self.cur_device_uri
+ self.user_settings.save()
+
+ for d in updates + adds:
+ if d not in removals:
+ self.requestDeviceUpdate(device_list[d])
+
+ else: # no devices
+ self.cur_device = None
+ self.DeviceRefreshAction.setEnabled(False)
+ self.RemoveDeviceAction.setEnabled(False)
+ self.updating = False
+ self.statusBar().showMessage(self.__tr("Press F6 to refresh."))
+
+ for tab in self.TabIndex:
+ self.Tabs.setTabEnabled(tab, False)
+
+ endWaitCursor()
+
+ dlg = NoDevicesDialog(self)
+ dlg.exec_()
+
+ finally:
+ self.updating = False
+ endWaitCursor()
+
+ if current is not None:
+ self.DeviceList.setCurrentItem(current)
+
+ self.DeviceRefreshAction.setEnabled(True)
+
+ if self.cur_device is not None:
+ self.RemoveDeviceAction.setEnabled(True)
+
+ self.statusBar().showMessage(self.cur_device_uri)
+ self.updateWindowTitle()
+
+
+ def updateWindowTitle(self):
+ if self.cur_device.device_type == DEVICE_TYPE_FAX:
+ self.setWindowTitle(self.__tr("HP Device Manager - %1 (Fax)").arg(self.cur_device.model_ui))
+ else:
+ if self.cur_device.fax_type:
+ self.setWindowTitle(self.__tr("HP Device Manager - %1 (Printer)").arg(self.cur_device.model_ui))
+ else:
+ self.setWindowTitle(self.__tr("HP Device Manager - %1").arg(self.cur_device.model_ui))
+
+ self.statusBar().showMessage(self.cur_device_uri)
+
+
+ def updateDeviceByURI(self, device_uri):
+ return self.updateDevice(self.findDeviceByURI(device_uri))
+
+
+ def updateDevice(self, dev=None, update_tab=True):
+
+ """ Update the device icon and currently displayed tab.
+ """
+ if dev is None:
+ dev = self.cur_device
+
+ log.debug("updateDevice(%s)" % dev.device_uri)
+
+ item = self.findItem(dev)
+
+ if item is not None:
+ item.setIcon(QIcon(self.createDeviceIcon(dev)))
+
+ if dev is self.cur_device and update_tab:
+ self.updatePrinterCombos()
+ self.updateCurrentTab()
+ self.statusBar().showMessage(self.cur_device_uri)
+
+
+ def DeviceList_currentChanged(self, i, j):
+ if i is not None and not self.updating:
+ self.cur_device_uri = self.DeviceList.currentItem().device_uri
+ self.cur_device = device_list[self.cur_device_uri]
+ #user_conf.set('last_used', 'device_uri', self.cur_device_uri)
+ self.user_settings.last_used_device_uri = self.cur_device_uri
+ self.user_settings.save()
+
+ self.updateDevice()
+ self.updateWindowTitle()
+
+
+ def findItem(self, dev):
+ if dev is None:
+ dev = self.cur_device
+
+ return self.findItemByURI(dev.device_uri)
+
+
+ def findItemByURI(self, device_uri):
+ index = 0
+ item = self.DeviceList.item(index)
+
+ while item is not None:
+ if item.device_uri == device_uri:
+ return item
+
+ index += 1
+ item = self.DeviceList.item(index)
+
+
+ def findDeviceByURI(self, device_uri):
+ try:
+ return device_list[device_uri]
+ except:
+ return None
+
+
+ def requestDeviceUpdate(self, dev=None, item=None):
+ """ Submit device update request to update thread. """
+
+ if dev is None:
+ dev = self.cur_device
+
+ if dev is not None:
+ dev.error_state = ERROR_STATE_REFRESHING
+ self.updateDevice(dev, update_tab=False)
+
+ self.sendMessage(dev.device_uri, '', EVENT_DEVICE_UPDATE_REQUESTED)
+
+
+ def rescanDevices(self):
+ """ Rescan and update all devices. """
+ if not self.updating:
+ self.RefreshAllAction.setEnabled(False)
+ try:
+ self.refreshDeviceList()
+ finally:
+ self.RefreshAllAction.setEnabled(True)
+
+
+ def callback(self):
+ qApp.processEvents()
+
+
+ # ***********************************************************************************
+ #
+ # DEVICE LIST RIGHT CLICK
+ #
+ # ***********************************************************************************
+
+ def DeviceList_customContextMenuRequested(self, p):
+ d = self.cur_device
+
+ if d is not None:
+ avail = d.device_state != DEVICE_STATE_NOT_FOUND and d.supported
+ printer = d.device_type == DEVICE_TYPE_PRINTER and avail
+
+ fax = d.fax_type > FAX_TYPE_NONE and prop.fax_build and d.device_type == DEVICE_TYPE_FAX and \
+ sys.hexversion >= 0x020300f0 and avail
+
+ scan = d.scan_type > SCAN_TYPE_NONE and prop.scan_build and \
+ printer and self.user_settings.cmd_scan
+
+ cpy = d.copy_type > COPY_TYPE_NONE and printer
+
+ popup = QMenu(self)
+
+ item = self.DeviceList.currentItem()
+ if item is not None:
+ if self.cur_device.error_state != ERROR_STATE_ERROR:
+ if printer:
+ popup.addAction(self.__tr("Print..."), lambda: self.contextMenuFunc(PrintDialog(self, self.cur_printer)))
+
+ if scan:
+ popup.addAction(self.__tr("Scan..."), lambda: self.contextMenuFunc(self.user_settings.cmd_scan)) #self.ScanButton_clicked)
+
+ if cpy:
+ popup.addAction(self.__tr("Make Copies..."), lambda: MakeCopiesDialog(self, self.cur_device_uri)) #self.MakeCopiesButton_clicked)
+
+ else: # self.cur_device.device_type == DEVICE_TYPE_FAX:
+ if fax:
+ popup.addAction(self.__tr("Send Fax..."), lambda: self.contextMenuFunc(SendFaxDialog(self, self.cur_printer, self.cur_device_uri))) #self.SendFaxButton_clicked)
+
+ popup.addSeparator()
+
+ if not self.updating:
+ popup.addAction(self.__tr("Refresh Device"), self.requestDeviceUpdate) #self.DeviceRefreshAction_activated)
+
+ if not self.updating:
+ popup.addAction(self.__tr("Refresh All"), self.rescanDevices) #self.RefreshAllAction_activated)
+
+ popup.addSeparator()
+
+ if self.DeviceList.viewMode() == QListView.IconMode:
+ popup.addAction(self.__tr("View as List"), lambda: self.setDeviceListViewMode(QListView.ListMode))
+ else:
+ popup.addAction(self.__tr("View as Icons"), lambda: self.setDeviceListViewMode(QListView.IconMode))
+
+ popup.exec_(self.DeviceList.mapToGlobal(p))
+
+
+ def contextMenuFunc(self, f):
+ self.sendMessage('', '', EVENT_DEVICE_STOP_POLLING)
+ try:
+ try:
+ f.exec_() # Dialog
+ except AttributeError:
+ beginWaitCursor()
+
+ if f.split(':')[0] in ('http', 'https', 'file'):
+ log.debug("Opening browser to: %s" % item.cmd)
+ utils.openURL(f)
+ else:
+ self.runExternalCommand(f)
+
+ QTimer.singleShot(1000, self.unlockClick)
+ finally:
+ self.sendMessage('', '', EVENT_DEVICE_START_POLLING)
+
+
+
+ # ***********************************************************************************
+ #
+ # PRINTER NAME COMBOS
+ #
+ # ***********************************************************************************
+
+
+ def updatePrinterCombos(self):
+ self.PrintSettingsPrinterNameCombo.clear()
+ self.PrintControlPrinterNameCombo.clear()
+
+ if self.cur_device is not None and \
+ self.cur_device.supported:
+
+ self.cur_device.updateCUPSPrinters()
+
+ for c in self.cur_device.cups_printers:
+ self.PrintSettingsPrinterNameCombo.insertItem(0, c.decode("utf-8"))
+ self.PrintControlPrinterNameCombo.insertItem(0, c.decode("utf-8"))
+
+ self.cur_printer = unicode(self.PrintSettingsPrinterNameCombo.currentText())
+
+
+ def PrintSettingsPrinterNameCombo_activated(self, s):
+ self.cur_printer = unicode(s)
+ self.updateCurrentTab()
+
+
+ def PrintControlPrinterNameCombo_activated(self, s):
+ self.cur_printer = unicode(s)
+ self.updateCurrentTab()
+
+
+
+ # ***********************************************************************************
+ #
+ # FUNCTIONS/ACTION TAB
+ #
+ # ***********************************************************************************
+
+ def initActionsTab(self):
+ self.click_lock = None
+ self.ActionsList.setIconSize(QSize(32, 32))
+ self.connect(self.ActionsList, SIGNAL("itemClicked(QListWidgetItem *)"), self.ActionsList_clicked)
+ self.connect(self.ActionsList, SIGNAL("itemDoubleClicked(QListWidgetItem *)"), self.ActionsList_clicked)
+
+
+ def updateActionsTab(self):
+ beginWaitCursor()
+ try:
+ self.ActionsList.clear()
+
+ d = self.cur_device
+
+ if d is not None:
+ avail = d.device_state != DEVICE_STATE_NOT_FOUND and d.supported
+ fax = d.fax_type > FAX_TYPE_NONE and prop.fax_build and d.device_type == DEVICE_TYPE_FAX and \
+ sys.hexversion >= 0x020300f0 and avail
+ printer = d.device_type == DEVICE_TYPE_PRINTER and avail
+ scan = d.scan_type > SCAN_TYPE_NONE and prop.scan_build and \
+ printer and self.user_settings.cmd_scan
+ cpy = d.copy_type > COPY_TYPE_NONE and printer
+ req_plugin = d.plugin == PLUGIN_REQUIRED
+ opt_plugin = d.plugin == PLUGIN_OPTIONAL
+
+ try:
+ back_end, is_hp, bus, model, serial, dev_file, host, zc, port = \
+ device.parseDeviceURI(self.cur_device_uri)
+ except Error:
+ return
+
+ hplip_conf = ConfigParser.ConfigParser()
+ fp = open("/etc/hp/hplip.conf", "r")
+ hplip_conf.readfp(fp)
+ fp.close()
+
+ try:
+ plugin_installed = utils.to_bool(hplip_conf.get("hplip", "plugin"))
+ except ConfigParser.NoOptionError:
+ plugin_installed = False
+
+ if d.plugin != PLUGIN_NONE:
+ if req_plugin and plugin_installed:
+ x = self.__tr("Download and install<br>required plugin (already installed).")
+
+ elif req_plugin and not plugin_installed:
+ x = self.__tr("Download and install<br>required plugin (needs installation).")
+
+ elif opt_plugin and plugin_installed:
+ x = self.__tr("Download and install<br>optional plugin (already installed).")
+
+ elif opt_plugin and not plugin_installed:
+ x = self.__tr("Download and install<br>optional plugin (needs installation).")
+
+ else:
+ x = ''
+
+ # TODO: Cache this data structure
+ # -- add a field that specifies if the icon should always show, or only when device is avail.
+ # TODO: Tooltips
+ # TODO: Right-click icon/list view menu
+
+ self.ICONS = [
+
+ # PRINTER
+
+ (lambda : printer,
+ self.__tr("Print"), # Text
+ "print", # Icon
+ self.__tr("Print documents or files."), # Tooltip
+ lambda : PrintDialog(self, self.cur_printer)), # command/action
+
+ (lambda :scan,
+ self.__tr("Scan"),
+ "scan",
+ self.__tr("Scan a document, image, or photograph.<br>"),
+ self.user_settings.cmd_scan),
+
+ (lambda : cpy,
+ self.__tr("Make Copies"),
+ "makecopies",
+ self.__tr("Make copies on the device controlled by the PC.<br>"),
+ lambda : MakeCopiesDialog(self, self.cur_device_uri)),
+
+ # FAX
+
+ (lambda: fax,
+ self.__tr("Send Fax"),
+ "fax",
+ self.__tr("Send a fax from the PC."),
+ lambda : SendFaxDialog(self, self.cur_printer, self.cur_device_uri)),
+
+ (lambda: fax,
+ self.__tr("Fax Setup"),
+ "fax_setup",
+ self.__tr("Fax support must be setup before you can send faxes."),
+ lambda : FaxSetupDialog(self, self.cur_device_uri)),
+
+ (lambda: fax and self.user_settings.cmd_fab,
+ self.__tr("Fax Address Book"),
+ "fab",
+ self.__tr("Setup fax phone numbers to use when sending faxes from the PC."),
+ self.user_settings.cmd_fab),
+
+ # SETTINGS/TOOLS
+
+ (lambda : d.power_settings != POWER_SETTINGS_NONE and avail,
+ self.__tr("Device Settings"),
+ "settings",
+ self.__tr("Your device has special device settings.<br>You may alter these settings here."),
+ lambda : DeviceSetupDialog(self, self.cur_device_uri)),
+
+ (lambda : printer,
+ self.__tr("Print Test Page"),
+ "testpage",
+ self.__tr("Print a test page to test the setup of your printer."),
+ lambda : PrintTestPageDialog(self, self.cur_printer)),
+
+ (lambda : True,
+ self.__tr("View Printer and Device Information"),
+ "cups",
+ self.__tr("View information about the device and all its CUPS queues."),
+ lambda : InfoDialog(self, self.cur_device_uri)),
+
+ (lambda: printer and d.align_type != ALIGN_TYPE_NONE,
+ self.__tr("Align Cartridges (Print Heads)"),
+ "align",
+ self.__tr("This will improve the quality of output when a new cartridge is installed."),
+ lambda : AlignDialog(self, self.cur_device_uri)),
+
+ (lambda: printer and d.clean_type != CLEAN_TYPE_NONE,
+ self.__tr("Clean Cartridges"),
+ "clean",
+ self.__tr("You only need to perform this action if you are<br>having problems with poor printout quality due to clogged ink nozzles."),
+ lambda : CleanDialog(self, self.cur_device_uri)),
+
+ (lambda: printer and d.color_cal_type != COLOR_CAL_TYPE_NONE and d.color_cal_type == COLOR_CAL_TYPE_TYPHOON,
+ self.__tr("Color Calibration"),
+ "colorcal",
+ self.__tr("Use this procedure to optimimize your printer's color output<br>(requires glossy photo paper)."),
+ lambda : ColorCalDialog(self, self.cur_device_uri)),
+
+ (lambda: printer and d.color_cal_type != COLOR_CAL_TYPE_NONE and d.color_cal_type != COLOR_CAL_TYPE_TYPHOON,
+ self.__tr("Color Calibration"),
+ "colorcal",
+ self.__tr("Use this procedure to optimimize your printer's color output."),
+ lambda : ColorCalDialog(self, self.cur_device_uri)),
+
+ (lambda: printer and d.linefeed_cal_type != LINEFEED_CAL_TYPE_NONE,
+ self.__tr("Line Feed Calibration"),
+ "linefeed_cal",
+ self.__tr("Use line feed calibration to optimize print quality<br>(to remove gaps in the printed output)."),
+ lambda : LineFeedCalDialog(self, self.cur_device_uri)),
+
+ (lambda: printer and d.pq_diag_type != PQ_DIAG_TYPE_NONE,
+ self.__tr("Print Diagnostic Page"),
+ "pq_diag",
+ self.__tr("Your printer can print a test page <br>to help diagnose print quality problems."),
+ lambda : PQDiagDialog(self, self.cur_device_uri)),
+
+ (lambda: printer and d.wifi_config >= WIFI_CONFIG_USB_XML and bus == 'usb',
+ self.__tr("Wireless/wifi setup using USB"),
+ "wireless",
+ self.__tr("Configure your wireless capable printer using a temporary USB connection."),
+ 'hp-wificonfig -d %s' % self.cur_device_uri),
+
+ # FIRMWARE
+
+ (lambda : printer and d.fw_download ,
+ self.__tr("Download Firmware"),
+ "firmware",
+ self.__tr("Download firmware to your printer <br>(required on some devices after each power-up)."),
+ lambda : FirmwareDialog(self, self.cur_device_uri)),
+
+ # PLUGIN
+
+ (lambda : printer and req_plugin,
+ self.__tr("Install Required Plugin"),
+ "plugin",
+ x,
+ lambda : PluginInstall(self, d.plugin, plugin_installed)),
+
+ (lambda : printer and opt_plugin,
+ self.__tr("Install Optional Plugin"),
+ "plugin",
+ x,
+ lambda : PluginInstall(self, d.plugin, plugin_installed)),
+
+ # Diagnose Queues
+ (lambda : True,
+ self.__tr("Diagnose Queues"),
+ "warning",
+ self.__tr("Diagnose Print/Fax Queues."),
+ lambda : DiagnoseQueue(self)),
+
+ # EWS
+
+ (lambda : printer and d.embedded_server_type > EWS_NONE and bus == 'net',
+ self.__tr("Open printer's web page in a browser"),
+ "ews",
+ self.__tr("The printer's web page has supply, status, and other information."),
+ openEWS(host, zc)),
+
+ # HELP/WEBSITE
+
+ (lambda : True,
+ self.__tr("Visit HPLIP Support Website"),
+ "hp_logo",
+ self.__tr("Visit HPLIP Support Website."),
+ self.support),
+
+ (lambda : True,
+ self.__tr("Help"),
+ "help",
+ self.__tr("View HPLIP help."),
+ self.docs),
+
+ ]
+
+ if not self.func_icons_cached:
+ for filter, text, icon, tooltip, cmd in self.ICONS:
+ self.func_icons[icon] = load_pixmap(icon, '32x32')
+ self.func_icons_cached = True
+
+ for filter, text, icon, tooltip, cmd in self.ICONS:
+ if filter is not None:
+ if not filter():
+ continue
+
+ FuncViewItem(self.ActionsList, text,
+ self.func_icons[icon],
+ tooltip,
+ cmd)
+ finally:
+ endWaitCursor()
+
+
+ def ActionsList_clicked(self, item):
+ if item is not None and self.click_lock is not item:
+ self.click_lock = item
+
+ if item.cmd and callable(item.cmd):
+ dlg = item.cmd()
+ self.sendMessage('', '', EVENT_DEVICE_STOP_POLLING)
+ try:
+ dlg.exec_()
+ finally:
+ self.sendMessage('', '', EVENT_DEVICE_START_POLLING)
+
+ else:
+ beginWaitCursor()
+ if item.cmd.split(':')[0] in ('http', 'https', 'file'):
+ log.debug("Opening browser to: %s" % item.cmd)
+ utils.openURL(item.cmd)
+ else:
+ self.runExternalCommand(item.cmd)
+
+ QTimer.singleShot(1000, self.unlockClick)
+
+
+ def unlockClick(self):
+ self.click_lock = None
+ endWaitCursor()
+
+
+ def ActionsList_customContextMenuRequested(self, p):
+ print p
+ #pass
+
+
+ # ***********************************************************************************
+ #
+ # STATUS TAB
+ #
+ # ***********************************************************************************
+
+ def initStatusTab(self):
+ self.StatusTable.setColumnCount(0)
+ self.status_headers = [self.__tr(""), self.__tr("Status"), self.__tr("Date and Time"),
+ self.__tr("Code"), self.__tr("Job ID"), self.__tr("Description")]
+
+
+ def updateStatusTab(self):
+ self.updateStatusLCD()
+ self.updateStatusTable()
+
+
+ def updateStatusLCD(self):
+ if self.cur_device is not None and \
+ self.cur_device.hist and \
+ self.cur_device.supported:
+
+ dq = self.cur_device.dq
+
+ if dq.get('panel', 0) == 1:
+ line1 = dq.get('panel-line1', '')
+ line2 = dq.get('panel-line2', '')
+ else:
+ try:
+ line1 = device.queryString(self.cur_device.hist[0].event_code)
+ except (AttributeError, TypeError):
+ line1 = ''
+
+ line2 = ''
+
+ self.drawStatusLCD(line1, line2)
+
+ else:
+ if self.cur_device.status_type == STATUS_TYPE_NONE:
+ self.drawStatusLCD(self.__tr("Status information not"), self.__tr("available for this device."))
+
+ elif not self.cur_device.supported:
+ self.drawStatusLCD(self.__tr("Device not supported."))
+
+ elif not self.cur_device.hist:
+ self.drawStatusLCD(self.__tr("No status history available."))
+
+ else:
+ self.drawStatusLCD()
+
+
+ def drawStatusLCD(self, line1='', line2=''):
+ pm = load_pixmap('panel_lcd', 'other')
+
+ p = QPainter()
+ p.begin(pm)
+ p.setPen(QColor(0, 0, 0))
+ p.setFont(self.font())
+
+ x, y_line1, y_line2 = 10, 17, 33
+
+ # TODO: Scroll long lines
+ if line1:
+ p.drawText(x, y_line1, line1)
+
+ if line2:
+ p.drawText(x, y_line2, line2)
+
+ p.end()
+
+ self.LCD.setPixmap(pm)
+
+
+
+ def updateStatusTable(self):
+ self.StatusTable.clear()
+ flags = Qt.ItemIsSelectable | Qt.ItemIsEnabled
+
+ row = 0
+ hist = self.cur_device.hist[:]
+
+ if hist:
+ self.StatusTable.setRowCount(len(hist))
+ self.StatusTable.setColumnCount(len(self.status_headers))
+ self.StatusTable.setHorizontalHeaderLabels(self.status_headers)
+ self.StatusTable.verticalHeader().hide()
+ self.StatusTable.horizontalHeader().show()
+
+ hist.reverse()
+ row = len(hist)-1
+
+ for e in hist:
+ if e is None:
+ continue
+
+ ess = device.queryString(e.event_code, 0)
+ esl = device.queryString(e.event_code, 1)
+
+ if row == 0:
+ desc = self.__tr("(most recent)")
+
+ else:
+ desc = getTimeDeltaDesc(e.timedate)
+
+ dt = QDateTime()
+ dt.setTime_t(int(e.timedate)) #, Qt.LocalTime)
+
+ # TODO: In Qt4.x, use QLocale.toString(date, format)
+ tt = QString("%1 %2").arg(dt.toString()).arg(desc)
+
+ if e.job_id:
+ job_id = unicode(e.job_id)
+ else:
+ job_id = u''
+
+ error_state = STATUS_TO_ERROR_STATE_MAP.get(e.event_code, ERROR_STATE_CLEAR)
+ tech_type = self.cur_device.tech_type
+
+ if tech_type in (TECH_TYPE_COLOR_INK, TECH_TYPE_MONO_INK):
+ status_pix = getStatusListIcon(error_state)[0] # ink
+ else:
+ status_pix = getStatusListIcon(error_state)[1] # laser
+
+ event_code = unicode(e.event_code)
+
+ i = QTableWidgetItem(QIcon(status_pix), self.__tr(""))
+ i.setFlags(flags)
+ self.StatusTable.setItem(row, 0, i)
+
+ for col, t in [(1, ess), (2, tt), (3, event_code), (4, job_id), (5, esl)]:
+ i = QTableWidgetItem(QString(t))
+ i.setFlags(flags)
+
+ self.StatusTable.setItem(row, col, i)
+
+ row -= 1
+
+ self.StatusTable.resizeColumnsToContents()
+ self.StatusTable.setColumnWidth(0, 24)
+
+ else:
+ self.StatusTable.setRowCount(1)
+ self.StatusTable.setColumnCount(2)
+ self.StatusTable.setHorizontalHeaderLabels(["", ""])
+ self.StatusTable.verticalHeader().hide()
+ self.StatusTable.horizontalHeader().hide()
+
+ flags = Qt.ItemIsEnabled
+
+ pixmap = getStatusListIcon(ERROR_STATE_ERROR)[0]
+ i = QTableWidgetItem(QIcon(pixmap), self.__tr(""))
+ i.setFlags(flags)
+ self.StatusTable.setItem(row, 0, i)
+
+ i = QTableWidgetItem(self.__tr("Status information not available for this device."))
+ i.setFlags(flags)
+ self.StatusTable.setItem(0, 1, i)
+
+ self.StatusTable.resizeColumnsToContents()
+ self.StatusTable.setColumnWidth(0, 24)
+
+
+ # ***********************************************************************************
+ #
+ # SUPPLIES TAB
+ #
+ # ***********************************************************************************
+
+ def initSuppliesTab(self):
+ self.pix_battery = load_pixmap('battery', '16x16')
+
+ yellow = "#ffff00"
+ light_yellow = "#ffffcc"
+ cyan = "#00ffff"
+ light_cyan = "#ccffff"
+ magenta = "#ff00ff"
+ light_magenta = "#ffccff"
+ black = "#000000"
+ blue = "#0000ff"
+ dark_grey = "#808080"
+ light_grey = "#c0c0c0"
+
+ self.TYPE_TO_PIX_MAP = {
+ AGENT_TYPE_UNSPECIFIED : [black],
+ AGENT_TYPE_BLACK: [black],
+ AGENT_TYPE_BLACK_B8800: [black],
+ AGENT_TYPE_CMY: [cyan, magenta, yellow],
+ AGENT_TYPE_KCM: [light_cyan, light_magenta, light_yellow],
+ AGENT_TYPE_GGK: [dark_grey],
+ AGENT_TYPE_YELLOW: [yellow],
+ AGENT_TYPE_MAGENTA: [magenta],
+ AGENT_TYPE_CYAN : [cyan],
+ AGENT_TYPE_CYAN_LOW: [light_cyan],
+ AGENT_TYPE_YELLOW_LOW: [light_yellow],
+ AGENT_TYPE_MAGENTA_LOW: [light_magenta],
+ AGENT_TYPE_BLUE: [blue],
+ AGENT_TYPE_KCMY_CM: [yellow, cyan, magenta],
+ AGENT_TYPE_LC_LM: [light_cyan, light_magenta],
+ #AGENT_TYPE_Y_M: [yellow, magenta],
+ #AGENT_TYPE_C_K: [black, cyan],
+ AGENT_TYPE_LG_PK: [light_grey, dark_grey],
+ AGENT_TYPE_LG: [light_grey],
+ AGENT_TYPE_G: [dark_grey],
+ AGENT_TYPE_PG: [light_grey],
+ AGENT_TYPE_C_M: [cyan, magenta],
+ AGENT_TYPE_K_Y: [black, yellow],
+ }
+
+ self.supplies_headers = [self.__tr(""), self.__tr("Description"),
+ self.__tr("HP Part No."), self.__tr("Approx. Level"),
+ self.__tr("Status")]
+
+
+ def updateSuppliesTab(self):
+ beginWaitCursor()
+ flags = Qt.ItemIsSelectable | Qt.ItemIsEnabled
+
+ try:
+ self.SuppliesTable.clear()
+ self.SuppliesTable.setRowCount(0)
+ self.SuppliesTable.setColumnCount(0)
+
+ if self.cur_device is not None and \
+ self.cur_device.supported and \
+ self.cur_device.status_type != STATUS_TYPE_NONE and \
+ self.cur_device.device_state != DEVICE_STATE_NOT_FOUND:
+
+ try:
+ self.cur_device.sorted_supplies
+ except AttributeError:
+ self.cur_device.sorted_supplies = []
+
+ if not self.cur_device.sorted_supplies:
+ a = 1
+ while True:
+ try:
+ agent_type = int(self.cur_device.dq['agent%d-type' % a])
+ agent_kind = int(self.cur_device.dq['agent%d-kind' % a])
+ agent_sku = self.cur_device.dq['agent%d-sku' % a]
+ except KeyError:
+ break
+ else:
+ self.cur_device.sorted_supplies.append((a, agent_kind, agent_type, agent_sku))
+
+ a += 1
+
+ self.cur_device.sorted_supplies.sort(lambda x, y: cmp(x[1], y[1]) or cmp(x[3], y[3]))
+
+ self.SuppliesTable.setRowCount(len(self.cur_device.sorted_supplies))
+ self.SuppliesTable.setColumnCount(len(self.supplies_headers))
+ self.SuppliesTable.setHorizontalHeaderLabels(self.supplies_headers)
+ self.SuppliesTable.verticalHeader().hide()
+ self.SuppliesTable.horizontalHeader().show()
+ self.SuppliesTable.setIconSize(QSize(100, 18))
+
+ for row, x in enumerate(self.cur_device.sorted_supplies):
+ a, agent_kind, agent_type, agent_sku = x
+ try:
+ agent_level = int(self.cur_device.dq['agent%d-level' % a])
+ agent_desc = self.cur_device.dq['agent%d-desc' % a]
+ agent_health_desc = self.cur_device.dq['agent%d-health-desc' % a]
+ except KeyError:
+ break
+ # Bar graph level
+ level_pixmap = None
+ if agent_kind in (AGENT_KIND_SUPPLY,
+ #AGENT_KIND_HEAD,
+ AGENT_KIND_HEAD_AND_SUPPLY,
+ AGENT_KIND_TONER_CARTRIDGE,
+ AGENT_KIND_MAINT_KIT,
+ AGENT_KIND_ADF_KIT,
+ AGENT_KIND_INT_BATTERY,
+ AGENT_KIND_DRUM_KIT,
+ ):
+
+ level_pixmap = self.createStatusLevelGraphic(agent_level, agent_type)
+
+ # Color icon
+ pixmap = None
+ if agent_kind in (AGENT_KIND_SUPPLY,
+ AGENT_KIND_HEAD,
+ AGENT_KIND_HEAD_AND_SUPPLY,
+ AGENT_KIND_TONER_CARTRIDGE,
+ #AGENT_KIND_MAINT_KIT,
+ #AGENT_KIND_ADF_KIT,
+ AGENT_KIND_INT_BATTERY,
+ #AGENT_KIND_DRUM_KIT,
+ ):
+
+ pixmap = self.getStatusIcon(agent_kind, agent_type)
+
+ if pixmap is not None:
+ i = QTableWidgetItem(QIcon(pixmap), self.__tr(""))
+ i.setFlags(flags)
+ self.SuppliesTable.setItem(row, 0, i)
+
+ for col, t in [(1, agent_desc), (2, agent_sku), (4, agent_health_desc)]:
+ i = QTableWidgetItem(QString(t))
+ i.setFlags(flags)
+ self.SuppliesTable.setItem(row, col, i)
+
+ if level_pixmap is not None:
+ i = QTableWidgetItem(QIcon(level_pixmap), self.__tr(""))
+ i.setFlags(flags)
+ self.SuppliesTable.setItem(row, 3, i)
+
+ self.SuppliesTable.resizeColumnsToContents()
+ self.SuppliesTable.setColumnWidth(0, 24)
+ self.SuppliesTable.setColumnWidth(3, 120)
+
+ else: # No supplies info
+ log.warning("Supplies information not available for this device.")
+ flags = Qt.ItemIsEnabled
+ self.SuppliesTable.setRowCount(1)
+ self.SuppliesTable.setColumnCount(2)
+ self.SuppliesTable.setHorizontalHeaderLabels(["", ""])
+ self.SuppliesTable.verticalHeader().hide()
+ self.SuppliesTable.horizontalHeader().hide()
+
+ i = QTableWidgetItem(self.__tr("Supplies information not available for this device."))
+ i.setFlags(flags)
+ self.SuppliesTable.setItem(0, 1, i)
+
+ pixmap = getStatusListIcon(ERROR_STATE_ERROR)[0]
+ i = QTableWidgetItem(QIcon(pixmap), self.__tr(""))
+ i.setFlags(flags)
+ self.SuppliesTable.setItem(0, 0, i)
+
+ self.SuppliesTable.resizeColumnsToContents()
+ self.SuppliesTable.setColumnWidth(0, 24)
+
+ finally:
+ endWaitCursor()
+
+
+ def getStatusIcon(self, agent_kind, agent_type):
+ if agent_kind in (AGENT_KIND_SUPPLY,
+ AGENT_KIND_HEAD,
+ AGENT_KIND_HEAD_AND_SUPPLY,
+ AGENT_KIND_TONER_CARTRIDGE):
+
+ map = self.TYPE_TO_PIX_MAP[agent_type]
+
+ if isinstance(map, list):
+ map_len = len(map)
+ pix = QPixmap(16, 16)
+ pix.fill(QColor(0, 0, 0, 0))
+ p = QPainter()
+
+ p.begin(pix)
+ p.setRenderHint(QPainter.Antialiasing)
+
+ if map_len == 1:
+ p.setPen(QColor(map[0]))
+ p.setBrush(QBrush(QColor(map[0]), Qt.SolidPattern))
+ p.drawPie(2, 2, 10, 10, 0, 5760)
+
+ elif map_len == 2:
+ p.setPen(QColor(map[0]))
+ p.setBrush(QBrush(QColor(map[0]), Qt.SolidPattern))
+ p.drawPie(2, 4, 8, 8, 0, 5760)
+
+ p.setPen(QColor(map[1]))
+ p.setBrush(QBrush(QColor(map[1]), Qt.SolidPattern))
+ p.drawPie(6, 4, 8, 8, 0, 5760)
+
+ elif map_len == 3:
+ p.setPen(QColor(map[2]))
+ p.setBrush(QBrush(QColor(map[2]), Qt.SolidPattern))
+ p.drawPie(6, 6, 8, 8, 0, 5760)
+
+ p.setPen(QColor(map[1]))
+ p.setBrush(QBrush(QColor(map[1]), Qt.SolidPattern))
+ p.drawPie(2, 6, 8, 8, 0, 5760)
+
+ p.setPen(QColor(map[0]))
+ p.setBrush(QBrush(QColor(map[0]), Qt.SolidPattern))
+ p.drawPie(4, 2, 8, 8, 0, 5760)
+
+ p.end()
+ return pix
+
+ else:
+ return map
+
+ elif agent_kind == AGENT_KIND_INT_BATTERY:
+ return self.pix_battery
+
+
+ def createStatusLevelGraphic(self, percent, agent_type, w=100, h=18):
+ if percent:
+ fw = w/100*percent
+ else:
+ fw = 0
+
+ px = QPixmap(w, h)
+ px.fill(QColor(0, 0, 0, 0))
+ pp = QPainter()
+ pp.begin(px)
+ pp.setRenderHint(QPainter.Antialiasing)
+ pp.setPen(Qt.black)
+
+ map = self.TYPE_TO_PIX_MAP[agent_type]
+ map_len = len(map)
+
+ if map_len == 1 or map_len > 3:
+ pp.fillRect(0, 0, fw, h, QBrush(QColor(map[0])))
+
+ elif map_len == 2:
+ h2 = h / 2
+ pp.fillRect(0, 0, fw, h2, QBrush(QColor(map[0])))
+ pp.fillRect(0, h2, fw, h, QBrush(QColor(map[1])))
+
+ elif map_len == 3:
+ h3 = h / 3
+ h23 = 2 * h3
+ pp.fillRect(0, 0, fw, h3, QBrush(QColor(map[0])))
+ pp.fillRect(0, h3, fw, h23, QBrush(QColor(map[1])))
+ pp.fillRect(0, h23, fw, h, QBrush(QColor(map[2])))
+
+ # draw black frame
+ pp.drawRect(0, 0, w, h)
+
+ if percent > 75 and agent_type in \
+ (AGENT_TYPE_BLACK, AGENT_TYPE_UNSPECIFIED, AGENT_TYPE_BLUE):
+ pp.setPen(Qt.white)
+
+ # 75% ticks
+ w1 = 3 * w / 4
+ h6 = h / 6
+ pp.drawLine(w1, 0, w1, h6)
+ pp.drawLine(w1, h, w1, h-h6)
+
+ if percent > 50 and agent_type in \
+ (AGENT_TYPE_BLACK, AGENT_TYPE_UNSPECIFIED, AGENT_TYPE_BLUE):
+ pp.setPen(Qt.white)
+
+ # 50% ticks
+ w2 = w / 2
+ h4 = h / 4
+ pp.drawLine(w2, 0, w2, h4)
+ pp.drawLine(w2, h, w2, h-h4)
+
+ if percent > 25 and agent_type in \
+ (AGENT_TYPE_BLACK, AGENT_TYPE_UNSPECIFIED, AGENT_TYPE_BLUE):
+ pp.setPen(Qt.white)
+
+ # 25% ticks
+ w4 = w / 4
+ pp.drawLine(w4, 0, w4, h6)
+ pp.drawLine(w4, h, w4, h-h6)
+
+ pp.end()
+
+ return px
+
+
+
+ # ***********************************************************************************
+ #
+ # PRINTER SETTINGS TAB
+ #
+ # ***********************************************************************************
+
+ def initPrintSettingsTab(self):
+ pass
+
+
+ def updatePrintSettingsTab(self):
+ beginWaitCursor()
+ try:
+ if self.cur_device.device_type == DEVICE_TYPE_PRINTER:
+ self.PrintSettingsPrinterNameLabel.setText(self.__tr("Printer Name:"))
+ else:
+ self.PrintSettingsPrinterNameLabel.setText(self.__tr("Fax Name:"))
+
+ self.PrintSettingsToolbox.updateUi(self.cur_device, self.cur_printer)
+ finally:
+ endWaitCursor()
+
+
+ # ***********************************************************************************
+ #
+ # PRINTER CONTROL TAB
+ #
+ # ***********************************************************************************
+
+ def initPrintControlTab(self):
+ self.JOB_STATES = { cups.IPP_JOB_PENDING : self.__tr("Pending"),
+ cups.IPP_JOB_HELD : self.__tr("On hold"),
+ cups.IPP_JOB_PROCESSING : self.__tr("Printing"),
+ cups.IPP_JOB_STOPPED : self.__tr("Stopped"),
+ cups.IPP_JOB_CANCELLED : self.__tr("Canceled"),
+ cups.IPP_JOB_ABORTED : self.__tr("Aborted"),
+ cups.IPP_JOB_COMPLETED : self.__tr("Completed"),
+ }
+
+ self.CancelJobButton.setIcon(QIcon(load_pixmap('cancel', '16x16')))
+ self.RefreshButton.setIcon(QIcon(load_pixmap('refresh', '16x16')))
+
+ self.JOB_STATE_ICONS = { cups.IPP_JOB_PENDING: QIcon(load_pixmap("busy", "16x16")),
+ cups.IPP_JOB_HELD : QIcon(load_pixmap("busy", "16x16")),
+ cups.IPP_JOB_PROCESSING : QIcon(load_pixmap("print", "16x16")),
+ cups.IPP_JOB_STOPPED : QIcon(load_pixmap("warning", "16x16")),
+ cups.IPP_JOB_CANCELLED : QIcon(load_pixmap("warning", "16x16")),
+ cups.IPP_JOB_ABORTED : QIcon(load_pixmap("error", "16x16")),
+ cups.IPP_JOB_COMPLETED : QIcon(load_pixmap("ok", "16x16")),
+ }
+
+ self.connect(self.StartStopButton, SIGNAL("clicked()"), self.StartStopButton_clicked)
+ self.connect(self.AcceptRejectButton, SIGNAL("clicked()"), self.AcceptRejectButton_clicked)
+ self.connect(self.SetDefaultButton, SIGNAL("clicked()"), self.SetDefaultButton_clicked)
+ self.connect(self.CancelJobButton, SIGNAL("clicked()"), self.CancelJobButton_clicked)
+ self.connect(self.RefreshButton, SIGNAL("clicked()"), self.RefreshButton_clicked)
+
+ self.job_headers = [self.__tr("Status"), self.__tr("Title/Description"), self.__tr("Job ID")]
+
+ # TODO: Check queues at startup and send events if stopped or rejecting
+
+
+ def initUpgradeTab(self):
+ self.connect(self.InstallLatestButton, SIGNAL("clicked()"), self.InstallLatestButton_clicked)
+ self.InstallLatestButton_lock = False
+
+
+ def InstallLatestButton_clicked(self):
+ if self.InstallLatestButton_lock is True:
+ return
+ if self.Is_autoInstaller_distro:
+ self.InstallLatestButton.setEnabled(False)
+ terminal_cmd = utils.get_terminal()
+ if terminal_cmd is not None and utils.which("hp-upgrade"):
+ cmd = terminal_cmd + " 'hp-upgrade'"
+ log.debug("cmd = %s " %cmd)
+ os.system(cmd)
+ else:
+ log.error("Failed to run hp-upgrade command from terminal =%s "%terminal_cmd)
+ self.InstallLatestButton.setEnabled(True)
+ else:
+ self.InstallLatestButton_lock = True
+ utils.openURL("http://hplipopensource.com/hplip-web/install/manual/index.html")
+ QTimer.singleShot(1000, self.InstallLatestButton_unlock)
+
+
+ def InstallLatestButton_unlock(self):
+ self.InstallLatestButton_lock = False
+
+
+ def CancelJobButton_clicked(self):
+ item = self.JobTable.currentItem()
+
+ if item is not None:
+ job_id, ok = item.data(Qt.UserRole).toInt()
+ if ok and job_id:
+ self.cur_device.cancelJob(job_id)
+ QTimer.singleShot(1000, self.updatePrintControlTab)
+
+
+ def RefreshButton_clicked(self):
+ self.updatePrintControlTab()
+
+ def updateHPLIPupgrade(self):
+ self.initUpgradeTab()
+
+
+
+
+ def updatePrintControlTab(self):
+ if self.cur_device.device_type == DEVICE_TYPE_PRINTER:
+ self.PrintControlPrinterNameLabel.setText(self.__tr("Printer Name:"))
+ else:
+ self.PrintControlPrinterNameLabel.setText(self.__tr("Fax Name:"))
+
+ self.JobTable.clear()
+ self.JobTable.setRowCount(0)
+ self.JobTable.setColumnCount(0)
+ self.updatePrintController()
+ flags = Qt.ItemIsSelectable | Qt.ItemIsEnabled
+ jobs = cups.getJobs()
+ num_jobs = 0
+ for j in jobs:
+ if j.dest.decode('utf-8') == unicode(self.cur_printer):
+ num_jobs += 1
+
+ if num_jobs:
+ self.CancelJobButton.setEnabled(True)
+ self.JobTable.setRowCount(num_jobs)
+ self.JobTable.setColumnCount(len(self.job_headers))
+ self.JobTable.setHorizontalHeaderLabels(self.job_headers)
+
+ for row, j in enumerate(jobs):
+ if j.dest.decode('utf-8') == unicode(self.cur_printer):
+ i = QTableWidgetItem(self.JOB_STATE_ICONS[j.state], self.JOB_STATES[j.state])
+ i.setData(Qt.UserRole, QVariant(j.id))
+ i.setFlags(flags)
+ self.JobTable.setItem(row, 0, i)
+
+ i = QTableWidgetItem(j.title)
+ i.setFlags(flags)
+ self.JobTable.setItem(row, 1, i)
+
+ i = QTableWidgetItem(unicode(j.id))
+ i.setFlags(flags)
+ self.JobTable.setItem(row, 2, i)
+
+
+ self.JobTable.setCurrentCell(0, 0)
+ self.JobTable.resizeColumnsToContents()
+
+ else:
+ self.CancelJobButton.setEnabled(False)
+
+
+ def getPrinterState(self):
+ self.printer_state = cups.IPP_PRINTER_STATE_IDLE
+ self.printer_accepting = True
+ cups_printers = cups.getPrinters()
+
+ for p in cups_printers:
+ if p.name.decode('utf-8') == self.cur_printer:
+ self.printer_state = p.state
+ self.printer_accepting = p.accepting
+ break
+
+
+ def updatePrintController(self):
+ # default printer
+ self.SetDefaultButton.setText(self.__tr("Set as Default"))
+
+ default_printer = cups.getDefaultPrinter()
+ if default_printer is not None:
+ default_printer = default_printer.decode('utf8')
+
+ if default_printer == self.cur_printer:
+ self.SetDefaultLabel.setText(self.__tr("Default Printer"))
+ self.SetDefaultIcon.setPixmap(load_pixmap("ok", "16x16"))
+ self.SetDefaultButton.setEnabled(False)
+
+ else:
+ self.SetDefaultLabel.setText(self.__tr("Not Default Printer"))
+ self.SetDefaultIcon.setPixmap(load_pixmap("info", "16x16"))
+ self.SetDefaultButton.setEnabled(True)
+
+ self.getPrinterState()
+
+ # start/stop
+ if self.printer_state == cups.IPP_PRINTER_STATE_IDLE:
+ self.StartStopLabel.setText(self.__tr("Started/Idle"))
+ self.StartStopIcon.setPixmap(load_pixmap("idle", "16x16"))
+
+ if self.cur_device.device_type == DEVICE_TYPE_PRINTER:
+ self.StartStopButton.setText(self.__tr("Stop Printer"))
+
+ else:
+ self.StartStopButton.setText(self.__tr("Stop Fax"))
+
+ elif self.printer_state == cups.IPP_PRINTER_STATE_PROCESSING:
+ self.StartStopLabel.setText(self.__tr("Started/Processing"))
+ self.StartStopIcon.setPixmap(load_pixmap("busy", "16x16"))
+
+ if self.cur_device.device_type == DEVICE_TYPE_PRINTER:
+ self.StartStopButton.setText(self.__tr("Stop Printer"))
+
+ else:
+ self.StartStopButton.setText(self.__tr("Stop Fax"))
+ else:
+ self.StartStopLabel.setText(self.__tr("Stopped"))
+ self.StartStopIcon.setPixmap(load_pixmap("warning", "16x16"))
+
+ if self.cur_device.device_type == DEVICE_TYPE_PRINTER:
+ self.StartStopButton.setText(self.__tr("Start Printer"))
+
+ else:
+ self.StartStopButton.setText(self.__tr("Start Fax"))
+
+ # reject/accept
+ if self.printer_accepting:
+ self.AcceptRejectLabel.setText(self.__tr("Accepting Jobs"))
+ self.AcceptRejectIcon.setPixmap(load_pixmap("idle", "16x16"))
+ self.AcceptRejectButton.setText(self.__tr("Reject Jobs"))
+
+ else:
+ self.AcceptRejectLabel.setText(self.__tr("Rejecting Jobs"))
+ self.AcceptRejectIcon.setPixmap(load_pixmap("warning", "16x16"))
+ self.AcceptRejectButton.setText(self.__tr("Accept Jobs"))
+
+
+
+ def StartStopButton_clicked(self):
+ beginWaitCursor()
+ try:
+ if self.printer_state in (cups.IPP_PRINTER_STATE_IDLE, cups.IPP_PRINTER_STATE_PROCESSING):
+ result = cups.stop(self.cur_printer)
+ if result:
+ if self.cur_device.device_type == DEVICE_TYPE_PRINTER:
+ e = EVENT_PRINTER_QUEUE_STOPPED
+ else:
+ e = EVENT_FAX_QUEUE_STOPPED
+
+ else:
+ result = cups.start(self.cur_printer)
+ if result:
+ if self.cur_device.device_type == DEVICE_TYPE_PRINTER:
+ e = EVENT_PRINTER_QUEUE_STARTED
+ else:
+ e = EVENT_FAX_QUEUE_STARTED
+
+ if result:
+ self.updatePrintController()
+ self.cur_device.sendEvent(e, self.cur_printer)
+ else:
+ if os.geteuid!=0 and utils.addgroup()!=[]:
+ FailureUI(self, self.__tr("<b>Start/Stop printer queue operation fails. Could not connect to CUPS Server</b><p>Is user added to %s group(s)" %utils.list_to_string(utils.addgroup())))
+
+ finally:
+ endWaitCursor()
+
+
+
+ def AcceptRejectButton_clicked(self):
+ beginWaitCursor()
+ try:
+ if self.printer_accepting:
+ result = cups.reject(self.cur_printer)
+ if result:
+ if self.cur_device.device_type == DEVICE_TYPE_PRINTER:
+ e = EVENT_PRINTER_QUEUE_REJECTING_JOBS
+ else:
+ e = EVENT_FAX_QUEUE_REJECTING_JOBS
+
+ else:
+ result = cups.accept(self.cur_printer)
+ if result:
+ if self.cur_device.device_type == DEVICE_TYPE_PRINTER:
+ e = EVENT_PRINTER_QUEUE_ACCEPTING_JOBS
+ else:
+ e = EVENT_FAX_QUEUE_ACCEPTING_JOBS
+
+ if result:
+ self.updatePrintController()
+ self.cur_device.sendEvent(e, self.cur_printer)
+ else:
+ if os.geteuid!=0 and utils.addgroup()!=[]:
+ FailureUI(self, self.__tr("<b>Accept/Reject printer queue operation fails. Could not connect to CUPS Server</b><p>Is user added to %s group(s)" %utils.list_to_string(utils.addgroup())))
+
+ finally:
+ endWaitCursor()
+
+
+
+ def SetDefaultButton_clicked(self):
+ beginWaitCursor()
+ try:
+ result = cups.setDefaultPrinter(self.cur_printer.encode('utf8'))
+ if not result:
+ if os.geteuid!=0 and utils.addgroup()!=[]:
+ FailureUI(self, self.__tr("<b>Set printer queue as default operation fails. Could not connect to CUPS Server</b><p>Is user added to %s group(s)" %utils.list_to_string(utils.addgroup())))
+ else:
+ self.updatePrintController()
+ if self.cur_device.device_type == DEVICE_TYPE_PRINTER:
+ e = EVENT_PRINTER_QUEUE_SET_AS_DEFAULT
+ else:
+ e = EVENT_FAX_QUEUE_SET_AS_DEFAULT
+
+ self.cur_device.sendEvent(e, self.cur_printer)
+
+ finally:
+ endWaitCursor()
+
+
+
+ def cancelCheckedJobs(self):
+ beginWaitCursor()
+ try:
+ item = self.JobTable.firstChild()
+ while item is not None:
+ if item.isOn():
+ self.cur_device.cancelJob(item.job_id)
+
+ item = item.nextSibling()
+
+ finally:
+ endWaitCursor()
+
+
+ self.updatePrintControlTab()
+
+
+
+
+ # ***********************************************************************************
+ #
+ # EXIT/CHILD CLEANUP
+ #
+ # ***********************************************************************************
+
+ def closeEvent(self, event):
+ self.cleanup()
+ event.accept()
+
+
+ def cleanup(self):
+ self.cleanupChildren()
+
+
+ def cleanupChildren(self):
+ log.debug("Cleaning up child processes.")
+ try:
+ os.waitpid(-1, os.WNOHANG)
+ except OSError:
+ pass
+
+
+ def quit(self):
+ self.cleanupChildren()
+ self.close()
+
+
+ # ***********************************************************************************
+ #
+ # DEVICE SETTINGS PLUGIN
+ #
+ # ***********************************************************************************
+
+
+ # ***********************************************************************************
+ #
+ # SETTINGS DIALOG
+ #
+ # ***********************************************************************************
+
+ def PreferencesAction_activated(self, tab_to_show=0):
+ dlg = SettingsDialog(self)
+ dlg.TabWidget.setCurrentIndex(tab_to_show)
+
+ if dlg.exec_() == QDialog.Accepted:
+ self.user_settings.load()
+
+ if self.cur_device is not None:
+ self.cur_device.sendEvent(EVENT_USER_CONFIGURATION_CHANGED, self.cur_printer)
+
+
+ # ***********************************************************************************
+ #
+ # SETUP/REMOVE
+ #
+ # ***********************************************************************************
+
+ def SetupDeviceAction_activated(self):
+ if utils.which('hp-setup'):
+ cmd = 'hp-setup --gui'
+ else:
+ cmd = 'python ./setup.py --gui'
+
+ log.debug(cmd)
+ utils.run(cmd, log_output=True, password_func=None, timeout=1)
+ self.rescanDevices()
+ self.updatePrinterCombos()
+
+
+ def RemoveDeviceAction_activated(self):
+ if utils.which('hp-setup'):
+ cmd = 'hp-setup --gui --remove'
+ else:
+ cmd = 'python ./setup.py --gui --remove'
+
+ if self.cur_device_uri is not None:
+ cmd += ' --device=%s' % self.cur_device_uri
+
+ log.debug(cmd)
+ utils.run(cmd, log_output=True, password_func=None, timeout=1)
+ self.rescanDevices()
+ self.updatePrinterCombos()
+
+
+ # ***********************************************************************************
+ #
+ # MISC
+ #
+ # ***********************************************************************************
+
+ def runExternalCommand(self, cmd, macro_char='%'):
+ beginWaitCursor()
+
+ try:
+ if len(cmd) == 0:
+ FailureUI(self.__tr("<p><b>Unable to run command. No command specified.</b><p>Use <pre>Configure...</pre> to specify a command to run."))
+ log.error("No command specified. Use settings to configure commands.")
+ else:
+ log.debug("Run: %s %s (%s) %s" % ("*"*20, cmd, self.cur_device_uri, "*"*20))
+ log.debug(cmd)
+
+ try:
+ cmd = ''.join([self.cur_device.device_vars.get(x, x) \
+ for x in cmd.split(macro_char)])
+ except AttributeError:
+ pass
+
+ log.debug(cmd)
+
+ path = cmd.split()[0]
+ args = cmd.split()
+
+ log.debug(path)
+ log.debug(args)
+
+ self.cleanupChildren()
+ os.spawnvp(os.P_NOWAIT, path, args)
+ qApp.processEvents()
+
+ finally:
+ endWaitCursor()
+
+
+ def helpContents(self):
+ utils.openURL(self.docs)
+
+
+ def helpAbout(self):
+ dlg = AboutDialog(self, prop.version, self.toolbox_version + " (Qt4)")
+ dlg.exec_()
+
+
+ def __tr(self,s,c = None):
+ return qApp.translate("DevMgr5",s,c)
+
+
+# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+
+class PasswordDialog(QDialog):
+ def __init__(self, prompt, parent=None, name=None, modal=0, fl=0):
+ QDialog.__init__(self, parent)
+ self.prompt = prompt
+
+ Layout= QGridLayout(self)
+ Layout.setMargin(11)
+ Layout.setSpacing(6)
+
+ self.PromptTextLabel = QLabel(self)
+ Layout.addWidget(self.PromptTextLabel,0,0,1,3)
+
+ self.UsernameTextLabel = QLabel(self)
+ Layout.addWidget(self.UsernameTextLabel,1,0)
+
+ self.UsernameLineEdit = QLineEdit(self)
+ self.UsernameLineEdit.setEchoMode(QLineEdit.Normal)
+ Layout.addWidget(self.UsernameLineEdit,1,1,1,2)
+
+ self.PasswordTextLabel = QLabel(self)
+ Layout.addWidget(self.PasswordTextLabel,2,0)
+
+ self.PasswordLineEdit = QLineEdit(self)
+ self.PasswordLineEdit.setEchoMode(QLineEdit.Password)
+ Layout.addWidget(self.PasswordLineEdit,2,1,1,2)
+
+ self.OkPushButton = QPushButton(self)
+ Layout.addWidget(self.OkPushButton,3,2)
+
+ self.languageChange()
+
+ self.resize(QSize(420,163).expandedTo(self.minimumSizeHint()))
+
+ self.connect(self.OkPushButton, SIGNAL("clicked()"), self.accept)
+ self.connect(self.PasswordLineEdit, SIGNAL("returnPressed()"), self.accept)
+
+
+ def getUsername(self):
+ return unicode(self.UsernameLineEdit.text())
+
+
+ def getPassword(self):
+ return unicode(self.PasswordLineEdit.text())
+
+
+ def languageChange(self):
+ self.setWindowTitle(self.__tr("HP Device Manager - Enter Username/Password"))
+ self.PromptTextLabel.setText(self.__tr(self.prompt))
+ self.UsernameTextLabel.setText(self.__tr("Username:"))
+ self.PasswordTextLabel.setText(self.__tr("Password:"))
+ self.OkPushButton.setText(self.__tr("OK"))
+
+
+ def __tr(self,s,c = None):
+ return qApp.translate("DevMgr5",s,c)
+
+# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+
+def showPasswordUI(prompt):
+ try:
+ dlg = PasswordDialog(prompt, None)
+
+ if dlg.exec_() == QDialog.Accepted:
+ return (dlg.getUsername(), dlg.getPassword())
+
+ finally:
+ pass
+
+ return ("", "")
+
+
+def openEWS(host, zc):
+ if zc:
+ status, ip = hpmudext.get_zc_ip_address(zc)
+ if status != hpmudext.HPMUD_R_OK:
+ ip = "hplipopensource.com"
+ else:
+ ip = host
+ return "http://%s" % ip
diff --git a/ui4/devmgr5_base.py b/ui4/devmgr5_base.py
new file mode 100644
index 0000000..3cdcfba
--- /dev/null
+++ b/ui4/devmgr5_base.py
@@ -0,0 +1,428 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'ui4/devmgr5_base.ui'
+#
+# Created: Thu Feb 2 15:07:11 2012
+# by: PyQt4 UI code generator 4.7.4
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt4 import QtCore, QtGui
+
+class Ui_MainWindow(object):
+ def setupUi(self, MainWindow,latest_available_version,Is_autoInstaller_distro):
+ MainWindow.setObjectName("MainWindow")
+ MainWindow.setWindowModality(QtCore.Qt.ApplicationModal)
+ MainWindow.resize(700, 500)
+ self.latest_available_version = latest_available_version
+ self.Is_autoInstaller_distro = Is_autoInstaller_distro
+ self.centralwidget = QtGui.QWidget(MainWindow)
+ self.centralwidget.setObjectName("centralwidget")
+ self.gridlayout = QtGui.QGridLayout(self.centralwidget)
+ self.gridlayout.setObjectName("gridlayout")
+ self.splitter = QtGui.QSplitter(self.centralwidget)
+ self.splitter.setOrientation(QtCore.Qt.Horizontal)
+ self.splitter.setObjectName("splitter")
+ self.DeviceList = QtGui.QListWidget(self.splitter)
+ self.DeviceList.setMovement(QtGui.QListView.Static)
+ self.DeviceList.setFlow(QtGui.QListView.TopToBottom)
+ self.DeviceList.setResizeMode(QtGui.QListView.Adjust)
+ self.DeviceList.setSpacing(10)
+ self.DeviceList.setViewMode(QtGui.QListView.IconMode)
+ self.DeviceList.setUniformItemSizes(True)
+ self.DeviceList.setWordWrap(True)
+ self.DeviceList.setSelectionRectVisible(False)
+ self.DeviceList.setObjectName("DeviceList")
+ self.Tabs = QtGui.QTabWidget(self.splitter)
+ sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Expanding)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.Tabs.sizePolicy().hasHeightForWidth())
+ self.Tabs.setSizePolicy(sizePolicy)
+ self.Tabs.setObjectName("Tabs")
+ self.Actions = QtGui.QWidget()
+ self.Actions.setObjectName("Actions")
+ self.gridlayout1 = QtGui.QGridLayout(self.Actions)
+ self.gridlayout1.setObjectName("gridlayout1")
+ self.ActionsList = QtGui.QListWidget(self.Actions)
+ self.ActionsList.setSpacing(10)
+ self.ActionsList.setViewMode(QtGui.QListView.ListMode)
+ self.ActionsList.setUniformItemSizes(True)
+ self.ActionsList.setWordWrap(True)
+ self.ActionsList.setObjectName("ActionsList")
+ self.gridlayout1.addWidget(self.ActionsList, 0, 0, 1, 1)
+ self.Tabs.addTab(self.Actions, "")
+ self.Status = QtGui.QWidget()
+ self.Status.setObjectName("Status")
+ self.gridlayout2 = QtGui.QGridLayout(self.Status)
+ self.gridlayout2.setObjectName("gridlayout2")
+ self.hboxlayout = QtGui.QHBoxLayout()
+ self.hboxlayout.setObjectName("hboxlayout")
+ spacerItem = QtGui.QSpacerItem(21, 40, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+ self.hboxlayout.addItem(spacerItem)
+ self.LCD = QtGui.QLabel(self.Status)
+ sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.LCD.sizePolicy().hasHeightForWidth())
+ self.LCD.setSizePolicy(sizePolicy)
+ self.LCD.setMinimumSize(QtCore.QSize(254, 40))
+ self.LCD.setMaximumSize(QtCore.QSize(254, 40))
+ self.LCD.setObjectName("LCD")
+ self.hboxlayout.addWidget(self.LCD)
+ spacerItem1 = QtGui.QSpacerItem(21, 40, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+ self.hboxlayout.addItem(spacerItem1)
+ self.gridlayout2.addLayout(self.hboxlayout, 0, 0, 1, 1)
+ self.StatusTable = QtGui.QTableWidget(self.Status)
+ self.StatusTable.setAlternatingRowColors(True)
+ self.StatusTable.setSelectionMode(QtGui.QAbstractItemView.SingleSelection)
+ self.StatusTable.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows)
+ self.StatusTable.setShowGrid(False)
+ self.StatusTable.setCornerButtonEnabled(False)
+ self.StatusTable.setObjectName("StatusTable")
+ self.StatusTable.setColumnCount(0)
+ self.StatusTable.setRowCount(0)
+ self.gridlayout2.addWidget(self.StatusTable, 1, 0, 1, 1)
+ self.Tabs.addTab(self.Status, "")
+ self.Supplies = QtGui.QWidget()
+ self.Supplies.setObjectName("Supplies")
+ self.gridlayout3 = QtGui.QGridLayout(self.Supplies)
+ self.gridlayout3.setObjectName("gridlayout3")
+ self.SuppliesTable = QtGui.QTableWidget(self.Supplies)
+ self.SuppliesTable.setAlternatingRowColors(True)
+ self.SuppliesTable.setSelectionMode(QtGui.QAbstractItemView.SingleSelection)
+ self.SuppliesTable.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows)
+ self.SuppliesTable.setShowGrid(False)
+ self.SuppliesTable.setCornerButtonEnabled(False)
+ self.SuppliesTable.setObjectName("SuppliesTable")
+ self.SuppliesTable.setColumnCount(0)
+ self.SuppliesTable.setRowCount(0)
+ self.gridlayout3.addWidget(self.SuppliesTable, 0, 0, 1, 1)
+ self.Tabs.addTab(self.Supplies, "")
+ self.Settings = QtGui.QWidget()
+ self.Settings.setObjectName("Settings")
+ self.gridlayout4 = QtGui.QGridLayout(self.Settings)
+ self.gridlayout4.setObjectName("gridlayout4")
+ self.hboxlayout1 = QtGui.QHBoxLayout()
+ self.hboxlayout1.setObjectName("hboxlayout1")
+ self.PrintSettingsPrinterNameLabel = QtGui.QLabel(self.Settings)
+ self.PrintSettingsPrinterNameLabel.setObjectName("PrintSettingsPrinterNameLabel")
+ self.hboxlayout1.addWidget(self.PrintSettingsPrinterNameLabel)
+ self.PrintSettingsPrinterNameCombo = QtGui.QComboBox(self.Settings)
+ sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.PrintSettingsPrinterNameCombo.sizePolicy().hasHeightForWidth())
+ self.PrintSettingsPrinterNameCombo.setSizePolicy(sizePolicy)
+ self.PrintSettingsPrinterNameCombo.setObjectName("PrintSettingsPrinterNameCombo")
+ self.hboxlayout1.addWidget(self.PrintSettingsPrinterNameCombo)
+ self.gridlayout4.addLayout(self.hboxlayout1, 0, 0, 1, 1)
+ self.PrintSettingsToolbox = PrintSettingsToolbox(self.Settings)
+ self.PrintSettingsToolbox.setObjectName("PrintSettingsToolbox")
+ self.gridlayout4.addWidget(self.PrintSettingsToolbox, 1, 0, 1, 1)
+ self.Tabs.addTab(self.Settings, "")
+ self.Control = QtGui.QWidget()
+ self.Control.setObjectName("Control")
+ self.gridlayout5 = QtGui.QGridLayout(self.Control)
+ self.gridlayout5.setObjectName("gridlayout5")
+ self.hboxlayout2 = QtGui.QHBoxLayout()
+ self.hboxlayout2.setObjectName("hboxlayout2")
+ self.PrintControlPrinterNameLabel = QtGui.QLabel(self.Control)
+ self.PrintControlPrinterNameLabel.setObjectName("PrintControlPrinterNameLabel")
+ self.hboxlayout2.addWidget(self.PrintControlPrinterNameLabel)
+ self.PrintControlPrinterNameCombo = QtGui.QComboBox(self.Control)
+ sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.PrintControlPrinterNameCombo.sizePolicy().hasHeightForWidth())
+ self.PrintControlPrinterNameCombo.setSizePolicy(sizePolicy)
+ self.PrintControlPrinterNameCombo.setObjectName("PrintControlPrinterNameCombo")
+ self.hboxlayout2.addWidget(self.PrintControlPrinterNameCombo)
+ self.gridlayout5.addLayout(self.hboxlayout2, 0, 0, 1, 1)
+ self.groupBox = QtGui.QGroupBox(self.Control)
+ self.groupBox.setObjectName("groupBox")
+ self.gridlayout6 = QtGui.QGridLayout(self.groupBox)
+ self.gridlayout6.setObjectName("gridlayout6")
+ self.vboxlayout = QtGui.QVBoxLayout()
+ self.vboxlayout.setObjectName("vboxlayout")
+ self.groupBox_3 = QtGui.QGroupBox(self.groupBox)
+ sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Maximum)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.groupBox_3.sizePolicy().hasHeightForWidth())
+ self.groupBox_3.setSizePolicy(sizePolicy)
+ self.groupBox_3.setTitle("")
+ self.groupBox_3.setObjectName("groupBox_3")
+ self.gridlayout7 = QtGui.QGridLayout(self.groupBox_3)
+ self.gridlayout7.setMargin(1)
+ self.gridlayout7.setHorizontalSpacing(6)
+ self.gridlayout7.setVerticalSpacing(1)
+ self.gridlayout7.setObjectName("gridlayout7")
+ self.hboxlayout3 = QtGui.QHBoxLayout()
+ self.hboxlayout3.setObjectName("hboxlayout3")
+ self.StartStopIcon = QtGui.QLabel(self.groupBox_3)
+ sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.StartStopIcon.sizePolicy().hasHeightForWidth())
+ self.StartStopIcon.setSizePolicy(sizePolicy)
+ self.StartStopIcon.setMinimumSize(QtCore.QSize(16, 16))
+ self.StartStopIcon.setMaximumSize(QtCore.QSize(16, 16))
+ self.StartStopIcon.setText("")
+ self.StartStopIcon.setObjectName("StartStopIcon")
+ self.hboxlayout3.addWidget(self.StartStopIcon)
+ self.StartStopLabel = QtGui.QLabel(self.groupBox_3)
+ self.StartStopLabel.setFrameShape(QtGui.QFrame.NoFrame)
+ self.StartStopLabel.setAlignment(QtCore.Qt.AlignCenter)
+ self.StartStopLabel.setObjectName("StartStopLabel")
+ self.hboxlayout3.addWidget(self.StartStopLabel)
+ self.gridlayout7.addLayout(self.hboxlayout3, 0, 0, 1, 1)
+ self.vboxlayout.addWidget(self.groupBox_3)
+ self.StartStopButton = QtGui.QPushButton(self.groupBox)
+ self.StartStopButton.setObjectName("StartStopButton")
+ self.vboxlayout.addWidget(self.StartStopButton)
+ self.gridlayout6.addLayout(self.vboxlayout, 0, 0, 1, 1)
+ self.vboxlayout1 = QtGui.QVBoxLayout()
+ self.vboxlayout1.setObjectName("vboxlayout1")
+ self.groupBox_4 = QtGui.QGroupBox(self.groupBox)
+ sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Maximum)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.groupBox_4.sizePolicy().hasHeightForWidth())
+ self.groupBox_4.setSizePolicy(sizePolicy)
+ self.groupBox_4.setTitle("")
+ self.groupBox_4.setObjectName("groupBox_4")
+ self.gridlayout8 = QtGui.QGridLayout(self.groupBox_4)
+ self.gridlayout8.setMargin(1)
+ self.gridlayout8.setHorizontalSpacing(6)
+ self.gridlayout8.setVerticalSpacing(1)
+ self.gridlayout8.setObjectName("gridlayout8")
+ self.hboxlayout4 = QtGui.QHBoxLayout()
+ self.hboxlayout4.setObjectName("hboxlayout4")
+ self.AcceptRejectIcon = QtGui.QLabel(self.groupBox_4)
+ sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.AcceptRejectIcon.sizePolicy().hasHeightForWidth())
+ self.AcceptRejectIcon.setSizePolicy(sizePolicy)
+ self.AcceptRejectIcon.setMinimumSize(QtCore.QSize(16, 16))
+ self.AcceptRejectIcon.setMaximumSize(QtCore.QSize(16, 16))
+ self.AcceptRejectIcon.setText("")
+ self.AcceptRejectIcon.setObjectName("AcceptRejectIcon")
+ self.hboxlayout4.addWidget(self.AcceptRejectIcon)
+ self.AcceptRejectLabel = QtGui.QLabel(self.groupBox_4)
+ self.AcceptRejectLabel.setFrameShape(QtGui.QFrame.NoFrame)
+ self.AcceptRejectLabel.setAlignment(QtCore.Qt.AlignCenter)
+ self.AcceptRejectLabel.setObjectName("AcceptRejectLabel")
+ self.hboxlayout4.addWidget(self.AcceptRejectLabel)
+ self.gridlayout8.addLayout(self.hboxlayout4, 0, 0, 1, 1)
+ self.vboxlayout1.addWidget(self.groupBox_4)
+ self.AcceptRejectButton = QtGui.QPushButton(self.groupBox)
+ self.AcceptRejectButton.setObjectName("AcceptRejectButton")
+ self.vboxlayout1.addWidget(self.AcceptRejectButton)
+ self.gridlayout6.addLayout(self.vboxlayout1, 0, 1, 1, 1)
+ self.vboxlayout2 = QtGui.QVBoxLayout()
+ self.vboxlayout2.setObjectName("vboxlayout2")
+ self.groupBox_5 = QtGui.QGroupBox(self.groupBox)
+ sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Maximum)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.groupBox_5.sizePolicy().hasHeightForWidth())
+ self.groupBox_5.setSizePolicy(sizePolicy)
+ self.groupBox_5.setTitle("")
+ self.groupBox_5.setObjectName("groupBox_5")
+ self.gridlayout9 = QtGui.QGridLayout(self.groupBox_5)
+ self.gridlayout9.setMargin(1)
+ self.gridlayout9.setHorizontalSpacing(6)
+ self.gridlayout9.setVerticalSpacing(1)
+ self.gridlayout9.setObjectName("gridlayout9")
+ self.hboxlayout5 = QtGui.QHBoxLayout()
+ self.hboxlayout5.setObjectName("hboxlayout5")
+ self.SetDefaultIcon = QtGui.QLabel(self.groupBox_5)
+ sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.SetDefaultIcon.sizePolicy().hasHeightForWidth())
+ self.SetDefaultIcon.setSizePolicy(sizePolicy)
+ self.SetDefaultIcon.setMinimumSize(QtCore.QSize(16, 16))
+ self.SetDefaultIcon.setMaximumSize(QtCore.QSize(16, 16))
+ self.SetDefaultIcon.setText("")
+ self.SetDefaultIcon.setObjectName("SetDefaultIcon")
+ self.hboxlayout5.addWidget(self.SetDefaultIcon)
+ self.SetDefaultLabel = QtGui.QLabel(self.groupBox_5)
+ self.SetDefaultLabel.setFrameShape(QtGui.QFrame.NoFrame)
+ self.SetDefaultLabel.setAlignment(QtCore.Qt.AlignCenter)
+ self.SetDefaultLabel.setObjectName("SetDefaultLabel")
+ self.hboxlayout5.addWidget(self.SetDefaultLabel)
+ self.gridlayout9.addLayout(self.hboxlayout5, 0, 0, 1, 1)
+ self.vboxlayout2.addWidget(self.groupBox_5)
+ self.SetDefaultButton = QtGui.QPushButton(self.groupBox)
+ self.SetDefaultButton.setObjectName("SetDefaultButton")
+ self.vboxlayout2.addWidget(self.SetDefaultButton)
+ self.gridlayout6.addLayout(self.vboxlayout2, 0, 2, 1, 1)
+ self.gridlayout5.addWidget(self.groupBox, 1, 0, 1, 1)
+ self.groupBox_2 = QtGui.QGroupBox(self.Control)
+ self.groupBox_2.setObjectName("groupBox_2")
+ self.gridlayout10 = QtGui.QGridLayout(self.groupBox_2)
+ self.gridlayout10.setObjectName("gridlayout10")
+ self.JobTable = QtGui.QTableWidget(self.groupBox_2)
+ self.JobTable.setAlternatingRowColors(True)
+ self.JobTable.setSelectionMode(QtGui.QAbstractItemView.SingleSelection)
+ self.JobTable.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows)
+ self.JobTable.setGridStyle(QtCore.Qt.DotLine)
+ self.JobTable.setObjectName("JobTable")
+ self.JobTable.setColumnCount(0)
+ self.JobTable.setRowCount(0)
+ self.gridlayout10.addWidget(self.JobTable, 0, 0, 1, 3)
+ self.CancelJobButton = QtGui.QPushButton(self.groupBox_2)
+ self.CancelJobButton.setObjectName("CancelJobButton")
+ self.gridlayout10.addWidget(self.CancelJobButton, 1, 0, 1, 1)
+ spacerItem2 = QtGui.QSpacerItem(131, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+ self.gridlayout10.addItem(spacerItem2, 1, 1, 1, 1)
+ self.RefreshButton = QtGui.QPushButton(self.groupBox_2)
+ self.RefreshButton.setObjectName("RefreshButton")
+ self.gridlayout10.addWidget(self.RefreshButton, 1, 2, 1, 1)
+ self.gridlayout5.addWidget(self.groupBox_2, 2, 0, 1, 1)
+ self.Tabs.addTab(self.Control, "")
+ if self.latest_available_version is not "":
+ self.tab_3 = QtGui.QWidget()
+ self.tab_3.setObjectName("tab_3")
+ self.label = QtGui.QLabel(self.tab_3)
+ self.label.setGeometry(QtCore.QRect(30, 45, 300, 17))
+ self.label.setObjectName("label")
+ if self.Is_autoInstaller_distro:
+ self.InstallLatestButton = QtGui.QPushButton(self.tab_3)
+ self.InstallLatestButton.setGeometry(QtCore.QRect(351, 40, 96, 27))
+ self.InstallLatestButton.setObjectName("pushButton")
+ else:
+ self.ManualInstalllabel = QtGui.QLabel(self.tab_3)
+ self.ManualInstalllabel.setGeometry(QtCore.QRect(30, 70,300, 45))
+ self.ManualInstalllabel.setObjectName("label")
+ self.InstallLatestButton = QtGui.QPushButton(self.tab_3)
+ self.InstallLatestButton.setGeometry(QtCore.QRect(295, 80, 110, 25))
+ self.InstallLatestButton.setObjectName("pushButton")
+ self.Tabs.addTab(self.tab_3, "")
+
+ self.gridlayout.addWidget(self.splitter, 0, 0, 1, 1)
+ MainWindow.setCentralWidget(self.centralwidget)
+ self.Menubar = QtGui.QMenuBar(MainWindow)
+ self.Menubar.setGeometry(QtCore.QRect(0, 0, 700, 27))
+ self.Menubar.setObjectName("Menubar")
+ self.DeviceMenu = QtGui.QMenu(self.Menubar)
+ self.DeviceMenu.setObjectName("DeviceMenu")
+ self.ConfigureMenu = QtGui.QMenu(self.Menubar)
+ self.ConfigureMenu.setObjectName("ConfigureMenu")
+ self.HelpMenu = QtGui.QMenu(self.Menubar)
+ self.HelpMenu.setObjectName("HelpMenu")
+ self.ViewMenu = QtGui.QMenu(self.Menubar)
+ self.ViewMenu.setObjectName("ViewMenu")
+ MainWindow.setMenuBar(self.Menubar)
+ self.Statusbar = QtGui.QStatusBar(MainWindow)
+ self.Statusbar.setObjectName("Statusbar")
+ MainWindow.setStatusBar(self.Statusbar)
+ self.toolBar = QtGui.QToolBar(MainWindow)
+ self.toolBar.setObjectName("toolBar")
+ MainWindow.addToolBar(QtCore.Qt.ToolBarArea(QtCore.Qt.TopToolBarArea), self.toolBar)
+ self.QuitAction = QtGui.QAction(MainWindow)
+ self.QuitAction.setObjectName("QuitAction")
+ self.PreferencesAction = QtGui.QAction(MainWindow)
+ self.PreferencesAction.setObjectName("PreferencesAction")
+ self.AboutAction = QtGui.QAction(MainWindow)
+ self.AboutAction.setObjectName("AboutAction")
+ self.ContentsAction = QtGui.QAction(MainWindow)
+ self.ContentsAction.setObjectName("ContentsAction")
+ self.DeviceSettingsAction = QtGui.QAction(MainWindow)
+ self.DeviceSettingsAction.setEnabled(False)
+ self.DeviceSettingsAction.setObjectName("DeviceSettingsAction")
+ self.DeviceRefreshAction = QtGui.QAction(MainWindow)
+ self.DeviceRefreshAction.setObjectName("DeviceRefreshAction")
+ self.RefreshAllAction = QtGui.QAction(MainWindow)
+ self.RefreshAllAction.setObjectName("RefreshAllAction")
+ self.SetupDeviceAction = QtGui.QAction(MainWindow)
+ self.SetupDeviceAction.setObjectName("SetupDeviceAction")
+ self.RemoveDeviceAction = QtGui.QAction(MainWindow)
+ self.RemoveDeviceAction.setObjectName("RemoveDeviceAction")
+ self.ViewAsListAction = QtGui.QAction(MainWindow)
+ self.ViewAsListAction.setObjectName("ViewAsListAction")
+ self.ViewAsIconsAction = QtGui.QAction(MainWindow)
+ self.ViewAsIconsAction.setObjectName("ViewAsIconsAction")
+ self.DeviceMenu.addAction(self.DeviceSettingsAction)
+ self.DeviceMenu.addSeparator()
+ self.DeviceMenu.addAction(self.DeviceRefreshAction)
+ self.DeviceMenu.addAction(self.RefreshAllAction)
+ self.DeviceMenu.addSeparator()
+ self.DeviceMenu.addAction(self.SetupDeviceAction)
+ self.DeviceMenu.addAction(self.RemoveDeviceAction)
+ self.DeviceMenu.addSeparator()
+ self.DeviceMenu.addAction(self.QuitAction)
+ self.ConfigureMenu.addAction(self.PreferencesAction)
+ self.HelpMenu.addAction(self.ContentsAction)
+ self.HelpMenu.addAction(self.AboutAction)
+ self.ViewMenu.addAction(self.ViewAsListAction)
+ self.ViewMenu.addAction(self.ViewAsIconsAction)
+ self.Menubar.addAction(self.DeviceMenu.menuAction())
+ self.Menubar.addAction(self.ViewMenu.menuAction())
+ self.Menubar.addAction(self.ConfigureMenu.menuAction())
+ self.Menubar.addAction(self.HelpMenu.menuAction())
+ self.toolBar.addAction(self.DeviceRefreshAction)
+ self.toolBar.addAction(self.RefreshAllAction)
+ self.toolBar.addSeparator()
+ self.toolBar.addAction(self.SetupDeviceAction)
+ self.toolBar.addAction(self.RemoveDeviceAction)
+ self.toolBar.addSeparator()
+ self.toolBar.addAction(self.ContentsAction)
+
+ self.retranslateUi(MainWindow)
+ self.Tabs.setCurrentIndex(0)
+ self.PrintSettingsToolbox.setCurrentIndex(-1)
+ QtCore.QMetaObject.connectSlotsByName(MainWindow)
+
+ def retranslateUi(self, MainWindow):
+ MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "HP Device Manager", None, QtGui.QApplication.UnicodeUTF8))
+ self.Tabs.setTabText(self.Tabs.indexOf(self.Actions), QtGui.QApplication.translate("MainWindow", "Actions", None, QtGui.QApplication.UnicodeUTF8))
+ self.Tabs.setTabText(self.Tabs.indexOf(self.Status), QtGui.QApplication.translate("MainWindow", "Status", None, QtGui.QApplication.UnicodeUTF8))
+ self.Tabs.setTabText(self.Tabs.indexOf(self.Supplies), QtGui.QApplication.translate("MainWindow", "Supplies", None, QtGui.QApplication.UnicodeUTF8))
+ self.PrintSettingsPrinterNameLabel.setText(QtGui.QApplication.translate("MainWindow", "Printer Name:", None, QtGui.QApplication.UnicodeUTF8))
+ self.Tabs.setTabText(self.Tabs.indexOf(self.Settings), QtGui.QApplication.translate("MainWindow", "Print Settings", None, QtGui.QApplication.UnicodeUTF8))
+ self.PrintControlPrinterNameLabel.setText(QtGui.QApplication.translate("MainWindow", "Printer Name:", None, QtGui.QApplication.UnicodeUTF8))
+ self.groupBox.setTitle(QtGui.QApplication.translate("MainWindow", "Printer/Queue Control", None, QtGui.QApplication.UnicodeUTF8))
+ self.StartStopLabel.setText(QtGui.QApplication.translate("MainWindow", "Started", None, QtGui.QApplication.UnicodeUTF8))
+ self.StartStopButton.setText(QtGui.QApplication.translate("MainWindow", "Stop Printer", None, QtGui.QApplication.UnicodeUTF8))
+ self.AcceptRejectLabel.setText(QtGui.QApplication.translate("MainWindow", "Accepting", None, QtGui.QApplication.UnicodeUTF8))
+ self.AcceptRejectButton.setText(QtGui.QApplication.translate("MainWindow", "Reject Jobs", None, QtGui.QApplication.UnicodeUTF8))
+ self.SetDefaultLabel.setText(QtGui.QApplication.translate("MainWindow", "Not default", None, QtGui.QApplication.UnicodeUTF8))
+ self.SetDefaultButton.setText(QtGui.QApplication.translate("MainWindow", "Set as Default", None, QtGui.QApplication.UnicodeUTF8))
+ self.groupBox_2.setTitle(QtGui.QApplication.translate("MainWindow", "Job Queue", None, QtGui.QApplication.UnicodeUTF8))
+ self.CancelJobButton.setText(QtGui.QApplication.translate("MainWindow", "Cancel Job", None, QtGui.QApplication.UnicodeUTF8))
+ self.RefreshButton.setText(QtGui.QApplication.translate("MainWindow", "Refresh", None, QtGui.QApplication.UnicodeUTF8))
+ self.Tabs.setTabText(self.Tabs.indexOf(self.Control), QtGui.QApplication.translate("MainWindow", "Printer Control", None, QtGui.QApplication.UnicodeUTF8))
+ if self.latest_available_version is not "":
+ self.label.setText(QtGui.QApplication.translate("MainWindow", "New version of HPLIP-%s is available"%self.latest_available_version, None, QtGui.QApplication.UnicodeUTF8))
+ self.Tabs.setTabText(self.Tabs.indexOf(self.tab_3), QtGui.QApplication.translate("MainWindow", "Upgrade", None, QtGui.QApplication.UnicodeUTF8))
+ if self.Is_autoInstaller_distro:
+ self.InstallLatestButton.setText(QtGui.QApplication.translate("MainWindow", "Install now", None, QtGui.QApplication.UnicodeUTF8))
+ else:
+ msg="Please install manually as mentioned in "
+ self.ManualInstalllabel.setText(QtGui.QApplication.translate("MainWindow", msg, None, QtGui.QApplication.UnicodeUTF8))
+ self.InstallLatestButton.setText(QtGui.QApplication.translate("MainWindow", "HPLIP website", None, QtGui.QApplication.UnicodeUTF8))
+
+ self.DeviceMenu.setTitle(QtGui.QApplication.translate("MainWindow", "&Device", None, QtGui.QApplication.UnicodeUTF8))
+ self.ConfigureMenu.setTitle(QtGui.QApplication.translate("MainWindow", "&Configure", None, QtGui.QApplication.UnicodeUTF8))
+ self.HelpMenu.setTitle(QtGui.QApplication.translate("MainWindow", "&Help", None, QtGui.QApplication.UnicodeUTF8))
+ self.ViewMenu.setTitle(QtGui.QApplication.translate("MainWindow", "&View", None, QtGui.QApplication.UnicodeUTF8))
+ self.toolBar.setWindowTitle(QtGui.QApplication.translate("MainWindow", "toolBar_2", None, QtGui.QApplication.UnicodeUTF8))
+ self.QuitAction.setText(QtGui.QApplication.translate("MainWindow", "Quit", None, QtGui.QApplication.UnicodeUTF8))
+ self.PreferencesAction.setText(QtGui.QApplication.translate("MainWindow", "Preferences...", None, QtGui.QApplication.UnicodeUTF8))
+ self.AboutAction.setText(QtGui.QApplication.translate("MainWindow", "About...", None, QtGui.QApplication.UnicodeUTF8))
+ self.ContentsAction.setText(QtGui.QApplication.translate("MainWindow", "Contents...", None, QtGui.QApplication.UnicodeUTF8))
+ self.DeviceSettingsAction.setText(QtGui.QApplication.translate("MainWindow", "Settings...", None, QtGui.QApplication.UnicodeUTF8))
+ self.DeviceRefreshAction.setText(QtGui.QApplication.translate("MainWindow", "Refresh Device", None, QtGui.QApplication.UnicodeUTF8))
+ self.RefreshAllAction.setText(QtGui.QApplication.translate("MainWindow", "Refresh All", None, QtGui.QApplication.UnicodeUTF8))
+ self.SetupDeviceAction.setText(QtGui.QApplication.translate("MainWindow", "Setup Device...", None, QtGui.QApplication.UnicodeUTF8))
+ self.RemoveDeviceAction.setText(QtGui.QApplication.translate("MainWindow", "Remove Device...", None, QtGui.QApplication.UnicodeUTF8))
+ self.ViewAsListAction.setText(QtGui.QApplication.translate("MainWindow", "View as List", None, QtGui.QApplication.UnicodeUTF8))
+ self.ViewAsListAction.setToolTip(QtGui.QApplication.translate("MainWindow", "View Devices as a list", None, QtGui.QApplication.UnicodeUTF8))
+ self.ViewAsIconsAction.setText(QtGui.QApplication.translate("MainWindow", "View as Icons", None, QtGui.QApplication.UnicodeUTF8))
+ self.ViewAsIconsAction.setToolTip(QtGui.QApplication.translate("MainWindow", "View device list as icons", None, QtGui.QApplication.UnicodeUTF8))
+
+from printsettingstoolbox import PrintSettingsToolbox
diff --git a/ui4/devmgr5_base.ui b/ui4/devmgr5_base.ui
new file mode 100644
index 0000000..7d0c7f5
--- /dev/null
+++ b/ui4/devmgr5_base.ui
@@ -0,0 +1,728 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>MainWindow</class>
+ <widget class="QMainWindow" name="MainWindow">
+ <property name="windowModality">
+ <enum>Qt::ApplicationModal</enum>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>700</width>
+ <height>500</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>HP Device Manager</string>
+ </property>
+ <widget class="QWidget" name="centralwidget">
+ <layout class="QGridLayout">
+ <item row="0" column="0">
+ <widget class="QSplitter" name="splitter">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <widget class="QListWidget" name="DeviceList">
+ <property name="movement">
+ <enum>QListView::Static</enum>
+ </property>
+ <property name="flow">
+ <enum>QListView::TopToBottom</enum>
+ </property>
+ <property name="resizeMode">
+ <enum>QListView::Adjust</enum>
+ </property>
+ <property name="spacing">
+ <number>10</number>
+ </property>
+ <property name="viewMode">
+ <enum>QListView::IconMode</enum>
+ </property>
+ <property name="uniformItemSizes">
+ <bool>true</bool>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ <property name="selectionRectVisible">
+ <bool>false</bool>
+ </property>
+ </widget>
+ <widget class="QTabWidget" name="Tabs">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Expanding">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="styleSheet">
+ <string notr="true"/>
+ </property>
+ <property name="currentIndex">
+ <number>5</number>
+ </property>
+ <widget class="QWidget" name="Actions">
+ <attribute name="title">
+ <string>Actions</string>
+ </attribute>
+ <layout class="QGridLayout">
+ <item row="0" column="0">
+ <widget class="QListWidget" name="ActionsList">
+ <property name="spacing">
+ <number>10</number>
+ </property>
+ <property name="viewMode">
+ <enum>QListView::ListMode</enum>
+ </property>
+ <property name="uniformItemSizes">
+ <bool>true</bool>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="Status">
+ <attribute name="title">
+ <string>Status</string>
+ </attribute>
+ <layout class="QGridLayout">
+ <item row="0" column="0">
+ <layout class="QHBoxLayout">
+ <item>
+ <spacer>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>21</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QLabel" name="LCD">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>254</width>
+ <height>40</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>254</width>
+ <height>40</height>
+ </size>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>21</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ <item row="1" column="0">
+ <widget class="QTableWidget" name="StatusTable">
+ <property name="alternatingRowColors">
+ <bool>true</bool>
+ </property>
+ <property name="selectionMode">
+ <enum>QAbstractItemView::SingleSelection</enum>
+ </property>
+ <property name="selectionBehavior">
+ <enum>QAbstractItemView::SelectRows</enum>
+ </property>
+ <property name="showGrid">
+ <bool>false</bool>
+ </property>
+ <property name="cornerButtonEnabled">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="Supplies">
+ <attribute name="title">
+ <string>Supplies</string>
+ </attribute>
+ <layout class="QGridLayout">
+ <item row="0" column="0">
+ <widget class="QTableWidget" name="SuppliesTable">
+ <property name="alternatingRowColors">
+ <bool>true</bool>
+ </property>
+ <property name="selectionMode">
+ <enum>QAbstractItemView::SingleSelection</enum>
+ </property>
+ <property name="selectionBehavior">
+ <enum>QAbstractItemView::SelectRows</enum>
+ </property>
+ <property name="showGrid">
+ <bool>false</bool>
+ </property>
+ <property name="cornerButtonEnabled">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="Settings">
+ <attribute name="title">
+ <string>Print Settings</string>
+ </attribute>
+ <layout class="QGridLayout">
+ <item row="0" column="0">
+ <layout class="QHBoxLayout">
+ <item>
+ <widget class="QLabel" name="PrintSettingsPrinterNameLabel">
+ <property name="text">
+ <string>Printer Name:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QComboBox" name="PrintSettingsPrinterNameCombo">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="1" column="0">
+ <widget class="PrintSettingsToolbox" name="PrintSettingsToolbox">
+ <property name="currentIndex">
+ <number>-1</number>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="Control">
+ <attribute name="title">
+ <string>Printer Control</string>
+ </attribute>
+ <layout class="QGridLayout">
+ <item row="0" column="0">
+ <layout class="QHBoxLayout">
+ <item>
+ <widget class="QLabel" name="PrintControlPrinterNameLabel">
+ <property name="text">
+ <string>Printer Name:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QComboBox" name="PrintControlPrinterNameCombo">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="1" column="0">
+ <widget class="QGroupBox" name="groupBox">
+ <property name="title">
+ <string>Printer/Queue Control</string>
+ </property>
+ <layout class="QGridLayout">
+ <item row="0" column="0">
+ <layout class="QVBoxLayout">
+ <item>
+ <widget class="QGroupBox" name="groupBox_3">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Maximum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="title">
+ <string/>
+ </property>
+ <layout class="QGridLayout">
+ <property name="horizontalSpacing">
+ <number>6</number>
+ </property>
+ <property name="verticalSpacing">
+ <number>1</number>
+ </property>
+ <property name="margin">
+ <number>1</number>
+ </property>
+ <item row="0" column="0">
+ <layout class="QHBoxLayout">
+ <item>
+ <widget class="QLabel" name="StartStopIcon">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="StartStopLabel">
+ <property name="frameShape">
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="text">
+ <string>Started</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="StartStopButton">
+ <property name="text">
+ <string>Stop Printer</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="0" column="1">
+ <layout class="QVBoxLayout">
+ <item>
+ <widget class="QGroupBox" name="groupBox_4">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Maximum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="title">
+ <string/>
+ </property>
+ <layout class="QGridLayout">
+ <property name="horizontalSpacing">
+ <number>6</number>
+ </property>
+ <property name="verticalSpacing">
+ <number>1</number>
+ </property>
+ <property name="margin">
+ <number>1</number>
+ </property>
+ <item row="0" column="0">
+ <layout class="QHBoxLayout">
+ <item>
+ <widget class="QLabel" name="AcceptRejectIcon">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="AcceptRejectLabel">
+ <property name="frameShape">
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="text">
+ <string>Accepting</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="AcceptRejectButton">
+ <property name="text">
+ <string>Reject Jobs</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="0" column="2">
+ <layout class="QVBoxLayout">
+ <item>
+ <widget class="QGroupBox" name="groupBox_5">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Maximum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="title">
+ <string/>
+ </property>
+ <layout class="QGridLayout">
+ <property name="horizontalSpacing">
+ <number>6</number>
+ </property>
+ <property name="verticalSpacing">
+ <number>1</number>
+ </property>
+ <property name="margin">
+ <number>1</number>
+ </property>
+ <item row="0" column="0">
+ <layout class="QHBoxLayout">
+ <item>
+ <widget class="QLabel" name="SetDefaultIcon">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="SetDefaultLabel">
+ <property name="frameShape">
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="text">
+ <string>Not default</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="SetDefaultButton">
+ <property name="text">
+ <string>Set as Default</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="QGroupBox" name="groupBox_2">
+ <property name="title">
+ <string>Job Queue</string>
+ </property>
+ <layout class="QGridLayout">
+ <item row="0" column="0" colspan="3">
+ <widget class="QTableWidget" name="JobTable">
+ <property name="alternatingRowColors">
+ <bool>true</bool>
+ </property>
+ <property name="selectionMode">
+ <enum>QAbstractItemView::SingleSelection</enum>
+ </property>
+ <property name="selectionBehavior">
+ <enum>QAbstractItemView::SelectRows</enum>
+ </property>
+ <property name="gridStyle">
+ <enum>Qt::DotLine</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QPushButton" name="CancelJobButton">
+ <property name="text">
+ <string>Cancel Job</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <spacer>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>131</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="1" column="2">
+ <widget class="QPushButton" name="RefreshButton">
+ <property name="text">
+ <string>Refresh</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="tab_3">
+ <attribute name="title">
+ <string>Page</string>
+ </attribute>
+ <widget class="QPushButton" name="pushButton">
+ <property name="geometry">
+ <rect>
+ <x>280</x>
+ <y>40</y>
+ <width>96</width>
+ <height>27</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>Install now</string>
+ </property>
+ </widget>
+ <widget class="QLabel" name="label">
+ <property name="geometry">
+ <rect>
+ <x>30</x>
+ <y>45</y>
+ <width>251</width>
+ <height>17</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>New version of HPLIP-x.x.x is available</string>
+ </property>
+ </widget>
+ </widget>
+ </widget>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QMenuBar" name="Menubar">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>700</width>
+ <height>27</height>
+ </rect>
+ </property>
+ <widget class="QMenu" name="DeviceMenu">
+ <property name="title">
+ <string>&amp;Device</string>
+ </property>
+ <addaction name="DeviceSettingsAction"/>
+ <addaction name="separator"/>
+ <addaction name="DeviceRefreshAction"/>
+ <addaction name="RefreshAllAction"/>
+ <addaction name="separator"/>
+ <addaction name="SetupDeviceAction"/>
+ <addaction name="RemoveDeviceAction"/>
+ <addaction name="separator"/>
+ <addaction name="QuitAction"/>
+ </widget>
+ <widget class="QMenu" name="ConfigureMenu">
+ <property name="title">
+ <string>&amp;Configure</string>
+ </property>
+ <addaction name="PreferencesAction"/>
+ </widget>
+ <widget class="QMenu" name="HelpMenu">
+ <property name="title">
+ <string>&amp;Help</string>
+ </property>
+ <addaction name="ContentsAction"/>
+ <addaction name="AboutAction"/>
+ </widget>
+ <widget class="QMenu" name="ViewMenu">
+ <property name="title">
+ <string>&amp;View</string>
+ </property>
+ <addaction name="ViewAsListAction"/>
+ <addaction name="ViewAsIconsAction"/>
+ </widget>
+ <addaction name="DeviceMenu"/>
+ <addaction name="ViewMenu"/>
+ <addaction name="ConfigureMenu"/>
+ <addaction name="HelpMenu"/>
+ </widget>
+ <widget class="QStatusBar" name="Statusbar"/>
+ <widget class="QToolBar" name="toolBar">
+ <property name="windowTitle">
+ <string>toolBar_2</string>
+ </property>
+ <attribute name="toolBarArea">
+ <enum>TopToolBarArea</enum>
+ </attribute>
+ <attribute name="toolBarBreak">
+ <bool>false</bool>
+ </attribute>
+ <addaction name="DeviceRefreshAction"/>
+ <addaction name="RefreshAllAction"/>
+ <addaction name="separator"/>
+ <addaction name="SetupDeviceAction"/>
+ <addaction name="RemoveDeviceAction"/>
+ <addaction name="separator"/>
+ <addaction name="ContentsAction"/>
+ </widget>
+ <action name="QuitAction">
+ <property name="text">
+ <string>Quit</string>
+ </property>
+ </action>
+ <action name="PreferencesAction">
+ <property name="text">
+ <string>Preferences...</string>
+ </property>
+ </action>
+ <action name="AboutAction">
+ <property name="text">
+ <string>About...</string>
+ </property>
+ </action>
+ <action name="ContentsAction">
+ <property name="text">
+ <string>Contents...</string>
+ </property>
+ </action>
+ <action name="DeviceSettingsAction">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Settings...</string>
+ </property>
+ </action>
+ <action name="DeviceRefreshAction">
+ <property name="text">
+ <string>Refresh Device</string>
+ </property>
+ </action>
+ <action name="RefreshAllAction">
+ <property name="text">
+ <string>Refresh All</string>
+ </property>
+ </action>
+ <action name="SetupDeviceAction">
+ <property name="text">
+ <string>Setup Device...</string>
+ </property>
+ </action>
+ <action name="RemoveDeviceAction">
+ <property name="text">
+ <string>Remove Device...</string>
+ </property>
+ </action>
+ <action name="ViewAsListAction">
+ <property name="text">
+ <string>View as List</string>
+ </property>
+ <property name="toolTip">
+ <string>View Devices as a list</string>
+ </property>
+ </action>
+ <action name="ViewAsIconsAction">
+ <property name="text">
+ <string>View as Icons</string>
+ </property>
+ <property name="toolTip">
+ <string>View device list as icons</string>
+ </property>
+ </action>
+ </widget>
+ <customwidgets>
+ <customwidget>
+ <class>PrintSettingsToolbox</class>
+ <extends>QToolBox</extends>
+ <header>printsettingstoolbox.h</header>
+ <container>1</container>
+ </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/ui4/fabgrouptable.py b/ui4/fabgrouptable.py
new file mode 100644
index 0000000..c29f691
--- /dev/null
+++ b/ui4/fabgrouptable.py
@@ -0,0 +1,75 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2007 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+# Local
+from base.g import *
+
+# Qt
+from PyQt4.QtCore import *
+from PyQt4.QtGui import *
+
+
+
+class FABGroupTable(QTableWidget):
+ def __init__(self, parent):
+ QTableWidget.__init__(self, parent)
+
+ self.db = None
+
+
+ def setDatabase(self, db):
+ self.db = db
+
+
+ def dragMoveEvent(self, e):
+ item = self.itemAt(e.pos())
+ if item is not None:
+ group = unicode(item.text())
+
+ if group == u'All':
+ e.ignore()
+ return
+
+ names = unicode(e.mimeData().data(u'text/plain')).split(u'|')
+ group_members = self.db.group_members(group)
+
+ if not group_members:
+ e.accept()
+ return
+
+ for n in names:
+ if n not in group_members:
+ e.accept()
+ return
+
+ e.ignore()
+
+
+ def dropMimeData(self, row, col, data, action):
+ items = unicode(data.data(u'text/plain')).split(u'|')
+ self.emit(SIGNAL("namesAddedToGroup"), row, items)
+ return False
+
+
+ def mimeTypes(self):
+ return QStringList([u'text/plain'])
+
+
diff --git a/ui4/fabnametable.py b/ui4/fabnametable.py
new file mode 100644
index 0000000..082e9fe
--- /dev/null
+++ b/ui4/fabnametable.py
@@ -0,0 +1,37 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2007 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+
+# Qt
+from PyQt4.QtCore import *
+from PyQt4.QtGui import *
+
+
+class FABNameTable(QTableWidget):
+ def __init__(self, parent):
+ QTableWidget.__init__(self, parent)
+
+
+ def mimeData(self, items):
+ data = QMimeData()
+ data.setText(u'|'.join([unicode(i.text()) for i in items]))
+ return data
+
diff --git a/ui4/fabwindow.py b/ui4/fabwindow.py
new file mode 100644
index 0000000..0d7cc36
--- /dev/null
+++ b/ui4/fabwindow.py
@@ -0,0 +1,607 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2009 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+# StdLib
+
+# Local
+from base.g import *
+from ui_utils import *
+
+# Qt
+from PyQt4.QtCore import *
+from PyQt4.QtGui import *
+
+# Main window
+from fabwindow_base import Ui_MainWindow
+
+fax_avail = True
+try:
+ from fax import fax
+except ImportError:
+ # This can fail on Python < 2.3 due to the datetime module
+ log.error("Fax address book disabled - Python 2.3+ required.")
+ fax_avail = False
+
+
+
+class FABWindow(QMainWindow, Ui_MainWindow):
+ def __init__(self, parent):
+ QMainWindow.__init__(self, parent)
+ self.setupUi(self)
+ self.group = u'All' # current group
+ self.name = None # current name
+ self.updating_group = False
+ self.updating_name = False
+
+ self.user_settings = UserSettings()
+ self.user_settings.load()
+ self.user_settings.debug()
+
+ self.initDB()
+ self.initUi()
+
+ QTimer.singleShot(0, self.updateUi)
+
+
+ def initDB(self):
+ self.db = fax.FaxAddressBook()
+
+ # Fixup data from old-style database
+ data = self.db.get_all_records()
+ for d in data:
+ if u'All' not in data[d]['groups']:
+ data[d]['groups'].append(u'All')
+
+ if not data:
+ self.db.set('__' + utils.gen_random_uuid(), '', '', '', '', [u'All'], '')
+
+
+ def initUi(self):
+ # Application icon
+ self.setWindowIcon(QIcon(load_pixmap('hp_logo', '128x128')))
+
+ self.NewGroupAction.setIcon(QIcon(load_pixmap('new_group', '24x24')))
+ self.NewGroupFromSelectionAction.setIcon(QIcon(load_pixmap('new_group_from_selection', '24x24')))
+ self.RenameGroupAction.setIcon(QIcon(load_pixmap('rename_group', '24x24')))
+ self.RemoveGroupAction.setIcon(QIcon(load_pixmap('remove_group', '24x24')))
+ self.NewNameAction.setIcon(QIcon(load_pixmap('new_user', '24x24')))
+ self.RemoveNameAction.setIcon(QIcon(load_pixmap('remove_user', '24x24')))
+ self.AddToGroupAction.setIcon(QIcon(load_pixmap('add_to_group', '24x24')))
+ self.RemoveFromGroupAction.setIcon(QIcon(load_pixmap('remove_from_group', '24x24')))
+
+ self.connect(self.QuitAction, SIGNAL("triggered()"), self.close)
+ self.connect(self.NewGroupAction, SIGNAL("triggered()"), self.NewGroupAction_triggered)
+ self.connect(self.NewGroupFromSelectionAction, SIGNAL("triggered()"), self.NewGroupFromSelectionAction_triggered)
+ self.connect(self.RenameGroupAction, SIGNAL("triggered()"), self.RenameGroupAction_triggered)
+ self.connect(self.RemoveGroupAction, SIGNAL("triggered()"), self.RemoveGroupAction_triggered)
+ self.connect(self.NewNameAction, SIGNAL("triggered()"), self.NewNameAction_triggered)
+ self.connect(self.RemoveNameAction, SIGNAL("triggered()"), self.RemoveNameAction_triggered)
+ self.connect(self.ImportAction, SIGNAL("triggered()"), self.ImportAction_triggered)
+ self.connect(self.RemoveFromGroupAction, SIGNAL("triggered()"), self.RemoveFromGroupAction_triggered)
+ self.connect(self.AddToGroupAction, SIGNAL("triggered()"), self.AddToGroupAction_triggered)
+
+ self.GroupTableWidget.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
+ self.NameTableWidget.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
+
+ self.connect(self.Splitter, SIGNAL("splitterMoved(int, int)"), self.Splitter_splitterMoved)
+ self.Splitter.setChildrenCollapsible(False)
+ self.Splitter.setHandleWidth(self.Splitter.handleWidth()+2)
+
+ self.GroupTableWidget.verticalHeader().hide()
+ self.GroupTableWidget.setShowGrid(False)
+ self.GroupTableWidget.setSelectionMode(QAbstractItemView.SingleSelection)
+ self.NameTableWidget.verticalHeader().hide()
+ self.NameTableWidget.setShowGrid(False)
+
+ self.NameTableWidget.setDragEnabled(True)
+ self.GroupTableWidget.setAcceptDrops(True)
+ self.GroupTableWidget.setDropIndicatorShown(True)
+
+ self.connect(self.GroupTableWidget, SIGNAL("itemSelectionChanged()"),
+ self.GroupTableWidget_itemSelectionChanged)
+ self.connect(self.NameTableWidget, SIGNAL("itemSelectionChanged()"),
+ self.NameTableWidget_itemSelectionChanged)
+ self.connect(self.NameLineEdit, SIGNAL("editingFinished()"),
+ self.NameLineEdit_editingFinished)
+ self.connect(self.FaxNumberLineEdit, SIGNAL("editingFinished()"),
+ self.FaxNumberLineEdit_editingFinished)
+ self.connect(self.NotesTextEdit, SIGNAL("textChanged()"),
+ self.NotesTextEdit_textChanged)
+ self.connect(self.NotesTextEdit, SIGNAL("editingFinished()"),
+ self.NotesTextEdit_editingFinished)
+ self.connect(self.GroupTableWidget, SIGNAL("namesAddedToGroup"),
+ self.GroupTableWidget_namesAddedToGroup)
+
+ self.FaxNumberLineEdit.setValidator(PhoneNumValidator(self.FaxNumberLineEdit))
+ self.NameLineEdit.setValidator(AddressBookNameValidator(self.db, self.NameLineEdit))
+
+ self.GroupTableWidget.setContextMenuPolicy(Qt.ActionsContextMenu)
+ self.GroupTableWidget.addAction(self.NewGroupAction)
+ self.GroupTableWidget.addAction(self.NewGroupFromSelectionAction)
+ self.GroupTableWidget.addAction(self.RenameGroupAction)
+ self.GroupTableWidget.addAction(self.RemoveGroupAction)
+
+ self.NameTableWidget.setContextMenuPolicy(Qt.ActionsContextMenu)
+ self.NameTableWidget.addAction(self.NewNameAction)
+ self.NameTableWidget.addAction(self.AddToGroupAction)
+ self.NameTableWidget.addAction(self.RemoveFromGroupAction)
+ self.NameTableWidget.addAction(self.RemoveNameAction)
+ self.NameTableWidget.addAction(self.NewGroupFromSelectionAction)
+
+ self.GroupTableWidget.setDatabase(self.db)
+
+
+ def updateUi(self):
+ if not fax_avail:
+ FailureUI(self, self.__tr("<b>Fax support disabled.</b><p>Fax support requires Python 2.3."))
+ self.close()
+ return
+
+ self.updateGroupList()
+ self.updateNameList()
+ self.updateDetailsFrame()
+
+
+ def closeEvent(self, e):
+ #self.NameLineEdit.emit(SIGNAL("editingFinished()"))
+ self.FaxNumberLineEdit.emit(SIGNAL("editingFinished()"))
+ self.NotesTextEdit.emit(SIGNAL("editingFinished()"))
+ e.accept()
+
+
+ def Splitter_splitterMoved(self, pos, index):
+ self.GroupTableWidget.setColumnWidth(0, self.GroupTableWidget.width())
+ self.NameTableWidget.setColumnWidth(0, self.NameTableWidget.width())
+
+
+ def updateGroupList(self):
+ self.updating_group = True
+ all, k = None, None
+ try:
+ headerItem = QTableWidgetItem()
+ headerItem.setText(self.__tr("Group"))
+ self.GroupTableWidget.clear()
+ self.GroupTableWidget.setColumnCount(1)
+ self.GroupTableWidget.setHorizontalHeaderItem(0, headerItem)
+ self.GroupTableWidget.setColumnWidth(0, self.GroupTableWidget.width())
+
+ groups = self.db.get_all_groups()
+ groups.sort()
+ self.GroupTableWidget.setRowCount(len(groups))
+
+ # Force All group to top of table
+ all = QTableWidgetItem(self.__tr("All"))
+ all.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled)
+ self.GroupTableWidget.setItem(0, 0, all)
+
+ j = 1
+ for g in groups:
+ if g == u'All':
+ continue
+
+ i = QTableWidgetItem(QString(g))
+
+ if g == self.group:
+ k = i
+
+ i.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled | Qt.ItemIsDropEnabled)
+ self.GroupTableWidget.setItem(j, 0, i)
+ j += 1
+
+
+ finally:
+ self.updating_group = False
+
+ if k is not None:
+ k.setSelected(True)
+
+ elif all is not None:
+ all.setSelected(True)
+
+
+ def GroupTableWidget_itemSelectionChanged(self):
+ if not self.updating_group:
+ selected_items = self.GroupTableWidget.selectedItems()
+ if selected_items:
+ self.group = unicode(selected_items[0].text())
+ self.RemoveGroupAction.setEnabled(self.group != u'All')
+ self.RenameGroupAction.setEnabled(self.group != u'All')
+ else: # shouldn't happen?!
+ self.RemoveGroupAction.setEnabled(False)
+ self.RenameGroupAction.setEnabled(False)
+ self.group = None
+
+ self.updateNameList()
+
+
+ def NameTableWidget_itemSelectionChanged(self):
+ if not self.updating_name:
+ selected_items = self.NameTableWidget.selectedItems()
+ num_selected_items = len(selected_items)
+
+ if num_selected_items == 0:
+ self.name = None
+ self.RemoveNameAction.setEnabled(False)
+ self.NewGroupFromSelectionAction.setEnabled(False)
+ self.RemoveFromGroupAction.setEnabled(False)
+ self.AddToGroupAction.setEnabled(False)
+
+ elif num_selected_items == 1:
+ self.name = unicode(selected_items[0].text())
+ self.RemoveNameAction.setEnabled(True)
+ self.NewGroupFromSelectionAction.setEnabled(True)
+
+ self.RemoveFromGroupAction.setEnabled(self.group != u'All')
+ self.AddToGroupAction.setEnabled(True) #self.group != u'All')
+
+ else: # > 1
+ self.RemoveNameAction.setEnabled(True)
+ self.NewGroupFromSelectionAction.setEnabled(True)
+ self.RemoveFromGroupAction.setEnabled(self.group != u'All')
+ self.AddToGroupAction.setEnabled(True) #self.group != u'All')
+ self.name = None
+
+ self.updateDetailsFrame()
+
+
+ def updateNameList(self):
+ self.updating_name = True
+ m, k = None, None
+ try:
+ headerItem = QTableWidgetItem()
+ headerItem.setText(self.__tr("Name"))
+ self.NameTableWidget.clear()
+ self.NameTableWidget.setColumnCount(1)
+ self.NameTableWidget.setHorizontalHeaderItem(0,headerItem)
+ self.NameTableWidget.setColumnWidth(0, self.NameTableWidget.width())
+
+ names = self.db.group_members(self.group)
+ filtered_names = [n for n in names if not n.startswith('__')]
+ filtered_names.sort()
+ self.NameTableWidget.setRowCount(len(filtered_names))
+
+ for j, n in enumerate(filtered_names):
+ i = QTableWidgetItem(QString(n))
+ i.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled | Qt.ItemIsDragEnabled)
+ self.NameTableWidget.setItem(j, 0, i)
+
+ if n == self.name:
+ m = i
+
+ if j == 0:
+ k = i
+
+ finally:
+ self.updating_name = False
+
+ if m is not None:
+ m.setSelected(True)
+
+ elif k is not None:
+ k.setSelected(True)
+
+ else: # no names, disable name frame and name actions
+ self.name = None
+ self.RemoveNameAction.setEnabled(False)
+ self.NewGroupFromSelectionAction.setEnabled(False)
+ self.RemoveFromGroupAction.setEnabled(False)
+ self.AddToGroupAction.setEnabled(False)
+ self.updateDetailsFrame()
+
+
+ def selectByName(self, name):
+ rows = self.NameTableWidget.rowCount()
+ for r in range(rows):
+ i = self.NameTableWidget.item(r, 0)
+ i.setSelected(name == unicode(i.text()))
+
+
+ def updateDetailsFrame(self):
+ if self.name is None:
+ self.NameFrame.setEnabled(False)
+ self.NameLineEdit.setText(QString())
+ self.FaxNumberLineEdit.setText(QString())
+ self.NotesTextEdit.setText(QString())
+
+ else:
+ self.NameFrame.setEnabled(True)
+ data = self.db.get(self.name)
+ self.NameLineEdit.setText(self.name)
+ self.FaxNumberLineEdit.setText(data['fax'])
+ self.NotesTextEdit.setText(data['notes'])
+
+
+ def NameLineEdit_editingFinished(self):
+ if self.name is not None:
+ new_name = unicode(self.NameLineEdit.text())
+ if new_name != self.name:
+ if QMessageBox.question(self, self.__tr("Rename?"), self.__tr("Rename '%1' to '%2'?").arg(self.name).arg(new_name), \
+ QMessageBox.Yes | QMessageBox.No) == QMessageBox.Yes:
+
+ self.db.rename(self.name, new_name)
+ log.debug("Rename %s to %s" % (self.name, new_name))
+ self.emit(SIGNAL("databaseChanged"), FAB_NAME_RENAME, self.name, new_name)
+ self.updateNameList()
+ else:
+ self.NameLineEdit.setText(self.name)
+
+
+ def FaxNumberLineEdit_editingFinished(self):
+ if self.name is not None:
+ self.db.set_key_value(self.name, 'fax', unicode(self.FaxNumberLineEdit.text()))
+ self.emit(SIGNAL("databaseChanged"), FAB_NAME_DETAILS_CHANGED, self.name)
+
+
+ def NotesTextEdit_textChanged(self):
+ if self.name is not None:
+ self.db.set_key_value(self.name, 'notes', unicode(self.NotesTextEdit.document().toPlainText()))
+
+
+ def NotesTextEdit_editingFinished(self):
+ if self.name is not None:
+ self.emit(SIGNAL("databaseChanged"), FAB_NAME_DETAILS_CHANGED, self.name)
+
+
+ def NewGroupAction_triggered(self):
+ ok = False
+ g, ok = QInputDialog.getText(self, self.__tr("Enter New Group Name"), self.__tr("Name for New Group:"))
+ g = unicode(g)
+
+ if g == u'All':
+ FailureUI(self, self.__tr("<b>Sorry, the group name cannot be 'All'.</b><p>Please choose a different name."))
+ ok = False
+
+ if ok:
+ self.db.set('__' + utils.gen_random_uuid(), '', '', '', '', [u'All', g], '')
+ self.group = g
+ log.debug("New empty group %s" % self.group)
+ self.emit(SIGNAL("databaseChanged"), FAB_GROUP_ADD, self.group)
+ self.updateGroupList()
+
+
+ def NewGroupFromSelectionAction_triggered(self):
+ selected_names = [unicode(n.text()) for n in self.NameTableWidget.selectedItems()]
+ if selected_names:
+ ok = False
+ g, ok = QInputDialog.getText(self, self.__tr("Enter New Group Name"), self.__tr("Name for New Group:"))
+ g = unicode(g)
+
+ groups = self.db.get_all_groups()
+
+ if g in groups:
+ FailureUI(self, self.__tr("<b>Sorry, the group name cannot be the same as an existing group (or 'All').</b><p>Please choose a different name."))
+ ok = False
+
+ if ok:
+ self.db.update_groups(g, selected_names)
+ self.group = g
+ log.debug("New group %s with names %s" % (self.group, ','.join(selected_names)))
+ self.emit(SIGNAL("databaseChanged"), FAB_GROUP_ADD, self.group)
+ self.updateGroupList()
+
+
+ def RenameGroupAction_triggered(self):
+ selected_items = self.GroupTableWidget.selectedItems()
+ if selected_items:
+ old_group = unicode(selected_items[0].text())
+ ok = False
+ new_group, ok = QInputDialog.getText(self, self.__tr("Rename Group"), self.__tr("New Name for Group '%1':").arg(old_group))
+ new_group = unicode(new_group)
+ groups = self.db.get_all_groups()
+
+ if new_group in groups:
+ FailureUI(self, self.__tr("<b>Sorry, the group name cannot be the same as an existing group (or 'All').</b><p>Please choose a different name."))
+ ok = False
+
+ if ok:
+ self.db.rename_group(old_group, new_group)
+ log.debug("Rename group %s to %s" % (old_group, new_group))
+ self.emit(SIGNAL("databaseChanged"), FAB_GROUP_RENAME, old_group, new_group)
+ self.group = new_group
+ self.updateGroupList()
+
+
+ def RemoveGroupAction_triggered(self):
+ self.db.delete_group(self.group)
+ log.debug("Remove group %s" % self.group)
+ self.emit(SIGNAL("databaseChanged"), FAB_GROUP_REMOVE, self.group)
+ self.group = None
+ self.updateGroupList()
+
+
+ def NewNameAction_triggered(self):
+ ok = False
+ t, ok = QInputDialog.getText(self, self.__tr("Enter New Name"), self.__tr("New Name:"))
+ if ok:
+ t = unicode(t)
+ self.addName(t)
+
+
+ def addName(self, name, fax=''):
+ if self.group == u'All':
+ g = [u'All']
+ else:
+ g = [u'All', self.group]
+
+ self.db.set(name, '', '', '', fax, g, '')
+ self.name = name
+ log.debug("New name %s" % self.name)
+ self.emit(SIGNAL("databaseChanged"), FAB_NAME_ADD, self.name)
+ self.updateNameList()
+
+
+ def RemoveNameAction_triggered(self):
+ selected_names = [unicode(n.text()) for n in self.NameTableWidget.selectedItems()]
+ if selected_names:
+ for n in selected_names:
+ self.db.delete(n)
+ log.debug("Removing name %s" % n)
+ self.emit(SIGNAL("databaseChanged"), FAB_NAME_REMOVE, n)
+
+ self.name = None
+ self.updateNameList()
+
+
+ def RemoveFromGroupAction_triggered(self):
+ selected_names = [unicode(n.text()) for n in self.NameTableWidget.selectedItems()]
+ if selected_names:
+ log.debug("%s leaving group %s" % (','.join(selected_names), self.group))
+ self.db.remove_from_group(self.group, selected_names)
+ self.emit(SIGNAL("databaseChanged"), FAB_GROUP_MEMBERSHIP_CHANGED, self.group)
+ self.name = None
+ self.updateGroupList()
+
+
+ def GroupTableWidget_namesAddedToGroup(self, row, items): # drag n' drop handler
+ self.group = unicode(self.GroupTableWidget.item(row, 0).text())
+ self.db.add_to_group(self.group, items)
+ log.debug("Adding %s to group %s" % (','.join(items), self.group))
+ self.emit(SIGNAL("databaseChanged"), FAB_GROUP_MEMBERSHIP_CHANGED, self.group)
+ self.updateGroupList()
+
+
+ def AddToGroupAction_triggered(self):
+ selected_names = [unicode(n.text()) for n in self.NameTableWidget.selectedItems()]
+ if selected_names:
+ ok = False
+ all_groups = self.db.get_all_groups()
+
+ if all_groups:
+ all_groups = [g for g in all_groups if g != u'All']
+ all_groups.sort()
+
+ dlg = JoinDialog(self, all_groups)
+
+ if dlg.exec_() == QDialog.Accepted:
+ group = dlg.group
+ if group:
+ self.db.add_to_group(group, selected_names)
+ self.group = group
+ log.debug("Adding %s to group %s" % (','.join(selected_names), self.group))
+ self.emit(SIGNAL("databaseChanged"), FAB_GROUP_MEMBERSHIP_CHANGED, self.group)
+ self.updateGroupList()
+
+ else:
+ FailureUI(self, self.__tr("<b>There are no groups to join.</b><p>Use <i>New Group from Selection</i> to create a new group using these name(s)."))
+
+
+ def ImportAction_triggered(self):
+ result = unicode(QFileDialog.getOpenFileName(self,
+ self.__tr("Import fax addresses from LDIF or vCard"),
+ #user_conf.workingDirectory(),
+ self.user_settings.working_dir,
+ "vCard (*.vcf);;LDIF (*.ldif *.ldi)"))
+
+ if result:
+ working_directory = unicode(os.path.dirname(result))
+ log.debug("result: %s" % result)
+ #user_conf.setWorkingDirectory(working_directory)
+ self.user_settings.working_dir = working_directory
+ self.user_settings.save()
+
+ if result:
+ if result.endswith('.vcf'):
+ ok, error_str = self.db.import_vcard(result)
+ else:
+ ok, error_str = self.db.import_ldif(result)
+
+ if not ok:
+ FailureUI(self, error_str)
+
+ else:
+ self.updateUi()
+
+
+ def __tr(self,s,c = None):
+ return qApp.translate("FABWindow",s,c)
+
+
+
+
+class JoinDialog(QDialog):
+ def __init__(self, parent, groups):
+ QDialog.__init__(self, parent)
+ self.group = ''
+ self.setupUi(groups)
+
+
+ def setupUi(self, groups):
+ self.setObjectName("Dialog")
+ self.resize(QSize(QRect(0,0,271,107).size()).expandedTo(self.minimumSizeHint()))
+
+ self.gridlayout = QGridLayout(self)
+ self.gridlayout.setObjectName("gridlayout")
+
+ self.hboxlayout = QHBoxLayout()
+ self.hboxlayout.setObjectName("hboxlayout")
+
+ self.label = QLabel(self)
+ self.label.setObjectName("label")
+ self.hboxlayout.addWidget(self.label)
+
+ self.GroupJoinComboBox = QComboBox(self)
+
+ sizePolicy = QSizePolicy(QSizePolicy.Expanding,QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.GroupJoinComboBox.sizePolicy().hasHeightForWidth())
+ self.GroupJoinComboBox.setSizePolicy(sizePolicy)
+ self.GroupJoinComboBox.setObjectName("comboBox")
+ self.hboxlayout.addWidget(self.GroupJoinComboBox)
+ self.gridlayout.addLayout(self.hboxlayout,0,0,1,3)
+
+ spacerItem = QSpacerItem(20,40,QSizePolicy.Minimum,QSizePolicy.Expanding)
+ self.gridlayout.addItem(spacerItem,1,0,1,1)
+
+ spacerItem1 = QSpacerItem(231,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ self.gridlayout.addItem(spacerItem1,2,0,1,1)
+
+ self.JoinButton = QPushButton(self)
+ self.JoinButton.setObjectName("pushButton_2")
+ self.gridlayout.addWidget(self.JoinButton,2,1,1,1)
+
+ self.CancelButton = QPushButton(self)
+ self.CancelButton.setObjectName("pushButton")
+ self.gridlayout.addWidget(self.CancelButton,2,2,1,1)
+
+ self.connect(self.GroupJoinComboBox, SIGNAL("currentIndexChanged(int)"),
+ self.GroupJoinComboBox_currentIndexChanged)
+
+ for i, g in enumerate(groups):
+ if i == 0:
+ self.group = g
+ self.GroupJoinComboBox.insertItem(i, g)
+
+ self.connect(self.JoinButton, SIGNAL("clicked()"), self.accept)
+ self.connect(self.CancelButton, SIGNAL("clicked()"), self.reject)
+
+ self.retranslateUi()
+
+
+ def GroupJoinComboBox_currentIndexChanged(self, i):
+ self.group = unicode(self.GroupJoinComboBox.currentText())
+
+
+ def retranslateUi(self):
+ self.setWindowTitle(QApplication.translate("Dialog", "Join Group", None, QApplication.UnicodeUTF8))
+ self.label.setText(QApplication.translate("Dialog", "Group to Join:", None, QApplication.UnicodeUTF8))
+ self.JoinButton.setText(QApplication.translate("Dialog", "Join", None, QApplication.UnicodeUTF8))
+ self.CancelButton.setText(QApplication.translate("Dialog", "Cancel", None, QApplication.UnicodeUTF8))
diff --git a/ui4/fabwindow_base.py b/ui4/fabwindow_base.py
new file mode 100644
index 0000000..43f2bbe
--- /dev/null
+++ b/ui4/fabwindow_base.py
@@ -0,0 +1,159 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'ui4/fabwindow_base.ui'
+#
+# Created: Mon May 4 14:30:32 2009
+# by: PyQt4 UI code generator 4.4.4
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt4 import QtCore, QtGui
+
+class Ui_MainWindow(object):
+ def setupUi(self, MainWindow):
+ MainWindow.setObjectName("MainWindow")
+ MainWindow.resize(700, 440)
+ self.centralwidget = QtGui.QWidget(MainWindow)
+ self.centralwidget.setObjectName("centralwidget")
+ self.gridlayout = QtGui.QGridLayout(self.centralwidget)
+ self.gridlayout.setObjectName("gridlayout")
+ self.Splitter = QtGui.QSplitter(self.centralwidget)
+ self.Splitter.setOrientation(QtCore.Qt.Horizontal)
+ self.Splitter.setObjectName("Splitter")
+ self.GroupTableWidget = FABGroupTable(self.Splitter)
+ self.GroupTableWidget.setAlternatingRowColors(True)
+ self.GroupTableWidget.setObjectName("GroupTableWidget")
+ self.GroupTableWidget.setColumnCount(1)
+ self.GroupTableWidget.setRowCount(0)
+ item = QtGui.QTableWidgetItem()
+ self.GroupTableWidget.setHorizontalHeaderItem(0, item)
+ self.NameTableWidget = FABNameTable(self.Splitter)
+ self.NameTableWidget.setAlternatingRowColors(True)
+ self.NameTableWidget.setObjectName("NameTableWidget")
+ self.NameTableWidget.setColumnCount(1)
+ self.NameTableWidget.setRowCount(0)
+ item = QtGui.QTableWidgetItem()
+ self.NameTableWidget.setHorizontalHeaderItem(0, item)
+ self.NameFrame = QtGui.QFrame(self.Splitter)
+ self.NameFrame.setEnabled(False)
+ self.NameFrame.setFrameShape(QtGui.QFrame.StyledPanel)
+ self.NameFrame.setFrameShadow(QtGui.QFrame.Raised)
+ self.NameFrame.setObjectName("NameFrame")
+ self.gridlayout1 = QtGui.QGridLayout(self.NameFrame)
+ self.gridlayout1.setObjectName("gridlayout1")
+ self.label = QtGui.QLabel(self.NameFrame)
+ self.label.setObjectName("label")
+ self.gridlayout1.addWidget(self.label, 0, 0, 1, 1)
+ self.NameLineEdit = QtGui.QLineEdit(self.NameFrame)
+ self.NameLineEdit.setObjectName("NameLineEdit")
+ self.gridlayout1.addWidget(self.NameLineEdit, 0, 1, 1, 1)
+ self.label_2 = QtGui.QLabel(self.NameFrame)
+ self.label_2.setObjectName("label_2")
+ self.gridlayout1.addWidget(self.label_2, 1, 0, 1, 1)
+ self.FaxNumberLineEdit = QtGui.QLineEdit(self.NameFrame)
+ self.FaxNumberLineEdit.setObjectName("FaxNumberLineEdit")
+ self.gridlayout1.addWidget(self.FaxNumberLineEdit, 1, 1, 1, 1)
+ self.label_3 = QtGui.QLabel(self.NameFrame)
+ self.label_3.setObjectName("label_3")
+ self.gridlayout1.addWidget(self.label_3, 2, 0, 1, 1)
+ self.NotesTextEdit = QtGui.QTextEdit(self.NameFrame)
+ self.NotesTextEdit.setObjectName("NotesTextEdit")
+ self.gridlayout1.addWidget(self.NotesTextEdit, 3, 0, 1, 2)
+ self.gridlayout.addWidget(self.Splitter, 0, 0, 1, 1)
+ MainWindow.setCentralWidget(self.centralwidget)
+ self.menubar = QtGui.QMenuBar(MainWindow)
+ self.menubar.setGeometry(QtCore.QRect(0, 0, 700, 27))
+ self.menubar.setObjectName("menubar")
+ self.menuGroup = QtGui.QMenu(self.menubar)
+ self.menuGroup.setObjectName("menuGroup")
+ self.menuName = QtGui.QMenu(self.menubar)
+ self.menuName.setObjectName("menuName")
+ self.menuFile = QtGui.QMenu(self.menubar)
+ self.menuFile.setObjectName("menuFile")
+ MainWindow.setMenuBar(self.menubar)
+ self.statusbar = QtGui.QStatusBar(MainWindow)
+ self.statusbar.setObjectName("statusbar")
+ MainWindow.setStatusBar(self.statusbar)
+ self.toolBar = QtGui.QToolBar(MainWindow)
+ self.toolBar.setObjectName("toolBar")
+ MainWindow.addToolBar(QtCore.Qt.TopToolBarArea, self.toolBar)
+ self.NewGroupAction = QtGui.QAction(MainWindow)
+ self.NewGroupAction.setObjectName("NewGroupAction")
+ self.NewNameAction = QtGui.QAction(MainWindow)
+ self.NewNameAction.setObjectName("NewNameAction")
+ self.RemoveGroupAction = QtGui.QAction(MainWindow)
+ self.RemoveGroupAction.setEnabled(False)
+ self.RemoveGroupAction.setObjectName("RemoveGroupAction")
+ self.QuitAction = QtGui.QAction(MainWindow)
+ self.QuitAction.setObjectName("QuitAction")
+ self.RemoveNameAction = QtGui.QAction(MainWindow)
+ self.RemoveNameAction.setEnabled(False)
+ self.RemoveNameAction.setObjectName("RemoveNameAction")
+ self.NewGroupFromSelectionAction = QtGui.QAction(MainWindow)
+ self.NewGroupFromSelectionAction.setEnabled(False)
+ self.NewGroupFromSelectionAction.setObjectName("NewGroupFromSelectionAction")
+ self.ImportAction = QtGui.QAction(MainWindow)
+ self.ImportAction.setObjectName("ImportAction")
+ self.RenameGroupAction = QtGui.QAction(MainWindow)
+ self.RenameGroupAction.setEnabled(False)
+ self.RenameGroupAction.setObjectName("RenameGroupAction")
+ self.RemoveFromGroupAction = QtGui.QAction(MainWindow)
+ self.RemoveFromGroupAction.setEnabled(False)
+ self.RemoveFromGroupAction.setObjectName("RemoveFromGroupAction")
+ self.AddToGroupAction = QtGui.QAction(MainWindow)
+ self.AddToGroupAction.setEnabled(False)
+ self.AddToGroupAction.setObjectName("AddToGroupAction")
+ self.menuGroup.addAction(self.NewGroupAction)
+ self.menuGroup.addAction(self.NewGroupFromSelectionAction)
+ self.menuGroup.addAction(self.RenameGroupAction)
+ self.menuGroup.addSeparator()
+ self.menuGroup.addAction(self.RemoveGroupAction)
+ self.menuName.addAction(self.NewNameAction)
+ self.menuName.addSeparator()
+ self.menuName.addAction(self.AddToGroupAction)
+ self.menuName.addAction(self.RemoveFromGroupAction)
+ self.menuName.addSeparator()
+ self.menuName.addAction(self.RemoveNameAction)
+ self.menuFile.addAction(self.ImportAction)
+ self.menuFile.addSeparator()
+ self.menuFile.addAction(self.QuitAction)
+ self.menubar.addAction(self.menuFile.menuAction())
+ self.menubar.addAction(self.menuGroup.menuAction())
+ self.menubar.addAction(self.menuName.menuAction())
+ self.toolBar.addAction(self.NewGroupAction)
+ self.toolBar.addAction(self.NewGroupFromSelectionAction)
+ self.toolBar.addAction(self.RenameGroupAction)
+ self.toolBar.addAction(self.RemoveGroupAction)
+ self.toolBar.addSeparator()
+ self.toolBar.addAction(self.NewNameAction)
+ self.toolBar.addAction(self.AddToGroupAction)
+ self.toolBar.addAction(self.RemoveFromGroupAction)
+ self.toolBar.addAction(self.RemoveNameAction)
+
+ self.retranslateUi(MainWindow)
+ QtCore.QMetaObject.connectSlotsByName(MainWindow)
+
+ def retranslateUi(self, MainWindow):
+ MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "HP Device Manager - Fax Address Book", None, QtGui.QApplication.UnicodeUTF8))
+ self.GroupTableWidget.horizontalHeaderItem(0).setText(QtGui.QApplication.translate("MainWindow", "Group", None, QtGui.QApplication.UnicodeUTF8))
+ self.NameTableWidget.horizontalHeaderItem(0).setText(QtGui.QApplication.translate("MainWindow", "Name", None, QtGui.QApplication.UnicodeUTF8))
+ self.label.setText(QtGui.QApplication.translate("MainWindow", "Name:", None, QtGui.QApplication.UnicodeUTF8))
+ self.label_2.setText(QtGui.QApplication.translate("MainWindow", "Fax Number:", None, QtGui.QApplication.UnicodeUTF8))
+ self.label_3.setText(QtGui.QApplication.translate("MainWindow", "Notes:", None, QtGui.QApplication.UnicodeUTF8))
+ self.menuGroup.setTitle(QtGui.QApplication.translate("MainWindow", "Group", None, QtGui.QApplication.UnicodeUTF8))
+ self.menuName.setTitle(QtGui.QApplication.translate("MainWindow", "Name", None, QtGui.QApplication.UnicodeUTF8))
+ self.menuFile.setTitle(QtGui.QApplication.translate("MainWindow", "File", None, QtGui.QApplication.UnicodeUTF8))
+ self.toolBar.setWindowTitle(QtGui.QApplication.translate("MainWindow", "toolBar", None, QtGui.QApplication.UnicodeUTF8))
+ self.NewGroupAction.setText(QtGui.QApplication.translate("MainWindow", "New Group...", None, QtGui.QApplication.UnicodeUTF8))
+ self.NewNameAction.setText(QtGui.QApplication.translate("MainWindow", "New Name...", None, QtGui.QApplication.UnicodeUTF8))
+ self.RemoveGroupAction.setText(QtGui.QApplication.translate("MainWindow", "Delete Group...", None, QtGui.QApplication.UnicodeUTF8))
+ self.QuitAction.setText(QtGui.QApplication.translate("MainWindow", "Quit", None, QtGui.QApplication.UnicodeUTF8))
+ self.RemoveNameAction.setText(QtGui.QApplication.translate("MainWindow", "Delete Name...", None, QtGui.QApplication.UnicodeUTF8))
+ self.NewGroupFromSelectionAction.setText(QtGui.QApplication.translate("MainWindow", "New Group From Selection...", None, QtGui.QApplication.UnicodeUTF8))
+ self.ImportAction.setText(QtGui.QApplication.translate("MainWindow", "Import...", None, QtGui.QApplication.UnicodeUTF8))
+ self.RenameGroupAction.setText(QtGui.QApplication.translate("MainWindow", "Rename Group...", None, QtGui.QApplication.UnicodeUTF8))
+ self.RemoveFromGroupAction.setText(QtGui.QApplication.translate("MainWindow", "Leave Group", None, QtGui.QApplication.UnicodeUTF8))
+ self.AddToGroupAction.setText(QtGui.QApplication.translate("MainWindow", "Join Group...", None, QtGui.QApplication.UnicodeUTF8))
+
+from fabgrouptable import FABGroupTable
+from fabnametable import FABNameTable
diff --git a/ui4/fabwindow_base.ui b/ui4/fabwindow_base.ui
new file mode 100644
index 0000000..927ac9d
--- /dev/null
+++ b/ui4/fabwindow_base.ui
@@ -0,0 +1,235 @@
+<ui version="4.0" >
+ <class>MainWindow</class>
+ <widget class="QMainWindow" name="MainWindow" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>700</width>
+ <height>440</height>
+ </rect>
+ </property>
+ <property name="windowTitle" >
+ <string>HP Device Manager - Fax Address Book</string>
+ </property>
+ <widget class="QWidget" name="centralwidget" >
+ <layout class="QGridLayout" >
+ <item row="0" column="0" >
+ <widget class="QSplitter" name="Splitter" >
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <widget class="FABGroupTable" name="GroupTableWidget" >
+ <property name="alternatingRowColors" >
+ <bool>true</bool>
+ </property>
+ <column>
+ <property name="text" >
+ <string>Group</string>
+ </property>
+ </column>
+ </widget>
+ <widget class="FABNameTable" name="NameTableWidget" >
+ <property name="alternatingRowColors" >
+ <bool>true</bool>
+ </property>
+ <column>
+ <property name="text" >
+ <string>Name</string>
+ </property>
+ </column>
+ </widget>
+ <widget class="QFrame" name="NameFrame" >
+ <property name="enabled" >
+ <bool>false</bool>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <layout class="QGridLayout" >
+ <item row="0" column="0" >
+ <widget class="QLabel" name="label" >
+ <property name="text" >
+ <string>Name:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1" >
+ <widget class="QLineEdit" name="NameLineEdit" />
+ </item>
+ <item row="1" column="0" >
+ <widget class="QLabel" name="label_2" >
+ <property name="text" >
+ <string>Fax Number:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1" >
+ <widget class="QLineEdit" name="FaxNumberLineEdit" />
+ </item>
+ <item row="2" column="0" >
+ <widget class="QLabel" name="label_3" >
+ <property name="text" >
+ <string>Notes:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0" colspan="2" >
+ <widget class="QTextEdit" name="NotesTextEdit" />
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QMenuBar" name="menubar" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>700</width>
+ <height>27</height>
+ </rect>
+ </property>
+ <widget class="QMenu" name="menuGroup" >
+ <property name="title" >
+ <string>Group</string>
+ </property>
+ <addaction name="NewGroupAction" />
+ <addaction name="NewGroupFromSelectionAction" />
+ <addaction name="RenameGroupAction" />
+ <addaction name="separator" />
+ <addaction name="RemoveGroupAction" />
+ </widget>
+ <widget class="QMenu" name="menuName" >
+ <property name="title" >
+ <string>Name</string>
+ </property>
+ <addaction name="NewNameAction" />
+ <addaction name="separator" />
+ <addaction name="AddToGroupAction" />
+ <addaction name="RemoveFromGroupAction" />
+ <addaction name="separator" />
+ <addaction name="RemoveNameAction" />
+ </widget>
+ <widget class="QMenu" name="menuFile" >
+ <property name="title" >
+ <string>File</string>
+ </property>
+ <addaction name="ImportAction" />
+ <addaction name="separator" />
+ <addaction name="QuitAction" />
+ </widget>
+ <addaction name="menuFile" />
+ <addaction name="menuGroup" />
+ <addaction name="menuName" />
+ </widget>
+ <widget class="QStatusBar" name="statusbar" />
+ <widget class="QToolBar" name="toolBar" >
+ <property name="windowTitle" >
+ <string>toolBar</string>
+ </property>
+ <attribute name="toolBarArea" >
+ <enum>TopToolBarArea</enum>
+ </attribute>
+ <attribute name="toolBarBreak" >
+ <bool>false</bool>
+ </attribute>
+ <addaction name="NewGroupAction" />
+ <addaction name="NewGroupFromSelectionAction" />
+ <addaction name="RenameGroupAction" />
+ <addaction name="RemoveGroupAction" />
+ <addaction name="separator" />
+ <addaction name="NewNameAction" />
+ <addaction name="AddToGroupAction" />
+ <addaction name="RemoveFromGroupAction" />
+ <addaction name="RemoveNameAction" />
+ </widget>
+ <action name="NewGroupAction" >
+ <property name="text" >
+ <string>New Group...</string>
+ </property>
+ </action>
+ <action name="NewNameAction" >
+ <property name="text" >
+ <string>New Name...</string>
+ </property>
+ </action>
+ <action name="RemoveGroupAction" >
+ <property name="enabled" >
+ <bool>false</bool>
+ </property>
+ <property name="text" >
+ <string>Delete Group...</string>
+ </property>
+ </action>
+ <action name="QuitAction" >
+ <property name="text" >
+ <string>Quit</string>
+ </property>
+ </action>
+ <action name="RemoveNameAction" >
+ <property name="enabled" >
+ <bool>false</bool>
+ </property>
+ <property name="text" >
+ <string>Delete Name...</string>
+ </property>
+ </action>
+ <action name="NewGroupFromSelectionAction" >
+ <property name="enabled" >
+ <bool>false</bool>
+ </property>
+ <property name="text" >
+ <string>New Group From Selection...</string>
+ </property>
+ </action>
+ <action name="ImportAction" >
+ <property name="text" >
+ <string>Import...</string>
+ </property>
+ </action>
+ <action name="RenameGroupAction" >
+ <property name="enabled" >
+ <bool>false</bool>
+ </property>
+ <property name="text" >
+ <string>Rename Group...</string>
+ </property>
+ </action>
+ <action name="RemoveFromGroupAction" >
+ <property name="enabled" >
+ <bool>false</bool>
+ </property>
+ <property name="text" >
+ <string>Leave Group</string>
+ </property>
+ </action>
+ <action name="AddToGroupAction" >
+ <property name="enabled" >
+ <bool>false</bool>
+ </property>
+ <property name="text" >
+ <string>Join Group...</string>
+ </property>
+ </action>
+ </widget>
+ <customwidgets>
+ <customwidget>
+ <class>FABGroupTable</class>
+ <extends>QTableWidget</extends>
+ <header>fabgrouptable.h</header>
+ </customwidget>
+ <customwidget>
+ <class>FABNameTable</class>
+ <extends>QTableWidget</extends>
+ <header>fabnametable.h</header>
+ </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/ui4/faxsetupdialog.py b/ui4/faxsetupdialog.py
new file mode 100644
index 0000000..7963708
--- /dev/null
+++ b/ui4/faxsetupdialog.py
@@ -0,0 +1,307 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2001-2009 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Authors: Don Welch
+#
+
+# StdLib
+import operator
+
+# Local
+from base.g import *
+from base import device, utils
+from prnt import cups
+from base.codes import *
+from ui_utils import *
+
+# Qt
+from PyQt4.QtCore import *
+from PyQt4.QtGui import *
+
+# Ui
+from faxsetupdialog_base import Ui_Dialog
+from deviceuricombobox import DEVICEURICOMBOBOX_TYPE_FAX_ONLY
+
+fax_enabled = prop.fax_build
+
+if fax_enabled:
+ try:
+ from fax import fax
+ except ImportError:
+ # This can fail on Python < 2.3 due to the datetime module
+ # or if fax was diabled during the build
+ fax_enabled = False
+
+if not fax_enabled:
+ log.warn("Fax disabled.")
+
+
+class FaxSetupDialog(QDialog, Ui_Dialog):
+ def __init__(self, parent, device_uri):
+ QDialog.__init__(self, parent)
+ self.setupUi(self)
+ self.device_uri = device_uri
+ self.initUi()
+ self.dev = None
+
+ self.user_settings = UserSettings()
+ self.user_settings.load()
+ self.user_settings.debug()
+
+ QTimer.singleShot(0, self.updateUi)
+
+
+ def initUi(self):
+ # connect signals/slots
+ self.connect(self.CancelButton, SIGNAL("clicked()"), self.CancelButton_clicked)
+ self.connect(self.FaxComboBox, SIGNAL("DeviceUriComboBox_noDevices"), self.FaxComboBox_noDevices)
+ self.connect(self.FaxComboBox, SIGNAL("DeviceUriComboBox_currentChanged"), self.FaxComboBox_currentChanged)
+ self.FaxComboBox.setType(DEVICEURICOMBOBOX_TYPE_FAX_ONLY)
+
+ # Application icon
+ self.setWindowIcon(QIcon(load_pixmap('hp_logo', '128x128')))
+
+ if self.device_uri:
+ self.FaxComboBox.setInitialDevice(self.device_uri)
+
+ self.NameCompanyLineEdit.setMaxLength(50)
+ self.FaxNumberLineEdit.setMaxLength(50)
+ self.FaxNumberLineEdit.setValidator(PhoneNumValidator(self.FaxNumberLineEdit))
+ self.VoiceNumberLineEdit.setMaxLength(50)
+ self.VoiceNumberLineEdit.setValidator(PhoneNumValidator(self.VoiceNumberLineEdit))
+ self.EmailLineEdit.setMaxLength(50)
+
+ self.connect(self.NameCompanyLineEdit, SIGNAL("editingFinished()"),
+ self.NameCompanyLineEdit_editingFinished)
+
+ self.connect(self.NameCompanyLineEdit, SIGNAL("textChanged(const QString &)"),
+ self.NameCompanyLineEdit_textChanged)
+
+ self.connect(self.FaxNumberLineEdit, SIGNAL("editingFinished()"),
+ self.FaxNumberLineEdit_editingFinished)
+
+ self.connect(self.FaxNumberLineEdit, SIGNAL("textChanged(const QString &)"),
+ self.FaxNumberLineEdit_textChanged)
+
+ self.connect(self.VoiceNumberLineEdit, SIGNAL("editingFinished()"),
+ self.VoiceNumberLineEdit_editingFinished)
+
+ self.connect(self.VoiceNumberLineEdit, SIGNAL("textChanged(const QString &)"),
+ self.VoiceNumberLineEdit_textChanged)
+
+ self.connect(self.EmailLineEdit, SIGNAL("editingFinished()"),
+ self.EmailLineEdit_editingFinished)
+
+ self.connect(self.EmailLineEdit, SIGNAL("textChanged(const QString &)"),
+ self.EmailLineEdit_textChanged)
+
+ self.connect(self.tabWidget,SIGNAL("currentChanged(int)"),self.Tabs_currentChanged)
+
+ self.name_company_dirty = False
+ self.fax_number_dirty = False
+ self.voice_number_dirty = False
+ self.email_dirty = False
+
+
+ def updateUi(self):
+ if not fax_enabled:
+ FailureUI(self, self.__tr("<b>PC send fax support is not enabled.</b><p>Re-install HPLIP with fax support or use the device front panel to send a fax.</p><p>Click <i>OK</i> to exit.</p>"))
+ self.close()
+ return
+
+ self.FaxComboBox.updateUi()
+ self.tabWidget.setCurrentIndex(0)
+
+
+ def FaxComboBox_currentChanged(self, device_uri):
+ self.device_uri = device_uri
+ self.updateCoverpageTab()
+
+ if self.dev is not None:
+ self.dev.close()
+
+ try:
+ self.dev = fax.getFaxDevice(self.device_uri)
+ except Error:
+ CheckDeviceUI(self)
+ return
+
+ self.updateHeaderTab()
+
+
+
+ def FaxComboBox_noDevices(self):
+ FailureUI(self, self.__tr("<b>No devices that require fax setup found.</b>"))
+ self.close()
+
+ #
+ # Name/Company (for TTI header) (stored in device)
+ #
+
+ def NameCompanyLineEdit_editingFinished(self):
+ self.saveNameCompany(unicode(self.NameCompanyLineEdit.text()))
+
+
+ def NameCompanyLineEdit_textChanged(self, s):
+ self.name_company_dirty = True
+
+
+ def saveNameCompany(self, s):
+ self.name_company_dirty = False
+ beginWaitCursor()
+ try:
+ try:
+ log.debug("Saving station name %s to device" % s)
+ self.dev.setStationName(s)
+ except Error:
+ CheckDeviceUI()
+ finally:
+ endWaitCursor()
+
+ #
+ # Fax Number (for TTI header) (stored in device)
+ #
+
+ def FaxNumberLineEdit_editingFinished(self):
+ self.saveFaxNumber(unicode(self.FaxNumberLineEdit.text()))
+
+
+ def FaxNumberLineEdit_textChanged(self, s):
+ self.fax_number_dirty = True
+
+
+ def saveFaxNumber(self, s):
+ self.fax_number_dirty = False
+ beginWaitCursor()
+ try:
+ try:
+ log.debug("Saving fax number %s to device" % s)
+ self.dev.setPhoneNum(s)
+ except Error:
+ CheckDeviceUI()
+ finally:
+ endWaitCursor()
+
+ #
+ # Voice Number (for coverpage) (stored in ~/.hplip/hplip.conf)
+ #
+
+ def VoiceNumberLineEdit_editingFinished(self):
+ self.saveVoiceNumber(unicode(self.VoiceNumberLineEdit.text()))
+
+
+ def VoiceNumberLineEdit_textChanged(self, s):
+ self.voice_number_dirty = True
+
+
+ def saveVoiceNumber(self, s):
+ log.debug("Saving voice number (%s) to ~/.hplip/hplip.conf" % s)
+ self.voice_number_dirty = False
+ #user_conf.set('fax', 'voice_phone', s)
+ self.user_settings.voice_phone = s
+ self.user_settings.save()
+
+ #
+ # EMail (for coverpage) (stored in ~/.hplip/hplip.conf)
+ #
+
+ def EmailLineEdit_editingFinished(self):
+ self.saveEmail(unicode(self.EmailLineEdit.text()))
+
+
+ def EmailLineEdit_textChanged(self, s):
+ self.email_dirty = True
+
+
+ def saveEmail(self, s):
+ log.debug("Saving email address (%s) to ~/.hplip/hplip.conf" % s)
+ self.email_dirty = False
+ #user_conf.set('fax', 'email_address', s)
+ self.user_settings.email_address = s
+ self.user_settings.save()
+
+ #
+ #
+ #
+
+ def CancelButton_clicked(self):
+ self.close()
+
+ def Tabs_currentChanged(self, tab=0):
+ """ Called when the active tab changes.
+ Update newly displayed tab.
+ """
+ if tab == 0:
+ self.updateHeaderTab()
+ elif tab ==1:
+ self.updateCoverpageTab()
+
+
+ def updateHeaderTab(self):
+ beginWaitCursor()
+ try:
+ try:
+ name_company = self.dev.getStationName()
+ log.debug("name_company = '%s'" % name_company)
+ self.NameCompanyLineEdit.setText(name_company)
+ fax_number = self.dev.getPhoneNum()
+ log.debug("fax_number = '%s'" % fax_number)
+ self.FaxNumberLineEdit.setText(fax_number)
+ except Error:
+ CheckDeviceUI()
+ finally:
+ endWaitCursor()
+
+
+ def updateCoverpageTab(self):
+ #voice_phone = user_conf.get('fax', 'voice_phone')
+ voice_phone = self.user_settings.voice_phone
+ log.debug("voice_phone = '%s'" % voice_phone)
+ self.VoiceNumberLineEdit.setText(voice_phone)
+ #email_address = user_conf.get('fax', 'email_address')
+ email_address = self.user_settings.email_address
+ log.debug("email_address = '%s'" % email_address)
+ self.EmailLineEdit.setText(email_address)
+
+
+ def closeEvent(self, e):
+ if self.voice_number_dirty:
+ self.VoiceNumberLineEdit.emit(SIGNAL("editingFinished()"))
+
+ if self.name_company_dirty:
+ self.NameCompanyLineEdit.emit(SIGNAL("editingFinished()"))
+
+ if self.email_dirty:
+ self.EmailLineEdit.emit(SIGNAL("editingFinished()"))
+
+ if self.fax_number_dirty:
+ self.FaxNumberLineEdit.emit(SIGNAL("editingFinished()"))
+
+ if self.dev is not None:
+ self.dev.close()
+
+ e.accept()
+
+ #
+ # Misc
+ #
+
+ def __tr(self,s,c = None):
+ return qApp.translate("FaxSetupDialog",s,c)
+
+
diff --git a/ui4/faxsetupdialog_base.py b/ui4/faxsetupdialog_base.py
new file mode 100644
index 0000000..de4d7b0
--- /dev/null
+++ b/ui4/faxsetupdialog_base.py
@@ -0,0 +1,102 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'ui4/faxsetupdialog_base.ui'
+#
+# Created: Mon May 4 14:30:33 2009
+# by: PyQt4 UI code generator 4.4.4
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt4 import QtCore, QtGui
+
+class Ui_Dialog(object):
+ def setupUi(self, Dialog):
+ Dialog.setObjectName("Dialog")
+ Dialog.resize(700, 500)
+ self.gridlayout = QtGui.QGridLayout(Dialog)
+ self.gridlayout.setObjectName("gridlayout")
+ self.label = QtGui.QLabel(Dialog)
+ font = QtGui.QFont()
+ font.setPointSize(16)
+ self.label.setFont(font)
+ self.label.setObjectName("label")
+ self.gridlayout.addWidget(self.label, 0, 0, 1, 1)
+ self.line = QtGui.QFrame(Dialog)
+ self.line.setFrameShape(QtGui.QFrame.HLine)
+ self.line.setFrameShadow(QtGui.QFrame.Sunken)
+ self.line.setObjectName("line")
+ self.gridlayout.addWidget(self.line, 1, 0, 1, 3)
+ self.FaxComboBox = DeviceUriComboBox(Dialog)
+ self.FaxComboBox.setObjectName("FaxComboBox")
+ self.gridlayout.addWidget(self.FaxComboBox, 2, 0, 1, 3)
+ self.tabWidget = QtGui.QTabWidget(Dialog)
+ self.tabWidget.setObjectName("tabWidget")
+ self.tab = QtGui.QWidget()
+ self.tab.setObjectName("tab")
+ self.gridlayout1 = QtGui.QGridLayout(self.tab)
+ self.gridlayout1.setObjectName("gridlayout1")
+ self.label_3 = QtGui.QLabel(self.tab)
+ self.label_3.setObjectName("label_3")
+ self.gridlayout1.addWidget(self.label_3, 0, 0, 1, 2)
+ self.label_2 = QtGui.QLabel(self.tab)
+ self.label_2.setObjectName("label_2")
+ self.gridlayout1.addWidget(self.label_2, 1, 0, 1, 1)
+ self.NameCompanyLineEdit = QtGui.QLineEdit(self.tab)
+ self.NameCompanyLineEdit.setObjectName("NameCompanyLineEdit")
+ self.gridlayout1.addWidget(self.NameCompanyLineEdit, 1, 1, 1, 1)
+ self.label_4 = QtGui.QLabel(self.tab)
+ self.label_4.setObjectName("label_4")
+ self.gridlayout1.addWidget(self.label_4, 2, 0, 1, 1)
+ self.FaxNumberLineEdit = QtGui.QLineEdit(self.tab)
+ self.FaxNumberLineEdit.setObjectName("FaxNumberLineEdit")
+ self.gridlayout1.addWidget(self.FaxNumberLineEdit, 2, 1, 1, 1)
+ spacerItem = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ self.gridlayout1.addItem(spacerItem, 3, 1, 1, 1)
+ self.tabWidget.addTab(self.tab, "")
+ self.tab_2 = QtGui.QWidget()
+ self.tab_2.setObjectName("tab_2")
+ self.gridlayout2 = QtGui.QGridLayout(self.tab_2)
+ self.gridlayout2.setObjectName("gridlayout2")
+ self.label_5 = QtGui.QLabel(self.tab_2)
+ self.label_5.setObjectName("label_5")
+ self.gridlayout2.addWidget(self.label_5, 0, 0, 1, 2)
+ self.label_6 = QtGui.QLabel(self.tab_2)
+ self.label_6.setObjectName("label_6")
+ self.gridlayout2.addWidget(self.label_6, 1, 0, 1, 1)
+ self.VoiceNumberLineEdit = QtGui.QLineEdit(self.tab_2)
+ self.VoiceNumberLineEdit.setObjectName("VoiceNumberLineEdit")
+ self.gridlayout2.addWidget(self.VoiceNumberLineEdit, 1, 1, 1, 1)
+ self.label_7 = QtGui.QLabel(self.tab_2)
+ self.label_7.setObjectName("label_7")
+ self.gridlayout2.addWidget(self.label_7, 2, 0, 1, 1)
+ self.EmailLineEdit = QtGui.QLineEdit(self.tab_2)
+ self.EmailLineEdit.setObjectName("EmailLineEdit")
+ self.gridlayout2.addWidget(self.EmailLineEdit, 2, 1, 1, 1)
+ spacerItem1 = QtGui.QSpacerItem(20, 131, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ self.gridlayout2.addItem(spacerItem1, 3, 1, 1, 1)
+ self.tabWidget.addTab(self.tab_2, "")
+ self.gridlayout.addWidget(self.tabWidget, 3, 0, 1, 3)
+ spacerItem2 = QtGui.QSpacerItem(371, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+ self.gridlayout.addItem(spacerItem2, 4, 0, 1, 1)
+ self.CancelButton = QtGui.QPushButton(Dialog)
+ self.CancelButton.setObjectName("CancelButton")
+ self.gridlayout.addWidget(self.CancelButton, 4, 2, 1, 1)
+
+ self.retranslateUi(Dialog)
+ self.tabWidget.setCurrentIndex(1)
+ QtCore.QMetaObject.connectSlotsByName(Dialog)
+
+ def retranslateUi(self, Dialog):
+ Dialog.setWindowTitle(QtGui.QApplication.translate("Dialog", "HP Device Manager - Fax Device Setup", None, QtGui.QApplication.UnicodeUTF8))
+ self.label.setText(QtGui.QApplication.translate("Dialog", "Fax Device Setup", None, QtGui.QApplication.UnicodeUTF8))
+ self.label_3.setText(QtGui.QApplication.translate("Dialog", "This information will appear at the top of each fax you send.", None, QtGui.QApplication.UnicodeUTF8))
+ self.label_2.setText(QtGui.QApplication.translate("Dialog", "Name and/or Company:", None, QtGui.QApplication.UnicodeUTF8))
+ self.label_4.setText(QtGui.QApplication.translate("Dialog", "Fax Number:", None, QtGui.QApplication.UnicodeUTF8))
+ self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), QtGui.QApplication.translate("Dialog", "Fax Header", None, QtGui.QApplication.UnicodeUTF8))
+ self.label_5.setText(QtGui.QApplication.translate("Dialog", "This information will appear on all coverpages.", None, QtGui.QApplication.UnicodeUTF8))
+ self.label_6.setText(QtGui.QApplication.translate("Dialog", "Voice Phone Number:", None, QtGui.QApplication.UnicodeUTF8))
+ self.label_7.setText(QtGui.QApplication.translate("Dialog", "Email Address:", None, QtGui.QApplication.UnicodeUTF8))
+ self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), QtGui.QApplication.translate("Dialog", "Coverpage", None, QtGui.QApplication.UnicodeUTF8))
+ self.CancelButton.setText(QtGui.QApplication.translate("Dialog", "Close", None, QtGui.QApplication.UnicodeUTF8))
+
+from deviceuricombobox import DeviceUriComboBox
diff --git a/ui4/faxsetupdialog_base.ui b/ui4/faxsetupdialog_base.ui
new file mode 100644
index 0000000..ab0f1a1
--- /dev/null
+++ b/ui4/faxsetupdialog_base.ui
@@ -0,0 +1,170 @@
+<ui version="4.0" >
+ <class>Dialog</class>
+ <widget class="QDialog" name="Dialog" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>700</width>
+ <height>500</height>
+ </rect>
+ </property>
+ <property name="windowTitle" >
+ <string>HP Device Manager - Fax Device Setup</string>
+ </property>
+ <layout class="QGridLayout" >
+ <item row="0" column="0" >
+ <widget class="QLabel" name="label" >
+ <property name="font" >
+ <font>
+ <pointsize>16</pointsize>
+ </font>
+ </property>
+ <property name="text" >
+ <string>Fax Device Setup</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" colspan="3" >
+ <widget class="Line" name="line" >
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" colspan="3" >
+ <widget class="DeviceUriComboBox" name="FaxComboBox" />
+ </item>
+ <item row="3" column="0" colspan="3" >
+ <widget class="QTabWidget" name="tabWidget" >
+ <property name="currentIndex" >
+ <number>1</number>
+ </property>
+ <widget class="QWidget" name="tab" >
+ <attribute name="title" >
+ <string>Fax Header</string>
+ </attribute>
+ <layout class="QGridLayout" >
+ <item row="0" column="0" colspan="2" >
+ <widget class="QLabel" name="label_3" >
+ <property name="text" >
+ <string>This information will appear at the top of each fax you send.</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QLabel" name="label_2" >
+ <property name="text" >
+ <string>Name and/or Company:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1" >
+ <widget class="QLineEdit" name="NameCompanyLineEdit" />
+ </item>
+ <item row="2" column="0" >
+ <widget class="QLabel" name="label_4" >
+ <property name="text" >
+ <string>Fax Number:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1" >
+ <widget class="QLineEdit" name="FaxNumberLineEdit" />
+ </item>
+ <item row="3" column="1" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="tab_2" >
+ <attribute name="title" >
+ <string>Coverpage</string>
+ </attribute>
+ <layout class="QGridLayout" >
+ <item row="0" column="0" colspan="2" >
+ <widget class="QLabel" name="label_5" >
+ <property name="text" >
+ <string>This information will appear on all coverpages.</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QLabel" name="label_6" >
+ <property name="text" >
+ <string>Voice Phone Number:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1" >
+ <widget class="QLineEdit" name="VoiceNumberLineEdit" />
+ </item>
+ <item row="2" column="0" >
+ <widget class="QLabel" name="label_7" >
+ <property name="text" >
+ <string>Email Address:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1" >
+ <widget class="QLineEdit" name="EmailLineEdit" />
+ </item>
+ <item row="3" column="1" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>20</width>
+ <height>131</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ </item>
+ <item row="4" column="0" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>371</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="4" column="2" >
+ <widget class="QPushButton" name="CancelButton" >
+ <property name="text" >
+ <string>Close</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <customwidgets>
+ <customwidget>
+ <class>DeviceUriComboBox</class>
+ <extends>QComboBox</extends>
+ <header>deviceuricombobox.h</header>
+ </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/ui4/filetable.py b/ui4/filetable.py
new file mode 100644
index 0000000..bdcffa9
--- /dev/null
+++ b/ui4/filetable.py
@@ -0,0 +1,405 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2001-2009 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Authors: Don Welch
+#
+
+
+# Std Lib
+import sys
+import os.path
+import os
+
+# Local
+from base.g import *
+from base import utils, magic
+from prnt import cups
+from base.codes import *
+from ui_utils import *
+
+# Qt
+from PyQt4.QtCore import *
+from PyQt4.QtGui import *
+
+# Other UI
+from mimetypesdialog import MimeTypesDialog
+
+
+FILETABLE_TYPE_PRINT = 0
+FILETABLE_TYPE_FAX = 1
+
+
+
+class FileTable(QWidget):
+ def __init__(self, parent):
+ QWidget.__init__(self, parent)
+ self.parent = parent
+
+ self.initUi()
+ self.file_list = []
+ self.typ = FILETABLE_TYPE_PRINT
+ self.selected_filename = None
+ self.fax_add_callback = None
+ self.allowable_mime_types = cups.getAllowableMIMETypes()
+
+ self.user_settings = UserSettings()
+ self.user_settings.load()
+ self.user_settings.debug()
+
+ self.working_dir = self.user_settings.working_dir #user_conf.workingDirectory()
+
+
+
+ def initUi(self):
+ self.gridlayout = QGridLayout(self)
+ self.gridlayout.setObjectName("gridlayout")
+ self.FileTable = QTableWidget(self)
+ self.FileTable.setObjectName("FileTable")
+ self.gridlayout.addWidget(self.FileTable,0,0,1,6)
+ self.AddFileButton = QPushButton(self)
+ self.AddFileButton.setObjectName("AddFileButton")
+ self.gridlayout.addWidget(self.AddFileButton,1,0,1,1)
+ self.RemoveFileButton = QPushButton(self)
+ self.RemoveFileButton.setObjectName("RemoveFileButton")
+ self.gridlayout.addWidget(self.RemoveFileButton,1,1,1,1)
+ self.MoveFileUpButton = QPushButton(self)
+ self.MoveFileUpButton.setObjectName("MoveFileUpButton")
+ self.gridlayout.addWidget(self.MoveFileUpButton,1,2,1,1)
+ self.MoveFileDownButton = QPushButton(self)
+ self.MoveFileDownButton.setObjectName("MoveFileDownButton")
+ self.gridlayout.addWidget(self.MoveFileDownButton,1,3,1,1)
+ spacerItem = QSpacerItem(91,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ self.gridlayout.addItem(spacerItem,1,4,1,1)
+ self.ShowTypesButton = QPushButton(self)
+ self.ShowTypesButton.setObjectName("ShowTypesButton")
+ self.gridlayout.addWidget(self.ShowTypesButton,1,5,1,1)
+ self.AddFileButton.setText(self.__tr("Add..."))
+ self.AddFileButton.setIcon(QIcon(load_pixmap('list_add', '16x16')))
+ self.connect(self.AddFileButton, SIGNAL("clicked()"), self.AddFileButton_clicked)
+ self.RemoveFileButton.setIcon(QIcon(load_pixmap('list_remove', '16x16')))
+ self.RemoveFileButton.setText(self.__tr("Remove"))
+ self.connect(self.RemoveFileButton, SIGNAL("clicked()"), self.RemoveFileButton_clicked)
+ self.MoveFileUpButton.setText(self.__tr("Move Up"))
+ self.MoveFileUpButton.setIcon(QIcon(load_pixmap('up', '16x16')))
+ self.connect(self.MoveFileUpButton, SIGNAL("clicked()"), self.MoveFileUpButton_clicked)
+ self.MoveFileDownButton.setText(self.__tr("Move Down"))
+ self.MoveFileDownButton.setIcon(QIcon(load_pixmap('down', '16x16')))
+ self.connect(self.MoveFileDownButton, SIGNAL("clicked()"), self.MoveFileDownButton_clicked)
+ self.ShowTypesButton.setText(self.__tr("Show Valid Types..."))
+ self.ShowTypesButton.setIcon(QIcon(load_pixmap('mimetypes', '16x16')))
+ self.connect(self.ShowTypesButton, SIGNAL("clicked()"), self.ShowTypesButton_clicked)
+ self.FileTable.setContextMenuPolicy(Qt.CustomContextMenu)
+ self.connect(self.FileTable, SIGNAL("customContextMenuRequested(const QPoint &)"),
+ self.FileTable_customContextMenuRequested)
+ self.headers = [self.__tr("Name"), self.__tr("Type"), self.__tr("Folder/Path")]
+
+ self.FileTable.setSortingEnabled(False)
+ self.connect(self.FileTable, SIGNAL("itemSelectionChanged()"), self.FileTable_itemSelectionChanged)
+
+
+ def setWorkingDir(self, d):
+ if os.path.exists(d):
+ self.working_dir = d
+
+
+ def getWorkingDir(self):
+ if self.file_list:
+ self.working_dir = os.path.pathname(self.file_list[0][0])
+ #user_conf.setWorkingDirectory(self.working_dir)
+ self.user_settings.working_dir = self.working_dir
+ self.user_settings.save()
+
+ return self.working_dir
+
+
+ def setType(self, t):
+ self.typ = t
+ if self.typ == FILETABLE_TYPE_FAX:
+ self.headers = [self.__tr("Name"), self.__tr("Type"), self.__tr("Pages")]
+ if log.is_debug():
+ self.headers.append(self.__tr("File"))
+
+
+ def setFaxCallback(self, callback):
+ self.fax_add_callback = callback
+
+
+ def isNotEmpty(self):
+ return len(self.file_list)
+
+
+ def FileTable_itemSelectionChanged(self):
+ self.selected_filename = self.currentFilename()
+ self.setUpDownButtons()
+
+
+ def updateUi(self, show_add_file_if_empty=True):
+ self.FileTable.clear()
+ self.FileTable.setRowCount(len(self.file_list))
+ self.FileTable.setColumnCount(0)
+
+ if self.file_list:
+ self.emit(SIGNAL("isNotEmpty"))
+ QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
+ try:
+ selected = None
+ self.FileTable.setColumnCount(len(self.headers))
+ self.FileTable.setHorizontalHeaderLabels(self.headers)
+ flags = Qt.ItemIsSelectable | Qt.ItemIsEnabled
+
+ for row, f in enumerate(self.file_list):
+ filename, mime_type, mime_type_desc, title, num_pages = f
+ col = 0
+
+ if self.typ == FILETABLE_TYPE_FAX:
+ if title:
+ i = QTableWidgetItem(title)
+ else:
+ i = QTableWidgetItem(os.path.basename(filename))
+ else: # FILETABLE_TYPE_PRINT
+ # Filename (basename)
+ i = QTableWidgetItem(os.path.basename(filename))
+
+ i.setData(Qt.UserRole, QVariant(filename))
+ i.setFlags(flags)
+
+ if self.selected_filename is not None and \
+ self.selected_filename == filename:
+ selected = i
+
+ self.FileTable.setItem(row, col, i)
+ col += 1
+
+ # MIME type
+ i = QTableWidgetItem(mime_type_desc)
+ i.setFlags(flags)
+ self.FileTable.setItem(row, col, i)
+ col += 1
+
+ if self.typ == FILETABLE_TYPE_PRINT:
+ # path/folder
+ i = QTableWidgetItem(os.path.dirname(filename))
+ i.setFlags(flags)
+ self.FileTable.setItem(row, col, i)
+ col += 1
+
+ if self.typ == FILETABLE_TYPE_FAX:
+ # num pages
+ if num_pages < 1:
+ i = QTableWidgetItem(self.__tr("(unknown)"))
+ else:
+ i = QTableWidgetItem(unicode(num_pages))
+ i.setFlags(flags)
+ self.FileTable.setItem(row, col, i)
+ col += 1
+
+ if self.typ == FILETABLE_TYPE_FAX and log.is_debug():
+ i = QTableWidgetItem(filename)
+ i.setFlags(flags)
+ self.FileTable.setItem(row, col, i)
+
+
+ self.FileTable.resizeColumnsToContents()
+
+ if selected is None:
+ selected = self.FileTable.item(0, 0)
+
+ selected.setSelected(True)
+ self.FileTable.setCurrentItem(selected)
+
+ finally:
+ QApplication.restoreOverrideCursor()
+
+ self.RemoveFileButton.setEnabled(True)
+ self.RemoveFileButton.setIcon(QIcon(load_pixmap('list_remove', '16x16')))
+
+ self.setUpDownButtons()
+
+ else:
+ self.emit(SIGNAL("isEmpty"))
+ self.RemoveFileButton.setEnabled(False)
+ self.setUpDownButtons()
+
+ if show_add_file_if_empty:
+ self.AddFileButton.emit(SIGNAL("clicked()"))
+
+
+ def setUpDownButtons(self):
+ if self.file_list:
+ i = self.FileTable.currentRow()
+
+ if len(self.file_list) > 1 and i != len(self.file_list)-1:
+ self.MoveFileDownButton.setEnabled(True)
+ else:
+ self.MoveFileDownButton.setEnabled(False)
+
+ if len(self.file_list) > 1 and i != 0:
+ self.MoveFileUpButton.setEnabled(True)
+ else:
+ self.MoveFileUpButton.setEnabled(False)
+
+ else:
+ self.MoveFileDownButton.setEnabled(False)
+ self.MoveFileUpButton.setEnabled(False)
+
+
+ def AddFileButton_clicked(self):
+ if self.typ == FILETABLE_TYPE_PRINT:
+ s = self.__tr("Select File(s) to Print")
+ else:
+ s = self.__tr("Select File(s) to Send")
+
+ files = list(QFileDialog.getOpenFileNames(self, s,
+ self.working_dir, self.__tr("All files (*)")))
+
+ files = [unicode(f) for f in files]
+
+ if files:
+ self.addFileList(files)
+
+ if self.typ == FILETABLE_TYPE_PRINT:
+ self.updateUi(False)
+
+
+ def addFileList(self, file_list):
+ for f in file_list:
+ self.addFileFromUI(f)
+
+
+ def addFileFromUI(self, f, title='', num_pages=0):
+ f = os.path.abspath(os.path.expanduser(f))
+ log.debug("Trying to add file: %s" % f)
+
+ if os.path.exists(f) and os.access(f, os.R_OK):
+ mime_type = magic.mime_type(f)
+ mime_type_desc = mime_type
+ log.debug("File type of file %s: %s" % (f, mime_type))
+
+ try:
+ mime_type_desc = MIME_TYPES_DESC[mime_type][0]
+ except KeyError:
+ if self.typ == FILETABLE_TYPE_PRINT:
+ FailureUI(self, self.__tr("<b>You are trying to add a file '%1' that cannot be directly printed with this utility.</b><p>To print this file, use the print command in the application that created it.<p>Note: Click <i>Show Valid Types...</i> to view a list of compatible file types that can be directly printed from this utility.").arg(f),
+ self.__tr("HP Device Manager"))
+ else:
+ FailureUI(self, self.__tr("<b>You are trying to add a file '%1' that cannot be directly faxed with this utility.</b><p>To fax this file, use the print command in the application that created it (using the appropriate fax print queue).<p>Note: Click <i>Show Valid Types...</i> to view a list of compatible file types that can be directly added to the fax file list in this utility.").arg(f),
+ self.__tr("HP Device Manager"))
+ else:
+ if self.typ == FILETABLE_TYPE_PRINT:
+ self.addFile(f, mime_type, mime_type_desc, title, num_pages)
+ else:
+ self.fax_add_callback(f)
+ else:
+ FailureUI(self, self.__tr("<b>Unable to add file '%1' to file list (file not found or insufficient permissions).</b><p>Check the file name and try again.").arg(f),
+ self.__tr("HP Device Manager"))
+
+
+ def addFile(self, f, mime_type, mime_type_desc, title, num_pages):
+ log.debug("Adding file %s (%s,%s,%s,%d)" % (f, mime_type, mime_type_desc, title, num_pages))
+ self.file_list.append((f, mime_type, mime_type_desc, title, num_pages))
+ self.updateUi()
+ self.emit(SIGNAL("fileListChanged"))
+
+
+ def currentFilename(self):
+ i = self.FileTable.item(self.FileTable.currentRow(), 0)
+ if i is None:
+ return None
+ return i.data(Qt.UserRole).toString()
+
+
+ def RemoveFileButton_clicked(self):
+ filename = self.currentFilename()
+ if filename is None:
+ return
+
+ return self.removeFile(filename)
+
+
+ def removeFile(self, filename):
+ temp = self.file_list[:]
+ index = 0
+ for f, mime_type, mime_type_desc, title, num_pages in temp:
+ if f == filename:
+ del self.file_list[index]
+ self.emit(SIGNAL("fileListChanged"))
+ self.updateUi(False)
+ break
+ index += 1
+
+
+ def removeFileByMIMEType(self, mime_type):
+ temp = self.file_list[:]
+ index = 0
+ for filename, m, mime_type_desc, title, num_pages in temp:
+ if m == mime_type:
+ del self.file_list[index]
+ self.emit(SIGNAL("fileListChanged"))
+ self.updateUi(False)
+ break
+ index += 1
+
+
+ def isMIMETypeInList(self, mime_type):
+ for filename, m, mime_type_desc, title, num_pages in self.file_list:
+ if m == mime_type:
+ return True
+
+ return False
+
+
+ def ShowTypesButton_clicked(self):
+ x = {}
+ for a in self.allowable_mime_types:
+ x[a] = MIME_TYPES_DESC.get(a, ('Unknown', 'n/a'))
+
+ dlg = MimeTypesDialog(x, self)
+ dlg.exec_()
+
+
+ def MoveFileUpButton_clicked(self):
+ filename = self.currentFilename()
+ if filename is None:
+ return
+
+ utils.list_move_up(self.file_list, filename, self.__compareFilenames)
+ self.updateUi()
+
+
+ def MoveFileDownButton_clicked(self):
+ filename = self.currentFilename()
+ if filename is None:
+ return
+
+ utils.list_move_down(self.file_list, filename, self.__compareFilenames)
+ self.updateUi()
+
+
+ def __compareFilenames(self, a, b):
+ return a[0] == b
+
+
+ def FileTable_customContextMenuRequested(self, p):
+ print p
+
+
+ def __tr(self,s,c = None):
+ return qApp.translate("FileTable",s,c)
+
+
+
diff --git a/ui4/firmwaredialog.py b/ui4/firmwaredialog.py
new file mode 100644
index 0000000..90a80fe
--- /dev/null
+++ b/ui4/firmwaredialog.py
@@ -0,0 +1,108 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2001-2008 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Authors: Don Welch
+#
+
+# Std Lib
+import operator
+
+# Local
+from base.g import *
+from base import device, utils
+from prnt import cups
+from base.codes import *
+from ui_utils import *
+
+# Qt
+from PyQt4.QtCore import *
+from PyQt4.QtGui import *
+
+# Ui
+from firmwaredialog_base import Ui_Dialog
+
+
+class FirmwareDialog(QDialog, Ui_Dialog):
+ def __init__(self, parent, device_uri):
+ QDialog.__init__(self, parent)
+ self.setupUi(self)
+ self.device_uri = device_uri
+ self.initUi()
+ QTimer.singleShot(0, self.updateUi)
+
+
+ def initUi(self):
+ self.DeviceComboBox.setFilter({'fw-download' : (operator.gt, 0)})
+
+ self.connect(self.DeviceComboBox, SIGNAL("DeviceUriComboBox_noDevices"), self.DeviceUriComboBox_noDevices)
+ self.connect(self.DeviceComboBox, SIGNAL("DeviceUriComboBox_currentChanged"), self.DeviceUriComboBox_currentChanged)
+ self.connect(self.CancelButton, SIGNAL("clicked()"), self.close)
+ self.connect(self.DownloadFirmwareButton, SIGNAL("clicked()"), self.downloadFirmware)
+
+ # Application icon
+ self.setWindowIcon(QIcon(load_pixmap('hp_logo', '128x128')))
+
+ if self.device_uri:
+ self.DeviceComboBox.setInitialDevice(self.device_uri)
+
+
+ def updateUi(self):
+ self.DeviceComboBox.updateUi()
+
+
+ def DeviceUriComboBox_currentChanged(self, device_uri):
+ self.device_uri = device_uri
+ # Update
+
+
+ def DeviceUriComboBox_noDevices(self):
+ FailureUI(self, self.__tr("<b>No devices that support firmware download found.</b>"))
+ self.close()
+
+
+ def downloadFirmware(self):
+ d = None
+
+ try:
+ try:
+ d = device.Device(self.device_uri)
+ except Error:
+ CheckDeviceUI(self)
+ return
+
+ try:
+ d.open()
+ except Error:
+ CheckDeviceUI(self)
+ else:
+ if d.isIdleAndNoError():
+ ok = d.downloadFirmware()
+
+ else:
+ CheckDeviceUI(self)
+
+ finally:
+ if d is not None:
+ d.close()
+
+ self.close()
+
+
+ def __tr(self,s,c = None):
+ return qApp.translate("FirmwareDialog",s,c)
+
diff --git a/ui4/firmwaredialog_base.py b/ui4/firmwaredialog_base.py
new file mode 100644
index 0000000..b52fb14
--- /dev/null
+++ b/ui4/firmwaredialog_base.py
@@ -0,0 +1,67 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'ui4/firmwaredialog_base.ui'
+#
+# Created: Mon May 4 14:30:33 2009
+# by: PyQt4 UI code generator 4.4.4
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt4 import QtCore, QtGui
+
+class Ui_Dialog(object):
+ def setupUi(self, Dialog):
+ Dialog.setObjectName("Dialog")
+ Dialog.setWindowModality(QtCore.Qt.ApplicationModal)
+ Dialog.resize(700, 500)
+ self.gridlayout = QtGui.QGridLayout(Dialog)
+ self.gridlayout.setObjectName("gridlayout")
+ self.label = QtGui.QLabel(Dialog)
+ font = QtGui.QFont()
+ font.setPointSize(16)
+ self.label.setFont(font)
+ self.label.setObjectName("label")
+ self.gridlayout.addWidget(self.label, 0, 0, 1, 1)
+ self.line = QtGui.QFrame(Dialog)
+ self.line.setFrameShape(QtGui.QFrame.HLine)
+ self.line.setFrameShadow(QtGui.QFrame.Sunken)
+ self.line.setObjectName("line")
+ self.gridlayout.addWidget(self.line, 1, 0, 1, 3)
+ self.DeviceComboBox = DeviceUriComboBox(Dialog)
+ self.DeviceComboBox.setObjectName("DeviceComboBox")
+ self.gridlayout.addWidget(self.DeviceComboBox, 2, 0, 1, 3)
+ self.frame = QtGui.QFrame(Dialog)
+ self.frame.setFrameShape(QtGui.QFrame.StyledPanel)
+ self.frame.setFrameShadow(QtGui.QFrame.Raised)
+ self.frame.setObjectName("frame")
+ self.gridlayout1 = QtGui.QGridLayout(self.frame)
+ self.gridlayout1.setObjectName("gridlayout1")
+ self.label_2 = QtGui.QLabel(self.frame)
+ self.label_2.setObjectName("label_2")
+ self.gridlayout1.addWidget(self.label_2, 0, 0, 1, 1)
+ self.gridlayout.addWidget(self.frame, 3, 0, 1, 3)
+ spacerItem = QtGui.QSpacerItem(20, 171, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ self.gridlayout.addItem(spacerItem, 4, 1, 1, 1)
+ spacerItem1 = QtGui.QSpacerItem(301, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+ self.gridlayout.addItem(spacerItem1, 5, 0, 1, 1)
+ self.DownloadFirmwareButton = QtGui.QPushButton(Dialog)
+ self.DownloadFirmwareButton.setObjectName("DownloadFirmwareButton")
+ self.gridlayout.addWidget(self.DownloadFirmwareButton, 5, 1, 1, 1)
+ self.CancelButton = QtGui.QPushButton(Dialog)
+ self.CancelButton.setObjectName("CancelButton")
+ self.gridlayout.addWidget(self.CancelButton, 5, 2, 1, 1)
+
+ self.retranslateUi(Dialog)
+ QtCore.QMetaObject.connectSlotsByName(Dialog)
+
+ def retranslateUi(self, Dialog):
+ Dialog.setWindowTitle(QtGui.QApplication.translate("Dialog", "HP Device Manager - Download Firmware", None, QtGui.QApplication.UnicodeUTF8))
+ self.label.setText(QtGui.QApplication.translate("Dialog", "Download Firmware", None, QtGui.QApplication.UnicodeUTF8))
+ self.label_2.setText(QtGui.QApplication.translate("Dialog", "<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
+"p, li { white-space: pre-wrap; }\n"
+"</style></head><body style=\" font-family:\'DejaVu Sans\'; font-size:10pt; font-weight:400; font-style:normal;\">\n"
+"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">Click<span style=\" font-style:italic;\"> Download Firmware</span> to begin download process.</p></body></html>", None, QtGui.QApplication.UnicodeUTF8))
+ self.DownloadFirmwareButton.setText(QtGui.QApplication.translate("Dialog", "Download Firmware", None, QtGui.QApplication.UnicodeUTF8))
+ self.CancelButton.setText(QtGui.QApplication.translate("Dialog", "Cancel", None, QtGui.QApplication.UnicodeUTF8))
+
+from deviceuricombobox import DeviceUriComboBox
diff --git a/ui4/firmwaredialog_base.ui b/ui4/firmwaredialog_base.ui
new file mode 100644
index 0000000..d5b6734
--- /dev/null
+++ b/ui4/firmwaredialog_base.ui
@@ -0,0 +1,114 @@
+<ui version="4.0" >
+ <class>Dialog</class>
+ <widget class="QDialog" name="Dialog" >
+ <property name="windowModality" >
+ <enum>Qt::ApplicationModal</enum>
+ </property>
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>700</width>
+ <height>500</height>
+ </rect>
+ </property>
+ <property name="windowTitle" >
+ <string>HP Device Manager - Download Firmware</string>
+ </property>
+ <layout class="QGridLayout" >
+ <item row="0" column="0" >
+ <widget class="QLabel" name="label" >
+ <property name="font" >
+ <font>
+ <pointsize>16</pointsize>
+ </font>
+ </property>
+ <property name="text" >
+ <string>Download Firmware</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" colspan="3" >
+ <widget class="Line" name="line" >
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" colspan="3" >
+ <widget class="DeviceUriComboBox" name="DeviceComboBox" />
+ </item>
+ <item row="3" column="0" colspan="3" >
+ <widget class="QFrame" name="frame" >
+ <property name="frameShape" >
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <layout class="QGridLayout" >
+ <item row="0" column="0" >
+ <widget class="QLabel" name="label_2" >
+ <property name="text" >
+ <string>&lt;html>&lt;head>&lt;meta name="qrichtext" content="1" />&lt;style type="text/css">
+p, li { white-space: pre-wrap; }
+&lt;/style>&lt;/head>&lt;body style=" font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;">
+&lt;p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Click&lt;span style=" font-style:italic;"> Download Firmware&lt;/span> to begin download process.&lt;/p>&lt;/body>&lt;/html></string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="4" column="1" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>20</width>
+ <height>171</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="5" column="0" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>301</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="5" column="1" >
+ <widget class="QPushButton" name="DownloadFirmwareButton" >
+ <property name="text" >
+ <string>Download Firmware</string>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="2" >
+ <widget class="QPushButton" name="CancelButton" >
+ <property name="text" >
+ <string>Cancel</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <customwidgets>
+ <customwidget>
+ <class>DeviceUriComboBox</class>
+ <extends>QComboBox</extends>
+ <header>deviceuricombobox.h</header>
+ </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/ui4/infodialog.py b/ui4/infodialog.py
new file mode 100644
index 0000000..2d93068
--- /dev/null
+++ b/ui4/infodialog.py
@@ -0,0 +1,310 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2001-2008 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Authors: Don Welch
+#
+
+# StdLib
+import os.path
+
+# Local
+from base.g import *
+from base import device, utils
+from prnt import cups
+from base.codes import *
+from ui_utils import *
+
+# Qt
+from PyQt4.QtCore import *
+from PyQt4.QtGui import *
+
+# Ui
+from infodialog_base import Ui_Dialog
+from deviceuricombobox import DEVICEURICOMBOBOX_TYPE_PRINTER_AND_FAX
+
+
+class InfoDialog(QDialog, Ui_Dialog):
+ def __init__(self, parent, device_uri):
+ QDialog.__init__(self, parent)
+ self.device_uri = device_uri
+ #self.tabs = []
+ self.setupUi(self)
+ self.initUi()
+
+ QTimer.singleShot(0, self.updateUi)
+
+
+ def initUi(self):
+ # connect signals/slots
+ self.connect(self.CancelButton, SIGNAL("clicked()"), self.CancelButton_clicked)
+ self.connect(self.DeviceComboBox, SIGNAL("DeviceUriComboBox_noDevices"), self.DeviceUriComboBox_noDevices)
+ self.connect(self.DeviceComboBox, SIGNAL("DeviceUriComboBox_currentChanged"), self.DeviceUriComboBox_currentChanged)
+
+ # Application icon
+ self.setWindowIcon(QIcon(load_pixmap('hp_logo', '128x128')))
+
+ if self.device_uri:
+ self.DeviceComboBox.setInitialDevice(self.device_uri)
+
+ self.DeviceComboBox.setType(DEVICEURICOMBOBOX_TYPE_PRINTER_AND_FAX)
+
+ self.headers = [self.__tr("Key"), self.__tr("Value")]
+ self.history_headers = [self.__tr("Date/Time"), None,
+ self.__tr("Event Code"), self.__tr("Description"),
+ self.__tr("User"), self.__tr("CUPS Job ID"),
+ self.__tr("Doc. Title")]
+
+
+ def updateUi(self):
+ self.DeviceComboBox.updateUi()
+ #self.updateInfoTable()
+
+
+ def updateInfoTable(self):
+ QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
+ self.DynamicTableWidget.clear()
+ self.DynamicTableWidget.setRowCount(0)
+ self.DynamicTableWidget.setColumnCount(0)
+ flags = Qt.ItemIsSelectable | Qt.ItemIsEnabled
+
+ while self.TabWidget.count() > 3:
+ self.TabWidget.removeTab(3)
+
+ self.DynamicTableWidget.clear()
+ self.DynamicTableWidget.setRowCount(0)
+ self.DynamicTableWidget.setColumnCount(len(self.headers))
+ self.DynamicTableWidget.setHorizontalHeaderLabels(self.headers)
+
+ #
+ # Static Data
+ #
+
+ try:
+ d = device.Device(self.device_uri, None)
+ except Error:
+ QApplication.restoreOverrideCursor()
+ FailureUI(self, self.__tr("<b>Unable to open device %1.</b>").arg(self.device_uri))
+ #self.close()
+ return
+
+ self.StaticTableWidget.clear()
+
+ self.StaticTableWidget.setColumnCount(len(self.headers))
+ self.StaticTableWidget.setHorizontalHeaderLabels(self.headers)
+
+ mq_keys = d.mq.keys()
+ mq_keys.sort()
+
+ self.StaticTableWidget.setRowCount(len(mq_keys))
+
+ for row, key in enumerate(mq_keys):
+ i = QTableWidgetItem(QString(key))
+ i.setFlags(flags)
+ self.StaticTableWidget.setItem(row, 0, i)
+
+ i = QTableWidgetItem(QString(str(d.mq[key])))
+ i.setFlags(flags)
+ self.StaticTableWidget.setItem(row, 1, i)
+
+ self.StaticTableWidget.resizeColumnToContents(0)
+ self.StaticTableWidget.resizeColumnToContents(1)
+ self.StaticTableWidget.setSortingEnabled(True)
+ self.StaticTableWidget.sortItems(0)
+
+ #
+ # Dynamic Data
+ #
+
+ try:
+ try:
+ d.open()
+ d.queryDevice()
+ except Error, e:
+ QApplication.restoreOverrideCursor()
+ FailureUI(self, self.__tr("<b>Unable to open device %1.</b>").arg(self.device_uri))
+ #self.close()
+ return
+
+ dq_keys = d.dq.keys()
+ dq_keys.sort()
+
+ self.DynamicTableWidget.setRowCount(len(dq_keys))
+
+ for row, key in enumerate(dq_keys):
+ i = QTableWidgetItem(QString(key))
+ i.setFlags(flags)
+ self.DynamicTableWidget.setItem(row, 0, i)
+
+ i = QTableWidgetItem(QString(str(d.dq[key])))
+ i.setFlags(flags)
+ self.DynamicTableWidget.setItem(row, 1, i)
+
+
+ self.DynamicTableWidget.resizeColumnToContents(0)
+ self.DynamicTableWidget.resizeColumnToContents(1)
+ self.DynamicTableWidget.setSortingEnabled(True)
+ self.DynamicTableWidget.sortItems(0)
+
+ finally:
+ d.close()
+
+ #
+ # History Table
+ #
+
+ self.HistoryTableWidget.clear()
+ self.HistoryTableWidget.setRowCount(0)
+
+ if d.device_type == DEVICE_TYPE_FAX:
+ self.history_headers[1] = self.__tr("Fax")
+ else:
+ self.history_headers[1] = self.__tr("Printer")
+
+ self.HistoryTableWidget.setColumnCount(len(self.history_headers))
+ self.HistoryTableWidget.setHorizontalHeaderLabels(self.history_headers)
+
+ history = d.queryHistory()
+ history.reverse()
+ self.HistoryTableWidget.setRowCount(len(history))
+
+ for row, h in enumerate(history):
+ dt = QDateTime()
+ dt.setTime_t(int(h.timedate))
+ dt = dt.toString()
+
+ ess = device.queryString(h.event_code, 0)
+
+ for col, t in enumerate([dt, h.printer_name,
+ unicode(h.event_code), ess,
+ h.username, unicode(h.job_id),
+ h.title]):
+
+ i = QTableWidgetItem(QString(t))
+ i.setFlags(flags)
+ self.HistoryTableWidget.setItem(row, col, i)
+
+ self.HistoryTableWidget.resizeColumnToContents(0)
+ self.HistoryTableWidget.resizeColumnToContents(1)
+ self.HistoryTableWidget.setSortingEnabled(True)
+ self.HistoryTableWidget.sortItems(0)
+
+ #
+ # Printer Data
+ #
+
+ printers = cups.getPrinters()
+
+ for p in printers:
+ if p.device_uri == self.device_uri:
+ Tab = QWidget()
+ Tab.setObjectName(QString(p.name))
+
+ GridLayout = QGridLayout(Tab)
+ GridLayout.setObjectName(QString("GridLayout-%s" % p.name))
+
+ Table = QTableWidget(Tab)
+ Table.setAlternatingRowColors(True)
+ Table.setSelectionMode(QAbstractItemView.SingleSelection)
+ Table.setSelectionBehavior(QAbstractItemView.SelectRows)
+ Table.setVerticalScrollMode(QAbstractItemView.ScrollPerItem)
+ Table.setHorizontalScrollMode(QAbstractItemView.ScrollPerPixel)
+ Table.setGridStyle(Qt.DotLine)
+ Table.setObjectName(QString("Table-%s" % p.name))
+ GridLayout.addWidget(Table, 0, 0, 1, 1)
+ self.TabWidget.addTab(Tab, QString(p.name))
+
+ Table.setColumnCount(len(self.headers))
+ Table.setHorizontalHeaderLabels(self.headers)
+
+ cups.resetOptions()
+ cups.openPPD(p.name)
+ current_options = dict(cups.getOptions())
+
+ #current_options['cups_error_log_level'] = cups.getErrorLogLevel()
+
+ try:
+ f = file(os.path.expanduser('~/.cups/lpoptions'))
+ except IOError, e:
+ log.debug(str(e))
+ current_options['lpoptions_file_data'] = QString("(%1)").arg(str(e))
+ else:
+ text = f.read()
+ for d in text.splitlines():
+ if p.name in d:
+ current_options['lpoptions_file_data'] = d
+ break
+ else:
+ current_options['lpoptions_file_data'] = self.__tr("(no data)")
+
+ keys = current_options.keys()
+ keys.sort()
+
+ Table.setRowCount(len(keys))
+
+ for row, key in enumerate(keys):
+ i = QTableWidgetItem(QString(key))
+ i.setFlags(flags)
+ Table.setItem(row, 0, i)
+
+ if key == 'printer-state':
+ state = int(current_options[key])
+ if state == cups.IPP_PRINTER_STATE_IDLE:
+ i = QTableWidgetItem(self.__tr("idle (%1)").arg(state))
+ elif state == cups.IPP_PRINTER_STATE_PROCESSING:
+ i = QTableWidgetItem(self.__tr("busy/printing (%1)").arg(state))
+ elif state == cups.IPP_PRINTER_STATE_STOPPED:
+ i = QTableWidgetItem(self.__tr("stopped (%1)").arg(state))
+ else:
+ i = QTableWidgetItem(QString(str(state)))
+ else:
+ i = QTableWidgetItem(QString(str(current_options[key])))
+
+ i.setFlags(flags)
+ Table.setItem(row, 1, i)
+
+ Table.resizeColumnToContents(0)
+ Table.resizeColumnToContents(1)
+ Table.setSortingEnabled(True)
+ Table.sortItems(0)
+
+ cups.closePPD()
+ self.TabWidget.setCurrentIndex(0)
+ QApplication.restoreOverrideCursor()
+
+
+ def DeviceUriComboBox_currentChanged(self, device_uri):
+ self.device_uri = device_uri
+ self.updateInfoTable()
+
+
+ def DeviceUriComboBox_noDevices(self):
+ FailureUI(self, self.__tr("<b>No devices found.</b>"))
+ self.close()
+
+
+ def CancelButton_clicked(self):
+ self.close()
+
+ #
+ # Misc
+ #
+
+ def __tr(self,s,c = None):
+ return qApp.translate("InfoDialog",s,c)
+
+
diff --git a/ui4/infodialog_base.py b/ui4/infodialog_base.py
new file mode 100644
index 0000000..8ee40af
--- /dev/null
+++ b/ui4/infodialog_base.py
@@ -0,0 +1,103 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'ui4/infodialog_base.ui'
+#
+# Created: Mon May 4 14:30:33 2009
+# by: PyQt4 UI code generator 4.4.4
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt4 import QtCore, QtGui
+
+class Ui_Dialog(object):
+ def setupUi(self, Dialog):
+ Dialog.setObjectName("Dialog")
+ Dialog.resize(700, 500)
+ self.gridlayout = QtGui.QGridLayout(Dialog)
+ self.gridlayout.setObjectName("gridlayout")
+ self.label = QtGui.QLabel(Dialog)
+ font = QtGui.QFont()
+ font.setPointSize(16)
+ self.label.setFont(font)
+ self.label.setObjectName("label")
+ self.gridlayout.addWidget(self.label, 0, 0, 1, 1)
+ self.line = QtGui.QFrame(Dialog)
+ self.line.setFrameShape(QtGui.QFrame.HLine)
+ self.line.setFrameShadow(QtGui.QFrame.Sunken)
+ self.line.setObjectName("line")
+ self.gridlayout.addWidget(self.line, 1, 0, 1, 2)
+ self.DeviceComboBox = DeviceUriComboBox(Dialog)
+ self.DeviceComboBox.setObjectName("DeviceComboBox")
+ self.gridlayout.addWidget(self.DeviceComboBox, 2, 0, 1, 2)
+ self.TabWidget = QtGui.QTabWidget(Dialog)
+ self.TabWidget.setObjectName("TabWidget")
+ self.tab_2 = QtGui.QWidget()
+ self.tab_2.setObjectName("tab_2")
+ self.gridlayout1 = QtGui.QGridLayout(self.tab_2)
+ self.gridlayout1.setObjectName("gridlayout1")
+ self.StaticTableWidget = QtGui.QTableWidget(self.tab_2)
+ self.StaticTableWidget.setAlternatingRowColors(True)
+ self.StaticTableWidget.setSelectionMode(QtGui.QAbstractItemView.SingleSelection)
+ self.StaticTableWidget.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows)
+ self.StaticTableWidget.setVerticalScrollMode(QtGui.QAbstractItemView.ScrollPerItem)
+ self.StaticTableWidget.setHorizontalScrollMode(QtGui.QAbstractItemView.ScrollPerPixel)
+ self.StaticTableWidget.setGridStyle(QtCore.Qt.DotLine)
+ self.StaticTableWidget.setObjectName("StaticTableWidget")
+ self.StaticTableWidget.setColumnCount(0)
+ self.StaticTableWidget.setRowCount(0)
+ self.gridlayout1.addWidget(self.StaticTableWidget, 0, 0, 1, 1)
+ self.TabWidget.addTab(self.tab_2, "")
+ self.tab = QtGui.QWidget()
+ self.tab.setObjectName("tab")
+ self.gridlayout2 = QtGui.QGridLayout(self.tab)
+ self.gridlayout2.setObjectName("gridlayout2")
+ self.DynamicTableWidget = QtGui.QTableWidget(self.tab)
+ self.DynamicTableWidget.setAlternatingRowColors(True)
+ self.DynamicTableWidget.setSelectionMode(QtGui.QAbstractItemView.SingleSelection)
+ self.DynamicTableWidget.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows)
+ self.DynamicTableWidget.setVerticalScrollMode(QtGui.QAbstractItemView.ScrollPerItem)
+ self.DynamicTableWidget.setHorizontalScrollMode(QtGui.QAbstractItemView.ScrollPerPixel)
+ self.DynamicTableWidget.setGridStyle(QtCore.Qt.DotLine)
+ self.DynamicTableWidget.setObjectName("DynamicTableWidget")
+ self.DynamicTableWidget.setColumnCount(0)
+ self.DynamicTableWidget.setRowCount(0)
+ self.gridlayout2.addWidget(self.DynamicTableWidget, 0, 0, 1, 1)
+ self.TabWidget.addTab(self.tab, "")
+ self.tab_3 = QtGui.QWidget()
+ self.tab_3.setObjectName("tab_3")
+ self.gridlayout3 = QtGui.QGridLayout(self.tab_3)
+ self.gridlayout3.setObjectName("gridlayout3")
+ self.HistoryTableWidget = QtGui.QTableWidget(self.tab_3)
+ self.HistoryTableWidget.setAlternatingRowColors(True)
+ self.HistoryTableWidget.setSelectionMode(QtGui.QAbstractItemView.SingleSelection)
+ self.HistoryTableWidget.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows)
+ self.HistoryTableWidget.setVerticalScrollMode(QtGui.QAbstractItemView.ScrollPerPixel)
+ self.HistoryTableWidget.setGridStyle(QtCore.Qt.DotLine)
+ self.HistoryTableWidget.setObjectName("HistoryTableWidget")
+ self.HistoryTableWidget.setColumnCount(0)
+ self.HistoryTableWidget.setRowCount(0)
+ self.gridlayout3.addWidget(self.HistoryTableWidget, 0, 0, 1, 1)
+ self.TabWidget.addTab(self.tab_3, "")
+ self.gridlayout.addWidget(self.TabWidget, 3, 0, 1, 2)
+ spacerItem = QtGui.QSpacerItem(470, 31, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Maximum)
+ self.gridlayout.addItem(spacerItem, 4, 0, 1, 1)
+ spacerItem1 = QtGui.QSpacerItem(361, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+ self.gridlayout.addItem(spacerItem1, 5, 0, 1, 1)
+ self.CancelButton = QtGui.QPushButton(Dialog)
+ self.CancelButton.setObjectName("CancelButton")
+ self.gridlayout.addWidget(self.CancelButton, 5, 1, 1, 1)
+
+ self.retranslateUi(Dialog)
+ self.TabWidget.setCurrentIndex(0)
+ QtCore.QMetaObject.connectSlotsByName(Dialog)
+
+ def retranslateUi(self, Dialog):
+ Dialog.setWindowTitle(QtGui.QApplication.translate("Dialog", "HP Device Manager - Device Information", None, QtGui.QApplication.UnicodeUTF8))
+ self.label.setText(QtGui.QApplication.translate("Dialog", "Device Information", None, QtGui.QApplication.UnicodeUTF8))
+ self.TabWidget.setTabText(self.TabWidget.indexOf(self.tab_2), QtGui.QApplication.translate("Dialog", "Model Data (Static)", None, QtGui.QApplication.UnicodeUTF8))
+ self.TabWidget.setTabText(self.TabWidget.indexOf(self.tab), QtGui.QApplication.translate("Dialog", "Status Data (Dynamic)", None, QtGui.QApplication.UnicodeUTF8))
+ self.HistoryTableWidget.setSortingEnabled(False)
+ self.TabWidget.setTabText(self.TabWidget.indexOf(self.tab_3), QtGui.QApplication.translate("Dialog", "Status History", None, QtGui.QApplication.UnicodeUTF8))
+ self.CancelButton.setText(QtGui.QApplication.translate("Dialog", "Close", None, QtGui.QApplication.UnicodeUTF8))
+
+from deviceuricombobox import DeviceUriComboBox
diff --git a/ui4/infodialog_base.ui b/ui4/infodialog_base.ui
new file mode 100644
index 0000000..f868431
--- /dev/null
+++ b/ui4/infodialog_base.ui
@@ -0,0 +1,179 @@
+<ui version="4.0" >
+ <class>Dialog</class>
+ <widget class="QDialog" name="Dialog" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>700</width>
+ <height>500</height>
+ </rect>
+ </property>
+ <property name="windowTitle" >
+ <string>HP Device Manager - Device Information</string>
+ </property>
+ <layout class="QGridLayout" >
+ <item row="0" column="0" >
+ <widget class="QLabel" name="label" >
+ <property name="font" >
+ <font>
+ <pointsize>16</pointsize>
+ </font>
+ </property>
+ <property name="text" >
+ <string>Device Information</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" colspan="2" >
+ <widget class="Line" name="line" >
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" colspan="2" >
+ <widget class="DeviceUriComboBox" name="DeviceComboBox" />
+ </item>
+ <item row="3" column="0" colspan="2" >
+ <widget class="QTabWidget" name="TabWidget" >
+ <property name="currentIndex" >
+ <number>0</number>
+ </property>
+ <widget class="QWidget" name="tab_2" >
+ <attribute name="title" >
+ <string>Model Data (Static)</string>
+ </attribute>
+ <layout class="QGridLayout" >
+ <item row="0" column="0" >
+ <widget class="QTableWidget" name="StaticTableWidget" >
+ <property name="alternatingRowColors" >
+ <bool>true</bool>
+ </property>
+ <property name="selectionMode" >
+ <enum>QAbstractItemView::SingleSelection</enum>
+ </property>
+ <property name="selectionBehavior" >
+ <enum>QAbstractItemView::SelectRows</enum>
+ </property>
+ <property name="verticalScrollMode" >
+ <enum>QAbstractItemView::ScrollPerItem</enum>
+ </property>
+ <property name="horizontalScrollMode" >
+ <enum>QAbstractItemView::ScrollPerPixel</enum>
+ </property>
+ <property name="gridStyle" >
+ <enum>Qt::DotLine</enum>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="tab" >
+ <attribute name="title" >
+ <string>Status Data (Dynamic)</string>
+ </attribute>
+ <layout class="QGridLayout" >
+ <item row="0" column="0" >
+ <widget class="QTableWidget" name="DynamicTableWidget" >
+ <property name="alternatingRowColors" >
+ <bool>true</bool>
+ </property>
+ <property name="selectionMode" >
+ <enum>QAbstractItemView::SingleSelection</enum>
+ </property>
+ <property name="selectionBehavior" >
+ <enum>QAbstractItemView::SelectRows</enum>
+ </property>
+ <property name="verticalScrollMode" >
+ <enum>QAbstractItemView::ScrollPerItem</enum>
+ </property>
+ <property name="horizontalScrollMode" >
+ <enum>QAbstractItemView::ScrollPerPixel</enum>
+ </property>
+ <property name="gridStyle" >
+ <enum>Qt::DotLine</enum>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="tab_3" >
+ <attribute name="title" >
+ <string>Status History</string>
+ </attribute>
+ <layout class="QGridLayout" >
+ <item row="0" column="0" >
+ <widget class="QTableWidget" name="HistoryTableWidget" >
+ <property name="alternatingRowColors" >
+ <bool>true</bool>
+ </property>
+ <property name="selectionMode" >
+ <enum>QAbstractItemView::SingleSelection</enum>
+ </property>
+ <property name="selectionBehavior" >
+ <enum>QAbstractItemView::SelectRows</enum>
+ </property>
+ <property name="verticalScrollMode" >
+ <enum>QAbstractItemView::ScrollPerPixel</enum>
+ </property>
+ <property name="gridStyle" >
+ <enum>Qt::DotLine</enum>
+ </property>
+ <property name="sortingEnabled" >
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ </item>
+ <item row="4" column="0" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeType" >
+ <enum>QSizePolicy::Maximum</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>470</width>
+ <height>31</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="5" column="0" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>361</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="5" column="1" >
+ <widget class="QPushButton" name="CancelButton" >
+ <property name="text" >
+ <string>Close</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <customwidgets>
+ <customwidget>
+ <class>DeviceUriComboBox</class>
+ <extends>QComboBox</extends>
+ <header>deviceuricombobox.h</header>
+ </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/ui4/linefeedcaldialog.py b/ui4/linefeedcaldialog.py
new file mode 100644
index 0000000..539ab85
--- /dev/null
+++ b/ui4/linefeedcaldialog.py
@@ -0,0 +1,125 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2001-2008 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Authors: Don Welch
+#
+
+# Std Lib
+import operator
+
+# Local
+from base.g import *
+from base import device, utils, maint
+#from prnt import cups
+from base.codes import *
+from ui_utils import *
+
+# Qt
+from PyQt4.QtCore import *
+from PyQt4.QtGui import *
+
+# Ui
+from linefeedcaldialog_base import Ui_Dialog
+from deviceuricombobox import DEVICEURICOMBOBOX_TYPE_FAX_ONLY
+
+
+class LineFeedCalDialog(QDialog, Ui_Dialog):
+ def __init__(self, parent, device_uri):
+ QDialog.__init__(self, parent)
+ self.setupUi(self)
+ self.device_uri = device_uri
+ self.initUi()
+ QTimer.singleShot(0, self.updateUi)
+
+
+ def initUi(self):
+ # connect signals/slots
+ self.connect(self.CancelButton, SIGNAL("clicked()"), self.CancelButton_clicked)
+ self.connect(self.CalibrateButton, SIGNAL("clicked()"), self.CalibrateButton_clicked)
+ self.connect(self.DeviceComboBox, SIGNAL("DeviceUriComboBox_noDevices"), self.DeviceUriComboBox_noDevices)
+ self.connect(self.DeviceComboBox, SIGNAL("DeviceUriComboBox_currentChanged"), self.DeviceUriComboBox_currentChanged)
+ self.DeviceComboBox.setFilter({'linefeed-cal-type': (operator.gt, 0)})
+
+ # Application icon
+ self.setWindowIcon(QIcon(load_pixmap('hp_logo', '128x128')))
+
+ if self.device_uri:
+ self.DeviceComboBox.setInitialDevice(self.device_uri)
+
+
+ def updateUi(self):
+ self.DeviceComboBox.updateUi()
+ self.LoadPaper.setButtonName(self.__tr("Calibrate"))
+ self.LoadPaper.updateUi()
+
+
+ def DeviceUriComboBox_currentChanged(self, device_uri):
+ self.device_uri = device_uri
+ # Update
+
+
+ def DeviceUriComboBox_noDevices(self):
+ FailureUI(self, self.__tr("""<b>No devices that support line feed calibration found.</b><p>Click <i>OK</i> to exit.</p>"""))
+ self.close()
+
+
+ def CancelButton_clicked(self):
+ self.close()
+
+
+ def CalibrateButton_clicked(self):
+ d = None
+
+ try:
+ try:
+ d = device.Device(self.device_uri)
+ except Error:
+ CheckDeviceUI(self)
+ return
+
+ linefeed_type = d.linefeed_cal_type
+
+ try:
+ d.open()
+ except Error:
+ CheckDeviceUI(self)
+ else:
+ if d.isIdleAndNoError():
+ if linefeed_type == LINEFEED_CAL_TYPE_OJ_K550: # 1
+ maint.linefeedCalType1(d, lambda : True)
+
+ elif linefeed_type == LINEFEED_CAL_TYPE_OJ_PRO_L7XXX: # 2
+ maint.linefeedCalType2(d, lambda : True)
+
+ else:
+ CheckDeviceUI(self)
+
+ finally:
+ if d is not None:
+ d.close()
+
+ self.close()
+
+ #
+ # Misc
+ #
+
+ def __tr(self,s,c = None):
+ return qApp.translate("LineFeedCalDialog",s,c)
+
+
diff --git a/ui4/linefeedcaldialog_base.py b/ui4/linefeedcaldialog_base.py
new file mode 100644
index 0000000..75aacc7
--- /dev/null
+++ b/ui4/linefeedcaldialog_base.py
@@ -0,0 +1,56 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'ui4/linefeedcaldialog_base.ui'
+#
+# Created: Mon May 4 14:30:33 2009
+# by: PyQt4 UI code generator 4.4.4
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt4 import QtCore, QtGui
+
+class Ui_Dialog(object):
+ def setupUi(self, Dialog):
+ Dialog.setObjectName("Dialog")
+ Dialog.resize(700, 500)
+ self.gridlayout = QtGui.QGridLayout(Dialog)
+ self.gridlayout.setObjectName("gridlayout")
+ self.label = QtGui.QLabel(Dialog)
+ font = QtGui.QFont()
+ font.setPointSize(16)
+ self.label.setFont(font)
+ self.label.setObjectName("label")
+ self.gridlayout.addWidget(self.label, 0, 0, 1, 1)
+ self.line = QtGui.QFrame(Dialog)
+ self.line.setFrameShape(QtGui.QFrame.HLine)
+ self.line.setFrameShadow(QtGui.QFrame.Sunken)
+ self.line.setObjectName("line")
+ self.gridlayout.addWidget(self.line, 1, 0, 1, 3)
+ self.DeviceComboBox = DeviceUriComboBox(Dialog)
+ self.DeviceComboBox.setObjectName("DeviceComboBox")
+ self.gridlayout.addWidget(self.DeviceComboBox, 2, 0, 1, 3)
+ self.LoadPaper = LoadPaperGroupBox(Dialog)
+ self.LoadPaper.setObjectName("LoadPaper")
+ self.gridlayout.addWidget(self.LoadPaper, 3, 0, 1, 3)
+ spacerItem = QtGui.QSpacerItem(410, 81, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ self.gridlayout.addItem(spacerItem, 4, 0, 1, 1)
+ spacerItem1 = QtGui.QSpacerItem(361, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+ self.gridlayout.addItem(spacerItem1, 5, 0, 1, 1)
+ self.CalibrateButton = QtGui.QPushButton(Dialog)
+ self.CalibrateButton.setObjectName("CalibrateButton")
+ self.gridlayout.addWidget(self.CalibrateButton, 5, 1, 1, 1)
+ self.CancelButton = QtGui.QPushButton(Dialog)
+ self.CancelButton.setObjectName("CancelButton")
+ self.gridlayout.addWidget(self.CancelButton, 5, 2, 1, 1)
+
+ self.retranslateUi(Dialog)
+ QtCore.QMetaObject.connectSlotsByName(Dialog)
+
+ def retranslateUi(self, Dialog):
+ Dialog.setWindowTitle(QtGui.QApplication.translate("Dialog", "HP Device Manager - Line Feed Calibration", None, QtGui.QApplication.UnicodeUTF8))
+ self.label.setText(QtGui.QApplication.translate("Dialog", "Line Feed Calibration", None, QtGui.QApplication.UnicodeUTF8))
+ self.CalibrateButton.setText(QtGui.QApplication.translate("Dialog", "Calibrate", None, QtGui.QApplication.UnicodeUTF8))
+ self.CancelButton.setText(QtGui.QApplication.translate("Dialog", "Cancel", None, QtGui.QApplication.UnicodeUTF8))
+
+from loadpapergroupbox import LoadPaperGroupBox
+from deviceuricombobox import DeviceUriComboBox
diff --git a/ui4/linefeedcaldialog_base.ui b/ui4/linefeedcaldialog_base.ui
new file mode 100644
index 0000000..2d08020
--- /dev/null
+++ b/ui4/linefeedcaldialog_base.ui
@@ -0,0 +1,102 @@
+<ui version="4.0" >
+ <class>Dialog</class>
+ <widget class="QDialog" name="Dialog" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>700</width>
+ <height>500</height>
+ </rect>
+ </property>
+ <property name="windowTitle" >
+ <string>HP Device Manager - Line Feed Calibration</string>
+ </property>
+ <layout class="QGridLayout" >
+ <item row="0" column="0" >
+ <widget class="QLabel" name="label" >
+ <property name="font" >
+ <font>
+ <pointsize>16</pointsize>
+ </font>
+ </property>
+ <property name="text" >
+ <string>Line Feed Calibration</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" colspan="3" >
+ <widget class="Line" name="line" >
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" colspan="3" >
+ <widget class="DeviceUriComboBox" name="DeviceComboBox" />
+ </item>
+ <item row="3" column="0" colspan="3" >
+ <widget class="LoadPaperGroupBox" name="LoadPaper" >
+ <property name="title" >
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="0" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>410</width>
+ <height>81</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="5" column="0" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>361</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="5" column="1" >
+ <widget class="QPushButton" name="CalibrateButton" >
+ <property name="text" >
+ <string>Calibrate</string>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="2" >
+ <widget class="QPushButton" name="CancelButton" >
+ <property name="text" >
+ <string>Cancel</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <customwidgets>
+ <customwidget>
+ <class>DeviceUriComboBox</class>
+ <extends>QComboBox</extends>
+ <header>deviceuricombobox.h</header>
+ </customwidget>
+ <customwidget>
+ <class>LoadPaperGroupBox</class>
+ <extends>QGroupBox</extends>
+ <header>loadpapergroupbox.h</header>
+ <container>1</container>
+ </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/ui4/loadpapergroupbox.py b/ui4/loadpapergroupbox.py
new file mode 100644
index 0000000..11c96ae
--- /dev/null
+++ b/ui4/loadpapergroupbox.py
@@ -0,0 +1,103 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2001-2008 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+# Std Lib
+import sys
+
+# Local
+from base.g import *
+from ui_utils import *
+
+# Qt
+from PyQt4.QtCore import *
+from PyQt4.QtGui import *
+
+
+LOADPAPER_TYPE_PLAIN_PAPER = 0
+LOADPAPER_TYPE_PHOTO_PAPER = 1
+
+
+class LoadPaperGroupBox(QGroupBox):
+ def __init__(self, parent):
+ QWidget.__init__(self, parent)
+
+ self.initUi()
+ self.typ = LOADPAPER_TYPE_PLAIN_PAPER
+ self.button_name = self.__tr("Next >")
+
+
+ def initUi(self):
+ #print "LoadPaperWidget.initUi()"
+
+ self.GridLayout = QGridLayout(self)
+ self.GridLayout.setObjectName("GridLayout")
+
+ self.LoadPaperPix = QLabel(self)
+
+ sizePolicy = QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.LoadPaperPix.sizePolicy().hasHeightForWidth())
+ self.LoadPaperPix.setSizePolicy(sizePolicy)
+ self.LoadPaperPix.setMinimumSize(QSize(96,96))
+ self.LoadPaperPix.setMaximumSize(QSize(96,96))
+ #self.LoadPaperPix.setFrameShape(QFrame.Box)
+ self.LoadPaperPix.setObjectName("LoadPaperPix")
+ self.GridLayout.addWidget(self.LoadPaperPix,0,0,1,1)
+
+ spacerItem = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
+ self.GridLayout.addItem(spacerItem,0,1,1,1)
+
+ self.Text = QLabel(self)
+
+ sizePolicy = QSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.Expanding)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.Text.sizePolicy().hasHeightForWidth())
+ self.Text.setSizePolicy(sizePolicy)
+ self.Text.setWordWrap(True)
+ self.Text.setObjectName("Text")
+ self.GridLayout.addWidget(self.Text,0,2,1,1)
+
+ self.LoadPaperPix.setPixmap(load_pixmap("load_paper", "other"))
+
+
+ def updateUi(self):
+ #print "LoadPaperWidget.updateUi()"
+ if self.typ == LOADPAPER_TYPE_PLAIN_PAPER:
+ paper_name = self.__tr("plain paper")
+ else:
+ paper_name = self.__tr("photo paper")
+
+ self.Text.setText(self.__tr("Please load <b>%1</b> in the printer and then click <i>%2</i> to continue.").arg(paper_name).arg(self.button_name))
+
+
+ def setType(self, typ):
+ if typ in (LOADPAPER_TYPE_PHOTO_PAPER, LOADPAPER_TYPE_PHOTO_PAPER):
+ self.typ = typ
+
+
+ def setButtonName(self, b):
+ self.button_name = b
+
+
+ def __tr(self,s,c = None):
+ return qApp.translate("LoadPaperWidget",s,c)
diff --git a/ui4/makecopiesdialog.py b/ui4/makecopiesdialog.py
new file mode 100644
index 0000000..a8ca598
--- /dev/null
+++ b/ui4/makecopiesdialog.py
@@ -0,0 +1,91 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2001-2008 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Authors: Don Welch
+#
+
+# Std Lib
+import operator
+
+# Local
+from base.g import *
+from base import device, utils
+#from prnt import cups
+from base.codes import *
+from ui_utils import *
+
+# Qt
+from PyQt4.QtCore import *
+from PyQt4.QtGui import *
+
+# Ui
+from makecopiesdialog_base import Ui_Dialog
+
+
+class MakeCopiesDialog(QDialog, Ui_Dialog):
+ def __init__(self, parent, device_uri):
+ QDialog.__init__(self, parent)
+ self.setupUi(self)
+ self.device_uri = device_uri
+ self.initUi()
+ QTimer.singleShot(0, self.updateUi)
+
+
+ def initUi(self):
+ # connect signals/slots
+ self.connect(self.CancelButton, SIGNAL("clicked()"), self.CancelButton_clicked)
+ self.connect(self.CopyButton, SIGNAL("clicked()"), self.CopyButton_clicked)
+ self.connect(self.DeviceComboBox, SIGNAL("DeviceUriComboBox_noDevices"), self.DeviceUriComboBox_noDevices)
+ self.connect(self.DeviceComboBox, SIGNAL("DeviceUriComboBox_currentChanged"), self.DeviceUriComboBox_currentChanged)
+ self.DeviceComboBox.setFilter({'copy-type': (operator.gt, 0)})
+
+ # Application icon
+ self.setWindowIcon(QIcon(load_pixmap('hp_logo', '128x128')))
+
+ if self.device_uri:
+ self.DeviceComboBox.setInitialDevice(self.device_uri)
+
+
+ def updateUi(self):
+ self.DeviceComboBox.updateUi()
+
+
+ def DeviceUriComboBox_currentChanged(self, device_uri):
+ self.device_uri = device_uri
+ # Update
+
+
+ def DeviceUriComboBox_noDevices(self):
+ FailureUI(self, self.__tr("<b>No devices that support PC initiated copy found.</b><p>Click <i>OK</i> to exit.</p>"))
+ self.close()
+
+ def CancelButton_clicked(self):
+ self.close()
+
+
+ def CopyButton_clicked(self):
+ pass
+
+ #
+ # Misc
+ #
+
+ def __tr(self,s,c = None):
+ return qApp.translate("MakeCopiesDialog",s,c)
+
+
diff --git a/ui4/makecopiesdialog_base.py b/ui4/makecopiesdialog_base.py
new file mode 100644
index 0000000..0157c0c
--- /dev/null
+++ b/ui4/makecopiesdialog_base.py
@@ -0,0 +1,52 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'ui4/makecopiesdialog_base.ui'
+#
+# Created: Mon May 4 14:30:34 2009
+# by: PyQt4 UI code generator 4.4.4
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt4 import QtCore, QtGui
+
+class Ui_Dialog(object):
+ def setupUi(self, Dialog):
+ Dialog.setObjectName("Dialog")
+ Dialog.resize(700, 500)
+ self.gridlayout = QtGui.QGridLayout(Dialog)
+ self.gridlayout.setObjectName("gridlayout")
+ self.label = QtGui.QLabel(Dialog)
+ font = QtGui.QFont()
+ font.setPointSize(16)
+ self.label.setFont(font)
+ self.label.setObjectName("label")
+ self.gridlayout.addWidget(self.label, 0, 0, 1, 1)
+ self.line = QtGui.QFrame(Dialog)
+ self.line.setFrameShape(QtGui.QFrame.HLine)
+ self.line.setFrameShadow(QtGui.QFrame.Sunken)
+ self.line.setObjectName("line")
+ self.gridlayout.addWidget(self.line, 1, 0, 1, 4)
+ self.DeviceComboBox = DeviceUriComboBox(Dialog)
+ self.DeviceComboBox.setObjectName("DeviceComboBox")
+ self.gridlayout.addWidget(self.DeviceComboBox, 2, 0, 1, 4)
+ spacerItem = QtGui.QSpacerItem(20, 341, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ self.gridlayout.addItem(spacerItem, 3, 1, 1, 1)
+ spacerItem1 = QtGui.QSpacerItem(391, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+ self.gridlayout.addItem(spacerItem1, 4, 0, 1, 2)
+ self.CopyButton = QtGui.QPushButton(Dialog)
+ self.CopyButton.setObjectName("CopyButton")
+ self.gridlayout.addWidget(self.CopyButton, 4, 2, 1, 1)
+ self.CancelButton = QtGui.QPushButton(Dialog)
+ self.CancelButton.setObjectName("CancelButton")
+ self.gridlayout.addWidget(self.CancelButton, 4, 3, 1, 1)
+
+ self.retranslateUi(Dialog)
+ QtCore.QMetaObject.connectSlotsByName(Dialog)
+
+ def retranslateUi(self, Dialog):
+ Dialog.setWindowTitle(QtGui.QApplication.translate("Dialog", "HP Device Manager - Make Copies", None, QtGui.QApplication.UnicodeUTF8))
+ self.label.setText(QtGui.QApplication.translate("Dialog", "Make Copies", None, QtGui.QApplication.UnicodeUTF8))
+ self.CopyButton.setText(QtGui.QApplication.translate("Dialog", "Make Copies", None, QtGui.QApplication.UnicodeUTF8))
+ self.CancelButton.setText(QtGui.QApplication.translate("Dialog", "Cancel", None, QtGui.QApplication.UnicodeUTF8))
+
+from deviceuricombobox import DeviceUriComboBox
diff --git a/ui4/makecopiesdialog_base.ui b/ui4/makecopiesdialog_base.ui
new file mode 100644
index 0000000..15ccdd6
--- /dev/null
+++ b/ui4/makecopiesdialog_base.ui
@@ -0,0 +1,89 @@
+<ui version="4.0" >
+ <class>Dialog</class>
+ <widget class="QDialog" name="Dialog" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>700</width>
+ <height>500</height>
+ </rect>
+ </property>
+ <property name="windowTitle" >
+ <string>HP Device Manager - Make Copies</string>
+ </property>
+ <layout class="QGridLayout" >
+ <item row="0" column="0" >
+ <widget class="QLabel" name="label" >
+ <property name="font" >
+ <font>
+ <pointsize>16</pointsize>
+ </font>
+ </property>
+ <property name="text" >
+ <string>Make Copies</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" colspan="4" >
+ <widget class="Line" name="line" >
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" colspan="4" >
+ <widget class="DeviceUriComboBox" name="DeviceComboBox" />
+ </item>
+ <item row="3" column="1" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>20</width>
+ <height>341</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="4" column="0" colspan="2" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>391</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="4" column="2" >
+ <widget class="QPushButton" name="CopyButton" >
+ <property name="text" >
+ <string>Make Copies</string>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="3" >
+ <widget class="QPushButton" name="CancelButton" >
+ <property name="text" >
+ <string>Cancel</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <customwidgets>
+ <customwidget>
+ <class>DeviceUriComboBox</class>
+ <extends>QComboBox</extends>
+ <header>deviceuricombobox.h</header>
+ </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/ui4/mimetypesdialog.py b/ui4/mimetypesdialog.py
new file mode 100644
index 0000000..e7ce492
--- /dev/null
+++ b/ui4/mimetypesdialog.py
@@ -0,0 +1,58 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2001-2008 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+# Local
+from base.g import *
+from base.codes import *
+from ui_utils import *
+
+# Qt
+from PyQt4.QtCore import *
+from PyQt4.QtGui import *
+from mimetypesdialog_base import Ui_MimeTypesDialog_base
+
+
+
+class MimeTypesDialog(QDialog, Ui_MimeTypesDialog_base):
+ def __init__(self, mime_types, parent=None):
+ QDialog.__init__(self, parent)
+ self.setupUi(self)
+
+ self.TypesTableWidget.setRowCount(len(mime_types))
+ t = mime_types.keys()
+ t.sort()
+ for row, m in enumerate(t):
+ i = QTableWidgetItem(m)
+ self.TypesTableWidget.setItem(row, 0, i)
+
+ i = QTableWidgetItem(mime_types[m][0])
+ self.TypesTableWidget.setItem(row, 1, i)
+
+ i = QTableWidgetItem(mime_types[m][1])
+ self.TypesTableWidget.setItem(row, 2, i)
+
+ self.TypesTableWidget.resizeColumnsToContents()
+
+
+ def __tr(self,s,c = None):
+ return qApp.translate("SettingsDialog",s,c)
+
+
diff --git a/ui4/mimetypesdialog_base.py b/ui4/mimetypesdialog_base.py
new file mode 100644
index 0000000..de1376c
--- /dev/null
+++ b/ui4/mimetypesdialog_base.py
@@ -0,0 +1,67 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'ui4/mimetypesdialog_base.ui'
+#
+# Created: Mon May 4 14:30:34 2009
+# by: PyQt4 UI code generator 4.4.4
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt4 import QtCore, QtGui
+
+class Ui_MimeTypesDialog_base(object):
+ def setupUi(self, MimeTypesDialog_base):
+ MimeTypesDialog_base.setObjectName("MimeTypesDialog_base")
+ MimeTypesDialog_base.resize(500, 540)
+ self.gridlayout = QtGui.QGridLayout(MimeTypesDialog_base)
+ self.gridlayout.setObjectName("gridlayout")
+ self.textLabel3_2 = QtGui.QLabel(MimeTypesDialog_base)
+ sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Preferred)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.textLabel3_2.sizePolicy().hasHeightForWidth())
+ self.textLabel3_2.setSizePolicy(sizePolicy)
+ self.textLabel3_2.setWordWrap(False)
+ self.textLabel3_2.setObjectName("textLabel3_2")
+ self.gridlayout.addWidget(self.textLabel3_2, 0, 0, 1, 2)
+ self.line1_2 = QtGui.QFrame(MimeTypesDialog_base)
+ self.line1_2.setFrameShape(QtGui.QFrame.HLine)
+ self.line1_2.setFrameShadow(QtGui.QFrame.Sunken)
+ self.line1_2.setObjectName("line1_2")
+ self.gridlayout.addWidget(self.line1_2, 1, 0, 1, 2)
+ self.TypesTableWidget = QtGui.QTableWidget(MimeTypesDialog_base)
+ self.TypesTableWidget.setAlternatingRowColors(True)
+ self.TypesTableWidget.setSelectionMode(QtGui.QAbstractItemView.NoSelection)
+ self.TypesTableWidget.setObjectName("TypesTableWidget")
+ self.TypesTableWidget.setColumnCount(3)
+ self.TypesTableWidget.setRowCount(0)
+ item = QtGui.QTableWidgetItem()
+ self.TypesTableWidget.setHorizontalHeaderItem(0, item)
+ item = QtGui.QTableWidgetItem()
+ self.TypesTableWidget.setHorizontalHeaderItem(1, item)
+ item = QtGui.QTableWidgetItem()
+ self.TypesTableWidget.setHorizontalHeaderItem(2, item)
+ self.gridlayout.addWidget(self.TypesTableWidget, 2, 0, 1, 2)
+ self.textLabel1 = QtGui.QLabel(MimeTypesDialog_base)
+ self.textLabel1.setWordWrap(True)
+ self.textLabel1.setObjectName("textLabel1")
+ self.gridlayout.addWidget(self.textLabel1, 3, 0, 1, 2)
+ spacerItem = QtGui.QSpacerItem(301, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+ self.gridlayout.addItem(spacerItem, 4, 0, 1, 1)
+ self.pushButton10 = QtGui.QPushButton(MimeTypesDialog_base)
+ self.pushButton10.setObjectName("pushButton10")
+ self.gridlayout.addWidget(self.pushButton10, 4, 1, 1, 1)
+
+ self.retranslateUi(MimeTypesDialog_base)
+ QtCore.QObject.connect(self.pushButton10, QtCore.SIGNAL("clicked()"), MimeTypesDialog_base.accept)
+ QtCore.QMetaObject.connectSlotsByName(MimeTypesDialog_base)
+
+ def retranslateUi(self, MimeTypesDialog_base):
+ MimeTypesDialog_base.setWindowTitle(QtGui.QApplication.translate("MimeTypesDialog_base", "HP Device Manager - MIME Types", None, QtGui.QApplication.UnicodeUTF8))
+ self.textLabel3_2.setText(QtGui.QApplication.translate("MimeTypesDialog_base", "<b>File/document types that can be added to the file list.</b>", None, QtGui.QApplication.UnicodeUTF8))
+ self.TypesTableWidget.horizontalHeaderItem(0).setText(QtGui.QApplication.translate("MimeTypesDialog_base", "MIME Type", None, QtGui.QApplication.UnicodeUTF8))
+ self.TypesTableWidget.horizontalHeaderItem(1).setText(QtGui.QApplication.translate("MimeTypesDialog_base", "Description", None, QtGui.QApplication.UnicodeUTF8))
+ self.TypesTableWidget.horizontalHeaderItem(2).setText(QtGui.QApplication.translate("MimeTypesDialog_base", "Usual File Extension(s)", None, QtGui.QApplication.UnicodeUTF8))
+ self.textLabel1.setText(QtGui.QApplication.translate("MimeTypesDialog_base", "<i>Note: To print or fax file/document types that do not appear on this list, print the document from the application that created it through the appropriate CUPS printer.</i>", None, QtGui.QApplication.UnicodeUTF8))
+ self.pushButton10.setText(QtGui.QApplication.translate("MimeTypesDialog_base", "OK", None, QtGui.QApplication.UnicodeUTF8))
+
diff --git a/ui4/mimetypesdialog_base.ui b/ui4/mimetypesdialog_base.ui
new file mode 100644
index 0000000..d1f4823
--- /dev/null
+++ b/ui4/mimetypesdialog_base.ui
@@ -0,0 +1,123 @@
+<ui version="4.0" >
+ <class>MimeTypesDialog_base</class>
+ <widget class="QDialog" name="MimeTypesDialog_base" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>500</width>
+ <height>540</height>
+ </rect>
+ </property>
+ <property name="windowTitle" >
+ <string>HP Device Manager - MIME Types</string>
+ </property>
+ <layout class="QGridLayout" >
+ <item row="0" column="0" colspan="2" >
+ <widget class="QLabel" name="textLabel3_2" >
+ <property name="sizePolicy" >
+ <sizepolicy vsizetype="Preferred" hsizetype="Preferred" >
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string>&lt;b>File/document types that can be added to the file list.&lt;/b></string>
+ </property>
+ <property name="wordWrap" >
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" colspan="2" >
+ <widget class="Line" name="line1_2" >
+ <property name="frameShape" >
+ <enum>QFrame::HLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" colspan="2" >
+ <widget class="QTableWidget" name="TypesTableWidget" >
+ <property name="alternatingRowColors" >
+ <bool>true</bool>
+ </property>
+ <property name="selectionMode" >
+ <enum>QAbstractItemView::NoSelection</enum>
+ </property>
+ <column>
+ <property name="text" >
+ <string>MIME Type</string>
+ </property>
+ </column>
+ <column>
+ <property name="text" >
+ <string>Description</string>
+ </property>
+ </column>
+ <column>
+ <property name="text" >
+ <string>Usual File Extension(s)</string>
+ </property>
+ </column>
+ </widget>
+ </item>
+ <item row="3" column="0" colspan="2" >
+ <widget class="QLabel" name="textLabel1" >
+ <property name="text" >
+ <string>&lt;i>Note: To print or fax file/document types that do not appear on this list, print the document from the application that created it through the appropriate CUPS printer.&lt;/i></string>
+ </property>
+ <property name="wordWrap" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="0" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType" >
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>301</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="4" column="1" >
+ <widget class="QPushButton" name="pushButton10" >
+ <property name="text" >
+ <string>OK</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <layoutdefault spacing="6" margin="11" />
+ <pixmapfunction>qPixmapFromMimeSource</pixmapfunction>
+ <resources/>
+ <connections>
+ <connection>
+ <sender>pushButton10</sender>
+ <signal>clicked()</signal>
+ <receiver>MimeTypesDialog_base</receiver>
+ <slot>accept()</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>20</x>
+ <y>20</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>20</x>
+ <y>20</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>
diff --git a/ui4/nodevicesdialog.py b/ui4/nodevicesdialog.py
new file mode 100644
index 0000000..4114b9a
--- /dev/null
+++ b/ui4/nodevicesdialog.py
@@ -0,0 +1,81 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2001-2008 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Authors: Don Welch
+#
+
+
+# Local
+from base.g import *
+from base import device, utils
+from ui_utils import *
+
+# Qt
+from PyQt4.QtCore import *
+from PyQt4.QtGui import *
+
+# Ui
+from nodevicesdialog_base import Ui_NoDevicesDialog_base
+
+
+class NoDevicesDialog(QDialog, Ui_NoDevicesDialog_base):
+ def __init__(self, parent):
+ QDialog.__init__(self, parent)
+ self.setupUi(self)
+ self.initUi()
+
+
+ def initUi(self):
+ self.connect(self.SetupButton, SIGNAL("clicked()"), self.SetupButton_clicked)
+ self.connect(self.CUPSButton, SIGNAL("clicked()"), self.CUPSButton_clicked)
+ self.connect(self.CloseButton, SIGNAL("clicked()"), self.CloseButton_clicked)
+ self.Icon.setPixmap(load_pixmap("warning", '32x32'))
+
+
+ def SetupButton_clicked(self):
+ self.close()
+
+ if utils.which('hp-setup'):
+ cmd = 'hp-setup -u'
+ else:
+ cmd = 'python ./setup.py -u'
+
+ log.debug(cmd)
+ utils.run(cmd, log_output=True, password_func=None, timeout=1)
+
+ try:
+ self.parent().rescanDevices()
+ except Error:
+ QMessageBox.critical(self,
+ self.windowTitle(),
+ self.__tr("<b>An error occurred.</b><p>Please re-start the Device Manager and try again."),
+ QMessageBox.Ok,
+ QMessageBox.NoButton,
+ QMessageBox.NoButton)
+
+
+ def CUPSButton_clicked(self):
+ self.close()
+ utils.openURL("http://localhost:631/admin")
+
+
+ def CloseButton_clicked(self):
+ self.close()
+
+
+
diff --git a/ui4/nodevicesdialog_base.py b/ui4/nodevicesdialog_base.py
new file mode 100644
index 0000000..2c3ff1f
--- /dev/null
+++ b/ui4/nodevicesdialog_base.py
@@ -0,0 +1,70 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'ui4/nodevicesdialog_base.ui'
+#
+# Created: Mon May 4 14:30:34 2009
+# by: PyQt4 UI code generator 4.4.4
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt4 import QtCore, QtGui
+
+class Ui_NoDevicesDialog_base(object):
+ def setupUi(self, NoDevicesDialog_base):
+ NoDevicesDialog_base.setObjectName("NoDevicesDialog_base")
+ NoDevicesDialog_base.resize(539, 335)
+ self.gridlayout = QtGui.QGridLayout(NoDevicesDialog_base)
+ self.gridlayout.setObjectName("gridlayout")
+ self.Icon = QtGui.QLabel(NoDevicesDialog_base)
+ sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.Icon.sizePolicy().hasHeightForWidth())
+ self.Icon.setSizePolicy(sizePolicy)
+ self.Icon.setFrameShape(QtGui.QFrame.NoFrame)
+ self.Icon.setScaledContents(True)
+ self.Icon.setWordWrap(False)
+ self.Icon.setObjectName("Icon")
+ self.gridlayout.addWidget(self.Icon, 0, 0, 1, 1)
+ spacerItem = QtGui.QSpacerItem(20, 280, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ self.gridlayout.addItem(spacerItem, 1, 0, 1, 1)
+ spacerItem1 = QtGui.QSpacerItem(20, 16, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ self.gridlayout.addItem(spacerItem1, 2, 2, 1, 1)
+ self.textLabel7 = QtGui.QLabel(NoDevicesDialog_base)
+ self.textLabel7.setAlignment(QtCore.Qt.AlignVCenter)
+ self.textLabel7.setWordWrap(True)
+ self.textLabel7.setObjectName("textLabel7")
+ self.gridlayout.addWidget(self.textLabel7, 0, 1, 2, 4)
+ spacerItem2 = QtGui.QSpacerItem(400, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+ self.gridlayout.addItem(spacerItem2, 3, 0, 1, 2)
+ self.SetupButton = QtGui.QPushButton(NoDevicesDialog_base)
+ self.SetupButton.setObjectName("SetupButton")
+ self.gridlayout.addWidget(self.SetupButton, 3, 2, 1, 1)
+ self.CUPSButton = QtGui.QPushButton(NoDevicesDialog_base)
+ self.CUPSButton.setObjectName("CUPSButton")
+ self.gridlayout.addWidget(self.CUPSButton, 3, 3, 1, 1)
+ self.CloseButton = QtGui.QPushButton(NoDevicesDialog_base)
+ self.CloseButton.setDefault(True)
+ self.CloseButton.setObjectName("CloseButton")
+ self.gridlayout.addWidget(self.CloseButton, 3, 4, 1, 1)
+
+ self.retranslateUi(NoDevicesDialog_base)
+ QtCore.QMetaObject.connectSlotsByName(NoDevicesDialog_base)
+
+ def retranslateUi(self, NoDevicesDialog_base):
+ NoDevicesDialog_base.setWindowTitle(QtGui.QApplication.translate("NoDevicesDialog_base", "HP Device Manager - No Installed HP Devices Found", None, QtGui.QApplication.UnicodeUTF8))
+ self.textLabel7.setText(QtGui.QApplication.translate("NoDevicesDialog_base", "<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
+"p, li { white-space: pre-wrap; }\n"
+"</style></head><body style=\" font-family:\'Sans Serif\'; font-size:9pt; font-weight:400; font-style:normal;\">\n"
+"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-size:x-large; font-weight:600;\">No Installed HP Devices Found.</span></p>\n"
+"<p style=\" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">To setup a new device in the HP Device Manager (toolbox), use one of the following methods:</p>\n"
+"<p style=\" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">1.Run <span style=\" font-weight:600;\">hp-setup</span> (in a shell/terminal or click <span style=\" font-family:\'Courier New,courier\';\">Setup Device...</span> below).</p>\n"
+"<p style=\" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">2. <span style=\" font-weight:600;\">CUPS web interface</span> (open a browser to: <span style=\" text-decoration: underline;\">http://localhost:631</span> or press the button below),</p>\n"
+"<p style=\" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">3. The <span style=\" font-weight:600;\">printer installation utility</span> that came with your operating system (YaST, PrinterDrake, etc). </p>\n"
+"<p style=\" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">After setting up a printer, you may have to press <span style=\" font-family:\'Courier New,courier\';\">F6</span> or chose <span style=\" font-family:\'Courier New,courier\';\">Device | Refresh All</span> for the printer to appear in the HP Device Manager.</p>\n"
+"<p style=\" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-weight:600; font-style:italic;\">Note: Only devices installed with the </span><span style=\" font-family:\'Courier New,courier\'; font-weight:600; font-style:italic;\">hp:</span><span style=\" font-weight:600; font-style:italic;\"> or </span><span style=\" font-family:\'Courier New,courier\'; font-weight:600; font-style:italic;\">hpfax:</span><span style=\" font-weight:600; font-style:italic;\"> CUPS backend will appear in the HP Device Manager.</span></p>\n"
+"<p style=\"-qt-paragraph-type:empty; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"></p></body></html>", None, QtGui.QApplication.UnicodeUTF8))
+ self.SetupButton.setText(QtGui.QApplication.translate("NoDevicesDialog_base", "Setup Device...", None, QtGui.QApplication.UnicodeUTF8))
+ self.CUPSButton.setText(QtGui.QApplication.translate("NoDevicesDialog_base", "CUPS Web Interface", None, QtGui.QApplication.UnicodeUTF8))
+ self.CloseButton.setText(QtGui.QApplication.translate("NoDevicesDialog_base", "Close", None, QtGui.QApplication.UnicodeUTF8))
+
diff --git a/ui4/nodevicesdialog_base.ui b/ui4/nodevicesdialog_base.ui
new file mode 100644
index 0000000..b4d41e5
--- /dev/null
+++ b/ui4/nodevicesdialog_base.ui
@@ -0,0 +1,136 @@
+<ui version="4.0" >
+ <class>NoDevicesDialog_base</class>
+ <widget class="QDialog" name="NoDevicesDialog_base" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>539</width>
+ <height>335</height>
+ </rect>
+ </property>
+ <property name="windowTitle" >
+ <string>HP Device Manager - No Installed HP Devices Found</string>
+ </property>
+ <layout class="QGridLayout" >
+ <item row="0" column="0" >
+ <widget class="QLabel" name="Icon" >
+ <property name="sizePolicy" >
+ <sizepolicy vsizetype="Fixed" hsizetype="Fixed" >
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="scaledContents" >
+ <bool>true</bool>
+ </property>
+ <property name="wordWrap" >
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeType" >
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>20</width>
+ <height>280</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="2" column="2" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeType" >
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>20</width>
+ <height>16</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item rowspan="2" row="0" column="1" colspan="4" >
+ <widget class="QLabel" name="textLabel7" >
+ <property name="text" >
+ <string>&lt;html>&lt;head>&lt;meta name="qrichtext" content="1" />&lt;style type="text/css">
+p, li { white-space: pre-wrap; }
+&lt;/style>&lt;/head>&lt;body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;">
+&lt;p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">&lt;span style=" font-size:x-large; font-weight:600;">No Installed HP Devices Found.&lt;/span>&lt;/p>
+&lt;p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">To setup a new device in the HP Device Manager (toolbox), use one of the following methods:&lt;/p>
+&lt;p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">1.Run &lt;span style=" font-weight:600;">hp-setup&lt;/span> (in a shell/terminal or click &lt;span style=" font-family:'Courier New,courier';">Setup Device...&lt;/span> below).&lt;/p>
+&lt;p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">2. &lt;span style=" font-weight:600;">CUPS web interface&lt;/span> (open a browser to: &lt;span style=" text-decoration: underline;">http://localhost:631&lt;/span> or press the button below),&lt;/p>
+&lt;p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">3. The &lt;span style=" font-weight:600;">printer installation utility&lt;/span> that came with your operating system (YaST, PrinterDrake, etc). &lt;/p>
+&lt;p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">After setting up a printer, you may have to press &lt;span style=" font-family:'Courier New,courier';">F6&lt;/span> or chose &lt;span style=" font-family:'Courier New,courier';">Device | Refresh All&lt;/span> for the printer to appear in the HP Device Manager.&lt;/p>
+&lt;p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">&lt;span style=" font-weight:600; font-style:italic;">Note: Only devices installed with the &lt;/span>&lt;span style=" font-family:'Courier New,courier'; font-weight:600; font-style:italic;">hp:&lt;/span>&lt;span style=" font-weight:600; font-style:italic;"> or &lt;/span>&lt;span style=" font-family:'Courier New,courier'; font-weight:600; font-style:italic;">hpfax:&lt;/span>&lt;span style=" font-weight:600; font-style:italic;"> CUPS backend will appear in the HP Device Manager.&lt;/span>&lt;/p>
+&lt;p style="-qt-paragraph-type:empty; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">&lt;/p>&lt;/body>&lt;/html></string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignVCenter</set>
+ </property>
+ <property name="wordWrap" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0" colspan="2" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType" >
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>400</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="3" column="2" >
+ <widget class="QPushButton" name="SetupButton" >
+ <property name="text" >
+ <string>Setup Device...</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="3" >
+ <widget class="QPushButton" name="CUPSButton" >
+ <property name="text" >
+ <string>CUPS Web Interface</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="4" >
+ <widget class="QPushButton" name="CloseButton" >
+ <property name="text" >
+ <string>Close</string>
+ </property>
+ <property name="default" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <layoutdefault spacing="6" margin="11" />
+ <pixmapfunction>qPixmapFromMimeSource</pixmapfunction>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/ui4/plugindiagnose.py b/ui4/plugindiagnose.py
new file mode 100644
index 0000000..7dc2400
--- /dev/null
+++ b/ui4/plugindiagnose.py
@@ -0,0 +1,113 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2001-2011 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Authors: Amarnath Chitumalla
+#
+
+
+# Local
+from base.g import *
+from base import device, utils, pkit
+from prnt import cups
+from base.codes import *
+from ui_utils import *
+from installer.core_install import CoreInstall
+from installer.core_install import PLUGIN_INSTALL_ERROR_NONE, \
+ PLUGIN_INSTALL_ERROR_PLUGIN_FILE_NOT_FOUND, \
+ PLUGIN_INSTALL_ERROR_DIGITAL_SIG_NOT_FOUND, \
+ PLUGIN_INSTALL_ERROR_DIGITAL_SIG_BAD, \
+ PLUGIN_INSTALL_ERROR_PLUGIN_FILE_CHECKSUM_ERROR, \
+ PLUGIN_INSTALL_ERROR_NO_NETWORK, \
+ PLUGIN_INSTALL_ERROR_DIRECTORY_ERROR, \
+ PLUGIN_INSTALL_ERROR_UNABLE_TO_RECV_KEYS
+
+# Qt
+from PyQt4.QtCore import *
+from PyQt4.QtGui import *
+
+# Ui
+from plugindiagnose_base import Ui_Dialog
+
+
+
+class PluginDiagnose(QDialog, Ui_Dialog):
+ def __init__(self, parent, install_mode=PLUGIN_NONE, plugin_reason=PLUGIN_REASON_NONE, upgrade=False):
+ QDialog.__init__(self, parent)
+ self.install_mode = install_mode
+ self.plugin_reason = plugin_reason
+ self.plugin_path = None
+ self.result = False
+ self.core = CoreInstall()
+ self.core.set_plugin_version()
+ self.setupUi(self, upgrade)
+
+ self.user_settings = UserSettings()
+ self.user_settings.load()
+ self.user_settings.debug()
+
+ self.initUi()
+
+
+
+
+ def initUi(self):
+ # connect signals/slots
+ self.connect(self.CancelButton, SIGNAL("clicked()"), self.CancelButton_clicked)
+ self.connect(self.NextButton, SIGNAL("clicked()"), self.NextButton_clicked)
+
+ # Application icon
+ self.setWindowIcon(QIcon(load_pixmap('hp_logo', '128x128')))
+
+
+ def PathLineEdit_textChanged(self, t):
+ self.plugin_path = unicode(t)
+ self.setPathIndicators()
+
+
+ #
+ # Misc
+ #
+
+ def displayPage(self, page):
+ self.updateStepText(page)
+ self.StackedWidget.setCurrentIndex(page)
+
+ def CancelButton_clicked(self):
+ self.close()
+
+
+ def NextButton_clicked(self):
+ self.NextButton.setEnabled(False)
+ self.CancelButton.setEnabled(False)
+ try:
+ plugin = PLUGIN_REQUIRED
+ plugin_reason = PLUGIN_REASON_NONE
+ ok, sudo_ok = pkit.run_plugin_command(plugin == PLUGIN_REQUIRED, plugin_reason)
+
+ if not ok or self.core.check_for_plugin() != PLUGIN_INSTALLED:
+ FailureUI(self, self.__tr("Failed to install Plug-in.\nEither you have chosen to skip the Plug-in installation or entered incorrect Password."))
+
+ finally:
+ endWaitCursor()
+ self.result = True
+ self.close()
+
+
+ def __tr(self,s,c = None):
+ return qApp.translate("PluginDialog",s,c)
+
diff --git a/ui4/plugindiagnose_base.py b/ui4/plugindiagnose_base.py
new file mode 100644
index 0000000..dc79780
--- /dev/null
+++ b/ui4/plugindiagnose_base.py
@@ -0,0 +1,70 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'ui4/plugindialog_base.ui'
+#
+#** Created: Mon Nov 14 15:31:49 2011
+#** by: Qt User Interface Compiler version 4.7.0
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt4 import QtCore, QtGui
+
+class Ui_Dialog(object):
+ def setupUi(self, Dialog, upgrade=False):
+ Dialog.setObjectName("Dialog")
+ Dialog.resize(500, 180)
+ self.upgradePlugin=upgrade
+ self.gridlayout = QtGui.QGridLayout(Dialog)
+ self.gridlayout.setObjectName("gridlayout")
+ self.StackedWidget = QtGui.QStackedWidget(Dialog)
+ self.StackedWidget.setObjectName("StackedWidget")
+ self.page = QtGui.QWidget()
+ self.page.setObjectName("page")
+ self.gridlayout1 = QtGui.QGridLayout(self.page)
+ self.gridlayout1.setObjectName("gridlayout1")
+ self.label = QtGui.QLabel(self.page)
+ font = QtGui.QFont()
+ font.setPointSize(16)
+ self.label.setFont(font)
+ self.label.setObjectName("label")
+ self.gridlayout1.addWidget(self.label, 0, 0, 1, 1)
+ self.line = QtGui.QFrame(self.page)
+ self.line.setFrameShape(QtGui.QFrame.HLine)
+ self.line.setFrameShadow(QtGui.QFrame.Sunken)
+ self.line.setObjectName("line")
+ self.gridlayout1.addWidget(self.line, 1, 0, 1, 2)
+ self.TitleLabel = QtGui.QLabel(self.page)
+ self.TitleLabel.setWordWrap(True)
+ self.TitleLabel.setObjectName("TitleLabel")
+ self.gridlayout1.addWidget(self.TitleLabel, 2, 0, 1, 2)
+ spacerItem = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ spacerItem2 = QtGui.QSpacerItem(278, 51, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ self.gridlayout1.addItem(spacerItem2, 5, 1, 1, 1)
+ self.StackedWidget.addWidget(self.page)
+ self.gridlayout.addWidget(self.StackedWidget, 0, 0, 1, 5)
+ self.line_2 = QtGui.QFrame(Dialog)
+ self.line_2.setFrameShape(QtGui.QFrame.HLine)
+ self.line_2.setFrameShadow(QtGui.QFrame.Sunken)
+ self.line_2.setObjectName("line_2")
+ self.gridlayout.addWidget(self.line_2, 1, 0, 1, 4)
+ self.NextButton = QtGui.QPushButton(Dialog)
+ self.NextButton.setObjectName("NextButton")
+ self.gridlayout.addWidget(self.NextButton, 2, 2, 1, 1)
+ self.CancelButton = QtGui.QPushButton(Dialog)
+ self.CancelButton.setObjectName("CancelButton")
+ self.gridlayout.addWidget(self.CancelButton, 2, 3, 1, 1)
+
+ self.retranslateUi(Dialog)
+ self.StackedWidget.setCurrentIndex(0)
+ QtCore.QMetaObject.connectSlotsByName(Dialog)
+
+ def retranslateUi(self, Dialog):
+ Dialog.setWindowTitle(QtGui.QApplication.translate("Dialog", "HP Device Manager - Plug-in Installer", None, QtGui.QApplication.UnicodeUTF8))
+ self.label.setText(QtGui.QApplication.translate("Dialog", "Driver Plug-in Required", None, QtGui.QApplication.UnicodeUTF8))
+ if self.upgradePlugin is False:
+ self.TitleLabel.setText(QtGui.QApplication.translate("Dialog", "HP Device proprietary plug-in is missing. Click 'Next' to continue plug-in installation.", None, QtGui.QApplication.UnicodeUTF8))
+ else:
+ self.TitleLabel.setText(QtGui.QApplication.translate("Dialog", "HP Device plug-in version mismatch or some files are corrupted.\nClick 'Next' to install required plug-in.", None, QtGui.QApplication.UnicodeUTF8))
+ self.NextButton.setText(QtGui.QApplication.translate("Dialog", "Next >", None, QtGui.QApplication.UnicodeUTF8))
+ self.CancelButton.setText(QtGui.QApplication.translate("Dialog", "Cancel", None, QtGui.QApplication.UnicodeUTF8))
+
diff --git a/ui4/plugindiagnose_base.ui b/ui4/plugindiagnose_base.ui
new file mode 100644
index 0000000..b073c6a
--- /dev/null
+++ b/ui4/plugindiagnose_base.ui
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>Dialog</class>
+ <widget class="QDialog" name="Dialog">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>500</width>
+ <height>180</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>HP Device Manager - Plug-in Installer</string>
+ </property>
+ <layout class="QGridLayout">
+ <item row="0" column="0" colspan="4">
+ <widget class="QStackedWidget" name="StackedWidget">
+ <property name="currentIndex">
+ <number>0</number>
+ </property>
+ <widget class="QWidget" name="page">
+ <layout class="QGridLayout">
+ <item row="0" column="0">
+ <widget class="QLabel" name="label">
+ <property name="font">
+ <font>
+ <pointsize>16</pointsize>
+ </font>
+ </property>
+ <property name="text">
+ <string>Driver Plug-in Installation is required</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" colspan="2">
+ <widget class="Line" name="line">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" colspan="2">
+ <widget class="QLabel" name="TitleLabel">
+ <property name="text">
+ <string>HP Device requires proprietary plug-in which is missing. Click 'Next' to continue plug-in installation</string>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ </item>
+ <item row="1" column="0" colspan="4">
+ <widget class="Line" name="line_2">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="2">
+ <widget class="QPushButton" name="NextButton">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="text">
+ <string>Next &gt;</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="3">
+ <widget class="QPushButton" name="CancelButton">
+ <property name="text">
+ <string>Cancel</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/ui4/plugindialog.py b/ui4/plugindialog.py
new file mode 100644
index 0000000..d0f21ff
--- /dev/null
+++ b/ui4/plugindialog.py
@@ -0,0 +1,378 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2001-2009 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Authors: Don Welch
+#
+
+
+# Local
+from base.g import *
+from base import device, utils
+from prnt import cups
+from base.codes import *
+from ui_utils import *
+from installer.core_install import CoreInstall
+from installer.core_install import PLUGIN_INSTALL_ERROR_NONE, \
+ PLUGIN_INSTALL_ERROR_PLUGIN_FILE_NOT_FOUND, \
+ PLUGIN_INSTALL_ERROR_DIGITAL_SIG_NOT_FOUND, \
+ PLUGIN_INSTALL_ERROR_DIGITAL_SIG_BAD, \
+ PLUGIN_INSTALL_ERROR_PLUGIN_FILE_CHECKSUM_ERROR, \
+ PLUGIN_INSTALL_ERROR_NO_NETWORK, \
+ PLUGIN_INSTALL_ERROR_DIRECTORY_ERROR, \
+ PLUGIN_INSTALL_ERROR_UNABLE_TO_RECV_KEYS
+
+# Qt
+from PyQt4.QtCore import *
+from PyQt4.QtGui import *
+
+# Ui
+from plugindialog_base import Ui_Dialog
+
+
+PAGE_SOURCE = 0
+# PAGE_LICENSE = 1 # part of plug-in itself, this is a placeholder
+PAGE_MAX = 1
+
+
+
+class PluginDialog(QDialog, Ui_Dialog):
+ def __init__(self, parent, install_mode=PLUGIN_NONE, plugin_reason=PLUGIN_REASON_NONE):
+ QDialog.__init__(self, parent)
+ self.install_mode = install_mode
+ self.plugin_reason = plugin_reason
+ self.plugin_path = None
+ self.result = False
+ self.core = CoreInstall()
+ self.core.set_plugin_version()
+ self.setupUi(self)
+
+ self.user_settings = UserSettings()
+ self.user_settings.load()
+ self.user_settings.debug()
+
+ self.initUi()
+
+ QTimer.singleShot(0, self.showSourcePage)
+
+
+ def isPluginInstalled(self):
+ return self.core.check_for_plugin()
+
+
+ def initUi(self):
+ # connect signals/slots
+ self.connect(self.CancelButton, SIGNAL("clicked()"), self.CancelButton_clicked)
+ self.connect(self.NextButton, SIGNAL("clicked()"), self.NextButton_clicked)
+
+ # Application icon
+ self.setWindowIcon(QIcon(load_pixmap('hp_logo', '128x128')))
+
+ self.PLUGIN_REASON_TEXT = {
+ PLUGIN_REASON_NONE: None,
+ PLUGIN_REASON_PRINTING_SUPPORT: self.__tr("This plugin will enable printing support."),
+ PLUGIN_REASON_FASTER_PRINTING: self.__tr("This plugin will enhance print speed."),
+ PLUGIN_REASON_BETTER_PRINTING_PQ: self.__tr("This plugin will enhance print quality."),
+ PLUGIN_REASON_PRINTING_FEATURES: self.__tr("This plugin will add printing features."),
+ PLUGIN_REASON_RESERVED_10: None,
+ PLUGIN_REASON_RESERVED_20: None,
+ PLUGIN_REASON_SCANNING_SUPPORT: self.__tr("This plugin will enable scanning support."),
+ PLUGIN_REASON_FASTER_SCANNING: self.__tr("This plugin will enhance scanning speed."),
+ PLUGIN_REASON_BETTER_SCANNING_IQ: self.__tr("This plugin will enhance scanning image quality."),
+ PLUGIN_REASON_RESERVED_200: None,
+ PLUGIN_REASON_RESERVED_400: None,
+ PLUGIN_REASON_FAXING_SUPPORT: self.__tr("This plugin will enable faxing support."),
+ PLUGIN_REASON_FAX_FEATURES: self.__tr("This plugin will enhnace faxing features."),
+ PLUGIN_REASON_RESERVED_20000: None,
+ PLUGIN_REASON_RESERVED_40000: None,
+ }
+
+ #
+ # SOURCE PAGE
+ #
+ def showSourcePage(self):
+ reason_text = self.plugin_reason_text()
+
+ if reason_text is not None:
+ if self.install_mode == PLUGIN_REQUIRED:
+ self.TitleLabel.setText(self.__tr("An additional driver plug-in is required to operate this printer. You may download the plug-in directly from an HP authorized server (recommended), or, if you already have a copy of the file, you can specify a path to the file (advanced). <br><br>%1").arg(reason_text))
+ self.SkipRadioButton.setEnabled(False)
+
+ elif self.install_mode == PLUGIN_OPTIONAL:
+ self.TitleLabel.setText(self.__tr("An optional driver plug-in is available to enhance the operation of this printer. You may download the plug-in directly from an HP authorized server (recommended), skip this installation (not recommended), or, if you already have a copy of the file, you can specify a path to the file (advanced).<br><br>%1").arg(reason_text))
+
+ self.connect(self.DownloadRadioButton, SIGNAL("toggled(bool)"), self.DownloadRadioButton_toggled)
+ self.connect(self.CopyRadioButton, SIGNAL("toggled(bool)"), self.CopyRadioButton_toggled)
+ self.connect(self.SkipRadioButton, SIGNAL("toggled(bool)"), self.SkipRadioButton_toggled)
+ self.connect(self.PathLineEdit, SIGNAL("textChanged(const QString &)"), self.PathLineEdit_textChanged)
+ self.connect(self.BrowseToolButton, SIGNAL("clicked()"), self.BrowseToolButton_clicked)
+
+ self.BrowseToolButton.setIcon(QIcon(load_pixmap('folder_open', '16x16')))
+
+ self.displayPage(PAGE_SOURCE)
+
+
+ def DownloadRadioButton_toggled(self, b):
+ if b:
+ self.PathLineEdit.setEnabled(False)
+ self.BrowseToolButton.setEnabled(False)
+ self.NextButton.setEnabled(True)
+ try:
+ self.PathLineEdit.setStyleSheet("")
+ except AttributeError:
+ pass
+ self.plugin_path = None
+
+
+ def CopyRadioButton_toggled(self, b):
+ if b:
+ self.PathLineEdit.setEnabled(True)
+ self.BrowseToolButton.setEnabled(True)
+ self.plugin_path = unicode(self.PathLineEdit.text())
+ self.setPathIndicators()
+
+
+ def SkipRadioButton_toggled(self, b):
+ if b:
+ self.PathLineEdit.setEnabled(False)
+ self.BrowseToolButton.setEnabled(False)
+ self.NextButton.setEnabled(True)
+ try:
+ self.PathLineEdit.setStyleSheet("")
+ except AttributeError:
+ pass
+ self.plugin_path = None
+
+
+ def PathLineEdit_textChanged(self, t):
+ self.plugin_path = unicode(t)
+ self.setPathIndicators()
+
+
+ def setPathIndicators(self):
+ ok = True
+ if not self.plugin_path or (self.plugin_path and os.path.isdir(self.plugin_path)):
+ self.PathLineEdit.setToolTip(self.__tr("You must specify a path to the '%1' file.").arg(self.core.plugin_name))
+ ok = False
+ elif os.path.basename(self.plugin_path) != self.core.plugin_name:
+ self.PathLineEdit.setToolTip(self.__tr("The plugin filename must be '%1'.").arg(self.core.plugin_name))
+ ok = False
+
+ if not ok:
+ try:
+ self.PathLineEdit.setStyleSheet("background-color: yellow; ")
+ except AttributeError:
+ pass
+ self.NextButton.setEnabled(False)
+ else:
+ try:
+ self.PathLineEdit.setStyleSheet("")
+ except AttributeError:
+ pass
+ self.NextButton.setEnabled(True)
+ self.PathLineEdit.setToolTip(QString(""))
+
+
+ def BrowseToolButton_clicked(self):
+ t = unicode(self.PathLineEdit.text())
+
+ if not os.path.exists(t):
+ path = unicode(QFileDialog.getOpenFileName(self, self.__tr("Select Plug-in File"),
+ #user_conf.workingDirectory(),
+ self.user_settings.working_dir,
+ self.__tr("Plugin Files (*.run)")))
+
+ if path:
+ self.plugin_path = path
+ self.PathLineEdit.setText(self.plugin_path)
+ #user_conf.setWorkingDirectory(self.plugin_path)
+ self.user_settings.working_dir = self.plugin_path
+ self.user_settings.save()
+
+ self.setPathIndicators()
+
+ #
+ # Misc
+ #
+
+ def displayPage(self, page):
+ self.updateStepText(page)
+ self.StackedWidget.setCurrentIndex(page)
+
+
+ def CancelButton_clicked(self):
+ self.close()
+
+
+ def NextButton_clicked(self):
+ if self.SkipRadioButton.isChecked():
+ log.debug("Skipping plug-in installation.")
+ self.close()
+ return
+
+ beginWaitCursor()
+ try:
+
+ if self.plugin_path is None: # download
+ # read plugin.conf (local or on sf.net) to get plugin_path (http://)
+ plugin_conf_url = self.core.get_plugin_conf_url()
+
+ if plugin_conf_url.startswith('file://'):
+ pass
+ else:
+ log.info("Checking for network connection...")
+ ok = self.core.check_network_connection()
+
+ if not ok:
+ log.error("Network connection not detected.")
+ endWaitCursor()
+ FailureUI(self, self.__tr("Network connection not detected."))
+ self.close()
+ return
+
+ log.info("Downloading configuration file from: %s" % plugin_conf_url)
+ self.plugin_path, size, checksum, timestamp, ok = self.core.get_plugin_info(plugin_conf_url,
+ self.plugin_download_callback)
+
+ log.debug("path=%s, size=%d, checksum=%s, timestamp=%f, ok=%s" %
+ (self.plugin_path, size, checksum, timestamp, ok))
+
+ if not self.plugin_path.startswith('http://') and not self.plugin_path.startswith('file://'):
+ self.plugin_path = 'file://' + self.plugin_path
+
+ else: # path
+ if not self.plugin_path.startswith('http://'):
+ self.plugin_path = 'file://' + self.plugin_path
+
+ size, checksum, timestamp = 0, '', 0
+
+ if self.plugin_path.startswith('file://'):
+ pass
+ else:
+ log.info("Checking for network connection...")
+ ok = self.core.check_network_connection()
+
+ if not ok:
+ log.error("Network connection not detected.")
+ endWaitCursor()
+ FailureUI(self, self.__tr("Network connection not detected."))
+ self.close()
+ return
+
+ log.info("Downloading plug-in from: %s" % self.plugin_path)
+
+ status, ret = self.core.download_plugin(self.plugin_path, size, checksum, timestamp,
+ self.plugin_download_callback)
+
+ if status in (PLUGIN_INSTALL_ERROR_UNABLE_TO_RECV_KEYS, PLUGIN_INSTALL_ERROR_DIGITAL_SIG_NOT_FOUND):
+ endWaitCursor()
+ if QMessageBox.question(self, self.__tr("Digital signature download failed"),
+ self.__tr("<b>The download of the digital signature file failed.</b><p>Without this file, it is not possible to authenticate and validate the plug-in prior to installation.</p>Do you still want to install the plug-in?"),
+ QMessageBox.Yes | QMessageBox.No) != QMessageBox.Yes:
+
+ self.core.delete_plugin()
+ self.close()
+ return
+
+ elif status != PLUGIN_INSTALL_ERROR_NONE:
+
+ if status == PLUGIN_INSTALL_ERROR_PLUGIN_FILE_NOT_FOUND:
+ desc = self.__tr("<b>ERROR: Plug-in file not found (server returned 404 or similar error).</b><p>Error code: %1</p>").arg(str(ret))
+
+ elif status == PLUGIN_INSTALL_ERROR_DIGITAL_SIG_BAD:
+ desc = self.__tr("<b>ERROR: Plug-in file does not match its digital signature.</b><p>File may have been corrupted or altered.</p><p>Error code: %1</p>").arg(str(ret))
+
+ elif status == PLUGIN_INSTALL_ERROR_PLUGIN_FILE_CHECKSUM_ERROR:
+ desc = self.__tr("<b>ERROR: Plug-in file does not match its checksum. File may have been corrupted or altered.")
+
+ elif status == PLUGIN_INSTALL_ERROR_NO_NETWORK:
+ desc = self.__tr("<b>ERROR: Unable to connect to network to download the plug-in.</b><p>Please check your network connection and try again.</p>")
+
+ elif status == PLUGIN_INSTALL_ERROR_DIRECTORY_ERROR:
+ desc = self.__tr("<b>ERROR: Unable to create the plug-in directory.</b><p>Please check your permissions and try again.</p>")
+
+ self.core.delete_plugin()
+ endWaitCursor()
+ FailureUI(self, desc)
+ self.close()
+ return
+
+ if not self.core.run_plugin(GUI_MODE, self.plugin_install_callback):
+ self.core.delete_plugin()
+ endWaitCursor()
+ FailureUI(self, self.__tr("Plug-in install failed."))
+ self.close()
+ return
+
+ cups_devices = device.getSupportedCUPSDevices(['hp'])
+ for dev in cups_devices:
+ mq = device.queryModelByURI(dev)
+
+ if mq.get('fw-download', False):
+ # Download firmware if needed
+ log.info(log.bold("\nDownloading firmware to device %s..." % dev))
+ try:
+ d = None
+ try:
+ d = device.Device(dev)
+ except Error:
+ log.error("Error opening device.")
+ endWaitCursor()
+ FailureUI(self, self.__tr("<b>Firmware download to device failed.</b><p>%1</p>").arg(dev))
+ continue
+
+ if d.downloadFirmware():
+ log.info("Firmware download successful.\n")
+ else:
+ endWaitCursor()
+ FailureUI(self, self.__tr("<b>Firmware download to device failed.</b><p>%1</p>").arg(dev))
+
+ finally:
+ if d is not None:
+ d.close()
+ finally:
+ endWaitCursor()
+
+ self.core.delete_plugin()
+ SuccessUI(self, self.__tr("<b>Plug-in installation successful.</b>"))
+ self.result = True
+ self.close()
+
+
+ def plugin_download_callback(self, c, s, t):
+ pass
+
+
+ def plugin_install_callback(self, s):
+ print s
+
+
+ def updateStepText(self, p):
+ self.StepText.setText(self.__tr("Step %1 of %2").arg(p+1).arg(PAGE_MAX+1))
+
+
+ def plugin_reason_text(self):
+ try:
+ return self.PLUGIN_REASON_TEXT[self.plugin_reason]
+ except KeyError:
+ return None
+
+
+ def __tr(self,s,c = None):
+ return qApp.translate("PluginDialog",s,c)
+
+
diff --git a/ui4/plugindialog_base.py b/ui4/plugindialog_base.py
new file mode 100644
index 0000000..b93061c
--- /dev/null
+++ b/ui4/plugindialog_base.py
@@ -0,0 +1,117 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'ui4/plugindialog_base.ui'
+#
+# Created: Mon May 4 14:30:34 2009
+# by: PyQt4 UI code generator 4.4.4
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt4 import QtCore, QtGui
+
+class Ui_Dialog(object):
+ def setupUi(self, Dialog):
+ Dialog.setObjectName("Dialog")
+ Dialog.resize(700, 500)
+ self.gridlayout = QtGui.QGridLayout(Dialog)
+ self.gridlayout.setObjectName("gridlayout")
+ self.StackedWidget = QtGui.QStackedWidget(Dialog)
+ self.StackedWidget.setObjectName("StackedWidget")
+ self.page = QtGui.QWidget()
+ self.page.setObjectName("page")
+ self.gridlayout1 = QtGui.QGridLayout(self.page)
+ self.gridlayout1.setObjectName("gridlayout1")
+ self.label = QtGui.QLabel(self.page)
+ font = QtGui.QFont()
+ font.setPointSize(16)
+ self.label.setFont(font)
+ self.label.setObjectName("label")
+ self.gridlayout1.addWidget(self.label, 0, 0, 1, 1)
+ self.line = QtGui.QFrame(self.page)
+ self.line.setFrameShape(QtGui.QFrame.HLine)
+ self.line.setFrameShadow(QtGui.QFrame.Sunken)
+ self.line.setObjectName("line")
+ self.gridlayout1.addWidget(self.line, 1, 0, 1, 2)
+ self.TitleLabel = QtGui.QLabel(self.page)
+ self.TitleLabel.setWordWrap(True)
+ self.TitleLabel.setObjectName("TitleLabel")
+ self.gridlayout1.addWidget(self.TitleLabel, 2, 0, 1, 2)
+ spacerItem = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ self.gridlayout1.addItem(spacerItem, 3, 0, 1, 1)
+ self.groupBox = QtGui.QGroupBox(self.page)
+ self.groupBox.setObjectName("groupBox")
+ self.gridlayout2 = QtGui.QGridLayout(self.groupBox)
+ self.gridlayout2.setObjectName("gridlayout2")
+ self.DownloadRadioButton = QtGui.QRadioButton(self.groupBox)
+ self.DownloadRadioButton.setChecked(True)
+ self.DownloadRadioButton.setObjectName("DownloadRadioButton")
+ self.gridlayout2.addWidget(self.DownloadRadioButton, 0, 0, 1, 2)
+ self.CopyRadioButton = QtGui.QRadioButton(self.groupBox)
+ self.CopyRadioButton.setEnabled(True)
+ self.CopyRadioButton.setObjectName("CopyRadioButton")
+ self.gridlayout2.addWidget(self.CopyRadioButton, 1, 0, 1, 2)
+ spacerItem1 = QtGui.QSpacerItem(20, 20, QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Minimum)
+ self.gridlayout2.addItem(spacerItem1, 2, 0, 1, 1)
+ self.hboxlayout = QtGui.QHBoxLayout()
+ self.hboxlayout.setObjectName("hboxlayout")
+ self.PathLineEdit = QtGui.QLineEdit(self.groupBox)
+ self.PathLineEdit.setEnabled(False)
+ sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.MinimumExpanding, QtGui.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.PathLineEdit.sizePolicy().hasHeightForWidth())
+ self.PathLineEdit.setSizePolicy(sizePolicy)
+ self.PathLineEdit.setObjectName("PathLineEdit")
+ self.hboxlayout.addWidget(self.PathLineEdit)
+ self.BrowseToolButton = QtGui.QToolButton(self.groupBox)
+ self.BrowseToolButton.setEnabled(False)
+ self.BrowseToolButton.setObjectName("BrowseToolButton")
+ self.hboxlayout.addWidget(self.BrowseToolButton)
+ self.gridlayout2.addLayout(self.hboxlayout, 2, 1, 1, 1)
+ self.SkipRadioButton = QtGui.QRadioButton(self.groupBox)
+ self.SkipRadioButton.setObjectName("SkipRadioButton")
+ self.gridlayout2.addWidget(self.SkipRadioButton, 3, 0, 1, 2)
+ self.gridlayout1.addWidget(self.groupBox, 4, 0, 1, 2)
+ spacerItem2 = QtGui.QSpacerItem(278, 51, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ self.gridlayout1.addItem(spacerItem2, 5, 1, 1, 1)
+ self.StackedWidget.addWidget(self.page)
+ self.gridlayout.addWidget(self.StackedWidget, 0, 0, 1, 5)
+ self.line_2 = QtGui.QFrame(Dialog)
+ self.line_2.setFrameShape(QtGui.QFrame.HLine)
+ self.line_2.setFrameShadow(QtGui.QFrame.Sunken)
+ self.line_2.setObjectName("line_2")
+ self.gridlayout.addWidget(self.line_2, 1, 0, 1, 5)
+ self.StepText = QtGui.QLabel(Dialog)
+ self.StepText.setObjectName("StepText")
+ self.gridlayout.addWidget(self.StepText, 2, 0, 1, 1)
+ spacerItem3 = QtGui.QSpacerItem(161, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+ self.gridlayout.addItem(spacerItem3, 2, 1, 1, 1)
+ self.BackButton = QtGui.QPushButton(Dialog)
+ self.BackButton.setEnabled(False)
+ self.BackButton.setObjectName("BackButton")
+ self.gridlayout.addWidget(self.BackButton, 2, 2, 1, 1)
+ self.NextButton = QtGui.QPushButton(Dialog)
+ self.NextButton.setObjectName("NextButton")
+ self.gridlayout.addWidget(self.NextButton, 2, 3, 1, 1)
+ self.CancelButton = QtGui.QPushButton(Dialog)
+ self.CancelButton.setObjectName("CancelButton")
+ self.gridlayout.addWidget(self.CancelButton, 2, 4, 1, 1)
+
+ self.retranslateUi(Dialog)
+ self.StackedWidget.setCurrentIndex(0)
+ QtCore.QMetaObject.connectSlotsByName(Dialog)
+
+ def retranslateUi(self, Dialog):
+ Dialog.setWindowTitle(QtGui.QApplication.translate("Dialog", "HP Device Manager - Plug-in Installer", None, QtGui.QApplication.UnicodeUTF8))
+ self.label.setText(QtGui.QApplication.translate("Dialog", "Driver Plug-in Installation", None, QtGui.QApplication.UnicodeUTF8))
+ self.TitleLabel.setText(QtGui.QApplication.translate("Dialog", "You may download the plug-in directly from an HP authorized server, or, if you already have a local copy of the plug-in file, you can specify a path to the file.", None, QtGui.QApplication.UnicodeUTF8))
+ self.groupBox.setTitle(QtGui.QApplication.translate("Dialog", "Plug-in Installation Choice", None, QtGui.QApplication.UnicodeUTF8))
+ self.DownloadRadioButton.setText(QtGui.QApplication.translate("Dialog", "Download and install the plug-in from an HP authorized server (recommended)", None, QtGui.QApplication.UnicodeUTF8))
+ self.CopyRadioButton.setText(QtGui.QApplication.translate("Dialog", "Select and install an existing local copy of the plug-in file (advanced):", None, QtGui.QApplication.UnicodeUTF8))
+ self.BrowseToolButton.setToolTip(QtGui.QApplication.translate("Dialog", "Open a local copy of the plug-in file", None, QtGui.QApplication.UnicodeUTF8))
+ self.SkipRadioButton.setText(QtGui.QApplication.translate("Dialog", "Skip installation of the plug-in (not recommended)", None, QtGui.QApplication.UnicodeUTF8))
+ self.StepText.setText(QtGui.QApplication.translate("Dialog", "Step %d of %d", None, QtGui.QApplication.UnicodeUTF8))
+ self.BackButton.setText(QtGui.QApplication.translate("Dialog", "< Back", None, QtGui.QApplication.UnicodeUTF8))
+ self.NextButton.setText(QtGui.QApplication.translate("Dialog", "Next >", None, QtGui.QApplication.UnicodeUTF8))
+ self.CancelButton.setText(QtGui.QApplication.translate("Dialog", "Cancel", None, QtGui.QApplication.UnicodeUTF8))
+
diff --git a/ui4/plugindialog_base.ui b/ui4/plugindialog_base.ui
new file mode 100644
index 0000000..a7cc8f1
--- /dev/null
+++ b/ui4/plugindialog_base.ui
@@ -0,0 +1,219 @@
+<ui version="4.0" >
+ <class>Dialog</class>
+ <widget class="QDialog" name="Dialog" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>700</width>
+ <height>500</height>
+ </rect>
+ </property>
+ <property name="windowTitle" >
+ <string>HP Device Manager - Plug-in Installer</string>
+ </property>
+ <layout class="QGridLayout" >
+ <item row="0" column="0" colspan="5" >
+ <widget class="QStackedWidget" name="StackedWidget" >
+ <property name="currentIndex" >
+ <number>0</number>
+ </property>
+ <widget class="QWidget" name="page" >
+ <layout class="QGridLayout" >
+ <item row="0" column="0" >
+ <widget class="QLabel" name="label" >
+ <property name="font" >
+ <font>
+ <pointsize>16</pointsize>
+ </font>
+ </property>
+ <property name="text" >
+ <string>Driver Plug-in Installation</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" colspan="2" >
+ <widget class="Line" name="line" >
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" colspan="2" >
+ <widget class="QLabel" name="TitleLabel" >
+ <property name="text" >
+ <string>You may download the plug-in directly from an HP authorized server, or, if you already have a local copy of the plug-in file, you can specify a path to the file.</string>
+ </property>
+ <property name="wordWrap" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="4" column="0" colspan="2" >
+ <widget class="QGroupBox" name="groupBox" >
+ <property name="title" >
+ <string>Plug-in Installation Choice</string>
+ </property>
+ <layout class="QGridLayout" >
+ <item row="0" column="0" colspan="2" >
+ <widget class="QRadioButton" name="DownloadRadioButton" >
+ <property name="text" >
+ <string>Download and install the plug-in from an HP authorized server (recommended)</string>
+ </property>
+ <property name="checked" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" colspan="2" >
+ <widget class="QRadioButton" name="CopyRadioButton" >
+ <property name="enabled" >
+ <bool>true</bool>
+ </property>
+ <property name="text" >
+ <string>Select and install an existing local copy of the plug-in file (advanced):</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType" >
+ <enum>QSizePolicy::Preferred</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="2" column="1" >
+ <layout class="QHBoxLayout" >
+ <item>
+ <widget class="QLineEdit" name="PathLineEdit" >
+ <property name="enabled" >
+ <bool>false</bool>
+ </property>
+ <property name="sizePolicy" >
+ <sizepolicy vsizetype="Fixed" hsizetype="MinimumExpanding" >
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="BrowseToolButton" >
+ <property name="enabled" >
+ <bool>false</bool>
+ </property>
+ <property name="toolTip" >
+ <string>Open a local copy of the plug-in file</string>
+ </property>
+ <property name="text" >
+ <string/>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="3" column="0" colspan="2" >
+ <widget class="QRadioButton" name="SkipRadioButton" >
+ <property name="text" >
+ <string>Skip installation of the plug-in (not recommended)</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="5" column="1" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>278</width>
+ <height>51</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ </item>
+ <item row="1" column="0" colspan="5" >
+ <widget class="Line" name="line_2" >
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" >
+ <widget class="QLabel" name="StepText" >
+ <property name="text" >
+ <string>Step %d of %d</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>161</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="2" column="2" >
+ <widget class="QPushButton" name="BackButton" >
+ <property name="enabled" >
+ <bool>false</bool>
+ </property>
+ <property name="text" >
+ <string>&lt; Back</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="3" >
+ <widget class="QPushButton" name="NextButton" >
+ <property name="text" >
+ <string>Next ></string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="4" >
+ <widget class="QPushButton" name="CancelButton" >
+ <property name="text" >
+ <string>Cancel</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/ui4/pluginlicensedialog.py b/ui4/pluginlicensedialog.py
new file mode 100644
index 0000000..8cb5dc0
--- /dev/null
+++ b/ui4/pluginlicensedialog.py
@@ -0,0 +1,50 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2001-2008 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Authors: Don Welch
+#
+
+
+# Local
+from base.g import *
+from ui_utils import *
+
+# Qt
+from PyQt4.QtCore import *
+from PyQt4.QtGui import *
+
+# Ui
+from pluginlicensedialog_base import Ui_Dialog
+
+
+
+class PluginLicenseDialog(QDialog, Ui_Dialog):
+ def __init__(self, parent, license_txt):
+ QDialog.__init__(self, parent)
+ self.setupUi(self)
+ self.license_txt = license_txt
+ self.initUi()
+
+
+ def initUi(self):
+ # Application icon
+ self.setWindowIcon(QIcon(load_pixmap('hp_logo', '128x128')))
+
+ self.LicenseTextEdit.setText(self.license_txt)
+
+
diff --git a/ui4/pluginlicensedialog_base.py b/ui4/pluginlicensedialog_base.py
new file mode 100644
index 0000000..a7ffef6
--- /dev/null
+++ b/ui4/pluginlicensedialog_base.py
@@ -0,0 +1,87 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'ui4/pluginlicensedialog_base.ui'
+#
+# Created: Mon May 4 14:30:35 2009
+# by: PyQt4 UI code generator 4.4.4
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt4 import QtCore, QtGui
+
+class Ui_Dialog(object):
+ def setupUi(self, Dialog):
+ Dialog.setObjectName("Dialog")
+ Dialog.resize(700, 500)
+ self.gridlayout = QtGui.QGridLayout(Dialog)
+ self.gridlayout.setObjectName("gridlayout")
+ self.StackedWidget = QtGui.QStackedWidget(Dialog)
+ self.StackedWidget.setObjectName("StackedWidget")
+ self.page = QtGui.QWidget()
+ self.page.setObjectName("page")
+ self.gridlayout1 = QtGui.QGridLayout(self.page)
+ self.gridlayout1.setObjectName("gridlayout1")
+ self.label = QtGui.QLabel(self.page)
+ font = QtGui.QFont()
+ font.setPointSize(16)
+ self.label.setFont(font)
+ self.label.setObjectName("label")
+ self.gridlayout1.addWidget(self.label, 0, 0, 1, 1)
+ self.line = QtGui.QFrame(self.page)
+ self.line.setFrameShape(QtGui.QFrame.HLine)
+ self.line.setFrameShadow(QtGui.QFrame.Sunken)
+ self.line.setObjectName("line")
+ self.gridlayout1.addWidget(self.line, 1, 0, 1, 1)
+ self.label_2 = QtGui.QLabel(self.page)
+ self.label_2.setWordWrap(True)
+ self.label_2.setObjectName("label_2")
+ self.gridlayout1.addWidget(self.label_2, 2, 0, 1, 1)
+ self.LicenseTextEdit = QtGui.QTextEdit(self.page)
+ self.LicenseTextEdit.setAutoFormatting(QtGui.QTextEdit.AutoAll)
+ self.LicenseTextEdit.setReadOnly(True)
+ self.LicenseTextEdit.setTextInteractionFlags(QtCore.Qt.NoTextInteraction)
+ self.LicenseTextEdit.setObjectName("LicenseTextEdit")
+ self.gridlayout1.addWidget(self.LicenseTextEdit, 3, 0, 1, 1)
+ self.AgreeCheckBox = QtGui.QCheckBox(self.page)
+ self.AgreeCheckBox.setObjectName("AgreeCheckBox")
+ self.gridlayout1.addWidget(self.AgreeCheckBox, 4, 0, 1, 1)
+ self.StackedWidget.addWidget(self.page)
+ self.gridlayout.addWidget(self.StackedWidget, 0, 0, 1, 5)
+ self.line_2 = QtGui.QFrame(Dialog)
+ self.line_2.setFrameShape(QtGui.QFrame.HLine)
+ self.line_2.setFrameShadow(QtGui.QFrame.Sunken)
+ self.line_2.setObjectName("line_2")
+ self.gridlayout.addWidget(self.line_2, 1, 0, 1, 5)
+ spacerItem = QtGui.QSpacerItem(161, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+ self.gridlayout.addItem(spacerItem, 2, 1, 1, 1)
+ self.BackButton = QtGui.QPushButton(Dialog)
+ self.BackButton.setEnabled(False)
+ self.BackButton.setObjectName("BackButton")
+ self.gridlayout.addWidget(self.BackButton, 2, 2, 1, 1)
+ self.NextButton = QtGui.QPushButton(Dialog)
+ self.NextButton.setEnabled(False)
+ self.NextButton.setObjectName("NextButton")
+ self.gridlayout.addWidget(self.NextButton, 2, 3, 1, 1)
+ self.CancelButton = QtGui.QPushButton(Dialog)
+ self.CancelButton.setObjectName("CancelButton")
+ self.gridlayout.addWidget(self.CancelButton, 2, 4, 1, 1)
+
+ self.retranslateUi(Dialog)
+ self.StackedWidget.setCurrentIndex(0)
+ QtCore.QObject.connect(self.AgreeCheckBox, QtCore.SIGNAL("toggled(bool)"), self.NextButton.setEnabled)
+ QtCore.QObject.connect(self.NextButton, QtCore.SIGNAL("clicked()"), Dialog.accept)
+ QtCore.QObject.connect(self.CancelButton, QtCore.SIGNAL("clicked()"), Dialog.reject)
+ QtCore.QMetaObject.connectSlotsByName(Dialog)
+
+ def retranslateUi(self, Dialog):
+ Dialog.setWindowTitle(QtGui.QApplication.translate("Dialog", "HP Device Manager - Plug-in Installer", None, QtGui.QApplication.UnicodeUTF8))
+ self.label.setText(QtGui.QApplication.translate("Dialog", "Driver Plug-in License Agreement", None, QtGui.QApplication.UnicodeUTF8))
+ self.label_2.setText(QtGui.QApplication.translate("Dialog", "<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
+"p, li { white-space: pre-wrap; }\n"
+"</style></head><body style=\" font-family:\'Sans Serif\'; font-size:9pt; font-weight:400; font-style:normal;\">\n"
+"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">Please read the driver plug-in license agreement and then check the <span style=\" font-style:italic;\">I agree</span> box and then click <span style=\" font-style:italic;\">Next</span> to continue.</p></body></html>", None, QtGui.QApplication.UnicodeUTF8))
+ self.AgreeCheckBox.setText(QtGui.QApplication.translate("Dialog", "I agree to the terms of the driver plug-in license agreement", None, QtGui.QApplication.UnicodeUTF8))
+ self.BackButton.setText(QtGui.QApplication.translate("Dialog", "< Back", None, QtGui.QApplication.UnicodeUTF8))
+ self.NextButton.setText(QtGui.QApplication.translate("Dialog", "Next >", None, QtGui.QApplication.UnicodeUTF8))
+ self.CancelButton.setText(QtGui.QApplication.translate("Dialog", "Cancel", None, QtGui.QApplication.UnicodeUTF8))
+
diff --git a/ui4/pluginlicensedialog_base.ui b/ui4/pluginlicensedialog_base.ui
new file mode 100644
index 0000000..0807b8d
--- /dev/null
+++ b/ui4/pluginlicensedialog_base.ui
@@ -0,0 +1,179 @@
+<ui version="4.0" >
+ <class>Dialog</class>
+ <widget class="QDialog" name="Dialog" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>700</width>
+ <height>500</height>
+ </rect>
+ </property>
+ <property name="windowTitle" >
+ <string>HP Device Manager - Plug-in Installer</string>
+ </property>
+ <layout class="QGridLayout" >
+ <item row="0" column="0" colspan="5" >
+ <widget class="QStackedWidget" name="StackedWidget" >
+ <property name="currentIndex" >
+ <number>0</number>
+ </property>
+ <widget class="QWidget" name="page" >
+ <layout class="QGridLayout" >
+ <item row="0" column="0" >
+ <widget class="QLabel" name="label" >
+ <property name="font" >
+ <font>
+ <pointsize>16</pointsize>
+ </font>
+ </property>
+ <property name="text" >
+ <string>Driver Plug-in License Agreement</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="Line" name="line" >
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" >
+ <widget class="QLabel" name="label_2" >
+ <property name="text" >
+ <string>&lt;html>&lt;head>&lt;meta name="qrichtext" content="1" />&lt;style type="text/css">
+p, li { white-space: pre-wrap; }
+&lt;/style>&lt;/head>&lt;body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;">
+&lt;p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Please read the driver plug-in license agreement and then check the &lt;span style=" font-style:italic;">I agree&lt;/span> box and then click &lt;span style=" font-style:italic;">Next&lt;/span> to continue.&lt;/p>&lt;/body>&lt;/html></string>
+ </property>
+ <property name="wordWrap" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0" >
+ <widget class="QTextEdit" name="LicenseTextEdit" >
+ <property name="autoFormatting" >
+ <set>QTextEdit::AutoAll</set>
+ </property>
+ <property name="readOnly" >
+ <bool>true</bool>
+ </property>
+ <property name="textInteractionFlags" >
+ <set>Qt::NoTextInteraction</set>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="0" >
+ <widget class="QCheckBox" name="AgreeCheckBox" >
+ <property name="text" >
+ <string>I agree to the terms of the driver plug-in license agreement</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ </item>
+ <item row="1" column="0" colspan="5" >
+ <widget class="Line" name="line_2" >
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>161</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="2" column="2" >
+ <widget class="QPushButton" name="BackButton" >
+ <property name="enabled" >
+ <bool>false</bool>
+ </property>
+ <property name="text" >
+ <string>&lt; Back</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="3" >
+ <widget class="QPushButton" name="NextButton" >
+ <property name="enabled" >
+ <bool>false</bool>
+ </property>
+ <property name="text" >
+ <string>Next ></string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="4" >
+ <widget class="QPushButton" name="CancelButton" >
+ <property name="text" >
+ <string>Cancel</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections>
+ <connection>
+ <sender>AgreeCheckBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>NextButton</receiver>
+ <slot>setEnabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>129</x>
+ <y>432</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>450</x>
+ <y>478</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>NextButton</sender>
+ <signal>clicked()</signal>
+ <receiver>Dialog</receiver>
+ <slot>accept()</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>454</x>
+ <y>481</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>448</x>
+ <y>495</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>CancelButton</sender>
+ <signal>clicked()</signal>
+ <receiver>Dialog</receiver>
+ <slot>reject()</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>556</x>
+ <y>476</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>556</x>
+ <y>495</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>
diff --git a/ui4/pqdiagdialog.py b/ui4/pqdiagdialog.py
new file mode 100644
index 0000000..69079ae
--- /dev/null
+++ b/ui4/pqdiagdialog.py
@@ -0,0 +1,124 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2001-2008 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Authors: Don Welch
+#
+
+# StdLib
+import operator
+
+# Local
+from base.g import *
+from base import device, utils, maint
+from prnt import cups
+from base.codes import *
+from ui_utils import *
+
+# Qt
+from PyQt4.QtCore import *
+from PyQt4.QtGui import *
+
+# Ui
+from pqdiagdialog_base import Ui_Dialog
+
+
+class PQDiagDialog(QDialog, Ui_Dialog):
+ def __init__(self, parent, device_uri):
+ QDialog.__init__(self, parent)
+ self.setupUi(self)
+ self.device_uri = device_uri
+ self.initUi()
+
+ QTimer.singleShot(0, self.updateUi)
+
+
+ def initUi(self):
+ # connect signals/slots
+ self.connect(self.CancelButton, SIGNAL("clicked()"), self.CancelButton_clicked)
+ self.connect(self.RunButton, SIGNAL("clicked()"), self.RunButton_clicked)
+ self.connect(self.DeviceComboBox, SIGNAL("DeviceUriComboBox_noDevices"), self.DeviceUriComboBox_noDevices)
+ self.connect(self.DeviceComboBox, SIGNAL("DeviceUriComboBox_currentChanged"), self.DeviceUriComboBox_currentChanged)
+ self.DeviceComboBox.setFilter({'pq-diag-type': (operator.gt, 0)})
+
+ # Application icon
+ self.setWindowIcon(QIcon(load_pixmap('hp_logo', '128x128')))
+
+ if self.device_uri:
+ self.DeviceComboBox.setInitialDevice(self.device_uri)
+
+
+ def updateUi(self):
+ self.DeviceComboBox.updateUi()
+ self.LoadPaper.setButtonName(self.__tr("Run"))
+ self.LoadPaper.updateUi()
+
+
+ def DeviceUriComboBox_currentChanged(self, device_uri):
+ self.device_uri = device_uri
+
+
+ def DeviceUriComboBox_noDevices(self):
+ FailureUI(self, self.__tr("<b>No devices that support print quality diagnostics found.</b><p>Click <i>OK</i> to exit.</p>"))
+ self.close()
+
+
+ def CancelButton_clicked(self):
+ self.close()
+
+
+ def RunButton_clicked(self):
+ d = None
+
+ try:
+ try:
+ d = device.Device(self.device_uri)
+ except Error:
+ CheckDeviceUI(self)
+ return
+
+ pqdiag_type = d.pq_diag_type
+
+ try:
+ d.open()
+ except Error:
+ CheckDeviceUI(self)
+ else:
+ if d.isIdleAndNoError():
+ if pqdiag_type == 1:
+ maint.printQualityDiagType1(d, lambda : True)
+
+ elif pqdiag_type == 2:
+ maint.printQualityDiagType2(d, lambda : True)
+
+ else:
+ CheckDeviceUI(self)
+
+ finally:
+ if d is not None:
+ d.close()
+
+ self.close()
+
+ #
+ # Misc
+ #
+
+ def __tr(self,s,c = None):
+ return qApp.translate("PQDiagDialog",s,c)
+
+
diff --git a/ui4/pqdiagdialog_base.py b/ui4/pqdiagdialog_base.py
new file mode 100644
index 0000000..425c7ee
--- /dev/null
+++ b/ui4/pqdiagdialog_base.py
@@ -0,0 +1,56 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'ui4/pqdiagdialog_base.ui'
+#
+# Created: Mon May 4 14:30:35 2009
+# by: PyQt4 UI code generator 4.4.4
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt4 import QtCore, QtGui
+
+class Ui_Dialog(object):
+ def setupUi(self, Dialog):
+ Dialog.setObjectName("Dialog")
+ Dialog.resize(700, 500)
+ self.gridlayout = QtGui.QGridLayout(Dialog)
+ self.gridlayout.setObjectName("gridlayout")
+ self.label = QtGui.QLabel(Dialog)
+ font = QtGui.QFont()
+ font.setPointSize(16)
+ self.label.setFont(font)
+ self.label.setObjectName("label")
+ self.gridlayout.addWidget(self.label, 0, 0, 1, 1)
+ self.line = QtGui.QFrame(Dialog)
+ self.line.setFrameShape(QtGui.QFrame.HLine)
+ self.line.setFrameShadow(QtGui.QFrame.Sunken)
+ self.line.setObjectName("line")
+ self.gridlayout.addWidget(self.line, 1, 0, 1, 3)
+ self.DeviceComboBox = DeviceUriComboBox(Dialog)
+ self.DeviceComboBox.setObjectName("DeviceComboBox")
+ self.gridlayout.addWidget(self.DeviceComboBox, 2, 0, 1, 3)
+ self.LoadPaper = LoadPaperGroupBox(Dialog)
+ self.LoadPaper.setObjectName("LoadPaper")
+ self.gridlayout.addWidget(self.LoadPaper, 3, 0, 1, 3)
+ spacerItem = QtGui.QSpacerItem(410, 81, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ self.gridlayout.addItem(spacerItem, 4, 0, 1, 1)
+ spacerItem1 = QtGui.QSpacerItem(361, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+ self.gridlayout.addItem(spacerItem1, 5, 0, 1, 1)
+ self.RunButton = QtGui.QPushButton(Dialog)
+ self.RunButton.setObjectName("RunButton")
+ self.gridlayout.addWidget(self.RunButton, 5, 1, 1, 1)
+ self.CancelButton = QtGui.QPushButton(Dialog)
+ self.CancelButton.setObjectName("CancelButton")
+ self.gridlayout.addWidget(self.CancelButton, 5, 2, 1, 1)
+
+ self.retranslateUi(Dialog)
+ QtCore.QMetaObject.connectSlotsByName(Dialog)
+
+ def retranslateUi(self, Dialog):
+ Dialog.setWindowTitle(QtGui.QApplication.translate("Dialog", "HP Device Manager - Print Quality Diagnostics", None, QtGui.QApplication.UnicodeUTF8))
+ self.label.setText(QtGui.QApplication.translate("Dialog", "Print Quality Diagnostics", None, QtGui.QApplication.UnicodeUTF8))
+ self.RunButton.setText(QtGui.QApplication.translate("Dialog", "Run", None, QtGui.QApplication.UnicodeUTF8))
+ self.CancelButton.setText(QtGui.QApplication.translate("Dialog", "Cancel", None, QtGui.QApplication.UnicodeUTF8))
+
+from loadpapergroupbox import LoadPaperGroupBox
+from deviceuricombobox import DeviceUriComboBox
diff --git a/ui4/pqdiagdialog_base.ui b/ui4/pqdiagdialog_base.ui
new file mode 100644
index 0000000..398189a
--- /dev/null
+++ b/ui4/pqdiagdialog_base.ui
@@ -0,0 +1,102 @@
+<ui version="4.0" >
+ <class>Dialog</class>
+ <widget class="QDialog" name="Dialog" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>700</width>
+ <height>500</height>
+ </rect>
+ </property>
+ <property name="windowTitle" >
+ <string>HP Device Manager - Print Quality Diagnostics</string>
+ </property>
+ <layout class="QGridLayout" >
+ <item row="0" column="0" >
+ <widget class="QLabel" name="label" >
+ <property name="font" >
+ <font>
+ <pointsize>16</pointsize>
+ </font>
+ </property>
+ <property name="text" >
+ <string>Print Quality Diagnostics</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" colspan="3" >
+ <widget class="Line" name="line" >
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" colspan="3" >
+ <widget class="DeviceUriComboBox" name="DeviceComboBox" />
+ </item>
+ <item row="3" column="0" colspan="3" >
+ <widget class="LoadPaperGroupBox" name="LoadPaper" >
+ <property name="title" >
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="0" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>410</width>
+ <height>81</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="5" column="0" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>361</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="5" column="1" >
+ <widget class="QPushButton" name="RunButton" >
+ <property name="text" >
+ <string>Run</string>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="2" >
+ <widget class="QPushButton" name="CancelButton" >
+ <property name="text" >
+ <string>Cancel</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <customwidgets>
+ <customwidget>
+ <class>DeviceUriComboBox</class>
+ <extends>QComboBox</extends>
+ <header>deviceuricombobox.h</header>
+ </customwidget>
+ <customwidget>
+ <class>LoadPaperGroupBox</class>
+ <extends>QGroupBox</extends>
+ <header>loadpapergroupbox.h</header>
+ <container>1</container>
+ </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/ui4/printdialog.py b/ui4/printdialog.py
new file mode 100644
index 0000000..be5ad37
--- /dev/null
+++ b/ui4/printdialog.py
@@ -0,0 +1,352 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2001-2009 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Authors: Don Welch
+#
+
+
+# Local
+from base.g import *
+from base import device, utils
+from prnt import cups
+from base.codes import *
+from ui_utils import *
+
+# Qt
+from PyQt4.QtCore import *
+from PyQt4.QtGui import *
+
+# Ui
+from printdialog_base import Ui_Dialog
+from filetable import FileTable, FILETABLE_TYPE_PRINT
+from printernamecombobox import PRINTERNAMECOMBOBOX_TYPE_PRINTER_ONLY
+
+PAGE_FILE = 0
+PAGE_OPTIONS = 1
+PAGE_MAX = 1
+
+
+class PrintDialog(QDialog, Ui_Dialog):
+ def __init__(self, parent, printer_name, args=None):
+ QDialog.__init__(self, parent)
+ self.setupUi(self)
+
+ self.printer_name = printer_name
+
+ # User settings
+ self.user_settings = UserSettings()
+ self.user_settings.load()
+ self.user_settings.debug()
+
+ self.initUi()
+
+ self.file_list = []
+ if args is not None:
+ for a in args:
+ self.Files.addFileFromUI(os.path.abspath(a))
+
+ self.devices = {}
+
+
+ QTimer.singleShot(0, self.updateFilePage)
+
+
+ def initUi(self):
+ self.OptionsToolBox.include_job_options = True
+
+ # connect signals/slots
+ self.connect(self.CancelButton, SIGNAL("clicked()"), self.CancelButton_clicked)
+ self.connect(self.BackButton, SIGNAL("clicked()"), self.BackButton_clicked)
+ self.connect(self.NextButton, SIGNAL("clicked()"), self.NextButton_clicked)
+
+ self.initFilePage()
+ self.initOptionsPage()
+
+ # Application icon
+ self.setWindowIcon(QIcon(load_pixmap('hp_logo', '128x128')))
+
+ if self.printer_name:
+ self.PrinterName.setInitialPrinter(self.printer_name)
+
+ self.StackedWidget.setCurrentIndex(0)
+
+
+ #
+ # File Page
+ #
+
+ def initFilePage(self):
+ self.Files.setType(FILETABLE_TYPE_PRINT)
+ #self.Files.setWorkingDir(user_conf.workingDirectory())
+ self.Files.setWorkingDir(self.user_settings.working_dir)
+ self.connect(self.Files, SIGNAL("isEmpty"), self.Files_isEmpty)
+ self.connect(self.Files, SIGNAL("isNotEmpty"), self.Files_isNotEmpty)
+
+
+ def updateFilePage(self):
+ self.NextButton.setText(self.__tr("Next >"))
+ self.NextButton.setEnabled(self.Files.isNotEmpty())
+ self.BackButton.setEnabled(False)
+ self.updateStepText(PAGE_FILE)
+ self.Files.updateUi()
+
+ def Files_isEmpty(self):
+ self.NextButton.setEnabled(False)
+
+
+ def Files_isNotEmpty(self):
+ self.NextButton.setEnabled(True)
+
+
+ #
+ # Options Page
+ #
+
+ def initOptionsPage(self):
+ self.BackButton.setEnabled(True)
+ self.PrinterName.setType(PRINTERNAMECOMBOBOX_TYPE_PRINTER_ONLY)
+
+ self.connect(self.PrinterName, SIGNAL("PrinterNameComboBox_currentChanged"),
+ self.PrinterNameComboBox_currentChanged)
+
+ self.connect(self.PrinterName, SIGNAL("PrinterNameComboBox_noPrinters"),
+ self.PrinterNameComboBox_noPrinters)
+
+
+ def updateOptionsPage(self):
+ QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
+ try:
+ self.PrinterName.updateUi()
+ self.BackButton.setEnabled(True)
+ num_files = len(self.Files.file_list)
+
+ if num_files > 1:
+ self.NextButton.setText(self.__tr("Print %1 Files").arg(num_files))
+ else:
+ self.NextButton.setText(self.__tr("Print File"))
+
+ self.updateStepText(PAGE_OPTIONS)
+ # TODO: Enable print button only if printer is accepting and all options are OK (esp. page range)
+ finally:
+ QApplication.restoreOverrideCursor()
+
+
+ def PrinterNameComboBox_currentChanged(self, device_uri, printer_name):
+ try:
+ self.devices[device_uri]
+ except KeyError:
+ self.devices[device_uri] = device.Device(device_uri)
+
+ self.OptionsToolBox.updateUi(self.devices[device_uri], printer_name)
+
+
+ def PrinterNameComboBox_noPrinters(self):
+ FailureUI(self, self.__tr("<b>No printers found.</b><p>Please setup a printer and try again."))
+ self.close()
+
+
+ #
+ # Print
+ #
+
+ def executePrint(self):
+ for cmd in self.OptionsToolBox.getPrintCommands(self.Files.file_list):
+ log.debug(cmd)
+ status, output = utils.run(cmd, log_output=True, password_func=None, timeout=1)
+ if status != 0:
+ FailureUI(self, self.__tr("<b>Print command failed with status code %1.</b><p>%2</p>").arg(status).arg(cmd))
+
+ self.close()
+ #print file('/home/dwelch/.cups/lpoptions', 'r').read()
+
+ #
+ # Misc
+ #
+
+ def CancelButton_clicked(self):
+ self.close()
+
+
+ def BackButton_clicked(self):
+ p = self.StackedWidget.currentIndex()
+ if p == PAGE_OPTIONS:
+ self.StackedWidget.setCurrentIndex(PAGE_FILE)
+ self.updateFilePage()
+
+ else:
+ log.error("Invalid page!") # shouldn't happen!
+
+
+ def NextButton_clicked(self):
+ p = self.StackedWidget.currentIndex()
+ if p == PAGE_FILE:
+ self.StackedWidget.setCurrentIndex(PAGE_OPTIONS)
+ self.updateOptionsPage()
+
+ elif p == PAGE_OPTIONS:
+ self.executePrint()
+
+
+ def updateStepText(self, p):
+ self.StepText.setText(self.__tr("Step %1 of %2").arg(p+1).arg(PAGE_MAX+1))
+
+
+ def __tr(self,s,c = None):
+ return qApp.translate("PrintDialog",s,c)
+
+
+
+"""
+ def printButton_clicked(self):
+ if self.invalid_page_range:
+ self.form.FailureUI(self.__tr("<b>Cannot print: Invalid page range: %1</b><p>A valid page range is a list of pages or ranges of pages separated by commas (e.g., 1-2,4,6-7)").arg(self.pageRangeEdit.text()))
+ return
+
+ try:
+ try:
+ self.cur_device.open()
+ except Error:
+ self.form.FailureUI(self.__tr("<b>Cannot print: Device is busy or not available.</b><p>Please check device and try again."))
+ return
+
+ if 1: # Go ahead and allow - print will be queued in CUPS if not rejecting
+ printers = cups.getPrinters()
+ for p in printers:
+ if p.name == self.cur_printer:
+ break
+
+ if p.state == cups.IPP_PRINTER_STATE_STOPPED:
+ self.form.FailureUI(self.__tr("<b>Cannot print: Printer is stopped.</b><p>Please START the printer to continue this print. Job will begin printing once printer is started."))
+
+ if not p.accepting:
+ self.form.FailureUI(self.__tr("<b>Cannot print: Printer is not accepting jobs.</b><p>Please set the printer to ACCEPTING JOBS to continue printing."))
+ return
+
+ copies = int(self.copiesSpinBox.value())
+ all_pages = self.pages_button_group == 0
+ page_range = unicode(self.pageRangeEdit.text())
+ page_set = int(self.pageSetComboBox.currentItem())
+
+ cups.resetOptions()
+ cups.openPPD(self.cur_printer)
+ current_options = dict(cups.getOptions())
+ cups.closePPD()
+
+ nup = int(current_options.get("number-up", 1))
+
+ for p, t, d in self.file_list:
+
+ alt_nup = (nup > 1 and t == 'application/postscript' and utils.which('psnup'))
+
+ if utils.which('lpr'):
+ if alt_nup:
+ cmd = ' '.join(['psnup', '-%d' % nup, ''.join(['"', p, '"']), '| lpr -P', self.cur_printer])
+ else:
+ cmd = ' '.join(['lpr -P', self.cur_printer])
+
+ if copies > 1:
+ cmd = ' '.join([cmd, '-#%d' % copies])
+
+ else:
+ if alt_nup:
+ cmd = ' '.join(['psnup', '-%d' % nup, ''.join(['"', p, '"']), '| lp -c -d', self.cur_printer])
+ else:
+ cmd = ' '.join(['lp -c -d', self.cur_printer])
+
+ if copies > 1:
+ cmd = ' '.join([cmd, '-n%d' % copies])
+
+
+ if not all_pages and len(page_range) > 0:
+ cmd = ' '.join([cmd, '-o page-ranges=%s' % page_range])
+
+ if page_set > 0:
+ if page_set == 1:
+ cmd = ' '.join([cmd, '-o page-set=even'])
+ else:
+ cmd = ' '.join([cmd, '-o page-set=odd'])
+
+
+ # Job Storage
+ # self.job_storage_mode = (0=Off, 1=P&H, 2=PJ, 3=QC, 4=SJ)
+ # self.job_storage_pin = u"" (dddd)
+ # self.job_storage_use_pin = True|False
+ # self.job_storage_username = u""
+ # self.job_storage_auto_username = True|False
+ # self.job_storage_jobname = u""
+ # self.job_storage_auto_jobname = True|False
+ # self.job_storage_job_exist = (0=replace, 1=job name+(1-99))
+
+ if self.job_storage_avail:
+ if self.job_storage_mode: # On
+
+ if self.job_storage_mode == 1: # Proof and Hold
+ cmd = ' '.join([cmd, '-o HOLD=PROOF'])
+
+ elif self.job_storage_mode == 2: # Private Job
+ if self.job_storage_use_pin:
+ cmd = ' '.join([cmd, '-o HOLD=ON'])
+ cmd = ' '.join([cmd, '-o HOLDTYPE=PRIVATE'])
+ cmd = ' '.join([cmd, '-o HOLDKEY=%s' % self.job_storage_pin.encode('ascii')])
+ else:
+ cmd = ' '.join([cmd, '-o HOLD=PROOF'])
+ cmd = ' '.join([cmd, '-o HOLDTYPE=PRIVATE'])
+
+ elif self.job_storage_mode == 3: # Quick Copy
+ cmd = ' '.join([cmd, '-o HOLD=ON'])
+ cmd = ' '.join([cmd, '-o HOLDTYPE=PUBLIC'])
+
+ elif self.job_storage_mode == 4: # Store Job
+ if self.job_storage_use_pin:
+ cmd = ' '.join([cmd, '-o HOLD=STORE'])
+ cmd = ' '.join([cmd, '-o HOLDTYPE=PRIVATE'])
+ cmd = ' '.join([cmd, '-o HOLDKEY=%s' % self.job_storage_pin.encode('ascii')])
+ else:
+ cmd = ' '.join([cmd, '-o HOLD=STORE'])
+
+ cmd = ' '.join([cmd, '-o USERNAME=%s' % self.job_storage_username.encode('ascii')\
+ .replace(" ", "_")])
+
+ cmd = ' '.join([cmd, '-o JOBNAME=%s' % self.job_storage_jobname.encode('ascii')\
+ .replace(" ", "_")])
+
+ if self.job_storage_job_exist == 1:
+ cmd = ' '.join([cmd, '-o DUPLICATEJOB=APPEND'])
+ else:
+ cmd = ' '.join([cmd, '-o DUPLICATEJOB=REPLACE'])
+
+ else: # Off
+ cmd = ' '.join([cmd, '-o HOLD=OFF'])
+
+
+ if not alt_nup:
+ cmd = ''.join([cmd, ' "', p, '"'])
+
+ log.debug("Printing: %s" % cmd)
+
+ code = os.system(cmd)
+ if code != 0:
+ log.error("Print command failed.")
+ self.form.FailureUI(self.__tr("Print command failed with error code %1").arg(code))
+
+ self.form.close()
+
+ finally:
+ self.cur_device.close()
+
+"""
diff --git a/ui4/printdialog_base.py b/ui4/printdialog_base.py
new file mode 100644
index 0000000..bb815b0
--- /dev/null
+++ b/ui4/printdialog_base.py
@@ -0,0 +1,109 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'ui4/printdialog_base.ui'
+#
+# Created: Mon May 4 14:30:35 2009
+# by: PyQt4 UI code generator 4.4.4
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt4 import QtCore, QtGui
+
+class Ui_Dialog(object):
+ def setupUi(self, Dialog):
+ Dialog.setObjectName("Dialog")
+ Dialog.setWindowModality(QtCore.Qt.ApplicationModal)
+ Dialog.resize(700, 500)
+ self.gridlayout = QtGui.QGridLayout(Dialog)
+ self.gridlayout.setObjectName("gridlayout")
+ self.StackedWidget = QtGui.QStackedWidget(Dialog)
+ self.StackedWidget.setObjectName("StackedWidget")
+ self.page = QtGui.QWidget()
+ self.page.setObjectName("page")
+ self.gridlayout1 = QtGui.QGridLayout(self.page)
+ self.gridlayout1.setObjectName("gridlayout1")
+ self.label_2 = QtGui.QLabel(self.page)
+ font = QtGui.QFont()
+ font.setPointSize(16)
+ self.label_2.setFont(font)
+ self.label_2.setObjectName("label_2")
+ self.gridlayout1.addWidget(self.label_2, 0, 0, 1, 1)
+ self.line = QtGui.QFrame(self.page)
+ self.line.setFrameShape(QtGui.QFrame.HLine)
+ self.line.setFrameShadow(QtGui.QFrame.Sunken)
+ self.line.setObjectName("line")
+ self.gridlayout1.addWidget(self.line, 1, 0, 1, 1)
+ self.Files = FileTable(self.page)
+ sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.Files.sizePolicy().hasHeightForWidth())
+ self.Files.setSizePolicy(sizePolicy)
+ self.Files.setObjectName("Files")
+ self.gridlayout1.addWidget(self.Files, 2, 0, 1, 1)
+ self.StackedWidget.addWidget(self.page)
+ self.page_2 = QtGui.QWidget()
+ self.page_2.setObjectName("page_2")
+ self.gridlayout2 = QtGui.QGridLayout(self.page_2)
+ self.gridlayout2.setObjectName("gridlayout2")
+ self.label_3 = QtGui.QLabel(self.page_2)
+ font = QtGui.QFont()
+ font.setPointSize(16)
+ self.label_3.setFont(font)
+ self.label_3.setObjectName("label_3")
+ self.gridlayout2.addWidget(self.label_3, 0, 0, 1, 1)
+ self.line_2 = QtGui.QFrame(self.page_2)
+ self.line_2.setFrameShape(QtGui.QFrame.HLine)
+ self.line_2.setFrameShadow(QtGui.QFrame.Sunken)
+ self.line_2.setObjectName("line_2")
+ self.gridlayout2.addWidget(self.line_2, 1, 0, 1, 1)
+ self.PrinterName = PrinterNameComboBox(self.page_2)
+ self.PrinterName.setObjectName("PrinterName")
+ self.gridlayout2.addWidget(self.PrinterName, 2, 0, 1, 1)
+ self.OptionsToolBox = PrintSettingsToolbox(self.page_2)
+ sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Expanding)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.OptionsToolBox.sizePolicy().hasHeightForWidth())
+ self.OptionsToolBox.setSizePolicy(sizePolicy)
+ self.OptionsToolBox.setObjectName("OptionsToolBox")
+ self.gridlayout2.addWidget(self.OptionsToolBox, 3, 0, 1, 1)
+ self.StackedWidget.addWidget(self.page_2)
+ self.gridlayout.addWidget(self.StackedWidget, 0, 0, 1, 5)
+ self.line_3 = QtGui.QFrame(Dialog)
+ self.line_3.setFrameShape(QtGui.QFrame.HLine)
+ self.line_3.setFrameShadow(QtGui.QFrame.Sunken)
+ self.line_3.setObjectName("line_3")
+ self.gridlayout.addWidget(self.line_3, 1, 0, 1, 5)
+ self.StepText = QtGui.QLabel(Dialog)
+ self.StepText.setObjectName("StepText")
+ self.gridlayout.addWidget(self.StepText, 2, 0, 1, 1)
+ spacerItem = QtGui.QSpacerItem(251, 28, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+ self.gridlayout.addItem(spacerItem, 2, 1, 1, 1)
+ self.BackButton = QtGui.QPushButton(Dialog)
+ self.BackButton.setObjectName("BackButton")
+ self.gridlayout.addWidget(self.BackButton, 2, 2, 1, 1)
+ self.NextButton = QtGui.QPushButton(Dialog)
+ self.NextButton.setObjectName("NextButton")
+ self.gridlayout.addWidget(self.NextButton, 2, 3, 1, 1)
+ self.CancelButton = QtGui.QPushButton(Dialog)
+ self.CancelButton.setObjectName("CancelButton")
+ self.gridlayout.addWidget(self.CancelButton, 2, 4, 1, 1)
+
+ self.retranslateUi(Dialog)
+ self.StackedWidget.setCurrentIndex(1)
+ self.OptionsToolBox.setCurrentIndex(-1)
+ QtCore.QMetaObject.connectSlotsByName(Dialog)
+
+ def retranslateUi(self, Dialog):
+ Dialog.setWindowTitle(QtGui.QApplication.translate("Dialog", "HP Device Manager - Print", None, QtGui.QApplication.UnicodeUTF8))
+ self.label_2.setText(QtGui.QApplication.translate("Dialog", "Select Files to Print", None, QtGui.QApplication.UnicodeUTF8))
+ self.label_3.setText(QtGui.QApplication.translate("Dialog", "Select Printer and Options", None, QtGui.QApplication.UnicodeUTF8))
+ self.StepText.setText(QtGui.QApplication.translate("Dialog", "Step %1 of %2", None, QtGui.QApplication.UnicodeUTF8))
+ self.BackButton.setText(QtGui.QApplication.translate("Dialog", "< Back", None, QtGui.QApplication.UnicodeUTF8))
+ self.NextButton.setText(QtGui.QApplication.translate("Dialog", "Next >", None, QtGui.QApplication.UnicodeUTF8))
+ self.CancelButton.setText(QtGui.QApplication.translate("Dialog", "Cancel", None, QtGui.QApplication.UnicodeUTF8))
+
+from printsettingstoolbox import PrintSettingsToolbox
+from printernamecombobox import PrinterNameComboBox
+from filetable import FileTable
diff --git a/ui4/printdialog_base.ui b/ui4/printdialog_base.ui
new file mode 100644
index 0000000..2d1aab6
--- /dev/null
+++ b/ui4/printdialog_base.ui
@@ -0,0 +1,169 @@
+<ui version="4.0" >
+ <class>Dialog</class>
+ <widget class="QDialog" name="Dialog" >
+ <property name="windowModality" >
+ <enum>Qt::ApplicationModal</enum>
+ </property>
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>700</width>
+ <height>500</height>
+ </rect>
+ </property>
+ <property name="windowTitle" >
+ <string>HP Device Manager - Print</string>
+ </property>
+ <layout class="QGridLayout" >
+ <item row="0" column="0" colspan="5" >
+ <widget class="QStackedWidget" name="StackedWidget" >
+ <property name="currentIndex" >
+ <number>1</number>
+ </property>
+ <widget class="QWidget" name="page" >
+ <layout class="QGridLayout" >
+ <item row="0" column="0" >
+ <widget class="QLabel" name="label_2" >
+ <property name="font" >
+ <font>
+ <pointsize>16</pointsize>
+ </font>
+ </property>
+ <property name="text" >
+ <string>Select Files to Print</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="Line" name="line" >
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" >
+ <widget class="FileTable" native="1" name="Files" >
+ <property name="sizePolicy" >
+ <sizepolicy vsizetype="Expanding" hsizetype="Expanding" >
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="page_2" >
+ <layout class="QGridLayout" >
+ <item row="0" column="0" >
+ <widget class="QLabel" name="label_3" >
+ <property name="font" >
+ <font>
+ <pointsize>16</pointsize>
+ </font>
+ </property>
+ <property name="text" >
+ <string>Select Printer and Options</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="Line" name="line_2" >
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" >
+ <widget class="PrinterNameComboBox" name="PrinterName" />
+ </item>
+ <item row="3" column="0" >
+ <widget class="PrintSettingsToolbox" name="OptionsToolBox" >
+ <property name="sizePolicy" >
+ <sizepolicy vsizetype="Expanding" hsizetype="Preferred" >
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="currentIndex" >
+ <number>-1</number>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ </item>
+ <item row="1" column="0" colspan="5" >
+ <widget class="Line" name="line_3" >
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" >
+ <widget class="QLabel" name="StepText" >
+ <property name="text" >
+ <string>Step %1 of %2</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>251</width>
+ <height>28</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="2" column="2" >
+ <widget class="QPushButton" name="BackButton" >
+ <property name="text" >
+ <string>&lt; Back</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="3" >
+ <widget class="QPushButton" name="NextButton" >
+ <property name="text" >
+ <string>Next ></string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="4" >
+ <widget class="QPushButton" name="CancelButton" >
+ <property name="text" >
+ <string>Cancel</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <customwidgets>
+ <customwidget>
+ <class>FileTable</class>
+ <extends>QWidget</extends>
+ <header>filetable.h</header>
+ <container>1</container>
+ </customwidget>
+ <customwidget>
+ <class>PrinterNameComboBox</class>
+ <extends>QComboBox</extends>
+ <header>printernamecombobox.h</header>
+ </customwidget>
+ <customwidget>
+ <class>PrintSettingsToolbox</class>
+ <extends>QToolBox</extends>
+ <header>printsettingstoolbox.h</header>
+ <container>1</container>
+ </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/ui4/printernamecombobox.py b/ui4/printernamecombobox.py
new file mode 100644
index 0000000..f8478c4
--- /dev/null
+++ b/ui4/printernamecombobox.py
@@ -0,0 +1,155 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2001-2009 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+# Std Lib
+#import sys
+
+# Local
+from base.g import *
+from ui_utils import *
+from base import device
+
+# Qt
+from PyQt4.QtCore import *
+from PyQt4.QtGui import *
+
+
+PRINTERNAMECOMBOBOX_TYPE_PRINTER_ONLY = 0
+PRINTERNAMECOMBOBOX_TYPE_FAX_ONLY = 1
+PRINTERNAMECOMBOBOX_TYPE_PRINTER_AND_FAX = 2
+
+
+class PrinterNameComboBox(QWidget):
+ def __init__(self, parent):
+ QWidget.__init__(self, parent)
+ self.printer_name = ''
+ self.device_uri = ''
+ self.printer_index = {}
+ self.initial_printer = None
+ self.updating = False
+ self.typ = PRINTERNAMECOMBOBOX_TYPE_PRINTER_ONLY
+
+ self.user_settings = UserSettings()
+ self.user_settings.load()
+ self.user_settings.debug()
+
+ self.initUi()
+
+
+ def initUi(self):
+ #print "PrinterNameComboBox.initUi()"
+ HBoxLayout = QHBoxLayout(self)
+ HBoxLayout.setObjectName("HBoxLayout")
+
+ self.NameLabel = QLabel(self)
+ self.NameLabel.setObjectName("NameLabel")
+ HBoxLayout.addWidget(self.NameLabel)
+
+ SpacerItem = QSpacerItem(20, 20, QSizePolicy.Minimum, QSizePolicy.Minimum)
+ HBoxLayout.addItem(SpacerItem)
+
+ self.ComboBox = QComboBox(self)
+ sizePolicy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Preferred)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.ComboBox.sizePolicy().hasHeightForWidth())
+ self.ComboBox.setSizePolicy(sizePolicy)
+ self.ComboBox.setObjectName("ComboBox")
+ HBoxLayout.addWidget(self.ComboBox)
+
+ self.NameLabel.setText(self.__tr("Printer:"))
+
+ #self.connect(self.ComboBox, SIGNAL("currentIndexChanged(int)"),
+ # self.ComboBox_currentIndexChanged)
+
+ self.connect(self.ComboBox, SIGNAL("currentIndexChanged(const QString &)"),
+ self.ComboBox_currentIndexChanged)
+
+ def setType(self, typ):
+ if typ in (PRINTERNAMECOMBOBOX_TYPE_PRINTER_ONLY,
+ PRINTERNAMECOMBOBOX_TYPE_FAX_ONLY,
+ PRINTERNAMECOMBOBOX_TYPE_PRINTER_AND_FAX):
+ self.typ = typ
+
+
+ def setInitialPrinter(self, printer_name):
+ self.initial_printer = printer_name
+
+
+ def updateUi(self):
+ #print "PrinterNameComboBox.updateUi()"
+ if self.typ == PRINTERNAMECOMBOBOX_TYPE_PRINTER_ONLY:
+ self.NameLabel.setText(self.__tr("Printer Name:"))
+ be_filter = ['hp']
+
+ elif self.typ == PRINTERNAMECOMBOBOX_TYPE_FAX_ONLY:
+ self.NameLabel.setText(self.__tr("Fax Name:"))
+ be_filter = ['hpfax']
+
+ else: # PRINTERNAMECOMBOBOX_TYPE_PRINTER_AND_FAX
+ self.NameLabel.setText(self.__tr("Printer/Fax Name:"))
+ be_filter = ['hp', 'hpfax']
+
+ self.printers = device.getSupportedCUPSPrinters(be_filter)
+ self.printer_index.clear() # = {}
+
+ if self.printers:
+ if self.initial_printer is None:
+ #user_conf.get('last_used', 'printer_name')
+ self.initial_printer = self.user_settings.last_used_printer
+
+ self.updating = True
+ try:
+ k = 0
+ for i, p in enumerate(self.printers):
+ self.printer_index[p.name] = p.device_uri
+ self.ComboBox.insertItem(i, p.name)
+
+ if self.initial_printer is not None and p.name == self.initial_printer:
+ self.initial_printer = None
+ k = i
+
+ self.ComboBox.setCurrentIndex(-1)
+
+ finally:
+ self.updating = False
+
+ self.ComboBox.setCurrentIndex(k)
+ else:
+ self.emit(SIGNAL("PrinterNameComboBox_noPrinters"))
+
+
+ def ComboBox_currentIndexChanged(self, t):
+ self.printer_name = unicode(t)
+
+ if self.updating:
+ return
+
+ self.device_uri = self.printer_index[self.printer_name]
+ #user_conf.set('last_used', 'printer_name', self.printer_name)
+ self.user_settings.last_used_printer = self.printer_name
+ self.user_settings.save()
+
+ self.emit(SIGNAL("PrinterNameComboBox_currentChanged"), self.device_uri, self.printer_name)
+
+
+ def __tr(self,s,c = None):
+ return qApp.translate("PrinterNameComboBox",s,c)
diff --git a/ui4/printsettingsdialog.py b/ui4/printsettingsdialog.py
new file mode 100644
index 0000000..baaa013
--- /dev/null
+++ b/ui4/printsettingsdialog.py
@@ -0,0 +1,114 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2001-2008 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+# Local
+from base.g import *
+from base import device
+from prnt import cups
+from ui_utils import *
+
+# Qt
+from PyQt4.QtCore import *
+from PyQt4.QtGui import *
+
+# Ui
+from printsettingsdialog_base import Ui_Dialog
+from printsettingstoolbox import PrintSettingsToolbox
+from printernamecombobox import PRINTERNAMECOMBOBOX_TYPE_PRINTER_AND_FAX, PRINTERNAMECOMBOBOX_TYPE_FAX_ONLY
+
+
+class PrintSettingsDialog(QDialog, Ui_Dialog):
+ def __init__(self, parent, printer_name, fax_mode=False):
+ QDialog.__init__(self, parent)
+ self.setupUi(self)
+ self.fax_mode = fax_mode
+ self.printer_name = printer_name
+ self.device_uri = None
+ self.devices = {}
+ self.printer_index = {}
+
+ # User settings
+ self.user_settings = UserSettings()
+ self.user_settings.load()
+ self.user_settings.debug()
+ #self.cur_printer = self.user_settings.last_used_printer
+
+ self.initUi(printer_name)
+ QTimer.singleShot(0, self.updateUi)
+
+
+ def initUi(self, printer_name=None):
+ self.OptionsToolBox.include_print_options = False
+
+ if self.printer_name:
+ self.PrinterName.setInitialPrinter(self.printer_name)
+
+ if self.fax_mode:
+ self.PrinterName.setType(PRINTERNAMECOMBOBOX_TYPE_FAX_ONLY)
+ self.TitleLabel.setText(self.__tr("Fax Settings"))
+ else:
+ self.PrinterName.setType(PRINTERNAMECOMBOBOX_TYPE_PRINTER_AND_FAX)
+
+ self.connect(self.CloseButton, SIGNAL("clicked()"), self.CloseButton_clicked)
+
+ self.connect(self.PrinterName, SIGNAL("PrinterNameComboBox_currentChanged"),
+ self.PrinterNameComboBox_currentChanged)
+
+ self.connect(self.PrinterName, SIGNAL("PrinterNameComboBox_noPrinters"),
+ self.PrinterNameComboBox_noPrinters)
+
+ # Application icon
+ self.setWindowIcon(QIcon(load_pixmap('hp_logo', '128x128')))
+
+
+
+ def updateUi(self):
+ self.PrinterName.updateUi()
+
+
+ def PrinterNameComboBox_noPrinters(self):
+ FailureUI(self, self.__tr("<b>No printers or faxes found.</b><p>Please setup a printer or fax and try again."))
+ self.close()
+
+
+ def PrinterNameComboBox_currentChanged(self, device_uri, printer_name):
+ self.printer_name = printer_name
+ self.device_uri = device_uri
+ try:
+ self.devices[device_uri]
+ except KeyError:
+ self.devices[device_uri] = device.Device(device_uri)
+
+ self.OptionsToolBox.updateUi(self.devices[device_uri], self.printer_name)
+
+
+ #
+ # Misc
+ #
+
+ def CloseButton_clicked(self):
+ self.close()
+
+
+ def __tr(self,s,c = None):
+ return qApp.translate("PrintSettingsDialog",s,c)
+
+
diff --git a/ui4/printsettingsdialog_base.py b/ui4/printsettingsdialog_base.py
new file mode 100644
index 0000000..bad8f8e
--- /dev/null
+++ b/ui4/printsettingsdialog_base.py
@@ -0,0 +1,57 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'ui4/printsettingsdialog_base.ui'
+#
+# Created: Mon May 4 14:30:36 2009
+# by: PyQt4 UI code generator 4.4.4
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt4 import QtCore, QtGui
+
+class Ui_Dialog(object):
+ def setupUi(self, Dialog):
+ Dialog.setObjectName("Dialog")
+ Dialog.setWindowModality(QtCore.Qt.ApplicationModal)
+ Dialog.resize(700, 500)
+ self.gridlayout = QtGui.QGridLayout(Dialog)
+ self.gridlayout.setObjectName("gridlayout")
+ self.TitleLabel = QtGui.QLabel(Dialog)
+ font = QtGui.QFont()
+ font.setPointSize(16)
+ self.TitleLabel.setFont(font)
+ self.TitleLabel.setObjectName("TitleLabel")
+ self.gridlayout.addWidget(self.TitleLabel, 0, 0, 1, 1)
+ self.line = QtGui.QFrame(Dialog)
+ self.line.setFrameShape(QtGui.QFrame.HLine)
+ self.line.setFrameShadow(QtGui.QFrame.Sunken)
+ self.line.setObjectName("line")
+ self.gridlayout.addWidget(self.line, 1, 0, 1, 2)
+ self.PrinterName = PrinterNameComboBox(Dialog)
+ self.PrinterName.setObjectName("PrinterName")
+ self.gridlayout.addWidget(self.PrinterName, 2, 0, 1, 2)
+ self.OptionsToolBox = PrintSettingsToolbox(Dialog)
+ sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.OptionsToolBox.sizePolicy().hasHeightForWidth())
+ self.OptionsToolBox.setSizePolicy(sizePolicy)
+ self.OptionsToolBox.setObjectName("OptionsToolBox")
+ self.gridlayout.addWidget(self.OptionsToolBox, 3, 0, 1, 2)
+ spacerItem = QtGui.QSpacerItem(461, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+ self.gridlayout.addItem(spacerItem, 4, 0, 1, 1)
+ self.CloseButton = QtGui.QPushButton(Dialog)
+ self.CloseButton.setObjectName("CloseButton")
+ self.gridlayout.addWidget(self.CloseButton, 4, 1, 1, 1)
+
+ self.retranslateUi(Dialog)
+ self.OptionsToolBox.setCurrentIndex(-1)
+ QtCore.QMetaObject.connectSlotsByName(Dialog)
+
+ def retranslateUi(self, Dialog):
+ Dialog.setWindowTitle(QtGui.QApplication.translate("Dialog", "HP Device Manager - Print Settings", None, QtGui.QApplication.UnicodeUTF8))
+ self.TitleLabel.setText(QtGui.QApplication.translate("Dialog", "Print Settings", None, QtGui.QApplication.UnicodeUTF8))
+ self.CloseButton.setText(QtGui.QApplication.translate("Dialog", "Close", None, QtGui.QApplication.UnicodeUTF8))
+
+from printsettingstoolbox import PrintSettingsToolbox
+from printernamecombobox import PrinterNameComboBox
diff --git a/ui4/printsettingsdialog_base.ui b/ui4/printsettingsdialog_base.ui
new file mode 100644
index 0000000..2ea3e0e
--- /dev/null
+++ b/ui4/printsettingsdialog_base.ui
@@ -0,0 +1,91 @@
+<ui version="4.0" >
+ <class>Dialog</class>
+ <widget class="QDialog" name="Dialog" >
+ <property name="windowModality" >
+ <enum>Qt::ApplicationModal</enum>
+ </property>
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>700</width>
+ <height>500</height>
+ </rect>
+ </property>
+ <property name="windowTitle" >
+ <string>HP Device Manager - Print Settings</string>
+ </property>
+ <layout class="QGridLayout" >
+ <item row="0" column="0" >
+ <widget class="QLabel" name="TitleLabel" >
+ <property name="font" >
+ <font>
+ <pointsize>16</pointsize>
+ </font>
+ </property>
+ <property name="text" >
+ <string>Print Settings</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" colspan="2" >
+ <widget class="Line" name="line" >
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" colspan="2" >
+ <widget class="PrinterNameComboBox" name="PrinterName" />
+ </item>
+ <item row="3" column="0" colspan="2" >
+ <widget class="PrintSettingsToolbox" name="OptionsToolBox" >
+ <property name="sizePolicy" >
+ <sizepolicy vsizetype="Expanding" hsizetype="Expanding" >
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="currentIndex" >
+ <number>-1</number>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="0" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>461</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="4" column="1" >
+ <widget class="QPushButton" name="CloseButton" >
+ <property name="text" >
+ <string>Close</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <customwidgets>
+ <customwidget>
+ <class>PrinterNameComboBox</class>
+ <extends>QComboBox</extends>
+ <header>printernamecombobox.h</header>
+ </customwidget>
+ <customwidget>
+ <class>PrintSettingsToolbox</class>
+ <extends>QToolBox</extends>
+ <header>printsettingstoolbox.h</header>
+ <container>1</container>
+ </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/ui4/printsettingstoolbox.py b/ui4/printsettingstoolbox.py
new file mode 100644
index 0000000..075fb02
--- /dev/null
+++ b/ui4/printsettingstoolbox.py
@@ -0,0 +1,2013 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2001-2008 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Authors: Don Welch, Yashwant Kumar Sahu, Sanjay Kumar Sharma
+#
+
+# Std Lib
+import sys
+
+# Local
+from base.g import *
+from base import utils
+from prnt import cups
+from base.codes import *
+from ui_utils import *
+
+# Qt
+from PyQt4.QtCore import *
+from PyQt4.QtGui import *
+
+
+
+class RangeValidator(QValidator):
+ def __init__(self, parent=None, name=None):
+ QValidator.__init__(self, parent) #, name)
+
+
+ def validate(self, input, pos):
+ for x in unicode(input)[pos-1:]:
+ if x not in u'0123456789,- ':
+ return QValidator.Invalid, pos
+
+ return QValidator.Acceptable, pos
+
+
+
+class PinValidator(QValidator):
+ def __init__(self, parent=None, name=None):
+ QValidator.__init__(self, parent) #, name)
+
+
+ def validate(self, input, pos):
+ for x in unicode(input)[pos-1:]:
+ if x not in u'0123456789':
+ return QValidator.Invalid, pos
+
+ return QValidator.Acceptable, pos
+
+
+
+class UsernameAndJobnameValidator(QValidator):
+ def __init__(self, parent=None, name=None):
+ QValidator.__init__(self, parent) #, name)
+
+
+ def validate(self, input, pos):
+ for x in unicode(input)[pos-1:]:
+ if x in u' /=,.:;\'"[]{}-+!@#$%^&*()':
+ return QValidator.Invalid, pos
+
+ return QValidator.Acceptable, pos
+
+
+
+class OptionComboBox(QComboBox):
+ def __init__(self, rw, parent, name, group, option, choices, default,
+ typ=cups.PPD_UI_PICKONE, other=None, job_option=False):
+ QComboBox.__init__(self, parent)
+ # rw?
+ self.group = group
+ self.option = option
+ self.choices = choices
+ self.default = default
+ self.typ = typ
+ self.other = other
+ self.job_option = job_option
+ self.setObjectName(name)
+
+
+ def setDefaultPushbutton(self, pushbutton):
+ self.pushbutton = pushbutton
+
+
+ def setOther(self, other):
+ self.other = other
+
+
+
+class OptionSpinBox(QSpinBox):
+ def __init__(self, parent, name, group, option, default, job_option=False):
+ QSpinBox.__init__(self, parent)
+ self.group = group
+ self.option = option
+ self.default = default
+ self.job_option = job_option
+ self.setObjectName(name)
+
+
+ def setDefaultPushbutton(self, pushbutton):
+ self.pushbutton = pushbutton
+
+
+
+class OptionRadioButton(QRadioButton):
+ def __init__(self, parent, name, group, option, default, job_option=False):
+ QRadioButton.__init__(self, parent)
+ self.group = group
+ self.option = option
+ self.default = default
+ self.job_option = job_option
+ self.setObjectName(name)
+
+
+ def setDefaultPushbutton(self, pushbutton):
+ self.pushbutton = pushbutton
+
+
+
+class DefaultPushButton(QPushButton):
+ def __init__(self, parent, name, group, option, choices,
+ default, control, typ, job_option=False):
+ QPushButton.__init__(self, parent)
+ self.group = group
+ self.option = option
+ self.default = default
+ self.control = control
+ self.typ = typ
+ self.choices = choices
+ self.job_option = job_option
+ self.setObjectName(name)
+
+
+#class PageRangeRadioButton(QRadioButton):
+# def __init__(self, parent, page_range_edit):
+# QRadioButton.__init__(self, parent):
+# self.page_range_edit = page_range_edit
+
+
+class PageRangeRadioButton(QRadioButton):
+ def __init__(self, parent, name, group, option, default): #, edit_control=None ):
+ QRadioButton.__init__(self, parent)
+ self.group = group
+ self.option = option
+ self.default = default
+ self.job_option = True
+ self.setObjectName(name)
+
+
+ def setRangeEdit(self, edit_control):
+ self.edit_control = edit_control
+
+
+ def setDefaultPushbutton(self, pushbutton):
+ self.pushbutton = pushbutton
+
+
+
+class PrintSettingsToolbox(QToolBox):
+ def __init__(self, parent, include_job_options=False):
+ QToolBox.__init__(self, parent)
+ self.include_job_options = include_job_options
+ self.plus_icon = QIcon(load_pixmap('plus', '16x16'))
+ self.minus_icon = QIcon(load_pixmap('minus', '16x16'))
+ self.last_item = 0
+ self.job_options = {}
+ self.job_storage_enable = False
+
+ self.connect(self, SIGNAL("currentChanged(int)"), self.PrintSettingsToolbox_currentChanged)
+
+
+ def getPrintCommands(self, file_list=None):
+ # File list: [(path, mime_type, mime_desc, title, num_pages), ...]
+ if file_list is None or not file_list:
+ return []
+
+ print_commands = []
+
+ try:
+ copies = int(self.job_options['copies'])
+ except ValueError:
+ copies = 1
+
+ if copies < 1:
+ copies = 1
+ log.warning("Copies < 1, setting to 1.")
+ elif copies > 99:
+ copies = 99
+ log.warning("Copies > 99, setting to 99.")
+
+ #page_range = unicode(self.pageRangeEdit.text())
+ page_range = self.job_options['pagerange']
+
+ try:
+ x = utils.expand_range(page_range)
+ except ValueError:
+ log.error("Invalid page range: %s" % page_range)
+ return []
+
+ all_pages = not page_range
+ #page_set = int(self.pageSetComboBox.currentItem())
+ page_set = self.job_options['pageset']
+
+ cups.resetOptions()
+ cups.openPPD(self.cur_printer)
+ current_options = dict(cups.getOptions())
+ cups.closePPD()
+
+ nup = int(current_options.get("number-up", 1))
+ psnup = utils.which('psnup')
+
+ for p, t, d, title, num_pages in file_list:
+ alt_nup = (nup > 1 and t == 'application/postscript' and psnup)
+
+ if utils.which('lpr'):
+ if alt_nup:
+ cmd = ' '.join(['psnup', '-%d' % nup, ''.join(['"', p, '"']), '| lpr -P', self.cur_printer])
+ else:
+ cmd = ' '.join(['lpr -P', self.cur_printer])
+
+ if copies > 1:
+ cmd = ' '.join([cmd, '-#%d' % copies])
+
+ else: # lp
+ if alt_nup:
+ cmd = ' '.join(['psnup', '-%d' % nup, ''.join(['"', p, '"']), '| lp -c -d', self.cur_printer])
+ else:
+ cmd = ' '.join(['lp -c -d', self.cur_printer])
+
+ if copies > 1:
+ cmd = ' '.join([cmd, '-n%d' % copies])
+
+
+ if not all_pages and page_range:
+ cmd = ' '.join([cmd, '-o page-ranges=%s' % page_range])
+
+ if page_set:
+ cmd = ' '.join([cmd, '-o page-set=%s' % page_set])
+
+ # Job Storage
+ # self.job_storage_mode = (0=Off, 1=P&H, 2=PJ, 3=QC, 4=SJ)
+ # self.job_storage_pin = u"" (dddd)
+ # self.job_storage_use_pin = True|False
+ # self.job_storage_username = u""
+ # self.job_storage_auto_username = True|False
+ # self.job_storage_jobname = u""
+ # self.job_storage_auto_jobname = True|False
+ # self.job_storage_job_exist = (0=replace, 1=job name+(1-99))
+
+ if self.job_storage_enable:
+ if self.job_storage_mode != JOB_STORAGE_TYPE_OFF:
+ if self.job_storage_mode == JOB_STORAGE_TYPE_PROOF_AND_HOLD:
+ cmd = ' '.join([cmd, '-o HOLD=PROOF'])
+
+ elif self.job_storage_mode == JOB_STORAGE_TYPE_PERSONAL:
+ if self.job_storage_use_pin:
+ cmd = ' '.join([cmd, '-o HOLD=ON'])
+ cmd = ' '.join([cmd, '-o HOLDTYPE=PRIVATE'])
+ cmd = ' '.join([cmd, '-o HOLDKEY=%s' % self.job_storage_pin.encode('ascii')])
+ else:
+ cmd = ' '.join([cmd, '-o HOLD=PROOF'])
+ cmd = ' '.join([cmd, '-o HOLDTYPE=PRIVATE'])
+
+ elif self.job_storage_mode == JOB_STORAGE_TYPE_QUICK_COPY:
+ cmd = ' '.join([cmd, '-o HOLD=ON'])
+ cmd = ' '.join([cmd, '-o HOLDTYPE=PUBLIC'])
+
+ elif self.job_storage_mode == JOB_STORAGE_TYPE_STORE:
+ if self.job_storage_use_pin:
+ cmd = ' '.join([cmd, '-o HOLD=STORE'])
+ cmd = ' '.join([cmd, '-o HOLDTYPE=PRIVATE'])
+ cmd = ' '.join([cmd, '-o HOLDKEY=%s' % self.job_storage_pin.encode('ascii')])
+ else:
+ cmd = ' '.join([cmd, '-o HOLD=STORE'])
+
+ cmd = ' '.join([cmd, '-o USERNAME=%s' % self.job_storage_username.encode('ascii')\
+ .replace(" ", "_")])
+
+ cmd = ' '.join([cmd, '-o JOBNAME=%s' % self.job_storage_jobname.encode('ascii')\
+ .replace(" ", "_")])
+
+ if self.job_storage_job_exist == 1:
+ cmd = ' '.join([cmd, '-o DUPLICATEJOB=APPEND'])
+ else:
+ cmd = ' '.join([cmd, '-o DUPLICATEJOB=REPLACE'])
+
+ else: # Off
+ cmd = ' '.join([cmd, '-o HOLD=OFF'])
+
+ if not alt_nup:
+ cmd = ''.join([cmd, ' "', p, '"'])
+
+ print_commands.append(cmd)
+
+ return print_commands
+
+
+ def PrintSettingsToolbox_currentChanged(self, i):
+ if i != -1:
+ self.setItemIcon(self.last_item, self.plus_icon)
+ self.setItemIcon(i, self.minus_icon)
+ self.last_item = i
+
+
+ def updateUi(self, cur_device, cur_printer):
+ #print "updateUi(%s, %s)" % (cur_device, cur_printer)
+ self.cur_device = cur_device
+ self.cur_printer = cur_printer
+
+ while self.count():
+ self.removeItem(0)
+
+ self.loading = True
+ cups.resetOptions()
+ cups.openPPD(self.cur_printer)
+ cur_outputmode = ""
+
+ try:
+ if 1:
+ #try:
+ current_options = dict(cups.getOptions())
+
+ if self.include_job_options:
+ self.beginControlGroup("job_options", self.__tr("Job Options"))
+
+ # Num. copies (SPINNER)
+ try:
+ current = int(current_options.get('copies', '1'))
+ except ValueError:
+ current = 1
+
+ self.addControlRow("copies", self.__tr("Number of copies"),
+ cups.UI_SPINNER, current, (1, 99), 1, job_option=True)
+ self.job_options['copies'] = current
+
+ # page range RADIO + RANGE (custom)
+ current = current_options.get('pagerange', '')
+
+ self.addControlRow("pagerange", self.__tr("Page Range"),
+ cups.UI_PAGE_RANGE, current, None, None, job_option=True)
+
+ self.job_options['pagerange'] = current
+
+ # page set (COMBO/PICKONE)
+ current = current_options.get('pageset', 'all')
+ self.addControlRow("pageset", self.__tr("Page Set"),
+ cups.PPD_UI_PICKONE, current,
+ [('all', self.__tr("AllPages")),
+ ('even', self.__tr("Even")),
+ ('odd', self.__tr("Odd"))], 'all', job_option=True)
+
+ self.job_options['pageset'] = current
+# if current == u'even':
+# self.job_options["pageset"] = PAGE_SET_EVEN
+# elif current == u'odd':
+# self.job_options["pageset"] = PAGE_SET_ODD
+# else:
+# self.job_options["pageset"] = PAGE_SET_ALL
+
+ self.endControlGroup() # job_options
+
+ if not self.cur_device.device_type == DEVICE_TYPE_FAX:
+ self.beginControlGroup("basic", self.__tr("Basic"))
+
+ # Basic
+ # PageSize (in PPD section)
+ # orientation-requested
+ # sides
+ # outputorder
+ # Collate
+
+ current = current_options.get('orientation-requested', '3')
+
+ self.addControlRow("orientation-requested", self.__tr("Page Orientation"),
+ cups.PPD_UI_PICKONE, current,
+ [('3', self.__tr('Portrait')),
+ ('4', self.__tr('Landscape')),
+ ('5', self.__tr('Reverse landscape')),
+ ('6', self.__tr('Reverse portrait'))], '3')
+
+ log.debug("Option: orientation-requested")
+ log.debug("Current value: %s" % current)
+
+ duplexer = self.cur_device.dq.get('duplexer', 0)
+ log.debug("Duplexer = %d" % duplexer)
+
+ if duplexer:
+ current = current_options.get('sides', 'one-sided')
+ self.addControlRow("sides",
+ self.__tr("Duplex (Print on both sides of the page)"),
+ cups.PPD_UI_PICKONE, current,
+ [('one-sided',self.__tr('Single sided')),
+ ('two-sided-long-edge', self.__tr('Two sided (long edge)')),
+ ('two-sided-short-edge', self.__tr('Two sided (short edge)'))], 'one-sided')
+
+ log.debug("Option: sides")
+ log.debug("Current value: %s" % current)
+
+ current = current_options.get('outputorder', 'normal')
+
+ self.addControlRow("outputorder",
+ self.__tr("Output Order (Print last page first)"),
+ cups.PPD_UI_PICKONE, current,
+ [('normal', self.__tr('Normal (Print first page first)')),
+ ('reverse', self.__tr('Reversed (Print last page first)'))], 'normal')
+
+ log.debug("Option: outputorder")
+ log.debug("Current value: %s" % current)
+
+ current = utils.to_bool(current_options.get('Collate', '0'))
+
+ self.addControlRow("Collate",
+ self.__tr("Collate (Group together multiple copies)"),
+ cups.PPD_UI_BOOLEAN, current,
+ [], 0)
+
+ log.debug("Option: Collate")
+ log.debug("Current value: %s" % current)
+
+ self.endControlGroup()
+
+ groups = cups.getGroupList()
+
+ #print groups
+
+ for g in groups:
+ if 'jobretention' in g.lower():
+ log.debug("HPJobRetention skipped.")
+ continue
+
+ try:
+ text, num_subgroups = cups.getGroup(g)
+ except TypeError:
+ log.warn("Group %s returned None" % g)
+ continue
+
+ read_only = 'install' in g.lower()
+
+ try:
+ text = text.decode('utf-8')
+ except UnicodeDecodeError:
+ pass
+
+ if g.lower() == 'printoutmode':
+ text = self.__tr("Quality (also see 'Printout Mode' under 'General')")
+
+ self.beginControlGroup(g, QString(text))
+
+ log.debug(" Text: %s" % unicode(text))
+ log.debug("Num subgroups: %d" % num_subgroups)
+
+ options = cups.getOptionList(g)
+
+ #print options
+
+ for o in options:
+ log.debug(" Option: %s" % repr(o))
+
+ if 'pageregion' in o.lower():
+ log.debug("Page Region skipped.")
+ continue
+
+ try:
+ option_text, defchoice, conflicted, ui = cups.getOption(g, o)
+ except TypeError:
+ log.warn("Option %s in group %s returned None" % (o, g))
+ continue
+
+ try:
+ option_text = option_text.decode('utf-8')
+ except UnicodeDecodeError:
+ pass
+
+ if o.lower() == 'quality':
+ option_text = self.__tr("Quality")
+
+ log.debug(" Text: %s" % repr(option_text))
+ log.debug(" Defchoice: %s" % repr(defchoice))
+
+ choices = cups.getChoiceList(g, o)
+
+ value = None
+ choice_data = []
+ for c in choices:
+ log.debug(" Choice: %s" % repr(c))
+
+ # TODO: Add custom paper size controls
+ if 'pagesize' in o.lower() and 'custom' in c.lower():
+ log.debug("Skipped.")
+ continue
+
+ choice_text, marked = cups.getChoice(g, o, c)
+
+ try:
+ choice_text = choice_text.decode('utf-8')
+ except UnicodeDecodeError:
+ pass
+
+ log.debug(" Text: %s" % repr(choice_text))
+
+ if marked:
+ value = c
+
+ choice_data.append((c, choice_text))
+
+ if o.lower() == 'outputmode':
+ if value is not None:
+ cur_outputmode = value
+ else:
+ cur_outputmode = defchoice
+
+ self.addControlRow(o, option_text, ui, value, choice_data, defchoice, read_only)
+
+ self.endControlGroup()
+
+## if 'pagesize' in o.lower(): # and 'custom' in c.lower():
+## current = 0.0
+## width_widget = self.addControlRow(widget, "custom", "custom-width", self.__tr("Custom Paper Width"), cups.UI_UNITS_SPINNER,
+## current, (0.0, 0.0), 0.0)
+##
+## current = 0.0
+## height_widget = self.addControlRow("custom", "custom-height", self.__tr("Custom Paper Height"), cups.UI_UNITS_SPINNER,
+## current, (0.0, 0.0), 0.0)
+##
+## if value.lower() == 'custom':
+## pass
+
+ # N-Up
+ # number-up
+ # number-up-layout
+ # page-border
+
+ self.beginControlGroup("nup", self.__tr("N-Up (Multiple document pages per printed page)"))
+ current = current_options.get('number-up', '1')
+
+ self.addControlRow("number-up", self.__tr("Pages per Sheet"),
+ cups.PPD_UI_PICKONE, current,
+ [('1', self.__tr('1 page per sheet')),
+ ('2', self.__tr('2 pages per sheet')),
+ ('4', self.__tr('4 pages per sheet'))], '1')
+
+ log.debug(" Option: number-up")
+ log.debug(" Current value: %s" % current)
+
+ current = current_options.get('number-up-layout', 'lrtb')
+
+ self.addControlRow("number-up-layout", self.__tr("Layout"),
+ cups.PPD_UI_PICKONE, current,
+ [('btlr', self.__tr('Bottom to top, left to right')),
+ ('btrl', self.__tr('Bottom to top, right to left')),
+ ('lrbt', self.__tr('Left to right, bottom to top')),
+ ('lrtb', self.__tr('Left to right, top to bottom')),
+ ('rlbt', self.__tr('Right to left, bottom to top')),
+ ('rltb', self.__tr('Right to left, top to bottom')),
+ ('tblr', self.__tr('Top to bottom, left to right')),
+ ('tbrl', self.__tr('Top to bottom, right to left')) ], 'lrtb')
+
+ log.debug(" Option: number-up-layout")
+ log.debug(" Current value: %s" % current)
+
+ current = current_options.get('page-border', 'none')
+
+ self.addControlRow("page-border",
+ self.__tr("Printed Border Around Each Page"),
+ cups.PPD_UI_PICKONE, current,
+ [('double', self.__tr("Two thin borders")),
+ ("double-thick", self.__tr("Two thick borders")),
+ ("none", self.__tr("No border")),
+ ("single", self.__tr("One thin border")),
+ ("single-thick", self.__tr("One thick border"))], 'none')
+
+ log.debug(" Option: page-border")
+ log.debug(" Current value: %s" % current)
+
+ self.endControlGroup()
+
+ # Adjustment
+ # brightness
+ # gamma
+
+ if not self.cur_device.device_type == DEVICE_TYPE_FAX:
+ self.beginControlGroup("adjustment", self.__tr("Printout Appearance"))
+
+ current = int(current_options.get('brightness', 100))
+
+ log.debug(" Option: brightness")
+ log.debug(" Current value: %s" % current)
+
+ self.addControlRow("brightness", self.__tr("Brightness"),
+ cups.UI_SPINNER, current, (0, 200), 100, suffix=" %")
+
+ current = int(current_options.get('gamma', 1000))
+
+ log.debug(" Option: gamma")
+ log.debug(" Current value: %s" % current)
+
+ self.addControlRow("gamma", self.__tr("Gamma"), cups.UI_SPINNER, current,
+ (1, 10000), 1000)
+
+ self.endControlGroup()
+
+ # Margins (pts)
+ # page-left
+ # page-right
+ # page-top
+ # page-bottom
+
+## if 0:
+## # TODO: cupsPPDPageSize() fails on LaserJets. How do we get margins in this case? Defaults?
+## # PPD file for LJs has a HWMargin entry...
+## page, page_width, page_len, left, bottom, right, top = cups.getPPDPageSize()
+##
+## right = page_width - right
+## top = page_len - top
+##
+## self.addGroupHeading("margins", self.__tr("Margins"))
+## current_top = current_options.get('page-top', 0) # pts
+## current_bottom = current_options.get('page-bottom', 0) # pts
+## current_left = current_options.get('page-left', 0) # pts
+## current_right = current_options.get('page-right', 0) # pts
+##
+## log.debug(" Option: page-top")
+## log.debug(" Current value: %s" % current_top)
+##
+## self.addControlRow("margins", "page-top", self.__tr("Top margin"),
+## cups.UI_UNITS_SPINNER, current_top,
+## (0, page_len), top)
+##
+## self.addControlRow("margins", "page-bottom", self.__tr("Bottom margin"),
+## cups.UI_UNITS_SPINNER, current_bottom,
+## (0, page_len), bottom)
+##
+## self.addControlRow("margins", "page-left", self.__tr("Right margin"),
+## cups.UI_UNITS_SPINNER, current_left,
+## (0, page_width), left)
+##
+## self.addControlRow("margins", "page-right", self.__tr("Left margin"),
+## cups.UI_UNITS_SPINNER, current_right,
+## (0, page_width), right)
+
+ # Image Printing
+ # position
+ # natural-scaling
+ # saturation
+ # hue
+
+ self.beginControlGroup("image", self.__tr("Image Printing"))
+
+ current = utils.to_bool(current_options.get('fitplot', 'false'))
+
+ self.addControlRow("fitplot",
+ self.__tr("Fit to Page"),
+ cups.PPD_UI_BOOLEAN, current,
+ [], 0)
+
+ current = current_options.get('position', 'center')
+
+ self.addControlRow("position", self.__tr("Position on Page"),
+ cups.PPD_UI_PICKONE, current,
+ [('center', self.__tr('Centered')),
+ ('top', self.__tr('Top')),
+ ('left', self.__tr('Left')),
+ ('right', self.__tr('Right')),
+ ('top-left', self.__tr('Top left')),
+ ('top-right', self.__tr('Top right')),
+ ('bottom', self.__tr('Bottom')),
+ ('bottom-left', self.__tr('Bottom left')),
+ ('bottom-right', self.__tr('Bottom right'))], 'center')
+
+ log.debug(" Option: position")
+ log.debug(" Current value: %s" % current)
+
+ if not self.cur_device.device_type == DEVICE_TYPE_FAX:
+ current = int(current_options.get('saturation', 100))
+
+ log.debug(" Option: saturation")
+ log.debug(" Current value: %s" % current)
+
+ self.addControlRow("saturation", self.__tr("Saturation"),
+ cups.UI_SPINNER, current, (0, 200), 100, suffix=" %")
+
+ current = int(current_options.get('hue', 0))
+
+ log.debug(" Option: hue")
+ log.debug(" Current value: %s" % current)
+
+ self.addControlRow("hue", self.__tr("Hue (color shift/rotation)"),
+ cups.UI_SPINNER, current,
+ (-100, 100), 0)
+
+ current = int(current_options.get('natural-scaling', 100))
+
+ log.debug(" Option: natural-scaling")
+ log.debug(" Current value: %s" % current)
+
+ self.addControlRow("natural-scaling",
+ self.__tr('"Natural" Scaling (relative to image)'),
+ cups.UI_SPINNER, current, (1, 800), 100, suffix=" %")
+
+ current = int(current_options.get('scaling', 100))
+
+ log.debug(" Option: scaling")
+ log.debug(" Current value: %s" % current)
+
+ self.addControlRow("scaling", self.__tr("Scaling (relative to page)"),
+ cups.UI_SPINNER, current,
+ (1, 800), 100, suffix=" %")
+
+ self.endControlGroup()
+
+ # Misc
+ # PrettyPrint
+ # job-sheets
+ # mirror
+
+ self.beginControlGroup("misc", self.__tr("Miscellaneous"))
+
+ log.debug("Group: Misc")
+
+ current = utils.to_bool(current_options.get('prettyprint', '0'))
+
+ self.addControlRow("prettyprint",
+ self.__tr('"Pretty Print" Text Documents (Add headers and formatting)'),
+ cups.PPD_UI_BOOLEAN, current, [], 0)
+
+ log.debug(" Option: prettyprint")
+ log.debug(" Current value: %s" % current)
+
+ if not self.cur_device.device_type == DEVICE_TYPE_FAX:
+ current = current_options.get('job-sheets', 'none').split(',')
+
+ try:
+ start = current[0]
+ except IndexError:
+ start = 'none'
+
+ try:
+ end = current[1]
+ except IndexError:
+ end = 'none'
+
+ # TODO: Look for locally installed banner pages beyond the default CUPS ones?
+ self.addControlRow("job-sheets", self.__tr("Banner Pages"), cups.UI_BANNER_JOB_SHEETS,
+ (start, end),
+ [("none", self.__tr("No banner page")),
+ ('classified', self.__tr("Classified")),
+ ('confidential', self.__tr("Confidential")),
+ ('secret', self.__tr("Secret")),
+ ('standard', self.__tr("Standard")),
+ ('topsecret', self.__tr("Top secret")),
+ ('unclassified', self.__tr("Unclassified"))], ('none', 'none'))
+
+ log.debug(" Option: job-sheets")
+ log.debug(" Current value: %s,%s" % (start, end))
+
+ current = utils.to_bool(current_options.get('mirror', '0'))
+
+ self.addControlRow("mirror", self.__tr('Mirror Printing'),
+ cups.PPD_UI_BOOLEAN, current, [], 0)
+
+ log.debug(" Option: mirror")
+ log.debug(" Current value: %s" % current)
+
+ self.endControlGroup()
+
+ #Summary
+ #color input
+ #quality
+ quality_attr_name = "OutputModeDPI"
+ cur_outputmode_dpi = cups.findPPDAttribute(quality_attr_name, cur_outputmode)
+ if cur_outputmode_dpi is not None:
+ log.debug("Adding Group: Summary outputmode is : %s" % cur_outputmode)
+ log.debug("Adding Group: Summary outputmode dpi is : %s" % unicode (cur_outputmode_dpi))
+ self.beginControlGroup("sumry", self.__tr("Summary"))
+ self.addControlRow("colorinput", self.__tr('Color Input / Black Render'),
+ cups.UI_INFO, unicode (cur_outputmode_dpi), [], read_only)
+ self.addControlRow("quality", self.__tr('Print Quality'),
+ cups.UI_INFO, cur_outputmode, [], read_only)
+ self.endControlGroup()
+ log.debug("End adding Group: Summary")
+
+
+ self.job_storage_enable = self.cur_device.mq.get('job-storage', JOB_STORAGE_DISABLE) == JOB_STORAGE_ENABLE
+
+
+ if self.job_storage_enable:
+ self.job_storage_pin = unicode(current_options.get('HOLDKEY', '0000')[:4])
+ self.job_storage_username = unicode(current_options.get('USERNAME', prop.username)[:16])
+ self.job_storage_jobname = unicode(current_options.get('JOBNAME', u'Untitled')[:16])
+ hold = unicode(current_options.get('HOLD', u'OFF'))
+ holdtype = unicode(current_options.get('HOLDTYPE', u'PUBLIC'))
+ self.job_storage_use_pin = False
+ duplicate = unicode(current_options.get('DUPLICATEJOB', u'REPLACE'))
+ self.job_storage_auto_username = True
+ self.job_storage_auto_jobname = True
+ self.job_storage_mode = JOB_STORAGE_TYPE_OFF
+
+ if hold == 'OFF':
+ self.job_storage_mode = JOB_STORAGE_TYPE_OFF
+
+ elif hold == 'ON':
+ if holdtype == u'PUBLIC':
+ self.job_storage_mode = JOB_STORAGE_TYPE_QUICK_COPY
+
+ else: # 'PRIVATE'
+ self.job_storage_mode = JOB_STORAGE_TYPE_PERSONAL
+ self.job_storage_use_pin = True
+
+ elif hold == u'PROOF':
+ if holdtype == u'PUBLIC':
+ self.job_storage_mode = JOB_STORAGE_TYPE_PROOF_AND_HOLD
+ else:
+ self.job_storage_mode = JOB_STORAGE_TYPE_PERSONAL
+ self.job_storage_use_pin = True
+
+ elif hold == u'STORE':
+ self.job_storage_mode = JOB_STORAGE_TYPE_STORE
+ self.job_storage_use_pin = (holdtype == u'PRIVATE')
+
+ if duplicate == u'REPLACE':
+ self.job_storage_job_exist = JOB_STORAGE_EXISTING_JOB_REPLACE
+ else: # u'APPEND'
+ self.job_storage_job_exist = JOB_STORAGE_EXISTING_JOB_APPEND_1_99
+
+ # option, text, typ, value, choices, default, read_only=False, suffix="", job_option=False)
+
+ self.beginControlGroup("jobstorage", self.__tr("Job Storage and Secure Printing"))
+
+ self.addControlRow("job-storage-mode", self.__tr("Mode"),
+ cups.UI_JOB_STORAGE_MODE, None, None, None)
+
+ self.addControlRow("job-storage-pin", self.__tr("Make job private (use PIN to print)"),
+ cups.UI_JOB_STORAGE_PIN, None, None, None )
+
+ self.addControlRow("job-storage-username", self.__tr("User name (for job identification)"),
+ cups.UI_JOB_STORAGE_USERNAME, None, None, None)
+
+ self.addControlRow("job-storage-id", self.__tr("Job name/ID (for job identification)"),
+ cups.UI_JOB_STORAGE_ID, None, None, None)
+
+ self.addControlRow("job-storage-id-exists", self.__tr("If job name/ID already exists..."),
+ cups.UI_JOB_STORAGE_ID_EXISTS, None, None, None)
+
+ self.endControlGroup()
+ self.updateJobStorageControls()
+
+ # use: self.job_options['xxx'] so that values can be picked up by getPrintCommand(
+
+
+ #except Exception, e:
+ #log.exception()
+ # pass
+
+ finally:
+ cups.closePPD()
+ self.loading = False
+
+
+ def beginControlGroup(self, group, text):
+ log.debug("BeginGroup: %s" % group)
+ self.row = 0
+ self.widget = QWidget()
+ self.gridlayout = QGridLayout(self.widget)
+ self.group = group
+ self.text = text
+
+
+ def endControlGroup(self):
+ log.debug("EndGroup: %s" % self.group)
+ spacer = QSpacerItem(20, 20, QSizePolicy.Minimum, QSizePolicy.Expanding)
+ self.row += 1
+ self.gridlayout.addItem(spacer, self.row, 0, 1, 1)
+ i = self.addItem(self.widget, self.text)
+
+ if i:
+ self.setItemIcon(i, self.plus_icon)
+ else:
+ self.setItemIcon(i, self.minus_icon)
+
+ self.widget, self.gridlayout = None, None
+
+
+ def addControlRow(self, option, text, typ, value, choices, default, read_only=False, suffix="", job_option=False):
+
+ if typ == cups.PPD_UI_BOOLEAN: # () On (*) Off widget
+ HBoxLayout = QHBoxLayout()
+ HBoxLayout.setObjectName("HBoxLayout")
+
+ OptionLabel = QLabel(self.widget)
+ OptionLabel.setObjectName("OptionLabel")
+ HBoxLayout.addWidget(OptionLabel)
+
+ SpacerItem = QSpacerItem(20, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
+ HBoxLayout.addItem(SpacerItem)
+
+ GroupBox = QFrame(self.widget)
+
+ gridlayout1 = QGridLayout(GroupBox)
+ OnRadioButton = OptionRadioButton(GroupBox, "OnRadioButton", self.group,
+ option, default, job_option)
+ gridlayout1.addWidget(OnRadioButton,0,0,1,1)
+ OffRadioButton = OptionRadioButton(GroupBox, "OffRadioButton", self.group,
+ option, default, job_option)
+ gridlayout1.addWidget(OffRadioButton,0,1,1,1)
+ HBoxLayout.addWidget(GroupBox)
+
+ DefaultButton = DefaultPushButton(self.widget, "defaultPushButton", self.group, option,
+ choices, default, (OnRadioButton, OffRadioButton), typ, job_option)
+
+ #GroupBox.setDefaultPushbutton(DefaultButton)
+ OnRadioButton.setDefaultPushbutton(DefaultButton)
+ OffRadioButton.setDefaultPushbutton(DefaultButton)
+
+ HBoxLayout.addWidget(DefaultButton)
+ self.gridlayout.addLayout(HBoxLayout, self.row, 0, 1, 1)
+
+ OptionLabel.setText(text)
+ OnRadioButton.setText(self.__tr("On"))
+ OffRadioButton.setText(self.__tr("Off"))
+
+ DefaultButton.setText("Default")
+
+ if value == default:
+ DefaultButton.setEnabled(False)
+ self.connect(DefaultButton, SIGNAL("clicked()"), self.DefaultButton_clicked)
+
+ if value:
+ OnRadioButton.setChecked(True)
+ else:
+ OffRadioButton.setChecked(True)
+ self.connect(OnRadioButton, SIGNAL("toggled(bool)"), self.BoolRadioButtons_clicked)
+
+ if read_only:
+ OnRadioButton.setEnabled(False)
+ OffRadioButton.setEnabled(False)
+ DefaultButton.setEnabled(False)
+
+
+
+ elif typ == cups.PPD_UI_PICKONE: # Combo box widget
+ #print option, job_option
+ HBoxLayout = QHBoxLayout()
+ HBoxLayout.setObjectName("HBoxLayout")
+
+ OptionLabel = QLabel(self.widget)
+ OptionLabel.setObjectName("OptionLabel")
+ HBoxLayout.addWidget(OptionLabel)
+
+ SpacerItem = QSpacerItem(20, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
+ HBoxLayout.addItem(SpacerItem)
+
+ ComboBox = OptionComboBox(0, self.widget, "ComboBox", self.group, option,
+ choices, default, typ, None, job_option)
+
+ HBoxLayout.addWidget(ComboBox)
+
+ DefaultButton = DefaultPushButton(self.widget, "DefaultButton", self.group, option,
+ choices, default, ComboBox, typ, job_option)
+
+ ComboBox.setDefaultPushbutton(DefaultButton)
+ HBoxLayout.addWidget(DefaultButton)
+
+ self.gridlayout.addLayout(HBoxLayout, self.row, 0, 1, 1)
+
+ OptionLabel.setText(text)
+ DefaultButton.setText("Default")
+
+ i, x, y = 0, None, None
+ for c, t in choices:
+ d = c.lower()
+ if value is not None and d == value.lower():
+ x = i
+
+ if d == default.lower():
+ y = t
+
+ ComboBox.insertItem(i, t)
+ i += 1
+
+ if x is not None:
+ ComboBox.setCurrentIndex(x)
+ else:
+ ComboBox.setCurrentIndex(0)
+
+ if value is not None and value.lower() == default.lower():
+ DefaultButton.setEnabled(False)
+
+ #self.linkPrintoutModeAndQuality(option, value)
+#
+# if read_only:
+# optionComboBox.setEnabled(False)
+# defaultPushButton.setEnabled(False)
+# elif y is not None:
+# QToolTip.add(defaultPushButton, self.__tr('Set to default value of "%1".').arg(y))
+#
+
+ self.connect(DefaultButton, SIGNAL("clicked()"), self.DefaultButton_clicked)
+ self.connect(ComboBox, SIGNAL("currentIndexChanged(const QString &)"), self.ComboBox_indexChanged)
+ self.connect(ComboBox, SIGNAL("highlighted(const QString &)"), self.ComboBox_highlighted)
+
+ control = ComboBox
+
+ elif typ == cups.UI_SPINNER: # Spinner widget
+
+ HBoxLayout = QHBoxLayout()
+ HBoxLayout.setObjectName("HBoxLayout")
+
+ OptionLabel = QLabel(self.widget)
+ OptionLabel.setObjectName("OptionLabel")
+ HBoxLayout.addWidget(OptionLabel)
+
+ SpacerItem = QSpacerItem(20, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
+ HBoxLayout.addItem(SpacerItem)
+
+ SpinBox = OptionSpinBox(self.widget,"SpinBox", self.group, option, default, job_option)
+ HBoxLayout.addWidget(SpinBox)
+
+ DefaultButton = DefaultPushButton(self.widget,"DefaultButton", self.group, option,
+ choices, default, SpinBox, typ, job_option)
+
+ SpinBox.setDefaultPushbutton(DefaultButton)
+ HBoxLayout.addWidget(DefaultButton)
+
+ self.gridlayout.addLayout(HBoxLayout, self.row, 0, 1, 1)
+
+ min, max = choices
+ SpinBox.setMinimum(min)
+ SpinBox.setMaximum(max)
+ SpinBox.setValue(value)
+
+ if suffix:
+ SpinBox.setSuffix(suffix)
+
+ OptionLabel.setText(text)
+ DefaultButton.setText("Default")
+
+ self.connect(SpinBox, SIGNAL("valueChanged(int)"), self.SpinBox_valueChanged)
+ self.connect(DefaultButton, SIGNAL("clicked()"), self.DefaultButton_clicked)
+
+ DefaultButton.setEnabled(not value == default)
+
+ if read_only:
+ SpinBox.setEnabled(False)
+ DefaultButton.setEnabled(False)
+
+ elif typ == cups.UI_BANNER_JOB_SHEETS: # Job sheets widget
+ HBoxLayout = QHBoxLayout()
+ HBoxLayout.setObjectName("HBoxLayout")
+
+ OptionLabel = QLabel(self.widget)
+ OptionLabel.setObjectName("OptionLabel")
+ HBoxLayout.addWidget(OptionLabel)
+
+ SpacerItem = QSpacerItem(20, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
+ HBoxLayout.addItem(SpacerItem)
+
+ StartLabel = QLabel(self.widget)
+ HBoxLayout.addWidget(StartLabel)
+
+ StartComboBox = OptionComboBox(0, self.widget, "StartComboBox", self.group,
+ "start", choices, default, typ)
+
+ HBoxLayout.addWidget(StartComboBox)
+
+ EndLabel = QLabel(self.widget)
+ HBoxLayout.addWidget(EndLabel)
+
+ EndComboBox = OptionComboBox(0, self.widget, "EndComboBox", self.group, "end", choices,
+ default, typ, StartComboBox)
+
+ HBoxLayout.addWidget(EndComboBox)
+
+ StartComboBox.setOther(EndComboBox)
+
+ DefaultButton = DefaultPushButton(self.widget, "DefaultButton", self.group, option, choices,
+ default, (StartComboBox, EndComboBox), typ, job_option)
+
+ HBoxLayout.addWidget(DefaultButton)
+
+ self.gridlayout.addLayout(HBoxLayout, self.row, 0, 1, 1)
+
+ StartComboBox.setDefaultPushbutton(DefaultButton)
+ EndComboBox.setDefaultPushbutton(DefaultButton)
+
+ OptionLabel.setText(text)
+ DefaultButton.setText("Default")
+
+ StartLabel.setText(self.__tr("Start:"))
+ EndLabel.setText(self.__tr("End:"))
+
+ s, e, y, z = None, None, None, None
+ for c, t in choices:
+ d = c.lower()
+ if value is not None:
+ if d == value[0].lower():
+ s = t
+
+ if d == value[1].lower():
+ e = t
+
+ if d == default[0].lower():
+ y = t
+
+ if d == default[1].lower():
+ z = t
+
+ StartComboBox.insertItem(0, t)
+ EndComboBox.insertItem(0, t)
+
+ if s is not None:
+ StartComboBox.setCurrentIndex(StartComboBox.findText(s))
+
+ if e is not None:
+ EndComboBox.setCurrentIndex(EndComboBox.findText(e))
+
+ if value is not None and \
+ value[0].lower() == default[0].lower() and \
+ value[1].lower() == default[1].lower():
+
+ DefaultButton.setEnabled(False)
+
+ self.connect(StartComboBox, SIGNAL("activated(const QString&)"), self.BannerComboBox_activated)
+ self.connect(EndComboBox, SIGNAL("activated(const QString&)"), self.BannerComboBox_activated)
+ self.connect(DefaultButton, SIGNAL("clicked()"), self.DefaultButton_clicked)
+
+ elif typ == cups.PPD_UI_PICKMANY:
+ log.error("Unrecognized type: pickmany")
+
+ elif typ == cups.UI_UNITS_SPINNER:
+ log.error("Unrecognized type: units spinner")
+
+ elif typ == cups.UI_PAGE_RANGE:
+ HBoxLayout = QHBoxLayout()
+ HBoxLayout.setObjectName("HBoxLayout")
+
+ OptionLabel = QLabel(self.widget)
+ OptionLabel.setObjectName("OptionLabel")
+ HBoxLayout.addWidget(OptionLabel)
+
+ SpacerItem = QSpacerItem(20, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
+ HBoxLayout.addItem(SpacerItem)
+
+ GroupBox = QFrame(self.widget)
+
+ gridlayout1 = QGridLayout(GroupBox)
+
+ AllRadioButton = PageRangeRadioButton(GroupBox, "AllRadioButton",
+ self.group, option, default)
+
+ gridlayout1.addWidget(AllRadioButton,0,0,1,1)
+ RangeRadioButton = PageRangeRadioButton(GroupBox, "RangeRadioButton",
+ self.group, option, default)
+
+ gridlayout1.addWidget(RangeRadioButton,0,1,1,1)
+ HBoxLayout.addWidget(GroupBox)
+
+ PageRangeEdit = QLineEdit(self.widget)
+ HBoxLayout.addWidget(PageRangeEdit)
+ PageRangeEdit.setValidator(RangeValidator(PageRangeEdit))
+
+ AllRadioButton.setRangeEdit(PageRangeEdit)
+ RangeRadioButton.setRangeEdit(PageRangeEdit)
+
+ DefaultButton = DefaultPushButton(self.widget, "defaultPushButton", self.group, option,
+ choices, default, (AllRadioButton, RangeRadioButton, PageRangeEdit), typ, job_option)
+
+ AllRadioButton.setDefaultPushbutton(DefaultButton)
+ RangeRadioButton.setDefaultPushbutton(DefaultButton)
+
+ HBoxLayout.addWidget(DefaultButton)
+ self.gridlayout.addLayout(HBoxLayout, self.row, 0, 1, 1)
+
+ OptionLabel.setText(text)
+ AllRadioButton.setText(self.__tr("All pages"))
+ RangeRadioButton.setText(self.__tr("Page Range:"))
+
+ DefaultButton.setText("Default")
+ DefaultButton.setEnabled(False)
+
+ AllRadioButton.setChecked(True)
+ PageRangeEdit.setEnabled(False)
+
+ # TODO: Set current
+
+ self.connect(AllRadioButton, SIGNAL("toggled(bool)"), self.PageRangeAllRadio_toggled)
+ self.connect(RangeRadioButton, SIGNAL("toggled(bool)"), self.PageRangeRangeRadio_toggled)
+ self.connect(DefaultButton, SIGNAL("clicked()"), self.DefaultButton_clicked)
+ self.connect(PageRangeEdit, SIGNAL("textChanged(const QString &)"), self.PageRangeEdit_textChanged)
+ self.connect(PageRangeEdit, SIGNAL("editingFinished()"), self.PageRangeEdit_editingFinished)
+
+ elif typ == cups.UI_JOB_STORAGE_MODE:
+ HBoxLayout = QHBoxLayout()
+ HBoxLayout.setObjectName("HBoxLayout")
+
+ OptionLabel = QLabel(self.widget)
+ OptionLabel.setObjectName("OptionLabel")
+ HBoxLayout.addWidget(OptionLabel)
+
+ SpacerItem = QSpacerItem(20, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
+ HBoxLayout.addItem(SpacerItem)
+
+ self.JobStorageModeComboBox = QComboBox(self.widget)
+ HBoxLayout.addWidget(self.JobStorageModeComboBox)
+
+ self.JobStorageModeDefaultButton = QPushButton(self.widget)
+ HBoxLayout.addWidget(self.JobStorageModeDefaultButton)
+
+ self.gridlayout.addLayout(HBoxLayout, self.row, 0, 1, 1)
+
+ OptionLabel.setText(text)
+ self.JobStorageModeDefaultButton.setText(self.__tr("Default"))
+
+ self.JobStorageModeComboBox.addItem(self.__tr("Off/Disabled"), QVariant(JOB_STORAGE_TYPE_OFF))
+ self.JobStorageModeComboBox.addItem(self.__tr("Proof and Hold"), QVariant(JOB_STORAGE_TYPE_PROOF_AND_HOLD))
+ self.JobStorageModeComboBox.addItem(self.__tr("Personal/Private Job"), QVariant(JOB_STORAGE_TYPE_PERSONAL))
+ self.JobStorageModeComboBox.addItem(self.__tr("Quick Copy"), QVariant(JOB_STORAGE_TYPE_QUICK_COPY))
+ self.JobStorageModeComboBox.addItem(self.__tr("Stored Job"), QVariant(JOB_STORAGE_TYPE_STORE))
+
+ self.connect(self.JobStorageModeComboBox, SIGNAL("activated(int)"),
+ self.JobStorageModeComboBox_activated)
+
+ self.connect(self.JobStorageModeDefaultButton, SIGNAL("clicked()"),
+ self.JobStorageModeDefaultButton_clicked)
+
+
+ elif typ == cups.UI_JOB_STORAGE_PIN:
+ HBoxLayout = QHBoxLayout()
+ HBoxLayout.setObjectName("HBoxLayout")
+
+ OptionLabel = QLabel(self.widget)
+ OptionLabel.setObjectName("OptionLabel")
+ HBoxLayout.addWidget(OptionLabel)
+
+ SpacerItem = QSpacerItem(20, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
+ HBoxLayout.addItem(SpacerItem)
+
+ self.JobStoragePinGroupBox = QFrame(self.widget)
+
+ gridlayout1 = QGridLayout(self.JobStoragePinGroupBox)
+ self.JobStoragePinOffRadioButton = QRadioButton(self.JobStoragePinGroupBox)
+ gridlayout1.addWidget(self.JobStoragePinOffRadioButton, 0, 0, 1, 1)
+
+ self.JobStoragePinPrivateRadioButton = QRadioButton(self.JobStoragePinGroupBox)
+ gridlayout1.addWidget(self.JobStoragePinPrivateRadioButton, 0, 1, 1, 1)
+
+ self.JobStoragePinEdit = QLineEdit(self.JobStoragePinGroupBox)
+ self.JobStoragePinEdit.setMaxLength(4)
+ self.JobStoragePinEdit.setValidator(PinValidator(self.JobStoragePinEdit))
+ gridlayout1.addWidget(self.JobStoragePinEdit, 0, 2, 1, 1)
+
+ HBoxLayout.addWidget(self.JobStoragePinGroupBox)
+
+ self.JobStoragePinDefaultButton = QPushButton(self.widget)
+ HBoxLayout.addWidget(self.JobStoragePinDefaultButton)
+
+ self.JobStoragePinOffRadioButton.setText(self.__tr("Public/Off"))
+ self.JobStoragePinPrivateRadioButton.setText(self.__tr("Private/Use PIN:"))
+
+ self.gridlayout.addLayout(HBoxLayout, self.row, 0, 1, 1)
+
+ OptionLabel.setText(text)
+ self.JobStoragePinDefaultButton.setText(self.__tr("Default"))
+
+ self.connect(self.JobStoragePinOffRadioButton, SIGNAL("toggled(bool)"),
+ self.JobStoragePinOffRadioButton_toggled)
+
+ self.connect(self.JobStoragePinPrivateRadioButton, SIGNAL("toggled(bool)"),
+ self.JobStoragePinPrivateRadioButton_toggled)
+
+ self.connect(self.JobStoragePinDefaultButton, SIGNAL("clicked()"),
+ self.JobStoragePinDefaultButton_clicked)
+
+ self.connect(self.JobStoragePinEdit, SIGNAL("textEdited(const QString &)"),
+ self.JobStoragePinEdit_textEdited)
+
+
+ elif typ == cups.UI_JOB_STORAGE_USERNAME:
+ HBoxLayout = QHBoxLayout()
+ HBoxLayout.setObjectName("HBoxLayout")
+
+ OptionLabel = QLabel(self.widget)
+ OptionLabel.setObjectName("OptionLabel")
+ HBoxLayout.addWidget(OptionLabel)
+ OptionLabel.setText(text)
+
+ SpacerItem = QSpacerItem(20, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
+ HBoxLayout.addItem(SpacerItem)
+
+ self.JobStorageUsernameGroupBox = QFrame(self.widget)
+
+ gridlayout1 = QGridLayout(self.JobStorageUsernameGroupBox)
+ self.JobStorageUsernameAutoRadioButton = QRadioButton(self.JobStorageUsernameGroupBox)
+ gridlayout1.addWidget(self.JobStorageUsernameAutoRadioButton, 0, 0, 1, 1)
+
+ self.JobStorageUsernameCustomRadioButton = QRadioButton(self.JobStorageUsernameGroupBox)
+ gridlayout1.addWidget(self.JobStorageUsernameCustomRadioButton, 0, 1, 1, 1)
+
+ self.JobStorageUsernameEdit = QLineEdit(self.JobStorageUsernameGroupBox)
+ self.JobStorageUsernameEdit.setValidator(UsernameAndJobnameValidator(self.JobStorageUsernameEdit))
+ self.JobStorageUsernameEdit.setMaxLength(16)
+ gridlayout1.addWidget(self.JobStorageUsernameEdit, 0, 2, 1, 1)
+
+ HBoxLayout.addWidget(self.JobStorageUsernameGroupBox)
+
+ self.JobStorageUsernameDefaultButton = QPushButton(self.widget)
+ HBoxLayout.addWidget(self.JobStorageUsernameDefaultButton)
+
+ self.JobStorageUsernameAutoRadioButton.setText(self.__tr("Automatic"))
+ self.JobStorageUsernameCustomRadioButton.setText(self.__tr("Custom:"))
+ self.JobStorageUsernameDefaultButton.setText(self.__tr("Default"))
+
+ self.connect(self.JobStorageUsernameAutoRadioButton, SIGNAL("toggled(bool)"),
+ self.JobStorageUsernameAutoRadioButton_toggled)
+
+ self.connect(self.JobStorageUsernameCustomRadioButton, SIGNAL("toggled(bool)"),
+ self.JobStorageUsernameCustomRadioButton_toggled)
+
+ self.connect(self.JobStorageUsernameDefaultButton, SIGNAL("clicked()"),
+ self.JobStorageUsernameDefaultButton_clicked)
+
+ self.connect(self.JobStorageUsernameEdit, SIGNAL("textEdited(const QString &)"),
+ self.JobStorageUsernameEdit_textEdited)
+
+ self.gridlayout.addLayout(HBoxLayout, self.row, 0, 1, 1)
+
+ elif typ == cups.UI_JOB_STORAGE_ID:
+ HBoxLayout = QHBoxLayout()
+ HBoxLayout.setObjectName("HBoxLayout")
+
+ OptionLabel = QLabel(self.widget)
+ OptionLabel.setObjectName("OptionLabel")
+ HBoxLayout.addWidget(OptionLabel)
+ OptionLabel.setText(text)
+
+ SpacerItem = QSpacerItem(20, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
+ HBoxLayout.addItem(SpacerItem)
+
+ self.JobStorageIDGroupBox = QFrame(self.widget)
+
+ gridlayout1 = QGridLayout(self.JobStorageIDGroupBox)
+ self.JobStorageIDAutoRadioButton = QRadioButton(self.JobStorageIDGroupBox)
+ gridlayout1.addWidget(self.JobStorageIDAutoRadioButton, 0, 0, 1, 1)
+
+ self.JobStorageIDCustomRadioButton = QRadioButton(self.JobStorageIDGroupBox)
+ gridlayout1.addWidget(self.JobStorageIDCustomRadioButton, 0, 1, 1, 1)
+
+ self.JobStorageIDEdit = QLineEdit(self.JobStorageIDGroupBox)
+ self.JobStorageIDEdit.setValidator(UsernameAndJobnameValidator(self.JobStorageIDEdit))
+ self.JobStorageIDEdit.setMaxLength(16)
+ gridlayout1.addWidget(self.JobStorageIDEdit, 0, 2, 1, 1)
+
+ HBoxLayout.addWidget(self.JobStorageIDGroupBox)
+
+ self.JobStorageIDDefaultButton = QPushButton(self.widget)
+ HBoxLayout.addWidget(self.JobStorageIDDefaultButton)
+
+ self.JobStorageIDAutoRadioButton.setText(self.__tr("Automatic"))
+ self.JobStorageIDCustomRadioButton.setText(self.__tr("Custom:"))
+ self.JobStorageIDDefaultButton.setText(self.__tr("Default"))
+
+ self.connect(self.JobStorageIDAutoRadioButton, SIGNAL("toggled(bool)"),
+ self.JobStorageIDAutoRadioButton_toggled)
+
+ self.connect(self.JobStorageIDCustomRadioButton, SIGNAL("toggled(bool)"),
+ self.JobStorageIDCustomRadioButton_toggled)
+
+ self.connect(self.JobStorageIDDefaultButton, SIGNAL("clicked()"),
+ self.JobStorageIDDefaultButton_clicked)
+
+ self.connect(self.JobStorageIDEdit, SIGNAL("textEdited(const QString &)"),
+ self.JobStorageIDEdit_textEdited)
+
+ self.gridlayout.addLayout(HBoxLayout, self.row, 0, 1, 1)
+
+ elif typ == cups.UI_JOB_STORAGE_ID_EXISTS:
+ HBoxLayout = QHBoxLayout()
+ HBoxLayout.setObjectName("HBoxLayout")
+
+ OptionLabel = QLabel(self.widget)
+ OptionLabel.setObjectName("OptionLabel")
+ HBoxLayout.addWidget(OptionLabel)
+ OptionLabel.setText(text)
+
+ SpacerItem = QSpacerItem(20, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
+ HBoxLayout.addItem(SpacerItem)
+
+ self.JobStorageExistingComboBox = QComboBox(self.widget)
+ HBoxLayout.addWidget(self.JobStorageExistingComboBox)
+
+ self.JobStorageExistingDefaultButton = QPushButton(self.widget)
+ HBoxLayout.addWidget(self.JobStorageExistingDefaultButton)
+
+ self.JobStorageExistingComboBox.addItem(self.__tr("Replace existing job"),
+ QVariant(JOB_STORAGE_EXISTING_JOB_REPLACE))
+
+ self.JobStorageExistingComboBox.addItem(self.__tr("Use job name appended with 1-99"),
+ QVariant(JOB_STORAGE_EXISTING_JOB_APPEND_1_99))
+
+ self.JobStorageExistingDefaultButton.setText(self.__tr("Default"))
+
+ self.gridlayout.addLayout(HBoxLayout, self.row, 0, 1, 1)
+
+ self.connect(self.JobStorageExistingComboBox, SIGNAL("activated(int)"),
+ self.JobStorageExistingComboBox_activated)
+
+ self.connect(self.JobStorageExistingDefaultButton, SIGNAL("clicked()"),
+ self.JobStorageExistingDefaultButton_clicked)
+
+ elif typ == cups.UI_INFO:
+ HBoxLayout = QHBoxLayout()
+ HBoxLayout.setObjectName("HBoxLayout")
+
+ OptionName = QLabel(self.widget)
+ OptionName.setObjectName("OptionLabel")
+ HBoxLayout.addWidget(OptionName)
+ OptionName.setText(text)
+
+ SpacerItem = QSpacerItem(20, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
+ HBoxLayout.addItem(SpacerItem)
+
+ if text == 'Print Quality':
+ self.PQValueLabel = QLabel(self.widget)
+ self.PQValueLabel.setObjectName("PQValueLabel")
+ HBoxLayout.addWidget(self.PQValueLabel)
+ self.PQValueLabel.setText(value)
+ elif text == 'Color Input / Black Render':
+ self.PQColorInputLabel = QLabel(self.widget)
+ self.PQColorInputLabel.setObjectName("PQColorInputLabel")
+ HBoxLayout.addWidget(self.PQColorInputLabel)
+ self.PQColorInputLabel.setText(value)
+ else:
+ OptionValue = QLabel(self.widget)
+ OptionValue.setObjectName("OptionValue")
+ HBoxLayout.addWidget(OptionValue)
+ OptionValue.setText(value)
+
+ self.gridlayout.addLayout(HBoxLayout, self.row, 0, 1, 1)
+
+ else:
+ log.error("Invalid UI value: %s/%s" % (self.group, option))
+
+ self.row += 1
+
+
+
+ def BannerComboBox_activated(self, a): # cups.UI_BANNER_JOB_SHEETS
+ a = unicode(a)
+ sender = self.sender()
+ choice = None
+
+ start, end = None, None
+ for c, t in sender.choices:
+ if t == a:
+ start = c
+ break
+
+ for c, t in sender.other.choices:
+ if t == sender.other.currentText():
+ end = c
+ break
+
+ if sender.option == 'end':
+ start, end = end, start
+
+ if start is not None and \
+ end is not None and \
+ start.lower() == sender.default[0].lower() and \
+ end.lower() == sender.default[1].lower():
+ self.removePrinterOption('job-sheets')
+ sender.pushbutton.setEnabled(False)
+ else:
+ sender.pushbutton.setEnabled(True)
+
+ if start is not None and \
+ end is not None:
+
+ self.setPrinterOption('job-sheets', ','.join([start, end]))
+
+
+ def ComboBox_highlighted(self, t):
+ t = unicode(t)
+ sender = self.sender()
+ choice = None
+
+ #print sender, sender.option, sender.job_option
+
+ choice = None
+ for c, a in sender.choices:
+ if a == t:
+ choice = c
+ break
+
+ if choice is not None and choice == sender.default:
+ if sender.job_option:
+ self.job_options[sender.option] = sender.default
+ else:
+ self.removePrinterOption(sender.option)
+ sender.pushbutton.setEnabled(False)
+
+ else:
+ sender.pushbutton.setEnabled(True)
+
+ if choice is not None:
+ if sender.job_option:
+ self.job_options[sender.option] = choice
+ else:
+ self.setPrinterOption(sender.option, choice)
+
+ #self.linkPrintoutModeAndQuality(sender.option, choice)
+
+ if 0:
+ pass
+ # def linkPrintoutModeAndQuality(self, option, choice):
+ # if option.lower() == 'quality' and \
+ # choice is not None:
+ #
+ # try:
+ # c = self.items['o:PrintoutMode'].control
+ # except KeyError:
+ # return
+ # else:
+ # if c is not None:
+ # if choice.lower() == 'fromprintoutmode':
+ # # from printoutmode selected
+ # # determine printoutmode option combo enable state
+ # c.setEnabled(True)
+ # QToolTip.remove(c)
+ # a = unicode(c.currentText())
+ #
+ # # determine printoutmode default button state
+ # link_choice = None
+ # for x, t in c.choices:
+ # if t == a:
+ # link_choice = x
+ # break
+ #
+ # if link_choice is not None and \
+ # link_choice.lower() == c.default.lower():
+ #
+ # c.pushbutton.setEnabled(False)
+ # else:
+ # c.pushbutton.setEnabled(True)
+ #
+ # else: # fromprintoutmode not selected, disable printoutmode
+ # c.setEnabled(False)
+ # QToolTip.add(c, self.__tr("""Set Quality to "Controlled by 'Printout Mode'" to enable."""))
+ # c.pushbutton.setEnabled(False)
+ #
+
+ def SpinBox_valueChanged(self, i): # cups.UI_SPINNER
+ sender = self.sender()
+
+ if not sender.job_option:
+ if i == sender.default:
+ self.removePrinterOption(sender.option)
+ sender.pushbutton.setEnabled(False)
+ else:
+ sender.pushbutton.setEnabled(True)
+ self.setPrinterOption(sender.option, str(i))
+
+ else:
+ try:
+ self.job_options[sender.option] = int(i)
+ except ValueError:
+ self.job_options[sender.option] = sender.default
+
+
+ def BoolRadioButtons_clicked(self, b): # cups.PPD_UI_BOOLEAN
+ sender = self.sender()
+ b = int(b)
+
+ if b == sender.default:
+ self.removePrinterOption(sender.option)
+ sender.pushbutton.setEnabled(False)
+ else:
+ sender.pushbutton.setEnabled(True)
+
+ if b:
+ self.setPrinterOption(sender.option, "true")
+ else:
+ self.setPrinterOption(sender.option, "false")
+
+ def ComboBox_indexChanged(self, currentItem):
+ sender = self.sender()
+ currentItem = unicode(currentItem)
+ # Checking for summary control
+ labelPQValaue = getattr(self, 'PQValueLabel', None)
+ labelPQColorInput = getattr(self, 'PQColorInputLabel', None)
+ # When output mode combo item is changed, we need to update the summary information
+ if currentItem is not None and sender.option == 'OutputMode' and labelPQValaue is not None and labelPQColorInput is not None:
+ # Setting output mode
+ self.PQValueLabel.setText(currentItem)
+
+ # Getting DPI custom attributefrom the PPD
+ # Setting color input
+ quality_attr_name = "OutputModeDPI"
+ cups.openPPD(self.cur_printer)
+ outputmode_dpi = cups.findPPDAttribute(quality_attr_name, currentItem)
+ log.debug("Outputmode changed, setting outputmode_dpi: %s" % outputmode_dpi)
+ cups.closePPD()
+ self.PQColorInputLabel.setText(outputmode_dpi)
+
+ log.debug("Outputmode changed, setting value outputmode: %s" % currentItem)
+
+ def DefaultButton_clicked(self):
+ sender = self.sender()
+ sender.setEnabled(False)
+
+ if sender.typ == cups.PPD_UI_BOOLEAN: # () On (*) Off
+ if sender.default:
+ sender.control[0].setChecked(True)
+ sender.control[0].setFocus(Qt.OtherFocusReason)
+ else:
+ sender.control[1].setChecked(True)
+ sender.control[1].setFocus(Qt.OtherFocusReason)
+
+ if not sender.job_option:
+ self.removePrinterOption(sender.option)
+
+ elif sender.typ == cups.PPD_UI_PICKONE: # [ \/]
+ choice, text = None, None
+
+ for c, t in sender.choices:
+ if c == sender.default:
+ choice = c
+ text = t
+ self.job_options[sender.option] = t
+ break
+
+ if choice is not None:
+ if not sender.job_option:
+ self.removePrinterOption(sender.option)
+ index = sender.control.findText(text)
+ sender.control.setCurrentIndex(index)
+
+ #self.linkPrintoutModeAndQuality(sender.option, choice) # TODO:
+ sender.control.setFocus(Qt.OtherFocusReason)
+
+ elif sender.typ == cups.UI_SPINNER: # [ x /\|\/]
+ sender.control.setValue(sender.default)
+ if not sender.job_option:
+ self.removePrinterOption(sender.option)
+
+ sender.control.setFocus(Qt.OtherFocusReason)
+
+ elif sender.typ == cups.UI_BANNER_JOB_SHEETS: # start: [ \/] end: [ \/]
+ start, end, start_text, end_text = None, None, None, None
+ for c, t in sender.choices:
+ if c == sender.default[0]:
+ start = c
+ start_text = t
+
+ if c == sender.default[1]:
+ end = c
+ end_text = t
+
+ if start is not None:
+ index = sender.control[0].findText(start_text)
+ sender.control[0].setCurrentIndex(index)
+
+ if end is not None:
+ index = sender.control[1].findText(end_text)
+ sender.control[1].setCurrentIndex(index)
+
+ if not sender.job_option:
+ self.removePrinterOption('job-sheets')
+
+ sender.control[0].setFocus(Qt.OtherFocusReason)
+
+ elif sender.typ == cups.UI_PAGE_RANGE: # (*) All () Pages: [ ]
+ sender.control[0].setChecked(True) # all radio button
+ sender.control[0].setFocus(Qt.OtherFocusReason)
+ sender.control[2].setEnabled(False) # range edit box
+
+
+ def PageRangeAllRadio_toggled(self, b):
+ if b:
+ sender = self.sender()
+ sender.edit_control.setEnabled(False)
+ sender.pushbutton.setEnabled(False)
+ self.job_options['pagerange'] = ''
+
+
+ def PageRangeRangeRadio_toggled(self, b):
+ if b:
+ sender = self.sender()
+ sender.pushbutton.setEnabled(True)
+ sender.edit_control.setEnabled(True)
+ self.job_options['pagerange'] = unicode(sender.edit_control.text())
+
+
+ def PageRangeEdit_editingFinished(self):
+ sender = self.sender()
+ t, ok, x = self.job_options['pagerange'], True, []
+
+ #[Sanjay]Start Range Validation here as the editing is finished
+ try:
+ x = utils.expand_range(t)
+ except ValueError:
+ ok = False
+
+ if t == '':
+ ok = False
+
+ if ok:
+ if 0 in x:
+ ok = False
+
+ if ok:
+ for y in x:
+ if y > 999:
+ ok = False
+ break
+
+ if not ok:
+ self.job_options['pagerange'] = ''
+ log.error("Invalid page range: %s" % t)
+ FailureUI(self, self.__tr("<b>Invalid page range.</b><p>Please enter a range using page numbers (1-999), dashes, and commas. For example: 1-2,3,5-7</p>"))
+ sender.setFocus(Qt.OtherFocusReason)
+
+
+ def PageRangeEdit_textChanged(self, t):
+ self.job_options['pagerange'] = unicode(t) # Do range validation only in PageRangeEdit_editingFinished method
+
+ #
+ # Job Storage
+ #
+
+ def updateJobStorageControls(self):
+ beginWaitCursor()
+ try:
+ # Mode
+ self.JobStorageModeComboBox.setCurrentIndex(self.JobStorageModeComboBox.findData(QVariant(self.job_storage_mode)))
+ self.JobStorageModeDefaultButton.setEnabled(self.job_storage_mode != JOB_STORAGE_TYPE_OFF)
+
+ # PIN
+ self.JobStoragePinPrivateRadioButton.setChecked(self.job_storage_use_pin)
+
+ # Username
+ self.JobStorageUsernameAutoRadioButton.setChecked(self.job_storage_auto_username)
+
+ # Jobname/ID
+ self.JobStorageIDAutoRadioButton.setChecked(self.job_storage_auto_jobname)
+
+ # Dup/existing ID
+ self.JobStorageExistingComboBox.setCurrentIndex(self.JobStorageExistingComboBox.findData(QVariant(self.job_storage_job_exist)))
+
+ if self.job_storage_mode == JOB_STORAGE_TYPE_OFF:
+ # PIN
+ self.JobStoragePinGroupBox.setEnabled(False)
+ self.JobStoragePinEdit.setEnabled(False)
+ self.JobStoragePinDefaultButton.setEnabled(False)
+ self.JobStoragePinEdit.setText(QString())
+
+ # Username
+ self.JobStorageUsernameGroupBox.setEnabled(False)
+ self.JobStorageUsernameEdit.setEnabled(False)
+ self.JobStorageUsernameDefaultButton.setEnabled(False)
+
+ # Jobname/ID
+ self.JobStorageIDGroupBox.setEnabled(False)
+ self.JobStorageIDEdit.setEnabled(False)
+ self.JobStorageIDDefaultButton.setEnabled(False)
+
+ # Duplicate/existing Jobname/ID
+ self.JobStorageExistingComboBox.setEnabled(False)
+
+ else:
+ # PIN
+ if self.job_storage_mode in (JOB_STORAGE_TYPE_PERSONAL, JOB_STORAGE_TYPE_STORE):
+ self.JobStoragePinGroupBox.setEnabled(True)
+ self.JobStoragePinDefaultButton.setEnabled(self.job_storage_use_pin)
+ self.JobStoragePinEdit.setEnabled(self.job_storage_use_pin)
+ self.JobStoragePinEdit.setText(QString(self.job_storage_pin))
+ else:
+ self.JobStoragePinGroupBox.setEnabled(False)
+ self.JobStoragePinEdit.setEnabled(False)
+ self.JobStoragePinDefaultButton.setEnabled(False)
+ self.JobStoragePinEdit.setText(QString())
+
+ # Username
+ self.JobStorageUsernameGroupBox.setEnabled(True)
+ self.JobStorageUsernameEdit.setEnabled(not self.job_storage_auto_username)
+ self.JobStorageUsernameDefaultButton.setEnabled(not self.job_storage_auto_username)
+ self.JobStorageUsernameEdit.setText(QString(self.job_storage_username))
+
+ # Jobname/ID
+ self.JobStorageIDGroupBox.setEnabled(True)
+ self.JobStorageIDEdit.setEnabled(not self.job_storage_auto_jobname)
+ self.JobStorageIDDefaultButton.setEnabled(not self.job_storage_auto_jobname)
+ self.JobStorageIDEdit.setText(QString(self.job_storage_jobname))
+
+ # Duplicate/existing JobName/ID
+ self.JobStorageExistingComboBox.setEnabled(not self.job_storage_auto_jobname)
+ self.JobStorageExistingDefaultButton.setEnabled(not self.job_storage_auto_jobname and self.job_storage_job_exist != JOB_STORAGE_EXISTING_JOB_REPLACE)
+
+ finally:
+ endWaitCursor()
+
+
+ def saveJobStorageOptions(self):
+ beginWaitCursor()
+ try:
+ log.debug("Saving job storage options...")
+
+ if self.job_storage_mode == JOB_STORAGE_TYPE_OFF:
+ log.debug("Job storage mode = JOB_STORAGE_TYPE_OFF")
+ self.setPrinterOption('HOLD', 'OFF')
+ self.removePrinterOption('HOLDTYPE')
+ self.removePrinterOption('USERNAME')
+ self.removePrinterOption('JOBNAME')
+ self.removePrinterOption('DUPLICATEJOB')
+
+ elif self.job_storage_mode == JOB_STORAGE_TYPE_PROOF_AND_HOLD:
+ log.debug("Job storage mode = JOB_STORAGE_TYPE_PROOF_AND_HOLD")
+ self.setPrinterOption('HOLD', 'PROOF')
+ #self.removePrinterOption('HOLDTYPE')
+ self.setPrinterOption('HOLDTYPE', 'PUBLIC')
+
+ elif self.job_storage_mode == JOB_STORAGE_TYPE_PERSONAL:
+ log.debug("Job storage mode = JOB_STORAGE_TYPE_PERSONAL")
+
+ if self.job_storage_use_pin:
+ self.setPrinterOption('HOLD', 'ON')
+ else:
+ self.setPrinterOption('HOLD', 'PROOF')
+ self.setPrinterOption('HOLDTYPE', 'PUBLIC')
+
+
+ elif self.job_storage_mode == JOB_STORAGE_TYPE_QUICK_COPY:
+ log.debug("Job storage mode = JOB_STORAGE_TYPE_QUICK_COPY")
+ self.setPrinterOption('HOLD', 'ON')
+ self.setPrinterOption('HOLDTYPE', 'PUBLIC')
+
+ elif self.job_storage_mode == JOB_STORAGE_TYPE_STORE:
+ log.debug("Job storage mode = JOB_STORAGE_TYPE_STORE")
+ self.setPrinterOption('HOLD', 'STORE')
+
+ if not self.job_storage_use_pin:
+ self.removePrinterOption('HOLDTYPE')
+
+ # PIN
+ log.debug("Job storage use pin = %d" % self.job_storage_use_pin)
+ if self.job_storage_use_pin:
+ self.setPrinterOption('HOLDTYPE', 'PRIVATE')
+
+ #else:
+ # self.removePrinterOption('HOLDKEY')
+
+ # Dup/exisiting
+ if self.job_storage_job_exist == JOB_STORAGE_EXISTING_JOB_REPLACE:
+ log.debug("Job storage duplicate = JOB_STORAGE_EXISTING_JOB_REPLACE")
+ self.setPrinterOption('DUPLICATEJOB', 'REPLACE')
+
+ else: # JOB_STORAGE_EXISTING_JOB_APPEND_1_99
+ log.debug("Job storage duplicate = JOB_STORAGE_EXISTING_JOB_APPEND_1_99")
+ self.setPrinterOption('DUPLICATEJOB', 'APPEND')
+
+
+ finally:
+ endWaitCursor()
+
+
+ #
+ # Mode
+ #
+
+ def JobStorageModeComboBox_activated(self, i):
+ sender = self.sender()
+ mode, ok = sender.itemData(i).toInt()
+ if ok:
+ self.job_storage_mode = mode
+ self.saveJobStorageOptions()
+ self.updateJobStorageControls()
+
+
+ def JobStorageModeDefaultButton_clicked(self):
+ self.JobStorageModeComboBox.emit(SIGNAL("activated(int)"), JOB_STORAGE_TYPE_OFF)
+
+
+ #
+ # PIN
+ #
+
+ def JobStoragePinOffRadioButton_toggled(self, b):
+ self.job_storage_use_pin = not b
+ self.updateJobStorageControls()
+ self.saveJobStorageOptions()
+
+
+ def JobStoragePinPrivateRadioButton_toggled(self, b):
+ self.job_storage_use_pin = b
+ self.updateJobStorageControls()
+ self.saveJobStorageOptions()
+
+
+ def JobStoragePinDefaultButton_clicked(self):
+ self.JobStoragePinOffRadioButton.emit(SIGNAL("toggled(bool)"), True)
+
+
+ def JobStoragePinEdit_textEdited(self, s):
+ self.job_storage_pin = unicode(s)
+ self.setPrinterOption('HOLDKEY', self.job_storage_pin.encode('ascii'))
+
+
+
+ #
+ # Username
+ #
+
+ def JobStorageUsernameAutoRadioButton_toggled(self, b):
+ self.job_storage_auto_username = b
+ self.updateJobStorageControls()
+ self.saveJobStorageOptions()
+
+
+ def JobStorageUsernameCustomRadioButton_toggled(self, b):
+ self.job_storage_auto_username = not b
+ self.updateJobStorageControls()
+ self.saveJobStorageOptions()
+
+
+ def JobStorageUsernameDefaultButton_clicked(self):
+ self.JobStorageUsernameAutoRadioButton.emit(SIGNAL("toggled(bool)"), True)
+
+
+ def JobStorageUsernameEdit_textEdited(self, s):
+ self.job_storage_username = unicode(s)
+ self.setPrinterOption('USERNAME', self.job_storage_username.encode('ascii'))
+
+ #
+ # Jobname/ID
+ #
+
+ def JobStorageIDAutoRadioButton_toggled(self, b):
+ self.job_storage_auto_jobname = b
+ self.updateJobStorageControls()
+ self.saveJobStorageOptions()
+
+
+ def JobStorageIDCustomRadioButton_toggled(self, b):
+ self.job_storage_auto_jobname = not b
+ self.updateJobStorageControls()
+ self.saveJobStorageOptions()
+
+
+ def JobStorageIDDefaultButton_clicked(self):
+ self.JobStorageIDAutoRadioButton.emit(SIGNAL("toggled(bool)"), True)
+
+
+ def JobStorageIDEdit_textEdited(self, s):
+ self.job_storage_jobname = unicode(s)
+ self.setPrinterOption('JOBNAME', self.job_storage_jobname.encode('ascii'))
+
+ #
+ # Duplicate/existing Jobname/ID
+ #
+
+ def JobStorageExistingComboBox_activated(self, i):
+ sender = self.sender()
+ opt, ok = sender.itemData(i).toInt()
+ if ok:
+ self.job_storage_job_exist = opt
+ self.updateJobStorageControls()
+ self.saveJobStorageOptions()
+
+
+ def JobStorageExistingDefaultButton_clicked(self):
+ self.JobStorageExistingComboBox.emit(SIGNAL("activated(int)"), JOB_STORAGE_EXISTING_JOB_REPLACE)
+
+
+ #
+ # Printer I/O
+ #
+
+ def setPrinterOption(self, option, value):
+ log.debug("setPrinterOption(%s, %s)" % (option, value))
+ cups.openPPD(self.cur_printer)
+
+ try:
+ cups.addOption("%s=%s" % (option, value))
+ cups.setOptions()
+ finally:
+ cups.closePPD()
+
+ def removePrinterOption(self, option):
+ log.debug("removePrinterOption(%s)" % option)
+ cups.openPPD(self.cur_printer)
+
+ try:
+ cups.removeOption(option)
+ cups.setOptions()
+ finally:
+ cups.closePPD()
+
+
+ def __tr(self,s,c = None):
+ return qApp.translate("PrintSettingsToolbox",s,c)
+
diff --git a/ui4/printtestpagedialog.py b/ui4/printtestpagedialog.py
new file mode 100644
index 0000000..890115b
--- /dev/null
+++ b/ui4/printtestpagedialog.py
@@ -0,0 +1,157 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2001-2008 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+
+# Local
+from base.g import *
+from base import device
+from ui_utils import *
+
+# Qt
+from PyQt4.QtCore import *
+from PyQt4.QtGui import *
+
+# Ui
+from printtestpagedialog_base import Ui_Dialog
+
+
+class PrintTestPageDialog(QDialog, Ui_Dialog):
+ def __init__(self, parent, printer_name):
+ QDialog.__init__(self, parent)
+
+ self.printer_name = printer_name
+ self.device_uri = ''
+ self.setupUi(self)
+ self.initUi()
+
+ QTimer.singleShot(0, self.updateUi)
+
+
+ def initUi(self):
+ #print "PrintTestPageDialog.initUi()"
+ self.HPLIPTestPageRadioButton.setChecked(True)
+ self.LoadPaper.setButtonName(self.__tr("Print Test Page"))
+
+ self.connect(self.CancelButton, SIGNAL("clicked()"), self.CancelButton_clicked)
+ self.connect(self.PrintTestpageButton, SIGNAL("clicked()"), self.PrintTestpageButton_clicked)
+
+ self.connect(self.PrinterNameCombo, SIGNAL("PrinterNameComboBox_currentChanged"),
+ self.PrinterNameCombo_currentChanged)
+
+ self.connect(self.PrinterNameCombo, SIGNAL("PrinterNameComboBox_noPrinters"),
+ self.PrinterNameComboBox_noPrinters)
+
+ if self.printer_name:
+ self.PrinterNameCombo.setInitialPrinter(self.printer_name)
+
+ # Application icon
+ self.setWindowIcon(QIcon(load_pixmap('hp_logo', '128x128')))
+
+
+ def updateUi(self):
+ self.PrinterNameCombo.updateUi()
+ self.LoadPaper.updateUi()
+ #self.updatePrintButton()
+
+
+ def PrinterNameComboBox_noPrinters(self):
+ FailureUI(self, self.__tr("<b>No printers found.</b><p>Please setup a printer and try again."))
+ self.close()
+
+
+ def updatePrintButton(self):
+ QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
+ self.PrintTestpageButton.setEnabled(False)
+ ok = False
+ try:
+ try:
+ d = device.Device(self.device_uri, self.printer_name)
+ except Error, e:
+ log.error("Device error (%s)." % e.msg)
+ else:
+ try:
+ d.open()
+ except Error:
+ log.error("Unable to print to printer. Please check device and try again.")
+ else:
+ ok = d.isIdleAndNoError()
+
+ self.PrintTestpageButton.setEnabled(ok)
+
+ if not ok:
+ QApplication.restoreOverrideCursor()
+ FailureUI(self, self.__tr("<b>Unable to communicate with printer %1.</b><p>Please check the printer and try again.").arg(self.printer_name))
+
+ d.close()
+
+ finally:
+ QApplication.restoreOverrideCursor()
+
+
+ def CancelButton_clicked(self):
+ self.close()
+
+
+ def PrinterNameCombo_currentChanged(self, device_uri, printer_name):
+ self.printer_name = printer_name
+ self.device_uri = device_uri
+ self.updatePrintButton()
+ #self.updateUi()
+
+
+ def PrintTestpageButton_clicked(self):
+ QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
+ ok = False
+ try:
+ try:
+ d = device.Device(self.device_uri, self.printer_name)
+ except Error, e:
+ log.error("Device error (%s)." % e.msg)
+ else:
+ try:
+ d.open()
+ except Error:
+ log.error("Unable to print to printer. Please check device and try again.")
+ else:
+ ok = d.isIdleAndNoError()
+
+ finally:
+ QApplication.restoreOverrideCursor()
+
+ if ok:
+ QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
+ try:
+ d.printTestPage(self.printer_name)
+ finally:
+ QApplication.restoreOverrideCursor()
+
+ self.close()
+
+ else:
+ FailureUI(self, self.__tr("<b>A error occured sending the test page to printer %1.</b><p>Please check the printer and try again.").arg(self.printer_name))
+
+ d.close()
+
+
+ def __tr(self, s, c=None):
+ return qApp.translate("PrintTestPageDialog", s, c)
+
+
diff --git a/ui4/printtestpagedialog_base.py b/ui4/printtestpagedialog_base.py
new file mode 100644
index 0000000..04840bf
--- /dev/null
+++ b/ui4/printtestpagedialog_base.py
@@ -0,0 +1,77 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'ui4/printtestpagedialog_base.ui'
+#
+# Created: Mon May 4 14:30:36 2009
+# by: PyQt4 UI code generator 4.4.4
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt4 import QtCore, QtGui
+
+class Ui_Dialog(object):
+ def setupUi(self, Dialog):
+ Dialog.setObjectName("Dialog")
+ Dialog.setWindowModality(QtCore.Qt.ApplicationModal)
+ Dialog.resize(700, 500)
+ self.gridlayout = QtGui.QGridLayout(Dialog)
+ self.gridlayout.setObjectName("gridlayout")
+ self.label = QtGui.QLabel(Dialog)
+ font = QtGui.QFont()
+ font.setPointSize(16)
+ self.label.setFont(font)
+ self.label.setObjectName("label")
+ self.gridlayout.addWidget(self.label, 0, 0, 1, 1)
+ self.line = QtGui.QFrame(Dialog)
+ self.line.setFrameShape(QtGui.QFrame.HLine)
+ self.line.setFrameShadow(QtGui.QFrame.Sunken)
+ self.line.setObjectName("line")
+ self.gridlayout.addWidget(self.line, 1, 0, 1, 4)
+ self.PrinterNameCombo = PrinterNameComboBox(Dialog)
+ sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Preferred)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.PrinterNameCombo.sizePolicy().hasHeightForWidth())
+ self.PrinterNameCombo.setSizePolicy(sizePolicy)
+ self.PrinterNameCombo.setObjectName("PrinterNameCombo")
+ self.gridlayout.addWidget(self.PrinterNameCombo, 2, 0, 1, 4)
+ self.groupBox = QtGui.QGroupBox(Dialog)
+ self.groupBox.setObjectName("groupBox")
+ self.gridlayout1 = QtGui.QGridLayout(self.groupBox)
+ self.gridlayout1.setObjectName("gridlayout1")
+ self.HPLIPTestPageRadioButton = QtGui.QRadioButton(self.groupBox)
+ self.HPLIPTestPageRadioButton.setObjectName("HPLIPTestPageRadioButton")
+ self.gridlayout1.addWidget(self.HPLIPTestPageRadioButton, 0, 0, 1, 1)
+ self.PrinterDiagnosticRadioButto = QtGui.QRadioButton(self.groupBox)
+ self.PrinterDiagnosticRadioButto.setEnabled(False)
+ self.PrinterDiagnosticRadioButto.setObjectName("PrinterDiagnosticRadioButto")
+ self.gridlayout1.addWidget(self.PrinterDiagnosticRadioButto, 1, 0, 1, 1)
+ self.gridlayout.addWidget(self.groupBox, 3, 0, 1, 4)
+ self.LoadPaper = LoadPaperGroupBox(Dialog)
+ self.LoadPaper.setObjectName("LoadPaper")
+ self.gridlayout.addWidget(self.LoadPaper, 4, 0, 1, 4)
+ spacerItem = QtGui.QSpacerItem(189, 61, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.MinimumExpanding)
+ self.gridlayout.addItem(spacerItem, 5, 1, 1, 1)
+ spacerItem1 = QtGui.QSpacerItem(400, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+ self.gridlayout.addItem(spacerItem1, 6, 0, 1, 2)
+ self.PrintTestpageButton = QtGui.QPushButton(Dialog)
+ self.PrintTestpageButton.setObjectName("PrintTestpageButton")
+ self.gridlayout.addWidget(self.PrintTestpageButton, 6, 2, 1, 1)
+ self.CancelButton = QtGui.QPushButton(Dialog)
+ self.CancelButton.setObjectName("CancelButton")
+ self.gridlayout.addWidget(self.CancelButton, 6, 3, 1, 1)
+
+ self.retranslateUi(Dialog)
+ QtCore.QMetaObject.connectSlotsByName(Dialog)
+
+ def retranslateUi(self, Dialog):
+ Dialog.setWindowTitle(QtGui.QApplication.translate("Dialog", "HP Device Manager - Print Test Page", None, QtGui.QApplication.UnicodeUTF8))
+ self.label.setText(QtGui.QApplication.translate("Dialog", "Print Test Page", None, QtGui.QApplication.UnicodeUTF8))
+ self.groupBox.setTitle(QtGui.QApplication.translate("Dialog", "Type", None, QtGui.QApplication.UnicodeUTF8))
+ self.HPLIPTestPageRadioButton.setText(QtGui.QApplication.translate("Dialog", "HPLIP test page (tests print driver)", None, QtGui.QApplication.UnicodeUTF8))
+ self.PrinterDiagnosticRadioButto.setText(QtGui.QApplication.translate("Dialog", "Printer diagnostic page (does not test print driver)", None, QtGui.QApplication.UnicodeUTF8))
+ self.PrintTestpageButton.setText(QtGui.QApplication.translate("Dialog", "Print Test Page", None, QtGui.QApplication.UnicodeUTF8))
+ self.CancelButton.setText(QtGui.QApplication.translate("Dialog", "Cancel", None, QtGui.QApplication.UnicodeUTF8))
+
+from printernamecombobox import PrinterNameComboBox
+from loadpapergroupbox import LoadPaperGroupBox
diff --git a/ui4/printtestpagedialog_base.ui b/ui4/printtestpagedialog_base.ui
new file mode 100644
index 0000000..d21cfe2
--- /dev/null
+++ b/ui4/printtestpagedialog_base.ui
@@ -0,0 +1,142 @@
+<ui version="4.0" >
+ <class>Dialog</class>
+ <widget class="QDialog" name="Dialog" >
+ <property name="windowModality" >
+ <enum>Qt::ApplicationModal</enum>
+ </property>
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>700</width>
+ <height>500</height>
+ </rect>
+ </property>
+ <property name="windowTitle" >
+ <string>HP Device Manager - Print Test Page</string>
+ </property>
+ <layout class="QGridLayout" >
+ <item row="0" column="0" >
+ <widget class="QLabel" name="label" >
+ <property name="font" >
+ <font>
+ <pointsize>16</pointsize>
+ </font>
+ </property>
+ <property name="text" >
+ <string>Print Test Page</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" colspan="4" >
+ <widget class="Line" name="line" >
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" colspan="4" >
+ <widget class="PrinterNameComboBox" name="PrinterNameCombo" >
+ <property name="sizePolicy" >
+ <sizepolicy vsizetype="Preferred" hsizetype="Expanding" >
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0" colspan="4" >
+ <widget class="QGroupBox" name="groupBox" >
+ <property name="title" >
+ <string>Type</string>
+ </property>
+ <layout class="QGridLayout" >
+ <item row="0" column="0" >
+ <widget class="QRadioButton" name="HPLIPTestPageRadioButton" >
+ <property name="text" >
+ <string>HPLIP test page (tests print driver)</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QRadioButton" name="PrinterDiagnosticRadioButto" >
+ <property name="enabled" >
+ <bool>false</bool>
+ </property>
+ <property name="text" >
+ <string>Printer diagnostic page (does not test print driver)</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="4" column="0" colspan="4" >
+ <widget class="LoadPaperGroupBox" name="LoadPaper" >
+ <property name="title" >
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="1" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeType" >
+ <enum>QSizePolicy::MinimumExpanding</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>189</width>
+ <height>61</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="6" column="0" colspan="2" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>400</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="6" column="2" >
+ <widget class="QPushButton" name="PrintTestpageButton" >
+ <property name="text" >
+ <string>Print Test Page</string>
+ </property>
+ </widget>
+ </item>
+ <item row="6" column="3" >
+ <widget class="QPushButton" name="CancelButton" >
+ <property name="text" >
+ <string>Cancel</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <customwidgets>
+ <customwidget>
+ <class>PrinterNameComboBox</class>
+ <extends>QComboBox</extends>
+ <header>printernamecombobox.h</header>
+ <container>1</container>
+ </customwidget>
+ <customwidget>
+ <class>LoadPaperGroupBox</class>
+ <extends>QGroupBox</extends>
+ <header>loadpapergroupbox.h</header>
+ <container>1</container>
+ </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/ui4/queuesconf.py b/ui4/queuesconf.py
new file mode 100644
index 0000000..c527b67
--- /dev/null
+++ b/ui4/queuesconf.py
@@ -0,0 +1,181 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2011-2014 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Authors: Amarnath Chitumalla
+#
+
+#global
+import os
+import sys
+
+# Local
+from base.g import *
+from base import utils
+from prnt import cups
+from base.codes import *
+from ui_utils import *
+
+
+# Qt
+from PyQt4.QtCore import *
+from PyQt4.QtGui import *
+
+from PyQt4 import QtCore, QtGui
+
+class Ui_Dialog(object):
+ def setupUi(self, Dialog, printerName, device_uri,Error_msg):
+ Dialog.setObjectName("Dialog")
+ Dialog.resize(700, 180)
+ self.printerName=printerName
+ self.device_uri=device_uri
+ self.Error_msg=Error_msg
+ self.gridlayout = QtGui.QGridLayout(Dialog)
+ self.gridlayout.setObjectName("gridlayout")
+ self.StackedWidget = QtGui.QStackedWidget(Dialog)
+ self.StackedWidget.setObjectName("StackedWidget")
+ self.page = QtGui.QWidget()
+ self.page.setObjectName("page")
+ self.gridlayout1 = QtGui.QGridLayout(self.page)
+ self.gridlayout1.setObjectName("gridlayout1")
+ self.label = QtGui.QLabel(self.page)
+ font = QtGui.QFont()
+ font.setPointSize(16)
+ self.label.setFont(font)
+ self.label.setObjectName("label")
+ self.gridlayout1.addWidget(self.label, 0, 0, 1, 1)
+ self.line = QtGui.QFrame(self.page)
+ self.line.setFrameShape(QtGui.QFrame.HLine)
+ self.line.setFrameShadow(QtGui.QFrame.Sunken)
+ self.line.setObjectName("line")
+ self.gridlayout1.addWidget(self.line, 1, 0, 1, 2)
+ self.TitleLabel = QtGui.QLabel(self.page)
+ self.TitleLabel.setWordWrap(True)
+ self.TitleLabel.setObjectName("TitleLabel")
+ self.gridlayout1.addWidget(self.TitleLabel, 2, 0, 1, 2)
+ spacerItem = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ spacerItem2 = QtGui.QSpacerItem(200, 51, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ self.gridlayout1.addItem(spacerItem2, 5, 1, 1, 1)
+ self.StackedWidget.addWidget(self.page)
+ self.gridlayout.addWidget(self.StackedWidget, 0, 0, 1, 5)
+ self.line_2 = QtGui.QFrame(Dialog)
+ self.line_2.setFrameShape(QtGui.QFrame.HLine)
+ self.line_2.setFrameShadow(QtGui.QFrame.Sunken)
+ self.line_2.setObjectName("line_2")
+ self.gridlayout.addWidget(self.line_2, 1, 0, 1, 4)
+ self.NextButton = QtGui.QPushButton(Dialog)
+ self.NextButton.setObjectName("NextButton")
+ self.gridlayout.addWidget(self.NextButton, 2, 3, 1, 1)
+ self.CancelButton = QtGui.QPushButton(Dialog)
+ self.CancelButton.setObjectName("CancelButton")
+ self.gridlayout.addWidget(self.CancelButton, 2, 4, 1, 1)
+
+ self.retranslateUi(Dialog)
+ self.StackedWidget.setCurrentIndex(0)
+ QtCore.QMetaObject.connectSlotsByName(Dialog)
+
+ def retranslateUi(self, Dialog):
+ Dialog.setWindowTitle(QtGui.QApplication.translate("Dialog", "HP Device Manager - Queues diagnose", None, QtGui.QApplication.UnicodeUTF8))
+ if self.Error_msg == QUEUES_PAUSED:
+ self.label.setText(QtGui.QApplication.translate("Dialog", "Print/Fax Queue is Paused", None, QtGui.QApplication.UnicodeUTF8))
+ else:
+ self.label.setText(QtGui.QApplication.translate("Dialog", "Queue needs to be reconfigured", None, QtGui.QApplication.UnicodeUTF8))
+
+ if self.Error_msg == QUEUES_INCORRECT_PPD:
+ text= "'"+ self.printerName + "' is using incorrect PPD file. Do you want to remove and reconfigure queue?"
+ elif self.Error_msg == QUEUES_PAUSED:
+ text="'"+ self.printerName + "' is paused. Do you want to enable queue?"
+ elif self.Error_msg == QUEUES_CONFIG_ERROR:
+ text="'"+ self.printerName + "' is not configured using hp-setup utility. Click 'Next' to remove and reconfigure queue."
+
+ if self.Error_msg != QUEUES_MSG_SENDING:
+ self.TitleLabel.setText(QtGui.QApplication.translate("Dialog", text, None, QtGui.QApplication.UnicodeUTF8))
+ if self.Error_msg == QUEUES_PAUSED or self.Error_msg == QUEUES_INCORRECT_PPD:
+ self.NextButton.setText(QtGui.QApplication.translate("Dialog", "Yes", None, QtGui.QApplication.UnicodeUTF8))
+ self.CancelButton.setText(QtGui.QApplication.translate("Dialog", "No", None, QtGui.QApplication.UnicodeUTF8))
+ else:
+ self.NextButton.setText(QtGui.QApplication.translate("Dialog", "Next >", None, QtGui.QApplication.UnicodeUTF8))
+ self.CancelButton.setText(QtGui.QApplication.translate("Dialog", "Cancel", None, QtGui.QApplication.UnicodeUTF8))
+
+
+# Ui
+
+class QueuesDiagnose(QDialog, Ui_Dialog):
+ def __init__(self, parent, printerName, device_uri, Error_msg):
+ QDialog.__init__(self, parent)
+ self.result = False
+ self.printerName = printerName
+ self.device_uri = device_uri
+ self.Error_msg = Error_msg
+ self.setupUi(self, printerName, device_uri,Error_msg)
+ self.user_settings = UserSettings()
+ self.user_settings.load()
+ self.user_settings.debug()
+
+ self.initUi()
+
+
+ def initUi(self):
+ # connect signals/slots
+ self.connect(self.CancelButton, SIGNAL("clicked()"), self.CancelButton_clicked)
+ self.connect(self.NextButton, SIGNAL("clicked()"), self.NextButton_clicked)
+
+ # Application icon
+ self.setWindowIcon(QIcon(load_pixmap('hp_logo', '128x128')))
+
+
+ #
+ # Misc
+ #
+ def displayPage(self, page):
+ self.updateStepText(page)
+ self.StackedWidget.setCurrentIndex(page)
+
+ def CancelButton_clicked(self):
+ self.close()
+
+
+ def NextButton_clicked(self):
+ try:
+ if self.Error_msg != QUEUES_PAUSED:
+ cups.delPrinter(self.printerName)
+ msg="' "+self.printerName+" ' removed successfully.\nRe-configuring this printer by hp-setup..."
+ log.debug(msg)
+ path = utils.which('hp-setup')
+ if path:
+ log.debug("Starting hp-setup")
+ utils.run('hp-setup')
+
+ else:
+ cups.enablePrinter(self.printerName)
+ msg ="'"+self.printerName+"' is enabled successfully"
+ SuccessUI(self, self.__tr(msg))
+
+ finally:
+ endWaitCursor()
+ self.result = True
+ self.close()
+
+ def showMessage(self,msg):
+ FailureUI(self, self.__tr(msg))
+
+ def showSuccessMessage(self,msg):
+ SuccessUI(self, self.__tr(msg))
+
+ def __tr(self,s,c = None):
+ return qApp.translate("PluginDialog",s,c)
+
diff --git a/ui4/readonlyradiobutton.py b/ui4/readonlyradiobutton.py
new file mode 100644
index 0000000..66f058f
--- /dev/null
+++ b/ui4/readonlyradiobutton.py
@@ -0,0 +1,64 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2001-2009 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Authors: Don Welch
+#
+
+
+
+# Qt
+from PyQt4.QtCore import *
+from PyQt4.QtGui import *
+
+
+
+class ReadOnlyRadioButton(QRadioButton):
+ def __init__(self, parent):
+ QRadioButton.__init__(self, parent)
+ self.setFocusPolicy(Qt.NoFocus)
+ self.clearFocus()
+
+
+ def mousePressEvent(self, e):
+ if e.button() == Qt.LeftButton:
+ return
+
+ QRadioButton.mousePressEvent(e)
+
+
+ def mouseReleaseEvent(self, e):
+ if e.button() == Qt.LeftButton:
+ return
+
+ QRadioButton.mouseReleaseEvent(e)
+
+
+ def mouseMoveEvent(self, e):
+ return
+
+
+ def keyPressEvent(self, e):
+ if e.key() not in (Qt.Key_Up, Qt.Key_Left, Qt.Key_Right,
+ Qt.Key_Down, Qt.Key_Escape):
+ return
+
+ QRadioButton.keyPressEvent(e)
+
+
+ def keyReleaseEvent(self, e):
+ return
diff --git a/ui4/sendfaxdialog.py b/ui4/sendfaxdialog.py
new file mode 100644
index 0000000..948076f
--- /dev/null
+++ b/ui4/sendfaxdialog.py
@@ -0,0 +1,1050 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2001-2009 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Authors: Don Welch
+#
+
+# StdLib
+import operator
+import struct
+import Queue
+
+# Local
+from base.g import *
+from base import device, utils, pml
+from prnt import cups
+from base.codes import *
+from ui_utils import *
+
+# Qt
+from PyQt4.QtCore import *
+from PyQt4.QtGui import *
+
+# Ui
+from sendfaxdialog_base import Ui_Dialog
+from filetable import FileTable, FILETABLE_TYPE_FAX
+from printernamecombobox import PrinterNameComboBox, PRINTERNAMECOMBOBOX_TYPE_FAX_ONLY
+from printsettingsdialog import PrintSettingsDialog
+from faxsetupdialog import FaxSetupDialog
+
+
+PAGE_SELECT_FAX = 0
+PAGE_COVERPAGE = 1
+PAGE_FILES = 2
+PAGE_RECIPIENTS = 3
+PAGE_SEND_FAX = 4
+PAGE_MAX = 4
+
+STATUS_INFORMATION = 0
+STATUS_WARNING = 1
+STATUS_ERROR = 2
+
+MIME_TYPE_COVERPAGE = "application/hplip-fax-coverpage"
+
+fax_enabled = prop.fax_build
+
+if fax_enabled:
+ try:
+ from fax import fax
+ except ImportError:
+ # This can fail on Python < 2.3 due to the datetime module
+ # or if fax was diabled during the build
+ fax_enabled = False
+
+if not fax_enabled:
+ log.warn("Fax disabled.")
+
+coverpages_enabled = False
+if fax_enabled:
+ try:
+ import reportlab
+ ver = reportlab.Version
+ try:
+ ver_f = float(ver)
+ except ValueError:
+ ver_f = 0.0
+
+ if ver_f >= 2.0:
+ coverpages_enabled = True
+ else:
+ log.warn("Pre-2.0 version of Reportlab installed. Fax coverpages disabled.")
+
+ except ImportError:
+ log.warn("Reportlab not installed. Fax coverpages disabled.")
+
+if not coverpages_enabled:
+ log.warn("Please install version 2.0+ of Reportlab for coverpage support.")
+
+if fax_enabled:
+ from fabwindow import FABWindow
+
+if coverpages_enabled:
+ from fax import coverpages
+
+
+class SendFaxDialog(QDialog, Ui_Dialog):
+ def __init__(self, parent, printer_name, device_uri=None, args=None):
+ QDialog.__init__(self, parent)
+ self.setupUi(self)
+
+ self.printer_name = printer_name
+ if device_uri is not None:
+ self.device_uri = device_uri
+ else:
+ self.device_uri = device.getDeviceURIByPrinterName(self.printer_name)
+
+ self.args = args
+ self.dev = None
+
+ self.dbus_avail, self.service, session_bus = device.init_dbus()
+
+ self.CheckTimer = None
+ self.lock_file = None
+ self.file_list = []
+ self.recipient_list = []
+
+ self.initUi()
+
+ if self.printer_name:
+ if coverpages_enabled:
+ QTimer.singleShot(0, self.displayCoverpagePage)
+ else:
+ self.lockAndLoad()
+ QTimer.singleShot(0, self.displayFilesPage)
+ else:
+ QTimer.singleShot(0, self.displaySelectFaxPage)
+
+
+ def initUi(self):
+ # connect signals/slots
+ self.connect(self.CancelButton, SIGNAL("clicked()"), self.CancelButton_clicked)
+ self.connect(self.BackButton, SIGNAL("clicked()"), self.BackButton_clicked)
+ self.connect(self.NextButton, SIGNAL("clicked()"), self.NextButton_clicked)
+
+ self.initSelectFaxPage()
+ self.initCoverpagePage()
+ self.initFilesPage()
+ self.initRecipientsPage()
+ self.initSendFaxPage()
+
+ # Application icon
+ self.setWindowIcon(QIcon(load_pixmap('hp_logo', '128x128')))
+
+
+ def lockAndLoad(self):
+ # Start up check timer here, since the fax name is now known
+ if self.CheckTimer is None:
+ self.CheckTimer = QTimer(self)
+ self.connect(self.CheckTimer, SIGNAL("timeout()"), self.CheckTimer_timeout)
+ self.CheckTimer.start(3000)
+
+ # Lock the app
+ if self.printer_name and self.lock_file is None:
+ ok, self.lock_file = utils.lock_app('hp-sendfax-%s' % self.printer_name, True)
+
+ if not ok:
+ log.error("hp-sendfax is already running for fax %s" % self.printer_name)
+ # TODO:
+
+ #
+ # Select Fax Page
+ #
+
+ def initSelectFaxPage(self):
+ self.FaxComboBox.setType(PRINTERNAMECOMBOBOX_TYPE_FAX_ONLY)
+ self.connect(self.FaxComboBox, SIGNAL("PrinterNameComboBox_currentChanged"), self.FaxComboBox_currentChanged)
+ self.connect(self.FaxComboBox, SIGNAL("PrinterNameComboBox_noPrinters"), self.FaxComboBox_noPrinters)
+ self.connect(self.FaxOptionsButton, SIGNAL("clicked()"), self.FaxOptionsButton_clicked)
+ self.connect(self.FaxSetupButton, SIGNAL("clicked()"), self.FaxSetupButton_clicked)
+
+ if self.printer_name is not None:
+ self.FaxComboBox.setInitialPrinter(self.printer_name)
+
+
+ def displaySelectFaxPage(self):
+ self.BackButton.setEnabled(False)
+ self.updateStepText(PAGE_SELECT_FAX)
+
+ if not fax_enabled:
+ FailureUI(self, self.__tr("<b>PC send fax support is not enabled.</b><p>Re-install HPLIP with fax support or use the device front panel to send a fax.</p><p>Click <i>OK</i> to exit.</p>"))
+ self.close()
+ return
+
+ if not self.dbus_avail:
+ FailureUI(self, self.__tr("<b>PC send fax support requires DBus and hp-systray.</b><p>Please check the HPLIP installation for proper installation of DBus and hp-systray support.</p><p>Click <i>OK</i> to exit.</p>"))
+ self.close()
+ return
+
+ self.FaxComboBox.updateUi()
+ self.displayPage(PAGE_SELECT_FAX)
+
+
+ def FaxComboBox_currentChanged(self, device_uri, printer_name):
+ self.printer_name = printer_name
+ self.device_uri = device_uri
+
+
+ def FaxComboBox_noPrinters(self):
+ FailureUI(self, self
+ .__tr("<b>No installed fax devices found.</b><p>Please setup a fax device and try again (try using 'hp-setup').</p><p>Click <i>OK</i> to exit.</p>"))
+ self.close()
+
+
+ def FaxOptionsButton_clicked(self):
+ dlg = PrintSettingsDialog(self, self.printer_name, fax_mode=True)
+ dlg.exec_()
+
+
+ def FaxSetupButton_clicked(self):
+ dlg = FaxSetupDialog(self, self.device_uri)
+ dlg.exec_()
+
+ #
+ # Coverpage Page
+ #
+
+ def initCoverpagePage(self):
+ self.cover_page_message = ''
+ self.cover_page_re = ''
+ self.preserve_formatting = False
+ self.cover_page_func, cover_page_png = None, None
+ self.last_job_id = 0
+ self.busy = False
+ self.PrevCoverPageButton.setIcon(QIcon(load_pixmap("prev", "16x16")))
+ self.NextCoverPageButton.setIcon(QIcon(load_pixmap("next", "16x16")))
+
+ if coverpages_enabled:
+ self.cover_page_list = coverpages.COVERPAGES.keys()
+ self.cover_page_index = self.cover_page_list.index("basic")
+ self.cover_page_max = len(self.cover_page_list)-1
+ self.cover_page_name = self.cover_page_list[self.cover_page_index]
+
+ self.connect(self.PrevCoverPageButton, SIGNAL("clicked()"), self.PrevCoverPageButton_clicked)
+ self.connect(self.NextCoverPageButton, SIGNAL("clicked()"), self.NextCoverPageButton_clicked)
+ self.connect(self.CoverPageGroupBox, SIGNAL("toggled(bool)"), self.CoverPageGroupBox_toggled)
+ self.connect(self.MessageEdit, SIGNAL("textChanged()"), self.MessageEdit_textChanged)
+ self.connect(self.RegardingEdit, SIGNAL("textChanged(const QString &)"), self.RegardingEdit_textChanged)
+ self.connect(self.PreserveFormattingCheckBox, SIGNAL("toggled(bool)"),
+ self.PreserveFormattingCheckBox_toggled)
+ else:
+ self.CoverPageGroupBox.setEnabled(False)
+
+
+ def displayCoverpagePage(self):
+ self.BackButton.setEnabled(False) # No going back once printer is chosen
+ self.NextButton.setEnabled(True)
+
+ self.lockAndLoad()
+
+ self.updateCoverpageButtons()
+ self.displayCoverpagePreview()
+ self.displayPage(PAGE_COVERPAGE)
+
+
+ def MessageEdit_textChanged(self):
+ self.cover_page_message = unicode(self.MessageEdit.toPlainText())
+
+
+ def RegardingEdit_textChanged(self, t):
+ self.cover_page_re = unicode(t)
+
+
+ def PreserveFormattingCheckBox_toggled(self, b):
+ self.preserve_formatting = b
+
+
+ def PrevCoverPageButton_clicked(self):
+ self.cover_page_index -= 1
+ if self.cover_page_index < 0:
+ self.cover_page_index = 0
+ else:
+ self.updateCoverpageButtons()
+ self.displayCoverpagePage()
+
+
+ def NextCoverPageButton_clicked(self):
+ self.cover_page_index += 1
+ if self.cover_page_index > self.cover_page_max:
+ self.cover_page_index = self.cover_page_max
+ else:
+ self.updateCoverpageButtons()
+ self.displayCoverpagePage()
+
+
+ def displayCoverpagePreview(self):
+ self.cover_page_name = self.cover_page_list[self.cover_page_index]
+ self.cover_page_func = coverpages.COVERPAGES[self.cover_page_name][0]
+ self.CoverPageName.setText(QString('<i>"%1"</i>').arg(self.cover_page_name))
+ self.CoverPagePreview.setPixmap(load_pixmap(coverpages.COVERPAGES[self.cover_page_name][1], 'other'))
+
+ if self.CoverPageGroupBox.isChecked():
+ self.addCoverPage()
+ else:
+ self.removeCoverPage()
+
+
+ def updateCoverpageButtons(self):
+ enabled = self.CoverPageGroupBox.isChecked()
+ self.PrevCoverPageButton.setEnabled(enabled and self.cover_page_index != 0)
+ self.NextCoverPageButton.setEnabled(enabled and self.cover_page_index != self.cover_page_max)
+
+
+ def CoverPageGroupBox_toggled(self, b):
+ self.updateCoverpageButtons()
+ if b:
+ self.addCoverPage()
+ else:
+ self.removeCoverPage()
+
+
+ def addCoverPage(self):
+ self.removeCoverPage()
+ self.FilesTable.addFile(self.cover_page_name, MIME_TYPE_COVERPAGE,
+ self.__tr('HP Fax Coverpage: "%1"').arg(self.cover_page_name),
+ self.__tr("Cover Page"), 1)
+
+
+ def removeCoverPage(self):
+ self.FilesTable.removeFileByMIMEType(MIME_TYPE_COVERPAGE)
+
+
+ def toggleCoverPage(self, b):
+ self.disconnect(self.CoverPageGroupBox, SIGNAL("toggled(bool)"), self.CoverPageGroupBox_toggled)
+ self.CoverPageGroupBox.setChecked(b)
+ self.connect(self.CoverPageGroupBox, SIGNAL("toggled(bool)"), self.CoverPageGroupBox_toggled)
+
+
+ #
+ # Files Page
+ #
+
+ def initFilesPage(self):
+ self.FilesTable.setType(FILETABLE_TYPE_FAX)
+ self.FilesTable.setFaxCallback(self.FileTable_callback)
+ self.connect(self.FilesTable, SIGNAL("isEmpty"), self.FilesTable_isEmpty)
+ self.connect(self.FilesTable, SIGNAL("isNotEmpty"), self.FilesTable_isNotEmpty)
+ self.connect(self.FilesTable, SIGNAL("fileListChanged"), self.FilesTable_fileListChanged)
+
+
+ def displayFilesPage(self):
+ self.FilesTable.updateUi(False)
+
+ if self.args is not None:
+ for a in self.args:
+ f = os.path.abspath(os.path.expanduser(a))
+ if os.path.exists(f) and os.access(f, os.R_OK):
+ self.renderFile(f)
+
+ self.args = None
+
+ self.restoreNextButton()
+ self.NextButton.setEnabled(self.FilesTable.isNotEmpty())
+ self.BackButton.setEnabled(coverpages_enabled)
+ self.FilesPageNote.setText(self.__tr("Note: You may also add files to the fax by printing from any application to the '%1' fax printer.").arg(self.printer_name))
+ self.displayPage(PAGE_FILES)
+
+
+ def FilesTable_isEmpty(self):
+ if self.StackedWidget.currentIndex() == PAGE_FILES:
+ self.NextButton.setEnabled(False)
+
+
+ def FilesTable_isNotEmpty(self):
+ if self.StackedWidget.currentIndex() == PAGE_FILES:
+ self.NextButton.setEnabled(True)
+
+
+ def FilesTable_fileListChanged(self):
+ self.file_list = self.FilesTable.file_list
+ self.toggleCoverPage(self.FilesTable.isMIMETypeInList(MIME_TYPE_COVERPAGE))
+
+
+ #
+ # Recipients Page
+ #
+
+ def initRecipientsPage(self):
+ # setup validators
+ self.QuickAddFaxEdit.setValidator(PhoneNumValidator(self.QuickAddFaxEdit))
+
+ # Fax address book database
+ self.db = fax.FaxAddressBook()
+
+ # Fax address book window
+ self.fab = FABWindow(self)
+ self.fab.setWindowFlags(Qt.Tool) # Keeps the Fab window on top
+
+ self.connect(self.fab, SIGNAL("databaseChanged"), self.FABWindow_databaseChanged)
+
+ # connect signals
+ self.connect(self.QuickAddFaxEdit, SIGNAL("textChanged(const QString &)"),
+ self.QuickAddFaxEdit_textChanged)
+ self.connect(self.QuickAddNameEdit, SIGNAL("textChanged(const QString &)"),
+ self.QuickAddNameEdit_textChanged)
+ self.connect(self.QuickAddButton, SIGNAL("clicked()"), self.QuickAddButton_clicked)
+ self.connect(self.FABButton, SIGNAL("clicked()"), self.FABButton_clicked)
+ self.connect(self.AddIndividualButton, SIGNAL("clicked()"), self.AddIndividualButton_clicked)
+ self.connect(self.AddGroupButton, SIGNAL("clicked()"), self.AddGroupButton_clicked)
+ self.connect(self.RemoveRecipientButton, SIGNAL("clicked()"), self.RemoveRecipientButton_clicked)
+ self.connect(self.MoveRecipientUpButton, SIGNAL("clicked()"), self.MoveRecipientUpButton_clicked)
+ self.connect(self.MoveRecipientDownButton, SIGNAL("clicked()"), self.MoveRecipientDownButton_clicked)
+ self.connect(self.RecipientsTable, SIGNAL("itemSelectionChanged()"),
+ self.RecipientsTable_itemSelectionChanged)
+ self.connect(self.RecipientsTable, SIGNAL("itemDoubleClicked(QTableWidgetItem *)"),
+ self.RecipientsTable_itemDoubleClicked)
+
+ # setup icons
+ self.FABButton.setIcon(QIcon(load_pixmap("fab", "16x16")))
+ self.AddIndividualButton.setIcon(QIcon(load_pixmap("add_user", "16x16")))
+ self.AddGroupButton.setIcon(QIcon(load_pixmap("add_users", "16x16")))
+ self.RemoveRecipientButton.setIcon(QIcon(load_pixmap("remove_user", "16x16")))
+ self.MoveRecipientUpButton.setIcon(QIcon(load_pixmap("up_user", "16x16")))
+ self.MoveRecipientDownButton.setIcon(QIcon(load_pixmap("down_user", "16x16")))
+ self.QuickAddButton.setIcon(QIcon(load_pixmap("add_user_quick", "16x16")))
+
+ # setup initial state
+ self.QuickAddButton.setEnabled(False)
+
+ self.recipient_headers = [self.__tr("Name"), self.__tr("Fax number"), self.__tr("Notes")]
+
+
+ def FABWindow_databaseChanged(self, action, s1='', s2=''):
+ self.db.load()
+
+ if action in (FAB_NAME_ADD, FAB_GROUP_ADD, FAB_GROUP_RENAME,
+ FAB_GROUP_REMOVE, FAB_GROUP_MEMBERSHIP_CHANGED):
+
+ log.debug("Fax address book has changed")
+ self.updateAddressBook()
+
+ elif action == FAB_NAME_REMOVE:
+ log.debug("Fax address book has changed: '%s' removed" % s1)
+ all_names = self.db.get_all_names()
+ self.recipient_list = filter(lambda x: x in self.recipient_list, all_names)
+ self.updateAddressBook()
+ self.updateRecipientTable()
+
+ elif action == FAB_NAME_RENAME:
+ log.debug("Fax address book has changed: '%s' renamed to '%s'" % (s1, s2))
+ for i, n in enumerate(self.recipient_list):
+ if n == s1:
+ self.recipient_list[i] = s2
+ self.updateRecipientTable()
+ break
+ else:
+ self.updateAddressBook()
+
+ elif action == FAB_NAME_DETAILS_CHANGED:
+ log.debug("Fax address book has changed: '%s' details changed" % s1)
+ self.updateRecipientTable()
+
+
+ def displayRecipientsPage(self):
+ self.updateAddressBook()
+ self.updateRecipientTable()
+ self.enableQuickAddButton()
+ self.displayPage(PAGE_RECIPIENTS)
+ self.restoreNextButton()
+ self.BackButton.setEnabled(True)
+
+
+ def updateAddressBook(self):
+ names = [n for n in self.db.get_all_names() if not n.startswith('__')]
+ groups = self.db.get_all_groups()
+ self.AddIndividualComboBox.clear()
+ self.AddGroupComboBox.clear()
+
+ i = 0
+ names.sort()
+ for n in names:
+ if n not in self.recipient_list:
+ data = self.db.get(n)
+ if data['fax']:
+ self.AddIndividualComboBox.addItem(n)
+ i += 1
+
+ if i:
+ self.AddIndividualButton.setEnabled(True)
+ self.AddIndividualComboBox.setEnabled(True)
+ #self.AddIndividualButton.setIcon(QIcon(load_pixmap("add_user", "16x16")))
+
+ else:
+ self.AddIndividualButton.setEnabled(False)
+ self.AddIndividualComboBox.setEnabled(False)
+ #self.AddIndividualButton.setIcon(QIcon(load_pixmap("add_user-disabled", "16x16")))
+
+ i = 0
+ groups.sort()
+ for g in groups:
+ for n in self.db.group_members(g):
+ if not n.startswith('__') and n not in self.recipient_list:
+ self.AddGroupComboBox.addItem(g)
+ i += 1
+ break
+
+ if i:
+ self.AddGroupButton.setEnabled(True)
+ self.AddGroupComboBox.setEnabled(True)
+ #self.AddGroupButton.setIcon(QIcon(load_pixmap("add_users", "16x16")))
+
+ else:
+ self.AddGroupButton.setEnabled(False)
+ self.AddGroupComboBox.setEnabled(False)
+ #self.AddGroupButton.setIcon(QIcon(load_pixmap("add_users-disabled", "16x16")))
+
+
+ def updateRecipientTable(self):
+ try:
+ prev = self.getCurrentRecipient()
+ except (TypeError, AttributeError):
+ prev = None
+
+ self.RecipientsTable.clear()
+ self.RecipientsTable.setRowCount(0)
+ self.RecipientsTable.setColumnCount(0)
+
+ if self.recipient_list:
+ num_recipients = len(self.recipient_list)
+
+ self.RecipientsTable.setColumnCount(len(self.recipient_headers))
+ self.RecipientsTable.setHorizontalHeaderLabels(self.recipient_headers)
+ self.RecipientsTable.setRowCount(num_recipients)
+ flags = Qt.ItemIsSelectable | Qt.ItemIsEnabled
+
+ j = None
+ for row, n in enumerate(self.recipient_list):
+ i = QTableWidgetItem(QString(n))
+ i.setFlags(flags)
+ self.RecipientsTable.setItem(row, 0, i)
+ if prev is not None and n == prev:
+ j = i
+
+ k = self.db.get(n)
+ if not k:
+ continue
+
+ i = QTableWidgetItem(QString(k['fax']))
+ i.setFlags(flags)
+ self.RecipientsTable.setItem(row, 1, i)
+
+ i = QTableWidgetItem(QString(k['notes']))
+ i.setFlags(flags)
+ self.RecipientsTable.setItem(row, 2, i)
+
+ self.RecipientsTable.resizeColumnsToContents()
+ self.RecipientsTable.resizeRowsToContents()
+
+ if j is not None:
+ self.RecipientsTable.setCurrentItem(j)
+ else:
+ self.RecipientsTable.setCurrentItem(self.RecipientsTable.item(0, 0))
+
+ self.NextButton.setEnabled(True)
+
+ else:
+ self.enableRecipientListButtons()
+ self.NextButton.setEnabled(False)
+
+
+ def RecipientsTable_itemSelectionChanged(self):
+ current_row = self.RecipientsTable.currentRow()
+ num_recipients = len(self.recipient_list)
+ self.enableRecipientListButtons(num_recipients > 0, # remove
+ num_recipients > 1 and current_row > 0, # up
+ num_recipients > 1 and current_row < (num_recipients-1)) # down
+
+
+ def enableRecipientListButtons(self, enable_remove=False, enable_up_move=False, enable_down_move=False):
+ if enable_remove:
+ self.RemoveRecipientButton.setEnabled(True)
+ else:
+ self.RemoveRecipientButton.setEnabled(False)
+
+ if enable_up_move:
+ self.MoveRecipientUpButton.setEnabled(True)
+ else:
+ self.MoveRecipientUpButton.setEnabled(False)
+
+ if enable_down_move:
+ self.MoveRecipientDownButton.setEnabled(True)
+ else:
+ self.MoveRecipientDownButton.setEnabled(False)
+
+
+ def QuickAddFaxEdit_textChanged(self, fax):
+ self.enableQuickAddButton(None, unicode(fax))
+
+
+ def QuickAddNameEdit_textChanged(self, name):
+ self.enableQuickAddButton(unicode(name))
+
+
+ def enableQuickAddButton(self, name=None, fax=None):
+ if name is None:
+ name = unicode(self.QuickAddNameEdit.text())
+ if fax is None:
+ fax = unicode(self.QuickAddFaxEdit.text())
+
+ existing_name = False
+ if name:
+ existing_name = name in self.db.get_all_names()
+
+ if existing_name:
+ try:
+ self.QuickAddNameEdit.setStyleSheet("background-color: yellow")
+ except AttributeError:
+ pass
+ else:
+ try:
+ self.QuickAddNameEdit.setStyleSheet("")
+ except AttributeError:
+ pass
+
+ if name and not existing_name and fax:
+ self.QuickAddButton.setEnabled(True)
+ else:
+ self.QuickAddButton.setEnabled(False)
+
+
+ def QuickAddButton_clicked(self):
+ name = unicode(self.QuickAddNameEdit.text())
+ fax = unicode(self.QuickAddFaxEdit.text())
+ self.fab.addName(name, fax)
+ self.addRecipient(name)
+ self.updateRecipientTable()
+ self.QuickAddNameEdit.clear()
+ self.QuickAddFaxEdit.clear()
+ self.enableQuickAddButton('', '')
+
+
+ def AddIndividualButton_clicked(self):
+ self.addRecipient(unicode(self.AddIndividualComboBox.currentText()))
+
+
+ def AddGroupButton_clicked(self):
+ self.addGroup(unicode(self.AddGroupComboBox.currentText()))
+
+
+ def RemoveRecipientButton_clicked(self):
+ name = self.getCurrentRecipient()
+ temp = self.recipient_list[:]
+ for i, n in enumerate(temp):
+ if name == n:
+ del self.recipient_list[i]
+ self.updateRecipientTable()
+ self.updateAddressBook()
+ break
+
+
+ def MoveRecipientUpButton_clicked(self):
+ utils.list_move_up(self.recipient_list, self.getCurrentRecipient())
+ self.updateRecipientTable()
+
+
+ def MoveRecipientDownButton_clicked(self):
+ utils.list_move_down(self.recipient_list, self.getCurrentRecipient())
+ self.updateRecipientTable()
+
+
+ def getCurrentRecipient(self):
+ item = self.RecipientsTable.item(self.RecipientsTable.currentRow(), 0)
+ if item is not None:
+ return unicode(item.text())
+ else:
+ return u''
+
+
+ def addRecipient(self, name, update=True):
+ if name not in self.recipient_list and not name.startswith('__'):
+ self.recipient_list.append(name)
+ if update:
+ self.updateRecipientTable()
+ self.updateAddressBook()
+
+
+ def addGroup(self, group):
+ for n in self.db.group_members(group):
+ self.addRecipient(n, False)
+
+ self.updateRecipientTable()
+ self.updateAddressBook()
+
+
+ def FABButton_clicked(self):
+ self.fab.show()
+
+
+ def RecipientsTable_itemDoubleClicked(self, item):
+ if item is not None:
+ row, col = item.row(), item.column()
+ if col != 0:
+ item = self.RecipientsTable.item(row, 0)
+
+ self.fab.selectByName(unicode(item.text()))
+ self.fab.show()
+
+
+ #
+ # Send Fax Page
+ #
+
+ def initSendFaxPage(self):
+ self.info_icon = QIcon(load_pixmap("info", "16x16"))
+ self.warn_icon = QIcon(load_pixmap("warning", "16x16"))
+ self.error_icon = QIcon(load_pixmap("error", "16x16"))
+ self.busy_icon = QIcon(load_pixmap("busy", "16x16"))
+ self.update_queue = Queue.Queue() # UI updates from send thread
+ self.event_queue = Queue.Queue() # UI events (cancel) to send thread
+ self.send_fax_active = False
+
+
+ def displaySendFaxPage(self):
+ self.displayPage(PAGE_SEND_FAX)
+ self.addStatusMessage(self.__tr("Ready to send fax."), self.info_icon)
+ self.NextButton.setText(self.__tr("Send Fax"))
+
+
+
+ #
+ # Fax
+ #
+
+ def executeSendFax(self):
+ self.NextButton.setEnabled(False)
+ self.BackButton.setEnabled(False)
+ self.CheckTimer.stop()
+ self.busy = True
+ phone_num_list = []
+
+ ppd_file = cups.getPPD(self.printer_name)
+
+ if ppd_file is not None and os.path.exists(ppd_file):
+ if file(ppd_file, 'r').read().find('HP Fax') == -1:
+ FailureUI(self, self.__tr("<b>Fax configuration error.</b><p>The CUPS fax queue for '%1' is incorrectly configured.<p>Please make sure that the CUPS fax queue is configured with the 'HPLIP Fax' Model/Driver.").arg(self.printer_name))
+ self.close()
+ return
+
+ beginWaitCursor()
+
+ mq = device.queryModelByURI(self.device_uri)
+
+ self.dev = fax.getFaxDevice(self.device_uri,
+ self.printer_name, None,
+ mq['fax-type'])
+
+ try:
+ try:
+ self.dev.open()
+ except Error, e:
+ log.warn(e.msg)
+
+ try:
+ self.dev.queryDevice(quick=True)
+ except Error, e:
+ log.error("Query device error (%s)." % e.msg)
+ self.dev.error_state = ERROR_STATE_ERROR
+
+ finally:
+ self.dev.close()
+ endWaitCursor()
+
+ if self.dev.error_state > ERROR_STATE_MAX_OK and \
+ self.dev.error_state not in (ERROR_STATE_LOW_SUPPLIES, ERROR_STATE_LOW_PAPER):
+
+ FailureUI(self, self.__tr("<b>Device is busy or in an error state (code=%1)</b><p>Please wait for the device to become idle or clear the error and try again.").arg(self.dev.status_code))
+ self.NextButton.setEnabled(True)
+ return
+
+ # Check to make sure queue in CUPS is idle
+ self.cups_printers = cups.getPrinters()
+ for p in self.cups_printers:
+ if p.name == self.printer_name:
+ if p.state == cups.IPP_PRINTER_STATE_STOPPED:
+ FailureUI(self, self.__tr("<b>The CUPS queue for '%1' is in a stopped or busy state.</b><p>Please check the queue and try again.").arg(self.printer_name))
+ self.NextButton.setEnabled(False)
+ return
+ break
+
+ log.debug("Recipient list:")
+
+ for p in self.recipient_list:
+ entry = self.db.get(p)
+ phone_num_list.append(entry)
+ log.debug("Name=%s Number=%s" % (entry["name"], entry["fax"]))
+
+ log.debug("File list:")
+
+ for f in self.file_list:
+ log.debug(f)
+
+ self.dev.sendEvent(EVENT_START_FAX_JOB, self.printer_name, 0, '')
+
+ if not self.dev.sendFaxes(phone_num_list, self.file_list, self.cover_page_message,
+ self.cover_page_re, self.cover_page_func, self.preserve_formatting,
+ self.printer_name, self.update_queue, self.event_queue):
+
+ FailureUI(self, self.__tr("<b>Send fax is active.</b><p>Please wait for operation to complete."))
+ self.dev.sendEvent(EVENT_FAX_JOB_FAIL, self.printer_name, 0, '')
+ self.busy = False
+ self.send_fax_active = False
+ #self.NextButton.setEnabled(False)
+ self.setCancelCloseButton()
+ return
+
+ self.send_fax_active = True
+ self.setCancelCloseButton()
+ self.SendFaxTimer = QTimer(self)
+ self.connect(self.SendFaxTimer, SIGNAL('timeout()'), self.SendFaxTimer_timeout)
+ self.SendFaxTimer.start(1000) # 1 sec UI updates
+
+
+ def setCancelCloseButton(self):
+ if self.send_fax_active:
+ self.CancelButton.setText(self.__tr("Cancel Send"))
+ else:
+ self.CancelButton.setText(self.__tr("Close"))
+
+
+ def CancelButton_clicked(self):
+ if self.send_fax_active:
+ self.addStatusMessage(self.__tr("Cancelling job..."), self.warn_icon)
+ self.event_queue.put((fax.EVENT_FAX_SEND_CANCELED, '', '', ''))
+ self.dev.sendEvent(EVENT_FAX_JOB_CANCELED, self.printer_name, 0, '')
+ else:
+ self.close()
+
+
+ def SendFaxTimer_timeout(self):
+ while self.update_queue.qsize():
+ try:
+ status, page_num, arg = self.update_queue.get(0)
+ except Queue.Empty:
+ break
+
+ if status == fax.STATUS_IDLE:
+ self.busy = False
+ self.send_fax_active = False
+ self.setCancelCloseButton()
+ self.SendFaxTimer.stop()
+
+ elif status == fax.STATUS_PROCESSING_FILES:
+ self.addStatusMessage(self.__tr("Processing page %1...").arg(page_num), self.busy_icon)
+
+ elif status == fax.STATUS_SENDING_TO_RECIPIENT:
+ self.addStatusMessage(self.__tr("Sending fax to %1...").arg(arg), self.busy_icon)
+
+ elif status == fax.STATUS_DIALING:
+ self.addStatusMessage(self.__tr("Dialing %1...").arg(arg), self.busy_icon)
+
+ elif status == fax.STATUS_CONNECTING:
+ self.addStatusMessage(self.__tr("Connecting to %1...").arg(arg), self.busy_icon)
+
+ elif status == fax.STATUS_SENDING:
+ self.addStatusMessage(self.__tr("Sending page %1 to %2...").arg(page_num).arg(arg),
+ self.busy_icon)
+
+ elif status == fax.STATUS_CLEANUP:
+ self.addStatusMessage(self.__tr("Cleaning up..."), self.busy_icon)
+
+ elif status in (fax.STATUS_ERROR, fax.STATUS_BUSY, fax.STATUS_COMPLETED, fax.STATUS_ERROR_IN_CONNECTING,
+ fax.STATUS_ERROR_IN_TRANSMITTING, fax.STATUS_ERROR_PROBLEM_IN_FAXLINE, fax.STATUS_JOB_CANCEL ):
+ self.busy = False
+ self.send_fax_active = False
+ self.setCancelCloseButton()
+ self.SendFaxTimer.stop()
+
+ if status == fax.STATUS_ERROR:
+ result_code, error_state = self.dev.getPML(pml.OID_FAX_DOWNLOAD_ERROR)
+ #FailureUI(self, self.__tr("<b>Fax send error (%s).</b><p>" % pml.DN_ERROR_STR.get(error_state, "Unknown error")))
+ if error_state == pml.DN_ERROR_NONE:
+ self.addStatusMessage(self.__tr("Fax send error (Possible cause: No answer or dialtone)"), self.error_icon)
+ else:
+ self.addStatusMessage(self.__tr("Fax send error (%1)").arg(pml.DN_ERROR_STR.get(error_state, "Unknown error")), self.error_icon)
+ self.dev.sendEvent(EVENT_FAX_JOB_FAIL, self.printer_name, 0, '')
+
+ elif status == fax.STATUS_ERROR_IN_CONNECTING:
+ self.addStatusMessage(self.__tr("Fax send error (Error in connecting)"), self.error_icon)
+ self.dev.sendEvent(EVENT_FAX_JOB_FAIL, self.printer_name, 0, '')
+
+ elif status == fax.STATUS_ERROR_IN_TRANSMITTING:
+ self.addStatusMessage(self.__tr("Fax send error (Error in transmitting)"), self.error_icon)
+ self.dev.sendEvent(EVENT_FAX_JOB_FAIL, self.printer_name, 0, '')
+
+ elif status == fax.STATUS_ERROR_PROBLEM_IN_FAXLINE:
+ self.addStatusMessage(self.__tr("Fax send error (Problem with the fax line)"), self.error_icon)
+ self.dev.sendEvent(EVENT_FAX_JOB_FAIL, self.printer_name, 0, '')
+
+ elif status == fax.STATUS_JOB_CANCEL:
+ self.addStatusMessage(self.__tr("(Fax Job Cancelled)"), self.error_icon)
+ self.dev.sendEvent(EVENT_FAX_JOB_FAIL, self.printer_name, 0, '')
+
+ elif status == fax.STATUS_BUSY:
+ #FailureUI(self, self.__tr("<b>Fax device is busy.</b><p>Please try again later."))
+ self.addStatusMessage(self.__tr("Fax is busy."), self.error_icon)
+ self.dev.sendEvent(EVENT_FAX_JOB_FAIL, self.printer_name, 0, '')
+
+ elif status == fax.STATUS_COMPLETED:
+ self.addStatusMessage(self.__tr("Send fax job complete."), self.info_icon)
+
+ self.dev.sendEvent(EVENT_END_FAX_JOB, self.printer_name, 0, '')
+
+
+ def addStatusMessage(self, text, icon):
+ log.debug(text)
+ #self.StatusList.addItem(QListWidgetItem(icon, text, self.StatusList))
+ QListWidgetItem(icon, text, self.StatusList)
+
+ #
+ # CheckTimer and Fax Rendering
+ #
+
+ def FileTable_callback(self, f):
+ # Called by FileTable when user adds a file using "Add file..."
+ log.debug("FileTable_callback(%s)" % f)
+ self.renderFile(f)
+
+
+ def renderFile(self, f):
+ self.busy = True
+ beginWaitCursor()
+ try:
+ self.last_job_id = cups.printFile(self.printer_name, f, os.path.basename(f))
+ finally:
+ self.busy = False
+ endWaitCursor()
+
+
+ def CheckTimer_timeout(self):
+ if not self.busy:
+ #log.debug("Checking for incoming faxes...")
+ device_uri, printer_name, event_code, username, job_id, title, timedate, fax_file = \
+ self.service.CheckForWaitingFax(self.device_uri, prop.username, self.last_job_id)
+
+ if fax_file:
+ self.last_job_id = 0
+ log.debug("A new fax has arrived: %s (%d)" % (fax_file, job_id))
+ self.addFileFromJob(fax_file, title)
+
+
+ def addFileFromJob(self, fax_file, title):
+ self.busy = True
+ #beginWaitCursor()
+ try:
+ ok, num_pages, hort_dpi, vert_dpi, page_size, resolution, encoding = \
+ self.getFileInfo(fax_file)
+ if ok:
+ self.FilesTable.addFile(fax_file, 'application/hplip-fax', 'HPLIP Fax', title, num_pages)
+
+ finally:
+ self.busy = False
+ endWaitCursor()
+
+
+ def getFileInfo(self, fax_file):
+ f = file(fax_file, 'r')
+ header = f.read(fax.FILE_HEADER_SIZE)
+ f.close()
+
+ if len(header) != fax.FILE_HEADER_SIZE:
+ log.error("Invalid fax file! (truncated header or no data)")
+ return (False, 0, 0, 0, 0, 0, 0)
+
+ mg, version, num_pages, hort_dpi, vert_dpi, page_size, \
+ resolution, encoding, reserved1, reserved2 = \
+ struct.unpack(">8sBIHHBBBII", header[:fax.FILE_HEADER_SIZE])
+
+ log.debug("Magic=%s Ver=%d Pages=%d hDPI=%d vDPI=%d Size=%d Res=%d Enc=%d" %
+ (mg, version, num_pages, hort_dpi, vert_dpi, page_size, resolution, encoding))
+
+ return (True, num_pages, hort_dpi, vert_dpi, page_size, resolution, encoding)
+
+
+ #
+ # Misc
+ #
+
+ def closeEvent(self, e):
+ if self.lock_file is not None:
+ utils.unlock(self.lock_file)
+ e.accept()
+
+
+ def displayPage(self, page):
+ self.updateStepText(page)
+ self.StackedWidget.setCurrentIndex(page)
+
+
+# def CancelButton_clicked(self):
+# self.close()
+
+
+ def BackButton_clicked(self):
+ p = self.StackedWidget.currentIndex()
+ if p == PAGE_SELECT_FAX:
+ log.error("Invalid!")
+
+ elif p == PAGE_COVERPAGE:
+ log.error("Invalid!")
+
+ elif p == PAGE_FILES:
+ self.StackedWidget.setCurrentIndex(PAGE_COVERPAGE)
+ self.displayCoverpagePage()
+
+ elif p == PAGE_RECIPIENTS:
+ self.StackedWidget.setCurrentIndex(PAGE_FILES)
+ self.displayFilesPage()
+
+ elif p == PAGE_SEND_FAX:
+ self.StackedWidget.setCurrentIndex(PAGE_RECIPIENTS)
+ self.displayRecipientsPage()
+
+
+ def NextButton_clicked(self):
+ p = self.StackedWidget.currentIndex()
+ if p == PAGE_SELECT_FAX:
+ self.StackedWidget.setCurrentIndex(PAGE_COVERPAGE)
+ self.displayCoverpagePage()
+
+ elif p == PAGE_COVERPAGE:
+ self.StackedWidget.setCurrentIndex(PAGE_FILES)
+ self.displayFilesPage()
+
+ elif p == PAGE_FILES:
+ self.StackedWidget.setCurrentIndex(PAGE_RECIPIENTS)
+ self.displayRecipientsPage()
+
+ elif p == PAGE_RECIPIENTS:
+ self.StackedWidget.setCurrentIndex(PAGE_SEND_FAX)
+ self.displaySendFaxPage()
+
+ elif p == PAGE_SEND_FAX:
+ self.executeSendFax()
+
+
+ def updateStepText(self, p):
+ self.StepText.setText(self.__tr("Step %1 of %2").arg(p+1).arg(PAGE_MAX+1))
+
+
+ def restoreNextButton(self):
+ self.NextButton.setText(self.__tr("Next >"))
+
+
+ def __tr(self,s,c = None):
+ return qApp.translate("SendFaxDialog",s,c)
+
+
diff --git a/ui4/sendfaxdialog_base.py b/ui4/sendfaxdialog_base.py
new file mode 100644
index 0000000..0a04c4b
--- /dev/null
+++ b/ui4/sendfaxdialog_base.py
@@ -0,0 +1,388 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'ui4/sendfaxdialog_base.ui'
+#
+# Created: Mon May 4 14:30:36 2009
+# by: PyQt4 UI code generator 4.4.4
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt4 import QtCore, QtGui
+
+class Ui_Dialog(object):
+ def setupUi(self, Dialog):
+ Dialog.setObjectName("Dialog")
+ Dialog.setWindowModality(QtCore.Qt.ApplicationModal)
+ Dialog.resize(600, 500)
+ self.gridlayout = QtGui.QGridLayout(Dialog)
+ self.gridlayout.setObjectName("gridlayout")
+ self.StackedWidget = QtGui.QStackedWidget(Dialog)
+ self.StackedWidget.setFrameShape(QtGui.QFrame.NoFrame)
+ self.StackedWidget.setObjectName("StackedWidget")
+ self.SelectFax = QtGui.QWidget()
+ self.SelectFax.setObjectName("SelectFax")
+ self.gridlayout1 = QtGui.QGridLayout(self.SelectFax)
+ self.gridlayout1.setObjectName("gridlayout1")
+ self.label_8 = QtGui.QLabel(self.SelectFax)
+ font = QtGui.QFont()
+ font.setPointSize(16)
+ self.label_8.setFont(font)
+ self.label_8.setObjectName("label_8")
+ self.gridlayout1.addWidget(self.label_8, 0, 0, 1, 1)
+ self.line_4 = QtGui.QFrame(self.SelectFax)
+ self.line_4.setFrameShape(QtGui.QFrame.HLine)
+ self.line_4.setFrameShadow(QtGui.QFrame.Sunken)
+ self.line_4.setObjectName("line_4")
+ self.gridlayout1.addWidget(self.line_4, 1, 0, 1, 1)
+ self.gridlayout2 = QtGui.QGridLayout()
+ self.gridlayout2.setObjectName("gridlayout2")
+ self.FaxComboBox = PrinterNameComboBox(self.SelectFax)
+ self.FaxComboBox.setObjectName("FaxComboBox")
+ self.gridlayout2.addWidget(self.FaxComboBox, 0, 0, 1, 3)
+ spacerItem = QtGui.QSpacerItem(20, 20, QtGui.QSizePolicy.MinimumExpanding, QtGui.QSizePolicy.Minimum)
+ self.gridlayout2.addItem(spacerItem, 1, 0, 1, 1)
+ self.FaxOptionsButton = QtGui.QPushButton(self.SelectFax)
+ sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.FaxOptionsButton.sizePolicy().hasHeightForWidth())
+ self.FaxOptionsButton.setSizePolicy(sizePolicy)
+ self.FaxOptionsButton.setObjectName("FaxOptionsButton")
+ self.gridlayout2.addWidget(self.FaxOptionsButton, 1, 1, 1, 1)
+ self.FaxSetupButton = QtGui.QPushButton(self.SelectFax)
+ sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.FaxSetupButton.sizePolicy().hasHeightForWidth())
+ self.FaxSetupButton.setSizePolicy(sizePolicy)
+ self.FaxSetupButton.setObjectName("FaxSetupButton")
+ self.gridlayout2.addWidget(self.FaxSetupButton, 1, 2, 1, 1)
+ self.gridlayout1.addLayout(self.gridlayout2, 2, 0, 1, 1)
+ spacerItem1 = QtGui.QSpacerItem(564, 221, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ self.gridlayout1.addItem(spacerItem1, 3, 0, 1, 1)
+ self.label_12 = QtGui.QLabel(self.SelectFax)
+ self.label_12.setWordWrap(True)
+ self.label_12.setObjectName("label_12")
+ self.gridlayout1.addWidget(self.label_12, 4, 0, 1, 1)
+ self.StackedWidget.addWidget(self.SelectFax)
+ self.CoverPage = QtGui.QWidget()
+ self.CoverPage.setObjectName("CoverPage")
+ self.gridlayout3 = QtGui.QGridLayout(self.CoverPage)
+ self.gridlayout3.setObjectName("gridlayout3")
+ self.label_3 = QtGui.QLabel(self.CoverPage)
+ font = QtGui.QFont()
+ font.setPointSize(16)
+ self.label_3.setFont(font)
+ self.label_3.setObjectName("label_3")
+ self.gridlayout3.addWidget(self.label_3, 0, 0, 1, 1)
+ self.line_2 = QtGui.QFrame(self.CoverPage)
+ self.line_2.setFrameShape(QtGui.QFrame.HLine)
+ self.line_2.setFrameShadow(QtGui.QFrame.Sunken)
+ self.line_2.setObjectName("line_2")
+ self.gridlayout3.addWidget(self.line_2, 1, 0, 1, 1)
+ self.CoverPageGroupBox = QtGui.QGroupBox(self.CoverPage)
+ self.CoverPageGroupBox.setEnabled(True)
+ self.CoverPageGroupBox.setCheckable(True)
+ self.CoverPageGroupBox.setChecked(False)
+ self.CoverPageGroupBox.setObjectName("CoverPageGroupBox")
+ self.gridlayout4 = QtGui.QGridLayout(self.CoverPageGroupBox)
+ self.gridlayout4.setObjectName("gridlayout4")
+ self.gridlayout5 = QtGui.QGridLayout()
+ self.gridlayout5.setObjectName("gridlayout5")
+ self.CoverPageName = QtGui.QLabel(self.CoverPageGroupBox)
+ self.CoverPageName.setFrameShape(QtGui.QFrame.NoFrame)
+ self.CoverPageName.setAlignment(QtCore.Qt.AlignCenter)
+ self.CoverPageName.setObjectName("CoverPageName")
+ self.gridlayout5.addWidget(self.CoverPageName, 0, 0, 1, 4)
+ self.CoverPagePreview = QtGui.QLabel(self.CoverPageGroupBox)
+ sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.CoverPagePreview.sizePolicy().hasHeightForWidth())
+ self.CoverPagePreview.setSizePolicy(sizePolicy)
+ self.CoverPagePreview.setMinimumSize(QtCore.QSize(134, 192))
+ self.CoverPagePreview.setMaximumSize(QtCore.QSize(134, 192))
+ self.CoverPagePreview.setFrameShape(QtGui.QFrame.NoFrame)
+ self.CoverPagePreview.setScaledContents(True)
+ self.CoverPagePreview.setAlignment(QtCore.Qt.AlignCenter)
+ self.CoverPagePreview.setObjectName("CoverPagePreview")
+ self.gridlayout5.addWidget(self.CoverPagePreview, 1, 0, 1, 4)
+ spacerItem2 = QtGui.QSpacerItem(16, 20, QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Minimum)
+ self.gridlayout5.addItem(spacerItem2, 2, 0, 1, 1)
+ self.PrevCoverPageButton = QtGui.QPushButton(self.CoverPageGroupBox)
+ self.PrevCoverPageButton.setObjectName("PrevCoverPageButton")
+ self.gridlayout5.addWidget(self.PrevCoverPageButton, 2, 1, 1, 1)
+ self.NextCoverPageButton = QtGui.QPushButton(self.CoverPageGroupBox)
+ self.NextCoverPageButton.setObjectName("NextCoverPageButton")
+ self.gridlayout5.addWidget(self.NextCoverPageButton, 2, 2, 1, 1)
+ spacerItem3 = QtGui.QSpacerItem(31, 20, QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Minimum)
+ self.gridlayout5.addItem(spacerItem3, 2, 3, 1, 1)
+ spacerItem4 = QtGui.QSpacerItem(20, 21, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ self.gridlayout5.addItem(spacerItem4, 3, 1, 1, 1)
+ self.gridlayout4.addLayout(self.gridlayout5, 0, 0, 2, 1)
+ self.vboxlayout = QtGui.QVBoxLayout()
+ self.vboxlayout.setObjectName("vboxlayout")
+ self.label_16 = QtGui.QLabel(self.CoverPageGroupBox)
+ self.label_16.setObjectName("label_16")
+ self.vboxlayout.addWidget(self.label_16)
+ self.RegardingEdit = QtGui.QLineEdit(self.CoverPageGroupBox)
+ self.RegardingEdit.setObjectName("RegardingEdit")
+ self.vboxlayout.addWidget(self.RegardingEdit)
+ self.gridlayout4.addLayout(self.vboxlayout, 0, 1, 1, 1)
+ self.gridlayout6 = QtGui.QGridLayout()
+ self.gridlayout6.setObjectName("gridlayout6")
+ self.label_17 = QtGui.QLabel(self.CoverPageGroupBox)
+ self.label_17.setObjectName("label_17")
+ self.gridlayout6.addWidget(self.label_17, 0, 0, 1, 1)
+ self.MessageEdit = QtGui.QTextEdit(self.CoverPageGroupBox)
+ self.MessageEdit.setObjectName("MessageEdit")
+ self.gridlayout6.addWidget(self.MessageEdit, 1, 0, 1, 1)
+ self.PreserveFormattingCheckBox = QtGui.QCheckBox(self.CoverPageGroupBox)
+ self.PreserveFormattingCheckBox.setObjectName("PreserveFormattingCheckBox")
+ self.gridlayout6.addWidget(self.PreserveFormattingCheckBox, 2, 0, 1, 1)
+ self.gridlayout4.addLayout(self.gridlayout6, 1, 1, 1, 1)
+ self.gridlayout3.addWidget(self.CoverPageGroupBox, 2, 0, 1, 1)
+ self.label_13 = QtGui.QLabel(self.CoverPage)
+ self.label_13.setWordWrap(True)
+ self.label_13.setObjectName("label_13")
+ self.gridlayout3.addWidget(self.label_13, 3, 0, 1, 1)
+ self.StackedWidget.addWidget(self.CoverPage)
+ self.SelectFiles = QtGui.QWidget()
+ self.SelectFiles.setObjectName("SelectFiles")
+ self.gridlayout7 = QtGui.QGridLayout(self.SelectFiles)
+ self.gridlayout7.setObjectName("gridlayout7")
+ self.label_2 = QtGui.QLabel(self.SelectFiles)
+ font = QtGui.QFont()
+ font.setPointSize(16)
+ self.label_2.setFont(font)
+ self.label_2.setWordWrap(True)
+ self.label_2.setObjectName("label_2")
+ self.gridlayout7.addWidget(self.label_2, 0, 0, 1, 1)
+ self.line = QtGui.QFrame(self.SelectFiles)
+ self.line.setFrameShape(QtGui.QFrame.HLine)
+ self.line.setFrameShadow(QtGui.QFrame.Sunken)
+ self.line.setObjectName("line")
+ self.gridlayout7.addWidget(self.line, 1, 0, 1, 1)
+ self.FilesTable = FileTable(self.SelectFiles)
+ sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.FilesTable.sizePolicy().hasHeightForWidth())
+ self.FilesTable.setSizePolicy(sizePolicy)
+ self.FilesTable.setObjectName("FilesTable")
+ self.gridlayout7.addWidget(self.FilesTable, 2, 0, 1, 1)
+ self.FilesPageNote = QtGui.QLabel(self.SelectFiles)
+ self.FilesPageNote.setWordWrap(True)
+ self.FilesPageNote.setObjectName("FilesPageNote")
+ self.gridlayout7.addWidget(self.FilesPageNote, 3, 0, 1, 1)
+ self.StackedWidget.addWidget(self.SelectFiles)
+ self.SelectRecipients = QtGui.QWidget()
+ self.SelectRecipients.setObjectName("SelectRecipients")
+ self.gridlayout8 = QtGui.QGridLayout(self.SelectRecipients)
+ self.gridlayout8.setObjectName("gridlayout8")
+ self.label_4 = QtGui.QLabel(self.SelectRecipients)
+ font = QtGui.QFont()
+ font.setPointSize(16)
+ self.label_4.setFont(font)
+ self.label_4.setObjectName("label_4")
+ self.gridlayout8.addWidget(self.label_4, 0, 0, 1, 1)
+ self.line_3 = QtGui.QFrame(self.SelectRecipients)
+ self.line_3.setFrameShape(QtGui.QFrame.HLine)
+ self.line_3.setFrameShadow(QtGui.QFrame.Sunken)
+ self.line_3.setObjectName("line_3")
+ self.gridlayout8.addWidget(self.line_3, 1, 0, 1, 1)
+ self.groupBox_4 = QtGui.QGroupBox(self.SelectRecipients)
+ self.groupBox_4.setObjectName("groupBox_4")
+ self.gridlayout9 = QtGui.QGridLayout(self.groupBox_4)
+ self.gridlayout9.setObjectName("gridlayout9")
+ self.RecipientsTable = QtGui.QTableWidget(self.groupBox_4)
+ self.RecipientsTable.setObjectName("RecipientsTable")
+ self.RecipientsTable.setColumnCount(0)
+ self.RecipientsTable.setRowCount(0)
+ self.gridlayout9.addWidget(self.RecipientsTable, 0, 0, 1, 5)
+ self.RemoveRecipientButton = QtGui.QPushButton(self.groupBox_4)
+ self.RemoveRecipientButton.setEnabled(False)
+ self.RemoveRecipientButton.setObjectName("RemoveRecipientButton")
+ self.gridlayout9.addWidget(self.RemoveRecipientButton, 1, 0, 1, 1)
+ self.MoveRecipientUpButton = QtGui.QPushButton(self.groupBox_4)
+ self.MoveRecipientUpButton.setEnabled(False)
+ self.MoveRecipientUpButton.setObjectName("MoveRecipientUpButton")
+ self.gridlayout9.addWidget(self.MoveRecipientUpButton, 1, 1, 1, 1)
+ self.MoveRecipientDownButton = QtGui.QPushButton(self.groupBox_4)
+ self.MoveRecipientDownButton.setEnabled(False)
+ self.MoveRecipientDownButton.setObjectName("MoveRecipientDownButton")
+ self.gridlayout9.addWidget(self.MoveRecipientDownButton, 1, 2, 1, 1)
+ spacerItem5 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+ self.gridlayout9.addItem(spacerItem5, 1, 3, 1, 1)
+ self.FABButton = QtGui.QPushButton(self.groupBox_4)
+ self.FABButton.setObjectName("FABButton")
+ self.gridlayout9.addWidget(self.FABButton, 1, 4, 1, 1)
+ self.gridlayout8.addWidget(self.groupBox_4, 2, 0, 1, 1)
+ self.groupBox = QtGui.QGroupBox(self.SelectRecipients)
+ self.groupBox.setObjectName("groupBox")
+ self.gridlayout10 = QtGui.QGridLayout(self.groupBox)
+ self.gridlayout10.setObjectName("gridlayout10")
+ self.hboxlayout = QtGui.QHBoxLayout()
+ self.hboxlayout.setObjectName("hboxlayout")
+ self.label = QtGui.QLabel(self.groupBox)
+ self.label.setObjectName("label")
+ self.hboxlayout.addWidget(self.label)
+ spacerItem6 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Minimum)
+ self.hboxlayout.addItem(spacerItem6)
+ self.AddIndividualComboBox = QtGui.QComboBox(self.groupBox)
+ sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.AddIndividualComboBox.sizePolicy().hasHeightForWidth())
+ self.AddIndividualComboBox.setSizePolicy(sizePolicy)
+ self.AddIndividualComboBox.setObjectName("AddIndividualComboBox")
+ self.hboxlayout.addWidget(self.AddIndividualComboBox)
+ self.AddIndividualButton = QtGui.QPushButton(self.groupBox)
+ self.AddIndividualButton.setEnabled(False)
+ self.AddIndividualButton.setObjectName("AddIndividualButton")
+ self.hboxlayout.addWidget(self.AddIndividualButton)
+ self.gridlayout10.addLayout(self.hboxlayout, 0, 0, 1, 1)
+ self.hboxlayout1 = QtGui.QHBoxLayout()
+ self.hboxlayout1.setObjectName("hboxlayout1")
+ self.label_5 = QtGui.QLabel(self.groupBox)
+ self.label_5.setObjectName("label_5")
+ self.hboxlayout1.addWidget(self.label_5)
+ spacerItem7 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Minimum)
+ self.hboxlayout1.addItem(spacerItem7)
+ self.AddGroupComboBox = QtGui.QComboBox(self.groupBox)
+ sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.AddGroupComboBox.sizePolicy().hasHeightForWidth())
+ self.AddGroupComboBox.setSizePolicy(sizePolicy)
+ self.AddGroupComboBox.setObjectName("AddGroupComboBox")
+ self.hboxlayout1.addWidget(self.AddGroupComboBox)
+ self.AddGroupButton = QtGui.QPushButton(self.groupBox)
+ self.AddGroupButton.setEnabled(False)
+ self.AddGroupButton.setObjectName("AddGroupButton")
+ self.hboxlayout1.addWidget(self.AddGroupButton)
+ self.gridlayout10.addLayout(self.hboxlayout1, 1, 0, 1, 1)
+ self.gridlayout8.addWidget(self.groupBox, 3, 0, 1, 1)
+ self.groupBox_3 = QtGui.QGroupBox(self.SelectRecipients)
+ self.groupBox_3.setObjectName("groupBox_3")
+ self.gridlayout11 = QtGui.QGridLayout(self.groupBox_3)
+ self.gridlayout11.setObjectName("gridlayout11")
+ self.hboxlayout2 = QtGui.QHBoxLayout()
+ self.hboxlayout2.setObjectName("hboxlayout2")
+ self.label_6 = QtGui.QLabel(self.groupBox_3)
+ self.label_6.setObjectName("label_6")
+ self.hboxlayout2.addWidget(self.label_6)
+ self.QuickAddNameEdit = QtGui.QLineEdit(self.groupBox_3)
+ self.QuickAddNameEdit.setObjectName("QuickAddNameEdit")
+ self.hboxlayout2.addWidget(self.QuickAddNameEdit)
+ self.label_7 = QtGui.QLabel(self.groupBox_3)
+ self.label_7.setObjectName("label_7")
+ self.hboxlayout2.addWidget(self.label_7)
+ self.QuickAddFaxEdit = QtGui.QLineEdit(self.groupBox_3)
+ self.QuickAddFaxEdit.setObjectName("QuickAddFaxEdit")
+ self.hboxlayout2.addWidget(self.QuickAddFaxEdit)
+ self.QuickAddButton = QtGui.QPushButton(self.groupBox_3)
+ self.QuickAddButton.setEnabled(False)
+ self.QuickAddButton.setObjectName("QuickAddButton")
+ self.hboxlayout2.addWidget(self.QuickAddButton)
+ self.gridlayout11.addLayout(self.hboxlayout2, 0, 0, 1, 1)
+ self.gridlayout8.addWidget(self.groupBox_3, 4, 0, 1, 1)
+ self.StackedWidget.addWidget(self.SelectRecipients)
+ self.SendFax = QtGui.QWidget()
+ self.SendFax.setObjectName("SendFax")
+ self.gridlayout12 = QtGui.QGridLayout(self.SendFax)
+ self.gridlayout12.setObjectName("gridlayout12")
+ self.label_9 = QtGui.QLabel(self.SendFax)
+ font = QtGui.QFont()
+ font.setPointSize(16)
+ self.label_9.setFont(font)
+ self.label_9.setObjectName("label_9")
+ self.gridlayout12.addWidget(self.label_9, 0, 0, 1, 1)
+ self.line_5 = QtGui.QFrame(self.SendFax)
+ self.line_5.setFrameShape(QtGui.QFrame.HLine)
+ self.line_5.setFrameShadow(QtGui.QFrame.Sunken)
+ self.line_5.setObjectName("line_5")
+ self.gridlayout12.addWidget(self.line_5, 1, 0, 1, 1)
+ self.label_10 = QtGui.QLabel(self.SendFax)
+ self.label_10.setObjectName("label_10")
+ self.gridlayout12.addWidget(self.label_10, 2, 0, 1, 1)
+ self.StatusList = QtGui.QListWidget(self.SendFax)
+ self.StatusList.setObjectName("StatusList")
+ self.gridlayout12.addWidget(self.StatusList, 3, 0, 1, 1)
+ self.label_15 = QtGui.QLabel(self.SendFax)
+ self.label_15.setObjectName("label_15")
+ self.gridlayout12.addWidget(self.label_15, 4, 0, 1, 1)
+ self.StackedWidget.addWidget(self.SendFax)
+ self.gridlayout.addWidget(self.StackedWidget, 0, 0, 1, 5)
+ self.line_6 = QtGui.QFrame(Dialog)
+ self.line_6.setFrameShape(QtGui.QFrame.HLine)
+ self.line_6.setFrameShadow(QtGui.QFrame.Sunken)
+ self.line_6.setObjectName("line_6")
+ self.gridlayout.addWidget(self.line_6, 1, 0, 1, 5)
+ self.StepText = QtGui.QLabel(Dialog)
+ self.StepText.setObjectName("StepText")
+ self.gridlayout.addWidget(self.StepText, 2, 0, 1, 1)
+ spacerItem8 = QtGui.QSpacerItem(231, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+ self.gridlayout.addItem(spacerItem8, 2, 1, 1, 1)
+ self.BackButton = QtGui.QPushButton(Dialog)
+ self.BackButton.setObjectName("BackButton")
+ self.gridlayout.addWidget(self.BackButton, 2, 2, 1, 1)
+ self.NextButton = QtGui.QPushButton(Dialog)
+ self.NextButton.setObjectName("NextButton")
+ self.gridlayout.addWidget(self.NextButton, 2, 3, 1, 1)
+ self.CancelButton = QtGui.QPushButton(Dialog)
+ self.CancelButton.setObjectName("CancelButton")
+ self.gridlayout.addWidget(self.CancelButton, 2, 4, 1, 1)
+
+ self.retranslateUi(Dialog)
+ self.StackedWidget.setCurrentIndex(1)
+ QtCore.QMetaObject.connectSlotsByName(Dialog)
+
+ def retranslateUi(self, Dialog):
+ Dialog.setWindowTitle(QtGui.QApplication.translate("Dialog", "HP Device Manager - Send Fax", None, QtGui.QApplication.UnicodeUTF8))
+ self.label_8.setText(QtGui.QApplication.translate("Dialog", "Select Fax", None, QtGui.QApplication.UnicodeUTF8))
+ self.FaxOptionsButton.setText(QtGui.QApplication.translate("Dialog", "Fax Settings...", None, QtGui.QApplication.UnicodeUTF8))
+ self.FaxSetupButton.setText(QtGui.QApplication.translate("Dialog", "Fax Device Setup...", None, QtGui.QApplication.UnicodeUTF8))
+ self.label_12.setText(QtGui.QApplication.translate("Dialog", "<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
+"p, li { white-space: pre-wrap; }\n"
+"</style></head><body style=\" font-family:\'Sans Serif\'; font-size:9pt; font-weight:400; font-style:normal;\">\n"
+"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">Select the desired fax printer queue and click <span style=\" font-style:italic;\">Next</span> to continue. Note: Once you continue to the next step, you will not be able to change to a different fax queue.</p></body></html>", None, QtGui.QApplication.UnicodeUTF8))
+ self.label_3.setText(QtGui.QApplication.translate("Dialog", "Select and Edit Fax Coverpage (Optional)", None, QtGui.QApplication.UnicodeUTF8))
+ self.CoverPageGroupBox.setTitle(QtGui.QApplication.translate("Dialog", "Include Coverpage", None, QtGui.QApplication.UnicodeUTF8))
+ self.label_16.setText(QtGui.QApplication.translate("Dialog", "Regarding:", None, QtGui.QApplication.UnicodeUTF8))
+ self.label_17.setText(QtGui.QApplication.translate("Dialog", "Optional Message: (max. 2000 characters or 32 preformatted lines)", None, QtGui.QApplication.UnicodeUTF8))
+ self.PreserveFormattingCheckBox.setText(QtGui.QApplication.translate("Dialog", "Preformatted (preserve formatting)", None, QtGui.QApplication.UnicodeUTF8))
+ self.label_13.setText(QtGui.QApplication.translate("Dialog", "<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
+"p, li { white-space: pre-wrap; }\n"
+"</style></head><body style=\" font-family:\'DejaVu Sans\'; font-size:10pt; font-weight:400; font-style:normal;\">\n"
+"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:\'Sans Serif\'; font-size:9pt;\">Check<span style=\" font-style:italic;\"> Include Coverpage </span>to add a coverpage to this fax. To continue without a coverpage, click <span style=\" font-style:italic;\">Next &gt;</span>.</p></body></html>", None, QtGui.QApplication.UnicodeUTF8))
+ self.label_2.setText(QtGui.QApplication.translate("Dialog", "Select Files to Send", None, QtGui.QApplication.UnicodeUTF8))
+ self.FilesPageNote.setText(QtGui.QApplication.translate("Dialog", "Note: You may also add files to the fax by printing from any application to the \'%1\' fax printer.", None, QtGui.QApplication.UnicodeUTF8))
+ self.label_4.setText(QtGui.QApplication.translate("Dialog", "Select Fax Recipients", None, QtGui.QApplication.UnicodeUTF8))
+ self.groupBox_4.setTitle(QtGui.QApplication.translate("Dialog", "Recipients", None, QtGui.QApplication.UnicodeUTF8))
+ self.RemoveRecipientButton.setText(QtGui.QApplication.translate("Dialog", "Remove", None, QtGui.QApplication.UnicodeUTF8))
+ self.MoveRecipientUpButton.setText(QtGui.QApplication.translate("Dialog", "Move Up", None, QtGui.QApplication.UnicodeUTF8))
+ self.MoveRecipientDownButton.setText(QtGui.QApplication.translate("Dialog", "Move Down", None, QtGui.QApplication.UnicodeUTF8))
+ self.FABButton.setText(QtGui.QApplication.translate("Dialog", "Fax Address Book...", None, QtGui.QApplication.UnicodeUTF8))
+ self.groupBox.setTitle(QtGui.QApplication.translate("Dialog", "Add Recipients or Groups from the Fax Address Book", None, QtGui.QApplication.UnicodeUTF8))
+ self.label.setText(QtGui.QApplication.translate("Dialog", "Add an individual:", None, QtGui.QApplication.UnicodeUTF8))
+ self.AddIndividualButton.setText(QtGui.QApplication.translate("Dialog", "Add", None, QtGui.QApplication.UnicodeUTF8))
+ self.label_5.setText(QtGui.QApplication.translate("Dialog", "Add a group:", None, QtGui.QApplication.UnicodeUTF8))
+ self.AddGroupButton.setText(QtGui.QApplication.translate("Dialog", "Add", None, QtGui.QApplication.UnicodeUTF8))
+ self.groupBox_3.setTitle(QtGui.QApplication.translate("Dialog", "Quick Add an Individual Recipient (recipient will automatically be added to fax address book)", None, QtGui.QApplication.UnicodeUTF8))
+ self.label_6.setText(QtGui.QApplication.translate("Dialog", "Name:", None, QtGui.QApplication.UnicodeUTF8))
+ self.label_7.setText(QtGui.QApplication.translate("Dialog", "Fax Number:", None, QtGui.QApplication.UnicodeUTF8))
+ self.QuickAddButton.setText(QtGui.QApplication.translate("Dialog", "Add", None, QtGui.QApplication.UnicodeUTF8))
+ self.label_9.setText(QtGui.QApplication.translate("Dialog", "Send Fax", None, QtGui.QApplication.UnicodeUTF8))
+ self.label_10.setText(QtGui.QApplication.translate("Dialog", "Status:", None, QtGui.QApplication.UnicodeUTF8))
+ self.label_15.setText(QtGui.QApplication.translate("Dialog", "<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
+"p, li { white-space: pre-wrap; }\n"
+"</style></head><body style=\" font-family:\'Sans Serif\'; font-size:9pt; font-weight:400; font-style:normal;\">\n"
+"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">Click <span style=\" font-style:italic;\">Send Fax</span> to start the fax transmission.</p></body></html>", None, QtGui.QApplication.UnicodeUTF8))
+ self.StepText.setText(QtGui.QApplication.translate("Dialog", "Step %1 of %2", None, QtGui.QApplication.UnicodeUTF8))
+ self.BackButton.setText(QtGui.QApplication.translate("Dialog", "< Back", None, QtGui.QApplication.UnicodeUTF8))
+ self.NextButton.setText(QtGui.QApplication.translate("Dialog", "Next >", None, QtGui.QApplication.UnicodeUTF8))
+ self.CancelButton.setText(QtGui.QApplication.translate("Dialog", "Cancel", None, QtGui.QApplication.UnicodeUTF8))
+
+from printernamecombobox import PrinterNameComboBox
+from filetable import FileTable
diff --git a/ui4/sendfaxdialog_base.ui b/ui4/sendfaxdialog_base.ui
new file mode 100644
index 0000000..e873050
--- /dev/null
+++ b/ui4/sendfaxdialog_base.ui
@@ -0,0 +1,711 @@
+<ui version="4.0" >
+ <class>Dialog</class>
+ <widget class="QDialog" name="Dialog" >
+ <property name="windowModality" >
+ <enum>Qt::ApplicationModal</enum>
+ </property>
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>600</width>
+ <height>500</height>
+ </rect>
+ </property>
+ <property name="windowTitle" >
+ <string>HP Device Manager - Send Fax</string>
+ </property>
+ <layout class="QGridLayout" >
+ <item row="0" column="0" colspan="5" >
+ <widget class="QStackedWidget" name="StackedWidget" >
+ <property name="frameShape" >
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="currentIndex" >
+ <number>1</number>
+ </property>
+ <widget class="QWidget" name="SelectFax" >
+ <layout class="QGridLayout" >
+ <item row="0" column="0" >
+ <widget class="QLabel" name="label_8" >
+ <property name="font" >
+ <font>
+ <pointsize>16</pointsize>
+ </font>
+ </property>
+ <property name="text" >
+ <string>Select Fax</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="Line" name="line_4" >
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" >
+ <layout class="QGridLayout" >
+ <item row="0" column="0" colspan="3" >
+ <widget class="PrinterNameComboBox" name="FaxComboBox" />
+ </item>
+ <item row="1" column="0" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType" >
+ <enum>QSizePolicy::MinimumExpanding</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="1" column="1" >
+ <widget class="QPushButton" name="FaxOptionsButton" >
+ <property name="sizePolicy" >
+ <sizepolicy vsizetype="Fixed" hsizetype="Minimum" >
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string>Fax Settings...</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2" >
+ <widget class="QPushButton" name="FaxSetupButton" >
+ <property name="sizePolicy" >
+ <sizepolicy vsizetype="Fixed" hsizetype="Minimum" >
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string>Fax Device Setup...</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="3" column="0" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>564</width>
+ <height>221</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="4" column="0" >
+ <widget class="QLabel" name="label_12" >
+ <property name="text" >
+ <string>&lt;html>&lt;head>&lt;meta name="qrichtext" content="1" />&lt;style type="text/css">
+p, li { white-space: pre-wrap; }
+&lt;/style>&lt;/head>&lt;body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;">
+&lt;p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Select the desired fax printer queue and click &lt;span style=" font-style:italic;">Next&lt;/span> to continue. Note: Once you continue to the next step, you will not be able to change to a different fax queue.&lt;/p>&lt;/body>&lt;/html></string>
+ </property>
+ <property name="wordWrap" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="CoverPage" >
+ <layout class="QGridLayout" >
+ <item row="0" column="0" >
+ <widget class="QLabel" name="label_3" >
+ <property name="font" >
+ <font>
+ <pointsize>16</pointsize>
+ </font>
+ </property>
+ <property name="text" >
+ <string>Select and Edit Fax Coverpage (Optional)</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="Line" name="line_2" >
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" >
+ <widget class="QGroupBox" name="CoverPageGroupBox" >
+ <property name="enabled" >
+ <bool>true</bool>
+ </property>
+ <property name="title" >
+ <string>Include Coverpage</string>
+ </property>
+ <property name="checkable" >
+ <bool>true</bool>
+ </property>
+ <property name="checked" >
+ <bool>false</bool>
+ </property>
+ <layout class="QGridLayout" >
+ <item rowspan="2" row="0" column="0" >
+ <layout class="QGridLayout" >
+ <item row="0" column="0" colspan="4" >
+ <widget class="QLabel" name="CoverPageName" >
+ <property name="frameShape" >
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="text" >
+ <string/>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" colspan="4" >
+ <widget class="QLabel" name="CoverPagePreview" >
+ <property name="sizePolicy" >
+ <sizepolicy vsizetype="Fixed" hsizetype="Fixed" >
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize" >
+ <size>
+ <width>134</width>
+ <height>192</height>
+ </size>
+ </property>
+ <property name="maximumSize" >
+ <size>
+ <width>134</width>
+ <height>192</height>
+ </size>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="text" >
+ <string/>
+ </property>
+ <property name="scaledContents" >
+ <bool>true</bool>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType" >
+ <enum>QSizePolicy::Preferred</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>16</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="2" column="1" >
+ <widget class="QPushButton" name="PrevCoverPageButton" >
+ <property name="text" >
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="2" >
+ <widget class="QPushButton" name="NextCoverPageButton" >
+ <property name="text" >
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="3" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType" >
+ <enum>QSizePolicy::Preferred</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>31</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="3" column="1" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>20</width>
+ <height>21</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ <item row="0" column="1" >
+ <layout class="QVBoxLayout" >
+ <item>
+ <widget class="QLabel" name="label_16" >
+ <property name="text" >
+ <string>Regarding:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLineEdit" name="RegardingEdit" />
+ </item>
+ </layout>
+ </item>
+ <item row="1" column="1" >
+ <layout class="QGridLayout" >
+ <item row="0" column="0" >
+ <widget class="QLabel" name="label_17" >
+ <property name="text" >
+ <string>Optional Message: (max. 2000 characters or 32 preformatted lines)</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QTextEdit" name="MessageEdit" />
+ </item>
+ <item row="2" column="0" >
+ <widget class="QCheckBox" name="PreserveFormattingCheckBox" >
+ <property name="text" >
+ <string>Preformatted (preserve formatting)</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="3" column="0" >
+ <widget class="QLabel" name="label_13" >
+ <property name="text" >
+ <string>&lt;html>&lt;head>&lt;meta name="qrichtext" content="1" />&lt;style type="text/css">
+p, li { white-space: pre-wrap; }
+&lt;/style>&lt;/head>&lt;body style=" font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;">
+&lt;p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;">Check&lt;span style=" font-style:italic;"> Include Coverpage &lt;/span>to add a coverpage to this fax. To continue without a coverpage, click &lt;span style=" font-style:italic;">Next &amp;gt;&lt;/span>.&lt;/p>&lt;/body>&lt;/html></string>
+ </property>
+ <property name="wordWrap" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="SelectFiles" >
+ <layout class="QGridLayout" >
+ <item row="0" column="0" >
+ <widget class="QLabel" name="label_2" >
+ <property name="font" >
+ <font>
+ <pointsize>16</pointsize>
+ </font>
+ </property>
+ <property name="text" >
+ <string>Select Files to Send</string>
+ </property>
+ <property name="wordWrap" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="Line" name="line" >
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" >
+ <widget class="FileTable" native="1" name="FilesTable" >
+ <property name="sizePolicy" >
+ <sizepolicy vsizetype="Expanding" hsizetype="Expanding" >
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0" >
+ <widget class="QLabel" name="FilesPageNote" >
+ <property name="text" >
+ <string>Note: You may also add files to the fax by printing from any application to the '%1' fax printer.</string>
+ </property>
+ <property name="wordWrap" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="SelectRecipients" >
+ <layout class="QGridLayout" >
+ <item row="0" column="0" >
+ <widget class="QLabel" name="label_4" >
+ <property name="font" >
+ <font>
+ <pointsize>16</pointsize>
+ </font>
+ </property>
+ <property name="text" >
+ <string>Select Fax Recipients</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="Line" name="line_3" >
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" >
+ <widget class="QGroupBox" name="groupBox_4" >
+ <property name="title" >
+ <string>Recipients</string>
+ </property>
+ <layout class="QGridLayout" >
+ <item row="0" column="0" colspan="5" >
+ <widget class="QTableWidget" name="RecipientsTable" />
+ </item>
+ <item row="1" column="0" >
+ <widget class="QPushButton" name="RemoveRecipientButton" >
+ <property name="enabled" >
+ <bool>false</bool>
+ </property>
+ <property name="text" >
+ <string>Remove</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1" >
+ <widget class="QPushButton" name="MoveRecipientUpButton" >
+ <property name="enabled" >
+ <bool>false</bool>
+ </property>
+ <property name="text" >
+ <string>Move Up</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2" >
+ <widget class="QPushButton" name="MoveRecipientDownButton" >
+ <property name="enabled" >
+ <bool>false</bool>
+ </property>
+ <property name="text" >
+ <string>Move Down</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="3" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="1" column="4" >
+ <widget class="QPushButton" name="FABButton" >
+ <property name="text" >
+ <string>Fax Address Book...</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="3" column="0" >
+ <widget class="QGroupBox" name="groupBox" >
+ <property name="title" >
+ <string>Add Recipients or Groups from the Fax Address Book</string>
+ </property>
+ <layout class="QGridLayout" >
+ <item row="0" column="0" >
+ <layout class="QHBoxLayout" >
+ <item>
+ <widget class="QLabel" name="label" >
+ <property name="text" >
+ <string>Add an individual:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType" >
+ <enum>QSizePolicy::Preferred</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QComboBox" name="AddIndividualComboBox" >
+ <property name="sizePolicy" >
+ <sizepolicy vsizetype="Fixed" hsizetype="Expanding" >
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="AddIndividualButton" >
+ <property name="enabled" >
+ <bool>false</bool>
+ </property>
+ <property name="text" >
+ <string>Add</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="1" column="0" >
+ <layout class="QHBoxLayout" >
+ <item>
+ <widget class="QLabel" name="label_5" >
+ <property name="text" >
+ <string>Add a group:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType" >
+ <enum>QSizePolicy::Preferred</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QComboBox" name="AddGroupComboBox" >
+ <property name="sizePolicy" >
+ <sizepolicy vsizetype="Fixed" hsizetype="Expanding" >
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="AddGroupButton" >
+ <property name="enabled" >
+ <bool>false</bool>
+ </property>
+ <property name="text" >
+ <string>Add</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="4" column="0" >
+ <widget class="QGroupBox" name="groupBox_3" >
+ <property name="title" >
+ <string>Quick Add an Individual Recipient (recipient will automatically be added to fax address book)</string>
+ </property>
+ <layout class="QGridLayout" >
+ <item row="0" column="0" >
+ <layout class="QHBoxLayout" >
+ <item>
+ <widget class="QLabel" name="label_6" >
+ <property name="text" >
+ <string>Name:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLineEdit" name="QuickAddNameEdit" />
+ </item>
+ <item>
+ <widget class="QLabel" name="label_7" >
+ <property name="text" >
+ <string>Fax Number:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLineEdit" name="QuickAddFaxEdit" />
+ </item>
+ <item>
+ <widget class="QPushButton" name="QuickAddButton" >
+ <property name="enabled" >
+ <bool>false</bool>
+ </property>
+ <property name="text" >
+ <string>Add</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="SendFax" >
+ <layout class="QGridLayout" >
+ <item row="0" column="0" >
+ <widget class="QLabel" name="label_9" >
+ <property name="font" >
+ <font>
+ <pointsize>16</pointsize>
+ </font>
+ </property>
+ <property name="text" >
+ <string>Send Fax</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="Line" name="line_5" >
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" >
+ <widget class="QLabel" name="label_10" >
+ <property name="text" >
+ <string>Status:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0" >
+ <widget class="QListWidget" name="StatusList" />
+ </item>
+ <item row="4" column="0" >
+ <widget class="QLabel" name="label_15" >
+ <property name="text" >
+ <string>&lt;html>&lt;head>&lt;meta name="qrichtext" content="1" />&lt;style type="text/css">
+p, li { white-space: pre-wrap; }
+&lt;/style>&lt;/head>&lt;body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;">
+&lt;p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Click &lt;span style=" font-style:italic;">Send Fax&lt;/span> to start the fax transmission.&lt;/p>&lt;/body>&lt;/html></string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ </item>
+ <item row="1" column="0" colspan="5" >
+ <widget class="Line" name="line_6" >
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" >
+ <widget class="QLabel" name="StepText" >
+ <property name="text" >
+ <string>Step %1 of %2</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>231</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="2" column="2" >
+ <widget class="QPushButton" name="BackButton" >
+ <property name="text" >
+ <string>&lt; Back</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="3" >
+ <widget class="QPushButton" name="NextButton" >
+ <property name="text" >
+ <string>Next ></string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="4" >
+ <widget class="QPushButton" name="CancelButton" >
+ <property name="text" >
+ <string>Cancel</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <customwidgets>
+ <customwidget>
+ <class>FileTable</class>
+ <extends>QWidget</extends>
+ <header>filetable.h</header>
+ <container>1</container>
+ </customwidget>
+ <customwidget>
+ <class>PrinterNameComboBox</class>
+ <extends>QComboBox</extends>
+ <header>printernamecombobox.h</header>
+ </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/ui4/settingsdialog.py b/ui4/settingsdialog.py
new file mode 100644
index 0000000..be4e4ec
--- /dev/null
+++ b/ui4/settingsdialog.py
@@ -0,0 +1,106 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2001-2008 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+# Local
+from base.g import *
+from base.codes import *
+from ui_utils import *
+
+# Qt
+from PyQt4.QtCore import *
+from PyQt4.QtGui import *
+from settingsdialog_base import Ui_SettingsDialog_base
+
+
+
+class SettingsDialog(QDialog, Ui_SettingsDialog_base):
+ def __init__(self, parent=None):
+ QDialog.__init__(self, parent)
+ self.setupUi(self)
+
+ self.connect(self.SetDefaultsButton, SIGNAL("clicked()"), self.SetDefaultsButton_clicked)
+
+ self.user_settings = UserSettings()
+ self.user_settings.load()
+
+ cur_vers = sys_conf.get('hplip', 'version')
+ last_ver = user_conf.get('upgrade','latest_available_version')
+ if cur_vers != last_ver:
+ upgrade_msg ="Currently HPLIP-%s version is installed.\nLatest HPLIP-%s version is available for installation"%(cur_vers, last_ver)
+ else:
+ upgrade_msg ="HPLIP-%s version is installed"%(cur_vers)
+
+ self.SystemTraySettings.initUi(self.user_settings.systray_visible,
+ self.user_settings.polling,
+ self.user_settings.polling_interval,
+ self.user_settings.device_list,
+ self.user_settings.systray_messages,
+ self.user_settings.upgrade_notify,
+ self.user_settings.upgrade_pending_update_time,
+ upgrade_msg)
+
+ self.updateControls()
+
+
+ def updateControls(self):
+ self.AutoRefreshCheckBox.setChecked(self.user_settings.auto_refresh)
+ self.AutoRefreshRateSpinBox.setValue(self.user_settings.auto_refresh_rate) # min
+ if self.user_settings.auto_refresh_type == 1:
+ self.RefreshCurrentRadioButton.setChecked(True)
+ else:
+ self.RefreshAllRadioButton.setChecked(True)
+
+ self.ScanCommandLineEdit.setText(self.user_settings.cmd_scan)
+ self.SystemTraySettings.systray_visible = self.user_settings.systray_visible
+ self.SystemTraySettings.systray_messages = self.user_settings.systray_messages
+ self.SystemTraySettings.updateUi()
+
+
+ def updateData(self):
+ self.user_settings.systray_visible = self.SystemTraySettings.systray_visible
+ self.user_settings.systray_messages = self.SystemTraySettings.systray_messages
+ self.user_settings.cmd_scan = unicode(self.ScanCommandLineEdit.text())
+ self.user_settings.auto_refresh = bool(self.AutoRefreshCheckBox.isChecked())
+
+ if self.RefreshCurrentRadioButton.isChecked():
+ self.user_settings.auto_refresh_type = 1
+ else:
+ self.user_settings.auto_refresh_type = 2
+
+ self.user_settings.auto_refresh_rate = self.AutoRefreshRateSpinBox.value()
+
+
+ def SetDefaultsButton_clicked(self):
+ self.user_settings.loadDefaults()
+ self.updateControls()
+
+
+ def accept(self):
+ self.updateData()
+ self.user_settings.save()
+ QDialog.accept(self)
+
+ # TODO: Need a way to signal hp-systray if systray_visible has changed
+
+ def __tr(self,s,c = None):
+ return qApp.translate("SettingsDialog",s,c)
+
+
diff --git a/ui4/settingsdialog_base.py b/ui4/settingsdialog_base.py
new file mode 100644
index 0000000..82cc4f0
--- /dev/null
+++ b/ui4/settingsdialog_base.py
@@ -0,0 +1,237 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'ui4/settingsdialog_base.ui'
+#
+# Created: Mon May 4 14:30:36 2009
+# by: PyQt4 UI code generator 4.4.4
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt4 import QtCore, QtGui
+
+class Ui_SettingsDialog_base(object):
+ def setupUi(self, SettingsDialog_base):
+ SettingsDialog_base.setObjectName("SettingsDialog_base")
+ SettingsDialog_base.resize(500, 540)
+ self.gridlayout = QtGui.QGridLayout(SettingsDialog_base)
+ self.gridlayout.setObjectName("gridlayout")
+ self.TabWidget = QtGui.QTabWidget(SettingsDialog_base)
+ self.TabWidget.setObjectName("TabWidget")
+ self.AutoRefresh = QtGui.QWidget()
+ self.AutoRefresh.setObjectName("AutoRefresh")
+ self.gridlayout1 = QtGui.QGridLayout(self.AutoRefresh)
+ self.gridlayout1.setObjectName("gridlayout1")
+ self.textLabel3_2_2 = QtGui.QLabel(self.AutoRefresh)
+ self.textLabel3_2_2.setWordWrap(False)
+ self.textLabel3_2_2.setObjectName("textLabel3_2_2")
+ self.gridlayout1.addWidget(self.textLabel3_2_2, 0, 0, 1, 1)
+ self.line1_2_2 = QtGui.QFrame(self.AutoRefresh)
+ self.line1_2_2.setFrameShape(QtGui.QFrame.HLine)
+ self.line1_2_2.setFrameShadow(QtGui.QFrame.Sunken)
+ self.line1_2_2.setObjectName("line1_2_2")
+ self.gridlayout1.addWidget(self.line1_2_2, 1, 0, 1, 1)
+ self.AutoRefreshCheckBox = QtGui.QCheckBox(self.AutoRefresh)
+ self.AutoRefreshCheckBox.setObjectName("AutoRefreshCheckBox")
+ self.gridlayout1.addWidget(self.AutoRefreshCheckBox, 2, 0, 1, 1)
+ self.RefreshRateGroupBox = QtGui.QGroupBox(self.AutoRefresh)
+ self.RefreshRateGroupBox.setEnabled(True)
+ self.RefreshRateGroupBox.setObjectName("RefreshRateGroupBox")
+ self.gridlayout2 = QtGui.QGridLayout(self.RefreshRateGroupBox)
+ self.gridlayout2.setObjectName("gridlayout2")
+ self.textLabel1_4 = QtGui.QLabel(self.RefreshRateGroupBox)
+ self.textLabel1_4.setWordWrap(False)
+ self.textLabel1_4.setObjectName("textLabel1_4")
+ self.gridlayout2.addWidget(self.textLabel1_4, 0, 0, 1, 1)
+ self.hboxlayout = QtGui.QHBoxLayout()
+ self.hboxlayout.setObjectName("hboxlayout")
+ self.AutoRefreshRateSpinBox = QtGui.QSpinBox(self.RefreshRateGroupBox)
+ self.AutoRefreshRateSpinBox.setEnabled(False)
+ self.AutoRefreshRateSpinBox.setWrapping(True)
+ self.AutoRefreshRateSpinBox.setButtonSymbols(QtGui.QAbstractSpinBox.PlusMinus)
+ self.AutoRefreshRateSpinBox.setMinimum(10)
+ self.AutoRefreshRateSpinBox.setMaximum(300)
+ self.AutoRefreshRateSpinBox.setProperty("value", QtCore.QVariant(30))
+ self.AutoRefreshRateSpinBox.setObjectName("AutoRefreshRateSpinBox")
+ self.hboxlayout.addWidget(self.AutoRefreshRateSpinBox)
+ self.gridlayout2.addLayout(self.hboxlayout, 0, 1, 1, 1)
+ spacerItem = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+ self.gridlayout2.addItem(spacerItem, 0, 2, 1, 1)
+ self.gridlayout1.addWidget(self.RefreshRateGroupBox, 3, 0, 1, 1)
+ self.RefreshTypeGroupBox = QtGui.QGroupBox(self.AutoRefresh)
+ self.RefreshTypeGroupBox.setObjectName("RefreshTypeGroupBox")
+ self.gridlayout3 = QtGui.QGridLayout(self.RefreshTypeGroupBox)
+ self.gridlayout3.setObjectName("gridlayout3")
+ self.RefreshCurrentRadioButton = QtGui.QRadioButton(self.RefreshTypeGroupBox)
+ self.RefreshCurrentRadioButton.setEnabled(False)
+ self.RefreshCurrentRadioButton.setChecked(True)
+ self.RefreshCurrentRadioButton.setObjectName("RefreshCurrentRadioButton")
+ self.gridlayout3.addWidget(self.RefreshCurrentRadioButton, 0, 0, 1, 1)
+ self.RefreshAllRadioButton = QtGui.QRadioButton(self.RefreshTypeGroupBox)
+ self.RefreshAllRadioButton.setEnabled(False)
+ self.RefreshAllRadioButton.setObjectName("RefreshAllRadioButton")
+ self.gridlayout3.addWidget(self.RefreshAllRadioButton, 1, 0, 1, 1)
+ self.gridlayout1.addWidget(self.RefreshTypeGroupBox, 4, 0, 1, 1)
+ spacerItem1 = QtGui.QSpacerItem(446, 41, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ self.gridlayout1.addItem(spacerItem1, 5, 0, 1, 1)
+ self.TabWidget.addTab(self.AutoRefresh, "")
+ self.SystemTray = QtGui.QWidget()
+ self.SystemTray.setObjectName("SystemTray")
+ self.gridlayout4 = QtGui.QGridLayout(self.SystemTray)
+ self.gridlayout4.setObjectName("gridlayout4")
+ self.textLabel3_2_3 = QtGui.QLabel(self.SystemTray)
+ self.textLabel3_2_3.setWordWrap(False)
+ self.textLabel3_2_3.setObjectName("textLabel3_2_3")
+ self.gridlayout4.addWidget(self.textLabel3_2_3, 0, 0, 1, 1)
+ self.line1_2_3 = QtGui.QFrame(self.SystemTray)
+ self.line1_2_3.setFrameShape(QtGui.QFrame.HLine)
+ self.line1_2_3.setFrameShadow(QtGui.QFrame.Sunken)
+ self.line1_2_3.setObjectName("line1_2_3")
+ self.gridlayout4.addWidget(self.line1_2_3, 1, 0, 1, 1)
+ self.SystemTraySettings = SystrayFrame(self.SystemTray)
+ sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.SystemTraySettings.sizePolicy().hasHeightForWidth())
+ self.SystemTraySettings.setSizePolicy(sizePolicy)
+ self.SystemTraySettings.setFrameShadow(QtGui.QFrame.Raised)
+ self.SystemTraySettings.setObjectName("SystemTraySettings")
+ self.gridlayout4.addWidget(self.SystemTraySettings, 2, 0, 1, 1)
+ self.TabWidget.addTab(self.SystemTray, "")
+ self.Commands = QtGui.QWidget()
+ self.Commands.setObjectName("Commands")
+ self.gridlayout5 = QtGui.QGridLayout(self.Commands)
+ self.gridlayout5.setObjectName("gridlayout5")
+ self.textLabel3_2_2_2 = QtGui.QLabel(self.Commands)
+ self.textLabel3_2_2_2.setWordWrap(False)
+ self.textLabel3_2_2_2.setObjectName("textLabel3_2_2_2")
+ self.gridlayout5.addWidget(self.textLabel3_2_2_2, 0, 0, 1, 2)
+ self.line1_2_2_3 = QtGui.QFrame(self.Commands)
+ self.line1_2_2_3.setFrameShape(QtGui.QFrame.HLine)
+ self.line1_2_2_3.setFrameShadow(QtGui.QFrame.Sunken)
+ self.line1_2_2_3.setObjectName("line1_2_2_3")
+ self.gridlayout5.addWidget(self.line1_2_2_3, 1, 0, 1, 2)
+ self.groupBox_3 = QtGui.QGroupBox(self.Commands)
+ self.groupBox_3.setObjectName("groupBox_3")
+ self.gridlayout6 = QtGui.QGridLayout(self.groupBox_3)
+ self.gridlayout6.setObjectName("gridlayout6")
+ self.textLabel1_2 = QtGui.QLabel(self.groupBox_3)
+ self.textLabel1_2.setEnabled(False)
+ self.textLabel1_2.setWordWrap(False)
+ self.textLabel1_2.setObjectName("textLabel1_2")
+ self.gridlayout6.addWidget(self.textLabel1_2, 0, 0, 1, 1)
+ self.PrintCommandLineEdit = QtGui.QLineEdit(self.groupBox_3)
+ self.PrintCommandLineEdit.setEnabled(False)
+ self.PrintCommandLineEdit.setObjectName("PrintCommandLineEdit")
+ self.gridlayout6.addWidget(self.PrintCommandLineEdit, 1, 0, 1, 1)
+ self.textLabel2_2 = QtGui.QLabel(self.groupBox_3)
+ self.textLabel2_2.setWordWrap(False)
+ self.textLabel2_2.setObjectName("textLabel2_2")
+ self.gridlayout6.addWidget(self.textLabel2_2, 2, 0, 1, 1)
+ self.ScanCommandLineEdit = QtGui.QLineEdit(self.groupBox_3)
+ self.ScanCommandLineEdit.setObjectName("ScanCommandLineEdit")
+ self.gridlayout6.addWidget(self.ScanCommandLineEdit, 3, 0, 1, 1)
+ self.textLabel3_3 = QtGui.QLabel(self.groupBox_3)
+ self.textLabel3_3.setEnabled(False)
+ self.textLabel3_3.setWordWrap(False)
+ self.textLabel3_3.setObjectName("textLabel3_3")
+ self.gridlayout6.addWidget(self.textLabel3_3, 4, 0, 1, 1)
+ self.SendFaxCommandLineEdit = QtGui.QLineEdit(self.groupBox_3)
+ self.SendFaxCommandLineEdit.setEnabled(False)
+ self.SendFaxCommandLineEdit.setObjectName("SendFaxCommandLineEdit")
+ self.gridlayout6.addWidget(self.SendFaxCommandLineEdit, 5, 0, 1, 1)
+ self.textLabel4 = QtGui.QLabel(self.groupBox_3)
+ self.textLabel4.setEnabled(False)
+ self.textLabel4.setWordWrap(False)
+ self.textLabel4.setObjectName("textLabel4")
+ self.gridlayout6.addWidget(self.textLabel4, 6, 0, 1, 1)
+ self.AccessPCardCommandLineEdit = QtGui.QLineEdit(self.groupBox_3)
+ self.AccessPCardCommandLineEdit.setEnabled(False)
+ self.AccessPCardCommandLineEdit.setObjectName("AccessPCardCommandLineEdit")
+ self.gridlayout6.addWidget(self.AccessPCardCommandLineEdit, 7, 0, 1, 1)
+ self.textLabel5 = QtGui.QLabel(self.groupBox_3)
+ self.textLabel5.setEnabled(False)
+ self.textLabel5.setWordWrap(False)
+ self.textLabel5.setObjectName("textLabel5")
+ self.gridlayout6.addWidget(self.textLabel5, 8, 0, 1, 1)
+ self.MakeCopiesCommandLineEdit = QtGui.QLineEdit(self.groupBox_3)
+ self.MakeCopiesCommandLineEdit.setEnabled(False)
+ self.MakeCopiesCommandLineEdit.setObjectName("MakeCopiesCommandLineEdit")
+ self.gridlayout6.addWidget(self.MakeCopiesCommandLineEdit, 9, 0, 1, 1)
+ self.gridlayout5.addWidget(self.groupBox_3, 2, 0, 1, 2)
+ spacerItem2 = QtGui.QSpacerItem(20, 60, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ self.gridlayout5.addItem(spacerItem2, 3, 1, 1, 1)
+ self.SetDefaultsButton = QtGui.QPushButton(self.Commands)
+ self.SetDefaultsButton.setEnabled(True)
+ self.SetDefaultsButton.setObjectName("SetDefaultsButton")
+ self.gridlayout5.addWidget(self.SetDefaultsButton, 4, 0, 1, 1)
+ spacerItem3 = QtGui.QSpacerItem(20, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+ self.gridlayout5.addItem(spacerItem3, 4, 1, 1, 1)
+ self.TabWidget.addTab(self.Commands, "")
+ self.gridlayout.addWidget(self.TabWidget, 0, 0, 1, 2)
+ spacerItem4 = QtGui.QSpacerItem(301, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+ self.gridlayout.addItem(spacerItem4, 1, 0, 1, 1)
+ self.StdButtons = QtGui.QDialogButtonBox(SettingsDialog_base)
+ self.StdButtons.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.NoButton|QtGui.QDialogButtonBox.Ok)
+ self.StdButtons.setCenterButtons(False)
+ self.StdButtons.setObjectName("StdButtons")
+ self.gridlayout.addWidget(self.StdButtons, 1, 1, 1, 1)
+ self.textLabel1_4.setBuddy(self.AutoRefreshRateSpinBox)
+ self.textLabel1_2.setBuddy(self.PrintCommandLineEdit)
+ self.textLabel2_2.setBuddy(self.ScanCommandLineEdit)
+ self.textLabel3_3.setBuddy(self.SendFaxCommandLineEdit)
+ self.textLabel4.setBuddy(self.AccessPCardCommandLineEdit)
+ self.textLabel5.setBuddy(self.MakeCopiesCommandLineEdit)
+
+ self.retranslateUi(SettingsDialog_base)
+ self.TabWidget.setCurrentIndex(2)
+ QtCore.QObject.connect(self.AutoRefreshCheckBox, QtCore.SIGNAL("toggled(bool)"), self.AutoRefreshRateSpinBox.setEnabled)
+ QtCore.QObject.connect(self.AutoRefreshCheckBox, QtCore.SIGNAL("toggled(bool)"), self.RefreshAllRadioButton.setEnabled)
+ QtCore.QObject.connect(self.AutoRefreshCheckBox, QtCore.SIGNAL("toggled(bool)"), self.RefreshCurrentRadioButton.setEnabled)
+ QtCore.QObject.connect(self.StdButtons, QtCore.SIGNAL("accepted()"), SettingsDialog_base.accept)
+ QtCore.QObject.connect(self.StdButtons, QtCore.SIGNAL("rejected()"), SettingsDialog_base.reject)
+ QtCore.QMetaObject.connectSlotsByName(SettingsDialog_base)
+ SettingsDialog_base.setTabOrder(self.TabWidget, self.AutoRefreshCheckBox)
+ SettingsDialog_base.setTabOrder(self.AutoRefreshCheckBox, self.AutoRefreshRateSpinBox)
+ SettingsDialog_base.setTabOrder(self.AutoRefreshRateSpinBox, self.RefreshCurrentRadioButton)
+ SettingsDialog_base.setTabOrder(self.RefreshCurrentRadioButton, self.RefreshAllRadioButton)
+ SettingsDialog_base.setTabOrder(self.RefreshAllRadioButton, self.PrintCommandLineEdit)
+ SettingsDialog_base.setTabOrder(self.PrintCommandLineEdit, self.ScanCommandLineEdit)
+ SettingsDialog_base.setTabOrder(self.ScanCommandLineEdit, self.SendFaxCommandLineEdit)
+ SettingsDialog_base.setTabOrder(self.SendFaxCommandLineEdit, self.AccessPCardCommandLineEdit)
+ SettingsDialog_base.setTabOrder(self.AccessPCardCommandLineEdit, self.MakeCopiesCommandLineEdit)
+ SettingsDialog_base.setTabOrder(self.MakeCopiesCommandLineEdit, self.SetDefaultsButton)
+ SettingsDialog_base.setTabOrder(self.SetDefaultsButton, self.StdButtons)
+
+ def retranslateUi(self, SettingsDialog_base):
+ SettingsDialog_base.setWindowTitle(QtGui.QApplication.translate("SettingsDialog_base", "HP Device Manager - Settings", None, QtGui.QApplication.UnicodeUTF8))
+ self.textLabel3_2_2.setText(QtGui.QApplication.translate("SettingsDialog_base", "<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
+"p, li { white-space: pre-wrap; }\n"
+"</style></head><body style=\" font-family:\'DejaVu Sans\'; font-size:10pt; font-weight:400; font-style:normal;\">\n"
+"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-weight:600;\">Configure if and when devices are automatically refreshed</span></p></body></html>", None, QtGui.QApplication.UnicodeUTF8))
+ self.AutoRefreshCheckBox.setText(QtGui.QApplication.translate("SettingsDialog_base", "&Enable device auto refresh", None, QtGui.QApplication.UnicodeUTF8))
+ self.RefreshRateGroupBox.setTitle(QtGui.QApplication.translate("SettingsDialog_base", "Refresh Interval", None, QtGui.QApplication.UnicodeUTF8))
+ self.textLabel1_4.setText(QtGui.QApplication.translate("SettingsDialog_base", "&Refresh every:", None, QtGui.QApplication.UnicodeUTF8))
+ self.AutoRefreshRateSpinBox.setSuffix(QtGui.QApplication.translate("SettingsDialog_base", " sec", None, QtGui.QApplication.UnicodeUTF8))
+ self.RefreshTypeGroupBox.setTitle(QtGui.QApplication.translate("SettingsDialog_base", "Devices to Refresh", None, QtGui.QApplication.UnicodeUTF8))
+ self.RefreshCurrentRadioButton.setText(QtGui.QApplication.translate("SettingsDialog_base", "Only &currently selected device", None, QtGui.QApplication.UnicodeUTF8))
+ self.RefreshAllRadioButton.setText(QtGui.QApplication.translate("SettingsDialog_base", "&All devices", None, QtGui.QApplication.UnicodeUTF8))
+ self.TabWidget.setTabText(self.TabWidget.indexOf(self.AutoRefresh), QtGui.QApplication.translate("SettingsDialog_base", "Auto Refresh", None, QtGui.QApplication.UnicodeUTF8))
+ self.textLabel3_2_3.setText(QtGui.QApplication.translate("SettingsDialog_base", "<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
+"p, li { white-space: pre-wrap; }\n"
+"</style></head><body style=\" font-family:\'DejaVu Sans\'; font-size:10pt; font-weight:400; font-style:normal;\">\n"
+"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-weight:600;\">Configure the behavior of the HP Status Service (hp-systray)</span></p></body></html>", None, QtGui.QApplication.UnicodeUTF8))
+ self.TabWidget.setTabText(self.TabWidget.indexOf(self.SystemTray), QtGui.QApplication.translate("SettingsDialog_base", "System Tray Icon", None, QtGui.QApplication.UnicodeUTF8))
+ self.textLabel3_2_2_2.setText(QtGui.QApplication.translate("SettingsDialog_base", "<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
+"p, li { white-space: pre-wrap; }\n"
+"</style></head><body style=\" font-family:\'DejaVu Sans\'; font-size:10pt; font-weight:400; font-style:normal;\">\n"
+"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-weight:600;\">Configure what commands to run for device actions</span></p></body></html>", None, QtGui.QApplication.UnicodeUTF8))
+ self.groupBox_3.setTitle(QtGui.QApplication.translate("SettingsDialog_base", "Commands", None, QtGui.QApplication.UnicodeUTF8))
+ self.textLabel1_2.setText(QtGui.QApplication.translate("SettingsDialog_base", "&Print:", None, QtGui.QApplication.UnicodeUTF8))
+ self.textLabel2_2.setText(QtGui.QApplication.translate("SettingsDialog_base", "&Scan:", None, QtGui.QApplication.UnicodeUTF8))
+ self.textLabel3_3.setText(QtGui.QApplication.translate("SettingsDialog_base", "Send PC &Fax:", None, QtGui.QApplication.UnicodeUTF8))
+ self.textLabel4.setText(QtGui.QApplication.translate("SettingsDialog_base", "&Unload Photo Cards:", None, QtGui.QApplication.UnicodeUTF8))
+ self.textLabel5.setText(QtGui.QApplication.translate("SettingsDialog_base", "Make &Copies:", None, QtGui.QApplication.UnicodeUTF8))
+ self.SetDefaultsButton.setText(QtGui.QApplication.translate("SettingsDialog_base", "Set &Defaults", None, QtGui.QApplication.UnicodeUTF8))
+ self.TabWidget.setTabText(self.TabWidget.indexOf(self.Commands), QtGui.QApplication.translate("SettingsDialog_base", "Commands (Advanced)", None, QtGui.QApplication.UnicodeUTF8))
+
+from systrayframe import SystrayFrame
diff --git a/ui4/settingsdialog_base.ui b/ui4/settingsdialog_base.ui
new file mode 100644
index 0000000..8ec841f
--- /dev/null
+++ b/ui4/settingsdialog_base.ui
@@ -0,0 +1,542 @@
+<ui version="4.0" >
+ <class>SettingsDialog_base</class>
+ <widget class="QDialog" name="SettingsDialog_base" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>500</width>
+ <height>540</height>
+ </rect>
+ </property>
+ <property name="windowTitle" >
+ <string>HP Device Manager - Settings</string>
+ </property>
+ <layout class="QGridLayout" >
+ <item row="0" column="0" colspan="2" >
+ <widget class="QTabWidget" name="TabWidget" >
+ <property name="currentIndex" >
+ <number>2</number>
+ </property>
+ <widget class="QWidget" name="AutoRefresh" >
+ <attribute name="title" >
+ <string>Auto Refresh</string>
+ </attribute>
+ <layout class="QGridLayout" >
+ <item row="0" column="0" >
+ <widget class="QLabel" name="textLabel3_2_2" >
+ <property name="text" >
+ <string>&lt;html>&lt;head>&lt;meta name="qrichtext" content="1" />&lt;style type="text/css">
+p, li { white-space: pre-wrap; }
+&lt;/style>&lt;/head>&lt;body style=" font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;">
+&lt;p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">&lt;span style=" font-weight:600;">Configure if and when devices are automatically refreshed&lt;/span>&lt;/p>&lt;/body>&lt;/html></string>
+ </property>
+ <property name="wordWrap" >
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="Line" name="line1_2_2" >
+ <property name="frameShape" >
+ <enum>QFrame::HLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" >
+ <widget class="QCheckBox" name="AutoRefreshCheckBox" >
+ <property name="text" >
+ <string>&amp;Enable device auto refresh</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0" >
+ <widget class="QGroupBox" name="RefreshRateGroupBox" >
+ <property name="enabled" >
+ <bool>true</bool>
+ </property>
+ <property name="title" >
+ <string>Refresh Interval</string>
+ </property>
+ <layout class="QGridLayout" >
+ <item row="0" column="0" >
+ <widget class="QLabel" name="textLabel1_4" >
+ <property name="text" >
+ <string>&amp;Refresh every:</string>
+ </property>
+ <property name="wordWrap" >
+ <bool>false</bool>
+ </property>
+ <property name="buddy" >
+ <cstring>AutoRefreshRateSpinBox</cstring>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1" >
+ <layout class="QHBoxLayout" >
+ <item>
+ <widget class="QSpinBox" name="AutoRefreshRateSpinBox" >
+ <property name="enabled" >
+ <bool>false</bool>
+ </property>
+ <property name="wrapping" >
+ <bool>true</bool>
+ </property>
+ <property name="buttonSymbols" >
+ <enum>QAbstractSpinBox::PlusMinus</enum>
+ </property>
+ <property name="suffix" >
+ <string> sec</string>
+ </property>
+ <property name="minimum" >
+ <number>10</number>
+ </property>
+ <property name="maximum" >
+ <number>300</number>
+ </property>
+ <property name="value" >
+ <number>30</number>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="0" column="2" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="4" column="0" >
+ <widget class="QGroupBox" name="RefreshTypeGroupBox" >
+ <property name="title" >
+ <string>Devices to Refresh</string>
+ </property>
+ <layout class="QGridLayout" >
+ <item row="0" column="0" >
+ <widget class="QRadioButton" name="RefreshCurrentRadioButton" >
+ <property name="enabled" >
+ <bool>false</bool>
+ </property>
+ <property name="text" >
+ <string>Only &amp;currently selected device</string>
+ </property>
+ <property name="checked" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QRadioButton" name="RefreshAllRadioButton" >
+ <property name="enabled" >
+ <bool>false</bool>
+ </property>
+ <property name="text" >
+ <string>&amp;All devices</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="5" column="0" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeType" >
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>446</width>
+ <height>41</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="SystemTray" >
+ <attribute name="title" >
+ <string>System Tray Icon</string>
+ </attribute>
+ <layout class="QGridLayout" >
+ <item row="0" column="0" >
+ <widget class="QLabel" name="textLabel3_2_3" >
+ <property name="text" >
+ <string>&lt;html>&lt;head>&lt;meta name="qrichtext" content="1" />&lt;style type="text/css">
+p, li { white-space: pre-wrap; }
+&lt;/style>&lt;/head>&lt;body style=" font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;">
+&lt;p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">&lt;span style=" font-weight:600;">Configure the behavior of the HP Status Service (hp-systray)&lt;/span>&lt;/p>&lt;/body>&lt;/html></string>
+ </property>
+ <property name="wordWrap" >
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="Line" name="line1_2_3" >
+ <property name="frameShape" >
+ <enum>QFrame::HLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" >
+ <widget class="SystrayFrame" name="SystemTraySettings" >
+ <property name="sizePolicy" >
+ <sizepolicy vsizetype="Expanding" hsizetype="Expanding" >
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="Commands" >
+ <attribute name="title" >
+ <string>Commands (Advanced)</string>
+ </attribute>
+ <layout class="QGridLayout" >
+ <item row="0" column="0" colspan="2" >
+ <widget class="QLabel" name="textLabel3_2_2_2" >
+ <property name="text" >
+ <string>&lt;html>&lt;head>&lt;meta name="qrichtext" content="1" />&lt;style type="text/css">
+p, li { white-space: pre-wrap; }
+&lt;/style>&lt;/head>&lt;body style=" font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;">
+&lt;p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">&lt;span style=" font-weight:600;">Configure what commands to run for device actions&lt;/span>&lt;/p>&lt;/body>&lt;/html></string>
+ </property>
+ <property name="wordWrap" >
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" colspan="2" >
+ <widget class="Line" name="line1_2_2_3" >
+ <property name="frameShape" >
+ <enum>QFrame::HLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" colspan="2" >
+ <widget class="QGroupBox" name="groupBox_3" >
+ <property name="title" >
+ <string>Commands</string>
+ </property>
+ <layout class="QGridLayout" >
+ <item row="0" column="0" >
+ <widget class="QLabel" name="textLabel1_2" >
+ <property name="enabled" >
+ <bool>false</bool>
+ </property>
+ <property name="text" >
+ <string>&amp;Print:</string>
+ </property>
+ <property name="wordWrap" >
+ <bool>false</bool>
+ </property>
+ <property name="buddy" >
+ <cstring>PrintCommandLineEdit</cstring>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QLineEdit" name="PrintCommandLineEdit" >
+ <property name="enabled" >
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" >
+ <widget class="QLabel" name="textLabel2_2" >
+ <property name="text" >
+ <string>&amp;Scan:</string>
+ </property>
+ <property name="wordWrap" >
+ <bool>false</bool>
+ </property>
+ <property name="buddy" >
+ <cstring>ScanCommandLineEdit</cstring>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0" >
+ <widget class="QLineEdit" name="ScanCommandLineEdit" />
+ </item>
+ <item row="4" column="0" >
+ <widget class="QLabel" name="textLabel3_3" >
+ <property name="enabled" >
+ <bool>false</bool>
+ </property>
+ <property name="text" >
+ <string>Send PC &amp;Fax:</string>
+ </property>
+ <property name="wordWrap" >
+ <bool>false</bool>
+ </property>
+ <property name="buddy" >
+ <cstring>SendFaxCommandLineEdit</cstring>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="0" >
+ <widget class="QLineEdit" name="SendFaxCommandLineEdit" >
+ <property name="enabled" >
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="6" column="0" >
+ <widget class="QLabel" name="textLabel4" >
+ <property name="enabled" >
+ <bool>false</bool>
+ </property>
+ <property name="text" >
+ <string>&amp;Unload Photo Cards:</string>
+ </property>
+ <property name="wordWrap" >
+ <bool>false</bool>
+ </property>
+ <property name="buddy" >
+ <cstring>AccessPCardCommandLineEdit</cstring>
+ </property>
+ </widget>
+ </item>
+ <item row="7" column="0" >
+ <widget class="QLineEdit" name="AccessPCardCommandLineEdit" >
+ <property name="enabled" >
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="8" column="0" >
+ <widget class="QLabel" name="textLabel5" >
+ <property name="enabled" >
+ <bool>false</bool>
+ </property>
+ <property name="text" >
+ <string>Make &amp;Copies:</string>
+ </property>
+ <property name="wordWrap" >
+ <bool>false</bool>
+ </property>
+ <property name="buddy" >
+ <cstring>MakeCopiesCommandLineEdit</cstring>
+ </property>
+ </widget>
+ </item>
+ <item row="9" column="0" >
+ <widget class="QLineEdit" name="MakeCopiesCommandLineEdit" >
+ <property name="enabled" >
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="3" column="1" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeType" >
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>20</width>
+ <height>60</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="4" column="0" >
+ <widget class="QPushButton" name="SetDefaultsButton" >
+ <property name="enabled" >
+ <bool>true</bool>
+ </property>
+ <property name="text" >
+ <string>Set &amp;Defaults</string>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="1" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType" >
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType" >
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>301</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="1" column="1" >
+ <widget class="QDialogButtonBox" name="StdButtons" >
+ <property name="standardButtons" >
+ <set>QDialogButtonBox::Cancel|QDialogButtonBox::NoButton|QDialogButtonBox::Ok</set>
+ </property>
+ <property name="centerButtons" >
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <layoutdefault spacing="6" margin="11" />
+ <pixmapfunction>qPixmapFromMimeSource</pixmapfunction>
+ <customwidgets>
+ <customwidget>
+ <class>SystrayFrame</class>
+ <extends>QFrame</extends>
+ <header>systrayframe.h</header>
+ <container>1</container>
+ </customwidget>
+ </customwidgets>
+ <tabstops>
+ <tabstop>TabWidget</tabstop>
+ <tabstop>AutoRefreshCheckBox</tabstop>
+ <tabstop>AutoRefreshRateSpinBox</tabstop>
+ <tabstop>RefreshCurrentRadioButton</tabstop>
+ <tabstop>RefreshAllRadioButton</tabstop>
+ <tabstop>PrintCommandLineEdit</tabstop>
+ <tabstop>ScanCommandLineEdit</tabstop>
+ <tabstop>SendFaxCommandLineEdit</tabstop>
+ <tabstop>AccessPCardCommandLineEdit</tabstop>
+ <tabstop>MakeCopiesCommandLineEdit</tabstop>
+ <tabstop>SetDefaultsButton</tabstop>
+ <tabstop>StdButtons</tabstop>
+ </tabstops>
+ <resources/>
+ <connections>
+ <connection>
+ <sender>AutoRefreshCheckBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>AutoRefreshRateSpinBox</receiver>
+ <slot>setEnabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>31</x>
+ <y>81</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>161</x>
+ <y>157</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>AutoRefreshCheckBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>RefreshAllRadioButton</receiver>
+ <slot>setEnabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>243</x>
+ <y>92</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>243</x>
+ <y>259</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>AutoRefreshCheckBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>RefreshCurrentRadioButton</receiver>
+ <slot>setEnabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>243</x>
+ <y>92</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>243</x>
+ <y>233</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>StdButtons</sender>
+ <signal>accepted()</signal>
+ <receiver>SettingsDialog_base</receiver>
+ <slot>accept()</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>398</x>
+ <y>541</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>243</x>
+ <y>282</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>StdButtons</sender>
+ <signal>rejected()</signal>
+ <receiver>SettingsDialog_base</receiver>
+ <slot>reject()</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>398</x>
+ <y>541</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>243</x>
+ <y>282</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>
diff --git a/ui4/setupdialog.py b/ui4/setupdialog.py
new file mode 100644
index 0000000..5d3c8ea
--- /dev/null
+++ b/ui4/setupdialog.py
@@ -0,0 +1,1323 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2001-2009 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Authors: Don Welch, Naga Samrat Chowdary Narla
+#
+
+# StdLib
+import socket
+import operator
+import commands
+
+# Local
+from base.g import *
+from base import device, utils, models, pkit
+from prnt import cups
+from base.codes import *
+from ui_utils import *
+#from installer import core_install
+from installer.core_install import CoreInstall
+
+# Qt
+from PyQt4.QtCore import *
+from PyQt4.QtGui import *
+
+# Ui
+from setupdialog_base import Ui_Dialog
+from plugindialog import PluginDialog
+from wifisetupdialog import WifiSetupDialog, SUCCESS_CONNECTED
+
+# Fax
+try:
+ from fax import fax
+ fax_import_ok = True
+except ImportError:
+ # This can fail on Python < 2.3 due to the datetime module
+ fax_import_ok = False
+ log.warning("Fax setup disabled - Python 2.3+ required.")
+
+
+PAGE_DISCOVERY = 0
+PAGE_DEVICES = 1
+PAGE_ADD_PRINTER = 2
+PAGE_REMOVE = 3
+
+
+BUTTON_NEXT = 0
+BUTTON_FINISH = 1
+BUTTON_ADD_PRINTER = 2
+BUTTON_REMOVE = 3
+
+ADVANCED_SHOW = 0
+ADVANCED_HIDE = 1
+
+DEVICE_DESC_ALL = 0
+DEVICE_DESC_SINGLE_FUNC = 1
+DEVICE_DESC_MULTI_FUNC = 2
+
+
+
+
+
+class PasswordDialog(QDialog):
+ def __init__(self, prompt, parent=None, name=None, modal=0, fl=0):
+ QDialog.__init__(self, parent)
+ # Application icon
+ self.setWindowIcon(QIcon(load_pixmap('hp_logo', '128x128')))
+ self.prompt = prompt
+
+ Layout= QGridLayout(self)
+ Layout.setMargin(11)
+ Layout.setSpacing(6)
+
+ self.PromptTextLabel = QLabel(self)
+ Layout.addWidget(self.PromptTextLabel,0,0,1,3)
+
+ self.UsernameTextLabel = QLabel(self)
+ Layout.addWidget(self.UsernameTextLabel,1,0)
+
+ self.UsernameLineEdit = QLineEdit(self)
+ self.UsernameLineEdit.setEchoMode(QLineEdit.Normal)
+ Layout.addWidget(self.UsernameLineEdit,1,1,1,2)
+
+ self.PasswordTextLabel = QLabel(self)
+ Layout.addWidget(self.PasswordTextLabel,2,0)
+
+ self.PasswordLineEdit = QLineEdit(self)
+ self.PasswordLineEdit.setEchoMode(QLineEdit.Password)
+ Layout.addWidget(self.PasswordLineEdit,2,1,1,2)
+
+ self.OkPushButton = QPushButton(self)
+ Layout.addWidget(self.OkPushButton,3,2)
+
+ self.languageChange()
+
+ self.resize(QSize(420,163).expandedTo(self.minimumSizeHint()))
+
+ self.connect(self.OkPushButton, SIGNAL("clicked()"), self.accept)
+ self.connect(self.PasswordLineEdit, SIGNAL("returnPressed()"), self.accept)
+
+ def setDefaultUsername(self, defUser, allowUsernameEdit = True):
+ self.UsernameLineEdit.setText(defUser)
+ if not allowUsernameEdit:
+ self.UsernameLineEdit.setReadOnly(True)
+ self.UsernameLineEdit.setStyleSheet("QLineEdit {background-color: lightgray}")
+
+ def getUsername(self):
+ return unicode(self.UsernameLineEdit.text())
+
+
+ def getPassword(self):
+ return unicode(self.PasswordLineEdit.text())
+
+
+ def languageChange(self):
+ self.setWindowTitle(self.__tr("HP Device Manager - Enter Username/Password"))
+ self.PromptTextLabel.setText(self.__tr(self.prompt))
+ self.UsernameTextLabel.setText(self.__tr("Username:"))
+ self.PasswordTextLabel.setText(self.__tr("Password:"))
+ self.OkPushButton.setText(self.__tr("OK"))
+
+
+ def __tr(self,s,c = None):
+ return qApp.translate("SetupDialog",s,c)
+
+
+
+def showPasswordUI(prompt, userName=None, allowUsernameEdit=True):
+ try:
+ dlg = PasswordDialog(prompt, None)
+
+ if userName != None:
+ dlg.setDefaultUsername(userName, allowUsernameEdit)
+
+ if dlg.exec_() == QDialog.Accepted:
+ return (dlg.getUsername(), dlg.getPassword())
+
+ finally:
+ pass
+
+ return ("", "")
+
+
+
+class DeviceTableWidgetItem(QTableWidgetItem):
+ def __init__(self, text, device_uri):
+ QTableWidgetItem.__init__(self, text, QTableWidgetItem.UserType)
+ self.device_uri = device_uri
+
+
+
+class SetupDialog(QDialog, Ui_Dialog):
+ def __init__(self, parent, param, jd_port, device_uri=None, remove=False):
+ QDialog.__init__(self, parent)
+ self.setupUi(self)
+
+ self.param = param
+ self.jd_port = jd_port
+ self.device_uri = device_uri
+ self.remove = remove
+
+ if device_uri:
+ log.info("Using device: %s" % device_uri)
+
+ self.initUi()
+
+ if self.remove:
+ QTimer.singleShot(0, self.showRemovePage)
+ else:
+ if self.skip_discovery:
+ QTimer.singleShot(0, self.showDevicesPage)
+ else:
+ QTimer.singleShot(0, self.showDiscoveryPage)
+
+ cups.setPasswordCallback(showPasswordUI)
+
+
+ #
+ # INIT
+ #
+
+ def initUi(self):
+ self.setWindowIcon(QIcon(load_pixmap('hp_logo', '128x128')))
+
+ # connect signals/slots
+ self.connect(self.CancelButton, SIGNAL("clicked()"), self.CancelButton_clicked)
+ self.connect(self.BackButton, SIGNAL("clicked()"), self.BackButton_clicked)
+ self.connect(self.NextButton, SIGNAL("clicked()"), self.NextButton_clicked)
+ self.connect(self.ManualGroupBox, SIGNAL("clicked(bool)"), self.ManualGroupBox_clicked)
+
+ if self.remove:
+ self.initRemovePage()
+ self.max_page = 1
+ else:
+ self.initDiscoveryPage()
+ self.initDevicesPage()
+ self.initAddPrinterPage()
+ self.max_page = PAGE_ADD_PRINTER
+
+ #
+ # DISCOVERY PAGE
+ #
+
+ def initDiscoveryPage(self):
+ self.UsbRadioButton.setChecked(True)
+ self.setUsbRadioButton(True)
+ self.ManualGroupBox.setChecked(False)
+
+ self.advanced = False
+ self.manual = False
+ self.skip_discovery = False
+ self.discovery_method = 0
+ self.NetworkRadioButton.setEnabled(prop.net_build)
+ self.WirelessButton.setEnabled(prop.net_build)
+ self.ParallelRadioButton.setEnabled(prop.par_build)
+ self.devices = {}
+ self.bus = 'usb'
+ self.timeout = 5
+ self.ttl = 4
+ self.search = ''
+ self.print_test_page = False
+ self.device_desc = DEVICE_DESC_ALL
+
+ if self.param:
+ log.info("Searching for device...")
+ self.manual = True
+ self.advanced = True
+ self.ManualParamLineEdit.setText(self.param)
+ self.JetDirectSpinBox.setValue(self.jd_port)
+ self.ManualGroupBox.setChecked(True)
+ self.DiscoveryOptionsGroupBox.setEnabled(False)
+
+ if self.manualDiscovery():
+ self.skip_discovery = True
+ else:
+ FailureUI(self, self.__tr("<b>Device not found.</b> <p>Please make sure your printer is properly connected and powered-on."))
+
+ match = device.usb_pat.match(self.param)
+ if match is not None:
+ self.UsbRadioButton.setChecked(True)
+ self.setUsbRadioButton(True)
+
+ else:
+ match = device.dev_pat.match(self.param)
+ if match is not None and prop.par_build:
+ self.ParallelRadioButton.setChecked(True)
+ self.setParallelRadioButton(True)
+
+ else:
+ match = device.ip_pat.match(self.param)
+ if match is not None and prop.net_build:
+ self.NetworkRadioButton.setChecked(True)
+ self.setNetworkRadioButton(True)
+
+ else:
+ FailureUI(self, self.__tr("<b>Invalid manual discovery parameter.</b>"))
+
+ elif self.device_uri: # If device URI specified on the command line, skip discovery
+ # if the device URI is well-formed (but not necessarily valid)
+ try:
+ back_end, is_hp, self.bus, model, serial, dev_file, host, zc, port = \
+ device.parseDeviceURI(self.device_uri)
+
+ except Error:
+ log.error("Invalid device URI specified: %s" % self.device_uri)
+
+ else:
+ name = host
+ if self.bus == 'net':
+ try:
+ log.debug("Trying to get hostname for device...")
+ name = socket.gethostbyaddr(host)[0]
+ except socket.herror:
+ log.debug("Failed.")
+ else:
+ log.debug("Host name=%s" % name)
+
+ self.devices = {self.device_uri : (model, model, name)}
+ self.skip_discovery = True
+
+ # If no network or parallel, usb is only option, skip initial page...
+ elif not prop.par_build and not prop.net_build:
+ self.skip_discovery = True
+ self.bus = 'usb'
+ self.UsbRadioButton.setChecked(True)
+ self.setUsbRadioButton(True)
+
+ if prop.fax_build and prop.scan_build:
+ self.DeviceTypeComboBox.addItem("All devices/printers", QVariant(DEVICE_DESC_ALL))
+ self.DeviceTypeComboBox.addItem("Single function printers only", QVariant(DEVICE_DESC_SINGLE_FUNC))
+ self.DeviceTypeComboBox.addItem("All-in-one/MFP devices only", QVariant(DEVICE_DESC_MULTI_FUNC))
+ else:
+ self.DeviceTypeComboBox.setEnabled(False)
+
+ self.connect(self.AdvancedButton, SIGNAL("clicked()"), self.AdvancedButton_clicked)
+ self.connect(self.UsbRadioButton, SIGNAL("toggled(bool)"), self.UsbRadioButton_toggled)
+ self.connect(self.NetworkRadioButton, SIGNAL("toggled(bool)"), self.NetworkRadioButton_toggled)
+ self.connect(self.WirelessButton, SIGNAL("toggled(bool)"), self.WirelessButton_toggled)
+ self.connect(self.ParallelRadioButton, SIGNAL("toggled(bool)"), self.ParallelRadioButton_toggled)
+ self.connect(self.NetworkTTLSpinBox, SIGNAL("valueChanged(int)"), self.NetworkTTLSpinBox_valueChanged)
+ self.connect(self.NetworkTimeoutSpinBox, SIGNAL("valueChanged(int)"),
+ self.NetworkTimeoutSpinBox_valueChanged)
+ self.connect(self.ManualGroupBox, SIGNAL("toggled(bool)"), self.ManualGroupBox_toggled)
+
+ self.showAdvanced()
+
+
+ def ManualGroupBox_toggled(self, checked):
+ self.DiscoveryOptionsGroupBox.setEnabled(not checked)
+
+
+ def manualDiscovery(self):
+ # Validate param...
+ device_uri, sane_uri, fax_uri = device.makeURI(self.param, self.jd_port)
+
+ if device_uri:
+ log.info("Found device: %s" % device_uri)
+ back_end, is_hp, bus, model, serial, dev_file, host, zc, port = \
+ device.parseDeviceURI(device_uri)
+
+ name = host
+ if bus == 'net':
+ try:
+ name = socket.gethostbyaddr(host)[0]
+ except (socket.herror, socket.gaierror):
+ pass
+
+ self.devices = {device_uri : (model, model, name)}
+
+ if bus == 'usb':
+ self.UsbRadioButton.setChecked(True)
+ self.setUsbRadioButton(True)
+
+ elif bus == 'net' and prop.net_build:
+ self.NetworkRadioButton.setChecked(True)
+ self.setNetworkRadioButton(True)
+
+ elif bus == 'par' and prop.par_build:
+ self.ParallelRadioButton.setChecked(True)
+ self.setParallelRadioButton(True)
+
+ return True
+
+
+ return False
+
+
+ def ManualGroupBox_clicked(self, checked):
+ self.manual = checked
+ network = self.NetworkRadioButton.isChecked()
+ self.setJetDirect(network)
+
+
+ def showDiscoveryPage(self):
+ self.BackButton.setEnabled(False)
+ self.NextButton.setEnabled(True)
+ self.setNextButton(BUTTON_NEXT)
+ self.displayPage(PAGE_DISCOVERY)
+
+
+ def AdvancedButton_clicked(self):
+ self.advanced = not self.advanced
+ self.showAdvanced()
+
+
+ def showAdvanced(self):
+ if self.advanced:
+ self.AdvancedStackedWidget.setCurrentIndex(ADVANCED_SHOW)
+ self.AdvancedButton.setText(self.__tr("Hide Advanced Options"))
+ self.AdvancedButton.setIcon(QIcon(load_pixmap("minus", "16x16")))
+ else:
+ self.AdvancedStackedWidget.setCurrentIndex(ADVANCED_HIDE)
+ self.AdvancedButton.setText(self.__tr("Show Advanced Options"))
+ self.AdvancedButton.setIcon(QIcon(load_pixmap("plus", "16x16")))
+
+
+ def setJetDirect(self, enabled):
+ self.JetDirectLabel.setEnabled(enabled and self.manual)
+ self.JetDirectSpinBox.setEnabled(enabled and self.manual)
+
+
+ def setNetworkOptions(self, enabled):
+ self.NetworkTimeoutLabel.setEnabled(enabled)
+ self.NetworkTimeoutSpinBox.setEnabled(enabled)
+ self.NetworkTTLLabel.setEnabled(enabled)
+ self.NetworkTTLSpinBox.setEnabled(enabled)
+
+
+ def setSearchOptions(self, enabled):
+ self.SearchLineEdit.setEnabled(enabled)
+ self.DeviceTypeComboBox.setEnabled(enabled)
+ self.DeviceTypeLabel.setEnabled(enabled)
+
+
+ def setManualDiscovery(self, enabled):
+ self.ManualGroupBox.setEnabled(enabled)
+
+
+ def setNetworkDiscovery(self, enabled):
+ self.NetworkDiscoveryMethodLabel.setEnabled(enabled)
+ self.NetworkDiscoveryMethodComboBox.setEnabled(enabled)
+ self.NetworkDiscoveryMethodComboBox.setCurrentIndex(1)
+
+
+ def UsbRadioButton_toggled(self, radio_enabled):
+ self.setUsbRadioButton(radio_enabled)
+
+
+ def setUsbRadioButton(self, checked):
+ self.setNetworkDiscovery(not checked)
+ self.setJetDirect(not checked)
+ self.setNetworkOptions(not checked)
+ self.setSearchOptions(checked)
+ self.setManualDiscovery(checked)
+
+ if checked:
+ self.ManualParamLabel.setText(self.__tr("USB bus ID:device ID (bbb:ddd):"))
+ self.bus = 'usb'
+ # TODO: Set bbb:ddd validator
+
+
+ def NetworkRadioButton_toggled(self, radio_enabled):
+ self.setNetworkRadioButton(radio_enabled)
+
+
+ def setNetworkRadioButton(self, checked):
+ self.setNetworkDiscovery(checked)
+ self.setJetDirect(checked)
+ self.setNetworkOptions(checked)
+ self.setSearchOptions(checked)
+ self.setManualDiscovery(checked)
+
+
+ if checked:
+ self.ManualParamLabel.setText(self.__tr("IP Address or network name:"))
+ self.bus = 'net'
+ # TODO: Reset validator
+
+ def WirelessButton_toggled(self, radio_enabled):
+ self.setWirelessButton(radio_enabled)
+
+
+ def setWirelessButton(self, checked):
+ self.setNetworkDiscovery(not checked)
+ self.setJetDirect(not checked)
+ self.setNetworkOptions(not checked)
+ self.setSearchOptions(not checked)
+ self.setManualDiscovery(not checked)
+
+
+ if checked:
+ self.ManualParamLabel.setText(self.__tr("IP Address or network name:"))
+ self.bus = 'net'
+
+
+ def ParallelRadioButton_toggled(self, radio_enabled):
+ self.setParallelRadioButton(radio_enabled)
+
+
+ def setParallelRadioButton(self, checked):
+ self.setNetworkDiscovery(not checked)
+ self.setJetDirect(not checked)
+ self.setNetworkOptions(not checked)
+ self.setSearchOptions(not checked)
+ self.setManualDiscovery(not checked)
+
+
+ if checked:
+ self.ManualParamLabel.setText(self.__tr("Device node (/dev/...):"))
+ self.bus = 'par'
+ # TODO: Set /dev/... validator
+
+
+ def NetworkTTLSpinBox_valueChanged(self, ttl):
+ self.ttl = ttl
+
+
+ def NetworkTimeoutSpinBox_valueChanged(self, timeout):
+ self.timeout = timeout
+
+ #
+ # DEVICES PAGE
+ #
+
+ def initDevicesPage(self):
+ self.connect(self.RefreshButton, SIGNAL("clicked()"), self.RefreshButton_clicked)
+
+
+ def showDevicesPage(self):
+ self.BackButton.setEnabled(True)
+ self.setNextButton(BUTTON_NEXT)
+ search = ""
+
+ QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
+ try:
+ if not self.devices:
+ if self.manual and self.param: # manual, but not passed-in on command line
+ self.manualDiscovery()
+
+ else: # probe
+ net_search_type = ''
+
+ if self.bus == 'net':
+ if self.discovery_method == 0:
+ net_search_type = "slp"
+ else:
+ net_search_type = "mdns"
+
+ log.info("Searching... (bus=%s, timeout=%d, ttl=%d, search=%s desc=%d, method=%s)" %
+ (self.bus, self.timeout, self.ttl, self.search or "(None)",
+ self.device_desc, net_search_type))
+ else:
+ log.info("Searching... (bus=%s, search=%s, desc=%d)" %
+ (self.bus, self.search or "(None)", self.device_desc))
+
+ if self.device_desc == DEVICE_DESC_SINGLE_FUNC:
+ filter_dict = {'scan-type' : (operator.le, SCAN_TYPE_NONE)}
+
+ elif self.device_desc == DEVICE_DESC_MULTI_FUNC:
+ filter_dict = {'scan-type': (operator.gt, SCAN_TYPE_NONE)}
+
+ else: # DEVICE_DESC_ALL
+ filter_dict = {}
+
+ self.devices = device.probeDevices([self.bus], self.timeout, self.ttl,
+ filter_dict, self.search, net_search=net_search_type)
+ finally:
+ QApplication.restoreOverrideCursor()
+
+ self.clearDevicesTable()
+
+ if self.devices:
+ self.NextButton.setEnabled(True)
+ self.DevicesFoundIcon.setPixmap(load_pixmap('info', '16x16'))
+
+ if len(self.devices) == 1:
+ self.DevicesFoundLabel.setText(self.__tr("<b>1 device found.</b> Click <i>Next</i> to continue."))
+ else:
+ self.DevicesFoundLabel.setText(self.__tr("<b>%1 devices found.</b> Select the device to install and click <i>Next</i> to continue.").arg(len(self.devices)))
+
+ self.loadDevicesTable()
+
+ else:
+ self.NextButton.setEnabled(False)
+ self.DevicesFoundIcon.setPixmap(load_pixmap('error', '16x16'))
+ log.error("No devices found on bus: %s" % self.bus)
+ self.DevicesFoundLabel.setText(self.__tr("<b>No devices found.</b><br>Click <i>Back</i> to change discovery options, or <i>Refresh</i> to search again."))
+
+ self.displayPage(PAGE_DEVICES)
+
+
+ def loadDevicesTable(self):
+ self.DevicesTableWidget.setRowCount(len(self.devices))
+
+ if self.bus == 'net':
+ if self.discovery_method == 0:
+ headers = [self.__tr('Model'), self.__tr('IP Address'), self.__tr('Host Name'), self.__tr('Device URI')]
+ device_uri_col = 3
+ else:
+ headers = [self.__tr('Model'), self.__tr('Host Name'), self.__tr('Device URI')]
+ device_uri_col = 2
+ else:
+ headers = [self.__tr('Model'), self.__tr('Device URI')]
+ device_uri_col = 1
+
+ self.DevicesTableWidget.setColumnCount(len(headers))
+ self.DevicesTableWidget.setHorizontalHeaderLabels(headers)
+ flags = Qt.ItemIsSelectable | Qt.ItemIsEnabled
+
+ for row, d in enumerate(self.devices):
+ back_end, is_hp, bus, model, serial, dev_file, host, zc, port = device.parseDeviceURI(d)
+ model_ui = models.normalizeModelUIName(model)
+
+ i = DeviceTableWidgetItem(QString(model_ui), d)
+ i.setFlags(flags)
+ self.DevicesTableWidget.setItem(row, 0, i)
+
+ i = QTableWidgetItem(QString(d))
+ i.setFlags(flags)
+ self.DevicesTableWidget.setItem(row, device_uri_col, i)
+
+ if self.bus == 'net':
+ i = QTableWidgetItem(QString(host))
+ i.setFlags(flags)
+ self.DevicesTableWidget.setItem(row, 1, i)
+
+ if self.discovery_method == 0:
+ i = QTableWidgetItem(QString(self.devices[d][2]))
+ i.setFlags(flags)
+ self.DevicesTableWidget.setItem(row, 2, i)
+
+ self.DevicesTableWidget.resizeColumnsToContents()
+ self.DevicesTableWidget.selectRow(0)
+ self.DevicesTableWidget.setSortingEnabled(True)
+ self.DevicesTableWidget.sortItems(0)
+
+
+ def clearDevicesTable(self):
+ self.DevicesTableWidget.clear()
+ self.DevicesTableWidget.setRowCount(0)
+ self.DevicesTableWidget.setColumnCount(0)
+
+
+ def RefreshButton_clicked(self):
+ self.clearDevicesTable()
+ self.devices = []
+ QTimer.singleShot(0, self.showDevicesPage)
+
+ #
+ # ADD PRINTER PAGE
+ #
+
+ def initAddPrinterPage(self):
+ self.mq = {}
+
+ self.connect(self.PrinterNameLineEdit, SIGNAL("textEdited(const QString &)"),
+ self.PrinterNameLineEdit_textEdited)
+
+ self.connect(self.FaxNameLineEdit, SIGNAL("textEdited(const QString &)"),
+ self.FaxNameLineEdit_textEdited)
+
+ self.PrinterNameLineEdit.setValidator(PrinterNameValidator(self.PrinterNameLineEdit))
+ self.FaxNameLineEdit.setValidator(PrinterNameValidator(self.FaxNameLineEdit))
+ self.FaxNumberLineEdit.setValidator(PhoneNumValidator(self.FaxNumberLineEdit))
+
+ self.OtherPPDButton.setIcon(QIcon(load_pixmap('folder_open', '16x16')))
+ self.connect(self.OtherPPDButton, SIGNAL("clicked(bool)"), self.OtherPPDButton_clicked)
+
+ self.OtherPPDButton.setToolTip(self.__tr("Browse for an alternative PPD file for this printer."))
+
+ self.printer_fax_names_same = False
+ self.printer_name = ''
+ self.fax_name = ''
+ self.fax_setup_ok = True
+ self.fax_setup = False
+
+
+ def showAddPrinterPage(self):
+ # Install the plugin if needed...
+ core = CoreInstall()
+ plugin = self.mq.get('plugin', PLUGIN_NONE)
+ plugin_reason = self.mq.get('plugin-reason', PLUGIN_REASON_NONE)
+ if plugin > PLUGIN_NONE:
+
+ if core.check_for_plugin() != PLUGIN_INSTALLED:
+ ok, sudo_ok = pkit.run_plugin_command(plugin == PLUGIN_REQUIRED, plugin_reason)
+ if not sudo_ok:
+ FailureUI(self, self.__tr("<b>Unable to find an appropriate su/sudo utiltity to run hp-plugin.</b><p>Install kdesu, gnomesu, or gksu.</p>"))
+ return
+ if not ok or core.check_for_plugin() != PLUGIN_INSTALLED:
+ if plugin == PLUGIN_REQUIRED:
+ FailureUI(self, self.__tr("<b>The printer you are trying to setup requires a binary driver plug-in and it failed to install.</b><p>Please check your internet connection and try again.</p><p>Visit <u>http://hplipopensource.com</u> for more infomation.</p>"))
+ return
+ else:
+ WarningUI(self, self.__tr("Either you have chosen to skip the installation of the optional plug-in or that installation has failed. Your printer may not function at optimal performance."))
+
+ self.setNextButton(BUTTON_ADD_PRINTER)
+
+ if not self.printer_name:
+ self.setDefaultPrinterName()
+
+ self.findPrinterPPD()
+
+ if fax_import_ok and prop.fax_build and \
+ self.mq.get('fax-type', FAX_TYPE_NONE) not in (FAX_TYPE_NONE, FAX_TYPE_NOT_SUPPORTED):
+
+ self.fax_setup = True
+ self.SetupFaxGroupBox.setChecked(True)
+ self.SetupFaxGroupBox.setEnabled(True)
+
+ if not self.fax_name:
+ self.setDefaultFaxName()
+
+ self.findFaxPPD()
+
+ self.readwriteFaxInformation()
+
+ else:
+ self.SetupFaxGroupBox.setChecked(False)
+ self.SetupFaxGroupBox.setEnabled(False)
+ self.fax_name = ''
+ self.fax_name_ok = True
+ self.fax_setup = False
+ self.fax_setup_ok = True
+
+ self.updatePPD()
+ self.setAddPrinterButton()
+ self.displayPage(PAGE_ADD_PRINTER)
+
+
+
+
+ def updatePPD(self):
+ if self.print_ppd is None:
+ log.error("No appropriate print PPD file found for model %s" % self.model)
+ self.PPDFileLineEdit.setText(self.__tr('(Not found. Click browse button to select a PPD file.)'))
+ try:
+ self.PPDFileLineEdit.setStyleSheet("background-color: yellow")
+ except AttributeError:
+ pass
+ self.PrinterDescriptionLineEdit.setText(QString(""))
+
+ else:
+ self.PPDFileLineEdit.setText(self.print_ppd[0])
+ self.PrinterDescriptionLineEdit.setText(self.print_ppd[1])
+ try:
+ self.PPDFileLineEdit.setStyleSheet("")
+ except AttributeError:
+ pass
+
+
+ def OtherPPDButton_clicked(self, b):
+ ppd_file = unicode(QFileDialog.getOpenFileName(self, self.__tr("Select PPD File"),
+ sys_conf.get('dirs', 'ppd'),
+ self.__tr("PPD Files (*.ppd *.ppd.gz);;All Files (*)")))
+
+ if ppd_file and os.path.exists(ppd_file):
+ self.print_ppd = (ppd_file, cups.getPPDDescription(ppd_file))
+ self.updatePPD()
+ self.setAddPrinterButton()
+
+
+ def findPrinterPPD(self):
+ QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
+ try:
+ self.print_ppd = None
+ self.ppds = cups.getSystemPPDs()
+
+ #Check if common ppd name is already given in models.dat(This is needed because in case of devices having more than one derivatives
+ #will have diffrent model name strings in device ID, because of which we don't get the common ppd name for search)
+
+ ppd_name = self.mq.get('ppd-name',0)
+
+ if ppd_name == 0: #Means ppd-name is not provided So follow earlier path of getting name from device ID.
+ model = cups.stripModel2(self.model)
+ self.print_ppd = cups.getPPDFile2(model, self.ppds)
+ else:
+ self.print_ppd = cups.getPPDFile2(ppd_name, self.ppds)
+
+ finally:
+ QApplication.restoreOverrideCursor()
+
+
+ def findFaxPPD(self):
+ QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
+ try:
+ log.debug("Searching for fax PPD for model %s" % self.model)
+
+ if prop.hpcups_build:
+ if self.mq.get('fax-type', FAX_TYPE_NONE) == FAX_TYPE_MARVELL:
+ fax_ppd_name = "HP-Fax3-hpcups" # Fixed width (2528 pixels) and 300dpi rendering
+ nick = "HP Fax3 hpcups"
+ elif self.mq.get('fax-type', FAX_TYPE_NONE) == FAX_TYPE_SOAP or self.mq.get('fax-type', FAX_TYPE_NONE) == FAX_TYPE_LEDMSOAP:
+ fax_ppd_name = "HP-Fax2-hpcups" # Fixed width (2528 pixels) and 300dpi rendering
+ nick = "HP Fax2 hpcups"
+ elif self.mq.get('fax-type', FAX_TYPE_LEDM) == FAX_TYPE_LEDM:
+ fax_ppd_name = "HP-Fax4-hpcups"# Fixed width (2528 pixels) and 300dpi rendering
+ nick = "HP Fax4 hpcups"
+ else:
+ fax_ppd_name = "HP-Fax-hpcups" # Standard
+ nick = "HP Fax hpcups"
+
+ else: # hpijs
+ if self.mq.get('fax-type', FAX_TYPE_NONE) == FAX_TYPE_MARVELL:
+ fax_ppd_name = "HP-Fax3-hpijs" # Fixed width (2528 pixels) and 300dpi rendering
+ nick = "HP Fax3 hpijs"
+ if self.mq.get('fax-type', FAX_TYPE_NONE) == FAX_TYPE_SOAP or self.mq.get('fax-type', FAX_TYPE_NONE) == FAX_TYPE_LEDMSOAP:
+ fax_ppd_name = "HP-Fax2-hpijs" # Fixed width (2528 pixels) and 300dpi rendering
+ nick = "HP Fax2 hpijs"
+ if self.mq.get('fax-type', FAX_TYPE_NONE) == FAX_TYPE_LEDM:
+ fax_ppd_name = "HP-Fax4-hpijs" # Fixed width (2528 pixels) and 300dpi rendering
+ nick = "HP Fax4 hpijs"
+ else:
+ fax_ppd_name = "HP-Fax-hpijs" # Standard
+ nick = "HP Fax hpijs"
+
+ ppds = []
+
+ for f in utils.walkFiles(sys_conf.get('dirs', 'ppd'), pattern="HP-Fax*.ppd*", abs_paths=True):
+ ppds.append(f)
+
+ for f in ppds:
+ if f.find(fax_ppd_name) >= 0 and cups.getPPDDescription(f) == nick:
+ self.fax_ppd = f
+ self.fax_setup_ok = True
+ log.debug("Found fax PPD: %s" % f)
+ break
+ else:
+ self.fax_ppd = None
+ self.fax_setup_ok = False
+ FailureUI(self, self.__tr("<b>Unable to locate the HPLIP Fax PPD file:</b><p>%1.ppd.gz</p><p>Fax setup has been disabled.").arg(fax_ppd_name))
+ self.fax_setup = False
+ self.SetupFaxGroupBox.setChecked(False)
+ self.SetupFaxGroupBox.setEnabled(False)
+
+ finally:
+ QApplication.restoreOverrideCursor()
+
+
+
+ def setDefaultPrinterName(self):
+ self.installed_print_devices = device.getSupportedCUPSDevices(['hp'])
+ log.debug(self.installed_print_devices)
+
+ self.installed_queues = [p.name for p in cups.getPrinters()]
+
+ back_end, is_hp, bus, model, serial, dev_file, host, zc, port = device.parseDeviceURI(self.device_uri)
+ default_model = utils.xstrip(model.replace('series', '').replace('Series', ''), '_')
+
+ printer_name = default_model
+ installed_printer_names = device.getSupportedCUPSPrinterNames(['hp'])
+ # Check for duplicate names
+ if (self.device_uri in self.installed_print_devices and printer_name in self.installed_print_devices[self.device_uri]) \
+ or (printer_name in installed_printer_names):
+ i = 2
+ while True:
+ t = printer_name + "_%d" % i
+ if (t not in installed_printer_names) and (self.device_uri not in self.installed_print_devices or t not in self.installed_print_devices[self.device_uri]):
+ printer_name += "_%d" % i
+ break
+ i += 1
+
+ self.printer_name_ok = True
+ self.PrinterNameLineEdit.setText(printer_name)
+ log.debug(printer_name)
+ self.printer_name = printer_name
+
+
+ def setDefaultFaxName(self):
+ self.installed_fax_devices = device.getSupportedCUPSDevices(['hpfax'])
+ log.debug(self.installed_fax_devices)
+
+ self.fax_uri = self.device_uri.replace('hp:', 'hpfax:')
+
+ back_end, is_hp, bus, model, serial, dev_file, host, zc, port = device.parseDeviceURI(self.fax_uri)
+ default_model = utils.xstrip(model.replace('series', '').replace('Series', ''), '_')
+
+ fax_name = default_model + "_fax"
+ installed_fax_names = device.getSupportedCUPSPrinterNames(['hpfax'])
+ # Check for duplicate names
+ if (self.fax_uri in self.installed_fax_devices and fax_name in self.installed_fax_devices[self.fax_uri]) \
+ or (fax_name in installed_fax_names):
+ i = 2
+ while True:
+ t = fax_name + "_%d" % i
+ if (t not in installed_fax_names) and (self.fax_uri not in self.installed_fax_devices or t not in self.installed_fax_devices[self.fax_uri]):
+ fax_name += "_%d" % i
+ break
+ i += 1
+
+ self.fax_name_ok = True
+ self.FaxNameLineEdit.setText(fax_name)
+ self.fax_name = fax_name
+
+
+ def PrinterNameLineEdit_textEdited(self, t):
+ self.printer_name = unicode(t)
+ self.printer_name_ok = True
+
+ if not self.printer_name:
+ self.PrinterNameLineEdit.setToolTip(self.__tr('You must enter a name for the printer.'))
+ self.printer_name_ok = False
+
+ elif self.fax_name == self.printer_name:
+ s = self.__tr('The printer name and fax name must be different. Please choose different names.')
+ self.PrinterNameLineEdit.setToolTip(s)
+ self.FaxNameLineEdit.setToolTip(s)
+ self.fax_name_ok = False
+ self.printer_name_ok = False
+ self.printer_fax_names_same = True
+
+ elif self.printer_name in self.installed_queues:
+ self.PrinterNameLineEdit.setToolTip(self.__tr('A printer already exists with this name. Please choose a different name.'))
+ self.printer_name_ok = False
+
+ elif self.printer_fax_names_same:
+ if self.fax_name != self.printer_name:
+ self.printer_fax_names_same = False
+ self.printer_name_ok = True
+
+ self.FaxNameLineEdit.emit(SIGNAL("textEdited(const QString &)"),
+ self.FaxNameLineEdit.text())
+
+ self.setIndicators()
+ self.setAddPrinterButton()
+
+
+ def FaxNameLineEdit_textEdited(self, t):
+ self.fax_name = unicode(t)
+ self.fax_name_ok = True
+
+ if not self.fax_name:
+ self.FaxNameLineEdit.setToolTip(self.__tr('You must enter a fax name.'))
+ self.fax_name_ok = False
+
+ elif self.fax_name == self.printer_name:
+ s = self.__tr('The printer name and fax name must be different. Please choose different names.')
+ self.PrinterNameLineEdit.setToolTip(s)
+ self.FaxNameLineEdit.setToolTip(s)
+ self.printer_name_ok = False
+ self.fax_name_ok = False
+ self.printer_fax_names_same = True
+
+ elif self.fax_name in self.installed_queues:
+ self.FaxNameLineEdit.setToolTip(self.__tr('A fax already exists with this name. Please choose a different name.'))
+ self.fax_name_ok = False
+
+ elif self.printer_fax_names_same:
+ if self.fax_name != self.printer_name:
+ self.printer_fax_names_same = False
+ self.fax_name_ok = True
+
+ self.PrinterNameLineEdit.emit(SIGNAL("textEdited(const QString&)"),
+ self.PrinterNameLineEdit.text())
+
+ self.setIndicators()
+ self.setAddPrinterButton()
+
+
+ def setIndicators(self):
+ if self.printer_name_ok:
+ self.PrinterNameLineEdit.setToolTip(QString(""))
+ try:
+ self.PrinterNameLineEdit.setStyleSheet("")
+ except AttributeError:
+ pass
+ else:
+ try:
+ self.PrinterNameLineEdit.setStyleSheet("background-color: yellow")
+ except AttributeError:
+ pass
+
+ if self.fax_name_ok:
+ self.FaxNameLineEdit.setToolTip(QString(""))
+ try:
+ self.PrinterNameLineEdit.setStyleSheet("")
+ except AttributeError:
+ pass
+ else:
+ try:
+ self.PrinterNameLineEdit.setStyleSheet("background-color: yellow")
+ except AttributeError:
+ pass
+
+
+ def setAddPrinterButton(self):
+ self.NextButton.setEnabled((self.printer_name_ok and self.print_ppd is not None) and
+ ((self.fax_setup and self.fax_name_ok) or not self.fax_setup))
+
+
+ #
+ # ADD PRINTER
+ #
+
+ def addPrinter(self):
+ self.setupPrinter()
+
+ if self.fax_setup:
+ self.setupFax()
+ self.readwriteFaxInformation(False)
+
+ if self.print_test_page:
+ self.printTestPage()
+
+ self.close()
+
+
+
+ #
+ # SETUP PRINTER/FAX
+ #
+
+ def setupPrinter(self):
+ QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
+ try:
+ cups.setPasswordPrompt("You do not have permission to add a printer.")
+ if not os.path.exists(self.print_ppd[0]): # assume foomatic: or some such
+ status, status_str = cups.addPrinter(self.printer_name.encode('utf8'), self.device_uri,
+ self.print_location, '', self.print_ppd[0], self.print_desc)
+ else:
+ status, status_str = cups.addPrinter(self.printer_name.encode('utf8'), self.device_uri,
+ self.print_location, self.print_ppd[0], '', self.print_desc)
+
+ log.debug("addPrinter() returned (%d, %s)" % (status, status_str))
+ self.installed_print_devices = device.getSupportedCUPSDevices(['hp'])
+
+ log.debug(self.installed_print_devices)
+
+ if self.device_uri not in self.installed_print_devices or \
+ self.printer_name not in self.installed_print_devices[self.device_uri]:
+
+ QApplication.restoreOverrideCursor()
+ if os.geteuid!=0 and utils.addgroup()!=[]:
+ FailureUI(self, self.__tr("<b>Printer queue setup failed. Could not connect to CUPS Server</b><p>Is user added to %s group(s)" %utils.list_to_string(utils.addgroup())))
+ else:
+ # TODO:
+ #service.sendEvent(self.hpssd_sock, EVENT_CUPS_QUEUES_CHANGED, device_uri=self.device_uri)
+ pass
+
+ finally:
+ QApplication.restoreOverrideCursor()
+
+
+ def setupFax(self):
+ QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
+ try:
+ cups.setPasswordPrompt("You do not have permission to add a fax device.")
+ if not os.path.exists(self.fax_ppd):
+ status, status_str = cups.addPrinter(self.fax_name.encode('utf8'),
+ self.fax_uri, self.fax_location, '', self.fax_ppd, self.fax_desc)
+ else:
+ status, status_str = cups.addPrinter(self.fax_name.encode('utf8'),
+ self.fax_uri, self.fax_location, self.fax_ppd, '', self.fax_desc)
+
+ log.debug("addPrinter() returned (%d, %s)" % (status, status_str))
+ self.installed_fax_devices = device.getSupportedCUPSDevices(['hpfax'])
+
+ log.debug(self.installed_fax_devices)
+
+ if self.fax_uri not in self.installed_fax_devices or \
+ self.fax_name not in self.installed_fax_devices[self.fax_uri]:
+
+ QApplication.restoreOverrideCursor()
+ FailureUI(self, self.__tr("<b>Fax queue setup failed.</b><p>Please restart CUPS and try again."))
+ else:
+ pass
+ # TODO:
+ #service.sendEvent(self.hpssd_sock, EVENT_CUPS_QUEUES_CHANGED, device_uri=self.fax_uri)
+
+ finally:
+ QApplication.restoreOverrideCursor()
+
+
+ def readwriteFaxInformation(self, read=True):
+ try:
+ QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
+
+ d = fax.getFaxDevice(self.fax_uri, disable_dbus=True)
+
+ while True:
+ try:
+ d.open()
+ except Error:
+ error_text = self.__tr("Unable to communicate with the device. Please check the device and try again.")
+ log.error(unicode(error_text))
+ if QMessageBox.critical(self,
+ self.windowTitle(),
+ error_text,
+ QMessageBox.Retry | QMessageBox.Default,
+ QMessageBox.Cancel | QMessageBox.Escape,
+ QMessageBox.NoButton) == QMessageBox.Cancel:
+ break
+
+ else:
+ try:
+ tries = 0
+ ok = True
+
+ while True:
+ tries += 1
+
+ try:
+ if read:
+ self.fax_number = unicode(d.getPhoneNum())
+ self.fax_name_company = unicode(d.getStationName())
+ else:
+ d.setStationName(self.fax_name_company)
+ d.setPhoneNum(self.fax_number)
+
+ except Error:
+ error_text = self.__tr("<b>Device I/O Error</b><p>Could not communicate with device. Device may be busy.")
+ log.error(unicode(error_text))
+
+ if QMessageBox.critical(self,
+ self.windowTitle(),
+ error_text,
+ QMessageBox.Retry | QMessageBox.Default,
+ QMessageBox.Cancel | QMessageBox.Escape,
+ QMessageBox.NoButton) == QMessageBox.Cancel:
+ break
+
+
+ time.sleep(5)
+ ok = False
+
+ if tries > 12:
+ break
+
+ else:
+ ok = True
+ break
+
+ finally:
+ d.close()
+
+ if ok and read:
+ self.FaxNumberLineEdit.setText(self.fax_number)
+ self.NameCompanyLineEdit.setText(self.fax_name_company)
+
+ break
+
+ finally:
+ QApplication.restoreOverrideCursor()
+
+
+ def printTestPage(self):
+ try:
+ d = device.Device(self.device_uri)
+ except Error, e:
+ FailureUI(self, self.__tr("<b>Device error:</b><p>%s (%s)." % (e.msg, e.opt)))
+
+ else:
+ try:
+ d.open()
+ except Error:
+ FailureUI(self, self.__tr("<b>Unable to print to printer.</b><p>Please check device and try again."))
+ else:
+ if d.isIdleAndNoError():
+ d.close()
+
+ try:
+ d.printTestPage(self.printer_name)
+ except Error, e:
+ if e.opt == ERROR_NO_CUPS_QUEUE_FOUND_FOR_DEVICE:
+ FailureUI(self, self.__tr("<b>No CUPS queue found for device.</b><p>Please install the printer in CUPS and try again."))
+ else:
+ FailureUI(self, self.__tr("<b>Printer Error</b><p>An error occured: %s (code=%d)." % (e.msg, e.opt)))
+ else:
+ FailureUI(self, self.__tr("<b>Printer Error.</b><p>Printer is busy, offline, or in an error state. Please check the device and try again."))
+ d.close()
+
+ #
+ # Remove Page
+ #
+
+ def initRemovePage(self):
+ pass
+
+
+ def showRemovePage(self):
+ self.displayPage(PAGE_REMOVE)
+ self.StepText.setText(self.__tr("Step 1 of 1"))
+ self.setNextButton(BUTTON_REMOVE)
+ self.BackButton.setEnabled(False)
+ self.NextButton.setEnabled(False)
+
+ self.RemoveDevicesTableWidget.verticalHeader().hide()
+
+ self.installed_printers = device.getSupportedCUPSPrinters(['hp', 'hpfax'])
+ log.debug(self.installed_printers)
+
+ if not self.installed_printers:
+ FailureUI(self, self.__tr("<b>No printers or faxes found to remove.</b><p>You must setup a least one printer or fax before you can remove it."))
+ self.close()
+ return
+
+ self.RemoveDevicesTableWidget.setRowCount(len(self.installed_printers))
+
+ headers = [self.__tr("Select"), self.__tr('Printer (Queue) Name'), self.__tr('Type'), self.__tr('Device URI')]
+
+ self.RemoveDevicesTableWidget.setColumnCount(len(headers))
+ self.RemoveDevicesTableWidget.setHorizontalHeaderLabels(headers)
+ flags = Qt.ItemIsSelectable | Qt.ItemIsEnabled
+
+ row = 0
+ for p in self.installed_printers:
+ widget = QCheckBox(self.RemoveDevicesTableWidget)
+ self.connect(widget, SIGNAL("stateChanged(int)"), self.CheckBox_stateChanged)
+ self.RemoveDevicesTableWidget.setCellWidget(row, 0, widget)
+
+ back_end, is_hp, bus, model, serial, dev_file, host, zc, port = \
+ device.parseDeviceURI(p.device_uri)
+
+ if self.device_uri is not None and self.device_uri == p.device_uri:
+ widget.setCheckState(Qt.Checked)
+
+ i = QTableWidgetItem(QString(p.name))
+ i.setFlags(flags)
+ i.setData(Qt.UserRole, QVariant(p.name))
+ self.RemoveDevicesTableWidget.setItem(row, 1, i)
+
+ if back_end == 'hpfax':
+ typ = self.__tr("Fax")
+ else:
+ typ = self.__tr("Printer")
+
+ i = QTableWidgetItem(typ)
+ i.setFlags(flags)
+ self.RemoveDevicesTableWidget.setItem(row, 2, i)
+
+ i = QTableWidgetItem(QString(p.device_uri))
+ i.setFlags(flags)
+ self.RemoveDevicesTableWidget.setItem(row, 3, i)
+
+ row += 1
+
+ self.RemoveDevicesTableWidget.resizeColumnsToContents()
+
+
+ def CheckBox_stateChanged(self, i):
+ for row in xrange(self.RemoveDevicesTableWidget.rowCount()):
+ widget = self.RemoveDevicesTableWidget.cellWidget(row, 0)
+ if widget.checkState() == Qt.Checked:
+ self.NextButton.setEnabled(True)
+ break
+ else:
+ self.NextButton.setEnabled(False)
+
+
+ #
+ # Misc
+ #
+
+ def NextButton_clicked(self):
+ p = self.StackedWidget.currentIndex()
+ if p == PAGE_DISCOVERY:
+ self.manual = self.ManualGroupBox.isChecked()
+ self.param = unicode(self.ManualParamLineEdit.text())
+ self.jd_port = self.JetDirectSpinBox.value()
+ self.search = unicode(self.SearchLineEdit.text())
+ self.device_desc = int(self.DeviceTypeComboBox.itemData(self.DeviceTypeComboBox.currentIndex()).toInt()[0])
+ self.discovery_method = self.NetworkDiscoveryMethodComboBox.currentIndex()
+
+ if self.WirelessButton.isChecked():
+ dlg = WifiSetupDialog(self, device_uri=None, standalone=False)
+ dlg.exec_()
+
+ if dlg.success == SUCCESS_CONNECTED:
+ self.manual = True
+ self.param = dlg.hn
+ self.bus = 'net'
+ if not self.WirelessButton.isChecked():
+ self.showDevicesPage()
+
+ elif p == PAGE_DEVICES:
+ row = self.DevicesTableWidget.currentRow()
+ self.device_uri = self.DevicesTableWidget.item(row, 0).device_uri
+ self.mq = device.queryModelByURI(self.device_uri)
+ back_end, is_hp, bus, model, serial, dev_file, host, zc, port = device.parseDeviceURI(self.device_uri)
+ self.model = models.normalizeModelName(model).lower()
+ self.showAddPrinterPage()
+
+ elif p == PAGE_ADD_PRINTER:
+ self.print_test_page = self.SendTestPageCheckBox.isChecked()
+ self.print_desc = unicode(self.PrinterDescriptionLineEdit.text()).encode('utf8')
+ self.print_location = unicode(self.PrinterLocationLineEdit.text()).encode('utf8')
+ self.fax_setup = self.SetupFaxGroupBox.isChecked()
+ self.fax_desc = unicode(self.FaxDescriptionLineEdit.text()).encode('utf8')
+ self.fax_location = unicode(self.FaxLocationLineEdit.text()).encode('utf8')
+ self.fax_name_company = unicode(self.NameCompanyLineEdit.text()).encode('utf8')
+ self.fax_number = unicode(self.FaxNumberLineEdit.text()).encode('utf8')
+ self.addPrinter()
+
+ elif p == PAGE_REMOVE:
+ for row in xrange(self.RemoveDevicesTableWidget.rowCount()):
+ widget = self.RemoveDevicesTableWidget.cellWidget(row, 0)
+ if widget.checkState() == Qt.Checked:
+ item = self.RemoveDevicesTableWidget.item(row, 1)
+ printer = unicode(item.data(Qt.UserRole).toString()).encode('utf-8')
+ log.debug("Removing printer: %s" % printer)
+ if cups.delPrinter(printer) == 0 and os.geteuid!=0 and utils.addgroup()!=[]:
+ FailureUI(self, self.__tr("<b>Unable to delete printer queue. Could not connect to CUPS Server</b><p>Is user added to %s group(s)" %utils.list_to_string(utils.addgroup())))
+ self.close()
+
+ else:
+ log.error("Invalid page!") # shouldn't happen!
+
+
+ def BackButton_clicked(self):
+ p = self.StackedWidget.currentIndex()
+ if p == PAGE_DEVICES:
+ self.devices = {}
+ self.showDiscoveryPage()
+
+ elif p == PAGE_ADD_PRINTER:
+ self.showDevicesPage()
+
+ else:
+ log.error("Invalid page!") # shouldn't happen!
+
+
+ def CancelButton_clicked(self):
+ self.close()
+
+
+ def displayPage(self, page):
+ self.StackedWidget.setCurrentIndex(page)
+ self.updateStepText(page)
+
+
+ def setNextButton(self, typ=BUTTON_FINISH):
+ if typ == BUTTON_ADD_PRINTER:
+ self.NextButton.setText(self.__tr("Add Printer"))
+ elif typ == BUTTON_NEXT:
+ self.NextButton.setText(self.__tr("Next >"))
+ elif typ == BUTTON_FINISH:
+ self.NextButton.setText(self.__tr("Finish"))
+ elif typ == BUTTON_REMOVE:
+ self.NextButton.setText(self.__tr("Remove"))
+
+
+ def updateStepText(self, p):
+ self.StepText.setText(self.__tr("Step %1 of %2").arg(p+1).arg(self.max_page+1))
+
+
+ def __tr(self,s,c = None):
+ return qApp.translate("SetupDialog",s,c)
+
+
diff --git a/ui4/setupdialog_base.py b/ui4/setupdialog_base.py
new file mode 100644
index 0000000..46476e1
--- /dev/null
+++ b/ui4/setupdialog_base.py
@@ -0,0 +1,383 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'ui4/setupdialog_base.ui'
+#
+# Created: Mon May 4 14:30:37 2009
+# by: PyQt4 UI code generator 4.4.4
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt4 import QtCore, QtGui
+
+class Ui_Dialog(object):
+ def setupUi(self, Dialog):
+ Dialog.setObjectName("Dialog")
+ Dialog.setWindowModality(QtCore.Qt.ApplicationModal)
+ Dialog.resize(700, 500)
+ self.gridlayout = QtGui.QGridLayout(Dialog)
+ self.gridlayout.setObjectName("gridlayout")
+ self.StackedWidget = QtGui.QStackedWidget(Dialog)
+ self.StackedWidget.setObjectName("StackedWidget")
+ self.DiscoveryPage = QtGui.QWidget()
+ self.DiscoveryPage.setObjectName("DiscoveryPage")
+ self.gridlayout1 = QtGui.QGridLayout(self.DiscoveryPage)
+ self.gridlayout1.setObjectName("gridlayout1")
+ self.label = QtGui.QLabel(self.DiscoveryPage)
+ font = QtGui.QFont()
+ font.setPointSize(16)
+ self.label.setFont(font)
+ self.label.setObjectName("label")
+ self.gridlayout1.addWidget(self.label, 0, 0, 1, 2)
+ self.line = QtGui.QFrame(self.DiscoveryPage)
+ self.line.setFrameShape(QtGui.QFrame.HLine)
+ self.line.setFrameShadow(QtGui.QFrame.Sunken)
+ self.line.setObjectName("line")
+ self.gridlayout1.addWidget(self.line, 1, 0, 1, 2)
+ self.groupBox = QtGui.QGroupBox(self.DiscoveryPage)
+ self.groupBox.setObjectName("groupBox")
+ self.gridlayout2 = QtGui.QGridLayout(self.groupBox)
+ self.gridlayout2.setObjectName("gridlayout2")
+ self.UsbRadioButton = QtGui.QRadioButton(self.groupBox)
+ self.UsbRadioButton.setChecked(True)
+ self.UsbRadioButton.setObjectName("UsbRadioButton")
+ self.gridlayout2.addWidget(self.UsbRadioButton, 0, 0, 1, 1)
+ self.NetworkRadioButton = QtGui.QRadioButton(self.groupBox)
+ self.NetworkRadioButton.setObjectName("NetworkRadioButton")
+ self.gridlayout2.addWidget(self.NetworkRadioButton, 1, 0, 1, 1)
+ self.ParallelRadioButton = QtGui.QRadioButton(self.groupBox)
+ self.ParallelRadioButton.setEnabled(True)
+ self.ParallelRadioButton.setObjectName("ParallelRadioButton")
+ self.gridlayout2.addWidget(self.ParallelRadioButton, 3, 0, 1, 1)
+ self.WirelessButton = QtGui.QRadioButton(self.groupBox)
+ self.WirelessButton.setObjectName("WirelessButton")
+ self.gridlayout2.addWidget(self.WirelessButton, 2, 0, 1, 1)
+ self.gridlayout1.addWidget(self.groupBox, 2, 0, 1, 2)
+ self.AdvancedButton = QtGui.QPushButton(self.DiscoveryPage)
+ self.AdvancedButton.setObjectName("AdvancedButton")
+ self.gridlayout1.addWidget(self.AdvancedButton, 3, 0, 1, 1)
+ spacerItem = QtGui.QSpacerItem(381, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+ self.gridlayout1.addItem(spacerItem, 3, 1, 1, 1)
+ self.AdvancedStackedWidget = QtGui.QStackedWidget(self.DiscoveryPage)
+ self.AdvancedStackedWidget.setObjectName("AdvancedStackedWidget")
+ self.page = QtGui.QWidget()
+ self.page.setObjectName("page")
+ self.gridlayout3 = QtGui.QGridLayout(self.page)
+ self.gridlayout3.setObjectName("gridlayout3")
+ self.DiscoveryOptionsGroupBox = QtGui.QGroupBox(self.page)
+ self.DiscoveryOptionsGroupBox.setObjectName("DiscoveryOptionsGroupBox")
+ self.gridlayout4 = QtGui.QGridLayout(self.DiscoveryOptionsGroupBox)
+ self.gridlayout4.setObjectName("gridlayout4")
+ self.hboxlayout = QtGui.QHBoxLayout()
+ self.hboxlayout.setObjectName("hboxlayout")
+ self.label_2 = QtGui.QLabel(self.DiscoveryOptionsGroupBox)
+ self.label_2.setObjectName("label_2")
+ self.hboxlayout.addWidget(self.label_2)
+ self.SearchLineEdit = QtGui.QLineEdit(self.DiscoveryOptionsGroupBox)
+ self.SearchLineEdit.setObjectName("SearchLineEdit")
+ self.hboxlayout.addWidget(self.SearchLineEdit)
+ self.gridlayout4.addLayout(self.hboxlayout, 0, 0, 1, 1)
+ self.hboxlayout1 = QtGui.QHBoxLayout()
+ self.hboxlayout1.setObjectName("hboxlayout1")
+ self.DeviceTypeLabel = QtGui.QLabel(self.DiscoveryOptionsGroupBox)
+ self.DeviceTypeLabel.setObjectName("DeviceTypeLabel")
+ self.hboxlayout1.addWidget(self.DeviceTypeLabel)
+ self.DeviceTypeComboBox = QtGui.QComboBox(self.DiscoveryOptionsGroupBox)
+ self.DeviceTypeComboBox.setObjectName("DeviceTypeComboBox")
+ self.hboxlayout1.addWidget(self.DeviceTypeComboBox)
+ self.gridlayout4.addLayout(self.hboxlayout1, 0, 1, 1, 2)
+ self.hboxlayout2 = QtGui.QHBoxLayout()
+ self.hboxlayout2.setObjectName("hboxlayout2")
+ self.NetworkDiscoveryMethodLabel = QtGui.QLabel(self.DiscoveryOptionsGroupBox)
+ self.NetworkDiscoveryMethodLabel.setObjectName("NetworkDiscoveryMethodLabel")
+ self.hboxlayout2.addWidget(self.NetworkDiscoveryMethodLabel)
+ self.NetworkDiscoveryMethodComboBox = QtGui.QComboBox(self.DiscoveryOptionsGroupBox)
+ self.NetworkDiscoveryMethodComboBox.setObjectName("NetworkDiscoveryMethodComboBox")
+ self.NetworkDiscoveryMethodComboBox.addItem(QtCore.QString())
+ self.NetworkDiscoveryMethodComboBox.addItem(QtCore.QString())
+ self.hboxlayout2.addWidget(self.NetworkDiscoveryMethodComboBox)
+ self.gridlayout4.addLayout(self.hboxlayout2, 1, 0, 1, 1)
+ self.hboxlayout3 = QtGui.QHBoxLayout()
+ self.hboxlayout3.setObjectName("hboxlayout3")
+ self.NetworkTimeoutLabel = QtGui.QLabel(self.DiscoveryOptionsGroupBox)
+ self.NetworkTimeoutLabel.setObjectName("NetworkTimeoutLabel")
+ self.hboxlayout3.addWidget(self.NetworkTimeoutLabel)
+ self.NetworkTimeoutSpinBox = QtGui.QSpinBox(self.DiscoveryOptionsGroupBox)
+ self.NetworkTimeoutSpinBox.setMinimum(1)
+ self.NetworkTimeoutSpinBox.setMaximum(90)
+ self.NetworkTimeoutSpinBox.setProperty("value", QtCore.QVariant(5))
+ self.NetworkTimeoutSpinBox.setObjectName("NetworkTimeoutSpinBox")
+ self.hboxlayout3.addWidget(self.NetworkTimeoutSpinBox)
+ self.gridlayout4.addLayout(self.hboxlayout3, 1, 1, 1, 1)
+ self.hboxlayout4 = QtGui.QHBoxLayout()
+ self.hboxlayout4.setObjectName("hboxlayout4")
+ self.NetworkTTLLabel = QtGui.QLabel(self.DiscoveryOptionsGroupBox)
+ self.NetworkTTLLabel.setObjectName("NetworkTTLLabel")
+ self.hboxlayout4.addWidget(self.NetworkTTLLabel)
+ self.NetworkTTLSpinBox = QtGui.QSpinBox(self.DiscoveryOptionsGroupBox)
+ self.NetworkTTLSpinBox.setMinimum(1)
+ self.NetworkTTLSpinBox.setMaximum(8)
+ self.NetworkTTLSpinBox.setProperty("value", QtCore.QVariant(4))
+ self.NetworkTTLSpinBox.setObjectName("NetworkTTLSpinBox")
+ self.hboxlayout4.addWidget(self.NetworkTTLSpinBox)
+ self.gridlayout4.addLayout(self.hboxlayout4, 1, 2, 1, 1)
+ self.gridlayout3.addWidget(self.DiscoveryOptionsGroupBox, 0, 0, 1, 1)
+ self.ManualGroupBox = QtGui.QGroupBox(self.page)
+ self.ManualGroupBox.setCheckable(True)
+ self.ManualGroupBox.setObjectName("ManualGroupBox")
+ self.gridlayout5 = QtGui.QGridLayout(self.ManualGroupBox)
+ self.gridlayout5.setObjectName("gridlayout5")
+ self.ManualParamLabel = QtGui.QLabel(self.ManualGroupBox)
+ self.ManualParamLabel.setObjectName("ManualParamLabel")
+ self.gridlayout5.addWidget(self.ManualParamLabel, 0, 0, 1, 1)
+ self.ManualParamLineEdit = QtGui.QLineEdit(self.ManualGroupBox)
+ self.ManualParamLineEdit.setObjectName("ManualParamLineEdit")
+ self.gridlayout5.addWidget(self.ManualParamLineEdit, 0, 1, 1, 1)
+ self.JetDirectLabel = QtGui.QLabel(self.ManualGroupBox)
+ self.JetDirectLabel.setObjectName("JetDirectLabel")
+ self.gridlayout5.addWidget(self.JetDirectLabel, 0, 2, 1, 1)
+ self.JetDirectSpinBox = QtGui.QSpinBox(self.ManualGroupBox)
+ self.JetDirectSpinBox.setMinimum(1)
+ self.JetDirectSpinBox.setMaximum(3)
+ self.JetDirectSpinBox.setObjectName("JetDirectSpinBox")
+ self.gridlayout5.addWidget(self.JetDirectSpinBox, 0, 3, 1, 1)
+ self.gridlayout3.addWidget(self.ManualGroupBox, 1, 0, 1, 1)
+ self.AdvancedStackedWidget.addWidget(self.page)
+ self.page_4 = QtGui.QWidget()
+ self.page_4.setObjectName("page_4")
+ self.AdvancedStackedWidget.addWidget(self.page_4)
+ self.gridlayout1.addWidget(self.AdvancedStackedWidget, 4, 0, 1, 2)
+ spacerItem1 = QtGui.QSpacerItem(478, 20, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ self.gridlayout1.addItem(spacerItem1, 5, 0, 1, 2)
+ self.StackedWidget.addWidget(self.DiscoveryPage)
+ self.page_2 = QtGui.QWidget()
+ self.page_2.setObjectName("page_2")
+ self.gridlayout6 = QtGui.QGridLayout(self.page_2)
+ self.gridlayout6.setObjectName("gridlayout6")
+ self.label_4 = QtGui.QLabel(self.page_2)
+ font = QtGui.QFont()
+ font.setPointSize(16)
+ self.label_4.setFont(font)
+ self.label_4.setObjectName("label_4")
+ self.gridlayout6.addWidget(self.label_4, 0, 0, 1, 2)
+ self.line_2 = QtGui.QFrame(self.page_2)
+ self.line_2.setFrameShape(QtGui.QFrame.HLine)
+ self.line_2.setFrameShadow(QtGui.QFrame.Sunken)
+ self.line_2.setObjectName("line_2")
+ self.gridlayout6.addWidget(self.line_2, 1, 0, 1, 3)
+ self.DevicesTableWidget = QtGui.QTableWidget(self.page_2)
+ self.DevicesTableWidget.setAlternatingRowColors(True)
+ self.DevicesTableWidget.setSelectionMode(QtGui.QAbstractItemView.SingleSelection)
+ self.DevicesTableWidget.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows)
+ self.DevicesTableWidget.setObjectName("DevicesTableWidget")
+ self.DevicesTableWidget.setColumnCount(0)
+ self.DevicesTableWidget.setRowCount(0)
+ self.gridlayout6.addWidget(self.DevicesTableWidget, 2, 0, 1, 3)
+ self.hboxlayout5 = QtGui.QHBoxLayout()
+ self.hboxlayout5.setObjectName("hboxlayout5")
+ self.DevicesFoundIcon = QtGui.QLabel(self.page_2)
+ sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.DevicesFoundIcon.sizePolicy().hasHeightForWidth())
+ self.DevicesFoundIcon.setSizePolicy(sizePolicy)
+ self.DevicesFoundIcon.setMinimumSize(QtCore.QSize(16, 16))
+ self.DevicesFoundIcon.setMaximumSize(QtCore.QSize(16, 16))
+ self.DevicesFoundIcon.setFrameShape(QtGui.QFrame.NoFrame)
+ self.DevicesFoundIcon.setObjectName("DevicesFoundIcon")
+ self.hboxlayout5.addWidget(self.DevicesFoundIcon)
+ self.DevicesFoundLabel = QtGui.QLabel(self.page_2)
+ sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Preferred)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.DevicesFoundLabel.sizePolicy().hasHeightForWidth())
+ self.DevicesFoundLabel.setSizePolicy(sizePolicy)
+ self.DevicesFoundLabel.setWordWrap(True)
+ self.DevicesFoundLabel.setObjectName("DevicesFoundLabel")
+ self.hboxlayout5.addWidget(self.DevicesFoundLabel)
+ self.gridlayout6.addLayout(self.hboxlayout5, 3, 0, 1, 1)
+ spacerItem2 = QtGui.QSpacerItem(21, 28, QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Minimum)
+ self.gridlayout6.addItem(spacerItem2, 3, 1, 1, 1)
+ self.RefreshButton = QtGui.QPushButton(self.page_2)
+ self.RefreshButton.setObjectName("RefreshButton")
+ self.gridlayout6.addWidget(self.RefreshButton, 3, 2, 1, 1)
+ self.StackedWidget.addWidget(self.page_2)
+ self.page_3 = QtGui.QWidget()
+ self.page_3.setObjectName("page_3")
+ self.gridlayout7 = QtGui.QGridLayout(self.page_3)
+ self.gridlayout7.setObjectName("gridlayout7")
+ self.label_5 = QtGui.QLabel(self.page_3)
+ font = QtGui.QFont()
+ font.setPointSize(16)
+ self.label_5.setFont(font)
+ self.label_5.setObjectName("label_5")
+ self.gridlayout7.addWidget(self.label_5, 0, 0, 1, 1)
+ self.line_3 = QtGui.QFrame(self.page_3)
+ self.line_3.setFrameShape(QtGui.QFrame.HLine)
+ self.line_3.setFrameShadow(QtGui.QFrame.Sunken)
+ self.line_3.setObjectName("line_3")
+ self.gridlayout7.addWidget(self.line_3, 1, 0, 1, 1)
+ self.groupBox_3 = QtGui.QGroupBox(self.page_3)
+ self.groupBox_3.setObjectName("groupBox_3")
+ self.gridlayout8 = QtGui.QGridLayout(self.groupBox_3)
+ self.gridlayout8.setObjectName("gridlayout8")
+ self.label_6 = QtGui.QLabel(self.groupBox_3)
+ self.label_6.setObjectName("label_6")
+ self.gridlayout8.addWidget(self.label_6, 0, 0, 1, 1)
+ self.PrinterNameLineEdit = QtGui.QLineEdit(self.groupBox_3)
+ self.PrinterNameLineEdit.setObjectName("PrinterNameLineEdit")
+ self.gridlayout8.addWidget(self.PrinterNameLineEdit, 0, 1, 1, 2)
+ self.label_7 = QtGui.QLabel(self.groupBox_3)
+ self.label_7.setObjectName("label_7")
+ self.gridlayout8.addWidget(self.label_7, 1, 0, 1, 1)
+ self.PrinterDescriptionLineEdit = QtGui.QLineEdit(self.groupBox_3)
+ self.PrinterDescriptionLineEdit.setObjectName("PrinterDescriptionLineEdit")
+ self.gridlayout8.addWidget(self.PrinterDescriptionLineEdit, 1, 1, 1, 2)
+ self.label_8 = QtGui.QLabel(self.groupBox_3)
+ self.label_8.setObjectName("label_8")
+ self.gridlayout8.addWidget(self.label_8, 2, 0, 1, 1)
+ self.PrinterLocationLineEdit = QtGui.QLineEdit(self.groupBox_3)
+ self.PrinterLocationLineEdit.setObjectName("PrinterLocationLineEdit")
+ self.gridlayout8.addWidget(self.PrinterLocationLineEdit, 2, 1, 1, 2)
+ self.label_3 = QtGui.QLabel(self.groupBox_3)
+ self.label_3.setObjectName("label_3")
+ self.gridlayout8.addWidget(self.label_3, 3, 0, 1, 1)
+ self.PPDFileLineEdit = QtGui.QLineEdit(self.groupBox_3)
+ self.PPDFileLineEdit.setReadOnly(True)
+ self.PPDFileLineEdit.setObjectName("PPDFileLineEdit")
+ self.gridlayout8.addWidget(self.PPDFileLineEdit, 3, 1, 1, 1)
+ self.OtherPPDButton = QtGui.QToolButton(self.groupBox_3)
+ self.OtherPPDButton.setObjectName("OtherPPDButton")
+ self.gridlayout8.addWidget(self.OtherPPDButton, 3, 2, 1, 1)
+ self.gridlayout7.addWidget(self.groupBox_3, 2, 0, 1, 1)
+ self.SetupFaxGroupBox = QtGui.QGroupBox(self.page_3)
+ self.SetupFaxGroupBox.setCheckable(True)
+ self.SetupFaxGroupBox.setObjectName("SetupFaxGroupBox")
+ self.gridlayout9 = QtGui.QGridLayout(self.SetupFaxGroupBox)
+ self.gridlayout9.setObjectName("gridlayout9")
+ self.label_9 = QtGui.QLabel(self.SetupFaxGroupBox)
+ self.label_9.setObjectName("label_9")
+ self.gridlayout9.addWidget(self.label_9, 0, 0, 1, 1)
+ self.FaxNameLineEdit = QtGui.QLineEdit(self.SetupFaxGroupBox)
+ self.FaxNameLineEdit.setObjectName("FaxNameLineEdit")
+ self.gridlayout9.addWidget(self.FaxNameLineEdit, 0, 1, 1, 3)
+ self.label_10 = QtGui.QLabel(self.SetupFaxGroupBox)
+ self.label_10.setObjectName("label_10")
+ self.gridlayout9.addWidget(self.label_10, 1, 0, 1, 1)
+ self.FaxNumberLineEdit = QtGui.QLineEdit(self.SetupFaxGroupBox)
+ self.FaxNumberLineEdit.setObjectName("FaxNumberLineEdit")
+ self.gridlayout9.addWidget(self.FaxNumberLineEdit, 1, 1, 1, 1)
+ self.label_11 = QtGui.QLabel(self.SetupFaxGroupBox)
+ self.label_11.setObjectName("label_11")
+ self.gridlayout9.addWidget(self.label_11, 1, 2, 1, 1)
+ self.NameCompanyLineEdit = QtGui.QLineEdit(self.SetupFaxGroupBox)
+ self.NameCompanyLineEdit.setObjectName("NameCompanyLineEdit")
+ self.gridlayout9.addWidget(self.NameCompanyLineEdit, 1, 3, 1, 1)
+ self.label_12 = QtGui.QLabel(self.SetupFaxGroupBox)
+ self.label_12.setObjectName("label_12")
+ self.gridlayout9.addWidget(self.label_12, 2, 0, 1, 1)
+ self.FaxDescriptionLineEdit = QtGui.QLineEdit(self.SetupFaxGroupBox)
+ self.FaxDescriptionLineEdit.setObjectName("FaxDescriptionLineEdit")
+ self.gridlayout9.addWidget(self.FaxDescriptionLineEdit, 2, 1, 1, 3)
+ self.label_13 = QtGui.QLabel(self.SetupFaxGroupBox)
+ self.label_13.setObjectName("label_13")
+ self.gridlayout9.addWidget(self.label_13, 3, 0, 1, 1)
+ self.FaxLocationLineEdit = QtGui.QLineEdit(self.SetupFaxGroupBox)
+ self.FaxLocationLineEdit.setObjectName("FaxLocationLineEdit")
+ self.gridlayout9.addWidget(self.FaxLocationLineEdit, 3, 1, 1, 3)
+ self.gridlayout7.addWidget(self.SetupFaxGroupBox, 3, 0, 1, 1)
+ spacerItem3 = QtGui.QSpacerItem(341, 16, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ self.gridlayout7.addItem(spacerItem3, 4, 0, 1, 1)
+ self.SendTestPageCheckBox = QtGui.QCheckBox(self.page_3)
+ self.SendTestPageCheckBox.setChecked(False)
+ self.SendTestPageCheckBox.setObjectName("SendTestPageCheckBox")
+ self.gridlayout7.addWidget(self.SendTestPageCheckBox, 5, 0, 1, 1)
+ self.StackedWidget.addWidget(self.page_3)
+ self.page_5 = QtGui.QWidget()
+ self.page_5.setObjectName("page_5")
+ self.gridlayout10 = QtGui.QGridLayout(self.page_5)
+ self.gridlayout10.setObjectName("gridlayout10")
+ self.label_15 = QtGui.QLabel(self.page_5)
+ font = QtGui.QFont()
+ font.setPointSize(16)
+ self.label_15.setFont(font)
+ self.label_15.setObjectName("label_15")
+ self.gridlayout10.addWidget(self.label_15, 0, 0, 1, 1)
+ self.line_4 = QtGui.QFrame(self.page_5)
+ self.line_4.setFrameShape(QtGui.QFrame.HLine)
+ self.line_4.setFrameShadow(QtGui.QFrame.Sunken)
+ self.line_4.setObjectName("line_4")
+ self.gridlayout10.addWidget(self.line_4, 1, 0, 1, 1)
+ self.RemoveDevicesTableWidget = QtGui.QTableWidget(self.page_5)
+ self.RemoveDevicesTableWidget.setAlternatingRowColors(True)
+ self.RemoveDevicesTableWidget.setSelectionMode(QtGui.QAbstractItemView.SingleSelection)
+ self.RemoveDevicesTableWidget.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows)
+ self.RemoveDevicesTableWidget.setObjectName("RemoveDevicesTableWidget")
+ self.RemoveDevicesTableWidget.setColumnCount(0)
+ self.RemoveDevicesTableWidget.setRowCount(0)
+ self.gridlayout10.addWidget(self.RemoveDevicesTableWidget, 2, 0, 1, 1)
+ self.StackedWidget.addWidget(self.page_5)
+ self.gridlayout.addWidget(self.StackedWidget, 0, 0, 1, 5)
+ self.StepText = QtGui.QLabel(Dialog)
+ self.StepText.setObjectName("StepText")
+ self.gridlayout.addWidget(self.StepText, 1, 0, 1, 1)
+ spacerItem4 = QtGui.QSpacerItem(181, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+ self.gridlayout.addItem(spacerItem4, 1, 1, 1, 1)
+ self.BackButton = QtGui.QPushButton(Dialog)
+ self.BackButton.setObjectName("BackButton")
+ self.gridlayout.addWidget(self.BackButton, 1, 2, 1, 1)
+ self.NextButton = QtGui.QPushButton(Dialog)
+ self.NextButton.setObjectName("NextButton")
+ self.gridlayout.addWidget(self.NextButton, 1, 3, 1, 1)
+ self.CancelButton = QtGui.QPushButton(Dialog)
+ self.CancelButton.setObjectName("CancelButton")
+ self.gridlayout.addWidget(self.CancelButton, 1, 4, 1, 1)
+
+ self.retranslateUi(Dialog)
+ self.StackedWidget.setCurrentIndex(0)
+ self.AdvancedStackedWidget.setCurrentIndex(0)
+ QtCore.QMetaObject.connectSlotsByName(Dialog)
+
+ def retranslateUi(self, Dialog):
+ Dialog.setWindowTitle(QtGui.QApplication.translate("Dialog", "HP Device Manager - Setup", None, QtGui.QApplication.UnicodeUTF8))
+ self.label.setText(QtGui.QApplication.translate("Dialog", "Device Discovery", None, QtGui.QApplication.UnicodeUTF8))
+ self.groupBox.setTitle(QtGui.QApplication.translate("Dialog", "Connection (I/O) Type", None, QtGui.QApplication.UnicodeUTF8))
+ self.UsbRadioButton.setText(QtGui.QApplication.translate("Dialog", "Universal Serial Bus (USB)", None, QtGui.QApplication.UnicodeUTF8))
+ self.NetworkRadioButton.setText(QtGui.QApplication.translate("Dialog", "Network/Ethernet/Wireless network (direct connection or JetDirect)", None, QtGui.QApplication.UnicodeUTF8))
+ self.ParallelRadioButton.setText(QtGui.QApplication.translate("Dialog", "Parallel Port (LPT)", None, QtGui.QApplication.UnicodeUTF8))
+ self.WirelessButton.setText(QtGui.QApplication.translate("Dialog", "Wireless/802.11 (requires a temporary USB connection and is only available for select devices)", None, QtGui.QApplication.UnicodeUTF8))
+ self.DiscoveryOptionsGroupBox.setTitle(QtGui.QApplication.translate("Dialog", "Discovery Options", None, QtGui.QApplication.UnicodeUTF8))
+ self.label_2.setText(QtGui.QApplication.translate("Dialog", "Search term:", None, QtGui.QApplication.UnicodeUTF8))
+ self.DeviceTypeLabel.setText(QtGui.QApplication.translate("Dialog", "Type:", None, QtGui.QApplication.UnicodeUTF8))
+ self.NetworkDiscoveryMethodLabel.setText(QtGui.QApplication.translate("Dialog", "Network discovery method:", None, QtGui.QApplication.UnicodeUTF8))
+ self.NetworkDiscoveryMethodComboBox.setItemText(0, QtGui.QApplication.translate("Dialog", "SLP", None, QtGui.QApplication.UnicodeUTF8))
+ self.NetworkDiscoveryMethodComboBox.setItemText(1, QtGui.QApplication.translate("Dialog", "mDNS/Bonjour", None, QtGui.QApplication.UnicodeUTF8))
+ self.NetworkTimeoutLabel.setText(QtGui.QApplication.translate("Dialog", "Timeout:", None, QtGui.QApplication.UnicodeUTF8))
+ self.NetworkTimeoutSpinBox.setSuffix(QtGui.QApplication.translate("Dialog", "sec", None, QtGui.QApplication.UnicodeUTF8))
+ self.NetworkTTLLabel.setText(QtGui.QApplication.translate("Dialog", "TTL:", None, QtGui.QApplication.UnicodeUTF8))
+ self.ManualGroupBox.setTitle(QtGui.QApplication.translate("Dialog", "Manual Discovery", None, QtGui.QApplication.UnicodeUTF8))
+ self.ManualParamLabel.setText(QtGui.QApplication.translate("Dialog", "Parameter:", None, QtGui.QApplication.UnicodeUTF8))
+ self.JetDirectLabel.setText(QtGui.QApplication.translate("Dialog", "Jetdirect port:", None, QtGui.QApplication.UnicodeUTF8))
+ self.label_4.setText(QtGui.QApplication.translate("Dialog", "Select From Discovered Devices", None, QtGui.QApplication.UnicodeUTF8))
+ self.DevicesTableWidget.setSortingEnabled(False)
+ self.DevicesFoundLabel.setText(QtGui.QApplication.translate("Dialog", "Found %1 devices on the %1 bus.", None, QtGui.QApplication.UnicodeUTF8))
+ self.RefreshButton.setText(QtGui.QApplication.translate("Dialog", "Refresh", None, QtGui.QApplication.UnicodeUTF8))
+ self.label_5.setText(QtGui.QApplication.translate("Dialog", "Setup Device", None, QtGui.QApplication.UnicodeUTF8))
+ self.groupBox_3.setTitle(QtGui.QApplication.translate("Dialog", "Printer Setup", None, QtGui.QApplication.UnicodeUTF8))
+ self.label_6.setText(QtGui.QApplication.translate("Dialog", "Printer name:", None, QtGui.QApplication.UnicodeUTF8))
+ self.label_7.setText(QtGui.QApplication.translate("Dialog", "Description:", None, QtGui.QApplication.UnicodeUTF8))
+ self.label_8.setText(QtGui.QApplication.translate("Dialog", "Location:", None, QtGui.QApplication.UnicodeUTF8))
+ self.label_3.setText(QtGui.QApplication.translate("Dialog", "PPD file:", None, QtGui.QApplication.UnicodeUTF8))
+ self.SetupFaxGroupBox.setTitle(QtGui.QApplication.translate("Dialog", "Fax Setup", None, QtGui.QApplication.UnicodeUTF8))
+ self.label_9.setText(QtGui.QApplication.translate("Dialog", "Fax name:", None, QtGui.QApplication.UnicodeUTF8))
+ self.label_10.setText(QtGui.QApplication.translate("Dialog", "Fax number:", None, QtGui.QApplication.UnicodeUTF8))
+ self.label_11.setText(QtGui.QApplication.translate("Dialog", "Name/company:", None, QtGui.QApplication.UnicodeUTF8))
+ self.label_12.setText(QtGui.QApplication.translate("Dialog", "Description:", None, QtGui.QApplication.UnicodeUTF8))
+ self.label_13.setText(QtGui.QApplication.translate("Dialog", "Location:", None, QtGui.QApplication.UnicodeUTF8))
+ self.SendTestPageCheckBox.setText(QtGui.QApplication.translate("Dialog", "Send test page to printer", None, QtGui.QApplication.UnicodeUTF8))
+ self.label_15.setText(QtGui.QApplication.translate("Dialog", "Select Printer/Fax Queues to Remove", None, QtGui.QApplication.UnicodeUTF8))
+ self.RemoveDevicesTableWidget.setSortingEnabled(False)
+ self.StepText.setText(QtGui.QApplication.translate("Dialog", "Step %1 of %2", None, QtGui.QApplication.UnicodeUTF8))
+ self.BackButton.setText(QtGui.QApplication.translate("Dialog", "< Back", None, QtGui.QApplication.UnicodeUTF8))
+ self.NextButton.setText(QtGui.QApplication.translate("Dialog", "Next >", None, QtGui.QApplication.UnicodeUTF8))
+ self.CancelButton.setText(QtGui.QApplication.translate("Dialog", "Cancel", None, QtGui.QApplication.UnicodeUTF8))
+
diff --git a/ui4/setupdialog_base.ui b/ui4/setupdialog_base.ui
new file mode 100644
index 0000000..f486d99
--- /dev/null
+++ b/ui4/setupdialog_base.ui
@@ -0,0 +1,654 @@
+<ui version="4.0" >
+ <class>Dialog</class>
+ <widget class="QDialog" name="Dialog" >
+ <property name="windowModality" >
+ <enum>Qt::ApplicationModal</enum>
+ </property>
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>700</width>
+ <height>500</height>
+ </rect>
+ </property>
+ <property name="windowTitle" >
+ <string>HP Device Manager - Setup</string>
+ </property>
+ <layout class="QGridLayout" >
+ <item row="0" column="0" colspan="5" >
+ <widget class="QStackedWidget" name="StackedWidget" >
+ <property name="currentIndex" >
+ <number>0</number>
+ </property>
+ <widget class="QWidget" name="DiscoveryPage" >
+ <layout class="QGridLayout" >
+ <item row="0" column="0" colspan="2" >
+ <widget class="QLabel" name="label" >
+ <property name="font" >
+ <font>
+ <pointsize>16</pointsize>
+ </font>
+ </property>
+ <property name="text" >
+ <string>Device Discovery</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" colspan="2" >
+ <widget class="Line" name="line" >
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" colspan="2" >
+ <widget class="QGroupBox" name="groupBox" >
+ <property name="title" >
+ <string>Connection (I/O) Type</string>
+ </property>
+ <layout class="QGridLayout" >
+ <item row="0" column="0" >
+ <widget class="QRadioButton" name="UsbRadioButton" >
+ <property name="text" >
+ <string>Universal Serial Bus (USB)</string>
+ </property>
+ <property name="checked" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QRadioButton" name="NetworkRadioButton" >
+ <property name="text" >
+ <string>Network/Ethernet/Wireless network (direct connection or JetDirect)</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0" >
+ <widget class="QRadioButton" name="ParallelRadioButton" >
+ <property name="enabled" >
+ <bool>true</bool>
+ </property>
+ <property name="text" >
+ <string>Parallel Port (LPT)</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" >
+ <widget class="QRadioButton" name="WirelessButton" >
+ <property name="text" >
+ <string>Wireless/802.11 (requires a temporary USB connection and is only available for select devices)</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="3" column="0" >
+ <widget class="QPushButton" name="AdvancedButton" >
+ <property name="text" >
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="1" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>381</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="4" column="0" colspan="2" >
+ <widget class="QStackedWidget" name="AdvancedStackedWidget" >
+ <property name="currentIndex" >
+ <number>0</number>
+ </property>
+ <widget class="QWidget" name="page" >
+ <layout class="QGridLayout" >
+ <item row="0" column="0" >
+ <widget class="QGroupBox" name="DiscoveryOptionsGroupBox" >
+ <property name="title" >
+ <string>Discovery Options</string>
+ </property>
+ <layout class="QGridLayout" >
+ <item row="0" column="0" >
+ <layout class="QHBoxLayout" >
+ <item>
+ <widget class="QLabel" name="label_2" >
+ <property name="text" >
+ <string>Search term:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLineEdit" name="SearchLineEdit" />
+ </item>
+ </layout>
+ </item>
+ <item row="0" column="1" colspan="2" >
+ <layout class="QHBoxLayout" >
+ <item>
+ <widget class="QLabel" name="DeviceTypeLabel" >
+ <property name="text" >
+ <string>Type:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QComboBox" name="DeviceTypeComboBox" />
+ </item>
+ </layout>
+ </item>
+ <item row="1" column="0" >
+ <layout class="QHBoxLayout" >
+ <item>
+ <widget class="QLabel" name="NetworkDiscoveryMethodLabel" >
+ <property name="text" >
+ <string>Network discovery method:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QComboBox" name="NetworkDiscoveryMethodComboBox" >
+ <item>
+ <property name="text" >
+ <string>SLP</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>mDNS/Bonjour</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="1" column="1" >
+ <layout class="QHBoxLayout" >
+ <item>
+ <widget class="QLabel" name="NetworkTimeoutLabel" >
+ <property name="text" >
+ <string>Timeout:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QSpinBox" name="NetworkTimeoutSpinBox" >
+ <property name="suffix" >
+ <string>sec</string>
+ </property>
+ <property name="minimum" >
+ <number>1</number>
+ </property>
+ <property name="maximum" >
+ <number>90</number>
+ </property>
+ <property name="value" >
+ <number>5</number>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="1" column="2" >
+ <layout class="QHBoxLayout" >
+ <item>
+ <widget class="QLabel" name="NetworkTTLLabel" >
+ <property name="text" >
+ <string>TTL:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QSpinBox" name="NetworkTTLSpinBox" >
+ <property name="suffix" >
+ <string/>
+ </property>
+ <property name="minimum" >
+ <number>1</number>
+ </property>
+ <property name="maximum" >
+ <number>8</number>
+ </property>
+ <property name="value" >
+ <number>4</number>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QGroupBox" name="ManualGroupBox" >
+ <property name="title" >
+ <string>Manual Discovery</string>
+ </property>
+ <property name="checkable" >
+ <bool>true</bool>
+ </property>
+ <layout class="QGridLayout" >
+ <item row="0" column="0" >
+ <widget class="QLabel" name="ManualParamLabel" >
+ <property name="text" >
+ <string>Parameter:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1" >
+ <widget class="QLineEdit" name="ManualParamLineEdit" />
+ </item>
+ <item row="0" column="2" >
+ <widget class="QLabel" name="JetDirectLabel" >
+ <property name="text" >
+ <string>Jetdirect port:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="3" >
+ <widget class="QSpinBox" name="JetDirectSpinBox" >
+ <property name="minimum" >
+ <number>1</number>
+ </property>
+ <property name="maximum" >
+ <number>3</number>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="page_4" />
+ </widget>
+ </item>
+ <item row="5" column="0" colspan="2" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>478</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="page_2" >
+ <layout class="QGridLayout" >
+ <item row="0" column="0" colspan="2" >
+ <widget class="QLabel" name="label_4" >
+ <property name="font" >
+ <font>
+ <pointsize>16</pointsize>
+ </font>
+ </property>
+ <property name="text" >
+ <string>Select From Discovered Devices</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" colspan="3" >
+ <widget class="Line" name="line_2" >
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" colspan="3" >
+ <widget class="QTableWidget" name="DevicesTableWidget" >
+ <property name="alternatingRowColors" >
+ <bool>true</bool>
+ </property>
+ <property name="selectionMode" >
+ <enum>QAbstractItemView::SingleSelection</enum>
+ </property>
+ <property name="selectionBehavior" >
+ <enum>QAbstractItemView::SelectRows</enum>
+ </property>
+ <property name="sortingEnabled" >
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0" >
+ <layout class="QHBoxLayout" >
+ <item>
+ <widget class="QLabel" name="DevicesFoundIcon" >
+ <property name="sizePolicy" >
+ <sizepolicy vsizetype="Fixed" hsizetype="Fixed" >
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize" >
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ <property name="maximumSize" >
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="text" >
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="DevicesFoundLabel" >
+ <property name="sizePolicy" >
+ <sizepolicy vsizetype="Preferred" hsizetype="Expanding" >
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string>Found %1 devices on the %1 bus.</string>
+ </property>
+ <property name="wordWrap" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="3" column="1" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType" >
+ <enum>QSizePolicy::Preferred</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>21</width>
+ <height>28</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="3" column="2" >
+ <widget class="QPushButton" name="RefreshButton" >
+ <property name="text" >
+ <string>Refresh</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="page_3" >
+ <layout class="QGridLayout" >
+ <item row="0" column="0" >
+ <widget class="QLabel" name="label_5" >
+ <property name="font" >
+ <font>
+ <pointsize>16</pointsize>
+ </font>
+ </property>
+ <property name="text" >
+ <string>Setup Device</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="Line" name="line_3" >
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" >
+ <widget class="QGroupBox" name="groupBox_3" >
+ <property name="title" >
+ <string>Printer Setup</string>
+ </property>
+ <layout class="QGridLayout" >
+ <item row="0" column="0" >
+ <widget class="QLabel" name="label_6" >
+ <property name="text" >
+ <string>Printer name:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1" colspan="2" >
+ <widget class="QLineEdit" name="PrinterNameLineEdit" />
+ </item>
+ <item row="1" column="0" >
+ <widget class="QLabel" name="label_7" >
+ <property name="text" >
+ <string>Description:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1" colspan="2" >
+ <widget class="QLineEdit" name="PrinterDescriptionLineEdit" />
+ </item>
+ <item row="2" column="0" >
+ <widget class="QLabel" name="label_8" >
+ <property name="text" >
+ <string>Location:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1" colspan="2" >
+ <widget class="QLineEdit" name="PrinterLocationLineEdit" />
+ </item>
+ <item row="3" column="0" >
+ <widget class="QLabel" name="label_3" >
+ <property name="text" >
+ <string>PPD file:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="1" >
+ <widget class="QLineEdit" name="PPDFileLineEdit" >
+ <property name="readOnly" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="2" >
+ <widget class="QToolButton" name="OtherPPDButton" >
+ <property name="text" >
+ <string/>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="3" column="0" >
+ <widget class="QGroupBox" name="SetupFaxGroupBox" >
+ <property name="title" >
+ <string>Fax Setup</string>
+ </property>
+ <property name="checkable" >
+ <bool>true</bool>
+ </property>
+ <layout class="QGridLayout" >
+ <item row="0" column="0" >
+ <widget class="QLabel" name="label_9" >
+ <property name="text" >
+ <string>Fax name:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1" colspan="3" >
+ <widget class="QLineEdit" name="FaxNameLineEdit" />
+ </item>
+ <item row="1" column="0" >
+ <widget class="QLabel" name="label_10" >
+ <property name="text" >
+ <string>Fax number:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1" >
+ <widget class="QLineEdit" name="FaxNumberLineEdit" />
+ </item>
+ <item row="1" column="2" >
+ <widget class="QLabel" name="label_11" >
+ <property name="text" >
+ <string>Name/company:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="3" >
+ <widget class="QLineEdit" name="NameCompanyLineEdit" />
+ </item>
+ <item row="2" column="0" >
+ <widget class="QLabel" name="label_12" >
+ <property name="text" >
+ <string>Description:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1" colspan="3" >
+ <widget class="QLineEdit" name="FaxDescriptionLineEdit" />
+ </item>
+ <item row="3" column="0" >
+ <widget class="QLabel" name="label_13" >
+ <property name="text" >
+ <string>Location:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="1" colspan="3" >
+ <widget class="QLineEdit" name="FaxLocationLineEdit" />
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="4" column="0" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>341</width>
+ <height>16</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="5" column="0" >
+ <widget class="QCheckBox" name="SendTestPageCheckBox" >
+ <property name="text" >
+ <string>Send test page to printer</string>
+ </property>
+ <property name="checked" >
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="page_5" >
+ <layout class="QGridLayout" >
+ <item row="0" column="0" >
+ <widget class="QLabel" name="label_15" >
+ <property name="font" >
+ <font>
+ <pointsize>16</pointsize>
+ </font>
+ </property>
+ <property name="text" >
+ <string>Select Printer/Fax Queues to Remove</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="Line" name="line_4" >
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" >
+ <widget class="QTableWidget" name="RemoveDevicesTableWidget" >
+ <property name="alternatingRowColors" >
+ <bool>true</bool>
+ </property>
+ <property name="selectionMode" >
+ <enum>QAbstractItemView::SingleSelection</enum>
+ </property>
+ <property name="selectionBehavior" >
+ <enum>QAbstractItemView::SelectRows</enum>
+ </property>
+ <property name="sortingEnabled" >
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QLabel" name="StepText" >
+ <property name="text" >
+ <string>Step %1 of %2</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>181</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="1" column="2" >
+ <widget class="QPushButton" name="BackButton" >
+ <property name="text" >
+ <string>&lt; Back</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="3" >
+ <widget class="QPushButton" name="NextButton" >
+ <property name="text" >
+ <string>Next ></string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="4" >
+ <widget class="QPushButton" name="CancelButton" >
+ <property name="text" >
+ <string>Cancel</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/ui4/systemtray.py b/ui4/systemtray.py
new file mode 100644
index 0000000..9572689
--- /dev/null
+++ b/ui4/systemtray.py
@@ -0,0 +1,810 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2009 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+
+# Std Lib
+import sys
+import struct
+import select
+import os
+import signal
+import os.path
+import time
+
+
+# Local
+from base.g import *
+from base import device, utils, models
+from base.codes import *
+from ui_utils import *
+
+# PyQt
+try:
+ from PyQt4.QtCore import *
+ from PyQt4.QtGui import *
+except ImportError:
+ log.error("Python bindings for Qt4 not found. Try using --qt3. Exiting!")
+ sys.exit(1)
+
+from systrayframe import SystrayFrame
+
+# dbus (required)
+try:
+ import dbus
+ #import dbus.service
+ from dbus import SessionBus, lowlevel
+ #from dbus.mainloop.qt import DBusQtMainLoop
+except ImportError:
+ log.error("Python bindings for dbus not found. Exiting!")
+ sys.exit(1)
+
+import warnings
+# Ignore: .../dbus/connection.py:242: DeprecationWarning: object.__init__() takes no parameters
+# (occurring on Python 2.6/dBus 0.83/Ubuntu 9.04)
+warnings.simplefilter("ignore", DeprecationWarning)
+
+
+# pynotify (optional)
+have_pynotify = True
+try:
+ import pynotify
+except ImportError:
+ have_pynotify = False
+
+
+TRAY_MESSAGE_DELAY = 10000
+HIDE_INACTIVE_DELAY = 5000
+BLIP_DELAY = 2000
+SET_MENU_DELAY = 1000
+MAX_MENU_EVENTS = 10
+UPGRADE_CHECK_DELAY=24*60*60*1000 #1 day
+
+ERROR_STATE_TO_ICON = {
+ ERROR_STATE_CLEAR: QSystemTrayIcon.Information,
+ ERROR_STATE_OK: QSystemTrayIcon.Information,
+ ERROR_STATE_WARNING: QSystemTrayIcon.Warning,
+ ERROR_STATE_ERROR: QSystemTrayIcon.Critical,
+ ERROR_STATE_LOW_SUPPLIES: QSystemTrayIcon.Warning,
+ ERROR_STATE_BUSY: QSystemTrayIcon.Warning,
+ ERROR_STATE_LOW_PAPER: QSystemTrayIcon.Warning,
+ ERROR_STATE_PRINTING: QSystemTrayIcon.Information,
+ ERROR_STATE_SCANNING: QSystemTrayIcon.Information,
+ ERROR_STATE_PHOTOCARD: QSystemTrayIcon.Information,
+ ERROR_STATE_FAXING: QSystemTrayIcon.Information,
+ ERROR_STATE_COPYING: QSystemTrayIcon.Information,
+}
+
+if have_pynotify:
+ info = getPynotifyIcon('info')
+ warn = getPynotifyIcon('warning')
+ err = getPynotifyIcon('error')
+ ERROR_STATE_TO_ICON_AND_URGENCY_PYNOTIFY = {
+ ERROR_STATE_CLEAR: (info, pynotify.URGENCY_LOW),
+ ERROR_STATE_OK: (info, pynotify.URGENCY_LOW),
+ ERROR_STATE_WARNING: (warn, pynotify.URGENCY_NORMAL),
+ ERROR_STATE_ERROR: (err, pynotify.URGENCY_CRITICAL),
+ ERROR_STATE_LOW_SUPPLIES: (warn, pynotify.URGENCY_NORMAL),
+ ERROR_STATE_BUSY: (warn, pynotify.URGENCY_NORMAL),
+ ERROR_STATE_LOW_PAPER: (warn, pynotify.URGENCY_NORMAL),
+ ERROR_STATE_PRINTING: (info, pynotify.URGENCY_LOW),
+ ERROR_STATE_SCANNING: (info, pynotify.URGENCY_LOW),
+ ERROR_STATE_PHOTOCARD: (info, pynotify.URGENCY_LOW),
+ ERROR_STATE_FAXING: (info, pynotify.URGENCY_LOW),
+ ERROR_STATE_COPYING: (info, pynotify.URGENCY_LOW),
+ }
+
+devices = {} # { <device_uri> : HistoryDevice(), ... }
+
+
+class DeviceMenu(QMenu):
+ def __init__(self, title, parent, device_uri, device_hist, index):
+ QMenu.__init__(self, title, parent)
+ self.device_uri = device_uri
+ self.device_hist = device_hist
+ self.index = index
+
+
+ def update(self):
+ self.clear()
+
+ if self.device_hist:
+ first = True
+ for e in self.device_hist:
+ error_state = STATUS_TO_ERROR_STATE_MAP.get(e.event_code, ERROR_STATE_CLEAR)
+ ess = device.queryString(e.event_code, 0)
+
+ a = QAction(QIcon(getStatusListIcon(error_state)[self.index]),
+ QString("%1 %2").arg(ess).arg(getTimeDeltaDesc(e.timedate)), self)
+
+ if first:
+ f = a.font()
+ f.setBold(True)
+ a.setFont(f)
+ self.setIcon(QIcon(getStatusListIcon(error_state)[self.index]))
+ first = False
+
+ self.addAction(a)
+
+ else:
+ self.addAction(QIcon(load_pixmap("warning", "16x16")),
+ QApplication.translate("SystemTray", "(No events)", None, QApplication.UnicodeUTF8))
+
+
+
+class HistoryDevice(QObject):
+ def __init__(self, device_uri, needs_update=True):
+ self.needs_update = needs_update
+ self.device_uri = device_uri
+
+ back_end, is_hp, bus, model, serial, dev_file, host, zc, port = \
+ device.parseDeviceURI(device_uri)
+
+ if bus == 'usb':
+ self.id = serial
+ elif bus == 'net':
+ self.id = host
+ elif bus == 'par':
+ self.id = dev_file
+ else:
+ self.id = 'unknown'
+
+ self.model = models.normalizeModelUIName(model)
+
+ if back_end == 'hp':
+ self.device_type = DEVICE_TYPE_PRINTER
+ self.menu_text = self.__tr("%1 Printer (%2)").arg(self.model).arg(self.id)
+
+ elif back_end == 'hpaio':
+ self.device_type = DEVICE_TYPE_SCANNER
+ self.menu_text = self.__tr("%1 Scanner (%2)").arg(self.model).arg(self.id)
+
+ elif back_end == 'hpfax':
+ self.device_type = DEVICE_TYPE_FAX
+ self.menu_text = self.__tr("%1 Fax (%2)").arg(self.model).arg(self.id)
+
+ else:
+ self.device_type = DEVICE_TYPE_UNKNOWN
+ self.menu_text = self.__tr("%1 (%2)").arg(self.model).arg(self.id)
+
+ self.mq = device.queryModelByURI(self.device_uri)
+ self.index = 0
+ if self.mq.get('tech-type', TECH_TYPE_NONE) in (TECH_TYPE_MONO_LASER, TECH_TYPE_COLOR_LASER):
+ self.index = 1
+ self.history = None
+
+
+ def getHistory(self, service):
+ if service is not None and self.needs_update:
+ device_uri, h = service.GetHistory(self.device_uri)
+ self.history = [device.Event(*tuple(e)) for e in list(h)[:-MAX_MENU_EVENTS:-1]]
+ self.needs_update = False
+
+
+ def __tr(self, s, c=None):
+ return QApplication.translate("SystemTray", s, c, QApplication.UnicodeUTF8)
+
+
+
+
+class SystraySettingsDialog(QDialog):
+ def __init__(self, parent, systray_visible, polling,
+ polling_interval, systray_messages,
+ device_list=None,
+ upgrade_notify=True,
+ upgrade_pending_time=0,
+ upgrade_last_update_time=0,
+ upgrade_msg=""
+ ):
+# upgrade_pending_update_time=0,
+
+
+ QDialog.__init__(self, parent)
+
+ self.systray_visible = systray_visible
+ self.systray_messages = systray_messages
+
+ if device_list is not None:
+ self.device_list = device_list
+ else:
+ self.device_list = {}
+
+ self.polling = polling
+ self.polling_interval = polling_interval
+ self.upgrade_notify =upgrade_notify
+ self.upgrade_last_update_time=upgrade_last_update_time
+ self.upgrade_pending_time=upgrade_pending_time
+ self.upgrade_msg=upgrade_msg
+
+ self.initUi()
+ self.SystemTraySettings.updateUi()
+
+
+ def initUi(self):
+ self.setObjectName("SystraySettingsDialog")
+ self.resize(QSize(QRect(0,0,488,565).size()).expandedTo(self.minimumSizeHint()))
+
+ self.gridlayout = QGridLayout(self)
+ self.gridlayout.setObjectName("gridlayout")
+
+ self.SystemTraySettings = SystrayFrame(self)
+ self.SystemTraySettings.initUi(self.systray_visible,
+ self.polling, self.polling_interval,
+ self.device_list,
+ self.systray_messages,
+ self.upgrade_notify,
+ self.upgrade_pending_time,
+ self.upgrade_msg)
+
+ sizePolicy = QSizePolicy(QSizePolicy.Expanding,QSizePolicy.Expanding)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.SystemTraySettings.sizePolicy().hasHeightForWidth())
+ self.SystemTraySettings.setSizePolicy(sizePolicy)
+ self.SystemTraySettings.setFrameShadow(QFrame.Raised)
+ self.SystemTraySettings.setObjectName("SystemTraySettings")
+ self.gridlayout.addWidget(self.SystemTraySettings,0,0,1,2)
+
+ spacerItem = QSpacerItem(301,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ self.gridlayout.addItem(spacerItem,1,0,1,1)
+
+ self.StdButtons = QDialogButtonBox(self)
+ self.StdButtons.setStandardButtons(QDialogButtonBox.Cancel|QDialogButtonBox.NoButton|QDialogButtonBox.Ok)
+ self.StdButtons.setCenterButtons(False)
+ self.StdButtons.setObjectName("StdButtons")
+ self.gridlayout.addWidget(self.StdButtons,1,1,1,1)
+
+ QObject.connect(self.StdButtons, SIGNAL("accepted()"), self.acceptClicked)
+ QObject.connect(self.StdButtons, SIGNAL("rejected()"), self.reject)
+ #QMetaObject.connectSlotsByName(self)
+
+ self.setWindowTitle(self.__tr("HP Device Manager - System Tray Settings"))
+ self.setWindowIcon(QIcon(load_pixmap('hp_logo', '128x128')))
+# pm = load_pixmap("hp_logo", "32x32")
+# self.prop_icon = QIcon(pm)
+
+
+ def acceptClicked(self):
+ self.systray_visible = self.SystemTraySettings.systray_visible
+ self.polling = self.SystemTraySettings.polling
+ self.polling_interval = self.SystemTraySettings.polling_interval
+ self.device_list = self.SystemTraySettings.device_list
+ self.systray_messages = self.SystemTraySettings.systray_messages
+ self.upgrade_notify =self.SystemTraySettings.upgrade_notify
+ self.accept()
+
+
+ def __tr(self, s, c=None):
+ return QApplication.translate("SystraySettingsDialog", s, c, QApplication.UnicodeUTF8)
+
+
+
+
+class SystemTrayApp(QApplication):
+ def __init__(self, args, read_pipe):
+ QApplication.__init__(self, args)
+
+ self.menu = None
+ self.read_pipe = read_pipe
+ self.fmt = "80s80sI32sI80sf"
+ self.fmt_size = struct.calcsize(self.fmt)
+ self.timer_active = False
+ self.active_icon = False
+ self.user_settings = UserSettings()
+ self.user_settings.load()
+ self.user_settings.debug()
+
+ self.tray_icon = QSystemTrayIcon()
+
+ pm = load_pixmap("hp_logo", "32x32")
+ self.prop_icon = QIcon(pm)
+
+ a = load_pixmap('active', '16x16')
+ painter = QPainter(pm)
+ painter.drawPixmap(32, 0, a)
+ painter.end()
+
+ self.prop_active_icon = QIcon(pm)
+
+ self.tray_icon.setIcon(self.prop_icon)
+
+ self.session_bus = SessionBus()
+ self.service = None
+
+ for d in device.getSupportedCUPSDevices(back_end_filter=['hp', 'hpfax']):
+ self.addDevice(d)
+
+ self.tray_icon.setToolTip(self.__tr("HPLIP Status Service"))
+ QObject.connect(self.tray_icon, SIGNAL("messageClicked()"), self.messageClicked)
+ notifier = QSocketNotifier(self.read_pipe, QSocketNotifier.Read)
+ QObject.connect(notifier, SIGNAL("activated(int)"), self.notifierActivated)
+ QObject.connect(self.tray_icon, SIGNAL("activated(QSystemTrayIcon::ActivationReason)"), self.trayActivated)
+ self.tray_icon.show()
+
+ if self.user_settings.systray_visible == SYSTRAY_VISIBLE_SHOW_ALWAYS:
+ self.tray_icon.setVisible(True)
+ else:
+ QTimer.singleShot(HIDE_INACTIVE_DELAY, self.timeoutHideWhenInactive) # show icon for awhile @ startup
+
+ self.tray_icon.setIcon(self.prop_active_icon)
+ self.active_icon = True
+
+ self.handle_hplip_updation()
+ QTimer.singleShot(SET_MENU_DELAY, self.initDone)
+
+ self.timer = QTimer()
+ self.timer.connect(self.timer,SIGNAL("timeout()"),self.handle_hplip_updation)
+ self.timer.start(UPGRADE_CHECK_DELAY)
+
+
+
+ def initDone(self):
+ self.tray_icon.setIcon(self.prop_icon)
+ self.active_icon = False
+
+ self.setMenu()
+
+
+ def addDevice(self, device_uri):
+ try:
+ devices[device_uri]
+ except KeyError:
+ devices[device_uri] = HistoryDevice(device_uri)
+ else:
+ devices[device_uri].needs_update = True
+
+
+ def handle_hplip_updation(self):
+ log.debug("handle_hplip_updation upgrade_notify =%d"%(self.user_settings.upgrade_notify))
+ path = utils.which('hp-upgrade')
+ if self.user_settings.upgrade_notify is False:
+ log.debug("upgrade notification is disabled in systray ")
+ if path:
+ path = os.path.join(path, 'hp-upgrade')
+ log.debug("Running hp-upgrade: %s " % (path))
+ # this just updates the available version in conf file. But won't notify
+ os.spawnlp(os.P_NOWAIT, path, 'hp-upgrade', '--check')
+ return
+
+
+ current_time = time.time()
+
+ if int(current_time) > self.user_settings.upgrade_pending_update_time:
+ path = utils.which('hp-upgrade')
+ if path:
+ path = os.path.join(path, 'hp-upgrade')
+ log.debug("Running hp-upgrade: %s " % (path))
+ os.spawnlp(os.P_NOWAIT, path, 'hp-upgrade', '--notify')
+
+ else:
+ log.error("Unable to find hp-upgrade --notify on PATH.")
+ else:
+ log.debug("upgrade schedule time is not yet completed. schedule time =%d current time =%d " %(self.user_settings.upgrade_pending_update_time, current_time))
+
+
+
+
+
+
+ def setMenu(self):
+ self.menu = QMenu()
+
+ title = QWidgetAction(self.menu)
+ #title.setDisabled(True)
+
+ hbox = QFrame(self.menu)
+ layout = QHBoxLayout(hbox)
+ layout.setMargin(3)
+ layout.setSpacing(5)
+ pix_label = QLabel(hbox)
+
+ layout.insertWidget(-1, pix_label, 0)
+
+ icon_size = self.menu.style().pixelMetric(QStyle.PM_SmallIconSize)
+ pix_label.setPixmap(self.prop_icon.pixmap(icon_size))
+
+ label = QLabel(hbox)
+ layout.insertWidget(-1, label, 20)
+ title.setDefaultWidget(hbox)
+
+ label.setText(self.__tr("HPLIP Status Service"))
+
+ f = label.font()
+ f.setBold(True)
+ label.setFont(f)
+ self.menu.insertAction(None, title)
+
+ if devices:
+ if self.service is None:
+ t = 0
+ while t < 3:
+ try:
+ self.service = self.session_bus.get_object('com.hplip.StatusService',
+ "/com/hplip/StatusService")
+ except DBusException:
+ log.warn("Unable to connect to StatusService. Retrying...")
+
+ t += 1
+ time.sleep(0.5)
+
+ if self.service is not None:
+ self.menu.addSeparator()
+
+ for d in devices:
+ devices[d].getHistory(self.service)
+
+ menu = DeviceMenu(devices[d].menu_text, self.menu, d, devices[d].history, devices[d].index)
+ self.menu.addMenu(menu)
+ menu.update()
+
+
+ self.menu.addSeparator()
+ self.menu.addAction(self.__tr("HP Device Manager..."), self.toolboxTriggered)
+
+ self.menu.addSeparator()
+
+ self.settings_action = self.menu.addAction(QIcon(load_pixmap('settings', '16x16')),
+ self.__tr("Settings..."), self.settingsTriggered)
+
+ self.menu.addSeparator()
+ self.menu.addAction(QIcon(load_pixmap('quit', '16x16')), "Quit", self.quitTriggered)
+ self.tray_icon.setContextMenu(self.menu)
+
+
+
+
+ def settingsTriggered(self):
+ if self.menu is None:
+ return
+
+ self.sendMessage('', '', EVENT_DEVICE_STOP_POLLING)
+# sys_conf
+ cur_vers = sys_conf.get('hplip', 'version')
+ self.user_settings.load()
+ installed_time =time.strftime("%d-%m-%Y", time.localtime(self.user_settings.upgrade_last_update_time))
+ if utils.Is_HPLIP_older_version(cur_vers, self.user_settings.latest_available_version):
+ if int(time.time()) < self.user_settings.upgrade_pending_update_time :
+ postponed_time =time.strftime("%d-%m-%Y", time.localtime(self.user_settings.upgrade_pending_update_time))
+ upgrade_msg ="HPLIP-%s version was installed on %s.\n\nNew version of HPLIP-%s is available for upgrade. HPLIP upgrade is scheduled on %s." %(cur_vers,installed_time , self.user_settings.latest_available_version, postponed_time)
+ elif self.user_settings.upgrade_last_update_time:
+ upgrade_msg ="HPLIP-%s version was installed on %s.\n\nNew version of HPLIP-%s is available for upgrade." %(cur_vers,installed_time , self.user_settings.latest_available_version)
+ else:
+ upgrade_msg ="HPLIP-%s version was installed.\n\nNew version of HPLIP-%s is available for upgrade." %(cur_vers, self.user_settings.latest_available_version)
+ elif self.user_settings.upgrade_last_update_time:
+ upgrade_msg ="HPLIP-%s version was installed on %s."%(cur_vers, installed_time)
+ else:
+ upgrade_msg ="HPLIP-%s version was installed."%(cur_vers)
+
+
+ try:
+ dlg = SystraySettingsDialog(self.menu, self.user_settings.systray_visible,
+ self.user_settings.polling, self.user_settings.polling_interval,
+ self.user_settings.systray_messages,
+ self.user_settings.polling_device_list,
+ self.user_settings.upgrade_notify,
+ self.user_settings.upgrade_pending_update_time,
+ self.user_settings.upgrade_last_update_time,
+ upgrade_msg)
+
+
+ if dlg.exec_() == QDialog.Accepted:
+ self.user_settings.systray_visible = dlg.systray_visible
+ self.user_settings.systray_messages = dlg.systray_messages
+ self.user_settings.upgrade_notify = dlg.upgrade_notify
+
+ log.debug("HPLIP update notification = %d"%(self.user_settings.upgrade_notify))
+ self.user_settings.save()
+
+ if self.user_settings.systray_visible == SYSTRAY_VISIBLE_SHOW_ALWAYS:
+ log.debug("Showing...")
+ self.tray_icon.setVisible(True)
+
+ else:
+ log.debug("Waiting to hide...")
+ QTimer.singleShot(HIDE_INACTIVE_DELAY, self.timeoutHideWhenInactive)
+
+ self.sendMessage('', '', EVENT_USER_CONFIGURATION_CHANGED)
+
+ finally:
+ self.sendMessage('', '', EVENT_DEVICE_START_POLLING)
+
+
+ def timeoutHideWhenInactive(self):
+ log.debug("Hiding...")
+ if self.user_settings.systray_visible in (SYSTRAY_VISIBLE_HIDE_WHEN_INACTIVE, SYSTRAY_VISIBLE_HIDE_ALWAYS):
+ self.tray_icon.setVisible(False)
+ log.debug("Hidden")
+
+
+ def updateMenu(self):
+ if self.menu is None:
+ return
+ for a in self.menu.actions():
+ try:
+ a.menu().update()
+ except AttributeError:
+ continue
+
+
+
+ def trayActivated(self, reason):
+ if reason == QSystemTrayIcon.Context:
+ self.updateMenu()
+
+
+ elif reason == QSystemTrayIcon.DoubleClick:
+ #print "double click"
+ self.toolboxTriggered()
+ pass
+
+ elif reason == QSystemTrayIcon.Trigger:
+ #print "single click"
+ pass
+
+ elif reason == QSystemTrayIcon.MiddleClick:
+ #print "middle click"
+ pass
+
+
+ def messageClicked(self):
+ #print "\nPARENT: message clicked"
+ pass
+
+
+ def quitTriggered(self):
+ log.debug("Exiting")
+ self.sendMessage('', '', EVENT_SYSTEMTRAY_EXIT)
+ self.quit()
+ del self.tray_icon
+
+ def toolboxTriggered(self):
+ try:
+ os.waitpid(-1, os.WNOHANG)
+ except OSError:
+ pass
+
+ # See if it is already running...
+ ok, lock_file = utils.lock_app('hp-toolbox', True)
+
+ if ok: # able to lock, not running...
+ utils.unlock(lock_file)
+
+ path = utils.which('hp-toolbox')
+ if path:
+ path = os.path.join(path, 'hp-toolbox')
+ else:
+ self.tray_icon.showMessage(self.__tr("HPLIP Status Service"),
+ self.__tr("Unable to locate hp-toolbox on system PATH."),
+ QSystemTrayIcon.Critical, TRAY_MESSAGE_DELAY)
+
+ log.error("Unable to find hp-toolbox on PATH.")
+ return
+
+ #log.debug(path)
+ log.debug("Running hp-toolbox: hp-toolbox")
+ os.spawnlp(os.P_NOWAIT, path, 'hp-toolbox')
+
+ else: # ...already running, raise it
+ self.sendMessage('', '', EVENT_RAISE_DEVICE_MANAGER, interface='com.hplip.Toolbox')
+
+
+ def sendMessage(self, device_uri, printer_name, event_code, username=prop.username,
+ job_id=0, title='', pipe_name='', interface='com.hplip.StatusService'):
+ #device.Event(device_uri, printer_name, event_code, username, job_id, title).send_via_dbus(SessionBus(), interface)
+ device.Event(device_uri, printer_name, event_code, username, job_id, title).send_via_dbus(self.session_bus, interface)
+
+
+ def notifierActivated(self, s):
+ m = ''
+ while True:
+ try:
+ r, w, e = select.select([self.read_pipe], [], [self.read_pipe], 1.0)
+ except select.error:
+ log.debug("Error in select()")
+ break
+
+ if e:
+ log.error("Pipe error: %s" % e)
+ break
+
+ if r:
+ m = ''.join([m, os.read(self.read_pipe, self.fmt_size)])
+ while len(m) >= self.fmt_size:
+ event = device.Event(*struct.unpack(self.fmt, m[:self.fmt_size]))
+
+ m = m[self.fmt_size:]
+
+ if event.event_code == EVENT_USER_CONFIGURATION_CHANGED:
+ log.debug("Re-reading configuration (EVENT_USER_CONFIGURATION_CHANGED)")
+ self.user_settings.load()
+ self.user_settings.debug()
+
+ elif event.event_code == EVENT_SYSTEMTRAY_EXIT:
+ self.quit()
+ return
+
+ if self.user_settings.systray_visible in \
+ (SYSTRAY_VISIBLE_SHOW_ALWAYS, SYSTRAY_VISIBLE_HIDE_WHEN_INACTIVE):
+
+ log.debug("Showing...")
+ self.tray_icon.setVisible(True)
+
+ if event.event_code == EVENT_DEVICE_UPDATE_ACTIVE:
+ if not self.active_icon:
+ self.tray_icon.setIcon(self.prop_active_icon)
+ self.active_icon = True
+ continue
+
+ elif event.event_code == EVENT_DEVICE_UPDATE_INACTIVE:
+ if self.active_icon:
+ self.tray_icon.setIcon(self.prop_icon)
+ self.active_icon = False
+ continue
+
+ elif event.event_code == EVENT_DEVICE_UPDATE_BLIP:
+ if not self.active_icon:
+ self.tray_icon.setIcon(self.prop_active_icon)
+ self.active_icon = True
+ QTimer.singleShot(BLIP_DELAY, self.blipTimeout)
+ continue
+
+ if self.user_settings.systray_visible in (SYSTRAY_VISIBLE_HIDE_WHEN_INACTIVE, SYSTRAY_VISIBLE_HIDE_ALWAYS):
+ log.debug("Waiting to hide...")
+ QTimer.singleShot(HIDE_INACTIVE_DELAY, self.timeoutHideWhenInactive)
+
+ if event.event_code <= EVENT_MAX_USER_EVENT:
+ self.addDevice(event.device_uri)
+ self.setMenu()
+
+ if self.tray_icon.supportsMessages():
+
+ log.debug("Tray icon message:")
+ event.debug()
+
+ error_state = STATUS_TO_ERROR_STATE_MAP.get(event.event_code, ERROR_STATE_CLEAR)
+ desc = device.queryString(event.event_code)
+
+ show_message = False
+ if self.user_settings.systray_messages == SYSTRAY_MESSAGES_SHOW_ALL: # OK, Busy
+ show_message = True
+
+ elif self.user_settings.systray_messages in (SYSTRAY_MESSAGES_SHOW_ERRORS_AND_WARNINGS, SYSTRAY_MESSAGES_SHOW_ERRORS_ONLY):
+ if error_state == ERROR_STATE_ERROR:
+ show_message = True
+
+ elif self.user_settings.systray_messages == SYSTRAY_MESSAGES_SHOW_ERRORS_AND_WARNINGS and \
+ error_state in (ERROR_STATE_WARNING, ERROR_STATE_LOW_SUPPLIES, ERROR_STATE_LOW_PAPER):
+
+ show_message = True
+
+ if event.printer_name:
+ d = QString(event.printer_name)
+ else:
+ back_end, is_hp, bus, model, serial, dev_file, host, zc, port = \
+ device.parseDeviceURI(event.device_uri)
+
+ if bus == 'usb':
+ idd = serial
+ elif bus == 'net':
+ idd = host
+ elif bus == 'par':
+ idd = dev_file
+ else:
+ idd = 'unknown'
+
+ self.model = models.normalizeModelUIName(model)
+
+ if back_end == 'hp':
+ d = self.__tr("%1 Printer (%2)").arg(model).arg(idd)
+
+ elif back_end == 'hpaio':
+ d = self.__tr("%1 Scanner (%2)").arg(model).arg(idd)
+
+ elif back_end == 'hpfax':
+ d = self.__tr("%1 Fax (%2)").arg(model).arg(idd)
+
+ else:
+ d = self.__tr("%1 (%2)").arg(model).arg(idd)
+
+ if show_message:
+ if have_pynotify and pynotify.init("hplip"): # Use libnotify/pynotify
+ icon, urgency = ERROR_STATE_TO_ICON_AND_URGENCY_PYNOTIFY.get(error_state,
+ (getPynotifyIcon('info'), pynotify.URGENCY_NORMAL))
+
+ if event.job_id and event.title:
+ msg = "%s\n%s: %s\n(%s/%s)" % (unicode(d), desc, event.title, event.username, event.job_id)
+ log.debug("Notify: uri=%s desc=%s title=%s user=%s job_id=%d code=%d" %
+ (event.device_uri, desc, event.title, event.username, event.job_id, event.event_code))
+ else:
+ msg = "%s\n%s (%s)" % (unicode(d), desc, event.event_code)
+ log.debug("Notify: uri=%s desc=%s code=%d" % (event.device_uri, desc, event.event_code))
+
+ n = pynotify.Notification("HPLIP Device Status", msg, icon)
+ n.set_urgency(urgency)
+
+ if error_state == ERROR_STATE_ERROR:
+ n.set_timeout(pynotify.EXPIRES_NEVER)
+ else:
+ n.set_timeout(TRAY_MESSAGE_DELAY)
+
+ n.show()
+
+ else: # Use "standard" message bubbles
+ icon = ERROR_STATE_TO_ICON.get(error_state, QSystemTrayIcon.Information)
+ if event.job_id and event.title:
+ log.debug("Bubble: uri=%s desc=%s title=%s user=%s job_id=%d code=%d" %
+ (event.device_uri, desc, event.title, event.username, event.job_id, event.event_code))
+ self.tray_icon.showMessage(self.__tr("HPLIP Device Status"),
+ QString("%1\n%2: %3\n(%4/%5)").\
+ arg(d).\
+ arg(desc).arg(event.title).\
+ arg(event.username).arg(event.job_id),
+ icon, TRAY_MESSAGE_DELAY)
+
+ else:
+ log.debug("Bubble: uri=%s desc=%s code=%d" % (event.device_uri, desc, event.event_code))
+ self.tray_icon.showMessage(self.__tr("HPLIP Device Status"),
+ QString("%1\n%2 (%3)").arg(d).\
+ arg(desc).arg(event.event_code),
+ icon, TRAY_MESSAGE_DELAY)
+
+ else:
+ break
+
+
+ def blipTimeout(self):
+ if self.active_icon:
+ self.tray_icon.setIcon(self.prop_icon)
+ self.active_icon = False
+
+
+
+ def __tr(self, s, c=None):
+ return QApplication.translate("SystemTray", s, c, QApplication.UnicodeUTF8)
+
+
+
+def run(read_pipe):
+ log.set_module("hp-systray(qt4)")
+ log.debug("PID=%d" % os.getpid())
+
+ app = SystemTrayApp(sys.argv, read_pipe)
+ app.setQuitOnLastWindowClosed(False) # If not set, settings dlg closes app
+
+ i = 0
+ while i < 60:
+ if QSystemTrayIcon.isSystemTrayAvailable():
+ break
+ time.sleep(1.0)
+ i += 1
+
+ if not QSystemTrayIcon.isSystemTrayAvailable():
+ FailureUI(None,
+ QApplication.translate("SystemTray",
+ "<b>No system tray detected on this system.</b><p>Unable to start, exiting.</p>",
+ None, QApplication.UnicodeUTF8),
+ QApplication.translate("SystemTray", "HPLIP Status Service",
+ None, QApplication.UnicodeUTF8))
+ else:
+ notifier = QSocketNotifier(read_pipe, QSocketNotifier.Read)
+ QObject.connect(notifier, SIGNAL("activated(int)"), app.notifierActivated)
+
+ app.exec_()
+
+
diff --git a/ui4/systrayframe.py b/ui4/systrayframe.py
new file mode 100644
index 0000000..5ef8446
--- /dev/null
+++ b/ui4/systrayframe.py
@@ -0,0 +1,216 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2001-2009 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+# Local
+from base.g import *
+from base.codes import *
+from ui_utils import *
+
+# Qt
+from PyQt4.QtCore import *
+from PyQt4.QtGui import *
+
+
+class SystrayFrame(QFrame):
+ def __init__(self, parent):
+ QFrame.__init__(self, parent)
+
+
+ def initUi(self, systray_visible, polling, polling_interval, device_list, systray_messages,upgrade_notify,
+ upgrade_postpone_time, upgrade_msg):
+
+ self.systray_visible = systray_visible
+ self.polling = polling
+ self.polling_interval = polling_interval
+ self.device_list = device_list
+ self.systray_messages = systray_messages
+ self.upgrade_notify = upgrade_notify
+ self.upgrade_postpone_time =upgrade_postpone_time
+ self.upgrade_msg = upgrade_msg
+
+ self.gridlayout = QGridLayout(self)
+
+ self.frame = QFrame(self)
+ self.frame.setFrameShape(QFrame.StyledPanel)
+ self.frame.setFrameShadow(QFrame.Raised)
+
+ self.gridlayout1 = QGridLayout(self.frame)
+
+ self.groupBox_2 = QGroupBox(self.frame)
+
+ self.gridlayout2 = QGridLayout(self.groupBox_2)
+
+ self.ShowAlwaysRadioButton = QRadioButton(self.groupBox_2)
+ self.gridlayout2.addWidget(self.ShowAlwaysRadioButton,0,0,1,1)
+
+ self.HideWhenInactiveRadioButton = QRadioButton(self.groupBox_2)
+ self.gridlayout2.addWidget(self.HideWhenInactiveRadioButton,1,0,1,1)
+
+ self.HideAlwaysRadioButton = QRadioButton(self.groupBox_2)
+ self.gridlayout2.addWidget(self.HideAlwaysRadioButton,2,0,1,1)
+
+ self.gridlayout1.addWidget(self.groupBox_2,0,0,1,1)
+
+ self.groupBox_3 = QGroupBox(self.frame)
+
+ self.gridlayout3 = QGridLayout(self.groupBox_3)
+
+ self.label_2 = QLabel(self.groupBox_3)
+ self.gridlayout3.addWidget(self.label_2,0,0,1,1)
+
+ self.MessageShowComboBox = QComboBox(self.groupBox_3)
+ self.gridlayout3.addWidget(self.MessageShowComboBox,1,0,1,1)
+
+ self.MessageShowComboBox.addItem(self.__tr("All"), QVariant(SYSTRAY_MESSAGES_SHOW_ALL))
+ self.MessageShowComboBox.addItem(self.__tr("Errors and Warnings"), QVariant(SYSTRAY_MESSAGES_SHOW_ERRORS_AND_WARNINGS))
+ self.MessageShowComboBox.addItem(self.__tr("Errors Only"), QVariant(SYSTRAY_MESSAGES_SHOW_ERRORS_ONLY))
+ self.MessageShowComboBox.addItem(self.__tr("None"), QVariant(SYSTRAY_MESSAGES_SHOW_NONE))
+
+ spacerItem = QSpacerItem(20,40,QSizePolicy.Minimum,QSizePolicy.Minimum)
+ self.gridlayout3.addItem(spacerItem,2,0,1,1)
+ self.gridlayout1.addWidget(self.groupBox_3,0,1,1,1)
+
+ self.MonitorGroupBox = QGroupBox(self.frame)
+ self.MonitorGroupBox.setCheckable(True)
+
+ self.MonitorGroupBox.setEnabled(False)
+
+ self.gridlayout4 = QGridLayout(self.MonitorGroupBox)
+
+ self.label = QLabel(self.MonitorGroupBox)
+ self.gridlayout4.addWidget(self.label,0,0,1,1)
+
+ self.listWidget = QListWidget(self.MonitorGroupBox)
+ self.gridlayout4.addWidget(self.listWidget,1,0,1,1)
+ self.gridlayout1.addWidget(self.MonitorGroupBox,1,0,1,2)
+
+
+ #UpdategroupBox is same as "gridlayout5"
+ self.groupBox_4 = QGroupBox(self.frame)
+ self.UpdategroupBox = QGridLayout(self.groupBox_4)
+ self.UpdategroupBox.setObjectName("UpdategroupBox")
+ self.UpdatecheckBox = QCheckBox(self.groupBox_4)
+ self.UpdatecheckBox.setObjectName("UpdatecheckBox")
+ self.UpdategroupBox.addWidget(self.UpdatecheckBox,0,0,1,4)
+ self.label_5 = QLabel(self.groupBox_4)
+ self.label_5.setObjectName("label_5")
+ self.UpdategroupBox.addWidget(self.label_5, 1, 0, 1, 4)
+ self.textEdit = QTextEdit(self.groupBox_4)
+ self.textEdit.setObjectName("textEdit")
+ self.textEdit.setReadOnly(True)
+ self.UpdategroupBox.addWidget(self.textEdit, 2, 0, 1, 4)
+ self.gridlayout1.addWidget(self.groupBox_4,2,0,1,2)
+
+ self.gridlayout.addWidget(self.frame,0,0,1,1)
+
+
+
+ self.setWindowTitle(QApplication.translate("self", "self", None, QApplication.UnicodeUTF8))
+ self.groupBox_2.setTitle(QApplication.translate("self", "System tray icon visibility", None, QApplication.UnicodeUTF8))
+ self.ShowAlwaysRadioButton.setText(QApplication.translate("self", "Always show", None, QApplication.UnicodeUTF8))
+ self.HideWhenInactiveRadioButton.setText(QApplication.translate("self", "Hide when inactive", None, QApplication.UnicodeUTF8))
+ self.HideAlwaysRadioButton.setText(QApplication.translate("self", "Always hide", None, QApplication.UnicodeUTF8))
+ self.groupBox_3.setTitle(QApplication.translate("self", "System tray icon messages", None, QApplication.UnicodeUTF8))
+ self.label_2.setText(QApplication.translate("self", "Messages to show:", None, QApplication.UnicodeUTF8))
+ self.MonitorGroupBox.setTitle(QApplication.translate("self", "Monitor button presses on devices", None, QApplication.UnicodeUTF8))
+ self.label.setText(QApplication.translate("self", "Devices to monitor:", None, QApplication.UnicodeUTF8))
+
+
+ self.groupBox_4.setTitle(QApplication.translate("Dialog", "Update Settings", None, QApplication.UnicodeUTF8))
+ self.UpdatecheckBox.setText(QApplication.translate("Dialog", "Check and notify HPLIP updates", None, QApplication.UnicodeUTF8))
+ self.label_5.setText(QApplication.translate("Dialog", "Status:", None, QApplication.UnicodeUTF8))
+ self.textEdit.setPlainText(self.upgrade_msg)
+
+
+ self.connect(self.ShowAlwaysRadioButton, SIGNAL("clicked(bool)"), self.ShowAlwaysRadioButton_clicked)
+ self.connect(self.HideWhenInactiveRadioButton, SIGNAL("clicked(bool)"), self.HideWhenInactiveRadioButton_clicked)
+ self.connect(self.HideAlwaysRadioButton, SIGNAL("clicked(bool)"), self.HideAlwaysRadioButton_clicked)
+ self.connect(self.MessageShowComboBox, SIGNAL("activated(int)"), self.MessageShowComboBox_activated)
+ self.connect(self.UpdatecheckBox, SIGNAL("clicked(bool)"), self.UpdatecheckBox_clicked)
+
+
+
+
+ def UpdatecheckBox_clicked(self, b):
+ log.debug("Update HPLIP val =%d "%b)
+ if b is False:
+ self.upgrade_notify = False
+ else:
+ self.upgrade_notify = True
+
+ def updateUi(self):
+ self.updateVisibility()
+ self.updateMessages()
+ self.updateDeviceList()
+ self.updateUpgradeSettings()
+
+
+ def updateVisibility(self):
+ if self.systray_visible == SYSTRAY_VISIBLE_SHOW_ALWAYS:
+ self.ShowAlwaysRadioButton.setChecked(True)
+
+ elif self.systray_visible == SYSTRAY_VISIBLE_HIDE_WHEN_INACTIVE:
+ self.HideWhenInactiveRadioButton.setChecked(True)
+
+ else: # SYSTRAY_VISIBLE_HIDE_ALWAYS
+ self.HideAlwaysRadioButton.setChecked(True)
+
+
+ def ShowAlwaysRadioButton_clicked(self, b):
+ if b: self.systray_visible = SYSTRAY_VISIBLE_SHOW_ALWAYS
+
+
+ def HideWhenInactiveRadioButton_clicked(self, b):
+ if b: self.systray_visible = SYSTRAY_VISIBLE_HIDE_WHEN_INACTIVE
+
+
+ def HideAlwaysRadioButton_clicked(self, b):
+ if b: self.systray_visible = SYSTRAY_VISIBLE_HIDE_ALWAYS
+
+
+ def updateMessages(self):
+ i = self.MessageShowComboBox.findData(QVariant(self.systray_messages))
+ if i != -1:
+ self.MessageShowComboBox.setCurrentIndex(i)
+
+
+ def MessageShowComboBox_activated(self, i):
+ sender = self.sender()
+ mode, ok = sender.itemData(i).toInt()
+ if ok:
+ self.systray_messages = mode
+
+
+ def updateDeviceList(self):
+ pass
+
+ def updateUpgradeSettings(self):
+ if self.upgrade_notify is True:
+ self.UpdatecheckBox.setChecked(True)
+ else:
+ self.UpdatecheckBox.setChecked(False)
+
+
+
+
+ def __tr(self, s, c=None):
+ return QApplication.translate("SystrayFrame", s, c, QApplication.UnicodeUTF8)
+
diff --git a/ui4/systrayframe_base.py b/ui4/systrayframe_base.py
new file mode 100644
index 0000000..bfb1926
--- /dev/null
+++ b/ui4/systrayframe_base.py
@@ -0,0 +1,110 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'ui4/systrayframe_base.ui'
+#
+# Created: Fri Jan 27 17:32:25 2012
+# by: PyQt4 UI code generator 4.7.4
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt4 import QtCore, QtGui
+
+class Ui_Dialog(object):
+ def setupUi(self, Dialog):
+ Dialog.setObjectName("Dialog")
+ Dialog.resize(476, 653)
+ self.gridlayout = QtGui.QGridLayout(Dialog)
+ self.gridlayout.setObjectName("gridlayout")
+ self.frame = QtGui.QFrame(Dialog)
+ self.frame.setFrameShape(QtGui.QFrame.StyledPanel)
+ self.frame.setFrameShadow(QtGui.QFrame.Raised)
+ self.frame.setObjectName("frame")
+ self.groupBox_2 = QtGui.QGroupBox(self.frame)
+ self.groupBox_2.setGeometry(QtCore.QRect(11, 11, 201, 114))
+ self.groupBox_2.setObjectName("groupBox_2")
+ self.gridlayout1 = QtGui.QGridLayout(self.groupBox_2)
+ self.gridlayout1.setObjectName("gridlayout1")
+ self.radioButton = QtGui.QRadioButton(self.groupBox_2)
+ self.radioButton.setObjectName("radioButton")
+ self.gridlayout1.addWidget(self.radioButton, 0, 0, 1, 1)
+ self.radioButton_2 = QtGui.QRadioButton(self.groupBox_2)
+ self.radioButton_2.setObjectName("radioButton_2")
+ self.gridlayout1.addWidget(self.radioButton_2, 1, 0, 1, 1)
+ self.radioButton_3 = QtGui.QRadioButton(self.groupBox_2)
+ self.radioButton_3.setObjectName("radioButton_3")
+ self.gridlayout1.addWidget(self.radioButton_3, 2, 0, 1, 1)
+ self.groupBox_3 = QtGui.QGroupBox(self.frame)
+ self.groupBox_3.setGeometry(QtCore.QRect(232, 11, 197, 136))
+ self.groupBox_3.setObjectName("groupBox_3")
+ self.gridlayout2 = QtGui.QGridLayout(self.groupBox_3)
+ self.gridlayout2.setObjectName("gridlayout2")
+ self.label_2 = QtGui.QLabel(self.groupBox_3)
+ self.label_2.setObjectName("label_2")
+ self.gridlayout2.addWidget(self.label_2, 0, 0, 1, 1)
+ self.MessageShowComboBox = QtGui.QComboBox(self.groupBox_3)
+ self.MessageShowComboBox.setObjectName("MessageShowComboBox")
+ self.gridlayout2.addWidget(self.MessageShowComboBox, 1, 0, 1, 1)
+ spacerItem = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Minimum)
+ self.gridlayout2.addItem(spacerItem, 2, 0, 1, 1)
+ self.groupBox = QtGui.QGroupBox(self.frame)
+ self.groupBox.setGeometry(QtCore.QRect(10, 385, 411, 241))
+ self.groupBox.setCheckable(True)
+ self.groupBox.setObjectName("groupBox")
+ self.gridlayout3 = QtGui.QGridLayout(self.groupBox)
+ self.gridlayout3.setObjectName("gridlayout3")
+ self.listWidget = QtGui.QListWidget(self.groupBox)
+ self.listWidget.setObjectName("listWidget")
+ self.gridlayout3.addWidget(self.listWidget, 4, 0, 1, 1)
+ self.label = QtGui.QLabel(self.groupBox)
+ self.label.setObjectName("label")
+ self.gridlayout3.addWidget(self.label, 3, 0, 1, 1)
+ self.groupBox_4 = QtGui.QGroupBox(self.frame)
+ self.groupBox_4.setGeometry(QtCore.QRect(10, 130, 411, 231))
+ self.groupBox_4.setObjectName("groupBox_4")
+ self.checkBox = QtGui.QCheckBox(self.groupBox_4)
+ self.checkBox.setGeometry(QtCore.QRect(20, 20, 331, 22))
+ self.checkBox.setChecked(True)
+ self.checkBox.setObjectName("checkBox")
+ self.label_3 = QtGui.QLabel(self.groupBox_4)
+ self.label_3.setGeometry(QtCore.QRect(50, 44, 221, 17))
+ self.label_3.setObjectName("label_3")
+ self.spinBox = QtGui.QSpinBox(self.groupBox_4)
+ self.spinBox.setGeometry(QtCore.QRect(270, 40, 55, 27))
+ self.spinBox.setMinimum(1)
+ self.spinBox.setMaximum(365)
+ self.spinBox.setProperty("value", 30)
+ self.spinBox.setObjectName("spinBox")
+ self.label_4 = QtGui.QLabel(self.groupBox_4)
+ self.label_4.setGeometry(QtCore.QRect(329, 45, 67, 17))
+ self.label_4.setObjectName("label_4")
+ self.checkBox_2 = QtGui.QCheckBox(self.groupBox_4)
+ self.checkBox_2.setGeometry(QtCore.QRect(49, 78, 301, 22))
+ self.checkBox_2.setObjectName("checkBox_2")
+ self.textEdit = QtGui.QTextEdit(self.groupBox_4)
+ self.textEdit.setGeometry(QtCore.QRect(50, 129, 331, 81))
+ self.textEdit.setObjectName("textEdit")
+ self.label_5 = QtGui.QLabel(self.groupBox_4)
+ self.label_5.setGeometry(QtCore.QRect(50, 107, 61, 17))
+ self.label_5.setObjectName("label_5")
+ self.gridlayout.addWidget(self.frame, 0, 1, 1, 1)
+
+ self.retranslateUi(Dialog)
+ QtCore.QMetaObject.connectSlotsByName(Dialog)
+
+ def retranslateUi(self, Dialog):
+ Dialog.setWindowTitle(QtGui.QApplication.translate("Dialog", "Dialog", None, QtGui.QApplication.UnicodeUTF8))
+ self.groupBox_2.setTitle(QtGui.QApplication.translate("Dialog", "System tray icon visibility", None, QtGui.QApplication.UnicodeUTF8))
+ self.radioButton.setText(QtGui.QApplication.translate("Dialog", "Always show", None, QtGui.QApplication.UnicodeUTF8))
+ self.radioButton_2.setText(QtGui.QApplication.translate("Dialog", "Hide when inactive", None, QtGui.QApplication.UnicodeUTF8))
+ self.radioButton_3.setText(QtGui.QApplication.translate("Dialog", "Always hide", None, QtGui.QApplication.UnicodeUTF8))
+ self.groupBox_3.setTitle(QtGui.QApplication.translate("Dialog", "System tray icon messages", None, QtGui.QApplication.UnicodeUTF8))
+ self.label_2.setText(QtGui.QApplication.translate("Dialog", "Which messages to show:", None, QtGui.QApplication.UnicodeUTF8))
+ self.groupBox.setTitle(QtGui.QApplication.translate("Dialog", "Monitor button presses on devices", None, QtGui.QApplication.UnicodeUTF8))
+ self.label.setText(QtGui.QApplication.translate("Dialog", "Devices to monitor:", None, QtGui.QApplication.UnicodeUTF8))
+ self.groupBox_4.setTitle(QtGui.QApplication.translate("Dialog", "Update Settings", None, QtGui.QApplication.UnicodeUTF8))
+ self.checkBox.setText(QtGui.QApplication.translate("Dialog", "Check for HPLIP Updates", None, QtGui.QApplication.UnicodeUTF8))
+ self.label_3.setText(QtGui.QApplication.translate("Dialog", "Repeat Check for Updates every ", None, QtGui.QApplication.UnicodeUTF8))
+ self.label_4.setText(QtGui.QApplication.translate("Dialog", "Days", None, QtGui.QApplication.UnicodeUTF8))
+ self.checkBox_2.setText(QtGui.QApplication.translate("Dialog", "Check when ever new version available", None, QtGui.QApplication.UnicodeUTF8))
+ self.label_5.setText(QtGui.QApplication.translate("Dialog", "Status:", None, QtGui.QApplication.UnicodeUTF8))
+
diff --git a/ui4/systrayframe_base.ui b/ui4/systrayframe_base.ui
new file mode 100644
index 0000000..68e2d0d
--- /dev/null
+++ b/ui4/systrayframe_base.ui
@@ -0,0 +1,246 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>Dialog</class>
+ <widget class="QDialog" name="Dialog">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>476</width>
+ <height>653</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Dialog</string>
+ </property>
+ <layout class="QGridLayout">
+ <item row="0" column="1">
+ <widget class="QFrame" name="frame">
+ <property name="frameShape">
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>QFrame::Raised</enum>
+ </property>
+ <widget class="QGroupBox" name="groupBox_2">
+ <property name="geometry">
+ <rect>
+ <x>11</x>
+ <y>11</y>
+ <width>201</width>
+ <height>114</height>
+ </rect>
+ </property>
+ <property name="title">
+ <string>System tray icon visibility</string>
+ </property>
+ <layout class="QGridLayout">
+ <item row="0" column="0">
+ <widget class="QRadioButton" name="radioButton">
+ <property name="text">
+ <string>Always show</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QRadioButton" name="radioButton_2">
+ <property name="text">
+ <string>Hide when inactive</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="QRadioButton" name="radioButton_3">
+ <property name="text">
+ <string>Always hide</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QGroupBox" name="groupBox_3">
+ <property name="geometry">
+ <rect>
+ <x>232</x>
+ <y>11</y>
+ <width>197</width>
+ <height>136</height>
+ </rect>
+ </property>
+ <property name="title">
+ <string>System tray icon messages</string>
+ </property>
+ <layout class="QGridLayout">
+ <item row="0" column="0">
+ <widget class="QLabel" name="label_2">
+ <property name="text">
+ <string>Which messages to show:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QComboBox" name="MessageShowComboBox"/>
+ </item>
+ <item row="2" column="0">
+ <spacer>
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Minimum</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QGroupBox" name="groupBox">
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>385</y>
+ <width>411</width>
+ <height>241</height>
+ </rect>
+ </property>
+ <property name="title">
+ <string>Monitor button presses on devices</string>
+ </property>
+ <property name="checkable">
+ <bool>true</bool>
+ </property>
+ <layout class="QGridLayout">
+ <item row="4" column="0">
+ <widget class="QListWidget" name="listWidget"/>
+ </item>
+ <item row="3" column="0">
+ <widget class="QLabel" name="label">
+ <property name="text">
+ <string>Devices to monitor:</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QGroupBox" name="groupBox_4">
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>130</y>
+ <width>411</width>
+ <height>231</height>
+ </rect>
+ </property>
+ <property name="title">
+ <string>Update Settings</string>
+ </property>
+ <widget class="QCheckBox" name="checkBox">
+ <property name="geometry">
+ <rect>
+ <x>20</x>
+ <y>20</y>
+ <width>331</width>
+ <height>22</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>Check for HPLIP Updates</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QLabel" name="label_3">
+ <property name="geometry">
+ <rect>
+ <x>50</x>
+ <y>44</y>
+ <width>221</width>
+ <height>17</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>Repeat Check for Updates every </string>
+ </property>
+ </widget>
+ <widget class="QSpinBox" name="spinBox">
+ <property name="geometry">
+ <rect>
+ <x>270</x>
+ <y>40</y>
+ <width>55</width>
+ <height>27</height>
+ </rect>
+ </property>
+ <property name="minimum">
+ <number>1</number>
+ </property>
+ <property name="maximum">
+ <number>365</number>
+ </property>
+ <property name="value">
+ <number>30</number>
+ </property>
+ </widget>
+ <widget class="QLabel" name="label_4">
+ <property name="geometry">
+ <rect>
+ <x>329</x>
+ <y>45</y>
+ <width>67</width>
+ <height>17</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>Days</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" name="checkBox_2">
+ <property name="geometry">
+ <rect>
+ <x>49</x>
+ <y>78</y>
+ <width>301</width>
+ <height>22</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>Check when ever new version available</string>
+ </property>
+ </widget>
+ <widget class="QTextEdit" name="textEdit">
+ <property name="geometry">
+ <rect>
+ <x>50</x>
+ <y>129</y>
+ <width>331</width>
+ <height>81</height>
+ </rect>
+ </property>
+ </widget>
+ <widget class="QLabel" name="label_5">
+ <property name="geometry">
+ <rect>
+ <x>50</x>
+ <y>107</y>
+ <width>61</width>
+ <height>17</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>Status:</string>
+ </property>
+ </widget>
+ </widget>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/ui4/ui_utils.py b/ui4/ui_utils.py
new file mode 100644
index 0000000..c6f4534
--- /dev/null
+++ b/ui4/ui_utils.py
@@ -0,0 +1,553 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2001-2009 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+# Std Lib
+import os.path
+import re
+import os
+import time
+
+# Local
+from base.g import *
+from base.codes import *
+from base import utils
+from prnt import cups
+
+# Qt
+from PyQt4.QtCore import *
+from PyQt4.QtGui import *
+
+pat_html_remove = re.compile("(?is)<.*?>", re.I)
+
+# databaseChanged signal values (for FABWindow)
+FAB_NAME_ADD = 0 # s1 - new name
+FAB_NAME_RENAME = 1 # s1 - old name, s2 - new name
+FAB_NAME_REMOVE = 2 # s1 - removed name
+FAB_NAME_DETAILS_CHANGED = 3 # s1 - name
+FAB_GROUP_ADD = 4 # s1 - new group
+FAB_GROUP_RENAME = 5 # s1 - old group, s2 - new group
+FAB_GROUP_REMOVE = 6 # s1 - removed group
+FAB_GROUP_MEMBERSHIP_CHANGED = 7 # s1 - group
+
+
+def __translate(t):
+ return QApplication.translate("ui_utils", t, None, QApplication.UnicodeUTF8)
+
+
+def beginWaitCursor():
+ QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
+
+
+def endWaitCursor():
+ QApplication.restoreOverrideCursor()
+
+
+# TODO: Cache pixmaps
+def load_pixmap(name, subdir=None, resize_to=None):
+ name = ''.join([os.path.splitext(name)[0], '.png'])
+
+ if subdir is None:
+ dir = prop.image_dir
+ ldir = os.path.join(os.getcwd(), 'data', 'images')
+ else:
+ dir = os.path.join(prop.image_dir, subdir)
+ ldir = os.path.join(os.getcwd(), 'data', 'images', subdir)
+
+ for d in [dir, ldir]:
+ f = os.path.join(d, name)
+ if os.path.exists(f):
+ if resize_to is not None:
+ img = QImage(f)
+ x, y = resize_to
+ return QPixmap.fromImage(img.scaled(x, y, Qt.IgnoreAspectRatio, Qt.SmoothTransformation))
+ else:
+ return QPixmap(f)
+
+ for w in utils.walkFiles(dir, recurse=True, abs_paths=True, return_folders=False, pattern=name):
+ if resize_to is not None:
+ img = QImage(w)
+ x, y = resize_to
+ return QPixmap.fromImage(img.scaled(x, y, Qt.IgnoreAspectRatio, Qt.SmoothTransformation))
+ else:
+ return QPixmap(w)
+
+ log.error("Pixmap '%s' not found!" % name)
+ return QPixmap()
+
+loadPixmap = load_pixmap
+
+
+def getPynotifyIcon(name, subdir='32x32'):
+ name = ''.join([os.path.splitext(name)[0], '.png'])
+ return "file://" + os.path.join(prop.image_dir, subdir, name)
+
+
+
+class UserSettings(QSettings):
+ def __init__(self):
+ if prop.user_dir is None:
+ QSettings.__init__(self)
+ else:
+ QSettings.__init__(self, os.path.join(prop.user_dir, 'hplip.conf'), QSettings.IniFormat)
+
+ self.systray_visible = SYSTRAY_VISIBLE_SHOW_ALWAYS
+ self.systray_messages = SYSTRAY_MESSAGES_SHOW_ALL
+ self.last_used_device_uri = ''
+ self.last_used_printer = ''
+ self.version = ''
+ self.date_time = ''
+ self.auto_refresh = False
+ self.auto_refresh_rate = 30
+ self.auto_refresh_type = 1
+ self.polling_interval = 5
+ self.polling = True
+ self.device_list = []
+ self.working_dir = '.'
+ self.voice_phone = ''
+ self.email_address = ''
+ self.upgrade_notify=True
+ self.upgrade_last_update_time=0
+ self.upgrade_pending_update_time=0
+ self.latest_available_version=""
+ self.loadDefaults()
+
+
+ def __setup(self, cmds):
+ for c in cmds:
+ basename = c.split()[0]
+ path = utils.which(basename)
+ if path:
+ return ' '.join([os.path.join(path, basename), ' '.join(c.split()[1:])])
+
+ return ''
+
+
+ def loadDefaults(self):
+ self.cmd_scan = self.__setup(['xsane -V %SANE_URI%', 'kooka', 'xscanimage'])
+ self.cmd_fab = self.__setup(['hp-fab'])
+
+
+ def load(self):
+ log.debug("Loading user settings...")
+ self.sync()
+
+ self.beginGroup("settings")
+ i, ok = self.value("systray_visible").toInt()
+ if ok:
+ self.systray_visible = i
+
+ i, ok = self.value("systray_messages").toInt()
+ if ok:
+ self.systray_messages = i
+
+ self.endGroup()
+
+ self.beginGroup("last_used")
+ self.last_used_device_uri = unicode(self.value("device_uri").toString()) or self.last_used_device_uri
+ self.last_used_printer = unicode(self.value("printer_name").toString()) or self.last_used_printer
+ self.working_dir = unicode(self.value("working_dir").toString()) or self.working_dir
+ self.endGroup()
+
+ self.beginGroup("commands")
+ self.cmd_scan = unicode(self.value("scan").toString()) or self.cmd_scan
+ self.endGroup()
+
+ self.beginGroup("refresh")
+ self.auto_refresh_rate = int(self.value("rate").toString() or self.auto_refresh_rate)
+ self.auto_refresh = bool(self.value("enable").toBool())
+ self.auto_refresh_type = int(self.value("type").toString() or self.auto_refresh_type)
+ self.endGroup()
+
+ self.beginGroup("installation")
+ self.version = unicode(self.value("version").toString())
+ self.date_time = unicode(self.value("date_time").toString())
+ self.endGroup()
+
+ self.beginGroup("polling")
+ self.polling = bool(self.value("enable").toBool())
+ self.polling_interval = int(self.value("interval").toString() or self.polling_interval)
+ self.polling_device_list = unicode(self.value("device_list").toString() or '').split(u',')
+ self.endGroup()
+
+ self.beginGroup("fax")
+ self.voice_phone = unicode(self.value("voice_phone").toString())
+ self.email_address = unicode(self.value("email_address").toString())
+ self.endGroup()
+
+ self.beginGroup("upgrade")
+ self.upgrade_notify= bool(self.value("notify_upgrade").toBool())
+ self.latest_available_version=str(self.value("latest_available_version").toString())
+
+ i, Ok = self.value("last_upgraded_time").toInt()
+ if Ok and i >0:
+ self.upgrade_last_update_time =i
+ else:
+ self.upgrade_last_update_time = 0
+
+ i, Ok = self.value("pending_upgrade_time").toInt()
+ if Ok and i >0 :
+ self.upgrade_pending_update_time = i
+ else:
+ self.upgrade_pending_update_time = 0
+
+ self.endGroup()
+
+
+ def save(self):
+ log.debug("Saving user settings...")
+
+ self.beginGroup("settings")
+ self.setValue("systray_visible", QVariant(self.systray_visible))
+ self.setValue("systray_messages", QVariant(self.systray_messages))
+ self.endGroup()
+
+ self.beginGroup("last_used")
+ self.setValue("device_uri", QVariant(self.last_used_device_uri))
+ self.setValue("printer_name", QVariant(self.last_used_printer))
+ self.setValue("working_dir", QVariant(self.working_dir))
+ self.endGroup()
+
+ self.beginGroup("commands")
+ self.setValue("scan", QVariant(self.cmd_scan))
+ self.endGroup()
+
+ self.beginGroup("refresh")
+ self.setValue("rate", QVariant(self.auto_refresh_rate))
+ self.setValue("enable", QVariant(self.auto_refresh))
+ self.setValue("type", QVariant(self.auto_refresh_type))
+ self.endGroup()
+
+ self.beginGroup("polling")
+ self.setValue("enable", QVariant(self.polling))
+ self.setValue("interval", QVariant(self.polling_interval))
+ self.setValue("device_list", QVariant(u','.join(self.polling_device_list)))
+ self.endGroup()
+
+ self.beginGroup("fax")
+ self.setValue("voice_phone", QVariant(self.voice_phone))
+ self.setValue("email_address", QVariant(self.email_address))
+ self.endGroup()
+
+ self.beginGroup("upgrade")
+ self.setValue("notify_upgrade", QVariant(self.upgrade_notify))
+ if self.upgrade_last_update_time <1:
+ self.upgrade_last_update_time = time.time() # <---Need to verify code once
+
+ self.setValue("last_upgraded_time", QVariant(self.upgrade_last_update_time))
+ self.setValue("pending_upgrade_time", QVariant(self.upgrade_pending_update_time))
+ self.endGroup()
+
+
+ self.sync()
+
+
+ def debug(self):
+ log.debug("FAB command: %s" % self.cmd_fab)
+ log.debug("Scan command: %s" % self.cmd_scan)
+ log.debug("Auto refresh: %s" % self.auto_refresh)
+ log.debug("Auto refresh rate: %s" % self.auto_refresh_rate)
+ log.debug("Auto refresh type: %s" % self.auto_refresh_type)
+ log.debug("Systray visible: %d" % self.systray_visible)
+ log.debug("Systray messages: %d" % self.systray_messages)
+ log.debug("Last used device URI: %s" % self.last_used_device_uri)
+ log.debug("Last used printer: %s" % self.last_used_printer)
+ log.debug("Working directory: %s" % self.working_dir)
+
+
+DEFAULT_TITLE = __translate("HP Device Manager")
+
+
+def FailureUI(parent, error_text, title_text=None):
+ log.error(pat_html_remove.sub(' ', unicode(error_text)))
+
+ if title_text is None:
+ if parent is not None:
+ title_text = parent.windowTitle()
+ else:
+ title_text = DEFAULT_TITLE
+
+ QMessageBox.critical(parent,
+ title_text,
+ error_text,
+ QMessageBox.Ok,
+ QMessageBox.NoButton,
+ QMessageBox.NoButton)
+
+showFailureUi = FailureUI
+
+
+def WarningUI(parent, warn_text, title_text=None):
+ log.warn(pat_html_remove.sub(' ', unicode(warn_text)))
+
+ if title_text is None:
+ if parent is not None:
+ title_text = parent.windowTitle()
+ else:
+ title_text = DEFAULT_TITLE
+
+
+ QMessageBox.warning(parent,
+ title_text,
+ warn_text,
+ QMessageBox.Ok,
+ QMessageBox.NoButton,
+ QMessageBox.NoButton)
+
+showWarningUi = WarningUI
+
+
+def SuccessUI(parent, text, title_text=None):
+ log.info(pat_html_remove.sub(' ', unicode(text)))
+
+ if title_text is None:
+ if parent is not None:
+ title_text = parent.windowTitle()
+ else:
+ title_text = DEFAULT_TITLE
+
+
+ QMessageBox.information(parent,
+ title_text,
+ text,
+ QMessageBox.Ok,
+ QMessageBox.NoButton,
+ QMessageBox.NoButton)
+
+showSuccessUi = SuccessUI
+
+
+def CheckDeviceUI(parent, title_text=None):
+ text = __translate("<b>Unable to communicate with device or device is in an error state.</b><p>Please check device setup and try again.</p>")
+ return FailureUI(parent, text, title_text)
+
+checkDeviceUi = CheckDeviceUI
+
+
+class PrinterNameValidator(QValidator):
+ def __init__(self, parent=None):
+ QValidator.__init__(self, parent)
+
+ def validate(self, input, pos):
+ input = unicode(input)
+
+ if not input:
+ return QValidator.Acceptable, pos
+
+ if input[pos-1] in cups.INVALID_PRINTER_NAME_CHARS:
+ return QValidator.Invalid, pos
+
+ # TODO: How to determine if unicode char is "printable" and acceptable
+ # to CUPS?
+ #elif input != utils.printable(input):
+ # return QValidator.Invalid, pos
+
+ return QValidator.Acceptable, pos
+
+
+
+class PhoneNumValidator(QValidator):
+ def __init__(self, parent=None):
+ QValidator.__init__(self, parent)
+
+ def validate(self, input, pos):
+ input = unicode(input)
+
+ if not input:
+ return QValidator.Acceptable, pos
+
+ if input[pos-1] not in u'0123456789-(+).,#* ':
+ return QValidator.Invalid, pos
+
+ return QValidator.Acceptable, pos
+
+
+class AddressBookNameValidator(QValidator):
+ def __init__(self, db, parent=None):
+ QValidator.__init__(self, parent)
+ self.db = db
+
+ def validate(self, input, pos):
+ input = unicode(input)
+
+ if not input:
+ return QValidator.Acceptable, pos
+
+ if input in self.db.get_all_names():
+ return QValidator.Invalid, pos
+
+ if input[pos-1] in u'''|\\/"''': # | is the drag 'n drop separator
+ return QValidator.Invalid, pos
+
+ return QValidator.Acceptable, pos
+
+
+
+MIME_TYPES_DESC = \
+{
+ "application/pdf" : (__translate("PDF Document"), '.pdf'),
+ "application/postscript" : (__translate("Postscript Document"), '.ps'),
+ "application/vnd.hp-HPGL" : (__translate("HP Graphics Language File"), '.hgl, .hpg, .plt, .prn'),
+ "application/x-cshell" : (__translate("C Shell Script"), '.csh, .sh'),
+ "application/x-csource" : (__translate("C Source Code"), '.c'),
+ "text/cpp": (__translate("C/C++ Source Code"), '.c, .cpp, .cxx'),
+ "application/x-perl" : (__translate("Perl Script"), '.pl'),
+ "application/x-python" : (__translate("Python Program"), '.py'),
+ "application/x-shell" : (__translate("Shell Script"), '.sh'),
+ "application/x-sh" : (__translate("Shell Script"), '.sh'),
+ "text/plain" : (__translate("Plain Text"), '.txt, .log'),
+ "text/html" : (__translate("HTML Dcoument"), '.htm, .html'),
+ "image/gif" : (__translate("GIF Image"), '.gif'),
+ "image/png" : (__translate("PNG Image"), '.png'),
+ "image/jpeg" : (__translate("JPEG Image"), '.jpg, .jpeg'),
+ "image/tiff" : (__translate("TIFF Image"), '.tif, .tiff'),
+ "image/x-bitmap" : (__translate("Bitmap (BMP) Image"), '.bmp'),
+ "image/x-bmp" : (__translate("Bitmap (BMP) Image"), '.bmp'),
+ "image/x-photocd" : (__translate("Photo CD Image"), '.pcd'),
+ "image/x-portable-anymap" : (__translate("Portable Image (PNM)"), '.pnm'),
+ "image/x-portable-bitmap" : (__translate("Portable B&W Image (PBM)"), '.pbm'),
+ "image/x-portable-graymap" : (__translate("Portable Grayscale Image (PGM)"), '.pgm'),
+ "image/x-portable-pixmap" : (__translate("Portable Color Image (PPM)"), '.ppm'),
+ "image/x-sgi-rgb" : (__translate("SGI RGB"), '.rgb'),
+ "image/x-xbitmap" : (__translate("X11 Bitmap (XBM)"), '.xbm'),
+ "image/x-xpixmap" : (__translate("X11 Pixmap (XPM)"), '.xpm'),
+ "image/x-sun-raster" : (__translate("Sun Raster Format"), '.ras'),
+ "application/hplip-fax" : (__translate("HPLIP Fax File"), '.g3, .g4'),
+}
+
+# pixmaps for status list(s) (inkjet, laserjet)
+status_icons = None
+
+def getStatusListIcon(error_state):
+ global status_icons
+ if status_icons is None:
+ status_icons = {
+ ERROR_STATE_CLEAR : (load_pixmap('idle', '16x16'), load_pixmap('idle', '16x16')),
+ ERROR_STATE_BUSY : (load_pixmap('busy', '16x16'), load_pixmap('busy', '16x16')),
+ ERROR_STATE_ERROR : (load_pixmap('error', '16x16'), load_pixmap('error', '16x16')),
+ ERROR_STATE_LOW_SUPPLIES : (load_pixmap('inkdrop', '16x16'), load_pixmap('toner', '16x16')),
+ ERROR_STATE_OK : (load_pixmap('ok', '16x16'), load_pixmap('ok', '16x16')),
+ ERROR_STATE_WARNING : (load_pixmap('warning', '16x16'), load_pixmap('warning', '16x16')),
+ ERROR_STATE_LOW_PAPER: (load_pixmap('paper', '16x16'), load_pixmap('paper', '16x16')),
+ ERROR_STATE_PRINTING : (load_pixmap("print", '16x16'), load_pixmap("print", '16x16')),
+ ERROR_STATE_SCANNING : (load_pixmap("scan", '16x16'), load_pixmap("scan", '16x16')),
+ ERROR_STATE_PHOTOCARD : (load_pixmap("pcard", '16x16'), load_pixmap("pcard", '16x16')),
+ ERROR_STATE_FAXING : (load_pixmap("fax", '16x16'), load_pixmap("fax", '16x16')),
+ ERROR_STATE_COPYING : (load_pixmap("makecopies", '16x16'), load_pixmap("makecopies", '16x16')),
+ }
+
+ return status_icons.get(error_state, status_icons[ERROR_STATE_CLEAR])
+
+# pixmaps for device icons (inkjet, laserjet)
+overlay_icons = None
+
+def getStatusOverlayIcon(error_state):
+ global overlay_icons
+ if overlay_icons is None:
+ overlay_icons = {
+ ERROR_STATE_CLEAR : (None, None),
+ ERROR_STATE_BUSY : (load_pixmap('busy', '16x16'), load_pixmap('busy', '16x16')),
+ ERROR_STATE_ERROR : (load_pixmap('error', '16x16'), load_pixmap('error', '16x16')),
+ ERROR_STATE_LOW_SUPPLIES : (load_pixmap('inkdrop', '16x16'), load_pixmap('toner', '16x16')),
+ ERROR_STATE_OK : (load_pixmap('ok', '16x16'), load_pixmap('ok', '16x16')),
+ ERROR_STATE_WARNING : (load_pixmap('warning', '16x16'), load_pixmap('warning', '16x16')),
+ ERROR_STATE_LOW_PAPER: (load_pixmap('paper', '16x16'), load_pixmap('paper', '16x16')),
+ ERROR_STATE_PRINTING : (load_pixmap('busy', '16x16'), load_pixmap('busy', '16x16')),
+ ERROR_STATE_SCANNING : (load_pixmap('busy', '16x16'), load_pixmap('busy', '16x16')),
+ ERROR_STATE_PHOTOCARD : (load_pixmap('busy', '16x16'), load_pixmap('busy', '16x16')),
+ ERROR_STATE_FAXING : (load_pixmap('busy', '16x16'), load_pixmap('busy', '16x16')),
+ ERROR_STATE_COPYING : (load_pixmap('busy', '16x16'), load_pixmap('busy', '16x16')),
+ ERROR_STATE_REFRESHING : (load_pixmap('refresh1', '16x16'), load_pixmap('refresh1', '16x16')),
+ }
+
+ return overlay_icons.get(error_state, overlay_icons[ERROR_STATE_CLEAR])
+
+
+NUM_REPRS = {
+ 1 : __translate("one"),
+ 2 : __translate("two"),
+ 3 : __translate("three"),
+ 4 : __translate("four"),
+ 5 : __translate("five"),
+ 6 : __translate("six"),
+ 7 : __translate("seven"),
+ 8 : __translate("eight"),
+ 9 : __translate("nine"),
+ 10 : __translate("ten"),
+ 11 : __translate("eleven"),
+ 12 : __translate("twelve")
+}
+
+UNIT_NAMES = {
+ "year" : (__translate("year"), __translate("years")),
+ "month" : (__translate("month"), __translate("months")),
+ "week" : (__translate("week"), __translate("weeks")),
+ "day" : (__translate("day"), __translate("days")),
+ "hour" : (__translate("hour"), __translate("hours")),
+ "minute" : (__translate("minute"), __translate("minutes")),
+ "second" : (__translate("second"), __translate("seconds")),
+}
+
+
+def getTimeDeltaDesc(past):
+ t1 = QDateTime()
+ t1.setTime_t(int(past))
+ t2 = QDateTime.currentDateTime()
+ delta = t1.secsTo(t2)
+ return __translate("(%1 ago)").arg(stringify(delta))
+
+
+# "Nicely readable timedelta"
+# Credit: Bjorn Lindqvist
+# ASPN Python Recipe 498062
+# http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/498062
+# Note: Modified from recipe
+def getSecondsInUnits(seconds):
+ unit_limits = [("year", 31536000),
+ ("month", 2592000),
+ ("week", 604800),
+ ("day", 86400),
+ ("hour", 3600),
+ ("minute", 60)]
+
+ for unit_name, limit in unit_limits:
+ if seconds >= limit:
+ amount = int(round(float(seconds) / limit))
+ return amount, unit_name
+
+ return seconds, "second"
+
+
+def stringify(seconds):
+ amount, unit_name = getSecondsInUnits(seconds)
+
+ try:
+ i18n_amount = NUM_REPRS[amount]
+ except KeyError:
+ i18n_amount = unicode(amount)
+
+ if amount == 1:
+ i18n_unit = UNIT_NAMES[unit_name][0]
+ else:
+ i18n_unit = UNIT_NAMES[unit_name][1]
+
+ return QString("%1 %2").arg(i18n_amount).arg(i18n_unit)
+
+
diff --git a/ui4/upgradedialog.py b/ui4/upgradedialog.py
new file mode 100644
index 0000000..c747ff3
--- /dev/null
+++ b/ui4/upgradedialog.py
@@ -0,0 +1,127 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2001-2011 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Authors: Amarnath Chitumalla
+#
+
+#Global
+import os
+import time
+
+# Local
+from base.g import *
+from base import device, utils, pkit
+from ui_utils import *
+
+# Qt
+from PyQt4.QtCore import *
+from PyQt4.QtGui import *
+
+# Ui
+from upgradedialog_base import Ui_Dialog
+
+MANUAL_INSTALL_LINK = "http://hplipopensource.com/hplip-web/install/manual/index.html"
+
+
+class UpgradeDialog(QDialog, Ui_Dialog):
+ def __init__(self, parent, distro_tier, msg):
+ QDialog.__init__(self, parent)
+ self.distro_tier = distro_tier
+ self.msg = msg
+ self.result = False
+ self.setupUi(self, distro_tier, msg)
+ self.initUi()
+
+
+ def initUi(self):
+ # connect signals/slots
+ self.connect(self.NextButton, SIGNAL("clicked()"), self.NextButton_clicked)
+ self.connect(self.CancelButton, SIGNAL("clicked()"), self.CancelButton_clicked)
+# self.connect (self.comboBox, SIGNAL ("currentIndexChanged (const QString&)"), self.slotIndexChanged)
+ self.connect(self.installRadioBtton, SIGNAL("toggled(bool)"), self.installRadioBtton_toggled)
+ self.connect(self.remindRadioBtton, SIGNAL("toggled(bool)"), self.remindRadioBtton_toggled)
+ self.connect(self.dontRemindRadioBtton, SIGNAL("toggled(bool)"), self.dontRemindRadioBtton_toggled)
+
+ # Application icon
+ self.setWindowIcon(QIcon(load_pixmap('hp_logo', '128x128')))
+
+
+ def installRadioBtton_toggled(self, radio_enabled):
+ if radio_enabled is True:
+ self.installRadioBtton.setChecked(True)
+ else:
+ self.installRadioBtton.setChecked(False)
+
+
+ def remindRadioBtton_toggled(self, radio_enabled):
+ if radio_enabled is True:
+ self.remindRadioBtton.setChecked(True)
+ self.daysSpinBox.setEnabled(True)
+ else:
+ self.remindRadioBtton.setChecked(False)
+ self.daysSpinBox.setEnabled(False)
+
+
+ def dontRemindRadioBtton_toggled(self, radio_enabled):
+ if radio_enabled is True:
+ self.dontRemindRadioBtton.setChecked(True)
+ else:
+ self.dontRemindRadioBtton.setChecked(False)
+
+
+ def NextButton_clicked (self):
+ if self.dontRemindRadioBtton.isChecked():
+ log.debug("HPLIP Upgrade, selected Don't remind again radiobutton")
+ user_conf.set('upgrade', 'notify_upgrade', 'false')
+ msg= "Check for HPLIP updates is disabled. To enable it again, change 'Settings' in 'HP systemtray' "
+ SuccessUI(self, self.__tr(msg))
+
+ elif self.remindRadioBtton.isChecked():
+ schedule_days = str(self.daysSpinBox.value())
+ log.debug("HPLIP Upgrade, selected remind later radiobutton days= %d" %(int(schedule_days)))
+ next_time = time.time() + (int(schedule_days) *24 * 60 *60)
+ user_conf.set('upgrade', 'pending_upgrade_time', str(int(next_time)))
+ else:
+ log.debug("HPLIP Upgrade, selected Install radiobutton distro_type=%d" %self.distro_tier)
+ self.NextButton.setEnabled(False)
+ if self.distro_tier != 1: # not tier 1 distro
+ log.debug("OK pressed for tier 2 distro pressed")
+ utils.openURL(MANUAL_INSTALL_LINK)
+
+ ## TBD::open browser
+ else:
+ terminal_cmd = utils.get_terminal()
+ if terminal_cmd is not None and utils.which("hp-upgrade"):
+ cmd = terminal_cmd + " 'hp-upgrade'"
+ log.debug("cmd = %s " %cmd)
+ os.system(cmd)
+ self.result = True
+ else:
+ log.error("Failed to run hp-upgrade command from terminal =%s "%terminal_cmd)
+ ErrorUI(self, self.__tr("Failed to run hp-upgrade"))
+
+ self.close()
+
+
+ def CancelButton_clicked(self):
+ log.debug("User exit")
+ self.close()
+
+ def __tr(self,s,c = None):
+ return qApp.translate("UpgradeDialog",s,c)
+
diff --git a/ui4/upgradedialog_base.py b/ui4/upgradedialog_base.py
new file mode 100644
index 0000000..2486f55
--- /dev/null
+++ b/ui4/upgradedialog_base.py
@@ -0,0 +1,62 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'upgradedialog_base.ui'
+#
+# Created: Thu Feb 9 18:16:03 2012
+# by: PyQt4 UI code generator 4.7.4
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt4 import QtCore, QtGui
+
+class Ui_Dialog(object):
+ def setupUi(self, Dialog, distro_tier,msg):
+ self.distro_tier = distro_tier
+ self.msg= msg
+ Dialog.setObjectName("Dialog")
+ Dialog.resize(369, 205)
+ self.centralwidget = QtGui.QWidget(Dialog)
+ self.centralwidget.setObjectName("centralwidget")
+ self.MainLabel = QtGui.QLabel(self.centralwidget)
+ self.MainLabel.setGeometry(QtCore.QRect(10, 10, 351, 51))
+ self.MainLabel.setObjectName("MainLabel")
+ self.installRadioBtton = QtGui.QRadioButton(self.centralwidget)
+ self.installRadioBtton.setGeometry(QtCore.QRect(10, 65, 350, 22))
+ self.installRadioBtton.setChecked(True)
+ self.installRadioBtton.setObjectName("installRadioBtton")
+ self.remindRadioBtton = QtGui.QRadioButton(self.centralwidget)
+ self.remindRadioBtton.setGeometry(QtCore.QRect(10, 96, 141, 22))
+ self.remindRadioBtton.setObjectName("remindRadioBtton")
+ self.dontRemindRadioBtton = QtGui.QRadioButton(self.centralwidget)
+ self.dontRemindRadioBtton.setGeometry(QtCore.QRect(10, 126, 161, 22))
+ self.dontRemindRadioBtton.setObjectName("dontRemindRadioBtton")
+ self.daysSpinBox = QtGui.QSpinBox(self.centralwidget)
+ self.daysSpinBox.setGeometry(QtCore.QRect(152, 94, 55, 27))
+ self.daysSpinBox.setMinimum(1)
+ self.daysSpinBox.setMaximum(365)
+ self.daysSpinBox.setEnabled(False)
+ self.daysSpinBox.setObjectName("daysSpinBox")
+ self.DaysLabel = QtGui.QLabel(self.centralwidget)
+ self.DaysLabel.setGeometry(QtCore.QRect(211, 98, 67, 21))
+ self.DaysLabel.setObjectName("DaysLabel")
+ self.CancelButton = QtGui.QPushButton(self.centralwidget)
+ self.CancelButton.setGeometry(QtCore.QRect(270, 160, 91, 31))
+ self.CancelButton.setObjectName("CancelButton")
+ self.NextButton = QtGui.QPushButton(self.centralwidget)
+ self.NextButton.setGeometry(QtCore.QRect(159, 160, 96, 31))
+ self.NextButton.setObjectName("NextButton")
+ self.retranslateUi(Dialog)
+ QtCore.QMetaObject.connectSlotsByName(Dialog)
+
+ def retranslateUi(self, Dialog):
+ Dialog.setWindowTitle(QtGui.QApplication.translate("Dialog", "HP Upgrade Manager", None, QtGui.QApplication.UnicodeUTF8))
+ self.MainLabel.setText(QtGui.QApplication.translate("Dialog", self.msg, None, QtGui.QApplication.UnicodeUTF8))
+ self.CancelButton.setText(QtGui.QApplication.translate("Dialog", "Cancel", None, QtGui.QApplication.UnicodeUTF8))
+ self.NextButton.setText(QtGui.QApplication.translate("Dialog", "Ok", None, QtGui.QApplication.UnicodeUTF8))
+ if self.distro_tier == 1:
+ self.installRadioBtton.setText(QtGui.QApplication.translate("Dialog", "Download and Install", None, QtGui.QApplication.UnicodeUTF8))
+ else:
+ self.installRadioBtton.setText(QtGui.QApplication.translate("Dialog", "Follow steps from www.hplip.net", None, QtGui.QApplication.UnicodeUTF8))
+ self.remindRadioBtton.setText(QtGui.QApplication.translate("Dialog", "Remind me after", None, QtGui.QApplication.UnicodeUTF8))
+ self.dontRemindRadioBtton.setText(QtGui.QApplication.translate("Dialog", "Don\'t remind again", None, QtGui.QApplication.UnicodeUTF8))
+ self.DaysLabel.setText(QtGui.QApplication.translate("Dialog", "days", None, QtGui.QApplication.UnicodeUTF8))
diff --git a/ui4/upgradedialog_base.ui b/ui4/upgradedialog_base.ui
new file mode 100644
index 0000000..1573752
--- /dev/null
+++ b/ui4/upgradedialog_base.ui
@@ -0,0 +1,143 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>MainWindow</class>
+ <widget class="QMainWindow" name="MainWindow">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>369</width>
+ <height>239</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>MainWindow</string>
+ </property>
+ <widget class="QWidget" name="centralwidget">
+ <widget class="QPushButton" name="pushButton_2">
+ <property name="geometry">
+ <rect>
+ <x>270</x>
+ <y>160</y>
+ <width>91</width>
+ <height>31</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>OK</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" name="pushButton">
+ <property name="geometry">
+ <rect>
+ <x>159</x>
+ <y>160</y>
+ <width>96</width>
+ <height>31</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>Cancel</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton" name="radioButton">
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>65</y>
+ <width>181</width>
+ <height>22</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>Download and Install</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton" name="radioButton_2">
+ <property name="geometry">
+ <rect>
+ <x>8</x>
+ <y>96</y>
+ <width>141</width>
+ <height>22</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>Remind me after</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton" name="radioButton_3">
+ <property name="geometry">
+ <rect>
+ <x>9</x>
+ <y>126</y>
+ <width>161</width>
+ <height>22</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>Don't remind again</string>
+ </property>
+ </widget>
+ <widget class="QSpinBox" name="spinBox">
+ <property name="geometry">
+ <rect>
+ <x>152</x>
+ <y>94</y>
+ <width>55</width>
+ <height>27</height>
+ </rect>
+ </property>
+ <property name="minimum">
+ <number>1</number>
+ </property>
+ <property name="maximum">
+ <number>365</number>
+ </property>
+ <property name="value">
+ <number>30</number>
+ </property>
+ </widget>
+ <widget class="QLabel" name="label">
+ <property name="geometry">
+ <rect>
+ <x>211</x>
+ <y>98</y>
+ <width>67</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>days</string>
+ </property>
+ </widget>
+ <widget class="QLabel" name="label_2">
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>10</y>
+ <width>351</width>
+ <height>51</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>New version of HPLIP-X.X.X is available.
+Do you want to install</string>
+ </property>
+ </widget>
+ </widget>
+ <widget class="QMenuBar" name="menubar">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>369</width>
+ <height>27</height>
+ </rect>
+ </property>
+ </widget>
+ <widget class="QStatusBar" name="statusbar"/>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/ui4/wifisetupdialog.py b/ui4/wifisetupdialog.py
new file mode 100644
index 0000000..95ea617
--- /dev/null
+++ b/ui4/wifisetupdialog.py
@@ -0,0 +1,839 @@
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2001-2009 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Authors: Don Welch
+#
+
+# StdLib
+import operator
+
+# Local
+from base.g import *
+from base import device, utils, models, wifi, LedmWifi
+from base.codes import *
+from ui_utils import *
+
+# Qt
+from PyQt4.QtCore import *
+from PyQt4.QtGui import *
+
+# Ui
+from wifisetupdialog_base import Ui_Dialog
+
+
+
+PAGE_INTRO = 0 # Ask user to plugin temp USB connection
+PAGE_DEVICES = 1 # Select a probed USB device
+PAGE_NETWORK = 2 # Select a discovered SSID
+PAGE_CONFIGURE_WIFI = 3 # Configure USB device on network
+PAGE_EXIT = 4 # Tell user if successful, unplug USB onnection
+
+
+BUTTON_NEXT = 0
+BUTTON_FINISH = 1
+BUTTON_CONNECT = 3
+
+SUCCESS_NOT_CONNECTED = 0
+SUCCESS_AUTO_IP = 1
+SUCCESS_CONNECTED = 2
+
+ASSOCIATE_DELAY = 30
+REFRESH_INTERVAL = 20
+
+
+class DeviceTableWidgetItem(QTableWidgetItem):
+ def __init__(self, text, device_uri):
+ QTableWidgetItem.__init__(self, text, QTableWidgetItem.UserType)
+ self.device_uri = device_uri
+
+
+class WifiSetupDialog(QDialog, Ui_Dialog):
+ def __init__(self, parent, device_uri=None, standalone=True):
+ QDialog.__init__(self, parent)
+ self.setupUi(self)
+
+ self.device_uri = device_uri
+ self.devices = {}
+ self.networks = {}
+ self.ssid = ''
+ self.directed = False
+ self.show_extended = False
+ self.bus = 'usb'
+ self.search = ''
+ self.max_page = PAGE_EXIT
+ self.location_cache = {} # { 'bssid' : <location>, ... }
+ self.dev = None
+ self.success = SUCCESS_NOT_CONNECTED
+ self.ip = '0.0.0.0'
+ self.hn = ''
+ self.standalone = standalone
+ self.initUi()
+ self.adapterName = 'Wifi0'
+ self.wifiObj = wifi
+
+ #if self.device_uri is None:
+ # QTimer.singleShot(0, self.showIntroPage)
+ #else:
+ # QTimer.singleShot(0, self.showNetworkPage)
+
+ QTimer.singleShot(0, self.showIntroPage)
+
+
+ #
+ # INIT
+ #
+
+ def initUi(self):
+ self.setWindowIcon(QIcon(load_pixmap('hp_logo', '128x128')))
+
+ # connect signals/slots
+ self.connect(self.CancelButton, SIGNAL("clicked()"), self.CancelButton_clicked)
+ self.connect(self.BackButton, SIGNAL("clicked()"), self.BackButton_clicked)
+ self.connect(self.NextButton, SIGNAL("clicked()"), self.NextButton_clicked)
+
+ self.initIntroPage()
+ self.initDevicesPage()
+ self.initNetworkPage()
+ self.initConfigWifiPage()
+ self.initExitPage()
+
+ #
+ # INTRO PAGE
+ #
+
+ def initIntroPage(self):
+ self.Picture.setPixmap(load_pixmap("usb_connection", "other"))
+ self.InfoIcon.setPixmap(load_pixmap("info", "16x16"))
+
+ if self.standalone:
+ self.MainTitleLabel.setText(self.__tr("""This utility allows you configure your wireless capable printer using a temporary USB connection. You will be prompted to disconnect the USB cable once wireless network setup is complete.
+
+<p><i>Note: This configuration utility does not setup (install) your printer on this computer. Use hp-setup to setup your printer after it has been configured on the network by this utility.</i></p>
+<p><i>Note: Only select wireless capable printers are supported by this utility.</i></p>"""))
+ else:
+ self.MainTitleLabel.setText(self.__tr("""This utility allows you configure your wireless capable printer using a temporary USB connection. You will be prompted to disconnect the USB cable once wireless network setup is complete.
+
+<p><i>Note: Printer setup (installation) will continue after your printer is configured on the network.</i></p>
+<p><i>Note: Only select wireless capable printers are supported by this utility.</i></p>"""))
+
+
+ def showIntroPage(self):
+ self.BackButton.setEnabled(False)
+ self.NextButton.setEnabled(True)
+
+ self.displayPage(PAGE_INTRO)
+
+
+ #
+ # DEVICES PAGE
+ #
+
+ def initDevicesPage(self):
+ self.connect(self.RefreshButton, SIGNAL("clicked()"), self.RefreshButton_clicked)
+
+
+ def showDevicesPage(self):
+ self.BackButton.setEnabled(True)
+ self.setNextButton(BUTTON_NEXT)
+
+ beginWaitCursor()
+ try:
+ if not self.devices:
+ log.info("Searching on USB bus...")
+ filter_dict = {'wifi-config' : (operator.gt, WIFI_CONFIG_NONE)}
+
+ self.devices = device.probeDevices([self.bus], 0, 0, filter_dict, self.search)
+ finally:
+ endWaitCursor()
+
+ self.clearDevicesTable()
+
+ if self.devices:
+ self.NextButton.setEnabled(True)
+ self.DevicesFoundIcon.setPixmap(load_pixmap('info', '16x16'))
+
+ if len(self.devices) == 1:
+ self.DevicesFoundLabel.setText(self.__tr("<b>1 wireless capable device found.</b> Click <i>Next</i> to continue."))
+ else:
+ self.DevicesFoundLabel.setText(self.__tr("<b>%1 wireless capable devices found.</b> Select the device to install and click <i>Next</i> to continue.").arg(len(self.devices)))
+
+ self.loadDevicesTable()
+
+ else:
+ self.NextButton.setEnabled(False)
+ self.DevicesFoundIcon.setPixmap(load_pixmap('error', '16x16'))
+ log.error("No devices found on bus: %s" % self.bus)
+ self.DevicesFoundLabel.setText(self.__tr("<b>No wireless capable devices found.</b><br>Plug in your printer with a USB cable and click <i>Refresh</i> to search again."))
+
+ self.displayPage(PAGE_DEVICES)
+
+
+ def loadDevicesTable(self):
+ self.DevicesTableWidget.setSortingEnabled(False)
+ self.DevicesTableWidget.setRowCount(len(self.devices))
+
+ headers = [self.__tr('Model'), self.__tr('Device URI')]
+ device_uri_col = 1
+
+ self.DevicesTableWidget.setColumnCount(len(headers))
+ self.DevicesTableWidget.setHorizontalHeaderLabels(headers)
+ flags = Qt.ItemIsSelectable | Qt.ItemIsEnabled
+
+ for row, d in enumerate(self.devices):
+ back_end, is_hp, bus, model, serial, dev_file, host, zc, port = device.parseDeviceURI(d)
+ model_ui = models.normalizeModelUIName(model)
+
+ i = DeviceTableWidgetItem(QString(model_ui), d)
+ i.setFlags(flags)
+ self.DevicesTableWidget.setItem(row, 0, i)
+
+ i = QTableWidgetItem(QString(d))
+ i.setFlags(flags)
+ self.DevicesTableWidget.setItem(row, device_uri_col, i)
+
+ self.DevicesTableWidget.resizeColumnsToContents()
+ self.DevicesTableWidget.setSortingEnabled(True)
+ self.DevicesTableWidget.sortItems(0)
+ self.DevicesTableWidget.selectRow(0)
+
+
+ def clearDevicesTable(self):
+ self.DevicesTableWidget.clear()
+ self.DevicesTableWidget.setRowCount(0)
+ self.DevicesTableWidget.setColumnCount(0)
+
+
+ def RefreshButton_clicked(self):
+ self.clearDevicesTable()
+ self.devices = []
+ QTimer.singleShot(0, self.showDevicesPage)
+
+
+ #
+ # NETWORK
+ #
+
+ def initNetworkPage(self):
+ self.NetworksTableWidget.setIconSize(QSize(34, 20))
+ self.ShowExtendedCheckBox.setChecked(False)
+ self.connect(self.ShowExtendedCheckBox, SIGNAL("clicked(bool)"), self.ShowExtendedCheckBox_clicked)
+ self.connect(self.SearchPushButton, SIGNAL("clicked()"), self.SearchPushButton_clicked)
+ self.connect(self.UndirectedRadioButton, SIGNAL("clicked(bool)"), self.UndirectedRadioButton_clicked)
+ self.connect(self.DirectedRadioButton, SIGNAL("clicked(bool)"), self.DirectedRadioButton_clicked)
+ self.connect(self.NetworksTableWidget, SIGNAL("itemSelectionChanged()"), self.NetworksTableWidget_itemSelectionChanged)
+
+
+ def showNetworkPage(self):
+ if self.dev is None:
+ try:
+ self.dev = device.Device(self.device_uri)
+ except Error, e:
+ FailureUI(self, self.__tr("<b>Error opening device:</b><p>%1</p><p>(%2)</p>").arg(self.device_uri).arg(QString(e[0])))
+
+ if self.dev is not None:
+ self.dev.close()
+
+ self.close()
+ return
+
+ self.networks.clear()
+ self.num_networks = 0
+
+ try:
+ self.adaptor_id, self.adapterName, state, presence = self.wifiObj.getWifiAdaptorID(self.dev)
+ except Error, e:
+ self.showIOError(e)
+ return
+
+ log.debug("Adaptor ID: %s" % self.adaptor_id)
+ log.debug("Adaptor name: %s" % self.adapterName)
+ log.debug("Adaptor state: %s" % state)
+ log.debug("Adaptor presence: %s" % presence)
+
+ if self.adaptor_id == -1:
+ FailureUI(self, self.__tr("<b>Unable to locate wireless hardware on device.</b>"))
+ if self.dev is not None:
+ self.dev.close()
+
+ self.close()
+
+ log.debug("Turning on wireless radio...")
+ try:
+ self.wifiObj.setAdaptorPower(self.dev, self.adapterName, self.adaptor_id)
+ except Error, e:
+ self.showIOError(e)
+ return
+
+ self.performScan()
+ self.setNextButton(BUTTON_NEXT)
+ self.displayPage(PAGE_NETWORK)
+
+
+ def performScan(self):
+ beginWaitCursor()
+ error = False
+ try:
+ self.ssid = unicode(self.SSIDLineEdit.text())
+ if self.directed and self.ssid:
+ try:
+ self.networks = self.wifiObj.performScan(self.dev, self.adapterName, self.ssid)
+ except Error, e:
+ self.showIOError(e)
+ return
+ else:
+ try:
+ self.networks = self.wifiObj.performScan(self.dev, self.adapterName)
+ except Error, e:
+ self.showIOError(e)
+ return
+ finally:
+ self.dev.close()
+ endWaitCursor()
+
+ self.num_networks = self.networks['numberofscanentries']
+ self.clearNetworksTable()
+
+ if self.num_networks:
+ self.NextButton.setEnabled(True)
+ self.NetworksFoundIcon.setPixmap(load_pixmap('info', '16x16'))
+
+ if self.num_networks == 1:
+ self.NetworksFoundLabel.setText(self.__tr("<b>1 wireless network found. </b> If the wireless network you would like to connect to is not listed, try entering a wireless network name and/or press <i>Search</i> to search again."))
+ else:
+ self.NetworksFoundLabel.setText(self.__tr("<b>%1 wireless networks found.</b> If the wireless network you would like to connect to is not listed, try entering a wireless network name and/or press <i>Search</i> to search again.").arg(self.num_networks))
+
+ self.loadNetworksTable()
+
+ else:
+ self.NextButton.setEnabled(False)
+ self.NetworksFoundIcon.setPixmap(load_pixmap('error', '16x16'))
+ log.warning("No wireless networks found.")
+ self.NetworksFoundLabel.setText(self.__tr("<b>No wireless networks found.</b><br>Enter a wireless network name and/or press <i>Search</i> to search again."))
+
+
+ def ShowExtendedCheckBox_clicked(self, b):
+ self.show_extended = b
+ self.loadNetworksTable()
+
+
+ def SearchPushButton_clicked(self):
+ self.performScan()
+ self.loadNetworksTable()
+
+
+ def UndirectedRadioButton_clicked(self, b):
+ self.directed = not b
+ self.SSIDLineEdit.setEnabled(not b)
+
+
+ def DirectedRadioButton_clicked(self, b):
+ self.directed = b
+ self.SSIDLineEdit.setEnabled(b)
+
+
+ def loadNetworksTable(self):
+ self.n, self.network = 0, u''
+ if self.num_networks:
+ beginWaitCursor()
+ try:
+ if self.show_extended:
+ for n in xrange(self.num_networks):
+ bssid = self.networks['bssid-%d' % n]
+ ss = self.networks['signalstrength-%d' % n]
+ try:
+ self.location_cache[bssid]
+ except KeyError:
+ location = wifi.getLocation(bssid, ss)
+ lat = self.networks['latitude-%d' % n] = location.get('latitude', 'Unknown')
+ lng = self.networks['longitude-%d' % n] = location.get('longitude', 'Unknown')
+ address = self.networks['address-%d' % n] = location.get('address', 'Unknown')
+ self.location_cache[bssid] = (lat, lng, address)
+ else:
+ self.networks['latitude-%d' % n], self.networks['longitude-%d' % n], self.networks['address-%d' % n] = \
+ self.location_cache[bssid]
+
+ self.NetworksTableWidget.setSortingEnabled(False)
+ self.NetworksTableWidget.setRowCount(self.num_networks)
+
+ headers = [self.__tr('Network Name (SSID)'), self.__tr('Signal Strength'),
+ self.__tr("Security"), self.__tr("Mode")]
+
+ if self.show_extended:
+ headers.extend([self.__tr('Channel'),
+ self.__tr("Address (BSSID)"), self.__tr("Location"),
+ self.__tr("Lat/Long")])
+
+ self.NetworksTableWidget.setColumnCount(len(headers))
+ self.NetworksTableWidget.setHorizontalHeaderLabels(headers)
+ enabled_flags = Qt.ItemIsSelectable | Qt.ItemIsEnabled
+
+ for n in xrange(self.num_networks):
+ name = self.networks['ssid-%d' % n]
+
+ if name == '(unknown)':
+ flags = None
+ else:
+ flags = enabled_flags
+
+ ss = self.networks['signalstrength-%d' % n]
+ sec = self.networks['encryptiontype-%d' % n]
+ mode = self.networks['communicationmode-%d' % n]
+
+ log.debug("%d: Name=%s, strength=%s, security=%s, mode=%s" % #, channel=%d bssid=%s" %
+ (n, name, ss, sec, mode))
+
+ if self.show_extended:
+ chn = self.networks['channel-%d' % n]
+ dbm = self.networks['dbm-%d' % n]
+ bssid = self.networks['bssid-%d' % n]
+ address = self.networks['address-%d' % n]
+ lat = self.networks['latitude-%d' % n]
+ lng = self.networks['longitude-%d' % n]
+
+ log.debug("%d: channel=%d bssid=%s dbm=%s lat=%s long=%s address=%s" %
+ (n, chn, bssid, dbm, lat, lng, address))
+
+ i = QTableWidgetItem(QString(name))
+ if flags is not None: i.setFlags(flags)
+ i.setData(Qt.UserRole, QVariant(n))
+ self.NetworksTableWidget.setItem(n, 0, i)
+
+ pixmap = load_pixmap('signal%d' % ss, 'other')
+ if self.show_extended:
+ i = QTableWidgetItem(QIcon(pixmap), self.__tr("%1/5 (%2 dBm)").arg(ss).arg(dbm))
+ else:
+ i = QTableWidgetItem(QIcon(pixmap), self.__tr("%1/5").arg(ss))
+ if flags is not None: i.setFlags(flags)
+ self.NetworksTableWidget.setItem(n, 1, i)
+
+ i = QTableWidgetItem(QString(sec))
+ if flags is not None: i.setFlags(flags)
+ self.NetworksTableWidget.setItem(n, 2, i)
+
+ i = QTableWidgetItem(QString(mode))
+ if flags is not None: i.setFlags(flags)
+ self.NetworksTableWidget.setItem(n, 3, i)
+
+ if self.show_extended:
+ i = QTableWidgetItem(QString(str(chn)))
+ if flags is not None: i.setFlags(flags)
+ self.NetworksTableWidget.setItem(n, 4, i)
+
+ i = QTableWidgetItem(QString(bssid))
+ if flags is not None: i.setFlags(flags)
+ self.NetworksTableWidget.setItem(n, 5, i)
+
+ i = QTableWidgetItem(QString(address))
+ if flags is not None: i.setFlags(flags)
+ self.NetworksTableWidget.setItem(n, 6, i)
+
+ i = QTableWidgetItem(QString("%1/%2").arg(lat).arg(lng))
+ if flags is not None: i.setFlags(flags)
+ self.NetworksTableWidget.setItem(n, 7, i)
+
+
+ self.NetworksTableWidget.resizeColumnsToContents()
+ self.NetworksTableWidget.setSortingEnabled(True)
+ self.NetworksTableWidget.sortItems(1, Qt.DescendingOrder)
+ self.NetworksTableWidget.selectRow(0)
+ self.NetworksTableWidget.emit(SIGNAL("itemSelectionChanged()"))
+
+ finally:
+ endWaitCursor()
+ self.NextButton.setEnabled(True)
+
+ else:
+ self.NextButton.setEnabled(False)
+
+
+ def NetworksTableWidget_itemSelectionChanged(self):
+ row = self.NetworksTableWidget.currentRow()
+ item = self.NetworksTableWidget.item(row, 0)
+ n, ok = item.data(Qt.UserRole).toInt()
+ if ok:
+ sec = self.networks['encryptiontype-%d' % n]
+ if sec.lower() == 'none':
+ self.setNextButton(BUTTON_CONNECT)
+ else:
+ self.setNextButton(BUTTON_NEXT)
+
+
+ def clearNetworksTable(self):
+ self.DevicesTableWidget.clear()
+ self.DevicesTableWidget.setRowCount(0)
+ self.DevicesTableWidget.setColumnCount(0)
+
+
+ def RefreshButton2_clicked(self):
+ self.clearNetworksTable()
+ self.networks = {}
+ QTimer.singleShot(0, self.showNetworkPage)
+
+
+ #
+ # CONFIGURE WIFI
+ #
+
+ def initConfigWifiPage(self):
+ self.connect(self.ShowKeyCheckBox, SIGNAL("toggled(bool)"), self.ShowKeyCheckBox_toggled)
+
+
+ def showConfigWifiPage(self):
+ self.setNextButton(BUTTON_CONNECT)
+ self.SSIDLabel.setText(self.network)
+ font = QFont()
+ font.setPointSize(12)
+ self.SSIDLabel.setFont(font)
+ self.KeyLineEdit.setText(QString())
+ self.ShowKeyCheckBox.setChecked(False)
+ self.StrengthIcon.setPixmap(load_pixmap('signal%d' % self.ss, 'other'))
+ self.ConfigureIcon.setPixmap(load_pixmap('info', '16x16'))
+ self.KeysIcon.setPixmap(load_pixmap('keys', '32x32'))
+
+ if 'wpa' in self.security.lower():
+ self.WPARadioButton.setChecked(True)
+
+ elif 'wep' in self.security.lower():
+ self.WEPRadioButton.setChecked(True)
+
+ self.KeyLineEdit.setFocus()
+ self.KeyLineEdit.setEchoMode(QLineEdit.Password)
+ self.displayPage(PAGE_CONFIGURE_WIFI)
+
+
+ def ShowKeyCheckBox_toggled(self, b):
+ if b:
+ self.KeyLineEdit.setEchoMode(QLineEdit.Normal)
+ else:
+ self.KeyLineEdit.setEchoMode(QLineEdit.Password)
+
+
+ #
+ # EXIT/CONNECT PAGE
+ #
+
+ def initExitPage(self):
+ self.connect(self.PageSpinBox, SIGNAL("valueChanged(int)"), self.PageSpinBox_valueChanged)
+ self.RefreshTimer = QTimer(self)
+ self.connect(self.RefreshTimer, SIGNAL('timeout()'), self.RefreshTimer_timeout)
+ self.pages = []
+ self.page_index = 0
+ self.PageSpinBox.setMinimum(1)
+
+
+ def showExitPage(self):
+ self.setNextButton(BUTTON_FINISH)
+ self.NextButton.setEnabled(False)
+ self.CancelButton.setEnabled(True)
+ self.SSIDLabel_2.setText(QString(self.network))
+ self.ip = '0.0.0.0'
+ self.hn = ''
+ self.success = SUCCESS_NOT_CONNECTED
+
+ beginWaitCursor()
+ try:
+ try:
+ self.ip,_,addressmode, subnetmask, gateway, pridns, sec_dns= self.wifiObj.getIPConfiguration(self.dev, self.adapterName)
+ vsa_codes = self.wifiObj.getVSACodes(self.dev, self.adapterName)
+ ss_max, ss_min, ss_val, ss_dbm = self.wifiObj.getSignalStrength(self.dev, self.adapterName,self.network, self.adaptor_id)
+ self.hn = self.wifiObj.getHostname(self.dev)
+ except Error, e:
+ self.showIOError(e)
+ return
+ finally:
+ self.dev.close()
+ endWaitCursor()
+
+ if addressmode.lower() == 'dhcp':
+ self.success = SUCCESS_CONNECTED
+
+ elif addressmode.lower() == 'autoip':
+ self.success = SUCCESS_AUTO_IP
+
+ if self.ip == '0.0.0.0':
+ self.success = SUCCESS_NOT_CONNECTED
+
+ self.pages = []
+
+ if self.success == SUCCESS_NOT_CONNECTED:
+ self.pages.append((self.__tr("<b>Your printer has not been connected to the wireless network.</b> A valid connection to a wireless network can take up to 2 minutes. This screen will automatically refresh every %1 seconds.<p>If your printer fails to connect within a reasonable time, there may be a problem with your configuration.").arg(REFRESH_INTERVAL), load_pixmap('error', '16x16')))
+ self.RefreshTimer.start(REFRESH_INTERVAL * 1000)
+
+ elif self.success == SUCCESS_AUTO_IP:
+ self.pages.append((self.__tr("Your printer has been connected to the wireless network, but it has been assigned an address which may not be usable."), load_pixmap('warning', '16x16')))
+ self.RefreshTimer.start(REFRESH_INTERVAL * 1000)
+
+ else: # SUCCESS_CONNECTED
+ if self.standalone:
+ self.pages.append((self.__tr("Your printer has been successfully configured on the wireless network. You may now unplug the USB cable. To setup the printer, now run <pre>hp-setup.</pre>"), load_pixmap('info', '16x16')))
+ else:
+ self.pages.append((self.__tr("Your printer has been successfully configured on the wireless network. You may now unplug the USB cable."), load_pixmap('info', '16x16')))
+ self.CancelButton.setEnabled(False)
+ self.BackButton.setEnabled(False)
+ self.RefreshTimer.stop()
+
+ if addressmode is None:
+ self.AddressModeLabel.setText(self.__tr("Unknown"))
+ else:
+ self.AddressModeLabel.setText(QString(addressmode))
+
+ if self.hn is None:
+ self.HostnameLabel.setText(self.__tr("Unknown"))
+ else:
+ self.HostnameLabel.setText(QString(self.hn))
+
+ self.IPAddressLabel.setText(QString(self.ip))
+ self.GatewayLabel.setText(QString(gateway))
+ self.DNSLabel.setText(QString(pridns))
+ self.NextButton.setEnabled(True)
+
+ self.SignalStrengthLabel.setText(QString("%1/%2 (%3 dBm)").arg(ss_val).arg(ss_max).arg(ss_dbm))
+ self.SignalStrengthIcon.setPixmap(load_pixmap('signal%d' % ss_val, 'other'))
+
+ for c, s in vsa_codes:
+ ss = s.lower()
+ if ss.startswith("info"):
+ pixmap = load_pixmap('info', '16x16')
+
+ elif ss.startswith("warn"):
+ pixmap = load_pixmap('warning', '16x16')
+
+ elif ss.startswith("crit"):
+ pixmap = load_pixmap('error', '16x16')
+
+ else:
+ pixmap = load_pixmap('info', '16x16')
+
+ self.pages.append((device.queryString("vsa_%s" % str(c).zfill(3)), pixmap))
+
+ num_pages = len(self.pages)
+ self.PageSpinBox.setMaximum(num_pages)
+ self.PageSpinBox.setEnabled(num_pages>1)
+ self.PageSpinBox.setValue(1)
+ self.PageLabel.setEnabled(num_pages>1)
+ self.PageLabel2.setEnabled(num_pages>1)
+ self.PageLabel.setText(self.__tr("of %1").arg(num_pages))
+ self.page_index = 0
+ self.ExitLabel.setText(self.pages[self.page_index][0])
+ self.ExitIcon.setPixmap(self.pages[self.page_index][1])
+ self.displayPage(PAGE_EXIT)
+
+
+ def PageSpinBox_valueChanged(self, i):
+ self.page_index = i-1
+ self.ExitLabel.setText(self.pages[self.page_index][0])
+ self.ExitIcon.setPixmap(self.pages[self.page_index][1])
+
+
+ def RefreshTimer_timeout(self):
+ self.showExitPage()
+
+
+ #
+ # ASSOCIATE
+ #
+
+ def associate(self, key=u''):
+ beginWaitCursor()
+ try:
+ try:
+ alg, mode, secretid = self.wifiObj.getCryptoSuite(self.dev, self.adapterName)
+ except Error, e:
+ self.showIOError(e)
+ return
+
+ log.debug("Crypto algorithm: %s" % alg)
+ log.debug("Crypto mode: %s" % mode)
+ finally:
+ endWaitCursor()
+
+ beginWaitCursor()
+ try:
+ try:
+ ret = self.wifiObj.associate(self.dev, self.adapterName, self.network, self.mode, self.security, key)
+ except Error, e:
+ self.showIOError(e)
+ return
+ finally:
+ endWaitCursor()
+
+
+ #
+ # Misc
+ #
+
+ def NextButton_clicked(self):
+ p = self.StackedWidget.currentIndex()
+ if p == PAGE_INTRO:
+ self.showDevicesPage()
+
+ elif p == PAGE_DEVICES:
+ row = self.DevicesTableWidget.currentRow()
+ if row != -1:
+ self.device_uri = self.DevicesTableWidget.item(row, 0).device_uri
+ self.mq = device.queryModelByURI(self.device_uri)
+
+ self.getWifiObject(self.mq['wifi-config'])
+ back_end, is_hp, bus, model, serial, dev_file, host, zc, port = device.parseDeviceURI(self.device_uri)
+ self.model = models.normalizeModelName(model).lower()
+
+ self.showNetworkPage()
+
+ elif p == PAGE_NETWORK:
+ self.security = 'None'
+ self.mode = 'Infrastructure'
+ self.ss = 0
+ row = self.NetworksTableWidget.currentRow()
+ if row != -1:
+ i = self.NetworksTableWidget.item(row, 0)
+ if i is not None:
+ self.network = unicode(i.text())
+ log.debug("Selected network SSID: %s" % self.network)
+ self.n, ok = i.data(Qt.UserRole).toInt()
+ if ok:
+ self.security = self.networks['encryptiontype-%d' % self.n]
+ log.debug("Security: %s" % self.security)
+
+ self.mode = self.networks['communicationmode-%d' % self.n]
+ log.debug("Mode: %s" % self.mode)
+
+ self.ss = self.networks['signalstrength-%d' % self.n]
+ log.debug("Signal strength: %s" % self.ss)
+
+ if self.security.lower() != 'none':
+ self.showConfigWifiPage()
+ else:
+ # Skip config page if no security to setup
+ self.associate()
+ self.showAssociateProgressDialog()
+ self.showExitPage()
+
+ elif p == PAGE_CONFIGURE_WIFI:
+ key = unicode(self.KeyLineEdit.text())
+ self.associate(key)
+ self.showAssociateProgressDialog()
+ self.showExitPage()
+
+ elif p == PAGE_EXIT:
+ if self.dev is not None:
+ self.dev.close()
+
+ self.close()
+
+ else:
+ log.error("Invalid page!") # shouldn't happen!
+
+
+ def showAssociateProgressDialog(self):
+ AssociateProgressDialog = QProgressDialog(self.__tr("Waiting for printer to connect to the wireless network..."), self.__tr("Cancel"), 0, ASSOCIATE_DELAY, self)
+ AssociateProgressDialog.setWindowTitle(self.__tr("HP Device Manager - Please wait..."))
+ AssociateProgressDialog.setWindowModality(Qt.WindowModal)
+ AssociateProgressDialog.setMinimumDuration(0)
+ AssociateProgressDialog.forceShow()
+ canceled = False
+ for x in range(ASSOCIATE_DELAY):
+ AssociateProgressDialog.setValue(x)
+ QThread.sleep(1)
+ qApp.processEvents()
+
+ if AssociateProgressDialog.wasCanceled():
+ canceled = True
+ break
+
+ AssociateProgressDialog.setValue(ASSOCIATE_DELAY)
+ AssociateProgressDialog.close()
+
+ if canceled:
+ if self.dev is not None:
+ self.dev.close()
+
+ self.close()
+
+
+ def BackButton_clicked(self):
+ p = self.StackedWidget.currentIndex()
+ if p == PAGE_DEVICES:
+ self.devices = {}
+ self.showIntroPage()
+
+ elif p == PAGE_NETWORK:
+ self.showDevicesPage()
+
+ elif p == PAGE_CONFIGURE_WIFI:
+ self.showNetworkPage()
+
+ elif p == PAGE_EXIT:
+ self.RefreshTimer.stop()
+ if self.security.lower() != 'none':
+ self.showConfigWifiPage()
+ else:
+ self.showNetworkPage()
+
+ else:
+ log.error("Invalid page!") # shouldn't happen!
+
+
+ def CancelButton_clicked(self):
+ if self.dev is not None:
+ self.dev.close()
+
+ self.close()
+
+
+ def displayPage(self, page):
+ self.StackedWidget.setCurrentIndex(page)
+ self.updateStepText(page)
+
+
+ def setNextButton(self, typ=BUTTON_FINISH):
+ if typ == BUTTON_NEXT:
+ self.NextButton.setText(self.__tr("Next >"))
+
+ elif typ == BUTTON_FINISH:
+ self.NextButton.setText(self.__tr("Finish"))
+
+ elif typ == BUTTON_CONNECT:
+ self.NextButton.setText(self.__tr("Connect"))
+
+
+ def updateStepText(self, p):
+ self.StepText.setText(self.__tr("Step %1 of %2").arg(p+1).arg(self.max_page+1))
+
+
+ def showIOError(self, e):
+ FailureUI(self, self.__tr("<b>An I/O error occurred.</b><p>Please check the USB connection to your printer and try again.</p>(%1)").arg(QString(e[0])))
+
+ if self.dev is not None:
+ self.dev.close()
+
+ self.close()
+
+
+ def __tr(self,s,c = None):
+ return qApp.translate("WifiSetupDialog",s,c)
+
+ # The Wifi object here is not actual object, Dynamically relevant modules are selected based on
+ # wifi-config value in the models file.
+ def getWifiObject(self,wifiConfVal):
+ if wifiConfVal == WIFI_CONFIG_LEDM:
+ self.wifiObj = LedmWifi
+ else:
+ self.wifiObj = wifi
+
+
+
diff --git a/ui4/wifisetupdialog_base.py b/ui4/wifisetupdialog_base.py
new file mode 100644
index 0000000..868404c
--- /dev/null
+++ b/ui4/wifisetupdialog_base.py
@@ -0,0 +1,722 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'ui4/wifisetupdialog_base.ui'
+#
+# Created: Thu May 28 11:00:20 2009
+# by: PyQt4 UI code generator 4.3.3
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt4 import QtCore, QtGui
+
+class Ui_Dialog(object):
+ def setupUi(self, Dialog):
+ Dialog.setObjectName("Dialog")
+ Dialog.setWindowModality(QtCore.Qt.ApplicationModal)
+ Dialog.resize(QtCore.QSize(QtCore.QRect(0,0,700,500).size()).expandedTo(Dialog.minimumSizeHint()))
+
+ self.gridlayout = QtGui.QGridLayout(Dialog)
+ self.gridlayout.setObjectName("gridlayout")
+
+ self.StackedWidget = QtGui.QStackedWidget(Dialog)
+ self.StackedWidget.setFrameShape(QtGui.QFrame.NoFrame)
+ self.StackedWidget.setObjectName("StackedWidget")
+
+ self.DiscoveryPage = QtGui.QWidget()
+ self.DiscoveryPage.setObjectName("DiscoveryPage")
+
+ self.gridlayout1 = QtGui.QGridLayout(self.DiscoveryPage)
+ self.gridlayout1.setObjectName("gridlayout1")
+
+ self.label = QtGui.QLabel(self.DiscoveryPage)
+
+ font = QtGui.QFont()
+ font.setPointSize(16)
+ self.label.setFont(font)
+ self.label.setObjectName("label")
+ self.gridlayout1.addWidget(self.label,0,0,1,3)
+
+ self.line = QtGui.QFrame(self.DiscoveryPage)
+ self.line.setFrameShape(QtGui.QFrame.HLine)
+ self.line.setFrameShadow(QtGui.QFrame.Sunken)
+ self.line.setObjectName("line")
+ self.gridlayout1.addWidget(self.line,1,0,1,3)
+
+ self.MainTitleLabel = QtGui.QLabel(self.DiscoveryPage)
+ self.MainTitleLabel.setTextFormat(QtCore.Qt.RichText)
+ self.MainTitleLabel.setWordWrap(True)
+ self.MainTitleLabel.setObjectName("MainTitleLabel")
+ self.gridlayout1.addWidget(self.MainTitleLabel,2,0,1,3)
+
+ spacerItem = QtGui.QSpacerItem(20,40,QtGui.QSizePolicy.Minimum,QtGui.QSizePolicy.Expanding)
+ self.gridlayout1.addItem(spacerItem,3,1,1,1)
+
+ spacerItem1 = QtGui.QSpacerItem(40,20,QtGui.QSizePolicy.Expanding,QtGui.QSizePolicy.Minimum)
+ self.gridlayout1.addItem(spacerItem1,4,0,1,1)
+
+ self.Picture = QtGui.QLabel(self.DiscoveryPage)
+
+ sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed,QtGui.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.Picture.sizePolicy().hasHeightForWidth())
+ self.Picture.setSizePolicy(sizePolicy)
+ self.Picture.setMinimumSize(QtCore.QSize(396,128))
+ self.Picture.setMaximumSize(QtCore.QSize(396,128))
+ self.Picture.setObjectName("Picture")
+ self.gridlayout1.addWidget(self.Picture,4,1,1,1)
+
+ spacerItem2 = QtGui.QSpacerItem(40,20,QtGui.QSizePolicy.Expanding,QtGui.QSizePolicy.Minimum)
+ self.gridlayout1.addItem(spacerItem2,4,2,1,1)
+
+ spacerItem3 = QtGui.QSpacerItem(664,61,QtGui.QSizePolicy.Minimum,QtGui.QSizePolicy.Expanding)
+ self.gridlayout1.addItem(spacerItem3,5,0,1,3)
+
+ self.hboxlayout = QtGui.QHBoxLayout()
+ self.hboxlayout.setObjectName("hboxlayout")
+
+ self.InfoIcon = QtGui.QLabel(self.DiscoveryPage)
+
+ sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed,QtGui.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.InfoIcon.sizePolicy().hasHeightForWidth())
+ self.InfoIcon.setSizePolicy(sizePolicy)
+ self.InfoIcon.setMinimumSize(QtCore.QSize(16,16))
+ self.InfoIcon.setMaximumSize(QtCore.QSize(16,16))
+ self.InfoIcon.setObjectName("InfoIcon")
+ self.hboxlayout.addWidget(self.InfoIcon)
+
+ self.label_14 = QtGui.QLabel(self.DiscoveryPage)
+ self.label_14.setWordWrap(True)
+ self.label_14.setObjectName("label_14")
+ self.hboxlayout.addWidget(self.label_14)
+ self.gridlayout1.addLayout(self.hboxlayout,6,0,1,3)
+ self.StackedWidget.addWidget(self.DiscoveryPage)
+
+ self.page_2 = QtGui.QWidget()
+ self.page_2.setObjectName("page_2")
+
+ self.gridlayout2 = QtGui.QGridLayout(self.page_2)
+ self.gridlayout2.setObjectName("gridlayout2")
+
+ self.label_4 = QtGui.QLabel(self.page_2)
+
+ font = QtGui.QFont()
+ font.setPointSize(16)
+ self.label_4.setFont(font)
+ self.label_4.setObjectName("label_4")
+ self.gridlayout2.addWidget(self.label_4,0,0,1,2)
+
+ self.line_2 = QtGui.QFrame(self.page_2)
+ self.line_2.setFrameShape(QtGui.QFrame.HLine)
+ self.line_2.setFrameShadow(QtGui.QFrame.Sunken)
+ self.line_2.setObjectName("line_2")
+ self.gridlayout2.addWidget(self.line_2,1,0,1,3)
+
+ self.DevicesTableWidget = QtGui.QTableWidget(self.page_2)
+ self.DevicesTableWidget.setAlternatingRowColors(True)
+ self.DevicesTableWidget.setSelectionMode(QtGui.QAbstractItemView.SingleSelection)
+ self.DevicesTableWidget.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows)
+ self.DevicesTableWidget.setSortingEnabled(False)
+ self.DevicesTableWidget.setObjectName("DevicesTableWidget")
+ self.gridlayout2.addWidget(self.DevicesTableWidget,2,0,1,3)
+
+ self.hboxlayout1 = QtGui.QHBoxLayout()
+ self.hboxlayout1.setObjectName("hboxlayout1")
+
+ self.DevicesFoundIcon = QtGui.QLabel(self.page_2)
+
+ sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed,QtGui.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.DevicesFoundIcon.sizePolicy().hasHeightForWidth())
+ self.DevicesFoundIcon.setSizePolicy(sizePolicy)
+ self.DevicesFoundIcon.setMinimumSize(QtCore.QSize(16,16))
+ self.DevicesFoundIcon.setMaximumSize(QtCore.QSize(16,16))
+ self.DevicesFoundIcon.setFrameShape(QtGui.QFrame.NoFrame)
+ self.DevicesFoundIcon.setObjectName("DevicesFoundIcon")
+ self.hboxlayout1.addWidget(self.DevicesFoundIcon)
+
+ self.DevicesFoundLabel = QtGui.QLabel(self.page_2)
+
+ sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding,QtGui.QSizePolicy.Preferred)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.DevicesFoundLabel.sizePolicy().hasHeightForWidth())
+ self.DevicesFoundLabel.setSizePolicy(sizePolicy)
+ self.DevicesFoundLabel.setWordWrap(True)
+ self.DevicesFoundLabel.setObjectName("DevicesFoundLabel")
+ self.hboxlayout1.addWidget(self.DevicesFoundLabel)
+ self.gridlayout2.addLayout(self.hboxlayout1,3,0,1,1)
+
+ spacerItem4 = QtGui.QSpacerItem(21,28,QtGui.QSizePolicy.Preferred,QtGui.QSizePolicy.Minimum)
+ self.gridlayout2.addItem(spacerItem4,3,1,1,1)
+
+ self.RefreshButton = QtGui.QPushButton(self.page_2)
+ self.RefreshButton.setObjectName("RefreshButton")
+ self.gridlayout2.addWidget(self.RefreshButton,3,2,1,1)
+ self.StackedWidget.addWidget(self.page_2)
+
+ self.page_3 = QtGui.QWidget()
+ self.page_3.setObjectName("page_3")
+
+ self.gridlayout3 = QtGui.QGridLayout(self.page_3)
+ self.gridlayout3.setObjectName("gridlayout3")
+
+ self.label_5 = QtGui.QLabel(self.page_3)
+
+ font = QtGui.QFont()
+ font.setPointSize(16)
+ self.label_5.setFont(font)
+ self.label_5.setObjectName("label_5")
+ self.gridlayout3.addWidget(self.label_5,0,0,1,1)
+
+ self.line_3 = QtGui.QFrame(self.page_3)
+ self.line_3.setFrameShape(QtGui.QFrame.HLine)
+ self.line_3.setFrameShadow(QtGui.QFrame.Sunken)
+ self.line_3.setObjectName("line_3")
+ self.gridlayout3.addWidget(self.line_3,1,0,1,1)
+
+ self.groupBox_3 = QtGui.QGroupBox(self.page_3)
+ self.groupBox_3.setObjectName("groupBox_3")
+
+ self.gridlayout4 = QtGui.QGridLayout(self.groupBox_3)
+ self.gridlayout4.setObjectName("gridlayout4")
+
+ self.UndirectedRadioButton = QtGui.QRadioButton(self.groupBox_3)
+ self.UndirectedRadioButton.setChecked(True)
+ self.UndirectedRadioButton.setObjectName("UndirectedRadioButton")
+ self.gridlayout4.addWidget(self.UndirectedRadioButton,0,0,1,3)
+
+ self.DirectedRadioButton = QtGui.QRadioButton(self.groupBox_3)
+ self.DirectedRadioButton.setObjectName("DirectedRadioButton")
+ self.gridlayout4.addWidget(self.DirectedRadioButton,1,0,1,2)
+
+ self.SSIDLineEdit = QtGui.QLineEdit(self.groupBox_3)
+ self.SSIDLineEdit.setEnabled(False)
+ self.SSIDLineEdit.setObjectName("SSIDLineEdit")
+ self.gridlayout4.addWidget(self.SSIDLineEdit,1,2,1,1)
+
+ self.SearchPushButton = QtGui.QPushButton(self.groupBox_3)
+
+ sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Maximum,QtGui.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.SearchPushButton.sizePolicy().hasHeightForWidth())
+ self.SearchPushButton.setSizePolicy(sizePolicy)
+ self.SearchPushButton.setObjectName("SearchPushButton")
+ self.gridlayout4.addWidget(self.SearchPushButton,2,0,1,1)
+
+ spacerItem5 = QtGui.QSpacerItem(521,20,QtGui.QSizePolicy.Expanding,QtGui.QSizePolicy.Minimum)
+ self.gridlayout4.addItem(spacerItem5,2,1,1,2)
+ self.gridlayout3.addWidget(self.groupBox_3,2,0,1,1)
+
+ self.SelectSSIDGroupBox = QtGui.QGroupBox(self.page_3)
+ self.SelectSSIDGroupBox.setCheckable(False)
+ self.SelectSSIDGroupBox.setObjectName("SelectSSIDGroupBox")
+
+ self.gridlayout5 = QtGui.QGridLayout(self.SelectSSIDGroupBox)
+ self.gridlayout5.setObjectName("gridlayout5")
+
+ spacerItem6 = QtGui.QSpacerItem(421,20,QtGui.QSizePolicy.Expanding,QtGui.QSizePolicy.Minimum)
+ self.gridlayout5.addItem(spacerItem6,0,0,1,2)
+
+ self.ShowExtendedCheckBox = QtGui.QCheckBox(self.SelectSSIDGroupBox)
+
+ sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Maximum,QtGui.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.ShowExtendedCheckBox.sizePolicy().hasHeightForWidth())
+ self.ShowExtendedCheckBox.setSizePolicy(sizePolicy)
+ self.ShowExtendedCheckBox.setObjectName("ShowExtendedCheckBox")
+ self.gridlayout5.addWidget(self.ShowExtendedCheckBox,0,2,1,1)
+
+ self.NetworksTableWidget = QtGui.QTableWidget(self.SelectSSIDGroupBox)
+ self.NetworksTableWidget.setAlternatingRowColors(True)
+ self.NetworksTableWidget.setSelectionMode(QtGui.QAbstractItemView.SingleSelection)
+ self.NetworksTableWidget.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows)
+ self.NetworksTableWidget.setVerticalScrollMode(QtGui.QAbstractItemView.ScrollPerItem)
+ self.NetworksTableWidget.setHorizontalScrollMode(QtGui.QAbstractItemView.ScrollPerPixel)
+ self.NetworksTableWidget.setObjectName("NetworksTableWidget")
+ self.gridlayout5.addWidget(self.NetworksTableWidget,1,0,1,3)
+
+ self.NetworksFoundIcon = QtGui.QLabel(self.SelectSSIDGroupBox)
+
+ sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed,QtGui.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.NetworksFoundIcon.sizePolicy().hasHeightForWidth())
+ self.NetworksFoundIcon.setSizePolicy(sizePolicy)
+ self.NetworksFoundIcon.setMinimumSize(QtCore.QSize(16,16))
+ self.NetworksFoundIcon.setMaximumSize(QtCore.QSize(16,16))
+ self.NetworksFoundIcon.setFrameShape(QtGui.QFrame.NoFrame)
+ self.NetworksFoundIcon.setObjectName("NetworksFoundIcon")
+ self.gridlayout5.addWidget(self.NetworksFoundIcon,2,0,1,1)
+
+ self.NetworksFoundLabel = QtGui.QLabel(self.SelectSSIDGroupBox)
+
+ sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding,QtGui.QSizePolicy.Preferred)
+ sizePolicy.setHorizontalStretch(1)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.NetworksFoundLabel.sizePolicy().hasHeightForWidth())
+ self.NetworksFoundLabel.setSizePolicy(sizePolicy)
+ self.NetworksFoundLabel.setWordWrap(True)
+ self.NetworksFoundLabel.setObjectName("NetworksFoundLabel")
+ self.gridlayout5.addWidget(self.NetworksFoundLabel,2,1,1,2)
+ self.gridlayout3.addWidget(self.SelectSSIDGroupBox,3,0,1,1)
+ self.StackedWidget.addWidget(self.page_3)
+
+ self.page_5 = QtGui.QWidget()
+ self.page_5.setObjectName("page_5")
+
+ self.gridlayout6 = QtGui.QGridLayout(self.page_5)
+ self.gridlayout6.setObjectName("gridlayout6")
+
+ self.label_15 = QtGui.QLabel(self.page_5)
+
+ font = QtGui.QFont()
+ font.setPointSize(16)
+ self.label_15.setFont(font)
+ self.label_15.setObjectName("label_15")
+ self.gridlayout6.addWidget(self.label_15,0,0,1,2)
+
+ self.line_4 = QtGui.QFrame(self.page_5)
+ self.line_4.setFrameShape(QtGui.QFrame.HLine)
+ self.line_4.setFrameShadow(QtGui.QFrame.Sunken)
+ self.line_4.setObjectName("line_4")
+ self.gridlayout6.addWidget(self.line_4,1,0,1,2)
+
+ self.hboxlayout2 = QtGui.QHBoxLayout()
+ self.hboxlayout2.setObjectName("hboxlayout2")
+
+ self.label_3 = QtGui.QLabel(self.page_5)
+ self.label_3.setObjectName("label_3")
+ self.hboxlayout2.addWidget(self.label_3)
+
+ self.SSIDLabel = QtGui.QLabel(self.page_5)
+
+ sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred,QtGui.QSizePolicy.Preferred)
+ sizePolicy.setHorizontalStretch(1)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.SSIDLabel.sizePolicy().hasHeightForWidth())
+ self.SSIDLabel.setSizePolicy(sizePolicy)
+ self.SSIDLabel.setObjectName("SSIDLabel")
+ self.hboxlayout2.addWidget(self.SSIDLabel)
+
+ self.StrengthIcon = QtGui.QLabel(self.page_5)
+
+ sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed,QtGui.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.StrengthIcon.sizePolicy().hasHeightForWidth())
+ self.StrengthIcon.setSizePolicy(sizePolicy)
+ self.StrengthIcon.setMinimumSize(QtCore.QSize(34,20))
+ self.StrengthIcon.setMaximumSize(QtCore.QSize(34,20))
+ self.StrengthIcon.setObjectName("StrengthIcon")
+ self.hboxlayout2.addWidget(self.StrengthIcon)
+ self.gridlayout6.addLayout(self.hboxlayout2,2,0,1,2)
+
+ spacerItem7 = QtGui.QSpacerItem(20,40,QtGui.QSizePolicy.Minimum,QtGui.QSizePolicy.Expanding)
+ self.gridlayout6.addItem(spacerItem7,3,1,1,1)
+
+ self.groupBox = QtGui.QGroupBox(self.page_5)
+ self.groupBox.setObjectName("groupBox")
+
+ self.gridlayout7 = QtGui.QGridLayout(self.groupBox)
+ self.gridlayout7.setObjectName("gridlayout7")
+
+ self.WEPRadioButton = ReadOnlyRadioButton(self.groupBox)
+ self.WEPRadioButton.setObjectName("WEPRadioButton")
+ self.gridlayout7.addWidget(self.WEPRadioButton,0,0,1,1)
+
+ self.WPARadioButton = ReadOnlyRadioButton(self.groupBox)
+ self.WPARadioButton.setObjectName("WPARadioButton")
+ self.gridlayout7.addWidget(self.WPARadioButton,1,0,1,1)
+ self.gridlayout6.addWidget(self.groupBox,4,0,1,2)
+
+ self.groupBox_2 = QtGui.QGroupBox(self.page_5)
+ self.groupBox_2.setObjectName("groupBox_2")
+
+ self.gridlayout8 = QtGui.QGridLayout(self.groupBox_2)
+ self.gridlayout8.setObjectName("gridlayout8")
+
+ self.label_6 = QtGui.QLabel(self.groupBox_2)
+ self.label_6.setObjectName("label_6")
+ self.gridlayout8.addWidget(self.label_6,0,0,1,1)
+
+ self.KeyLineEdit = QtGui.QLineEdit(self.groupBox_2)
+
+ sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding,QtGui.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.KeyLineEdit.sizePolicy().hasHeightForWidth())
+ self.KeyLineEdit.setSizePolicy(sizePolicy)
+ self.KeyLineEdit.setObjectName("KeyLineEdit")
+ self.gridlayout8.addWidget(self.KeyLineEdit,0,1,1,1)
+
+ self.KeysIcon = QtGui.QLabel(self.groupBox_2)
+
+ sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed,QtGui.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.KeysIcon.sizePolicy().hasHeightForWidth())
+ self.KeysIcon.setSizePolicy(sizePolicy)
+ self.KeysIcon.setMinimumSize(QtCore.QSize(32,32))
+ self.KeysIcon.setMaximumSize(QtCore.QSize(32,32))
+ self.KeysIcon.setFrameShape(QtGui.QFrame.NoFrame)
+ self.KeysIcon.setObjectName("KeysIcon")
+ self.gridlayout8.addWidget(self.KeysIcon,0,2,1,1)
+
+ self.ShowKeyCheckBox = QtGui.QCheckBox(self.groupBox_2)
+ self.ShowKeyCheckBox.setObjectName("ShowKeyCheckBox")
+ self.gridlayout8.addWidget(self.ShowKeyCheckBox,1,1,1,2)
+ self.gridlayout6.addWidget(self.groupBox_2,5,0,1,2)
+
+ spacerItem8 = QtGui.QSpacerItem(638,81,QtGui.QSizePolicy.Minimum,QtGui.QSizePolicy.Expanding)
+ self.gridlayout6.addItem(spacerItem8,6,1,1,1)
+
+ self.ConfigureIcon = QtGui.QLabel(self.page_5)
+
+ sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed,QtGui.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.ConfigureIcon.sizePolicy().hasHeightForWidth())
+ self.ConfigureIcon.setSizePolicy(sizePolicy)
+ self.ConfigureIcon.setMinimumSize(QtCore.QSize(16,16))
+ self.ConfigureIcon.setMaximumSize(QtCore.QSize(16,16))
+ self.ConfigureIcon.setObjectName("ConfigureIcon")
+ self.gridlayout6.addWidget(self.ConfigureIcon,7,0,1,1)
+
+ self.label_7 = QtGui.QLabel(self.page_5)
+ self.label_7.setObjectName("label_7")
+ self.gridlayout6.addWidget(self.label_7,7,1,1,1)
+ self.StackedWidget.addWidget(self.page_5)
+
+ self.page = QtGui.QWidget()
+ self.page.setObjectName("page")
+
+ self.gridlayout9 = QtGui.QGridLayout(self.page)
+ self.gridlayout9.setObjectName("gridlayout9")
+
+ self.label_16 = QtGui.QLabel(self.page)
+
+ font = QtGui.QFont()
+ font.setPointSize(16)
+ self.label_16.setFont(font)
+ self.label_16.setObjectName("label_16")
+ self.gridlayout9.addWidget(self.label_16,0,0,1,1)
+
+ self.line_5 = QtGui.QFrame(self.page)
+ self.line_5.setFrameShape(QtGui.QFrame.HLine)
+ self.line_5.setFrameShadow(QtGui.QFrame.Sunken)
+ self.line_5.setObjectName("line_5")
+ self.gridlayout9.addWidget(self.line_5,1,0,1,1)
+
+ self.groupBox_4 = QtGui.QGroupBox(self.page)
+ self.groupBox_4.setObjectName("groupBox_4")
+
+ self.gridlayout10 = QtGui.QGridLayout(self.groupBox_4)
+ self.gridlayout10.setObjectName("gridlayout10")
+
+ self.label_8 = QtGui.QLabel(self.groupBox_4)
+ self.label_8.setObjectName("label_8")
+ self.gridlayout10.addWidget(self.label_8,0,0,1,1)
+
+ self.SSIDLabel_2 = QtGui.QLabel(self.groupBox_4)
+
+ sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred,QtGui.QSizePolicy.Preferred)
+ sizePolicy.setHorizontalStretch(1)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.SSIDLabel_2.sizePolicy().hasHeightForWidth())
+ self.SSIDLabel_2.setSizePolicy(sizePolicy)
+ self.SSIDLabel_2.setObjectName("SSIDLabel_2")
+ self.gridlayout10.addWidget(self.SSIDLabel_2,0,1,1,1)
+
+ self.hboxlayout3 = QtGui.QHBoxLayout()
+ self.hboxlayout3.setObjectName("hboxlayout3")
+
+ self.SignalStrengthIcon = QtGui.QLabel(self.groupBox_4)
+
+ sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed,QtGui.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.SignalStrengthIcon.sizePolicy().hasHeightForWidth())
+ self.SignalStrengthIcon.setSizePolicy(sizePolicy)
+ self.SignalStrengthIcon.setMinimumSize(QtCore.QSize(34,20))
+ self.SignalStrengthIcon.setMaximumSize(QtCore.QSize(34,20))
+ self.SignalStrengthIcon.setObjectName("SignalStrengthIcon")
+ self.hboxlayout3.addWidget(self.SignalStrengthIcon)
+
+ self.SignalStrengthLabel = QtGui.QLabel(self.groupBox_4)
+ self.SignalStrengthLabel.setObjectName("SignalStrengthLabel")
+ self.hboxlayout3.addWidget(self.SignalStrengthLabel)
+ self.gridlayout10.addLayout(self.hboxlayout3,0,2,1,1)
+
+ self.label_9 = QtGui.QLabel(self.groupBox_4)
+ self.label_9.setObjectName("label_9")
+ self.gridlayout10.addWidget(self.label_9,1,0,1,1)
+
+ self.AddressModeLabel = QtGui.QLabel(self.groupBox_4)
+
+ sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred,QtGui.QSizePolicy.Preferred)
+ sizePolicy.setHorizontalStretch(1)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.AddressModeLabel.sizePolicy().hasHeightForWidth())
+ self.AddressModeLabel.setSizePolicy(sizePolicy)
+ self.AddressModeLabel.setObjectName("AddressModeLabel")
+ self.gridlayout10.addWidget(self.AddressModeLabel,1,1,1,1)
+
+ self.label_12 = QtGui.QLabel(self.groupBox_4)
+ self.label_12.setObjectName("label_12")
+ self.gridlayout10.addWidget(self.label_12,2,0,1,1)
+
+ self.HostnameLabel = QtGui.QLabel(self.groupBox_4)
+
+ sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred,QtGui.QSizePolicy.Preferred)
+ sizePolicy.setHorizontalStretch(1)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.HostnameLabel.sizePolicy().hasHeightForWidth())
+ self.HostnameLabel.setSizePolicy(sizePolicy)
+ self.HostnameLabel.setObjectName("HostnameLabel")
+ self.gridlayout10.addWidget(self.HostnameLabel,2,1,1,1)
+
+ self.label_10 = QtGui.QLabel(self.groupBox_4)
+ self.label_10.setObjectName("label_10")
+ self.gridlayout10.addWidget(self.label_10,3,0,1,1)
+
+ self.IPAddressLabel = QtGui.QLabel(self.groupBox_4)
+
+ sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred,QtGui.QSizePolicy.Preferred)
+ sizePolicy.setHorizontalStretch(1)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.IPAddressLabel.sizePolicy().hasHeightForWidth())
+ self.IPAddressLabel.setSizePolicy(sizePolicy)
+ self.IPAddressLabel.setObjectName("IPAddressLabel")
+ self.gridlayout10.addWidget(self.IPAddressLabel,3,1,1,1)
+
+ self.label_11 = QtGui.QLabel(self.groupBox_4)
+ self.label_11.setObjectName("label_11")
+ self.gridlayout10.addWidget(self.label_11,4,0,1,1)
+
+ self.GatewayLabel = QtGui.QLabel(self.groupBox_4)
+
+ sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred,QtGui.QSizePolicy.Preferred)
+ sizePolicy.setHorizontalStretch(1)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.GatewayLabel.sizePolicy().hasHeightForWidth())
+ self.GatewayLabel.setSizePolicy(sizePolicy)
+ self.GatewayLabel.setObjectName("GatewayLabel")
+ self.gridlayout10.addWidget(self.GatewayLabel,4,1,1,1)
+
+ self.label_13 = QtGui.QLabel(self.groupBox_4)
+ self.label_13.setObjectName("label_13")
+ self.gridlayout10.addWidget(self.label_13,5,0,1,1)
+
+ self.DNSLabel = QtGui.QLabel(self.groupBox_4)
+
+ sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred,QtGui.QSizePolicy.Preferred)
+ sizePolicy.setHorizontalStretch(1)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.DNSLabel.sizePolicy().hasHeightForWidth())
+ self.DNSLabel.setSizePolicy(sizePolicy)
+ self.DNSLabel.setObjectName("DNSLabel")
+ self.gridlayout10.addWidget(self.DNSLabel,5,1,1,1)
+ self.gridlayout9.addWidget(self.groupBox_4,2,0,1,1)
+
+ self.groupBox_5 = QtGui.QGroupBox(self.page)
+
+ sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred,QtGui.QSizePolicy.Preferred)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(1)
+ sizePolicy.setHeightForWidth(self.groupBox_5.sizePolicy().hasHeightForWidth())
+ self.groupBox_5.setSizePolicy(sizePolicy)
+ self.groupBox_5.setObjectName("groupBox_5")
+
+ self.gridlayout11 = QtGui.QGridLayout(self.groupBox_5)
+ self.gridlayout11.setObjectName("gridlayout11")
+
+ self.ExitIcon = QtGui.QLabel(self.groupBox_5)
+
+ sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed,QtGui.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.ExitIcon.sizePolicy().hasHeightForWidth())
+ self.ExitIcon.setSizePolicy(sizePolicy)
+ self.ExitIcon.setMinimumSize(QtCore.QSize(16,16))
+ self.ExitIcon.setMaximumSize(QtCore.QSize(16,16))
+ self.ExitIcon.setFrameShape(QtGui.QFrame.NoFrame)
+ self.ExitIcon.setObjectName("ExitIcon")
+ self.gridlayout11.addWidget(self.ExitIcon,0,0,1,1)
+
+ self.ExitLabel = QtGui.QLabel(self.groupBox_5)
+
+ sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding,QtGui.QSizePolicy.Expanding)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.ExitLabel.sizePolicy().hasHeightForWidth())
+ self.ExitLabel.setSizePolicy(sizePolicy)
+ self.ExitLabel.setFrameShape(QtGui.QFrame.NoFrame)
+ self.ExitLabel.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop)
+ self.ExitLabel.setWordWrap(True)
+ self.ExitLabel.setObjectName("ExitLabel")
+ self.gridlayout11.addWidget(self.ExitLabel,0,1,2,2)
+
+ spacerItem9 = QtGui.QSpacerItem(20,40,QtGui.QSizePolicy.Minimum,QtGui.QSizePolicy.Expanding)
+ self.gridlayout11.addItem(spacerItem9,1,0,1,1)
+
+ spacerItem10 = QtGui.QSpacerItem(501,20,QtGui.QSizePolicy.Expanding,QtGui.QSizePolicy.Minimum)
+ self.gridlayout11.addItem(spacerItem10,2,0,1,2)
+
+ self.hboxlayout4 = QtGui.QHBoxLayout()
+ self.hboxlayout4.setObjectName("hboxlayout4")
+
+ self.PageLabel2 = QtGui.QLabel(self.groupBox_5)
+ self.PageLabel2.setObjectName("PageLabel2")
+ self.hboxlayout4.addWidget(self.PageLabel2)
+
+ self.PageSpinBox = QtGui.QSpinBox(self.groupBox_5)
+ self.PageSpinBox.setMinimum(1)
+ self.PageSpinBox.setObjectName("PageSpinBox")
+ self.hboxlayout4.addWidget(self.PageSpinBox)
+
+ self.PageLabel = QtGui.QLabel(self.groupBox_5)
+ self.PageLabel.setObjectName("PageLabel")
+ self.hboxlayout4.addWidget(self.PageLabel)
+ self.gridlayout11.addLayout(self.hboxlayout4,2,2,1,1)
+ self.gridlayout9.addWidget(self.groupBox_5,3,0,1,1)
+
+ spacerItem11 = QtGui.QSpacerItem(664,20,QtGui.QSizePolicy.Minimum,QtGui.QSizePolicy.Expanding)
+ self.gridlayout9.addItem(spacerItem11,4,0,1,1)
+ self.StackedWidget.addWidget(self.page)
+ self.gridlayout.addWidget(self.StackedWidget,0,0,1,5)
+
+ self.StepText = QtGui.QLabel(Dialog)
+ self.StepText.setObjectName("StepText")
+ self.gridlayout.addWidget(self.StepText,1,0,1,1)
+
+ spacerItem12 = QtGui.QSpacerItem(181,20,QtGui.QSizePolicy.Expanding,QtGui.QSizePolicy.Minimum)
+ self.gridlayout.addItem(spacerItem12,1,1,1,1)
+
+ self.BackButton = QtGui.QPushButton(Dialog)
+ self.BackButton.setObjectName("BackButton")
+ self.gridlayout.addWidget(self.BackButton,1,2,1,1)
+
+ self.NextButton = QtGui.QPushButton(Dialog)
+ self.NextButton.setObjectName("NextButton")
+ self.gridlayout.addWidget(self.NextButton,1,3,1,1)
+
+ self.CancelButton = QtGui.QPushButton(Dialog)
+ self.CancelButton.setObjectName("CancelButton")
+ self.gridlayout.addWidget(self.CancelButton,1,4,1,1)
+
+ self.retranslateUi(Dialog)
+ self.StackedWidget.setCurrentIndex(0)
+ QtCore.QMetaObject.connectSlotsByName(Dialog)
+
+ def retranslateUi(self, Dialog):
+ Dialog.setWindowTitle(QtGui.QApplication.translate("Dialog", "HP Device Manager - Wifi Configuration", None, QtGui.QApplication.UnicodeUTF8))
+ self.label.setText(QtGui.QApplication.translate("Dialog", "Wireless (Wifi/802.11) Configuration", None, QtGui.QApplication.UnicodeUTF8))
+ self.MainTitleLabel.setText(QtGui.QApplication.translate("Dialog", "<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
+ "p, li { white-space: pre-wrap; }\n"
+ "</style></head><body style=\" font-family:\'Sans Serif\'; font-size:9pt; font-weight:400; font-style:normal;\">\n"
+ "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">This utility allows you configure your wireless capable printer using a temporary USB connection. You will be prompted to disconnect the USB cable once wireless network setup is complete. </p>\n"
+ "<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"></p>\n"
+ "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-style:italic;\">Note: This configuration utility does not setup (install) your printer on this computer. Use hp-setup to setup your printer once it has been configured on the network by this utility.</span></p>\n"
+ "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-style:italic;\">Note: Only select wireless capable printers are supported by this utility.</span></p></body></html>", None, QtGui.QApplication.UnicodeUTF8))
+ self.label_14.setText(QtGui.QApplication.translate("Dialog", "<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
+ "p, li { white-space: pre-wrap; }\n"
+ "</style></head><body style=\" font-family:\'Sans Serif\'; font-size:9pt; font-weight:400; font-style:normal;\">\n"
+ "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">Please plug-in your wireless capable printer at this time (using a USB cable) and click<span style=\" font-style:italic;\"> Next &gt;</span> to continue.</p></body></html>", None, QtGui.QApplication.UnicodeUTF8))
+ self.label_4.setText(QtGui.QApplication.translate("Dialog", "Select From Discovered Wireless Capable Devices", None, QtGui.QApplication.UnicodeUTF8))
+ self.DevicesTableWidget.clear()
+ self.DevicesTableWidget.setColumnCount(0)
+ self.DevicesTableWidget.setRowCount(0)
+ self.DevicesFoundLabel.setText(QtGui.QApplication.translate("Dialog", "Found 0 wireless capable devices on the USB bus.", None, QtGui.QApplication.UnicodeUTF8))
+ self.RefreshButton.setText(QtGui.QApplication.translate("Dialog", "Refresh", None, QtGui.QApplication.UnicodeUTF8))
+ self.label_5.setText(QtGui.QApplication.translate("Dialog", "Find and Select a Wireless Network", None, QtGui.QApplication.UnicodeUTF8))
+ self.groupBox_3.setTitle(QtGui.QApplication.translate("Dialog", "Find Wireless Network", None, QtGui.QApplication.UnicodeUTF8))
+ self.UndirectedRadioButton.setText(QtGui.QApplication.translate("Dialog", "Search for wireless networks automatically", None, QtGui.QApplication.UnicodeUTF8))
+ self.DirectedRadioButton.setText(QtGui.QApplication.translate("Dialog", "Enter the name (SSID) of a known wireless network:", None, QtGui.QApplication.UnicodeUTF8))
+ self.SearchPushButton.setText(QtGui.QApplication.translate("Dialog", "Search", None, QtGui.QApplication.UnicodeUTF8))
+ self.SelectSSIDGroupBox.setTitle(QtGui.QApplication.translate("Dialog", "Wireless Networks", None, QtGui.QApplication.UnicodeUTF8))
+ self.ShowExtendedCheckBox.setText(QtGui.QApplication.translate("Dialog", "Show extended information", None, QtGui.QApplication.UnicodeUTF8))
+ self.NetworksTableWidget.clear()
+ self.NetworksTableWidget.setColumnCount(0)
+ self.NetworksTableWidget.setRowCount(0)
+ self.NetworksFoundLabel.setText(QtGui.QApplication.translate("Dialog", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
+ "<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
+ "p, li { white-space: pre-wrap; }\n"
+ "</style></head><body style=\" font-family:\'Sans\'; font-size:10pt; font-weight:400; font-style:normal;\">\n"
+ "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">Found %1 wireless networks. Click <span style=\" font-style:italic;\">Search</span> to perform another search.</p></body></html>", None, QtGui.QApplication.UnicodeUTF8))
+ self.label_15.setText(QtGui.QApplication.translate("Dialog", "Configure Wireless", None, QtGui.QApplication.UnicodeUTF8))
+ self.label_3.setText(QtGui.QApplication.translate("Dialog", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
+ "<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
+ "p, li { white-space: pre-wrap; }\n"
+ "</style></head><body style=\" font-family:\'Sans\'; font-size:10pt; font-weight:400; font-style:normal;\">\n"
+ "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Sans Serif\';\">Wireless Network Name (SSID):</span></p></body></html>", None, QtGui.QApplication.UnicodeUTF8))
+ self.SSIDLabel.setText(QtGui.QApplication.translate("Dialog", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
+ "<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
+ "p, li { white-space: pre-wrap; }\n"
+ "</style></head><body style=\" font-family:\'Sans\'; font-size:10pt; font-weight:400; font-style:normal;\">\n"
+ "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Sans Serif\';\">(unknown)</span></p></body></html>", None, QtGui.QApplication.UnicodeUTF8))
+ self.groupBox.setTitle(QtGui.QApplication.translate("Dialog", "Wireless Security Type", None, QtGui.QApplication.UnicodeUTF8))
+ self.WEPRadioButton.setText(QtGui.QApplication.translate("Dialog", "WEP (Wired Equivalent Privacy)", None, QtGui.QApplication.UnicodeUTF8))
+ self.WPARadioButton.setText(QtGui.QApplication.translate("Dialog", "WPA (Wi-Fi Protected Access)", None, QtGui.QApplication.UnicodeUTF8))
+ self.groupBox_2.setTitle(QtGui.QApplication.translate("Dialog", "Wireless Security Key", None, QtGui.QApplication.UnicodeUTF8))
+ self.label_6.setText(QtGui.QApplication.translate("Dialog", "Key:", None, QtGui.QApplication.UnicodeUTF8))
+ self.ShowKeyCheckBox.setText(QtGui.QApplication.translate("Dialog", "Show key", None, QtGui.QApplication.UnicodeUTF8))
+ self.label_7.setText(QtGui.QApplication.translate("Dialog", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
+ "<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
+ "p, li { white-space: pre-wrap; }\n"
+ "</style></head><body style=\" font-family:\'Sans\'; font-size:10pt; font-weight:400; font-style:normal;\">\n"
+ "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Sans Serif\'; font-size:9pt;\">Enter the security key for the network, and click </span><span style=\" font-family:\'Sans Serif\'; font-size:9pt; font-style:italic;\">Connect</span><span style=\" font-family:\'Sans Serif\'; font-size:9pt;\"> to continue.</span></p></body></html>", None, QtGui.QApplication.UnicodeUTF8))
+ self.label_16.setText(QtGui.QApplication.translate("Dialog", "Wireless Configuration Results", None, QtGui.QApplication.UnicodeUTF8))
+ self.groupBox_4.setTitle(QtGui.QApplication.translate("Dialog", "Wireless Configuration", None, QtGui.QApplication.UnicodeUTF8))
+ self.label_8.setText(QtGui.QApplication.translate("Dialog", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
+ "<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
+ "p, li { white-space: pre-wrap; }\n"
+ "</style></head><body style=\" font-family:\'Sans\'; font-size:10pt; font-weight:400; font-style:normal;\">\n"
+ "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Sans Serif\'; font-size:9pt;\">Network:</span></p></body></html>", None, QtGui.QApplication.UnicodeUTF8))
+ self.SSIDLabel_2.setText(QtGui.QApplication.translate("Dialog", "TextLabel", None, QtGui.QApplication.UnicodeUTF8))
+ self.SignalStrengthIcon.setText(QtGui.QApplication.translate("Dialog", "(icon)", None, QtGui.QApplication.UnicodeUTF8))
+ self.SignalStrengthLabel.setText(QtGui.QApplication.translate("Dialog", "0/5 (0dBm)", None, QtGui.QApplication.UnicodeUTF8))
+ self.label_9.setText(QtGui.QApplication.translate("Dialog", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
+ "<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
+ "p, li { white-space: pre-wrap; }\n"
+ "</style></head><body style=\" font-family:\'Sans\'; font-size:10pt; font-weight:400; font-style:normal;\">\n"
+ "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Sans Serif\'; font-size:9pt;\">Address Mode:</span></p></body></html>", None, QtGui.QApplication.UnicodeUTF8))
+ self.AddressModeLabel.setText(QtGui.QApplication.translate("Dialog", "TextLabel", None, QtGui.QApplication.UnicodeUTF8))
+ self.label_12.setText(QtGui.QApplication.translate("Dialog", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
+ "<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
+ "p, li { white-space: pre-wrap; }\n"
+ "</style></head><body style=\" font-family:\'Sans\'; font-size:10pt; font-weight:400; font-style:normal;\">\n"
+ "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Sans Serif\'; font-size:9pt;\">Hostname:</span></p></body></html>", None, QtGui.QApplication.UnicodeUTF8))
+ self.HostnameLabel.setText(QtGui.QApplication.translate("Dialog", "TextLabel", None, QtGui.QApplication.UnicodeUTF8))
+ self.label_10.setText(QtGui.QApplication.translate("Dialog", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
+ "<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
+ "p, li { white-space: pre-wrap; }\n"
+ "</style></head><body style=\" font-family:\'Sans\'; font-size:10pt; font-weight:400; font-style:normal;\">\n"
+ "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Sans Serif\'; font-size:9pt;\">IP Address:</span></p></body></html>", None, QtGui.QApplication.UnicodeUTF8))
+ self.IPAddressLabel.setText(QtGui.QApplication.translate("Dialog", "TextLabel", None, QtGui.QApplication.UnicodeUTF8))
+ self.label_11.setText(QtGui.QApplication.translate("Dialog", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
+ "<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
+ "p, li { white-space: pre-wrap; }\n"
+ "</style></head><body style=\" font-family:\'Sans\'; font-size:10pt; font-weight:400; font-style:normal;\">\n"
+ "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Sans Serif\'; font-size:9pt;\">Gateway Address:</span></p></body></html>", None, QtGui.QApplication.UnicodeUTF8))
+ self.GatewayLabel.setText(QtGui.QApplication.translate("Dialog", "TextLabel", None, QtGui.QApplication.UnicodeUTF8))
+ self.label_13.setText(QtGui.QApplication.translate("Dialog", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
+ "<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
+ "p, li { white-space: pre-wrap; }\n"
+ "</style></head><body style=\" font-family:\'Sans\'; font-size:10pt; font-weight:400; font-style:normal;\">\n"
+ "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Sans Serif\'; font-size:9pt;\">DNS Address:</span></p></body></html>", None, QtGui.QApplication.UnicodeUTF8))
+ self.DNSLabel.setText(QtGui.QApplication.translate("Dialog", "TextLabel", None, QtGui.QApplication.UnicodeUTF8))
+ self.groupBox_5.setTitle(QtGui.QApplication.translate("Dialog", "Messages", None, QtGui.QApplication.UnicodeUTF8))
+ self.ExitLabel.setText(QtGui.QApplication.translate("Dialog", "TextLabel", None, QtGui.QApplication.UnicodeUTF8))
+ self.PageLabel2.setText(QtGui.QApplication.translate("Dialog", "Message:", None, QtGui.QApplication.UnicodeUTF8))
+ self.PageLabel.setText(QtGui.QApplication.translate("Dialog", "of XXX", None, QtGui.QApplication.UnicodeUTF8))
+ self.BackButton.setText(QtGui.QApplication.translate("Dialog", "< Back", None, QtGui.QApplication.UnicodeUTF8))
+ self.NextButton.setText(QtGui.QApplication.translate("Dialog", "Next >", None, QtGui.QApplication.UnicodeUTF8))
+ self.CancelButton.setText(QtGui.QApplication.translate("Dialog", "Cancel", None, QtGui.QApplication.UnicodeUTF8))
+
+from readonlyradiobutton import ReadOnlyRadioButton
diff --git a/ui4/wifisetupdialog_base.ui b/ui4/wifisetupdialog_base.ui
new file mode 100644
index 0000000..a85d14c
--- /dev/null
+++ b/ui4/wifisetupdialog_base.ui
@@ -0,0 +1,1102 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>Dialog</class>
+ <widget class="QDialog" name="Dialog">
+ <property name="windowModality">
+ <enum>Qt::ApplicationModal</enum>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>700</width>
+ <height>500</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>HP Device Manager - Wifi Setup</string>
+ </property>
+ <layout class="QGridLayout">
+ <item row="0" column="0" colspan="5">
+ <widget class="QStackedWidget" name="StackedWidget">
+ <property name="frameShape">
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="currentIndex">
+ <number>0</number>
+ </property>
+ <widget class="QWidget" name="DiscoveryPage">
+ <layout class="QGridLayout">
+ <item row="0" column="0" colspan="3">
+ <widget class="QLabel" name="label">
+ <property name="font">
+ <font>
+ <pointsize>16</pointsize>
+ </font>
+ </property>
+ <property name="text">
+ <string>Wireless (Wifi/802.11) Setup</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" colspan="3">
+ <widget class="Line" name="line">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" colspan="3">
+ <widget class="QLabel" name="label_2">
+ <property name="text">
+ <string>&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
+p, li { white-space: pre-wrap; }
+&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;&quot;&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;This utility allows you configure your wireless capable printer using a temporary USB connection. You will be prompted to disconnect the USB cable once wireless network setup is complete.&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-style:italic;&quot;&gt;Note: Only select wireless capable printers are supported by this utility.&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="1">
+ <spacer>
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="4" column="0">
+ <spacer>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="4" column="1">
+ <widget class="QLabel" name="Picture">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>396</width>
+ <height>128</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>396</width>
+ <height>128</height>
+ </size>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="2">
+ <spacer>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="5" column="0" colspan="3">
+ <spacer>
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>664</width>
+ <height>61</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="6" column="0" colspan="3">
+ <layout class="QHBoxLayout">
+ <item>
+ <widget class="QLabel" name="InfoIcon">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="label_14">
+ <property name="text">
+ <string>&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
+p, li { white-space: pre-wrap; }
+&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;&quot;&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Please plug-in your wireless capable printer at this time (using a USB cable) and click&lt;span style=&quot; font-style:italic;&quot;&gt; Next &amp;gt;&lt;/span&gt; to continue.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="page_2">
+ <layout class="QGridLayout">
+ <item row="0" column="0" colspan="2">
+ <widget class="QLabel" name="label_4">
+ <property name="font">
+ <font>
+ <pointsize>16</pointsize>
+ </font>
+ </property>
+ <property name="text">
+ <string>Select From Discovered Wireless Capable Devices</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" colspan="3">
+ <widget class="Line" name="line_2">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" colspan="3">
+ <widget class="QTableWidget" name="DevicesTableWidget">
+ <property name="alternatingRowColors">
+ <bool>true</bool>
+ </property>
+ <property name="selectionMode">
+ <enum>QAbstractItemView::SingleSelection</enum>
+ </property>
+ <property name="selectionBehavior">
+ <enum>QAbstractItemView::SelectRows</enum>
+ </property>
+ <property name="sortingEnabled">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0">
+ <layout class="QHBoxLayout">
+ <item>
+ <widget class="QLabel" name="DevicesFoundIcon">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ <property name="frameShape">
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="DevicesFoundLabel">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Found 0 wireless capable devices on the USB bus.</string>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="3" column="1">
+ <spacer>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Preferred</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>21</width>
+ <height>28</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="3" column="2">
+ <widget class="QPushButton" name="RefreshButton">
+ <property name="text">
+ <string>Refresh</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="page_3">
+ <layout class="QGridLayout">
+ <item row="0" column="0">
+ <widget class="QLabel" name="label_5">
+ <property name="font">
+ <font>
+ <pointsize>16</pointsize>
+ </font>
+ </property>
+ <property name="text">
+ <string>Find and Select a Wireless Network</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="Line" name="line_3">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="QGroupBox" name="groupBox_3">
+ <property name="title">
+ <string>Find Wireless Network</string>
+ </property>
+ <layout class="QGridLayout">
+ <item row="0" column="0" colspan="3">
+ <widget class="QRadioButton" name="UndirectedRadioButton">
+ <property name="text">
+ <string>Search for wireless networks automatically</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" colspan="2">
+ <widget class="QRadioButton" name="DirectedRadioButton">
+ <property name="text">
+ <string>Enter the name (SSID) of a known wireless network:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2">
+ <widget class="QLineEdit" name="SSIDLineEdit">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="QPushButton" name="SearchPushButton">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Maximum" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Search</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1" colspan="2">
+ <spacer>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>521</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="3" column="0">
+ <widget class="QGroupBox" name="SelectSSIDGroupBox">
+ <property name="title">
+ <string>Wireless Networks</string>
+ </property>
+ <property name="checkable">
+ <bool>false</bool>
+ </property>
+ <layout class="QGridLayout">
+ <item row="0" column="0" colspan="2">
+ <spacer>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>421</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="0" column="2">
+ <widget class="QCheckBox" name="ShowExtendedCheckBox">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Maximum" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Show extended information</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" colspan="3">
+ <widget class="QTableWidget" name="NetworksTableWidget">
+ <property name="alternatingRowColors">
+ <bool>true</bool>
+ </property>
+ <property name="selectionMode">
+ <enum>QAbstractItemView::SingleSelection</enum>
+ </property>
+ <property name="selectionBehavior">
+ <enum>QAbstractItemView::SelectRows</enum>
+ </property>
+ <property name="verticalScrollMode">
+ <enum>QAbstractItemView::ScrollPerItem</enum>
+ </property>
+ <property name="horizontalScrollMode">
+ <enum>QAbstractItemView::ScrollPerPixel</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="QLabel" name="NetworksFoundIcon">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ <property name="frameShape">
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1" colspan="2">
+ <widget class="QLabel" name="NetworksFoundLabel">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+ <horstretch>1</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
+&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
+p, li { white-space: pre-wrap; }
+&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Found %1 wireless networks. Click &lt;span style=&quot; font-style:italic;&quot;&gt;Search&lt;/span&gt; to perform another search.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="page_5">
+ <layout class="QGridLayout">
+ <item row="0" column="0" colspan="2">
+ <widget class="QLabel" name="label_15">
+ <property name="font">
+ <font>
+ <pointsize>16</pointsize>
+ </font>
+ </property>
+ <property name="text">
+ <string>Configure Wireless</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" colspan="2">
+ <widget class="Line" name="line_4">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" colspan="2">
+ <layout class="QHBoxLayout">
+ <item>
+ <widget class="QLabel" name="label_3">
+ <property name="text">
+ <string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
+&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
+p, li { white-space: pre-wrap; }
+&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Sans Serif';&quot;&gt;Wireless Network Name (SSID):&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="SSIDLabel">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+ <horstretch>1</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
+&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
+p, li { white-space: pre-wrap; }
+&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Sans Serif';&quot;&gt;(unknown)&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="StrengthIcon">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>34</width>
+ <height>20</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>34</width>
+ <height>20</height>
+ </size>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="3" column="1">
+ <spacer>
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="4" column="0" colspan="2">
+ <widget class="QGroupBox" name="groupBox">
+ <property name="title">
+ <string>Wireless Security Type</string>
+ </property>
+ <layout class="QGridLayout">
+ <item row="0" column="0">
+ <widget class="ReadOnlyRadioButton" name="WEPRadioButton">
+ <property name="text">
+ <string>WEP (Wired Equivalent Privacy)</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="ReadOnlyRadioButton" name="WPARadioButton">
+ <property name="text">
+ <string>WPA (Wi-Fi Protected Access)</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="5" column="0" colspan="2">
+ <widget class="QGroupBox" name="groupBox_2">
+ <property name="title">
+ <string>Wireless Security Key</string>
+ </property>
+ <layout class="QGridLayout">
+ <item row="0" column="0">
+ <widget class="QLabel" name="label_6">
+ <property name="text">
+ <string>Key:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QLineEdit" name="KeyLineEdit">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2">
+ <widget class="QLabel" name="KeysIcon">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="frameShape">
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1" colspan="2">
+ <widget class="QCheckBox" name="ShowKeyCheckBox">
+ <property name="text">
+ <string>Show key</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="6" column="1">
+ <spacer>
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>638</width>
+ <height>81</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="7" column="0">
+ <widget class="QLabel" name="ConfigureIcon">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item row="7" column="1">
+ <widget class="QLabel" name="label_7">
+ <property name="text">
+ <string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
+&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
+p, li { white-space: pre-wrap; }
+&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Sans Serif'; font-size:9pt;&quot;&gt;Enter the security key for the network, and click &lt;/span&gt;&lt;span style=&quot; font-family:'Sans Serif'; font-size:9pt; font-style:italic;&quot;&gt;Connect&lt;/span&gt;&lt;span style=&quot; font-family:'Sans Serif'; font-size:9pt;&quot;&gt; to continue.&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="page">
+ <layout class="QGridLayout">
+ <item row="0" column="0">
+ <widget class="QLabel" name="label_16">
+ <property name="font">
+ <font>
+ <pointsize>16</pointsize>
+ </font>
+ </property>
+ <property name="text">
+ <string>Wireless Configuration Results</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="Line" name="line_5">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="QGroupBox" name="groupBox_4">
+ <property name="title">
+ <string>Wireless Configuration</string>
+ </property>
+ <layout class="QGridLayout">
+ <item row="0" column="0">
+ <widget class="QLabel" name="label_8">
+ <property name="text">
+ <string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
+&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
+p, li { white-space: pre-wrap; }
+&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Sans Serif'; font-size:9pt;&quot;&gt;Network:&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QLabel" name="SSIDLabel_2">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+ <horstretch>1</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>TextLabel</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2">
+ <layout class="QHBoxLayout">
+ <item>
+ <widget class="QLabel" name="SignalStrengthIcon">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>34</width>
+ <height>20</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>34</width>
+ <height>20</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>(icon)</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="SignalStrengthLabel">
+ <property name="text">
+ <string>0/5 (0dBm)</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="label_9">
+ <property name="text">
+ <string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
+&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
+p, li { white-space: pre-wrap; }
+&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Sans Serif'; font-size:9pt;&quot;&gt;Address Mode:&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QLabel" name="AddressModeLabel">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+ <horstretch>1</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>TextLabel</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="QLabel" name="label_12">
+ <property name="text">
+ <string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
+&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
+p, li { white-space: pre-wrap; }
+&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Sans Serif'; font-size:9pt;&quot;&gt;Hostname:&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <widget class="QLabel" name="HostnameLabel">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+ <horstretch>1</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>TextLabel</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0">
+ <widget class="QLabel" name="label_10">
+ <property name="text">
+ <string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
+&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
+p, li { white-space: pre-wrap; }
+&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Sans Serif'; font-size:9pt;&quot;&gt;IP Address:&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="1">
+ <widget class="QLabel" name="IPAddressLabel">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+ <horstretch>1</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>TextLabel</string>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="0">
+ <widget class="QLabel" name="label_11">
+ <property name="text">
+ <string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
+&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
+p, li { white-space: pre-wrap; }
+&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Sans Serif'; font-size:9pt;&quot;&gt;Gateway Address:&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="1">
+ <widget class="QLabel" name="GatewayLabel">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+ <horstretch>1</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>TextLabel</string>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="0">
+ <widget class="QLabel" name="label_13">
+ <property name="text">
+ <string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
+&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
+p, li { white-space: pre-wrap; }
+&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Sans Serif'; font-size:9pt;&quot;&gt;DNS Address:&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="1">
+ <widget class="QLabel" name="DNSLabel">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+ <horstretch>1</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>TextLabel</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="3" column="0">
+ <widget class="QGroupBox" name="groupBox_5">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>1</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="title">
+ <string>Messages</string>
+ </property>
+ <layout class="QGridLayout">
+ <item row="0" column="0">
+ <widget class="QLabel" name="ExitIcon">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ <property name="frameShape">
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1" rowspan="2" colspan="2">
+ <widget class="QLabel" name="ExitLabel">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="frameShape">
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="text">
+ <string>TextLabel</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <spacer>
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="2" column="0" colspan="2">
+ <spacer>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>501</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="2" column="2">
+ <layout class="QHBoxLayout">
+ <item>
+ <widget class="QLabel" name="PageLabel2">
+ <property name="text">
+ <string>Message:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QSpinBox" name="PageSpinBox">
+ <property name="minimum">
+ <number>1</number>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="PageLabel">
+ <property name="text">
+ <string>of XXX</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="4" column="0">
+ <spacer>
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>664</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="StepText">
+ <property name="text">
+ <string>Step %1 of %2</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <spacer>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>181</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="1" column="2">
+ <widget class="QPushButton" name="BackButton">
+ <property name="text">
+ <string>&lt; Back</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="3">
+ <widget class="QPushButton" name="NextButton">
+ <property name="text">
+ <string>Next &gt;</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="4">
+ <widget class="QPushButton" name="CancelButton">
+ <property name="text">
+ <string>Cancel</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <customwidgets>
+ <customwidget>
+ <class>ReadOnlyRadioButton</class>
+ <extends>QRadioButton</extends>
+ <header>readonlyradiobutton.h</header>
+ </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/uninstall.py b/uninstall.py
new file mode 100755
index 0000000..8b940a8
--- /dev/null
+++ b/uninstall.py
@@ -0,0 +1,132 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2011-2014 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Amarnath Chitumalla
+#
+
+__version__ = '1.0'
+__title__ = 'HPLIP Uninstaller'
+__mod__ = 'hp-uninstall'
+__doc__ = "Uninstaller for HPLIP ."
+
+# Std Lib
+import getopt, os, sys, re, time
+
+# Local
+from base.g import *
+from base import utils, tui
+from installer.core_install import *
+
+
+USAGE = [(__doc__, "", "name", True),
+ ("Usage: %s [OPTIONS]" % __mod__, "", "summary", True),
+ utils.USAGE_SPACE,
+ utils.USAGE_OPTIONS,
+ utils.USAGE_LOGGING1, utils.USAGE_LOGGING2, utils.USAGE_LOGGING3,
+ ("Non-interactive mode:", "-n (without asking for permission)","option",False),
+ utils.USAGE_HELP,
+ ]
+
+
+def usage(typ='text'):
+ if typ == 'text':
+ utils.log_title(__title__, __version__)
+
+ utils.format_text(USAGE, typ, __title__, __mod__, __version__)
+ sys.exit(0)
+
+mode = INTERACTIVE_MODE
+auto = False
+log_level = None
+
+
+
+log.set_module(__mod__)
+
+
+try:
+ opts, args = getopt.getopt(sys.argv[1:], 'hl:gn',
+ ['help', 'help-rest', 'help-man', 'help-desc', 'gui', 'lang=','logging=', 'debug'])
+
+except getopt.GetoptError, e:
+ log.error(e.msg)
+ usage()
+ sys.exit(1)
+
+if os.getenv("HPLIP_DEBUG"):
+ log.set_level('debug')
+
+for o, a in opts:
+ if o in ('-h', '--help'):
+ usage()
+
+ elif o == '--help-rest':
+ usage('rest')
+
+ elif o == '--help-man':
+ usage('man')
+
+ elif o in ('-q', '--lang'):
+ language = a.lower()
+
+ elif o == '--help-desc':
+ print __doc__,
+ sys.exit(0)
+
+ elif o in ('-l', '--logging'):
+ log_level = a.lower().strip()
+# if not log.set_level(log_level):
+# usage()
+
+ elif o in ('-g', '--debug'):
+ log_level = 'debug'
+# log.set_level('debug')
+
+ elif o == '-n':
+ mode = NON_INTERACTIVE_MODE
+
+
+if log_level is not None:
+ if not log.set_level(log_level):
+ usage()
+
+log_file = os.path.normpath('/var/log/hp/hplip-uninstall.log')
+if os.getuid() != 0:
+ log.error("To run 'hp-uninstall' utility, you must have root privileges.(Try using 'sudo' or 'su -c')")
+ sys.exit(1)
+
+if os.path.exists(log_file):
+ os.remove(log_file)
+
+log.set_logfile(log_file)
+log.set_where(log.LOG_TO_CONSOLE_AND_FILE)
+
+log.debug("Log file=%s" % log_file)
+log.debug("euid = %d" % os.geteuid())
+
+utils.log_title(__title__, __version__, True)
+
+log.info("Uninstaller log saved in: %s" % log.bold(log_file))
+log.info("")
+
+core = CoreInstall(MODE_CHECK, INTERACTIVE_MODE)
+core.init()
+
+core.uninstall(mode)
+
diff --git a/unload.py b/unload.py
new file mode 100755
index 0000000..da78a7e
--- /dev/null
+++ b/unload.py
@@ -0,0 +1,760 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2009 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+__version__ = '3.3'
+__mod__ = 'hp-unload'
+__title__ = 'Photo Card Access Utility'
+__doc__ = "Access inserted photo cards on supported HPLIP printers. This provides an alternative for older devices that do not support USB mass storage or for access to photo cards over a network."
+
+# Std Lib
+import sys
+import os
+import os.path
+import getopt
+import re
+import cmd
+import time
+import fnmatch
+import string
+import operator
+
+try:
+ import readline
+except ImportError:
+ pass
+
+# Local
+from base.g import *
+from base import device, utils, tui, module
+from prnt import cups
+from pcard import photocard
+
+
+# Console class (from ASPN Python Cookbook)
+# Author: James Thiele
+# Date: 27 April 2004
+# Version: 1.0
+# Location: http://www.eskimo.com/~jet/python/examples/cmd/
+# Copyright (c) 2004, James Thiele
+
+class Console(cmd.Cmd):
+
+ def __init__(self, pc):
+ cmd.Cmd.__init__(self)
+ self.intro = "Type 'help' for a list of commands. Type 'exit' to quit."
+ self.pc = pc
+ disk_info = self.pc.info()
+ pc.write_protect = disk_info[8]
+ if pc.write_protect:
+ log.warning("Photo card is write protected.")
+ self.prompt = log.bold("pcard: %s > " % self.pc.pwd())
+
+ # Command definitions
+ def do_hist(self, args):
+ """Print a list of commands that have been entered"""
+ print self._hist
+
+ def do_exit(self, args):
+ """Exits from the console"""
+ return -1
+
+ def do_quit(self, args):
+ """Exits from the console"""
+ return -1
+
+ # Command definitions to support Cmd object functionality
+ def do_EOF(self, args):
+ """Exit on system end of file character"""
+ return self.do_exit(args)
+
+ def do_help(self, args):
+ """Get help on commands
+ 'help' or '?' with no arguments prints a list of commands for which help is available
+ 'help <command>' or '? <command>' gives help on <command>
+ """
+ # The only reason to define this method is for the help text in the doc string
+ cmd.Cmd.do_help(self, args)
+
+ # Override methods in Cmd object
+ def preloop(self):
+ """Initialization before prompting user for commands.
+ Despite the claims in the Cmd documentaion, Cmd.preloop() is not a stub.
+ """
+ cmd.Cmd.preloop(self) # sets up command completion
+ self._hist = [] # No history yet
+ self._locals = {} # Initialize execution namespace for user
+ self._globals = {}
+
+ def postloop(self):
+ """Take care of any unfinished business.
+ Despite the claims in the Cmd documentaion, Cmd.postloop() is not a stub.
+ """
+ cmd.Cmd.postloop(self) # Clean up command completion
+ print "Exiting..."
+
+ def precmd(self, line):
+ """ This method is called after the line has been input but before
+ it has been interpreted. If you want to modifdy the input line
+ before execution (for example, variable substitution) do it here.
+ """
+ self._hist += [line.strip()]
+ return line
+
+ def postcmd(self, stop, line):
+ """If you want to stop the console, return something that evaluates to true.
+ If you want to do some post command processing, do it here.
+ """
+ return stop
+
+ def emptyline(self):
+ """Do nothing on empty input line"""
+ pass
+
+ def default(self, line):
+ print log.bold("ERROR: Unrecognized command. Use 'help' to list commands.")
+
+ def do_ldir(self, args):
+ """ List local directory contents."""
+ os.system('ls -l')
+
+ def do_lls(self, args):
+ """ List local directory contents."""
+ os.system('ls -l')
+
+ def do_dir(self, args):
+ """Synonym for the ls command."""
+ return self.do_ls(args)
+
+ def do_ls(self, args):
+ """List photo card directory contents."""
+ args = args.strip().lower()
+ files = self.pc.ls(True, args)
+
+ total_size = 0
+ formatter = utils.TextFormatter(
+ (
+ {'width': 14, 'margin' : 2},
+ {'width': 12, 'margin' : 2, 'alignment' : utils.TextFormatter.RIGHT},
+ {'width': 30, 'margin' : 2},
+ )
+ )
+
+ print
+ print log.bold(formatter.compose(("Name", "Size", "Type")))
+
+ num_files = 0
+ for d in self.pc.current_directories():
+ if d[0] in ('.', '..'):
+ print formatter.compose((d[0], "", "directory"))
+ else:
+ print formatter.compose((d[0] + "/", "", "directory"))
+
+ for f in self.pc.current_files():
+ print formatter.compose((f[0], utils.format_bytes(f[2]), self.pc.classify_file(f[0])))
+ num_files += 1
+ total_size += f[2]
+
+ print log.bold("% d files, %s" % (num_files, utils.format_bytes(total_size, True)))
+
+
+ def do_df(self, args):
+ """Display free space on photo card.
+ Options:
+ -h\tDisplay in human readable format
+ """
+ freespace = self.pc.df()
+
+ if args.strip().lower() == '-h':
+ fs = utils.format_bytes(freespace)
+ else:
+ fs = utils.commafy(freespace)
+
+ print "Freespace = %s Bytes" % fs
+
+
+ def do_cp(self, args, remove_after_copy=False):
+ """Copy files from photo card to current local directory.
+ Usage:
+ \tcp FILENAME(S)|GLOB PATTERN(S)
+ Example:
+ \tCopy all JPEG and GIF files and a file named thumbs.db from photo card to local directory:
+ \tcp *.jpg *.gif thumbs.db
+ """
+ args = args.strip().lower()
+
+ matched_files = self.pc.match_files(args)
+
+ if len(matched_files) == 0:
+ print "ERROR: File(s) not found."
+ else:
+ total, delta = self.pc.cp_multiple(matched_files, remove_after_copy, self.cp_status_callback, self.rm_status_callback)
+
+ print log.bold("\n%s transfered in %d sec (%d KB/sec)" % (utils.format_bytes(total), delta, (total/1024)/(delta)))
+
+ def do_unload(self, args):
+ """Unload all image files from photocard to current local directory.
+ Note:
+ \tSubdirectories on photo card are not preserved
+ Options:
+ -x\tDon't remove files after copy
+ -p\tPrint unload list but do not copy or remove files"""
+ args = args.lower().strip().split()
+ dont_remove = False
+ if '-x' in args:
+ if self.pc.write_protect:
+ log.error("Photo card is write protected. -x not allowed.")
+ return
+ else:
+ dont_remove = True
+
+
+ unload_list = self.pc.get_unload_list()
+ print
+
+ if len(unload_list) > 0:
+ if '-p' in args:
+
+ max_len = 0
+ for u in unload_list:
+ max_len = max(max_len, len(u[0]))
+
+ formatter = utils.TextFormatter(
+ (
+ {'width': max_len+2, 'margin' : 2},
+ {'width': 12, 'margin' : 2, 'alignment' : utils.TextFormatter.RIGHT},
+ {'width': 12, 'margin' : 2},
+ )
+ )
+
+ print
+ print log.bold(formatter.compose(("Name", "Size", "Type")))
+
+ total = 0
+ for u in unload_list:
+ print formatter.compose(('%s' % u[0], utils.format_bytes(u[1]), '%s/%s' % (u[2], u[3])))
+ total += u[1]
+
+
+ print log.bold("Found %d files to unload, %s" % (len(unload_list), utils.format_bytes(total, True)))
+ else:
+ print log.bold("Unloading %d files..." % len(unload_list))
+ total, delta, was_cancelled = self.pc.unload(unload_list, self.cp_status_callback, self.rm_status_callback, dont_remove)
+ print log.bold("\n%s unloaded in %d sec (%d KB/sec)" % (utils.format_bytes(total), delta, (total/1024)/delta))
+
+ else:
+ print "No image, audio, or video files found."
+
+
+ def cp_status_callback(self, src, trg, size):
+ if size == 1:
+ print
+ print log.bold("Copying %s..." % src)
+ else:
+ print "\nCopied %s to %s (%s)..." % (src, trg, utils.format_bytes(size))
+
+ def rm_status_callback(self, src):
+ print "Removing %s..." % src
+
+
+
+ def do_rm(self, args):
+ """Remove files from photo card."""
+ if self.pc.write_protect:
+ log.error("Photo card is write protected. rm not allowed.")
+ return
+
+ args = args.strip().lower()
+
+ matched_files = self.pc.match_files(args)
+
+ if len(matched_files) == 0:
+ print "ERROR: File(s) not found."
+ else:
+ for f in matched_files:
+ self.pc.rm(f, False)
+
+ self.pc.ls()
+
+ def do_mv(self, args):
+ """Move files off photocard"""
+ if self.pc.write_protect:
+ log.error("Photo card is write protected. mv not allowed.")
+ return
+ self.do_cp(args, True)
+
+ def do_lpwd(self, args):
+ """Print name of local current/working directory."""
+ print os.getcwd()
+
+ def do_lcd(self, args):
+ """Change current local working directory."""
+ try:
+ os.chdir(args.strip())
+ except OSError:
+ print log.bold("ERROR: Directory not found.")
+ print os.getcwd()
+
+ def do_pwd(self, args):
+ """Print name of photo card current/working directory
+ Usage:
+ \t>pwd"""
+ print self.pc.pwd()
+
+ def do_cd(self, args):
+ """Change current working directory on photo card.
+ Note:
+ \tYou may only specify one directory level at a time.
+ Usage:
+ \tcd <directory>
+ """
+ args = args.lower().strip()
+
+ if args == '..':
+ if self.pc.pwd() != '/':
+ self.pc.cdup()
+
+ elif args == '.':
+ pass
+
+ elif args == '/':
+ self.pc.cd('/')
+
+ else:
+ matched_dirs = self.pc.match_dirs(args)
+
+ if len(matched_dirs) == 0:
+ print "Directory not found"
+
+ elif len(matched_dirs) > 1:
+ print "Pattern matches more than one directory"
+
+ else:
+ self.pc.cd(matched_dirs[0])
+
+ self.prompt = log.bold("pcard: %s > " % self.pc.pwd())
+
+ def do_cdup(self, args):
+ """Change to parent directory."""
+ self.do_cd('..')
+
+ #def complete_cd( self, text, line, begidx, endidx ):
+ # print text, line, begidx, endidx
+ # #return "XXX"
+
+ def do_cache(self, args):
+ """Display current cache entries, or turn cache on/off.
+ Usage:
+ \tDisplay: cache
+ \tTurn on: cache on
+ \tTurn off: cache off
+ """
+ args = args.strip().lower()
+
+ if args == 'on':
+ self.pc.cache_control(True)
+
+ elif args == 'off':
+ self.pc.cache_control(False)
+
+ else:
+ if self.pc.cache_state():
+ cache_info = self.pc.cache_info()
+
+ t = cache_info.keys()
+ t.sort()
+ print
+ for s in t:
+ print "sector %d (%d hits)" % (s, cache_info[s])
+
+ print log.bold("Total cache usage: %s (%s maximum)" % (utils.format_bytes(len(t)*512), utils.format_bytes(photocard.MAX_CACHE * 512)))
+ print log.bold("Total cache sectors: %s of %s" % (utils.commafy(len(t)), utils.commafy(photocard.MAX_CACHE)))
+ else:
+ print "Cache is off."
+
+ def do_sector(self, args):
+ """Display sector data.
+ Usage:
+ \tsector <sector num>
+ """
+ args = args.strip().lower()
+ cached = False
+ try:
+ sector = int(args)
+ except ValueError:
+ print "Sector must be specified as a number"
+ return
+
+ if self.pc.cache_check(sector) > 0:
+ print "Cached sector"
+
+ print repr(self.pc.sector(sector))
+
+
+ def do_tree(self, args):
+ """Display photo card directory tree."""
+ tree = self.pc.tree()
+ print
+ self.print_tree(tree)
+
+ def print_tree(self, tree, level=0):
+ for d in tree:
+ if type(tree[d]) == type({}):
+ print ''.join([' '*level*4, d, '/'])
+ self.print_tree(tree[d], level+1)
+
+
+ def do_reset(self, args):
+ """Reset the cache."""
+ self.pc.cache_reset()
+
+
+ def do_card(self, args):
+ """Print info about photocard."""
+ print
+ print "Device URI = %s" % self.pc.device.device_uri
+ print "Model = %s" % self.pc.device.model_ui
+ print "Working dir = %s" % self.pc.pwd()
+ disk_info = self.pc.info()
+ print "OEM ID = %s" % disk_info[0]
+ print "Bytes/sector = %d" % disk_info[1]
+ print "Sectors/cluster = %d" % disk_info[2]
+ print "Reserved sectors = %d" % disk_info[3]
+ print "Root entries = %d" % disk_info[4]
+ print "Sectors/FAT = %d" % disk_info[5]
+ print "Volume label = %s" % disk_info[6]
+ print "System ID = %s" % disk_info[7]
+ print "Write protected = %d" % disk_info[8]
+ print "Cached sectors = %s" % utils.commafy(len(self.pc.cache_info()))
+
+
+ def do_display(self, args):
+ """Display an image with ImageMagick.
+ Usage:
+ \tdisplay <filename>"""
+ args = args.strip().lower()
+ matched_files = self.pc.match_files(args)
+
+ if len(matched_files) == 1:
+
+ typ = self.pc.classify_file(args).split('/')[0]
+
+ if typ == 'image':
+ fd, temp_name = utils.make_temp_file()
+ self.pc.cp(args, temp_name)
+ os.system('display %s' % temp_name)
+ os.remove(temp_name)
+
+ else:
+ print "File is not an image."
+
+ elif len(matched_files) == 0:
+ print "File not found."
+
+ else:
+ print "Only one file at a time may be specified for display."
+
+ def do_show(self, args):
+ """Synonym for the display command."""
+ self.do_display(args)
+
+ def do_thumbnail(self, args):
+ """Display an embedded thumbnail image with ImageMagick.
+ Note:
+ \tOnly works with JPEG/JFIF images with embedded JPEG/TIFF thumbnails
+ Usage:
+ \tthumbnail <filename>"""
+ args = args.strip().lower()
+ matched_files = self.pc.match_files(args)
+
+ if len(matched_files) == 1:
+ typ, subtyp = self.pc.classify_file(args).split('/')
+
+ if typ == 'image' and subtyp in ('jpeg', 'tiff'):
+ exif_info = self.pc.get_exif(args)
+
+ dir_name, file_name=os.path.split(args)
+ photo_name, photo_ext=os.path.splitext(args)
+
+ if 'JPEGThumbnail' in exif_info:
+ temp_file_fd, temp_file_name = utils.make_temp_file()
+ open(temp_file_name, 'wb').write(exif_info['JPEGThumbnail'])
+ os.system('display %s' % temp_file_name)
+ os.remove(temp_file_name)
+
+ elif 'TIFFThumbnail' in exif_info:
+ temp_file_fd, temp_file_name = utils.make_temp_file()
+ open(temp_file_name, 'wb').write(exif_info['TIFFThumbnail'])
+ os.system('display %s' % temp_file_name)
+ os.remove(temp_file_name)
+
+ else:
+ print "No thumbnail found."
+
+ else:
+ print "Incorrect file type for thumbnail."
+
+ elif len(matched_files) == 0:
+ print "File not found."
+ else:
+ print "Only one file at a time may be specified for thumbnail display."
+
+ def do_thumb(self, args):
+ """Synonym for the thumbnail command."""
+ self.do_thumbnail(args)
+
+ def do_exif(self, args):
+ """Display EXIF info for file.
+ Usage:
+ \texif <filename>"""
+ args = args.strip().lower()
+ matched_files = self.pc.match_files(args)
+
+ if len(matched_files) == 1:
+ typ, subtyp = self.pc.classify_file(args).split('/')
+ #print "'%s' '%s'" % (typ, subtyp)
+
+ if typ == 'image' and subtyp in ('jpeg', 'tiff'):
+ exif_info = self.pc.get_exif(args)
+
+ formatter = utils.TextFormatter(
+ (
+ {'width': 40, 'margin' : 2},
+ {'width': 40, 'margin' : 2},
+ )
+ )
+
+ print
+ print log.bold(formatter.compose(("Tag", "Value")))
+
+ ee = exif_info.keys()
+ ee.sort()
+ for e in ee:
+ if e not in ('JPEGThumbnail', 'TIFFThumbnail', 'Filename'):
+ #if e != 'EXIF MakerNote':
+ print formatter.compose((e, '%s' % exif_info[e]))
+ #else:
+ # print formatter.compose( ( e, ''.join( [ chr(x) for x in exif_info[e].values if chr(x) in string.printable ] ) ) )
+ else:
+ print "Incorrect file type for thumbnail."
+
+ elif len(matched_files) == 0:
+ print "File not found."
+ else:
+ print "Only one file at a time may be specified for thumbnail display."
+
+ def do_info(self, args):
+ """Synonym for the exif command."""
+ self.do_exif(args)
+
+ def do_about(self, args):
+ utils.log_title(__title__, __version__)
+
+
+def status_callback(src, trg, size):
+ if size == 1:
+ print
+ print log.bold("Copying %s..." % src)
+ else:
+ print "\nCopied %s to %s (%s)..." % (src, trg, utils.format_bytes(size))
+
+
+
+mod = module.Module(__mod__, __title__, __version__, __doc__, None,
+ (GUI_MODE, INTERACTIVE_MODE, NON_INTERACTIVE_MODE),
+ (UI_TOOLKIT_QT3,))
+
+mod.setUsage(module.USAGE_FLAG_DEVICE_ARGS,
+ extra_options=[("Output directory:", "-o<dir> or --output=<dir> (Defaults to current directory)(Only used for non-GUI modes)", "option", False)],
+ see_also_list=['hp-toolbox'])
+
+opts, device_uri, printer_name, mode, ui_toolkit, loc = \
+ mod.parseStdOpts('o', ['output='])
+
+output_dir = os.getcwd()
+
+for o, a in opts:
+ if o in ('-o', '--output'):
+ output_dir = a
+
+if mode == GUI_MODE:
+ if not utils.canEnterGUIMode():
+ mode = INTERACTIVE_MODE
+
+if mode == GUI_MODE:
+ if ui_toolkit == 'qt4':
+ log.error("%s does not support Qt4. Please use Qt3 or run in -i or -n modes.")
+ sys.exit(1)
+
+if mode in (INTERACTIVE_MODE, NON_INTERACTIVE_MODE):
+ try:
+ device_uri = mod.getDeviceUri(device_uri, printer_name,
+ filter={'pcard-type' : (operator.eq, 1)})
+
+ try:
+ pc = photocard.PhotoCard( None, device_uri, printer_name )
+ except Error, e:
+ log.error("Unable to start photocard session: %s" % e.msg)
+ sys.exit(1)
+
+ pc.set_callback(update_spinner)
+
+ try:
+ pc.mount()
+ except Error:
+ log.error("Unable to mount photo card on device. Check that device is powered on and photo card is correctly inserted.")
+ pc.umount()
+ # TODO:
+ #pc.device.sendEvent(EVENT_PCARD_UNABLE_TO_MOUNT, typ='error')
+ sys.exit(1)
+
+ log.info(log.bold("\nPhotocard on device %s mounted" % pc.device.device_uri))
+ log.info(log.bold("DO NOT REMOVE PHOTO CARD UNTIL YOU EXIT THIS PROGRAM"))
+
+ output_dir = os.path.realpath(os.path.normpath(os.path.expanduser(output_dir)))
+
+ try:
+ os.chdir(output_dir)
+ except OSError:
+ print log.bold("ERROR: Output directory %s not found." % output_dir)
+ sys.exit(1)
+
+
+ if mode == INTERACTIVE_MODE: # INTERACTIVE_MODE
+ console = Console(pc)
+ try:
+ try:
+ console . cmdloop()
+ except KeyboardInterrupt:
+ log.error("Aborted.")
+ except Exception, e:
+ log.error("An error occured: %s" % e)
+ finally:
+ pc.umount()
+
+ # TODO:
+ #pc.device.sendEvent(EVENT_END_PCARD_JOB)
+
+
+ else: # NON_INTERACTIVE_MODE
+ print "Output directory is %s" % os.getcwd()
+ try:
+ unload_list = pc.get_unload_list()
+ print
+
+ if len(unload_list) > 0:
+
+ max_len = 0
+ for u in unload_list:
+ max_len = max(max_len, len(u[0]))
+
+ formatter = utils.TextFormatter(
+ (
+ {'width': max_len+2, 'margin' : 2},
+ {'width': 12, 'margin' : 2, 'alignment' : utils.TextFormatter.RIGHT},
+ {'width': 12, 'margin' : 2},
+ )
+ )
+
+ print
+ print log.bold(formatter.compose(("Name", "Size", "Type")))
+
+ total = 0
+ for u in unload_list:
+ print formatter.compose(('%s' % u[0], utils.format_bytes(u[1]), '%s/%s' % (u[2], u[3])))
+ total += u[1]
+
+
+ print log.bold("Found %d files to unload, %s\n" % (len(unload_list), utils.format_bytes(total, True)))
+ print log.bold("Unloading files...\n")
+ total, delta, was_cancelled = pc.unload(unload_list, status_callback, None, True)
+ print log.bold("\n%s unloaded in %d sec (%d KB/sec)" % (utils.format_bytes(total), delta, (total/1024)/delta))
+
+
+ finally:
+ pc.umount()
+
+ except KeyboardInterrupt:
+ log.error("User exit")
+
+
+else: # GUI_MODE (qt3 only)
+ try:
+ from qt import *
+ from ui import unloadform
+ except ImportError:
+ log.error("Unable to load Qt3 support. Is it installed?")
+ sys.exit(1)
+
+ app = QApplication(sys.argv)
+ QObject.connect(app, SIGNAL("lastWindowClosed()"), app, SLOT("quit()"))
+
+ if loc is None:
+ loc = user_conf.get('ui', 'loc', 'system')
+ if loc.lower() == 'system':
+ loc = str(QTextCodec.locale())
+ log.debug("Using system locale: %s" % loc)
+
+ if loc.lower() != 'c':
+ e = 'utf8'
+ try:
+ l, x = loc.split('.')
+ loc = '.'.join([l, e])
+ except ValueError:
+ l = loc
+ loc = '.'.join([loc, e])
+
+ log.debug("Trying to load .qm file for %s locale." % loc)
+ trans = QTranslator(None)
+
+ qm_file = 'hplip_%s.qm' % l
+ log.debug("Name of .qm file: %s" % qm_file)
+ loaded = trans.load(qm_file, prop.localization_dir)
+
+ if loaded:
+ app.installTranslator(trans)
+ else:
+ loc = 'c'
+
+ if loc == 'c':
+ log.debug("Using default 'C' locale")
+ else:
+ log.debug("Using locale: %s" % loc)
+ QLocale.setDefault(QLocale(loc))
+ prop.locale = loc
+ try:
+ locale.setlocale(locale.LC_ALL, locale.normalize(loc))
+ except locale.Error:
+ pass
+
+ try:
+ w = unloadform.UnloadForm(['cups'], device_uri, printer_name)
+ except Error:
+ log.error("Unable to connect to HPLIP I/O. Please (re)start HPLIP and try again.")
+ sys.exit(1)
+
+ app.setMainWidget(w)
+ w.show()
+
+ app.exec_loop()
+
+log.info("")
+log.info("Done.")
diff --git a/unreleased.inc b/unreleased.inc
new file mode 100644
index 0000000..6ed1457
--- /dev/null
+++ b/unreleased.inc
@@ -0,0 +1,2 @@
+unreldir =
+dist_unrel_DATA =
diff --git a/upgrade.py b/upgrade.py
new file mode 100755
index 0000000..11f303a
--- /dev/null
+++ b/upgrade.py
@@ -0,0 +1,365 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2011-2014 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Amarnath Chitumalla
+#
+
+__version__ = '1.0'
+__title__ = 'HPLIP upgrade latest version'
+__mod__ = 'hp-upgrade'
+__doc__ = "HPLIP installer to upgrade to latest version."
+
+# Std Lib
+import getopt, os, sys, re, time
+
+# Local
+from base.g import *
+from base import utils, tui, module
+from installer.core_install import *
+
+
+
+USAGE = [(__doc__, "", "name", True),
+ ("Usage: %s [OPTIONS]" % __mod__, "", "summary", True),
+ utils.USAGE_SPACE,
+ utils.USAGE_MODE,
+ ("Run in interactive mode:", "-i or --interactive (Default)", "option", False),
+ ("Run in graphical UI mode:", "-u or --gui (future use)", "option", False),
+ utils.USAGE_SPACE,
+ utils.USAGE_OPTIONS,
+ utils.USAGE_HELP,
+ utils.USAGE_LOGGING1, utils.USAGE_LOGGING2, utils.USAGE_LOGGING3,
+ ("Check for update and notify:","--notify","option",False),
+ ("Check only available version:","--check","option",False),
+ ("Non-interactive mode:","-n(Without asking permissions)(future use)","option",False),
+ ("Download Path to install from local system:","-p<path>","option", False),
+ ("Download HPLIP package location:","-d<path> (default location /tmp/)","option", False),
+ ("Override existing HPLIP installation even if latest vesrion is installed:","-o","option",False),
+ ("Take options from the file instead of command line:","-f<file> (future use)","option",False)
+ ]
+
+def usage(typ='text'):
+ if typ == 'text':
+ utils.log_title(__title__, __version__)
+
+ utils.format_text(USAGE, typ, __title__, __mod__, __version__)
+ sys.exit(0)
+
+def clean_exit(code=0, waitTerminal=True):
+ change_spinner_state(True)
+ mod.unlockInstance()
+ if CHECKING_ONLY is False and NOTIFY is False and waitTerminal is True:
+ uInput = raw_input("\npress enter to quit.")
+ sys.exit(code)
+
+
+def parse_HPLIP_version(hplip_version_file, pat):
+ ver = "0.0.0"
+ if not os.path.exists(hplip_version_file):
+ return ver
+
+ try:
+ fp= file(hplip_version_file, 'r')
+ except IOError:
+ log.error("Failed to get hplip version since %s file is not found."%hplip_version_file)
+ return ver
+# pat = re.compile(r"""HPLIP (.*) Public Release""")
+ data = fp.read()
+ for line in data.splitlines():
+ if pat.search(line):
+ ver = pat.search(line).group(1)
+ break
+
+ log.debug("Latest HPLIP version = %s." % ver)
+ return ver
+
+
+log.set_module(__mod__)
+
+mode = INTERACTIVE_MODE
+auto = False
+HPLIP_PATH=None
+TEMP_PATH="/tmp/"
+FORCE_INSTALL=False
+CHECKING_ONLY=False
+NOTIFY=False
+HPLIP_SOURCEFORGE_SITE = "http://feed2js.org/feed2js.php?src=http%3A%2F%2Fsourceforge.net%2Fexport%2Frss2_projnews.php%3Fgroup_id%3D149981"
+HPLIP_WEB_SITE ="http://hplipopensource.com/hplip-web/index.html"
+
+try:
+ mod = module.Module(__mod__, __title__, __version__, __doc__, USAGE,
+ (INTERACTIVE_MODE, GUI_MODE),
+ (UI_TOOLKIT_QT3, UI_TOOLKIT_QT4), True, True)
+
+ opts, device_uri, printer_name, mode, ui_toolkit, loc = \
+ mod.parseStdOpts('hl:gniup:d:of:', ['notify','check','help', 'help-rest', 'help-man', 'help-desc', 'interactive', 'gui', 'lang=','logging=', 'debug'],
+ handle_device_printer=False)
+
+
+
+ mod.lockInstance()
+except getopt.GetoptError, e:
+ log.error(e.msg)
+ usage()
+# sys.exit(1)
+
+if os.getenv("HPLIP_DEBUG"):
+ log.set_level('debug')
+
+for o, a in opts:
+ if o in ('-h', '--help'):
+ usage()
+
+ elif o == '--help-rest':
+ usage('rest')
+
+ elif o == '--help-man':
+ usage('man')
+
+ elif o in ('-q', '--lang'):
+ language = a.lower()
+
+ elif o == '--help-desc':
+ print __doc__,
+ clean_exit(0,False)
+
+ elif o in ('-l', '--logging'):
+ log_level = a.lower().strip()
+ if not log.set_level(log_level):
+ usage()
+
+ elif o in ('-g', '--debug'):
+ log.set_level('debug')
+
+ elif o == '-n':
+ mode = NON_INTERACTIVE_MODE
+ log.info("NON_INTERACTIVE mode is not yet supported.")
+ usage()
+ clean_exit(0,False)
+
+ elif o == '-p':
+ HPLIP_PATH=a
+
+ elif o == '-d':
+ TEMP_PATH=a
+
+ elif o == '-o':
+ FORCE_INSTALL = True
+
+ elif o in ('-u', '--gui'):
+ log.info("GUI is not yet supported.")
+ usage()
+ clean_exit(0, False)
+ elif o == '--check':
+ CHECKING_ONLY = True
+ elif o == '--notify':
+ NOTIFY = True
+ elif o == '-f':
+ log.info("Option from file is not yet supported")
+ usage()
+ clean_exit(0, False)
+
+if not NOTIFY and not CHECKING_ONLY:
+ mod.quiet= False
+ mod.showTitle()
+
+log_file = os.path.normpath('/var/log/hp/hp-upgrade.log')
+
+if os.path.exists(log_file):
+ os.remove(log_file)
+
+log.set_logfile(log_file)
+log.set_where(log.LOG_TO_CONSOLE_AND_FILE)
+
+
+log.debug("Upgrade log saved in: %s" % log.bold(log_file))
+log.debug("")
+try:
+ change_spinner_state(False)
+ core = CoreInstall(MODE_CHECK)
+# core.init()
+ if not core.check_network_connection():
+ log.error("Either Internet is not working or Wget is not installed.")
+ clean_exit(0)
+
+ installed_version=sys_conf.get("hplip","version","0.0.0")
+ log.debug("HPLIP previous installed version =%s." %installed_version)
+
+
+
+ HPLIP_latest_ver="0.0.0"
+ # get HPLIP version info from sourceforge
+ pat = re.compile(r"""HPLIP (.*) Public Release""")
+ sts, HPLIP_Ver_file = utils.download_from_network(HPLIP_SOURCEFORGE_SITE)
+ if sts is True:
+ HPLIP_latest_ver = parse_HPLIP_version(HPLIP_Ver_file, pat)
+
+ # get HPLIP version info from hplip site
+ if HPLIP_latest_ver == "0.0.0": ## if failed to connect the sourceforge site, then check HPLIP site.
+ pat = re.compile(r"""The current version of the HPLIP solution is version (.*)\. \(.*""")
+ sts, HPLIP_Ver_file = utils.download_from_network(HPLIP_WEB_SITE)
+ if sts is True:
+ HPLIP_latest_ver = parse_HPLIP_version(HPLIP_Ver_file, pat)
+
+ if HPLIP_latest_ver == "0.0.0":
+ log.error("Failed to get latest version of HPLIP.")
+ clean_exit(0)
+
+
+ if CHECKING_ONLY is True:
+ user_conf.set('upgrade','latest_available_version',HPLIP_latest_ver)
+ log.debug("Available HPLIP version =%s."%HPLIP_latest_ver)
+ elif NOTIFY is True:
+ user_conf.set('upgrade','latest_available_version',HPLIP_latest_ver)
+ if not utils.Is_HPLIP_older_version(installed_version, HPLIP_latest_ver):
+ log.debug("Latest version of HPLIP is already installed.")
+ else:
+
+ msg = "Latest version of HPLIP-%s is available."%HPLIP_latest_ver
+ if core.is_auto_installer_support():
+ distro_type= 1
+ else:
+ distro_type= 2
+
+
+ if ui_toolkit == 'qt3':
+ if not utils.canEnterGUIMode():
+ log.error("%s requires GUI support. Is Qt3 Installed?.. Exiting." % __mod__)
+ clean_exit(1)
+
+ try:
+ from qt import *
+ from ui.upgradeform import UpgradeForm
+ except ImportError:
+ log.error("Unable to load Qt3 support. Is it installed? ")
+ clean_exit(1)
+
+
+ # create the main application object
+ app = QApplication(sys.argv)
+ QObject.connect(app, SIGNAL("lastWindowClosed()"), app, SLOT("quit()"))
+ dialog = UpgradeForm(None, "",0,0,distro_type, msg)
+ dialog.show()
+
+ log.debug("Starting GUI loop...")
+ app.exec_loop()
+
+
+ else: #qt4
+ if not utils.canEnterGUIMode4():
+ log.error("%s requires GUI support . Is Qt4 installed?.. Exiting." % __mod__)
+ clean_exit(1)
+
+ try:
+ from PyQt4.QtGui import QApplication, QMessageBox
+ from ui4.upgradedialog import UpgradeDialog
+ except ImportError:
+ log.error("Unable to load Qt4 support. Is it installed?")
+ clean_exit(1)
+
+ app = QApplication(sys.argv)
+ dialog = UpgradeDialog(None, distro_type, msg)
+
+
+ dialog.show()
+ log.debug("Starting GUI loop...")
+ app.exec_()
+
+ else:
+ if FORCE_INSTALL is False:
+ if utils.Is_HPLIP_older_version(installed_version, HPLIP_latest_ver):
+ ok,choice = tui.enter_choice("\nPress 'y' to continue to upgrade HPLIP-%s (y=yes*, n=no):"%HPLIP_latest_ver, ['y','n'],'y')
+ if not ok or choice == 'n':
+ clean_exit(0, False)
+ else:
+ log.info("Latest version of HPLIP is already installed.")
+ clean_exit(0,False)
+
+ # check distro information.
+ if not core.is_auto_installer_support():
+ log.info("Please install HPLIP manually as mentioned in 'http://hplipopensource.com/hplip-web/install/manual/index.html' site")
+ clean_exit(0)
+
+ # check systray is running?
+ status,output = utils.Is_Process_Running('hp-systray')
+ if status is True:
+ ok,choice = tui.enter_choice("\nSome HPLIP applications are running. Press 'y' to close applications or press 'n' to quit upgrade(y=yes*, n=no):",['y','n'],'y')
+ if not ok or choice =='n':
+ log.info("Manually close HPLIP applications and run hp-upgrade again.")
+ clean_exit(0, False)
+
+ try:
+ # dBus
+ #import dbus
+ from dbus import SystemBus, lowlevel
+ except ImportError:
+ log.error("Unable to load DBus.")
+ pass
+ else:
+ try:
+ args = ['', '', EVENT_SYSTEMTRAY_EXIT, prop.username, 0, '', '']
+ msg = lowlevel.SignalMessage('/', 'com.hplip.StatusService', 'Event')
+ msg.append(signature='ssisiss', *args)
+ log.debug("Sending close message to hp-systray ...")
+ SystemBus().send_message(msg)
+ time.sleep(0.5)
+ except:
+ log.error("Failed to send DBus message to hp-systray/hp-toolbox.")
+ pass
+
+
+ toolbox_status,output = utils.Is_Process_Running('hp-toolbox')
+# systray_status,output = utils.Is_Process_Running('hp-systray')
+ if toolbox_status is True:
+ log.error("Failed to close either HP-Toolbox/HP-Systray. Manually close and run hp-upgrade again.")
+ clean_exit(0)
+
+
+ if HPLIP_PATH is not None:
+ if os.path.exists(HPLIP_PATH):
+ download_file = HPLIP_PATH
+ else:
+ log.error("%s file is not present. Downloading from Net..." %HPLIP_PATH)
+ HPLIP_PATH = None
+
+ if HPLIP_PATH is None:
+ url="http://sourceforge.net/projects/hplip/files/hplip/%s/hplip-%s.run/download" %(HPLIP_latest_ver, HPLIP_latest_ver)
+ download_file = None
+ if TEMP_PATH:
+ download_file = "%s/hplip-%s.run" %(TEMP_PATH,HPLIP_latest_ver)
+ log.info("Downloading hplip-%s.run file..... Please wait. "%HPLIP_latest_ver )
+ sts,download_file = utils.download_from_network(url, download_file, True)
+
+ if not os.path.exists(download_file):
+ log.error("Failed to download %s file."%download_file)
+ clean_exit()
+
+ # Installing hplip run.
+ cmd = "sh %s" %(download_file)
+ log.debug("Upgrading %s and cmd =%s " %(download_file, cmd))
+ os.system(cmd)
+
+ change_spinner_state(True)
+ mod.unlockInstance()
+# log.info("HPLIP upgrade is completed")
+except KeyboardInterrupt:
+ change_spinner_state(True)
+ mod.unlockInstance()
+ log.error("User exit")
+
diff --git a/wificonfig.py b/wificonfig.py
new file mode 100755
index 0000000..59746c5
--- /dev/null
+++ b/wificonfig.py
@@ -0,0 +1,82 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# (c) Copyright 2003-2009 Hewlett-Packard Development Company, L.P.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Don Welch
+#
+
+__version__ = '1.1'
+__title__ = 'Wifi Configuration Utility'
+__mod__ = 'hp-wificonfig'
+__doc__ = "Wifi/Wireless/802.11 configuration utility for HPLIP supported printers. (Note: Only select wireless capable printers are supported by this utility)."
+
+#Std Lib
+import sys
+import re
+import getopt
+import time
+import operator
+import os
+
+# Local
+from base.g import *
+from base import device, utils, maint, tui, module
+from prnt import cups
+
+
+try:
+ mod = module.Module(__mod__, __title__, __version__, __doc__, None,
+ (GUI_MODE,), (UI_TOOLKIT_QT4,))
+
+ mod.setUsage(module.USAGE_FLAG_DEVICE_ARGS,
+ see_also_list=['hp-setup'])
+
+ opts, device_uri, printer_name, mode, ui_toolkit, lang = \
+ mod.parseStdOpts()
+
+ device_uri = mod.getDeviceUri(device_uri, printer_name,
+ filter={'wifi-config': (operator.gt, 0)},
+ restrict_to_installed_devices=False)
+
+ if not utils.canEnterGUIMode4():
+ log.error("%s -u/--gui requires Qt4 GUI support. Exiting." % __mod__)
+ sys.exit(1)
+
+ try:
+ from PyQt4.QtGui import QApplication
+ from ui4.wifisetupdialog import WifiSetupDialog
+ except ImportError:
+ log.error("Unable to load Qt4 support. Is it installed?")
+ sys.exit(1)
+
+ app = QApplication(sys.argv)
+
+ dlg = WifiSetupDialog(None, device_uri, standalone=True)
+ dlg.show()
+ try:
+ log.debug("Starting GUI loop...")
+ app.exec_()
+ except KeyboardInterrupt:
+ sys.exit(0)
+
+except KeyboardInterrupt:
+ log.error("User exit")
+
+log.info("")
+log.info("Done.")
+